diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json index 0cf54c596..63a43ea2b 100644 --- a/apps/OpenSign/package-lock.json +++ b/apps/OpenSign/package-lock.json @@ -19,6 +19,7 @@ "i18next": "^23.14.0", "i18next-browser-languagedetector": "^8.0.0", "i18next-http-backend": "^2.6.1", + "jszip": "^3.10.1", "jwt-decode": "^4.0.0", "moment": "^2.30.1", "nth-check": "^2.1.1", @@ -12748,6 +12749,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/immer": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", @@ -16181,6 +16188,54 @@ "node": ">=4.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/jwt-decode": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", @@ -16286,6 +16341,15 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lilconfig": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", @@ -22606,6 +22670,12 @@ "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index 3563fb9d7..826591c69 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -14,6 +14,7 @@ "i18next": "^23.14.0", "i18next-browser-languagedetector": "^8.0.0", "i18next-http-backend": "^2.6.1", + "jszip": "^3.10.1", "jwt-decode": "^4.0.0", "moment": "^2.30.1", "nth-check": "^2.1.1", diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index b60915032..0f7bfcb33 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -648,5 +648,8 @@ "p4": "Please choose the option that best suits your document signing requirements." }, "advanced-options":"Advanced options", - "hide-advanced-options":"Hide Advanced options" + "hide-advanced-options":"Hide Advanced options", + "download-files":"Download files", + "download-pdf":"Download Pdf", + "pdf-certificate":"Download Pdf + Certificate" } diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index f2e40a37d..a5c482018 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -647,6 +647,9 @@ "p4": "Veuillez choisir l'option qui correspond le mieux à vos exigences en matière de signature de documents." }, "advanced-options":"Options avancées", - "hide-advanced-options": "Masquer les options avancées" + "hide-advanced-options": "Masquer les options avancées", + "download-files" :"Télécharger des fichiers", + "download-pdf" :"Télécharger le PDF", + "pdf-certificate" :"Télécharger Pdf + Certificat" } diff --git a/apps/OpenSign/public/static/js/public-template.bundle.js b/apps/OpenSign/public/static/js/public-template.bundle.js index 8d45774f9..c84e439ef 100644 --- a/apps/OpenSign/public/static/js/public-template.bundle.js +++ b/apps/OpenSign/public/static/js/public-template.bundle.js @@ -43525,7 +43525,8 @@ function Header(_ref) { clickOnZoomOut, handleRotationFun, isDisableRotate, - templateId + templateId, + setIsDownloadModal } = _ref; const { t @@ -43562,7 +43563,7 @@ function Header(_ref) { pageNumber: pageNumber, allPages: allPages, changePage: changePage - }), isCompleted && alreadySign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Root, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Trigger, { + }), isCompleted || alreadySign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Root, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Trigger, { asChild: true }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "op-link op-link-primary no-underline text-[16px] font-semibold pr-[3px] pl-[5px]" @@ -43574,7 +43575,13 @@ function Header(_ref) { sideOffset: 5 }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { className: "DropdownMenuItem", - onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading) + onClick: () => { + if (isCompleted) { + setIsDownloadModal(true); + } else { + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, setIsDownloading); + } + } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-row" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { @@ -43598,7 +43605,7 @@ function Header(_ref) { "aria-hidden": "true" }), t("mail"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { className: "DropdownMenuItem", - onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading) + onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading, pdfDetails) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-row" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { @@ -43635,42 +43642,52 @@ function Header(_ref) { className: "bg-white shadow-md rounded-md px-3 py-2", sideOffset: 5 }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { - className: "flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer", - onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfDetails[0]?.URL, setIsDownloading) + className: "DropdownMenuItem", + onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, setIsDownloading) + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "flex flex-row" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-arrow-down mr-[3px]", "aria-hidden": "true" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "font-[500]" - }, t("download"))), !isDisableRotate && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { - className: "flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer", + }, t("download")))), !isDisableRotate && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { + className: "DropdownMenuItem", onClick: () => handleRotationFun(90) + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "flex flex-row" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-rotate-right text-gray-500 2xl:text-[30px] mr-[3px]" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "font-[500]" - }, t("rotate-right"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { - className: "flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer", + }, t("rotate-right")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { + className: "DropdownMenuItem", onClick: () => handleRotationFun(-90) + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "flex flex-row" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-rotate-left text-gray-500 2xl:text-[30px] mr-[3px]" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "font-[500]" - }, t("rotate-left")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { - className: "flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer", + }, t("rotate-left"))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { + className: "DropdownMenuItem", onClick: () => clickOnZoomIn() + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "flex flex-row" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { - className: "fa-light fa-magnifying-glass-plus text-gray-500 2xl:text-[30px]" + className: "fa-light fa-magnifying-glass-plus text-gray-500 2xl:text-[30px] mr-[3px]" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "font-[500]" - }, t("zoom-in"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { - className: "flex flex-row justify-center items-center text-[13px] focus:outline-none cursor-pointer", + }, t("zoom-in")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_radix_ui_react_dropdown_menu__WEBPACK_IMPORTED_MODULE_7__.Item, { + className: "DropdownMenuItem", onClick: () => clickOnZoomOut() + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "flex flex-row" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { - className: "fa-light fa-magnifying-glass-minus text-gray-500 2xl:text-[30px]" + className: "fa-light fa-magnifying-glass-minus text-gray-500 2xl:text-[30px] mr-[3px]" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "font-[500]" - }, t("zoom-out"))))))), isPublicTemplate && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + }, t("zoom-out")))))))), isPublicTemplate && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { "data-tut": "reactourThird", onClick: () => embedWidgetsData(), className: "border-none font-[650] text-[14px] op-link op-link-primary no-underline" @@ -43705,7 +43722,7 @@ function Header(_ref) { }, completeBtnTitle ? completeBtnTitle : isMailSend ? t("sent") : t("send")))) : isPdfRequestFiles ? alreadySign ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex flex-row" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { - onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading), + onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading, pdfDetails), type: "button", className: "op-btn op-btn-neutral op-btn-sm mr-[3px] shadow" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { @@ -43725,7 +43742,13 @@ function Header(_ref) { }, t("certificate"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "op-btn op-btn-primary op-btn-sm mr-[3px] shadow", - onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading) + onClick: () => { + if (isCompleted) { + setIsDownloadModal(true); + } else { + (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, setIsDownloading); + } + } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-download py-[3px]", "aria-hidden": "true" @@ -43754,7 +43777,7 @@ function Header(_ref) { }, t("finish")), !templateId && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "op-btn op-btn-neutral op-btn-sm mr-[3px] shadow", - onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading) + onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, setIsDownloading) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-arrow-down font-semibold lg:hidden" }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { @@ -43771,7 +43794,7 @@ function Header(_ref) { }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "hidden lg:block ml-1" }, t("certificate"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { - onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading), + onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleToPrint)(e, pdfUrl, setIsDownloading, pdfDetails), type: "button", className: "op-btn op-btn-neutral op-btn-sm gap-0 font-medium text-[12px] mr-[3px] shadow" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { @@ -43782,7 +43805,9 @@ function Header(_ref) { }, t("print"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "op-btn op-btn-primary op-btn-sm gap-0 font-medium text-[12px] mr-[3px] shadow", - onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_2__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading) + onClick: () => { + setIsDownloadModal(true); + } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-download", "aria-hidden": "true" @@ -45712,10 +45737,10 @@ function RenderPdf(_ref) { key: key }, checkSignedSigners(data)); }) : placeholder // placeholder mobile - ? signerPos.map((data, ind) => { + ? signerPos?.map((data, ind) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { key: ind - }, data.placeHolder.map((placeData, index) => { + }, data?.placeHolder && data?.placeHolder.map((placeData, index) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), { key: index }, placeData.pageNumber === pageNumber && placeData.pos.map(pos => { @@ -46036,8 +46061,8 @@ function SignPad(_ref) { const [isTab, setIsTab] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("draw"); const [isSignImg, setIsSignImg] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); const [signValue, setSignValue] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); - const [textWidth, setTextWidth] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null); - const [textHeight, setTextHeight] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null); + const [textWidth, setTextWidth] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0); + const [textHeight, setTextHeight] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0); const [signatureType, setSignatureType] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("draw"); const fontOptions = [{ value: "Fasthand" @@ -46053,7 +46078,7 @@ function SignPad(_ref) { const [fontSelect, setFontSelect] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(fontOptions[0].value); const senderUser = localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`) && localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`); const jsonSender = JSON.parse(senderUser); - const currentUserName = jsonSender && jsonSender.name; + const currentUserName = jsonSender && jsonSender?.name; //function for clear signature image const handleClear = () => { @@ -46118,7 +46143,7 @@ function SignPad(_ref) { }, type: "button", className: `${isSignImg || image || isDefaultSign || textWidth ? "" : "pointer-events-none"} op-btn op-btn-primary shadow-lg`, - disabled: isTab === "draw" && isSignImg || isTab === "image" && image || isTab === "mysignature" && isDefaultSign || isTab === "type" && textWidth ? false : image ? false : true + disabled: isTab === "draw" && isSignImg || isTab === "image" && image || isTab === "mysignature" && isDefaultSign || isTab === "type" && signValue ? false : image ? false : true }, t("save"))); }; //useEffect for set already draw or save signature url/text url of signature text type and draw type for initial type and signature type widgets @@ -46136,10 +46161,10 @@ function SignPad(_ref) { canvasRef.current.fromDataURL(url); } } - const trimmedName = currentUserName && currentUserName.trim(); + const trimmedName = currentUserName && currentUserName?.trim(); const firstCharacter = trimmedName?.charAt(0); const userName = isInitial ? firstCharacter : currentUserName; - setSignValue(userName); + setSignValue(userName || ""); setFontSelect("Fasthand"); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -46163,8 +46188,8 @@ function SignPad(_ref) { canvasRef.current.fromDataURL(isSignImg); } if (isTab === "type") { - const trimmedName = signValue ? signValue.trim() : currentUserName.trim(); - const firstCharacter = trimmedName.charAt(0); + const trimmedName = signValue ? signValue?.trim() : currentUserName?.trim(); + const firstCharacter = trimmedName?.charAt(0); const userName = isInitial ? firstCharacter : signValue; setSignValue(userName); convertToImg(fontSelect, userName); @@ -46792,15 +46817,17 @@ async function fetchSubscriptionInfo() { const price = tenatRes.data?.result?.result?.SubscriptionDetails?.data?.subscription?.plan?.price; const totalPrice = tenatRes.data?.result?.result?.SubscriptionDetails?.data?.subscription?.amount; const planId = tenatRes.data?.result?.result?.SubscriptionDetails?.data?.subscription?.subscription_id; - const plan_code = tenatRes.data?.result?.result?.SubscriptionDetails?.data?.subscription?.plan?.plan_code; + const plan_code = tenatRes.data?.result?.result?.PlanCode; const totalAllowedUser = tenatRes.data?.result?.result?.AllowedUsers || 0; + const adminId = tenatRes?.data?.result?.result?.ExtUserPtr?.objectId || ""; return { status: "success", price: price, totalPrice: totalPrice, planId: planId, plan_code: plan_code, - totalAllowedUser: totalAllowedUser + totalAllowedUser: totalAllowedUser, + adminId: adminId }; } } catch (err) { @@ -47405,7 +47432,8 @@ const createDocument = async (template, placeholders, signerData, pdfUrl) => { Signers: signers, SendinOrder: Doc?.SendinOrder || false, AutomaticReminders: Doc?.AutomaticReminders || false, - RemindOnceInEvery: parseInt(Doc?.RemindOnceInEvery || 5) + RemindOnceInEvery: parseInt(Doc?.RemindOnceInEvery || 5), + IsEnableOTP: Doc?.IsEnableOTP || false }; try { const res = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(`${localStorage.getItem("baseUrl")}classes/contracts_Document`, data, { @@ -48604,13 +48632,16 @@ const fetchUrl = async (url, pdfName) => { } }; //handle download signed pdf -const handleDownloadPdf = async (pdfDetails, pdfUrl, setIsDownloading) => { - const pdfName = pdfDetails[0] && pdfDetails[0].Name; +const handleDownloadPdf = async (pdfDetails, setIsDownloading) => { + const pdfName = pdfDetails[0] && pdfDetails[0]?.Name; + const pdfUrl = pdfDetails?.[0]?.SignedUrl || pdfDetails?.[0]?.URL; setIsDownloading("pdf"); + const docId = !pdfDetails?.[0]?.IsEnableOTP ? pdfDetails?.[0]?.objectId : ""; try { // const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl }); const axiosRes = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(`${localStorage.getItem("baseUrl")}/functions/getsignedurl`, { - url: pdfUrl + url: pdfUrl, + docId: docId }, { headers: { "content-type": "Application/json", @@ -48632,15 +48663,17 @@ const sanitizeFileName = pdfName => { return pdfName.replace(/ /g, "_"); }; //function for print digital sign pdf -const handleToPrint = async (event, pdfUrl, setIsDownloading) => { +const handleToPrint = async (event, pdfUrl, setIsDownloading, pdfDetails) => { event.preventDefault(); setIsDownloading("pdf"); + const docId = !pdfDetails?.[0]?.IsEnableOTP ? pdfDetails?.[0]?.objectId : ""; try { // const url = await Parse.Cloud.run("getsignedurl", { url: pdfUrl }); //`localStorage.getItem("baseUrl")` is also use in public-profile flow for public-sign //if we give this `appInfo.baseUrl` as a base url then in public-profile it will create base url of it's window.location.origin ex- opensign.me which is not base url const axiosRes = await axios__WEBPACK_IMPORTED_MODULE_9__["default"].post(`${localStorage.getItem("baseUrl")}/functions/getsignedurl`, { - url: pdfUrl + url: pdfUrl, + docId: docId }, { headers: { "content-type": "Application/json", @@ -48676,12 +48709,16 @@ const handleToPrint = async (event, pdfUrl, setIsDownloading) => { }; //handle download signed pdf -const handleDownloadCertificate = async (pdfDetails, setIsDownloading) => { +const handleDownloadCertificate = async (pdfDetails, setIsDownloading, isZip) => { if (pdfDetails?.length > 0 && pdfDetails[0]?.CertificateUrl) { try { await fetch(pdfDetails[0] && pdfDetails[0]?.CertificateUrl); const certificateUrl = pdfDetails[0] && pdfDetails[0]?.CertificateUrl; - (0,file_saver__WEBPACK_IMPORTED_MODULE_5__.saveAs)(certificateUrl, `Certificate_signed_by_OpenSign™.pdf`); + if (isZip) { + return certificateUrl; + } else { + (0,file_saver__WEBPACK_IMPORTED_MODULE_5__.saveAs)(certificateUrl, `Certificate_signed_by_OpenSign™.pdf`); + } } catch (err) { console.log("err in download in certificate", err); } @@ -48703,7 +48740,11 @@ const handleDownloadCertificate = async (pdfDetails, setIsDownloading) => { if (doc?.CertificateUrl) { await fetch(doc?.CertificateUrl); const certificateUrl = doc?.CertificateUrl; - (0,file_saver__WEBPACK_IMPORTED_MODULE_5__.saveAs)(certificateUrl, `Certificate_signed_by_OpenSign™.pdf`); + if (isZip) { + return certificateUrl; + } else { + (0,file_saver__WEBPACK_IMPORTED_MODULE_5__.saveAs)(certificateUrl, `Certificate_signed_by_OpenSign™.pdf`); + } setIsDownloading(""); } else { setIsDownloading("certificate"); @@ -48967,9 +49008,9 @@ __webpack_require__.r(__webpack_exports__); function serverUrl_fn() { let baseUrl; if (_const__WEBPACK_IMPORTED_MODULE_1__.isEnableSubscription) { - baseUrl = true ? "http://localhost:8080/app" : 0; + baseUrl = true ? "https://staging-app.opensignlabs.com/api/app" : 0; } else { - baseUrl = true ? "http://localhost:8080/app" : 0; + baseUrl = true ? "https://staging-app.opensignlabs.com/api/app" : 0; } return baseUrl; } @@ -48980,7 +49021,7 @@ const appInfo = { defaultRole: "contracts_User", fbAppId: "MISSING_ENV_VAR".REACT_APP_FBAPPID ? `${"MISSING_ENV_VAR".REACT_APP_FBAPPID}` : "", fev_Icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAALlJREFUaEPtmN0NwjAMBpNxYDKYiM1Yp90g93CKStH1NbIdfz921Dker2Pc+Js1cDF7MXAxASMGYkAigBI6vh9ZwoXP53uZoAYcvhwdA3mAVbI2aSb+9zFKU4IURB6j/HoPUIEa2G3iGIAhQQDlAUIoE2diabIklISS0NoFPebo77RF6OenEF3QntOm128he0GKrwHyACFoz2MgBqSGkpAEcHs47oHtN5AFakACqMNjQEMoE8SABFCHn4HE2zGHSLeEAAAAAElFTkSuQmCC", - googleClietId: true ? `${"918704711393-thhv3re2pfqvve76tgb86ulu1tlpssrk.apps.googleusercontent.com"}` : 0, + googleClietId: "MISSING_ENV_VAR".REACT_APP_GOOGLECLIENTID ? `${"MISSING_ENV_VAR".REACT_APP_GOOGLECLIENTID}` : "", metaDescription: "The fastest way to sign PDFs & request signatures from others.", settings: [{ role: "contracts_Admin", @@ -49205,9 +49246,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _styles_signature_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../styles/signature.css */ "./src/styles/signature.css"); /* harmony import */ var parse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! parse */ "./node_modules/parse/index.js"); /* harmony import */ var parse__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(parse__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! axios */ "./node_modules/axios/lib/axios.js"); -/* harmony import */ var react_dnd__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! react-dnd */ "./node_modules/react-dnd/dist/core/DndProvider.js"); -/* harmony import */ var react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! react-dnd-html5-backend */ "./node_modules/react-dnd-html5-backend/dist/index.js"); +/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! axios */ "./node_modules/axios/lib/axios.js"); +/* harmony import */ var react_dnd__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! react-dnd */ "./node_modules/react-dnd/dist/core/DndProvider.js"); +/* harmony import */ var react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! react-dnd-html5-backend */ "./node_modules/react-dnd-html5-backend/dist/index.js"); /* harmony import */ var _components_pdf_SignPad__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/pdf/SignPad */ "./src/components/pdf/SignPad.js"); /* harmony import */ var _components_pdf_RenderAllPdfPage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/pdf/RenderAllPdfPage */ "./src/components/pdf/RenderAllPdfPage.js"); /* harmony import */ var reactour__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! reactour */ "./node_modules/reactour/dist/reactour.esm.js"); @@ -49216,26 +49257,16 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! moment */ "./node_modules/moment/moment.js"); /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_9__); /* harmony import */ var _constant_Utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../constant/Utils */ "./src/constant/Utils.js"); -/* harmony import */ var _primitives_LoaderWithMsg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../primitives/LoaderWithMsg */ "./src/primitives/LoaderWithMsg.js"); -/* harmony import */ var _primitives_HandleError__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../primitives/HandleError */ "./src/primitives/HandleError.js"); -/* harmony import */ var _components_pdf_PdfHeader__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../components/pdf/PdfHeader */ "./src/components/pdf/PdfHeader.js"); -/* harmony import */ var _components_pdf_RenderPdf__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../components/pdf/RenderPdf */ "./src/components/pdf/RenderPdf.js"); -/* harmony import */ var _primitives_PdfDeclineModal__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../primitives/PdfDeclineModal */ "./src/primitives/PdfDeclineModal.js"); -/* harmony import */ var _components_Title__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../components/Title */ "./src/components/Title.js"); -/* harmony import */ var _components_pdf_DefaultSignature__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../components/pdf/DefaultSignature */ "./src/components/pdf/DefaultSignature.js"); -/* harmony import */ var _primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../primitives/ModalUi */ "./src/primitives/ModalUi.js"); -/* harmony import */ var _primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../primitives/TourContentWithBtn */ "./src/primitives/TourContentWithBtn.js"); -/* harmony import */ var _primitives_Loader__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../primitives/Loader */ "./src/primitives/Loader.js"); -/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs"); -/* harmony import */ var _components_pdf_SignerListComponent__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../components/pdf/SignerListComponent */ "./src/components/pdf/SignerListComponent.js"); -/* harmony import */ var _components_pdf_VerifyEmail__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../components/pdf/VerifyEmail */ "./src/components/pdf/VerifyEmail.js"); -/* harmony import */ var _components_pdf_PdfZoom__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../components/pdf/PdfZoom */ "./src/components/pdf/PdfZoom.js"); -/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); - - - - - +/* harmony import */ var _components_pdf_PdfHeader__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../components/pdf/PdfHeader */ "./src/components/pdf/PdfHeader.js"); +/* harmony import */ var _components_pdf_RenderPdf__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../components/pdf/RenderPdf */ "./src/components/pdf/RenderPdf.js"); +/* harmony import */ var _components_Title__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../components/Title */ "./src/components/Title.js"); +/* harmony import */ var _components_pdf_DefaultSignature__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../components/pdf/DefaultSignature */ "./src/components/pdf/DefaultSignature.js"); +/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! react-redux */ "./node_modules/react-redux/dist/react-redux.mjs"); +/* harmony import */ var _components_pdf_SignerListComponent__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../components/pdf/SignerListComponent */ "./src/components/pdf/SignerListComponent.js"); +/* harmony import */ var _components_pdf_VerifyEmail__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../components/pdf/VerifyEmail */ "./src/components/pdf/VerifyEmail.js"); +/* harmony import */ var _components_pdf_PdfZoom__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../components/pdf/PdfZoom */ "./src/components/pdf/PdfZoom.js"); +/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); +/* harmony import */ var _primitives__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../primitives */ "./src/primitives/index.js"); @@ -49263,7 +49294,7 @@ __webpack_require__.r(__webpack_exports__); function PdfRequestFiles(props) { const { t - } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_24__.useTranslation)(); + } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_18__.useTranslation)(); const [pdfDetails, setPdfDetails] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]); const [signedSigners, setSignedSigners] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]); const [unsignedSigners, setUnSignedSigners] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]); @@ -49353,26 +49384,29 @@ function PdfRequestFiles(props) { const [isPublicContact, setIsPublicContact] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false); const [pdfArrayBuffer, setPdfArrayBuffer] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); const [plancode, setPlanCode] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); - const isHeader = (0,react_redux__WEBPACK_IMPORTED_MODULE_25__.useSelector)(state => state.showHeader); + const isHeader = (0,react_redux__WEBPACK_IMPORTED_MODULE_20__.useSelector)(state => state.showHeader); const divRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); + const [isDownloadModal, setIsDownloadModal] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false); const isMobile = window.innerWidth < 767; let isGuestSignFlow = false; let sendmail; let getDocId = ""; - const route = !props.templateId && window.location.pathname; //'/load/recipientSignPdf/TOAVuhXbfw/fPAKdK1qgX' - //window.location.search = ?sendmail=false - const getQuery = !props.templateId && window.location?.search && window.location?.search?.split("?"); //['','sendmail=false'] - - //'sendmail=false' + let contactBookId = ""; + const route = !props.templateId && window.location.pathname; + const getQuery = !props.templateId && window.location?.search?.split("?"); //['','sendmail=false'] if (getQuery) { - sendmail = getQuery[1].split("=")[1]; //false + sendmail = getQuery?.[1]?.split("=")[1]; //false } - const checkSplit = route && route?.split("/"); // ['', 'load', 'recipientSignPdf', 'TOAVuhXbfw', 'fPAKdK1qgX'] - if (checkSplit && checkSplit.length > 4) { + const routeId = route && route?.split("/"); // ['', 'load', 'recipientSignPdf', ':docId', ':contactBookId'] + if (routeId && routeId.length > 4) { + // this condition will be occur only in guest flow in which load routeId will be include isGuestSignFlow = true; - getDocId = checkSplit[3]; + getDocId = routeId[3]; + contactBookId = routeId[4]; } else { - getDocId = checkSplit[2]; + // this condition will be occur only in if user is logged in and load routeId will be exclude + getDocId = routeId[2]; + contactBookId = routeId?.[3] || ""; } let getDocumentId = getDocId || documentId; (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { @@ -49490,7 +49524,7 @@ function PdfRequestFiles(props) { templateId: props.templateId, ispublic: true }; - const templateDeatils = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(`${localStorage.getItem("baseUrl")}functions/getTemplate`, params, { + const templateDeatils = await axios__WEBPACK_IMPORTED_MODULE_21__["default"].post(`${localStorage.getItem("baseUrl")}functions/getTemplate`, params, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -49567,9 +49601,10 @@ function PdfRequestFiles(props) { try { const senderUser = localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`); const jsonSender = JSON.parse(senderUser); + // `currUserId` will be contactId or extUserId let currUserId; //getting document details - const documentData = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractDocument)(documentId || docId); + const documentData = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractDocument)(docId); if (documentData && documentData.length > 0) { const url = documentData[0] && (documentData[0]?.SignedUrl || documentData[0]?.URL); if (url) { @@ -49590,8 +49625,8 @@ function PdfRequestFiles(props) { const expireUpdateDate = new Date(expireDate).getTime(); const currDate = new Date().getTime(); const getSigners = documentData[0].Signers; - const getCurrentSigner = getSigners && getSigners.filter(data => data.UserId.objectId === jsonSender?.objectId); - currUserId = getCurrentSigner[0] ? getCurrentSigner[0].objectId : ""; + const getCurrentSigner = getSigners?.find(data => data.UserId.objectId === jsonSender?.objectId); + currUserId = getCurrentSigner?.objectId ? getCurrentSigner.objectId : contactBookId || ""; if (_constant_const__WEBPACK_IMPORTED_MODULE_1__.isEnableSubscription) { await checkIsSubscribed(documentData[0]?.ExtUserPtr?.objectId, currUserId); } @@ -49639,14 +49674,14 @@ function PdfRequestFiles(props) { } } } - const audittrailData = documentData[0].AuditTrail && documentData[0].AuditTrail.length > 0 && documentData[0].AuditTrail.filter(data => data.Activity === "Signed"); - const checkAlreadySign = documentData[0].AuditTrail && documentData[0].AuditTrail.length > 0 && documentData[0].AuditTrail.filter(data => data.UserPtr?.objectId === currUserId && data.Activity === "Signed"); - if (checkAlreadySign && checkAlreadySign[0] && checkAlreadySign.length > 0) { + const audittrailData = documentData?.[0]?.AuditTrail?.filter(data => data.Activity === "Signed"); + const checkAlreadySign = documentData?.[0]?.AuditTrail?.some(data => data?.UserPtr?.objectId === currUserId && data.Activity === "Signed") || false; + if (checkAlreadySign) { setAlreadySign(true); } else { const obj = documentData?.[0]; setSendInOrder(obj?.SendinOrder || false); - if (obj && obj.Signers && obj.Signers.length > 0 && obj.Placeholders && obj.Placeholders.length > 0) { + if (obj && obj?.Signers?.length > 0 && obj?.Placeholders?.length > 0) { const params = { event: "viewed", contactId: currUserId, @@ -49661,13 +49696,13 @@ function PdfRequestFiles(props) { email: x?.Email, phone: x?.Phone })), - viewedBy: jsonSender.email, + viewedBy: documentData?.[0].Signers?.find(x => x.objectId === currUserId)?.Email || jsonSender?.email, viewedAt: new Date(), createdAt: documentData?.[0].createdAt } }; try { - await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(`${localStorage.getItem("baseUrl")}functions/callwebhook`, params, { + await axios__WEBPACK_IMPORTED_MODULE_21__["default"].post(`${localStorage.getItem("baseUrl")}functions/callwebhook`, params, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -49731,40 +49766,65 @@ function PdfRequestFiles(props) { setPdfDetails(documentData); //checking if condition current user already sign or owner does not exist as a signer or document has been declined by someone or document has been expired //then stop to display tour message - if (checkAlreadySign && checkAlreadySign[0] && checkAlreadySign.length > 0 || !currUserId || declined || currDate > expireUpdateDate) { + if (checkAlreadySign || !currUserId || declined || currDate > expireUpdateDate) { setRequestSignTour(true); } else { - //else condition to check current user exist in contracts_Users class and check tour message status - //if not then check user exist in contracts_Contactbook class and check tour message statu - const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)(); - if (res === "Error: Something went wrong!") { - setHandleError(t("something-went-wrong-mssg")); - } else if (res[0] && res?.length) { - setContractName("_Users"); - currUserId = res[0].objectId; - setSignerUserId(currUserId); - const tourData = res[0].TourStatus && res[0].TourStatus; - if (tourData && tourData.length > 0) { - const checkTourRequest = tourData.filter(data => data?.requestSign); - setTourStatus(tourData); - setRequestSignTour(checkTourRequest[0]?.requestSign || false); + const isEnableOTP = documentData?.[0]?.IsEnableOTP || false; + if (!isEnableOTP) { + try { + const resContact = await axios__WEBPACK_IMPORTED_MODULE_21__["default"].post(`${localStorage.getItem("baseUrl")}functions/getcontact`, { + contactId: currUserId + }, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId") + } + }); + const contact = resContact?.data?.result; + setContractName("_Contactbook"); + setSignerUserId(contact?.objectId); + const tourData = contact?.TourStatus && contact?.TourStatus; + if (tourData && tourData.length > 0) { + const checkTourRequest = tourData?.some(data => data?.requestSign) || false; + setTourStatus(tourData); + setRequestSignTour(checkTourRequest); + } + } catch (err) { + console.log("err while getting tourstatus", err); } - } else if (res?.length === 0) { - const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contactBook)(currUserId); + } else { + //else condition to check current user exist in contracts_Users class and check tour message status + //if not then check user exist in contracts_Contactbook class and check tour message status + const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)(); if (res === "Error: Something went wrong!") { setHandleError(t("something-went-wrong-mssg")); - } else if (res[0] && res.length) { - setContractName("_Contactbook"); - const objectId = res[0].objectId; - setSignerUserId(objectId); + } else if (res[0] && res?.length) { + setContractName("_Users"); + currUserId = res[0].objectId; + setSignerUserId(currUserId); const tourData = res[0].TourStatus && res[0].TourStatus; if (tourData && tourData.length > 0) { const checkTourRequest = tourData.filter(data => data?.requestSign); setTourStatus(tourData); setRequestSignTour(checkTourRequest[0]?.requestSign || false); } - } else if (res.length === 0) { - setHandleError(t("user-not-exist")); + } else if (res?.length === 0) { + const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contactBook)(currUserId); + if (res === "Error: Something went wrong!") { + setHandleError(t("something-went-wrong-mssg")); + } else if (res[0] && res.length) { + setContractName("_Contactbook"); + const objectId = res[0].objectId; + setSignerUserId(objectId); + const tourData = res[0].TourStatus && res[0].TourStatus; + if (tourData && tourData.length > 0) { + const checkTourRequest = tourData.filter(data => data?.requestSign); + setTourStatus(tourData); + setRequestSignTour(checkTourRequest[0]?.requestSign || false); + } + } else if (res.length === 0) { + setHandleError(t("user-not-exist")); + } } } } @@ -49782,12 +49842,12 @@ function PdfRequestFiles(props) { }); } //function to get default signatur eof current user from `contracts_Signature` class - const defaultSignRes = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.getDefaultSignature)(jsonSender.objectId); + const defaultSignRes = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.getDefaultSignature)(jsonSender?.objectId); if (defaultSignRes?.status === "success") { - setDefaultSignImg(defaultSignRes?.res?.defaultSignature); - setMyInitial(defaultSignRes?.res?.defaultInitial); - } else if (defaultSignRes?.status === "error") { - setHandleError("Error: Something went wrong!"); + const sign = defaultSignRes?.res?.defaultSignature || ""; + const initials = defaultSignRes?.res?.defaultInitial || ""; + setDefaultSignImg(sign); + setMyInitial(initials); } setIsLoading({ isLoad: false @@ -49805,20 +49865,29 @@ function PdfRequestFiles(props) { //for emailVerified data checking first in localstorage const localuser = localStorage.getItem(`Parse/${localStorage.getItem("parseAppId")}/currentUser`); let currentUser = JSON.parse(localuser); + let isEmailVerified = currentUser?.emailVerified; + const isEnableOTP = pdfDetails?.[0]?.IsEnableOTP || false; //if emailVerified data is not present in local user details then fetch again in _User class - if (!currentUser?.emailVerified) { - const userQuery = new (parse__WEBPACK_IMPORTED_MODULE_4___default().Query)((parse__WEBPACK_IMPORTED_MODULE_4___default().User)); - const getUser = await userQuery.get(currentUser?.objectId, { - sessionToken: currentUser?.sessionToken - }); - if (getUser) { - currentUser = JSON.parse(JSON.stringify(getUser)); + if (isEnableOTP) { + try { + if (!currentUser?.emailVerified) { + const userQuery = new (parse__WEBPACK_IMPORTED_MODULE_4___default().Query)((parse__WEBPACK_IMPORTED_MODULE_4___default().User)); + const getUser = await userQuery.get(currentUser?.objectId, { + sessionToken: currentUser?.sessionToken || localStorage.getItem("accesstoken") + }); + if (getUser) { + currentUser = JSON.parse(JSON.stringify(getUser)); + } + } + isEmailVerified = currentUser?.emailVerified; + setIsEmailVerified(isEmailVerified); + } catch (err) { + console.log("err in get email verification ", err); + setHandleError(t("something-went-wrong-mssg")); } } - let isEmailVerified = currentUser?.emailVerified; //check if isEmailVerified then go on next step - if (isEmailVerified) { - setIsEmailVerified(isEmailVerified); + if (!isEnableOTP || isEmailVerified) { try { const checkUser = signerPos.filter(data => data.signerObjId === signerObjectId); if (checkUser && checkUser.length > 0) { @@ -49960,28 +50029,17 @@ function PdfRequestFiles(props) { // console.log("pdfte", pdfBytes); //get ExistUserPtr object id of user class to get tenantDetails const objectId = pdfDetails?.[0]?.ExtUserPtr?.UserId?.objectId; - //get ExistUserPtr email to get userDetails - const res = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.contractUsers)(); - let activeMailAdapter = ""; - if (res === "Error: Something went wrong!") { - setHandleError(t("something-went-wrong-mssg")); - setIsLoading({ - isLoad: false - }); - } else if (!res || res?.length === 0) { - activeMailAdapter = ""; - } else if (res[0] && res.length) { - activeMailAdapter = res[0]?.active_mail_adapter; - } + let activeMailAdapter = pdfDetails?.[0]?.ExtUserPtr?.active_mail_adapter; + //function for call to embed signature in pdf and get digital signature pdf const resSign = await (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.signPdfFun)(pdfBytes, documentId, signerObjectId, objectId, isSubscribed, activeMailAdapter, widgets); if (resSign && resSign.status === "success") { - setPdfUrl(res.data); + setPdfUrl(resSign.data); setIsSigned(true); setSignedSigners([]); setUnSignedSigners([]); - getDocumentDetails(true); - const index = pdfDetails?.[0].Signers.findIndex(x => x.Email === currentUser?.email); + getDocumentDetails(documentId, true); + const index = pdfDetails?.[0]?.Signers.findIndex(x => x.objectId === signerObjectId); const newIndex = index + 1; const usermail = { Email: pdfDetails?.[0]?.Placeholders[newIndex]?.email || "" @@ -50050,7 +50108,7 @@ function PdfRequestFiles(props) { plan: plancode, html: requestBody ? replaceVar?.body : "

Digital Signature Request

" + pdfDetails?.[0].ExtUserPtr.Name + " has requested you to review and sign " + pdfDetails?.[0].Name + ".

Sender " + senderEmail + "
Organization " + orgName + "
Expires on " + localExpireDate + "

This is an automated email from OpenSign™. For any queries regarding this email, please contact the sender " + senderEmail + " directly.If you think this email is inappropriate or spam, you may file a complaint with OpenSign™ here.

" }; - await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(url, params, { + await axios__WEBPACK_IMPORTED_MODULE_21__["default"].post(url, params, { headers: headers }); } catch (error) { @@ -50096,21 +50154,6 @@ function PdfRequestFiles(props) { alertMessage: t("something-went-wrong-mssg") }); } - } else { - //else verify users email - try { - const userQuery = new (parse__WEBPACK_IMPORTED_MODULE_4___default().Query)((parse__WEBPACK_IMPORTED_MODULE_4___default().User)); - const user = await userQuery.get(currentUser?.objectId, { - sessionToken: localStorage.getItem("accesstoken") - }); - if (user) { - isEmailVerified = user?.get("emailVerified"); - setIsEmailVerified(isEmailVerified); - } - } catch (e) { - console.log("error in save user's emailVerified in user class"); - setHandleError(t("something-went-wrong-mssg")); - } } } @@ -50244,17 +50287,15 @@ function PdfRequestFiles(props) { setIsDecline({ isDeclined: false }); - const data = { - IsDeclined: true, - DeclineReason: reason, - DeclineBy: { - __type: "Pointer", - className: "_User", - objectId: jsonSender?.objectId - } - }; setIsUiLoading(true); - await axios__WEBPACK_IMPORTED_MODULE_26__["default"].put(`${localStorage.getItem("baseUrl")}classes/contracts_Document/${documentId}`, data, { + const email = pdfDetails?.[0].Signers?.find(x => x.objectId === signerObjectId)?.Email || jsonSender?.email; + const userId = pdfDetails?.[0].Signers?.find(x => x.objectId === signerObjectId)?.UserId?.objectId || jsonSender?.objectId; + const params = { + docId: pdfDetails?.[0].objectId, + reason: reason, + userId: userId + }; + await axios__WEBPACK_IMPORTED_MODULE_21__["default"].post(`${localStorage.getItem("baseUrl")}functions/declinedoc`, params, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -50282,13 +50323,14 @@ function PdfRequestFiles(props) { email: x?.Email, phone: x?.Phone })), - declinedBy: jsonSender.email, + declinedBy: email, + declinedReason: reason, declinedAt: new Date(), createdAt: pdfDetails?.[0].createdAt } }; try { - await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(`${localStorage.getItem("baseUrl")}functions/callwebhook`, params, { + await axios__WEBPACK_IMPORTED_MODULE_21__["default"].post(`${localStorage.getItem("baseUrl")}functions/callwebhook`, params, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -50328,43 +50370,59 @@ function PdfRequestFiles(props) { const closeRequestSignTour = async () => { setRequestSignTour(true); if (isDontShow) { - let updatedTourStatus = []; - if (tourStatus.length > 0) { - updatedTourStatus = [...tourStatus]; - const requestSignIndex = tourStatus.findIndex(obj => obj["requestSign"] === false || obj["requestSign"] === true); - if (requestSignIndex !== -1) { - updatedTourStatus[requestSignIndex] = { - requestSign: true - }; - } else { - updatedTourStatus.push({ - requestSign: true + const isEnableOTP = pdfDetails?.[0]?.IsEnableOTP || false; + if (!isEnableOTP) { + try { + await axios__WEBPACK_IMPORTED_MODULE_21__["default"].post(`${localStorage.getItem("baseUrl")}functions/updatecontacttour`, { + contactId: signerObjectId + }, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId") + } }); + } catch (e) { + console.log("update tour messages error", e); } } else { - updatedTourStatus = [{ - requestSign: true - }]; - } - try { - await axios__WEBPACK_IMPORTED_MODULE_26__["default"].put(`${localStorage.getItem("baseUrl")}classes/contracts${contractName}/${signerUserId}`, { - TourStatus: updatedTourStatus - }, { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") + let updatedTourStatus = []; + if (tourStatus.length > 0) { + updatedTourStatus = [...tourStatus]; + const requestSignIndex = tourStatus.findIndex(obj => obj["requestSign"] === false || obj["requestSign"] === true); + if (requestSignIndex !== -1) { + updatedTourStatus[requestSignIndex] = { + requestSign: true + }; + } else { + updatedTourStatus.push({ + requestSign: true + }); } - }); - } catch (e) { - console.log("update tour messages error", e); + } else { + updatedTourStatus = [{ + requestSign: true + }]; + } + try { + await axios__WEBPACK_IMPORTED_MODULE_21__["default"].put(`${localStorage.getItem("baseUrl")}classes/contracts${contractName}/${signerUserId}`, { + TourStatus: updatedTourStatus + }, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + }); + } catch (e) { + console.log("update tour messages error", e); + } } } }; const requestSignTourFunction = () => { const tourConfig = [{ selector: '[data-tut="reactourFirst"]', - content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], { + content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.TourContentWithBtn, { message: t("tour-mssg.pdf-request-file-1"), isChecked: handleDontShow }), @@ -50374,7 +50432,7 @@ function PdfRequestFiles(props) { } }, { selector: '[data-tut="pdfArea"]', - content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], { + content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.TourContentWithBtn, { message: t("tour-mssg.pdf-request-file-2"), isChecked: handleDontShow }), @@ -50384,7 +50442,7 @@ function PdfRequestFiles(props) { } }, { selector: '[data-tut="reactourFifth"]', - content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], { + content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.TourContentWithBtn, { message: t("tour-mssg.pdf-request-file-3"), isChecked: handleDontShow }), @@ -50395,7 +50453,7 @@ function PdfRequestFiles(props) { }]; const signedByStep = { selector: '[data-tut="reactourSecond"]', - content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], { + content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.TourContentWithBtn, { message: t("tour-mssg.pdf-request-file-4"), isChecked: handleDontShow }), @@ -50410,7 +50468,7 @@ function PdfRequestFiles(props) { //checking if default signature component exist then add defaultSign step const defaultSignStep = { selector: '[data-tut="reactourThird"]', - content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_TourContentWithBtn__WEBPACK_IMPORTED_MODULE_19__["default"], { + content: () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.TourContentWithBtn, { message: t("tour-mssg.pdf-request-file-5"), isChecked: handleDontShow }), @@ -50447,7 +50505,7 @@ function PdfRequestFiles(props) { templateid: pdfDetails[0]?.objectId, role: pdfDetails[0]?.PublicRole[0] }; - const userRes = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(`${localStorage.getItem("baseUrl")}/functions/publicuserlinkcontacttodoc`, params, { + const userRes = await axios__WEBPACK_IMPORTED_MODULE_21__["default"].post(`${localStorage.getItem("baseUrl")}/functions/publicuserlinkcontacttodoc`, params, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId") @@ -50484,7 +50542,7 @@ function PdfRequestFiles(props) { email: contact.email, docId: res.docId }; - const Otp = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(`${localStorage.getItem("baseUrl")}/functions/SendOTPMailV1`, params, { + const Otp = await axios__WEBPACK_IMPORTED_MODULE_21__["default"].post(`${localStorage.getItem("baseUrl")}/functions/SendOTPMailV1`, params, { headers: { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId") @@ -50518,7 +50576,7 @@ function PdfRequestFiles(props) { email: contact.email, otp: otp }; - let user = await axios__WEBPACK_IMPORTED_MODULE_26__["default"].post(url, body, { + let user = await axios__WEBPACK_IMPORTED_MODULE_21__["default"].post(url, body, { headers: headers }); if (user.data.result === "Invalid Otp") { @@ -50591,11 +50649,11 @@ function PdfRequestFiles(props) { className: "font-medium" }, t("reason")), " :", " ", pdfDetails[0]?.DeclineReason, " ")); }; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_dnd__WEBPACK_IMPORTED_MODULE_27__.DndProvider, { - backend: react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_28__.HTML5Backend - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Title__WEBPACK_IMPORTED_MODULE_16__["default"], { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_dnd__WEBPACK_IMPORTED_MODULE_22__.DndProvider, { + backend: react_dnd_html5_backend__WEBPACK_IMPORTED_MODULE_23__.HTML5Backend + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Title__WEBPACK_IMPORTED_MODULE_13__["default"], { title: props.templateId ? "Public Sign" : "Request Sign" - }), isSubscriptionExpired ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { + }), isSubscriptionExpired ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.ModalUi, { title: t("subscription-expired"), isOpen: isSubscriptionExpired, showClose: false @@ -50603,13 +50661,13 @@ function PdfRequestFiles(props) { className: "flex flex-col justify-center items-center py-4 md:py-5 gap-5" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { className: "text-sm md:text-lg font-normal" - }, t("owner-subscription-expired")))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, isLoading.isLoad ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_LoaderWithMsg__WEBPACK_IMPORTED_MODULE_11__["default"], { + }, t("owner-subscription-expired")))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, isLoading.isLoad ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.LoaderWithMsg, { isLoading: isLoading - }) : handleError ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_HandleError__WEBPACK_IMPORTED_MODULE_12__["default"], { + }) : handleError ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.HandleError, { handleError: handleError }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, isUiLoading && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_Loader__WEBPACK_IMPORTED_MODULE_20__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.Loader, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { className: "text-[13px] text-base-content" }, t("loading-mssg"))), isCelebration && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "relative z-[1000]" @@ -50620,8 +50678,8 @@ function PdfRequestFiles(props) { style: { pointerEvents: isExpired || isDecline.isDeclined && isDecline.currnt === "another" ? "none" : "auto" }, - className: `${props.templateId && "m-1 border-[0.5px] border-gray-300"} relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300` - }, !requestSignTour && signerObjectId && requestSignTourFunction(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { + className: `${(props.templateId || isGuestSignFlow) && "mx-2 border-[0.5px] border-gray-300"} relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300` + }, !requestSignTour && signerObjectId && requestSignTourFunction(), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.ModalUi, { isOpen: isAlert.isShow, title: t("alert-message"), handleClose: () => setIsAlert({ @@ -50646,14 +50704,14 @@ function PdfRequestFiles(props) { isOpen: widgetsTour, rounded: 5, closeWithMask: false - }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_PdfDeclineModal__WEBPACK_IMPORTED_MODULE_15__["default"], { + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.PdfDeclineModal, { show: isDecline.isDeclined, - headMsg: pdfDetails[0]?.IsDeclined ? t("document-declined") : t("document-decline"), + headMsg: t("document-declined"), bodyMssg: isDecline.currnt === "Sure" ? t("decline-alert-1") : isDecline.currnt === "YouDeclined" ? t("decline-alert-2") : isDecline.currnt === "another" && handleDeclineMssg(), footerMessage: isDecline.currnt === "Sure", declineDoc: declineDoc, setIsDecline: setIsDecline - }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_PdfDeclineModal__WEBPACK_IMPORTED_MODULE_15__["default"], { + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.PdfDeclineModal, { show: isExpired, headMsg: t("expired-doc-title"), bodyMssg: t("expired-on-mssg", { @@ -50661,7 +50719,7 @@ function PdfRequestFiles(props) { }), isDownloadBtn: true, handleDownloadBtn: handleDownloadBtn - }), !isEmailVerified && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_VerifyEmail__WEBPACK_IMPORTED_MODULE_22__["default"], { + }), !isEmailVerified && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_VerifyEmail__WEBPACK_IMPORTED_MODULE_16__["default"], { isVerifyModal: isVerifyModal, setIsVerifyModal: setIsVerifyModal, handleVerifyEmail: handleVerifyEmail, @@ -50670,7 +50728,7 @@ function PdfRequestFiles(props) { otpLoader: otpLoader, handleVerifyBtn: handleVerifyBtn, handleResend: handleResend - }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.ModalUi, { isOpen: isPublicContact, title: isOtp ? t("verify-email-1") : t("contact-details"), handleClose: () => handleCloseOtp() @@ -50759,7 +50817,7 @@ function PdfRequestFiles(props) { }, loading ? t("loading") : t("submit")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { className: "op-btn op-btn-ghost", onClick: () => handleCloseOtp() - }, t("close")))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { + }, t("close")))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.ModalUi, { isOpen: defaultSignAlert.isShow, title: t("auto-sign-all"), handleClose: () => setDefaultSignAlert({ @@ -50799,13 +50857,13 @@ function PdfRequestFiles(props) { containerWH: containerWH }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: " w-full md:w-[57%] flex mr-4" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_PdfZoom__WEBPACK_IMPORTED_MODULE_23__["default"], { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_PdfZoom__WEBPACK_IMPORTED_MODULE_17__["default"], { clickOnZoomIn: clickOnZoomIn, clickOnZoomOut: clickOnZoomOut, isDisableRotate: true }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: " w-full md:w-[95%] " - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.ModalUi, { isOpen: isCompleted.isModal, title: t("document-signed"), handleClose: () => setIsCompleted(prev => ({ @@ -50820,7 +50878,7 @@ function PdfRequestFiles(props) { }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, t("document-signed-alert-4"))), !isCompleted?.message && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "flex mt-4 gap-1 px-[15px]" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { - onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleToPrint)(e, pdfUrl, setIsDownloading), + onClick: e => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleToPrint)(e, pdfUrl, setIsDownloading, pdfDetails), type: "button", className: "font-[500] text-[13px] mr-[5px] op-btn op-btn-neutral" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { @@ -50840,7 +50898,7 @@ function PdfRequestFiles(props) { }, t("certificate"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { type: "button", className: "font-[500] text-[13px] mr-[5px] op-btn op-btn-primary", - onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleDownloadPdf)(pdfDetails, pdfUrl, setIsDownloading) + onClick: () => (0,_constant_Utils__WEBPACK_IMPORTED_MODULE_10__.handleDownloadPdf)(pdfDetails, setIsDownloading) }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", { className: "fa-light fa-download", "aria-hidden": "true" @@ -50848,7 +50906,7 @@ function PdfRequestFiles(props) { className: "hidden lg:block" }, t("download")))))), isDownloading === "pdf" && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { className: "fixed z-[1000] inset-0 flex justify-center items-center bg-black bg-opacity-30" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_Loader__WEBPACK_IMPORTED_MODULE_20__["default"], null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.Loader, null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.ModalUi, { isOpen: isDownloading === "certificate", title: isDownloading === "certificate" ? t("generating-certificate") : t("pdf-download"), handleClose: () => setIsDownloading("") @@ -50874,7 +50932,7 @@ function PdfRequestFiles(props) { setIsStamp: setIsStamp, currWidgetsDetails: currWidgetsDetails, setCurrWidgetsDetails: setCurrWidgetsDetails - }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_PdfHeader__WEBPACK_IMPORTED_MODULE_13__["default"], { + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_PdfHeader__WEBPACK_IMPORTED_MODULE_11__["default"], { isPdfRequestFiles: isPublicTemplate ? false : true, pageNumber: pageNumber, allPages: allPages, @@ -50895,12 +50953,13 @@ function PdfRequestFiles(props) { clickOnZoomIn: clickOnZoomIn, clickOnZoomOut: clickOnZoomOut, isDisableRotate: true, - templateId: props.templateId + templateId: props.templateId, + setIsDownloadModal: setIsDownloadModal }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { ref: divRef, "data-tut": "pdfArea", className: "h-[95%]" - }, containerWH && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_RenderPdf__WEBPACK_IMPORTED_MODULE_14__["default"], { + }, containerWH && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_RenderPdf__WEBPACK_IMPORTED_MODULE_12__["default"], { pageNumber: pageNumber, pdfOriginalWH: pdfOriginalWH, pdfNewWidth: pdfNewWidth, @@ -50946,7 +51005,7 @@ function PdfRequestFiles(props) { }, signedSigners.map((obj, ind) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: ind - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_SignerListComponent__WEBPACK_IMPORTED_MODULE_21__["default"], { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_SignerListComponent__WEBPACK_IMPORTED_MODULE_15__["default"], { ind: ind, obj: obj, isMenu: isHeader, @@ -50960,19 +51019,19 @@ function PdfRequestFiles(props) { }, unsignedSigners.map((obj, ind) => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { key: ind - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_SignerListComponent__WEBPACK_IMPORTED_MODULE_21__["default"], { + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_SignerListComponent__WEBPACK_IMPORTED_MODULE_15__["default"], { ind: ind, obj: obj, isMenu: isHeader, signerPos: signerPos })); - }))), defaultSignImg && !alreadySign && currentSigner && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_DefaultSignature__WEBPACK_IMPORTED_MODULE_17__["default"], { + }))), defaultSignImg && !alreadySign && currentSigner && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_pdf_DefaultSignature__WEBPACK_IMPORTED_MODULE_14__["default"], { defaultSignImg: defaultSignImg, userObjectId: signerObjectId, setIsLoading: setIsLoading, xyPostion: signerPos, setDefaultSignAlert: setDefaultSignAlert - }))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives_ModalUi__WEBPACK_IMPORTED_MODULE_18__["default"], { + }))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.ModalUi, { isOpen: validateAlert, title: t("validation-alert"), handleClose: () => setValidateAlert(false) @@ -50984,7 +51043,11 @@ function PdfRequestFiles(props) { onClick: () => setValidateAlert(false), type: "button", className: "op-btn op-btn-ghost" - }, t("close")))))); + }, t("close")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_primitives__WEBPACK_IMPORTED_MODULE_19__.DownloadPdfZip, { + setIsDownloadModal: setIsDownloadModal, + isDownloadModal: isDownloadModal, + pdfDetails: pdfDetails + }))); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PdfRequestFiles); @@ -51037,34 +51100,6 @@ const Alert = _ref => { /***/ }), -/***/ "./src/primitives/HandleError.js": -/*!***************************************!*\ - !*** ./src/primitives/HandleError.js ***! - \***************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); - -function HandleError(_ref) { - let { - handleError - } = _ref; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "flex justify-center items-center h-[100vh]" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - className: "text-[20px] text-[gray]" - }, handleError)); -} -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (HandleError); - -/***/ }), - /***/ "./src/primitives/Loader.js": /*!**********************************!*\ !*** ./src/primitives/Loader.js ***! @@ -51088,36 +51123,6 @@ const Loader = () => { /***/ }), -/***/ "./src/primitives/LoaderWithMsg.js": -/*!*****************************************!*\ - !*** ./src/primitives/LoaderWithMsg.js ***! - \*****************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Loader */ "./src/primitives/Loader.js"); - - -function LoaderWithMsg(_ref) { - let { - isLoading - } = _ref; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "flex flex-col justify-center items-center h-[100vh]" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Loader__WEBPACK_IMPORTED_MODULE_1__["default"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - className: "text-[13px] text-base-cotent" - }, isLoading.message)); -} -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LoaderWithMsg); - -/***/ }), - /***/ "./src/primitives/ModalUi.js": /*!***********************************!*\ !*** ./src/primitives/ModalUi.js ***! @@ -51158,126 +51163,13 @@ const ModalUi = _ref => { /***/ }), -/***/ "./src/primitives/PdfDeclineModal.js": -/*!*******************************************!*\ - !*** ./src/primitives/PdfDeclineModal.js ***! - \*******************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { +/***/ "./src/primitives/index.js": +/*!*********************************!*\ + !*** ./src/primitives/index.js ***! + \*********************************/ +/***/ (() => { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _styles_signature_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../styles/signature.css */ "./src/styles/signature.css"); -/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); - - - -function CustomModal(props) { - const { - t - } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__.useTranslation)(); - const [reason, setReason] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(""); - return props.show && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("dialog", { - className: "op-modal op-modal-open absolute z-[448]" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "w-[95%] md:w-[60%] lg:w-[40%] op-modal-box p-0 overflow-y-auto hide-scrollbar text-sm" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h3", { - className: "text-base-content font-bold text-lg pt-[15px] px-[20px]" - }, props?.headMsg && props?.headMsg), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "p-[10px] px-[20px]" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", { - className: "text-[15px]" - }, props.bodyMssg && props.bodyMssg)), props.isDownloadBtn && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "flex justify-start w-full ml-[20px] mb-3 mt-1" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { - className: "op-btn op-btn-primary ", - onClick: () => props.handleDownloadBtn() - }, "Download")), props.footerMessage && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "mx-3" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("textarea", { - rows: 3, - placeholder: "Reason (optional)", - className: "px-4 op-textarea op-textarea-bordered focus:outline-none hover:border-base-content w-full text-xs", - value: reason, - onChange: e => setReason(e.target.value) - })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "m-[15px]" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { - className: "op-btn op-btn-primary mr-2 px-6", - type: "button", - onClick: () => { - setReason(""); - props.declineDoc(reason); - } - }, t("yes")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", { - type: "button", - className: "op-btn op-btn-secondary", - onClick: () => { - setReason(""); - props.setIsDecline({ - isDeclined: false - }); - } - }, t("close")))))); -} -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CustomModal); - -/***/ }), - -/***/ "./src/primitives/TourContentWithBtn.js": -/*!**********************************************!*\ - !*** ./src/primitives/TourContentWithBtn.js ***! - \**********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (/* binding */ TourContentWithBtn) -/* harmony export */ }); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-i18next */ "./node_modules/react-i18next/dist/es/index.js"); - - -function TourContentWithBtn(_ref) { - let { - message, - isChecked, - video - } = _ref; - const { - t - } = (0,react_i18next__WEBPACK_IMPORTED_MODULE_1__.useTranslation)(); - const [isCheck, setIsCheck] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false); - const handleCheck = () => { - setIsCheck(!isCheck); - if (isChecked) { - isChecked(!isCheck); - } - }; - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", null, message), video && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "flex items-center justify-center my-[10px] border-[1.3px] border-gray-400 rounded-sm" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("iframe", { - src: video, - title: "YouTube video player", - allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share", - allowFullScreen: true - })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", { - className: "flex items-center justify-center mb-0" - }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { - type: "checkbox", - className: "op-checkbox op-checkbox-xs mr-1", - checked: isCheck, - onChange: handleCheck - }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { - className: "#787878 text-[12px]" - }, t("tour-content")))); -} +throw new Error("Module build failed (from ./node_modules/babel-loader/lib/index.js):\nSyntaxError: D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\src\\primitives\\index.js: `LoaderWithMsg` has already been exported. Exported identifiers must be unique. (8:9)\n\n\u001b[0m \u001b[90m 6 |\u001b[39m \u001b[36mexport\u001b[39m { \u001b[36mdefault\u001b[39m \u001b[36mas\u001b[39m \u001b[33mLoaderWithMsg\u001b[39m } \u001b[36mfrom\u001b[39m \u001b[32m\"./LoaderWithMsg\"\u001b[39m\u001b[33m;\u001b[39m\n \u001b[90m 7 |\u001b[39m \u001b[36mexport\u001b[39m { \u001b[36mdefault\u001b[39m \u001b[36mas\u001b[39m \u001b[33mPdfDeclineModal\u001b[39m } \u001b[36mfrom\u001b[39m \u001b[32m\"./PdfDeclineModal\"\u001b[39m\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 8 |\u001b[39m \u001b[36mexport\u001b[39m { \u001b[36mdefault\u001b[39m \u001b[36mas\u001b[39m \u001b[33mLoaderWithMsg\u001b[39m } \u001b[36mfrom\u001b[39m \u001b[32m\"./LoaderWithMsg\"\u001b[39m\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 9 |\u001b[39m\u001b[0m\n at constructor (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:349:19)\n at JSXParserMixin.raise (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:3247:19)\n at JSXParserMixin.checkDuplicateExports (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:13519:14)\n at JSXParserMixin.checkExport (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:13461:16)\n at JSXParserMixin.parseExport (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:13265:12)\n at JSXParserMixin.parseStatementContent (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:12330:27)\n at JSXParserMixin.parseStatementLike (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:12217:17)\n at JSXParserMixin.parseModuleItem (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:12194:17)\n at JSXParserMixin.parseBlockOrModuleBlockBody (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:12770:36)\n at JSXParserMixin.parseBlockBody (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:12763:10)\n at JSXParserMixin.parseProgram (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:12091:10)\n at JSXParserMixin.parseTopLevel (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:12081:25)\n at JSXParserMixin.parse (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:13893:10)\n at parse (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\parser\\lib\\index.js:13927:38)\n at parser (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\core\\lib\\parser\\index.js:41:34)\n at parser.next ()\n at normalizeFile (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\core\\lib\\transformation\\normalize-file.js:64:37)\n at normalizeFile.next ()\n at run (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\core\\lib\\transformation\\index.js:21:50)\n at run.next ()\n at transform (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\@babel\\core\\lib\\transform.js:22:33)\n at transform.next ()\n at step (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\gensync\\index.js:261:32)\n at D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\gensync\\index.js:273:13\n at async.call.result.err.err (D:\\officeApplications\\Open-sign\\updateHighResolution\\OpenSign\\apps\\OpenSign\\node_modules\\gensync\\index.js:223:11)"); /***/ }), @@ -58312,6 +58204,21 @@ input.op-tab:checked + .op-tab-content, .op-join.op-join-horizontal > :where(*:not(:first-child)):is(.op-btn) { margin-inline-start: calc(var(--border-btn) * -1); } +.op-menu-xs :where(li:not(.op-menu-title) > *:not(ul, details, .op-menu-title)), .op-menu-xs :where(li:not(.op-menu-title) > details > summary:not(.op-menu-title)) { + border-radius: 0.25rem; + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; +} +.op-menu-xs .op-menu-title { + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} .op-menu-sm :where(li:not(.op-menu-title) > *:not(ul, details, .op-menu-title)), .op-menu-sm :where(li:not(.op-menu-title) > details > summary:not(.op-menu-title)) { border-radius: var(--rounded-btn, 0.5rem); padding-left: 0.75rem; @@ -58404,6 +58311,9 @@ input.op-tab:checked + .op-tab-content, .-right-1 { right: -0.25rem; } +.-right-3 { + right: -0.75rem; +} .-right-\\[12px\\] { right: -12px; } @@ -58802,6 +58712,9 @@ input.op-tab:checked + .op-tab-content, .mt-1 { margin-top: 0.25rem; } +.mt-1\\.5 { + margin-top: 0.375rem; +} .mt-2 { margin-top: 0.5rem; } @@ -59900,6 +59813,9 @@ input.op-tab:checked + .op-tab-content, .pb-3 { padding-bottom: 0.75rem; } +.pb-6 { + padding-bottom: 1.5rem; +} .pb-\\[15px\\] { padding-bottom: 15px; } @@ -59954,6 +59870,9 @@ input.op-tab:checked + .op-tab-content, .pt-4 { padding-top: 1rem; } +.pt-6 { + padding-top: 1.5rem; +} .pt-\\[10px\\] { padding-top: 10px; } @@ -60709,6 +60628,10 @@ body { height: 200px; } + .md\\:h-\\[300px\\] { + height: 300px; + } + .md\\:h-\\[400px\\] { height: 400px; } @@ -60813,6 +60736,10 @@ body { width: auto; } + .md\\:\\!min-w-\\[650px\\] { + min-width: 650px !important; + } + .md\\:min-w-\\[440px\\] { min-width: 440px; } @@ -60949,6 +60876,10 @@ body { font-size: 30px; } + .md\\:text-\\[40px\\] { + font-size: 40px; + } + .md\\:text-base { font-size: 1rem; line-height: 1.5rem; @@ -61112,7 +61043,7 @@ body { --tw-bg-opacity: 1; background-color: rgb(55 65 81 / var(--tw-bg-opacity)); } -}`, "",{"version":3,"sources":["webpack://./src/index.css"],"names":[],"mappings":"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mB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,yBAAmB;UAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,4BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,0EAAmB;EAAnB,8FAAmB;EAAnB;AAAmB;AAAnB;EAAA,+EAAmB;EAAnB,mGAAmB;EAAnB;AAAmB;AAAnB;EAAA,6EAAmB;EAAnB,iGAAmB;EAAnB;AAAmB;AAAnB;EAAA,8BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,2GAAmB;EAAnB,yGAAmB;EAAnB;AAAmB;AAAnB;EAAA,2GAAmB;EAAnB,yGAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,gKAAmB;EAAnB,wJAAmB;EAAnB,iLAAmB;EAAnB,wDAAmB;EAAnB;AAAmB;AAAnB;EAAA,wBAAmB;EAAnB,wDAAmB;EAAnB;AAAmB;;AAEnB;EACE,uBAAuB;AACzB;;AAEA,iCAAiC;AACjC;EACE,aAAa;AACf;;AAEA;EACE,wBAAwB;EACxB,gBAAgB;EAChB,qBAAqB;EACrB,YAAY;AACd;;AAEA;EACE;IACE,sBAAsB;EACxB;AACF;;AAEA,kEAAkE;AAEhE;EAAA,kBAAiB;EAAjB;AAAiB;;AAIjB;EAAA,kBAAmB;EAAnB;AAAmB;;AAInB;EAAA,kBAAc;EAAd;AAAc;;AAId;EAAA,kBAAiB;EAAjB;AAAiB;;AAIjB;EAAA,kBAAiB;EAAjB;AAAiB;;AAGnB,4DAA4D;AAE1D;EAAA,oBAAmB;EAAnB;AAAmB;;AAInB;EAAA,oBAAqB;EAArB;AAAqB;;AAIrB;EAAA,oBAAgB;EAAhB;AAAgB;;AAIhB;EAAA,oBAAkB;EAAlB;AAAkB;;AAIlB;EAAA,oBAAmB;EAAnB;AAAmB;;AAInB;EAAA,oBAAmB;EAAnB;AAAmB;;AAInB;EAAA,sBAAqB;EAArB;AAAqB;;AAGvB,oCAAoC;AACpC;EACE,qBAAqB;EACrB,gBAAgB;EAChB,qBAAqB;EACrB,gBAAgB;AAClB;;AAEA,kDAAkD;AAClD;EACE,UAAU;AACZ;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,sBAAsB;EACtB,mBAAmB;AACrB;;AAhGA;;EAAA;IAAA,YAgGC;IAhGD,gBAgGC;IAhGD,qBAgGC;IAhGD,sBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,YAgGC;IAhGD,gBAgGC;IAhGD,kBAgGC;IAhGD,mBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,YAgGC;IAhGD,WAgGC;IAhGD;EAgGC;;EAhGD;IAAA,YAgGC;IAhGD,WAgGC;IAhGD;EAgGC;;EAhGD;IAAA,YAgGC;IAhGD,WAgGC;IAhGD,qBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,YAgGC;IAhGD,WAgGC;IAhGD,qBAgGC;IAhGD;EAgGC;AAAA;;AAhGD;EAAA,0BAgGC;EAhGD;AAgGC;;AAhGD;EAAA,0BAgGC;EAhGD;AAgGC;;AAhGD;EAAA,0BAgGC;EAhGD;AAgGC;;AAhGD;EAAA,0BAgGC;EAhGD;AAgGC;;AAhGD;EAAA,0BAgGC;EAhGD;AAgGC;;AAhGD;EAAA,0BAgGC;EAhGD;AAgGC;;AAhGD;EAAA,0BAgGC;EAhGD;AAgGC;;AAhGD;EAAA,0BAgGC;EAhGD,sBAgGC;EAhGD;AAgGC;;AAhGD;EAAA,0BAgGC;EAhGD,kBAgGC;EAhGD;AAgGC;;AAhGD;EAAA,0BAgGC;EAhGD,wBAgGC;EAhGD,wDAgGC;EAhGD;AAgGC;;AAhGD;EAAA,gBAgGC;EAhGD;AAgGC;;AAhGD;EAAA;AAgGC;;AAhGD;EAAA,kBAgGC;EAhGD;AAgGC;;AAhGD;EAAA;AAgGC;;AAhGD;EAAA;AAgGC;;AAhGD;EAAA,sBAgGC;EAhGD;AAgGC;;AAhGD;EAAA,sBAgGC;EAhGD;AAgGC;;AAhGD;EAAA;AAgGC;;AAhGD;EAAA,kBAgGC;EAhGD;AAgGC;;AAhGD;EAAA;AAgGC;;AAhGD;EAAA,oBAgGC;EAhGD;AAgGC;;AAhGD;EAAA,oBAgGC;EAhGD;AAgGC;;AAhGD;EAAA,oBAgGC;EAhGD;AAgGC;;AAhGD;EAAA;AAgGC;;AAhGD;EAAA;AAgGC;;AAhGD;EAAA,+EAgGC;EAhGD,mGAgGC;EAhGD;AAgGC;;AAhGD;EAAA,kBAgGC;EAhGD;AAgGC;;AAhGD;EAAA,8BAgGC;EAhGD;AAgGC;;AAhGD;EAAA,oBAgGC;EAhGD;AAgGC;;AAhGD;EAAA,sBAgGC;EAhGD;AAgGC;;AAhGD;EAAA,kBAgGC;EAhGD;AAgGC;;AAhGD;EAAA,0BAgGC;EAhGD,sBAgGC;EAhGD;AAgGC;;AAhGD;EAAA,0BAgGC;EAhGD,sBAgGC;EAhGD;AAgGC;;AAhGD;EAAA,8BAgGC;EAhGD;AAgGC;;AAhGD;EAAA,2GAgGC;EAhGD,yGAgGC;EAhGD;AAgGC;;AAhGD;EAAA,oBAgGC;EAhGD;AAgGC;;AAhGD;;EAAA;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,gBAgGC;IAhGD;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,gBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,oBAgGC;IAhGD;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,iBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,mBAgGC;IAhGD;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,eAgGC;IAhGD;EAgGC;;EAhGD;IAAA,mBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,mBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,kBAgGC;IAhGD;EAgGC;AAAA;;AAhGD;;EAAA;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,gBAgGC;IAhGD;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,mBAgGC;IAhGD;EAgGC;AAAA;;AAhGD;;EAAA;IAAA;EAgGC;AAAA;;AAhGD;;EAAA;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,kBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,iBAgGC;IAhGD;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;AAAA;;AAhGD;EAAA,0BAgGC;EAhGD,uBAgGC;EAhGD;AAgGC;;AAhGD;;EAAA;IAAA,sBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,kBAgGC;IAhGD;EAgGC;AAAA","sourcesContent":["@tailwind base;\r\n@tailwind components;\r\n@tailwind utilities;\r\n\r\nbody {\r\n background-color: white;\r\n}\r\n\r\n/* Custom CSS to hide scrollbar */\r\n.hide-scrollbar::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.hide-scrollbar {\r\n -ms-overflow-style: none;\r\n /* IE and Edge */\r\n scrollbar-width: none;\r\n /* Firefox */\r\n}\r\n\r\n@media screen and (max-width: 766px) {\r\n .bBofGr {\r\n width: 14px !important;\r\n }\r\n}\r\n\r\n/* below css class replace bootstrap background color with daisy */\r\n.op-bg-primary {\r\n @apply bg-primary;\r\n}\r\n\r\n.op-bg-secondary {\r\n @apply bg-secondary;\r\n}\r\n\r\n.op-bg-info {\r\n @apply bg-info;\r\n}\r\n\r\n.op-bg-success {\r\n @apply bg-success;\r\n}\r\n\r\n.op-bg-warning {\r\n @apply bg-warning;\r\n}\r\n\r\n/* below css class replace bootstrap text color with daisy */\r\n.op-text-primary {\r\n @apply text-primary;\r\n}\r\n\r\n.op-text-secondary {\r\n @apply text-secondary;\r\n}\r\n\r\n.op-text-info {\r\n @apply text-info;\r\n}\r\n\r\n.op-text-accent {\r\n @apply text-accent;\r\n}\r\n\r\n.op-text-success {\r\n @apply text-success;\r\n}\r\n\r\n.op-text-warning {\r\n @apply text-warning;\r\n}\r\n\r\n.op-border-primary {\r\n @apply border-primary;\r\n}\r\n\r\n/* CSS for scrollbar customization */\r\n* {\r\n scrollbar-width: thin;\r\n /* For Firefox */\r\n scrollbar-color: gray;\r\n /* For Firefox */\r\n}\r\n\r\n/* For webkit-based browsers like Chrome, Safari */\r\n*::-webkit-scrollbar {\r\n width: 5px;\r\n}\r\n\r\n*::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n}\r\n\r\n*::-webkit-scrollbar-thumb {\r\n background-color: gray;\r\n border-radius: 10px;\r\n}"],"sourceRoot":""}]); +}`, "",{"version":3,"sources":["webpack://./src/index.css"],"names":[],"mappings":"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;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,yBAAmB;UAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,4BAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,sBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,qBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA,gBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,iBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,eAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,mBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA,kBAAmB;EAAnB;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB;EAAnB;AAAmB;AAAnB;EAAA,oBAAmB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GC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,gBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,oBAgGC;IAhGD;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,iBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,mBAgGC;IAhGD;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,eAgGC;IAhGD;EAgGC;;EAhGD;IAAA,mBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,mBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,kBAgGC;IAhGD;EAgGC;AAAA;;AAhGD;;EAAA;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,gBAgGC;IAhGD;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,mBAgGC;IAhGD;EAgGC;AAAA;;AAhGD;;EAAA;IAAA;EAgGC;AAAA;;AAhGD;;EAAA;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA,kBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,iBAgGC;IAhGD;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;;EAhGD;IAAA;EAgGC;AAAA;;AAhGD;EAAA,0BAgGC;EAhGD,uBAgGC;EAhGD;AAgGC;;AAhGD;;EAAA;IAAA,sBAgGC;IAhGD;EAgGC;;EAhGD;IAAA,kBAgGC;IAhGD;EAgGC;AAAA","sourcesContent":["@tailwind base;\r\n@tailwind components;\r\n@tailwind utilities;\r\n\r\nbody {\r\n background-color: white;\r\n}\r\n\r\n/* Custom CSS to hide scrollbar */\r\n.hide-scrollbar::-webkit-scrollbar {\r\n display: none;\r\n}\r\n\r\n.hide-scrollbar {\r\n -ms-overflow-style: none;\r\n /* IE and Edge */\r\n scrollbar-width: none;\r\n /* Firefox */\r\n}\r\n\r\n@media screen and (max-width: 766px) {\r\n .bBofGr {\r\n width: 14px !important;\r\n }\r\n}\r\n\r\n/* below css class replace bootstrap background color with daisy */\r\n.op-bg-primary {\r\n @apply bg-primary;\r\n}\r\n\r\n.op-bg-secondary {\r\n @apply bg-secondary;\r\n}\r\n\r\n.op-bg-info {\r\n @apply bg-info;\r\n}\r\n\r\n.op-bg-success {\r\n @apply bg-success;\r\n}\r\n\r\n.op-bg-warning {\r\n @apply bg-warning;\r\n}\r\n\r\n/* below css class replace bootstrap text color with daisy */\r\n.op-text-primary {\r\n @apply text-primary;\r\n}\r\n\r\n.op-text-secondary {\r\n @apply text-secondary;\r\n}\r\n\r\n.op-text-info {\r\n @apply text-info;\r\n}\r\n\r\n.op-text-accent {\r\n @apply text-accent;\r\n}\r\n\r\n.op-text-success {\r\n @apply text-success;\r\n}\r\n\r\n.op-text-warning {\r\n @apply text-warning;\r\n}\r\n\r\n.op-border-primary {\r\n @apply border-primary;\r\n}\r\n\r\n/* CSS for scrollbar customization */\r\n* {\r\n scrollbar-width: thin;\r\n /* For Firefox */\r\n scrollbar-color: gray;\r\n /* For Firefox */\r\n}\r\n\r\n/* For webkit-based browsers like Chrome, Safari */\r\n*::-webkit-scrollbar {\r\n width: 5px;\r\n}\r\n\r\n*::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n}\r\n\r\n*::-webkit-scrollbar-thumb {\r\n background-color: gray;\r\n border-radius: 10px;\r\n}"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -253406,7 +253337,7 @@ module.exports = "eJztWsuy48iN/Ret74KZfHtX47meqfGjPHaXx4/wgpJ4JbooUU1JVXXb0f9u4J /***/ ((module) => { "use strict"; -module.exports = /*#__PURE__*/JSON.parse('{"headernews":"New feature: Public profiles are now live! Easily create and share public templates","headernewsbtn":"Setup Now","create-account":"Create Account","login":"Login","language":"Language","name":"Name","phone":"Phone","phone-optional":"optional","email":"Email","company":"Company","job-title":"Job title","profile":"Profile","log-out":"Log Out","is-email-verified":"Is Email verified","public-profile":"Public profile","tagline":"Tagline ","has-requested-you-to-sign":"has requested you to sign","has-requested-you-to-review-and-sign":" has requested you to review and sign","input-required":"Please fill out this field.","sort-order":{"Ascending":"Ascending","Descending":"Descending","Name":"Name","Date":"Date"},"context-menu":{"Download":"Download","Rename":"Rename","Move":"Move","Delete":"Delete"},"action":"Action","add":"Add","add-new-folder":"Add a new folder","disable-documentId":"Disable DocumentId","edit":"Edit","change-password":"Change Password","save":"Save","cancel":"Cancel","upgrade-now":"Upgrade now","upgrade-to":"Upgrade to","plan":"Plan","subscribe-card-teamplan":"Unlock the full power of collaboration! Create unlimited organizations, teams, and hierarchies. Share templates seamlessly across teams and assign custom user roles. Elevate your workflow today!","subscribe-card-plan":"Unlock premium features starting at just {{premiumPrice}}/month. Enjoy enhanced performance and only {{addonPrice}} per additional credit after your included premium credits.","user-name-limit-char":"To have a username less than 8 character please subscribe","tour-content":"Don\'t show this again","pro":"PRO","team":"TEAM","user":"User","docs":"Docs","session-expired":"Your session has expired.","public-profile-help":"This is your public URL. Copy or share it with the signer, and you will be able to see all your publicly set templates.","tagline-help":"This Tagline will appear on your OpenSign public profile for ex. https://opensign.me/alex","welcome":"Welcome Back!","Login-to-your-account":"Login to your account","password":"Password","forgot-password":"Forgot Password?","loading":"Loading...","of":"of","sign-SSO":"Sign in with SSO","login-page":"Login Page","or":"OR","signup-page":"Signup page","password-length":"Password should be 8 characters long","password-case":"Password should contain uppercase letter, lowercase letter, digit","password-special-char":" Password should contain special character","agreee":"I agree to the","term":"Terms of Service","subscribe-to-opensign":"Subscribe to OpenSign newsletter","register":"Register","sidebar":{"Dashboard":"Dashboard","Sign yourself":"Sign yourself","Request signatures":"Request signatures","Templates":"Templates","Templates-Children":{"Create template":"Create template","Manage templates":"Manage templates"},"OpenSign™ Drive":"OpenSign™ Drive","Reports":"Reports","Reports-Children":{"Need your sign":"Need your sign","In Progress":"In Progress","Completed":"Completed","Drafts":"Drafts","Declined":"Declined","Expired":"Expired","Contactbook":"Contactbook"},"Settings":"Settings","Settings-Children":{"My Signature":"My Signature","API Token":"API Token","Webhook":"Webhook","Teams":"Teams","Team-update-successfully":"Team Updated successfully.","Users":"Users"}},"dashboard-card":{"Need your Signature":"Need your Signature","Out for signatures":"Out for Signatures"},"report-name":{"Draft Documents":"Draft Documents","Need your sign":"Need your sign","In-progress documents":"In-progress documents","Completed Documents":"Completed Documents","Declined Documents":"Declined Documents","Expired Documents":"Expired Documents","Recently sent for signatures":"Recently sent for signatures","Recent signature requests":"Recent signature requests","Drafts":"Drafts","Contactbook":"Contactbook","Templates":"Templates","Teams":"Teams","Users":"Users"},"btnLabel":{"sign":"sign","Sign":"SIGN","Resend":"Resend","Revoke":"Revoke","Delete":"Delete","Use":"Use","Quick send":"Quick send","Edit":"Edit","Share with team":"Share with team","Share":"Share","View":"View","option":"Option","Embed":"Embed"},"report-heading":{"Sr.No":"Sr.No","Title":"Title","Email":"Email","Phone":"Phone","File":"File","Owner":"Owner","Signers":"Signers","Note":"Note","Folder":"Folder","Reason":"Reason","Parent Team":"Parent Team","Active":"Active","Role":"Role","Team":"Team","Name":"Name","Status":"Status","created-date":"Created Date","Type":"Type"},"report-help":{"Draft Documents":"These are documents you have started but have not finalized for sending.","Need your sign":"This is a list of documents that are waiting for your signature","In-progress documents":"This is a list of documents you\'ve sent to other parties for signature.","Completed Documents":"This is a list of documents that have been signed by all parties.","Declined Documents":"This is a list of documents that have been declined by one of the signers.","Expired Documents":"This is a list of documents that have reached their expiration date.","Contactbook":"This is a list of contacts/signers added by you. These will appear as suggestions when you try to add signers to a new document.","Templates":"This is a list of templates that are available to you for creating documents. You can click the \'use\' button to create a new document using a template, modify the document & add signers in the next step."},"form-name":{"Sign Yourself":"Sign Yourself","Request Signatures":"Request Signatures","New Template":"New Template"},"file-type":"pdf, png, jpg, jpeg","docx":"docx","file-selected":"file selected","template-title":"Template Title","document-title":"Document Title","description":"Description","time-to-complete":"Time To Complete (Days)","send-in-order":"Send In Order","send-in-order-help":{"p1":"Choose how you want the signing requests to be sent to the document signers:","p2":"Selecting this option will send the signing request to the first signer initially. Once the first signer completes their part, the next signer in the sequence will receive the request. This process continues until all signers have signed the document. This method ensures that the document is signed in a specific order.","p3":"Selecting this option will send the signing links to all signers simultaneously. Every signer can sign the document at their convenience, regardless of whether other signers have completed their signatures. This method is faster but does not enforce any signing order among the participants.","p4":"Select the option that best suits the needs of your document processing."},"no":"No","auto-reminder":"Auto reminder","remind-once":" Remind once in every (Days)","next":"Next","select-folder":"Select Folder","OpenSign-drive":"OpenSign™ Drive","drive-document-status":{"Completed":"Completed","Declined":"Declined","Draft":"Draft","Expired":"Expired","In Progress":"In Progress"},"select-folder-help":"If you do not select a folder, your signed document will be saved in the Main OpenSign drive folder.","no-data":"No data found","save-here":"Save Here","back":"Back","add-folder":"Add folder","create-folder":"Create Folder","parent-folder":"Parent Folder","create":"Create","signers":"Signers","signers-help":"Begin typing a contact\'s name to see suggested signers from your saved contacts or add new ones. Arrange the signing order by adding signers in the desired sequence. Use the \'+\' button to include signers and the \'x\' to remove them. Each signer will receive an email prompt to sign the document in the order listed.","add-signer":"Add Signer","contact-not-found":"Contact not found","add-yourself":"Add Yourself","submit":"Submit","reset":"Reset","my-signature":"My Signature","signature":"Signature","upload-image":" Upload image","clear":"Clear","upload-signature/Image":"Please upload signature/Image","initials":"Initials","API":"API","api-token":"API Token","regenerate-token":"Regenerate Live Token","generate-token":"Generate Live Token","view-docs":"View Docs","generate-token-alert":"Are you sure you want to regenerate token it will expire old token?","yes":"Yes","copied":"Copied","something-went-wrong-mssg":"Something went wrong, please try again later.","token-generated":"Token generated successfully.","webhook":"Webhook","update-webhook":"Update Webhook","add-webhook":"Add Webhook","webhook-added":"Webhook added successfully.","team-disabled":"Team disabled","Team enabled":"Team enabled","are-you-sure":"Are you sure you want to","disable":"disable","enable":"enable","this-team":" this team?","edit-team":"Edit Team","name-of-team":"Name of Team","prev":"Prev","no-data-avaliable":"No Data Available","add-team":"Add Team","page-not-found":"Page Not Found","users-from-teams":"users from Teams","user-status":"User status","activate":"activate","deactivate":"deactivate","this-user":" this user","delete-user":"Delete User","delete":"delete","add-user":"Add User","password-generateed":"Password will only be generated once; make sure to copy it.","Team status":"Team status","user-deactivated":"User deactivated.","user-activated":"User activated.","public":"Public","download":"Download","view":"View","make-template-public":"Make template public","make-template-private":"Make template private","make-template-public-alert":"Are you sure you want to make this template public?","make-template-private-alert":"Are you sure you want to make this template private? This will remove it from your public profile.","public-role":"Public role","public-url":"Public URL","public-url-copy-mssg":" Here’s your public URL: Copy it or share it with the signer, and you will be able to see all your publicly set templates.","add-public-url-alert":"Please add your public URL, and you will be able to make a public template.","share-with-alert":"You cannot share a template if any roles already have contacts assigned. Please remove all contact assignments from the roles before sharing the template.","share-with":"Share with","team-not-found":"Team not found","roles":"Roles","delete-document":"Delete Document","delete-document-alert":"Are you sure you want to delete this document?","quick-send":"Quick send","add-new":"Add new","send":"Send","quick-send-alert-1":"All roles in this document are currently linked to contacts. To quick send copies of this template to multiple signers, please ensure that at least one role is not linked to any contact.","quick-send-alert-2":"Please ensure there\'s at least one signature widget added for all recipients.","quick-send-alert-3":"Please add at least one role to this template in order to \'quick send\' copies of it to multiple signers.","quick-send-alert-4":"Quick send reached limit.","copy-link":"Copy link","copy":"Copy","revoke-document":"Revoke document","revoke-document-alert":"Are you sure you want to revoke this document?","resend-mail":"Resend Mail","resend-mail-help":"You can use following variables which will get replaced with their actual values:- {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email}}, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.","subject":"Subject","body":"Body","add-contact":"Add Contact","add-signer-alert":"Contact already exist!","record-delete-alert":"Record deleted successfully!","record-revoke-alert":"Record revoked successfully!","mail-sent-alert":"Mail sent successfully.","document-sent-alert":"Document sent successfully!","template-share-alert":"Template Shared successfully.","template-public-alert-1":"You have successfully made the template public.","template-public-alert-2":"You have successfully made the template private.","template-public-alert-3":"You need to select a role for the public signers.","template-public-alert-4":"Please ensure there\'s at least one signature widget added for all signers.","template-public-alert-5":"Since this template has send-in-order enabled, the public role must be positioned at the top.","template-public-alert-6":"Please attach signers to all roles except for the public role user.","template-public-alert-7":"Please assign at least one public role to make this template public.","loader":" This might take some time","pages":"Pages","document-signed":"Document signed","close":"Close","validation-alert":"Validation alert","validate-alert-mssg":" The input does not meet the criteria set by the regular expression.","otp-verification":"OTP verification","enter-otp":"Enter OTP","verify":"Verify","verify-email-1":"Verify email","resend":"Resend","contact-details":"Contact Details","verify-email":"Please verify your email !","send-otp":" Send OTP","otp-placeholder":"Enter verification code received over email","loading-doc":"Loading Document..","widgets-name":{"signature":"signature","stamp":"stamp","initials":"initials","name":"name","job title":"job title","company":"company","date":"date","text":"text","text input":"text input","checkbox":"checkbox","dropdown":"dropdown","radio button":"radio button","image":"image","email":"email"},"fields":"Fields","recipients":"Recipients","please-add":"Please add a","signed-by":"Signed By","more":"more","sent":"sent","print":"Print","certificate":"Certificate","decline":"Decline","finish":"Finish","mail":"Mail","sign-now":"Sign Now","successfully-signed":"Successfully signed!","email-mssg":" Recipients added here will get a copy of the signed document.","email-error-1":" please provide correct email address","email-error-2":"You can only send to ten recipients at a time.","Email-verified-alert-1":"Email is verified.","Email-verified-alert-2":"Email is already verified.","upload-stamp-image":"Upload stamp image","draw":"Draw","type":"Type","color-type":{"red":"red","blue":"blue","black":"black","yellow":"yellow"},"my-initials":"My Initials","upload":"Upload","initial-teb":"Initials","signature-tab":"Signature","your-signature":"Your signature","copy-title":"Copy widget to","contact-delete-alert":"Are you sure you want to delete this contact?","reset-password-alert-1":"Reset password link has been sent to your email id","reset-password-alert-2":"Please setup email adapter ","reset-password-alert-3":"Reset Your Password","faild-animation":"Failed to load animation","apply":"Apply","copy-type":{"All pages":"All pages","All pages but last":"All pages but last","All pages but first":"All pages but first","Next to current widget":"Next to current widget"},"options":"Options","minimun-check":"Minimun check","maximum-check":"Maximum check","default-value":"Default value","select":"Select","read-only":"Is read only","hide-labels":"Hide labels","checkbox":"Checkbox","alert":"Alert","zoom-in":"Zoom in","zoom-out":"Zoom out","document-signed-alert":"Congratulations! 🎉 This document has been successfully signed by you!","otp-sent-alert":"OTP sent on your email","fields-required":"Fields required","signature-widget-alert-1":"Please ensure there\'s at least one signature widget added","signature-widget-alert-2":"Please ensure all field is accurately filled and meets all requirements.","encrypted-pdf-alert":"Currently encrypted pdf files are not supported.","encrypted-pdf-alert-1":"PFX file password is invalid.","user-not-exist":"User does not exist","template-signature-field":"Please add at least one signature field for all roles.","template-role-alert":"Please add roles first","create-document":"Create Document","template-created-alert":"Do you want to create a document using the template you just created ?","signers-alert":"signers alert","template-creation-alert-1":"Please select signer for add placeholder!","ok":"Ok","radio-group":"Radio group","dropdown-options":"Dropdown options","add-role":"Add Role","role-ex":" e.g: Customer, Hr, Director, Manager, Student, etc","add/choose-signer":"Add/Choose Signer","choose-from-contacts":"Choose from contacts","select-signer":" Please select signer","edit-template":"Edit Template","widget-info":"Widget info","validation":"Validation","invalid-default-value":"invalid default value","hint":"Hint","color":"color","role-help":{"p1":"What are template roles?","p2":"Begin by specifying each role needed for the completion of the document. Think about the parties involved in the signing process and what their responsibilities are. Common roles include HR for internal documents, Customer for agreements or Vendor for business agreements.","p3":"Why pre-attach users to some roles?","p4":"For roles that consistently involve the same individual (e.g., the CEO\'s signature on employee offer letters), you can pre-attach a user to a role within the template. This step is optional but recommended for efficiency and consistency across documents.","p5":"When do i specify the user attached to each role?","p6":"When you create a document from your template, you\'ll be prompted to attach users to each defined role. If a role already has a user attached, this will be pre-filled, but you can modify it as needed before sending out the document."},"add-recipients":"Add recipients","loading-mssg":"This might take some time","send-mail":"Send Mail","placeholder-alert-1":"Please ensure there\'s at least one signature widget added for all recipients.","placeholder-alert-2":"Please confirm that you have filled the text field.","placeholder-alert-3":" Are you sure you want to send out this document for signatures?","placeholder-alert-4":"You have successfully sent mails to all recipients!","placeholder-alert-5":"Do you want to sign documents right now ?","placeholder-alert-6":"Please setup mail adapter to send mail!","placeholder-alert-7":"Please select signer for add placeholder!","email-subject":"email subject","email-body":"email body","email-placeholder":"add body of email","reset-to-default":"Reset to default","cutomize-email":"Cutomize Email","upgrade-to-customize-email":"Upgrade to customize Email","sign-url":"Sign url","Mails Sent":"Mails Sent","document-alert":"Document Alert","owner-subscription-expired":"Owner\'s subscription has expired.","subscription-expired":"Subscription Expired","alert-message":"Alert message","document-decline":"Document decline","decline-alert-1":"Are you sure want to decline this document ?","decline-alert-2":"You have declined this document!","decline-alert-3":"You can not sign this document as it has been declined/revoked.","sign here":"Sign here","guest-email-alert":"verification code is sent to your email","get-otp-alert":"you will get a verification code via Email","user-already-exist":"User already exist.","server-error":"Internal server error !","fill-required-details!":"Please fill required details!","sign-up-form":"Sign up form","sign-up":"Sign up","folder-already-exist!":"folder already exist!","please-select-position!":"please select position!","default-sign-alert":"Are you sure you want to auto sign at requested all locations?","Your-Signature":"Your Signature","auto-sign-all":"Auto Sign All","generating-certificate":"Generating certificate","pdf-download":"PDF Download","generate-certificate-alert":" Your completion certificate is being generated. Please wait momentarily. If the download doesn\'t start shortly, click the button again.","folder-already-exist":"Folder already exist!","folder-created-successfully":"Folder created successfully!","fill-folder-name":"Please fill folder name","already-exists-this-username":"User already exists with this username!","verification-code-sent":"Verification mail has been sent to your E-mail!","registered-user-successfully":"Registered user successfully.","role-not-found":"Role not found.","do-not-access":"You don\'t have access, please contact the admin.","add-admin":"Add admin","opensign-setup":"OpenSign Setup","join-discord":"Join our discord server","admin-already-exist":"Admin already exist.","password-update-alert-1":"Password updated successfully.","password-update-alert-2":"Your current password is missing or incorrect.","password-update-alert-3":"Your current password is missing or incorrect.","password-update-alert-4":"Your password and confirmation password do not match.","current-password":"Current Password","new-password":"New Password","confirm-password":"Confirm Password","file-alert-1":"The selected file size is too large. Please select a file less than","file-alert-2":"Please select file.","file-alert-3":"Please wait while the document is being uploaded.","enter-pdf-password":"Enter Pdf Password","correct-password":"Please provide correct password","decrypting-pdf":" Decrypting pdf please wait...","invalid-otp":"Invalid Otp","user-not-found":"User not found!","enter-otp-alert":"Please Enter OTP!","get-verification-code":"Get verification code","get-verification-code-2":"You will get a verification code via Email","enter-verification-code":"Enter Verification Code","provide-your-details":"Provide your details","provide-email":"Please provide email.","additional-info":"Additional Info","signature-saved-alert":"Signature saved successfully.","fill-field":"Please fill out this field","error-template":"Error: Template not found!","error":"Error","invalid-document":"Error: invalid document!","document-not-found":"Document not Found!","document-signed-alert-1":"You have successfully signed the document. You can download or print a copy of the partially signed document. A copy of the digitally signed document will be sent to the owner over email once it is signed by all signers.","encrypted-pdf-not-support":"Currently encrypted pdf files are not supported.","document-signed-alert-4":" Congratulations! 🎉 This document has been successfully signed by all participants!","document-signed-alert-5":"This document has been signed by all Signers.","document-signed-alert-6":"This document has been declined by one or more recipient(s).","document-signed-alert-7":"This Document is no longer available.","document-signed-alert-8":"The document has already been dispatched for signing.","yet-to-sign":"Yet to sign","validation-alert-1":"The input does not meet the criteria set by the regular expression.","account-already-exists":"Account already exists!","choose-password":"Choose Password","enter-password":"Enter Password","sure":"sure","subscribed-alert":"You have already subscribed to plan!","monthly":"Monthly","yearly-upto":"Yearly (upto 66% off)","billed-yearly":"Billed Yearly","billed-monthly":"Billed Monthly","plansubscription-1":"Host it yourself for free","visit-github":"Visit Github","user-already-exist-name":"User already exists with this username!","do-not-access-contact-admin":"You don\'t have access, please contact the admin.","filed-required-correctly":"Please fill required details correctly.","admin-created":"Admin created","invalid-masterkey":"Invalid masterkey","opensign-Setup":"OpenSign Setup","master-key":" Master key","profile-update-alert":"Profile updated successfully.","date":"Date","report-not-found":"Report Not Found","please-wait":"please wait","select-foler":"Select Folder","generated-on":"Generated On","text-field":"Text field","font-size":"Font size","widget-status":{"Required":"Required","Optional":"Optional"},"all-right":"All Rights Reserved","version":"version","social-media":{"github":"Github","linked-in":"LinkedIn","twitter":"Twitter","discord":"Discord"},"tour-mssg":{"home-layout-1":"You have logged in successfully! Let\'s take a look.","home-layout-2":"To upload documents for self-signing or to request others’ signatures, simply select the respective buttons.","home-layout-3":"You are ready to start using OpenSign! If you need support feel free to contact us.","generate-token":"Upgrade now to generate production API token.","opensign-drive-1":"Click on the breadcrumb links to easily navigate through the folder hierarchy and view the documents within each folder.","opensign-drive-2":"Click the add button to create a new folder or document.","opensign-drive-3":"Sort your documents by Date or Name using this menu.","opensign-drive-4":"Click on this menu to display the documents in list view.","opensign-drive-5":"The document list is displayed according to the selected sorting option. Icons next to each document indicate its current status.","opensign-drive-6":"Right-click on a document to see options such as Download, Rename, Move, and Delete. Click on the document to open it.","opensign-drive-7":"Right-click on any folder to see options. Choose ‘Rename’ to change the folder’s name or click on the folder to navigate through its contents.","pdf-request-file-1":"List of signers who still need to sign the document .","pdf-request-file-2":"Click any of the placeholders appearing on the document to sign. You will then see options to draw your signature, type it, or upload an image .","pdf-request-file-3":"Click the Back, Decline, or Finish buttons to navigate your document. Use the ellipsis menu for additional options, including the Download button .","pdf-request-file-4":"List of signers who have already signed the document .","pdf-request-file-5":"You can click \'Auto Sign All\' to automatically sign at all the locations meant to be signed by you. Make sure that you review the document properly before you click this button .","placeholder-sign-1":"Select a recipient from this list to add a place-holder where he is supposed to sign.The placeholder will appear in the same colour as the recipient name once you drop it on the document.","placeholder-sign-2":"Clicking \'Add recipients\' button will allow you to add more signers.","placeholder-sign-3":"Drag or click on a field to add it to the document.","placeholder-sign-4":"The PDF content area already displays the template\'s existing placeholders. For your convenience, these placeholders will match the color of the recipient\'s name, making them easily identifiable.","placeholder-sign-5":"Clicking \'Send\' will save the document. In the next step you can customize the emails to be sent out to the recipients or copy the signing links and share those with the recipients yourself.","report-1":"Click the \'Add\' button to create a new template. Templates are reusable documents designed to quickly generate new documents with the same structure and varying signers. For example, an HR template for onboarding could have predefined roles like ‘HR Manager’ and ‘New Employee’. Each time you use the template, you can assign the ‘New Employee’ role to different incoming staff members, while the ‘HR Manager’ role remains constant, facilitating a seamless onboarding process for each recruit. ","redirect":"Click the \'Use\' button to create a new document from an existing template.","bulksend":"To quickly create and send multiple documents using an existing template, click the \'Quick Send\' button.","option":"This menu reveals more options such as Edit & Delete. Use the \'Edit\' button to add signer roles, modify fields, and update your template. Changes will apply to all future documents created from this template but won’t affect existing documents.Use the Delete button you can delete template. ","signyour-self-1":"Select and drag your preferred widgets onto the PDF to customize your document before signing. Choose the perfect spots for each modification to tailor the document to your needs.","signyour-self-2":"Drag and drop anywhere in this area. You can resize and move it later.","template-placeholder-1":"Clicking \'Add role\' button will allow you to add various signer roles. You can attach users to each role in subsequent steps.","template-placeholder-2":"Once roles are added, select a role from list to add a place-holder where he is supposed to sign. The placeholder will appear in the same colour as the role name once you drop it on the document.","template-placeholder-3":"Drag or click on a field to add it to the document.","template-placeholder-4":"Drag the placeholder for a role anywhere on the document.Remember, it will appear in the same colour as the name of the recipient for easy reference.","template-placeholder-5":"Clicking \'Next\' will store the current template. After saving, you’ll be prompted to create a new document from this template if you wish.","webhook-1":"Upgrade now to set webhook","Need your Signature":"Clicking on this card will take you to the list of documents awaiting your review.","Out for signatures":"Clicking on this card will take you to a list of documents awaiting signature.","Recent signature requests":"This is a list of documents that are waiting for your signature.","Recently sent for signatures":"This is a list of documents you\'ve sent to other parties for signature.","Drafts":"This are documents you have started but have not finalized for sending.","public-template":"This video demonstrates how to set up your personalized public profile, such as ‘https://opensign.me/your-username’. You’ll also learn how to customize your tagline and make your templates available for public signing."},"enter-email-plaholder":"Add an email address and hit enter","success-email-alert":"Email sent successfully!","expired-doc-title":"Expired Document","expired-on-mssg":"This document expired on {{expiredDate}} and is no longer available to sign.","signature-validate-alert":"Please confirm that you have selected at least {{minRequiredCount}} checkboxes.","signature-validate-alert-2":"Ensure this field is accurately filled and meets all requirements.","remaing-users":"Remaining users","Role":"Role","additional-users":"Please purchase add-on users.","Quantity-of-users":"Quantity of users","Price":"Price","Total-price-for-next-time":"Total price for next time","Proceed":"Proceed","Select":"Select","Add-seats":"Add Seats","user-name-exist":"user name already exist","format":"format","select-date-format":"Select a date format","quantityofcredits":"Quantity of premium credits","remainingcredits":"Premium credits available:","remainingcreditshelp":"Use premium credits for API document signing, bulk sending, or embedding OpenSign integration on your website. You have {{allowedcredits}} included credits and {{addoncredits}} additional purchased credits remaining.","additional-credits":"Please purchase premium credits","quotaerrquicksend":"Quota Reached, You don\'t have enough credits.","buycredits":"Buy Premium Credits","rotate-right":"Rotate right","rotate-left":"Rotate left","rotate-alert-mssg":"All widgets on this page will be lost. Are you sure you want to proceed?","templateid":"Template-Id","bulksendsubcriptionalert":"Please upgrade to Professional or Team plan to use bulk send.","generate-test-token":"Generate Test Token","regenerate-test-token":"Regenerate Test Token","help-test-token":"This token can be used to test the APIs at the https://sandbox.opensignlabs.com/api/v1 endpoint, allowing you to conduct unlimited document signatures. Please note that the sandbox API will sign your documents with self-signed certificates, which may not be recognized as valid by Adobe. Once you’ve completed your testing, you can upgrade to one of our paid plans to generate a production token.","help-api-token":"This token can be used to access the production APIs at the {{origin}}/api/v1 endpoint. It can only be generated on one of our paid plans.","Add-Webhook":"Add Webhook","quotamailinfohead":"Monthly request signatures email limit","quotamailinfo":"You can send upto 15 signature request emails every month. Upgrade now to send unlimited signing requests directly.","quotamail":"You\'ve reached your limit of 15 signature request emails for this month. Upgrade now to continue sending emails directly.","quotamailTip":"Tip: You can still sign <1>unlimited documents by manually sharing the signing request links.","quotamailhead":"Quota Reached","unauthorized-modal":"You don\'t have permission to perform this action, please contact {{adminName}}<{{adminEmail}}>."}'); +module.exports = /*#__PURE__*/JSON.parse('{"header-news":"New feature: Public profiles are now live! Easily create and share public templates","header-news-btn":"Setup Now","create-account":"Create Account","login":"Login","language":"Language","name":"Name","phone":"Phone","phone-optional":"optional","email":"Email","company":"Company","job-title":"Job title","profile":"Profile","log-out":"Log Out","is-email-verified":"Is Email verified","public-profile":"Public profile","tagline":"Tagline ","has-requested-you-to-sign":"has requested you to sign","has-requested-you-to-review-and-sign":" has requested you to review and sign","input-required":"Please fill out this field.","sort-order":{"Ascending":"Ascending","Descending":"Descending","Name":"Name","Date":"Date"},"context-menu":{"Download":"Download","Rename":"Rename","Move":"Move","Delete":"Delete"},"action":"Action","add":"Add","add-new-folder":"Add a new folder","disable-documentId":"Disable DocumentId","edit":"Edit","change-password":"Change Password","save":"Save","cancel":"Cancel","upgrade-now":"Upgrade now","upgrade-to":"Upgrade to","plan":"Plan","subscribe-card-teamplan":"Unlock the full power of collaboration! Create unlimited organizations, teams, and hierarchies. Share templates seamlessly across teams and assign custom user roles. Elevate your workflow today!","subscribe-card-plan":"Unlock premium features starting at just {{premiumPrice}}/month. Enjoy enhanced performance and only {{addonPrice}} per additional credit after your included premium credits.","user-name-limit-char":"To have a username less than 8 character please subscribe","tour-content":"Don\'t show this again","pro":"PRO","team":"TEAM","user":"User","docs":"Docs","session-expired":"Your session has expired.","public-profile-help":"This is your public URL. Copy or share it with the signer, and you will be able to see all your publicly set templates.","tagline-help":"This Tagline will appear on your OpenSign public profile for ex. https://opensign.me/alex","welcome":"Welcome Back!","Login-to-your-account":"Login to your account","password":"Password","forgot-password":"Forgot Password?","loading":"Loading...","of":"of","sign-SSO":"Sign in with SSO","login-page":"Login Page","or":"OR","signup-page":"Signup page","password-length":"Password should be 8 characters long","password-case":"Password should contain uppercase letter, lowercase letter, digit","password-special-char":" Password should contain special character","agreee":"I agree to the","term":"Terms of Service","subscribe-to-opensign":"Subscribe to OpenSign newsletter","register":"Register","sidebar":{"Dashboard":"Dashboard","Sign yourself":"Sign yourself","Request signatures":"Request signatures","Templates":"Templates","Templates-Children":{"Create template":"Create template","Manage templates":"Manage templates"},"OpenSign™ Drive":"OpenSign™ Drive","Reports":"Reports","Reports-Children":{"Need your sign":"Need your sign","In Progress":"In Progress","Completed":"Completed","Drafts":"Drafts","Declined":"Declined","Expired":"Expired","Contactbook":"Contactbook"},"Settings":"Settings","Settings-Children":{"My Signature":"My Signature","API Token":"API Token","Webhook":"Webhook","Teams":"Teams","Team-update-successfully":"Team Updated successfully.","Users":"Users"}},"dashboard-card":{"Need your Signature":"Need your Signature","Out for signatures":"Out for Signatures"},"report-name":{"Draft Documents":"Draft Documents","Need your sign":"Need your sign","In-progress documents":"In-progress documents","Completed Documents":"Completed Documents","Declined Documents":"Declined Documents","Expired Documents":"Expired Documents","Recently sent for signatures":"Recently sent for signatures","Recent signature requests":"Recent signature requests","Drafts":"Drafts","Contactbook":"Contactbook","Templates":"Templates","Teams":"Teams","Users":"Users"},"btnLabel":{"sign":"sign","Sign":"SIGN","Resend":"Resend","Revoke":"Revoke","Delete":"Delete","Use":"Use","Quick send":"Quick send","Edit":"Edit","Share with team":"Share with team","Share":"Share","View":"View","option":"Option","Embed":"Embed"},"report-heading":{"Sr.No":"Sr.No","Title":"Title","Email":"Email","Phone":"Phone","File":"File","Owner":"Owner","Signers":"Signers","Note":"Note","Folder":"Folder","Reason":"Reason","Parent Team":"Parent Team","Active":"Active","Role":"Role","Team":"Team","Name":"Name","Status":"Status","created-date":"Created Date","Type":"Type"},"report-help":{"Draft Documents":"These are documents you have started but have not finalized for sending.","Need your sign":"This is a list of documents that are waiting for your signature","In-progress documents":"This is a list of documents you\'ve sent to other parties for signature.","Completed Documents":"This is a list of documents that have been signed by all parties.","Declined Documents":"This is a list of documents that have been declined by one of the signers.","Expired Documents":"This is a list of documents that have reached their expiration date.","Contactbook":"This is a list of contacts/signers added by you. These will appear as suggestions when you try to add signers to a new document.","Templates":"This is a list of templates that are available to you for creating documents. You can click the \'use\' button to create a new document using a template, modify the document & add signers in the next step."},"form-name":{"Sign Yourself":"Sign Yourself","Request Signatures":"Request Signatures","New Template":"New Template"},"file-type":"pdf, png, jpg, jpeg","docx":"docx","file-selected":"file selected","template-title":"Template Title","document-title":"Document Title","description":"Description","time-to-complete":"Time To Complete (Days)","send-in-order":"Send In Order","send-in-order-help":{"p1":"Choose how you want the signing requests to be sent to the document signers:","p2":"Selecting this option will send the signing request to the first signer initially. Once the first signer completes their part, the next signer in the sequence will receive the request. This process continues until all signers have signed the document. This method ensures that the document is signed in a specific order.","p3":"Selecting this option will send the signing links to all signers simultaneously. Every signer can sign the document at their convenience, regardless of whether other signers have completed their signatures. This method is faster but does not enforce any signing order among the participants.","p4":"Select the option that best suits the needs of your document processing."},"no":"No","auto-reminder":"Auto reminder","remind-once":" Remind once in every (Days)","next":"Next","select-folder":"Select Folder","OpenSign-drive":"OpenSign™ Drive","drive-document-status":{"Completed":"Completed","Declined":"Declined","Draft":"Draft","Expired":"Expired","In Progress":"In Progress"},"select-folder-help":"If you do not select a folder, your signed document will be saved in the Main OpenSign drive folder.","no-data":"No data found","save-here":"Save Here","back":"Back","add-folder":"Add folder","create-folder":"Create Folder","parent-folder":"Parent Folder","create":"Create","signers":"Signers","signers-help":"Begin typing a contact\'s name to see suggested signers from your saved contacts or add new ones. Arrange the signing order by adding signers in the desired sequence. Use the \'+\' button to include signers and the \'x\' to remove them. Each signer will receive an email prompt to sign the document in the order listed.","add-signer":"Add Signer","contact-not-found":"Contact not found","add-yourself":"Add Yourself","submit":"Submit","reset":"Reset","my-signature":"My Signature","signature":"Signature","upload-image":" Upload image","clear":"Clear","upload-signature/Image":"Please upload signature/Image","initials":"Initials","API":"API","api-token":"API Token","regenerate-token":"Regenerate Live Token","generate-token":"Generate Live Token","view-docs":"View Docs","generate-token-alert":"Are you sure you want to regenerate token it will expire old token?","yes":"Yes","copied":"Copied","something-went-wrong-mssg":"Something went wrong, please try again later.","token-generated":"Token generated successfully.","webhook":"Webhook","update-webhook":"Update Webhook","add-webhook":"Add Webhook","webhook-added":"Webhook added successfully.","team-disabled":"Team disabled","Team enabled":"Team enabled","are-you-sure":"Are you sure you want to","disable":"disable","enable":"enable","this-team":" this team?","edit-team":"Edit Team","name-of-team":"Name of Team","prev":"Prev","no-data-avaliable":"No Data Available","add-team":"Add Team","page-not-found":"Page Not Found","users-from-teams":"users from Teams","user-status":"User status","activate":"activate","deactivate":"deactivate","this-user":" this user","delete-user":"Delete User","delete":"delete","add-user":"Add User","password-generateed":"Password will only be generated once; make sure to copy it.","Team status":"Team status","user-deactivated":"User deactivated.","user-activated":"User activated.","public":"Public","download":"Download","view":"View","make-template-public":"Make template public","make-template-private":"Make template private","make-template-public-alert":"Are you sure you want to make this template public?","make-template-private-alert":"Are you sure you want to make this template private? This will remove it from your public profile.","public-role":"Public role","public-url":"Public URL","public-url-copy-mssg":" Here’s your public URL: Copy it or share it with the signer, and you will be able to see all your publicly set templates.","add-public-url-alert":"Please add your public URL, and you will be able to make a public template.","share-with-alert":"You cannot share a template if any roles already have contacts assigned. Please remove all contact assignments from the roles before sharing the template.","share-with":"Share with","team-not-found":"Team not found","roles":"Roles","delete-document":"Delete Document","delete-document-alert":"Are you sure you want to delete this document?","quick-send":"Quick send","add-new":"Add new","send":"Send","quick-send-alert-1":"All roles in this document are currently linked to contacts. To quick send copies of this template to multiple signers, please ensure that at least one role is not linked to any contact.","quick-send-alert-2":"Please ensure there\'s at least one signature widget added for all recipients.","quick-send-alert-3":"Please add at least one role to this template in order to \'quick send\' copies of it to multiple signers.","quick-send-alert-4":"Quick send reached limit.","copy-link":"Copy link","copy":"Copy","revoke-document":"Revoke document","revoke-document-alert":"Are you sure you want to revoke this document?","resend-mail":"Resend Mail","resend-mail-help":"You can use following variables which will get replaced with their actual values:- {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email}}, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.","subject":"Subject","body":"Body","add-contact":"Add Contact","add-signer-alert":"Contact already exist!","record-delete-alert":"Record deleted successfully!","record-revoke-alert":"Record revoked successfully!","mail-sent-alert":"Mail sent successfully.","document-sent-alert":"Document sent successfully!","template-share-alert":"Template Shared successfully.","template-public-alert-1":"You have successfully made the template public.","template-public-alert-2":"You have successfully made the template private.","template-public-alert-3":"You need to select a role for the public signers.","template-public-alert-4":"Please ensure there\'s at least one signature widget added for all signers.","template-public-alert-5":"Since this template has send-in-order enabled, the public role must be positioned at the top.","template-public-alert-6":"Please attach signers to all roles except for the public role user.","template-public-alert-7":"Please assign at least one public role to make this template public.","loader":" This might take some time","pages":"Pages","document-signed":"Document signed","close":"Close","validation-alert":"Validation alert","validate-alert-mssg":" The input does not meet the criteria set by the regular expression.","otp-verification":"OTP verification","enter-otp":"Enter OTP","verify":"Verify","verify-email-1":"Verify email","resend":"Resend","contact-details":"Contact Details","verify-email":"Please verify your email !","send-otp":" Send OTP","otp-placeholder":"Enter verification code received over email","loading-doc":"Loading Document..","widgets-name":{"signature":"signature","stamp":"stamp","initials":"initials","name":"name","job title":"job title","company":"company","date":"date","text":"text","text input":"text input","checkbox":"checkbox","dropdown":"dropdown","radio button":"radio button","image":"image","email":"email"},"fields":"Fields","recipients":"Recipients","please-add":"Please add a","signed-by":"Signed By","more":"more","sent":"sent","print":"Print","certificate":"Certificate","decline":"Decline","finish":"Finish","mail":"Mail","sign-now":"Sign Now","successfully-signed":"Successfully signed!","email-mssg":" Recipients added here will get a copy of the signed document.","email-error-1":" please provide correct email address","email-error-2":"You can only send to ten recipients at a time.","Email-verified-alert-1":"Email is verified.","Email-verified-alert-2":"Email is already verified.","upload-stamp-image":"Upload stamp image","draw":"Draw","type":"Type","color-type":{"red":"red","blue":"blue","black":"black","yellow":"yellow"},"my-initials":"My Initials","upload":"Upload","initial-teb":"Initials","signature-tab":"Signature","your-signature":"Your signature","copy-title":"Copy widget to","contact-delete-alert":"Are you sure you want to delete this contact?","reset-password-alert-1":"Reset password link has been sent to your email id","reset-password-alert-2":"Please setup email adapter ","reset-password-alert-3":"Reset Your Password","faild-animation":"Failed to load animation","apply":"Apply","copy-type":{"All pages":"All pages","All pages but last":"All pages but last","All pages but first":"All pages but first","Next to current widget":"Next to current widget"},"options":"Options","minimun-check":"Minimun check","maximum-check":"Maximum check","default-value":"Default value","select":"Select","read-only":"Is read only","hide-labels":"Hide labels","checkbox":"Checkbox","alert":"Alert","zoom-in":"Zoom in","zoom-out":"Zoom out","document-signed-alert":"Congratulations! 🎉 This document has been successfully signed by you!","otp-sent-alert":"OTP sent on your email","fields-required":"Fields required","signature-widget-alert-1":"Please ensure there\'s at least one signature widget added","signature-widget-alert-2":"Please ensure all field is accurately filled and meets all requirements.","encrypted-pdf-alert":"Currently encrypted pdf files are not supported.","encrypted-pdf-alert-1":"PFX file password is invalid.","user-not-exist":"User does not exist","template-signature-field":"Please add at least one signature field for all roles.","template-role-alert":"Please add roles first","create-document":"Create Document","template-created-alert":"Do you want to create a document using the template you just created ?","signers-alert":"signers alert","template-creation-alert-1":"Please select signer for add placeholder!","ok":"Ok","radio-group":"Radio group","dropdown-options":"Dropdown options","add-role":"Add Role","role-ex":" e.g: Customer, Hr, Director, Manager, Student, etc","add/choose-signer":"Add/Choose Signer","choose-from-contacts":"Choose from contacts","select-signer":" Please select signer","edit-template":"Edit Template","widget-info":"Widget info","validation":"Validation","invalid-default-value":"invalid default value","hint":"Hint","color":"color","role-help":{"p1":"What are template roles?","p2":"Begin by specifying each role needed for the completion of the document. Think about the parties involved in the signing process and what their responsibilities are. Common roles include HR for internal documents, Customer for agreements or Vendor for business agreements.","p3":"Why pre-attach users to some roles?","p4":"For roles that consistently involve the same individual (e.g., the CEO\'s signature on employee offer letters), you can pre-attach a user to a role within the template. This step is optional but recommended for efficiency and consistency across documents.","p5":"When do i specify the user attached to each role?","p6":"When you create a document from your template, you\'ll be prompted to attach users to each defined role. If a role already has a user attached, this will be pre-filled, but you can modify it as needed before sending out the document."},"add-recipients":"Add recipients","loading-mssg":"This might take some time","send-mail":"Send Mail","placeholder-alert-1":"Please ensure there\'s at least one signature widget added for all recipients.","placeholder-alert-2":"Please confirm that you have filled the text field.","placeholder-alert-3":" Are you sure you want to send out this document for signatures?","placeholder-alert-4":"You have successfully sent mails to all recipients!","placeholder-alert-5":"Do you want to sign documents right now ?","placeholder-alert-6":"Please setup mail adapter to send mail!","placeholder-alert-7":"Please select signer for add placeholder!","email-subject":"email subject","email-body":"email body","email-placeholder":"add body of email","reset-to-default":"Reset to default","cutomize-email":"Cutomize Email","upgrade-to-customize-email":"Upgrade to customize Email","sign-url":"Sign url","Mails Sent":"Mails Sent","document-alert":"Document Alert","owner-subscription-expired":"Owner\'s subscription has expired.","subscription-expired":"Subscription Expired","alert-message":"Alert message","document-decline":"Document decline","decline-alert-1":"Are you sure want to decline this document ?","decline-alert-2":"You have declined this document!","decline-alert-3":"You can not sign this document as it has been declined/revoked.","sign here":"Sign here","guest-email-alert":"verification code is sent to your email","get-otp-alert":"you will get a verification code via Email","user-already-exist":"User already exist.","server-error":"Internal server error !","fill-required-details!":"Please fill required details!","sign-up-form":"Sign up form","sign-up":"Sign up","folder-already-exist!":"folder already exist!","please-select-position!":"please select position!","default-sign-alert":"Are you sure you want to auto sign at requested all locations?","Your-Signature":"Your Signature","auto-sign-all":"Auto Sign All","generating-certificate":"Generating certificate","pdf-download":"PDF Download","generate-certificate-alert":" Your completion certificate is being generated. Please wait momentarily. If the download doesn\'t start shortly, click the button again.","folder-already-exist":"Folder already exist!","folder-created-successfully":"Folder created successfully!","fill-folder-name":"Please fill folder name","already-exists-this-username":"User already exists with this username!","verification-code-sent":"Verification mail has been sent to your E-mail!","registered-user-successfully":"Registered user successfully.","role-not-found":"Role not found.","do-not-access":"You don\'t have access, please contact the admin.","add-admin":"Add admin","opensign-setup":"OpenSign Setup","join-discord":"Join our discord server","admin-already-exist":"Admin already exist.","password-update-alert-1":"Password updated successfully.","password-update-alert-2":"Your current password is missing or incorrect.","password-update-alert-3":"Your current password is missing or incorrect.","password-update-alert-4":"Your password and confirmation password do not match.","current-password":"Current Password","new-password":"New Password","confirm-password":"Confirm Password","file-alert-1":"The selected file size is too large. Please select a file less than","file-alert-2":"Please select file.","file-alert-3":"Please wait while the document is being uploaded.","enter-pdf-password":"Enter Pdf Password","correct-password":"Please provide correct password","decrypting-pdf":" Decrypting pdf please wait...","invalid-otp":"Invalid Otp","user-not-found":"User not found!","enter-otp-alert":"Please Enter OTP!","get-verification-code":"Get verification code","get-verification-code-2":"You will get a verification code via Email","enter-verification-code":"Enter Verification Code","provide-your-details":"Provide your details","provide-email":"Please provide email.","additional-info":"Additional Info","signature-saved-alert":"Signature saved successfully.","fill-field":"Please fill out this field","error-template":"Error: Template not found!","error":"Error","invalid-document":"Error: invalid document!","document-not-found":"Document not Found!","document-signed-alert-1":"You have successfully signed the document. You can download or print a copy of the partially signed document. A copy of the digitally signed document will be sent to the owner over email once it is signed by all signers.","encrypted-pdf-not-support":"Currently encrypted pdf files are not supported.","document-signed-alert-4":" Congratulations! 🎉 This document has been successfully signed by all participants!","document-signed-alert-5":"This document has been signed by all Signers.","document-signed-alert-6":"This document has been declined by one or more recipient(s).","document-signed-alert-7":"This Document is no longer available.","document-signed-alert-8":"The document has already been dispatched for signing.","yet-to-sign":"Yet to sign","validation-alert-1":"The input does not meet the criteria set by the regular expression.","account-already-exists":"Account already exists!","choose-password":"Choose Password","enter-password":"Enter Password","sure":"sure","subscribed-alert":"You have already subscribed to plan!","monthly":"Monthly","yearly-upto":"Yearly (upto 66% off)","billed-yearly":"Billed Yearly","billed-monthly":"Billed Monthly","plansubscription-1":"Host it yourself for free","visit-github":"Visit Github","user-already-exist-name":"User already exists with this username!","do-not-access-contact-admin":"You don\'t have access, please contact the admin.","filed-required-correctly":"Please fill required details correctly.","admin-created":"Admin created","invalid-masterkey":"Invalid masterkey","opensign-Setup":"OpenSign Setup","master-key":" Master key","profile-update-alert":"Profile updated successfully.","date":"Date","report-not-found":"Report Not Found","please-wait":"please wait","select-foler":"Select Folder","generated-on":"Generated On","text-field":"Text field","font-size":"Font size","widget-status":{"Required":"Required","Optional":"Optional"},"all-right":"All Rights Reserved","version":"version","social-media":{"github":"Github","linked-in":"LinkedIn","twitter":"Twitter","discord":"Discord"},"tour-mssg":{"home-layout-1":"You have logged in successfully! Let\'s take a look.","home-layout-2":"To upload documents for self-signing or to request others’ signatures, simply select the respective buttons.","home-layout-3":"You are ready to start using OpenSign! If you need support feel free to contact us.","generate-token":"Upgrade now to generate production API token.","opensign-drive-1":"Click on the breadcrumb links to easily navigate through the folder hierarchy and view the documents within each folder.","opensign-drive-2":"Click the add button to create a new folder or document.","opensign-drive-3":"Sort your documents by Date or Name using this menu.","opensign-drive-4":"Click on this menu to display the documents in list view.","opensign-drive-5":"The document list is displayed according to the selected sorting option. Icons next to each document indicate its current status.","opensign-drive-6":"Right-click on a document to see options such as Download, Rename, Move, and Delete. Click on the document to open it.","opensign-drive-7":"Right-click on any folder to see options. Choose ‘Rename’ to change the folder’s name or click on the folder to navigate through its contents.","pdf-request-file-1":"List of signers who still need to sign the document .","pdf-request-file-2":"Click any of the placeholders appearing on the document to sign. You will then see options to draw your signature, type it, or upload an image .","pdf-request-file-3":"Click the Back, Decline, or Finish buttons to navigate your document. Use the ellipsis menu for additional options, including the Download button .","pdf-request-file-4":"List of signers who have already signed the document .","pdf-request-file-5":"You can click \'Auto Sign All\' to automatically sign at all the locations meant to be signed by you. Make sure that you review the document properly before you click this button .","placeholder-sign-1":"Select a recipient from this list to add a place-holder where he is supposed to sign.The placeholder will appear in the same colour as the recipient name once you drop it on the document.","placeholder-sign-2":"Clicking \'Add recipients\' button will allow you to add more signers.","placeholder-sign-3":"Click this button to add more recipients/signers to the document.","placeholder-sign-4":"Drag or click on a field to add it to the document.","placeholder-sign-5":"The PDF content area already displays the template\'s existing placeholders. For your convenience, these placeholders will match the color of the recipient\'s name, making them easily identifiable.","placeholder-sign-6":"Clicking \'Send\' will save the document. In the next step you can customize the emails to be sent out to the recipients or copy the signing links and share those with the recipients yourself.","report-1":"Click the \'Add\' button to create a new template. Templates are reusable documents designed to quickly generate new documents with the same structure and varying signers. For example, an HR template for onboarding could have predefined roles like ‘HR Manager’ and ‘New Employee’. Each time you use the template, you can assign the ‘New Employee’ role to different incoming staff members, while the ‘HR Manager’ role remains constant, facilitating a seamless onboarding process for each recruit. ","redirect":"Click the \'Use\' button to create a new document from an existing template.","bulksend":"To quickly create and send multiple documents using an existing template, click the \'Quick Send\' button.","option":"This menu reveals more options such as Edit & Delete. Use the \'Edit\' button to add signer roles, modify fields, and update your template. Changes will apply to all future documents created from this template but won’t affect existing documents.Use the Delete button you can delete template. ","signyour-self-1":"Select and drag your preferred widgets onto the PDF to customize your document before signing. Choose the perfect spots for each modification to tailor the document to your needs.","signyour-self-2":"Drag and drop anywhere in this area. You can resize and move it later.","template-placeholder-1":"Clicking \'Add role\' button will allow you to add various signer roles. You can attach users to each role in subsequent steps.","template-placeholder-2":"Once roles are added, select a role from list to add a place-holder where he is supposed to sign. The placeholder will appear in the same colour as the role name once you drop it on the document.","template-placeholder-3":"Drag or click on a field to add it to the document.","template-placeholder-4":"Drag the placeholder for a role anywhere on the document.Remember, it will appear in the same colour as the name of the recipient for easy reference.","template-placeholder-5":"Clicking \'Next\' will store the current template. After saving, you’ll be prompted to create a new document from this template if you wish.","webhook-1":"Upgrade now to set webhook","Need your Signature":"Clicking on this card will take you to the list of documents awaiting your review.","Out for signatures":"Clicking on this card will take you to a list of documents awaiting signature.","Recent signature requests":"This is a list of documents that are waiting for your signature.","Recently sent for signatures":"This is a list of documents you\'ve sent to other parties for signature.","Drafts":"This are documents you have started but have not finalized for sending.","public-template":"This video demonstrates how to set up your personalized public profile, such as ‘https://opensign.me/your-username’. You’ll also learn how to customize your tagline and make your templates available for public signing."},"enter-email-plaholder":"Add an email address and hit enter","success-email-alert":"Email sent successfully!","expired-doc-title":"Expired Document","expired-on-mssg":"This document expired on {{expiredDate}} and is no longer available to sign.","signature-validate-alert":"Please confirm that you have selected at least {{minRequiredCount}} checkboxes.","signature-validate-alert-2":"Ensure this field is accurately filled and meets all requirements.","remaing-users":"Remaining users","Role":"Role","additional-users":"Please purchase add-on users.","Quantity-of-users":"Quantity of users","Price":"Price","Total-price-for-next-time":"Total price for next time","Proceed":"Proceed","Select":"Select","Add-seats":"Add Seats","user-name-exist":"user name already exist","format":"format","select-date-format":"Select a date format","quantity-of-credits":"Quantity of premium credits","remaining-credits":"Premium credits available:","remaining-credits-help":"Use premium credits for API document signing, bulk sending, or embedding OpenSign integration on your website. You have {{allowedcredits}} included credits and {{addoncredits}} additional purchased credits remaining.","additional-credits":"Please purchase premium credits","quota-err-quicksend":"Quota Reached, You don\'t have enough credits.","buy-credits":"Buy Premium Credits","rotate-right":"Rotate right","rotate-left":"Rotate left","rotate-alert-mssg":"All widgets on this page will be lost. Are you sure you want to proceed?","templateid":"Template-Id","bulk-send-subcription-alert":"Please upgrade to Professional or Team plan to use bulk send.","generate-test-token":"Generate Test Token","regenerate-test-token":"Regenerate Test Token","help-test-token":"This token can be used to test the APIs at the https://sandbox.opensignlabs.com/api/v1 endpoint, allowing you to conduct unlimited document signatures. Please note that the sandbox API will sign your documents with self-signed certificates, which may not be recognized as valid by Adobe. Once you’ve completed your testing, you can upgrade to one of our paid plans to generate a production token.","help-api-token":"This token can be used to access the production APIs at the {{origin}}/api/v1 endpoint. It can only be generated on one of our paid plans.","reason":"Reason","decline-by":"Declined/revoked by","document-declined":"Document declined","quota-mail-info-head":"Monthly request signatures email limit","quota-mail-info":"You can send upto 15 signature request emails every month. Upgrade now to send unlimited signing requests directly.","quota-mail":"You\'ve reached your limit of 15 signature request emails for this month. Upgrade now to continue sending emails directly.","quota-mail-tip":"Tip: You can still sign <1>unlimited documents by manually sharing the signing request links.","quota-mail-head":"Quota Reached","unauthorized-modal":"You don\'t have permission to perform this action, please contact {{adminEmail}}.","sent-this-month":"Sent this month","available-seats":"Available seats","buy-users":"Buy more users","isenable-otp":"Enable OTP verification","isenable-otp-help":{"p1":"Would you like to enable the verification process using a one-time password (OTP)?","p2":"Selecting this option will enable OTP verification. Users will receive a verification code via email, which they must enter to sign the document.","p3":"Selecting this option will disable OTP verification, allowing users to sign the document directly without additional steps.","p4":"Please choose the option that best suits your document signing requirements."},"advanced-options":"Advanced options","hide-advanced-options":"Hide Advanced options"}'); /***/ }), @@ -253417,7 +253348,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"headernews":"New feature: Public pro /***/ ((module) => { "use strict"; -module.exports = /*#__PURE__*/JSON.parse('{"headernews":"Nouvelle fonctionnalité : les profils publics sont désormais en ligne ! Créez et partagez facilement des modèles publics","headernewsbtn":"Configurer maintenant","create-account":"Créer un compte","login":"Se Connecter","language":"Langue","name":"Nom et Prénom","phone":"Téléphone","phone-optional":"(facultatif)","email":"E-mail","company":"Organisation","job-title":"Votre Fonction","profile":"Profil","is-email-verified":"L\'e-mail est-il vérifié","log-out":"Déconnexion","public-profile":"Profil public","tagline":"Slogan","has-requested-you-to-sign":" vous a demandé de signer","has-requested-you-to-review-and-sign":"vous a demandé de consulter et de signer","input-required":"Veuillez remplir ce champ.","sort-order":{"Ascending":"Ascendant","Descending":"Descendant","Name":"Nom et Prénom","Date":"Date"},"context-menu":{"Download":"Télécharger","Rename":"Renommer","Move":"Se déplacer","Delete":"Supprimer"},"action":"Action","add":"Ajouter","add-new-folder":"Ajouter un nouveau dossier","disable-documentId":"Désactiver l\'ID du document","edit":"Modifier","change-password":"Changer votre mot de passe","save":"Sauvegarder","cancel":"Annuler","upgrade-now":"Mettre à jour maintenant","upgrade-to":"Mettre à niveau vers","pro":"PRO","plan":"Offre","subscribe-card-teamplan":"Libérez toute la puissance de la collaboration ! Créez un nombre illimité d\'organisations, d\'équipes et de hiérarchies. Partagez des modèles de manière transparente entre les équipes et attribuez des rôles d\'utilisateur personnalisés. Améliorez votre flux de travail dès aujourd\'hui !","subscribe-card-plan":"Débloquez des fonctionnalités premium à partir de seulement {{premiumPrice}}/mois. Bénéficiez de performances améliorées et de seulement {{addonPrice}} par crédit supplémentaire après vos crédits premium inclus.","user-name-limit-char":"Pour avoir un nom d\'utilisateur de moins de 8 caractères s\'il vous plaît s\'abonner","tour-content":"Ne plus afficher","team":"Équipe","docs":"Documents","session-expired":"Votre session a expiré.","user":"Utilisateur","public-profile-help":"Il s\'agit de votre URL publique. Copiez-le ou partagez-le avec le signataire et vous pourrez voir tous vos modèles définis publiquement.","tagline-help":"Ce surnom apparaîtra sur votre profil public OpenSign par exemple. https://opensign.me/alex","welcome":"Content de te revoir!","Login-to-your-account":"Se connecter à son compte","password":"Mot de passe","forgot-password":"Mot de passe oublié?","loading":"Chargement...","of":"de","sign-SSO":"Connectez-vous avec SSO","login-page":"Page de connexion","or":"OU","signup-page":"Page d\'inscription","password-length":"Le mot de passe doit être de plus de 8 caractères","password-case":"Le mot de passe doit contenir une lettre majuscule, minuscule et un chiffre ","password-special-char":"Le mot de passe doit contenir un caractère spécial","agreee":"Je suis d\'accord avec le","term":"Conditions d\'utilisation","subscribe-to-opensign":"Abonnez-vous à la newsletter OpenSign","register":"S\'enregistrer ","sidebar":{"Dashboard":"Tableau de bord","Sign yourself":"signez vous-même","Request signatures":"Demander des signatures","Templates":"Modèles","Templates-Children":{"Create template":"Créer un modèle","Manage templates":"Gérer les modèles"},"OpenSign™ Drive":"Lecteur OpenSign™","Reports":"Rapports","Reports-Children":{"Need your sign":"Besoin de votre signature","In Progress":"En cours","Completed":"Complété","Drafts":"Brouillons","Declined":"Signature refusé","Expired":"Expiré","Contactbook":"Carnet de contacts"},"Settings":"Paramètres","Settings-Children":{"My Signature":"Ma signature","API Token":"Jeton API","Webhook":"Webhook","Teams":"Équipe","Team-update-successfully":"Équipe mise à jour avec succès.","Users":"Utilisateurs"}},"dashboard-card":{"Need your Signature":"Besoin de votre signature","Out for signatures":"En attente de Signature"},"report-name":{"Draft Documents":"Brouillons","Need your sign":"Besoin de votre signature","In-progress documents":"Documents en cours","Completed Documents":"Documents complétés","Declined Documents":"Documents refusés","Expired Documents":"Documents expirés","Recently sent for signatures":"Récemment envoyé pour signature","Recent signature requests":"Demandes de signature récentes","Drafts":"Brouillons","Contactbook":"Carnet de contacts","Templates":"Modèles","Teams":"Équipe","Users":"Utilisateurs"},"report-heading":{"Sr.No":"Numéro","Title":"Titre","Email":"E-mail","Phone":"Téléphone","File":"Fichier","Owner":"Propriétaire","Signers":"Signataires","Note":"Note","Folder":"Dossier","Reason":"Raison","Parent Team":"Équipe de parents","Active":"Actif","Role":"Rôle","Team":"Équipe","Name":"Nom","Status":"Statut","created-date":"Date de création","Type":"Saisir"},"btnLabel":{"sign":"Signer","Resend":"Relancer","Revoke":"Révoquer","Delete":"Supprimer","Use":"Utiliser","Quick send":"Envoi rapide","Edit":"Modifier","Share with team":"Partager avec l\'équipe","Share":"Partager","View":"Voir","option":"Option","Embed":"Intégrer"},"report-help":{"Draft Documents":"Il s\'agit de documents que vous avez commencés mais que vous n\'avez pas finalisés pour envoi.","Need your sign":"Voici une liste de documents ou votre signature est requise","In-progress documents":"Il s\'agit d\'une liste de documents que vous avez envoyés à d\'autres parties pour signature.","Completed Documents":"Il s\'agit d\'une liste de documents signés par toutes les parties.","Declined Documents":"Il s\'agit d\'une liste de documents qui ont été refusés par l\'un des signataires.","Expired Documents":"Il s\'agit d\'une liste de documents qui ont atteint leur date d\'expiration.","Contactbook":"Il s\'agit d\'une liste de contacts/signataires que vous avez ajoutés. Ceux-ci apparaîtront sous forme de suggestions lorsque vous tenterez d\'ajouter des signataires à un nouveau document.","Templates":"Il s\'agit d\'une liste de modèles à votre disposition pour créer des documents. Vous pouvez cliquer sur le bouton \'Utiliser\' pour créer un nouveau document à l\'aide d\'un modèle, modifier le document et ajouter des signataires à l\'étape suivante."},"form-name":{"Sign Yourself":"signez vous-même","Request Signatures":"Demander des signatures","New Template":"Nouveau modèle"},"file-type":"pdf, png, jpg, jpeg","docx":"docx","file-selected":"fichier sélectionné","template-title":"Titre du modèle","document-title":"Titre du document","description":"Description","time-to-complete":"Temps de réalisation (jours)","send-in-order":"Envoyer dans l\'ordre ?","send-in-order-help":{"p1":"Choisissez la manière dont vous souhaitez que les demandes de signature soient envoyées aux signataires du document :","p2":"La sélection de cette option enverra initialement la demande de signature au premier signataire. Une fois que le premier signataire a terminé sa partie, le prochain signataire de la séquence recevra la demande. Ce processus se poursuit jusqu\'à ce que tous les signataires aient signé le document. Cette méthode garantit que le document est signé dans un ordre spécifique.","p3":"La sélection de cette option enverra les liens de signature à tous les signataires simultanément. Chaque signataire peut signer le document à sa convenance, que d\'autres signataires aient ou non complété leur signature. Cette méthode est plus rapide mais n’impose aucun ordre de signature entre les participants.","p4":"Sélectionnez l\'option qui correspond le mieux aux besoins de votre traitement de documents."},"no":"Non","auto-reminder":"Rappel automatique","remind-once":"Rappeler une fois tous les (jours)","next":"Suivant","select-folder":"Sélectionner le dossier","OpenSign-drive":"Lecteur OpenSign™","drive-document-status":{"Completed":"Complété","Declined":"Refuser","Draft":"Brouillon","Expired":"Expiré","In Progress":"En cours"},"select-folder-help":"Si vous ne sélectionnez pas de dossier, votre document signé sera enregistré dans le dossier du lecteur principal OpenSign.","no-data":"Aucune données disponible","save-here":"Enregistrer ici","back":"Retour","add-folder":"Ajouter le dossier","create-folder":"Créer le dossier","parent-folder":"Dossier Parent","create":"Créer","signers":"Signataires","signers-help":"Commencez à saisir le nom d\'un contact pour voir les signataires suggérés par vos contacts enregistrés ou en ajouter de nouveaux. Organisez l\'ordre de signature en ajoutant des signataires dans l\'ordre souhaité. Utilisez le bouton « + » pour inclure les signataires et le « x » pour les supprimer. Chaque signataire recevra un e-mail invité à signer le document dans l\'ordre indiqué.","add-signer":"Ajouter un signataire","contact-not-found":"Contact introuvable","add-yourself":"Ajoutez-vous","submit":"Soumettre","reset":"Réinitialiser","my-signature":"Ma signature","signature":"Signature","upload-image":"Télécharger une image","clear":"Vider","upload-signature/Image":"télécharger-signature/Image","initials":"Initiales","API":"API","api-token":"Jeton API","regenerate-token":"Régénérer en direct jeton","generate-token":"Générer en direct jeton","view-docs":"Afficher les documents","generate-token-alert":"Êtes-vous sûr de vouloir régénérer le jeton, votre ancien jeton sera supprimer?","yes":"Oui","copied":"Copié","wrong-mssg":"Quelque chose c\'est mal passé. Merci d\'essayer plus tard.","token-generated":"Jeton généré avec succès.","webhook":"Webhook","update-webhook":"Mettre à jour le webhook","add-webhook":"Ajouter un webhook","webhook-added":"Webhook ajouté avec succès.","team-disabled":"Équipe: Désactivée","team-enabled":"Équipe activée","are-you-sure":"Êtes-vous sûr de vouloir","disable":"désactiver","enable":"activer","this-team":"cette équipe?","edit-team":"Modifier l\'équipe","name-of-team":"Nom de l\'équipe","prev":"précédent","no-data-avaliable":"pas de données disponibles","add-team":"Ajouter une équipe","page-not-found":"Page non trouvée","users-from-teams":"utilisateurs de votre Équipe","user-status":"Statut de l\'utilisateur","activate":"Activer","deactivate":"désactiver","this-user":"cet utilisateur ","delete-user":"Supprimer l\'utilisateur","delete":"supprimer","add-user":"Ajouter un utilisateur","password-generateed":"Le mot de passe ne sera généré qu\'une seule fois ; assurez-vous de le copier.","Team status":"Statut de l\'équipe","user-deactivated":"Utilisateur désactivé.","user-activated":"Activé par l\'utilisateur.","public":"Public","download":"Téléchargement","view":"voir","make-template-public":"Rendre le modèle public","make-template-private":"Rendre le modèle privé","make-template-public-alert":"Êtes-vous sûr de vouloir rendre ce modèle public ?","make-template-private-alert":"Êtes-vous sûr de vouloir rendre ce modèle privé ? Cela le supprimera de votre profil public.","public-role":"Rôle public","public-url":"URL publique","public-url-copy-mssg":"Voici votre URL publique : copiez-la ou partagez-le avec le signataire et vous pouvoir voir tous vos paramètres publics modèles.","add-public-url-alert":"Veuillez ajouter votre URL publique et vous pourra rendre public modèle.","share-with-alert":"Vous ne pouvez pas partager un modèle si des contacts sont déjà attribués à des rôles. Veuillez supprimer toutes les attributions de contacts des rôles avant de partager le modèle.","share-with":"Partager avec","team-not-found":"Équipe introuvable","roles":"Les rôles","delete-document":"Supprimer un document","delete-document-alert":"Êtes-vous sûr de vouloir supprimer ce document ?","quick-send":"Envoi rapide","add-new":"Ajouter un nouveau","send":"envoyer","quick-send-alert-1":"Tous les rôles dans ce document sont actuellement liés à des contacts. Pour envoyer rapidement des copies de ce modèle à plusieurs signataires, veuillez vous assurer qu\'au moins un rôle n\'est lié à aucun contact.","quick-send-alert-2":"Veuillez vous assurer qu\'au moins un widget de signature est ajouté pour tous les destinataires.","quick-send-alert-3":"Veuillez ajouter au moins un rôle à ce modèle afin d\'en « envoyer rapidement » des copies à plusieurs signataires.","quick-send-alert-4":"L\'envoi rapide a atteint la limite.","copy-link":"Copier le lien","copy":"Copier","revoke-document":"Révoquer le document","revoke-document-alert":"Êtes-vous sûr de vouloir révoquer ce document ?","resend-mail":"Renvoyer le courrier","resend-mail-help":"Vous pouvez utiliser les variables suivantes qui seront remplacées par leurs valeurs réelles : - {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email} }, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.","subject":"Sujet","body":"Corps","add-contact":"Ajouter le contact","add-signer-alert":"Le contact existe déjà !","record-delete-alert":"Enregistrement supprimé avec succès !","record-revoke-alert":" Enregistrement révoqué avec succès ! ","mail-sent-alert":"Courriel envoyé avec succès.","document-sent-alert":"Document envoyé avec succès !","template-share-alert":"Modèle partagé avec succès.","template-public-alert-1":"Vous avez rendu le modèle public avec succès.","template-public-alert-2":"Vous avez réussi à rendre le modèle privé.","template-public-alert-3":"Vous devez sélectionner un rôle pour les signataires publics.","template-public-alert-4":"Veuillez vous assurer qu\'au moins un widget de signature est ajouté pour tous les signataires.","template-public-alert-5":"Étant donné que l\'envoi dans l\'ordre est activé sur ce modèle, le rôle public doit être positionné en haut.","template-public-alert-6":"Veuillez associer des signataires à tous les rôles, à l\'exception du rôle d\'utilisateur public.","template-public-alert-7":"Veuillez attribuer au moins un rôle public pour rendre ce modèle public.","loader":"Cela pourrait prendre un certain temps","pages":"Pages","document-signed":"Document signé","close":"Fermer","validation-alert":"Alerte de validation","validate-alert-mssg":"L\'entrée ne répond pas aux critères définis par l\'expression régulière.","otp-verification":"Vérification OTP","enter-otp":"Entrez OTP","verify":"Vérifier","verify-email-1":"Vérifier l\'e-mail","resend":"Renvoyer","contact-details":"Coordonnées","verify-email":"Veuillez vérifier votre email!","send-otp":"envoyer un code à usage unique","otp-placeholder":"Entrez le code de vérification reçu par e-mail","loading-doc":"Chargement du document..","widgets-name":{"signature":"signature","stamp":"tampon","initials":"initiales","name":"nom et Prénom","job title":"votre fonction","company":"organisation","date":"date","text":"texte","text input":"saisie de texte","checkbox":"case à cocher","dropdown":"dérouler","radio button":"bouton radio","image":"image","email":"e-mail"},"fields":"Des champs","recipients":"Destinataires","please-add":"Veuillez ajouter un","signed-by":"Signé par","more":"plus","sent":"Envoyé","print":"imprimer","certificate":"Certificat","decline":"refusé","finish":"terminé","mail":"Mail","sign-now":"Signez maintenant","successfully-signed":"Signé avec succès !","email-mssg":"Les destinataires ajoutés ici recevront une copie du document signé.","email-error-1":"veuillez fournir une adresse e-mail correcte","email-error-2":"Vous ne pouvez envoyer qu\'à dix destinataires à la fois.","Email-verified-alert-1":"L\'e-mail est vérifié.","Email-verified-alert-2":"L\'e-mail est déjà vérifié.","upload-stamp-image":"Télécharger l\'image du tampon","draw":"Dessiner","type":"Taper","color-type":{"red":"rouge","blue":"bleu","black":"noir","yellow":"jaune"},"my-initials":"Mes initiales","upload":"Télécharger","initial-teb":"Initiales","signature-tab":"Signature","your-signature":"Votre signature","copy-title":"Copier le widget vers","contact-delete-alert":"Êtes-vous sûr de vouloir supprimer ce contact ?","reset-password":"Le lien de réinitialisation du mot de passe a été envoyé à votre identifiant de messagerie","reset-password-alert-2":"Veuillez configurer l\'adaptateur de messagerie","reset-password-alert-3":"Réinitialisez votre mot de passe","faild-animation":"Échec du chargement de l\'animation","apply":"Appliquer","copy-type":{"All pages":"Toutes les pages","All pages but last":"Toutes les pages sauf la dernière","All pages but first":"Toutes les pages sauf la première","Next to current widget":"À côté du widget actuel"},"options":"Possibilités","minimun-check":"Vérification minimale","maximum-check":"Contrôle maximum","default-value":"Valeur par défaut","select":"Sélectionner","read-only":"Est en lecture seule","hide-labels":"Masquer les étiquettes","checkbox":"Case à cocher","alert":"Alerte","zoom-in":"Agrandir","zoom-out":"Dézoomer","document-signed-alert":"Félicitations ! 🎉 Votre document à bien été signer!","otp-sent-alert":"Le code OTP a bien été envoyer sur votre adresse Email","fields-required":"Champs obligatoires","signature-widget-alert-1":"Veuillez vous assurer qu\'au moins un widget de signature a été ajouté","signature-widget-alert-2":"Veuillez vous assurer que tous les champs sont remplis avec précision et répondent à toutes les exigences.","encrypted-pdf-alert":"Les fichiers PDF actuellement cryptés ne sont pas pris en charge.","encrypted-pdf-alert-1":"Le mot de passe du fichier PFX n\'est pas valide.","user-not-exist":"L\'utilisateur n\'existe pas","template-signature-field":"Veuillez ajouter au moins un champ de signature pour tous les rôles.","template-role-alert":"Veuillez d\'abord ajouter des rôles","create-document":"Créer un document","template-created-alert":"Voulez-vous créer un document en utilisant le modèle que vous vient de créer ?","signers-alert":"alerte des signataires","template-creation-alert-1":"Veuillez sélectionner le signataire pour ajouter un espace réservé !","ok":"D\'accord","radio-group":"Groupe de radio","dropdown-options":"Options déroulantes","add-role":"Ajouter un rôle","role-ex":"Ex : Client, RH, Directeur, Manager, Étudiant, etc.","add/choose-signer":"Ajouter/Choisir un signataire","choose-from-contacts":"Choisissez parmis les contacts","select-signer":"Veuillez sélectionner le signataire","edit-template":"Modifier le modèle","widget-info":"Informations sur les widgets","validation":"Validation","invalid-default-value":"valeur par défaut invalide","hint":"Indice","color":"couleur","role-help":{"p1":"Que sont les rôles modèles ?","p2":"Commencez par spécifier chaque rôle nécessaire à la finalisation du document. Pensez aux parties impliquées dans le processus de signature et à leurs responsabilités. Les rôles courants incluent les RH pour les documents internes, le Client pour les accords ou le Fournisseur pour les accords commerciaux.","p3":"Pourquoi pré-attacher les utilisateurs à certains rôles ?","p4":"Pour les rôles qui impliquent systématiquement la même personne (par exemple, la signature du PDG sur les lettres d\'offre des employés), vous pouvez pré-attacher un utilisateur à un rôle dans le modèle. Cette étape est facultative mais recommandée pour des raisons d\'efficacité et de cohérence entre les documents.","p5":"Quand dois-je spécifier l\'utilisateur attaché à chaque rôle ?","p6":"Lorsque vous créez un document à partir de votre modèle, vous serez invité à attacher des utilisateurs à chaque rôle défini. Si un rôle est déjà associé à un utilisateur, celui-ci sera pré-rempli, mais vous pourrez le modifier si nécessaire avant d\'envoyer le document."},"add-recipients":"Ajouter des destinataires","loading-mssg":"Cela pourrait prendre du temps","send-mail":"Envoyer un mail","placeholder-alert-1":"Veuillez vous assurer qu\'au moins un widget de signature est ajouté pour tous les destinataires.","placeholder-alert-2":"Veuillez confirmer que vous avez rempli le champ de texte.","placeholder-alert-3":"Etes-vous sûr de vouloir envoyer ce document pour signature ? ","placeholder-alert-4":"Vous avez envoyé avec succès des mails à tous les","placeholder-alert-5":"Voulez-vous signer des documents maintenant ?","placeholder-alert-6":"Veuillez configurer l\'adaptateur de messagerie pour envoyer du courrier !","placeholder-alert-7":"Veuillez sélectionner le signataire pour ajouter un espace réservé !","email-subject":"Sujet du courriel","email-body":"corps de l\'e-mail","email-placeholder":"Ajouter le corps de l\'e-mail","reset-to-default":"Réinitialiser aux valeurs par défaut","cutomize-email":"Personnaliser l\'e-mail","upgrade-to-customize-email":"Mise à niveau pour personnaliser l\'e-mail","sign-url":"Signer l\'URL","Mails Sent":"Mails envoyés avec succès !","document-alert":"Alerte document","owner-subscription-expired":"L\'abonnement du propriétaire a expiré.","subscription-expired":"Abonnement expiré","alert-message":"Message d\'alerte","document-decline":"Document-refusé","decline-alert-1":"Etes-vous sûr de vouloir refuser ce document ?","decline-alert-2":"Vous avez refusé ce document !","decline-alert-3":"Vous ne pouvez pas signer ce document car il a été refusé/révoqué.","sign here":"Signer ici","guest-email-alert":"le code de vérification a été envoyé sur votre e-mail","get-otp-alert":"vous recevrez un code de vérification par e-mail","user-already-exist":"L\'utilisateur existe déjà.","server-error":"Erreur interne du serveur !","fill-required-details!":"Veuillez remplir les informations requises !","sign-up-form":"Formulaire d\'inscription","sign-up":"S\'inscrire","folder-already-exist!":"le dossier existe déjà !","please-select-position!":"Veuillez sélectionner un poste !","default-sign-alert":"Êtes-vous sûr de vouloir vous connecter automatiquement à tous les emplacements demandés ? ","Your-Signature":"Votre signature","auto-sign-all":"Tout signer automatiquement","generating-certificate":"Génération du certificat","pdf-download":"Téléchargement PDF","generate-certificate-alert":" Votre certificat d\'achèvement est en cours de génération. Veuillez patienter quelques instants. Si le téléchargement ne démarre pas sous peu, cliquez à nouveau sur le bouton. ","folder-already-exist":"Le dossier existe déjà !","folder-created-successfully":"Dossier créé avec succès !","fill-folder-name":"Veuillez indiquer le nom du dossier","already-exists-this-username":"Un utilisateur existe déjà avec ce nom d\'utilisateur !","verification-code-sent":"Un e-mail de vérification a été envoyé à votre adresse e-mail !","registered-user-successfully":"Utilisateur enregistré avec succès.","role-not-found":"Rôle introuvable.","do-not-access":"Vous n\'y avez pas accès, veuillez contacter l\'administrateur.","add-admin":"Ajouter un administrateur","opensign-setup":"Configuration d\'OpenSign","join-discord":"Rejoignez notre serveur Discord","admin-already-exist":"L\'administrateur existe déjà.","password-update-alert-1":"Mot de passe mis à jour avec succès.","password-update-alert-2":"Votre mot de passe actuel est manquant ou incorrect.","password-update-alert-3":"Votre mot de passe actuel est manquant ou incorrect.","password-update-alert-4":"Votre mot de passe et votre mot de passe de confirmation ne correspondent pas.","current-password":"mot de passe actuel","new-password":"nouveau mot de passe","confirm-password":"Confirmez le mot de passe","file-alert-1":"La taille du fichier sélectionné est trop grande. Veuillez sélectionner un fichier inférieur à","file-alert-2":"Veuillez sélectionner un fichier.","file-alert-3":"Veuillez patienter pendant le téléchargement du document.","enter-pdf-password":"Entrez le mot de passe PDF","correct-password":"Veuillez fournir un mot de passe correct","decrypting-pdf":"Décryptage du pdf, veuillez patienter...","invalid-otp":"OTP invalide","user-not-found":"Utilisateur non trouvé!","enter-otp-alert":"Veuillez saisir OTP !","get-verification-code":"Obtenir le code de vérification","get-verification-code-2":"Vous recevrez un code de vérification par e-mail","enter-verification-code":"Entrez le code de vérification","provide-your-details":"Fournissez vos coordonnées","provide-email":"Veuillez fournir un e-mail.","additional-info":"Information additionnelle","signature-saved-alert":"Signature enregistrée avec succès.","fill-field":"Veuillez remplir ce champ","error-template":"Erreur : modèle introuvable ! ","error":"Erreur","invalid-document":"Erreur : document invalide !","document-not-found":"Document introuvable !","document-signed-alert-1":"Vous avez signé le document avec succès. Vous pouvez télécharger ou imprimer une copie du document partiellement signé. Une copie du document signé numériquement sera envoyée au propriétaire par e-mail une fois qu\'il sera signé par tous les signataires.","encrypted-pdf-not-support":"Les fichiers PDF actuellement cryptés ne sont pas pris en charge. ","document-signed-alert-4":"Toutes nos félicitations! 🎉 Ce document a été signé avec succès par tous les participants !","document-signed-alert-5":"Ce document a été signé par tous les signataires.","document-signed-alert-6":"Ce document a été refusé par un ou plusieurs destinataire(s).","document-signed-alert-7":"Ce document n\'est plus disponible.","document-signed-alert-8":"Le document a déjà été envoyé pour signature.","yet-to-sign":"Reste à signer","validation-alert-1":"L\'entrée ne répond pas aux critères définis par l\'expression régulière.","account-already-exists":"Le compte existe déjà!","choose-password":"Choisissez un mot de passe","enter-password":"Entrer le mot de passe","sure":"bien sûr","subscribed-alert":"Vous êtes déjà abonné au forfait !","monthly":"Mensuel","yearly-upto":"Annuel (jusqu\'à 66 % de réduction)","billed-yearly":"Facturé annuellement","billed-monthly":"Facturé mensuellement","plansubscription-1":"Hébergez-le vous-même gratuitement","visit-github":"Visitez Github","user-already-exist-name":"Un utilisateur existe déjà avec ce nom d\'utilisateur !","do-not-access-contact-admin":"Vous n\'y avez pas accès, veuillez contacter l\'administrateur.","filed-required-correctly":"Veuillez remplir correctement les informations requises.","admin-created":"Administrateur créé","invalid-masterkey":"Clé principale invalide","opensign-Setup":"Configuration d\'OpenSign","master-key":"La clef maitresse","profile-update-alert":"Mise à jour du profil réussie.","date":"Date","report-not-found":"Rapport introuvable","please-wait":"S\'il vous plaît, attendez","select-foler":"Sélectionner le dossier","generated-on":"Généré le","text-field":"Champ de texte","font-size":"Taille de police","widget-status":{"Required":"Requis","Optional":"Facultative"},"all-right":"Tous droits réservés","version":"version","social-media":{"github":"Github","linked-in":"LinkedIn","twitter":"Twitter","discord":"Discorde"},"tour-mssg":{"home-layout-1":"Vous vous êtes connecté avec succès ! Jetons un coup d\'oeil.","home-layout-2":"Pour télécharger des documents à auto-signature ou pour demander la signature d\'autres personnes, sélectionnez simplement les boutons correspondants.","home-layout-3":"Vous êtes prêt à commencer à utiliser OpenSign ! Si vous avez besoin d\'aide, n\'hésitez pas à nous contacter.","generate-token":"Effectuez la mise à niveau maintenant pour générer un jeton API de production.","opensign-drive-1":"Cliquez sur les liens du fil d\'Ariane pour naviguer facilement dans la hiérarchie des dossiers et afficher les documents dans chaque dossier.","opensign-drive-2":"Cliquez sur le bouton Ajouter pour créer un nouveau dossier ou document.","opensign-drive-3":"Triez vos documents par date ou par nom à l\'aide de ce menu.","opensign-drive-4":"Cliquez sur ce menu pour afficher les documents sous forme de liste.","opensign-drive-5":"La liste des documents s\'affiche selon l\'option de tri sélectionnée. Les icônes à côté de chaque document indiquent son état actuel.","opensign-drive-6":"Faites un clic droit sur un document pour voir les options telles que Télécharger, Renommer, Déplacer et Supprimer. Cliquez sur le document pour l\'ouvrir.","opensign-drive-7":"Faites un clic droit sur n\'importe quel dossier pour voir les options. Choisissez \'Renommer\' pour changer le nom du dossier ou cliquez sur le dossier pour naviguer dans son contenu.","pdf-request-file-1":"Liste des signataires qui doivent encore signer le document.","pdf-request-file-2":"Cliquez sur l\'un des espaces réservés apparaissant sur le document pour signer. Vous verrez alors des options pour dessiner votre signature, la saisir ou télécharger une image.","pdf-request-file-3":"Cliquez sur les boutons Précédent, Refuser ou Terminer pour parcourir votre document. Utilisez le menu points de suspension pour des options supplémentaires, notamment le bouton Télécharger.","pdf-request-file-4":"Liste des signataires ayant déjà signé le document.","pdf-request-file-5":"Vous pouvez cliquer sur \'Signer automatiquement tout\' pour signer automatiquement à tous les emplacements que vous êtes censé signer. Assurez-vous de lire correctement le document avant de cliquer sur ce bouton.","placeholder-sign-1":"Sélectionnez un destinataire dans cette liste pour ajouter un espace réservé à l\'endroit où il est censé signer. L\'espace réservé apparaîtra de la même couleur que le nom du destinataire une fois que vous le déposerez sur le document.","placeholder-sign-2":"Cliquer sur le bouton \'Ajouter des destinataires\' vous permettra d\'ajouter plus de signataires.","placeholder-sign-3":"Faites glisser ou cliquez sur un champ pour l\'ajouter au document.","placeholder-sign-4":"La zone de contenu PDF affiche déjà les espaces réservés existants du modèle. Pour votre commodité, ces espaces réservés correspondront à la couleur du nom du destinataire, ce qui les rendra facilement identifiables.","placeholder-sign-5":"Cliquer sur \'Envoyer\' enregistrera le document. À l\'étape suivante, vous pourrez personnaliser les e-mails à envoyer aux destinataires ou copier les liens de signature et les partager vous-même avec les destinataires.","report-1":"Cliquez sur le bouton \'Ajouter\' pour créer un nouveau modèle. Les modèles sont des documents réutilisables conçus pour générer rapidement de nouveaux documents avec la même structure et différents signataires. Par exemple, un modèle RH pour l\'intégration peut avoir des rôles prédéfinis tels que \'Responsable RH\' et \' Nouvel employé\'. Chaque fois que vous utilisez le modèle, vous pouvez attribuer le rôle \'Nouvel employé\' à différents membres du personnel entrants, tandis que le rôle \'Responsable RH\' reste constant, facilitant ainsi un processus d\'intégration fluide pour chaque recrue","redirect":"Cliquez sur le bouton \'Utiliser\' pour créer un nouveau document à partir d\'un modèle existant.","bulksend":"Pour créer et envoyer rapidement plusieurs documents à l\'aide d\'un modèle existant, cliquez sur le bouton \'Envoi rapide\'.","option":"Ce menu révèle plus d\'options telles que Modifier et Supprimer. Utilisez le bouton « Modifier » pour ajouter des rôles de signataire, modifier les champs et mettre à jour votre modèle. Les modifications s\'appliqueront à tous les futurs documents créés à partir de ce modèle mais n\'affecteront pas les documents existants. Utilisez le bouton Supprimer, vous pouvez supprimer le modèle ","signyour-self-1":"Sélectionnez et faites glisser vos widgets préférés sur le PDF pour personnaliser votre document avant de le signer. Choisissez les endroits parfaits pour chaque modification afin d\'adapter le document à vos besoins.","signyour-self-2":"Faites glisser et déposer n\'importe où dans cette zone. Vous pourrez la redimensionner et la déplacer plus tard.","template-placeholder-1":"Cliquer sur le bouton \'Ajouter un rôle\' vous permettra d\'ajouter différents rôles de signataire. Vous pourrez attacher des utilisateurs à chaque rôle dans les étapes suivantes.","template-placeholder-2":"Une fois les rôles ajoutés, sélectionnez un rôle dans la liste pour ajouter un espace réservé à l\'endroit où il est censé signer. L\'espace réservé apparaîtra dans la même couleur que le nom du rôle une fois que vous l\'aurez déposé sur le document.","template-placeholder-3":"Faites glisser ou cliquez sur un champ pour l\'ajouter au document.","template-placeholder-4":"Faites glisser l\'espace réservé pour un rôle n\'importe où sur le document. N\'oubliez pas qu\'il apparaîtra dans la même couleur que le nom du destinataire pour une référence facile.","template-placeholder-5":"Cliquer sur \'Suivant\' stockera le modèle actuel. Après l\'enregistrement, vous serez invité à créer un nouveau document à partir de ce modèle si vous le souhaitez.","webhook-1":"Mettez à niveau maintenant pour définir le webhook","Need your Signature":"En cliquant sur cette carte, vous accéderez à la liste des documents en attente de révision.","Out for signatures":"En cliquant sur cette carte, vous accéderez à une liste de documents en attente de signature.","Recent signature requests":"Voici une liste de documents qui attendent votre signature.","Recently sent for signatures":"Il s\'agit d\'une liste de documents que vous avez envoyés à d\'autres parties pour signature.","Drafts":"Il s\'agit de documents que vous avez commencés mais que vous n\'avez pas finalisés pour envoi.","public-template":"Cette vidéo montre comment configurer votre profil public personnalisé, tel que \'https://opensign.me/your-username\'. Vous apprendrez également comment personnaliser votre slogan et rendre vos modèles disponibles pour la signature publique."},"enter-email-plaholder":"Ajoutez une adresse email et appuyez sur Entrée","success-email-alert":"E-mail envoyé avec succès!","expired-doc-title":"Document expiré","expired-on-mssg":"Ce document a expiré le {{expiredDate}} et n\'est plus disponible pour signature.","signature-validate-alert":"Veuillez confirmer que vous avez coché au moins {{minRequiredCount}} cases.","signature-validate-alert-2":"Assurez-vous que ce champ est rempli avec précision et répond à toutes les exigences.","user-name-exist":"le nom d\'utilisateur existe déjà","remaing-users":"Utilisateurs restants","Role":"Rôle","additional-users":"Veuillez acheter des utilisateurs supplémentaires.","Quantity-of-users":"Quantité d\'utilisateurs","Price":"Prix","Total-price-for-next-time":"Prix ​​total pour la prochaine fois","Proceed":"Procéder","Select":"sélectionner","Add-seats":"Ajouter des sièges","format":"format","select-date-format":"Sélectionnez un format de date","quantityofcredits":"Quantité de crédits de prime","remainingcredits":"Crédits premium disponibles :","additional-credits":"Veuillez acheter des crédits premium","remainingcreditshelp":"Utilisez des crédits premium pour la signature de documents API, l\'envoi groupé ou l\'intégration d\'OpenSign sur votre site Web. Il vous reste {{allowedcredits}} crédits inclus et {{addoncredits}} crédits achetés supplémentaires.","quantityofquicksend":"Quantité de Quick send","quotaerrquicksend":"Quota atteint, vous n\'avez pas assez de crédits.","buycredits":"Acheter des crédits premium","rotate-right":"Faire pivoter à droite","rotate-left":"Faire pivoter à gauche","rotate-alert-mssg":"Tous les widgets de cette page seront perdus. Êtes-vous sûr de vouloir continuer ?","templateid":"ID de modèle","bulksendsubcriptionalert":"Veuillez passer au forfait Professionnel ou Équipe pour utiliser Quicksend.","generate-test-token":"Générer jeton de test","regenerate-test-token":"Régénérer le jeton de test","help-test-token":"Ce jeton peut être utilisé pour tester les API au niveau du point de terminaison https://sandbox.opensignlabs.com/api/v1, vous permettant ainsi d\'effectuer un nombre illimité de signatures de documents. Veuillez noter que l\'API sandbox signera vos documents avec des certificats auto-signés, qui peuvent ne pas être reconnus comme valides par Adobe. Une fois vos tests terminés, vous pouvez passer à l’un de nos forfaits payants pour générer un jeton de production.","help-api-token":"Ce jeton peut être utilisé pour accéder aux API de production au point de terminaison {{origin}}/api/v1. Il ne peut être généré que sur l\'un de nos forfaits payants.","Add-Webhook":"Ajouter Webhook","quotamailinfohead":"Limite mensuelle d\'e-mails de signatures de demandes","quotamailinfo":"Vous pouvez envoyer jusqu\'à 15 e-mails de demande de signature chaque mois. Mettez à niveau maintenant pour envoyer directement des demandes de signature illimitées.","quotamail":"Vous avez atteint votre limite de 15 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.","quotamailTip":"Astuce : Vous pouvez toujours signer un nombre <1>illimité de documents en partageant manuellement les liens de demande de signature.","quotamailhead":"Quota atteint","unauthorized-modal":"Vous n\'êtes pas autorisé à effectuer cette action, veuillez contacter {{adminName}}<{{adminEmail}}>."}'); +module.exports = /*#__PURE__*/JSON.parse('{"header-news":"Nouvelle fonctionnalité : les profils publics sont désormais en ligne ! Créez et partagez facilement des modèles publics","header-news-btn":"Configurer maintenant","create-account":"Créer un compte","login":"Se Connecter","language":"Langue","name":"Nom et Prénom","phone":"Téléphone","phone-optional":"(facultatif)","email":"E-mail","company":"Organisation","job-title":"Votre Fonction","profile":"Profil","is-email-verified":"L\'e-mail est-il vérifié","log-out":"Déconnexion","public-profile":"Profil public","tagline":"Slogan","has-requested-you-to-sign":" vous a demandé de signer","has-requested-you-to-review-and-sign":"vous a demandé de consulter et de signer","input-required":"Veuillez remplir ce champ.","sort-order":{"Ascending":"Ascendant","Descending":"Descendant","Name":"Nom et Prénom","Date":"Date"},"context-menu":{"Download":"Télécharger","Rename":"Renommer","Move":"Se déplacer","Delete":"Supprimer"},"action":"Action","add":"Ajouter","add-new-folder":"Ajouter un nouveau dossier","disable-documentId":"Désactiver l\'ID du document","edit":"Modifier","change-password":"Changer votre mot de passe","save":"Sauvegarder","cancel":"Annuler","upgrade-now":"Mettre à jour maintenant","upgrade-to":"Mettre à niveau vers","pro":"PRO","plan":"Offre","subscribe-card-teamplan":"Libérez toute la puissance de la collaboration ! Créez un nombre illimité d\'organisations, d\'équipes et de hiérarchies. Partagez des modèles de manière transparente entre les équipes et attribuez des rôles d\'utilisateur personnalisés. Améliorez votre flux de travail dès aujourd\'hui !","subscribe-card-plan":"Débloquez des fonctionnalités premium à partir de seulement {{premiumPrice}}/mois. Bénéficiez de performances améliorées et de seulement {{addonPrice}} par crédit supplémentaire après vos crédits premium inclus.","user-name-limit-char":"Pour avoir un nom d\'utilisateur de moins de 8 caractères s\'il vous plaît s\'abonner","tour-content":"Ne plus afficher","team":"Équipe","docs":"Documents","session-expired":"Votre session a expiré.","user":"Utilisateur","public-profile-help":"Il s\'agit de votre URL publique. Copiez-le ou partagez-le avec le signataire et vous pourrez voir tous vos modèles définis publiquement.","tagline-help":"Ce surnom apparaîtra sur votre profil public OpenSign par exemple. https://opensign.me/alex","welcome":"Content de te revoir!","Login-to-your-account":"Se connecter à son compte","password":"Mot de passe","forgot-password":"Mot de passe oublié?","loading":"Chargement...","of":"de","sign-SSO":"Connectez-vous avec SSO","login-page":"Page de connexion","or":"OU","signup-page":"Page d\'inscription","password-length":"Le mot de passe doit être de plus de 8 caractères","password-case":"Le mot de passe doit contenir une lettre majuscule, minuscule et un chiffre ","password-special-char":"Le mot de passe doit contenir un caractère spécial","agreee":"Je suis d\'accord avec le","term":"Conditions d\'utilisation","subscribe-to-opensign":"Abonnez-vous à la newsletter OpenSign","register":"S\'enregistrer ","sidebar":{"Dashboard":"Tableau de bord","Sign yourself":"signez vous-même","Request signatures":"Demander des signatures","Templates":"Modèles","Templates-Children":{"Create template":"Créer un modèle","Manage templates":"Gérer les modèles"},"OpenSign™ Drive":"Lecteur OpenSign™","Reports":"Rapports","Reports-Children":{"Need your sign":"Besoin de votre signature","In Progress":"En cours","Completed":"Complété","Drafts":"Brouillons","Declined":"Signature refusé","Expired":"Expiré","Contactbook":"Carnet de contacts"},"Settings":"Paramètres","Settings-Children":{"My Signature":"Ma signature","API Token":"Jeton API","Webhook":"Webhook","Teams":"Équipe","Team-update-successfully":"Équipe mise à jour avec succès.","Users":"Utilisateurs"}},"dashboard-card":{"Need your Signature":"Besoin de votre signature","Out for signatures":"En attente de Signature"},"report-name":{"Draft Documents":"Brouillons","Need your sign":"Besoin de votre signature","In-progress documents":"Documents en cours","Completed Documents":"Documents complétés","Declined Documents":"Documents refusés","Expired Documents":"Documents expirés","Recently sent for signatures":"Récemment envoyé pour signature","Recent signature requests":"Demandes de signature récentes","Drafts":"Brouillons","Contactbook":"Carnet de contacts","Templates":"Modèles","Teams":"Équipe","Users":"Utilisateurs"},"report-heading":{"Sr.No":"Numéro","Title":"Titre","Email":"E-mail","Phone":"Téléphone","File":"Fichier","Owner":"Propriétaire","Signers":"Signataires","Note":"Note","Folder":"Dossier","Reason":"Raison","Parent Team":"Équipe de parents","Active":"Actif","Role":"Rôle","Team":"Équipe","Name":"Nom","Status":"Statut","created-date":"Date de création","Type":"Saisir"},"btnLabel":{"sign":"Signer","Resend":"Relancer","Revoke":"Révoquer","Delete":"Supprimer","Use":"Utiliser","Quick send":"Envoi rapide","Edit":"Modifier","Share with team":"Partager avec l\'équipe","Share":"Partager","View":"Voir","option":"Option","Embed":"Intégrer"},"report-help":{"Draft Documents":"Il s\'agit de documents que vous avez commencés mais que vous n\'avez pas finalisés pour envoi.","Need your sign":"Voici une liste de documents ou votre signature est requise","In-progress documents":"Il s\'agit d\'une liste de documents que vous avez envoyés à d\'autres parties pour signature.","Completed Documents":"Il s\'agit d\'une liste de documents signés par toutes les parties.","Declined Documents":"Il s\'agit d\'une liste de documents qui ont été refusés par l\'un des signataires.","Expired Documents":"Il s\'agit d\'une liste de documents qui ont atteint leur date d\'expiration.","Contactbook":"Il s\'agit d\'une liste de contacts/signataires que vous avez ajoutés. Ceux-ci apparaîtront sous forme de suggestions lorsque vous tenterez d\'ajouter des signataires à un nouveau document.","Templates":"Il s\'agit d\'une liste de modèles à votre disposition pour créer des documents. Vous pouvez cliquer sur le bouton \'Utiliser\' pour créer un nouveau document à l\'aide d\'un modèle, modifier le document et ajouter des signataires à l\'étape suivante."},"form-name":{"Sign Yourself":"signez vous-même","Request Signatures":"Demander des signatures","New Template":"Nouveau modèle"},"file-type":"pdf, png, jpg, jpeg","docx":"docx","file-selected":"fichier sélectionné","template-title":"Titre du modèle","document-title":"Titre du document","description":"Description","time-to-complete":"Temps de réalisation (jours)","send-in-order":"Envoyer dans l\'ordre ?","send-in-order-help":{"p1":"Choisissez la manière dont vous souhaitez que les demandes de signature soient envoyées aux signataires du document :","p2":"La sélection de cette option enverra initialement la demande de signature au premier signataire. Une fois que le premier signataire a terminé sa partie, le prochain signataire de la séquence recevra la demande. Ce processus se poursuit jusqu\'à ce que tous les signataires aient signé le document. Cette méthode garantit que le document est signé dans un ordre spécifique.","p3":"La sélection de cette option enverra les liens de signature à tous les signataires simultanément. Chaque signataire peut signer le document à sa convenance, que d\'autres signataires aient ou non complété leur signature. Cette méthode est plus rapide mais n’impose aucun ordre de signature entre les participants.","p4":"Sélectionnez l\'option qui correspond le mieux aux besoins de votre traitement de documents."},"no":"Non","auto-reminder":"Rappel automatique","remind-once":"Rappeler une fois tous les (jours)","next":"Suivant","select-folder":"Sélectionner le dossier","OpenSign-drive":"Lecteur OpenSign™","drive-document-status":{"Completed":"Complété","Declined":"Refuser","Draft":"Brouillon","Expired":"Expiré","In Progress":"En cours"},"select-folder-help":"Si vous ne sélectionnez pas de dossier, votre document signé sera enregistré dans le dossier du lecteur principal OpenSign.","no-data":"Aucune données disponible","save-here":"Enregistrer ici","back":"Retour","add-folder":"Ajouter le dossier","create-folder":"Créer le dossier","parent-folder":"Dossier Parent","create":"Créer","signers":"Signataires","signers-help":"Commencez à saisir le nom d\'un contact pour voir les signataires suggérés par vos contacts enregistrés ou en ajouter de nouveaux. Organisez l\'ordre de signature en ajoutant des signataires dans l\'ordre souhaité. Utilisez le bouton « + » pour inclure les signataires et le « x » pour les supprimer. Chaque signataire recevra un e-mail invité à signer le document dans l\'ordre indiqué.","add-signer":"Ajouter un signataire","contact-not-found":"Contact introuvable","add-yourself":"Ajoutez-vous","submit":"Soumettre","reset":"Réinitialiser","my-signature":"Ma signature","signature":"Signature","upload-image":"Télécharger une image","clear":"Vider","upload-signature/Image":"télécharger-signature/Image","initials":"Initiales","API":"API","api-token":"Jeton API","regenerate-token":"Régénérer en direct jeton","generate-token":"Générer en direct jeton","view-docs":"Afficher les documents","generate-token-alert":"Êtes-vous sûr de vouloir régénérer le jeton, votre ancien jeton sera supprimer?","yes":"Oui","copied":"Copié","wrong-mssg":"Quelque chose c\'est mal passé. Merci d\'essayer plus tard.","token-generated":"Jeton généré avec succès.","webhook":"Webhook","update-webhook":"Mettre à jour le webhook","add-webhook":"Ajouter un webhook","webhook-added":"Webhook ajouté avec succès.","team-disabled":"Équipe: Désactivée","team-enabled":"Équipe activée","are-you-sure":"Êtes-vous sûr de vouloir","disable":"désactiver","enable":"activer","this-team":"cette équipe?","edit-team":"Modifier l\'équipe","name-of-team":"Nom de l\'équipe","prev":"précédent","no-data-avaliable":"pas de données disponibles","add-team":"Ajouter une équipe","page-not-found":"Page non trouvée","users-from-teams":"utilisateurs de votre Équipe","user-status":"Statut de l\'utilisateur","activate":"Activer","deactivate":"désactiver","this-user":"cet utilisateur ","delete-user":"Supprimer l\'utilisateur","delete":"supprimer","add-user":"Ajouter un utilisateur","password-generateed":"Le mot de passe ne sera généré qu\'une seule fois ; assurez-vous de le copier.","Team status":"Statut de l\'équipe","user-deactivated":"Utilisateur désactivé.","user-activated":"Activé par l\'utilisateur.","public":"Public","download":"Téléchargement","view":"voir","make-template-public":"Rendre le modèle public","make-template-private":"Rendre le modèle privé","make-template-public-alert":"Êtes-vous sûr de vouloir rendre ce modèle public ?","make-template-private-alert":"Êtes-vous sûr de vouloir rendre ce modèle privé ? Cela le supprimera de votre profil public.","public-role":"Rôle public","public-url":"URL publique","public-url-copy-mssg":"Voici votre URL publique : copiez-la ou partagez-le avec le signataire et vous pouvoir voir tous vos paramètres publics modèles.","add-public-url-alert":"Veuillez ajouter votre URL publique et vous pourra rendre public modèle.","share-with-alert":"Vous ne pouvez pas partager un modèle si des contacts sont déjà attribués à des rôles. Veuillez supprimer toutes les attributions de contacts des rôles avant de partager le modèle.","share-with":"Partager avec","team-not-found":"Équipe introuvable","roles":"Les rôles","delete-document":"Supprimer un document","delete-document-alert":"Êtes-vous sûr de vouloir supprimer ce document ?","quick-send":"Envoi rapide","add-new":"Ajouter un nouveau","send":"envoyer","quick-send-alert-1":"Tous les rôles dans ce document sont actuellement liés à des contacts. Pour envoyer rapidement des copies de ce modèle à plusieurs signataires, veuillez vous assurer qu\'au moins un rôle n\'est lié à aucun contact.","quick-send-alert-2":"Veuillez vous assurer qu\'au moins un widget de signature est ajouté pour tous les destinataires.","quick-send-alert-3":"Veuillez ajouter au moins un rôle à ce modèle afin d\'en « envoyer rapidement » des copies à plusieurs signataires.","quick-send-alert-4":"L\'envoi rapide a atteint la limite.","copy-link":"Copier le lien","copy":"Copier","revoke-document":"Révoquer le document","revoke-document-alert":"Êtes-vous sûr de vouloir révoquer ce document ?","resend-mail":"Renvoyer le courrier","resend-mail-help":"Vous pouvez utiliser les variables suivantes qui seront remplacées par leurs valeurs réelles : - {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email} }, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.","subject":"Sujet","body":"Corps","add-contact":"Ajouter le contact","add-signer-alert":"Le contact existe déjà !","record-delete-alert":"Enregistrement supprimé avec succès !","record-revoke-alert":" Enregistrement révoqué avec succès ! ","mail-sent-alert":"Courriel envoyé avec succès.","document-sent-alert":"Document envoyé avec succès !","template-share-alert":"Modèle partagé avec succès.","template-public-alert-1":"Vous avez rendu le modèle public avec succès.","template-public-alert-2":"Vous avez réussi à rendre le modèle privé.","template-public-alert-3":"Vous devez sélectionner un rôle pour les signataires publics.","template-public-alert-4":"Veuillez vous assurer qu\'au moins un widget de signature est ajouté pour tous les signataires.","template-public-alert-5":"Étant donné que l\'envoi dans l\'ordre est activé sur ce modèle, le rôle public doit être positionné en haut.","template-public-alert-6":"Veuillez associer des signataires à tous les rôles, à l\'exception du rôle d\'utilisateur public.","template-public-alert-7":"Veuillez attribuer au moins un rôle public pour rendre ce modèle public.","loader":"Cela pourrait prendre un certain temps","pages":"Pages","document-signed":"Document signé","close":"Fermer","validation-alert":"Alerte de validation","validate-alert-mssg":"L\'entrée ne répond pas aux critères définis par l\'expression régulière.","otp-verification":"Vérification OTP","enter-otp":"Entrez OTP","verify":"Vérifier","verify-email-1":"Vérifier l\'e-mail","resend":"Renvoyer","contact-details":"Coordonnées","verify-email":"Veuillez vérifier votre email!","send-otp":"envoyer un code à usage unique","otp-placeholder":"Entrez le code de vérification reçu par e-mail","loading-doc":"Chargement du document..","widgets-name":{"signature":"signature","stamp":"tampon","initials":"initiales","name":"nom et Prénom","job title":"votre fonction","company":"organisation","date":"date","text":"texte","text input":"saisie de texte","checkbox":"case à cocher","dropdown":"dérouler","radio button":"bouton radio","image":"image","email":"e-mail"},"fields":"Des champs","recipients":"Destinataires","please-add":"Veuillez ajouter un","signed-by":"Signé par","more":"plus","sent":"Envoyé","print":"imprimer","certificate":"Certificat","decline":"refusé","finish":"terminé","mail":"Mail","sign-now":"Signez maintenant","successfully-signed":"Signé avec succès !","email-mssg":"Les destinataires ajoutés ici recevront une copie du document signé.","email-error-1":"veuillez fournir une adresse e-mail correcte","email-error-2":"Vous ne pouvez envoyer qu\'à dix destinataires à la fois.","Email-verified-alert-1":"L\'e-mail est vérifié.","Email-verified-alert-2":"L\'e-mail est déjà vérifié.","upload-stamp-image":"Télécharger l\'image du tampon","draw":"Dessiner","type":"Taper","color-type":{"red":"rouge","blue":"bleu","black":"noir","yellow":"jaune"},"my-initials":"Mes initiales","upload":"Télécharger","initial-teb":"Initiales","signature-tab":"Signature","your-signature":"Votre signature","copy-title":"Copier le widget vers","contact-delete-alert":"Êtes-vous sûr de vouloir supprimer ce contact ?","reset-password":"Le lien de réinitialisation du mot de passe a été envoyé à votre identifiant de messagerie","reset-password-alert-2":"Veuillez configurer l\'adaptateur de messagerie","reset-password-alert-3":"Réinitialisez votre mot de passe","faild-animation":"Échec du chargement de l\'animation","apply":"Appliquer","copy-type":{"All pages":"Toutes les pages","All pages but last":"Toutes les pages sauf la dernière","All pages but first":"Toutes les pages sauf la première","Next to current widget":"À côté du widget actuel"},"options":"Possibilités","minimun-check":"Vérification minimale","maximum-check":"Contrôle maximum","default-value":"Valeur par défaut","select":"Sélectionner","read-only":"Est en lecture seule","hide-labels":"Masquer les étiquettes","checkbox":"Case à cocher","alert":"Alerte","zoom-in":"Agrandir","zoom-out":"Dézoomer","document-signed-alert":"Félicitations ! 🎉 Votre document à bien été signer!","otp-sent-alert":"Le code OTP a bien été envoyer sur votre adresse Email","fields-required":"Champs obligatoires","signature-widget-alert-1":"Veuillez vous assurer qu\'au moins un widget de signature a été ajouté","signature-widget-alert-2":"Veuillez vous assurer que tous les champs sont remplis avec précision et répondent à toutes les exigences.","encrypted-pdf-alert":"Les fichiers PDF actuellement cryptés ne sont pas pris en charge.","encrypted-pdf-alert-1":"Le mot de passe du fichier PFX n\'est pas valide.","user-not-exist":"L\'utilisateur n\'existe pas","template-signature-field":"Veuillez ajouter au moins un champ de signature pour tous les rôles.","template-role-alert":"Veuillez d\'abord ajouter des rôles","create-document":"Créer un document","template-created-alert":"Voulez-vous créer un document en utilisant le modèle que vous vient de créer ?","signers-alert":"alerte des signataires","template-creation-alert-1":"Veuillez sélectionner le signataire pour ajouter un espace réservé !","ok":"D\'accord","radio-group":"Groupe de radio","dropdown-options":"Options déroulantes","add-role":"Ajouter un rôle","role-ex":"Ex : Client, RH, Directeur, Manager, Étudiant, etc.","add/choose-signer":"Ajouter/Choisir un signataire","choose-from-contacts":"Choisissez parmis les contacts","select-signer":"Veuillez sélectionner le signataire","edit-template":"Modifier le modèle","widget-info":"Informations sur les widgets","validation":"Validation","invalid-default-value":"valeur par défaut invalide","hint":"Indice","color":"couleur","role-help":{"p1":"Que sont les rôles modèles ?","p2":"Commencez par spécifier chaque rôle nécessaire à la finalisation du document. Pensez aux parties impliquées dans le processus de signature et à leurs responsabilités. Les rôles courants incluent les RH pour les documents internes, le Client pour les accords ou le Fournisseur pour les accords commerciaux.","p3":"Pourquoi pré-attacher les utilisateurs à certains rôles ?","p4":"Pour les rôles qui impliquent systématiquement la même personne (par exemple, la signature du PDG sur les lettres d\'offre des employés), vous pouvez pré-attacher un utilisateur à un rôle dans le modèle. Cette étape est facultative mais recommandée pour des raisons d\'efficacité et de cohérence entre les documents.","p5":"Quand dois-je spécifier l\'utilisateur attaché à chaque rôle ?","p6":"Lorsque vous créez un document à partir de votre modèle, vous serez invité à attacher des utilisateurs à chaque rôle défini. Si un rôle est déjà associé à un utilisateur, celui-ci sera pré-rempli, mais vous pourrez le modifier si nécessaire avant d\'envoyer le document."},"add-recipients":"Ajouter des destinataires","loading-mssg":"Cela pourrait prendre du temps","send-mail":"Envoyer un mail","placeholder-alert-1":"Veuillez vous assurer qu\'au moins un widget de signature est ajouté pour tous les destinataires.","placeholder-alert-2":"Veuillez confirmer que vous avez rempli le champ de texte.","placeholder-alert-3":"Etes-vous sûr de vouloir envoyer ce document pour signature ? ","placeholder-alert-4":"Vous avez envoyé avec succès des mails à tous les","placeholder-alert-5":"Voulez-vous signer des documents maintenant ?","placeholder-alert-6":"Veuillez configurer l\'adaptateur de messagerie pour envoyer du courrier !","placeholder-alert-7":"Veuillez sélectionner le signataire pour ajouter un espace réservé !","email-subject":"Sujet du courriel","email-body":"corps de l\'e-mail","email-placeholder":"Ajouter le corps de l\'e-mail","reset-to-default":"Réinitialiser aux valeurs par défaut","cutomize-email":"Personnaliser l\'e-mail","upgrade-to-customize-email":"Mise à niveau pour personnaliser l\'e-mail","sign-url":"Signer l\'URL","Mails Sent":"Mails envoyés avec succès !","document-alert":"Alerte document","owner-subscription-expired":"L\'abonnement du propriétaire a expiré.","subscription-expired":"Abonnement expiré","alert-message":"Message d\'alerte","document-decline":"Document-refusé","decline-alert-1":"Etes-vous sûr de vouloir refuser ce document ?","decline-alert-2":"Vous avez refusé ce document !","decline-alert-3":"Vous ne pouvez pas signer ce document car il a été refusé/révoqué.","sign here":"Signer ici","guest-email-alert":"le code de vérification a été envoyé sur votre e-mail","get-otp-alert":"vous recevrez un code de vérification par e-mail","user-already-exist":"L\'utilisateur existe déjà.","server-error":"Erreur interne du serveur !","fill-required-details!":"Veuillez remplir les informations requises !","sign-up-form":"Formulaire d\'inscription","sign-up":"S\'inscrire","folder-already-exist!":"le dossier existe déjà !","please-select-position!":"Veuillez sélectionner un poste !","default-sign-alert":"Êtes-vous sûr de vouloir vous connecter automatiquement à tous les emplacements demandés ? ","Your-Signature":"Votre signature","auto-sign-all":"Tout signer automatiquement","generating-certificate":"Génération du certificat","pdf-download":"Téléchargement PDF","generate-certificate-alert":" Votre certificat d\'achèvement est en cours de génération. Veuillez patienter quelques instants. Si le téléchargement ne démarre pas sous peu, cliquez à nouveau sur le bouton. ","folder-already-exist":"Le dossier existe déjà !","folder-created-successfully":"Dossier créé avec succès !","fill-folder-name":"Veuillez indiquer le nom du dossier","already-exists-this-username":"Un utilisateur existe déjà avec ce nom d\'utilisateur !","verification-code-sent":"Un e-mail de vérification a été envoyé à votre adresse e-mail !","registered-user-successfully":"Utilisateur enregistré avec succès.","role-not-found":"Rôle introuvable.","do-not-access":"Vous n\'y avez pas accès, veuillez contacter l\'administrateur.","add-admin":"Ajouter un administrateur","opensign-setup":"Configuration d\'OpenSign","join-discord":"Rejoignez notre serveur Discord","admin-already-exist":"L\'administrateur existe déjà.","password-update-alert-1":"Mot de passe mis à jour avec succès.","password-update-alert-2":"Votre mot de passe actuel est manquant ou incorrect.","password-update-alert-3":"Votre mot de passe actuel est manquant ou incorrect.","password-update-alert-4":"Votre mot de passe et votre mot de passe de confirmation ne correspondent pas.","current-password":"mot de passe actuel","new-password":"nouveau mot de passe","confirm-password":"Confirmez le mot de passe","file-alert-1":"La taille du fichier sélectionné est trop grande. Veuillez sélectionner un fichier inférieur à","file-alert-2":"Veuillez sélectionner un fichier.","file-alert-3":"Veuillez patienter pendant le téléchargement du document.","enter-pdf-password":"Entrez le mot de passe PDF","correct-password":"Veuillez fournir un mot de passe correct","decrypting-pdf":"Décryptage du pdf, veuillez patienter...","invalid-otp":"OTP invalide","user-not-found":"Utilisateur non trouvé!","enter-otp-alert":"Veuillez saisir OTP !","get-verification-code":"Obtenir le code de vérification","get-verification-code-2":"Vous recevrez un code de vérification par e-mail","enter-verification-code":"Entrez le code de vérification","provide-your-details":"Fournissez vos coordonnées","provide-email":"Veuillez fournir un e-mail.","additional-info":"Information additionnelle","signature-saved-alert":"Signature enregistrée avec succès.","fill-field":"Veuillez remplir ce champ","error-template":"Erreur : modèle introuvable ! ","error":"Erreur","invalid-document":"Erreur : document invalide !","document-not-found":"Document introuvable !","document-signed-alert-1":"Vous avez signé le document avec succès. Vous pouvez télécharger ou imprimer une copie du document partiellement signé. Une copie du document signé numériquement sera envoyée au propriétaire par e-mail une fois qu\'il sera signé par tous les signataires.","encrypted-pdf-not-support":"Les fichiers PDF actuellement cryptés ne sont pas pris en charge. ","document-signed-alert-4":"Toutes nos félicitations! 🎉 Ce document a été signé avec succès par tous les participants !","document-signed-alert-5":"Ce document a été signé par tous les signataires.","document-signed-alert-6":"Ce document a été refusé par un ou plusieurs destinataire(s).","document-signed-alert-7":"Ce document n\'est plus disponible.","document-signed-alert-8":"Le document a déjà été envoyé pour signature.","yet-to-sign":"Reste à signer","validation-alert-1":"L\'entrée ne répond pas aux critères définis par l\'expression régulière.","account-already-exists":"Le compte existe déjà!","choose-password":"Choisissez un mot de passe","enter-password":"Entrer le mot de passe","sure":"bien sûr","subscribed-alert":"Vous êtes déjà abonné au forfait !","monthly":"Mensuel","yearly-upto":"Annuel (jusqu\'à 66 % de réduction)","billed-yearly":"Facturé annuellement","billed-monthly":"Facturé mensuellement","plansubscription-1":"Hébergez-le vous-même gratuitement","visit-github":"Visitez Github","user-already-exist-name":"Un utilisateur existe déjà avec ce nom d\'utilisateur !","do-not-access-contact-admin":"Vous n\'y avez pas accès, veuillez contacter l\'administrateur.","filed-required-correctly":"Veuillez remplir correctement les informations requises.","admin-created":"Administrateur créé","invalid-masterkey":"Clé principale invalide","opensign-Setup":"Configuration d\'OpenSign","master-key":"La clef maitresse","profile-update-alert":"Mise à jour du profil réussie.","date":"Date","report-not-found":"Rapport introuvable","please-wait":"S\'il vous plaît, attendez","select-foler":"Sélectionner le dossier","generated-on":"Généré le","text-field":"Champ de texte","font-size":"Taille de police","widget-status":{"Required":"Requis","Optional":"Facultative"},"all-right":"Tous droits réservés","version":"version","social-media":{"github":"Github","linked-in":"LinkedIn","twitter":"Twitter","discord":"Discorde"},"tour-mssg":{"home-layout-1":"Vous vous êtes connecté avec succès ! Jetons un coup d\'oeil.","home-layout-2":"Pour télécharger des documents à auto-signature ou pour demander la signature d\'autres personnes, sélectionnez simplement les boutons correspondants.","home-layout-3":"Vous êtes prêt à commencer à utiliser OpenSign ! Si vous avez besoin d\'aide, n\'hésitez pas à nous contacter.","generate-token":"Effectuez la mise à niveau maintenant pour générer un jeton API de production.","opensign-drive-1":"Cliquez sur les liens du fil d\'Ariane pour naviguer facilement dans la hiérarchie des dossiers et afficher les documents dans chaque dossier.","opensign-drive-2":"Cliquez sur le bouton Ajouter pour créer un nouveau dossier ou document.","opensign-drive-3":"Triez vos documents par date ou par nom à l\'aide de ce menu.","opensign-drive-4":"Cliquez sur ce menu pour afficher les documents sous forme de liste.","opensign-drive-5":"La liste des documents s\'affiche selon l\'option de tri sélectionnée. Les icônes à côté de chaque document indiquent son état actuel.","opensign-drive-6":"Faites un clic droit sur un document pour voir les options telles que Télécharger, Renommer, Déplacer et Supprimer. Cliquez sur le document pour l\'ouvrir.","opensign-drive-7":"Faites un clic droit sur n\'importe quel dossier pour voir les options. Choisissez \'Renommer\' pour changer le nom du dossier ou cliquez sur le dossier pour naviguer dans son contenu.","pdf-request-file-1":"Liste des signataires qui doivent encore signer le document.","pdf-request-file-2":"Cliquez sur l\'un des espaces réservés apparaissant sur le document pour signer. Vous verrez alors des options pour dessiner votre signature, la saisir ou télécharger une image.","pdf-request-file-3":"Cliquez sur les boutons Précédent, Refuser ou Terminer pour parcourir votre document. Utilisez le menu points de suspension pour des options supplémentaires, notamment le bouton Télécharger.","pdf-request-file-4":"Liste des signataires ayant déjà signé le document.","pdf-request-file-5":"Vous pouvez cliquer sur \'Signer automatiquement tout\' pour signer automatiquement à tous les emplacements que vous êtes censé signer. Assurez-vous de lire correctement le document avant de cliquer sur ce bouton.","placeholder-sign-1":"Sélectionnez un destinataire dans cette liste pour ajouter un espace réservé à l\'endroit où il est censé signer. L\'espace réservé apparaîtra de la même couleur que le nom du destinataire une fois que vous le déposerez sur le document.","placeholder-sign-2":"Cliquer sur le bouton \'Ajouter des destinataires\' vous permettra d\'ajouter plus de signataires.","placeholder-sign-3":"Cliquez sur ce bouton pour ajouter plus de destinataires/signataires au document","placeholder-sign-4":"Faites glisser ou cliquez sur un champ pour l\'ajouter au document.","placeholder-sign-5":"La zone de contenu PDF affiche déjà les espaces réservés existants du modèle. Pour votre commodité, ces espaces réservés correspondront à la couleur du nom du destinataire, ce qui les rendra facilement identifiables.","placeholder-sign-6":"Cliquer sur \'Envoyer\' enregistrera le document. À l\'étape suivante, vous pourrez personnaliser les e-mails à envoyer aux destinataires ou copier les liens de signature et les partager vous-même avec les destinataires.","report-1":"Cliquez sur le bouton \'Ajouter\' pour créer un nouveau modèle. Les modèles sont des documents réutilisables conçus pour générer rapidement de nouveaux documents avec la même structure et différents signataires. Par exemple, un modèle RH pour l\'intégration peut avoir des rôles prédéfinis tels que \'Responsable RH\' et \' Nouvel employé\'. Chaque fois que vous utilisez le modèle, vous pouvez attribuer le rôle \'Nouvel employé\' à différents membres du personnel entrants, tandis que le rôle \'Responsable RH\' reste constant, facilitant ainsi un processus d\'intégration fluide pour chaque recrue","redirect":"Cliquez sur le bouton \'Utiliser\' pour créer un nouveau document à partir d\'un modèle existant.","bulksend":"Pour créer et envoyer rapidement plusieurs documents à l\'aide d\'un modèle existant, cliquez sur le bouton \'Envoi rapide\'.","option":"Ce menu révèle plus d\'options telles que Modifier et Supprimer. Utilisez le bouton « Modifier » pour ajouter des rôles de signataire, modifier les champs et mettre à jour votre modèle. Les modifications s\'appliqueront à tous les futurs documents créés à partir de ce modèle mais n\'affecteront pas les documents existants. Utilisez le bouton Supprimer, vous pouvez supprimer le modèle ","signyour-self-1":"Sélectionnez et faites glisser vos widgets préférés sur le PDF pour personnaliser votre document avant de le signer. Choisissez les endroits parfaits pour chaque modification afin d\'adapter le document à vos besoins.","signyour-self-2":"Faites glisser et déposer n\'importe où dans cette zone. Vous pourrez la redimensionner et la déplacer plus tard.","template-placeholder-1":"Cliquer sur le bouton \'Ajouter un rôle\' vous permettra d\'ajouter différents rôles de signataire. Vous pourrez attacher des utilisateurs à chaque rôle dans les étapes suivantes.","template-placeholder-2":"Une fois les rôles ajoutés, sélectionnez un rôle dans la liste pour ajouter un espace réservé à l\'endroit où il est censé signer. L\'espace réservé apparaîtra dans la même couleur que le nom du rôle une fois que vous l\'aurez déposé sur le document.","template-placeholder-3":"Faites glisser ou cliquez sur un champ pour l\'ajouter au document.","template-placeholder-4":"Faites glisser l\'espace réservé pour un rôle n\'importe où sur le document. N\'oubliez pas qu\'il apparaîtra dans la même couleur que le nom du destinataire pour une référence facile.","template-placeholder-5":"Cliquer sur \'Suivant\' stockera le modèle actuel. Après l\'enregistrement, vous serez invité à créer un nouveau document à partir de ce modèle si vous le souhaitez.","webhook-1":"Mettez à niveau maintenant pour définir le webhook","Need your Signature":"En cliquant sur cette carte, vous accéderez à la liste des documents en attente de révision.","Out for signatures":"En cliquant sur cette carte, vous accéderez à une liste de documents en attente de signature.","Recent signature requests":"Voici une liste de documents qui attendent votre signature.","Recently sent for signatures":"Il s\'agit d\'une liste de documents que vous avez envoyés à d\'autres parties pour signature.","Drafts":"Il s\'agit de documents que vous avez commencés mais que vous n\'avez pas finalisés pour envoi.","public-template":"Cette vidéo montre comment configurer votre profil public personnalisé, tel que \'https://opensign.me/your-username\'. Vous apprendrez également comment personnaliser votre slogan et rendre vos modèles disponibles pour la signature publique."},"enter-email-plaholder":"Ajoutez une adresse email et appuyez sur Entrée","success-email-alert":"E-mail envoyé avec succès!","expired-doc-title":"Document expiré","expired-on-mssg":"Ce document a expiré le {{expiredDate}} et n\'est plus disponible pour signature.","signature-validate-alert":"Veuillez confirmer que vous avez coché au moins {{minRequiredCount}} cases.","signature-validate-alert-2":"Assurez-vous que ce champ est rempli avec précision et répond à toutes les exigences.","user-name-exist":"le nom d\'utilisateur existe déjà","remaing-users":"Utilisateurs restants","Role":"Rôle","additional-users":"Veuillez acheter des utilisateurs supplémentaires.","Quantity-of-users":"Quantité d\'utilisateurs","Price":"Prix","Total-price-for-next-time":"Prix ​​total pour la prochaine fois","Proceed":"Procéder","Select":"sélectionner","Add-seats":"Ajouter des sièges","format":"format","select-date-format":"Sélectionnez un format de date","quantity-of-credits":"Quantité de crédits de prime","remaining-credits":"Crédits premium disponibles :","additional-credits":"Veuillez acheter des crédits premium","remaining-credits-help":"Utilisez des crédits premium pour la signature de documents API, l\'envoi groupé ou l\'intégration d\'OpenSign sur votre site Web. Il vous reste {{allowedcredits}} crédits inclus et {{addoncredits}} crédits achetés supplémentaires.","quota-err-quicksend":"Quota atteint, vous n\'avez pas assez de crédits.","buy-credits":"Acheter des crédits premium","rotate-right":"Faire pivoter à droite","rotate-left":"Faire pivoter à gauche","rotate-alert-mssg":"Tous les widgets de cette page seront perdus. Êtes-vous sûr de vouloir continuer ?","templateid":"ID de modèle","bulk-send-subcription-alert":"Veuillez passer au forfait Professionnel ou Équipe pour utiliser Quicksend.","generate-test-token":"Générer jeton de test","regenerate-test-token":"Régénérer le jeton de test","help-test-token":"Ce jeton peut être utilisé pour tester les API au niveau du point de terminaison https://sandbox.opensignlabs.com/api/v1, vous permettant ainsi d\'effectuer un nombre illimité de signatures de documents. Veuillez noter que l\'API sandbox signera vos documents avec des certificats auto-signés, qui peuvent ne pas être reconnus comme valides par Adobe. Une fois vos tests terminés, vous pouvez passer à l’un de nos forfaits payants pour générer un jeton de production.","help-api-token":"Ce jeton peut être utilisé pour accéder aux API de production au point de terminaison {{origin}}/api/v1. Il ne peut être généré que sur l\'un de nos forfaits payants.","reason":"Raison","decline-by":"Refusé/révoqué par","document-declined":"document refusé","quota-mail-info-head":"Limite mensuelle d\'e-mails de signatures de demandes","quota-mail-info":"Vous pouvez envoyer jusqu\'à 15 e-mails de demande de signature chaque mois. Mettez à niveau maintenant pour envoyer directement des demandes de signature illimitées.","quota-mail":"Vous avez atteint votre limite de 15 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.","quota-mail-tip-tip":"Astuce : Vous pouvez toujours signer un nombre <1>illimité de documents en partageant manuellement les liens de demande de signature.","quota-mail-head":"Quota atteint","unauthorized-modal":"Vous n\'êtes pas autorisé à effectuer cette action, veuillez contacter {{adminEmail}}.","sent-this-month":"envoyé ce mois-ci","available-seats":"Disponible sièges","buy-users":"Acheter plus d\'utilisateurs","isenable-otp":"Activer la vérification OTP","isenable-otp-help":{"p1":"Souhaitez-vous activer le processus de vérification à l\'aide d\'un mot de passe à usage unique (OTP)?","p2":"La sélection de cette option activera la vérification OTP. Les utilisateurs recevront un code de vérification par e-mail, qu\'ils devront saisir pour signer le document.","p3":"La sélection de cette option désactivera la vérification OTP, permettant aux utilisateurs de signer le document directement sans étapes supplémentaires.","p4":"Veuillez choisir l\'option qui correspond le mieux à vos exigences en matière de signature de documents."},"advanced-options":"Options avancées","hide-advanced-options":"Masquer les options avancées"}'); /***/ }) @@ -253689,4 +253620,4 @@ root.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createEle /******/ })() ; }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLXRlbXBsYXRlLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7O0FDVnVDOztBQUV2QztBQUNBLGlnSUFBaWdJOztBQUVqZ0ksaUNBQWlDLDREQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWtDOzs7Ozs7Ozs7Ozs7Ozs7O0FDZmxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU4Qjs7Ozs7Ozs7Ozs7Ozs7OztBQ1I5QjtBQUNBO0FBQ0EsMEtBQTBLLE1BQU07QUFDaEw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIsTUFBTTtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxPQUFPO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5QixpQ0FBaUM7QUFDMUQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsVUFBVTtBQUN4Qzs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLFVBQVU7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsVUFBVTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7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QTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxtRUFBVztBQUNyQjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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VUFBVTtBQUNyRDtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTs7QUFFQSxTQUFTLFVBQVU7O0FBRW5CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwwQkFBMEI7O0FBRTFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHdFQUF3RTtBQUN4RTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsU0FBUztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGdCQUFnQixpQkFBaUI7QUFDakM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELEVBQUU7QUFDckQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjs7QUFFQTtBQUNBLHlCQUF5QjtBQUN6QixNQUFNO0FBQ04sOEJBQThCO0FBQzlCLE1BQU07OztBQUdOO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLDJCQUEyQixlQUFlO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQSwyQkFBMkIsUUFBUTtBQUNuQzs7QUFFQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixNQUFNO0FBQ047QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNERBQTREO0FBQzVELE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLFNBQVM7QUFDakM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLFNBQVM7QUFDakM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCx3QkFBd0IsU0FBUztBQUNqQztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25COztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsS0FBSyxJQUFJOztBQUUzQjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1FQUFtRTs7QUFFbkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQ0FBb0MsT0FBTztBQUMzQztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtR0FBbUc7O0FBRW5HO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvS0FBb0ssaUVBQWlFLEVBQUU7QUFDdk8sR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUxBQW1MLGlFQUFpRSxFQUFFO0FBQ3RQLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNI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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxzR0FBc0c7O0FBRXRHLGtCQUFrQixvQkFBb0I7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQzs7QUFFakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDOztBQUU3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTs7QUFFQTtBQUNBLDJEQUEyRDs7QUFFM0Qsb0hBQW9IOztBQUVwSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkRBQTJEOztBQUUzRDtBQUNBLDBIQUEwSDs7QUFFMUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSwyREFBMkQ7O0FBRTNELDJHQUEyRzs7QUFFM0c7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDJEQUEyRDs7QUFFM0QsZ0hBQWdIOztBQUVoSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkRBQTJEOztBQUUzRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwSEFBMEg7O0FBRTFIO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0Esc0dBQXNHO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDhCQUE4QjtBQUM5Qjs7QUFFQSwwQkFBMEI7O0FBRTFCO0FBQ0EscUNBQXFDOztBQUVyQztBQUNBLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscURBQXFEO0FBQ3JEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0EscUNBQXFDOztBQUVyQzs7QUFFQTtBQUNBLHVEQUF1RDtBQUN2RDs7QUFFQSxxREFBcUQ7OztBQUdyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7O0FBRUE7QUFDQSxvRUFBb0U7O0FBRXBFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNEQUFzRCxFQUFFO0FBQ3hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvREFBb0QsV0FBVztBQUMvRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsb0RBQW9ELFdBQVc7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLDJCQUEyQixhQUFhO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsV0FBVztBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsV0FBVztBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSw2Q0FBNkMsV0FBVztBQUN4RDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkNBQTZDLFdBQVc7QUFDeEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDZDQUE2QyxXQUFXO0FBQ3hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLG9CQUFvQixvQkFBb0I7QUFDeEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4RUFBOEUsYUFBYTtBQUMzRjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7O0FBRXhFLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5R0FBeUc7QUFDekc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osSUFBSTtBQUNKLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0osaUNBQWlDO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNEJBQTRCOztBQUU1QjtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0JBQWdCLGNBQWM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFD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QUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxrREFBa0QsMERBQTBELDJDQUEyQztBQUN2Sjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQyxJQUFJO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELDRDQUE0QyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVEOztBQUUvUCw4REFBOEQsc0VBQXNFLDhEQUE4RDs7QUFFbE07QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0IsMkJBQTJCO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsR0FBRztBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRCxrRkFBa0Y7O0FBRWxGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0gsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGtEQUFrRCwwREFBMEQsMkNBQTJDOztBQUV2SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0Q7O0FBRS9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVELDhDQUE4QyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVEOztBQUVqUSxnRUFBZ0Usd0VBQXdFLGdFQUFnRTs7QUFFeE07QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQsZ0RBQWdELFdBQVcsbUVBQW1FLHFGQUFxRiw0QkFBNEIsY0FBYyxTQUFTLGlDQUFpQyxnS0FBZ0ssMEJBQTBCOztBQUVqZSxvREFBb0QsZ0JBQWdCLGtFQUFrRSx3REFBd0QsNkRBQTZELHNEQUFzRDs7QUFFalQseUNBQXlDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjtBQUMzSztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3RUFBd0UsNEJBQTRCO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5Q0FBeUM7O0FBRXpDO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsZ0RBQWdELFdBQVcsbUVBQW1FLHFGQUFxRiw0QkFBNEIsY0FBYyxTQUFTLGlDQUFpQyxnS0FBZ0ssMEJBQTBCOztBQUVqZSxvREFBb0QsZ0JBQWdCLGtFQUFrRSx3REFBd0QsNkRBQTZELHNEQUFzRDs7QUFFalQseUNBQXlDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjs7QUFFM0ssOENBQThDLGdCQUFnQixrQkFBa0IsT0FBTywyQkFBMkIsd0RBQXdELGdDQUFnQyx1REFBdUQ7O0FBRWpRLGdFQUFnRSx3RUFBd0UsZ0VBQWdFO0FBQ3hNO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSx3QkFBd0I7O0FBRXhCO0FBQ0EsK0VBQStFLDRCQUE0QjtBQUMzRztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUZBQXVGLDhCQUE4QjtBQUNySDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSx1RkFBdUYsOEJBQThCO0FBQ3JIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIsNEJBQTRCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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NkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osd0NBQXdDLGFBQWE7OztBQUdyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxRkFBcUYsNEJBQTRCO0FBQ2pIO0FBQ0Esc0NBQXNDOztBQUV0Qyx1RkFBdUYsOEJBQThCO0FBQ3JIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3RkFBd0YsOEJBQThCO0FBQ3RIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7O0FBRXZEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNGQUFzRixnQ0FBZ0M7QUFDdEg7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFOztBQUVoRTtBQUNBLHdFQUF3RTs7QUFFeEUsMkZBQTJGLGdDQUFnQztBQUMzSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrR0FBa0csZ0NBQWdDO0FBQ2xJOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxzR0FBc0csZ0NBQWdDO0FBQ3RJOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdGQUFnRixnQ0FBZ0M7QUFDaEg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdGQUFnRixnQ0FBZ0M7QUFDaEg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FB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SjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0MsZUFBZTtBQUMvQzs7QUFFQSxrQ0FBa0Msd0JBQXdCO0FBQzFEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkMsU0FBUztBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBOztBQUVBLHdDQUF3QyxVQUFVO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9DQUFvQyxVQUFVO0FBQzlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsMEJBQTBCO0FBQzlDOztBQUVBLHNCQUFzQixtQkFBbUI7QUFDekM7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQsZ0RBQWdELFdBQVcsbUVBQW1FLHFGQUFxRiw0QkFBNEIsY0FBYyxTQUFTLGlDQUFpQyxnS0FBZ0ssMEJBQTBCOztBQUVqZSxvREFBb0QsZ0JBQWdCLGtFQUFrRSx3REFBd0QsNkRBQTZELHNEQUFzRDs7QUFFalQseUNBQXlDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjs7QUFFM0ssa0RBQWtELDBEQUEwRCwyQ0FBMkM7O0FBRXZKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLGdDQUFnQzs7O0FBR2hDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw0REFBNEQ7O0FBRTVEO0FBQ0E7O0FBRUEsc0ZBQXNGLDRCQUE0QjtBQUNsSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLENBQUM7O0FBRUQsZ0RBQWdELFdBQVcsbUVBQW1FLHFGQUFxRiw0QkFBNEIsY0FBYyxTQUFTLGlDQUFpQyxnS0FBZ0ssMEJBQTBCOztBQUVqZSxvREFBb0QsZ0JBQWdCLGtFQUFrRSx3REFBd0QsNkRBQTZELHNEQUFzRDs7QUFFalQseUNBQXlDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjs7QUFFM0ssa0RBQWtELDBEQUEwRCwyQ0FBMkM7O0FBRXZKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnRkFBZ0YsNEJBQTRCO0FBQzVHO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9CQUFvQixrQkFBa0I7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLHNDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrRkFBa0YsOEJBQThCO0FBQ2hIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDO0FBQzdDLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGtGQUFrRiw4QkFBOEI7QUFDaEg7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOElBQThJLGtCQUFrQjtBQUNoSztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQSxnREFBZ0QsV0FBVyxtRUFBbUUscUZBQXFGLDRCQUE0QixjQUFjLFNBQVMsaUNBQWlDLGdLQUFnSywwQkFBMEI7O0FBRWplLG9EQUFvRCxnQkFBZ0Isa0VBQWtFLHdEQUF3RCw2REFBNkQsc0RBQXNEOztBQUVqVCx5Q0FBeUMsdURBQXVELHVDQUF1QyxTQUFTLE9BQU8sb0JBQW9COztBQUUzSyw4Q0FBOEMsZ0JBQWdCLGtCQUFrQixPQUFPLDJCQUEyQix3REFBd0QsZ0NBQWdDLHVEQUF1RDs7QUFFalEsZ0VBQWdFLHdFQUF3RSxnRUFBZ0U7O0FBRXhNLDBGQUEwRixlQUFlLGlEQUFpRCw4QkFBOEIsR0FBRyxxQ0FBcUMseUNBQXlDLDJDQUEyQyx3QkFBd0Isd0VBQXdFLG1EQUFtRCxTQUFTLDhDQUE4Qyx5RUFBeUUsZ0NBQWdDLG1DQUFtQywrQ0FBK0MsZUFBZTtBQUN4c0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUE2Qjs7O0FBRzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFVBQVU7QUFDdkIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QixjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUZBQXFGLDRCQUE0QjtBQUNqSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDJGQUEyRiw4QkFBOEI7QUFDekg7QUFDQTs7QUFFQSx3QkFBd0IsMkJBQTJCO0FBQ25EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrREFBa0Q7O0FBRWxEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVELGdEQUFnRCxXQUFXLG1FQUFtRSxxRkFBcUYsNEJBQTRCLGNBQWMsU0FBUyxpQ0FBaUMsZ0tBQWdLLDBCQUEwQjs7QUFFamUsb0RBQW9ELGdCQUFnQixrRUFBa0Usd0RBQXdELDZEQUE2RCxzREFBc0Q7O0FBRWpULHlDQUF5Qyx1REFBdUQsdUNBQXVDLFNBQVMsT0FBTyxvQkFBb0I7QUFDM0s7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBLDhFQUE4RSw0QkFBNEI7QUFDMUc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7O0FBRUEsY0FBYyxnQkFBZ0I7QUFDOUI7QUFDQTtBQUNBOzs7QUFHQSwyQkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGNBQWMsUUFBUTtBQUN0QjtBQUNBOztBQUVBLGNBQWMsU0FBUztBQUN2QjtBQUNBOztBQUVBLGNBQWMsT0FBTztBQUNyQjtBQUNBOztBQUVBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7OztBQUdBLGNBQWMsT0FBTztBQUNyQjtBQUNBOztBQUVBOztBQUVBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7OztBQUdBLGNBQWMsU0FBUztBQUN2QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsdUJBQXVCLFFBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTs7O0FBR0EsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsZ0JBQWdCLG1CQUFtQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpREFBaUQsUUFBUTtBQUN6RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxpREFBaUQsUUFBUTtBQUN6RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFCQUFxQixtQkFBbUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsR0FBRztBQUN0QjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLDhFQUE4RTtBQUM5RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0RBQWtELDBEQUEwRCwyQ0FBMkM7O0FBRXZKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixXQUFXO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixRQUFRO0FBQzlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLFFBQVE7QUFDOUI7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUNBQXlDLGFBQWE7QUFDdEQ7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5COztBQUVBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCOztBQUU1QjtBQUNBLDhCQUE4QjtBQUM5Qjs7QUFFQSwyQ0FBMkMsVUFBVTtBQUNyRDtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUIsNEJBQTRCO0FBQy9DO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUEsZ0JBQWdCLGtCQUFrQjtBQUNsQztBQUNBO0FBQ0E7OztBQUdBLG1CQUFtQiw0QkFBNEI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBLDBCQUEwQixrQkFBa0I7QUFDNUMsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBLHNDQUFzQyxtQkFBbUI7QUFDekQsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7O0FBRUEsa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGNBQWMsU0FBUztBQUN2QjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8saUlBQWlJLFFBQVEsWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLFVBQVUsWUFBWSxXQUFXLFVBQVUsS0FBSyxLQUFLLFlBQVksV0FBVyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxNQUFNLE1BQU0sWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksT0FBTyxVQUFVLFlBQVksV0FBVyxPQUFPLE9BQU8sVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsWUFBWSxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsTUFBTSxLQUFLLFVBQVUsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxLQUFLLEtBQUssVUFBVSxLQUFLLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsVUFBVSxLQUFLLEtBQUssVUFBVSxLQUFLLEtBQUssWUFBWSxXQUFXLEtBQUssS0FBSyxVQUFVLEtBQUssS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsWUFBWSxNQUFNLEtBQUssVUFBVSxVQUFVLFlBQVksTUFBTSxLQUFLLFlBQVksV0FBVyxVQUFVLE1BQU0sS0FBSyxVQUFVLFlBQVksTUFBTSxNQUFNLFlBQVksV0FBVyxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxLQUFLLE1BQU0sWUFBWSxXQUFXLEtBQUssS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLEtBQUssS0FBSyxVQUFVLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxLQUFLLEtBQUssWUFBWSxhQUFhLGFBQWEsTUFBTSxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxNQUFNLEtBQUssWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxZQUFZLE1BQU0sS0FBSyxVQUFVLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxZQUFZLE1BQU0sS0FBSyxZQUFZLFdBQVcsWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssVUFBVSxLQUFLLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxNQUFNLEtBQUssVUFBVSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sS0FBSyxZQUFZLGFBQWEsV0FBVyxLQUFLLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxhQUFhLFdBQVcsS0FBSyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLE9BQU8sVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsT0FBTyxRQUFRLFVBQVUsTUFBTSxRQUFRLFlBQVksYUFBYSxNQUFNLFFBQVEsWUFBWSxNQUFNLFFBQVEsWUFBWSxhQUFhLFdBQVcsS0FBSyxRQUFRLFlBQVksTUFBTSxRQUFRLFVBQVUsTUFBTSxRQUFRLFVBQVUsS0FBSyxRQUFRLFlBQVksYUFBYSxhQUFhLFdBQVcsS0FBSyxRQUFRLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLE1BQU0sUUFBUSxZQUFZLE1BQU0sUUFBUSxZQUFZLFdBQVcsS0FBSyxjQUFjLFlBQVksYUFBYSxXQUFXLEtBQUssY0FBYyxZQUFZLE1BQU0sUUFBUSxZQUFZLGFBQWEsYUFBYSxNQUFNLFFBQVEsWUFBWSxNQUFNLG9CQUFvQixhQUFhLE1BQU0sbUNBQW1DLGFBQWEsV0FBVyxLQUFLLFFBQVEsVUFBVSxVQUFVLEtBQUssUUFBUSxZQUFZLE1BQU0sUUFBUSxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsS0FBSyxLQUFLLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sT0FBTyxZQUFZLGFBQWEsYUFBYSxNQUFNLE9BQU8sVUFBVSxNQUFNLFVBQVUsWUFBWSxNQUFNLE9BQU8sWUFBWSxXQUFXLFVBQVUsTUFBTSxPQUFPLFlBQVksYUFBYSxXQUFXLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLE1BQU0sT0FBTyxVQUFVLE1BQU0sT0FBTyxVQUFVLFlBQVksT0FBTyxPQUFPLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxNQUFNLE9BQU8sWUFBWSxhQUFhLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxZQUFZLE1BQU0sT0FBTyxZQUFZLE1BQU0sT0FBTyxZQUFZLE1BQU0sT0FBTyxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLFdBQVcsVUFBVSxVQUFVLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxZQUFZLFdBQVcsWUFBWSxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxLQUFLLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsVUFBVSxZQUFZ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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakMsd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7QUFDOUIsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZCxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsbUNBQW1DO0FBQy9ELDRCQUE0QixtQ0FBbUM7QUFDL0Q7QUFDQTtBQUNBLDRCQUE0QixtQ0FBbUM7QUFDL0QsNEJBQTRCLG1DQUFtQztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QyxnQkFBZ0IsbUNBQW1DO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxPQUFPLGlGQUFpRixZQUFZLE1BQU0sT0FBTyxxQkFBcUIsb0JBQW9CLHFCQUFxQixxQkFBcUIsTUFBTSxNQUFNLFdBQVcsTUFBTSxZQUFZLE1BQU0sTUFBTSxxQkFBcUIsK0JBQStCLG9CQUFvQixxQkFBcUIscUJBQXFCLHFCQUFxQixxQkFBcUIsTUFBTSxPQUFPLE1BQU0sS0FBSyxvQkFBb0IscUJBQXFCLE1BQU0sUUFBUSxNQUFNLEtBQUssb0JBQW9CLG9CQUFvQixxQkFBcUIsTUFBTSxNQUFNLE1BQU0sS0FBSyxXQUFXLFdBQVcsTUFBTSxNQUFNLE1BQU0sVUFBVSxXQUFXLFdBQVcsTUFBTSxNQUFNLE1BQU0sS0FBSyxVQUFVLFdBQVcsTUFBTSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sU0FBUyxNQUFNLFFBQVEscUJBQXFCLHFCQUFxQixxQkFBcUIsb0JBQW9CLE1BQU0sTUFBTSxNQUFNLEtBQUssVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLFVBQVUsVUFBVSxXQUFXLFdBQVcsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxRQUFRLE1BQU0sS0FBSyxvQkFBb0IscUJBQXFCLHFCQUFxQixNQUFNLFFBQVEsTUFBTSxTQUFTLHFCQUFxQixxQkFBcUIscUJBQXFCLG9CQUFvQixxQkFBcUIscUJBQXFCLHFCQUFxQixvQkFBb0Isb0JBQW9CLG9CQUFvQixNQUFNLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxPQUFPLE1BQU0sUUFBUSxxQkFBcUIscUJBQXFCLHFCQUFxQixNQUFNLE1BQU0sTUFBTSxLQUFLLFVBQVUsTUFBTSxNQUFNLE1BQU0sS0FBSyxXQUFXLE1BQU0sTUFBTSxNQUFNLEtBQUssV0FBVyxNQUFNLE1BQU0sTUFBTSxNQUFNLFVBQVUsTUFBTSxPQUFPLE1BQU0sS0FBSyxxQkFBcUIscUJBQXFCLE1BQU0sTUFBTSxNQUFNLEtBQUssV0FBVyxNQUFNLE9BQU8sTUFBTSxLQUFLLHFCQUFxQixvQkFBb0IsTUFBTSxNQUFNLE1BQU0sS0FBSyxXQUFXLE1BQU0sTUFBTSxNQUFNLGlCQUFpQixVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxPQUFPLFdBQVcsVUFBVSxVQUFVLE1BQU0sTUFBTSxLQUFLLEtBQUssVUFBVSxNQUFNLE1BQU0sTUFBTSxLQUFLLFdBQVcsTUFBTSxPQUFPLE1BQU0sTUFBTSxvQkFBb0Isb0JBQW9CLE1BQU0sTUFBTSxNQUFNLE1BQU0sVUFBVSxNQUFNLE1BQU0sS0FBSyxLQUFLLFVBQVUsTUFBTSxRQUFRLE1BQU0sWUFBWSxvQkFBb0IscUJBQXFCLE1BQU0sTUFBTSxNQUFNLE1BQU0sVUFBVSxVQUFVLE1BQU0sV0FBVyxLQUFLLFVBQVUsTUFBTSxNQUFNLFdBQVcsS0FBSyxNQUFNLE1BQU0sS0FBSyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsS0FBSyxNQUFNLE1BQU0sS0FBSyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsS0FBSyxLQUFLLEtBQUssTUFBTSxLQUFLLEtBQUssTUFBTSxLQUFLLEtBQUssTUFBTSxLQUFLLEtBQUssTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLE1BQU0sS0FBSyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsS0FBSyxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLE1BQU0sS0FBSyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsS0FBSyxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssS0FBSyxLQUFLLEtBQUssTUFBTSxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE1BQU0sV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLEtBQUssTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxZQUFZLE1BQU0sTUFBTSxLQUFLLE1BQU0sWUFBWSxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsS0FBSyxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxPQUFPLFdBQVcsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsYUFBYSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxRQUFRLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sT0FBTyxPQUFPLEtBQUssUUFBUSxNQUFNLFVBQVUsTUFBTSxNQUFNLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sT0FBTyxLQUFLLEtBQUssTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLFFBQVEsWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxPQUFPLE1BQU0sV0FBVyxhQUFhLE1BQU0sT0FBTyxPQUFPLEtBQUssS0FBSyxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsTUFBTSxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxXQUFXLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksWUFBWSxZQUFZLGFBQWEsWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLFlBQVksYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sU0FBUyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE9BQU8sTUFBTSxPQUFPLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxRQUFRLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxPQUFPLEtBQUssTUFBTSxPQUFPLEtBQUssTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLFlBQVksWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxRQUFRLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssT0FBTyxZQUFZLE1BQU0sTUFBTSxPQUFPLEtBQUssWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssUUFBUSxNQUFNLFVBQVUsT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxNQUFNLEtBQUssTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxRQUFRLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxnQkFBZ0IsTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsUUFBUSxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxRQUFRLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sU0FBUyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFNBQVMsWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sT0FBTyxNQUFNLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsWUFBWSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxZQUFZLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLFNBQVMsWUFBWSxZQUFZLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU8sTUFBTSxNQUFNLE9BQU8sTUFBTSxNQUFNLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxRQUFRLFlBQVksTUFBTSxNQUFNLFFBQVEsWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsTUFBTSxPQUFPLGFBQWEsYUFBYSxXQUFXLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLFNBQVMsWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxRQUFRLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsWUFBWSxNQUFNLE1BQU0sT0FBTyxLQUFLLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxRQUFRLE1BQU0sTUFBTSxPQUFPLE1BQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxZQUFZLE9BQU8sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksT0FBTyxZQUFZLE1BQU0sVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsV0FBVyxNQUFNLEtBQUssS0FBSyxZQUFZLE1BQU0sTUFBTSxZQUFZLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFdBQVcsS0FBSyxNQUFNLEtBQUssWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxhQUFhLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sYUFBYSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxZQUFZLE1BQU0sVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sT0FBTyxLQUFLLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxNQUFNLE9BQU8sTUFBTSxXQUFXLFlBQVksTUFBTSxPQUFPLE1BQU0sV0FBVyxZQUFZLE1BQU0sT0FBTyxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxXQUFXLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sT0FBTyxLQUFLLEtBQUssTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxNQUFNLHdDQUF3Qyx5QkFBeUIsd0JBQXdCLGNBQWMsOEJBQThCLEtBQUssa0ZBQWtGLG9CQUFvQixLQUFLLHlCQUF5QiwrQkFBK0IsbURBQW1ELHdCQUF3Qiw4Q0FBOEMsZUFBZSwrQkFBK0IsT0FBTyxLQUFLLCtGQUErRix3QkFBd0IsS0FBSywwQkFBMEIsMEJBQTBCLEtBQUsscUJBQXFCLHFCQUFxQixLQUFLLHdCQUF3Qix3QkFBd0IsS0FBSyx3QkFBd0Isd0JBQXdCLEtBQUssMkZBQTJGLDBCQUEwQixLQUFLLDRCQUE0Qiw0QkFBNEIsS0FBSyx1QkFBdUIsdUJBQXVCLEtBQUsseUJBQXlCLHlCQUF5QixLQUFLLDBCQUEwQiwwQkFBMEIsS0FBSywwQkFBMEIsMEJBQTBCLEtBQUssNEJBQTRCLDRCQUE0QixLQUFLLG9EQUFvRCw0QkFBNEIsbURBQW1ELDRCQUE0QixxRkFBcUYsaUJBQWlCLEtBQUssb0NBQW9DLG9DQUFvQyxLQUFLLG9DQUFvQyw2QkFBNkIsMEJBQTBCLEtBQUssbUJBQW1CO0FBQ2hxeUM7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNobkx2QztBQUM2RztBQUNqQjtBQUNvRDtBQUNOO0FBQ0M7QUFDM0ksOEJBQThCLG1GQUEyQixDQUFDLDRGQUFxQztBQUMvRiwwQkFBMEIseUhBQWlDO0FBQzNELDBCQUEwQixtSEFBaUM7QUFDM0QsMEJBQTBCLG9IQUFpQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sZ0dBQWdHLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxNQUFNLE9BQU8sV0FBVyxNQUFNLFFBQVEsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxNQUFNLEtBQUssWUFBWSxhQUFhLE9BQU8sUUFBUSxZQUFZLGFBQWEsT0FBTyxRQUFRLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxXQUFXLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxNQUFNLEtBQUssVUFBVSxZQUFZLFFBQVEsS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLFdBQVcsVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsT0FBTyxZQUFZLE1BQU0sWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLFdBQVcsT0FBTyxLQUFLLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLE9BQU8sT0FBTyxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksTUFBTSxNQUFNLEtBQUssS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxNQUFNLE1BQU0sS0FBSyxLQUFLLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLE1BQU0sTUFBTSxLQUFLLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksTUFBTSxNQUFNLEtBQUssS0FBSyxVQUFVLEtBQUssTUFBTSxLQUFLLEtBQUssVUFBVSxLQUFLLHNF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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RCxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTywyRkFBMkYsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLFdBQVcsVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLFdBQVcsVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLFdBQVcsVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxNQUFNLE9BQU8sYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE1BQU0sS0FBSyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLE9BQU8sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLE1BQU0sWUFBWSxPQUFPLE1BQU0sWUFBWSxPQUFPLE1BQU0sWUFBWSxPQUFPLE1BQU0sWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFVBQVUsWUFBWSxXQUFXLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsTUFBTSxLQUFLLFlBQVksV0FBVyxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLE9BQU8sT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsV0FBVyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxNQUFNLFlBQVksTUFBTSxVQUFVLFVBQVUs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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsb0JBQW9CLGlCQUFpQjtBQUNyQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7Ozs7QUFJYixJQUFJLElBQXFDO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFO0FBQzNFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEOztBQUVsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0S0Q7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNqRUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDakVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7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QUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7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QjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDekZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdEZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3hGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7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QUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzNIRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RJRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3BFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDbkVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDaEZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3BGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0SEQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNyRkQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDekdEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3pHRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDckZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN4SUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdElEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNwSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3hHRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDbExEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0S0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDaElEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSSxJQUFJLElBQUk7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN4R0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0SkQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDcEhEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzlKRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdEZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw4Q0FBOEMsSUFBSSxJQUFJLElBQUk7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdEdEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM1RkQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULHNDQUFzQyxJQUFJO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDakhEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdElEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDckZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDNUhEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNoSUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM5RkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDbkpEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCx5Q0FBeUMsSUFBSTtBQUM3QztBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM1RUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3ZJRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN4R0Q7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUMvSEQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELElBQUk7QUFDM0QsNkRBQTZELElBQUk7QUFDakUsNERBQTRELElBQUk7QUFDaEUsa0VBQWtFLElBQUk7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0RUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDaEdEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDNUZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxLQUFLO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDOUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNyTkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNU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LFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3BJRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFD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LFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQy9IRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzNFRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNyR0Q7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDbkVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0SUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFD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QUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzVGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNoRUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJB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Q3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM3R0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdlNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELElBQUksS0FBNEQ7QUFDaEUsSUFBSSxDQUN5QjtBQUM3QixDQUFDLHNCQUFzQjs7QUFFdkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsU0FBUztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtB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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRDQUE0QyxJQUFJOztBQUVoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsa0NBQWtDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQixFQUFFO0FBQ3ZCLHFCQUFxQixFQUFFO0FBQ3ZCLDBCQUEwQixFQUFFO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixJQUFJO0FBQzVCLHdCQUF3QixJQUFJO0FBQzVCLDZCQUE2QixJQUFJO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLElBQUk7QUFDNUM7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE1BQU0sd0VBQXdFLE1BQU0sbUJBQW1CLE1BQU0scUJBQXFCLE1BQU0sRUFBRSxJQUFJO0FBQ2pLO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLE9BQU87QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQjtBQUNwQiwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFVBQVU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFhO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxTQUFPO0FBQ3hDLGdCQUFnQiw4RUFBZSxJQUFXLE9BQU8sQ0FBQztBQUNsRDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixFQUFFLElBQUksRUFBRTtBQUNwQztBQUNBLDRCQUE0QixFQUFFLElBQUksRUFBRTtBQUNwQztBQUNBO0FBQ0EscUNBQXFDLEVBQUU7QUFDdkMsK0JBQStCLEVBQUU7QUFDakMsaUNBQWlDLEVBQUU7QUFDbkMsK0JBQStCLEVBQUU7QUFDakMsNkJBQTZCLEVBQUUsSUFBSSxFQUFFO0FBQ3JDLDRCQUE0QixFQUFFO0FBQzlCLG1DQUFtQyxHQUFHO0FBQ3RDLDZCQUE2QixFQUFFO0FBQy9CLCtCQUErQixFQUFFLElBQUksRUFBRTtBQUN2Qyw4QkFBOEIsRUFBRSxJQUFJLEVBQUU7QUFDdEMsNEJBQTRCLEVBQUU7QUFDOUIsMkJBQTJCLEVBQUU7QUFDN0IseUJBQXlCLEVBQUU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsSUFBSSwwREFBMEQsSUFBSSxxRUFBcUUsRUFBRTtBQUNqTTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUMsT0FBTztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLE9BQU87QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwrQkFBK0I7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBLGVBQWUsT0FBTztBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsbUNBQW1DLGlCQUFpQjtBQUNwRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG9CQUFvQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQjtBQUNsQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw0R0FBNEc7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msc0JBQXNCO0FBQzFEO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLHNCQUFzQjtBQUMxRDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLE9BQU87QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLE9BQU87QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxPQUFPO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsT0FBTztBQUM1Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDLE9BQU87QUFDNUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLG1CQUFtQjtBQUN6QztBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0Esb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxDQUFDOzs7Ozs7Ozs7Ozs7QUN2akxEO0FBQ0E7QUFDQTtB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O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCOztBQUV0Qjs7QUFFQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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OztBQUVsQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUU7QUFDbkU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsNEJBQTRCO0FBQzVCLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDMWZqQjs7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QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RkFBOEYsSUFBSSxXQUFXLGtCQUFrQjtBQUMvSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLDBCQUEwQiw0QkFBNEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLDBCQUEwQiw0QkFBNEI7QUFDdEQ7QUFDQTtBQUNB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MEI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxnQkFBZ0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3RUFBd0UsYUFBYTtBQUNyRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwyRUFBMkUsZUFBZTtBQUMxRjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFLHdDQUF3QztBQUN4QyxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDcFpqQjs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkcsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0Qsa0JBQWU7QUFDZixtQ0FBbUMsbUJBQU8sQ0FBQyw4SEFBbUQ7QUFDOUYsOENBQThDLG1CQUFPLENBQUMsc0hBQStDO0FBQ3JHLDBDQUEwQyxtQkFBTyxDQUFDLHNFQUFlO0FBQ2pFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx1QkFBdUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsS0FBSztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOLDZCQUE2QixVQUFVO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxl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O0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxlQUFlO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RC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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsT0FBTztBQUNwQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Is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QUNwQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFdBQVc7QUFDeEIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFdBQVc7QUFDeEIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsZ0JBQWdCO0FBQzdCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0EsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsZ0JBQWdCO0FBQzdCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsZ0JBQWdCO0FBQzdCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsZ0JBQWdCO0FBQzdCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsZ0JBQWdCO0FBQzdCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFR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LFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0Esd0VBQXdFLGFBQWE7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0EsMkVBQTJFLGVBQWU7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0EsMkVBQTJFLGVBQWU7QUFDMUY7QUFDQTtBQUNB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QUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0NBQWtDLDJGQUEyRjtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RkFBdUY7QUFDdkY7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7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O0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFlBQVk7QUFDWjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FB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QTtBQUNBLFFBQVEsaURBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBUTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBUTtBQUNoQixRQUFRLGlEQUFRO0FBQ2hCLFFBQVEsaURBQVE7QUFDaEIsUUFBUSxpREFBUTtBQUNoQjtBQUNBLHNCQUFzQiwyQ0FBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQVE7QUFDaEIsUUFBUSxpREFBUTtBQUNoQixRQUFRLGlEQUFRO0FBQ2hCLFFBQVEsaURBQVE7QUFDaEI7QUFDQSxzQkFBc0IsMkNBQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFRO0FBQ2hCLFFBQVEsaURBQVE7QUFDaEIsUUFBUSxpREFBUTtBQUNoQixRQUFRLGlEQUFRO0FBQ2hCO0FBQ0Esc0JBQXNCLDJDQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBUTtBQUNoQixRQUFRLGlEQUFRO0FBQ2hCLFFBQVEsaURBQVE7QUFDaEIsUUFBUSxpREFBUTtBQUNoQjtBQUNBLHNCQUFzQiwyQ0FBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzREFBYztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0Msa0RBQWU7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxrREFBZTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGtEQUFlO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHNEQUFjO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxrREFBZTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0Msa0RBQWU7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0Msa0RBQWU7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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c0NBQXNDLGdEQUFhO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGdEQUFhO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGdEQUFhO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0RBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsd0RBQU87QUFDckQsc0NBQXNDLHlEQUFRO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsd0RBQU87QUFDaEQsaUNBQWlDLDBEQUFTO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGlFQUFlLFlBQVksRUFBQztBQUM1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUMwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFNBQVM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFCQUFxQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsU0FBUztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGVBQWU7QUFDN0QsOEJBQThCLFNBQVM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsU0FBUztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxVQUFVO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxxREFBWTtBQUNkLGlFQUFlLFdBQVcsRUFBQztBQUMzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDa0M7QUFDUTtBQUMxQztBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixlQUFlO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSxRQUFRO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSx3QkFBd0IsMkJBQTJCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMscURBQVk7QUFDZCxpRUFBZSxTQUFTLEVBQUM7QUFDekI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2tDO0FBQ1E7QUFDMUM7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixPQUFPO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxxREFBWTtBQUNkLGlFQUFlLGVBQWUsRUFBQztBQUMvQjs7Ozs7Ozs7Ozs7Ozs7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUVBQWUsTUFBTSxFQUFDO0FBQ3RCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZHaUY7QUFDdEM7QUFDRjtBQUNBO0FBQ0k7QUFDRDtBQUNFO0FBQ047QUFDSjtBQUNZO0FBQ2xCO0FBQzlCO0FBQ0EscUJBQXFCLHdEQUFPO0FBQzVCLG1CQUFtQixvREFBVztBQUM5QjtBQUNBLHFCQUFxQix3REFBTztBQUM1QjtBQUNBLDhCQUE4Qix3REFBTztBQUNyQyw0Q0FBNEMsd0RBQU87QUFDbkQsdUNBQXVDLDBEQUFTO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixrREFBUztBQUM1QjtBQUNBLHFCQUFxQix3REFBTztBQUM1QixtQkFBbUIsc0RBQWE7QUFDaEM7QUFDQSxxQkFBcUIsd0RBQU87QUFDNUIsbUJBQW1CLHVEQUFjO0FBQ2pDO0FBQ0EscUJBQXFCLHdEQUFPO0FBQzVCLG1CQUFtQix3REFBZTtBQUNsQztBQUNBLGNBQWMsNkRBQXdCO0FBQ3RDO0FBQ087QUFDUDtBQUNBLHFCQUFxQixnREFBTTtBQUMzQiw2QkFBNkIsd0RBQU87QUFDcEMsa0NBQWtDLHdEQUFPO0FBQ3pDLDBCQUEwQix3REFBTztBQUNqQztBQUNBO0FBQ0EsK0JBQStCLHlEQUFRO0FBQ3ZDLCtDQUErQyxXQUFXO0FBQzFELDZEQUE2RCx3REFBTywrQ0FBK0Msd0RBQU87QUFDMUg7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDhEQUF5QixFQUFFLHdEQUFPLEVBQUUseURBQVE7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdERrQztBQUNPO0FBQ0E7QUFDQztBQUN1QjtBQUNqRTtBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix3REFBTyxjQUFjLHdEQUFPO0FBQ3ZEO0FBQ0E7QUFDQSxnQ0FBZ0Msd0RBQU8saUJBQWlCLHdEQUFPO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtEQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtEQUFXO0FBQ2xDO0FBQ0EscUJBQXFCLHdEQUFPO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHdEQUFPLDBCQUEwQix3REFBTztBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzRUFBaUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsc0VBQWlCO0FBQzNDO0FBQ0EscUJBQXFCLHdEQUFPO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msd0RBQU87QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQix3REFBTyxhQUFhLHdEQUFPO0FBQzVDLGlCQUFpQix3REFBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsd0RBQU87QUFDVCxpRUFBZSxVQUFVLEVBQUM7QUFDMUI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVFa0M7QUFDWTtBQUNGO0FBQzVDO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHVCQUF1QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsV0FBVztBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxXQUFXO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFdBQVc7QUFDbEU7QUFDQSwrQkFBK0IseURBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxXQUFXO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDLHVEQUFjO0FBQ2hCLGlFQUFlLGdCQUFnQixFQUFDO0FBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6RGtDO0FBQ087QUFDRjtBQUNPO0FBQ2dDO0FBQ3ZFO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDhCQUE4QjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsV0FBVztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBELFdBQVc7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsV0FBVztBQUNuRTtBQUNBLGdDQUFnQyxtREFBVztBQUMzQyxpQ0FBaUMsbURBQVc7QUFDNUMsZ0NBQWdDLG1EQUFXO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHlDQUFLO0FBQ3RDLG1DQUFtQyx5Q0FBSztBQUN4QywyQkFBMkIseUNBQUs7QUFDaEMsaUJBQWlCLHdEQUFPLGFBQWEsd0RBQU87QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsa0VBQWtFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHNDQUFzQztBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixzRUFBc0U7QUFDbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0UsdUJBQXVCO0FBQ3ZGO0FBQ0EsNkJBQTZCLG9EQUFZLENBQUMsZ0RBQVE7QUFDbEQsOEJBQThCLG9EQUFZLENBQUMsZ0RBQVE7QUFDbkQsNkJBQTZCLG9EQUFZLENBQUMsZ0RBQVE7QUFDbEQsOENBQThDLFVBQVU7QUFDeEQ7QUFDQTtBQUNBLDhDQUE4QyxVQUFVO0FBQ3hEO0FBQ0E7QUFDQSw4Q0FBOEMsVUFBVTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSx1QkFBdUI7QUFDdkY7QUFDQSw2QkFBNkIsb0RBQVksQ0FBQyxnREFBUTtBQUNsRCw4QkFBOEIsb0RBQVksQ0FBQyxnREFBUTtBQUNuRCw2QkFBNkIsb0RBQVksQ0FBQyxnREFBUTtBQUNsRCw4Q0FBOEMsVUFBVTtBQUN4RDtBQUNBO0FBQ0EsOENBQThDLFVBQVU7QUFDeEQ7QUFDQTtBQUNBLDhDQUE4QyxVQUFVO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDJDQUFHO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHdEQUFPO0FBQzdCLHNCQUFzQix3REFBTztBQUM3QjtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0EsK0JBQStCLHVEQUFNO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsdURBQWM7QUFDaEIsaUVBQWUsaUJBQWlCLEVBQUM7QUFDakM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2TGtDO0FBQ1Y7QUFDOEI7QUFDYjtBQUNJO0FBQ1Q7QUFDcEM7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsbURBQVk7QUFDOUM7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHdEQUFPLGVBQWUsd0RBQU87QUFDbEQsOEJBQThCLHlDQUFLO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw4REFBeUI7QUFDM0M7QUFDQTtBQUNBLENBQUMsQ0FBQywwREFBUztBQUNYLGlFQUFlLGNBQWMsRUFBQztBQUM5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaENrQztBQUNPO0FBQ0k7QUFDQztBQUNGO0FBQ2E7QUFDekQ7QUFDQSxJQUFJLGdEQUFTO0FBQ2I7QUFDQSxpQ0FBaUM7QUFDakMsb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix3REFBTyxhQUFhLHdEQUFPO0FBQ2xELHVCQUF1Qix3REFBTyxVQUFVLDBEQUFTO0FBQ2pELHVCQUF1Qix3REFBTyxjQUFjLDBEQUFTO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFdBQVc7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsNERBQW9CO0FBQ3pDLHFEQUFxRCxXQUFXO0FBQ2hFO0FBQ0E7QUFDQSwrQkFBK0IseURBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksNENBQUk7QUFDaEIsWUFBWSw0Q0FBSTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxXQUFXO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsV0FBVztBQUNoRTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyx1REFBYztBQUNoQixpRUFBZSxlQUFlLEVBQUM7QUFDL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFFa0M7QUFDUztBQUNGO0FBQ0E7QUFDSTtBQUNBO0FBQzdDO0FBQ0EsSUFBSSxnREFBUztBQUNiO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsV0FBVztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msd0RBQU8sU0FBUyx3REFBTztBQUN2RDtBQUNBO0FBQ0EsMkJBQTJCLHdEQUFPO0FBQ2xDO0FBQ0E7QUFDQSxnQ0FBZ0Msd0RBQU8sU0FBUyx5REFBUTtBQUN4RDtBQUNBO0FBQ0EsZ0NBQWdDLHdEQUFPLFdBQVcseURBQVE7QUFDMUQ7QUFDQTtBQUNBLGdDQUFnQyx3REFBTyxVQUFVLHlEQUFRO0FBQ3pEO0FBQ0E7QUFDQSxnQ0FBZ0Msd0RBQU8sU0FBUyx5REFBUTtBQUN4RDtBQUNBO0FBQ0EscURBQXFELHdEQUFPO0FBQzVELG1EQUFtRCx3REFBTztBQUMxRDtBQUNBO0FBQ0Esc0RBQXNELHdEQUFPO0FBQzdELCtDQUErQyx5REFBUTtBQUN2RDtBQUNBO0FBQ0Esc0RBQXNELHdEQUFPO0FBQzdELG9EQUFvRCx5REFBUTtBQUM1RDtBQUNBO0FBQ0EsdURBQXVELHdEQUFPO0FBQzlELHFEQUFxRCwwREFBUztBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHdEQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQix3REFBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx5REFBUTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsd0RBQU87QUFDMUM7QUFDQSxnQ0FBZ0MsMERBQVM7QUFDekMscUJBQXFCLHdEQUFPO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsd0RBQU87QUFDNUQsdURBQXVELHdEQUFPLG1CQUFtQjtBQUNqRixpQkFBaUIsd0RBQU87QUFDeEI7QUFDQSx5Q0FBeUMsd0RBQU8sT0FBTyx3REFBTyxtQkFBbUI7QUFDakYsc0JBQXNCLHdEQUFPO0FBQzdCO0FBQ0EsNENBQTRDLHdEQUFPLFVBQVUsd0RBQU8sbUJBQW1CO0FBQ3ZGLHNCQUFzQix3REFBTztBQUM3QjtBQUNBLDhDQUE4Qyx3REFBTyxZQUFZLHdEQUFPLG1CQUFtQjtBQUMzRixzQkFBc0Isd0RBQU87QUFDN0I7QUFDQSxpQkFBaUIsd0RBQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyx3REFBTyxPQUFPLHdEQUFPO0FBQ3hELHNDQUFzQyx3REFBTyxVQUFVLHdEQUFPO0FBQzlELHdDQUF3Qyx3REFBTyxZQUFZLHdEQUFPO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHdEQUFPLE9BQU8sd0RBQU87QUFDdEMsaUJBQWlCLHdEQUFPO0FBQ3hCLGlCQUFpQix3REFBTywwQkFBMEI7QUFDbEQsaUJBQWlCLHdEQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsd0RBQU87QUFDVCxpRUFBZSxXQUFXLEVBQUM7QUFDM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzTWtDO0FBQ1M7QUFDRjtBQUNBO0FBQ0k7QUFDTDtBQUNrQztBQUMxRTtBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix3REFBTztBQUNsQztBQUNBO0FBQ0EsMkJBQTJCLHdEQUFPLGFBQWEseURBQVE7QUFDdkQ7QUFDQTtBQUNBLDJCQUEyQix3REFBTyxjQUFjLDBEQUFTO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDREQUF1QjtBQUM3QztBQUNBO0FBQ0EsNkNBQTZDLFdBQVc7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixvREFBVztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix5REFBb0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDREQUF1QjtBQUM3QztBQUNBO0FBQ0EsNkNBQTZDLFdBQVc7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLG9EQUFXO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix5REFBb0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsV0FBVztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHdEQUFPLGNBQWMsMERBQVM7QUFDbkQsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsb0RBQVc7QUFDdEM7QUFDQTtBQUNBLHlCQUF5Qix3REFBTyxjQUFjLDBEQUFTO0FBQ3ZELGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHdEQUFPLGFBQWEsd0RBQU87QUFDNUMsaUJBQWlCLHdEQUFPO0FBQ3hCLGlCQUFpQix3REFBTztBQUN4QjtBQUNBLHFCQUFxQix3REFBTztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsd0RBQU87QUFDVCxpRUFBZSxXQUFXLEVBQUM7QUFDM0I7Ozs7Ozs7Ozs7Ozs7OztBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDhCQUE4QjtBQUMvQixpRUFBZSxTQUFTLEVBQUM7QUFDekI7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5RG9DO0FBQzdCO0FBQ1AsWUFBWSxrREFBUztBQUNyQixZQUFZLGtEQUFTO0FBQ3JCLFlBQVksa0RBQVM7QUFDckIsWUFBWSxrREFBUztBQUNyQixZQUFZLGtEQUFTO0FBQ3JCLFlBQVksa0RBQVM7QUFDckIsWUFBWSxrREFBUztBQUNyQixZQUFZLGtEQUFTO0FBQ3JCLFlBQVksa0RBQVM7QUFDckIsWUFBWSxrREFBUztBQUNyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWm9DO0FBQ087QUFDQztBQUNyQztBQUNQLDZCQUE2QixXQUFXO0FBQ3hDLHVCQUF1QixxREFBWSxTQUFTLG9EQUFXO0FBQ3ZEO0FBQ0EsWUFBWSxrREFBUztBQUNyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNSdUM7QUFDSDtBQUNwQyxZQUFZLGtEQUFTLHlCQUF5QixrREFBUywyQkFBMkIsa0RBQVM7QUFDM0Y7QUFDQSxJQUFJLGtEQUFTO0FBQ2IsSUFBSSxrREFBUztBQUNiLElBQUksa0RBQVM7QUFDYixJQUFJLGtEQUFTO0FBQ2IsSUFBSSxrREFBUztBQUNiLElBQUksa0RBQVM7QUFDYjtBQUNBO0FBQ0EsSUFBSSxrREFBUztBQUNiLElBQUksa0RBQVM7QUFDYixJQUFJLGtEQUFTO0FBQ2IsSUFBSSxrREFBUztBQUNiLElBQUksa0RBQVM7QUFDYixJQUFJLGtEQUFTO0FBQ2IsSUFBSSxrREFBUztBQUNiLElBQUksa0RBQVM7QUFDYixJQUFJLGtEQUFTO0FBQ2I7QUFDTztBQUNQO0FBQ0EsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCO0FBQ0E7QUFDQSxRQUFRLGtEQUFTO0FBQ2pCLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCLFFBQVEsa0RBQVM7QUFDakI7QUFDQSxVQUFVLGtEQUFTLElBQUksa0RBQVMsSUFBSSxrREFBUztBQUM3QztBQUNBLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCO0FBQ0EsV0FBVyxrREFBUyxJQUFJLGtEQUFTLElBQUksa0RBQVMsSUFBSSxrREFBUztBQUMzRDtBQUNBLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCLFFBQVEsa0RBQVM7QUFDakI7QUFDQTtBQUNBLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCO0FBQ0EsV0FBVyxrREFBUyxJQUFJLGtEQUFTLElBQUksa0RBQVMsSUFBSSxrREFBUztBQUMzRCxZQUFZLGtEQUFTLElBQUksa0RBQVMsSUFBSSxrREFBUyxJQUFJLGtEQUFTLElBQUksa0RBQVM7QUFDekUsV0FBVyxrREFBUyxJQUFJLGtEQUFTLElBQUksa0RBQVMsSUFBSSxrREFBUztBQUMzRDtBQUNBLGdCQUFnQixxREFBYztBQUM5QixnQkFBZ0IscURBQWM7QUFDOUIsZ0JBQWdCLHFEQUFjO0FBQzlCLGdCQUFnQixxREFBYztBQUM5QjtBQUNBLG1CQUFtQixxREFBYztBQUNqQyxtQkFBbUIscURBQWM7QUFDakMsbUJBQW1CLHFEQUFjO0FBQ2pDO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hGb0M7QUFDN0I7QUFDUCxRQUFRLGtEQUFTO0FBQ2pCLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ2pCLFFBQVEsa0RBQVM7QUFDakIsUUFBUSxrREFBUztBQUNqQixRQUFRLGtEQUFTO0FBQ1Y7QUFDUCxnQkFBZ0Isa0RBQVM7QUFDekIsZ0JBQWdCLGtEQUFTO0FBQ3pCLGdCQUFnQixrREFBUztBQUNsQjtBQUNQLDZCQUE2QixXQUFXO0FBQ3hDO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3BCb0M7QUFDN0I7QUFDUCxhQUFhLGtEQUFTO0FBQ3RCLGFBQWEsa0RBQVM7QUFDdEIsYUFBYSxrREFBUztBQUN0QixhQUFhLGtEQUFTO0FBQ3RCLGFBQWEsa0RBQVM7QUFDdEIsYUFBYSxrREFBUztBQUN0Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUjBEO0FBQ1o7QUFDRTtBQUNXO0FBQ2xCO0FBQ0k7QUFDTjtBQUNNO0FBQ21CO0FBQ0o7QUFDeEI7QUFDWTtBQUNoRDtBQUNBLElBQUksaURBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaURBQVM7QUFDeEI7QUFDQSxtQkFBbUIsbURBQVc7QUFDOUI7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDJEQUFTO0FBQzFDO0FBQ0EscUNBQXFDLHFFQUFpQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLDBEQUFTO0FBQ3ZELDhDQUE4QyxpRUFBZ0I7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLG9EQUFXO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsNkNBQUk7QUFDcEMsMENBQTBDLDZDQUFJO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qyx1REFBTTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsbUVBQWU7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsb0RBQVc7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsdURBQU07QUFDOUMsNENBQTRDLHdEQUFPLGFBQWEsMERBQVM7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsNERBQVU7QUFDNUM7QUFDQSxnREFBZ0Qsb0ZBQW9GO0FBQ3BJO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsa0RBQVM7QUFDWCxpRUFBZSxlQUFlLEVBQUM7QUFDL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUcrQztBQUNpQjtBQUNsQjtBQUNFO0FBQ1E7QUFDSTtBQUNoQjtBQUNvQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdEQUFTO0FBQ3hCO0FBQ0EsbUJBQW1CLGtEQUFXO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHlEQUFTO0FBQ3BELDJDQUEyQyx5REFBUztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsNERBQW9CO0FBQ3RELDJDQUEyQyx5REFBUztBQUNwRDtBQUNBLGtDQUFrQyw0REFBb0I7QUFDdEQsMkNBQTJDLHlEQUFTO0FBQ3BELDJDQUEyQyx5REFBUztBQUNwRCwyQ0FBMkMseURBQVM7QUFDcEQsMkNBQTJDLHlEQUFTO0FBQ3BELDJDQUEyQyx5REFBUztBQUNwRDtBQUNBLDJDQUEyQyx5REFBUztBQUNwRCwyQ0FBMkMseURBQVM7QUFDcEQsMkNBQTJDLHlEQUFTO0FBQ3BELDJDQUEyQyx5REFBUztBQUNwRCwyQ0FBMkMseURBQVM7QUFDcEQsMkNBQTJDLHlEQUFTO0FBQ3BELDJDQUEyQyx5REFBUztBQUNwRCwyQ0FBMkMseURBQVM7QUFDcEQsMkNBQTJDLHlEQUFTO0FBQ3BELDhDQUE4QyxtRUFBZTtBQUM3RDtBQUNBLDZDQUE2QyxtREFBVztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MseURBQVM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLHlEQUFTO0FBQ3hELCtDQUErQyx5REFBUztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGVBQWUsZ0RBQVM7QUFDeEI7QUFDQSxtQkFBbUIsa0RBQVc7QUFDOUI7QUFDQTtBQUNBLGlDQUFpQywyREFBUztBQUMxQztBQUNBLCtCQUErQixvRUFBa0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsbURBQVc7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RCxzQ0FBc0MsZ0VBQWM7QUFDcEQsK0RBQStEO0FBQy9ELGtDQUFrQyw0REFBVTtBQUM1QztBQUNBLGdEQUFnRCxzSEFBc0g7QUFDdEs7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUVBQWUsU0FBUyxFQUFDO0FBQ3pCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3STRCO0FBQ0M7QUFDQztBQUNBO0FBQzlCOzs7Ozs7Ozs7O0FDSkE7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0EsQ0FBQztBQUNELGlFQUFlLEtBQUssRUFBQztBQUNyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwQm1EO0FBQ1Y7QUFDbEMsOEJBQThCO0FBQ3JDO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EscUJBQXFCLHVCQUF1QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIscUJBQXFCO0FBQzlDO0FBQ0EsbURBQW1ELGtCQUFrQjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLDJDQUEyQyxXQUFXO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFdBQVc7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLDBDQUEwQyxXQUFXO0FBQ3JELGVBQWUsc0RBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ08sc0NBQXNDO0FBQ3RDO0FBQ1A7QUFDQSwwQ0FBMEMsV0FBVztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLHNEQUFzRCxXQUFXO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsMENBQTBDLFdBQVc7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsNENBQTRDLFdBQVc7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGVBQWUsZ0VBQXVCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDaElBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGlDQUFpQyxtQkFBbUI7QUFDcEQsS0FBSztBQUNMO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixrQkFBa0I7QUFDbEM7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDbkZPO0FBQ1A7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0h5QjtBQUNEO0FBQ0U7QUFDQTtBQUNBO0FBQ0Q7QUFDQTtBQUNDO0FBQ0c7QUFDSTtBQUNVO0FBQzNDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGlDQUFpQztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckRvRDtBQUM3Qyw4QkFBOEIsMkNBQTJDLGdCQUFnQjtBQUN6RixnQ0FBZ0MsOERBQVM7QUFDekM7QUFDUDtBQUNBO0FBQ08sMkNBQTJDO0FBQ2xEOzs7Ozs7Ozs7Ozs7Ozs7O0FDUHVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixXQUFXO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3RELGdDQUFnQyxvREFBVSxZQUFZO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSwwQ0FBMEMsV0FBVztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2pFaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwQkFBMEI7QUFDM0I7QUFDQTtBQUNBLG1CQUFtQixxREFBSTtBQUN2QixxQkFBcUIscURBQUk7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxpQkFBaUI7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQSxDQUFDO0FBQ2M7QUFDZjs7Ozs7Ozs7Ozs7Ozs7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBLENBQUM7QUFDb0I7QUFDckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJPLHdDQUF3QztBQUN4Qyx5Q0FBeUM7QUFDekM7QUFDUDtBQUNBO0FBQ08sbUNBQW1DO0FBQ25DLHFDQUFxQztBQUNyQyx1Q0FBdUM7QUFDdkM7QUFDUDtBQUNBLG1EQUFtRCxXQUFXO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLHNCQUFzQixjQUFjO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNPO0FBQ1AsaUNBQWlDO0FBQ2pDO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDQTtBQUNBLHNDQUFzQztBQUN0QyxrQ0FBa0M7QUFDbEM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLHlDQUF5QyxVQUFVO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxXQUFXO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxXQUFXO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pJd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFVBQVU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELHFEQUFXO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFVBQVU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQscURBQVc7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsOEJBQThCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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RTNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDViw4QkFBOEI7QUFDOUIsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEtBQUs7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw0QkFBNEI7QUFDNUIsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxTQUFTLEtBQXFDO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isc0JBQXNCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxJQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQiwyQkFBMkI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDLDRGQUE0RixDQUFNO0FBQzdJO0FBQ0E7O0FBRUEsb0JBQW9CLGdDQUFnQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQixnQ0FBZ0M7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlIQUFpSDtBQUNqSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtB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QUFPO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDK0I7QUFDTztBQUNGO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsMEVBQTBFLDZFQUE2RTtBQUN2SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsYUFBYTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELFdBQVc7QUFDNUQ7QUFDQSxpREFBaUQsV0FBVztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9IQUFvSDtBQUNwSCxnSEFBZ0g7QUFDaEgsMEhBQTBIO0FBQzFILDRIQUE0SDtBQUM1SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFdBQVc7QUFDdkI7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZTtBQUNmLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDemJhO0FBQ2IsZUFBZTtBQUNmLGFBQWEsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQmE7QUFDYixjQUFjO0FBQ2QsYUFBYSxtQkFBTyxDQUFDLG9GQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCYTtBQUNiLG9CQUFvQjtBQUNwQixhQUFhLG1CQUFPLENBQUMsd0hBQStCO0FBQ3BELGNBQWMsbUJBQU8sQ0FBQyw4RkFBa0I7QUFDeEMsY0FBYyxtQkFBTyxDQUFDLG9GQUFhOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDakNhO0FBQ2Isc0JBQXNCO0FBQ3RCLGFBQWEsbUJBQU8sQ0FBQyxvRkFBYTtBQUNsQyxjQUFjLG1CQUFPLENBQUMsa0dBQW9COztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDaENhO0FBQ2IseUJBQXlCOztBQUV6QixhQUFhLG1CQUFPLENBQUMsOEdBQTBCOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDBDQUEwQztBQUNqRTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOzs7Ozs7Ozs7Ozs7QUMvQmE7QUFDYixnQkFBZ0I7QUFDaEIsYUFBYSxtQkFBTyxDQUFDLG9GQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCYTtBQUNiLGlCQUFpQjtBQUNqQixhQUFhLG1CQUFPLENBQUMsb0ZBQWE7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuQ2E7QUFDYixrQkFBa0I7QUFDbEIsYUFBYSxtQkFBTyxDQUFDLDBGQUFnQjtBQUNyQyxjQUFjLG1CQUFPLENBQUMsb0dBQXFCO0FBQzNDLGNBQWMsbUJBQU8sQ0FBQyw0R0FBeUI7QUFDL0MsY0FBYyxtQkFBTyxDQUFDLG9GQUFhOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RDYTtBQUNiLHNCQUFzQjtBQUN0QixhQUFhLG1CQUFPLENBQUMsa0dBQW9CO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxvR0FBcUI7QUFDM0MsY0FBYyxtQkFBTyxDQUFDLG9GQUFhOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNyRGE7QUFDYixrQkFBa0I7QUFDbEIsYUFBYSxtQkFBTyxDQUFDLG9GQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCYTtBQUNiLGdCQUFnQjtBQUNoQixhQUFhLG1CQUFPLENBQUMsb0ZBQWE7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0JhO0FBQ2Isa0JBQWtCO0FBQ2xCLGFBQWEsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQmE7QUFDYixrQkFBa0I7QUFDbEIsYUFBYSxtQkFBTyxDQUFDLG9GQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzNCYTtBQUNiLGVBQWU7QUFDZixhQUFhLG1CQUFPLENBQUMsb0ZBQWE7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0JhO0FBQ2IsZUFBZTtBQUNmLGFBQWEsbUJBQU8sQ0FBQywwRkFBZ0I7QUFDckMsY0FBYyxtQkFBTyxDQUFDLDhGQUFrQjtBQUN4QyxjQUFjLG1CQUFPLENBQUMsc0dBQXNCO0FBQzVDLGNBQWMsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbkM7QUFDQSxRQUFRLGVBQWU7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMxRGE7QUFDYixtQkFBbUI7QUFDbkIsYUFBYSxtQkFBTyxDQUFDLGtHQUFvQjtBQUN6QyxjQUFjLG1CQUFPLENBQUMsOEZBQWtCO0FBQ3hDLGNBQWMsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbkMsY0FBYyxtQkFBTyxDQUFDLDhHQUEwQjs7QUFFaEQ7QUFDQSxRQUFRLG1CQUFtQjtBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxpQkFBaUI7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsMEJBQTBCO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25GYTtBQUNiLGVBQWU7QUFDZixhQUFhLG1CQUFPLENBQUMsb0ZBQWE7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN6QmE7QUFDYixlQUFlO0FBQ2YsYUFBYSxtQkFBTyxDQUFDLG9GQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNUJhO0FBQ2IsZ0JBQWdCO0FBQ2hCLGFBQWEsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzVCYTtBQUNiLGNBQWMsV0FBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZDYTtBQUNiLGVBQWU7QUFDZixhQUFhLG1CQUFPLENBQUMsb0ZBQWE7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMvQmE7QUFDYixpQkFBaUI7QUFDakIsYUFBYSxtQkFBTyxDQUFDLDRGQUFpQjs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7O0FDdkNhO0FBQ2IsbUJBQW1CO0FBQ25CLGFBQWEsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNwQ2E7QUFDYixxQkFBcUI7QUFDckIsYUFBYSxtQkFBTyxDQUFDLG9HQUFxQjs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNsQ2E7QUFDYixrQkFBa0I7QUFDbEIsYUFBYSxtQkFBTyxDQUFDLG9GQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNUJhO0FBQ2IsZUFBZTtBQUNmLGFBQWEsbUJBQU8sQ0FBQyxvRkFBYTtBQUNsQyxjQUFjLG1CQUFPLENBQUMsb0ZBQWE7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM1Q2E7QUFDYix3QkFBd0I7QUFDeEIsYUFBYSxtQkFBTyxDQUFDLG9GQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGtCQUFrQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixrQkFBa0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNyRGE7QUFDYix5QkFBeUI7O0FBRXpCO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDVmE7QUFDYix1QkFBdUIsb0JBQW9COztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2hFYTtBQUNiLG9CQUFvQjs7QUFFcEI7QUFDQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzRGE7QUFDYiwyQkFBMkI7O0FBRTNCO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsYUFBYTtBQUNiO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3RCYTtBQUNiLFlBQVk7QUFDWixhQUFhLG1CQUFPLENBQUMsaUlBQWdDO0FBQ3JELGNBQWMsbUJBQU8sQ0FBQyx5SEFBNEI7QUFDbEQsY0FBYyxtQkFBTyxDQUFDLGlJQUFnQztBQUN0RCxjQUFjLG1CQUFPLENBQUMscUhBQTBCO0FBQ2hELGNBQWMsbUJBQU8sQ0FBQywrR0FBdUI7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFlBQVk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7Ozs7Ozs7Ozs7OztBQzNCWTtBQUNiLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEMsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDLEdBQUc7O0FBRUg7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixHQUFHOztBQUVIO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QixHQUFHOztBQUVIO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEIsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLEdBQUc7O0FBRUg7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCLEdBQUc7O0FBRUg7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QixHQUFHOztBQUVIO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QixHQUFHOztBQUVIO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEIsR0FBRzs7QUFFSDtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUIsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLEdBQUc7O0FBRUg7QUFDQTtBQUNBLG1CQUFtQixRQUFRO0FBQzNCLEdBQUc7O0FBRUg7QUFDQTtBQUNBLHFCQUFxQixRQUFRO0FBQzdCLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSix5Q0FBeUMsT0FBTztBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7Ozs7Ozs7Ozs7OztBQ3hHVDtBQUNiLGtCQUFrQjtBQUNsQixhQUFhLG1CQUFPLENBQUMsK0hBQWlDOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxPQUFPLE9BQU8sTUFBTTtBQUMvQixXQUFXLE9BQU8sT0FBTyxNQUFNO0FBQy9CLGFBQWEsTUFBTSxJQUFJLE1BQU07QUFDN0IsWUFBWSxNQUFNLElBQUksTUFBTTtBQUM1Qjs7QUFFQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7Ozs7Ozs7Ozs7O0FDeENZO0FBQ2Isc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7Ozs7Ozs7Ozs7OztBQ2RUO0FBQ2IsZ0JBQWdCO0FBQ2hCLGFBQWEsbUJBQU8sQ0FBQywySEFBK0I7O0FBRXBEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7Ozs7Ozs7Ozs7OztBQzVMWTtBQUNiLGFBQWE7O0FBRWIsYUFBYSxtQkFBTyxDQUFDLHFIQUE0QjtBQUNqRCxjQUFjLG1CQUFPLENBQUMsbUlBQW1DOztBQUV6RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7Ozs7Ozs7Ozs7OztBQ3RJWTtBQUNiLFdBQVc7QUFDWCxhQUFhLG1CQUFPLENBQUMsb0ZBQWE7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOzs7Ozs7Ozs7Ozs7QUMzQ2E7QUFDYixXQUFXO0FBQ1gsYUFBYSxtQkFBTyxDQUFDLG9GQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZDYTtBQUNiLGtEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQyxFQUFDO0FBQ0YsYUFBYTtBQUNiLDJDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQyxFQUFDO0FBQ0YsYUFBYSxtQkFBTyxDQUFDLGtHQUFvQjtBQUN6QyxjQUFjLG1CQUFPLENBQUMsMEdBQXdCO0FBQzlDLGNBQWMsbUJBQU8sQ0FBQyw0R0FBeUI7QUFDL0MsY0FBYyxtQkFBTyxDQUFDLG9GQUFhOztBQUVuQyxjQUFjLG1CQUFPLENBQUMsNEhBQWlDO0FBQ3ZELGNBQWMsbUJBQU8sQ0FBQyxnSEFBMkI7O0FBRWpELGNBQWMsbUJBQU8sQ0FBQyw0R0FBeUI7O0FBRS9DLGNBQWMsbUJBQU8sQ0FBQywwR0FBd0I7O0FBRTlDO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLGFBQWE7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxXQUFXO0FBQzVEO0FBQ0EsaURBQWlELFdBQVc7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7OztBQUdaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0EsOERBQThEO0FBQzlELFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QixXQUFXLFFBQVE7QUFDbkIsV0FBVyxHQUFHO0FBQ2Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxTQUFTO0FBQ1QsdUJBQXVCO0FBQ3ZCO0FBQ0EsU0FBUztBQUNULHVCQUF1QjtBQUN2QjtBQUNBLFNBQVM7QUFDVCx3QkFBd0I7QUFDeEI7QUFDQSxTQUFTO0FBQ1Qsd0JBQXdCO0FBQ3hCO0FBQ0EsU0FBUztBQUNULGlDQUFpQztBQUNqQztBQUNBLFNBQVM7QUFDVCwyQkFBMkI7QUFDM0I7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyREFBMkQ7O0FBRTNEO0FBQ0E7O0FBRUE7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsa0JBQWtCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7O0FBRUE7QUFDQTtBQUNBLGdGQUFnRjtBQUNoRjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7OztBQUdsQjtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEdBQUc7QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0EsMERBQTBE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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCLFdBQVcsUUFBUTtBQUNuQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFlBQVksUUFBUTtBQUNwQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSw2Q0FBNkM7QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZCxZQUFZLFFBQVE7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjs7QUFFL0IsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCLFdBQVcsUUFBUTtBQUNuQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGtDQUFrQztBQUM1QztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxpQ0FBaUMsSUFBSTtBQUMzQztBQUNBO0FBQ0EsTUFBTSxpQ0FBaUMsSUFBSTtBQUMzQztBQUNBLDZEQUE2RDtBQUM3RCxNQUFNLGlDQUFpQyxJQUFJO0FBQzNDO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSw2TkFBNk47QUFDN047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2RUFBNkUsWUFBWTtBQUN6RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpSUFBaUksOEJBQThCO0FBQy9KO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUZBQW1GO0FBQ25GOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVEsMENBQTBDOzs7QUFHbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0dBQWdHO0FBQ2hHOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsMENBQTBDOzs7QUFHbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFD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Q0E7QUFDQSx1REFBdUQ7O0FBRXZELDJDQUEyQztBQUMzQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQSx5Q0FBeUM7O0FBRXpDO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0Isb0JBQW9CO0FBQzVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQSx1Q0FBdUM7O0FBRXZDLCtCQUErQjtBQUMvQjs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Es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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsZ0JBQWdCLGVBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQztBQUNoQyxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQyxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDO0FBQ2xDO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5Q0FBeUM7QUFDekM7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksUUFBUTtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBLGtEQUFrRDtBQUNsRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUEsb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOzs7QUFHQSxnRkFBZ0Y7QUFDaEY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7OztBQUdBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLFNBQVM7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEdBQThHO0FBQzlHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSixrQkFBa0Isa0JBQWtCO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyx3QkFBd0I7QUFDbkMsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsd0JBQXdCO0FBQ25DLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHdCQUF3QjtBQUNuQyxXQUFXLFFBQVE7QUFDbkI7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwrRUFBK0U7QUFDL0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYTtBQUNiOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isb0NBQW9DO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyR0FBMkc7QUFDM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0YsMlRBQTJUO0FBQzNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLHFCQUFxQiwrQkFBK0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsMEJBQTBCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RTtBQUN4RSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBHQUEwRztBQUMxRzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCOzs7QUFHM0I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDOztBQUVoQztBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0EscUNBQXFDOzs7QUFHckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQixPQUFPO0FBQ2pDO0FBQ0E7O0FBRUE7O0FBRUEsMEJBQTBCLE9BQU87QUFDakM7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlJQUFpSSxtQkFBbUIsZ0JBQWdCLCtCQUErQjtBQUNuTSxNQUFNO0FBQ047QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTSxvR0FBb0csa0NBQWtDO0FBQzVJO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsNEJBQTRCO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLDJFQUEyRSxvR0FBb0csa0NBQWtDO0FBQ3ZOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU0sb0dBQW9HO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtRUFBbUU7O0FBRW5FLCtGQUErRjtBQUMvRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsNEJBQTRCO0FBQ2xEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQix3QkFBd0I7QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJEQUEyRDtBQUMzRDtBQUNBLGdGQUFnRjtBQUNoRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQSxjQUFjOzs7QUFHZDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQSwydkJBQTJ2Qjs7QUFFM3ZCO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQzs7QUFFckMsd0RBQXdEOztBQUV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0NBQWdDOztBQUVoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RTtBQUN4RTtBQUNBO0FBQ0EsRUFBRSxtQkFBbUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFO0FBQ3pFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSSxjQUFjO0FBQ2xCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxnQkFBZ0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVMsY0FBYztBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sK0NBQStDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSwrQ0FBK0M7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLCtDQUErQztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7O0FBR0EsMEVBQTBFO0FBQzFFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkhBQTJIO0FBQzNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsb0VBQW9FOztBQUVwRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRiwyREFBMkQ7O0FBRTNELHFEQUFxRDtBQUNyRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qjs7QUFFQSxrQ0FBa0M7O0FBRWxDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxzSkFBc0o7O0FBRXRKLHFDQUFxQztBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUE4RDtBQUM5RCxxREFBcUQ7QUFDckQsMkRBQTJEO0FBQzNELDJDQUEyQztBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7O0FBRXREOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDOztBQUUvQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4SEFBOEgseUNBQXlDO0FBQ3ZLOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0Isd0JBQXdCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLGtEQUFrRDtBQUM3RDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSw2QkFBNkI7QUFDMUM7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOzs7QUFHTix3RUFBd0U7O0FBRXhFLFdBQVcsNkJBQTZCO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7OztBQUdBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsaUNBQWlDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekI7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOzs7QUFHTix3RUFBd0U7O0FBRXhFLFdBQVcsWUFBWTtBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxNQUFNO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFDQUFxQzs7QUFFckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0Qjs7QUFFNUI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0ZBQXNGOztBQUV0Riw0REFBNEQ7QUFDNUQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw2QkFBNkI7QUFDakQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0VBQWdFOztBQUVoRTtBQUNBLHVDQUF1QztBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDOztBQUUxQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVLHlCQUF5Qjs7O0FBR25DO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVix3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDOztBQUU3Qzs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQzs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DOztBQUVuQztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7OztBQUdWO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLG9CQUFvQjtBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEOztBQUVBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUE4RDs7QUFFOUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOERBQThEOztBQUU5RDtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBOztBQUVBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsNENBQTRDOztBQUU1QztBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0Isa0NBQWtDO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUEsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQjtBQUMvQixvREFBb0Q7QUFDcEQ7QUFDQTs7QUFFQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBOztBQUVBLHdEQUF3RDs7QUFFeEQsd0JBQXdCO0FBQ3hCO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7O0FBRTFCLGlDQUFpQztBQUNqQztBQUNBOztBQUVBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLDhCQUE4QjtBQUN0RDtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsNENBQTRDO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTixJQUFJO0FBQ0o7OztBQUdBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0EseUtBQXlLLDBDQUEwQztBQUNuTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOzs7QUFHTjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQzs7O0FBR25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCOztBQUU5QixnREFBZ0Q7QUFDaEQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZUFBZTtBQUN6QixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnRUFBZ0U7O0FBRWhFO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGlDQUFpQztBQUNqQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSixpR0FBaUc7QUFDakcsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOElBQThJOztBQUU5STtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWLGtFQUFrRSw0Q0FBNEM7QUFDOUc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDO0FBQzdDLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBLHNEQUFzRDtBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1JQUFtSTtBQUNuSTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUlBQW1JO0FBQ25JO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxRQUFRLElBQUk7QUFDWjtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7O0FBR0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUEsaUhBQWlIO0FBQ2pIO0FBQ0E7QUFDQTs7QUFFQSx5Q0FBeUM7QUFDekMsTUFBTSxLQUFLLEVBS047QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxnREFBZ0Q7O0FBRWhELDhCQUE4QjtBQUM5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsMkNBQTJDO0FBQzNDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQSw0R0FBNEc7QUFDNUc7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7O0FBR0EsaVFBQWlRO0FBQ2pROztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLGdGQUFnRjtBQUNoRjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrR0FBK0c7QUFDL0c7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsMEVBQTBFOztBQUUxRTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpR0FBaUc7QUFDakc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQzs7QUFFaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DOztBQUVwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7O0FBRWhEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVOzs7QUFHVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOLG1DQUFtQztBQUNuQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7O0FBRWxEOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaURBQWlEOztBQUVqRDtBQUNBO0FBQ0EseUVBQXlFOztBQUV6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUVBQXVFOztBQUV2RTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDJDQUEyQzs7QUFFM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQSxpREFBaUQ7O0FBRWpEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0Esc0VBQXNFOztBQUV0RSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR04seUNBQXlDOztBQUV6QztBQUNBLHVDQUF1QztBQUN2QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7O0FBRXREOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTtBQUNBLElBQUk7QUFDSiwrR0FBK0c7QUFDL0c7QUFDQSx5QkFBeUI7O0FBRXpCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSixnR0FBZ0c7QUFDaEc7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBLElBQUk7OztBQUdKLDBFQUEwRTs7QUFFMUU7QUFDQTtBQUNBLDRGQUE0RjtBQUM1Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVHQUF1RztBQUN2Rzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDs7QUFFNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQzs7QUFFMUMsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHO0FBQ2hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLDRDQUE0QztBQUM1Qzs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEseU5BQXlOLEdBQUc7O0FBRTVOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFCQUFxQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsWUFBWTtBQUMvQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTs7O0FBR1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7O0FBRW5EO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQSwwQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdIQUFnSDtBQUNoSDtBQUNBOztBQUVBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLGdIQUFnSDtBQUNoSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7OztBQUdBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEOztBQUU3RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLG9DQUFvQztBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0REFBNEQ7QUFDNUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOzs7QUFHQTtBQUNBLCtDQUErQztBQUMvQztBQUNBOztBQUVBLHNIQUFzSDs7QUFFdEgsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrR0FBa0c7QUFDbEc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQSxrR0FBa0c7QUFDbEc7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsY0FBYzs7O0FBR2Q7QUFDQTtBQUNBOztBQUVBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsaURBQWlEO0FB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O0FBRUEsZ0VBQWdFO0FBQ2hFOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx3RUFBd0U7O0FBRXhFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0QztBQUM1Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qjs7QUFFdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCOztBQUU1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7OztBQUdWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZCxrT0FBa08scUNBQXFDLHdGQUF3RiwyQkFBMkIscUJBQXFCLFFBQVEsYUFBYTtBQUNwYSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7OztBQUdBLGlFQUFpRTtBQUNqRTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxRQUFRLDRJQUE0STtBQUNwSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRCQUE0QjtBQUM1QjtB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OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTs7QUFFQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1Qzs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7O0FBRXZFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0QkFBNEI7O0FBRTVCOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixzQkFBc0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0QjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0Rjs7QUFFNUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUIsa0NBQWtDOztBQUVsQywrQkFBK0I7O0FBRS9CLDJCQUEyQjs7QUFFM0IsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0RBQXNEOztBQUV0RCxtREFBbUQ7O0FBRW5ELHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7O0FBRUEsK0NBQStDO0FBQy9DOztBQUVBLDhDQUE4Qzs7QUFFOUMseURBQXlEOztBQUV6RCw2Q0FBNkM7O0FBRTdDLCtDQUErQztBQUMvQzs7QUFFQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQSxnQ0FBZ0M7QUFDaEM7O0FBRUEsbURBQW1EO0FBQ25EOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRDtBQUNoRDs7QUFFQSxnREFBZ0Q7O0FBRWhEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0osK0RBQStEOztBQUUvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEOztBQUVsRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2RUFBNkU7QUFDN0U7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFO0FBQ2xFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGOztBQUU1RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0VBQW9FOzs7QUFHcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQixtQkFBbUI7QUFDN0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxvRkFBb0Y7QUFDcEY7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLDZDQUE2QztBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBOztBQUVB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QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUVBQXFFOztBQUVyRTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsNENBQTRDO0FBQ3BEOzs7QUFHQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBOztBQUVBLGtEQUFrRDs7QUFFbEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1IQUFtSDs7QUFFbkg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEdBQUc7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw4TEFBOEwsb0RBQW9ELEVBQUU7QUFDcFAsUUFBUTtBQUNSO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1PQUFtTyxvREFBb0QsRUFBRTtBQUN6UjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQyxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9COztBQUVwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osZ0RBQWdEOztBQUVoRCx3Q0FBd0M7QUFDeEM7O0FBRUEsb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7O0FBRWxEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7O0FBRXRELHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0xBQXdMOztBQUV4TCw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMEVBQTBFO0FBQzFFO0FBQ0E7O0FBRUEsOENBQThDO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsR0FBRztBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEOztBQUV4RDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdEQUF3RDs7QUFFeEQ7QUFDQSxtQ0FBbUM7O0FBRW5DOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTixzQkFBc0Isd0JBQXdCO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdEQUF3RCxRQUFROztBQUVoRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxnTEFBZ0wsOEJBQThCO0FBQzlNO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0EsNkRBQTZEOztBQUU3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRDs7QUFFaEQ7O0FBRUE7QUFDQSxvQkFBb0IsMkJBQTJCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssR0FB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QUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOENB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Q0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOztBQUVWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxHQUFHO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FB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QUMxRCxrREFBa0Qsb0NBQW9DO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsZ0JBQWdCO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGVBQWU7QUFDekI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0Esa0JBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsUUFB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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGNBQWMsdUJBQXVCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLHNEQUFXO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFCQUFxQix1QkFBdUI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04scURBQXFELFVBQVU7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsMEJBQTBCO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FB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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7O0FBRUEsdUNBQXVDOztBQUV2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGOztBQUVyRjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbURBQW1EOztBQUVuRCw2RkFBNkY7QUFDN0Y7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0Es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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkhBQTJIO0FBQzNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsb0VBQW9FOztBQUVwRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZCxXQUFXLGVBQWU7QUFDMUIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxHQUFHOztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEdBQUc7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLDJEQUEyRCxVQUFVO0FBQ3JFLHlCQUF5QixVQUFVO0FBQ25DO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsV0FBVyxHQUFHO0FBQ2Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkRBQTZEO0FBQzdEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsR0FBRztBQUNkOzs7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkLFdBQVcsZUFBZTtBQUMxQixXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEdBQUc7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssR0FBRztBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUVBQXFFOztBQUVyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtB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QSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLElBQUk7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsZ0RBQVM7QUFDekM7QUFDQSw4QkFBOEIsc0RBQVE7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsOEJBQThCO0FBQzlCLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixLQUFLO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsNEJBQTRCO0FBQzVCLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxTQUFTLEtBQXFDO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHNCQUFzQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsSUFBcUM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0IsMkJBQTJCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQyw0RkFBNEYsQ0FBTTtBQUM3STtBQUNBOztBQUVBLG9CQUFvQixnQ0FBZ0M7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLGdDQUFnQztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7OztBQzlrQkE7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLE9BQU87QUFDdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWSxVQUFVO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixPQUFPO0FBQ1AsWUFBWSxVQUFVO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsVUFBVSxhQUFhLG1DQUFtQztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUwsVUFBVSxVQUFVO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzdNYTtB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFXN0I7O0FBRXJFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLG9FQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMscUVBQWE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVpVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5SWpUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVnVjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0loVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUN5RTtBQUN6RSxtQkFBbUIsMENBQVE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsOENBQWdCO0FBQzNCO0FBQ0E7O0FBRUE7QUFDaUU7QUFDakU7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsOENBQVEsVUFBVSw4Q0FBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLFFBQVE7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEMsYUFBYTtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxXQUFXLGNBQWM7QUFDNUIsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLGlFQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLGdGQUFnRixFQUFFO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtGQUErRixhQUFhO0FBQzVHO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1HQUFtRyxlQUFlO0FBQ2xIO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsNEJBQTRCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1HQUFtRyxlQUFlO0FBQ2xIO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxFQUFFO0FBQ3pFLFFBQVE7QUFDUiwyQ0FBMkMsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLElBQUk7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0UsRUFBRSxHQUFHLEVBQUU7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpR0FBaUcsZUFBZTtBQUNoSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNk07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyMEU3TTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRXlIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkx6SDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWEsS0FBcUM7QUFDbEQ7QUFDQTtBQUNBLDhCQUE4QixPQUFPLGtGQUFrRixPQUFPO0FBQzlILEdBQUc7QUFDSDtBQUNBLGlLQUFpSyxNQUFNO0FBQ3ZLLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsTUFBTTtBQUNwRCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxNQUFNO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLElBQUksQ0FBRTtBQUNOO0FBQ0EsTUFBTSxJQUFxQztBQUMzQztBQUNBO0FBQ0EsK0JBQStCLElBQUk7QUFDbkM7QUFDQTtBQUNBLGtDQUFrQyxNQUFNO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0JBQWdCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxNQUFNLEtBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsY0FBYyxXQUFXO0FBQ3pCO0FBQ0Esc0JBQXNCLHFCQUFxQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLElBQUk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsSUFBSTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixJQUFJO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRkFBZ0YsQ0FBd3BCO0FBQ3h1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1Isb0NBQW9DLEdBQUc7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsUUFBUTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFFBQVE7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLG1DQUFtQyxXQUFXLElBQUk7QUFDMUYsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixRQUFRO0FBQzlCO0FBQ0E7QUFDQSwyQkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixTQUFTO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFlBQVksT0FBTyxXQUFXO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixHQUFHO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxLQUFLO0FBQ2hEO0FB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O0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLHdCQUF3QixhQUFhLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxhQUFhO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTixzQkFBc0IsV0FBVztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxRQUFRO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxRQUFRO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELGdCQUFnQjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7QUFNRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdqQkFBZ2pCLGdCQUFnQjtBQUNoa0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsUUFBUTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIscUJBQXFCO0FBQ2xELDRCQUE0QixxQkFBcUI7QUFDakQ7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sb0JBQW9CLHFCQUFxQjtBQUN6QyxtQkFBbUIscUJBQXFCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsdUNBQXVDO0FBQ3JFO0FBQ0EsaUNBQWlDLHlDQUF5QztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixtREFBbUQ7QUFDMUU7QUFDQTtBQUNBLHdCQUF3QixxREFBcUQ7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQ0FBbUMsOENBQThDO0FBQ2pGLG9DQUFvQyw4Q0FBOEM7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULHdFQUF3RSxLQUFLO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHVDQUF1QztBQUMvRDtBQUNBO0FBQ0EsUUFBUTtBQUNSLHdCQUF3Qix1Q0FBdUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0UsS0FBSztBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7QUFJRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixJQUFJLEdBQUcsMkJBQTJCO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLHlDQUF5QyxrQkFBa0I7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLHVDQUF1QyxzQkFBc0IsTUFBTSxHQUFHO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFdBQVcsRUFBRSxzQkFBc0I7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFFBQVE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFNBQVMsV0FBVyxFQUFFO0FBQzlELDhCQUE4QixlQUFlLGVBQWUsRUFBRSxNQUFNLEtBQUs7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFO0FBQ2xFLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiw2QkFBNkI7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixlQUFlLFNBQVMsV0FBVyxFQUFFO0FBQ2pFO0FBQ0E7QUFDQSwwQkFBMEIsZUFBZSxnQkFBZ0IsRUFBRSxNQUFNLEtBQUs7QUFDdEUsTUFBTTtBQUNOLGdDQUFnQyw2QkFBNkI7QUFDN0Q7QUFDQSxzQ0FBc0MsNkJBQTZCLElBQUk7QUFDdkU7QUFDQSwwQkFBMEIsZUFBZSw0QkFBNEIsRUFBRSxFQUFFLElBQUksTUFBTSxLQUFLO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sc0RBQXNELEdBQUc7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxPQUFPO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCwwQkFBMEIsT0FBTztBQUNqQztBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFdBQVc7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsVUFBVTtBQUNoQztBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFVBQVU7QUFDNUI7QUFDQSx3QkFBd0IsVUFBVTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsUUFBUTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsUUFBUTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxNQUFNO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsVUFBVTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5Qiw2Q0FBNkMsY0FBYztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG9CQUFvQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQSxJQUFJO0FBQ0osV0FBVyxlQUFlO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsUUFBUTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxRQUFRO0FBQzdDO0FBQ0E7QUFDQSxJQUFJO0FBQ0oscUNBQXFDLFFBQVE7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7QUFLRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxZQUFZO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsc0JBQXNCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLGdCQUFnQixnQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxJQUFJO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLHVDQUF1QyxhQUFhO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFlBQVk7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELEtBQUssS0FBSyxxQkFBcUI7QUFDdkY7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsS0FBSyxTQUFTO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGtCQUFrQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixrQkFBa0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMscUJBQXFCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFFBQVE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsV0FBVztBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsWUFBWTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLFdBQVc7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFlBQVk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1Isa0RBQWtELFFBQVE7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsU0FBUztBQUMzRDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELEdBQUc7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLHNEQUFzRCxHQUFHO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxzREFBc0QsR0FBRztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0Esc0RBQXNELEdBQUc7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxhQUFhO0FBQzNEO0FBQ0E7QUFDQSwrQkFBK0IsV0FBVztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELEdBQUc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsR0FBRyxHQUFHLGNBQWM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixxREFBcUQsT0FBTztBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG9CQUFvQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0JBQWtCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLEVBQUU7QUFDaEQ7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7QUFJRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSxPQUFPLDBCQUEwQixJQUFJO0FBQzdHO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELElBQUk7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsTUFBTSxHQUFHLFFBQVE7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxXQUFXLEdBQUcsYUFBYTtBQUN4RTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7OztBQUlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsVUFBVTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsVUFBVTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLE1BQU0sR0FBRyxRQUFRO0FBQ3hEO0FBQ0E7QUFDQSw4REFBOEQsVUFBVTtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSx3REFBd0QsS0FBSztBQUM3RDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsZ0NBQWdDO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsUUFBUTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLElBQUksR0FBRztBQUM1QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsNkJBQTZCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGdGQUFnRixlQUFlO0FBQy9GLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxPQUFPO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELGVBQWU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQixHQUFHLG1DQUFtQztBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsK0NBQStDLGNBQWM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELEtBQUs7QUFDakU7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELEtBQUs7QUFDMUQ7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGlCQUFpQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFFBQVEsUUFBUSxRQUFRLEdBQUcsUUFBUTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLE1BQU07QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0ZBQXdGLG9CQUFvQjtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtDQUFrQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSwyQkFBMkIsZ0JBQWdCLEdBQUcsT0FBTztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0Msd0NBQXdDO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHdDQUF3QztBQUN4RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7QUFNRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RSxHQUFHO0FB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O0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxVQUFVO0FBQ3hEO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekMsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFLGlCQUFpQixFQUFFLEdBQUc7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxXQUFXO0FBQ3ZFLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsZUFBZTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsUUFBUTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixvQkFBb0Isa0JBQWtCO0FBQ3RDLG1CQUFtQixrQkFBa0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSwwQ0FBMEMsUUFBUTtBQUNsRDtBQUNBO0FBQ0EscUJBQXFCLEVBQUUsR0FBRyxFQUFFO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQSx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSx1QkFBdUIsd0JBQXdCLGFBQWEsdURBQXVEO0FBQ25IO0FBQ0EsMkNBQTJDLGlDQUFpQyxHQUFHO0FBQy9FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsaUJBQWlCLEVBQUUsR0FBRztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsR0FBRztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7QUFLRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLEtBQUs7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDZCQUE2QixlQUFlO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLHVCQUF1QjtBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sNkJBQTZCLGVBQWU7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw0QkFBNEI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixXQUFXO0FBQy9CO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixPQUFPLEVBQUUsTUFBTTtBQUNyQyxzQkFBc0Isb0JBQW9CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixFQUFFO0FBQzVCO0FBQ0EsVUFBVTtBQUNWLDBCQUEwQixFQUFFO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG9CQUFvQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLG9CQUFvQix5QkFBeUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7QUFJRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLEtBQUs7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7OztBQU9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7OztBQU1EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLE1BQU0sRUFBRSxzQkFBc0I7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxQkFBcUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsUUFBUTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxRQUFRO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxRQUFRO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7QUFLRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRSxLQUFLO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7OztBQVFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSwwQkFBMEIsaUJBQWlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSwwQkFBMEIsaUJBQWlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QkFBbUIsc0JBQXNCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUMyRDtBQUNnQztBQUMzQztBQUNtRDtBQUNoRDtBQUM1QztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyx5QkFBeUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxnQ0FBZ0M7QUFDekM7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxZQUFZO0FBQ3hELElBQUk7QUFDSjtBQUNBO0FBQ0EsNEJBQTRCLFlBQVk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFdBQVcsUUFBUSxhQUFhLCtDQUErQyxNQUFNO0FBQzlGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsYUFBYTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsSUFBcUM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFlBQVksTUFBTSxNQUFNLHFDQUFxQyw2QkFBNkI7QUFDekg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLGtEQUFrRCxrQ0FBa0M7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFlBQVksSUFBcUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSTtBQUNOLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQXFDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBLDZGQUE2RjtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsS0FBSztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RkFBNEYsYUFBYTtBQUN6RztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0RBQStEOztBQUUvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYTtBQUNiLGFBQWE7O0FBRWI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxrQkFBa0Is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Q0FDeEQsQ0FDUCxDQUNQLENBQUMsQyIsInNvdXJjZXMiOlsid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9pcy1wcm9wLXZhbGlkL2Rpc3QvZW1vdGlvbi1pcy1wcm9wLXZhbGlkLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9tZW1vaXplL2Rpc3QvZW1vdGlvbi1tZW1vaXplLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9zdHlsaXMvZGlzdC9zdHlsaXMuYnJvd3Nlci5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL3JlYWN0L2Rpc3QvZmxvYXRpbmctdWkucmVhY3QuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BwZGYtbGliL2ZvbnRraXQvZGlzdC9mb250a2l0LmVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BwZGYtbGliL3N0YW5kYXJkLWZvbnRzL2VzL0VuY29kaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BwZGYtbGliL3N0YW5kYXJkLWZvbnRzL2VzL0ZvbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHBkZi1saWIvc3RhbmRhcmQtZm9udHMvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHBkZi1saWIvc3RhbmRhcmQtZm9udHMvZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHBkZi1saWIvdXBuZy9VUE5HLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2FyaWEtaGlkZGVuL2Rpc3QvZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvVGl0bGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvQm9yZGVyUmVzaXplLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL0RlZmF1bHRTaWduYXR1cmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvUGRmSGVhZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1BkZlpvb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvUGxhY2Vob2xkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvUGxhY2Vob2xkZXJCb3JkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvUGxhY2Vob2xkZXJUeXBlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1ByZXZOZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1JlbmRlckFsbFBkZlBhZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvUmVuZGVyUGRmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1NpZ25QYWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvU2lnbmVyTGlzdENvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9WZXJpZnlFbWFpbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb25zdGFudC9VdGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb25zdGFudC9hcHBpbmZvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbnN0YW50L2NvbnN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2pzb24vcGxhbnNBcnIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcGFnZXMvUGRmUmVxdWVzdEZpbGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3ByaW1pdGl2ZXMvQWxlcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcHJpbWl0aXZlcy9IYW5kbGVFcnJvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL0xvYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL0xvYWRlcldpdGhNc2cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcHJpbWl0aXZlcy9Nb2RhbFVpLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3ByaW1pdGl2ZXMvUGRmRGVjbGluZU1vZGFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3ByaW1pdGl2ZXMvVG91ckNvbnRlbnRXaXRoQnRuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3JlZHV4L3JlZHVjZXJzL1Nob3dUZW5hbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcmVkdXgvcmVkdWNlcnMvVG91clN0ZXBzUmVkdWNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9yZWR1eC9yZWR1Y2Vycy9pbmZvUmVkdWNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9yZWR1eC9yZWR1Y2Vycy9zaG93SGVhZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3JlZHV4L3N0b3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3NjcmlwdC9pMThuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2Nsc3gvZGlzdC9jbHN4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NuYnVpbGRlci9lc20vY25iLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9hZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2NpcGhlci1jb3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9jb3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9lbmMtYmFzZTY0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9lbmMtdXRmOC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvZXZwa2RmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9obWFjLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9tZDUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL3NoYTEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy9ibGFjay1hbHBoYS5jc3MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy9tYXV2ZS5jc3MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy92aW9sZXQuY3NzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvZGlzdC9yZWFjdC1kYXRlcGlja2VyLmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9pbmRleC5jc3MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvc3R5bGVzL29wZW5zaWduZHJpdmUuY3NzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3N0eWxlcy9zaWduYXR1cmUuY3NzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9ub2RlX21vZHVsZXMvcmVkdXgvZXMvcmVkdXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9hc3NldHMvaW1hZ2VzL2xvZ28ucG5nIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZpbGUtc2F2ZXIvZGlzdC9GaWxlU2F2ZXIubWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvY29tbWFuZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9mb2N1c0luc2lkZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2ZvY3VzSXNIaWRkZW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9mb2N1c1NvbHZlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2ZvY3VzYWJsZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9tb3ZlRm9jdXNJbnNpZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9yZXR1cm4tZm9jdXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9zaWJsaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvc29sdmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvRE9NdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9hbGwtYWZmZWN0ZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2F1dG8tZm9jdXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9jb3JyZWN0Rm9jdXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9maXJzdEZvY3VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvZ2V0QWN0aXZlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2lzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvcGFyZW50aW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvc2FmZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL3RhYk9yZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvdGFiVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy90YWJiYWJsZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtb3V0bGluZS1tYW5hZ2VyL2ZvY3VzLW91dGxpbmUtbWFuYWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9nZXQtbm9uY2UvZGlzdC9lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MvZGlzdC9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy5janMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3Mvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaHRtbC1wYXJzZS1zdHJpbmdpZnkvZGlzdC9odG1sLXBhcnNlLXN0cmluZ2lmeS5tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbG9kYXNoLmRlYm91bmNlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYWYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1kei5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWt3LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItbHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1tYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXBzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItc2EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci10bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXouanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibi1iZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm8uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ici5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY2EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2N2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3kuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWF0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2R2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1hdS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWNhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tZ2IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWlsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1uei5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLXNnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW8uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy1kby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLW14LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtdXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZpLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmlsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZm8uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci1jYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9meS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dvbS1kZXZhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWxhdG4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ndS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2h1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHktYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2lzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXQtY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2phLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvanYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2trLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2tvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3Uta21yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9reS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2xiLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbG8uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9taS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21rLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXMtbXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL210LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9uYi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmwtYmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvb2MtbG5jLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcGEtaW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3B0LWJyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9yby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3J1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NpLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NxLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3ItY3lybC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zdi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N3LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsLXBoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGxoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90emwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90em0tbGF0bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VnLWNuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3V6LWxhdG4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ei5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3ZpLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUveC1wc2V1ZG8uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS95by5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLWNuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtaGsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1tby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLXR3LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvIHN5bmMgXlxcLlxcLy4qJCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbW9tZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi9kZWZsYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL2luZmxhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9hZGxlcjMyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9kZWZsYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZ3poZWFkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZnRyZWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi90cmVlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3pzdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQW5hbHl0aWNzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0Fub255bW91c1V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0Nsb3VkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0NvcmVNYW5hZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0NyeXB0b0NvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvRXZlbnRFbWl0dGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0V2ZW50dWFsbHlRdWV1ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9GYWNlYm9va1V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0luZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0luc3RhbGxhdGlvbkNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvTGl2ZVF1ZXJ5Q2xpZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xpdmVRdWVyeVN1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Mb2NhbERhdGFzdG9yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIuZGVmYXVsdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyLnJlYWN0LW5hdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Mb2NhbERhdGFzdG9yZVV0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL09iamVjdFN0YXRlTXV0YXRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL09mZmxpbmVRdWVyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUFDTC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUNMUC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUNvbmZpZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUVycm9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlRmlsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUdlb1BvaW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlSG9va3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VJbnN0YWxsYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VMaXZlUXVlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VPcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZVBvbHlnb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VRdWVyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZVJlbGF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlUm9sZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZVNjaGVtYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZVNlc3Npb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VVc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1B1c2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUkVTVENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU2luZ2xlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU29ja2V0LndlYXBwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1N0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZUNvbnRyb2xsZXIuYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1N0b3JhZ2VDb250cm9sbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1N0b3JhZ2VDb250cm9sbGVyLnJlYWN0LW5hdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9TdG9yYWdlQ29udHJvbGxlci53ZWFwcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9UYXNrUXVldWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvVW5pcXVlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvV2ViU29ja2V0Q29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9YaHIud2VhcHAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvYXJyYXlDb250YWluc09iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9jYW5CZVNlcmlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvZGVjb2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL2VuY29kZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvZXNjYXBlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL2lzUmV2b2NhYmxlU2Vzc2lvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9wYXJzZURhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvcHJvbWlzZVV0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL3VuaXF1ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci91bnNhdmVkQ2hpbGRyZW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvdXVpZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZEb2N1bWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZEb2N1bWVudE9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGRW1iZWRkZWRGaWxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkVtYmVkZGVkUGFnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZGb250LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkltYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkphdmFTY3JpcHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGUGFnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZQYWdlT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9TdGFuZGFyZEZvbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2NvbG9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9lcnJvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZCdXR0b24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZDaGVja0JveC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERkRyb3Bkb3duLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGRmllbGQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZGb3JtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGT3B0aW9uTGlzdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERlJhZGlvR3JvdXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZTaWduYXR1cmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZUZXh0RmllbGQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9hcHBlYXJhbmNlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2ltYWdlL2FsaWdubWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9pbWFnZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9vYmplY3RzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL29wZXJhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvb3BlcmF0b3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL3JvdGF0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9zaXplcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9zdmdQYXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL3RleHQvYWxpZ25tZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL3RleHQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvdGV4dC9sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL1BERkNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL1BERk9iamVjdENvcGllci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb0J1dHRvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb0NoZWNrQm94LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvQ2hvaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvQ29tYm9Cb3guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9GaWVsZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb0Zvcm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9MaXN0Qm94LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvTm9uVGVybWluYWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9QdXNoQnV0dG9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvUmFkaW9CdXR0b24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9TaWduYXR1cmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9UZXJtaW5hbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb1RleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL2ZsYWdzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fubm90YXRpb24vQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9Cb3JkZXJTdHlsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9QREZBbm5vdGF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hbm5vdGF0aW9uL1BERldpZGdldEFubm90YXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fubm90YXRpb24vZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fubm90YXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2RvY3VtZW50L1BERkNyb3NzUmVmU2VjdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZG9jdW1lbnQvUERGSGVhZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9kb2N1bWVudC9QREZUcmFpbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9kb2N1bWVudC9QREZUcmFpbGVyRGljdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0NNYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2VtYmVkZGVycy9DdXN0b21Gb250RW1iZWRkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2VtYmVkZGVycy9DdXN0b21Gb250U3Vic2V0RW1iZWRkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2VtYmVkZGVycy9GaWxlRW1iZWRkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2VtYmVkZGVycy9Gb250RmxhZ3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2VtYmVkZGVycy9KYXZhU2NyaXB0RW1iZWRkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2VtYmVkZGVycy9KcGVnRW1iZWRkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2VtYmVkZGVycy9QREZQYWdlRW1iZWRkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2VtYmVkZGVycy9QbmdFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL1N0YW5kYXJkRm9udEVtYmVkZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lcnJvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9pbnRlcmFjdGl2ZS9WaWV3ZXJQcmVmZXJlbmNlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZBcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZCb29sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERkRpY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGSGV4U3RyaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERkludmFsaWRPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGTmFtZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZOdWxsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERk51bWJlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZPYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGUmF3U3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERlJlZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGU3RyaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vcGVyYXRvcnMvUERGT3BlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29wZXJhdG9ycy9QREZPcGVyYXRvck5hbWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9wYXJzZXIvQmFzZVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL0J5dGVTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3BhcnNlci9QREZPYmplY3RQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3BhcnNlci9QREZPYmplY3RTdHJlYW1QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3BhcnNlci9QREZQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3BhcnNlci9QREZYUmVmU3RyZWFtUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJlYW1zL0FzY2lpODVTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvQXNjaWlIZXhTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvRGVjb2RlU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJlYW1zL0ZsYXRlU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJlYW1zL0xaV1N0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9SdW5MZW5ndGhTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJlYW1zL2RlY29kZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZDYXRhbG9nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJ1Y3R1cmVzL1BERkNvbnRlbnRTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGQ3Jvc3NSZWZTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGRmxhdGVTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGT2JqZWN0U3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJ1Y3R1cmVzL1BERlBhZ2VMZWFmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJ1Y3R1cmVzL1BERlBhZ2VUcmVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvQ2hhckNvZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvRGVsaW1pdGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3ludGF4L0lycmVndWxhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3ludGF4L0tleXdvcmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvTnVtZXJpYy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3ludGF4L1doaXRlc3BhY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3dyaXRlcnMvUERGU3RyZWFtV3JpdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS93cml0ZXJzL1BERldyaXRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdHlwZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9DYWNoZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL2FycmF5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL2FzeW5jLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvYmFzZTY0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvZXJyb3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9udW1iZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvb2JqZWN0cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL3BkZkRvY0VuY29kaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvcG5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvcm5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvc3RyaW5ncy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL3VuaWNvZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy92YWxpZGF0b3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcmludC1qcy9kaXN0L3ByaW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvY2hlY2tQcm9wVHlwZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbGliL2hhcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmUtcmVzaXphYmxlL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZS1yZXNpemFibGUvbGliL3Jlc2l6ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtY2xpZW50c2lkZS1lZmZlY3QvbGliL2luZGV4LmVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWNvbmZldHRpL2Rpc3QvcmVhY3QtY29uZmV0dGkubWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvZGlzdC9yZWFjdC1kYXRlcGlja2VyLm1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2FkZExlYWRpbmdaZXJvcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2RlZmF1bHRMb2NhbGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9kZWZhdWx0T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2xpZ2h0Rm9ybWF0dGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9wcm90ZWN0ZWRUb2tlbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkRGF5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRIb3Vycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRNaWxsaXNlY29uZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkTWludXRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRNb250aHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkUXVhcnRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvYWRkU2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRXZWVrcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRZZWFycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RydWN0RnJvbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mRGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mTW9udGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZXZWVrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mWWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5T2ZZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheXNJbk1vbnRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERlZmF1bHRPcHRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldEhvdXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT0RheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRJU09XZWVrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWtZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldE1pbnV0ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0TW9udGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0UXVhcnRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRTZWNvbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFRpbWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0V2Vlay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrWWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzQWZ0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNCZWZvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNEYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzRXF1YWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lRGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZU1vbnRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZVF1YXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lWWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1ZhbGlkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzV2l0aGluSW50ZXJ2YWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRGb3JtYXRMb25nRm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hGbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXREaXN0YW5jZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdFJlbGF0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2xvY2FsaXplLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL21hdGNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21heC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9taW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2VJU08uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9TZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9BTVBNTWlkbmlnaHRQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0FNUE1QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RhdGVQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RheU9mWWVhclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5UGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXlQZXJpb2RQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0VyYVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRXh0ZW5kZWRZZWFyUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMFRvMTFQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIwdG8yM1BhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjFUbzI0UGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMXRvMTJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT0RheVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPVGltZXpvbmVQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1RpbWV6b25lV2l0aFpQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1dlZWtQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0lTT1dlZWtZZWFyUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Mb2NhbERheVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTG9jYWxXZWVrUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Mb2NhbFdlZWtZZWFyUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9NaW51dGVQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL01vbnRoUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9RdWFydGVyUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9TZWNvbmRQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1N0YW5kQWxvbmVMb2NhbERheVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZU1vbnRoUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9TdGFuZEFsb25lUXVhcnRlclBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9UaW1lc3RhbXBTZWNvbmRzUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9ZZWFyUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldERheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRIb3Vycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRJU09EYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0SVNPV2Vlay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRNaW51dGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldE1vbnRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFF1YXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0U2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRXZWVrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFllYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZkRheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSVNPV2Vlay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mSVNPV2Vla1llYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZk1vbnRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZRdWFydGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrWWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mWWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJEYXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1Yk1vbnRocy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJRdWFydGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJXZWVrcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdWJZZWFycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy90b0RhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvdHJhbnNwb3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy9EcmFnZ2FibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy9EcmFnZ2FibGVDb3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvY2pzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvdXRpbHMvZG9tRm5zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvdXRpbHMvZ2V0UHJlZml4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvdXRpbHMvbG9nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9idWlsZC9janMvdXRpbHMvcG9zaXRpb25GbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy91dGlscy9zaGltcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvbm9kZV9tb2R1bGVzL2Nsc3gvZGlzdC9jbHN4Lm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZmFzdC1jb21wYXJlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvQXV0b0ZvY3VzSW5zaWRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvQ29tYmluYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9Gb2N1c0d1YXJkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvRnJlZUZvY3VzSW5zaWRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvTG9jay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L01vdmVGb2N1c0luc2lkZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L1RyYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9VSS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvbWVkaXVtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvbmFuby1ldmVudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9zY29wZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3VzZS1mb2N1cy1zY29wZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3VzZS1mb2N1cy1zdGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaGVsbWV0L2VzL0hlbG1ldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtb25jbGlja291dHNpZGUvZGlzdC9yZWFjdC1vbmNsaWNrb3V0c2lkZS5lcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsLWJhci9kaXN0L2VzMjAxNS9jb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC1iYXIvZGlzdC9lczIwMTUvY29uc3RhbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwtYmFyL2Rpc3QvZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwtYmFyL2Rpc3QvZXMyMDE1L3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwvZGlzdC9lczIwMTUvQ29tYmluYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9TaWRlRWZmZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwvZGlzdC9lczIwMTUvVUkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9hZ2dyZXNpdmVDYXB0dXJlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwvZGlzdC9lczIwMTUvaGFuZGxlU2Nyb2xsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwvZGlzdC9lczIwMTUvbWVkaXVtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwvZGlzdC9lczIwMTUvc2lkZWNhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1ybmQvbGliL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXNjcm9sbGJhcnMtY3VzdG9tL2Rpc3QvcnNjLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1zaWRlLWVmZmVjdC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc2lnbmF0dXJlLWNhbnZhcy9idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1zdHlsZS1zaW5nbGV0b24vZGlzdC9lczIwMTUvY29tcG9uZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXN0eWxlLXNpbmdsZXRvbi9kaXN0L2VzMjAxNS9ob29rLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXN0eWxlLXNpbmdsZXRvbi9kaXN0L2VzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1zdHlsZS1zaW5nbGV0b24vZGlzdC9lczIwMTUvc2luZ2xldG9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QvanN4LXJ1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3RvdXIvZGlzdC9yZWFjdG91ci5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3RvdXIvbm9kZV9tb2R1bGVzL2NsYXNzbmFtZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3RvdXIvbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvY2hlY2tQcm9wVHlwZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3RvdXIvbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3RvdXIvbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3RvdXIvbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0b3VyL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3RvdXIvbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlZ2V4LXBhcnNlci9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc2Nyb2xsLXNtb290aC9kaXN0L2FuY2hvclNjcm9sbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtc21vb3RoL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc2Nyb2xsLXNtb290aC9kaXN0L29ic2VydmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc2Nyb2xsLXNtb290aC9kaXN0L3Njcm9sbFNtb290aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtc21vb3RoL2Rpc3QvdG9vbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc2Nyb2xscGFyZW50L3Njcm9sbHBhcmVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zaGFsbG93ZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9kaXN0L3JlYWN0LWRhdGVwaWNrZXIuY3NzPzNmNDMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvaW5kZXguY3NzPzA1MzgiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvc3R5bGVzL29wZW5zaWduZHJpdmUuY3NzPzYzZDAiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvc3R5bGVzL3NpZ25hdHVyZS5jc3M/YzYzYyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlZC1jb21wb25lbnRzL2Rpc3Qvc3R5bGVkLWNvbXBvbmVudHMuYnJvd3Nlci5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGVkLWNvbXBvbmVudHMvbm9kZV9tb2R1bGVzL0BlbW90aW9uL3VuaXRsZXNzL2Rpc3QvdW5pdGxlc3MuYnJvd3Nlci5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdGFiYmFibGUvZGlzdC9pbmRleC5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdHJpbS1jYW52YXMvYnVpbGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLWNhbGxiYWNrLXJlZi9kaXN0L2VzMjAxNS9hc3NpZ25SZWYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLWNhbGxiYWNrLXJlZi9kaXN0L2VzMjAxNS91c2VNZXJnZVJlZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91c2UtY2FsbGJhY2stcmVmL2Rpc3QvZXMyMDE1L3VzZVJlZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91c2Utc2lkZWNhci9kaXN0L2VzMjAxNS9leHBvcnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1zaWRlY2FyL2Rpc3QvZXMyMDE1L21lZGl1bS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS93aXRoLXNlbGVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL21heC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9tZDUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvbmF0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL25pbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9wYXJzZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9yZWdleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjFUb1Y2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3YzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3YzNS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92NS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92Ni5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92NlRvVjEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdmFsaWRhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy92b2lkLWVsZW1lbnRzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3dhcm5pbmcvd2FybmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy93cy9icm93c2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3pvb20tbGV2ZWwvZGlzdC96b29tLWxldmVsLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS9pZ25vcmVkfEM6XFx2aXRlXFxhcHBzXFxPcGVuU2lnblxcbm9kZV9tb2R1bGVzXFxjcnlwdG8tanN8Y3J5cHRvIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvZnJvbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvYmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9ldmVyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbmQtaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc29ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NwbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3N0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvdmFsdWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9udW1iZXIvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvY3JlYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2ZyZWV6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcGFyc2UtaW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC1pbnRlcnZhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC10aW1lb3V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvc2V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL3RvUHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy90b1Byb3BlcnR5S2V5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy90eXBlb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2FjdHVhbC9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9hY3R1YWwvc3ltYm9sL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9hY3R1YWwvc3ltYm9sL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9hY3R1YWwvc3ltYm9sL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvZnJvbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvY29uY2F0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvZXZlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvZmlsdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2ZpbmQtaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvZmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL21hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvc29ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9zcGxpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvdmFsdWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9mdW5jdGlvbi92aXJ0dWFsL2JpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2JpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvZXZlcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvZmluZC1pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvZmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL2luZGV4LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2Uvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL3NvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL3NwbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2Uvc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2pzb24vc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL251bWJlci9pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3QvY3JlYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3QvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2ZyZWV6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3Byb21pc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3NldC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvc3RyaW5nL3ZpcnR1YWwvaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3N0cmluZy92aXJ0dWFsL3N0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9zeW1ib2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvc3ltYm9sL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvd2Vhay1tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ZlYXR1cmVzL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZmVhdHVyZXMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mZWF0dXJlcy9zeW1ib2wvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mdWxsL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2Z1bGwvc3ltYm9sL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mdWxsL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZnVsbC9zeW1ib2wvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2EtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Etc2V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1idWZmZXItbm9uLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LWZyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LXJlZHVjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1zbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LXNvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NhbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY3JlYXRlLWl0ZXItcmVzdWx0LW9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGF0ZS10by1pc28tc3RyaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kZWxldGUtcHJvcGVydHktb3ItdGhyb3cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW52aXJvbm1lbnQtZmYtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLWllLW9yLWVkZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1pb3MtcGViYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtaW9zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtbm9kZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLXdlYm9zLXdlYmtpdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbnZpcm9ubWVudC12OC12ZXJzaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW52aXJvbm1lbnQtd2Via2l0LXZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbnZpcm9ubWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGxhYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZXhwb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZmFpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mcmVlemluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtYWNjZXNzb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtaXRlcmF0b3ItZGlyZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1qc29uLXJlcGxhY2VyLWZ1bmN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1zZXQtcmVjb3JkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9odG1sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaW5zdGFsbC1lcnJvci1jYXVzZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1pbnRlZ3JhbC1udW1iZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLXBvc3NpYmxlLXByb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRlLXNpbXBsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2l0ZXJhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRvci1jbG9zZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9tYXAtaGVscGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL21hdGgtdHJ1bmMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbm9ybWFsaXplLXN0cmluZy1hcmd1bWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMtZXh0ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1pcy1leHRlbnNpYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcGF0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3BlcmZvcm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcHJvbWlzZS1zdGF0aWNzLWluY29ycmVjdC1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9xdWV1ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NhZmUtZ2V0LWJ1aWx0LWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2NoZWR1bGVycy1maXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtY2xvbmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtZGlmZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1oZWxwZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWludGVyc2VjdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1pcy1kaXNqb2ludC1mcm9tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWlzLXN1YnNldC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1pcy1zdXBlcnNldC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1pdGVyYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LW1ldGhvZC1hY2NlcHQtc2V0LWxpa2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtc2l6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LXN5bW1ldHJpYy1kaWZmZXJlbmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtdW5pb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zaGFyZWQta2V5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2hhcmVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zdHJpbmctcGFkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N0cmluZy10cmltLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N5bWJvbC1kZWZpbmUtdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3ltYm9sLWlzLXJlZ2lzdGVyZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zeW1ib2wtaXMtd2VsbC1rbm93bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N5bWJvbC1yZWdpc3RyeS1kZXRlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90YXNrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90by1sZW5ndGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90by1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90cnktdG8tc3RyaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdWlkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1Zy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy93aGl0ZXNwYWNlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hZ2dyZWdhdGUtZXJyb3IuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYWdncmVnYXRlLWVycm9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5ldmVyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuZmluZC1pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5maW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmZvci1lYWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmZyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkubWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5zb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LnNwbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5kYXRlLnRvLWpzb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuZGF0ZS50by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuZnVuY3Rpb24uYmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMubWFwLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm1hcC5ncm91cC1ieS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMubWF0aC50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5mcmVlemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucGFyc2UtaW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5hbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5hbnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5jYXRjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UucmFjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLnJlamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLnJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS53aXRoLXJlc29sdmVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5yZWZsZWN0LnRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5kaWZmZXJlbmNlLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5pbnRlcnNlY3Rpb24udjIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LmlzLWRpc2pvaW50LWZyb20udjIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LmlzLXN1YnNldC1vZi52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuaXMtc3VwZXJzZXQtb2YudjIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5zeW1tZXRyaWMtZGlmZmVyZW5jZS52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQudW5pb24udjIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmZvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuaGFzLWluc3RhbmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5pcy1jb25jYXQtc3ByZWFkYWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5rZXktZm9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC1hbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5yZXBsYWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5zZWFyY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLnNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC50by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLnRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLndlYWstbWFwLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLndlYWstbWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5mdW5jdGlvbi5tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLmFzeW5jLWRpc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5jdXN0b20tbWF0Y2hlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLmRpc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5pcy1yZWdpc3RlcmVkLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXJlZ2lzdGVyZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5pcy13ZWxsLWtub3duLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXdlbGwta25vd24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5tYXRjaGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wubWV0YWRhdGEta2V5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wubWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucGF0dGVybi1tYXRjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLnJlcGxhY2UtYWxsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy93ZWIuc2V0LWludGVydmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL3dlYi5zZXQtdGltZW91dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy93ZWIudGltZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvZnJvbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2FycmF5L2lzLWFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvdmlydHVhbC9lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvdmlydHVhbC9mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2FycmF5L3ZpcnR1YWwva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2FycmF5L3ZpcnR1YWwvdmFsdWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvYmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2NvbmNhdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9ldmVyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2ZpbmQtaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9maW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uva2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL21hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3NsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc29ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3NwbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3N0YXJ0cy13aXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvdmFsdWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvanNvbi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9udW1iZXIvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvY3JlYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2ZyZWV6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvcGFyc2UtaW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvcHJvbWlzZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3NldC1pbnRlcnZhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3NldC10aW1lb3V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvc2V0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvc3ltYm9sL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvc3ltYm9sL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvc3ltYm9sL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL3dlYWstbWFwL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9QcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Qcm9wZXJ0eUtleS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL2NvcmUvZGlzdC9mbG9hdGluZy11aS5jb3JlLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZmxvYXRpbmctdWkvZG9tL2Rpc3QvZmxvYXRpbmctdWkuZG9tLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZmxvYXRpbmctdWkvcmVhY3QtZG9tL2Rpc3QvZmxvYXRpbmctdWkucmVhY3QtZG9tLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZmxvYXRpbmctdWkvcmVhY3QvZGlzdC9mbG9hdGluZy11aS5yZWFjdC51dGlscy5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGZsb2F0aW5nLXVpL3V0aWxzL2Rpc3QvZmxvYXRpbmctdWkudXRpbHMuZG9tLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZmxvYXRpbmctdWkvdXRpbHMvZGlzdC9mbG9hdGluZy11aS51dGlscy5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3ByaW1pdGl2ZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtYXJyb3cvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWNvbGxlY3Rpb24vZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmcy9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29udGV4dC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtZGlyZWN0aW9uL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1kaXNtaXNzYWJsZS1sYXllci9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtZHJvcGRvd24tbWVudS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtZm9jdXMtZ3VhcmRzL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1mb2N1cy1zY29wZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtaWQvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LW1lbnUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXBvcHBlci9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtcG9ydGFsL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wcmVzZW5jZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1yb3ZpbmctZm9jdXMvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXNsb3QvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWYvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1jb250cm9sbGFibGUtc3RhdGUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1lc2NhcGUta2V5ZG93bi9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3QvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXVzZS1zaXplL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1kbmQvYXNhcC9kaXN0L0FzYXBRdWV1ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC9SYXdUYXNrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1kbmQvYXNhcC9kaXN0L1Rhc2tGYWN0b3J5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1kbmQvYXNhcC9kaXN0L2FzYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvbWFrZVJlcXVlc3RDYWxsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1kbmQvYXNhcC9kaXN0L3R5cGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1kbmQvaW52YXJpYW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlZHV4anMvdG9vbGtpdC9kaXN0L3JlZHV4LXRvb2xraXQubW9kZXJuLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMvYWRhcHRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL2ZldGNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy94aHIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsVG9rZW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvaXNDYW5jZWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3NFcnJvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvc0hlYWRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2J1aWxkRnVsbFBhdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL21lcmdlQ29uZmlnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3NldHRsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS90cmFuc2Zvcm1EYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZGVmYXVsdHMvdHJhbnNpdGlvbmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9lbnYvZGF0YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9BeGlvc1VSTFNlYXJjaFBhcmFtcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9IdHRwU3RhdHVzQ29kZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2J1aWxkVVJMLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2NvbXBvc2VTaWduYWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2Nvb2tpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvZm9ybURhdGFUb0pTT04uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0F4aW9zRXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL251bGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlUHJvdG9jb2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcHJvZ3Jlc3NFdmVudFJlZHVjZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcmVzb2x2ZUNvbmZpZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9zcGVlZG9tZXRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9zcHJlYWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdGhyb3R0bGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdG9Gb3JtRGF0YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3RyYWNrU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3ZhbGlkYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9jbGFzc2VzL0Jsb2IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9Gb3JtRGF0YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9jbGFzc2VzL1VSTFNlYXJjaFBhcmFtcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vY29tbW9uL3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY2xzeC9kaXN0L2Nsc3gubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RlcXVhbC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvYmVnaW5EcmFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC9kcm9wLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC9lbmREcmFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC9ob3Zlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL2xvY2FsL3NldENsaWVudE9mZnNldC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvcHVibGlzaERyYWdTb3VyY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL3R5cGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9yZWdpc3RyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2NsYXNzZXMvRHJhZ0Ryb3BNYW5hZ2VySW1wbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2NsYXNzZXMvRHJhZ0Ryb3BNb25pdG9ySW1wbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2NsYXNzZXMvSGFuZGxlclJlZ2lzdHJ5SW1wbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2NvbnRyYWN0cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2NyZWF0ZURyYWdEcm9wTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2ludGVyZmFjZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9yZWR1Y2Vycy9kaXJ0eUhhbmRsZXJJZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9yZWR1Y2Vycy9kcmFnT2Zmc2V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvcmVkdWNlcnMvZHJhZ09wZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3JlZHVjZXJzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvcmVkdWNlcnMvcmVmQ291bnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9yZWR1Y2Vycy9zdGF0ZUlkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvdXRpbHMvY29vcmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvdXRpbHMvZGlydGluZXNzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvdXRpbHMvZXF1YWxpdHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC91dGlscy9nZXROZXh0VW5pcXVlSWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC91dGlscy9qc191dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3V0aWxzL21hdGNoZXNUeXBlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2kxOG5leHQtYnJvd3Nlci1sYW5ndWFnZWRldGVjdG9yL2Rpc3QvZXNtL2kxOG5leHRCcm93c2VyTGFuZ3VhZ2VEZXRlY3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9pMThuZXh0L2Rpc3QvZXNtL2kxOG5leHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaWRiLWtleXZhbC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ltbWVyL2Rpc3QvaW1tZXIubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21ha2UtY2FuY2VsbGFibGUtcHJvbWlzZS9kaXN0L2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tYWtlLWV2ZW50LXByb3BzL2Rpc3QvZXNtL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21lcmdlLXJlZnMvZGlzdC9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmanMtZGlzdC9idWlsZC9wZGYubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvQnJvd3NlckRldGVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvRW50ZXJMZWF2ZUNvdW50ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9IVE1MNUJhY2tlbmRJbXBsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvTW9ub3RvbmljSW50ZXJwb2xhbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9OYXRpdmVEcmFnU291cmNlcy9OYXRpdmVEcmFnU291cmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvTmF0aXZlRHJhZ1NvdXJjZXMvZ2V0RGF0YUZyb21EYXRhVHJhbnNmZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9OYXRpdmVEcmFnU291cmNlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L05hdGl2ZURyYWdTb3VyY2VzL25hdGl2ZVR5cGVzQ29uZmlnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvTmF0aXZlVHlwZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9PZmZzZXRVdGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L09wdGlvbnNSZWFkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9nZXRFbXB0eUltYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC91dGlscy9qc191dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQvZGlzdC9jb3JlL0RuZENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kL2Rpc3QvY29yZS9EbmRQcm92aWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvSTE4bmV4dFByb3ZpZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9UcmFucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvVHJhbnNXaXRob3V0Q29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvVHJhbnNsYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL2NvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL2RlZmF1bHRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9pMThuSW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9pbml0UmVhY3RJMThuZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy91bmVzY2FwZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvdXNlU1NSLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy91c2VUcmFuc2xhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL3dpdGhTU1IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL3dpdGhUcmFuc2xhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vRG9jdW1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL0RvY3VtZW50Q29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vTGlua1NlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL01lc3NhZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1BhZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1BhZ2VDb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9QYWdlL0Fubm90YXRpb25MYXllci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vUGFnZS9DYW52YXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1BhZ2UvVGV4dExheWVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9QYXNzd29yZFJlc3BvbnNlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vU3RydWN0VHJlZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vU3RydWN0VHJlZUl0ZW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL3NoYXJlZC9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL3NoYXJlZC9ob29rcy91c2VEb2N1bWVudENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL3NoYXJlZC9ob29rcy91c2VQYWdlQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vc2hhcmVkL2hvb2tzL3VzZVJlc29sdmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9zaGFyZWQvc3RydWN0VHJlZVV0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9zaGFyZWQvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvZGlzdC9yZWFjdC1yZWR1eC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVkdXgtdGh1bmsvZGlzdC9yZWR1eC10aHVuay5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVkdXgvZGlzdC9yZWR1eC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVzZWxlY3QvZGlzdC9yZXNlbGVjdC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc2lnbmF0dXJlX3BhZC9kaXN0L3NpZ25hdHVyZV9wYWQubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3RpbnktaW52YXJpYW50L2Rpc3QvZXNtL3RpbnktaW52YXJpYW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2NyZWF0ZSBmYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3NjcmlwdC9QdWJsaWNUZW1wbGF0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIlB1YmxpY1RlbXBsYXRlXCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlB1YmxpY1RlbXBsYXRlXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlB1YmxpY1RlbXBsYXRlXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsImltcG9ydCBtZW1vaXplIGZyb20gJ0BlbW90aW9uL21lbW9pemUnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbnZhciByZWFjdFByb3BzUmVnZXggPSAvXigoY2hpbGRyZW58ZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUx8a2V5fHJlZnxhdXRvRm9jdXN8ZGVmYXVsdFZhbHVlfGRlZmF1bHRDaGVja2VkfGlubmVySFRNTHxzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmd8c3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nfHZhbHVlTGlua3xhYmJyfGFjY2VwdHxhY2NlcHRDaGFyc2V0fGFjY2Vzc0tleXxhY3Rpb258YWxsb3d8YWxsb3dVc2VyTWVkaWF8YWxsb3dQYXltZW50UmVxdWVzdHxhbGxvd0Z1bGxTY3JlZW58YWxsb3dUcmFuc3BhcmVuY3l8YWx0fGFzeW5jfGF1dG9Db21wbGV0ZXxhdXRvUGxheXxjYXB0dXJlfGNlbGxQYWRkaW5nfGNlbGxTcGFjaW5nfGNoYWxsZW5nZXxjaGFyU2V0fGNoZWNrZWR8Y2l0ZXxjbGFzc0lEfGNsYXNzTmFtZXxjb2xzfGNvbFNwYW58Y29udGVudHxjb250ZW50RWRpdGFibGV8Y29udGV4dE1lbnV8Y29udHJvbHN8Y29udHJvbHNMaXN0fGNvb3Jkc3xjcm9zc09yaWdpbnxkYXRhfGRhdGVUaW1lfGRlY29kaW5nfGRlZmF1bHR8ZGVmZXJ8ZGlyfGRpc2FibGVkfGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlfGRpc2FibGVSZW1vdGVQbGF5YmFja3xkb3dubG9hZHxkcmFnZ2FibGV8ZW5jVHlwZXxlbnRlcktleUhpbnR8Zm9ybXxmb3JtQWN0aW9ufGZvcm1FbmNUeXBlfGZvcm1NZXRob2R8Zm9ybU5vVmFsaWRhdGV8Zm9ybVRhcmdldHxmcmFtZUJvcmRlcnxoZWFkZXJzfGhlaWdodHxoaWRkZW58aGlnaHxocmVmfGhyZWZMYW5nfGh0bWxGb3J8aHR0cEVxdWl2fGlkfGlucHV0TW9kZXxpbnRlZ3JpdHl8aXN8a2V5UGFyYW1zfGtleVR5cGV8a2luZHxsYWJlbHxsYW5nfGxpc3R8bG9hZGluZ3xsb29wfGxvd3xtYXJnaW5IZWlnaHR8bWFyZ2luV2lkdGh8bWF4fG1heExlbmd0aHxtZWRpYXxtZWRpYUdyb3VwfG1ldGhvZHxtaW58bWluTGVuZ3RofG11bHRpcGxlfG11dGVkfG5hbWV8bm9uY2V8bm9WYWxpZGF0ZXxvcGVufG9wdGltdW18cGF0dGVybnxwbGFjZWhvbGRlcnxwbGF5c0lubGluZXxwb3N0ZXJ8cHJlbG9hZHxwcm9maWxlfHJhZGlvR3JvdXB8cmVhZE9ubHl8cmVmZXJyZXJQb2xpY3l8cmVsfHJlcXVpcmVkfHJldmVyc2VkfHJvbGV8cm93c3xyb3dTcGFufHNhbmRib3h8c2NvcGV8c2NvcGVkfHNjcm9sbGluZ3xzZWFtbGVzc3xzZWxlY3RlZHxzaGFwZXxzaXplfHNpemVzfHNsb3R8c3BhbnxzcGVsbENoZWNrfHNyY3xzcmNEb2N8c3JjTGFuZ3xzcmNTZXR8c3RhcnR8c3RlcHxzdHlsZXxzdW1tYXJ5fHRhYkluZGV4fHRhcmdldHx0aXRsZXx0cmFuc2xhdGV8dHlwZXx1c2VNYXB8dmFsdWV8d2lkdGh8d21vZGV8d3JhcHxhYm91dHxkYXRhdHlwZXxpbmxpc3R8cHJlZml4fHByb3BlcnR5fHJlc291cmNlfHR5cGVvZnx2b2NhYnxhdXRvQ2FwaXRhbGl6ZXxhdXRvQ29ycmVjdHxhdXRvU2F2ZXxjb2xvcnxpbmNyZW1lbnRhbHxmYWxsYmFja3xpbmVydHxpdGVtUHJvcHxpdGVtU2NvcGV8aXRlbVR5cGV8aXRlbUlEfGl0ZW1SZWZ8b258b3B0aW9ufHJlc3VsdHN8c2VjdXJpdHl8dW5zZWxlY3RhYmxlfGFjY2VudEhlaWdodHxhY2N1bXVsYXRlfGFkZGl0aXZlfGFsaWdubWVudEJhc2VsaW5lfGFsbG93UmVvcmRlcnxhbHBoYWJldGljfGFtcGxpdHVkZXxhcmFiaWNGb3JtfGFzY2VudHxhdHRyaWJ1dGVOYW1lfGF0dHJpYnV0ZVR5cGV8YXV0b1JldmVyc2V8YXppbXV0aHxiYXNlRnJlcXVlbmN5fGJhc2VsaW5lU2hpZnR8YmFzZVByb2ZpbGV8YmJveHxiZWdpbnxiaWFzfGJ5fGNhbGNNb2RlfGNhcEhlaWdodHxjbGlwfGNsaXBQYXRoVW5pdHN8Y2xpcFBhdGh8Y2xpcFJ1bGV8Y29sb3JJbnRlcnBvbGF0aW9ufGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnN8Y29sb3JQcm9maWxlfGNvbG9yUmVuZGVyaW5nfGNvbnRlbnRTY3JpcHRUeXBlfGNvbnRlbnRTdHlsZVR5cGV8Y3Vyc29yfGN4fGN5fGR8ZGVjZWxlcmF0ZXxkZXNjZW50fGRpZmZ1c2VDb25zdGFudHxkaXJlY3Rpb258ZGlzcGxheXxkaXZpc29yfGRvbWluYW50QmFzZWxpbmV8ZHVyfGR4fGR5fGVkZ2VNb2RlfGVsZXZhdGlvbnxlbmFibGVCYWNrZ3JvdW5kfGVuZHxleHBvbmVudHxleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkfGZpbGx8ZmlsbE9wYWNpdHl8ZmlsbFJ1bGV8ZmlsdGVyfGZpbHRlclJlc3xmaWx0ZXJVbml0c3xmbG9vZENvbG9yfGZsb29kT3BhY2l0eXxmb2N1c2FibGV8Zm9udEZhbWlseXxmb250U2l6ZXxmb250U2l6ZUFkanVzdHxmb250U3RyZXRjaHxmb250U3R5bGV8Zm9udFZhcmlhbnR8Zm9udFdlaWdodHxmb3JtYXR8ZnJvbXxmcnxmeHxmeXxnMXxnMnxnbHlwaE5hbWV8Z2x5cGhPcmllbnRhdGlvbkhvcml6b250YWx8Z2x5cGhPcmllbnRhdGlvblZlcnRpY2FsfGdseXBoUmVmfGdyYWRpZW50VHJhbnNmb3JtfGdyYWRpZW50VW5pdHN8aGFuZ2luZ3xob3JpekFkdlh8aG9yaXpPcmlnaW5YfGlkZW9ncmFwaGljfGltYWdlUmVuZGVyaW5nfGlufGluMnxpbnRlcmNlcHR8a3xrMXxrMnxrM3xrNHxrZXJuZWxNYXRyaXh8a2VybmVsVW5pdExlbmd0aHxrZXJuaW5nfGtleVBvaW50c3xrZXlTcGxpbmVzfGtleVRpbWVzfGxlbmd0aEFkanVzdHxsZXR0ZXJTcGFjaW5nfGxpZ2h0aW5nQ29sb3J8bGltaXRpbmdDb25lQW5nbGV8bG9jYWx8bWFya2VyRW5kfG1hcmtlck1pZHxtYXJrZXJTdGFydHxtYXJrZXJIZWlnaHR8bWFya2VyVW5pdHN8bWFya2VyV2lkdGh8bWFza3xtYXNrQ29udGVudFVuaXRzfG1hc2tVbml0c3xtYXRoZW1hdGljYWx8bW9kZXxudW1PY3RhdmVzfG9mZnNldHxvcGFjaXR5fG9wZXJhdG9yfG9yZGVyfG9yaWVudHxvcmllbnRhdGlvbnxvcmlnaW58b3ZlcmZsb3d8b3ZlcmxpbmVQb3NpdGlvbnxvdmVybGluZVRoaWNrbmVzc3xwYW5vc2UxfHBhaW50T3JkZXJ8cGF0aExlbmd0aHxwYXR0ZXJuQ29udGVudFVuaXRzfHBhdHRlcm5UcmFuc2Zvcm18cGF0dGVyblVuaXRzfHBvaW50ZXJFdmVudHN8cG9pbnRzfHBvaW50c0F0WHxwb2ludHNBdFl8cG9pbnRzQXRafHByZXNlcnZlQWxwaGF8cHJlc2VydmVBc3BlY3RSYXRpb3xwcmltaXRpdmVVbml0c3xyfHJhZGl1c3xyZWZYfHJlZll8cmVuZGVyaW5nSW50ZW50fHJlcGVhdENvdW50fHJlcGVhdER1cnxyZXF1aXJlZEV4dGVuc2lvbnN8cmVxdWlyZWRGZWF0dXJlc3xyZXN0YXJ0fHJlc3VsdHxyb3RhdGV8cnh8cnl8c2NhbGV8c2VlZHxzaGFwZVJlbmRlcmluZ3xzbG9wZXxzcGFjaW5nfHNwZWN1bGFyQ29uc3RhbnR8c3BlY3VsYXJFeHBvbmVudHxzcGVlZHxzcHJlYWRNZXRob2R8c3RhcnRPZmZzZXR8c3RkRGV2aWF0aW9ufHN0ZW1ofHN0ZW12fHN0aXRjaFRpbGVzfHN0b3BDb2xvcnxzdG9wT3BhY2l0eXxzdHJpa2V0aHJvdWdoUG9zaXRpb258c3RyaWtldGhyb3VnaFRoaWNrbmVzc3xzdHJpbmd8c3Ryb2tlfHN0cm9rZURhc2hhcnJheXxzdHJva2VEYXNob2Zmc2V0fHN0cm9rZUxpbmVjYXB8c3Ryb2tlTGluZWpvaW58c3Ryb2tlTWl0ZXJsaW1pdHxzdHJva2VPcGFjaXR5fHN0cm9rZVdpZHRofHN1cmZhY2VTY2FsZXxzeXN0ZW1MYW5ndWFnZXx0YWJsZVZhbHVlc3x0YXJnZXRYfHRhcmdldFl8dGV4dEFuY2hvcnx0ZXh0RGVjb3JhdGlvbnx0ZXh0UmVuZGVyaW5nfHRleHRMZW5ndGh8dG98dHJhbnNmb3JtfHUxfHUyfHVuZGVybGluZVBvc2l0aW9ufHVuZGVybGluZVRoaWNrbmVzc3x1bmljb2RlfHVuaWNvZGVCaWRpfHVuaWNvZGVSYW5nZXx1bml0c1BlckVtfHZBbHBoYWJldGljfHZIYW5naW5nfHZJZGVvZ3JhcGhpY3x2TWF0aGVtYXRpY2FsfHZhbHVlc3x2ZWN0b3JFZmZlY3R8dmVyc2lvbnx2ZXJ0QWR2WXx2ZXJ0T3JpZ2luWHx2ZXJ0T3JpZ2luWXx2aWV3Qm94fHZpZXdUYXJnZXR8dmlzaWJpbGl0eXx3aWR0aHN8d29yZFNwYWNpbmd8d3JpdGluZ01vZGV8eHx4SGVpZ2h0fHgxfHgyfHhDaGFubmVsU2VsZWN0b3J8eGxpbmtBY3R1YXRlfHhsaW5rQXJjcm9sZXx4bGlua0hyZWZ8eGxpbmtSb2xlfHhsaW5rU2hvd3x4bGlua1RpdGxlfHhsaW5rVHlwZXx4bWxCYXNlfHhtbG5zfHhtbG5zWGxpbmt8eG1sTGFuZ3x4bWxTcGFjZXx5fHkxfHkyfHlDaGFubmVsU2VsZWN0b3J8enx6b29tQW5kUGFufGZvcnxjbGFzc3xhdXRvZm9jdXMpfCgoW0RkXVtBYV1bVHRdW0FhXXxbQWFdW1JyXVtJaV1bQWFdfHgpLS4qKSkkLzsgLy8gaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81YmZlZTY4YTRjZDdlNjAwOWVmNjFkMjNcblxudmFyIGlzUHJvcFZhbGlkID0gLyogI19fUFVSRV9fICovbWVtb2l6ZShmdW5jdGlvbiAocHJvcCkge1xuICByZXR1cm4gcmVhY3RQcm9wc1JlZ2V4LnRlc3QocHJvcCkgfHwgcHJvcC5jaGFyQ29kZUF0KDApID09PSAxMTFcbiAgLyogbyAqL1xuICAmJiBwcm9wLmNoYXJDb2RlQXQoMSkgPT09IDExMFxuICAvKiBuICovXG4gICYmIHByb3AuY2hhckNvZGVBdCgyKSA8IDkxO1xufVxuLyogWisxICovXG4pO1xuXG5leHBvcnQgeyBpc1Byb3BWYWxpZCBhcyBkZWZhdWx0IH07XG4iLCJmdW5jdGlvbiBtZW1vaXplKGZuKSB7XG4gIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgaWYgKGNhY2hlW2FyZ10gPT09IHVuZGVmaW5lZCkgY2FjaGVbYXJnXSA9IGZuKGFyZyk7XG4gICAgcmV0dXJuIGNhY2hlW2FyZ107XG4gIH07XG59XG5cbmV4cG9ydCB7IG1lbW9pemUgYXMgZGVmYXVsdCB9O1xuIiwiZnVuY3Rpb24gc3R5bGlzX21pbiAoVykge1xuICBmdW5jdGlvbiBNKGQsIGMsIGUsIGgsIGEpIHtcbiAgICBmb3IgKHZhciBtID0gMCwgYiA9IDAsIHYgPSAwLCBuID0gMCwgcSwgZywgeCA9IDAsIEsgPSAwLCBrLCB1ID0gayA9IHEgPSAwLCBsID0gMCwgciA9IDAsIEkgPSAwLCB0ID0gMCwgQiA9IGUubGVuZ3RoLCBKID0gQiAtIDEsIHksIGYgPSAnJywgcCA9ICcnLCBGID0gJycsIEcgPSAnJywgQzsgbCA8IEI7KSB7XG4gICAgICBnID0gZS5jaGFyQ29kZUF0KGwpO1xuICAgICAgbCA9PT0gSiAmJiAwICE9PSBiICsgbiArIHYgKyBtICYmICgwICE9PSBiICYmIChnID0gNDcgPT09IGIgPyAxMCA6IDQ3KSwgbiA9IHYgPSBtID0gMCwgQisrLCBKKyspO1xuXG4gICAgICBpZiAoMCA9PT0gYiArIG4gKyB2ICsgbSkge1xuICAgICAgICBpZiAobCA9PT0gSiAmJiAoMCA8IHIgJiYgKGYgPSBmLnJlcGxhY2UoTiwgJycpKSwgMCA8IGYudHJpbSgpLmxlbmd0aCkpIHtcbiAgICAgICAgICBzd2l0Y2ggKGcpIHtcbiAgICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBjYXNlIDU5OlxuICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBmICs9IGUuY2hhckF0KGwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGcgPSA1OTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZykge1xuICAgICAgICAgIGNhc2UgMTIzOlxuICAgICAgICAgICAgZiA9IGYudHJpbSgpO1xuICAgICAgICAgICAgcSA9IGYuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgIGsgPSAxO1xuXG4gICAgICAgICAgICBmb3IgKHQgPSArK2w7IGwgPCBCOykge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGcgPSBlLmNoYXJDb2RlQXQobCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDEyMzpcbiAgICAgICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAxMjU6XG4gICAgICAgICAgICAgICAgICBrLS07XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgNDc6XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKGcgPSBlLmNoYXJDb2RlQXQobCArIDEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6XG4gICAgICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1ID0gbCArIDE7IHUgPCBKOyArK3UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLmNoYXJDb2RlQXQodSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ3OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDQyID09PSBnICYmIDQyID09PSBlLmNoYXJDb2RlQXQodSAtIDEpICYmIGwgKyAyICE9PSB1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSB1ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDQ3ID09PSBnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSB1ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGwgPSB1O1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgOTE6XG4gICAgICAgICAgICAgICAgICBnKys7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgICAgICAgZysrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgICAgICAgZm9yICg7IGwrKyA8IEogJiYgZS5jaGFyQ29kZUF0KGwpICE9PSBnOykge1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoMCA9PT0gaykgYnJlYWs7XG4gICAgICAgICAgICAgIGwrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgayA9IGUuc3Vic3RyaW5nKHQsIGwpO1xuICAgICAgICAgICAgMCA9PT0gcSAmJiAocSA9IChmID0gZi5yZXBsYWNlKGNhLCAnJykudHJpbSgpKS5jaGFyQ29kZUF0KDApKTtcblxuICAgICAgICAgICAgc3dpdGNoIChxKSB7XG4gICAgICAgICAgICAgIGNhc2UgNjQ6XG4gICAgICAgICAgICAgICAgMCA8IHIgJiYgKGYgPSBmLnJlcGxhY2UoTiwgJycpKTtcbiAgICAgICAgICAgICAgICBnID0gZi5jaGFyQ29kZUF0KDEpO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChnKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDEwMDpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTA5OlxuICAgICAgICAgICAgICAgICAgY2FzZSAxMTU6XG4gICAgICAgICAgICAgICAgICBjYXNlIDQ1OlxuICAgICAgICAgICAgICAgICAgICByID0gYztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHIgPSBPO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGsgPSBNKGMsIHIsIGssIGcsIGEgKyAxKTtcbiAgICAgICAgICAgICAgICB0ID0gay5sZW5ndGg7XG4gICAgICAgICAgICAgICAgMCA8IEEgJiYgKHIgPSBYKE8sIGYsIEkpLCBDID0gSCgzLCBrLCByLCBjLCBELCB6LCB0LCBnLCBhLCBoKSwgZiA9IHIuam9pbignJyksIHZvaWQgMCAhPT0gQyAmJiAwID09PSAodCA9IChrID0gQy50cmltKCkpLmxlbmd0aCkgJiYgKGcgPSAwLCBrID0gJycpKTtcbiAgICAgICAgICAgICAgICBpZiAoMCA8IHQpIHN3aXRjaCAoZykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxMTU6XG4gICAgICAgICAgICAgICAgICAgIGYgPSBmLnJlcGxhY2UoZGEsIGVhKTtcblxuICAgICAgICAgICAgICAgICAgY2FzZSAxMDA6XG4gICAgICAgICAgICAgICAgICBjYXNlIDEwOTpcbiAgICAgICAgICAgICAgICAgIGNhc2UgNDU6XG4gICAgICAgICAgICAgICAgICAgIGsgPSBmICsgJ3snICsgayArICd9JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgMTA3OlxuICAgICAgICAgICAgICAgICAgICBmID0gZi5yZXBsYWNlKGZhLCAnJDEgJDInKTtcbiAgICAgICAgICAgICAgICAgICAgayA9IGYgKyAneycgKyBrICsgJ30nO1xuICAgICAgICAgICAgICAgICAgICBrID0gMSA9PT0gdyB8fCAyID09PSB3ICYmIEwoJ0AnICsgaywgMykgPyAnQC13ZWJraXQtJyArIGsgKyAnQCcgKyBrIDogJ0AnICsgaztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGsgPSBmICsgaywgMTEyID09PSBoICYmIChrID0gKHAgKz0gaywgJycpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgayA9ICcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgayA9IE0oYywgWChjLCBmLCBJKSwgaywgaCwgYSArIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBGICs9IGs7XG4gICAgICAgICAgICBrID0gSSA9IHIgPSB1ID0gcSA9IDA7XG4gICAgICAgICAgICBmID0gJyc7XG4gICAgICAgICAgICBnID0gZS5jaGFyQ29kZUF0KCsrbCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMTI1OlxuICAgICAgICAgIGNhc2UgNTk6XG4gICAgICAgICAgICBmID0gKDAgPCByID8gZi5yZXBsYWNlKE4sICcnKSA6IGYpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmICgxIDwgKHQgPSBmLmxlbmd0aCkpIHN3aXRjaCAoMCA9PT0gdSAmJiAocSA9IGYuY2hhckNvZGVBdCgwKSwgNDUgPT09IHEgfHwgOTYgPCBxICYmIDEyMyA+IHEpICYmICh0ID0gKGYgPSBmLnJlcGxhY2UoJyAnLCAnOicpKS5sZW5ndGgpLCAwIDwgQSAmJiB2b2lkIDAgIT09IChDID0gSCgxLCBmLCBjLCBkLCBELCB6LCBwLmxlbmd0aCwgaCwgYSwgaCkpICYmIDAgPT09ICh0ID0gKGYgPSBDLnRyaW0oKSkubGVuZ3RoKSAmJiAoZiA9ICdcXHgwMFxceDAwJyksIHEgPSBmLmNoYXJDb2RlQXQoMCksIGcgPSBmLmNoYXJDb2RlQXQoMSksIHEpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgNjQ6XG4gICAgICAgICAgICAgICAgaWYgKDEwNSA9PT0gZyB8fCA5OSA9PT0gZykge1xuICAgICAgICAgICAgICAgICAgRyArPSBmICsgZS5jaGFyQXQobCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICA1OCAhPT0gZi5jaGFyQ29kZUF0KHQgLSAxKSAmJiAocCArPSBQKGYsIHEsIGcsIGYuY2hhckNvZGVBdCgyKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgSSA9IHIgPSB1ID0gcSA9IDA7XG4gICAgICAgICAgICBmID0gJyc7XG4gICAgICAgICAgICBnID0gZS5jaGFyQ29kZUF0KCsrbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChnKSB7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgNDcgPT09IGIgPyBiID0gMCA6IDAgPT09IDEgKyBxICYmIDEwNyAhPT0gaCAmJiAwIDwgZi5sZW5ndGggJiYgKHIgPSAxLCBmICs9ICdcXHgwMCcpO1xuICAgICAgICAgIDAgPCBBICogWSAmJiBIKDAsIGYsIGMsIGQsIEQsIHosIHAubGVuZ3RoLCBoLCBhLCBoKTtcbiAgICAgICAgICB6ID0gMTtcbiAgICAgICAgICBEKys7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA1OTpcbiAgICAgICAgY2FzZSAxMjU6XG4gICAgICAgICAgaWYgKDAgPT09IGIgKyBuICsgdiArIG0pIHtcbiAgICAgICAgICAgIHorKztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHorKztcbiAgICAgICAgICB5ID0gZS5jaGFyQXQobCk7XG5cbiAgICAgICAgICBzd2l0Y2ggKGcpIHtcbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgICAgIGlmICgwID09PSBuICsgbSArIGIpIHN3aXRjaCAoeCkge1xuICAgICAgICAgICAgICAgIGNhc2UgNDQ6XG4gICAgICAgICAgICAgICAgY2FzZSA1ODpcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgICAgICAgIHkgPSAnJztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIDMyICE9PSBnICYmICh5ID0gJyAnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICB5ID0gJ1xcXFwwJztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgIHkgPSAnXFxcXGYnO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgeSA9ICdcXFxcdic7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgICAwID09PSBuICsgYiArIG0gJiYgKHIgPSBJID0gMSwgeSA9ICdcXGYnICsgeSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDEwODpcbiAgICAgICAgICAgICAgaWYgKDAgPT09IG4gKyBiICsgbSArIEUgJiYgMCA8IHUpIHN3aXRjaCAobCAtIHUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAxMTIgPT09IHggJiYgNTggPT09IGUuY2hhckNvZGVBdChsIC0gMykgJiYgKEUgPSB4KTtcblxuICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgIDExMSA9PT0gSyAmJiAoRSA9IEspO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDU4OlxuICAgICAgICAgICAgICAwID09PSBuICsgYiArIG0gJiYgKHUgPSBsKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNDQ6XG4gICAgICAgICAgICAgIDAgPT09IGIgKyB2ICsgbiArIG0gJiYgKHIgPSAxLCB5ICs9ICdcXHInKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgICAwID09PSBiICYmIChuID0gbiA9PT0gZyA/IDAgOiAwID09PSBuID8gZyA6IG4pO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA5MTpcbiAgICAgICAgICAgICAgMCA9PT0gbiArIGIgKyB2ICYmIG0rKztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgOTM6XG4gICAgICAgICAgICAgIDAgPT09IG4gKyBiICsgdiAmJiBtLS07XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDQxOlxuICAgICAgICAgICAgICAwID09PSBuICsgYiArIG0gJiYgdi0tO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgICAgaWYgKDAgPT09IG4gKyBiICsgbSkge1xuICAgICAgICAgICAgICAgIGlmICgwID09PSBxKSBzd2l0Y2ggKDIgKiB4ICsgMyAqIEspIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgNTMzOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHYrKztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDY0OlxuICAgICAgICAgICAgICAwID09PSBiICsgdiArIG4gKyBtICsgdSArIGsgJiYgKGsgPSAxKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNDI6XG4gICAgICAgICAgICBjYXNlIDQ3OlxuICAgICAgICAgICAgICBpZiAoISgwIDwgbiArIG0gKyB2KSkgc3dpdGNoIChiKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgc3dpdGNoICgyICogZyArIDMgKiBlLmNoYXJDb2RlQXQobCArIDEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjM1OlxuICAgICAgICAgICAgICAgICAgICAgIGIgPSA0NztcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIDIyMDpcbiAgICAgICAgICAgICAgICAgICAgICB0ID0gbCwgYiA9IDQyO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgNDI6XG4gICAgICAgICAgICAgICAgICA0NyA9PT0gZyAmJiA0MiA9PT0geCAmJiB0ICsgMiAhPT0gbCAmJiAoMzMgPT09IGUuY2hhckNvZGVBdCh0ICsgMikgJiYgKHAgKz0gZS5zdWJzdHJpbmcodCwgbCArIDEpKSwgeSA9ICcnLCBiID0gMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAwID09PSBiICYmIChmICs9IHkpO1xuICAgICAgfVxuXG4gICAgICBLID0geDtcbiAgICAgIHggPSBnO1xuICAgICAgbCsrO1xuICAgIH1cblxuICAgIHQgPSBwLmxlbmd0aDtcblxuICAgIGlmICgwIDwgdCkge1xuICAgICAgciA9IGM7XG4gICAgICBpZiAoMCA8IEEgJiYgKEMgPSBIKDIsIHAsIHIsIGQsIEQsIHosIHQsIGgsIGEsIGgpLCB2b2lkIDAgIT09IEMgJiYgMCA9PT0gKHAgPSBDKS5sZW5ndGgpKSByZXR1cm4gRyArIHAgKyBGO1xuICAgICAgcCA9IHIuam9pbignLCcpICsgJ3snICsgcCArICd9JztcblxuICAgICAgaWYgKDAgIT09IHcgKiBFKSB7XG4gICAgICAgIDIgIT09IHcgfHwgTChwLCAyKSB8fCAoRSA9IDApO1xuXG4gICAgICAgIHN3aXRjaCAoRSkge1xuICAgICAgICAgIGNhc2UgMTExOlxuICAgICAgICAgICAgcCA9IHAucmVwbGFjZShoYSwgJzotbW96LSQxJykgKyBwO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDExMjpcbiAgICAgICAgICAgIHAgPSBwLnJlcGxhY2UoUSwgJzo6LXdlYmtpdC1pbnB1dC0kMScpICsgcC5yZXBsYWNlKFEsICc6Oi1tb3otJDEnKSArIHAucmVwbGFjZShRLCAnOi1tcy1pbnB1dC0kMScpICsgcDtcbiAgICAgICAgfVxuXG4gICAgICAgIEUgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBHICsgcCArIEY7XG4gIH1cblxuICBmdW5jdGlvbiBYKGQsIGMsIGUpIHtcbiAgICB2YXIgaCA9IGMudHJpbSgpLnNwbGl0KGlhKTtcbiAgICBjID0gaDtcbiAgICB2YXIgYSA9IGgubGVuZ3RoLFxuICAgICAgICBtID0gZC5sZW5ndGg7XG5cbiAgICBzd2l0Y2ggKG0pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdmFyIGIgPSAwO1xuXG4gICAgICAgIGZvciAoZCA9IDAgPT09IG0gPyAnJyA6IGRbMF0gKyAnICc7IGIgPCBhOyArK2IpIHtcbiAgICAgICAgICBjW2JdID0gWihkLCBjW2JdLCBlKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIHYgPSBiID0gMDtcblxuICAgICAgICBmb3IgKGMgPSBbXTsgYiA8IGE7ICsrYikge1xuICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgbTsgKytuKSB7XG4gICAgICAgICAgICBjW3YrK10gPSBaKGRbbl0gKyAnICcsIGhbYl0sIGUpLnRyaW0oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiBjO1xuICB9XG5cbiAgZnVuY3Rpb24gWihkLCBjLCBlKSB7XG4gICAgdmFyIGggPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgMzMgPiBoICYmIChoID0gKGMgPSBjLnRyaW0oKSkuY2hhckNvZGVBdCgwKSk7XG5cbiAgICBzd2l0Y2ggKGgpIHtcbiAgICAgIGNhc2UgMzg6XG4gICAgICAgIHJldHVybiBjLnJlcGxhY2UoRiwgJyQxJyArIGQudHJpbSgpKTtcblxuICAgICAgY2FzZSA1ODpcbiAgICAgICAgcmV0dXJuIGQudHJpbSgpICsgYy5yZXBsYWNlKEYsICckMScgKyBkLnRyaW0oKSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICgwIDwgMSAqIGUgJiYgMCA8IGMuaW5kZXhPZignXFxmJykpIHJldHVybiBjLnJlcGxhY2UoRiwgKDU4ID09PSBkLmNoYXJDb2RlQXQoMCkgPyAnJyA6ICckMScpICsgZC50cmltKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkICsgYztcbiAgfVxuXG4gIGZ1bmN0aW9uIFAoZCwgYywgZSwgaCkge1xuICAgIHZhciBhID0gZCArICc7JyxcbiAgICAgICAgbSA9IDIgKiBjICsgMyAqIGUgKyA0ICogaDtcblxuICAgIGlmICg5NDQgPT09IG0pIHtcbiAgICAgIGQgPSBhLmluZGV4T2YoJzonLCA5KSArIDE7XG4gICAgICB2YXIgYiA9IGEuc3Vic3RyaW5nKGQsIGEubGVuZ3RoIC0gMSkudHJpbSgpO1xuICAgICAgYiA9IGEuc3Vic3RyaW5nKDAsIGQpLnRyaW0oKSArIGIgKyAnOyc7XG4gICAgICByZXR1cm4gMSA9PT0gdyB8fCAyID09PSB3ICYmIEwoYiwgMSkgPyAnLXdlYmtpdC0nICsgYiArIGIgOiBiO1xuICAgIH1cblxuICAgIGlmICgwID09PSB3IHx8IDIgPT09IHcgJiYgIUwoYSwgMSkpIHJldHVybiBhO1xuXG4gICAgc3dpdGNoIChtKSB7XG4gICAgICBjYXNlIDEwMTU6XG4gICAgICAgIHJldHVybiA5NyA9PT0gYS5jaGFyQ29kZUF0KDEwKSA/ICctd2Via2l0LScgKyBhICsgYSA6IGE7XG5cbiAgICAgIGNhc2UgOTUxOlxuICAgICAgICByZXR1cm4gMTE2ID09PSBhLmNoYXJDb2RlQXQoMykgPyAnLXdlYmtpdC0nICsgYSArIGEgOiBhO1xuXG4gICAgICBjYXNlIDk2MzpcbiAgICAgICAgcmV0dXJuIDExMCA9PT0gYS5jaGFyQ29kZUF0KDUpID8gJy13ZWJraXQtJyArIGEgKyBhIDogYTtcblxuICAgICAgY2FzZSAxMDA5OlxuICAgICAgICBpZiAoMTAwICE9PSBhLmNoYXJDb2RlQXQoNCkpIGJyZWFrO1xuXG4gICAgICBjYXNlIDk2OTpcbiAgICAgIGNhc2UgOTQyOlxuICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyBhO1xuXG4gICAgICBjYXNlIDk3ODpcbiAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgJy1tb3otJyArIGEgKyBhO1xuXG4gICAgICBjYXNlIDEwMTk6XG4gICAgICBjYXNlIDk4MzpcbiAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgJy1tb3otJyArIGEgKyAnLW1zLScgKyBhICsgYTtcblxuICAgICAgY2FzZSA4ODM6XG4gICAgICAgIGlmICg0NSA9PT0gYS5jaGFyQ29kZUF0KDgpKSByZXR1cm4gJy13ZWJraXQtJyArIGEgKyBhO1xuICAgICAgICBpZiAoMCA8IGEuaW5kZXhPZignaW1hZ2Utc2V0KCcsIDExKSkgcmV0dXJuIGEucmVwbGFjZShqYSwgJyQxLXdlYmtpdC0kMicpICsgYTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgOTMyOlxuICAgICAgICBpZiAoNDUgPT09IGEuY2hhckNvZGVBdCg0KSkgc3dpdGNoIChhLmNoYXJDb2RlQXQoNSkpIHtcbiAgICAgICAgICBjYXNlIDEwMzpcbiAgICAgICAgICAgIHJldHVybiAnLXdlYmtpdC1ib3gtJyArIGEucmVwbGFjZSgnLWdyb3cnLCAnJykgKyAnLXdlYmtpdC0nICsgYSArICctbXMtJyArIGEucmVwbGFjZSgnZ3JvdycsICdwb3NpdGl2ZScpICsgYTtcblxuICAgICAgICAgIGNhc2UgMTE1OlxuICAgICAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgJy1tcy0nICsgYS5yZXBsYWNlKCdzaHJpbmsnLCAnbmVnYXRpdmUnKSArIGE7XG5cbiAgICAgICAgICBjYXNlIDk4OlxuICAgICAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgJy1tcy0nICsgYS5yZXBsYWNlKCdiYXNpcycsICdwcmVmZXJyZWQtc2l6ZScpICsgYTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1zLScgKyBhICsgYTtcblxuICAgICAgY2FzZSA5NjQ6XG4gICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbXMtZmxleC0nICsgYSArIGE7XG5cbiAgICAgIGNhc2UgMTAyMzpcbiAgICAgICAgaWYgKDk5ICE9PSBhLmNoYXJDb2RlQXQoOCkpIGJyZWFrO1xuICAgICAgICBiID0gYS5zdWJzdHJpbmcoYS5pbmRleE9mKCc6JywgMTUpKS5yZXBsYWNlKCdmbGV4LScsICcnKS5yZXBsYWNlKCdzcGFjZS1iZXR3ZWVuJywgJ2p1c3RpZnknKTtcbiAgICAgICAgcmV0dXJuICctd2Via2l0LWJveC1wYWNrJyArIGIgKyAnLXdlYmtpdC0nICsgYSArICctbXMtZmxleC1wYWNrJyArIGIgKyBhO1xuXG4gICAgICBjYXNlIDEwMDU6XG4gICAgICAgIHJldHVybiBrYS50ZXN0KGEpID8gYS5yZXBsYWNlKGFhLCAnOi13ZWJraXQtJykgKyBhLnJlcGxhY2UoYWEsICc6LW1vei0nKSArIGEgOiBhO1xuXG4gICAgICBjYXNlIDFlMzpcbiAgICAgICAgYiA9IGEuc3Vic3RyaW5nKDEzKS50cmltKCk7XG4gICAgICAgIGMgPSBiLmluZGV4T2YoJy0nKSArIDE7XG5cbiAgICAgICAgc3dpdGNoIChiLmNoYXJDb2RlQXQoMCkgKyBiLmNoYXJDb2RlQXQoYykpIHtcbiAgICAgICAgICBjYXNlIDIyNjpcbiAgICAgICAgICAgIGIgPSBhLnJlcGxhY2UoRywgJ3RiJyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjMyOlxuICAgICAgICAgICAgYiA9IGEucmVwbGFjZShHLCAndGItcmwnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMjA6XG4gICAgICAgICAgICBiID0gYS5yZXBsYWNlKEcsICdscicpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1zLScgKyBiICsgYTtcblxuICAgICAgY2FzZSAxMDE3OlxuICAgICAgICBpZiAoLTEgPT09IGEuaW5kZXhPZignc3RpY2t5JywgOSkpIGJyZWFrO1xuXG4gICAgICBjYXNlIDk3NTpcbiAgICAgICAgYyA9IChhID0gZCkubGVuZ3RoIC0gMTA7XG4gICAgICAgIGIgPSAoMzMgPT09IGEuY2hhckNvZGVBdChjKSA/IGEuc3Vic3RyaW5nKDAsIGMpIDogYSkuc3Vic3RyaW5nKGQuaW5kZXhPZignOicsIDcpICsgMSkudHJpbSgpO1xuXG4gICAgICAgIHN3aXRjaCAobSA9IGIuY2hhckNvZGVBdCgwKSArIChiLmNoYXJDb2RlQXQoNykgfCAwKSkge1xuICAgICAgICAgIGNhc2UgMjAzOlxuICAgICAgICAgICAgaWYgKDExMSA+IGIuY2hhckNvZGVBdCg4KSkgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDExNTpcbiAgICAgICAgICAgIGEgPSBhLnJlcGxhY2UoYiwgJy13ZWJraXQtJyArIGIpICsgJzsnICsgYTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMDc6XG4gICAgICAgICAgY2FzZSAxMDI6XG4gICAgICAgICAgICBhID0gYS5yZXBsYWNlKGIsICctd2Via2l0LScgKyAoMTAyIDwgbSA/ICdpbmxpbmUtJyA6ICcnKSArICdib3gnKSArICc7JyArIGEucmVwbGFjZShiLCAnLXdlYmtpdC0nICsgYikgKyAnOycgKyBhLnJlcGxhY2UoYiwgJy1tcy0nICsgYiArICdib3gnKSArICc7JyArIGE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYSArICc7JztcblxuICAgICAgY2FzZSA5Mzg6XG4gICAgICAgIGlmICg0NSA9PT0gYS5jaGFyQ29kZUF0KDUpKSBzd2l0Y2ggKGEuY2hhckNvZGVBdCg2KSkge1xuICAgICAgICAgIGNhc2UgMTA1OlxuICAgICAgICAgICAgcmV0dXJuIGIgPSBhLnJlcGxhY2UoJy1pdGVtcycsICcnKSwgJy13ZWJraXQtJyArIGEgKyAnLXdlYmtpdC1ib3gtJyArIGIgKyAnLW1zLWZsZXgtJyArIGIgKyBhO1xuXG4gICAgICAgICAgY2FzZSAxMTU6XG4gICAgICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1zLWZsZXgtaXRlbS0nICsgYS5yZXBsYWNlKGJhLCAnJykgKyBhO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbXMtZmxleC1saW5lLXBhY2snICsgYS5yZXBsYWNlKCdhbGlnbi1jb250ZW50JywgJycpLnJlcGxhY2UoYmEsICcnKSArIGE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgOTczOlxuICAgICAgY2FzZSA5ODk6XG4gICAgICAgIGlmICg0NSAhPT0gYS5jaGFyQ29kZUF0KDMpIHx8IDEyMiA9PT0gYS5jaGFyQ29kZUF0KDQpKSBicmVhaztcblxuICAgICAgY2FzZSA5MzE6XG4gICAgICBjYXNlIDk1MzpcbiAgICAgICAgaWYgKCEwID09PSBsYS50ZXN0KGQpKSByZXR1cm4gMTE1ID09PSAoYiA9IGQuc3Vic3RyaW5nKGQuaW5kZXhPZignOicpICsgMSkpLmNoYXJDb2RlQXQoMCkgPyBQKGQucmVwbGFjZSgnc3RyZXRjaCcsICdmaWxsLWF2YWlsYWJsZScpLCBjLCBlLCBoKS5yZXBsYWNlKCc6ZmlsbC1hdmFpbGFibGUnLCAnOnN0cmV0Y2gnKSA6IGEucmVwbGFjZShiLCAnLXdlYmtpdC0nICsgYikgKyBhLnJlcGxhY2UoYiwgJy1tb3otJyArIGIucmVwbGFjZSgnZmlsbC0nLCAnJykpICsgYTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgOTYyOlxuICAgICAgICBpZiAoYSA9ICctd2Via2l0LScgKyBhICsgKDEwMiA9PT0gYS5jaGFyQ29kZUF0KDUpID8gJy1tcy0nICsgYSA6ICcnKSArIGEsIDIxMSA9PT0gZSArIGggJiYgMTA1ID09PSBhLmNoYXJDb2RlQXQoMTMpICYmIDAgPCBhLmluZGV4T2YoJ3RyYW5zZm9ybScsIDEwKSkgcmV0dXJuIGEuc3Vic3RyaW5nKDAsIGEuaW5kZXhPZignOycsIDI3KSArIDEpLnJlcGxhY2UobWEsICckMS13ZWJraXQtJDInKSArIGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG4gIH1cblxuICBmdW5jdGlvbiBMKGQsIGMpIHtcbiAgICB2YXIgZSA9IGQuaW5kZXhPZigxID09PSBjID8gJzonIDogJ3snKSxcbiAgICAgICAgaCA9IGQuc3Vic3RyaW5nKDAsIDMgIT09IGMgPyBlIDogMTApO1xuICAgIGUgPSBkLnN1YnN0cmluZyhlICsgMSwgZC5sZW5ndGggLSAxKTtcbiAgICByZXR1cm4gUigyICE9PSBjID8gaCA6IGgucmVwbGFjZShuYSwgJyQxJyksIGUsIGMpO1xuICB9XG5cbiAgZnVuY3Rpb24gZWEoZCwgYykge1xuICAgIHZhciBlID0gUChjLCBjLmNoYXJDb2RlQXQoMCksIGMuY2hhckNvZGVBdCgxKSwgYy5jaGFyQ29kZUF0KDIpKTtcbiAgICByZXR1cm4gZSAhPT0gYyArICc7JyA/IGUucmVwbGFjZShvYSwgJyBvciAoJDEpJykuc3Vic3RyaW5nKDQpIDogJygnICsgYyArICcpJztcbiAgfVxuXG4gIGZ1bmN0aW9uIEgoZCwgYywgZSwgaCwgYSwgbSwgYiwgdiwgbiwgcSkge1xuICAgIGZvciAodmFyIGcgPSAwLCB4ID0gYywgdzsgZyA8IEE7ICsrZykge1xuICAgICAgc3dpdGNoICh3ID0gU1tnXS5jYWxsKEIsIGQsIHgsIGUsIGgsIGEsIG0sIGIsIHYsIG4sIHEpKSB7XG4gICAgICAgIGNhc2Ugdm9pZCAwOlxuICAgICAgICBjYXNlICExOlxuICAgICAgICBjYXNlICEwOlxuICAgICAgICBjYXNlIG51bGw6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB4ID0gdztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoeCAhPT0gYykgcmV0dXJuIHg7XG4gIH1cblxuICBmdW5jdGlvbiBUKGQpIHtcbiAgICBzd2l0Y2ggKGQpIHtcbiAgICAgIGNhc2Ugdm9pZCAwOlxuICAgICAgY2FzZSBudWxsOlxuICAgICAgICBBID0gUy5sZW5ndGggPSAwO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBkKSBTW0ErK10gPSBkO2Vsc2UgaWYgKCdvYmplY3QnID09PSB0eXBlb2YgZCkgZm9yICh2YXIgYyA9IDAsIGUgPSBkLmxlbmd0aDsgYyA8IGU7ICsrYykge1xuICAgICAgICAgIFQoZFtjXSk7XG4gICAgICAgIH0gZWxzZSBZID0gISFkIHwgMDtcbiAgICB9XG5cbiAgICByZXR1cm4gVDtcbiAgfVxuXG4gIGZ1bmN0aW9uIFUoZCkge1xuICAgIGQgPSBkLnByZWZpeDtcbiAgICB2b2lkIDAgIT09IGQgJiYgKFIgPSBudWxsLCBkID8gJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGQgPyB3ID0gMSA6ICh3ID0gMiwgUiA9IGQpIDogdyA9IDApO1xuICAgIHJldHVybiBVO1xuICB9XG5cbiAgZnVuY3Rpb24gQihkLCBjKSB7XG4gICAgdmFyIGUgPSBkO1xuICAgIDMzID4gZS5jaGFyQ29kZUF0KDApICYmIChlID0gZS50cmltKCkpO1xuICAgIFYgPSBlO1xuICAgIGUgPSBbVl07XG5cbiAgICBpZiAoMCA8IEEpIHtcbiAgICAgIHZhciBoID0gSCgtMSwgYywgZSwgZSwgRCwgeiwgMCwgMCwgMCwgMCk7XG4gICAgICB2b2lkIDAgIT09IGggJiYgJ3N0cmluZycgPT09IHR5cGVvZiBoICYmIChjID0gaCk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBNKE8sIGUsIGMsIDAsIDApO1xuICAgIDAgPCBBICYmIChoID0gSCgtMiwgYSwgZSwgZSwgRCwgeiwgYS5sZW5ndGgsIDAsIDAsIDApLCB2b2lkIDAgIT09IGggJiYgKGEgPSBoKSk7XG4gICAgViA9ICcnO1xuICAgIEUgPSAwO1xuICAgIHogPSBEID0gMTtcbiAgICByZXR1cm4gYTtcbiAgfVxuXG4gIHZhciBjYSA9IC9eXFwwKy9nLFxuICAgICAgTiA9IC9bXFwwXFxyXFxmXS9nLFxuICAgICAgYWEgPSAvOiAqL2csXG4gICAgICBrYSA9IC96b298Z3JhLyxcbiAgICAgIG1hID0gLyhbLDogXSkodHJhbnNmb3JtKS9nLFxuICAgICAgaWEgPSAvLFxccis/L2csXG4gICAgICBGID0gLyhbXFx0XFxyXFxuIF0pKlxcZj8mL2csXG4gICAgICBmYSA9IC9AKGtcXHcrKVxccyooXFxTKilcXHMqLyxcbiAgICAgIFEgPSAvOjoocGxhY2UpL2csXG4gICAgICBoYSA9IC86KHJlYWQtb25seSkvZyxcbiAgICAgIEcgPSAvW3N2aF1cXHcrLVt0YmxyXXsyfS8sXG4gICAgICBkYSA9IC9cXChcXHMqKC4qKVxccypcXCkvZyxcbiAgICAgIG9hID0gLyhbXFxzXFxTXSo/KTsvZyxcbiAgICAgIGJhID0gLy1zZWxmfGZsZXgtL2csXG4gICAgICBuYSA9IC9bXl0qPyg6W3JwXVtlbF1hW1xcdy1dKylbXl0qLyxcbiAgICAgIGxhID0gL3N0cmV0Y2h8OlxccypcXHcrXFwtKD86Y29udGV8YXZhaWwpLyxcbiAgICAgIGphID0gLyhbXi1dKShpbWFnZS1zZXRcXCgpLyxcbiAgICAgIHogPSAxLFxuICAgICAgRCA9IDEsXG4gICAgICBFID0gMCxcbiAgICAgIHcgPSAxLFxuICAgICAgTyA9IFtdLFxuICAgICAgUyA9IFtdLFxuICAgICAgQSA9IDAsXG4gICAgICBSID0gbnVsbCxcbiAgICAgIFkgPSAwLFxuICAgICAgViA9ICcnO1xuICBCLnVzZSA9IFQ7XG4gIEIuc2V0ID0gVTtcbiAgdm9pZCAwICE9PSBXICYmIFUoVyk7XG4gIHJldHVybiBCO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHlsaXNfbWluO1xuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0LCB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHN0b3BFdmVudCwgZ2V0RG9jdW1lbnQsIGlzTW91c2VMaWtlUG9pbnRlclR5cGUsIGNvbnRhaW5zLCBhY3RpdmVFbGVtZW50LCBpc1NhZmFyaSwgaXNUeXBlYWJsZUNvbWJvYm94LCBpc1ZpcnR1YWxDbGljaywgaXNWaXJ0dWFsUG9pbnRlckV2ZW50LCBnZXRUYXJnZXQsIGdldFBsYXRmb3JtLCBpc1R5cGVhYmxlRWxlbWVudCwgaXNSZWFjdEV2ZW50LCBpc1Jvb3RFbGVtZW50LCBpc0V2ZW50VGFyZ2V0V2l0aGluLCBpc01hYywgZ2V0VXNlckFnZW50IH0gZnJvbSAnQGZsb2F0aW5nLXVpL3JlYWN0L3V0aWxzJztcbmltcG9ydCB7IGZsb29yLCBldmFsdWF0ZSB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscyc7XG5pbXBvcnQgeyBnZXRDb21wdXRlZFN0eWxlLCBpc0VsZW1lbnQsIGdldE5vZGVOYW1lLCBpc0hUTUxFbGVtZW50LCBnZXRXaW5kb3csIGlzTGFzdFRyYXZlcnNhYmxlTm9kZSwgZ2V0UGFyZW50Tm9kZSB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscy9kb20nO1xuaW1wb3J0IHsgdGFiYmFibGUsIGlzVGFiYmFibGUgfSBmcm9tICd0YWJiYWJsZSc7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgZ2V0T3ZlcmZsb3dBbmNlc3RvcnMsIHVzZUZsb2F0aW5nIGFzIHVzZUZsb2F0aW5nJDEsIG9mZnNldCwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tICdAZmxvYXRpbmctdWkvcmVhY3QtZG9tJztcbmV4cG9ydCB7IGFycm93LCBhdXRvUGxhY2VtZW50LCBhdXRvVXBkYXRlLCBjb21wdXRlUG9zaXRpb24sIGRldGVjdE92ZXJmbG93LCBmbGlwLCBnZXRPdmVyZmxvd0FuY2VzdG9ycywgaGlkZSwgaW5saW5lLCBsaW1pdFNoaWZ0LCBvZmZzZXQsIHBsYXRmb3JtLCBzaGlmdCwgc2l6ZSB9IGZyb20gJ0BmbG9hdGluZy11aS9yZWFjdC1kb20nO1xuXG4vKipcbiAqIE1lcmdlcyBhbiBhcnJheSBvZiByZWZzIGludG8gYSBzaW5nbGUgbWVtb2l6ZWQgY2FsbGJhY2sgcmVmIG9yIGBudWxsYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9yZWFjdC11dGlscyN1c2VtZXJnZXJlZnNcbiAqL1xuZnVuY3Rpb24gdXNlTWVyZ2VSZWZzKHJlZnMpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChyZWZzLmV2ZXJ5KHJlZiA9PiByZWYgPT0gbnVsbCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgPT4ge1xuICAgICAgcmVmcy5mb3JFYWNoKHJlZiA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmVmKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCByZWZzKTtcbn1cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL211aS9tYXRlcmlhbC11aS9pc3N1ZXMvNDExOTAjaXNzdWVjb21tZW50LTIwNDA4NzMzNzlcbmNvbnN0IFNhZmVSZWFjdCA9IHtcbiAgLi4uUmVhY3Rcbn07XG5cbmNvbnN0IHVzZUluc2VydGlvbkVmZmVjdCA9IFNhZmVSZWFjdC51c2VJbnNlcnRpb25FZmZlY3Q7XG5jb25zdCB1c2VTYWZlSW5zZXJ0aW9uRWZmZWN0ID0gdXNlSW5zZXJ0aW9uRWZmZWN0IHx8IChmbiA9PiBmbigpKTtcbmZ1bmN0aW9uIHVzZUVmZmVjdEV2ZW50KGNhbGxiYWNrKSB7XG4gIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZigoKSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBhbiBldmVudCBoYW5kbGVyIHdoaWxlIHJlbmRlcmluZy4nKTtcbiAgICB9XG4gIH0pO1xuICB1c2VTYWZlSW5zZXJ0aW9uRWZmZWN0KCgpID0+IHtcbiAgICByZWYuY3VycmVudCA9IGNhbGxiYWNrO1xuICB9KTtcbiAgcmV0dXJuIFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIHJldHVybiByZWYuY3VycmVudCA9PSBudWxsID8gdm9pZCAwIDogcmVmLmN1cnJlbnQoLi4uYXJncyk7XG4gIH0sIFtdKTtcbn1cblxuY29uc3QgQVJST1dfVVAgPSAnQXJyb3dVcCc7XG5jb25zdCBBUlJPV19ET1dOID0gJ0Fycm93RG93bic7XG5jb25zdCBBUlJPV19MRUZUID0gJ0Fycm93TGVmdCc7XG5jb25zdCBBUlJPV19SSUdIVCA9ICdBcnJvd1JpZ2h0JztcbmZ1bmN0aW9uIGlzRGlmZmVyZW50Um93KGluZGV4LCBjb2xzLCBwcmV2Um93KSB7XG4gIHJldHVybiBNYXRoLmZsb29yKGluZGV4IC8gY29scykgIT09IHByZXZSb3c7XG59XG5mdW5jdGlvbiBpc0luZGV4T3V0T2ZCb3VuZHMobGlzdFJlZiwgaW5kZXgpIHtcbiAgcmV0dXJuIGluZGV4IDwgMCB8fCBpbmRleCA+PSBsaXN0UmVmLmN1cnJlbnQubGVuZ3RoO1xufVxuZnVuY3Rpb24gZ2V0TWluSW5kZXgobGlzdFJlZiwgZGlzYWJsZWRJbmRpY2VzKSB7XG4gIHJldHVybiBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCB7XG4gICAgZGlzYWJsZWRJbmRpY2VzXG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0TWF4SW5kZXgobGlzdFJlZiwgZGlzYWJsZWRJbmRpY2VzKSB7XG4gIHJldHVybiBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCB7XG4gICAgZGVjcmVtZW50OiB0cnVlLFxuICAgIHN0YXJ0aW5nSW5kZXg6IGxpc3RSZWYuY3VycmVudC5sZW5ndGgsXG4gICAgZGlzYWJsZWRJbmRpY2VzXG4gIH0pO1xufVxuZnVuY3Rpb24gZmluZE5vbkRpc2FibGVkSW5kZXgobGlzdFJlZiwgX3RlbXApIHtcbiAgbGV0IHtcbiAgICBzdGFydGluZ0luZGV4ID0gLTEsXG4gICAgZGVjcmVtZW50ID0gZmFsc2UsXG4gICAgZGlzYWJsZWRJbmRpY2VzLFxuICAgIGFtb3VudCA9IDFcbiAgfSA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wO1xuICBjb25zdCBsaXN0ID0gbGlzdFJlZi5jdXJyZW50O1xuICBsZXQgaW5kZXggPSBzdGFydGluZ0luZGV4O1xuICBkbyB7XG4gICAgaW5kZXggKz0gZGVjcmVtZW50ID8gLWFtb3VudCA6IGFtb3VudDtcbiAgfSB3aGlsZSAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSBsaXN0Lmxlbmd0aCAtIDEgJiYgaXNEaXNhYmxlZChsaXN0LCBpbmRleCwgZGlzYWJsZWRJbmRpY2VzKSk7XG4gIHJldHVybiBpbmRleDtcbn1cbmZ1bmN0aW9uIGdldEdyaWROYXZpZ2F0ZWRJbmRleChlbGVtZW50c1JlZiwgX3JlZikge1xuICBsZXQge1xuICAgIGV2ZW50LFxuICAgIG9yaWVudGF0aW9uLFxuICAgIGxvb3AsXG4gICAgY29scyxcbiAgICBkaXNhYmxlZEluZGljZXMsXG4gICAgbWluSW5kZXgsXG4gICAgbWF4SW5kZXgsXG4gICAgcHJldkluZGV4LFxuICAgIHN0b3BFdmVudDogc3RvcCA9IGZhbHNlXG4gIH0gPSBfcmVmO1xuICBsZXQgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICBpZiAoZXZlbnQua2V5ID09PSBBUlJPV19VUCkge1xuICAgIHN0b3AgJiYgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICBpZiAocHJldkluZGV4ID09PSAtMSkge1xuICAgICAgbmV4dEluZGV4ID0gbWF4SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgIHN0YXJ0aW5nSW5kZXg6IG5leHRJbmRleCxcbiAgICAgICAgYW1vdW50OiBjb2xzLFxuICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgfSk7XG4gICAgICBpZiAobG9vcCAmJiAocHJldkluZGV4IC0gY29scyA8IG1pbkluZGV4IHx8IG5leHRJbmRleCA8IDApKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IHByZXZJbmRleCAlIGNvbHM7XG4gICAgICAgIGNvbnN0IG1heENvbCA9IG1heEluZGV4ICUgY29scztcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gbWF4SW5kZXggLSAobWF4Q29sIC0gY29sKTtcbiAgICAgICAgaWYgKG1heENvbCA9PT0gY29sKSB7XG4gICAgICAgICAgbmV4dEluZGV4ID0gbWF4SW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dEluZGV4ID0gbWF4Q29sID4gY29sID8gb2Zmc2V0IDogb2Zmc2V0IC0gY29scztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNJbmRleE91dE9mQm91bmRzKGVsZW1lbnRzUmVmLCBuZXh0SW5kZXgpKSB7XG4gICAgICBuZXh0SW5kZXggPSBwcmV2SW5kZXg7XG4gICAgfVxuICB9XG4gIGlmIChldmVudC5rZXkgPT09IEFSUk9XX0RPV04pIHtcbiAgICBzdG9wICYmIHN0b3BFdmVudChldmVudCk7XG4gICAgaWYgKHByZXZJbmRleCA9PT0gLTEpIHtcbiAgICAgIG5leHRJbmRleCA9IG1pbkluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICBzdGFydGluZ0luZGV4OiBwcmV2SW5kZXgsXG4gICAgICAgIGFtb3VudDogY29scyxcbiAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICB9KTtcbiAgICAgIGlmIChsb29wICYmIHByZXZJbmRleCArIGNvbHMgPiBtYXhJbmRleCkge1xuICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCAlIGNvbHMgLSBjb2xzLFxuICAgICAgICAgIGFtb3VudDogY29scyxcbiAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0luZGV4T3V0T2ZCb3VuZHMoZWxlbWVudHNSZWYsIG5leHRJbmRleCkpIHtcbiAgICAgIG5leHRJbmRleCA9IHByZXZJbmRleDtcbiAgICB9XG4gIH1cblxuICAvLyBSZW1haW5zIG9uIHRoZSBzYW1lIHJvdy9jb2x1bW4uXG4gIGlmIChvcmllbnRhdGlvbiA9PT0gJ2JvdGgnKSB7XG4gICAgY29uc3QgcHJldlJvdyA9IGZsb29yKHByZXZJbmRleCAvIGNvbHMpO1xuICAgIGlmIChldmVudC5rZXkgPT09IEFSUk9XX1JJR0hUKSB7XG4gICAgICBzdG9wICYmIHN0b3BFdmVudChldmVudCk7XG4gICAgICBpZiAocHJldkluZGV4ICUgY29scyAhPT0gY29scyAtIDEpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICBzdGFydGluZ0luZGV4OiBwcmV2SW5kZXgsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobG9vcCAmJiBpc0RpZmZlcmVudFJvdyhuZXh0SW5kZXgsIGNvbHMsIHByZXZSb3cpKSB7XG4gICAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCAtIHByZXZJbmRleCAlIGNvbHMgLSAxLFxuICAgICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobG9vcCkge1xuICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCAtIHByZXZJbmRleCAlIGNvbHMgLSAxLFxuICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0RpZmZlcmVudFJvdyhuZXh0SW5kZXgsIGNvbHMsIHByZXZSb3cpKSB7XG4gICAgICAgIG5leHRJbmRleCA9IHByZXZJbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gQVJST1dfTEVGVCkge1xuICAgICAgc3RvcCAmJiBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgaWYgKHByZXZJbmRleCAlIGNvbHMgIT09IDApIHtcbiAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICBzdGFydGluZ0luZGV4OiBwcmV2SW5kZXgsXG4gICAgICAgICAgZGVjcmVtZW50OiB0cnVlLFxuICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGxvb3AgJiYgaXNEaWZmZXJlbnRSb3cobmV4dEluZGV4LCBjb2xzLCBwcmV2Um93KSkge1xuICAgICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgICBzdGFydGluZ0luZGV4OiBwcmV2SW5kZXggKyAoY29scyAtIHByZXZJbmRleCAlIGNvbHMpLFxuICAgICAgICAgICAgZGVjcmVtZW50OiB0cnVlLFxuICAgICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobG9vcCkge1xuICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCArIChjb2xzIC0gcHJldkluZGV4ICUgY29scyksXG4gICAgICAgICAgZGVjcmVtZW50OiB0cnVlLFxuICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0RpZmZlcmVudFJvdyhuZXh0SW5kZXgsIGNvbHMsIHByZXZSb3cpKSB7XG4gICAgICAgIG5leHRJbmRleCA9IHByZXZJbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGFzdFJvdyA9IGZsb29yKG1heEluZGV4IC8gY29scykgPT09IHByZXZSb3c7XG4gICAgaWYgKGlzSW5kZXhPdXRPZkJvdW5kcyhlbGVtZW50c1JlZiwgbmV4dEluZGV4KSkge1xuICAgICAgaWYgKGxvb3AgJiYgbGFzdFJvdykge1xuICAgICAgICBuZXh0SW5kZXggPSBldmVudC5rZXkgPT09IEFSUk9XX0xFRlQgPyBtYXhJbmRleCA6IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4IC0gcHJldkluZGV4ICUgY29scyAtIDEsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmV4dEluZGV4O1xufVxuXG4vKiogRm9yIGVhY2ggY2VsbCBpbmRleCwgZ2V0cyB0aGUgaXRlbSBpbmRleCB0aGF0IG9jY3VwaWVzIHRoYXQgY2VsbCAqL1xuZnVuY3Rpb24gYnVpbGRDZWxsTWFwKHNpemVzLCBjb2xzLCBkZW5zZSkge1xuICBjb25zdCBjZWxsTWFwID0gW107XG4gIGxldCBzdGFydEluZGV4ID0gMDtcbiAgc2l6ZXMuZm9yRWFjaCgoX3JlZjIsIGluZGV4KSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IF9yZWYyO1xuICAgIGlmICh3aWR0aCA+IGNvbHMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0Zsb2F0aW5nIFVJXTogSW52YWxpZCBncmlkIC0gaXRlbSB3aWR0aCBhdCBpbmRleCBcIiArIGluZGV4ICsgXCIgaXMgZ3JlYXRlciB0aGFuIGdyaWQgY29sdW1uc1wiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGl0ZW1QbGFjZWQgPSBmYWxzZTtcbiAgICBpZiAoZGVuc2UpIHtcbiAgICAgIHN0YXJ0SW5kZXggPSAwO1xuICAgIH1cbiAgICB3aGlsZSAoIWl0ZW1QbGFjZWQpIHtcbiAgICAgIGNvbnN0IHRhcmdldENlbGxzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykge1xuICAgICAgICAgIHRhcmdldENlbGxzLnB1c2goc3RhcnRJbmRleCArIGkgKyBqICogY29scyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGFydEluZGV4ICUgY29scyArIHdpZHRoIDw9IGNvbHMgJiYgdGFyZ2V0Q2VsbHMuZXZlcnkoY2VsbCA9PiBjZWxsTWFwW2NlbGxdID09IG51bGwpKSB7XG4gICAgICAgIHRhcmdldENlbGxzLmZvckVhY2goY2VsbCA9PiB7XG4gICAgICAgICAgY2VsbE1hcFtjZWxsXSA9IGluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgaXRlbVBsYWNlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydEluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBjb252ZXJ0IGludG8gYSBub24tc3BhcnNlIGFycmF5XG4gIHJldHVybiBbLi4uY2VsbE1hcF07XG59XG5cbi8qKiBHZXRzIGNlbGwgaW5kZXggb2YgYW4gaXRlbSdzIGNvcm5lciBvciAtMSB3aGVuIGluZGV4IGlzIC0xLiAqL1xuZnVuY3Rpb24gZ2V0Q2VsbEluZGV4T2ZDb3JuZXIoaW5kZXgsIHNpemVzLCBjZWxsTWFwLCBjb2xzLCBjb3JuZXIpIHtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIC0xO1xuICBjb25zdCBmaXJzdENlbGxJbmRleCA9IGNlbGxNYXAuaW5kZXhPZihpbmRleCk7XG4gIGNvbnN0IHNpemVJdGVtID0gc2l6ZXNbaW5kZXhdO1xuICBzd2l0Y2ggKGNvcm5lcikge1xuICAgIGNhc2UgJ3RsJzpcbiAgICAgIHJldHVybiBmaXJzdENlbGxJbmRleDtcbiAgICBjYXNlICd0cic6XG4gICAgICBpZiAoIXNpemVJdGVtKSB7XG4gICAgICAgIHJldHVybiBmaXJzdENlbGxJbmRleDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmaXJzdENlbGxJbmRleCArIHNpemVJdGVtLndpZHRoIC0gMTtcbiAgICBjYXNlICdibCc6XG4gICAgICBpZiAoIXNpemVJdGVtKSB7XG4gICAgICAgIHJldHVybiBmaXJzdENlbGxJbmRleDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmaXJzdENlbGxJbmRleCArIChzaXplSXRlbS5oZWlnaHQgLSAxKSAqIGNvbHM7XG4gICAgY2FzZSAnYnInOlxuICAgICAgcmV0dXJuIGNlbGxNYXAubGFzdEluZGV4T2YoaW5kZXgpO1xuICB9XG59XG5cbi8qKiBHZXRzIGFsbCBjZWxsIGluZGljZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBzcGVjaWZpZWQgaW5kaWNlcyAqL1xuZnVuY3Rpb24gZ2V0Q2VsbEluZGljZXMoaW5kaWNlcywgY2VsbE1hcCkge1xuICByZXR1cm4gY2VsbE1hcC5mbGF0TWFwKChpbmRleCwgY2VsbEluZGV4KSA9PiBpbmRpY2VzLmluY2x1ZGVzKGluZGV4KSA/IFtjZWxsSW5kZXhdIDogW10pO1xufVxuZnVuY3Rpb24gaXNEaXNhYmxlZChsaXN0LCBpbmRleCwgZGlzYWJsZWRJbmRpY2VzKSB7XG4gIGlmIChkaXNhYmxlZEluZGljZXMpIHtcbiAgICByZXR1cm4gZGlzYWJsZWRJbmRpY2VzLmluY2x1ZGVzKGluZGV4KTtcbiAgfVxuICBjb25zdCBlbGVtZW50ID0gbGlzdFtpbmRleF07XG4gIHJldHVybiBlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKSA9PT0gJ3RydWUnO1xufVxuXG5sZXQgcmFmSWQgPSAwO1xuZnVuY3Rpb24gZW5xdWV1ZUZvY3VzKGVsLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIHByZXZlbnRTY3JvbGwgPSBmYWxzZSxcbiAgICBjYW5jZWxQcmV2aW91cyA9IHRydWUsXG4gICAgc3luYyA9IGZhbHNlXG4gIH0gPSBvcHRpb25zO1xuICBjYW5jZWxQcmV2aW91cyAmJiBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XG4gIGNvbnN0IGV4ZWMgPSAoKSA9PiBlbCA9PSBudWxsID8gdm9pZCAwIDogZWwuZm9jdXMoe1xuICAgIHByZXZlbnRTY3JvbGxcbiAgfSk7XG4gIGlmIChzeW5jKSB7XG4gICAgZXhlYygpO1xuICB9IGVsc2Uge1xuICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGV4ZWMpO1xuICB9XG59XG5cbnZhciBpbmRleCA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyB1c2VMYXlvdXRFZmZlY3QgOiB1c2VFZmZlY3Q7XG5cbmZ1bmN0aW9uIHNvcnRCeURvY3VtZW50UG9zaXRpb24oYSwgYikge1xuICBjb25zdCBwb3NpdGlvbiA9IGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik7XG4gIGlmIChwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HIHx8IHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgaWYgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcgfHwgcG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiBhcmVNYXBzRXF1YWwobWFwMSwgbWFwMikge1xuICBpZiAobWFwMS5zaXplICE9PSBtYXAyLnNpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbWFwMS5lbnRyaWVzKCkpIHtcbiAgICBpZiAodmFsdWUgIT09IG1hcDIuZ2V0KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5jb25zdCBGbG9hdGluZ0xpc3RDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICByZWdpc3RlcjogKCkgPT4ge30sXG4gIHVucmVnaXN0ZXI6ICgpID0+IHt9LFxuICBtYXA6IC8qI19fUFVSRV9fKi9uZXcgTWFwKCksXG4gIGVsZW1lbnRzUmVmOiB7XG4gICAgY3VycmVudDogW11cbiAgfVxufSk7XG4vKipcbiAqIFByb3ZpZGVzIGNvbnRleHQgZm9yIGEgbGlzdCBvZiBpdGVtcyB3aXRoaW4gdGhlIGZsb2F0aW5nIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdMaXN0XG4gKi9cbmZ1bmN0aW9uIEZsb2F0aW5nTGlzdChwcm9wcykge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgZWxlbWVudHNSZWYsXG4gICAgbGFiZWxzUmVmXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgW21hcCwgc2V0TWFwXSA9IFJlYWN0LnVzZVN0YXRlKCgpID0+IG5ldyBNYXAoKSk7XG4gIGNvbnN0IHJlZ2lzdGVyID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgc2V0TWFwKHByZXZNYXAgPT4gbmV3IE1hcChwcmV2TWFwKS5zZXQobm9kZSwgbnVsbCkpO1xuICB9LCBbXSk7XG4gIGNvbnN0IHVucmVnaXN0ZXIgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBzZXRNYXAocHJldk1hcCA9PiB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKHByZXZNYXApO1xuICAgICAgbWFwLmRlbGV0ZShub2RlKTtcbiAgICAgIHJldHVybiBtYXA7XG4gICAgfSk7XG4gIH0sIFtdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICBjb25zdCBub2RlcyA9IEFycmF5LmZyb20obmV3TWFwLmtleXMoKSkuc29ydChzb3J0QnlEb2N1bWVudFBvc2l0aW9uKTtcbiAgICBub2Rlcy5mb3JFYWNoKChub2RlLCBpbmRleCkgPT4ge1xuICAgICAgbmV3TWFwLnNldChub2RlLCBpbmRleCk7XG4gICAgfSk7XG4gICAgaWYgKCFhcmVNYXBzRXF1YWwobWFwLCBuZXdNYXApKSB7XG4gICAgICBzZXRNYXAobmV3TWFwKTtcbiAgICB9XG4gIH0sIFttYXBdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZsb2F0aW5nTGlzdENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgICAgcmVnaXN0ZXIsXG4gICAgICB1bnJlZ2lzdGVyLFxuICAgICAgbWFwLFxuICAgICAgZWxlbWVudHNSZWYsXG4gICAgICBsYWJlbHNSZWZcbiAgICB9KSwgW3JlZ2lzdGVyLCB1bnJlZ2lzdGVyLCBtYXAsIGVsZW1lbnRzUmVmLCBsYWJlbHNSZWZdKVxuICB9LCBjaGlsZHJlbik7XG59XG4vKipcbiAqIFVzZWQgdG8gcmVnaXN0ZXIgYSBsaXN0IGl0ZW0gYW5kIGl0cyBpbmRleCAoRE9NIHBvc2l0aW9uKSBpbiB0aGVcbiAqIGBGbG9hdGluZ0xpc3RgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nTGlzdCN1c2VsaXN0aXRlbVxuICovXG5mdW5jdGlvbiB1c2VMaXN0SXRlbShwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIGxhYmVsXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIHJlZ2lzdGVyLFxuICAgIHVucmVnaXN0ZXIsXG4gICAgbWFwLFxuICAgIGVsZW1lbnRzUmVmLFxuICAgIGxhYmVsc1JlZlxuICB9ID0gUmVhY3QudXNlQ29udGV4dChGbG9hdGluZ0xpc3RDb250ZXh0KTtcbiAgY29uc3QgW2luZGV4JDEsIHNldEluZGV4XSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBjb21wb25lbnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IHJlZiA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIGNvbXBvbmVudFJlZi5jdXJyZW50ID0gbm9kZTtcbiAgICBpZiAoaW5kZXgkMSAhPT0gbnVsbCkge1xuICAgICAgZWxlbWVudHNSZWYuY3VycmVudFtpbmRleCQxXSA9IG5vZGU7XG4gICAgICBpZiAobGFiZWxzUmVmKSB7XG4gICAgICAgIHZhciBfbm9kZSR0ZXh0Q29udGVudDtcbiAgICAgICAgY29uc3QgaXNMYWJlbERlZmluZWQgPSBsYWJlbCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBsYWJlbHNSZWYuY3VycmVudFtpbmRleCQxXSA9IGlzTGFiZWxEZWZpbmVkID8gbGFiZWwgOiAoX25vZGUkdGV4dENvbnRlbnQgPSBub2RlID09IG51bGwgPyB2b2lkIDAgOiBub2RlLnRleHRDb250ZW50KSAhPSBudWxsID8gX25vZGUkdGV4dENvbnRlbnQgOiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2luZGV4JDEsIGVsZW1lbnRzUmVmLCBsYWJlbHNSZWYsIGxhYmVsXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBjb25zdCBub2RlID0gY29tcG9uZW50UmVmLmN1cnJlbnQ7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIHJlZ2lzdGVyKG5vZGUpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdW5yZWdpc3Rlcihub2RlKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbcmVnaXN0ZXIsIHVucmVnaXN0ZXJdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gY29tcG9uZW50UmVmLmN1cnJlbnQgPyBtYXAuZ2V0KGNvbXBvbmVudFJlZi5jdXJyZW50KSA6IG51bGw7XG4gICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgIHNldEluZGV4KGluZGV4KTtcbiAgICB9XG4gIH0sIFttYXBdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICByZWYsXG4gICAgaW5kZXg6IGluZGV4JDEgPT0gbnVsbCA/IC0xIDogaW5kZXgkMVxuICB9KSwgW2luZGV4JDEsIHJlZl0pO1xufVxuXG5mdW5jdGlvbiByZW5kZXJKc3gocmVuZGVyLCBjb21wdXRlZFByb3BzKSB7XG4gIGlmICh0eXBlb2YgcmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHJlbmRlcihjb21wdXRlZFByb3BzKTtcbiAgfVxuICBpZiAocmVuZGVyKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQocmVuZGVyLCBjb21wdXRlZFByb3BzKTtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgY29tcHV0ZWRQcm9wcyk7XG59XG5jb25zdCBDb21wb3NpdGVDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBhY3RpdmVJbmRleDogMCxcbiAgb25OYXZpZ2F0ZTogKCkgPT4ge31cbn0pO1xuY29uc3QgaG9yaXpvbnRhbEtleXMgPSBbQVJST1dfTEVGVCwgQVJST1dfUklHSFRdO1xuY29uc3QgdmVydGljYWxLZXlzID0gW0FSUk9XX1VQLCBBUlJPV19ET1dOXTtcbmNvbnN0IGFsbEtleXMgPSBbLi4uaG9yaXpvbnRhbEtleXMsIC4uLnZlcnRpY2FsS2V5c107XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpbmdsZSB0YWIgc3RvcCB3aG9zZSBpdGVtcyBhcmUgbmF2aWdhdGVkIGJ5IGFycm93IGtleXMsIHdoaWNoXG4gKiBwcm92aWRlcyBsaXN0IG5hdmlnYXRpb24gb3V0c2lkZSBvZiBmbG9hdGluZyBlbGVtZW50IGNvbnRleHRzLlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIHRvIGVuYWJsZSBuYXZpZ2F0aW9uIG9mIGEgbGlzdCBvZiBpdGVtcyB0aGF0IGFyZW7igJl0IHBhcnQgb2YgYVxuICogZmxvYXRpbmcgZWxlbWVudC4gQSBtZW51YmFyIGlzIGFuIGV4YW1wbGUgb2YgYSBjb21wb3NpdGUsIHdpdGggZWFjaCByZWZlcmVuY2VcbiAqIGVsZW1lbnQgYmVpbmcgYW4gaXRlbS5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9Db21wb3NpdGVcbiAqL1xuY29uc3QgQ29tcG9zaXRlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ29tcG9zaXRlKHByb3BzLCBmb3J3YXJkZWRSZWYpIHtcbiAgY29uc3Qge1xuICAgIHJlbmRlcixcbiAgICBvcmllbnRhdGlvbiA9ICdib3RoJyxcbiAgICBsb29wID0gdHJ1ZSxcbiAgICBjb2xzID0gMSxcbiAgICBkaXNhYmxlZEluZGljZXMsXG4gICAgYWN0aXZlSW5kZXg6IGV4dGVybmFsQWN0aXZlSW5kZXgsXG4gICAgb25OYXZpZ2F0ZTogZXh0ZXJuYWxTZXRBY3RpdmVJbmRleCxcbiAgICBpdGVtU2l6ZXMsXG4gICAgZGVuc2UgPSBmYWxzZSxcbiAgICAuLi5kb21Qcm9wc1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IFtpbnRlcm5hbEFjdGl2ZUluZGV4LCBpbnRlcm5hbFNldEFjdGl2ZUluZGV4XSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICBjb25zdCBhY3RpdmVJbmRleCA9IGV4dGVybmFsQWN0aXZlSW5kZXggIT0gbnVsbCA/IGV4dGVybmFsQWN0aXZlSW5kZXggOiBpbnRlcm5hbEFjdGl2ZUluZGV4O1xuICBjb25zdCBvbk5hdmlnYXRlID0gdXNlRWZmZWN0RXZlbnQoZXh0ZXJuYWxTZXRBY3RpdmVJbmRleCAhPSBudWxsID8gZXh0ZXJuYWxTZXRBY3RpdmVJbmRleCA6IGludGVybmFsU2V0QWN0aXZlSW5kZXgpO1xuICBjb25zdCBlbGVtZW50c1JlZiA9IFJlYWN0LnVzZVJlZihbXSk7XG4gIGNvbnN0IHJlbmRlckVsZW1lbnRQcm9wcyA9IHJlbmRlciAmJiB0eXBlb2YgcmVuZGVyICE9PSAnZnVuY3Rpb24nID8gcmVuZGVyLnByb3BzIDoge307XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBhY3RpdmVJbmRleCxcbiAgICBvbk5hdmlnYXRlXG4gIH0pLCBbYWN0aXZlSW5kZXgsIG9uTmF2aWdhdGVdKTtcbiAgY29uc3QgaXNHcmlkID0gY29scyA+IDE7XG4gIGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZXZlbnQpIHtcbiAgICBpZiAoIWFsbEtleXMuaW5jbHVkZXMoZXZlbnQua2V5KSkgcmV0dXJuO1xuICAgIGxldCBuZXh0SW5kZXggPSBhY3RpdmVJbmRleDtcbiAgICBjb25zdCBtaW5JbmRleCA9IGdldE1pbkluZGV4KGVsZW1lbnRzUmVmLCBkaXNhYmxlZEluZGljZXMpO1xuICAgIGNvbnN0IG1heEluZGV4ID0gZ2V0TWF4SW5kZXgoZWxlbWVudHNSZWYsIGRpc2FibGVkSW5kaWNlcyk7XG4gICAgaWYgKGlzR3JpZCkge1xuICAgICAgY29uc3Qgc2l6ZXMgPSBpdGVtU2l6ZXMgfHwgQXJyYXkuZnJvbSh7XG4gICAgICAgIGxlbmd0aDogZWxlbWVudHNSZWYuY3VycmVudC5sZW5ndGhcbiAgICAgIH0sICgpID0+ICh7XG4gICAgICAgIHdpZHRoOiAxLFxuICAgICAgICBoZWlnaHQ6IDFcbiAgICAgIH0pKTtcbiAgICAgIC8vIFRvIGNhbGN1bGF0ZSBtb3ZlbWVudHMgb24gdGhlIGdyaWQsIHdlIHVzZSBoeXBvdGhldGljYWwgY2VsbCBpbmRpY2VzXG4gICAgICAvLyBhcyBpZiBldmVyeSBpdGVtIHdhcyAxeDEsIHRoZW4gY29udmVydCBiYWNrIHRvIHJlYWwgaW5kaWNlcy5cbiAgICAgIGNvbnN0IGNlbGxNYXAgPSBidWlsZENlbGxNYXAoc2l6ZXMsIGNvbHMsIGRlbnNlKTtcbiAgICAgIGNvbnN0IG1pbkdyaWRJbmRleCA9IGNlbGxNYXAuZmluZEluZGV4KGluZGV4ID0+IGluZGV4ICE9IG51bGwgJiYgIWlzRGlzYWJsZWQoZWxlbWVudHNSZWYuY3VycmVudCwgaW5kZXgsIGRpc2FibGVkSW5kaWNlcykpO1xuICAgICAgLy8gbGFzdCBlbmFibGVkIGluZGV4XG4gICAgICBjb25zdCBtYXhHcmlkSW5kZXggPSBjZWxsTWFwLnJlZHVjZSgoZm91bmRJbmRleCwgaW5kZXgsIGNlbGxJbmRleCkgPT4gaW5kZXggIT0gbnVsbCAmJiAhaXNEaXNhYmxlZChlbGVtZW50c1JlZi5jdXJyZW50LCBpbmRleCwgZGlzYWJsZWRJbmRpY2VzKSA/IGNlbGxJbmRleCA6IGZvdW5kSW5kZXgsIC0xKTtcbiAgICAgIG5leHRJbmRleCA9IGNlbGxNYXBbZ2V0R3JpZE5hdmlnYXRlZEluZGV4KHtcbiAgICAgICAgY3VycmVudDogY2VsbE1hcC5tYXAoaXRlbUluZGV4ID0+IGl0ZW1JbmRleCA/IGVsZW1lbnRzUmVmLmN1cnJlbnRbaXRlbUluZGV4XSA6IG51bGwpXG4gICAgICB9LCB7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICBvcmllbnRhdGlvbixcbiAgICAgICAgbG9vcCxcbiAgICAgICAgY29scyxcbiAgICAgICAgLy8gdHJlYXQgdW5kZWZpbmVkIChlbXB0eSBncmlkIHNwYWNlcykgYXMgZGlzYWJsZWQgaW5kaWNlcyBzbyB3ZVxuICAgICAgICAvLyBkb24ndCBlbmQgdXAgaW4gdGhlbVxuICAgICAgICBkaXNhYmxlZEluZGljZXM6IGdldENlbGxJbmRpY2VzKFsuLi4oZGlzYWJsZWRJbmRpY2VzIHx8IGVsZW1lbnRzUmVmLmN1cnJlbnQubWFwKChfLCBpbmRleCkgPT4gaXNEaXNhYmxlZChlbGVtZW50c1JlZi5jdXJyZW50LCBpbmRleCkgPyBpbmRleCA6IHVuZGVmaW5lZCkpLCB1bmRlZmluZWRdLCBjZWxsTWFwKSxcbiAgICAgICAgbWluSW5kZXg6IG1pbkdyaWRJbmRleCxcbiAgICAgICAgbWF4SW5kZXg6IG1heEdyaWRJbmRleCxcbiAgICAgICAgcHJldkluZGV4OiBnZXRDZWxsSW5kZXhPZkNvcm5lcihhY3RpdmVJbmRleCA+IG1heEluZGV4ID8gbWluSW5kZXggOiBhY3RpdmVJbmRleCwgc2l6ZXMsIGNlbGxNYXAsIGNvbHMsXG4gICAgICAgIC8vIHVzZSBhIGNvcm5lciBtYXRjaGluZyB0aGUgZWRnZSBjbG9zZXN0IHRvIHRoZSBkaXJlY3Rpb24gd2UncmVcbiAgICAgICAgLy8gbW92aW5nIGluIHNvIHdlIGRvbid0IGVuZCB1cCBpbiB0aGUgc2FtZSBpdGVtLiBQcmVmZXJcbiAgICAgICAgLy8gdG9wL2xlZnQgb3ZlciBib3R0b20vcmlnaHQuXG4gICAgICAgIGV2ZW50LmtleSA9PT0gQVJST1dfRE9XTiA/ICdibCcgOiBldmVudC5rZXkgPT09IEFSUk9XX1JJR0hUID8gJ3RyJyA6ICd0bCcpXG4gICAgICB9KV07IC8vIG5hdmlnYXRlZCBjZWxsIHdpbGwgbmV2ZXIgYmUgbnVsbGlzaFxuICAgIH1cbiAgICBjb25zdCB0b0VuZEtleXMgPSB7XG4gICAgICBob3Jpem9udGFsOiBbQVJST1dfUklHSFRdLFxuICAgICAgdmVydGljYWw6IFtBUlJPV19ET1dOXSxcbiAgICAgIGJvdGg6IFtBUlJPV19SSUdIVCwgQVJST1dfRE9XTl1cbiAgICB9W29yaWVudGF0aW9uXTtcbiAgICBjb25zdCB0b1N0YXJ0S2V5cyA9IHtcbiAgICAgIGhvcml6b250YWw6IFtBUlJPV19MRUZUXSxcbiAgICAgIHZlcnRpY2FsOiBbQVJST1dfVVBdLFxuICAgICAgYm90aDogW0FSUk9XX0xFRlQsIEFSUk9XX1VQXVxuICAgIH1bb3JpZW50YXRpb25dO1xuICAgIGNvbnN0IHByZXZlbnRlZEtleXMgPSBpc0dyaWQgPyBhbGxLZXlzIDoge1xuICAgICAgaG9yaXpvbnRhbDogaG9yaXpvbnRhbEtleXMsXG4gICAgICB2ZXJ0aWNhbDogdmVydGljYWxLZXlzLFxuICAgICAgYm90aDogYWxsS2V5c1xuICAgIH1bb3JpZW50YXRpb25dO1xuICAgIGlmIChuZXh0SW5kZXggPT09IGFjdGl2ZUluZGV4ICYmIFsuLi50b0VuZEtleXMsIC4uLnRvU3RhcnRLZXlzXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICBpZiAobG9vcCAmJiBuZXh0SW5kZXggPT09IG1heEluZGV4ICYmIHRvRW5kS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgIG5leHRJbmRleCA9IG1pbkluZGV4O1xuICAgICAgfSBlbHNlIGlmIChsb29wICYmIG5leHRJbmRleCA9PT0gbWluSW5kZXggJiYgdG9TdGFydEtleXMuaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgICBuZXh0SW5kZXggPSBtYXhJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogbmV4dEluZGV4LFxuICAgICAgICAgIGRlY3JlbWVudDogdG9TdGFydEtleXMuaW5jbHVkZXMoZXZlbnQua2V5KSxcbiAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuZXh0SW5kZXggIT09IGFjdGl2ZUluZGV4ICYmICFpc0luZGV4T3V0T2ZCb3VuZHMoZWxlbWVudHNSZWYsIG5leHRJbmRleCkpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKHByZXZlbnRlZEtleXMuaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgb25OYXZpZ2F0ZShuZXh0SW5kZXgpO1xuXG4gICAgICAvLyBXYWl0IGZvciBGb2N1c01hbmFnZXIgYHJldHVybkZvY3VzYCB0byBleGVjdXRlLlxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBlbnF1ZXVlRm9jdXMoZWxlbWVudHNSZWYuY3VycmVudFtuZXh0SW5kZXhdKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjb25zdCBjb21wdXRlZFByb3BzID0ge1xuICAgIC4uLmRvbVByb3BzLFxuICAgIC4uLnJlbmRlckVsZW1lbnRQcm9wcyxcbiAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAnYXJpYS1vcmllbnRhdGlvbic6IG9yaWVudGF0aW9uID09PSAnYm90aCcgPyB1bmRlZmluZWQgOiBvcmllbnRhdGlvbixcbiAgICBvbktleURvd24oZSkge1xuICAgICAgZG9tUHJvcHMub25LZXlEb3duID09IG51bGwgfHwgZG9tUHJvcHMub25LZXlEb3duKGUpO1xuICAgICAgcmVuZGVyRWxlbWVudFByb3BzLm9uS2V5RG93biA9PSBudWxsIHx8IHJlbmRlckVsZW1lbnRQcm9wcy5vbktleURvd24oZSk7XG4gICAgICBoYW5kbGVLZXlEb3duKGUpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvc2l0ZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY29udGV4dFZhbHVlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZsb2F0aW5nTGlzdCwge1xuICAgIGVsZW1lbnRzUmVmOiBlbGVtZW50c1JlZlxuICB9LCByZW5kZXJKc3gocmVuZGVyLCBjb21wdXRlZFByb3BzKSkpO1xufSk7XG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9Db21wb3NpdGVcbiAqL1xuY29uc3QgQ29tcG9zaXRlSXRlbSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIENvbXBvc2l0ZUl0ZW0ocHJvcHMsIGZvcndhcmRlZFJlZikge1xuICBjb25zdCB7XG4gICAgcmVuZGVyLFxuICAgIC4uLmRvbVByb3BzXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgcmVuZGVyRWxlbWVudFByb3BzID0gcmVuZGVyICYmIHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicgPyByZW5kZXIucHJvcHMgOiB7fTtcbiAgY29uc3Qge1xuICAgIGFjdGl2ZUluZGV4LFxuICAgIG9uTmF2aWdhdGVcbiAgfSA9IFJlYWN0LnVzZUNvbnRleHQoQ29tcG9zaXRlQ29udGV4dCk7XG4gIGNvbnN0IHtcbiAgICByZWYsXG4gICAgaW5kZXhcbiAgfSA9IHVzZUxpc3RJdGVtKCk7XG4gIGNvbnN0IG1lcmdlZFJlZiA9IHVzZU1lcmdlUmVmcyhbcmVmLCBmb3J3YXJkZWRSZWYsIHJlbmRlckVsZW1lbnRQcm9wcy5yZWZdKTtcbiAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVJbmRleCA9PT0gaW5kZXg7XG4gIGNvbnN0IGNvbXB1dGVkUHJvcHMgPSB7XG4gICAgLi4uZG9tUHJvcHMsXG4gICAgLi4ucmVuZGVyRWxlbWVudFByb3BzLFxuICAgIHJlZjogbWVyZ2VkUmVmLFxuICAgIHRhYkluZGV4OiBpc0FjdGl2ZSA/IDAgOiAtMSxcbiAgICAnZGF0YS1hY3RpdmUnOiBpc0FjdGl2ZSA/ICcnIDogdW5kZWZpbmVkLFxuICAgIG9uRm9jdXMoZSkge1xuICAgICAgZG9tUHJvcHMub25Gb2N1cyA9PSBudWxsIHx8IGRvbVByb3BzLm9uRm9jdXMoZSk7XG4gICAgICByZW5kZXJFbGVtZW50UHJvcHMub25Gb2N1cyA9PSBudWxsIHx8IHJlbmRlckVsZW1lbnRQcm9wcy5vbkZvY3VzKGUpO1xuICAgICAgb25OYXZpZ2F0ZShpbmRleCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gcmVuZGVySnN4KHJlbmRlciwgY29tcHV0ZWRQcm9wcyk7XG59KTtcblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmxldCBzZXJ2ZXJIYW5kb2ZmQ29tcGxldGUgPSBmYWxzZTtcbmxldCBjb3VudCA9IDA7XG5jb25zdCBnZW5JZCA9ICgpID0+IC8vIEVuc3VyZSB0aGUgaWQgaXMgdW5pcXVlIHdpdGggbXVsdGlwbGUgaW5kZXBlbmRlbnQgdmVyc2lvbnMgb2YgRmxvYXRpbmcgVUlcbi8vIG9uIDxSZWFjdCAxOFxuXCJmbG9hdGluZy11aS1cIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDYpICsgY291bnQrKztcbmZ1bmN0aW9uIHVzZUZsb2F0aW5nSWQoKSB7XG4gIGNvbnN0IFtpZCwgc2V0SWRdID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gc2VydmVySGFuZG9mZkNvbXBsZXRlID8gZ2VuSWQoKSA6IHVuZGVmaW5lZCk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoaWQgPT0gbnVsbCkge1xuICAgICAgc2V0SWQoZ2VuSWQoKSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW10pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNlcnZlckhhbmRvZmZDb21wbGV0ZSA9IHRydWU7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGlkO1xufVxuY29uc3QgdXNlUmVhY3RJZCA9IFNhZmVSZWFjdC51c2VJZDtcblxuLyoqXG4gKiBVc2VzIFJlYWN0IDE4J3MgYnVpbHQtaW4gYHVzZUlkKClgIHdoZW4gYXZhaWxhYmxlLCBvciBmYWxscyBiYWNrIHRvIGFcbiAqIHNsaWdodGx5IGxlc3MgcGVyZm9ybWFudCAocmVxdWlyaW5nIGEgZG91YmxlIHJlbmRlcikgaW1wbGVtZW50YXRpb24gZm9yXG4gKiBlYXJsaWVyIFJlYWN0IHZlcnNpb25zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3JlYWN0LXV0aWxzI3VzZWlkXG4gKi9cbmNvbnN0IHVzZUlkID0gdXNlUmVhY3RJZCB8fCB1c2VGbG9hdGluZ0lkO1xuXG5sZXQgZGV2TWVzc2FnZVNldDtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgZGV2TWVzc2FnZVNldCA9IC8qI19fUFVSRV9fKi9uZXcgU2V0KCk7XG59XG5mdW5jdGlvbiB3YXJuKCkge1xuICB2YXIgX2Rldk1lc3NhZ2VTZXQ7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtZXNzYWdlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtZXNzYWdlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuICBjb25zdCBtZXNzYWdlID0gXCJGbG9hdGluZyBVSTogXCIgKyBtZXNzYWdlcy5qb2luKCcgJyk7XG4gIGlmICghKChfZGV2TWVzc2FnZVNldCA9IGRldk1lc3NhZ2VTZXQpICE9IG51bGwgJiYgX2Rldk1lc3NhZ2VTZXQuaGFzKG1lc3NhZ2UpKSkge1xuICAgIHZhciBfZGV2TWVzc2FnZVNldDI7XG4gICAgKF9kZXZNZXNzYWdlU2V0MiA9IGRldk1lc3NhZ2VTZXQpID09IG51bGwgfHwgX2Rldk1lc3NhZ2VTZXQyLmFkZChtZXNzYWdlKTtcbiAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9yKCkge1xuICB2YXIgX2Rldk1lc3NhZ2VTZXQzO1xuICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2VzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgbWVzc2FnZXNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuICBjb25zdCBtZXNzYWdlID0gXCJGbG9hdGluZyBVSTogXCIgKyBtZXNzYWdlcy5qb2luKCcgJyk7XG4gIGlmICghKChfZGV2TWVzc2FnZVNldDMgPSBkZXZNZXNzYWdlU2V0KSAhPSBudWxsICYmIF9kZXZNZXNzYWdlU2V0My5oYXMobWVzc2FnZSkpKSB7XG4gICAgdmFyIF9kZXZNZXNzYWdlU2V0NDtcbiAgICAoX2Rldk1lc3NhZ2VTZXQ0ID0gZGV2TWVzc2FnZVNldCkgPT0gbnVsbCB8fCBfZGV2TWVzc2FnZVNldDQuYWRkKG1lc3NhZ2UpO1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgcG9pbnRpbmcgYXJyb3cgdHJpYW5nbGUuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdBcnJvd1xuICovXG5jb25zdCBGbG9hdGluZ0Fycm93ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRmxvYXRpbmdBcnJvdyhwcm9wcywgcmVmKSB7XG4gIGNvbnN0IHtcbiAgICBjb250ZXh0OiB7XG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICBmbG9hdGluZ1xuICAgICAgfSxcbiAgICAgIG1pZGRsZXdhcmVEYXRhOiB7XG4gICAgICAgIGFycm93XG4gICAgICB9XG4gICAgfSxcbiAgICB3aWR0aCA9IDE0LFxuICAgIGhlaWdodCA9IDcsXG4gICAgdGlwUmFkaXVzID0gMCxcbiAgICBzdHJva2VXaWR0aCA9IDAsXG4gICAgc3RhdGljT2Zmc2V0LFxuICAgIHN0cm9rZSxcbiAgICBkLFxuICAgIHN0eWxlOiB7XG4gICAgICB0cmFuc2Zvcm0sXG4gICAgICAuLi5yZXN0U3R5bGVcbiAgICB9ID0ge30sXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAoIXJlZikge1xuICAgICAgd2FybignVGhlIGByZWZgIHByb3AgaXMgcmVxdWlyZWQgZm9yIGBGbG9hdGluZ0Fycm93YC4nKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY2xpcFBhdGhJZCA9IHVzZUlkKCk7XG4gIGNvbnN0IFtpc1JUTCwgc2V0SXNSVExdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMjkzMlxuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFmbG9hdGluZykgcmV0dXJuO1xuICAgIGNvbnN0IGlzUlRMID0gZ2V0Q29tcHV0ZWRTdHlsZShmbG9hdGluZykuZGlyZWN0aW9uID09PSAncnRsJztcbiAgICBpZiAoaXNSVEwpIHtcbiAgICAgIHNldElzUlRMKHRydWUpO1xuICAgIH1cbiAgfSwgW2Zsb2F0aW5nXSk7XG4gIGlmICghZmxvYXRpbmcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFN0cm9rZXMgbXVzdCBiZSBkb3VibGUgdGhlIGJvcmRlciB3aWR0aCwgdGhpcyBlbnN1cmVzIHRoZSBzdHJva2UncyB3aWR0aFxuICAvLyB3b3JrcyBhcyB5b3UnZCBleHBlY3QuXG4gIGNvbnN0IGNvbXB1dGVkU3Ryb2tlV2lkdGggPSBzdHJva2VXaWR0aCAqIDI7XG4gIGNvbnN0IGhhbGZTdHJva2VXaWR0aCA9IGNvbXB1dGVkU3Ryb2tlV2lkdGggLyAyO1xuICBjb25zdCBzdmdYID0gd2lkdGggLyAyICogKHRpcFJhZGl1cyAvIC04ICsgMSk7XG4gIGNvbnN0IHN2Z1kgPSBoZWlnaHQgLyAyICogdGlwUmFkaXVzIC8gNDtcbiAgY29uc3QgW3NpZGUsIGFsaWdubWVudF0gPSBwbGFjZW1lbnQuc3BsaXQoJy0nKTtcbiAgY29uc3QgaXNDdXN0b21TaGFwZSA9ICEhZDtcbiAgY29uc3QgaXNWZXJ0aWNhbFNpZGUgPSBzaWRlID09PSAndG9wJyB8fCBzaWRlID09PSAnYm90dG9tJztcbiAgY29uc3QgeU9mZnNldFByb3AgPSBzdGF0aWNPZmZzZXQgJiYgYWxpZ25tZW50ID09PSAnZW5kJyA/ICdib3R0b20nIDogJ3RvcCc7XG4gIGxldCB4T2Zmc2V0UHJvcCA9IHN0YXRpY09mZnNldCAmJiBhbGlnbm1lbnQgPT09ICdlbmQnID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgaWYgKHN0YXRpY09mZnNldCAmJiBpc1JUTCkge1xuICAgIHhPZmZzZXRQcm9wID0gYWxpZ25tZW50ID09PSAnZW5kJyA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gIH1cbiAgY29uc3QgYXJyb3dYID0gKGFycm93ID09IG51bGwgPyB2b2lkIDAgOiBhcnJvdy54KSAhPSBudWxsID8gc3RhdGljT2Zmc2V0IHx8IGFycm93LnggOiAnJztcbiAgY29uc3QgYXJyb3dZID0gKGFycm93ID09IG51bGwgPyB2b2lkIDAgOiBhcnJvdy55KSAhPSBudWxsID8gc3RhdGljT2Zmc2V0IHx8IGFycm93LnkgOiAnJztcbiAgY29uc3QgZFZhbHVlID0gZCB8fCAnTTAsMCcgKyAoXCIgSFwiICsgd2lkdGgpICsgKFwiIExcIiArICh3aWR0aCAtIHN2Z1gpICsgXCIsXCIgKyAoaGVpZ2h0IC0gc3ZnWSkpICsgKFwiIFFcIiArIHdpZHRoIC8gMiArIFwiLFwiICsgaGVpZ2h0ICsgXCIgXCIgKyBzdmdYICsgXCIsXCIgKyAoaGVpZ2h0IC0gc3ZnWSkpICsgJyBaJztcbiAgY29uc3Qgcm90YXRpb24gPSB7XG4gICAgdG9wOiBpc0N1c3RvbVNoYXBlID8gJ3JvdGF0ZSgxODBkZWcpJyA6ICcnLFxuICAgIGxlZnQ6IGlzQ3VzdG9tU2hhcGUgPyAncm90YXRlKDkwZGVnKScgOiAncm90YXRlKC05MGRlZyknLFxuICAgIGJvdHRvbTogaXNDdXN0b21TaGFwZSA/ICcnIDogJ3JvdGF0ZSgxODBkZWcpJyxcbiAgICByaWdodDogaXNDdXN0b21TaGFwZSA/ICdyb3RhdGUoLTkwZGVnKScgOiAncm90YXRlKDkwZGVnKSdcbiAgfVtzaWRlXTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlLFxuICAgIHJlZjogcmVmLFxuICAgIHdpZHRoOiBpc0N1c3RvbVNoYXBlID8gd2lkdGggOiB3aWR0aCArIGNvbXB1dGVkU3Ryb2tlV2lkdGgsXG4gICAgaGVpZ2h0OiB3aWR0aCxcbiAgICB2aWV3Qm94OiBcIjAgMCBcIiArIHdpZHRoICsgXCIgXCIgKyAoaGVpZ2h0ID4gd2lkdGggPyBoZWlnaHQgOiB3aWR0aCksXG4gICAgc3R5bGU6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgW3hPZmZzZXRQcm9wXTogYXJyb3dYLFxuICAgICAgW3lPZmZzZXRQcm9wXTogYXJyb3dZLFxuICAgICAgW3NpZGVdOiBpc1ZlcnRpY2FsU2lkZSB8fCBpc0N1c3RvbVNoYXBlID8gJzEwMCUnIDogXCJjYWxjKDEwMCUgLSBcIiArIGNvbXB1dGVkU3Ryb2tlV2lkdGggLyAyICsgXCJweClcIixcbiAgICAgIHRyYW5zZm9ybTogXCJcIiArIHJvdGF0aW9uICsgKHRyYW5zZm9ybSAhPSBudWxsID8gdHJhbnNmb3JtIDogJycpLFxuICAgICAgLi4ucmVzdFN0eWxlXG4gICAgfVxuICB9KSwgY29tcHV0ZWRTdHJva2VXaWR0aCA+IDAgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGlwUGF0aDogXCJ1cmwoI1wiICsgY2xpcFBhdGhJZCArIFwiKVwiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHN0cm9rZTogc3Ryb2tlXG4gICAgLy8gQWNjb3VudCBmb3IgdGhlIHN0cm9rZSBvbiB0aGUgZmlsbCBwYXRoIHJlbmRlcmVkIGJlbG93LlxuICAgICxcbiAgICBzdHJva2VXaWR0aDogY29tcHV0ZWRTdHJva2VXaWR0aCArIChkID8gMCA6IDEpLFxuICAgIGQ6IGRWYWx1ZVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBzdHJva2U6IGNvbXB1dGVkU3Ryb2tlV2lkdGggJiYgIWQgPyByZXN0LmZpbGwgOiAnbm9uZScsXG4gICAgZDogZFZhbHVlXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIsIHtcbiAgICBpZDogY2xpcFBhdGhJZFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IC1oYWxmU3Ryb2tlV2lkdGgsXG4gICAgeTogaGFsZlN0cm9rZVdpZHRoICogKGlzQ3VzdG9tU2hhcGUgPyAtMSA6IDEpLFxuICAgIHdpZHRoOiB3aWR0aCArIGNvbXB1dGVkU3Ryb2tlV2lkdGgsXG4gICAgaGVpZ2h0OiB3aWR0aFxuICB9KSkpO1xufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVB1YlN1YigpIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICByZXR1cm4ge1xuICAgIGVtaXQoZXZlbnQsIGRhdGEpIHtcbiAgICAgIHZhciBfbWFwJGdldDtcbiAgICAgIChfbWFwJGdldCA9IG1hcC5nZXQoZXZlbnQpKSA9PSBudWxsIHx8IF9tYXAkZ2V0LmZvckVhY2goaGFuZGxlciA9PiBoYW5kbGVyKGRhdGEpKTtcbiAgICB9LFxuICAgIG9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgbWFwLnNldChldmVudCwgWy4uLihtYXAuZ2V0KGV2ZW50KSB8fCBbXSksIGxpc3RlbmVyXSk7XG4gICAgfSxcbiAgICBvZmYoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgX21hcCRnZXQyO1xuICAgICAgbWFwLnNldChldmVudCwgKChfbWFwJGdldDIgPSBtYXAuZ2V0KGV2ZW50KSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9tYXAkZ2V0Mi5maWx0ZXIobCA9PiBsICE9PSBsaXN0ZW5lcikpIHx8IFtdKTtcbiAgICB9XG4gIH07XG59XG5cbmNvbnN0IEZsb2F0aW5nTm9kZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmNvbnN0IEZsb2F0aW5nVHJlZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXJlbnQgbm9kZSBpZCBmb3IgbmVzdGVkIGZsb2F0aW5nIGVsZW1lbnRzLCBpZiBhdmFpbGFibGUuXG4gKiBSZXR1cm5zIGBudWxsYCBmb3IgdG9wLWxldmVsIGZsb2F0aW5nIGVsZW1lbnRzLlxuICovXG5jb25zdCB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCA9ICgpID0+IHtcbiAgdmFyIF9SZWFjdCR1c2VDb250ZXh0O1xuICByZXR1cm4gKChfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRmxvYXRpbmdOb2RlQ29udGV4dCkpID09IG51bGwgPyB2b2lkIDAgOiBfUmVhY3QkdXNlQ29udGV4dC5pZCkgfHwgbnVsbDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmVhcmVzdCBmbG9hdGluZyB0cmVlIGNvbnRleHQsIGlmIGF2YWlsYWJsZS5cbiAqL1xuY29uc3QgdXNlRmxvYXRpbmdUcmVlID0gKCkgPT4gUmVhY3QudXNlQ29udGV4dChGbG9hdGluZ1RyZWVDb250ZXh0KTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBub2RlIGludG8gdGhlIGBGbG9hdGluZ1RyZWVgLCByZXR1cm5pbmcgaXRzIGlkLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nVHJlZVxuICovXG5mdW5jdGlvbiB1c2VGbG9hdGluZ05vZGVJZChjdXN0b21QYXJlbnRJZCkge1xuICBjb25zdCBpZCA9IHVzZUlkKCk7XG4gIGNvbnN0IHRyZWUgPSB1c2VGbG9hdGluZ1RyZWUoKTtcbiAgY29uc3QgcmVhY3RQYXJlbnRJZCA9IHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkKCk7XG4gIGNvbnN0IHBhcmVudElkID0gY3VzdG9tUGFyZW50SWQgfHwgcmVhY3RQYXJlbnRJZDtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICBpZCxcbiAgICAgIHBhcmVudElkXG4gICAgfTtcbiAgICB0cmVlID09IG51bGwgfHwgdHJlZS5hZGROb2RlKG5vZGUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0cmVlID09IG51bGwgfHwgdHJlZS5yZW1vdmVOb2RlKG5vZGUpO1xuICAgIH07XG4gIH0sIFt0cmVlLCBpZCwgcGFyZW50SWRdKTtcbiAgcmV0dXJuIGlkO1xufVxuLyoqXG4gKiBQcm92aWRlcyBwYXJlbnQgbm9kZSBjb250ZXh0IGZvciBuZXN0ZWQgZmxvYXRpbmcgZWxlbWVudHMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdUcmVlXG4gKi9cbmZ1bmN0aW9uIEZsb2F0aW5nTm9kZShwcm9wcykge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgaWRcbiAgfSA9IHByb3BzO1xuICBjb25zdCBwYXJlbnRJZCA9IHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkKCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGbG9hdGluZ05vZGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgIGlkLFxuICAgICAgcGFyZW50SWRcbiAgICB9KSwgW2lkLCBwYXJlbnRJZF0pXG4gIH0sIGNoaWxkcmVuKTtcbn1cbi8qKlxuICogUHJvdmlkZXMgY29udGV4dCBmb3IgbmVzdGVkIGZsb2F0aW5nIGVsZW1lbnRzIHdoZW4gdGhleSBhcmUgbm90IGNoaWxkcmVuIG9mXG4gKiBlYWNoIG90aGVyIG9uIHRoZSBET00uXG4gKiBUaGlzIGlzIG5vdCBuZWNlc3NhcnkgaW4gYWxsIGNhc2VzLCBleGNlcHQgd2hlbiB0aGVyZSBtdXN0IGJlIGV4cGxpY2l0IGNvbW11bmljYXRpb24gYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkIGZsb2F0aW5nIGVsZW1lbnRzLiBJdCBpcyBuZWNlc3NhcnkgZm9yOlxuICogLSBUaGUgYGJ1YmJsZXNgIG9wdGlvbiBpbiB0aGUgYHVzZURpc21pc3MoKWAgSG9va1xuICogLSBOZXN0ZWQgdmlydHVhbCBsaXN0IG5hdmlnYXRpb25cbiAqIC0gTmVzdGVkIGZsb2F0aW5nIGVsZW1lbnRzIHRoYXQgZWFjaCBvcGVuIG9uIGhvdmVyXG4gKiAtIEN1c3RvbSBjb21tdW5pY2F0aW9uIGJldHdlZW4gcGFyZW50IGFuZCBjaGlsZCBmbG9hdGluZyBlbGVtZW50c1xuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nVHJlZVxuICovXG5mdW5jdGlvbiBGbG9hdGluZ1RyZWUocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qgbm9kZXNSZWYgPSBSZWFjdC51c2VSZWYoW10pO1xuICBjb25zdCBhZGROb2RlID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgbm9kZXNSZWYuY3VycmVudCA9IFsuLi5ub2Rlc1JlZi5jdXJyZW50LCBub2RlXTtcbiAgfSwgW10pO1xuICBjb25zdCByZW1vdmVOb2RlID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgbm9kZXNSZWYuY3VycmVudCA9IG5vZGVzUmVmLmN1cnJlbnQuZmlsdGVyKG4gPT4gbiAhPT0gbm9kZSk7XG4gIH0sIFtdKTtcbiAgY29uc3QgZXZlbnRzID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gY3JlYXRlUHViU3ViKCkpWzBdO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmxvYXRpbmdUcmVlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgICBub2Rlc1JlZixcbiAgICAgIGFkZE5vZGUsXG4gICAgICByZW1vdmVOb2RlLFxuICAgICAgZXZlbnRzXG4gICAgfSksIFthZGROb2RlLCByZW1vdmVOb2RlLCBldmVudHNdKVxuICB9LCBjaGlsZHJlbik7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUF0dHJpYnV0ZShuYW1lKSB7XG4gIHJldHVybiBcImRhdGEtZmxvYXRpbmctdWktXCIgKyBuYW1lO1xufVxuXG5mdW5jdGlvbiB1c2VMYXRlc3RSZWYodmFsdWUpIHtcbiAgY29uc3QgcmVmID0gdXNlUmVmKHZhbHVlKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVmO1xufVxuXG5jb25zdCBzYWZlUG9seWdvbklkZW50aWZpZXIgPSAvKiNfX1BVUkVfXyovY3JlYXRlQXR0cmlidXRlKCdzYWZlLXBvbHlnb24nKTtcbmZ1bmN0aW9uIGdldERlbGF5KHZhbHVlLCBwcm9wLCBwb2ludGVyVHlwZSkge1xuICBpZiAocG9pbnRlclR5cGUgJiYgIWlzTW91c2VMaWtlUG9pbnRlclR5cGUocG9pbnRlclR5cGUpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB2b2lkIDAgOiB2YWx1ZVtwcm9wXTtcbn1cbi8qKlxuICogT3BlbnMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgd2hpbGUgaG92ZXJpbmcgb3ZlciB0aGUgcmVmZXJlbmNlIGVsZW1lbnQsIGxpa2VcbiAqIENTUyBgOmhvdmVyYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VIb3ZlclxuICovXG5mdW5jdGlvbiB1c2VIb3Zlcihjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGRhdGFSZWYsXG4gICAgZXZlbnRzLFxuICAgIGVsZW1lbnRzXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgZGVsYXkgPSAwLFxuICAgIGhhbmRsZUNsb3NlID0gbnVsbCxcbiAgICBtb3VzZU9ubHkgPSBmYWxzZSxcbiAgICByZXN0TXMgPSAwLFxuICAgIG1vdmUgPSB0cnVlXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdHJlZSA9IHVzZUZsb2F0aW5nVHJlZSgpO1xuICBjb25zdCBwYXJlbnRJZCA9IHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkKCk7XG4gIGNvbnN0IGhhbmRsZUNsb3NlUmVmID0gdXNlTGF0ZXN0UmVmKGhhbmRsZUNsb3NlKTtcbiAgY29uc3QgZGVsYXlSZWYgPSB1c2VMYXRlc3RSZWYoZGVsYXkpO1xuICBjb25zdCBvcGVuUmVmID0gdXNlTGF0ZXN0UmVmKG9wZW4pO1xuICBjb25zdCBwb2ludGVyVHlwZVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBjb25zdCB0aW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKC0xKTtcbiAgY29uc3QgaGFuZGxlclJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBjb25zdCByZXN0VGltZW91dFJlZiA9IFJlYWN0LnVzZVJlZigtMSk7XG4gIGNvbnN0IGJsb2NrTW91c2VNb3ZlUmVmID0gUmVhY3QudXNlUmVmKHRydWUpO1xuICBjb25zdCBwZXJmb3JtZWRQb2ludGVyRXZlbnRzTXV0YXRpb25SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCB1bmJpbmRNb3VzZU1vdmVSZWYgPSBSZWFjdC51c2VSZWYoKCkgPT4ge30pO1xuICBjb25zdCBpc0hvdmVyT3BlbiA9IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICB2YXIgX2RhdGFSZWYkY3VycmVudCRvcGVuO1xuICAgIGNvbnN0IHR5cGUgPSAoX2RhdGFSZWYkY3VycmVudCRvcGVuID0gZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhUmVmJGN1cnJlbnQkb3Blbi50eXBlO1xuICAgIHJldHVybiAodHlwZSA9PSBudWxsID8gdm9pZCAwIDogdHlwZS5pbmNsdWRlcygnbW91c2UnKSkgJiYgdHlwZSAhPT0gJ21vdXNlZG93bic7XG4gIH0sIFtkYXRhUmVmXSk7XG5cbiAgLy8gV2hlbiBjbG9zaW5nIGJlZm9yZSBvcGVuaW5nLCBjbGVhciB0aGUgZGVsYXkgdGltZW91dHMgdG8gY2FuY2VsIGl0XG4gIC8vIGZyb20gc2hvd2luZy5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBmdW5jdGlvbiBvbk9wZW5DaGFuZ2UoX3JlZikge1xuICAgICAgbGV0IHtcbiAgICAgICAgb3BlblxuICAgICAgfSA9IF9yZWY7XG4gICAgICBpZiAoIW9wZW4pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICAgIGNsZWFyVGltZW91dChyZXN0VGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgICAgYmxvY2tNb3VzZU1vdmVSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGV2ZW50cy5vbignb3BlbmNoYW5nZScsIG9uT3BlbkNoYW5nZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGV2ZW50cy5vZmYoJ29wZW5jaGFuZ2UnLCBvbk9wZW5DaGFuZ2UpO1xuICAgIH07XG4gIH0sIFtlbmFibGVkLCBldmVudHNdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBpZiAoIWhhbmRsZUNsb3NlUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBpZiAoIW9wZW4pIHJldHVybjtcbiAgICBmdW5jdGlvbiBvbkxlYXZlKGV2ZW50KSB7XG4gICAgICBpZiAoaXNIb3Zlck9wZW4oKSkge1xuICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50LCAnaG92ZXInKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaHRtbCA9IGdldERvY3VtZW50KGVsZW1lbnRzLmZsb2F0aW5nKS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25MZWF2ZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGh0bWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uTGVhdmUpO1xuICAgIH07XG4gIH0sIFtlbGVtZW50cy5mbG9hdGluZywgb3Blbiwgb25PcGVuQ2hhbmdlLCBlbmFibGVkLCBoYW5kbGVDbG9zZVJlZiwgaXNIb3Zlck9wZW5dKTtcbiAgY29uc3QgY2xvc2VXaXRoRGVsYXkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQsIHJ1bkVsc2VCcmFuY2gsIHJlYXNvbikge1xuICAgIGlmIChydW5FbHNlQnJhbmNoID09PSB2b2lkIDApIHtcbiAgICAgIHJ1bkVsc2VCcmFuY2ggPSB0cnVlO1xuICAgIH1cbiAgICBpZiAocmVhc29uID09PSB2b2lkIDApIHtcbiAgICAgIHJlYXNvbiA9ICdob3Zlcic7XG4gICAgfVxuICAgIGNvbnN0IGNsb3NlRGVsYXkgPSBnZXREZWxheShkZWxheVJlZi5jdXJyZW50LCAnY2xvc2UnLCBwb2ludGVyVHlwZVJlZi5jdXJyZW50KTtcbiAgICBpZiAoY2xvc2VEZWxheSAmJiAhaGFuZGxlclJlZi5jdXJyZW50KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQsIHJlYXNvbiksIGNsb3NlRGVsYXkpO1xuICAgIH0gZWxzZSBpZiAocnVuRWxzZUJyYW5jaCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50LCByZWFzb24pO1xuICAgIH1cbiAgfSwgW2RlbGF5UmVmLCBvbk9wZW5DaGFuZ2VdKTtcbiAgY29uc3QgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIgPSB1c2VFZmZlY3RFdmVudCgoKSA9PiB7XG4gICAgdW5iaW5kTW91c2VNb3ZlUmVmLmN1cnJlbnQoKTtcbiAgICBoYW5kbGVyUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gIH0pO1xuICBjb25zdCBjbGVhclBvaW50ZXJFdmVudHMgPSB1c2VFZmZlY3RFdmVudCgoKSA9PiB7XG4gICAgaWYgKHBlcmZvcm1lZFBvaW50ZXJFdmVudHNNdXRhdGlvblJlZi5jdXJyZW50KSB7XG4gICAgICBjb25zdCBib2R5ID0gZ2V0RG9jdW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpLmJvZHk7XG4gICAgICBib2R5LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgIGJvZHkucmVtb3ZlQXR0cmlidXRlKHNhZmVQb2x5Z29uSWRlbnRpZmllcik7XG4gICAgICBwZXJmb3JtZWRQb2ludGVyRXZlbnRzTXV0YXRpb25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUmVnaXN0ZXJpbmcgdGhlIG1vdXNlIGV2ZW50cyBvbiB0aGUgcmVmZXJlbmNlIGRpcmVjdGx5IHRvIGJ5cGFzcyBSZWFjdCdzXG4gIC8vIGRlbGVnYXRpb24gc3lzdGVtLiBJZiB0aGUgY3Vyc29yIHdhcyBvbiBhIGRpc2FibGVkIGVsZW1lbnQgYW5kIHRoZW4gZW50ZXJlZFxuICAvLyB0aGUgcmVmZXJlbmNlIChubyBnYXApLCBgbW91c2VlbnRlcmAgZG9lc24ndCBmaXJlIGluIHRoZSBkZWxlZ2F0aW9uIHN5c3RlbS5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBmdW5jdGlvbiBpc0NsaWNrTGlrZU9wZW5FdmVudCgpIHtcbiAgICAgIHJldHVybiBkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50ID8gWydjbGljaycsICdtb3VzZWRvd24nXS5pbmNsdWRlcyhkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50LnR5cGUpIDogZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uTW91c2VFbnRlcihldmVudCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICBibG9ja01vdXNlTW92ZVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBpZiAobW91c2VPbmx5ICYmICFpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQpIHx8IHJlc3RNcyA+IDAgJiYgIWdldERlbGF5KGRlbGF5UmVmLmN1cnJlbnQsICdvcGVuJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3BlbkRlbGF5ID0gZ2V0RGVsYXkoZGVsYXlSZWYuY3VycmVudCwgJ29wZW4nLCBwb2ludGVyVHlwZVJlZi5jdXJyZW50KTtcbiAgICAgIGlmIChvcGVuRGVsYXkpIHtcbiAgICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghb3BlblJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQsICdob3ZlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgb3BlbkRlbGF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudCwgJ2hvdmVyJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uTW91c2VMZWF2ZShldmVudCkge1xuICAgICAgaWYgKGlzQ2xpY2tMaWtlT3BlbkV2ZW50KCkpIHJldHVybjtcbiAgICAgIHVuYmluZE1vdXNlTW92ZVJlZi5jdXJyZW50KCk7XG4gICAgICBjb25zdCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50cy5mbG9hdGluZyk7XG4gICAgICBjbGVhclRpbWVvdXQocmVzdFRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICBpZiAoaGFuZGxlQ2xvc2VSZWYuY3VycmVudCAmJiBkYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0KSB7XG4gICAgICAgIC8vIFByZXZlbnQgY2xlYXJpbmcgYG9uU2Nyb2xsTW91c2VMZWF2ZWAgdGltZW91dC5cbiAgICAgICAgaWYgKCFvcGVuKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlclJlZi5jdXJyZW50ID0gaGFuZGxlQ2xvc2VSZWYuY3VycmVudCh7XG4gICAgICAgICAgLi4uZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCxcbiAgICAgICAgICB0cmVlLFxuICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgeTogZXZlbnQuY2xpZW50WSxcbiAgICAgICAgICBvbkNsb3NlKCkge1xuICAgICAgICAgICAgY2xlYXJQb2ludGVyRXZlbnRzKCk7XG4gICAgICAgICAgICBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlcigpO1xuICAgICAgICAgICAgY2xvc2VXaXRoRGVsYXkoZXZlbnQsIHRydWUsICdzYWZlLXBvbHlnb24nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlclJlZi5jdXJyZW50O1xuICAgICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlcik7XG4gICAgICAgIHVuYmluZE1vdXNlTW92ZVJlZi5jdXJyZW50ID0gKCkgPT4ge1xuICAgICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBbGxvdyBpbnRlcmFjdGl2aXR5IHdpdGhvdXQgYHNhZmVQb2x5Z29uYCBvbiB0b3VjaCBkZXZpY2VzLiBXaXRoIGFcbiAgICAgIC8vIHBvaW50ZXIsIGEgc2hvcnQgY2xvc2UgZGVsYXkgaXMgYW4gYWx0ZXJuYXRpdmUsIHNvIGl0IHNob3VsZCB3b3JrXG4gICAgICAvLyBjb25zaXN0ZW50bHkuXG4gICAgICBjb25zdCBzaG91bGRDbG9zZSA9IHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPT09ICd0b3VjaCcgPyAhY29udGFpbnMoZWxlbWVudHMuZmxvYXRpbmcsIGV2ZW50LnJlbGF0ZWRUYXJnZXQpIDogdHJ1ZTtcbiAgICAgIGlmIChzaG91bGRDbG9zZSkge1xuICAgICAgICBjbG9zZVdpdGhEZWxheShldmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoZSBmbG9hdGluZyBlbGVtZW50IGNsb3NlcyBhZnRlciBzY3JvbGxpbmcgZXZlbiBpZiB0aGUgcG9pbnRlclxuICAgIC8vIGRpZCBub3QgbW92ZS5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvZGlzY3Vzc2lvbnMvMTY5MlxuICAgIGZ1bmN0aW9uIG9uU2Nyb2xsTW91c2VMZWF2ZShldmVudCkge1xuICAgICAgaWYgKGlzQ2xpY2tMaWtlT3BlbkV2ZW50KCkpIHJldHVybjtcbiAgICAgIGlmICghZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCkgcmV0dXJuO1xuICAgICAgaGFuZGxlQ2xvc2VSZWYuY3VycmVudCA9PSBudWxsIHx8IGhhbmRsZUNsb3NlUmVmLmN1cnJlbnQoe1xuICAgICAgICAuLi5kYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0LFxuICAgICAgICB0cmVlLFxuICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgICAgICBvbkNsb3NlKCkge1xuICAgICAgICAgIGNsZWFyUG9pbnRlckV2ZW50cygpO1xuICAgICAgICAgIGNsZWFudXBNb3VzZU1vdmVIYW5kbGVyKCk7XG4gICAgICAgICAgY2xvc2VXaXRoRGVsYXkoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KShldmVudCk7XG4gICAgfVxuICAgIGlmIChpc0VsZW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlKSkge1xuICAgICAgdmFyIF9lbGVtZW50cyRmbG9hdGluZztcbiAgICAgIGNvbnN0IHJlZiA9IGVsZW1lbnRzLmRvbVJlZmVyZW5jZTtcbiAgICAgIG9wZW4gJiYgcmVmLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblNjcm9sbE1vdXNlTGVhdmUpO1xuICAgICAgKF9lbGVtZW50cyRmbG9hdGluZyA9IGVsZW1lbnRzLmZsb2F0aW5nKSA9PSBudWxsIHx8IF9lbGVtZW50cyRmbG9hdGluZy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25TY3JvbGxNb3VzZUxlYXZlKTtcbiAgICAgIG1vdmUgJiYgcmVmLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VFbnRlciwge1xuICAgICAgICBvbmNlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJlZi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgb25Nb3VzZUVudGVyKTtcbiAgICAgIHJlZi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25Nb3VzZUxlYXZlKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHZhciBfZWxlbWVudHMkZmxvYXRpbmcyO1xuICAgICAgICBvcGVuICYmIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25TY3JvbGxNb3VzZUxlYXZlKTtcbiAgICAgICAgKF9lbGVtZW50cyRmbG9hdGluZzIgPSBlbGVtZW50cy5mbG9hdGluZykgPT0gbnVsbCB8fCBfZWxlbWVudHMkZmxvYXRpbmcyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblNjcm9sbE1vdXNlTGVhdmUpO1xuICAgICAgICBtb3ZlICYmIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlRW50ZXIpO1xuICAgICAgICByZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIG9uTW91c2VFbnRlcik7XG4gICAgICAgIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25Nb3VzZUxlYXZlKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbZWxlbWVudHMsIGVuYWJsZWQsIGNvbnRleHQsIG1vdXNlT25seSwgcmVzdE1zLCBtb3ZlLCBjbG9zZVdpdGhEZWxheSwgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIsIGNsZWFyUG9pbnRlckV2ZW50cywgb25PcGVuQ2hhbmdlLCBvcGVuLCBvcGVuUmVmLCB0cmVlLCBkZWxheVJlZiwgaGFuZGxlQ2xvc2VSZWYsIGRhdGFSZWZdKTtcblxuICAvLyBCbG9jayBwb2ludGVyLWV2ZW50cyBvZiBldmVyeSBlbGVtZW50IG90aGVyIHRoYW4gdGhlIHJlZmVyZW5jZSBhbmQgZmxvYXRpbmdcbiAgLy8gd2hpbGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXMgb3BlbiBhbmQgaGFzIGEgYGhhbmRsZUNsb3NlYCBoYW5kbGVyLiBBbHNvXG4gIC8vIGhhbmRsZXMgbmVzdGVkIGZsb2F0aW5nIGVsZW1lbnRzLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzE3MjJcbiAgaW5kZXgoKCkgPT4ge1xuICAgIHZhciBfaGFuZGxlQ2xvc2VSZWYkY3VycmU7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgaWYgKG9wZW4gJiYgKF9oYW5kbGVDbG9zZVJlZiRjdXJyZSA9IGhhbmRsZUNsb3NlUmVmLmN1cnJlbnQpICE9IG51bGwgJiYgX2hhbmRsZUNsb3NlUmVmJGN1cnJlLl9fb3B0aW9ucy5ibG9ja1BvaW50ZXJFdmVudHMgJiYgaXNIb3Zlck9wZW4oKSkge1xuICAgICAgY29uc3QgYm9keSA9IGdldERvY3VtZW50KGVsZW1lbnRzLmZsb2F0aW5nKS5ib2R5O1xuICAgICAgYm9keS5zZXRBdHRyaWJ1dGUoc2FmZVBvbHlnb25JZGVudGlmaWVyLCAnJyk7XG4gICAgICBib2R5LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICBwZXJmb3JtZWRQb2ludGVyRXZlbnRzTXV0YXRpb25SZWYuY3VycmVudCA9IHRydWU7XG4gICAgICBjb25zdCBmbG9hdGluZ0VsID0gZWxlbWVudHMuZmxvYXRpbmc7XG4gICAgICBpZiAoaXNFbGVtZW50KGVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgJiYgZmxvYXRpbmdFbCkge1xuICAgICAgICB2YXIgX3RyZWUkbm9kZXNSZWYkY3VycmVuO1xuICAgICAgICBjb25zdCByZWYgPSBlbGVtZW50cy5kb21SZWZlcmVuY2U7XG4gICAgICAgIGNvbnN0IHBhcmVudEZsb2F0aW5nID0gdHJlZSA9PSBudWxsIHx8IChfdHJlZSRub2Rlc1JlZiRjdXJyZW4gPSB0cmVlLm5vZGVzUmVmLmN1cnJlbnQuZmluZChub2RlID0+IG5vZGUuaWQgPT09IHBhcmVudElkKSkgPT0gbnVsbCB8fCAoX3RyZWUkbm9kZXNSZWYkY3VycmVuID0gX3RyZWUkbm9kZXNSZWYkY3VycmVuLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfdHJlZSRub2Rlc1JlZiRjdXJyZW4uZWxlbWVudHMuZmxvYXRpbmc7XG4gICAgICAgIGlmIChwYXJlbnRGbG9hdGluZykge1xuICAgICAgICAgIHBhcmVudEZsb2F0aW5nLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgfVxuICAgICAgICByZWYuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgZmxvYXRpbmdFbC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIHJlZi5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgICAgZmxvYXRpbmdFbC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgb3BlbiwgcGFyZW50SWQsIGVsZW1lbnRzLCB0cmVlLCBoYW5kbGVDbG9zZVJlZiwgaXNIb3Zlck9wZW5dKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghb3Blbikge1xuICAgICAgcG9pbnRlclR5cGVSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIGNsZWFudXBNb3VzZU1vdmVIYW5kbGVyKCk7XG4gICAgICBjbGVhclBvaW50ZXJFdmVudHMoKTtcbiAgICB9XG4gIH0sIFtvcGVuLCBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlciwgY2xlYXJQb2ludGVyRXZlbnRzXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNsZWFudXBNb3VzZU1vdmVIYW5kbGVyKCk7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIGNsZWFyVGltZW91dChyZXN0VGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIGNsZWFyUG9pbnRlckV2ZW50cygpO1xuICAgIH07XG4gIH0sIFtlbmFibGVkLCBlbGVtZW50cy5kb21SZWZlcmVuY2UsIGNsZWFudXBNb3VzZU1vdmVIYW5kbGVyLCBjbGVhclBvaW50ZXJFdmVudHNdKTtcbiAgY29uc3QgcmVmZXJlbmNlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgZnVuY3Rpb24gc2V0UG9pbnRlclJlZihldmVudCkge1xuICAgICAgcG9pbnRlclR5cGVSZWYuY3VycmVudCA9IGV2ZW50LnBvaW50ZXJUeXBlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgb25Qb2ludGVyRG93bjogc2V0UG9pbnRlclJlZixcbiAgICAgIG9uUG9pbnRlckVudGVyOiBzZXRQb2ludGVyUmVmLFxuICAgICAgb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG5hdGl2ZUV2ZW50XG4gICAgICAgIH0gPSBldmVudDtcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKCkge1xuICAgICAgICAgIGlmICghYmxvY2tNb3VzZU1vdmVSZWYuY3VycmVudCAmJiAhb3BlblJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgbmF0aXZlRXZlbnQsICdob3ZlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobW91c2VPbmx5ICYmICFpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcGVuIHx8IHJlc3RNcyA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjbGVhclRpbWVvdXQocmVzdFRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICAgIGlmIChwb2ludGVyVHlwZVJlZi5jdXJyZW50ID09PSAndG91Y2gnKSB7XG4gICAgICAgICAgaGFuZGxlTW91c2VNb3ZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdFRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KGhhbmRsZU1vdXNlTW92ZSwgcmVzdE1zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0sIFttb3VzZU9ubHksIG9uT3BlbkNoYW5nZSwgb3Blbiwgb3BlblJlZiwgcmVzdE1zXSk7XG4gIGNvbnN0IGZsb2F0aW5nID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIG9uTW91c2VFbnRlcigpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIH0sXG4gICAgb25Nb3VzZUxlYXZlKGV2ZW50KSB7XG4gICAgICBjbG9zZVdpdGhEZWxheShldmVudC5uYXRpdmVFdmVudCwgZmFsc2UpO1xuICAgIH1cbiAgfSksIFtjbG9zZVdpdGhEZWxheV0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIHJlZmVyZW5jZSxcbiAgICBmbG9hdGluZ1xuICB9IDoge30sIFtlbmFibGVkLCByZWZlcmVuY2UsIGZsb2F0aW5nXSk7XG59XG5cbmNvbnN0IE5PT1AgPSAoKSA9PiB7fTtcbmNvbnN0IEZsb2F0aW5nRGVsYXlHcm91cENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGRlbGF5OiAwLFxuICBpbml0aWFsRGVsYXk6IDAsXG4gIHRpbWVvdXRNczogMCxcbiAgY3VycmVudElkOiBudWxsLFxuICBzZXRDdXJyZW50SWQ6IE5PT1AsXG4gIHNldFN0YXRlOiBOT09QLFxuICBpc0luc3RhbnRQaGFzZTogZmFsc2Vcbn0pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBVc2UgdGhlIHJldHVybiB2YWx1ZSBvZiBgdXNlRGVsYXlHcm91cCgpYCBpbnN0ZWFkLlxuICovXG5jb25zdCB1c2VEZWxheUdyb3VwQ29udGV4dCA9ICgpID0+IFJlYWN0LnVzZUNvbnRleHQoRmxvYXRpbmdEZWxheUdyb3VwQ29udGV4dCk7XG4vKipcbiAqIFByb3ZpZGVzIGNvbnRleHQgZm9yIGEgZ3JvdXAgb2YgZmxvYXRpbmcgZWxlbWVudHMgdGhhdCBzaG91bGQgc2hhcmUgYVxuICogYGRlbGF5YC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ0RlbGF5R3JvdXBcbiAqL1xuZnVuY3Rpb24gRmxvYXRpbmdEZWxheUdyb3VwKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBkZWxheSxcbiAgICB0aW1lb3V0TXMgPSAwXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSBSZWFjdC51c2VSZWR1Y2VyKChwcmV2LCBuZXh0KSA9PiAoe1xuICAgIC4uLnByZXYsXG4gICAgLi4ubmV4dFxuICB9KSwge1xuICAgIGRlbGF5LFxuICAgIHRpbWVvdXRNcyxcbiAgICBpbml0aWFsRGVsYXk6IGRlbGF5LFxuICAgIGN1cnJlbnRJZDogbnVsbCxcbiAgICBpc0luc3RhbnRQaGFzZTogZmFsc2VcbiAgfSk7XG4gIGNvbnN0IGluaXRpYWxDdXJyZW50SWRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IHNldEN1cnJlbnRJZCA9IFJlYWN0LnVzZUNhbGxiYWNrKGN1cnJlbnRJZCA9PiB7XG4gICAgc2V0U3RhdGUoe1xuICAgICAgY3VycmVudElkXG4gICAgfSk7XG4gIH0sIFtdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChzdGF0ZS5jdXJyZW50SWQpIHtcbiAgICAgIGlmIChpbml0aWFsQ3VycmVudElkUmVmLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgaW5pdGlhbEN1cnJlbnRJZFJlZi5jdXJyZW50ID0gc3RhdGUuY3VycmVudElkO1xuICAgICAgfSBlbHNlIGlmICghc3RhdGUuaXNJbnN0YW50UGhhc2UpIHtcbiAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgIGlzSW5zdGFudFBoYXNlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhdGUuaXNJbnN0YW50UGhhc2UpIHtcbiAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgIGlzSW5zdGFudFBoYXNlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGluaXRpYWxDdXJyZW50SWRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9LCBbc3RhdGUuY3VycmVudElkLCBzdGF0ZS5pc0luc3RhbnRQaGFzZV0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmxvYXRpbmdEZWxheUdyb3VwQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNldFN0YXRlLFxuICAgICAgc2V0Q3VycmVudElkXG4gICAgfSksIFtzdGF0ZSwgc2V0Q3VycmVudElkXSlcbiAgfSwgY2hpbGRyZW4pO1xufVxuLyoqXG4gKiBFbmFibGVzIGdyb3VwaW5nIHdoZW4gY2FsbGVkIGluc2lkZSBhIGNvbXBvbmVudCB0aGF0J3MgYSBjaGlsZCBvZiBhXG4gKiBgRmxvYXRpbmdEZWxheUdyb3VwYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ0RlbGF5R3JvdXBcbiAqL1xuZnVuY3Rpb24gdXNlRGVsYXlHcm91cChjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGZsb2F0aW5nSWRcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBpZDogb3B0aW9uSWRcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGlkID0gb3B0aW9uSWQgIT0gbnVsbCA/IG9wdGlvbklkIDogZmxvYXRpbmdJZDtcbiAgY29uc3QgZ3JvdXBDb250ZXh0ID0gdXNlRGVsYXlHcm91cENvbnRleHQoKTtcbiAgY29uc3Qge1xuICAgIGN1cnJlbnRJZCxcbiAgICBzZXRDdXJyZW50SWQsXG4gICAgaW5pdGlhbERlbGF5LFxuICAgIHNldFN0YXRlLFxuICAgIHRpbWVvdXRNc1xuICB9ID0gZ3JvdXBDb250ZXh0O1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFjdXJyZW50SWQpIHJldHVybjtcbiAgICBzZXRTdGF0ZSh7XG4gICAgICBkZWxheToge1xuICAgICAgICBvcGVuOiAxLFxuICAgICAgICBjbG9zZTogZ2V0RGVsYXkoaW5pdGlhbERlbGF5LCAnY2xvc2UnKVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChjdXJyZW50SWQgIT09IGlkKSB7XG4gICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UpO1xuICAgIH1cbiAgfSwgW2lkLCBvbk9wZW5DaGFuZ2UsIHNldFN0YXRlLCBjdXJyZW50SWQsIGluaXRpYWxEZWxheV0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgZnVuY3Rpb24gdW5zZXQoKSB7XG4gICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UpO1xuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBkZWxheTogaW5pdGlhbERlbGF5LFxuICAgICAgICBjdXJyZW50SWQ6IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRJZCkgcmV0dXJuO1xuICAgIGlmICghb3BlbiAmJiBjdXJyZW50SWQgPT09IGlkKSB7XG4gICAgICBpZiAodGltZW91dE1zKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCh1bnNldCwgdGltZW91dE1zKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB1bnNldCgpO1xuICAgIH1cbiAgfSwgW29wZW4sIHNldFN0YXRlLCBjdXJyZW50SWQsIGlkLCBvbk9wZW5DaGFuZ2UsIGluaXRpYWxEZWxheSwgdGltZW91dE1zXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoc2V0Q3VycmVudElkID09PSBOT09QIHx8ICFvcGVuKSByZXR1cm47XG4gICAgc2V0Q3VycmVudElkKGlkKTtcbiAgfSwgW29wZW4sIHNldEN1cnJlbnRJZCwgaWRdKTtcbiAgcmV0dXJuIGdyb3VwQ29udGV4dDtcbn1cblxuZnVuY3Rpb24gZ2V0QW5jZXN0b3JzKG5vZGVzLCBpZCkge1xuICB2YXIgX25vZGVzJGZpbmQ7XG4gIGxldCBhbGxBbmNlc3RvcnMgPSBbXTtcbiAgbGV0IGN1cnJlbnRQYXJlbnRJZCA9IChfbm9kZXMkZmluZCA9IG5vZGVzLmZpbmQobm9kZSA9PiBub2RlLmlkID09PSBpZCkpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZXMkZmluZC5wYXJlbnRJZDtcbiAgd2hpbGUgKGN1cnJlbnRQYXJlbnRJZCkge1xuICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT09IGN1cnJlbnRQYXJlbnRJZCk7XG4gICAgY3VycmVudFBhcmVudElkID0gY3VycmVudE5vZGUgPT0gbnVsbCA/IHZvaWQgMCA6IGN1cnJlbnROb2RlLnBhcmVudElkO1xuICAgIGlmIChjdXJyZW50Tm9kZSkge1xuICAgICAgYWxsQW5jZXN0b3JzID0gYWxsQW5jZXN0b3JzLmNvbmNhdChjdXJyZW50Tm9kZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBhbGxBbmNlc3RvcnM7XG59XG5cbmZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGVzLCBpZCkge1xuICBsZXQgYWxsQ2hpbGRyZW4gPSBub2Rlcy5maWx0ZXIobm9kZSA9PiB7XG4gICAgdmFyIF9ub2RlJGNvbnRleHQ7XG4gICAgcmV0dXJuIG5vZGUucGFyZW50SWQgPT09IGlkICYmICgoX25vZGUkY29udGV4dCA9IG5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJGNvbnRleHQub3Blbik7XG4gIH0pO1xuICBsZXQgY3VycmVudENoaWxkcmVuID0gYWxsQ2hpbGRyZW47XG4gIHdoaWxlIChjdXJyZW50Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgY3VycmVudENoaWxkcmVuID0gbm9kZXMuZmlsdGVyKG5vZGUgPT4ge1xuICAgICAgdmFyIF9jdXJyZW50Q2hpbGRyZW47XG4gICAgICByZXR1cm4gKF9jdXJyZW50Q2hpbGRyZW4gPSBjdXJyZW50Q2hpbGRyZW4pID09IG51bGwgPyB2b2lkIDAgOiBfY3VycmVudENoaWxkcmVuLnNvbWUobiA9PiB7XG4gICAgICAgIHZhciBfbm9kZSRjb250ZXh0MjtcbiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50SWQgPT09IG4uaWQgJiYgKChfbm9kZSRjb250ZXh0MiA9IG5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJGNvbnRleHQyLm9wZW4pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgYWxsQ2hpbGRyZW4gPSBhbGxDaGlsZHJlbi5jb25jYXQoY3VycmVudENoaWxkcmVuKTtcbiAgfVxuICByZXR1cm4gYWxsQ2hpbGRyZW47XG59XG5mdW5jdGlvbiBnZXREZWVwZXN0Tm9kZShub2RlcywgaWQpIHtcbiAgbGV0IGRlZXBlc3ROb2RlSWQ7XG4gIGxldCBtYXhEZXB0aCA9IC0xO1xuICBmdW5jdGlvbiBmaW5kRGVlcGVzdChub2RlSWQsIGRlcHRoKSB7XG4gICAgaWYgKGRlcHRoID4gbWF4RGVwdGgpIHtcbiAgICAgIGRlZXBlc3ROb2RlSWQgPSBub2RlSWQ7XG4gICAgICBtYXhEZXB0aCA9IGRlcHRoO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKG5vZGVzLCBub2RlSWQpO1xuICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgZmluZERlZXBlc3QoY2hpbGQuaWQsIGRlcHRoICsgMSk7XG4gICAgfSk7XG4gIH1cbiAgZmluZERlZXBlc3QoaWQsIDApO1xuICByZXR1cm4gbm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT09IGRlZXBlc3ROb2RlSWQpO1xufVxuXG4vLyBNb2RpZmllZCB0byBhZGQgY29uZGl0aW9uYWwgYGFyaWEtaGlkZGVuYCBzdXBwb3J0OlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS9hcmlhLWhpZGRlbi9ibG9iLzkyMjBjOGY0YTRmZDM1ZjYzYmVlNTUxMGE5ZjQxYTM3MjY0MzgyZDQvc3JjL2luZGV4LnRzXG5sZXQgY291bnRlck1hcCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xubGV0IHVuY29udHJvbGxlZEVsZW1lbnRzU2V0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG5sZXQgbWFya2VyTWFwID0ge307XG5sZXQgbG9ja0NvdW50ID0gMDtcbmNvbnN0IHN1cHBvcnRzSW5lcnQgPSAoKSA9PiB0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmICdpbmVydCcgaW4gSFRNTEVsZW1lbnQucHJvdG90eXBlO1xuY29uc3QgdW53cmFwSG9zdCA9IG5vZGUgPT4gbm9kZSAmJiAobm9kZS5ob3N0IHx8IHVud3JhcEhvc3Qobm9kZS5wYXJlbnROb2RlKSk7XG5jb25zdCBjb3JyZWN0RWxlbWVudHMgPSAocGFyZW50LCB0YXJnZXRzKSA9PiB0YXJnZXRzLm1hcCh0YXJnZXQgPT4ge1xuICBpZiAocGFyZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGNvbnN0IGNvcnJlY3RlZFRhcmdldCA9IHVud3JhcEhvc3QodGFyZ2V0KTtcbiAgaWYgKHBhcmVudC5jb250YWlucyhjb3JyZWN0ZWRUYXJnZXQpKSB7XG4gICAgcmV0dXJuIGNvcnJlY3RlZFRhcmdldDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn0pLmZpbHRlcih4ID0+IHggIT0gbnVsbCk7XG5mdW5jdGlvbiBhcHBseUF0dHJpYnV0ZVRvT3RoZXJzKHVuY29ycmVjdGVkQXZvaWRFbGVtZW50cywgYm9keSwgYXJpYUhpZGRlbiwgaW5lcnQpIHtcbiAgY29uc3QgbWFya2VyTmFtZSA9ICdkYXRhLWZsb2F0aW5nLXVpLWluZXJ0JztcbiAgY29uc3QgY29udHJvbEF0dHJpYnV0ZSA9IGluZXJ0ID8gJ2luZXJ0JyA6IGFyaWFIaWRkZW4gPyAnYXJpYS1oaWRkZW4nIDogbnVsbDtcbiAgY29uc3QgYXZvaWRFbGVtZW50cyA9IGNvcnJlY3RFbGVtZW50cyhib2R5LCB1bmNvcnJlY3RlZEF2b2lkRWxlbWVudHMpO1xuICBjb25zdCBlbGVtZW50c1RvS2VlcCA9IG5ldyBTZXQoKTtcbiAgY29uc3QgZWxlbWVudHNUb1N0b3AgPSBuZXcgU2V0KGF2b2lkRWxlbWVudHMpO1xuICBjb25zdCBoaWRkZW5FbGVtZW50cyA9IFtdO1xuICBpZiAoIW1hcmtlck1hcFttYXJrZXJOYW1lXSkge1xuICAgIG1hcmtlck1hcFttYXJrZXJOYW1lXSA9IG5ldyBXZWFrTWFwKCk7XG4gIH1cbiAgY29uc3QgbWFya2VyQ291bnRlciA9IG1hcmtlck1hcFttYXJrZXJOYW1lXTtcbiAgYXZvaWRFbGVtZW50cy5mb3JFYWNoKGtlZXApO1xuICBkZWVwKGJvZHkpO1xuICBlbGVtZW50c1RvS2VlcC5jbGVhcigpO1xuICBmdW5jdGlvbiBrZWVwKGVsKSB7XG4gICAgaWYgKCFlbCB8fCBlbGVtZW50c1RvS2VlcC5oYXMoZWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnRzVG9LZWVwLmFkZChlbCk7XG4gICAgZWwucGFyZW50Tm9kZSAmJiBrZWVwKGVsLnBhcmVudE5vZGUpO1xuICB9XG4gIGZ1bmN0aW9uIGRlZXAocGFyZW50KSB7XG4gICAgaWYgKCFwYXJlbnQgfHwgZWxlbWVudHNUb1N0b3AuaGFzKHBhcmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgW10uZm9yRWFjaC5jYWxsKHBhcmVudC5jaGlsZHJlbiwgbm9kZSA9PiB7XG4gICAgICBpZiAoZ2V0Tm9kZU5hbWUobm9kZSkgPT09ICdzY3JpcHQnKSByZXR1cm47XG4gICAgICBpZiAoZWxlbWVudHNUb0tlZXAuaGFzKG5vZGUpKSB7XG4gICAgICAgIGRlZXAobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhdHRyID0gY29udHJvbEF0dHJpYnV0ZSA/IG5vZGUuZ2V0QXR0cmlidXRlKGNvbnRyb2xBdHRyaWJ1dGUpIDogbnVsbDtcbiAgICAgICAgY29uc3QgYWxyZWFkeUhpZGRlbiA9IGF0dHIgIT09IG51bGwgJiYgYXR0ciAhPT0gJ2ZhbHNlJztcbiAgICAgICAgY29uc3QgY291bnRlclZhbHVlID0gKGNvdW50ZXJNYXAuZ2V0KG5vZGUpIHx8IDApICsgMTtcbiAgICAgICAgY29uc3QgbWFya2VyVmFsdWUgPSAobWFya2VyQ291bnRlci5nZXQobm9kZSkgfHwgMCkgKyAxO1xuICAgICAgICBjb3VudGVyTWFwLnNldChub2RlLCBjb3VudGVyVmFsdWUpO1xuICAgICAgICBtYXJrZXJDb3VudGVyLnNldChub2RlLCBtYXJrZXJWYWx1ZSk7XG4gICAgICAgIGhpZGRlbkVsZW1lbnRzLnB1c2gobm9kZSk7XG4gICAgICAgIGlmIChjb3VudGVyVmFsdWUgPT09IDEgJiYgYWxyZWFkeUhpZGRlbikge1xuICAgICAgICAgIHVuY29udHJvbGxlZEVsZW1lbnRzU2V0LmFkZChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFya2VyVmFsdWUgPT09IDEpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShtYXJrZXJOYW1lLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhbHJlYWR5SGlkZGVuICYmIGNvbnRyb2xBdHRyaWJ1dGUpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShjb250cm9sQXR0cmlidXRlLCAndHJ1ZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgbG9ja0NvdW50Kys7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaGlkZGVuRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IGNvdW50ZXJWYWx1ZSA9IChjb3VudGVyTWFwLmdldChlbGVtZW50KSB8fCAwKSAtIDE7XG4gICAgICBjb25zdCBtYXJrZXJWYWx1ZSA9IChtYXJrZXJDb3VudGVyLmdldChlbGVtZW50KSB8fCAwKSAtIDE7XG4gICAgICBjb3VudGVyTWFwLnNldChlbGVtZW50LCBjb3VudGVyVmFsdWUpO1xuICAgICAgbWFya2VyQ291bnRlci5zZXQoZWxlbWVudCwgbWFya2VyVmFsdWUpO1xuICAgICAgaWYgKCFjb3VudGVyVmFsdWUpIHtcbiAgICAgICAgaWYgKCF1bmNvbnRyb2xsZWRFbGVtZW50c1NldC5oYXMoZWxlbWVudCkgJiYgY29udHJvbEF0dHJpYnV0ZSkge1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGNvbnRyb2xBdHRyaWJ1dGUpO1xuICAgICAgICB9XG4gICAgICAgIHVuY29udHJvbGxlZEVsZW1lbnRzU2V0LmRlbGV0ZShlbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGlmICghbWFya2VyVmFsdWUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobWFya2VyTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbG9ja0NvdW50LS07XG4gICAgaWYgKCFsb2NrQ291bnQpIHtcbiAgICAgIGNvdW50ZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgY291bnRlck1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICB1bmNvbnRyb2xsZWRFbGVtZW50c1NldCA9IG5ldyBXZWFrU2V0KCk7XG4gICAgICBtYXJrZXJNYXAgPSB7fTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBtYXJrT3RoZXJzKGF2b2lkRWxlbWVudHMsIGFyaWFIaWRkZW4sIGluZXJ0KSB7XG4gIGlmIChhcmlhSGlkZGVuID09PSB2b2lkIDApIHtcbiAgICBhcmlhSGlkZGVuID0gZmFsc2U7XG4gIH1cbiAgaWYgKGluZXJ0ID09PSB2b2lkIDApIHtcbiAgICBpbmVydCA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IGJvZHkgPSBnZXREb2N1bWVudChhdm9pZEVsZW1lbnRzWzBdKS5ib2R5O1xuICByZXR1cm4gYXBwbHlBdHRyaWJ1dGVUb090aGVycyhhdm9pZEVsZW1lbnRzLmNvbmNhdChBcnJheS5mcm9tKGJvZHkucXVlcnlTZWxlY3RvckFsbCgnW2FyaWEtbGl2ZV0nKSkpLCBib2R5LCBhcmlhSGlkZGVuLCBpbmVydCk7XG59XG5cbmNvbnN0IGdldFRhYmJhYmxlT3B0aW9ucyA9ICgpID0+ICh7XG4gIGdldFNoYWRvd1Jvb3Q6IHRydWUsXG4gIGRpc3BsYXlDaGVjazpcbiAgLy8gSlNET00gZG9lcyBub3Qgc3VwcG9ydCB0aGUgYHRhYmJhYmxlYCBsaWJyYXJ5LiBUbyBzb2x2ZSB0aGlzIHdlIGNhblxuICAvLyBjaGVjayBpZiBgUmVzaXplT2JzZXJ2ZXJgIGlzIGEgcmVhbCBmdW5jdGlvbiAobm90IHBvbHlmaWxsZWQpLCB3aGljaFxuICAvLyBkZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIEpTRE9NLWxpa2UuXG4gIHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBSZXNpemVPYnNlcnZlci50b1N0cmluZygpLmluY2x1ZGVzKCdbbmF0aXZlIGNvZGVdJykgPyAnZnVsbCcgOiAnbm9uZSdcbn0pO1xuZnVuY3Rpb24gZ2V0VGFiYmFibGVJbihjb250YWluZXIsIGRpcmVjdGlvbikge1xuICBjb25zdCBhbGxUYWJiYWJsZSA9IHRhYmJhYmxlKGNvbnRhaW5lciwgZ2V0VGFiYmFibGVPcHRpb25zKCkpO1xuICBpZiAoZGlyZWN0aW9uID09PSAncHJldicpIHtcbiAgICBhbGxUYWJiYWJsZS5yZXZlcnNlKCk7XG4gIH1cbiAgY29uc3QgYWN0aXZlSW5kZXggPSBhbGxUYWJiYWJsZS5pbmRleE9mKGFjdGl2ZUVsZW1lbnQoZ2V0RG9jdW1lbnQoY29udGFpbmVyKSkpO1xuICBjb25zdCBuZXh0VGFiYmFibGVFbGVtZW50cyA9IGFsbFRhYmJhYmxlLnNsaWNlKGFjdGl2ZUluZGV4ICsgMSk7XG4gIHJldHVybiBuZXh0VGFiYmFibGVFbGVtZW50c1swXTtcbn1cbmZ1bmN0aW9uIGdldE5leHRUYWJiYWJsZSgpIHtcbiAgcmV0dXJuIGdldFRhYmJhYmxlSW4oZG9jdW1lbnQuYm9keSwgJ25leHQnKTtcbn1cbmZ1bmN0aW9uIGdldFByZXZpb3VzVGFiYmFibGUoKSB7XG4gIHJldHVybiBnZXRUYWJiYWJsZUluKGRvY3VtZW50LmJvZHksICdwcmV2Jyk7XG59XG5mdW5jdGlvbiBpc091dHNpZGVFdmVudChldmVudCwgY29udGFpbmVyKSB7XG4gIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIgfHwgZXZlbnQuY3VycmVudFRhcmdldDtcbiAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gIHJldHVybiAhcmVsYXRlZFRhcmdldCB8fCAhY29udGFpbnMoY29udGFpbmVyRWxlbWVudCwgcmVsYXRlZFRhcmdldCk7XG59XG5mdW5jdGlvbiBkaXNhYmxlRm9jdXNJbnNpZGUoY29udGFpbmVyKSB7XG4gIGNvbnN0IHRhYmJhYmxlRWxlbWVudHMgPSB0YWJiYWJsZShjb250YWluZXIsIGdldFRhYmJhYmxlT3B0aW9ucygpKTtcbiAgdGFiYmFibGVFbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGVsZW1lbnQuZGF0YXNldC50YWJpbmRleCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpIHx8ICcnO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGVuYWJsZUZvY3VzSW5zaWRlKGNvbnRhaW5lcikge1xuICBjb25zdCBlbGVtZW50cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS10YWJpbmRleF0nKTtcbiAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCB0YWJpbmRleCA9IGVsZW1lbnQuZGF0YXNldC50YWJpbmRleDtcbiAgICBkZWxldGUgZWxlbWVudC5kYXRhc2V0LnRhYmluZGV4O1xuICAgIGlmICh0YWJpbmRleCkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgdGFiaW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0Q2xvc2VzdFRhYmJhYmxlRWxlbWVudCh0YWJiYWJsZUVsZW1lbnRzLCBlbGVtZW50LCBmbG9hdGluZykge1xuICBjb25zdCBlbGVtZW50SW5kZXggPSB0YWJiYWJsZUVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7XG4gIGZ1bmN0aW9uIHRyYXZlcnNlVGFiYmFibGVFbGVtZW50cyhuZXh0KSB7XG4gICAgY29uc3QgYXR0ciA9IGNyZWF0ZUF0dHJpYnV0ZSgnZm9jdXMtZ3VhcmQnKTtcbiAgICBsZXQgaW5kZXggPSBlbGVtZW50SW5kZXggKyAobmV4dCA/IDEgOiAwKTtcbiAgICBsZXQgY3VycmVudEVsZW1lbnQgPSB0YWJiYWJsZUVsZW1lbnRzW2luZGV4XTtcbiAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQgJiYgKCFjdXJyZW50RWxlbWVudC5pc0Nvbm5lY3RlZCB8fCBjdXJyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cikgfHwgY29udGFpbnMoZmxvYXRpbmcsIGN1cnJlbnRFbGVtZW50KSkpIHtcbiAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRleC0tO1xuICAgICAgfVxuICAgICAgY3VycmVudEVsZW1lbnQgPSB0YWJiYWJsZUVsZW1lbnRzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xuICB9XG5cbiAgLy8gRmlyc3QsIHRyeSB0byBmaW5kIHRoZSBuZXh0IHRhYmJhYmxlIGVsZW1lbnRcbiAgY29uc3QgbmV4dCA9IHRyYXZlcnNlVGFiYmFibGVFbGVtZW50cyh0cnVlKTtcbiAgaWYgKG5leHQpIHtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIC8vIElmIHdlIGNhbid0IGZpbmQgYSBuZXh0IHRhYmJhYmxlIGVsZW1lbnQsIHRyeSB0byBmaW5kIHRoZSBwcmV2aW91cyBvbmVcbiAgcmV0dXJuIHRyYXZlcnNlVGFiYmFibGVFbGVtZW50cyhmYWxzZSk7XG59XG5cbi8vIFNlZSBEaWVnbyBIYXoncyBTYW5kYm94IGZvciBtYWtpbmcgdGhpcyBsb2dpYyB3b3JrIHdlbGwgb24gU2FmYXJpL2lPUzpcbi8vIGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy90YWJiYWJsZS1wb3J0YWwtZjR0bmc/ZmlsZT0vc3JjL0ZvY3VzVHJhcC50c3hcblxuY29uc3QgSElEREVOX1NUWUxFUyA9IHtcbiAgYm9yZGVyOiAwLFxuICBjbGlwOiAncmVjdCgwIDAgMCAwKScsXG4gIGhlaWdodDogJzFweCcsXG4gIG1hcmdpbjogJy0xcHgnLFxuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIHBhZGRpbmc6IDAsXG4gIHBvc2l0aW9uOiAnZml4ZWQnLFxuICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgd2lkdGg6ICcxcHgnLFxuICB0b3A6IDAsXG4gIGxlZnQ6IDBcbn07XG5sZXQgdGltZW91dElkO1xuZnVuY3Rpb24gc2V0QWN0aXZlRWxlbWVudE9uVGFiKGV2ZW50KSB7XG4gIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XG4gICAgZXZlbnQudGFyZ2V0O1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICB9XG59XG5jb25zdCBGb2N1c0d1YXJkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRm9jdXNHdWFyZChwcm9wcywgcmVmKSB7XG4gIGNvbnN0IFtyb2xlLCBzZXRSb2xlXSA9IFJlYWN0LnVzZVN0YXRlKCk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoaXNTYWZhcmkoKSkge1xuICAgICAgLy8gVW5saWtlIG90aGVyIHNjcmVlbiByZWFkZXJzIHN1Y2ggYXMgTlZEQSBhbmQgSkFXUywgdGhlIHZpcnR1YWwgY3Vyc29yXG4gICAgICAvLyBvbiBWb2ljZU92ZXIgZG9lcyB0cmlnZ2VyIHRoZSBvbkZvY3VzIGV2ZW50LCBzbyB3ZSBjYW4gdXNlIHRoZSBmb2N1c1xuICAgICAgLy8gdHJhcCBlbGVtZW50LiBPbiBTYWZhcmksIG9ubHkgYnV0dG9ucyB0cmlnZ2VyIHRoZSBvbkZvY3VzIGV2ZW50LlxuICAgICAgLy8gTkI6IFwiZ3JvdXBcIiByb2xlIGluIHRoZSBTYW5kYm94IG5vIGxvbmdlciBhcHBlYXJzIHRvIHdvcmssIG11c3QgYmUgYVxuICAgICAgLy8gYnV0dG9uIHJvbGUuXG4gICAgICBzZXRSb2xlKCdidXR0b24nKTtcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHNldEFjdGl2ZUVsZW1lbnRPblRhYik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBzZXRBY3RpdmVFbGVtZW50T25UYWIpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgY29uc3QgcmVzdFByb3BzID0ge1xuICAgIHJlZixcbiAgICB0YWJJbmRleDogMCxcbiAgICAvLyBSb2xlIGlzIG9ubHkgZm9yIFZvaWNlT3ZlclxuICAgIHJvbGUsXG4gICAgJ2FyaWEtaGlkZGVuJzogcm9sZSA/IHVuZGVmaW5lZCA6IHRydWUsXG4gICAgW2NyZWF0ZUF0dHJpYnV0ZSgnZm9jdXMtZ3VhcmQnKV06ICcnLFxuICAgIHN0eWxlOiBISURERU5fU1RZTEVTXG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgX2V4dGVuZHMoe30sIHByb3BzLCByZXN0UHJvcHMpKTtcbn0pO1xuXG5jb25zdCBQb3J0YWxDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5jb25zdCBhdHRyID0gLyojX19QVVJFX18qL2NyZWF0ZUF0dHJpYnV0ZSgncG9ydGFsJyk7XG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ1BvcnRhbCN1c2VmbG9hdGluZ3BvcnRhbG5vZGVcbiAqL1xuZnVuY3Rpb24gdXNlRmxvYXRpbmdQb3J0YWxOb2RlKHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgaWQsXG4gICAgcm9vdFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHVuaXF1ZUlkID0gdXNlSWQoKTtcbiAgY29uc3QgcG9ydGFsQ29udGV4dCA9IHVzZVBvcnRhbENvbnRleHQoKTtcbiAgY29uc3QgW3BvcnRhbE5vZGUsIHNldFBvcnRhbE5vZGVdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IHBvcnRhbE5vZGVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGluZGV4KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcG9ydGFsTm9kZSA9PSBudWxsIHx8IHBvcnRhbE5vZGUucmVtb3ZlKCk7XG4gICAgICAvLyBBbGxvdyB0aGUgc3Vic2VxdWVudCBsYXlvdXQgZWZmZWN0cyB0byBjcmVhdGUgYSBuZXcgbm9kZSBvbiB1cGRhdGVzLlxuICAgICAgLy8gVGhlIHBvcnRhbCBub2RlIHdpbGwgc3RpbGwgYmUgY2xlYW5lZCB1cCBvbiB1bm1vdW50LlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yNDU0XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHBvcnRhbE5vZGVSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICB9KTtcbiAgICB9O1xuICB9LCBbcG9ydGFsTm9kZV0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHVuaXF1ZUlkIHRvIGJlIGdlbmVyYXRlZCBiZWZvcmUgY3JlYXRpbmcgdGhlIHBvcnRhbCBub2RlIGluXG4gICAgLy8gUmVhY3QgPDE4ICh1c2luZyBgdXNlRmxvYXRpbmdJZGAgaW5zdGVhZCBvZiB0aGUgbmF0aXZlIGB1c2VJZGApLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMjc3OFxuICAgIGlmICghdW5pcXVlSWQpIHJldHVybjtcbiAgICBpZiAocG9ydGFsTm9kZVJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgY29uc3QgZXhpc3RpbmdJZFJvb3QgPSBpZCA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSA6IG51bGw7XG4gICAgaWYgKCFleGlzdGluZ0lkUm9vdCkgcmV0dXJuO1xuICAgIGNvbnN0IHN1YlJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzdWJSb290LmlkID0gdW5pcXVlSWQ7XG4gICAgc3ViUm9vdC5zZXRBdHRyaWJ1dGUoYXR0ciwgJycpO1xuICAgIGV4aXN0aW5nSWRSb290LmFwcGVuZENoaWxkKHN1YlJvb3QpO1xuICAgIHBvcnRhbE5vZGVSZWYuY3VycmVudCA9IHN1YlJvb3Q7XG4gICAgc2V0UG9ydGFsTm9kZShzdWJSb290KTtcbiAgfSwgW2lkLCB1bmlxdWVJZF0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCF1bmlxdWVJZCkgcmV0dXJuO1xuICAgIGlmIChwb3J0YWxOb2RlUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBsZXQgY29udGFpbmVyID0gcm9vdCB8fCAocG9ydGFsQ29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlKTtcbiAgICBpZiAoY29udGFpbmVyICYmICFpc0VsZW1lbnQoY29udGFpbmVyKSkgY29udGFpbmVyID0gY29udGFpbmVyLmN1cnJlbnQ7XG4gICAgY29udGFpbmVyID0gY29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgbGV0IGlkV3JhcHBlciA9IG51bGw7XG4gICAgaWYgKGlkKSB7XG4gICAgICBpZFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGlkV3JhcHBlci5pZCA9IGlkO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGlkV3JhcHBlcik7XG4gICAgfVxuICAgIGNvbnN0IHN1YlJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzdWJSb290LmlkID0gdW5pcXVlSWQ7XG4gICAgc3ViUm9vdC5zZXRBdHRyaWJ1dGUoYXR0ciwgJycpO1xuICAgIGNvbnRhaW5lciA9IGlkV3JhcHBlciB8fCBjb250YWluZXI7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHN1YlJvb3QpO1xuICAgIHBvcnRhbE5vZGVSZWYuY3VycmVudCA9IHN1YlJvb3Q7XG4gICAgc2V0UG9ydGFsTm9kZShzdWJSb290KTtcbiAgfSwgW2lkLCByb290LCB1bmlxdWVJZCwgcG9ydGFsQ29udGV4dF0pO1xuICByZXR1cm4gcG9ydGFsTm9kZTtcbn1cbi8qKlxuICogUG9ydGFscyB0aGUgZmxvYXRpbmcgZWxlbWVudCBpbnRvIGEgZ2l2ZW4gY29udGFpbmVyIGVsZW1lbnQg4oCUIGJ5IGRlZmF1bHQsXG4gKiBvdXRzaWRlIG9mIHRoZSBhcHAgcm9vdCBhbmQgaW50byB0aGUgYm9keS5cbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBjYW4gYXBwZWFyIG91dHNpZGUgYW55XG4gKiBwb3RlbnRpYWwgcGFyZW50IGNvbnRhaW5lcnMgdGhhdCBjYXVzZSBjbGlwcGluZyAoc3VjaCBhcyBgb3ZlcmZsb3c6IGhpZGRlbmApLFxuICogd2hpbGUgcmV0YWluaW5nIGl0cyBsb2NhdGlvbiBpbiB0aGUgUmVhY3QgdHJlZS5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ1BvcnRhbFxuICovXG5mdW5jdGlvbiBGbG9hdGluZ1BvcnRhbChwcm9wcykge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgaWQsXG4gICAgcm9vdCA9IG51bGwsXG4gICAgcHJlc2VydmVUYWJPcmRlciA9IHRydWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCBwb3J0YWxOb2RlID0gdXNlRmxvYXRpbmdQb3J0YWxOb2RlKHtcbiAgICBpZCxcbiAgICByb290XG4gIH0pO1xuICBjb25zdCBbZm9jdXNNYW5hZ2VyU3RhdGUsIHNldEZvY3VzTWFuYWdlclN0YXRlXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBiZWZvcmVPdXRzaWRlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBhZnRlck91dHNpZGVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGJlZm9yZUluc2lkZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgYWZ0ZXJJbnNpZGVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IHNob3VsZFJlbmRlckd1YXJkcyA9XG4gIC8vIFRoZSBGb2N1c01hbmFnZXIgYW5kIHRoZXJlZm9yZSBmbG9hdGluZyBlbGVtZW50IGFyZSBjdXJyZW50bHkgb3Blbi9cbiAgLy8gcmVuZGVyZWQuXG4gICEhZm9jdXNNYW5hZ2VyU3RhdGUgJiZcbiAgLy8gR3VhcmRzIGFyZSBvbmx5IGZvciBub24tbW9kYWwgZm9jdXMgbWFuYWdlbWVudC5cbiAgIWZvY3VzTWFuYWdlclN0YXRlLm1vZGFsICYmXG4gIC8vIERvbid0IHJlbmRlciBpZiB1bm1vdW50IGlzIHRyYW5zaXRpb25pbmcuXG4gIGZvY3VzTWFuYWdlclN0YXRlLm9wZW4gJiYgcHJlc2VydmVUYWJPcmRlciAmJiAhIShyb290IHx8IHBvcnRhbE5vZGUpO1xuXG4gIC8vIGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy90YWJiYWJsZS1wb3J0YWwtZjR0bmc/ZmlsZT0vc3JjL1RhYmJhYmxlUG9ydGFsLnRzeFxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghcG9ydGFsTm9kZSB8fCAhcHJlc2VydmVUYWJPcmRlciB8fCBmb2N1c01hbmFnZXJTdGF0ZSAhPSBudWxsICYmIGZvY3VzTWFuYWdlclN0YXRlLm1vZGFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIGVsZW1lbnRzIGluc2lkZSB0aGUgcG9ydGFsIGVsZW1lbnQgYXJlIHRhYmJhYmxlIG9ubHkgd2hlbiB0aGVcbiAgICAvLyBwb3J0YWwgaGFzIGFscmVhZHkgYmVlbiBmb2N1c2VkLCBlaXRoZXIgYnkgdGFiYmluZyBpbnRvIGEgZm9jdXMgdHJhcFxuICAgIC8vIGVsZW1lbnQgb3V0c2lkZSBvciB1c2luZyB0aGUgbW91c2UuXG4gICAgZnVuY3Rpb24gb25Gb2N1cyhldmVudCkge1xuICAgICAgaWYgKHBvcnRhbE5vZGUgJiYgaXNPdXRzaWRlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgIGNvbnN0IGZvY3VzaW5nID0gZXZlbnQudHlwZSA9PT0gJ2ZvY3VzaW4nO1xuICAgICAgICBjb25zdCBtYW5hZ2VGb2N1cyA9IGZvY3VzaW5nID8gZW5hYmxlRm9jdXNJbnNpZGUgOiBkaXNhYmxlRm9jdXNJbnNpZGU7XG4gICAgICAgIG1hbmFnZUZvY3VzKHBvcnRhbE5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBMaXN0ZW4gdG8gdGhlIGV2ZW50IG9uIHRoZSBjYXB0dXJlIHBoYXNlIHNvIHRoZXkgcnVuIGJlZm9yZSB0aGUgZm9jdXNcbiAgICAvLyB0cmFwIGVsZW1lbnRzIG9uRm9jdXMgcHJvcCBpcyBjYWxsZWQuXG4gICAgcG9ydGFsTm9kZS5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgb25Gb2N1cywgdHJ1ZSk7XG4gICAgcG9ydGFsTm9kZS5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXMsIHRydWUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBwb3J0YWxOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvbkZvY3VzLCB0cnVlKTtcbiAgICAgIHBvcnRhbE5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBvbkZvY3VzLCB0cnVlKTtcbiAgICB9O1xuICB9LCBbcG9ydGFsTm9kZSwgcHJlc2VydmVUYWJPcmRlciwgZm9jdXNNYW5hZ2VyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGZvY3VzTWFuYWdlclN0YXRlLm1vZGFsXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3J0YWxDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgIHByZXNlcnZlVGFiT3JkZXIsXG4gICAgICBiZWZvcmVPdXRzaWRlUmVmLFxuICAgICAgYWZ0ZXJPdXRzaWRlUmVmLFxuICAgICAgYmVmb3JlSW5zaWRlUmVmLFxuICAgICAgYWZ0ZXJJbnNpZGVSZWYsXG4gICAgICBwb3J0YWxOb2RlLFxuICAgICAgc2V0Rm9jdXNNYW5hZ2VyU3RhdGVcbiAgICB9KSwgW3ByZXNlcnZlVGFiT3JkZXIsIHBvcnRhbE5vZGVdKVxuICB9LCBzaG91bGRSZW5kZXJHdWFyZHMgJiYgcG9ydGFsTm9kZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0d1YXJkLCB7XG4gICAgXCJkYXRhLXR5cGVcIjogXCJvdXRzaWRlXCIsXG4gICAgcmVmOiBiZWZvcmVPdXRzaWRlUmVmLFxuICAgIG9uRm9jdXM6IGV2ZW50ID0+IHtcbiAgICAgIGlmIChpc091dHNpZGVFdmVudChldmVudCwgcG9ydGFsTm9kZSkpIHtcbiAgICAgICAgdmFyIF9iZWZvcmVJbnNpZGVSZWYkY3VycjtcbiAgICAgICAgKF9iZWZvcmVJbnNpZGVSZWYkY3VyciA9IGJlZm9yZUluc2lkZVJlZi5jdXJyZW50KSA9PSBudWxsIHx8IF9iZWZvcmVJbnNpZGVSZWYkY3Vyci5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldlRhYmJhYmxlID0gZ2V0UHJldmlvdXNUYWJiYWJsZSgpIHx8IChmb2N1c01hbmFnZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogZm9jdXNNYW5hZ2VyU3RhdGUucmVmcy5kb21SZWZlcmVuY2UuY3VycmVudCk7XG4gICAgICAgIHByZXZUYWJiYWJsZSA9PSBudWxsIHx8IHByZXZUYWJiYWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfSksIHNob3VsZFJlbmRlckd1YXJkcyAmJiBwb3J0YWxOb2RlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgXCJhcmlhLW93bnNcIjogcG9ydGFsTm9kZS5pZCxcbiAgICBzdHlsZTogSElEREVOX1NUWUxFU1xuICB9KSwgcG9ydGFsTm9kZSAmJiAvKiNfX1BVUkVfXyovUmVhY3RET00uY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBwb3J0YWxOb2RlKSwgc2hvdWxkUmVuZGVyR3VhcmRzICYmIHBvcnRhbE5vZGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9jdXNHdWFyZCwge1xuICAgIFwiZGF0YS10eXBlXCI6IFwib3V0c2lkZVwiLFxuICAgIHJlZjogYWZ0ZXJPdXRzaWRlUmVmLFxuICAgIG9uRm9jdXM6IGV2ZW50ID0+IHtcbiAgICAgIGlmIChpc091dHNpZGVFdmVudChldmVudCwgcG9ydGFsTm9kZSkpIHtcbiAgICAgICAgdmFyIF9hZnRlckluc2lkZVJlZiRjdXJyZTtcbiAgICAgICAgKF9hZnRlckluc2lkZVJlZiRjdXJyZSA9IGFmdGVySW5zaWRlUmVmLmN1cnJlbnQpID09IG51bGwgfHwgX2FmdGVySW5zaWRlUmVmJGN1cnJlLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXh0VGFiYmFibGUgPSBnZXROZXh0VGFiYmFibGUoKSB8fCAoZm9jdXNNYW5hZ2VyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGZvY3VzTWFuYWdlclN0YXRlLnJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQpO1xuICAgICAgICBuZXh0VGFiYmFibGUgPT0gbnVsbCB8fCBuZXh0VGFiYmFibGUuZm9jdXMoKTtcbiAgICAgICAgKGZvY3VzTWFuYWdlclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBmb2N1c01hbmFnZXJTdGF0ZS5jbG9zZU9uRm9jdXNPdXQpICYmIChmb2N1c01hbmFnZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogZm9jdXNNYW5hZ2VyU3RhdGUub25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSkpO1xufVxuY29uc3QgdXNlUG9ydGFsQ29udGV4dCA9ICgpID0+IFJlYWN0LnVzZUNvbnRleHQoUG9ydGFsQ29udGV4dCk7XG5cbmNvbnN0IExJU1RfTElNSVQgPSAyMDtcbmxldCBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzID0gW107XG5mdW5jdGlvbiBhZGRQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoZWxlbWVudCkge1xuICBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzID0gcHJldmlvdXNseUZvY3VzZWRFbGVtZW50cy5maWx0ZXIoZWwgPT4gZWwuaXNDb25uZWN0ZWQpO1xuICBsZXQgdGFiYmFibGVFbCA9IGVsZW1lbnQ7XG4gIGlmICghdGFiYmFibGVFbCB8fCBnZXROb2RlTmFtZSh0YWJiYWJsZUVsKSA9PT0gJ2JvZHknKSByZXR1cm47XG4gIGlmICghaXNUYWJiYWJsZSh0YWJiYWJsZUVsLCBnZXRUYWJiYWJsZU9wdGlvbnMoKSkpIHtcbiAgICBjb25zdCB0YWJiYWJsZUNoaWxkID0gdGFiYmFibGUodGFiYmFibGVFbCwgZ2V0VGFiYmFibGVPcHRpb25zKCkpWzBdO1xuICAgIGlmICh0YWJiYWJsZUNoaWxkKSB7XG4gICAgICB0YWJiYWJsZUVsID0gdGFiYmFibGVDaGlsZDtcbiAgICB9XG4gIH1cbiAgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50cy5wdXNoKHRhYmJhYmxlRWwpO1xuICBpZiAocHJldmlvdXNseUZvY3VzZWRFbGVtZW50cy5sZW5ndGggPiBMSVNUX0xJTUlUKSB7XG4gICAgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50cyA9IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMuc2xpY2UoLUxJU1RfTElNSVQpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKSB7XG4gIHJldHVybiBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzLnNsaWNlKCkucmV2ZXJzZSgpLmZpbmQoZWwgPT4gZWwuaXNDb25uZWN0ZWQpO1xufVxuY29uc3QgVmlzdWFsbHlIaWRkZW5EaXNtaXNzID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gVmlzdWFsbHlIaWRkZW5EaXNtaXNzKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgcmVmOiByZWYsXG4gICAgdGFiSW5kZXg6IC0xLFxuICAgIHN0eWxlOiBISURERU5fU1RZTEVTXG4gIH0pKTtcbn0pO1xuLyoqXG4gKiBQcm92aWRlcyBmb2N1cyBtYW5hZ2VtZW50IGZvciB0aGUgZmxvYXRpbmcgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ0ZvY3VzTWFuYWdlclxuICovXG5mdW5jdGlvbiBGbG9hdGluZ0ZvY3VzTWFuYWdlcihwcm9wcykge1xuICBjb25zdCB7XG4gICAgY29udGV4dCxcbiAgICBjaGlsZHJlbixcbiAgICBkaXNhYmxlZCA9IGZhbHNlLFxuICAgIG9yZGVyID0gWydjb250ZW50J10sXG4gICAgZ3VhcmRzOiBfZ3VhcmRzID0gdHJ1ZSxcbiAgICBpbml0aWFsRm9jdXMgPSAwLFxuICAgIHJldHVybkZvY3VzID0gdHJ1ZSxcbiAgICByZXN0b3JlRm9jdXMgPSBmYWxzZSxcbiAgICBtb2RhbCA9IHRydWUsXG4gICAgdmlzdWFsbHlIaWRkZW5EaXNtaXNzID0gZmFsc2UsXG4gICAgY2xvc2VPbkZvY3VzT3V0ID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIHJlZnMsXG4gICAgbm9kZUlkLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBldmVudHMsXG4gICAgZGF0YVJlZixcbiAgICBmbG9hdGluZ0lkLFxuICAgIGVsZW1lbnRzOiB7XG4gICAgICBkb21SZWZlcmVuY2UsXG4gICAgICBmbG9hdGluZ1xuICAgIH1cbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGlnbm9yZUluaXRpYWxGb2N1cyA9IHR5cGVvZiBpbml0aWFsRm9jdXMgPT09ICdudW1iZXInICYmIGluaXRpYWxGb2N1cyA8IDA7XG4gIC8vIElmIHRoZSByZWZlcmVuY2UgaXMgYSBjb21ib2JveCBhbmQgaXMgdHlwZWFibGUgKGUuZy4gaW5wdXQvdGV4dGFyZWEpLFxuICAvLyB0aGVyZSBhcmUgZGlmZmVyZW50IGZvY3VzIHNlbWFudGljcy4gVGhlIGd1YXJkcyBzaG91bGQgbm90IGJlIHJlbmRlcmVkLCBidXRcbiAgLy8gYXJpYS1oaWRkZW4gc2hvdWxkIGJlIGFwcGxpZWQgdG8gYWxsIG5vZGVzIHN0aWxsLiBGdXJ0aGVyLCB0aGUgdmlzdWFsbHlcbiAgLy8gaGlkZGVuIGRpc21pc3MgYnV0dG9uIHNob3VsZCBvbmx5IGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBub3QgdGhlXG4gIC8vIHN0YXJ0LlxuICBjb25zdCBpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3ggPSBpc1R5cGVhYmxlQ29tYm9ib3goZG9tUmVmZXJlbmNlKSAmJiBpZ25vcmVJbml0aWFsRm9jdXM7XG5cbiAgLy8gRm9yY2UgdGhlIGd1YXJkcyB0byBiZSByZW5kZXJlZCBpZiB0aGUgYGluZXJ0YCBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZC5cbiAgY29uc3QgZ3VhcmRzID0gc3VwcG9ydHNJbmVydCgpID8gX2d1YXJkcyA6IHRydWU7XG4gIGNvbnN0IG9yZGVyUmVmID0gdXNlTGF0ZXN0UmVmKG9yZGVyKTtcbiAgY29uc3QgaW5pdGlhbEZvY3VzUmVmID0gdXNlTGF0ZXN0UmVmKGluaXRpYWxGb2N1cyk7XG4gIGNvbnN0IHJldHVybkZvY3VzUmVmID0gdXNlTGF0ZXN0UmVmKHJldHVybkZvY3VzKTtcbiAgY29uc3QgdHJlZSA9IHVzZUZsb2F0aW5nVHJlZSgpO1xuICBjb25zdCBwb3J0YWxDb250ZXh0ID0gdXNlUG9ydGFsQ29udGV4dCgpO1xuICBjb25zdCBzdGFydERpc21pc3NCdXR0b25SZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGVuZERpc21pc3NCdXR0b25SZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IHByZXZlbnRSZXR1cm5Gb2N1c1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGlzUG9pbnRlckRvd25SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCB0YWJiYWJsZUluZGV4UmVmID0gUmVhY3QudXNlUmVmKC0xKTtcbiAgY29uc3QgaXNJbnNpZGVQb3J0YWwgPSBwb3J0YWxDb250ZXh0ICE9IG51bGw7XG4gIGNvbnN0IGZpcnN0RWxlbWVudENoaWxkID0gZmxvYXRpbmcgPT0gbnVsbCA/IHZvaWQgMCA6IGZsb2F0aW5nLmZpcnN0RWxlbWVudENoaWxkO1xuICAvLyBJZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBpcyBhY3RpbmcgYXMgYSBwb3NpdGlvbmluZyB3cmFwcGVyIHJhdGhlciB0aGFuIHRoZVxuICAvLyBlbGVtZW50IHRoYXQgcmVjZWl2ZXMgYXJpYSBwcm9wcywgdXNlIGl0IGFzIHRoZSBmb2N1cyByb290IGluc3RlYWQuXG4gIGNvbnN0IGZsb2F0aW5nRm9jdXNOb2RlID0gKGZpcnN0RWxlbWVudENoaWxkID09IG51bGwgPyB2b2lkIDAgOiBmaXJzdEVsZW1lbnRDaGlsZC5pZCkgPT09IGZsb2F0aW5nSWQgPyBmaXJzdEVsZW1lbnRDaGlsZCA6IGZsb2F0aW5nO1xuICBjb25zdCBnZXRUYWJiYWJsZUNvbnRlbnQgPSB1c2VFZmZlY3RFdmVudChmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgaWYgKGNvbnRhaW5lciA9PT0gdm9pZCAwKSB7XG4gICAgICBjb250YWluZXIgPSBmbG9hdGluZ0ZvY3VzTm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lciA/IHRhYmJhYmxlKGNvbnRhaW5lciwgZ2V0VGFiYmFibGVPcHRpb25zKCkpIDogW107XG4gIH0pO1xuICBjb25zdCBnZXRUYWJiYWJsZUVsZW1lbnRzID0gdXNlRWZmZWN0RXZlbnQoY29udGFpbmVyID0+IHtcbiAgICBjb25zdCBjb250ZW50ID0gZ2V0VGFiYmFibGVDb250ZW50KGNvbnRhaW5lcik7XG4gICAgcmV0dXJuIG9yZGVyUmVmLmN1cnJlbnQubWFwKHR5cGUgPT4ge1xuICAgICAgaWYgKGRvbVJlZmVyZW5jZSAmJiB0eXBlID09PSAncmVmZXJlbmNlJykge1xuICAgICAgICByZXR1cm4gZG9tUmVmZXJlbmNlO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nRm9jdXNOb2RlICYmIHR5cGUgPT09ICdmbG9hdGluZycpIHtcbiAgICAgICAgcmV0dXJuIGZsb2F0aW5nRm9jdXNOb2RlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuZmlsdGVyKEJvb2xlYW4pLmZsYXQoKTtcbiAgfSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgaWYgKCFtb2RhbCkgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgLy8gVGhlIGZvY3VzIGd1YXJkcyBoYXZlIG5vdGhpbmcgdG8gZm9jdXMsIHNvIHdlIG5lZWQgdG8gc3RvcCB0aGUgZXZlbnQuXG4gICAgICAgIGlmIChjb250YWlucyhmbG9hdGluZ0ZvY3VzTm9kZSwgYWN0aXZlRWxlbWVudChnZXREb2N1bWVudChmbG9hdGluZ0ZvY3VzTm9kZSkpKSAmJiBnZXRUYWJiYWJsZUNvbnRlbnQoKS5sZW5ndGggPT09IDAgJiYgIWlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCkge1xuICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxzID0gZ2V0VGFiYmFibGVFbGVtZW50cygpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQpO1xuICAgICAgICBpZiAob3JkZXJSZWYuY3VycmVudFswXSA9PT0gJ3JlZmVyZW5jZScgJiYgdGFyZ2V0ID09PSBkb21SZWZlcmVuY2UpIHtcbiAgICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgZW5xdWV1ZUZvY3VzKGVsc1tlbHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbnF1ZXVlRm9jdXMoZWxzWzFdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yZGVyUmVmLmN1cnJlbnRbMV0gPT09ICdmbG9hdGluZycgJiYgdGFyZ2V0ID09PSBmbG9hdGluZ0ZvY3VzTm9kZSAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgZW5xdWV1ZUZvY3VzKGVsc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoZmxvYXRpbmdGb2N1c05vZGUpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24pO1xuICAgIH07XG4gIH0sIFtkaXNhYmxlZCwgZG9tUmVmZXJlbmNlLCBmbG9hdGluZ0ZvY3VzTm9kZSwgbW9kYWwsIG9yZGVyUmVmLCBpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3gsIGdldFRhYmJhYmxlQ29udGVudCwgZ2V0VGFiYmFibGVFbGVtZW50c10pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgIGlmICghZmxvYXRpbmcpIHJldHVybjtcbiAgICBmdW5jdGlvbiBoYW5kbGVGb2N1c0luKGV2ZW50KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQpO1xuICAgICAgY29uc3QgdGFiYmFibGVDb250ZW50ID0gZ2V0VGFiYmFibGVDb250ZW50KCk7XG4gICAgICBjb25zdCB0YWJiYWJsZUluZGV4ID0gdGFiYmFibGVDb250ZW50LmluZGV4T2YodGFyZ2V0KTtcbiAgICAgIGlmICh0YWJiYWJsZUluZGV4ICE9PSAtMSkge1xuICAgICAgICB0YWJiYWJsZUluZGV4UmVmLmN1cnJlbnQgPSB0YWJiYWJsZUluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICBmbG9hdGluZy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgaGFuZGxlRm9jdXNJbik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGZsb2F0aW5nLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBoYW5kbGVGb2N1c0luKTtcbiAgICB9O1xuICB9LCBbZGlzYWJsZWQsIGZsb2F0aW5nLCBnZXRUYWJiYWJsZUNvbnRlbnRdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBpZiAoIWNsb3NlT25Gb2N1c091dCkgcmV0dXJuO1xuXG4gICAgLy8gSW4gU2FmYXJpLCBidXR0b25zIGxvc2UgZm9jdXMgd2hlbiBwcmVzc2luZyB0aGVtLlxuICAgIGZ1bmN0aW9uIGhhbmRsZVBvaW50ZXJEb3duKCkge1xuICAgICAgaXNQb2ludGVyRG93blJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpc1BvaW50ZXJEb3duUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYW5kbGVGb2N1c091dHNpZGUoZXZlbnQpIHtcbiAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBjb25zdCBtb3ZlZFRvVW5yZWxhdGVkTm9kZSA9ICEoY29udGFpbnMoZG9tUmVmZXJlbmNlLCByZWxhdGVkVGFyZ2V0KSB8fCBjb250YWlucyhmbG9hdGluZywgcmVsYXRlZFRhcmdldCkgfHwgY29udGFpbnMocmVsYXRlZFRhcmdldCwgZmxvYXRpbmcpIHx8IGNvbnRhaW5zKHBvcnRhbENvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IHBvcnRhbENvbnRleHQucG9ydGFsTm9kZSwgcmVsYXRlZFRhcmdldCkgfHwgcmVsYXRlZFRhcmdldCAhPSBudWxsICYmIHJlbGF0ZWRUYXJnZXQuaGFzQXR0cmlidXRlKGNyZWF0ZUF0dHJpYnV0ZSgnZm9jdXMtZ3VhcmQnKSkgfHwgdHJlZSAmJiAoZ2V0Q2hpbGRyZW4odHJlZS5ub2Rlc1JlZi5jdXJyZW50LCBub2RlSWQpLmZpbmQobm9kZSA9PiB7XG4gICAgICAgICAgdmFyIF9ub2RlJGNvbnRleHQsIF9ub2RlJGNvbnRleHQyO1xuICAgICAgICAgIHJldHVybiBjb250YWlucygoX25vZGUkY29udGV4dCA9IG5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJGNvbnRleHQuZWxlbWVudHMuZmxvYXRpbmcsIHJlbGF0ZWRUYXJnZXQpIHx8IGNvbnRhaW5zKChfbm9kZSRjb250ZXh0MiA9IG5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJGNvbnRleHQyLmVsZW1lbnRzLmRvbVJlZmVyZW5jZSwgcmVsYXRlZFRhcmdldCk7XG4gICAgICAgIH0pIHx8IGdldEFuY2VzdG9ycyh0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkuZmluZChub2RlID0+IHtcbiAgICAgICAgICB2YXIgX25vZGUkY29udGV4dDMsIF9ub2RlJGNvbnRleHQ0O1xuICAgICAgICAgIHJldHVybiAoKF9ub2RlJGNvbnRleHQzID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dDMuZWxlbWVudHMuZmxvYXRpbmcpID09PSByZWxhdGVkVGFyZ2V0IHx8ICgoX25vZGUkY29udGV4dDQgPSBub2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRjb250ZXh0NC5lbGVtZW50cy5kb21SZWZlcmVuY2UpID09PSByZWxhdGVkVGFyZ2V0O1xuICAgICAgICB9KSkpO1xuXG4gICAgICAgIC8vIFJlc3RvcmUgZm9jdXMgdG8gdGhlIHByZXZpb3VzIHRhYmJhYmxlIGVsZW1lbnQgaW5kZXggdG8gcHJldmVudFxuICAgICAgICAvLyBmb2N1cyBmcm9tIGJlaW5nIGxvc3Qgb3V0c2lkZSB0aGUgZmxvYXRpbmcgdHJlZS5cbiAgICAgICAgaWYgKHJlc3RvcmVGb2N1cyAmJiBtb3ZlZFRvVW5yZWxhdGVkTm9kZSAmJiBhY3RpdmVFbGVtZW50KGdldERvY3VtZW50KGZsb2F0aW5nRm9jdXNOb2RlKSkgPT09IGdldERvY3VtZW50KGZsb2F0aW5nRm9jdXNOb2RlKS5ib2R5KSB7XG4gICAgICAgICAgLy8gTGV0IGBGbG9hdGluZ1BvcnRhbGAgZWZmZWN0IGtub3dzIHRoYXQgZm9jdXMgaXMgc3RpbGwgaW5zaWRlIHRoZVxuICAgICAgICAgIC8vIGZsb2F0aW5nIHRyZWUuXG4gICAgICAgICAgaWYgKGlzSFRNTEVsZW1lbnQoZmxvYXRpbmdGb2N1c05vZGUpKSB7XG4gICAgICAgICAgICBmbG9hdGluZ0ZvY3VzTm9kZSA9PSBudWxsIHx8IGZsb2F0aW5nRm9jdXNOb2RlLmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHByZXZUYWJiYWJsZUluZGV4ID0gdGFiYmFibGVJbmRleFJlZi5jdXJyZW50O1xuICAgICAgICAgIGNvbnN0IHRhYmJhYmxlQ29udGVudCA9IGdldFRhYmJhYmxlQ29udGVudCgpO1xuICAgICAgICAgIGNvbnN0IG5vZGVUb0ZvY3VzID0gdGFiYmFibGVDb250ZW50W3ByZXZUYWJiYWJsZUluZGV4XSB8fCB0YWJiYWJsZUNvbnRlbnRbdGFiYmFibGVDb250ZW50Lmxlbmd0aCAtIDFdIHx8IGZsb2F0aW5nRm9jdXNOb2RlO1xuICAgICAgICAgIGlmIChpc0hUTUxFbGVtZW50KG5vZGVUb0ZvY3VzKSkge1xuICAgICAgICAgICAgbm9kZVRvRm9jdXMuZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb2N1cyBkaWQgbm90IG1vdmUgaW5zaWRlIHRoZSBmbG9hdGluZyB0cmVlLCBhbmQgdGhlcmUgYXJlIG5vIHRhYmJhYmxlXG4gICAgICAgIC8vIHBvcnRhbCBndWFyZHMgdG8gaGFuZGxlIGNsb3NpbmcuXG4gICAgICAgIGlmICgoaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94ID8gdHJ1ZSA6ICFtb2RhbCkgJiYgcmVsYXRlZFRhcmdldCAmJiBtb3ZlZFRvVW5yZWxhdGVkTm9kZSAmJiAhaXNQb2ludGVyRG93blJlZi5jdXJyZW50ICYmXG4gICAgICAgIC8vIEZpeCBSZWFjdCAxOCBTdHJpY3QgTW9kZSByZXR1cm5Gb2N1cyBkdWUgdG8gZG91YmxlIHJlbmRlcmluZy5cbiAgICAgICAgcmVsYXRlZFRhcmdldCAhPT0gZ2V0UHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCkpIHtcbiAgICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZmxvYXRpbmcgJiYgaXNIVE1MRWxlbWVudChkb21SZWZlcmVuY2UpKSB7XG4gICAgICBkb21SZWZlcmVuY2UuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBoYW5kbGVGb2N1c091dHNpZGUpO1xuICAgICAgZG9tUmVmZXJlbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgZmxvYXRpbmcuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBoYW5kbGVGb2N1c091dHNpZGUpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZG9tUmVmZXJlbmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgaGFuZGxlRm9jdXNPdXRzaWRlKTtcbiAgICAgICAgZG9tUmVmZXJlbmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgICBmbG9hdGluZy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGhhbmRsZUZvY3VzT3V0c2lkZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2Rpc2FibGVkLCBkb21SZWZlcmVuY2UsIGZsb2F0aW5nLCBmbG9hdGluZ0ZvY3VzTm9kZSwgbW9kYWwsIG5vZGVJZCwgdHJlZSwgcG9ydGFsQ29udGV4dCwgb25PcGVuQ2hhbmdlLCBjbG9zZU9uRm9jdXNPdXQsIHJlc3RvcmVGb2N1cywgZ2V0VGFiYmFibGVDb250ZW50LCBpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3hdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICB2YXIgX3BvcnRhbENvbnRleHQkcG9ydGFsO1xuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgLy8gRG9uJ3QgaGlkZSBwb3J0YWxzIG5lc3RlZCB3aXRoaW4gdGhlIHBhcmVudCBwb3J0YWwuXG4gICAgY29uc3QgcG9ydGFsTm9kZXMgPSBBcnJheS5mcm9tKChwb3J0YWxDb250ZXh0ID09IG51bGwgfHwgKF9wb3J0YWxDb250ZXh0JHBvcnRhbCA9IHBvcnRhbENvbnRleHQucG9ydGFsTm9kZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9wb3J0YWxDb250ZXh0JHBvcnRhbC5xdWVyeVNlbGVjdG9yQWxsKFwiW1wiICsgY3JlYXRlQXR0cmlidXRlKCdwb3J0YWwnKSArIFwiXVwiKSkgfHwgW10pO1xuICAgIGlmIChmbG9hdGluZykge1xuICAgICAgY29uc3QgaW5zaWRlRWxlbWVudHMgPSBbZmxvYXRpbmcsIC4uLnBvcnRhbE5vZGVzLCBzdGFydERpc21pc3NCdXR0b25SZWYuY3VycmVudCwgZW5kRGlzbWlzc0J1dHRvblJlZi5jdXJyZW50LCBvcmRlclJlZi5jdXJyZW50LmluY2x1ZGVzKCdyZWZlcmVuY2UnKSB8fCBpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3ggPyBkb21SZWZlcmVuY2UgOiBudWxsXS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpO1xuICAgICAgY29uc3QgY2xlYW51cCA9IG1vZGFsIHx8IGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCA/IG1hcmtPdGhlcnMoaW5zaWRlRWxlbWVudHMsIGd1YXJkcywgIWd1YXJkcykgOiBtYXJrT3RoZXJzKGluc2lkZUVsZW1lbnRzKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbZGlzYWJsZWQsIGRvbVJlZmVyZW5jZSwgZmxvYXRpbmcsIG1vZGFsLCBvcmRlclJlZiwgcG9ydGFsQ29udGV4dCwgaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94LCBndWFyZHNdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCB8fCAhaXNIVE1MRWxlbWVudChmbG9hdGluZ0ZvY3VzTm9kZSkpIHJldHVybjtcbiAgICBjb25zdCBkb2MgPSBnZXREb2N1bWVudChmbG9hdGluZ0ZvY3VzTm9kZSk7XG4gICAgY29uc3QgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gYWN0aXZlRWxlbWVudChkb2MpO1xuXG4gICAgLy8gV2FpdCBmb3IgYW55IGxheW91dCBlZmZlY3Qgc3RhdGUgc2V0dGVycyB0byBleGVjdXRlIHRvIHNldCBgdGFiSW5kZXhgLlxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0VGFiYmFibGVFbGVtZW50cyhmbG9hdGluZ0ZvY3VzTm9kZSk7XG4gICAgICBjb25zdCBpbml0aWFsRm9jdXNWYWx1ZSA9IGluaXRpYWxGb2N1c1JlZi5jdXJyZW50O1xuICAgICAgY29uc3QgZWxUb0ZvY3VzID0gKHR5cGVvZiBpbml0aWFsRm9jdXNWYWx1ZSA9PT0gJ251bWJlcicgPyBmb2N1c2FibGVFbGVtZW50c1tpbml0aWFsRm9jdXNWYWx1ZV0gOiBpbml0aWFsRm9jdXNWYWx1ZS5jdXJyZW50KSB8fCBmbG9hdGluZ0ZvY3VzTm9kZTtcbiAgICAgIGNvbnN0IGZvY3VzQWxyZWFkeUluc2lkZUZsb2F0aW5nRWwgPSBjb250YWlucyhmbG9hdGluZ0ZvY3VzTm9kZSwgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50KTtcbiAgICAgIGlmICghaWdub3JlSW5pdGlhbEZvY3VzICYmICFmb2N1c0FscmVhZHlJbnNpZGVGbG9hdGluZ0VsICYmIG9wZW4pIHtcbiAgICAgICAgZW5xdWV1ZUZvY3VzKGVsVG9Gb2N1cywge1xuICAgICAgICAgIHByZXZlbnRTY3JvbGw6IGVsVG9Gb2N1cyA9PT0gZmxvYXRpbmdGb2N1c05vZGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIFtkaXNhYmxlZCwgb3BlbiwgZmxvYXRpbmdGb2N1c05vZGUsIGlnbm9yZUluaXRpYWxGb2N1cywgZ2V0VGFiYmFibGVFbGVtZW50cywgaW5pdGlhbEZvY3VzUmVmXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQgfHwgIWZsb2F0aW5nRm9jdXNOb2RlKSByZXR1cm47XG4gICAgbGV0IHByZXZlbnRSZXR1cm5Gb2N1c1Njcm9sbCA9IGZhbHNlO1xuICAgIGNvbnN0IGRvYyA9IGdldERvY3VtZW50KGZsb2F0aW5nRm9jdXNOb2RlKTtcbiAgICBjb25zdCBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBhY3RpdmVFbGVtZW50KGRvYyk7XG4gICAgY29uc3QgY29udGV4dERhdGEgPSBkYXRhUmVmLmN1cnJlbnQ7XG4gICAgbGV0IG9wZW5FdmVudCA9IGNvbnRleHREYXRhLm9wZW5FdmVudDtcbiAgICBjb25zdCBkb21SZWZlcmVuY2UgPSByZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50O1xuICAgIGFkZFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudChwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpO1xuXG4gICAgLy8gRGlzbWlzc2luZyB2aWEgb3V0c2lkZSBwcmVzcyBzaG91bGQgYWx3YXlzIGlnbm9yZSBgcmV0dXJuRm9jdXNgIHRvXG4gICAgLy8gcHJldmVudCB1bndhbnRlZCBzY3JvbGxpbmcuXG4gICAgZnVuY3Rpb24gb25PcGVuQ2hhbmdlKF9yZWYpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIG9wZW4sXG4gICAgICAgIHJlYXNvbixcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIG5lc3RlZFxuICAgICAgfSA9IF9yZWY7XG4gICAgICBpZiAob3Blbikge1xuICAgICAgICBvcGVuRXZlbnQgPSBldmVudDtcbiAgICAgIH1cbiAgICAgIGlmIChyZWFzb24gPT09ICdlc2NhcGUta2V5JyAmJiByZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KSB7XG4gICAgICAgIGFkZFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudChyZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWFzb24gPT09ICdob3ZlcicgJiYgZXZlbnQudHlwZSA9PT0gJ21vdXNlbGVhdmUnKSB7XG4gICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWFzb24gIT09ICdvdXRzaWRlLXByZXNzJykgcmV0dXJuO1xuICAgICAgaWYgKG5lc3RlZCkge1xuICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNTY3JvbGwgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJldmVudFJldHVybkZvY3VzUmVmLmN1cnJlbnQgPSAhKGlzVmlydHVhbENsaWNrKGV2ZW50KSB8fCBpc1ZpcnR1YWxQb2ludGVyRXZlbnQoZXZlbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXZlbnRzLm9uKCdvcGVuY2hhbmdlJywgb25PcGVuQ2hhbmdlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZXZlbnRzLm9mZignb3BlbmNoYW5nZScsIG9uT3BlbkNoYW5nZSk7XG4gICAgICBjb25zdCBhY3RpdmVFbCA9IGFjdGl2ZUVsZW1lbnQoZG9jKTtcbiAgICAgIGNvbnN0IGlzRm9jdXNJbnNpZGVGbG9hdGluZ1RyZWUgPSBjb250YWlucyhmbG9hdGluZywgYWN0aXZlRWwpIHx8IHRyZWUgJiYgZ2V0Q2hpbGRyZW4odHJlZS5ub2Rlc1JlZi5jdXJyZW50LCBub2RlSWQpLnNvbWUobm9kZSA9PiB7XG4gICAgICAgIHZhciBfbm9kZSRjb250ZXh0NTtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zKChfbm9kZSRjb250ZXh0NSA9IG5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJGNvbnRleHQ1LmVsZW1lbnRzLmZsb2F0aW5nLCBhY3RpdmVFbCk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNob3VsZEZvY3VzUmVmZXJlbmNlID0gaXNGb2N1c0luc2lkZUZsb2F0aW5nVHJlZSB8fCBvcGVuRXZlbnQgJiYgWydjbGljaycsICdtb3VzZWRvd24nXS5pbmNsdWRlcyhvcGVuRXZlbnQudHlwZSk7XG4gICAgICBpZiAoc2hvdWxkRm9jdXNSZWZlcmVuY2UgJiYgcmVmcy5kb21SZWZlcmVuY2UuY3VycmVudCkge1xuICAgICAgICBhZGRQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQocmVmcy5kb21SZWZlcmVuY2UuY3VycmVudCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXR1cm5Db250ZXh0RWxlbWVudCA9IGRvbVJlZmVyZW5jZSB8fCBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQ7XG4gICAgICBjb25zdCB0YWJiYWJsZUVsZW1lbnRzID0gdGFiYmFibGUoZ2V0RG9jdW1lbnQocmV0dXJuQ29udGV4dEVsZW1lbnQpLmJvZHksIGdldFRhYmJhYmxlT3B0aW9ucygpKTtcblxuICAgICAgLy8gV2FpdCBmb3IgdGhlIHJldHVybiBlbGVtZW50IHRvIGdldCBwb3RlbnRpYWxseSBkaXNjb25uZWN0ZWQgYmVmb3JlXG4gICAgICAvLyBjaGVja2luZy5cbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgbGV0IHJldHVybkVsZW1lbnQgPSBnZXRQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKCFyZXR1cm5FbGVtZW50ICYmIGlzSFRNTEVsZW1lbnQocmV0dXJuQ29udGV4dEVsZW1lbnQpICYmIGZsb2F0aW5nKSB7XG4gICAgICAgICAgcmV0dXJuRWxlbWVudCA9IGdldENsb3Nlc3RUYWJiYWJsZUVsZW1lbnQodGFiYmFibGVFbGVtZW50cywgcmV0dXJuQ29udGV4dEVsZW1lbnQsIGZsb2F0aW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICAgICAgcmV0dXJuRm9jdXNSZWYuY3VycmVudCAmJiAhcHJldmVudFJldHVybkZvY3VzUmVmLmN1cnJlbnQgJiYgaXNIVE1MRWxlbWVudChyZXR1cm5FbGVtZW50KSAmJiAoXG4gICAgICAgIC8vIElmIHRoZSBmb2N1cyBtb3ZlZCBzb21ld2hlcmUgZWxzZSBhZnRlciBtb3VudCwgYXZvaWQgcmV0dXJuaW5nIGZvY3VzXG4gICAgICAgIC8vIHNpbmNlIGl0IGxpa2VseSBlbnRlcmVkIGEgZGlmZmVyZW50IGVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlXG4gICAgICAgIC8vIHJlc3BlY3RlZDogaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yNjA3XG4gICAgICAgIHJldHVybkVsZW1lbnQgIT09IGFjdGl2ZUVsICYmIGFjdGl2ZUVsICE9PSBkb2MuYm9keSA/IGlzRm9jdXNJbnNpZGVGbG9hdGluZ1RyZWUgOiB0cnVlKSkge1xuICAgICAgICAgIHJldHVybkVsZW1lbnQuZm9jdXMoe1xuICAgICAgICAgICAgcHJldmVudFNjcm9sbDogcHJldmVudFJldHVybkZvY3VzU2Nyb2xsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gIH0sIFtkaXNhYmxlZCwgZmxvYXRpbmcsIGZsb2F0aW5nRm9jdXNOb2RlLCByZXR1cm5Gb2N1c1JlZiwgZGF0YVJlZiwgcmVmcywgZXZlbnRzLCB0cmVlLCBub2RlSWRdKTtcblxuICAvLyBTeW5jaHJvbml6ZSB0aGUgYGNvbnRleHRgICYgYG1vZGFsYCB2YWx1ZSB0byB0aGUgRmxvYXRpbmdQb3J0YWwgY29udGV4dC5cbiAgLy8gSXQgd2lsbCBkZWNpZGUgd2hldGhlciBvciBub3QgaXQgbmVlZHMgdG8gcmVuZGVyIGl0cyBvd24gZ3VhcmRzLlxuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgaWYgKCFwb3J0YWxDb250ZXh0KSByZXR1cm47XG4gICAgcG9ydGFsQ29udGV4dC5zZXRGb2N1c01hbmFnZXJTdGF0ZSh7XG4gICAgICBtb2RhbCxcbiAgICAgIGNsb3NlT25Gb2N1c091dCxcbiAgICAgIG9wZW4sXG4gICAgICBvbk9wZW5DaGFuZ2UsXG4gICAgICByZWZzXG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHBvcnRhbENvbnRleHQuc2V0Rm9jdXNNYW5hZ2VyU3RhdGUobnVsbCk7XG4gICAgfTtcbiAgfSwgW2Rpc2FibGVkLCBwb3J0YWxDb250ZXh0LCBtb2RhbCwgb3Blbiwgb25PcGVuQ2hhbmdlLCByZWZzLCBjbG9zZU9uRm9jdXNPdXRdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgIGlmICghZmxvYXRpbmdGb2N1c05vZGUpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICdmdW5jdGlvbicpIHJldHVybjtcbiAgICBpZiAoaWdub3JlSW5pdGlhbEZvY3VzKSByZXR1cm47XG4gICAgY29uc3QgaGFuZGxlTXV0YXRpb24gPSAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJJbmRleCA9IGZsb2F0aW5nRm9jdXNOb2RlLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICAgIGNvbnN0IHRhYmJhYmxlQ29udGVudCA9IGdldFRhYmJhYmxlQ29udGVudCgpO1xuICAgICAgY29uc3QgYWN0aXZlRWwgPSBhY3RpdmVFbGVtZW50KGdldERvY3VtZW50KGZsb2F0aW5nKSk7XG4gICAgICBjb25zdCB0YWJiYWJsZUluZGV4ID0gdGFiYmFibGVDb250ZW50LmluZGV4T2YoYWN0aXZlRWwpO1xuICAgICAgaWYgKHRhYmJhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRhYmJhYmxlSW5kZXhSZWYuY3VycmVudCA9IHRhYmJhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgICBpZiAob3JkZXJSZWYuY3VycmVudC5pbmNsdWRlcygnZmxvYXRpbmcnKSB8fCBhY3RpdmVFbCAhPT0gcmVmcy5kb21SZWZlcmVuY2UuY3VycmVudCAmJiB0YWJiYWJsZUNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmICh0YWJJbmRleCAhPT0gJzAnKSB7XG4gICAgICAgICAgZmxvYXRpbmdGb2N1c05vZGUuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGFiSW5kZXggIT09ICctMScpIHtcbiAgICAgICAgZmxvYXRpbmdGb2N1c05vZGUuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xuICAgICAgfVxuICAgIH07XG4gICAgaGFuZGxlTXV0YXRpb24oKTtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGhhbmRsZU11dGF0aW9uKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGZsb2F0aW5nRm9jdXNOb2RlLCB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgYXR0cmlidXRlczogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfSwgW2Rpc2FibGVkLCBmbG9hdGluZywgZmxvYXRpbmdGb2N1c05vZGUsIHJlZnMsIG9yZGVyUmVmLCBnZXRUYWJiYWJsZUNvbnRlbnQsIGlnbm9yZUluaXRpYWxGb2N1c10pO1xuICBmdW5jdGlvbiByZW5kZXJEaXNtaXNzQnV0dG9uKGxvY2F0aW9uKSB7XG4gICAgaWYgKGRpc2FibGVkIHx8ICF2aXN1YWxseUhpZGRlbkRpc21pc3MgfHwgIW1vZGFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFZpc3VhbGx5SGlkZGVuRGlzbWlzcywge1xuICAgICAgcmVmOiBsb2NhdGlvbiA9PT0gJ3N0YXJ0JyA/IHN0YXJ0RGlzbWlzc0J1dHRvblJlZiA6IGVuZERpc21pc3NCdXR0b25SZWYsXG4gICAgICBvbkNsaWNrOiBldmVudCA9PiBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50KVxuICAgIH0sIHR5cGVvZiB2aXN1YWxseUhpZGRlbkRpc21pc3MgPT09ICdzdHJpbmcnID8gdmlzdWFsbHlIaWRkZW5EaXNtaXNzIDogJ0Rpc21pc3MnKTtcbiAgfVxuICBjb25zdCBzaG91bGRSZW5kZXJHdWFyZHMgPSAhZGlzYWJsZWQgJiYgZ3VhcmRzICYmIChtb2RhbCA/ICFpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3ggOiB0cnVlKSAmJiAoaXNJbnNpZGVQb3J0YWwgfHwgbW9kYWwpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHNob3VsZFJlbmRlckd1YXJkcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0d1YXJkLCB7XG4gICAgXCJkYXRhLXR5cGVcIjogXCJpbnNpZGVcIixcbiAgICByZWY6IHBvcnRhbENvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IHBvcnRhbENvbnRleHQuYmVmb3JlSW5zaWRlUmVmLFxuICAgIG9uRm9jdXM6IGV2ZW50ID0+IHtcbiAgICAgIGlmIChtb2RhbCkge1xuICAgICAgICBjb25zdCBlbHMgPSBnZXRUYWJiYWJsZUVsZW1lbnRzKCk7XG4gICAgICAgIGVucXVldWVGb2N1cyhvcmRlclswXSA9PT0gJ3JlZmVyZW5jZScgPyBlbHNbMF0gOiBlbHNbZWxzLmxlbmd0aCAtIDFdKTtcbiAgICAgIH0gZWxzZSBpZiAocG9ydGFsQ29udGV4dCAhPSBudWxsICYmIHBvcnRhbENvbnRleHQucHJlc2VydmVUYWJPcmRlciAmJiBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpIHtcbiAgICAgICAgcHJldmVudFJldHVybkZvY3VzUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFRhYmJhYmxlID0gZ2V0TmV4dFRhYmJhYmxlKCkgfHwgZG9tUmVmZXJlbmNlO1xuICAgICAgICAgIG5leHRUYWJiYWJsZSA9PSBudWxsIHx8IG5leHRUYWJiYWJsZS5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfcG9ydGFsQ29udGV4dCRiZWZvcmU7XG4gICAgICAgICAgKF9wb3J0YWxDb250ZXh0JGJlZm9yZSA9IHBvcnRhbENvbnRleHQuYmVmb3JlT3V0c2lkZVJlZi5jdXJyZW50KSA9PSBudWxsIHx8IF9wb3J0YWxDb250ZXh0JGJlZm9yZS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KSwgIWlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCAmJiByZW5kZXJEaXNtaXNzQnV0dG9uKCdzdGFydCcpLCBjaGlsZHJlbiwgcmVuZGVyRGlzbWlzc0J1dHRvbignZW5kJyksIHNob3VsZFJlbmRlckd1YXJkcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0d1YXJkLCB7XG4gICAgXCJkYXRhLXR5cGVcIjogXCJpbnNpZGVcIixcbiAgICByZWY6IHBvcnRhbENvbnRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IHBvcnRhbENvbnRleHQuYWZ0ZXJJbnNpZGVSZWYsXG4gICAgb25Gb2N1czogZXZlbnQgPT4ge1xuICAgICAgaWYgKG1vZGFsKSB7XG4gICAgICAgIGVucXVldWVGb2N1cyhnZXRUYWJiYWJsZUVsZW1lbnRzKClbMF0pO1xuICAgICAgfSBlbHNlIGlmIChwb3J0YWxDb250ZXh0ICE9IG51bGwgJiYgcG9ydGFsQ29udGV4dC5wcmVzZXJ2ZVRhYk9yZGVyICYmIHBvcnRhbENvbnRleHQucG9ydGFsTm9kZSkge1xuICAgICAgICBpZiAoY2xvc2VPbkZvY3VzT3V0KSB7XG4gICAgICAgICAgcHJldmVudFJldHVybkZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc091dHNpZGVFdmVudChldmVudCwgcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlKSkge1xuICAgICAgICAgIGNvbnN0IHByZXZUYWJiYWJsZSA9IGdldFByZXZpb3VzVGFiYmFibGUoKSB8fCBkb21SZWZlcmVuY2U7XG4gICAgICAgICAgcHJldlRhYmJhYmxlID09IG51bGwgfHwgcHJldlRhYmJhYmxlLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wb3J0YWxDb250ZXh0JGFmdGVyTztcbiAgICAgICAgICAoX3BvcnRhbENvbnRleHQkYWZ0ZXJPID0gcG9ydGFsQ29udGV4dC5hZnRlck91dHNpZGVSZWYuY3VycmVudCkgPT0gbnVsbCB8fCBfcG9ydGFsQ29udGV4dCRhZnRlck8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSkpO1xufVxuXG5jb25zdCBhY3RpdmVMb2NrcyA9IC8qI19fUFVSRV9fKi9uZXcgU2V0KCk7XG4vKipcbiAqIFByb3ZpZGVzIGJhc2Ugc3R5bGluZyBmb3IgYSBmaXhlZCBvdmVybGF5IGVsZW1lbnQgdG8gZGltIGNvbnRlbnQgb3IgYmxvY2tcbiAqIHBvaW50ZXIgZXZlbnRzIGJlaGluZCBhIGZsb2F0aW5nIGVsZW1lbnQuXG4gKiBJdCdzIGEgcmVndWxhciBgPGRpdj5gLCBzbyBpdCBjYW4gYmUgc3R5bGVkIHZpYSBhbnkgQ1NTIHNvbHV0aW9uIHlvdSBwcmVmZXIuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdPdmVybGF5XG4gKi9cbmNvbnN0IEZsb2F0aW5nT3ZlcmxheSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZsb2F0aW5nT3ZlcmxheShwcm9wcywgcmVmKSB7XG4gIGNvbnN0IHtcbiAgICBsb2NrU2Nyb2xsID0gZmFsc2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGxvY2tJZCA9IHVzZUlkKCk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWxvY2tTY3JvbGwpIHJldHVybjtcbiAgICBhY3RpdmVMb2Nrcy5hZGQobG9ja0lkKTtcbiAgICBjb25zdCBpc0lPUyA9IC9pUChob25lfGFkfG9kKXxpT1MvLnRlc3QoZ2V0UGxhdGZvcm0oKSk7XG4gICAgY29uc3QgYm9keVN0eWxlID0gZG9jdW1lbnQuYm9keS5zdHlsZTtcbiAgICAvLyBSVEwgPGJvZHk+IHNjcm9sbGJhclxuICAgIGNvbnN0IHNjcm9sbGJhclggPSBNYXRoLnJvdW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KSArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHBhZGRpbmdQcm9wID0gc2Nyb2xsYmFyWCA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0JztcbiAgICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IHNjcm9sbFggPSBib2R5U3R5bGUubGVmdCA/IHBhcnNlRmxvYXQoYm9keVN0eWxlLmxlZnQpIDogd2luZG93LnNjcm9sbFg7XG4gICAgY29uc3Qgc2Nyb2xsWSA9IGJvZHlTdHlsZS50b3AgPyBwYXJzZUZsb2F0KGJvZHlTdHlsZS50b3ApIDogd2luZG93LnNjcm9sbFk7XG4gICAgYm9keVN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgaWYgKHNjcm9sbGJhcldpZHRoKSB7XG4gICAgICBib2R5U3R5bGVbcGFkZGluZ1Byb3BdID0gc2Nyb2xsYmFyV2lkdGggKyBcInB4XCI7XG4gICAgfVxuXG4gICAgLy8gT25seSBpT1MgZG9lc24ndCByZXNwZWN0IGBvdmVyZmxvdzogaGlkZGVuYCBvbiBkb2N1bWVudC5ib2R5LCBhbmQgdGhpc1xuICAgIC8vIHRlY2huaXF1ZSBoYXMgZmV3ZXIgc2lkZSBlZmZlY3RzLlxuICAgIGlmIChpc0lPUykge1xuICAgICAgdmFyIF93aW5kb3ckdmlzdWFsVmlld3BvciwgX3dpbmRvdyR2aXN1YWxWaWV3cG9yMjtcbiAgICAgIC8vIGlPUyAxMiBkb2VzIG5vdCBzdXBwb3J0IGB2aXN1YWxWaWV3cG9ydGAuXG4gICAgICBjb25zdCBvZmZzZXRMZWZ0ID0gKChfd2luZG93JHZpc3VhbFZpZXdwb3IgPSB3aW5kb3cudmlzdWFsVmlld3BvcnQpID09IG51bGwgPyB2b2lkIDAgOiBfd2luZG93JHZpc3VhbFZpZXdwb3Iub2Zmc2V0TGVmdCkgfHwgMDtcbiAgICAgIGNvbnN0IG9mZnNldFRvcCA9ICgoX3dpbmRvdyR2aXN1YWxWaWV3cG9yMiA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCkgPT0gbnVsbCA/IHZvaWQgMCA6IF93aW5kb3ckdmlzdWFsVmlld3BvcjIub2Zmc2V0VG9wKSB8fCAwO1xuICAgICAgT2JqZWN0LmFzc2lnbihib2R5U3R5bGUsIHtcbiAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgIHRvcDogLShzY3JvbGxZIC0gTWF0aC5mbG9vcihvZmZzZXRUb3ApKSArIFwicHhcIixcbiAgICAgICAgbGVmdDogLShzY3JvbGxYIC0gTWF0aC5mbG9vcihvZmZzZXRMZWZ0KSkgKyBcInB4XCIsXG4gICAgICAgIHJpZ2h0OiAnMCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlTG9ja3MuZGVsZXRlKGxvY2tJZCk7XG4gICAgICBpZiAoYWN0aXZlTG9ja3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGJvZHlTdHlsZSwge1xuICAgICAgICAgIG92ZXJmbG93OiAnJyxcbiAgICAgICAgICBbcGFkZGluZ1Byb3BdOiAnJ1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzSU9TKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihib2R5U3R5bGUsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnJyxcbiAgICAgICAgICAgIHRvcDogJycsXG4gICAgICAgICAgICBsZWZ0OiAnJyxcbiAgICAgICAgICAgIHJpZ2h0OiAnJ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyhzY3JvbGxYLCBzY3JvbGxZKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0sIFtsb2NrSWQsIGxvY2tTY3JvbGxdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICByZWY6IHJlZlxuICB9LCByZXN0LCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgb3ZlcmZsb3c6ICdhdXRvJyxcbiAgICAgIHRvcDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIC4uLnJlc3Quc3R5bGVcbiAgICB9XG4gIH0pKTtcbn0pO1xuXG5mdW5jdGlvbiBpc0J1dHRvblRhcmdldChldmVudCkge1xuICByZXR1cm4gaXNIVE1MRWxlbWVudChldmVudC50YXJnZXQpICYmIGV2ZW50LnRhcmdldC50YWdOYW1lID09PSAnQlVUVE9OJztcbn1cbmZ1bmN0aW9uIGlzU3BhY2VJZ25vcmVkKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGlzVHlwZWFibGVFbGVtZW50KGVsZW1lbnQpO1xufVxuLyoqXG4gKiBPcGVucyBvciBjbG9zZXMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgd2hlbiBjbGlja2luZyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlQ2xpY2tcbiAqL1xuZnVuY3Rpb24gdXNlQ2xpY2soY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBkYXRhUmVmLFxuICAgIGVsZW1lbnRzOiB7XG4gICAgICBkb21SZWZlcmVuY2VcbiAgICB9XG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgZXZlbnQ6IGV2ZW50T3B0aW9uID0gJ2NsaWNrJyxcbiAgICB0b2dnbGUgPSB0cnVlLFxuICAgIGlnbm9yZU1vdXNlID0gZmFsc2UsXG4gICAga2V5Ym9hcmRIYW5kbGVycyA9IHRydWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCBwb2ludGVyVHlwZVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBjb25zdCBkaWRLZXlEb3duUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgcmVmZXJlbmNlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIG9uUG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICAgIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPSBldmVudC5wb2ludGVyVHlwZTtcbiAgICB9LFxuICAgIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgICBjb25zdCBwb2ludGVyVHlwZSA9IHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQ7XG5cbiAgICAgIC8vIElnbm9yZSBhbGwgYnV0dG9ucyBleGNlcHQgZm9yIHRoZSBcIm1haW5cIiBidXR0b24uXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTW91c2VFdmVudC9idXR0b25cbiAgICAgIGlmIChldmVudC5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIGlmIChldmVudE9wdGlvbiA9PT0gJ2NsaWNrJykgcmV0dXJuO1xuICAgICAgaWYgKGlzTW91c2VMaWtlUG9pbnRlclR5cGUocG9pbnRlclR5cGUsIHRydWUpICYmIGlnbm9yZU1vdXNlKSByZXR1cm47XG4gICAgICBpZiAob3BlbiAmJiB0b2dnbGUgJiYgKGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQgPyBkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nIDogdHJ1ZSkpIHtcbiAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCwgJ2NsaWNrJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQcmV2ZW50IHN0ZWFsaW5nIGZvY3VzIGZyb20gdGhlIGZsb2F0aW5nIGVsZW1lbnRcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uQ2xpY2soZXZlbnQpIHtcbiAgICAgIGNvbnN0IHBvaW50ZXJUeXBlID0gcG9pbnRlclR5cGVSZWYuY3VycmVudDtcbiAgICAgIGlmIChldmVudE9wdGlvbiA9PT0gJ21vdXNlZG93bicgJiYgcG9pbnRlclR5cGVSZWYuY3VycmVudCkge1xuICAgICAgICBwb2ludGVyVHlwZVJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNNb3VzZUxpa2VQb2ludGVyVHlwZShwb2ludGVyVHlwZSwgdHJ1ZSkgJiYgaWdub3JlTW91c2UpIHJldHVybjtcbiAgICAgIGlmIChvcGVuICYmIHRvZ2dsZSAmJiAoZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCA/IGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQudHlwZSA9PT0gJ2NsaWNrJyA6IHRydWUpKSB7XG4gICAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgcG9pbnRlclR5cGVSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFrZXlib2FyZEhhbmRsZXJzIHx8IGlzQnV0dG9uVGFyZ2V0KGV2ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnICcgJiYgIWlzU3BhY2VJZ25vcmVkKGRvbVJlZmVyZW5jZSkpIHtcbiAgICAgICAgLy8gUHJldmVudCBzY3JvbGxpbmdcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZGlkS2V5RG93blJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgaWYgKG9wZW4gJiYgdG9nZ2xlKSB7XG4gICAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCwgJ2NsaWNrJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgb25LZXlVcChldmVudCkge1xuICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgIWtleWJvYXJkSGFuZGxlcnMgfHwgaXNCdXR0b25UYXJnZXQoZXZlbnQpIHx8IGlzU3BhY2VJZ25vcmVkKGRvbVJlZmVyZW5jZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJyAnICYmIGRpZEtleURvd25SZWYuY3VycmVudCkge1xuICAgICAgICBkaWRLZXlEb3duUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKG9wZW4gJiYgdG9nZ2xlKSB7XG4gICAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCwgJ2NsaWNrJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSksIFtkYXRhUmVmLCBkb21SZWZlcmVuY2UsIGV2ZW50T3B0aW9uLCBpZ25vcmVNb3VzZSwga2V5Ym9hcmRIYW5kbGVycywgb25PcGVuQ2hhbmdlLCBvcGVuLCB0b2dnbGVdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2VcbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlXSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpcnR1YWxFbGVtZW50KGRvbUVsZW1lbnQsIGRhdGEpIHtcbiAgbGV0IG9mZnNldFggPSBudWxsO1xuICBsZXQgb2Zmc2V0WSA9IG51bGw7XG4gIGxldCBpc0F1dG9VcGRhdGVFdmVudCA9IGZhbHNlO1xuICByZXR1cm4ge1xuICAgIGNvbnRleHRFbGVtZW50OiBkb21FbGVtZW50IHx8IHVuZGVmaW5lZCxcbiAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB7XG4gICAgICB2YXIgX2RhdGEkZGF0YVJlZiRjdXJyZW50O1xuICAgICAgY29uc3QgZG9tUmVjdCA9IChkb21FbGVtZW50ID09IG51bGwgPyB2b2lkIDAgOiBkb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSB8fCB7XG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDBcbiAgICAgIH07XG4gICAgICBjb25zdCBpc1hBeGlzID0gZGF0YS5heGlzID09PSAneCcgfHwgZGF0YS5heGlzID09PSAnYm90aCc7XG4gICAgICBjb25zdCBpc1lBeGlzID0gZGF0YS5heGlzID09PSAneScgfHwgZGF0YS5heGlzID09PSAnYm90aCc7XG4gICAgICBjb25zdCBjYW5UcmFja0N1cnNvck9uQXV0b1VwZGF0ZSA9IFsnbW91c2VlbnRlcicsICdtb3VzZW1vdmUnXS5pbmNsdWRlcygoKF9kYXRhJGRhdGFSZWYkY3VycmVudCA9IGRhdGEuZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhJGRhdGFSZWYkY3VycmVudC50eXBlKSB8fCAnJykgJiYgZGF0YS5wb2ludGVyVHlwZSAhPT0gJ3RvdWNoJztcbiAgICAgIGxldCB3aWR0aCA9IGRvbVJlY3Qud2lkdGg7XG4gICAgICBsZXQgaGVpZ2h0ID0gZG9tUmVjdC5oZWlnaHQ7XG4gICAgICBsZXQgeCA9IGRvbVJlY3QueDtcbiAgICAgIGxldCB5ID0gZG9tUmVjdC55O1xuICAgICAgaWYgKG9mZnNldFggPT0gbnVsbCAmJiBkYXRhLnggJiYgaXNYQXhpcykge1xuICAgICAgICBvZmZzZXRYID0gZG9tUmVjdC54IC0gZGF0YS54O1xuICAgICAgfVxuICAgICAgaWYgKG9mZnNldFkgPT0gbnVsbCAmJiBkYXRhLnkgJiYgaXNZQXhpcykge1xuICAgICAgICBvZmZzZXRZID0gZG9tUmVjdC55IC0gZGF0YS55O1xuICAgICAgfVxuICAgICAgeCAtPSBvZmZzZXRYIHx8IDA7XG4gICAgICB5IC09IG9mZnNldFkgfHwgMDtcbiAgICAgIHdpZHRoID0gMDtcbiAgICAgIGhlaWdodCA9IDA7XG4gICAgICBpZiAoIWlzQXV0b1VwZGF0ZUV2ZW50IHx8IGNhblRyYWNrQ3Vyc29yT25BdXRvVXBkYXRlKSB7XG4gICAgICAgIHdpZHRoID0gZGF0YS5heGlzID09PSAneScgPyBkb21SZWN0LndpZHRoIDogMDtcbiAgICAgICAgaGVpZ2h0ID0gZGF0YS5heGlzID09PSAneCcgPyBkb21SZWN0LmhlaWdodCA6IDA7XG4gICAgICAgIHggPSBpc1hBeGlzICYmIGRhdGEueCAhPSBudWxsID8gZGF0YS54IDogeDtcbiAgICAgICAgeSA9IGlzWUF4aXMgJiYgZGF0YS55ICE9IG51bGwgPyBkYXRhLnkgOiB5O1xuICAgICAgfSBlbHNlIGlmIChpc0F1dG9VcGRhdGVFdmVudCAmJiAhY2FuVHJhY2tDdXJzb3JPbkF1dG9VcGRhdGUpIHtcbiAgICAgICAgaGVpZ2h0ID0gZGF0YS5heGlzID09PSAneCcgPyBkb21SZWN0LmhlaWdodCA6IGhlaWdodDtcbiAgICAgICAgd2lkdGggPSBkYXRhLmF4aXMgPT09ICd5JyA/IGRvbVJlY3Qud2lkdGggOiB3aWR0aDtcbiAgICAgIH1cbiAgICAgIGlzQXV0b1VwZGF0ZUV2ZW50ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHRvcDogeSxcbiAgICAgICAgcmlnaHQ6IHggKyB3aWR0aCxcbiAgICAgICAgYm90dG9tOiB5ICsgaGVpZ2h0LFxuICAgICAgICBsZWZ0OiB4XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGlzTW91c2VCYXNlZEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiBldmVudCAhPSBudWxsICYmIGV2ZW50LmNsaWVudFggIT0gbnVsbDtcbn1cbi8qKlxuICogUG9zaXRpb25zIHRoZSBmbG9hdGluZyBlbGVtZW50IHJlbGF0aXZlIHRvIGEgY2xpZW50IHBvaW50IChpbiB0aGUgdmlld3BvcnQpLFxuICogc3VjaCBhcyB0aGUgbW91c2UgcG9zaXRpb24uIEJ5IGRlZmF1bHQsIGl0IGZvbGxvd3MgdGhlIG1vdXNlIGN1cnNvci5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VDbGllbnRQb2ludFxuICovXG5mdW5jdGlvbiB1c2VDbGllbnRQb2ludChjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgZGF0YVJlZixcbiAgICBlbGVtZW50czoge1xuICAgICAgZmxvYXRpbmcsXG4gICAgICBkb21SZWZlcmVuY2VcbiAgICB9LFxuICAgIHJlZnNcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBheGlzID0gJ2JvdGgnLFxuICAgIHggPSBudWxsLFxuICAgIHkgPSBudWxsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgaW5pdGlhbFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGNsZWFudXBMaXN0ZW5lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgW3BvaW50ZXJUeXBlLCBzZXRQb2ludGVyVHlwZV0gPSBSZWFjdC51c2VTdGF0ZSgpO1xuICBjb25zdCBbcmVhY3RpdmUsIHNldFJlYWN0aXZlXSA9IFJlYWN0LnVzZVN0YXRlKFtdKTtcbiAgY29uc3Qgc2V0UmVmZXJlbmNlID0gdXNlRWZmZWN0RXZlbnQoKHgsIHkpID0+IHtcbiAgICBpZiAoaW5pdGlhbFJlZi5jdXJyZW50KSByZXR1cm47XG5cbiAgICAvLyBQcmV2ZW50IHNldHRpbmcgaWYgdGhlIG9wZW4gZXZlbnQgd2FzIG5vdCBhIG1vdXNlLWxpa2Ugb25lXG4gICAgLy8gKGUuZy4gZm9jdXMgdG8gb3BlbiwgdGhlbiBob3ZlciBvdmVyIHRoZSByZWZlcmVuY2UgZWxlbWVudCkuXG4gICAgLy8gT25seSBhcHBseSBpZiB0aGUgZXZlbnQgZXhpc3RzLlxuICAgIGlmIChkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50ICYmICFpc01vdXNlQmFzZWRFdmVudChkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZWZzLnNldFBvc2l0aW9uUmVmZXJlbmNlKGNyZWF0ZVZpcnR1YWxFbGVtZW50KGRvbVJlZmVyZW5jZSwge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBheGlzLFxuICAgICAgZGF0YVJlZixcbiAgICAgIHBvaW50ZXJUeXBlXG4gICAgfSkpO1xuICB9KTtcbiAgY29uc3QgaGFuZGxlUmVmZXJlbmNlRW50ZXJPck1vdmUgPSB1c2VFZmZlY3RFdmVudChldmVudCA9PiB7XG4gICAgaWYgKHggIT0gbnVsbCB8fCB5ICE9IG51bGwpIHJldHVybjtcbiAgICBpZiAoIW9wZW4pIHtcbiAgICAgIHNldFJlZmVyZW5jZShldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICB9IGVsc2UgaWYgKCFjbGVhbnVwTGlzdGVuZXJSZWYuY3VycmVudCkge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBjbGVhbnVwLCB0aGVyZSdzIG5vIGxpc3RlbmVyLCBidXQgd2Ugd2FudCB0byBlbnN1cmVcbiAgICAgIC8vIHdlIGFkZCB0aGUgbGlzdGVuZXIgaWYgdGhlIGN1cnNvciBsYW5kZWQgb24gdGhlIGZsb2F0aW5nIGVsZW1lbnQgYW5kXG4gICAgICAvLyB0aGVuIGJhY2sgb24gdGhlIHJlZmVyZW5jZSAoaS5lLiBpdCdzIGludGVyYWN0aXZlKS5cbiAgICAgIHNldFJlYWN0aXZlKFtdKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIElmIHRoZSBwb2ludGVyIGlzIGEgbW91c2UtbGlrZSBwb2ludGVyLCB3ZSB3YW50IHRvIGNvbnRpbnVlIGZvbGxvd2luZyB0aGVcbiAgLy8gbW91c2UgZXZlbiBpZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBpcyB0cmFuc2l0aW9uaW5nIG91dC4gT24gdG91Y2hcbiAgLy8gZGV2aWNlcywgdGhpcyBpcyB1bmRlc2lyYWJsZSBiZWNhdXNlIHRoZSBmbG9hdGluZyBlbGVtZW50IHdpbGwgbW92ZSB0b1xuICAvLyB0aGUgZGlzbWlzc2FsIHRvdWNoIHBvaW50LlxuICBjb25zdCBvcGVuQ2hlY2sgPSBpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlKSA/IGZsb2F0aW5nIDogb3BlbjtcbiAgY29uc3QgYWRkTGlzdGVuZXIgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gRXhwbGljaXRseSBzcGVjaWZpZWQgYHhgL2B5YCBjb29yZGluYXRlcyBzaG91bGRuJ3QgYWRkIGEgbGlzdGVuZXIuXG4gICAgaWYgKCFvcGVuQ2hlY2sgfHwgIWVuYWJsZWQgfHwgeCAhPSBudWxsIHx8IHkgIT0gbnVsbCkgcmV0dXJuO1xuICAgIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhmbG9hdGluZyk7XG4gICAgZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQpO1xuICAgICAgaWYgKCFjb250YWlucyhmbG9hdGluZywgdGFyZ2V0KSkge1xuICAgICAgICBzZXRSZWZlcmVuY2UoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgY2xlYW51cExpc3RlbmVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQgfHwgaXNNb3VzZUJhc2VkRXZlbnQoZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCkpIHtcbiAgICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgIGNsZWFudXBMaXN0ZW5lclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH07XG4gICAgICBjbGVhbnVwTGlzdGVuZXJSZWYuY3VycmVudCA9IGNsZWFudXA7XG4gICAgICByZXR1cm4gY2xlYW51cDtcbiAgICB9XG4gICAgcmVmcy5zZXRQb3NpdGlvblJlZmVyZW5jZShkb21SZWZlcmVuY2UpO1xuICB9LCBbb3BlbkNoZWNrLCBlbmFibGVkLCB4LCB5LCBmbG9hdGluZywgZGF0YVJlZiwgcmVmcywgZG9tUmVmZXJlbmNlLCBzZXRSZWZlcmVuY2VdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gYWRkTGlzdGVuZXIoKTtcbiAgfSwgW2FkZExpc3RlbmVyLCByZWFjdGl2ZV0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChlbmFibGVkICYmICFmbG9hdGluZykge1xuICAgICAgaW5pdGlhbFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgZmxvYXRpbmddKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQgJiYgb3Blbikge1xuICAgICAgaW5pdGlhbFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG4gIH0sIFtlbmFibGVkLCBvcGVuXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoZW5hYmxlZCAmJiAoeCAhPSBudWxsIHx8IHkgIT0gbnVsbCkpIHtcbiAgICAgIGluaXRpYWxSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgc2V0UmVmZXJlbmNlKHgsIHkpO1xuICAgIH1cbiAgfSwgW2VuYWJsZWQsIHgsIHksIHNldFJlZmVyZW5jZV0pO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBmdW5jdGlvbiBzZXRQb2ludGVyVHlwZVJlZihfcmVmKSB7XG4gICAgICBsZXQge1xuICAgICAgICBwb2ludGVyVHlwZVxuICAgICAgfSA9IF9yZWY7XG4gICAgICBzZXRQb2ludGVyVHlwZShwb2ludGVyVHlwZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBvblBvaW50ZXJEb3duOiBzZXRQb2ludGVyVHlwZVJlZixcbiAgICAgIG9uUG9pbnRlckVudGVyOiBzZXRQb2ludGVyVHlwZVJlZixcbiAgICAgIG9uTW91c2VNb3ZlOiBoYW5kbGVSZWZlcmVuY2VFbnRlck9yTW92ZSxcbiAgICAgIG9uTW91c2VFbnRlcjogaGFuZGxlUmVmZXJlbmNlRW50ZXJPck1vdmVcbiAgICB9O1xuICB9LCBbaGFuZGxlUmVmZXJlbmNlRW50ZXJPck1vdmVdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2VcbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlXSk7XG59XG5cbmNvbnN0IGJ1YmJsZUhhbmRsZXJLZXlzID0ge1xuICBwb2ludGVyZG93bjogJ29uUG9pbnRlckRvd24nLFxuICBtb3VzZWRvd246ICdvbk1vdXNlRG93bicsXG4gIGNsaWNrOiAnb25DbGljaydcbn07XG5jb25zdCBjYXB0dXJlSGFuZGxlcktleXMgPSB7XG4gIHBvaW50ZXJkb3duOiAnb25Qb2ludGVyRG93bkNhcHR1cmUnLFxuICBtb3VzZWRvd246ICdvbk1vdXNlRG93bkNhcHR1cmUnLFxuICBjbGljazogJ29uQ2xpY2tDYXB0dXJlJ1xufTtcbmNvbnN0IG5vcm1hbGl6ZVByb3AgPSBub3JtYWxpemFibGUgPT4ge1xuICB2YXIgX25vcm1hbGl6YWJsZSRlc2NhcGVLLCBfbm9ybWFsaXphYmxlJG91dHNpZGU7XG4gIHJldHVybiB7XG4gICAgZXNjYXBlS2V5OiB0eXBlb2Ygbm9ybWFsaXphYmxlID09PSAnYm9vbGVhbicgPyBub3JtYWxpemFibGUgOiAoX25vcm1hbGl6YWJsZSRlc2NhcGVLID0gbm9ybWFsaXphYmxlID09IG51bGwgPyB2b2lkIDAgOiBub3JtYWxpemFibGUuZXNjYXBlS2V5KSAhPSBudWxsID8gX25vcm1hbGl6YWJsZSRlc2NhcGVLIDogZmFsc2UsXG4gICAgb3V0c2lkZVByZXNzOiB0eXBlb2Ygbm9ybWFsaXphYmxlID09PSAnYm9vbGVhbicgPyBub3JtYWxpemFibGUgOiAoX25vcm1hbGl6YWJsZSRvdXRzaWRlID0gbm9ybWFsaXphYmxlID09IG51bGwgPyB2b2lkIDAgOiBub3JtYWxpemFibGUub3V0c2lkZVByZXNzKSAhPSBudWxsID8gX25vcm1hbGl6YWJsZSRvdXRzaWRlIDogdHJ1ZVxuICB9O1xufTtcbi8qKlxuICogQ2xvc2VzIHRoZSBmbG9hdGluZyBlbGVtZW50IHdoZW4gYSBkaXNtaXNzYWwgaXMgcmVxdWVzdGVkIOKAlCBieSBkZWZhdWx0LCB3aGVuXG4gKiB0aGUgdXNlciBwcmVzc2VzIHRoZSBgZXNjYXBlYCBrZXkgb3Igb3V0c2lkZSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VEaXNtaXNzXG4gKi9cbmZ1bmN0aW9uIHVzZURpc21pc3MoY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBlbGVtZW50cyxcbiAgICBkYXRhUmVmXG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgZXNjYXBlS2V5ID0gdHJ1ZSxcbiAgICBvdXRzaWRlUHJlc3M6IHVuc3RhYmxlX291dHNpZGVQcmVzcyA9IHRydWUsXG4gICAgb3V0c2lkZVByZXNzRXZlbnQgPSAncG9pbnRlcmRvd24nLFxuICAgIHJlZmVyZW5jZVByZXNzID0gZmFsc2UsXG4gICAgcmVmZXJlbmNlUHJlc3NFdmVudCA9ICdwb2ludGVyZG93bicsXG4gICAgYW5jZXN0b3JTY3JvbGwgPSBmYWxzZSxcbiAgICBidWJibGVzLFxuICAgIGNhcHR1cmVcbiAgfSA9IHByb3BzO1xuICBjb25zdCB0cmVlID0gdXNlRmxvYXRpbmdUcmVlKCk7XG4gIGNvbnN0IG91dHNpZGVQcmVzc0ZuID0gdXNlRWZmZWN0RXZlbnQodHlwZW9mIHVuc3RhYmxlX291dHNpZGVQcmVzcyA9PT0gJ2Z1bmN0aW9uJyA/IHVuc3RhYmxlX291dHNpZGVQcmVzcyA6ICgpID0+IGZhbHNlKTtcbiAgY29uc3Qgb3V0c2lkZVByZXNzID0gdHlwZW9mIHVuc3RhYmxlX291dHNpZGVQcmVzcyA9PT0gJ2Z1bmN0aW9uJyA/IG91dHNpZGVQcmVzc0ZuIDogdW5zdGFibGVfb3V0c2lkZVByZXNzO1xuICBjb25zdCBpbnNpZGVSZWFjdFRyZWVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBlbmRlZE9yU3RhcnRlZEluc2lkZVJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHtcbiAgICBlc2NhcGVLZXk6IGVzY2FwZUtleUJ1YmJsZXMsXG4gICAgb3V0c2lkZVByZXNzOiBvdXRzaWRlUHJlc3NCdWJibGVzXG4gIH0gPSBub3JtYWxpemVQcm9wKGJ1YmJsZXMpO1xuICBjb25zdCB7XG4gICAgZXNjYXBlS2V5OiBlc2NhcGVLZXlDYXB0dXJlLFxuICAgIG91dHNpZGVQcmVzczogb3V0c2lkZVByZXNzQ2FwdHVyZVxuICB9ID0gbm9ybWFsaXplUHJvcChjYXB0dXJlKTtcbiAgY29uc3QgY2xvc2VPbkVzY2FwZUtleURvd24gPSB1c2VFZmZlY3RFdmVudChldmVudCA9PiB7XG4gICAgdmFyIF9kYXRhUmVmJGN1cnJlbnQkZmxvYTtcbiAgICBpZiAoIW9wZW4gfHwgIWVuYWJsZWQgfHwgIWVzY2FwZUtleSB8fCBldmVudC5rZXkgIT09ICdFc2NhcGUnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5vZGVJZCA9IChfZGF0YVJlZiRjdXJyZW50JGZsb2EgPSBkYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX2RhdGFSZWYkY3VycmVudCRmbG9hLm5vZGVJZDtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRyZWUgPyBnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkgOiBbXTtcbiAgICBpZiAoIWVzY2FwZUtleUJ1YmJsZXMpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IHNob3VsZERpc21pc3MgPSB0cnVlO1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICB2YXIgX2NoaWxkJGNvbnRleHQ7XG4gICAgICAgICAgaWYgKChfY2hpbGQkY29udGV4dCA9IGNoaWxkLmNvbnRleHQpICE9IG51bGwgJiYgX2NoaWxkJGNvbnRleHQub3BlbiAmJiAhY2hpbGQuY29udGV4dC5kYXRhUmVmLmN1cnJlbnQuX19lc2NhcGVLZXlCdWJibGVzKSB7XG4gICAgICAgICAgICBzaG91bGREaXNtaXNzID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFzaG91bGREaXNtaXNzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgaXNSZWFjdEV2ZW50KGV2ZW50KSA/IGV2ZW50Lm5hdGl2ZUV2ZW50IDogZXZlbnQsICdlc2NhcGUta2V5Jyk7XG4gIH0pO1xuICBjb25zdCBjbG9zZU9uRXNjYXBlS2V5RG93bkNhcHR1cmUgPSB1c2VFZmZlY3RFdmVudChldmVudCA9PiB7XG4gICAgdmFyIF9nZXRUYXJnZXQyO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdmFyIF9nZXRUYXJnZXQ7XG4gICAgICBjbG9zZU9uRXNjYXBlS2V5RG93bihldmVudCk7XG4gICAgICAoX2dldFRhcmdldCA9IGdldFRhcmdldChldmVudCkpID09IG51bGwgfHwgX2dldFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2FsbGJhY2spO1xuICAgIH07XG4gICAgKF9nZXRUYXJnZXQyID0gZ2V0VGFyZ2V0KGV2ZW50KSkgPT0gbnVsbCB8fCBfZ2V0VGFyZ2V0Mi5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2FsbGJhY2spO1xuICB9KTtcbiAgY29uc3QgY2xvc2VPblByZXNzT3V0c2lkZSA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICB2YXIgX2RhdGFSZWYkY3VycmVudCRmbG9hMjtcbiAgICAvLyBHaXZlbiBkZXZlbG9wZXJzIGNhbiBzdG9wIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGUgc3ludGhldGljIGV2ZW50LFxuICAgIC8vIHdlIGNhbiBvbmx5IGJlIGNvbmZpZGVudCB3aXRoIGEgcG9zaXRpdmUgdmFsdWUuXG4gICAgY29uc3QgaW5zaWRlUmVhY3RUcmVlID0gaW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQ7XG4gICAgaW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSBmYWxzZTtcblxuICAgIC8vIFdoZW4gY2xpY2sgb3V0c2lkZSBpcyBsYXp5IChgY2xpY2tgIGV2ZW50KSwgaGFuZGxlIGRyYWdnaW5nLlxuICAgIC8vIERvbid0IGNsb3NlIGlmOlxuICAgIC8vIC0gVGhlIGNsaWNrIHN0YXJ0ZWQgaW5zaWRlIHRoZSBmbG9hdGluZyBlbGVtZW50LlxuICAgIC8vIC0gVGhlIGNsaWNrIGVuZGVkIGluc2lkZSB0aGUgZmxvYXRpbmcgZWxlbWVudC5cbiAgICBjb25zdCBlbmRlZE9yU3RhcnRlZEluc2lkZSA9IGVuZGVkT3JTdGFydGVkSW5zaWRlUmVmLmN1cnJlbnQ7XG4gICAgZW5kZWRPclN0YXJ0ZWRJbnNpZGVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGlmIChvdXRzaWRlUHJlc3NFdmVudCA9PT0gJ2NsaWNrJyAmJiBlbmRlZE9yU3RhcnRlZEluc2lkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW5zaWRlUmVhY3RUcmVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3V0c2lkZVByZXNzID09PSAnZnVuY3Rpb24nICYmICFvdXRzaWRlUHJlc3MoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudCk7XG4gICAgY29uc3QgaW5lcnRTZWxlY3RvciA9IFwiW1wiICsgY3JlYXRlQXR0cmlidXRlKCdpbmVydCcpICsgXCJdXCI7XG4gICAgY29uc3QgbWFya2VycyA9IGdldERvY3VtZW50KGVsZW1lbnRzLmZsb2F0aW5nKS5xdWVyeVNlbGVjdG9yQWxsKGluZXJ0U2VsZWN0b3IpO1xuICAgIGxldCB0YXJnZXRSb290QW5jZXN0b3IgPSBpc0VsZW1lbnQodGFyZ2V0KSA/IHRhcmdldCA6IG51bGw7XG4gICAgd2hpbGUgKHRhcmdldFJvb3RBbmNlc3RvciAmJiAhaXNMYXN0VHJhdmVyc2FibGVOb2RlKHRhcmdldFJvb3RBbmNlc3RvcikpIHtcbiAgICAgIGNvbnN0IG5leHRQYXJlbnQgPSBnZXRQYXJlbnROb2RlKHRhcmdldFJvb3RBbmNlc3Rvcik7XG4gICAgICBpZiAoaXNMYXN0VHJhdmVyc2FibGVOb2RlKG5leHRQYXJlbnQpIHx8ICFpc0VsZW1lbnQobmV4dFBhcmVudCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0YXJnZXRSb290QW5jZXN0b3IgPSBuZXh0UGFyZW50O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBjbGljayBvY2N1cnJlZCBvbiBhIHRoaXJkLXBhcnR5IGVsZW1lbnQgaW5qZWN0ZWQgYWZ0ZXIgdGhlXG4gICAgLy8gZmxvYXRpbmcgZWxlbWVudCByZW5kZXJlZC5cbiAgICBpZiAobWFya2Vycy5sZW5ndGggJiYgaXNFbGVtZW50KHRhcmdldCkgJiYgIWlzUm9vdEVsZW1lbnQodGFyZ2V0KSAmJlxuICAgIC8vIENsaWNrZWQgb24gYSBkaXJlY3QgYW5jZXN0b3IgKGUuZy4gRmxvYXRpbmdPdmVybGF5KS5cbiAgICAhY29udGFpbnModGFyZ2V0LCBlbGVtZW50cy5mbG9hdGluZykgJiZcbiAgICAvLyBJZiB0aGUgdGFyZ2V0IHJvb3QgZWxlbWVudCBjb250YWlucyBub25lIG9mIHRoZSBtYXJrZXJzLCB0aGVuIHRoZVxuICAgIC8vIGVsZW1lbnQgd2FzIGluamVjdGVkIGFmdGVyIHRoZSBmbG9hdGluZyBlbGVtZW50IHJlbmRlcmVkLlxuICAgIEFycmF5LmZyb20obWFya2VycykuZXZlcnkobWFya2VyID0+ICFjb250YWlucyh0YXJnZXRSb290QW5jZXN0b3IsIG1hcmtlcikpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWNrIG9jY3VycmVkIG9uIHRoZSBzY3JvbGxiYXJcbiAgICBpZiAoaXNIVE1MRWxlbWVudCh0YXJnZXQpICYmIGZsb2F0aW5nKSB7XG4gICAgICAvLyBJbiBGaXJlZm94LCBgdGFyZ2V0LnNjcm9sbFdpZHRoID4gdGFyZ2V0LmNsaWVudFdpZHRoYCBmb3IgaW5saW5lXG4gICAgICAvLyBlbGVtZW50cy5cbiAgICAgIGNvbnN0IGNhblNjcm9sbFggPSB0YXJnZXQuY2xpZW50V2lkdGggPiAwICYmIHRhcmdldC5zY3JvbGxXaWR0aCA+IHRhcmdldC5jbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IGNhblNjcm9sbFkgPSB0YXJnZXQuY2xpZW50SGVpZ2h0ID4gMCAmJiB0YXJnZXQuc2Nyb2xsSGVpZ2h0ID4gdGFyZ2V0LmNsaWVudEhlaWdodDtcbiAgICAgIGxldCB4Q29uZCA9IGNhblNjcm9sbFkgJiYgZXZlbnQub2Zmc2V0WCA+IHRhcmdldC5jbGllbnRXaWR0aDtcblxuICAgICAgLy8gSW4gc29tZSBicm93c2VycyBpdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIDxib2R5PiAob3Igd2luZG93KVxuICAgICAgLy8gc2Nyb2xsYmFyIHRvIHRoZSBsZWZ0IHNpZGUsIGJ1dCBpcyB2ZXJ5IHJhcmUgYW5kIGlzIGRpZmZpY3VsdCB0b1xuICAgICAgLy8gY2hlY2sgZm9yLiBQbHVzLCBmb3IgbW9kYWwgZGlhbG9ncyB3aXRoIGJhY2tkcm9wcywgaXQgaXMgbW9yZVxuICAgICAgLy8gaW1wb3J0YW50IHRoYXQgdGhlIGJhY2tkcm9wIGlzIGNoZWNrZWQgYnV0IG5vdCBzbyBtdWNoIHRoZSB3aW5kb3cuXG4gICAgICBpZiAoY2FuU2Nyb2xsWSkge1xuICAgICAgICBjb25zdCBpc1JUTCA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5kaXJlY3Rpb24gPT09ICdydGwnO1xuICAgICAgICBpZiAoaXNSVEwpIHtcbiAgICAgICAgICB4Q29uZCA9IGV2ZW50Lm9mZnNldFggPD0gdGFyZ2V0Lm9mZnNldFdpZHRoIC0gdGFyZ2V0LmNsaWVudFdpZHRoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoeENvbmQgfHwgY2FuU2Nyb2xsWCAmJiBldmVudC5vZmZzZXRZID4gdGFyZ2V0LmNsaWVudEhlaWdodCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5vZGVJZCA9IChfZGF0YVJlZiRjdXJyZW50JGZsb2EyID0gZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhUmVmJGN1cnJlbnQkZmxvYTIubm9kZUlkO1xuICAgIGNvbnN0IHRhcmdldElzSW5zaWRlQ2hpbGRyZW4gPSB0cmVlICYmIGdldENoaWxkcmVuKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKS5zb21lKG5vZGUgPT4ge1xuICAgICAgdmFyIF9ub2RlJGNvbnRleHQ7XG4gICAgICByZXR1cm4gaXNFdmVudFRhcmdldFdpdGhpbihldmVudCwgKF9ub2RlJGNvbnRleHQgPSBub2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRjb250ZXh0LmVsZW1lbnRzLmZsb2F0aW5nKTtcbiAgICB9KTtcbiAgICBpZiAoaXNFdmVudFRhcmdldFdpdGhpbihldmVudCwgZWxlbWVudHMuZmxvYXRpbmcpIHx8IGlzRXZlbnRUYXJnZXRXaXRoaW4oZXZlbnQsIGVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgfHwgdGFyZ2V0SXNJbnNpZGVDaGlsZHJlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRyZWUgPyBnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkgOiBbXTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHNob3VsZERpc21pc3MgPSB0cnVlO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIHZhciBfY2hpbGQkY29udGV4dDI7XG4gICAgICAgIGlmICgoX2NoaWxkJGNvbnRleHQyID0gY2hpbGQuY29udGV4dCkgIT0gbnVsbCAmJiBfY2hpbGQkY29udGV4dDIub3BlbiAmJiAhY2hpbGQuY29udGV4dC5kYXRhUmVmLmN1cnJlbnQuX19vdXRzaWRlUHJlc3NCdWJibGVzKSB7XG4gICAgICAgICAgc2hvdWxkRGlzbWlzcyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIXNob3VsZERpc21pc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50LCAnb3V0c2lkZS1wcmVzcycpO1xuICB9KTtcbiAgY29uc3QgY2xvc2VPblByZXNzT3V0c2lkZUNhcHR1cmUgPSB1c2VFZmZlY3RFdmVudChldmVudCA9PiB7XG4gICAgdmFyIF9nZXRUYXJnZXQ0O1xuICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdmFyIF9nZXRUYXJnZXQzO1xuICAgICAgY2xvc2VPblByZXNzT3V0c2lkZShldmVudCk7XG4gICAgICAoX2dldFRhcmdldDMgPSBnZXRUYXJnZXQoZXZlbnQpKSA9PSBudWxsIHx8IF9nZXRUYXJnZXQzLnJlbW92ZUV2ZW50TGlzdGVuZXIob3V0c2lkZVByZXNzRXZlbnQsIGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIChfZ2V0VGFyZ2V0NCA9IGdldFRhcmdldChldmVudCkpID09IG51bGwgfHwgX2dldFRhcmdldDQuYWRkRXZlbnRMaXN0ZW5lcihvdXRzaWRlUHJlc3NFdmVudCwgY2FsbGJhY2spO1xuICB9KTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW9wZW4gfHwgIWVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGF0YVJlZi5jdXJyZW50Ll9fZXNjYXBlS2V5QnViYmxlcyA9IGVzY2FwZUtleUJ1YmJsZXM7XG4gICAgZGF0YVJlZi5jdXJyZW50Ll9fb3V0c2lkZVByZXNzQnViYmxlcyA9IG91dHNpZGVQcmVzc0J1YmJsZXM7XG4gICAgZnVuY3Rpb24gb25TY3JvbGwoZXZlbnQpIHtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQsICdhbmNlc3Rvci1zY3JvbGwnKTtcbiAgICB9XG4gICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpO1xuICAgIGVzY2FwZUtleSAmJiBkb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVzY2FwZUtleUNhcHR1cmUgPyBjbG9zZU9uRXNjYXBlS2V5RG93bkNhcHR1cmUgOiBjbG9zZU9uRXNjYXBlS2V5RG93biwgZXNjYXBlS2V5Q2FwdHVyZSk7XG4gICAgb3V0c2lkZVByZXNzICYmIGRvYy5hZGRFdmVudExpc3RlbmVyKG91dHNpZGVQcmVzc0V2ZW50LCBvdXRzaWRlUHJlc3NDYXB0dXJlID8gY2xvc2VPblByZXNzT3V0c2lkZUNhcHR1cmUgOiBjbG9zZU9uUHJlc3NPdXRzaWRlLCBvdXRzaWRlUHJlc3NDYXB0dXJlKTtcbiAgICBsZXQgYW5jZXN0b3JzID0gW107XG4gICAgaWYgKGFuY2VzdG9yU2Nyb2xsKSB7XG4gICAgICBpZiAoaXNFbGVtZW50KGVsZW1lbnRzLmRvbVJlZmVyZW5jZSkpIHtcbiAgICAgICAgYW5jZXN0b3JzID0gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZWxlbWVudHMuZG9tUmVmZXJlbmNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0VsZW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpKSB7XG4gICAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5jb25jYXQoZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZWxlbWVudHMuZmxvYXRpbmcpKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNFbGVtZW50KGVsZW1lbnRzLnJlZmVyZW5jZSkgJiYgZWxlbWVudHMucmVmZXJlbmNlICYmIGVsZW1lbnRzLnJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkge1xuICAgICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMuY29uY2F0KGdldE92ZXJmbG93QW5jZXN0b3JzKGVsZW1lbnRzLnJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElnbm9yZSB0aGUgdmlzdWFsIHZpZXdwb3J0IGZvciBzY3JvbGxpbmcgZGlzbWlzc2FsIChhbGxvdyBwaW5jaC16b29tKVxuICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5maWx0ZXIoYW5jZXN0b3IgPT4ge1xuICAgICAgdmFyIF9kb2MkZGVmYXVsdFZpZXc7XG4gICAgICByZXR1cm4gYW5jZXN0b3IgIT09ICgoX2RvYyRkZWZhdWx0VmlldyA9IGRvYy5kZWZhdWx0VmlldykgPT0gbnVsbCA/IHZvaWQgMCA6IF9kb2MkZGVmYXVsdFZpZXcudmlzdWFsVmlld3BvcnQpO1xuICAgIH0pO1xuICAgIGFuY2VzdG9ycy5mb3JFYWNoKGFuY2VzdG9yID0+IHtcbiAgICAgIGFuY2VzdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsLCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBlc2NhcGVLZXkgJiYgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlc2NhcGVLZXlDYXB0dXJlID8gY2xvc2VPbkVzY2FwZUtleURvd25DYXB0dXJlIDogY2xvc2VPbkVzY2FwZUtleURvd24sIGVzY2FwZUtleUNhcHR1cmUpO1xuICAgICAgb3V0c2lkZVByZXNzICYmIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKG91dHNpZGVQcmVzc0V2ZW50LCBvdXRzaWRlUHJlc3NDYXB0dXJlID8gY2xvc2VPblByZXNzT3V0c2lkZUNhcHR1cmUgOiBjbG9zZU9uUHJlc3NPdXRzaWRlLCBvdXRzaWRlUHJlc3NDYXB0dXJlKTtcbiAgICAgIGFuY2VzdG9ycy5mb3JFYWNoKGFuY2VzdG9yID0+IHtcbiAgICAgICAgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGwpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSwgW2RhdGFSZWYsIGVsZW1lbnRzLCBlc2NhcGVLZXksIG91dHNpZGVQcmVzcywgb3V0c2lkZVByZXNzRXZlbnQsIG9wZW4sIG9uT3BlbkNoYW5nZSwgYW5jZXN0b3JTY3JvbGwsIGVuYWJsZWQsIGVzY2FwZUtleUJ1YmJsZXMsIG91dHNpZGVQcmVzc0J1YmJsZXMsIGNsb3NlT25Fc2NhcGVLZXlEb3duLCBlc2NhcGVLZXlDYXB0dXJlLCBjbG9zZU9uRXNjYXBlS2V5RG93bkNhcHR1cmUsIGNsb3NlT25QcmVzc091dHNpZGUsIG91dHNpZGVQcmVzc0NhcHR1cmUsIGNsb3NlT25QcmVzc091dHNpZGVDYXB0dXJlXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgfSwgW291dHNpZGVQcmVzcywgb3V0c2lkZVByZXNzRXZlbnRdKTtcbiAgY29uc3QgcmVmZXJlbmNlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIG9uS2V5RG93bjogY2xvc2VPbkVzY2FwZUtleURvd24sXG4gICAgW2J1YmJsZUhhbmRsZXJLZXlzW3JlZmVyZW5jZVByZXNzRXZlbnRdXTogZXZlbnQgPT4ge1xuICAgICAgaWYgKHJlZmVyZW5jZVByZXNzKSB7XG4gICAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQubmF0aXZlRXZlbnQsICdyZWZlcmVuY2UtcHJlc3MnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pLCBbY2xvc2VPbkVzY2FwZUtleURvd24sIG9uT3BlbkNoYW5nZSwgcmVmZXJlbmNlUHJlc3MsIHJlZmVyZW5jZVByZXNzRXZlbnRdKTtcbiAgY29uc3QgZmxvYXRpbmcgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgb25LZXlEb3duOiBjbG9zZU9uRXNjYXBlS2V5RG93bixcbiAgICBvbk1vdXNlRG93bigpIHtcbiAgICAgIGVuZGVkT3JTdGFydGVkSW5zaWRlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH0sXG4gICAgb25Nb3VzZVVwKCkge1xuICAgICAgZW5kZWRPclN0YXJ0ZWRJbnNpZGVSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfSxcbiAgICBbY2FwdHVyZUhhbmRsZXJLZXlzW291dHNpZGVQcmVzc0V2ZW50XV06ICgpID0+IHtcbiAgICAgIGluc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG4gIH0pLCBbY2xvc2VPbkVzY2FwZUtleURvd24sIG91dHNpZGVQcmVzc0V2ZW50XSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IGVuYWJsZWQgPyB7XG4gICAgcmVmZXJlbmNlLFxuICAgIGZsb2F0aW5nXG4gIH0gOiB7fSwgW2VuYWJsZWQsIHJlZmVyZW5jZSwgZmxvYXRpbmddKTtcbn1cblxuZnVuY3Rpb24gdXNlRmxvYXRpbmdSb290Q29udGV4dChvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBvcGVuID0gZmFsc2UsXG4gICAgb25PcGVuQ2hhbmdlOiBvbk9wZW5DaGFuZ2VQcm9wLFxuICAgIGVsZW1lbnRzOiBlbGVtZW50c1Byb3BcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGZsb2F0aW5nSWQgPSB1c2VJZCgpO1xuICBjb25zdCBkYXRhUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcbiAgY29uc3QgW2V2ZW50c10gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBjcmVhdGVQdWJTdWIoKSk7XG4gIGNvbnN0IG5lc3RlZCA9IHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkKCkgIT0gbnVsbDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGNvbnN0IG9wdGlvbkRvbVJlZmVyZW5jZSA9IGVsZW1lbnRzUHJvcC5yZWZlcmVuY2U7XG4gICAgaWYgKG9wdGlvbkRvbVJlZmVyZW5jZSAmJiAhaXNFbGVtZW50KG9wdGlvbkRvbVJlZmVyZW5jZSkpIHtcbiAgICAgIGVycm9yKCdDYW5ub3QgcGFzcyBhIHZpcnR1YWwgZWxlbWVudCB0byB0aGUgYGVsZW1lbnRzLnJlZmVyZW5jZWAgb3B0aW9uLCcsICdhcyBpdCBtdXN0IGJlIGEgcmVhbCBET00gZWxlbWVudC4gVXNlIGByZWZzLnNldFBvc2l0aW9uUmVmZXJlbmNlKClgJywgJ2luc3RlYWQuJyk7XG4gICAgfVxuICB9XG4gIGNvbnN0IFtwb3NpdGlvblJlZmVyZW5jZSwgc2V0UG9zaXRpb25SZWZlcmVuY2VdID0gUmVhY3QudXNlU3RhdGUoZWxlbWVudHNQcm9wLnJlZmVyZW5jZSk7XG4gIGNvbnN0IG9uT3BlbkNoYW5nZSA9IHVzZUVmZmVjdEV2ZW50KChvcGVuLCBldmVudCwgcmVhc29uKSA9PiB7XG4gICAgZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCA9IG9wZW4gPyBldmVudCA6IHVuZGVmaW5lZDtcbiAgICBldmVudHMuZW1pdCgnb3BlbmNoYW5nZScsIHtcbiAgICAgIG9wZW4sXG4gICAgICBldmVudCxcbiAgICAgIHJlYXNvbixcbiAgICAgIG5lc3RlZFxuICAgIH0pO1xuICAgIG9uT3BlbkNoYW5nZVByb3AgPT0gbnVsbCB8fCBvbk9wZW5DaGFuZ2VQcm9wKG9wZW4sIGV2ZW50LCByZWFzb24pO1xuICB9KTtcbiAgY29uc3QgcmVmcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBzZXRQb3NpdGlvblJlZmVyZW5jZVxuICB9KSwgW10pO1xuICBjb25zdCBlbGVtZW50cyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICByZWZlcmVuY2U6IHBvc2l0aW9uUmVmZXJlbmNlIHx8IGVsZW1lbnRzUHJvcC5yZWZlcmVuY2UgfHwgbnVsbCxcbiAgICBmbG9hdGluZzogZWxlbWVudHNQcm9wLmZsb2F0aW5nIHx8IG51bGwsXG4gICAgZG9tUmVmZXJlbmNlOiBlbGVtZW50c1Byb3AucmVmZXJlbmNlXG4gIH0pLCBbcG9zaXRpb25SZWZlcmVuY2UsIGVsZW1lbnRzUHJvcC5yZWZlcmVuY2UsIGVsZW1lbnRzUHJvcC5mbG9hdGluZ10pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGRhdGFSZWYsXG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZWxlbWVudHMsXG4gICAgZXZlbnRzLFxuICAgIGZsb2F0aW5nSWQsXG4gICAgcmVmc1xuICB9KSwgW29wZW4sIG9uT3BlbkNoYW5nZSwgZWxlbWVudHMsIGV2ZW50cywgZmxvYXRpbmdJZCwgcmVmc10pO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gcG9zaXRpb24gYSBmbG9hdGluZyBlbGVtZW50IGFuZCBjb250ZXh0IHRvIGFkZCBpbnRlcmFjdGlvbnMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlRmxvYXRpbmdcbiAqL1xuZnVuY3Rpb24gdXNlRmxvYXRpbmcob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBub2RlSWRcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGludGVybmFsUm9vdENvbnRleHQgPSB1c2VGbG9hdGluZ1Jvb3RDb250ZXh0KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGVsZW1lbnRzOiB7XG4gICAgICByZWZlcmVuY2U6IG51bGwsXG4gICAgICBmbG9hdGluZzogbnVsbCxcbiAgICAgIC4uLm9wdGlvbnMuZWxlbWVudHNcbiAgICB9XG4gIH0pO1xuICBjb25zdCByb290Q29udGV4dCA9IG9wdGlvbnMucm9vdENvbnRleHQgfHwgaW50ZXJuYWxSb290Q29udGV4dDtcbiAgY29uc3QgY29tcHV0ZWRFbGVtZW50cyA9IHJvb3RDb250ZXh0LmVsZW1lbnRzO1xuICBjb25zdCBbX2RvbVJlZmVyZW5jZSwgc2V0RG9tUmVmZXJlbmNlXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbcG9zaXRpb25SZWZlcmVuY2UsIF9zZXRQb3NpdGlvblJlZmVyZW5jZV0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3Qgb3B0aW9uRG9tUmVmZXJlbmNlID0gY29tcHV0ZWRFbGVtZW50cyA9PSBudWxsID8gdm9pZCAwIDogY29tcHV0ZWRFbGVtZW50cy5yZWZlcmVuY2U7XG4gIGNvbnN0IGRvbVJlZmVyZW5jZSA9IG9wdGlvbkRvbVJlZmVyZW5jZSB8fCBfZG9tUmVmZXJlbmNlO1xuICBjb25zdCBkb21SZWZlcmVuY2VSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IHRyZWUgPSB1c2VGbG9hdGluZ1RyZWUoKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChkb21SZWZlcmVuY2UpIHtcbiAgICAgIGRvbVJlZmVyZW5jZVJlZi5jdXJyZW50ID0gZG9tUmVmZXJlbmNlO1xuICAgIH1cbiAgfSwgW2RvbVJlZmVyZW5jZV0pO1xuICBjb25zdCBwb3NpdGlvbiA9IHVzZUZsb2F0aW5nJDEoe1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIC4uLmNvbXB1dGVkRWxlbWVudHMsXG4gICAgICAuLi4ocG9zaXRpb25SZWZlcmVuY2UgJiYge1xuICAgICAgICByZWZlcmVuY2U6IHBvc2l0aW9uUmVmZXJlbmNlXG4gICAgICB9KVxuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHNldFBvc2l0aW9uUmVmZXJlbmNlID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgY29uc3QgY29tcHV0ZWRQb3NpdGlvblJlZmVyZW5jZSA9IGlzRWxlbWVudChub2RlKSA/IHtcbiAgICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdDogKCkgPT4gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIGNvbnRleHRFbGVtZW50OiBub2RlXG4gICAgfSA6IG5vZGU7XG4gICAgLy8gU3RvcmUgdGhlIHBvc2l0aW9uUmVmZXJlbmNlIGluIHN0YXRlIGlmIHRoZSBET00gcmVmZXJlbmNlIGlzIHNwZWNpZmllZCBleHRlcm5hbGx5IHZpYSB0aGVcbiAgICAvLyBgZWxlbWVudHMucmVmZXJlbmNlYCBvcHRpb24uIFRoaXMgZW5zdXJlcyB0aGF0IGl0IHdvbid0IGJlIG92ZXJyaWRkZW4gb24gZnV0dXJlIHJlbmRlcnMuXG4gICAgX3NldFBvc2l0aW9uUmVmZXJlbmNlKGNvbXB1dGVkUG9zaXRpb25SZWZlcmVuY2UpO1xuICAgIHBvc2l0aW9uLnJlZnMuc2V0UmVmZXJlbmNlKGNvbXB1dGVkUG9zaXRpb25SZWZlcmVuY2UpO1xuICB9LCBbcG9zaXRpb24ucmVmc10pO1xuICBjb25zdCBzZXRSZWZlcmVuY2UgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBpZiAoaXNFbGVtZW50KG5vZGUpIHx8IG5vZGUgPT09IG51bGwpIHtcbiAgICAgIGRvbVJlZmVyZW5jZVJlZi5jdXJyZW50ID0gbm9kZTtcbiAgICAgIHNldERvbVJlZmVyZW5jZShub2RlKTtcbiAgICB9XG5cbiAgICAvLyBCYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgcGFzc2luZyBhIHZpcnR1YWwgZWxlbWVudCB0byBgcmVmZXJlbmNlYFxuICAgIC8vIGFmdGVyIGl0IGhhcyBzZXQgdGhlIERPTSByZWZlcmVuY2UuXG4gICAgaWYgKGlzRWxlbWVudChwb3NpdGlvbi5yZWZzLnJlZmVyZW5jZS5jdXJyZW50KSB8fCBwb3NpdGlvbi5yZWZzLnJlZmVyZW5jZS5jdXJyZW50ID09PSBudWxsIHx8XG4gICAgLy8gRG9uJ3QgYWxsb3cgc2V0dGluZyB2aXJ0dWFsIGVsZW1lbnRzIHVzaW5nIHRoZSBvbGQgdGVjaG5pcXVlIGJhY2sgdG9cbiAgICAvLyBgbnVsbGAgdG8gc3VwcG9ydCBgcG9zaXRpb25SZWZlcmVuY2VgICsgYW4gdW5zdGFibGUgYHJlZmVyZW5jZWBcbiAgICAvLyBjYWxsYmFjayByZWYuXG4gICAgbm9kZSAhPT0gbnVsbCAmJiAhaXNFbGVtZW50KG5vZGUpKSB7XG4gICAgICBwb3NpdGlvbi5yZWZzLnNldFJlZmVyZW5jZShub2RlKTtcbiAgICB9XG4gIH0sIFtwb3NpdGlvbi5yZWZzXSk7XG4gIGNvbnN0IHJlZnMgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgLi4ucG9zaXRpb24ucmVmcyxcbiAgICBzZXRSZWZlcmVuY2UsXG4gICAgc2V0UG9zaXRpb25SZWZlcmVuY2UsXG4gICAgZG9tUmVmZXJlbmNlOiBkb21SZWZlcmVuY2VSZWZcbiAgfSksIFtwb3NpdGlvbi5yZWZzLCBzZXRSZWZlcmVuY2UsIHNldFBvc2l0aW9uUmVmZXJlbmNlXSk7XG4gIGNvbnN0IGVsZW1lbnRzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIC4uLnBvc2l0aW9uLmVsZW1lbnRzLFxuICAgIGRvbVJlZmVyZW5jZTogZG9tUmVmZXJlbmNlXG4gIH0pLCBbcG9zaXRpb24uZWxlbWVudHMsIGRvbVJlZmVyZW5jZV0pO1xuICBjb25zdCBjb250ZXh0ID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIC4uLnBvc2l0aW9uLFxuICAgIC4uLnJvb3RDb250ZXh0LFxuICAgIHJlZnMsXG4gICAgZWxlbWVudHMsXG4gICAgbm9kZUlkXG4gIH0pLCBbcG9zaXRpb24sIHJlZnMsIGVsZW1lbnRzLCBub2RlSWQsIHJvb3RDb250ZXh0XSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICByb290Q29udGV4dC5kYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0ID0gY29udGV4dDtcbiAgICBjb25zdCBub2RlID0gdHJlZSA9PSBudWxsID8gdm9pZCAwIDogdHJlZS5ub2Rlc1JlZi5jdXJyZW50LmZpbmQobm9kZSA9PiBub2RlLmlkID09PSBub2RlSWQpO1xuICAgIGlmIChub2RlKSB7XG4gICAgICBub2RlLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgLi4ucG9zaXRpb24sXG4gICAgY29udGV4dCxcbiAgICByZWZzLFxuICAgIGVsZW1lbnRzXG4gIH0pLCBbcG9zaXRpb24sIHJlZnMsIGVsZW1lbnRzLCBjb250ZXh0XSk7XG59XG5cbi8qKlxuICogT3BlbnMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgd2hpbGUgdGhlIHJlZmVyZW5jZSBlbGVtZW50IGhhcyBmb2N1cywgbGlrZSBDU1NcbiAqIGA6Zm9jdXNgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUZvY3VzXG4gKi9cbmZ1bmN0aW9uIHVzZUZvY3VzKGNvbnRleHQsIHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZXZlbnRzLFxuICAgIGRhdGFSZWYsXG4gICAgZWxlbWVudHNcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB2aXNpYmxlT25seSA9IHRydWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCBibG9ja0ZvY3VzUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgdGltZW91dFJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBjb25zdCBrZXlib2FyZE1vZGFsaXR5UmVmID0gUmVhY3QudXNlUmVmKHRydWUpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhlbGVtZW50cy5kb21SZWZlcmVuY2UpO1xuXG4gICAgLy8gSWYgdGhlIHJlZmVyZW5jZSB3YXMgZm9jdXNlZCBhbmQgdGhlIHVzZXIgbGVmdCB0aGUgdGFiL3dpbmRvdywgYW5kIHRoZVxuICAgIC8vIGZsb2F0aW5nIGVsZW1lbnQgd2FzIG5vdCBvcGVuLCB0aGUgZm9jdXMgc2hvdWxkIGJlIGJsb2NrZWQgd2hlbiB0aGV5XG4gICAgLy8gcmV0dXJuIHRvIHRoZSB0YWIvd2luZG93LlxuICAgIGZ1bmN0aW9uIG9uQmx1cigpIHtcbiAgICAgIGlmICghb3BlbiAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgJiYgZWxlbWVudHMuZG9tUmVmZXJlbmNlID09PSBhY3RpdmVFbGVtZW50KGdldERvY3VtZW50KGVsZW1lbnRzLmRvbVJlZmVyZW5jZSkpKSB7XG4gICAgICAgIGJsb2NrRm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uS2V5RG93bigpIHtcbiAgICAgIGtleWJvYXJkTW9kYWxpdHlSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfVxuICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgb25CbHVyKTtcbiAgICB3aW4uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgdHJ1ZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgb25CbHVyKTtcbiAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duLCB0cnVlKTtcbiAgICB9O1xuICB9LCBbZWxlbWVudHMuZG9tUmVmZXJlbmNlLCBvcGVuLCBlbmFibGVkXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgZnVuY3Rpb24gb25PcGVuQ2hhbmdlKF9yZWYpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIHJlYXNvblxuICAgICAgfSA9IF9yZWY7XG4gICAgICBpZiAocmVhc29uID09PSAncmVmZXJlbmNlLXByZXNzJyB8fCByZWFzb24gPT09ICdlc2NhcGUta2V5Jykge1xuICAgICAgICBibG9ja0ZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBldmVudHMub24oJ29wZW5jaGFuZ2UnLCBvbk9wZW5DaGFuZ2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBldmVudHMub2ZmKCdvcGVuY2hhbmdlJywgb25PcGVuQ2hhbmdlKTtcbiAgICB9O1xuICB9LCBbZXZlbnRzLCBlbmFibGVkXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgY29uc3QgcmVmZXJlbmNlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIG9uUG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICAgIGlmIChpc1ZpcnR1YWxQb2ludGVyRXZlbnQoZXZlbnQubmF0aXZlRXZlbnQpKSByZXR1cm47XG4gICAgICBrZXlib2FyZE1vZGFsaXR5UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9LFxuICAgIG9uTW91c2VMZWF2ZSgpIHtcbiAgICAgIGJsb2NrRm9jdXNSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0sXG4gICAgb25Gb2N1cyhldmVudCkge1xuICAgICAgaWYgKGJsb2NrRm9jdXNSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2ZW50Lm5hdGl2ZUV2ZW50KTtcbiAgICAgIGlmICh2aXNpYmxlT25seSAmJiBpc0VsZW1lbnQodGFyZ2V0KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIE1hYyBTYWZhcmkgdW5yZWxpYWJseSBtYXRjaGVzIGA6Zm9jdXMtdmlzaWJsZWAgb24gdGhlIHJlZmVyZW5jZVxuICAgICAgICAgIC8vIGlmIGZvY3VzIHdhcyBvdXRzaWRlIHRoZSBwYWdlIGluaXRpYWxseSAtIHVzZSB0aGUgZmFsbGJhY2tcbiAgICAgICAgICAvLyBpbnN0ZWFkLlxuICAgICAgICAgIGlmIChpc1NhZmFyaSgpICYmIGlzTWFjKCkpIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgaWYgKCF0YXJnZXQubWF0Y2hlcygnOmZvY3VzLXZpc2libGUnKSkgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gT2xkIGJyb3dzZXJzIHdpbGwgdGhyb3cgYW4gZXJyb3Igd2hlbiB1c2luZyBgOmZvY3VzLXZpc2libGVgLlxuICAgICAgICAgIGlmICgha2V5Ym9hcmRNb2RhbGl0eVJlZi5jdXJyZW50ICYmICFpc1R5cGVhYmxlRWxlbWVudCh0YXJnZXQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdmb2N1cycpO1xuICAgIH0sXG4gICAgb25CbHVyKGV2ZW50KSB7XG4gICAgICBibG9ja0ZvY3VzUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAgICAgY29uc3QgbmF0aXZlRXZlbnQgPSBldmVudC5uYXRpdmVFdmVudDtcblxuICAgICAgLy8gSGl0IHRoZSBub24tbW9kYWwgZm9jdXMgbWFuYWdlbWVudCBwb3J0YWwgZ3VhcmQuIEZvY3VzIHdpbGwgYmVcbiAgICAgIC8vIG1vdmVkIGludG8gdGhlIGZsb2F0aW5nIGVsZW1lbnQgaW1tZWRpYXRlbHkgYWZ0ZXIuXG4gICAgICBjb25zdCBtb3ZlZFRvRm9jdXNHdWFyZCA9IGlzRWxlbWVudChyZWxhdGVkVGFyZ2V0KSAmJiByZWxhdGVkVGFyZ2V0Lmhhc0F0dHJpYnV0ZShjcmVhdGVBdHRyaWJ1dGUoJ2ZvY3VzLWd1YXJkJykpICYmIHJlbGF0ZWRUYXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKSA9PT0gJ291dHNpZGUnO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgd2luZG93IGJsdXIgbGlzdGVuZXIgdG8gZmlyZS5cbiAgICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdmFyIF9kYXRhUmVmJGN1cnJlbnQkZmxvYTtcbiAgICAgICAgY29uc3QgYWN0aXZlRWwgPSBhY3RpdmVFbGVtZW50KGVsZW1lbnRzLmRvbVJlZmVyZW5jZSA/IGVsZW1lbnRzLmRvbVJlZmVyZW5jZS5vd25lckRvY3VtZW50IDogZG9jdW1lbnQpO1xuXG4gICAgICAgIC8vIEZvY3VzIGxlZnQgdGhlIHBhZ2UsIGtlZXAgaXQgb3Blbi5cbiAgICAgICAgaWYgKCFyZWxhdGVkVGFyZ2V0ICYmIGFjdGl2ZUVsID09PSBlbGVtZW50cy5kb21SZWZlcmVuY2UpIHJldHVybjtcblxuICAgICAgICAvLyBXaGVuIGZvY3VzaW5nIHRoZSByZWZlcmVuY2UgZWxlbWVudCAoZS5nLiByZWd1bGFyIGNsaWNrKSwgdGhlblxuICAgICAgICAvLyBjbGlja2luZyBpbnRvIHRoZSBmbG9hdGluZyBlbGVtZW50LCBwcmV2ZW50IGl0IGZyb20gaGlkaW5nLlxuICAgICAgICAvLyBOb3RlOiBpdCBtdXN0IGJlIGZvY3VzYWJsZSwgZS5nLiBgdGFiaW5kZXg9XCItMVwiYC5cbiAgICAgICAgLy8gV2UgY2FuIG5vdCByZWx5IG9uIHJlbGF0ZWRUYXJnZXQgdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgZWxlbWVudFxuICAgICAgICAvLyBhcyBpdCB3aWxsIG9ubHkgcG9pbnQgdG8gdGhlIHNoYWRvdyBob3N0IG9mIHRoZSBuZXdseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgLy8gYW5kIG5vdCB0aGUgZWxlbWVudCB0aGF0IGFjdHVhbGx5IGhhcyByZWNlaXZlZCBmb2N1cyBpZiBpdCBpcyBsb2NhdGVkXG4gICAgICAgIC8vIGluc2lkZSBhIHNoYWRvdyByb290LlxuICAgICAgICBpZiAoY29udGFpbnMoKF9kYXRhUmVmJGN1cnJlbnQkZmxvYSA9IGRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfZGF0YVJlZiRjdXJyZW50JGZsb2EucmVmcy5mbG9hdGluZy5jdXJyZW50LCBhY3RpdmVFbCkgfHwgY29udGFpbnMoZWxlbWVudHMuZG9tUmVmZXJlbmNlLCBhY3RpdmVFbCkgfHwgbW92ZWRUb0ZvY3VzR3VhcmQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBuYXRpdmVFdmVudCwgJ2ZvY3VzJyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pLCBbZGF0YVJlZiwgZWxlbWVudHMuZG9tUmVmZXJlbmNlLCBvbk9wZW5DaGFuZ2UsIHZpc2libGVPbmx5XSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IGVuYWJsZWQgPyB7XG4gICAgcmVmZXJlbmNlXG4gIH0gOiB7fSwgW2VuYWJsZWQsIHJlZmVyZW5jZV0pO1xufVxuXG5jb25zdCBBQ1RJVkVfS0VZID0gJ2FjdGl2ZSc7XG5jb25zdCBTRUxFQ1RFRF9LRVkgPSAnc2VsZWN0ZWQnO1xuZnVuY3Rpb24gbWVyZ2VQcm9wcyh1c2VyUHJvcHMsIHByb3BzTGlzdCwgZWxlbWVudEtleSkge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGlzSXRlbSA9IGVsZW1lbnRLZXkgPT09ICdpdGVtJztcbiAgbGV0IGRvbVVzZXJQcm9wcyA9IHVzZXJQcm9wcztcbiAgaWYgKGlzSXRlbSAmJiB1c2VyUHJvcHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBbQUNUSVZFX0tFWV06IF8sXG4gICAgICBbU0VMRUNURURfS0VZXTogX18sXG4gICAgICAuLi52YWxpZFByb3BzXG4gICAgfSA9IHVzZXJQcm9wcztcbiAgICBkb21Vc2VyUHJvcHMgPSB2YWxpZFByb3BzO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uKGVsZW1lbnRLZXkgPT09ICdmbG9hdGluZycgJiYge1xuICAgICAgdGFiSW5kZXg6IC0xXG4gICAgfSksXG4gICAgLi4uZG9tVXNlclByb3BzLFxuICAgIC4uLnByb3BzTGlzdC5tYXAodmFsdWUgPT4ge1xuICAgICAgY29uc3QgcHJvcHNPckdldFByb3BzID0gdmFsdWUgPyB2YWx1ZVtlbGVtZW50S2V5XSA6IG51bGw7XG4gICAgICBpZiAodHlwZW9mIHByb3BzT3JHZXRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdXNlclByb3BzID8gcHJvcHNPckdldFByb3BzKHVzZXJQcm9wcykgOiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BzT3JHZXRQcm9wcztcbiAgICB9KS5jb25jYXQodXNlclByb3BzKS5yZWR1Y2UoKGFjYywgcHJvcHMpID0+IHtcbiAgICAgIGlmICghcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cbiAgICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgICBsZXQgW2tleSwgdmFsdWVdID0gX3JlZjtcbiAgICAgICAgaWYgKGlzSXRlbSAmJiBbQUNUSVZFX0tFWSwgU0VMRUNURURfS0VZXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkuaW5kZXhPZignb24nKSA9PT0gMCkge1xuICAgICAgICAgIGlmICghbWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBtYXAuc2V0KGtleSwgW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgX21hcCRnZXQ7XG4gICAgICAgICAgICAoX21hcCRnZXQgPSBtYXAuZ2V0KGtleSkpID09IG51bGwgfHwgX21hcCRnZXQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIF9tYXAkZ2V0MjtcbiAgICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gKF9tYXAkZ2V0MiA9IG1hcC5nZXQoa2V5KSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9tYXAkZ2V0Mi5tYXAoZm4gPT4gZm4oLi4uYXJncykpLmZpbmQodmFsID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSlcbiAgfTtcbn1cbi8qKlxuICogTWVyZ2VzIGFuIGFycmF5IG9mIGludGVyYWN0aW9uIGhvb2tzJyBwcm9wcyBpbnRvIHByb3AgZ2V0dGVycywgYWxsb3dpbmdcbiAqIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIHRvIGJlIGNvbXBvc2VkIHRvZ2V0aGVyIHdpdGhvdXQgb3ZlcndyaXRpbmcgb25lXG4gKiBhbm90aGVyLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUludGVyYWN0aW9uc1xuICovXG5mdW5jdGlvbiB1c2VJbnRlcmFjdGlvbnMocHJvcHNMaXN0KSB7XG4gIGlmIChwcm9wc0xpc3QgPT09IHZvaWQgMCkge1xuICAgIHByb3BzTGlzdCA9IFtdO1xuICB9XG4gIGNvbnN0IHJlZmVyZW5jZURlcHMgPSBwcm9wc0xpc3QubWFwKGtleSA9PiBrZXkgPT0gbnVsbCA/IHZvaWQgMCA6IGtleS5yZWZlcmVuY2UpO1xuICBjb25zdCBmbG9hdGluZ0RlcHMgPSBwcm9wc0xpc3QubWFwKGtleSA9PiBrZXkgPT0gbnVsbCA/IHZvaWQgMCA6IGtleS5mbG9hdGluZyk7XG4gIGNvbnN0IGl0ZW1EZXBzID0gcHJvcHNMaXN0Lm1hcChrZXkgPT4ga2V5ID09IG51bGwgPyB2b2lkIDAgOiBrZXkuaXRlbSk7XG4gIGNvbnN0IGdldFJlZmVyZW5jZVByb3BzID0gUmVhY3QudXNlQ2FsbGJhY2sodXNlclByb3BzID0+IG1lcmdlUHJvcHModXNlclByb3BzLCBwcm9wc0xpc3QsICdyZWZlcmVuY2UnKSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICByZWZlcmVuY2VEZXBzKTtcbiAgY29uc3QgZ2V0RmxvYXRpbmdQcm9wcyA9IFJlYWN0LnVzZUNhbGxiYWNrKHVzZXJQcm9wcyA9PiBtZXJnZVByb3BzKHVzZXJQcm9wcywgcHJvcHNMaXN0LCAnZmxvYXRpbmcnKSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICBmbG9hdGluZ0RlcHMpO1xuICBjb25zdCBnZXRJdGVtUHJvcHMgPSBSZWFjdC51c2VDYWxsYmFjayh1c2VyUHJvcHMgPT4gbWVyZ2VQcm9wcyh1c2VyUHJvcHMsIHByb3BzTGlzdCwgJ2l0ZW0nKSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICBpdGVtRGVwcyk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZ2V0UmVmZXJlbmNlUHJvcHMsXG4gICAgZ2V0RmxvYXRpbmdQcm9wcyxcbiAgICBnZXRJdGVtUHJvcHNcbiAgfSksIFtnZXRSZWZlcmVuY2VQcm9wcywgZ2V0RmxvYXRpbmdQcm9wcywgZ2V0SXRlbVByb3BzXSk7XG59XG5cbmxldCBpc1ByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGRvU3dpdGNoKG9yaWVudGF0aW9uLCB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCkge1xuICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7XG4gICAgY2FzZSAndmVydGljYWwnOlxuICAgICAgcmV0dXJuIHZlcnRpY2FsO1xuICAgIGNhc2UgJ2hvcml6b250YWwnOlxuICAgICAgcmV0dXJuIGhvcml6b250YWw7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB2ZXJ0aWNhbCB8fCBob3Jpem9udGFsO1xuICB9XG59XG5mdW5jdGlvbiBpc01haW5PcmllbnRhdGlvbktleShrZXksIG9yaWVudGF0aW9uKSB7XG4gIGNvbnN0IHZlcnRpY2FsID0ga2V5ID09PSBBUlJPV19VUCB8fCBrZXkgPT09IEFSUk9XX0RPV047XG4gIGNvbnN0IGhvcml6b250YWwgPSBrZXkgPT09IEFSUk9XX0xFRlQgfHwga2V5ID09PSBBUlJPV19SSUdIVDtcbiAgcmV0dXJuIGRvU3dpdGNoKG9yaWVudGF0aW9uLCB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCk7XG59XG5mdW5jdGlvbiBpc01haW5PcmllbnRhdGlvblRvRW5kS2V5KGtleSwgb3JpZW50YXRpb24sIHJ0bCkge1xuICBjb25zdCB2ZXJ0aWNhbCA9IGtleSA9PT0gQVJST1dfRE9XTjtcbiAgY29uc3QgaG9yaXpvbnRhbCA9IHJ0bCA/IGtleSA9PT0gQVJST1dfTEVGVCA6IGtleSA9PT0gQVJST1dfUklHSFQ7XG4gIHJldHVybiBkb1N3aXRjaChvcmllbnRhdGlvbiwgdmVydGljYWwsIGhvcml6b250YWwpIHx8IGtleSA9PT0gJ0VudGVyJyB8fCBrZXkgPT09ICcgJyB8fCBrZXkgPT09ICcnO1xufVxuZnVuY3Rpb24gaXNDcm9zc09yaWVudGF0aW9uT3BlbktleShrZXksIG9yaWVudGF0aW9uLCBydGwpIHtcbiAgY29uc3QgdmVydGljYWwgPSBydGwgPyBrZXkgPT09IEFSUk9XX0xFRlQgOiBrZXkgPT09IEFSUk9XX1JJR0hUO1xuICBjb25zdCBob3Jpem9udGFsID0ga2V5ID09PSBBUlJPV19ET1dOO1xuICByZXR1cm4gZG9Td2l0Y2gob3JpZW50YXRpb24sIHZlcnRpY2FsLCBob3Jpem9udGFsKTtcbn1cbmZ1bmN0aW9uIGlzQ3Jvc3NPcmllbnRhdGlvbkNsb3NlS2V5KGtleSwgb3JpZW50YXRpb24sIHJ0bCkge1xuICBjb25zdCB2ZXJ0aWNhbCA9IHJ0bCA/IGtleSA9PT0gQVJST1dfUklHSFQgOiBrZXkgPT09IEFSUk9XX0xFRlQ7XG4gIGNvbnN0IGhvcml6b250YWwgPSBrZXkgPT09IEFSUk9XX1VQO1xuICByZXR1cm4gZG9Td2l0Y2gob3JpZW50YXRpb24sIHZlcnRpY2FsLCBob3Jpem9udGFsKTtcbn1cbi8qKlxuICogQWRkcyBhcnJvdyBrZXktYmFzZWQgbmF2aWdhdGlvbiBvZiBhIGxpc3Qgb2YgaXRlbXMsIGVpdGhlciB1c2luZyByZWFsIERPTVxuICogZm9jdXMgb3IgdmlydHVhbCBmb2N1cy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VMaXN0TmF2aWdhdGlvblxuICovXG5mdW5jdGlvbiB1c2VMaXN0TmF2aWdhdGlvbihjb250ZXh0LCBwcm9wcykge1xuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZWxlbWVudHNcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBsaXN0UmVmLFxuICAgIGFjdGl2ZUluZGV4LFxuICAgIG9uTmF2aWdhdGU6IHVuc3RhYmxlX29uTmF2aWdhdGUgPSAoKSA9PiB7fSxcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBzZWxlY3RlZEluZGV4ID0gbnVsbCxcbiAgICBhbGxvd0VzY2FwZSA9IGZhbHNlLFxuICAgIGxvb3AgPSBmYWxzZSxcbiAgICBuZXN0ZWQgPSBmYWxzZSxcbiAgICBydGwgPSBmYWxzZSxcbiAgICB2aXJ0dWFsID0gZmFsc2UsXG4gICAgZm9jdXNJdGVtT25PcGVuID0gJ2F1dG8nLFxuICAgIGZvY3VzSXRlbU9uSG92ZXIgPSB0cnVlLFxuICAgIG9wZW5PbkFycm93S2V5RG93biA9IHRydWUsXG4gICAgZGlzYWJsZWRJbmRpY2VzID0gdW5kZWZpbmVkLFxuICAgIG9yaWVudGF0aW9uID0gJ3ZlcnRpY2FsJyxcbiAgICBjb2xzID0gMSxcbiAgICBzY3JvbGxJdGVtSW50b1ZpZXcgPSB0cnVlLFxuICAgIHZpcnR1YWxJdGVtUmVmLFxuICAgIGl0ZW1TaXplcyxcbiAgICBkZW5zZSA9IGZhbHNlXG4gIH0gPSBwcm9wcztcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmIChhbGxvd0VzY2FwZSkge1xuICAgICAgaWYgKCFsb29wKSB7XG4gICAgICAgIHdhcm4oJ2B1c2VMaXN0TmF2aWdhdGlvbmAgbG9vcGluZyBtdXN0IGJlIGVuYWJsZWQgdG8gYWxsb3cgZXNjYXBpbmcuJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXZpcnR1YWwpIHtcbiAgICAgICAgd2FybignYHVzZUxpc3ROYXZpZ2F0aW9uYCBtdXN0IGJlIHZpcnR1YWwgdG8gYWxsb3cgZXNjYXBpbmcuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyAmJiBjb2xzID4gMSkge1xuICAgICAgd2FybignSW4gZ3JpZCBsaXN0IG5hdmlnYXRpb24gbW9kZSAoYGNvbHNgID4gMSksIHRoZSBgb3JpZW50YXRpb25gIHNob3VsZCcsICdiZSBlaXRoZXIgXCJob3Jpem9udGFsXCIgb3IgXCJib3RoXCIuJyk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHBhcmVudElkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKTtcbiAgY29uc3QgdHJlZSA9IHVzZUZsb2F0aW5nVHJlZSgpO1xuICBjb25zdCBvbk5hdmlnYXRlID0gdXNlRWZmZWN0RXZlbnQodW5zdGFibGVfb25OYXZpZ2F0ZSk7XG4gIGNvbnN0IGZvY3VzSXRlbU9uT3BlblJlZiA9IFJlYWN0LnVzZVJlZihmb2N1c0l0ZW1Pbk9wZW4pO1xuICBjb25zdCBpbmRleFJlZiA9IFJlYWN0LnVzZVJlZihzZWxlY3RlZEluZGV4ICE9IG51bGwgPyBzZWxlY3RlZEluZGV4IDogLTEpO1xuICBjb25zdCBrZXlSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGlzUG9pbnRlck1vZGFsaXR5UmVmID0gUmVhY3QudXNlUmVmKHRydWUpO1xuICBjb25zdCBwcmV2aW91c09uTmF2aWdhdGVSZWYgPSBSZWFjdC51c2VSZWYob25OYXZpZ2F0ZSk7XG4gIGNvbnN0IHByZXZpb3VzTW91bnRlZFJlZiA9IFJlYWN0LnVzZVJlZighIWVsZW1lbnRzLmZsb2F0aW5nKTtcbiAgY29uc3QgcHJldmlvdXNPcGVuUmVmID0gUmVhY3QudXNlUmVmKG9wZW4pO1xuICBjb25zdCBmb3JjZVN5bmNGb2N1cyA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGZvcmNlU2Nyb2xsSW50b1ZpZXdSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBkaXNhYmxlZEluZGljZXNSZWYgPSB1c2VMYXRlc3RSZWYoZGlzYWJsZWRJbmRpY2VzKTtcbiAgY29uc3QgbGF0ZXN0T3BlblJlZiA9IHVzZUxhdGVzdFJlZihvcGVuKTtcbiAgY29uc3Qgc2Nyb2xsSXRlbUludG9WaWV3UmVmID0gdXNlTGF0ZXN0UmVmKHNjcm9sbEl0ZW1JbnRvVmlldyk7XG4gIGNvbnN0IGZsb2F0aW5nUmVmID0gdXNlTGF0ZXN0UmVmKGVsZW1lbnRzLmZsb2F0aW5nKTtcbiAgY29uc3Qgc2VsZWN0ZWRJbmRleFJlZiA9IHVzZUxhdGVzdFJlZihzZWxlY3RlZEluZGV4KTtcbiAgY29uc3QgW2FjdGl2ZUlkLCBzZXRBY3RpdmVJZF0gPSBSZWFjdC51c2VTdGF0ZSgpO1xuICBjb25zdCBbdmlydHVhbElkLCBzZXRWaXJ0dWFsSWRdID0gUmVhY3QudXNlU3RhdGUoKTtcbiAgY29uc3QgZm9jdXNJdGVtID0gdXNlRWZmZWN0RXZlbnQoZnVuY3Rpb24gKGxpc3RSZWYsIGluZGV4UmVmLCBmb3JjZVNjcm9sbEludG9WaWV3KSB7XG4gICAgaWYgKGZvcmNlU2Nyb2xsSW50b1ZpZXcgPT09IHZvaWQgMCkge1xuICAgICAgZm9yY2VTY3JvbGxJbnRvVmlldyA9IGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBydW5Gb2N1cyhpdGVtKSB7XG4gICAgICBpZiAodmlydHVhbCkge1xuICAgICAgICBzZXRBY3RpdmVJZChpdGVtLmlkKTtcbiAgICAgICAgdHJlZSA9PSBudWxsIHx8IHRyZWUuZXZlbnRzLmVtaXQoJ3ZpcnR1YWxmb2N1cycsIGl0ZW0pO1xuICAgICAgICBpZiAodmlydHVhbEl0ZW1SZWYpIHtcbiAgICAgICAgICB2aXJ0dWFsSXRlbVJlZi5jdXJyZW50ID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5xdWV1ZUZvY3VzKGl0ZW0sIHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlLFxuICAgICAgICAgIC8vIE1hYyBTYWZhcmkgZG9lcyBub3QgbW92ZSB0aGUgdmlydHVhbCBjdXJzb3IgdW5sZXNzIHRoZSBmb2N1cyBjYWxsXG4gICAgICAgICAgLy8gaXMgc3luYy4gSG93ZXZlciwgZm9yIHRoZSB2ZXJ5IGZpcnN0IGZvY3VzIGNhbGwsIHdlIG5lZWQgdG8gd2FpdFxuICAgICAgICAgIC8vIGZvciB0aGUgcG9zaXRpb24gdG8gYmUgcmVhZHkgaW4gb3JkZXIgdG8gcHJldmVudCB1bndhbnRlZFxuICAgICAgICAgIC8vIHNjcm9sbGluZy4gVGhpcyBtZWFucyB0aGUgdmlydHVhbCBjdXJzb3Igd2lsbCBub3QgbW92ZSB0byB0aGUgZmlyc3RcbiAgICAgICAgICAvLyBpdGVtIHdoZW4gZmlyc3Qgb3BlbmluZyB0aGUgZmxvYXRpbmcgZWxlbWVudCwgYnV0IHdpbGwgb25cbiAgICAgICAgICAvLyBzdWJzZXF1ZW50IGNhbGxzLiBgcHJldmVudFNjcm9sbGAgaXMgc3VwcG9ydGVkIGluIG1vZGVybiBTYWZhcmksXG4gICAgICAgICAgLy8gc28gd2UgY2FuIHVzZSB0aGF0IGluc3RlYWQuXG4gICAgICAgICAgLy8gaU9TIFNhZmFyaSBtdXN0IGJlIGFzeW5jIG9yIHRoZSBmaXJzdCBpdGVtIHdpbGwgbm90IGJlIGZvY3VzZWQuXG4gICAgICAgICAgc3luYzogaXNNYWMoKSAmJiBpc1NhZmFyaSgpID8gaXNQcmV2ZW50U2Nyb2xsU3VwcG9ydGVkIHx8IGZvcmNlU3luY0ZvY3VzLmN1cnJlbnQgOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW5pdGlhbEl0ZW0gPSBsaXN0UmVmLmN1cnJlbnRbaW5kZXhSZWYuY3VycmVudF07XG4gICAgaWYgKGluaXRpYWxJdGVtKSB7XG4gICAgICBydW5Gb2N1cyhpbml0aWFsSXRlbSk7XG4gICAgfVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBjb25zdCB3YWl0ZWRJdGVtID0gbGlzdFJlZi5jdXJyZW50W2luZGV4UmVmLmN1cnJlbnRdIHx8IGluaXRpYWxJdGVtO1xuICAgICAgaWYgKCF3YWl0ZWRJdGVtKSByZXR1cm47XG4gICAgICBpZiAoIWluaXRpYWxJdGVtKSB7XG4gICAgICAgIHJ1bkZvY3VzKHdhaXRlZEl0ZW0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2Nyb2xsSW50b1ZpZXdPcHRpb25zID0gc2Nyb2xsSXRlbUludG9WaWV3UmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBzaG91bGRTY3JvbGxJbnRvVmlldyA9IHNjcm9sbEludG9WaWV3T3B0aW9ucyAmJiBpdGVtICYmIChmb3JjZVNjcm9sbEludG9WaWV3IHx8ICFpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50KTtcbiAgICAgIGlmIChzaG91bGRTY3JvbGxJbnRvVmlldykge1xuICAgICAgICAvLyBKU0RPTSBkb2Vzbid0IHN1cHBvcnQgYC5zY3JvbGxJbnRvVmlldygpYCBidXQgaXQncyB3aWRlbHkgc3VwcG9ydGVkXG4gICAgICAgIC8vIGJ5IGFsbCBicm93c2Vycy5cbiAgICAgICAgd2FpdGVkSXRlbS5zY3JvbGxJbnRvVmlldyA9PSBudWxsIHx8IHdhaXRlZEl0ZW0uc2Nyb2xsSW50b1ZpZXcodHlwZW9mIHNjcm9sbEludG9WaWV3T3B0aW9ucyA9PT0gJ2Jvb2xlYW4nID8ge1xuICAgICAgICAgIGJsb2NrOiAnbmVhcmVzdCcsXG4gICAgICAgICAgaW5saW5lOiAnbmVhcmVzdCdcbiAgICAgICAgfSA6IHNjcm9sbEludG9WaWV3T3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykuZm9jdXMoe1xuICAgICAgZ2V0IHByZXZlbnRTY3JvbGwoKSB7XG4gICAgICAgIGlzUHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW10pO1xuXG4gIC8vIFN5bmMgYHNlbGVjdGVkSW5kZXhgIHRvIGJlIHRoZSBgYWN0aXZlSW5kZXhgIHVwb24gb3BlbmluZyB0aGUgZmxvYXRpbmdcbiAgLy8gZWxlbWVudC4gQWxzbywgcmVzZXQgYGFjdGl2ZUluZGV4YCB1cG9uIGNsb3NpbmcgdGhlIGZsb2F0aW5nIGVsZW1lbnQuXG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBpZiAob3BlbiAmJiBlbGVtZW50cy5mbG9hdGluZykge1xuICAgICAgaWYgKGZvY3VzSXRlbU9uT3BlblJlZi5jdXJyZW50ICYmIHNlbGVjdGVkSW5kZXggIT0gbnVsbCkge1xuICAgICAgICAvLyBSZWdhcmRsZXNzIG9mIHRoZSBwb2ludGVyIG1vZGFsaXR5LCB3ZSB3YW50IHRvIGVuc3VyZSB0aGUgc2VsZWN0ZWRcbiAgICAgICAgLy8gaXRlbSBjb21lcyBpbnRvIHZpZXcgd2hlbiB0aGUgZmxvYXRpbmcgZWxlbWVudCBpcyBvcGVuZWQuXG4gICAgICAgIGZvcmNlU2Nyb2xsSW50b1ZpZXdSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBzZWxlY3RlZEluZGV4O1xuICAgICAgICBvbk5hdmlnYXRlKHNlbGVjdGVkSW5kZXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJldmlvdXNNb3VudGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIC8vIFNpbmNlIHRoZSB1c2VyIGNhbiBzcGVjaWZ5IGBvbk5hdmlnYXRlYCBjb25kaXRpb25hbGx5XG4gICAgICAvLyAob25OYXZpZ2F0ZTogb3BlbiA/IHNldEFjdGl2ZUluZGV4IDogc2V0U2VsZWN0ZWRJbmRleCksXG4gICAgICAvLyB3ZSBzdG9yZSBhbmQgY2FsbCB0aGUgcHJldmlvdXMgZnVuY3Rpb24uXG4gICAgICBpbmRleFJlZi5jdXJyZW50ID0gLTE7XG4gICAgICBwcmV2aW91c09uTmF2aWdhdGVSZWYuY3VycmVudChudWxsKTtcbiAgICB9XG4gIH0sIFtlbmFibGVkLCBvcGVuLCBlbGVtZW50cy5mbG9hdGluZywgc2VsZWN0ZWRJbmRleCwgb25OYXZpZ2F0ZV0pO1xuXG4gIC8vIFN5bmMgYGFjdGl2ZUluZGV4YCB0byBiZSB0aGUgZm9jdXNlZCBpdGVtIHdoaWxlIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzXG4gIC8vIG9wZW4uXG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBpZiAob3BlbiAmJiBlbGVtZW50cy5mbG9hdGluZykge1xuICAgICAgaWYgKGFjdGl2ZUluZGV4ID09IG51bGwpIHtcbiAgICAgICAgZm9yY2VTeW5jRm9jdXMuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleFJlZi5jdXJyZW50ICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCB3aGlsZSB0aGUgZmxvYXRpbmcgZWxlbWVudCB3YXMgb3BlbiAoZS5nLiB0aGUgbGlzdCBjaGFuZ2VkKS5cbiAgICAgICAgaWYgKHByZXZpb3VzTW91bnRlZFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IC0xO1xuICAgICAgICAgIGZvY3VzSXRlbShsaXN0UmVmLCBpbmRleFJlZik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsIHN5bmMuXG4gICAgICAgIGlmICgoIXByZXZpb3VzT3BlblJlZi5jdXJyZW50IHx8ICFwcmV2aW91c01vdW50ZWRSZWYuY3VycmVudCkgJiYgZm9jdXNJdGVtT25PcGVuUmVmLmN1cnJlbnQgJiYgKGtleVJlZi5jdXJyZW50ICE9IG51bGwgfHwgZm9jdXNJdGVtT25PcGVuUmVmLmN1cnJlbnQgPT09IHRydWUgJiYga2V5UmVmLmN1cnJlbnQgPT0gbnVsbCkpIHtcbiAgICAgICAgICBsZXQgcnVucyA9IDA7XG4gICAgICAgICAgY29uc3Qgd2FpdEZvckxpc3RQb3B1bGF0ZWQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAobGlzdFJlZi5jdXJyZW50WzBdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gQXZvaWQgbGV0dGluZyB0aGUgYnJvd3NlciBwYWludCBpZiBwb3NzaWJsZSBvbiB0aGUgZmlyc3QgdHJ5LFxuICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHJBRi4gRG9uJ3QgdHJ5IG1vcmUgdGhhbiB0d2ljZSwgc2luY2Ugc29tZXRoaW5nXG4gICAgICAgICAgICAgIC8vIGlzIHdyb25nIG90aGVyd2lzZS5cbiAgICAgICAgICAgICAgaWYgKHJ1bnMgPCAyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZWR1bGVyID0gcnVucyA/IHJlcXVlc3RBbmltYXRpb25GcmFtZSA6IHF1ZXVlTWljcm90YXNrO1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlcih3YWl0Rm9yTGlzdFBvcHVsYXRlZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcnVucysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGtleVJlZi5jdXJyZW50ID09IG51bGwgfHwgaXNNYWluT3JpZW50YXRpb25Ub0VuZEtleShrZXlSZWYuY3VycmVudCwgb3JpZW50YXRpb24sIHJ0bCkgfHwgbmVzdGVkID8gZ2V0TWluSW5kZXgobGlzdFJlZiwgZGlzYWJsZWRJbmRpY2VzUmVmLmN1cnJlbnQpIDogZ2V0TWF4SW5kZXgobGlzdFJlZiwgZGlzYWJsZWRJbmRpY2VzUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICBrZXlSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICB3YWl0Rm9yTGlzdFBvcHVsYXRlZCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpc0luZGV4T3V0T2ZCb3VuZHMobGlzdFJlZiwgYWN0aXZlSW5kZXgpKSB7XG4gICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBhY3RpdmVJbmRleDtcbiAgICAgICAgZm9jdXNJdGVtKGxpc3RSZWYsIGluZGV4UmVmLCBmb3JjZVNjcm9sbEludG9WaWV3UmVmLmN1cnJlbnQpO1xuICAgICAgICBmb3JjZVNjcm9sbEludG9WaWV3UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtlbmFibGVkLCBvcGVuLCBlbGVtZW50cy5mbG9hdGluZywgYWN0aXZlSW5kZXgsIHNlbGVjdGVkSW5kZXhSZWYsIG5lc3RlZCwgbGlzdFJlZiwgb3JpZW50YXRpb24sIHJ0bCwgb25OYXZpZ2F0ZSwgZm9jdXNJdGVtLCBkaXNhYmxlZEluZGljZXNSZWZdKTtcblxuICAvLyBFbnN1cmUgdGhlIHBhcmVudCBmbG9hdGluZyBlbGVtZW50IGhhcyBmb2N1cyB3aGVuIGEgbmVzdGVkIGNoaWxkIGNsb3Nlc1xuICAvLyB0byBhbGxvdyBhcnJvdyBrZXkgbmF2aWdhdGlvbiB0byB3b3JrIGFmdGVyIHRoZSBwb2ludGVyIGxlYXZlcyB0aGUgY2hpbGQuXG4gIGluZGV4KCgpID0+IHtcbiAgICB2YXIgX25vZGVzJGZpbmQ7XG4gICAgaWYgKCFlbmFibGVkIHx8IGVsZW1lbnRzLmZsb2F0aW5nIHx8ICF0cmVlIHx8IHZpcnR1YWwgfHwgIXByZXZpb3VzTW91bnRlZFJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5vZGVzID0gdHJlZS5ub2Rlc1JlZi5jdXJyZW50O1xuICAgIGNvbnN0IHBhcmVudCA9IChfbm9kZXMkZmluZCA9IG5vZGVzLmZpbmQobm9kZSA9PiBub2RlLmlkID09PSBwYXJlbnRJZCkpID09IG51bGwgfHwgKF9ub2RlcyRmaW5kID0gX25vZGVzJGZpbmQuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlcyRmaW5kLmVsZW1lbnRzLmZsb2F0aW5nO1xuICAgIGNvbnN0IGFjdGl2ZUVsID0gYWN0aXZlRWxlbWVudChnZXREb2N1bWVudChlbGVtZW50cy5mbG9hdGluZykpO1xuICAgIGNvbnN0IHRyZWVDb250YWluc0FjdGl2ZUVsID0gbm9kZXMuc29tZShub2RlID0+IG5vZGUuY29udGV4dCAmJiBjb250YWlucyhub2RlLmNvbnRleHQuZWxlbWVudHMuZmxvYXRpbmcsIGFjdGl2ZUVsKSk7XG4gICAgaWYgKHBhcmVudCAmJiAhdHJlZUNvbnRhaW5zQWN0aXZlRWwgJiYgaXNQb2ludGVyTW9kYWxpdHlSZWYuY3VycmVudCkge1xuICAgICAgcGFyZW50LmZvY3VzKHtcbiAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgZWxlbWVudHMuZmxvYXRpbmcsIHRyZWUsIHBhcmVudElkLCB2aXJ0dWFsXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBpZiAoIXRyZWUpIHJldHVybjtcbiAgICBpZiAoIXZpcnR1YWwpIHJldHVybjtcbiAgICBpZiAocGFyZW50SWQpIHJldHVybjtcbiAgICBmdW5jdGlvbiBoYW5kbGVWaXJ0dWFsRm9jdXMoaXRlbSkge1xuICAgICAgc2V0VmlydHVhbElkKGl0ZW0uaWQpO1xuICAgICAgaWYgKHZpcnR1YWxJdGVtUmVmKSB7XG4gICAgICAgIHZpcnR1YWxJdGVtUmVmLmN1cnJlbnQgPSBpdGVtO1xuICAgICAgfVxuICAgIH1cbiAgICB0cmVlLmV2ZW50cy5vbigndmlydHVhbGZvY3VzJywgaGFuZGxlVmlydHVhbEZvY3VzKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdHJlZS5ldmVudHMub2ZmKCd2aXJ0dWFsZm9jdXMnLCBoYW5kbGVWaXJ0dWFsRm9jdXMpO1xuICAgIH07XG4gIH0sIFtlbmFibGVkLCB0cmVlLCB2aXJ0dWFsLCBwYXJlbnRJZCwgdmlydHVhbEl0ZW1SZWZdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIHByZXZpb3VzT25OYXZpZ2F0ZVJlZi5jdXJyZW50ID0gb25OYXZpZ2F0ZTtcbiAgICBwcmV2aW91c01vdW50ZWRSZWYuY3VycmVudCA9ICEhZWxlbWVudHMuZmxvYXRpbmc7XG4gIH0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICBrZXlSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9LCBbb3Blbl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgcHJldmlvdXNPcGVuUmVmLmN1cnJlbnQgPSBvcGVuO1xuICB9LCBbb3Blbl0pO1xuICBjb25zdCBoYXNBY3RpdmVJbmRleCA9IGFjdGl2ZUluZGV4ICE9IG51bGw7XG4gIGNvbnN0IGl0ZW0gPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBmdW5jdGlvbiBzeW5jQ3VycmVudFRhcmdldChjdXJyZW50VGFyZ2V0KSB7XG4gICAgICBpZiAoIW9wZW4pIHJldHVybjtcbiAgICAgIGNvbnN0IGluZGV4ID0gbGlzdFJlZi5jdXJyZW50LmluZGV4T2YoY3VycmVudFRhcmdldCk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIG9uTmF2aWdhdGUoaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgIG9uRm9jdXMoX3JlZikge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGN1cnJlbnRUYXJnZXRcbiAgICAgICAgfSA9IF9yZWY7XG4gICAgICAgIHN5bmNDdXJyZW50VGFyZ2V0KGN1cnJlbnRUYXJnZXQpO1xuICAgICAgfSxcbiAgICAgIG9uQ2xpY2s6IF9yZWYyID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBjdXJyZW50VGFyZ2V0XG4gICAgICAgIH0gPSBfcmVmMjtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUYXJnZXQuZm9jdXMoe1xuICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLy8gU2FmYXJpXG4gICAgICAuLi4oZm9jdXNJdGVtT25Ib3ZlciAmJiB7XG4gICAgICAgIG9uTW91c2VNb3ZlKF9yZWYzKSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGN1cnJlbnRUYXJnZXRcbiAgICAgICAgICB9ID0gX3JlZjM7XG4gICAgICAgICAgc3luY0N1cnJlbnRUYXJnZXQoY3VycmVudFRhcmdldCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUG9pbnRlckxlYXZlKF9yZWY0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlXG4gICAgICAgICAgfSA9IF9yZWY0O1xuICAgICAgICAgIGlmICghaXNQb2ludGVyTW9kYWxpdHlSZWYuY3VycmVudCB8fCBwb2ludGVyVHlwZSA9PT0gJ3RvdWNoJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gLTE7XG4gICAgICAgICAgZm9jdXNJdGVtKGxpc3RSZWYsIGluZGV4UmVmKTtcbiAgICAgICAgICBvbk5hdmlnYXRlKG51bGwpO1xuICAgICAgICAgIGlmICghdmlydHVhbCkge1xuICAgICAgICAgICAgZW5xdWV1ZUZvY3VzKGZsb2F0aW5nUmVmLmN1cnJlbnQsIHtcbiAgICAgICAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIHByb3BzO1xuICB9LCBbb3BlbiwgZmxvYXRpbmdSZWYsIGZvY3VzSXRlbSwgZm9jdXNJdGVtT25Ib3ZlciwgbGlzdFJlZiwgb25OYXZpZ2F0ZSwgdmlydHVhbF0pO1xuICBjb25zdCBjb21tb25PbktleURvd24gPSB1c2VFZmZlY3RFdmVudChldmVudCA9PiB7XG4gICAgaXNQb2ludGVyTW9kYWxpdHlSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIGZvcmNlU3luY0ZvY3VzLmN1cnJlbnQgPSB0cnVlO1xuXG4gICAgLy8gSWYgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXMgYW5pbWF0aW5nIG91dCwgaWdub3JlIG5hdmlnYXRpb24uIE90aGVyd2lzZSxcbiAgICAvLyB0aGUgYGFjdGl2ZUluZGV4YCBnZXRzIHNldCB0byAwIGRlc3BpdGUgbm90IGJlaW5nIG9wZW4gc28gdGhlIG5leHQgdGltZVxuICAgIC8vIHRoZSB1c2VyIEFycm93RG93bnMsIHRoZSBmaXJzdCBpdGVtIHdvbid0IGJlIGZvY3VzZWQuXG4gICAgaWYgKCFsYXRlc3RPcGVuUmVmLmN1cnJlbnQgJiYgZXZlbnQuY3VycmVudFRhcmdldCA9PT0gZmxvYXRpbmdSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmVzdGVkICYmIGlzQ3Jvc3NPcmllbnRhdGlvbkNsb3NlS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCkpIHtcbiAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnbGlzdC1uYXZpZ2F0aW9uJyk7XG4gICAgICBpZiAoaXNIVE1MRWxlbWVudChlbGVtZW50cy5kb21SZWZlcmVuY2UpICYmICF2aXJ0dWFsKSB7XG4gICAgICAgIGVsZW1lbnRzLmRvbVJlZmVyZW5jZS5mb2N1cygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSBpbmRleFJlZi5jdXJyZW50O1xuICAgIGNvbnN0IG1pbkluZGV4ID0gZ2V0TWluSW5kZXgobGlzdFJlZiwgZGlzYWJsZWRJbmRpY2VzKTtcbiAgICBjb25zdCBtYXhJbmRleCA9IGdldE1heEluZGV4KGxpc3RSZWYsIGRpc2FibGVkSW5kaWNlcyk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgaW5kZXhSZWYuY3VycmVudCA9IG1pbkluZGV4O1xuICAgICAgb25OYXZpZ2F0ZShpbmRleFJlZi5jdXJyZW50KTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VuZCcpIHtcbiAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICBpbmRleFJlZi5jdXJyZW50ID0gbWF4SW5kZXg7XG4gICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgIH1cblxuICAgIC8vIEdyaWQgbmF2aWdhdGlvbi5cbiAgICBpZiAoY29scyA+IDEpIHtcbiAgICAgIGNvbnN0IHNpemVzID0gaXRlbVNpemVzIHx8IEFycmF5LmZyb20oe1xuICAgICAgICBsZW5ndGg6IGxpc3RSZWYuY3VycmVudC5sZW5ndGhcbiAgICAgIH0sICgpID0+ICh7XG4gICAgICAgIHdpZHRoOiAxLFxuICAgICAgICBoZWlnaHQ6IDFcbiAgICAgIH0pKTtcbiAgICAgIC8vIFRvIGNhbGN1bGF0ZSBtb3ZlbWVudHMgb24gdGhlIGdyaWQsIHdlIHVzZSBoeXBvdGhldGljYWwgY2VsbCBpbmRpY2VzXG4gICAgICAvLyBhcyBpZiBldmVyeSBpdGVtIHdhcyAxeDEsIHRoZW4gY29udmVydCBiYWNrIHRvIHJlYWwgaW5kaWNlcy5cbiAgICAgIGNvbnN0IGNlbGxNYXAgPSBidWlsZENlbGxNYXAoc2l6ZXMsIGNvbHMsIGRlbnNlKTtcbiAgICAgIGNvbnN0IG1pbkdyaWRJbmRleCA9IGNlbGxNYXAuZmluZEluZGV4KGluZGV4ID0+IGluZGV4ICE9IG51bGwgJiYgIWlzRGlzYWJsZWQobGlzdFJlZi5jdXJyZW50LCBpbmRleCwgZGlzYWJsZWRJbmRpY2VzKSk7XG4gICAgICAvLyBsYXN0IGVuYWJsZWQgaW5kZXhcbiAgICAgIGNvbnN0IG1heEdyaWRJbmRleCA9IGNlbGxNYXAucmVkdWNlKChmb3VuZEluZGV4LCBpbmRleCwgY2VsbEluZGV4KSA9PiBpbmRleCAhPSBudWxsICYmICFpc0Rpc2FibGVkKGxpc3RSZWYuY3VycmVudCwgaW5kZXgsIGRpc2FibGVkSW5kaWNlcykgPyBjZWxsSW5kZXggOiBmb3VuZEluZGV4LCAtMSk7XG4gICAgICBpbmRleFJlZi5jdXJyZW50ID0gY2VsbE1hcFtnZXRHcmlkTmF2aWdhdGVkSW5kZXgoe1xuICAgICAgICBjdXJyZW50OiBjZWxsTWFwLm1hcChpdGVtSW5kZXggPT4gaXRlbUluZGV4ICE9IG51bGwgPyBsaXN0UmVmLmN1cnJlbnRbaXRlbUluZGV4XSA6IG51bGwpXG4gICAgICB9LCB7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICBvcmllbnRhdGlvbixcbiAgICAgICAgbG9vcCxcbiAgICAgICAgY29scyxcbiAgICAgICAgLy8gdHJlYXQgdW5kZWZpbmVkIChlbXB0eSBncmlkIHNwYWNlcykgYXMgZGlzYWJsZWQgaW5kaWNlcyBzbyB3ZVxuICAgICAgICAvLyBkb24ndCBlbmQgdXAgaW4gdGhlbVxuICAgICAgICBkaXNhYmxlZEluZGljZXM6IGdldENlbGxJbmRpY2VzKFsuLi4oZGlzYWJsZWRJbmRpY2VzIHx8IGxpc3RSZWYuY3VycmVudC5tYXAoKF8sIGluZGV4KSA9PiBpc0Rpc2FibGVkKGxpc3RSZWYuY3VycmVudCwgaW5kZXgpID8gaW5kZXggOiB1bmRlZmluZWQpKSwgdW5kZWZpbmVkXSwgY2VsbE1hcCksXG4gICAgICAgIG1pbkluZGV4OiBtaW5HcmlkSW5kZXgsXG4gICAgICAgIG1heEluZGV4OiBtYXhHcmlkSW5kZXgsXG4gICAgICAgIHByZXZJbmRleDogZ2V0Q2VsbEluZGV4T2ZDb3JuZXIoaW5kZXhSZWYuY3VycmVudCA+IG1heEluZGV4ID8gbWluSW5kZXggOiBpbmRleFJlZi5jdXJyZW50LCBzaXplcywgY2VsbE1hcCwgY29scyxcbiAgICAgICAgLy8gdXNlIGEgY29ybmVyIG1hdGNoaW5nIHRoZSBlZGdlIGNsb3Nlc3QgdG8gdGhlIGRpcmVjdGlvblxuICAgICAgICAvLyB3ZSdyZSBtb3ZpbmcgaW4gc28gd2UgZG9uJ3QgZW5kIHVwIGluIHRoZSBzYW1lIGl0ZW0uIFByZWZlclxuICAgICAgICAvLyB0b3AvbGVmdCBvdmVyIGJvdHRvbS9yaWdodC5cbiAgICAgICAgZXZlbnQua2V5ID09PSBBUlJPV19ET1dOID8gJ2JsJyA6IGV2ZW50LmtleSA9PT0gQVJST1dfUklHSFQgPyAndHInIDogJ3RsJyksXG4gICAgICAgIHN0b3BFdmVudDogdHJ1ZVxuICAgICAgfSldOyAvLyBuYXZpZ2F0ZWQgY2VsbCB3aWxsIG5ldmVyIGJlIG51bGxpc2hcblxuICAgICAgb25OYXZpZ2F0ZShpbmRleFJlZi5jdXJyZW50KTtcbiAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ2JvdGgnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTWFpbk9yaWVudGF0aW9uS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24pKSB7XG4gICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuXG4gICAgICAvLyBSZXNldCB0aGUgaW5kZXggaWYgbm8gaXRlbSBpcyBmb2N1c2VkLlxuICAgICAgaWYgKG9wZW4gJiYgIXZpcnR1YWwgJiYgYWN0aXZlRWxlbWVudChldmVudC5jdXJyZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQpID09PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBpc01haW5PcmllbnRhdGlvblRvRW5kS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCkgPyBtaW5JbmRleCA6IG1heEluZGV4O1xuICAgICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNNYWluT3JpZW50YXRpb25Ub0VuZEtleShldmVudC5rZXksIG9yaWVudGF0aW9uLCBydGwpKSB7XG4gICAgICAgIGlmIChsb29wKSB7XG4gICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGN1cnJlbnRJbmRleCA+PSBtYXhJbmRleCA/IGFsbG93RXNjYXBlICYmIGN1cnJlbnRJbmRleCAhPT0gbGlzdFJlZi5jdXJyZW50Lmxlbmd0aCA/IC0xIDogbWluSW5kZXggOiBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCB7XG4gICAgICAgICAgICBzdGFydGluZ0luZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gTWF0aC5taW4obWF4SW5kZXgsIGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxvb3ApIHtcbiAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gY3VycmVudEluZGV4IDw9IG1pbkluZGV4ID8gYWxsb3dFc2NhcGUgJiYgY3VycmVudEluZGV4ICE9PSAtMSA/IGxpc3RSZWYuY3VycmVudC5sZW5ndGggOiBtYXhJbmRleCA6IGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgIGRlY3JlbWVudDogdHJ1ZSxcbiAgICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBNYXRoLm1heChtaW5JbmRleCwgZmluZE5vbkRpc2FibGVkSW5kZXgobGlzdFJlZiwge1xuICAgICAgICAgICAgc3RhcnRpbmdJbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgZGVjcmVtZW50OiB0cnVlLFxuICAgICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNJbmRleE91dE9mQm91bmRzKGxpc3RSZWYsIGluZGV4UmVmLmN1cnJlbnQpKSB7XG4gICAgICAgIG9uTmF2aWdhdGUobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGFyaWFBY3RpdmVEZXNjZW5kYW50UHJvcCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiB2aXJ0dWFsICYmIG9wZW4gJiYgaGFzQWN0aXZlSW5kZXggJiYge1xuICAgICAgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCc6IHZpcnR1YWxJZCB8fCBhY3RpdmVJZFxuICAgIH07XG4gIH0sIFt2aXJ0dWFsLCBvcGVuLCBoYXNBY3RpdmVJbmRleCwgdmlydHVhbElkLCBhY3RpdmVJZF0pO1xuICBjb25zdCBmbG9hdGluZyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAnYXJpYS1vcmllbnRhdGlvbic6IG9yaWVudGF0aW9uID09PSAnYm90aCcgPyB1bmRlZmluZWQgOiBvcmllbnRhdGlvbixcbiAgICAgIC4uLighaXNUeXBlYWJsZUNvbWJvYm94KGVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgJiYgYXJpYUFjdGl2ZURlc2NlbmRhbnRQcm9wKSxcbiAgICAgIG9uS2V5RG93bjogY29tbW9uT25LZXlEb3duLFxuICAgICAgb25Qb2ludGVyTW92ZSgpIHtcbiAgICAgICAgaXNQb2ludGVyTW9kYWxpdHlSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2FyaWFBY3RpdmVEZXNjZW5kYW50UHJvcCwgY29tbW9uT25LZXlEb3duLCBlbGVtZW50cy5kb21SZWZlcmVuY2UsIG9yaWVudGF0aW9uXSk7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGZ1bmN0aW9uIGNoZWNrVmlydHVhbE1vdXNlKGV2ZW50KSB7XG4gICAgICBpZiAoZm9jdXNJdGVtT25PcGVuID09PSAnYXV0bycgJiYgaXNWaXJ0dWFsQ2xpY2soZXZlbnQubmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIGZvY3VzSXRlbU9uT3BlblJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tWaXJ0dWFsUG9pbnRlcihldmVudCkge1xuICAgICAgLy8gYHBvaW50ZXJkb3duYCBmaXJlcyBmaXJzdCwgcmVzZXQgdGhlIHN0YXRlIHRoZW4gcGVyZm9ybSB0aGUgY2hlY2tzLlxuICAgICAgZm9jdXNJdGVtT25PcGVuUmVmLmN1cnJlbnQgPSBmb2N1c0l0ZW1Pbk9wZW47XG4gICAgICBpZiAoZm9jdXNJdGVtT25PcGVuID09PSAnYXV0bycgJiYgaXNWaXJ0dWFsUG9pbnRlckV2ZW50KGV2ZW50Lm5hdGl2ZUV2ZW50KSkge1xuICAgICAgICBmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5hcmlhQWN0aXZlRGVzY2VuZGFudFByb3AsXG4gICAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgICAgaXNQb2ludGVyTW9kYWxpdHlSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBpc0Fycm93S2V5ID0gZXZlbnQua2V5LmluZGV4T2YoJ0Fycm93JykgPT09IDA7XG4gICAgICAgIGNvbnN0IGlzQ3Jvc3NPcGVuS2V5ID0gaXNDcm9zc09yaWVudGF0aW9uT3BlbktleShldmVudC5rZXksIG9yaWVudGF0aW9uLCBydGwpO1xuICAgICAgICBjb25zdCBpc0Nyb3NzQ2xvc2VLZXkgPSBpc0Nyb3NzT3JpZW50YXRpb25DbG9zZUtleShldmVudC5rZXksIG9yaWVudGF0aW9uLCBydGwpO1xuICAgICAgICBjb25zdCBpc01haW5LZXkgPSBpc01haW5PcmllbnRhdGlvbktleShldmVudC5rZXksIG9yaWVudGF0aW9uKTtcbiAgICAgICAgY29uc3QgaXNOYXZpZ2F0aW9uS2V5ID0gKG5lc3RlZCA/IGlzQ3Jvc3NPcGVuS2V5IDogaXNNYWluS2V5KSB8fCBldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5LnRyaW0oKSA9PT0gJyc7XG4gICAgICAgIGlmICh2aXJ0dWFsICYmIG9wZW4pIHtcbiAgICAgICAgICBjb25zdCByb290Tm9kZSA9IHRyZWUgPT0gbnVsbCA/IHZvaWQgMCA6IHRyZWUubm9kZXNSZWYuY3VycmVudC5maW5kKG5vZGUgPT4gbm9kZS5wYXJlbnRJZCA9PSBudWxsKTtcbiAgICAgICAgICBjb25zdCBkZWVwZXN0Tm9kZSA9IHRyZWUgJiYgcm9vdE5vZGUgPyBnZXREZWVwZXN0Tm9kZSh0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIHJvb3ROb2RlLmlkKSA6IG51bGw7XG4gICAgICAgICAgaWYgKGlzQXJyb3dLZXkgJiYgZGVlcGVzdE5vZGUgJiYgdmlydHVhbEl0ZW1SZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50T2JqZWN0ID0gbmV3IEtleWJvYXJkRXZlbnQoJ2tleWRvd24nLCB7XG4gICAgICAgICAgICAgIGtleTogZXZlbnQua2V5LFxuICAgICAgICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpc0Nyb3NzT3BlbktleSB8fCBpc0Nyb3NzQ2xvc2VLZXkpIHtcbiAgICAgICAgICAgICAgdmFyIF9kZWVwZXN0Tm9kZSRjb250ZXh0LCBfZGVlcGVzdE5vZGUkY29udGV4dDI7XG4gICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudFRhcmdldCA9ICgoX2RlZXBlc3ROb2RlJGNvbnRleHQgPSBkZWVwZXN0Tm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX2RlZXBlc3ROb2RlJGNvbnRleHQuZWxlbWVudHMuZG9tUmVmZXJlbmNlKSA9PT0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hJdGVtID0gaXNDcm9zc0Nsb3NlS2V5ICYmICFpc0N1cnJlbnRUYXJnZXQgPyAoX2RlZXBlc3ROb2RlJGNvbnRleHQyID0gZGVlcGVzdE5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kZWVwZXN0Tm9kZSRjb250ZXh0Mi5lbGVtZW50cy5kb21SZWZlcmVuY2UgOiBpc0Nyb3NzT3BlbktleSA/IGxpc3RSZWYuY3VycmVudC5maW5kKGl0ZW0gPT4gKGl0ZW0gPT0gbnVsbCA/IHZvaWQgMCA6IGl0ZW0uaWQpID09PSBhY3RpdmVJZCkgOiBudWxsO1xuICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2hJdGVtKSB7XG4gICAgICAgICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEl0ZW0uZGlzcGF0Y2hFdmVudChldmVudE9iamVjdCk7XG4gICAgICAgICAgICAgICAgc2V0VmlydHVhbElkKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc01haW5LZXkgJiYgZGVlcGVzdE5vZGUuY29udGV4dCkge1xuICAgICAgICAgICAgICBpZiAoZGVlcGVzdE5vZGUuY29udGV4dC5vcGVuICYmIGRlZXBlc3ROb2RlLnBhcmVudElkICYmIGV2ZW50LmN1cnJlbnRUYXJnZXQgIT09IGRlZXBlc3ROb2RlLmNvbnRleHQuZWxlbWVudHMuZG9tUmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9kZWVwZXN0Tm9kZSRjb250ZXh0JDtcbiAgICAgICAgICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIChfZGVlcGVzdE5vZGUkY29udGV4dCQgPSBkZWVwZXN0Tm9kZS5jb250ZXh0LmVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgPT0gbnVsbCB8fCBfZGVlcGVzdE5vZGUkY29udGV4dCQuZGlzcGF0Y2hFdmVudChldmVudE9iamVjdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb21tb25PbktleURvd24oZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgYSBmbG9hdGluZyBlbGVtZW50IHNob3VsZCBub3Qgb3BlbiBvbiBhcnJvdyBrZXkgZG93biwgYXZvaWRcbiAgICAgICAgLy8gc2V0dGluZyBgYWN0aXZlSW5kZXhgIHdoaWxlIGl0J3MgY2xvc2VkLlxuICAgICAgICBpZiAoIW9wZW4gJiYgIW9wZW5PbkFycm93S2V5RG93biAmJiBpc0Fycm93S2V5KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc05hdmlnYXRpb25LZXkpIHtcbiAgICAgICAgICBrZXlSZWYuY3VycmVudCA9IG5lc3RlZCAmJiBpc01haW5LZXkgPyBudWxsIDogZXZlbnQua2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXN0ZWQpIHtcbiAgICAgICAgICBpZiAoaXNDcm9zc09wZW5LZXkpIHtcbiAgICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gZ2V0TWluSW5kZXgobGlzdFJlZiwgZGlzYWJsZWRJbmRpY2VzUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnbGlzdC1uYXZpZ2F0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNNYWluS2V5KSB7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgaWYgKCFvcGVuICYmIG9wZW5PbkFycm93S2V5RG93bikge1xuICAgICAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnbGlzdC1uYXZpZ2F0aW9uJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbW1vbk9uS2V5RG93bihldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uRm9jdXMoKSB7XG4gICAgICAgIGlmIChvcGVuICYmICF2aXJ0dWFsKSB7XG4gICAgICAgICAgb25OYXZpZ2F0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uUG9pbnRlckRvd246IGNoZWNrVmlydHVhbFBvaW50ZXIsXG4gICAgICBvbk1vdXNlRG93bjogY2hlY2tWaXJ0dWFsTW91c2UsXG4gICAgICBvbkNsaWNrOiBjaGVja1ZpcnR1YWxNb3VzZVxuICAgIH07XG4gIH0sIFthY3RpdmVJZCwgYXJpYUFjdGl2ZURlc2NlbmRhbnRQcm9wLCBjb21tb25PbktleURvd24sIGRpc2FibGVkSW5kaWNlc1JlZiwgZm9jdXNJdGVtT25PcGVuLCBsaXN0UmVmLCBuZXN0ZWQsIG9uTmF2aWdhdGUsIG9uT3BlbkNoYW5nZSwgb3Blbiwgb3Blbk9uQXJyb3dLZXlEb3duLCBvcmllbnRhdGlvbiwgcnRsLCBzZWxlY3RlZEluZGV4LCB0cmVlLCB2aXJ0dWFsLCB2aXJ0dWFsSXRlbVJlZl0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIHJlZmVyZW5jZSxcbiAgICBmbG9hdGluZyxcbiAgICBpdGVtXG4gIH0gOiB7fSwgW2VuYWJsZWQsIHJlZmVyZW5jZSwgZmxvYXRpbmcsIGl0ZW1dKTtcbn1cblxuY29uc3QgY29tcG9uZW50Um9sZVRvQXJpYVJvbGVNYXAgPSAvKiNfX1BVUkVfXyovbmV3IE1hcChbWydzZWxlY3QnLCAnbGlzdGJveCddLCBbJ2NvbWJvYm94JywgJ2xpc3Rib3gnXSwgWydsYWJlbCcsIGZhbHNlXV0pO1xuXG4vKipcbiAqIEFkZHMgYmFzZSBzY3JlZW4gcmVhZGVyIHByb3BzIHRvIHRoZSByZWZlcmVuY2UgYW5kIGZsb2F0aW5nIGVsZW1lbnRzIGZvciBhXG4gKiBnaXZlbiBmbG9hdGluZyBlbGVtZW50IGByb2xlYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VSb2xlXG4gKi9cbmZ1bmN0aW9uIHVzZVJvbGUoY29udGV4dCwgcHJvcHMpIHtcbiAgdmFyIF9jb21wb25lbnRSb2xlVG9BcmlhUjtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIGZsb2F0aW5nSWRcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICByb2xlID0gJ2RpYWxvZydcbiAgfSA9IHByb3BzO1xuICBjb25zdCBhcmlhUm9sZSA9IChfY29tcG9uZW50Um9sZVRvQXJpYVIgPSBjb21wb25lbnRSb2xlVG9BcmlhUm9sZU1hcC5nZXQocm9sZSkpICE9IG51bGwgPyBfY29tcG9uZW50Um9sZVRvQXJpYVIgOiByb2xlO1xuICBjb25zdCByZWZlcmVuY2VJZCA9IHVzZUlkKCk7XG4gIGNvbnN0IHBhcmVudElkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKTtcbiAgY29uc3QgaXNOZXN0ZWQgPSBwYXJlbnRJZCAhPSBudWxsO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoYXJpYVJvbGUgPT09ICd0b29sdGlwJyB8fCByb2xlID09PSAnbGFiZWwnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbXCJhcmlhLVwiICsgKHJvbGUgPT09ICdsYWJlbCcgPyAnbGFiZWxsZWRieScgOiAnZGVzY3JpYmVkYnknKV06IG9wZW4gPyBmbG9hdGluZ0lkIDogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgJ2FyaWEtZXhwYW5kZWQnOiBvcGVuID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgICAgICdhcmlhLWhhc3BvcHVwJzogYXJpYVJvbGUgPT09ICdhbGVydGRpYWxvZycgPyAnZGlhbG9nJyA6IGFyaWFSb2xlLFxuICAgICAgJ2FyaWEtY29udHJvbHMnOiBvcGVuID8gZmxvYXRpbmdJZCA6IHVuZGVmaW5lZCxcbiAgICAgIC4uLihhcmlhUm9sZSA9PT0gJ2xpc3Rib3gnICYmIHtcbiAgICAgICAgcm9sZTogJ2NvbWJvYm94J1xuICAgICAgfSksXG4gICAgICAuLi4oYXJpYVJvbGUgPT09ICdtZW51JyAmJiB7XG4gICAgICAgIGlkOiByZWZlcmVuY2VJZFxuICAgICAgfSksXG4gICAgICAuLi4oYXJpYVJvbGUgPT09ICdtZW51JyAmJiBpc05lc3RlZCAmJiB7XG4gICAgICAgIHJvbGU6ICdtZW51aXRlbSdcbiAgICAgIH0pLFxuICAgICAgLi4uKHJvbGUgPT09ICdzZWxlY3QnICYmIHtcbiAgICAgICAgJ2FyaWEtYXV0b2NvbXBsZXRlJzogJ25vbmUnXG4gICAgICB9KSxcbiAgICAgIC4uLihyb2xlID09PSAnY29tYm9ib3gnICYmIHtcbiAgICAgICAgJ2FyaWEtYXV0b2NvbXBsZXRlJzogJ2xpc3QnXG4gICAgICB9KVxuICAgIH07XG4gIH0sIFthcmlhUm9sZSwgZmxvYXRpbmdJZCwgaXNOZXN0ZWQsIG9wZW4sIHJlZmVyZW5jZUlkLCByb2xlXSk7XG4gIGNvbnN0IGZsb2F0aW5nID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgZmxvYXRpbmdQcm9wcyA9IHtcbiAgICAgIGlkOiBmbG9hdGluZ0lkLFxuICAgICAgLi4uKGFyaWFSb2xlICYmIHtcbiAgICAgICAgcm9sZTogYXJpYVJvbGVcbiAgICAgIH0pXG4gICAgfTtcbiAgICBpZiAoYXJpYVJvbGUgPT09ICd0b29sdGlwJyB8fCByb2xlID09PSAnbGFiZWwnKSB7XG4gICAgICByZXR1cm4gZmxvYXRpbmdQcm9wcztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmZsb2F0aW5nUHJvcHMsXG4gICAgICAuLi4oYXJpYVJvbGUgPT09ICdtZW51JyAmJiB7XG4gICAgICAgICdhcmlhLWxhYmVsbGVkYnknOiByZWZlcmVuY2VJZFxuICAgICAgfSlcbiAgICB9O1xuICB9LCBbYXJpYVJvbGUsIGZsb2F0aW5nSWQsIHJlZmVyZW5jZUlkLCByb2xlXSk7XG4gIGNvbnN0IGl0ZW0gPSBSZWFjdC51c2VDYWxsYmFjayhfcmVmID0+IHtcbiAgICBsZXQge1xuICAgICAgYWN0aXZlLFxuICAgICAgc2VsZWN0ZWRcbiAgICB9ID0gX3JlZjtcbiAgICBjb25zdCBjb21tb25Qcm9wcyA9IHtcbiAgICAgIHJvbGU6ICdvcHRpb24nLFxuICAgICAgLi4uKGFjdGl2ZSAmJiB7XG4gICAgICAgIGlkOiBmbG9hdGluZ0lkICsgXCItb3B0aW9uXCJcbiAgICAgIH0pXG4gICAgfTtcblxuICAgIC8vIEZvciBgbWVudWAsIHdlIGFyZSB1bmFibGUgdG8gdGVsbCBpZiB0aGUgaXRlbSBpcyBhIGBtZW51aXRlbXJhZGlvYFxuICAgIC8vIG9yIGBtZW51aXRlbWNoZWNrYm94YC4gRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHJlYXNvbnMsIGFsc29cbiAgICAvLyBhdm9pZCBkZWZhdWx0aW5nIHRvIGBtZW51aXRlbWAgYXMgaXQgbWF5IG92ZXJ3cml0ZSBjdXN0b20gcm9sZSBwcm9wcy5cbiAgICBzd2l0Y2ggKHJvbGUpIHtcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY29tbW9uUHJvcHMsXG4gICAgICAgICAgJ2FyaWEtc2VsZWN0ZWQnOiBhY3RpdmUgJiYgc2VsZWN0ZWRcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ2NvbWJvYm94JzpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jb21tb25Qcm9wcyxcbiAgICAgICAgICAgIC4uLihhY3RpdmUgJiYge1xuICAgICAgICAgICAgICAnYXJpYS1zZWxlY3RlZCc6IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH0sIFtmbG9hdGluZ0lkLCByb2xlXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IGVuYWJsZWQgPyB7XG4gICAgcmVmZXJlbmNlLFxuICAgIGZsb2F0aW5nLFxuICAgIGl0ZW1cbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlLCBmbG9hdGluZywgaXRlbV0pO1xufVxuXG4vLyBDb252ZXJ0cyBhIEpTIHN0eWxlIGtleSBsaWtlIGBiYWNrZ3JvdW5kQ29sb3JgIHRvIGEgQ1NTIHRyYW5zaXRpb24tcHJvcGVydHlcbi8vIGxpa2UgYGJhY2tncm91bmQtY29sb3JgLlxuY29uc3QgY2FtZWxDYXNlVG9LZWJhYkNhc2UgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL1tBLVpdKyg/IVthLXpdKXxbQS1aXS9nLCAoJCwgb2ZzKSA9PiAob2ZzID8gJy0nIDogJycpICsgJC50b0xvd2VyQ2FzZSgpKTtcbmZ1bmN0aW9uIGV4ZWNXaXRoQXJnc09yUmV0dXJuKHZhbHVlT3JGbiwgYXJncykge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlT3JGbiA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlT3JGbihhcmdzKSA6IHZhbHVlT3JGbjtcbn1cbmZ1bmN0aW9uIHVzZURlbGF5VW5tb3VudChvcGVuLCBkdXJhdGlvbk1zKSB7XG4gIGNvbnN0IFtpc01vdW50ZWQsIHNldElzTW91bnRlZF0gPSBSZWFjdC51c2VTdGF0ZShvcGVuKTtcbiAgaWYgKG9wZW4gJiYgIWlzTW91bnRlZCkge1xuICAgIHNldElzTW91bnRlZCh0cnVlKTtcbiAgfVxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghb3BlbiAmJiBpc01vdW50ZWQpIHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHNldElzTW91bnRlZChmYWxzZSksIGR1cmF0aW9uTXMpO1xuICAgICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICB9XG4gIH0sIFtvcGVuLCBpc01vdW50ZWQsIGR1cmF0aW9uTXNdKTtcbiAgcmV0dXJuIGlzTW91bnRlZDtcbn1cbi8qKlxuICogUHJvdmlkZXMgYSBzdGF0dXMgc3RyaW5nIHRvIGFwcGx5IENTUyB0cmFuc2l0aW9ucyB0byBhIGZsb2F0aW5nIGVsZW1lbnQsXG4gKiBjb3JyZWN0bHkgaGFuZGxpbmcgcGxhY2VtZW50LWF3YXJlIHRyYW5zaXRpb25zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZVRyYW5zaXRpb24jdXNldHJhbnNpdGlvbnN0YXR1c1xuICovXG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uU3RhdHVzKGNvbnRleHQsIHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBlbGVtZW50czoge1xuICAgICAgZmxvYXRpbmdcbiAgICB9XG4gIH0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZHVyYXRpb24gPSAyNTBcbiAgfSA9IHByb3BzO1xuICBjb25zdCBpc051bWJlckR1cmF0aW9uID0gdHlwZW9mIGR1cmF0aW9uID09PSAnbnVtYmVyJztcbiAgY29uc3QgY2xvc2VEdXJhdGlvbiA9IChpc051bWJlckR1cmF0aW9uID8gZHVyYXRpb24gOiBkdXJhdGlvbi5jbG9zZSkgfHwgMDtcbiAgY29uc3QgW3N0YXR1cywgc2V0U3RhdHVzXSA9IFJlYWN0LnVzZVN0YXRlKCd1bm1vdW50ZWQnKTtcbiAgY29uc3QgaXNNb3VudGVkID0gdXNlRGVsYXlVbm1vdW50KG9wZW4sIGNsb3NlRHVyYXRpb24pO1xuICBpZiAoIWlzTW91bnRlZCAmJiBzdGF0dXMgPT09ICdjbG9zZScpIHtcbiAgICBzZXRTdGF0dXMoJ3VubW91bnRlZCcpO1xuICB9XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWZsb2F0aW5nKSByZXR1cm47XG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHNldFN0YXR1cygnaW5pdGlhbCcpO1xuICAgICAgY29uc3QgZnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBzZXRTdGF0dXMoJ29wZW4nKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoZnJhbWUpO1xuICAgICAgfTtcbiAgICB9XG4gICAgc2V0U3RhdHVzKCdjbG9zZScpO1xuICB9LCBbb3BlbiwgZmxvYXRpbmddKTtcbiAgcmV0dXJuIHtcbiAgICBpc01vdW50ZWQsXG4gICAgc3RhdHVzXG4gIH07XG59XG4vKipcbiAqIFByb3ZpZGVzIHN0eWxlcyB0byBhcHBseSBDU1MgdHJhbnNpdGlvbnMgdG8gYSBmbG9hdGluZyBlbGVtZW50LCBjb3JyZWN0bHlcbiAqIGhhbmRsaW5nIHBsYWNlbWVudC1hd2FyZSB0cmFuc2l0aW9ucy4gV3JhcHBlciBhcm91bmQgYHVzZVRyYW5zaXRpb25TdGF0dXNgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZVRyYW5zaXRpb24jdXNldHJhbnNpdGlvbnN0eWxlc1xuICovXG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uU3R5bGVzKGNvbnRleHQsIHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgaW5pdGlhbDogdW5zdGFibGVfaW5pdGlhbCA9IHtcbiAgICAgIG9wYWNpdHk6IDBcbiAgICB9LFxuICAgIG9wZW46IHVuc3RhYmxlX29wZW4sXG4gICAgY2xvc2U6IHVuc3RhYmxlX2Nsb3NlLFxuICAgIGNvbW1vbjogdW5zdGFibGVfY29tbW9uLFxuICAgIGR1cmF0aW9uID0gMjUwXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgcGxhY2VtZW50ID0gY29udGV4dC5wbGFjZW1lbnQ7XG4gIGNvbnN0IHNpZGUgPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbiAgY29uc3QgZm5BcmdzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHNpZGUsXG4gICAgcGxhY2VtZW50XG4gIH0pLCBbc2lkZSwgcGxhY2VtZW50XSk7XG4gIGNvbnN0IGlzTnVtYmVyRHVyYXRpb24gPSB0eXBlb2YgZHVyYXRpb24gPT09ICdudW1iZXInO1xuICBjb25zdCBvcGVuRHVyYXRpb24gPSAoaXNOdW1iZXJEdXJhdGlvbiA/IGR1cmF0aW9uIDogZHVyYXRpb24ub3BlbikgfHwgMDtcbiAgY29uc3QgY2xvc2VEdXJhdGlvbiA9IChpc051bWJlckR1cmF0aW9uID8gZHVyYXRpb24gOiBkdXJhdGlvbi5jbG9zZSkgfHwgMDtcbiAgY29uc3QgW3N0eWxlcywgc2V0U3R5bGVzXSA9IFJlYWN0LnVzZVN0YXRlKCgpID0+ICh7XG4gICAgLi4uZXhlY1dpdGhBcmdzT3JSZXR1cm4odW5zdGFibGVfY29tbW9uLCBmbkFyZ3MpLFxuICAgIC4uLmV4ZWNXaXRoQXJnc09yUmV0dXJuKHVuc3RhYmxlX2luaXRpYWwsIGZuQXJncylcbiAgfSkpO1xuICBjb25zdCB7XG4gICAgaXNNb3VudGVkLFxuICAgIHN0YXR1c1xuICB9ID0gdXNlVHJhbnNpdGlvblN0YXR1cyhjb250ZXh0LCB7XG4gICAgZHVyYXRpb25cbiAgfSk7XG4gIGNvbnN0IGluaXRpYWxSZWYgPSB1c2VMYXRlc3RSZWYodW5zdGFibGVfaW5pdGlhbCk7XG4gIGNvbnN0IG9wZW5SZWYgPSB1c2VMYXRlc3RSZWYodW5zdGFibGVfb3Blbik7XG4gIGNvbnN0IGNsb3NlUmVmID0gdXNlTGF0ZXN0UmVmKHVuc3RhYmxlX2Nsb3NlKTtcbiAgY29uc3QgY29tbW9uUmVmID0gdXNlTGF0ZXN0UmVmKHVuc3RhYmxlX2NvbW1vbik7XG4gIGluZGV4KCgpID0+IHtcbiAgICBjb25zdCBpbml0aWFsU3R5bGVzID0gZXhlY1dpdGhBcmdzT3JSZXR1cm4oaW5pdGlhbFJlZi5jdXJyZW50LCBmbkFyZ3MpO1xuICAgIGNvbnN0IGNsb3NlU3R5bGVzID0gZXhlY1dpdGhBcmdzT3JSZXR1cm4oY2xvc2VSZWYuY3VycmVudCwgZm5BcmdzKTtcbiAgICBjb25zdCBjb21tb25TdHlsZXMgPSBleGVjV2l0aEFyZ3NPclJldHVybihjb21tb25SZWYuY3VycmVudCwgZm5BcmdzKTtcbiAgICBjb25zdCBvcGVuU3R5bGVzID0gZXhlY1dpdGhBcmdzT3JSZXR1cm4ob3BlblJlZi5jdXJyZW50LCBmbkFyZ3MpIHx8IE9iamVjdC5rZXlzKGluaXRpYWxTdHlsZXMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgIGFjY1trZXldID0gJyc7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgICBpZiAoc3RhdHVzID09PSAnaW5pdGlhbCcpIHtcbiAgICAgIHNldFN0eWxlcyhzdHlsZXMgPT4gKHtcbiAgICAgICAgdHJhbnNpdGlvblByb3BlcnR5OiBzdHlsZXMudHJhbnNpdGlvblByb3BlcnR5LFxuICAgICAgICAuLi5jb21tb25TdHlsZXMsXG4gICAgICAgIC4uLmluaXRpYWxTdHlsZXNcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gJ29wZW4nKSB7XG4gICAgICBzZXRTdHlsZXMoe1xuICAgICAgICB0cmFuc2l0aW9uUHJvcGVydHk6IE9iamVjdC5rZXlzKG9wZW5TdHlsZXMpLm1hcChjYW1lbENhc2VUb0tlYmFiQ2FzZSkuam9pbignLCcpLFxuICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb246IG9wZW5EdXJhdGlvbiArIFwibXNcIixcbiAgICAgICAgLi4uY29tbW9uU3R5bGVzLFxuICAgICAgICAuLi5vcGVuU3R5bGVzXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gJ2Nsb3NlJykge1xuICAgICAgY29uc3Qgc3R5bGVzID0gY2xvc2VTdHlsZXMgfHwgaW5pdGlhbFN0eWxlcztcbiAgICAgIHNldFN0eWxlcyh7XG4gICAgICAgIHRyYW5zaXRpb25Qcm9wZXJ0eTogT2JqZWN0LmtleXMoc3R5bGVzKS5tYXAoY2FtZWxDYXNlVG9LZWJhYkNhc2UpLmpvaW4oJywnKSxcbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBjbG9zZUR1cmF0aW9uICsgXCJtc1wiLFxuICAgICAgICAuLi5jb21tb25TdHlsZXMsXG4gICAgICAgIC4uLnN0eWxlc1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbY2xvc2VEdXJhdGlvbiwgY2xvc2VSZWYsIGluaXRpYWxSZWYsIG9wZW5SZWYsIGNvbW1vblJlZiwgb3BlbkR1cmF0aW9uLCBzdGF0dXMsIGZuQXJnc10pO1xuICByZXR1cm4ge1xuICAgIGlzTW91bnRlZCxcbiAgICBzdHlsZXNcbiAgfTtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIG1hdGNoaW5nIGNhbGxiYWNrIHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9jdXMgYW4gaXRlbSBhcyB0aGUgdXNlclxuICogdHlwZXMsIG9mdGVuIHVzZWQgaW4gdGFuZGVtIHdpdGggYHVzZUxpc3ROYXZpZ2F0aW9uKClgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZVR5cGVhaGVhZFxuICovXG5mdW5jdGlvbiB1c2VUeXBlYWhlYWQoY29udGV4dCwgcHJvcHMpIHtcbiAgdmFyIF9yZWY7XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIGRhdGFSZWZcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBsaXN0UmVmLFxuICAgIGFjdGl2ZUluZGV4LFxuICAgIG9uTWF0Y2g6IHVuc3RhYmxlX29uTWF0Y2gsXG4gICAgb25UeXBpbmdDaGFuZ2U6IHVuc3RhYmxlX29uVHlwaW5nQ2hhbmdlLFxuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIGZpbmRNYXRjaCA9IG51bGwsXG4gICAgcmVzZXRNcyA9IDc1MCxcbiAgICBpZ25vcmVLZXlzID0gW10sXG4gICAgc2VsZWN0ZWRJbmRleCA9IG51bGxcbiAgfSA9IHByb3BzO1xuICBjb25zdCB0aW1lb3V0SWRSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgY29uc3Qgc3RyaW5nUmVmID0gUmVhY3QudXNlUmVmKCcnKTtcbiAgY29uc3QgcHJldkluZGV4UmVmID0gUmVhY3QudXNlUmVmKChfcmVmID0gc2VsZWN0ZWRJbmRleCAhPSBudWxsID8gc2VsZWN0ZWRJbmRleCA6IGFjdGl2ZUluZGV4KSAhPSBudWxsID8gX3JlZiA6IC0xKTtcbiAgY29uc3QgbWF0Y2hJbmRleFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qgb25NYXRjaCA9IHVzZUVmZmVjdEV2ZW50KHVuc3RhYmxlX29uTWF0Y2gpO1xuICBjb25zdCBvblR5cGluZ0NoYW5nZSA9IHVzZUVmZmVjdEV2ZW50KHVuc3RhYmxlX29uVHlwaW5nQ2hhbmdlKTtcbiAgY29uc3QgZmluZE1hdGNoUmVmID0gdXNlTGF0ZXN0UmVmKGZpbmRNYXRjaCk7XG4gIGNvbnN0IGlnbm9yZUtleXNSZWYgPSB1c2VMYXRlc3RSZWYoaWdub3JlS2V5cyk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAob3Blbikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZFJlZi5jdXJyZW50KTtcbiAgICAgIG1hdGNoSW5kZXhSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICBzdHJpbmdSZWYuY3VycmVudCA9ICcnO1xuICAgIH1cbiAgfSwgW29wZW5dKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIC8vIFN5bmMgYXJyb3cga2V5IG5hdmlnYXRpb24gYnV0IG5vdCB0eXBlYWhlYWQgbmF2aWdhdGlvbi5cbiAgICBpZiAob3BlbiAmJiBzdHJpbmdSZWYuY3VycmVudCA9PT0gJycpIHtcbiAgICAgIHZhciBfcmVmMjtcbiAgICAgIHByZXZJbmRleFJlZi5jdXJyZW50ID0gKF9yZWYyID0gc2VsZWN0ZWRJbmRleCAhPSBudWxsID8gc2VsZWN0ZWRJbmRleCA6IGFjdGl2ZUluZGV4KSAhPSBudWxsID8gX3JlZjIgOiAtMTtcbiAgICB9XG4gIH0sIFtvcGVuLCBzZWxlY3RlZEluZGV4LCBhY3RpdmVJbmRleF0pO1xuICBjb25zdCBzZXRUeXBpbmdDaGFuZ2UgPSB1c2VFZmZlY3RFdmVudCh2YWx1ZSA9PiB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAoIWRhdGFSZWYuY3VycmVudC50eXBpbmcpIHtcbiAgICAgICAgZGF0YVJlZi5jdXJyZW50LnR5cGluZyA9IHZhbHVlO1xuICAgICAgICBvblR5cGluZ0NoYW5nZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkYXRhUmVmLmN1cnJlbnQudHlwaW5nKSB7XG4gICAgICAgIGRhdGFSZWYuY3VycmVudC50eXBpbmcgPSB2YWx1ZTtcbiAgICAgICAgb25UeXBpbmdDaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGNvbnN0IG9uS2V5RG93biA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICBmdW5jdGlvbiBnZXRNYXRjaGluZ0luZGV4KGxpc3QsIG9yZGVyZWRMaXN0LCBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IHN0ciA9IGZpbmRNYXRjaFJlZi5jdXJyZW50ID8gZmluZE1hdGNoUmVmLmN1cnJlbnQob3JkZXJlZExpc3QsIHN0cmluZykgOiBvcmRlcmVkTGlzdC5maW5kKHRleHQgPT4gKHRleHQgPT0gbnVsbCA/IHZvaWQgMCA6IHRleHQudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmRleE9mKHN0cmluZy50b0xvY2FsZUxvd2VyQ2FzZSgpKSkgPT09IDApO1xuICAgICAgcmV0dXJuIHN0ciA/IGxpc3QuaW5kZXhPZihzdHIpIDogLTE7XG4gICAgfVxuICAgIGNvbnN0IGxpc3RDb250ZW50ID0gbGlzdFJlZi5jdXJyZW50O1xuICAgIGlmIChzdHJpbmdSZWYuY3VycmVudC5sZW5ndGggPiAwICYmIHN0cmluZ1JlZi5jdXJyZW50WzBdICE9PSAnICcpIHtcbiAgICAgIGlmIChnZXRNYXRjaGluZ0luZGV4KGxpc3RDb250ZW50LCBsaXN0Q29udGVudCwgc3RyaW5nUmVmLmN1cnJlbnQpID09PSAtMSkge1xuICAgICAgICBzZXRUeXBpbmdDaGFuZ2UoZmFsc2UpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGlzdENvbnRlbnQgPT0gbnVsbCB8fCBpZ25vcmVLZXlzUmVmLmN1cnJlbnQuaW5jbHVkZXMoZXZlbnQua2V5KSB8fFxuICAgIC8vIENoYXJhY3RlciBrZXkuXG4gICAgZXZlbnQua2V5Lmxlbmd0aCAhPT0gMSB8fFxuICAgIC8vIE1vZGlmaWVyIGtleS5cbiAgICBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuYWx0S2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcGVuICYmIGV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgc2V0VHlwaW5nQ2hhbmdlKHRydWUpO1xuICAgIH1cblxuICAgIC8vIEJhaWwgb3V0IGlmIHRoZSBsaXN0IGNvbnRhaW5zIGEgd29yZCBsaWtlIFwibGxhbWFcIiBvciBcImFhcm9uXCIuIFRPRE86XG4gICAgLy8gYWxsb3cgaXQgaW4gdGhpcyBjYXNlLCB0b28uXG4gICAgY29uc3QgYWxsb3dSYXBpZFN1Y2Nlc3Npb25PZkZpcnN0TGV0dGVyID0gbGlzdENvbnRlbnQuZXZlcnkodGV4dCA9PiB7XG4gICAgICB2YXIgX3RleHQkLCBfdGV4dCQyO1xuICAgICAgcmV0dXJuIHRleHQgPyAoKF90ZXh0JCA9IHRleHRbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfdGV4dCQudG9Mb2NhbGVMb3dlckNhc2UoKSkgIT09ICgoX3RleHQkMiA9IHRleHRbMV0pID09IG51bGwgPyB2b2lkIDAgOiBfdGV4dCQyLnRvTG9jYWxlTG93ZXJDYXNlKCkpIDogdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vIEFsbG93cyB0aGUgdXNlciB0byBjeWNsZSB0aHJvdWdoIGl0ZW1zIHRoYXQgc3RhcnQgd2l0aCB0aGUgc2FtZSBsZXR0ZXJcbiAgICAvLyBpbiByYXBpZCBzdWNjZXNzaW9uLlxuICAgIGlmIChhbGxvd1JhcGlkU3VjY2Vzc2lvbk9mRmlyc3RMZXR0ZXIgJiYgc3RyaW5nUmVmLmN1cnJlbnQgPT09IGV2ZW50LmtleSkge1xuICAgICAgc3RyaW5nUmVmLmN1cnJlbnQgPSAnJztcbiAgICAgIHByZXZJbmRleFJlZi5jdXJyZW50ID0gbWF0Y2hJbmRleFJlZi5jdXJyZW50O1xuICAgIH1cbiAgICBzdHJpbmdSZWYuY3VycmVudCArPSBldmVudC5rZXk7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZFJlZi5jdXJyZW50KTtcbiAgICB0aW1lb3V0SWRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgc3RyaW5nUmVmLmN1cnJlbnQgPSAnJztcbiAgICAgIHByZXZJbmRleFJlZi5jdXJyZW50ID0gbWF0Y2hJbmRleFJlZi5jdXJyZW50O1xuICAgICAgc2V0VHlwaW5nQ2hhbmdlKGZhbHNlKTtcbiAgICB9LCByZXNldE1zKTtcbiAgICBjb25zdCBwcmV2SW5kZXggPSBwcmV2SW5kZXhSZWYuY3VycmVudDtcbiAgICBjb25zdCBpbmRleCA9IGdldE1hdGNoaW5nSW5kZXgobGlzdENvbnRlbnQsIFsuLi5saXN0Q29udGVudC5zbGljZSgocHJldkluZGV4IHx8IDApICsgMSksIC4uLmxpc3RDb250ZW50LnNsaWNlKDAsIChwcmV2SW5kZXggfHwgMCkgKyAxKV0sIHN0cmluZ1JlZi5jdXJyZW50KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBvbk1hdGNoKGluZGV4KTtcbiAgICAgIG1hdGNoSW5kZXhSZWYuY3VycmVudCA9IGluZGV4O1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ICE9PSAnICcpIHtcbiAgICAgIHN0cmluZ1JlZi5jdXJyZW50ID0gJyc7XG4gICAgICBzZXRUeXBpbmdDaGFuZ2UoZmFsc2UpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBvbktleURvd25cbiAgfSksIFtvbktleURvd25dKTtcbiAgY29uc3QgZmxvYXRpbmcgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgb25LZXlEb3duLFxuICAgICAgb25LZXlVcChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgICAgICBzZXRUeXBpbmdDaGFuZ2UoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW29uS2V5RG93biwgc2V0VHlwaW5nQ2hhbmdlXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IGVuYWJsZWQgPyB7XG4gICAgcmVmZXJlbmNlLFxuICAgIGZsb2F0aW5nXG4gIH0gOiB7fSwgW2VuYWJsZWQsIHJlZmVyZW5jZSwgZmxvYXRpbmddKTtcbn1cblxuZnVuY3Rpb24gZ2V0QXJnc1dpdGhDdXN0b21GbG9hdGluZ0hlaWdodChzdGF0ZSwgaGVpZ2h0KSB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgcmVjdHM6IHtcbiAgICAgIC4uLnN0YXRlLnJlY3RzLFxuICAgICAgZmxvYXRpbmc6IHtcbiAgICAgICAgLi4uc3RhdGUucmVjdHMuZmxvYXRpbmcsXG4gICAgICAgIGhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbi8qKlxuICogUG9zaXRpb25zIHRoZSBmbG9hdGluZyBlbGVtZW50IHN1Y2ggdGhhdCBhbiBpbm5lciBlbGVtZW50IGluc2lkZSBvZiBpdCBpc1xuICogYW5jaG9yZWQgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2lubmVyXG4gKi9cbmNvbnN0IGlubmVyID0gcHJvcHMgPT4gKHtcbiAgbmFtZTogJ2lubmVyJyxcbiAgb3B0aW9uczogcHJvcHMsXG4gIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgY29uc3Qge1xuICAgICAgbGlzdFJlZixcbiAgICAgIG92ZXJmbG93UmVmLFxuICAgICAgb25GYWxsYmFja0NoYW5nZSxcbiAgICAgIG9mZnNldDogaW5uZXJPZmZzZXQgPSAwLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgbWluSXRlbXNWaXNpYmxlID0gNCxcbiAgICAgIHJlZmVyZW5jZU92ZXJmbG93VGhyZXNob2xkID0gMCxcbiAgICAgIHNjcm9sbFJlZixcbiAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICAgIH0gPSBldmFsdWF0ZShwcm9wcywgc3RhdGUpO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlY3RzLFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgZmxvYXRpbmdcbiAgICAgIH1cbiAgICB9ID0gc3RhdGU7XG4gICAgY29uc3QgaXRlbSA9IGxpc3RSZWYuY3VycmVudFtpbmRleF07XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKCFzdGF0ZS5wbGFjZW1lbnQuc3RhcnRzV2l0aCgnYm90dG9tJykpIHtcbiAgICAgICAgd2FybignYHBsYWNlbWVudGAgc2lkZSBtdXN0IGJlIFwiYm90dG9tXCIgd2hlbiB1c2luZyB0aGUgYGlubmVyYCcsICdtaWRkbGV3YXJlLicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgbmV4dEFyZ3MgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIC4uLihhd2FpdCBvZmZzZXQoLWl0ZW0ub2Zmc2V0VG9wIC0gZmxvYXRpbmcuY2xpZW50VG9wIC0gcmVjdHMucmVmZXJlbmNlLmhlaWdodCAvIDIgLSBpdGVtLm9mZnNldEhlaWdodCAvIDIgLSBpbm5lck9mZnNldCkuZm4oc3RhdGUpKVxuICAgIH07XG4gICAgY29uc3QgZWwgPSAoc2Nyb2xsUmVmID09IG51bGwgPyB2b2lkIDAgOiBzY3JvbGxSZWYuY3VycmVudCkgfHwgZmxvYXRpbmc7XG4gICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhnZXRBcmdzV2l0aEN1c3RvbUZsb2F0aW5nSGVpZ2h0KG5leHRBcmdzLCBlbC5zY3JvbGxIZWlnaHQpLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgIGNvbnN0IHJlZk92ZXJmbG93ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3cobmV4dEFyZ3MsIHtcbiAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyxcbiAgICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICAgIH0pO1xuICAgIGNvbnN0IGRpZmZZID0gTWF0aC5tYXgoMCwgb3ZlcmZsb3cudG9wKTtcbiAgICBjb25zdCBuZXh0WSA9IG5leHRBcmdzLnkgKyBkaWZmWTtcbiAgICBjb25zdCBtYXhIZWlnaHQgPSBNYXRoLm1heCgwLCBlbC5zY3JvbGxIZWlnaHQgLSBkaWZmWSAtIE1hdGgubWF4KDAsIG92ZXJmbG93LmJvdHRvbSkpO1xuICAgIGVsLnN0eWxlLm1heEhlaWdodCA9IG1heEhlaWdodCArIFwicHhcIjtcbiAgICBlbC5zY3JvbGxUb3AgPSBkaWZmWTtcblxuICAgIC8vIFRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UsIGZhbGxiYWNrIHRvIHN0YW5kYXJkIGFuY2hvcmVkIHBvc2l0aW9uaW5nXG4gICAgaWYgKG9uRmFsbGJhY2tDaGFuZ2UpIHtcbiAgICAgIGlmIChlbC5vZmZzZXRIZWlnaHQgPCBpdGVtLm9mZnNldEhlaWdodCAqIE1hdGgubWluKG1pbkl0ZW1zVmlzaWJsZSwgbGlzdFJlZi5jdXJyZW50Lmxlbmd0aCAtIDEpIC0gMSB8fCByZWZPdmVyZmxvdy50b3AgPj0gLXJlZmVyZW5jZU92ZXJmbG93VGhyZXNob2xkIHx8IHJlZk92ZXJmbG93LmJvdHRvbSA+PSAtcmVmZXJlbmNlT3ZlcmZsb3dUaHJlc2hvbGQpIHtcbiAgICAgICAgUmVhY3RET00uZmx1c2hTeW5jKCgpID0+IG9uRmFsbGJhY2tDaGFuZ2UodHJ1ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgUmVhY3RET00uZmx1c2hTeW5jKCgpID0+IG9uRmFsbGJhY2tDaGFuZ2UoZmFsc2UpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG92ZXJmbG93UmVmKSB7XG4gICAgICBvdmVyZmxvd1JlZi5jdXJyZW50ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3coZ2V0QXJnc1dpdGhDdXN0b21GbG9hdGluZ0hlaWdodCh7XG4gICAgICAgIC4uLm5leHRBcmdzLFxuICAgICAgICB5OiBuZXh0WVxuICAgICAgfSwgZWwub2Zmc2V0SGVpZ2h0KSwgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHk6IG5leHRZXG4gICAgfTtcbiAgfVxufSk7XG4vKipcbiAqIENoYW5nZXMgdGhlIGBpbm5lcmAgbWlkZGxld2FyZSdzIGBvZmZzZXRgIHVwb24gYSBgd2hlZWxgIGV2ZW50IHRvXG4gKiBleHBhbmQgdGhlIGZsb2F0aW5nIGVsZW1lbnQncyBoZWlnaHQsIHJldmVhbGluZyBtb3JlIGxpc3QgaXRlbXMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaW5uZXJcbiAqL1xuZnVuY3Rpb24gdXNlSW5uZXJPZmZzZXQoY29udGV4dCwgcHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgZWxlbWVudHNcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBvdmVyZmxvd1JlZixcbiAgICBzY3JvbGxSZWYsXG4gICAgb25DaGFuZ2U6IHVuc3RhYmxlX29uQ2hhbmdlXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qgb25DaGFuZ2UgPSB1c2VFZmZlY3RFdmVudCh1bnN0YWJsZV9vbkNoYW5nZSk7XG4gIGNvbnN0IGNvbnRyb2xsZWRTY3JvbGxpbmdSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBwcmV2U2Nyb2xsVG9wUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBpbml0aWFsT3ZlcmZsb3dSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgZnVuY3Rpb24gb25XaGVlbChlKSB7XG4gICAgICBpZiAoZS5jdHJsS2V5IHx8ICFlbCB8fCBvdmVyZmxvd1JlZi5jdXJyZW50ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZFkgPSBlLmRlbHRhWTtcbiAgICAgIGNvbnN0IGlzQXRUb3AgPSBvdmVyZmxvd1JlZi5jdXJyZW50LnRvcCA+PSAtMC41O1xuICAgICAgY29uc3QgaXNBdEJvdHRvbSA9IG92ZXJmbG93UmVmLmN1cnJlbnQuYm90dG9tID49IC0wLjU7XG4gICAgICBjb25zdCByZW1haW5pbmdTY3JvbGwgPSBlbC5zY3JvbGxIZWlnaHQgLSBlbC5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBzaWduID0gZFkgPCAwID8gLTEgOiAxO1xuICAgICAgY29uc3QgbWV0aG9kID0gZFkgPCAwID8gJ21heCcgOiAnbWluJztcbiAgICAgIGlmIChlbC5zY3JvbGxIZWlnaHQgPD0gZWwuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBdFRvcCAmJiBkWSA+IDAgfHwgIWlzQXRCb3R0b20gJiYgZFkgPCAwKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgUmVhY3RET00uZmx1c2hTeW5jKCgpID0+IHtcbiAgICAgICAgICBvbkNoYW5nZShkID0+IGQgKyBNYXRoW21ldGhvZF0oZFksIHJlbWFpbmluZ1Njcm9sbCAqIHNpZ24pKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKC9maXJlZm94L2kudGVzdChnZXRVc2VyQWdlbnQoKSkpIHtcbiAgICAgICAgLy8gTmVlZGVkIHRvIHByb3BhZ2F0ZSBzY3JvbGxpbmcgZHVyaW5nIG1vbWVudHVtIHNjcm9sbGluZyBwaGFzZSBvbmNlXG4gICAgICAgIC8vIGl0IGdldHMgbGltaXRlZCBieSB0aGUgYm91bmRhcnkuIFVYIGltcHJvdmVtZW50LCBub3QgY3JpdGljYWwuXG4gICAgICAgIGVsLnNjcm9sbFRvcCArPSBkWTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZWwgPSAoc2Nyb2xsUmVmID09IG51bGwgPyB2b2lkIDAgOiBzY3JvbGxSZWYuY3VycmVudCkgfHwgZWxlbWVudHMuZmxvYXRpbmc7XG4gICAgaWYgKG9wZW4gJiYgZWwpIHtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCk7XG5cbiAgICAgIC8vIFdhaXQgZm9yIHRoZSBwb3NpdGlvbiB0byBiZSByZWFkeS5cbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHByZXZTY3JvbGxUb3BSZWYuY3VycmVudCA9IGVsLnNjcm9sbFRvcDtcbiAgICAgICAgaWYgKG92ZXJmbG93UmVmLmN1cnJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIGluaXRpYWxPdmVyZmxvd1JlZi5jdXJyZW50ID0ge1xuICAgICAgICAgICAgLi4ub3ZlcmZsb3dSZWYuY3VycmVudFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcHJldlNjcm9sbFRvcFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgaW5pdGlhbE92ZXJmbG93UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uV2hlZWwpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtlbmFibGVkLCBvcGVuLCBlbGVtZW50cy5mbG9hdGluZywgb3ZlcmZsb3dSZWYsIHNjcm9sbFJlZiwgb25DaGFuZ2VdKTtcbiAgY29uc3QgZmxvYXRpbmcgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgb25LZXlEb3duKCkge1xuICAgICAgY29udHJvbGxlZFNjcm9sbGluZ1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9LFxuICAgIG9uV2hlZWwoKSB7XG4gICAgICBjb250cm9sbGVkU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9LFxuICAgIG9uUG9pbnRlck1vdmUoKSB7XG4gICAgICBjb250cm9sbGVkU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9LFxuICAgIG9uU2Nyb2xsKCkge1xuICAgICAgY29uc3QgZWwgPSAoc2Nyb2xsUmVmID09IG51bGwgPyB2b2lkIDAgOiBzY3JvbGxSZWYuY3VycmVudCkgfHwgZWxlbWVudHMuZmxvYXRpbmc7XG4gICAgICBpZiAoIW92ZXJmbG93UmVmLmN1cnJlbnQgfHwgIWVsIHx8ICFjb250cm9sbGVkU2Nyb2xsaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZTY3JvbGxUb3BSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBzY3JvbGxEaWZmID0gZWwuc2Nyb2xsVG9wIC0gcHJldlNjcm9sbFRvcFJlZi5jdXJyZW50O1xuICAgICAgICBpZiAob3ZlcmZsb3dSZWYuY3VycmVudC5ib3R0b20gPCAtMC41ICYmIHNjcm9sbERpZmYgPCAtMSB8fCBvdmVyZmxvd1JlZi5jdXJyZW50LnRvcCA8IC0wLjUgJiYgc2Nyb2xsRGlmZiA+IDEpIHtcbiAgICAgICAgICBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4gb25DaGFuZ2UoZCA9PiBkICsgc2Nyb2xsRGlmZikpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFtGaXJlZm94XSBXYWl0IGZvciB0aGUgaGVpZ2h0IGNoYW5nZSB0byBoYXZlIGJlZW4gYXBwbGllZC5cbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHByZXZTY3JvbGxUb3BSZWYuY3VycmVudCA9IGVsLnNjcm9sbFRvcDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIFtlbGVtZW50cy5mbG9hdGluZywgb25DaGFuZ2UsIG92ZXJmbG93UmVmLCBzY3JvbGxSZWZdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICBmbG9hdGluZ1xuICB9IDoge30sIFtlbmFibGVkLCBmbG9hdGluZ10pO1xufVxuXG5mdW5jdGlvbiBpc1BvaW50SW5Qb2x5Z29uKHBvaW50LCBwb2x5Z29uKSB7XG4gIGNvbnN0IFt4LCB5XSA9IHBvaW50O1xuICBsZXQgaXNJbnNpZGUgPSBmYWxzZTtcbiAgY29uc3QgbGVuZ3RoID0gcG9seWdvbi5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwLCBqID0gbGVuZ3RoIC0gMTsgaSA8IGxlbmd0aDsgaiA9IGkrKykge1xuICAgIGNvbnN0IFt4aSwgeWldID0gcG9seWdvbltpXSB8fCBbMCwgMF07XG4gICAgY29uc3QgW3hqLCB5al0gPSBwb2x5Z29uW2pdIHx8IFswLCAwXTtcbiAgICBjb25zdCBpbnRlcnNlY3QgPSB5aSA+PSB5ICE9PSB5aiA+PSB5ICYmIHggPD0gKHhqIC0geGkpICogKHkgLSB5aSkgLyAoeWogLSB5aSkgKyB4aTtcbiAgICBpZiAoaW50ZXJzZWN0KSB7XG4gICAgICBpc0luc2lkZSA9ICFpc0luc2lkZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGlzSW5zaWRlO1xufVxuZnVuY3Rpb24gaXNJbnNpZGUocG9pbnQsIHJlY3QpIHtcbiAgcmV0dXJuIHBvaW50WzBdID49IHJlY3QueCAmJiBwb2ludFswXSA8PSByZWN0LnggKyByZWN0LndpZHRoICYmIHBvaW50WzFdID49IHJlY3QueSAmJiBwb2ludFsxXSA8PSByZWN0LnkgKyByZWN0LmhlaWdodDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgc2FmZSBwb2x5Z29uIGFyZWEgdGhhdCB0aGUgdXNlciBjYW4gdHJhdmVyc2Ugd2l0aG91dCBjbG9zaW5nIHRoZVxuICogZmxvYXRpbmcgZWxlbWVudCBvbmNlIGxlYXZpbmcgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUhvdmVyI3NhZmVwb2x5Z29uXG4gKi9cbmZ1bmN0aW9uIHNhZmVQb2x5Z29uKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgYnVmZmVyID0gMC41LFxuICAgIGJsb2NrUG9pbnRlckV2ZW50cyA9IGZhbHNlLFxuICAgIHJlcXVpcmVJbnRlbnQgPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuICBsZXQgdGltZW91dElkO1xuICBsZXQgaGFzTGFuZGVkID0gZmFsc2U7XG4gIGxldCBsYXN0WCA9IG51bGw7XG4gIGxldCBsYXN0WSA9IG51bGw7XG4gIGxldCBsYXN0Q3Vyc29yVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICBmdW5jdGlvbiBnZXRDdXJzb3JTcGVlZCh4LCB5KSB7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IGN1cnJlbnRUaW1lIC0gbGFzdEN1cnNvclRpbWU7XG4gICAgaWYgKGxhc3RYID09PSBudWxsIHx8IGxhc3RZID09PSBudWxsIHx8IGVsYXBzZWRUaW1lID09PSAwKSB7XG4gICAgICBsYXN0WCA9IHg7XG4gICAgICBsYXN0WSA9IHk7XG4gICAgICBsYXN0Q3Vyc29yVGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGRlbHRhWCA9IHggLSBsYXN0WDtcbiAgICBjb25zdCBkZWx0YVkgPSB5IC0gbGFzdFk7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICBjb25zdCBzcGVlZCA9IGRpc3RhbmNlIC8gZWxhcHNlZFRpbWU7IC8vIHB4IC8gbXNcblxuICAgIGxhc3RYID0geDtcbiAgICBsYXN0WSA9IHk7XG4gICAgbGFzdEN1cnNvclRpbWUgPSBjdXJyZW50VGltZTtcbiAgICByZXR1cm4gc3BlZWQ7XG4gIH1cbiAgY29uc3QgZm4gPSBfcmVmID0+IHtcbiAgICBsZXQge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBlbGVtZW50cyxcbiAgICAgIG9uQ2xvc2UsXG4gICAgICBub2RlSWQsXG4gICAgICB0cmVlXG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIG9uQ2xvc2UoKTtcbiAgICAgIH1cbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgaWYgKCFlbGVtZW50cy5kb21SZWZlcmVuY2UgfHwgIWVsZW1lbnRzLmZsb2F0aW5nIHx8IHBsYWNlbWVudCA9PSBudWxsIHx8IHggPT0gbnVsbCB8fCB5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBjbGllbnRYLFxuICAgICAgICBjbGllbnRZXG4gICAgICB9ID0gZXZlbnQ7XG4gICAgICBjb25zdCBjbGllbnRQb2ludCA9IFtjbGllbnRYLCBjbGllbnRZXTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudCk7XG4gICAgICBjb25zdCBpc0xlYXZlID0gZXZlbnQudHlwZSA9PT0gJ21vdXNlbGVhdmUnO1xuICAgICAgY29uc3QgaXNPdmVyRmxvYXRpbmdFbCA9IGNvbnRhaW5zKGVsZW1lbnRzLmZsb2F0aW5nLCB0YXJnZXQpO1xuICAgICAgY29uc3QgaXNPdmVyUmVmZXJlbmNlRWwgPSBjb250YWlucyhlbGVtZW50cy5kb21SZWZlcmVuY2UsIHRhcmdldCk7XG4gICAgICBjb25zdCByZWZSZWN0ID0gZWxlbWVudHMuZG9tUmVmZXJlbmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnRzLmZsb2F0aW5nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qgc2lkZSA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICAgICAgY29uc3QgY3Vyc29yTGVhdmVGcm9tUmlnaHQgPSB4ID4gcmVjdC5yaWdodCAtIHJlY3Qud2lkdGggLyAyO1xuICAgICAgY29uc3QgY3Vyc29yTGVhdmVGcm9tQm90dG9tID0geSA+IHJlY3QuYm90dG9tIC0gcmVjdC5oZWlnaHQgLyAyO1xuICAgICAgY29uc3QgaXNPdmVyUmVmZXJlbmNlUmVjdCA9IGlzSW5zaWRlKGNsaWVudFBvaW50LCByZWZSZWN0KTtcbiAgICAgIGNvbnN0IGlzRmxvYXRpbmdXaWRlciA9IHJlY3Qud2lkdGggPiByZWZSZWN0LndpZHRoO1xuICAgICAgY29uc3QgaXNGbG9hdGluZ1RhbGxlciA9IHJlY3QuaGVpZ2h0ID4gcmVmUmVjdC5oZWlnaHQ7XG4gICAgICBjb25zdCBsZWZ0ID0gKGlzRmxvYXRpbmdXaWRlciA/IHJlZlJlY3QgOiByZWN0KS5sZWZ0O1xuICAgICAgY29uc3QgcmlnaHQgPSAoaXNGbG9hdGluZ1dpZGVyID8gcmVmUmVjdCA6IHJlY3QpLnJpZ2h0O1xuICAgICAgY29uc3QgdG9wID0gKGlzRmxvYXRpbmdUYWxsZXIgPyByZWZSZWN0IDogcmVjdCkudG9wO1xuICAgICAgY29uc3QgYm90dG9tID0gKGlzRmxvYXRpbmdUYWxsZXIgPyByZWZSZWN0IDogcmVjdCkuYm90dG9tO1xuICAgICAgaWYgKGlzT3ZlckZsb2F0aW5nRWwpIHtcbiAgICAgICAgaGFzTGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFpc0xlYXZlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNPdmVyUmVmZXJlbmNlRWwpIHtcbiAgICAgICAgaGFzTGFuZGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNPdmVyUmVmZXJlbmNlRWwgJiYgIWlzTGVhdmUpIHtcbiAgICAgICAgaGFzTGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmV2ZW50IG92ZXJsYXBwaW5nIGZsb2F0aW5nIGVsZW1lbnQgZnJvbSBiZWluZyBzdHVjayBpbiBhbiBvcGVuLWNsb3NlXG4gICAgICAvLyBsb29wOiBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzE5MTBcbiAgICAgIGlmIChpc0xlYXZlICYmIGlzRWxlbWVudChldmVudC5yZWxhdGVkVGFyZ2V0KSAmJiBjb250YWlucyhlbGVtZW50cy5mbG9hdGluZywgZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBhbnkgbmVzdGVkIGNoaWxkIGlzIG9wZW4sIGFib3J0LlxuICAgICAgaWYgKHRyZWUgJiYgZ2V0Q2hpbGRyZW4odHJlZS5ub2Rlc1JlZi5jdXJyZW50LCBub2RlSWQpLnNvbWUoX3JlZjIgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgfSA9IF9yZWYyO1xuICAgICAgICByZXR1cm4gY29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogY29udGV4dC5vcGVuO1xuICAgICAgfSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgcG9pbnRlciBpcyBsZWF2aW5nIGZyb20gdGhlIG9wcG9zaXRlIHNpZGUsIHRoZSBcImJ1ZmZlclwiIGxvZ2ljXG4gICAgICAvLyBjcmVhdGVzIGEgcG9pbnQgd2hlcmUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgcmVtYWlucyBvcGVuLCBidXQgc2hvdWxkIGJlXG4gICAgICAvLyBpZ25vcmVkLlxuICAgICAgLy8gQSBjb25zdGFudCBvZiAxIGhhbmRsZXMgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzLlxuICAgICAgaWYgKHNpZGUgPT09ICd0b3AnICYmIHkgPj0gcmVmUmVjdC5ib3R0b20gLSAxIHx8IHNpZGUgPT09ICdib3R0b20nICYmIHkgPD0gcmVmUmVjdC50b3AgKyAxIHx8IHNpZGUgPT09ICdsZWZ0JyAmJiB4ID49IHJlZlJlY3QucmlnaHQgLSAxIHx8IHNpZGUgPT09ICdyaWdodCcgJiYgeCA8PSByZWZSZWN0LmxlZnQgKyAxKSB7XG4gICAgICAgIHJldHVybiBjbG9zZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZ25vcmUgd2hlbiB0aGUgY3Vyc29yIGlzIHdpdGhpbiB0aGUgcmVjdGFuZ3VsYXIgdHJvdWdoIGJldHdlZW4gdGhlXG4gICAgICAvLyB0d28gZWxlbWVudHMuIFNpbmNlIHRoZSB0cmlhbmdsZSBpcyBjcmVhdGVkIGZyb20gdGhlIGN1cnNvciBwb2ludCxcbiAgICAgIC8vIHdoaWNoIGNhbiBzdGFydCBiZXlvbmQgdGhlIHJlZiBlbGVtZW50J3MgZWRnZSwgdHJhdmVyc2luZyBiYWNrIGFuZFxuICAgICAgLy8gZm9ydGggZnJvbSB0aGUgcmVmIHRvIHRoZSBmbG9hdGluZyBlbGVtZW50IGNhbiBjYXVzZSBpdCB0byBjbG9zZS4gVGhpc1xuICAgICAgLy8gZW5zdXJlcyBpdCBhbHdheXMgcmVtYWlucyBvcGVuIGluIHRoYXQgY2FzZS5cbiAgICAgIGxldCByZWN0UG9seSA9IFtdO1xuICAgICAgc3dpdGNoIChzaWRlKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgcmVjdFBvbHkgPSBbW2xlZnQsIHJlZlJlY3QudG9wICsgMV0sIFtsZWZ0LCByZWN0LmJvdHRvbSAtIDFdLCBbcmlnaHQsIHJlY3QuYm90dG9tIC0gMV0sIFtyaWdodCwgcmVmUmVjdC50b3AgKyAxXV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgcmVjdFBvbHkgPSBbW2xlZnQsIHJlY3QudG9wICsgMV0sIFtsZWZ0LCByZWZSZWN0LmJvdHRvbSAtIDFdLCBbcmlnaHQsIHJlZlJlY3QuYm90dG9tIC0gMV0sIFtyaWdodCwgcmVjdC50b3AgKyAxXV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIHJlY3RQb2x5ID0gW1tyZWN0LnJpZ2h0IC0gMSwgYm90dG9tXSwgW3JlY3QucmlnaHQgLSAxLCB0b3BdLCBbcmVmUmVjdC5sZWZ0ICsgMSwgdG9wXSwgW3JlZlJlY3QubGVmdCArIDEsIGJvdHRvbV1dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgcmVjdFBvbHkgPSBbW3JlZlJlY3QucmlnaHQgLSAxLCBib3R0b21dLCBbcmVmUmVjdC5yaWdodCAtIDEsIHRvcF0sIFtyZWN0LmxlZnQgKyAxLCB0b3BdLCBbcmVjdC5sZWZ0ICsgMSwgYm90dG9tXV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBnZXRQb2x5Z29uKF9yZWYzKSB7XG4gICAgICAgIGxldCBbeCwgeV0gPSBfcmVmMztcbiAgICAgICAgc3dpdGNoIChzaWRlKSB7XG4gICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRPbmUgPSBbaXNGbG9hdGluZ1dpZGVyID8geCArIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IHggKyBidWZmZXIgKiA0IDogeCAtIGJ1ZmZlciAqIDQsIHkgKyBidWZmZXIgKyAxXTtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRUd28gPSBbaXNGbG9hdGluZ1dpZGVyID8geCAtIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IHggKyBidWZmZXIgKiA0IDogeCAtIGJ1ZmZlciAqIDQsIHkgKyBidWZmZXIgKyAxXTtcbiAgICAgICAgICAgICAgY29uc3QgY29tbW9uUG9pbnRzID0gW1tyZWN0LmxlZnQsIGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8gcmVjdC5ib3R0b20gLSBidWZmZXIgOiBpc0Zsb2F0aW5nV2lkZXIgPyByZWN0LmJvdHRvbSAtIGJ1ZmZlciA6IHJlY3QudG9wXSwgW3JlY3QucmlnaHQsIGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8gaXNGbG9hdGluZ1dpZGVyID8gcmVjdC5ib3R0b20gLSBidWZmZXIgOiByZWN0LnRvcCA6IHJlY3QuYm90dG9tIC0gYnVmZmVyXV07XG4gICAgICAgICAgICAgIHJldHVybiBbY3Vyc29yUG9pbnRPbmUsIGN1cnNvclBvaW50VHdvLCAuLi5jb21tb25Qb2ludHNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50T25lID0gW2lzRmxvYXRpbmdXaWRlciA/IHggKyBidWZmZXIgLyAyIDogY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyB4ICsgYnVmZmVyICogNCA6IHggLSBidWZmZXIgKiA0LCB5IC0gYnVmZmVyXTtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRUd28gPSBbaXNGbG9hdGluZ1dpZGVyID8geCAtIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IHggKyBidWZmZXIgKiA0IDogeCAtIGJ1ZmZlciAqIDQsIHkgLSBidWZmZXJdO1xuICAgICAgICAgICAgICBjb25zdCBjb21tb25Qb2ludHMgPSBbW3JlY3QubGVmdCwgY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyByZWN0LnRvcCArIGJ1ZmZlciA6IGlzRmxvYXRpbmdXaWRlciA/IHJlY3QudG9wICsgYnVmZmVyIDogcmVjdC5ib3R0b21dLCBbcmVjdC5yaWdodCwgY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyBpc0Zsb2F0aW5nV2lkZXIgPyByZWN0LnRvcCArIGJ1ZmZlciA6IHJlY3QuYm90dG9tIDogcmVjdC50b3AgKyBidWZmZXJdXTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtjdXJzb3JQb2ludE9uZSwgY3Vyc29yUG9pbnRUd28sIC4uLmNvbW1vblBvaW50c107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50T25lID0gW3ggKyBidWZmZXIgKyAxLCBpc0Zsb2F0aW5nVGFsbGVyID8geSArIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyB5ICsgYnVmZmVyICogNCA6IHkgLSBidWZmZXIgKiA0XTtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRUd28gPSBbeCArIGJ1ZmZlciArIDEsIGlzRmxvYXRpbmdUYWxsZXIgPyB5IC0gYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHkgKyBidWZmZXIgKiA0IDogeSAtIGJ1ZmZlciAqIDRdO1xuICAgICAgICAgICAgICBjb25zdCBjb21tb25Qb2ludHMgPSBbW2N1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHJlY3QucmlnaHQgLSBidWZmZXIgOiBpc0Zsb2F0aW5nVGFsbGVyID8gcmVjdC5yaWdodCAtIGJ1ZmZlciA6IHJlY3QubGVmdCwgcmVjdC50b3BdLCBbY3Vyc29yTGVhdmVGcm9tQm90dG9tID8gaXNGbG9hdGluZ1RhbGxlciA/IHJlY3QucmlnaHQgLSBidWZmZXIgOiByZWN0LmxlZnQgOiByZWN0LnJpZ2h0IC0gYnVmZmVyLCByZWN0LmJvdHRvbV1dO1xuICAgICAgICAgICAgICByZXR1cm4gWy4uLmNvbW1vblBvaW50cywgY3Vyc29yUG9pbnRPbmUsIGN1cnNvclBvaW50VHdvXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50T25lID0gW3ggLSBidWZmZXIsIGlzRmxvYXRpbmdUYWxsZXIgPyB5ICsgYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHkgKyBidWZmZXIgKiA0IDogeSAtIGJ1ZmZlciAqIDRdO1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludFR3byA9IFt4IC0gYnVmZmVyLCBpc0Zsb2F0aW5nVGFsbGVyID8geSAtIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyB5ICsgYnVmZmVyICogNCA6IHkgLSBidWZmZXIgKiA0XTtcbiAgICAgICAgICAgICAgY29uc3QgY29tbW9uUG9pbnRzID0gW1tjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyByZWN0LmxlZnQgKyBidWZmZXIgOiBpc0Zsb2F0aW5nVGFsbGVyID8gcmVjdC5sZWZ0ICsgYnVmZmVyIDogcmVjdC5yaWdodCwgcmVjdC50b3BdLCBbY3Vyc29yTGVhdmVGcm9tQm90dG9tID8gaXNGbG9hdGluZ1RhbGxlciA/IHJlY3QubGVmdCArIGJ1ZmZlciA6IHJlY3QucmlnaHQgOiByZWN0LmxlZnQgKyBidWZmZXIsIHJlY3QuYm90dG9tXV07XG4gICAgICAgICAgICAgIHJldHVybiBbY3Vyc29yUG9pbnRPbmUsIGN1cnNvclBvaW50VHdvLCAuLi5jb21tb25Qb2ludHNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNQb2ludEluUG9seWdvbihbY2xpZW50WCwgY2xpZW50WV0sIHJlY3RQb2x5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaGFzTGFuZGVkICYmICFpc092ZXJSZWZlcmVuY2VSZWN0KSB7XG4gICAgICAgIHJldHVybiBjbG9zZSgpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0xlYXZlICYmIHJlcXVpcmVJbnRlbnQpIHtcbiAgICAgICAgY29uc3QgY3Vyc29yU3BlZWQgPSBnZXRDdXJzb3JTcGVlZChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgICAgY29uc3QgY3Vyc29yU3BlZWRUaHJlc2hvbGQgPSAwLjE7XG4gICAgICAgIGlmIChjdXJzb3JTcGVlZCAhPT0gbnVsbCAmJiBjdXJzb3JTcGVlZCA8IGN1cnNvclNwZWVkVGhyZXNob2xkKSB7XG4gICAgICAgICAgcmV0dXJuIGNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNQb2ludEluUG9seWdvbihbY2xpZW50WCwgY2xpZW50WV0sIGdldFBvbHlnb24oW3gsIHldKSkpIHtcbiAgICAgICAgY2xvc2UoKTtcbiAgICAgIH0gZWxzZSBpZiAoIWhhc0xhbmRlZCAmJiByZXF1aXJlSW50ZW50KSB7XG4gICAgICAgIHRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KGNsb3NlLCA0MCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgZm4uX19vcHRpb25zID0ge1xuICAgIGJsb2NrUG9pbnRlckV2ZW50c1xuICB9O1xuICByZXR1cm4gZm47XG59XG5cbmV4cG9ydCB7IENvbXBvc2l0ZSwgQ29tcG9zaXRlSXRlbSwgRmxvYXRpbmdBcnJvdywgRmxvYXRpbmdEZWxheUdyb3VwLCBGbG9hdGluZ0ZvY3VzTWFuYWdlciwgRmxvYXRpbmdMaXN0LCBGbG9hdGluZ05vZGUsIEZsb2F0aW5nT3ZlcmxheSwgRmxvYXRpbmdQb3J0YWwsIEZsb2F0aW5nVHJlZSwgaW5uZXIsIHNhZmVQb2x5Z29uLCB1c2VDbGljaywgdXNlQ2xpZW50UG9pbnQsIHVzZURlbGF5R3JvdXAsIHVzZURlbGF5R3JvdXBDb250ZXh0LCB1c2VEaXNtaXNzLCB1c2VGbG9hdGluZywgdXNlRmxvYXRpbmdOb2RlSWQsIHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkLCB1c2VGbG9hdGluZ1BvcnRhbE5vZGUsIHVzZUZsb2F0aW5nUm9vdENvbnRleHQsIHVzZUZsb2F0aW5nVHJlZSwgdXNlRm9jdXMsIHVzZUhvdmVyLCB1c2VJZCwgdXNlSW5uZXJPZmZzZXQsIHVzZUludGVyYWN0aW9ucywgdXNlTGlzdEl0ZW0sIHVzZUxpc3ROYXZpZ2F0aW9uLCB1c2VNZXJnZVJlZnMsIHVzZVJvbGUsIHVzZVRyYW5zaXRpb25TdGF0dXMsIHVzZVRyYW5zaXRpb25TdHlsZXMsIHVzZVR5cGVhaGVhZCB9O1xuIiwiaW1wb3J0IHBha28gZnJvbSAncGFrbyc7XG5cbnZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9O1xuXG5mdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgbW9kdWxlKSB7XG5cdHJldHVybiBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH0sIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0cztcbn1cblxuZnVuY3Rpb24gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZSAobikge1xuXHRyZXR1cm4gbiAmJiBuWydkZWZhdWx0J10gfHwgbjtcbn1cblxudmFyIGJ5dGVMZW5ndGhfMSA9IGJ5dGVMZW5ndGg7XG52YXIgdG9CeXRlQXJyYXlfMSA9IHRvQnl0ZUFycmF5O1xudmFyIGZyb21CeXRlQXJyYXlfMSA9IGZyb21CeXRlQXJyYXk7XG52YXIgbG9va3VwID0gW107XG52YXIgcmV2TG9va3VwID0gW107XG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5O1xudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV07XG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaTtcbn0gLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xuXG5cbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MjtcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2MztcblxuZnVuY3Rpb24gZ2V0TGVucyhiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGg7XG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Jyk7XG4gIH0gLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuXG5cbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKTtcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW47XG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuID8gMCA6IDQgLSB2YWxpZExlbiAlIDQ7XG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl07XG59IC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuXG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGgoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpO1xuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdO1xuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXTtcbiAgcmV0dXJuICh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCAtIHBsYWNlSG9sZGVyc0xlbjtcbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQgLSBwbGFjZUhvbGRlcnNMZW47XG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5KGI2NCkge1xuICB2YXIgdG1wO1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KTtcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXTtcbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV07XG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpO1xuICB2YXIgY3VyQnl0ZSA9IDA7IC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcblxuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMCA/IHZhbGlkTGVuIC0gNCA6IHZhbGlkTGVuO1xuICB2YXIgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPSByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4IHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2IHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV07XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgPj4gMTYgJiAweEZGO1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wID4+IDggJiAweEZGO1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRjtcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPSByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0O1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRjtcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPSByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDI7XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgPj4gOCAmIDB4RkY7XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0KG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl07XG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXA7XG4gIHZhciBvdXRwdXQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9ICh1aW50OFtpXSA8PCAxNiAmIDB4RkYwMDAwKSArICh1aW50OFtpICsgMV0gPDwgOCAmIDB4RkYwMCkgKyAodWludDhbaSArIDJdICYgMHhGRik7XG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSh1aW50OCkge1xuICB2YXIgdG1wO1xuICB2YXIgbGVuID0gdWludDgubGVuZ3RoO1xuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDM7IC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG5cbiAgdmFyIHBhcnRzID0gW107XG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzOyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCBpICsgbWF4Q2h1bmtMZW5ndGggPiBsZW4yID8gbGVuMiA6IGkgKyBtYXhDaHVua0xlbmd0aCkpO1xuICB9IC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcblxuXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV07XG4gICAgcGFydHMucHVzaChsb29rdXBbdG1wID4+IDJdICsgbG9va3VwW3RtcCA8PCA0ICYgMHgzRl0gKyAnPT0nKTtcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV07XG4gICAgcGFydHMucHVzaChsb29rdXBbdG1wID4+IDEwXSArIGxvb2t1cFt0bXAgPj4gNCAmIDB4M0ZdICsgbG9va3VwW3RtcCA8PCAyICYgMHgzRl0gKyAnPScpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpO1xufVxuXG52YXIgYmFzZTY0SnMgPSB7XG4gIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGhfMSxcbiAgdG9CeXRlQXJyYXk6IHRvQnl0ZUFycmF5XzEsXG4gIGZyb21CeXRlQXJyYXk6IGZyb21CeXRlQXJyYXlfMVxufTtcblxudmFyIHJlYWQgPSBmdW5jdGlvbiByZWFkKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG07XG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTtcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxO1xuICB2YXIgbkJpdHMgPSAtNztcbiAgdmFyIGkgPSBpc0xFID8gbkJ5dGVzIC0gMSA6IDA7XG4gIHZhciBkID0gaXNMRSA/IC0xIDogMTtcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV07XG4gIGkgKz0gZDtcbiAgZSA9IHMgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgcyA+Pj0gLW5CaXRzO1xuICBuQml0cyArPSBlTGVuO1xuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgZSA+Pj0gLW5CaXRzO1xuICBuQml0cyArPSBtTGVuO1xuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzO1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6IChzID8gLTEgOiAxKSAqIEluZmluaXR5O1xuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbik7XG4gICAgZSA9IGUgLSBlQmlhcztcbiAgfVxuXG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pO1xufTtcblxudmFyIHdyaXRlID0gZnVuY3Rpb24gd3JpdGUoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGM7XG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTtcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxO1xuICB2YXIgcnQgPSBtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMDtcbiAgdmFyIGkgPSBpc0xFID8gMCA6IG5CeXRlcyAtIDE7XG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMTtcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/IDEgOiAwO1xuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKTtcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMDtcbiAgICBlID0gZU1heDtcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMik7XG5cbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS07XG4gICAgICBjICo9IDI7XG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrKztcbiAgICAgIGMgLz0gMjtcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwO1xuICAgICAgZSA9IGVNYXg7XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pO1xuICAgICAgZSA9IGUgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pO1xuICAgICAgZSA9IDA7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gZSA8PCBtTGVuIHwgbTtcbiAgZUxlbiArPSBtTGVuO1xuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjg7XG59O1xuXG52YXIgaWVlZTc1NCA9IHtcbiAgcmVhZDogcmVhZCxcbiAgd3JpdGU6IHdyaXRlXG59O1xuXG52YXIgYnVmZmVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXG4gIHZhciBjdXN0b21JbnNwZWN0U3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sW1wiZm9yXCJdID09PSAnZnVuY3Rpb24nID8gU3ltYm9sW1wiZm9yXCJdKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpIDogbnVsbDtcbiAgZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXI7XG4gIGV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXI7XG4gIGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MDtcbiAgdmFyIEtfTUFYX0xFTkdUSCA9IDB4N2ZmZmZmZmY7XG4gIGV4cG9ydHMua01heExlbmd0aCA9IEtfTUFYX0xFTkdUSDtcbiAgLyoqXG4gICAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gICAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gICAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICAgKiAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICAgKlxuICAgKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gICAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAgICpcbiAgICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gICAqIHVzaW5nIF9fcHJvdG9fXy4gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWBcbiAgICogKFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4KS4gSUUgMTAgbGFja3Mgc3VwcG9ydFxuICAgKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG5cbiAgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpO1xuXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcignVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgKyAnYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0KCkge1xuICAgIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgICB0cnkge1xuICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpO1xuICAgICAgdmFyIHByb3RvID0ge1xuICAgICAgICBmb286IGZ1bmN0aW9uIGZvbygpIHtcbiAgICAgICAgICByZXR1cm4gNDI7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihhcnIsIHByb3RvKTtcbiAgICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gICAgfVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdvZmZzZXQnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldDtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcihsZW5ndGgpIHtcbiAgICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIGxlbmd0aCArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKTtcbiAgICB9IC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG5cblxuICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsIEJ1ZmZlci5wcm90b3R5cGUpO1xuICAgIHJldHVybiBidWY7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICAgKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gICAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAgICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAgICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAgICpcbiAgICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAgIC8vIENvbW1vbiBjYXNlLlxuICAgIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxsb2NVbnNhZmUoYXJnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbShhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCk7XG4gIH1cblxuICBCdWZmZXIucG9vbFNpemUgPSA4MTkyOyAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbiAgZnVuY3Rpb24gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmcm9tU3RyaW5nKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICsgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChpc0luc3RhbmNlKHZhbHVlLCBBcnJheUJ1ZmZlcikgfHwgdmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIEFycmF5QnVmZmVyKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiAoaXNJbnN0YW5jZSh2YWx1ZSwgU2hhcmVkQXJyYXlCdWZmZXIpIHx8IHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBTaGFyZWRBcnJheUJ1ZmZlcikpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlIG51bWJlcicpO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiAmJiB2YWx1ZS52YWx1ZU9mKCk7XG5cbiAgICBpZiAodmFsdWVPZiAhPSBudWxsICYmIHZhbHVlT2YgIT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVPZiwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICB2YXIgYiA9IGZyb21PYmplY3QodmFsdWUpO1xuICAgIGlmIChiKSByZXR1cm4gYjtcblxuICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0oJ3N0cmluZycpLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgKyAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gICAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICAgKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gICAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICAgKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gICAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICAgKiovXG5cblxuICBCdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCk7XG4gIH07IC8vIE5vdGU6IENoYW5nZSBwcm90b3R5cGUgKmFmdGVyKiBCdWZmZXIuZnJvbSBpcyBkZWZpbmVkIHRvIHdvcmthcm91bmQgQ2hyb21lIGJ1ZzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC8xNDhcblxuXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIucHJvdG90eXBlLCBVaW50OEFycmF5LnByb3RvdHlwZSk7XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIsIFVpbnQ4QXJyYXkpO1xuXG4gIGZ1bmN0aW9uIGFzc2VydFNpemUoc2l6ZSkge1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKTtcbiAgICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgICBhc3NlcnRTaXplKHNpemUpO1xuXG4gICAgaWYgKHNpemUgPD0gMCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKTtcbiAgICB9XG5cbiAgICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgPyBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZykgOiBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gICAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAgICoqL1xuXG5cbiAgQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gICAgcmV0dXJuIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKTtcbiAgfTtcblxuICBmdW5jdGlvbiBhbGxvY1Vuc2FmZShzaXplKSB7XG4gICAgYXNzZXJ0U2l6ZShzaXplKTtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKTtcbiAgfVxuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAgICogKi9cblxuXG4gIEJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpO1xuICB9O1xuICAvKipcbiAgICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gICAqL1xuXG5cbiAgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyaW5nLCBlbmNvZGluZykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgICAgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgfVxuXG4gICAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gICAgfVxuXG4gICAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwO1xuICAgIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKTtcbiAgICB2YXIgYWN0dWFsID0gYnVmLndyaXRlKHN0cmluZywgZW5jb2RpbmcpO1xuXG4gICAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICAgIGJ1ZiA9IGJ1Zi5zbGljZSgwLCBhY3R1YWwpO1xuICAgIH1cblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBmdW5jdGlvbiBmcm9tQXJyYXlMaWtlKGFycmF5KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMDtcbiAgICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBidWZbaV0gPSBhcnJheVtpXSAmIDI1NTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcIm9mZnNldFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO1xuICAgIH1cblxuICAgIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO1xuICAgIH1cblxuICAgIHZhciBidWY7XG5cbiAgICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSk7XG4gICAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgICB9IC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG5cblxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsIEJ1ZmZlci5wcm90b3R5cGUpO1xuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBmdW5jdGlvbiBmcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwO1xuICAgICAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW4pO1xuXG4gICAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYnVmO1xuICAgICAgfVxuXG4gICAgICBvYmouY29weShidWYsIDAsIDAsIGxlbik7XG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cblxuICAgIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgbnVtYmVySXNOYU4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcigwKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKTtcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIEFycmF5LmlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tlZChsZW5ndGgpIHtcbiAgICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBLX01BWF9MRU5HVEhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArICdzaXplOiAweCcgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgJyBieXRlcycpO1xuICAgIH1cblxuICAgIHJldHVybiBsZW5ndGggfCAwO1xuICB9XG5cbiAgZnVuY3Rpb24gU2xvd0J1ZmZlcihsZW5ndGgpIHtcbiAgICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgICBsZW5ndGggPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aCk7XG4gIH1cblxuICBCdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlcihiKSB7XG4gICAgcmV0dXJuIGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlciA9PT0gdHJ1ZSAmJiBiICE9PSBCdWZmZXIucHJvdG90eXBlOyAvLyBzbyBCdWZmZXIuaXNCdWZmZXIoQnVmZmVyLnByb3RvdHlwZSkgd2lsbCBiZSBmYWxzZVxuICB9O1xuXG4gIEJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gICAgaWYgKGlzSW5zdGFuY2UoYSwgVWludDhBcnJheSkpIGEgPSBCdWZmZXIuZnJvbShhLCBhLm9mZnNldCwgYS5ieXRlTGVuZ3RoKTtcbiAgICBpZiAoaXNJbnN0YW5jZShiLCBVaW50OEFycmF5KSkgYiA9IEJ1ZmZlci5mcm9tKGIsIGIub2Zmc2V0LCBiLmJ5dGVMZW5ndGgpO1xuXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheScpO1xuICAgIH1cblxuICAgIGlmIChhID09PSBiKSByZXR1cm4gMDtcbiAgICB2YXIgeCA9IGEubGVuZ3RoO1xuICAgIHZhciB5ID0gYi5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgeCA9IGFbaV07XG4gICAgICAgIHkgPSBiW2ldO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoeCA8IHkpIHJldHVybiAtMTtcbiAgICBpZiAoeSA8IHgpIHJldHVybiAxO1xuICAgIHJldHVybiAwO1xuICB9O1xuXG4gIEJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyhlbmNvZGluZykge1xuICAgIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBCdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0KGxpc3QsIGxlbmd0aCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7XG4gICAgfVxuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICAgIH1cblxuICAgIHZhciBpO1xuXG4gICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZW5ndGggPSAwO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpO1xuICAgIHZhciBwb3MgPSAwO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBidWYgPSBsaXN0W2ldO1xuXG4gICAgICBpZiAoaXNJbnN0YW5jZShidWYsIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJ1Zik7XG4gICAgICB9XG5cbiAgICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7XG4gICAgICB9XG5cbiAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKTtcbiAgICAgIHBvcyArPSBidWYubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBidWZmZXI7XG4gIH07XG5cbiAgZnVuY3Rpb24gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgICByZXR1cm4gc3RyaW5nLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNJbnN0YW5jZShzdHJpbmcsIEFycmF5QnVmZmVyKSkge1xuICAgICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuICcgKyAnUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHN0cmluZyk7XG4gICAgfVxuXG4gICAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGg7XG4gICAgdmFyIG11c3RNYXRjaCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gdHJ1ZTtcbiAgICBpZiAoIW11c3RNYXRjaCAmJiBsZW4gPT09IDApIHJldHVybiAwOyAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cblxuICAgIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlO1xuXG4gICAgZm9yICg7Oykge1xuICAgICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgICAgcmV0dXJuIGxlbjtcblxuICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aDtcblxuICAgICAgICBjYXNlICd1Y3MyJzpcbiAgICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICAgIHJldHVybiBsZW4gKiAyO1xuXG4gICAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMTtcblxuICAgICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbXVzdE1hdGNoID8gLTEgOiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aDsgLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBCdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7XG5cbiAgZnVuY3Rpb24gc2xvd1RvU3RyaW5nKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2U7IC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAgIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG4gICAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gICAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAgIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gICAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG5cbiAgICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9IC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gICAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cblxuXG4gICAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChlbmQgPD0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cblxuXG4gICAgZW5kID4+Pj0gMDtcbiAgICBzdGFydCA+Pj49IDA7XG5cbiAgICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCc7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgICBjYXNlICdoZXgnOlxuICAgICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKTtcblxuICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIChhbmQgdGhlIGBpcy1idWZmZXJgIG5wbSBwYWNrYWdlKVxuICAvLyB0byBkZXRlY3QgYSBCdWZmZXIgaW5zdGFuY2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJgXG4gIC8vIHJlbGlhYmx5IGluIGEgYnJvd3NlcmlmeSBjb250ZXh0IGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgZGlmZmVyZW50XG4gIC8vIGNvcGllcyBvZiB0aGUgJ2J1ZmZlcicgcGFja2FnZSBpbiB1c2UuIFRoaXMgbWV0aG9kIHdvcmtzIGV2ZW4gZm9yIEJ1ZmZlclxuICAvLyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIGNvcHkgb2YgdGhlIGBidWZmZXJgIHBhY2thZ2UuXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE1NFxuXG5cbiAgQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlO1xuXG4gIGZ1bmN0aW9uIHN3YXAoYiwgbiwgbSkge1xuICAgIHZhciBpID0gYltuXTtcbiAgICBiW25dID0gYlttXTtcbiAgICBiW21dID0gaTtcbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2KCkge1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcblxuICAgIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgICBzd2FwKHRoaXMsIGksIGkgKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMigpIHtcbiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG5cbiAgICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgc3dhcCh0aGlzLCBpLCBpICsgMyk7XG4gICAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQoKSB7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoO1xuXG4gICAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICAgIHN3YXAodGhpcywgaSwgaSArIDcpO1xuICAgICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpO1xuICAgICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpO1xuICAgICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aCk7XG4gICAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKGIpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpO1xuICAgIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDA7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVM7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5yZXBsYWNlKC8oLnsyfSkvZywgJyQxICcpLnRyaW0oKTtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnO1xuICAgIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nO1xuICB9O1xuXG4gIGlmIChjdXN0b21JbnNwZWN0U3ltYm9sKSB7XG4gICAgQnVmZmVyLnByb3RvdHlwZVtjdXN0b21JbnNwZWN0U3ltYm9sXSA9IEJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdDtcbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgICBpZiAoaXNJbnN0YW5jZSh0YXJnZXQsIFVpbnQ4QXJyYXkpKSB7XG4gICAgICB0YXJnZXQgPSBCdWZmZXIuZnJvbSh0YXJnZXQsIHRhcmdldC5vZmZzZXQsIHRhcmdldC5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiAnICsgJ1JlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB0YXJnZXQpO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGFydCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMDtcbiAgICB9XG5cbiAgICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXNTdGFydCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHN0YXJ0ID4+Pj0gMDtcbiAgICBlbmQgPj4+PSAwO1xuICAgIHRoaXNTdGFydCA+Pj49IDA7XG4gICAgdGhpc0VuZCA+Pj49IDA7XG4gICAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDA7XG4gICAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0O1xuICAgIHZhciB5ID0gZW5kIC0gc3RhcnQ7XG4gICAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpO1xuICAgIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKTtcbiAgICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgICB4ID0gdGhpc0NvcHlbaV07XG4gICAgICAgIHkgPSB0YXJnZXRDb3B5W2ldO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoeCA8IHkpIHJldHVybiAtMTtcbiAgICBpZiAoeSA8IHgpIHJldHVybiAxO1xuICAgIHJldHVybiAwO1xuICB9OyAvLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4gIC8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4gIC8vXG4gIC8vIEFyZ3VtZW50czpcbiAgLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbiAgLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbiAgLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4gIC8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4gIC8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5cblxuICBmdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAgIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTE7IC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG5cbiAgICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXQ7XG4gICAgICBieXRlT2Zmc2V0ID0gMDtcbiAgICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZjtcbiAgICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwO1xuICAgIH1cblxuICAgIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldDsgLy8gQ29lcmNlIHRvIE51bWJlci5cblxuICAgIGlmIChudW1iZXJJc05hTihieXRlT2Zmc2V0KSkge1xuICAgICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IGJ1ZmZlci5sZW5ndGggLSAxO1xuICAgIH0gLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcblxuXG4gICAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXQ7XG5cbiAgICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICBpZiAoZGlyKSByZXR1cm4gLTE7ZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDE7XG4gICAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDA7ZWxzZSByZXR1cm4gLTE7XG4gICAgfSAvLyBOb3JtYWxpemUgdmFsXG5cblxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZyk7XG4gICAgfSAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuXG5cbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgdmFsID0gdmFsICYgMHhGRjsgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuXG4gICAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGRpcikge1xuICAgICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgW3ZhbF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXJyYXlJbmRleE9mKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gICAgdmFyIGluZGV4U2l6ZSA9IDE7XG4gICAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGg7XG4gICAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGg7XG5cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8IGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXhTaXplID0gMjtcbiAgICAgICAgYXJyTGVuZ3RoIC89IDI7XG4gICAgICAgIHZhbExlbmd0aCAvPSAyO1xuICAgICAgICBieXRlT2Zmc2V0IC89IDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVhZChidWYsIGkpIHtcbiAgICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGJ1ZltpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpO1xuXG4gICAgaWYgKGRpcikge1xuICAgICAgdmFyIGZvdW5kSW5kZXggPSAtMTtcblxuICAgICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpO1xuICAgICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4O1xuICAgICAgICAgIGZvdW5kSW5kZXggPSAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aDtcblxuICAgICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGZvdW5kID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGhleFdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDA7XG4gICAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXQ7XG5cbiAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKTtcblxuICAgICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGg7XG5cbiAgICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgICAgbGVuZ3RoID0gc3RyTGVuIC8gMjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KTtcbiAgICAgIGlmIChudW1iZXJJc05hTihwYXJzZWQpKSByZXR1cm4gaTtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gaTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHV0ZjhXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpO1xuICB9XG5cbiAgZnVuY3Rpb24gbGF0aW4xV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJhc2U2NFdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7XG4gIH1cblxuICBmdW5jdGlvbiB1Y3MyV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7XG4gIH1cblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICAgIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICAgIG9mZnNldCA9IDA7IC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gb2Zmc2V0O1xuICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgICBvZmZzZXQgPSAwOyAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICAgIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuXG4gICAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgICBsZW5ndGggPSBsZW5ndGggPj4+IDA7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuY29kaW5nID0gbGVuZ3RoO1xuICAgICAgICBsZW5ndGggPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnKTtcbiAgICB9XG5cbiAgICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXQ7XG4gICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nO1xuXG4gICAgaWYgKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKTtcbiAgICB9XG5cbiAgICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4JztcbiAgICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZTtcblxuICAgIGZvciAoOzspIHtcbiAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCk7XG5cbiAgICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpO1xuXG4gICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTtcblxuICAgICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTtcblxuICAgICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpO1xuXG4gICAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdCdWZmZXInLFxuICAgICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBiYXNlNjRTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYmFzZTY0SnMuZnJvbUJ5dGVBcnJheShidWYpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYmFzZTY0SnMuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHV0ZjhTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgaSA9IHN0YXJ0O1xuXG4gICAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV07XG4gICAgICB2YXIgY29kZVBvaW50ID0gbnVsbDtcbiAgICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gZmlyc3RCeXRlID4gMHhFRiA/IDQgOiBmaXJzdEJ5dGUgPiAweERGID8gMyA6IGZpcnN0Qnl0ZSA+IDB4QkYgPyAyIDogMTtcblxuICAgICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50O1xuXG4gICAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXTtcblxuICAgICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCBzZWNvbmRCeXRlICYgMHgzRjtcblxuICAgICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdO1xuXG4gICAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgdGhpcmRCeXRlICYgMHgzRjtcblxuICAgICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdO1xuICAgICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXTtcbiAgICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdO1xuXG4gICAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IGZvdXJ0aEJ5dGUgJiAweDNGO1xuXG4gICAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICAgIGNvZGVQb2ludCA9IDB4RkZGRDtcbiAgICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDE7XG4gICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcbiAgICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkY7XG4gICAgICB9XG5cbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCk7XG4gICAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpO1xuICB9IC8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuICAvLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4gIC8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcblxuXG4gIHZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMDtcblxuICBmdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkoY29kZVBvaW50cykge1xuICAgIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aDtcblxuICAgIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cyk7IC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgICB9IC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cblxuXG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBmdW5jdGlvbiBhc2NpaVNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICAgIHZhciByZXQgPSAnJztcbiAgICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpO1xuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBsYXRpbjFTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgcmV0ID0gJyc7XG4gICAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTtcblxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBoZXhTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgbGVuID0gYnVmLmxlbmd0aDtcbiAgICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwO1xuICAgIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW47XG4gICAgdmFyIG91dCA9ICcnO1xuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIG91dCArPSBoZXhTbGljZUxvb2t1cFRhYmxlW2J1ZltpXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHV0ZjE2bGVTbGljZShidWYsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgdmFyIHJlcyA9ICcnO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBCdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcbiAgICBzdGFydCA9IH5+c3RhcnQ7XG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZDtcblxuICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgIHN0YXJ0ICs9IGxlbjtcbiAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgICBzdGFydCA9IGxlbjtcbiAgICB9XG5cbiAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgZW5kICs9IGxlbjtcbiAgICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwO1xuICAgIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgICBlbmQgPSBsZW47XG4gICAgfVxuXG4gICAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydDtcbiAgICB2YXIgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKTsgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcblxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihuZXdCdWYsIEJ1ZmZlci5wcm90b3R5cGUpO1xuICAgIHJldHVybiBuZXdCdWY7XG4gIH07XG4gIC8qXG4gICAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGNoZWNrT2Zmc2V0KG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgICBpZiAob2Zmc2V0ICUgMSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50Jyk7XG4gICAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKTtcbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdO1xuICAgIHZhciBtdWwgPSAxO1xuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMDtcblxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF07XG4gICAgdmFyIG11bCA9IDE7XG5cbiAgICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzW29mZnNldF07XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgdGhpc1tvZmZzZXQgKyAxXSA8PCA4O1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSA8PCA4IHwgdGhpc1tvZmZzZXQgKyAxXTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiAodGhpc1tvZmZzZXRdIHwgdGhpc1tvZmZzZXQgKyAxXSA8PCA4IHwgdGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgKyB0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCArICh0aGlzW29mZnNldCArIDFdIDw8IDE2IHwgdGhpc1tvZmZzZXQgKyAyXSA8PCA4IHwgdGhpc1tvZmZzZXQgKyAzXSk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdO1xuICAgIHZhciBtdWwgPSAxO1xuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bDtcbiAgICB9XG5cbiAgICBtdWwgKj0gMHg4MDtcbiAgICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKTtcbiAgICByZXR1cm4gdmFsO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG4gICAgdmFyIGkgPSBieXRlTGVuZ3RoO1xuICAgIHZhciBtdWwgPSAxO1xuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV07XG5cbiAgICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWw7XG4gICAgfVxuXG4gICAgbXVsICo9IDB4ODA7XG4gICAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDgob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKTtcbiAgICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuIHRoaXNbb2Zmc2V0XTtcbiAgICByZXR1cm4gKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCB0aGlzW29mZnNldCArIDFdIDw8IDg7XG4gICAgcmV0dXJuIHZhbCAmIDB4ODAwMCA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWw7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7XG4gICAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCB0aGlzW29mZnNldF0gPDwgODtcbiAgICByZXR1cm4gdmFsICYgMHg4MDAwID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgdGhpc1tvZmZzZXQgKyAxXSA8PCA4IHwgdGhpc1tvZmZzZXQgKyAyXSA8PCAxNiB8IHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQ7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XSA8PCAyNCB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYgfCB0aGlzW29mZnNldCArIDJdIDw8IDggfCB0aGlzW29mZnNldCArIDNdO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNCk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNCk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gY2hlY2tJbnQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7XG4gICAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtcbiAgICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpO1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwO1xuXG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMTtcbiAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKTtcbiAgICB9XG5cbiAgICB2YXIgbXVsID0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGO1xuXG4gICAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAvIG11bCAmIDB4RkY7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwO1xuXG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMTtcbiAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKTtcbiAgICB9XG5cbiAgICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxO1xuICAgIHZhciBtdWwgPSAxO1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkY7XG5cbiAgICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAvIG11bCAmIDB4RkY7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKTtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgcmV0dXJuIG9mZnNldCArIDE7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZjtcbiAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDg7XG4gICAgcmV0dXJuIG9mZnNldCArIDI7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlID4+PiA4O1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgcmV0dXJuIG9mZnNldCArIDI7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKTtcbiAgICB0aGlzW29mZnNldCArIDNdID0gdmFsdWUgPj4+IDI0O1xuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gMTY7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiA4O1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZjtcbiAgICByZXR1cm4gb2Zmc2V0ICsgNDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlID4+PiAyNDtcbiAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDE2O1xuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gODtcbiAgICB0aGlzW29mZnNldCArIDNdID0gdmFsdWUgJiAweGZmO1xuICAgIHJldHVybiBvZmZzZXQgKyA0O1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG5cbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpO1xuICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpO1xuICAgIH1cblxuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbXVsID0gMTtcbiAgICB2YXIgc3ViID0gMDtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkY7XG5cbiAgICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgICAgc3ViID0gMTtcbiAgICAgIH1cblxuICAgICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCA+PiAwKSAtIHN1YiAmIDB4RkY7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcblxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSk7XG4gICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdCk7XG4gICAgfVxuXG4gICAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMTtcbiAgICB2YXIgbXVsID0gMTtcbiAgICB2YXIgc3ViID0gMDtcbiAgICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGO1xuXG4gICAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgICBzdWIgPSAxO1xuICAgICAgfVxuXG4gICAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsID4+IDApIC0gc3ViICYgMHhGRjtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MCk7XG4gICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZjtcbiAgICByZXR1cm4gb2Zmc2V0ICsgMTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZjtcbiAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDg7XG4gICAgcmV0dXJuIG9mZnNldCArIDI7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKTtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSA+Pj4gODtcbiAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgJiAweGZmO1xuICAgIHJldHVybiBvZmZzZXQgKyAyO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKTtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlID4+PiA4O1xuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gMTY7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9IHZhbHVlID4+PiAyNDtcbiAgICByZXR1cm4gb2Zmc2V0ICsgNDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCk7XG4gICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlID4+PiAyNDtcbiAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDE2O1xuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+Pj4gODtcbiAgICB0aGlzW29mZnNldCArIDNdID0gdmFsdWUgJiAweGZmO1xuICAgIHJldHVybiBvZmZzZXQgKyA0O1xuICB9O1xuXG4gIGZ1bmN0aW9uIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpO1xuICAgIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJyk7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZUZsb2F0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcblxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQpO1xuICAgIH1cblxuICAgIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KTtcbiAgICByZXR1cm4gb2Zmc2V0ICsgNDtcbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KTtcbiAgfTtcblxuICBmdW5jdGlvbiB3cml0ZURvdWJsZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG5cbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4KTtcbiAgICB9XG5cbiAgICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOCk7XG4gICAgcmV0dXJuIG9mZnNldCArIDg7XG4gIH1cblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydCk7XG4gIH07IC8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcblxuXG4gIEJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlcicpO1xuICAgIGlmICghc3RhcnQpIHN0YXJ0ID0gMDtcbiAgICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGg7XG4gICAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwO1xuICAgIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydDsgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG5cbiAgICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDA7XG4gICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwOyAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG5cbiAgICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKTtcbiAgICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJyk7IC8vIEFyZSB3ZSBvb2I/XG5cbiAgICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoO1xuXG4gICAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydDtcbiAgICB9XG5cbiAgICB2YXIgbGVuID0gZW5kIC0gc3RhcnQ7XG5cbiAgICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBVc2UgYnVpbHQtaW4gd2hlbiBhdmFpbGFibGUsIG1pc3NpbmcgZnJvbSBJRTExXG4gICAgICB0aGlzLmNvcHlXaXRoaW4odGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpO1xuICAgIH0gZWxzZSBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgICAgZm9yICh2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCh0YXJnZXQsIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCksIHRhcmdldFN0YXJ0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuO1xuICB9OyAvLyBVc2FnZTpcbiAgLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4gIC8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuICAvLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcblxuXG4gIEJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAgIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBlbmNvZGluZyA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgICBlbmNvZGluZyA9IGVuZDtcbiAgICAgICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAgICAgaWYgKGVuY29kaW5nID09PSAndXRmOCcgJiYgY29kZSA8IDEyOCB8fCBlbmNvZGluZyA9PT0gJ2xhdGluMScpIHtcbiAgICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICAgIHZhbCA9IGNvZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICB2YWwgPSB2YWwgJiAyNTU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHZhbCA9IE51bWJlcih2YWwpO1xuICAgIH0gLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG5cblxuICAgIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpO1xuICAgIH1cblxuICAgIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHN0YXJ0ID0gc3RhcnQgPj4+IDA7XG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMDtcbiAgICBpZiAoIXZhbCkgdmFsID0gMDtcbiAgICB2YXIgaTtcblxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICB0aGlzW2ldID0gdmFsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKSA/IHZhbCA6IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpO1xuICAgICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aDtcblxuICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInICsgdmFsICsgJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTsgLy8gSEVMUEVSIEZVTkNUSU9OU1xuICAvLyA9PT09PT09PT09PT09PT09XG5cblxuICB2YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rLzAtOUEtWmEtei1fXS9nO1xuXG4gIGZ1bmN0aW9uIGJhc2U2NGNsZWFuKHN0cikge1xuICAgIC8vIE5vZGUgdGFrZXMgZXF1YWwgc2lnbnMgYXMgZW5kIG9mIHRoZSBCYXNlNjQgZW5jb2RpbmdcbiAgICBzdHIgPSBzdHIuc3BsaXQoJz0nKVswXTsgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG5cbiAgICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKTsgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuXG4gICAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJyc7IC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuXG4gICAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgICBzdHIgPSBzdHIgKyAnPSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cmluZywgdW5pdHMpIHtcbiAgICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5O1xuICAgIHZhciBjb2RlUG9pbnQ7XG4gICAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsO1xuICAgIHZhciBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7IC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcblxuICAgICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gLy8gdmFsaWQgbGVhZFxuXG5cbiAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IC8vIDIgbGVhZHMgaW4gYSByb3dcblxuXG4gICAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuXG5cbiAgICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgIH1cblxuICAgICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGw7IC8vIGVuY29kZSB1dGY4XG5cbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVhaztcbiAgICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpO1xuICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWs7XG4gICAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwKTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWs7XG4gICAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCwgY29kZVBvaW50ICYgMHgzRiB8IDB4ODApO1xuICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWs7XG4gICAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLCBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCwgY29kZVBvaW50ICYgMHgzRiB8IDB4ODApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYnl0ZXM7XG4gIH1cblxuICBmdW5jdGlvbiBhc2NpaVRvQnl0ZXMoc3RyKSB7XG4gICAgdmFyIGJ5dGVBcnJheSA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnl0ZUFycmF5O1xuICB9XG5cbiAgZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMoc3RyLCB1bml0cykge1xuICAgIHZhciBjLCBoaSwgbG87XG4gICAgdmFyIGJ5dGVBcnJheSA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVhaztcbiAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIGhpID0gYyA+PiA4O1xuICAgICAgbG8gPSBjICUgMjU2O1xuICAgICAgYnl0ZUFycmF5LnB1c2gobG8pO1xuICAgICAgYnl0ZUFycmF5LnB1c2goaGkpO1xuICAgIH1cblxuICAgIHJldHVybiBieXRlQXJyYXk7XG4gIH1cblxuICBmdW5jdGlvbiBiYXNlNjRUb0J5dGVzKHN0cikge1xuICAgIHJldHVybiBiYXNlNjRKcy50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJsaXRCdWZmZXIoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCB8fCBpID49IHNyYy5sZW5ndGgpIGJyZWFrO1xuICAgICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBpO1xuICB9IC8vIEFycmF5QnVmZmVyIG9yIFVpbnQ4QXJyYXkgb2JqZWN0cyBmcm9tIG90aGVyIGNvbnRleHRzIChpLmUuIGlmcmFtZXMpIGRvIG5vdCBwYXNzXG4gIC8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNjZcblxuXG4gIGZ1bmN0aW9uIGlzSW5zdGFuY2Uob2JqLCB0eXBlKSB7XG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHwgb2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IubmFtZSA9PT0gdHlwZS5uYW1lO1xuICB9XG5cbiAgZnVuY3Rpb24gbnVtYmVySXNOYU4ob2JqKSB7XG4gICAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICAgIHJldHVybiBvYmogIT09IG9iajsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgfSAvLyBDcmVhdGUgbG9va3VwIHRhYmxlIGZvciBgdG9TdHJpbmcoJ2hleCcpYFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8yMTlcblxuXG4gIHZhciBoZXhTbGljZUxvb2t1cFRhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhbHBoYWJldCA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcbiAgICB2YXIgdGFibGUgPSBuZXcgQXJyYXkoMjU2KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgdmFyIGkxNiA9IGkgKiAxNjtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICAgIHRhYmxlW2kxNiArIGpdID0gYWxwaGFiZXRbaV0gKyBhbHBoYWJldFtqXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGU7XG4gIH0oKTtcbn0pO1xudmFyIGJ1ZmZlcl8xID0gYnVmZmVyLkJ1ZmZlcjtcbnZhciBidWZmZXJfMiA9IGJ1ZmZlci5TbG93QnVmZmVyO1xudmFyIGJ1ZmZlcl8zID0gYnVmZmVyLklOU1BFQ1RfTUFYX0JZVEVTO1xudmFyIGJ1ZmZlcl80ID0gYnVmZmVyLmtNYXhMZW5ndGg7XG5cbnZhciBkb21haW47IC8vIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBzdG9yZSBldmVudCBoYW5kbGVycy4gSW5zdGFudGlhdGluZyB0aGlzIGlzXG4vLyBmYXN0ZXIgdGhhbiBleHBsaWNpdGx5IGNhbGxpbmcgYE9iamVjdC5jcmVhdGUobnVsbClgIHRvIGdldCBhIFwiY2xlYW5cIiBlbXB0eVxuLy8gb2JqZWN0ICh0ZXN0ZWQgd2l0aCB2OCB2NC45KS5cblxuZnVuY3Rpb24gRXZlbnRIYW5kbGVycygpIHt9XG5cbkV2ZW50SGFuZGxlcnMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxuLy8gcmVxdWlyZSgnZXZlbnRzJykgPT09IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlclxuXG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuRXZlbnRFbWl0dGVyLnVzaW5nRG9tYWlucyA9IGZhbHNlO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5kb21haW4gPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7IC8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cblxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZG9tYWluID0gbnVsbDtcblxuICBpZiAoRXZlbnRFbWl0dGVyLnVzaW5nRG9tYWlucykge1xuICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkb21haW4sIHRoZW4gYXR0YWNoIHRvIGl0LlxuICAgIGlmIChkb21haW4uYWN0aXZlICkgO1xuICB9XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07IC8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IGlzTmFOKG4pKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcIm5cIiBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gJGdldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuICRnZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59OyAvLyBUaGVzZSBzdGFuZGFsb25lIGVtaXQqIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBvcHRpbWl6ZSBjYWxsaW5nIG9mIGV2ZW50XG4vLyBoYW5kbGVycyBmb3IgZmFzdCBjYXNlcyBiZWNhdXNlIGVtaXQoKSBpdHNlbGYgb2Z0ZW4gaGFzIGEgdmFyaWFibGUgbnVtYmVyIG9mXG4vLyBhcmd1bWVudHMgYW5kIGNhbiBiZSBkZW9wdGltaXplZCBiZWNhdXNlIG9mIHRoYXQuIFRoZXNlIGZ1bmN0aW9ucyBhbHdheXMgaGF2ZVxuLy8gdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgdGh1cyBkbyBub3QgZ2V0IGRlb3B0aW1pemVkLCBzbyB0aGUgY29kZVxuLy8gaW5zaWRlIHRoZW0gY2FuIGV4ZWN1dGUgZmFzdGVyLlxuXG5cbmZ1bmN0aW9uIGVtaXROb25lKGhhbmRsZXIsIGlzRm4sIHNlbGYpIHtcbiAgaWYgKGlzRm4pIGhhbmRsZXIuY2FsbChzZWxmKTtlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0T25lKGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZzEpIHtcbiAgaWYgKGlzRm4pIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxKTtlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0VHdvKGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZzEsIGFyZzIpIHtcbiAgaWYgKGlzRm4pIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxLCBhcmcyKTtlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEsIGFyZzIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0VGhyZWUoaGFuZGxlciwgaXNGbiwgc2VsZiwgYXJnMSwgYXJnMiwgYXJnMykge1xuICBpZiAoaXNGbikgaGFuZGxlci5jYWxsKHNlbGYsIGFyZzEsIGFyZzIsIGFyZzMpO2Vsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZiwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRNYW55KGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZ3MpIHtcbiAgaWYgKGlzRm4pIGhhbmRsZXIuYXBwbHkoc2VsZiwgYXJncyk7ZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgZXZlbnRzLCBkb21haW47XG4gIHZhciBkb0Vycm9yID0gdHlwZSA9PT0gJ2Vycm9yJztcbiAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzKSBkb0Vycm9yID0gZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT0gbnVsbDtlbHNlIGlmICghZG9FcnJvcikgcmV0dXJuIGZhbHNlO1xuICBkb21haW4gPSB0aGlzLmRvbWFpbjsgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgZXIgPSBhcmd1bWVudHNbMV07XG5cbiAgICBpZiAoZG9tYWluKSB7XG4gICAgICBpZiAoIWVyKSBlciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudCcpO1xuICAgICAgZXIuZG9tYWluRW1pdHRlciA9IHRoaXM7XG4gICAgICBlci5kb21haW4gPSBkb21haW47XG4gICAgICBlci5kb21haW5UaHJvd24gPSBmYWxzZTtcbiAgICAgIGRvbWFpbi5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICB9IGVsc2UgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgXCJlcnJvclwiIGV2ZW50LiAoJyArIGVyICsgJyknKTtcbiAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKCFoYW5kbGVyKSByZXR1cm4gZmFsc2U7XG4gIHZhciBpc0ZuID0gdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbic7XG4gIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgc3dpdGNoIChsZW4pIHtcbiAgICAvLyBmYXN0IGNhc2VzXG4gICAgY2FzZSAxOlxuICAgICAgZW1pdE5vbmUoaGFuZGxlciwgaXNGbiwgdGhpcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgMjpcbiAgICAgIGVtaXRPbmUoaGFuZGxlciwgaXNGbiwgdGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAzOlxuICAgICAgZW1pdFR3byhoYW5kbGVyLCBpc0ZuLCB0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgNDpcbiAgICAgIGVtaXRUaHJlZShoYW5kbGVyLCBpc0ZuLCB0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSwgYXJndW1lbnRzWzNdKTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIHNsb3dlclxuXG4gICAgZGVmYXVsdDpcbiAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG5cbiAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIH1cblxuICAgICAgZW1pdE1hbnkoaGFuZGxlciwgaXNGbiwgdGhpcywgYXJncyk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmICghZXZlbnRzKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7IC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcblxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgICBpZiAocHJlcGVuZCkge1xuICAgICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgICAgfVxuICAgIH0gLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcblxuXG4gICAgaWYgKCFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIG0gPSAkZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG5cbiAgICAgIGlmIChtICYmIG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0pIHtcbiAgICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIHR5cGUgKyAnIGxpc3RlbmVycyBhZGRlZC4gJyArICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgICBlbWl0V2FybmluZyh3KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBlbWl0V2FybmluZyhlKSB7XG4gIHR5cGVvZiBjb25zb2xlLndhcm4gPT09ICdmdW5jdGlvbicgPyBjb25zb2xlLndhcm4oZSkgOiBjb25zb2xlLmxvZyhlKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9IGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbn07XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGcoKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgcmV0dXJuIGc7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9IGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59OyAvLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuXG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmICghZXZlbnRzKSByZXR1cm4gdGhpcztcbiAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKCFsaXN0KSByZXR1cm4gdGhpcztcblxuICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO2Vsc2Uge1xuICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgZm9yIChpID0gbGlzdC5sZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKSByZXR1cm4gdGhpcztcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgbGlzdFswXSA9IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICB2YXIgbGlzdGVuZXJzLCBldmVudHM7XG4gIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKCFldmVudHMpIHJldHVybiB0aGlzOyAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG5cbiAgaWYgKCFldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSkge1xuICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7ZWxzZSBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9IC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuXG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwga2V5OyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAvLyBMSUZPIG9yZGVyXG4gICAgZG8ge1xuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgICB9IHdoaWxlIChsaXN0ZW5lcnNbMF0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHZhciBldmxpc3RlbmVyO1xuICB2YXIgcmV0O1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoIWV2ZW50cykgcmV0ID0gW107ZWxzZSB7XG4gICAgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgICBpZiAoIWV2bGlzdGVuZXIpIHJldCA9IFtdO2Vsc2UgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXQgPSBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXTtlbHNlIHJldCA9IHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiAoZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcblxuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cykge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3Qub3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59OyAvLyBBYm91dCAxLjV4IGZhc3RlciB0aGFuIHRoZSB0d28tYXJnIHZlcnNpb24gb2YgQXJyYXkjc3BsaWNlKCkuXG5cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAodmFyIGkgPSBpbmRleCwgayA9IGkgKyAxLCBuID0gbGlzdC5sZW5ndGg7IGsgPCBuOyBpICs9IDEsIGsgKz0gMSkge1xuICAgIGxpc3RbaV0gPSBsaXN0W2tdO1xuICB9XG5cbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIGkpIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkoaSk7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbnZhciBnbG9iYWwkMSA9IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge307XG5cbi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuLy8gYmFzZWQgb2ZmIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWZ1bmN0em9tYmllL25vZGUtcHJvY2Vzcy9ibG9iL21hc3Rlci9icm93c2VyLmpzXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cblxudmFyIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cbmlmICh0eXBlb2YgZ2xvYmFsJDEuc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbn1cblxuaWYgKHR5cGVvZiBnbG9iYWwkMS5jbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xufVxuXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gIH0gLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcblxuXG4gIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICB9IC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcblxuXG4gIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGRyYWluaW5nID0gZmFsc2U7XG5cbiAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgfVxuXG4gIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICBkcmFpblF1ZXVlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgaWYgKGRyYWluaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gIGRyYWluaW5nID0gdHJ1ZTtcbiAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcblxuICB3aGlsZSAobGVuKSB7XG4gICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgcXVldWUgPSBbXTtcblxuICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gIH1cblxuICBjdXJyZW50UXVldWUgPSBudWxsO1xuICBkcmFpbmluZyA9IGZhbHNlO1xuICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbmZ1bmN0aW9uIG5leHRUaWNrKGZ1bikge1xuICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgfVxuXG4gIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG5cbiAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICB9XG59IC8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcblxuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gIHRoaXMuZnVuID0gZnVuO1xuICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xuXG52YXIgdGl0bGUgPSAnYnJvd3Nlcic7XG52YXIgcGxhdGZvcm0gPSAnYnJvd3Nlcic7XG52YXIgYnJvd3NlciA9IHRydWU7XG52YXIgZW52ID0ge307XG52YXIgYXJndiA9IFtdO1xudmFyIHZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcblxudmFyIHZlcnNpb25zID0ge307XG52YXIgcmVsZWFzZSA9IHt9O1xudmFyIGNvbmZpZyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxudmFyIG9uID0gbm9vcDtcbnZhciBhZGRMaXN0ZW5lciA9IG5vb3A7XG52YXIgb25jZSA9IG5vb3A7XG52YXIgb2ZmID0gbm9vcDtcbnZhciByZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG52YXIgcmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnZhciBlbWl0ID0gbm9vcDtcbmZ1bmN0aW9uIGJpbmRpbmcobmFtZSkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59XG5mdW5jdGlvbiBjd2QoKSB7XG4gIHJldHVybiAnLyc7XG59XG5mdW5jdGlvbiBjaGRpcihkaXIpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1cbmZ1bmN0aW9uIHVtYXNrKCkge1xuICByZXR1cm4gMDtcbn0gLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20va3VtYXZpcy9icm93c2VyLXByb2Nlc3MtaHJ0aW1lL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG5cbnZhciBwZXJmb3JtYW5jZSA9IGdsb2JhbCQxLnBlcmZvcm1hbmNlIHx8IHt9O1xuXG52YXIgcGVyZm9ybWFuY2VOb3cgPSBwZXJmb3JtYW5jZS5ub3cgfHwgcGVyZm9ybWFuY2UubW96Tm93IHx8IHBlcmZvcm1hbmNlLm1zTm93IHx8IHBlcmZvcm1hbmNlLm9Ob3cgfHwgcGVyZm9ybWFuY2Uud2Via2l0Tm93IHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xufTsgLy8gZ2VuZXJhdGUgdGltZXN0YW1wIG9yIGRlbHRhXG4vLyBzZWUgaHR0cDovL25vZGVqcy5vcmcvYXBpL3Byb2Nlc3MuaHRtbCNwcm9jZXNzX3Byb2Nlc3NfaHJ0aW1lXG5cblxuZnVuY3Rpb24gaHJ0aW1lKHByZXZpb3VzVGltZXN0YW1wKSB7XG4gIHZhciBjbG9ja3RpbWUgPSBwZXJmb3JtYW5jZU5vdy5jYWxsKHBlcmZvcm1hbmNlKSAqIDFlLTM7XG4gIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihjbG9ja3RpbWUpO1xuICB2YXIgbmFub3NlY29uZHMgPSBNYXRoLmZsb29yKGNsb2NrdGltZSAlIDEgKiAxZTkpO1xuXG4gIGlmIChwcmV2aW91c1RpbWVzdGFtcCkge1xuICAgIHNlY29uZHMgPSBzZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMF07XG4gICAgbmFub3NlY29uZHMgPSBuYW5vc2Vjb25kcyAtIHByZXZpb3VzVGltZXN0YW1wWzFdO1xuXG4gICAgaWYgKG5hbm9zZWNvbmRzIDwgMCkge1xuICAgICAgc2Vjb25kcy0tO1xuICAgICAgbmFub3NlY29uZHMgKz0gMWU5O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbc2Vjb25kcywgbmFub3NlY29uZHNdO1xufVxudmFyIHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5mdW5jdGlvbiB1cHRpbWUoKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCk7XG4gIHZhciBkaWYgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZTtcbiAgcmV0dXJuIGRpZiAvIDEwMDA7XG59XG52YXIgcHJvY2VzcyA9IHtcbiAgbmV4dFRpY2s6IG5leHRUaWNrLFxuICB0aXRsZTogdGl0bGUsXG4gIGJyb3dzZXI6IGJyb3dzZXIsXG4gIGVudjogZW52LFxuICBhcmd2OiBhcmd2LFxuICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICB2ZXJzaW9uczogdmVyc2lvbnMsXG4gIG9uOiBvbixcbiAgYWRkTGlzdGVuZXI6IGFkZExpc3RlbmVyLFxuICBvbmNlOiBvbmNlLFxuICBvZmY6IG9mZixcbiAgcmVtb3ZlTGlzdGVuZXI6IHJlbW92ZUxpc3RlbmVyLFxuICByZW1vdmVBbGxMaXN0ZW5lcnM6IHJlbW92ZUFsbExpc3RlbmVycyxcbiAgZW1pdDogZW1pdCxcbiAgYmluZGluZzogYmluZGluZyxcbiAgY3dkOiBjd2QsXG4gIGNoZGlyOiBjaGRpcixcbiAgdW1hc2s6IHVtYXNrLFxuICBocnRpbWU6IGhydGltZSxcbiAgcGxhdGZvcm06IHBsYXRmb3JtLFxuICByZWxlYXNlOiByZWxlYXNlLFxuICBjb25maWc6IGNvbmZpZyxcbiAgdXB0aW1lOiB1cHRpbWVcbn07XG5cbnZhciBpbmhlcml0cztcblxuaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIGluaGVyaXRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICBpbmhlcml0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gVGVtcEN0b3IoKSB7fTtcblxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7XG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKTtcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7XG4gIH07XG59XG5cbnZhciBpbmhlcml0cyQxID0gaW5oZXJpdHM7XG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZnVuY3Rpb24gZm9ybWF0KGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbiAoeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG5cbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuXG4gICAgICBjYXNlICclZCc6XG4gICAgICAgIHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcblxuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuXG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZShmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwkMS5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cblxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmZ1bmN0aW9uIGRlYnVnbG9nKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSkgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG5cbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IDA7XG5cbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbXNnID0gZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbiAoKSB7fTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVidWdzW3NldF07XG59XG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG5cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cblxuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTsgLy8gbGVnYWN5Li4uXG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuXG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBfZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH0gLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuXG5cbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn0gLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5cbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCc6IFsxLCAyMl0sXG4gICdpdGFsaWMnOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJzogWzQsIDI0XSxcbiAgJ2ludmVyc2UnOiBbNywgMjddLFxuICAnd2hpdGUnOiBbMzcsIDM5XSxcbiAgJ2dyZXknOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJzogWzMwLCAzOV0sXG4gICdibHVlJzogWzM0LCAzOV0sXG4gICdjeWFuJzogWzM2LCAzOV0sXG4gICdncmVlbic6IFszMiwgMzldLFxuICAnbWFnZW50YSc6IFszNSwgMzldLFxuICAncmVkJzogWzMxLCAzOV0sXG4gICd5ZWxsb3cnOiBbMzMsIDM5XVxufTsgLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5cbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gXCJcXHgxQltcIiArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArIFwiXFx4MUJbXCIgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gaGFzaDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJiB2YWx1ZSAmJiBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICB2YWx1ZS5pbnNwZWN0ICE9PSBpbnNwZWN0ICYmIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuXG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9IC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG5cblxuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuXG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9IC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cblxuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9IC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcblxuXG4gIGlmIChpc0Vycm9yKHZhbHVlKSAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9IC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cblxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cblxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLFxuICAgICAgYXJyYXkgPSBmYWxzZSxcbiAgICAgIGJyYWNlcyA9IFsneycsICd9J107IC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcblxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfSAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcblxuXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH0gLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcblxuXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfSAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcblxuXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9IC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcblxuXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG4gIHZhciBvdXRwdXQ7XG5cbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuXG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJykucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChpc051bWJlcih2YWx1ZSkpIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKSByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTsgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuXG4gIGlmIChpc051bGwodmFsdWUpKSByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cblxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7XG4gICAgdmFsdWU6IHZhbHVlW2tleV1cbiAgfTtcblxuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cblxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbiAobGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcblxuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKS5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXIpIHtcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIDtcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICsgJyAnICsgb3V0cHV0LmpvaW4oJyxcXG4gICcpICsgJyAnICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn0gLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiYgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8IHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAvLyBFUzYgc3ltYm9sXG4gIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZnVuY3Rpb24gaXNCdWZmZXIobWF5YmVCdWYpIHtcbiAgcmV0dXJuIGJ1ZmZlcl8xLmlzQnVmZmVyKG1heWJlQnVmKTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTsgLy8gMjYgRmViIDE2OjE5OjM0XG5cbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSwgcGFkKGQuZ2V0TWludXRlcygpKSwgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufSAvLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5cblxuZnVuY3Rpb24gbG9nKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBmb3JtYXQuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG59XG5mdW5jdGlvbiBfZXh0ZW5kKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG5cbiAgcmV0dXJuIG9yaWdpbjtcbn1cblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxudmFyIHJlcXVpcmUkJDMgPSB7XG4gIGluaGVyaXRzOiBpbmhlcml0cyQxLFxuICBfZXh0ZW5kOiBfZXh0ZW5kLFxuICBsb2c6IGxvZyxcbiAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICBpc1ByaW1pdGl2ZTogaXNQcmltaXRpdmUsXG4gIGlzRnVuY3Rpb246IGlzRnVuY3Rpb24sXG4gIGlzRXJyb3I6IGlzRXJyb3IsXG4gIGlzRGF0ZTogaXNEYXRlLFxuICBpc09iamVjdDogaXNPYmplY3QsXG4gIGlzUmVnRXhwOiBpc1JlZ0V4cCxcbiAgaXNVbmRlZmluZWQ6IGlzVW5kZWZpbmVkLFxuICBpc1N5bWJvbDogaXNTeW1ib2wsXG4gIGlzU3RyaW5nOiBpc1N0cmluZyxcbiAgaXNOdW1iZXI6IGlzTnVtYmVyLFxuICBpc051bGxPclVuZGVmaW5lZDogaXNOdWxsT3JVbmRlZmluZWQsXG4gIGlzTnVsbDogaXNOdWxsLFxuICBpc0Jvb2xlYW46IGlzQm9vbGVhbixcbiAgaXNBcnJheTogaXNBcnJheSxcbiAgaW5zcGVjdDogaW5zcGVjdCxcbiAgZGVwcmVjYXRlOiBkZXByZWNhdGUsXG4gIGZvcm1hdDogZm9ybWF0LFxuICBkZWJ1Z2xvZzogZGVidWdsb2dcbn07XG5cbmZ1bmN0aW9uIEJ1ZmZlckxpc3QoKSB7XG4gIHRoaXMuaGVhZCA9IG51bGw7XG4gIHRoaXMudGFpbCA9IG51bGw7XG4gIHRoaXMubGVuZ3RoID0gMDtcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh2KSB7XG4gIHZhciBlbnRyeSA9IHtcbiAgICBkYXRhOiB2LFxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkgdGhpcy50YWlsLm5leHQgPSBlbnRyeTtlbHNlIHRoaXMuaGVhZCA9IGVudHJ5O1xuICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgKyt0aGlzLmxlbmd0aDtcbn07XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAodikge1xuICB2YXIgZW50cnkgPSB7XG4gICAgZGF0YTogdixcbiAgICBuZXh0OiB0aGlzLmhlYWRcbiAgfTtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgdGhpcy5oZWFkID0gZW50cnk7XG4gICsrdGhpcy5sZW5ndGg7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIHZhciByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO2Vsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQ7XG4gIC0tdGhpcy5sZW5ndGg7XG4gIHJldHVybiByZXQ7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgdGhpcy5sZW5ndGggPSAwO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIChzKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgdmFyIHJldCA9ICcnICsgcC5kYXRhO1xuXG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgcmV0ICs9IHMgKyBwLmRhdGE7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuY29uY2F0ID0gZnVuY3Rpb24gKG4pIHtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gYnVmZmVyXzEuYWxsb2MoMCk7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMuaGVhZC5kYXRhO1xuICB2YXIgcmV0ID0gYnVmZmVyXzEuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gIHZhciBwID0gdGhpcy5oZWFkO1xuICB2YXIgaSA9IDA7XG5cbiAgd2hpbGUgKHApIHtcbiAgICBwLmRhdGEuY29weShyZXQsIGkpO1xuICAgIGkgKz0gcC5kYXRhLmxlbmd0aDtcbiAgICBwID0gcC5uZXh0O1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbnZhciBzdHJpbmdfZGVjb2RlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4gIC8vXG4gIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4gIC8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbiAgLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4gIC8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbiAgLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuICAvLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbiAgLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gIC8vXG4gIC8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4gIC8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICAvL1xuICAvLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4gIC8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0ZcbiAgLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuICAvLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbiAgLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4gIC8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbiAgLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAgdmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXI7XG5cbiAgdmFyIGlzQnVmZmVyRW5jb2RpbmcgPSBCdWZmZXIuaXNFbmNvZGluZyB8fCBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIGNhc2UgJ3Jhdyc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gICAgaWYgKGVuY29kaW5nICYmICFpc0J1ZmZlckVuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICAgIH1cbiAgfSAvLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4gIC8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuICAvLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbiAgLy9cbiAgLy8gQFRPRE8gSGFuZGxpbmcgYWxsIGVuY29kaW5ncyBpbnNpZGUgYSBzaW5nbGUgb2JqZWN0IG1ha2VzIGl0IHZlcnkgZGlmZmljdWx0XG4gIC8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuICAvLyBAVE9ETyBUaGVyZSBzaG91bGQgYmUgYSB1dGY4LXN0cmljdCBlbmNvZGluZyB0aGF0IHJlamVjdHMgaW52YWxpZCBVVEYtOCBjb2RlXG4gIC8vIHBvaW50cyBhcyB1c2VkIGJ5IENFU1UtOC5cblxuXG4gIHZhciBTdHJpbmdEZWNvZGVyID0gZXhwb3J0cy5TdHJpbmdEZWNvZGVyID0gZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gICAgdGhpcy5lbmNvZGluZyA9IChlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS8sICcnKTtcbiAgICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICAvLyBDRVNVLTggcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDMtYnl0ZXNcbiAgICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAgIC8vIFVURi0xNiByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMi1ieXRlc1xuICAgICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAyO1xuICAgICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIEJhc2UtNjQgc3RvcmVzIDMgYnl0ZXMgaW4gNCBjaGFycywgYW5kIHBhZHMgdGhlIHJlbWFpbmRlci5cbiAgICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy53cml0ZSA9IHBhc3NUaHJvdWdoV3JpdGU7XG4gICAgICAgIHJldHVybjtcbiAgICB9IC8vIEVub3VnaCBzcGFjZSB0byBzdG9yZSBhbGwgYnl0ZXMgb2YgYSBzaW5nbGUgY2hhcmFjdGVyLiBVVEYtOCBuZWVkcyA0XG4gICAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cblxuXG4gICAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTsgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuXG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgPSAwOyAvLyBOdW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG5cbiAgICB0aGlzLmNoYXJMZW5ndGggPSAwO1xuICB9OyAvLyB3cml0ZSBkZWNvZGVzIHRoZSBnaXZlbiBidWZmZXIgYW5kIHJldHVybnMgaXQgYXMgSlMgc3RyaW5nIHRoYXQgaXNcbiAgLy8gZ3VhcmFudGVlZCB0byBub3QgY29udGFpbiBhbnkgcGFydGlhbCBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuIEFueSBwYXJ0aWFsXG4gIC8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4gIC8vIHJldHVybmVkIHdoZW4gY2FsbGluZyB3cml0ZSBhZ2FpbiB3aXRoIHRoZSByZW1haW5pbmcgYnl0ZXMuXG4gIC8vXG4gIC8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4gIC8vIGN1cnJlbnRseSB3b3JrcywgYnV0IGNvbnZlcnRpbmcgYSBTdHJpbmcgdG8gYSBCdWZmZXIgKHZpYSBgbmV3IEJ1ZmZlcmAsIG9yXG4gIC8vIEJ1ZmZlciN3cml0ZSkgd2lsbCByZXBsYWNlIGluY29tcGxldGUgc3Vycm9nYXRlcyB3aXRoIHRoZSB1bmljb2RlXG4gIC8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5cblxuICBTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICB2YXIgY2hhclN0ciA9ICcnOyAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuXG4gICAgd2hpbGUgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgICAgdmFyIGF2YWlsYWJsZSA9IGJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQgPyB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6IGJ1ZmZlci5sZW5ndGg7IC8vIGFkZCB0aGUgbmV3IGJ5dGVzIHRvIHRoZSBjaGFyIGJ1ZmZlclxuXG4gICAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gYXZhaWxhYmxlO1xuXG4gICAgICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQgPCB0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfSAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcblxuXG4gICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTsgLy8gZ2V0IHRoZSBjaGFyYWN0ZXIgdGhhdCB3YXMgc3BsaXRcblxuICAgICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpOyAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG5cbiAgICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuXG4gICAgICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgICBjaGFyU3RyID0gJyc7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IHRoaXMuY2hhckxlbmd0aCA9IDA7IC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcblxuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH0gLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuXG5cbiAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG4gICAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG5cbiAgICBpZiAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQsIGVuZCk7XG4gICAgICBlbmQgLT0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgfVxuXG4gICAgY2hhclN0ciArPSBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgZW5kKTtcbiAgICB2YXIgZW5kID0gY2hhclN0ci5sZW5ndGggLSAxO1xuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChlbmQpOyAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG5cbiAgICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgICAgdmFyIHNpemUgPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IHNpemU7XG4gICAgICB0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHNpemUsIDAsIHNpemUpO1xuICAgICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICAgIHJldHVybiBjaGFyU3RyLnN1YnN0cmluZygwLCBlbmQpO1xuICAgIH0gLy8gb3IganVzdCBlbWl0IHRoZSBjaGFyU3RyXG5cblxuICAgIHJldHVybiBjaGFyU3RyO1xuICB9OyAvLyBkZXRlY3RJbmNvbXBsZXRlQ2hhciBkZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGFuIGluY29tcGxldGUgVVRGLTggY2hhcmFjdGVyIGF0XG4gIC8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4gIC8vIGxlbmd0aCB0aGF0IGNoYXJhY3RlciwgYW5kIHNldHMgdGhpcy5jaGFyUmVjZWl2ZWQgdG8gdGhlIG51bWJlciBvZiBieXRlc1xuICAvLyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hhcmFjdGVyLlxuXG5cbiAgU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHdlIGhhdmUgdG8gY2hlY2sgYXQgdGhlIGVuZCBvZiB0aGlzIGJ1ZmZlclxuICAgIHZhciBpID0gYnVmZmVyLmxlbmd0aCA+PSAzID8gMyA6IGJ1ZmZlci5sZW5ndGg7IC8vIEZpZ3VyZSBvdXQgaWYgb25lIG9mIHRoZSBsYXN0IGkgYnl0ZXMgb2Ygb3VyIGJ1ZmZlciBhbm5vdW5jZXMgYW5cbiAgICAvLyBpbmNvbXBsZXRlIGNoYXIuXG5cbiAgICBmb3IgKDsgaSA+IDA7IGktLSkge1xuICAgICAgdmFyIGMgPSBidWZmZXJbYnVmZmVyLmxlbmd0aCAtIGldOyAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuICAgICAgLy8gMTEwWFhYWFhcblxuICAgICAgaWYgKGkgPT0gMSAmJiBjID4+IDUgPT0gMHgwNikge1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gMTExMFhYWFhcblxuXG4gICAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyAxMTExMFhYWFxuXG5cbiAgICAgIGlmIChpIDw9IDMgJiYgYyA+PiAzID09IDB4MUUpIHtcbiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gNDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBpO1xuICB9O1xuXG4gIFN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgaWYgKGJ1ZmZlciAmJiBidWZmZXIubGVuZ3RoKSByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQpIHtcbiAgICAgIHZhciBjciA9IHRoaXMuY2hhclJlY2VpdmVkO1xuICAgICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICAgIHZhciBlbmMgPSB0aGlzLmVuY29kaW5nO1xuICAgICAgcmVzICs9IGJ1Zi5zbGljZSgwLCBjcikudG9TdHJpbmcoZW5jKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMjtcbiAgICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDIgOiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gYmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMztcbiAgICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xuICB9XG59KTtcbnZhciBzdHJpbmdfZGVjb2Rlcl8xID0gc3RyaW5nX2RlY29kZXIuU3RyaW5nRGVjb2RlcjtcblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG52YXIgZGVidWcgPSBkZWJ1Z2xvZygnc3RyZWFtJyk7XG5pbmhlcml0cyQxKFJlYWRhYmxlLCBFdmVudEVtaXR0ZXIpO1xuXG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKGV2ZW50LCBmbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIGFueVxuICAgIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAgIC8vIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBOb2RlLmpzIHRoYXQgZG8gbm90IGluY2x1ZGVcbiAgICAvLyB0aGUgcHJlcGVuZExpc3RlbmVyKCkgbWV0aG9kLiBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlbW92ZSB0aGlzIGhhY2suXG4gICAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChBcnJheS5pc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCQxKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307IC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG4gIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlOyAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG5cbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207IC8vIGNhc3QgdG8gaW50cy5cblxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+fnRoaXMuaGlnaFdhdGVyTWFyazsgLy8gQSBsaW5rZWQgbGlzdCBpcyB1c2VkIHRvIHN0b3JlIGRhdGEgY2h1bmtzIGluc3RlYWQgb2YgYW4gYXJyYXkgYmVjYXVzZSB0aGVcbiAgLy8gbGlua2VkIGxpc3QgY2FuIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBiZWdpbm5pbmcgZmFzdGVyIHRoYW5cbiAgLy8gYXJyYXkuc2hpZnQoKVxuXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7IC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuXG4gIHRoaXMuc3luYyA9IHRydWU7IC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTsgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cblxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JzsgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuXG4gIHRoaXMucmFuT3V0ID0gZmFsc2U7IC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG5cbiAgdGhpcy5hd2FpdERyYWluID0gMDsgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG5cbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgc3RyaW5nX2RlY29kZXJfMShvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKSByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7IC8vIGxlZ2FjeVxuXG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcbn0gLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBidWZmZXJfMS5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07IC8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5cblxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG5cbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2UgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHN0YXRlLmVuZGVkICYmICFhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kRW1pdHRlZCAmJiBhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgX2UgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG5cbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIF9lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNraXBBZGQ7XG5cbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFhZGRUb0Zyb250ICYmICFlbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICBza2lwQWRkID0gIXN0YXRlLm9iamVjdE1vZGUgJiYgY2h1bmsubGVuZ3RoID09PSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFkZFRvRnJvbnQpIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTsgLy8gRG9uJ3QgYWRkIHRvIHRoZSBidWZmZXIgaWYgd2UndmUgZGVjb2RlZCB0byBhbiBlbXB0eSBzdHJpbmcgY2h1bmsgYW5kXG4gICAgICAvLyB3ZSdyZSBub3QgaW4gb2JqZWN0IG1vZGVcblxuICAgICAgaWYgKCFza2lwQWRkKSB7XG4gICAgICAgIC8vIGlmIHdlIHdhbnQgdGhlIGRhdGEgbm93LCBqdXN0IGVtaXQgaXQuXG4gICAgICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuc3luYykge1xuICAgICAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgY2h1bmspO1xuICAgICAgICAgIHN0cmVhbS5yZWFkKDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYnVmZmVyIGluZm8uXG4gICAgICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgICAgICAgIGlmIChhZGRUb0Zyb250KSBzdGF0ZS5idWZmZXIudW5zaGlmdChjaHVuayk7ZWxzZSBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICAgICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn0gLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuXG5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufSAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblxuXG5SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbiAoZW5jKSB7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2RlciA9IG5ldyBzdHJpbmdfZGVjb2Rlcl8xKGVuYyk7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSBlbmM7XG4gIHJldHVybiB0aGlzO1xufTsgLy8gRG9uJ3QgcmFpc2UgdGhlIGh3bSA+IDhNQlxuXG5cbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5cbmZ1bmN0aW9uIGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pIHtcbiAgaWYgKG4gPj0gTUFYX0hXTSkge1xuICAgIG4gPSBNQVhfSFdNO1xuICB9IGVsc2Uge1xuICAgIC8vIEdldCB0aGUgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDIgdG8gcHJldmVudCBpbmNyZWFzaW5nIGh3bSBleGNlc3NpdmVseSBpblxuICAgIC8vIHRpbnkgYW1vdW50c1xuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cblxuICByZXR1cm4gbjtcbn0gLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5cblxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAobiA8PSAwIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXR1cm4gMTtcblxuICBpZiAobiAhPT0gbikge1xuICAgIC8vIE9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCkgcmV0dXJuIHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfSAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgY3VycmVudCBod20sIHRoZW4gcmFpc2UgdGhlIGh3bS5cblxuXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaykgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pO1xuICBpZiAobiA8PSBzdGF0ZS5sZW5ndGgpIHJldHVybiBuOyAvLyBEb24ndCBoYXZlIGVub3VnaFxuXG4gIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn0gLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblxuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIG4gPSBwYXJzZUludChuLCAxMCk7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG4gIGlmIChuICE9PSAwKSBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTsgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLm5lZWRSZWFkYWJsZSAmJiAoc3RhdGUubGVuZ3RoID49IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO2Vsc2UgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbiA9IGhvd011Y2hUb1JlYWQobiwgc3RhdGUpOyAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUuZW5kZWQpIHtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG5cblxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuICBkZWJ1ZygnbmVlZCByZWFkYWJsZScsIGRvUmVhZCk7IC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgfHwgc3RhdGUubGVuZ3RoIC0gbiA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkb1JlYWQgPSB0cnVlO1xuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZCk7XG4gIH0gLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuXG5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH0gZWxzZSBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTsgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cblxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7IC8vIGNhbGwgaW50ZXJuYWwgcmVhZCBtZXRob2RcblxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG5cbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7IC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICB9XG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAgIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgICBpZiAoIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlOyAvLyBJZiB3ZSB0cmllZCB0byByZWFkKCkgcGFzdCB0aGUgRU9GLCB0aGVuIGVtaXQgZW5kIG9uIHRoZSBuZXh0IHRpY2suXG5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyID0gbnVsbDtcblxuICBpZiAoIWJ1ZmZlcl8xLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuXG4gIHJldHVybiBlcjtcbn1cblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuXG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcblxuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICBzdGF0ZS5lbmRlZCA9IHRydWU7IC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufSAvLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuXG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKSBuZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59IC8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuXG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIG5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG5cbiAgd2hpbGUgKCFzdGF0ZS5yZWFkaW5nICYmICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKSAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7ZWxzZSBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufSAvLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblxuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChkZXN0LCBwaXBlT3B0cykge1xuICB2YXIgc3JjID0gdGhpcztcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcbiAgZGVidWcoJ3BpcGUgY291bnQ9JWQgb3B0cz0laicsIHN0YXRlLnBpcGVzQ291bnQsIHBpcGVPcHRzKTtcbiAgdmFyIGRvRW5kID0gIXBpcGVPcHRzIHx8IHBpcGVPcHRzLmVuZCAhPT0gZmFsc2U7XG4gIHZhciBlbmRGbiA9IGRvRW5kID8gb25lbmQgOiBjbGVhbnVwO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkgbmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuXG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG5cbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH0gLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG5cblxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7IC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuICAgIGNsZWFuZWRVcCA9IHRydWU7IC8vIGlmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH0gLy8gSWYgdGhlIHVzZXIgcHVzaGVzIG1vcmUgZGF0YSB3aGlsZSB3ZSdyZSB3cml0aW5nIHRvIGRlc3QgdGhlbiB3ZSdsbCBlbmQgdXBcbiAgLy8gaW4gb25kYXRhIGFnYWluLiBIb3dldmVyLCB3ZSBvbmx5IHdhbnQgdG8gaW5jcmVhc2UgYXdhaXREcmFpbiBvbmNlIGJlY2F1c2VcbiAgLy8gZGVzdCB3aWxsIG9ubHkgZW1pdCBvbmUgJ2RyYWluJyBldmVudCBmb3IgdGhlIG11bHRpcGxlIHdyaXRlcy5cbiAgLy8gPT4gSW50cm9kdWNlIGEgZ3VhcmQgb24gaW5jcmVhc2luZyBhd2FpdERyYWluLlxuXG5cbiAgdmFyIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKTtcblxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgaW5jcmVhc2VkQXdhaXREcmFpbiA9IGZhbHNlO1xuICAgIHZhciByZXQgPSBkZXN0LndyaXRlKGNodW5rKTtcblxuICAgIGlmIChmYWxzZSA9PT0gcmV0ICYmICFpbmNyZWFzZWRBd2FpdERyYWluKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgICBpZiAoKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXMgPT09IGRlc3QgfHwgc3RhdGUucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCkgIT09IC0xKSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH0gLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cblxuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChsaXN0ZW5lckNvdW50JDEoZGVzdCwgJ2Vycm9yJykgPT09IDApIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH0gLy8gTWFrZSBzdXJlIG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSB1c2VybGFuZCBvbmVzLlxuXG5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpOyAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG5cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuXG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cblxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH0gLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cblxuXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7IC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cblxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgc3JjLmxpc3RlbmVycygnZGF0YScpLmxlbmd0aCkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTsgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpczsgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzOyAvLyBnb3QgYSBtYXRjaC5cblxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsZW47IF9pKyspIHtcbiAgICAgIGRlc3RzW19pXS5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuXG5cbiAgdmFyIGkgPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGkgPT09IC0xKSByZXR1cm4gdGhpcztcbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICByZXR1cm4gdGhpcztcbn07IC8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5cblxuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyBTdGFydCBmbG93aW5nIG9uIG5leHQgdGljayBpZiBzdHJlYW0gaXNuJ3QgZXhwbGljaXRseSBwYXVzZWRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSkgdGhpcy5yZXN1bWUoKTtcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcblxuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIG5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn0gLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuXG5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgIHJlc3VtZSh0aGlzLCBzdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBuZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcblxuICBpZiAoZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwYXVzZScpO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncGF1c2UnKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuXG4gIHdoaWxlIChzdGF0ZS5mbG93aW5nICYmIHN0cmVhbS5yZWFkKCkgIT09IG51bGwpIHt9XG59IC8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblxuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIGRlYnVnKCd3cmFwcGVkIGVuZCcpO1xuXG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7IC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuXG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pOyAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfSAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG5cblxuICB2YXIgZXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuICBmb3JFYWNoKGV2ZW50cywgZnVuY3Rpb24gKGV2KSB7XG4gICAgc3RyZWFtLm9uKGV2LCBzZWxmLmVtaXQuYmluZChzZWxmLCBldikpO1xuICB9KTsgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cblxuICBzZWxmLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuXG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTsgLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuXG5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0OyAvLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIC8vIG5vdGhpbmcgYnVmZmVyZWRcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IGZyb21MaXN0UGFydGlhbChuLCBzdGF0ZS5idWZmZXIsIHN0YXRlLmRlY29kZXIpO1xuICB9XG4gIHJldHVybiByZXQ7XG59IC8vIEV4dHJhY3RzIG9ubHkgZW5vdWdoIGJ1ZmZlcmVkIGRhdGEgdG8gc2F0aXNmeSB0aGUgYW1vdW50IHJlcXVlc3RlZC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbmZ1bmN0aW9uIGZyb21MaXN0UGFydGlhbChuLCBsaXN0LCBoYXNTdHJpbmdzKSB7XG4gIHZhciByZXQ7XG5cbiAgaWYgKG4gPCBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5nc1xuICAgIHJldCA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKDAsIG4pO1xuICAgIGxpc3QuaGVhZC5kYXRhID0gbGlzdC5oZWFkLmRhdGEuc2xpY2Uobik7XG4gIH0gZWxzZSBpZiAobiA9PT0gbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gZmlyc3QgY2h1bmsgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlc3VsdCBzcGFucyBtb3JlIHRoYW4gb25lIGJ1ZmZlclxuICAgIHJldCA9IGhhc1N0cmluZ3MgPyBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSA6IGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn0gLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YVxuLy8gY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5cblxuZnVuY3Rpb24gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkge1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICB2YXIgcmV0ID0gcC5kYXRhO1xuICBuIC09IHJldC5sZW5ndGg7XG5cbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgc3RyID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICBuIC09IG5iO1xuXG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICArK2M7XG4gIH1cblxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufSAvLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YSBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cblxuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KSB7XG4gIHZhciByZXQgPSBidWZmZXJfMS5hbGxvY1Vuc2FmZShuKTtcbiAgdmFyIHAgPSBsaXN0LmhlYWQ7XG4gIHZhciBjID0gMTtcbiAgcC5kYXRhLmNvcHkocmV0KTtcbiAgbiAtPSBwLmRhdGEubGVuZ3RoO1xuXG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIGJ1ZiA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gYnVmLmxlbmd0aCA/IGJ1Zi5sZW5ndGggOiBuO1xuICAgIGJ1Zi5jb3B5KHJldCwgcmV0Lmxlbmd0aCAtIG4sIDAsIG5iKTtcbiAgICBuIC09IG5iO1xuXG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICArK2M7XG4gIH1cblxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlOyAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cblxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBuZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuaW5oZXJpdHMkMShXcml0YWJsZSwgRXZlbnRFbWl0dGVyKTtcblxuZnVuY3Rpb24gbm9wKCkge31cblxuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2J1ZmZlcicsIHtcbiAgICBnZXQ6IGRlcHJlY2F0ZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArICdpbnN0ZWFkLicpXG4gIH0pO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cblxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7IC8vIHRoZSBwb2ludCBhdCB3aGljaCB3cml0ZSgpIHN0YXJ0cyByZXR1cm5pbmcgZmFsc2VcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyB0aGF0IHdlIGFsd2F5cyByZXR1cm4gZmFsc2UgaWZcbiAgLy8gdGhlIGVudGlyZSBidWZmZXIgaXMgbm90IGZsdXNoZWQgaW1tZWRpYXRlbHkgb24gd3JpdGUoKVxuXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtOyAvLyBjYXN0IHRvIGludHMuXG5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfn50aGlzLmhpZ2hXYXRlck1hcms7XG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7IC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG5cbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTsgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuXG4gIHRoaXMuZW5kZWQgPSBmYWxzZTsgLy8gd2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkXG5cbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlOyAvLyBzaG91bGQgd2UgZGVjb2RlIHN0cmluZ3MgaW50byBidWZmZXJzIGJlZm9yZSBwYXNzaW5nIHRvIF93cml0ZT9cbiAgLy8gdGhpcyBpcyBoZXJlIHNvIHRoYXQgc29tZSBub2RlLWNvcmUgc3RyZWFtcyBjYW4gb3B0aW1pemUgc3RyaW5nXG4gIC8vIGhhbmRsaW5nIGF0IGEgbG93ZXIgbGV2ZWwuXG5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlOyAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnOyAvLyBub3QgYW4gYWN0dWFsIGJ1ZmZlciB3ZSBrZWVwIHRyYWNrIG9mLCBidXQgYSBtZWFzdXJlbWVudFxuICAvLyBvZiBob3cgbXVjaCB3ZSdyZSB3YWl0aW5nIHRvIGdldCBwdXNoZWQgdG8gc29tZSB1bmRlcmx5aW5nXG4gIC8vIHNvY2tldCBvciBmaWxlLlxuXG4gIHRoaXMubGVuZ3RoID0gMDsgLy8gYSBmbGFnIHRvIHNlZSB3aGVuIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS5cblxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTsgLy8gd2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbFxuXG4gIHRoaXMuY29ya2VkID0gMDsgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG5cbiAgdGhpcy5zeW5jID0gdHJ1ZTsgLy8gYSBmbGFnIHRvIGtub3cgaWYgd2UncmUgcHJvY2Vzc2luZyBwcmV2aW91c2x5IGJ1ZmZlcmVkIGl0ZW1zLCB3aGljaFxuICAvLyBtYXkgY2FsbCB0aGUgX3dyaXRlKCkgY2FsbGJhY2sgaW4gdGhlIHNhbWUgdGljaywgc28gdGhhdCB3ZSBkb24ndFxuICAvLyBlbmQgdXAgaW4gYW4gb3ZlcmxhcHBlZCBvbndyaXRlIHNpdHVhdGlvbi5cblxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTsgLy8gdGhlIGNhbGxiYWNrIHRoYXQncyBwYXNzZWQgdG8gX3dyaXRlKGNodW5rLGNiKVxuXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07IC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuXG5cbiAgdGhpcy53cml0ZWNiID0gbnVsbDsgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7IC8vIG51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZFxuXG4gIHRoaXMucGVuZGluZ2NiID0gMDsgLy8gZW1pdCBwcmVmaW5pc2ggaWYgdGhlIG9ubHkgdGhpbmcgd2UncmUgd2FpdGluZyBmb3IgaXMgX3dyaXRlIGNic1xuICAvLyBUaGlzIGlzIHJlbGV2YW50IGZvciBzeW5jaHJvbm91cyBUcmFuc2Zvcm0gc3RyZWFtc1xuXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTsgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlOyAvLyBjb3VudCBidWZmZXJlZCByZXF1ZXN0c1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwOyAvLyBhbGxvY2F0ZSB0aGUgZmlyc3QgQ29ya2VkUmVxdWVzdCwgdGhlcmUgaXMgYWx3YXlzXG4gIC8vIG9uZSBhbGxvY2F0ZWQgYW5kIGZyZWUgdG8gdXNlLCBhbmQgd2UgbWFpbnRhaW4gYXQgbW9zdCB0d29cblxuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiB3cml0YWJsZVN0YXRlR2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG5cbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn07XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdGhvdWdoIHRoZXkncmUgbm90XG4gIC8vIGluc3RhbmNlb2YgV3JpdGFibGUsIHRoZXkncmUgaW5zdGFuY2VvZiBSZWFkYWJsZS5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdyaXRhYmxlKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7IC8vIGxlZ2FjeS5cblxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICB9XG5cbiAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG59IC8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cblxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKSk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTsgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcblxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIG5leHRUaWNrKGNiLCBlcik7XG59IC8vIElmIHdlIGdldCBzb21ldGhpbmcgdGhhdCBpcyBub3QgYSBidWZmZXIsIHN0cmluZywgbnVsbCwgb3IgdW5kZWZpbmVkLFxuLy8gYW5kIHdlJ3JlIG5vdCBpbiBvYmplY3RNb2RlLCB0aGVuIHRoYXQncyBhbiBlcnJvci5cbi8vIE90aGVyd2lzZSBzdHJlYW0gY2h1bmtzIGFyZSBhbGwgY29uc2lkZXJlZCB0byBiZSBvZiBsZW5ndGg9MSwgYW5kIHRoZVxuLy8gd2F0ZXJtYXJrcyBkZXRlcm1pbmUgaG93IG1hbnkgb2JqZWN0cyB0byBrZWVwIGluIHRoZSBidWZmZXIsIHJhdGhlciB0aGFuXG4vLyBob3cgbWFueSBieXRlcyBvciBjaGFyYWN0ZXJzLlxuXG5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG4gIHZhciBlciA9IGZhbHNlOyAvLyBBbHdheXMgdGhyb3cgZXJyb3IgaWYgYSBudWxsIGlzIHdyaXR0ZW5cbiAgLy8gaWYgd2UgYXJlIG5vdCBpbiBvYmplY3QgbW9kZSB0aGVuIHRocm93XG4gIC8vIGlmIGl0IGlzIG5vdCBhIGJ1ZmZlciwgc3RyaW5nLCBvciB1bmRlZmluZWQuXG5cbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbScpO1xuICB9IGVsc2UgaWYgKCFidWZmZXJfMS5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cblxuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgbmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGJ1ZmZlcl8xLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcDtcbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmICh2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICBzdGF0ZS5jb3JrZWQrKztcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS51bmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tO1xuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBidWZmZXJfMS5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cblxuICByZXR1cm4gY2h1bms7XG59IC8vIGlmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBzb21ldGhpbmcsIHRoZW4ganVzdCBwdXQgdGhpc1xuLy8gaW4gdGhlIHF1ZXVlLCBhbmQgd2FpdCBvdXIgdHVybi4gIE90aGVyd2lzZSwgY2FsbCBfd3JpdGVcbi8vIElmIHdlIHJldHVybiBmYWxzZSwgdGhlbiB3ZSBuZWVkIGEgZHJhaW4gZXZlbnQsIHNvIHNldCB0aGF0IGZsYWcuXG5cblxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG4gIGlmIChidWZmZXJfMS5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcbiAgdmFyIHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcms7IC8vIHdlIG11c3QgZW5zdXJlIHRoYXQgcHJldmlvdXMgbmVlZERyYWluIHdpbGwgbm90IGJlIHJlc2V0IHRvIGZhbHNlLlxuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbmV3IFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpO1xuXG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuICBpZiAoc3luYykgbmV4dFRpY2soY2IsIGVyKTtlbHNlIGNiKGVyKTtcbiAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvKjxyZXBsYWNlbWVudD4qL1xuICAgICAgbmV4dFRpY2soYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIC8qPC9yZXBsYWNlbWVudD4qL1xuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKSB7XG4gIGlmICghZmluaXNoZWQpIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKTtcbiAgc3RhdGUucGVuZGluZ2NiLS07XG4gIGNiKCk7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xufSAvLyBNdXN0IGZvcmNlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBuZXh0VGljaywgc28gdGhhdCB3ZSBkb24ndFxuLy8gZW1pdCAnZHJhaW4nIGJlZm9yZSB0aGUgd3JpdGUoKSBjb25zdW1lciBnZXRzIHRoZSAnZmFsc2UnIHJldHVyblxuLy8gdmFsdWUsIGFuZCBoYXMgYSBjaGFuY2UgdG8gYXR0YWNoIGEgJ2RyYWluJyBsaXN0ZW5lci5cblxuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59IC8vIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0XG5cblxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuICAgIHZhciBjb3VudCA9IDA7XG5cbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpOyAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgICBpZiAoaG9sZGVyLm5leHQpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdChzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7IC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeSA9PT0gbnVsbCkgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIH1cblxuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbDtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7IC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG5cbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfSAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG5cblxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICBpZiAobmVlZCkge1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkO1xufVxuXG5mdW5jdGlvbiBlbmRXcml0YWJsZShzdHJlYW0sIHN0YXRlLCBjYikge1xuICBzdGF0ZS5lbmRpbmcgPSB0cnVlO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcblxuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIG5leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cblxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIHN0cmVhbS53cml0YWJsZSA9IGZhbHNlO1xufSAvLyBJdCBzZWVtcyBhIGxpbmtlZCBsaXN0IGJ1dCBpdCBpcyBub3Rcbi8vIHRoZXJlIHdpbGwgYmUgb25seSAyIG9mIHRoZXNlIGZvciBlYWNoIHN0cmVhbVxuXG5cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcblxuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICB2YXIgZW50cnkgPSBfdGhpcy5lbnRyeTtcbiAgICBfdGhpcy5lbnRyeSA9IG51bGw7XG5cbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgICBjYihlcnIpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gX3RoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IF90aGlzO1xuICAgIH1cbiAgfTtcbn1cblxuaW5oZXJpdHMkMShEdXBsZXgsIFJlYWRhYmxlKTtcbnZhciBrZXlzID0gT2JqZWN0LmtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcblxuZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gIHZhciBtZXRob2QgPSBrZXlzW3ZdO1xuICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG59XG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGUgPT09IGZhbHNlKSB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuICB0aGlzLm9uY2UoJ2VuZCcsIG9uZW5kKTtcbn0gLy8gdGhlIG5vLWhhbGYtb3BlbiBlbmZvcmNlclxuXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47IC8vIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbi5cbiAgLy8gQnV0IGFsbG93IG1vcmUgd3JpdGVzIHRvIGhhcHBlbiBpbiB0aGlzIHRpY2suXG5cbiAgbmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuXG4vLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG5pbmhlcml0cyQxKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtU3RhdGUoc3RyZWFtKSB7XG4gIHRoaXMuYWZ0ZXJUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICByZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSk7XG4gIH07XG5cbiAgdGhpcy5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHRoaXMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG4gIHRoaXMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRoaXMud3JpdGVlbmNvZGluZyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG4gIGlmICghY2IpIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzJykpO1xuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG4gIGNiKGVyKTtcbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgc3RyZWFtLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IG5ldyBUcmFuc2Zvcm1TdGF0ZSh0aGlzKTsgLy8gd2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuXG4gIHZhciBzdHJlYW0gPSB0aGlzOyAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7IC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgdGhpcy5vbmNlKCdwcmVmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyKSB7XG4gICAgICBkb25lKHN0cmVhbSwgZXIpO1xuICAgIH0pO2Vsc2UgZG9uZShzdHJlYW0pO1xuICB9KTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTsgLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcblxuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07IC8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpOyAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuXG4gIHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgaWYgKHdzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcbiAgaWYgKHRzLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn1cblxuaW5oZXJpdHMkMShQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKTtcbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTtcblxuaW5oZXJpdHMkMShTdHJlYW0sIEV2ZW50RW1pdHRlcik7XG5TdHJlYW0uUmVhZGFibGUgPSBSZWFkYWJsZTtcblN0cmVhbS5Xcml0YWJsZSA9IFdyaXRhYmxlO1xuU3RyZWFtLkR1cGxleCA9IER1cGxleDtcblN0cmVhbS5UcmFuc2Zvcm0gPSBUcmFuc2Zvcm07XG5TdHJlYW0uUGFzc1Rocm91Z2ggPSBQYXNzVGhyb3VnaDsgLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC40LnhcblxuU3RyZWFtLlN0cmVhbSA9IFN0cmVhbTtcbi8vIHBhcnQgb2YgdGhpcyBjbGFzcykgaXMgb3ZlcnJpZGRlbiBpbiB0aGUgUmVhZGFibGUgY2xhc3MuXG5cbmZ1bmN0aW9uIFN0cmVhbSgpIHtcbiAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG59XG5cblN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChkZXN0LCBvcHRpb25zKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzO1xuXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGlmIChkZXN0LndyaXRhYmxlKSB7XG4gICAgICBpZiAoZmFsc2UgPT09IGRlc3Qud3JpdGUoY2h1bmspICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgICBzb3VyY2UucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2RhdGEnLCBvbmRhdGEpO1xuXG4gIGZ1bmN0aW9uIG9uZHJhaW4oKSB7XG4gICAgaWYgKHNvdXJjZS5yZWFkYWJsZSAmJiBzb3VyY2UucmVzdW1lKSB7XG4gICAgICBzb3VyY2UucmVzdW1lKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTsgLy8gSWYgdGhlICdlbmQnIG9wdGlvbiBpcyBub3Qgc3VwcGxpZWQsIGRlc3QuZW5kKCkgd2lsbCBiZSBjYWxsZWQgd2hlblxuICAvLyBzb3VyY2UgZ2V0cyB0aGUgJ2VuZCcgb3IgJ2Nsb3NlJyBldmVudHMuICBPbmx5IGRlc3QuZW5kKCkgb25jZS5cblxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2Uub24oJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH1cblxuICB2YXIgZGlkT25FbmQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuICAgIGlmICh0eXBlb2YgZGVzdC5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSBkZXN0LmRlc3Ryb3koKTtcbiAgfSAvLyBkb24ndCBsZWF2ZSBkYW5nbGluZyBwaXBlcyB3aGVuIHRoZXJlIGFyZSBlcnJvcnMuXG5cblxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgY2xlYW51cCgpO1xuXG4gICAgaWYgKEV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkIHN0cmVhbSBlcnJvciBpbiBwaXBlLlxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTsgLy8gcmVtb3ZlIGFsbCB0aGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgd2VyZSBhZGRlZC5cblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcbiAgfVxuXG4gIHNvdXJjZS5vbignZW5kJywgY2xlYW51cCk7XG4gIHNvdXJjZS5vbignY2xvc2UnLCBjbGVhbnVwKTtcbiAgZGVzdC5vbignY2xvc2UnLCBjbGVhbnVwKTtcbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKTsgLy8gQWxsb3cgZm9yIHVuaXgtbGlrZSB1c2FnZTogQS5waXBlKEIpLnBpcGUoQylcblxuICByZXR1cm4gZGVzdDtcbn07XG5cbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyO1xudmFyIHNhZmVyID0ge307XG52YXIga2V5O1xuXG5mb3IgKGtleSBpbiBidWZmZXIpIHtcbiAgaWYgKCFidWZmZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7XG4gIGlmIChrZXkgPT09ICdTbG93QnVmZmVyJyB8fCBrZXkgPT09ICdCdWZmZXInKSBjb250aW51ZTtcbiAgc2FmZXJba2V5XSA9IGJ1ZmZlcltrZXldO1xufVxuXG52YXIgU2FmZXIgPSBzYWZlci5CdWZmZXIgPSB7fTtcblxuZm9yIChrZXkgaW4gQnVmZmVyKSB7XG4gIGlmICghQnVmZmVyLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlO1xuICBpZiAoa2V5ID09PSAnYWxsb2NVbnNhZmUnIHx8IGtleSA9PT0gJ2FsbG9jVW5zYWZlU2xvdycpIGNvbnRpbnVlO1xuICBTYWZlcltrZXldID0gQnVmZmVyW2tleV07XG59XG5cbnNhZmVyLkJ1ZmZlci5wcm90b3R5cGUgPSBCdWZmZXIucHJvdG90eXBlO1xuXG5pZiAoIVNhZmVyLmZyb20gfHwgU2FmZXIuZnJvbSA9PT0gVWludDhBcnJheS5mcm9tKSB7XG4gIFNhZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn1cblxuaWYgKCFTYWZlci5hbGxvYykge1xuICBTYWZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2Ygc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPj0gMiAqICgxIDw8IDMwKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpO1xuICAgIH1cblxuICAgIHZhciBidWYgPSBCdWZmZXIoc2l6ZSk7XG5cbiAgICBpZiAoIWZpbGwgfHwgZmlsbC5sZW5ndGggPT09IDApIHtcbiAgICAgIGJ1Zi5maWxsKDApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgYnVmLmZpbGwoZmlsbCwgZW5jb2RpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9O1xufVxuXG5pZiAoIXNhZmVyLmtTdHJpbmdNYXhMZW5ndGgpIHtcbiAgdHJ5IHtcbiAgICBzYWZlci5rU3RyaW5nTWF4TGVuZ3RoID0gcHJvY2Vzcy5iaW5kaW5nKCdidWZmZXInKS5rU3RyaW5nTWF4TGVuZ3RoO1xuICB9IGNhdGNoIChlKSB7Ly8gd2UgY2FuJ3QgZGV0ZXJtaW5lIGtTdHJpbmdNYXhMZW5ndGggaW4gZW52aXJvbm1lbnRzIHdoZXJlIHByb2Nlc3MuYmluZGluZ1xuICAgIC8vIGlzIHVuc3VwcG9ydGVkLCBzbyBsZXQncyBub3Qgc2V0IGl0XG4gIH1cbn1cblxuaWYgKCFzYWZlci5jb25zdGFudHMpIHtcbiAgc2FmZXIuY29uc3RhbnRzID0ge1xuICAgIE1BWF9MRU5HVEg6IHNhZmVyLmtNYXhMZW5ndGhcbiAgfTtcblxuICBpZiAoc2FmZXIua1N0cmluZ01heExlbmd0aCkge1xuICAgIHNhZmVyLmNvbnN0YW50cy5NQVhfU1RSSU5HX0xFTkdUSCA9IHNhZmVyLmtTdHJpbmdNYXhMZW5ndGg7XG4gIH1cbn1cblxudmFyIHNhZmVyXzEgPSBzYWZlcjtcblxudmFyIEJPTUNoYXIgPSBcIlxcdUZFRkZcIjtcbnZhciBQcmVwZW5kQk9NID0gUHJlcGVuZEJPTVdyYXBwZXI7XG5cbmZ1bmN0aW9uIFByZXBlbmRCT01XcmFwcGVyKGVuY29kZXIsIG9wdGlvbnMpIHtcbiAgdGhpcy5lbmNvZGVyID0gZW5jb2RlcjtcbiAgdGhpcy5hZGRCT00gPSB0cnVlO1xufVxuXG5QcmVwZW5kQk9NV3JhcHBlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIGlmICh0aGlzLmFkZEJPTSkge1xuICAgIHN0ciA9IEJPTUNoYXIgKyBzdHI7XG4gICAgdGhpcy5hZGRCT00gPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVuY29kZXIud3JpdGUoc3RyKTtcbn07XG5cblByZXBlbmRCT01XcmFwcGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVuY29kZXIuZW5kKCk7XG59OyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbnZhciBTdHJpcEJPTSA9IFN0cmlwQk9NV3JhcHBlcjtcblxuZnVuY3Rpb24gU3RyaXBCT01XcmFwcGVyKGRlY29kZXIsIG9wdGlvbnMpIHtcbiAgdGhpcy5kZWNvZGVyID0gZGVjb2RlcjtcbiAgdGhpcy5wYXNzID0gZmFsc2U7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG59XG5cblN0cmlwQk9NV3JhcHBlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIHZhciByZXMgPSB0aGlzLmRlY29kZXIud3JpdGUoYnVmKTtcbiAgaWYgKHRoaXMucGFzcyB8fCAhcmVzKSByZXR1cm4gcmVzO1xuXG4gIGlmIChyZXNbMF0gPT09IEJPTUNoYXIpIHtcbiAgICByZXMgPSByZXMuc2xpY2UoMSk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuc3RyaXBCT00gPT09ICdmdW5jdGlvbicpIHRoaXMub3B0aW9ucy5zdHJpcEJPTSgpO1xuICB9XG5cbiAgdGhpcy5wYXNzID0gdHJ1ZTtcbiAgcmV0dXJuIHJlcztcbn07XG5cblN0cmlwQk9NV3JhcHBlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5kZWNvZGVyLmVuZCgpO1xufTtcblxudmFyIGJvbUhhbmRsaW5nID0ge1xuICBQcmVwZW5kQk9NOiBQcmVwZW5kQk9NLFxuICBTdHJpcEJPTTogU3RyaXBCT01cbn07XG5cbnZhciBCdWZmZXIkMSA9IHNhZmVyXzEuQnVmZmVyOyAvLyBFeHBvcnQgTm9kZS5qcyBpbnRlcm5hbCBlbmNvZGluZ3MuXG5cbnZhciBpbnRlcm5hbCA9IHtcbiAgLy8gRW5jb2RpbmdzXG4gIHV0Zjg6IHtcbiAgICB0eXBlOiBcIl9pbnRlcm5hbFwiLFxuICAgIGJvbUF3YXJlOiB0cnVlXG4gIH0sXG4gIGNlc3U4OiB7XG4gICAgdHlwZTogXCJfaW50ZXJuYWxcIixcbiAgICBib21Bd2FyZTogdHJ1ZVxuICB9LFxuICB1bmljb2RlMTF1dGY4OiBcInV0ZjhcIixcbiAgdWNzMjoge1xuICAgIHR5cGU6IFwiX2ludGVybmFsXCIsXG4gICAgYm9tQXdhcmU6IHRydWVcbiAgfSxcbiAgdXRmMTZsZTogXCJ1Y3MyXCIsXG4gIGJpbmFyeToge1xuICAgIHR5cGU6IFwiX2ludGVybmFsXCJcbiAgfSxcbiAgYmFzZTY0OiB7XG4gICAgdHlwZTogXCJfaW50ZXJuYWxcIlxuICB9LFxuICBoZXg6IHtcbiAgICB0eXBlOiBcIl9pbnRlcm5hbFwiXG4gIH0sXG4gIC8vIENvZGVjLlxuICBfaW50ZXJuYWw6IEludGVybmFsQ29kZWNcbn07IC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIEludGVybmFsQ29kZWMoY29kZWNPcHRpb25zLCBpY29udikge1xuICB0aGlzLmVuYyA9IGNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWU7XG4gIHRoaXMuYm9tQXdhcmUgPSBjb2RlY09wdGlvbnMuYm9tQXdhcmU7XG4gIGlmICh0aGlzLmVuYyA9PT0gXCJiYXNlNjRcIikgdGhpcy5lbmNvZGVyID0gSW50ZXJuYWxFbmNvZGVyQmFzZTY0O2Vsc2UgaWYgKHRoaXMuZW5jID09PSBcImNlc3U4XCIpIHtcbiAgICB0aGlzLmVuYyA9IFwidXRmOFwiOyAvLyBVc2UgdXRmOCBmb3IgZGVjb2RpbmcuXG5cbiAgICB0aGlzLmVuY29kZXIgPSBJbnRlcm5hbEVuY29kZXJDZXN1ODsgLy8gQWRkIGRlY29kZXIgZm9yIHZlcnNpb25zIG9mIE5vZGUgbm90IHN1cHBvcnRpbmcgQ0VTVS04XG5cbiAgICBpZiAoQnVmZmVyJDEuZnJvbSgnZWRhMGJkZWRiMmE5JywgJ2hleCcpLnRvU3RyaW5nKCkgIT09ICfwn5KpJykge1xuICAgICAgdGhpcy5kZWNvZGVyID0gSW50ZXJuYWxEZWNvZGVyQ2VzdTg7XG4gICAgICB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZSA9IGljb252LmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgICB9XG4gIH1cbn1cblxuSW50ZXJuYWxDb2RlYy5wcm90b3R5cGUuZW5jb2RlciA9IEludGVybmFsRW5jb2RlcjtcbkludGVybmFsQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBJbnRlcm5hbERlY29kZXI7IC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXZSB1c2Ugbm9kZS5qcyBpbnRlcm5hbCBkZWNvZGVyLiBJdHMgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIG91cnMuXG5cbnZhciBTdHJpbmdEZWNvZGVyID0gc3RyaW5nX2RlY29kZXIuU3RyaW5nRGVjb2RlcjtcbmlmICghU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kKSAvLyBOb2RlIHYwLjggZG9lc24ndCBoYXZlIHRoaXMgbWV0aG9kLlxuICBTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7fTtcblxuZnVuY3Rpb24gSW50ZXJuYWxEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIFN0cmluZ0RlY29kZXIuY2FsbCh0aGlzLCBjb2RlYy5lbmMpO1xufVxuXG5JbnRlcm5hbERlY29kZXIucHJvdG90eXBlID0gU3RyaW5nRGVjb2Rlci5wcm90b3R5cGU7IC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNvZGVyIGlzIG1vc3RseSB0cml2aWFsXG5cbmZ1bmN0aW9uIEludGVybmFsRW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICB0aGlzLmVuYyA9IGNvZGVjLmVuYztcbn1cblxuSW50ZXJuYWxFbmNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIEJ1ZmZlciQxLmZyb20oc3RyLCB0aGlzLmVuYyk7XG59O1xuXG5JbnRlcm5hbEVuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHt9OyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXhjZXB0IGJhc2U2NCBlbmNvZGVyLCB3aGljaCBtdXN0IGtlZXAgaXRzIHN0YXRlLlxuXG5cbmZ1bmN0aW9uIEludGVybmFsRW5jb2RlckJhc2U2NChvcHRpb25zLCBjb2RlYykge1xuICB0aGlzLnByZXZTdHIgPSAnJztcbn1cblxuSW50ZXJuYWxFbmNvZGVyQmFzZTY0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgc3RyID0gdGhpcy5wcmV2U3RyICsgc3RyO1xuICB2YXIgY29tcGxldGVRdWFkcyA9IHN0ci5sZW5ndGggLSBzdHIubGVuZ3RoICUgNDtcbiAgdGhpcy5wcmV2U3RyID0gc3RyLnNsaWNlKGNvbXBsZXRlUXVhZHMpO1xuICBzdHIgPSBzdHIuc2xpY2UoMCwgY29tcGxldGVRdWFkcyk7XG4gIHJldHVybiBCdWZmZXIkMS5mcm9tKHN0ciwgXCJiYXNlNjRcIik7XG59O1xuXG5JbnRlcm5hbEVuY29kZXJCYXNlNjQucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEJ1ZmZlciQxLmZyb20odGhpcy5wcmV2U3RyLCBcImJhc2U2NFwiKTtcbn07IC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDRVNVLTggZW5jb2RlciBpcyBhbHNvIHNwZWNpYWwuXG5cblxuZnVuY3Rpb24gSW50ZXJuYWxFbmNvZGVyQ2VzdTgob3B0aW9ucywgY29kZWMpIHt9XG5cbkludGVybmFsRW5jb2RlckNlc3U4LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiA9IEJ1ZmZlciQxLmFsbG9jKHN0ci5sZW5ndGggKiAzKSxcbiAgICAgIGJ1ZklkeCA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsgLy8gTmFpdmUgaW1wbGVtZW50YXRpb24sIGJ1dCBpdCB3b3JrcyBiZWNhdXNlIENFU1UtOCBpcyBlc3BlY2lhbGx5IGVhc3lcbiAgICAvLyB0byBjb252ZXJ0IGZyb20gVVRGLTE2ICh3aGljaCBhbGwgSlMgc3RyaW5ncyBhcmUgZW5jb2RlZCBpbikuXG5cbiAgICBpZiAoY2hhckNvZGUgPCAweDgwKSBidWZbYnVmSWR4KytdID0gY2hhckNvZGU7ZWxzZSBpZiAoY2hhckNvZGUgPCAweDgwMCkge1xuICAgICAgYnVmW2J1ZklkeCsrXSA9IDB4QzAgKyAoY2hhckNvZGUgPj4+IDYpO1xuICAgICAgYnVmW2J1ZklkeCsrXSA9IDB4ODAgKyAoY2hhckNvZGUgJiAweDNmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2hhckNvZGUgd2lsbCBhbHdheXMgYmUgPCAweDEwMDAwIGluIGphdmFzY3JpcHQuXG4gICAgICBidWZbYnVmSWR4KytdID0gMHhFMCArIChjaGFyQ29kZSA+Pj4gMTIpO1xuICAgICAgYnVmW2J1ZklkeCsrXSA9IDB4ODAgKyAoY2hhckNvZGUgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltidWZJZHgrK10gPSAweDgwICsgKGNoYXJDb2RlICYgMHgzZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1Zi5zbGljZSgwLCBidWZJZHgpO1xufTtcblxuSW50ZXJuYWxFbmNvZGVyQ2VzdTgucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHt9OyAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ0VTVS04IGRlY29kZXIgaXMgbm90IGltcGxlbWVudGVkIGluIE5vZGUgdjQuMCtcblxuXG5mdW5jdGlvbiBJbnRlcm5hbERlY29kZXJDZXN1OChvcHRpb25zLCBjb2RlYykge1xuICB0aGlzLmFjYyA9IDA7XG4gIHRoaXMuY29udEJ5dGVzID0gMDtcbiAgdGhpcy5hY2NCeXRlcyA9IDA7XG4gIHRoaXMuZGVmYXVsdENoYXJVbmljb2RlID0gY29kZWMuZGVmYXVsdENoYXJVbmljb2RlO1xufVxuXG5JbnRlcm5hbERlY29kZXJDZXN1OC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIHZhciBhY2MgPSB0aGlzLmFjYyxcbiAgICAgIGNvbnRCeXRlcyA9IHRoaXMuY29udEJ5dGVzLFxuICAgICAgYWNjQnl0ZXMgPSB0aGlzLmFjY0J5dGVzLFxuICAgICAgcmVzID0gJyc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3VyQnl0ZSA9IGJ1ZltpXTtcblxuICAgIGlmICgoY3VyQnl0ZSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAvLyBMZWFkaW5nIGJ5dGVcbiAgICAgIGlmIChjb250Qnl0ZXMgPiAwKSB7XG4gICAgICAgIC8vIFByZXZpb3VzIGNvZGUgaXMgaW52YWxpZFxuICAgICAgICByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgICAgIGNvbnRCeXRlcyA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJCeXRlIDwgMHg4MCkge1xuICAgICAgICAvLyBTaW5nbGUtYnl0ZSBjb2RlXG4gICAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGN1ckJ5dGUpO1xuICAgICAgfSBlbHNlIGlmIChjdXJCeXRlIDwgMHhFMCkge1xuICAgICAgICAvLyBUd28tYnl0ZSBjb2RlXG4gICAgICAgIGFjYyA9IGN1ckJ5dGUgJiAweDFGO1xuICAgICAgICBjb250Qnl0ZXMgPSAxO1xuICAgICAgICBhY2NCeXRlcyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKGN1ckJ5dGUgPCAweEYwKSB7XG4gICAgICAgIC8vIFRocmVlLWJ5dGUgY29kZVxuICAgICAgICBhY2MgPSBjdXJCeXRlICYgMHgwRjtcbiAgICAgICAgY29udEJ5dGVzID0gMjtcbiAgICAgICAgYWNjQnl0ZXMgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm91ciBvciBtb3JlIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBDRVNVLTguXG4gICAgICAgIHJlcyArPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udGludWF0aW9uIGJ5dGVcbiAgICAgIGlmIChjb250Qnl0ZXMgPiAwKSB7XG4gICAgICAgIC8vIFdlJ3JlIHdhaXRpbmcgZm9yIGl0LlxuICAgICAgICBhY2MgPSBhY2MgPDwgNiB8IGN1ckJ5dGUgJiAweDNmO1xuICAgICAgICBjb250Qnl0ZXMtLTtcbiAgICAgICAgYWNjQnl0ZXMrKztcblxuICAgICAgICBpZiAoY29udEJ5dGVzID09PSAwKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIG92ZXJsb25nIGVuY29kaW5nLCBidXQgc3VwcG9ydCBNb2RpZmllZCBVVEYtOCAoZW5jb2RpbmcgTlVMTCBhcyBDMCA4MClcbiAgICAgICAgICBpZiAoYWNjQnl0ZXMgPT09IDIgJiYgYWNjIDwgMHg4MCAmJiBhY2MgPiAwKSByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7ZWxzZSBpZiAoYWNjQnl0ZXMgPT09IDMgJiYgYWNjIDwgMHg4MDApIHJlcyArPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZTtlbHNlIC8vIEFjdHVhbGx5IGFkZCBjaGFyYWN0ZXIuXG4gICAgICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhY2MpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVbmV4cGVjdGVkIGNvbnRpbnVhdGlvbiBieXRlXG4gICAgICAgIHJlcyArPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aGlzLmFjYyA9IGFjYztcbiAgdGhpcy5jb250Qnl0ZXMgPSBjb250Qnl0ZXM7XG4gIHRoaXMuYWNjQnl0ZXMgPSBhY2NCeXRlcztcbiAgcmV0dXJuIHJlcztcbn07XG5cbkludGVybmFsRGVjb2RlckNlc3U4LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByZXMgPSAwO1xuICBpZiAodGhpcy5jb250Qnl0ZXMgPiAwKSByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gIHJldHVybiByZXM7XG59O1xuXG52YXIgQnVmZmVyJDIgPSBzYWZlcl8xLkJ1ZmZlcjsgLy8gTm90ZTogVVRGMTYtTEUgKG9yIFVDUzIpIGNvZGVjIGlzIE5vZGUuanMgbmF0aXZlLiBTZWUgZW5jb2RpbmdzL2ludGVybmFsLmpzXG4vLyA9PSBVVEYxNi1CRSBjb2RlYy4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG52YXIgdXRmMTZiZSA9IFV0ZjE2QkVDb2RlYztcblxuZnVuY3Rpb24gVXRmMTZCRUNvZGVjKCkge31cblxuVXRmMTZCRUNvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmMTZCRUVuY29kZXI7XG5VdGYxNkJFQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBVdGYxNkJFRGVjb2RlcjtcblV0ZjE2QkVDb2RlYy5wcm90b3R5cGUuYm9tQXdhcmUgPSB0cnVlOyAvLyAtLSBFbmNvZGluZ1xuXG5mdW5jdGlvbiBVdGYxNkJFRW5jb2RlcigpIHt9XG5cblV0ZjE2QkVFbmNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiA9IEJ1ZmZlciQyLmZyb20oc3RyLCAndWNzMicpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHRtcCA9IGJ1ZltpXTtcbiAgICBidWZbaV0gPSBidWZbaSArIDFdO1xuICAgIGJ1ZltpICsgMV0gPSB0bXA7XG4gIH1cblxuICByZXR1cm4gYnVmO1xufTtcblxuVXRmMTZCRUVuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHt9OyAvLyAtLSBEZWNvZGluZ1xuXG5cbmZ1bmN0aW9uIFV0ZjE2QkVEZWNvZGVyKCkge1xuICB0aGlzLm92ZXJmbG93Qnl0ZSA9IC0xO1xufVxuXG5VdGYxNkJFRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09IDApIHJldHVybiAnJztcbiAgdmFyIGJ1ZjIgPSBCdWZmZXIkMi5hbGxvYyhidWYubGVuZ3RoICsgMSksXG4gICAgICBpID0gMCxcbiAgICAgIGogPSAwO1xuXG4gIGlmICh0aGlzLm92ZXJmbG93Qnl0ZSAhPT0gLTEpIHtcbiAgICBidWYyWzBdID0gYnVmWzBdO1xuICAgIGJ1ZjJbMV0gPSB0aGlzLm92ZXJmbG93Qnl0ZTtcbiAgICBpID0gMTtcbiAgICBqID0gMjtcbiAgfVxuXG4gIGZvciAoOyBpIDwgYnVmLmxlbmd0aCAtIDE7IGkgKz0gMiwgaiArPSAyKSB7XG4gICAgYnVmMltqXSA9IGJ1ZltpICsgMV07XG4gICAgYnVmMltqICsgMV0gPSBidWZbaV07XG4gIH1cblxuICB0aGlzLm92ZXJmbG93Qnl0ZSA9IGkgPT0gYnVmLmxlbmd0aCAtIDEgPyBidWZbYnVmLmxlbmd0aCAtIDFdIDogLTE7XG4gIHJldHVybiBidWYyLnNsaWNlKDAsIGopLnRvU3RyaW5nKCd1Y3MyJyk7XG59O1xuXG5VdGYxNkJFRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge307IC8vID09IFVURi0xNiBjb2RlYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWNvZGVyIGNob29zZXMgYXV0b21hdGljYWxseSBmcm9tIFVURi0xNkxFIGFuZCBVVEYtMTZCRSB1c2luZyBCT00gYW5kIHNwYWNlLWJhc2VkIGhldXJpc3RpYy5cbi8vIERlZmF1bHRzIHRvIFVURi0xNkxFLCBhcyBpdCdzIHByZXZhbGVudCBhbmQgZGVmYXVsdCBpbiBOb2RlLlxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYgYW5kIGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI3V0Zi0xNmxlXG4vLyBEZWNvZGVyIGRlZmF1bHQgY2FuIGJlIGNoYW5nZWQ6IGljb252LmRlY29kZShidWYsICd1dGYxNicsIHtkZWZhdWx0RW5jb2Rpbmc6ICd1dGYtMTZiZSd9KTtcbi8vIEVuY29kZXIgdXNlcyBVVEYtMTZMRSBhbmQgcHJlcGVuZHMgQk9NICh3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIGFkZEJPTTogZmFsc2UpLlxuXG5cbnZhciB1dGYxNl8xID0gVXRmMTZDb2RlYztcblxuZnVuY3Rpb24gVXRmMTZDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gIHRoaXMuaWNvbnYgPSBpY29udjtcbn1cblxuVXRmMTZDb2RlYy5wcm90b3R5cGUuZW5jb2RlciA9IFV0ZjE2RW5jb2RlcjtcblV0ZjE2Q29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBVdGYxNkRlY29kZXI7IC8vIC0tIEVuY29kaW5nIChwYXNzLXRocm91Z2gpXG5cbmZ1bmN0aW9uIFV0ZjE2RW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKG9wdGlvbnMuYWRkQk9NID09PSB1bmRlZmluZWQpIG9wdGlvbnMuYWRkQk9NID0gdHJ1ZTtcbiAgdGhpcy5lbmNvZGVyID0gY29kZWMuaWNvbnYuZ2V0RW5jb2RlcigndXRmLTE2bGUnLCBvcHRpb25zKTtcbn1cblxuVXRmMTZFbmNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIHRoaXMuZW5jb2Rlci53cml0ZShzdHIpO1xufTtcblxuVXRmMTZFbmNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmVuY29kZXIuZW5kKCk7XG59OyAvLyAtLSBEZWNvZGluZ1xuXG5cbmZ1bmN0aW9uIFV0ZjE2RGVjb2RlcihvcHRpb25zLCBjb2RlYykge1xuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmluaXRpYWxCeXRlcyA9IFtdO1xuICB0aGlzLmluaXRpYWxCeXRlc0xlbiA9IDA7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHRoaXMuaWNvbnYgPSBjb2RlYy5pY29udjtcbn1cblxuVXRmMTZEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKCF0aGlzLmRlY29kZXIpIHtcbiAgICAvLyBDb2RlYyBpcyBub3QgY2hvc2VuIHlldC4gQWNjdW11bGF0ZSBpbml0aWFsIGJ5dGVzLlxuICAgIHRoaXMuaW5pdGlhbEJ5dGVzLnB1c2goYnVmKTtcbiAgICB0aGlzLmluaXRpYWxCeXRlc0xlbiArPSBidWYubGVuZ3RoO1xuICAgIGlmICh0aGlzLmluaXRpYWxCeXRlc0xlbiA8IDE2KSAvLyBXZSBuZWVkIG1vcmUgYnl0ZXMgdG8gdXNlIHNwYWNlIGhldXJpc3RpYyAoc2VlIGJlbG93KVxuICAgICAgcmV0dXJuICcnOyAvLyBXZSBoYXZlIGVub3VnaCBieXRlcyAtPiBkZXRlY3QgZW5kaWFubmVzcy5cblxuICAgIHZhciBidWYgPSBCdWZmZXIkMi5jb25jYXQodGhpcy5pbml0aWFsQnl0ZXMpLFxuICAgICAgICBlbmNvZGluZyA9IGRldGVjdEVuY29kaW5nKGJ1ZiwgdGhpcy5vcHRpb25zLmRlZmF1bHRFbmNvZGluZyk7XG4gICAgdGhpcy5kZWNvZGVyID0gdGhpcy5pY29udi5nZXREZWNvZGVyKGVuY29kaW5nLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuaW5pdGlhbEJ5dGVzLmxlbmd0aCA9IHRoaXMuaW5pdGlhbEJ5dGVzTGVuID0gMDtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmRlY29kZXIud3JpdGUoYnVmKTtcbn07XG5cblV0ZjE2RGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuZGVjb2Rlcikge1xuICAgIHZhciBidWYgPSBCdWZmZXIkMi5jb25jYXQodGhpcy5pbml0aWFsQnl0ZXMpLFxuICAgICAgICBlbmNvZGluZyA9IGRldGVjdEVuY29kaW5nKGJ1ZiwgdGhpcy5vcHRpb25zLmRlZmF1bHRFbmNvZGluZyk7XG4gICAgdGhpcy5kZWNvZGVyID0gdGhpcy5pY29udi5nZXREZWNvZGVyKGVuY29kaW5nLCB0aGlzLm9wdGlvbnMpO1xuICAgIHZhciByZXMgPSB0aGlzLmRlY29kZXIud3JpdGUoYnVmKSxcbiAgICAgICAgdHJhaWwgPSB0aGlzLmRlY29kZXIuZW5kKCk7XG4gICAgcmV0dXJuIHRyYWlsID8gcmVzICsgdHJhaWwgOiByZXM7XG4gIH1cblxuICByZXR1cm4gdGhpcy5kZWNvZGVyLmVuZCgpO1xufTtcblxuZnVuY3Rpb24gZGV0ZWN0RW5jb2RpbmcoYnVmLCBkZWZhdWx0RW5jb2RpbmcpIHtcbiAgdmFyIGVuYyA9IGRlZmF1bHRFbmNvZGluZyB8fCAndXRmLTE2bGUnO1xuXG4gIGlmIChidWYubGVuZ3RoID49IDIpIHtcbiAgICAvLyBDaGVjayBCT00uXG4gICAgaWYgKGJ1ZlswXSA9PSAweEZFICYmIGJ1ZlsxXSA9PSAweEZGKSAvLyBVVEYtMTZCRSBCT01cbiAgICAgIGVuYyA9ICd1dGYtMTZiZSc7ZWxzZSBpZiAoYnVmWzBdID09IDB4RkYgJiYgYnVmWzFdID09IDB4RkUpIC8vIFVURi0xNkxFIEJPTVxuICAgICAgZW5jID0gJ3V0Zi0xNmxlJztlbHNlIHtcbiAgICAgIC8vIE5vIEJPTSBmb3VuZC4gVHJ5IHRvIGRlZHVjZSBlbmNvZGluZyBmcm9tIGluaXRpYWwgY29udGVudC5cbiAgICAgIC8vIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZSBjb250ZW50IGhhcyBBU0NJSSBjaGFycyAoVSswMCoqKSwgYnV0IHRoZSBvcHBvc2l0ZSAoVSsqKjAwKSBpcyB1bmNvbW1vbi5cbiAgICAgIC8vIFNvLCB3ZSBjb3VudCBBU0NJSSBhcyBpZiBpdCB3YXMgTEUgb3IgQkUsIGFuZCBkZWNpZGUgZnJvbSB0aGF0LlxuICAgICAgdmFyIGFzY2lpQ2hhcnNMRSA9IDAsXG4gICAgICAgICAgYXNjaWlDaGFyc0JFID0gMCxcbiAgICAgICAgICAvLyBDb3VudHMgb2YgY2hhcnMgaW4gYm90aCBwb3NpdGlvbnNcbiAgICAgIF9sZW4gPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gYnVmLmxlbmd0aCAlIDIsIDY0KTsgLy8gTGVuIGlzIGFsd2F5cyBldmVuLlxuXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX2xlbjsgaSArPSAyKSB7XG4gICAgICAgIGlmIChidWZbaV0gPT09IDAgJiYgYnVmW2kgKyAxXSAhPT0gMCkgYXNjaWlDaGFyc0JFKys7XG4gICAgICAgIGlmIChidWZbaV0gIT09IDAgJiYgYnVmW2kgKyAxXSA9PT0gMCkgYXNjaWlDaGFyc0xFKys7XG4gICAgICB9XG5cbiAgICAgIGlmIChhc2NpaUNoYXJzQkUgPiBhc2NpaUNoYXJzTEUpIGVuYyA9ICd1dGYtMTZiZSc7ZWxzZSBpZiAoYXNjaWlDaGFyc0JFIDwgYXNjaWlDaGFyc0xFKSBlbmMgPSAndXRmLTE2bGUnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbmM7XG59XG5cbnZhciB1dGYxNiA9IHtcbiAgdXRmMTZiZTogdXRmMTZiZSxcbiAgdXRmMTY6IHV0ZjE2XzFcbn07XG5cbnZhciBCdWZmZXIkMyA9IHNhZmVyXzEuQnVmZmVyOyAvLyBVVEYtNyBjb2RlYywgYWNjb3JkaW5nIHRvIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMTUyXG4vLyBTZWUgYWxzbyBiZWxvdyBhIFVURi03LUlNQVAgY29kZWMsIGFjY29yZGluZyB0byBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNS4xLjNcblxudmFyIHV0ZjdfMSA9IFV0ZjdDb2RlYztcbnZhciB1bmljb2RlMTF1dGY3ID0gJ3V0ZjcnOyAvLyBBbGlhcyBVTklDT0RFLTEtMS1VVEYtN1xuXG5mdW5jdGlvbiBVdGY3Q29kZWMoY29kZWNPcHRpb25zLCBpY29udikge1xuICB0aGlzLmljb252ID0gaWNvbnY7XG59XG5VdGY3Q29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBVdGY3RW5jb2RlcjtcblV0ZjdDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFV0ZjdEZWNvZGVyO1xuVXRmN0NvZGVjLnByb3RvdHlwZS5ib21Bd2FyZSA9IHRydWU7IC8vIC0tIEVuY29kaW5nXG5cbnZhciBub25EaXJlY3RDaGFycyA9IC9bXkEtWmEtejAtOSdcXChcXCksLVxcLlxcLzpcXD8gXFxuXFxyXFx0XSsvZztcblxuZnVuY3Rpb24gVXRmN0VuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgdGhpcy5pY29udiA9IGNvZGVjLmljb252O1xufVxuXG5VdGY3RW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIC8vIE5haXZlIGltcGxlbWVudGF0aW9uLlxuICAvLyBOb24tZGlyZWN0IGNoYXJzIGFyZSBlbmNvZGVkIGFzIFwiKzxiYXNlNjQ+LVwiOyBzaW5nbGUgXCIrXCIgY2hhciBpcyBlbmNvZGVkIGFzIFwiKy1cIi5cbiAgcmV0dXJuIEJ1ZmZlciQzLmZyb20oc3RyLnJlcGxhY2Uobm9uRGlyZWN0Q2hhcnMsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHJldHVybiBcIitcIiArIChjaHVuayA9PT0gJysnID8gJycgOiB0aGlzLmljb252LmVuY29kZShjaHVuaywgJ3V0ZjE2LWJlJykudG9TdHJpbmcoJ2Jhc2U2NCcpLnJlcGxhY2UoLz0rJC8sICcnKSkgKyBcIi1cIjtcbiAgfS5iaW5kKHRoaXMpKSk7XG59O1xuXG5VdGY3RW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge307IC8vIC0tIERlY29kaW5nXG5cblxuZnVuY3Rpb24gVXRmN0RlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgdGhpcy5pY29udiA9IGNvZGVjLmljb252O1xuICB0aGlzLmluQmFzZTY0ID0gZmFsc2U7XG4gIHRoaXMuYmFzZTY0QWNjdW0gPSAnJztcbn1cblxudmFyIGJhc2U2NFJlZ2V4ID0gL1tBLVphLXowLTlcXC8rXS87XG52YXIgYmFzZTY0Q2hhcnMgPSBbXTtcblxuZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgMjU2OyBpJDErKykge1xuICBiYXNlNjRDaGFyc1tpJDFdID0gYmFzZTY0UmVnZXgudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGkkMSkpO1xufVxuXG52YXIgcGx1c0NoYXIgPSAnKycuY2hhckNvZGVBdCgwKSxcbiAgICBtaW51c0NoYXIgPSAnLScuY2hhckNvZGVBdCgwKSxcbiAgICBhbmRDaGFyID0gJyYnLmNoYXJDb2RlQXQoMCk7XG5cblV0ZjdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgdmFyIHJlcyA9IFwiXCIsXG4gICAgICBsYXN0SSA9IDAsXG4gICAgICBpbkJhc2U2NCA9IHRoaXMuaW5CYXNlNjQsXG4gICAgICBiYXNlNjRBY2N1bSA9IHRoaXMuYmFzZTY0QWNjdW07IC8vIFRoZSBkZWNvZGVyIGlzIG1vcmUgaW52b2x2ZWQgYXMgd2UgbXVzdCBoYW5kbGUgY2h1bmtzIGluIHN0cmVhbS5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaW5CYXNlNjQpIHtcbiAgICAgIC8vIFdlJ3JlIGluIGRpcmVjdCBtb2RlLlxuICAgICAgLy8gV3JpdGUgZGlyZWN0IGNoYXJzIHVudGlsICcrJ1xuICAgICAgaWYgKGJ1ZltpXSA9PSBwbHVzQ2hhcikge1xuICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoYnVmLnNsaWNlKGxhc3RJLCBpKSwgXCJhc2NpaVwiKTsgLy8gV3JpdGUgZGlyZWN0IGNoYXJzLlxuXG4gICAgICAgIGxhc3RJID0gaSArIDE7XG4gICAgICAgIGluQmFzZTY0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgZGVjb2RlIGJhc2U2NC5cbiAgICAgIGlmICghYmFzZTY0Q2hhcnNbYnVmW2ldXSkge1xuICAgICAgICAvLyBCYXNlNjQgZW5kZWQuXG4gICAgICAgIGlmIChpID09IGxhc3RJICYmIGJ1ZltpXSA9PSBtaW51c0NoYXIpIHtcbiAgICAgICAgICAvLyBcIistXCIgLT4gXCIrXCJcbiAgICAgICAgICByZXMgKz0gXCIrXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGI2NHN0ciA9IGJhc2U2NEFjY3VtICsgYnVmLnNsaWNlKGxhc3RJLCBpKS50b1N0cmluZygpO1xuICAgICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIkMy5mcm9tKGI2NHN0ciwgJ2Jhc2U2NCcpLCBcInV0ZjE2LWJlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJ1ZltpXSAhPSBtaW51c0NoYXIpIC8vIE1pbnVzIGlzIGFic29yYmVkIGFmdGVyIGJhc2U2NC5cbiAgICAgICAgICBpLS07XG4gICAgICAgIGxhc3RJID0gaSArIDE7XG4gICAgICAgIGluQmFzZTY0ID0gZmFsc2U7XG4gICAgICAgIGJhc2U2NEFjY3VtID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpbkJhc2U2NCkge1xuICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShidWYuc2xpY2UobGFzdEkpLCBcImFzY2lpXCIpOyAvLyBXcml0ZSBkaXJlY3QgY2hhcnMuXG4gIH0gZWxzZSB7XG4gICAgdmFyIGI2NHN0ciA9IGJhc2U2NEFjY3VtICsgYnVmLnNsaWNlKGxhc3RJKS50b1N0cmluZygpO1xuICAgIHZhciBjYW5CZURlY29kZWQgPSBiNjRzdHIubGVuZ3RoIC0gYjY0c3RyLmxlbmd0aCAlIDg7IC8vIE1pbmltYWwgY2h1bms6IDIgcXVhZHMgLT4gMngzIGJ5dGVzIC0+IDMgY2hhcnMuXG5cbiAgICBiYXNlNjRBY2N1bSA9IGI2NHN0ci5zbGljZShjYW5CZURlY29kZWQpOyAvLyBUaGUgcmVzdCB3aWxsIGJlIGRlY29kZWQgaW4gZnV0dXJlLlxuXG4gICAgYjY0c3RyID0gYjY0c3RyLnNsaWNlKDAsIGNhbkJlRGVjb2RlZCk7XG4gICAgcmVzICs9IHRoaXMuaWNvbnYuZGVjb2RlKEJ1ZmZlciQzLmZyb20oYjY0c3RyLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG4gIH1cblxuICB0aGlzLmluQmFzZTY0ID0gaW5CYXNlNjQ7XG4gIHRoaXMuYmFzZTY0QWNjdW0gPSBiYXNlNjRBY2N1bTtcbiAgcmV0dXJuIHJlcztcbn07XG5cblV0ZjdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByZXMgPSBcIlwiO1xuICBpZiAodGhpcy5pbkJhc2U2NCAmJiB0aGlzLmJhc2U2NEFjY3VtLmxlbmd0aCA+IDApIHJlcyA9IHRoaXMuaWNvbnYuZGVjb2RlKEJ1ZmZlciQzLmZyb20odGhpcy5iYXNlNjRBY2N1bSwgJ2Jhc2U2NCcpLCBcInV0ZjE2LWJlXCIpO1xuICB0aGlzLmluQmFzZTY0ID0gZmFsc2U7XG4gIHRoaXMuYmFzZTY0QWNjdW0gPSAnJztcbiAgcmV0dXJuIHJlcztcbn07IC8vIFVURi03LUlNQVAgY29kZWMuXG4vLyBSRkMzNTAxIFNlYy4gNS4xLjMgTW9kaWZpZWQgVVRGLTcgKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi01LjEuMylcbi8vIERpZmZlcmVuY2VzOlxuLy8gICogQmFzZTY0IHBhcnQgaXMgc3RhcnRlZCBieSBcIiZcIiBpbnN0ZWFkIG9mIFwiK1wiXG4vLyAgKiBEaXJlY3QgY2hhcmFjdGVycyBhcmUgMHgyMC0weDdFLCBleGNlcHQgXCImXCIgKDB4MjYpXG4vLyAgKiBJbiBCYXNlNjQsIFwiLFwiIGlzIHVzZWQgaW5zdGVhZCBvZiBcIi9cIlxuLy8gICogQmFzZTY0IG11c3Qgbm90IGJlIHVzZWQgdG8gcmVwcmVzZW50IGRpcmVjdCBjaGFyYWN0ZXJzLlxuLy8gICogTm8gaW1wbGljaXQgc2hpZnQgYmFjayBmcm9tIEJhc2U2NCAoc2hvdWxkIGFsd2F5cyBlbmQgd2l0aCAnLScpXG4vLyAgKiBTdHJpbmcgbXVzdCBlbmQgaW4gbm9uLXNoaWZ0ZWQgcG9zaXRpb24uXG4vLyAgKiBcIi0mXCIgd2hpbGUgaW4gYmFzZTY0IGlzIG5vdCBhbGxvd2VkLlxuXG5cbnZhciB1dGY3aW1hcCA9IFV0ZjdJTUFQQ29kZWM7XG5cbmZ1bmN0aW9uIFV0ZjdJTUFQQ29kZWMoY29kZWNPcHRpb25zLCBpY29udikge1xuICB0aGlzLmljb252ID0gaWNvbnY7XG59XG5VdGY3SU1BUENvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmN0lNQVBFbmNvZGVyO1xuVXRmN0lNQVBDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFV0ZjdJTUFQRGVjb2RlcjtcblV0ZjdJTUFQQ29kZWMucHJvdG90eXBlLmJvbUF3YXJlID0gdHJ1ZTsgLy8gLS0gRW5jb2RpbmdcblxuZnVuY3Rpb24gVXRmN0lNQVBFbmNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIHRoaXMuaWNvbnYgPSBjb2RlYy5pY29udjtcbiAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICB0aGlzLmJhc2U2NEFjY3VtID0gQnVmZmVyJDMuYWxsb2MoNik7XG4gIHRoaXMuYmFzZTY0QWNjdW1JZHggPSAwO1xufVxuXG5VdGY3SU1BUEVuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgaW5CYXNlNjQgPSB0aGlzLmluQmFzZTY0LFxuICAgICAgYmFzZTY0QWNjdW0gPSB0aGlzLmJhc2U2NEFjY3VtLFxuICAgICAgYmFzZTY0QWNjdW1JZHggPSB0aGlzLmJhc2U2NEFjY3VtSWR4LFxuICAgICAgYnVmID0gQnVmZmVyJDMuYWxsb2Moc3RyLmxlbmd0aCAqIDUgKyAxMCksXG4gICAgICBidWZJZHggPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHVDaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBpZiAoMHgyMCA8PSB1Q2hhciAmJiB1Q2hhciA8PSAweDdFKSB7XG4gICAgICAvLyBEaXJlY3QgY2hhcmFjdGVyIG9yICcmJy5cbiAgICAgIGlmIChpbkJhc2U2NCkge1xuICAgICAgICBpZiAoYmFzZTY0QWNjdW1JZHggPiAwKSB7XG4gICAgICAgICAgYnVmSWR4ICs9IGJ1Zi53cml0ZShiYXNlNjRBY2N1bS5zbGljZSgwLCBiYXNlNjRBY2N1bUlkeCkudG9TdHJpbmcoJ2Jhc2U2NCcpLnJlcGxhY2UoL1xcLy9nLCAnLCcpLnJlcGxhY2UoLz0rJC8sICcnKSwgYnVmSWR4KTtcbiAgICAgICAgICBiYXNlNjRBY2N1bUlkeCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBidWZbYnVmSWR4KytdID0gbWludXNDaGFyOyAvLyBXcml0ZSAnLScsIHRoZW4gZ28gdG8gZGlyZWN0IG1vZGUuXG5cbiAgICAgICAgaW5CYXNlNjQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpbkJhc2U2NCkge1xuICAgICAgICBidWZbYnVmSWR4KytdID0gdUNoYXI7IC8vIFdyaXRlIGRpcmVjdCBjaGFyYWN0ZXJcblxuICAgICAgICBpZiAodUNoYXIgPT09IGFuZENoYXIpIC8vIEFtcGVyc2FuZCAtPiAnJi0nXG4gICAgICAgICAgYnVmW2J1ZklkeCsrXSA9IG1pbnVzQ2hhcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm9uLWRpcmVjdCBjaGFyYWN0ZXJcbiAgICAgIGlmICghaW5CYXNlNjQpIHtcbiAgICAgICAgYnVmW2J1ZklkeCsrXSA9IGFuZENoYXI7IC8vIFdyaXRlICcmJywgdGhlbiBnbyB0byBiYXNlNjQgbW9kZS5cblxuICAgICAgICBpbkJhc2U2NCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbkJhc2U2NCkge1xuICAgICAgICBiYXNlNjRBY2N1bVtiYXNlNjRBY2N1bUlkeCsrXSA9IHVDaGFyID4+IDg7XG4gICAgICAgIGJhc2U2NEFjY3VtW2Jhc2U2NEFjY3VtSWR4KytdID0gdUNoYXIgJiAweEZGO1xuXG4gICAgICAgIGlmIChiYXNlNjRBY2N1bUlkeCA9PSBiYXNlNjRBY2N1bS5sZW5ndGgpIHtcbiAgICAgICAgICBidWZJZHggKz0gYnVmLndyaXRlKGJhc2U2NEFjY3VtLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXC8vZywgJywnKSwgYnVmSWR4KTtcbiAgICAgICAgICBiYXNlNjRBY2N1bUlkeCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aGlzLmluQmFzZTY0ID0gaW5CYXNlNjQ7XG4gIHRoaXMuYmFzZTY0QWNjdW1JZHggPSBiYXNlNjRBY2N1bUlkeDtcbiAgcmV0dXJuIGJ1Zi5zbGljZSgwLCBidWZJZHgpO1xufTtcblxuVXRmN0lNQVBFbmNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBidWYgPSBCdWZmZXIkMy5hbGxvYygxMCksXG4gICAgICBidWZJZHggPSAwO1xuXG4gIGlmICh0aGlzLmluQmFzZTY0KSB7XG4gICAgaWYgKHRoaXMuYmFzZTY0QWNjdW1JZHggPiAwKSB7XG4gICAgICBidWZJZHggKz0gYnVmLndyaXRlKHRoaXMuYmFzZTY0QWNjdW0uc2xpY2UoMCwgdGhpcy5iYXNlNjRBY2N1bUlkeCkudG9TdHJpbmcoJ2Jhc2U2NCcpLnJlcGxhY2UoL1xcLy9nLCAnLCcpLnJlcGxhY2UoLz0rJC8sICcnKSwgYnVmSWR4KTtcbiAgICAgIHRoaXMuYmFzZTY0QWNjdW1JZHggPSAwO1xuICAgIH1cblxuICAgIGJ1ZltidWZJZHgrK10gPSBtaW51c0NoYXI7IC8vIFdyaXRlICctJywgdGhlbiBnbyB0byBkaXJlY3QgbW9kZS5cblxuICAgIHRoaXMuaW5CYXNlNjQgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBidWYuc2xpY2UoMCwgYnVmSWR4KTtcbn07IC8vIC0tIERlY29kaW5nXG5cblxuZnVuY3Rpb24gVXRmN0lNQVBEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIHRoaXMuaWNvbnYgPSBjb2RlYy5pY29udjtcbiAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICB0aGlzLmJhc2U2NEFjY3VtID0gJyc7XG59XG5cbnZhciBiYXNlNjRJTUFQQ2hhcnMgPSBiYXNlNjRDaGFycy5zbGljZSgpO1xuYmFzZTY0SU1BUENoYXJzWycsJy5jaGFyQ29kZUF0KDApXSA9IHRydWU7XG5cblV0ZjdJTUFQRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIHZhciByZXMgPSBcIlwiLFxuICAgICAgbGFzdEkgPSAwLFxuICAgICAgaW5CYXNlNjQgPSB0aGlzLmluQmFzZTY0LFxuICAgICAgYmFzZTY0QWNjdW0gPSB0aGlzLmJhc2U2NEFjY3VtOyAvLyBUaGUgZGVjb2RlciBpcyBtb3JlIGludm9sdmVkIGFzIHdlIG11c3QgaGFuZGxlIGNodW5rcyBpbiBzdHJlYW0uXG4gIC8vIEl0IGlzIGZvcmdpdmluZywgY2xvc2VyIHRvIHN0YW5kYXJkIFVURi03IChmb3IgZXhhbXBsZSwgJy0nIGlzIG9wdGlvbmFsIGF0IHRoZSBlbmQpLlxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFpbkJhc2U2NCkge1xuICAgICAgLy8gV2UncmUgaW4gZGlyZWN0IG1vZGUuXG4gICAgICAvLyBXcml0ZSBkaXJlY3QgY2hhcnMgdW50aWwgJyYnXG4gICAgICBpZiAoYnVmW2ldID09IGFuZENoYXIpIHtcbiAgICAgICAgcmVzICs9IHRoaXMuaWNvbnYuZGVjb2RlKGJ1Zi5zbGljZShsYXN0SSwgaSksIFwiYXNjaWlcIik7IC8vIFdyaXRlIGRpcmVjdCBjaGFycy5cblxuICAgICAgICBsYXN0SSA9IGkgKyAxO1xuICAgICAgICBpbkJhc2U2NCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGRlY29kZSBiYXNlNjQuXG4gICAgICBpZiAoIWJhc2U2NElNQVBDaGFyc1tidWZbaV1dKSB7XG4gICAgICAgIC8vIEJhc2U2NCBlbmRlZC5cbiAgICAgICAgaWYgKGkgPT0gbGFzdEkgJiYgYnVmW2ldID09IG1pbnVzQ2hhcikge1xuICAgICAgICAgIC8vIFwiJi1cIiAtPiBcIiZcIlxuICAgICAgICAgIHJlcyArPSBcIiZcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYjY0c3RyID0gYmFzZTY0QWNjdW0gKyBidWYuc2xpY2UobGFzdEksIGkpLnRvU3RyaW5nKCkucmVwbGFjZSgvLC9nLCAnLycpO1xuICAgICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIkMy5mcm9tKGI2NHN0ciwgJ2Jhc2U2NCcpLCBcInV0ZjE2LWJlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJ1ZltpXSAhPSBtaW51c0NoYXIpIC8vIE1pbnVzIG1heSBiZSBhYnNvcmJlZCBhZnRlciBiYXNlNjQuXG4gICAgICAgICAgaS0tO1xuICAgICAgICBsYXN0SSA9IGkgKyAxO1xuICAgICAgICBpbkJhc2U2NCA9IGZhbHNlO1xuICAgICAgICBiYXNlNjRBY2N1bSA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaW5CYXNlNjQpIHtcbiAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoYnVmLnNsaWNlKGxhc3RJKSwgXCJhc2NpaVwiKTsgLy8gV3JpdGUgZGlyZWN0IGNoYXJzLlxuICB9IGVsc2Uge1xuICAgIHZhciBiNjRzdHIgPSBiYXNlNjRBY2N1bSArIGJ1Zi5zbGljZShsYXN0SSkudG9TdHJpbmcoKS5yZXBsYWNlKC8sL2csICcvJyk7XG4gICAgdmFyIGNhbkJlRGVjb2RlZCA9IGI2NHN0ci5sZW5ndGggLSBiNjRzdHIubGVuZ3RoICUgODsgLy8gTWluaW1hbCBjaHVuazogMiBxdWFkcyAtPiAyeDMgYnl0ZXMgLT4gMyBjaGFycy5cblxuICAgIGJhc2U2NEFjY3VtID0gYjY0c3RyLnNsaWNlKGNhbkJlRGVjb2RlZCk7IC8vIFRoZSByZXN0IHdpbGwgYmUgZGVjb2RlZCBpbiBmdXR1cmUuXG5cbiAgICBiNjRzdHIgPSBiNjRzdHIuc2xpY2UoMCwgY2FuQmVEZWNvZGVkKTtcbiAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoQnVmZmVyJDMuZnJvbShiNjRzdHIsICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgfVxuXG4gIHRoaXMuaW5CYXNlNjQgPSBpbkJhc2U2NDtcbiAgdGhpcy5iYXNlNjRBY2N1bSA9IGJhc2U2NEFjY3VtO1xuICByZXR1cm4gcmVzO1xufTtcblxuVXRmN0lNQVBEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByZXMgPSBcIlwiO1xuICBpZiAodGhpcy5pbkJhc2U2NCAmJiB0aGlzLmJhc2U2NEFjY3VtLmxlbmd0aCA+IDApIHJlcyA9IHRoaXMuaWNvbnYuZGVjb2RlKEJ1ZmZlciQzLmZyb20odGhpcy5iYXNlNjRBY2N1bSwgJ2Jhc2U2NCcpLCBcInV0ZjE2LWJlXCIpO1xuICB0aGlzLmluQmFzZTY0ID0gZmFsc2U7XG4gIHRoaXMuYmFzZTY0QWNjdW0gPSAnJztcbiAgcmV0dXJuIHJlcztcbn07XG5cbnZhciB1dGY3ID0ge1xuICB1dGY3OiB1dGY3XzEsXG4gIHVuaWNvZGUxMXV0Zjc6IHVuaWNvZGUxMXV0ZjcsXG4gIHV0ZjdpbWFwOiB1dGY3aW1hcFxufTtcblxudmFyIEJ1ZmZlciQ0ID0gc2FmZXJfMS5CdWZmZXI7IC8vIFNpbmdsZS1ieXRlIGNvZGVjLiBOZWVkcyBhICdjaGFycycgc3RyaW5nIHBhcmFtZXRlciB0aGF0IGNvbnRhaW5zIDI1NiBvciAxMjggY2hhcnMgdGhhdFxuLy8gY29ycmVzcG9uZCB0byBlbmNvZGVkIGJ5dGVzIChpZiAxMjggLSB0aGVuIGxvd2VyIGhhbGYgaXMgQVNDSUkpLiBcblxudmFyIF9zYmNzID0gU0JDU0NvZGVjO1xuXG5mdW5jdGlvbiBTQkNTQ29kZWMoY29kZWNPcHRpb25zLCBpY29udikge1xuICBpZiAoIWNvZGVjT3B0aW9ucykgdGhyb3cgbmV3IEVycm9yKFwiU0JDUyBjb2RlYyBpcyBjYWxsZWQgd2l0aG91dCB0aGUgZGF0YS5cIik7IC8vIFByZXBhcmUgY2hhciBidWZmZXIgZm9yIGRlY29kaW5nLlxuXG4gIGlmICghY29kZWNPcHRpb25zLmNoYXJzIHx8IGNvZGVjT3B0aW9ucy5jaGFycy5sZW5ndGggIT09IDEyOCAmJiBjb2RlY09wdGlvbnMuY2hhcnMubGVuZ3RoICE9PSAyNTYpIHRocm93IG5ldyBFcnJvcihcIkVuY29kaW5nICdcIiArIGNvZGVjT3B0aW9ucy50eXBlICsgXCInIGhhcyBpbmNvcnJlY3QgJ2NoYXJzJyAobXVzdCBiZSBvZiBsZW4gMTI4IG9yIDI1NilcIik7XG5cbiAgaWYgKGNvZGVjT3B0aW9ucy5jaGFycy5sZW5ndGggPT09IDEyOCkge1xuICAgIHZhciBhc2NpaVN0cmluZyA9IFwiXCI7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEyODsgaSsrKSB7XG4gICAgICBhc2NpaVN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xuICAgIH1cblxuICAgIGNvZGVjT3B0aW9ucy5jaGFycyA9IGFzY2lpU3RyaW5nICsgY29kZWNPcHRpb25zLmNoYXJzO1xuICB9XG5cbiAgdGhpcy5kZWNvZGVCdWYgPSBCdWZmZXIkNC5mcm9tKGNvZGVjT3B0aW9ucy5jaGFycywgJ3VjczInKTsgLy8gRW5jb2RpbmcgYnVmZmVyLlxuXG4gIHZhciBlbmNvZGVCdWYgPSBCdWZmZXIkNC5hbGxvYyg2NTUzNiwgaWNvbnYuZGVmYXVsdENoYXJTaW5nbGVCeXRlLmNoYXJDb2RlQXQoMCkpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZWNPcHRpb25zLmNoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgZW5jb2RlQnVmW2NvZGVjT3B0aW9ucy5jaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG4gIH1cblxuICB0aGlzLmVuY29kZUJ1ZiA9IGVuY29kZUJ1Zjtcbn1cblxuU0JDU0NvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gU0JDU0VuY29kZXI7XG5TQkNTQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBTQkNTRGVjb2RlcjtcblxuZnVuY3Rpb24gU0JDU0VuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgdGhpcy5lbmNvZGVCdWYgPSBjb2RlYy5lbmNvZGVCdWY7XG59XG5cblNCQ1NFbmNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiA9IEJ1ZmZlciQ0LmFsbG9jKHN0ci5sZW5ndGgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgYnVmW2ldID0gdGhpcy5lbmNvZGVCdWZbc3RyLmNoYXJDb2RlQXQoaSldO1xuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblNCQ1NFbmNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7fTtcblxuZnVuY3Rpb24gU0JDU0RlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgdGhpcy5kZWNvZGVCdWYgPSBjb2RlYy5kZWNvZGVCdWY7XG59XG5cblNCQ1NEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgLy8gU3RyaW5ncyBhcmUgaW1tdXRhYmxlIGluIEpTIC0+IHdlIHVzZSB1Y3MyIGJ1ZmZlciB0byBzcGVlZCB1cCBjb21wdXRhdGlvbnMuXG4gIHZhciBkZWNvZGVCdWYgPSB0aGlzLmRlY29kZUJ1ZjtcbiAgdmFyIG5ld0J1ZiA9IEJ1ZmZlciQ0LmFsbG9jKGJ1Zi5sZW5ndGggKiAyKTtcbiAgdmFyIGlkeDEgPSAwLFxuICAgICAgaWR4MiA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICBpZHgxID0gYnVmW2ldICogMjtcbiAgICBpZHgyID0gaSAqIDI7XG4gICAgbmV3QnVmW2lkeDJdID0gZGVjb2RlQnVmW2lkeDFdO1xuICAgIG5ld0J1ZltpZHgyICsgMV0gPSBkZWNvZGVCdWZbaWR4MSArIDFdO1xuICB9XG5cbiAgcmV0dXJuIG5ld0J1Zi50b1N0cmluZygndWNzMicpO1xufTtcblxuU0JDU0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgc2Jjc0NvZGVjID0ge1xuICBfc2JjczogX3NiY3Ncbn07XG5cbnZhciBzYmNzRGF0YSA9IHtcbiAgLy8gTm90IHN1cHBvcnRlZCBieSBpY29udiwgbm90IHN1cmUgd2h5LlxuICBcIjEwMDI5XCI6IFwibWFjY2VudGV1cm9cIixcbiAgXCJtYWNjZW50ZXVyb1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4TEgMSBw4nEhMOWw5zDocSFxIzDpMSNxIbEh8OpxbnFusSOw63Ej8SSxJPElsOzxJfDtMO2w7XDusSaxJvDvOKAoMKwxJjCo8Kn4oCiwrbDn8KuwqnihKLEmcKo4omgxKPErsSvxKriiaTiiaXEq8S24oiC4oiRxYLEu8S8xL3EvsS5xLrFhcWGxYPCrOKImsWExYfiiIbCq8K74oCmwqDFiMWQw5XFkcWM4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rFjcWUxZXFmOKAueKAusWZxZbFl8Wg4oCa4oCexaHFmsWbw4HFpMWlw43FvcW+xarDk8OUxavFrsOaxa/FsMWxxbLFs8Odw73Et8W7xYHFvMSiy4dcIlxuICB9LFxuICBcIjgwOFwiOiBcImNwODA4XCIsXG4gIFwiaWJtODA4XCI6IFwiY3A4MDhcIixcbiAgXCJjcDgwOFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/4paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paA0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/QgdGR0ITRlNCH0ZfQjtGewrDiiJnCt+KImuKEluKCrOKWoMKgXCJcbiAgfSxcbiAgXCJtaWtcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItCQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP4pSU4pS04pSs4pSc4pSA4pS84pWj4pWR4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pSQ4paR4paS4paT4pSC4pSk4oSWwqfilZfilZ3ilJjilIzilojiloTilozilpDiloDOscOfzpPPgM6jz4PCtc+EzqbOmM6pzrTiiJ7Phs614oip4omhwrHiiaXiiaTijKDijKHDt+KJiMKw4oiZwrfiiJrigb/CsuKWoMKgXCJcbiAgfSxcbiAgLy8gQWxpYXNlcyBvZiBnZW5lcmF0ZWQgZW5jb2RpbmdzLlxuICBcImFzY2lpOGJpdFwiOiBcImFzY2lpXCIsXG4gIFwidXNhc2NpaVwiOiBcImFzY2lpXCIsXG4gIFwiYW5zaXgzNFwiOiBcImFzY2lpXCIsXG4gIFwiYW5zaXgzNDE5NjhcIjogXCJhc2NpaVwiLFxuICBcImFuc2l4MzQxOTg2XCI6IFwiYXNjaWlcIixcbiAgXCJjc2FzY2lpXCI6IFwiYXNjaWlcIixcbiAgXCJjcDM2N1wiOiBcImFzY2lpXCIsXG4gIFwiaWJtMzY3XCI6IFwiYXNjaWlcIixcbiAgXCJpc29pcjZcIjogXCJhc2NpaVwiLFxuICBcImlzbzY0NnVzXCI6IFwiYXNjaWlcIixcbiAgXCJpc282NDZpcnZcIjogXCJhc2NpaVwiLFxuICBcInVzXCI6IFwiYXNjaWlcIixcbiAgXCJsYXRpbjFcIjogXCJpc284ODU5MVwiLFxuICBcImxhdGluMlwiOiBcImlzbzg4NTkyXCIsXG4gIFwibGF0aW4zXCI6IFwiaXNvODg1OTNcIixcbiAgXCJsYXRpbjRcIjogXCJpc284ODU5NFwiLFxuICBcImxhdGluNVwiOiBcImlzbzg4NTk5XCIsXG4gIFwibGF0aW42XCI6IFwiaXNvODg1OTEwXCIsXG4gIFwibGF0aW43XCI6IFwiaXNvODg1OTEzXCIsXG4gIFwibGF0aW44XCI6IFwiaXNvODg1OTE0XCIsXG4gIFwibGF0aW45XCI6IFwiaXNvODg1OTE1XCIsXG4gIFwibGF0aW4xMFwiOiBcImlzbzg4NTkxNlwiLFxuICBcImNzaXNvbGF0aW4xXCI6IFwiaXNvODg1OTFcIixcbiAgXCJjc2lzb2xhdGluMlwiOiBcImlzbzg4NTkyXCIsXG4gIFwiY3Npc29sYXRpbjNcIjogXCJpc284ODU5M1wiLFxuICBcImNzaXNvbGF0aW40XCI6IFwiaXNvODg1OTRcIixcbiAgXCJjc2lzb2xhdGluY3lyaWxsaWNcIjogXCJpc284ODU5NVwiLFxuICBcImNzaXNvbGF0aW5hcmFiaWNcIjogXCJpc284ODU5NlwiLFxuICBcImNzaXNvbGF0aW5ncmVla1wiOiBcImlzbzg4NTk3XCIsXG4gIFwiY3Npc29sYXRpbmhlYnJld1wiOiBcImlzbzg4NTk4XCIsXG4gIFwiY3Npc29sYXRpbjVcIjogXCJpc284ODU5OVwiLFxuICBcImNzaXNvbGF0aW42XCI6IFwiaXNvODg1OTEwXCIsXG4gIFwibDFcIjogXCJpc284ODU5MVwiLFxuICBcImwyXCI6IFwiaXNvODg1OTJcIixcbiAgXCJsM1wiOiBcImlzbzg4NTkzXCIsXG4gIFwibDRcIjogXCJpc284ODU5NFwiLFxuICBcImw1XCI6IFwiaXNvODg1OTlcIixcbiAgXCJsNlwiOiBcImlzbzg4NTkxMFwiLFxuICBcImw3XCI6IFwiaXNvODg1OTEzXCIsXG4gIFwibDhcIjogXCJpc284ODU5MTRcIixcbiAgXCJsOVwiOiBcImlzbzg4NTkxNVwiLFxuICBcImwxMFwiOiBcImlzbzg4NTkxNlwiLFxuICBcImlzb2lyMTRcIjogXCJpc282NDZqcFwiLFxuICBcImlzb2lyNTdcIjogXCJpc282NDZjblwiLFxuICBcImlzb2lyMTAwXCI6IFwiaXNvODg1OTFcIixcbiAgXCJpc29pcjEwMVwiOiBcImlzbzg4NTkyXCIsXG4gIFwiaXNvaXIxMDlcIjogXCJpc284ODU5M1wiLFxuICBcImlzb2lyMTEwXCI6IFwiaXNvODg1OTRcIixcbiAgXCJpc29pcjE0NFwiOiBcImlzbzg4NTk1XCIsXG4gIFwiaXNvaXIxMjdcIjogXCJpc284ODU5NlwiLFxuICBcImlzb2lyMTI2XCI6IFwiaXNvODg1OTdcIixcbiAgXCJpc29pcjEzOFwiOiBcImlzbzg4NTk4XCIsXG4gIFwiaXNvaXIxNDhcIjogXCJpc284ODU5OVwiLFxuICBcImlzb2lyMTU3XCI6IFwiaXNvODg1OTEwXCIsXG4gIFwiaXNvaXIxNjZcIjogXCJ0aXM2MjBcIixcbiAgXCJpc29pcjE3OVwiOiBcImlzbzg4NTkxM1wiLFxuICBcImlzb2lyMTk5XCI6IFwiaXNvODg1OTE0XCIsXG4gIFwiaXNvaXIyMDNcIjogXCJpc284ODU5MTVcIixcbiAgXCJpc29pcjIyNlwiOiBcImlzbzg4NTkxNlwiLFxuICBcImNwODE5XCI6IFwiaXNvODg1OTFcIixcbiAgXCJpYm04MTlcIjogXCJpc284ODU5MVwiLFxuICBcImN5cmlsbGljXCI6IFwiaXNvODg1OTVcIixcbiAgXCJhcmFiaWNcIjogXCJpc284ODU5NlwiLFxuICBcImFyYWJpYzhcIjogXCJpc284ODU5NlwiLFxuICBcImVjbWExMTRcIjogXCJpc284ODU5NlwiLFxuICBcImFzbW83MDhcIjogXCJpc284ODU5NlwiLFxuICBcImdyZWVrXCI6IFwiaXNvODg1OTdcIixcbiAgXCJncmVlazhcIjogXCJpc284ODU5N1wiLFxuICBcImVjbWExMThcIjogXCJpc284ODU5N1wiLFxuICBcImVsb3Q5MjhcIjogXCJpc284ODU5N1wiLFxuICBcImhlYnJld1wiOiBcImlzbzg4NTk4XCIsXG4gIFwiaGVicmV3OFwiOiBcImlzbzg4NTk4XCIsXG4gIFwidHVya2lzaFwiOiBcImlzbzg4NTk5XCIsXG4gIFwidHVya2lzaDhcIjogXCJpc284ODU5OVwiLFxuICBcInRoYWlcIjogXCJpc284ODU5MTFcIixcbiAgXCJ0aGFpOFwiOiBcImlzbzg4NTkxMVwiLFxuICBcImNlbHRpY1wiOiBcImlzbzg4NTkxNFwiLFxuICBcImNlbHRpYzhcIjogXCJpc284ODU5MTRcIixcbiAgXCJpc29jZWx0aWNcIjogXCJpc284ODU5MTRcIixcbiAgXCJ0aXM2MjAwXCI6IFwidGlzNjIwXCIsXG4gIFwidGlzNjIwMjUyOTFcIjogXCJ0aXM2MjBcIixcbiAgXCJ0aXM2MjAyNTMzMFwiOiBcInRpczYyMFwiLFxuICBcIjEwMDAwXCI6IFwibWFjcm9tYW5cIixcbiAgXCIxMDAwNlwiOiBcIm1hY2dyZWVrXCIsXG4gIFwiMTAwMDdcIjogXCJtYWNjeXJpbGxpY1wiLFxuICBcIjEwMDc5XCI6IFwibWFjaWNlbGFuZFwiLFxuICBcIjEwMDgxXCI6IFwibWFjdHVya2lzaFwiLFxuICBcImNzcGM4Y29kZXBhZ2U0MzdcIjogXCJjcDQzN1wiLFxuICBcImNzcGM3NzViYWx0aWNcIjogXCJjcDc3NVwiLFxuICBcImNzcGM4NTBtdWx0aWxpbmd1YWxcIjogXCJjcDg1MFwiLFxuICBcImNzcGNwODUyXCI6IFwiY3A4NTJcIixcbiAgXCJjc3BjODYybGF0aW5oZWJyZXdcIjogXCJjcDg2MlwiLFxuICBcImNwZ3JcIjogXCJjcDg2OVwiLFxuICBcIm1zZWVcIjogXCJjcDEyNTBcIixcbiAgXCJtc2N5cmxcIjogXCJjcDEyNTFcIixcbiAgXCJtc2Fuc2lcIjogXCJjcDEyNTJcIixcbiAgXCJtc2dyZWVrXCI6IFwiY3AxMjUzXCIsXG4gIFwibXN0dXJrXCI6IFwiY3AxMjU0XCIsXG4gIFwibXNoZWJyXCI6IFwiY3AxMjU1XCIsXG4gIFwibXNhcmFiXCI6IFwiY3AxMjU2XCIsXG4gIFwid2luYmFsdHJpbVwiOiBcImNwMTI1N1wiLFxuICBcImNwMjA4NjZcIjogXCJrb2k4clwiLFxuICBcIjIwODY2XCI6IFwia29pOHJcIixcbiAgXCJpYm04NzhcIjogXCJrb2k4clwiLFxuICBcImNza29pOHJcIjogXCJrb2k4clwiLFxuICBcImNwMjE4NjZcIjogXCJrb2k4dVwiLFxuICBcIjIxODY2XCI6IFwia29pOHVcIixcbiAgXCJpYm0xMTY4XCI6IFwia29pOHVcIixcbiAgXCJzdHJrMTA0ODIwMDJcIjogXCJyazEwNDhcIixcbiAgXCJ0Y3ZuNTcxMlwiOiBcInRjdm5cIixcbiAgXCJ0Y3ZuNTcxMjFcIjogXCJ0Y3ZuXCIsXG4gIFwiZ2IxOTg4ODBcIjogXCJpc282NDZjblwiLFxuICBcImNuXCI6IFwiaXNvNjQ2Y25cIixcbiAgXCJjc2lzbzE0amlzYzYyMjByb1wiOiBcImlzbzY0NmpwXCIsXG4gIFwiamlzYzYyMjAxOTY5cm9cIjogXCJpc282NDZqcFwiLFxuICBcImpwXCI6IFwiaXNvNjQ2anBcIixcbiAgXCJjc2hwcm9tYW44XCI6IFwiaHByb21hbjhcIixcbiAgXCJyOFwiOiBcImhwcm9tYW44XCIsXG4gIFwicm9tYW44XCI6IFwiaHByb21hbjhcIixcbiAgXCJ4cm9tYW44XCI6IFwiaHByb21hbjhcIixcbiAgXCJpYm0xMDUxXCI6IFwiaHByb21hbjhcIixcbiAgXCJtYWNcIjogXCJtYWNpbnRvc2hcIixcbiAgXCJjc21hY2ludG9zaFwiOiBcIm1hY2ludG9zaFwiXG59O1xuXG52YXIgc2Jjc0RhdGFHZW5lcmF0ZWQgPSB7XG4gIFwiNDM3XCI6IFwiY3A0MzdcIixcbiAgXCI3MzdcIjogXCJjcDczN1wiLFxuICBcIjc3NVwiOiBcImNwNzc1XCIsXG4gIFwiODUwXCI6IFwiY3A4NTBcIixcbiAgXCI4NTJcIjogXCJjcDg1MlwiLFxuICBcIjg1NVwiOiBcImNwODU1XCIsXG4gIFwiODU2XCI6IFwiY3A4NTZcIixcbiAgXCI4NTdcIjogXCJjcDg1N1wiLFxuICBcIjg1OFwiOiBcImNwODU4XCIsXG4gIFwiODYwXCI6IFwiY3A4NjBcIixcbiAgXCI4NjFcIjogXCJjcDg2MVwiLFxuICBcIjg2MlwiOiBcImNwODYyXCIsXG4gIFwiODYzXCI6IFwiY3A4NjNcIixcbiAgXCI4NjRcIjogXCJjcDg2NFwiLFxuICBcIjg2NVwiOiBcImNwODY1XCIsXG4gIFwiODY2XCI6IFwiY3A4NjZcIixcbiAgXCI4NjlcIjogXCJjcDg2OVwiLFxuICBcIjg3NFwiOiBcIndpbmRvd3M4NzRcIixcbiAgXCI5MjJcIjogXCJjcDkyMlwiLFxuICBcIjEwNDZcIjogXCJjcDEwNDZcIixcbiAgXCIxMTI0XCI6IFwiY3AxMTI0XCIsXG4gIFwiMTEyNVwiOiBcImNwMTEyNVwiLFxuICBcIjExMjlcIjogXCJjcDExMjlcIixcbiAgXCIxMTMzXCI6IFwiY3AxMTMzXCIsXG4gIFwiMTE2MVwiOiBcImNwMTE2MVwiLFxuICBcIjExNjJcIjogXCJjcDExNjJcIixcbiAgXCIxMTYzXCI6IFwiY3AxMTYzXCIsXG4gIFwiMTI1MFwiOiBcIndpbmRvd3MxMjUwXCIsXG4gIFwiMTI1MVwiOiBcIndpbmRvd3MxMjUxXCIsXG4gIFwiMTI1MlwiOiBcIndpbmRvd3MxMjUyXCIsXG4gIFwiMTI1M1wiOiBcIndpbmRvd3MxMjUzXCIsXG4gIFwiMTI1NFwiOiBcIndpbmRvd3MxMjU0XCIsXG4gIFwiMTI1NVwiOiBcIndpbmRvd3MxMjU1XCIsXG4gIFwiMTI1NlwiOiBcIndpbmRvd3MxMjU2XCIsXG4gIFwiMTI1N1wiOiBcIndpbmRvd3MxMjU3XCIsXG4gIFwiMTI1OFwiOiBcIndpbmRvd3MxMjU4XCIsXG4gIFwiMjg1OTFcIjogXCJpc284ODU5MVwiLFxuICBcIjI4NTkyXCI6IFwiaXNvODg1OTJcIixcbiAgXCIyODU5M1wiOiBcImlzbzg4NTkzXCIsXG4gIFwiMjg1OTRcIjogXCJpc284ODU5NFwiLFxuICBcIjI4NTk1XCI6IFwiaXNvODg1OTVcIixcbiAgXCIyODU5NlwiOiBcImlzbzg4NTk2XCIsXG4gIFwiMjg1OTdcIjogXCJpc284ODU5N1wiLFxuICBcIjI4NTk4XCI6IFwiaXNvODg1OThcIixcbiAgXCIyODU5OVwiOiBcImlzbzg4NTk5XCIsXG4gIFwiMjg2MDBcIjogXCJpc284ODU5MTBcIixcbiAgXCIyODYwMVwiOiBcImlzbzg4NTkxMVwiLFxuICBcIjI4NjAzXCI6IFwiaXNvODg1OTEzXCIsXG4gIFwiMjg2MDRcIjogXCJpc284ODU5MTRcIixcbiAgXCIyODYwNVwiOiBcImlzbzg4NTkxNVwiLFxuICBcIjI4NjA2XCI6IFwiaXNvODg1OTE2XCIsXG4gIFwid2luZG93czg3NFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs77+977+977+977+94oCm77+977+977+977+977+977+977+977+977+977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCU77+977+977+977+977+977+977+977+9wqDguIHguILguIPguITguIXguIbguIfguIjguInguIrguIvguIzguI3guI7guI/guJDguJHguJLguJPguJTguJXguJbguJfguJjguJnguJrguJvguJzguJ3guJ7guJ/guKDguKHguKLguKPguKTguKXguKbguKfguKjguKnguKrguKvguKzguK3guK7guK/guLDguLHguLLguLPguLTguLXguLbguLfguLjguLnguLrvv73vv73vv73vv73guL/guYDguYHguYLguYPguYTguYXguYbguYfguYjguYnguYrguYvguYzguY3guY7guY/guZDguZHguZLguZPguZTguZXguZbguZfguZjguZnguZrguZvvv73vv73vv73vv71cIlxuICB9LFxuICBcIndpbjg3NFwiOiBcIndpbmRvd3M4NzRcIixcbiAgXCJjcDg3NFwiOiBcIndpbmRvd3M4NzRcIixcbiAgXCJ3aW5kb3dzMTI1MFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs77+94oCa77+94oCe4oCm4oCg4oCh77+94oCwxaDigLnFmsWkxb3Fue+/veKAmOKAmeKAnOKAneKAouKAk+KAlO+/veKEosWh4oC6xZvFpcW+xbrCoMuHy5jFgcKkxITCpsKnwqjCqcWewqvCrMKtwq7Fu8KwwrHLm8WCwrTCtcK2wrfCuMSFxZ/Cu8S9y53EvsW8xZTDgcOCxILDhMS5xIbDh8SMw4nEmMOLxJrDjcOOxI7EkMWDxYfDk8OUxZDDlsOXxZjFrsOaxbDDnMOdxaLDn8WVw6HDosSDw6TEusSHw6fEjcOpxJnDq8Sbw63DrsSPxJHFhMWIw7PDtMWRw7bDt8WZxa/DusWxw7zDvcWjy5lcIlxuICB9LFxuICBcIndpbjEyNTBcIjogXCJ3aW5kb3dzMTI1MFwiLFxuICBcImNwMTI1MFwiOiBcIndpbmRvd3MxMjUwXCIsXG4gIFwid2luZG93czEyNTFcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItCC0IPigJrRk+KAnuKApuKAoOKAoeKCrOKAsNCJ4oC50IrQjNCL0I/RkuKAmOKAmeKAnOKAneKAouKAk+KAlO+/veKEotGZ4oC60ZrRnNGb0Z/CoNCO0Z7QiMKk0pDCpsKn0IHCqdCEwqvCrMKtwq7Qh8KwwrHQhtGW0pHCtcK2wrfRkeKEltGUwrvRmNCF0ZXRl9CQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGPXCJcbiAgfSxcbiAgXCJ3aW4xMjUxXCI6IFwid2luZG93czEyNTFcIixcbiAgXCJjcDEyNTFcIjogXCJ3aW5kb3dzMTI1MVwiLFxuICBcIndpbmRvd3MxMjUyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73igJrGkuKAnuKApuKAoOKAocuG4oCwxaDigLnFku+/vcW977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLFoeKAusWT77+9xb7FuMKgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5fDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9w77Dv1wiXG4gIH0sXG4gIFwid2luMTI1MlwiOiBcIndpbmRvd3MxMjUyXCIsXG4gIFwiY3AxMjUyXCI6IFwid2luZG93czEyNTJcIixcbiAgXCJ3aW5kb3dzMTI1M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs77+94oCaxpLigJ7igKbigKDigKHvv73igLDvv73igLnvv73vv73vv73vv73vv73igJjigJnigJzigJ3igKLigJPigJTvv73ihKLvv73igLrvv73vv73vv73vv73CoM6FzobCo8KkwqXCpsKnwqjCqe+/vcKrwqzCrcKu4oCVwrDCscKywrPOhMK1wrbCt86IzonOisK7zozCvc6Ozo/OkM6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHvv73Oo86kzqXOps6nzqjOqc6qzqvOrM6tzq7Or86wzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Cz4PPhM+Fz4bPh8+Iz4nPis+Lz4zPjc+O77+9XCJcbiAgfSxcbiAgXCJ3aW4xMjUzXCI6IFwid2luZG93czEyNTNcIixcbiAgXCJjcDEyNTNcIjogXCJ3aW5kb3dzMTI1M1wiLFxuICBcIndpbmRvd3MxMjU0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73igJrGkuKAnuKApuKAoOKAocuG4oCwxaDigLnFku+/ve+/ve+/ve+/veKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSixaHigLrFk++/ve+/vcW4wqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv8OAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPxJ7DkcOSw5PDlMOVw5bDl8OYw5nDmsObw5zEsMWew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Sfw7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8xLHFn8O/XCJcbiAgfSxcbiAgXCJ3aW4xMjU0XCI6IFwid2luZG93czEyNTRcIixcbiAgXCJjcDEyNTRcIjogXCJ3aW5kb3dzMTI1NFwiLFxuICBcIndpbmRvd3MxMjU1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73igJrGkuKAnuKApuKAoOKAocuG4oCw77+94oC577+977+977+977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLvv73igLrvv73vv73vv73vv73CoMKhwqLCo+KCqsKlwqbCp8KowqnDl8KrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucO3wrvCvMK9wr7Cv9aw1rHWstaz1rTWtda21rfWuNa51rrWu9a81r3Wvta/14DXgdeC14PXsNex17LXs9e077+977+977+977+977+977+977+915DXkdeS15PXlNeV15bXl9eY15nXmteb15zXndee15/XoNeh16LXo9ek16XXpten16jXqdeq77+977+94oCO4oCP77+9XCJcbiAgfSxcbiAgXCJ3aW4xMjU1XCI6IFwid2luZG93czEyNTVcIixcbiAgXCJjcDEyNTVcIjogXCJ3aW5kb3dzMTI1NVwiLFxuICBcIndpbmRvd3MxMjU2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzZvuKAmsaS4oCe4oCm4oCg4oChy4bigLDZueKAucWS2obamNqI2q/igJjigJnigJzigJ3igKLigJPigJTaqeKEotqR4oC6xZPigIzigI3ausKg2IzCosKjwqTCpcKmwqfCqMKp2r7Cq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnYm8K7wrzCvcK+2J/bgdih2KLYo9ik2KXYptin2KjYqdiq2KvYrNit2K7Yr9iw2LHYstiz2LTYtdi2w5fYt9i42LnYutmA2YHZgtmDw6DZhMOi2YXZhtmH2YjDp8Oow6nDqsOr2YnZisOuw6/Zi9mM2Y3ZjsO02Y/ZkMO32ZHDudmSw7vDvOKAjuKAj9uSXCJcbiAgfSxcbiAgXCJ3aW4xMjU2XCI6IFwid2luZG93czEyNTZcIixcbiAgXCJjcDEyNTZcIjogXCJ3aW5kb3dzMTI1NlwiLFxuICBcIndpbmRvd3MxMjU3XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73igJrvv73igJ7igKbigKDigKHvv73igLDvv73igLnvv73CqMuHwrjvv73igJjigJnigJzigJ3igKLigJPigJTvv73ihKLvv73igLrvv73Cr8ub77+9wqDvv73CosKjwqTvv73CpsKnw5jCqcWWwqvCrMKtwq7DhsKwwrHCssKzwrTCtcK2wrfDuMK5xZfCu8K8wr3CvsOmxITErsSAxIbDhMOFxJjEksSMw4nFucSWxKLEtsSqxLvFoMWDxYXDk8WMw5XDlsOXxbLFgcWaxarDnMW7xb3Dn8SFxK/EgcSHw6TDpcSZxJPEjcOpxbrEl8SjxLfEq8S8xaHFhMWGw7PFjcO1w7bDt8WzxYLFm8Wrw7zFvMW+y5lcIlxuICB9LFxuICBcIndpbjEyNTdcIjogXCJ3aW5kb3dzMTI1N1wiLFxuICBcImNwMTI1N1wiOiBcIndpbmRvd3MxMjU3XCIsXG4gIFwid2luZG93czEyNThcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKCrO+/veKAmsaS4oCe4oCm4oCg4oChy4bigLDvv73igLnFku+/ve+/ve+/ve+/veKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSi77+94oC6xZPvv73vv73FuMKgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LEgsOEw4XDhsOHw4jDicOKw4vMgMONw47Dj8SQw5HMicOTw5TGoMOWw5fDmMOZw5rDm8Ocxq/Mg8Ofw6DDocOixIPDpMOlw6bDp8Oow6nDqsOrzIHDrcOuw6/EkcOxzKPDs8O0xqHDtsO3w7jDucO6w7vDvMaw4oKrw79cIlxuICB9LFxuICBcIndpbjEyNThcIjogXCJ3aW5kb3dzMTI1OFwiLFxuICBcImNwMTI1OFwiOiBcIndpbmRvd3MxMjU4XCIsXG4gIFwiaXNvODg1OTFcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcO+w79cIlxuICB9LFxuICBcImNwMjg1OTFcIjogXCJpc284ODU5MVwiLFxuICBcImlzbzg4NTkyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDEhMuYxYHCpMS9xZrCp8KoxaDFnsWkxbnCrcW9xbvCsMSFy5vFgsK0xL7Fm8uHwrjFocWfxaXFusudxb7FvMWUw4HDgsSCw4TEucSGw4fEjMOJxJjDi8Saw43DjsSOxJDFg8WHw5PDlMWQw5bDl8WYxa7DmsWww5zDncWiw5/FlcOhw6LEg8OkxLrEh8OnxI3DqcSZw6vEm8Otw67Ej8SRxYTFiMOzw7TFkcO2w7fFmcWvw7rFscO8w73Fo8uZXCJcbiAgfSxcbiAgXCJjcDI4NTkyXCI6IFwiaXNvODg1OTJcIixcbiAgXCJpc284ODU5M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgxKbLmMKjwqTvv73EpMKnwqjEsMWexJ7EtMKt77+9xbvCsMSnwrLCs8K0wrXEpcK3wrjEscWfxJ/EtcK977+9xbzDgMOBw4Lvv73DhMSKxIjDh8OIw4nDisOLw4zDjcOOw4/vv73DkcOSw5PDlMSgw5bDl8Scw5nDmsObw5zFrMWcw5/DoMOhw6Lvv73DpMSLxInDp8Oow6nDqsOrw6zDrcOuw6/vv73DscOyw7PDtMShw7bDt8Sdw7nDusO7w7zFrcWdy5lcIlxuICB9LFxuICBcImNwMjg1OTNcIjogXCJpc284ODU5M1wiLFxuICBcImlzbzg4NTk0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDEhMS4xZbCpMSoxLvCp8KoxaDEksSixabCrcW9wq/CsMSFy5vFl8K0xKnEvMuHwrjFocSTxKPFp8WKxb7Fi8SAw4HDgsODw4TDhcOGxK7EjMOJxJjDi8SWw43DjsSqxJDFhcWMxLbDlMOVw5bDl8OYxbLDmsObw5zFqMWqw5/EgcOhw6LDo8Okw6XDpsSvxI3DqcSZw6vEl8Otw67Eq8SRxYbFjcS3w7TDtcO2w7fDuMWzw7rDu8O8xanFq8uZXCJcbiAgfSxcbiAgXCJjcDI4NTk0XCI6IFwiaXNvODg1OTRcIixcbiAgXCJpc284ODU5NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg0IHQgtCD0ITQhdCG0IfQiNCJ0IrQi9CMwq3QjtCP0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/ihJbRkdGS0ZPRlNGV0ZbRl9GY0ZnRmtGb0ZzCp9Ge0Z9cIlxuICB9LFxuICBcImNwMjg1OTVcIjogXCJpc284ODU5NVwiLFxuICBcImlzbzg4NTk2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDvv73vv73vv73CpO+/ve+/ve+/ve+/ve+/ve+/ve+/vdiMwq3vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73Ym++/ve+/ve+/vdif77+92KHYotij2KTYpdim2KfYqNip2KrYq9is2K3Yrtiv2LDYsdiy2LPYtNi12LbYt9i42LnYuu+/ve+/ve+/ve+/ve+/vdmA2YHZgtmD2YTZhdmG2YfZiNmJ2YrZi9mM2Y3ZjtmP2ZDZkdmS77+977+977+977+977+977+977+977+977+977+977+977+977+9XCJcbiAgfSxcbiAgXCJjcDI4NTk2XCI6IFwiaXNvODg1OTZcIixcbiAgXCJpc284ODU5N1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg4oCY4oCZwqPigqzigq/CpsKnwqjCqc26wqvCrMKt77+94oCVwrDCscKywrPOhM6FzobCt86IzonOisK7zozCvc6Ozo/OkM6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHvv73Oo86kzqXOps6nzqjOqc6qzqvOrM6tzq7Or86wzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Cz4PPhM+Fz4bPh8+Iz4nPis+Lz4zPjc+O77+9XCJcbiAgfSxcbiAgXCJjcDI4NTk3XCI6IFwiaXNvODg1OTdcIixcbiAgXCJpc284ODU5OFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg77+9wqLCo8KkwqXCpsKnwqjCqcOXwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5w7fCu8K8wr3Cvu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKAl9eQ15HXkteT15TXldeW15fXmNeZ15rXm9ec153Xntef16DXodei16PXpNel16bXp9eo16nXqu+/ve+/veKAjuKAj++/vVwiXG4gIH0sXG4gIFwiY3AyODU5OFwiOiBcImlzbzg4NTk4XCIsXG4gIFwiaXNvODg1OTlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/EnsORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMSwxZ7Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvxJ/DscOyw7PDtMO1w7bDt8O4w7nDusO7w7zEscWfw79cIlxuICB9LFxuICBcImNwMjg1OTlcIjogXCJpc284ODU5OVwiLFxuICBcImlzbzg4NTkxMFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgxITEksSixKrEqMS2wqfEu8SQxaDFpsW9wq3FqsWKwrDEhcSTxKPEq8SpxLfCt8S8xJHFocWnxb7igJXFq8WLxIDDgcOCw4PDhMOFw4bErsSMw4nEmMOLxJbDjcOOw4/DkMWFxYzDk8OUw5XDlsWow5jFssOaw5vDnMOdw57Dn8SBw6HDosOjw6TDpcOmxK/EjcOpxJnDq8SXw63DrsOvw7DFhsWNw7PDtMO1w7bFqcO4xbPDusO7w7zDvcO+xLhcIlxuICB9LFxuICBcImNwMjg2MDBcIjogXCJpc284ODU5MTBcIixcbiAgXCJpc284ODU5MTFcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoOC4geC4guC4g+C4hOC4heC4huC4h+C4iOC4ieC4iuC4i+C4jOC4jeC4juC4j+C4kOC4keC4kuC4k+C4lOC4leC4luC4l+C4mOC4meC4muC4m+C4nOC4neC4nuC4n+C4oOC4oeC4ouC4o+C4pOC4peC4puC4p+C4qOC4qeC4quC4q+C4rOC4reC4ruC4r+C4sOC4seC4suC4s+C4tOC4teC4tuC4t+C4uOC4ueC4uu+/ve+/ve+/ve+/veC4v+C5gOC5geC5guC5g+C5hOC5heC5huC5h+C5iOC5ieC5iuC5i+C5jOC5jeC5juC5j+C5kOC5keC5kuC5k+C5lOC5leC5luC5l+C5mOC5meC5muC5m++/ve+/ve+/ve+/vVwiXG4gIH0sXG4gIFwiY3AyODYwMVwiOiBcImlzbzg4NTkxMVwiLFxuICBcImlzbzg4NTkxM1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg4oCdwqLCo8Kk4oCewqbCp8OYwqnFlsKrwqzCrcKuw4bCsMKxwrLCs+KAnMK1wrbCt8O4wrnFl8K7wrzCvcK+w6bEhMSuxIDEhsOEw4XEmMSSxIzDicW5xJbEosS2xKrEu8WgxYPFhcOTxYzDlcOWw5fFssWBxZrFqsOcxbvFvcOfxIXEr8SBxIfDpMOlxJnEk8SNw6nFusSXxKPEt8SrxLzFocWExYbDs8WNw7XDtsO3xbPFgsWbxavDvMW8xb7igJlcIlxuICB9LFxuICBcImNwMjg2MDNcIjogXCJpc284ODU5MTNcIixcbiAgXCJpc284ODU5MTRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoOG4guG4g8KjxIrEi+G4isKn4bqAwqnhuoLhuIvhu7LCrcKuxbjhuJ7huJ/EoMSh4bmA4bmBwrbhuZbhuoHhuZfhuoPhuaDhu7PhuoThuoXhuaHDgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8W0w5HDksOTw5TDlcOW4bmqw5jDmcOaw5vDnMOdxbbDn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvxbXDscOyw7PDtMO1w7bhuavDuMO5w7rDu8O8w73Ft8O/XCJcbiAgfSxcbiAgXCJjcDI4NjA0XCI6IFwiaXNvODg1OTE0XCIsXG4gIFwiaXNvODg1OTE1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPigqzCpcWgwqfFocKpwqrCq8Kswq3CrsKvwrDCscKywrPFvcK1wrbCt8W+wrnCusK7xZLFk8W4wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5fDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9w77Dv1wiXG4gIH0sXG4gIFwiY3AyODYwNVwiOiBcImlzbzg4NTkxNVwiLFxuICBcImlzbzg4NTkxNlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgxITEhcWB4oKs4oCexaDCp8WhwqnImMKrxbnCrcW6xbvCsMKxxIzFgsW94oCdwrbCt8W+xI3ImcK7xZLFk8W4xbzDgMOBw4LEgsOExIbDhsOHw4jDicOKw4vDjMONw47Dj8SQxYPDksOTw5TFkMOWxZrFsMOZw5rDm8OcxJjImsOfw6DDocOixIPDpMSHw6bDp8Oow6nDqsOrw6zDrcOuw6/EkcWEw7LDs8O0xZHDtsWbxbHDucO6w7vDvMSZyJvDv1wiXG4gIH0sXG4gIFwiY3AyODYwNlwiOiBcImlzbzg4NTkxNlwiLFxuICBcImNwNDM3XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOkw6DDpcOnw6rDq8Oow6/DrsOsw4TDhcOJw6bDhsO0w7bDssO7w7nDv8OWw5zCosKjwqXigqfGksOhw63Ds8O6w7HDkcKqwrrCv+KMkMKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTQzN1wiOiBcImNwNDM3XCIsXG4gIFwiY3NpYm00MzdcIjogXCJjcDQzN1wiLFxuICBcImNwNzM3XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLOkc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6hzqPOpM6lzqbOp86ozqnOsc6yzrPOtM61zrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4PPgs+Ez4XPhs+Hz4jilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDPic6szq3Ors+Kzq/PjM+Nz4vPjs6GzojOic6KzozOjs6PwrHiiaXiiaTOqs6rw7fiiYjCsOKImcK34oia4oG/wrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtNzM3XCI6IFwiY3A3MzdcIixcbiAgXCJjc2libTczN1wiOiBcImNwNzM3XCIsXG4gIFwiY3A3NzVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsSGw7zDqcSBw6TEo8OlxIfFgsSTxZbFl8SrxbnDhMOFw4nDpsOGxY3DtsSiwqLFmsWbw5bDnMO4wqPDmMOXwqTEgMSqw7PFu8W8xbrigJ3CpsKpwq7CrMK9wrzFgcKrwrvilpHilpLilpPilILilKTEhMSMxJjEluKVo+KVkeKVl+KVncSuxaDilJDilJTilLTilKzilJzilIDilLzFssWq4pWa4pWU4pWp4pWm4pWg4pWQ4pWsxb3EhcSNxJnEl8SvxaHFs8Wrxb7ilJjilIzilojiloTilozilpDiloDDk8OfxYzFg8O1w5XCtcWExLbEt8S7xLzFhsSSxYXigJnCrcKx4oCcwr7CtsKnw7figJ7CsOKImcK3wrnCs8Ky4pagwqBcIlxuICB9LFxuICBcImlibTc3NVwiOiBcImNwNzc1XCIsXG4gIFwiY3NpYm03NzVcIjogXCJjcDc3NVwiLFxuICBcImNwODUwXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOkw6DDpcOnw6rDq8Oow6/DrsOsw4TDhcOJw6bDhsO0w7bDssO7w7nDv8OWw5zDuMKjw5jDl8aSw6HDrcOzw7rDscORwqrCusK/wq7CrMK9wrzCocKrwrvilpHilpLilpPilILilKTDgcOCw4DCqeKVo+KVkeKVl+KVncKiwqXilJDilJTilLTilKzilJzilIDilLzDo8OD4pWa4pWU4pWp4pWm4pWg4pWQ4pWswqTDsMOQw4rDi8OIxLHDjcOOw4/ilJjilIzilojiloTCpsOM4paAw5PDn8OUw5LDtcOVwrXDvsOew5rDm8OZw73DncKvwrTCrcKx4oCXwr7CtsKnw7fCuMKwwqjCt8K5wrPCsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NTBcIjogXCJjcDg1MFwiLFxuICBcImNzaWJtODUwXCI6IFwiY3A4NTBcIixcbiAgXCJjcDg1MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDpMWvxIfDp8WCw6vFkMWRw67FucOExIbDicS5xLrDtMO2xL3EvsWaxZvDlsOcxaTFpcWBw5fEjcOhw63Ds8O6xITEhcW9xb7EmMSZwqzFusSMxZ/Cq8K74paR4paS4paT4pSC4pSkw4HDgsSaxZ7ilaPilZHilZfilZ3Fu8W84pSQ4pSU4pS04pSs4pSc4pSA4pS8xILEg+KVmuKVlOKVqeKVpuKVoOKVkOKVrMKkxJHEkMSOw4vEj8WHw43DjsSb4pSY4pSM4paI4paExaLFruKWgMOTw5/DlMWDxYTFiMWgxaHFlMOaxZXFsMO9w53Fo8K0wq3Lncuby4fLmMKnw7fCuMKwwqjLmcWxxZjFmeKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NTJcIjogXCJjcDg1MlwiLFxuICBcImNzaWJtODUyXCI6IFwiY3A4NTJcIixcbiAgXCJjcDg1NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0ZLQgtGT0IPRkdCB0ZTQhNGV0IXRltCG0ZfQh9GY0IjRmdCJ0ZrQitGb0IvRnNCM0Z7QjtGf0I/RjtCu0YrQqtCw0JDQsdCR0YbQptC00JTQtdCV0YTQpNCz0JPCq8K74paR4paS4paT4pSC4pSk0YXQpdC40JjilaPilZHilZfilZ3QudCZ4pSQ4pSU4pS04pSs4pSc4pSA4pS80LrQmuKVmuKVlOKVqeKVpuKVoOKVkOKVrMKk0LvQm9C80JzQvdCd0L7QntC/4pSY4pSM4paI4paE0J/Rj+KWgNCv0YDQoNGB0KHRgtCi0YPQo9C20JbQstCS0YzQrOKElsKt0YvQq9C30JfRiNCo0Y3QrdGJ0KnRh9CnwqfilqDCoFwiXG4gIH0sXG4gIFwiaWJtODU1XCI6IFwiY3A4NTVcIixcbiAgXCJjc2libTg1NVwiOiBcImNwODU1XCIsXG4gIFwiY3A4NTZcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIteQ15HXkteT15TXldeW15fXmNeZ15rXm9ec153Xntef16DXodei16PXpNel16bXp9eo16nXqu+/vcKj77+9w5fvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73CrsKswr3CvO+/vcKrwrvilpHilpLilpPilILilKTvv73vv73vv73CqeKVo+KVkeKVl+KVncKiwqXilJDilJTilLTilKzilJzilIDilLzvv73vv73ilZrilZTilanilabilaDilZDilazCpO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKUmOKUjOKWiOKWhMKm77+94paA77+977+977+977+977+977+9wrXvv73vv73vv73vv73vv73vv73vv73Cr8K0wq3CseKAl8K+wrbCp8O3wrjCsMKowrfCucKzwrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtODU2XCI6IFwiY3A4NTZcIixcbiAgXCJjc2libTg1NlwiOiBcImNwODU2XCIsXG4gIFwiY3A4NTdcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8OuxLHDhMOFw4nDpsOGw7TDtsOyw7vDucSww5bDnMO4wqPDmMWexZ/DocOtw7PDusOxw5HEnsSfwr/CrsKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpMOBw4LDgMKp4pWj4pWR4pWX4pWdwqLCpeKUkOKUlOKUtOKUrOKUnOKUgOKUvMOjw4PilZrilZTilanilabilaDilZDilazCpMK6wqrDisOLw4jvv73DjcOOw4/ilJjilIzilojiloTCpsOM4paAw5PDn8OUw5LDtcOVwrXvv73Dl8Oaw5vDmcOsw7/Cr8K0wq3Cse+/vcK+wrbCp8O3wrjCsMKowrfCucKzwrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtODU3XCI6IFwiY3A4NTdcIixcbiAgXCJjc2libTg1N1wiOiBcImNwODU3XCIsXG4gIFwiY3A4NThcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8Ouw6zDhMOFw4nDpsOGw7TDtsOyw7vDucO/w5bDnMO4wqPDmMOXxpLDocOtw7PDusOxw5HCqsK6wr/CrsKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpMOBw4LDgMKp4pWj4pWR4pWX4pWdwqLCpeKUkOKUlOKUtOKUrOKUnOKUgOKUvMOjw4PilZrilZTilanilabilaDilZDilazCpMOww5DDisOLw4jigqzDjcOOw4/ilJjilIzilojiloTCpsOM4paAw5PDn8OUw5LDtcOVwrXDvsOew5rDm8OZw73DncKvwrTCrcKx4oCXwr7CtsKnw7fCuMKwwqjCt8K5wrPCsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NThcIjogXCJjcDg1OFwiLFxuICBcImNzaWJtODU4XCI6IFwiY3A4NThcIixcbiAgXCJjcDg2MFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDo8Ogw4HDp8Oqw4rDqMONw5TDrMODw4LDicOAw4jDtMO1w7LDmsO5w4zDlcOcwqLCo8OZ4oKnw5PDocOtw7PDusOxw5HCqsK6wr/DksKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg2MFwiOiBcImNwODYwXCIsXG4gIFwiY3NpYm04NjBcIjogXCJjcDg2MFwiLFxuICBcImNwODYxXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOkw6DDpcOnw6rDq8Oow5DDsMOew4TDhcOJw6bDhsO0w7bDvsO7w53DvcOWw5zDuMKjw5jigqfGksOhw63Ds8O6w4HDjcOTw5rCv+KMkMKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg2MVwiOiBcImNwODYxXCIsXG4gIFwiY3NpYm04NjFcIjogXCJjcDg2MVwiLFxuICBcImNwODYyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLXkNeR15LXk9eU15XXlteX15jXmdea15vXnNed157Xn9eg16HXotej16TXpdem16fXqNep16rCosKjwqXigqfGksOhw63Ds8O6w7HDkcKqwrrCv+KMkMKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg2MlwiOiBcImNwODYyXCIsXG4gIFwiY3NpYm04NjJcIjogXCJjcDg2MlwiLFxuICBcImNwODYzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOCw6DCtsOnw6rDq8Oow6/DruKAl8OAwqfDicOIw4rDtMOLw4/Du8O5wqTDlMOcwqLCo8OZw5vGksKmwrTDs8O6wqjCuMKzwq/DjuKMkMKswr3CvMK+wqvCu+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg2M1wiOiBcImNwODYzXCIsXG4gIFwiY3NpYm04NjNcIjogXCJjcDg2M1wiLFxuICBcImNwODY0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXDBcXHgwMVxceDAyXFx4MDNcXHgwNFxceDA1XFx4MDZcXHgwN1xcYlxcdFxcblxceDBCXFxmXFxyXFx4MEVcXHgwRlxceDEwXFx4MTFcXHgxMlxceDEzXFx4MTRcXHgxNVxceDE2XFx4MTdcXHgxOFxceDE5XFx4MUFcXHgxQlxceDFDXFx4MURcXHgxRVxceDFGICFcXFwiIyRcXHUwNjZBJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cXHg3RlxceEIwXFx4QjdcXHUyMjE5XFx1MjIxQVxcdTI1OTJcXHUyNTAwXFx1MjUwMlxcdTI1M0NcXHUyNTI0XFx1MjUyQ1xcdTI1MUNcXHUyNTM0XFx1MjUxMFxcdTI1MENcXHUyNTE0XFx1MjUxOFxcdTAzQjJcXHUyMjFFXFx1MDNDNlxceEIxXFx4QkRcXHhCQ1xcdTIyNDhcXHhBQlxceEJCXFx1RkVGN1xcdUZFRjhcXHVGRkZEXFx1RkZGRFxcdUZFRkJcXHVGRUZDXFx1RkZGRFxceEEwXFx4QURcXHVGRTgyXFx4QTNcXHhBNFxcdUZFODRcXHVGRkZEXFx1RkZGRFxcdUZFOEVcXHVGRThGXFx1RkU5NVxcdUZFOTlcXHUwNjBDXFx1RkU5RFxcdUZFQTFcXHVGRUE1XFx1MDY2MFxcdTA2NjFcXHUwNjYyXFx1MDY2M1xcdTA2NjRcXHUwNjY1XFx1MDY2NlxcdTA2NjdcXHUwNjY4XFx1MDY2OVxcdUZFRDFcXHUwNjFCXFx1RkVCMVxcdUZFQjVcXHVGRUI5XFx1MDYxRlxceEEyXFx1RkU4MFxcdUZFODFcXHVGRTgzXFx1RkU4NVxcdUZFQ0FcXHVGRThCXFx1RkU4RFxcdUZFOTFcXHVGRTkzXFx1RkU5N1xcdUZFOUJcXHVGRTlGXFx1RkVBM1xcdUZFQTdcXHVGRUE5XFx1RkVBQlxcdUZFQURcXHVGRUFGXFx1RkVCM1xcdUZFQjdcXHVGRUJCXFx1RkVCRlxcdUZFQzFcXHVGRUM1XFx1RkVDQlxcdUZFQ0ZcXHhBNlxceEFDXFx4RjdcXHhEN1xcdUZFQzlcXHUwNjQwXFx1RkVEM1xcdUZFRDdcXHVGRURCXFx1RkVERlxcdUZFRTNcXHVGRUU3XFx1RkVFQlxcdUZFRURcXHVGRUVGXFx1RkVGM1xcdUZFQkRcXHVGRUNDXFx1RkVDRVxcdUZFQ0RcXHVGRUUxXFx1RkU3RFxcdTA2NTFcXHVGRUU1XFx1RkVFOVxcdUZFRUNcXHVGRUYwXFx1RkVGMlxcdUZFRDBcXHVGRUQ1XFx1RkVGNVxcdUZFRjZcXHVGRUREXFx1RkVEOVxcdUZFRjFcXHUyNUEwXFx1RkZGRFwiXG4gIH0sXG4gIFwiaWJtODY0XCI6IFwiY3A4NjRcIixcbiAgXCJjc2libTg2NFwiOiBcImNwODY0XCIsXG4gIFwiY3A4NjVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8Ouw6zDhMOFw4nDpsOGw7TDtsOyw7vDucO/w5bDnMO4wqPDmOKCp8aSw6HDrcOzw7rDscORwqrCusK/4oyQwqzCvcK8wqHCq8Kk4paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtODY1XCI6IFwiY3A4NjVcIixcbiAgXCJjc2libTg2NVwiOiBcImNwODY1XCIsXG4gIFwiY3A4NjZcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItCQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgNGA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP0IHRkdCE0ZTQh9GX0I7RnsKw4oiZwrfiiJrihJbCpOKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NjZcIjogXCJjcDg2NlwiLFxuICBcImNzaWJtODY2XCI6IFwiY3A4NjZcIixcbiAgXCJjcDg2OVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi77+977+977+977+977+977+9zobvv73Ct8KswqbigJjigJnOiOKAlc6JzorOqs6M77+977+9zo7Oq8Kpzo/CssKzzqzCo86tzq7Or8+KzpDPjM+NzpHOks6TzpTOlc6WzpfCvc6YzpnCq8K74paR4paS4paT4pSC4pSkzprOm86czp3ilaPilZHilZfilZ3Ons6f4pSQ4pSU4pS04pSs4pSc4pSA4pS8zqDOoeKVmuKVlOKVqeKVpuKVoOKVkOKVrM6jzqTOpc6mzqfOqM6pzrHOss6z4pSY4pSM4paI4paEzrTOteKWgM62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Dz4LPhM6Ewq3Csc+Fz4bPh8Knz4jOhcKwwqjPic+LzrDPjuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NjlcIjogXCJjcDg2OVwiLFxuICBcImNzaWJtODY5XCI6IFwiY3A4NjlcIixcbiAgXCJjcDkyMlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CruKAvsKwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/FoMORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMOdxb3Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvxaHDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcW+w79cIlxuICB9LFxuICBcImlibTkyMlwiOiBcImNwOTIyXCIsXG4gIFwiY3NpYm05MjJcIjogXCJjcDkyMlwiLFxuICBcImNwMTA0NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi77qIw5fDt++jtu+jte+jtO+jt++5scKI4pag4pSC4pSA4pSQ4pSM4pSU4pSY77m577m777m977m/77m377qK77uw77uz77uy77uO77uP77uQ77u277u477u677u8wqDvo7rvo7nvo7jCpO+ju++6i++6ke+6l++6m++6n++6o9iMwq3vuqfvurPZoNmh2aLZo9mk2aXZptmn2ajZqe+6t9ib77q777q/77uK2J/vu4vYodii2KPYpNil2KbYp9io2KnYqtir2KzYrdiu2K/YsNix2LLYs9i02LXYtti377uH2LnYuu+7jO+6gu+6hO+6ju+7k9mA2YHZgtmD2YTZhdmG2YfZiNmJ2YrZi9mM2Y3ZjtmP2ZDZkdmS77uX77ub77uf76O877u177u377u577u777uj77un77us77up77+9XCJcbiAgfSxcbiAgXCJpYm0xMDQ2XCI6IFwiY3AxMDQ2XCIsXG4gIFwiY3NpYm0xMDQ2XCI6IFwiY3AxMDQ2XCIsXG4gIFwiY3AxMTI0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDQgdCC0pDQhNCF0IbQh9CI0InQitCL0IzCrdCO0I/QkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj+KEltGR0ZLSkdGU0ZXRltGX0ZjRmdGa0ZvRnMKn0Z7Rn1wiXG4gIH0sXG4gIFwiaWJtMTEyNFwiOiBcImNwMTEyNFwiLFxuICBcImNzaWJtMTEyNFwiOiBcImNwMTEyNFwiLFxuICBcImNwMTEyNVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/4paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paA0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/QgdGR0pDSkdCE0ZTQhtGW0IfRl8K34oia4oSWwqTilqDCoFwiXG4gIH0sXG4gIFwiaWJtMTEyNVwiOiBcImNwMTEyNVwiLFxuICBcImNzaWJtMTEyNVwiOiBcImNwMTEyNVwiLFxuICBcImNwMTEyOVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgwqHCosKjwqTCpcKmwqfFk8KpwqrCq8Kswq3CrsKvwrDCscKywrPFuMK1wrbCt8WSwrnCusK7wrzCvcK+wr/DgMOBw4LEgsOEw4XDhsOHw4jDicOKw4vMgMONw47Dj8SQw5HMicOTw5TGoMOWw5fDmMOZw5rDm8Ocxq/Mg8Ofw6DDocOixIPDpMOlw6bDp8Oow6nDqsOrzIHDrcOuw6/EkcOxzKPDs8O0xqHDtsO3w7jDucO6w7vDvMaw4oKrw79cIlxuICB9LFxuICBcImlibTExMjlcIjogXCJjcDExMjlcIixcbiAgXCJjc2libTExMjlcIjogXCJjcDExMjlcIixcbiAgXCJjcDExMzNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoOC6geC6guC6hOC6h+C6iOC6quC6iuC6jeC6lOC6leC6luC6l+C6meC6muC6m+C6nOC6neC6nuC6n+C6oeC6ouC6o+C6peC6p+C6q+C6reC6ru+/ve+/ve+/veC6r+C6sOC6suC6s+C6tOC6teC6tuC6t+C6uOC6ueC6vOC6seC6u+C6ve+/ve+/ve+/veC7gOC7geC7guC7g+C7hOC7iOC7ieC7iuC7i+C7jOC7jeC7hu+/veC7nOC7neKCre+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veC7kOC7keC7kuC7k+C7lOC7leC7luC7l+C7mOC7me+/ve+/vcKiwqzCpu+/vVwiXG4gIH0sXG4gIFwiaWJtMTEzM1wiOiBcImNwMTEzM1wiLFxuICBcImNzaWJtMTEzM1wiOiBcImNwMTEzM1wiLFxuICBcImNwMTE2MVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+94LmI4LiB4LiC4LiD4LiE4LiF4LiG4LiH4LiI4LiJ4LiK4LiL4LiM4LiN4LiO4LiP4LiQ4LiR4LiS4LiT4LiU4LiV4LiW4LiX4LiY4LiZ4Lia4Lib4Lic4Lid4Lie4Lif4Lig4Lih4Lii4Lij4Lik4Lil4Lim4Lin4Lio4Lip4Liq4Lir4Lis4Lit4Liu4Liv4Liw4Lix4Liy4Liz4Li04Li14Li24Li34Li44Li54Li64LmJ4LmK4LmL4oKs4Li/4LmA4LmB4LmC4LmD4LmE4LmF4LmG4LmH4LmI4LmJ4LmK4LmL4LmM4LmN4LmO4LmP4LmQ4LmR4LmS4LmT4LmU4LmV4LmW4LmX4LmY4LmZ4Lma4LmbwqLCrMKmwqBcIlxuICB9LFxuICBcImlibTExNjFcIjogXCJjcDExNjFcIixcbiAgXCJjc2libTExNjFcIjogXCJjcDExNjFcIixcbiAgXCJjcDExNjJcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKCrMKBwoLCg8KE4oCmwobCh8KIwonCisKLwozCjcKOwo/CkOKAmOKAmeKAnOKAneKAouKAk+KAlMKYwpnCmsKbwpzCncKewp/CoOC4geC4guC4g+C4hOC4heC4huC4h+C4iOC4ieC4iuC4i+C4jOC4jeC4juC4j+C4kOC4keC4kuC4k+C4lOC4leC4luC4l+C4mOC4meC4muC4m+C4nOC4neC4nuC4n+C4oOC4oeC4ouC4o+C4pOC4peC4puC4p+C4qOC4qeC4quC4q+C4rOC4reC4ruC4r+C4sOC4seC4suC4s+C4tOC4teC4tuC4t+C4uOC4ueC4uu+/ve+/ve+/ve+/veC4v+C5gOC5geC5guC5g+C5hOC5heC5huC5h+C5iOC5ieC5iuC5i+C5jOC5jeC5juC5j+C5kOC5keC5kuC5k+C5lOC5leC5luC5l+C5mOC5meC5muC5m++/ve+/ve+/ve+/vVwiXG4gIH0sXG4gIFwiaWJtMTE2MlwiOiBcImNwMTE2MlwiLFxuICBcImNzaWJtMTE2MlwiOiBcImNwMTE2MlwiLFxuICBcImNwMTE2M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgwqHCosKj4oKswqXCpsKnxZPCqcKqwqvCrMKtwq7Cr8KwwrHCssKzxbjCtcK2wrfFksK5wrrCu8K8wr3CvsK/w4DDgcOCxILDhMOFw4bDh8OIw4nDisOLzIDDjcOOw4/EkMORzInDk8OUxqDDlsOXw5jDmcOaw5vDnMavzIPDn8Ogw6HDosSDw6TDpcOmw6fDqMOpw6rDq8yBw63DrsOvxJHDscyjw7PDtMahw7bDt8O4w7nDusO7w7zGsOKCq8O/XCJcbiAgfSxcbiAgXCJpYm0xMTYzXCI6IFwiY3AxMTYzXCIsXG4gIFwiY3NpYm0xMTYzXCI6IFwiY3AxMTYzXCIsXG4gIFwibWFjY3JvYXRpYW5cIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOEw4XDh8OJw5HDlsOcw6HDoMOiw6TDo8Olw6fDqcOow6rDq8Otw6zDrsOvw7HDs8Oyw7TDtsO1w7rDucO7w7zigKDCsMKiwqPCp+KAosK2w5/CrsWg4oSiwrTCqOKJoMW9w5jiiJ7CseKJpOKJpeKIhsK14oiC4oiR4oiPxaHiiKvCqsK64oSmxb7DuMK/wqHCrOKImsaS4omIxIbCq8SM4oCmwqDDgMODw5XFksWTxJDigJTigJzigJ3igJjigJnDt+KXiu+/vcKp4oGEwqTigLnigLrDhsK74oCTwrfigJrigJ7igLDDgsSHw4HEjcOIw43DjsOPw4zDk8OUxJHDksOaw5vDmcSxy4bLnMKvz4DDi8uawrjDisOmy4dcIlxuICB9LFxuICBcIm1hY2N5cmlsbGljXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLQkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv4oCgwrDCosKjwqfigKLCttCGwq7CqeKEotCC0ZLiiaDQg9GT4oiewrHiiaTiiaXRlsK14oiC0IjQhNGU0IfRl9CJ0ZnQitGa0ZjQhcKs4oiaxpLiiYjiiIbCq8K74oCmwqDQi9Gb0IzRnNGV4oCT4oCU4oCc4oCd4oCY4oCZw7figJ7QjtGe0I/Rn+KEltCB0ZHRj9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGOwqRcIlxuICB9LFxuICBcIm1hY2dyZWVrXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDhMK5wrLDicKzw5bDnM6Fw6DDosOkzoTCqMOnw6nDqMOqw6vCo+KEosOuw6/igKLCveKAsMO0w7bCpsKtw7nDu8O84oCgzpPOlM6YzpvOns6gw5/CrsKpzqPOqsKn4omgwrDOh86RwrHiiaTiiaXCpc6SzpXOls6XzpnOms6czqbOq86ozqnOrM6dwqzOn86h4omIzqTCq8K74oCmwqDOpc6nzobOiMWT4oCT4oCV4oCc4oCd4oCY4oCZw7fOic6KzozOjs6tzq7Or8+Mzo/Pjc6xzrLPiM60zrXPhs6zzrfOuc6+zrrOu868zr3Ov8+Az47Pgc+Dz4TOuM+Jz4LPh8+FzrbPis+LzpDOsO+/vVwiXG4gIH0sXG4gIFwibWFjaWNlbGFuZFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvMOdwrDCosKjwqfigKLCtsOfwq7CqeKEosK0wqjiiaDDhsOY4oiewrHiiaTiiaXCpcK14oiC4oiR4oiPz4DiiKvCqsK64oSmw6bDuMK/wqHCrOKImsaS4omI4oiGwqvCu+KApsKgw4DDg8OVxZLFk+KAk+KAlOKAnOKAneKAmOKAmcO34peKw7/FuOKBhMKkw5DDsMOew77DvcK34oCa4oCe4oCww4LDisOBw4vDiMONw47Dj8OMw5PDlO+/vcOSw5rDm8OZxLHLhsucwq/LmMuZy5rCuMudy5vLh1wiXG4gIH0sXG4gIFwibWFjcm9tYW5cIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOEw4XDh8OJw5HDlsOcw6HDoMOiw6TDo8Olw6fDqcOow6rDq8Otw6zDrsOvw7HDs8Oyw7TDtsO1w7rDucO7w7zigKDCsMKiwqPCp+KAosK2w5/CrsKp4oSiwrTCqOKJoMOGw5jiiJ7CseKJpOKJpcKlwrXiiILiiJHiiI/PgOKIq8KqwrrihKbDpsO4wr/CocKs4oiaxpLiiYjiiIbCq8K74oCmwqDDgMODw5XFksWT4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rDv8W44oGEwqTigLnigLrvrIHvrILigKHCt+KAmuKAnuKAsMOCw4rDgcOLw4jDjcOOw4/DjMOTw5Tvv73DksOaw5vDmcSxy4bLnMKvy5jLmcuawrjLncuby4dcIlxuICB9LFxuICBcIm1hY3JvbWFuaWFcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOEw4XDh8OJw5HDlsOcw6HDoMOiw6TDo8Olw6fDqcOow6rDq8Otw6zDrsOvw7HDs8Oyw7TDtsO1w7rDucO7w7zigKDCsMKiwqPCp+KAosK2w5/CrsKp4oSiwrTCqOKJoMSCxZ7iiJ7CseKJpOKJpcKlwrXiiILiiJHiiI/PgOKIq8KqwrrihKbEg8Wfwr/CocKs4oiaxpLiiYjiiIbCq8K74oCmwqDDgMODw5XFksWT4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rDv8W44oGEwqTigLnigLrFosWj4oChwrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU77+9w5LDmsObw5nEscuGy5zCr8uYy5nLmsK4y53Lm8uHXCJcbiAgfSxcbiAgXCJtYWN0aGFpXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCq8K74oCm76KM76KP76KS76KV76KY76KL76KO76KR76KU76KX4oCc4oCd76KZ77+94oCi76KE76KJ76KF76KG76KH76KI76KK76KN76KQ76KT76KW4oCY4oCZ77+9wqDguIHguILguIPguITguIXguIbguIfguIjguInguIrguIvguIzguI3guI7guI/guJDguJHguJLguJPguJTguJXguJbguJfguJjguJnguJrguJvguJzguJ3guJ7guJ/guKDguKHguKLguKPguKTguKXguKbguKfguKjguKnguKrguKvguKzguK3guK7guK/guLDguLHguLLguLPguLTguLXguLbguLfguLjguLnguLrvu7/igIvigJPigJTguL/guYDguYHguYLguYPguYTguYXguYbguYfguYjguYnguYrguYvguYzguY3ihKLguY/guZDguZHguZLguZPguZTguZXguZbguZfguZjguZnCrsKp77+977+977+977+9XCJcbiAgfSxcbiAgXCJtYWN0dXJraXNoXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDhMOFw4fDicORw5bDnMOhw6DDosOkw6PDpcOnw6nDqMOqw6vDrcOsw67Dr8Oxw7PDssO0w7bDtcO6w7nDu8O84oCgwrDCosKjwqfigKLCtsOfwq7CqeKEosK0wqjiiaDDhsOY4oiewrHiiaTiiaXCpcK14oiC4oiR4oiPz4DiiKvCqsK64oSmw6bDuMK/wqHCrOKImsaS4omI4oiGwqvCu+KApsKgw4DDg8OVxZLFk+KAk+KAlOKAnOKAneKAmOKAmcO34peKw7/FuMSexJ/EsMSxxZ7Fn+KAocK34oCa4oCe4oCww4LDisOBw4vDiMONw47Dj8OMw5PDlO+/vcOSw5rDm8OZ77+9y4bLnMKvy5jLmcuawrjLncuby4dcIlxuICB9LFxuICBcIm1hY3VrcmFpbmVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItCQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/igKDCsNKQwqPCp+KAosK20IbCrsKp4oSi0ILRkuKJoNCD0ZPiiJ7CseKJpOKJpdGWwrXSkdCI0ITRlNCH0ZfQidGZ0IrRmtGY0IXCrOKImsaS4omI4oiGwqvCu+KApsKg0IvRm9CM0ZzRleKAk+KAlOKAnOKAneKAmOKAmcO34oCe0I7RntCP0Z/ihJbQgdGR0Y/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjsKkXCJcbiAgfSxcbiAgXCJrb2k4clwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4pSA4pSC4pSM4pSQ4pSU4pSY4pSc4pSk4pSs4pS04pS84paA4paE4paI4paM4paQ4paR4paS4paT4oyg4pag4oiZ4oia4omI4omk4omlwqDijKHCsMKywrfDt+KVkOKVkeKVktGR4pWT4pWU4pWV4pWW4pWX4pWY4pWZ4pWa4pWb4pWc4pWd4pWe4pWf4pWg4pWh0IHilaLilaPilaTilaXilabilafilajilanilarilavilazCqdGO0LDQsdGG0LTQtdGE0LPRhdC40LnQutC70LzQvdC+0L/Rj9GA0YHRgtGD0LbQstGM0YvQt9GI0Y3RidGH0YrQrtCQ0JHQptCU0JXQpNCT0KXQmNCZ0JrQm9Cc0J3QntCf0K/QoNCh0KLQo9CW0JLQrNCr0JfQqNCt0KnQp9CqXCJcbiAgfSxcbiAgXCJrb2k4dVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4pSA4pSC4pSM4pSQ4pSU4pSY4pSc4pSk4pSs4pS04pS84paA4paE4paI4paM4paQ4paR4paS4paT4oyg4pag4oiZ4oia4omI4omk4omlwqDijKHCsMKywrfDt+KVkOKVkeKVktGR0ZTilZTRltGX4pWX4pWY4pWZ4pWa4pWb0pHilZ3ilZ7ilZ/ilaDilaHQgdCE4pWj0IbQh+KVpuKVp+KVqOKVqeKVqtKQ4pWswqnRjtCw0LHRhtC00LXRhNCz0YXQuNC50LrQu9C80L3QvtC/0Y/RgNGB0YLRg9C20LLRjNGL0LfRiNGN0YnRh9GK0K7QkNCR0KbQlNCV0KTQk9Cl0JjQmdCa0JvQnNCd0J7Qn9Cv0KDQodCi0KPQltCS0KzQq9CX0KjQrdCp0KfQqlwiXG4gIH0sXG4gIFwia29pOHJ1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLilIDilILilIzilJDilJTilJjilJzilKTilKzilLTilLziloDiloTilojilozilpDilpHilpLilpPijKDilqDiiJniiJriiYjiiaTiiaXCoOKMocKwwrLCt8O34pWQ4pWR4pWS0ZHRlOKVlNGW0ZfilZfilZjilZnilZrilZvSkdGe4pWe4pWf4pWg4pWh0IHQhOKVo9CG0IfilabilafilajilanilarSkNCOwqnRjtCw0LHRhtC00LXRhNCz0YXQuNC50LrQu9C80L3QvtC/0Y/RgNGB0YLRg9C20LLRjNGL0LfRiNGN0YnRh9GK0K7QkNCR0KbQlNCV0KTQk9Cl0JjQmdCa0JvQnNCd0J7Qn9Cv0KDQodCi0KPQltCS0KzQq9CX0KjQrdCp0KfQqlwiXG4gIH0sXG4gIFwia29pOHRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItKb0pPigJrSkuKAnuKApuKAoOKAoe+/veKAsNKz4oC50rLSt9K277+90prigJjigJnigJzigJ3igKLigJPigJTvv73ihKLvv73igLrvv73vv73vv73vv73vv73Tr9Ou0ZHCpNOjwqbCp++/ve+/ve+/vcKrwqzCrcKu77+9wrDCscKy0IHvv73TosK2wrfvv73ihJbvv73Cu++/ve+/ve+/vcKp0Y7QsNCx0YbQtNC10YTQs9GF0LjQudC60LvQvNC90L7Qv9GP0YDRgdGC0YPQttCy0YzRi9C30YjRjdGJ0YfRitCu0JDQkdCm0JTQldCk0JPQpdCY0JnQmtCb0JzQndCe0J/Qr9Cg0KHQotCj0JbQktCs0KvQl9Co0K3QqdCn0KpcIlxuICB9LFxuICBcImFybXNjaWk4XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDvv73Wh9aJKSjCu8Kr4oCULtWdLC3WiuKAptWc1ZvVntSx1aHUstWi1LPVo9S01aTUtdWl1LbVptS31afUuNWo1LnVqdS61arUu9Wr1LzVrNS91a3UvtWu1L/Vr9WA1bDVgdWx1YLVstWD1bPVhNW01YXVtdWG1bbVh9W31YjVuNWJ1bnVitW61YvVu9WM1bzVjdW91Y7VvtWP1b/VkNaA1ZHWgdWS1oLVk9aD1ZTWhNWV1oXVltaG1Zrvv71cIlxuICB9LFxuICBcInJrMTA0OFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0ILQg+KAmtGT4oCe4oCm4oCg4oCh4oKs4oCw0InigLnQitKa0rrQj9GS4oCY4oCZ4oCc4oCd4oCi4oCT4oCU77+94oSi0ZnigLrRmtKb0rvRn8Kg0rDSsdOYwqTTqMKmwqfQgcKp0pLCq8Kswq3CrtKuwrDCsdCG0ZbTqcK1wrbCt9GR4oSW0pPCu9OZ0qLSo9Kv0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y9cIlxuICB9LFxuICBcInRjdm5cIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlxcMFxceERBXFx1MUVFNFxceDAzXFx1MUVFQVxcdTFFRUNcXHUxRUVFXFx4MDdcXGJcXHRcXG5cXHgwQlxcZlxcclxceDBFXFx4MEZcXHgxMFxcdTFFRThcXHUxRUYwXFx1MUVGMlxcdTFFRjZcXHUxRUY4XFx4RERcXHUxRUY0XFx4MThcXHgxOVxceDFBXFx4MUJcXHgxQ1xceDFEXFx4MUVcXHgxRiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+XFx4N0ZcXHhDMFxcdTFFQTJcXHhDM1xceEMxXFx1MUVBMFxcdTFFQjZcXHUxRUFDXFx4QzhcXHUxRUJBXFx1MUVCQ1xceEM5XFx1MUVCOFxcdTFFQzZcXHhDQ1xcdTFFQzhcXHUwMTI4XFx4Q0RcXHUxRUNBXFx4RDJcXHUxRUNFXFx4RDVcXHhEM1xcdTFFQ0NcXHUxRUQ4XFx1MUVEQ1xcdTFFREVcXHUxRUUwXFx1MUVEQVxcdTFFRTJcXHhEOVxcdTFFRTZcXHUwMTY4XFx4QTBcXHUwMTAyXFx4QzJcXHhDQVxceEQ0XFx1MDFBMFxcdTAxQUZcXHUwMTEwXFx1MDEwM1xceEUyXFx4RUFcXHhGNFxcdTAxQTFcXHUwMUIwXFx1MDExMVxcdTFFQjBcXHUwMzAwXFx1MDMwOVxcdTAzMDNcXHUwMzAxXFx1MDMyM1xceEUwXFx1MUVBM1xceEUzXFx4RTFcXHUxRUExXFx1MUVCMlxcdTFFQjFcXHUxRUIzXFx1MUVCNVxcdTFFQUZcXHUxRUI0XFx1MUVBRVxcdTFFQTZcXHUxRUE4XFx1MUVBQVxcdTFFQTRcXHUxRUMwXFx1MUVCN1xcdTFFQTdcXHUxRUE5XFx1MUVBQlxcdTFFQTVcXHUxRUFEXFx4RThcXHUxRUMyXFx1MUVCQlxcdTFFQkRcXHhFOVxcdTFFQjlcXHUxRUMxXFx1MUVDM1xcdTFFQzVcXHUxRUJGXFx1MUVDN1xceEVDXFx1MUVDOVxcdTFFQzRcXHUxRUJFXFx1MUVEMlxcdTAxMjlcXHhFRFxcdTFFQ0JcXHhGMlxcdTFFRDRcXHUxRUNGXFx4RjVcXHhGM1xcdTFFQ0RcXHUxRUQzXFx1MUVENVxcdTFFRDdcXHUxRUQxXFx1MUVEOVxcdTFFRERcXHUxRURGXFx1MUVFMVxcdTFFREJcXHUxRUUzXFx4RjlcXHUxRUQ2XFx1MUVFN1xcdTAxNjlcXHhGQVxcdTFFRTVcXHUxRUVCXFx1MUVFRFxcdTFFRUZcXHUxRUU5XFx1MUVGMVxcdTFFRjNcXHUxRUY3XFx1MUVGOVxceEZEXFx1MUVGNVxcdTFFRDBcIlxuICB9LFxuICBcImdlb3JnaWFuYWNhZGVteVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgeKAmsaS4oCe4oCm4oCg4oChy4bigLDFoOKAucWSwo3CjsKPwpDigJjigJnigJzigJ3igKLigJPigJTLnOKEosWh4oC6xZPCncKexbjCoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/4YOQ4YOR4YOS4YOT4YOU4YOV4YOW4YOX4YOY4YOZ4YOa4YOb4YOc4YOd4YOe4YOf4YOg4YOh4YOi4YOj4YOk4YOl4YOm4YOn4YOo4YOp4YOq4YOr4YOs4YOt4YOu4YOv4YOw4YOx4YOy4YOz4YO04YO14YO2w6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcO+w79cIlxuICB9LFxuICBcImdlb3JnaWFucHNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHigJrGkuKAnuKApuKAoOKAocuG4oCwxaDigLnFksKNwo7Cj8KQ4oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLFoeKAusWTwp3CnsW4wqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv+GDkOGDkeGDkuGDk+GDlOGDleGDluGDseGDl+GDmOGDmeGDmuGDm+GDnOGDsuGDneGDnuGDn+GDoOGDoeGDouGDs+GDo+GDpOGDpeGDpuGDp+GDqOGDqeGDquGDq+GDrOGDreGDruGDtOGDr+GDsOGDtcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcO+w79cIlxuICB9LFxuICBcInB0MTU0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLSltKS067Sk+KAnuKAptK20q7SstKv0qDTotKi0prSutK40pfigJjigJnigJzigJ3igKLigJPigJTSs9K30qHTo9Kj0pvSu9K5wqDQjtGe0IjTqNKY0rDCp9CBwqnTmMKrwqzTr8Ku0pzCsNKx0IbRltKZ06nCtsK30ZHihJbTmcK70ZjSqtKr0p3QkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj1wiXG4gIH0sXG4gIFwidmlzY2lpXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXDBcXHgwMVxcdTFFQjJcXHgwM1xceDA0XFx1MUVCNFxcdTFFQUFcXHgwN1xcYlxcdFxcblxceDBCXFxmXFxyXFx4MEVcXHgwRlxceDEwXFx4MTFcXHgxMlxceDEzXFx1MUVGNlxceDE1XFx4MTZcXHgxN1xceDE4XFx1MUVGOFxceDFBXFx4MUJcXHgxQ1xceDFEXFx1MUVGNFxceDFGICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cXHg3RlxcdTFFQTBcXHUxRUFFXFx1MUVCMFxcdTFFQjZcXHUxRUE0XFx1MUVBNlxcdTFFQThcXHUxRUFDXFx1MUVCQ1xcdTFFQjhcXHUxRUJFXFx1MUVDMFxcdTFFQzJcXHUxRUM0XFx1MUVDNlxcdTFFRDBcXHUxRUQyXFx1MUVENFxcdTFFRDZcXHUxRUQ4XFx1MUVFMlxcdTFFREFcXHUxRURDXFx1MUVERVxcdTFFQ0FcXHUxRUNFXFx1MUVDQ1xcdTFFQzhcXHUxRUU2XFx1MDE2OFxcdTFFRTRcXHUxRUYyXFx4RDVcXHUxRUFGXFx1MUVCMVxcdTFFQjdcXHUxRUE1XFx1MUVBN1xcdTFFQTlcXHUxRUFEXFx1MUVCRFxcdTFFQjlcXHUxRUJGXFx1MUVDMVxcdTFFQzNcXHUxRUM1XFx1MUVDN1xcdTFFRDFcXHUxRUQzXFx1MUVENVxcdTFFRDdcXHUxRUUwXFx1MDFBMFxcdTFFRDlcXHUxRUREXFx1MUVERlxcdTFFQ0JcXHUxRUYwXFx1MUVFOFxcdTFFRUFcXHUxRUVDXFx1MDFBMVxcdTFFREJcXHUwMUFGXFx4QzBcXHhDMVxceEMyXFx4QzNcXHUxRUEyXFx1MDEwMlxcdTFFQjNcXHUxRUI1XFx4QzhcXHhDOVxceENBXFx1MUVCQVxceENDXFx4Q0RcXHUwMTI4XFx1MUVGM1xcdTAxMTBcXHUxRUU5XFx4RDJcXHhEM1xceEQ0XFx1MUVBMVxcdTFFRjdcXHUxRUVCXFx1MUVFRFxceEQ5XFx4REFcXHUxRUY5XFx1MUVGNVxceEREXFx1MUVFMVxcdTAxQjBcXHhFMFxceEUxXFx4RTJcXHhFM1xcdTFFQTNcXHUwMTAzXFx1MUVFRlxcdTFFQUJcXHhFOFxceEU5XFx4RUFcXHUxRUJCXFx4RUNcXHhFRFxcdTAxMjlcXHUxRUM5XFx1MDExMVxcdTFFRjFcXHhGMlxceEYzXFx4RjRcXHhGNVxcdTFFQ0ZcXHUxRUNEXFx1MUVFNVxceEY5XFx4RkFcXHUwMTY5XFx1MUVFN1xceEZEXFx1MUVFM1xcdTFFRUVcIlxuICB9LFxuICBcImlzbzY0NmNuXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXDBcXHgwMVxceDAyXFx4MDNcXHgwNFxceDA1XFx4MDZcXHgwN1xcYlxcdFxcblxceDBCXFxmXFxyXFx4MEVcXHgwRlxceDEwXFx4MTFcXHgxMlxceDEzXFx4MTRcXHgxNVxceDE2XFx4MTdcXHgxOFxceDE5XFx4MUFcXHgxQlxceDFDXFx4MURcXHgxRVxceDFGICFcXFwiI1xceEE1JSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1cXHUyMDNFXFx4N0ZcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFwiXG4gIH0sXG4gIFwiaXNvNjQ2anBcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlxcMFxceDAxXFx4MDJcXHgwM1xceDA0XFx4MDVcXHgwNlxceDA3XFxiXFx0XFxuXFx4MEJcXGZcXHJcXHgwRVxceDBGXFx4MTBcXHgxMVxceDEyXFx4MTNcXHgxNFxceDE1XFx4MTZcXHgxN1xceDE4XFx4MTlcXHgxQVxceDFCXFx4MUNcXHgxRFxceDFFXFx4MUYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXHhBNV1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fVxcdTIwM0VcXHg3RlxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXCJcbiAgfSxcbiAgXCJocHJvbWFuOFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kgw4DDgsOIw4rDi8OOw4/CtMuLy4bCqMucw5nDm+KCpMKvw53DvcKww4fDp8ORw7HCocK/wqTCo8KlwqfGksKiw6LDqsO0w7vDocOpw7PDusOgw6jDssO5w6TDq8O2w7zDhcOuw5jDhsOlw63DuMOmw4TDrMOWw5zDicOvw5/DlMOBw4PDo8OQw7DDjcOMw5PDksOVw7XFoMWhw5rFuMO/w57DvsK3wrXCtsK+4oCUwrzCvcKqwrrCq+KWoMK7wrHvv71cIlxuICB9LFxuICBcIm1hY2ludG9zaFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvOKAoMKwwqLCo8Kn4oCiwrbDn8KuwqnihKLCtMKo4omgw4bDmOKInsKx4omk4omlwqXCteKIguKIkeKIj8+A4oirwqrCuuKEpsOmw7jCv8KhwqziiJrGkuKJiOKIhsKrwrvigKbCoMOAw4PDlcWSxZPigJPigJTigJzigJ3igJjigJnDt+KXisO/xbjigYTCpOKAueKAuu+sge+sguKAocK34oCa4oCe4oCww4LDisOBw4vDiMONw47Dj8OMw5PDlO+/vcOSw5rDm8OZxLHLhsucwq/LmMuZy5rCuMudy5vLh1wiXG4gIH0sXG4gIFwiYXNjaWlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vVwiXG4gIH0sXG4gIFwidGlzNjIwXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73guIHguILguIPguITguIXguIbguIfguIjguInguIrguIvguIzguI3guI7guI/guJDguJHguJLguJPguJTguJXguJbguJfguJjguJnguJrguJvguJzguJ3guJ7guJ/guKDguKHguKLguKPguKTguKXguKbguKfguKjguKnguKrguKvguKzguK3guK7guK/guLDguLHguLLguLPguLTguLXguLbguLfguLjguLnguLrvv73vv73vv73vv73guL/guYDguYHguYLguYPguYTguYXguYbguYfguYjguYnguYrguYvguYzguY3guY7guY/guZDguZHguZLguZPguZTguZXguZbguZfguZjguZnguZrguZvvv73vv73vv73vv71cIlxuICB9XG59O1xuXG52YXIgQnVmZmVyJDUgPSBzYWZlcl8xLkJ1ZmZlcjsgLy8gTXVsdGlieXRlIGNvZGVjLiBJbiB0aGlzIHNjaGVtZSwgYSBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgMSBvciBtb3JlIGJ5dGVzLlxuLy8gT3VyIGNvZGVjIHN1cHBvcnRzIFVURi0xNiBzdXJyb2dhdGVzLCBleHRlbnNpb25zIGZvciBHQjE4MDMwIGFuZCB1bmljb2RlIHNlcXVlbmNlcy5cbi8vIFRvIHNhdmUgbWVtb3J5IGFuZCBsb2FkaW5nIHRpbWUsIHdlIHJlYWQgdGFibGUgZmlsZXMgb25seSB3aGVuIHJlcXVlc3RlZC5cblxudmFyIF9kYmNzID0gREJDU0NvZGVjO1xudmFyIFVOQVNTSUdORUQgPSAtMSxcbiAgICBHQjE4MDMwX0NPREUgPSAtMixcbiAgICBTRVFfU1RBUlQgPSAtMTAsXG4gICAgTk9ERV9TVEFSVCA9IC0xMDAwLFxuICAgIFVOQVNTSUdORURfTk9ERSA9IG5ldyBBcnJheSgweDEwMCksXG4gICAgREVGX0NIQVIgPSAtMTtcblxuZm9yICh2YXIgaSQyID0gMDsgaSQyIDwgMHgxMDA7IGkkMisrKSB7XG4gIFVOQVNTSUdORURfTk9ERVtpJDJdID0gVU5BU1NJR05FRDtcbn0gLy8gQ2xhc3MgREJDU0NvZGVjIHJlYWRzIGFuZCBpbml0aWFsaXplcyBtYXBwaW5nIHRhYmxlcy5cblxuXG5mdW5jdGlvbiBEQkNTQ29kZWMoY29kZWNPcHRpb25zLCBpY29udikge1xuICB0aGlzLmVuY29kaW5nTmFtZSA9IGNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWU7XG4gIGlmICghY29kZWNPcHRpb25zKSB0aHJvdyBuZXcgRXJyb3IoXCJEQkNTIGNvZGVjIGlzIGNhbGxlZCB3aXRob3V0IHRoZSBkYXRhLlwiKTtcbiAgaWYgKCFjb2RlY09wdGlvbnMudGFibGUpIHRocm93IG5ldyBFcnJvcihcIkVuY29kaW5nICdcIiArIHRoaXMuZW5jb2RpbmdOYW1lICsgXCInIGhhcyBubyBkYXRhLlwiKTsgLy8gTG9hZCB0YWJsZXMuXG5cbiAgdmFyIG1hcHBpbmdUYWJsZSA9IGNvZGVjT3B0aW9ucy50YWJsZSgpOyAvLyBEZWNvZGUgdGFibGVzOiBNQkNTIC0+IFVuaWNvZGUuXG4gIC8vIGRlY29kZVRhYmxlcyBpcyBhIHRyaWUsIGVuY29kZWQgYXMgYW4gYXJyYXkgb2YgYXJyYXlzIG9mIGludGVnZXJzLiBJbnRlcm5hbCBhcnJheXMgYXJlIHRyaWUgbm9kZXMgYW5kIGFsbCBoYXZlIGxlbiA9IDI1Ni5cbiAgLy8gVHJpZSByb290IGlzIGRlY29kZVRhYmxlc1swXS5cbiAgLy8gVmFsdWVzOiA+PSAgMCAtPiB1bmljb2RlIGNoYXJhY3RlciBjb2RlLiBjYW4gYmUgPiAweEZGRkZcbiAgLy8gICAgICAgICA9PSBVTkFTU0lHTkVEIC0+IHVua25vd24vdW5hc3NpZ25lZCBzZXF1ZW5jZS5cbiAgLy8gICAgICAgICA9PSBHQjE4MDMwX0NPREUgLT4gdGhpcyBpcyB0aGUgZW5kIG9mIGEgR0IxODAzMCA0LWJ5dGUgc2VxdWVuY2UuXG4gIC8vICAgICAgICAgPD0gTk9ERV9TVEFSVCAtPiBpbmRleCBvZiB0aGUgbmV4dCBub2RlIGluIG91ciB0cmllIHRvIHByb2Nlc3MgbmV4dCBieXRlLlxuICAvLyAgICAgICAgIDw9IFNFUV9TVEFSVCAgLT4gaW5kZXggb2YgdGhlIHN0YXJ0IG9mIGEgY2hhcmFjdGVyIGNvZGUgc2VxdWVuY2UsIGluIGRlY29kZVRhYmxlU2VxLlxuXG4gIHRoaXMuZGVjb2RlVGFibGVzID0gW107XG4gIHRoaXMuZGVjb2RlVGFibGVzWzBdID0gVU5BU1NJR05FRF9OT0RFLnNsaWNlKDApOyAvLyBDcmVhdGUgcm9vdCBub2RlLlxuICAvLyBTb21ldGltZXMgYSBNQkNTIGNoYXIgY29ycmVzcG9uZHMgdG8gYSBzZXF1ZW5jZSBvZiB1bmljb2RlIGNoYXJzLiBXZSBzdG9yZSB0aGVtIGFzIGFycmF5cyBvZiBpbnRlZ2VycyBoZXJlLiBcblxuICB0aGlzLmRlY29kZVRhYmxlU2VxID0gW107IC8vIEFjdHVhbCBtYXBwaW5nIHRhYmxlcyBjb25zaXN0IG9mIGNodW5rcy4gVXNlIHRoZW0gdG8gZmlsbCB1cCBkZWNvZGUgdGFibGVzLlxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwcGluZ1RhYmxlLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5fYWRkRGVjb2RlQ2h1bmsobWFwcGluZ1RhYmxlW2ldKTtcbiAgfVxuXG4gIHRoaXMuZGVmYXVsdENoYXJVbmljb2RlID0gaWNvbnYuZGVmYXVsdENoYXJVbmljb2RlOyAvLyBFbmNvZGUgdGFibGVzOiBVbmljb2RlIC0+IERCQ1MuXG4gIC8vIGBlbmNvZGVUYWJsZWAgaXMgYXJyYXkgbWFwcGluZyBmcm9tIHVuaWNvZGUgY2hhciB0byBlbmNvZGVkIGNoYXIuIEFsbCBpdHMgdmFsdWVzIGFyZSBpbnRlZ2VycyBmb3IgcGVyZm9ybWFuY2UuXG4gIC8vIEJlY2F1c2UgaXQgY2FuIGJlIHNwYXJzZSwgaXQgaXMgcmVwcmVzZW50ZWQgYXMgYXJyYXkgb2YgYnVja2V0cyBieSAyNTYgY2hhcnMgZWFjaC4gQnVja2V0IGNhbiBiZSBudWxsLlxuICAvLyBWYWx1ZXM6ID49ICAwIC0+IGl0IGlzIGEgbm9ybWFsIGNoYXIuIFdyaXRlIHRoZSB2YWx1ZSAoaWYgPD0yNTYgdGhlbiAxIGJ5dGUsIGlmIDw9NjU1MzYgdGhlbiAyIGJ5dGVzLCBldGMuKS5cbiAgLy8gICAgICAgICA9PSBVTkFTU0lHTkVEIC0+IG5vIGNvbnZlcnNpb24gZm91bmQuIE91dHB1dCBhIGRlZmF1bHQgY2hhci5cbiAgLy8gICAgICAgICA8PSBTRVFfU1RBUlQgIC0+IGl0J3MgYW4gaW5kZXggaW4gZW5jb2RlVGFibGVTZXEsIHNlZSBiZWxvdy4gVGhlIGNoYXJhY3RlciBzdGFydHMgYSBzZXF1ZW5jZS5cblxuICB0aGlzLmVuY29kZVRhYmxlID0gW107IC8vIGBlbmNvZGVUYWJsZVNlcWAgaXMgdXNlZCB3aGVuIGEgc2VxdWVuY2Ugb2YgdW5pY29kZSBjaGFyYWN0ZXJzIGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgY29kZS4gV2UgdXNlIGEgdHJlZSBvZlxuICAvLyBvYmplY3RzIHdoZXJlIGtleXMgY29ycmVzcG9uZCB0byBjaGFyYWN0ZXJzIGluIHNlcXVlbmNlIGFuZCBsZWFmcyBhcmUgdGhlIGVuY29kZWQgZGJjcyB2YWx1ZXMuIEEgc3BlY2lhbCBERUZfQ0hBUiBrZXlcbiAgLy8gbWVhbnMgZW5kIG9mIHNlcXVlbmNlIChuZWVkZWQgd2hlbiBvbmUgc2VxdWVuY2UgaXMgYSBzdHJpY3Qgc3Vic2VxdWVuY2Ugb2YgYW5vdGhlcikuXG4gIC8vIE9iamVjdHMgYXJlIGtlcHQgc2VwYXJhdGVseSBmcm9tIGVuY29kZVRhYmxlIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlLlxuXG4gIHRoaXMuZW5jb2RlVGFibGVTZXEgPSBbXTsgLy8gU29tZSBjaGFycyBjYW4gYmUgZGVjb2RlZCwgYnV0IG5lZWQgbm90IGJlIGVuY29kZWQuXG5cbiAgdmFyIHNraXBFbmNvZGVDaGFycyA9IHt9O1xuICBpZiAoY29kZWNPcHRpb25zLmVuY29kZVNraXBWYWxzKSBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVjT3B0aW9ucy5lbmNvZGVTa2lwVmFscy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB2YWwgPSBjb2RlY09wdGlvbnMuZW5jb2RlU2tpcFZhbHNbaV07XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSBza2lwRW5jb2RlQ2hhcnNbdmFsXSA9IHRydWU7ZWxzZSBmb3IgKHZhciBqID0gdmFsLmZyb207IGogPD0gdmFsLnRvOyBqKyspIHtcbiAgICAgIHNraXBFbmNvZGVDaGFyc1tqXSA9IHRydWU7XG4gICAgfVxuICB9IC8vIFVzZSBkZWNvZGUgdHJpZSB0byByZWN1cnNpdmVseSBmaWxsIG91dCBlbmNvZGUgdGFibGVzLlxuXG4gIHRoaXMuX2ZpbGxFbmNvZGVUYWJsZSgwLCAwLCBza2lwRW5jb2RlQ2hhcnMpOyAvLyBBZGQgbW9yZSBlbmNvZGluZyBwYWlycyB3aGVuIG5lZWRlZC5cblxuXG4gIGlmIChjb2RlY09wdGlvbnMuZW5jb2RlQWRkKSB7XG4gICAgZm9yICh2YXIgdUNoYXIgaW4gY29kZWNPcHRpb25zLmVuY29kZUFkZCkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb2RlY09wdGlvbnMuZW5jb2RlQWRkLCB1Q2hhcikpIHRoaXMuX3NldEVuY29kZUNoYXIodUNoYXIuY2hhckNvZGVBdCgwKSwgY29kZWNPcHRpb25zLmVuY29kZUFkZFt1Q2hhcl0pO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuZGVmQ2hhclNCID0gdGhpcy5lbmNvZGVUYWJsZVswXVtpY29udi5kZWZhdWx0Q2hhclNpbmdsZUJ5dGUuY2hhckNvZGVBdCgwKV07XG4gIGlmICh0aGlzLmRlZkNoYXJTQiA9PT0gVU5BU1NJR05FRCkgdGhpcy5kZWZDaGFyU0IgPSB0aGlzLmVuY29kZVRhYmxlWzBdWyc/J107XG4gIGlmICh0aGlzLmRlZkNoYXJTQiA9PT0gVU5BU1NJR05FRCkgdGhpcy5kZWZDaGFyU0IgPSBcIj9cIi5jaGFyQ29kZUF0KDApOyAvLyBMb2FkICYgY3JlYXRlIEdCMTgwMzAgdGFibGVzIHdoZW4gbmVlZGVkLlxuXG4gIGlmICh0eXBlb2YgY29kZWNPcHRpb25zLmdiMTgwMzAgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLmdiMTgwMzAgPSBjb2RlY09wdGlvbnMuZ2IxODAzMCgpOyAvLyBMb2FkIEdCMTgwMzAgcmFuZ2VzLlxuICAgIC8vIEFkZCBHQjE4MDMwIGRlY29kZSB0YWJsZXMuXG5cbiAgICB2YXIgdGhpcmRCeXRlTm9kZUlkeCA9IHRoaXMuZGVjb2RlVGFibGVzLmxlbmd0aDtcbiAgICB2YXIgdGhpcmRCeXRlTm9kZSA9IHRoaXMuZGVjb2RlVGFibGVzW3RoaXJkQnl0ZU5vZGVJZHhdID0gVU5BU1NJR05FRF9OT0RFLnNsaWNlKDApO1xuICAgIHZhciBmb3VydGhCeXRlTm9kZUlkeCA9IHRoaXMuZGVjb2RlVGFibGVzLmxlbmd0aDtcbiAgICB2YXIgZm91cnRoQnl0ZU5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1tmb3VydGhCeXRlTm9kZUlkeF0gPSBVTkFTU0lHTkVEX05PREUuc2xpY2UoMCk7XG5cbiAgICBmb3IgKHZhciBpID0gMHg4MTsgaSA8PSAweEZFOyBpKyspIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlTm9kZUlkeCA9IE5PREVfU1RBUlQgLSB0aGlzLmRlY29kZVRhYmxlc1swXVtpXTtcbiAgICAgIHZhciBzZWNvbmRCeXRlTm9kZSA9IHRoaXMuZGVjb2RlVGFibGVzW3NlY29uZEJ5dGVOb2RlSWR4XTtcblxuICAgICAgZm9yICh2YXIgaiA9IDB4MzA7IGogPD0gMHgzOTsgaisrKSB7XG4gICAgICAgIHNlY29uZEJ5dGVOb2RlW2pdID0gTk9ERV9TVEFSVCAtIHRoaXJkQnl0ZU5vZGVJZHg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDB4ODE7IGkgPD0gMHhGRTsgaSsrKSB7XG4gICAgICB0aGlyZEJ5dGVOb2RlW2ldID0gTk9ERV9TVEFSVCAtIGZvdXJ0aEJ5dGVOb2RlSWR4O1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAweDMwOyBpIDw9IDB4Mzk7IGkrKykge1xuICAgICAgZm91cnRoQnl0ZU5vZGVbaV0gPSBHQjE4MDMwX0NPREU7XG4gICAgfVxuICB9XG59XG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuZW5jb2RlciA9IERCQ1NFbmNvZGVyO1xuREJDU0NvZGVjLnByb3RvdHlwZS5kZWNvZGVyID0gREJDU0RlY29kZXI7IC8vIERlY29kZXIgaGVscGVyc1xuXG5EQkNTQ29kZWMucHJvdG90eXBlLl9nZXREZWNvZGVUcmllTm9kZSA9IGZ1bmN0aW9uIChhZGRyKSB7XG4gIHZhciBieXRlcyA9IFtdO1xuXG4gIGZvciAoOyBhZGRyID4gMDsgYWRkciA+Pj0gOCkge1xuICAgIGJ5dGVzLnB1c2goYWRkciAmIDB4RkYpO1xuICB9XG5cbiAgaWYgKGJ5dGVzLmxlbmd0aCA9PSAwKSBieXRlcy5wdXNoKDApO1xuICB2YXIgbm9kZSA9IHRoaXMuZGVjb2RlVGFibGVzWzBdO1xuXG4gIGZvciAodmFyIGkgPSBieXRlcy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgLy8gVHJhdmVyc2Ugbm9kZXMgZGVlcGVyIGludG8gdGhlIHRyaWUuXG4gICAgdmFyIHZhbCA9IG5vZGVbYnl0ZXNbaV1dO1xuXG4gICAgaWYgKHZhbCA9PSBVTkFTU0lHTkVEKSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IG5vZGUuXG4gICAgICBub2RlW2J5dGVzW2ldXSA9IE5PREVfU1RBUlQgLSB0aGlzLmRlY29kZVRhYmxlcy5sZW5ndGg7XG4gICAgICB0aGlzLmRlY29kZVRhYmxlcy5wdXNoKG5vZGUgPSBVTkFTU0lHTkVEX05PREUuc2xpY2UoMCkpO1xuICAgIH0gZWxzZSBpZiAodmFsIDw9IE5PREVfU1RBUlQpIHtcbiAgICAgIC8vIEV4aXN0aW5nIG5vZGUuXG4gICAgICBub2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbTk9ERV9TVEFSVCAtIHZhbF07XG4gICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihcIk92ZXJ3cml0ZSBieXRlIGluIFwiICsgdGhpcy5lbmNvZGluZ05hbWUgKyBcIiwgYWRkcjogXCIgKyBhZGRyLnRvU3RyaW5nKDE2KSk7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn07XG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX2FkZERlY29kZUNodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIC8vIEZpcnN0IGVsZW1lbnQgb2YgY2h1bmsgaXMgdGhlIGhleCBtYmNzIGNvZGUgd2hlcmUgd2Ugc3RhcnQuXG4gIHZhciBjdXJBZGRyID0gcGFyc2VJbnQoY2h1bmtbMF0sIDE2KTsgLy8gQ2hvb3NlIHRoZSBkZWNvZGluZyBub2RlIHdoZXJlIHdlJ2xsIHdyaXRlIG91ciBjaGFycy5cblxuICB2YXIgd3JpdGVUYWJsZSA9IHRoaXMuX2dldERlY29kZVRyaWVOb2RlKGN1ckFkZHIpO1xuXG4gIGN1ckFkZHIgPSBjdXJBZGRyICYgMHhGRjsgLy8gV3JpdGUgYWxsIG90aGVyIGVsZW1lbnRzIG9mIHRoZSBjaHVuayB0byB0aGUgdGFibGUuXG5cbiAgZm9yICh2YXIgayA9IDE7IGsgPCBjaHVuay5sZW5ndGg7IGsrKykge1xuICAgIHZhciBwYXJ0ID0gY2h1bmtba107XG5cbiAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIC8vIFN0cmluZywgd3JpdGUgYXMtaXMuXG4gICAgICBmb3IgKHZhciBsID0gMDsgbCA8IHBhcnQubGVuZ3RoOykge1xuICAgICAgICB2YXIgY29kZSA9IHBhcnQuY2hhckNvZGVBdChsKyspO1xuXG4gICAgICAgIGlmICgweEQ4MDAgPD0gY29kZSAmJiBjb2RlIDwgMHhEQzAwKSB7XG4gICAgICAgICAgLy8gRGVjb2RlIHN1cnJvZ2F0ZVxuICAgICAgICAgIHZhciBjb2RlVHJhaWwgPSBwYXJ0LmNoYXJDb2RlQXQobCsrKTtcbiAgICAgICAgICBpZiAoMHhEQzAwIDw9IGNvZGVUcmFpbCAmJiBjb2RlVHJhaWwgPCAweEUwMDApIHdyaXRlVGFibGVbY3VyQWRkcisrXSA9IDB4MTAwMDAgKyAoY29kZSAtIDB4RDgwMCkgKiAweDQwMCArIChjb2RlVHJhaWwgLSAweERDMDApO2Vsc2UgdGhyb3cgbmV3IEVycm9yKFwiSW5jb3JyZWN0IHN1cnJvZ2F0ZSBwYWlyIGluIFwiICsgdGhpcy5lbmNvZGluZ05hbWUgKyBcIiBhdCBjaHVuayBcIiArIGNodW5rWzBdKTtcbiAgICAgICAgfSBlbHNlIGlmICgweDBGRjAgPCBjb2RlICYmIGNvZGUgPD0gMHgwRkZGKSB7XG4gICAgICAgICAgLy8gQ2hhcmFjdGVyIHNlcXVlbmNlIChvdXIgb3duIGVuY29kaW5nIHVzZWQpXG4gICAgICAgICAgdmFyIGxlbiA9IDB4RkZGIC0gY29kZSArIDI7XG4gICAgICAgICAgdmFyIHNlcSA9IFtdO1xuXG4gICAgICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBsZW47IG0rKykge1xuICAgICAgICAgICAgc2VxLnB1c2gocGFydC5jaGFyQ29kZUF0KGwrKykpO1xuICAgICAgICAgIH0gLy8gU2ltcGxlIHZhcmlhdGlvbjogZG9uJ3Qgc3VwcG9ydCBzdXJyb2dhdGVzIG9yIHN1YnNlcXVlbmNlcyBpbiBzZXEuXG5cblxuICAgICAgICAgIHdyaXRlVGFibGVbY3VyQWRkcisrXSA9IFNFUV9TVEFSVCAtIHRoaXMuZGVjb2RlVGFibGVTZXEubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuZGVjb2RlVGFibGVTZXEucHVzaChzZXEpO1xuICAgICAgICB9IGVsc2Ugd3JpdGVUYWJsZVtjdXJBZGRyKytdID0gY29kZTsgLy8gQmFzaWMgY2hhclxuXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGFydCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgLy8gSW50ZWdlciwgbWVhbmluZyBpbmNyZWFzaW5nIHNlcXVlbmNlIHN0YXJ0aW5nIHdpdGggcHJldiBjaGFyYWN0ZXIuXG4gICAgICB2YXIgY2hhckNvZGUgPSB3cml0ZVRhYmxlW2N1ckFkZHIgLSAxXSArIDE7XG5cbiAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgcGFydDsgbCsrKSB7XG4gICAgICAgIHdyaXRlVGFibGVbY3VyQWRkcisrXSA9IGNoYXJDb2RlKys7XG4gICAgICB9XG4gICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihcIkluY29ycmVjdCB0eXBlICdcIiArIHR5cGVvZiBwYXJ0ICsgXCInIGdpdmVuIGluIFwiICsgdGhpcy5lbmNvZGluZ05hbWUgKyBcIiBhdCBjaHVuayBcIiArIGNodW5rWzBdKTtcbiAgfVxuXG4gIGlmIChjdXJBZGRyID4gMHhGRikgdGhyb3cgbmV3IEVycm9yKFwiSW5jb3JyZWN0IGNodW5rIGluIFwiICsgdGhpcy5lbmNvZGluZ05hbWUgKyBcIiBhdCBhZGRyIFwiICsgY2h1bmtbMF0gKyBcIjogdG9vIGxvbmdcIiArIGN1ckFkZHIpO1xufTsgLy8gRW5jb2RlciBoZWxwZXJzXG5cblxuREJDU0NvZGVjLnByb3RvdHlwZS5fZ2V0RW5jb2RlQnVja2V0ID0gZnVuY3Rpb24gKHVDb2RlKSB7XG4gIHZhciBoaWdoID0gdUNvZGUgPj4gODsgLy8gVGhpcyBjb3VsZCBiZSA+IDB4RkYgYmVjYXVzZSBvZiBhc3RyYWwgY2hhcmFjdGVycy5cblxuICBpZiAodGhpcy5lbmNvZGVUYWJsZVtoaWdoXSA9PT0gdW5kZWZpbmVkKSB0aGlzLmVuY29kZVRhYmxlW2hpZ2hdID0gVU5BU1NJR05FRF9OT0RFLnNsaWNlKDApOyAvLyBDcmVhdGUgYnVja2V0IG9uIGRlbWFuZC5cblxuICByZXR1cm4gdGhpcy5lbmNvZGVUYWJsZVtoaWdoXTtcbn07XG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX3NldEVuY29kZUNoYXIgPSBmdW5jdGlvbiAodUNvZGUsIGRiY3NDb2RlKSB7XG4gIHZhciBidWNrZXQgPSB0aGlzLl9nZXRFbmNvZGVCdWNrZXQodUNvZGUpO1xuXG4gIHZhciBsb3cgPSB1Q29kZSAmIDB4RkY7XG4gIGlmIChidWNrZXRbbG93XSA8PSBTRVFfU1RBUlQpIHRoaXMuZW5jb2RlVGFibGVTZXFbU0VRX1NUQVJUIC0gYnVja2V0W2xvd11dW0RFRl9DSEFSXSA9IGRiY3NDb2RlOyAvLyBUaGVyZSdzIGFscmVhZHkgYSBzZXF1ZW5jZSwgc2V0IGEgc2luZ2xlLWNoYXIgc3Vic2VxdWVuY2Ugb2YgaXQuXG4gIGVsc2UgaWYgKGJ1Y2tldFtsb3ddID09IFVOQVNTSUdORUQpIGJ1Y2tldFtsb3ddID0gZGJjc0NvZGU7XG59O1xuXG5EQkNTQ29kZWMucHJvdG90eXBlLl9zZXRFbmNvZGVTZXF1ZW5jZSA9IGZ1bmN0aW9uIChzZXEsIGRiY3NDb2RlKSB7XG4gIC8vIEdldCB0aGUgcm9vdCBvZiBjaGFyYWN0ZXIgdHJlZSBhY2NvcmRpbmcgdG8gZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzZXF1ZW5jZS5cbiAgdmFyIHVDb2RlID0gc2VxWzBdO1xuXG4gIHZhciBidWNrZXQgPSB0aGlzLl9nZXRFbmNvZGVCdWNrZXQodUNvZGUpO1xuXG4gIHZhciBsb3cgPSB1Q29kZSAmIDB4RkY7XG4gIHZhciBub2RlO1xuXG4gIGlmIChidWNrZXRbbG93XSA8PSBTRVFfU1RBUlQpIHtcbiAgICAvLyBUaGVyZSdzIGFscmVhZHkgYSBzZXF1ZW5jZSB3aXRoICAtIHVzZSBpdC5cbiAgICBub2RlID0gdGhpcy5lbmNvZGVUYWJsZVNlcVtTRVFfU1RBUlQgLSBidWNrZXRbbG93XV07XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlcmUgd2FzIG5vIHNlcXVlbmNlIG9iamVjdCAtIGFsbG9jYXRlIGEgbmV3IG9uZS5cbiAgICBub2RlID0ge307XG4gICAgaWYgKGJ1Y2tldFtsb3ddICE9PSBVTkFTU0lHTkVEKSBub2RlW0RFRl9DSEFSXSA9IGJ1Y2tldFtsb3ddOyAvLyBJZiBhIGNoYXIgd2FzIHNldCBiZWZvcmUgLSBtYWtlIGl0IGEgc2luZ2xlLWNoYXIgc3Vic2VxdWVuY2UuXG5cbiAgICBidWNrZXRbbG93XSA9IFNFUV9TVEFSVCAtIHRoaXMuZW5jb2RlVGFibGVTZXEubGVuZ3RoO1xuICAgIHRoaXMuZW5jb2RlVGFibGVTZXEucHVzaChub2RlKTtcbiAgfSAvLyBUcmF2ZXJzZSB0aGUgY2hhcmFjdGVyIHRyZWUsIGFsbG9jYXRpbmcgbmV3IG5vZGVzIGFzIG5lZWRlZC5cblxuXG4gIGZvciAodmFyIGogPSAxOyBqIDwgc2VxLmxlbmd0aCAtIDE7IGorKykge1xuICAgIHZhciBvbGRWYWwgPSBub2RlW3VDb2RlXTtcbiAgICBpZiAodHlwZW9mIG9sZFZhbCA9PT0gJ29iamVjdCcpIG5vZGUgPSBvbGRWYWw7ZWxzZSB7XG4gICAgICBub2RlID0gbm9kZVt1Q29kZV0gPSB7fTtcbiAgICAgIGlmIChvbGRWYWwgIT09IHVuZGVmaW5lZCkgbm9kZVtERUZfQ0hBUl0gPSBvbGRWYWw7XG4gICAgfVxuICB9IC8vIFNldCB0aGUgbGVhZiB0byBnaXZlbiBkYmNzQ29kZS5cblxuXG4gIHVDb2RlID0gc2VxW3NlcS5sZW5ndGggLSAxXTtcbiAgbm9kZVt1Q29kZV0gPSBkYmNzQ29kZTtcbn07XG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX2ZpbGxFbmNvZGVUYWJsZSA9IGZ1bmN0aW9uIChub2RlSWR4LCBwcmVmaXgsIHNraXBFbmNvZGVDaGFycykge1xuICB2YXIgbm9kZSA9IHRoaXMuZGVjb2RlVGFibGVzW25vZGVJZHhdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMHgxMDA7IGkrKykge1xuICAgIHZhciB1Q29kZSA9IG5vZGVbaV07XG4gICAgdmFyIG1iQ29kZSA9IHByZWZpeCArIGk7XG4gICAgaWYgKHNraXBFbmNvZGVDaGFyc1ttYkNvZGVdKSBjb250aW51ZTtcbiAgICBpZiAodUNvZGUgPj0gMCkgdGhpcy5fc2V0RW5jb2RlQ2hhcih1Q29kZSwgbWJDb2RlKTtlbHNlIGlmICh1Q29kZSA8PSBOT0RFX1NUQVJUKSB0aGlzLl9maWxsRW5jb2RlVGFibGUoTk9ERV9TVEFSVCAtIHVDb2RlLCBtYkNvZGUgPDwgOCwgc2tpcEVuY29kZUNoYXJzKTtlbHNlIGlmICh1Q29kZSA8PSBTRVFfU1RBUlQpIHRoaXMuX3NldEVuY29kZVNlcXVlbmNlKHRoaXMuZGVjb2RlVGFibGVTZXFbU0VRX1NUQVJUIC0gdUNvZGVdLCBtYkNvZGUpO1xuICB9XG59OyAvLyA9PSBFbmNvZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbmZ1bmN0aW9uIERCQ1NFbmNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIC8vIEVuY29kZXIgc3RhdGVcbiAgdGhpcy5sZWFkU3Vycm9nYXRlID0gLTE7XG4gIHRoaXMuc2VxT2JqID0gdW5kZWZpbmVkOyAvLyBTdGF0aWMgZGF0YVxuXG4gIHRoaXMuZW5jb2RlVGFibGUgPSBjb2RlYy5lbmNvZGVUYWJsZTtcbiAgdGhpcy5lbmNvZGVUYWJsZVNlcSA9IGNvZGVjLmVuY29kZVRhYmxlU2VxO1xuICB0aGlzLmRlZmF1bHRDaGFyU2luZ2xlQnl0ZSA9IGNvZGVjLmRlZkNoYXJTQjtcbiAgdGhpcy5nYjE4MDMwID0gY29kZWMuZ2IxODAzMDtcbn1cblxuREJDU0VuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgbmV3QnVmID0gQnVmZmVyJDUuYWxsb2Moc3RyLmxlbmd0aCAqICh0aGlzLmdiMTgwMzAgPyA0IDogMykpLFxuICAgICAgbGVhZFN1cnJvZ2F0ZSA9IHRoaXMubGVhZFN1cnJvZ2F0ZSxcbiAgICAgIHNlcU9iaiA9IHRoaXMuc2VxT2JqLFxuICAgICAgbmV4dENoYXIgPSAtMSxcbiAgICAgIGkgPSAwLFxuICAgICAgaiA9IDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyAwLiBHZXQgbmV4dCBjaGFyYWN0ZXIuXG4gICAgaWYgKG5leHRDaGFyID09PSAtMSkge1xuICAgICAgaWYgKGkgPT0gc3RyLmxlbmd0aCkgYnJlYWs7XG4gICAgICB2YXIgdUNvZGUgPSBzdHIuY2hhckNvZGVBdChpKyspO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdUNvZGUgPSBuZXh0Q2hhcjtcbiAgICAgIG5leHRDaGFyID0gLTE7XG4gICAgfSAvLyAxLiBIYW5kbGUgc3Vycm9nYXRlcy5cblxuXG4gICAgaWYgKDB4RDgwMCA8PSB1Q29kZSAmJiB1Q29kZSA8IDB4RTAwMCkge1xuICAgICAgLy8gQ2hhciBpcyBvbmUgb2Ygc3Vycm9nYXRlcy5cbiAgICAgIGlmICh1Q29kZSA8IDB4REMwMCkge1xuICAgICAgICAvLyBXZSd2ZSBnb3QgbGVhZCBzdXJyb2dhdGUuXG4gICAgICAgIGlmIChsZWFkU3Vycm9nYXRlID09PSAtMSkge1xuICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSB1Q29kZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gdUNvZGU7IC8vIERvdWJsZSBsZWFkIHN1cnJvZ2F0ZSBmb3VuZC5cblxuICAgICAgICAgIHVDb2RlID0gVU5BU1NJR05FRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UndmUgZ290IHRyYWlsIHN1cnJvZ2F0ZS5cbiAgICAgICAgaWYgKGxlYWRTdXJyb2dhdGUgIT09IC0xKSB7XG4gICAgICAgICAgdUNvZGUgPSAweDEwMDAwICsgKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDApICogMHg0MDAgKyAodUNvZGUgLSAweERDMDApO1xuICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJbmNvbXBsZXRlIHN1cnJvZ2F0ZSBwYWlyIC0gb25seSB0cmFpbCBzdXJyb2dhdGUgZm91bmQuXG4gICAgICAgICAgdUNvZGUgPSBVTkFTU0lHTkVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlICE9PSAtMSkge1xuICAgICAgLy8gSW5jb21wbGV0ZSBzdXJyb2dhdGUgcGFpciAtIG9ubHkgbGVhZCBzdXJyb2dhdGUgZm91bmQuXG4gICAgICBuZXh0Q2hhciA9IHVDb2RlO1xuICAgICAgdUNvZGUgPSBVTkFTU0lHTkVEOyAvLyBXcml0ZSBhbiBlcnJvciwgdGhlbiBjdXJyZW50IGNoYXIuXG5cbiAgICAgIGxlYWRTdXJyb2dhdGUgPSAtMTtcbiAgICB9IC8vIDIuIENvbnZlcnQgdUNvZGUgY2hhcmFjdGVyLlxuXG5cbiAgICB2YXIgZGJjc0NvZGUgPSBVTkFTU0lHTkVEO1xuXG4gICAgaWYgKHNlcU9iaiAhPT0gdW5kZWZpbmVkICYmIHVDb2RlICE9IFVOQVNTSUdORUQpIHtcbiAgICAgIC8vIFdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzZXF1ZW5jZVxuICAgICAgdmFyIHJlc0NvZGUgPSBzZXFPYmpbdUNvZGVdO1xuXG4gICAgICBpZiAodHlwZW9mIHJlc0NvZGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIFNlcXVlbmNlIGNvbnRpbnVlcy5cbiAgICAgICAgc2VxT2JqID0gcmVzQ29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXNDb2RlID09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIFNlcXVlbmNlIGZpbmlzaGVkLiBXcml0ZSBpdC5cbiAgICAgICAgZGJjc0NvZGUgPSByZXNDb2RlO1xuICAgICAgfSBlbHNlIGlmIChyZXNDb2RlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBDdXJyZW50IGNoYXJhY3RlciBpcyBub3QgcGFydCBvZiB0aGUgc2VxdWVuY2UuXG4gICAgICAgIC8vIFRyeSBkZWZhdWx0IGNoYXJhY3RlciBmb3IgdGhpcyBzZXF1ZW5jZVxuICAgICAgICByZXNDb2RlID0gc2VxT2JqW0RFRl9DSEFSXTtcblxuICAgICAgICBpZiAocmVzQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZGJjc0NvZGUgPSByZXNDb2RlOyAvLyBGb3VuZC4gV3JpdGUgaXQuXG5cbiAgICAgICAgICBuZXh0Q2hhciA9IHVDb2RlOyAvLyBDdXJyZW50IGNoYXJhY3RlciB3aWxsIGJlIHdyaXR0ZW4gdG9vIGluIHRoZSBuZXh0IGl0ZXJhdGlvbi5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXFPYmogPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh1Q29kZSA+PSAwKSB7XG4gICAgICAvLyBSZWd1bGFyIGNoYXJhY3RlclxuICAgICAgdmFyIHN1YnRhYmxlID0gdGhpcy5lbmNvZGVUYWJsZVt1Q29kZSA+PiA4XTtcbiAgICAgIGlmIChzdWJ0YWJsZSAhPT0gdW5kZWZpbmVkKSBkYmNzQ29kZSA9IHN1YnRhYmxlW3VDb2RlICYgMHhGRl07XG5cbiAgICAgIGlmIChkYmNzQ29kZSA8PSBTRVFfU1RBUlQpIHtcbiAgICAgICAgLy8gU2VxdWVuY2Ugc3RhcnRcbiAgICAgICAgc2VxT2JqID0gdGhpcy5lbmNvZGVUYWJsZVNlcVtTRVFfU1RBUlQgLSBkYmNzQ29kZV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGJjc0NvZGUgPT0gVU5BU1NJR05FRCAmJiB0aGlzLmdiMTgwMzApIHtcbiAgICAgICAgLy8gVXNlIEdCMTgwMzAgYWxnb3JpdGhtIHRvIGZpbmQgY2hhcmFjdGVyKHMpIHRvIHdyaXRlLlxuICAgICAgICB2YXIgaWR4ID0gZmluZElkeCh0aGlzLmdiMTgwMzAudUNoYXJzLCB1Q29kZSk7XG5cbiAgICAgICAgaWYgKGlkeCAhPSAtMSkge1xuICAgICAgICAgIHZhciBkYmNzQ29kZSA9IHRoaXMuZ2IxODAzMC5nYkNoYXJzW2lkeF0gKyAodUNvZGUgLSB0aGlzLmdiMTgwMzAudUNoYXJzW2lkeF0pO1xuICAgICAgICAgIG5ld0J1ZltqKytdID0gMHg4MSArIE1hdGguZmxvb3IoZGJjc0NvZGUgLyAxMjYwMCk7XG4gICAgICAgICAgZGJjc0NvZGUgPSBkYmNzQ29kZSAlIDEyNjAwO1xuICAgICAgICAgIG5ld0J1ZltqKytdID0gMHgzMCArIE1hdGguZmxvb3IoZGJjc0NvZGUgLyAxMjYwKTtcbiAgICAgICAgICBkYmNzQ29kZSA9IGRiY3NDb2RlICUgMTI2MDtcbiAgICAgICAgICBuZXdCdWZbaisrXSA9IDB4ODEgKyBNYXRoLmZsb29yKGRiY3NDb2RlIC8gMTApO1xuICAgICAgICAgIGRiY3NDb2RlID0gZGJjc0NvZGUgJSAxMDtcbiAgICAgICAgICBuZXdCdWZbaisrXSA9IDB4MzAgKyBkYmNzQ29kZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gMy4gV3JpdGUgZGJjc0NvZGUgY2hhcmFjdGVyLlxuXG5cbiAgICBpZiAoZGJjc0NvZGUgPT09IFVOQVNTSUdORUQpIGRiY3NDb2RlID0gdGhpcy5kZWZhdWx0Q2hhclNpbmdsZUJ5dGU7XG5cbiAgICBpZiAoZGJjc0NvZGUgPCAweDEwMCkge1xuICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZTtcbiAgICB9IGVsc2UgaWYgKGRiY3NDb2RlIDwgMHgxMDAwMCkge1xuICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZSA+PiA4OyAvLyBoaWdoIGJ5dGVcblxuICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZSAmIDB4RkY7IC8vIGxvdyBieXRlXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGUgPj4gMTY7XG4gICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlID4+IDggJiAweEZGO1xuICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZSAmIDB4RkY7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5zZXFPYmogPSBzZXFPYmo7XG4gIHRoaXMubGVhZFN1cnJvZ2F0ZSA9IGxlYWRTdXJyb2dhdGU7XG4gIHJldHVybiBuZXdCdWYuc2xpY2UoMCwgaik7XG59O1xuXG5EQkNTRW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5sZWFkU3Vycm9nYXRlID09PSAtMSAmJiB0aGlzLnNlcU9iaiA9PT0gdW5kZWZpbmVkKSByZXR1cm47IC8vIEFsbCBjbGVhbi4gTW9zdCBvZnRlbiBjYXNlLlxuXG4gIHZhciBuZXdCdWYgPSBCdWZmZXIkNS5hbGxvYygxMCksXG4gICAgICBqID0gMDtcblxuICBpZiAodGhpcy5zZXFPYmopIHtcbiAgICAvLyBXZSdyZSBpbiB0aGUgc2VxdWVuY2UuXG4gICAgdmFyIGRiY3NDb2RlID0gdGhpcy5zZXFPYmpbREVGX0NIQVJdO1xuXG4gICAgaWYgKGRiY3NDb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFdyaXRlIGJlZ2lubmluZyBvZiB0aGUgc2VxdWVuY2UuXG4gICAgICBpZiAoZGJjc0NvZGUgPCAweDEwMCkge1xuICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZSA+PiA4OyAvLyBoaWdoIGJ5dGVcblxuICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlICYgMHhGRjsgLy8gbG93IGJ5dGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlcU9iaiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0aGlzLmxlYWRTdXJyb2dhdGUgIT09IC0xKSB7XG4gICAgLy8gSW5jb21wbGV0ZSBzdXJyb2dhdGUgcGFpciAtIG9ubHkgbGVhZCBzdXJyb2dhdGUgZm91bmQuXG4gICAgbmV3QnVmW2orK10gPSB0aGlzLmRlZmF1bHRDaGFyU2luZ2xlQnl0ZTtcbiAgICB0aGlzLmxlYWRTdXJyb2dhdGUgPSAtMTtcbiAgfVxuXG4gIHJldHVybiBuZXdCdWYuc2xpY2UoMCwgaik7XG59OyAvLyBFeHBvcnQgZm9yIHRlc3RpbmdcblxuXG5EQkNTRW5jb2Rlci5wcm90b3R5cGUuZmluZElkeCA9IGZpbmRJZHg7IC8vID09IERlY29kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIERCQ1NEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIC8vIERlY29kZXIgc3RhdGVcbiAgdGhpcy5ub2RlSWR4ID0gMDtcbiAgdGhpcy5wcmV2QnVmID0gQnVmZmVyJDUuYWxsb2MoMCk7IC8vIFN0YXRpYyBkYXRhXG5cbiAgdGhpcy5kZWNvZGVUYWJsZXMgPSBjb2RlYy5kZWNvZGVUYWJsZXM7XG4gIHRoaXMuZGVjb2RlVGFibGVTZXEgPSBjb2RlYy5kZWNvZGVUYWJsZVNlcTtcbiAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBjb2RlYy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gIHRoaXMuZ2IxODAzMCA9IGNvZGVjLmdiMTgwMzA7XG59XG5cbkRCQ1NEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgdmFyIG5ld0J1ZiA9IEJ1ZmZlciQ1LmFsbG9jKGJ1Zi5sZW5ndGggKiAyKSxcbiAgICAgIG5vZGVJZHggPSB0aGlzLm5vZGVJZHgsXG4gICAgICBwcmV2QnVmID0gdGhpcy5wcmV2QnVmLFxuICAgICAgcHJldkJ1Zk9mZnNldCA9IHRoaXMucHJldkJ1Zi5sZW5ndGgsXG4gICAgICBzZXFTdGFydCA9IC10aGlzLnByZXZCdWYubGVuZ3RoLFxuICAgICAgLy8gaWR4IG9mIHRoZSBzdGFydCBvZiBjdXJyZW50IHBhcnNlZCBzZXF1ZW5jZS5cbiAgdUNvZGU7XG4gIGlmIChwcmV2QnVmT2Zmc2V0ID4gMCkgLy8gTWFrZSBwcmV2IGJ1ZiBvdmVybGFwIGEgbGl0dGxlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHNsaWNlIGxhdGVyLlxuICAgIHByZXZCdWYgPSBCdWZmZXIkNS5jb25jYXQoW3ByZXZCdWYsIGJ1Zi5zbGljZSgwLCAxMCldKTtcblxuICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3VyQnl0ZSA9IGkgPj0gMCA/IGJ1ZltpXSA6IHByZXZCdWZbaSArIHByZXZCdWZPZmZzZXRdOyAvLyBMb29rdXAgaW4gY3VycmVudCB0cmllIG5vZGUuXG5cbiAgICB2YXIgdUNvZGUgPSB0aGlzLmRlY29kZVRhYmxlc1tub2RlSWR4XVtjdXJCeXRlXTtcblxuICAgIGlmICh1Q29kZSA+PSAwKSA7IGVsc2UgaWYgKHVDb2RlID09PSBVTkFTU0lHTkVEKSB7XG4gICAgICAvLyBVbmtub3duIGNoYXIuXG4gICAgICAvLyBUT0RPOiBDYWxsYmFjayB3aXRoIHNlcS5cbiAgICAgIC8vdmFyIGN1clNlcSA9IChzZXFTdGFydCA+PSAwKSA/IGJ1Zi5zbGljZShzZXFTdGFydCwgaSsxKSA6IHByZXZCdWYuc2xpY2Uoc2VxU3RhcnQgKyBwcmV2QnVmT2Zmc2V0LCBpKzEgKyBwcmV2QnVmT2Zmc2V0KTtcbiAgICAgIGkgPSBzZXFTdGFydDsgLy8gVHJ5IHRvIHBhcnNlIGFnYWluLCBhZnRlciBza2lwcGluZyBmaXJzdCBieXRlIG9mIHRoZSBzZXF1ZW5jZSAoJ2knIHdpbGwgYmUgaW5jcmVtZW50ZWQgYnkgJ2ZvcicgY3ljbGUpLlxuXG4gICAgICB1Q29kZSA9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlLmNoYXJDb2RlQXQoMCk7XG4gICAgfSBlbHNlIGlmICh1Q29kZSA9PT0gR0IxODAzMF9DT0RFKSB7XG4gICAgICB2YXIgY3VyU2VxID0gc2VxU3RhcnQgPj0gMCA/IGJ1Zi5zbGljZShzZXFTdGFydCwgaSArIDEpIDogcHJldkJ1Zi5zbGljZShzZXFTdGFydCArIHByZXZCdWZPZmZzZXQsIGkgKyAxICsgcHJldkJ1Zk9mZnNldCk7XG4gICAgICB2YXIgcHRyID0gKGN1clNlcVswXSAtIDB4ODEpICogMTI2MDAgKyAoY3VyU2VxWzFdIC0gMHgzMCkgKiAxMjYwICsgKGN1clNlcVsyXSAtIDB4ODEpICogMTAgKyAoY3VyU2VxWzNdIC0gMHgzMCk7XG4gICAgICB2YXIgaWR4ID0gZmluZElkeCh0aGlzLmdiMTgwMzAuZ2JDaGFycywgcHRyKTtcbiAgICAgIHVDb2RlID0gdGhpcy5nYjE4MDMwLnVDaGFyc1tpZHhdICsgcHRyIC0gdGhpcy5nYjE4MDMwLmdiQ2hhcnNbaWR4XTtcbiAgICB9IGVsc2UgaWYgKHVDb2RlIDw9IE5PREVfU1RBUlQpIHtcbiAgICAgIC8vIEdvIHRvIG5leHQgdHJpZSBub2RlLlxuICAgICAgbm9kZUlkeCA9IE5PREVfU1RBUlQgLSB1Q29kZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAodUNvZGUgPD0gU0VRX1NUQVJUKSB7XG4gICAgICAvLyBPdXRwdXQgYSBzZXF1ZW5jZSBvZiBjaGFycy5cbiAgICAgIHZhciBzZXEgPSB0aGlzLmRlY29kZVRhYmxlU2VxW1NFUV9TVEFSVCAtIHVDb2RlXTtcblxuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZXEubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAgIHVDb2RlID0gc2VxW2tdO1xuICAgICAgICBuZXdCdWZbaisrXSA9IHVDb2RlICYgMHhGRjtcbiAgICAgICAgbmV3QnVmW2orK10gPSB1Q29kZSA+PiA4O1xuICAgICAgfVxuXG4gICAgICB1Q29kZSA9IHNlcVtzZXEubGVuZ3RoIC0gMV07XG4gICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihcImljb252LWxpdGUgaW50ZXJuYWwgZXJyb3I6IGludmFsaWQgZGVjb2RpbmcgdGFibGUgdmFsdWUgXCIgKyB1Q29kZSArIFwiIGF0IFwiICsgbm9kZUlkeCArIFwiL1wiICsgY3VyQnl0ZSk7IC8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgdG8gYnVmZmVyLCBoYW5kbGluZyBoaWdoZXIgcGxhbmVzIHVzaW5nIHN1cnJvZ2F0ZSBwYWlyLlxuXG5cbiAgICBpZiAodUNvZGUgPiAweEZGRkYpIHtcbiAgICAgIHVDb2RlIC09IDB4MTAwMDA7XG4gICAgICB2YXIgdUNvZGVMZWFkID0gMHhEODAwICsgTWF0aC5mbG9vcih1Q29kZSAvIDB4NDAwKTtcbiAgICAgIG5ld0J1ZltqKytdID0gdUNvZGVMZWFkICYgMHhGRjtcbiAgICAgIG5ld0J1ZltqKytdID0gdUNvZGVMZWFkID4+IDg7XG4gICAgICB1Q29kZSA9IDB4REMwMCArIHVDb2RlICUgMHg0MDA7XG4gICAgfVxuXG4gICAgbmV3QnVmW2orK10gPSB1Q29kZSAmIDB4RkY7XG4gICAgbmV3QnVmW2orK10gPSB1Q29kZSA+PiA4OyAvLyBSZXNldCB0cmllIG5vZGUuXG5cbiAgICBub2RlSWR4ID0gMDtcbiAgICBzZXFTdGFydCA9IGkgKyAxO1xuICB9XG5cbiAgdGhpcy5ub2RlSWR4ID0gbm9kZUlkeDtcbiAgdGhpcy5wcmV2QnVmID0gc2VxU3RhcnQgPj0gMCA/IGJ1Zi5zbGljZShzZXFTdGFydCkgOiBwcmV2QnVmLnNsaWNlKHNlcVN0YXJ0ICsgcHJldkJ1Zk9mZnNldCk7XG4gIHJldHVybiBuZXdCdWYuc2xpY2UoMCwgaikudG9TdHJpbmcoJ3VjczInKTtcbn07XG5cbkRCQ1NEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByZXQgPSAnJzsgLy8gVHJ5IHRvIHBhcnNlIGFsbCByZW1haW5pbmcgY2hhcnMuXG5cbiAgd2hpbGUgKHRoaXMucHJldkJ1Zi5sZW5ndGggPiAwKSB7XG4gICAgLy8gU2tpcCAxIGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLlxuICAgIHJldCArPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgICB2YXIgYnVmID0gdGhpcy5wcmV2QnVmLnNsaWNlKDEpOyAvLyBQYXJzZSByZW1haW5pbmcgYXMgdXN1YWwuXG5cbiAgICB0aGlzLnByZXZCdWYgPSBCdWZmZXIkNS5hbGxvYygwKTtcbiAgICB0aGlzLm5vZGVJZHggPSAwO1xuICAgIGlmIChidWYubGVuZ3RoID4gMCkgcmV0ICs9IHRoaXMud3JpdGUoYnVmKTtcbiAgfVxuXG4gIHRoaXMubm9kZUlkeCA9IDA7XG4gIHJldHVybiByZXQ7XG59OyAvLyBCaW5hcnkgc2VhcmNoIGZvciBHQjE4MDMwLiBSZXR1cm5zIGxhcmdlc3QgaSBzdWNoIHRoYXQgdGFibGVbaV0gPD0gdmFsLlxuXG5cbmZ1bmN0aW9uIGZpbmRJZHgodGFibGUsIHZhbCkge1xuICBpZiAodGFibGVbMF0gPiB2YWwpIHJldHVybiAtMTtcbiAgdmFyIGwgPSAwLFxuICAgICAgciA9IHRhYmxlLmxlbmd0aDtcblxuICB3aGlsZSAobCA8IHIgLSAxKSB7XG4gICAgLy8gYWx3YXlzIHRhYmxlW2xdIDw9IHZhbCA8IHRhYmxlW3JdXG4gICAgdmFyIG1pZCA9IGwgKyBNYXRoLmZsb29yKChyIC0gbCArIDEpIC8gMik7XG4gICAgaWYgKHRhYmxlW21pZF0gPD0gdmFsKSBsID0gbWlkO2Vsc2UgciA9IG1pZDtcbiAgfVxuXG4gIHJldHVybiBsO1xufVxuXG52YXIgZGJjc0NvZGVjID0ge1xuICBfZGJjczogX2RiY3Ncbn07XG5cbnZhciBzaGlmdGppcyA9IFtcblx0W1xuXHRcdFwiMFwiLFxuXHRcdFwiXFx1MDAwMFwiLFxuXHRcdDEyOFxuXHRdLFxuXHRbXG5cdFx0XCJhMVwiLFxuXHRcdFwi772hXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiODE0MFwiLFxuXHRcdFwi44CA44CB44CC77yM77yO44O777ya77yb77yf77yB44Kb44KcwrTvvYDCqO+8vu+/o++8v+ODveODvuOCneOCnuOAg+S7neOAheOAhuOAh+ODvOKAleKAkO+8j++8vO+9nuKIpe+9nOKApuKApeKAmOKAmeKAnOKAne+8iO+8ieOAlOOAle+8u++8ve+9m++9neOAiFwiLFxuXHRcdDksXG5cdFx0XCLvvIvvvI3CscOXXCJcblx0XSxcblx0W1xuXHRcdFwiODE4MFwiLFxuXHRcdFwiw7fvvJ3iiaDvvJzvvJ7iiabiiafiiJ7iiLTimYLimYDCsOKAsuKAs+KEg++/pe+8hO+/oO+/oe+8he+8g++8hu+8iu+8oMKn4piG4piF4peL4peP4peO4peH4peG4pah4pag4paz4pay4pa94pa84oC744CS4oaS4oaQ4oaR4oaT44CTXCJcblx0XSxcblx0W1xuXHRcdFwiODFiOFwiLFxuXHRcdFwi4oiI4oiL4oqG4oqH4oqC4oqD4oiq4oipXCJcblx0XSxcblx0W1xuXHRcdFwiODFjOFwiLFxuXHRcdFwi4oin4oio77+i4oeS4oeU4oiA4oiDXCJcblx0XSxcblx0W1xuXHRcdFwiODFkYVwiLFxuXHRcdFwi4oig4oql4oyS4oiC4oiH4omh4omS4omq4omr4oia4oi94oid4oi14oir4oisXCJcblx0XSxcblx0W1xuXHRcdFwiODFmMFwiLFxuXHRcdFwi4oSr4oCw4pmv4pmt4pmq4oCg4oChwrZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MWZjXCIsXG5cdFx0XCLil69cIlxuXHRdLFxuXHRbXG5cdFx0XCI4MjRmXCIsXG5cdFx0XCLvvJBcIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcIjgyNjBcIixcblx0XHRcIu+8oVwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcIjgyODFcIixcblx0XHRcIu+9gVwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcIjgyOWZcIixcblx0XHRcIuOBgVwiLFxuXHRcdDgyXG5cdF0sXG5cdFtcblx0XHRcIjgzNDBcIixcblx0XHRcIuOCoVwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcIjgzODBcIixcblx0XHRcIuODoFwiLFxuXHRcdDIyXG5cdF0sXG5cdFtcblx0XHRcIjgzOWZcIixcblx0XHRcIs6RXCIsXG5cdFx0MTYsXG5cdFx0XCLOo1wiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiODNiZlwiLFxuXHRcdFwizrFcIixcblx0XHQxNixcblx0XHRcIs+DXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCI4NDQwXCIsXG5cdFx0XCLQkFwiLFxuXHRcdDUsXG5cdFx0XCLQgdCWXCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiODQ3MFwiLFxuXHRcdFwi0LBcIixcblx0XHQ1LFxuXHRcdFwi0ZHQtlwiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiODQ4MFwiLFxuXHRcdFwi0L5cIixcblx0XHQxN1xuXHRdLFxuXHRbXG5cdFx0XCI4NDlmXCIsXG5cdFx0XCLilIDilILilIzilJDilJjilJTilJzilKzilKTilLTilLzilIHilIPilI/ilJPilJvilJfilKPilLPilKvilLvilYvilKDilK/ilKjilLfilL/ilJ3ilLDilKXilLjilYJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NzQwXCIsXG5cdFx0XCLikaBcIixcblx0XHQxOSxcblx0XHRcIuKFoFwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiODc1ZlwiLFxuXHRcdFwi442J44yU44yi442N44yY44yn44yD44y2442R442X44yN44ym44yj44yr442K44y7446c446d446e446O446P44+E446hXCJcblx0XSxcblx0W1xuXHRcdFwiODc3ZVwiLFxuXHRcdFwi4427XCJcblx0XSxcblx0W1xuXHRcdFwiODc4MFwiLFxuXHRcdFwi44Cd44Cf4oSW44+N4oSh44qkXCIsXG5cdFx0NCxcblx0XHRcIuOIseOIsuOIueONvuONveONvOKJkuKJoeKIq+KIruKIkeKImuKKpeKIoOKIn+KKv+KIteKIqeKIqlwiXG5cdF0sXG5cdFtcblx0XHRcIjg4OWZcIixcblx0XHRcIuS6nOWUluWog+mYv+WTgOaEm+aMqOWntumAouiRteiMnOepkOaCquaPoea4peaXreiRpuiKpumvteaik+Wcp+aWoeaJseWum+WnkOiZu+mjtOe1oue2vumujuaIlueyn+iit+WuieW6teaMieaal+ahiOmXh+mejeadj+S7peS8iuS9jeS+neWBieWbsuWkt+WnlOWogeWwieaDn+aEj+aFsOaYk+akheeCuueVj+eVsOenu+e2ree3r+iDg+iQjuiho+isgumBlemBuuWMu+S6leS6peWfn+iCsumDgeejr+S4gOWjsea6oumAuOeosuiMqOiKi+mwr+WFgeWNsOWSveWToeWboOWnu+W8lemjsua3q+iDpOiUrVwiXG5cdF0sXG5cdFtcblx0XHRcIjg5NDBcIixcblx0XHRcIumZoumZsOmaoOmfu+WQi+WPs+Wuh+eDj+e+vei/gumbqOWNr+m1nOequuS4keeik+iHvOa4puWYmOWUhOasneiUmumwu+WnpeWOqea1pueTnOmWj+WZguS6kemBi+mbsuiNj+mkjOWPoeWWtuWssOW9seaYoOabs+aghOawuOazs+a0qeeRm+ebiOepjumgtOiLseihm+ipoOmLrea2sueWq+ebiumnheaCpuisgei2iumWsuamjuWOreWGhlwiXG5cdF0sXG5cdFtcblx0XHRcIjg5ODBcIixcblx0XHRcIuWckuWgsOWlhOWutOW7tuaAqOaOqeaPtOayv+a8lOeCjueElOeFmeeHleeMv+e4geiJtuiLkeiWl+mBoOmJm+m0m+WhqeaWvOaxmueUpeWHueWkruWlpeW+gOW/nOaKvOaXuuaoquasp+autOeOi+e/geillum0rOm0jum7hOWyoeayluiNu+WEhOWxi+aGtuiHhuahtueJoeS5meS/uuWNuOaBqea4qeepj+mfs+S4i+WMluS7ruS9leS8veS+oeS9s+WKoOWPr+WYieWkj+WrgeWutuWvoeenkeaah+aenOaetuatjOays+eBq+ePguemjeemvueovOeuh+iKseiLm+iMhOiNt+iPr+iPk+idpuiqsuWYqeiyqOi/pumBjumcnuiaiuS/hOWzqOaIkeeJmeeUu+iHpeiKveibvuizgOmbhemkk+mnleS7i+S8muino+WbnuWhiuWjiuW7u+W/q+aAquaClOaBouaHkOaIkuaLkOaUuVwiXG5cdF0sXG5cdFtcblx0XHRcIjhhNDBcIixcblx0XHRcIumtgeaZpuaisOa1t+eBsOeVjOeahue1teiKpeifuemWi+majuiyneWHseWKvuWkluWSs+Wus+W0luaFqOamgua2r+eijeiTi+ihl+ipsumOp+mquOa1rOmmqOibmeWeo+afv+ibjumIjuWKg+Wah+WQhOW7k+aLoeaSueagvOaguOauu+eNsueiuuepq+immuinkui1q+i8g+mDremWo+malOmdqeWtpuWys+alvemhjemhjuaOm+esoOaoq1wiXG5cdF0sXG5cdFtcblx0XHRcIjhhODBcIixcblx0XHRcIuapv+aitumwjea9n+WJsuWWneaBsOaLrOa0u+a4h+a7keiRm+ikkOi9hOS4lOmwueWPtuakm+aouumehOagquWFnOerg+iSsumHnOmOjOWZm+m0qOagouiMheiQseeypeWIiOiLheeTpuS5vuS+g+WGoOWvkuWIiuWLmOWLp+W3u+WWmuWgquWnpuWujOWumOWvm+W5suW5ueaCo+aEn+aFo+aGvuaPm+aVouafkeahk+ajuuasvuatk+axl+a8oua+l+a9heeSsOeUmOebo+eci+erv+euoeewoee3qee8tue/sOiCneiJpuiOnuims+irjOiyq+mChOmRkemWk+mWkemWoumZpemfk+mkqOiImOS4uOWQq+WyuOW3jOeOqeeZjOecvOWyqee/q+i0i+mbgemgkemhlOmhmOS8geS8juWNseWWnOWZqOWfuuWlh+WsieWvhOWykOW4jOW5vuW/jOaPruacuuaXl+aXouacn+aji+ajhFwiXG5cdF0sXG5cdFtcblx0XHRcIjhiNDBcIixcblx0XHRcIuapn+W4sOavheawl+axveeVv+eliOWto+eogOe0gOW+veimj+iomOiytOi1t+i7jOi8nemjoumojumsvOS6gOWBveWEgOWmk+WunOaIr+aKgOaTrOasuueKoOeWkeelh+e+qeifu+iqvOitsOaOrOiPiumeoOWQieWQg+WWq+ahlOapmOipsOegp+adtem7jeWNtOWuouiEmuiZkOmAhuS4mOS5heS7h+S8keWPiuWQuOWuruW8k+aApeaVkVwiXG5cdF0sXG5cdFtcblx0XHRcIjhiODBcIixcblx0XHRcIuacveaxguaxsuazo+eBuOeQg+eptueqruesiOe0muezvue1puaXp+eJm+WOu+WxheW3qOaLkuaLoOaMmea4oOiZmuiosei3nemLuOa8geempumtmuS6qOS6q+S6rOS+m+S+oOWDkeWFh+ertuWFseWHtuWNlOWMoeWNv+WPq+WWrOWig+WzoeW8t+W9iuaAr+aBkOaBreaMn+aVmeapi+azgeeLgueLreefr+iDuOiEheiIiOiVjumDt+mPoemfv+mll+mpmuS7sOWHneWwreaagealreWxgOabsualteeOieahkOeygeWDheWLpOWdh+W3vumMpuaWpOaso+asveeQtOemgeemveeti+e3iuiKueiPjOihv+iln+isuei/kemHkeWQn+mKgOS5neWAtuWPpeWMuueLl+eOluefqeiLpui6r+mnhumniOmnkuWFt+aEmuiZnuWWsOepuuWBtuWvk+mBh+maheS4suarm+mHp+WxkeWxiFwiXG5cdF0sXG5cdFtcblx0XHRcIjhjNDBcIixcblx0XHRcIuaOmOeqn+ayk+mdtOi9oeeqqueGiumaiOeyguagl+e5sOahkemNrOWLsuWQm+iWq+iok+e+pOi7jemDoeWNpuiiiOelgeS/guWCvuWIkeWFhOWVk+WcreePquWei+WlkeW9ouW+hOaBteaFtuaFp+aGqeaOsuaQuuaVrOaZr+ahgua4k+eVpueoveezu+e1jOe2mee5i+e9q+iMjuiNiuibjeioiOipo+itpui7vemgmum2j+iKuOi/jumvqFwiXG5cdF0sXG5cdFtcblx0XHRcIjhjODBcIixcblx0XHRcIuWKh+aIn+aSg+a/gOmameahgeWCkeasoOaxuua9lOeptOe1kOihgOioo+aciOS7tuWAueWApuWBpeWFvOWIuOWJo+WWp+Wcj+WgheWrjOW7uuaGsuaHuOaLs+aNsuaknOaoqeeJveeKrOeMrueglOehr+e1ueecjOiCqeimi+ismeizoui7kumBo+mNtemZuumhlemok+m5uOWFg+WOn+WOs+W5u+W8pua4m+a6kOeOhOePvue1g+iIt+iogOiruumZkOS5juWAi+WPpOWRvOWbuuWnkeWtpOW3seW6q+W8p+aIuOaVheaer+a5lueLkOeziuiitOiCoeiDoeiPsOiZjuiqh+i3qOmIt+mbh+mhp+m8k+S6lOS6kuS8jeWNiOWRieWQvuWor+W+jOW+oeaCn+aip+aqjueRmueigeiqnuiqpOitt+mGkOS5numvieS6pOS9vOS+r+WAmeWAluWFieWFrOWKn+WKueWLvuWOmuWPo+WQkVwiXG5cdF0sXG5cdFtcblx0XHRcIjhkNDBcIixcblx0XHRcIuWQjuWWieWdkeWeouWlveWtlOWtneWuj+W3peW3p+W3t+W5uOW6g+W6muW6t+W8mOaBkuaFjOaKl+aLmOaOp+aUu+aYguaZg+abtOadreagoeail+ani+axn+a0qua1qea4r+a6neeUsueah+ehrOeov+ezoOe0hee0mOe1nue2seiAleiAg+iCr+iCseiFlOiGj+iIquiNkuihjOihoeism+iyouizvOmDiumFtemJseegv+mLvOmWpOmZjVwiXG5cdF0sXG5cdFtcblx0XHRcIjhkODBcIixcblx0XHRcIumghemmmemrmOm0u+WJm+WKq+WPt+WQiOWjleaLt+a/oOixqui9n+m6ueWFi+WIu+WRiuWbveepgOmFt+m1oOm7kueNhOa8ieiFsOeUkeW/veaDmumqqOeLm+i+vOatpOmgg+S7iuWbsOWdpOWivuWpmuaBqOaHh+aYj+aYhuagueaisea3t+eXlee0uuiJrumtguS6m+S9kOWPieWUhuW1r+W3puW3ruafu+aymeeRs+egguipkOmOluijn+WdkOW6p+aMq+WCteWCrOWGjeacgOWTieWhnuWmu+WusOW9qeaJjeaOoeagveats+a4iOeBvemHh+eKgOegleegpuelreaWjue0sOiPnOijgei8iemam+WJpOWcqOadkOe9quiyoeWGtOWdgumYquWguuamiuiCtOWSsuW0juWfvOeilem3uuS9nOWJiuWSi+aQvuaYqOaclOafteeqhOetlue0oumMr+ahnOmureesueWMmeWGiuWIt1wiXG5cdF0sXG5cdFtcblx0XHRcIjhlNDBcIixcblx0XHRcIuWvn+aLtuaSruaTpuacreauuuiWqembkeeakOmvluaNjOmMhumuq+eav+aZkuS4ieWCmOWPguWxseaDqOaSkuaVo+ahn+eHpuePiueUo+eul+e6guialeiug+izm+mFuOmkkOaWrOaaq+aui+S7leS7lOS8uuS9v+WIuuWPuOWPsuWXo+Wbm+Wjq+Wni+WnieWnv+WtkOWxjeW4guW4q+W/l+aAneaMh+aUr+WtnOaWr+aWveaXqOaeneatolwiXG5cdF0sXG5cdFtcblx0XHRcIjhlODBcIixcblx0XHRcIuatu+awj+eNheelieengeezuOe0mee0q+iCouiEguiHs+imluipnuipqeippuiqjOirruizh+iznOmbjOmjvOatr+S6i+S8vOS+jeWFkOWtl+WvuuaFiOaMgeaZguasoea7i+ayu+eIvueSveeXlOejgeekuuiAjOiAs+iHquiSlOi+nuaxkOm5v+W8j+itmOm0q+eruui7uOWujembq+S4g+WPseWft+WkseWrieWupOaCiea5v+a8hueWvuizquWun+iUgOevoOWBsuaftOiKneWxoeiViue4nuiIjuWGmeWwhOaNqOi1puaWnOeFruekvue0l+iAheisnei7iumBruibh+mCquWAn+WLuuWwuuadk+eBvOeItemFjOmHiOmMq+iLpeWvguW8seaDueS4u+WPluWuiOaJi+acseauiueLqeePoOeoruiFq+i2o+mFkummluWEkuWPl+WRquWvv+aOiOaouee2rOmcgOWbmuWPjuWRqFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmNDBcIixcblx0XHRcIuWul+WwseW3nuS/ruaEgeaLvua0suengOeni+e1gue5jee/kuiHreiIn+iSkOihhuilsuiukOi5tOi8r+mAsemFi+mFrOmbhumGnOS7gOS9j+WFheWNgeW+k+aIjuaflOaxgea4i+eNo+e4pumHjemKg+WPlOWkmeWuv+a3keelnee4rueym+WhvueGn+WHuuihk+i/sOS/iuWzu+aYpeeerOero+iInOmnv+WHhuW+quaXrOalr+auiea3s1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmODBcIixcblx0XHRcIua6lua9pOebvue0lOW3oemBtemGh+mghuWHpuWIneaJgOaakeabmea4muW6tue3kue9suabuOiWr+iXt+iruOWKqeWPmeWls+W6j+W+kOaBlemLpOmZpOWCt+WEn+WLneWMoOWNh+WPrOWTqOWVhuWUseWYl+WlqOWmvuWovOWuteWwhuWwj+WwkeWwmuW6hOW6iuW7oOW9sOaJv+aKhOaLm+aOjOaNt+aYh+aYjOaYreaZtuadvuaiouaon+aoteayvOa2iOa4iea5mOeEvOeEpueFp+eXh+ecgeehneekgeelpeensOeroOeskeeyp+e0ueiCluiPluiSi+iVieihneijs+ion+iovOiplOips+ixoeiznumGpOmJpumNvumQmOmanOmemOS4iuS4iOS4nuS5l+WGl+WJsOWfjuWgtOWjjOWsouW4uOaDheaTvuadoeadlua1hOeKtueVs+epo+iSuOitsumGuOmMoOWYseWftOmjvlwiXG5cdF0sXG5cdFtcblx0XHRcIjkwNDBcIixcblx0XHRcIuaLreakjeaulueHree5lOiBt+iJsuinpumjn+idlei+seWwu+S8uOS/oeS+teWUh+WooOWvneWvqeW/g+aFjuaMr+aWsOaZi+ajruamm+a1uOa3seeUs+eWueecn+elnuenpue0s+iHo+iKr+iWquimquiouui6q+i+m+mAsumHnemch+S6uuS7geWIg+WhteWjrOWwi+eUmuWwveiFjuioiui/hemZo+mdreespeirj+mgiOmFouWbs+WOqFwiXG5cdF0sXG5cdFtcblx0XHRcIjkwODBcIixcblx0XHRcIumAl+WQueWeguW4peaOqOawtOeCiuedoeeyi+e/oOihsOmBgumFlOmMkOmMmOmaj+eRnumrhOW0h+W1qeaVsOaeoui2qOmbm+aNruadieakmeiPhemgl+mbgOijvua+hOaRuuWvuOS4lueArOeVneaYr+WHhOWItuWLouWnk+W+geaAp+aIkOaUv+aVtOaYn+aZtOajsuagluato+a4heeJsueUn+ebm+eyvuiBluWjsOijveilv+iqoOiqk+iri+mAnemGkumdkumdmeaWieeojuiEhumau+W4reaDnOaImuaWpeaYlOaekOefs+epjeexjee4vuiEiuiyrOi1pOi3oei5n+eiqeWIh+aLmeaOpeaRguaKmOioreeqg+evgOiqrOmbque1tuiIjOidieS7meWFiOWNg+WNoOWuo+WwguWwluW3neaIpuaJh+aSsOagk+agtOaziea1hea0l+afk+a9nOeFjueFveaXi+epv+euree3mlwiXG5cdF0sXG5cdFtcblx0XHRcIjkxNDBcIixcblx0XHRcIue5iue+qOiFuuiIm+iIueiWpuipruizjui3temBuOmBt+mKremKkemWg+muruWJjeWWhOa8uOeEtuWFqOemhee5leiGs+ezjuWZjOWhkeWyqOaOquabvuabvealmueLmeeWj+eWjuekjuelluenn+eyl+e0oOe1hOiYh+iotOmYu+mBoem8oOWDp+WJteWPjOWPouWAieWWquWjruWlj+eIveWui+WxpOWMneaDo+aDs+aNnOaOg+aMv+aOu1wiXG5cdF0sXG5cdFtcblx0XHRcIjkxODBcIixcblx0XHRcIuaTjeaXqeabueW3o+anjeanvea8leeHpeS6ieeXqeebuOeqk+ezn+e3j+e2nOiBoeiNieiNmOiRrOiSvOiXu+ijhei1sOmAgemBremOl+mcnOmokuWDj+Wil+aGjuiHk+iUtei0iOmAoOS/g+WBtOWJh+WNs+aBr+aNieadn+a4rOi2s+mAn+S/l+WxnuiziuaXj+e2muWNkuiiluWFtuaPg+WtmOWtq+WwiuaQjeadkemBnOS7luWkmuWkquaxsOipkeWUvuWgleWmpeaDsOaJk+afgeiIteallemZgOmnhOmoqOS9k+WghuWvvuiAkOWyseW4r+W+heaAoOaFi+aItOabv+azsOa7nuiDjuiFv+iLlOiii+iyuOmAgOmArumaium7m+mvm+S7o+WPsOWkp+esrOmGjemhjOm3uea7neeAp+WNk+WVhOWuheaJmOaKnuaLk+ayoua/r+eQouiol+mQuOa/geirvuiMuOWHp+ibuOWPqlwiXG5cdF0sXG5cdFtcblx0XHRcIjkyNDBcIixcblx0XHRcIuWPqeS9humBlOi+sOWlquiEseW3veerqui+v+ajmuiwt+eLuOmxiOaoveiqsOS4ueWNmOWYhuWdpuaLheaOouaXpuatjua3oea5m+eCreefreerr+euque2u+iAveiDhuibi+iqlemNm+Wbo+Wjh+W8vuaWreaaluaqgOauteeUt+irh+WApOefpeWcsOW8m+aBpeaZuuaxoOeXtOeomue9ruiHtOicmOmBhemms+evieeVnOerueetkeiThFwiXG5cdF0sXG5cdFtcblx0XHRcIjkyODBcIixcblx0XHRcIumAkOenqeeqkuiMtuWroeedgOS4reS7suWumeW/oOaKveaYvOafseazqOiZq+iht+iou+mFjumLs+mnkOaol+eApueMquiLp+iRl+iyr+S4geWFhuWHi+WWi+WvteW4luW4s+W6geW8lOW8teW9q+W+tOaHsuaMkeaaouacnea9rueJkueUuuecuuiBtOiEueiFuOidtuiqv+irnOi2hei3s+mKmumVt+mggumzpeWLheaNl+ebtOacleayiOePjeizg+mOrumZs+a0peWinOakjuanjOi/vemOmueXm+mAmuWhmuagguaOtOanu+S9g+a8rOafmOi+u+iUpue2tOmNlOakv+a9sOWdquWjt+WsrOe0rOeIquWQiumHo+m2tOS6reS9juWBnOWBteWJg+iynuWRiOWgpOWumuW4neW6leW6reW7t+W8n+aCjOaKteaMuuaPkOair+axgOeih+emjueoi+e3oOiJh+ioguirpui5hOmAk1wiXG5cdF0sXG5cdFtcblx0XHRcIjkzNDBcIixcblx0XHRcIumCuOmEremHmOm8juazpeaRmOaTouaVtea7tOeahOesm+mBqemPkea6uuWTsuW+ueaSpOi9jei/remJhOWFuOWhq+WkqeWxleW6l+a3u+e6j+eUnOiyvOi7oumhm+eCueS8neauv+a+seeUsOmbu+WFjuWQkOWgteWhl+WmrOWxoOW+kuaWl+adnOa4oeeZu+iPn+izremAlOmDvemNjeegpeeguuWKquW6puWcn+WltOaAkuWAkuWFmuWGrFwiXG5cdF0sXG5cdFtcblx0XHRcIjkzODBcIixcblx0XHRcIuWHjeWIgOWUkOWhlOWhmOWll+WuleWztuW2i+aCvOaKleaQreadseahg+aivOajn+ebl+a3mOa5r+a2m+eBr+eHiOW9k+eXmOelt+etieetlOetkuezlue1seWIsOiRo+iVqeiXpOiojuishOixhui4j+mAg+mAj+mQmemZtumgremosOmXmOWDjeWLleWQjOWgguWwjuaGp+aSnua0nuees+erpeiDtOiQhOmBk+mKheWzoOm0h+WMv+W+l+W+s+a2nOeJueedo+emv+evpOavkueLrOiqreagg+apoeWHuOeqgeaktOWxiumztuiLq+WvhemFieeAnuWZuOWxr+aDh+aVpuayjOixmumBgemgk+WRkeabh+mIjeWliOmCo+WGheS5jeWHquiWmeisjueBmOaNuumNi+aloummtOe4hOeVt+WNl+aloOi7n+mbo+axneS6jOWwvOW8kOi/qeWMguizkeiCieiZueW7v+aXpeS5s+WFpVwiXG5cdF0sXG5cdFtcblx0XHRcIjk0NDBcIixcblx0XHRcIuWmguWwv+mfruS7u+WmiuW/jeiqjea/oeemsOelouWvp+iRseeMq+eGseW5tOW/teaNu+aSmueHg+eymOS5g+W7vOS5i+WfnOWaouaCqea/g+e0jeiDveiEs+iGv+i+suiml+iapOW3tOaKiuaSreimh+adt+azoua0vueQtuegtOWphue9teiKremmrOS/s+W7g+aLneaOkuaVl+adr+ebg+eJjOiDjOiCuui8qemFjeWAjeWfueWqkuaihVwiXG5cdF0sXG5cdFtcblx0XHRcIjk0ODBcIixcblx0XHRcIuals+eFpOeLveiyt+WjsuizoOmZqumAmeidv+enpOefp+iQqeS8r+WJpeWNmuaLjeafj+aziueZveeulOeyleiItuiWhOi/q+abnea8oOeIhue4m+iOq+mngem6puWHveeuseehsueuuOiCh+etiOarqOW5oeiCjOeVkeeVoOWFq+mJoua6jOeZuumGl+mrquS8kOe9sOaKnOetj+mWpemzqeWZuuWhmeibpOmavOS8tOWIpOWNiuWPjeWPm+W4huaQrOaWkeadv+awvuaxjueJiOeKr+ePreeVlOe5geiIrOiXqeiyqeevhOmHhueFqemgkumjr+aMveaZqeeVquebpOejkOiVg+ibruWMquWNkeWQpuWmg+W6h+W9vOaCsuaJieaJueaKq+aWkOavlOazjOeWsuearueikeenmOe3i+e9t+iCpeiiq+iqueiyu+mBv+mdnumjm+aoi+ewuOWCmeWwvuW+ruaeh+avmOeQteeciee+jlwiXG5cdF0sXG5cdFtcblx0XHRcIjk1NDBcIixcblx0XHRcIum8u+afiueol+WMueeWi+mrreW9puiGneiPseiCmOW8vOW/heeVouethumAvOahp+Wnq+Wqm+e0kOeZvuisrOS/teW9quaomeawt+a8gueTouelqOihqOipleixueW7n+aPj+eXheenkuiLl+mMqOmLsuiSnOibremwreWTgeW9rOaWjOa1nOeAleiyp+izk+mgu+aVj+eTtuS4jeS7mOWfoOWkq+WppuWvjOWGqOW4g+W6nOaAluaJtuaVt1wiXG5cdF0sXG5cdFtcblx0XHRcIjk1ODBcIixcblx0XHRcIuaWp+aZrua1rueItuespuiFkOiGmuiKmeitnOiyoOizpui1tOmYnOmZhOS+ruaSq+atpuiInuiRoeiVqumDqOWwgealk+miqOiRuuiVl+S8j+WJr+W+qeW5heacjeemj+iFueikh+imhua3teW8l+aJleayuOS7j+eJqemukuWIhuWQu+WZtOWis+aGpOaJrueEmuWlrueyieeznue0m+mbsOaWh+iBnuS4meS9teWFteWhgOW5o+W5s+W8iuafhOS4puiUvemWiemZm+exs+mggeWDu+WjgeeZlueip+WIpeeepeiUkeeuhuWBj+WkieeJh+evh+e3qOi+uui/lOmBjeS+v+WLieWoqeW8gemereS/neiIl+mLquWcg+aNleatqeeUq+ijnOi8lOepguWLn+Wik+aFleaIiuaaruavjeewv+iPqeWAo+S/uOWMheWRhuWgseWlieWuneWzsOWzr+W0qeW6luaKseaNp+aUvuaWueaci1wiXG5cdF0sXG5cdFtcblx0XHRcIjk2NDBcIixcblx0XHRcIuazleazoeeDueegsue4q+iDnuiKs+iQjOiTrOicguikkuioquixiumCpumLkumjvemzs+m1rOS5j+S6oeWCjeWJluWdiuWmqOW4veW/mOW/meaIv+aatOacm+afkOajkuWGkue0oeiCquiGqOisgOiyjOiyv+mJvumYsuWQoOmgrOWMl+WDleWNnOWiqOaSsuactOeJp+edpuephumHpuWLg+ayoeauhuWggOW5jOWllOacrOe/u+WHoeebhlwiXG5cdF0sXG5cdFtcblx0XHRcIjk2ODBcIixcblx0XHRcIuaRqeejqOmtlOm6u+Wfi+WmueaYp+aemuavjuWTqeanmeW5leiGnOaelemuquafvumxkuahneS6puS/o+WPiOaKueacq+ayq+i/hOS+ree5rem6v+S4h+aFoua6gOa8q+iUk+WRs+acqumtheW3s+euleWyrOWvhuicnOa5iuiTkeeolOiEiOWmmeeyjeawkeecoOWLmeWkoueEoeeJn+efm+mcp+m1oeaki+Wpv+WomOWGpeWQjeWRveaYjuebn+i/t+mKmOmztOWnqueJnea7heWFjeajiee2v+e3rOmdoum6uuaRuOaooeiMguWmhOWtn+avm+eMm+ebsue2suiAl+iSmeWEsuacqOm7meebruadouWLv+mkheWwpOaIu+exvuiysOWVj+aCtue0i+mWgOWMgeS5n+WGtuWknOeIuuiAtumHjuW8peefouWOhOW9uee0hOiWrOios+i6jemdluafs+iWrumRk+aEieaEiOayueeZklwiXG5cdF0sXG5cdFtcblx0XHRcIjk3NDBcIixcblx0XHRcIuirrei8uOWUr+S9keWEquWLh+WPi+WupeW5veaCoOaGguaPluacieafmua5p+a2jOeMtueMt+eUseelkOijleiqmOmBiumCkemDtembhOiejeWkleS6iOS9meS4juiqiei8v+mgkOWCreW5vOWmluWuueW6uOaPmuaPuuaTgeabnOaliuanmOa0i+a6tueGlOeUqOeqr+e+iuiAgOiRieiTieimgeisoei4iumBpemZvemkiuaFvuaKkeasslwiXG5cdF0sXG5cdFtcblx0XHRcIjk3ODBcIixcblx0XHRcIuayg+a1tOe/jOe/vOa3gOe+heieuuijuOadpeiOsemgvOmbt+a0m+e1oeiQvemFquS5seWNteW1kOashOa/q+iXjeiYreimp+WIqeWQj+WxpeadjuaiqOeQhueSg+eXouijj+ijoemHjOmboumZuOW+i+eOh+eri+iRjuaOoOeVpeWKiea1gea6nOeQieeVmeehq+eykumahuernOm+jeS+tuaFruaXheiZnOS6huS6ruWDmuS4oeWHjOWvruaWmeaigea2vOeMn+eZgueereeonOezp+iJr+irkumBvOmHj+mZtemgmOWKm+e3keWAq+WOmOael+a3i+eHkOeQs+iHqOi8qumao+mxl+m6n+eRoOWhgea2mee0r+mhnuS7pOS8tuS+i+WGt+WKseW2uuaAnOeOsuekvOiLk+mItOmat+mbtumcium6l+m9ouaapuattOWIl+WKo+eDiOijguW7ieaBi+aGkOa8o+eFieewvue3tOiBr1wiXG5cdF0sXG5cdFtcblx0XHRcIjk4NDBcIixcblx0XHRcIuiTrumAo+mMrOWRgumtr+ark+eCieizgui3r+mcsuWKtOWpgeW7iuW8hOacl+alvOamlOa1qua8j+eJoueLvOevreiAgeiBvuidi+mDjuWFrem6k+emhOiCi+mMsuirluWAreWSjOipseatquizhOiEh+aDkeaeoOm3suS6meS6mOmwkOipq+iXgeiVqOakgOa5vueil+iFlVwiXG5cdF0sXG5cdFtcblx0XHRcIjk4OWZcIixcblx0XHRcIuW8jOS4kOS4leS4quS4seS4tuS4vOS4v+S5guS5luS5mOS6guS6heixq+S6iuiIkuW8jeS6juS6nuS6n+S6oOS6ouS6sOS6s+S6tuS7juS7jeS7hOS7huS7guS7l+S7nuS7reS7n+S7t+S8ieS9muS8sOS9m+S9neS9l+S9h+S9tuS+iOS+j+S+mOS9u+S9qeS9sOS+keS9r+S+huS+luWEmOS/lOS/n+S/juS/mOS/m+S/keS/muS/kOS/pOS/peWAmuWAqOWAlOWAquWApeWAheS8nOS/tuWAoeWAqeWArOS/vuS/r+WAkeWAhuWBg+WBh+acg+WBleWBkOWBiOWBmuWBluWBrOWBuOWCgOWCmuWCheWCtOWCslwiXG5cdF0sXG5cdFtcblx0XHRcIjk5NDBcIixcblx0XHRcIuWDieWDiuWCs+WDguWDluWDnuWDpeWDreWDo+WDruWDueWDteWEieWEgeWEguWEluWEleWElOWEmuWEoeWEuuWEt+WEvOWEu+WEv+WFgOWFkuWFjOWFlOWFoueruOWFqeWFquWFruWGgOWGguWbmOWGjOWGieWGj+WGkeWGk+WGleWGluWGpOWGpuWGouWGqeWGquWGq+WGs+WGseWGsuWGsOWGteWGveWHheWHieWHm+WHoOiZleWHqeWHrVwiXG5cdF0sXG5cdFtcblx0XHRcIjk5ODBcIixcblx0XHRcIuWHsOWHteWHvuWIhOWIi+WIlOWIjuWIp+WIquWIruWIs+WIueWJj+WJhOWJi+WJjOWJnuWJlOWJquWJtOWJqeWJs+WJv+WJveWKjeWKlOWKkuWJseWKiOWKkei+qOi+p+WKrOWKreWKvOWKteWLgeWLjeWLl+WLnuWLo+WLpumjreWLoOWLs+WLteWLuOWLueWMhuWMiOeUuOWMjeWMkOWMj+WMleWMmuWMo+WMr+WMseWMs+WMuOWNgOWNhuWNheS4l+WNieWNjeWHluWNnuWNqeWNruWkmOWNu+WNt+WOguWOluWOoOWOpuWOpeWOruWOsOWOtuWPg+ewkumbmeWPn+abvOeHruWPruWPqOWPreWPuuWQgeWQveWRgOWQrOWQreWQvOWQruWQtuWQqeWQneWRjuWSj+WRteWSjuWRn+WRseWRt+WRsOWSkuWRu+WSgOWRtuWShOWSkOWShuWTh+WSouWSuOWSpeWSrOWThOWTiOWSqFwiXG5cdF0sXG5cdFtcblx0XHRcIjlhNDBcIixcblx0XHRcIuWSq+WTguWSpOWSvuWSvOWTmOWTpeWTpuWUj+WUlOWTveWTruWTreWTuuWTouWUueWVgOWVo+WVjOWUruWVnOWVheWVluWVl+WUuOWUs+WVneWWmeWWgOWSr+WWiuWWn+WVu+WVvuWWmOWWnuWWruWVvOWWg+WWqeWWh+WWqOWXmuWXheWXn+WXhOWXnOWXpOWXlOWYlOWXt+WYluWXvuWXveWYm+WXueWZjuWZkOeHn+WYtOWYtuWYsuWYuFwiXG5cdF0sXG5cdFtcblx0XHRcIjlhODBcIixcblx0XHRcIuWZq+WZpOWYr+WZrOWZquWahuWagOWaiuWaoOWalOWaj+WapeWaruWatuWatOWbguWavOWbgeWbg+WbgOWbiOWbjuWbkeWbk+Wbl+WbruWbueWcgOWbv+WchOWcieWciOWci+WcjeWck+WcmOWcluWXh+WcnOWcpuWct+WcuOWdjuWcu+WdgOWdj+WdqeWfgOWeiOWdoeWdv+WeieWek+WeoOWes+WepOWequWesOWfg+WfhuWflOWfkuWfk+WgiuWfluWfo+Wgi+WgmeWgneWhsuWgoeWhouWhi+WhsOavgOWhkuWgveWhueWiheWiueWin+Wiq+WiuuWjnuWiu+WiuOWiruWjheWjk+WjkeWjl+WjmeWjmOWjpeWjnOWjpOWjn+Wjr+WjuuWjueWju+WjvOWjveWkguWkiuWkkOWkm+aipuWkpeWkrOWkreWksuWkuOWkvuerkuWlleWlkOWljuWlmuWlmOWlouWloOWlp+WlrOWlqVwiXG5cdF0sXG5cdFtcblx0XHRcIjliNDBcIixcblx0XHRcIuWluOWmgeWmneS9nuS+q+Wmo+WmsuWnhuWnqOWnnOWmjeWnmeWnmuWopeWon+WokeWonOWoieWomuWpgOWprOWpieWoteWotuWpouWpquWqmuWqvOWqvuWri+WrguWqveWro+Wrl+WrpuWrqeWrluWruuWru+WsjOWsi+WsluWssuWrkOWsquWstuWsvuWtg+WtheWtgOWtkeWtleWtmuWtm+WtpeWtqeWtsOWts+WtteWtuOaWiOWtuuWugFwiXG5cdF0sXG5cdFtcblx0XHRcIjliODBcIixcblx0XHRcIuWug+WupuWuuOWvg+Wvh+WvieWvlOWvkOWvpOWvpuWvouWvnuWvpeWvq+WvsOWvtuWvs+WwheWwh+WwiOWwjeWwk+WwoOWwouWwqOWwuOWwueWxgeWxhuWxjuWxk+WxkOWxj+WtseWxrOWxruS5ouWxtuWxueWyjOWykeWylOWmm+Wyq+Wyu+WytuWyvOWyt+WzheWyvuWzh+WzmeWzqeWzveWzuuWzreW2jOWzquW0i+W0leW0l+W1nOW0n+W0m+W0keW0lOW0ouW0muW0meW0mOW1jOW1kuW1juW1i+W1rOW1s+W1tuW2h+W2hOW2guW2ouW2neW2rOW2ruW2veW2kOW2t+W2vOW3ieW3jeW3k+W3kuW3luW3m+W3q+W3suW3teW4i+W4muW4meW4keW4m+W4tuW4t+W5hOW5g+W5gOW5juW5l+W5lOW5n+W5ouW5pOW5h+W5teW5tuW5uum6vOW5v+W6oOW7geW7guW7iOW7kOW7j1wiXG5cdF0sXG5cdFtcblx0XHRcIjljNDBcIixcblx0XHRcIuW7luW7o+W7neW7muW7m+W7ouW7oeW7qOW7qeW7rOW7seW7s+W7sOW7tOW7uOW7vuW8g+W8ieW9neW9nOW8i+W8keW8luW8qeW8reW8uOW9geW9iOW9jOW9juW8r+W9keW9luW9l+W9meW9oeW9reW9s+W9t+W+g+W+guW9v+W+iuW+iOW+keW+h+W+nuW+meW+mOW+oOW+qOW+reW+vOW/luW/u+W/pOW/uOW/seW/neaCs+W/v+aAoeaBoFwiXG5cdF0sXG5cdFtcblx0XHRcIjljODBcIixcblx0XHRcIuaAmeaAkOaAqeaAjuaAseaAm+aAleaAq+aApuaAj+aAuuaBmuaBgeaBquaBt+aBn+aBiuaBhuaBjeaBo+aBg+aBpOaBguaBrOaBq+aBmeaCgeaCjeaDp+aCg+aCmuaChOaCm+aCluaCl+aCkuaCp+aCi+aDoeaCuOaDoOaDk+aCtOW/sOaCveaDhuaCteaDmOaFjeaEleaEhuaDtuaDt+aEgOaDtOaDuuaEg+aEoeaDu+aDseaEjeaEjuaFh+aEvuaEqOaEp+aFiuaEv+aEvOaErOaEtOaEveaFguaFhOaFs+aFt+aFmOaFmeaFmuaFq+aFtOaFr+aFpeaFseaFn+aFneaFk+aFteaGmeaGluaGh+aGrOaGlOaGmuaGiuaGkeaGq+aGruaHjOaHiuaHieaHt+aHiOaHg+aHhuaGuuaHi+e9ueaHjeaHpuaHo+aHtuaHuuaHtOaHv+aHveaHvOaHvuaIgOaIiOaIieaIjeaIjOaIlOaIm1wiXG5cdF0sXG5cdFtcblx0XHRcIjlkNDBcIixcblx0XHRcIuaInuaIoeaIquaIruaIsOaIsuaIs+aJgeaJjuaJnuaJo+aJm+aJoOaJqOaJvOaKguaKieaJvuaKkuaKk+aKluaLlOaKg+aKlOaLl+aLkeaKu+aLj+aLv+aLhuaTlOaLiOaLnOaLjOaLiuaLguaLh+aKm+aLieaMjOaLruaLseaMp+aMguaMiOaLr+aLteaNkOaMvuaNjeaQnOaNj+aOluaOjuaOgOaOq+aNtuaOo+aOj+aOieaOn+aOteaNq1wiXG5cdF0sXG5cdFtcblx0XHRcIjlkODBcIixcblx0XHRcIuaNqeaOvuaPqeaPgOaPhuaPo+aPieaPkuaPtuaPhOaQluaQtOaQhuaQk+aQpuaQtuaUneaQl+aQqOaQj+aRp+aRr+aRtuaRjuaUquaSleaSk+aSpeaSqeaSiOaSvOaTmuaTkuaTheaTh+aSu+aTmOaTguaTseaTp+iIieaToOaToeaKrOaTo+aTr+aUrOaTtuaTtOaTsuaTuuaUgOaTveaUmOaUnOaUheaUpOaUo+aUq+aUtOaUteaUt+aUtuaUuOeVi+aViOaVluaVleaVjeaVmOaVnuaVneaVsuaVuOaWguaWg+iuiuaWm+aWn+aWq+aWt+aXg+aXhuaXgeaXhOaXjOaXkuaXm+aXmeaXoOaXoeaXseadsuaYiuaYg+aXu+ads+aYteaYtuaYtOaYnOaZj+aZhOaZieaZgeaZnuaZneaZpOaZp+aZqOaZn+aZouaZsOaag+aaiOaajuaaieaahOaamOaaneabgeaaueabieaavuaavFwiXG5cdF0sXG5cdFtcblx0XHRcIjllNDBcIixcblx0XHRcIuabhOaauOabluabmuaboOaYv+abpuabqeabsOabteabt+acj+acluacnuacpuacp+mcuOacruacv+actuadgeacuOact+adhuadnuadoOadmeado+adpOaeieadsOaeqeadvOadquaejOaei+aepuaeoeaeheaet+afr+aetOafrOaes+afqeaeuOafpOafnuafneafouafruaeueafjuafhuafp+aqnOagnuahhuagqeahgOahjeagsuahjlwiXG5cdF0sXG5cdFtcblx0XHRcIjllODBcIixcblx0XHRcIuais+agq+ahmeaho+aht+ahv+ain+aij+aireailOaineaim+aig+aqruaiueahtOaiteaioOaiuuakj+aijeahvuakgeajiuakiOajmOakouakpuajoeakjOajjeajlOajp+ajleaktuakkuakhOajl+ajo+akpeajueajoOajr+akqOakquakmuako+akoeajhualuealt+alnOaluOalq+allOalvualruakuealtOakvealmeaksOaloealnualneamgealquamsuamruankOamv+angeank+amvuanjuWvqOaniuanneamu+ang+amp+aoruamkeamoOamnOamleamtOannuanqOaoguaom+anv+asiuanueansuanp+aoheamseaonuanreaolOanq+aoiuaokuargeaoo+aok+aphOaojOapsuaotuapuOaph+apouapmeappuapiOaouOaoouaqkOaqjeaqoOaqhOaqouaqo1wiXG5cdF0sXG5cdFtcblx0XHRcIjlmNDBcIixcblx0XHRcIuaql+iYl+aqu+arg+arguaquOaqs+aqrOarnuarkearn+aqquarmuarquaru+asheiYluaruuaskuaslumsseasn+asuOast+ebnOasuemjruath+atg+atieatkOatmeatlOatm+atn+atoeatuOatueatv+augOauhOaug+aujeaumOauleaunuaupOauquauq+aur+ausuauseaus+aut+auvOavhuavi+avk+avn+avrOavq+avs+avr1wiXG5cdF0sXG5cdFtcblx0XHRcIjlmODBcIixcblx0XHRcIum6vuawiOawk+awlOawm+awpOawo+axnuaxleaxouaxquayguayjeaymuaygeaym+axvuaxqOaxs+aykuaykOazhOazseazk+ayveazl+azheazneayruayseayvuayuuazm+azr+azmeazqua0n+ihjea0tua0q+a0vea0uOa0mea0tea0s+a0kua0jOa1o+a2k+a1pOa1mua1uea1mea2jua2lea/pOa2hea3uea4lea4iua2tea3h+a3pua2uOa3hua3rOa3nua3jOa3qOa3kua3hea3uua3mea3pOa3lea3qua3rua4rea5rua4rua4mea5sua5n+a4vua4o+a5q+a4q+a5tua5jea4n+a5g+a4uua5jua4pOa7v+a4nea4uOa6gua6qua6mOa7iea6t+a7k+a6vea6r+a7hOa6sua7lOa7lea6j+a6pea7gua6n+a9gea8keeBjOa7rOa7uOa7vua8v+a7sua8sea7r+a8sua7jFwiXG5cdF0sXG5cdFtcblx0XHRcImUwNDBcIixcblx0XHRcIua8vua8k+a7t+a+hua9uua9uOa+gea+gOa9r+a9m+a/s+a9rea+gua9vOa9mOa+jua+kea/gua9pua+s+a+o+a+oea+pOa+uea/hua+qua/n+a/lea/rOa/lOa/mOa/sea/rua/m+eAieeAi+a/uueAkeeAgeeAj+a/vueAm+eAmua9tOeAneeAmOeAn+eAsOeAvueAsueBkeeBo+eCmeeCkueCr+eDseeCrOeCuOeCs+eCrueDn+eDi+eDnVwiXG5cdF0sXG5cdFtcblx0XHRcImUwODBcIixcblx0XHRcIueDmeeEieeDveeEnOeEmeeFpeeFleeGiOeFpueFoueFjOeFlueFrOeGj+eHu+eGhOeGleeGqOeGrOeHl+eGueeGvueHkueHieeHlOeHjueHoOeHrOeHp+eHteeHvOeHueeHv+eIjeeIkOeIm+eIqOeIreeIrOeIsOeIsueIu+eIvOeIv+eJgOeJhueJi+eJmOeJtOeJvueKgueKgeeKh+eKkueKlueKoueKp+eKueeKsueLg+eLhueLhOeLjueLkueLoueLoOeLoeeLueeLt+WAj+eMl+eMiueMnOeMlueMneeMtOeMr+eMqeeMpeeMvueNjueNj+m7mOeNl+eNqueNqOeNsOeNuOeNteeNu+eNuuePiOeOs+ePjueOu+ePgOePpeePruePnueSoueQheeRr+eQpeePuOeQsueQuueRleeQv+eRn+eRmeeRgeeRnOeRqeeRsOeRo+eRqueRtueRvueSi+eSnueSp+eTiueTj+eTlOePsVwiXG5cdF0sXG5cdFtcblx0XHRcImUxNDBcIixcblx0XHRcIueToOeTo+eTp+eTqeeTrueTsueTsOeTseeTuOeTt+eUhOeUg+eUheeUjOeUjueUjeeUleeUk+eUnueUpueUrOeUvOeVhOeVjeeViueVieeVm+eVhueVmueVqeeVpOeVp+eVq+eVreeVuOeVtueWhueWh+eVtOeWiueWieeWgueWlOeWmueWneeWpeeWo+eXgueWs+eXg+eWteeWveeWuOeWvOeWseeXjeeXiueXkueXmeeXo+eXnueXvueXv1wiXG5cdF0sXG5cdFtcblx0XHRcImUxODBcIixcblx0XHRcIueXvOeYgeeXsOeXuueXsueXs+eYi+eYjeeYieeYn+eYp+eYoOeYoeeYoueYpOeYtOeYsOeYu+eZh+eZiOeZhueZnOeZmOeZoeeZoueZqOeZqeeZqueZp+eZrOeZsOeZsueZtueZuOeZvOeagOeag+eaiOeai+eajuealueak+eameeamueasOeatOeauOeaueeauuebguebjeebluebkuebnueboeebpeebp+ebquiYr+ebu+eciOech+echOecqeecpOecnuecpeecpuecm+ect+ecuOedh+edmuedqOedq+edm+edpeedv+edvuedueeejueei+eekeeeoOeenueesOeetueeueeev+eevOeeveeeu+efh+efjeefl+efmuefnOefo+efruefvOegjOegkuekpuegoOekquehheeijuehtOeihuehvOeimueijOeio+eiteeiqueir+ejkeejhueji+ejlOeivueivOejheejiuejrFwiXG5cdF0sXG5cdFtcblx0XHRcImUyNDBcIixcblx0XHRcIuejp+ejmuejveejtOekh+ekkuekkeekmeekrOekq+elgOeloOell+eln+elmuelleelk+eluuelv+emiuemneemp+m9i+emquemruems+emueemuuenieenleenp+enrOenoeeno+eoiOeojeeomOeomeeooOeon+emgOeoseeou+eovueot+epg+epl+epieepoeepouepqem+neepsOepueepveeqiOeql+eqleeqmOeqlueqqeeriOeqsFwiXG5cdF0sXG5cdFtcblx0XHRcImUyODBcIixcblx0XHRcIueqtuerheerhOeqv+mCg+erh+eriuerjeerj+erleerk+ermeermuerneeroeerouerpuerreersOesguesj+esiueshuess+esmOesmeesnuesteesqOestuetkOetuueshOetjeesi+etjOetheetteetpeettOetp+etsOetseetrOetrueuneeumOeun+eujeeunOeumueui+eukueuj+etneeumeevi+evgeevjOevj+eutOevhuevneevqeewkeewlOevpuevpeexoOewgOewh+ewk+evs+evt+ewl+ewjeevtuewo+ewp+ewquewn+ewt+ewq+ewveexjOexg+exlOexj+exgOexkOexmOexn+expOexluexpeexrOexteeyg+eykOeypOeyreeyoueyq+eyoeeyqOeys+eysueyseeyrueyueeyveezgOezheezguezmOezkueznOezoumsu+ezr+ezsueztOeztuezuue0hlwiXG5cdF0sXG5cdFtcblx0XHRcImUzNDBcIixcblx0XHRcIue0gue0nOe0lee0iue1hee1i+e0rue0sue0v+e0tee1hue1s+e1lue1jue1sue1qOe1rue1j+e1o+e2k+e2iee1m+e2j+e1vee2m+e2uue2rue2o+e2tee3h+e2vee2q+e4vee2oue2r+e3nOe2uOe2n+e2sOe3mOe3nee3pOe3nue3u+e3sue3oee4hee4iue4o+e4oee4kue4see4n+e4iee4i+e4oue5hue5pue4u+e4tee4uee5g+e4t1wiXG5cdF0sXG5cdFtcblx0XHRcImUzODBcIixcblx0XHRcIue4sue4uue5p+e5nee5lue5nue5mee5mue5uee5que5qee5vOe5u+e6g+e3lee5vei+rue5v+e6iOe6iee6jOe6kue6kOe6k+e6lOe6lue6jue6m+e6nOe8uOe8uue9hee9jOe9jee9jue9kOe9kee9lee9lOe9mOe9n+e9oOe9qOe9qee9p+e9uOe+gue+hue+g+e+iOe+h+e+jOe+lOe+nue+nee+mue+o+e+r+e+sue+uee+rue+tue+uOitsee/hee/hue/iue/lee/lOe/oee/pue/qee/s+e/uemjnOiAhuiAhOiAi+iAkuiAmOiAmeiAnOiAoeiAqOiAv+iAu+iBiuiBhuiBkuiBmOiBmuiBn+iBouiBqOiBs+iBsuiBsOiBtuiBueiBveiBv+iChOiChuiCheiCm+iCk+iCmuiCreWGkOiCrOiDm+iDpeiDmeiDneiDhOiDmuiDluiEieiDr+iDseiEm+iEqeiEo+iEr+iFi1wiXG5cdF0sXG5cdFtcblx0XHRcImU0NDBcIixcblx0XHRcIumai+iFhuiEvuiFk+iFkeiDvOiFseiFruiFpeiFpuiFtOiGg+iGiOiGiuiGgOiGguiGoOiGleiGpOiGo+iFn+iGk+iGqeiGsOiGteiGvuiGuOiGveiHgOiHguiGuuiHieiHjeiHkeiHmeiHmOiHiOiHmuiHn+iHoOiHp+iHuuiHu+iHvuiIgeiIguiIheiIh+iIiuiIjeiIkOiIluiIqeiIq+iIuOiIs+iJgOiJmeiJmOiJneiJmuiJn+iJpFwiXG5cdF0sXG5cdFtcblx0XHRcImU0ODBcIixcblx0XHRcIuiJouiJqOiJquiJq+iIruiJseiJt+iJuOiJvuiKjeiKkuiKq+iKn+iKu+iKrOiLoeiLo+iLn+iLkuiLtOiLs+iLuuiOk+iMg+iLu+iLueiLnuiMhuiLnOiMieiLmeiMteiMtOiMluiMsuiMseiNgOiMueiNkOiNheiMr+iMq+iMl+iMmOiOheiOmuiOquiOn+iOouiOluiMo+iOjuiOh+iOiuiNvOiOteiNs+iNteiOoOiOieiOqOiPtOiQk+iPq+iPjuiPveiQg+iPmOiQi+iPgeiPt+iQh+iPoOiPsuiQjeiQouiQoOiOveiQuOiUhuiPu+iRreiQquiQvOiVmuiShOiRt+iRq+iSreiRruiSguiRqeiRhuiQrOiRr+iRueiQteiTiuiRouiSueiSv+iSn+iTmeiTjeiSu+iTmuiTkOiTgeiThuiTluiSoeiUoeiTv+iTtOiUl+iUmOiUrOiUn+iUleiUlOiTvOiVgOiVo+iVmOiViFwiXG5cdF0sXG5cdFtcblx0XHRcImU1NDBcIixcblx0XHRcIuiVgeiYguiVi+iVleiWgOiWpOiWiOiWkeiWiuiWqOiVreiWlOiWm+iXquiWh+iWnOiVt+iVvuiWkOiXieiWuuiXj+iWueiXkOiXleiXneiXpeiXnOiXueiYiuiYk+iYi+iXvuiXuuiYhuiYouiYmuiYsOiYv+iZjeS5leiZlOiZn+iZp+iZseiak+iao+iaqeiaquiai+iajOiatuiar+ibhOibhuiasOibieigo+iaq+iblOibnuibqeibrFwiXG5cdF0sXG5cdFtcblx0XHRcImU1ODBcIixcblx0XHRcIuibn+ibm+ibr+ickuichuiciOicgOicg+ibu+ickeicieicjeibueiciuictOicv+ict+icu+icpeicqeicmuidoOidn+iduOidjOidjuidtOidl+idqOidruidmeidk+ido+idquigheieouien+ieguier+ifi+ieveifgOifkOmbluieq+ifhOies+ifh+ifhuieu+ifr+ifsuifoOigj+igjeifvuiftuift+igjuifkuigkeigluigleigouigoeigseigtuigueigp+igu+ihhOihguihkuihmeihnuihouihq+iigeihvuiinuihteihveiiteihsuiiguiil+iikuiiruiimeiiouiijeiipOiisOiiv+iiseijg+ijhOijlOijmOijmeijneijueikguijvOijtOijqOijsuikhOikjOikiuikk+ilg+iknuikpeikquikq+ilgeilhOiku+iktuikuOiljOikneiloOilnlwiXG5cdF0sXG5cdFtcblx0XHRcImU2NDBcIixcblx0XHRcIuilpuilpOilreilquilr+iltOilt+ilvuimg+imiOimiuimk+immOimoeimqeimpuimrOimr+imsuimuuimveimv+ingOinmuinnOinneinp+intOinuOiog+ioluiokOiojOiom+ioneiopeiotuipgeipm+ipkuiphuipiOipvOipreiprOipouiqheiqguiqhOiqqOiqoeiqkeiqpeiqpuiqmuiqo+irhOirjeirguirmuirq+irs+irp1wiXG5cdF0sXG5cdFtcblx0XHRcImU2ODBcIixcblx0XHRcIuirpOirseislOiroOirouirt+irnuirm+isjOish+ismuiroeisluiskOisl+isoOiss+meq+ispuisq+isvuisqOitgeitjOitj+itjuitieitluitm+itmuitq+itn+itrOitr+ittOitveiugOiujOiujuiukuiuk+iuluiumeiumuiwuuixgeiwv+ixiOixjOixjuixkOixleixouixrOixuOixuuiyguiyieiyheiyiuiyjeiyjuiylOixvOiymOaIneiyreiyquiyveiysuiys+iyruiytuiziOizgeizpOizo+izmuizveizuuizu+i0hOi0hei0iui0h+i0j+i0jei0kOm9jui0k+izjei0lOi0lui1p+i1rei1sei1s+i2gei2mei3gui2vui2uui3j+i3mui3lui3jOi3m+i3i+i3qui3q+i3n+i3o+i3vOi4iOi4iei3v+i4nei4nui4kOi4n+i5gui4tei4sOi4tOi5ilwiXG5cdF0sXG5cdFtcblx0XHRcImU3NDBcIixcblx0XHRcIui5h+i5iei5jOi5kOi5iOi5mei5pOi5oOi4qui5o+i5lei5tui5sui5vOi6gei6h+i6hei6hOi6i+i6iui6k+i6kei6lOi6mei6qui6oei6rOi6sOi7hui6sei6vui7hei7iOi7i+i7m+i7o+i7vOi7u+i7q+i7vui8iui8hei8lei8kui8mei8k+i8nOi8n+i8m+i8jOi8pui8s+i8u+i8uei9hei9gui8vui9jOi9iei9hui9jui9l+i9nFwiXG5cdF0sXG5cdFtcblx0XHRcImU3ODBcIixcblx0XHRcIui9oui9o+i9pOi+nOi+n+i+o+i+rei+r+i+t+i/mui/pei/oui/qui/r+mCh+i/tOmAhei/uei/uumAkemAlemAoemAjemAnumAlumAi+mAp+mAtumAtemAuei/uOmBj+mBkOmBkemBkumAjumBiemAvumBlumBmOmBnumBqOmBr+mBtumaqOmBsumCgumBvemCgemCgOmCiumCiemCj+mCqOmCr+mCsemCtemDoumDpOaJiOmDm+mEgumEkumEmemEsumEsOmFiumFlumFmOmFo+mFpemFqemFs+mFsumGi+mGiemGgumGoumGq+mGr+mGqumGtemGtOmGuumHgOmHgemHiemHi+mHkOmHlumHn+mHoemHm+mHvOmHtemHtumInumHv+mIlOmIrOmIlemIkemJnumJl+mJhemJiemJpOmJiOmKlemIv+mJi+mJkOmKnOmKlumKk+mKm+mJmumLj+mKuemKt+mLqemMj+mLuumNhOmMrlwiXG5cdF0sXG5cdFtcblx0XHRcImU4NDBcIixcblx0XHRcIumMmemMoumMmumMo+mMuumMtemMu+mNnOmNoOmNvOmNrumNlumOsOmOrOmOremOlOmOuemPlumPl+mPqOmPpemPmOmPg+mPnemPkOmPiOmPpOmQmumQlOmQk+mQg+mQh+mQkOmQtumQq+mQtemQoemQuumRgemRkumRhOmRm+mRoOmRoumRnumRqumIqemRsOmRtemRt+mRvemRmumRvOmRvumSgemRv+mWgumWh+mWiumWlOmWlumWmOmWmVwiXG5cdF0sXG5cdFtcblx0XHRcImU4ODBcIixcblx0XHRcIumWoOmWqOmWp+mWremWvOmWu+mWuemWvumXiua/tumXg+mXjemXjOmXlemXlOmXlumXnOmXoemXpemXoumYoemYqOmYrumYr+mZgumZjOmZj+mZi+mZt+mZnOmZnumZnemZn+mZpumZsumZrOmajemamOmalemal+maqumap+masemasumasOmatOmatumauOmauembjumbi+mbiembjeiljembnOmcjemblembuemchOmchumciOmck+mcjumckemcj+mclumcmemcpOmcqumcsOmcuemcvemcvumdhOmdhumdiOmdgumdiemdnOmdoOmdpOmdpumdqOWLkumdq+mdsemduemehemdvOmegemduumehumei+mej+mekOmenOmeqOmepumeo+mes+metOmfg+mfhumfiOmfi+mfnOmfrem9j+mfsuern+mftumftemgj+mgjOmguOmgpOmgoemgt+mgvemhhumhj+mhi+mhq+mhr+mhsFwiXG5cdF0sXG5cdFtcblx0XHRcImU5NDBcIixcblx0XHRcIumhsemhtOmhs+miqumir+misemitumjhOmjg+mjhumjqemjq+mkg+mkiemkkumklOmkmOmkoemknemknumkpOmkoOmkrOmkrumkvemkvumlgumliemlhemlkOmli+mlkemlkumljOmllemml+mmmOmmpemmremmrummvOmnn+mnm+mnnemnmOmnkemnremnrumnsemnsumnu+mnuOmogemoj+mohemnoumomemoq+mot+mphempgumpgOmpg1wiXG5cdF0sXG5cdFtcblx0XHRcImU5ODBcIixcblx0XHRcIumovumplempjempm+mpl+mpn+mpoumppemppOmpqempq+mpqumqremqsOmqvOmrgOmrj+mrkemrk+mrlOmrnumrn+mroumro+mrpumrr+mrq+mrrumrtOmrsemrt+mru+mshumsmOmsmumsn+msoumso+mspemsp+msqOmsqemsqumsrumsr+mssumthOmtg+mtj+mtjemtjumtkemtmOmttOmuk+mug+mukemulumul+mun+muoOmuqOmutOmvgOmviumuuemvhumvj+mvkemvkumvo+mvoumvpOmvlOmvoemwuumvsumvsemvsOmwlemwlOmwiemwk+mwjOmwhumwiOmwkumwiumwhOmwrumwm+mwpemwpOmwoemwsOmxh+mwsumxhumwvumxmumxoOmxp+mxtumxuOmzp+mzrOmzsOm0iem0iOmzq+m0g+m0hum0qum0pum2r+m0o+m0n+m1hOm0lem0kum1gem0v+m0vum1hum1iFwiXG5cdF0sXG5cdFtcblx0XHRcImVhNDBcIixcblx0XHRcIum1nem1num1pOm1kem1kOm1mem1sum2iem2h+m2q+m1r+m1uum2mum2pOm2qem2sum3hOm3gem2u+m2uOm2uum3hum3j+m3gum3mem3k+m3uOm3pum3rem3r+m3vem4mum4m+m4num5tem5uem5vem6gem6iOm6i+m6jOm6kum6lem6kem6nem6pem6qem6uOm6qum6remdoem7jOm7jum7j+m7kOm7lOm7nOm7num7nem7oOm7pem7qOm7r1wiXG5cdF0sXG5cdFtcblx0XHRcImVhODBcIixcblx0XHRcIum7tOm7tum7t+m7uem7u+m7vOm7vem8h+m8iOeat+m8lem8oem8rOm8vum9ium9kum9lOm9o+m9n+m9oOm9oem9pum9p+m9rOm9qum9t+m9sum9tum+lem+nOm+oOWgr+anh+mBmeeRpOWHnOeGmVwiXG5cdF0sXG5cdFtcblx0XHRcImVkNDBcIixcblx0XHRcIue6iuiknOmNiOmKiOiTnOS/ieeCu+aYseajiOmLueabu+W9heS4qOS7oeS7vOS8gOS8g+S8ueS9luS+kuS+iuS+muS+lOS/jeWBgOWAouS/v+WAnuWBhuWBsOWBguWClOWDtOWDmOWFiuWFpOWGneWGvuWHrOWIleWKnOWKpuWLgOWLm+WMgOWMh+WMpOWNsuWOk+WOsuWPne+ojuWSnOWSiuWSqeWTv+WWhuWdmeWdpeWerOWfiOWfh++oj1wiXG5cdF0sXG5cdFtcblx0XHRcImVkODBcIixcblx0XHRcIu+okOWinuWisuWki+Wlk+Wlm+WlneWlo+WmpOWmuuWtluWvgOeUr+WvmOWvrOWwnuWypuWyuuWzteW0p+W1k++okeW1guW1reW2uOW2ueW3kOW8oeW8tOW9p+W+t+W/nuaBneaCheaCiuaDnuaDleaEoOaDsuaEkeaEt+aEsOaGmOaIk+aKpuaPteaRoOaSneaTjuaVjuaYgOaYleaYu+aYieaYruaYnuaYpOaZpeaZl+aZme+okuaZs+aameaaoOaasuaav+abuuacju+kqeadpuaeu+ahkuafgOaggeahhOajj++ok+alqO+olOammOanouaosOapq+aphuaps+apvuarouarpOavluawv+axnOayhuaxr+azmua0hOa2h+a1r+a2lua2rOa3j+a3uOa3sua3vOa4uea5nOa4p+a4vOa6v+a+iOa+tea/teeAheeAh+eAqOeCheeCq+eEj+eEhOeFnOeFhueFh++oleeHgeeHvueKsVwiXG5cdF0sXG5cdFtcblx0XHRcImVlNDBcIixcblx0XHRcIueKvueMpO+olueNt+eOveePieePluePo+ePkueQh+ePteeQpueQqueQqeeQrueRoueSieeSn+eUgeeVr+eagueanOeanueam+eapu+ol+edhuWKr+egoeehjuehpOehuueksO+omO+ome+omuemlO+om+emm+erkeerp++onOerq+eunu+onee1iOe1nOe2t+e2oOe3lue5kue9h+e+oe+onuiMgeiNouiNv+iPh+iPtuiRiOiStOiVk+iVmVwiXG5cdF0sXG5cdFtcblx0XHRcImVlODBcIixcblx0XHRcIuiVq++on+iWsO+ooO+ooeigh+ijteiokuiot+ipueiqp+iqvuirn++oouirtuitk+itv+izsOiztOi0kui1tu+oo+i7j++opO+opemBp+mDnu+opumElemEp+mHmumHl+mHnumHremHrumHpOmHpemIhumIkOmIiumIuumJgOmIvOmJjumJmemJkemIuemJp+mKp+mJt+mJuOmLp+mLl+mLmemLkO+op+mLlemLoOmLk+mMpemMoemLu++oqOmMnumLv+mMnemMgumNsOmNl+mOpOmPhumPnumPuOmQsemRhemRiOmWku+nnO+oqemanemar+mcs+mcu+mdg+mdjemdj+mdkemdlemhl+mhpe+oqu+oq+mkp++orOmmnumpjumrmemrnOmttemtsumuj+musemuu+mwgOm1sOm1q++orem4mem7kVwiXG5cdF0sXG5cdFtcblx0XHRcImVlZWZcIixcblx0XHRcIuKFsFwiLFxuXHRcdDksXG5cdFx0XCLvv6Lvv6TvvIfvvIJcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMDQwXCIsXG5cdFx0XCLugIBcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmMDgwXCIsXG5cdFx0XCLugL9cIixcblx0XHQxMjRcblx0XSxcblx0W1xuXHRcdFwiZjE0MFwiLFxuXHRcdFwi7oK8XCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjE4MFwiLFxuXHRcdFwi7oO7XCIsXG5cdFx0MTI0XG5cdF0sXG5cdFtcblx0XHRcImYyNDBcIixcblx0XHRcIu6FuFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImYyODBcIixcblx0XHRcIu6Gt1wiLFxuXHRcdDEyNFxuXHRdLFxuXHRbXG5cdFx0XCJmMzQwXCIsXG5cdFx0XCLuiLRcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmMzgwXCIsXG5cdFx0XCLuibNcIixcblx0XHQxMjRcblx0XSxcblx0W1xuXHRcdFwiZjQ0MFwiLFxuXHRcdFwi7ouwXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjQ4MFwiLFxuXHRcdFwi7oyvXCIsXG5cdFx0MTI0XG5cdF0sXG5cdFtcblx0XHRcImY1NDBcIixcblx0XHRcIu6OrFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImY1ODBcIixcblx0XHRcIu6Pq1wiLFxuXHRcdDEyNFxuXHRdLFxuXHRbXG5cdFx0XCJmNjQwXCIsXG5cdFx0XCLukahcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmNjgwXCIsXG5cdFx0XCLukqdcIixcblx0XHQxMjRcblx0XSxcblx0W1xuXHRcdFwiZjc0MFwiLFxuXHRcdFwi7pSkXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjc4MFwiLFxuXHRcdFwi7pWjXCIsXG5cdFx0MTI0XG5cdF0sXG5cdFtcblx0XHRcImY4NDBcIixcblx0XHRcIu6XoFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImY4ODBcIixcblx0XHRcIu6Yn1wiLFxuXHRcdDEyNFxuXHRdLFxuXHRbXG5cdFx0XCJmOTQwXCIsXG5cdFx0XCLumpxcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYTQwXCIsXG5cdFx0XCLihbBcIixcblx0XHQ5LFxuXHRcdFwi4oWgXCIsXG5cdFx0OSxcblx0XHRcIu+/ou+/pO+8h++8guOIseKEluKEoeKItee6iuiknOmNiOmKiOiTnOS/ieeCu+aYseajiOmLueabu+W9heS4qOS7oeS7vOS8gOS8g+S8ueS9luS+kuS+iuS+muS+lOS/jeWBgOWAouS/v+WAnuWBhuWBsOWBguWClOWDtOWDmOWFilwiXG5cdF0sXG5cdFtcblx0XHRcImZhODBcIixcblx0XHRcIuWFpOWGneWGvuWHrOWIleWKnOWKpuWLgOWLm+WMgOWMh+WMpOWNsuWOk+WOsuWPne+ojuWSnOWSiuWSqeWTv+WWhuWdmeWdpeWerOWfiOWfh++oj++okOWinuWisuWki+Wlk+Wlm+WlneWlo+WmpOWmuuWtluWvgOeUr+WvmOWvrOWwnuWypuWyuuWzteW0p+W1k++okeW1guW1reW2uOW2ueW3kOW8oeW8tOW9p+W+t+W/nuaBneaCheaCiuaDnuaDleaEoOaDsuaEkeaEt+aEsOaGmOaIk+aKpuaPteaRoOaSneaTjuaVjuaYgOaYleaYu+aYieaYruaYnuaYpOaZpeaZl+aZme+okuaZs+aameaaoOaasuaav+abuuacju+kqeadpuaeu+ahkuafgOaggeahhOajj++ok+alqO+olOammOanouaosOapq+aphuaps+apvuarouarpOavluawv+axnOayhuaxr+azmua0hOa2h+a1r1wiXG5cdF0sXG5cdFtcblx0XHRcImZiNDBcIixcblx0XHRcIua2lua2rOa3j+a3uOa3sua3vOa4uea5nOa4p+a4vOa6v+a+iOa+tea/teeAheeAh+eAqOeCheeCq+eEj+eEhOeFnOeFhueFh++oleeHgeeHvueKseeKvueMpO+olueNt+eOveePieePluePo+ePkueQh+ePteeQpueQqueQqeeQrueRoueSieeSn+eUgeeVr+eagueanOeanueam+eapu+ol+edhuWKr+egoeehjuehpOehuueksO+omO+omVwiXG5cdF0sXG5cdFtcblx0XHRcImZiODBcIixcblx0XHRcIu+omuemlO+om+emm+erkeerp++onOerq+eunu+onee1iOe1nOe2t+e2oOe3lue5kue9h+e+oe+onuiMgeiNouiNv+iPh+iPtuiRiOiStOiVk+iVmeiVq++on+iWsO+ooO+ooeigh+ijteiokuiot+ipueiqp+iqvuirn++oouirtuitk+itv+izsOiztOi0kui1tu+oo+i7j++opO+opemBp+mDnu+opumElemEp+mHmumHl+mHnumHremHrumHpOmHpemIhumIkOmIiumIuumJgOmIvOmJjumJmemJkemIuemJp+mKp+mJt+mJuOmLp+mLl+mLmemLkO+op+mLlemLoOmLk+mMpemMoemLu++oqOmMnumLv+mMnemMgumNsOmNl+mOpOmPhumPnumPuOmQsemRhemRiOmWku+nnO+oqemanemar+mcs+mcu+mdg+mdjemdj+mdkemdlemhl+mhpe+oqu+oq+mkp++orOmmnumpjumrmVwiXG5cdF0sXG5cdFtcblx0XHRcImZjNDBcIixcblx0XHRcIumrnOmttemtsumuj+musemuu+mwgOm1sOm1q++orem4mem7kVwiXG5cdF1cbl07XG5cbnZhciBzaGlmdGppcyQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCdkZWZhdWx0Jzogc2hpZnRqaXNcbn0pO1xuXG52YXIgZXVjanAgPSBbXG5cdFtcblx0XHRcIjBcIixcblx0XHRcIlxcdTAwMDBcIixcblx0XHQxMjdcblx0XSxcblx0W1xuXHRcdFwiOGVhMVwiLFxuXHRcdFwi772hXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiYTFhMVwiLFxuXHRcdFwi44CA44CB44CC77yM77yO44O777ya77yb77yf77yB44Kb44KcwrTvvYDCqO+8vu+/o++8v+ODveODvuOCneOCnuOAg+S7neOAheOAhuOAh+ODvOKAleKAkO+8j++8vO+9nuKIpe+9nOKApuKApeKAmOKAmeKAnOKAne+8iO+8ieOAlOOAle+8u++8ve+9m++9neOAiFwiLFxuXHRcdDksXG5cdFx0XCLvvIvvvI3CscOXw7fvvJ3iiaDvvJzvvJ7iiabiiafiiJ7iiLTimYLimYDCsOKAsuKAs+KEg++/pe+8hO+/oO+/oe+8he+8g++8hu+8iu+8oMKn4piG4piF4peL4peP4peO4peHXCJcblx0XSxcblx0W1xuXHRcdFwiYTJhMVwiLFxuXHRcdFwi4peG4pah4pag4paz4pay4pa94pa84oC744CS4oaS4oaQ4oaR4oaT44CTXCJcblx0XSxcblx0W1xuXHRcdFwiYTJiYVwiLFxuXHRcdFwi4oiI4oiL4oqG4oqH4oqC4oqD4oiq4oipXCJcblx0XSxcblx0W1xuXHRcdFwiYTJjYVwiLFxuXHRcdFwi4oin4oio77+i4oeS4oeU4oiA4oiDXCJcblx0XSxcblx0W1xuXHRcdFwiYTJkY1wiLFxuXHRcdFwi4oig4oql4oyS4oiC4oiH4omh4omS4omq4omr4oia4oi94oid4oi14oir4oisXCJcblx0XSxcblx0W1xuXHRcdFwiYTJmMlwiLFxuXHRcdFwi4oSr4oCw4pmv4pmt4pmq4oCg4oChwrZcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMmZlXCIsXG5cdFx0XCLil69cIlxuXHRdLFxuXHRbXG5cdFx0XCJhM2IwXCIsXG5cdFx0XCLvvJBcIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcImEzYzFcIixcblx0XHRcIu+8oVwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcImEzZTFcIixcblx0XHRcIu+9gVwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcImE0YTFcIixcblx0XHRcIuOBgVwiLFxuXHRcdDgyXG5cdF0sXG5cdFtcblx0XHRcImE1YTFcIixcblx0XHRcIuOCoVwiLFxuXHRcdDg1XG5cdF0sXG5cdFtcblx0XHRcImE2YTFcIixcblx0XHRcIs6RXCIsXG5cdFx0MTYsXG5cdFx0XCLOo1wiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiYTZjMVwiLFxuXHRcdFwizrFcIixcblx0XHQxNixcblx0XHRcIs+DXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJhN2ExXCIsXG5cdFx0XCLQkFwiLFxuXHRcdDUsXG5cdFx0XCLQgdCWXCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiYTdkMVwiLFxuXHRcdFwi0LBcIixcblx0XHQ1LFxuXHRcdFwi0ZHQtlwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcImE4YTFcIixcblx0XHRcIuKUgOKUguKUjOKUkOKUmOKUlOKUnOKUrOKUpOKUtOKUvOKUgeKUg+KUj+KUk+KUm+KUl+KUo+KUs+KUq+KUu+KVi+KUoOKUr+KUqOKUt+KUv+KUneKUsOKUpeKUuOKVglwiXG5cdF0sXG5cdFtcblx0XHRcImFkYTFcIixcblx0XHRcIuKRoFwiLFxuXHRcdDE5LFxuXHRcdFwi4oWgXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCJhZGMwXCIsXG5cdFx0XCLjjYnjjJTjjKLjjY3jjJjjjKfjjIPjjLbjjZHjjZfjjI3jjKbjjKPjjKvjjYrjjLvjjpzjjp3jjp7jjo7jjo/jj4TjjqFcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZGRmXCIsXG5cdFx0XCLjjbvjgJ3jgJ/ihJbjj43ihKHjiqRcIixcblx0XHQ0LFxuXHRcdFwi44ix44iy44i5442+442944284omS4omh4oir4oiu4oiR4oia4oql4oig4oif4oq/4oi14oip4oiqXCJcblx0XSxcblx0W1xuXHRcdFwiYjBhMVwiLFxuXHRcdFwi5Lqc5ZSW5aiD6Zi/5ZOA5oSb5oyo5ae26YCi6JG16Iyc56mQ5oKq5o+h5ril5pet6JGm6Iqm6a+15qKT5Zyn5pah5omx5a6b5aeQ6Jm76aO057Wi57a+6a6O5oiW57Kf6KK35a6J5bq15oyJ5pqX5qGI6ZeH6Z6N5p2P5Lul5LyK5L2N5L6d5YGJ5Zuy5aS35aeU5aiB5bCJ5oOf5oSP5oWw5piT5qSF54K655WP55Ww56e757at57ev6IOD6JCO6KGj6KyC6YGV6YG65Yy75LqV5Lql5Z+f6IKy6YOB56Ov5LiA5aOx5rqi6YC456iy6Iyo6IqL6bCv5YWB5Y2w5ZK95ZOh5Zug5ae75byV6aOy5rer6IOk6JStXCJcblx0XSxcblx0W1xuXHRcdFwiYjFhMVwiLFxuXHRcdFwi6Zmi6Zmw6Zqg6Z+75ZCL5Y+z5a6H54OP57696L+C6Zuo5Y2v6bWc56q65LiR56KT6Ie85rim5ZiY5ZSE5qyd6JSa6bC75ael5Y6p5rWm55Oc6ZaP5ZmC5LqR6YGL6Zuy6I2P6aSM5Y+h5Za25ayw5b2x5pig5puz5qCE5rC45rOz5rSp55Gb55uI56mO6aC06Iux6KGb6Kmg6Yut5ray55ar55uK6aeF5oKm6KyB6LaK6Zay5qaO5Y6t5YaG5ZyS5aCw5aWE5a605bu25oCo5o6p5o+05rK/5ryU54KO54SU54WZ54eV54y/57iB6Im26IuR6JaX6YGg6Ymb6bSb5aGp5pa85rGa55Sl5Ye55aSu5aWl5b6A5b+cXCJcblx0XSxcblx0W1xuXHRcdFwiYjJhMVwiLFxuXHRcdFwi5oq85pe65qiq5qyn5q60546L57+B6KWW6bSs6bSO6buE5bKh5rKW6I275YSE5bGL5oa26IeG5qG254mh5LmZ5L+65Y245oGp5rip56mP6Z+z5LiL5YyW5Luu5L2V5Ly95L6h5L2z5Yqg5Y+v5ZiJ5aSP5auB5a625a+h56eR5pqH5p6c5p625q2M5rKz54Gr54+C56aN56a+56i8566H6Iqx6Iub6IyE6I236I+v6I+T6J2m6Kqy5Zip6LKo6L+m6YGO6Zye6JqK5L+E5bOo5oiR54mZ55S76Iel6Iq96Ju+6LOA6ZuF6aST6aeV5LuL5Lya6Kej5Zue5aGK5aOK5bu75b+r5oCq5oKU5oGi5oeQ5oiS5ouQ5pS5XCJcblx0XSxcblx0W1xuXHRcdFwiYjNhMVwiLFxuXHRcdFwi6a2B5pmm5qKw5rW354Gw55WM55qG57W16Iql6J+56ZaL6ZqO6LKd5Yex5Yq+5aSW5ZKz5a6z5bSW5oWo5qaC5rav56KN6JOL6KGX6Kmy6Y6n6aq45rWs6aao6JuZ5Z6j5p+/6JuO6YiO5YqD5ZqH5ZCE5buT5ouh5pK55qC85qC45q67542y56K656mr6Kaa6KeS6LWr6LyD6YOt6Zaj6ZqU6Z2p5a2m5bKz5qW96aGN6aGO5o6b56yg5qir5qm/5qK26bCN5r2f5Ymy5Zad5oGw5ous5rS75riH5ruR6JGb6KSQ6L2E5LiU6bC55Y+25qSb5qi66Z6E5qCq5YWc56uD6JKy6Yec6Y6M5Zmb6bSo5qCi6IyF6JCxXCJcblx0XSxcblx0W1xuXHRcdFwiYjRhMVwiLFxuXHRcdFwi57Kl5YiI6IuF55Om5Lm+5L6D5Yag5a+S5YiK5YuY5Yun5be75Zaa5aCq5aem5a6M5a6Y5a+b5bmy5bm55oKj5oSf5oWj5oa+5o+b5pWi5p+R5qGT5qO65qy+5q2T5rGX5ryi5r6X5r2F55Kw55SY55uj55yL56u/566h57Ch57ep57y257+w6IKd6Imm6I6e6Kaz6KuM6LKr6YKE6ZGR6ZaT6ZaR6Zai6Zml6Z+T6aSo6IiY5Li45ZCr5bK45beM546p55mM55y85bKp57+r6LSL6ZuB6aCR6aGU6aGY5LyB5LyO5Y2x5Zac5Zmo5Z+65aWH5ayJ5a+E5bKQ5biM5bm+5b+M5o+u5py65peX5pei5pyf5qOL5qOEXCJcblx0XSxcblx0W1xuXHRcdFwiYjVhMVwiLFxuXHRcdFwi5qmf5biw5q+F5rCX5rG955W/56WI5a2j56iA57SA5b696KaP6KiY6LK06LW36LuM6Lyd6aOi6aiO6ay85LqA5YG95YSA5aaT5a6c5oiv5oqA5pOs5qy654qg55aR56WH576p6J+76Kq86K2w5o6s6I+K6Z6g5ZCJ5ZCD5Zar5qGU5qmY6Kmw56Cn5p216buN5Y205a6i6ISa6JmQ6YCG5LiY5LmF5LuH5LyR5Y+K5ZC45a6u5byT5oCl5pWR5py95rGC5rGy5rOj54G455CD56m256qu56yI57Sa57O+57Wm5pen54mb5Y675bGF5beo5ouS5oug5oyZ5rig6Jma6Kix6Led6Yu45ryB56am6a2a5Lqo5Lqr5LqsXCJcblx0XSxcblx0W1xuXHRcdFwiYjZhMVwiLFxuXHRcdFwi5L6b5L6g5YOR5YWH56u25YWx5Ye25Y2U5Yyh5Y2/5Y+r5Zas5aKD5bOh5by35b2K5oCv5oGQ5oGt5oyf5pWZ5qmL5rOB54uC54ut55+v6IO46ISF6IiI6JWO6YO36Y+h6Z+/6aWX6ama5Luw5Yed5bCt5pqB5qWt5bGA5puy5qW1546J5qGQ57KB5YOF5Yuk5Z2H5be+6Yym5pak5qyj5qy955C056aB56a9562L57eK6Iq56I+M6KG/6KWf6Ky56L+R6YeR5ZCf6YqA5Lmd5YC25Y+l5Yy654uX546W55+p6Ium6Lqv6aeG6aeI6aeS5YW35oSa6Jme5Zaw56m65YG25a+T6YGH6ZqF5Liy5qub6Yen5bGR5bGIXCJcblx0XSxcblx0W1xuXHRcdFwiYjdhMVwiLFxuXHRcdFwi5o6Y56qf5rKT6Z206L2h56qq54aK6ZqI57KC5qCX57mw5qGR6Y2s5Yuy5ZCb6Jar6KiT576k6LuN6YOh5Y2m6KKI56WB5L+C5YK+5YiR5YWE5ZWT5Zyt54+q5Z6L5aWR5b2i5b6E5oG15oW25oWn5oap5o6y5pC65pWs5pmv5qGC5riT55Wm56i957O757WM57aZ57mL572r6IyO6I2K6JuN6KiI6Kmj6K2m6Lu96aCa6baP6Iq46L+O6a+o5YqH5oif5pKD5r+A6ZqZ5qGB5YKR5qyg5rG65r2U56m057WQ6KGA6Kij5pyI5Lu25YC55YCm5YGl5YW85Yi45Ymj5Zan5ZyP5aCF5auM5bu65oay5oe45ouz5o2yXCJcblx0XSxcblx0W1xuXHRcdFwiYjhhMVwiLFxuXHRcdFwi5qSc5qip54m954qs54yu56CU56Gv57W555yM6IKp6KaL6KyZ6LOi6LuS6YGj6Y216Zm66aGV6aiT6bm45YWD5Y6f5Y6z5bm75bym5rib5rqQ546E54++57WD6Ii36KiA6Ku66ZmQ5LmO5YCL5Y+k5ZG85Zu65aeR5a2k5bex5bqr5byn5oi45pWF5p6v5rmW54uQ57OK6KK06IKh6IOh6I+w6JmO6KqH6Leo6Yi36ZuH6aGn6byT5LqU5LqS5LyN5Y2I5ZGJ5ZC+5aiv5b6M5b6h5oKf5qKn5qqO55Ga56KB6Kqe6Kqk6K236YaQ5Lme6a+J5Lqk5L285L6v5YCZ5YCW5YWJ5YWs5Yqf5Yq55Yu+5Y6a5Y+j5ZCRXCJcblx0XSxcblx0W1xuXHRcdFwiYjlhMVwiLFxuXHRcdFwi5ZCO5ZaJ5Z2R5Z6i5aW95a2U5a2d5a6P5bel5ben5be35bm45bqD5bqa5bq35byY5oGS5oWM5oqX5ouY5o6n5pS75piC5pmD5pu05p2t5qCh5qKX5qeL5rGf5rSq5rWp5riv5rqd55Sy55qH56Gs56i/57Og57SF57SY57We57ax6ICV6ICD6IKv6IKx6IWU6IaP6Iiq6I2S6KGM6KGh6Kyb6LKi6LO86YOK6YW16Ymx56C/6Yu86Zak6ZmN6aCF6aaZ6auY6bS75Ymb5Yqr5Y+35ZCI5aOV5ou35r+g6LGq6L2f6bq55YWL5Yi75ZGK5Zu956mA6YW36bWg6buS542E5ryJ6IWw55SR5b+95oOa6aqo54ub6L68XCJcblx0XSxcblx0W1xuXHRcdFwiYmFhMVwiLFxuXHRcdFwi5q2k6aCD5LuK5Zuw5Z2k5aK+5ama5oGo5oeH5piP5piG5qC55qKx5re355eV57S66Imu6a2C5Lqb5L2Q5Y+J5ZSG5bWv5bem5beu5p+75rKZ55Gz56CC6KmQ6Y6W6KOf5Z2Q5bqn5oyr5YK15YKs5YaN5pyA5ZOJ5aGe5aa75a6w5b2p5omN5o6h5qC95q2z5riI54G96YeH54qA56CV56Cm56Wt5paO57Sw6I+c6KOB6LyJ6Zqb5Ymk5Zyo5p2Q572q6LKh5Ya05Z2C6Ziq5aC65qaK6IK05ZKy5bSO5Z+856KV6be65L2c5YmK5ZKL5pC+5pio5pyU5p+156qE562W57Si6Yyv5qGc6a6t56y55YyZ5YaK5Yi3XCJcblx0XSxcblx0W1xuXHRcdFwiYmJhMVwiLFxuXHRcdFwi5a+f5ou25pKu5pOm5pyt5q666Jap6ZuR55qQ6a+W5o2M6YyG6a6r55q/5pmS5LiJ5YKY5Y+C5bGx5oOo5pKS5pWj5qGf54em54+K55Sj566X57qC6JqV6K6D6LOb6YW46aSQ5pas5pqr5q6L5LuV5LuU5Ly65L2/5Yi65Y+45Y+y5Zej5Zub5aOr5aeL5aeJ5ae/5a2Q5bGN5biC5bir5b+X5oCd5oyH5pSv5a2c5pav5pa95peo5p6d5q2i5q275rCP542F56WJ56eB57O457SZ57Sr6IKi6ISC6Iez6KaW6Kme6Kmp6Kmm6KqM6Kuu6LOH6LOc6ZuM6aO85q2v5LqL5Ly85L6N5YWQ5a2X5a+65oWI5oyB5pmCXCJcblx0XSxcblx0W1xuXHRcdFwiYmNhMVwiLFxuXHRcdFwi5qyh5ruL5rK754i+55K955eU56OB56S66ICM6ICz6Ieq6JKU6L6e5rGQ6bm/5byP6K2Y6bSr56u66Lu45a6N6Zur5LiD5Y+x5Z+35aSx5auJ5a6k5oKJ5rm/5ryG55a+6LOq5a6f6JSA56+g5YGy5p+06Iqd5bGh6JWK57ie6IiO5YaZ5bCE5o2o6LWm5pac54Wu56S+57SX6ICF6Kyd6LuK6YGu6JuH6YKq5YCf5Yu65bC65p2T54G854i16YWM6YeI6Yyr6Iul5a+C5byx5oO55Li75Y+W5a6I5omL5pyx5q6K54up54+g56iu6IWr6Laj6YWS6aaW5YSS5Y+X5ZGq5a+/5o6I5qi557as6ZyA5Zua5Y+O5ZGoXCJcblx0XSxcblx0W1xuXHRcdFwiYmRhMVwiLFxuXHRcdFwi5a6X5bCx5bee5L+u5oSB5ou+5rSy56eA56eL57WC57mN57+S6Iet6Iif6JKQ6KGG6KWy6K6Q6Lm06Lyv6YCx6YWL6YWs6ZuG6Yac5LuA5L2P5YWF5Y2B5b6T5oiO5p+U5rGB5riL542j57im6YeN6YqD5Y+U5aSZ5a6/5reR56Wd57iu57Kb5aG+54af5Ye66KGT6L+w5L+K5bO75pil556s56uj6Iic6ae/5YeG5b6q5pes5qWv5q6J5rez5rqW5r2k55u+57SU5beh6YG16YaH6aCG5Yem5Yid5omA5pqR5puZ5ria5bq257eS572y5pu46Jav6Je36Ku45Yqp5Y+Z5aWz5bqP5b6Q5oGV6Yuk6Zmk5YK35YSfXCJcblx0XSxcblx0W1xuXHRcdFwiYmVhMVwiLFxuXHRcdFwi5Yud5Yyg5Y2H5Y+s5ZOo5ZWG5ZSx5ZiX5aWo5aa+5ai85a615bCG5bCP5bCR5bCa5bqE5bqK5bug5b2w5om/5oqE5oub5o6M5o235piH5piM5pit5pm25p2+5qKi5qif5qi15rK85raI5riJ5rmY54S854Sm54Wn55eH55yB56Gd56SB56Wl56ew56ug56yR57Kn57S56IKW6I+W6JKL6JWJ6KGd6KOz6Kif6Ki86KmU6Kmz6LGh6LOe6Yak6Ymm6Y2+6ZCY6Zqc6Z6Y5LiK5LiI5Lie5LmX5YaX5Ymw5Z+O5aC05aOM5ayi5bi45oOF5pO+5p2h5p2W5rWE54q255Wz56mj6JK46K2y6Ya46Yyg5Zix5Z+06aO+XCJcblx0XSxcblx0W1xuXHRcdFwiYmZhMVwiLFxuXHRcdFwi5out5qSN5q6W54et57mU6IG36Imy6Kem6aOf6J2V6L6x5bC75Ly45L+h5L615ZSH5aig5a+d5a+p5b+D5oWO5oyv5paw5pmL5qOu5qab5rW45rex55Sz55a555yf56We56em57Sz6Iej6Iqv6Jaq6Kaq6Ki66Lqr6L6b6YCy6Yed6ZyH5Lq65LuB5YiD5aG15aOs5bCL55Sa5bC96IWO6KiK6L+F6Zmj6Z2t56yl6KuP6aCI6YWi5Zuz5Y6o6YCX5ZC55Z6C5bil5o6o5rC054KK552h57KL57+g6KGw6YGC6YWU6YyQ6YyY6ZqP55Ge6auE5bSH5bWp5pWw5p6i6Lao6Zub5o2u5p2J5qSZ6I+F6aCX6ZuA6KO+XCJcblx0XSxcblx0W1xuXHRcdFwiYzBhMVwiLFxuXHRcdFwi5r6E5pG65a+45LiW54Cs55Wd5piv5YeE5Yi25Yui5aeT5b6B5oCn5oiQ5pS/5pW05pif5pm05qOy5qCW5q2j5riF54my55Sf55ub57K+6IGW5aOw6KO96KW/6Kqg6KqT6KuL6YCd6YaS6Z2S6Z2Z5paJ56iO6ISG6Zq75bit5oOc5oia5pal5piU5p6Q55+z56mN57GN57i+6ISK6LKs6LWk6Leh6Lmf56Kp5YiH5ouZ5o6l5pGC5oqY6Kit56qD56+A6Kqs6Zuq57W26IiM6J2J5LuZ5YWI5Y2D5Y2g5a6j5bCC5bCW5bed5oim5omH5pKw5qCT5qC05rOJ5rWF5rSX5p+T5r2c54WO54W95peL56m/566t57eaXCJcblx0XSxcblx0W1xuXHRcdFwiYzFhMVwiLFxuXHRcdFwi57mK576o6IW66Iib6Ii56Jam6Kmu6LOO6Le16YG46YG36Yqt6YqR6ZaD6a6u5YmN5ZaE5ry454S25YWo56aF57mV6Iaz57OO5ZmM5aGR5bKo5o6q5pu+5pu95qWa54uZ55aP55aO56SO56WW56ef57KX57Sg57WE6JiH6Ki06Zi76YGh6byg5YOn5Ym15Y+M5Y+i5YCJ5Zaq5aOu5aWP54i95a6L5bGk5Yyd5oOj5oOz5o2c5o6D5oy/5o675pON5pep5pu55bej5qeN5qe95ryV54el5LqJ55ep55u456qT57Of57eP57ac6IGh6I2J6I2Y6JGs6JK86Je76KOF6LWw6YCB6YGt6Y6X6Zyc6aiS5YOP5aKX5oaOXCJcblx0XSxcblx0W1xuXHRcdFwiYzJhMVwiLFxuXHRcdFwi6IeT6JS16LSI6YCg5L+D5YG05YmH5Y2z5oGv5o2J5p2f5ris6Laz6YCf5L+X5bGe6LOK5peP57aa5Y2S6KKW5YW25o+D5a2Y5a2r5bCK5pCN5p2R6YGc5LuW5aSa5aSq5rGw6KmR5ZS+5aCV5aal5oOw5omT5p+B6Ii15qWV6ZmA6aeE6aio5L2T5aCG5a++6ICQ5bKx5biv5b6F5oCg5oWL5oi05pu/5rOw5rue6IOO6IW/6IuU6KKL6LK46YCA6YCu6ZqK6bub6a+b5Luj5Y+w5aSn56ys6YaN6aGM6be55rud54Cn5Y2T5ZWE5a6F5omY5oqe5ouT5rKi5r+v55Ci6KiX6ZC45r+B6Ku+6Iy45Yen6Ju45Y+qXCJcblx0XSxcblx0W1xuXHRcdFwiYzNhMVwiLFxuXHRcdFwi5Y+p5L2G6YGU6L6w5aWq6ISx5be956uq6L6/5qOa6LC354u46bGI5qi96Kqw5Li55Y2Y5ZiG5Z2m5ouF5o6i5pem5q2O5reh5rmb54Kt55+t56uv566q57a76IC96IOG6JuL6KqV6Y2b5Zuj5aOH5by+5pat5pqW5qqA5q6155S36KuH5YCk55+l5Zyw5byb5oGl5pm65rGg55e056ia572u6Ie06JyY6YGF6aaz56+J55Wc56u5562R6JOE6YCQ56ep56qS6Iy25auh552A5Lit5Luy5a6Z5b+g5oq95pi85p+x5rOo6Jmr6KG36Ki76YWO6Yuz6aeQ5qiX54Cm54yq6Iun6JGX6LKv5LiB5YWG5YeL5ZaL5a+1XCJcblx0XSxcblx0W1xuXHRcdFwiYzRhMVwiLFxuXHRcdFwi5biW5biz5bqB5byU5by15b2r5b605oey5oyR5pqi5pyd5r2u54mS55S655y66IG06IS56IW46J226Kq/6Kuc6LaF6Lez6Yqa6ZW36aCC6bOl5YuF5o2X55u05pyV5rKI54+N6LOD6Y6u6Zmz5rSl5aKc5qSO5qeM6L+96Y6a55eb6YCa5aGa5qCC5o605qe75L2D5rys5p+Y6L676JSm57a06Y2U5qS/5r2w5Z2q5aO35ays57Ss54iq5ZCK6Yej6ba05Lqt5L2O5YGc5YG15YmD6LKe5ZGI5aCk5a6a5bid5bqV5bqt5bu35byf5oKM5oq15oy65o+Q5qKv5rGA56KH56aO56iL57eg6ImH6KiC6Kum6LmE6YCTXCJcblx0XSxcblx0W1xuXHRcdFwiYzVhMVwiLFxuXHRcdFwi6YK46YSt6YeY6byO5rOl5pGY5pOi5pW15ru055qE56yb6YGp6Y+R5rq65ZOy5b655pKk6L2N6L+t6YmE5YW45aGr5aSp5bGV5bqX5re757qP55Sc6LK86Lui6aGb54K55Lyd5q6/5r6x55Sw6Zu75YWO5ZCQ5aC15aGX5aas5bGg5b6S5paX5p2c5rih55m76I+f6LOt6YCU6YO96Y2N56Cl56C65Yqq5bqm5Zyf5aW05oCS5YCS5YWa5Yas5YeN5YiA5ZSQ5aGU5aGY5aWX5a6V5bO25baL5oK85oqV5pCt5p2x5qGD5qK85qOf55uX5reY5rmv5rab54Gv54eI5b2T55eY56W3562J562U562S57OW57Wx5YiwXCJcblx0XSxcblx0W1xuXHRcdFwiYzZhMVwiLFxuXHRcdFwi6JGj6JWp6Jek6KiO6KyE6LGG6LiP6YCD6YCP6ZCZ6Zm26aCt6aiw6ZeY5YON5YuV5ZCM5aCC5bCO5oan5pKe5rSe556z56ul6IO06JCE6YGT6YqF5bOg6bSH5Yy/5b6X5b6z5rac54m5552j56a/56+k5q+S54us6Kqt5qCD5qmh5Ye456qB5qS05bGK6bO26Iur5a+F6YWJ54Ce5Zm45bGv5oOH5pWm5rKM6LGa6YGB6aCT5ZGR5puH6YiN5aWI6YKj5YaF5LmN5Yeq6JaZ6KyO54GY5o266Y2L5qWi6aa057iE55W35Y2X5qWg6Luf6Zuj5rGd5LqM5bC85byQ6L+p5YyC6LOR6IKJ6Jm55bu/5pel5Lmz5YWlXCJcblx0XSxcblx0W1xuXHRcdFwiYzdhMVwiLFxuXHRcdFwi5aaC5bC/6Z+u5Lu75aaK5b+N6KqN5r+h56aw56Wi5a+n6JGx54yr54ax5bm05b+15o275pKa54eD57KY5LmD5bu85LmL5Z+c5Zqi5oKp5r+D57SN6IO96ISz6Ia/6L6y6KaX6Jqk5be05oqK5pKt6KaH5p235rOi5rS+55C256C05amG57216Iqt6aas5L+z5buD5oud5o6S5pWX5p2v55uD54mM6IOM6IK66Lyp6YWN5YCN5Z+55aqS5qKF5qWz54Wk54u96LK35aOy6LOg6Zmq6YCZ6J2/56ek55+n6JCp5Lyv5Yml5Y2a5ouN5p+P5rOK55m9566U57KV6Ii26JaE6L+r5pud5ryg54iG57ib6I6r6aeB6bqmXCJcblx0XSxcblx0W1xuXHRcdFwiYzhhMVwiLFxuXHRcdFwi5Ye9566x56Gy56646IKH562I5quo5bmh6IKM55WR55Wg5YWr6Ymi5rqM55m66YaX6auq5LyQ572w5oqc562P6Zal6bOp5Zm65aGZ6Juk6Zq85Ly05Yik5Y2K5Y+N5Y+b5biG5pCs5paR5p2/5rC+5rGO54mI54qv54+t55WU57mB6Iis6Jep6LKp56+E6YeG54Wp6aCS6aOv5oy95pmp55Wq55uk56OQ6JWD6Juu5Yyq5Y2R5ZCm5aaD5bqH5b285oKy5omJ5om55oqr5paQ5q+U5rOM55ay55qu56KR56eY57eL57236IKl6KKr6Kq56LK76YG/6Z2e6aOb5qiL57C45YKZ5bC+5b6u5p6H5q+Y55C155yJ576OXCJcblx0XSxcblx0W1xuXHRcdFwiYzlhMVwiLFxuXHRcdFwi6by75p+K56iX5Yy555aL6aut5b2m6Iad6I+x6IKY5by85b+F55Wi562G6YC85qGn5aer5aqb57SQ55m+6Kys5L+15b2q5qiZ5rC35ryC55Oi56Wo6KGo6KmV6LG55buf5o+P55eF56eS6IuX6Yyo6Yuy6JKc6Jut6bCt5ZOB5b2s5paM5rWc54CV6LKn6LOT6aC75pWP55O25LiN5LuY5Z+g5aSr5amm5a+M5Yao5biD5bqc5oCW5om25pW35pan5pmu5rWu54i256ym6IWQ6Iaa6IqZ6K2c6LKg6LOm6LW06Zic6ZmE5L6u5pKr5q2m6Iie6JGh6JWq6YOo5bCB5qWT6aKo6JG66JWX5LyP5Ymv5b6p5bmF5pyNXCJcblx0XSxcblx0W1xuXHRcdFwiY2FhMVwiLFxuXHRcdFwi56aP6IW56KSH6KaG5re15byX5omV5rK45LuP54mp6a6S5YiG5ZC75Zm05aKz5oak5omu54Sa5aWu57KJ57Oe57Sb6Zuw5paH6IGe5LiZ5L215YW15aGA5bmj5bmz5byK5p+E5Lim6JS96ZaJ6Zmb57Gz6aCB5YO75aOB55mW56Kn5Yil556l6JSR566G5YGP5aSJ54mH56+H57eo6L666L+U6YGN5L6/5YuJ5aip5byB6Z6t5L+d6IiX6Yuq5ZyD5o2V5q2p55Sr6KOc6LyU56mC5Yuf5aKT5oWV5oiK5pqu5q+N57C/6I+p5YCj5L+45YyF5ZGG5aCx5aWJ5a6d5bOw5bOv5bSp5bqW5oqx5o2n5pS+5pa55pyLXCJcblx0XSxcblx0W1xuXHRcdFwiY2JhMVwiLFxuXHRcdFwi5rOV5rOh54O556Cy57ir6IOe6Iqz6JCM6JOs6JyC6KSS6Kiq6LGK6YKm6YuS6aO96bOz6bWs5LmP5Lqh5YKN5YmW5Z2K5aao5bi95b+Y5b+Z5oi/5pq05pyb5p+Q5qOS5YaS57Sh6IKq6Iao6KyA6LKM6LK/6Ym+6Ziy5ZCg6aCs5YyX5YOV5Y2c5aKo5pKy5py054mn552m56mG6Yem5YuD5rKh5q6G5aCA5bmM5aWU5pys57+75Yeh55uG5pGp56Oo6a2U6bq75Z+L5aa55pin5p6a5q+O5ZOp5qeZ5bmV6Iac5p6V6a6q5p++6bGS5qGd5Lqm5L+j5Y+I5oq55pyr5rKr6L+E5L6t57mt6bq/5LiH5oWi5rqAXCJcblx0XSxcblx0W1xuXHRcdFwiY2NhMVwiLFxuXHRcdFwi5ryr6JST5ZGz5pyq6a2F5bez566V5bKs5a+G6Jyc5rmK6JOR56iU6ISI5aaZ57KN5rCR55yg5YuZ5aSi54Sh54mf55+b6Zyn6bWh5qSL5am/5aiY5Yal5ZCN5ZG95piO55uf6L+36YqY6bO05aeq54md5ruF5YWN5qOJ57a/57es6Z2i6bq65pG45qih6IyC5aaE5a2f5q+b54yb55uy57ay6ICX6JKZ5YSy5pyo6buZ55uu5p2i5Yu/6aSF5bCk5oi757G+6LKw5ZWP5oK257SL6ZaA5YyB5Lmf5Ya25aSc54i66IC26YeO5byl55+i5Y6E5b2557SE6Jas6Kiz6LqN6Z2W5p+z6Jau6ZGT5oSJ5oSI5rK555mSXCJcblx0XSxcblx0W1xuXHRcdFwiY2RhMVwiLFxuXHRcdFwi6Kut6Ly45ZSv5L2R5YSq5YuH5Y+L5a6l5bm95oKg5oaC5o+W5pyJ5p+a5rmn5raM54y254y355Sx56WQ6KOV6KqY6YGK6YKR6YO16ZuE6J6N5aSV5LqI5L2Z5LiO6KqJ6Ly/6aCQ5YKt5bm85aaW5a655bq45o+a5o+65pOB5puc5qWK5qeY5rSL5rq254aU55So56qv576K6ICA6JGJ6JOJ6KaB6Kyh6LiK6YGl6Zm96aSK5oW+5oqR5qyy5rKD5rW057+M57+85reA576F6J666KO45p2l6I6x6aC86Zu35rSb57Wh6JC96YWq5Lmx5Y215bWQ5qyE5r+r6JeN6Jit6Kan5Yip5ZCP5bGl5p2O5qKo55CG55KDXCJcblx0XSxcblx0W1xuXHRcdFwiY2VhMVwiLFxuXHRcdFwi55ei6KOP6KOh6YeM6Zui6Zm45b6L546H56uL6JGO5o6g55Wl5YqJ5rWB5rqc55CJ55WZ56Gr57KS6ZqG56uc6b6N5L625oWu5peF6Jmc5LqG5Lqu5YOa5Lih5YeM5a+u5paZ5qKB5ra854yf55mC556t56ic57On6Imv6KuS6YG86YeP6Zm16aCY5Yqb57eR5YCr5Y6Y5p6X5reL54eQ55Cz6Ieo6Lyq6Zqj6bGX6bqf55Gg5aGB5raZ57Sv6aGe5Luk5Ly25L6L5Ya35Yqx5ba65oCc546y56S86IuT6Yi06Zq36Zu26ZyK6bqX6b2i5pqm5q205YiX5Yqj54OI6KOC5buJ5oGL5oaQ5ryj54WJ57C+57e06IGvXCJcblx0XSxcblx0W1xuXHRcdFwiY2ZhMVwiLFxuXHRcdFwi6JOu6YCj6Yys5ZGC6a2v5quT54KJ6LOC6Lev6Zyy5Yq05amB5buK5byE5pyX5qW85qaU5rWq5ryP54mi54u856+t6ICB6IG+6J2L6YOO5YWt6bqT56aE6IKL6Yyy6KuW5YCt5ZKM6Kmx5q2q6LOE6ISH5oOR5p6g6bey5LqZ5LqY6bCQ6Kmr6JeB6JWo5qSA5rm+56KX6IWVXCJcblx0XSxcblx0W1xuXHRcdFwiZDBhMVwiLFxuXHRcdFwi5byM5LiQ5LiV5Liq5Lix5Li25Li85Li/5LmC5LmW5LmY5LqC5LqF6LGr5LqK6IiS5byN5LqO5Lqe5Lqf5Lqg5Lqi5Lqw5Lqz5Lq25LuO5LuN5LuE5LuG5LuC5LuX5Lue5Lut5Luf5Lu35LyJ5L2a5Lyw5L2b5L2d5L2X5L2H5L225L6I5L6P5L6Y5L275L2p5L2w5L6R5L2v5L6G5L6W5YSY5L+U5L+f5L+O5L+Y5L+b5L+R5L+a5L+Q5L+k5L+l5YCa5YCo5YCU5YCq5YCl5YCF5Lyc5L+25YCh5YCp5YCs5L++5L+v5YCR5YCG5YGD5YGH5pyD5YGV5YGQ5YGI5YGa5YGW5YGs5YG45YKA5YKa5YKF5YK05YKyXCJcblx0XSxcblx0W1xuXHRcdFwiZDFhMVwiLFxuXHRcdFwi5YOJ5YOK5YKz5YOC5YOW5YOe5YOl5YOt5YOj5YOu5YO55YO15YSJ5YSB5YSC5YSW5YSV5YSU5YSa5YSh5YS65YS35YS85YS75YS/5YWA5YWS5YWM5YWU5YWi56u45YWp5YWq5YWu5YaA5YaC5ZuY5YaM5YaJ5YaP5YaR5YaT5YaV5YaW5Yak5Yam5Yai5Yap5Yaq5Yar5Yaz5Yax5Yay5Yaw5Ya15Ya95YeF5YeJ5Yeb5Yeg6JmV5Yep5Yet5Yew5Ye15Ye+5YiE5YiL5YiU5YiO5Yin5Yiq5Yiu5Yiz5Yi55YmP5YmE5YmL5YmM5Yme5YmU5Ymq5Ym05Ymp5Ymz5Ym/5Ym95YqN5YqU5YqS5Ymx5YqI5YqR6L6oXCJcblx0XSxcblx0W1xuXHRcdFwiZDJhMVwiLFxuXHRcdFwi6L6n5Yqs5Yqt5Yq85Yq15YuB5YuN5YuX5Yue5Yuj5Yum6aOt5Yug5Yuz5Yu15Yu45Yu55YyG5YyI55S45YyN5YyQ5YyP5YyV5Yya5Yyj5Yyv5Yyx5Yyz5Yy45Y2A5Y2G5Y2F5LiX5Y2J5Y2N5YeW5Y2e5Y2p5Y2u5aSY5Y275Y235Y6C5Y6W5Y6g5Y6m5Y6l5Y6u5Y6w5Y625Y+D57CS6ZuZ5Y+f5pu854eu5Y+u5Y+o5Y+t5Y+65ZCB5ZC95ZGA5ZCs5ZCt5ZC85ZCu5ZC25ZCp5ZCd5ZGO5ZKP5ZG15ZKO5ZGf5ZGx5ZG35ZGw5ZKS5ZG75ZKA5ZG25ZKE5ZKQ5ZKG5ZOH5ZKi5ZK45ZKl5ZKs5ZOE5ZOI5ZKoXCJcblx0XSxcblx0W1xuXHRcdFwiZDNhMVwiLFxuXHRcdFwi5ZKr5ZOC5ZKk5ZK+5ZK85ZOY5ZOl5ZOm5ZSP5ZSU5ZO95ZOu5ZOt5ZO65ZOi5ZS55ZWA5ZWj5ZWM5ZSu5ZWc5ZWF5ZWW5ZWX5ZS45ZSz5ZWd5ZaZ5ZaA5ZKv5ZaK5Zaf5ZW75ZW+5ZaY5Zae5Zau5ZW85ZaD5Zap5ZaH5Zao5Zea5ZeF5Zef5ZeE5Zec5Zek5ZeU5ZiU5Ze35ZiW5Ze+5Ze95Zib5Ze55ZmO5ZmQ54ef5Zi05Zi25Ziy5Zi45Zmr5Zmk5Ziv5Zms5Zmq5ZqG5ZqA5ZqK5Zqg5ZqU5ZqP5Zql5Zqu5Zq25Zq05ZuC5Zq85ZuB5ZuD5ZuA5ZuI5ZuO5ZuR5ZuT5ZuX5Zuu5Zu55ZyA5Zu/5ZyE5ZyJXCJcblx0XSxcblx0W1xuXHRcdFwiZDRhMVwiLFxuXHRcdFwi5ZyI5ZyL5ZyN5ZyT5ZyY5ZyW5ZeH5Zyc5Zym5Zy35Zy45Z2O5Zy75Z2A5Z2P5Z2p5Z+A5Z6I5Z2h5Z2/5Z6J5Z6T5Z6g5Z6z5Z6k5Z6q5Z6w5Z+D5Z+G5Z+U5Z+S5Z+T5aCK5Z+W5Z+j5aCL5aCZ5aCd5aGy5aCh5aGi5aGL5aGw5q+A5aGS5aC95aG55aKF5aK55aKf5aKr5aK65aOe5aK75aK45aKu5aOF5aOT5aOR5aOX5aOZ5aOY5aOl5aOc5aOk5aOf5aOv5aO65aO55aO75aO85aO95aSC5aSK5aSQ5aSb5qKm5aSl5aSs5aSt5aSy5aS45aS+56uS5aWV5aWQ5aWO5aWa5aWY5aWi5aWg5aWn5aWs5aWpXCJcblx0XSxcblx0W1xuXHRcdFwiZDVhMVwiLFxuXHRcdFwi5aW45aaB5aad5L2e5L6r5aaj5aay5aeG5aeo5aec5aaN5aeZ5aea5ail5aif5aiR5aic5aiJ5aia5amA5ams5amJ5ai15ai25ami5amq5aqa5aq85aq+5auL5auC5aq95auj5auX5aum5aup5auW5au65au75ayM5ayL5ayW5ayy5auQ5ayq5ay25ay+5a2D5a2F5a2A5a2R5a2V5a2a5a2b5a2l5a2p5a2w5a2z5a215a245paI5a265a6A5a6D5a6m5a645a+D5a+H5a+J5a+U5a+Q5a+k5a+m5a+i5a+e5a+l5a+r5a+w5a+25a+z5bCF5bCH5bCI5bCN5bCT5bCg5bCi5bCo5bC45bC55bGB5bGG5bGO5bGTXCJcblx0XSxcblx0W1xuXHRcdFwiZDZhMVwiLFxuXHRcdFwi5bGQ5bGP5a2x5bGs5bGu5Lmi5bG25bG55bKM5bKR5bKU5aab5bKr5bK75bK25bK85bK35bOF5bK+5bOH5bOZ5bOp5bO95bO65bOt5baM5bOq5bSL5bSV5bSX5bWc5bSf5bSb5bSR5bSU5bSi5bSa5bSZ5bSY5bWM5bWS5bWO5bWL5bWs5bWz5bW25baH5baE5baC5bai5bad5bas5bau5ba95baQ5ba35ba85beJ5beN5beT5beS5beW5beb5ber5bey5be15biL5bia5biZ5biR5bib5bi25bi35bmE5bmD5bmA5bmO5bmX5bmU5bmf5bmi5bmk5bmH5bm15bm25bm66bq85bm/5bqg5buB5buC5buI5buQ5buPXCJcblx0XSxcblx0W1xuXHRcdFwiZDdhMVwiLFxuXHRcdFwi5buW5buj5bud5bua5bub5bui5buh5buo5bup5bus5bux5buz5buw5bu05bu45bu+5byD5byJ5b2d5b2c5byL5byR5byW5byp5byt5by45b2B5b2I5b2M5b2O5byv5b2R5b2W5b2X5b2Z5b2h5b2t5b2z5b235b6D5b6C5b2/5b6K5b6I5b6R5b6H5b6e5b6Z5b6Y5b6g5b6o5b6t5b685b+W5b+75b+k5b+45b+x5b+d5oKz5b+/5oCh5oGg5oCZ5oCQ5oCp5oCO5oCx5oCb5oCV5oCr5oCm5oCP5oC65oGa5oGB5oGq5oG35oGf5oGK5oGG5oGN5oGj5oGD5oGk5oGC5oGs5oGr5oGZ5oKB5oKN5oOn5oKD5oKaXCJcblx0XSxcblx0W1xuXHRcdFwiZDhhMVwiLFxuXHRcdFwi5oKE5oKb5oKW5oKX5oKS5oKn5oKL5oOh5oK45oOg5oOT5oK05b+w5oK95oOG5oK15oOY5oWN5oSV5oSG5oO25oO35oSA5oO05oO65oSD5oSh5oO75oOx5oSN5oSO5oWH5oS+5oSo5oSn5oWK5oS/5oS85oSs5oS05oS95oWC5oWE5oWz5oW35oWY5oWZ5oWa5oWr5oW05oWv5oWl5oWx5oWf5oWd5oWT5oW15oaZ5oaW5oaH5oas5oaU5oaa5oaK5oaR5oar5oau5oeM5oeK5oeJ5oe35oeI5oeD5oeG5oa65oeL57255oeN5oem5oej5oe25oe65oe05oe/5oe95oe85oe+5oiA5oiI5oiJ5oiN5oiM5oiU5oibXCJcblx0XSxcblx0W1xuXHRcdFwiZDlhMVwiLFxuXHRcdFwi5oie5oih5oiq5oiu5oiw5oiy5oiz5omB5omO5ome5omj5omb5omg5omo5om85oqC5oqJ5om+5oqS5oqT5oqW5ouU5oqD5oqU5ouX5ouR5oq75ouP5ou/5ouG5pOU5ouI5ouc5ouM5ouK5ouC5ouH5oqb5ouJ5oyM5ouu5oux5oyn5oyC5oyI5ouv5ou15o2Q5oy+5o2N5pCc5o2P5o6W5o6O5o6A5o6r5o225o6j5o6P5o6J5o6f5o615o2r5o2p5o6+5o+p5o+A5o+G5o+j5o+J5o+S5o+25o+E5pCW5pC05pCG5pCT5pCm5pC25pSd5pCX5pCo5pCP5pGn5pGv5pG25pGO5pSq5pKV5pKT5pKl5pKp5pKI5pK8XCJcblx0XSxcblx0W1xuXHRcdFwiZGFhMVwiLFxuXHRcdFwi5pOa5pOS5pOF5pOH5pK75pOY5pOC5pOx5pOn6IiJ5pOg5pOh5oqs5pOj5pOv5pSs5pO25pO05pOy5pO65pSA5pO95pSY5pSc5pSF5pSk5pSj5pSr5pS05pS15pS35pS25pS455WL5pWI5pWW5pWV5pWN5pWY5pWe5pWd5pWy5pW45paC5paD6K6K5pab5paf5par5pa35peD5peG5peB5peE5peM5peS5peb5peZ5peg5peh5pex5p2y5piK5piD5pe75p2z5pi15pi25pi05pic5pmP5pmE5pmJ5pmB5pme5pmd5pmk5pmn5pmo5pmf5pmi5pmw5pqD5pqI5pqO5pqJ5pqE5pqY5pqd5puB5pq55puJ5pq+5pq8XCJcblx0XSxcblx0W1xuXHRcdFwiZGJhMVwiLFxuXHRcdFwi5puE5pq45puW5pua5pug5pi/5pum5pup5puw5pu15pu35pyP5pyW5pye5pym5pyn6Zy45pyu5py/5py25p2B5py45py35p2G5p2e5p2g5p2Z5p2j5p2k5p6J5p2w5p6p5p285p2q5p6M5p6L5p6m5p6h5p6F5p635p+v5p605p+s5p6z5p+p5p645p+k5p+e5p+d5p+i5p+u5p655p+O5p+G5p+n5qqc5qCe5qGG5qCp5qGA5qGN5qCy5qGO5qKz5qCr5qGZ5qGj5qG35qG/5qKf5qKP5qKt5qKU5qKd5qKb5qKD5qqu5qK55qG05qK15qKg5qK65qSP5qKN5qG+5qSB5qOK5qSI5qOY5qSi5qSm5qOh5qSM5qONXCJcblx0XSxcblx0W1xuXHRcdFwiZGNhMVwiLFxuXHRcdFwi5qOU5qOn5qOV5qS25qSS5qSE5qOX5qOj5qSl5qO55qOg5qOv5qSo5qSq5qSa5qSj5qSh5qOG5qW55qW35qWc5qW45qWr5qWU5qW+5qWu5qS55qW05qS95qWZ5qSw5qWh5qWe5qWd5qaB5qWq5qay5qau5qeQ5qa/5qeB5qeT5qa+5qeO5a+o5qeK5qed5qa75qeD5qan5qiu5qaR5qag5qac5qaV5qa05qee5qeo5qiC5qib5qe/5qyK5qe55qey5qen5qiF5qax5qie5qet5qiU5qer5qiK5qiS5quB5qij5qiT5qmE5qiM5qmy5qi25qm45qmH5qmi5qmZ5qmm5qmI5qi45qii5qqQ5qqN5qqg5qqE5qqi5qqjXCJcblx0XSxcblx0W1xuXHRcdFwiZGRhMVwiLFxuXHRcdFwi5qqX6JiX5qq75quD5quC5qq45qqz5qqs5que5quR5quf5qqq5qua5quq5qu75qyF6JiW5qu65qyS5qyW6ayx5qyf5qy45qy355uc5qy56aOu5q2H5q2D5q2J5q2Q5q2Z5q2U5q2b5q2f5q2h5q245q255q2/5q6A5q6E5q6D5q6N5q6Y5q6V5q6e5q6k5q6q5q6r5q6v5q6y5q6x5q6z5q635q685q+G5q+L5q+T5q+f5q+s5q+r5q+z5q+v6bq+5rCI5rCT5rCU5rCb5rCk5rCj5rGe5rGV5rGi5rGq5rKC5rKN5rKa5rKB5rKb5rG+5rGo5rGz5rKS5rKQ5rOE5rOx5rOT5rK95rOX5rOF5rOd5rKu5rKx5rK+XCJcblx0XSxcblx0W1xuXHRcdFwiZGVhMVwiLFxuXHRcdFwi5rK65rOb5rOv5rOZ5rOq5rSf6KGN5rS25rSr5rS95rS45rSZ5rS15rSz5rSS5rSM5rWj5raT5rWk5rWa5rW55rWZ5raO5raV5r+k5raF5re55riV5riK5ra15reH5rem5ra45reG5res5ree5reM5reo5reS5reF5re65reZ5rek5reV5req5reu5rit5rmu5riu5riZ5rmy5rmf5ri+5rij5rmr5rir5rm25rmN5rif5rmD5ri65rmO5rik5ru/5rid5ri45rqC5rqq5rqY5ruJ5rq35ruT5rq95rqv5ruE5rqy5ruU5ruV5rqP5rql5ruC5rqf5r2B5ryR54GM5rus5ru45ru+5ry/5ruy5ryx5ruv5ryy5ruMXCJcblx0XSxcblx0W1xuXHRcdFwiZGZhMVwiLFxuXHRcdFwi5ry+5ryT5ru35r6G5r265r245r6B5r6A5r2v5r2b5r+z5r2t5r6C5r285r2Y5r6O5r6R5r+C5r2m5r6z5r6j5r6h5r6k5r655r+G5r6q5r+f5r+V5r+s5r+U5r+Y5r+x5r+u5r+b54CJ54CL5r+654CR54CB54CP5r++54Cb54Ca5r2054Cd54CY54Cf54Cw54C+54Cy54GR54Gj54KZ54KS54Kv54Ox54Ks54K454Kz54Ku54Of54OL54Od54OZ54SJ54O954Sc54SZ54Wl54WV54aI54Wm54Wi54WM54WW54Ws54aP54e754aE54aV54ao54as54eX54a554a+54eS54eJ54eU54eO54eg54es54en54e154e8XCJcblx0XSxcblx0W1xuXHRcdFwiZTBhMVwiLFxuXHRcdFwi54e554e/54iN54iQ54ib54io54it54is54iw54iy54i754i854i/54mA54mG54mL54mY54m054m+54qC54qB54qH54qS54qW54qi54qn54q554qy54uD54uG54uE54uO54uS54ui54ug54uh54u554u35YCP54yX54yK54yc54yW54yd54y054yv54yp54yl54y+542O542P6buY542X542q542o542w542454215427542654+I546z54+O546754+A54+l54+u54+e55Ki55CF55Gv55Cl54+455Cy55C655GV55C/55Gf55GZ55GB55Gc55Gp55Gw55Gj55Gq55G255G+55KL55Ke55Kn55OK55OP55OU54+xXCJcblx0XSxcblx0W1xuXHRcdFwiZTFhMVwiLFxuXHRcdFwi55Og55Oj55On55Op55Ou55Oy55Ow55Ox55O455O355SE55SD55SF55SM55SO55SN55SV55ST55Se55Sm55Ss55S855WE55WN55WK55WJ55Wb55WG55Wa55Wp55Wk55Wn55Wr55Wt55W455W255aG55aH55W055aK55aJ55aC55aU55aa55ad55al55aj55eC55az55eD55a155a955a455a855ax55eN55eK55eS55eZ55ej55ee55e+55e/55e855iB55ew55e655ey55ez55iL55iN55iJ55if55in55ig55ih55ii55ik55i055iw55i755mH55mI55mG55mc55mY55mh55mi55mo55mp55mq55mn55ms55mwXCJcblx0XSxcblx0W1xuXHRcdFwiZTJhMVwiLFxuXHRcdFwi55my55m255m455m855qA55qD55qI55qL55qO55qW55qT55qZ55qa55qw55q055q455q555q655uC55uN55uW55uS55ue55uh55ul55un55uq6Jiv55u755yI55yH55yE55yp55yk55ye55yl55ym55yb55y355y4552H552a552o552r552b552l552/552+5525556O556L556R556g556e556w55625565556/55685569556755+H55+N55+X55+a55+c55+j55+u55+856CM56CS56Sm56Cg56Sq56GF56KO56G056KG56G856Ka56KM56Kj56K156Kq56Kv56OR56OG56OL56OU56K+56K856OF56OK56OsXCJcblx0XSxcblx0W1xuXHRcdFwiZTNhMVwiLFxuXHRcdFwi56On56Oa56O956O056SH56SS56SR56SZ56Ss56Sr56WA56Wg56WX56Wf56Wa56WV56WT56W656W/56aK56ad56an6b2L56aq56au56az56a556a656eJ56eV56en56es56eh56ej56iI56iN56iY56iZ56ig56if56aA56ix56i756i+56i356mD56mX56mJ56mh56mi56mp6b6d56mw56m556m956qI56qX56qV56qY56qW56qp56uI56qw56q256uF56uE56q/6YKD56uH56uK56uN56uP56uV56uT56uZ56ua56ud56uh56ui56um56ut56uw56yC56yP56yK56yG56yz56yY56yZ56ye56y156yo56y2562QXCJcblx0XSxcblx0W1xuXHRcdFwiZTRhMVwiLFxuXHRcdFwi562656yE562N56yL562M562F5621562l5620562n562w562x562s562u566d566Y566f566N566c566a566L566S566P562d566Z56+L56+B56+M56+P566056+G56+d56+p57CR57CU56+m56+l57Gg57CA57CH57CT56+z56+357CX57CN56+257Cj57Cn57Cq57Cf57C357Cr57C957GM57GD57GU57GP57GA57GQ57GY57Gf57Gk57GW57Gl57Gs57G157KD57KQ57Kk57Kt57Ki57Kr57Kh57Ko57Kz57Ky57Kx57Ku57K557K957OA57OF57OC57OY57OS57Oc57Oi6ay757Ov57Oy57O057O257O657SGXCJcblx0XSxcblx0W1xuXHRcdFwiZTVhMVwiLFxuXHRcdFwi57SC57Sc57SV57SK57WF57WL57Su57Sy57S/57S157WG57Wz57WW57WO57Wy57Wo57Wu57WP57Wj57aT57aJ57Wb57aP57W957ab57a657au57aj57a157eH57a957ar57i957ai57av57ec57a457af57aw57eY57ed57ek57ee57e757ey57eh57iF57iK57ij57ih57iS57ix57if57iJ57iL57ii57mG57mm57i757i157i557mD57i357iy57i657mn57md57mW57me57mZ57ma57m557mq57mp57m857m757qD57eV57m96L6u57m/57qI57qJ57qM57qS57qQ57qT57qU57qW57qO57qb57qc57y457y6XCJcblx0XSxcblx0W1xuXHRcdFwiZTZhMVwiLFxuXHRcdFwi572F572M572N572O572Q572R572V572U572Y572f572g572o572p572n5724576C576G576D576I576H576M576U576e576d576a576j576v576y5765576u576257646K2x57+F57+G57+K57+V57+U57+h57+m57+p57+z57+56aOc6ICG6ICE6ICL6ICS6ICY6ICZ6ICc6ICh6ICo6IC/6IC76IGK6IGG6IGS6IGY6IGa6IGf6IGi6IGo6IGz6IGy6IGw6IG26IG56IG96IG/6IKE6IKG6IKF6IKb6IKT6IKa6IKt5YaQ6IKs6IOb6IOl6IOZ6IOd6IOE6IOa6IOW6ISJ6IOv6IOx6ISb6ISp6ISj6ISv6IWLXCJcblx0XSxcblx0W1xuXHRcdFwiZTdhMVwiLFxuXHRcdFwi6ZqL6IWG6IS+6IWT6IWR6IO86IWx6IWu6IWl6IWm6IW06IaD6IaI6IaK6IaA6IaC6Iag6IaV6Iak6Iaj6IWf6IaT6Iap6Iaw6Ia16Ia+6Ia46Ia96IeA6IeC6Ia66IeJ6IeN6IeR6IeZ6IeY6IeI6Iea6Ief6Ieg6Ien6Ie66Ie76Ie+6IiB6IiC6IiF6IiH6IiK6IiN6IiQ6IiW6Iip6Iir6Ii46Iiz6ImA6ImZ6ImY6Imd6Ima6Imf6Imk6Imi6Imo6Imq6Imr6Iiu6Imx6Im36Im46Im+6IqN6IqS6Iqr6Iqf6Iq76Iqs6Iuh6Iuj6Iuf6IuS6Iu06Iuz6Iu66I6T6IyD6Iu76Iu56Iue6IyG6Iuc6IyJ6IuZXCJcblx0XSxcblx0W1xuXHRcdFwiZThhMVwiLFxuXHRcdFwi6Iy16Iy06IyW6Iyy6Iyx6I2A6Iy56I2Q6I2F6Iyv6Iyr6IyX6IyY6I6F6I6a6I6q6I6f6I6i6I6W6Iyj6I6O6I6H6I6K6I286I616I2z6I216I6g6I6J6I6o6I+06JCT6I+r6I+O6I+96JCD6I+Y6JCL6I+B6I+36JCH6I+g6I+y6JCN6JCi6JCg6I696JC46JSG6I+76JGt6JCq6JC86JWa6JKE6JG36JGr6JKt6JGu6JKC6JGp6JGG6JCs6JGv6JG56JC16JOK6JGi6JK56JK/6JKf6JOZ6JON6JK76JOa6JOQ6JOB6JOG6JOW6JKh6JSh6JO/6JO06JSX6JSY6JSs6JSf6JSV6JSU6JO86JWA6JWj6JWY6JWIXCJcblx0XSxcblx0W1xuXHRcdFwiZTlhMVwiLFxuXHRcdFwi6JWB6JiC6JWL6JWV6JaA6Jak6JaI6JaR6JaK6Jao6JWt6JaU6Jab6Jeq6JaH6Jac6JW36JW+6JaQ6JeJ6Ja66JeP6Ja56JeQ6JeV6Jed6Jel6Jec6Je56JiK6JiT6JiL6Je+6Je66JiG6Jii6Jia6Jiw6Ji/6JmN5LmV6JmU6Jmf6Jmn6Jmx6JqT6Jqj6Jqp6Jqq6JqL6JqM6Jq26Jqv6JuE6JuG6Jqw6JuJ6KCj6Jqr6JuU6Jue6Jup6Jus6Juf6Jub6Juv6JyS6JyG6JyI6JyA6JyD6Ju76JyR6JyJ6JyN6Ju56JyK6Jy06Jy/6Jy36Jy76Jyl6Jyp6Jya6J2g6J2f6J246J2M6J2O6J206J2X6J2o6J2u6J2ZXCJcblx0XSxcblx0W1xuXHRcdFwiZWFhMVwiLFxuXHRcdFwi6J2T6J2j6J2q6KCF6J6i6J6f6J6C6J6v6J+L6J696J+A6J+Q6ZuW6J6r6J+E6J6z6J+H6J+G6J676J+v6J+y6J+g6KCP6KCN6J++6J+26J+36KCO6J+S6KCR6KCW6KCV6KCi6KCh6KCx6KC26KC56KCn6KC76KGE6KGC6KGS6KGZ6KGe6KGi6KGr6KKB6KG+6KKe6KG16KG96KK16KGy6KKC6KKX6KKS6KKu6KKZ6KKi6KKN6KKk6KKw6KK/6KKx6KOD6KOE6KOU6KOY6KOZ6KOd6KO56KSC6KO86KO06KOo6KOy6KSE6KSM6KSK6KST6KWD6KSe6KSl6KSq6KSr6KWB6KWE6KS76KS26KS46KWM6KSd6KWg6KWeXCJcblx0XSxcblx0W1xuXHRcdFwiZWJhMVwiLFxuXHRcdFwi6KWm6KWk6KWt6KWq6KWv6KW06KW36KW+6KaD6KaI6KaK6KaT6KaY6Kah6Kap6Kam6Kas6Kav6Kay6Ka66Ka96Ka/6KeA6Kea6Kec6Ked6Ken6Ke06Ke46KiD6KiW6KiQ6KiM6Kib6Kid6Kil6Ki26KmB6Kmb6KmS6KmG6KmI6Km86Kmt6Kms6Kmi6KqF6KqC6KqE6Kqo6Kqh6KqR6Kql6Kqm6Kqa6Kqj6KuE6KuN6KuC6Kua6Kur6Kuz6Kun6Kuk6Kux6KyU6Kug6Kui6Ku36Kue6Kub6KyM6KyH6Kya6Kuh6KyW6KyQ6KyX6Kyg6Kyz6Z6r6Kym6Kyr6Ky+6Kyo6K2B6K2M6K2P6K2O6K2J6K2W6K2b6K2a6K2rXCJcblx0XSxcblx0W1xuXHRcdFwiZWNhMVwiLFxuXHRcdFwi6K2f6K2s6K2v6K206K296K6A6K6M6K6O6K6S6K6T6K6W6K6Z6K6a6LC66LGB6LC/6LGI6LGM6LGO6LGQ6LGV6LGi6LGs6LG46LG66LKC6LKJ6LKF6LKK6LKN6LKO6LKU6LG86LKY5oid6LKt6LKq6LK96LKy6LKz6LKu6LK26LOI6LOB6LOk6LOj6LOa6LO96LO66LO76LSE6LSF6LSK6LSH6LSP6LSN6LSQ6b2O6LST6LON6LSU6LSW6LWn6LWt6LWx6LWz6LaB6LaZ6LeC6La+6La66LeP6Lea6LeW6LeM6Leb6LeL6Leq6Ler6Lef6Lej6Le86LiI6LiJ6Le/6Lid6Lie6LiQ6Lif6LmC6Li16Liw6Li06LmKXCJcblx0XSxcblx0W1xuXHRcdFwiZWRhMVwiLFxuXHRcdFwi6LmH6LmJ6LmM6LmQ6LmI6LmZ6Lmk6Lmg6Liq6Lmj6LmV6Lm26Lmy6Lm86LqB6LqH6LqF6LqE6LqL6LqK6LqT6LqR6LqU6LqZ6Lqq6Lqh6Lqs6Lqw6LuG6Lqx6Lq+6LuF6LuI6LuL6Lub6Luj6Lu86Lu76Lur6Lu+6LyK6LyF6LyV6LyS6LyZ6LyT6Lyc6Lyf6Lyb6LyM6Lym6Lyz6Ly76Ly56L2F6L2C6Ly+6L2M6L2J6L2G6L2O6L2X6L2c6L2i6L2j6L2k6L6c6L6f6L6j6L6t6L6v6L636L+a6L+l6L+i6L+q6L+v6YKH6L+06YCF6L+56L+66YCR6YCV6YCh6YCN6YCe6YCW6YCL6YCn6YC26YC16YC56L+4XCJcblx0XSxcblx0W1xuXHRcdFwiZWVhMVwiLFxuXHRcdFwi6YGP6YGQ6YGR6YGS6YCO6YGJ6YC+6YGW6YGY6YGe6YGo6YGv6YG26Zqo6YGy6YKC6YG96YKB6YKA6YKK6YKJ6YKP6YKo6YKv6YKx6YK16YOi6YOk5omI6YOb6YSC6YSS6YSZ6YSy6YSw6YWK6YWW6YWY6YWj6YWl6YWp6YWz6YWy6YaL6YaJ6YaC6Yai6Yar6Yav6Yaq6Ya16Ya06Ya66YeA6YeB6YeJ6YeL6YeQ6YeW6Yef6Yeh6Yeb6Ye86Ye16Ye26Yie6Ye/6YiU6Yis6YiV6YiR6Yme6YmX6YmF6YmJ6Ymk6YmI6YqV6Yi/6YmL6YmQ6Yqc6YqW6YqT6Yqb6Yma6YuP6Yq56Yq36Yup6YyP6Yu66Y2E6YyuXCJcblx0XSxcblx0W1xuXHRcdFwiZWZhMVwiLFxuXHRcdFwi6YyZ6Yyi6Yya6Yyj6Yy66Yy16Yy76Y2c6Y2g6Y286Y2u6Y2W6Y6w6Y6s6Y6t6Y6U6Y656Y+W6Y+X6Y+o6Y+l6Y+Y6Y+D6Y+d6Y+Q6Y+I6Y+k6ZCa6ZCU6ZCT6ZCD6ZCH6ZCQ6ZC26ZCr6ZC16ZCh6ZC66ZGB6ZGS6ZGE6ZGb6ZGg6ZGi6ZGe6ZGq6Yip6ZGw6ZG16ZG36ZG96ZGa6ZG86ZG+6ZKB6ZG/6ZaC6ZaH6ZaK6ZaU6ZaW6ZaY6ZaZ6Zag6Zao6Zan6Zat6Za86Za76Za56Za+6ZeK5r+26ZeD6ZeN6ZeM6ZeV6ZeU6ZeW6Zec6Zeh6Zel6Zei6Zih6Zio6Ziu6Ziv6ZmC6ZmM6ZmP6ZmL6Zm36Zmc6ZmeXCJcblx0XSxcblx0W1xuXHRcdFwiZjBhMVwiLFxuXHRcdFwi6Zmd6Zmf6Zmm6Zmy6Zms6ZqN6ZqY6ZqV6ZqX6Zqq6Zqn6Zqx6Zqy6Zqw6Zq06Zq26Zq46Zq56ZuO6ZuL6ZuJ6ZuN6KWN6Zuc6ZyN6ZuV6Zu56ZyE6ZyG6ZyI6ZyT6ZyO6ZyR6ZyP6ZyW6ZyZ6Zyk6Zyq6Zyw6Zy56Zy96Zy+6Z2E6Z2G6Z2I6Z2C6Z2J6Z2c6Z2g6Z2k6Z2m6Z2o5YuS6Z2r6Z2x6Z256Z6F6Z286Z6B6Z266Z6G6Z6L6Z6P6Z6Q6Z6c6Z6o6Z6m6Z6j6Z6z6Z606Z+D6Z+G6Z+I6Z+L6Z+c6Z+t6b2P6Z+y56uf6Z+26Z+16aCP6aCM6aC46aCk6aCh6aC36aC96aGG6aGP6aGL6aGr6aGv6aGwXCJcblx0XSxcblx0W1xuXHRcdFwiZjFhMVwiLFxuXHRcdFwi6aGx6aG06aGz6aKq6aKv6aKx6aK26aOE6aOD6aOG6aOp6aOr6aSD6aSJ6aSS6aSU6aSY6aSh6aSd6aSe6aSk6aSg6aSs6aSu6aS96aS+6aWC6aWJ6aWF6aWQ6aWL6aWR6aWS6aWM6aWV6aaX6aaY6aal6aat6aau6aa86aef6aeb6aed6aeY6aeR6aet6aeu6aex6aey6ae76ae46aiB6aiP6aiF6aei6aiZ6air6ai36amF6amC6amA6amD6ai+6amV6amN6amb6amX6amf6ami6aml6amk6amp6amr6amq6aqt6aqw6aq86auA6auP6auR6auT6auU6aue6auf6aui6auj6aum6auv6aur6auu6au06aux6au3XCJcblx0XSxcblx0W1xuXHRcdFwiZjJhMVwiLFxuXHRcdFwi6au76ayG6ayY6aya6ayf6ayi6ayj6ayl6ayn6ayo6ayp6ayq6ayu6ayv6ayy6a2E6a2D6a2P6a2N6a2O6a2R6a2Y6a206a6T6a6D6a6R6a6W6a6X6a6f6a6g6a6o6a606a+A6a+K6a656a+G6a+P6a+R6a+S6a+j6a+i6a+k6a+U6a+h6bC66a+y6a+x6a+w6bCV6bCU6bCJ6bCT6bCM6bCG6bCI6bCS6bCK6bCE6bCu6bCb6bCl6bCk6bCh6bCw6bGH6bCy6bGG6bC+6bGa6bGg6bGn6bG26bG46bOn6bOs6bOw6bSJ6bSI6bOr6bSD6bSG6bSq6bSm6bav6bSj6bSf6bWE6bSV6bSS6bWB6bS/6bS+6bWG6bWIXCJcblx0XSxcblx0W1xuXHRcdFwiZjNhMVwiLFxuXHRcdFwi6bWd6bWe6bWk6bWR6bWQ6bWZ6bWy6baJ6baH6bar6bWv6bW66baa6bak6bap6bay6beE6beB6ba76ba46ba66beG6beP6beC6beZ6beT6be46bem6bet6bev6be96bia6bib6bie6bm16bm56bm96bqB6bqI6bqL6bqM6bqS6bqV6bqR6bqd6bql6bqp6bq46bqq6bqt6Z2h6buM6buO6buP6buQ6buU6buc6bue6bud6bug6bul6buo6buv6bu06bu26bu36bu56bu76bu86bu96byH6byI55q36byV6byh6bys6by+6b2K6b2S6b2U6b2j6b2f6b2g6b2h6b2m6b2n6b2s6b2q6b236b2y6b226b6V6b6c6b6gXCJcblx0XSxcblx0W1xuXHRcdFwiZjRhMVwiLFxuXHRcdFwi5aCv5qeH6YGZ55Gk5Yec54aZXCJcblx0XSxcblx0W1xuXHRcdFwiZjlhMVwiLFxuXHRcdFwi57qK6KSc6Y2I6YqI6JOc5L+J54K75pix5qOI6Yu55pu75b2F5Lio5Luh5Lu85LyA5LyD5Ly55L2W5L6S5L6K5L6a5L6U5L+N5YGA5YCi5L+/5YCe5YGG5YGw5YGC5YKU5YO05YOY5YWK5YWk5Yad5Ya+5Yes5YiV5Yqc5Yqm5YuA5Yub5YyA5YyH5Yyk5Y2y5Y6T5Y6y5Y+d76iO5ZKc5ZKK5ZKp5ZO/5ZaG5Z2Z5Z2l5Z6s5Z+I5Z+H76iP76iQ5aKe5aKy5aSL5aWT5aWb5aWd5aWj5aak5aa65a2W5a+A55Sv5a+Y5a+s5bCe5bKm5bK65bO15bSn5bWT76iR5bWC5bWt5ba45ba55beQ5byh5by05b2n5b63XCJcblx0XSxcblx0W1xuXHRcdFwiZmFhMVwiLFxuXHRcdFwi5b+e5oGd5oKF5oKK5oOe5oOV5oSg5oOy5oSR5oS35oSw5oaY5oiT5oqm5o+15pGg5pKd5pOO5pWO5piA5piV5pi75piJ5piu5pie5pik5pml5pmX5pmZ76iS5pmz5pqZ5pqg5pqy5pq/5pu65pyO76Sp5p2m5p675qGS5p+A5qCB5qGE5qOP76iT5qWo76iU5qaY5qei5qiw5qmr5qmG5qmz5qm+5qui5quk5q+W5rC/5rGc5rKG5rGv5rOa5rSE5raH5rWv5raW5ras5reP5re45rey5re85ri55rmc5rin5ri85rq/5r6I5r615r+154CF54CH54Co54KF54Kr54SP54SE54Wc54WG54WH76iV54eB54e+54qxXCJcblx0XSxcblx0W1xuXHRcdFwiZmJhMVwiLFxuXHRcdFwi54q+54yk76iW5423546954+J54+W54+j54+S55CH54+155Cm55Cq55Cp55Cu55Gi55KJ55Kf55SB55Wv55qC55qc55qe55qb55qm76iX552G5Yqv56Ch56GO56Gk56G656Sw76iY76iZ76ia56aU76ib56ab56uR56un76ic56ur566e76id57WI57Wc57a357ag57eW57mS572H576h76ie6IyB6I2i6I2/6I+H6I+26JGI6JK06JWT6JWZ6JWr76if6Jaw76ig76ih6KCH6KO16KiS6Ki36Km56Kqn6Kq+6Kuf76ii6Ku26K2T6K2/6LOw6LO06LSS6LW276ij6LuP76ik76il6YGn6YOe76im6YSV6YSn6YeaXCJcblx0XSxcblx0W1xuXHRcdFwiZmNhMVwiLFxuXHRcdFwi6YeX6Yee6Yet6Yeu6Yek6Yel6YiG6YiQ6YiK6Yi66YmA6Yi86YmO6YmZ6YmR6Yi56Ymn6Yqn6Ym36Ym46Yun6YuX6YuZ6YuQ76in6YuV6Yug6YuT6Yyl6Yyh6Yu776io6Yye6Yu/6Yyd6YyC6Y2w6Y2X6Y6k6Y+G6Y+e6Y+46ZCx6ZGF6ZGI6ZaS76ec76ip6Zqd6Zqv6Zyz6Zy76Z2D6Z2N6Z2P6Z2R6Z2V6aGX6aGl76iq76ir6aSn76is6aae6amO6auZ6auc6a216a2y6a6P6a6x6a676bCA6bWw6bWr76it6biZ6buRXCJcblx0XSxcblx0W1xuXHRcdFwiZmNmMVwiLFxuXHRcdFwi4oWwXCIsXG5cdFx0OSxcblx0XHRcIu+/ou+/pO+8h++8glwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTJhZlwiLFxuXHRcdFwiy5jLh8K4y5nLncKvy5vLmu+9ns6EzoVcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmEyYzJcIixcblx0XHRcIsKhwqbCv1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTJlYlwiLFxuXHRcdFwiwrrCqsKpwq7ihKLCpOKEllwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTZlMVwiLFxuXHRcdFwizobOiM6JzorOqlwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTZlN1wiLFxuXHRcdFwizoxcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE2ZTlcIixcblx0XHRcIs6OzqtcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE2ZWNcIixcblx0XHRcIs6PXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhNmYxXCIsXG5cdFx0XCLOrM6tzq7Or8+KzpDPjM+Cz43Pi86wz45cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE3YzJcIixcblx0XHRcItCCXCIsXG5cdFx0MTAsXG5cdFx0XCLQjtCPXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhN2YyXCIsXG5cdFx0XCLRklwiLFxuXHRcdDEwLFxuXHRcdFwi0Z7Rn1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTlhMVwiLFxuXHRcdFwiw4bEkFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTlhNFwiLFxuXHRcdFwixKZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE5YTZcIixcblx0XHRcIsSyXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhOWE4XCIsXG5cdFx0XCLFgcS/XCJcblx0XSxcblx0W1xuXHRcdFwiOGZhOWFiXCIsXG5cdFx0XCLFisOYxZJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE5YWZcIixcblx0XHRcIsWmw55cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE5YzFcIixcblx0XHRcIsOmxJHDsMSnxLHEs8S4xYLFgMWJxYvDuMWTw5/Fp8O+XCJcblx0XSxcblx0W1xuXHRcdFwiOGZhYWExXCIsXG5cdFx0XCLDgcOAw4TDgsSCx43EgMSEw4XDg8SGxIjEjMOHxIrEjsOJw4jDi8OKxJrElsSSxJhcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmFhYmFcIixcblx0XHRcIsScxJ7EosSgxKTDjcOMw4/DjsePxLDEqsSuxKjEtMS2xLnEvcS7xYPFh8WFw5HDk8OSw5bDlMeRxZDFjMOVxZTFmMWWxZrFnMWgxZ7FpMWiw5rDmcOcw5vFrMeTxbDFqsWyxa7FqMeXx5vHmceVxbTDncW4xbbFucW9xbtcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmFiYTFcIixcblx0XHRcIsOhw6DDpMOixIPHjsSBxIXDpcOjxIfEicSNw6fEi8SPw6nDqMOrw6rEm8SXxJPEmce1xJ3En1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYWJiZFwiLFxuXHRcdFwixKHEpcOtw6zDr8Oux5BcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmFiYzVcIixcblx0XHRcIsSrxK/EqcS1xLfEusS+xLzFhMWIxYbDscOzw7LDtsO0x5LFkcWNw7XFlcWZxZfFm8WdxaHFn8WlxaPDusO5w7zDu8Wtx5TFscWrxbPFr8Wpx5jHnMeax5bFtcO9w7/Ft8W6xb7FvFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYjBhMVwiLFxuXHRcdFwi5LiC5LiE5LiF5LiM5LiS5Lif5Lij5Lik5Lio5Lir5Liu5Liv5Liw5Li15LmA5LmB5LmE5LmH5LmR5Lma5Lmc5Lmj5Lmo5Lmp5Lm05Lm15Lm55Lm/5LqN5LqW5LqX5Lqd5Lqv5Lq55LuD5LuQ5Lua5Lub5Lug5Luh5Lui5Luo5Luv5Lux5Luz5Lu15Lu95Lu+5Lu/5LyA5LyC5LyD5LyI5LyL5LyM5LyS5LyV5LyW5LyX5LyZ5Lyu5Lyx5L2g5Lyz5Ly15Ly35Ly55Ly75Ly+5L2A5L2C5L2I5L2J5L2L5L2M5L2S5L2U5L2W5L2Y5L2f5L2j5L2q5L2s5L2u5L2x5L235L245L255L265L295L2+5L6B5L6C5L6EXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiMWExXCIsXG5cdFx0XCLkvoXkvonkvorkvozkvo7kvpDkvpLkvpPkvpTkvpfkvpnkvprkvp7kvp/kvrLkvrfkvrnkvrvkvrzkvr3kvr7kv4Dkv4Hkv4Xkv4bkv4jkv4nkv4vkv4zkv43kv4/kv5Lkv5zkv6Dkv6Lkv7Dkv7Lkv7zkv73kv7/lgIDlgIHlgITlgIflgIrlgIzlgI7lgJDlgJPlgJflgJjlgJvlgJzlgJ3lgJ7lgKLlgKflgK7lgLDlgLLlgLPlgLXlgYDlgYHlgYLlgYXlgYblgYrlgYzlgY7lgZHlgZLlgZPlgZflgZnlgZ/lgaDlgaLlgaPlgablgaflgarlga3lgbDlgbHlgLvlgoHlgoPlgoTlgoblgorlgo7lgo/lgpBcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmIyYTFcIixcblx0XHRcIuWCkuWCk+WClOWCluWCm+WCnOWCnlwiLFxuXHRcdDQsXG5cdFx0XCLlgqrlgq/lgrDlgrnlgrrlgr3lg4Dlg4Plg4Tlg4flg4zlg47lg5Dlg5Plg5Tlg5jlg5zlg53lg5/lg6Llg6Tlg6blg6jlg6nlg6/lg7Hlg7blg7rlg77lhIPlhIblhIflhIjlhIvlhIzlhI3lhI7lg7LlhJDlhJflhJnlhJvlhJzlhJ3lhJ7lhKPlhKflhKjlhKzlhK3lhK/lhLHlhLPlhLTlhLXlhLjlhLnlhYLlhYrlhY/lhZPlhZXlhZflhZjlhZ/lhaTlhablhb7lhoPlhoTlhovlho7lhpjlhp3lhqHlhqPlhq3lhrjlhrrlhrzlhr7lhr/lh4JcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmIzYTFcIixcblx0XHRcIuWHiOWHj+WHkeWHkuWHk+WHleWHmOWHnuWHouWHpeWHruWHsuWHs+WHtOWHt+WIgeWIguWIheWIkuWIk+WIleWIluWImOWIouWIqOWIseWIsuWIteWIvOWJheWJieWJleWJl+WJmOWJmuWJnOWJn+WJoOWJoeWJpuWJruWJt+WJuOWJueWKgOWKguWKheWKiuWKjOWKk+WKleWKluWKl+WKmOWKmuWKnOWKpOWKpeWKpuWKp+WKr+WKsOWKtuWKt+WKuOWKuuWKu+WKveWLgOWLhOWLhuWLiOWLjOWLj+WLkeWLlOWLluWLm+WLnOWLoeWLpeWLqOWLqeWLquWLrOWLsOWLseWLtOWLtuWLt+WMgOWMg+WMiuWMi1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYjRhMVwiLFxuXHRcdFwi5YyM5YyR5YyT5YyY5Yyb5Yyc5Yye5Yyf5Yyl5Yyn5Yyo5Yyp5Yyr5Yys5Yyt5Yyw5Yyy5Yy15Yy85Yy95Yy+5Y2C5Y2M5Y2L5Y2Z5Y2b5Y2h5Y2j5Y2l5Y2s5Y2t5Y2y5Y255Y2+5Y6D5Y6H5Y6I5Y6O5Y6T5Y6U5Y6Z5Y6d5Y6h5Y6k5Y6q5Y6r5Y6v5Y6y5Y605Y615Y635Y645Y665Y695Y+A5Y+F5Y+P5Y+S5Y+T5Y+V5Y+a5Y+d5Y+e5Y+g5Y+m5Y+n5Y+15ZCC5ZCT5ZCa5ZCh5ZCn5ZCo5ZCq5ZCv5ZCx5ZC05ZC15ZGD5ZGE5ZGH5ZGN5ZGP5ZGe5ZGi5ZGk5ZGm5ZGn5ZGp5ZGr5ZGt5ZGu5ZG05ZG/XCJcblx0XSxcblx0W1xuXHRcdFwiOGZiNWExXCIsXG5cdFx0XCLlkoHlkoPlkoXlkojlkonlko3lkpHlkpXlkpblkpzlkp/lkqHlkqblkqflkqnlkqrlkq3lkq7lkrHlkrflkrnlkrrlkrvlkr/lk4blk4rlk43lk47lk6Dlk6rlk6zlk6/lk7blk7zlk77lk7/llIDllIHllIXllIjllInllIzllI3llI7llJXllKrllKvllLLllLXllLbllLvllLzllL3llYHllYfllYnllYrllY3llZDllZHllZjllZrllZvllZ7llaDllaHllaTllabllb/lloHlloLllobllojllo7llo/llpHllpLllpPllpTllpfllqPllqTllq3llrLllr/ll4Hll4Pll4bll4nll4vll4zll47ll5Hll5JcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmI2YTFcIixcblx0XHRcIuWXk+WXl+WXmOWXm+WXnuWXouWXqeWXtuWXv+WYheWYiOWYiuWYjVwiLFxuXHRcdDUsXG5cdFx0XCLlmJnlmKzlmLDlmLPlmLXlmLflmLnlmLvlmLzlmL3lmL/lmYDlmYHlmYPlmYTlmYblmYnlmYvlmY3lmY/lmZTlmZ7lmaDlmaHlmaLlmaPlmablmanlma3lma/lmbHlmbLlmbXlmoTlmoXlmojlmovlmozlmpXlmpnlmprlmp3lmp7lmp/lmqblmqflmqjlmqnlmqvlmqzlmq3lmrHlmrPlmrflmr7lm4Xlm4nlm4rlm4vlm4/lm5Dlm4zlm43lm5nlm5zlm53lm5/lm6Hlm6RcIixcblx0XHQ0LFxuXHRcdFwi5Zux5Zur5ZutXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiN2ExXCIsXG5cdFx0XCLlm7blm7flnIHlnILlnIflnIrlnIzlnJHlnJXlnJrlnJvlnJ3lnKDlnKLlnKPlnKTlnKXlnKnlnKrlnKzlnK7lnK/lnLPlnLTlnL3lnL7lnL/lnYXlnYblnYzlnY3lnZLlnaLlnaXlnaflnajlnavlna1cIixcblx0XHQ0LFxuXHRcdFwi5Z2z5Z205Z215Z235Z255Z265Z275Z285Z2+5Z6B5Z6D5Z6M5Z6U5Z6X5Z6Z5Z6a5Z6c5Z6d5Z6e5Z6f5Z6h5Z6V5Z6n5Z6o5Z6p5Z6s5Z645Z695Z+H5Z+I5Z+M5Z+P5Z+V5Z+d5Z+e5Z+k5Z+m5Z+n5Z+p5Z+t5Z+w5Z+15Z+25Z+45Z+95Z++5Z+/5aCD5aCE5aCI5aCJ5Z+hXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiOGExXCIsXG5cdFx0XCLloIzloI3loJvloJ7loJ/loKDloKbloKfloK3loLLloLnloL/loYnloYzloY3loY/loZDloZXloZ/loaHloaTloafloajlobjlobzlob/looDlooHloofloojloonloorloozloo3loo/lopDlopTlopblop3loqDloqHloqLloqbloqnlorHlorLlo4Tlorzlo4Llo4jlo43lo47lo5Dlo5Llo5Tlo5blo5rlo53lo6Hlo6Llo6nlo7PlpIXlpIblpIvlpIzlpJLlpJPlpJTomYHlpJ3lpKHlpKPlpKTlpKjlpK/lpLDlpLPlpLXlpLblpL/lpYPlpYblpZLlpZPlpZnlpZvlpZ3lpZ7lpZ/lpaHlpaPlpavlpa1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmI5YTFcIixcblx0XHRcIuWlr+WlsuWlteWltuWlueWlu+WlvOWmi+WmjOWmjuWmkuWmleWml+Wmn+WmpOWmp+WmreWmruWmr+WmsOWms+Wmt+WmuuWmvOWngeWng+WnhOWniOWniuWnjeWnkuWnneWnnuWnn+Wno+WnpOWnp+WnruWnr+WnseWnsuWntOWnt+WogOWohOWojOWojeWojuWokuWok+WonuWoo+WopOWop+WoqOWoquWoreWosOWphOWpheWph+WpiOWpjOWpkOWpleWpnuWpo+WppeWpp+WpreWpt+WpuuWpu+WpvuWqi+WqkOWqk+WqluWqmeWqnOWqnuWqn+WqoOWqouWqp+WqrOWqseWqsuWqs+WqteWquOWquuWqu+Wqv1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYmFhMVwiLFxuXHRcdFwi5auE5auG5auI5auP5aua5auc5aug5aul5auq5auu5au15au25au95ayA5ayB5ayI5ayX5ay05ayZ5ayb5ayd5ayh5ayl5ayt5ay45a2B5a2L5a2M5a2S5a2W5a2e5a2o5a2u5a2v5a285a295a2+5a2/5a6B5a6E5a6G5a6K5a6O5a6Q5a6R5a6T5a6U5a6W5a6o5a6p5a6s5a6t5a6v5a6x5a6y5a635a665a685a+A5a+B5a+N5a+P5a+WXCIsXG5cdFx0NCxcblx0XHRcIuWvoOWvr+WvseWvtOWvveWwjOWwl+WwnuWwn+Wwo+WwpuWwqeWwq+WwrOWwruWwsOWwsuWwteWwtuWxmeWxmuWxnOWxouWxo+Wxp+WxqOWxqVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYmJhMVwiLFxuXHRcdFwi5bGt5bGw5bG05bG15bG65bG75bG85bG95bKH5bKI5bKK5bKP5bKS5bKd5bKf5bKg5bKi5bKj5bKm5bKq5bKy5bK05bK15bK65bOJ5bOL5bOS5bOd5bOX5bOu5bOx5bOy5bO05bSB5bSG5bSN5bSS5bSr5bSj5bSk5bSm5bSn5bSx5bS05bS55bS95bS/5bWC5bWD5bWG5bWI5bWV5bWR5bWZ5bWK5bWf5bWg5bWh5bWi5bWk5bWq5bWt5bWw5bW55bW65bW+5bW/5baB5baD5baI5baK5baS5baT5baU5baV5baZ5bab5baf5bag5ban5bar5baw5ba05ba45ba55beD5beH5beL5beQ5beO5beY5beZ5beg5bekXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiY2ExXCIsXG5cdFx0XCLlt6nlt7jlt7nluIDluIfluI3luJLluJTluJXluJjluJ/luKDluK7luKjluLLluLXluL7luYvluZDluYnluZHluZbluZjluZvluZzluZ7luajluapcIixcblx0XHQ0LFxuXHRcdFwi5bmw5bqA5bqL5bqO5bqi5bqk5bql5bqo5bqq5bqs5bqx5bqz5bq95bq+5bq/5buG5buM5buL5buO5buR5buS5buU5buV5buc5bue5bul5bur5byC5byG5byH5byI5byO5byZ5byc5byd5byh5byi5byj5byk5byo5byr5bys5byu5byw5by05by25by75by95by/5b2A5b2E5b2F5b2H5b2N5b2Q5b2U5b2Y5b2b5b2g5b2j5b2k5b2nXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiZGExXCIsXG5cdFx0XCLlva/lvbLlvbTlvbXlvbjlvbrlvb3lvb7lvonlvo3lvo/lvpblvpzlvp3lvqLlvqflvqvlvqTlvqzlvq/lvrDlvrHlvrjlv4Tlv4flv4jlv4nlv4vlv5BcIixcblx0XHQ0LFxuXHRcdFwi5b+e5b+h5b+i5b+o5b+p5b+q5b+s5b+t5b+u5b+v5b+y5b+z5b+25b+65b+85oCH5oCK5oCN5oCT5oCU5oCX5oCY5oCa5oCf5oCk5oCt5oCz5oC15oGA5oGH5oGI5oGJ5oGM5oGR5oGU5oGW5oGX5oGd5oGh5oGn5oGx5oG+5oG/5oKC5oKG5oKI5oKK5oKO5oKR5oKT5oKV5oKY5oKd5oKe5oKi5oKk5oKl5oKo5oKw5oKx5oK3XCJcblx0XSxcblx0W1xuXHRcdFwiOGZiZWExXCIsXG5cdFx0XCLmgrvmgr7mg4Lmg4Tmg4jmg4nmg4rmg4vmg47mg4/mg5Tmg5Xmg5nmg5vmg53mg57mg6Lmg6Xmg7Lmg7Xmg7jmg7zmg73mhILmhIfmhIrmhIzmhJBcIixcblx0XHQ0LFxuXHRcdFwi5oSW5oSX5oSZ5oSc5oSe5oSi5oSq5oSr5oSw5oSx5oS15oS25oS35oS55oWB5oWF5oWG5oWJ5oWe5oWg5oWs5oWy5oW45oW75oW85oW/5oaA5oaB5oaD5oaE5oaL5oaN5oaS5oaT5oaX5oaY5oac5oad5oaf5oag5oal5oao5oaq5oat5oa45oa55oa85oeA5oeB5oeC5oeO5oeP5oeV5oec5oed5oee5oef5oeh5oei5oen5oep5oelXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiZmExXCIsXG5cdFx0XCLmh6zmh63mh6/miIHmiIPmiITmiIfmiJPmiJXmiJzmiKDmiKLmiKPmiKfmiKnmiKvmiLnmiL3miYLmiYPmiYTmiYbmiYzmiZDmiZHmiZLmiZTmiZbmiZrmiZzmiaTmia3mia/mibPmibrmib3mio3mio7mio/mipDmiqbmiqjmirPmirbmirfmirrmir7mir/mi4Tmi47mi5Xmi5bmi5rmi6rmi7Lmi7Tmi7zmi73mjIPmjITmjIrmjIvmjI3mjJDmjJPmjJbmjJjmjKnmjKrmjK3mjLXmjLbmjLnmjLzmjYHmjYLmjYPmjYTmjYbmjYrmjYvmjY7mjZLmjZPmjZTmjZjmjZvmjaXmjabmjazmja3mjbHmjbTmjbVcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmMwYTFcIixcblx0XHRcIuaNuOaNvOaNveaNv+aOguaOhOaOh+aOiuaOkOaOlOaOleaOmeaOmuaOnuaOpOaOpuaOreaOruaOr+aOveaPgeaPheaPiOaPjuaPkeaPk+aPlOaPleaPnOaPoOaPpeaPquaPrOaPsuaPs+aPteaPuOaPueaQieaQiuaQkOaQkuaQlOaQmOaQnuaQoOaQouaQpOaQpeaQqeaQquaQr+aQsOaQteaQveaQv+aRi+aRj+aRkeaRkuaRk+aRlOaRmuaRm+aRnOaRneaRn+aRoOaRoeaRo+aRreaRs+aRtOaRu+aRveaSheaSh+aSj+aSkOaSkeaSmOaSmeaSm+aSneaSn+aSoeaSo+aSpuaSqOaSrOaSs+aSveaSvuaSv1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYzFhMVwiLFxuXHRcdFwi5pOE5pOJ5pOK5pOL5pOM5pOO5pOQ5pOR5pOV5pOX5pOk5pOl5pOp5pOq5pOt5pOw5pO15pO35pO75pO/5pSB5pSE5pSI5pSJ5pSK5pSP5pST5pSU5pSW5pSZ5pSb5pSe5pSf5pSi5pSm5pSp5pSu5pSx5pS65pS85pS95pWD5pWH5pWJ5pWQ5pWS5pWU5pWf5pWg5pWn5pWr5pW65pW95paB5paF5paK5paS5paV5paY5pad5pag5paj5pam5pau5pay5paz5pa05pa/5peC5peI5peJ5peO5peQ5peU5peW5peY5pef5pew5pey5pe05pe15pe55pe+5pe/5piA5piE5piI5piJ5piN5piR5piS5piV5piW5pidXCJcblx0XSxcblx0W1xuXHRcdFwiOGZjMmExXCIsXG5cdFx0XCLmmJ7mmKHmmKLmmKPmmKTmmKbmmKnmmKrmmKvmmKzmmK7mmLDmmLHmmLPmmLnmmLfmmYDmmYXmmYbmmYrmmYzmmZHmmY7mmZfmmZjmmZnmmZvmmZzmmaDmmaHmm7vmmarmmavmmazmmb7mmbPmmbXmmb/mmbfmmbjmmbnmmbvmmoDmmbzmmovmmozmmo3mmpDmmpLmmpnmmprmmpvmmpzmmp/mmqDmmqTmmq3mmrHmmrLmmrXmmrvmmr/mm4Dmm4Lmm4Pmm4jmm4zmm47mm4/mm5Tmm5vmm5/mm6jmm6vmm6zmm67mm7rmnIXmnIfmnI7mnJPmnJnmnJzmnKDmnKLmnLPmnL7mnYXmnYfmnYjmnYzmnZTmnZXmnZ1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmMzYTFcIixcblx0XHRcIuadpuadrOadruadtOadtuadu+aegeaehOaejuaej+aekeaek+aeluaemOaemeaem+aesOaeseaesuaeteaeu+aevOaeveafueafgOafguafg+afheafiOafieafkuafl+afmeafnOafoeafpuafsOafsuaftuaft+ahkuaglOagmeagneagn+agqOagp+agrOagreagr+agsOagseags+agu+agv+ahhOahheahiuahjOahleahl+ahmOahm+ahq+ahrlwiLFxuXHRcdDQsXG5cdFx0XCLmobXmobnmobrmobvmobzmooLmooTmoobmoojmopbmopjmoprmopzmoqHmoqPmoqXmoqnmoqrmoq7morLmorvmo4Xmo4jmo4zmo49cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmM0YTFcIixcblx0XHRcIuajkOajkeajk+ajluajmeajnOajneajpeajqOajquajq+ajrOajreajsOajseajteajtuaju+ajvOajveakhuakieakiuakkOakkeakk+akluakl+akseaks+akteakuOaku+algualhealiealjuall+alm+alo+alpOalpealpualqOalqealrOalsOalsealsualuualu+alv+amgOamjeamkuamluammOamoeampeampuamqOamq+amreamr+amt+amuOamuuamvOanheaniOankeanluanl+anouanpeanruanr+anseans+anteanvuaogOaogeaog+aoj+aokeaoleaomuaoneaooOaopOaoqOaosOaoslwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYzVhMVwiLFxuXHRcdFwi5qi05qi35qi75qi+5qi/5qmF5qmG5qmJ5qmK5qmO5qmQ5qmR5qmS5qmV5qmW5qmb5qmk5qmn5qmq5qmx5qmz5qm+5qqB5qqD5qqG5qqH5qqJ5qqL5qqR5qqb5qqd5qqe5qqf5qql5qqr5qqv5qqw5qqx5qq05qq95qq+5qq/5quG5quJ5quI5quM5quQ5quU5quV5quW5quc5qud5quk5qun5qus5quw5qux5quy5qu85qu95qyC5qyD5qyG5qyH5qyJ5qyP5qyQ5qyR5qyX5qyb5qye5qyk5qyo5qyr5qys5qyv5qy15qy25qy75qy/5q2G5q2K5q2N5q2S5q2W5q2Y5q2d5q2g5q2n5q2r5q2u5q2w5q215q29XCJcblx0XSxcblx0W1xuXHRcdFwiOGZjNmExXCIsXG5cdFx0XCLmrb7mroLmroXmrpfmrpvmrp/mrqDmrqLmrqPmrqjmrqnmrqzmrq3mrq7mrrDmrrjmrrnmrr3mrr7mr4Pmr4Tmr4nmr4zmr5bmr5rmr6Hmr6Pmr6bmr6fmr67mr7Hmr7fmr7nmr7/msILmsITmsIXmsInmsI3msI7msJDmsJLmsJnmsJ/msKbmsKfmsKjmsKzmsK7msLPmsLXmsLbmsLrmsLvmsL/msYrmsYvmsY3msY/msZLmsZTmsZnmsZvmsZzmsavmsa3msa/msbTmsbbmsbjmsbnmsbvmsoXmsobmsofmsonmspTmspXmspfmspjmspzmsp/msrDmsrLmsrTms4Lms4bms43ms4/ms5Dms5Hms5Lms5Tms5ZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmM3YTFcIixcblx0XHRcIuazmuaznOazoOazp+azqeazq+azrOazruazsuaztOa0hOa0h+a0iua0jua0j+a0kea0k+a0mua0pua0p+a0qOaxp+a0rua0r+a0sea0uea0vOa0v+a1l+a1nua1n+a1oea1pea1p+a1r+a1sOa1vOa2gua2h+a2kea2kua2lOa2lua2l+a2mOa2qua2rOa2tOa2t+a2uea2vea2v+a3hOa3iOa3iua3jua3j+a3lua3m+a3nea3n+a3oOa3oua3pea3qea3r+a3sOa3tOa3tua3vOa4gOa4hOa4nua4oua4p+a4sua4tua4uea4u+a4vOa5hOa5hea5iOa5iea5i+a5j+a5kea5kua5k+a5lOa5l+a5nOa5nea5nlwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYzhhMVwiLFxuXHRcdFwi5rmi5rmj5rmo5rmz5rm75rm95rqN5rqT5rqZ5rqg5rqn5rqt5rqu5rqx5rqz5rq75rq/5ruA5ruB5ruD5ruH5ruI5ruK5ruN5ruO5ruP5rur5rut5ruu5ru55ru75ru95ryE5ryI5ryK5ryM5ryN5ryW5ryY5rya5ryb5rym5ryp5ryq5ryv5ryw5ryz5ry25ry75ry85ryt5r2P5r2R5r2S5r2T5r2X5r2Z5r2a5r2d5r2e5r2h5r2i5r2o5r2s5r295r2+5r6D5r6H5r6I5r6L5r6M5r6N5r6Q5r6S5r6T5r6U5r6W5r6a5r6f5r6g5r6l5r6m5r6n5r6o5r6u5r6v5r6w5r615r625r685r+F5r+H5r+I5r+KXCJcblx0XSxcblx0W1xuXHRcdFwiOGZjOWExXCIsXG5cdFx0XCLmv5rmv57mv6jmv6nmv7Dmv7Xmv7nmv7zmv73ngIDngIXngIbngIfngI3ngJfngKDngKPngK/ngLTngLfngLnngLzngYPngYTngYjngYnngYrngYvngZTngZXngZ3ngZ7ngY7ngaTngaXngaznga7ngbXngbbngb7ngoHngoXngobngpRcIixcblx0XHQ0LFxuXHRcdFwi54Kb54Kk54Kr54Kw54Kx54K054K354OK54OR54OT54OU54OV54OW54OY54Oc54Ok54O654SDXCIsXG5cdFx0NCxcblx0XHRcIueEi+eEjOeEj+eEnueEoOeEq+eEreeEr+eEsOeEseeEuOeFgeeFheeFhueFh+eFiueFi+eFkOeFkueFl+eFmueFnOeFnueFoFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmY2FhMVwiLFxuXHRcdFwi54Wo54W554aA54aF54aH54aM54aS54aa54ab54ag54ai54av54aw54ay54az54a654a/54eA54eB54eE54eL54eM54eT54eW54eZ54ea54ec54e454e+54iA54iH54iI54iJ54iT54iX54ia54id54if54ik54ir54iv54i054i454i554mB54mC54mD54mF54mO54mP54mQ54mT54mV54mW54ma54mc54me54mg54mj54mo54mr54mu54mv54mx54m354m454m754m854m/54qE54qJ54qN54qO54qT54qb54qo54qt54qu54qx54q054q+54uB54uH54uJ54uM54uV54uW54uY54uf54ul54uz54u054u654u7XCJcblx0XSxcblx0W1xuXHRcdFwiOGZjYmExXCIsXG5cdFx0XCLni77njILnjITnjIXnjIfnjIvnjI3njJLnjJPnjJjnjJnnjJ7njKLnjKTnjKfnjKjnjKznjLHnjLLnjLXnjLrnjLvnjL3njYPnjY3njZDnjZLnjZbnjZjnjZ3njZ7njZ/njaDnjabnjafnjannjavnjaznja7nja/njbHnjbfnjbnnjbznjoDnjoHnjoPnjoXnjobnjo7njpDnjpPnjpXnjpfnjpjnjpznjp7njp/njqDnjqLnjqXnjqbnjqrnjqvnjq3njrXnjrfnjrnnjrznjr3njr/nj4Xnj4bnj4nnj4vnj4znj4/nj5Lnj5Pnj5bnj5nnj53nj6Hnj6Pnj6bnj6fnj6nnj7Tnj7Xnj7fnj7nnj7rnj7vnj71cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmNjYTFcIixcblx0XHRcIuePv+eQgOeQgeeQhOeQh+eQiueQkeeQmueQm+eQpOeQpueQqFwiLFxuXHRcdDksXG5cdFx0XCLnkLnnkYDnkYPnkYTnkYbnkYfnkYvnkY3nkZHnkZLnkZfnkZ3nkaLnkabnkafnkajnkavnka3nka7nkbHnkbLnkoDnkoHnkoXnkobnkofnkonnko/nkpDnkpHnkpLnkpjnkpnnkprnkpznkp/nkqDnkqHnkqPnkqbnkqjnkqnnkqrnkqvnkq7nkq/nkrHnkrLnkrXnkrnnkrvnkr/nk4jnk4nnk4znk5Dnk5Pnk5jnk5rnk5vnk57nk5/nk6Tnk6jnk6rnk6vnk6/nk7Tnk7rnk7vnk7znk7/nlIZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmNkYTFcIixcblx0XHRcIueUkueUlueUl+eUoOeUoeeUpOeUp+eUqeeUqueUr+eUtueUueeUveeUvueUv+eVgOeVg+eVh+eViOeVjueVkOeVkueVl+eVnueVn+eVoeeVr+eVseeVuVwiLFxuXHRcdDUsXG5cdFx0XCLnloHnloXnlpDnlpLnlpPnlpXnlpnnlpznlqLnlqTnlrTnlrrnlr/nl4Dnl4Hnl4Tnl4bnl4znl47nl4/nl5fnl5znl5/nl6Dnl6Hnl6Tnl6fnl6znl67nl6/nl7Hnl7nnmIDnmILnmIPnmITnmIfnmIjnmIrnmIznmI/nmJLnmJPnmJXnmJbnmJnnmJvnmJznmJ3nmJ7nmKPnmKXnmKbnmKnnmK3nmLLnmLPnmLXnmLjnmLlcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmNlYTFcIixcblx0XHRcIueYuueYvOeZiueZgOeZgeeZg+eZhOeZheeZieeZi+eZleeZmeeZn+eZpOeZpeeZreeZrueZr+eZseeZtOeageeaheeajOeajeealeeam+eanOeaneean+eaoOeaolwiLFxuXHRcdDYsXG5cdFx0XCLnmqrnmq3nmr3nm4Hnm4Xnm4nnm4vnm4znm47nm5Tnm5nnm6Dnm6bnm6jnm6znm7Dnm7Hnm7bnm7nnm7znnIDnnIbnnIrnnI7nnJLnnJTnnJXnnJfnnJnnnJrnnJznnKLnnKjnnK3nnK7nnK/nnLTnnLXnnLbnnLnnnL3nnL7nnYLnnYXnnYbnnYrnnY3nnY7nnY/nnZLnnZbnnZfnnZznnZ7nnZ/nnaDnnaJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmNmYTFcIixcblx0XHRcIuedpOedp+edquedrOedsOedsueds+edtOeduuedveeegOeehOeejOeejeeelOeeleeelueemueen+eeoueep+eequeerueer+eeseeeteeevuefg+efieefkeefkuefleefmeefnuefn+efoOefpOefpuefquefrOefsOefseeftOefuOefu+egheeghuegieegjeegjuegkeegneegoeegouego+egreegruegsOegteegt+ehg+ehhOehh+ehiOehjOehjuehkuehnOehnuehoOehoeeho+ehpOehqOehquehruehuuehvueiiueij+eilOeimOeioeeineeinuein+eipOeiqOeirOeireeisOeiseeisueis1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmZDBhMVwiLFxuXHRcdFwi56K756K956K/56OH56OI56OJ56OM56OO56OS56OT56OV56OW56Ok56Ob56Of56Og56Oh56Om56Oq56Oy56Oz56SA56O256O356O656O756O/56SG56SM56SQ56Sa56Sc56Se56Sf56Sg56Sl56Sn56Sp56St56Sx56S056S156S756S956S/56WE56WF56WG56WK56WL56WP56WR56WU56WY56Wb56Wc56Wn56Wp56Wr56Wy56W556W756W856W+56aL56aM56aR56aT56aU56aV56aW56aY56ab56ac56ah56ao56ap56ar56av56ax56a056a456a756eC56eE56eH56eI56eK56eP56eU56eW56ea56ed56eeXCJcblx0XSxcblx0W1xuXHRcdFwiOGZkMWExXCIsXG5cdFx0XCLnp6Dnp6Lnp6Xnp6rnp6vnp63np7Hnp7jnp7znqILnqIPnqIfnqInnqIrnqIznqJHnqJXnqJvnqJ7nqKHnqKfnqKvnqK3nqK/nqLDnqLTnqLXnqLjnqLnnqLrnqYTnqYXnqYfnqYjnqYznqZXnqZbnqZnnqZznqZ3nqZ/nqaDnqaXnqafnqarnqa3nqbXnqbjnqb7nqoDnqoLnqoXnqobnqornqovnqpDnqpHnqpTnqp7nqqDnqqPnqqznqrPnqrXnqrnnqrvnqrznq4bnq4nnq4znq47nq5Hnq5vnq6jnq6nnq6vnq6znq7Hnq7Tnq7vnq73nq77nrIfnrJTnrJ/nrKPnrKfnrKnnrKrnrKvnrK3nrK7nrK/nrLBcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmQyYTFcIixcblx0XHRcIuesseestOesveesv+etgOetgeeth+etjuetleetoOetpOetpuetqeetquetreetr+etsuets+ett+euhOeuieeujueukOeukeeulueum+eunueuoOeupeeurOeur+eusOeusueuteeutueuuueuu+euvOeuveevguevheeviOeviuevlOevluevl+evmeevmuevm+evqOevquevsuevtOevteevuOevueevuuevvOevvuewgeewguewg+ewhOewhuewieewi+ewjOewjuewj+ewmeewm+ewoOewpeewpuewqOewrOewseews+ewtOewtuewueewuuexhuexiuexleexkeexkuexk+exmVwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiOGZkM2ExXCIsXG5cdFx0XCLnsaHnsaPnsafnsannsa3nsa7nsbDnsbLnsbnnsbznsb3nsobnsofnso/nspTnsp7nsqDnsqbnsrDnsrbnsrfnsrrnsrvnsrznsr/ns4Tns4fns4jns4nns43ns4/ns5Pns5Tns5Xns5fns5nns5rns53ns6bns6nns6vns7XntIPntIfntIjntInntI/ntJHntJLntJPntJbntJ3ntJ7ntKPntKbntKrntK3ntLHntLzntL3ntL7ntYDntYHntYfntYjntY3ntZHntZPntZfntZnntZrntZzntZ3ntaXntafntarntbDntbjntbrntbvntb/ntoHntoLntoPntoXntobntojntovntoznto3ntpHntpbntpfntp1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmQ0YTFcIixcblx0XHRcIue2nue2pue2p+e2que2s+e2tue2t+e2uee3glwiLFxuXHRcdDQsXG5cdFx0XCLnt4znt43nt47nt5fnt5nnuIDnt6Lnt6Xnt6bnt6rnt6vnt63nt7Hnt7Xnt7bnt7nnt7rnuIjnuJDnuJHnuJXnuJfnuJznuJ3nuKDnuKfnuKjnuKznuK3nuK/nuLPnuLbnuL/nuYTnuYXnuYfnuY7nuZDnuZLnuZjnuZ/nuaHnuaLnuaXnuavnua7nua/nubPnubjnub7nuoHnuobnuofnuornuo3nupHnupXnupjnuprnup3nup7nvLznvLvnvL3nvL7nvL/nvYPnvYTnvYfnvY/nvZLnvZPnvZvnvZznvZ3nvaHnvaPnvaTnvaXnvabnva1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmQ1YTFcIixcblx0XHRcIue9see9vee9vue9v+e+gOe+i+e+jee+j+e+kOe+kee+lue+l+e+nOe+oee+oue+pue+que+ree+tOe+vOe+v+e/gOe/g+e/iOe/jue/j+e/m+e/n+e/o+e/pee/qOe/rOe/rue/r+e/sue/uue/vee/vue/v+iAh+iAiOiAiuiAjeiAjuiAj+iAkeiAk+iAlOiAluiAneiAnuiAn+iAoOiApOiApuiArOiAruiAsOiAtOiAteiAt+iAueiAuuiAvOiAvuiBgOiBhOiBoOiBpOiBpuiBreiBseiBteiCgeiCiOiCjuiCnOiCnuiCpuiCp+iCq+iCuOiCueiDiOiDjeiDj+iDkuiDlOiDleiDl+iDmOiDoOiDreiDrlwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZDZhMVwiLFxuXHRcdFwi6IOw6IOy6IOz6IO26IO56IO66IO+6ISD6ISL6ISW6ISX6ISY6ISc6ISe6ISg6ISk6ISn6ISs6ISw6IS16IS66IS86IWF6IWH6IWK6IWM6IWS6IWX6IWg6IWh6IWn6IWo6IWp6IWt6IWv6IW36IaB6IaQ6IaE6IaF6IaG6IaL6IaO6IaW6IaY6Iab6Iae6Iai6Iau6Iay6Ia06Ia76IeL6IeD6IeF6IeK6IeO6IeP6IeV6IeX6Ieb6Ied6Iee6Ieh6Iek6Ier6Ies6Iew6Iex6Iey6Ie16Ie26Ie46Ie56Ie96Ie/6IiA6IiD6IiP6IiT6IiU6IiZ6Iia6Iid6Iih6Iii6Iio6Iiy6Ii06Ii66ImD6ImE6ImF6ImGXCJcblx0XSxcblx0W1xuXHRcdFwiOGZkN2ExXCIsXG5cdFx0XCLoiYvoiY7oiY/oiZHoiZboiZzoiaDoiaPoiafoia3oibToibvoib3oib/oioDoioHoioPoioToiofoionoioroio7oipHoipToipboipjoiproipvoiqDoiqHoiqPoiqToiqfoiqjoiqnoiqroiq7oirDoirLoirToirfoirroirzoir7oir/oi4boi5Doi5Xoi5roi6Doi6Loi6Toi6joi6roi63oi6/oi7boi7foi73oi77ojIDojIHojIfojIjojIrojIvojZTojJvojJ3ojJ7ojJ/ojKHojKLojKzojK3ojK7ojLDojLPojLfojLrojLzojL3ojYLojYPojYTojYfojY3ojY7ojZHojZXojZbojZfojbDojbhcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmQ4YTFcIixcblx0XHRcIuiNveiNv+iOgOiOguiOhOiOhuiOjeiOkuiOlOiOleiOmOiOmeiOm+iOnOiOneiOpuiOp+iOqeiOrOiOvuiOv+iPgOiPh+iPieiPj+iPkOiPkeiPlOiPneiNk+iPqOiPquiPtuiPuOiPueiPvOiQgeiQhuiQiuiQj+iQkeiQleiQmeiOreiQr+iQueiRheiRh+iRiOiRiuiRjeiRj+iRkeiRkuiRluiRmOiRmeiRmuiRnOiRoOiRpOiRpeiRp+iRquiRsOiRs+iRtOiRtuiRuOiRvOiRveiSgeiSheiSkuiSk+iSleiSnuiSpuiSqOiSqeiSquiSr+iSseiStOiSuuiSveiSvuiTgOiTguiTh+iTiOiTjOiTj+iTk1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmZDlhMVwiLFxuXHRcdFwi6JOc6JOn6JOq6JOv6JOw6JOx6JOy6JO36JSy6JO66JO76JO96JSC6JSD6JSH6JSM6JSO6JSQ6JSc6JSe6JSi6JSj6JSk6JSl6JSn6JSq6JSr6JSv6JSz6JS06JS26JS/6JWG6JWPXCIsXG5cdFx0NCxcblx0XHRcIuiVluiVmeiVnFwiLFxuXHRcdDYsXG5cdFx0XCLolaTolavola/olbnolbrolbvolb3olb/oloHoloXolobolonolovolozolo/olpPolpjolp3olp/olqDolqLolqXolqfolrTolrbolrfolrjolrzolr3olr7olr/ol4Lol4fol4rol4vol47olq3ol5jol5rol5/ol6Dol6bol6jol63ol7Pol7bol7xcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmRhYTFcIixcblx0XHRcIuiXv+iYgOiYhOiYheiYjeiYjuiYkOiYkeiYkuiYmOiYmeiYm+iYnuiYoeiYp+iYqeiYtuiYuOiYuuiYvOiYveiZgOiZguiZhuiZkuiZk+iZluiZl+iZmOiZmeiZneiZoFwiLFxuXHRcdDQsXG5cdFx0XCLomanomazoma/ombXombbombfombromo3ompHompbompjomprompzomqHomqbomqfomqjomq3omrHomrPomrTomrXomrfomrjomrnomr/om4Dom4Hom4Pom4Xom5Hom5Lom5Xom5fom5rom5zom6Dom6Pom6Xom6fomojom7rom7zom73onITonIXonIfonIvonI7onI/onJDonJPonJTonJnonJ7onJ/onKHonKNcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmRiYTFcIixcblx0XHRcIuicqOicruicr+icseicsuicueicuuicvOicveicvuidgOidg+idheidjeidmOidneidoeidpOidpeidr+idseidsuidu+ieg1wiLFxuXHRcdDYsXG5cdFx0XCLonovonozonpDonpPonpXonpfonpjonpnonp7onqDonqPonqfonqzonq3onq7onrHonrXonr7onr/on4Hon4jon4non4ron47on5Xon5bon5non5ron5zon5/on6Lon6Pon6Ton6ron6von63on7Hon7Pon7jon7ron7/ooIHooIPooIbooInooIrooIvooJDooJnooJLooJPooJTooJjooJrooJvooJzooJ7ooJ/ooKjooK3ooK7ooLDooLLooLVcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmRjYTFcIixcblx0XHRcIuiguuigvOihgeihg+ihheihiOihieihiuihi+ihjuihkeihleihluihmOihmuihnOihn+ihoOihpOihqeihseihueihu+iigOiimOiimuiim+iinOiin+iioOiiqOiiquiiuuiiveiivuijgOijilwiLFxuXHRcdDQsXG5cdFx0XCLoo5Hoo5Loo5Poo5voo57oo6foo6/oo7Doo7Hoo7Xoo7fopIHopIbopI3opI7opI/opJXopJbopJjopJnopJropJzopKDopKbopKfopKjopLDopLHopLLopLXopLnopLropL7opYDopYLopYXopYbopYnopY/opZLopZfopZropZvopZzopaHopaLopaPopavopa7opbDopbPopbXopbpcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmRkYTFcIixcblx0XHRcIuilu+ilvOilveimieimjeimkOimlOimleimm+imnOimn+imoOimpeimsOimtOimteimtuimt+imvOinlFwiLFxuXHRcdDQsXG5cdFx0XCLop6Xop6nop6vop63op7Hop7Pop7bop7nop73op7/oqIToqIXoqIfoqI/oqJHoqJLoqJToqJXoqJ7oqKDoqKLoqKToqKboqKvoqKzoqK/oqLXoqLfoqL3oqL7oqYDoqYPoqYXoqYfoqYnoqY3oqY7oqZPoqZboqZfoqZjoqZzoqZ3oqaHoqaXoqafoqbXoqbboqbfoqbnoqbroqbvoqb7oqb/oqoDoqoPoqoboqovoqo/oqpDoqpLoqpboqpfoqpnoqp/oqqfoqqnoqq7oqq/oqrNcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmRlYTFcIixcblx0XHRcIuiqtuiqt+iqu+iqvuirg+irhuiriOirieiriuirkeirk+irlOirleirl+irneirn+irrOirsOirtOirteirtuirvOirv+isheishuisi+iskeisnOisnuisn+isiuisreissOist+isvOitglwiLFxuXHRcdDQsXG5cdFx0XCLorYjorZLorZPorZTorZnorY3orZ7oraPora3orbborbjorbnorbzorb7oroHoroToroXorovoro3oro/orpTorpXorpzorp7orp/osLjosLnosL3osL7osYXosYfosYnosYvosY/osZHosZPosZTosZfosZjosZvosZ3osZnosaPosaTosabosajosanosa3osbPosbXosbbosbvosb7osoZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmRmYTFcIixcblx0XHRcIuiyh+iyi+iykOiykuiyk+iymeiym+iynOiypOiyueiyuuizheizhuizieizi+izj+izluizleizmeizneizoeizqOizrOizr+izsOizsuizteizt+izuOizvuizv+i0gei0g+i0iei0kui0l+i0m+i1pei1qei1rOi1rui1v+i2gui2hOi2iOi2jei2kOi2kei2lei2nui2n+i2oOi2pui2q+i2rOi2r+i2sui2tei2t+i2uei2u+i3gOi3hei3hui3h+i3iOi3iui3jui3kei3lOi3lei3l+i3mei3pOi3pei3p+i3rOi3sOi2vOi3sei3sui3tOi3vei4gei4hOi4hei4hui4i+i4kei4lOi4lui4oOi4oei4olwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZTBhMVwiLFxuXHRcdFwi6Lij6Lim6Lin6Lix6Liz6Li26Li36Li46Li56Li96LmA6LmB6LmL6LmN6LmO6LmP6LmU6Lmb6Lmc6Lmd6Lme6Lmh6Lmi6Lmp6Lms6Lmt6Lmv6Lmw6Lmx6Lm56Lm66Lm76LqC6LqD6LqJ6LqQ6LqS6LqV6Lqa6Lqb6Lqd6Lqe6Lqi6Lqn6Lqp6Lqt6Lqu6Lqz6Lq16Lq66Lq76LuA6LuB6LuD6LuE6LuH6LuP6LuR6LuU6Luc6Luo6Luu6Luw6Lux6Lu36Lu56Lu66Lut6LyA6LyC6LyH6LyI6LyP6LyQ6LyW6LyX6LyY6Lye6Lyg6Lyh6Lyj6Lyl6Lyn6Lyo6Lys6Lyt6Lyu6Ly06Ly16Ly26Ly36Ly66L2A6L2BXCJcblx0XSxcblx0W1xuXHRcdFwiOGZlMWExXCIsXG5cdFx0XCLovYPovYfovY/ovZFcIixcblx0XHQ0LFxuXHRcdFwi6L2Y6L2d6L2e6L2l6L6d6L6g6L6h6L6k6L6l6L6m6L616L626L646L6+6L+A6L+B6L+G6L+K6L+L6L+N6L+Q6L+S6L+T6L+V6L+g6L+j6L+k6L+o6L+u6L+x6L+16L+26L+76L++6YCC6YCE6YCI6YCM6YCY6YCb6YCo6YCp6YCv6YCq6YCs6YCt6YCz6YC06YC36YC/6YGD6YGE6YGM6YGb6YGd6YGi6YGm6YGn6YGs6YGw6YG06YG56YKF6YKI6YKL6YKM6YKO6YKQ6YKV6YKX6YKY6YKZ6YKb6YKg6YKh6YKi6YKl6YKw6YKy6YKz6YK06YK26YK96YOM6YK+6YODXCJcblx0XSxcblx0W1xuXHRcdFwiOGZlMmExXCIsXG5cdFx0XCLpg4Tpg4Xpg4fpg4jpg5Xpg5fpg5jpg5npg5zpg53pg5/pg6Xpg5Lpg7bpg6vpg6/pg7Dpg7Tpg77pg7/phIDphITphIXphIbphIjphI3phJDphJTphJbphJfphJjphJrphJzphJ7phKDphKXphKLphKPphKfphKnphK7phK/phLHphLTphLbphLfphLnphLrphLzphL3phYPphYfphYjphY/phZPphZfphZnphZrphZvphaHphaTphafpha3phbTphbnphbrphbvphoHphoPphoXphobphorpho7phpHphpPphpTphpXphpjphp7phqHphqbphqjphqzphq3phq7phrDphrHphrLphrPphrbphrvphrzphr3phr9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmUzYTFcIixcblx0XHRcIumHgumHg+mHhemHk+mHlOmHl+mHmemHmumHnumHpOmHpemHqemHqumHrFwiLFxuXHRcdDUsXG5cdFx0XCLph7fph7nph7vph73piIDpiIHpiITpiIXpiIbpiIfpiInpiIrpiIzpiJDpiJLpiJPpiJbpiJjpiJzpiJ3piKPpiKTpiKXpiKbpiKjpiK7piK/piLDpiLPpiLXpiLbpiLjpiLnpiLrpiLzpiL7piYDpiYLpiYPpiYbpiYfpiYrpiY3piY7piY/piZHpiZjpiZnpiZzpiZ3piaDpiaHpiaXpiafpiajpianpia7pia/pibDpibVcIixcblx0XHQ0LFxuXHRcdFwi6Ym76Ym86Ym96Ym/6YqI6YqJ6YqK6YqN6YqO6YqS6YqXXCJcblx0XSxcblx0W1xuXHRcdFwiOGZlNGExXCIsXG5cdFx0XCLpipnpip/piqDpiqTpiqXpiqfpiqjpiqvpiq/pirLpirbpirjpirrpirvpirzpir3pir9cIixcblx0XHQ0LFxuXHRcdFwi6YuF6YuG6YuH6YuI6YuL6YuM6YuN6YuO6YuQ6YuT6YuV6YuX6YuY6YuZ6Yuc6Yud6Yuf6Yug6Yuh6Yuj6Yul6Yun6Yuo6Yus6Yuu6Yuw6Yu56Yu76Yu/6YyA6YyC6YyI6YyN6YyR6YyU6YyV6Yyc6Yyd6Yye6Yyf6Yyh6Yyk6Yyl6Yyn6Yyp6Yyq6Yyz6Yy06Yy26Yy36Y2H6Y2I6Y2J6Y2Q6Y2R6Y2S6Y2V6Y2X6Y2Y6Y2a6Y2e6Y2k6Y2l6Y2n6Y2p6Y2q6Y2t6Y2v6Y2w6Y2x6Y2z6Y206Y22XCJcblx0XSxcblx0W1xuXHRcdFwiOGZlNWExXCIsXG5cdFx0XCLpjbrpjb3pjb/pjoDpjoHpjoLpjojpjorpjovpjo3pjo/pjpLpjpXpjpjpjpvpjp7pjqHpjqPpjqTpjqbpjqjpjqvpjrTpjrXpjrbpjrrpjqnpj4Hpj4Tpj4Xpj4bpj4fpj4lcIixcblx0XHQ0LFxuXHRcdFwi6Y+T6Y+Z6Y+c6Y+e6Y+f6Y+i6Y+m6Y+n6Y+56Y+36Y+46Y+66Y+76Y+96ZCB6ZCC6ZCE6ZCI6ZCJ6ZCN6ZCO6ZCP6ZCV6ZCW6ZCX6ZCf6ZCu6ZCv6ZCx6ZCy6ZCz6ZC06ZC76ZC/6ZC96ZGD6ZGF6ZGI6ZGK6ZGM6ZGV6ZGZ6ZGc6ZGf6ZGh6ZGj6ZGo6ZGr6ZGt6ZGu6ZGv6ZGx6ZGy6ZKE6ZKD6ZW46ZW5XCJcblx0XSxcblx0W1xuXHRcdFwiOGZlNmExXCIsXG5cdFx0XCLplb7ploTplojplozplo3plo7plp3plp7plp/plqHplqbplqnplqvplqzplrTplrbplrrplr3plr/pl4bpl4jpl4npl4vpl5Dpl5Hpl5Lpl5Ppl5npl5rpl53pl57pl5/pl6Dpl6Tpl6bpmJ3pmJ7pmKLpmKTpmKXpmKbpmKzpmLHpmLPpmLfpmLjpmLnpmLrpmLzpmL3pmYHpmZLpmZTpmZbpmZfpmZjpmaHpma7pmbTpmbvpmbzpmb7pmb/pmoHpmoLpmoPpmoTpmonpmpHpmpbpmprpmp3pmp/pmqTpmqXpmqbpmqnpmq7pmq/pmrPpmrrpm4rpm5LltrLpm5jpm5rpm53pm57pm5/pm6npm6/pm7Hpm7rpnIJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmU3YTFcIixcblx0XHRcIumcg+mchemciemcmumcm+mcnemcoemcoumco+mcqOmcsemcs+mdgemdg+mdiumdjumdj+mdlemdl+mdmOmdmumdm+mdo+mdp+mdqumdrumds+mdtumdt+mduOmdu+mdvemdv+megOmeiemelemelumel+memememumenumen+meoumerOmerumesemesumetemetumeuOmeuemeuumevOmevumev+mfgemfhOmfhemfh+mfiemfiumfjOmfjemfjumfkOmfkemflOmfl+mfmOmfmemfnemfnumfoOmfm+mfoemfpOmfr+mfsemftOmft+mfuOmfuumgh+mgiumgmemgjemgjumglOmglumgnOmgnumgoOmgo+mgplwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZThhMVwiLFxuXHRcdFwi6aCr6aCu6aCv6aCw6aCy6aCz6aC16aCl6aC+6aGE6aGH6aGK6aGR6aGS6aGT6aGW6aGX6aGZ6aGa6aGi6aGj6aGl6aGm6aGq6aGs6aKr6aKt6aKu6aKw6aK06aK36aK46aK66aK76aK/6aOC6aOF6aOI6aOM6aOh6aOj6aOl6aOm6aOn6aOq6aOz6aO26aSC6aSH6aSI6aSR6aSV6aSW6aSX6aSa6aSb6aSc6aSf6aSi6aSm6aSn6aSr6aSxXCIsXG5cdFx0NCxcblx0XHRcIumkuemkuumku+mkvOmlgOmlgemlhumlh+mliOmljemljumllOmlmOmlmemlm+mlnOmlnumln+mloOmmm+mmnemmn+mmpummsOmmsemmsummtVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZTlhMVwiLFxuXHRcdFwi6aa56aa66aa96aa/6aeD6aeJ6aeT6aeU6aeZ6aea6aec6aee6aen6aeq6aer6aes6aew6ae06ae16ae56ae96ae+6aiC6aiD6aiE6aiL6aiM6aiQ6aiR6aiW6aie6aig6aii6aij6aik6ain6ait6aiu6aiz6ai16ai26ai46amH6amB6amE6amK6amL6amM6amO6amR6amU6amW6amd6aqq6aqs6aqu6aqv6aqy6aq06aq16aq26aq56aq76aq+6aq/6auB6auD6auG6auI6auO6auQ6auS6auV6auW6auX6aub6auc6aug6auk6aul6aun6aup6aus6auy6auz6au16au56au66au96au/XCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCI4ZmVhYTFcIixcblx0XHRcIumshOmshemsiOmsiemsi+msjOmsjemsjumskOmskumslumsmemsm+msnOmsoOmspumsq+msremss+mstOmstemst+msuemsuumsvemtiOmti+mtjOmtlemtlumtl+mtm+mtnumtoemto+mtpemtpumtqOmtqlwiLFxuXHRcdDQsXG5cdFx0XCLprbPprbXprbfprbjprbnprb/proDproTproXprobprofpronprorprovpro3pro/prpDprpTprprprp3prp7prqbprqfprqnprqzprrDprrHprrLprrfprrjprrvprrzprr7prr/pr4Hpr4fpr4jpr47pr5Dpr5fpr5jpr53pr5/pr6Xpr6fpr6rpr6vpr6/pr7Ppr7fpr7hcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmViYTFcIixcblx0XHRcIumvuemvuumvvemvv+mwgOmwgumwi+mwj+mwkemwlumwmOmwmemwmumwnOmwnumwoumwo+mwplwiLFxuXHRcdDQsXG5cdFx0XCLpsLHpsLXpsLbpsLfpsL3psYHpsYPpsYTpsYXpsYnpsYrpsY7psY/psZDpsZPpsZTpsZbpsZjpsZvpsZ3psZ7psZ/psaPpsanpsarpsZzpsavpsajpsa7psbDpsbLpsbXpsbfpsbvps6bps7Lps7fps7nptIvptILptJHptJfptJjptJzptJ3ptJ7ptK/ptLDptLLptLPptLTptLrptLzptYXptL3ptYLptYPptYfptYrptZPptZTptZ/ptaPptaLptaXptanptarptavptbDptbbptbfptbtcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmVjYTFcIixcblx0XHRcIum1vOm1vum2g+m2hOm2hum2ium2jem2jum2kum2k+m2lem2lum2l+m2mOm2oem2qum2rOm2rum2sem2tem2uem2vOm2v+m3g+m3h+m3iem3ium3lOm3lem3lum3l+m3mum3num3n+m3oOm3pem3p+m3qem3q+m3rum3sOm3s+m3tOm3vum4ium4gum4h+m4jum4kOm4kem4kum4lem4lum4mem4nOm4nem5uum5u+m5vOm6gOm6gum6g+m6hOm6hem6h+m6jum6j+m6lum6mOm6m+m6num6pOm6qOm6rOm6rum6r+m6sOm6s+m6tOm6tem7hum7iOm7i+m7lem7n+m7pOm7p+m7rOm7rem7rum7sOm7sem7sum7tVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZWRhMVwiLFxuXHRcdFwi6bu46bu/6byC6byD6byJ6byP6byQ6byR6byS6byU6byW6byX6byZ6bya6byb6byf6byi6bym6byq6byr6byv6byx6byy6by06by36by56by66by86by96by/6b2B6b2DXCIsXG5cdFx0NCxcblx0XHRcIum9k+m9lem9lum9l+m9mOm9mum9nem9num9qOm9qem9rVwiLFxuXHRcdDQsXG5cdFx0XCLpvbPpvbXpvbrpvb3pvo/pvpDpvpHpvpLpvpTpvpbpvpfpvp7pvqHpvqLpvqPpvqVcIlxuXHRdXG5dO1xuXG52YXIgZXVjanAkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnZGVmYXVsdCc6IGV1Y2pwXG59KTtcblxudmFyIGNwOTM2ID0gW1xuXHRbXG5cdFx0XCIwXCIsXG5cdFx0XCJcXHUwMDAwXCIsXG5cdFx0MTI3LFxuXHRcdFwi4oKsXCJcblx0XSxcblx0W1xuXHRcdFwiODE0MFwiLFxuXHRcdFwi5LiC5LiE5LiF5LiG5LiP5LiS5LiX5Lif5Lig5Lih5Lij5Lim5Lip5Liu5Liv5Lix5Liz5Li15Li35Li85LmA5LmB5LmC5LmE5LmG5LmK5LmR5LmV5LmX5Lma5Lmb5Lmi5Lmj5Lmk5Lml5Lmn5Lmo5LmqXCIsXG5cdFx0NSxcblx0XHRcIuS5suS5tFwiLFxuXHRcdDksXG5cdFx0XCLkub9cIixcblx0XHQ2LFxuXHRcdFwi5LqH5LqKXCJcblx0XSxcblx0W1xuXHRcdFwiODE4MFwiLFxuXHRcdFwi5LqQ5LqW5LqX5LqZ5Lqc5Lqd5Lqe5Lqj5Lqq5Lqv5Lqw5Lqx5Lq05Lq25Lq35Lq45Lq55Lq85Lq95Lq+5LuI5LuM5LuP5LuQ5LuS5Lua5Lub5Luc5Lug5Lui5Lum5Lun5Lup5Lut5Luu5Luv5Lux5Lu05Lu45Lu55Lu65Lu85Lu+5LyA5LyCXCIsXG5cdFx0Nixcblx0XHRcIuS8i+S8jOS8klwiLFxuXHRcdDQsXG5cdFx0XCLkvJzkvJ3kvKHkvKPkvKjkvKnkvKzkvK3kvK7kvLHkvLPkvLXkvLfkvLnkvLvkvL5cIixcblx0XHQ0LFxuXHRcdFwi5L2E5L2F5L2HXCIsXG5cdFx0NSxcblx0XHRcIuS9kuS9lOS9luS9oeS9ouS9puS9qOS9quS9q+S9reS9ruS9seS9suS9teS9t+S9uOS9ueS9uuS9veS+gOS+geS+guS+heS+huS+h+S+iuS+jOS+juS+kOS+kuS+k+S+leS+luS+mOS+meS+muS+nOS+nuS+n+S+oeS+olwiXG5cdF0sXG5cdFtcblx0XHRcIjgyNDBcIixcblx0XHRcIuS+pOS+q+S+reS+sFwiLFxuXHRcdDQsXG5cdFx0XCLkvrZcIixcblx0XHQ4LFxuXHRcdFwi5L+A5L+B5L+C5L+G5L+H5L+I5L+J5L+L5L+M5L+N5L+SXCIsXG5cdFx0NCxcblx0XHRcIuS/meS/m+S/oOS/ouS/pOS/peS/p+S/q+S/rOS/sOS/suS/tOS/teS/tuS/t+S/ueS/u+S/vOS/veS/v1wiLFxuXHRcdDExXG5cdF0sXG5cdFtcblx0XHRcIjgyODBcIixcblx0XHRcIuWAi+WAjuWAkOWAkeWAk+WAleWAluWAl+WAm+WAneWAnuWAoOWAouWAo+WApOWAp+WAq+WAr1wiLFxuXHRcdDEwLFxuXHRcdFwi5YC75YC95YC/5YGA5YGB5YGC5YGE5YGF5YGG5YGJ5YGK5YGL5YGN5YGQXCIsXG5cdFx0NCxcblx0XHRcIuWBluWBl+WBmOWBmeWBm+WBnVwiLFxuXHRcdDcsXG5cdFx0XCLlgaZcIixcblx0XHQ1LFxuXHRcdFwi5YGtXCIsXG5cdFx0OCxcblx0XHRcIuWBuOWBueWBuuWBvOWBveWCgeWCguWCg+WChOWChuWCh+WCieWCiuWCi+WCjOWCjlwiLFxuXHRcdDIwLFxuXHRcdFwi5YKk5YKm5YKq5YKr5YKtXCIsXG5cdFx0NCxcblx0XHRcIuWCs1wiLFxuXHRcdDYsXG5cdFx0XCLlgrxcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MzQwXCIsXG5cdFx0XCLlgr1cIixcblx0XHQxNyxcblx0XHRcIuWDkFwiLFxuXHRcdDUsXG5cdFx0XCLlg5flg5jlg5nlg5tcIixcblx0XHQxMCxcblx0XHRcIuWDqOWDqeWDquWDq+WDr+WDsOWDseWDsuWDtOWDtlwiLFxuXHRcdDQsXG5cdFx0XCLlg7xcIixcblx0XHQ5LFxuXHRcdFwi5YSIXCJcblx0XSxcblx0W1xuXHRcdFwiODM4MFwiLFxuXHRcdFwi5YSJ5YSK5YSMXCIsXG5cdFx0NSxcblx0XHRcIuWEk1wiLFxuXHRcdDEzLFxuXHRcdFwi5YSiXCIsXG5cdFx0MjgsXG5cdFx0XCLlhYLlhYflhYrlhYzlhY7lhY/lhZDlhZLlhZPlhZflhZjlhZnlhZvlhZ1cIixcblx0XHQ0LFxuXHRcdFwi5YWj5YWk5YWm5YWn5YWp5YWq5YWv5YWy5YW65YW+5YW/5YaD5YaE5YaG5YaH5YaK5YaL5YaO5YaP5YaQ5YaR5YaT5YaU5YaY5Yaa5Yad5Yae5Yaf5Yah5Yaj5YamXCIsXG5cdFx0NCxcblx0XHRcIuWGreWGruWGtOWGuOWGueWGuuWGvuWGv+WHgeWHguWHg+WHheWHiOWHiuWHjeWHjuWHkOWHklwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiODQ0MFwiLFxuXHRcdFwi5YeY5YeZ5Yea5Yec5Yee5Yef5Yei5Yej5YelXCIsXG5cdFx0NSxcblx0XHRcIuWHrOWHruWHseWHsuWHtOWHt+WHvuWIhOWIheWIieWIi+WIjOWIj+WIkOWIk+WIlOWIleWInOWInuWIn+WIoeWIouWIo+WIpeWIpuWIp+WIquWIrOWIr+WIseWIsuWItOWIteWIvOWIvuWJhFwiLFxuXHRcdDUsXG5cdFx0XCLliYvliY7liY/liZLliZPliZXliZfliZhcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NDgwXCIsXG5cdFx0XCLliZnliZrliZvliZ3liZ/liaDliaLliaPliaTliabliajliavliazlia3lia7libDlibHlibNcIixcblx0XHQ5LFxuXHRcdFwi5Ym+5YqA5YqDXCIsXG5cdFx0NCxcblx0XHRcIuWKiVwiLFxuXHRcdDYsXG5cdFx0XCLlipHlipLlipRcIixcblx0XHQ2LFxuXHRcdFwi5Yqc5Yqk5Yql5Yqm5Yqn5Yqu5Yqv5Yqw5Yq0XCIsXG5cdFx0OSxcblx0XHRcIuWLgOWLgeWLguWLhOWLheWLhuWLiOWLiuWLjOWLjeWLjuWLj+WLkeWLk+WLlOWLleWLl+WLmVwiLFxuXHRcdDUsXG5cdFx0XCLli6Dli6Hli6Lli6Pli6VcIixcblx0XHQxMCxcblx0XHRcIuWLsVwiLFxuXHRcdDcsXG5cdFx0XCLli7vli7zli73ljIHljILljIPljITljIfljInljIrljIvljIzljI5cIlxuXHRdLFxuXHRbXG5cdFx0XCI4NTQwXCIsXG5cdFx0XCLljJHljJLljJPljJTljJjljJvljJzljJ7ljJ/ljKLljKTljKXljKfljKjljKnljKvljKzljK3ljK9cIixcblx0XHQ5LFxuXHRcdFwi5Yy85Yy95Y2A5Y2C5Y2E5Y2G5Y2L5Y2M5Y2N5Y2Q5Y2U5Y2Y5Y2Z5Y2b5Y2d5Y2l5Y2o5Y2q5Y2s5Y2t5Y2y5Y225Y255Y275Y285Y295Y2+5Y6A5Y6B5Y6D5Y6H5Y6I5Y6K5Y6O5Y6PXCJcblx0XSxcblx0W1xuXHRcdFwiODU4MFwiLFxuXHRcdFwi5Y6QXCIsXG5cdFx0NCxcblx0XHRcIuWOluWOl+WOmeWOm+WOnOWOnuWOoOWOoeWOpOWOp+WOquWOq+WOrOWOreWOr1wiLFxuXHRcdDYsXG5cdFx0XCLljrfljrjljrnljrrljrzljr3ljr7lj4Dlj4NcIixcblx0XHQ0LFxuXHRcdFwi5Y+O5Y+P5Y+Q5Y+S5Y+T5Y+V5Y+a5Y+c5Y+d5Y+e5Y+h5Y+i5Y+n5Y+05Y+65Y++5Y+/5ZCA5ZCC5ZCF5ZCH5ZCL5ZCU5ZCY5ZCZ5ZCa5ZCc5ZCi5ZCk5ZCl5ZCq5ZCw5ZCz5ZC25ZC35ZC65ZC95ZC/5ZGB5ZGC5ZGE5ZGF5ZGH5ZGJ5ZGM5ZGN5ZGO5ZGP5ZGR5ZGa5ZGdXCIsXG5cdFx0NCxcblx0XHRcIuWRo+WRpeWRp+WRqVwiLFxuXHRcdDcsXG5cdFx0XCLlkbTlkbnlkbrlkb7lkb/lkoHlkoPlkoXlkoflkojlkonlkorlko3lkpHlkpPlkpflkpjlkpzlkp7lkp/lkqDlkqFcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NjQwXCIsXG5cdFx0XCLlkqLlkqXlkq7lkrDlkrLlkrXlkrblkrflkrnlkrrlkrzlkr7lk4Plk4Xlk4rlk4vlk5blk5jlk5vlk6BcIixcblx0XHQ0LFxuXHRcdFwi5ZOr5ZOs5ZOv5ZOw5ZOx5ZO0XCIsXG5cdFx0NSxcblx0XHRcIuWTu+WTvuWUgOWUguWUg+WUhOWUheWUiOWUilwiLFxuXHRcdDQsXG5cdFx0XCLllJLllJPllJVcIixcblx0XHQ1LFxuXHRcdFwi5ZSc5ZSd5ZSe5ZSf5ZSh5ZSl5ZSmXCJcblx0XSxcblx0W1xuXHRcdFwiODY4MFwiLFxuXHRcdFwi5ZSo5ZSp5ZSr5ZSt5ZSy5ZS05ZS15ZS25ZS45ZS55ZS65ZS75ZS95ZWA5ZWC5ZWF5ZWH5ZWI5ZWLXCIsXG5cdFx0NCxcblx0XHRcIuWVkeWVkuWVk+WVlOWVl1wiLFxuXHRcdDQsXG5cdFx0XCLllZ3llZ7llZ/llaDllaLllaPllajllanllavlla9cIixcblx0XHQ1LFxuXHRcdFwi5ZW55ZW65ZW95ZW/5ZaF5ZaG5ZaM5ZaN5ZaO5ZaQ5ZaS5ZaT5ZaV5ZaW5ZaX5Zaa5Zab5Zae5ZagXCIsXG5cdFx0Nixcblx0XHRcIuWWqFwiLFxuXHRcdDgsXG5cdFx0XCLllrLllrTllrbllrjllrrllrzllr9cIixcblx0XHQ0LFxuXHRcdFwi5ZeG5ZeH5ZeI5ZeK5ZeL5ZeO5ZeP5ZeQ5ZeV5ZeXXCIsXG5cdFx0NCxcblx0XHRcIuWXnuWXoOWXouWXp+WXqeWXreWXruWXsOWXseWXtOWXtuWXuFwiLFxuXHRcdDQsXG5cdFx0XCLll7/lmILlmIPlmITlmIVcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NzQwXCIsXG5cdFx0XCLlmIblmIflmIrlmIvlmI3lmJBcIixcblx0XHQ3LFxuXHRcdFwi5ZiZ5Zia5Zic5Zid5Zig5Zih5Zii5Zil5Zim5Zio5Zip5Ziq5Zir5Ziu5Ziv5Ziw5Ziz5Zi15Zi35Zi45Zi65Zi85Zi95Zi+5ZmAXCIsXG5cdFx0MTEsXG5cdFx0XCLlmY9cIixcblx0XHQ0LFxuXHRcdFwi5ZmV5ZmW5Zma5Zmb5ZmdXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCI4NzgwXCIsXG5cdFx0XCLlmaPlmaXlmablmaflma3lma7lma/lmbDlmbLlmbPlmbTlmbXlmbflmbjlmbnlmbrlmb1cIixcblx0XHQ3LFxuXHRcdFwi5ZqHXCIsXG5cdFx0Nixcblx0XHRcIuWakOWakeWakuWalFwiLFxuXHRcdDE0LFxuXHRcdFwi5ZqkXCIsXG5cdFx0MTAsXG5cdFx0XCLlmrBcIixcblx0XHQ2LFxuXHRcdFwi5Zq45Zq55Zq65Zq75Zq9XCIsXG5cdFx0MTIsXG5cdFx0XCLlm4tcIixcblx0XHQ4LFxuXHRcdFwi5ZuV5ZuW5ZuY5ZuZ5Zuc5Zuj5ZulXCIsXG5cdFx0NSxcblx0XHRcIuWbrOWbruWbr+WbsuWbs+WbtuWbt+WbuOWbu+WbvOWcgOWcgeWcguWcheWch+Wci1wiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiODg0MFwiLFxuXHRcdFwi5ZySXCIsXG5cdFx0OSxcblx0XHRcIuWcneWcnuWcoOWcoeWcouWcpOWcpeWcpuWcp+Wcq+WcseWcsuWctFwiLFxuXHRcdDQsXG5cdFx0XCLlnLzlnL3lnL/lnYHlnYPlnYTlnYXlnYblnYjlnYnlnYvlnZJcIixcblx0XHQ0LFxuXHRcdFwi5Z2Y5Z2Z5Z2i5Z2j5Z2l5Z2n5Z2s5Z2u5Z2w5Z2x5Z2y5Z205Z215Z245Z255Z265Z295Z2+5Z2/5Z6AXCJcblx0XSxcblx0W1xuXHRcdFwiODg4MFwiLFxuXHRcdFwi5Z6B5Z6H5Z6I5Z6J5Z6K5Z6NXCIsXG5cdFx0NCxcblx0XHRcIuWelFwiLFxuXHRcdDYsXG5cdFx0XCLlnpzlnp3lnp7lnp/lnqXlnqjlnqrlnqzlnq/lnrDlnrHlnrPlnrXlnrblnrflnrlcIixcblx0XHQ4LFxuXHRcdFwi5Z+EXCIsXG5cdFx0Nixcblx0XHRcIuWfjOWfjeWfkOWfkeWfk+WfluWfl+Wfm+WfnOWfnuWfoeWfouWfo+WfpVwiLFxuXHRcdDcsXG5cdFx0XCLln67ln7Dln7Hln7Lln7Pln7Xln7bln7fln7vln7zln77ln7/loIHloIPloITloIXloIjloInloIrloIzloI7loI/loJDloJLloJPloJTloJbloJfloJjloJrloJvloJzloJ3loJ/loKLloKPloKVcIixcblx0XHQ0LFxuXHRcdFwi5aCrXCIsXG5cdFx0NCxcblx0XHRcIuWgseWgsuWgs+WgtOWgtlwiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiODk0MFwiLFxuXHRcdFwi5aC+XCIsXG5cdFx0NSxcblx0XHRcIuWhhVwiLFxuXHRcdDYsXG5cdFx0XCLloY7loY/loZDloZLloZPloZXloZbloZfloZlcIixcblx0XHQ0LFxuXHRcdFwi5aGfXCIsXG5cdFx0NSxcblx0XHRcIuWhplwiLFxuXHRcdDQsXG5cdFx0XCLloa1cIixcblx0XHQxNixcblx0XHRcIuWhv+WiguWihOWihuWih+WiiOWiiuWii+WijFwiXG5cdF0sXG5cdFtcblx0XHRcIjg5ODBcIixcblx0XHRcIuWijVwiLFxuXHRcdDQsXG5cdFx0XCLlopRcIixcblx0XHQ0LFxuXHRcdFwi5aKb5aKc5aKd5aKgXCIsXG5cdFx0Nyxcblx0XHRcIuWiqlwiLFxuXHRcdDE3LFxuXHRcdFwi5aK95aK+5aK/5aOA5aOC5aOD5aOE5aOGXCIsXG5cdFx0MTAsXG5cdFx0XCLlo5Llo5Plo5Tlo5ZcIixcblx0XHQxMyxcblx0XHRcIuWjpVwiLFxuXHRcdDUsXG5cdFx0XCLlo63lo6/lo7Hlo7Llo7Tlo7Xlo7flo7jlo7pcIixcblx0XHQ3LFxuXHRcdFwi5aSD5aSF5aSG5aSIXCIsXG5cdFx0NCxcblx0XHRcIuWkjuWkkOWkkeWkkuWkk+Wkl+WkmOWkm+WkneWknuWkoOWkoeWkouWko+WkpuWkqOWkrOWksOWksuWks+WkteWktuWku1wiXG5cdF0sXG5cdFtcblx0XHRcIjhhNDBcIixcblx0XHRcIuWkveWkvuWkv+WlgOWlg+WlheWlhuWliuWljOWljeWlkOWlkuWlk+WlmeWlm1wiLFxuXHRcdDQsXG5cdFx0XCLlpaHlpaPlpaTlpaZcIixcblx0XHQxMixcblx0XHRcIuWlteWlt+WluuWlu+WlvOWlvuWlv+WmgOWmheWmieWmi+WmjOWmjuWmj+WmkOWmkeWmlOWmleWmmOWmmuWmm+WmnOWmneWmn+WmoOWmoeWmouWmplwiXG5cdF0sXG5cdFtcblx0XHRcIjhhODBcIixcblx0XHRcIuWmp+WmrOWmreWmsOWmseWms1wiLFxuXHRcdDUsXG5cdFx0XCLlprrlprzlpr3lpr9cIixcblx0XHQ2LFxuXHRcdFwi5aeH5aeI5aeJ5aeM5aeN5aeO5aeP5aeV5aeW5aeZ5aeb5aeeXCIsXG5cdFx0NCxcblx0XHRcIuWnpOWnpuWnp+WnqeWnquWnq+WnrVwiLFxuXHRcdDExLFxuXHRcdFwi5ae65ae85ae95ae+5aiA5aiC5aiK5aiL5aiN5aiO5aiP5aiQ5aiS5aiU5aiV5aiW5aiX5aiZ5aia5aib5aid5aie5aih5aii5aik5aim5ain5aio5aiqXCIsXG5cdFx0Nixcblx0XHRcIuWos+WoteWot1wiLFxuXHRcdDQsXG5cdFx0XCLlqL3lqL7lqL/lqYFcIixcblx0XHQ0LFxuXHRcdFwi5amH5amI5amLXCIsXG5cdFx0OSxcblx0XHRcIuWpluWpl+WpmOWpmeWpm1wiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiOGI0MFwiLFxuXHRcdFwi5amh5amj5amk5aml5amm5amo5amp5amrXCIsXG5cdFx0OCxcblx0XHRcIuWpuOWpueWpu+WpvOWpveWpvuWqgFwiLFxuXHRcdDE3LFxuXHRcdFwi5aqTXCIsXG5cdFx0Nixcblx0XHRcIuWqnFwiLFxuXHRcdDEzLFxuXHRcdFwi5aqr5aqsXCJcblx0XSxcblx0W1xuXHRcdFwiOGI4MFwiLFxuXHRcdFwi5aqtXCIsXG5cdFx0NCxcblx0XHRcIuWqtOWqtuWqt+WquVwiLFxuXHRcdDQsXG5cdFx0XCLlqr/lq4Dlq4NcIixcblx0XHQ1LFxuXHRcdFwi5auK5auL5auNXCIsXG5cdFx0NCxcblx0XHRcIuWrk+WrleWrl+WrmeWrmuWrm+WrneWrnuWrn+WrouWrpOWrpeWrp+WrqOWrquWrrFwiLFxuXHRcdDQsXG5cdFx0XCLlq7JcIixcblx0XHQyMixcblx0XHRcIuWsilwiLFxuXHRcdDExLFxuXHRcdFwi5ayYXCIsXG5cdFx0MjUsXG5cdFx0XCLlrLPlrLXlrLblrLhcIixcblx0XHQ3LFxuXHRcdFwi5a2BXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCI4YzQwXCIsXG5cdFx0XCLlrYhcIixcblx0XHQ3LFxuXHRcdFwi5a2S5a2W5a2e5a2g5a2h5a2n5a2o5a2r5a2t5a2u5a2v5a2y5a205a225a235a245a255a275a285a2+5a2/5a6C5a6G5a6K5a6N5a6O5a6Q5a6R5a6S5a6U5a6W5a6f5a6n5a6o5a6p5a6s5a6t5a6u5a6v5a6x5a6y5a635a665a675a685a+A5a+B5a+D5a+I5a+J5a+K5a+L5a+N5a+O5a+PXCJcblx0XSxcblx0W1xuXHRcdFwiOGM4MFwiLFxuXHRcdFwi5a+R5a+UXCIsXG5cdFx0OCxcblx0XHRcIuWvoOWvouWvo+WvpuWvp+WvqVwiLFxuXHRcdDQsXG5cdFx0XCLlr6/lr7FcIixcblx0XHQ2LFxuXHRcdFwi5a+95a++5bCA5bCC5bCD5bCF5bCH5bCI5bCL5bCM5bCN5bCO5bCQ5bCS5bCT5bCX5bCZ5bCb5bCe5bCf5bCg5bCh5bCj5bCm5bCo5bCp5bCq5bCr5bCt5bCu5bCv5bCw5bCy5bCz5bC15bC25bC35bGD5bGE5bGG5bGH5bGM5bGN5bGS5bGT5bGU5bGW5bGX5bGY5bGa5bGb5bGc5bGd5bGf5bGi5bGk5bGnXCIsXG5cdFx0Nixcblx0XHRcIuWxsOWxslwiLFxuXHRcdDYsXG5cdFx0XCLlsbvlsbzlsb3lsb7lsoDlsoNcIixcblx0XHQ0LFxuXHRcdFwi5bKJ5bKK5bKL5bKO5bKP5bKS5bKT5bKV5bKdXCIsXG5cdFx0NCxcblx0XHRcIuWypFwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiOGQ0MFwiLFxuXHRcdFwi5bKq5bKu5bKv5bKw5bKy5bK05bK25bK55bK65bK75bK85bK+5bOA5bOC5bOD5bOFXCIsXG5cdFx0NSxcblx0XHRcIuWzjFwiLFxuXHRcdDUsXG5cdFx0XCLls5NcIixcblx0XHQ1LFxuXHRcdFwi5bOaXCIsXG5cdFx0Nixcblx0XHRcIuWzouWzo+Wzp+WzqeWzq+WzrOWzruWzr+WzsVwiLFxuXHRcdDksXG5cdFx0XCLls7xcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcIjhkODBcIixcblx0XHRcIuW0geW0hOW0heW0iFwiLFxuXHRcdDUsXG5cdFx0XCLltI9cIixcblx0XHQ0LFxuXHRcdFwi5bSV5bSX5bSY5bSZ5bSa5bSc5bSd5bSfXCIsXG5cdFx0NCxcblx0XHRcIuW0peW0qOW0quW0q+W0rOW0r1wiLFxuXHRcdDQsXG5cdFx0XCLltLVcIixcblx0XHQ3LFxuXHRcdFwi5bS/XCIsXG5cdFx0Nyxcblx0XHRcIuW1iOW1ieW1jVwiLFxuXHRcdDEwLFxuXHRcdFwi5bWZ5bWa5bWc5bWeXCIsXG5cdFx0MTAsXG5cdFx0XCLltarlta3lta7ltbDltbHltbLltbPltbVcIixcblx0XHQxMixcblx0XHRcIuW2g1wiLFxuXHRcdDIxLFxuXHRcdFwi5baa5bab5bac5bae5baf5bagXCJcblx0XSxcblx0W1xuXHRcdFwiOGU0MFwiLFxuXHRcdFwi5bahXCIsXG5cdFx0MjEsXG5cdFx0XCLltrhcIixcblx0XHQxMixcblx0XHRcIuW3hlwiLFxuXHRcdDYsXG5cdFx0XCLlt45cIixcblx0XHQxMixcblx0XHRcIuW3nOW3n+W3oOW3o+W3pOW3quW3rOW3rVwiXG5cdF0sXG5cdFtcblx0XHRcIjhlODBcIixcblx0XHRcIuW3sOW3teW3tuW3uFwiLFxuXHRcdDQsXG5cdFx0XCLlt7/luIDluITluIfluInluIrluIvluI3luI7luJLluJPluJfluJ5cIixcblx0XHQ3LFxuXHRcdFwi5bioXCIsXG5cdFx0NCxcblx0XHRcIuW4r+W4sOW4slwiLFxuXHRcdDQsXG5cdFx0XCLluLnluLrluL7luL/luYDluYHluYPluYZcIixcblx0XHQ1LFxuXHRcdFwi5bmNXCIsXG5cdFx0Nixcblx0XHRcIuW5llwiLFxuXHRcdDQsXG5cdFx0XCLluZzluZ3luZ/luaDluaNcIixcblx0XHQxNCxcblx0XHRcIuW5teW5t+W5ueW5vuW6geW6guW6g+W6heW6iOW6ieW6jOW6jeW6juW6kuW6mOW6m+W6neW6oeW6ouW6o+W6pOW6qFwiLFxuXHRcdDQsXG5cdFx0XCLluq5cIixcblx0XHQ0LFxuXHRcdFwi5bq05bq65bq75bq85bq95bq/XCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCI4ZjQwXCIsXG5cdFx0XCLlu4blu4flu4jlu4tcIixcblx0XHQ1LFxuXHRcdFwi5buU5buV5buX5buY5buZ5bua5bucXCIsXG5cdFx0MTEsXG5cdFx0XCLlu6nlu6tcIixcblx0XHQ4LFxuXHRcdFwi5bu15bu45bu55bu75bu85bu95byF5byG5byH5byJ5byM5byN5byO5byQ5byS5byU5byW5byZ5bya5byc5byd5bye5byh5byi5byj5bykXCJcblx0XSxcblx0W1xuXHRcdFwiOGY4MFwiLFxuXHRcdFwi5byo5byr5bys5byu5byw5byyXCIsXG5cdFx0Nixcblx0XHRcIuW8u+W8veW8vuW8v+W9gVwiLFxuXHRcdDE0LFxuXHRcdFwi5b2R5b2U5b2Z5b2a5b2b5b2c5b2e5b2f5b2g5b2j5b2l5b2n5b2o5b2r5b2u5b2v5b2y5b205b215b225b245b265b295b2+5b2/5b6D5b6G5b6N5b6O5b6P5b6R5b6T5b6U5b6W5b6a5b6b5b6d5b6e5b6f5b6g5b6iXCIsXG5cdFx0NSxcblx0XHRcIuW+qeW+q+W+rOW+r1wiLFxuXHRcdDUsXG5cdFx0XCLlvrblvrjlvrnlvrrlvrvlvr5cIixcblx0XHQ0LFxuXHRcdFwi5b+H5b+I5b+K5b+L5b+O5b+T5b+U5b+V5b+a5b+b5b+c5b+e5b+f5b+i5b+j5b+l5b+m5b+o5b+p5b+s5b+v5b+w5b+y5b+z5b+05b+25b+35b+55b+65b+85oCHXCJcblx0XSxcblx0W1xuXHRcdFwiOTA0MFwiLFxuXHRcdFwi5oCI5oCJ5oCL5oCM5oCQ5oCR5oCT5oCX5oCY5oCa5oCe5oCf5oCi5oCj5oCk5oCs5oCt5oCu5oCwXCIsXG5cdFx0NCxcblx0XHRcIuaAtlwiLFxuXHRcdDQsXG5cdFx0XCLmgL3mgL7mgYDmgYRcIixcblx0XHQ2LFxuXHRcdFwi5oGM5oGO5oGP5oGR5oGT5oGU5oGW5oGX5oGY5oGb5oGc5oGe5oGf5oGg5oGh5oGl5oGm5oGu5oGx5oGy5oG05oG15oG35oG+5oKAXCJcblx0XSxcblx0W1xuXHRcdFwiOTA4MFwiLFxuXHRcdFwi5oKB5oKC5oKF5oKG5oKH5oKI5oKK5oKL5oKO5oKP5oKQ5oKR5oKT5oKV5oKX5oKY5oKZ5oKc5oKe5oKh5oKi5oKk5oKl5oKn5oKp5oKq5oKu5oKw5oKz5oK15oK25oK35oK55oK65oK9XCIsXG5cdFx0Nyxcblx0XHRcIuaDh+aDiOaDieaDjFwiLFxuXHRcdDQsXG5cdFx0XCLmg5Lmg5Pmg5Tmg5bmg5fmg5nmg5vmg57mg6FcIixcblx0XHQ0LFxuXHRcdFwi5oOq5oOx5oOy5oO15oO35oO45oO7XCIsXG5cdFx0NCxcblx0XHRcIuaEguaEg+aEhOaEheaEh+aEiuaEi+aEjOaEkFwiLFxuXHRcdDQsXG5cdFx0XCLmhJbmhJfmhJjmhJnmhJvmhJzmhJ3mhJ7mhKHmhKLmhKXmhKjmhKnmhKrmhKxcIixcblx0XHQxOCxcblx0XHRcIuaFgFwiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiOTE0MFwiLFxuXHRcdFwi5oWH5oWJ5oWL5oWN5oWP5oWQ5oWS5oWT5oWU5oWWXCIsXG5cdFx0Nixcblx0XHRcIuaFnuaFn+aFoOaFoeaFo+aFpOaFpeaFpuaFqVwiLFxuXHRcdDYsXG5cdFx0XCLmhbHmhbLmhbPmhbTmhbbmhbhcIixcblx0XHQxOCxcblx0XHRcIuaGjOaGjeaGj1wiLFxuXHRcdDQsXG5cdFx0XCLmhpVcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MTgwXCIsXG5cdFx0XCLmhpZcIixcblx0XHQ2LFxuXHRcdFwi5oaeXCIsXG5cdFx0OCxcblx0XHRcIuaGquaGq+aGrVwiLFxuXHRcdDksXG5cdFx0XCLmhrhcIixcblx0XHQ1LFxuXHRcdFwi5oa/5oeA5oeB5oeDXCIsXG5cdFx0NCxcblx0XHRcIuaHieaHjFwiLFxuXHRcdDQsXG5cdFx0XCLmh5Pmh5VcIixcblx0XHQxNixcblx0XHRcIuaHp1wiLFxuXHRcdDEzLFxuXHRcdFwi5oe2XCIsXG5cdFx0OCxcblx0XHRcIuaIgFwiLFxuXHRcdDUsXG5cdFx0XCLmiIfmiInmiJPmiJTmiJnmiJzmiJ3miJ7miKDmiKPmiKbmiKfmiKjmiKnmiKvmiK3miK/miLDmiLHmiLLmiLXmiLbmiLhcIixcblx0XHQ0LFxuXHRcdFwi5omC5omE5omF5omG5omKXCJcblx0XSxcblx0W1xuXHRcdFwiOTI0MFwiLFxuXHRcdFwi5omP5omQ5omV5omW5omX5omZ5oma5omcXCIsXG5cdFx0Nixcblx0XHRcIuaJpOaJpeaJqOaJseaJsuaJtOaJteaJt+aJuOaJuuaJu+aJveaKgeaKguaKg+aKheaKhuaKh+aKiOaKi1wiLFxuXHRcdDUsXG5cdFx0XCLmipTmipnmipzmip3mip7miqPmiqbmiqfmiqnmiqrmiq3miq7miq/mirDmirLmirPmirTmirbmirfmirjmirrmir7mi4Dmi4FcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MjgwXCIsXG5cdFx0XCLmi4Pmi4vmi4/mi5Hmi5Xmi53mi57mi6Dmi6Hmi6Tmi6rmi6vmi7Dmi7Lmi7Xmi7jmi7nmi7rmi7vmjIDmjIPmjITmjIXmjIbmjIrmjIvmjIzmjI3mjI/mjJDmjJLmjJPmjJTmjJXmjJfmjJjmjJnmjJzmjKbmjKfmjKnmjKzmjK3mjK7mjLDmjLHmjLNcIixcblx0XHQ1LFxuXHRcdFwi5oy75oy85oy+5oy/5o2A5o2B5o2E5o2H5o2I5o2K5o2R5o2S5o2T5o2U5o2WXCIsXG5cdFx0Nyxcblx0XHRcIuaNoOaNpOaNpeaNpuaNqOaNquaNq+aNrOaNr+aNsOaNsuaNs+aNtOaNteaNuOaNueaNvOaNveaNvuaNv+aOgeaOg+aOhOaOheaOhuaOi+aOjeaOkeaOk+aOlOaOleaOl+aOmVwiLFxuXHRcdDYsXG5cdFx0XCLmjqHmjqTmjqbmjqvmjq/mjrHmjrLmjrXmjrbmjrnmjrvmjr3mjr/mj4BcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MzQwXCIsXG5cdFx0XCLmj4Hmj4Lmj4Pmj4Xmj4fmj4jmj4rmj4vmj4zmj5Hmj5Pmj5Tmj5Xmj5dcIixcblx0XHQ2LFxuXHRcdFwi5o+f5o+i5o+kXCIsXG5cdFx0NCxcblx0XHRcIuaPq+aPrOaPruaPr+aPsOaPseaPs+aPteaPt+aPueaPuuaPu+aPvOaPvuaQg+aQhOaQhlwiLFxuXHRcdDQsXG5cdFx0XCLmkI3mkI7mkJHmkJLmkJVcIixcblx0XHQ1LFxuXHRcdFwi5pCd5pCf5pCi5pCj5pCkXCJcblx0XSxcblx0W1xuXHRcdFwiOTM4MFwiLFxuXHRcdFwi5pCl5pCn5pCo5pCp5pCr5pCuXCIsXG5cdFx0NSxcblx0XHRcIuaQtVwiLFxuXHRcdDQsXG5cdFx0XCLmkLvmkLzmkL7mkYDmkYLmkYPmkYnmkYtcIixcblx0XHQ2LFxuXHRcdFwi5pGT5pGV5pGW5pGX5pGZXCIsXG5cdFx0NCxcblx0XHRcIuaRn1wiLFxuXHRcdDcsXG5cdFx0XCLmkajmkarmkavmkazmka5cIixcblx0XHQ5LFxuXHRcdFwi5pG7XCIsXG5cdFx0Nixcblx0XHRcIuaSg+aShuaSiFwiLFxuXHRcdDgsXG5cdFx0XCLmkpPmkpTmkpfmkpjmkprmkpvmkpzmkp3mkp9cIixcblx0XHQ0LFxuXHRcdFwi5pKl5pKm5pKn5pKo5pKq5pKr5pKv5pKx5pKy5pKz5pK05pK25pK55pK75pK95pK+5pK/5pOB5pOD5pOE5pOGXCIsXG5cdFx0Nixcblx0XHRcIuaTj+aTkeaTk+aTlOaTleaTluaTmeaTmlwiXG5cdF0sXG5cdFtcblx0XHRcIjk0NDBcIixcblx0XHRcIuaTm+aTnOaTneaTn+aToOaToeaTo+aTpeaTp1wiLFxuXHRcdDI0LFxuXHRcdFwi5pSBXCIsXG5cdFx0Nyxcblx0XHRcIuaUilwiLFxuXHRcdDcsXG5cdFx0XCLmlJNcIixcblx0XHQ0LFxuXHRcdFwi5pSZXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI5NDgwXCIsXG5cdFx0XCLmlKLmlKPmlKTmlKZcIixcblx0XHQ0LFxuXHRcdFwi5pSs5pSt5pSw5pSx5pSy5pSz5pS35pS65pS85pS95pWAXCIsXG5cdFx0NCxcblx0XHRcIuaVhuaVh+aViuaVi+aVjeaVjuaVkOaVkuaVk+aVlOaVl+aVmOaVmuaVnOaVn+aVoOaVoeaVpOaVpeaVp+aVqOaVqeaVquaVreaVruaVr+aVseaVs+aVteaVtuaVuFwiLFxuXHRcdDE0LFxuXHRcdFwi5paI5paJ5paK5paN5paO5paP5paS5paU5paV5paW5paY5paa5pad5pae5pag5pai5paj5pam5pao5paq5pas5pau5paxXCIsXG5cdFx0Nyxcblx0XHRcIuaWuuaWu+aWvuaWv+aXgOaXguaXh+aXiOaXieaXiuaXjeaXkOaXkeaXk+aXlOaXleaXmFwiLFxuXHRcdDcsXG5cdFx0XCLml6Hml6Pml6Tml6rml6tcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NTQwXCIsXG5cdFx0XCLml7Lml7Pml7Tml7Xml7jml7nml7tcIixcblx0XHQ0LFxuXHRcdFwi5piB5piE5piF5piH5piI5piJ5piL5piN5piQ5piR5piS5piW5piX5piY5pia5pib5pic5pie5pih5pii5pij5pik5pim5pip5piq5pir5pis5piu5piw5piy5piz5pi3XCIsXG5cdFx0NCxcblx0XHRcIuaYveaYv+aZgOaZguaZhFwiLFxuXHRcdDYsXG5cdFx0XCLmmY3mmY7mmZDmmZHmmZhcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NTgwXCIsXG5cdFx0XCLmmZnmmZvmmZzmmZ3mmZ7mmaDmmaLmmaPmmaXmmafmmalcIixcblx0XHQ0LFxuXHRcdFwi5pmx5pmy5pmz5pm15pm45pm55pm75pm85pm95pm/5pqA5pqB5pqD5pqF5pqG5pqI5pqJ5pqK5pqL5pqN5pqO5pqP5pqQ5pqS5pqT5pqU5pqV5pqYXCIsXG5cdFx0NCxcblx0XHRcIuaanlwiLFxuXHRcdDgsXG5cdFx0XCLmmqlcIixcblx0XHQ0LFxuXHRcdFwi5pqvXCIsXG5cdFx0NCxcblx0XHRcIuaateaatuaat+aauOaauuaau+aavOaaveaav1wiLFxuXHRcdDI1LFxuXHRcdFwi5pua5pueXCIsXG5cdFx0Nyxcblx0XHRcIuabp+abqOabqlwiLFxuXHRcdDUsXG5cdFx0XCLmm7Hmm7Xmm7bmm7jmm7rmm7vmm73mnIHmnILmnINcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NjQwXCIsXG5cdFx0XCLmnITmnIXmnIbmnIfmnIzmnI7mnI/mnJHmnJLmnJPmnJbmnJjmnJnmnJrmnJzmnJ7mnKBcIixcblx0XHQ1LFxuXHRcdFwi5pyn5pyp5pyu5pyw5pyy5pyz5py25py35py45py55py75py85py+5py/5p2B5p2E5p2F5p2H5p2K5p2L5p2N5p2S5p2U5p2V5p2XXCIsXG5cdFx0NCxcblx0XHRcIuadneadouado+adpOadpuadp+adq+adrOadruadseadtOadtlwiXG5cdF0sXG5cdFtcblx0XHRcIjk2ODBcIixcblx0XHRcIuaduOadueaduuadu+adveaegOaeguaeg+aeheaehuaeiOaeiuaejOaejeaejuaej+aekeaekuaek+aelOaeluaemeaem+aen+aeoOaeoeaepOaepuaeqeaerOaeruaeseaesuaetOaeuVwiLFxuXHRcdDcsXG5cdFx0XCLmn4Lmn4VcIixcblx0XHQ5LFxuXHRcdFwi5p+V5p+W5p+X5p+b5p+f5p+h5p+j5p+k5p+m5p+n5p+o5p+q5p+r5p+t5p+u5p+y5p+1XCIsXG5cdFx0Nyxcblx0XHRcIuafvuaggeagguagg+aghOaghuagjeagkOagkuaglOagleagmFwiLFxuXHRcdDQsXG5cdFx0XCLmoJ7moJ/moKDmoKJcIixcblx0XHQ2LFxuXHRcdFwi5qCrXCIsXG5cdFx0Nixcblx0XHRcIuagtOagteagtuaguuagu+agv+ahh+ahi+ahjeahj+ahkuahllwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiOTc0MFwiLFxuXHRcdFwi5qGc5qGd5qGe5qGf5qGq5qGsXCIsXG5cdFx0Nyxcblx0XHRcIuahteahuFwiLFxuXHRcdDgsXG5cdFx0XCLmooLmooTmoodcIixcblx0XHQ3LFxuXHRcdFwi5qKQ5qKR5qKS5qKU5qKV5qKW5qKYXCIsXG5cdFx0OSxcblx0XHRcIuaio+aipOaipeaiqeaiquaiq+airOairuaiseaisuaitOaituait+aiuFwiXG5cdF0sXG5cdFtcblx0XHRcIjk3ODBcIixcblx0XHRcIuaiuVwiLFxuXHRcdDYsXG5cdFx0XCLmo4Hmo4NcIixcblx0XHQ1LFxuXHRcdFwi5qOK5qOM5qOO5qOP5qOQ5qOR5qOT5qOU5qOW5qOX5qOZ5qObXCIsXG5cdFx0NCxcblx0XHRcIuajoeajouajpFwiLFxuXHRcdDksXG5cdFx0XCLmo6/mo7Lmo7Pmo7Tmo7bmo7fmo7jmo7vmo73mo77mo7/mpIDmpILmpIPmpITmpIZcIixcblx0XHQ0LFxuXHRcdFwi5qSM5qSP5qSR5qSTXCIsXG5cdFx0MTEsXG5cdFx0XCLmpKHmpKLmpKPmpKVcIixcblx0XHQ3LFxuXHRcdFwi5qSu5qSv5qSx5qSy5qSz5qS15qS25qS35qS45qS65qS75qS85qS+5qWA5qWB5qWDXCIsXG5cdFx0MTYsXG5cdFx0XCLmpZXmpZbmpZjmpZnmpZvmpZzmpZ9cIlxuXHRdLFxuXHRbXG5cdFx0XCI5ODQwXCIsXG5cdFx0XCLmpaHmpaLmpaTmpaXmpafmpajmpanmparmpazmpa3mpa/mpbDmpbJcIixcblx0XHQ0LFxuXHRcdFwi5qW65qW75qW95qW+5qW/5qaB5qaD5qaF5qaK5qaL5qaM5qaOXCIsXG5cdFx0NSxcblx0XHRcIuamluaml+ammeammuamnVwiLFxuXHRcdDksXG5cdFx0XCLmpqnmpqrmpqzmpq7mpq/mprDmprLmprPmprXmprbmprjmprnmprrmprzmpr1cIlxuXHRdLFxuXHRbXG5cdFx0XCI5ODgwXCIsXG5cdFx0XCLmpr7mpr/mp4Dmp4JcIixcblx0XHQ3LFxuXHRcdFwi5qeL5qeN5qeP5qeR5qeS5qeT5qeVXCIsXG5cdFx0NSxcblx0XHRcIuannOanneannuanoVwiLFxuXHRcdDExLFxuXHRcdFwi5qeu5qev5qew5qex5qezXCIsXG5cdFx0OSxcblx0XHRcIuanvuaogFwiLFxuXHRcdDksXG5cdFx0XCLmqItcIixcblx0XHQxMSxcblx0XHRcIuaomVwiLFxuXHRcdDUsXG5cdFx0XCLmqKDmqKJcIixcblx0XHQ1LFxuXHRcdFwi5qip5qir5qis5qit5qiu5qiw5qiy5qiz5qi05qi2XCIsXG5cdFx0Nixcblx0XHRcIuaov1wiLFxuXHRcdDQsXG5cdFx0XCLmqYXmqYbmqYhcIixcblx0XHQ3LFxuXHRcdFwi5qmRXCIsXG5cdFx0Nixcblx0XHRcIuapmlwiXG5cdF0sXG5cdFtcblx0XHRcIjk5NDBcIixcblx0XHRcIuapnFwiLFxuXHRcdDQsXG5cdFx0XCLmqaLmqaPmqaTmqaZcIixcblx0XHQxMCxcblx0XHRcIuapslwiLFxuXHRcdDYsXG5cdFx0XCLmqbrmqbvmqb3mqb7mqb/mqoHmqoLmqoPmqoVcIixcblx0XHQ4LFxuXHRcdFwi5qqP5qqSXCIsXG5cdFx0NCxcblx0XHRcIuaqmFwiLFxuXHRcdDcsXG5cdFx0XCLmqqFcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjk5ODBcIixcblx0XHRcIuaqp+aqqOaqquaqrVwiLFxuXHRcdDExNCxcblx0XHRcIuaspeaspuasqFwiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiOWE0MFwiLFxuXHRcdFwi5qyv5qyw5qyx5qyz5qy05qy15qy25qy45qy75qy85qy95qy/5q2A5q2B5q2C5q2E5q2F5q2I5q2K5q2L5q2NXCIsXG5cdFx0MTEsXG5cdFx0XCLmrZpcIixcblx0XHQ3LFxuXHRcdFwi5q2o5q2p5q2rXCIsXG5cdFx0MTMsXG5cdFx0XCLmrbrmrb3mrb7mrb/mroDmroXmrohcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YTgwXCIsXG5cdFx0XCLmrozmro7mro/mrpDmrpHmrpTmrpXmrpfmrpjmrpnmrpxcIixcblx0XHQ0LFxuXHRcdFwi5q6iXCIsXG5cdFx0Nyxcblx0XHRcIuauq1wiLFxuXHRcdDcsXG5cdFx0XCLmrrbmrrhcIixcblx0XHQ2LFxuXHRcdFwi5q+A5q+D5q+E5q+GXCIsXG5cdFx0NCxcblx0XHRcIuavjOavjuavkOavkeavmOavmuavnFwiLFxuXHRcdDQsXG5cdFx0XCLmr6JcIixcblx0XHQ3LFxuXHRcdFwi5q+s5q+t5q+u5q+w5q+x5q+y5q+05q+25q+35q+45q+65q+75q+85q++XCIsXG5cdFx0Nixcblx0XHRcIuawiFwiLFxuXHRcdDQsXG5cdFx0XCLmsI7msJLmsJfmsJzmsJ3msJ7msKDmsKPmsKXmsKvmsKzmsK3msLHmsLPmsLbmsLfmsLnmsLrmsLvmsLzmsL7msL/msYPmsYTmsYXmsYjmsYtcIixcblx0XHQ0LFxuXHRcdFwi5rGR5rGS5rGT5rGW5rGYXCJcblx0XSxcblx0W1xuXHRcdFwiOWI0MFwiLFxuXHRcdFwi5rGZ5rGa5rGi5rGj5rGl5rGm5rGn5rGrXCIsXG5cdFx0NCxcblx0XHRcIuaxseaxs+axteaxt+axuOaxuuaxu+axvOaxv+aygOayhOayh+ayiuayi+ayjeayjuaykeaykuayleayluayl+aymOaymuaynOayneaynuayoOayouayqOayrOayr+aysOaytOayteaytuayt+ayuuazgOazgeazguazg+azhuazh+aziOazi+azjeazjuazj+azkeazkuazmFwiXG5cdF0sXG5cdFtcblx0XHRcIjliODBcIixcblx0XHRcIuazmeazmuaznOazneazn+azpOazpuazp+azqeazrOazreazsuaztOazueazv+a0gOa0gua0g+a0hea0hua0iOa0iea0iua0jea0j+a0kOa0kea0k+a0lOa0lea0lua0mOa0nOa0nea0n1wiLFxuXHRcdDUsXG5cdFx0XCLmtKbmtKjmtKnmtKzmtK3mtK/mtLDmtLTmtLbmtLfmtLjmtLrmtL/mtYDmtYLmtYTmtYnmtYzmtZDmtZXmtZbmtZfmtZjmtZvmtZ3mtZ/mtaHmtaLmtaTmtaXmtafmtajmtavmtazmta3mtbDmtbHmtbLmtbPmtbXmtbbmtbnmtbrmtbvmtb1cIixcblx0XHQ0LFxuXHRcdFwi5raD5raE5raG5raH5raK5raL5raN5raP5raQ5raS5raWXCIsXG5cdFx0NCxcblx0XHRcIua2nOa2oua2pea2rOa2rea2sOa2sea2s+a2tOa2tua2t+a2uVwiLFxuXHRcdDUsXG5cdFx0XCLmt4Hmt4Lmt4Pmt4jmt4nmt4pcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YzQwXCIsXG5cdFx0XCLmt43mt47mt4/mt5Dmt5Lmt5Pmt5Tmt5Xmt5fmt5rmt5vmt5zmt5/mt6Lmt6Pmt6Xmt6fmt6jmt6nmt6rmt63mt6/mt7Dmt7Lmt7Tmt7Xmt7bmt7jmt7rmt71cIixcblx0XHQ3LFxuXHRcdFwi5riG5riH5riI5riJ5riL5riP5riS5riT5riV5riY5riZ5rib5ric5rie5rif5rii5rim5rin5rio5riq5ris5riu5riw5rix5riz5ri1XCJcblx0XSxcblx0W1xuXHRcdFwiOWM4MFwiLFxuXHRcdFwi5ri25ri35ri55ri7XCIsXG5cdFx0Nyxcblx0XHRcIua5hVwiLFxuXHRcdDcsXG5cdFx0XCLmuY/muZDmuZHmuZLmuZXmuZfmuZnmuZrmuZzmuZ3muZ7muaBcIixcblx0XHQxMCxcblx0XHRcIua5rOa5rea5r1wiLFxuXHRcdDE0LFxuXHRcdFwi5rqA5rqB5rqC5rqE5rqH5rqI5rqKXCIsXG5cdFx0NCxcblx0XHRcIua6kVwiLFxuXHRcdDYsXG5cdFx0XCLmupnmuprmupvmup3mup7muqDmuqHmuqPmuqTmuqbmuqjmuqnmuqvmuqzmuq3muq7murDmurPmurXmurjmurnmurzmur7mur/mu4Dmu4Pmu4Tmu4Xmu4bmu4jmu4nmu4rmu4zmu43mu47mu5Dmu5Lmu5bmu5jmu5nmu5vmu5zmu53mu6Pmu6fmu6pcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjlkNDBcIixcblx0XHRcIua7sOa7sea7sua7s+a7tea7tua7t+a7uOa7ulwiLFxuXHRcdDcsXG5cdFx0XCLmvIPmvITmvIXmvIfmvIjmvIpcIixcblx0XHQ0LFxuXHRcdFwi5ryQ5ryR5ryS5ryWXCIsXG5cdFx0OSxcblx0XHRcIua8oea8oua8o+a8pea8pua8p+a8qOa8rOa8rua8sOa8sua8tOa8tea8t1wiLFxuXHRcdDYsXG5cdFx0XCLmvL/mvYDmvYHmvYJcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZDgwXCIsXG5cdFx0XCLmvYPmvYTmvYXmvYjmvYnmvYrmvYzmvY5cIixcblx0XHQ5LFxuXHRcdFwi5r2Z5r2a5r2b5r2d5r2f5r2g5r2h5r2j5r2k5r2l5r2nXCIsXG5cdFx0NSxcblx0XHRcIua9r+a9sOa9sea9s+a9tea9tua9t+a9uea9u+a9vVwiLFxuXHRcdDYsXG5cdFx0XCLmvoXmvobmvofmvormvovmvo9cIixcblx0XHQxMixcblx0XHRcIua+nea+nua+n+a+oOa+olwiLFxuXHRcdDQsXG5cdFx0XCLmvqhcIixcblx0XHQxMCxcblx0XHRcIua+tOa+tea+t+a+uOa+ulwiLFxuXHRcdDUsXG5cdFx0XCLmv4Hmv4NcIixcblx0XHQ1LFxuXHRcdFwi5r+KXCIsXG5cdFx0Nixcblx0XHRcIua/k1wiLFxuXHRcdDEwLFxuXHRcdFwi5r+f5r+i5r+j5r+k5r+lXCJcblx0XSxcblx0W1xuXHRcdFwiOWU0MFwiLFxuXHRcdFwi5r+mXCIsXG5cdFx0Nyxcblx0XHRcIua/sFwiLFxuXHRcdDMyLFxuXHRcdFwi54CSXCIsXG5cdFx0Nyxcblx0XHRcIueAnFwiLFxuXHRcdDYsXG5cdFx0XCLngKRcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcIjllODBcIixcblx0XHRcIueAq1wiLFxuXHRcdDksXG5cdFx0XCLngLbngLfngLjngLpcIixcblx0XHQxNyxcblx0XHRcIueBjeeBjueBkFwiLFxuXHRcdDEzLFxuXHRcdFwi54GfXCIsXG5cdFx0MTEsXG5cdFx0XCLnga7ngbHngbLngbPngbTngbfngbnngbrngbvngb3ngoHngoLngoPngoTngobngofngojngovngozngo3ngo/ngpDngpHngpPngpfngpjngprngpvngp5cIixcblx0XHQxMixcblx0XHRcIueCsOeCsueCtOeCteeCtueCuueCvueCv+eDhOeDheeDhueDh+eDieeDi1wiLFxuXHRcdDEyLFxuXHRcdFwi54OaXCJcblx0XSxcblx0W1xuXHRcdFwiOWY0MFwiLFxuXHRcdFwi54Oc54Od54Oe54Og54Oh54Oi54Oj54Ol54Oq54Ou54OwXCIsXG5cdFx0Nixcblx0XHRcIueDuOeDuueDu+eDvOeDvlwiLFxuXHRcdDEwLFxuXHRcdFwi54SLXCIsXG5cdFx0NCxcblx0XHRcIueEkeeEkueElOeEl+eEm1wiLFxuXHRcdDEwLFxuXHRcdFwi54SnXCIsXG5cdFx0Nyxcblx0XHRcIueEsueEs+eEtFwiXG5cdF0sXG5cdFtcblx0XHRcIjlmODBcIixcblx0XHRcIueEteeEt1wiLFxuXHRcdDEzLFxuXHRcdFwi54WG54WH54WI54WJ54WL54WN54WPXCIsXG5cdFx0MTIsXG5cdFx0XCLnhZ3nhZ9cIixcblx0XHQ0LFxuXHRcdFwi54Wl54WpXCIsXG5cdFx0NCxcblx0XHRcIueFr+eFsOeFseeFtOeFteeFtueFt+eFueeFu+eFvOeFvlwiLFxuXHRcdDUsXG5cdFx0XCLnhoVcIixcblx0XHQ0LFxuXHRcdFwi54aL54aM54aN54aO54aQ54aR54aS54aT54aV54aW54aX54aaXCIsXG5cdFx0NCxcblx0XHRcIueGoVwiLFxuXHRcdDYsXG5cdFx0XCLnhqnnhqrnhqvnhq1cIixcblx0XHQ1LFxuXHRcdFwi54a054a254a354a454a6XCIsXG5cdFx0OCxcblx0XHRcIueHhFwiLFxuXHRcdDksXG5cdFx0XCLnh49cIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImEwNDBcIixcblx0XHRcIueHllwiLFxuXHRcdDksXG5cdFx0XCLnh6Hnh6Lnh6Pnh6Tnh6bnh6hcIixcblx0XHQ1LFxuXHRcdFwi54evXCIsXG5cdFx0OSxcblx0XHRcIueHulwiLFxuXHRcdDExLFxuXHRcdFwi54iHXCIsXG5cdFx0MTlcblx0XSxcblx0W1xuXHRcdFwiYTA4MFwiLFxuXHRcdFwi54ib54ic54ieXCIsXG5cdFx0OSxcblx0XHRcIueIqeeIq+eIreeIrueIr+eIsueIs+eItOeIuueIvOeIvueJgFwiLFxuXHRcdDYsXG5cdFx0XCLniYnniYrniYvniY7niY/niZDniZHniZPniZTniZXniZfniZjniZrniZzniZ7niaDniaPniaTniaXniajniarniavniaznia3nibDnibHnibPnibTnibbnibfnibjnibvnibznib3nioLnioPnioVcIixcblx0XHQ0LFxuXHRcdFwi54qM54qO54qQ54qR54qTXCIsXG5cdFx0MTEsXG5cdFx0XCLniqBcIixcblx0XHQxMSxcblx0XHRcIueKrueKseeKsueKs+eKteeKulwiLFxuXHRcdDYsXG5cdFx0XCLni4Xni4bni4fni4nni4rni4vni4zni4/ni5Hni5Pni5Tni5Xni5bni5jni5rni5tcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMWExXCIsXG5cdFx0XCLjgIDjgIHjgILCt8uJy4fCqOOAg+OAheKAlO+9nuKAluKApuKAmOKAmeKAnOKAneOAlOOAleOAiFwiLFxuXHRcdDcsXG5cdFx0XCLjgJbjgJfjgJDjgJHCscOXw7fiiLbiiKfiiKjiiJHiiI/iiKriiKniiIjiiLfiiJriiqXiiKXiiKDijJLiipniiKviiK7iiaHiiYziiYjiiL3iiJ3iiaDiia7iia/iiaTiiaXiiJ7iiLXiiLTimYLimYDCsOKAsuKAs+KEg++8hMKk77+g77+h4oCwwqfihJbimIbimIXil4vil4/il47il4fil4bilqHilqDilrPilrLigLvihpLihpDihpHihpPjgJNcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMmExXCIsXG5cdFx0XCLihbBcIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcImEyYjFcIixcblx0XHRcIuKSiFwiLFxuXHRcdDE5LFxuXHRcdFwi4pG0XCIsXG5cdFx0MTksXG5cdFx0XCLikaBcIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcImEyZTVcIixcblx0XHRcIuOIoFwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiYTJmMVwiLFxuXHRcdFwi4oWgXCIsXG5cdFx0MTFcblx0XSxcblx0W1xuXHRcdFwiYTNhMVwiLFxuXHRcdFwi77yB77yC77yD77+l77yFXCIsXG5cdFx0ODgsXG5cdFx0XCLvv6NcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNGExXCIsXG5cdFx0XCLjgYFcIixcblx0XHQ4MlxuXHRdLFxuXHRbXG5cdFx0XCJhNWExXCIsXG5cdFx0XCLjgqFcIixcblx0XHQ4NVxuXHRdLFxuXHRbXG5cdFx0XCJhNmExXCIsXG5cdFx0XCLOkVwiLFxuXHRcdDE2LFxuXHRcdFwizqNcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImE2YzFcIixcblx0XHRcIs6xXCIsXG5cdFx0MTYsXG5cdFx0XCLPg1wiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiYTZlMFwiLFxuXHRcdFwi77i177i277i577i677i/77mA77i977i+77mB77mC77mD77mEXCJcblx0XSxcblx0W1xuXHRcdFwiYTZlZVwiLFxuXHRcdFwi77i777i877i377i477ixXCJcblx0XSxcblx0W1xuXHRcdFwiYTZmNFwiLFxuXHRcdFwi77iz77i0XCJcblx0XSxcblx0W1xuXHRcdFwiYTdhMVwiLFxuXHRcdFwi0JBcIixcblx0XHQ1LFxuXHRcdFwi0IHQllwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcImE3ZDFcIixcblx0XHRcItCwXCIsXG5cdFx0NSxcblx0XHRcItGR0LZcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCJhODQwXCIsXG5cdFx0XCLLisuLy5nigJPigJXigKXigLXihIXihInihpbihpfihpjihpniiJXiiJ/iiKPiiZLiiabiiafiir/ilZBcIixcblx0XHQzNSxcblx0XHRcIuKWgVwiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiYTg4MFwiLFxuXHRcdFwi4paIXCIsXG5cdFx0Nyxcblx0XHRcIuKWk+KWlOKWleKWvOKWveKXouKXo+KXpOKXpeKYieKKleOAkuOAneOAnlwiXG5cdF0sXG5cdFtcblx0XHRcImE4YTFcIixcblx0XHRcIsSBw6HHjsOgxJPDqcSbw6jEq8Otx5DDrMWNw7PHksOyxavDuseUw7nHlseYx5rHnMO8w6rJkVwiXG5cdF0sXG5cdFtcblx0XHRcImE4YmRcIixcblx0XHRcIsWExYhcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOGMwXCIsXG5cdFx0XCLJoVwiXG5cdF0sXG5cdFtcblx0XHRcImE4YzVcIixcblx0XHRcIuOEhVwiLFxuXHRcdDM2XG5cdF0sXG5cdFtcblx0XHRcImE5NDBcIixcblx0XHRcIuOAoVwiLFxuXHRcdDgsXG5cdFx0XCLjiqPjjo7jjo/jjpzjjp3jjp7jjqHjj4Tjj47jj5Hjj5Ljj5XvuLDvv6Lvv6RcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOTU5XCIsXG5cdFx0XCLihKHjiLFcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOTVjXCIsXG5cdFx0XCLigJBcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOTYwXCIsXG5cdFx0XCLjg7zjgpvjgpzjg73jg77jgIbjgp3jgp7vuYlcIixcblx0XHQ5LFxuXHRcdFwi77mU77mV77mW77mX77mZXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCJhOTgwXCIsXG5cdFx0XCLvuaJcIixcblx0XHQ0LFxuXHRcdFwi77mo77mp77mq77mrXCJcblx0XSxcblx0W1xuXHRcdFwiYTk5NlwiLFxuXHRcdFwi44CHXCJcblx0XSxcblx0W1xuXHRcdFwiYTlhNFwiLFxuXHRcdFwi4pSAXCIsXG5cdFx0NzVcblx0XSxcblx0W1xuXHRcdFwiYWE0MFwiLFxuXHRcdFwi54uc54ud54uf54uiXCIsXG5cdFx0NSxcblx0XHRcIueLqueLq+eLteeLtueLueeLveeLvueLv+eMgOeMgueMhFwiLFxuXHRcdDUsXG5cdFx0XCLnjIvnjIznjI3njI/njJDnjJHnjJLnjJTnjJjnjJnnjJrnjJ/njKDnjKPnjKTnjKbnjKfnjKjnjK3njK/njLDnjLLnjLPnjLXnjLbnjLrnjLvnjLznjL3njYBcIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcImFhODBcIixcblx0XHRcIueNieeNiueNi+eNjOeNjueNj+eNkeeNk+eNlOeNleeNlueNmFwiLFxuXHRcdDcsXG5cdFx0XCLnjaFcIixcblx0XHQxMCxcblx0XHRcIueNrueNsOeNsVwiXG5cdF0sXG5cdFtcblx0XHRcImFiNDBcIixcblx0XHRcIueNslwiLFxuXHRcdDExLFxuXHRcdFwi542/XCIsXG5cdFx0NCxcblx0XHRcIueOheeOhueOiOeOiueOjOeOjeeOj+eOkOeOkueOk+eOlOeOleeOl+eOmOeOmeeOmueOnOeOneeOnueOoOeOoeeOo1wiLFxuXHRcdDUsXG5cdFx0XCLnjqrnjqznjq3njrHnjrTnjrXnjrbnjrjnjrnnjrznjr3njr7njr/nj4Hnj4NcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImFiODBcIixcblx0XHRcIuePi+ePjOePjuePklwiLFxuXHRcdDYsXG5cdFx0XCLnj5rnj5vnj5znj53nj5/nj6Hnj6Lnj6Pnj6Tnj6bnj6jnj6rnj6vnj6znj67nj6/nj7Dnj7Hnj7NcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImFjNDBcIixcblx0XHRcIuePuFwiLFxuXHRcdDEwLFxuXHRcdFwi55CE55CH55CI55CL55CM55CN55CO55CRXCIsXG5cdFx0OCxcblx0XHRcIueQnFwiLFxuXHRcdDUsXG5cdFx0XCLnkKPnkKTnkKfnkKnnkKvnkK3nkK/nkLHnkLLnkLdcIixcblx0XHQ0LFxuXHRcdFwi55C955C+55C/55GA55GCXCIsXG5cdFx0MTFcblx0XSxcblx0W1xuXHRcdFwiYWM4MFwiLFxuXHRcdFwi55GOXCIsXG5cdFx0Nixcblx0XHRcIueRlueRmOeRneeRoFwiLFxuXHRcdDEyLFxuXHRcdFwi55Gu55Gv55GxXCIsXG5cdFx0NCxcblx0XHRcIueRuOeRueeRulwiXG5cdF0sXG5cdFtcblx0XHRcImFkNDBcIixcblx0XHRcIueRu+eRvOeRveeRv+eSgueShOeSheeShueSiOeSieeSiueSjOeSjeeSj+eSkVwiLFxuXHRcdDEwLFxuXHRcdFwi55Kd55KfXCIsXG5cdFx0Nyxcblx0XHRcIueSqlwiLFxuXHRcdDE1LFxuXHRcdFwi55K7XCIsXG5cdFx0MTJcblx0XSxcblx0W1xuXHRcdFwiYWQ4MFwiLFxuXHRcdFwi55OIXCIsXG5cdFx0OSxcblx0XHRcIueTk1wiLFxuXHRcdDgsXG5cdFx0XCLnk53nk5/nk6Hnk6Xnk6dcIixcblx0XHQ2LFxuXHRcdFwi55Ow55Ox55OyXCJcblx0XSxcblx0W1xuXHRcdFwiYWU0MFwiLFxuXHRcdFwi55Oz55O155O4XCIsXG5cdFx0Nixcblx0XHRcIueUgOeUgeeUgueUg+eUhVwiLFxuXHRcdDcsXG5cdFx0XCLnlI7nlJDnlJLnlJTnlJXnlJbnlJfnlJvnlJ3nlJ7nlKBcIixcblx0XHQ0LFxuXHRcdFwi55Sm55Sn55Sq55Su55S055S255S555S855S955S/55WB55WC55WD55WE55WG55WH55WJ55WK55WN55WQ55WR55WS55WT55WV55WW55WX55WYXCJcblx0XSxcblx0W1xuXHRcdFwiYWU4MFwiLFxuXHRcdFwi55WdXCIsXG5cdFx0Nyxcblx0XHRcIueVp+eVqOeVqeeVq1wiLFxuXHRcdDYsXG5cdFx0XCLnlbPnlbXnlbbnlbfnlbpcIixcblx0XHQ0LFxuXHRcdFwi55aA55aB55aC55aE55aF55aHXCJcblx0XSxcblx0W1xuXHRcdFwiYWY0MFwiLFxuXHRcdFwi55aI55aJ55aK55aM55aN55aO55aQ55aT55aV55aY55ab55ac55ae55ai55amXCIsXG5cdFx0NCxcblx0XHRcIueWreeWtueWt+eWuueWu+eWv+eXgOeXgeeXhueXi+eXjOeXjueXj+eXkOeXkeeXk+eXl+eXmeeXmueXnOeXneeXn+eXoOeXoeeXpeeXqeeXrOeXreeXrueXr+eXsueXs+eXteeXtueXt+eXuOeXuueXu+eXveeXvueYgueYhOeYhueYh1wiXG5cdF0sXG5cdFtcblx0XHRcImFmODBcIixcblx0XHRcIueYiOeYieeYi+eYjeeYjueYj+eYkeeYkueYk+eYlOeYlueYmueYnOeYneeYnueYoeeYo+eYp+eYqOeYrOeYrueYr+eYseeYsueYtueYt+eYueeYuueYu+eYveeZgeeZgueZhFwiXG5cdF0sXG5cdFtcblx0XHRcImIwNDBcIixcblx0XHRcIueZhVwiLFxuXHRcdDYsXG5cdFx0XCLnmY5cIixcblx0XHQ1LFxuXHRcdFwi55mV55mXXCIsXG5cdFx0NCxcblx0XHRcIueZneeZn+eZoOeZoeeZoueZpFwiLFxuXHRcdDYsXG5cdFx0XCLnmaznma3nma7nmbBcIixcblx0XHQ3LFxuXHRcdFwi55m555m655m855m/55qA55qB55qD55qF55qJ55qK55qM55qN55qP55qQ55qS55qU55qV55qX55qY55qa55qbXCJcblx0XSxcblx0W1xuXHRcdFwiYjA4MFwiLFxuXHRcdFwi55qcXCIsXG5cdFx0Nyxcblx0XHRcIueapVwiLFxuXHRcdDgsXG5cdFx0XCLnmq/nmrDnmrPnmrVcIixcblx0XHQ5LFxuXHRcdFwi55uA55uB55uD5ZWK6Zi/5Z+D5oyo5ZOO5ZSJ5ZOA55qR55mM6JS855+u6Im+56KN54ix6ZqY6Z6N5rCo5a6J5L+65oyJ5pqX5bK46IO65qGI6IKu5piC55uO5Ye55pWW54as57+x6KKE5YKy5aWl5oeK5r6z6Iqt5o2M5omS5Y+t5ZCn56yG5YWr55ak5be05ouU6LeL6Z225oqK6ICZ5Z2d6Zy4572i54i455m95p+P55m+5pGG5L2w6LSl5ouc56iX5paR54+t5pCs5omz6Iis6aKB5p2/54mI5omu5ouM5Ly055Oj5Y2K5Yqe57uK6YKm5biu5qKG5qac6IaA57uR5qOS56OF6JqM6ZWR5YKN6LCk6Iue6IOe5YyF6KSS5YmlXCJcblx0XSxcblx0W1xuXHRcdFwiYjE0MFwiLFxuXHRcdFwi55uE55uH55uJ55uL55uM55uT55uV55uZ55ua55uc55ud55ue55ugXCIsXG5cdFx0NCxcblx0XHRcIuebplwiLFxuXHRcdDcsXG5cdFx0XCLnm7Dnm7Pnm7Xnm7bnm7fnm7rnm7vnm73nm7/nnIDnnILnnIPnnIXnnIbnnIrnnIznnI5cIixcblx0XHQxMCxcblx0XHRcIuecm+ecnOecneecnuecoeeco+ecpOecpeecp+ecquecq1wiXG5cdF0sXG5cdFtcblx0XHRcImIxODBcIixcblx0XHRcIuecrOecruecsFwiLFxuXHRcdDQsXG5cdFx0XCLnnLnnnLvnnL3nnL7nnL/nnYLnnYTnnYXnnYbnnYhcIixcblx0XHQ3LFxuXHRcdFwi552SXCIsXG5cdFx0Nyxcblx0XHRcIuednOiWhOmbueS/neWgoemlseWuneaKseaKpeaatOixuemyjeeIhuadr+eikeaCsuWNkeWMl+i+iOiDjOi0nemSoeWAjeeLiOWkh+aDq+eEmeiiq+WllOiLr+acrOesqOW0qee7t+eUreaztei5pui/uOmAvOm8u+avlOmEmeeslOW9vOeip+iTluiUveavleavmeavluW4geW6h+eXuemXreaVneW8iuW/hei+n+WjgeiHgumBv+mZm+merei+uee8lui0rOaJgeS+v+WPmOWNnui+qOi+qei+q+mBjeagh+W9quiGmOihqOmzluaGi+WIq+eYquW9rOaWjOa/kua7qOWuvuaRiOWFteWGsOafhOS4meeniemlvOeCs1wiXG5cdF0sXG5cdFtcblx0XHRcImIyNDBcIixcblx0XHRcIuedneednuedn+edoOedpOedp+edqeedquedrVwiLFxuXHRcdDExLFxuXHRcdFwi552655275528556B556C556D556GXCIsXG5cdFx0NSxcblx0XHRcIueej+eekOeek1wiLFxuXHRcdDExLFxuXHRcdFwi556h556j556k556m556o556r556t556u556v556x556y55605562XCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJiMjgwXCIsXG5cdFx0XCLnnrznnr7nn4BcIixcblx0XHQxMixcblx0XHRcIuefjlwiLFxuXHRcdDgsXG5cdFx0XCLnn5jnn5nnn5rnn51cIixcblx0XHQ0LFxuXHRcdFwi55+k55eF5bm254676I+g5pKt5ouo6ZK15rOi5Y2a5YuD5pCP6ZOC566U5Lyv5bib6Ii26ISW6IaK5rik5rOK6amz5o2V5Y2c5ZO66KGl5Z+g5LiN5biD5q2l57C/6YOo5oCW5pOm54yc6KOB5p2Q5omN6LSi552s6Lip6YeH5b2p6I+c6JSh6aSQ5Y+C6JqV5q6L5oOt5oOo54G/6IuN6Iix5LuT5rKn6JeP5pON57OZ5qe95pu56I2J5Y6V562W5L6n5YaM5rWL5bGC6Lmt5o+S5Y+J6Iys6Iy25p+l56K05pC95a+f5bKU5beu6K+n5ouG5p+06LG65pCA5o666J2J6aaL6LCX57yg6ZOy5Lqn6ZiQ6aKk5piM54yWXCJcblx0XSxcblx0W1xuXHRcdFwiYjM0MFwiLFxuXHRcdFwi55+m55+o55+q55+v55+w55+x55+y55+055+155+355+555+655+755+856CDXCIsXG5cdFx0NSxcblx0XHRcIuegiuegi+egjuegj+egkOegk+egleegmeegm+egnuegoOegoeegouegpOegqOegquegq+egruegr+egseegsuegs+egteegtuegveegv+ehgeehguehg+ehhOehhuehiOehieehiuehi+ehjeehj+ehkeehk+ehlOehmOehmeehmlwiXG5cdF0sXG5cdFtcblx0XHRcImIzODBcIixcblx0XHRcIuehm+ehnOehnlwiLFxuXHRcdDExLFxuXHRcdFwi56GvXCIsXG5cdFx0Nyxcblx0XHRcIuehuOehueehuuehu+ehvVwiLFxuXHRcdDYsXG5cdFx0XCLlnLrlsJ3luLjplb/lgb/ogqDljoLmlZ7nlYXllLHlgKHotoXmioTpkp7mnJ3lmLLmva7lt6LlkLXngpLovabmia/mkqTmjqPlvbvmvojpg7Toh6PovrDlsJjmmajlv7HmsonpmYjotoHooazmkpHnp7Dln47mqZnmiJDlkYjkuZjnqIvmg6nmvoTor5rmib/pgJ7pqovnp6TlkIPnl7TmjIHljJnmsaDov5/lvJvpqbDogLvpvb/kvojlsLrotaTnv4XmlqXngr3lhYXlhrLomavltIflrqDmir3phaznlbTouIznqKDmhIHnrbnku4fnu7jnnoXkuJHoh63liJ3lh7rmqbHljqjouofplITpm4/mu4HpmaTmpZpcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNDQwXCIsXG5cdFx0XCLnooTnooXnoobnoojnoornoovnoo/nopDnopLnopTnopXnopbnopnnop3nop7noqDnoqLnoqTnoqbnoqhcIixcblx0XHQ3LFxuXHRcdFwi56K156K256K356K456K656K756K856K956K/56OA56OC56OD56OE56OG56OH56OI56OM56ON56OO56OP56OR56OS56OT56OW56OX56OY56OaXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCJiNDgwXCIsXG5cdFx0XCLno6Tno6Xno6bno6fno6nno6rno6vno61cIixcblx0XHQ0LFxuXHRcdFwi56Oz56O156O256O456O556O7XCIsXG5cdFx0NSxcblx0XHRcIuekguekg+ekhOekhlwiLFxuXHRcdDYsXG5cdFx0XCLnoYDlgqjnn5fmkJDop6blpITmj6Plt53nqb/mpL3kvKDoiLnllpjkuLLnlq7nqpfluaLluorpl6/liJvlkLnngormjbbplKTlnoLmmKXmpL/phofllIfmt7Pnuq/ooKLmiLPnu7DnlrXojKjno4Hpm4zovp7mhYjnk7for43mraTliLrotZDmrKHogarokbHlm7HljIbku47kuJvlh5HnspfphovnsIfkv4Poub/nr6HnqpzmkafltJTlgqzohIbnmIHnsrnmt6znv6DmnZHlrZjlr7jno4vmkq7mkJPmjqrmjKvplJnmkK3ovr7nrZTnmKnmiZPlpKflkYbmrbnlgqPmiLTluKbmrobku6PotLfooovlvoXpgK5cIlxuXHRdLFxuXHRbXG5cdFx0XCJiNTQwXCIsXG5cdFx0XCLnpI1cIixcblx0XHQ1LFxuXHRcdFwi56SUXCIsXG5cdFx0OSxcblx0XHRcIuekn1wiLFxuXHRcdDQsXG5cdFx0XCLnpKVcIixcblx0XHQxNCxcblx0XHRcIuektVwiLFxuXHRcdDQsXG5cdFx0XCLnpL3npL/npYLnpYPnpYTnpYXnpYfnpYpcIixcblx0XHQ4LFxuXHRcdFwi56WU56WV56WY56WZ56Wh56WjXCJcblx0XSxcblx0W1xuXHRcdFwiYjU4MFwiLFxuXHRcdFwi56Wk56Wm56Wp56Wq56Wr56Ws56Wu56WwXCIsXG5cdFx0Nixcblx0XHRcIuelueelu1wiLFxuXHRcdDQsXG5cdFx0XCLnpoLnpoPnpobnpofnpojnponnpovnpoznpo3npo7nppDnppHnppLmgKDogL3mi4XkuLnljZXpg7jmjrjog4bml6bmsK7kvYbmg67mt6Hor57lvLnom4vlvZPmjKHlhZrojaHmoaPliIDmjaPouYjlgJLlspvnpbflr7zliLDnqLvmgrzpgZPnm5flvrflvpfnmoTouaznga/nmbvnrYnnnqrlh7PpgpPloKTkvY7mu7Tov6rmlYznrJvni4TmtqTnv5/lq6HmirXlupXlnLDokoLnrKzluJ3lvJ/pgJLnvJTpoqDmjoLmu4fnopjngrnlhbjpnZvlnqvnlLXkvYPnlLjlupfmg6blpaDmt4Dmrr/noonlj7zpm5Xlh4vliIHmjonlkIrpkpPosIPot4zniLnnop/onbbov63osI3lj6BcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNjQwXCIsXG5cdFx0XCLnppNcIixcblx0XHQ2LFxuXHRcdFwi56abXCIsXG5cdFx0MTEsXG5cdFx0XCLnpqhcIixcblx0XHQxMCxcblx0XHRcIuemtFwiLFxuXHRcdDQsXG5cdFx0XCLnprznpr/np4Lnp4Tnp4Xnp4fnp4jnp4rnp4znp47np4/np5Dnp5Pnp5Tnp5bnp5fnp5lcIixcblx0XHQ1LFxuXHRcdFwi56eg56eh56ei56el56eo56eqXCJcblx0XSxcblx0W1xuXHRcdFwiYjY4MFwiLFxuXHRcdFwi56es56eu56exXCIsXG5cdFx0Nixcblx0XHRcIuenueenuuenvOenvuenv+eogeeohOeoheeoh+eoiOeoieeoiueojOeoj1wiLFxuXHRcdDQsXG5cdFx0XCLnqJXnqJbnqJjnqJnnqJvnqJzkuIHnm6/lj67pkonpobbpvI7plK3lrprorqLkuKLkuJzlhqzokaPmh4LliqjmoIvkvpfmgavlhrvmtJ7lhZzmipbmlpfpmaHosYbpgJfnl5jpg73nnaPmr5Lniorni6zor7vloLXnnbnotYzmnZzplYDogprluqbmuKHlppLnq6/nn63plLvmrrXmlq3nvI7loIblhZHpmJ/lr7nloqnlkKjoubLmlabpob/lm6Tpkp3nm77pgYHmjoflk4blpJrlpLrlnpvourLmnLXot7roiLXliYHmg7DloJXom77ls6jpuYXkv4Tpop3orrnlqKXmgbbljoTmibzpgY/phILppb/mganogIzlhL/ogLPlsJTppbXmtLHkuoxcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNzQwXCIsXG5cdFx0XCLnqJ3nqJ/nqKHnqKLnqKRcIixcblx0XHQxNCxcblx0XHRcIueotOeoteeotueouOeouueovuepgFwiLFxuXHRcdDUsXG5cdFx0XCLnqYdcIixcblx0XHQ5LFxuXHRcdFwi56mSXCIsXG5cdFx0NCxcblx0XHRcIuepmFwiLFxuXHRcdDE2XG5cdF0sXG5cdFtcblx0XHRcImI3ODBcIixcblx0XHRcIuepqVwiLFxuXHRcdDYsXG5cdFx0XCLnqbHnqbLnqbPnqbXnqbvnqbznqb3nqb7nqoLnqoXnqofnqonnqornqovnqoznqo7nqo/nqpDnqpPnqpTnqpnnqprnqpvnqp7nqqHnqqLotLDlj5HnvZrnrY/kvJDkuY/pmIDms5Xnj5Dol6nluIbnlarnv7vmqIrnn77pkpLnuYHlh6Hng6blj43ov5TojIPotKnniq/ppa3ms5vlnYroirPmlrnogqrmiL/pmLLlpqjku7/orr/nurrmlL7oj7LpnZ7llaHpo57ogqXljKror73lkKDogrrlup/msrjotLnoiqzphZrlkKnmsJvliIbnurflnZ/nhJrmsb7nsonlpYvku73lv7/mhKTnsqrkuLDlsIHmnqvonILls7DplIvpo47nlq/ng73pgKLlhq/nvJ3orr3lpYnlh6TkvZvlkKblpKvmlbfogqTlrbXmibbmi4LovpDluYXmsJ/nrKbkvI/kv5jmnI1cIlxuXHRdLFxuXHRbXG5cdFx0XCJiODQwXCIsXG5cdFx0XCLnqqPnqqTnqqfnqqnnqqrnqqvnqq5cIixcblx0XHQ0LFxuXHRcdFwi56q0XCIsXG5cdFx0MTAsXG5cdFx0XCLnq4BcIixcblx0XHQxMCxcblx0XHRcIuerjFwiLFxuXHRcdDksXG5cdFx0XCLnq5fnq5jnq5rnq5vnq5znq53nq6Hnq6Lnq6Tnq6dcIixcblx0XHQ1LFxuXHRcdFwi56uu56uw56ux56uy56uzXCJcblx0XSxcblx0W1xuXHRcdFwiYjg4MFwiLFxuXHRcdFwi56u0XCIsXG5cdFx0NCxcblx0XHRcIueru+ervOervuesgOesgeesguesheesh+esieesjOesjeesjueskOeskuesk+esluesl+esmOesmuesnOesneesn+esoeesoueso+esp+esqeesrea1rua2quemj+iiseW8l+eUq+aKmui+heS/r+mHnOaWp+iEr+iFkeW6nOiFkOi1tOWJr+imhui1i+WkjeWCheS7mOmYnOeItuiFuei0n+WvjOiuo+mZhOWmh+e8muWSkOWZtuWYjuivpeaUueamgumSmeeblua6ieW5sueUmOadhuafkeerv+iCnei1tuaEn+enhuaVoui1o+WGiOWImumSoue8uOiCm+e6suWyl+a4r+adoOevmeeai+mrmOiGj+e+lOezleaQnumVkOeov+WRiuWTpeatjOaQgeaIiOm4veiDs+eWmeWJsumdqeiRm+agvOibpOmYgemalOmTrOS4quWQhOe7meaguei3n+iAleabtOW6mue+uVwiXG5cdF0sXG5cdFtcblx0XHRcImI5NDBcIixcblx0XHRcIuesr+essOessuestOesteestuest+esueesu+esveesv1wiLFxuXHRcdDUsXG5cdFx0XCLnrYbnrYjnrYrnrY3nrY7nrZPnrZXnrZfnrZnnrZznrZ7nrZ/nraHnraNcIixcblx0XHQxMCxcblx0XHRcIuetr+etsOets+ettOettuetuOetuuetvOetveetv+eugeeugueug+euhOeuhlwiLFxuXHRcdDYsXG5cdFx0XCLnro7nro9cIlxuXHRdLFxuXHRbXG5cdFx0XCJiOTgwXCIsXG5cdFx0XCLnrpHnrpLnrpPnrpbnrpjnrpnnrprnrpvnrp7nrp/nrqDnrqPnrqTnrqXnrq7nrq/nrrDnrrLnrrPnrrXnrrbnrrfnrrlcIixcblx0XHQ3LFxuXHRcdFwi56+C56+D56+E5Z+C6IC/5qKX5bel5pS75Yqf5oGt6b6a5L6b6Lqs5YWs5a6r5byT5bep5rGe5oux6LSh5YWx6ZKp5Yu+5rKf6Iuf54uX5Z6i5p6E6LSt5aSf6L6c6I+H5ZKV566N5Lyw5rK95a2k5aeR6byT5Y+k6JuK6aqo6LC36IKh5pWF6aG+5Zu66ZuH5Yiu55Oc5YmQ5a+h5oyC6KSC5LmW5ouQ5oCq5qO65YWz5a6Y5Yag6KeC566h6aaG572Q5oOv54GM6LSv5YWJ5bm/6YCb55Gw6KeE5Zyt56GF5b2S6b6f6Ze66L2o6ay86K+h55m45qGC5p+c6Leq6LS15Yi96L6K5rua5qON6ZSF6YOt5Zu95p6c6KO56L+H5ZOIXCJcblx0XSxcblx0W1xuXHRcdFwiYmE0MFwiLFxuXHRcdFwi56+F56+I56+J56+K56+L56+N56+O56+P56+Q56+S56+UXCIsXG5cdFx0NCxcblx0XHRcIuevm+evnOevnuevn+evoOevouevo+evpOevp+evqOevqeevq+evrOevreevr+evsOevslwiLFxuXHRcdDQsXG5cdFx0XCLnr7jnr7nnr7rnr7vnr73nr79cIixcblx0XHQ3LFxuXHRcdFwi57CI57CJ57CK57CN57CO57CQXCIsXG5cdFx0NSxcblx0XHRcIuewl+ewmOewmVwiXG5cdF0sXG5cdFtcblx0XHRcImJhODBcIixcblx0XHRcIuewmlwiLFxuXHRcdDQsXG5cdFx0XCLnsKBcIixcblx0XHQ1LFxuXHRcdFwi57Co57Cp57CrXCIsXG5cdFx0MTIsXG5cdFx0XCLnsLlcIixcblx0XHQ1LFxuXHRcdFwi57GC6aq45a2p5rW35rCm5Lql5a6z6aqH6YWj5oao6YKv6Z+p5ZCr5ra15a+S5Ye95ZaK572V57+w5pK85o2N5pex5oa+5oKN54SK5rGX5rGJ5aSv5p2t6Iiq5aOV5ZqO6LGq5q+r6YOd5aW96ICX5Y+35rWp5ZG15Zad6I236I+P5qC456a+5ZKM5L2V5ZCI55uS6LKJ6ZiC5rKz5ra46LWr6KSQ6bmk6LS65Zi/6buR55eV5b6I54ug5oGo5ZO85Lqo5qiq6KGh5oGS6L2w5ZOE54OY6Jm56bi/5rSq5a6P5byY57qi5ZaJ5L6v54y05ZC85Y6a5YCZ5ZCO5ZG85LmO5b+955Ga5aO26JGr6IOh6J2054uQ57OK5rmWXCJcblx0XSxcblx0W1xuXHRcdFwiYmI0MFwiLFxuXHRcdFwi57GDXCIsXG5cdFx0OSxcblx0XHRcIuexjlwiLFxuXHRcdDM2LFxuXHRcdFwi57G1XCIsXG5cdFx0NSxcblx0XHRcIuexvlwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiYmI4MFwiLFxuXHRcdFwi57KI57KKXCIsXG5cdFx0Nixcblx0XHRcIueyk+eylOeylueymeeymueym+eyoOeyoeeyo+eypueyp+eyqOeyqeeyq+eyrOeyreeyr+eysOeytFwiLFxuXHRcdDQsXG5cdFx0XCLnsrrnsrvlvKfomY7llKzmiqTkupLmsqrmiLfoirHlk5fljY7njL7mu5HnlLvliJLljJbor53mp5DlvormgIDmt67lnY/mrKLnjq/moZPov5jnvJPmjaLmgqPllKTnl6rosaLnhJXmtqPlrqblubvojZLmhYzpu4Tno7ronZfnsKfnmoflh7Dmg7bnhYzmmYPluYzmgY3osI7ngbDmjKXovonlvr3mgaLom5Tlm57mr4HmgpTmhafljYnmg6DmmabotL/np73kvJrng6nmsYforrPor7Lnu5jojaTmmI/lqZrprYLmtZHmt7fosYHmtLvkvJnngavojrfmiJbmg5HpnI3otKfnpbjlh7vlnL7ln7rmnLrnlbjnqL3np6/nrpVcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYzQwXCIsXG5cdFx0XCLnsr/ns4Dns4Lns4Pns4Tns4bns4nns4vns45cIixcblx0XHQ2LFxuXHRcdFwi57OY57Oa57Ob57Od57Oe57OhXCIsXG5cdFx0Nixcblx0XHRcIuezqVwiLFxuXHRcdDUsXG5cdFx0XCLns7BcIixcblx0XHQ3LFxuXHRcdFwi57O557O657O8XCIsXG5cdFx0MTMsXG5cdFx0XCLntItcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcImJjODBcIixcblx0XHRcIue0kVwiLFxuXHRcdDE0LFxuXHRcdFwi57Sh57Sj57Sk57Sl57Sm57So57Sp57Sq57Ss57St57Su57SwXCIsXG5cdFx0Nixcblx0XHRcIuiCjOmlpei/uea/gOiupem4oeWnrOe7qee8ieWQieaegeajmOi+keexjembhuWPiuaApeeWvuaxsuWNs+Wriee6p+aMpOWHoOiEiuW3seiTn+aKgOWGgOWto+S8juelreWJguaCuOa1juWvhOWvguiuoeiusOaXouW/jOmZheWmk+e7p+e6quWYieaet+WkueS9s+WutuWKoOiNmumiiui0vueUsumSvuWBh+eovOS7t+aetumpvuWrgeatvOebkeWdmuWwluesuumXtOeFjuWFvOiCqeiJsOWluOe8hOiMp+ajgOafrOeiseeht+aLo+aNoeeugOS/reWJquWHj+iNkOanm+mJtOi3tei0seingemUrueureS7tlwiXG5cdF0sXG5cdFtcblx0XHRcImJkNDBcIixcblx0XHRcIue0t1wiLFxuXHRcdDU0LFxuXHRcdFwi57WvXCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCJiZDgwXCIsXG5cdFx0XCLntbhcIixcblx0XHQzMixcblx0XHRcIuWBpeiIsOWJkemlr+a4kOa6hea2p+W7uuWDteWnnOWwhua1huaxn+eWhuiSi+ahqOWlluiusuWMoOmFsemZjeiVieakkuekgeeEpuiDtuS6pOmDiua1h+mqhOWoh+WavOaQhemTsOefq+S+peiEmueLoeinkumluue8tOe7nuWJv+aVmemFtei9v+i+g+WPq+eqluaPreaOpeeahuenuOihl+mYtuaIquWKq+iKguahlOadsOaNt+edq+errea0gee7k+ino+WnkOaIkuiXieiKpeeVjOWAn+S7i+eWpeivq+WxiuW3vueti+aWpOmHkeS7iua0peiln+e0p+mUpuS7heiwqOi/m+mds+aZi+emgei/keeDrOa1uFwiXG5cdF0sXG5cdFtcblx0XHRcImJlNDBcIixcblx0XHRcIue2mVwiLFxuXHRcdDEyLFxuXHRcdFwi57anXCIsXG5cdFx0Nixcblx0XHRcIue2r1wiLFxuXHRcdDQyXG5cdF0sXG5cdFtcblx0XHRcImJlODBcIixcblx0XHRcIue3mlwiLFxuXHRcdDMyLFxuXHRcdFwi5bC95Yqy6I2G5YWi6IyO552b5pm26bK45Lqs5oOK57K+57Kz57uP5LqV6K2m5pmv6aKI6Z2Z5aKD5pWs6ZWc5b6E55eJ6Z2W56uf56ue5YeA54Kv56qY5o+q56m257qg546W6Z+t5LmF54G45Lmd6YWS5Y6p5pWR5pen6Ie86IiF5ZKO5bCx55aa6Z6g5ouY54uZ55a95bGF6am56I+K5bGA5ZKA55+p5Li+5rKu6IGa5ouS5o2u5beo5YW36Led6Lie6ZSv5L+x5Y+l5oOn54Ks5Ymn5o2Q6bmD5aif5YCm55y35Y2357ui5pKF5pSr5oqJ5o6Y5YCU54i16KeJ5Yaz6K+A57ud5Z2H6I+M6ZKn5Yab5ZCb5bO7XCJcblx0XSxcblx0W1xuXHRcdFwiYmY0MFwiLFxuXHRcdFwi57e7XCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiYmY4MFwiLFxuXHRcdFwi57i657i8XCIsXG5cdFx0NCxcblx0XHRcIue5glwiLFxuXHRcdDQsXG5cdFx0XCLnuYhcIixcblx0XHQyMSxcblx0XHRcIuS/iuero+a1mumDoemqj+WWgOWSluWNoeWSr+W8gOaPqealt+WHr+aFqOWIiuWgquWLmOWdjuegjeeci+W6t+aFt+ezoOaJm+aKl+S6oueCleiAg+aLt+eDpOmdoOWdt+iLm+afr+ajteejlemil+enkeWjs+WSs+WPr+a4tOWFi+WIu+WuouivvuiCr+WVg+WepuaBs+WdkeWQreepuuaBkOWtlOaOp+aKoOWPo+aJo+Wvh+aer+WTreeqn+iLpumFt+W6k+ijpOWkuOWeruaMjui3qOiDr+Wdl+ett+S+qeW/q+WuveasvuWMoeetkOeLguahhuefv+ectuaXt+WGteS6j+eblOWyv+eqpeiRteWljumtgeWCgFwiXG5cdF0sXG5cdFtcblx0XHRcImMwNDBcIixcblx0XHRcIue5nlwiLFxuXHRcdDM1LFxuXHRcdFwi57qDXCIsXG5cdFx0MjMsXG5cdFx0XCLnupznup3nup5cIlxuXHRdLFxuXHRbXG5cdFx0XCJjMDgwXCIsXG5cdFx0XCLnuq7nurTnurvnurznu5bnu6Tnu6znu7nnvIrnvJDnvJ7nvLfnvLnnvLtcIixcblx0XHQ2LFxuXHRcdFwi572D572GXCIsXG5cdFx0OSxcblx0XHRcIue9kue9k+mmiOaEp+a6g+WdpOaYhuaNhuWbsOaLrOaJqeW7k+mYlOWeg+aLieWWh+icoeiFiui+o+WVpuiOseadpei1luiTneWpquagj+aLpuevrumYkeWFsOa+nOiwsOaPveiniOaHkue8hueDgua7peeQheamlOeLvOW7iumDjuacl+a1quaNnuWKs+eJouiAgeS9rOWnpemFqueDmea2neWLkuS5kOmbt+mVreiVvuejiue0r+WEoeWekuaTguiCi+exu+azquajsealnuWGt+WOmOaiqOeKgem7juevseeLuOemu+a8k+eQhuadjumHjOmypOekvOiOieiNlOWQj+agl+S4veWOieWKseegvuWOhuWIqeWCiOS+i+S/kFwiXG5cdF0sXG5cdFtcblx0XHRcImMxNDBcIixcblx0XHRcIue9lue9mee9m+e9nOe9nee9nue9oOe9o1wiLFxuXHRcdDQsXG5cdFx0XCLnvavnvaznva3nva/nvbDnvbPnvbXnvbbnvbfnvbjnvbrnvbvnvbznvb3nvb/nvoDnvoJcIixcblx0XHQ3LFxuXHRcdFwi576L576N576PXCIsXG5cdFx0NCxcblx0XHRcIue+lVwiLFxuXHRcdDQsXG5cdFx0XCLnvpvnvpznvqDnvqLnvqPnvqXnvqbnvqhcIixcblx0XHQ2LFxuXHRcdFwi576xXCJcblx0XSxcblx0W1xuXHRcdFwiYzE4MFwiLFxuXHRcdFwi576zXCIsXG5cdFx0NCxcblx0XHRcIue+uue+u+e+vue/gOe/gue/g+e/hOe/hue/h+e/iOe/iee/i+e/jee/j1wiLFxuXHRcdDQsXG5cdFx0XCLnv5bnv5fnv5lcIixcblx0XHQ1LFxuXHRcdFwi57+i57+j55ei56uL57KS5rKl6Zq25Yqb55KD5ZOp5L+p6IGU6I6y6L+e6ZWw5buJ5oCc5raf5biY5pWb6IS46ZO+5oGL54K857uD57Ku5YeJ5qKB57Kx6Imv5Lik6L6G6YeP5pm+5Lqu6LCF5pKp6IGK5YOa55aX54eO5a+l6L695r2m5LqG5pKC6ZWj5buW5paZ5YiX6KOC54OI5Yqj54yO55Cz5p6X56O36ZyW5Li06YK76bOe5reL5Yeb6LWB5ZCd5ouO546y6I+x6Zu26b6E6ZOD5Ly2576a5YeM54G16Zm15bKt6aKG5Y+m5Luk5rqc55CJ5qa056Gr6aaP55WZ5YiY55ik5rWB5p+z5YWt6b6Z6IGL5ZKZ56y856q/XCJcblx0XSxcblx0W1xuXHRcdFwiYzI0MFwiLFxuXHRcdFwi57+k57+n57+o57+q57+r57+s57+t57+v57+y57+0XCIsXG5cdFx0Nixcblx0XHRcIue/vee/vue/v+iAguiAh+iAiOiAieiAiuiAjuiAj+iAkeiAk+iAmuiAm+iAneiAnuiAn+iAoeiAo+iApOiAq1wiLFxuXHRcdDUsXG5cdFx0XCLogLLogLTogLnogLrogLzogL7ogYDogYHogYTogYXogYfogYjogYnogY7ogY/ogZDogZHogZPogZXogZbogZdcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMjgwXCIsXG5cdFx0XCLogZnogZtcIixcblx0XHQxMyxcblx0XHRcIuiBq1wiLFxuXHRcdDUsXG5cdFx0XCLogbJcIixcblx0XHQxMSxcblx0XHRcIumahuWehOaLoumZh+alvOWohOaQguevk+a8j+mZi+iKpuWNoumiheW6kOeCieaOs+WNpOiZj+mygem6k+eijOmcsui3r+i1gum5v+a9nuemhOW9lemZhuaIrumptOWQlemTneS+o+aXheWxpeWxoee8leiZkeawr+W+i+eOh+a7pOe7v+WzpuaMm+Wtqua7puWNteS5seaOoOeVpeaKoei9ruS8puS7keaypue6tuiuuuiQneieuue9l+mAu+mUo+euqemqoeijuOiQvea0m+mqhue7nOWmiOm6u+eOm+eggeiagumprOmqguWYm+WQl+Wfi+S5sOm6puWNlui/iOiEieeekummkuibrua7oeiUk+abvOaFoua8q1wiXG5cdF0sXG5cdFtcblx0XHRcImMzNDBcIixcblx0XHRcIuiBvuiCgeiCguiCheiCiOiCiuiCjVwiLFxuXHRcdDUsXG5cdFx0XCLogpTogpXogpfogpnogp7ogqPogqbogqfogqjogqzogrDogrPogrXogrbogrjogrnogrvog4Xog4dcIixcblx0XHQ0LFxuXHRcdFwi6IOPXCIsXG5cdFx0Nixcblx0XHRcIuiDmOiDn+iDoOiDouiDo+iDpuiDruiDteiDt+iDueiDu+iDvuiDv+iEgOiEgeiEg+iEhOiEheiEh+iEiOiEi1wiXG5cdF0sXG5cdFtcblx0XHRcImMzODBcIixcblx0XHRcIuiEjOiEleiEl+iEmeiEm+iEnOiEneiEn1wiLFxuXHRcdDEyLFxuXHRcdFwi6ISt6ISu6ISw6ISz6IS06IS16IS36IS5XCIsXG5cdFx0NCxcblx0XHRcIuiEv+iwqeiKkuiMq+ebsuawk+W/meiOveeMq+iMhemUmuavm+efm+mThuWNr+iMguWGkuW4veiyjOi0uOS5iOeOq+aemuaihemFtumcieeFpOayoeecieWqkumVgeavj+e+juaYp+WvkOWmueWqmumXqOmXt+S7rOiQjOiSmeaqrOebn+mUsOeMm+aipuWtn+ecr+mGmumdoeeznOi/t+iwnOW8peexs+enmOinheazjOicnOWvhuW5guajieecoOe7teWGleWFjeWLieWoqee8hemdouiLl+aPj+eehOiXkOenkua4uuW6meWmmeiUkeeBreawkeaKv+eav+aVj+aCr+mXveaYjuien+m4o+mTreWQjeWRveiwrOaRuFwiXG5cdF0sXG5cdFtcblx0XHRcImM0NDBcIixcblx0XHRcIuiFgFwiLFxuXHRcdDUsXG5cdFx0XCLohYfohYnohY3ohY7ohY/ohZLohZbohZfohZjohZtcIixcblx0XHQ0LFxuXHRcdFwi6IWh6IWi6IWj6IWk6IWm6IWo6IWq6IWr6IWs6IWv6IWy6IWz6IW16IW26IW36IW46IaB6IaDXCIsXG5cdFx0NCxcblx0XHRcIuiGieiGi+iGjOiGjeiGjuiGkOiGklwiLFxuXHRcdDUsXG5cdFx0XCLohpnohprohp5cIixcblx0XHQ0LFxuXHRcdFwi6Iak6IalXCJcblx0XSxcblx0W1xuXHRcdFwiYzQ4MFwiLFxuXHRcdFwi6Ian6Iap6IarXCIsXG5cdFx0Nyxcblx0XHRcIuiGtFwiLFxuXHRcdDUsXG5cdFx0XCLohrzohr3ohr7ohr/oh4Toh4Xoh4foh4joh4noh4voh41cIixcblx0XHQ2LFxuXHRcdFwi5pG56JiR5qih6Iac56Oo5pGp6a2U5oq55pyr6I6r5aKo6buY5rKr5ryg5a+e6ZmM6LCL54mf5p+Q5ouH54mh5Lqp5aeG5q+N5aKT5pqu5bmV5Yuf5oWV5pyo55uu552m54mn56mG5ou/5ZOq5ZGQ6ZKg6YKj5aic57qz5rCW5LmD5aW26ICQ5aWI5Y2X55S36Zq+5ZuK5oyg6ISR5oG86Ze55reW5ZGi6aaB5YaF5aup6IO95aau6ZyT5YCq5rOl5bC85ouf5L2g5Yy/6IW76YCG5rq66JSr5ouI5bm056K+5pK15o275b+15aiY6YW/6bif5bC/5o2P6IGC5a295ZWu6ZWK6ZWN5raF5oKo5p+g54ue5Yed5a6BXCJcblx0XSxcblx0W1xuXHRcdFwiYzU0MFwiLFxuXHRcdFwi6IeUXCIsXG5cdFx0MTQsXG5cdFx0XCLoh6Toh6Xoh6boh6joh6noh6voh65cIixcblx0XHQ0LFxuXHRcdFwi6Ie1XCIsXG5cdFx0NSxcblx0XHRcIuiHveiHv+iIg+iIh1wiLFxuXHRcdDQsXG5cdFx0XCLoiI7oiI/oiJHoiJPoiJVcIixcblx0XHQ1LFxuXHRcdFwi6Iid6Iig6Iik6Iil6Iim6Iin6Iip6Iiu6Iiy6Ii66Ii86Ii96Ii/XCJcblx0XSxcblx0W1xuXHRcdFwiYzU4MFwiLFxuXHRcdFwi6ImA6ImB6ImC6ImD6ImF6ImG6ImI6ImK6ImM6ImN6ImO6ImQXCIsXG5cdFx0Nyxcblx0XHRcIuiJmeiJm+iJnOiJneiJnuiJoFwiLFxuXHRcdDcsXG5cdFx0XCLoianmi6fms57niZvmia3pkq7nur3ohJPmtZPlhpzlvITlpbTliqrmgJLlpbPmmpbomZDnlp/mjKrmh6bns6/or7rlk6bmrKfpuKXmrrTol5XlkZXlgbbmsqTllarotrTniKzluJXmgJXnkLbmi43mjpLniYzlvpjmuYPmtL7mlIDmvZjnm5jno5Dnm7znlZTliKTlj5vkuZPlup7ml4HogKrog5bmipvlkobliKjngq7ooo3ot5Hms6Hlkbjog5rln7noo7TotZTpmarphY3kvanmspvllrfnm4bnoLDmiqjng7nmvo7lva3ok6zmo5rnobznr7fohqjmnIvpuY/mjafnorDlna/noJLpnLnmibnmiqvliojnkLXmr5dcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNjQwXCIsXG5cdFx0XCLoiaroiavoiazoia3oibHoibXoibboibfoibjoibvoibzoioDoioHoioPoioXoioboiofoionoiozoipDoipPoipToipXoipboiproipvoip7oiqDoiqLoiqPoiqfoirLoirXoirboirroirvoirzoir/oi4Doi4Loi4Poi4Xoi4boi4noi5Doi5boi5noi5roi53oi6Loi6foi6joi6noi6roi6zoi63oi67oi7Doi7Loi7Poi7Xoi7boi7hcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNjgwXCIsXG5cdFx0XCLoi7roi7xcIixcblx0XHQ0LFxuXHRcdFwi6IyK6IyL6IyN6IyQ6IyS6IyT6IyW6IyY6IyZ6IydXCIsXG5cdFx0OSxcblx0XHRcIuiMqeiMquiMruiMsOiMsuiMt+iMu+iMveWVpOiEvueWsuearuWMueeXnuWDu+WxgeitrOevh+WBj+eJh+mql+mjmOa8gueTouelqOaSh+eepeaLvOmikei0q+WTgeiBmOS5kuWdquiLueiQjeW5s+WHreeTtuivhOWxj+WdoeazvOmih+WphuegtOmthOi/q+eyleWJluaJkemTuuS7huiOhuiRoeiPqeiSsuWflOactOWcg+aZrua1puiwseabneeAkeacn+asuuagluaImuWmu+S4g+WHhOa8huafkuayj+WFtuaji+Wlh+atp+eVpuW0juiEkOm9kOaXl+eliOelgemqkei1t+WyguS5nuS8geWQr+WlkeegjOWZqOawlOi/hOW8g+axveazo+iuq+aOkFwiXG5cdF0sXG5cdFtcblx0XHRcImM3NDBcIixcblx0XHRcIuiMvuiMv+iNgeiNguiNhOiNheiNiOiNilwiLFxuXHRcdDQsXG5cdFx0XCLojZPojZVcIixcblx0XHQ0LFxuXHRcdFwi6I2d6I2i6I2wXCIsXG5cdFx0Nixcblx0XHRcIuiNueiNuuiNvlwiLFxuXHRcdDYsXG5cdFx0XCLojofojojojorojovojozojo3ojo/ojpDojpHojpTojpXojpbojpfojpnojprojp3ojp/ojqFcIixcblx0XHQ2LFxuXHRcdFwi6I6s6I6t6I6uXCJcblx0XSxcblx0W1xuXHRcdFwiYzc4MFwiLFxuXHRcdFwi6I6v6I616I676I6+6I6/6I+C6I+D6I+E6I+G6I+I6I+J6I+L6I+N6I+O6I+Q6I+R6I+S6I+T6I+V6I+X6I+Z6I+a6I+b6I+e6I+i6I+j6I+k6I+m6I+n6I+o6I+r6I+s6I+t5oGw5rS954m15omm6ZKO6ZOF5Y2D6L+B562+5Luf6LCm5Lm+6buU6ZKx6ZKz5YmN5r2c6YGj5rWF6LC05aCR5bWM5qyg5q2J5p6q5ZGb6IWU576M5aKZ6JS35by65oqi5qmH6ZS55pWy5oKE5qGl556n5LmU5L6o5ben6Z6Y5pKs57+Y5bOt5L+P56qN5YiH6IyE5LiU5oCv56qD6ZKm5L615Lqy56em55C05Yuk6Iq55pOS56a95a+d5rKB6Z2S6L275rCi5YC+5Y2/5riF5pOO5pm05rCw5oOF6aG36K+35bqG55C856m356eL5LiY6YKx55CD5rGC5Zua6YWL5rOF6LaL5Yy66JuG5puy6Lqv5bGI6amx5rigXCJcblx0XSxcblx0W1xuXHRcdFwiYzg0MFwiLFxuXHRcdFwi6I+u6I+v6I+zXCIsXG5cdFx0NCxcblx0XHRcIuiPuuiPu+iPvOiPvuiPv+iQgOiQguiQheiQh+iQiOiQieiQiuiQkOiQklwiLFxuXHRcdDUsXG5cdFx0XCLokJnokJrokJvokJ5cIixcblx0XHQ1LFxuXHRcdFwi6JCpXCIsXG5cdFx0Nyxcblx0XHRcIuiQslwiLFxuXHRcdDUsXG5cdFx0XCLokLnokLrokLvokL5cIixcblx0XHQ3LFxuXHRcdFwi6JGH6JGI6JGJXCJcblx0XSxcblx0W1xuXHRcdFwiYzg4MFwiLFxuXHRcdFwi6JGKXCIsXG5cdFx0Nixcblx0XHRcIuiRklwiLFxuXHRcdDQsXG5cdFx0XCLokZjokZ3okZ7okZ/okaDokaLokaRcIixcblx0XHQ0LFxuXHRcdFwi6JGq6JGu6JGv6JGw6JGy6JG06JG36JG56JG76JG85Y+W5ai26b6L6Laj5Y675ZyI6aKn5p2D6Yab5rOJ5YWo55eK5ouz54qs5Yi45Yqd57y654KU55i45Y206bmK5qa356Gu6ZuA6KOZ576k54S254eD5YaJ5p+T55Ok5aOk5pSY5Zq36K6p6aW25omw57uV5oO554Ot5aOs5LuB5Lq65b+N6Z+n5Lu76K6k5YiD5aaK57qr5omU5LuN5pel5oiO6Iy46JOJ6I2j6J6N54aU5rq25a6557uS5YaX5o+J5p+U6IKJ6Iy56KCV5YSS5a265aaC6L6x5Lmz5rGd5YWl6KSl6L2v6Ziu6JWK55Ge6ZSQ6Zew5ram6Iul5byx5pKS5rSS6JCo6IWu6bOD5aGe6LWb5LiJ5Y+BXCJcblx0XSxcblx0W1xuXHRcdFwiYzk0MFwiLFxuXHRcdFwi6JG9XCIsXG5cdFx0NCxcblx0XHRcIuiSg+iShOiSheiShuiSiuiSjeiSj1wiLFxuXHRcdDcsXG5cdFx0XCLokpjokprokpvokp3okp7okp/okqDokqJcIixcblx0XHQxMixcblx0XHRcIuiSsOiSseiSs+iSteiStuiSt+iSu+iSvOiSvuiTgOiTguiTg+iTheiThuiTh+iTiOiTi+iTjOiTjuiTj+iTkuiTlOiTleiTl1wiXG5cdF0sXG5cdFtcblx0XHRcImM5ODBcIixcblx0XHRcIuiTmFwiLFxuXHRcdDQsXG5cdFx0XCLok57ok6Hok6Lok6Tok6dcIixcblx0XHQ0LFxuXHRcdFwi6JOt6JOu6JOv6JOxXCIsXG5cdFx0MTAsXG5cdFx0XCLok73ok77olIDolIHolILkvJ7mlaPmoZHll5PkuKfmkJTpqprmiavlq4LnkZ/oibLmtqnmo67lg6fojo7noILmnYDliLnmspnnurHlgrvllaXnhZ7nrZvmmZLnj4roi6vmnYnlsbHliKDnhb3ooavpl6rpmZXmk4XotaHohrPlloTmsZXmiYfnvK7lopLkvKTllYbotY/mmYzkuIrlsJroo7PmoqLmjY7nqI3ng6foio3li7rpn7blsJHlk6jpgrXnu43lpaLotYrom4foiIzoiI3otabmkYTlsITmhZHmtonnpL7orr7noLfnlLPlkbvkvLjouqvmt7HlqKDnu4XnpZ7msojlrqHlqbbnlJrogr7mhY7muJflo7DnlJ/nlKXnibLljYfnu7NcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYTQwXCIsXG5cdFx0XCLolINcIixcblx0XHQ4LFxuXHRcdFwi6JSN6JSO6JSP6JSQ6JSS6JSU6JSV6JSW6JSY6JSZ6JSb6JSc6JSd6JSe6JSg6JSiXCIsXG5cdFx0OCxcblx0XHRcIuiUrVwiLFxuXHRcdDksXG5cdFx0XCLolL5cIixcblx0XHQ0LFxuXHRcdFwi6JWE6JWF6JWG6JWH6JWLXCIsXG5cdFx0MTBcblx0XSxcblx0W1xuXHRcdFwiY2E4MFwiLFxuXHRcdFwi6JWX6JWY6JWa6JWb6JWc6JWd6JWfXCIsXG5cdFx0NCxcblx0XHRcIuiVpeiVpuiVp+iVqVwiLFxuXHRcdDgsXG5cdFx0XCLolbPolbXolbbolbfolbjolbzolb3olb/oloDoloHnnIHnm5vlianog5zlnKPluIjlpLHni67mlr3mub/or5flsLjombHljYHnn7Pmi77ml7bku4Dpo5/omoDlrp7or4blj7Lnn6Lkvb/lsY7pqbblp4vlvI/npLrlo6vkuJbmn7/kuovmi63oqpPpgJ3lir/mmK/ll5zlmazpgILku5Xkvo3ph4rppbDmsI/luILmgYPlrqTop4bor5XmlLbmiYvpppblrojlr7/mjojllK7lj5fnmKblhb3olKzmnqLmorPmrormipLovpPlj5ToiJLmt5Hnlo/kuabotY7lrbDnhp/olq/mmpHmm5nnvbLonIDpu43pvKDlsZ7mnK/ov7DmoJHmnZ/miI3nq5blooXlurbmlbDmvLFcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYjQwXCIsXG5cdFx0XCLoloLoloPolobolohcIixcblx0XHQ2LFxuXHRcdFwi6JaQXCIsXG5cdFx0MTAsXG5cdFx0XCLolp1cIixcblx0XHQ2LFxuXHRcdFwi6Jal6Jam6Jan6Jap6Jar6Jas6Jat6JaxXCIsXG5cdFx0NSxcblx0XHRcIuiWuOiWulwiLFxuXHRcdDYsXG5cdFx0XCLol4JcIixcblx0XHQ2LFxuXHRcdFwi6JeKXCIsXG5cdFx0NCxcblx0XHRcIuiXkeiXklwiXG5cdF0sXG5cdFtcblx0XHRcImNiODBcIixcblx0XHRcIuiXlOiXllwiLFxuXHRcdDUsXG5cdFx0XCLol51cIixcblx0XHQ2LFxuXHRcdFwi6Jel6Jem6Jen6Jeo6JeqXCIsXG5cdFx0MTQsXG5cdFx0XCLmgZXliLfogI3mkZToobDnlKnluIXmoJPmi7TpnJzlj4zniL3osIHmsLTnnaHnqI7lkK7nnqzpobroiJzor7TnoZXmnJTng4Hmlq/mkpXlmLbmgJ3np4Hlj7jkuJ3mrbvogoblr7rll6Plm5vkvLrkvLzppbLlt7Pmnb7ogLjmgILpooLpgIHlrovorrzor7XmkJzoiZjmk57ll73oi4/phaXkv5fntKDpgJ/nsp/lg7PloZHmuq/lrr/or4nogoPphbjokpznrpfomb3pmovpmo/nu6Xpq5Pnoo7lsoHnqZfpgYLpmqfnpZ/lrZnmjZ/nrIvok5Hmoq3llIbnvKnnkJDntKLplIHmiYDloYzku5blroPlpbnloZRcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYzQwXCIsXG5cdFx0XCLol7nol7rol7zol73ol77omIBcIixcblx0XHQ0LFxuXHRcdFwi6JiGXCIsXG5cdFx0MTAsXG5cdFx0XCLomJLomJPomJTomJXomJdcIixcblx0XHQxNSxcblx0XHRcIuiYqOiYqlwiLFxuXHRcdDEzLFxuXHRcdFwi6Ji56Ji66Ji76Ji96Ji+6Ji/6JmAXCJcblx0XSxcblx0W1xuXHRcdFwiY2M4MFwiLFxuXHRcdFwi6JmBXCIsXG5cdFx0MTEsXG5cdFx0XCLomZLomZPomZVcIixcblx0XHQ0LFxuXHRcdFwi6Jmb6Jmc6Jmd6Jmf6Jmg6Jmh6JmjXCIsXG5cdFx0Nyxcblx0XHRcIueNreaMnui5i+i4j+iDjuiLlOaKrOWPsOazsOmFnuWkquaAgeaxsOWdjeaRiui0queYq+a7qeWdm+aqgOeXsOa9reiwreiwiOWdpuavr+iikueis+aOouWPueeCreaxpOWhmOaQquWgguajoOiGm+WUkOezluWAmOi6uua3jOi2n+eDq+aOj+a2m+a7lOe7puiQhOahg+mAg+a3mOmZtuiuqOWll+eJueiXpOiFvueWvOiqiuair+WJlOi4oumUkeaPkOmimOi5hOWVvOS9k+abv+Waj+aDlea2leWJg+WxieWkqea3u+Whq+eUsOeUnOaBrOiIlOiFhuaMkeadoei/ouecuui3s+i0tOmTgeW4luWOheWQrOeDg1wiXG5cdF0sXG5cdFtcblx0XHRcImNkNDBcIixcblx0XHRcIuiZreiZr+iZsOiZslwiLFxuXHRcdDYsXG5cdFx0XCLomoNcIixcblx0XHQ2LFxuXHRcdFwi6JqOXCIsXG5cdFx0NCxcblx0XHRcIuialOiallwiLFxuXHRcdDUsXG5cdFx0XCLomp5cIixcblx0XHQ0LFxuXHRcdFwi6Jql6Jqm6Jqr6Jqt6Jqu6Jqy6Jqz6Jq36Jq46Jq56Jq7XCIsXG5cdFx0NCxcblx0XHRcIuibgeibguibg+ibheibiOibjOibjeibkuibk+ibleibluibl+ibmuibnFwiXG5cdF0sXG5cdFtcblx0XHRcImNkODBcIixcblx0XHRcIuibneiboOiboeibouibo+ibpeibpuibp+ibqOibquibq+ibrOibr+ibteibtuibt+ibuuibu+ibvOibveibv+icgeichOicheichuici+icjOicjuicj+ickOickeiclOicluaxgOW7t+WBnOS6reW6reaMuuiJh+mAmuahkOmFruees+WQjOmTnOW9pOerpeahtuaNheetkue7n+eXm+WBt+aKleWktOmAj+WHuOeng+eqgeWbvuW+kumAlOa2guWxoOWcn+WQkOWFlOa5jeWbouaOqOmik+iFv+icleikqumAgOWQnuWxr+iHgOaLluaJmOiEsem4temZgOmprumpvOakreWmpeaLk+WUvuaMluWTh+ibmea0vOWog+eTpuiinOatquWkluixjOW8r+a5vueOqemhveS4uOeDt+WujOeil+aMveaZmuealuaDi+Wum+WpieS4h+iFleaxqueOi+S6oeaeiee9keW+gOaXuuacm+W/mOWmhOWogVwiXG5cdF0sXG5cdFtcblx0XHRcImNlNDBcIixcblx0XHRcIuicmeicm+icneicn+icoOicpOicpuicp+icqOicquicq+icrOicreicr+icsOicsuics+icteictuicuOicueicuuicvOicveidgFwiLFxuXHRcdDYsXG5cdFx0XCLonYronYvonY3onY/onZDonZHonZLonZTonZXonZbonZjonZpcIixcblx0XHQ1LFxuXHRcdFwi6J2h6J2i6J2mXCIsXG5cdFx0Nyxcblx0XHRcIuidr+idseidsuids+idtVwiXG5cdF0sXG5cdFtcblx0XHRcImNlODBcIixcblx0XHRcIuidt+iduOidueiduuidv+iegOiegeiehOiehuieh+ieieieiuiejOiejlwiLFxuXHRcdDQsXG5cdFx0XCLonpTonpXonpbonphcIixcblx0XHQ2LFxuXHRcdFwi6J6gXCIsXG5cdFx0NCxcblx0XHRcIuW3jeW+ruWNsemfpui/neahheWbtOWUr+aDn+S4uua9jee7tOiLh+iQjuWnlOS8n+S8quWwvue6rOacquiUmuWRs+eVj+iDg+WWgumtj+S9jea4reiwk+WwieaFsOWNq+eYn+a4qeiaiuaWh+mXu+e6ueWQu+eos+e0iumXruWXoee/geeTruaMneicl+a2oeeqneaIkeaWoeWNp+aPoeayg+W3q+WRnOmSqOS5jOaxoeivrOWxi+aXoOiKnOaip+WQvuWQtOavi+atpuS6lOaNguWNiOiInuS8jeS+ruWdnuaIiumbvuaZpOeJqeWLv+WKoeaCn+ivr+aYlOeGmeaekOilv+ehkuefveaZsOWYu+WQuOmUoeeJulwiXG5cdF0sXG5cdFtcblx0XHRcImNmNDBcIixcblx0XHRcIuiepeiepuiep+ieqeiequieruiesOieseiesuietOietuiet+ieuOieueieu+ievOievuiev+ifgVwiLFxuXHRcdDQsXG5cdFx0XCLon4fon4jon4non4xcIixcblx0XHQ0LFxuXHRcdFwi6J+UXCIsXG5cdFx0Nixcblx0XHRcIuifnOifneifnuifn+ifoeifouifo+ifpOifpuifp+ifqOifqeifq+ifrOifreifr1wiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiY2Y4MFwiLFxuXHRcdFwi6J+66J+76J+86J+96J+/6KCA6KCB6KCC6KCEXCIsXG5cdFx0NSxcblx0XHRcIuigi1wiLFxuXHRcdDcsXG5cdFx0XCLooJTooJfooJjooJnooJrooJxcIixcblx0XHQ0LFxuXHRcdFwi6KCj56iA5oGv5biM5oKJ6Iad5aSV5oOc54aE54Ov5rqq5rGQ54qA5qqE6KKt5bit5Lmg5aqz5Zac6ZOj5rSX57O76ZqZ5oiP57uG556O6Jm+5Yyj6Zye6L6W5pqH5bOh5L6g54ut5LiL5Y6m5aSP5ZCT5o6A6ZSo5YWI5LuZ6bKc57qk5ZK46LSk6KGU6Ii36Zey5raO5bym5auM5pi+6Zmp546w54yu5Y6/6IW66aaF576h5a6q6Zm36ZmQ57q/55u45Y6i6ZW26aaZ566x6KWE5rmY5Lmh57+U56Wl6K+m5oOz5ZON5Lqr6aG55be35qmh5YOP5ZCR6LGh6JCn56Gd6ZyE5YmK5ZOu5Zqj6ZSA5raI5a615reG5pmTXCJcblx0XSxcblx0W1xuXHRcdFwiZDA0MFwiLFxuXHRcdFwi6KCkXCIsXG5cdFx0MTMsXG5cdFx0XCLooLNcIixcblx0XHQ1LFxuXHRcdFwi6KC66KC76KC96KC+6KC/6KGB6KGC6KGD6KGGXCIsXG5cdFx0NSxcblx0XHRcIuihjlwiLFxuXHRcdDUsXG5cdFx0XCLooZXooZbooZjooZpcIixcblx0XHQ2LFxuXHRcdFwi6KGm6KGn6KGq6KGt6KGv6KGx6KGz6KG06KG16KG26KG46KG56KG6XCJcblx0XSxcblx0W1xuXHRcdFwiZDA4MFwiLFxuXHRcdFwi6KG76KG86KKA6KKD6KKG6KKH6KKJ6KKK6KKM6KKO6KKP6KKQ6KKR6KKT6KKU6KKV6KKXXCIsXG5cdFx0NCxcblx0XHRcIuiinVwiLFxuXHRcdDQsXG5cdFx0XCLooqPooqVcIixcblx0XHQ1LFxuXHRcdFwi5bCP5a2d5qCh6IKW5ZW456yR5pWI5qWU5Lqb5q2H6J2O6Z6L5Y2P5oyf5pC66YKq5pac6IOB6LCQ5YaZ5qKw5Y246J+55oeI5rOE5rO76LCi5bGR6Jaq6Iqv6ZSM5qyj6L6b5paw5b+75b+D5L+h6KGF5pif6IWl54yp5oO65YW05YiR5Z6L5b2i6YKi6KGM6YaS5bm45p2P5oCn5aeT5YWE5Ye26IO45YyI5rG56ZuE54aK5LyR5L+u576e5py95ZeF6ZSI56eA6KKW57uj5aKf5oiM6ZyA6Jma5ZiY6aG75b6Q6K646JOE6YWX5Y+Z5pet5bqP55Wc5oGk57Wu5am/57uq57ut6L2p5Zan5a6j5oKs5peL546EXCJcblx0XSxcblx0W1xuXHRcdFwiZDE0MFwiLFxuXHRcdFwi6KKs6KKu6KKv6KKw6KKyXCIsXG5cdFx0NCxcblx0XHRcIuiiuOiiueiiuuiiu+iiveiivuiiv+ijgOijg+ijhOijh+ijiOijiuiji+ijjOijjeijj+ijkOijkeijk+ijluijl+ijmlwiLFxuXHRcdDQsXG5cdFx0XCLoo6Doo6Hoo6boo6foo6lcIixcblx0XHQ2LFxuXHRcdFwi6KOy6KO16KO26KO36KO66KO76KO96KO/6KSA6KSB6KSDXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCJkMTgwXCIsXG5cdFx0XCLopInopItcIixcblx0XHQ0LFxuXHRcdFwi6KSR6KSUXCIsXG5cdFx0NCxcblx0XHRcIuiknFwiLFxuXHRcdDQsXG5cdFx0XCLopKLopKPopKTopKbopKfopKjopKnopKzopK3opK7opK/opLHopLLopLPopLXopLfpgInnmaPnnKnnu5rpnbTolpvlrabnqbTpm6rooYDli4vnho/lvqrml6zor6Llr7vpqa/lt6HmronmsZvorq3orq/pgIrov4XljovmirzpuKbpuK3lkYDkuKvoir3niZnompzltJbooZnmtq/pm4Xlk5HkuprorrbnhInlkr3pmInng5/mt7nnm5DkuKXnoJTonJLlsqnlu7boqIDpopzpmI7ngo7msr/lpYTmjqnnnLzooY3mvJToibPloLDnh5XljoznoJrpm4HllIHlvabnhLDlrrTosJrpqozmroPlpK7puK/np6fmnajmiazkva/nlqHnvormtIvpmLPmsKfku7Dnl5LlhbvmoLfmvL7pgoDohbDlppbnkbZcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMjQwXCIsXG5cdFx0XCLopLhcIixcblx0XHQ4LFxuXHRcdFwi6KWC6KWD6KWFXCIsXG5cdFx0MjQsXG5cdFx0XCLopaBcIixcblx0XHQ1LFxuXHRcdFwi6KWnXCIsXG5cdFx0MTksXG5cdFx0XCLopbxcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMjgwXCIsXG5cdFx0XCLopb3opb7opoDopoLopoTopoXopodcIixcblx0XHQyNixcblx0XHRcIuaRh+Wwp+mBpeeqkeiwo+WnmuWSrOiIgOiNr+imgeiAgOaksOWZjuiAtueIt+mHjuWGtuS5n+mhteaOluS4muWPtuabs+iFi+WknOa2suS4gOWjueWMu+aPlumTseS+neS8iuiho+mikOWkt+mBl+enu+S7quiDsOeWkeayguWunOWnqOW9neakheiageWAmuW3suS5meefo+S7peiJuuaKkeaYk+mCkeWxueS6v+W9ueiHhumAuOiChOeWq+S6puijlOaEj+avheW/huS5ieebiua6ouivo+iuruiwiuivkeW8gue/vOe/jOe7juiMteiNq+WboOaut+mfs+mYtOWnu+WQn+mTtua3q+WvhemlruWwueW8lemakFwiXG5cdF0sXG5cdFtcblx0XHRcImQzNDBcIixcblx0XHRcIuimolwiLFxuXHRcdDMwLFxuXHRcdFwi6KeD6KeN6KeT6KeU6KeV6KeX6KeY6KeZ6Keb6Ked6Kef6Keg6Keh6Kei6Kek6Ken6Keo6Kep6Keq6Kes6Ket6Keu6Kew6Kex6Key6Ke0XCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJkMzgwXCIsXG5cdFx0XCLop7tcIixcblx0XHQ0LFxuXHRcdFwi6KiBXCIsXG5cdFx0NSxcblx0XHRcIuioiFwiLFxuXHRcdDIxLFxuXHRcdFwi5Y2w6Iux5qix5am06bmw5bqU57yo6I656JCk6JCl6I2n6J2H6L+O6LWi55uI5b2x6aKW56Gs5pig5ZOf5oul5L2j6IeD55eI5bq46ZuN6LiK6Ju55ZKP5rOz5raM5rC45oG/5YuH55So5bm95LyY5oKg5b+n5bCk55Sx6YKu6ZOA54q55rK55ri46YWJ5pyJ5Y+L5Y+z5L2R6YeJ6K+x5Y+I5bm86L+C5rek5LqO55uC5qaG6Jme5oSa6IiG5L2Z5L+e6YC+6bG85oSJ5rid5riU6ZqF5LqI5aix6Zuo5LiO5bG/56a55a6H6K+t5769546J5Z+f6IqL6YOB5ZCB6YGH5Za75bOq5b6h5oSI5qyy54ux6IKy6KqJXCJcblx0XSxcblx0W1xuXHRcdFwiZDQ0MFwiLFxuXHRcdFwi6KieXCIsXG5cdFx0MzEsXG5cdFx0XCLoqL9cIixcblx0XHQ4LFxuXHRcdFwi6KmJXCIsXG5cdFx0MjFcblx0XSxcblx0W1xuXHRcdFwiZDQ4MFwiLFxuXHRcdFwi6KmfXCIsXG5cdFx0MjUsXG5cdFx0XCLoqbpcIixcblx0XHQ2LFxuXHRcdFwi5rW05a+T6KOV6aKE6LGr6amt6biz5riK5Yak5YWD5Z6j6KKB5Y6f5o+06L6V5Zut5ZGY5ZyG54y/5rqQ57yY6L+c6IuR5oS/5oCo6Zmi5puw57qm6LaK6LeD6ZKl5bKz57Kk5pyI5oKm6ZiF6ICY5LqR6YOn5YyA6Zmo5YWB6L+Q6JW06YWd5pmV6Z+15a2V5Yyd56C45p2C5qC95ZOJ54G+5a6w6L295YaN5Zyo5ZKx5pSS5pqC6LWe6LWD6ISP6JGs6YGt57Of5Ye/6Je75p6j5pep5r6h6Jqk6LqB5Zmq6YCg55qC54G254el6LSj5oup5YiZ5rO96LS85oCO5aKe5oaO5pu+6LWg5omO5Zaz5rij5pyt6L2nXCJcblx0XSxcblx0W1xuXHRcdFwiZDU0MFwiLFxuXHRcdFwi6KqBXCIsXG5cdFx0Nyxcblx0XHRcIuiqi1wiLFxuXHRcdDcsXG5cdFx0XCLoqpRcIixcblx0XHQ0NlxuXHRdLFxuXHRbXG5cdFx0XCJkNTgwXCIsXG5cdFx0XCLoq4NcIixcblx0XHQzMixcblx0XHRcIumToemXuOecqOagheamqOWSi+S5jeeCuOiviOaRmOaWi+WuheeqhOWAuuWvqOeeu+avoeipueeymOayvuebj+aWqei+l+W0reWxleiYuOagiOWNoOaImOermea5m+e7veaon+eroOW9sOa8s+W8oOaOjOa2qOadluS4iOW4kOi0puS7l+iDgOeYtOmanOaLm+aYreaJvuayvOi1teeFp+e9qeWFhuiCh+WPrOmBruaKmOWTsuibsOi+meiAhemUl+iUl+i/mea1meePjeaWn+ecn+eUhOegp+iHu+i0numSiOS+puaeleeWueiviumch+aMr+mVh+mYteiSuOaMo+edgeW+geeLsOS6ieaAlOaVtOaLr+ato+aUv1wiXG5cdF0sXG5cdFtcblx0XHRcImQ2NDBcIixcblx0XHRcIuirpFwiLFxuXHRcdDM0LFxuXHRcdFwi6KyIXCIsXG5cdFx0Mjdcblx0XSxcblx0W1xuXHRcdFwiZDY4MFwiLFxuXHRcdFwi6Kyk6Kyl6KynXCIsXG5cdFx0MzAsXG5cdFx0XCLluKfnl4fpg5Hor4Hoip3mnp3mlK/lkLHonJjnn6XogqLohILmsYHkuYvnu4fogYznm7TmpI3mrpbmiaflgLzkvoTlnYDmjIfmraLotr7lj6rml6jnurjlv5fmjJrmjrfoh7Poh7Tnva7luJzls5nliLbmmbrnp6nnqJrotKjngpnnl5Tmu57msrvnqpLkuK3nm4Xlv6Dpkp/oobfnu4jnp43ogr/ph43ku7LkvJfoiJ/lkajlt57mtLLor4znsqXovbTogpjluJrlkpLnmrHlrpnmmLzpqqTnj6DmoKrom5vmnLHnjKror7jor5vpgJDnq7nng5vnha7mi4TnnqnlmLHkuLvokZfmn7Hliqnom4DotK7pk7jnrZFcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNzQwXCIsXG5cdFx0XCLorYZcIixcblx0XHQzMSxcblx0XHRcIuitp1wiLFxuXHRcdDQsXG5cdFx0XCLora1cIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCJkNzgwXCIsXG5cdFx0XCLorodcIixcblx0XHQyNCxcblx0XHRcIuiurOiuseiuu+ivh+ivkOivquiwieiwnuS9j+azqOelnempu+aKk+eIquaLveS4k+eglui9rOaSsOi1muevhuahqeW6hOijheWmhuaSnuWjrueKtuakjumUpei/vei1mOWdoOe8gOiwhuWHhuaNieaLmeWNk+ahjOeQouiMgemFjOWVhOedgOeBvOa1iuWFueWSqOi1hOWnv+a7i+a3hOWtnOe0q+S7lOexvea7k+WtkOiHqua4jeWtl+msg+ajlei4quWul+e7vOaAu+e6temCuei1sOWlj+aPjeenn+i2s+WNkuaXj+elluivhemYu+e7hOmSu+e6guWYtOmGieacgOe9quWwiumBteaYqOW3puS9kOafnuWBmuS9nOWdkOW6p1wiXG5cdF0sXG5cdFtcblx0XHRcImQ4NDBcIixcblx0XHRcIuiwuFwiLFxuXHRcdDgsXG5cdFx0XCLosYLosYPosYTosYXosYjosYrosYvosY1cIixcblx0XHQ3LFxuXHRcdFwi6LGW6LGX6LGY6LGZ6LGbXCIsXG5cdFx0NSxcblx0XHRcIuixo1wiLFxuXHRcdDYsXG5cdFx0XCLosaxcIixcblx0XHQ2LFxuXHRcdFwi6LG06LG16LG26LG36LG7XCIsXG5cdFx0Nixcblx0XHRcIuiyg+iyhOiyhuiyh1wiXG5cdF0sXG5cdFtcblx0XHRcImQ4ODBcIixcblx0XHRcIuiyiOiyi+iyjVwiLFxuXHRcdDYsXG5cdFx0XCLospXospbospfosplcIixcblx0XHQyMCxcblx0XHRcIuS6jeS4jOWFgOS4kOW7v+WNheS4leS6mOS4numssuWtrOWZqeS4qOemuuS4v+WMleS5h+WkreeIu+WNruawkOWbn+iDpOmml+avk+edvum8l+S4tuS6n+m8kOS5nOS5qeS6k+iKiOWtm+WVrOWYj+S7hOWOjeWOneWOo+WOpeWOrumdpei1neWMmuWPteWMpuWMruWMvui1nOWNpuWNo+WIguWIiOWIjuWIreWIs+WIv+WJgOWJjOWJnuWJoeWJnOiSr+WJveWKguWKgeWKkOWKk+WGgue9lOS6u+S7g+S7ieS7guS7qOS7oeS7q+S7nuS8m+S7s+S8ouS9pOS7teS8peS8p+S8ieS8q+S9nuS9p+aUuOS9muS9nVwiXG5cdF0sXG5cdFtcblx0XHRcImQ5NDBcIixcblx0XHRcIuiyrlwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImQ5ODBcIixcblx0XHRcIuizrVwiLFxuXHRcdDMyLFxuXHRcdFwi5L2f5L2X5Lyy5Ly95L225L205L6R5L6J5L6D5L6P5L2+5L275L6q5L285L6s5L6U5L+m5L+o5L+q5L+F5L+a5L+j5L+c5L+R5L+f5L+45YCp5YGM5L+z5YCs5YCP5YCu5YCt5L++5YCc5YCM5YCl5YCo5YG+5YGD5YGV5YGI5YGO5YGs5YG75YKl5YKn5YKp5YK65YOW5YSG5YOt5YOs5YOm5YOu5YSH5YSL5Lud5rC95L2Y5L2l5L+O6b6g5rGG57G05YWu5be96buJ6aaY5YaB5aSU5Yu55YyN6KiH5YyQ5Yer5aSZ5YWV5Lqg5YWW5Lqz6KGu6KKk5Lq16ISU6KOS56aA5ay06KCD57645Yar5Yax5Ya95Ya8XCJcblx0XSxcblx0W1xuXHRcdFwiZGE0MFwiLFxuXHRcdFwi6LSOXCIsXG5cdFx0MTQsXG5cdFx0XCLotKDotZHotZLotZfotZ/otaXotajotanotarotazota7ota/otbHotbLotbhcIixcblx0XHQ4LFxuXHRcdFwi6LaC6LaD6LaG6LaH6LaI6LaJ6LaMXCIsXG5cdFx0NCxcblx0XHRcIui2kui2k+i2lVwiLFxuXHRcdDksXG5cdFx0XCLotqDotqFcIlxuXHRdLFxuXHRbXG5cdFx0XCJkYTgwXCIsXG5cdFx0XCLotqLotqRcIixcblx0XHQxMixcblx0XHRcIui2sui2tui2t+i2uei2u+i2vei3gOi3gei3gui3hei3h+i3iOi3iei3iui3jei3kOi3kui3k+i3lOWHh+WGluWGouWGpeiuoOiupuiup+iuquiutOiuteiut+ivguivg+ivi+ivj+ivjuivkuivk+ivlOivluivmOivmeivnOivn+ivoOivpOivqOivqeivruivsOivs+ivtuivueivvOivv+iwgOiwguiwhOiwh+iwjOiwj+iwkeiwkuiwlOiwleiwluiwmeiwm+iwmOiwneiwn+iwoOiwoeiwpeiwp+iwquiwq+iwruiwr+iwsuiws+iwteiwtuWNqeWNuumYnemYoumYoemYsemYqumYvemYvOmZgumZiemZlOmZn+mZp+mZrOmZsumZtOmaiOmajemal+masOmCl+mCm+mCnemCmemCrOmCoemCtOmCs+mCtumCulwiXG5cdF0sXG5cdFtcblx0XHRcImRiNDBcIixcblx0XHRcIui3lei3mOi3mei3nOi3oOi3oei3oui3pei3pui3p+i3qei3rei3rui3sOi3sei3sui3tOi3tui3vOi3vlwiLFxuXHRcdDYsXG5cdFx0XCLouIbouIfouIjouIvouI3ouI7ouJDouJHouJLouJPouJVcIixcblx0XHQ3LFxuXHRcdFwi6Lig6Lih6LikXCIsXG5cdFx0NCxcblx0XHRcIui4q+i4rei4sOi4sui4s+i4tOi4tui4t+i4uOi4u+i4vOi4vlwiXG5cdF0sXG5cdFtcblx0XHRcImRiODBcIixcblx0XHRcIui4v+i5g+i5hei5hui5jFwiLFxuXHRcdDQsXG5cdFx0XCLouZNcIixcblx0XHQ1LFxuXHRcdFwi6LmaXCIsXG5cdFx0MTEsXG5cdFx0XCLouafouajouarouavoua7oubHpgrjpgrDpg4/pg4Xpgr7pg5Dpg4Tpg4fpg5Ppg6bpg6Lpg5zpg5fpg5vpg6vpg6/pg77phITphKLphJ7phKPphLHphK/phLnphYPphYbliI3lpYLliqLliqzliq3lir7lk7/li5Dli5bli7Dlj5/nh67nn43lu7Tlh7Xlh7zprK/ljrblvIHnlZrlt6/lnYzlnqnlnqHlob7lorzlo4Xlo5HlnKnlnKzlnKrlnLPlnLnlnK7lnK/lnZzlnLvlnYLlnanlnoXlnavlnoblnbzlnbvlnajlna3lnbblnbPlnq3lnqTlnozlnrLln4/lnqflnrTlnpPlnqDln5Xln5jln5rln5nln5Llnrjln7Tln6/ln7jln6Tln51cIlxuXHRdLFxuXHRbXG5cdFx0XCJkYzQwXCIsXG5cdFx0XCLoubPoubXoubdcIixcblx0XHQ0LFxuXHRcdFwi6Lm96Lm+6LqA6LqC6LqD6LqE6LqG6LqIXCIsXG5cdFx0Nixcblx0XHRcIui6kei6kui6k+i6lVwiLFxuXHRcdDYsXG5cdFx0XCLoup3oup9cIixcblx0XHQxMSxcblx0XHRcIui6rei6rui6sOi6sei6s1wiLFxuXHRcdDYsXG5cdFx0XCLourtcIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcImRjODBcIixcblx0XHRcIui7g1wiLFxuXHRcdDEwLFxuXHRcdFwi6LuPXCIsXG5cdFx0MjEsXG5cdFx0XCLloIvloI3ln73ln63loIDloJ7loJnloYTloKDloaXloazlooHloonloprlooDppqjpvJnmh7/oibnoib3oib/oio/oioroiqjoioToio7oipHoipfoipnoiqvoirjoir7oirDoi4joi4roi6Poipjoirfoiq7oi4voi4zoi4HoiqnoirToiqHoiqroip/oi4Toi47oiqToi6HojInoi7foi6TojI/ojIfoi5zoi7Toi5Loi5jojIzoi7voi5PojJHojJrojIbojJTojJXoi6Doi5XojJzojZHojZvojZzojIjojpLojLzojLTojLHojpvojZ7ojK/ojY/ojYfojYPojZ/ojYDojJfojaDojK3ojLrojLPojabojaVcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZDQwXCIsXG5cdFx0XCLou6VcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJkZDgwXCIsXG5cdFx0XCLovKRcIixcblx0XHQzMixcblx0XHRcIuiNqOiMm+iNqeiNrOiNquiNreiNruiOsOiNuOiOs+iOtOiOoOiOquiOk+iOnOiOheiNvOiOtuiOqeiNveiOuOiNu+iOmOiOnuiOqOiOuuiOvOiPgeiQgeiPpeiPmOWgh+iQmOiQi+iPneiPveiPluiQnOiQuOiQkeiQhuiPlOiPn+iQj+iQg+iPuOiPueiPquiPheiPgOiQpuiPsOiPoeiRnOiRkeiRmuiRmeiRs+iSh+iSiOiRuuiSieiRuOiQvOiRhuiRqeiRtuiSjOiSjuiQseiRreiTgeiTjeiTkOiTpuiSveiTk+iTiuiSv+iSuuiToOiSoeiSueiStOiSl+iTpeiTo+iUjOeUjeiUuOiTsOiUueiUn+iUulwiXG5cdF0sXG5cdFtcblx0XHRcImRlNDBcIixcblx0XHRcIui9hVwiLFxuXHRcdDMyLFxuXHRcdFwi6L2q6L6A6L6M6L6S6L6d6L6g6L6h6L6i6L6k6L6l6L6m6L6n6L6q6L6s6L6t6L6u6L6v6L6y6L6z6L606L616L636L646L666L676L686L6/6L+A6L+D6L+GXCJcblx0XSxcblx0W1xuXHRcdFwiZGU4MFwiLFxuXHRcdFwi6L+JXCIsXG5cdFx0NCxcblx0XHRcIui/j+i/kui/lui/l+i/mui/oOi/oei/o+i/p+i/rOi/r+i/sei/sui/tOi/tei/tui/uui/u+i/vOi/vui/v+mAh+mAiOmAjOmAjumAk+mAlemAmOiVluiUu+iTv+iTvOiVmeiViOiVqOiVpOiVnuiVuueeouiVg+iVsuiVu+iWpOiWqOiWh+iWj+iVueiWruiWnOiWheiWueiWt+iWsOiXk+iXgeiXnOiXv+iYp+iYheiYqeiYluiYvOW7vuW8iOWkvOWlgeiAt+WlleWlmuWlmOWMj+WwouWwpeWwrOWwtOaJjOaJquaKn+aKu+aLiuaLmuaLl+aLruaMouaLtuaMueaNi+aNg+aOreaPtuaNseaNuuaOjuaOtOaNreaOrOaOiuaNqeaOruaOvOaPsuaPuOaPoOaPv+aPhOaPnuaPjuaRkuaPhuaOvuaRheaRgeaQi+aQm+aQoOaQjOaQpuaQoeaRnuaShOaRreaSllwiXG5cdF0sXG5cdFtcblx0XHRcImRmNDBcIixcblx0XHRcIumAmemAnOmAo+mApOmApemAp1wiLFxuXHRcdDUsXG5cdFx0XCLpgLBcIixcblx0XHQ0LFxuXHRcdFwi6YC36YC56YC66YC96YC/6YGA6YGD6YGF6YGG6YGIXCIsXG5cdFx0NCxcblx0XHRcIumBjumBlOmBlemBlumBmemBmumBnFwiLFxuXHRcdDUsXG5cdFx0XCLpgaTpgabpgafpganpgarpgavpgazpga9cIixcblx0XHQ0LFxuXHRcdFwi6YG2XCIsXG5cdFx0Nixcblx0XHRcIumBvumCgVwiXG5cdF0sXG5cdFtcblx0XHRcImRmODBcIixcblx0XHRcIumChOmChemChumCh+mCiemCiumCjFwiLFxuXHRcdDQsXG5cdFx0XCLpgpLpgpTpgpbpgpjpgprpgpzpgp7pgp/pgqDpgqTpgqXpgqfpgqjpgqnpgqvpgq3pgrLpgrfpgrzpgr3pgr/pg4Dmkbrmkrfmkrjmkpnmkrrmk4Dmk5Dmk5fmk6Tmk6LmlInmlKXmlK7lvIvlv5LnlJnlvJHljZ/lj7Hlj73lj6nlj6jlj7vlkJLlkJblkIblkYvlkZLlkZPlkZTlkZblkYPlkKHlkZflkZnlkKPlkLLlkoLlkpTlkbflkbHlkaTlkprlkpvlkoTlkbblkablkp3lk5Dlkq3lk4LlkrTlk5Llkqflkqblk5Plk5TlkbLlkqPlk5Xlkrvlkr/lk4zlk5nlk5rlk5zlkqnlkqrlkqTlk53lk4/lk57llJvlk6fllKDlk73llJTlk7PllKLllKPllI/llJHllKfllKrllafllo/llrXllYnlla3llYHllZXllL/llZDllLxcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMDQwXCIsXG5cdFx0XCLpg4Lpg4Ppg4bpg4jpg4npg4vpg4zpg43pg5Lpg5Tpg5Xpg5bpg5jpg5npg5rpg57pg5/pg6Dpg6Ppg6Tpg6Xpg6npg6rpg6zpg67pg7Dpg7Hpg7Lpg7Ppg7Xpg7bpg7fpg7npg7rpg7vpg7zpg7/phIDphIHphIPphIVcIixcblx0XHQxOSxcblx0XHRcIumEmumEm+mEnFwiXG5cdF0sXG5cdFtcblx0XHRcImUwODBcIixcblx0XHRcIumEnemEn+mEoOmEoemEpFwiLFxuXHRcdDEwLFxuXHRcdFwi6YSw6YSyXCIsXG5cdFx0Nixcblx0XHRcIumEulwiLFxuXHRcdDgsXG5cdFx0XCLphYTllLfllZbllbXllbbllbfllLPllLDllZzllovll5LlloPllrHllrnllojlloHllp/llb7ll5bllpHllbvll5/llr3llr7llpTllpnll6rll7fll4nlmJ/ll5Hll6vll6zll5Tll6bll53ll4Tll6/ll6Xll7Lll7Pll4zll43ll6jll7Xll6TovpTlmJ7lmIjlmIzlmIHlmKTlmKPll77lmIDlmKflmK3lmZjlmLnlmZflmKzlmY3lmaLlmZnlmZzlmYzlmZTlmoblmaTlmbHlmavlmbvlmbzlmoXlmpPlmq/lm5Tlm5flm53lm6Hlm7Xlm6vlm7nlm7/lnITlnIrlnInlnJzluI/luJnluJTluJHluLHluLvluLxcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMTQwXCIsXG5cdFx0XCLphYXphYfphYjphZHphZPphZTphZXphZbphZjphZnphZvphZzphZ/phaDphabphafphajphavpha3phbPphbrphbvphbzphoBcIixcblx0XHQ0LFxuXHRcdFwi6YaG6YaI6YaK6YaO6YaP6YaTXCIsXG5cdFx0Nixcblx0XHRcIumGnFwiLFxuXHRcdDUsXG5cdFx0XCLphqRcIixcblx0XHQ1LFxuXHRcdFwi6Yar6Yas6Yaw6Yax6Yay6Yaz6Ya26Ya36Ya46Ya56Ya7XCJcblx0XSxcblx0W1xuXHRcdFwiZTE4MFwiLFxuXHRcdFwi6Ya8XCIsXG5cdFx0MTAsXG5cdFx0XCLph4jph4vph5Dph5JcIixcblx0XHQ5LFxuXHRcdFwi6YedXCIsXG5cdFx0OCxcblx0XHRcIuW4t+W5hOW5lOW5m+W5nuW5oeWyjOWxuuWyjeWykOWyluWyiOWymOWymeWykeWymuWynOWyteWyouWyveWyrOWyq+WyseWyo+WzgeWyt+WzhOWzkuWzpOWzi+WzpeW0guW0g+W0p+W0puW0ruW0pOW0nuW0huW0m+W1mOW0vuW0tOW0veW1rOW1m+W1r+W1neW1q+W1i+W1iuW1qeW1tOW2guW2meW2neixs+W2t+W3heW9s+W9t+W+guW+h+W+ieW+jOW+leW+meW+nOW+qOW+reW+teW+vOihouW9oeeKreeKsOeKtOeKt+eKuOeLg+eLgeeLjueLjeeLkueLqOeLr+eLqeeLsueLtOeLt+eMgeeLs+eMg+eLulwiXG5cdF0sXG5cdFtcblx0XHRcImUyNDBcIixcblx0XHRcIumHplwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImUyODBcIixcblx0XHRcIumIpVwiLFxuXHRcdDMyLFxuXHRcdFwi54u754yX54yT54yh54yK54ye54yd54yV54yi54y554yl54ys54y454yx542Q542N542X542g542s542v542+6Iib5aSl6aOn5aSk5aSC6aWj6aWnXCIsXG5cdFx0NSxcblx0XHRcIumltOmlt+mlvemmgOmmhOmmh+mmiummjemmkOmmkemmk+mmlOmmleW6gOW6keW6i+W6luW6peW6oOW6ueW6teW6vuW6s+i1k+W7kuW7keW7m+W7qOW7quiGuuW/hOW/ieW/luW/j+aAg+W/ruaAhOW/oeW/pOW/vuaAheaAhuW/quW/reW/uOaAmeaAteaApuaAm+aAj+aAjeaAqeaAq+aAiuaAv+aAoeaBuOaBueaBu+aBuuaBglwiXG5cdF0sXG5cdFtcblx0XHRcImUzNDBcIixcblx0XHRcIumJhlwiLFxuXHRcdDQ1LFxuXHRcdFwi6Ym1XCIsXG5cdFx0MTZcblx0XSxcblx0W1xuXHRcdFwiZTM4MFwiLFxuXHRcdFwi6YqGXCIsXG5cdFx0Nyxcblx0XHRcIumKj1wiLFxuXHRcdDI0LFxuXHRcdFwi5oGq5oG95oKW5oKa5oKt5oKd5oKD5oKS5oKM5oKb5oOs5oK75oKx5oOd5oOY5oOG5oOa5oK05oSg5oSm5oSV5oSj5oO05oSA5oSO5oSr5oWK5oW15oas5oaU5oan5oa35oeU5oe15b+d6Zqz6Zep6Zer6Zex6Zez6Ze16Ze26Ze86Ze+6ZiD6ZiE6ZiG6ZiI6ZiK6ZiL6ZiM6ZiN6ZiP6ZiS6ZiV6ZiW6ZiX6ZiZ6Zia5Lis54i/5oiV5rC15rGU5rGc5rGK5rKj5rKF5rKQ5rKU5rKM5rGo5rGp5rG05rG25rKG5rKp5rOQ5rOU5rKt5rO35rO45rOx5rOX5rKy5rOg5rOW5rO65rOr5rOu5rKx5rOT5rOv5rO+XCJcblx0XSxcblx0W1xuXHRcdFwiZTQ0MFwiLFxuXHRcdFwi6YqoXCIsXG5cdFx0NSxcblx0XHRcIumKr1wiLFxuXHRcdDI0LFxuXHRcdFwi6YuJXCIsXG5cdFx0MzFcblx0XSxcblx0W1xuXHRcdFwiZTQ4MFwiLFxuXHRcdFwi6YupXCIsXG5cdFx0MzIsXG5cdFx0XCLmtLnmtKfmtIzmtYPmtYjmtIfmtITmtJnmtI7mtKvmtY3mtK7mtLXmtJrmtY/mtZLmtZTmtLPmtpHmta/mtp7mtqDmtZ7mtpPmtpTmtZzmtaDmtbzmtaPmuJrmt4fmt4Xmt57muI7mtr/mt6DmuJHmt6bmt53mt5nmuJbmtqvmuIzmtq7muKvmua7muY7muavmurLmuZ/muobmuZPmuZTmuLLmuKXmuYTmu5/murHmupjmu6DmvK3mu6LmuqXmuqfmur3murvmurfmu5fmurTmu4/muo/mu4Lmup/mvaLmvYbmvYfmvKTmvJXmu7nmvK/mvLbmvYvmvbTmvKrmvInmvKnmvonmvo3mvozmvbjmvbLmvbzmvbrmv5FcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNTQwXCIsXG5cdFx0XCLpjIpcIixcblx0XHQ1MSxcblx0XHRcIumMv1wiLFxuXHRcdDEwXG5cdF0sXG5cdFtcblx0XHRcImU1ODBcIixcblx0XHRcIumNilwiLFxuXHRcdDMxLFxuXHRcdFwi6Y2r5r+J5r6n5r655r625r+C5r+h5r+u5r+e5r+g5r+v54Ca54Cj54Cb54C554C154GP54Ge5a6A5a6E5a6V5a6T5a6l5a6455Sv6aqe5pC05a+k5a+u6KSw5a+w6LmH6KyH6L626L+T6L+V6L+l6L+u6L+k6L+p6L+m6L+z6L+o6YCF6YCE6YCL6YCm6YCR6YCN6YCW6YCh6YC16YC26YCt6YCv6YGE6YGR6YGS6YGQ6YGo6YGY6YGi6YGb5pq56YG06YG96YKC6YKI6YKD6YKL5b2Q5b2X5b2W5b2Y5bC75ZKr5bGQ5bGZ5a2x5bGj5bGm57685byq5byp5byt6Im05by86ay75bGu5aaB5aaD5aaN5aap5aaq5aajXCJcblx0XSxcblx0W1xuXHRcdFwiZTY0MFwiLFxuXHRcdFwi6Y2sXCIsXG5cdFx0MzQsXG5cdFx0XCLpjpBcIixcblx0XHQyN1xuXHRdLFxuXHRbXG5cdFx0XCJlNjgwXCIsXG5cdFx0XCLpjqxcIixcblx0XHQyOSxcblx0XHRcIumPi+mPjOmPjeWml+WniuWmq+WmnuWmpOWnkuWmsuWmr+Wnl+WmvuWoheWohuWnneWoiOWno+WnmOWnueWojOWoieWosuWotOWokeWoo+Wok+WpgOWpp+WpiuWpleWovOWpouWpteiDrOWqquWqm+Wpt+WpuuWqvuWrq+WqsuWrkuWrlOWquOWroOWro+WrseWrluWrpuWrmOWrnOWsieWsl+WsluWssuWst+WtgOWwleWwnOWtmuWtpeWts+WtkeWtk+Wtoumptempt+mpuOmpuumpv+mpvemqgOmqgemqhemqiOmqiumqkOmqkumqk+mqlumqmOmqm+mqnOmqnemqn+mqoOmqoumqo+mqpemqp+e6n+e6oee6o+e6pee6qOe6qVwiXG5cdF0sXG5cdFtcblx0XHRcImU3NDBcIixcblx0XHRcIumPjlwiLFxuXHRcdDcsXG5cdFx0XCLpj5dcIixcblx0XHQ1NFxuXHRdLFxuXHRbXG5cdFx0XCJlNzgwXCIsXG5cdFx0XCLpkI5cIixcblx0XHQzMixcblx0XHRcIue6ree6sOe6vue7gOe7gee7gue7iee7i+e7jOe7kOe7lOe7l+e7m+e7oOe7oee7qOe7q+e7rue7r+e7see7sue8jee7tue7uue7u+e7vue8gee8gue8g+e8h+e8iOe8i+e8jOe8j+e8kee8kue8l+e8mee8nOe8m+e8n+e8oVwiLFxuXHRcdDYsXG5cdFx0XCLnvKrnvKvnvKznvK3nvK9cIixcblx0XHQ0LFxuXHRcdFwi57y15bm655W/5beb55S+6YKV546O546R546u546i546f54+P54+C54+R5463546z54+A54+J54+I54+l54+Z6aG855CK54+p54+n54+e546654+y55CP55Cq55Gb55Cm55Cl55Co55Cw55Cu55CsXCJcblx0XSxcblx0W1xuXHRcdFwiZTg0MFwiLFxuXHRcdFwi6ZCvXCIsXG5cdFx0MTQsXG5cdFx0XCLpkL9cIixcblx0XHQ0Myxcblx0XHRcIumRrOmRremRrumRr1wiXG5cdF0sXG5cdFtcblx0XHRcImU4ODBcIixcblx0XHRcIumRsFwiLFxuXHRcdDIwLFxuXHRcdFwi6ZKR6ZKW6ZKY6ZOH6ZOP6ZOT6ZOU6ZOa6ZOm6ZO76ZSc6ZSg55Cb55Ca55GB55Gc55GX55GV55GZ55G355Gt55G+55Kc55KO55KA55KB55KH55KL55Ke55Ko55Kp55KQ55Kn55OS55K66Z+q6Z+r6Z+s5p2M5p2T5p2e5p2I5p2p5p6l5p6H5p2q5p2z5p6Y5p6n5p215p6o5p6e5p6t5p6L5p235p285p+w5qCJ5p+Y5qCK5p+p5p6w5qCM5p+Z5p615p+a5p6z5p+d5qCA5p+D5p645p+i5qCO5p+B5p+95qCy5qCz5qGg5qGh5qGO5qGi5qGE5qGk5qKD5qCd5qGV5qGm5qGB5qGn5qGA5qC+5qGK5qGJ5qCp5qK15qKP5qG05qG35qKT5qGr5qOC5qWu5qO85qSf5qSg5qO5XCJcblx0XSxcblx0W1xuXHRcdFwiZTk0MFwiLFxuXHRcdFwi6ZSn6ZSz6ZS96ZWD6ZWI6ZWL6ZWV6ZWa6ZWg6ZWu6ZW06ZW16ZW3XCIsXG5cdFx0Nyxcblx0XHRcIumWgFwiLFxuXHRcdDQyXG5cdF0sXG5cdFtcblx0XHRcImU5ODBcIixcblx0XHRcIumWq1wiLFxuXHRcdDMyLFxuXHRcdFwi5qSk5qOw5qSL5qSB5qWX5qOj5qSQ5qWx5qS55qWg5qWC5qWd5qaE5qWr5qaA5qaY5qW45qS05qeM5qaH5qaI5qeO5qaJ5qWm5qWj5qW55qab5qan5qa75qar5qat5qeU5qax5qeB5qeK5qef5qaV5qeg5qaN5qe/5qiv5qet5qiX5qiY5qml5qey5qmE5qi+5qqg5qmQ5qmb5qi15qqO5qm55qi95qio5qmY5qm85qqR5qqQ5qqp5qqX5qqr54y3542S5q6B5q6C5q6H5q6E5q6S5q6T5q6N5q6a5q6b5q6h5q6q6L2r6L2t6L2x6L2y6L2z6L216L226L246L236L256L266L286L2+6L6B6L6C6L6E6L6H6L6LXCJcblx0XSxcblx0W1xuXHRcdFwiZWE0MFwiLFxuXHRcdFwi6ZeMXCIsXG5cdFx0MjcsXG5cdFx0XCLpl6zpl7/pmIfpmJPpmJjpmJvpmJ7pmKDpmKNcIixcblx0XHQ2LFxuXHRcdFwi6Zir6Zis6Zit6Ziv6Ziw6Zi36Zi46Zi56Zi66Zi+6ZmB6ZmD6ZmK6ZmO6ZmP6ZmR6ZmS6ZmT6ZmW6ZmXXCJcblx0XSxcblx0W1xuXHRcdFwiZWE4MFwiLFxuXHRcdFwi6ZmY6ZmZ6Zma6Zmc6Zmd6Zme6Zmg6Zmj6Zml6Zmm6Zmr6ZmtXCIsXG5cdFx0NCxcblx0XHRcIumZs+mZuFwiLFxuXHRcdDEyLFxuXHRcdFwi6ZqH6ZqJ6ZqK6L6N6L6O6L6P6L6Y6L6a6LuO5oiL5oiX5oib5oif5oii5oih5oil5oik5ois6Ien55Ov55O055O/55SP55SR55ST5pS05peu5pev5pew5piK5piZ5p2y5piD5piV5piA54KF5pu35pid5pi05pix5pi25pi16ICG5pmf5pmU5pmB5pmP5pmW5pmh5pmX5pm35pqE5pqM5pqn5pqd5pq+5pub5puc5pum5pup6LSy6LSz6LS26LS76LS96LWA6LWF6LWG6LWI6LWJ6LWH6LWN6LWV6LWZ6KeH6KeK6KeL6KeM6KeO6KeP6KeQ6KeR54mu54qf54md54mm54mv54m+54m/54qE54qL54qN54qP54qS5oyI5oyy5o6wXCJcblx0XSxcblx0W1xuXHRcdFwiZWI0MFwiLFxuXHRcdFwi6ZqM6ZqO6ZqR6ZqS6ZqT6ZqV6ZqW6Zqa6Zqb6ZqdXCIsXG5cdFx0OSxcblx0XHRcIumaqFwiLFxuXHRcdDcsXG5cdFx0XCLpmrHpmrLpmrTpmrXpmrfpmrjpmrrpmrvpmr/pm4Lpm4Ppm4jpm4rpm4vpm5Dpm5Hpm5Ppm5Tpm5ZcIixcblx0XHQ5LFxuXHRcdFwi6ZuhXCIsXG5cdFx0Nixcblx0XHRcIumbq1wiXG5cdF0sXG5cdFtcblx0XHRcImViODBcIixcblx0XHRcIumbrOmbrembrumbsOmbsembsumbtOmbtembuOmbuumbu+mbvOmbvembv+mcgumcg+mchemciumci+mcjOmckOmckemckumclOmclemcl1wiLFxuXHRcdDQsXG5cdFx0XCLpnJ3pnJ/pnKDmkL/mk5jogITmr6rmr7Pmr73mr7Xmr7nmsIXmsIfmsIbmsI3msJXmsJjmsJnmsJrmsKHmsKnmsKTmsKrmsLLmlLXmlZXmlavniY3niZLniZbniLDomaLliJbogp/ogpzogpPogrzmnIrogr3ogrHogqvogq3ogrTogrfog6fog6jog6nog6rog5vog4Log4Tog5nog43og5fmnJDog53og6vog7Hog7Tog63ohI3ohI7og7Log7zmnJXohJLosZrohLbohJ7ohKzohJjohLLohYjohYzohZPohbTohZnohZrohbHohaDohanohbzohb3oha3ohafloY3lqrXohojohoLohpHmu5XohqPohqroh4zmnKboh4rohrtcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYzQwXCIsXG5cdFx0XCLpnKFcIixcblx0XHQ4LFxuXHRcdFwi6Zyr6Zys6Zyu6Zyv6Zyx6ZyzXCIsXG5cdFx0NCxcblx0XHRcIumcuumcu+mcvOmcvemcv1wiLFxuXHRcdDE4LFxuXHRcdFwi6Z2U6Z2V6Z2X6Z2Y6Z2a6Z2c6Z2d6Z2f6Z2j6Z2k6Z2m6Z2n6Z2o6Z2qXCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCJlYzgwXCIsXG5cdFx0XCLpnbLpnbXpnbdcIixcblx0XHQ0LFxuXHRcdFwi6Z29XCIsXG5cdFx0Nyxcblx0XHRcIumehlwiLFxuXHRcdDQsXG5cdFx0XCLpnozpno7pno/pnpDpnpPpnpXpnpbpnpfpnplcIixcblx0XHQ0LFxuXHRcdFwi6IeB6Iam5qyk5qy35qy55q2D5q2G5q2Z6aOR6aOS6aOT6aOV6aOZ6aOa5q6z5b2A5q+C6Kez5paQ6b2R5paT5pa85peG5peE5peD5peM5peO5peS5peW54KA54Kc54KW54Kd54K754OA54K354Kr54Kx54Oo54OK54SQ54ST54SW54Sv54Sx54Wz54Wc54Wo54WF54Wy54WK54W454W654aY54az54a154ao54ag54eg54eU54en54e554id54io54Gs54SY54Wm54a55oi+5oi95omD5omI5omJ56S756WA56WG56WJ56Wb56Wc56WT56Wa56Wi56WX56Wg56Wv56Wn56W656aF56aK56aa56an56az5b+R5b+QXCJcblx0XSxcblx0W1xuXHRcdFwiZWQ0MFwiLFxuXHRcdFwi6Z6e6Z6f6Z6h6Z6i6Z6kXCIsXG5cdFx0Nixcblx0XHRcIumerOmerumesOmesemes+metVwiLFxuXHRcdDQ2XG5cdF0sXG5cdFtcblx0XHRcImVkODBcIixcblx0XHRcIumfpOmfpemfqOmfrlwiLFxuXHRcdDQsXG5cdFx0XCLpn7Tpn7dcIixcblx0XHQyMyxcblx0XHRcIuaAvOaBneaBmuaBp+aBgeaBmeaBo+aCq+aEhuaEjeaFneaGqeaGneaHi+aHkeaIhuiCgOiBv+ayk+aztua3vOeftuefuOeggOegieegl+egmOegkeaWq+egreegnOegneegueeguuegu+egn+egvOegpeegrOego+egqeehjuehreehluehl+egpuehkOehh+ehjOehqueim+eik+eimueih+einOeioeeio+eisueiueeipeejlOejmeejieejrOejsuekheejtOekk+ekpOeknuektOm+m+m7uem7u+m7vOebseechOecjeebueech+eciOecmuecouecmeecreecpuecteecuOedkOedkeedh+edg+edmuedqFwiXG5cdF0sXG5cdFtcblx0XHRcImVlNDBcIixcblx0XHRcIumgj1wiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImVlODBcIixcblx0XHRcIumhjlwiLFxuXHRcdDMyLFxuXHRcdFwi552i552l552/556N5529556A556M556R556f556g556w5561556955S655WA55WO55WL55WI55Wb55Wy55W555aD572Y572h572f6KmI572o5720572x5725576B572+55uN55ul6KCy6ZKF6ZKG6ZKH6ZKL6ZKK6ZKM6ZKN6ZKP6ZKQ6ZKU6ZKX6ZKV6ZKa6ZKb6ZKc6ZKj6ZKk6ZKr6ZKq6ZKt6ZKs6ZKv6ZKw6ZKy6ZK06ZK2XCIsXG5cdFx0NCxcblx0XHRcIumSvOmSvemSv+mThOmTiFwiLFxuXHRcdDYsXG5cdFx0XCLpk5Dpk5Hpk5Lpk5Xpk5bpk5fpk5npk5jpk5vpk57pk5/pk6Dpk6Lpk6Tpk6Xpk6fpk6jpk6pcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZjQwXCIsXG5cdFx0XCLpoa9cIixcblx0XHQ1LFxuXHRcdFwi6aKL6aKO6aKS6aKV6aKZ6aKj6aKoXCIsXG5cdFx0MzcsXG5cdFx0XCLpo4/po5Dpo5Tpo5bpo5fpo5vpo5zpo53po6BcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImVmODBcIixcblx0XHRcIumjpemjpumjqVwiLFxuXHRcdDMwLFxuXHRcdFwi6ZOp6ZOr6ZOu6ZOv6ZOz6ZO06ZO16ZO36ZO56ZO86ZO96ZO/6ZSD6ZSC6ZSG6ZSH6ZSJ6ZSK6ZSN6ZSO6ZSP6ZSSXCIsXG5cdFx0NCxcblx0XHRcIumUmOmUm+mUnemUnumUn+mUoumUqumUq+mUqemUrOmUsemUsumUtOmUtumUt+mUuOmUvOmUvumUv+mVgumUtemVhOmVhemVhumViemVjOmVjumVj+mVkumVk+mVlOmVlumVl+mVmOmVmemVm+mVnumVn+mVnemVoemVoumVpFwiLFxuXHRcdDgsXG5cdFx0XCLpla/plbHplbLplbPplLrnn6fnn6zpm4nnp5Xnp63np6Pnp6vnqIbltYfnqIPnqILnqJ7nqJRcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMDQwXCIsXG5cdFx0XCLppIhcIixcblx0XHQ0LFxuXHRcdFwi6aSO6aSP6aSRXCIsXG5cdFx0MjgsXG5cdFx0XCLppK9cIixcblx0XHQyNlxuXHRdLFxuXHRbXG5cdFx0XCJmMDgwXCIsXG5cdFx0XCLppYpcIixcblx0XHQ5LFxuXHRcdFwi6aWWXCIsXG5cdFx0MTIsXG5cdFx0XCLppaTppabppbPppbjppbnppbvppb7ppoLppoPpponnqLnnqLfnqZHpu4/ppqXnqbDnmojnmo7nmpPnmpnnmqTnk57nk6DnlKzpuKDpuKLpuKhcIixcblx0XHQ0LFxuXHRcdFwi6biy6bix6bi26bi46bi36bi56bi66bi+6bmB6bmC6bmE6bmG6bmH6bmI6bmJ6bmL6bmM6bmO6bmR6bmV6bmX6bma6bmb6bmc6bme6bmj6bmmXCIsXG5cdFx0Nixcblx0XHRcIum5sem5rem5s+eWkueWlOeWlueWoOeWneeWrOeWo+eWs+eWtOeWuOeXhOeWseeWsOeXg+eXgueXlueXjeeXo+eXqOeXpueXpOeXq+eXp+eYg+eXseeXvOeXv+eYkOeYgOeYheeYjOeYl+eYiueYpeeYmOeYleeYmVwiXG5cdF0sXG5cdFtcblx0XHRcImYxNDBcIixcblx0XHRcIummjOmmjummmlwiLFxuXHRcdDEwLFxuXHRcdFwi6aam6aan6aapXCIsXG5cdFx0NDdcblx0XSxcblx0W1xuXHRcdFwiZjE4MFwiLFxuXHRcdFwi6aeZXCIsXG5cdFx0MzIsXG5cdFx0XCLnmJvnmLznmKLnmKDnmYDnmK3nmLDnmL/nmLXnmYPnmL7nmLPnmY3nmZ7nmZTnmZznmZbnmavnma/nv4rnq6bnqbjnqbnnqoDnqobnqojnqpXnqqbnqqDnqqznqqjnqq3nqrPooaTooanoobLoob3oob/oooLooqLoo4boorfoorzoo4noo6Loo47oo6Poo6Xoo7HopJroo7zoo6joo77oo7DopKHopJnopJPopJvopIropLTopKvopLbopYHopabopbvnlovog6XnmrLnmrTnn5zogJLogJTogJbogJzogKDogKLogKXogKbogKfogKnogKjogLHogIvogLXogYPogYbogY3ogZLoganogbHopoPpobjpooDpooNcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMjQwXCIsXG5cdFx0XCLpp7pcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmMjgwXCIsXG5cdFx0XCLpqLlcIixcblx0XHQzMixcblx0XHRcIumiiemijOmijemij+milOmimumim+minumin+mioemioumipemipuiZjeiZlOiZrOiZruiZv+iZuuiZvOiZu+iaqOiajeiai+iarOianeiap+iao+iaquiak+iaqeiatuibhOiateibjuiasOiauuiaseiar+ibieibj+iatOibqeibseibsuibreibs+ibkOick+ibnuibtOibn+ibmOibkeicg+ich+ibuOiciOiciuicjeicieico+icu+icnuicpeicruicmuicvuidiOictOicseicqeict+icv+ieguicouidveidvuidu+idoOidsOidjOidruiei+idk+ido+idvOidpOidmeidpeiek+ier+ieqOifklwiXG5cdF0sXG5cdFtcblx0XHRcImYzNDBcIixcblx0XHRcIumpmlwiLFxuXHRcdDE3LFxuXHRcdFwi6amy6aqD6aqJ6aqN6aqO6aqU6aqV6aqZ6aqm6aqpXCIsXG5cdFx0Nixcblx0XHRcIumqsumqs+mqtOmqtemquemqu+mqvemqvumqv+mrg+mrhOmrhlwiLFxuXHRcdDQsXG5cdFx0XCLpq43pq47pq4/pq5Dpq5Lpq5Tpq5Xpq5bpq5fpq5npq5rpq5vpq5xcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMzgwXCIsXG5cdFx0XCLpq53pq57pq6Dpq6Lpq6Ppq6Tpq6Xpq6fpq6jpq6npq6rpq6zpq67pq7BcIixcblx0XHQ4LFxuXHRcdFwi6au66au8XCIsXG5cdFx0Nixcblx0XHRcIumshOmshemshuifhuieiOieheiereiel+ieg+ieq+ifpeierOieteies+ifi+ifk+ieveifkeifgOifiuifm+ifquifoOifruigluigk+ifvuigiuigm+igoeigueigvOe8tue9gue9hOe9heiIkOeruuerveesiOesg+eshOesleesiuesq+esj+eth+esuOesquesmeesruesseesoOespeespOess+esvuesnuetmOetmuetheetteetjOetneetoOetruetu+etouetsuetseeukOeupueup+euuOeurOeuneeuqOeuheeuqueunOeuoueuq+eutOevkeevgeevjOevneevmuevpeevpuevquewjOevvuevvOewj+ewluewi1wiXG5cdF0sXG5cdFtcblx0XHRcImY0NDBcIixcblx0XHRcIumsh+msiVwiLFxuXHRcdDUsXG5cdFx0XCLprJDprJHprJLprJRcIixcblx0XHQxMCxcblx0XHRcIumsoOmsoemsoumspFwiLFxuXHRcdDEwLFxuXHRcdFwi6ayw6ayx6ayzXCIsXG5cdFx0Nyxcblx0XHRcIumsvemsvumsv+mtgOmthumtiumti+mtjOmtjumtkOmtkumtk+mtlVwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiZjQ4MFwiLFxuXHRcdFwi6a2bXCIsXG5cdFx0MzIsXG5cdFx0XCLnsJ/nsKrnsKbnsLjnsYHnsYDoh77oiIHoiILoiIToh6zooYToiKHoiKLoiKPoiK3oiK/oiKjoiKvoiLjoiLvoiLPoiLToiL7oiYToiYnoiYvoiY/oiZroiZ/oiajoob7oooXooojoo5joo5/opZ7nvp3nvp/nvqfnvq/nvrDnvrLnsbzmlYnnspHnsp3nspznsp7nsqLnsrLnsrznsr3ns4Hns4fns4zns43ns4jns4Xns5fns6joia7mmqjnvr/nv47nv5Xnv6Xnv6Hnv6bnv6nnv67nv7Pns7jntbfntqbntq7nuYfnupvpurjpurTotbPotoTotpTotpHotrHotafota3osYfosYnphYrphZDphY7phY/phaRcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNTQwXCIsXG5cdFx0XCLprbxcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmNTgwXCIsXG5cdFx0XCLprrtcIixcblx0XHQzMixcblx0XHRcIumFoumFoemFsOmFqemFr+mFvemFvumFsumFtOmFuemGjOmGhemGkOmGjemGkemGoumGo+mGqumGremGrumGr+mGtemGtOmGuuixlem5vui2uOi3q+i4hei5mei5qei2tei2v+i2vOi2uui3hOi3lui3l+i3mui3nui3jui3j+i3m+i3hui3rOi3t+i3uOi3o+i3uei3u+i3pOi4iei3vei4lOi4nei4n+i4rOi4rui4o+i4r+i4uui5gOi4uei4tei4vei4sei5iei5gei5gui5kei5kui5iui5sOi5tui5vOi5r+i5tOi6hei6j+i6lOi6kOi6nOi6nuixuOiyguiyiuiyheiymOiylOaWm+inluinnuinmuinnFwiXG5cdF0sXG5cdFtcblx0XHRcImY2NDBcIixcblx0XHRcIumvnFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImY2ODBcIixcblx0XHRcIumwm1wiLFxuXHRcdDMyLFxuXHRcdFwi6Kel6Ker6Kev6Ki+6Kym6Z2T6Zup6Zuz6Zuv6ZyG6ZyB6ZyI6ZyP6ZyO6Zyq6Zyt6Zyw6Zy+6b6A6b6D6b6FXCIsXG5cdFx0NSxcblx0XHRcIum+jOm7vum8i+m8jemauemavOmavembjumbkueev+mboOmKjumKrumLiOmMvumNqumPiumOj+mQvumRq+mxv+mygumyhemyhumyh+myiOeoo+myi+myjumykOmykemykumylOmylemymumym+mynlwiLFxuXHRcdDUsXG5cdFx0XCLpsqVcIixcblx0XHQ0LFxuXHRcdFwi6bKr6bKt6bKu6bKwXCIsXG5cdFx0Nyxcblx0XHRcIumyuumyu+myvOmyvemzhOmzhemzhumzh+mziumzi1wiXG5cdF0sXG5cdFtcblx0XHRcImY3NDBcIixcblx0XHRcIumwvFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImY3ODBcIixcblx0XHRcIumxu+mxvemxvumygOmyg+myhOmyiemyiumyjOmyj+myk+mylumyl+mymOmymemynemyqumyrOmyr+myuemyvlwiLFxuXHRcdDQsXG5cdFx0XCLps4jps4nps5Hps5Lps5rps5vps6Dps6Hps4xcIixcblx0XHQ0LFxuXHRcdFwi6bOT6bOU6bOV6bOX6bOY6bOZ6bOc6bOd6bOf6bOi6Z286Z6F6Z6R6Z6S6Z6U6Z6v6Z6r6Z6j6Z6y6Z606aqx6aqw6aq36bmY6aq26aq66aq86auB6auA6auF6auC6auL6auM6auR6a2F6a2D6a2H6a2J6a2I6a2N6a2R6aOo6aSN6aSu6aWV6aWU6auf6auh6aum6auv6aur6au76aut6au56ayI6ayP6ayT6ayf6ayj6bq96bq+57i76bqC6bqH6bqI6bqL6bqS6Y+W6bqd6bqf6bub6buc6bud6bug6buf6bui6bup6bun6bul6buq6buv6byi6bys6byv6by56by36by96by+6b2EXCJcblx0XSxcblx0W1xuXHRcdFwiZjg0MFwiLFxuXHRcdFwi6bOjXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjg4MFwiLFxuXHRcdFwi6bSiXCIsXG5cdFx0MzJcblx0XSxcblx0W1xuXHRcdFwiZjk0MFwiLFxuXHRcdFwi6bWDXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjk4MFwiLFxuXHRcdFwi6baCXCIsXG5cdFx0MzJcblx0XSxcblx0W1xuXHRcdFwiZmE0MFwiLFxuXHRcdFwi6bajXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZmE4MFwiLFxuXHRcdFwi6beiXCIsXG5cdFx0MzJcblx0XSxcblx0W1xuXHRcdFwiZmI0MFwiLFxuXHRcdFwi6biDXCIsXG5cdFx0MjcsXG5cdFx0XCLpuKTpuKfpuK7puLDpuLTpuLvpuLzpuYDpuY3puZDpuZLpuZPpuZTpuZbpuZnpuZ3puZ/puaDpuaHpuaLpuaXpua7pua/pubLpubRcIixcblx0XHQ5LFxuXHRcdFwi6bqAXCJcblx0XSxcblx0W1xuXHRcdFwiZmI4MFwiLFxuXHRcdFwi6bqB6bqD6bqE6bqF6bqG6bqJ6bqK6bqMXCIsXG5cdFx0NSxcblx0XHRcIum6lFwiLFxuXHRcdDgsXG5cdFx0XCLpup7puqBcIixcblx0XHQ1LFxuXHRcdFwi6bqn6bqo6bqp6bqqXCJcblx0XSxcblx0W1xuXHRcdFwiZmM0MFwiLFxuXHRcdFwi6bqrXCIsXG5cdFx0OCxcblx0XHRcIum6tem6tum6t+m6uem6uum6vOm6v1wiLFxuXHRcdDQsXG5cdFx0XCLpu4Xpu4bpu4fpu4jpu4rpu4vpu4zpu5Dpu5Lpu5Ppu5Xpu5bpu5fpu5npu5rpu57pu6Hpu6Ppu6Tpu6bpu6jpu6vpu6zpu63pu67pu7BcIixcblx0XHQ4LFxuXHRcdFwi6bu66bu96bu/XCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJmYzgwXCIsXG5cdFx0XCLpvIZcIixcblx0XHQ0LFxuXHRcdFwi6byM6byP6byR6byS6byU6byV6byW6byY6byaXCIsXG5cdFx0NSxcblx0XHRcIum8oem8o1wiLFxuXHRcdDgsXG5cdFx0XCLpvK3pvK7pvLDpvLFcIlxuXHRdLFxuXHRbXG5cdFx0XCJmZDQwXCIsXG5cdFx0XCLpvLJcIixcblx0XHQ0LFxuXHRcdFwi6by46by66by86by/XCIsXG5cdFx0NCxcblx0XHRcIum9hVwiLFxuXHRcdDEwLFxuXHRcdFwi6b2SXCIsXG5cdFx0Mzhcblx0XSxcblx0W1xuXHRcdFwiZmQ4MFwiLFxuXHRcdFwi6b25XCIsXG5cdFx0NSxcblx0XHRcIum+gem+gum+jVwiLFxuXHRcdDExLFxuXHRcdFwi6b6c6b6d6b6e6b6hXCIsXG5cdFx0NCxcblx0XHRcIu+krO+lue+mle+np++nsVwiXG5cdF0sXG5cdFtcblx0XHRcImZlNDBcIixcblx0XHRcIu+ojO+oje+oju+oj++oke+ok++olO+omO+on++ooO+ooe+oo++opO+op++oqO+oqVwiXG5cdF1cbl07XG5cbnZhciBjcDkzNiQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCdkZWZhdWx0JzogY3A5MzZcbn0pO1xuXG52YXIgZ2JrQWRkZWQgPSBbXG5cdFtcblx0XHRcImExNDBcIixcblx0XHRcIu6ThlwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImExODBcIixcblx0XHRcIu6UhVwiLFxuXHRcdDMyXG5cdF0sXG5cdFtcblx0XHRcImEyNDBcIixcblx0XHRcIu6UplwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImEyODBcIixcblx0XHRcIu6VpVwiLFxuXHRcdDMyXG5cdF0sXG5cdFtcblx0XHRcImEyYWJcIixcblx0XHRcIu6dplwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiYTJlM1wiLFxuXHRcdFwi4oKs7p2tXCJcblx0XSxcblx0W1xuXHRcdFwiYTJlZlwiLFxuXHRcdFwi7p2u7p2vXCJcblx0XSxcblx0W1xuXHRcdFwiYTJmZFwiLFxuXHRcdFwi7p2w7p2xXCJcblx0XSxcblx0W1xuXHRcdFwiYTM0MFwiLFxuXHRcdFwi7paGXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiYTM4MFwiLFxuXHRcdFwi7peFXCIsXG5cdFx0MzEsXG5cdFx0XCLjgIBcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNDQwXCIsXG5cdFx0XCLul6ZcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJhNDgwXCIsXG5cdFx0XCLumKVcIixcblx0XHQzMlxuXHRdLFxuXHRbXG5cdFx0XCJhNGY0XCIsXG5cdFx0XCLunbJcIixcblx0XHQxMFxuXHRdLFxuXHRbXG5cdFx0XCJhNTQwXCIsXG5cdFx0XCLumYZcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJhNTgwXCIsXG5cdFx0XCLumoVcIixcblx0XHQzMlxuXHRdLFxuXHRbXG5cdFx0XCJhNWY3XCIsXG5cdFx0XCLunb1cIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcImE2NDBcIixcblx0XHRcIu6aplwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImE2ODBcIixcblx0XHRcIu6bpVwiLFxuXHRcdDMyXG5cdF0sXG5cdFtcblx0XHRcImE2YjlcIixcblx0XHRcIu6ehVwiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiYTZkOVwiLFxuXHRcdFwi7p6NXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJhNmVjXCIsXG5cdFx0XCLunpTunpVcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNmYzXCIsXG5cdFx0XCLunpZcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNmY2XCIsXG5cdFx0XCLunpdcIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcImE3NDBcIixcblx0XHRcIu6chlwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImE3ODBcIixcblx0XHRcIu6dhVwiLFxuXHRcdDMyXG5cdF0sXG5cdFtcblx0XHRcImE3YzJcIixcblx0XHRcIu6eoFwiLFxuXHRcdDE0XG5cdF0sXG5cdFtcblx0XHRcImE3ZjJcIixcblx0XHRcIu6er1wiLFxuXHRcdDEyXG5cdF0sXG5cdFtcblx0XHRcImE4OTZcIixcblx0XHRcIu6evFwiLFxuXHRcdDEwXG5cdF0sXG5cdFtcblx0XHRcImE4YmNcIixcblx0XHRcIu6fh1wiXG5cdF0sXG5cdFtcblx0XHRcImE4YmZcIixcblx0XHRcIse5XCJcblx0XSxcblx0W1xuXHRcdFwiYThjMVwiLFxuXHRcdFwi7p+J7p+K7p+L7p+MXCJcblx0XSxcblx0W1xuXHRcdFwiYThlYVwiLFxuXHRcdFwi7p+NXCIsXG5cdFx0MjBcblx0XSxcblx0W1xuXHRcdFwiYTk1OFwiLFxuXHRcdFwi7p+iXCJcblx0XSxcblx0W1xuXHRcdFwiYTk1YlwiLFxuXHRcdFwi7p+jXCJcblx0XSxcblx0W1xuXHRcdFwiYTk1ZFwiLFxuXHRcdFwi7p+k7p+l7p+mXCJcblx0XSxcblx0W1xuXHRcdFwiYTk4OVwiLFxuXHRcdFwi44C+4r+wXCIsXG5cdFx0MTFcblx0XSxcblx0W1xuXHRcdFwiYTk5N1wiLFxuXHRcdFwi7p+0XCIsXG5cdFx0MTJcblx0XSxcblx0W1xuXHRcdFwiYTlmMFwiLFxuXHRcdFwi7qCBXCIsXG5cdFx0MTRcblx0XSxcblx0W1xuXHRcdFwiYWFhMVwiLFxuXHRcdFwi7oCAXCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiYWJhMVwiLFxuXHRcdFwi7oGeXCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiYWNhMVwiLFxuXHRcdFwi7oK8XCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiYWRhMVwiLFxuXHRcdFwi7oSaXCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiYWVhMVwiLFxuXHRcdFwi7oW4XCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiYWZhMVwiLFxuXHRcdFwi7oeWXCIsXG5cdFx0OTNcblx0XSxcblx0W1xuXHRcdFwiZDdmYVwiLFxuXHRcdFwi7qCQXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJmOGExXCIsXG5cdFx0XCLuiLRcIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJmOWExXCIsXG5cdFx0XCLuipJcIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJmYWExXCIsXG5cdFx0XCLui7BcIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJmYmExXCIsXG5cdFx0XCLujY5cIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJmY2ExXCIsXG5cdFx0XCLujqxcIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJmZGExXCIsXG5cdFx0XCLukIpcIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJmZTUwXCIsXG5cdFx0XCLiuoHuoJbuoJfuoJjiuoTjkbPjkYfiuojiuovuoJ7jlp7jmJrjmI7iuoziupfjpa7jpJjuoKbjp4/jp5/jqbPjp5DuoKvuoKzjrY7jsa7js6DiuqfuoLHuoLLiuqrkgZbkhZ/iuq7kjLfiurPiurbiurfuoLvkjrHkjqziurvkj53kk5bkmaHkmYzuoYNcIlxuXHRdLFxuXHRbXG5cdFx0XCJmZTgwXCIsXG5cdFx0XCLknKPknKnknbzkno3iu4rkpYfkpbrkpb3kpoLkpoPkpoXkpobkpp/kppvkprfkprbuoZTuoZXksqPksp/ksqDksqHksbfksqLktJNcIixcblx0XHQ2LFxuXHRcdFwi5Lau7qGk7pGoXCIsXG5cdFx0OTNcblx0XVxuXTtcblxudmFyIGdia0FkZGVkJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0J2RlZmF1bHQnOiBnYmtBZGRlZFxufSk7XG5cbnZhciB1Q2hhcnMgPSBbXG5cdDEyOCxcblx0MTY1LFxuXHQxNjksXG5cdDE3OCxcblx0MTg0LFxuXHQyMTYsXG5cdDIyNixcblx0MjM1LFxuXHQyMzgsXG5cdDI0NCxcblx0MjQ4LFxuXHQyNTEsXG5cdDI1Myxcblx0MjU4LFxuXHQyNzYsXG5cdDI4NCxcblx0MzAwLFxuXHQzMjUsXG5cdDMyOSxcblx0MzM0LFxuXHQzNjQsXG5cdDQ2Myxcblx0NDY1LFxuXHQ0NjcsXG5cdDQ2OSxcblx0NDcxLFxuXHQ0NzMsXG5cdDQ3NSxcblx0NDc3LFxuXHQ1MDYsXG5cdDU5NCxcblx0NjEwLFxuXHQ3MTIsXG5cdDcxNixcblx0NzMwLFxuXHQ5MzAsXG5cdDkzOCxcblx0OTYyLFxuXHQ5NzAsXG5cdDEwMjYsXG5cdDExMDQsXG5cdDExMDYsXG5cdDgyMDksXG5cdDgyMTUsXG5cdDgyMTgsXG5cdDgyMjIsXG5cdDgyMzEsXG5cdDgyNDEsXG5cdDgyNDQsXG5cdDgyNDYsXG5cdDgyNTIsXG5cdDgzNjUsXG5cdDg0NTIsXG5cdDg0NTQsXG5cdDg0NTgsXG5cdDg0NzEsXG5cdDg0ODIsXG5cdDg1NTYsXG5cdDg1NzAsXG5cdDg1OTYsXG5cdDg2MDIsXG5cdDg3MTMsXG5cdDg3MjAsXG5cdDg3MjIsXG5cdDg3MjYsXG5cdDg3MzEsXG5cdDg3MzcsXG5cdDg3NDAsXG5cdDg3NDIsXG5cdDg3NDgsXG5cdDg3NTEsXG5cdDg3NjAsXG5cdDg3NjYsXG5cdDg3NzcsXG5cdDg3ODEsXG5cdDg3ODcsXG5cdDg4MDIsXG5cdDg4MDgsXG5cdDg4MTYsXG5cdDg4NTQsXG5cdDg4NTgsXG5cdDg4NzAsXG5cdDg4OTYsXG5cdDg5NzksXG5cdDkzMjIsXG5cdDkzNzIsXG5cdDk1NDgsXG5cdDk1ODgsXG5cdDk2MTYsXG5cdDk2MjIsXG5cdDk2MzQsXG5cdDk2NTIsXG5cdDk2NjIsXG5cdDk2NzIsXG5cdDk2NzYsXG5cdDk2ODAsXG5cdDk3MDIsXG5cdDk3MzUsXG5cdDk3MzgsXG5cdDk3OTMsXG5cdDk3OTUsXG5cdDExOTA2LFxuXHQxMTkwOSxcblx0MTE5MTMsXG5cdDExOTE3LFxuXHQxMTkyOCxcblx0MTE5NDQsXG5cdDExOTQ3LFxuXHQxMTk1MSxcblx0MTE5NTYsXG5cdDExOTYwLFxuXHQxMTk2NCxcblx0MTE5NzksXG5cdDEyMjg0LFxuXHQxMjI5Mixcblx0MTIzMTIsXG5cdDEyMzE5LFxuXHQxMjMzMCxcblx0MTIzNTEsXG5cdDEyNDM2LFxuXHQxMjQ0Nyxcblx0MTI1MzUsXG5cdDEyNTQzLFxuXHQxMjU4Nixcblx0MTI4NDIsXG5cdDEyODUwLFxuXHQxMjk2NCxcblx0MTMyMDAsXG5cdDEzMjE1LFxuXHQxMzIxOCxcblx0MTMyNTMsXG5cdDEzMjYzLFxuXHQxMzI2Nyxcblx0MTMyNzAsXG5cdDEzMzg0LFxuXHQxMzQyOCxcblx0MTM3MjcsXG5cdDEzODM5LFxuXHQxMzg1MSxcblx0MTQ2MTcsXG5cdDE0NzAzLFxuXHQxNDgwMSxcblx0MTQ4MTYsXG5cdDE0OTY0LFxuXHQxNTE4Myxcblx0MTU0NzEsXG5cdDE1NTg1LFxuXHQxNjQ3MSxcblx0MTY3MzYsXG5cdDE3MjA4LFxuXHQxNzMyNSxcblx0MTczMzAsXG5cdDE3Mzc0LFxuXHQxNzYyMyxcblx0MTc5OTcsXG5cdDE4MDE4LFxuXHQxODIxMixcblx0MTgyMTgsXG5cdDE4MzAxLFxuXHQxODMxOCxcblx0MTg3NjAsXG5cdDE4ODExLFxuXHQxODgxNCxcblx0MTg4MjAsXG5cdDE4ODIzLFxuXHQxODg0NCxcblx0MTg4NDgsXG5cdDE4ODcyLFxuXHQxOTU3Nixcblx0MTk2MjAsXG5cdDE5NzM4LFxuXHQxOTg4Nyxcblx0NDA4NzAsXG5cdDU5MjQ0LFxuXHQ1OTMzNixcblx0NTkzNjcsXG5cdDU5NDEzLFxuXHQ1OTQxNyxcblx0NTk0MjMsXG5cdDU5NDMxLFxuXHQ1OTQzNyxcblx0NTk0NDMsXG5cdDU5NDUyLFxuXHQ1OTQ2MCxcblx0NTk0NzgsXG5cdDU5NDkzLFxuXHQ2Mzc4OSxcblx0NjM4NjYsXG5cdDYzODk0LFxuXHQ2Mzk3Nixcblx0NjM5ODYsXG5cdDY0MDE2LFxuXHQ2NDAxOCxcblx0NjQwMjEsXG5cdDY0MDI1LFxuXHQ2NDAzNCxcblx0NjQwMzcsXG5cdDY0MDQyLFxuXHQ2NTA3NCxcblx0NjUwOTMsXG5cdDY1MTA3LFxuXHQ2NTExMixcblx0NjUxMjcsXG5cdDY1MTMyLFxuXHQ2NTM3NSxcblx0NjU1MTAsXG5cdDY1NTM2XG5dO1xudmFyIGdiQ2hhcnMgPSBbXG5cdDAsXG5cdDM2LFxuXHQzOCxcblx0NDUsXG5cdDUwLFxuXHQ4MSxcblx0ODksXG5cdDk1LFxuXHQ5Nixcblx0MTAwLFxuXHQxMDMsXG5cdDEwNCxcblx0MTA1LFxuXHQxMDksXG5cdDEyNixcblx0MTMzLFxuXHQxNDgsXG5cdDE3Mixcblx0MTc1LFxuXHQxNzksXG5cdDIwOCxcblx0MzA2LFxuXHQzMDcsXG5cdDMwOCxcblx0MzA5LFxuXHQzMTAsXG5cdDMxMSxcblx0MzEyLFxuXHQzMTMsXG5cdDM0MSxcblx0NDI4LFxuXHQ0NDMsXG5cdDU0NCxcblx0NTQ1LFxuXHQ1NTgsXG5cdDc0MSxcblx0NzQyLFxuXHQ3NDksXG5cdDc1MCxcblx0ODA1LFxuXHQ4MTksXG5cdDgyMCxcblx0NzkyMixcblx0NzkyNCxcblx0NzkyNSxcblx0NzkyNyxcblx0NzkzNCxcblx0Nzk0Myxcblx0Nzk0NCxcblx0Nzk0NSxcblx0Nzk1MCxcblx0ODA2Mixcblx0ODE0OCxcblx0ODE0OSxcblx0ODE1Mixcblx0ODE2NCxcblx0ODE3NCxcblx0ODIzNixcblx0ODI0MCxcblx0ODI2Mixcblx0ODI2NCxcblx0ODM3NCxcblx0ODM4MCxcblx0ODM4MSxcblx0ODM4NCxcblx0ODM4OCxcblx0ODM5MCxcblx0ODM5Mixcblx0ODM5Myxcblx0ODM5NCxcblx0ODM5Nixcblx0ODQwMSxcblx0ODQwNixcblx0ODQxNixcblx0ODQxOSxcblx0ODQyNCxcblx0ODQzNyxcblx0ODQzOSxcblx0ODQ0NSxcblx0ODQ4Mixcblx0ODQ4NSxcblx0ODQ5Nixcblx0ODUyMSxcblx0ODYwMyxcblx0ODkzNixcblx0ODk0Nixcblx0OTA0Nixcblx0OTA1MCxcblx0OTA2Myxcblx0OTA2Nixcblx0OTA3Nixcblx0OTA5Mixcblx0OTEwMCxcblx0OTEwOCxcblx0OTExMSxcblx0OTExMyxcblx0OTEzMSxcblx0OTE2Mixcblx0OTE2NCxcblx0OTIxOCxcblx0OTIxOSxcblx0MTEzMjksXG5cdDExMzMxLFxuXHQxMTMzNCxcblx0MTEzMzYsXG5cdDExMzQ2LFxuXHQxMTM2MSxcblx0MTEzNjMsXG5cdDExMzY2LFxuXHQxMTM3MCxcblx0MTEzNzIsXG5cdDExMzc1LFxuXHQxMTM4OSxcblx0MTE2ODIsXG5cdDExNjg2LFxuXHQxMTY4Nyxcblx0MTE2OTIsXG5cdDExNjk0LFxuXHQxMTcxNCxcblx0MTE3MTYsXG5cdDExNzIzLFxuXHQxMTcyNSxcblx0MTE3MzAsXG5cdDExNzM2LFxuXHQxMTk4Mixcblx0MTE5ODksXG5cdDEyMTAyLFxuXHQxMjMzNixcblx0MTIzNDgsXG5cdDEyMzUwLFxuXHQxMjM4NCxcblx0MTIzOTMsXG5cdDEyMzk1LFxuXHQxMjM5Nyxcblx0MTI1MTAsXG5cdDEyNTUzLFxuXHQxMjg1MSxcblx0MTI5NjIsXG5cdDEyOTczLFxuXHQxMzczOCxcblx0MTM4MjMsXG5cdDEzOTE5LFxuXHQxMzkzMyxcblx0MTQwODAsXG5cdDE0Mjk4LFxuXHQxNDU4NSxcblx0MTQ2OTgsXG5cdDE1NTgzLFxuXHQxNTg0Nyxcblx0MTYzMTgsXG5cdDE2NDM0LFxuXHQxNjQzOCxcblx0MTY0ODEsXG5cdDE2NzI5LFxuXHQxNzEwMixcblx0MTcxMjIsXG5cdDE3MzE1LFxuXHQxNzMyMCxcblx0MTc0MDIsXG5cdDE3NDE4LFxuXHQxNzg1OSxcblx0MTc5MDksXG5cdDE3OTExLFxuXHQxNzkxNSxcblx0MTc5MTYsXG5cdDE3OTM2LFxuXHQxNzkzOSxcblx0MTc5NjEsXG5cdDE4NjY0LFxuXHQxODcwMyxcblx0MTg4MTQsXG5cdDE4OTYyLFxuXHQxOTA0Myxcblx0MzM0NjksXG5cdDMzNDcwLFxuXHQzMzQ3MSxcblx0MzM0ODQsXG5cdDMzNDg1LFxuXHQzMzQ5MCxcblx0MzM0OTcsXG5cdDMzNTAxLFxuXHQzMzUwNSxcblx0MzM1MTMsXG5cdDMzNTIwLFxuXHQzMzUzNixcblx0MzM1NTAsXG5cdDM3ODQ1LFxuXHQzNzkyMSxcblx0Mzc5NDgsXG5cdDM4MDI5LFxuXHQzODAzOCxcblx0MzgwNjQsXG5cdDM4MDY1LFxuXHQzODA2Nixcblx0MzgwNjksXG5cdDM4MDc1LFxuXHQzODA3Nixcblx0MzgwNzgsXG5cdDM5MTA4LFxuXHQzOTEwOSxcblx0MzkxMTMsXG5cdDM5MTE0LFxuXHQzOTExNSxcblx0MzkxMTYsXG5cdDM5MjY1LFxuXHQzOTM5NCxcblx0MTg5MDAwXG5dO1xudmFyIGdiMTgwMzBSYW5nZXMgPSB7XG5cdHVDaGFyczogdUNoYXJzLFxuXHRnYkNoYXJzOiBnYkNoYXJzXG59O1xuXG52YXIgZ2IxODAzMFJhbmdlcyQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdHVDaGFyczogdUNoYXJzLFxuXHRnYkNoYXJzOiBnYkNoYXJzLFxuXHQnZGVmYXVsdCc6IGdiMTgwMzBSYW5nZXNcbn0pO1xuXG52YXIgY3A5NDkgPSBbXG5cdFtcblx0XHRcIjBcIixcblx0XHRcIlxcdTAwMDBcIixcblx0XHQxMjdcblx0XSxcblx0W1xuXHRcdFwiODE0MVwiLFxuXHRcdFwi6rCC6rCD6rCF6rCG6rCLXCIsXG5cdFx0NCxcblx0XHRcIuqwmOqwnuqwn+qwoeqwouqwo+qwpVwiLFxuXHRcdDYsXG5cdFx0XCLqsK7qsLLqsLPqsLRcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MTYxXCIsXG5cdFx0XCLqsLXqsLbqsLfqsLrqsLvqsL3qsL7qsL/qsYFcIixcblx0XHQ5LFxuXHRcdFwi6rGM6rGOXCIsXG5cdFx0NSxcblx0XHRcIuqxlVwiXG5cdF0sXG5cdFtcblx0XHRcIjgxODFcIixcblx0XHRcIuqxluqxl+qxmeqxmuqxm+qxnVwiLFxuXHRcdDE4LFxuXHRcdFwi6rGy6rGz6rG16rG26rG56rG7XCIsXG5cdFx0NCxcblx0XHRcIuqyguqyh+qyiOqyjeqyjuqyj+qykeqykuqyk+qylVwiLFxuXHRcdDYsXG5cdFx0XCLqsp7qsqJcIixcblx0XHQ1LFxuXHRcdFwi6rKr6rKt6rKu6rKxXCIsXG5cdFx0Nixcblx0XHRcIuqyuuqyvuqyv+qzgOqzguqzg+qzheqzhuqzh+qzieqziuqzi+qzjVwiLFxuXHRcdDcsXG5cdFx0XCLqs5bqs5hcIixcblx0XHQ3LFxuXHRcdFwi6rOi6rOj6rOl6rOm6rOp6rOr6rOt6rOu6rOy6rO06rO3XCIsXG5cdFx0NCxcblx0XHRcIuqzvuqzv+q0geq0guq0g+q0heq0h1wiLFxuXHRcdDQsXG5cdFx0XCLqtI7qtJDqtJLqtJNcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MjQxXCIsXG5cdFx0XCLqtJTqtJXqtJbqtJfqtJnqtJrqtJvqtJ3qtJ7qtJ/qtKFcIixcblx0XHQ3LFxuXHRcdFwi6rSq6rSr6rSuXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI4MjYxXCIsXG5cdFx0XCLqtLbqtLfqtLnqtLrqtLvqtL1cIixcblx0XHQ2LFxuXHRcdFwi6rWG6rWI6rWKXCIsXG5cdFx0NSxcblx0XHRcIuq1keq1kuq1k+q1leq1luq1l1wiXG5cdF0sXG5cdFtcblx0XHRcIjgyODFcIixcblx0XHRcIuq1mVwiLFxuXHRcdDcsXG5cdFx0XCLqtaLqtaRcIixcblx0XHQ3LFxuXHRcdFwi6rWu6rWv6rWx6rWy6rW36rW46rW56rW66rW+6raA6raDXCIsXG5cdFx0NCxcblx0XHRcIuq2iuq2i+q2jeq2juq2j+q2kVwiLFxuXHRcdDEwLFxuXHRcdFwi6raeXCIsXG5cdFx0NSxcblx0XHRcIuq2pVwiLFxuXHRcdDE3LFxuXHRcdFwi6ra4XCIsXG5cdFx0Nyxcblx0XHRcIuq3guq3g+q3heq3huq3h+q3iVwiLFxuXHRcdDYsXG5cdFx0XCLqt5Lqt5RcIixcblx0XHQ3LFxuXHRcdFwi6red6ree6ref6reh6rei6rej6relXCIsXG5cdFx0MThcblx0XSxcblx0W1xuXHRcdFwiODM0MVwiLFxuXHRcdFwi6re66re76re96re+6riCXCIsXG5cdFx0NSxcblx0XHRcIuq4iuq4jOq4jlwiLFxuXHRcdDUsXG5cdFx0XCLquJVcIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcIjgzNjFcIixcblx0XHRcIuq4nVwiLFxuXHRcdDE4LFxuXHRcdFwi6riy6riz6ri16ri26ri56ri76ri8XCJcblx0XSxcblx0W1xuXHRcdFwiODM4MVwiLFxuXHRcdFwi6ri96ri+6ri/6rmC6rmE6rmH6rmI6rmJ6rmL6rmP6rmR6rmS6rmT6rmV6rmXXCIsXG5cdFx0NCxcblx0XHRcIuq5nuq5ouq5o+q5pOq5puq5p+q5quq5q+q5req5ruq5r+q5sVwiLFxuXHRcdDYsXG5cdFx0XCLqubrqub5cIixcblx0XHQ1LFxuXHRcdFwi6rqGXCIsXG5cdFx0NSxcblx0XHRcIuq6jVwiLFxuXHRcdDQ2LFxuXHRcdFwi6rq/6ruB6ruC6ruD6ruFXCIsXG5cdFx0Nixcblx0XHRcIuq7juq7klwiLFxuXHRcdDUsXG5cdFx0XCLqu5rqu5vqu51cIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjg0NDFcIixcblx0XHRcIuq7puq7p+q7qeq7quq7rOq7rlwiLFxuXHRcdDUsXG5cdFx0XCLqu7Xqu7bqu7fqu7nqu7rqu7vqu71cIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjg0NjFcIixcblx0XHRcIuq8huq8ieq8iuq8i+q8jOq8juq8j+q8kVwiLFxuXHRcdDE4XG5cdF0sXG5cdFtcblx0XHRcIjg0ODFcIixcblx0XHRcIuq8pFwiLFxuXHRcdDcsXG5cdFx0XCLqvK7qvK/qvLHqvLPqvLVcIixcblx0XHQ2LFxuXHRcdFwi6ry+6r2A6r2E6r2F6r2G6r2H6r2KXCIsXG5cdFx0NSxcblx0XHRcIuq9kVwiLFxuXHRcdDEwLFxuXHRcdFwi6r2eXCIsXG5cdFx0NSxcblx0XHRcIuq9plwiLFxuXHRcdDE4LFxuXHRcdFwi6r26XCIsXG5cdFx0NSxcblx0XHRcIuq+geq+guq+g+q+heq+huq+h+q+iVwiLFxuXHRcdDYsXG5cdFx0XCLqvpLqvpPqvpTqvpZcIixcblx0XHQ1LFxuXHRcdFwi6r6dXCIsXG5cdFx0MjYsXG5cdFx0XCLqvrrqvrvqvr3qvr5cIlxuXHRdLFxuXHRbXG5cdFx0XCI4NTQxXCIsXG5cdFx0XCLqvr/qv4FcIixcblx0XHQ1LFxuXHRcdFwi6r+K6r+M6r+PXCIsXG5cdFx0NCxcblx0XHRcIuq/lVwiLFxuXHRcdDYsXG5cdFx0XCLqv51cIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcIjg1NjFcIixcblx0XHRcIuq/olwiLFxuXHRcdDUsXG5cdFx0XCLqv6pcIixcblx0XHQ1LFxuXHRcdFwi6r+y6r+z6r+16r+26r+36r+5XCIsXG5cdFx0Nixcblx0XHRcIuuAguuAg1wiXG5cdF0sXG5cdFtcblx0XHRcIjg1ODFcIixcblx0XHRcIuuAhVwiLFxuXHRcdDYsXG5cdFx0XCLrgI3rgI7rgI/rgJHrgJLrgJPrgJVcIixcblx0XHQ2LFxuXHRcdFwi64CeXCIsXG5cdFx0OSxcblx0XHRcIuuAqVwiLFxuXHRcdDI2LFxuXHRcdFwi64GG64GH64GJ64GL64GN64GP64GQ64GR64GS64GW64GY64Ga64Gb64Gc64GeXCIsXG5cdFx0MjksXG5cdFx0XCLrgb7rgb/rgoHrgoLrgoPrgoVcIixcblx0XHQ2LFxuXHRcdFwi64KO64KQ64KSXCIsXG5cdFx0NSxcblx0XHRcIuuCm+uCneuCnuuCo+uCpFwiXG5cdF0sXG5cdFtcblx0XHRcIjg2NDFcIixcblx0XHRcIuuCpeuCpuuCp+uCquuCsOuCsuuCtuuCt+uCueuCuuuCu+uCvVwiLFxuXHRcdDYsXG5cdFx0XCLrg4brg4pcIixcblx0XHQ1LFxuXHRcdFwi64OSXCJcblx0XSxcblx0W1xuXHRcdFwiODY2MVwiLFxuXHRcdFwi64OT64OV64OW64OX64OZXCIsXG5cdFx0Nixcblx0XHRcIuuDoeuDouuDo+uDpOuDplwiLFxuXHRcdDEwXG5cdF0sXG5cdFtcblx0XHRcIjg2ODFcIixcblx0XHRcIuuDsVwiLFxuXHRcdDIyLFxuXHRcdFwi64SK64SN64SO64SP64SR64SU64SV64SW64SX64Sa64SeXCIsXG5cdFx0NCxcblx0XHRcIuuEpuuEp+uEqeuEquuEq+uErVwiLFxuXHRcdDYsXG5cdFx0XCLrhLbrhLpcIixcblx0XHQ1LFxuXHRcdFwi64WC64WD64WF64WG64WH64WJXCIsXG5cdFx0Nixcblx0XHRcIuuFkuuFk+uFluuFl+uFmeuFmuuFm+uFneuFnuuFn+uFoVwiLFxuXHRcdDIyLFxuXHRcdFwi64W664W764W964W+64W/64aB64aDXCIsXG5cdFx0NCxcblx0XHRcIuuGiuuGjOuGjuuGj+uGkOuGkeuGleuGluuGl+uGmeuGmuuGm+uGnVwiXG5cdF0sXG5cdFtcblx0XHRcIjg3NDFcIixcblx0XHRcIuuGnlwiLFxuXHRcdDksXG5cdFx0XCLrhqlcIixcblx0XHQxNVxuXHRdLFxuXHRbXG5cdFx0XCI4NzYxXCIsXG5cdFx0XCLrhrlcIixcblx0XHQxOCxcblx0XHRcIuuHjeuHjuuHj+uHkeuHkuuHk+uHlVwiXG5cdF0sXG5cdFtcblx0XHRcIjg3ODFcIixcblx0XHRcIuuHllwiLFxuXHRcdDUsXG5cdFx0XCLrh57rh6BcIixcblx0XHQ3LFxuXHRcdFwi64eq64er64et64eu64ev64exXCIsXG5cdFx0Nyxcblx0XHRcIuuHuuuHvOuHvlwiLFxuXHRcdDUsXG5cdFx0XCLriIbriIfriInriIrriI1cIixcblx0XHQ2LFxuXHRcdFwi64iW64iY64iaXCIsXG5cdFx0NSxcblx0XHRcIuuIoVwiLFxuXHRcdDE4LFxuXHRcdFwi64i1XCIsXG5cdFx0Nixcblx0XHRcIuuIvVwiLFxuXHRcdDI2LFxuXHRcdFwi64mZ64ma64mb64md64me64mf64mhXCIsXG5cdFx0Nixcblx0XHRcIuuJqlwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiODg0MVwiLFxuXHRcdFwi64mvXCIsXG5cdFx0NCxcblx0XHRcIuuJtlwiLFxuXHRcdDUsXG5cdFx0XCLrib1cIixcblx0XHQ2LFxuXHRcdFwi64qG64qH64qI64qKXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCI4ODYxXCIsXG5cdFx0XCLrio/ripLripPripXripbripfriptcIixcblx0XHQ0LFxuXHRcdFwi64qi64qk64qn64qo64qp64qr64qt64qu64qv64qx64qy64qz64q164q264q3XCJcblx0XSxcblx0W1xuXHRcdFwiODg4MVwiLFxuXHRcdFwi64q4XCIsXG5cdFx0MTUsXG5cdFx0XCLri4rri4vri43ri47ri4/ri5Hri5NcIixcblx0XHQ0LFxuXHRcdFwi64ua64uc64ue64uf64ug64uh64uj64un64up64uq64uw64ux64uy64u264u864u964u+64yC64yD64yF64yG64yH64yJXCIsXG5cdFx0Nixcblx0XHRcIuuMkuuMllwiLFxuXHRcdDUsXG5cdFx0XCLrjJ1cIixcblx0XHQ1NCxcblx0XHRcIuuNl+uNmeuNmuuNneuNoOuNoeuNouuNo1wiXG5cdF0sXG5cdFtcblx0XHRcIjg5NDFcIixcblx0XHRcIuuNpuuNqOuNquuNrOuNreuNr+uNsuuNs+uNteuNtuuNt+uNuVwiLFxuXHRcdDYsXG5cdFx0XCLrjoLrjoZcIixcblx0XHQ1LFxuXHRcdFwi646NXCJcblx0XSxcblx0W1xuXHRcdFwiODk2MVwiLFxuXHRcdFwi646O646P646R646S646T646VXCIsXG5cdFx0MTAsXG5cdFx0XCLrjqJcIixcblx0XHQ1LFxuXHRcdFwi646p646q646r646tXCJcblx0XSxcblx0W1xuXHRcdFwiODk4MVwiLFxuXHRcdFwi646uXCIsXG5cdFx0MjEsXG5cdFx0XCLrj4brj4frj4nrj4rrj43rj4/rj5Hrj5Lrj5Prj5brj5jrj5rrj5zrj57rj5/rj6Hrj6Lrj6Prj6Xrj6brj6frj6lcIixcblx0XHQxOCxcblx0XHRcIuuPvVwiLFxuXHRcdDE4LFxuXHRcdFwi65CRXCIsXG5cdFx0Nixcblx0XHRcIuuQmeuQmuuQm+uQneuQnuuQn+uQoVwiLFxuXHRcdDYsXG5cdFx0XCLrkKrrkKxcIixcblx0XHQ3LFxuXHRcdFwi65C1XCIsXG5cdFx0MTVcblx0XSxcblx0W1xuXHRcdFwiOGE0MVwiLFxuXHRcdFwi65GFXCIsXG5cdFx0MTAsXG5cdFx0XCLrkZLrkZPrkZXrkZbrkZfrkZlcIixcblx0XHQ2LFxuXHRcdFwi65Gi65Gk65GmXCJcblx0XSxcblx0W1xuXHRcdFwiOGE2MVwiLFxuXHRcdFwi65GnXCIsXG5cdFx0NCxcblx0XHRcIuuRrVwiLFxuXHRcdDE4LFxuXHRcdFwi65KB65KCXCJcblx0XSxcblx0W1xuXHRcdFwiOGE4MVwiLFxuXHRcdFwi65KDXCIsXG5cdFx0NCxcblx0XHRcIuuSiVwiLFxuXHRcdDE5LFxuXHRcdFwi65KeXCIsXG5cdFx0NSxcblx0XHRcIuuSpeuSpuuSp+uSqeuSquuSq+uSrVwiLFxuXHRcdDcsXG5cdFx0XCLrkrbrkrjrkrpcIixcblx0XHQ1LFxuXHRcdFwi65OB65OC65OD65OF65OG65OH65OJXCIsXG5cdFx0Nixcblx0XHRcIuuTkeuTkuuTk+uTlOuTllwiLFxuXHRcdDUsXG5cdFx0XCLrk57rk5/rk6Hrk6Lrk6Xrk6dcIixcblx0XHQ0LFxuXHRcdFwi65Ou65Ow65OyXCIsXG5cdFx0NSxcblx0XHRcIuuTuVwiLFxuXHRcdDI2LFxuXHRcdFwi65SW65SX65SZ65Sa65SdXCJcblx0XSxcblx0W1xuXHRcdFwiOGI0MVwiLFxuXHRcdFwi65SeXCIsXG5cdFx0NSxcblx0XHRcIuuUpuuUq1wiLFxuXHRcdDQsXG5cdFx0XCLrlLLrlLPrlLXrlLbrlLfrlLlcIixcblx0XHQ2LFxuXHRcdFwi65WC65WGXCJcblx0XSxcblx0W1xuXHRcdFwiOGI2MVwiLFxuXHRcdFwi65WH65WI65WJ65WK65WO65WP65WR65WS65WT65WVXCIsXG5cdFx0Nixcblx0XHRcIuuVnuuVolwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiOGI4MVwiLFxuXHRcdFwi65WrXCIsXG5cdFx0NTIsXG5cdFx0XCLrlqLrlqPrlqXrlqbrlqfrlqnrlqzrlq3rlq7rlq/rlrLrlrZcIixcblx0XHQ0LFxuXHRcdFwi65a+65a/65eB65eC65eD65eFXCIsXG5cdFx0Nixcblx0XHRcIuuXjuuXklwiLFxuXHRcdDUsXG5cdFx0XCLrl5lcIixcblx0XHQxOCxcblx0XHRcIuuXrVwiLFxuXHRcdDE4XG5cdF0sXG5cdFtcblx0XHRcIjhjNDFcIixcblx0XHRcIuuYgFwiLFxuXHRcdDE1LFxuXHRcdFwi65iS65iT65iV65iW65iX65iZXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCI4YzYxXCIsXG5cdFx0XCLrmJ5cIixcblx0XHQ2LFxuXHRcdFwi65imXCIsXG5cdFx0NSxcblx0XHRcIuuYrVwiLFxuXHRcdDYsXG5cdFx0XCLrmLVcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjhjODFcIixcblx0XHRcIuuYu1wiLFxuXHRcdDEyLFxuXHRcdFwi65mJXCIsXG5cdFx0MjYsXG5cdFx0XCLrmaXrmabrmafrmalcIixcblx0XHQ1MCxcblx0XHRcIuuanuuan+uaoeuaouuao+uapVwiLFxuXHRcdDUsXG5cdFx0XCLrmq3rmq7rmq/rmrDrmrJcIixcblx0XHQxNlxuXHRdLFxuXHRbXG5cdFx0XCI4ZDQxXCIsXG5cdFx0XCLrm4NcIixcblx0XHQxNixcblx0XHRcIuublVwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiOGQ2MVwiLFxuXHRcdFwi65ueXCIsXG5cdFx0MTcsXG5cdFx0XCLrm7Hrm7Lrm7Prm7Xrm7brm7frm7nrm7pcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZDgxXCIsXG5cdFx0XCLrm7tcIixcblx0XHQ0LFxuXHRcdFwi65yC65yD65yE65yGXCIsXG5cdFx0MzMsXG5cdFx0XCLrnKrrnKvrnK3rnK7rnLFcIixcblx0XHQ2LFxuXHRcdFwi65y665y8XCIsXG5cdFx0Nyxcblx0XHRcIuudheudhuudh+udieudiuudi+udjVwiLFxuXHRcdDYsXG5cdFx0XCLrnZZcIixcblx0XHQ5LFxuXHRcdFwi652h652i652j652l652m652n652pXCIsXG5cdFx0Nixcblx0XHRcIuudsuudtOudtlwiLFxuXHRcdDUsXG5cdFx0XCLrnb7rnb/rnoHrnoLrnoPrnoVcIixcblx0XHQ2LFxuXHRcdFwi656O656T656U656V656a656b656d656eXCJcblx0XSxcblx0W1xuXHRcdFwiOGU0MVwiLFxuXHRcdFwi656f656hXCIsXG5cdFx0Nixcblx0XHRcIuuequuerlwiLFxuXHRcdDUsXG5cdFx0XCLrnrbrnrfrnrlcIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjhlNjFcIixcblx0XHRcIuufglwiLFxuXHRcdDQsXG5cdFx0XCLrn4jrn4pcIixcblx0XHQxOVxuXHRdLFxuXHRbXG5cdFx0XCI4ZTgxXCIsXG5cdFx0XCLrn55cIixcblx0XHQxMyxcblx0XHRcIuufruufr+ufseufsuufs+uftVwiLFxuXHRcdDYsXG5cdFx0XCLrn77roIJcIixcblx0XHQ0LFxuXHRcdFwi66CK66CL66CN66CO66CP66CRXCIsXG5cdFx0Nixcblx0XHRcIuugmuugnOugnlwiLFxuXHRcdDUsXG5cdFx0XCLroKbroKfroKnroKrroKvroK1cIixcblx0XHQ2LFxuXHRcdFwi66C266C6XCIsXG5cdFx0NSxcblx0XHRcIuuhgeuhguuhg+uhhVwiLFxuXHRcdDExLFxuXHRcdFwi66GS66GUXCIsXG5cdFx0Nyxcblx0XHRcIuuhnuuhn+uhoeuhouuho+uhpVwiLFxuXHRcdDYsXG5cdFx0XCLroa7robDrobJcIixcblx0XHQ1LFxuXHRcdFwi66G566G666G766G9XCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCI4ZjQxXCIsXG5cdFx0XCLrooVcIixcblx0XHQ3LFxuXHRcdFwi66KOXCIsXG5cdFx0MTdcblx0XSxcblx0W1xuXHRcdFwiOGY2MVwiLFxuXHRcdFwi66KgXCIsXG5cdFx0Nyxcblx0XHRcIuuiqVwiLFxuXHRcdDYsXG5cdFx0XCLrorHrorLrorProrXrorbrorfrorlcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcIjhmODFcIixcblx0XHRcIuuivuuiv+ujguujhOujhlwiLFxuXHRcdDUsXG5cdFx0XCLro43ro47ro4/ro5Hro5Lro5Pro5VcIixcblx0XHQ3LFxuXHRcdFwi66Oe66Og66OiXCIsXG5cdFx0NSxcblx0XHRcIuujquujq+ujreujruujr+ujsVwiLFxuXHRcdDYsXG5cdFx0XCLro7rro7zro75cIixcblx0XHQ1LFxuXHRcdFwi66SFXCIsXG5cdFx0MTgsXG5cdFx0XCLrpJlcIixcblx0XHQ2LFxuXHRcdFwi66ShXCIsXG5cdFx0MjYsXG5cdFx0XCLrpL7rpL/rpYHrpYLrpYPrpYVcIixcblx0XHQ2LFxuXHRcdFwi66WN66WO66WQ66WSXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI5MDQxXCIsXG5cdFx0XCLrpZrrpZvrpZ3rpZ7rpZ/rpaFcIixcblx0XHQ2LFxuXHRcdFwi66Wq66Ws66WuXCIsXG5cdFx0NSxcblx0XHRcIuultuult+ulueuluuulu+ulvVwiXG5cdF0sXG5cdFtcblx0XHRcIjkwNjFcIixcblx0XHRcIuulvlwiLFxuXHRcdDUsXG5cdFx0XCLrpobrpojrpovrpozrpo9cIixcblx0XHQxNVxuXHRdLFxuXHRbXG5cdFx0XCI5MDgxXCIsXG5cdFx0XCLrpp9cIixcblx0XHQxMixcblx0XHRcIuumruumr+umseumsuums+umtVwiLFxuXHRcdDYsXG5cdFx0XCLrpr7rp4Drp4JcIixcblx0XHQ1LFxuXHRcdFwi66eK66eL66eN66eTXCIsXG5cdFx0NCxcblx0XHRcIuunmuunnOunn+unoOunouunpuunp+unqeunquunq+unrVwiLFxuXHRcdDYsXG5cdFx0XCLrp7brp7tcIixcblx0XHQ0LFxuXHRcdFwi66iCXCIsXG5cdFx0NSxcblx0XHRcIuuoiVwiLFxuXHRcdDExLFxuXHRcdFwi66iWXCIsXG5cdFx0MzMsXG5cdFx0XCLrqLrrqLvrqL3rqL7rqL/rqYHrqYPrqYTrqYXrqYZcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MTQxXCIsXG5cdFx0XCLrqYfrqYrrqYzrqY/rqZDrqZHrqZLrqZbrqZfrqZnrqZrrqZvrqZ1cIixcblx0XHQ2LFxuXHRcdFwi66mm66mqXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI5MTYxXCIsXG5cdFx0XCLrqbLrqbPrqbXrqbbrqbfrqblcIixcblx0XHQ5LFxuXHRcdFwi66qG66qI66qJ66qK66qL66qNXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI5MTgxXCIsXG5cdFx0XCLrqpNcIixcblx0XHQyMCxcblx0XHRcIuuqquuqreuqruuqr+uqseuqs1wiLFxuXHRcdDQsXG5cdFx0XCLrqrrrqrzrqr5cIixcblx0XHQ1LFxuXHRcdFwi66uF66uG66uH66uJXCIsXG5cdFx0MTQsXG5cdFx0XCLrq5pcIixcblx0XHQzMyxcblx0XHRcIuurveurvuurv+usgeusguusg+ushVwiLFxuXHRcdDcsXG5cdFx0XCLrrI7rrJDrrJJcIixcblx0XHQ1LFxuXHRcdFwi66yZ66ya66yb66yd66ye66yf66yhXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCI5MjQxXCIsXG5cdFx0XCLrrKjrrKrrrKxcIixcblx0XHQ3LFxuXHRcdFwi66y366y566y666y/XCIsXG5cdFx0NCxcblx0XHRcIuuthuutiOutiuuti+utjOutjuutkeutklwiXG5cdF0sXG5cdFtcblx0XHRcIjkyNjFcIixcblx0XHRcIuutk+utleutluutl+utmVwiLFxuXHRcdDcsXG5cdFx0XCLrraLrraRcIixcblx0XHQ3LFxuXHRcdFwi662tXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCI5MjgxXCIsXG5cdFx0XCLrrbJcIixcblx0XHQyMSxcblx0XHRcIuuuieuuiuuui+uujeuujuuuj+uukVwiLFxuXHRcdDE4LFxuXHRcdFwi666l666m666n666p666q666r666tXCIsXG5cdFx0Nixcblx0XHRcIuuuteuutuuuuFwiLFxuXHRcdDcsXG5cdFx0XCLrr4Hrr4Lrr4Prr4Xrr4brr4frr4lcIixcblx0XHQ2LFxuXHRcdFwi66+R66+S66+UXCIsXG5cdFx0MzUsXG5cdFx0XCLrr7rrr7vrr73rr77rsIFcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MzQxXCIsXG5cdFx0XCLrsINcIixcblx0XHQ0LFxuXHRcdFwi67CK67CO67CQ67CS67CT67CZ67Ca67Cg67Ch67Ci67Cj67Cm67Co67Cq67Cr67Cs67Cu67Cv67Cy67Cz67C1XCJcblx0XSxcblx0W1xuXHRcdFwiOTM2MVwiLFxuXHRcdFwi67C267C367C5XCIsXG5cdFx0Nixcblx0XHRcIuuxguuxhuuxh+uxiOuxiuuxi+uxjuuxj+uxkVwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiOTM4MVwiLFxuXHRcdFwi67Ga67Gb67Gc67GeXCIsXG5cdFx0MzcsXG5cdFx0XCLrsobrsofrsonrsorrso3rso9cIixcblx0XHQ0LFxuXHRcdFwi67KW67KY67KbXCIsXG5cdFx0NCxcblx0XHRcIuuyouuyo+uypeuypuuyqVwiLFxuXHRcdDYsXG5cdFx0XCLrsrLrsrZcIixcblx0XHQ1LFxuXHRcdFwi67K+67K/67OB67OC67OD67OFXCIsXG5cdFx0Nyxcblx0XHRcIuuzjuuzkuuzk+uzlOuzluuzl+uzmeuzmuuzm+uznVwiLFxuXHRcdDIyLFxuXHRcdFwi67O367O567O667O767O9XCJcblx0XSxcblx0W1xuXHRcdFwiOTQ0MVwiLFxuXHRcdFwi67O+XCIsXG5cdFx0NSxcblx0XHRcIuu0huu0iOu0ilwiLFxuXHRcdDUsXG5cdFx0XCLrtJHrtJLrtJPrtJVcIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjk0NjFcIixcblx0XHRcIuu0nlwiLFxuXHRcdDUsXG5cdFx0XCLrtKVcIixcblx0XHQ2LFxuXHRcdFwi67StXCIsXG5cdFx0MTJcblx0XSxcblx0W1xuXHRcdFwiOTQ4MVwiLFxuXHRcdFwi67S6XCIsXG5cdFx0NSxcblx0XHRcIuu1gVwiLFxuXHRcdDYsXG5cdFx0XCLrtYrrtYvrtY3rtY7rtY/rtZFcIixcblx0XHQ2LFxuXHRcdFwi67WaXCIsXG5cdFx0OSxcblx0XHRcIuu1peu1puu1p+u1qVwiLFxuXHRcdDIyLFxuXHRcdFwi67aC67aD67aF67aG67aLXCIsXG5cdFx0NCxcblx0XHRcIuu2kuu2lOu2luu2l+u2mOu2m+u2nVwiLFxuXHRcdDYsXG5cdFx0XCLrtqVcIixcblx0XHQxMCxcblx0XHRcIuu2sVwiLFxuXHRcdDYsXG5cdFx0XCLrtrlcIixcblx0XHQyNFxuXHRdLFxuXHRbXG5cdFx0XCI5NTQxXCIsXG5cdFx0XCLrt5Lrt5Prt5brt5frt5nrt5rrt5vrt51cIixcblx0XHQxMSxcblx0XHRcIuu3qlwiLFxuXHRcdDUsXG5cdFx0XCLrt7FcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NTYxXCIsXG5cdFx0XCLrt7Lrt7Prt7Xrt7brt7frt7lcIixcblx0XHQ2LFxuXHRcdFwi67iB67iC67iE67iGXCIsXG5cdFx0NSxcblx0XHRcIuu4juu4j+u4keu4kuu4k1wiXG5cdF0sXG5cdFtcblx0XHRcIjk1ODFcIixcblx0XHRcIuu4lVwiLFxuXHRcdDYsXG5cdFx0XCLruJ7ruKBcIixcblx0XHQzNSxcblx0XHRcIuu5huu5h+u5ieu5iuu5i+u5jeu5j1wiLFxuXHRcdDQsXG5cdFx0XCLruZbruZjruZzruZ3ruZ7ruZ/ruaLruaPruaXruabruafruanruatcIixcblx0XHQ0LFxuXHRcdFwi67my67m2XCIsXG5cdFx0NCxcblx0XHRcIuu5vuu5v+u6geu6guu6g+u6hVwiLFxuXHRcdDYsXG5cdFx0XCLruo7rupJcIixcblx0XHQ1LFxuXHRcdFwi67qaXCIsXG5cdFx0MTMsXG5cdFx0XCLruqlcIixcblx0XHQxNFxuXHRdLFxuXHRbXG5cdFx0XCI5NjQxXCIsXG5cdFx0XCLrurhcIixcblx0XHQyMyxcblx0XHRcIuu7kuu7k1wiXG5cdF0sXG5cdFtcblx0XHRcIjk2NjFcIixcblx0XHRcIuu7leu7luu7mVwiLFxuXHRcdDYsXG5cdFx0XCLru6Hru6Lru6ZcIixcblx0XHQ1LFxuXHRcdFwi67utXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI5NjgxXCIsXG5cdFx0XCLru7ZcIixcblx0XHQxMCxcblx0XHRcIuu8glwiLFxuXHRcdDUsXG5cdFx0XCLrvIpcIixcblx0XHQxMyxcblx0XHRcIuu8muu8nlwiLFxuXHRcdDMzLFxuXHRcdFwi672C672D672F672G672H672JXCIsXG5cdFx0Nixcblx0XHRcIuu9kuu9k+u9lOu9llwiLFxuXHRcdDQ0XG5cdF0sXG5cdFtcblx0XHRcIjk3NDFcIixcblx0XHRcIuu+g1wiLFxuXHRcdDE2LFxuXHRcdFwi676VXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI5NzYxXCIsXG5cdFx0XCLrvp5cIixcblx0XHQxNyxcblx0XHRcIuu+sVwiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiOTc4MVwiLFxuXHRcdFwi6765XCIsXG5cdFx0MTEsXG5cdFx0XCLrv4ZcIixcblx0XHQ1LFxuXHRcdFwi67+O67+P67+R67+S67+T67+VXCIsXG5cdFx0Nixcblx0XHRcIuu/neu/nuu/oOu/olwiLFxuXHRcdDg5LFxuXHRcdFwi7IC97IC+7IC/XCJcblx0XSxcblx0W1xuXHRcdFwiOTg0MVwiLFxuXHRcdFwi7IGAXCIsXG5cdFx0MTYsXG5cdFx0XCLsgZJcIixcblx0XHQ1LFxuXHRcdFwi7IGZ7IGa7IGbXCJcblx0XSxcblx0W1xuXHRcdFwiOTg2MVwiLFxuXHRcdFwi7IGd7IGe7IGf7IGhXCIsXG5cdFx0Nixcblx0XHRcIuyBqlwiLFxuXHRcdDE1XG5cdF0sXG5cdFtcblx0XHRcIjk4ODFcIixcblx0XHRcIuyBulwiLFxuXHRcdDIxLFxuXHRcdFwi7IKS7IKT7IKV7IKW7IKX7IKZXCIsXG5cdFx0Nixcblx0XHRcIuyCouyCpOyCplwiLFxuXHRcdDUsXG5cdFx0XCLsgq7sgrHsgrLsgrdcIixcblx0XHQ0LFxuXHRcdFwi7IK+7IOC7IOD7IOE7IOG7IOH7IOK7IOL7ION7IOO7IOP7IORXCIsXG5cdFx0Nixcblx0XHRcIuyDmuyDnlwiLFxuXHRcdDUsXG5cdFx0XCLsg6bsg6fsg6nsg6rsg6vsg61cIixcblx0XHQ2LFxuXHRcdFwi7IO27IO47IO6XCIsXG5cdFx0NSxcblx0XHRcIuyEgeyEguyEg+yEheyEhuyEh+yEiVwiLFxuXHRcdDYsXG5cdFx0XCLshJHshJLshJPshJTshJZcIixcblx0XHQ1LFxuXHRcdFwi7ISh7ISi7ISl7ISo7ISp7ISq7ISr7ISuXCJcblx0XSxcblx0W1xuXHRcdFwiOTk0MVwiLFxuXHRcdFwi7ISy7ISz7IS07IS17IS37IS67IS77IS97IS+7IS/7IWBXCIsXG5cdFx0Nixcblx0XHRcIuyFiuyFjlwiLFxuXHRcdDUsXG5cdFx0XCLshZbshZdcIlxuXHRdLFxuXHRbXG5cdFx0XCI5OTYxXCIsXG5cdFx0XCLshZnshZrshZvshZ1cIixcblx0XHQ2LFxuXHRcdFwi7IWm7IWqXCIsXG5cdFx0NSxcblx0XHRcIuyFseyFsuyFs+yFteyFtuyFt+yFueyFuuyFu1wiXG5cdF0sXG5cdFtcblx0XHRcIjk5ODFcIixcblx0XHRcIuyFvFwiLFxuXHRcdDgsXG5cdFx0XCLshoZcIixcblx0XHQ1LFxuXHRcdFwi7IaP7IaR7IaS7IaT7IaV7IaXXCIsXG5cdFx0NCxcblx0XHRcIuyGnuyGoOyGouyGo+yGpOyGpuyGp+yGquyGq+yGreyGruyGr+yGsVwiLFxuXHRcdDExLFxuXHRcdFwi7Ia+XCIsXG5cdFx0NSxcblx0XHRcIuyHheyHhuyHh+yHieyHiuyHi+yHjVwiLFxuXHRcdDYsXG5cdFx0XCLsh5Xsh5bsh5lcIixcblx0XHQ2LFxuXHRcdFwi7Ieh7Iei7Iej7Iel7Iem7Ien7IepXCIsXG5cdFx0Nixcblx0XHRcIuyHsuyHtFwiLFxuXHRcdDcsXG5cdFx0XCLsh77sh7/siIHsiILsiIPsiIVcIixcblx0XHQ2LFxuXHRcdFwi7IiO7IiQ7IiSXCIsXG5cdFx0NSxcblx0XHRcIuyImuyIm+yIneyInuyIoeyIouyIo1wiXG5cdF0sXG5cdFtcblx0XHRcIjlhNDFcIixcblx0XHRcIuyIpOyIpeyIpuyIp+yIquyIrOyIruyIsOyIs+yItVwiLFxuXHRcdDE2XG5cdF0sXG5cdFtcblx0XHRcIjlhNjFcIixcblx0XHRcIuyJhuyJh+yJiVwiLFxuXHRcdDYsXG5cdFx0XCLsiZLsiZPsiZXsiZbsiZfsiZlcIixcblx0XHQ2LFxuXHRcdFwi7Imh7Imi7Imj7Imk7ImmXCJcblx0XSxcblx0W1xuXHRcdFwiOWE4MVwiLFxuXHRcdFwi7ImnXCIsXG5cdFx0NCxcblx0XHRcIuyJruyJr+yJseyJsuyJs+yJtVwiLFxuXHRcdDYsXG5cdFx0XCLsib7sioDsioJcIixcblx0XHQ1LFxuXHRcdFwi7IqKXCIsXG5cdFx0NSxcblx0XHRcIuyKkVwiLFxuXHRcdDYsXG5cdFx0XCLsipnsiprsipzsip5cIixcblx0XHQ1LFxuXHRcdFwi7Iqm7Iqn7Iqp7Iqq7Iqr7IquXCIsXG5cdFx0NSxcblx0XHRcIuyKtuyKuOyKulwiLFxuXHRcdDMzLFxuXHRcdFwi7Iue7Iuf7Iuh7Iui7IulXCIsXG5cdFx0NSxcblx0XHRcIuyLruyLsOyLsuyLs+yLtOyLteyLt+yLuuyLveyLvuyLv+yMgVwiLFxuXHRcdDYsXG5cdFx0XCLsjIrsjIvsjI7sjI9cIlxuXHRdLFxuXHRbXG5cdFx0XCI5YjQxXCIsXG5cdFx0XCLsjJDsjJHsjJLsjJbsjJfsjJnsjJrsjJvsjJ1cIixcblx0XHQ2LFxuXHRcdFwi7Iym7Iyn7IyqXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI5YjYxXCIsXG5cdFx0XCLsjLNcIixcblx0XHQxNyxcblx0XHRcIuyNhlwiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiOWI4MVwiLFxuXHRcdFwi7I2OXCIsXG5cdFx0MjUsXG5cdFx0XCLsjarsjavsja3sja7sja/sjbHsjbNcIixcblx0XHQ0LFxuXHRcdFwi7I267I277I2+XCIsXG5cdFx0NSxcblx0XHRcIuyOheyOhuyOh+yOieyOiuyOi+yOjVwiLFxuXHRcdDUwLFxuXHRcdFwi7I+BXCIsXG5cdFx0MjIsXG5cdFx0XCLsj5pcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YzQxXCIsXG5cdFx0XCLsj5vsj53sj57sj6Hsj6NcIixcblx0XHQ0LFxuXHRcdFwi7I+q7I+r7I+s7I+uXCIsXG5cdFx0NSxcblx0XHRcIuyPtuyPt+yPuVwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiOWM2MVwiLFxuXHRcdFwi7I+/XCIsXG5cdFx0OCxcblx0XHRcIuyQiVwiLFxuXHRcdDYsXG5cdFx0XCLskJFcIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcIjljODFcIixcblx0XHRcIuyQm1wiLFxuXHRcdDgsXG5cdFx0XCLskKVcIixcblx0XHQ2LFxuXHRcdFwi7JCt7JCu7JCv7JCx7JCy7JCz7JC1XCIsXG5cdFx0Nixcblx0XHRcIuyQvlwiLFxuXHRcdDksXG5cdFx0XCLskYlcIixcblx0XHQyNixcblx0XHRcIuyRpuyRp+yRqeyRquyRq+yRrVwiLFxuXHRcdDYsXG5cdFx0XCLskbbskbfskbjskbpcIixcblx0XHQ1LFxuXHRcdFwi7JKBXCIsXG5cdFx0MTgsXG5cdFx0XCLskpVcIixcblx0XHQ2LFxuXHRcdFwi7JKdXCIsXG5cdFx0MTJcblx0XSxcblx0W1xuXHRcdFwiOWQ0MVwiLFxuXHRcdFwi7JKqXCIsXG5cdFx0MTMsXG5cdFx0XCLskrnskrrskrvskr1cIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjlkNjFcIixcblx0XHRcIuyThlwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcIjlkODFcIixcblx0XHRcIuyToFwiLFxuXHRcdDgsXG5cdFx0XCLsk6pcIixcblx0XHQ1LFxuXHRcdFwi7JOy7JOz7JO17JO27JO37JO57JO77JO87JO97JO+7JSCXCIsXG5cdFx0OSxcblx0XHRcIuyUjeyUjuyUj+yUkeyUkuyUk+yUlVwiLFxuXHRcdDYsXG5cdFx0XCLslJ1cIixcblx0XHQxMCxcblx0XHRcIuyUquyUq+yUreyUruyUr+yUsVwiLFxuXHRcdDYsXG5cdFx0XCLslLrslLzslL5cIixcblx0XHQ1LFxuXHRcdFwi7JWG7JWH7JWL7JWP7JWQ7JWR7JWS7JWW7JWa7JWb7JWc7JWf7JWi7JWj7JWl7JWm7JWn7JWpXCIsXG5cdFx0Nixcblx0XHRcIuyVsuyVtlwiLFxuXHRcdDUsXG5cdFx0XCLslb7slb/sloHsloLsloPsloXslobslojslonslorslovslo7slpDslpLslpPslpRcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZTQxXCIsXG5cdFx0XCLslpbslpnslprslpvslp3slp7slp/slqFcIixcblx0XHQ3LFxuXHRcdFwi7JaqXCIsXG5cdFx0OSxcblx0XHRcIuyWtlwiXG5cdF0sXG5cdFtcblx0XHRcIjllNjFcIixcblx0XHRcIuyWt+yWuuyWv1wiLFxuXHRcdDQsXG5cdFx0XCLsl4vsl43sl4/sl5Lsl5Psl5Xsl5bsl5fsl5lcIixcblx0XHQ2LFxuXHRcdFwi7Jei7Jek7Jem7JenXCJcblx0XSxcblx0W1xuXHRcdFwiOWU4MVwiLFxuXHRcdFwi7Jeo7Jep7Jeq7Jer7Jev7Jex7Jey7Jez7Je17Je47Je57Je67Je77JiC7JiD7JiE7JiJ7JiK7JiL7JiN7JiO7JiP7JiRXCIsXG5cdFx0Nixcblx0XHRcIuyYmuyYnVwiLFxuXHRcdDYsXG5cdFx0XCLsmKbsmKfsmKnsmKrsmKvsmK/smLHsmLLsmLbsmLjsmLrsmLzsmL3smL7smL/smYLsmYPsmYXsmYbsmYfsmYlcIixcblx0XHQ2LFxuXHRcdFwi7JmS7JmWXCIsXG5cdFx0NSxcblx0XHRcIuyZnuyZn+yZoVwiLFxuXHRcdDEwLFxuXHRcdFwi7Jmt7Jmu7Jmw7JmyXCIsXG5cdFx0NSxcblx0XHRcIuyZuuyZu+yZveyZvuyZv+yagVwiLFxuXHRcdDYsXG5cdFx0XCLsmorsmozsmo5cIixcblx0XHQ1LFxuXHRcdFwi7JqW7JqX7JqZ7Jqa7Jqb7JqdXCIsXG5cdFx0Nixcblx0XHRcIuyaplwiXG5cdF0sXG5cdFtcblx0XHRcIjlmNDFcIixcblx0XHRcIuyaqOyaqlwiLFxuXHRcdDUsXG5cdFx0XCLsmrLsmrPsmrXsmrbsmrfsmrtcIixcblx0XHQ0LFxuXHRcdFwi7JuC7JuE7JuGXCIsXG5cdFx0NSxcblx0XHRcIuybjlwiXG5cdF0sXG5cdFtcblx0XHRcIjlmNjFcIixcblx0XHRcIuybj+ybkeybkuybk+yblVwiLFxuXHRcdDYsXG5cdFx0XCLsm57sm5/sm6JcIixcblx0XHQ1LFxuXHRcdFwi7Juq7Jur7Jut7Juu7Juv7Jux7JuyXCJcblx0XSxcblx0W1xuXHRcdFwiOWY4MVwiLFxuXHRcdFwi7JuzXCIsXG5cdFx0NCxcblx0XHRcIuybuuybu+ybvOybvlwiLFxuXHRcdDUsXG5cdFx0XCLsnIbsnIfsnInsnIrsnIvsnI1cIixcblx0XHQ2LFxuXHRcdFwi7JyW7JyY7JyaXCIsXG5cdFx0NSxcblx0XHRcIuycouyco+ycpeycpuycp+ycqVwiLFxuXHRcdDYsXG5cdFx0XCLsnLLsnLTsnLbsnLjsnLnsnLrsnLvsnL7snL/snYHsnYLsnYPsnYVcIixcblx0XHQ0LFxuXHRcdFwi7J2L7J2O7J2Q7J2Z7J2a7J2b7J2d7J2e7J2f7J2hXCIsXG5cdFx0Nixcblx0XHRcIuydqeydquydrFwiLFxuXHRcdDcsXG5cdFx0XCLsnbbsnbfsnbnsnbrsnbvsnb/snoDsnoHsnoLsnobsnovsnozsno3sno/snpLsnpPsnpXsnpnsnptcIixcblx0XHQ0LFxuXHRcdFwi7J6i7J6nXCIsXG5cdFx0NCxcblx0XHRcIuyeruyer+yeseyesuyes+yeteyetuyet1wiXG5cdF0sXG5cdFtcblx0XHRcImEwNDFcIixcblx0XHRcIuyeuOyeueyeuuyeu+yevuyfglwiLFxuXHRcdDUsXG5cdFx0XCLsn4rsn4vsn43sn4/sn5FcIixcblx0XHQ2LFxuXHRcdFwi7J+Z7J+a7J+b7J+cXCJcblx0XSxcblx0W1xuXHRcdFwiYTA2MVwiLFxuXHRcdFwi7J+eXCIsXG5cdFx0NSxcblx0XHRcIuyfpeyfpuyfp+yfqeyfquyfq+yfrVwiLFxuXHRcdDEzXG5cdF0sXG5cdFtcblx0XHRcImEwODFcIixcblx0XHRcIuyfu1wiLFxuXHRcdDQsXG5cdFx0XCLsoILsoIPsoIXsoIbsoIfsoInsoItcIixcblx0XHQ0LFxuXHRcdFwi7KCS7KCU7KCXXCIsXG5cdFx0NCxcblx0XHRcIuygnuygn+ygoeygouygo+ygpVwiLFxuXHRcdDYsXG5cdFx0XCLsoK7soLDsoLJcIixcblx0XHQ1LFxuXHRcdFwi7KC57KC67KC77KC97KC+7KC/7KGBXCIsXG5cdFx0Nixcblx0XHRcIuyhiuyhi+yhjlwiLFxuXHRcdDUsXG5cdFx0XCLsoZVcIixcblx0XHQyNixcblx0XHRcIuyhsuyhs+yhteyhtuyht+yhueyhu1wiLFxuXHRcdDQsXG5cdFx0XCLsooLsooTsoojsoonsoorsoo5cIixcblx0XHQ1LFxuXHRcdFwi7KKVXCIsXG5cdFx0Nyxcblx0XHRcIuyinuyioOyiouyio+yipFwiXG5cdF0sXG5cdFtcblx0XHRcImExNDFcIixcblx0XHRcIuyipeyipuyip+yiqVwiLFxuXHRcdDE4LFxuXHRcdFwi7KK+7KK/7KOA7KOBXCJcblx0XSxcblx0W1xuXHRcdFwiYTE2MVwiLFxuXHRcdFwi7KOC7KOD7KOF7KOG7KOH7KOJ7KOK7KOL7KONXCIsXG5cdFx0Nixcblx0XHRcIuyjluyjmOyjmlwiLFxuXHRcdDUsXG5cdFx0XCLso6Lso6Pso6VcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMTgxXCIsXG5cdFx0XCLso6ZcIixcblx0XHQxNCxcblx0XHRcIuyjtlwiLFxuXHRcdDUsXG5cdFx0XCLso77so7/spIHspILspIPspIdcIixcblx0XHQ0LFxuXHRcdFwi7KSO44CA44CB44CCwrfigKXigKbCqOOAg8Kt4oCV4oil77y84oi84oCY4oCZ4oCc4oCd44CU44CV44CIXCIsXG5cdFx0OSxcblx0XHRcIsKxw5fDt+KJoOKJpOKJpeKInuKItMKw4oCy4oCz4oSD4oSr77+g77+h77+l4pmC4pmA4oig4oql4oyS4oiC4oiH4omh4omSwqfigLvimIbimIXil4vil4/il47il4fil4bilqHilqDilrPilrLilr3ilrzihpLihpDihpHihpPihpTjgJPiiariiaviiJriiL3iiJ3iiLXiiKviiKziiIjiiIviiobiiofiioLiioPiiKriiKniiKfiiKjvv6JcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMjQxXCIsXG5cdFx0XCLspJDspJJcIixcblx0XHQ1LFxuXHRcdFwi7KSZXCIsXG5cdFx0MThcblx0XSxcblx0W1xuXHRcdFwiYTI2MVwiLFxuXHRcdFwi7KStXCIsXG5cdFx0Nixcblx0XHRcIuyktVwiLFxuXHRcdDE4XG5cdF0sXG5cdFtcblx0XHRcImEyODFcIixcblx0XHRcIuyliFwiLFxuXHRcdDcsXG5cdFx0XCLspZLspZPspZXspZbspZfspZlcIixcblx0XHQ2LFxuXHRcdFwi7KWi7KWkXCIsXG5cdFx0Nyxcblx0XHRcIuylreylruylr+KHkuKHlOKIgOKIg8K0772ey4fLmMudy5rLmcK4y5vCocK/y5DiiK7iiJHiiI/CpOKEieKAsOKXgeKXgOKWt+KWtuKZpOKZoOKZoeKZpeKZp+KZo+KKmeKXiOKWo+KXkOKXkeKWkuKWpOKWpeKWqOKWp+KWpuKWqeKZqOKYj+KYjuKYnOKYnsK24oCg4oCh4oaV4oaX4oaZ4oaW4oaY4pmt4pmp4pmq4pms44m/44ic4oSW44+H4oSi44+C44+Y4oSh4oKswq5cIlxuXHRdLFxuXHRbXG5cdFx0XCJhMzQxXCIsXG5cdFx0XCLspbHspbLspbPspbVcIixcblx0XHQ2LFxuXHRcdFwi7KW9XCIsXG5cdFx0MTAsXG5cdFx0XCLsporspovspo3spo7spo9cIlxuXHRdLFxuXHRbXG5cdFx0XCJhMzYxXCIsXG5cdFx0XCLsppFcIixcblx0XHQ2LFxuXHRcdFwi7Kaa7Kac7KaeXCIsXG5cdFx0MTZcblx0XSxcblx0W1xuXHRcdFwiYTM4MVwiLFxuXHRcdFwi7KavXCIsXG5cdFx0MTYsXG5cdFx0XCLsp4Lsp4Psp4Xsp4bsp4nsp4tcIixcblx0XHQ0LFxuXHRcdFwi7KeS7KeU7KeX7KeY7Keb77yBXCIsXG5cdFx0NTgsXG5cdFx0XCLvv6bvvL1cIixcblx0XHQzMixcblx0XHRcIu+/o1wiXG5cdF0sXG5cdFtcblx0XHRcImE0NDFcIixcblx0XHRcIuynnuynn+ynoeyno+ynpeynpuynqOynqeynquynq+ynruynslwiLFxuXHRcdDUsXG5cdFx0XCLsp7rsp7vsp73sp77sp7/sqIHsqILsqIPsqIRcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNDYxXCIsXG5cdFx0XCLsqIXsqIbsqIfsqIrsqI5cIixcblx0XHQ1LFxuXHRcdFwi7KiV7KiW7KiX7KiZXCIsXG5cdFx0MTJcblx0XSxcblx0W1xuXHRcdFwiYTQ4MVwiLFxuXHRcdFwi7Kim7Kin7Kio7KiqXCIsXG5cdFx0MjgsXG5cdFx0XCLjhLFcIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJhNTQxXCIsXG5cdFx0XCLsqYdcIixcblx0XHQ0LFxuXHRcdFwi7KmO7KmP7KmR7KmS7KmT7KmVXCIsXG5cdFx0Nixcblx0XHRcIuypnuypolwiLFxuXHRcdDUsXG5cdFx0XCLsqansqapcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNTYxXCIsXG5cdFx0XCLsqatcIixcblx0XHQxNyxcblx0XHRcIuypvlwiLFxuXHRcdDUsXG5cdFx0XCLsqoXsqoZcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNTgxXCIsXG5cdFx0XCLsqodcIixcblx0XHQxNixcblx0XHRcIuyqmVwiLFxuXHRcdDE0LFxuXHRcdFwi4oWwXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCJhNWIwXCIsXG5cdFx0XCLihaBcIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcImE1YzFcIixcblx0XHRcIs6RXCIsXG5cdFx0MTYsXG5cdFx0XCLOo1wiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiYTVlMVwiLFxuXHRcdFwizrFcIixcblx0XHQxNixcblx0XHRcIs+DXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJhNjQxXCIsXG5cdFx0XCLsqqhcIixcblx0XHQxOSxcblx0XHRcIuyqvuyqv+yrgeyrguyrg+yrhVwiXG5cdF0sXG5cdFtcblx0XHRcImE2NjFcIixcblx0XHRcIuyrhlwiLFxuXHRcdDUsXG5cdFx0XCLsq47sq5Dsq5Lsq5Tsq5Xsq5bsq5fsq5pcIixcblx0XHQ1LFxuXHRcdFwi7KuhXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJhNjgxXCIsXG5cdFx0XCLsq6jsq6nsq6rsq6vsq61cIixcblx0XHQ2LFxuXHRcdFwi7Ku1XCIsXG5cdFx0MTgsXG5cdFx0XCLsrInsrIrilIDilILilIzilJDilJjilJTilJzilKzilKTilLTilLzilIHilIPilI/ilJPilJvilJfilKPilLPilKvilLvilYvilKDilK/ilKjilLfilL/ilJ3ilLDilKXilLjilYLilJLilJHilJrilJnilJbilJXilI7ilI3ilJ7ilJ/ilKHilKLilKbilKfilKnilKrilK3ilK7ilLHilLLilLXilLbilLnilLrilL3ilL7ilYDilYHilYNcIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcImE3NDFcIixcblx0XHRcIuysi1wiLFxuXHRcdDQsXG5cdFx0XCLsrJHsrJLsrJPsrJXsrJbsrJfsrJlcIixcblx0XHQ2LFxuXHRcdFwi7KyiXCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCJhNzYxXCIsXG5cdFx0XCLsrKpcIixcblx0XHQyMixcblx0XHRcIuytguytg+ythFwiXG5cdF0sXG5cdFtcblx0XHRcImE3ODFcIixcblx0XHRcIuytheythuyth+ytiuyti+ytjeytjuytj+ytkVwiLFxuXHRcdDYsXG5cdFx0XCLsrZrsrZvsrZzsrZ5cIixcblx0XHQ1LFxuXHRcdFwi7K2lXCIsXG5cdFx0Nyxcblx0XHRcIuOOleOOluOOl+KEk+OOmOOPhOOOo+OOpOOOpeOOpuOOmVwiLFxuXHRcdDksXG5cdFx0XCLjj4rjjo3jjo7jjo/jj4/jjojjjonjj4jjjqfjjqjjjrBcIixcblx0XHQ5LFxuXHRcdFwi446AXCIsXG5cdFx0NCxcblx0XHRcIuOOulwiLFxuXHRcdDUsXG5cdFx0XCLjjpBcIixcblx0XHQ0LFxuXHRcdFwi4oSm44+A44+B446K446L446M44+W44+F446t446u446v44+b446p446q446r446s44+d44+Q44+T44+D44+J44+c44+GXCJcblx0XSxcblx0W1xuXHRcdFwiYTg0MVwiLFxuXHRcdFwi7K2tXCIsXG5cdFx0MTAsXG5cdFx0XCLsrbpcIixcblx0XHQxNFxuXHRdLFxuXHRbXG5cdFx0XCJhODYxXCIsXG5cdFx0XCLsrolcIixcblx0XHQxOCxcblx0XHRcIuyunVwiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiYTg4MVwiLFxuXHRcdFwi7K6kXCIsXG5cdFx0MTksXG5cdFx0XCLsrrlcIixcblx0XHQxMSxcblx0XHRcIsOGw5DCqsSmXCJcblx0XSxcblx0W1xuXHRcdFwiYThhNlwiLFxuXHRcdFwixLJcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOGE4XCIsXG5cdFx0XCLEv8WBw5jFksK6w57FpsWKXCJcblx0XSxcblx0W1xuXHRcdFwiYThiMVwiLFxuXHRcdFwi44mgXCIsXG5cdFx0MjcsXG5cdFx0XCLik5BcIixcblx0XHQyNSxcblx0XHRcIuKRoFwiLFxuXHRcdDE0LFxuXHRcdFwiwr3ihZPihZTCvMK+4oWb4oWc4oWd4oWeXCJcblx0XSxcblx0W1xuXHRcdFwiYTk0MVwiLFxuXHRcdFwi7K+FXCIsXG5cdFx0MTQsXG5cdFx0XCLsr5VcIixcblx0XHQxMFxuXHRdLFxuXHRbXG5cdFx0XCJhOTYxXCIsXG5cdFx0XCLsr6Dsr6Hsr6Lsr6Psr6Xsr6bsr6jsr6pcIixcblx0XHQxOFxuXHRdLFxuXHRbXG5cdFx0XCJhOTgxXCIsXG5cdFx0XCLsr71cIixcblx0XHQxNCxcblx0XHRcIuywjuywj+ywkeywkuywk+ywlVwiLFxuXHRcdDYsXG5cdFx0XCLssJ7ssJ/ssKDssKPssKTDpsSRw7DEp8SxxLPEuMWAxYLDuMWTw5/DvsWnxYvFieOIgFwiLFxuXHRcdDI3LFxuXHRcdFwi4pKcXCIsXG5cdFx0MjUsXG5cdFx0XCLikbRcIixcblx0XHQxNCxcblx0XHRcIsK5wrLCs+KBtOKBv+KCgeKCguKCg+KChFwiXG5cdF0sXG5cdFtcblx0XHRcImFhNDFcIixcblx0XHRcIuywpeywpuywquywq+ywreywr+ywsVwiLFxuXHRcdDYsXG5cdFx0XCLssLrssL9cIixcblx0XHQ0LFxuXHRcdFwi7LGG7LGH7LGJ7LGK7LGL7LGN7LGOXCJcblx0XSxcblx0W1xuXHRcdFwiYWE2MVwiLFxuXHRcdFwi7LGPXCIsXG5cdFx0NCxcblx0XHRcIuyxluyxmlwiLFxuXHRcdDUsXG5cdFx0XCLssaHssaLssaPssaXssafssalcIixcblx0XHQ2LFxuXHRcdFwi7LGx7LGyXCJcblx0XSxcblx0W1xuXHRcdFwiYWE4MVwiLFxuXHRcdFwi7LGz7LG07LG2XCIsXG5cdFx0MjksXG5cdFx0XCLjgYFcIixcblx0XHQ4MlxuXHRdLFxuXHRbXG5cdFx0XCJhYjQxXCIsXG5cdFx0XCLsspTsspXsspbsspfssprsspvssp3ssp7ssp/ssqFcIixcblx0XHQ2LFxuXHRcdFwi7LKq7LKuXCIsXG5cdFx0NSxcblx0XHRcIuyytuyyt+yyuVwiXG5cdF0sXG5cdFtcblx0XHRcImFiNjFcIixcblx0XHRcIuyyuuyyu+yyvVwiLFxuXHRcdDYsXG5cdFx0XCLss4bss4jss4pcIixcblx0XHQ1LFxuXHRcdFwi7LOR7LOS7LOT7LOVXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCJhYjgxXCIsXG5cdFx0XCLss5tcIixcblx0XHQ4LFxuXHRcdFwi7LOlXCIsXG5cdFx0Nixcblx0XHRcIuyzreyzruyzr+yzsVwiLFxuXHRcdDEyLFxuXHRcdFwi44KhXCIsXG5cdFx0ODVcblx0XSxcblx0W1xuXHRcdFwiYWM0MVwiLFxuXHRcdFwi7LO+7LO/7LSA7LSCXCIsXG5cdFx0NSxcblx0XHRcIuy0iuy0i+y0jey0juy0j+y0kVwiLFxuXHRcdDYsXG5cdFx0XCLstJrstJzstJ7stJ/stKBcIlxuXHRdLFxuXHRbXG5cdFx0XCJhYzYxXCIsXG5cdFx0XCLstKHstKLstKPstKXstKbstKfstKnstKrstKvstK1cIixcblx0XHQxMSxcblx0XHRcIuy0ulwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiYWM4MVwiLFxuXHRcdFwi7LS/XCIsXG5cdFx0MjgsXG5cdFx0XCLstZ3stZ7stZ/QkFwiLFxuXHRcdDUsXG5cdFx0XCLQgdCWXCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiYWNkMVwiLFxuXHRcdFwi0LBcIixcblx0XHQ1LFxuXHRcdFwi0ZHQtlwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcImFkNDFcIixcblx0XHRcIuy1oey1ouy1o+y1pVwiLFxuXHRcdDYsXG5cdFx0XCLsta7stbDstbJcIixcblx0XHQ1LFxuXHRcdFwi7LW5XCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCJhZDYxXCIsXG5cdFx0XCLstoFcIixcblx0XHQ2LFxuXHRcdFwi7LaJXCIsXG5cdFx0MTAsXG5cdFx0XCLstpbstpfstpnstprstpvstp3stp7stp9cIlxuXHRdLFxuXHRbXG5cdFx0XCJhZDgxXCIsXG5cdFx0XCLstqDstqHstqLstqPstqbstqjstqpcIixcblx0XHQ1LFxuXHRcdFwi7LaxXCIsXG5cdFx0MTgsXG5cdFx0XCLst4VcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZTQxXCIsXG5cdFx0XCLst4ZcIixcblx0XHQ1LFxuXHRcdFwi7LeN7LeO7LeP7LeRXCIsXG5cdFx0MTZcblx0XSxcblx0W1xuXHRcdFwiYWU2MVwiLFxuXHRcdFwi7LeiXCIsXG5cdFx0NSxcblx0XHRcIuy3qey3quy3q+y3rey3ruy3r+y3sVwiLFxuXHRcdDYsXG5cdFx0XCLst7rst7zst75cIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImFlODFcIixcblx0XHRcIuy4g+y4hey4huy4h+y4iey4iuy4i+y4jVwiLFxuXHRcdDYsXG5cdFx0XCLsuJXsuJbsuJfsuJjsuJpcIixcblx0XHQ1LFxuXHRcdFwi7Lii7Lij7Lil7Lim7Lin7Lip7Liq7LirXCJcblx0XSxcblx0W1xuXHRcdFwiYWY0MVwiLFxuXHRcdFwi7Lis7Lit7Liu7Liv7Liy7Li07Li2XCIsXG5cdFx0MTlcblx0XSxcblx0W1xuXHRcdFwiYWY2MVwiLFxuXHRcdFwi7LmKXCIsXG5cdFx0MTMsXG5cdFx0XCLsuZrsuZvsuZ3suZ7suaJcIixcblx0XHQ1LFxuXHRcdFwi7Lmq7LmsXCJcblx0XSxcblx0W1xuXHRcdFwiYWY4MVwiLFxuXHRcdFwi7LmuXCIsXG5cdFx0NSxcblx0XHRcIuy5tuy5t+y5uey5uuy5u+y5vVwiLFxuXHRcdDYsXG5cdFx0XCLsuobsuojsuopcIixcblx0XHQ1LFxuXHRcdFwi7LqS7LqT7LqV7LqW7LqX7LqZXCJcblx0XSxcblx0W1xuXHRcdFwiYjA0MVwiLFxuXHRcdFwi7LqaXCIsXG5cdFx0NSxcblx0XHRcIuy6ouy6plwiLFxuXHRcdDUsXG5cdFx0XCLsuq5cIixcblx0XHQxMlxuXHRdLFxuXHRbXG5cdFx0XCJiMDYxXCIsXG5cdFx0XCLsurtcIixcblx0XHQ1LFxuXHRcdFwi7LuCXCIsXG5cdFx0MTlcblx0XSxcblx0W1xuXHRcdFwiYjA4MVwiLFxuXHRcdFwi7LuWXCIsXG5cdFx0MTMsXG5cdFx0XCLsu6bsu6fsu6nsu6rsu61cIixcblx0XHQ2LFxuXHRcdFwi7Lu27Lu6XCIsXG5cdFx0NSxcblx0XHRcIuqwgOqwgeqwhOqwh+qwiOqwieqwiuqwkFwiLFxuXHRcdDcsXG5cdFx0XCLqsJlcIixcblx0XHQ0LFxuXHRcdFwi6rCg6rCk6rCs6rCt6rCv6rCw6rCx6rC46rC56rC86rGA6rGL6rGN6rGU6rGY6rGc6rGw6rGx6rG06rG36rG46rG66rKA6rKB6rKD6rKE6rKF6rKG6rKJ6rKK6rKL6rKM6rKQ6rKU6rKc6rKd6rKf6rKg6rKh6rKo6rKp6rKq6rKs6rKv6rKw6rK46rK56rK76rK86rK96rOB6rOE6rOI6rOM6rOV6rOX6rOg6rOh6rOk6rOn6rOo6rOq6rOs6rOv6rOw6rOx6rOz6rO16rO26rO86rO96rSA6rSE6rSGXCJcblx0XSxcblx0W1xuXHRcdFwiYjE0MVwiLFxuXHRcdFwi7LyC7LyD7LyF7LyG7LyH7LyJXCIsXG5cdFx0Nixcblx0XHRcIuy8kuy8lOy8llwiLFxuXHRcdDUsXG5cdFx0XCLsvJ3svJ7svJ/svKHsvKLsvKNcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMTYxXCIsXG5cdFx0XCLsvKVcIixcblx0XHQ2LFxuXHRcdFwi7Lyu7LyyXCIsXG5cdFx0NSxcblx0XHRcIuy8uVwiLFxuXHRcdDExXG5cdF0sXG5cdFtcblx0XHRcImIxODFcIixcblx0XHRcIuy9hVwiLFxuXHRcdDE0LFxuXHRcdFwi7L2W7L2X7L2Z7L2a7L2b7L2dXCIsXG5cdFx0Nixcblx0XHRcIuy9puy9qOy9quy9q+y9rOq0jOq0jeq0j+q0keq0mOq0nOq0oOq0qeq0rOq0req0tOq0teq0uOq0vOq1hOq1heq1h+q1ieq1kOq1lOq1mOq1oeq1o+q1rOq1req1sOq1s+q1tOq1teq1tuq1u+q1vOq1veq1v+q2geq2guq2iOq2ieq2jOq2kOq2nOq2neq2pOq2t+q3gOq3geq3hOq3iOq3kOq3keq3k+q3nOq3oOq3pOq3uOq3ueq3vOq3v+q4gOq4geq4iOq4ieq4i+q4jeq4lOq4sOq4seq4tOq4t+q4uOq4uuq5gOq5geq5g+q5heq5huq5iuq5jOq5jeq5juq5kOq5lOq5luq5nOq5neq5n+q5oOq5oeq5peq5qOq5qeq5rOq5sOq5uFwiXG5cdF0sXG5cdFtcblx0XHRcImIyNDFcIixcblx0XHRcIuy9rey9ruy9r+y9suy9s+y9tey9tuy9t+y9uVwiLFxuXHRcdDYsXG5cdFx0XCLsvoHsvoLsvoPsvoTsvoZcIixcblx0XHQ1LFxuXHRcdFwi7L6NXCJcblx0XSxcblx0W1xuXHRcdFwiYjI2MVwiLFxuXHRcdFwi7L6OXCIsXG5cdFx0MTgsXG5cdFx0XCLsvqJcIixcblx0XHQ1LFxuXHRcdFwi7L6pXCJcblx0XSxcblx0W1xuXHRcdFwiYjI4MVwiLFxuXHRcdFwi7L6qXCIsXG5cdFx0NSxcblx0XHRcIuy+sVwiLFxuXHRcdDE4LFxuXHRcdFwi7L+FXCIsXG5cdFx0Nixcblx0XHRcIuq5ueq5u+q5vOq5veq6hOq6heq6jOq6vOq6veq6vuq7gOq7hOq7jOq7jeq7j+q7kOq7keq7mOq7meq7nOq7qOq7q+q7req7tOq7uOq7vOq8h+q8iOq8jeq8kOq8rOq8req8sOq8suq8tOq8vOq8veq8v+q9geq9guq9g+q9iOq9ieq9kOq9nOq9neq9pOq9peq9ueq+gOq+hOq+iOq+kOq+keq+leq+nOq+uOq+ueq+vOq/gOq/h+q/iOq/ieq/i+q/jeq/juq/lOq/nOq/qOq/qeq/sOq/seq/tOq/uOuAgOuAgeuAhOuAjOuAkOuAlOuAnOuAneuAqOuBhOuBheuBiOuBiuuBjOuBjuuBk+uBlOuBleuBl+uBmVwiXG5cdF0sXG5cdFtcblx0XHRcImIzNDFcIixcblx0XHRcIuy/jFwiLFxuXHRcdDE5LFxuXHRcdFwi7L+i7L+j7L+l7L+m7L+n7L+pXCJcblx0XSxcblx0W1xuXHRcdFwiYjM2MVwiLFxuXHRcdFwi7L+qXCIsXG5cdFx0NSxcblx0XHRcIuy/suy/tOy/tlwiLFxuXHRcdDUsXG5cdFx0XCLsv73sv77sv7/tgIHtgILtgIPtgIVcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcImIzODFcIixcblx0XHRcIu2Ai1wiLFxuXHRcdDUsXG5cdFx0XCLtgJJcIixcblx0XHQ1LFxuXHRcdFwi7YCZXCIsXG5cdFx0MTksXG5cdFx0XCLrgZ3rgbzrgb3rgoDrgoTrgozrgo3rgo/rgpHrgpjrgpnrgprrgpzrgp/rgqDrgqHrgqLrgqjrgqnrgqtcIixcblx0XHQ0LFxuXHRcdFwi64Kx64Kz64K064K164K464K864OE64OF64OH64OI64OJ64OQ64OR64OU64OY64Og64Ol64SI64SJ64SL64SM64SQ64SS64ST64SY64SZ64Sb64Sc64Sd64Sj64Sk64Sl64So64Ss64S064S164S364S464S564WA64WB64WE64WI64WQ64WR64WU64WV64WY64Wc64Wg64W464W564W864aA64aC64aI64aJ64aL64aN64aS64aT64aU64aY64ac64ao64eM64eQ64eU64ec64edXCJcblx0XSxcblx0W1xuXHRcdFwiYjQ0MVwiLFxuXHRcdFwi7YCuXCIsXG5cdFx0NSxcblx0XHRcIu2Atu2At+2Aue2Auu2Au+2AvVwiLFxuXHRcdDYsXG5cdFx0XCLtgYbtgYjtgYpcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcImI0NjFcIixcblx0XHRcIu2Bke2Bku2Bk+2Ble2Blu2Bl+2BmVwiLFxuXHRcdDYsXG5cdFx0XCLtgaFcIixcblx0XHQxMCxcblx0XHRcIu2Bru2Br1wiXG5cdF0sXG5cdFtcblx0XHRcImI0ODFcIixcblx0XHRcIu2Bse2Bsu2Bs+2BtVwiLFxuXHRcdDYsXG5cdFx0XCLtgb7tgb/tgoDtgoJcIixcblx0XHQxOCxcblx0XHRcIuuHn+uHqOuHqeuHrOuHsOuHueuHu+uHveuIhOuIheuIiOuIi+uIjOuIlOuIleuIl+uImeuIoOuItOuIvOuJmOuJnOuJoOuJqOuJqeuJtOuJteuJvOuKhOuKheuKieuKkOuKkeuKlOuKmOuKmeuKmuuKoOuKoeuKo+uKpeuKpuuKquuKrOuKsOuKtOuLiOuLieuLjOuLkOuLkuuLmOuLmeuLm+uLneuLouuLpOuLpeuLpuuLqOuLq1wiLFxuXHRcdDQsXG5cdFx0XCLri7Pri7Tri7Xri7dcIixcblx0XHQ0LFxuXHRcdFwi64u/64yA64yB64yE64yI64yQ64yR64yT64yU64yV64yc642U642V642W642Y642b642c642e642f642k642lXCJcblx0XSxcblx0W1xuXHRcdFwiYjU0MVwiLFxuXHRcdFwi7YKVXCIsXG5cdFx0MTQsXG5cdFx0XCLtgqbtgqftgqntgqrtgqvtgq1cIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcImI1NjFcIixcblx0XHRcIu2Cs+2Ctu2CuO2CulwiLFxuXHRcdDUsXG5cdFx0XCLtg4Ltg4Ptg4Xtg4btg4ftg4pcIixcblx0XHQ1LFxuXHRcdFwi7YOS7YOWXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJiNTgxXCIsXG5cdFx0XCLtg5vtg57tg5/tg6Htg6Ltg6Ptg6VcIixcblx0XHQ2LFxuXHRcdFwi7YOu7YOyXCIsXG5cdFx0NSxcblx0XHRcIu2DuVwiLFxuXHRcdDExLFxuXHRcdFwi642n642p642r642u642w642x64206424646A646B646D646E646F646M646Q646U646g646h646o646s64+E64+F64+I64+L64+M64+O64+Q64+U64+V64+X64+Z64+b64+d64+g64+k64+o64+865CQ65CY65Cc65Cg65Co65Cp65Cr65C065GQ65GR65GU65GY65Gg65Gh65Gj65Gl65Gs65KA65KI65Kd65Kk65Ko65Ks65K165K365K565OA65OE65OI65OQ65OV65Oc65Od65Og65Oj65Ok65Om65Os65Ot65Ov65Ox65O465SU65SV65SY65Sb65Sc65Sk65Sl65Sn65So65Sp65Sq65Sw65Sx65S065S4XCJcblx0XSxcblx0W1xuXHRcdFwiYjY0MVwiLFxuXHRcdFwi7YSFXCIsXG5cdFx0Nyxcblx0XHRcIu2EjlwiLFxuXHRcdDE3XG5cdF0sXG5cdFtcblx0XHRcImI2NjFcIixcblx0XHRcIu2EoFwiLFxuXHRcdDE1LFxuXHRcdFwi7YSy7YSz7YS17YS27YS37YS57YS77YS87YS97YS+XCJcblx0XSxcblx0W1xuXHRcdFwiYjY4MVwiLFxuXHRcdFwi7YS/7YWC7YWGXCIsXG5cdFx0NSxcblx0XHRcIu2Fju2Fj+2Fke2Fku2Fk+2FlVwiLFxuXHRcdDYsXG5cdFx0XCLthZ7thaDthaJcIixcblx0XHQ1LFxuXHRcdFwi7YWp7YWq7YWr7YWt65WA65WB65WD65WE65WF65WL65WM65WN65WQ65WU65Wc65Wd65Wf65Wg65Wh65ag65ah65ak65ao65aq65ar65aw65ax65az65a065a165a765a865a965eA65eE65eM65eN65eP65eQ65eR65eY65es65iQ65iR65iU65iY65il65is65i065mI65mk65mo65qc65qd65qg65qk65qr65qs65qx65uU65uw65u065u465yA65yB65yF65yo65yp65ys65yv65yw65y465y565y7652E652I652M652U652V652g652k652o652w652x652z652165286529656A656E656M656N656P656Q656R656S656W656XXCJcblx0XSxcblx0W1xuXHRcdFwiYjc0MVwiLFxuXHRcdFwi7YWuXCIsXG5cdFx0MTMsXG5cdFx0XCLthb1cIixcblx0XHQ2LFxuXHRcdFwi7YaF7YaG7YaH7YaJ7YaKXCJcblx0XSxcblx0W1xuXHRcdFwiYjc2MVwiLFxuXHRcdFwi7YaLXCIsXG5cdFx0MjAsXG5cdFx0XCLthqLthqPthqXthqbthqdcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNzgxXCIsXG5cdFx0XCLthqlcIixcblx0XHQ2LFxuXHRcdFwi7Yay7Ya07Ya27Ya37Ya47Ya57Ya77Ya97Ya+7Ya/7YeBXCIsXG5cdFx0MTQsXG5cdFx0XCLrnpjrnpnrnpzrnqDrnqjrnqnrnqvrnqzrnq3rnrTrnrXrnrjrn4frn4nrn6zrn63rn7Drn7Trn7zrn73rn7/roIDroIHroIfroIjroInroIzroJDroJjroJnroJvroJ3roKTroKXroKjroKzroLTroLXroLfroLjroLnroYDroYTroZHroZProZzroZ3roaDroaTroazroa3roa/robHrobjrobzroo3roqjrorDrorTrorjro4Dro4Hro4Pro4Xro4zro5Dro5Tro53ro5/ro6Hro6jro6nro6zro7Dro7jro7nro7vro73rpITrpJjrpKDrpLzrpL3rpYDrpYTrpYzrpY/rpZHrpZjrpZnrpZzrpaDrpajrpalcIlxuXHRdLFxuXHRbXG5cdFx0XCJiODQxXCIsXG5cdFx0XCLth5BcIixcblx0XHQ3LFxuXHRcdFwi7YeZXCIsXG5cdFx0MTdcblx0XSxcblx0W1xuXHRcdFwiYjg2MVwiLFxuXHRcdFwi7YerXCIsXG5cdFx0OCxcblx0XHRcIu2Hte2Htu2Ht+2HuVwiLFxuXHRcdDEzXG5cdF0sXG5cdFtcblx0XHRcImI4ODFcIixcblx0XHRcIu2IiO2IilwiLFxuXHRcdDUsXG5cdFx0XCLtiJFcIixcblx0XHQyNCxcblx0XHRcIuulq+ulreultOulteuluOulvOumhOumheumh+umieumiuumjeumjuumrOumreumsOumtOumvOumveumv+ungeuniOunieunjOunjlwiLFxuXHRcdDQsXG5cdFx0XCLrp5jrp5nrp5vrp53rp57rp6Hrp6Prp6Trp6Xrp6jrp6zrp7Trp7Xrp7frp7jrp7nrp7rrqIDrqIHrqIjrqJXrqLjrqLnrqLzrqYDrqYLrqYjrqYnrqYvrqY3rqY7rqZPrqZTrqZXrqZjrqZzrqaTrqaXrqafrqajrqanrqbDrqbHrqbTrqbjrqoPrqoTrqoXrqofrqozrqqjrqqnrqqvrqqzrqrDrqrLrqrjrqrnrqrvrqr3rq4Trq4jrq5jrq5nrq7xcIlxuXHRdLFxuXHRbXG5cdFx0XCJiOTQxXCIsXG5cdFx0XCLtiKrtiKvtiK7tiK/tiLHtiLLtiLPtiLVcIixcblx0XHQ2LFxuXHRcdFwi7Yi+7YmA7YmCXCIsXG5cdFx0NSxcblx0XHRcIu2Jie2Jiu2Ji+2JjFwiXG5cdF0sXG5cdFtcblx0XHRcImI5NjFcIixcblx0XHRcIu2JjVwiLFxuXHRcdDE0LFxuXHRcdFwi7YmdXCIsXG5cdFx0Nixcblx0XHRcIu2Jpe2Jpu2Jp+2JqFwiXG5cdF0sXG5cdFtcblx0XHRcImI5ODFcIixcblx0XHRcIu2JqVwiLFxuXHRcdDIyLFxuXHRcdFwi7YqC7YqD7YqF7YqG7YqH7YqJ7YqK7YqL7YqM66yA66yE66yN66yP66yR66yY66yc66yg66yp66yr66y066y166y266y466y766y866y966y+662E662F662H662J662N662P662Q662U662Y662h662j662s666I666M666Q666k666o666s6660666366+A66+E66+I66+Q66+T66+466+566+866+/67CA67CC67CI67CJ67CL67CM67CN67CP67CR67CUXCIsXG5cdFx0NCxcblx0XHRcIuuwm1wiLFxuXHRcdDQsXG5cdFx0XCLrsKTrsKXrsKfrsKnrsK3rsLDrsLHrsLTrsLjrsYDrsYHrsYPrsYTrsYXrsYnrsYzrsY3rsZDrsZ3rsoTrsoXrsojrsovrsozrso7rspTrspXrspdcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYTQxXCIsXG5cdFx0XCLtio3tio7tio/tipLtipPtipTtipZcIixcblx0XHQ1LFxuXHRcdFwi7Yqd7Yqe7Yqf7Yqh7Yqi7Yqj7YqlXCIsXG5cdFx0Nixcblx0XHRcIu2KrVwiXG5cdF0sXG5cdFtcblx0XHRcImJhNjFcIixcblx0XHRcIu2Kru2Kr+2KsO2KslwiLFxuXHRcdDUsXG5cdFx0XCLtirrtirvtir3tir7ti4Hti4NcIixcblx0XHQ0LFxuXHRcdFwi7YuK7YuMXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCJiYTgxXCIsXG5cdFx0XCLti5Lti5Pti5Xti5bti5fti5nti5rti5vti51cIixcblx0XHQ2LFxuXHRcdFwi7YumXCIsXG5cdFx0OSxcblx0XHRcIu2Lsu2Ls+2Lte2Ltu2Lt+2Lue2LuuuymeuymuuyoOuyoeuypOuyp+uyqOuysOuyseuys+uytOuyteuyvOuyveuzgOuzhOuzjeuzj+uzkOuzkeuzleuzmOuznOuztOuzteuztuuzuOuzvOu0hOu0heu0h+u0ieu0kOu0lOu0pOu0rOu1gOu1iOu1ieu1jOu1kOu1mOu1meu1pOu1qOu2gOu2geu2hOu2h+u2iOu2ieu2iuu2kOu2keu2k+u2leu2meu2muu2nOu2pOu2sOu2uOu3lOu3leu3mOu3nOu3qeu3sOu3tOu3uOu4gOu4g+u4heu4jOu4jeu4kOu4lOu4nOu4neu4n+u5hOu5heu5iOu5jOu5juu5lOu5leu5l+u5meu5muu5m+u5oOu5oeu5pFwiXG5cdF0sXG5cdFtcblx0XHRcImJiNDFcIixcblx0XHRcIu2Lu1wiLFxuXHRcdDQsXG5cdFx0XCLtjILtjITtjIZcIixcblx0XHQ1LFxuXHRcdFwi7YyP7YyR7YyS7YyT7YyV7YyXXCIsXG5cdFx0NCxcblx0XHRcIu2Mnu2Mou2Mo1wiXG5cdF0sXG5cdFtcblx0XHRcImJiNjFcIixcblx0XHRcIu2MpO2Mpu2Mp+2Mqu2Mq+2Mre2Mru2Mr+2MsVwiLFxuXHRcdDYsXG5cdFx0XCLtjLrtjL5cIixcblx0XHQ1LFxuXHRcdFwi7Y2G7Y2H7Y2I7Y2JXCJcblx0XSxcblx0W1xuXHRcdFwiYmI4MVwiLFxuXHRcdFwi7Y2KXCIsXG5cdFx0MzEsXG5cdFx0XCLruajruarrubDrubHrubPrubTrubXrubvrubzrub3ruoDruoTruozruo3ruo/rupDrupHrupjrupnruqjru5Dru5Hru5Tru5fru5jru6Dru6Pru6Tru6Xru6zrvIHrvIjrvInrvJjrvJnrvJvrvJzrvJ3rvYDrvYHrvYTrvYjrvZDrvZHrvZXrvpTrvrDrv4Xrv4zrv43rv5Drv5Trv5zrv5/rv6HsgLzsgZHsgZjsgZzsgaDsgajsgansgpDsgpHsgpTsgpjsgqDsgqHsgqPsgqXsgqzsgq3sgq/sgrDsgrPsgrTsgrXsgrbsgrzsgr3sgr/sg4Dsg4Hsg4Xsg4jsg4nsg4zsg5Dsg5jsg5nsg5vsg5zsg53sg6RcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYzQxXCIsXG5cdFx0XCLtjapcIixcblx0XHQxNyxcblx0XHRcIu2Nvu2Nv+2Oge2Ogu2Og+2Ohe2Ohu2Oh1wiXG5cdF0sXG5cdFtcblx0XHRcImJjNjFcIixcblx0XHRcIu2OiO2Oie2Oiu2Oi+2Oju2OklwiLFxuXHRcdDUsXG5cdFx0XCLtjprtjpvtjp3tjp7tjp/tjqFcIixcblx0XHQ2LFxuXHRcdFwi7Y6q7Y6s7Y6uXCJcblx0XSxcblx0W1xuXHRcdFwiYmM4MVwiLFxuXHRcdFwi7Y6vXCIsXG5cdFx0NCxcblx0XHRcIu2Ote2Otu2Ot+2Oue2Ouu2Ou+2OvVwiLFxuXHRcdDYsXG5cdFx0XCLtj4btj4ftj4pcIixcblx0XHQ1LFxuXHRcdFwi7Y+RXCIsXG5cdFx0NSxcblx0XHRcIuyDpeyDqOyDrOyDtOyDteyDt+yDueyEgOyEhOyEiOyEkOyEleyEnFwiLFxuXHRcdDQsXG5cdFx0XCLshKPshKTshKbshKfshKzshK3shK/shLDshLHshLbshLjshLnshLzshYDshYjshYnshYvshYzshY3shZTshZXshZjshZzshaTshaXshafshajshanshbDshbTshbjshoXshozsho3sho7shpDshpTshpbshpzshp3shp/shqHshqXshqjshqnshqzshrDshr3sh4Tsh4jsh4zsh5Tsh5fsh5jsh6Dsh6Tsh6jsh7Dsh7Hsh7Psh7zsh73siIDsiITsiIzsiI3siI/siJHsiJjsiJnsiJzsiJ/siKDsiKjsiKnsiKvsiK1cIlxuXHRdLFxuXHRbXG5cdFx0XCJiZDQxXCIsXG5cdFx0XCLtj5ftj5lcIixcblx0XHQ3LFxuXHRcdFwi7Y+i7Y+kXCIsXG5cdFx0Nyxcblx0XHRcIu2Pru2Pr+2Pse2Psu2Ps+2Pte2Ptu2Pt1wiXG5cdF0sXG5cdFtcblx0XHRcImJkNjFcIixcblx0XHRcIu2PuO2Pue2Puu2Pu+2Pvu2QgO2QglwiLFxuXHRcdDUsXG5cdFx0XCLtkIlcIixcblx0XHQxM1xuXHRdLFxuXHRbXG5cdFx0XCJiZDgxXCIsXG5cdFx0XCLtkJdcIixcblx0XHQ1LFxuXHRcdFwi7ZCeXCIsXG5cdFx0MjUsXG5cdFx0XCLsiK/siLHsiLLsiLTsiYjsiZDsiZHsiZTsiZjsiaDsiaXsiazsia3sibDsibTsibzsib3sib/sioHsiojsionsipDsipjsipvsip3siqTsiqXsiqjsiqzsiq3sirTsirXsirfsirnsi5zsi53si6Dsi6Psi6Tsi6vsi6zsi63si6/si7Hsi7bsi7jsi7nsi7vsi7zsjIDsjIjsjInsjIzsjI3sjJPsjJTsjJXsjJjsjJzsjKTsjKXsjKjsjKnsjYXsjajsjansjazsjbDsjbLsjbjsjbnsjbzsjb3sjoTsjojsjozsj4Dsj5jsj5nsj5zsj5/sj6Dsj6Lsj6jsj6nsj63sj7Tsj7Xsj7jskIjskJDskKTskKzskLBcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZTQxXCIsXG5cdFx0XCLtkLhcIixcblx0XHQ3LFxuXHRcdFwi7ZGB7ZGC7ZGD7ZGFXCIsXG5cdFx0MTRcblx0XSxcblx0W1xuXHRcdFwiYmU2MVwiLFxuXHRcdFwi7ZGUXCIsXG5cdFx0Nyxcblx0XHRcIu2Rne2Rnu2Rn+2Roe2Rou2Ro+2RpVwiLFxuXHRcdDcsXG5cdFx0XCLtka7tkbDtkbHtkbJcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZTgxXCIsXG5cdFx0XCLtkbNcIixcblx0XHQ0LFxuXHRcdFwi7ZG67ZG77ZG97ZG+7ZKB7ZKDXCIsXG5cdFx0NCxcblx0XHRcIu2Siu2SjO2SjlwiLFxuXHRcdDUsXG5cdFx0XCLtkpVcIixcblx0XHQ4LFxuXHRcdFwi7JC07JC87JC97JGI7JGk7JGl7JGo7JGs7JG07JG17JG57JKA7JKU7JKc7JK47JK87JOp7JOw7JOx7JO07JO47JO67JO/7JSA7JSB7JSM7JSQ7JSU7JSc7JSo7JSp7JSs7JSw7JS47JS57JS77JS97JWE7JWF7JWI7JWJ7JWK7JWM7JWN7JWO7JWT7JWU7JWV7JWX7JWY7JWZ7JWd7JWe7JWg7JWh7JWk7JWo7JWw7JWx7JWz7JW07JW17JW87JW97JaA7JaE7JaH7JaM7JaN7JaP7JaR7JaV7JaX7JaY7Jac7Jag7Jap7Ja07Ja17Ja47Ja57Ja77Ja87Ja97Ja+7JeEXCIsXG5cdFx0Nixcblx0XHRcIuyXjOyXjlwiXG5cdF0sXG5cdFtcblx0XHRcImJmNDFcIixcblx0XHRcIu2SnlwiLFxuXHRcdDEwLFxuXHRcdFwi7ZKqXCIsXG5cdFx0MTRcblx0XSxcblx0W1xuXHRcdFwiYmY2MVwiLFxuXHRcdFwi7ZK5XCIsXG5cdFx0MTgsXG5cdFx0XCLtk43tk47tk4/tk5Htk5Ltk5Ptk5VcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZjgxXCIsXG5cdFx0XCLtk5ZcIixcblx0XHQ1LFxuXHRcdFwi7ZOd7ZOe7ZOgXCIsXG5cdFx0Nyxcblx0XHRcIu2Tqe2Tqu2Tq+2Tre2Tru2Tr+2TsVwiLFxuXHRcdDYsXG5cdFx0XCLtk7ntk7rtk7zsl5Dsl5Hsl5Tsl5jsl6Dsl6Hsl6Psl6Xsl6zsl63sl67sl7Dsl7Tsl7bsl7fsl7xcIixcblx0XHQ1LFxuXHRcdFwi7JiF7JiG7JiH7JiI7JiM7JiQ7JiY7JiZ7Jib7Jic7Jik7Jil7Jio7Jis7Jit7Jiu7Jiw7Jiz7Ji07Ji17Ji37Ji57Ji77JmA7JmB7JmE7JmI7JmQ7JmR7JmT7JmU7JmV7Jmc7Jmd7Jmg7Jms7Jmv7Jmx7Jm47Jm57Jm87JqA7JqI7JqJ7JqL7JqN7JqU7JqV7JqY7Jqc7Jqk7Jql7Jqn7Jqp7Jqw7Jqx7Jq07Jq47Jq57Jq67JuA7JuB7JuD7JuF7JuM7JuN7JuQ7JuU7Juc7Jud7Jug7Juh7JuoXCJcblx0XSxcblx0W1xuXHRcdFwiYzA0MVwiLFxuXHRcdFwi7ZO+XCIsXG5cdFx0NSxcblx0XHRcIu2Uhe2Uhu2Uh+2Uie2Uiu2Ui+2UjVwiLFxuXHRcdDYsXG5cdFx0XCLtlJbtlJhcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcImMwNjFcIixcblx0XHRcIu2UnlwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcImMwODFcIixcblx0XHRcIu2UuO2Uue2Uuu2Uu+2Uvu2Uv+2Vge2Vgu2Vg+2VhVwiLFxuXHRcdDYsXG5cdFx0XCLtlY7tlZDtlZJcIixcblx0XHQ1LFxuXHRcdFwi7ZWa7ZWb7ZWd7ZWe7ZWf7ZWh7ZWi7ZWj7Jup7Jus7Juw7Ju47Ju57Ju97JyE7JyF7JyI7JyM7JyU7JyV7JyX7JyZ7Jyg7Jyh7Jyk7Jyo7Jyw7Jyx7Jyz7Jy17Jy37Jy87Jy97J2A7J2E7J2K7J2M7J2N7J2P7J2RXCIsXG5cdFx0Nyxcblx0XHRcIuydnOydoOydqOydq+ydtOydteyduOydvOydveydvuyeg+yehOyeheyeh+yeiOyeieyeiuyejuyekOyekeyelOyeluyel+yemOyemuyeoOyeoeyeo+yepOyepeyepuyerOyereyesOyetOyevOyeveyev+yfgOyfgeyfiOyfieyfjOyfjuyfkOyfmOyfneyfpOyfqOyfrOyggOyggeyghOygiOygilwiXG5cdF0sXG5cdFtcblx0XHRcImMxNDFcIixcblx0XHRcIu2VpO2Vpu2Vp+2Vqu2VrO2VrlwiLFxuXHRcdDUsXG5cdFx0XCLtlbbtlbftlbntlbrtlbvtlb1cIixcblx0XHQ2LFxuXHRcdFwi7ZaG7ZaK7ZaLXCJcblx0XSxcblx0W1xuXHRcdFwiYzE2MVwiLFxuXHRcdFwi7ZaM7ZaN7ZaO7ZaP7ZaRXCIsXG5cdFx0MTksXG5cdFx0XCLtlqbtlqdcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMTgxXCIsXG5cdFx0XCLtlqhcIixcblx0XHQzMSxcblx0XHRcIuygkOygkeygk+ygleygluygnOygneygoOygpOygrOygreygr+ygseyguOygvOyhgOyhiOyhieyhjOyhjeyhlOyhsOyhseyhtOyhuOyhuuyigOyigeyig+yiheyihuyih+yii+yijOyijeyilOyineyin+yioeyiqOyivOyiveyjhOyjiOyjjOyjlOyjleyjl+yjmeyjoOyjoeyjpOyjteyjvOyjveykgOykhOykheykhuykjOykjeykj+ykkeykmOykrOyktOylkOylkeyllOylmOyloOyloeylo+ylrOylsOyltOylvOymiOymieymjOymkOymmOymmeymm+ymneyngOyngeynhOynh+yniOyniuynkOynkeynk1wiXG5cdF0sXG5cdFtcblx0XHRcImMyNDFcIixcblx0XHRcIu2Xiu2Xi+2Xje2Xju2Xj+2Xke2Xk1wiLFxuXHRcdDQsXG5cdFx0XCLtl5rtl5ztl55cIixcblx0XHQ1LFxuXHRcdFwi7Zem7Zen7Zep7Zeq7Zer7Zet7ZeuXCJcblx0XSxcblx0W1xuXHRcdFwiYzI2MVwiLFxuXHRcdFwi7ZevXCIsXG5cdFx0NCxcblx0XHRcIu2Xtu2XuO2XulwiLFxuXHRcdDUsXG5cdFx0XCLtmILtmIPtmIXtmIbtmIftmIlcIixcblx0XHQ2LFxuXHRcdFwi7ZiSXCJcblx0XSxcblx0W1xuXHRcdFwiYzI4MVwiLFxuXHRcdFwi7ZiWXCIsXG5cdFx0NSxcblx0XHRcIu2Yne2Ynu2Yn+2Yoe2You2Yo+2YpVwiLFxuXHRcdDcsXG5cdFx0XCLtmK5cIixcblx0XHQ5LFxuXHRcdFwi7Zi67Zi77KeV7KeW7KeZ7Kea7Kec7Ked7Keg7Kei7Kek7Ken7Kes7Ket7Kev7Kew7Kex7Ke47Ke57Ke87KiA7KiI7KiJ7KiL7KiM7KiN7KiU7KiY7Kip7KmM7KmN7KmQ7KmU7Kmc7Kmd7Kmf7Kmg7Kmh7Kmo7Km97KqE7KqY7Kq87Kq97KuA7KuE7KuM7KuN7KuP7KuR7KuT7KuY7KuZ7Kug7Kus7Ku07KyI7KyQ7KyU7KyY7Kyg7Kyh7K2B7K2I7K2J7K2M7K2Q7K2Y7K2Z7K2d7K2k7K247K257K6c7K647K+U7K+k7K+n7K+p7LCM7LCN7LCQ7LCU7LCc7LCd7LCh7LCi7LCn7LCo7LCp7LCs7LCu7LCw7LC47LC57LC7XCJcblx0XSxcblx0W1xuXHRcdFwiYzM0MVwiLFxuXHRcdFwi7Zi97Zi+7Zi/7ZmB7ZmC7ZmD7ZmE7ZmG7ZmH7ZmK7ZmM7ZmO7ZmP7ZmQ7ZmS7ZmT7ZmW7ZmX7ZmZ7Zma7Zmb7ZmdXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJjMzYxXCIsXG5cdFx0XCLtmaJcIixcblx0XHQ0LFxuXHRcdFwi7Zmo7ZmqXCIsXG5cdFx0NSxcblx0XHRcIu2Zsu2Zs+2ZtVwiLFxuXHRcdDExXG5cdF0sXG5cdFtcblx0XHRcImMzODFcIixcblx0XHRcIu2age2agu2ahO2ahlwiLFxuXHRcdDUsXG5cdFx0XCLtmo7tmo/tmpHtmpLtmpPtmpVcIixcblx0XHQ3LFxuXHRcdFwi7Zqe7Zqg7ZqiXCIsXG5cdFx0NSxcblx0XHRcIu2aqe2aquywvOywveywvuyxhOyxheyxiOyxjOyxlOyxleyxl+yxmOyxmeyxoOyxpOyxpuyxqOyxsOyxteyymOyymeyynOyyoOyyqOyyqeyyq+yyrOyyreyytOyyteyyuOyyvOyzhOyzheyzh+yzieyzkOyzlOyzpOyzrOyzsOy0gey0iOy0iey0jOy0kOy0mOy0mey0m+y0ney0pOy0qOy0rOy0uey1nOy1oOy1pOy1rOy1rey1r+y1sey1uOy2iOy2lOy2ley2mOy2nOy2pOy2pey2p+y2qey2sOy3hOy3jOy3kOy3qOy3rOy3sOy3uOy3uey3u+y3vey4hOy4iOy4jOy4lOy4mey4oOy4oey4pOy4qOy4sOy4sey4s+y4tVwiXG5cdF0sXG5cdFtcblx0XHRcImM0NDFcIixcblx0XHRcIu2aq+2are2aru2ar+2asVwiLFxuXHRcdDcsXG5cdFx0XCLtmrrtmrxcIixcblx0XHQ3LFxuXHRcdFwi7ZuG7ZuH7ZuJ7ZuK7ZuLXCJcblx0XSxcblx0W1xuXHRcdFwiYzQ2MVwiLFxuXHRcdFwi7ZuN7ZuO7ZuP7ZuQ7ZuS7ZuT7ZuV7ZuW7ZuY7ZuaXCIsXG5cdFx0NSxcblx0XHRcIu2boe2bou2bo+2bpe2bpu2bp+2bqVwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiYzQ4MVwiLFxuXHRcdFwi7Zuu7Zuv7Zux7Zuy7Zuz7Zu07Zu2XCIsXG5cdFx0NSxcblx0XHRcIu2bvu2bv+2cge2cgu2cg+2chVwiLFxuXHRcdDExLFxuXHRcdFwi7ZyS7ZyT7ZyU7LmY7LmZ7Lmc7Lmf7Lmg7Lmh7Lmo7Lmp7Lmr7Lmt7Lm07Lm17Lm47Lm87LqE7LqF7LqH7LqJ7LqQ7LqR7LqU7LqY7Lqg7Lqh7Lqj7Lqk7Lql7Lqs7Lqt7LuB7Luk7Lul7Luo7Lur7Lus7Lu07Lu17Lu37Lu47Lu57LyA7LyB7LyE7LyI7LyQ7LyR7LyT7LyV7Lyc7Lyg7Lyk7Lys7Lyt7Lyv7Lyw7Lyx7Ly47L2U7L2V7L2Y7L2c7L2k7L2l7L2n7L2p7L2w7L2x7L207L247L6A7L6F7L6M7L6h7L6o7L6w7L+E7L+g7L+h7L+k7L+o7L+w7L+x7L+z7L+17L+87YCA7YCE7YCR7YCY7YCt7YC07YC17YC47YC8XCJcblx0XSxcblx0W1xuXHRcdFwiYzU0MVwiLFxuXHRcdFwi7ZyV7ZyW7ZyX7Zya7Zyb7Zyd7Zye7Zyf7ZyhXCIsXG5cdFx0Nixcblx0XHRcIu2cqu2crO2crlwiLFxuXHRcdDUsXG5cdFx0XCLtnLbtnLftnLlcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNTYxXCIsXG5cdFx0XCLtnLrtnLvtnL1cIixcblx0XHQ2LFxuXHRcdFwi7Z2F7Z2G7Z2I7Z2KXCIsXG5cdFx0NSxcblx0XHRcIu2dku2dk+2dle2dmlwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiYzU4MVwiLFxuXHRcdFwi7Z2f7Z2i7Z2k7Z2m7Z2n7Z2o7Z2q7Z2r7Z2t7Z2u7Z2v7Z2x7Z2y7Z2z7Z21XCIsXG5cdFx0Nixcblx0XHRcIu2dvu2dv+2egO2eglwiLFxuXHRcdDUsXG5cdFx0XCLtnortnovtgYTtgYXtgYftgYntgZDtgZTtgZjtgaDtgaztga3tgbDtgbTtgbztgb3tgoHtgqTtgqXtgqjtgqztgrTtgrXtgrftgrntg4Dtg4Htg4Ttg4jtg4ntg5Dtg5Htg5Ptg5Ttg5Xtg5ztg53tg6Dtg6Ttg6ztg63tg6/tg7Dtg7Htg7jthI3thLDthLHthLTthLjthLrthYDthYHthYPthYTthYXthYzthY3thZDthZTthZzthZ3thZ/thaHthajthazthbzthoTthojthqDthqHthqTthqjthrDthrHthrPthrXthrrthrzth4Dth5jth7Tth7jtiIftiIntiJDtiKztiK3tiLDtiLTtiLztiL3tiL/tiYHtiYjtiZxcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNjQxXCIsXG5cdFx0XCLtno3tno7tno/tnpFcIixcblx0XHQ2LFxuXHRcdFwi7Z6a7Z6c7Z6eXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCJjNmExXCIsXG5cdFx0XCLtiaTtioDtioHtioTtiojtipDtipHtipXtipztiqDtiqTtiqztirHtirjtirntirztir/ti4Dti4Lti4jti4nti4vti5Tti5jti5zti6Tti6Xti7Dti7Hti7Tti7jtjIDtjIHtjIPtjIXtjIztjI3tjI7tjJDtjJTtjJbtjJztjJ3tjJ/tjKDtjKHtjKXtjKjtjKntjKztjLDtjLjtjLntjLvtjLztjL3tjYTtjYXtjbztjb3tjoDtjoTtjoztjo3tjo/tjpDtjpHtjpjtjpntjpztjqDtjqjtjqntjqvtjq3tjrTtjrjtjrztj4Ttj4Xtj4jtj4ntj5Dtj5jtj6Htj6Ptj6ztj63tj7Dtj7Ttj7ztj73tj7/tkIFcIlxuXHRdLFxuXHRbXG5cdFx0XCJjN2ExXCIsXG5cdFx0XCLtkIjtkJ3tkYDtkYTtkZztkaDtkaTtka3tka/tkbjtkbntkbztkb/tkoDtkoLtkojtkontkovtko3tkpTtkqntk4ztk5Dtk5Ttk5ztk5/tk6jtk6ztk7Dtk7jtk7vtk73tlITtlIjtlIztlJTtlJXtlJftlLztlL3tlYDtlYTtlYztlY3tlY/tlZHtlZjtlZntlZztlaDtlaXtlajtlantlavtla3tlbTtlbXtlbjtlbztloTtloXtloftlojtlontlpDtlqXtl4jtl4ntl4ztl5Dtl5Ltl5jtl5ntl5vtl53tl6Ttl6Xtl6jtl6ztl7Ttl7Xtl7ftl7ntmIDtmIHtmITtmIjtmJDtmJHtmJPtmJTtmJXtmJztmKBcIlxuXHRdLFxuXHRbXG5cdFx0XCJjOGExXCIsXG5cdFx0XCLtmKTtmK3tmLjtmLntmLztmYDtmYXtmYjtmYntmYvtmY3tmZHtmZTtmZXtmZjtmZztmaftmantmbDtmbHtmbTtmoPtmoXtmoztmo3tmpDtmpTtmp3tmp/tmqHtmqjtmqztmrDtmrntmrvtm4Ttm4Xtm4jtm4ztm5Htm5Ttm5ftm5ntm6Dtm6Ttm6jtm7Dtm7Xtm7ztm73tnIDtnITtnJHtnJjtnJntnJztnKDtnKjtnKntnKvtnK3tnLTtnLXtnLjtnLztnYTtnYftnYntnZDtnZHtnZTtnZbtnZftnZjtnZntnaDtnaHtnaPtnaXtnantnaztnbDtnbTtnbztnb3tnoHtnojtnontnoztnpDtnpjtnpntnpvtnp1cIlxuXHRdLFxuXHRbXG5cdFx0XCJjYWExXCIsXG5cdFx0XCLkvL3kvbPlgYflg7nliqDlj6/lkbXlk6XlmInlq4Hlrrbmmofmnrbmnrfmn6/mrYznj4Lnl4LnqLzoi5vojITooZfooojoqLbos4jot4/ou7vov6bpp5XliLvljbTlkITmgarmhaTmrrznj4/ohJroprrop5LplqPkvoPliIrlor7lpbjlp6blubLlubnmh4fmj4DmnYbmn6zmob/mvpfnmY7nnIvno7XnqIjnq7/nsKHogp3oia7oibHoq6vplpPkuavllp3mm7fmuLTnoqPnq63okZvopJDonY7pnqjli5jlnY7loKrltYzmhJ/mhr7miKHmlaLmn5HmqYTmuJvnlJjnlrPnm6PnnrDntLrpgq/pkZHpkZLpvpVcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYmExXCIsXG5cdFx0XCLljKPlsqznlLLog5vpiYDplpjliZvloIjlp5zlsqHltJflurflvLrlvYrmhbfmsZ/nlbrnlobns6DntbPntrHnvozohZToiKHolpHopYHorJvpi7zpmY3psYfku4vku7flgIvlh7HloY/mhLfmhL7mhajmlLnmp6rmvJHnlqXnmobnm5bnrofoiqXok4vvpIDpjqfplovlloDlrqLlnZHvpIHnsrPnvrnphrXlgKjljrvlsYXlt6jmi5Lmja7mk5rmk6fmuKDngqznpZvot53ouJ7vpILpgb3piYXpi7jkub7ku7blgaXlt77lu7rmhIbmpZfohbHomZTouYfpjbXpqKvkuZ7lgpHmnbDmoYDlhInlio3lipLmqqJcIlxuXHRdLFxuXHRbXG5cdFx0XCJjY2ExXCIsXG5cdFx0XCLnnrzpiJDpu5TliqvmgK/ov7LlgYjmhqnmj63mk4rmoLzmqoTmv4DohojopqHpmpTloIXnib3niqznlITntbnnua3ogqnopovorbTpgaPptZHmionmsbrmvZTntZDnvLroqKPlhbzmhYrnrp3orJnpiZfpjozkuqzkv5PlgJ7lgr7lhIbli4Hli43ljb/lnbDlooPluprlvpHmhbbmhqzmk47mlazmma/mmrvmm7TmopfmtofngoXng7Hnkp/nkqXnk4rnl5nnoazno6znq5/nq7bntYXntpPogJXogL/ohJvojpborabovJXpgJXpj6HpoIPpoLjpqZrpr6jkv4LllZPloLrlpZHlraPlsYbmgrjmiJLmoYLmorBcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZGExXCIsXG5cdFx0XCLmo6jmuqrnlYznmbjno47nqL3ns7vnuavnubzoqIjoqqHosL/pmo7pt4Tlj6Tlj6nlkYrlkbHlm7rlp5HlraTlsLvluqvmi7fmlLfmlYXmlbLmmqDmnq/mp4Hmsr3nl7znmpDnnb7nqL/nvpTogIPogqHoho/oi6boi73oj7Dol4HooLHoorToqqXvpIPovpzpjK7pm4fpoafpq5jpvJPlk63mlpvmm7Lmoo/nqYDosLfptaDlm7DlnaTltJHmmIbmorHmo43mu77nkKjoop7pr6TmsajvpITpqqjkvpvlhazlhbHlip/lrZTlt6XmgZDmga3mi7HmjqfmlLvnj5nnqbromqPosqLpno/kuLLlr6HmiIjmnpznk5xcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZWExXCIsXG5cdFx0XCLnp5Hoj5PoqofoqrLot6jpgY7pjYvpoYblu5Pmp6jol7/pg63vpIXlhqDlrpjlr6zmhaPmo7rmrL7ngYznkK/nk5jnrqHnvZDoj4Xop4Dosqvpl5zppKjliK7mgZ3mi6zpgILkvorlhYnljKHlo5nlu6Pmm6DmtLjngprni4Lnj5bnrZDog7HpkZvljabmjpvnvavkuZblgoDloYrlo57mgKrmhKfmi5Dmp5DprYHlro/ntJjogrHovZ/kuqTlg5HlkqzllqzlrIzltqDlt6fmlKrmlY7moKHmqYvni6Hnmo7nn6/ntZ7nv7nohqDolY7om5/ovIPovY7pg4rppIPpqZXprqvkuJjkuYXkuZ3ku4fkv7Hlhbfli75cIlxuXHRdLFxuXHRbXG5cdFx0XCJjZmExXCIsXG5cdFx0XCLljYDlj6Plj6Xlko7lmJTlnbXlnqLlr4fltoflu5Dmh7zmi5jmlZHmnrjmn6nmp4vmrZDmr4bmr6zmsYLmup3ngbjni5fnjpbnkIPnnr/nn6nnqbbntb/ogInoh7zoiIXoiIroi5/ooaLorLPos7zou4DpgJHpgrHpiaTpirbpp5LpqYXps6npt5fpvpzlnIvlsYDoj4rpnqDpnqvpurTlkJvnqpjnvqToo5nou43pg6HloIDlsYjmjpjnqp/lrq7lvJPnqbnnqq7oio7ouqzlgKbliLjli7jljbflnIjmi7PmjbLmrIrmt4PnnLfljqXnjZfolajoubbpl5XmnLrmq4PmvbDoqa3ou4zppYvvpIbmmbfmrbjosrRcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMGExXCIsXG5cdFx0XCLprLzvpIflj6vlnK3lpY7mj4bmp7vnj6rnoYXnqrrnq4Xns77okbXopo/otbPpgLXplqjli7vlnYfnlYfnraDoj4zpiJ7vpIjmqZjlhYvliYvliofmiJ/mo5jmpbXpmpnlg4XliqTli6Tmh4PmlqTmoLnmp7/nkb7nrYvoirnoj6voprLorLnov5HppYnvpInku4rlppfmk5LmmJHmqo7nkLTnpoHnpr3oiqnoob7oob/opZ/vpIrpjKbkvIvlj4rmgKXmibHmsbLntJrntabkupjlhaLnn5zogq/kvIHkvI7lhbblhoDll5zlmajlnLvln7rln7zlpJTlpYflppPlr4TlspDltI7lt7Hlub7lv4zmioDml5fml6NcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMWExXCIsXG5cdFx0XCLmnJ7mnJ/mnZ7mo4vmo4TmqZ/mrLrmsKPmsb3msoLmt4fnjpjnkKbnkKrnkoLnkqPnlbjnlb/nooHno6/npYHnpYfnpYjnpbrnrpXntIDntrrnvojogIbogK3ogozoqJjorY/osYjotbfpjKHpjKTpo6LppZHpqI7pqI/pqaXpupLnt4rkvbblkInmi67moZTph5HllqvlhLrvpIvvpIzlqJzmh6bvpI3mi4/mi7/vpI5cIixcblx0XHQ1LFxuXHRcdFwi6YKj76SUXCIsXG5cdFx0NCxcblx0XHRcIuirvu+kme+kmu+km++knOaalu+kneeFlu+knu+kn+mbo++koOaNj+aNuuWNl++koeaej+aloOa5s++koueUt++ko++kpO+kpVwiXG5cdF0sXG5cdFtcblx0XHRcImQyYTFcIixcblx0XHRcIue0je+kpu+kp+ihsuWbiuWomO+kqFwiLFxuXHRcdDQsXG5cdFx0XCLkuYPvpK3lhaflpYjmn7DogJDvpK7lpbPlubTmkprnp4rlv7Xmgazmi4jmjbvlr6flr5fliqrvpK/lpbTlvKnmgJLvpLDvpLHvpLLnkZnvpLNcIixcblx0XHQ1LFxuXHRcdFwi6aeR76S5XCIsXG5cdFx0MTAsXG5cdFx0XCLmv4PvpYTvpYXohr/ovrLmg7HvpYbvpYfohabvpYjvpYnlsL/vpYpcIixcblx0XHQ3LFxuXHRcdFwi5aup6Kil5p2757SQ76WSXCIsXG5cdFx0NSxcblx0XHRcIuiDve+lmO+lmeWwvOazpeWMv+a6uuWkmuiMtlwiXG5cdF0sXG5cdFtcblx0XHRcImQzYTFcIixcblx0XHRcIuS4ueS6tuS9huWWruWcmOWjh+W9luaWt+aXpuaqgOautea5jeefreerr+ewnue3nuibi+iikumEsumNm+aSu+a+vueNuueWuOmBlOWVluWdjeaGuuaTlOabh+a3oea5m+a9rea+ueeXsOiBg+iGveiVgeimg+irh+itmumMn+ayk+eVk+etlOi4j+mBneWUkOWgguWhmOW5ouaIh+aSnuajoOeVtuezluies+m7qOS7o+WeiOWdruWkp+WwjeWyseW4tuW+heaItOaToeeOs+iHuuiii+iyuOmaium7m+WuheW+t+aCs+WAkuWIgOWIsOWcluWgteWhl+WwjuWxoOWztuW2i+W6puW+kuaCvOaMkeaOieaQl+ahg1wiXG5cdF0sXG5cdFtcblx0XHRcImQ0YTFcIixcblx0XHRcIuajueargua3mOa4oea7lOa/pOeHvuebnOedueemseeou+iQhOimqeizrei3s+i5iOmAg+mAlOmBk+mDvemNjemZtumfnOavkueAhueJmOeKoueNqOedo+emv+evpOe6m+iugOWiqeaDh+aVpuaXveaavuayjOeEnueHieixmumgk+S5reeqgeS7neWGrOWHjeWLleWQjOaGp+adseahkOajn+a0nua9vOeWvOees+erpeiDtOiRo+mKheWFnOaWl+adnOaek+eXmOerh+iNs++lmuixhumAl+mgreWxr+iHgOiKmumBgemBr+mIjeW+l+W2neapmeeHiOeZu+etieiXpOishOmEp+mosOWWh+aHtu+lm+eZqee+hVwiXG5cdF0sXG5cdFtcblx0XHRcImQ1YTFcIixcblx0XHRcIuiYv+ieuuijuOmCj++lnOa0m+eDmeePnue1oeiQve+lnemFqumnse+lnuS6guWNteashOaskueAvueIm+iYrem4nuWJjOi+o+W1kOaTpeaUrOaslua/q+exg+e6nOiXjeilpOimveaLieiHmOign+W7iuacl+a1queLvOeQheeRr+iegumDnuS+huW0jeW+oOiQiuWGt+aOoOeVpeS6ruWAhuWFqeWHieaigeaokeeyrueyseezp+iJr+irkui8m+mHj+S+tuWEt+WLteWRguW7rOaFruaIvuaXhearmua/vuekquiXnOigo+mWrempoumpqum6l+m7juWKm+abhuatt+eAneekq+i9oumdguaGkOaIgOaUo+a8o1wiXG5cdF0sXG5cdFtcblx0XHRcImQ2YTFcIixcblx0XHRcIueFieeSiee3tOiBr+iTrui8pumAo+mNiuWGveWIl+WKo+a0jOeDiOijguW7ieaWguaurua/guewvueNteS7pOS8tuWbue+ln+WyuuW2uuaAnOeOsuesree+mue/juiBhumAnumItOmbtumdiOmgmOm9oeS+i+a+p+emrumGtOmat+WLnu+loOaSiOaThOark+a9nueAmOeIkOebp+iAgeiYhuiZnOi3r+i8hemcsumtr+m3uum5teeijOelv+e2oOiPiemMhOm5v+m6k+irluWjn+W8hOacp+eAp+eTj+exoOiBvuWEoeeAqOeJouejiuizguizmuiztOmbt+S6huWDmuWvruW7luaWmeeHjueZgueereiBiuiTvFwiXG5cdF0sXG5cdFtcblx0XHRcImQ3YTFcIixcblx0XHRcIumBvOmsp+m+jeWjmOWpgeWxouaok+a3mua8j+eYu+e0r+e4t+iUnuikuOmPpOmZi+WKieaXkuafs+amtOa1gea6nOeAj+eQieeRoOeVmeeYpOehq+isrOmhnuWFreaIrumZuOS+luWAq+W0mea3que2uOi8quW+i+aFhOagl++loemahuWLkuiCi+WHnOWHjOalnueonOe2vuiPsemZteS/muWIqeWOmOWQj+WUjuWxpeaCp+adjuaiqOa1rOeKgeeLuOeQhueSg++loueXouexrOe9uee+uOiOieijj+ijoemHjOmHkOmboumvieWQnea9vueHkOeSmOiXuui6qumao+mxl+m6n+ael+a3i+eQs+iHqOmcluegrFwiXG5cdF0sXG5cdFtcblx0XHRcImQ4YTFcIixcblx0XHRcIueri+esoOeykuaRqeeRqueXsueivOejqOmmrOmtlOm6u+WvnuW5lea8oOiGnOiOq+mCiOS4h+WNjeWoqeW3kuW9juaFouaMveaZqeabvOa7v+a8q+eBo+eenuiQrOiUk+igu+i8k+mlhemwu+WUnOaKueacq+ayq+iMieilqumduuS6oeWmhOW/mOW/meacm+e2sue9lOiKkuiMq+iOvei8numCmeWfi+WmueWqkuWvkOaYp+aemuaiheavj+eFpOe9teiyt+izo+mCgemtheiEiOiyiumZjOmpgOm6peWtn+awk+eMm+ebsuebn+iQjOWGquimk+WFjeWGleWLieajieaylOechOecoOe2v+e3rOmdoum6tea7hVwiXG5cdF0sXG5cdFtcblx0XHRcImQ5YTFcIixcblx0XHRcIuiUkeWGpeWQjeWRveaYjuaaneakp+a6n+eav+eekeiMl+iTguien+mFqemKmOmztOiiguS+ruWGkuWLn+WnhuW4veaFleaRuOaRueaaruafkOaooeavjeavm+eJn+eJoeeRgeecuOefm+iAl+iKvOiMheisgOisqOiyjOacqOaykOeJp+ebruedpuephum2qeatv+aykuWkouacpuiSmeWNr+Wik+WmmeW7n+aPj+aYtOads+a4uueMq+erl+iLl+mMqOWLmeW3q+aGruaHi+aIiuaLh+aSq+aXoOalmeatpuavi+eEoeePt+eVnee5huiInuiMguiVquiqo+iyv+mcp+m1oeWiqOm7mOWAkeWIjuWQu+WVj+aWh1wiXG5cdF0sXG5cdFtcblx0XHRcImRhYTFcIixcblx0XHRcIuaxtue0iue0i+iBnuiaiumWgOmbr+WLv+ayleeJqeWRs+WqmuWwvuW1i+W9jOW+ruacquaitualo+a4vOa5hOecieexs+e+juiWh+isjui/t+mdoem7tOWyt+aCtuaEjeaGq+aVj+aXu+aXvOawkeazr+eOn+ePiee3oemWlOWvhuicnOiskOWJneWNmuaLjeaQj+aSsuactOaouOaziuePgOeSnueulOeylee4m+iGiuiItuiWhOi/q+mbuemngeS8tOWNiuWPjeWPm+aLjOaQrOaUgOaWkeang+azrua9mOePreeVlOeYouebpOebvOejkOeju+ekrOe1huiIrOifoOi/lOmgkumjr+WLg+aLlOaSpea4pOa9kVwiXG5cdF0sXG5cdFtcblx0XHRcImRiYTFcIixcblx0XHRcIueZvOi3i+mGsemJoumrrumtg+WAo+WCjeWdiuWmqOWwqOW5h+W9t+aIv+aUvuaWueaXgeaYieaei+amnOa7guejhee0oeiCquiGgOiIq+iKs+iSoeiajOioquisl+mCpumYsum+kOWAjeS/s++lo+WfueW+mOaLnOaOkuadr+a5g+eEmeebg+iDjOiDmuijtOijteikmeizoOi8qemFjemZquS8r+S9sOW4m+afj+agoueZveeZvumthOW5oeaoiueFqeeHlOeVqu+lpOe5geiVg+iXqemjnOS8kOetj+e9sOmWpeWHoeW4huaiteawvuaxjuazm+eKr+evhOiMg+azleeQuuWDu+WKiOWjgeaTmOaql+eSp+eZllwiXG5cdF0sXG5cdFtcblx0XHRcImRjYTFcIixcblx0XHRcIueip+iYl+mXoumcue+lpeWNnuW8geiuiui+qOi+r+mCiuWIpeeepemxiem8iOS4meWAguWFteWxm+W5t+aYnuaYuuafhOajheeCs+eUgeeXheenieernei8p+mkoOmoiOS/neWgoeWgseWvtuaZruatpea0kea5uua9veePpOeUq+iPqeijnOikk+itnOi8lOS8j+WDleWMkOWNnOWuk+W+qeacjeemj+iFueiMr+iUlOikh+imhui8uei8u+mmpemwkuacrOS5tuS/uOWlieWwgeWzr+WzsOaNp+ajkueDveeGoueQq+e4q+iTrOicgumAoumLkumzs+S4jeS7mOS/r+WCheWJluWJr+WQpuWSkOWfoOWkq+WpplwiXG5cdF0sXG5cdFtcblx0XHRcImRkYTFcIixcblx0XHRcIuWtmuWtteWvjOW6nO+lpuaJtuaVt+aWp+a1rua6peeItuespuewv+e8tuiFkOiFkeiGmuiJgOiKmeiOqeiog+iyoOizpuizu+i1tOi2uumDqOmHnOmYnOmZhOmnmemzp+WMl+WIhuWQqeWZtOWis+WllOWlruW/v+aGpOaJruaYkOaxvueEmuebhueyieeznue0m+iKrOizgembsO+lp+S9m+W8l+W9v+aLguW0qeaci+ajmuehvOe5g+m1rOS4leWCmeWMleWMquWNkeWmg+WpouW6h+aCsuaGiuaJieaJueaWkOaeh+amp+avlOavluavl+avmOayuO+lqOeQteeXuuegkueikeenleenmOeyg+e3i+e/oeiCpVwiXG5cdF0sXG5cdFtcblx0XHRcImRlYTFcIixcblx0XHRcIuiEvuiHguiPsuicmuijqOiqueitrOiyu+mEmemdnumjm+m8u+WarOWsquW9rOaWjOaqs+aur+a1nOa/seeAleeJneeOreiyp+izk+mgu+aGkeawt+iBmOmogeS5jeS6i+S6m+S7leS8uuS8vOS9v+S/n+WDv+WPsuWPuOWUhuWXo+Wbm+Wjq+WlouWokeWvq+WvuuWwhOW3s+W4q+W+meaAneaNqOaWnOaWr+aftuafu+aireatu+aymeazl+a4o+eAieeNheegguekvuelgOeloOengeevqee0l+e1suiChuiIjeiOjuiTkeibh+ijn+ipkOipnuisneiznOi1pui+remCqumjvOmnn+m6neWJiu+lqeaclO+lqlwiXG5cdF0sXG5cdFtcblx0XHRcImRmYTFcIixcblx0XHRcIuWCmOWIquWxseaVo+axleePiueUo+eWneeul+iSnOmFuOmcsOS5t+aSkuauuueFnuiWqeS4ie+lq+adieajrua4l+iKn+iUmOihq+aPt+a+gemIkumir+S4iuWCt+WDj+WEn+WVhuWWquWYl+WtgOWwmeWzoOW4uOW6iuW6oOW7guaDs+ahkeapoea5mOeIveeJgOeLgOebuOelpeeusee/lOijs+intOips+ixoeiznumcnOWhnueSveizveWXh++lrOepoee0ouiJsueJsueUn+eUpe+lreesmeWiheWju+W2vOW6j+W6tuW+kOaBleaKkuaNv+aVjeaakeabmeabuOagluajsueKgOeRnuetrue1rue3lue9slwiXG5cdF0sXG5cdFtcblx0XHRcImUwYTFcIixcblx0XHRcIuiDpeiIkuiWr+ilv+iqk+mAnemLpOm7jem8oOWkleWlreW4reaDnOaYlOaZs+aekOaxkOa3hea9n+efs+eiqeiThumHi+mMq+S7meWDiuWFiOWWhOWsi+Wuo+aJh+aVvuaXi+a4sueFveeQgeeRhOeSh+eSv+eZrOemque3mue5lee+qOiFuuiGs+iIueiYmuifrOiptei3o+mBuOmKkemQpemljemuruWNqOWxkeallOazhOa0qea4q+iIjOiWm+iku+ioreiqqumbqum9p+WJoeaaueausue6luifvui0jemWg+mZneaUnea2ieeHru+lruWfjuWnk+WurOaAp+aDuuaIkOaYn+aZn+eMqeePueebm+ecgeetrFwiXG5cdF0sXG5cdFtcblx0XHRcImUxYTFcIixcblx0XHRcIuiBluiBsuiFpeiqoOmGkuS4luWLouatsua0l+eoheesuee0sO+lr+iysOWPrOWYr+WhkeWuteWwj+WwkeW3ouaJgOaOg+aQlOaYreais+ayvOa2iOa6r+eAn+eCpOeHkueUpueWj+eWjueYmeeskeevoOewq+e0oOe0ueiUrOiVreiYh+iotOmAjemBoemCtemKt+mftumot+S/l+WxrOadn+a2keeyn+e6jOislui0lumAn+Wtq+W3veaQjeiTgOmBnOmjoeeOh+Wui+aCmuadvua3nuion+iqpumAgemgjOWIt++lsOeBkeeijumOluihsOmHl+S/ruWPl+WXveWbmuWeguWjveWrguWuiOWyq+WzgOW4peaEgVwiXG5cdF0sXG5cdFtcblx0XHRcImUyYTFcIixcblx0XHRcIuaIjeaJi+aOiOaQnOaUtuaVuOaoueauiuawtOa0mea8seeHp+eLqeeNuOeQh+eSsueYpuedoeengOepl+erqueyuee2j+e2rOe5oee+nuiEqeiMseiSkOiTmuiXquiiluiqsOiukOi8uOmBgumCg+mFrOmKlumKuemai+map+maqOmblumcgOmgiOmmlumrk+msmuWPlOWhvuWkmeWtsOWuv+a3kea9mueGn+eQoeeSueiCheiPveW3oeW+h+W+quaBguaXrOagkualr+apk+auiea0tea3s+ePo+ebvueerOetjee0lOiEo+iInOiNgOiTtOiVo+ipouirhOmGh+mMnumghummtOaIjOihk+i/sOmJpeW0h+W0p1wiXG5cdF0sXG5cdFtcblx0XHRcImUzYTFcIixcblx0XHRcIuW1qeeRn+iGneidqOa/leaLvue/kuiktuilsuS4nuS5mOWDp+WLneWNh+aJv+aYh+e5qeighemZnuS+jeWMmeWYtuWni+WqpOWwuOWxjuWxjeW4guW8keaBg+aWveaYr+aZguaevuaftOeMnOefouekuue/heiSlOiTjeimluippuipqeiroeixleixuuWftOWvlOW8j+aBr+aLreakjeaulua5nOeGhOevkuidleitmOi7vumjn+mjvuS8uOS+geS/oeWRu+WooOWuuOaEvOaWsOaZqOeHvOeUs+elnue0s+iFjuiHo+iOmOiWquiXjuicg+ioiui6q+i+m++lsei/heWkseWupOWvpuaCieWvqeWwi+W/g+aygVwiXG5cdF0sXG5cdFtcblx0XHRcImU0YTFcIixcblx0XHRcIu+lsua3seeAi+eUmuiKr+irtuS7gOWNge+ls+mbmeawj+S6nuS/hOWFkuWVnuWopeWzqOaIkeeJmeiKveiOquibvuihmeionemYv+mbhemkk+m0iem1neWgiuWys+W2veW5hOaDoeaEleaPoeaogua4pemEgumNlOmhjumwkOm9t+WuieWyuOaMieaZj+ahiOecvOmbgemejemhlOmun+aWoeisgei7i+mWvOWUteWyqeW3luW6teaal+eZjOiPtOmXh+Wjk+aKvOeLjum0qOS7sOWkruaAj+aYu+aug+enp+m0puWOk+WTgOWfg+W0luaEm+ablua2r+eijeiJvumamOmdhOWOhOaJvOaOlua2sue4iuiFi+mhjVwiXG5cdF0sXG5cdFtcblx0XHRcImU1YTFcIixcblx0XHRcIuaru+e9jOm2r+m4muS5n+WAu+WGtuWknOaDueaPtuaksOeIuuiAtu+ltOmHjuW8se+lte+ltue0hOiLpeiRr+iSu+iXpei6je+lt+S9r++luO+lueWjpOWtg+aBmeaPmuaUmOaVreaamO+luualiuaoo+a0i+eAgeeFrOeXkueYjeems+epsO+lu+e+iu+lvOilhO+lveiuk+mHgOmZve+lvumkiuWchOW+oeaWvOa8geeYgOempuiqnummremtmum9rOWEhOaGtuaKkeaqjeiHhuWBg+WgsOW9pueEieiogOiruuWtvOiYluS/uuWEvOWatOWlhOaOqea3ueW2qualreWGhuS6iOS9me+lv++mgO+mgeWmgu+mglwiXG5cdF0sXG5cdFtcblx0XHRcImU2YTFcIixcblx0XHRcIu+mg+atn+axne+mhOeSteeklu+mheiIh+iJheiMuei8v+i9ne+mhumkmO+mh++miO+mieS6pu+miuWfn+W9ueaYk++mi++mjOeWq+e5ueitr++mjemAhumpm+WapeWgp+WnuOWon+WutO+mjuW7tu+mj++mkOaNkOaMu++mkeakveayh+ayv+a2jua2k+a3tea8lO+mkueDn+eEtueFme+mk+eHg+eHle+mlOehj+ehr++mleettee3o++mlue4r++ml+ihjei7n++mmO+mme+mmumJm++mm+mztu+mnO+mne+mnuaChea2he+mn+eGse+moO+moemWseWOre+mou+mo++mpOafk++mpeeCjueEsOeQsOiJtuiLklwiXG5cdF0sXG5cdFtcblx0XHRcImU3YTFcIixcblx0XHRcIu+mpumWu+mrpem5veabhO+mp+eHgeiRie+mqO+mqeWhi++mqu+mq+W2uOW9se+mrOaYoOaajualueamruawuOazs+a4tua9gea/mueAm+eAr+eFkOeHn+eNsO+mreeRm++mrueTlOebiOepjue6k++mr++msOiLseipoOi/ju+msemNiO+msumcme+ms++mtOS5guWAqu+mteWIiOWPoeabs+axrea/iueMiuedv+epouiKruiXneiYgu+mtuijlOipo+itveixq++mt+mKs++muOmck+mgkOS6lOS8jeS/ieWCsuWNiOWQvuWQs+WXmuWhouWiuuWlp+Wom+WvpOaCn++mueaHiuaVluaXv+aZpOaip+axmua+s1wiXG5cdF0sXG5cdFtcblx0XHRcImU4YTFcIixcblx0XHRcIueDj+eGrOeNkuetveiciOiqpOmwsum8h+Wxi+ayg+eNhOeOiemIuua6q+eRpeeYn+epqee4leiYiuWFgOWjheaTgeeTrueUleeZsOe/gemClembjemllOa4pueTpueqqeeqquiHpeibmeiduOiom+WpieWujOWum+aioeakgOa1o+eOqeeQk+eQrOeil+e3qee/q+iEmOiFleiOnuixjOmYrumgkeabsOW+gOaXuuaeieaxqueOi+WAreWog+atquefruWkluW1rOW3jeeMpeeVj++muu+mu+WDpeWHueWgr+WkreWmluWnmuWvpe+mvO+mveW2ouaLl+aQluaSk+aTvu+mvuabnO+mv+apiO+ngOeHv+eRpO+ngVwiXG5cdF0sXG5cdFtcblx0XHRcImU5YTFcIixcblx0XHRcIueqiOeqr+e5h+e5nuiAgOiFsO+nguifr+imgeisoOmBme+ng+mCgOmlkuaFvuassua1tOe4n+ikpei+seS/keWCreWGl+WLh+Wfh+WiieWuueW6uOaFguamlea2jOa5p+a6tueGlOeRoueUqOeUrOiBs+iMuOiTiei4iumOlOmPnu+nhOS6juS9keWBtuWEquWPiOWPi+WPs+Wuh+Wvk+WwpOaEmuaGguaXtOeJm+eOl+eRgOebguelkOemkeemuee0hue+veiKi+iXleiZnui/gumBh+mDtemHqumahembqOmbqeWLluW9p+aXreaYseagr+eFnOeotumDgemgiuS6ke+nheapkuaunua+kOeGieiAmOiKuOiVk1wiXG5cdF0sXG5cdFtcblx0XHRcImVhYTFcIixcblx0XHRcIumBi+malembsumfu+iUmumsseS6kOeGiumbhOWFg+WOn+WToeWck+WckuWeo+Wqm+WrhOWvg+aAqOaEv+aPtOayhea0uea5sua6kOeIsOeMv+eRl+iLkeiigei9hemBoO+nhumZoumhmOm0m+aciOi2iumJnuS9jeWBieWDnuWNseWcjeWnlOWogeWwieaFsOaakOa4reeIsueRi+e3r+iDg+iQjuiRpuiUv+idn+ihm+ikmOisgumBlemfi+mtj+S5s+S+keWEkuWFqu+nh+WUr+WWqeWtuuWupeW5vOW5veW6vuaCoOaDn+aEiOaEieaPhOaUuOacie+niOaflOafmu+niealoealouayuea0p++niua4uO+ni1wiXG5cdF0sXG5cdFtcblx0XHRcImViYTFcIixcblx0XHRcIua/oeeMtueMt++njOeRnOeUse+njeeZku+nju+nj+e2reiHvuiQuOijleiqmOirm+irrei4sOi5gumBiumAvumBuumFiemHiemNru+nkO+nkeWgie+nkuavk+iCieiCsu+nk++nlOWFgeWlq+Wwue+nle+nlua9pOeOp+iDpOi0h++nl+mIl+mWj++nmO+nme+nmu+nm+iBv+aIjueAnOe1qOieje+nnOWeoOaBqeaFh+aut+iqvumKgOmaseS5meWQn+a3q+iUremZsOmfs+mjruaPluazo+mCkeWHneaHieiGuum3ueS+neWAmuWEgOWunOaEj+aHv+aTrOakheavheeWkeefo+e+qeiJpOiWj+ifu+iho+iqvFwiXG5cdF0sXG5cdFtcblx0XHRcImVjYTFcIixcblx0XHRcIuitsOmGq+S6jOS7peS8iu+nne+nnuWkt+WnqO+nn+W3suW8m+W9m+aAoe+noO+noe+nou+no+eIvuePpe+npOeVsOeXje+npeenu++npuiAjOiAs+iChOiLoeiNke+np++nqOiyveiys+mCh++nqe+nqumjtOmkjO+nq++nrOeAt+ebiue/iue/jOe/vOismuS6uuS7geWIg+WNsO+nreWSveWboOWnu+WvheW8leW/jea5ru+nru+nr+e1quiMte+nsOiak+iqje+nsemdremdt++nsu+ns+S4gOS9muS9vuWjueaXpea6oumAuOmOsOmmueS7u+WjrOWmiuWnmeaBge+ntO+nteeolO+ntuiNj+izg+WFpeWNhFwiXG5cdF0sXG5cdFtcblx0XHRcImVkYTFcIixcblx0XHRcIu+nt++nuO+nueS7jeWJqeWtleiKv+S7lOWIuuWSqOWnieWnv+WtkOWtl+WtnOaBo+aFiOa7i+eCmeeFrueOhueTt+eWteejgee0q+iAheiHquiMqOiUl+iXieirruizh+mbjOS9nOWLuuWavOaWq+aYqOeBvOeCuOeItee2veiKjemFjOmbgOm1suWtseajp+aumOa9uuebnuWykeaaq+a9m+eutOewquigtumbnOS4iOS7l+WMoOWgtOWiu+Wjr+WlrOWwh+W4s+W6hOW8teaOjOaasuadluaon+aqo+asjOa8v+eJhu+nuueNkOeSi+eroOeyp+iFuOiHn+iHp+iOiuiRrOiUo+iWlOiXj+ijnei0k+mGrOmVt1wiXG5cdF0sXG5cdFtcblx0XHRcImVlYTFcIixcblx0XHRcIumanOWGjeWTieWcqOWusOaJjeadkOagveaik+a4vea7k+eBvee4oeijgeiyoei8iem9i+m9jueIreeuj+irjemMmuS9h+S9juWEsuWSgOWnkOW6leaKteadtealruaol+ayrua4mueLmeeMqueWveeuuOe0teiLp+iPueiRl+iXt+ipm+iyr+i6h+mAmemCuOmbjum9n+WLo+WQiuWroeWvguaRmOaVtea7tOeLhO+nu+eahOepjeesm+exjee4vue/n+iNu+isq+iziui1pOi3oei5n+i/qui/uemBqemPkeS9g+S9uuWCs+WFqOWFuOWJjeWJquWhoeWhvOWloOWwiOWxleW7m+aCm+aIsOagk+auv+awiOa+sVwiXG5cdF0sXG5cdFtcblx0XHRcImVmYTFcIixcblx0XHRcIueFjueQoOeUsOeUuOeVkeeZsuetjOeui+eureevhue6j+iprui8vui9iemIv+mKk+mMoumQq+mbu+mhmumhq+mknuWIh+aIquaKmOa1meeZpOeriuevgOe1tuWNoOWyvuW6l+a8uOeCueeymOmckemujum7nuaOpeaRuuidtuS4geS6leS6reWBnOWBteWRiOWng+WumuW5gOW6reW7t+W+geaDheaMuuaUv+aVtOaXjOaZtuaZuOafvualqOaqieato+axgOa3gOa3qOa4n+a5nueAnueCoeeOjuePveeUuuedm+eih+emjueoi+epveeyvue2juiJh+ioguirquiynumEremFiumHmOmJpumLjOmMoOmchumdllwiXG5cdF0sXG5cdFtcblx0XHRcImYwYTFcIixcblx0XHRcIumdnOmggum8juWItuWKkeWVvOWgpOW4neW8n+aCjOaPkOair+a/n+elreesrOiHjeiWuuijveiruOi5hOmGjemZpOmam+mcvemhjOm9iuS/juWFhuWHi+WKqeWYsuW8lOW9q+aOquaTjeaXqeaZgeabuuabueacneaineajl+anvea8lea9rueFp+eHpeeIqueSquecuuelluelmuenn+eooOeqleeyl+ezn+e1hOe5sOiCh+iXu+iapOiplOiqv+i2mei6gemAoOmBremHo+mYu+mblemzpeaXj+ewh+i2s+mPg+WtmOWwiuWNkuaLmeeMneWAp+Wul+W+nuaCsOaFq+ajlea3meeQrueorue1gue2nOe4seiFq1wiXG5cdF0sXG5cdFtcblx0XHRcImYxYTFcIixcblx0XHRcIui4qui4temNvumQmOS9kOWdkOW3puW6p+aMq+e9quS4u+S9j+S+j+WBmuWnneiDhOWRquWRqOWXvuWlj+WumeW3nuW7muaZneacseafseagquazqOa0sua5iua+jeeCt+ePoOeWh+exjOe0gue0rOe2ouiIn+ibm+iou+iqhei1sOi6iui8s+mAsemFjumFkumRhOmnkOerueeypeS/iuWEgeWHhuWfiOWvr+Wzu+aZmeaovea1mua6lua/rOeEjOeVr+ero+igoumAoemBtembi+mnv+iMgeS4reS7suihhumHjeWNvearm+alq+axgeiRuuWinuaGjuabvuaLr+eDneeUkeeXh+e5kuiSuOitiei0iOS5i+WPqlwiXG5cdF0sXG5cdFtcblx0XHRcImYyYTFcIixcblx0XHRcIuWSq+WcsOWdgOW/l+aMgeaMh+aRr+aUr+aXqOaZuuaeneaes+atouaxoOaymua8rOefpeegpeelieell+e0meiCouiEguiHs+iKneiKt+icmOiqjO+nvOi0hOi2vumBsuebtOeomeeot+e5lOiBt+WUh+WXlOWhteaMr+aQouaZieaZi+ahreamm+auhOa0pea6seePjeeRqOeSoeeVm+eWueeboeecnueei+enpue4iee4neiHu+iUr+iil+iouuizkei7q+i+sOmAsumOremZo+mZs+mch+S+hOWPseWnquWrieW4meahjueThueWvuenqeeqkuiGo+ibreizqui3jOi/reaWn+acle+nveWft+a9l+e3nei8r1wiXG5cdF0sXG5cdFtcblx0XHRcImYzYTFcIixcblx0XHRcIumPtumbhuW+teaHsua+hOS4lOS+mOWAn+WPieWXn+W1r+W3ruasoeatpOeji+eumu+nvui5iei7iumBruaNieaQvuedgOeqhOmMr+mRv+m9quaSsOa+r+eHpueSqOeTmuerhOewkue6gueysue6mOiumui0iumRvemkkOmljOWIueWvn+aTpuacree0ruWDreWPg+WhueaFmOaFmeaHuuaWrOermeiukuiuluWAieWAoeWJteWUseWovOW7oOW9sOaEtOaVnuaYjOaYtuaaouanjea7hOa8sueMlueYoeeqk+iEueiJmeiPluiSvOWCteWfsOWvgOWvqOW9qeaOoeegpue2teiPnOiUoemHh+mHteWGiuafteetllwiXG5cdF0sXG5cdFtcblx0XHRcImY0YTFcIixcblx0XHRcIuiyrOWHhOWmu+aCveiZleWAnO+nv+WJlOWwuuaFveaImuaLk+aTsuaWpea7jOeYoOiEiui5oOmZn+mau+S7n+WNg+WWmOWkqeW3neaTheaziea3uueOlOepv+iIm+iWpuizpOi4kOmBt+mHp+mXoemYoemfhuWHuOWTsuWWhuW+ueaSpOa+iOe2tOi8n+i9jemQteWDieWwluayvua3u+eUm+eeu+ewveexpOipueirguWgnuWmvuW4luaNt+eJkueWiuedq+irnOiyvOi8kuW7s+aZtOa3uOiBveiPgeiri+mdkemvlu+ogOWJg+abv+a2lea7r+e3oOirpumArumBnumrlOWIneWJv+WTqOaGlOaKhOaLm+aiolwiXG5cdF0sXG5cdFtcblx0XHRcImY1YTFcIixcblx0XHRcIuakkualmuaoteeCkueEpuehneekgeekjuenkueojeiCluiJuOiLleiNieiVieiygui2hemFoumGi+mGruS/g+WbkeeHreefl+icgOinuOWvuOW/luadkemCqOWPouWhmuWvteaCpOaGgeaRoOe4veiBsOiUpemKg+aSruWCrOW0lOacgOWinOaKveaOqOakjualuOaonua5q+eauueni+iKu+iQqeirj+i2qOi/vemEkumFi+mGnOmMkOmMmOmOmumbm+motumwjeS4keeVnOelneeruuetkeeviee4ruiThOi5mei5tOi7uOmAkOaYpeakv+eRg+WHuuacrum7nOWFheW/oOayluifsuihneiht+aCtOiGteiQg1wiXG5cdF0sXG5cdFtcblx0XHRcImY2YTFcIixcblx0XHRcIui0heWPluWQueWYtOWotuWwseeCiue/oOiBmuiEhuiHrei2o+mGiempn+m3suWBtOS7hOWOoOaDu+a4rOWxpOS+iOWApOWXpOWzmeW5n+aBpeailOayu+a3hOeGvueXlOeXtOeZoeeomuepiee3h+e3u+e9ruiHtOiaqei8nOmbiemms+m9kuWJh+WLhemjreimquS4g+afkua8huS+teWvouaeleayiOa1uOeQm+egp+mHnemNvOifhOenpOeoseW/q+S7luWSpOWUvuWiruWmpeaDsOaJk+aLluactualleiItemZgOmmsemnneWArOWNk+WVhOWdvO+ogeaJmO+oguaTouaZq+afnea/gea/r+eQoueQuOiol1wiXG5cdF0sXG5cdFtcblx0XHRcImY3YTFcIixcblx0XHRcIumQuOWRkeWYhuWdpuW9iOaGmuatjueBmOeCree2u+iqleWlquiEq+aOoueciOiAveiyquWhlOaQreamu+WuleW4kea5r++og+iVqeWFjOWPsOWkquaAoOaFi+auhuaxsOazsOesnuiDjuiLlOi3humCsOmise+ohOaTh+a+pOaSkeaUhOWFjuWQkOWcn+iojuaFn+ahtu+oheeXm+etkue1semAmuWghuanjOiFv+ikqumAgOmgueWBuOWll+WmrOaKlemAj+msquaFneeJuemXluWdoeWphuW3tOaKiuaSreaTuuadt+azoua0vueIrOeQtuegtOe9t+iKrei3m+mgl+WIpOWdguadv+eJiOeTo+iyqei+pumIkVwiXG5cdF0sXG5cdFtcblx0XHRcImY4YTFcIixcblx0XHRcIumYquWFq+WPreaNjOS9qeWUhOaCluaVl+aym+a1v+eJjOeLveeol+imh+iyneW9rea+jueDueiGqOaEjuS+v+WBj+aJgeeJh+evh+e3qOe/qemBjemeremomeiytuWdquW5s+aesOiQjeipleWQoOWsluW5o+W7ouW8iuaWg+iCuuiUvemWiemZm+S9iOWMheWMjeWMj+WShuWTuuWcg+W4g+aAluaKm+aKseaNle+ohuazoea1pueWseegsuiDnuiEr+iLnuiRoeiSsuiijeikkumAi+mLqumjvemukeW5heaatOabneeAkeeIhu+oh+S/teWJveW9quaFk+adk+aomea8gueTouelqOihqOixuemjh+mjhOmpg1wiXG5cdF0sXG5cdFtcblx0XHRcImY5YTFcIixcblx0XHRcIuWTgeeon+alk+irt+ixiumiqOmmruW9vOaKq+eWsuearuiiq+mBv+mZguWMueW8vOW/heazjOePjOeVoueWi+ethuiLvummneS5j+mAvOS4i+S9leWOpuWkj+W7iOaYsOays+eRleiNt+idpuizgOmBkOmcnumwleWjkeWtuOiZkOislOm2tOWvkuaBqOaCjeaXseaxl+a8oua+o+eAmue9lee/sOmWkemWkumZkOmfk+WJsui9hOWHveWQq+WSuOWVo+WWiuaqu+a2tee3mOiJpumKnOmZt+m5ueWQiOWTiOebkuibpOmWpOmXlOmZnOS6ouS8ieWnruWrpuW3t+aBkuaKl+adreahgeayhua4r+e8uOiCm+iIqlwiXG5cdF0sXG5cdFtcblx0XHRcImZhYTFcIixcblx0XHRcIu+oiO+oiemgheS6peWBleWSs+Wek+WlmuWtqeWus+aHiOalt+a1t+eAo+ifueino+ipsuirp+mCgumnremquOWKvuaguOWAluW5uOadj+iNh+ihjOS6q+WQkeWaruePpumElemfv+mkiemll+mmmeWZk+Win+iZm+ioseaGsuartueNu+i7kuath+maqumpl+WlleeIgOi1q+mdqeS/lOWztOW8puaHuOaZm+azq+eCq+eOhOeOueePvuecqeedjee1g+e1oue4o+iIt+ihku+oiuizoumJiemhr+WtkeeptOihgOmggeWrjOS/oOWNlOWkvuWzveaMvua1ueeLueiEheiEh+iOoumLj+mgsOS6qOWFhOWIkeWei1wiXG5cdF0sXG5cdFtcblx0XHRcImZiYTFcIixcblx0XHRcIuW9ouazgua7jueAheeBkOeCr+eGkuePqeeRqeiNiuieouihoemAiOmCoumOo+mmqOWFruW9l+aDoOaFp+aas+iVmei5iumGr+mei+S5juS6kuWRvOWjleWjuuWlveWyteW8p+aItuaJiOaYiuaZp+avq+a1qea3j+a5lua7uOa+lOa/oOa/qeeBneeLkOeQpeeRmueToOeak+elnOeziue4nuiDoeiKpuiRq+iSv+iZjuiZn+idtOitt+ixqumOrOmggOmhpeaDkeaIlumFt+WpmuaYj+a3t+a4vueQv+mtguW/veaDmuesj+WThOW8mOaxnuazk+a0queDmOe0heiZueiojOm0u+WMluWSjOWsheaouueBq+eVtVwiXG5cdF0sXG5cdFtcblx0XHRcImZjYTFcIixcblx0XHRcIuemjeemvuiKseiPr+ipseitgeiyqOmdtO+oi+aTtOaUq+eiuueiu+epq+S4uOWWmuWlkOWupuW5u+aCo+aPm+atoeaZpeahk+a4meeFpeeSsOe0iOmChOmpqemwpea0u+a7keeMvuixgemXiuWHsOW5jOW+qOaBjeaDtuaEsOaFjOaZg+aZhOampeazgea5n+a7iea9oueFjOeSnOeah+evgeewp+iNkuidl+mBkemajem7g+WMr+WbnuW7u+W+iuaBouaClOaHt+aZpuacg+aqnOa3rua+rueBsOeNque5quiGvuiMtOiblOiqqOizhOWKg+eNsuWuluapq+mQhOWTruWahuWtneaViOaWheabieain+a2jea3hlwiXG5cdF0sXG5cdFtcblx0XHRcImZkYTFcIixcblx0XHRcIueIu+iCtOmFtempjeS+r+WAmeWOmuWQjuWQvOWWieWXheW4v+W+jOacveeFpuePnemAheWLm+WLs+WhpOWjjueEhOeGj+eHu+iWsOiok+aaiOiWqOWWp+aahOeFiuiQseWNieWWmeavgeW9meW+veaPruaaieeFh+irsei8nem6vuS8keaQuueDi+eVpuiZp+aBpOitjum3uOWFh+WHtuWMiOa0tuiDuOm7keaYleaso+eCmOeXleWQg+Wxuee0h+ioluasoOasveathuWQuOaBsOa0vee/leiIiOWDluWHnuWWnOWZq+WbjeWnrOWsieW4jOaGmeaGmOaIseaZnuabpueGmeeGueeGuueKp+emp+eogOe+suipsFwiXG5cdF1cbl07XG5cbnZhciBjcDk0OSQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCdkZWZhdWx0JzogY3A5NDlcbn0pO1xuXG52YXIgY3A5NTAgPSBbXG5cdFtcblx0XHRcIjBcIixcblx0XHRcIlxcdTAwMDBcIixcblx0XHQxMjdcblx0XSxcblx0W1xuXHRcdFwiYTE0MFwiLFxuXHRcdFwi44CA77yM44CB44CC77yO4oCn77yb77ya77yf77yB77iw4oCm4oCl77mQ77mR77mSwrfvuZTvuZXvuZbvuZfvvZzigJPvuLHigJTvuLPilbTvuLTvuY/vvIjvvInvuLXvuLbvvZvvvZ3vuLfvuLjjgJTjgJXvuLnvuLrjgJDjgJHvuLvvuLzjgIrjgIvvuL3vuL7jgIjjgInvuL/vuYDjgIzjgI3vuYHvuYLjgI7jgI/vuYPvuYTvuZnvuZpcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMWExXCIsXG5cdFx0XCLvuZvvuZzvuZ3vuZ7igJjigJnigJzigJ3jgJ3jgJ7igLXigLLvvIPvvIbvvIrigLvCp+OAg+KXi+KXj+KWs+KWsuKXjuKYhuKYheKXh+KXhuKWoeKWoOKWveKWvOOKo+KEhcKv77+j77y/y43vuYnvuYrvuY3vuY7vuYvvuYzvuZ/vuaDvuaHvvIvvvI3Dl8O3wrHiiJrvvJzvvJ7vvJ3iiabiiafiiaDiiJ7iiZLiiaHvuaJcIixcblx0XHQ0LFxuXHRcdFwi772e4oip4oiq4oql4oig4oif4oq/44+S44+R4oir4oiu4oi14oi04pmA4pmC4oqV4oqZ4oaR4oaT4oaQ4oaS4oaW4oaX4oaZ4oaY4oil4oij77yPXCJcblx0XSxcblx0W1xuXHRcdFwiYTI0MFwiLFxuXHRcdFwi77y84oiV77mo77yE77+l44CS77+g77+h77yF77yg4oSD4oSJ77mp77mq77mr44+V446c446d446e44+O446h446O446P44+EwrDlhZnlhZvlhZ7lhZ3lhaHlhaPll6fnk6nns47iloFcIixcblx0XHQ3LFxuXHRcdFwi4paP4paO4paN4paM4paL4paK4paJ4pS84pS04pSs4pSk4pSc4paU4pSA4pSC4paV4pSM4pSQ4pSU4pSY4pWtXCJcblx0XSxcblx0W1xuXHRcdFwiYTJhMVwiLFxuXHRcdFwi4pWu4pWw4pWv4pWQ4pWe4pWq4pWh4pei4pej4pel4pek4pWx4pWy4pWz77yQXCIsXG5cdFx0OSxcblx0XHRcIuKFoFwiLFxuXHRcdDksXG5cdFx0XCLjgKFcIixcblx0XHQ4LFxuXHRcdFwi5Y2B5Y2E5Y2F77yhXCIsXG5cdFx0MjUsXG5cdFx0XCLvvYFcIixcblx0XHQyMVxuXHRdLFxuXHRbXG5cdFx0XCJhMzQwXCIsXG5cdFx0XCLvvZfvvZjvvZnvvZrOkVwiLFxuXHRcdDE2LFxuXHRcdFwizqNcIixcblx0XHQ2LFxuXHRcdFwizrFcIixcblx0XHQxNixcblx0XHRcIs+DXCIsXG5cdFx0Nixcblx0XHRcIuOEhVwiLFxuXHRcdDEwXG5cdF0sXG5cdFtcblx0XHRcImEzYTFcIixcblx0XHRcIuOEkFwiLFxuXHRcdDI1LFxuXHRcdFwiy5nLicuKy4fLi1wiXG5cdF0sXG5cdFtcblx0XHRcImEzZTFcIixcblx0XHRcIuKCrFwiXG5cdF0sXG5cdFtcblx0XHRcImE0NDBcIixcblx0XHRcIuS4gOS5meS4geS4g+S5g+S5neS6huS6jOS6uuWEv+WFpeWFq+WHoOWIgOWIgeWKm+WMleWNgeWNnOWPiOS4ieS4i+S4iOS4iuS4q+S4uOWHoeS5heS5iOS5n+S5nuS6juS6oeWFgOWIg+WLuuWNg+WPieWPo+Wcn+Wjq+WkleWkp+Wls+WtkOWtkeWtk+WvuOWwj+WwouWwuOWxseW3neW3peW3seW3suW3s+W3vuW5suW7vuW8i+W8k+aJjVwiXG5cdF0sXG5cdFtcblx0XHRcImE0YTFcIixcblx0XHRcIuS4keS4kOS4jeS4reS4sOS4ueS5i+WwueS6iOS6keS6leS6kuS6lOS6ouS7geS7gOS7g+S7huS7h+S7jeS7iuS7i+S7hOWFg+WFgeWFp+WFreWFruWFrOWGl+WHtuWIhuWIh+WIiOWLu+WLvuWLv+WMluWMueWNiOWNh+WNheWNnuWOhOWPi+WPiuWPjeWjrOWkqeWkq+WkquWkreWtlOWwkeWwpOWwuuWxr+W3tOW5u+W7v+W8lOW8leW/g+aIiOaItuaJi+aJjuaUr+aWh+aWl+aWpOaWueaXpeabsOaciOacqOasoOatouatueavi+avlOavm+awj+awtOeBq+eIqueItueIu+eJh+eJmeeJm+eKrOeOi+S4mVwiXG5cdF0sXG5cdFtcblx0XHRcImE1NDBcIixcblx0XHRcIuS4luS4leS4lOS4mOS4u+S5jeS5j+S5juS7peS7mOS7lOS7leS7luS7l+S7o+S7pOS7meS7nuWFheWFhOWGieWGiuWGrOWHueWHuuWHuOWIiuWKoOWKn+WMheWMhuWMl+WMneS7n+WNiuWNieWNoeWNoOWNr+WNruWOu+WPr+WPpOWPs+WPrOWPruWPqeWPqOWPvOWPuOWPteWPq+WPpuWPquWPsuWPseWPsOWPpeWPreWPu+Wbm+WbmuWkllwiXG5cdF0sXG5cdFtcblx0XHRcImE1YTFcIixcblx0XHRcIuWkruWkseWltOWltuWtleWug+WwvOW3qOW3p+W3puW4guW4g+W5s+W5vOW8geW8mOW8l+W/heaIiuaJk+aJlOaJkuaJkeaWpeaXpuacruacrOacquacq+acreato+avjeawkeawkOawuOaxgeaxgOawvueKr+eOhOeOieeTnOeTpueUmOeUn+eUqOeUqeeUsOeUseeUsueUs+eWi+eZveearueav+ebruefm+efouefs+ekuuemvueptOeri+S4nuS4n+S5kuS5k+S5qeS6meS6pOS6puS6peS7v+S8ieS8meS8iuS8leS8jeS8kOS8keS8j+S7suS7tuS7u+S7sOS7s+S7veS8geS8i+WFieWFh+WFhuWFiOWFqFwiXG5cdF0sXG5cdFtcblx0XHRcImE2NDBcIixcblx0XHRcIuWFseWGjeWGsOWIl+WIkeWIkuWIjuWIluWKo+WMiOWMoeWMoOWNsOWNseWQieWQj+WQjOWQiuWQkOWQgeWQi+WQhOWQkeWQjeWQiOWQg+WQjuWQhuWQkuWboOWbnuWbneWcs+WcsOWcqOWcreWcrOWcr+WcqeWkmeWkmuWkt+WkuOWmhOWluOWmg+WlveWlueWmguWmgeWtl+WtmOWuh+WuiOWuheWuieWvuuWwluWxueW3nuW4huW5tuW5tFwiXG5cdF0sXG5cdFtcblx0XHRcImE2YTFcIixcblx0XHRcIuW8j+W8m+W/meW/luaIjuaIjOaIjeaIkOaJo+aJm+aJmOaUtuaXqeaXqOaXrOaXreabsuabs+acieacveactOacseacteasoeatpOatu+awluaxneaxl+axmeaxn+axoOaxkOaxleaxoeaxm+axjeaxjueBsOeJn+eJneeZvuerueexs+ezuOe8tue+iue+veiAgeiAg+iAjOiAkuiAs+iBv+iCieiCi+iCjOiHo+iHquiHs+iHvOiIjOiIm+iIn+iJruiJsuiJvuiZq+ihgOihjOiho+ilv+mYoeS4suS6qOS9jeS9j+S9h+S9l+S9nuS8tOS9m+S9leS8sOS9kOS9keS8veS8uuS8uOS9g+S9lOS8vOS9huS9o1wiXG5cdF0sXG5cdFtcblx0XHRcImE3NDBcIixcblx0XHRcIuS9nOS9oOS8r+S9juS8tuS9meS9neS9iOS9muWFjOWFi+WFjeWFteWGtuWGt+WIpeWIpOWIqeWIquWIqOWKq+WKqeWKquWKrOWMo+WNs+WNteWQneWQreWQnuWQvuWQpuWRjuWQp+WRhuWRg+WQs+WRiOWRguWQm+WQqeWRiuWQueWQu+WQuOWQruWQteWQtuWQoOWQvOWRgOWQseWQq+WQn+WQrOWbquWbsOWbpOWbq+WdiuWdkeWdgOWdjVwiXG5cdF0sXG5cdFtcblx0XHRcImE3YTFcIixcblx0XHRcIuWdh+WdjuWcvuWdkOWdj+Wcu+Wjr+WkvuWmneWmkuWmqOWmnuWmo+WmmeWmluWmjeWmpOWmk+WmiuWmpeWtneWtnOWtmuWtm+WujOWui+Wuj+WwrOWxgOWxgeWwv+WwvuWykOWykeWylOWyjOW3q+W4jOW6j+W6h+W6iuW7t+W8hOW8n+W9pOW9ouW9t+W9ueW/mOW/jOW/l+W/jeW/seW/q+W/uOW/quaIkuaIkeaKhOaKl+aKluaKgOaJtuaKieaJreaKiuaJvOaJvuaJueaJs+aKkuaJr+aKmOaJruaKleaKk+aKkeaKhuaUueaUu+aUuOaXseabtOadn+adjuadj+adkOadkeadnOadluadnuadieadhuadoFwiXG5cdF0sXG5cdFtcblx0XHRcImE4NDBcIixcblx0XHRcIuadk+adl+atpeavj+axguaxnuaymeaygeayiOayieayheaym+axquaxuuaykOaxsOayjOaxqOayluaykuaxveayg+axsuaxvuaxtOayhuaxtuayjeaylOaymOaygueBtueBvOeBveeBuOeJoueJoeeJoOeLhOeLgueOlueUrOeUq+eUt+eUuOeaguebr+efo+engeengOemv+eptuezu+e9leiCluiCk+iCneiCmOiCm+iCmuiCsuiJr+iKklwiXG5cdF0sXG5cdFtcblx0XHRcImE4YTFcIixcblx0XHRcIuiKi+iKjeimi+inkuiogOiwt+ixhuixleiynei1pOi1sOi2s+i6q+i7iui+m+i+sOi/gui/hui/hei/hOW3oemCkemCoumCqumCpumCo+mFiemHhumHjOmYsumYrumYsemYqumYrOS4puS5luS5s+S6i+S6m+S6nuS6q+S6rOS9r+S+neS+jeS9s+S9v+S9rOS+m+S+i+S+huS+g+S9sOS9teS+iOS9qeS9u+S+luS9vuS+j+S+keS9uuWFlOWFkuWFleWFqeWFt+WFtuWFuOWGveWHveWIu+WIuOWIt+WIuuWIsOWIruWItuWJgeWKvuWKu+WNkuWNlOWNk+WNkeWNpuWNt+WNuOWNueWPluWPlOWPl+WRs+WRtVwiXG5cdF0sXG5cdFtcblx0XHRcImE5NDBcIixcblx0XHRcIuWSluWRuOWSleWSgOWRu+WRt+WShOWSkuWShuWRvOWSkOWRseWRtuWSjOWSmuWRouWRqOWSi+WRveWSjuWbuuWeg+Wdt+WdquWdqeWdoeWdpuWdpOWdvOWknOWlieWlh+WliOWlhOWllOWmvuWmu+WnlOWmueWmruWnkeWnhuWnkOWnjeWni+Wnk+WniuWmr+Wms+WnkuWnheWtn+WtpOWto+Wul+WumuWumOWunOWumeWum+WwmuWxiOWxhVwiXG5cdF0sXG5cdFtcblx0XHRcImE5YTFcIixcblx0XHRcIuWxhuWyt+WyoeWyuOWyqeWyq+WyseWys+W4mOW4muW4luW4leW4m+W4keW5uOW6muW6l+W6nOW6leW6luW7tuW8puW8p+W8qeW+gOW+geW9v+W9vOW/neW/oOW/veW/teW/v+aAj+aAlOaAr+aAteaAluaAquaAleaAoeaAp+aAqeaAq+aAm+aIluaIleaIv+aIvuaJgOaJv+aLieaLjOaLhOaKv+aLguaKueaLkuaLm+aKq+aLk+aLlOaLi+aLiOaKqOaKveaKvOaLkOaLmeaLh+aLjeaKteaLmuaKseaLmOaLluaLl+aLhuaKrOaLjuaUvuaWp+aWvOaXuuaYlOaYk+aYjOaYhuaYguaYjuaYgOaYj+aYleaYilwiXG5cdF0sXG5cdFtcblx0XHRcImFhNDBcIixcblx0XHRcIuaYh+acjeaci+adreaei+aeleadseaenOads+adt+aeh+aeneael+adr+adsOadv+aeieadvuaekOadteaemuaek+advOadquadsuaso+atpuatp+atv+awk+awm+azo+azqOazs+ayseazjOazpeays+ayveayvuayvOazouayq+azleazk+ayuOazhOayueazgeayruazl+azheazseayv+ayu+azoeazm+aziuayrOazr+aznOazluazoFwiXG5cdF0sXG5cdFtcblx0XHRcImFhYTFcIixcblx0XHRcIueCleeCjueCkueCiueCmeeIrOeIreeIuOeJiOeJp+eJqeeLgOeLjueLmeeLl+eLkOeOqeeOqOeOn+eOq+eOpeeUveeWneeWmeeWmueahOebguebsuebtOefpeefveekvuelgOelgeenieeniOepuuepueeruuezvue9lOe+jOe+i+iAheiCuuiCpeiCouiCseiCoeiCq+iCqeiCtOiCquiCr+iHpeiHvuiIjeiKs+iKneiKmeiKreiKveiKn+iKueiKseiKrOiKpeiKr+iKuOiKo+iKsOiKvuiKt+iZjuiZseWIneihqOi7i+i/jui/lOi/kemCtemCuOmCsemCtumHh+mHkemVt+mWgOmYnOmZgOmYv+mYu+mZhFwiXG5cdF0sXG5cdFtcblx0XHRcImFiNDBcIixcblx0XHRcIumZgumauembqOmdkumdnuS6n+S6reS6ruS/oeS+teS+r+S+v+S/oOS/keS/j+S/neS/g+S+tuS/mOS/n+S/iuS/l+S+ruS/kOS/hOS/guS/muS/juS/nuS+t+WFl+WGkuWGkeWGoOWJjuWJg+WJiuWJjeWJjOWJi+WJh+WLh+WLieWLg+WLgeWMjeWNl+WNu+WOmuWPm+WSrOWTgOWSqOWTjuWTieWSuOWSpuWSs+WTh+WTguWSveWSquWTgVwiXG5cdF0sXG5cdFtcblx0XHRcImFiYTFcIixcblx0XHRcIuWThOWTiOWSr+WSq+WSseWSu+WSqeWSp+WSv+Wbv+WeguWei+WeoOWeo+WeouWfjuWeruWek+WlleWlkeWlj+WljuWlkOWnnOWnmOWnv+Wno+WnqOWog+WnpeWnquWnmuWnpuWogeWnu+WtqeWuo+WupuWupOWuouWupeWwgeWxjuWxj+WxjeWxi+WzmeWzkuW3t+W4neW4peW4n+W5veW6oOW6puW7uuW8iOW8reW9peW+iOW+heW+iuW+i+W+h+W+jOW+ieaAkuaAneaAoOaApeaAjuaAqOaBjeaBsOaBqOaBouaBhuaBg+aBrOaBq+aBquaBpOaJgeaLnOaMluaMieaLvOaLreaMgeaLruaLveaMh+aLseaLt1wiXG5cdF0sXG5cdFtcblx0XHRcImFjNDBcIixcblx0XHRcIuaLr+aLrOaLvuaLtOaMkeaMguaUv+aVheaWq+aWveaXouaYpeaYreaYoOaYp+aYr+aYn+aYqOaYseaYpOabt+afv+afk+afseaflOafkOafrOaetuaer+afteafqeafr+afhOafkeaetOafmuafpeaeuOafj+afnuafs+aesOafmeafouafneafkuatquaug+auhuauteavkuavl+awn+aziea0i+a0sua0qua1gea0pea0jOa0sea0nua0l1wiXG5cdF0sXG5cdFtcblx0XHRcImFjYTFcIixcblx0XHRcIua0u+a0vea0vua0tua0m+aztea0uea0p+a0uOa0qea0rua0tea0jua0q+eCq+eCuueCs+eCrOeCr+eCreeCuOeCrueCpOeIsOeJsueJr+eJtOeLqeeLoOeLoeeOt+ePiueOu+eOsuePjeePgOeOs+eUmueUreeVj+eVjOeVjueVi+eWq+eWpOeWpeeWoueWo+eZuOeahueah+eaiOebiOebhuebg+ebheecgeebueebuOecieeci+ebvuebvOech+efnOeggueglOegjOegjeelhuelieeliOelh+emueemuuenkeenkueni+epv+eqgeerv+erveexvee0gue0hee0gOe0iee0h+e0hOe0hue8uOe+jue+v+iAhFwiXG5cdF0sXG5cdFtcblx0XHRcImFkNDBcIixcblx0XHRcIuiAkOiAjeiAkeiAtuiDluiDpeiDmuiDg+iDhOiDjOiDoeiDm+iDjuiDnuiDpOiDneiHtOiIouiLp+iMg+iMheiLo+iLm+iLpuiMhOiLpeiMguiMieiLkuiLl+iLseiMgeiLnOiLlOiLkeiLnuiLk+iLn+iLr+iMhuiZkOiZueiZu+iZuuihjeihq+imgeinlOioiOioguiog+iynuiyoOi1tOi1s+i2tOi7jei7jOi/sOi/pui/oui/qui/pVwiXG5cdF0sXG5cdFtcblx0XHRcImFkYTFcIixcblx0XHRcIui/rei/q+i/pOi/qOmDiumDjumDgemDg+mFi+mFiumHjemWgumZkOmZi+mZjOmZjemdoumdqemfi+mfremfs+mggemiqOmjm+mjn+mmlummmeS5mOS6s+WAjOWAjeWAo+S/r+WApuWApeS/uOWAqeWAluWAhuWAvOWAn+WAmuWAkuWAkeS/uuWAgOWAlOWAqOS/seWAoeWAi+WAmeWAmOS/s+S/ruWAreWAquS/vuWAq+WAieWFvOWGpOWGpeWGouWHjeWHjOWHhuWHi+WJluWJnOWJlOWJm+WJneWMquWNv+WOn+WOneWPn+WTqOWUkOWUgeWUt+WTvOWTpeWTsuWUhuWTuuWUlOWTqeWTreWToeWUieWTruWTqlwiXG5cdF0sXG5cdFtcblx0XHRcImFlNDBcIixcblx0XHRcIuWTpuWUp+WUh+WTveWUj+Wcg+WchOWfguWflOWfi+Wfg+WgieWkj+Wll+WlmOWlmuWokeWomOWonOWon+Wom+Wok+WnrOWooOWoo+WoqeWopeWojOWoieWtq+WxmOWusOWus+WutuWutOWuruWuteWuueWuuOWwhOWxkeWxleWxkOWzreWzveWzu+WzquWzqOWzsOWztuW0geWztOW3ruW4reW4q+W6q+W6reW6p+W8seW+kuW+keW+kOaBmVwiXG5cdF0sXG5cdFtcblx0XHRcImFlYTFcIixcblx0XHRcIuaBo+aBpeaBkOaBleaBreaBqeaBr+aChOaCn+aCmuaCjeaClOaCjOaCheaCluaJh+aLs+aMiOaLv+aNjuaMvuaMr+aNleaNguaNhuaNj+aNieaMuuaNkOaMveaMquaMq+aMqOaNjeaNjOaViOaVieaWmeaXgeaXheaZguaZieaZj+aZg+aZkuaZjOaZheaZgeabuOaclOacleacl+agoeaguOahiOahhuahk+agueahguahlOagqeais+agl+ahjOahkeagveaftOahkOahgOagvOahg+agquahheagk+agmOahgeauiuauieaut+awo+awp+awqOawpuawpOazsOa1qua2lea2iOa2h+a1pua1uOa1t+a1mea2k1wiXG5cdF0sXG5cdFtcblx0XHRcImFmNDBcIixcblx0XHRcIua1rOa2iea1rua1mua1tOa1qea2jOa2iua1uea2hea1pea2lOeDiueDmOeDpOeDmeeDiOeDj+eIueeJueeLvOeLueeLveeLuOeLt+eOhuePreeQieePruePoOePquePnueVlOeVneeVnOeVmueVmeeWvueXheeXh+eWsueWs+eWveeWvOeWueeXgueWuOeai+easOebiuebjeebjuecqeecn+ecoOecqOefqeegsOegp+eguOegneegtOegt1wiXG5cdF0sXG5cdFtcblx0XHRcImFmYTFcIixcblx0XHRcIuegpeegreegoOegn+egsuelleelkOeloOeln+elluelnuelneell+elmuenpOeno+enp+enn+enpuenqeenmOeqhOeqiOermeeshueskeeyiee0oee0l+e0i+e0iue0oOe0oue0lOe0kOe0lee0mue0nOe0jee0mee0m+e8uue9n+e+lOe/hee/geiAhuiAmOiAleiAmeiAl+iAveiAv+iDseiEguiDsOiEheiDreiDtOiEhuiDuOiDs+iEiOiDveiEiuiDvOiDr+iHreiHrOiIgOiIkOiIquiIq+iIqOiIrOiKu+iMq+iNkuiNlOiNiuiMuOiNkOiNieiMteiMtOiNj+iMsuiMueiMtuiMl+iNgOiMseiMqOiNg1wiXG5cdF0sXG5cdFtcblx0XHRcImIwNDBcIixcblx0XHRcIuiZlOiaiuiaquiak+iapOiaqeiajOiao+ianOihsOiht+iigeiiguihveihueiomOiokOiojuiojOioleioiuiol+iok+ioluioj+iokeixiOixuuixueiyoeiyoui1t+i6rOi7kui7lOi7j+i+semAgemAhui/t+mAgOi/uui/tOmAg+i/vemAhei/uOmClemDoemDnemDoumFkumFjemFjOmHmOmHnemHl+mHnOmHmemWg+mZoumZo+mZoVwiXG5cdF0sXG5cdFtcblx0XHRcImIwYTFcIixcblx0XHRcIumZm+mZnemZpOmZmOmZnumau+mjoummrOmqqOmrmOmspemssumsvOS5vuWBuuWBveWBnOWBh+WBg+WBjOWBmuWBieWBpeWBtuWBjuWBleWBteWBtOWBt+WBj+WAj+WBr+WBreWFnOWGleWHsOWJquWJr+WLkuWLmeWLmOWLleWMkOWMj+WMmeWMv+WNgOWMvuWPg+abvOWVhuWVquWVpuWVhOWVnuWVoeWVg+WViuWUseWVluWVj+WVleWUr+WVpOWUuOWUruWVnOWUrOWVo+WUs+WVgeWVl+WciOWci+WcieWfn+WgheWgiuWghuWfoOWfpOWfuuWgguWgteWft+WfueWkoOWlouWotuWpgeWpieWppuWpquWpgFwiXG5cdF0sXG5cdFtcblx0XHRcImIxNDBcIixcblx0XHRcIuWovOWpouWpmuWphuWpiuWtsOWvh+WvheWvhOWvguWuv+WvhuWwieWwiOWwh+WxoOWxnOWxneW0h+W0huW0juW0m+W0luW0ouW0keW0qeW0lOW0meW0pOW0p+W0l+W3ouW4uOW4tuW4s+W4t+W6t+W6uOW6tuW6teW6vuW8teW8t+W9l+W9rOW9qeW9q+W+l+W+meW+nuW+mOW+oeW+oOW+nOaBv+aCo+aCieaCoOaCqOaDi+aCtOaDpuaCvVwiXG5cdF0sXG5cdFtcblx0XHRcImIxYTFcIixcblx0XHRcIuaDheaCu+aCteaDnOaCvOaDmOaDleaDhuaDn+aCuOaDmuaDh+aImuaIm+aJiOaOoOaOp+aNsuaOluaOouaOpeaNt+aNp+aOmOaOquaNseaOqeaOieaOg+aOm+aNq+aOqOaOhOaOiOaOmeaOoeaOrOaOkuaOj+aOgOaNu+aNqeaNqOaNuuaVneaVluaVkeaVmeaVl+WVn+aVj+aVmOaVleaVlOaWnOaWm+aWrOaXj+aXi+aXjOaXjuaZneaZmuaZpOaZqOaZpuaZnuabueWLl+acm+aigeair+aiouaik+aiteahv+ahtuaiseaip+ail+aisOaig+ajhOaireaihuaiheailOaineaiqOain+aioeaiguassuauulwiXG5cdF0sXG5cdFtcblx0XHRcImIyNDBcIixcblx0XHRcIuavq+avrOawq+a2jua2vOa3s+a3mea2sua3oea3jOa3pOa3u+a3uua4hea3h+a3i+a2r+a3kea2rua3nua3uea2uOa3t+a3tea3hea3kua4mua2tea3mua3q+a3mOa3qua3sea3rua3qOa3hua3hOa2qua3rOa2v+a3pueDueeEieeEiueDveeDr+eIveeJveeKgeeMnOeMm+eMlueMk+eMmeeOh+eQheeQiueQg+eQhuePvueQjeeToOeTtlwiXG5cdF0sXG5cdFtcblx0XHRcImIyYTFcIixcblx0XHRcIueTt+eUnOeUoueVpeeVpueVoueVsOeWj+eXlOeXleeWteeXiueXjeeajueblOebkuebm+ect+ecvuecvOectuecuOecuuehq+ehg+ehjuelpeelqOelreenu+eqkueqleesoOesqOesm+esrOespuesmeesnuesrueykueyl+eylee1hue1g+e1see0rue0uee0vOe1gOe0sOe0s+e1hOe0r+e1gue0sue0see8vee+nue+mue/jOe/jue/kuiAnOiBiuiBhuiEr+iEluiEo+iEq+iEqeiEsOiEpOiIguiIteiIt+iItuiIueiOjuiOnuiOmOiNuOiOouiOluiOveiOq+iOkuiOiuiOk+iOieiOoOiNt+iNu+iNvFwiXG5cdF0sXG5cdFtcblx0XHRcImIzNDBcIixcblx0XHRcIuiOhuiOp+iZleW9quibh+ibgOiatuibhOiateibhuibi+iaseiar+ibieihk+iinuiiiOiiq+iikuiiluiijeiii+imk+imj+ioquioneioo+iopeioseioreion+iom+ioouixieixmuiyqeiyrOiyq+iyqOiyquiyp+i1p+i1pui2vui2uui7m+i7n+mAmemAjemAmumAl+mAo+mAn+mAnemAkOmAlemAnumAoOmAj+mAoumAlumAm+mAlFwiXG5cdF0sXG5cdFtcblx0XHRcImIzYTFcIixcblx0XHRcIumDqOmDremDvemFl+mHjumHtemHpumHo+mHp+mHremHqemWiemZqumZtemZs+mZuOmZsOmZtOmZtumZt+mZrOmbgOmbqumbqeeroOern+mggumgg+mtmumzpem5tem5v+m6pem6u+WCouWCjeWCheWCmeWCkeWCgOWCluWCmOWCmuacgOWHseWJsuWJtOWJteWJqeWLnuWLneWLm+WNmuWOpeWVu+WWgOWWp+WVvOWWiuWWneWWmOWWguWWnOWWquWWlOWWh+WWi+WWg+WWs+WWruWWn+WUvuWWsuWWmuWWu+WWrOWWseWVvuWWieWWq+WWmeWcjeWgr+WgquWgtOWgpOWgsOWgseWgoeWgneWgoOWjueWjuuWloFwiXG5cdF0sXG5cdFtcblx0XHRcImI0NDBcIixcblx0XHRcIuWpt+WqmuWpv+WqkuWqm+Wqp+Wts+WtseWvkuWvjOWvk+WvkOWwiuWwi+WwseW1jOW1kOW0tOW1h+W3veW5heW4veW5gOW5g+W5vuW7iuW7geW7guW7hOW8vOW9reW+qeW+quW+qOaDkeaDoeaCsuaCtuaDoOaEnOaEo+aDuuaEleaDsOaDu+aDtOaFqOaDseaEjuaDtuaEieaEgOaEkuaIn+aJieaOo+aOjOaPj+aPgOaPqeaPieaPhuaPjVwiXG5cdF0sXG5cdFtcblx0XHRcImI0YTFcIixcblx0XHRcIuaPkuaPo+aPkOaPoeaPluaPreaPruaNtuaPtOaPquaPm+aRkuaPmuaPueaVnuaVpuaVouaVo+aWkeaWkOaWr+aZruaZsOaZtOaZtuaZr+aakeaZuuaZvuaZt+abvuabv+acn+acneajuuajleajoOajmOajl+akheajn+ajteajruajp+ajueajkuajsuajo+aji+ajjeakjeakkuakjuajieajmualruaju+asvuasuuasveaumOauluauvOavr+awruawr+awrOa4r+a4uOa5lOa4oea4sua5p+a5iua4oOa4pea4o+a4m+a5m+a5mOa4pOa5lua5rua4rea4pua5r+a4tOa5jea4uua4rOa5g+a4nea4vua7i1wiXG5cdF0sXG5cdFtcblx0XHRcImI1NDBcIixcblx0XHRcIua6iea4mea5jua5o+a5hOa5sua5qea5n+eEmeeEmueEpueEsOeEoeeEtueFrueEnOeJjOeKhOeKgOeMtueMpeeMtOeMqeeQuueQqueQs+eQoueQpeeQteeQtueQtOeQr+eQm+eQpueQqOeUpeeUpueVq+eVqueXoueXm+eXo+eXmeeXmOeXnueXoOeZu+eZvOealueak+eatOebnOedj+efreehneehrOehr+eojeeoiOeoi+eoheeogOeqmFwiXG5cdF0sXG5cdFtcblx0XHRcImI1YTFcIixcblx0XHRcIueql+eqluerpeero+etieetluethuetkOetkuetlOetjeeti+etj+etkeeyn+eypee1nue1kOe1qOe1lee0q+e1rue1sue1oee1pue1oue1sOe1s+WWhOe/lOe/leiAi+iBkuiCheiFleiFlOiFi+iFkeiFjuiEueiFhuiEvuiFjOiFk+iFtOiIkuiInOiPqeiQg+iPuOiQjeiPoOiPheiQi+iPgeiPr+iPseiPtOiRl+iQiuiPsOiQjOiPjOiPveiPsuiPiuiQuOiQjuiQhOiPnOiQh+iPlOiPn+iZm+ibn+ibmeibreiblOibm+ibpOibkOibnuihl+ijgeijguiiseimg+imluiou+ipoOipleipnuiovOipgVwiXG5cdF0sXG5cdFtcblx0XHRcImI2NDBcIixcblx0XHRcIuiplOipm+ipkOiphuiotOiouuiotuipluixoeiyguiyr+iyvOiys+iyveizgeiyu+izgOiytOiyt+iytuiyv+iyuOi2iui2hei2gei3jui3nei3i+i3mui3kei3jOi3m+i3hui7u+i7uOi7vOi+nOmArumAtemAsemAuOmAsumAtumEgumDtemEiemDvumFo+mFpemHj+mIlOmIlemIo+mIiemInumIjemIkOmIh+mIkemWlOmWj+mWi+mWkVwiXG5cdF0sXG5cdFtcblx0XHRcImI2YTFcIixcblx0XHRcIumWk+mWkumWjumaiumajumai+mZvemahemahumajemZsumahOmbgembhembhOmbhumbh+mbr+mbsumfjOmghemghumgiOmjp+mjqumjr+mjqemjsumjremmrummrem7g+m7jem7keS6guWCreWCteWCsuWCs+WDheWCvuWCrOWCt+WCu+WCr+WDh+WJv+WJt+WJveWLn+WLpuWLpOWLouWLo+WMr+WXn+WXqOWXk+WXpuWXjuWXnOWXh+WXkeWXo+WXpOWXr+WXmuWXoeWXheWXhuWXpeWXieWckuWck+WhnuWhkeWhmOWhl+WhmuWhlOWhq+WhjOWhreWhiuWhouWhkuWhi+Wlp+WrgeWrieWrjOWqvuWqveWqvFwiXG5cdF0sXG5cdFtcblx0XHRcImI3NDBcIixcblx0XHRcIuWqs+WrguWqsuW1qeW1r+W5jOW5ueW7ieW7iOW8kuW9meW+rOW+ruaEmuaEj+aFiOaEn+aDs+aEm+aDueaEgeaEiOaFjuaFjOaFhOaFjeaEvuaEtOaEp+aEjeaEhuaEt+aIoeaIouaQk+aQvuaQnuaQquaQreaQveaQrOaQj+aQnOaQlOaQjeaQtuaQluaQl+aQhuaVrOaWn+aWsOaal+aaieaah+aaiOaaluaahOaamOaajeacg+amlOalrVwiXG5cdF0sXG5cdFtcblx0XHRcImI3YTFcIixcblx0XHRcIualmualt+aloOallOalteaksOamgualiualqOalq+alnualk+alueamhualnealo+alm+ath+atsuavgOauv+avk+avvea6oua6r+a7k+a6tua7gua6kOa6nea7h+a7hea6pea6mOa6vOa6uua6q+a7kea6lua6nOa7hOa7lOa6qua6p+a6tOeFjueFmeeFqeeFpOeFieeFp+eFnOeFrOeFpueFjOeFpeeFnueFhueFqOeFlueIuueJkueMt+eNheeMv+eMvueRr+eRmueRleeRn+eRnueRgeeQv+eRmeeRm+eRnOeVtueVuOeYgOeXsOeYgeeXsueXseeXuueXv+eXtOeXs+ebnuebn+edm+edq+edpuednuedo1wiXG5cdF0sXG5cdFtcblx0XHRcImI4NDBcIixcblx0XHRcIuedueedquedrOednOedpeedqOedouefrueijueisOeil+eimOeijOeiieehvOeikeeik+ehv+eluuelv+emgeiQrOemveeonOeomueooOeolOeon+eonueqn+eqoOett+evgOetoOetruetp+eyseeys+eytee2k+e1uee2kee2gee2j+e1m+e9rue9qee9que9sue+qee+qOe+pOiBluiBmOiChuiChOiFseiFsOiFuOiFpeiFruiFs+iFq1wiXG5cdF0sXG5cdFtcblx0XHRcImI4YTFcIixcblx0XHRcIuiFueiFuuiFpuiIheiJh+iSguiRt+iQveiQseiRteiRpuiRq+iRieiRrOiRm+iQvOiQteiRoeiRo+iRqeiRreiRhuiZnuiZnOiZn+ibueick+iciOich+icgOibvuibu+icguicg+ichuiciuihmeijn+ijlOijmeijnOijmOijneijoeijiuijleijkuimnOino+ipq+ipsuips+ippuipqeipsOiqh+ipvOipo+iqoOipseiqheipreipouipruiprOipueipu+iovuipqOixouiyiuiyieiziuizh+iziOizhOiysuizg+izguizhei3oei3n+i3qOi3r+i3s+i3uui3qui3pOi3pui6sui8g+i8iei7vui8ilwiXG5cdF0sXG5cdFtcblx0XHRcImI5NDBcIixcblx0XHRcIui+n+i+sumBi+mBiumBk+mBgumBlOmAvOmBlemBkOmBh+mBj+mBjumBjemBkemAvumBgemEkumEl+mFrOmFqumFqemHiemIt+mJl+mIuOmIvemJgOmIvumJm+mJi+mJpOmJkemItOmJiemJjemJhemIuemIv+mJmumWmOmamOmalOmalembjembi+mbiembiumbt+mbu+mbuembtumdlumdtOmdtumgkOmgkemgk+mgiumgkumgjOmjvOmjtFwiXG5cdF0sXG5cdFtcblx0XHRcImI5YTFcIixcblx0XHRcIumjvemjvumms+mmsemmtOmroemzqem6gum8jum8k+m8oOWDp+WDruWDpeWDluWDreWDmuWDleWDj+WDkeWDseWDjuWDqeWFouWHs+WKg+WKguWMseWOreWXvuWYgOWYm+WYl+WXveWYlOWYhuWYieWYjeWYjuWXt+WYluWYn+WYiOWYkOWXtuWcmOWcluWhteWhvuWig+Wik+WiiuWhueWiheWhveWjveWkpeWkouWkpOWlquWlqeWroeWrpuWrqeWrl+WrluWrmOWro+WtteWvnuWvp+WvoeWvpeWvpuWvqOWvouWvpOWvn+WwjeWxouW2hOW2h+W5m+W5o+W5leW5l+W5lOW7k+W7luW8iuW9huW9sOW+ueaFh1wiXG5cdF0sXG5cdFtcblx0XHRcImJhNDBcIixcblx0XHRcIuaEv+aFi+aFt+aFouaFo+aFn+aFmuaFmOaFteaIquaSh+aRmOaRlOaSpOaRuOaRn+aRuuaRkeaRp+aQtOaRreaRu+aVsuaWoeaXl+aXluaaouaaqOaaneamnOamqOamleangeamruank+ani+amm+amt+amu+amq+amtOankOanjeamreanjOampuang+amo+atieatjOaws+a8s+a8lOa7vua8k+a7tOa8qea8vua8oOa8rOa8j+a8gua8olwiXG5cdF0sXG5cdFtcblx0XHRcImJhYTFcIixcblx0XHRcIua7v+a7r+a8hua8sea8uOa8sua8o+a8lea8q+a8r+a+iOa8qua7rOa8gea7sua7jOa7t+eGlOeGmeeFveeGiueGhOeGkueIvueKkueKlueNhOeNkOeRpOeRo+eRqueRsOeRreeUhOeWkeeYp+eYjeeYi+eYieeYk+eboeebo+eehOedveedv+edoeejgeein+eip+eis+eiqeeio+emjuemj+emjeeorueoseeqqueqqeerreerr+euoeeuleeui+etteeul+euneeulOeuj+euuOeuh+euhOeyueeyveeyvue2u+e2sOe2nOe2vee2vue2oOe3iue2tOe2sue2see2uue2oue2v+e2tee2uOe2ree3kue3h+e2rFwiXG5cdF0sXG5cdFtcblx0XHRcImJiNDBcIixcblx0XHRcIue9sOe/oOe/oee/n+iBnuiBmuiCh+iFkOiGgOiGj+iGiOiGiuiFv+iGguiHp+iHuuiIh+iIlOiInuiJi+iTieiSv+iThuiThOiSmeiSnuiSsuiSnOiTi+iSuOiTgOiTk+iSkOiSvOiTkeiTiuicv+icnOicu+icouicpeictOicmOidleict+icqeijs+ikguijtOijueijuOijveijqOikmuijr+iqpuiqjOiqnuiqo+iqjeiqoeiqk+iqpFwiXG5cdF0sXG5cdFtcblx0XHRcImJiYTFcIixcblx0XHRcIuiqquiqpeiqqOiqmOiqkeiqmuiqp+ixquiyjeiyjOizk+izkeizkui1q+i2mei2lei3vOi8lOi8kui8lei8k+i+o+mBoOmBmOmBnOmBo+mBmemBnumBoumBnemBm+mEmemEmOmEnumFtemFuOmFt+mFtOmJuOmKgOmKhemKmOmKlumJu+mKk+mKnOmKqOmJvOmKkemWoemWqOmWqemWo+mWpemWpOmamemanOmam+mbjOmbkumcgOmdvOmehemftumgl+mgmOmir+misemkg+mkhemkjOmkiemngemqr+mqsOmrpumtgemtgumztOmztumzs+m6vOm8u+m9iuWEhOWEgOWDu+WDteWDueWEguWEiOWEieWEheWHnFwiXG5cdF0sXG5cdFtcblx0XHRcImJjNDBcIixcblx0XHRcIuWKh+WKiOWKieWKjeWKiuWLsOWOsuWYruWYu+WYueWYsuWYv+WYtOWYqeWZk+WZjuWZl+WZtOWYtuWYr+WYsOWigOWin+WinuWis+WinOWiruWiqeWipuWlreWsieWru+Wsi+WrteWsjOWsiOWvruWvrOWvqeWvq+WxpOWxpeW2neW2lOW5ouW5n+W5oeW7ouW7muW7n+W7neW7o+W7oOW9iOW9seW+t+W+teaFtuaFp+aFruaFneaFleaGglwiXG5cdF0sXG5cdFtcblx0XHRcImJjYTFcIixcblx0XHRcIuaFvOaFsOaFq+aFvuaGp+aGkOaGq+aGjuaGrOaGmuaGpOaGlOaGruaIruaRqeaRr+aRueaSnuaSsuaSiOaSkOaSsOaSpeaSk+aSleaSqeaSkuaSruaSreaSq+aSmuaSrOaSmeaSouaSs+aVteaVt+aVuOaaruaaq+aatOaaseaoo+aon+anqOaogeaonuaomeanveaooeaok+aoiuans+aoguaoheanreaokeatkOatjuaupOavheavhua8v+a9vOa+hOa9kea9pua9lOa+hua9rea9m+a9uOa9rua+jua9uua9sOa9pOa+l+a9mOa7lea9r+a9oOa9n+eGn+eGrOeGseeGqOeJlueKm+eNjueNl+eRqeeSi+eSg1wiXG5cdF0sXG5cdFtcblx0XHRcImJkNDBcIixcblx0XHRcIueRvueSgOeVv+eYoOeYqeeYn+eYpOeYpueYoeeYoueamueauuebpOeejueeh+eejOeekeeei+eji+ejheeiuuejiueivuejleeivOejkOeov+eovOepgOeoveeot+eou+eqr+eqrueureeuseevhOeutOevhuevh+evgeeuoOevjOeziue3oOe3tOe3r+e3u+e3mOe3rOe3nee3qOe3o+e3mue3nue3qee2nue3mee3sue3uee9tee9t+e+r1wiXG5cdF0sXG5cdFtcblx0XHRcImJkYTFcIixcblx0XHRcIue/qeiApuiGm+iGnOiGneiGoOiGmuiGmOiUl+iUveiUmuiTruiUrOiUreiUk+iUkeiUo+iUoeiUlOiTrOiUpeiTv+iUhuieguidtOidtuidoOidpuiduOidqOidmeidl+idjOidk+ihm+ihneikkOikh+ikkuikk+ikleikiuiqvOirkuirh+irhOiqleiri+iruOiqsuirieirguiqv+iqsOirluirjeiqtuiqueirm+ixjOixjuixrOizoOiznuizpuizpOizrOizreizouizo+iznOizquizoei1rei2n+i2o+i4q+i4kOi4nei4oui4j+i4qei4n+i4oei4nui6uui8nei8m+i8n+i8qei8pui8qui8nOi8nlwiXG5cdF0sXG5cdFtcblx0XHRcImJlNDBcIixcblx0XHRcIui8pemBqemBrumBqOmBremBt+mEsOmEremEp+mEsemGh+mGiemGi+mGg+mLhemKu+mKt+mLqumKrOmLpOmLgemKs+mKvOmLkumLh+mLsOmKsumWremWsemchOmchumch+mciemdoOmejemei+mej+mgoemgq+mgnOmis+mkiumkk+mkkumkmOmnnemnkOmnn+mnm+mnkemnlemnkumnmemqt+mrrumrr+msp+mthemthOmtt+mtr+m0hum0iVwiXG5cdF0sXG5cdFtcblx0XHRcImJlYTFcIixcblx0XHRcIum0g+m6qem6vum7juWiqOm9kuWEkuWEmOWElOWEkOWEleWGgOWGquWHneWKkeWKk+WLs+WZmeWZq+WZueWZqeWZpOWZuOWZquWZqOWZpeWZseWZr+WZrOWZouWZtuWjgeWivuWjh+WjheWlruWsneWstOWtuOWvsOWwjuW9iuaGsuaGkeaGqeaGiuaHjeaGtuaGvuaHiuaHiOaIsOaTheaTgeaTi+aSu+aSvOaTmuaThOaTh+aTguaTjeaSv+aTkuaTlOaSvuaVtOabhuabieaaueabhOabh+aauOaoveaouOaouuapmeapq+apmOaoueaphOapouapoeapi+aph+aoteapn+apiOatmeatt+awhea/gua+sea+oVwiXG5cdF0sXG5cdFtcblx0XHRcImJmNDBcIixcblx0XHRcIua/g+a+pOa/gea+p+a+s+a/gOa+uea+tua+pua+oOa+tOeGvueHieeHkOeHkueHiOeHleeGueeHjueHmeeHnOeHg+eHhOeNqOeSnOeSo+eSmOeSn+eSnueToueUjOeUjeeYtOeYuOeYuuebp+ebpeeeoOeenueen+eepeejqOejmuejrOejp+empuepjeepjuephuepjOepi+equuevmeewkeevieevpOevm+evoeevqeevpuezleezlue4ilwiXG5cdF0sXG5cdFtcblx0XHRcImJmYTFcIixcblx0XHRcIue4kee4iOe4m+e4o+e4nue4nee4iee4kOe9uee+sue/sOe/see/ruiAqOiGs+iGqeiGqOiHu+iIiOiJmOiJmeiViuiVmeiViOiVqOiVqeiVg+iVieiVreiVquiVnuieg+ien+ienuieouiejeihoeikquiksuikpeikq+ikoeimquimpuirpuiruuirq+irseisgOirnOirp+irruirvuisgeisguirt+irreirs+irtuirvOixq+ixreiyk+iztOi5hOi4sei4tOi5gui4uei4tei8u+i8r+i8uOi8s+i+qOi+pumBtemBtOmBuOmBsumBvOmBuumEtOmGkumMoOmMtumLuOmMs+mMr+mMoumLvOmMq+mMhOmMmlwiXG5cdF0sXG5cdFtcblx0XHRcImMwNDBcIixcblx0XHRcIumMkOmMpumMoemMlemMrumMmemWu+map+maqOmaqumblemcjumckemclumcjemck+mcj+mdm+mdnOmdpumemOmgsOmguOmgu+mgt+mgremguemgpOmkkOmkqOmknumkm+mkoemkmumnremnoumnsemquOmqvOmru+mrremsqOmukem0lem0o+m0pum0qOm0kum0m+m7mOm7lOm+jem+nOWEquWEn+WEoeWEsuWLteWajuWagOWakOWaheWah1wiXG5cdF0sXG5cdFtcblx0XHRcImMwYTFcIixcblx0XHRcIuWaj+WjleWjk+WjkeWjjuWssOWsquWspOWtuuWwt+WxqOW2vOW2uuW2veW2uOW5q+W9jOW+veaHieaHguaHh+aHpuaHi+aIsuaItOaTjuaTiuaTmOaToOaTsOaTpuaTrOaTseaTouaTreaWguaWg+abmeabluaqgOaqlOaqhOaqouaqnOarm+aqo+apvuaql+aqkOaqoOatnOauruavmuawiOa/mOa/sea/n+a/oOa/m+a/pOa/q+a/r+a+gOa/rOa/oea/qea/lea/rua/sOeHp+eHn+eHrueHpueHpeeHreeHrOeHtOeHoOeIteeJhueNsOeNsueSqeeSsOeSpueSqOeZhueZgueZjOebquees+eequeesOeerFwiXG5cdF0sXG5cdFtcblx0XHRcImMxNDBcIixcblx0XHRcIueep+eereefr+ejt+ejuuejtOejr+ekgeemp+emquepl+eqv+ewh+ewjeevvuevt+ewjOevoOezoOeznOeznuezouezn+ezmeeznee4rue4vue5hue4t+e4sue5g+e4q+e4vee4see5hee5gee4tOe4uee5iOe4tee4v+e4r+e9hOe/s+e/vOiBseiBsuiBsOiBr+iBs+iHhuiHg+iGuuiHguiHgOiGv+iGveiHieiGvuiHqOiIieiJseiWqlwiXG5cdF0sXG5cdFtcblx0XHRcImMxYTFcIixcblx0XHRcIuiWhOiVvuiWnOiWkeiWlOiWr+iWm+iWh+iWqOiWiuiZp+ifgOifkeies+ifkuifhuieq+ieu+ieuuifiOifi+iku+iktuilhOikuOikveimrOisjuisl+ismeism+isiuisoOisneishOiskOixgeiwv+ixs+izuuizveizvOizuOizu+i2qOi5iei5i+i5iOi5iui9hOi8vui9gui9hei8v+mBv+mBvemChOmCgemCgumCgOmEuemGo+mGnumGnOmNjemOgumMqOmNtemNiumNpemNi+mMmOmNvumNrOmNm+mNsOmNmumNlOmXiumXi+mXjOmXiOmXhumasemauOmblumcnOmcnumeoOmfk+mhhumitumktemogVwiXG5cdF0sXG5cdFtcblx0XHRcImMyNDBcIixcblx0XHRcIumnv+murumuq+muqumurem0u+m0v+m6i+m7j+m7num7nOm7nem7m+m8vum9i+WPouWaleWaruWjmeWjmOWsuOW9neaHo+aIs+aTtOaTsuaTvuaUhuaTuuaTu+aTt+aWt+abnOacpuaqs+aqrOarg+aqu+aquOarguaqruaqr+atn+atuOaur+eAieeAi+a/vueAhua/uueAkeeAj+eHu+eHvOeHvueHuOeNt+eNteeSp+eSv+eUleeZlueZmFwiXG5cdF0sXG5cdFtcblx0XHRcImMyYTFcIixcblx0XHRcIueZkueeveeev+eeu+eevOekjuemruepoeepouepoOerhOerheewq+ewp+ewquewnuewo+ewoeezp+e5lOe5lee5nue5mue5oee5kue5mee9iOe/uee/u+iBt+iBtuiHjeiHj+iIiuiXj+iWqeiXjeiXkOiXieiWsOiWuuiWueiWpuifr+ifrOifsuifoOimhuimsuintOisqOisueisrOisq+ixkOi0hei5mei5o+i5pui5pOi5n+i5lei7gOi9iei9jemCh+mCg+mCiOmGq+mGrOmHkOmOlOmOiumOlumOoumOs+mOrumOrOmOsOmOmOmOmumOl+mXlOmXlumXkOmXlemboumbnOmbmembm+mbnumcpOmeo+meplwiXG5cdF0sXG5cdFtcblx0XHRcImMzNDBcIixcblx0XHRcIumeremfuemhjemhj+mhjOmhjumhk+miuumkvumkv+mkvemkrummpemojumrgemsg+mshumtj+mtjumtjemviumviemvvemviOmvgOm1kem1nem1oOm7oOm8lem8rOWEs+WapeWjnuWjn+WjouWvtem+kOW7rOaHsuaHt+aHtuaHteaUgOaUj+aboOabnearpearnearmuark+eAm+eAn+eAqOeAmueAneeAleeAmOeIhueIjeeJmOeKoueNuFwiXG5cdF0sXG5cdFtcblx0XHRcImMzYTFcIixcblx0XHRcIueNuueSveeTiueTo+eWh+eWhueZn+eZoeefh+ekmeemseepq+epqeewvuewv+ewuOewveewt+exgOe5q+e5ree5uee5qee5que+hee5s+e+tue+uee+uOiHmOiXqeiXneiXquiXleiXpOiXpeiXt+ifu+igheigjeifueifvuiloOiln+illuilnuitgeitnOitmOitieitmuitjuitj+ithuitmei0iOi0iui5vOi5sui6h+i5tui5rOi5uui5tOi9lOi9jui+remCiumCi+mGsemGrumPoemPkemPn+mPg+mPiOmPnOmPnemPlumPoumPjemPmOmPpOmPl+mPqOmXnOmatOmbo+mcqumcp+mdoemfnOmfu+mhnlwiXG5cdF0sXG5cdFtcblx0XHRcImM0NDBcIixcblx0XHRcIumhmOmhm+mivOmlhemliemolumomemsjemvqOmvp+mvlumvm+m2iem1oem1sum1qum1rOm6kum6l+m6k+m6tOWLuOWaqOWat+WatuWatOWavOWjpOWtgOWtg+WtveWvtuW3ieaHuOaHuuaUmOaUlOaUmeabpuacp+arrOeAvueAsOeAsueIkOeNu+eTj+eZoueZpeekpuekquekrOekq+erh+ertuexjOexg+exjeezr+ezsOi+rue5vee5vFwiXG5cdF0sXG5cdFtcblx0XHRcImM0YTFcIixcblx0XHRcIue6gue9jOiAgOiHmuiJpuiXu+iXueiYkeiXuuiYhuiYi+iYh+iYiuiglOigleilpOimuuinuOitsOitrOitpuitr+itn+itq+i0j+i0jei6iei6gei6hei6gumGtOmHi+mQmOmQg+mPvemXoemcsOmjhOmlkumlkemmqOmoq+mosOmot+motemwk+mwjem5uem6tem7qOm8r+m9n+m9o+m9oeWEt+WEuOWbgeWbgOWbguWklOWxrOW3jeaHvOaHvuaUneaUnOaWleabqearu+ashOaruuausueBjOeIm+eKp+eTlueTlOeZqeefk+exkOe6j+e6jOe+vOiYl+iYreiYmuigo+igouigoeign+ilquilrOimveittFwiXG5cdF0sXG5cdFtcblx0XHRcImM1NDBcIixcblx0XHRcIuitt+itvei0k+i6iui6jei6i+i9n+i+r+mGuumQrumQs+mQtemQuumQuOmQsumQq+mXoumcuOmcuemcsumfv+mhp+mhpemll+mphempg+mpgOmovumrj+mtlOmtkemwremwpem2r+m2tOm3gum2uOm6nem7r+m8mem9nOm9pum9p+WEvOWEu+WbiOWbiuWbieWtv+W3lOW3kuW9juaHv+aUpOasiuatoeeBkeeBmOeOgOeTpOeWiueZrueZrFwiXG5cdF0sXG5cdFtcblx0XHRcImM1YTFcIixcblx0XHRcIuems+exoOexn+iBvuiBveiHn+ilsuilr+invOiugOi0lui0l+i6kei6k+i9oemFiOmRhOmRkemRkumcvemcvumfg+mfgemhq+mllemplempjemrkumsmumxiemwsemwvumwu+m3k+m3l+m8tOm9rOm9qum+lOWbjOW3luaIgOaUo+aUq+aUquabrOaskOeTmueriuexpOexo+expee6k+e6lue6lOiHouiYuOiYv+igseiuiumCkOmCj+mRo+mRoOmRpOmdqOmhr+mlnOmpmumpm+mpl+mrk+mrlOmrkemxlOmxl+mxlum3pem6n+m7tOWbkeWjqeaUrOeBnueZseeZsuefl+e9kOe+iOigtuigueihouiuk+iuklwiXG5cdF0sXG5cdFtcblx0XHRcImM2NDBcIixcblx0XHRcIuiuluiJt+i0m+mHgOmRqumdgumdiOmdhOmfhumhsOmpn+msoumtmOmxn+m3uem3uum5vOm5vem8h+m9t+m9suW7s+aslueBo+exrOexruigu+ingOi6oemHgemRsumRsOmhsemlnumrlumso+m7jOeBpOefmuiumumRt+mfiempoumppee6nOiunOi6qumHhemRvemRvumRvOmxt+mxuOm7t+ixlOmRv+m4mueIqOmpqumssem4m+m4nuexslwiXG5cdF0sXG5cdFtcblx0XHRcImM5NDBcIixcblx0XHRcIuS5guS5nOWHteWMmuWOguS4h+S4jOS5h+S6jeWbl++ojOWxruW9s+S4j+WGh+S4juS4ruS6k+S7guS7ieS7iOWGmOWLvOWNrOWOueWcoOWkg+WkrOWwkOW3v+aXoeaus+avjOawlOeIv+S4seS4vOS7qOS7nOS7qeS7oeS7neS7muWIjOWMnOWNjOWcouWco+Wkl+Wkr+WugeWuhOWwkuWwu+WxtOWxs+W4hOW6gOW6guW/ieaIieaJkOawlVwiXG5cdF0sXG5cdFtcblx0XHRcImM5YTFcIixcblx0XHRcIuawtuaxg+awv+awu+eKrueKsOeOiuemuOiCiumYnuS8juS8mOS8rOS7teS8lOS7seS8gOS7t+S8iOS8neS8guS8heS8ouS8k+S8hOS7tOS8kuWGseWIk+WIieWIkOWKpuWMouWMn+WNjeWOiuWQh+WboeWbn+WcruWcquWctOWkvOWmgOWlvOWmheWlu+WlvuWlt+Wlv+WtluWwleWwpeWxvOWxuuWxu+WxvuW3n+W5teW6hOW8guW8muW9tOW/leW/lOW/j+aJnOaJnuaJpOaJoeaJpuaJouaJmeaJoOaJmuaJpeaXr+aXruacvuacueacuOacu+acuuacv+acvOacs+awmOaxhuaxkuaxnOaxj+axiuaxlOaxi1wiXG5cdF0sXG5cdFtcblx0XHRcImNhNDBcIixcblx0XHRcIuaxjOeBseeJnueKtOeKteeOjueUqueZv+eptee9keiJuOiJvOiKgOiJveiJv+iZjeilvumCmemCl+mCmOmCm+mClOmYoumYpOmYoOmYo+S9luS8u+S9ouS9ieS9k+S9pOS8vuS9p+S9kuS9n+S9geS9mOS8reS8s+S8v+S9oeWGj+WGueWInOWInuWIoeWKreWKruWMieWNo+WNsuWOjuWOj+WQsOWQt+WQquWRlOWRheWQmeWQnOWQpeWQmFwiXG5cdF0sXG5cdFtcblx0XHRcImNhYTFcIixcblx0XHRcIuWQveWRj+WRgeWQqOWQpOWRh+WbruWbp+WbpeWdgeWdheWdjOWdieWdi+WdkuWkhuWlgOWmpuWmmOWmoOWml+WmjuWmouWmkOWmj+Wmp+WmoeWujuWukuWwqOWwquWyjeWyj+WyiOWyi+WyieWykuWyiuWyhuWyk+WyleW3oOW4iuW4juW6i+W6ieW6jOW6iOW6jeW8heW8neW9uOW9tuW/kuW/keW/kOW/reW/qOW/ruW/s+W/oeW/pOW/o+W/uuW/r+W/t+W/u+aAgOW/tOaIuuaKg+aKjOaKjuaKj+aKlOaKh+aJseaJu+aJuuaJsOaKgeaKiOaJt+aJveaJsuaJtOaUt+aXsOaXtOaXs+aXsuaXteadheadh1wiXG5cdF0sXG5cdFtcblx0XHRcImNiNDBcIixcblx0XHRcIuadmeadleadjOadiOadneadjeadmuadi+avkOawmeawmuaxuOaxp+axq+ayhOayi+ayj+axseaxr+axqeaymuaxreayh+ayleaynOaxpuaxs+axpeaxu+ayjueBtOeBuueJo+eKv+eKveeLg+eLhueLgeeKuueLheeOleeOl+eOk+eOlOeOkueUuueUueeWlOeWleeageekveiAtOiCleiCmeiCkOiCkuiCnOiKkOiKj+iKheiKjuiKkeiKk1wiXG5cdF0sXG5cdFtcblx0XHRcImNiYTFcIixcblx0XHRcIuiKiuiKg+iKhOixuOi/iei+v+mCn+mCoemCpemCnumCp+mCoOmYsOmYqOmYr+mYreS4s+S+mOS9vOS+heS9veS+gOS+h+S9tuS9tOS+ieS+hOS9t+S9jOS+l+S9quS+muS9ueS+geS9uOS+kOS+nOS+lOS+nuS+kuS+guS+leS9q+S9ruWGnuWGvOWGvuWIteWIsuWIs+WJhuWIseWKvOWMiuWMi+WMvOWOkuWOlOWSh+WRv+WSgeWSkeWSguWSiOWRq+WRuuWRvuWRpeWRrOWRtOWRpuWSjeWRr+WRoeWRoOWSmOWRo+WRp+WRpOWbt+WbueWdr+WdsuWdreWdq+WdseWdsOWdtuWegOWdteWdu+Wds+WdtOWdolwiXG5cdF0sXG5cdFtcblx0XHRcImNjNDBcIixcblx0XHRcIuWdqOWdveWkjOWlheWmteWmuuWnj+WnjuWmsuWnjOWngeWmtuWmvOWng+WnluWmseWmveWngOWniOWmtOWnh+WtouWtpeWuk+WuleWxhOWxh+WyruWypOWyoOWyteWyr+WyqOWyrOWyn+Wyo+WyreWyouWyquWyp+WyneWypeWytuWysOWypuW4l+W4lOW4meW8qOW8ouW8o+W8pOW9lOW+guW9vuW9veW/nuW/peaAreaApuaAmeaAsuaAi1wiXG5cdF0sXG5cdFtcblx0XHRcImNjYTFcIixcblx0XHRcIuaAtOaAiuaAl+aAs+aAmuaAnuaArOaAouaAjeaAkOaAruaAk+aAkeaAjOaAieaAnOaIlOaIveaKreaKtOaLkeaKvuaKquaKtuaLiuaKruaKs+aKr+aKu+aKqeaKsOaKuOaUveaWqOaWu+aYieaXvOaYhOaYkuaYiOaXu+aYg+aYi+aYjeaYheaXveaYkeaYkOabtuaciuaeheadrOaejuaekuadtuadu+aemOaehuaehOadtOaejeaejOaduuaen+aekeaemeaeg+adveaegeaduOadueaelOaspeaugOatvuavnuawneayk+azrOazq+azruazmeaytuazlOayreazp+ayt+azkOazguayuuazg+azhuazreazslwiXG5cdF0sXG5cdFtcblx0XHRcImNkNDBcIixcblx0XHRcIuazkuazneaytOayiuayneaygOaznuazgOa0sOazjeazh+aysOazueazj+azqeazkeeClOeCmOeCheeCk+eChueChOeCkeeClueCgueCmueCg+eJqueLlueLi+eLmOeLieeLnOeLkueLlOeLmueLjOeLkeeOpOeOoeeOreeOpueOoueOoOeOrOeOneeTneeTqOeUv+eVgOeUvueWjOeWmOear+ebs+ebseebsOebteefuOefvOefueefu+efulwiXG5cdF0sXG5cdFtcblx0XHRcImNkYTFcIixcblx0XHRcIueft+elguekv+enheepuOepu+eru+exteezveiAteiCj+iCruiCo+iCuOiCteiCreiIoOiKoOiLgOiKq+iKmuiKmOiKm+iKteiKp+iKruiKvOiKnuiKuuiKtOiKqOiKoeiKqeiLguiKpOiLg+iKtuiKouiZsOiZr+iZreiZruixlui/kui/i+i/k+i/jei/lui/lei/l+mCsumCtOmCr+mCs+mCsOmYuemYvemYvOmYuumZg+S/jeS/heS/k+S+suS/ieS/i+S/geS/lOS/nOS/meS+u+S+s+S/m+S/h+S/luS+uuS/gOS+ueS/rOWJhOWJieWLgOWLguWMveWNvOWOl+WOluWOmeWOmOWSuuWSoeWSreWSpeWTj1wiXG5cdF0sXG5cdFtcblx0XHRcImNlNDBcIixcblx0XHRcIuWTg+iMjeWSt+WSruWTluWStuWTheWThuWSoOWRsOWSvOWSouWSvuWRsuWTnuWSsOWeteWenuWen+WepOWejOWel+WeneWem+WelOWemOWej+WemeWepeWemuWeleWjtOWkjeWlk+WnoeWnnuWnruWogOWnseWnneWnuuWnveWnvOWntuWnpOWnsuWnt+Wnm+WnqeWns+WnteWnoOWnvuWntOWnreWuqOWxjOWzkOWzmOWzjOWzl+Wzi+Wzm1wiXG5cdF0sXG5cdFtcblx0XHRcImNlYTFcIixcblx0XHRcIuWznuWzmuWzieWzh+WziuWzluWzk+WzlOWzj+WziOWzhuWzjuWzn+WzuOW3ueW4oeW4ouW4o+W4oOW4pOW6sOW6pOW6ouW6m+W6o+W6peW8h+W8ruW9luW+huaAt+aAueaBlOaBsuaBnuaBheaBk+aBh+aBieaBm+aBjOaBgOaBguaBn+aApOaBhOaBmOaBpuaBruaJguaJg+aLj+aMjeaMi+aLteaMjuaMg+aLq+aLueaMj+aMjOaLuOaLtuaMgOaMk+aMlOaLuuaMleaLu+aLsOaVgeaVg+aWquaWv+aYtuaYoeaYsuaYteaYnOaYpuaYouaYs+aYq+aYuuaYneaYtOaYueaYruacj+ackOafgeafsuafiOaeulwiXG5cdF0sXG5cdFtcblx0XHRcImNmNDBcIixcblx0XHRcIuafnOaeu+afuOafmOafgOaet+afheafq+afpOafn+aeteafjeaes+aft+aftuafruafo+afguaeueafjuafp+afsOaesuafvOafhuafreafjOaeruafpuafm+afuuafieafiuafg+afquafi+asqOauguauhOautuavluavmOavoOawoOawoea0qOa0tOa0rea0n+a0vOa0v+a0kua0iuazmua0s+a0hOa0mea0uua0mua0kea0gOa0nea1glwiXG5cdF0sXG5cdFtcblx0XHRcImNmYTFcIixcblx0XHRcIua0gea0mOa0t+a0g+a0j+a1gOa0h+a0oOa0rOa0iOa0oua0iea0kOeCt+eCn+eCvueCseeCsOeCoeeCtOeCteeCqeeJgeeJieeJiueJrOeJsOeJs+eJrueLiueLpOeLqOeLq+eLn+eLqueLpueLo+eOheePjOePguePiOePheeOueeOtueOteeOtOePq+eOv+ePh+eOvuePg+ePhueOuOePi+eTrOeTrueUrueVh+eViOeWp+eWqueZueebhOeciOecg+echOecheeciuebt+ebu+ebuuefp+efqOeghuegkeegkuegheegkOegj+egjuegieegg+egk+eliueljOeli+elheelhOenleenjeenj+enluenjueqgFwiXG5cdF0sXG5cdFtcblx0XHRcImQwNDBcIixcblx0XHRcIuepvuerkeesgOesgeexuuexuOexueexv+eygOeygee0g+e0iOe0gee9mOe+kee+jee+vuiAh+iAjuiAj+iAlOiAt+iDmOiDh+iDoOiDkeiDiOiDguiDkOiDheiDo+iDmeiDnOiDiuiDleiDieiDj+iDl+iDpuiDjeiHv+iIoeiKlOiLmeiLvuiLueiMh+iLqOiMgOiLleiMuuiLq+iLluiLtOiLrOiLoeiLsuiLteiMjOiLu+iLtuiLsOiLqlwiXG5cdF0sXG5cdFtcblx0XHRcImQwYTFcIixcblx0XHRcIuiLpOiLoOiLuuiLs+iLreiZt+iZtOiZvOiZs+ihgeihjuihp+ihquihqeink+iohOioh+i1sui/o+i/oei/rui/oOmDsemCvemCv+mDlemDhemCvumDh+mDi+mDiOmHlOmHk+mZlOmZj+mZkemZk+mZiumZjuWAnuWAheWAh+WAk+WAouWAsOWAm+S/teS/tOWAs+WAt+WArOS/tuS/t+WAl+WAnOWAoOWAp+WAteWAr+WAseWAjuWFmuWGlOWGk+WHiuWHhOWHheWHiOWHjuWJoeWJmuWJkuWJnuWJn+WJleWJouWLjeWMjuWOnuWUpuWTouWUl+WUkuWTp+WTs+WTpOWUmuWTv+WUhOWUiOWTq+WUkeWUheWTsVwiXG5cdF0sXG5cdFtcblx0XHRcImQxNDBcIixcblx0XHRcIuWUiuWTu+WTt+WTuOWToOWUjuWUg+WUi+WcgeWcguWfjOWgsuWfleWfkuWeuuWfhuWeveWevOWeuOWetuWev+Wfh+WfkOWeueWfgeWkjuWliuWomeWoluWoreWoruWoleWoj+Wol+WoiuWonuWos+WtrOWup+WureWurOWwg+WxluWxlOWzrOWzv+WzruWzseWzt+W0gOWzueW4qeW4qOW6qOW6ruW6quW6rOW8s+W8sOW9p+aBneaBmuaBp1wiXG5cdF0sXG5cdFtcblx0XHRcImQxYTFcIixcblx0XHRcIuaBgeaCouaCiOaCgOaCkuaCgeaCneaCg+aCleaCm+aCl+aCh+aCnOaCjuaImeaJhuaLsuaMkOaNluaMrOaNhOaNheaMtuaNg+aPpOaMueaNi+aNiuaMvOaMqeaNgeaMtOaNmOaNlOaNmeaMreaNh+aMs+aNmuaNkeaMuOaNl+aNgOaNiOaViuaVhuaXhuaXg+aXhOaXguaZiuaZn+aZh+aZkeackuack+agn+agmuahieagsuags+agu+ahi+ahj+agluagseagnOagteagq+agreagr+ahjuahhOagtOagneagkuaglOagpuagqOagruahjeaguuagpeagoOasrOasr+asreasseastOatreiCguauiOavpuavpFwiXG5cdF0sXG5cdFtcblx0XHRcImQyNDBcIixcblx0XHRcIuavqOavo+avouavp+awpea1uua1o+a1pOa1tua0jea1oea2kua1mOa1oua1rea1r+a2kea2jea3r+a1v+a2hua1nua1p+a1oOa2l+a1sOa1vOa1n+a2gua2mOa0r+a1qOa2i+a1vua2gOa2hOa0lua2g+a1u+a1vea1tea2kOeDnOeDk+eDkeeDneeDi+e8ueeDoueDl+eDkueDnueDoOeDlOeDjeeDheeDhueDh+eDmueDjueDoeeJgueJuFwiXG5cdF0sXG5cdFtcblx0XHRcImQyYTFcIixcblx0XHRcIueJt+eJtueMgOeLuueLtOeLvueLtueLs+eLu+eMgeePk+ePmeePpeePlueOvOePp+ePo+ePqeePnOePkuePm+ePlOePneePmuePl+ePmOePqOeTnueTn+eTtOeTteeUoeeVm+eVn+eWsOeXgeeWu+eXhOeXgOeWv+eWtueWuueaiuebieecneecm+eckOeck+eckueco+eckeecleecmeecmuecouecp+ego+egrOegouegteegr+egqOegruegq+egoeegqeegs+egquegseellOelm+elj+elnOelk+elkuelkeenq+enrOenoOenruenreenquennOennuenneeqhueqieeqheeqi+eqjOeqiueqh+ermOeskFwiXG5cdF0sXG5cdFtcblx0XHRcImQzNDBcIixcblx0XHRcIueshOesk+esheesj+esiOesiuesjuesieeskueyhOeykeeyiueyjOeyiOeyjeeyhee0nue0nee0kee0jue0mOe0lue0k+e0n+e0kue0j+e0jOe9nOe9oee9nue9oOe9nee9m+e+lue+kue/g+e/gue/gOiAluiAvuiAueiDuuiDsuiDueiDteiEgeiDu+iEgOiIgeiIr+iIpeiMs+iMreiNhOiMmeiNkeiMpeiNluiMv+iNgeiMpuiMnOiMolwiXG5cdF0sXG5cdFtcblx0XHRcImQzYTFcIixcblx0XHRcIuiNguiNjuiMm+iMquiMiOiMvOiNjeiMluiMpOiMoOiMt+iMr+iMqeiNh+iNheiNjOiNk+iMnuiMrOiNi+iMp+iNiOiZk+iZkuiaouiaqOialuiajeiakeianuiah+ial+iahuiai+iamuiaheiapeiameiaoeiap+ialeiamOiajuianeiakOialOihg+ihhOihreihteihtuihsuiigOihseihv+ihr+iig+ihvuihtOihvOiokuixh+ixl+ixu+iypOiyo+i1tui1uOi2tei2t+i2tui7kei7k+i/vui/temAgui/v+i/u+mAhOi/vOi/tumDlumDoOmDmemDmumDo+mDn+mDpemDmOmDm+mDl+mDnOmDpOmFkFwiXG5cdF0sXG5cdFtcblx0XHRcImQ0NDBcIixcblx0XHRcIumFjumFj+mHlemHoumHmumZnOmZn+mavOmjo+mrn+msr+S5v+WBsOWBquWBoeWBnuWBoOWBk+WBi+WBneWBsuWBiOWBjeWBgeWBm+WBiuWBouWAleWBheWBn+WBqeWBq+WBo+WBpOWBhuWBgOWBruWBs+WBl+WBkeWHkOWJq+WJreWJrOWJruWLluWLk+WMreWOnOWVteWVtuWUvOWVjeWVkOWUtOWUquWVkeWVouWUtuWUteWUsOWVkuWVhVwiXG5cdF0sXG5cdFtcblx0XHRcImQ0YTFcIixcblx0XHRcIuWUjOWUsuWVpeWVjuWUueWViOWUreWUu+WVgOWVi+WciuWch+Wfu+WglOWfouWftuWfnOWftOWggOWfreWfveWgiOWfuOWgi+Wfs+Wfj+Wgh+WfruWfo+WfsuWfpeWfrOWfoeWgjuWfvOWgkOWfp+WggeWgjOWfseWfqeWfsOWgjeWghOWlnOWpoOWpmOWpleWpp+WpnuWouOWoteWpreWpkOWpn+WppeWprOWpk+WppOWpl+Wpg+WpneWpkuWphOWpm+WpiOWqjuWovuWpjeWoueWpjOWpsOWpqeWph+WpkeWpluWpguWpnOWtsuWtruWvgeWvgOWxmeW0nuW0i+W0neW0muW0oOW0jOW0qOW0jeW0puW0peW0j1wiXG5cdF0sXG5cdFtcblx0XHRcImQ1NDBcIixcblx0XHRcIuW0sOW0kuW0o+W0n+W0ruW4vuW4tOW6seW6tOW6ueW6suW6s+W8tuW8uOW+m+W+luW+n+aCiuaCkOaChuaCvuaCsOaCuuaDk+aDlOaDj+aDpOaDmeaDneaDiOaCseaDm+aCt+aDiuaCv+aDg+aDjeaDgOaMsuaNpeaOiuaOguaNveaOveaOnuaOreaOneaOl+aOq+aOjuaNr+aOh+aOkOaNruaOr+aNteaOnOaNreaOruaNvOaOpOaMu+aOn1wiXG5cdF0sXG5cdFtcblx0XHRcImQ1YTFcIixcblx0XHRcIuaNuOaOheaOgeaOkeaOjeaNsOaVk+aXjeaZpeaZoeaZm+aZmeaZnOaZouacmOahueaih+aikOainOahreahruairuaiq+alluahr+aio+airOaiqeahteahtOaisuaij+aht+aikuahvOahq+ahsuaiquaigOahseahvuaim+ailuaii+aioOaiieaipOahuOahu+aikeaijOaiiuahveastuass+ast+asuOaukeauj+aujeaujuaujOawqua3gOa2q+a2tOa2s+a5tOa2rOa3qea3oua2t+a3tua3lOa4gOa3iOa3oOa3n+a3lua2vua3pea3nOa3nea3m+a3tOa3iua2vea3rea3sOa2uua3lea3gua3j+a3iVwiXG5cdF0sXG5cdFtcblx0XHRcImQ2NDBcIixcblx0XHRcIua3kOa3sua3k+a3vea3l+a3jea3o+a2u+eDuueEjeeDt+eEl+eDtOeEjOeDsOeEhOeDs+eEkOeDvOeDv+eEhueEk+eEgOeDuOeDtueEi+eEgueEjueJvueJu+eJvOeJv+eMneeMl+eMh+eMkeeMmOeMiueMiOeLv+eMj+eMnueOiOePtuePuOePteeQhOeQgeePveeQh+eQgOePuuePvOePv+eQjOeQi+ePtOeQiOeVpOeVo+eXjueXkueXj1wiXG5cdF0sXG5cdFtcblx0XHRcImQ2YTFcIixcblx0XHRcIueXi+eXjOeXkeeXkOeaj+eaieebk+ecueecr+ecreecseecsuectOecs+ecveecpeecu+ecteehiOehkuehieehjeehiuehjOegpuehheehkOelpOelp+elqeelquelo+elq+eloeemu+enuuenuOentuent+eqj+eqlOeqkOesteeth+estOespeessOesouespOess+esmOesquesneesseesq+esreesr+essuesuOesmueso+eylOeymOeylueyo+e0tee0vee0uOe0tue0uue1hee0rOe0qee1gee1h+e0vue0v+e1iue0u+e0qOe9o+e+lee+nOe+nee+m+e/iue/i+e/jee/kOe/kee/h+e/j+e/ieiAn1wiXG5cdF0sXG5cdFtcblx0XHRcImQ3NDBcIixcblx0XHRcIuiAnuiAm+iBh+iBg+iBiOiEmOiEpeiEmeiEm+iEreiEn+iErOiEnuiEoeiEleiEp+iEneiEouiIkeiIuOiIs+iIuuiItOiIsuiJtOiOkOiOo+iOqOiOjeiNuuiNs+iOpOiNtOiOj+iOgeiOleiOmeiNteiOlOiOqeiNveiOg+iOjOiOneiOm+iOquiOi+iNvuiOpeiOr+iOiOiOl+iOsOiNv+iOpuiOh+iOruiNtuiOmuiZmeiZluiav+iat1wiXG5cdF0sXG5cdFtcblx0XHRcImQ3YTFcIixcblx0XHRcIuibguibgeibheiauuiasOibiOiaueias+iauOibjOiatOiau+iavOibg+iaveiavuihkuiiieiileiiqOiiouiiquiimuiikeiioeiin+iimOiip+iimeiim+iil+iipOiirOiijOiik+iijuimguinluinmeinleiosOiop+iorOionuiwueiwu+ixnOixneixveiypei1vei1u+i1uei2vOi3gui2uei2v+i3gei7mOi7nui7nei7nOi7l+i7oOi7oemApOmAi+mAkemAnOmAjOmAoemDr+mDqumDsOmDtOmDsumDs+mDlOmDq+mDrOmDqemFlumFmOmFmumFk+mFlemHrOmHtOmHsemHs+mHuOmHpOmHuemHqlwiXG5cdF0sXG5cdFtcblx0XHRcImQ4NDBcIixcblx0XHRcIumHq+mHt+mHqOmHrumVuumWhumWiOmZvOmZremZq+mZsemZr+mav+mdqumghOmjpemml+WCm+WCleWClOWCnuWCi+WCo+WCg+WCjOWCjuWCneWBqOWCnOWCkuWCguWCh+WFn+WHlOWMkuWMkeWOpOWOp+WWkeWWqOWWpeWWreWVt+WZheWWouWWk+WWiOWWj+WWteWWgeWWo+WWkuWWpOWVveWWjOWWpuWVv+WWleWWoeWWjuWcjOWgqeWgt1wiXG5cdF0sXG5cdFtcblx0XHRcImQ4YTFcIixcblx0XHRcIuWgmeWgnuWgp+Wgo+WgqOWfteWhiOWgpeWgnOWgm+Wgs+Wgv+WgtuWgruWgueWguOWgreWgrOWgu+WloeWqr+WqlOWqn+WpuuWqouWqnuWpuOWqpuWpvOWqpeWqrOWqleWqruWot+WqhOWqiuWql+Wqg+Wqi+WqqeWpu+WpveWqjOWqnOWqj+Wqk+WqneWvquWvjeWvi+WvlOWvkeWviuWvjuWwjOWwsOW0t+W1g+W1q+W1geW1i+W0v+W0teW1keW1juW1leW0s+W0uuW1kuW0veW0seW1meW1guW0ueW1ieW0uOW0vOW0suW0tuW1gOW1heW5hOW5geW9mOW+puW+peW+q+aDieaCueaDjOaDouaDjuaDhOaElFwiXG5cdF0sXG5cdFtcblx0XHRcImQ5NDBcIixcblx0XHRcIuaDsuaEiuaEluaEheaDteaEk+aDuOaDvOaDvuaDgeaEg+aEmOaEneaEkOaDv+aEhOaEi+aJiuaOlOaOseaOsOaPjuaPpeaPqOaPr+aPg+aSneaPs+aPiuaPoOaPtuaPleaPsuaPteaRoeaPn+aOvuaPneaPnOaPhOaPmOaPk+aPguaPh+aPjOaPi+aPiOaPsOaPl+aPmeaUsuaVp+aVquaVpOaVnOaVqOaVpeaWjOaWneaWnuaWruaXkOaXklwiXG5cdF0sXG5cdFtcblx0XHRcImQ5YTFcIixcblx0XHRcIuaZvOaZrOaZu+aagOaZseaZueaZquaZsuacgeakjOajk+akhOajnOakquajrOajquajseakj+ajluajt+ajq+ajpOajtuakk+akkOajs+ajoeakh+ajjOakiOalsOaitOakkeajr+ajhuaklOajuOajkOajveajvOajqOaki+akiuakl+ajjuajiOajneajnuajpuajtOajkeakhuajlOajqeakleakpeajh+asueasu+asv+asvOaulOaul+aumeauleauveavsOavsuavs+awsOa3vOa5hua5h+a4n+a5iea6iOa4vOa4vea5hea5oua4q+a4v+a5gea5nea5s+a4nOa4s+a5i+a5gOa5kea4u+a4g+a4rua5nlwiXG5cdF0sXG5cdFtcblx0XHRcImRhNDBcIixcblx0XHRcIua5qOa5nOa5oea4sea4qOa5oOa5sea5q+a4uea4oua4sOa5k+a5pea4p+a5uOa5pOa5t+a5lea5uea5kua5pua4tea4tua5mueEoOeEnueEr+eDu+eErueEseeEo+eEpeeEoueEsueEn+eEqOeEuueEm+eJi+eJmueKiOeKieeKhueKheeKi+eMkueMi+eMsOeMoueMseeMs+eMp+eMsueMreeMpueMo+eMteeMjOeQrueQrOeQsOeQq+eQllwiXG5cdF0sXG5cdFtcblx0XHRcImRhYTFcIixcblx0XHRcIueQmueQoeeQreeQseeQpOeQo+eQneeQqeeQoOeQsueTu+eUr+eVr+eVrOeXp+eXmueXoeeXpueXneeXn+eXpOeXl+ealeeakuebmuedhuedh+edhOedjeedheediuedjuedi+edjOefnuefrOehoOehpOehpeehnOehreehseehquehruehsOehqeehqOehnuehoueltOels+elsuelsOeogueoiueog+eojOeohOeqmeerpuerpOetiuesu+ethOetiOetjOetjuetgOetmOetheeyoueynueyqOeyoee1mOe1r+e1o+e1k+e1lue1p+e1que1j+e1ree1nOe1q+e1kue1lOe1qee1kee1n+e1jue8vue8v+e9pVwiXG5cdF0sXG5cdFtcblx0XHRcImRiNDBcIixcblx0XHRcIue9pue+oue+oOe+oee/l+iBkeiBj+iBkOiDvuiDlOiFg+iFiuiFkuiFj+iFh+iEveiFjeiEuuiHpuiHruiHt+iHuOiHueiIhOiIvOiIveiIv+iJteiMu+iPj+iPueiQo+iPgOiPqOiQkuiPp+iPpOiPvOiPtuiQkOiPhuiPiOiPq+iPo+iOv+iQgeiPneiPpeiPmOiPv+iPoeiPi+iPjuiPluiPteiPieiQieiQj+iPnuiQkeiQhuiPguiPs1wiXG5cdF0sXG5cdFtcblx0XHRcImRiYTFcIixcblx0XHRcIuiPleiPuuiPh+iPkeiPquiQk+iPg+iPrOiPruiPhOiPu+iPl+iPouiQm+iPm+iPvuibmOibouibpuibk+ibo+ibmuibquibneibq+ibnOibrOibqeibl+ibqOibkeihiOihluihleiiuuijl+iiueiiuOijgOiivuiituiivOiit+iiveiisuikgeijieimleimmOiml+inneinmuinm+ipjuipjeioueipmeipgOipl+ipmOiphOipheipkuipiOipkeipiuipjOipj+ixn+iygeiygOiyuuiyvuiysOiyueiytei2hOi2gOi2iei3mOi3k+i3jei3h+i3lui3nOi3j+i3lei3mei3iOi3l+i3hei7r+i7t+i7ulwiXG5cdF0sXG5cdFtcblx0XHRcImRjNDBcIixcblx0XHRcIui7uei7pui7rui7pei7tei7p+i7qOi7tui7q+i7sei7rOi7tOi7qemAremAtOmAr+mEhumErOmEhOmDv+mDvOmEiOmDuemDu+mEgemEgOmEh+mEhemEg+mFoemFpOmFn+mFoumFoOmIgemIiumIpemIg+mImumIpumIj+mIjOmIgOmIkumHv+mHvemIhumIhOmIp+mIgumInOmIpOmImemIl+mIhemIlumVu+mWjemWjOmWkOmah+mZvumaiFwiXG5cdF0sXG5cdFtcblx0XHRcImRjYTFcIixcblx0XHRcIumaiemag+magOmbgumbiOmbg+mbsembsOmdrOmdsOmdrumgh+miqemjq+mzpum7ueS6g+S6hOS6tuWCveWCv+WDhuWCruWDhOWDiuWCtOWDiOWDguWCsOWDgeWCuuWCseWDi+WDieWCtuWCuOWHl+WJuuWJuOWJu+WJvOWXg+WXm+WXjOWXkOWXi+WXiuWXneWXgOWXlOWXhOWXqeWWv+WXkuWWjeWXj+WXleWXouWXluWXiOWXsuWXjeWXmeWXguWclOWhk+WhqOWhpOWhj+WhjeWhieWhr+WhleWhjuWhneWhmeWhpeWhm+WgveWho+WhseWjvOWrh+WrhOWri+WquuWquOWqseWqteWqsOWqv+WriOWqu+WrhlwiXG5cdF0sXG5cdFtcblx0XHRcImRkNDBcIixcblx0XHRcIuWqt+WrgOWriuWqtOWqtuWrjeWqueWqkOWvluWvmOWvmeWwn+Wws+W1seW1o+W1iuW1peW1suW1rOW1nuW1qOW1p+W1ouW3sOW5j+W5juW5iuW5jeW5i+W7heW7jOW7huW7i+W7h+W9gOW+r+W+reaDt+aFieaFiuaEq+aFheaEtuaEsuaEruaFhuaEr+aFj+aEqeaFgOaIoOmFqOaIo+aIpeaIpOaPheaPseaPq+aQkOaQkuaQieaQoOaQpFwiXG5cdF0sXG5cdFtcblx0XHRcImRkYTFcIixcblx0XHRcIuaQs+aRg+aQn+aQleaQmOaQueaQt+aQouaQo+aQjOaQpuaQsOaQqOaRgeaQteaQr+aQiuaQmuaRgOaQpeaQp+aQi+aPp+aQm+aQruaQoeaQjuaVr+aWkuaXk+aahuaajOaaleaakOaai+aaiuaameaalOaZuOacoOalpualn+akuOaljualoualseakv+alhealquakuealguall+almealuualiOalieaktealrOaks+akvealpeajsOaluOaktOalqealgOalr+alhOaltualmOalgealtOaljOaku+ali+akt+alnOalj+alkeaksualkuakr+alu+akvOathuatheatg+atguatiOatgeaum++ojeavu+avvFwiXG5cdF0sXG5cdFtcblx0XHRcImRlNDBcIixcblx0XHRcIuavueavt+avuOa6m+a7lua7iOa6j+a7gOa6n+a6k+a6lOa6oOa6sea6uea7hua7kua6vea7gea6nua7iea6t+a6sOa7jea6pua7j+a6sua6vua7g+a7nOa7mOa6mea6kua6jua6jea6pOa6oea6v+a6s+a7kOa7iua6l+a6rua6o+eFh+eFlOeFkueFo+eFoOeFgeeFneeFoueFsueFuOeFqueFoeeFgueFmOeFg+eFi+eFsOeFn+eFkOeFk1wiXG5cdF0sXG5cdFtcblx0XHRcImRlYTFcIixcblx0XHRcIueFhOeFjeeFmueJj+eKjeeKjOeKkeeKkOeKjueMvOeNgueMu+eMuueNgOeNiueNieeRhOeRiueRi+eRkueRkeeRl+eRgOeRj+eRkOeRjueRgueRhueRjeeRlOeToeeTv+eTvueTveeUneeVueeVt+amg+eXr+eYj+eYg+eXt+eXvueXvOeXueeXuOeYkOeXu+eXtueXreeXteeXveeameeateebneedleedn+edoOedkuedluedmuedqeedp+edlOedmeedreefoOeih+eimueilOeij+eihOeileeiheeihueioeeig+ehueeimeeigOeiluehu+elvOemguelveelueeokeeomOeomeeokueol+eoleeooueok1wiXG5cdF0sXG5cdFtcblx0XHRcImRmNDBcIixcblx0XHRcIueom+eokOeqo+eqoueqnuerq+etpuetpOetreettOetqeetsuetpeets+etseetsOetoeetuOettueto+eysueytOeyr+e2iOe2hue2gOe2jee1v+e2hee1uue2jue1u+e2g+e1vOe2jOe2lOe2hOe1vee2kue9ree9q+e9p+e9qOe9rOe+pue+pee+p+e/m+e/nOiAoeiFpOiFoOiFt+iFnOiFqeiFm+iFouiFsuacoeiFnuiFtuiFp+iFr1wiXG5cdF0sXG5cdFtcblx0XHRcImRmYTFcIixcblx0XHRcIuiFhOiFoeiIneiJieiJhOiJgOiJguiJheiTseiQv+iRluiRtuiRueiSj+iSjeiRpeiRkeiRgOiShuiRp+iQsOiRjeiRveiRmuiRmeiRtOiRs+iRneiUh+iRnuiQt+iQuuiQtOiRuuiRg+iRuOiQsuiRheiQqeiPmeiRi+iQr+iRguiQreiRn+iRsOiQueiRjuiRjOiRkuiRr+iTheiSjuiQu+iRh+iQtuiQs+iRqOiRvuiRhOiQq+iRoOiRlOiRruiRkOici+ichOibt+icjOibuuibluibteidjeibuOicjuicieicgeibtuicjeicheijluiji+ijjeijjuijnuijm+ijmuijjOijkOimheimm+inn+inpeinpFwiXG5cdF0sXG5cdFtcblx0XHRcImUwNDBcIixcblx0XHRcIuinoeinoOinouinnOinpuiptuiqhuipv+ipoeiov+ipt+iqguiqhOipteiqg+iqgeiptOipuuiwvOixi+ixiuixpeixpOixpuiyhuiyhOiyheizjOi1qOi1qei2kei2jOi2jui2j+i2jei2k+i2lOi2kOi2kui3sOi3oOi3rOi3sei3rui3kOi3qei3o+i3oui3p+i3sui3q+i3tOi8hui7v+i8gei8gOi8hei8h+i8iOi8gui8i+mBkumAv1wiXG5cdF0sXG5cdFtcblx0XHRcImUwYTFcIixcblx0XHRcIumBhOmBiemAvemEkOmEjemEj+mEkemElumElOmEi+mEjumFrumFr+mJiOmJkumIsOmIuumJpumIs+mJpemJnumKg+mIrumJiumJhumJremJrOmJj+mJoOmJp+mJr+mItumJoemJsOmIsemJlOmJo+mJkOmJsumJjumJk+mJjOmJlumIsumWn+mWnOmWnumWm+makumak+makemal+mbjumbuumbvembuOmbtemds+mdt+mduOmdsumgj+mgjemgjumirOmjtumjuemmr+mmsummsOmmtemqremqq+mtm+mzqumzremzp+m6gOm7veWDpuWDlOWDl+WDqOWDs+WDm+WDquWDneWDpOWDk+WDrOWDsOWDr+WDo+WDoFwiXG5cdF0sXG5cdFtcblx0XHRcImUxNDBcIixcblx0XHRcIuWHmOWKgOWKgeWLqeWLq+WMsOWOrOWYp+WYleWYjOWYkuWXvOWYj+WYnOWYgeWYk+WYguWXuuWYneWYhOWXv+WXueWiieWhvOWikOWimOWihuWigeWhv+WhtOWii+WhuuWih+WikeWijuWhtuWiguWiiOWhu+WilOWij+WjvuWlq+WrnOWrruWrpeWrleWrquWrmuWrreWrq+Wrs+WrouWroOWrm+WrrOWrnuWrneWrmeWrqOWrn+Wtt+WvoFwiXG5cdF0sXG5cdFtcblx0XHRcImUxYTFcIixcblx0XHRcIuWvo+Wxo+W2guW2gOW1veW2huW1uuW2geW1t+W2iuW2ieW2iOW1vuW1vOW2jeW1ueW1v+W5mOW5meW5k+W7mOW7keW7l+W7juW7nOW7leW7meW7kuW7lOW9hOW9g+W9r+W+tuaErOaEqOaFgeaFnuaFseaFs+aFkuaFk+aFsuaFrOaGgOaFtOaFlOaFuuaFm+aFpeaEu+aFquaFoeaFluaIqeaIp+aIq+aQq+aRjeaRm+aRneaRtOaRtuaRsuaRs+aRveaRteaRpuaSpuaRjuaSguaRnuaRnOaRi+aRk+aRoOaRkOaRv+aQv+aRrOaRq+aRmeaRpeaRt+aVs+aWoOaaoeaaoOaan+acheachOacouamseamtuaniVwiXG5cdF0sXG5cdFtcblx0XHRcImUyNDBcIixcblx0XHRcIuamoOanjuamluamsOamrOamvOamkeammeamjuamp+amjeamqeamvuamr+amv+anhOamveampOanlOamueaniuammuanj+ams+amk+amquamoeamnuanmeaml+amkOanguamteampeanhuatiuatjeati+aunuaun+auoOavg+avhOavvua7jua7tea7sea8g+a8pea7uOa8t+a7u+a8rua8iea9jua8mea8mua8p+a8mOa8u+a8kua7rea8ilwiXG5cdF0sXG5cdFtcblx0XHRcImUyYTFcIixcblx0XHRcIua8tua9s+a7uea7rua8rea9gOa8sOa8vOa8tea7q+a8h+a8jua9g+a8hea7vea7tua8uea8nOa7vOa8uua8n+a8jea8nua8iOa8oeeGh+eGkOeGieeGgOeGheeGgueGj+eFu+eGhueGgeeGl+eJhOeJk+eKl+eKleeKk+eNg+eNjeeNkeeNjOeRoueRs+eRseeRteeRsueRp+eRrueUgOeUgueUg+eVveeWkOeYlueYiOeYjOeYleeYkeeYiueYlOeauOeegeedvOeeheeeguedrueegOedr+edvueeg+eisueiqueitOeireeiqOehvueiq+einueipeeioOeirOeioueipOemmOemiuemi+emluemleemlOemk1wiXG5cdF0sXG5cdFtcblx0XHRcImUzNDBcIixcblx0XHRcIueml+emiOemkuemkOeoq+epiueosOeor+eoqOeopueqqOeqq+eqrOerrueuiOeunOeuiueukeeukOeulueujeeujOeum+eujueuheeumOWKhOeumeeupOeugueyu+eyv+eyvOeyuue2p+e2t+e3gue2o+e2que3gee3gOe3hee2nee3jue3hOe3hue3i+e3jOe2r+e2uee2lue2vOe2n+e2pue2rue2qee2oee3iee9s+e/oue/o+e/pee/nlwiXG5cdF0sXG5cdFtcblx0XHRcImUzYTFcIixcblx0XHRcIuiApOiBneiBnOiGieiGhuiGg+iGh+iGjeiGjOiGi+iIleiSl+iSpOiSoeiSn+iSuuiTjuiTguiSrOiSruiSq+iSueiStOiTgeiTjeiSquiSmuiSseiTkOiSneiSp+iSu+iSouiSlOiTh+iTjOiSm+iSqeiSr+iSqOiTluiSmOiStuiTj+iSoOiTl+iTlOiTkuiTm+iSsOiSkeiZoeics+ico+icqOidq+idgOicruicnuicoeicmeicm+idg+icrOidgeicvuidhuicoOicsuicquicreicvOickuicuuicseicteidguicpuicp+icuOicpOicmuicsOickeijt+ijp+ijseijsuijuuijvuijruijvOijtuiju1wiXG5cdF0sXG5cdFtcblx0XHRcImU0NDBcIixcblx0XHRcIuijsOijrOijq+imneimoeimn+imnuinqeinq+inqOiqq+iqmeiqi+iqkuiqj+iqluiwveixqOixqeizleizj+izl+i2lui4iei4gui3v+i4jei3vei4iui4g+i4h+i4hui4hei3vui4gOi4hOi8kOi8kei8jui8jemEo+mEnOmEoOmEoumEn+mEnemEmumEpOmEoemEm+mFuumFsumFuemFs+mKpemKpOmJtumKm+mJuumKoOmKlOmKqumKjVwiXG5cdF0sXG5cdFtcblx0XHRcImU0YTFcIixcblx0XHRcIumKpumKmumKq+mJuemKl+mJv+mKo+mLrumKjumKgumKlemKoumJvemKiOmKoemKiumKhumKjOmKmemKp+mJvumKh+mKqemKnemKi+mIremanumaoembv+mdmOmdvemduumdvumeg+megOmegumdu+mehOmegemdv+mfjumfjemglumiremirumkgumkgOmkh+mmnemmnOmng+mmuemmu+mmuumngummvemnh+mqsemro+mrp+msvumsv+mtoOmtoemtn+mzsemzsumztem6p+WDv+WEg+WEsOWDuOWEhuWEh+WDtuWDvuWEi+WEjOWDveWEiuWKi+WKjOWLseWLr+WZiOWZguWZjOWYteWZgeWZiuWZieWZhuWZmFwiXG5cdF0sXG5cdFtcblx0XHRcImU1NDBcIixcblx0XHRcIuWZmuWZgOWYs+WYveWYrOWYvuWYuOWYquWYuuWcmuWiq+WineWiseWioOWio+Wir+WirOWipeWioeWjv+Wrv+WrtOWrveWrt+WrtuWsg+WruOWsguWrueWsgeWsh+WsheWsj+Wxp+W2meW2l+W2n+W2kuW2ouW2k+W2leW2oOW2nOW2oeW2muW2nuW5qeW5neW5oOW5nOe3s+W7m+W7nuW7oeW9ieW+suaGi+aGg+aFueaGseaGsOaGouaGiVwiXG5cdF0sXG5cdFtcblx0XHRcImU1YTFcIixcblx0XHRcIuaGm+aGk+aGr+aGreaGn+aGkuaGquaGoeaGjeaFpuaGs+aIreaRruaRsOaSluaSoOaSheaSl+aSnOaSj+aSi+aSiuaSjOaSo+aSn+aRqOaSseaSmOaVtuaVuuaVueaVu+aWsuaWs+aateaasOaaqeaasuaat+aaquaar+aogOaohuaol+anpeanuOaoleanseanpOaooOanv+anrOanouaom+aoneanvuaop+ansuanruaolOant+anp+apgOaoiOanpuanu+aojeanvOanq+aoieaohOaomOaopeaoj+antuaopuaoh+antOaoluatkeaupeauo+auouaupuawgeawgOavv+awgua9gea8pua9vua+h+a/hua+klwiXG5cdF0sXG5cdFtcblx0XHRcImU2NDBcIixcblx0XHRcIua+jea+iea+jOa9oua9j+a+hea9mua+lua9tua9rOa+gua9lea9sua9kua9kOa9l+a+lOa+k+a9nea8gOa9oea9q+a9vea9p+a+kOa9k+a+i+a9qea9v+a+lea9o+a9t+a9qua9u+eGsueGr+eGm+eGsOeGoOeGmueGqeeGteeGneeGpeeGnueGpOeGoeeGqueGnOeGp+eGs+eKmOeKmueNmOeNkueNnueNn+eNoOeNneeNm+eNoeeNmueNmVwiXG5cdF0sXG5cdFtcblx0XHRcImU2YTFcIixcblx0XHRcIueNoueSh+eSieeSiueShueSgeeRveeSheeSiOeRvOeRueeUiOeUh+eVvueYpeeYnueYmeeYneeYnOeYo+eYmueYqOeYm+eanOeaneeanueam+eejeeej+eeieeeiOejjeeiu+ejj+ejjOejkeejjuejlOejiOejg+ejhOejieemmuemoeemoOemnOemouemm+attueoueeqsueqtOeqs+eut+evi+euvueurOevjueur+euueeviueuteezheeziOezjOezi+e3t+e3m+e3que3p+e3l+e3oee4g+e3uue3pue3tue3see3sOe3rue3n+e9tue+rOe+sOe+ree/ree/q+e/que/rOe/pue/qOiBpOiBp+iGo+iGn1wiXG5cdF0sXG5cdFtcblx0XHRcImU3NDBcIixcblx0XHRcIuiGnuiGleiGouiGmeiGl+iIluiJj+iJk+iJkuiJkOiJjuiJkeiUpOiUu+iUj+iUgOiUqeiUjuiUieiUjeiUn+iUiuiUp+iUnOiTu+iUq+iTuuiUiOiUjOiTtOiUquiTsuiUleiTt+iTq+iTs+iTvOiUkuiTquiTqeiUluiTvuiUqOiUneiUruiUguiTveiUnuiTtuiUseiUpuiTp+iTqOiTsOiTr+iTueiUmOiUoOiUsOiUi+iUmeiUr+iZolwiXG5cdF0sXG5cdFtcblx0XHRcImU3YTFcIixcblx0XHRcIuidluido+idpOidt+ifoeids+idmOidlOidm+idkuidoeidmuidkeidnuidreidquidkOidjuidn+idneidr+idrOiduuidruidnOidpeidj+idu+idteidouidp+idqeihmuikheikjOiklOiki+ikl+ikmOikmeikhuikluikkeikjuikieimouimpOimo+inreinsOinrOirj+irhuiquOirk+irkeirlOirleiqu+irl+iqvuirgOirheirmOirg+iquuiqveirmeiwvuixjeiyj+izpeizn+izmeizqOizmuizneizp+i2oOi2nOi2oei2m+i4oOi4o+i4pei4pOi4rui4lei4m+i4lui4kei4mei4pui4p1wiXG5cdF0sXG5cdFtcblx0XHRcImU4NDBcIixcblx0XHRcIui4lOi4kui4mOi4k+i4nOi4l+i4mui8rOi8pOi8mOi8mui8oOi8o+i8lui8l+mBs+mBsOmBr+mBp+mBq+mEr+mEq+mEqemEqumEsumEpumErumGhemGhumGiumGgemGgumGhOmGgOmLkOmLg+mLhOmLgOmLmemKtumLj+mLsemLn+mLmOmLqemLl+mLnemLjOmLr+mLgumLqOmLiumLiOmLjumLpumLjemLlemLiemLoOmLnumLp+mLkemLk1wiXG5cdF0sXG5cdFtcblx0XHRcImU4YTFcIixcblx0XHRcIumKtemLoemLhumKtOmVvOmWrOmWq+mWrumWsOmapOmaoumbk+mchemciOmcgumdmumeiumejumeiOmfkOmfj+mgnumgnemgpumgqemgqOmgoOmgm+mgp+misumkiOmjuumkkemklOmklumkl+mklemnnOmnjemnj+mnk+mnlOmnjumniemnlumnmOmni+mnl+mnjOmqs+mrrOmrq+mrs+mrsumrsemthumtg+mtp+mttOmtsemtpumttumttemtsOmtqOmtpOmtrOmzvOmzuumzvemzv+mzt+m0h+m0gOmzuemzu+m0iOm0hem0hOm6g+m7k+m8j+m8kOWEnOWEk+WEl+WEmuWEkeWHnuWMtOWPoeWZsOWZoOWZrlwiXG5cdF0sXG5cdFtcblx0XHRcImU5NDBcIixcblx0XHRcIuWZs+WZpuWZo+WZreWZsuWZnuWZt+WcnOWcm+WjiOWiveWjieWiv+WiuuWjguWivOWjhuWsl+WsmeWsm+WsoeWslOWsk+WskOWsluWsqOWsmuWsoOWsnuWvr+W2rOW2seW2qeW2p+W2teW2sOW2ruW2quW2qOW2suW2reW2r+W2tOW5p+W5qOW5puW5r+W7qeW7p+W7puW7qOW7peW9i+W+vOaGneaGqOaGluaHheaGtOaHhuaHgeaHjOaGulwiXG5cdF0sXG5cdFtcblx0XHRcImU5YTFcIixcblx0XHRcIuaGv+aGuOaGjOaTl+aTluaTkOaTj+aTieaSveaSieaTg+aTm+aTs+aTmeaUs+aVv+aVvOaWouabiOaavuabgOabiuabi+abj+aaveaau+aauuabjOaco+aotOappuapieapp+aosuapqOaovuapneapreaptuapm+apkeaoqOapmuaou+aov+apgeapquappOapkOapj+aplOapr+apqeapoOaovOapnuapluapleapjeapjuaphuatleatlOatluaup+auquauq+aviOavh+awhOawg+awhua+rea/i+a+o+a/h+a+vOa/jua/iOa9nua/hOa+vea+nua/iua+qOeAhOa+pea+rua+uua+rOa+qua/j+a+v+a+uFwiXG5cdF0sXG5cdFtcblx0XHRcImVhNDBcIixcblx0XHRcIua+oua/iea+q+a/jea+r+a+sua+sOeHheeHgueGv+eGuOeHlueHgOeHgeeHi+eHlOeHiueHh+eHj+eGveeHmOeGvOeHhueHmueHm+eKneeKnueNqeeNpueNp+eNrOeNpeeNq+eNqueRv+eSmueSoOeSlOeSkueSleeSoeeUi+eWgOeYr+eYreeYseeYveeYs+eYvOeYteeYsueYsOeau+ebpueemueeneeeoeeenOeem+eeoueeo+eeleeemVwiXG5cdF0sXG5cdFtcblx0XHRcImVhYTFcIixcblx0XHRcIueel+ejneejqeejpeejquejnuejo+ejm+ejoeejouejreejn+ejoOempOephOepiOeph+eqtuequOeqteeqseeqt+evnuevo+evp+evneevleevpeevmuevqOevueevlOevquevouevnOevq+evmOevn+ezkuezlOezl+ezkOezkee4kue4oee4l+e4jOe4n+e4oOe4k+e4jue4nOe4lee4mue4oue4i+e4j+e4lue4jee4lOe4pee4pOe9g+e9u+e9vOe9uue+see/r+iAquiAqeiBrOiGseiGpuiGruiGueiGteiGq+iGsOiGrOiGtOiGsuiGt+iGp+iHsuiJleiJluiJl+iVluiVheiVq+iVjeiVk+iVoeiVmFwiXG5cdF0sXG5cdFtcblx0XHRcImViNDBcIixcblx0XHRcIuiVgOiVhuiVpOiVgeiVouiVhOiVkeiVh+iVo+iUvuiVm+iVseiVjuiVruiVteiVleiVp+iVoOiWjOiVpuiVneiVlOiVpeiVrOiZo+iZpeiZpOiem+iej+iel+iek+iekuieiOiegeieluiemOidueieh+ieo+ieheiekOiekeieneiehOielOienOiemuieieiknuikpuiksOikreikruikp+ikseikouikqeiko+ikr+ikrOikn+inseiroFwiXG5cdF0sXG5cdFtcblx0XHRcImViYTFcIixcblx0XHRcIuirouirsuirtOirteirneislOirpOirn+irsOiriOirnuiroeirqOirv+irr+iru+iykeiykuiykOizteizruizseizsOizs+i1rOi1rui2pei2p+i4s+i4vui4uOi5gOi5hei4tui4vOi4vei5gei4sOi4v+i6vei8tui8rui8tei8sui8uei8t+i8tOmBtumBuemBu+mChumDuumEs+mEtemEtumGk+mGkOmGkemGjemGj+mMp+mMnumMiOmMn+mMhumMj+mNuumMuOmMvOmMm+mMo+mMkumMgemNhumMremMjumMjemLi+mMnemLuumMpemMk+mLuemLt+mMtOmMgumMpOmLv+mMqemMuemMtemMqumMlOmMjFwiXG5cdF0sXG5cdFtcblx0XHRcImVjNDBcIixcblx0XHRcIumMi+mLvumMiemMgOmLu+mMlumWvOmXjemWvumWuemWuumWtumWv+mWtemWvemaqemblOmci+mckumckOmememel+melOmfsOmfuOmgtemgr+mgsumkpOmkn+mkp+mkqemmnumnrumnrOmnpemnpOmnsOmno+mnqumnqemnp+mquemqv+mqtOmqu+mrtumruumruemrt+mss+mugOmuhemuh+mtvOmtvumtu+mugumuk+mukumukOmtuumulVwiXG5cdF0sXG5cdFtcblx0XHRcImVjYTFcIixcblx0XHRcIumtvemuiOm0pem0l+m0oOm0num0lOm0qem0nem0mOm0oum0kOm0mem0n+m6iOm6hum6h+m6rum6rem7lem7lum7uum8kum8veWEpuWEpeWEouWEpOWEoOWEqeWLtOWak+WajOWajeWahuWahOWag+WZvuWaguWZv+WageWjluWjlOWjj+WjkuWsreWspeWssuWso+WsrOWsp+WspuWsr+WsruWtu+WvseWvsuW2t+W5rOW5quW+vuW+u+aHg+aGteaGvOaHp+aHoOaHpeaHpOaHqOaHnuaTr+aTqeaTo+aTq+aTpOaTqOaWgeaWgOaWtuaXmuabkuaqjeaqluaqgeaqpeaqieaqn+aqm+aqoeaqnuaqh+aqk+aqjlwiXG5cdF0sXG5cdFtcblx0XHRcImVkNDBcIixcblx0XHRcIuaqleaqg+aqqOaqpOaqkeapv+aqpuaqmuaqheaqjOaqkuatm+aureawiea/jOa+qea/tOa/lOa/o+a/nOa/rea/p+a/pua/nua/sua/nea/oua/qOeHoeeHseeHqOeHsueHpOeHsOeHoueNs+eNrueNr+eSl+eSsueSq+eSkOeSqueSreeSseeSpeeSr+eUkOeUkeeUkueUj+eWhOeZg+eZiOeZieeZh+eapOebqeeeteeeq+eesueet+eetlwiXG5cdF0sXG5cdFtcblx0XHRcImVkYTFcIixcblx0XHRcIueetOeeseeeqOefsOejs+ejveekgueju+ejvOejsuekheejueejvuekhOemq+emqOepnOepm+epluepmOeplOepmueqvuergOergeewheewj+evsuewgOevv+evu+ewjuevtOewi+evs+ewguewieewg+ewgeevuOevveewhuevsOevseewkOewiuezqOe4ree4vOe5gue4s+mhiOe4uOe4que5iee5gOe5h+e4qee5jOe4sOe4u+e4tue5hOe4uue9hee9v+e9vue9vee/tOe/suiArOiGu+iHhOiHjOiHiuiHheiHh+iGvOiHqeiJm+iJmuiJnOiWg+iWgOiWj+iWp+iWleiWoOiWi+iWo+iVu+iWpOiWmuiWnlwiXG5cdF0sXG5cdFtcblx0XHRcImVlNDBcIixcblx0XHRcIuiVt+iVvOiWieiWoeiVuuiVuOiVl+iWjuiWluiWhuiWjeiWmeiWneiWgeiWouiWguiWiOiWheiVueiVtuiWmOiWkOiWn+iZqOievuiequiereifheiesOierOieueieteievOieruifieifg+ifguifjOiet+ier+ifhOifiuietOietuiev+ieuOieveifnuiesuikteiks+ikvOikvuilgeilkuikt+ilguimreimr+imruinsuins+isnlwiXG5cdF0sXG5cdFtcblx0XHRcImVlYTFcIixcblx0XHRcIuismOisluiskeisheisi+isouisj+iskuisleish+isjeisiOishuisnOisk+ismuixj+ixsOixsuixseixr+iyleiylOizuei1r+i5jui5jei5k+i5kOi5jOi5h+i9g+i9gOmChemBvumEuOmGmumGoumGm+mGmemGn+mGoemGnemGoOmOoemOg+mOr+mNpOmNlumNh+mNvOmNmOmNnOmNtumNiemNkOmNkemNoOmNremOj+mNjOmNqumNuemNl+mNlemNkumNj+mNsemNt+mNu+mNoemNnumNo+mNp+mOgOmNjumNmemXh+mXgOmXiemXg+mXhemWt+marumasOmarOmcoOmcn+mcmOmcnemcmememumeoemenFwiXG5cdF0sXG5cdFtcblx0XHRcImVmNDBcIixcblx0XHRcIumenumenemflemflOmfsemhgemhhOmhiumhiemhhemhg+mkpemkq+mkrOmkqumks+mksumkr+mkremksemksOmmmOmmo+mmoemogumnuumntOmnt+mnuemnuOmntumnu+mnvemnvumnvOmog+mqvumrvumrvemsgemrvOmtiOmumumuqOmunumum+mupumuoemupemupOmuhumuoumuoOmur+m0s+m1gem1p+m0tum0rum0r+m0sem0uOm0sFwiXG5cdF0sXG5cdFtcblx0XHRcImVmYTFcIixcblx0XHRcIum1hem1gum1g+m0vum0t+m1gOm0vee/tem0rem6ium6iem6jem6sOm7iOm7mum7u+m7v+m8pOm8o+m8oum9lOm+oOWEseWEreWEruWamOWanOWal+WamuWaneWameWlsOWsvOWxqeWxquW3gOW5reW5ruaHmOaHn+aHreaHruaHseaHquaHsOaHq+aHluaHqeaTv+aUhOaTveaTuOaUgeaUg+aTvOaWlOaXm+abmuabm+abmOarheaqueaqvearoearhuaquuaqtuaqt+arh+aqtOaqreatnuavieawi+eAh+eAjOeAjeeAgeeAheeAlOeAjua/v+eAgOa/u+eApua/vOa/t+eAiueIgeeHv+eHueeIg+eHveeNtlwiXG5cdF0sXG5cdFtcblx0XHRcImYwNDBcIixcblx0XHRcIueSuOeTgOeSteeTgeeSvueStueSu+eTgueUlOeUk+eZnOeZpOeZmeeZkOeZk+eZl+eZmueapueaveebrOefgueeuuejv+ekjOekk+eklOekieekkOekkuekkeemreemrOepn+ewnOewqeewmeewoOewn+ewreewneewpuewqOewouewpeewsOe5nOe5kOe5lue5o+e5mOe5oue5n+e5kee5oOe5l+e5k+e+tee+s+e/t+e/uOiBteiHkeiHklwiXG5cdF0sXG5cdFtcblx0XHRcImYwYTFcIixcblx0XHRcIuiHkOiJn+iJnuiWtOiXhuiXgOiXg+iXguiWs+iWteiWveiXh+iXhOiWv+iXi+iXjuiXiOiXheiWseiWtuiXkuiYpOiWuOiWt+iWvuiZqeifp+ifpuifouifm+ifq+ifquifpeifn+ifs+ifpOiflOifnOifk+ifreifmOifo+iepOifl+ifmeiggeiftOifqOifneilk+ili+ilj+iljOilhuilkOilkeilieisquisp+iso+iss+issOisteith+isr+isvOisvuisseispeist+ispuistuisruispOisu+isveisuuixguixteiymeiymOiyl+izvui0hOi0gui0gOi5nOi5oui5oOi5l+i5lui5nui5pei5p1wiXG5cdF0sXG5cdFtcblx0XHRcImYxNDBcIixcblx0XHRcIui5m+i5mui5oei5nei5qei5lOi9hui9h+i9iOi9i+mEqOmEuumEu+mEvumGqOmGpemGp+mGr+mGqumOtemOjOmOkumOt+mOm+mOnemOiemOp+mOjumOqumOnumOpumOlemOiOmOmemOn+mOjemOsemOkemOsumOpOmOqOmOtOmOo+mOpemXkumXk+mXkemas+mbl+mbmuW3gumbn+mbmOmbnemco+mcoumcpemerOmerumeqOmeq+mepOmeqlwiXG5cdF0sXG5cdFtcblx0XHRcImYxYTFcIixcblx0XHRcIumeoumepemfl+mfmemflumfmOmfuumhkOmhkemhkumiuOmlgemkvOmkuumoj+moi+moiemojemohOmokemoiumohemoh+mohumrgOmrnOmsiOmshOmshemsqemstemtiumtjOmti+mvh+mvhumvg+muv+mvgemutemuuOmvk+mutumvhOmuuemuvem1nOm1k+m1j+m1ium1m+m1i+m1mem1lum1jOm1l+m1kum1lOm1n+m1mOm1mum6jum6jOm7n+m8gem8gOm8lum8pem8q+m8qum8qem8qOm9jOm9leWEtOWEteWKluWLt+WOtOWaq+WareWapuWap+WaquWarOWjmuWjneWjm+WkkuWsveWsvuWsv+W3g+W5sFwiXG5cdF0sXG5cdFtcblx0XHRcImYyNDBcIixcblx0XHRcIuW+v+aHu+aUh+aUkOaUjeaUieaUjOaUjuaWhOaXnuaXneabnuarp+aroOarjOarkearmeari+arn+arnOarkOarq+arj+arjearnuatoOausOawjOeAmeeAp+eAoOeAlueAq+eAoeeAoueAo+eAqeeAl+eApOeAnOeAqueIjOeIiueIh+eIgueIheeKpeeKpueKpOeKo+eKoeeTi+eTheeSt+eTg+eUlueZoOefieefiuefhOefseekneekm1wiXG5cdF0sXG5cdFtcblx0XHRcImYyYTFcIixcblx0XHRcIuekoeeknOekl+eknuemsOepp+epqOews+ewvOewueewrOewu+ezrOezque5tue5tee5uOe5sOe5t+e5r+e5uue5sue5tOe5qOe9i+e9iue+g+e+hue+t+e/vee/vuiBuOiHl+iHleiJpOiJoeiJo+iXq+iXseiXreiXmeiXoeiXqOiXmuiXl+iXrOiXsuiXuOiXmOiXn+iXo+iXnOiXkeiXsOiXpuiXr+iXnuiXouiggOifuuigg+iftuift+igieigjOigi+ighuifvOigiOifv+igiuigguilouilmuilm+ill+iloeilnOilmOilneilmeimiOimt+imtuintuitkOitiOitiuitgOitk+itluitlOiti+itlVwiXG5cdF0sXG5cdFtcblx0XHRcImYzNDBcIixcblx0XHRcIuitkeitguitkuitl+ixg+ixt+ixtuiymui0hui0h+i0iei2rOi2qui2rei2q+i5rei5uOi5s+i5qui5r+i5u+i7gui9kui9kei9j+i9kOi9k+i+tOmFgOmEv+mGsOmGremPnumPh+mPj+mPgumPmumPkOmPuemPrOmPjOmPmemOqemPpumPiumPlOmPrumPo+mPlemPhOmPjumPgOmPkumPp+mVvemXmumXm+mboemcqemcq+mcrOmcqOmcplwiXG5cdF0sXG5cdFtcblx0XHRcImYzYTFcIixcblx0XHRcIumes+met+metumfnemfnumfn+mhnOmhmemhnemhl+miv+mivemiu+mivumliOmlh+mlg+mmpummp+momumolemopemonemopOmom+mooumooOmop+moo+monumonOmolOmrgumsi+msiumsjumsjOmst+mvqumvq+mvoOmvnumvpOmvpumvoumvsOmvlOmvl+mvrOmvnOmvmemvpemvlemvoemvmum1t+m2gem2ium2hOm2iOm1sem2gOm1uOm2hum2i+m2jOm1vem1q+m1tOm1tem1sOm1qem2hem1s+m1u+m2gum1r+m1uem1v+m2h+m1qOm6lOm6kem7gOm7vOm8rem9gOm9gem9jem9lum9l+m9mOWMt+WaslwiXG5cdF0sXG5cdFtcblx0XHRcImY0NDBcIixcblx0XHRcIuWateWas+Wjo+WtheW3huW3h+W7ruW7r+W/gOW/geaHueaUl+aUluaUleaUk+aXn+abqOabo+abpOars+arsOarquarqOaruearsearruarr+eAvOeAteeAr+eAt+eAtOeAseeBgueAuOeAv+eAuueAueeBgOeAu+eAs+eBgeeIk+eIlOeKqOeNveeNvOeSuueaq+eaqueavuebreefjOefjuefj+efjeefsuekpeeko+ekp+ekqOekpOekqVwiXG5cdF0sXG5cdFtcblx0XHRcImY0YTFcIixcblx0XHRcIuemsueprueprOepreert+exieexiOexiuexh+exheezrue5u+e5vue6gee6gOe+uue/v+iBueiHm+iHmeiIi+iJqOiJqeiYouiXv+iYgeiXvuiYm+iYgOiXtuiYhOiYieiYheiYjOiXveigmeigkOigkeigl+igk+igluilo+ilpuimueint+itoOitquitneitqOito+itpeitp+itrei2rui6hui6iOi6hOi9mei9lui9l+i9lei9mOi9mumCjemFg+mFgemGt+mGtemGsumGs+mQi+mQk+mPu+mQoOmQj+mQlOmPvumQlemQkOmQqOmQmemQjemPtemQgOmPt+mQh+mQjumQlumQkumPuumQiemPuOmQiumPv1wiXG5cdF0sXG5cdFtcblx0XHRcImY1NDBcIixcblx0XHRcIumPvOmQjOmPtumQkemQhumXnumXoOmXn+mcrumcr+meuemeu+mfvemfvumhoOmhoumho+mhn+mjgemjgumlkOmljumlmemljOmli+mlk+mosumotOmosemorOmoqumotumoqemorumouOmoremrh+mriumrhumskOmskumskemwi+mwiOmvt+mwhemwkumvuOmxgOmwh+mwjumwhumwl+mwlOmwiem2n+m2mem2pOm2nem2kum2mOm2kOm2m1wiXG5cdF0sXG5cdFtcblx0XHRcImY1YTFcIixcblx0XHRcIum2oOm2lOm2nOm2qum2l+m2oem2mum2oum2qOm2num2o+m2v+m2qem2lum2pum2p+m6mem6m+m6mum7pem7pOm7p+m7pum8sOm8rum9m+m9oOm9num9nem9mem+keWEuuWEueWKmOWKl+Wbg+WaveWavuWtiOWth+W3i+W3j+W7seaHveaUm+asguarvOasg+aruOasgOeBg+eBhOeBiueBiOeBieeBheeBhueIneeImueImeeNvueUl+eZquefkOekreekseekr+exlOexk+ezsue6iue6h+e6iOe6i+e6hue6jee9jee+u+iAsOiHneiYmOiYquiYpuiYn+iYo+iYnOiYmeiYp+iYruiYoeiYoOiYqeiYnuiYpVwiXG5cdF0sXG5cdFtcblx0XHRcImY2NDBcIixcblx0XHRcIuigqeigneigm+igoOigpOignOigq+ihiuilreilqeilruilq+inuuitueituOitheituuitu+i0kOi0lOi2r+i6jui6jOi9nui9m+i9nemFhumFhOmFhemGuemQv+mQu+mQtumQqemQvemQvOmQsOmQuemQqumQt+mQrOmRgOmQsemXpemXpOmXo+mctemcuumev+mfoemhpOmjiemjhumjgOmlmOmllumouemovemphumphOmpgumpgemoulwiXG5cdF0sXG5cdFtcblx0XHRcImY2YTFcIixcblx0XHRcIumov+mrjemslemsl+msmOmslumsuumtkumwq+mwnemwnOmwrOmwo+mwqOmwqemwpOmwoem2t+m2tum2vOm3gem3h+m3ium3j+m2vum3hem3g+m2u+m2tem3jum2uem2uum2rOm3iOm2sem2rem3jOm2s+m3jem2sum5uum6nOm7q+m7rum7rem8m+m8mOm8mum8sem9jum9pem9pOm+kuS6ueWbhuWbheWbi+WlseWti+WtjOW3leW3keW7suaUoeaUoOaUpuaUouasi+asiOasieawjeeBleeBlueBl+eBkueInueIn+eKqeeNv+eTmOeTleeTmeeTl+eZreeareekteemtOepsOepseexl+exnOexmeexm+exmlwiXG5cdF0sXG5cdFtcblx0XHRcImY3NDBcIixcblx0XHRcIueztOezsee6kee9j+e+h+iHnuiJq+iYtOiYteiYs+iYrOiYsuiYtuigrOigqOigpuigquigpeilseimv+imvuinu+itvuiuhOiuguiuhuiuheitv+i0lei6lei6lOi6mui6kui6kOi6lui6l+i9oOi9oumFh+mRjOmRkOmRiumRi+mRj+mRh+mRhemRiOmRiemRhumcv+mfo+mhqumhqemji+mllOmlm+mpjumpk+mplOmpjOmpj+mpiOmpilwiXG5cdF0sXG5cdFtcblx0XHRcImY3YTFcIixcblx0XHRcIumpiempkumpkOmrkOmsmemsq+msu+mtlumtlemxhumxiOmwv+mxhOmwuemws+mxgemwvOmwt+mwtOmwsumwvemwtum3m+m3kum3num3mum3i+m3kOm3nOm3kem3n+m3qem3mem3mOm3lum3tem3lem3nem6tum7sOm8tem8s+m8sum9gum9q+m+lem+ouWEveWKmeWjqOWjp+WlsuWtjeW3mOigr+W9j+aIgeaIg+aIhOaUqeaUpeaWluabq+askeaskuasj+aviueBm+eBmueIoueOgueOgeeOg+eZsOeflOexp+expue6leiJrOiYuuiZgOiYueiYvOiYseiYu+iYvuigsOigsuigruigs+iltuiltOils+invlwiXG5cdF0sXG5cdFtcblx0XHRcImY4NDBcIixcblx0XHRcIuiujOiujuiui+iuiOixhei0mei6mOi9pOi9o+mGvOmRoumRlemRnemRl+mRnumfhOmfhemggOmplumpmemsnumsn+msoOmxkumxmOmxkOmxiumxjemxi+mxlemxmemxjOmxjum3u+m3t+m3r+m3o+m3q+m3uOm3pOm3tum3oem3rum3pum3sum3sOm3oum3rOm3tOm3s+m3qOm3rem7gum7kOm7sum7s+m8hum8nOm8uOm8t+m8tum9g+m9j1wiXG5cdF0sXG5cdFtcblx0XHRcImY4YTFcIixcblx0XHRcIum9sem9sOm9rum9r+Wbk+WbjeWtjuWxreaUreabreabruask+eBn+eBoeeBneeBoOeIo+eTm+eTpeefleekuOemt+emtuexque6l+e+ieiJreiZg+iguOigt+igteihi+iulOiulei6nui6n+i6oOi6nemGvumGvemHgumRq+mRqOmRqembpemdhumdg+mdh+mfh+mfpempnumrlemtmemxo+mxp+mxpumxoumxnumxoOm4gum3vum4h+m4g+m4hum4hem4gOm4gem4iem3v+m3vem4hOm6oOm8num9hum9tOm9tem9tuWblOaUruaWuOasmOasmeasl+asmueBoueIpueKquefmOefmeekueexqeexq+eztue6mlwiXG5cdF0sXG5cdFtcblx0XHRcImY5NDBcIixcblx0XHRcIue6mOe6m+e6meiHoOiHoeiZhuiZh+iZiOilueiluuilvOilu+inv+iumOiumei6pei6pOi6o+mRrumRremRr+mRsemRs+mdiemhsumln+mxqOmxrumxrem4i+m4jem4kOm4j+m4kum4kem6oem7tem8iem9h+m9uOm9u+m9uum9ueWcnueBpuexr+igvOi2sui6pumHg+mRtOmRuOmRtumRtempoOmxtOmxs+mxsemxtem4lOm4k+m7tum8ilwiXG5cdF0sXG5cdFtcblx0XHRcImY5YTFcIixcblx0XHRcIum+pOeBqOeBpeezt+iZquigvuigveigv+iunuiynOi6qei7iemdi+mhs+mhtOmjjOmloemmq+mppOmppumpp+mspOm4lem4l+m9iOaIh+asnueIp+iZjOi6qOmSgumSgOmSgempqempqOmsrum4meeIqeiZi+iun+mSg+mxuem6t+eZtempq+mxuum4neeBqeeBqum6pOm9vum9iem+mOeigemKueijj+Wiu+aBkueyp+WruuKVlOKVpuKVl+KVoOKVrOKVo+KVmuKVqeKVneKVkuKVpOKVleKVnuKVquKVoeKVmOKVp+KVm+KVk+KVpeKVluKVn+KVq+KVouKVmeKVqOKVnOKVkeKVkOKVreKVruKVsOKVr+KWk1wiXG5cdF1cbl07XG5cbnZhciBjcDk1MCQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCdkZWZhdWx0JzogY3A5NTBcbn0pO1xuXG52YXIgYmlnNUFkZGVkID0gW1xuXHRbXG5cdFx0XCI4NzQwXCIsXG5cdFx0XCLkj7DksLLkmIPklqbklbjwp4mn5LW35Jaz8KeyseSzovCns4XjrpXknLbknYTksYfksYDwpIq/8KOYl/CnjZLwprqL8KeDkuSxl/CqjZHknY/kl5rksoXwp7Gs5LSH5Kqk5Jqh8Kaso+eIpfClqZTwoamj8KO4hvCjvaHmmY3lm7tcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NzY3XCIsXG5cdFx0XCLntpXlpJ3wqK6547e06Zy08Kevr+Wvm/ChtZ7lqqTjmKXwqbqw5auR5a635bO85p2u6JaT8KmlheeRoeeSneOhtfChtZPwo5qe8KaAoeO7rFwiXG5cdF0sXG5cdFtcblx0XHRcIjg3YTFcIixcblx0XHRcIvClo57jq7Xnq7zpvpfwpIWh8KikjfCjh6rwoKqK8KOJnuSMiuiShOm+lumQr+SksOiYk+WilumdiumImOenkOeosuaZoOaoqeiineeRjOevheaegueorOWJj+mBhuOTpuePhPCltrnnk4bpv4flnrPkpK/lkYzkhLHwo5qO5aCY56my8Ketpeiuj+SarvCmuojkhoHwpbaZ566u8KKSvOm/iPCik4HwopOJ8KKTjOm/ieiUhPCjlrvkgrTpv4rkk6Hwqre/5ouB54Gu6b+LXCJcblx0XSxcblx0W1xuXHRcdFwiODg0MFwiLFxuXHRcdFwi44eAXCIsXG5cdFx0NCxcblx0XHRcIvCghIzjh4XwoIOR8KCDjeOHhuOHh/Cgg4vwob+o44eI8KCDiuOHieOHiuOHi+OHjPCghI7jh43jh47EgMOBx43DgMSSw4nEmsOIxYzDk8eRw5Lgv7/DisyE4bq+4L+/w4rMjOG7gMOKxIHDoceOw6DJkcSTw6nEm8OoxKvDrceQw6zFjcOzx5LDssWrw7rHlMO5x5bHmMeaXCJcblx0XSxcblx0W1xuXHRcdFwiODhhMVwiLFxuXHRcdFwix5zDvOC/v8OqzIThur/gv7/DqsyM4buBw6rJoeKPmuKPm1wiXG5cdF0sXG5cdFtcblx0XHRcIjg5NDBcIixcblx0XHRcIvCqjqnwoYWFXCJcblx0XSxcblx0W1xuXHRcdFwiODk0M1wiLFxuXHRcdFwi5pSKXCJcblx0XSxcblx0W1xuXHRcdFwiODk0NlwiLFxuXHRcdFwi5Li95rud6bWO6YefXCJcblx0XSxcblx0W1xuXHRcdFwiODk0Y1wiLFxuXHRcdFwi8KecteaSkeS8muS8qOS+qOWFluWFtOWGnOWHpOWKoeWKqOWMu+WNjuWPkeWPmOWbouWjsOWkhOWkh+WksuWktOWtpuWunuWun+WymuW6huaAu+aWieafvuaghOahpea1jueCvOeUtee6pOe6rOe6uue7h+e7j+e7n+e8hue8t+iJuuiLj+iNr+inhuiuvuivoui9pui9p+i9rlwiXG5cdF0sXG5cdFtcblx0XHRcIjg5YTFcIixcblx0XHRcIueQkeezvOe3jealhuerieWIp1wiXG5cdF0sXG5cdFtcblx0XHRcIjg5YWJcIixcblx0XHRcIumGjOeiuOmFnuiCvFwiXG5cdF0sXG5cdFtcblx0XHRcIjg5YjBcIixcblx0XHRcIui0i+iDtvCgp6dcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OWI1XCIsXG5cdFx0XCLogp/pu4fks43pt4npuIzksL7wqbe28KeAjum4ivCqhLPjl4FcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OWMxXCIsXG5cdFx0XCLmuproiL7nlJlcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OWM1XCIsXG5cdFx0XCLkpJHpqazpqo/pvpnnpofwqJGs8KG3ivCgl5Dwoqum5Lik5LqB5LqA5LqH5Lq/5Lur5Ly345GM5L6947mI5YCD5YKI45G945KT45Kl5YaG5aSF5Yeb5Ye85YiF5LqJ5Ym55YqQ5Yyn45eH5Y6p45WR5Y6w45WT5Y+C5ZCj45Wt45Wy45qB5ZKT5ZKj5ZK05ZK55ZOQ5ZOv5ZSY5ZSj5ZSo45aY5ZS/45al45a/5ZeX45eFXCJcblx0XSxcblx0W1xuXHRcdFwiOGE0MFwiLFxuXHRcdFwi8Ke2hOWUpVwiXG5cdF0sXG5cdFtcblx0XHRcIjhhNDNcIixcblx0XHRcIvCgsYLwoLSV8KWEq+WWkPCis4bjp6zwoI2B6LmG8KS2uPCpk6XkgZPwqIK+55268KKwuOOotOSflfCohZ3wpqey8KS3quaTnfCgtbzwoL608KCzlfChg7Tmko3oub7woLqW8KCwi/CgvaTworKp8KiJlvCkk5NcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YTY0XCIsXG5cdFx0XCLwoLWG8KmpjfCog6nkn7TwpLqn8KKzgumqsuOpp/Cpl7Tjv63jlIbwpYuH8KmflPCno4jworWE6bWu6aCVXCJcblx0XSxcblx0W1xuXHRcdFwiOGE3NlwiLFxuXHRcdFwi5I+Z8KaCpeaStOWTo/CitYzwoq+K8KGBt+Onu/Chga9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4YWExXCIsXG5cdFx0XCLwppua8KaclvCnpqDmk6rwpYGS8KCxg+i5qPCihqHwqK2M8KCcsVwiXG5cdF0sXG5cdFtcblx0XHRcIjhhYWNcIixcblx0XHRcIuSgi/Cghqnjv7rlobPworaNXCJcblx0XSxcblx0W1xuXHRcdFwiOGFiMlwiLFxuXHRcdFwi8KSXiPCgk7zwpoKX8KC9jPCgtpbllbnkgrvkjrpcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YWJiXCIsXG5cdFx0XCLkqrTwoqmm8KGCneiGqumjtfCgtpzmjbnjp77wop216LeA5Zqh5pG847mDXCJcblx0XSxcblx0W1xuXHRcdFwiOGFjOVwiLFxuXHRcdFwi8KqYgfCguInwoquP8KKziVwiXG5cdF0sXG5cdFtcblx0XHRcIjhhY2VcIixcblx0XHRcIvChg4jwo6eC46aS46iG8KiKm+OVuPCluYnwooOH5ZmS8KC8sfCisrLwqZyg45K85rC98KS4u1wiXG5cdF0sXG5cdFtcblx0XHRcIjhhZGZcIixcblx0XHRcIvCnlbTworqL8KKIiPCqmZvwqLON8KC5uvCgsLTwpqCc576T8KGDj/CioIPwoqS545e78KWHo/CguozwoL6N8KC6quO+k/CgvLDwoLWH8KGFj/CguYxcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YWY2XCIsXG5cdFx0XCLwoLqr8KCuqfCgtYjwoYOA8KGEveO/ufCimpbmkLLwoL6tXCJcblx0XSxcblx0W1xuXHRcdFwiOGI0MFwiLFxuXHRcdFwi8KOPtPCnmLnwoq+O8KC1vvCgtb/worGR8KKxleOomPCgupjwoYOH8KC8rvCqmLLwpq2Q8KizkvCotpnwqLOK6Zaq5ZOM6IuE5Za5XCJcblx0XSxcblx0W1xuXHRcdFwiOGI1NVwiLFxuXHRcdFwi8Km7g+mwpumqtvCnnZ7woreu54WA6IWt6IOs5bCc8KaVsuiEtOOel+WNn/Cogr3phrbwoLu68KC4j/CgubfwoLu745ed8KS3q+OYifCgs5blmq/wop618KGDifCguJDwoLm48KGBuPChhYjwqIiH8KGRlfCgubnwpLmQ8KK2pOWplPChgJ3woYCe8KGDtfChg7blnpzwoLiRXCJcblx0XSxcblx0W1xuXHRcdFwiOGJhMVwiLFxuXHRcdFwi8KealPCoi43woL618KC5u/Clhb7jnIPwoL628KGGgPCli5jwqoq98KSnmvChoLrwpIW38KiJvOWimeWJqOOYmvClnL3nrrLlrajkoIDkrKzpvKfkp6fpsJ/pro3wpa208KOEveWXu+OXsuWaieS4qOWkgvChr4Hwr6G46Z2R8KCChuS5m+S6u+OUvuWwo+W9keW/hOOjuuaJjOaUteatuuawteawuueBrOeIq+S4rOeKrfCko6nnvZLnpLvns7nnvZPwpomq45OBXCJcblx0XSxcblx0W1xuXHRcdFwiOGJkZVwiLFxuXHRcdFwi8KaNi+iAguiCgPCmmJLwpqWR5Y2d6KGk6KeB8KeisuiuoOi0nemShemVuOmVv+mXqPCouI/pn6bpobXpo47po57ppaPwqaCQ6bG86bif6buE5q2v76SH5Li38KCCh+mYneaIt+mSolwiXG5cdF0sXG5cdFtcblx0XHRcIjhjNDBcIixcblx0XHRcIuWAu+a3vvCpsbPpvqbjt4nooo/wpIWO54G35bO15Kyg8KWHjeOVmfCltLDmhKLwqKiy6L6n6Ye254aR5pyZ54668KOKgfCqhIfjsovwoaaA5KyQ56Ok55CC5Yau8Kicj+SAieapo/CqirrkiKPomI/woKmv56iq8Kmlh/Coq6rpnZXngY3ljKTwooG+6Y+055uZ8Kino+m+p+efneS6o+S/sOWCvOS4r+S8l+m+qOWQtOe2i+WikuWjkPChtrblupLlupnlv4LwopyS5paLXCJcblx0XSxcblx0W1xuXHRcdFwiOGNhMVwiLFxuXHRcdFwi8KOPueakmeapg/CjsaPms79cIlxuXHRdLFxuXHRbXG5cdFx0XCI4Y2E3XCIsXG5cdFx0XCLniIDwpJSF546M47ub8KSok+WsleeSueiug/ClsqTwpZqV56qT56+s57OD57ms6Iu46JaX6b6p6KKQ6b6q6Lq56b6r6L+P6JWf6aeg6Yih6b6s8Ki2ufChkL/kgbHkiqLlqJpcIlxuXHRdLFxuXHRbXG5cdFx0XCI4Y2M5XCIsXG5cdFx0XCLpoajmnavkibblnL1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4Y2NlXCIsXG5cdFx0XCLol5bwpKW76Iq/8KeEjeSygfCmtbTltbvwpqyV8Ka+vum+rem+ruWulum+r+abp+e5m+a5l+eniuO2iOSTg/CjiZbwop6W5I6a5JS2XCJcblx0XSxcblx0W1xuXHRcdFwiOGNlNlwiLFxuXHRcdFwi5bOV8KOsmuirueWxuOO0kvCjlZHltbjpvrLnhZfklZjwpIOs8KG4o+Sxt+OluOORivCghqTwprGB6KuM5L608KCIueWmv+iFrOmhlvCpo7rlvLtcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZDQwXCIsXG5cdFx0XCLwoK6fXCJcblx0XSxcblx0W1xuXHRcdFwiOGQ0MlwiLFxuXHRcdFwi8KKHgfCopa3khILkmrvwqYG547yH6b6z8KqGteSDuOOfluSbt/CmsYbkhbzwqJqy8KePv+SVreOjlPClkprklaHklJvktonksbvktbbkl6rjv4jwpKyP45mh5JOe5JK95Iet5bS+5bWI5bWW47e846CP5bak5ba546Cg46C45bmC5bq95byl5b6D46SI46SU46S/46WN5oOX5oS95bOl46aJ5oa35oa55oeP46a45ois5oqQ5oul5oyY46e45ZqxXCJcblx0XSxcblx0W1xuXHRcdFwiOGRhMVwiLFxuXHRcdFwi46iD5o+i5o+75pCH5pGa46mL5pOA5bSV5Zih6b6f46qX5paG46q95pe/5pmT46uy5pqS46yi5pyW462C5p6k5qCA462Y5qGK5qKE462y462x46275qSJ5qWD54mc5qWk5qaf5qaF46685qeW46+d5qml5qm05qmx5qqC46+s5qqZ46+y5qqr5qq15quU5qu25q6B5q+B5q+q5rG15rKq47OL5rSC5rSG5rSm5raB47Ov5rak5rax5riV5riY5rip5rqG8KingOa6u+a7oua7mum9v+a7qOa7qea8pOa8tOO1hvCjvYHmvoHmvr7jtarjtbXnhrflspnjtorngKzjtpHngZDngZTnga/ngb/ngonwoIyl5I+B45ex8KC7mFwiXG5cdF0sXG5cdFtcblx0XHRcIjhlNDBcIixcblx0XHRcIvCju5flnr7wpruT54S+8KWfoOOZjuamovCor6nlrbTnqYnwpaOh8KmTmeeppeepvfClpqznqrvnqrDnq4Lnq4Pnh5HwppKN5IeK56ua56ud56uq5Iev5ZKy8KWwgeesi+etleesqfCljI7wpbO+566i562v6I6c8KWutPCmsb/nr5DokKHnrpLnrrjwpbSg47at8KWxpeiSkuevuuewhuewtfCls4HnsYTnsoPwpKKC57Km5pm98KSVuOezieezh+ezpuextOezs+ezteezjlwiXG5cdF0sXG5cdFtcblx0XHRcIjhlYTFcIixcblx0XHRcIue5p+SUnfCmuYTntZ3wpruW55KN57aJ57ar54S157az57eS8KSBl/CmgKnnt6TjtJPnt7XwoZ+557el8KiNree4nfCmhKHwpoWa57mu57qS5Iyr6ZGs57in572A572B572H56S28KaLkOmnoee+l/CmjZHnvqPwoZmh8KCBqOSVnPCjnabklIPwqIy657+68KaSieiAheiAiOiAneiAqOiAr/CqgofwprOD6IC76IC86IGh8KKclOSmifCmmKbwo7ej8KabqOacpeiCp/CoqYjohIfohJrlorDwopu25rG/8KaSmPCkvrjmk6fwoZKK6IiY8KGhnuapk/CkqaXwpKqV5JG66Iip8KCsjfCmqZLwo7W+5L+58KGTveiTouiNovCmrIrwpKan8KOUsPChnbPwo7e46Iqq5qSb8K+mlOSHm1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmNDBcIixcblx0XHRcIuiVi+iLkOiMmvCguJbwoZ6045uB8KOFvfCjlZroibvoi6LojJjwo7qL8Ka2o/CmrIXwpq6X8KOXjuO2v+iMneWXrOiOheSUi/CmtqXojqzoj4Hoj5Pjkb7wpruU5qmX6JWa45KW8Ka5gvCiu6/okZjwpa+k6JGx47eT5JOk5qqn6JGK8KOyteelmOiSqPCmrpbwprm38Ka5g+iTnuiQj+iOkeSSoOiSk+iTpPClspHkiYDwpbOA5JWD6JS05auy8Ka6meSUp+iVs+SUluaev+iYllwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTFcIixcblx0XHRcIvComKXwqJi76JeB8KeCiOiYgvChloLwp4ON8K+msuSVquiYqOOZiPChoqLlj7fwp46a6Jm+6J2x8KqDuOifrvCisKfonrHon5rooI/lmaHomazmoZbkmI/ooYXooYbwp5eg8KO2ufCnl6TooZ7oopzkmZvoorToorXmj4Hoo4Xnnbfwp5yP6KaH6KaK6Kam6Kap6Kan6Ka88Kiopeinp/CnpKTwp6q96Kqc556T6Ye+6KqQ8KepmeerqfCnrLrwo76P5JyT8KesuOeFvOisjOisn/ClkLDwpZWl6Ky/6K2M6K2N6Kqp8KSpuuiukOium+iqr/Chm5/kmJXooY/ospvwp7WU8Ke2j/Cvp5TjnKXwp7WT6LOW8Ke2mPCntr3otJLotIPwoaSQ6LOb54Gc6LSR8KSzieO7kOi1t1wiXG5cdF0sXG5cdFtcblx0XHRcIjkwNDBcIixcblx0XHRcIui2qfCogILwoYCU8KSmiuOtvPCohrzwp4SM56un6Lqt6Lq26LuD6YuU6LyZ6Lyt8KiNpfCokJLovqXpjIPwqoqf8KCpkOi+s+SkqvCop57wqJS98KO2u+W7uPCjiaLov7nwqoCU8KiavPColIHwooyl46aA8Ka7l+mAt/ColLzwp6q+6YGh8KiVrPComIvpgqjwqJyT6YOE8KibpumCrumDvemFp+OrsOmGqemHhOeyrPCopLPwobqJ6YiO5rKf6YmB6Ymi8KWWuemKufCoq4bwo7Kb8KisjPCll5tcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MGExXCIsXG5cdFx0XCLwoLSx6Yys6Y2r8KirofCor6vngo/lq4PwqKui8KirpeSlpemJhPCor6zwqLC58Kivv+mNs+mRm+i6vOmWhemWpumQpumWoOa/tuSKufCimbrwqJuY8KGJvPCjuK7kp5/msJzpmbvpmpbkhazpmqPwpruV5oea6Zq256O18KiroOmaveWPjOSmofCmsrjwoIm08KaQkPCpgq/wqYOl8KSrkfChpJXwo4yK6Zyx6JmC6Zy25KiP5JS95JaF8KSrqeeBteWtgemcm+mdnPCph5XpnZflrYrwqYer6Z2f6ZCl5YOQ8KOCt/Cjgrzpnonpnp/pnrHpnr7pn4Dpn5Lpn6DwpZGs6Z+u55Cc8KmQs+mfv+mftfCpkJ3wp6W65KuR6aC06aCz6aGL6aGm46yO8KeFteO1kfCgmLDwpIWcXCJcblx0XSxcblx0W1xuXHRcdFwiOTE0MFwiLFxuXHRcdFwi8KWchumjiumit+mjiOmjh+Srv/CmtKfwoZuT5Zaw6aOh6aOm6aOs6Y246aS58KSoqeStsvCpoZfwqaSF6ae16aiM6ai76aiQ6amY8KWcpeObhPCpgrHwqa+V6aug6aui8KmshemrtOSwjumslOmsrfComIDlgLTprLTwpqao46OD8KOBvemtkOmtgPCptL7lqYXwoaGj6a6O8KSJi+mwgumvv+mwjPCpuajpt5Twqb638KqGkvCqhqvwqoOh8KqEo/Cqh5/ptb7ptoPwqoS06biO5qKIXCJcblx0XSxcblx0W1xuXHRcdFwiOTFhMVwiLFxuXHRcdFwi6beE8KKFm/CqhpPwqoig8KGku/CqiLPptLnwqoK58KqKtOm6kOm6lem6num6ouS0tOm6qum6r/CkjaTpu4HjraDjp6XjtJ3kvLLjnr7wqLCr6byC6byI5K6W6ZCk8Ka2oum8l+m8lum8ueWan+Waium9hemmuPCpgovpn7Lokb/pvaLpvannq5zpvo7niJbkrr7wpKW18KSmu+eFt/Ckp7jwpI2I8KSpkeeOnvCor5rwoaO656af8KilvvCouLbpjanpj7PwqKmE6Yus6Y6B6Y+L8KilrPCkkrnniJfju6vnnbLnqYPng5DwpJGz8KSPuOeFvvChn6/ngqPwoaK+8KOWmeO7h/ChooXwpZCv8KGfuOOcovChm7vwoaC545uh8KGdtPCho5Hwpb2L45yj8KGbgOWdm/CkqKXwoY++8KGKqFwiXG5cdF0sXG5cdFtcblx0XHRcIjkyNDBcIixcblx0XHRcIvChj4bwoZK26JSD8KOapuiUg+iRlfCkppTwp4Wl8KO4sfCllZzwo7u78KeBkuSTtPCjm67wqaad8Ka8puafueOcs+OwleO3p+WhrPChpKLmoJDkgZfwo5y/8KSDofCkgovwpISP8KawoeWTi+WanvCmmrHlmpLwoL+f8KCuqPCguI3pj4bwqKyT6Y6c5Lu45YSr46CZ8KSQtuS6vPCgkaXwoI2/5L2L5L6K8KWZkeWpqPCghqvwoI+L46aZ8KCMivCgkJTjkLXkvKnwoIuA8Ki6s/CgibXoq5rwoIiM5LqYXCJcblx0XSxcblx0W1xuXHRcdFwiOTJhMVwiLFxuXHRcdFwi5YON5YSN5L6i5LyD8KSojvCjuorkvYLlgK7lgazlgoHkv4zkv6XlgZjlg7zlhZnlhZvlhZ3lhZ7mubbwo5aV8KO4ufCjur/mtbLwoaKE8KO6ieWGqOWHg/Cgl6Dkk53woJKj8KCSkvCgkpHotbrwqKqc8KCcjuWJmeWKpPCgobPli6Hpja7kmbrnhozwpI6M8KCwoPCkpqzwoYOk5qeR8KC4neeRueO7nueSmeeQlOeRlueOmOSujvCkqrzwpIKN5Y+Q45aE54iP8KSDieWWtPCgjYXlk43woK+G5Zyd6Ymd6Zu06Y2m5Z+d5Z6N5Z2/45i+5aOL5aqZ8KiphvChm7rwoZ2v8KGckOWorOWmuOmKj+WpvuWrj+WokvClpYbwoaez8KGhofCkipXjm7XmtIXnkYPlqKHwpbqDXCJcblx0XSxcblx0W1xuXHRcdFwiOTM0MFwiLFxuXHRcdFwi5aqB8Kivl/CgkJPpj6DnkozwoYyD54SF5KWy6ZCI8Kinu+mOveOeoOWwnuWynuW5nuW5iPChppbwoaW88KOrruW7jeWtj/ChpIPwoaSE45yB8KGioOObnfChm77jm5PohKrwqKmH8KG2uvCjkbLwqKao5byM5byO8KGkp/ChnqvlqavwoZy75a2E6JiU8KeXveihoOaBvvCioaDwopir5b+b47q48KKWr/Cilr7wqYKI8Ka9s+aHgPCggL7woIGG8KKYm+aGmeaGmOaBtfCispvworSH8KSblPCphY1cIlxuXHRdLFxuXHRbXG5cdFx0XCI5M2ExXCIsXG5cdFx0XCLmkbHwpJml8KKtquOoqfCirKLwo5GQ8KmjqvCiubjmjLfwqpGb5pK25oyx5o+R8KSno/CitafmiqTworKh5pC75pWr5qWy46+08KOCjvCjiq3wpKaJ8KOKq+WUjfCji6DwoaOZ8KmQv+abjvCjionwo4az46ug5IaQ8KWWhPCorKLwpZaP8KGbvPCllZvwpZCl56Ou8KOEg/ChoKrwo4i045Gk8KOIj/CjhoLwpIuJ5pqO8Ka0pOaZq+Suk+aYsPCnobDwober5pmj8KOLkvCji6HmmJ7wpaGy46OR8KOguvCjnrzjrpnwo56i8KOPvueTkOOuluaej/CkmKrmorbmoJ7jr4Tmqr7joaPwo5+V8KSSh+aos+apkuarieashfChpJLmlJHmopjmqYzjr5fmqbrmrZfwo7+A8KOymumOoOmLsvCor6rwqKuLXCJcblx0XSxcblx0W1xuXHRcdFwiOTQ0MFwiLFxuXHRcdFwi6YqJ8KiAnvCop5zpkafmtqXmvIvwpKes5rWn8KO9v+O2j+a4hPCkgLzlqL3muIrloYfmtKTnoYLnhLvwpIya8KSJtueDseeJkOeKh+eKlPCkno/wpJyl5YW58KSqpPCgl6vnkbrwo7u48KOZn/CkqYrwpKSX8KW/oeO8huO6sfCkq5/wqLCj8KO8teaCp+O7s+eTjOeQvOmOh+eQt+SSn/Cmt6rklZHnloPjvaPwpLOZ8KS0huO9mOeVleeZs/Cql4bjrJnnkajwqKuM8KSmq/Ckpo7jq7tcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NGExXCIsXG5cdFx0XCLjt43wpKmO47u/8KSnhfCko7Pph7rlnLLpjYLwqKuj8KGhpOWDn/CliKHwpYen55248KOIsuecjuecj+edu/Ckmpfwo56B46me8KSjsOeQuOeSm+O6v/CkqrrwpKuH5IOI8KSqlvCmhq7pjIfwpZaB56Ce56KN56KI56OS54+Q56WZ8KedgfClm6PkhI7nppvokpbnpqXmqK3wo7u656i656e05IWu8KGbpuSEsumIteensfCgtYzwpKaM8KCKmfCjtrrwoZ2u45aX5ZWr45Ww45qq8KCHlPCgsI3nq6LlqZnwopu18KWqr/ClqpzlqI3woImb56Ow5aiq8KWvhuervuSHueexneexreSIkfClrrPwpbq88KW6puezjfCkp7nwoZ6w57KO57G857Ku5qqy57ec57iH57eT572O8KaJoVwiXG5cdF0sXG5cdFtcblx0XHRcIjk1NDBcIixcblx0XHRcIvCmhZzwp62I57aX8KW6guSJqvCmrbXwoKSW5p+W8KCBjvCjl4/ln4TwppCS8KaPuPCkpaLnv53nrKfwoKCs8KWrqfCltYPnrIzwpbiO6aem6JmF6amj5qic8KOQv+OnovCkp7fwppat6aif8KaWoOiSgPCnhKfwprOR5JOq6IS35JCC6IOG6ISJ6IWC8KaetOmjg/CmqYLoiaLoiaXwpqmR6JGT8Ka2p+iYkPCniJvlqobkhb/woaGA5ayr8KGioeWrpPCho5jomqDwr6a88KO2j+igrfCnkKLlqIJcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NWExXCIsXG5cdFx0XCLooa7kvYXooofoor/oo6bopaXopY3wpZqD6KWU8KeehfCnnoTwqK+18KivmfCorpzwqKe547qt6JKj5Ju15JuP45+y6Ki96Kic8KmRiOW9jemIq/CkioTml5TnhKnng4TwoaGF6bWt6LKf6LOp8Ke3nOWmmuefg+WnsOSNruOblOi4qui6p/CksInovLDovYrki7TmsZjmvrvwooyh5KKb5r255rqL8KGfmumvqeOatfCkpK/pgrvpgpfllbHkpIbphrvpkITwqKmL5IGi8KirvOmQp/CosJ3wqLC76JOl6Kir6ZaZ6Zan6ZaX6ZaW8Ki0tOeRheO7gvCko7/wpKmC8KSPquO7p/CjiKXpmo/wqLun8Ki5pvCouaXju4zwpKet8KSpuPCjv67nkJLnkavju7zpnYHwqYKwXCJcblx0XSxcblx0W1xuXHRcdFwiOTY0MFwiLFxuXHRcdFwi5qGH5Kid8KmCk/Cln5/pnZ3pjajwqKaJ8KiwpvCorK/wpo6+6Yq65ayR6K2p5KS854+58KSIm+mem+mdsemkuPCgvKblt4HwqK+F8KSqsumgn/Cpk5rpi7bwqZeX6Yel5JOA8KitkPCkqafwqK2k6aOc8KipheO8gOmIquSkpeiQlOmku+mljfCnrIbjt73pppvkra/ppqrpqZzwqK2l8KWjiOaqj+mooeWrvumor/Cpo7HkrpDwqaWI6aa85K695K6X6Y295aGy8KGMguWgovCkprhcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NmExXCIsXG5cdFx0XCLwoZOo56GE8KKcn/Cjtrjmo4Xjtb3pkZjjpKfmhZDwop6B8KKlq+aEh+mxj+mxk+mxu+mwtemwkOmtv+mvj/CpuK3prp/wqoe18KqDvum0oeSyrvCkhITpuJjksrDptIzwqoa08KqDrfCqg7PwqaSv6bal6JK98Ka4kvCmv5/wpq6C6Je85JSz8Ka2pPCmuoTwprew6JCg6Jeu8Ka4gPCjn5fwpoGk56ei8KOWnPCjmYDkpK3wpKee47Wi6Y+b6Yq+6Y2I8KCKv+eiuemJt+mRjeS/pOORgOmBpPCllZ3noL3noZTnorbnoYvwoZ2X8KOHifCkpYHjmprkvbLmv5rmv5nngJ7ngJ7lkJTwpIa15Z675aOz5Z6K6bSW5Z+X54S045Kv8KSGrOeHq/CmsYDwpL6X5ayo8KGetfCoqYlcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NzQwXCIsXG5cdFx0XCLmhIzlq47lqIvkirzwpJKI45ys5K278KinvOmOu+mOuPCho5bwoLyd6JGy8KazgPChkJPwpIu68KKwpvCkj4HlppTwo7a38Kadgee2qPCmhZvwpoKk8KSmufCkpovwqKe66Yul54+i47up55K08Kito/Chop/ju6HwpKqz5quY54+z54+747uW8KSovvCkqpTwoZ+Z8KSppvCgjqfwoZCk8KSnpeeRiPCkpJbngqXwpKW26YqE54+m6Y2f8KCTvumMsfCoq47wqKiW6Y6G8Kivp/Cll5XkpLXwqKqC54WrXCJcblx0XSxcblx0W1xuXHRcdFwiOTdhMVwiLFxuXHRcdFwi8KSlg/Cgs7/lmqTwoJia8KCvq/CgsrjllILnp4TwoZ+657e+8KGbgvCkqZDwoaGS5JSu6ZCB45yK8KirgPCkpq3lprDwoaK/8KGig/CnkoTlqqHjm6Lwo7Wb45qw6Ymf5am58KiqgfChoaLpjbTjs43woKq05KqW46aK5YO047Wp47WM8KGOnOeFteSLu/CoiJjmuI/wqYOk5JOr5rWX8Ke5j+eBp+ayr+OzlvCjv63wo7it5riC5ryM47Wv8KCPteeVkeOavOOTiOSagOO7muShseWnhOmJruSkvui9gfCosJzwpq+A5aCS5Z+I45uW8KGRkueDvvCkjaLwpKmx8KK/o/ChirDwoo695qK55qWn8KGOmPCjk6Xwp6+08KObn/CoqoPwo5+W8KOPuvCksp/mqJrwo5qt8Kayt+iQvuSTn+STjlwiXG5cdF0sXG5cdFtcblx0XHRcIjk4NDBcIixcblx0XHRcIvCmtKbwprWR8KaygvCmv57mvJfwp4SJ6Iy98KGcuuiPrfCmsoDwp4GT8KGfm+WmieWqgvChnrPlqaHlqbHwoaSF8KSHvOOcreWnr/ChnLzjm4fnho7pjpDmmprwpIql5amu5air8KSKk+aoq/Cju7nwp5y28KSRm/Cki4rnhJ3wpImZ8KinoeS+sPCmtKjls4LwpJOO8Ke5jfCkjr3mqIzwpImW8KGMhOeCpueEs/Ckj6njtqXms5/wr6Cl8KSpj+e5peWnq+W0r+O3s+W9nPCkqZ3woZ+f57ak6JCmXCJcblx0XSxcblx0W1xuXHRcdFwiOThhMVwiLFxuXHRcdFwi5ZKF8KOruvCjjIDwoIiU5Z2+8KCjlfCgmJnjv6Xwob6e8KqKtueAg/CphZvltbDnjo/ns5PwqKmZ8KmQoOS/iOe/p+eLjeeMkPCnq7TnjLjnjLnwpZu2542B542I47qp8KesmOmBrOeHtfCko7Lnj6Hoh7bju4rnnIzju5HmsqLlm73nkJnnkJ7nkJ/ju6Lju7Dju7Tju7rnk5PjvI7jvZPnlYLnla3nlbLnlo3jvbznl4jnl5zjv4DnmY3jv5fnmbTjv5znmbrwpL2c54aI5Zij6KaA5aGp5ICd552D5IC55p2h5IGF45eb556Y5IGq5IGv5bGe556+55+L5aOy56CY54K556Cc5IKo56C556GH56GR56Gm6JGI8KWUteeks+agg+eksuSEg1wiXG5cdF0sXG5cdFtcblx0XHRcIjk5NDBcIixcblx0XHRcIuSEieemkeemmei+u+eohui+vOSFp+eqkeSGsueqvOiJueSHhOerj+erm+SHj+S4oeetouetrOetu+ewkuewm+SJoOSJuuexu+eynOSKjOeyuOSKlOezrei+k+eDgPCgs4/nt4/nt5Tnt5Dnt73nvq7nvrTnip/kjpfogKDogKXnrLnogK7ogLHogZTjt4zlnrTngqDogrfog6nkj63ohIznjKrohI7ohJLnlaDohJTkkIHjrLnohZbohZnohZpcIlxuXHRdLFxuXHRbXG5cdFx0XCI5OWExXCIsXG5cdFx0XCLkkJPloLrohbzohoTkkKXohpPkkK3ohqXln6/oh4Hoh6ToiZTkko/oiqboibboi4roi5joi7/kkrDojZfpmanmporokIXng7XokaTmg6PokojklITokr7ok6Hok7jolJDolLjolZLklLvola/olbDol6DklbfombLompLomrLom6/pmYXonovkmIbkmJfooq7oo7/opKTopYfoppHwp6Wn6Kip6Ki46KqU6Kq06LGR6LOU6LOy6LSc5J6Y5aGf6LeD5J+t5Luu6Li65ZeY5Z2U6Lmx5Ze16Lqw5KC36LuO6Lui6Luk6Lut6Luy6L636L+B6L+K6L+M6YCz6aeE5KKt6aOg6YiT5KSe6Yio6YmY6Ymr6Yqx6Yqu6Yq/XCJcblx0XSxcblx0W1xuXHRcdFwiOWE0MFwiLFxuXHRcdFwi6Yuj6Yur6Yuz6Yu06Yu96Y2D6Y6E6Y6t5KWF5KWR6bq/6ZCX5YyB6ZCd6ZCt6ZC+5KWq6ZGU6ZG56ZSt6Zai5Kan6Ze06Ziz5Kel5p6g5Kik6Z2A5Ki16Z6y6Z+C5ZmU5Kuk5oOo6aK55KyZ6aOx5aGE6aSO6aSZ5Ya06aSc6aS36aWC6aWd6aWi5K2w6aeF5K6d6ai86ayP56qD6a2p6a6B6a+d6a+x6a+05LGt6bCg452v8KGvgum1iemwulwiXG5cdF0sXG5cdFtcblx0XHRcIjlhYTFcIixcblx0XHRcIum7vuWZkOm2k+m2vem3gOm3vOmTtui+tum5u+m6rOm6sem6vem7humTnOm7oum7sem7uOeriOm9hPCggpTwoIq38KCOoOakmumTg+WmrPCgk5floYDpk4HjnrnwoJeV8KCYlfCgmbbwoZq65Z2X54Wz8KCrgvCgq43woK6/5ZGq8K+gu/Cgr4vlkp7woK+78KCwu/CgsZPwoLGl8KCxvOaDp/Cgso3lmbrwoLK18KCznfCgs63woLWv8KC2svCgt4jmpZXpsK/onqXwoLiE8KC4jvCgu5fwoL6Q8KC8rfCgubPlsKDwoL685biL8KGBnPChgY/woYG25pye8KGBu/ChgojwoYKW45mH8KGCv/Chg5PwoYSv8KGEu+WNpOiSrfChi6PwoY218KGMtuiugfChlbfwoZiZ8KGfg/Chn4fkubjngrvwoaCt8KGlqlwiXG5cdF0sXG5cdFtcblx0XHRcIjliNDBcIixcblx0XHRcIvChqK3woamF8KGwqvChsbDwobKs8KG7iOaLg/Chu5XwobyV54aY5qGV8KKBheanqeObiPCiibzwoo+X8KKPuvCinKrwoqGx8KKlj+iLvfCipafwoqaT8KKrleimpfCiq6jovqDwoqyO6Z648KKsv+mhh+mqvfCisYxcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YjYyXCIsXG5cdFx0XCLworKI8KKyt/Clr6jworSI8KK0kvCitrfworaV8KK5gvCivbTwor+M8KOAs/Cjgabwo4yf8KOPnuW+seaZiOaav/Cnqbnwo5Wn8KOXs+eIgfCkprrnn5fwo5ia8KOclue6h/CgjYblorXmnI5cIlxuXHRdLFxuXHRbXG5cdFx0XCI5YmExXCIsXG5cdFx0XCLmpJjwo6qn8KeZl/Clv6Lwo7iR8KO6ufCnl77wooKa5KOQ5Kq48KSEmfCoqprwpIuu8KSMjfCkgLvwpIy08KSOlvCkqYXwoJeK5YeS8KCYkeWmn/Chuqjjrr7wo7O/8KSQhPCkk5blnojwpJm046ab8KScr/Col6jwqaeJ452i8KKHg+itnvCorY7pp5bwpKCS8KSju/CkqJXniInwpKuA8KCxuOWlpfCkuqXwpL6G8KCduei7mvClgKzlio/lnL/nhbHwpYqZ8KWQmfCjvYrwpKqn5Za88KWRhvClka7wpq2S6YeU45Gz8KWUv/CnmLLwpZWe5JyY8KWVovCllabwpZ+H8KSkv/CloZ3lgabjk7vwo4+M5oOe8KWkg+SdvPCopYjwpaqu8KWuifClsIbwobaQ5Z6h54WR5r628KaEgvCnsJLpgZbwpoay8KS+muitovCmkILwppGKXCJcblx0XSxcblx0W1xuXHRcdFwiOWM0MFwiLFxuXHRcdFwi5bWb8Kavt+i8tvCmkoTwoaSc6Kuq8KSntvCmkojwo7+v8KaUkuSvgPCmlr/wppq18KKcm+mRpfCln6HmhpXlqKfwr6ON5L675Zq58KSUofCmm7zkuarwpKS06ZmW5raP8KayveOYmOilt/CmnpnwpqGu8KaQkfCmoZ7nh5/wpqOH562C8KmDgPCgqJHwpqSm6YSE8Kakueephem3sPCmp7rpqKbwpqit45mf8KaRqfCggKHnpoPwpqi08Katm+W0rPCjlJnoj4/wpq6d5JuQ8KaypOeUu+ihpfCmtq7lorZcIlxuXHRdLFxuXHRbXG5cdFx0XCI5Y2ExXCIsXG5cdFx0XCLjnJzwopaN8KeBi/Cnh43jsZTwp4qA8KeKhemKgfCihbrwp4qL6Yyw8KeLpvCkp5DmsLnpkp/wp5GQ8KC7uOigp+ijtfCipKbwqJGz8KGesea6uPCkqKrwoaCg46ak45q55bCQ56ej5JS/5pq28KmyrfCpoqTopYPwp5+M8KehmOWbluSDn/ChmIrjpqHwo5yv8KiDqPChj4Xnhq3ojabwp6ed8KmGqOWpp+Syt/Cngq/wqKar8KenvfCnqIrwp6yL8Ke1pvCkhbrnrYPnpb7wqICJ5r618KqLn+aog/CojJjljqLwpriH6Y6/5qC26Z2d8KiFr/CogKPwpqa18KGPrfCjiK/wqIGI5baF8KiwsPCogoPlnJXpoKPwqKWJ5bar8KSmiOaWvuanleWPkvCkqqXwo76B47CR5py28KiCkPCog7TwqISu8KG+ofCohY9cIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZDQwXCIsXG5cdFx0XCLwqIaJ8KiGr/CoiJrwqIyG8KiMr/Cojorjl4rwqJGo8KiaquSjuuaPpvCopZbnoIjpiZXwqKa45I+y8Kinp+SPn/Cop6jwqK2G8KivlOWnuPCosInovIvwqL+F8KmDrOetkfCphJDwqYS847e38KmFnvCkq4rov5Dnio/lmovwqZOn8KmXqfCplrDwqZa48KmcsvCpo5HwqaWJ8KmlqvCpp4Pwqaio8KmsjvCptZrwqbab57qf8Km7uPCpvKPksqTplYfwqoqT54ai8KqLv+S2kemAkvCql4vktpzwoLKc6L6+5ZeBXCJcblx0XSxcblx0W1xuXHRcdFwiOWRhMVwiLFxuXHRcdFwi6L668KKSsOi+ufCkqpPklInnub/mvZbmqrHku6rjk6TwqKys8KeineOcuui6gPChn7XwqICk8KitrPCorpnwp6i+8Kaar+O3q/CnmZXwo7K38KWYtfClpZbkuprwpbqB8KaJmOWav/Cgua3ouI7lra3wo7qI8KSynuaPnuaLkPChn7bwoaG75pSw5Zit8KWxiuWQmvCljJHjt4bwqbaY5LG95Zii5Zie572J8KW7mOWltfCjtYDonbDkuJzwoL+q8KC1ifCjmrrohJfptZ7otJjnmLvpsYXnmY7nnrnpjYXlkLLohYjoi7flmKXohLLokJjogr3ll6rnpaLlmYPlkJbwoLqd45eO5ZiF5Zex5pux8KiLouOYreeUtOWXsOWWuuWSl+WVsvCgsYHwoLKW5buQ8KWFiPCgubbworGiXCJcblx0XSxcblx0W1xuXHRcdFwiOWU0MFwiLFxuXHRcdFwi8KC6oum6q+e1muWXnvChgbXmip3pna3lkpTos43nh7bphbbmj7zmjrnmj77llanwoq2D6bGy8KK6s+WGmuOTn/CgtqflhqflkY3llJ7llJPnmabouK3wpqKK55ax6IK26KCE6J6G6KOH6Ia26JCc8KGDgeSTrOeMhPCknIblrpDojIvwpqKT5Zm78KKbtPCntK/wpIaj8Ke1s/Cmu5Dwp4q26YWw8KGHmemIiPCjs7zwqpqp8KC6rPCgu7nniabwobKi5J2O8KS/gvCnv7nwoL+r5IO6XCJcblx0XSxcblx0W1xuXHRcdFwiOWVhMVwiLFxuXHRcdFwi6bGd5pSf8KK2oOSjs/Ckn6DwqbW88KC/rPCguIrmgaLwp5aj8KC/rVwiXG5cdF0sXG5cdFtcblx0XHRcIjllYWRcIixcblx0XHRcIvCmgYjwoYaH54aj57qO6bWQ5Lia5LiE45W35ayN5rKy5Y2n45qs46ec5Y2945ql8KSYmOWimvCkra7oiK3lkYvlnqrwpaqV8KCluVwiXG5cdF0sXG5cdFtcblx0XHRcIjllYzVcIixcblx0XHRcIuOpkvCikaXnjbTwqbqs5LSJ6a+t8KOzvvCpvLDksZvwpL6p8KmWnvCpv57okZzwo7a28KeKsvCmnrPwo5yg5oyu57Sl8KO7t/CjuKzjqKrpgIjli4zjubTjmbrkl6nwoJKO55mA5auw8KC6tuehuvCnvK7loqfkgr/lmbzprovltbTnmZTwqpC06bqF5LOh55e545+75oSZ8KODmvCkj7JcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZWY1XCIsXG5cdFx0XCLlmZ3woYqp5Z6n8KSlo/CpuIbliLTwp4Ku45at5rGK6bW8XCJcblx0XSxcblx0W1xuXHRcdFwiOWY0MFwiLFxuXHRcdFwi57GW6ay55Z+e8KGdrOWxk+aTk/Cpk5Dwpoy18KeFpOiarfCgtKjwprSi8KSrovCgtbFcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZjRmXCIsXG5cdFx0XCLlh77wobyP5baO6ZyD8KG3kem6gemBjOesn+msguWzkeeuo+aJqOaMtemrv+evj+msquexvumsruexgueyhumwleevvOmsiem8l+mwm/CkpL7pvZrllbPlr4Pkv73pupjkv7LliaDjuIbli5HlnaflgZblprfluJLpn4jptqvovZzlkanpnrTppYDpnrrljKzmhLBcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZmExXCIsXG5cdFx0XCLmpKzlj5rpsIrptILksLvpmYHmpoDlgqbnlYbwoZ2t6aea5YmzXCJcblx0XSxcblx0W1xuXHRcdFwiOWZhZVwiLFxuXHRcdFwi6YWZ6ZqB6YWcXCJcblx0XSxcblx0W1xuXHRcdFwiOWZiMlwiLFxuXHRcdFwi6YWR8Ki6l+aNv/CmtKPmq4rlmJHpho7nlbrmioXwoI+8542P57Gw8KWwofCjs71cIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZmMxXCIsXG5cdFx0XCLwpKSZ55uW6a6d5Liq8KCzlOiOvuihglwiXG5cdF0sXG5cdFtcblx0XHRcIjlmYzlcIixcblx0XHRcIuWxiuangOWDreWduuWIn+W3teS7juawsfCgh7LkvLnlkpzlk5rliprotoLjl77lvIzjl7NcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZmRiXCIsXG5cdFx0XCLmrZLphbzpvqXprpfpoK7porTpqrrpuqjpuoTnhbrnrJRcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZmU3XCIsXG5cdFx0XCLmr7rooJjnvbhcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZmViXCIsXG5cdFx0XCLlmKDwqpmK6Lm36b2TXCJcblx0XSxcblx0W1xuXHRcdFwiOWZmMFwiLFxuXHRcdFwi6LeU6LmP6bic6LiB5oqC8KiNvei4qOi5teerk/CkqbfnqL7no5jms6roqafnmIdcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMDQwXCIsXG5cdFx0XCLwqKma6bym5rOO6J+W55eD8KqKsuehk/CvoYDotIzni6LnjbHorK3njILnk7Hos6vwpKq76Jiv5b666KKg5JK3XCJcblx0XSxcblx0W1xuXHRcdFwiYTA1NVwiLFxuXHRcdFwi8KGgu/CmuIVcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMDU4XCIsXG5cdFx0XCLoqb7wopSbXCJcblx0XSxcblx0W1xuXHRcdFwiYTA1YlwiLFxuXHRcdFwi5oO955mn6auX6bWE6Y2u6a6P6J+1XCJcblx0XSxcblx0W1xuXHRcdFwiYTA2M1wiLFxuXHRcdFwi6KCP6LO354ys6Zyh6a6w45eW54qy5LCH57GR6aWK8KaFmeaFmeSwhOm6luaFvVwiXG5cdF0sXG5cdFtcblx0XHRcImEwNzNcIixcblx0XHRcIuWdn+aFr+aKpuaIueaLjuOpnOaHouWOqvCjj7XmjaTmoILjl5JcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMGExXCIsXG5cdFx0XCLltZfwqK+C6L+a8Ki4uVwiXG5cdF0sXG5cdFtcblx0XHRcImEwYTZcIixcblx0XHRcIuWDmfChtYbnpIbljLLpmLjwoLy75IGlXCJcblx0XSxcblx0W1xuXHRcdFwiYTBhZVwiLFxuXHRcdFwi55++XCJcblx0XSxcblx0W1xuXHRcdFwiYTBiMFwiLFxuXHRcdFwi57OC8KW8muezmueoreiBpuiBo+e1jeeUheeTsuimlOiImuacjOiBovCnkobogZvnk7DohIPnnKToponwpp+M55WT8Ka7keieqeifjuiHiOiejOipieiyreitg+ecq+eTuOiTmuOYteamsui2plwiXG5cdF0sXG5cdFtcblx0XHRcImEwZDRcIixcblx0XHRcIuimqeeRqOa2ueifgfCkgJHnk6fjt5vnhbbmgqTmhpzjs5HnhaLmgbdcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMGUyXCIsXG5cdFx0XCLnvbHwqKyt54mQ5oOp5K2+5Yig47CY8KOzh/Clu5fwp5mW8KWUsfChpYTwoYu+8Kmkg/Cmt5zwp4Kt5bOB8KaGrfCoqI/wo5m38KCDrvCmoYbwpLyO5JWi5ayf8KaNjOm9kOm6pvCmiatcIlxuXHRdLFxuXHRbXG5cdFx0XCJhM2MwXCIsXG5cdFx0XCLikIBcIixcblx0XHQzMSxcblx0XHRcIuKQoVwiXG5cdF0sXG5cdFtcblx0XHRcImM2YTFcIixcblx0XHRcIuKRoFwiLFxuXHRcdDksXG5cdFx0XCLikbRcIixcblx0XHQ5LFxuXHRcdFwi4oWwXCIsXG5cdFx0OSxcblx0XHRcIuS4tuS4v+S6heS6oOWGguWGluWGq+WLueWMuOWNqeWOtuWkiuWugOW3m+K8s+W5v+W7tOW9kOW9oeaUtOaXoOeWkueZtui+tematsKoy4bjg73jg77jgp3jgp7jgIPku53jgIXjgIbjgIfjg7zvvLvvvL3inL3jgYFcIixcblx0XHQyM1xuXHRdLFxuXHRbXG5cdFx0XCJjNzQwXCIsXG5cdFx0XCLjgZlcIixcblx0XHQ1OCxcblx0XHRcIuOCoeOCouOCo+OCpFwiXG5cdF0sXG5cdFtcblx0XHRcImM3YTFcIixcblx0XHRcIuOCpVwiLFxuXHRcdDgxLFxuXHRcdFwi0JBcIixcblx0XHQ1LFxuXHRcdFwi0IHQllwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiYzg0MFwiLFxuXHRcdFwi0JtcIixcblx0XHQyNixcblx0XHRcItGR0LZcIixcblx0XHQyNSxcblx0XHRcIuKHp+KGuOKGueOHj/Cgg4zkuZrwoIKK5YiC5JKRXCJcblx0XSxcblx0W1xuXHRcdFwiYzhhMVwiLFxuXHRcdFwi6b6w5YaI6b6x8KeYh1wiXG5cdF0sXG5cdFtcblx0XHRcImM4Y2RcIixcblx0XHRcIu+/ou+/pO+8h++8guOIseKEluKEoeOCm+OCnOK6gOK6hOK6huK6h+K6iOK6iuK6jOK6jeK6leK6nOK6neK6peK6p+K6quK6rOK6ruK6tuK6vOK6vuK7huK7iuK7jOK7jeK7j+K7luK7l+K7nuK7o1wiXG5cdF0sXG5cdFtcblx0XHRcImM4ZjVcIixcblx0XHRcIsqDyZDJm8mUybXFk8O4xYvKismqXCJcblx0XSxcblx0W1xuXHRcdFwiZjlmZVwiLFxuXHRcdFwi77+tXCJcblx0XSxcblx0W1xuXHRcdFwiZmE0MFwiLFxuXHRcdFwi8KCVh+mLm/Cgl5/wo7+F6JWM5Iq154+v5Ya145mJ8KSlgvCop6TpjYTwoaeb6Iuu8KOziOegvOadhOaLn/CkpLPwqKaq8KCKoPCmrrPwoYyF5L6r8KKTreWAiPCmtKnwp6qE8KOYgPCkqrHwopST5YCp8KCNvuW+pPCgjoDwoI2H5rub8KCQn+WBveWEgeORuuWEjumhrOOdg+iQlvCkpqTwoJKH5YWg8KOOtOWFqvCgr7/wooO88KCLpfCilLDwoJaO8KOIs/ChpoPlroLonb3woJaz8KOymeWGsuWGuFwiXG5cdF0sXG5cdFtcblx0XHRcImZhYTFcIixcblx0XHRcIum0tOWHieWHj+WHkeOznOWHk/CkqqblhrPlh6LljYLlh63oj43mpL7wo5yt5b275YiL5Yim5Yi85Yq15YmX5YqU5Yq55YuF57CV6JWC5Yug6JiN8Kask+WMhfCoq57llYnmu5nwo76A8KCllPCjv6zljLPljYTwoK+i5rOL8KGcpuagm+ePleaBiuO6quOjjPChm6jnh53kkqLlja3ljbTwqJqr5Y2+5Y2/8KGWlvChmJPnn6bljpPwqKqb5Y6g5Y6r5Y6u546n8KWdsuO9meeOnOWPgeWPheaxieS5ieWfvuWPmeOqq/Cgro/lj6Dwo7+r8KK2o+WPtvCgsbflkJPngbnllKvmmZfmtZvlka3wpq2T8KC1tOWVneWSj+WSpOSepvChnI3woLud47a08KC1jVwiXG5cdF0sXG5cdFtcblx0XHRcImZiNDBcIixcblx0XHRcIvCoprzwopqY5ZWH5LOt5ZCv55CX5ZaG5Zap5ZiF8KGjl/CkgLrklZLwpJC15pqz8KGCtOWYt+abjfCjiormmqTmmq3lmY3lmY/no7Hlm7Hpnoflj77lnIDlm6/lm63wqK2m45ij8KGJj+WdhvCkhqXmsa7ngovlnYLjmrHwprG+5Z+m8KGQluWgg/ChkZTwpI2j5aCm8KSvteWhnOWiquOVoeWjoOWjnPChiLzlo7vlr7/lnYPwqoWQ8KSJuOmPk+OWoeWkn+aipuObg+a5mVwiXG5cdF0sXG5cdFtcblx0XHRcImZiYTFcIixcblx0XHRcIvChmL7lqKTllZPwoZqS6JSF5aeJ8KC1jvCmsoHwprSq8KGfnOWnmfChn7vwoZ6y8Ka2pua1sfChoKjwoZuV5ae58Ka5heWqq+Wpo+ObpvCkpqnlqbfjnIjlqpbnkaXlq5Pwpr6h8KKVlOO2hfChpJHjnLLwoZq45bqD5YuQ5a225paI5a288KeojuSAhOShnfCgiITlr5XmhaDwoai08KWnjPCglqXlr7Plrp3ktJDlsIXwoa2E5bCT54+O5bCU8KGypfCmrKjlsYnko53lsoXls6nls6/ltovwobe58KG4t+W0kOW0mOW1hvChuqTlsrrlt5foi7zjoK3wpKSB8KKBifCihbPoiofjoLbjr4LluK7mqorlubXlubrwpJK88KCzk+WOpuS6t+W7kOWOqPChnbHluInlu7TwqJKCXCJcblx0XSxcblx0W1xuXHRcdFwiZmM0MFwiLFxuXHRcdFwi5bu55bu746Kg5bu85qC+6ZCb5byN8KCHgfCvopTjq57koq7woYy65by68KaiiPCij5DlvZjwopGx5b2j6Z698Ka5ruW9sumNgPCoqLblvqfltrbjtZ/wpYmQ8KG9qvCng7jwopmo6YeW8KCKnvCoqKnmgLHmmoXwoaG346Wj47eH45i55Z6Q8KKetOelseO5gOaCnuaCpOaCs/CkpoLwpKaP8Kepk+eSpOWDoeWqoOaFpOiQpOaFgvCvoqbwpruS5oaB5Ye08KCZluaGh+WuqvCjvrdcIlxuXHRdLFxuXHRbXG5cdFx0XCJmY2ExXCIsXG5cdFx0XCLwoqGf5oeT8KiunfCppZ3mh5DjpLLwoqaA8KKjgeaAo+aFnOaUnuaOi/CghJjmi4XwoZ2w5ouV8KK4jeaNrPCkp5/jqJfmkLjmj7jwoY6O8KGfvOaSkOa+ivCiuLbpoJTwpIKM8KWcneaToeaTpemRu+OppuaQuuOpl+aVjea8lvCkqKjwpKij5paF5pWt5pWf8KOBvuaWtfCkpYDkrLfml5Hkg5jwoaCp5peg5pej5b+f8KOQgOaYmPCjh7fwo4e45pmE8KOGpPCjhqXmmYvwoLm15pmn8KWHpuaZs+aZtPChuL3wo4ix8KiXtPCjh4jwpYyT55+F8KKjt+mmpOacgvCkjpzwpKih46yr5qe68KOfguadnuadp+adovCkh43wqYOt5p+X5JOp5qCi5rmQ6Yi85qCB8KOPpvCmtqDmoZ1cIlxuXHRdLFxuXHRbXG5cdFx0XCJmZDQwXCIsXG5cdFx0XCLwo5Gv5qeh5qiL8Kirn+als+ajg/Cjl43mpIHmpIDjtLLjqIHwo5i8466A5p6s5qWh8KipiuSLvOaktuammOOuofCgj4nojaPlgpDmp7nwo5mZ8KKEquaphfCjnIPmqp3jr7PmnrHmq4jwqYac47CN5qyd8KCko+aDnuasteattPCin43murXwo6ub8KCOtfChpZjjnYDlkKHwo62a5q+h8KO7vOavnOawt/CikovwpKOx8KatkeaxmuiIpuaxufCjtrzkk4Xwo7a98KSGpPCkpIzwpKSAXCJcblx0XSxcblx0W1xuXHRcdFwiZmRhMVwiLFxuXHRcdFwi8KOzieObpeOzq/CgtLLproPwo4e58KKSkee+j+agt/CmtKXwprah8Ka3q+a2lua1nOa5vOa8hPCkpb/wpIKF8Ka5suiUs/CmvbTlh4fmspzmuJ3okK7wqKyh5riv8KO4r+eRk/CjvoLnp4zmuY/lqpHwo4GL5r+445yN5r6d8KO4sOa7uvChkpfwpIC95JWV6Y+w5r2E5r2c47WO5r208KmFsOO0u+a+n/CkhYTmv5PwpIKR8KSFlfCkgLnwo7+w8KO+tPCkhL/lh5/wpIWW8KSFl/CkhYDwpoed54GL54G+54Kn54KB54OM54OV54OW54Of5ISE47eo54a054aW8KSJt+eEq+eFheWqiOeFiueFruWynPCkjaXnhY/pjaLwpIuB54Ss8KSRmvCkqKfwpKii54a68KivqOeCveeIjlwiXG5cdF0sXG5cdFtcblx0XHRcImZlNDBcIixcblx0XHRcIumRgueIleWkkemRg+eIpOmNgfClmIXniK7niYDwpKW05qK954mV54mX47mV8KOBhOagjea8veeKgueMqueMq/CkoKPwqKCr5KOt8KighOeMqOeMruePj+eOqvCgsLrwpqiu54+J55GJ8KSHovChm6fwpKik5pij45uF8KSmt/Ckpo3wpKe754+355CV5qSD8KSopueQufCgl4Pju5fnkZzwoqKt55Gg8Ki6sueRh+ePpOeRtuiOueeRrOOcsOeRtOmPseaorOeSguSlk/CkqoxcIlxuXHRdLFxuXHRbXG5cdFx0XCJmZWExXCIsXG5cdFx0XCLwpIWf8KSpufCoro/lrYbwqLCD8KGinueTiPChpojnlI7nk6nnlJ7wqLuZ8KGpi+Wvl/CouqzpjoXnlY3nlYrnlafnla7wpL6C47yE8KS0k+eWjueRneeWnueWtOeYgueYrOeZkeeZj+eZr+eZtvCmj7XnmpDoh6/jn7jwpqSR8Kakjueaoeeapeeat+ebjPCmvp/okaLwpYKd8KWFvfChuJznnJ7nnKbnnYDmkq/wpYig552Y8KOKrOeer/CopaTwqKWo8KGbgeeftOegifChjbbwpKiS5qOK56Kv56OH56OT6Zql56Su8KWXoOejl+ektOeisfCnmIzovrjoooTwqKyr8KaCg/CimJznpobopIDmpILnpoDwpaGX56ad8KesueekvOemqea4qvCnhKbjuqjnp4bwqYSN56eUXCJcblx0XVxuXTtcblxudmFyIGJpZzVBZGRlZCQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCdkZWZhdWx0JzogYmlnNUFkZGVkXG59KTtcblxudmFyIHJlcXVpcmUkJDAgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKHNoaWZ0amlzJDEpO1xuXG52YXIgcmVxdWlyZSQkMSA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoZXVjanAkMSk7XG5cbnZhciByZXF1aXJlJCQyID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShjcDkzNiQxKTtcblxudmFyIHJlcXVpcmUkJDMkMSA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoZ2JrQWRkZWQkMSk7XG5cbnZhciByZXF1aXJlJCQ0ID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShnYjE4MDMwUmFuZ2VzJDEpO1xuXG52YXIgcmVxdWlyZSQkNSA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoY3A5NDkkMSk7XG5cbnZhciByZXF1aXJlJCQ2ID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShjcDk1MCQxKTtcblxudmFyIHJlcXVpcmUkJDcgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKGJpZzVBZGRlZCQxKTtcblxuLy8gVGFibGVzIGFyZSBub3QgcmVxdWlyZSgpLWQgdW50aWwgdGhleSBhcmUgbmVlZGVkIHRvIHNwZWVkIHVwIGxpYnJhcnkgbG9hZC5cbi8vIHJlcXVpcmUoKS1zIGFyZSBkaXJlY3QgdG8gc3VwcG9ydCBCcm93c2VyaWZ5LlxuXG5cbnZhciBkYmNzRGF0YSA9IHtcbiAgLy8gPT0gSmFwYW5lc2UvU2hpZnRKSVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBbGwgamFwYW5lc2UgZW5jb2RpbmdzIGFyZSBiYXNlZCBvbiBKSVMgWCBzZXQgb2Ygc3RhbmRhcmRzOlxuICAvLyBKSVMgWCAwMjAxIC0gU2luZ2xlLWJ5dGUgZW5jb2Rpbmcgb2YgQVNDSUkgKyDCpSArIEthbmEgY2hhcnMgYXQgMHhBMS0weERGLlxuICAvLyBKSVMgWCAwMjA4IC0gTWFpbiBzZXQgb2YgNjg3OSBjaGFyYWN0ZXJzLCBwbGFjZWQgaW4gOTR4OTQgcGxhbmUsIHRvIGJlIGVuY29kZWQgYnkgMiBieXRlcy4gXG4gIC8vICAgICAgICAgICAgICBIYXMgc2V2ZXJhbCB2YXJpYXRpb25zIGluIDE5NzgsIDE5ODMsIDE5OTAgYW5kIDE5OTcuXG4gIC8vIEpJUyBYIDAyMTIgLSBTdXBwbGVtZW50YXJ5IHBsYW5lIG9mIDYwNjcgY2hhcnMgaW4gOTR4OTQgcGxhbmUuIDE5OTAuIEVmZmVjdGl2ZWx5IGRlYWQuXG4gIC8vIEpJUyBYIDAyMTMgLSBFeHRlbnNpb24gYW5kIG1vZGVybiByZXBsYWNlbWVudCBvZiAwMjA4IGFuZCAwMjEyLiBUb3RhbCBjaGFyczogMTEyMzMuXG4gIC8vICAgICAgICAgICAgICAyIHBsYW5lcywgZmlyc3QgaXMgc3VwZXJzZXQgb2YgMDIwOCwgc2Vjb25kIC0gcmV2aXNlZCAwMjEyLlxuICAvLyAgICAgICAgICAgICAgSW50cm9kdWNlZCBpbiAyMDAwLCByZXZpc2VkIDIwMDQuIFNvbWUgY2hhcmFjdGVycyBhcmUgaW4gVW5pY29kZSBQbGFuZSAyICgweDJ4eHh4KVxuICAvLyBCeXRlIGVuY29kaW5ncyBhcmU6XG4gIC8vICAqIFNoaWZ0X0pJUzogQ29tcGF0aWJsZSB3aXRoIDAyMDEsIHVzZXMgbm90IGRlZmluZWQgY2hhcnMgaW4gdG9wIGhhbGYgYXMgbGVhZCBieXRlcyBmb3IgZG91YmxlLWJ5dGVcbiAgLy8gICAgICAgICAgICAgICBlbmNvZGluZyBvZiAwMjA4LiBMZWFkIGJ5dGUgcmFuZ2VzOiAweDgxLTB4OUYsIDB4RTAtMHhFRjsgVHJhaWwgYnl0ZSByYW5nZXM6IDB4NDAtMHg3RSwgMHg4MC0weDlFLCAweDlGLTB4RkMuXG4gIC8vICAgICAgICAgICAgICAgV2luZG93cyBDUDkzMiBpcyBhIHN1cGVyc2V0IG9mIFNoaWZ0X0pJUy4gU29tZSBjb21wYW5pZXMgYWRkZWQgbW9yZSBjaGFycywgbm90YWJseSBLRERJLlxuICAvLyAgKiBFVUMtSlA6ICAgIFVwIHRvIDMgYnl0ZXMgcGVyIGNoYXJhY3Rlci4gVXNlZCBtb3N0bHkgb24gKm5peGVzLlxuICAvLyAgICAgICAgICAgICAgIDB4MDAtMHg3RiAgICAgICAtIGxvd2VyIHBhcnQgb2YgMDIwMVxuICAvLyAgICAgICAgICAgICAgIDB4OEUsIDB4QTEtMHhERiAtIHVwcGVyIHBhcnQgb2YgMDIwMVxuICAvLyAgICAgICAgICAgICAgICgweEExLTB4RkUpeDIgICAtIDAyMDggcGxhbmUgKDk0eDk0KS5cbiAgLy8gICAgICAgICAgICAgICAweDhGLCAoMHhBMS0weEZFKXgyIC0gMDIxMiBwbGFuZSAoOTR4OTQpLlxuICAvLyAgKiBKSVMgWCAyMDg6IDctYml0LCBkaXJlY3QgZW5jb2Rpbmcgb2YgMDIwOC4gQnl0ZSByYW5nZXM6IDB4MjEtMHg3RSAoOTQgdmFsdWVzKS4gVW5jb21tb24uXG4gIC8vICAgICAgICAgICAgICAgVXNlZCBhcy1pcyBpbiBJU08yMDIyIGZhbWlseS5cbiAgLy8gICogSVNPMjAyMi1KUDogU3RhdGVmdWwgZW5jb2RpbmcsIHdpdGggZXNjYXBlIHNlcXVlbmNlcyB0byBzd2l0Y2ggYmV0d2VlbiBBU0NJSSwgXG4gIC8vICAgICAgICAgICAgICAgIDAyMDEtMTk3NiBSb21hbiwgMDIwOC0xOTc4LCAwMjA4LTE5ODMuXG4gIC8vICAqIElTTzIwMjItSlAtMTogQWRkcyBlc2Mgc2VxIGZvciAwMjEyLTE5OTAuXG4gIC8vICAqIElTTzIwMjItSlAtMjogQWRkcyBlc2Mgc2VxIGZvciBHQjIzMTMtMTk4MCwgS1NYMTAwMS0xOTkyLCBJU084ODU5LTEsIElTTzg4NTktNy5cbiAgLy8gICogSVNPMjAyMi1KUC0zOiBBZGRzIGVzYyBzZXEgZm9yIDAyMDEtMTk3NiBLYW5hIHNldCwgMDIxMy0yMDAwIFBsYW5lcyAxLCAyLlxuICAvLyAgKiBJU08yMDIyLUpQLTIwMDQ6IEFkZHMgMDIxMy0yMDA0IFBsYW5lIDEuXG4gIC8vXG4gIC8vIEFmdGVyIEpJUyBYIDAyMTMgYXBwZWFyZWQsIFNoaWZ0X0pJUy0yMDA0LCBFVUMtSklTWDAyMTMgYW5kIElTTzIwMjItSlAtMjAwNCBmb2xsb3dlZCwgd2l0aCBqdXN0IGNoYW5naW5nIHRoZSBwbGFuZXMuXG4gIC8vXG4gIC8vIE92ZXJhbGwsIGl0IHNlZW1zIHRoYXQgaXQncyBhIG1lc3MgOiggaHR0cDovL3d3dzgucGxhbGEub3IuanAvdGt1Ym90YTEvdW5pY29kZS1zeW1ib2xzLW1hcDIuaHRtbFxuICAnc2hpZnRqaXMnOiB7XG4gICAgdHlwZTogJ19kYmNzJyxcbiAgICB0YWJsZTogZnVuY3Rpb24gdGFibGUoKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZSQkMDtcbiAgICB9LFxuICAgIGVuY29kZUFkZDoge1xuICAgICAgXCJcXHhBNVwiOiAweDVDLFxuICAgICAgXCJcXHUyMDNFXCI6IDB4N0VcbiAgICB9LFxuICAgIGVuY29kZVNraXBWYWxzOiBbe1xuICAgICAgZnJvbTogMHhFRDQwLFxuICAgICAgdG86IDB4Rjk0MFxuICAgIH1dXG4gIH0sXG4gICdjc3NoaWZ0amlzJzogJ3NoaWZ0amlzJyxcbiAgJ21za2FuamknOiAnc2hpZnRqaXMnLFxuICAnc2ppcyc6ICdzaGlmdGppcycsXG4gICd3aW5kb3dzMzFqJzogJ3NoaWZ0amlzJyxcbiAgJ21zMzFqJzogJ3NoaWZ0amlzJyxcbiAgJ3hzamlzJzogJ3NoaWZ0amlzJyxcbiAgJ3dpbmRvd3M5MzInOiAnc2hpZnRqaXMnLFxuICAnbXM5MzInOiAnc2hpZnRqaXMnLFxuICAnOTMyJzogJ3NoaWZ0amlzJyxcbiAgJ2NwOTMyJzogJ3NoaWZ0amlzJyxcbiAgJ2V1Y2pwJzoge1xuICAgIHR5cGU6ICdfZGJjcycsXG4gICAgdGFibGU6IGZ1bmN0aW9uIHRhYmxlKCkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUkJDE7XG4gICAgfSxcbiAgICBlbmNvZGVBZGQ6IHtcbiAgICAgIFwiXFx4QTVcIjogMHg1QyxcbiAgICAgIFwiXFx1MjAzRVwiOiAweDdFXG4gICAgfVxuICB9LFxuICAvLyBUT0RPOiBLRERJIGV4dGVuc2lvbiB0byBTaGlmdF9KSVNcbiAgLy8gVE9ETzogSUJNIENDU0lEIDk0MiA9IENQOTMyLCBidXQgRjAtRjkgY3VzdG9tIGNoYXJzIGFuZCBvdGhlciBjaGFyIGNoYW5nZXMuXG4gIC8vIFRPRE86IElCTSBDQ1NJRCA5NDMgPSBTaGlmdF9KSVMgPSBDUDkzMiB3aXRoIG9yaWdpbmFsIFNoaWZ0X0pJUyBsb3dlciAxMjggY2hhcnMuXG4gIC8vID09IENoaW5lc2UvR0JLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HQktcbiAgLy8gV2UgbW9zdGx5IGltcGxlbWVudCBXM0MgcmVjb21tZW5kYXRpb246IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNvZGluZy8jZ2JrLWVuY29kZXJcbiAgLy8gT2xkZXN0IEdCMjMxMiAoMTk4MSwgfjc2MDAgY2hhcnMpIGlzIGEgc3Vic2V0IG9mIENQOTM2XG4gICdnYjIzMTInOiAnY3A5MzYnLFxuICAnZ2IyMzEyODAnOiAnY3A5MzYnLFxuICAnZ2IyMzEyMTk4MCc6ICdjcDkzNicsXG4gICdjc2diMjMxMic6ICdjcDkzNicsXG4gICdjc2lzbzU4Z2IyMzEyODAnOiAnY3A5MzYnLFxuICAnZXVjY24nOiAnY3A5MzYnLFxuICAvLyBNaWNyb3NvZnQncyBDUDkzNiBpcyBhIHN1YnNldCBhbmQgYXBwcm94aW1hdGlvbiBvZiBHQksuXG4gICd3aW5kb3dzOTM2JzogJ2NwOTM2JyxcbiAgJ21zOTM2JzogJ2NwOTM2JyxcbiAgJzkzNic6ICdjcDkzNicsXG4gICdjcDkzNic6IHtcbiAgICB0eXBlOiAnX2RiY3MnLFxuICAgIHRhYmxlOiBmdW5jdGlvbiB0YWJsZSgpIHtcbiAgICAgIHJldHVybiByZXF1aXJlJCQyO1xuICAgIH1cbiAgfSxcbiAgLy8gR0JLICh+MjIwMDAgY2hhcnMpIGlzIGFuIGV4dGVuc2lvbiBvZiBDUDkzNiB0aGF0IGFkZGVkIHVzZXItbWFwcGVkIGNoYXJzIGFuZCBzb21lIG90aGVyLlxuICAnZ2JrJzoge1xuICAgIHR5cGU6ICdfZGJjcycsXG4gICAgdGFibGU6IGZ1bmN0aW9uIHRhYmxlKCkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUkJDIuY29uY2F0KHJlcXVpcmUkJDMkMSk7XG4gICAgfVxuICB9LFxuICAneGdiayc6ICdnYmsnLFxuICAnaXNvaXI1OCc6ICdnYmsnLFxuICAvLyBHQjE4MDMwIGlzIGFuIGFsZ29yaXRobWljIGV4dGVuc2lvbiBvZiBHQksuXG4gIC8vIE1haW4gc291cmNlOiBodHRwczovL3d3dy53My5vcmcvVFIvZW5jb2RpbmcvI2diay1lbmNvZGVyXG4gIC8vIGh0dHA6Ly9pY3UtcHJvamVjdC5vcmcvZG9jcy9wYXBlcnMvZ2IxODAzMC5odG1sXG4gIC8vIGh0dHA6Ly9zb3VyY2UuaWN1LXByb2plY3Qub3JnL3JlcG9zL2ljdS9kYXRhL3RydW5rL2NoYXJzZXQvZGF0YS94bWwvZ2ItMTgwMzAtMjAwMC54bWxcbiAgLy8gaHR0cDovL3d3dy5raG5nYWkuY29tL2NoaW5lc2UvY2hhcm1hcC90YmxnYmsucGhwP3BhZ2U9MFxuICAnZ2IxODAzMCc6IHtcbiAgICB0eXBlOiAnX2RiY3MnLFxuICAgIHRhYmxlOiBmdW5jdGlvbiB0YWJsZSgpIHtcbiAgICAgIHJldHVybiByZXF1aXJlJCQyLmNvbmNhdChyZXF1aXJlJCQzJDEpO1xuICAgIH0sXG4gICAgZ2IxODAzMDogZnVuY3Rpb24gZ2IxODAzMCgpIHtcbiAgICAgIHJldHVybiByZXF1aXJlJCQ0O1xuICAgIH0sXG4gICAgZW5jb2RlU2tpcFZhbHM6IFsweDgwXSxcbiAgICBlbmNvZGVBZGQ6IHtcbiAgICAgICfigqwnOiAweEEyRTNcbiAgICB9XG4gIH0sXG4gICdjaGluZXNlJzogJ2diMTgwMzAnLFxuICAvLyA9PSBLb3JlYW4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVVQy1LUiwgS1NfQ181NjAxIGFuZCBLUyBYIDEwMDEgYXJlIGV4YWN0bHkgdGhlIHNhbWUuXG4gICd3aW5kb3dzOTQ5JzogJ2NwOTQ5JyxcbiAgJ21zOTQ5JzogJ2NwOTQ5JyxcbiAgJzk0OSc6ICdjcDk0OScsXG4gICdjcDk0OSc6IHtcbiAgICB0eXBlOiAnX2RiY3MnLFxuICAgIHRhYmxlOiBmdW5jdGlvbiB0YWJsZSgpIHtcbiAgICAgIHJldHVybiByZXF1aXJlJCQ1O1xuICAgIH1cbiAgfSxcbiAgJ2NzZXVja3InOiAnY3A5NDknLFxuICAnY3Nrc2M1NjAxMTk4Nyc6ICdjcDk0OScsXG4gICdldWNrcic6ICdjcDk0OScsXG4gICdpc29pcjE0OSc6ICdjcDk0OScsXG4gICdrb3JlYW4nOiAnY3A5NDknLFxuICAna3NjNTYwMTE5ODcnOiAnY3A5NDknLFxuICAna3NjNTYwMTE5ODknOiAnY3A5NDknLFxuICAna3NjNTYwMSc6ICdjcDk0OScsXG4gIC8vID09IEJpZzUvVGFpd2FuL0hvbmcgS29uZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVGhlcmUgYXJlIGxvdHMgb2YgdGFibGVzIGZvciBCaWc1IGFuZCBjcDk1MC4gUGxlYXNlIHNlZSB0aGUgZm9sbG93aW5nIGxpbmtzIGZvciBoaXN0b3J5OlxuICAvLyBodHRwOi8vbW96dHcub3JnL2RvY3MvYmlnNS8gIGh0dHA6Ly93d3cuaGFpYmxlLmRlL2JydW5vL2NoYXJzZXRzL2NvbnZlcnNpb24tdGFibGVzL0JpZzUuaHRtbFxuICAvLyBWYXJpYXRpb25zLCBpbiByb3VnaGx5IG51bWJlciBvZiBkZWZpbmVkIGNoYXJzOlxuICAvLyAgKiBXaW5kb3dzIENQIDk1MDogTWljcm9zb2Z0IHZhcmlhbnQgb2YgQmlnNS4gQ2Fub25pY2FsOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQOTUwLlRYVFxuICAvLyAgKiBXaW5kb3dzIENQIDk1MTogTWljcm9zb2Z0IHZhcmlhbnQgb2YgQmlnNS1IS1NDUy0yMDAxLiBTZWVtcyB0byBiZSBuZXZlciBwdWJsaWMuIGh0dHA6Ly9tZS5hYmVsY2hldW5nLm9yZy9hcnRpY2xlcy9yZXNlYXJjaC93aGF0LWlzLWNwOTUxL1xuICAvLyAgKiBCaWc1LTIwMDMgKFRhaXdhbiBzdGFuZGFyZCkgYWxtb3N0IHN1cGVyc2V0IG9mIGNwOTUwLlxuICAvLyAgKiBVbmljb2RlLWF0LW9uIChVQU8pIC8gTW96aWxsYSAxLjguIEZhbGxpbmcgb3V0IG9mIHVzZSBvbiB0aGUgV2ViLiBOb3Qgc3VwcG9ydGVkIGJ5IG90aGVyIGJyb3dzZXJzLlxuICAvLyAgKiBCaWc1LUhLU0NTICgtMjAwMSwgLTIwMDQsIC0yMDA4KS4gSG9uZyBLb25nIHN0YW5kYXJkLiBcbiAgLy8gICAgbWFueSB1bmljb2RlIGNvZGUgcG9pbnRzIG1vdmVkIGZyb20gUFVBIHRvIFN1cHBsZW1lbnRhcnkgcGxhbmUgKFUrMlhYWFgpIG92ZXIgdGhlIHllYXJzLlxuICAvLyAgICBQbHVzLCBpdCBoYXMgNCBjb21iaW5pbmcgc2VxdWVuY2VzLlxuICAvLyAgICBTZWVtcyB0aGF0IE1vemlsbGEgcmVmdXNlZCB0byBzdXBwb3J0IGl0IGZvciAxMCB5cnMuIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTE2MjQzMSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTAyOTlcbiAgLy8gICAgYmVjYXVzZSBiaWc1LWhrc2NzIGlzIHRoZSBvbmx5IGVuY29kaW5nIHRvIGluY2x1ZGUgYXN0cmFsIGNoYXJhY3RlcnMgaW4gbm9uLWFsZ29yaXRobWljIHdheS5cbiAgLy8gICAgSW1wbGVtZW50YXRpb25zIGFyZSBub3QgY29uc2lzdGVudCB3aXRoaW4gYnJvd3NlcnM7IHNvbWV0aW1lcyBsYWJlbGVkIGFzIGp1c3QgYmlnNS5cbiAgLy8gICAgTVMgSW50ZXJuZXQgRXhwbG9yZXIgc3dpdGNoZXMgZnJvbSBiaWc1IHRvIGJpZzUtaGtzY3Mgd2hlbiBhIHBhdGNoIGFwcGxpZWQuXG4gIC8vICAgIEdyZWF0IGRpc2N1c3Npb24gJiByZWNhcCBvZiB3aGF0J3MgZ29pbmcgb24gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTEyNDcwI2MzMVxuICAvLyAgICBJbiB0aGUgZW5jb2RlciwgaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBzdXBwb3J0IGVuY29kaW5nIG9sZCBQVUEgbWFwcGluZ3MgdG8gQmlnNSBieXRlcyBzZXEtcy5cbiAgLy8gICAgT2ZmaWNpYWwgc3BlYzogaHR0cDovL3d3dy5vZ2Npby5nb3YuaGsvZW4vYnVzaW5lc3MvdGVjaF9wcm9tb3Rpb24vY2NsaS90ZXJtcy9kb2MvMjAwM2NtcF8yMDA4LnR4dFxuICAvLyAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lm9nY2lvLmdvdi5oay90Yy9idXNpbmVzcy90ZWNoX3Byb21vdGlvbi9jY2xpL3Rlcm1zL2RvYy9oa3Njcy0yMDA4LWJpZzUtaXNvLnR4dFxuICAvLyBcbiAgLy8gQ3VycmVudCB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0byBkZWFsIHdpdGggQmlnNSgtSEtTQ1MpIGlzIGluIHRoZSBFbmNvZGluZyBTdGFuZGFyZCwgaHR0cDovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jYmlnNS1lbmNvZGVyXG4gIC8vIFVuaWNvZGUgbWFwcGluZyAoaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvT0JTT0xFVEUvRUFTVEFTSUEvT1RIRVIvQklHNS5UWFQpIGlzIHNhaWQgdG8gYmUgd3JvbmcuXG4gICd3aW5kb3dzOTUwJzogJ2NwOTUwJyxcbiAgJ21zOTUwJzogJ2NwOTUwJyxcbiAgJzk1MCc6ICdjcDk1MCcsXG4gICdjcDk1MCc6IHtcbiAgICB0eXBlOiAnX2RiY3MnLFxuICAgIHRhYmxlOiBmdW5jdGlvbiB0YWJsZSgpIHtcbiAgICAgIHJldHVybiByZXF1aXJlJCQ2O1xuICAgIH1cbiAgfSxcbiAgLy8gQmlnNSBoYXMgbWFueSB2YXJpYXRpb25zIGFuZCBpcyBhbiBleHRlbnNpb24gb2YgY3A5NTAuIFdlIHVzZSBFbmNvZGluZyBTdGFuZGFyZCdzIGFzIGEgY29uc2Vuc3VzLlxuICAnYmlnNSc6ICdiaWc1aGtzY3MnLFxuICAnYmlnNWhrc2NzJzoge1xuICAgIHR5cGU6ICdfZGJjcycsXG4gICAgdGFibGU6IGZ1bmN0aW9uIHRhYmxlKCkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUkJDYuY29uY2F0KHJlcXVpcmUkJDcpO1xuICAgIH0sXG4gICAgZW5jb2RlU2tpcFZhbHM6IFsweGEyY2NdXG4gIH0sXG4gICdjbmJpZzUnOiAnYmlnNWhrc2NzJyxcbiAgJ2NzYmlnNSc6ICdiaWc1aGtzY3MnLFxuICAneHhiaWc1JzogJ2JpZzVoa3Njcydcbn07XG5cbnZhciBlbmNvZGluZ3MgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gIC8vIFdlIHN1cHBvcnQgQnJvd3NlcmlmeSBieSBza2lwcGluZyBhdXRvbWF0aWMgbW9kdWxlIGRpc2NvdmVyeSBhbmQgcmVxdWlyaW5nIG1vZHVsZXMgZGlyZWN0bHkuXG5cbiAgdmFyIG1vZHVsZXMgPSBbaW50ZXJuYWwsIHV0ZjE2LCB1dGY3LCBzYmNzQ29kZWMsIHNiY3NEYXRhLCBzYmNzRGF0YUdlbmVyYXRlZCwgZGJjc0NvZGVjLCBkYmNzRGF0YV07IC8vIFB1dCBhbGwgZW5jb2RpbmcvYWxpYXMvY29kZWMgZGVmaW5pdGlvbnMgdG8gc2luZ2xlIG9iamVjdCBhbmQgZXhwb3J0IGl0LiBcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbW9kdWxlID0gbW9kdWxlc1tpXTtcblxuICAgIGZvciAodmFyIGVuYyBpbiBtb2R1bGUpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kdWxlLCBlbmMpKSBleHBvcnRzW2VuY10gPSBtb2R1bGVbZW5jXTtcbiAgICB9XG4gIH1cbn0pO1xuXG52YXIgQnVmZmVyJDYgPSBidWZmZXIuQnVmZmVyLFxuICAgIFRyYW5zZm9ybSQxID0gU3RyZWFtLlRyYW5zZm9ybTsgLy8gPT0gRXhwb3J0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxudmFyIHN0cmVhbXMgPSBmdW5jdGlvbiBzdHJlYW1zKGljb252KSB7XG4gIC8vIEFkZGl0aW9uYWwgUHVibGljIEFQSS5cbiAgaWNvbnYuZW5jb2RlU3RyZWFtID0gZnVuY3Rpb24gZW5jb2RlU3RyZWFtKGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBJY29udkxpdGVFbmNvZGVyU3RyZWFtKGljb252LmdldEVuY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgfTtcblxuICBpY29udi5kZWNvZGVTdHJlYW0gPSBmdW5jdGlvbiBkZWNvZGVTdHJlYW0oZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEljb252TGl0ZURlY29kZXJTdHJlYW0oaWNvbnYuZ2V0RGVjb2RlcihlbmNvZGluZywgb3B0aW9ucyksIG9wdGlvbnMpO1xuICB9O1xuXG4gIGljb252LnN1cHBvcnRzU3RyZWFtcyA9IHRydWU7IC8vIE5vdCBwdWJsaXNoZWQgeWV0LlxuXG4gIGljb252Lkljb252TGl0ZUVuY29kZXJTdHJlYW0gPSBJY29udkxpdGVFbmNvZGVyU3RyZWFtO1xuICBpY29udi5JY29udkxpdGVEZWNvZGVyU3RyZWFtID0gSWNvbnZMaXRlRGVjb2RlclN0cmVhbTtcbiAgaWNvbnYuX2NvbGxlY3QgPSBJY29udkxpdGVEZWNvZGVyU3RyZWFtLnByb3RvdHlwZS5jb2xsZWN0O1xufTsgLy8gPT0gRW5jb2RlciBzdHJlYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbmZ1bmN0aW9uIEljb252TGl0ZUVuY29kZXJTdHJlYW0oY29udiwgb3B0aW9ucykge1xuICB0aGlzLmNvbnYgPSBjb252O1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gZmFsc2U7IC8vIFdlIGFjY2VwdCBvbmx5IHN0cmluZ3MsIHNvIHdlIGRvbid0IG5lZWQgdG8gZGVjb2RlIHRoZW0uXG5cbiAgVHJhbnNmb3JtJDEuY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuSWNvbnZMaXRlRW5jb2RlclN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFRyYW5zZm9ybSQxLnByb3RvdHlwZSwge1xuICBjb25zdHJ1Y3Rvcjoge1xuICAgIHZhbHVlOiBJY29udkxpdGVFbmNvZGVyU3RyZWFtXG4gIH1cbn0pO1xuXG5JY29udkxpdGVFbmNvZGVyU3RyZWFtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgZG9uZSkge1xuICBpZiAodHlwZW9mIGNodW5rICE9ICdzdHJpbmcnKSByZXR1cm4gZG9uZShuZXcgRXJyb3IoXCJJY29udiBlbmNvZGluZyBzdHJlYW0gbmVlZHMgc3RyaW5ncyBhcyBpdHMgaW5wdXQuXCIpKTtcblxuICB0cnkge1xuICAgIHZhciByZXMgPSB0aGlzLmNvbnYud3JpdGUoY2h1bmspO1xuICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCkgdGhpcy5wdXNoKHJlcyk7XG4gICAgZG9uZSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZG9uZShlKTtcbiAgfVxufTtcblxuSWNvbnZMaXRlRW5jb2RlclN0cmVhbS5wcm90b3R5cGUuX2ZsdXNoID0gZnVuY3Rpb24gKGRvbmUpIHtcbiAgdHJ5IHtcbiAgICB2YXIgcmVzID0gdGhpcy5jb252LmVuZCgpO1xuICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCkgdGhpcy5wdXNoKHJlcyk7XG4gICAgZG9uZSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZG9uZShlKTtcbiAgfVxufTtcblxuSWNvbnZMaXRlRW5jb2RlclN0cmVhbS5wcm90b3R5cGUuY29sbGVjdCA9IGZ1bmN0aW9uIChjYikge1xuICB2YXIgY2h1bmtzID0gW107XG4gIHRoaXMub24oJ2Vycm9yJywgY2IpO1xuICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICB9KTtcbiAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIGNiKG51bGwsIEJ1ZmZlciQ2LmNvbmNhdChjaHVua3MpKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTsgLy8gPT0gRGVjb2RlciBzdHJlYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5cbmZ1bmN0aW9uIEljb252TGl0ZURlY29kZXJTdHJlYW0oY29udiwgb3B0aW9ucykge1xuICB0aGlzLmNvbnYgPSBjb252O1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5lbmNvZGluZyA9IHRoaXMuZW5jb2RpbmcgPSAndXRmOCc7IC8vIFdlIG91dHB1dCBzdHJpbmdzLlxuXG4gIFRyYW5zZm9ybSQxLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cbkljb252TGl0ZURlY29kZXJTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShUcmFuc2Zvcm0kMS5wcm90b3R5cGUsIHtcbiAgY29uc3RydWN0b3I6IHtcbiAgICB2YWx1ZTogSWNvbnZMaXRlRGVjb2RlclN0cmVhbVxuICB9XG59KTtcblxuSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGRvbmUpIHtcbiAgaWYgKCFCdWZmZXIkNi5pc0J1ZmZlcihjaHVuaykpIHJldHVybiBkb25lKG5ldyBFcnJvcihcIkljb252IGRlY29kaW5nIHN0cmVhbSBuZWVkcyBidWZmZXJzIGFzIGl0cyBpbnB1dC5cIikpO1xuXG4gIHRyeSB7XG4gICAgdmFyIHJlcyA9IHRoaXMuY29udi53cml0ZShjaHVuayk7XG4gICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoKSB0aGlzLnB1c2gocmVzLCB0aGlzLmVuY29kaW5nKTtcbiAgICBkb25lKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkb25lKGUpO1xuICB9XG59O1xuXG5JY29udkxpdGVEZWNvZGVyU3RyZWFtLnByb3RvdHlwZS5fZmx1c2ggPSBmdW5jdGlvbiAoZG9uZSkge1xuICB0cnkge1xuICAgIHZhciByZXMgPSB0aGlzLmNvbnYuZW5kKCk7XG4gICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoKSB0aGlzLnB1c2gocmVzLCB0aGlzLmVuY29kaW5nKTtcbiAgICBkb25lKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkb25lKGUpO1xuICB9XG59O1xuXG5JY29udkxpdGVEZWNvZGVyU3RyZWFtLnByb3RvdHlwZS5jb2xsZWN0ID0gZnVuY3Rpb24gKGNiKSB7XG4gIHZhciByZXMgPSAnJztcbiAgdGhpcy5vbignZXJyb3InLCBjYik7XG4gIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICByZXMgKz0gY2h1bms7XG4gIH0pO1xuICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY2IobnVsbCwgcmVzKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxudmFyIEJ1ZmZlciQ3ID0gYnVmZmVyLkJ1ZmZlcjsgLy8gTm90ZTogbm90IHBvbHlmaWxsZWQgd2l0aCBzYWZlci1idWZmZXIgb24gYSBwdXJwb3NlLCBhcyBvdmVycmlkZXMgQnVmZmVyXG4vLyA9PSBFeHRlbmQgTm9kZSBwcmltaXRpdmVzIHRvIHVzZSBpY29udi1saXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG52YXIgZXh0ZW5kTm9kZSA9IGZ1bmN0aW9uIGV4dGVuZE5vZGUoaWNvbnYpIHtcbiAgdmFyIG9yaWdpbmFsID0gdW5kZWZpbmVkOyAvLyBQbGFjZSB0byBrZWVwIG9yaWdpbmFsIG1ldGhvZHMuXG4gIC8vIE5vZGUgYXV0aG9ycyByZXdyb3RlIEJ1ZmZlciBpbnRlcm5hbHMgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGhcbiAgLy8gVWludDhBcnJheSBhbmQgd2UgY2Fubm90IHBhdGNoIGtleSBmdW5jdGlvbnMgc2luY2UgdGhlbi5cbiAgLy8gTm90ZTogdGhpcyBkb2VzIHVzZSBvbGRlciBCdWZmZXIgQVBJIG9uIGEgcHVycG9zZVxuXG4gIGljb252LnN1cHBvcnRzTm9kZUVuY29kaW5nc0V4dGVuc2lvbiA9ICEoQnVmZmVyJDcuZnJvbSB8fCBuZXcgQnVmZmVyJDcoMCkgaW5zdGFuY2VvZiBVaW50OEFycmF5KTtcblxuICBpY29udi5leHRlbmROb2RlRW5jb2RpbmdzID0gZnVuY3Rpb24gZXh0ZW5kTm9kZUVuY29kaW5ncygpIHtcbiAgICBpZiAob3JpZ2luYWwpIHJldHVybjtcbiAgICBvcmlnaW5hbCA9IHt9O1xuXG4gICAgaWYgKCFpY29udi5zdXBwb3J0c05vZGVFbmNvZGluZ3NFeHRlbnNpb24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJBQ1RJT04gTkVFREVEOiByZXF1aXJlKCdpY29udi1saXRlJykuZXh0ZW5kTm9kZUVuY29kaW5ncygpIGlzIG5vdCBzdXBwb3J0ZWQgaW4geW91ciB2ZXJzaW9uIG9mIE5vZGVcIik7XG4gICAgICBjb25zb2xlLmVycm9yKFwiU2VlIG1vcmUgaW5mbyBhdCBodHRwczovL2dpdGh1Yi5jb20vYXNodHVjaGtpbi9pY29udi1saXRlL3dpa2kvTm9kZS12NC1jb21wYXRpYmlsaXR5XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBub2RlTmF0aXZlRW5jb2RpbmdzID0ge1xuICAgICAgJ2hleCc6IHRydWUsXG4gICAgICAndXRmOCc6IHRydWUsXG4gICAgICAndXRmLTgnOiB0cnVlLFxuICAgICAgJ2FzY2lpJzogdHJ1ZSxcbiAgICAgICdiaW5hcnknOiB0cnVlLFxuICAgICAgJ2Jhc2U2NCc6IHRydWUsXG4gICAgICAndWNzMic6IHRydWUsXG4gICAgICAndWNzLTInOiB0cnVlLFxuICAgICAgJ3V0ZjE2bGUnOiB0cnVlLFxuICAgICAgJ3V0Zi0xNmxlJzogdHJ1ZVxuICAgIH07XG5cbiAgICBCdWZmZXIkNy5pc05hdGl2ZUVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICAgICAgcmV0dXJuIGVuYyAmJiBub2RlTmF0aXZlRW5jb2RpbmdzW2VuYy50b0xvd2VyQ2FzZSgpXTtcbiAgICB9OyAvLyAtLSBTbG93QnVmZmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgIHZhciBTbG93QnVmZmVyID0gYnVmZmVyLlNsb3dCdWZmZXI7XG4gICAgb3JpZ2luYWwuU2xvd0J1ZmZlclRvU3RyaW5nID0gU2xvd0J1ZmZlci5wcm90b3R5cGUudG9TdHJpbmc7XG5cbiAgICBTbG93QnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICAgICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpOyAvLyBVc2UgbmF0aXZlIGNvbnZlcnNpb24gd2hlbiBwb3NzaWJsZVxuXG4gICAgICBpZiAoQnVmZmVyJDcuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykpIHJldHVybiBvcmlnaW5hbC5TbG93QnVmZmVyVG9TdHJpbmcuY2FsbCh0aGlzLCBlbmNvZGluZywgc3RhcnQsIGVuZCk7IC8vIE90aGVyd2lzZSwgdXNlIG91ciBkZWNvZGluZyBtZXRob2QuXG5cbiAgICAgIGlmICh0eXBlb2Ygc3RhcnQgPT0gJ3VuZGVmaW5lZCcpIHN0YXJ0ID0gMDtcbiAgICAgIGlmICh0eXBlb2YgZW5kID09ICd1bmRlZmluZWQnKSBlbmQgPSB0aGlzLmxlbmd0aDtcbiAgICAgIHJldHVybiBpY29udi5kZWNvZGUodGhpcy5zbGljZShzdGFydCwgZW5kKSwgZW5jb2RpbmcpO1xuICAgIH07XG5cbiAgICBvcmlnaW5hbC5TbG93QnVmZmVyV3JpdGUgPSBTbG93QnVmZmVyLnByb3RvdHlwZS53cml0ZTtcblxuICAgIFNsb3dCdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gICAgICAvLyBTdXBwb3J0IGJvdGggKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKVxuICAgICAgLy8gYW5kIHRoZSBsZWdhY3kgKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKVxuICAgICAgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICAgICAgaWYgKCFpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSBsZW5ndGg7XG4gICAgICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBsZWdhY3lcbiAgICAgICAgdmFyIHN3YXAgPSBlbmNvZGluZztcbiAgICAgICAgZW5jb2RpbmcgPSBvZmZzZXQ7XG4gICAgICAgIG9mZnNldCA9IGxlbmd0aDtcbiAgICAgICAgbGVuZ3RoID0gc3dhcDtcbiAgICAgIH1cblxuICAgICAgb2Zmc2V0ID0gK29mZnNldCB8fCAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0O1xuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZW5ndGggPSArbGVuZ3RoO1xuXG4gICAgICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpOyAvLyBVc2UgbmF0aXZlIGNvbnZlcnNpb24gd2hlbiBwb3NzaWJsZVxuXG4gICAgICBpZiAoQnVmZmVyJDcuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykpIHJldHVybiBvcmlnaW5hbC5TbG93QnVmZmVyV3JpdGUuY2FsbCh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZyk7XG4gICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHRocm93IG5ldyBSYW5nZUVycm9yKCdhdHRlbXB0IHRvIHdyaXRlIGJleW9uZCBidWZmZXIgYm91bmRzJyk7IC8vIE90aGVyd2lzZSwgdXNlIG91ciBlbmNvZGluZyBtZXRob2QuXG5cbiAgICAgIHZhciBidWYgPSBpY29udi5lbmNvZGUoc3RyaW5nLCBlbmNvZGluZyk7XG4gICAgICBpZiAoYnVmLmxlbmd0aCA8IGxlbmd0aCkgbGVuZ3RoID0gYnVmLmxlbmd0aDtcbiAgICAgIGJ1Zi5jb3B5KHRoaXMsIG9mZnNldCwgMCwgbGVuZ3RoKTtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfTsgLy8gLS0gQnVmZmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgICBvcmlnaW5hbC5CdWZmZXJJc0VuY29kaW5nID0gQnVmZmVyJDcuaXNFbmNvZGluZztcblxuICAgIEJ1ZmZlciQ3LmlzRW5jb2RpbmcgPSBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgICAgIHJldHVybiBCdWZmZXIkNy5pc05hdGl2ZUVuY29kaW5nKGVuY29kaW5nKSB8fCBpY29udi5lbmNvZGluZ0V4aXN0cyhlbmNvZGluZyk7XG4gICAgfTtcblxuICAgIG9yaWdpbmFsLkJ1ZmZlckJ5dGVMZW5ndGggPSBCdWZmZXIkNy5ieXRlTGVuZ3RoO1xuXG4gICAgQnVmZmVyJDcuYnl0ZUxlbmd0aCA9IFNsb3dCdWZmZXIuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uIChzdHIsIGVuY29kaW5nKSB7XG4gICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7IC8vIFVzZSBuYXRpdmUgY29udmVyc2lvbiB3aGVuIHBvc3NpYmxlXG5cbiAgICAgIGlmIChCdWZmZXIkNy5pc05hdGl2ZUVuY29kaW5nKGVuY29kaW5nKSkgcmV0dXJuIG9yaWdpbmFsLkJ1ZmZlckJ5dGVMZW5ndGguY2FsbCh0aGlzLCBzdHIsIGVuY29kaW5nKTsgLy8gU2xvdywgSSBrbm93LCBidXQgd2UgZG9uJ3QgaGF2ZSBhIGJldHRlciB3YXkgeWV0LlxuXG4gICAgICByZXR1cm4gaWNvbnYuZW5jb2RlKHN0ciwgZW5jb2RpbmcpLmxlbmd0aDtcbiAgICB9O1xuXG4gICAgb3JpZ2luYWwuQnVmZmVyVG9TdHJpbmcgPSBCdWZmZXIkNy5wcm90b3R5cGUudG9TdHJpbmc7XG5cbiAgICBCdWZmZXIkNy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKTsgLy8gVXNlIG5hdGl2ZSBjb252ZXJzaW9uIHdoZW4gcG9zc2libGVcblxuICAgICAgaWYgKEJ1ZmZlciQ3LmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpKSByZXR1cm4gb3JpZ2luYWwuQnVmZmVyVG9TdHJpbmcuY2FsbCh0aGlzLCBlbmNvZGluZywgc3RhcnQsIGVuZCk7IC8vIE90aGVyd2lzZSwgdXNlIG91ciBkZWNvZGluZyBtZXRob2QuXG5cbiAgICAgIGlmICh0eXBlb2Ygc3RhcnQgPT0gJ3VuZGVmaW5lZCcpIHN0YXJ0ID0gMDtcbiAgICAgIGlmICh0eXBlb2YgZW5kID09ICd1bmRlZmluZWQnKSBlbmQgPSB0aGlzLmxlbmd0aDtcbiAgICAgIHJldHVybiBpY29udi5kZWNvZGUodGhpcy5zbGljZShzdGFydCwgZW5kKSwgZW5jb2RpbmcpO1xuICAgIH07XG5cbiAgICBvcmlnaW5hbC5CdWZmZXJXcml0ZSA9IEJ1ZmZlciQ3LnByb3RvdHlwZS53cml0ZTtcblxuICAgIEJ1ZmZlciQ3LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAgICAgdmFyIF9vZmZzZXQgPSBvZmZzZXQsXG4gICAgICAgICAgX2xlbmd0aCA9IGxlbmd0aCxcbiAgICAgICAgICBfZW5jb2RpbmcgPSBlbmNvZGluZzsgLy8gU3VwcG9ydCBib3RoIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZylcbiAgICAgIC8vIGFuZCB0aGUgbGVnYWN5IChzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICAgICAgaWYgKCFpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSBsZW5ndGg7XG4gICAgICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBsZWdhY3lcbiAgICAgICAgdmFyIHN3YXAgPSBlbmNvZGluZztcbiAgICAgICAgZW5jb2RpbmcgPSBvZmZzZXQ7XG4gICAgICAgIG9mZnNldCA9IGxlbmd0aDtcbiAgICAgICAgbGVuZ3RoID0gc3dhcDtcbiAgICAgIH1cblxuICAgICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpOyAvLyBVc2UgbmF0aXZlIGNvbnZlcnNpb24gd2hlbiBwb3NzaWJsZVxuXG4gICAgICBpZiAoQnVmZmVyJDcuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykpIHJldHVybiBvcmlnaW5hbC5CdWZmZXJXcml0ZS5jYWxsKHRoaXMsIHN0cmluZywgX29mZnNldCwgX2xlbmd0aCwgX2VuY29kaW5nKTtcbiAgICAgIG9mZnNldCA9ICtvZmZzZXQgfHwgMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldDtcblxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVuZ3RoID0gK2xlbmd0aDtcblxuICAgICAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICAgICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2F0dGVtcHQgdG8gd3JpdGUgYmV5b25kIGJ1ZmZlciBib3VuZHMnKTsgLy8gT3RoZXJ3aXNlLCB1c2Ugb3VyIGVuY29kaW5nIG1ldGhvZC5cblxuICAgICAgdmFyIGJ1ZiA9IGljb252LmVuY29kZShzdHJpbmcsIGVuY29kaW5nKTtcbiAgICAgIGlmIChidWYubGVuZ3RoIDwgbGVuZ3RoKSBsZW5ndGggPSBidWYubGVuZ3RoO1xuICAgICAgYnVmLmNvcHkodGhpcywgb2Zmc2V0LCAwLCBsZW5ndGgpO1xuICAgICAgcmV0dXJuIGxlbmd0aDsgLy8gVE9ETzogU2V0IF9jaGFyc1dyaXR0ZW4uXG4gICAgfTsgLy8gLS0gUmVhZGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgICBpZiAoaWNvbnYuc3VwcG9ydHNTdHJlYW1zKSB7XG4gICAgICB2YXIgUmVhZGFibGUgPSBTdHJlYW0uUmVhZGFibGU7XG4gICAgICBvcmlnaW5hbC5SZWFkYWJsZVNldEVuY29kaW5nID0gUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nO1xuXG4gICAgICBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXRFbmNvZGluZyhlbmMsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gVXNlIG91ciBvd24gZGVjb2RlciwgaXQgaGFzIHRoZSBzYW1lIGludGVyZmFjZS5cbiAgICAgICAgLy8gV2UgY2Fubm90IHVzZSBvcmlnaW5hbCBmdW5jdGlvbiBhcyBpdCBkb2Vzbid0IGhhbmRsZSBCT00tcy5cbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gaWNvbnYuZ2V0RGVjb2RlcihlbmMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICAgICAgfTtcblxuICAgICAgUmVhZGFibGUucHJvdG90eXBlLmNvbGxlY3QgPSBpY29udi5fY29sbGVjdDtcbiAgICB9XG4gIH07IC8vIFJlbW92ZSBpY29udi1saXRlIE5vZGUgcHJpbWl0aXZlIGV4dGVuc2lvbnMuXG5cblxuICBpY29udi51bmRvRXh0ZW5kTm9kZUVuY29kaW5ncyA9IGZ1bmN0aW9uIHVuZG9FeHRlbmROb2RlRW5jb2RpbmdzKCkge1xuICAgIGlmICghaWNvbnYuc3VwcG9ydHNOb2RlRW5jb2RpbmdzRXh0ZW5zaW9uKSByZXR1cm47XG4gICAgaWYgKCFvcmlnaW5hbCkgdGhyb3cgbmV3IEVycm9yKFwicmVxdWlyZSgnaWNvbnYtbGl0ZScpLnVuZG9FeHRlbmROb2RlRW5jb2RpbmdzKCk6IE5vdGhpbmcgdG8gdW5kbzsgZXh0ZW5kTm9kZUVuY29kaW5ncygpIGlzIG5vdCBjYWxsZWQuXCIpO1xuICAgIGRlbGV0ZSBCdWZmZXIkNy5pc05hdGl2ZUVuY29kaW5nO1xuICAgIHZhciBTbG93QnVmZmVyID0gYnVmZmVyLlNsb3dCdWZmZXI7XG4gICAgU2xvd0J1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBvcmlnaW5hbC5TbG93QnVmZmVyVG9TdHJpbmc7XG4gICAgU2xvd0J1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBvcmlnaW5hbC5TbG93QnVmZmVyV3JpdGU7XG4gICAgQnVmZmVyJDcuaXNFbmNvZGluZyA9IG9yaWdpbmFsLkJ1ZmZlcklzRW5jb2Rpbmc7XG4gICAgQnVmZmVyJDcuYnl0ZUxlbmd0aCA9IG9yaWdpbmFsLkJ1ZmZlckJ5dGVMZW5ndGg7XG4gICAgQnVmZmVyJDcucHJvdG90eXBlLnRvU3RyaW5nID0gb3JpZ2luYWwuQnVmZmVyVG9TdHJpbmc7XG4gICAgQnVmZmVyJDcucHJvdG90eXBlLndyaXRlID0gb3JpZ2luYWwuQnVmZmVyV3JpdGU7XG5cbiAgICBpZiAoaWNvbnYuc3VwcG9ydHNTdHJlYW1zKSB7XG4gICAgICB2YXIgUmVhZGFibGUgPSBTdHJlYW0uUmVhZGFibGU7XG4gICAgICBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBvcmlnaW5hbC5SZWFkYWJsZVNldEVuY29kaW5nO1xuICAgICAgZGVsZXRlIFJlYWRhYmxlLnByb3RvdHlwZS5jb2xsZWN0O1xuICAgIH1cblxuICAgIG9yaWdpbmFsID0gdW5kZWZpbmVkO1xuICB9O1xufTtcblxudmFyIGxpYiA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gU29sdXRpb24gd291bGQgYmUgaW5zdGFsbGluZyBucG0gbW9kdWxlcyBcImJ1ZmZlclwiIGFuZCBcInN0cmVhbVwiIGV4cGxpY2l0bHkuXG5cbiAgdmFyIEJ1ZmZlciA9IHNhZmVyXzEuQnVmZmVyO1xuICB2YXIgaWNvbnYgPSBtb2R1bGUuZXhwb3J0czsgLy8gQWxsIGNvZGVjcyBhbmQgYWxpYXNlcyBhcmUga2VwdCBoZXJlLCBrZXllZCBieSBlbmNvZGluZyBuYW1lL2FsaWFzLlxuICAvLyBUaGV5IGFyZSBsYXp5IGxvYWRlZCBpbiBgaWNvbnYuZ2V0Q29kZWNgIGZyb20gYGVuY29kaW5ncy9pbmRleC5qc2AuXG5cbiAgaWNvbnYuZW5jb2RpbmdzID0gbnVsbDsgLy8gQ2hhcmFjdGVycyBlbWl0dGVkIGluIGNhc2Ugb2YgZXJyb3IuXG5cbiAgaWNvbnYuZGVmYXVsdENoYXJVbmljb2RlID0gJ++/vSc7XG4gIGljb252LmRlZmF1bHRDaGFyU2luZ2xlQnl0ZSA9ICc/JzsgLy8gUHVibGljIEFQSS5cblxuICBpY29udi5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyLCBlbmNvZGluZywgb3B0aW9ucykge1xuICAgIHN0ciA9IFwiXCIgKyAoc3RyIHx8IFwiXCIpOyAvLyBFbnN1cmUgc3RyaW5nLlxuXG4gICAgdmFyIGVuY29kZXIgPSBpY29udi5nZXRFbmNvZGVyKGVuY29kaW5nLCBvcHRpb25zKTtcbiAgICB2YXIgcmVzID0gZW5jb2Rlci53cml0ZShzdHIpO1xuICAgIHZhciB0cmFpbCA9IGVuY29kZXIuZW5kKCk7XG4gICAgcmV0dXJuIHRyYWlsICYmIHRyYWlsLmxlbmd0aCA+IDAgPyBCdWZmZXIuY29uY2F0KFtyZXMsIHRyYWlsXSkgOiByZXM7XG4gIH07XG5cbiAgaWNvbnYuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGJ1ZiwgZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIGJ1ZiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICghaWNvbnYuc2tpcERlY29kZVdhcm5pbmcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignSWNvbnYtbGl0ZSB3YXJuaW5nOiBkZWNvZGUoKS1pbmcgc3RyaW5ncyBpcyBkZXByZWNhdGVkLiBSZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vYXNodHVjaGtpbi9pY29udi1saXRlL3dpa2kvVXNlLUJ1ZmZlcnMtd2hlbi1kZWNvZGluZycpO1xuICAgICAgICBpY29udi5za2lwRGVjb2RlV2FybmluZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKFwiXCIgKyAoYnVmIHx8IFwiXCIpLCBcImJpbmFyeVwiKTsgLy8gRW5zdXJlIGJ1ZmZlci5cbiAgICB9XG5cbiAgICB2YXIgZGVjb2RlciA9IGljb252LmdldERlY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpO1xuICAgIHZhciByZXMgPSBkZWNvZGVyLndyaXRlKGJ1Zik7XG4gICAgdmFyIHRyYWlsID0gZGVjb2Rlci5lbmQoKTtcbiAgICByZXR1cm4gdHJhaWwgPyByZXMgKyB0cmFpbCA6IHJlcztcbiAgfTtcblxuICBpY29udi5lbmNvZGluZ0V4aXN0cyA9IGZ1bmN0aW9uIGVuY29kaW5nRXhpc3RzKGVuYykge1xuICAgIHRyeSB7XG4gICAgICBpY29udi5nZXRDb2RlYyhlbmMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTsgLy8gTGVnYWN5IGFsaWFzZXMgdG8gY29udmVydCBmdW5jdGlvbnNcblxuXG4gIGljb252LnRvRW5jb2RpbmcgPSBpY29udi5lbmNvZGU7XG4gIGljb252LmZyb21FbmNvZGluZyA9IGljb252LmRlY29kZTsgLy8gU2VhcmNoIGZvciBhIGNvZGVjIGluIGljb252LmVuY29kaW5ncy4gQ2FjaGUgY29kZWMgZGF0YSBpbiBpY29udi5fY29kZWNEYXRhQ2FjaGUuXG5cbiAgaWNvbnYuX2NvZGVjRGF0YUNhY2hlID0ge307XG5cbiAgaWNvbnYuZ2V0Q29kZWMgPSBmdW5jdGlvbiBnZXRDb2RlYyhlbmNvZGluZykge1xuICAgIGlmICghaWNvbnYuZW5jb2RpbmdzKSBpY29udi5lbmNvZGluZ3MgPSBlbmNvZGluZ3M7IC8vIExhenkgbG9hZCBhbGwgZW5jb2RpbmcgZGVmaW5pdGlvbnMuXG4gICAgLy8gQ2Fub25pY2FsaXplIGVuY29kaW5nIG5hbWU6IHN0cmlwIGFsbCBub24tYWxwaGFudW1lcmljIGNoYXJzIGFuZCBhcHBlbmRlZCB5ZWFyLlxuXG4gICAgdmFyIGVuYyA9IGljb252Ll9jYW5vbmljYWxpemVFbmNvZGluZyhlbmNvZGluZyk7IC8vIFRyYXZlcnNlIGljb252LmVuY29kaW5ncyB0byBmaW5kIGFjdHVhbCBjb2RlYy5cblxuXG4gICAgdmFyIGNvZGVjT3B0aW9ucyA9IHt9O1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHZhciBjb2RlYyA9IGljb252Ll9jb2RlY0RhdGFDYWNoZVtlbmNdO1xuICAgICAgaWYgKGNvZGVjKSByZXR1cm4gY29kZWM7XG4gICAgICB2YXIgY29kZWNEZWYgPSBpY29udi5lbmNvZGluZ3NbZW5jXTtcblxuICAgICAgc3dpdGNoICh0eXBlb2YgY29kZWNEZWYpIHtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgIC8vIERpcmVjdCBhbGlhcyB0byBvdGhlciBlbmNvZGluZy5cbiAgICAgICAgICBlbmMgPSBjb2RlY0RlZjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgLy8gQWxpYXMgd2l0aCBvcHRpb25zLiBDYW4gYmUgbGF5ZXJlZC5cbiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29kZWNEZWYpIHtcbiAgICAgICAgICAgIGNvZGVjT3B0aW9uc1trZXldID0gY29kZWNEZWZba2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWUpIGNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWUgPSBlbmM7XG4gICAgICAgICAgZW5jID0gY29kZWNEZWYudHlwZTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAvLyBDb2RlYyBpdHNlbGYuXG4gICAgICAgICAgaWYgKCFjb2RlY09wdGlvbnMuZW5jb2RpbmdOYW1lKSBjb2RlY09wdGlvbnMuZW5jb2RpbmdOYW1lID0gZW5jOyAvLyBUaGUgY29kZWMgZnVuY3Rpb24gbXVzdCBsb2FkIGFsbCB0YWJsZXMgYW5kIHJldHVybiBvYmplY3Qgd2l0aCAuZW5jb2RlciBhbmQgLmRlY29kZXIgbWV0aG9kcy5cbiAgICAgICAgICAvLyBJdCdsbCBiZSBjYWxsZWQgb25seSBvbmNlIChmb3IgZWFjaCBkaWZmZXJlbnQgb3B0aW9ucyBvYmplY3QpLlxuXG4gICAgICAgICAgY29kZWMgPSBuZXcgY29kZWNEZWYoY29kZWNPcHRpb25zLCBpY29udik7XG4gICAgICAgICAgaWNvbnYuX2NvZGVjRGF0YUNhY2hlW2NvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWVdID0gY29kZWM7IC8vIFNhdmUgaXQgdG8gYmUgcmV1c2VkIGxhdGVyLlxuXG4gICAgICAgICAgcmV0dXJuIGNvZGVjO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5jb2Rpbmcgbm90IHJlY29nbml6ZWQ6ICdcIiArIGVuY29kaW5nICsgXCInIChzZWFyY2hlZCBhczogJ1wiICsgZW5jICsgXCInKVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgaWNvbnYuX2Nhbm9uaWNhbGl6ZUVuY29kaW5nID0gZnVuY3Rpb24gKGVuY29kaW5nKSB7XG4gICAgLy8gQ2Fub25pY2FsaXplIGVuY29kaW5nIG5hbWU6IHN0cmlwIGFsbCBub24tYWxwaGFudW1lcmljIGNoYXJzIGFuZCBhcHBlbmRlZCB5ZWFyLlxuICAgIHJldHVybiAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC86XFxkezR9JHxbXjAtOWEtel0vZywgXCJcIik7XG4gIH07XG5cbiAgaWNvbnYuZ2V0RW5jb2RlciA9IGZ1bmN0aW9uIGdldEVuY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICB2YXIgY29kZWMgPSBpY29udi5nZXRDb2RlYyhlbmNvZGluZyksXG4gICAgICAgIGVuY29kZXIgPSBuZXcgY29kZWMuZW5jb2RlcihvcHRpb25zLCBjb2RlYyk7XG4gICAgaWYgKGNvZGVjLmJvbUF3YXJlICYmIG9wdGlvbnMgJiYgb3B0aW9ucy5hZGRCT00pIGVuY29kZXIgPSBuZXcgYm9tSGFuZGxpbmcuUHJlcGVuZEJPTShlbmNvZGVyLCBvcHRpb25zKTtcbiAgICByZXR1cm4gZW5jb2RlcjtcbiAgfTtcblxuICBpY29udi5nZXREZWNvZGVyID0gZnVuY3Rpb24gZ2V0RGVjb2RlcihlbmNvZGluZywgb3B0aW9ucykge1xuICAgIHZhciBjb2RlYyA9IGljb252LmdldENvZGVjKGVuY29kaW5nKSxcbiAgICAgICAgZGVjb2RlciA9IG5ldyBjb2RlYy5kZWNvZGVyKG9wdGlvbnMsIGNvZGVjKTtcbiAgICBpZiAoY29kZWMuYm9tQXdhcmUgJiYgIShvcHRpb25zICYmIG9wdGlvbnMuc3RyaXBCT00gPT09IGZhbHNlKSkgZGVjb2RlciA9IG5ldyBib21IYW5kbGluZy5TdHJpcEJPTShkZWNvZGVyLCBvcHRpb25zKTtcbiAgICByZXR1cm4gZGVjb2RlcjtcbiAgfTsgLy8gTG9hZCBleHRlbnNpb25zIGluIE5vZGUuIEFsbCBvZiB0aGVtIGFyZSBvbWl0dGVkIGluIEJyb3dzZXJpZnkgYnVpbGQgdmlhICdicm93c2VyJyBmaWVsZCBpbiBwYWNrYWdlLmpzb24uXG5cblxuICB2YXIgbm9kZVZlciA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZTtcblxuICBpZiAobm9kZVZlcikge1xuICAgIC8vIExvYWQgc3RyZWFtaW5nIHN1cHBvcnQgaW4gTm9kZSB2MC4xMCtcbiAgICB2YXIgbm9kZVZlckFyciA9IG5vZGVWZXIuc3BsaXQoXCIuXCIpLm1hcChOdW1iZXIpO1xuXG4gICAgaWYgKG5vZGVWZXJBcnJbMF0gPiAwIHx8IG5vZGVWZXJBcnJbMV0gPj0gMTApIHtcbiAgICAgIHN0cmVhbXMoaWNvbnYpO1xuICAgIH0gLy8gTG9hZCBOb2RlIHByaW1pdGl2ZSBleHRlbnNpb25zLlxuXG5cbiAgICBleHRlbmROb2RlKGljb252KTtcbiAgfVxufSk7XG5cbnZhciBEZWNvZGVTdHJlYW0gPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgRGVjb2RlU3RyZWFtLCBpY29udjtcblxuICAgIHRyeSB7XG4gICAgICBpY29udiA9IGxpYjtcbiAgICB9IGNhdGNoIChfZXJyb3IpIHt9XG5cbiAgICBEZWNvZGVTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIga2V5O1xuXG4gICAgICBmdW5jdGlvbiBEZWNvZGVTdHJlYW0oYnVmZmVyKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBEZWNvZGVTdHJlYW0uVFlQRVMgPSB7XG4gICAgICAgIFVJbnQ4OiAxLFxuICAgICAgICBVSW50MTY6IDIsXG4gICAgICAgIFVJbnQyNDogMyxcbiAgICAgICAgVUludDMyOiA0LFxuICAgICAgICBJbnQ4OiAxLFxuICAgICAgICBJbnQxNjogMixcbiAgICAgICAgSW50MjQ6IDMsXG4gICAgICAgIEludDMyOiA0LFxuICAgICAgICBGbG9hdDogNCxcbiAgICAgICAgRG91YmxlOiA4XG4gICAgICB9O1xuXG4gICAgICBmb3IgKGtleSBpbiBidWZmZXJfMS5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKGtleS5zbGljZSgwLCA0KSA9PT0gJ3JlYWQnKSB7XG4gICAgICAgICAgKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHZhciBieXRlcztcbiAgICAgICAgICAgIGJ5dGVzID0gRGVjb2RlU3RyZWFtLlRZUEVTW2tleS5yZXBsYWNlKC9yZWFkfFtCTF1FL2csICcnKV07XG4gICAgICAgICAgICByZXR1cm4gRGVjb2RlU3RyZWFtLnByb3RvdHlwZVtrZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgcmV0O1xuICAgICAgICAgICAgICByZXQgPSB0aGlzLmJ1ZmZlcltrZXldKHRoaXMucG9zKTtcbiAgICAgICAgICAgICAgdGhpcy5wb3MgKz0gYnl0ZXM7XG4gICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24gKGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgICAgICAgdmFyIGJ1ZiwgX2J5dGUsIGksIF9pLCBfcmVmO1xuXG4gICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSAnYXNjaWknO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci50b1N0cmluZyhlbmNvZGluZywgdGhpcy5wb3MsIHRoaXMucG9zICs9IGxlbmd0aCk7XG5cbiAgICAgICAgICBjYXNlICd1dGYxNmJlJzpcbiAgICAgICAgICAgIGJ1ZiA9IG5ldyBidWZmZXJfMSh0aGlzLnJlYWRCdWZmZXIobGVuZ3RoKSk7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IF9pID0gMCwgX3JlZiA9IGJ1Zi5sZW5ndGggLSAxOyBfaSA8IF9yZWY7IGkgPSBfaSArPSAyKSB7XG4gICAgICAgICAgICAgIF9ieXRlID0gYnVmW2ldO1xuICAgICAgICAgICAgICBidWZbaV0gPSBidWZbaSArIDFdO1xuICAgICAgICAgICAgICBidWZbaSArIDFdID0gX2J5dGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoJ3V0ZjE2bGUnKTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBidWYgPSB0aGlzLnJlYWRCdWZmZXIobGVuZ3RoKTtcblxuICAgICAgICAgICAgaWYgKGljb252KSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGljb252LmRlY29kZShidWYsIGVuY29kaW5nKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7fVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYnVmO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnJlYWRCdWZmZXIgPSBmdW5jdGlvbiAobGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zbGljZSh0aGlzLnBvcywgdGhpcy5wb3MgKz0gbGVuZ3RoKTtcbiAgICAgIH07XG5cbiAgICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUucmVhZFVJbnQyNEJFID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucmVhZFVJbnQxNkJFKCkgPDwgOCkgKyB0aGlzLnJlYWRVSW50OCgpO1xuICAgICAgfTtcblxuICAgICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5yZWFkVUludDI0TEUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRVSW50MTZMRSgpICsgKHRoaXMucmVhZFVJbnQ4KCkgPDwgMTYpO1xuICAgICAgfTtcblxuICAgICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5yZWFkSW50MjRCRSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnJlYWRJbnQxNkJFKCkgPDwgOCkgKyB0aGlzLnJlYWRVSW50OCgpO1xuICAgICAgfTtcblxuICAgICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5yZWFkSW50MjRMRSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFVJbnQxNkxFKCkgKyAodGhpcy5yZWFkSW50OCgpIDw8IDE2KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBEZWNvZGVTdHJlYW07XG4gICAgfSgpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBEZWNvZGVTdHJlYW07XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBFbmNvZGVTdHJlYW0gPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgRGVjb2RlU3RyZWFtJDEsXG4gICAgICAgIEVuY29kZVN0cmVhbSxcbiAgICAgICAgaWNvbnYsXG4gICAgICAgIHN0cmVhbSxcbiAgICAgICAgX19oYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHksXG4gICAgICAgIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uIF9fZXh0ZW5kcyhjaGlsZCwgcGFyZW50KSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7XG4gICAgICAgIGlmIChfX2hhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY3RvcigpIHtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgICAgfVxuXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpO1xuICAgICAgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuXG4gICAgc3RyZWFtID0gU3RyZWFtO1xuICAgIERlY29kZVN0cmVhbSQxID0gRGVjb2RlU3RyZWFtO1xuXG4gICAgdHJ5IHtcbiAgICAgIGljb252ID0gbGliO1xuICAgIH0gY2F0Y2ggKF9lcnJvcikge31cblxuICAgIEVuY29kZVN0cmVhbSA9IGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIHZhciBrZXk7XG5cbiAgICAgIF9fZXh0ZW5kcyhFbmNvZGVTdHJlYW0sIF9zdXBlcik7XG5cbiAgICAgIGZ1bmN0aW9uIEVuY29kZVN0cmVhbShidWZmZXJTaXplKSB7XG4gICAgICAgIGlmIChidWZmZXJTaXplID09IG51bGwpIHtcbiAgICAgICAgICBidWZmZXJTaXplID0gNjU1MzY7XG4gICAgICAgIH1cblxuICAgICAgICBFbmNvZGVTdHJlYW0uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgYnVmZmVyXzEoYnVmZmVyU2l6ZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGtleSBpbiBidWZmZXJfMS5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKGtleS5zbGljZSgwLCA1KSA9PT0gJ3dyaXRlJykge1xuICAgICAgICAgIChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICB2YXIgYnl0ZXM7XG4gICAgICAgICAgICBieXRlcyA9ICtEZWNvZGVTdHJlYW0kMS5UWVBFU1trZXkucmVwbGFjZSgvd3JpdGV8W0JMXUUvZywgJycpXTtcbiAgICAgICAgICAgIHJldHVybiBFbmNvZGVTdHJlYW0ucHJvdG90eXBlW2tleV0gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5lbnN1cmUoYnl0ZXMpO1xuICAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltrZXldKHZhbHVlLCB0aGlzLmJ1ZmZlck9mZnNldCk7XG4gICAgICAgICAgICAgIHRoaXMuYnVmZmVyT2Zmc2V0ICs9IGJ5dGVzO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wb3MgKz0gYnl0ZXM7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgRW5jb2RlU3RyZWFtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgICBFbmNvZGVTdHJlYW0ucHJvdG90eXBlLmVuc3VyZSA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgICAgICBpZiAodGhpcy5idWZmZXJPZmZzZXQgKyBieXRlcyA+IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIEVuY29kZVN0cmVhbS5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlck9mZnNldCA+IDApIHtcbiAgICAgICAgICB0aGlzLnB1c2gobmV3IGJ1ZmZlcl8xKHRoaXMuYnVmZmVyLnNsaWNlKDAsIHRoaXMuYnVmZmVyT2Zmc2V0KSkpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlck9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIEVuY29kZVN0cmVhbS5wcm90b3R5cGUud3JpdGVCdWZmZXIgPSBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgdGhpcy5wdXNoKGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgfTtcblxuICAgICAgRW5jb2RlU3RyZWFtLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gICAgICAgIHZhciBidWYsIF9ieXRlLCBpLCBfaSwgX3JlZjtcblxuICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkge1xuICAgICAgICAgIGVuY29kaW5nID0gJ2FzY2lpJztcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgICAgICBjYXNlICd1Y3MyJzpcbiAgICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlcihuZXcgYnVmZmVyXzEoc3RyaW5nLCBlbmNvZGluZykpO1xuXG4gICAgICAgICAgY2FzZSAndXRmMTZiZSc6XG4gICAgICAgICAgICBidWYgPSBuZXcgYnVmZmVyXzEoc3RyaW5nLCAndXRmMTZsZScpO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSBfaSA9IDAsIF9yZWYgPSBidWYubGVuZ3RoIC0gMTsgX2kgPCBfcmVmOyBpID0gX2kgKz0gMikge1xuICAgICAgICAgICAgICBfYnl0ZSA9IGJ1ZltpXTtcbiAgICAgICAgICAgICAgYnVmW2ldID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgICAgYnVmW2kgKyAxXSA9IF9ieXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlcihidWYpO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChpY29udikge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlcihpY29udi5lbmNvZGUoc3RyaW5nLCBlbmNvZGluZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN0YWxsIGljb252LWxpdGUgdG8gZW5hYmxlIGFkZGl0aW9uYWwgc3RyaW5nIGVuY29kaW5ncy4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBFbmNvZGVTdHJlYW0ucHJvdG90eXBlLndyaXRlVUludDI0QkUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlKDMpO1xuICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZnNldCsrXSA9IHZhbCA+Pj4gMTYgJiAweGZmO1xuICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZnNldCsrXSA9IHZhbCA+Pj4gOCAmIDB4ZmY7XG4gICAgICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyT2Zmc2V0KytdID0gdmFsICYgMHhmZjtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICs9IDM7XG4gICAgICB9O1xuXG4gICAgICBFbmNvZGVTdHJlYW0ucHJvdG90eXBlLndyaXRlVUludDI0TEUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlKDMpO1xuICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZnNldCsrXSA9IHZhbCAmIDB4ZmY7XG4gICAgICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyT2Zmc2V0KytdID0gdmFsID4+PiA4ICYgMHhmZjtcbiAgICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmZzZXQrK10gPSB2YWwgPj4+IDE2ICYgMHhmZjtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICs9IDM7XG4gICAgICB9O1xuXG4gICAgICBFbmNvZGVTdHJlYW0ucHJvdG90eXBlLndyaXRlSW50MjRCRSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgaWYgKHZhbCA+PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVVSW50MjRCRSh2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlVUludDI0QkUodmFsICsgMHhmZmZmZmYgKyAxKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgRW5jb2RlU3RyZWFtLnByb3RvdHlwZS53cml0ZUludDI0TEUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIGlmICh2YWwgPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlVUludDI0TEUodmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZVVJbnQyNExFKHZhbCArIDB4ZmZmZmZmICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIEVuY29kZVN0cmVhbS5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uICh2YWwsIGxlbmd0aCkge1xuICAgICAgICB2YXIgYnVmO1xuXG4gICAgICAgIGlmIChsZW5ndGggPCB0aGlzLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmVuc3VyZShsZW5ndGgpO1xuICAgICAgICAgIHRoaXMuYnVmZmVyLmZpbGwodmFsLCB0aGlzLmJ1ZmZlck9mZnNldCwgdGhpcy5idWZmZXJPZmZzZXQgKyBsZW5ndGgpO1xuICAgICAgICAgIHRoaXMuYnVmZmVyT2Zmc2V0ICs9IGxlbmd0aDtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wb3MgKz0gbGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZiA9IG5ldyBidWZmZXJfMShsZW5ndGgpO1xuICAgICAgICAgIGJ1Zi5maWxsKHZhbCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXIoYnVmKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgRW5jb2RlU3RyZWFtLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVzaChudWxsKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBFbmNvZGVTdHJlYW07XG4gICAgfShzdHJlYW0uUmVhZGFibGUpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBFbmNvZGVTdHJlYW07XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBfTnVtYmVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIERlY29kZVN0cmVhbSQxLFxuICAgICAgICBGaXhlZCxcbiAgICAgICAgTnVtYmVyVCxcbiAgICAgICAgX19oYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHksXG4gICAgICAgIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uIF9fZXh0ZW5kcyhjaGlsZCwgcGFyZW50KSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7XG4gICAgICAgIGlmIChfX2hhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY3RvcigpIHtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgICAgfVxuXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpO1xuICAgICAgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuXG4gICAgRGVjb2RlU3RyZWFtJDEgPSBEZWNvZGVTdHJlYW07XG5cbiAgICBOdW1iZXJUID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gTnVtYmVyVCh0eXBlLCBlbmRpYW4pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5lbmRpYW4gPSBlbmRpYW4gIT0gbnVsbCA/IGVuZGlhbiA6ICdCRSc7XG4gICAgICAgIHRoaXMuZm4gPSB0aGlzLnR5cGU7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZVt0aGlzLnR5cGUubGVuZ3RoIC0gMV0gIT09ICc4Jykge1xuICAgICAgICAgIHRoaXMuZm4gKz0gdGhpcy5lbmRpYW47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgTnVtYmVyVC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIERlY29kZVN0cmVhbSQxLlRZUEVTW3RoaXMudHlwZV07XG4gICAgICB9O1xuXG4gICAgICBOdW1iZXJULnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW1bJ3JlYWQnICsgdGhpcy5mbl0oKTtcbiAgICAgIH07XG5cbiAgICAgIE51bWJlclQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHZhbCkge1xuICAgICAgICByZXR1cm4gc3RyZWFtWyd3cml0ZScgKyB0aGlzLmZuXSh2YWwpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIE51bWJlclQ7XG4gICAgfSgpO1xuXG4gICAgZXhwb3J0cy5OdW1iZXIgPSBOdW1iZXJUO1xuICAgIGV4cG9ydHMudWludDggPSBuZXcgTnVtYmVyVCgnVUludDgnKTtcbiAgICBleHBvcnRzLnVpbnQxNmJlID0gZXhwb3J0cy51aW50MTYgPSBuZXcgTnVtYmVyVCgnVUludDE2JywgJ0JFJyk7XG4gICAgZXhwb3J0cy51aW50MTZsZSA9IG5ldyBOdW1iZXJUKCdVSW50MTYnLCAnTEUnKTtcbiAgICBleHBvcnRzLnVpbnQyNGJlID0gZXhwb3J0cy51aW50MjQgPSBuZXcgTnVtYmVyVCgnVUludDI0JywgJ0JFJyk7XG4gICAgZXhwb3J0cy51aW50MjRsZSA9IG5ldyBOdW1iZXJUKCdVSW50MjQnLCAnTEUnKTtcbiAgICBleHBvcnRzLnVpbnQzMmJlID0gZXhwb3J0cy51aW50MzIgPSBuZXcgTnVtYmVyVCgnVUludDMyJywgJ0JFJyk7XG4gICAgZXhwb3J0cy51aW50MzJsZSA9IG5ldyBOdW1iZXJUKCdVSW50MzInLCAnTEUnKTtcbiAgICBleHBvcnRzLmludDggPSBuZXcgTnVtYmVyVCgnSW50OCcpO1xuICAgIGV4cG9ydHMuaW50MTZiZSA9IGV4cG9ydHMuaW50MTYgPSBuZXcgTnVtYmVyVCgnSW50MTYnLCAnQkUnKTtcbiAgICBleHBvcnRzLmludDE2bGUgPSBuZXcgTnVtYmVyVCgnSW50MTYnLCAnTEUnKTtcbiAgICBleHBvcnRzLmludDI0YmUgPSBleHBvcnRzLmludDI0ID0gbmV3IE51bWJlclQoJ0ludDI0JywgJ0JFJyk7XG4gICAgZXhwb3J0cy5pbnQyNGxlID0gbmV3IE51bWJlclQoJ0ludDI0JywgJ0xFJyk7XG4gICAgZXhwb3J0cy5pbnQzMmJlID0gZXhwb3J0cy5pbnQzMiA9IG5ldyBOdW1iZXJUKCdJbnQzMicsICdCRScpO1xuICAgIGV4cG9ydHMuaW50MzJsZSA9IG5ldyBOdW1iZXJUKCdJbnQzMicsICdMRScpO1xuICAgIGV4cG9ydHMuZmxvYXRiZSA9IGV4cG9ydHNbXCJmbG9hdFwiXSA9IG5ldyBOdW1iZXJUKCdGbG9hdCcsICdCRScpO1xuICAgIGV4cG9ydHMuZmxvYXRsZSA9IG5ldyBOdW1iZXJUKCdGbG9hdCcsICdMRScpO1xuICAgIGV4cG9ydHMuZG91YmxlYmUgPSBleHBvcnRzW1wiZG91YmxlXCJdID0gbmV3IE51bWJlclQoJ0RvdWJsZScsICdCRScpO1xuICAgIGV4cG9ydHMuZG91YmxlbGUgPSBuZXcgTnVtYmVyVCgnRG91YmxlJywgJ0xFJyk7XG5cbiAgICBGaXhlZCA9IGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyhGaXhlZCwgX3N1cGVyKTtcblxuICAgICAgZnVuY3Rpb24gRml4ZWQoc2l6ZSwgZW5kaWFuLCBmcmFjQml0cykge1xuICAgICAgICBpZiAoZnJhY0JpdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGZyYWNCaXRzID0gc2l6ZSA+PiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgRml4ZWQuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgXCJJbnRcIiArIHNpemUsIGVuZGlhbik7XG5cbiAgICAgICAgdGhpcy5fcG9pbnQgPSAxIDw8IGZyYWNCaXRzO1xuICAgICAgfVxuXG4gICAgICBGaXhlZC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICByZXR1cm4gRml4ZWQuX19zdXBlcl9fLmRlY29kZS5jYWxsKHRoaXMsIHN0cmVhbSkgLyB0aGlzLl9wb2ludDtcbiAgICAgIH07XG5cbiAgICAgIEZpeGVkLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIEZpeGVkLl9fc3VwZXJfXy5lbmNvZGUuY2FsbCh0aGlzLCBzdHJlYW0sIHZhbCAqIHRoaXMuX3BvaW50IHwgMCk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gRml4ZWQ7XG4gICAgfShOdW1iZXJUKTtcblxuICAgIGV4cG9ydHMuRml4ZWQgPSBGaXhlZDtcbiAgICBleHBvcnRzLmZpeGVkMTZiZSA9IGV4cG9ydHMuZml4ZWQxNiA9IG5ldyBGaXhlZCgxNiwgJ0JFJyk7XG4gICAgZXhwb3J0cy5maXhlZDE2bGUgPSBuZXcgRml4ZWQoMTYsICdMRScpO1xuICAgIGV4cG9ydHMuZml4ZWQzMmJlID0gZXhwb3J0cy5maXhlZDMyID0gbmV3IEZpeGVkKDMyLCAnQkUnKTtcbiAgICBleHBvcnRzLmZpeGVkMzJsZSA9IG5ldyBGaXhlZCgzMiwgJ0xFJyk7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG52YXIgX051bWJlcl8xID0gX051bWJlci5OdW1iZXI7XG52YXIgX051bWJlcl8yID0gX051bWJlci51aW50ODtcbnZhciBfTnVtYmVyXzMgPSBfTnVtYmVyLnVpbnQxNmJlO1xudmFyIF9OdW1iZXJfNCA9IF9OdW1iZXIudWludDE2O1xudmFyIF9OdW1iZXJfNSA9IF9OdW1iZXIudWludDE2bGU7XG52YXIgX051bWJlcl82ID0gX051bWJlci51aW50MjRiZTtcbnZhciBfTnVtYmVyXzcgPSBfTnVtYmVyLnVpbnQyNDtcbnZhciBfTnVtYmVyXzggPSBfTnVtYmVyLnVpbnQyNGxlO1xudmFyIF9OdW1iZXJfOSA9IF9OdW1iZXIudWludDMyYmU7XG52YXIgX051bWJlcl8xMCA9IF9OdW1iZXIudWludDMyO1xudmFyIF9OdW1iZXJfMTEgPSBfTnVtYmVyLnVpbnQzMmxlO1xudmFyIF9OdW1iZXJfMTIgPSBfTnVtYmVyLmludDg7XG52YXIgX051bWJlcl8xMyA9IF9OdW1iZXIuaW50MTZiZTtcbnZhciBfTnVtYmVyXzE0ID0gX051bWJlci5pbnQxNjtcbnZhciBfTnVtYmVyXzE1ID0gX051bWJlci5pbnQxNmxlO1xudmFyIF9OdW1iZXJfMTYgPSBfTnVtYmVyLmludDI0YmU7XG52YXIgX051bWJlcl8xNyA9IF9OdW1iZXIuaW50MjQ7XG52YXIgX051bWJlcl8xOCA9IF9OdW1iZXIuaW50MjRsZTtcbnZhciBfTnVtYmVyXzE5ID0gX051bWJlci5pbnQzMmJlO1xudmFyIF9OdW1iZXJfMjAgPSBfTnVtYmVyLmludDMyO1xudmFyIF9OdW1iZXJfMjEgPSBfTnVtYmVyLmludDMybGU7XG52YXIgX051bWJlcl8yMiA9IF9OdW1iZXIuZmxvYXRiZTtcbnZhciBfTnVtYmVyXzIzID0gX051bWJlci5mbG9hdGxlO1xudmFyIF9OdW1iZXJfMjQgPSBfTnVtYmVyLmRvdWJsZWJlO1xudmFyIF9OdW1iZXJfMjUgPSBfTnVtYmVyLmRvdWJsZWxlO1xudmFyIF9OdW1iZXJfMjYgPSBfTnVtYmVyLkZpeGVkO1xudmFyIF9OdW1iZXJfMjcgPSBfTnVtYmVyLmZpeGVkMTZiZTtcbnZhciBfTnVtYmVyXzI4ID0gX051bWJlci5maXhlZDE2O1xudmFyIF9OdW1iZXJfMjkgPSBfTnVtYmVyLmZpeGVkMTZsZTtcbnZhciBfTnVtYmVyXzMwID0gX051bWJlci5maXhlZDMyYmU7XG52YXIgX051bWJlcl8zMSA9IF9OdW1iZXIuZml4ZWQzMjtcbnZhciBfTnVtYmVyXzMyID0gX051bWJlci5maXhlZDMybGU7XG5cbnZhciB1dGlscyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBOdW1iZXJULCBQcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgTnVtYmVyVCA9IF9OdW1iZXIuTnVtYmVyO1xuXG4gICAgZXhwb3J0cy5yZXNvbHZlTGVuZ3RoID0gZnVuY3Rpb24gKGxlbmd0aCwgc3RyZWFtLCBwYXJlbnQpIHtcbiAgICAgIHZhciByZXM7XG5cbiAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXMgPSBsZW5ndGg7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsZW5ndGggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzID0gbGVuZ3RoLmNhbGwocGFyZW50LCBwYXJlbnQpO1xuICAgICAgfSBlbHNlIGlmIChwYXJlbnQgJiYgdHlwZW9mIGxlbmd0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVzID0gcGFyZW50W2xlbmd0aF07XG4gICAgICB9IGVsc2UgaWYgKHN0cmVhbSAmJiBsZW5ndGggaW5zdGFuY2VvZiBOdW1iZXJUKSB7XG4gICAgICAgIHJlcyA9IGxlbmd0aC5kZWNvZGUoc3RyZWFtKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTmFOKHJlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSBmaXhlZCBzaXplJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuICAgIFByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFByb3BlcnR5RGVzY3JpcHRvcihvcHRzKSB7XG4gICAgICAgIHZhciBrZXksIHZhbDtcblxuICAgICAgICBpZiAob3B0cyA9PSBudWxsKSB7XG4gICAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb25maWd1cmFibGUgPSB0cnVlO1xuXG4gICAgICAgIGZvciAoa2V5IGluIG9wdHMpIHtcbiAgICAgICAgICB2YWwgPSBvcHRzW2tleV07XG4gICAgICAgICAgdGhpc1trZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBQcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgfSgpO1xuXG4gICAgZXhwb3J0cy5Qcm9wZXJ0eURlc2NyaXB0b3IgPSBQcm9wZXJ0eURlc2NyaXB0b3I7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG52YXIgdXRpbHNfMSA9IHV0aWxzLnJlc29sdmVMZW5ndGg7XG52YXIgdXRpbHNfMiA9IHV0aWxzLlByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyIF9BcnJheSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBBcnJheVQsIE51bWJlclQsIHV0aWxzJDE7XG4gICAgTnVtYmVyVCA9IF9OdW1iZXIuTnVtYmVyO1xuICAgIHV0aWxzJDEgPSB1dGlscztcblxuICAgIEFycmF5VCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEFycmF5VCh0eXBlLCBsZW5ndGgsIGxlbmd0aFR5cGUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIHRoaXMubGVuZ3RoVHlwZSA9IGxlbmd0aFR5cGUgIT0gbnVsbCA/IGxlbmd0aFR5cGUgOiAnY291bnQnO1xuICAgICAgfVxuXG4gICAgICBBcnJheVQucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHBhcmVudCkge1xuICAgICAgICB2YXIgY3R4LCBpLCBsZW5ndGgsIHBvcywgcmVzLCB0YXJnZXQsIF9pO1xuXG4gICAgICAgIHBvcyA9IHN0cmVhbS5wb3M7XG4gICAgICAgIHJlcyA9IFtdO1xuICAgICAgICBjdHggPSBwYXJlbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9IG51bGwpIHtcbiAgICAgICAgICBsZW5ndGggPSB1dGlscyQxLnJlc29sdmVMZW5ndGgodGhpcy5sZW5ndGgsIHN0cmVhbSwgcGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCBpbnN0YW5jZW9mIE51bWJlclQpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhyZXMsIHtcbiAgICAgICAgICAgIHBhcmVudDoge1xuICAgICAgICAgICAgICB2YWx1ZTogcGFyZW50XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX3N0YXJ0T2Zmc2V0OiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBwb3NcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfY3VycmVudE9mZnNldDoge1xuICAgICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfbGVuZ3RoOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBsZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdHggPSByZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGVuZ3RoID09IG51bGwgfHwgdGhpcy5sZW5ndGhUeXBlID09PSAnYnl0ZXMnKSB7XG4gICAgICAgICAgdGFyZ2V0ID0gbGVuZ3RoICE9IG51bGwgPyBzdHJlYW0ucG9zICsgbGVuZ3RoIDogKHBhcmVudCAhPSBudWxsID8gcGFyZW50Ll9sZW5ndGggOiB2b2lkIDApID8gcGFyZW50Ll9zdGFydE9mZnNldCArIHBhcmVudC5fbGVuZ3RoIDogc3RyZWFtLmxlbmd0aDtcblxuICAgICAgICAgIHdoaWxlIChzdHJlYW0ucG9zIDwgdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXMucHVzaCh0aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSwgY3R4KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAoaSA9IF9pID0gMDsgX2kgPCBsZW5ndGg7IGkgPSBfaSArPSAxKSB7XG4gICAgICAgICAgICByZXMucHVzaCh0aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSwgY3R4KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH07XG5cbiAgICAgIEFycmF5VC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIChhcnJheSwgY3R4KSB7XG4gICAgICAgIHZhciBpdGVtLCBzaXplLCBfaSwgX2xlbjtcblxuICAgICAgICBpZiAoIWFycmF5KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zaXplKG51bGwsIGN0eCkgKiB1dGlscyQxLnJlc29sdmVMZW5ndGgodGhpcy5sZW5ndGgsIG51bGwsIGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBzaXplID0gMDtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggaW5zdGFuY2VvZiBOdW1iZXJUKSB7XG4gICAgICAgICAgc2l6ZSArPSB0aGlzLmxlbmd0aC5zaXplKCk7XG4gICAgICAgICAgY3R4ID0ge1xuICAgICAgICAgICAgcGFyZW50OiBjdHhcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgIGl0ZW0gPSBhcnJheVtfaV07XG4gICAgICAgICAgc2l6ZSArPSB0aGlzLnR5cGUuc2l6ZShpdGVtLCBjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICB9O1xuXG4gICAgICBBcnJheVQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIGFycmF5LCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGN0eCwgaSwgaXRlbSwgcHRyLCBfaSwgX2xlbjtcblxuICAgICAgICBjdHggPSBwYXJlbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIGluc3RhbmNlb2YgTnVtYmVyVCkge1xuICAgICAgICAgIGN0eCA9IHtcbiAgICAgICAgICAgIHBvaW50ZXJzOiBbXSxcbiAgICAgICAgICAgIHN0YXJ0T2Zmc2V0OiBzdHJlYW0ucG9zLFxuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGN0eC5wb2ludGVyT2Zmc2V0ID0gc3RyZWFtLnBvcyArIHRoaXMuc2l6ZShhcnJheSwgY3R4KTtcbiAgICAgICAgICB0aGlzLmxlbmd0aC5lbmNvZGUoc3RyZWFtLCBhcnJheS5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBhcnJheS5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgIGl0ZW0gPSBhcnJheVtfaV07XG4gICAgICAgICAgdGhpcy50eXBlLmVuY29kZShzdHJlYW0sIGl0ZW0sIGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggaW5zdGFuY2VvZiBOdW1iZXJUKSB7XG4gICAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgICB3aGlsZSAoaSA8IGN0eC5wb2ludGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHB0ciA9IGN0eC5wb2ludGVyc1tpKytdO1xuICAgICAgICAgICAgcHRyLnR5cGUuZW5jb2RlKHN0cmVhbSwgcHRyLnZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gQXJyYXlUO1xuICAgIH0oKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gQXJyYXlUO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgTGF6eUFycmF5ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIEFycmF5VCxcbiAgICAgICAgTGF6eUFycmF5LFxuICAgICAgICBMYXp5QXJyYXlULFxuICAgICAgICBOdW1iZXJULFxuICAgICAgICBpbnNwZWN0LFxuICAgICAgICB1dGlscyQxLFxuICAgICAgICBfX2hhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgICAgX19leHRlbmRzID0gZnVuY3Rpb24gX19leHRlbmRzKGNoaWxkLCBwYXJlbnQpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHtcbiAgICAgICAgaWYgKF9faGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjdG9yKCkge1xuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7XG4gICAgICB9XG5cbiAgICAgIGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICAgIGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7XG4gICAgICBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlO1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICBBcnJheVQgPSBfQXJyYXk7XG4gICAgTnVtYmVyVCA9IF9OdW1iZXIuTnVtYmVyO1xuICAgIHV0aWxzJDEgPSB1dGlscztcbiAgICBpbnNwZWN0ID0gcmVxdWlyZSQkMy5pbnNwZWN0O1xuXG4gICAgTGF6eUFycmF5VCA9IGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgIF9fZXh0ZW5kcyhMYXp5QXJyYXlULCBfc3VwZXIpO1xuXG4gICAgICBmdW5jdGlvbiBMYXp5QXJyYXlUKCkge1xuICAgICAgICByZXR1cm4gTGF6eUFycmF5VC5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgTGF6eUFycmF5VC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBsZW5ndGgsIHBvcywgcmVzO1xuICAgICAgICBwb3MgPSBzdHJlYW0ucG9zO1xuICAgICAgICBsZW5ndGggPSB1dGlscyQxLnJlc29sdmVMZW5ndGgodGhpcy5sZW5ndGgsIHN0cmVhbSwgcGFyZW50KTtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggaW5zdGFuY2VvZiBOdW1iZXJUKSB7XG4gICAgICAgICAgcGFyZW50ID0ge1xuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgICBfc3RhcnRPZmZzZXQ6IHBvcyxcbiAgICAgICAgICAgIF9jdXJyZW50T2Zmc2V0OiAwLFxuICAgICAgICAgICAgX2xlbmd0aDogbGVuZ3RoXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcyA9IG5ldyBMYXp5QXJyYXkodGhpcy50eXBlLCBsZW5ndGgsIHN0cmVhbSwgcGFyZW50KTtcbiAgICAgICAgc3RyZWFtLnBvcyArPSBsZW5ndGggKiB0aGlzLnR5cGUuc2l6ZShudWxsLCBwYXJlbnQpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfTtcblxuICAgICAgTGF6eUFycmF5VC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICh2YWwsIGN0eCkge1xuICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgTGF6eUFycmF5KSB7XG4gICAgICAgICAgdmFsID0gdmFsLnRvQXJyYXkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBMYXp5QXJyYXlULl9fc3VwZXJfXy5zaXplLmNhbGwodGhpcywgdmFsLCBjdHgpO1xuICAgICAgfTtcblxuICAgICAgTGF6eUFycmF5VC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgdmFsLCBjdHgpIHtcbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIExhenlBcnJheSkge1xuICAgICAgICAgIHZhbCA9IHZhbC50b0FycmF5KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gTGF6eUFycmF5VC5fX3N1cGVyX18uZW5jb2RlLmNhbGwodGhpcywgc3RyZWFtLCB2YWwsIGN0eCk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gTGF6eUFycmF5VDtcbiAgICB9KEFycmF5VCk7XG5cbiAgICBMYXp5QXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBMYXp5QXJyYXkodHlwZSwgbGVuZ3RoLCBzdHJlYW0sIGN0eCkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgICAgICB0aGlzLmJhc2UgPSB0aGlzLnN0cmVhbS5wb3M7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgTGF6eUFycmF5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIHBvcztcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLml0ZW1zW2luZGV4XSA9PSBudWxsKSB7XG4gICAgICAgICAgcG9zID0gdGhpcy5zdHJlYW0ucG9zO1xuICAgICAgICAgIHRoaXMuc3RyZWFtLnBvcyA9IHRoaXMuYmFzZSArIHRoaXMudHlwZS5zaXplKG51bGwsIHRoaXMuY3R4KSAqIGluZGV4O1xuICAgICAgICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gdGhpcy50eXBlLmRlY29kZSh0aGlzLnN0cmVhbSwgdGhpcy5jdHgpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtLnBvcyA9IHBvcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zW2luZGV4XTtcbiAgICAgIH07XG5cbiAgICAgIExhenlBcnJheS5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGksIF9pLCBfcmVmLCBfcmVzdWx0cztcblxuICAgICAgICBfcmVzdWx0cyA9IFtdO1xuXG4gICAgICAgIGZvciAoaSA9IF9pID0gMCwgX3JlZiA9IHRoaXMubGVuZ3RoOyBfaSA8IF9yZWY7IGkgPSBfaSArPSAxKSB7XG4gICAgICAgICAgX3Jlc3VsdHMucHVzaCh0aGlzLmdldChpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3Jlc3VsdHM7XG4gICAgICB9O1xuXG4gICAgICBMYXp5QXJyYXkucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0KHRoaXMudG9BcnJheSgpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBMYXp5QXJyYXk7XG4gICAgfSgpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBMYXp5QXJyYXlUO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgQml0ZmllbGQgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgQml0ZmllbGQ7XG5cbiAgICBCaXRmaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEJpdGZpZWxkKHR5cGUsIGZsYWdzKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFncyAhPSBudWxsID8gZmxhZ3MgOiBbXTtcbiAgICAgIH1cblxuICAgICAgQml0ZmllbGQucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICAgICAgdmFyIGZsYWcsIGksIHJlcywgdmFsLCBfaSwgX2xlbiwgX3JlZjtcblxuICAgICAgICB2YWwgPSB0aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSk7XG4gICAgICAgIHJlcyA9IHt9O1xuICAgICAgICBfcmVmID0gdGhpcy5mbGFncztcblxuICAgICAgICBmb3IgKGkgPSBfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBpID0gKytfaSkge1xuICAgICAgICAgIGZsYWcgPSBfcmVmW2ldO1xuXG4gICAgICAgICAgaWYgKGZsYWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzW2ZsYWddID0gISEodmFsICYgMSA8PCBpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfTtcblxuICAgICAgQml0ZmllbGQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuc2l6ZSgpO1xuICAgICAgfTtcblxuICAgICAgQml0ZmllbGQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIGtleXMpIHtcbiAgICAgICAgdmFyIGZsYWcsIGksIHZhbCwgX2ksIF9sZW4sIF9yZWY7XG5cbiAgICAgICAgdmFsID0gMDtcbiAgICAgICAgX3JlZiA9IHRoaXMuZmxhZ3M7XG5cbiAgICAgICAgZm9yIChpID0gX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgaSA9ICsrX2kpIHtcbiAgICAgICAgICBmbGFnID0gX3JlZltpXTtcblxuICAgICAgICAgIGlmIChmbGFnICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChrZXlzW2ZsYWddKSB7XG4gICAgICAgICAgICAgIHZhbCB8PSAxIDw8IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5lbmNvZGUoc3RyZWFtLCB2YWwpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIEJpdGZpZWxkO1xuICAgIH0oKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gQml0ZmllbGQ7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBfQm9vbGVhbiA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBCb29sZWFuVDtcblxuICAgIEJvb2xlYW5UID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gQm9vbGVhblQodHlwZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgfVxuXG4gICAgICBCb29sZWFuVC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMudHlwZS5kZWNvZGUoc3RyZWFtLCBwYXJlbnQpO1xuICAgICAgfTtcblxuICAgICAgQm9vbGVhblQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAodmFsLCBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zaXplKHZhbCwgcGFyZW50KTtcbiAgICAgIH07XG5cbiAgICAgIEJvb2xlYW5ULnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCB2YWwsIHBhcmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLmVuY29kZShzdHJlYW0sICt2YWwsIHBhcmVudCk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gQm9vbGVhblQ7XG4gICAgfSgpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBCb29sZWFuVDtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIEJ1ZmZlciQ4ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIEJ1ZmZlclQsIE51bWJlclQsIHV0aWxzJDE7XG4gICAgdXRpbHMkMSA9IHV0aWxzO1xuICAgIE51bWJlclQgPSBfTnVtYmVyLk51bWJlcjtcblxuICAgIEJ1ZmZlclQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBCdWZmZXJUKGxlbmd0aCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgQnVmZmVyVC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBsZW5ndGg7XG4gICAgICAgIGxlbmd0aCA9IHV0aWxzJDEucmVzb2x2ZUxlbmd0aCh0aGlzLmxlbmd0aCwgc3RyZWFtLCBwYXJlbnQpO1xuICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKTtcbiAgICAgIH07XG5cbiAgICAgIEJ1ZmZlclQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAodmFsLCBwYXJlbnQpIHtcbiAgICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgICByZXR1cm4gdXRpbHMkMS5yZXNvbHZlTGVuZ3RoKHRoaXMubGVuZ3RoLCBudWxsLCBwYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbC5sZW5ndGg7XG4gICAgICB9O1xuXG4gICAgICBCdWZmZXJULnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBidWYsIHBhcmVudCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggaW5zdGFuY2VvZiBOdW1iZXJUKSB7XG4gICAgICAgICAgdGhpcy5sZW5ndGguZW5jb2RlKHN0cmVhbSwgYnVmLmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyZWFtLndyaXRlQnVmZmVyKGJ1Zik7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gQnVmZmVyVDtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlclQ7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBFbnVtID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIEVudW07XG5cbiAgICBFbnVtID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gRW51bSh0eXBlLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMgOiBbXTtcbiAgICAgIH1cblxuICAgICAgRW51bS5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICB2YXIgaW5kZXg7XG4gICAgICAgIGluZGV4ID0gdGhpcy50eXBlLmRlY29kZShzdHJlYW0pO1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zW2luZGV4XSB8fCBpbmRleDtcbiAgICAgIH07XG5cbiAgICAgIEVudW0ucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuc2l6ZSgpO1xuICAgICAgfTtcblxuICAgICAgRW51bS5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgdmFsKSB7XG4gICAgICAgIHZhciBpbmRleDtcbiAgICAgICAgaW5kZXggPSB0aGlzLm9wdGlvbnMuaW5kZXhPZih2YWwpO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG9wdGlvbiBpbiBlbnVtOiBcIiArIHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy50eXBlLmVuY29kZShzdHJlYW0sIGluZGV4KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBFbnVtO1xuICAgIH0oKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gRW51bTtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIE9wdGlvbmFsID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIE9wdGlvbmFsO1xuXG4gICAgT3B0aW9uYWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBPcHRpb25hbCh0eXBlLCBjb25kaXRpb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb24gIT0gbnVsbCA/IGNvbmRpdGlvbiA6IHRydWU7XG4gICAgICB9XG5cbiAgICAgIE9wdGlvbmFsLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGNvbmRpdGlvbjtcbiAgICAgICAgY29uZGl0aW9uID0gdGhpcy5jb25kaXRpb247XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uY2FsbChwYXJlbnQsIHBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5kZWNvZGUoc3RyZWFtLCBwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBPcHRpb25hbC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICh2YWwsIHBhcmVudCkge1xuICAgICAgICB2YXIgY29uZGl0aW9uO1xuICAgICAgICBjb25kaXRpb24gPSB0aGlzLmNvbmRpdGlvbjtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbmRpdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5jYWxsKHBhcmVudCwgcGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNpemUodmFsLCBwYXJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBPcHRpb25hbC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgdmFsLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGNvbmRpdGlvbjtcbiAgICAgICAgY29uZGl0aW9uID0gdGhpcy5jb25kaXRpb247XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uY2FsbChwYXJlbnQsIHBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5lbmNvZGUoc3RyZWFtLCB2YWwsIHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBPcHRpb25hbDtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IE9wdGlvbmFsO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgUmVzZXJ2ZWQgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgUmVzZXJ2ZWQsIHV0aWxzJDE7XG4gICAgdXRpbHMkMSA9IHV0aWxzO1xuXG4gICAgUmVzZXJ2ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBSZXNlcnZlZCh0eXBlLCBjb3VudCkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmNvdW50ID0gY291bnQgIT0gbnVsbCA/IGNvdW50IDogMTtcbiAgICAgIH1cblxuICAgICAgUmVzZXJ2ZWQucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHBhcmVudCkge1xuICAgICAgICBzdHJlYW0ucG9zICs9IHRoaXMuc2l6ZShudWxsLCBwYXJlbnQpO1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgfTtcblxuICAgICAgUmVzZXJ2ZWQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoZGF0YSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBjb3VudDtcbiAgICAgICAgY291bnQgPSB1dGlscyQxLnJlc29sdmVMZW5ndGgodGhpcy5jb3VudCwgbnVsbCwgcGFyZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zaXplKCkgKiBjb3VudDtcbiAgICAgIH07XG5cbiAgICAgIFJlc2VydmVkLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCB2YWwsIHBhcmVudCkge1xuICAgICAgICByZXR1cm4gc3RyZWFtLmZpbGwoMCwgdGhpcy5zaXplKHZhbCwgcGFyZW50KSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gUmVzZXJ2ZWQ7XG4gICAgfSgpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBSZXNlcnZlZDtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIF9TdHJpbmcgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgTnVtYmVyVCwgU3RyaW5nVCwgdXRpbHMkMTtcbiAgICBOdW1iZXJUID0gX051bWJlci5OdW1iZXI7XG4gICAgdXRpbHMkMSA9IHV0aWxzO1xuXG4gICAgU3RyaW5nVCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFN0cmluZ1QobGVuZ3RoLCBlbmNvZGluZykge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nICE9IG51bGwgPyBlbmNvZGluZyA6ICdhc2NpaSc7XG4gICAgICB9XG5cbiAgICAgIFN0cmluZ1QucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHBhcmVudCkge1xuICAgICAgICB2YXIgYnVmZmVyLCBlbmNvZGluZywgbGVuZ3RoLCBwb3MsIHN0cmluZztcblxuICAgICAgICBsZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlscyQxLnJlc29sdmVMZW5ndGgodGhpcy5sZW5ndGgsIHN0cmVhbSwgcGFyZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnVmZmVyID0gc3RyZWFtLmJ1ZmZlciwgbGVuZ3RoID0gc3RyZWFtLmxlbmd0aCwgcG9zID0gc3RyZWFtLnBvcztcblxuICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGxlbmd0aCAmJiBidWZmZXJbcG9zXSAhPT0gMHgwMCkge1xuICAgICAgICAgICAgICArK3BvcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHBvcyAtIHN0cmVhbS5wb3M7XG4gICAgICAgICAgfVxuICAgICAgICB9LmNhbGwodGhpcyk7XG5cbiAgICAgICAgZW5jb2RpbmcgPSB0aGlzLmVuY29kaW5nO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLmNhbGwocGFyZW50LCBwYXJlbnQpIHx8ICdhc2NpaSc7XG4gICAgICAgIH1cblxuICAgICAgICBzdHJpbmcgPSBzdHJlYW0ucmVhZFN0cmluZyhsZW5ndGgsIGVuY29kaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gbnVsbCAmJiBzdHJlYW0ucG9zIDwgc3RyZWFtLmxlbmd0aCkge1xuICAgICAgICAgIHN0cmVhbS5wb3MrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9O1xuXG4gICAgICBTdHJpbmdULnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKHZhbCwgcGFyZW50KSB7XG4gICAgICAgIHZhciBlbmNvZGluZywgc2l6ZTtcblxuICAgICAgICBpZiAoIXZhbCkge1xuICAgICAgICAgIHJldHVybiB1dGlscyQxLnJlc29sdmVMZW5ndGgodGhpcy5sZW5ndGgsIG51bGwsIHBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBlbmNvZGluZyA9IHRoaXMuZW5jb2Rpbmc7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVuY29kaW5nID0gZW5jb2RpbmcuY2FsbChwYXJlbnQgIT0gbnVsbCA/IHBhcmVudC52YWwgOiB2b2lkIDAsIHBhcmVudCAhPSBudWxsID8gcGFyZW50LnZhbCA6IHZvaWQgMCkgfHwgJ2FzY2lpJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ3V0ZjE2YmUnKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSAndXRmMTZsZSc7XG4gICAgICAgIH1cblxuICAgICAgICBzaXplID0gYnVmZmVyXzEuYnl0ZUxlbmd0aCh2YWwsIGVuY29kaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggaW5zdGFuY2VvZiBOdW1iZXJUKSB7XG4gICAgICAgICAgc2l6ZSArPSB0aGlzLmxlbmd0aC5zaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gbnVsbCkge1xuICAgICAgICAgIHNpemUrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaXplO1xuICAgICAgfTtcblxuICAgICAgU3RyaW5nVC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgdmFsLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGVuY29kaW5nO1xuICAgICAgICBlbmNvZGluZyA9IHRoaXMuZW5jb2Rpbmc7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVuY29kaW5nID0gZW5jb2RpbmcuY2FsbChwYXJlbnQgIT0gbnVsbCA/IHBhcmVudC52YWwgOiB2b2lkIDAsIHBhcmVudCAhPSBudWxsID8gcGFyZW50LnZhbCA6IHZvaWQgMCkgfHwgJ2FzY2lpJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCBpbnN0YW5jZW9mIE51bWJlclQpIHtcbiAgICAgICAgICB0aGlzLmxlbmd0aC5lbmNvZGUoc3RyZWFtLCBidWZmZXJfMS5ieXRlTGVuZ3RoKHZhbCwgZW5jb2RpbmcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmVhbS53cml0ZVN0cmluZyh2YWwsIGVuY29kaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW0ud3JpdGVVSW50OCgweDAwKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFN0cmluZ1Q7XG4gICAgfSgpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBTdHJpbmdUO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgU3RydWN0ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIFN0cnVjdCwgdXRpbHMkMTtcbiAgICB1dGlscyQxID0gdXRpbHM7XG5cbiAgICBTdHJ1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBTdHJ1Y3QoZmllbGRzKSB7XG4gICAgICAgIHRoaXMuZmllbGRzID0gZmllbGRzICE9IG51bGwgPyBmaWVsZHMgOiB7fTtcbiAgICAgIH1cblxuICAgICAgU3RydWN0LnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBwYXJlbnQsIGxlbmd0aCkge1xuICAgICAgICB2YXIgcmVzLCBfcmVmO1xuXG4gICAgICAgIGlmIChsZW5ndGggPT0gbnVsbCkge1xuICAgICAgICAgIGxlbmd0aCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXMgPSB0aGlzLl9zZXR1cChzdHJlYW0sIHBhcmVudCwgbGVuZ3RoKTtcblxuICAgICAgICB0aGlzLl9wYXJzZUZpZWxkcyhzdHJlYW0sIHJlcywgdGhpcy5maWVsZHMpO1xuXG4gICAgICAgIGlmICgoX3JlZiA9IHRoaXMucHJvY2VzcykgIT0gbnVsbCkge1xuICAgICAgICAgIF9yZWYuY2FsbChyZXMsIHN0cmVhbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfTtcblxuICAgICAgU3RydWN0LnByb3RvdHlwZS5fc2V0dXAgPSBmdW5jdGlvbiAoc3RyZWFtLCBwYXJlbnQsIGxlbmd0aCkge1xuICAgICAgICB2YXIgcmVzO1xuICAgICAgICByZXMgPSB7fTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmVzLCB7XG4gICAgICAgICAgcGFyZW50OiB7XG4gICAgICAgICAgICB2YWx1ZTogcGFyZW50XG4gICAgICAgICAgfSxcbiAgICAgICAgICBfc3RhcnRPZmZzZXQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiBzdHJlYW0ucG9zXG4gICAgICAgICAgfSxcbiAgICAgICAgICBfY3VycmVudE9mZnNldDoge1xuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgX2xlbmd0aDoge1xuICAgICAgICAgICAgdmFsdWU6IGxlbmd0aFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9O1xuXG4gICAgICBTdHJ1Y3QucHJvdG90eXBlLl9wYXJzZUZpZWxkcyA9IGZ1bmN0aW9uIChzdHJlYW0sIHJlcywgZmllbGRzKSB7XG4gICAgICAgIHZhciBrZXksIHR5cGUsIHZhbDtcblxuICAgICAgICBmb3IgKGtleSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICB0eXBlID0gZmllbGRzW2tleV07XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhbCA9IHR5cGUuY2FsbChyZXMsIHJlcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbCA9IHR5cGUuZGVjb2RlKHN0cmVhbSwgcmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiB1dGlscyQxLlByb3BlcnR5RGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzLCBrZXksIHZhbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXMuX2N1cnJlbnRPZmZzZXQgPSBzdHJlYW0ucG9zIC0gcmVzLl9zdGFydE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgU3RydWN0LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKHZhbCwgcGFyZW50LCBpbmNsdWRlUG9pbnRlcnMpIHtcbiAgICAgICAgdmFyIGN0eCwga2V5LCBzaXplLCB0eXBlLCBfcmVmO1xuXG4gICAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICAgIHZhbCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluY2x1ZGVQb2ludGVycyA9PSBudWxsKSB7XG4gICAgICAgICAgaW5jbHVkZVBvaW50ZXJzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eCA9IHtcbiAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICB2YWw6IHZhbCxcbiAgICAgICAgICBwb2ludGVyU2l6ZTogMFxuICAgICAgICB9O1xuICAgICAgICBzaXplID0gMDtcbiAgICAgICAgX3JlZiA9IHRoaXMuZmllbGRzO1xuXG4gICAgICAgIGZvciAoa2V5IGluIF9yZWYpIHtcbiAgICAgICAgICB0eXBlID0gX3JlZltrZXldO1xuXG4gICAgICAgICAgaWYgKHR5cGUuc2l6ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBzaXplICs9IHR5cGUuc2l6ZSh2YWxba2V5XSwgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5jbHVkZVBvaW50ZXJzKSB7XG4gICAgICAgICAgc2l6ZSArPSBjdHgucG9pbnRlclNpemU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgIH07XG5cbiAgICAgIFN0cnVjdC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgdmFsLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGN0eCwgaSwga2V5LCBwdHIsIHR5cGUsIF9yZWYsIF9yZWYxO1xuXG4gICAgICAgIGlmICgoX3JlZiA9IHRoaXMucHJlRW5jb2RlKSAhPSBudWxsKSB7XG4gICAgICAgICAgX3JlZi5jYWxsKHZhbCwgc3RyZWFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eCA9IHtcbiAgICAgICAgICBwb2ludGVyczogW10sXG4gICAgICAgICAgc3RhcnRPZmZzZXQ6IHN0cmVhbS5wb3MsXG4gICAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgdmFsOiB2YWwsXG4gICAgICAgICAgcG9pbnRlclNpemU6IDBcbiAgICAgICAgfTtcbiAgICAgICAgY3R4LnBvaW50ZXJPZmZzZXQgPSBzdHJlYW0ucG9zICsgdGhpcy5zaXplKHZhbCwgY3R4LCBmYWxzZSk7XG4gICAgICAgIF9yZWYxID0gdGhpcy5maWVsZHM7XG5cbiAgICAgICAgZm9yIChrZXkgaW4gX3JlZjEpIHtcbiAgICAgICAgICB0eXBlID0gX3JlZjFba2V5XTtcblxuICAgICAgICAgIGlmICh0eXBlLmVuY29kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0eXBlLmVuY29kZShzdHJlYW0sIHZhbFtrZXldLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGkgPSAwO1xuXG4gICAgICAgIHdoaWxlIChpIDwgY3R4LnBvaW50ZXJzLmxlbmd0aCkge1xuICAgICAgICAgIHB0ciA9IGN0eC5wb2ludGVyc1tpKytdO1xuICAgICAgICAgIHB0ci50eXBlLmVuY29kZShzdHJlYW0sIHB0ci52YWwsIHB0ci5wYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gU3RydWN0O1xuICAgIH0oKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gU3RydWN0O1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgVmVyc2lvbmVkU3RydWN0ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIFN0cnVjdCQxLFxuICAgICAgICBWZXJzaW9uZWRTdHJ1Y3QsXG4gICAgICAgIF9faGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LFxuICAgICAgICBfX2V4dGVuZHMgPSBmdW5jdGlvbiBfX2V4dGVuZHMoY2hpbGQsIHBhcmVudCkge1xuICAgICAgZm9yICh2YXIga2V5IGluIHBhcmVudCkge1xuICAgICAgICBpZiAoX19oYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICAgIH1cblxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuICAgICAgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTtcbiAgICAgIGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcblxuICAgIFN0cnVjdCQxID0gU3RydWN0O1xuXG4gICAgVmVyc2lvbmVkU3RydWN0ID0gZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzKFZlcnNpb25lZFN0cnVjdCwgX3N1cGVyKTtcblxuICAgICAgZnVuY3Rpb24gVmVyc2lvbmVkU3RydWN0KHR5cGUsIHZlcnNpb25zKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmVyc2lvbnMgPSB2ZXJzaW9ucyAhPSBudWxsID8gdmVyc2lvbnMgOiB7fTtcbiAgICAgIH1cblxuICAgICAgVmVyc2lvbmVkU3RydWN0LnByb3RvdHlwZS52ZXJzaW9uR2V0dGVyID0gZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNwbGl0KCcuJykucmVkdWNlKGZ1bmN0aW9uIChvYmosIHByb3ApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICByZXR1cm4gb2JqW3Byb3BdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBWZXJzaW9uZWRTdHJ1Y3QucHJvdG90eXBlLnZlcnNpb25TZXR0ZXIgPSBmdW5jdGlvbiAocGFyZW50LCB2ZXJzaW9uKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuc3BsaXQoJy4nKS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgcmV0dXJuIG9ialtwcm9wXSA9IHZlcnNpb247XG4gICAgICAgICAgfSwgcGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgVmVyc2lvbmVkU3RydWN0LnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBwYXJlbnQsIGxlbmd0aCkge1xuICAgICAgICB2YXIgZmllbGRzLCByZXMsIF9yZWY7XG5cbiAgICAgICAgaWYgKGxlbmd0aCA9PSBudWxsKSB7XG4gICAgICAgICAgbGVuZ3RoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcyA9IHRoaXMuX3NldHVwKHN0cmVhbSwgcGFyZW50LCBsZW5ndGgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJlcy52ZXJzaW9uID0gdGhpcy52ZXJzaW9uR2V0dGVyKHBhcmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzLnZlcnNpb24gPSB0aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52ZXJzaW9ucy5oZWFkZXIpIHtcbiAgICAgICAgICB0aGlzLl9wYXJzZUZpZWxkcyhzdHJlYW0sIHJlcywgdGhpcy52ZXJzaW9ucy5oZWFkZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGRzID0gdGhpcy52ZXJzaW9uc1tyZXMudmVyc2lvbl07XG5cbiAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB2ZXJzaW9uIFwiICsgcmVzLnZlcnNpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpZWxkcyBpbnN0YW5jZW9mIFZlcnNpb25lZFN0cnVjdCkge1xuICAgICAgICAgIHJldHVybiBmaWVsZHMuZGVjb2RlKHN0cmVhbSwgcGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BhcnNlRmllbGRzKHN0cmVhbSwgcmVzLCBmaWVsZHMpO1xuXG4gICAgICAgIGlmICgoX3JlZiA9IHRoaXMucHJvY2VzcykgIT0gbnVsbCkge1xuICAgICAgICAgIF9yZWYuY2FsbChyZXMsIHN0cmVhbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfTtcblxuICAgICAgVmVyc2lvbmVkU3RydWN0LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKHZhbCwgcGFyZW50LCBpbmNsdWRlUG9pbnRlcnMpIHtcbiAgICAgICAgdmFyIGN0eCwgZmllbGRzLCBrZXksIHNpemUsIHR5cGUsIF9yZWY7XG5cbiAgICAgICAgaWYgKGluY2x1ZGVQb2ludGVycyA9PSBudWxsKSB7XG4gICAgICAgICAgaW5jbHVkZVBvaW50ZXJzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSBmaXhlZCBzaXplJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdHggPSB7XG4gICAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgdmFsOiB2YWwsXG4gICAgICAgICAgcG9pbnRlclNpemU6IDBcbiAgICAgICAgfTtcbiAgICAgICAgc2l6ZSA9IDA7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgc2l6ZSArPSB0aGlzLnR5cGUuc2l6ZSh2YWwudmVyc2lvbiwgY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZlcnNpb25zLmhlYWRlcikge1xuICAgICAgICAgIF9yZWYgPSB0aGlzLnZlcnNpb25zLmhlYWRlcjtcblxuICAgICAgICAgIGZvciAoa2V5IGluIF9yZWYpIHtcbiAgICAgICAgICAgIHR5cGUgPSBfcmVmW2tleV07XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnNpemUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBzaXplICs9IHR5cGUuc2l6ZSh2YWxba2V5XSwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZHMgPSB0aGlzLnZlcnNpb25zW3ZhbC52ZXJzaW9uXTtcblxuICAgICAgICBpZiAoZmllbGRzID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHZlcnNpb24gXCIgKyB2YWwudmVyc2lvbik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGtleSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICB0eXBlID0gZmllbGRzW2tleV07XG5cbiAgICAgICAgICBpZiAodHlwZS5zaXplICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNpemUgKz0gdHlwZS5zaXplKHZhbFtrZXldLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNsdWRlUG9pbnRlcnMpIHtcbiAgICAgICAgICBzaXplICs9IGN0eC5wb2ludGVyU2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaXplO1xuICAgICAgfTtcblxuICAgICAgVmVyc2lvbmVkU3RydWN0LnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCB2YWwsIHBhcmVudCkge1xuICAgICAgICB2YXIgY3R4LCBmaWVsZHMsIGksIGtleSwgcHRyLCB0eXBlLCBfcmVmLCBfcmVmMTtcblxuICAgICAgICBpZiAoKF9yZWYgPSB0aGlzLnByZUVuY29kZSkgIT0gbnVsbCkge1xuICAgICAgICAgIF9yZWYuY2FsbCh2YWwsIHN0cmVhbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjdHggPSB7XG4gICAgICAgICAgcG9pbnRlcnM6IFtdLFxuICAgICAgICAgIHN0YXJ0T2Zmc2V0OiBzdHJlYW0ucG9zLFxuICAgICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICAgIHZhbDogdmFsLFxuICAgICAgICAgIHBvaW50ZXJTaXplOiAwXG4gICAgICAgIH07XG4gICAgICAgIGN0eC5wb2ludGVyT2Zmc2V0ID0gc3RyZWFtLnBvcyArIHRoaXMuc2l6ZSh2YWwsIGN0eCwgZmFsc2UpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMudHlwZS5lbmNvZGUoc3RyZWFtLCB2YWwudmVyc2lvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52ZXJzaW9ucy5oZWFkZXIpIHtcbiAgICAgICAgICBfcmVmMSA9IHRoaXMudmVyc2lvbnMuaGVhZGVyO1xuXG4gICAgICAgICAgZm9yIChrZXkgaW4gX3JlZjEpIHtcbiAgICAgICAgICAgIHR5cGUgPSBfcmVmMVtrZXldO1xuXG4gICAgICAgICAgICBpZiAodHlwZS5lbmNvZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICB0eXBlLmVuY29kZShzdHJlYW0sIHZhbFtrZXldLCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkcyA9IHRoaXMudmVyc2lvbnNbdmFsLnZlcnNpb25dO1xuXG4gICAgICAgIGZvciAoa2V5IGluIGZpZWxkcykge1xuICAgICAgICAgIHR5cGUgPSBmaWVsZHNba2V5XTtcblxuICAgICAgICAgIGlmICh0eXBlLmVuY29kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0eXBlLmVuY29kZShzdHJlYW0sIHZhbFtrZXldLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGkgPSAwO1xuXG4gICAgICAgIHdoaWxlIChpIDwgY3R4LnBvaW50ZXJzLmxlbmd0aCkge1xuICAgICAgICAgIHB0ciA9IGN0eC5wb2ludGVyc1tpKytdO1xuICAgICAgICAgIHB0ci50eXBlLmVuY29kZShzdHJlYW0sIHB0ci52YWwsIHB0ci5wYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gVmVyc2lvbmVkU3RydWN0O1xuICAgIH0oU3RydWN0JDEpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBWZXJzaW9uZWRTdHJ1Y3Q7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBQb2ludGVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIFBvaW50ZXIsIFZvaWRQb2ludGVyLCB1dGlscyQxO1xuICAgIHV0aWxzJDEgPSB1dGlscztcblxuICAgIFBvaW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBQb2ludGVyKG9mZnNldFR5cGUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9iYXNlLCBfYmFzZTEsIF9iYXNlMiwgX2Jhc2UzO1xuXG4gICAgICAgIHRoaXMub2Zmc2V0VHlwZSA9IG9mZnNldFR5cGU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgIT0gbnVsbCA/IG9wdGlvbnMgOiB7fTtcblxuICAgICAgICBpZiAodGhpcy50eXBlID09PSAndm9pZCcpIHtcbiAgICAgICAgICB0aGlzLnR5cGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChfYmFzZSA9IHRoaXMub3B0aW9ucykudHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgX2Jhc2UudHlwZSA9ICdsb2NhbCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKF9iYXNlMSA9IHRoaXMub3B0aW9ucykuYWxsb3dOdWxsID09IG51bGwpIHtcbiAgICAgICAgICBfYmFzZTEuYWxsb3dOdWxsID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoX2Jhc2UyID0gdGhpcy5vcHRpb25zKS5udWxsVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIF9iYXNlMi5udWxsVmFsdWUgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChfYmFzZTMgPSB0aGlzLm9wdGlvbnMpLmxhenkgPT0gbnVsbCkge1xuICAgICAgICAgIF9iYXNlMy5sYXp5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgUG9pbnRlci5wcm90b3R5cGUucmVsYXRpdmVUb0dldHRlciA9IGZ1bmN0aW9uIChjdHgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yZWxhdGl2ZVRvLnNwbGl0KCcuJykucmVkdWNlKGZ1bmN0aW9uIChvYmosIHByb3ApIHtcbiAgICAgICAgICByZXR1cm4gb2JqW3Byb3BdO1xuICAgICAgICB9LCBjdHgpO1xuICAgICAgfTtcblxuICAgICAgUG9pbnRlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgY3R4KSB7XG4gICAgICAgIHZhciBjLCBkZWNvZGVWYWx1ZSwgb2Zmc2V0LCBwdHIsIHJlbGF0aXZlLCB2YWw7XG4gICAgICAgIG9mZnNldCA9IHRoaXMub2Zmc2V0VHlwZS5kZWNvZGUoc3RyZWFtLCBjdHgpO1xuXG4gICAgICAgIGlmIChvZmZzZXQgPT09IHRoaXMub3B0aW9ucy5udWxsVmFsdWUgJiYgdGhpcy5vcHRpb25zLmFsbG93TnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVsYXRpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbG9jYWwnOlxuICAgICAgICAgICAgICByZXR1cm4gY3R4Ll9zdGFydE9mZnNldDtcblxuICAgICAgICAgICAgY2FzZSAnaW1tZWRpYXRlJzpcbiAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5wb3MgLSB0aGlzLm9mZnNldFR5cGUuc2l6ZSgpO1xuXG4gICAgICAgICAgICBjYXNlICdwYXJlbnQnOlxuICAgICAgICAgICAgICByZXR1cm4gY3R4LnBhcmVudC5fc3RhcnRPZmZzZXQ7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGMgPSBjdHg7XG5cbiAgICAgICAgICAgICAgd2hpbGUgKGMucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgYyA9IGMucGFyZW50O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGMuX3N0YXJ0T2Zmc2V0IHx8IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9LmNhbGwodGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWxhdGl2ZVRvKSB7XG4gICAgICAgICAgcmVsYXRpdmUgKz0gdGhpcy5yZWxhdGl2ZVRvR2V0dGVyKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBwdHIgPSBvZmZzZXQgKyByZWxhdGl2ZTtcblxuICAgICAgICBpZiAodGhpcy50eXBlICE9IG51bGwpIHtcbiAgICAgICAgICB2YWwgPSBudWxsO1xuXG4gICAgICAgICAgZGVjb2RlVmFsdWUgPSBmdW5jdGlvbiAoX3RoaXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBwb3M7XG5cbiAgICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHBvcyA9IHN0cmVhbS5wb3M7XG4gICAgICAgICAgICAgIHN0cmVhbS5wb3MgPSBwdHI7XG4gICAgICAgICAgICAgIHZhbCA9IF90aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSwgY3R4KTtcbiAgICAgICAgICAgICAgc3RyZWFtLnBvcyA9IHBvcztcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSh0aGlzKTtcblxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGF6eSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB1dGlscyQxLlByb3BlcnR5RGVzY3JpcHRvcih7XG4gICAgICAgICAgICAgIGdldDogZGVjb2RlVmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBkZWNvZGVWYWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBwdHI7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIFBvaW50ZXIucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAodmFsLCBjdHgpIHtcbiAgICAgICAgdmFyIHBhcmVudCwgdHlwZTtcbiAgICAgICAgcGFyZW50ID0gY3R4O1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdsb2NhbCc6XG4gICAgICAgICAgY2FzZSAnaW1tZWRpYXRlJzpcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAncGFyZW50JzpcbiAgICAgICAgICAgIGN0eCA9IGN0eC5wYXJlbnQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB3aGlsZSAoY3R4LnBhcmVudCkge1xuICAgICAgICAgICAgICBjdHggPSBjdHgucGFyZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICB0eXBlID0gdGhpcy50eXBlO1xuXG4gICAgICAgIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoISh2YWwgaW5zdGFuY2VvZiBWb2lkUG9pbnRlcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgYmUgYSBWb2lkUG9pbnRlclwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0eXBlID0gdmFsLnR5cGU7XG4gICAgICAgICAgdmFsID0gdmFsLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCAmJiBjdHgpIHtcbiAgICAgICAgICBjdHgucG9pbnRlclNpemUgKz0gdHlwZS5zaXplKHZhbCwgcGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldFR5cGUuc2l6ZSgpO1xuICAgICAgfTtcblxuICAgICAgUG9pbnRlci5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgdmFsLCBjdHgpIHtcbiAgICAgICAgdmFyIHBhcmVudCwgcmVsYXRpdmUsIHR5cGU7XG4gICAgICAgIHBhcmVudCA9IGN0eDtcblxuICAgICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLm9mZnNldFR5cGUuZW5jb2RlKHN0cmVhbSwgdGhpcy5vcHRpb25zLm51bGxWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2xvY2FsJzpcbiAgICAgICAgICAgIHJlbGF0aXZlID0gY3R4LnN0YXJ0T2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdpbW1lZGlhdGUnOlxuICAgICAgICAgICAgcmVsYXRpdmUgPSBzdHJlYW0ucG9zICsgdGhpcy5vZmZzZXRUeXBlLnNpemUodmFsLCBwYXJlbnQpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdwYXJlbnQnOlxuICAgICAgICAgICAgY3R4ID0gY3R4LnBhcmVudDtcbiAgICAgICAgICAgIHJlbGF0aXZlID0gY3R4LnN0YXJ0T2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmVsYXRpdmUgPSAwO1xuXG4gICAgICAgICAgICB3aGlsZSAoY3R4LnBhcmVudCkge1xuICAgICAgICAgICAgICBjdHggPSBjdHgucGFyZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlbGF0aXZlVG8pIHtcbiAgICAgICAgICByZWxhdGl2ZSArPSB0aGlzLnJlbGF0aXZlVG9HZXR0ZXIocGFyZW50LnZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9mZnNldFR5cGUuZW5jb2RlKHN0cmVhbSwgY3R4LnBvaW50ZXJPZmZzZXQgLSByZWxhdGl2ZSk7XG4gICAgICAgIHR5cGUgPSB0aGlzLnR5cGU7XG5cbiAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgIGlmICghKHZhbCBpbnN0YW5jZW9mIFZvaWRQb2ludGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBiZSBhIFZvaWRQb2ludGVyXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHR5cGUgPSB2YWwudHlwZTtcbiAgICAgICAgICB2YWwgPSB2YWwudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjdHgucG9pbnRlcnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICB2YWw6IHZhbCxcbiAgICAgICAgICBwYXJlbnQ6IHBhcmVudFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGN0eC5wb2ludGVyT2Zmc2V0ICs9IHR5cGUuc2l6ZSh2YWwsIHBhcmVudCk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gUG9pbnRlcjtcbiAgICB9KCk7XG5cbiAgICBWb2lkUG9pbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFZvaWRQb2ludGVyKHR5cGUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFZvaWRQb2ludGVyO1xuICAgIH0oKTtcblxuICAgIGV4cG9ydHMuUG9pbnRlciA9IFBvaW50ZXI7XG4gICAgZXhwb3J0cy5Wb2lkUG9pbnRlciA9IFZvaWRQb2ludGVyO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xudmFyIFBvaW50ZXJfMSA9IFBvaW50ZXIuUG9pbnRlcjtcbnZhciBQb2ludGVyXzIgPSBQb2ludGVyLlZvaWRQb2ludGVyO1xuXG52YXIgcmVzdHJ1Y3R1cmUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIga2V5LCB2YWwsIF9yZWYsIF9yZWYxO1xuXG4gICAgZXhwb3J0cy5FbmNvZGVTdHJlYW0gPSBFbmNvZGVTdHJlYW07XG4gICAgZXhwb3J0cy5EZWNvZGVTdHJlYW0gPSBEZWNvZGVTdHJlYW07XG4gICAgZXhwb3J0cy5BcnJheSA9IF9BcnJheTtcbiAgICBleHBvcnRzLkxhenlBcnJheSA9IExhenlBcnJheTtcbiAgICBleHBvcnRzLkJpdGZpZWxkID0gQml0ZmllbGQ7XG4gICAgZXhwb3J0cy5Cb29sZWFuID0gX0Jvb2xlYW47XG4gICAgZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXIkODtcbiAgICBleHBvcnRzLkVudW0gPSBFbnVtO1xuICAgIGV4cG9ydHMuT3B0aW9uYWwgPSBPcHRpb25hbDtcbiAgICBleHBvcnRzLlJlc2VydmVkID0gUmVzZXJ2ZWQ7XG4gICAgZXhwb3J0cy5TdHJpbmcgPSBfU3RyaW5nO1xuICAgIGV4cG9ydHMuU3RydWN0ID0gU3RydWN0O1xuICAgIGV4cG9ydHMuVmVyc2lvbmVkU3RydWN0ID0gVmVyc2lvbmVkU3RydWN0O1xuICAgIF9yZWYgPSBfTnVtYmVyO1xuXG4gICAgZm9yIChrZXkgaW4gX3JlZikge1xuICAgICAgdmFsID0gX3JlZltrZXldO1xuICAgICAgZXhwb3J0c1trZXldID0gdmFsO1xuICAgIH1cblxuICAgIF9yZWYxID0gUG9pbnRlcjtcblxuICAgIGZvciAoa2V5IGluIF9yZWYxKSB7XG4gICAgICB2YWwgPSBfcmVmMVtrZXldO1xuICAgICAgZXhwb3J0c1trZXldID0gdmFsO1xuICAgIH1cbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcbnZhciByZXN0cnVjdHVyZV8xID0gcmVzdHJ1Y3R1cmUuRW5jb2RlU3RyZWFtO1xudmFyIHJlc3RydWN0dXJlXzIgPSByZXN0cnVjdHVyZS5EZWNvZGVTdHJlYW07XG52YXIgcmVzdHJ1Y3R1cmVfMyA9IHJlc3RydWN0dXJlLkFycmF5O1xudmFyIHJlc3RydWN0dXJlXzQgPSByZXN0cnVjdHVyZS5MYXp5QXJyYXk7XG52YXIgcmVzdHJ1Y3R1cmVfNSA9IHJlc3RydWN0dXJlLkJpdGZpZWxkO1xudmFyIHJlc3RydWN0dXJlXzYgPSByZXN0cnVjdHVyZS5Cb29sZWFuO1xudmFyIHJlc3RydWN0dXJlXzcgPSByZXN0cnVjdHVyZS5CdWZmZXI7XG52YXIgcmVzdHJ1Y3R1cmVfOCA9IHJlc3RydWN0dXJlLkVudW07XG52YXIgcmVzdHJ1Y3R1cmVfOSA9IHJlc3RydWN0dXJlLk9wdGlvbmFsO1xudmFyIHJlc3RydWN0dXJlXzEwID0gcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQ7XG52YXIgcmVzdHJ1Y3R1cmVfMTEgPSByZXN0cnVjdHVyZS5TdHJpbmc7XG52YXIgcmVzdHJ1Y3R1cmVfMTIgPSByZXN0cnVjdHVyZS5TdHJ1Y3Q7XG52YXIgcmVzdHJ1Y3R1cmVfMTMgPSByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3Q7XG5cbnZhciBmb3JtYXRzID0gW107XG52YXIgZm9udGtpdCA9IHtcbiAgbG9nRXJyb3JzOiBmYWxzZSxcbiAgcmVnaXN0ZXJGb3JtYXQ6IGZ1bmN0aW9uIHJlZ2lzdGVyRm9ybWF0KGZvcm1hdCkge1xuICAgIGZvcm1hdHMucHVzaChmb3JtYXQpO1xuICB9LFxuICBjcmVhdGU6IGZ1bmN0aW9uIGNyZWF0ZSh1aW50OEFycmF5Rm9udERhdGEsIHBvc3RzY3JpcHROYW1lKSB7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBidWZmZXJfMS5mcm9tKHVpbnQ4QXJyYXlGb250RGF0YSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzW2ldO1xuXG4gICAgICBpZiAoZm9ybWF0LnByb2JlKGJ1ZmZlcikpIHtcbiAgICAgICAgdmFyIGZvbnQgPSBuZXcgZm9ybWF0KG5ldyByZXN0cnVjdHVyZS5EZWNvZGVTdHJlYW0oYnVmZmVyKSk7XG5cbiAgICAgICAgaWYgKHBvc3RzY3JpcHROYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIGZvbnQuZ2V0Rm9udChwb3N0c2NyaXB0TmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9udDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZm9udCBmb3JtYXQnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgYSBnZXR0ZXIgb3IgbWV0aG9kIHN1Y2ggdGhhdFxuICogdGhlIHJlc3VsdHMgYXJlIGxhemlseSBjb21wdXRlZCBvbmNlLCBhbmQgdGhlbiBjYWNoZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjYWNoZSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuICBpZiAoZGVzY3JpcHRvci5nZXQpIHtcbiAgICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXQ7XG5cbiAgICBkZXNjcmlwdG9yLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGdldC5jYWxsKHRoaXMpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwge1xuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZm4gPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIHJldHVybiB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgdmFyIGNhY2hlID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIGZ1bmN0aW9uIG1lbW9pemVkKCkge1xuICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIga2V5ID0gYXJncy5sZW5ndGggPiAwID8gYXJnc1swXSA6ICd2YWx1ZSc7XG5cbiAgICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcmVzdWx0ID0gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgY2FjaGUuc2V0KGtleSwgcmVzdWx0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIHtcbiAgICAgICAgICB2YWx1ZTogbWVtb2l6ZWRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtZW1vaXplZDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbnZhciBTdWJIZWFkZXIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmlyc3RDb2RlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGVudHJ5Q291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgaWREZWx0YTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIGlkUmFuZ2VPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7XG52YXIgQ21hcEdyb3VwID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHN0YXJ0Q2hhckNvZGU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgZW5kQ2hhckNvZGU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgZ2x5cGhJRDogcmVzdHJ1Y3R1cmUudWludDMyXG59KTtcbnZhciBVbmljb2RlVmFsdWVSYW5nZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBzdGFydFVuaWNvZGVWYWx1ZTogcmVzdHJ1Y3R1cmUudWludDI0LFxuICBhZGRpdGlvbmFsQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQ4XG59KTtcbnZhciBVVlNNYXBwaW5nID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHVuaWNvZGVWYWx1ZTogcmVzdHJ1Y3R1cmUudWludDI0LFxuICBnbHlwaElEOiByZXN0cnVjdHVyZS51aW50MTZcbn0pO1xudmFyIERlZmF1bHRVVlMgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoVW5pY29kZVZhbHVlUmFuZ2UsIHJlc3RydWN0dXJlLnVpbnQzMik7XG52YXIgTm9uRGVmYXVsdFVWUyA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShVVlNNYXBwaW5nLCByZXN0cnVjdHVyZS51aW50MzIpO1xudmFyIFZhclNlbGVjdG9yUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZhclNlbGVjdG9yOiByZXN0cnVjdHVyZS51aW50MjQsXG4gIGRlZmF1bHRVVlM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgRGVmYXVsdFVWUywge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pLFxuICBub25EZWZhdWx0VVZTOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIE5vbkRlZmF1bHRVVlMsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgQ21hcFN1YnRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgMDoge1xuICAgIC8vIEJ5dGUgZW5jb2RpbmdcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyBUb3RhbCB0YWJsZSBsZW5ndGggaW4gYnl0ZXMgKHNldCB0byAyNjIgZm9yIGZvcm1hdCAwKVxuICAgIGxhbmd1YWdlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gTGFuZ3VhZ2UgY29kZSBmb3IgdGhpcyBlbmNvZGluZyBzdWJ0YWJsZSwgb3IgemVybyBpZiBsYW5ndWFnZS1pbmRlcGVuZGVudFxuICAgIGNvZGVNYXA6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUudWludDgsIDI1NilcbiAgfSxcbiAgMjoge1xuICAgIC8vIEhpZ2gtYnl0ZSBtYXBwaW5nIChDSkspXG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbGFuZ3VhZ2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBzdWJIZWFkZXJLZXlzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAyNTYpLFxuICAgIHN1YkhlYWRlckNvdW50OiBmdW5jdGlvbiBzdWJIZWFkZXJDb3VudCh0KSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgdC5zdWJIZWFkZXJLZXlzKTtcbiAgICB9LFxuICAgIHN1YkhlYWRlcnM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkoU3ViSGVhZGVyLCAnc3ViSGVhZGVyQ291bnQnKSxcbiAgICBnbHlwaEluZGV4QXJyYXk6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnc3ViSGVhZGVyQ291bnQnKVxuICB9LFxuICA0OiB7XG4gICAgLy8gU2VnbWVudCBtYXBwaW5nIHRvIGRlbHRhIHZhbHVlc1xuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIFRvdGFsIHRhYmxlIGxlbmd0aCBpbiBieXRlc1xuICAgIGxhbmd1YWdlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gTGFuZ3VhZ2UgY29kZVxuICAgIHNlZ0NvdW50WDI6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBzZWdDb3VudDogZnVuY3Rpb24gc2VnQ291bnQodCkge1xuICAgICAgcmV0dXJuIHQuc2VnQ291bnRYMiA+PiAxO1xuICAgIH0sXG4gICAgc2VhcmNoUmFuZ2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBlbnRyeVNlbGVjdG9yOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgcmFuZ2VTaGlmdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGVuZENvZGU6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnc2VnQ291bnQnKSxcbiAgICByZXNlcnZlZFBhZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gICAgLy8gVGhpcyB2YWx1ZSBzaG91bGQgYmUgemVyb1xuICAgIHN0YXJ0Q29kZTogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdzZWdDb3VudCcpLFxuICAgIGlkRGVsdGE6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUuaW50MTYsICdzZWdDb3VudCcpLFxuICAgIGlkUmFuZ2VPZmZzZXQ6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnc2VnQ291bnQnKSxcbiAgICBnbHlwaEluZGV4QXJyYXk6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuICh0Lmxlbmd0aCAtIHQuX2N1cnJlbnRPZmZzZXQpIC8gMjtcbiAgICB9KVxuICB9LFxuICA2OiB7XG4gICAgLy8gVHJpbW1lZCB0YWJsZVxuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGxhbmd1YWdlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZmlyc3RDb2RlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZW50cnlDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGdseXBoSW5kaWNlczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdlbnRyeUNvdW50JylcbiAgfSxcbiAgODoge1xuICAgIC8vIG1peGVkIDE2LWJpdCBhbmQgMzItYml0IGNvdmVyYWdlXG4gICAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGxhbmd1YWdlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgaXMzMjogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS51aW50OCwgODE5MiksXG4gICAgbkdyb3VwczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGdyb3VwczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShDbWFwR3JvdXAsICduR3JvdXBzJylcbiAgfSxcbiAgMTA6IHtcbiAgICAvLyBUcmltbWVkIEFycmF5XG4gICAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGxhbmd1YWdlOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZmlyc3RDb2RlOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZW50cnlDb3VudDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGdseXBoSW5kaWNlczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdudW1DaGFycycpXG4gIH0sXG4gIDEyOiB7XG4gICAgLy8gU2VnbWVudGVkIGNvdmVyYWdlXG4gICAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGxhbmd1YWdlOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgbkdyb3VwczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGdyb3VwczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShDbWFwR3JvdXAsICduR3JvdXBzJylcbiAgfSxcbiAgMTM6IHtcbiAgICAvLyBNYW55LXRvLW9uZSByYW5nZSBtYXBwaW5ncyAoc2FtZSBhcyAxMiBleGNlcHQgZm9yIGdyb3VwLnN0YXJ0R2x5cGhJRClcbiAgICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgbGFuZ3VhZ2U6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBuR3JvdXBzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZ3JvdXBzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KENtYXBHcm91cCwgJ25Hcm91cHMnKVxuICB9LFxuICAxNDoge1xuICAgIC8vIFVuaWNvZGUgVmFyaWF0aW9uIFNlcXVlbmNlc1xuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIG51bVJlY29yZHM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICB2YXJTZWxlY3RvcnM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkoVmFyU2VsZWN0b3JSZWNvcmQsICdudW1SZWNvcmRzJylcbiAgfVxufSk7XG52YXIgQ21hcEVudHJ5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHBsYXRmb3JtSUQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gUGxhdGZvcm0gaWRlbnRpZmllclxuICBlbmNvZGluZ0lEOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIFBsYXRmb3JtLXNwZWNpZmljIGVuY29kaW5nIGlkZW50aWZpZXJcbiAgdGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgQ21hcFN1YnRhYmxlLCB7XG4gICAgdHlwZTogJ3BhcmVudCcsXG4gICAgbGF6eTogdHJ1ZVxuICB9KVxufSk7IC8vIGNoYXJhY3RlciB0byBnbHlwaCBtYXBwaW5nXG5cbnZhciBjbWFwID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbnVtU3VidGFibGVzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHRhYmxlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KENtYXBFbnRyeSwgJ251bVN1YnRhYmxlcycpXG59KTtcblxudmFyIGhlYWQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUuaW50MzIsXG4gIC8vIDB4MDAwMTAwMDAgKHZlcnNpb24gMS4wKVxuICByZXZpc2lvbjogcmVzdHJ1Y3R1cmUuaW50MzIsXG4gIC8vIHNldCBieSBmb250IG1hbnVmYWN0dXJlclxuICBjaGVja1N1bUFkanVzdG1lbnQ6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbWFnaWNOdW1iZXI6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgLy8gc2V0IHRvIDB4NUYwRjNDRjVcbiAgZmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdW5pdHNQZXJFbTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyByYW5nZSBmcm9tIDY0IHRvIDE2Mzg0XG4gIGNyZWF0ZWQ6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS5pbnQzMiwgMiksXG4gIG1vZGlmaWVkOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUuaW50MzIsIDIpLFxuICB4TWluOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gZm9yIGFsbCBnbHlwaCBib3VuZGluZyBib3hlc1xuICB5TWluOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gZm9yIGFsbCBnbHlwaCBib3VuZGluZyBib3hlc1xuICB4TWF4OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gZm9yIGFsbCBnbHlwaCBib3VuZGluZyBib3hlc1xuICB5TWF4OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gZm9yIGFsbCBnbHlwaCBib3VuZGluZyBib3hlc1xuICBtYWNTdHlsZTogbmV3IHJlc3RydWN0dXJlLkJpdGZpZWxkKHJlc3RydWN0dXJlLnVpbnQxNiwgWydib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnb3V0bGluZScsICdzaGFkb3cnLCAnY29uZGVuc2VkJywgJ2V4dGVuZGVkJ10pLFxuICBsb3dlc3RSZWNQUEVNOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIHNtYWxsZXN0IHJlYWRhYmxlIHNpemUgaW4gcGl4ZWxzXG4gIGZvbnREaXJlY3Rpb25IaW50OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgaW5kZXhUb0xvY0Zvcm1hdDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIDAgZm9yIHNob3J0IG9mZnNldHMsIDEgZm9yIGxvbmdcbiAgZ2x5cGhEYXRhRm9ybWF0OiByZXN0cnVjdHVyZS5pbnQxNiAvLyAwIGZvciBjdXJyZW50IGZvcm1hdFxuXG59KTtcblxudmFyIGhoZWEgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUuaW50MzIsXG4gIGFzY2VudDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIERpc3RhbmNlIGZyb20gYmFzZWxpbmUgb2YgaGlnaGVzdCBhc2NlbmRlclxuICBkZXNjZW50OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gRGlzdGFuY2UgZnJvbSBiYXNlbGluZSBvZiBsb3dlc3QgZGVzY2VuZGVyXG4gIGxpbmVHYXA6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBUeXBvZ3JhcGhpYyBsaW5lIGdhcFxuICBhZHZhbmNlV2lkdGhNYXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTWF4aW11bSBhZHZhbmNlIHdpZHRoIHZhbHVlIGluICdobXR4JyB0YWJsZVxuICBtaW5MZWZ0U2lkZUJlYXJpbmc6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBNYXhpbXVtIGFkdmFuY2Ugd2lkdGggdmFsdWUgaW4gJ2htdHgnIHRhYmxlXG4gIG1pblJpZ2h0U2lkZUJlYXJpbmc6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBNaW5pbXVtIHJpZ2h0IHNpZGViZWFyaW5nIHZhbHVlXG4gIHhNYXhFeHRlbnQ6IHJlc3RydWN0dXJlLmludDE2LFxuICBjYXJldFNsb3BlUmlzZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIFVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzbG9wZSBvZiB0aGUgY3Vyc29yIChyaXNlL3J1bik7IDEgZm9yIHZlcnRpY2FsXG4gIGNhcmV0U2xvcGVSdW46IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyAwIGZvciB2ZXJ0aWNhbFxuICBjYXJldE9mZnNldDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIFNldCB0byAwIGZvciBub24tc2xhbnRlZCBmb250c1xuICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLmludDE2LCA0KSxcbiAgbWV0cmljRGF0YUZvcm1hdDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIDAgZm9yIGN1cnJlbnQgZm9ybWF0XG4gIG51bWJlck9mTWV0cmljczogcmVzdHJ1Y3R1cmUudWludDE2IC8vIE51bWJlciBvZiBhZHZhbmNlIHdpZHRocyBpbiAnaG10eCcgdGFibGVcblxufSk7XG5cbnZhciBIbXR4RW50cnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYWR2YW5jZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBiZWFyaW5nOiByZXN0cnVjdHVyZS5pbnQxNlxufSk7XG52YXIgaG10eCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBtZXRyaWNzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KEhtdHhFbnRyeSwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQuaGhlYS5udW1iZXJPZk1ldHJpY3M7XG4gIH0pLFxuICBiZWFyaW5nczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS5pbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQubWF4cC5udW1HbHlwaHMgLSB0LnBhcmVudC5oaGVhLm51bWJlck9mTWV0cmljcztcbiAgfSlcbn0pO1xuXG52YXIgbWF4cCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS5pbnQzMixcbiAgbnVtR2x5cGhzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSBmb250XG4gIG1heFBvaW50czogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBNYXhpbXVtIHBvaW50cyBpbiBhIG5vbi1jb21wb3NpdGUgZ2x5cGhcbiAgbWF4Q29udG91cnM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTWF4aW11bSBjb250b3VycyBpbiBhIG5vbi1jb21wb3NpdGUgZ2x5cGhcbiAgbWF4Q29tcG9uZW50UG9pbnRzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE1heGltdW0gcG9pbnRzIGluIGEgY29tcG9zaXRlIGdseXBoXG4gIG1heENvbXBvbmVudENvbnRvdXJzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE1heGltdW0gY29udG91cnMgaW4gYSBjb21wb3NpdGUgZ2x5cGhcbiAgbWF4Wm9uZXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gMSBpZiBpbnN0cnVjdGlvbnMgZG8gbm90IHVzZSB0aGUgdHdpbGlnaHQgem9uZSwgMiBvdGhlcndpc2VcbiAgbWF4VHdpbGlnaHRQb2ludHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTWF4aW11bSBwb2ludHMgdXNlZCBpbiBaMFxuICBtYXhTdG9yYWdlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE51bWJlciBvZiBTdG9yYWdlIEFyZWEgbG9jYXRpb25zXG4gIG1heEZ1bmN0aW9uRGVmczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBOdW1iZXIgb2YgRkRFRnNcbiAgbWF4SW5zdHJ1Y3Rpb25EZWZzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE51bWJlciBvZiBJREVGc1xuICBtYXhTdGFja0VsZW1lbnRzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE1heGltdW0gc3RhY2sgZGVwdGhcbiAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE1heGltdW0gYnl0ZSBjb3VudCBmb3IgZ2x5cGggaW5zdHJ1Y3Rpb25zXG4gIG1heENvbXBvbmVudEVsZW1lbnRzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE1heGltdW0gbnVtYmVyIG9mIGNvbXBvbmVudHMgcmVmZXJlbmNlZCBhdCDigJx0b3AgbGV2ZWzigJ0gZm9yIGFueSBjb21wb3NpdGUgZ2x5cGhcbiAgbWF4Q29tcG9uZW50RGVwdGg6IHJlc3RydWN0dXJlLnVpbnQxNiAvLyBNYXhpbXVtIGxldmVscyBvZiByZWN1cnNpb247IDEgZm9yIHNpbXBsZSBjb21wb25lbnRzXG5cbn0pO1xuXG4vKipcbiAqIEdldHMgYW4gZW5jb2RpbmcgbmFtZSBmcm9tIHBsYXRmb3JtLCBlbmNvZGluZywgYW5kIGxhbmd1YWdlIGlkcy5cbiAqIFJldHVybmVkIGVuY29kaW5nIG5hbWVzIGNhbiBiZSB1c2VkIGluIGljb252LWxpdGUgdG8gZGVjb2RlIHRleHQuXG4gKi9cbmZ1bmN0aW9uIGdldEVuY29kaW5nKHBsYXRmb3JtSUQsIGVuY29kaW5nSUQsIGxhbmd1YWdlSUQpIHtcbiAgaWYgKGxhbmd1YWdlSUQgPT09IHZvaWQgMCkge1xuICAgIGxhbmd1YWdlSUQgPSAwO1xuICB9XG5cbiAgaWYgKHBsYXRmb3JtSUQgPT09IDEgJiYgTUFDX0xBTkdVQUdFX0VOQ09ESU5HU1tsYW5ndWFnZUlEXSkge1xuICAgIHJldHVybiBNQUNfTEFOR1VBR0VfRU5DT0RJTkdTW2xhbmd1YWdlSURdO1xuICB9XG5cbiAgcmV0dXJuIEVOQ09ESU5HU1twbGF0Zm9ybUlEXVtlbmNvZGluZ0lEXTtcbn0gLy8gTWFwIG9mIHBsYXRmb3JtIGlkcyB0byBlbmNvZGluZyBpZHMuXG5cbnZhciBFTkNPRElOR1MgPSBbLy8gdW5pY29kZVxuWyd1dGYxNmJlJywgJ3V0ZjE2YmUnLCAndXRmMTZiZScsICd1dGYxNmJlJywgJ3V0ZjE2YmUnLCAndXRmMTZiZSddLCAvLyBtYWNpbnRvc2hcbi8vIE1hcHBpbmdzIGF2YWlsYWJsZSBhdCBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvXG4vLyAwXHRSb21hbiAgICAgICAgICAgICAgICAgMTdcdE1hbGF5YWxhbVxuLy8gMVx0SmFwYW5lc2VcdCAgICAgICAgICAgIDE4XHRTaW5oYWxlc2Vcbi8vIDJcdFRyYWRpdGlvbmFsIENoaW5lc2VcdCAgMTlcdEJ1cm1lc2Vcbi8vIDNcdEtvcmVhblx0ICAgICAgICAgICAgICAyMFx0S2htZXJcbi8vIDRcdEFyYWJpY1x0ICAgICAgICAgICAgICAyMVx0VGhhaVxuLy8gNVx0SGVicmV3XHQgICAgICAgICAgICAgIDIyXHRMYW90aWFuXG4vLyA2XHRHcmVla1x0ICAgICAgICAgICAgICAgIDIzXHRHZW9yZ2lhblxuLy8gN1x0UnVzc2lhblx0ICAgICAgICAgICAgICAyNFx0QXJtZW5pYW5cbi8vIDhcdFJTeW1ib2xcdCAgICAgICAgICAgICAgMjVcdFNpbXBsaWZpZWQgQ2hpbmVzZVxuLy8gOVx0RGV2YW5hZ2FyaVx0ICAgICAgICAgIDI2XHRUaWJldGFuXG4vLyAxMFx0R3VybXVraGlcdCAgICAgICAgICAgIDI3XHRNb25nb2xpYW5cbi8vIDExXHRHdWphcmF0aVx0ICAgICAgICAgICAgMjhcdEdlZXpcbi8vIDEyXHRPcml5YVx0ICAgICAgICAgICAgICAgIDI5XHRTbGF2aWNcbi8vIDEzXHRCZW5nYWxpXHQgICAgICAgICAgICAgIDMwXHRWaWV0bmFtZXNlXG4vLyAxNFx0VGFtaWxcdCAgICAgICAgICAgICAgICAzMVx0U2luZGhpXG4vLyAxNVx0VGVsdWd1XHQgICAgICAgICAgICAgIDMyXHQoVW5pbnRlcnByZXRlZClcbi8vIDE2XHRLYW5uYWRhXG5bJ21hY3JvbWFuJywgJ3NoaWZ0LWppcycsICdiaWc1JywgJ2V1Yy1rcicsICdpc28tODg1OS02JywgJ2lzby04ODU5LTgnLCAnbWFjZ3JlZWsnLCAnbWFjY3lyaWxsaWMnLCAnc3ltYm9sJywgJ0RldmFuYWdhcmknLCAnR3VybXVraGknLCAnR3VqYXJhdGknLCAnT3JpeWEnLCAnQmVuZ2FsaScsICdUYW1pbCcsICdUZWx1Z3UnLCAnS2FubmFkYScsICdNYWxheWFsYW0nLCAnU2luaGFsZXNlJywgJ0J1cm1lc2UnLCAnS2htZXInLCAnbWFjdGhhaScsICdMYW90aWFuJywgJ0dlb3JnaWFuJywgJ0FybWVuaWFuJywgJ2diLTIzMTItODAnLCAnVGliZXRhbicsICdNb25nb2xpYW4nLCAnR2VleicsICdtYWNjZW50ZXVybycsICdWaWV0bmFtZXNlJywgJ1NpbmRoaSddLCAvLyBJU08gKGRlcHJlY2F0ZWQpXG5bJ2FzY2lpJ10sIC8vIHdpbmRvd3Ncbi8vIERvY3MgaGVyZTogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3N5c3RlbS50ZXh0LmVuY29kaW5nKHY9dnMuMTEwKS5hc3B4XG5bJ3N5bWJvbCcsICd1dGYxNmJlJywgJ3NoaWZ0LWppcycsICdnYjE4MDMwJywgJ2JpZzUnLCAnd2Fuc3VuZycsICdqb2hhYicsIG51bGwsIG51bGwsIG51bGwsICd1dGYxNmJlJ11dOyAvLyBPdmVycmlkZXMgZm9yIE1hYyBzY3JpcHRzIGJ5IGxhbmd1YWdlIGlkLlxuLy8gU2VlIGh0dHA6Ly91bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9BUFBMRS9SZWFkbWUudHh0XG5cbnZhciBNQUNfTEFOR1VBR0VfRU5DT0RJTkdTID0ge1xuICAxNTogJ21hY2ljZWxhbmQnLFxuICAxNzogJ21hY3R1cmtpc2gnLFxuICAxODogJ21hY2Nyb2F0aWFuJyxcbiAgMjQ6ICdtYWNjZW50ZXVybycsXG4gIDI1OiAnbWFjY2VudGV1cm8nLFxuICAyNjogJ21hY2NlbnRldXJvJyxcbiAgMjc6ICdtYWNjZW50ZXVybycsXG4gIDI4OiAnbWFjY2VudGV1cm8nLFxuICAzMDogJ21hY2ljZWxhbmQnLFxuICAzNzogJ21hY3JvbWFuaWEnLFxuICAzODogJ21hY2NlbnRldXJvJyxcbiAgMzk6ICdtYWNjZW50ZXVybycsXG4gIDQwOiAnbWFjY2VudGV1cm8nLFxuICAxNDM6ICdtYWNpbnVpdCcsXG4gIC8vIFVuc3VwcG9ydGVkIGJ5IGljb252LWxpdGVcbiAgMTQ2OiAnbWFjZ2FlbGljJyAvLyBVbnN1cHBvcnRlZCBieSBpY29udi1saXRlXG5cbn07IC8vIE1hcCBvZiBwbGF0Zm9ybSBpZHMgdG8gQkNQLTQ3IGxhbmd1YWdlIGNvZGVzLlxuXG52YXIgTEFOR1VBR0VTID0gWy8vIHVuaWNvZGVcbltdLCB7XG4gIC8vIG1hY2ludG9zaFxuICAwOiAnZW4nLFxuICAzMDogJ2ZvJyxcbiAgNjA6ICdrcycsXG4gIDkwOiAncncnLFxuICAxOiAnZnInLFxuICAzMTogJ2ZhJyxcbiAgNjE6ICdrdScsXG4gIDkxOiAncm4nLFxuICAyOiAnZGUnLFxuICAzMjogJ3J1JyxcbiAgNjI6ICdzZCcsXG4gIDkyOiAnbnknLFxuICAzOiAnaXQnLFxuICAzMzogJ3poJyxcbiAgNjM6ICdibycsXG4gIDkzOiAnbWcnLFxuICA0OiAnbmwnLFxuICAzNDogJ25sLUJFJyxcbiAgNjQ6ICduZScsXG4gIDk0OiAnZW8nLFxuICA1OiAnc3YnLFxuICAzNTogJ2dhJyxcbiAgNjU6ICdzYScsXG4gIDEyODogJ2N5JyxcbiAgNjogJ2VzJyxcbiAgMzY6ICdzcScsXG4gIDY2OiAnbXInLFxuICAxMjk6ICdldScsXG4gIDc6ICdkYScsXG4gIDM3OiAncm8nLFxuICA2NzogJ2JuJyxcbiAgMTMwOiAnY2EnLFxuICA4OiAncHQnLFxuICAzODogJ2N6JyxcbiAgNjg6ICdhcycsXG4gIDEzMTogJ2xhJyxcbiAgOTogJ25vJyxcbiAgMzk6ICdzaycsXG4gIDY5OiAnZ3UnLFxuICAxMzI6ICdxdScsXG4gIDEwOiAnaGUnLFxuICA0MDogJ3NpJyxcbiAgNzA6ICdwYScsXG4gIDEzMzogJ2duJyxcbiAgMTE6ICdqYScsXG4gIDQxOiAneWknLFxuICA3MTogJ29yJyxcbiAgMTM0OiAnYXknLFxuICAxMjogJ2FyJyxcbiAgNDI6ICdzcicsXG4gIDcyOiAnbWwnLFxuICAxMzU6ICd0dCcsXG4gIDEzOiAnZmknLFxuICA0MzogJ21rJyxcbiAgNzM6ICdrbicsXG4gIDEzNjogJ3VnJyxcbiAgMTQ6ICdlbCcsXG4gIDQ0OiAnYmcnLFxuICA3NDogJ3RhJyxcbiAgMTM3OiAnZHonLFxuICAxNTogJ2lzJyxcbiAgNDU6ICd1aycsXG4gIDc1OiAndGUnLFxuICAxMzg6ICdqdicsXG4gIDE2OiAnbXQnLFxuICA0NjogJ2JlJyxcbiAgNzY6ICdzaScsXG4gIDEzOTogJ3N1JyxcbiAgMTc6ICd0cicsXG4gIDQ3OiAndXonLFxuICA3NzogJ215JyxcbiAgMTQwOiAnZ2wnLFxuICAxODogJ2hyJyxcbiAgNDg6ICdraycsXG4gIDc4OiAna20nLFxuICAxNDE6ICdhZicsXG4gIDE5OiAnemgtSGFudCcsXG4gIDQ5OiAnYXotQ3lybCcsXG4gIDc5OiAnbG8nLFxuICAxNDI6ICdicicsXG4gIDIwOiAndXInLFxuICA1MDogJ2F6LUFyYWInLFxuICA4MDogJ3ZpJyxcbiAgMTQzOiAnaXUnLFxuICAyMTogJ2hpJyxcbiAgNTE6ICdoeScsXG4gIDgxOiAnaWQnLFxuICAxNDQ6ICdnZCcsXG4gIDIyOiAndGgnLFxuICA1MjogJ2thJyxcbiAgODI6ICd0bCcsXG4gIDE0NTogJ2d2JyxcbiAgMjM6ICdrbycsXG4gIDUzOiAnbW8nLFxuICA4MzogJ21zJyxcbiAgMTQ2OiAnZ2EnLFxuICAyNDogJ2x0JyxcbiAgNTQ6ICdreScsXG4gIDg0OiAnbXMtQXJhYicsXG4gIDE0NzogJ3RvJyxcbiAgMjU6ICdwbCcsXG4gIDU1OiAndGcnLFxuICA4NTogJ2FtJyxcbiAgMTQ4OiAnZWwtcG9seXRvbicsXG4gIDI2OiAnaHUnLFxuICA1NjogJ3RrJyxcbiAgODY6ICd0aScsXG4gIDE0OTogJ2tsJyxcbiAgMjc6ICdlcycsXG4gIDU3OiAnbW4tQ04nLFxuICA4NzogJ29tJyxcbiAgMTUwOiAnYXonLFxuICAyODogJ2x2JyxcbiAgNTg6ICdtbicsXG4gIDg4OiAnc28nLFxuICAxNTE6ICdubicsXG4gIDI5OiAnc2UnLFxuICA1OTogJ3BzJyxcbiAgODk6ICdzdydcbn0sIC8vIElTTyAoZGVwcmVjYXRlZClcbltdLCB7XG4gIC8vIHdpbmRvd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIDB4MDQzNjogJ2FmJyxcbiAgMHg0MDA5OiAnZW4tSU4nLFxuICAweDA0ODc6ICdydycsXG4gIDB4MDQzMjogJ3RuJyxcbiAgMHgwNDFDOiAnc3EnLFxuICAweDE4MDk6ICdlbi1JRScsXG4gIDB4MDQ0MTogJ3N3JyxcbiAgMHgwNDVCOiAnc2knLFxuICAweDA0ODQ6ICdnc3cnLFxuICAweDIwMDk6ICdlbi1KTScsXG4gIDB4MDQ1NzogJ2tvaycsXG4gIDB4MDQxQjogJ3NrJyxcbiAgMHgwNDVFOiAnYW0nLFxuICAweDQ0MDk6ICdlbi1NWScsXG4gIDB4MDQxMjogJ2tvJyxcbiAgMHgwNDI0OiAnc2wnLFxuICAweDE0MDE6ICdhci1EWicsXG4gIDB4MTQwOTogJ2VuLU5aJyxcbiAgMHgwNDQwOiAna3knLFxuICAweDJDMEE6ICdlcy1BUicsXG4gIDB4M0MwMTogJ2FyLUJIJyxcbiAgMHgzNDA5OiAnZW4tUEgnLFxuICAweDA0NTQ6ICdsbycsXG4gIDB4NDAwQTogJ2VzLUJPJyxcbiAgMHgwQzAxOiAnYXInLFxuICAweDQ4MDk6ICdlbi1TRycsXG4gIDB4MDQyNjogJ2x2JyxcbiAgMHgzNDBBOiAnZXMtQ0wnLFxuICAweDA4MDE6ICdhci1JUScsXG4gIDB4MUMwOTogJ2VuLVpBJyxcbiAgMHgwNDI3OiAnbHQnLFxuICAweDI0MEE6ICdlcy1DTycsXG4gIDB4MkMwMTogJ2FyLUpPJyxcbiAgMHgyQzA5OiAnZW4tVFQnLFxuICAweDA4MkU6ICdkc2InLFxuICAweDE0MEE6ICdlcy1DUicsXG4gIDB4MzQwMTogJ2FyLUtXJyxcbiAgMHgwODA5OiAnZW4tR0InLFxuICAweDA0NkU6ICdsYicsXG4gIDB4MUMwQTogJ2VzLURPJyxcbiAgMHgzMDAxOiAnYXItTEInLFxuICAweDA0MDk6ICdlbicsXG4gIDB4MDQyRjogJ21rJyxcbiAgMHgzMDBBOiAnZXMtRUMnLFxuICAweDEwMDE6ICdhci1MWScsXG4gIDB4MzAwOTogJ2VuLVpXJyxcbiAgMHgwODNFOiAnbXMtQk4nLFxuICAweDQ0MEE6ICdlcy1TVicsXG4gIDB4MTgwMTogJ2FyeScsXG4gIDB4MDQyNTogJ2V0JyxcbiAgMHgwNDNFOiAnbXMnLFxuICAweDEwMEE6ICdlcy1HVCcsXG4gIDB4MjAwMTogJ2FyLU9NJyxcbiAgMHgwNDM4OiAnZm8nLFxuICAweDA0NEM6ICdtbCcsXG4gIDB4NDgwQTogJ2VzLUhOJyxcbiAgMHg0MDAxOiAnYXItUUEnLFxuICAweDA0NjQ6ICdmaWwnLFxuICAweDA0M0E6ICdtdCcsXG4gIDB4MDgwQTogJ2VzLU1YJyxcbiAgMHgwNDAxOiAnYXItU0EnLFxuICAweDA0MEI6ICdmaScsXG4gIDB4MDQ4MTogJ21pJyxcbiAgMHg0QzBBOiAnZXMtTkknLFxuICAweDI4MDE6ICdhci1TWScsXG4gIDB4MDgwQzogJ2ZyLUJFJyxcbiAgMHgwNDdBOiAnYXJuJyxcbiAgMHgxODBBOiAnZXMtUEEnLFxuICAweDFDMDE6ICdhZWInLFxuICAweDBDMEM6ICdmci1DQScsXG4gIDB4MDQ0RTogJ21yJyxcbiAgMHgzQzBBOiAnZXMtUFknLFxuICAweDM4MDE6ICdhci1BRScsXG4gIDB4MDQwQzogJ2ZyJyxcbiAgMHgwNDdDOiAnbW9oJyxcbiAgMHgyODBBOiAnZXMtUEUnLFxuICAweDI0MDE6ICdhci1ZRScsXG4gIDB4MTQwQzogJ2ZyLUxVJyxcbiAgMHgwNDUwOiAnbW4nLFxuICAweDUwMEE6ICdlcy1QUicsXG4gIDB4MDQyQjogJ2h5JyxcbiAgMHgxODBDOiAnZnItTUMnLFxuICAweDA4NTA6ICdtbi1DTicsXG4gIDB4MEMwQTogJ2VzJyxcbiAgMHgwNDREOiAnYXMnLFxuICAweDEwMEM6ICdmci1DSCcsXG4gIDB4MDQ2MTogJ25lJyxcbiAgMHgwNDBBOiAnZXMnLFxuICAweDA4MkM6ICdhei1DeXJsJyxcbiAgMHgwNDYyOiAnZnknLFxuICAweDA0MTQ6ICduYicsXG4gIDB4NTQwQTogJ2VzLVVTJyxcbiAgMHgwNDJDOiAnYXonLFxuICAweDA0NTY6ICdnbCcsXG4gIDB4MDgxNDogJ25uJyxcbiAgMHgzODBBOiAnZXMtVVknLFxuICAweDA0NkQ6ICdiYScsXG4gIDB4MDQzNzogJ2thJyxcbiAgMHgwNDgyOiAnb2MnLFxuICAweDIwMEE6ICdlcy1WRScsXG4gIDB4MDQyRDogJ2V1JyxcbiAgMHgwQzA3OiAnZGUtQVQnLFxuICAweDA0NDg6ICdvcicsXG4gIDB4MDgxRDogJ3N2LUZJJyxcbiAgMHgwNDIzOiAnYmUnLFxuICAweDA0MDc6ICdkZScsXG4gIDB4MDQ2MzogJ3BzJyxcbiAgMHgwNDFEOiAnc3YnLFxuICAweDA4NDU6ICdibicsXG4gIDB4MTQwNzogJ2RlLUxJJyxcbiAgMHgwNDE1OiAncGwnLFxuICAweDA0NUE6ICdzeXInLFxuICAweDA0NDU6ICdibi1JTicsXG4gIDB4MTAwNzogJ2RlLUxVJyxcbiAgMHgwNDE2OiAncHQnLFxuICAweDA0Mjg6ICd0ZycsXG4gIDB4MjAxQTogJ2JzLUN5cmwnLFxuICAweDA4MDc6ICdkZS1DSCcsXG4gIDB4MDgxNjogJ3B0LVBUJyxcbiAgMHgwODVGOiAndHptJyxcbiAgMHgxNDFBOiAnYnMnLFxuICAweDA0MDg6ICdlbCcsXG4gIDB4MDQ0NjogJ3BhJyxcbiAgMHgwNDQ5OiAndGEnLFxuICAweDA0N0U6ICdicicsXG4gIDB4MDQ2RjogJ2tsJyxcbiAgMHgwNDZCOiAncXUtQk8nLFxuICAweDA0NDQ6ICd0dCcsXG4gIDB4MDQwMjogJ2JnJyxcbiAgMHgwNDQ3OiAnZ3UnLFxuICAweDA4NkI6ICdxdS1FQycsXG4gIDB4MDQ0QTogJ3RlJyxcbiAgMHgwNDAzOiAnY2EnLFxuICAweDA0Njg6ICdoYScsXG4gIDB4MEM2QjogJ3F1JyxcbiAgMHgwNDFFOiAndGgnLFxuICAweDBDMDQ6ICd6aC1ISycsXG4gIDB4MDQwRDogJ2hlJyxcbiAgMHgwNDE4OiAncm8nLFxuICAweDA0NTE6ICdibycsXG4gIDB4MTQwNDogJ3poLU1PJyxcbiAgMHgwNDM5OiAnaGknLFxuICAweDA0MTc6ICdybScsXG4gIDB4MDQxRjogJ3RyJyxcbiAgMHgwODA0OiAnemgnLFxuICAweDA0MEU6ICdodScsXG4gIDB4MDQxOTogJ3J1JyxcbiAgMHgwNDQyOiAndGsnLFxuICAweDEwMDQ6ICd6aC1TRycsXG4gIDB4MDQwRjogJ2lzJyxcbiAgMHgyNDNCOiAnc21uJyxcbiAgMHgwNDgwOiAndWcnLFxuICAweDA0MDQ6ICd6aC1UVycsXG4gIDB4MDQ3MDogJ2lnJyxcbiAgMHgxMDNCOiAnc21qLU5PJyxcbiAgMHgwNDIyOiAndWsnLFxuICAweDA0ODM6ICdjbycsXG4gIDB4MDQyMTogJ2lkJyxcbiAgMHgxNDNCOiAnc21qJyxcbiAgMHgwNDJFOiAnaHNiJyxcbiAgMHgwNDFBOiAnaHInLFxuICAweDA0NUQ6ICdpdScsXG4gIDB4MEMzQjogJ3NlLUZJJyxcbiAgMHgwNDIwOiAndXInLFxuICAweDEwMUE6ICdoci1CQScsXG4gIDB4MDg1RDogJ2l1LUxhdG4nLFxuICAweDA0M0I6ICdzZScsXG4gIDB4MDg0MzogJ3V6LUN5cmwnLFxuICAweDA0MDU6ICdjcycsXG4gIDB4MDgzQzogJ2dhJyxcbiAgMHgwODNCOiAnc2UtU0UnLFxuICAweDA0NDM6ICd1eicsXG4gIDB4MDQwNjogJ2RhJyxcbiAgMHgwNDM0OiAneGgnLFxuICAweDIwM0I6ICdzbXMnLFxuICAweDA0MkE6ICd2aScsXG4gIDB4MDQ4QzogJ3BycycsXG4gIDB4MDQzNTogJ3p1JyxcbiAgMHgxODNCOiAnc21hLU5PJyxcbiAgMHgwNDUyOiAnY3knLFxuICAweDA0NjU6ICdkdicsXG4gIDB4MDQxMDogJ2l0JyxcbiAgMHgxQzNCOiAnc21zJyxcbiAgMHgwNDg4OiAnd28nLFxuICAweDA4MTM6ICdubC1CRScsXG4gIDB4MDgxMDogJ2l0LUNIJyxcbiAgMHgwNDRGOiAnc2EnLFxuICAweDA0ODU6ICdzYWgnLFxuICAweDA0MTM6ICdubCcsXG4gIDB4MDQxMTogJ2phJyxcbiAgMHgxQzFBOiAnc3ItQ3lybC1CQScsXG4gIDB4MDQ3ODogJ2lpJyxcbiAgMHgwQzA5OiAnZW4tQVUnLFxuICAweDA0NEI6ICdrbicsXG4gIDB4MEMxQTogJ3NyJyxcbiAgMHgwNDZBOiAneW8nLFxuICAweDI4MDk6ICdlbi1CWicsXG4gIDB4MDQzRjogJ2trJyxcbiAgMHgxODFBOiAnc3ItTGF0bi1CQScsXG4gIDB4MTAwOTogJ2VuLUNBJyxcbiAgMHgwNDUzOiAna20nLFxuICAweDA4MUE6ICdzci1MYXRuJyxcbiAgMHgyNDA5OiAnZW4tMDI5JyxcbiAgMHgwNDg2OiAncXVjJyxcbiAgMHgwNDZDOiAnbnNvJ1xufV07XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cbnZhciBOYW1lUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHBsYXRmb3JtSUQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZW5jb2RpbmdJRDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsYW5ndWFnZUlEOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG5hbWVJRDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc3RyaW5nOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoJ2xlbmd0aCcsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIGdldEVuY29kaW5nKHQucGxhdGZvcm1JRCwgdC5lbmNvZGluZ0lELCB0Lmxhbmd1YWdlSUQpO1xuICB9KSwge1xuICAgIHR5cGU6ICdwYXJlbnQnLFxuICAgIHJlbGF0aXZlVG86ICdwYXJlbnQuc3RyaW5nT2Zmc2V0JyxcbiAgICBhbGxvd051bGw6IGZhbHNlXG4gIH0pXG59KTtcbnZhciBMYW5nVGFnUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgbmV3IHJlc3RydWN0dXJlLlN0cmluZygnbGVuZ3RoJywgJ3V0ZjE2YmUnKSwge1xuICAgIHR5cGU6ICdwYXJlbnQnLFxuICAgIHJlbGF0aXZlVG86ICdzdHJpbmdPZmZzZXQnXG4gIH0pXG59KTtcbnZhciBOYW1lVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAwOiB7XG4gICAgY291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBzdHJpbmdPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICByZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTmFtZVJlY29yZCwgJ2NvdW50JylcbiAgfSxcbiAgMToge1xuICAgIGNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgc3RyaW5nT2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgcmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KE5hbWVSZWNvcmQsICdjb3VudCcpLFxuICAgIGxhbmdUYWdDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGxhbmdUYWdzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTGFuZ1RhZ1JlY29yZCwgJ2xhbmdUYWdDb3VudCcpXG4gIH1cbn0pO1xudmFyIE5BTUVTID0gWydjb3B5cmlnaHQnLCAnZm9udEZhbWlseScsICdmb250U3ViZmFtaWx5JywgJ3VuaXF1ZVN1YmZhbWlseScsICdmdWxsTmFtZScsICd2ZXJzaW9uJywgJ3Bvc3RzY3JpcHROYW1lJywgLy8gTm90ZTogQSBmb250IG1heSBoYXZlIG9ubHkgb25lIFBvc3RTY3JpcHQgbmFtZSBhbmQgdGhhdCBuYW1lIG11c3QgYmUgQVNDSUkuXG4ndHJhZGVtYXJrJywgJ21hbnVmYWN0dXJlcicsICdkZXNpZ25lcicsICdkZXNjcmlwdGlvbicsICd2ZW5kb3JVUkwnLCAnZGVzaWduZXJVUkwnLCAnbGljZW5zZScsICdsaWNlbnNlVVJMJywgbnVsbCwgLy8gcmVzZXJ2ZWRcbidwcmVmZXJyZWRGYW1pbHknLCAncHJlZmVycmVkU3ViZmFtaWx5JywgJ2NvbXBhdGlibGVGdWxsJywgJ3NhbXBsZVRleHQnLCAncG9zdHNjcmlwdENJREZvbnROYW1lJywgJ3d3c0ZhbWlseU5hbWUnLCAnd3dzU3ViZmFtaWx5TmFtZSddO1xuXG5OYW1lVGFibGUucHJvY2VzcyA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHJlY29yZHMgPSB7fTtcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKHRoaXMucmVjb3JkcyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgdmFyIHJlY29yZCA9IF9zdGVwLnZhbHVlO1xuICAgIC8vIGZpbmQgb3V0IHdoYXQgbGFuZ3VhZ2UgdGhpcyBpcyBmb3JcbiAgICB2YXIgbGFuZ3VhZ2UgPSBMQU5HVUFHRVNbcmVjb3JkLnBsYXRmb3JtSURdW3JlY29yZC5sYW5ndWFnZUlEXTtcblxuICAgIGlmIChsYW5ndWFnZSA9PSBudWxsICYmIHRoaXMubGFuZ1RhZ3MgIT0gbnVsbCAmJiByZWNvcmQubGFuZ3VhZ2VJRCA+PSAweDgwMDApIHtcbiAgICAgIGxhbmd1YWdlID0gdGhpcy5sYW5nVGFnc1tyZWNvcmQubGFuZ3VhZ2VJRCAtIDB4ODAwMF0udGFnO1xuICAgIH1cblxuICAgIGlmIChsYW5ndWFnZSA9PSBudWxsKSB7XG4gICAgICBsYW5ndWFnZSA9IHJlY29yZC5wbGF0Zm9ybUlEICsgJy0nICsgcmVjb3JkLmxhbmd1YWdlSUQ7XG4gICAgfSAvLyBpZiB0aGUgbmFtZUlEIGlzID49IDI1NiwgaXQgaXMgYSBmb250IGZlYXR1cmUgcmVjb3JkIChBQVQpXG5cblxuICAgIHZhciBrZXkgPSByZWNvcmQubmFtZUlEID49IDI1NiA/ICdmb250RmVhdHVyZXMnIDogTkFNRVNbcmVjb3JkLm5hbWVJRF0gfHwgcmVjb3JkLm5hbWVJRDtcblxuICAgIGlmIChyZWNvcmRzW2tleV0gPT0gbnVsbCkge1xuICAgICAgcmVjb3Jkc1trZXldID0ge307XG4gICAgfVxuXG4gICAgdmFyIG9iaiA9IHJlY29yZHNba2V5XTtcblxuICAgIGlmIChyZWNvcmQubmFtZUlEID49IDI1Nikge1xuICAgICAgb2JqID0gb2JqW3JlY29yZC5uYW1lSURdIHx8IChvYmpbcmVjb3JkLm5hbWVJRF0gPSB7fSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWNvcmQuc3RyaW5nID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb2JqW2xhbmd1YWdlXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIG9ialtsYW5ndWFnZV0gPSByZWNvcmQuc3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMucmVjb3JkcyA9IHJlY29yZHM7XG59O1xuXG5OYW1lVGFibGUucHJlRW5jb2RlID0gZnVuY3Rpb24gKCkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnJlY29yZHMpKSByZXR1cm47XG4gIHRoaXMudmVyc2lvbiA9IDA7XG4gIHZhciByZWNvcmRzID0gW107XG5cbiAgZm9yICh2YXIga2V5IGluIHRoaXMucmVjb3Jkcykge1xuICAgIHZhciB2YWwgPSB0aGlzLnJlY29yZHNba2V5XTtcbiAgICBpZiAoa2V5ID09PSAnZm9udEZlYXR1cmVzJykgY29udGludWU7XG4gICAgcmVjb3Jkcy5wdXNoKHtcbiAgICAgIHBsYXRmb3JtSUQ6IDMsXG4gICAgICBlbmNvZGluZ0lEOiAxLFxuICAgICAgbGFuZ3VhZ2VJRDogMHg0MDksXG4gICAgICBuYW1lSUQ6IE5BTUVTLmluZGV4T2Yoa2V5KSxcbiAgICAgIGxlbmd0aDogYnVmZmVyXzEuYnl0ZUxlbmd0aCh2YWwuZW4sICd1dGYxNmxlJyksXG4gICAgICBzdHJpbmc6IHZhbC5lblxuICAgIH0pO1xuXG4gICAgaWYgKGtleSA9PT0gJ3Bvc3RzY3JpcHROYW1lJykge1xuICAgICAgcmVjb3Jkcy5wdXNoKHtcbiAgICAgICAgcGxhdGZvcm1JRDogMSxcbiAgICAgICAgZW5jb2RpbmdJRDogMCxcbiAgICAgICAgbGFuZ3VhZ2VJRDogMCxcbiAgICAgICAgbmFtZUlEOiBOQU1FUy5pbmRleE9mKGtleSksXG4gICAgICAgIGxlbmd0aDogdmFsLmVuLmxlbmd0aCxcbiAgICAgICAgc3RyaW5nOiB2YWwuZW5cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMucmVjb3JkcyA9IHJlY29yZHM7XG4gIHRoaXMuY291bnQgPSByZWNvcmRzLmxlbmd0aDtcbiAgdGhpcy5zdHJpbmdPZmZzZXQgPSBOYW1lVGFibGUuc2l6ZSh0aGlzLCBudWxsLCBmYWxzZSk7XG59O1xuXG52YXIgT1MyID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgaGVhZGVyOiB7XG4gICAgeEF2Z0NoYXJXaWR0aDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gYXZlcmFnZSB3ZWlnaHRlZCBhZHZhbmNlIHdpZHRoIG9mIGxvd2VyIGNhc2UgbGV0dGVycyBhbmQgc3BhY2VcbiAgICB1c1dlaWdodENsYXNzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gdmlzdWFsIHdlaWdodCBvZiBzdHJva2UgaW4gZ2x5cGhzXG4gICAgdXNXaWR0aENsYXNzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gcmVsYXRpdmUgY2hhbmdlIGZyb20gdGhlIG5vcm1hbCBhc3BlY3QgcmF0aW8gKHdpZHRoIHRvIGhlaWdodCByYXRpbylcbiAgICBmc1R5cGU6IG5ldyByZXN0cnVjdHVyZS5CaXRmaWVsZChyZXN0cnVjdHVyZS51aW50MTYsIFsvLyBJbmRpY2F0ZXMgZm9udCBlbWJlZGRpbmcgbGljZW5zaW5nIHJpZ2h0c1xuICAgIG51bGwsICdub0VtYmVkZGluZycsICd2aWV3T25seScsICdlZGl0YWJsZScsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICdub1N1YnNldHRpbmcnLCAnYml0bWFwT25seSddKSxcbiAgICB5U3Vic2NyaXB0WFNpemU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIHJlY29tbWVuZGVkIGhvcml6b250YWwgc2l6ZSBpbiBwaXhlbHMgZm9yIHN1YnNjcmlwdHNcbiAgICB5U3Vic2NyaXB0WVNpemU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIHJlY29tbWVuZGVkIHZlcnRpY2FsIHNpemUgaW4gcGl4ZWxzIGZvciBzdWJzY3JpcHRzXG4gICAgeVN1YnNjcmlwdFhPZmZzZXQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIHJlY29tbWVuZGVkIGhvcml6b250YWwgb2Zmc2V0IGZvciBzdWJzY3JpcHRzXG4gICAgeVN1YnNjcmlwdFlPZmZzZXQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIHJlY29tbWVuZGVkIHZlcnRpY2FsIG9mZnNldCBmb3JtIHRoZSBiYXNlbGluZSBmb3Igc3Vic2NyaXB0c1xuICAgIHlTdXBlcnNjcmlwdFhTaXplOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyByZWNvbW1lbmRlZCBob3Jpem9udGFsIHNpemUgaW4gcGl4ZWxzIGZvciBzdXBlcnNjcmlwdHNcbiAgICB5U3VwZXJzY3JpcHRZU2l6ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gcmVjb21tZW5kZWQgdmVydGljYWwgc2l6ZSBpbiBwaXhlbHMgZm9yIHN1cGVyc2NyaXB0c1xuICAgIHlTdXBlcnNjcmlwdFhPZmZzZXQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIHJlY29tbWVuZGVkIGhvcml6b250YWwgb2Zmc2V0IGZvciBzdXBlcnNjcmlwdHNcbiAgICB5U3VwZXJzY3JpcHRZT2Zmc2V0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyByZWNvbW1lbmRlZCB2ZXJ0aWNhbCBvZmZzZXQgZnJvbSB0aGUgYmFzZWxpbmUgZm9yIHN1cGVyc2NyaXB0c1xuICAgIHlTdHJpa2VvdXRTaXplOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyB3aWR0aCBvZiB0aGUgc3RyaWtlb3V0IHN0cm9rZVxuICAgIHlTdHJpa2VvdXRQb3NpdGlvbjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gcG9zaXRpb24gb2YgdGhlIHN0cmlrZW91dCBzdHJva2UgcmVsYXRpdmUgdG8gdGhlIGJhc2VsaW5lXG4gICAgc0ZhbWlseUNsYXNzOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyBjbGFzc2lmaWNhdGlvbiBvZiBmb250LWZhbWlseSBkZXNpZ25cbiAgICBwYW5vc2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgMTApLFxuICAgIC8vIGRlc2NyaWJlIHRoZSB2aXN1YWwgY2hhcmFjdGVyaXN0aWNzIG9mIGEgZ2l2ZW4gdHlwZWZhY2VcbiAgICB1bENoYXJSYW5nZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQzMiwgNCksXG4gICAgdmVuZG9ySUQ6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gICAgLy8gZm91ciBjaGFyYWN0ZXIgaWRlbnRpZmllciBmb3IgdGhlIGZvbnQgdmVuZG9yXG4gICAgZnNTZWxlY3Rpb246IG5ldyByZXN0cnVjdHVyZS5CaXRmaWVsZChyZXN0cnVjdHVyZS51aW50MTYsIFsvLyBiaXQgZmllbGQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZm9udFxuICAgICdpdGFsaWMnLCAndW5kZXJzY29yZScsICduZWdhdGl2ZScsICdvdXRsaW5lZCcsICdzdHJpa2VvdXQnLCAnYm9sZCcsICdyZWd1bGFyJywgJ3VzZVR5cG9NZXRyaWNzJywgJ3d3cycsICdvYmxpcXVlJ10pLFxuICAgIHVzRmlyc3RDaGFySW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyBUaGUgbWluaW11bSBVbmljb2RlIGluZGV4IGluIHRoaXMgZm9udFxuICAgIHVzTGFzdENoYXJJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2IC8vIFRoZSBtYXhpbXVtIFVuaWNvZGUgaW5kZXggaW4gdGhpcyBmb250XG5cbiAgfSxcbiAgLy8gVGhlIEFwcGxlIHZlcnNpb24gb2YgdGhpcyB0YWJsZSBlbmRzIGhlcmUsIGJ1dCB0aGUgTWljcm9zb2Z0IG9uZSBjb250aW51ZXMgb24uLi5cbiAgMDoge30sXG4gIDE6IHtcbiAgICB0eXBvQXNjZW5kZXI6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHR5cG9EZXNjZW5kZXI6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHR5cG9MaW5lR2FwOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB3aW5Bc2NlbnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICB3aW5EZXNjZW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY29kZVBhZ2VSYW5nZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQzMiwgMilcbiAgfSxcbiAgMjoge1xuICAgIC8vIHRoZXNlIHNob3VsZCBiZSBjb21tb24gd2l0aCB2ZXJzaW9uIDEgc29tZWhvd1xuICAgIHR5cG9Bc2NlbmRlcjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgdHlwb0Rlc2NlbmRlcjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgdHlwb0xpbmVHYXA6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHdpbkFzY2VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHdpbkRlc2NlbnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb2RlUGFnZVJhbmdlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDMyLCAyKSxcbiAgICB4SGVpZ2h0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICBjYXBIZWlnaHQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIGRlZmF1bHRDaGFyOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgYnJlYWtDaGFyOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbWF4Q29udGVudDogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH0sXG4gIDU6IHtcbiAgICB0eXBvQXNjZW5kZXI6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHR5cG9EZXNjZW5kZXI6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHR5cG9MaW5lR2FwOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB3aW5Bc2NlbnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICB3aW5EZXNjZW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY29kZVBhZ2VSYW5nZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQzMiwgMiksXG4gICAgeEhlaWdodDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgY2FwSGVpZ2h0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICBkZWZhdWx0Q2hhcjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGJyZWFrQ2hhcjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG1heENvbnRlbnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICB1c0xvd2VyT3B0aWNhbFBvaW50U2l6ZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHVzVXBwZXJPcHRpY2FsUG9pbnRTaXplOiByZXN0cnVjdHVyZS51aW50MTZcbiAgfVxufSk7XG52YXIgdmVyc2lvbnMkMSA9IE9TMi52ZXJzaW9ucztcbnZlcnNpb25zJDFbM10gPSB2ZXJzaW9ucyQxWzRdID0gdmVyc2lvbnMkMVsyXTtcblxudmFyIHBvc3QgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLmZpeGVkMzIsIHtcbiAgaGVhZGVyOiB7XG4gICAgLy8gdGhlc2UgZmllbGRzIGV4aXN0IGF0IHRoZSB0b3Agb2YgYWxsIHZlcnNpb25zXG4gICAgaXRhbGljQW5nbGU6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gICAgLy8gSXRhbGljIGFuZ2xlIGluIGNvdW50ZXItY2xvY2t3aXNlIGRlZ3JlZXMgZnJvbSB0aGUgdmVydGljYWwuXG4gICAgdW5kZXJsaW5lUG9zaXRpb246IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIFN1Z2dlc3RlZCBkaXN0YW5jZSBvZiB0aGUgdG9wIG9mIHRoZSB1bmRlcmxpbmUgZnJvbSB0aGUgYmFzZWxpbmVcbiAgICB1bmRlcmxpbmVUaGlja25lc3M6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIFN1Z2dlc3RlZCB2YWx1ZXMgZm9yIHRoZSB1bmRlcmxpbmUgdGhpY2tuZXNzXG4gICAgaXNGaXhlZFBpdGNoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgLy8gV2hldGhlciB0aGUgZm9udCBpcyBtb25vc3BhY2VkXG4gICAgbWluTWVtVHlwZTQyOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgLy8gTWluaW11bSBtZW1vcnkgdXNhZ2Ugd2hlbiBhIFRydWVUeXBlIGZvbnQgaXMgZG93bmxvYWRlZCBhcyBhIFR5cGUgNDIgZm9udFxuICAgIG1heE1lbVR5cGU0MjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIC8vIE1heGltdW0gbWVtb3J5IHVzYWdlIHdoZW4gYSBUcnVlVHlwZSBmb250IGlzIGRvd25sb2FkZWQgYXMgYSBUeXBlIDQyIGZvbnRcbiAgICBtaW5NZW1UeXBlMTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIC8vIE1pbmltdW0gbWVtb3J5IHVzYWdlIHdoZW4gYSBUcnVlVHlwZSBmb250IGlzIGRvd25sb2FkZWQgYXMgYSBUeXBlIDEgZm9udFxuICAgIG1heE1lbVR5cGUxOiByZXN0cnVjdHVyZS51aW50MzIgLy8gTWF4aW11bSBtZW1vcnkgdXNhZ2Ugd2hlbiBhIFRydWVUeXBlIGZvbnQgaXMgZG93bmxvYWRlZCBhcyBhIFR5cGUgMSBmb250XG5cbiAgfSxcbiAgMToge30sXG4gIC8vIHZlcnNpb24gMSBoYXMgbm8gYWRkaXRpb25hbCBmaWVsZHNcbiAgMjoge1xuICAgIG51bWJlck9mR2x5cGhzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZ2x5cGhOYW1lSW5kZXg6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdudW1iZXJPZkdseXBocycpLFxuICAgIG5hbWVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlN0cmluZyhyZXN0cnVjdHVyZS51aW50OCkpXG4gIH0sXG4gIDIuNToge1xuICAgIG51bWJlck9mR2x5cGhzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgb2Zmc2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCAnbnVtYmVyT2ZHbHlwaHMnKVxuICB9LFxuICAzOiB7fSxcbiAgLy8gdmVyc2lvbiAzIGhhcyBubyBhZGRpdGlvbmFsIGZpZWxkc1xuICA0OiB7XG4gICAgbWFwOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDMyLCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQucGFyZW50Lm1heHAubnVtR2x5cGhzO1xuICAgIH0pXG4gIH1cbn0pO1xuXG52YXIgY3Z0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGNvbnRyb2xWYWx1ZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS5pbnQxNilcbn0pO1xuXG4vLyBUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIGtub3duIGFzIHRoZSBmb250IHByb2dyYW0uIFRoZSBtYWluIHVzZSBvZiB0aGlzIHRhYmxlXG4vLyBpcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgaW4gbWFueSBkaWZmZXJlbnQgZ2x5cGggcHJvZ3JhbXMuXG5cbnZhciBmcGdtID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGluc3RydWN0aW9uczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4KVxufSk7XG5cbnZhciBsb2NhID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdCgnaGVhZC5pbmRleFRvTG9jRm9ybWF0Jywge1xuICAwOiB7XG4gICAgb2Zmc2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNilcbiAgfSxcbiAgMToge1xuICAgIG9mZnNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MzIpXG4gIH1cbn0pO1xuXG5sb2NhLnByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnZlcnNpb24gPT09IDApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub2Zmc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5vZmZzZXRzW2ldIDw8PSAxO1xuICAgIH1cbiAgfVxufTtcblxubG9jYS5wcmVFbmNvZGUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnZlcnNpb24gIT0gbnVsbCkgcmV0dXJuOyAvLyBhc3N1bWUgdGhpcy5vZmZzZXRzIGlzIGEgc29ydGVkIGFycmF5XG5cbiAgdGhpcy52ZXJzaW9uID0gdGhpcy5vZmZzZXRzW3RoaXMub2Zmc2V0cy5sZW5ndGggLSAxXSA+IDB4ZmZmZiA/IDEgOiAwO1xuXG4gIGlmICh0aGlzLnZlcnNpb24gPT09IDApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub2Zmc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5vZmZzZXRzW2ldID4+Pj0gMTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBwcmVwID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGNvbnRyb2xWYWx1ZVByb2dyYW06IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OClcbn0pO1xuXG52YXIgZ2x5ZiA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuQnVmZmVyKCkpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDEobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDEobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDEobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQxKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JDEoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBDRkZJbmRleCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENGRkluZGV4KHR5cGUpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IENGRkluZGV4LnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0Q0ZGVmVyc2lvbiA9IGZ1bmN0aW9uIGdldENGRlZlcnNpb24oY3R4KSB7XG4gICAgd2hpbGUgKGN0eCAmJiAhY3R4LmhkclNpemUpIHtcbiAgICAgIGN0eCA9IGN0eC5wYXJlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN0eCA/IGN0eC52ZXJzaW9uIDogLTE7XG4gIH07XG5cbiAgX3Byb3RvLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCkge1xuICAgIHZhciB2ZXJzaW9uID0gdGhpcy5nZXRDRkZWZXJzaW9uKHBhcmVudCk7XG4gICAgdmFyIGNvdW50ID0gdmVyc2lvbiA+PSAyID8gc3RyZWFtLnJlYWRVSW50MzJCRSgpIDogc3RyZWFtLnJlYWRVSW50MTZCRSgpO1xuXG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIG9mZlNpemUgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG4gICAgdmFyIG9mZnNldFR5cGU7XG5cbiAgICBpZiAob2ZmU2l6ZSA9PT0gMSkge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQ4O1xuICAgIH0gZWxzZSBpZiAob2ZmU2l6ZSA9PT0gMikge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQxNjtcbiAgICB9IGVsc2UgaWYgKG9mZlNpemUgPT09IDMpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50MjQ7XG4gICAgfSBlbHNlIGlmIChvZmZTaXplID09PSA0KSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDMyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgb2Zmc2V0IHNpemUgaW4gQ0ZGSW5kZXg6IFwiICsgb2ZmU2l6ZSArIFwiIFwiICsgc3RyZWFtLnBvcyk7XG4gICAgfVxuXG4gICAgdmFyIHJldCA9IFtdO1xuICAgIHZhciBzdGFydFBvcyA9IHN0cmVhbS5wb3MgKyAoY291bnQgKyAxKSAqIG9mZlNpemUgLSAxO1xuICAgIHZhciBzdGFydCA9IG9mZnNldFR5cGUuZGVjb2RlKHN0cmVhbSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIHZhciBlbmQgPSBvZmZzZXRUeXBlLmRlY29kZShzdHJlYW0pO1xuXG4gICAgICBpZiAodGhpcy50eXBlICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHBvcyA9IHN0cmVhbS5wb3M7XG4gICAgICAgIHN0cmVhbS5wb3MgPSBzdGFydFBvcyArIHN0YXJ0O1xuICAgICAgICBwYXJlbnQubGVuZ3RoID0gZW5kIC0gc3RhcnQ7XG4gICAgICAgIHJldC5wdXNoKHRoaXMudHlwZS5kZWNvZGUoc3RyZWFtLCBwYXJlbnQpKTtcbiAgICAgICAgc3RyZWFtLnBvcyA9IHBvcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldC5wdXNoKHtcbiAgICAgICAgICBvZmZzZXQ6IHN0YXJ0UG9zICsgc3RhcnQsXG4gICAgICAgICAgbGVuZ3RoOiBlbmQgLSBzdGFydFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgc3RhcnQgPSBlbmQ7XG4gICAgfVxuXG4gICAgc3RyZWFtLnBvcyA9IHN0YXJ0UG9zICsgc3RhcnQ7XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICBfcHJvdG8uc2l6ZSA9IGZ1bmN0aW9uIHNpemUoYXJyLCBwYXJlbnQpIHtcbiAgICB2YXIgc2l6ZSA9IDI7XG5cbiAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHNpemU7XG4gICAgfVxuXG4gICAgdmFyIHR5cGUgPSB0aGlzLnR5cGUgfHwgbmV3IHJlc3RydWN0dXJlLkJ1ZmZlcigpOyAvLyBmaW5kIG1heGltdW0gb2Zmc2V0IHRvIGRldG1pbmluZSBvZmZzZXQgdHlwZVxuXG4gICAgdmFyIG9mZnNldCA9IDE7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSBhcnJbaV07XG4gICAgICBvZmZzZXQgKz0gdHlwZS5zaXplKGl0ZW0sIHBhcmVudCk7XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldFR5cGU7XG5cbiAgICBpZiAob2Zmc2V0IDw9IDB4ZmYpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50ODtcbiAgICB9IGVsc2UgaWYgKG9mZnNldCA8PSAweGZmZmYpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50MTY7XG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gMHhmZmZmZmYpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50MjQ7XG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gMHhmZmZmZmZmZikge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQzMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIG9mZnNldCBpbiBDRkZJbmRleFwiKTtcbiAgICB9XG5cbiAgICBzaXplICs9IDEgKyBvZmZzZXRUeXBlLnNpemUoKSAqIChhcnIubGVuZ3RoICsgMSk7XG4gICAgc2l6ZSArPSBvZmZzZXQgLSAxO1xuICAgIHJldHVybiBzaXplO1xuICB9O1xuXG4gIF9wcm90by5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyZWFtLCBhcnIsIHBhcmVudCkge1xuICAgIHN0cmVhbS53cml0ZVVJbnQxNkJFKGFyci5sZW5ndGgpO1xuXG4gICAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9IHRoaXMudHlwZSB8fCBuZXcgcmVzdHJ1Y3R1cmUuQnVmZmVyKCk7IC8vIGZpbmQgbWF4aW11bSBvZmZzZXQgdG8gZGV0bWluaW5lIG9mZnNldCB0eXBlXG5cbiAgICB2YXIgc2l6ZXMgPSBbXTtcbiAgICB2YXIgb2Zmc2V0ID0gMTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkMShhcnIpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIGl0ZW0gPSBfc3RlcC52YWx1ZTtcbiAgICAgIHZhciBzID0gdHlwZS5zaXplKGl0ZW0sIHBhcmVudCk7XG4gICAgICBzaXplcy5wdXNoKHMpO1xuICAgICAgb2Zmc2V0ICs9IHM7XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldFR5cGU7XG5cbiAgICBpZiAob2Zmc2V0IDw9IDB4ZmYpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50ODtcbiAgICB9IGVsc2UgaWYgKG9mZnNldCA8PSAweGZmZmYpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50MTY7XG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gMHhmZmZmZmYpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50MjQ7XG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gMHhmZmZmZmZmZikge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQzMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIG9mZnNldCBpbiBDRkZJbmRleFwiKTtcbiAgICB9IC8vIHdyaXRlIG9mZnNldCBzaXplXG5cblxuICAgIHN0cmVhbS53cml0ZVVJbnQ4KG9mZnNldFR5cGUuc2l6ZSgpKTsgLy8gd3JpdGUgZWxlbWVudHNcblxuICAgIG9mZnNldCA9IDE7XG4gICAgb2Zmc2V0VHlwZS5lbmNvZGUoc3RyZWFtLCBvZmZzZXQpO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwLCBfc2l6ZXMgPSBzaXplczsgX2kgPCBfc2l6ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgc2l6ZSA9IF9zaXplc1tfaV07XG4gICAgICBvZmZzZXQgKz0gc2l6ZTtcbiAgICAgIG9mZnNldFR5cGUuZW5jb2RlKHN0cmVhbSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQxKGFyciksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgX2l0ZW0gPSBfc3RlcDIudmFsdWU7XG4gICAgICB0eXBlLmVuY29kZShzdHJlYW0sIF9pdGVtLCBwYXJlbnQpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfTtcblxuICByZXR1cm4gQ0ZGSW5kZXg7XG59KCk7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbnZhciBpc0FyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIHZhciBzdHIgPSB0b1N0ci5jYWxsKHZhbHVlKTtcbiAgdmFyIGlzQXJncyA9IHN0ciA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbiAgaWYgKCFpc0FyZ3MpIHtcbiAgICBpc0FyZ3MgPSBzdHIgIT09ICdbb2JqZWN0IEFycmF5XScgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJyAmJiB2YWx1ZS5sZW5ndGggPj0gMCAmJiB0b1N0ci5jYWxsKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gIH1cblxuICByZXR1cm4gaXNBcmdzO1xufTtcblxudmFyIGtleXNTaGltO1xuXG5pZiAoIU9iamVjdC5rZXlzKSB7XG4gIC8vIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltXG4gIHZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICB2YXIgdG9TdHIkMSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gIHZhciBpc0FyZ3MgPSBpc0FyZ3VtZW50czsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnbG9iYWwtcmVxdWlyZVxuXG4gIHZhciBpc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICB2YXIgaGFzRG9udEVudW1CdWcgPSAhaXNFbnVtZXJhYmxlLmNhbGwoe1xuICAgIHRvU3RyaW5nOiBudWxsXG4gIH0sICd0b1N0cmluZycpO1xuICB2YXIgaGFzUHJvdG9FbnVtQnVnID0gaXNFbnVtZXJhYmxlLmNhbGwoZnVuY3Rpb24gKCkge30sICdwcm90b3R5cGUnKTtcbiAgdmFyIGRvbnRFbnVtcyA9IFsndG9TdHJpbmcnLCAndG9Mb2NhbGVTdHJpbmcnLCAndmFsdWVPZicsICdoYXNPd25Qcm9wZXJ0eScsICdpc1Byb3RvdHlwZU9mJywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJ2NvbnN0cnVjdG9yJ107XG5cbiAgdmFyIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlID0gZnVuY3Rpb24gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUobykge1xuICAgIHZhciBjdG9yID0gby5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvciAmJiBjdG9yLnByb3RvdHlwZSA9PT0gbztcbiAgfTtcblxuICB2YXIgZXhjbHVkZWRLZXlzID0ge1xuICAgICRhcHBsaWNhdGlvbkNhY2hlOiB0cnVlLFxuICAgICRjb25zb2xlOiB0cnVlLFxuICAgICRleHRlcm5hbDogdHJ1ZSxcbiAgICAkZnJhbWU6IHRydWUsXG4gICAgJGZyYW1lRWxlbWVudDogdHJ1ZSxcbiAgICAkZnJhbWVzOiB0cnVlLFxuICAgICRpbm5lckhlaWdodDogdHJ1ZSxcbiAgICAkaW5uZXJXaWR0aDogdHJ1ZSxcbiAgICAkb25tb3pmdWxsc2NyZWVuY2hhbmdlOiB0cnVlLFxuICAgICRvbm1vemZ1bGxzY3JlZW5lcnJvcjogdHJ1ZSxcbiAgICAkb3V0ZXJIZWlnaHQ6IHRydWUsXG4gICAgJG91dGVyV2lkdGg6IHRydWUsXG4gICAgJHBhZ2VYT2Zmc2V0OiB0cnVlLFxuICAgICRwYWdlWU9mZnNldDogdHJ1ZSxcbiAgICAkcGFyZW50OiB0cnVlLFxuICAgICRzY3JvbGxMZWZ0OiB0cnVlLFxuICAgICRzY3JvbGxUb3A6IHRydWUsXG4gICAgJHNjcm9sbFg6IHRydWUsXG4gICAgJHNjcm9sbFk6IHRydWUsXG4gICAgJHNlbGY6IHRydWUsXG4gICAgJHdlYmtpdEluZGV4ZWREQjogdHJ1ZSxcbiAgICAkd2Via2l0U3RvcmFnZUluZm86IHRydWUsXG4gICAgJHdpbmRvdzogdHJ1ZVxuICB9O1xuXG4gIHZhciBoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgLyogZ2xvYmFsIHdpbmRvdyAqL1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGsgaW4gd2luZG93KSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWV4Y2x1ZGVkS2V5c1snJCcgKyBrXSAmJiBoYXMuY2FsbCh3aW5kb3csIGspICYmIHdpbmRvd1trXSAhPT0gbnVsbCAmJiB0eXBlb2Ygd2luZG93W2tdID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSh3aW5kb3dba10pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0oKTtcblxuICB2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5ID0gZnVuY3Rpb24gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5KG8pIHtcbiAgICAvKiBnbG9iYWwgd2luZG93ICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcpIHtcbiAgICAgIHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKG8pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAga2V5c1NoaW0gPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgIHZhciBpc09iamVjdCA9IG9iamVjdCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JztcbiAgICB2YXIgaXNGdW5jdGlvbiA9IHRvU3RyJDEuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIHZhciBpc0FyZ3VtZW50cyA9IGlzQXJncyhvYmplY3QpO1xuICAgIHZhciBpc1N0cmluZyA9IGlzT2JqZWN0ICYmIHRvU3RyJDEuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBTdHJpbmddJztcbiAgICB2YXIgdGhlS2V5cyA9IFtdO1xuXG4gICAgaWYgKCFpc09iamVjdCAmJiAhaXNGdW5jdGlvbiAmJiAhaXNBcmd1bWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICB2YXIgc2tpcFByb3RvID0gaGFzUHJvdG9FbnVtQnVnICYmIGlzRnVuY3Rpb247XG5cbiAgICBpZiAoaXNTdHJpbmcgJiYgb2JqZWN0Lmxlbmd0aCA+IDAgJiYgIWhhcy5jYWxsKG9iamVjdCwgMCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHRoZUtleXMucHVzaChTdHJpbmcoaSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0FyZ3VtZW50cyAmJiBvYmplY3QubGVuZ3RoID4gMCkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvYmplY3QubGVuZ3RoOyArK2opIHtcbiAgICAgICAgdGhlS2V5cy5wdXNoKFN0cmluZyhqKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmICghKHNraXBQcm90byAmJiBuYW1lID09PSAncHJvdG90eXBlJykgJiYgaGFzLmNhbGwob2JqZWN0LCBuYW1lKSkge1xuICAgICAgICAgIHRoZUtleXMucHVzaChTdHJpbmcobmFtZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc0RvbnRFbnVtQnVnKSB7XG4gICAgICB2YXIgc2tpcENvbnN0cnVjdG9yID0gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5KG9iamVjdCk7XG5cbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZG9udEVudW1zLmxlbmd0aDsgKytrKSB7XG4gICAgICAgIGlmICghKHNraXBDb25zdHJ1Y3RvciAmJiBkb250RW51bXNba10gPT09ICdjb25zdHJ1Y3RvcicpICYmIGhhcy5jYWxsKG9iamVjdCwgZG9udEVudW1zW2tdKSkge1xuICAgICAgICAgIHRoZUtleXMucHVzaChkb250RW51bXNba10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoZUtleXM7XG4gIH07XG59XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IGtleXNTaGltO1xuXG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgb3JpZ0tleXMgPSBPYmplY3Qua2V5cztcbnZhciBrZXlzU2hpbSQxID0gb3JpZ0tleXMgPyBmdW5jdGlvbiBrZXlzKG8pIHtcbiAgcmV0dXJuIG9yaWdLZXlzKG8pO1xufSA6IGltcGxlbWVudGF0aW9uO1xudmFyIG9yaWdpbmFsS2V5cyA9IE9iamVjdC5rZXlzO1xuXG5rZXlzU2hpbSQxLnNoaW0gPSBmdW5jdGlvbiBzaGltT2JqZWN0S2V5cygpIHtcbiAgaWYgKE9iamVjdC5rZXlzKSB7XG4gICAgdmFyIGtleXNXb3Jrc1dpdGhBcmd1bWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBTYWZhcmkgNS4wIGJ1Z1xuICAgICAgdmFyIGFyZ3MgPSBPYmplY3Qua2V5cyhhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIGFyZ3MgJiYgYXJncy5sZW5ndGggPT09IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgfSgxLCAyKTtcblxuICAgIGlmICgha2V5c1dvcmtzV2l0aEFyZ3VtZW50cykge1xuICAgICAgT2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICBpZiAoaXNBcmd1bWVudHMob2JqZWN0KSkge1xuICAgICAgICAgIHJldHVybiBvcmlnaW5hbEtleXMoc2xpY2UuY2FsbChvYmplY3QpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmlnaW5hbEtleXMob2JqZWN0KTtcbiAgICAgIH07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIE9iamVjdC5rZXlzID0ga2V5c1NoaW0kMTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyB8fCBrZXlzU2hpbSQxO1xufTtcblxudmFyIG9iamVjdEtleXMgPSBrZXlzU2hpbSQxO1xuXG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xudmFyIHRvU3RyJDIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG52YXIgaXNTdGFuZGFyZEFyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIGlmIChoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0b1N0ciQyLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn07XG5cbnZhciBpc0xlZ2FjeUFyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIGlmIChpc1N0YW5kYXJkQXJndW1lbnRzKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcicgJiYgdmFsdWUubGVuZ3RoID49IDAgJiYgdG9TdHIkMi5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgQXJyYXldJyAmJiB0b1N0ciQyLmNhbGwodmFsdWUuY2FsbGVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn07XG5cbnZhciBzdXBwb3J0c1N0YW5kYXJkQXJndW1lbnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNTdGFuZGFyZEFyZ3VtZW50cyhhcmd1bWVudHMpO1xufSgpO1xuXG5pc1N0YW5kYXJkQXJndW1lbnRzLmlzTGVnYWN5QXJndW1lbnRzID0gaXNMZWdhY3lBcmd1bWVudHM7IC8vIGZvciB0ZXN0c1xuXG52YXIgaXNBcmd1bWVudHMkMSA9IHN1cHBvcnRzU3RhbmRhcmRBcmd1bWVudHMgPyBpc1N0YW5kYXJkQXJndW1lbnRzIDogaXNMZWdhY3lBcmd1bWVudHM7XG5cbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sKCdmb28nKSA9PT0gJ3N5bWJvbCc7XG52YXIgdG9TdHIkMyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBvcmlnRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbnZhciBpc0Z1bmN0aW9uJDEgPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKGZuKSB7XG4gIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgdG9TdHIkMy5jYWxsKGZuKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbn07XG5cbnZhciBhcmVQcm9wZXJ0eURlc2NyaXB0b3JzU3VwcG9ydGVkID0gZnVuY3Rpb24gYXJlUHJvcGVydHlEZXNjcmlwdG9yc1N1cHBvcnRlZCgpIHtcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIHRyeSB7XG4gICAgb3JpZ0RlZmluZVByb3BlcnR5KG9iaiwgJ3gnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBvYmpcbiAgICB9KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby1yZXN0cmljdGVkLXN5bnRheFxuXG4gICAgZm9yICh2YXIgXyBpbiBvYmopIHtcbiAgICAgIC8vIGpzY3M6aWdub3JlIGRpc2FsbG93VW51c2VkVmFyaWFibGVzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iai54ID09PSBvYmo7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvKiB0aGlzIGlzIElFIDguICovXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG52YXIgc3VwcG9ydHNEZXNjcmlwdG9ycyA9IG9yaWdEZWZpbmVQcm9wZXJ0eSAmJiBhcmVQcm9wZXJ0eURlc2NyaXB0b3JzU3VwcG9ydGVkKCk7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KG9iamVjdCwgbmFtZSwgdmFsdWUsIHByZWRpY2F0ZSkge1xuICBpZiAobmFtZSBpbiBvYmplY3QgJiYgKCFpc0Z1bmN0aW9uJDEocHJlZGljYXRlKSB8fCAhcHJlZGljYXRlKCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMpIHtcbiAgICBvcmlnRGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W25hbWVdID0gdmFsdWU7XG4gIH1cbn07XG5cbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIG1hcCkge1xuICB2YXIgcHJlZGljYXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDoge307XG4gIHZhciBwcm9wcyA9IG9iamVjdEtleXMobWFwKTtcblxuICBpZiAoaGFzU3ltYm9scykge1xuICAgIHByb3BzID0gY29uY2F0LmNhbGwocHJvcHMsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobWFwKSk7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wc1tpXSwgbWFwW3Byb3BzW2ldXSwgcHJlZGljYXRlc1twcm9wc1tpXV0pO1xuICB9XG59O1xuXG5kZWZpbmVQcm9wZXJ0aWVzLnN1cHBvcnRzRGVzY3JpcHRvcnMgPSAhIXN1cHBvcnRzRGVzY3JpcHRvcnM7XG52YXIgZGVmaW5lUHJvcGVydGllc18xID0gZGVmaW5lUHJvcGVydGllcztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgc2xpY2UkMSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciB0b1N0ciQ0ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmdW5jVHlwZSA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiQxID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7XG4gIHZhciB0YXJnZXQgPSB0aGlzO1xuXG4gIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHRvU3RyJDQuY2FsbCh0YXJnZXQpICE9PSBmdW5jVHlwZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gIH1cblxuICB2YXIgYXJncyA9IHNsaWNlJDEuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgYm91bmQ7XG5cbiAgdmFyIGJpbmRlciA9IGZ1bmN0aW9uIGJpbmRlcigpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3MuY29uY2F0KHNsaWNlJDEuY2FsbChhcmd1bWVudHMpKSk7XG5cbiAgICAgIGlmIChPYmplY3QocmVzdWx0KSA9PT0gcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KHRoYXQsIGFyZ3MuY29uY2F0KHNsaWNlJDEuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBib3VuZExlbmd0aCA9IE1hdGgubWF4KDAsIHRhcmdldC5sZW5ndGggLSBhcmdzLmxlbmd0aCk7XG4gIHZhciBib3VuZEFyZ3MgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICBib3VuZEFyZ3MucHVzaCgnJCcgKyBpKTtcbiAgfVxuXG4gIGJvdW5kID0gRnVuY3Rpb24oJ2JpbmRlcicsICdyZXR1cm4gZnVuY3Rpb24gKCcgKyBib3VuZEFyZ3Muam9pbignLCcpICsgJyl7IHJldHVybiBiaW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOyB9JykoYmluZGVyKTtcblxuICBpZiAodGFyZ2V0LnByb3RvdHlwZSkge1xuICAgIHZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KCkge307XG5cbiAgICBFbXB0eS5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlO1xuICAgIGJvdW5kLnByb3RvdHlwZSA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gYm91bmQ7XG59O1xuXG52YXIgZnVuY3Rpb25CaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgfHwgaW1wbGVtZW50YXRpb24kMTtcblxuLyogZXNsaW50IGNvbXBsZXhpdHk6IFsyLCAxOF0sIG1heC1zdGF0ZW1lbnRzOiBbMiwgMzNdICovXG5cbnZhciBzaGFtcyA9IGZ1bmN0aW9uIGhhc1N5bWJvbHMoKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgb2JqID0ge307XG4gIHZhciBzeW0gPSBTeW1ib2woJ3Rlc3QnKTtcbiAgdmFyIHN5bU9iaiA9IE9iamVjdChzeW0pO1xuXG4gIGlmICh0eXBlb2Ygc3ltID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bU9iaikgIT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIHRlbXAgZGlzYWJsZWQgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvb2JqZWN0LmFzc2lnbi9pc3N1ZXMvMTdcbiAgLy8gaWYgKHN5bSBpbnN0YW5jZW9mIFN5bWJvbCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgLy8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL1dlYlJlZmxlY3Rpb24vZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzL2lzc3Vlcy80XG4gIC8vIGlmICghKHN5bU9iaiBpbnN0YW5jZW9mIFN5bWJvbCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIC8vIGlmICh0eXBlb2YgU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cbiAgLy8gaWYgKFN0cmluZyhzeW0pICE9PSBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXG4gIHZhciBzeW1WYWwgPSA0MjtcbiAgb2JqW3N5bV0gPSBzeW1WYWw7XG5cbiAgZm9yIChzeW0gaW4gb2JqKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcblxuXG4gIGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzID09PSAnZnVuY3Rpb24nICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHN5bXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG5cbiAgaWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHN5bSk7XG5cbiAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSAhPT0gc3ltVmFsIHx8IGRlc2NyaXB0b3IuZW51bWVyYWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIG9yaWdTeW1ib2wgPSBjb21tb25qc0dsb2JhbC5TeW1ib2w7XG5cbnZhciBoYXNTeW1ib2xzJDEgPSBmdW5jdGlvbiBoYXNOYXRpdmVTeW1ib2xzKCkge1xuICBpZiAodHlwZW9mIG9yaWdTeW1ib2wgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCgnZm9vJykgIT09ICdzeW1ib2wnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2woJ2JhcicpICE9PSAnc3ltYm9sJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBzaGFtcygpO1xufTtcblxuLyogZ2xvYmFsc1xuXHRBdG9taWNzLFxuXHRTaGFyZWRBcnJheUJ1ZmZlcixcbiovXG5cblxudmFyIHVuZGVmaW5lZCQxO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgJGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5pZiAoJGdPUEQpIHtcbiAgdHJ5IHtcbiAgICAkZ09QRCh7fSwgJycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgJGdPUEQgPSBudWxsOyAvLyB0aGlzIGlzIElFIDgsIHdoaWNoIGhhcyBhIGJyb2tlbiBnT1BEXG4gIH1cbn1cblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gdGhyb3dUeXBlRXJyb3IoKSB7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKCk7XG59O1xuXG52YXIgVGhyb3dUeXBlRXJyb3IgPSAkZ09QRCA/IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zLCBuby1jYWxsZXIsIG5vLXJlc3RyaWN0ZWQtcHJvcGVydGllc1xuICAgIGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXG4gICAgcmV0dXJuIHRocm93VHlwZUVycm9yO1xuICB9IGNhdGNoIChjYWxsZWVUaHJvd3MpIHtcbiAgICB0cnkge1xuICAgICAgLy8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuICAgICAgcmV0dXJuICRnT1BEKGFyZ3VtZW50cywgJ2NhbGxlZScpLmdldDtcbiAgICB9IGNhdGNoIChnT1BEdGhyb3dzKSB7XG4gICAgICByZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG4gICAgfVxuICB9XG59KCkgOiB0aHJvd1R5cGVFcnJvcjtcbnZhciBoYXNTeW1ib2xzJDIgPSBoYXNTeW1ib2xzJDEoKTtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uICh4KSB7XG4gIHJldHVybiB4Ll9fcHJvdG9fXztcbn07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cblxudmFyIGdlbmVyYXRvckZ1bmN0aW9uID0gIHVuZGVmaW5lZCQxO1xuXG52YXIgYXN5bmNGdW5jdGlvbiA9ICB1bmRlZmluZWQkMTtcblxudmFyIGFzeW5jR2VuRnVuY3Rpb24gPSAgdW5kZWZpbmVkJDE7XG52YXIgVHlwZWRBcnJheSA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogZ2V0UHJvdG8oVWludDhBcnJheSk7XG52YXIgSU5UUklOU0lDUyA9IHtcbiAgJyVBcnJheSUnOiBBcnJheSxcbiAgJyVBcnJheUJ1ZmZlciUnOiB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBBcnJheUJ1ZmZlcixcbiAgJyVBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBBcnJheUJ1ZmZlci5wcm90b3R5cGUsXG4gICclQXJyYXlJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzJDIgPyBnZXRQcm90byhbXVtTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkJDEsXG4gICclQXJyYXlQcm90b3R5cGUlJzogQXJyYXkucHJvdG90eXBlLFxuICAnJUFycmF5UHJvdG9fZW50cmllcyUnOiBBcnJheS5wcm90b3R5cGUuZW50cmllcyxcbiAgJyVBcnJheVByb3RvX2ZvckVhY2glJzogQXJyYXkucHJvdG90eXBlLmZvckVhY2gsXG4gICclQXJyYXlQcm90b19rZXlzJSc6IEFycmF5LnByb3RvdHlwZS5rZXlzLFxuICAnJUFycmF5UHJvdG9fdmFsdWVzJSc6IEFycmF5LnByb3RvdHlwZS52YWx1ZXMsXG4gICclQXN5bmNGcm9tU3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IHVuZGVmaW5lZCQxLFxuICAnJUFzeW5jRnVuY3Rpb24lJzogYXN5bmNGdW5jdGlvbixcbiAgJyVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSc6ICB1bmRlZmluZWQkMSxcbiAgJyVBc3luY0dlbmVyYXRvciUnOiAgdW5kZWZpbmVkJDEsXG4gICclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiBhc3luY0dlbkZ1bmN0aW9uLFxuICAnJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSc6ICB1bmRlZmluZWQkMSxcbiAgJyVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6ICB1bmRlZmluZWQkMSxcbiAgJyVBdG9taWNzJSc6IHR5cGVvZiBBdG9taWNzID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogQXRvbWljcyxcbiAgJyVCb29sZWFuJSc6IEJvb2xlYW4sXG4gICclQm9vbGVhblByb3RvdHlwZSUnOiBCb29sZWFuLnByb3RvdHlwZSxcbiAgJyVEYXRhVmlldyUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBEYXRhVmlldyxcbiAgJyVEYXRhVmlld1Byb3RvdHlwZSUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBEYXRhVmlldy5wcm90b3R5cGUsXG4gICclRGF0ZSUnOiBEYXRlLFxuICAnJURhdGVQcm90b3R5cGUlJzogRGF0ZS5wcm90b3R5cGUsXG4gICclZGVjb2RlVVJJJSc6IGRlY29kZVVSSSxcbiAgJyVkZWNvZGVVUklDb21wb25lbnQlJzogZGVjb2RlVVJJQ29tcG9uZW50LFxuICAnJWVuY29kZVVSSSUnOiBlbmNvZGVVUkksXG4gICclZW5jb2RlVVJJQ29tcG9uZW50JSc6IGVuY29kZVVSSUNvbXBvbmVudCxcbiAgJyVFcnJvciUnOiBFcnJvcixcbiAgJyVFcnJvclByb3RvdHlwZSUnOiBFcnJvci5wcm90b3R5cGUsXG4gICclZXZhbCUnOiBldmFsLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcbiAgJyVFdmFsRXJyb3IlJzogRXZhbEVycm9yLFxuICAnJUV2YWxFcnJvclByb3RvdHlwZSUnOiBFdmFsRXJyb3IucHJvdG90eXBlLFxuICAnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogRmxvYXQzMkFycmF5LFxuICAnJUZsb2F0MzJBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogRmxvYXQzMkFycmF5LnByb3RvdHlwZSxcbiAgJyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEZsb2F0NjRBcnJheSxcbiAgJyVGbG9hdDY0QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEZsb2F0NjRBcnJheS5wcm90b3R5cGUsXG4gICclRnVuY3Rpb24lJzogRnVuY3Rpb24sXG4gICclRnVuY3Rpb25Qcm90b3R5cGUlJzogRnVuY3Rpb24ucHJvdG90eXBlLFxuICAnJUdlbmVyYXRvciUnOiAgdW5kZWZpbmVkJDEsXG4gICclR2VuZXJhdG9yRnVuY3Rpb24lJzogZ2VuZXJhdG9yRnVuY3Rpb24sXG4gICclR2VuZXJhdG9yUHJvdG90eXBlJSc6ICB1bmRlZmluZWQkMSxcbiAgJyVJbnQ4QXJyYXklJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEludDhBcnJheSxcbiAgJyVJbnQ4QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEludDhBcnJheS5wcm90b3R5cGUsXG4gICclSW50MTZBcnJheSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEludDE2QXJyYXksXG4gICclSW50MTZBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEludDhBcnJheS5wcm90b3R5cGUsXG4gICclSW50MzJBcnJheSUnOiB0eXBlb2YgSW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEludDMyQXJyYXksXG4gICclSW50MzJBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgSW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEludDMyQXJyYXkucHJvdG90eXBlLFxuICAnJWlzRmluaXRlJSc6IGlzRmluaXRlLFxuICAnJWlzTmFOJSc6IGlzTmFOLFxuICAnJUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMkMiA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkJDEsXG4gICclSlNPTiUnOiB0eXBlb2YgSlNPTiA9PT0gJ29iamVjdCcgPyBKU09OIDogdW5kZWZpbmVkJDEsXG4gICclSlNPTlBhcnNlJSc6IHR5cGVvZiBKU09OID09PSAnb2JqZWN0JyA/IEpTT04ucGFyc2UgOiB1bmRlZmluZWQkMSxcbiAgJyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IE1hcCxcbiAgJyVNYXBJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyQyID8gdW5kZWZpbmVkJDEgOiBnZXRQcm90byhuZXcgTWFwKClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcbiAgJyVNYXBQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IE1hcC5wcm90b3R5cGUsXG4gICclTWF0aCUnOiBNYXRoLFxuICAnJU51bWJlciUnOiBOdW1iZXIsXG4gICclTnVtYmVyUHJvdG90eXBlJSc6IE51bWJlci5wcm90b3R5cGUsXG4gICclT2JqZWN0JSc6IE9iamVjdCxcbiAgJyVPYmplY3RQcm90b3R5cGUlJzogT2JqZWN0LnByb3RvdHlwZSxcbiAgJyVPYmpQcm90b190b1N0cmluZyUnOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFxuICAnJU9ialByb3RvX3ZhbHVlT2YlJzogT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mLFxuICAnJXBhcnNlRmxvYXQlJzogcGFyc2VGbG9hdCxcbiAgJyVwYXJzZUludCUnOiBwYXJzZUludCxcbiAgJyVQcm9taXNlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogUHJvbWlzZSxcbiAgJyVQcm9taXNlUHJvdG90eXBlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogUHJvbWlzZS5wcm90b3R5cGUsXG4gICclUHJvbWlzZVByb3RvX3RoZW4lJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBQcm9taXNlLnByb3RvdHlwZS50aGVuLFxuICAnJVByb21pc2VfYWxsJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogUHJvbWlzZS5hbGwsXG4gICclUHJvbWlzZV9yZWplY3QlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBQcm9taXNlLnJlamVjdCxcbiAgJyVQcm9taXNlX3Jlc29sdmUlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBQcm9taXNlLnJlc29sdmUsXG4gICclUHJveHklJzogdHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogUHJveHksXG4gICclUmFuZ2VFcnJvciUnOiBSYW5nZUVycm9yLFxuICAnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogUmFuZ2VFcnJvci5wcm90b3R5cGUsXG4gICclUmVmZXJlbmNlRXJyb3IlJzogUmVmZXJlbmNlRXJyb3IsXG4gICclUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlJzogUmVmZXJlbmNlRXJyb3IucHJvdG90eXBlLFxuICAnJVJlZmxlY3QlJzogdHlwZW9mIFJlZmxlY3QgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBSZWZsZWN0LFxuICAnJVJlZ0V4cCUnOiBSZWdFeHAsXG4gICclUmVnRXhwUHJvdG90eXBlJSc6IFJlZ0V4cC5wcm90b3R5cGUsXG4gICclU2V0JSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBTZXQsXG4gICclU2V0SXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMkMiA/IHVuZGVmaW5lZCQxIDogZ2V0UHJvdG8obmV3IFNldCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG4gICclU2V0UHJvdG90eXBlJSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBTZXQucHJvdG90eXBlLFxuICAnJVNoYXJlZEFycmF5QnVmZmVyJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFNoYXJlZEFycmF5QnVmZmVyLFxuICAnJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFNoYXJlZEFycmF5QnVmZmVyLnByb3RvdHlwZSxcbiAgJyVTdHJpbmclJzogU3RyaW5nLFxuICAnJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMkMiA/IGdldFByb3RvKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQkMSxcbiAgJyVTdHJpbmdQcm90b3R5cGUlJzogU3RyaW5nLnByb3RvdHlwZSxcbiAgJyVTeW1ib2wlJzogaGFzU3ltYm9scyQyID8gU3ltYm9sIDogdW5kZWZpbmVkJDEsXG4gICclU3ltYm9sUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMkMiA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQkMSxcbiAgJyVTeW50YXhFcnJvciUnOiBTeW50YXhFcnJvcixcbiAgJyVTeW50YXhFcnJvclByb3RvdHlwZSUnOiBTeW50YXhFcnJvci5wcm90b3R5cGUsXG4gICclVGhyb3dUeXBlRXJyb3IlJzogVGhyb3dUeXBlRXJyb3IsXG4gICclVHlwZWRBcnJheSUnOiBUeXBlZEFycmF5LFxuICAnJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogVHlwZWRBcnJheSA/IFR5cGVkQXJyYXkucHJvdG90eXBlIDogdW5kZWZpbmVkJDEsXG4gICclVHlwZUVycm9yJSc6ICRUeXBlRXJyb3IsXG4gICclVHlwZUVycm9yUHJvdG90eXBlJSc6ICRUeXBlRXJyb3IucHJvdG90eXBlLFxuICAnJVVpbnQ4QXJyYXklJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBVaW50OEFycmF5LFxuICAnJVVpbnQ4QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBVaW50OEFycmF5LnByb3RvdHlwZSxcbiAgJyVVaW50OENsYW1wZWRBcnJheSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBVaW50OENsYW1wZWRBcnJheSxcbiAgJyVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBVaW50OENsYW1wZWRBcnJheS5wcm90b3R5cGUsXG4gICclVWludDE2QXJyYXklJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogVWludDE2QXJyYXksXG4gICclVWludDE2QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogVWludDE2QXJyYXkucHJvdG90eXBlLFxuICAnJVVpbnQzMkFycmF5JSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFVpbnQzMkFycmF5LFxuICAnJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFVpbnQzMkFycmF5LnByb3RvdHlwZSxcbiAgJyVVUklFcnJvciUnOiBVUklFcnJvcixcbiAgJyVVUklFcnJvclByb3RvdHlwZSUnOiBVUklFcnJvci5wcm90b3R5cGUsXG4gICclV2Vha01hcCUnOiB0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFdlYWtNYXAsXG4gICclV2Vha01hcFByb3RvdHlwZSUnOiB0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFdlYWtNYXAucHJvdG90eXBlLFxuICAnJVdlYWtTZXQlJzogdHlwZW9mIFdlYWtTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBXZWFrU2V0LFxuICAnJVdlYWtTZXRQcm90b3R5cGUlJzogdHlwZW9mIFdlYWtTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBXZWFrU2V0LnByb3RvdHlwZVxufTtcbnZhciAkcmVwbGFjZSA9IGZ1bmN0aW9uQmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG4vKiBhZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi80LjE3LjE1L2Rpc3QvbG9kYXNoLmpzI0w2NzM1LUw2NzQ0ICovXG5cbnZhciByZVByb3BOYW1lID0gL1teJS5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwlJCkpL2c7XG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG4vKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cblxudmFyIHN0cmluZ1RvUGF0aCA9IGZ1bmN0aW9uIHN0cmluZ1RvUGF0aChzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICAkcmVwbGFjZShzdHJpbmcsIHJlUHJvcE5hbWUsIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gcXVvdGUgPyAkcmVwbGFjZShzdWJTdHJpbmcsIHJlRXNjYXBlQ2hhciwgJyQxJykgOiBudW1iZXIgfHwgbWF0Y2g7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbi8qIGVuZCBhZGFwdGF0aW9uICovXG5cblxudmFyIGdldEJhc2VJbnRyaW5zaWMgPSBmdW5jdGlvbiBnZXRCYXNlSW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuICBpZiAoIShuYW1lIGluIElOVFJJTlNJQ1MpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xuICB9IC8vIGlzdGFuYnVsIGlnbm9yZSBpZiAvLyBob3BlZnVsbHkgdGhpcyBpcyBpbXBvc3NpYmxlIHRvIHRlc3QgOi0pXG5cblxuICBpZiAodHlwZW9mIElOVFJJTlNJQ1NbbmFtZV0gPT09ICd1bmRlZmluZWQnICYmICFhbGxvd01pc3NpbmcpIHtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcignaW50cmluc2ljICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZSEnKTtcbiAgfVxuXG4gIHJldHVybiBJTlRSSU5TSUNTW25hbWVdO1xufTtcblxudmFyIEdldEludHJpbnNpYyA9IGZ1bmN0aW9uIEdldEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludHJpbnNpYyBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFsbG93TWlzc2luZyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJhbGxvd01pc3NpbmdcIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICB9XG5cbiAgdmFyIHBhcnRzID0gc3RyaW5nVG9QYXRoKG5hbWUpO1xuICB2YXIgdmFsdWUgPSBnZXRCYXNlSW50cmluc2ljKCclJyArIChwYXJ0cy5sZW5ndGggPiAwID8gcGFydHNbMF0gOiAnJykgKyAnJScsIGFsbG93TWlzc2luZyk7XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoJGdPUEQgJiYgaSArIDEgPj0gcGFydHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBkZXNjID0gJGdPUEQodmFsdWUsIHBhcnRzW2ldKTtcblxuICAgICAgICBpZiAoIWFsbG93TWlzc2luZyAmJiAhKHBhcnRzW2ldIGluIHZhbHVlKSkge1xuICAgICAgICAgIHRocm93IG5ldyAkVHlwZUVycm9yKCdiYXNlIGludHJpbnNpYyBmb3IgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IHRoZSBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgPSBkZXNjID8gZGVzYy5nZXQgfHwgZGVzYy52YWx1ZSA6IHZhbHVlW3BhcnRzW2ldXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWVbcGFydHNbaV1dO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciAkRnVuY3Rpb24gPSBHZXRJbnRyaW5zaWMoJyVGdW5jdGlvbiUnKTtcbnZhciAkYXBwbHkgPSAkRnVuY3Rpb24uYXBwbHk7XG52YXIgJGNhbGwgPSAkRnVuY3Rpb24uY2FsbDtcblxudmFyIGNhbGxCaW5kID0gZnVuY3Rpb24gY2FsbEJpbmQoKSB7XG4gIHJldHVybiBmdW5jdGlvbkJpbmQuYXBwbHkoJGNhbGwsIGFyZ3VtZW50cyk7XG59O1xuXG52YXIgYXBwbHkgPSBmdW5jdGlvbiBhcHBseUJpbmQoKSB7XG4gIHJldHVybiBmdW5jdGlvbkJpbmQuYXBwbHkoJGFwcGx5LCBhcmd1bWVudHMpO1xufTtcbmNhbGxCaW5kLmFwcGx5ID0gYXBwbHk7XG5cbnZhciBudW1iZXJJc05hTiA9IGZ1bmN0aW9uIG51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59O1xuXG52YXIgaW1wbGVtZW50YXRpb24kMiA9IGZ1bmN0aW9uIGlzKGEsIGIpIHtcbiAgaWYgKGEgPT09IDAgJiYgYiA9PT0gMCkge1xuICAgIHJldHVybiAxIC8gYSA9PT0gMSAvIGI7XG4gIH1cblxuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKG51bWJlcklzTmFOKGEpICYmIG51bWJlcklzTmFOKGIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG52YXIgcG9seWZpbGwgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcbiAgcmV0dXJuIHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpbXBsZW1lbnRhdGlvbiQyO1xufTtcblxudmFyIHNoaW0gPSBmdW5jdGlvbiBzaGltT2JqZWN0SXMoKSB7XG4gIHZhciBwb2x5ZmlsbCQxID0gcG9seWZpbGwoKTtcbiAgZGVmaW5lUHJvcGVydGllc18xKE9iamVjdCwge1xuICAgIGlzOiBwb2x5ZmlsbCQxXG4gIH0sIHtcbiAgICBpczogZnVuY3Rpb24gdGVzdE9iamVjdElzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5pcyAhPT0gcG9seWZpbGwkMTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcG9seWZpbGwkMTtcbn07XG5cbnZhciBwb2x5ZmlsbCQxID0gY2FsbEJpbmQocG9seWZpbGwoKSwgT2JqZWN0KTtcbmRlZmluZVByb3BlcnRpZXNfMShwb2x5ZmlsbCQxLCB7XG4gIGdldFBvbHlmaWxsOiBwb2x5ZmlsbCxcbiAgaW1wbGVtZW50YXRpb246IGltcGxlbWVudGF0aW9uJDIsXG4gIHNoaW06IHNoaW1cbn0pO1xudmFyIG9iamVjdElzID0gcG9seWZpbGwkMTtcblxudmFyIHNyYyA9IGZ1bmN0aW9uQmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG52YXIgcmVnZXhFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG52YXIgdHJ5UmVnZXhFeGVjQ2FsbCA9IGZ1bmN0aW9uIHRyeVJlZ2V4RXhlYyh2YWx1ZSkge1xuICB0cnkge1xuICAgIHZhciBsYXN0SW5kZXggPSB2YWx1ZS5sYXN0SW5kZXg7XG4gICAgdmFsdWUubGFzdEluZGV4ID0gMDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXG4gICAgcmVnZXhFeGVjLmNhbGwodmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGZpbmFsbHkge1xuICAgIHZhbHVlLmxhc3RJbmRleCA9IGxhc3RJbmRleDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICB9XG59O1xuXG52YXIgdG9TdHIkNSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgcmVnZXhDbGFzcyA9ICdbb2JqZWN0IFJlZ0V4cF0nO1xudmFyIGhhc1RvU3RyaW5nVGFnJDEgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG52YXIgaXNSZWdleCA9IGZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNUb1N0cmluZ1RhZyQxKSB7XG4gICAgcmV0dXJuIHRvU3RyJDUuY2FsbCh2YWx1ZSkgPT09IHJlZ2V4Q2xhc3M7XG4gIH1cblxuICB2YXIgZGVzY3JpcHRvciA9IGdPUEQodmFsdWUsICdsYXN0SW5kZXgnKTtcbiAgdmFyIGhhc0xhc3RJbmRleERhdGFQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgc3JjKGRlc2NyaXB0b3IsICd2YWx1ZScpO1xuXG4gIGlmICghaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRyeVJlZ2V4RXhlY0NhbGwodmFsdWUpO1xufTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG52YXIgJFR5cGVFcnJvciQxID0gVHlwZUVycm9yO1xuXG52YXIgaW1wbGVtZW50YXRpb24kMyA9IGZ1bmN0aW9uIGZsYWdzKCkge1xuICBpZiAodGhpcyAhPSBudWxsICYmIHRoaXMgIT09ICRPYmplY3QodGhpcykpIHtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvciQxKCdSZWdFeHAucHJvdG90eXBlLmZsYWdzIGdldHRlciBjYWxsZWQgb24gbm9uLW9iamVjdCcpO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9ICcnO1xuXG4gIGlmICh0aGlzLmdsb2JhbCkge1xuICAgIHJlc3VsdCArPSAnZyc7XG4gIH1cblxuICBpZiAodGhpcy5pZ25vcmVDYXNlKSB7XG4gICAgcmVzdWx0ICs9ICdpJztcbiAgfVxuXG4gIGlmICh0aGlzLm11bHRpbGluZSkge1xuICAgIHJlc3VsdCArPSAnbSc7XG4gIH1cblxuICBpZiAodGhpcy5kb3RBbGwpIHtcbiAgICByZXN1bHQgKz0gJ3MnO1xuICB9XG5cbiAgaWYgKHRoaXMudW5pY29kZSkge1xuICAgIHJlc3VsdCArPSAndSc7XG4gIH1cblxuICBpZiAodGhpcy5zdGlja3kpIHtcbiAgICByZXN1bHQgKz0gJ3knO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzJDEgPSBkZWZpbmVQcm9wZXJ0aWVzXzEuc3VwcG9ydHNEZXNjcmlwdG9ycztcbnZhciAkZ09QRCQxID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciAkVHlwZUVycm9yJDIgPSBUeXBlRXJyb3I7XG5cbnZhciBwb2x5ZmlsbCQyID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG4gIGlmICghc3VwcG9ydHNEZXNjcmlwdG9ycyQxKSB7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IkMignUmVnRXhwLnByb3RvdHlwZS5mbGFncyByZXF1aXJlcyBhIHRydWUgRVM1IGVudmlyb25tZW50IHRoYXQgc3VwcG9ydHMgcHJvcGVydHkgZGVzY3JpcHRvcnMnKTtcbiAgfVxuXG4gIGlmICgvYS9taWcuZmxhZ3MgPT09ICdnaW0nKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSAkZ09QRCQxKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycpO1xuXG4gICAgaWYgKGRlc2NyaXB0b3IgJiYgdHlwZW9mIGRlc2NyaXB0b3IuZ2V0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiAvYS8uZG90QWxsID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW1wbGVtZW50YXRpb24kMztcbn07XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzJDIgPSBkZWZpbmVQcm9wZXJ0aWVzXzEuc3VwcG9ydHNEZXNjcmlwdG9ycztcbnZhciBnT1BEJDEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIGRlZmluZVByb3BlcnR5JDEgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgVHlwZUVyciA9IFR5cGVFcnJvcjtcbnZhciBnZXRQcm90byQxID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xudmFyIHJlZ2V4ID0gL2EvO1xuXG52YXIgc2hpbSQxID0gZnVuY3Rpb24gc2hpbUZsYWdzKCkge1xuICBpZiAoIXN1cHBvcnRzRGVzY3JpcHRvcnMkMiB8fCAhZ2V0UHJvdG8kMSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyKCdSZWdFeHAucHJvdG90eXBlLmZsYWdzIHJlcXVpcmVzIGEgdHJ1ZSBFUzUgZW52aXJvbm1lbnQgdGhhdCBzdXBwb3J0cyBwcm9wZXJ0eSBkZXNjcmlwdG9ycycpO1xuICB9XG5cbiAgdmFyIHBvbHlmaWxsID0gcG9seWZpbGwkMigpO1xuICB2YXIgcHJvdG8gPSBnZXRQcm90byQxKHJlZ2V4KTtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnT1BEJDEocHJvdG8sICdmbGFncycpO1xuXG4gIGlmICghZGVzY3JpcHRvciB8fCBkZXNjcmlwdG9yLmdldCAhPT0gcG9seWZpbGwpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eSQxKHByb3RvLCAnZmxhZ3MnLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGdldDogcG9seWZpbGxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwb2x5ZmlsbDtcbn07XG5cbnZhciBmbGFnc0JvdW5kID0gY2FsbEJpbmQoaW1wbGVtZW50YXRpb24kMyk7XG5kZWZpbmVQcm9wZXJ0aWVzXzEoZmxhZ3NCb3VuZCwge1xuICBnZXRQb2x5ZmlsbDogcG9seWZpbGwkMixcbiAgaW1wbGVtZW50YXRpb246IGltcGxlbWVudGF0aW9uJDMsXG4gIHNoaW06IHNoaW0kMVxufSk7XG52YXIgcmVnZXhwX3Byb3RvdHlwZV9mbGFncyA9IGZsYWdzQm91bmQ7XG5cbnZhciBnZXREYXkgPSBEYXRlLnByb3RvdHlwZS5nZXREYXk7XG5cbnZhciB0cnlEYXRlT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RGF0ZUdldERheUNhbGwodmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBnZXREYXkuY2FsbCh2YWx1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbnZhciB0b1N0ciQ2ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBkYXRlQ2xhc3MgPSAnW29iamVjdCBEYXRlXSc7XG52YXIgaGFzVG9TdHJpbmdUYWckMiA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCc7XG5cbnZhciBpc0RhdGVPYmplY3QgPSBmdW5jdGlvbiBpc0RhdGVPYmplY3QodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaGFzVG9TdHJpbmdUYWckMiA/IHRyeURhdGVPYmplY3QodmFsdWUpIDogdG9TdHIkNi5jYWxsKHZhbHVlKSA9PT0gZGF0ZUNsYXNzO1xufTtcblxudmFyIGdldFRpbWUgPSBEYXRlLnByb3RvdHlwZS5nZXRUaW1lO1xuXG5mdW5jdGlvbiBkZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgb3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307IC8vIDcuMS4gQWxsIGlkZW50aWNhbCB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGFzIGRldGVybWluZWQgYnkgPT09LlxuXG4gIGlmIChvcHRzLnN0cmljdCA/IG9iamVjdElzKGFjdHVhbCwgZXhwZWN0ZWQpIDogYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIDcuMy4gT3RoZXIgcGFpcnMgdGhhdCBkbyBub3QgYm90aCBwYXNzIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JywgZXF1aXZhbGVuY2UgaXMgZGV0ZXJtaW5lZCBieSA9PS5cblxuXG4gIGlmICghYWN0dWFsIHx8ICFleHBlY3RlZCB8fCB0eXBlb2YgYWN0dWFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgZXhwZWN0ZWQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9wdHMuc3RyaWN0ID8gb2JqZWN0SXMoYWN0dWFsLCBleHBlY3RlZCkgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG4gIH1cbiAgLypcbiAgICogNy40LiBGb3IgYWxsIG90aGVyIE9iamVjdCBwYWlycywgaW5jbHVkaW5nIEFycmF5IG9iamVjdHMsIGVxdWl2YWxlbmNlIGlzXG4gICAqIGRldGVybWluZWQgYnkgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChhcyB2ZXJpZmllZFxuICAgKiB3aXRoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCksIHRoZSBzYW1lIHNldCBvZiBrZXlzXG4gICAqIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLCBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnlcbiAgICogY29ycmVzcG9uZGluZyBrZXksIGFuZCBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuIE5vdGU6IHRoaXNcbiAgICogYWNjb3VudHMgZm9yIGJvdGggbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcyBvbiBBcnJheXMuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcblxuXG4gIHJldHVybiBvYmpFcXVpdihhY3R1YWwsIGV4cGVjdGVkLCBvcHRzKTtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWRPck51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyJDEoeCkge1xuICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnIHx8IHR5cGVvZiB4Lmxlbmd0aCAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIHguY29weSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeC5zbGljZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh4Lmxlbmd0aCA+IDAgJiYgdHlwZW9mIHhbMF0gIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG9iakVxdWl2KGEsIGIsIG9wdHMpIHtcbiAgLyogZXNsaW50IG1heC1zdGF0ZW1lbnRzOiBbMiwgNTBdICovXG4gIHZhciBpLCBrZXk7XG5cbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc1VuZGVmaW5lZE9yTnVsbChhKSB8fCBpc1VuZGVmaW5lZE9yTnVsbChiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuXG5cblxuICBpZiAoYS5wcm90b3R5cGUgIT09IGIucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzQXJndW1lbnRzJDEoYSkgIT09IGlzQXJndW1lbnRzJDEoYikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYUlzUmVnZXggPSBpc1JlZ2V4KGEpO1xuICB2YXIgYklzUmVnZXggPSBpc1JlZ2V4KGIpO1xuXG4gIGlmIChhSXNSZWdleCAhPT0gYklzUmVnZXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoYUlzUmVnZXggfHwgYklzUmVnZXgpIHtcbiAgICByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIHJlZ2V4cF9wcm90b3R5cGVfZmxhZ3MoYSkgPT09IHJlZ2V4cF9wcm90b3R5cGVfZmxhZ3MoYik7XG4gIH1cblxuICBpZiAoaXNEYXRlT2JqZWN0KGEpICYmIGlzRGF0ZU9iamVjdChiKSkge1xuICAgIHJldHVybiBnZXRUaW1lLmNhbGwoYSkgPT09IGdldFRpbWUuY2FsbChiKTtcbiAgfVxuXG4gIHZhciBhSXNCdWZmZXIgPSBpc0J1ZmZlciQxKGEpO1xuICB2YXIgYklzQnVmZmVyID0gaXNCdWZmZXIkMShiKTtcblxuICBpZiAoYUlzQnVmZmVyICE9PSBiSXNCdWZmZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoYUlzQnVmZmVyIHx8IGJJc0J1ZmZlcikge1xuICAgIC8vICYmIHdvdWxkIHdvcmsgdG9vLCBiZWNhdXNlIGJvdGggYXJlIHRydWUgb3IgYm90aCBmYWxzZSBoZXJlXG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICAgIHZhciBrYiA9IG9iamVjdEtleXMoYik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBoYXBwZW5zIHdoZW4gb25lIGlzIGEgc3RyaW5nIGxpdGVyYWwgYW5kIHRoZSBvdGhlciBpc24ndFxuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzIGhhc093blByb3BlcnR5KVxuXG5cbiAgaWYgKGthLmxlbmd0aCAhPT0ga2IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIHRoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuXG5cbiAga2Euc29ydCgpO1xuICBrYi5zb3J0KCk7IC8vIH5+fmNoZWFwIGtleSB0ZXN0XG5cbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoa2FbaV0gIT0ga2JbaV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gLy8gZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5IGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgfn5+cG9zc2libHkgZXhwZW5zaXZlIGRlZXAgdGVzdFxuXG5cbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcblxuICAgIGlmICghZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBvcHRzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG52YXIgZGVlcEVxdWFsXzEgPSBkZWVwRXF1YWw7XG5cbnZhciBGTE9BVF9FT0YgPSAweGY7XG52YXIgRkxPQVRfTE9PS1VQID0gWycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJy4nLCAnRScsICdFLScsIG51bGwsICctJ107XG52YXIgRkxPQVRfRU5DT0RFX0xPT0tVUCA9IHtcbiAgJy4nOiAxMCxcbiAgJ0UnOiAxMSxcbiAgJ0UtJzogMTIsXG4gICctJzogMTRcbn07XG5cbnZhciBDRkZPcGVyYW5kID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ0ZGT3BlcmFuZCgpIHt9XG5cbiAgQ0ZGT3BlcmFuZC5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCB2YWx1ZSkge1xuICAgIGlmICgzMiA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyNDYpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAtIDEzOTtcbiAgICB9XG5cbiAgICBpZiAoMjQ3IDw9IHZhbHVlICYmIHZhbHVlIDw9IDI1MCkge1xuICAgICAgcmV0dXJuICh2YWx1ZSAtIDI0NykgKiAyNTYgKyBzdHJlYW0ucmVhZFVJbnQ4KCkgKyAxMDg7XG4gICAgfVxuXG4gICAgaWYgKDI1MSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyNTQpIHtcbiAgICAgIHJldHVybiAtKHZhbHVlIC0gMjUxKSAqIDI1NiAtIHN0cmVhbS5yZWFkVUludDgoKSAtIDEwODtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IDI4KSB7XG4gICAgICByZXR1cm4gc3RyZWFtLnJlYWRJbnQxNkJFKCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAyOSkge1xuICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkSW50MzJCRSgpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gMzApIHtcbiAgICAgIHZhciBzdHIgPSAnJztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGIgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG4gICAgICAgIHZhciBuMSA9IGIgPj4gNDtcblxuICAgICAgICBpZiAobjEgPT09IEZMT0FUX0VPRikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyICs9IEZMT0FUX0xPT0tVUFtuMV07XG4gICAgICAgIHZhciBuMiA9IGIgJiAxNTtcblxuICAgICAgICBpZiAobjIgPT09IEZMT0FUX0VPRikge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyICs9IEZMT0FUX0xPT0tVUFtuMl07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgQ0ZGT3BlcmFuZC5zaXplID0gZnVuY3Rpb24gc2l6ZSh2YWx1ZSkge1xuICAgIC8vIGlmIHRoZSB2YWx1ZSBuZWVkcyB0byBiZSBmb3JjZWQgdG8gdGhlIGxhcmdlc3Qgc2l6ZSAoMzIgYml0KVxuICAgIC8vIGUuZy4gZm9yIHVua25vd24gcG9pbnRlcnMsIHNldCB0byAzMjc2OFxuICAgIGlmICh2YWx1ZS5mb3JjZUxhcmdlKSB7XG4gICAgICB2YWx1ZSA9IDMyNzY4O1xuICAgIH1cblxuICAgIGlmICgodmFsdWUgfCAwKSAhPT0gdmFsdWUpIHtcbiAgICAgIC8vIGZsb2F0aW5nIHBvaW50XG4gICAgICB2YXIgc3RyID0gJycgKyB2YWx1ZTtcbiAgICAgIHJldHVybiAxICsgTWF0aC5jZWlsKChzdHIubGVuZ3RoICsgMSkgLyAyKTtcbiAgICB9IGVsc2UgaWYgKC0xMDcgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMTA3KSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKDEwOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAxMTMxIHx8IC0xMTMxIDw9IHZhbHVlICYmIHZhbHVlIDw9IC0xMDgpIHtcbiAgICAgIHJldHVybiAyO1xuICAgIH0gZWxzZSBpZiAoLTMyNzY4IDw9IHZhbHVlICYmIHZhbHVlIDw9IDMyNzY3KSB7XG4gICAgICByZXR1cm4gMztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDU7XG4gICAgfVxuICB9O1xuXG4gIENGRk9wZXJhbmQuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0cmVhbSwgdmFsdWUpIHtcbiAgICAvLyBpZiB0aGUgdmFsdWUgbmVlZHMgdG8gYmUgZm9yY2VkIHRvIHRoZSBsYXJnZXN0IHNpemUgKDMyIGJpdClcbiAgICAvLyBlLmcuIGZvciB1bmtub3duIHBvaW50ZXJzLCBzYXZlIHRoZSBvbGQgdmFsdWUgYW5kIHNldCB0byAzMjc2OFxuICAgIHZhciB2YWwgPSBOdW1iZXIodmFsdWUpO1xuXG4gICAgaWYgKHZhbHVlLmZvcmNlTGFyZ2UpIHtcbiAgICAgIHN0cmVhbS53cml0ZVVJbnQ4KDI5KTtcbiAgICAgIHJldHVybiBzdHJlYW0ud3JpdGVJbnQzMkJFKHZhbCk7XG4gICAgfSBlbHNlIGlmICgodmFsIHwgMCkgIT09IHZhbCkge1xuICAgICAgLy8gZmxvYXRpbmcgcG9pbnRcbiAgICAgIHN0cmVhbS53cml0ZVVJbnQ4KDMwKTtcbiAgICAgIHZhciBzdHIgPSAnJyArIHZhbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgdmFyIGMxID0gc3RyW2ldO1xuICAgICAgICB2YXIgbjEgPSBGTE9BVF9FTkNPREVfTE9PS1VQW2MxXSB8fCArYzE7XG5cbiAgICAgICAgaWYgKGkgPT09IHN0ci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgdmFyIG4yID0gRkxPQVRfRU9GO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBjMiA9IHN0cltpICsgMV07XG4gICAgICAgICAgdmFyIG4yID0gRkxPQVRfRU5DT0RFX0xPT0tVUFtjMl0gfHwgK2MyO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyZWFtLndyaXRlVUludDgobjEgPDwgNCB8IG4yICYgMTUpO1xuICAgICAgfVxuXG4gICAgICBpZiAobjIgIT09IEZMT0FUX0VPRikge1xuICAgICAgICByZXR1cm4gc3RyZWFtLndyaXRlVUludDgoRkxPQVRfRU9GIDw8IDQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoLTEwNyA8PSB2YWwgJiYgdmFsIDw9IDEwNykge1xuICAgICAgcmV0dXJuIHN0cmVhbS53cml0ZVVJbnQ4KHZhbCArIDEzOSk7XG4gICAgfSBlbHNlIGlmICgxMDggPD0gdmFsICYmIHZhbCA8PSAxMTMxKSB7XG4gICAgICB2YWwgLT0gMTA4O1xuICAgICAgc3RyZWFtLndyaXRlVUludDgoKHZhbCA+PiA4KSArIDI0Nyk7XG4gICAgICByZXR1cm4gc3RyZWFtLndyaXRlVUludDgodmFsICYgMHhmZik7XG4gICAgfSBlbHNlIGlmICgtMTEzMSA8PSB2YWwgJiYgdmFsIDw9IC0xMDgpIHtcbiAgICAgIHZhbCA9IC12YWwgLSAxMDg7XG4gICAgICBzdHJlYW0ud3JpdGVVSW50OCgodmFsID4+IDgpICsgMjUxKTtcbiAgICAgIHJldHVybiBzdHJlYW0ud3JpdGVVSW50OCh2YWwgJiAweGZmKTtcbiAgICB9IGVsc2UgaWYgKC0zMjc2OCA8PSB2YWwgJiYgdmFsIDw9IDMyNzY3KSB7XG4gICAgICBzdHJlYW0ud3JpdGVVSW50OCgyOCk7XG4gICAgICByZXR1cm4gc3RyZWFtLndyaXRlSW50MTZCRSh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW0ud3JpdGVVSW50OCgyOSk7XG4gICAgICByZXR1cm4gc3RyZWFtLndyaXRlSW50MzJCRSh2YWwpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gQ0ZGT3BlcmFuZDtcbn0oKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQyKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQyKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQyKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMihvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDIobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQyKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgQ0ZGRGljdCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENGRkRpY3Qob3BzKSB7XG4gICAgaWYgKG9wcyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHMgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLm9wcyA9IG9wcztcbiAgICB0aGlzLmZpZWxkcyA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQyKG9wcyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgZmllbGQgPSBfc3RlcC52YWx1ZTtcbiAgICAgIHZhciBrZXkgPSBBcnJheS5pc0FycmF5KGZpZWxkWzBdKSA/IGZpZWxkWzBdWzBdIDw8IDggfCBmaWVsZFswXVsxXSA6IGZpZWxkWzBdO1xuICAgICAgdGhpcy5maWVsZHNba2V5XSA9IGZpZWxkO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBDRkZEaWN0LnByb3RvdHlwZTtcblxuICBfcHJvdG8uZGVjb2RlT3BlcmFuZHMgPSBmdW5jdGlvbiBkZWNvZGVPcGVyYW5kcyh0eXBlLCBzdHJlYW0sIHJldCwgb3BlcmFuZHMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHJldHVybiBvcGVyYW5kcy5tYXAoZnVuY3Rpb24gKG9wLCBpKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5kZWNvZGVPcGVyYW5kcyh0eXBlW2ldLCBzdHJlYW0sIHJldCwgW29wXSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuZGVjb2RlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0eXBlLmRlY29kZShzdHJlYW0sIHJldCwgb3BlcmFuZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnb2Zmc2V0JzpcbiAgICAgICAgY2FzZSAnc2lkJzpcbiAgICAgICAgICByZXR1cm4gb3BlcmFuZHNbMF07XG5cbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgcmV0dXJuICEhb3BlcmFuZHNbMF07XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gb3BlcmFuZHM7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5lbmNvZGVPcGVyYW5kcyA9IGZ1bmN0aW9uIGVuY29kZU9wZXJhbmRzKHR5cGUsIHN0cmVhbSwgY3R4LCBvcGVyYW5kcykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHJldHVybiBvcGVyYW5kcy5tYXAoZnVuY3Rpb24gKG9wLCBpKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuZW5jb2RlT3BlcmFuZHModHlwZVtpXSwgc3RyZWFtLCBjdHgsIG9wKVswXTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZS5lbmNvZGUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHR5cGUuZW5jb2RlKHN0cmVhbSwgb3BlcmFuZHMsIGN0eCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb3BlcmFuZHMgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gW29wZXJhbmRzXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcGVyYW5kcyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gWytvcGVyYW5kc107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9wZXJhbmRzKSkge1xuICAgICAgcmV0dXJuIG9wZXJhbmRzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW29wZXJhbmRzXTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCkge1xuICAgIHZhciBlbmQgPSBzdHJlYW0ucG9zICsgcGFyZW50Lmxlbmd0aDtcbiAgICB2YXIgcmV0ID0ge307XG4gICAgdmFyIG9wZXJhbmRzID0gW107IC8vIGRlZmluZSBoaWRkZW4gcHJvcGVydGllc1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmV0LCB7XG4gICAgICBwYXJlbnQ6IHtcbiAgICAgICAgdmFsdWU6IHBhcmVudFxuICAgICAgfSxcbiAgICAgIF9zdGFydE9mZnNldDoge1xuICAgICAgICB2YWx1ZTogc3RyZWFtLnBvc1xuICAgICAgfVxuICAgIH0pOyAvLyBmaWxsIGluIGRlZmF1bHRzXG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5maWVsZHMpIHtcbiAgICAgIHZhciBmaWVsZCA9IHRoaXMuZmllbGRzW2tleV07XG4gICAgICByZXRbZmllbGRbMV1dID0gZmllbGRbM107XG4gICAgfVxuXG4gICAgd2hpbGUgKHN0cmVhbS5wb3MgPCBlbmQpIHtcbiAgICAgIHZhciBiID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuXG4gICAgICBpZiAoYiA8IDI4KSB7XG4gICAgICAgIGlmIChiID09PSAxMikge1xuICAgICAgICAgIGIgPSBiIDw8IDggfCBzdHJlYW0ucmVhZFVJbnQ4KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2ZpZWxkID0gdGhpcy5maWVsZHNbYl07XG5cbiAgICAgICAgaWYgKCFfZmllbGQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG9wZXJhdG9yIFwiICsgYik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmFsID0gdGhpcy5kZWNvZGVPcGVyYW5kcyhfZmllbGRbMl0sIHN0cmVhbSwgcmV0LCBvcGVyYW5kcyk7XG5cbiAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIHV0aWxzXzIpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsIF9maWVsZFsxXSwgdmFsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0W19maWVsZFsxXV0gPSB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb3BlcmFuZHMgPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wZXJhbmRzLnB1c2goQ0ZGT3BlcmFuZC5kZWNvZGUoc3RyZWFtLCBiKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICBfcHJvdG8uc2l6ZSA9IGZ1bmN0aW9uIHNpemUoZGljdCwgcGFyZW50LCBpbmNsdWRlUG9pbnRlcnMpIHtcbiAgICBpZiAoaW5jbHVkZVBvaW50ZXJzID09PSB2b2lkIDApIHtcbiAgICAgIGluY2x1ZGVQb2ludGVycyA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGN0eCA9IHtcbiAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgdmFsOiBkaWN0LFxuICAgICAgcG9pbnRlclNpemU6IDAsXG4gICAgICBzdGFydE9mZnNldDogcGFyZW50LnN0YXJ0T2Zmc2V0IHx8IDBcbiAgICB9O1xuICAgIHZhciBsZW4gPSAwO1xuXG4gICAgZm9yICh2YXIgayBpbiB0aGlzLmZpZWxkcykge1xuICAgICAgdmFyIGZpZWxkID0gdGhpcy5maWVsZHNba107XG4gICAgICB2YXIgdmFsID0gZGljdFtmaWVsZFsxXV07XG5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBkZWVwRXF1YWxfMSh2YWwsIGZpZWxkWzNdKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG9wZXJhbmRzID0gdGhpcy5lbmNvZGVPcGVyYW5kcyhmaWVsZFsyXSwgbnVsbCwgY3R4LCB2YWwpO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQyKG9wZXJhbmRzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIG9wID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICBsZW4gKz0gQ0ZGT3BlcmFuZC5zaXplKG9wKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGtleSA9IEFycmF5LmlzQXJyYXkoZmllbGRbMF0pID8gZmllbGRbMF0gOiBbZmllbGRbMF1dO1xuICAgICAgbGVuICs9IGtleS5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKGluY2x1ZGVQb2ludGVycykge1xuICAgICAgbGVuICs9IGN0eC5wb2ludGVyU2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVuO1xuICB9O1xuXG4gIF9wcm90by5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyZWFtLCBkaWN0LCBwYXJlbnQpIHtcbiAgICB2YXIgY3R4ID0ge1xuICAgICAgcG9pbnRlcnM6IFtdLFxuICAgICAgc3RhcnRPZmZzZXQ6IHN0cmVhbS5wb3MsXG4gICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgIHZhbDogZGljdCxcbiAgICAgIHBvaW50ZXJTaXplOiAwXG4gICAgfTtcbiAgICBjdHgucG9pbnRlck9mZnNldCA9IHN0cmVhbS5wb3MgKyB0aGlzLnNpemUoZGljdCwgY3R4LCBmYWxzZSk7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQyKHRoaXMub3BzKSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICAgIHZhciBmaWVsZCA9IF9zdGVwMy52YWx1ZTtcbiAgICAgIHZhciB2YWwgPSBkaWN0W2ZpZWxkWzFdXTtcblxuICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IGRlZXBFcXVhbF8xKHZhbCwgZmllbGRbM10pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3BlcmFuZHMgPSB0aGlzLmVuY29kZU9wZXJhbmRzKGZpZWxkWzJdLCBzdHJlYW0sIGN0eCwgdmFsKTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkMihvcGVyYW5kcyksIF9zdGVwNDsgIShfc3RlcDQgPSBfaXRlcmF0b3I0KCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBvcCA9IF9zdGVwNC52YWx1ZTtcbiAgICAgICAgQ0ZGT3BlcmFuZC5lbmNvZGUoc3RyZWFtLCBvcCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXkgPSBBcnJheS5pc0FycmF5KGZpZWxkWzBdKSA/IGZpZWxkWzBdIDogW2ZpZWxkWzBdXTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkMihrZXkpLCBfc3RlcDU7ICEoX3N0ZXA1ID0gX2l0ZXJhdG9yNSgpKS5kb25lOykge1xuICAgICAgICB2YXIgX29wID0gX3N0ZXA1LnZhbHVlO1xuICAgICAgICBzdHJlYW0ud3JpdGVVSW50OChfb3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgY3R4LnBvaW50ZXJzLmxlbmd0aCkge1xuICAgICAgdmFyIHB0ciA9IGN0eC5wb2ludGVyc1tpKytdO1xuICAgICAgcHRyLnR5cGUuZW5jb2RlKHN0cmVhbSwgcHRyLnZhbCwgcHRyLnBhcmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9O1xuXG4gIHJldHVybiBDRkZEaWN0O1xufSgpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIENGRlBvaW50ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9yJFBvaW50ZXIpIHtcbiAgX2luaGVyaXRzTG9vc2UoQ0ZGUG9pbnRlciwgX3IkUG9pbnRlcik7XG5cbiAgZnVuY3Rpb24gQ0ZGUG9pbnRlcih0eXBlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnR5cGUgPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy50eXBlID0gJ2dsb2JhbCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yJFBvaW50ZXIuY2FsbCh0aGlzLCBudWxsLCB0eXBlLCBvcHRpb25zKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IENGRlBvaW50ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQsIG9wZXJhbmRzKSB7XG4gICAgdGhpcy5vZmZzZXRUeXBlID0ge1xuICAgICAgZGVjb2RlOiBmdW5jdGlvbiBkZWNvZGUoKSB7XG4gICAgICAgIHJldHVybiBvcGVyYW5kc1swXTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBfciRQb2ludGVyLnByb3RvdHlwZS5kZWNvZGUuY2FsbCh0aGlzLCBzdHJlYW0sIHBhcmVudCwgb3BlcmFuZHMpO1xuICB9O1xuXG4gIF9wcm90by5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyZWFtLCB2YWx1ZSwgY3R4KSB7XG4gICAgaWYgKCFzdHJlYW0pIHtcbiAgICAgIC8vIGNvbXB1dGUgdGhlIHNpemUgKHNvIGN0eC5wb2ludGVyU2l6ZSBpcyBjb3JyZWN0KVxuICAgICAgdGhpcy5vZmZzZXRUeXBlID0ge1xuICAgICAgICBzaXplOiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5zaXplKHZhbHVlLCBjdHgpO1xuICAgICAgcmV0dXJuIFtuZXcgUHRyKDApXTtcbiAgICB9XG5cbiAgICB2YXIgcHRyID0gbnVsbDtcbiAgICB0aGlzLm9mZnNldFR5cGUgPSB7XG4gICAgICBlbmNvZGU6IGZ1bmN0aW9uIGVuY29kZShzdHJlYW0sIHZhbCkge1xuICAgICAgICByZXR1cm4gcHRyID0gdmFsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfciRQb2ludGVyLnByb3RvdHlwZS5lbmNvZGUuY2FsbCh0aGlzLCBzdHJlYW0sIHZhbHVlLCBjdHgpO1xuXG4gICAgcmV0dXJuIFtuZXcgUHRyKHB0cildO1xuICB9O1xuXG4gIHJldHVybiBDRkZQb2ludGVyO1xufShyZXN0cnVjdHVyZS5Qb2ludGVyKTtcblxudmFyIFB0ciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFB0cih2YWwpIHtcbiAgICB0aGlzLnZhbCA9IHZhbDtcbiAgICB0aGlzLmZvcmNlTGFyZ2UgPSB0cnVlO1xuICB9XG5cbiAgdmFyIF9wcm90bzIgPSBQdHIucHJvdG90eXBlO1xuXG4gIF9wcm90bzIudmFsdWVPZiA9IGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsO1xuICB9O1xuXG4gIHJldHVybiBQdHI7XG59KCk7XG5cbnZhciBDRkZCbGVuZE9wID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ0ZGQmxlbmRPcCgpIHt9XG5cbiAgQ0ZGQmxlbmRPcC5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQsIG9wZXJhbmRzKSB7XG4gICAgdmFyIG51bUJsZW5kcyA9IG9wZXJhbmRzLnBvcCgpOyAvLyBUT0RPOiBhY3R1YWxseSBibGVuZC4gRm9yIG5vdyBqdXN0IGNvbnN1bWUgdGhlIGRlbHRhc1xuICAgIC8vIHNpbmNlIHdlIGRvbid0IHVzZSBhbnkgb2YgdGhlIHZhbHVlcyBhbnl3YXkuXG5cbiAgICB3aGlsZSAob3BlcmFuZHMubGVuZ3RoID4gbnVtQmxlbmRzKSB7XG4gICAgICBvcGVyYW5kcy5wb3AoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIENGRkJsZW5kT3A7XG59KCk7XG5cbnZhciBDRkZQcml2YXRlRGljdCA9IG5ldyBDRkZEaWN0KFsvLyBrZXkgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgICAgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRcbls2LCAnQmx1ZVZhbHVlcycsICdkZWx0YScsIG51bGxdLCBbNywgJ090aGVyQmx1ZXMnLCAnZGVsdGEnLCBudWxsXSwgWzgsICdGYW1pbHlCbHVlcycsICdkZWx0YScsIG51bGxdLCBbOSwgJ0ZhbWlseU90aGVyQmx1ZXMnLCAnZGVsdGEnLCBudWxsXSwgW1sxMiwgOV0sICdCbHVlU2NhbGUnLCAnbnVtYmVyJywgMC4wMzk2MjVdLCBbWzEyLCAxMF0sICdCbHVlU2hpZnQnLCAnbnVtYmVyJywgN10sIFtbMTIsIDExXSwgJ0JsdWVGdXp6JywgJ251bWJlcicsIDFdLCBbMTAsICdTdGRIVycsICdudW1iZXInLCBudWxsXSwgWzExLCAnU3RkVlcnLCAnbnVtYmVyJywgbnVsbF0sIFtbMTIsIDEyXSwgJ1N0ZW1TbmFwSCcsICdkZWx0YScsIG51bGxdLCBbWzEyLCAxM10sICdTdGVtU25hcFYnLCAnZGVsdGEnLCBudWxsXSwgW1sxMiwgMTRdLCAnRm9yY2VCb2xkJywgJ2Jvb2xlYW4nLCBmYWxzZV0sIFtbMTIsIDE3XSwgJ0xhbmd1YWdlR3JvdXAnLCAnbnVtYmVyJywgMF0sIFtbMTIsIDE4XSwgJ0V4cGFuc2lvbkZhY3RvcicsICdudW1iZXInLCAwLjA2XSwgW1sxMiwgMTldLCAnaW5pdGlhbFJhbmRvbVNlZWQnLCAnbnVtYmVyJywgMF0sIFsyMCwgJ2RlZmF1bHRXaWR0aFgnLCAnbnVtYmVyJywgMF0sIFsyMSwgJ25vbWluYWxXaWR0aFgnLCAnbnVtYmVyJywgMF0sIFsyMiwgJ3ZzaW5kZXgnLCAnbnVtYmVyJywgMF0sIFsyMywgJ2JsZW5kJywgQ0ZGQmxlbmRPcCwgbnVsbF0sIFsxOSwgJ1N1YnJzJywgbmV3IENGRlBvaW50ZXIobmV3IENGRkluZGV4KCksIHtcbiAgdHlwZTogJ2xvY2FsJ1xufSksIG51bGxdXSk7XG5cbi8vIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gQXBwZW5kaXggQSBvZiB0aGUgQ0ZGIHNwZWNpZmljYXRpb247IGRvXG4vLyBub3QgZWRpdC4gTGVuZ3RoIHNob3VsZCBiZSAzOTEuXG52YXIgc3RhbmRhcmRTdHJpbmdzID0gW1wiLm5vdGRlZlwiLCBcInNwYWNlXCIsIFwiZXhjbGFtXCIsIFwicXVvdGVkYmxcIiwgXCJudW1iZXJzaWduXCIsIFwiZG9sbGFyXCIsIFwicGVyY2VudFwiLCBcImFtcGVyc2FuZFwiLCBcInF1b3RlcmlnaHRcIiwgXCJwYXJlbmxlZnRcIiwgXCJwYXJlbnJpZ2h0XCIsIFwiYXN0ZXJpc2tcIiwgXCJwbHVzXCIsIFwiY29tbWFcIiwgXCJoeXBoZW5cIiwgXCJwZXJpb2RcIiwgXCJzbGFzaFwiLCBcInplcm9cIiwgXCJvbmVcIiwgXCJ0d29cIiwgXCJ0aHJlZVwiLCBcImZvdXJcIiwgXCJmaXZlXCIsIFwic2l4XCIsIFwic2V2ZW5cIiwgXCJlaWdodFwiLCBcIm5pbmVcIiwgXCJjb2xvblwiLCBcInNlbWljb2xvblwiLCBcImxlc3NcIiwgXCJlcXVhbFwiLCBcImdyZWF0ZXJcIiwgXCJxdWVzdGlvblwiLCBcImF0XCIsIFwiQVwiLCBcIkJcIiwgXCJDXCIsIFwiRFwiLCBcIkVcIiwgXCJGXCIsIFwiR1wiLCBcIkhcIiwgXCJJXCIsIFwiSlwiLCBcIktcIiwgXCJMXCIsIFwiTVwiLCBcIk5cIiwgXCJPXCIsIFwiUFwiLCBcIlFcIiwgXCJSXCIsIFwiU1wiLCBcIlRcIiwgXCJVXCIsIFwiVlwiLCBcIldcIiwgXCJYXCIsIFwiWVwiLCBcIlpcIiwgXCJicmFja2V0bGVmdFwiLCBcImJhY2tzbGFzaFwiLCBcImJyYWNrZXRyaWdodFwiLCBcImFzY2lpY2lyY3VtXCIsIFwidW5kZXJzY29yZVwiLCBcInF1b3RlbGVmdFwiLCBcImFcIiwgXCJiXCIsIFwiY1wiLCBcImRcIiwgXCJlXCIsIFwiZlwiLCBcImdcIiwgXCJoXCIsIFwiaVwiLCBcImpcIiwgXCJrXCIsIFwibFwiLCBcIm1cIiwgXCJuXCIsIFwib1wiLCBcInBcIiwgXCJxXCIsIFwiclwiLCBcInNcIiwgXCJ0XCIsIFwidVwiLCBcInZcIiwgXCJ3XCIsIFwieFwiLCBcInlcIiwgXCJ6XCIsIFwiYnJhY2VsZWZ0XCIsIFwiYmFyXCIsIFwiYnJhY2VyaWdodFwiLCBcImFzY2lpdGlsZGVcIiwgXCJleGNsYW1kb3duXCIsIFwiY2VudFwiLCBcInN0ZXJsaW5nXCIsIFwiZnJhY3Rpb25cIiwgXCJ5ZW5cIiwgXCJmbG9yaW5cIiwgXCJzZWN0aW9uXCIsIFwiY3VycmVuY3lcIiwgXCJxdW90ZXNpbmdsZVwiLCBcInF1b3RlZGJsbGVmdFwiLCBcImd1aWxsZW1vdGxlZnRcIiwgXCJndWlsc2luZ2xsZWZ0XCIsIFwiZ3VpbHNpbmdscmlnaHRcIiwgXCJmaVwiLCBcImZsXCIsIFwiZW5kYXNoXCIsIFwiZGFnZ2VyXCIsIFwiZGFnZ2VyZGJsXCIsIFwicGVyaW9kY2VudGVyZWRcIiwgXCJwYXJhZ3JhcGhcIiwgXCJidWxsZXRcIiwgXCJxdW90ZXNpbmdsYmFzZVwiLCBcInF1b3RlZGJsYmFzZVwiLCBcInF1b3RlZGJscmlnaHRcIiwgXCJndWlsbGVtb3RyaWdodFwiLCBcImVsbGlwc2lzXCIsIFwicGVydGhvdXNhbmRcIiwgXCJxdWVzdGlvbmRvd25cIiwgXCJncmF2ZVwiLCBcImFjdXRlXCIsIFwiY2lyY3VtZmxleFwiLCBcInRpbGRlXCIsIFwibWFjcm9uXCIsIFwiYnJldmVcIiwgXCJkb3RhY2NlbnRcIiwgXCJkaWVyZXNpc1wiLCBcInJpbmdcIiwgXCJjZWRpbGxhXCIsIFwiaHVuZ2FydW1sYXV0XCIsIFwib2dvbmVrXCIsIFwiY2Fyb25cIiwgXCJlbWRhc2hcIiwgXCJBRVwiLCBcIm9yZGZlbWluaW5lXCIsIFwiTHNsYXNoXCIsIFwiT3NsYXNoXCIsIFwiT0VcIiwgXCJvcmRtYXNjdWxpbmVcIiwgXCJhZVwiLCBcImRvdGxlc3NpXCIsIFwibHNsYXNoXCIsIFwib3NsYXNoXCIsIFwib2VcIiwgXCJnZXJtYW5kYmxzXCIsIFwib25lc3VwZXJpb3JcIiwgXCJsb2dpY2Fsbm90XCIsIFwibXVcIiwgXCJ0cmFkZW1hcmtcIiwgXCJFdGhcIiwgXCJvbmVoYWxmXCIsIFwicGx1c21pbnVzXCIsIFwiVGhvcm5cIiwgXCJvbmVxdWFydGVyXCIsIFwiZGl2aWRlXCIsIFwiYnJva2VuYmFyXCIsIFwiZGVncmVlXCIsIFwidGhvcm5cIiwgXCJ0aHJlZXF1YXJ0ZXJzXCIsIFwidHdvc3VwZXJpb3JcIiwgXCJyZWdpc3RlcmVkXCIsIFwibWludXNcIiwgXCJldGhcIiwgXCJtdWx0aXBseVwiLCBcInRocmVlc3VwZXJpb3JcIiwgXCJjb3B5cmlnaHRcIiwgXCJBYWN1dGVcIiwgXCJBY2lyY3VtZmxleFwiLCBcIkFkaWVyZXNpc1wiLCBcIkFncmF2ZVwiLCBcIkFyaW5nXCIsIFwiQXRpbGRlXCIsIFwiQ2NlZGlsbGFcIiwgXCJFYWN1dGVcIiwgXCJFY2lyY3VtZmxleFwiLCBcIkVkaWVyZXNpc1wiLCBcIkVncmF2ZVwiLCBcIklhY3V0ZVwiLCBcIkljaXJjdW1mbGV4XCIsIFwiSWRpZXJlc2lzXCIsIFwiSWdyYXZlXCIsIFwiTnRpbGRlXCIsIFwiT2FjdXRlXCIsIFwiT2NpcmN1bWZsZXhcIiwgXCJPZGllcmVzaXNcIiwgXCJPZ3JhdmVcIiwgXCJPdGlsZGVcIiwgXCJTY2Fyb25cIiwgXCJVYWN1dGVcIiwgXCJVY2lyY3VtZmxleFwiLCBcIlVkaWVyZXNpc1wiLCBcIlVncmF2ZVwiLCBcIllhY3V0ZVwiLCBcIllkaWVyZXNpc1wiLCBcIlpjYXJvblwiLCBcImFhY3V0ZVwiLCBcImFjaXJjdW1mbGV4XCIsIFwiYWRpZXJlc2lzXCIsIFwiYWdyYXZlXCIsIFwiYXJpbmdcIiwgXCJhdGlsZGVcIiwgXCJjY2VkaWxsYVwiLCBcImVhY3V0ZVwiLCBcImVjaXJjdW1mbGV4XCIsIFwiZWRpZXJlc2lzXCIsIFwiZWdyYXZlXCIsIFwiaWFjdXRlXCIsIFwiaWNpcmN1bWZsZXhcIiwgXCJpZGllcmVzaXNcIiwgXCJpZ3JhdmVcIiwgXCJudGlsZGVcIiwgXCJvYWN1dGVcIiwgXCJvY2lyY3VtZmxleFwiLCBcIm9kaWVyZXNpc1wiLCBcIm9ncmF2ZVwiLCBcIm90aWxkZVwiLCBcInNjYXJvblwiLCBcInVhY3V0ZVwiLCBcInVjaXJjdW1mbGV4XCIsIFwidWRpZXJlc2lzXCIsIFwidWdyYXZlXCIsIFwieWFjdXRlXCIsIFwieWRpZXJlc2lzXCIsIFwiemNhcm9uXCIsIFwiZXhjbGFtc21hbGxcIiwgXCJIdW5nYXJ1bWxhdXRzbWFsbFwiLCBcImRvbGxhcm9sZHN0eWxlXCIsIFwiZG9sbGFyc3VwZXJpb3JcIiwgXCJhbXBlcnNhbmRzbWFsbFwiLCBcIkFjdXRlc21hbGxcIiwgXCJwYXJlbmxlZnRzdXBlcmlvclwiLCBcInBhcmVucmlnaHRzdXBlcmlvclwiLCBcInR3b2RvdGVubGVhZGVyXCIsIFwib25lZG90ZW5sZWFkZXJcIiwgXCJ6ZXJvb2xkc3R5bGVcIiwgXCJvbmVvbGRzdHlsZVwiLCBcInR3b29sZHN0eWxlXCIsIFwidGhyZWVvbGRzdHlsZVwiLCBcImZvdXJvbGRzdHlsZVwiLCBcImZpdmVvbGRzdHlsZVwiLCBcInNpeG9sZHN0eWxlXCIsIFwic2V2ZW5vbGRzdHlsZVwiLCBcImVpZ2h0b2xkc3R5bGVcIiwgXCJuaW5lb2xkc3R5bGVcIiwgXCJjb21tYXN1cGVyaW9yXCIsIFwidGhyZWVxdWFydGVyc2VtZGFzaFwiLCBcInBlcmlvZHN1cGVyaW9yXCIsIFwicXVlc3Rpb25zbWFsbFwiLCBcImFzdXBlcmlvclwiLCBcImJzdXBlcmlvclwiLCBcImNlbnRzdXBlcmlvclwiLCBcImRzdXBlcmlvclwiLCBcImVzdXBlcmlvclwiLCBcImlzdXBlcmlvclwiLCBcImxzdXBlcmlvclwiLCBcIm1zdXBlcmlvclwiLCBcIm5zdXBlcmlvclwiLCBcIm9zdXBlcmlvclwiLCBcInJzdXBlcmlvclwiLCBcInNzdXBlcmlvclwiLCBcInRzdXBlcmlvclwiLCBcImZmXCIsIFwiZmZpXCIsIFwiZmZsXCIsIFwicGFyZW5sZWZ0aW5mZXJpb3JcIiwgXCJwYXJlbnJpZ2h0aW5mZXJpb3JcIiwgXCJDaXJjdW1mbGV4c21hbGxcIiwgXCJoeXBoZW5zdXBlcmlvclwiLCBcIkdyYXZlc21hbGxcIiwgXCJBc21hbGxcIiwgXCJCc21hbGxcIiwgXCJDc21hbGxcIiwgXCJEc21hbGxcIiwgXCJFc21hbGxcIiwgXCJGc21hbGxcIiwgXCJHc21hbGxcIiwgXCJIc21hbGxcIiwgXCJJc21hbGxcIiwgXCJKc21hbGxcIiwgXCJLc21hbGxcIiwgXCJMc21hbGxcIiwgXCJNc21hbGxcIiwgXCJOc21hbGxcIiwgXCJPc21hbGxcIiwgXCJQc21hbGxcIiwgXCJRc21hbGxcIiwgXCJSc21hbGxcIiwgXCJTc21hbGxcIiwgXCJUc21hbGxcIiwgXCJVc21hbGxcIiwgXCJWc21hbGxcIiwgXCJXc21hbGxcIiwgXCJYc21hbGxcIiwgXCJZc21hbGxcIiwgXCJac21hbGxcIiwgXCJjb2xvbm1vbmV0YXJ5XCIsIFwib25lZml0dGVkXCIsIFwicnVwaWFoXCIsIFwiVGlsZGVzbWFsbFwiLCBcImV4Y2xhbWRvd25zbWFsbFwiLCBcImNlbnRvbGRzdHlsZVwiLCBcIkxzbGFzaHNtYWxsXCIsIFwiU2Nhcm9uc21hbGxcIiwgXCJaY2Fyb25zbWFsbFwiLCBcIkRpZXJlc2lzc21hbGxcIiwgXCJCcmV2ZXNtYWxsXCIsIFwiQ2Fyb25zbWFsbFwiLCBcIkRvdGFjY2VudHNtYWxsXCIsIFwiTWFjcm9uc21hbGxcIiwgXCJmaWd1cmVkYXNoXCIsIFwiaHlwaGVuaW5mZXJpb3JcIiwgXCJPZ29uZWtzbWFsbFwiLCBcIlJpbmdzbWFsbFwiLCBcIkNlZGlsbGFzbWFsbFwiLCBcInF1ZXN0aW9uZG93bnNtYWxsXCIsIFwib25lZWlnaHRoXCIsIFwidGhyZWVlaWdodGhzXCIsIFwiZml2ZWVpZ2h0aHNcIiwgXCJzZXZlbmVpZ2h0aHNcIiwgXCJvbmV0aGlyZFwiLCBcInR3b3RoaXJkc1wiLCBcInplcm9zdXBlcmlvclwiLCBcImZvdXJzdXBlcmlvclwiLCBcImZpdmVzdXBlcmlvclwiLCBcInNpeHN1cGVyaW9yXCIsIFwic2V2ZW5zdXBlcmlvclwiLCBcImVpZ2h0c3VwZXJpb3JcIiwgXCJuaW5lc3VwZXJpb3JcIiwgXCJ6ZXJvaW5mZXJpb3JcIiwgXCJvbmVpbmZlcmlvclwiLCBcInR3b2luZmVyaW9yXCIsIFwidGhyZWVpbmZlcmlvclwiLCBcImZvdXJpbmZlcmlvclwiLCBcImZpdmVpbmZlcmlvclwiLCBcInNpeGluZmVyaW9yXCIsIFwic2V2ZW5pbmZlcmlvclwiLCBcImVpZ2h0aW5mZXJpb3JcIiwgXCJuaW5laW5mZXJpb3JcIiwgXCJjZW50aW5mZXJpb3JcIiwgXCJkb2xsYXJpbmZlcmlvclwiLCBcInBlcmlvZGluZmVyaW9yXCIsIFwiY29tbWFpbmZlcmlvclwiLCBcIkFncmF2ZXNtYWxsXCIsIFwiQWFjdXRlc21hbGxcIiwgXCJBY2lyY3VtZmxleHNtYWxsXCIsIFwiQXRpbGRlc21hbGxcIiwgXCJBZGllcmVzaXNzbWFsbFwiLCBcIkFyaW5nc21hbGxcIiwgXCJBRXNtYWxsXCIsIFwiQ2NlZGlsbGFzbWFsbFwiLCBcIkVncmF2ZXNtYWxsXCIsIFwiRWFjdXRlc21hbGxcIiwgXCJFY2lyY3VtZmxleHNtYWxsXCIsIFwiRWRpZXJlc2lzc21hbGxcIiwgXCJJZ3JhdmVzbWFsbFwiLCBcIklhY3V0ZXNtYWxsXCIsIFwiSWNpcmN1bWZsZXhzbWFsbFwiLCBcIklkaWVyZXNpc3NtYWxsXCIsIFwiRXRoc21hbGxcIiwgXCJOdGlsZGVzbWFsbFwiLCBcIk9ncmF2ZXNtYWxsXCIsIFwiT2FjdXRlc21hbGxcIiwgXCJPY2lyY3VtZmxleHNtYWxsXCIsIFwiT3RpbGRlc21hbGxcIiwgXCJPZGllcmVzaXNzbWFsbFwiLCBcIk9Fc21hbGxcIiwgXCJPc2xhc2hzbWFsbFwiLCBcIlVncmF2ZXNtYWxsXCIsIFwiVWFjdXRlc21hbGxcIiwgXCJVY2lyY3VtZmxleHNtYWxsXCIsIFwiVWRpZXJlc2lzc21hbGxcIiwgXCJZYWN1dGVzbWFsbFwiLCBcIlRob3Juc21hbGxcIiwgXCJZZGllcmVzaXNzbWFsbFwiLCBcIjAwMS4wMDBcIiwgXCIwMDEuMDAxXCIsIFwiMDAxLjAwMlwiLCBcIjAwMS4wMDNcIiwgXCJCbGFja1wiLCBcIkJvbGRcIiwgXCJCb29rXCIsIFwiTGlnaHRcIiwgXCJNZWRpdW1cIiwgXCJSZWd1bGFyXCIsIFwiUm9tYW5cIiwgXCJTZW1pYm9sZFwiXTtcblxudmFyIFN0YW5kYXJkRW5jb2RpbmcgPSBbJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnc3BhY2UnLCAnZXhjbGFtJywgJ3F1b3RlZGJsJywgJ251bWJlcnNpZ24nLCAnZG9sbGFyJywgJ3BlcmNlbnQnLCAnYW1wZXJzYW5kJywgJ3F1b3RlcmlnaHQnLCAncGFyZW5sZWZ0JywgJ3BhcmVucmlnaHQnLCAnYXN0ZXJpc2snLCAncGx1cycsICdjb21tYScsICdoeXBoZW4nLCAncGVyaW9kJywgJ3NsYXNoJywgJ3plcm8nLCAnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJywgJ2ZpdmUnLCAnc2l4JywgJ3NldmVuJywgJ2VpZ2h0JywgJ25pbmUnLCAnY29sb24nLCAnc2VtaWNvbG9uJywgJ2xlc3MnLCAnZXF1YWwnLCAnZ3JlYXRlcicsICdxdWVzdGlvbicsICdhdCcsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLCAnTycsICdQJywgJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnYnJhY2tldGxlZnQnLCAnYmFja3NsYXNoJywgJ2JyYWNrZXRyaWdodCcsICdhc2NpaWNpcmN1bScsICd1bmRlcnNjb3JlJywgJ3F1b3RlbGVmdCcsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLCAnYnJhY2VsZWZ0JywgJ2JhcicsICdicmFjZXJpZ2h0JywgJ2FzY2lpdGlsZGUnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJ2V4Y2xhbWRvd24nLCAnY2VudCcsICdzdGVybGluZycsICdmcmFjdGlvbicsICd5ZW4nLCAnZmxvcmluJywgJ3NlY3Rpb24nLCAnY3VycmVuY3knLCAncXVvdGVzaW5nbGUnLCAncXVvdGVkYmxsZWZ0JywgJ2d1aWxsZW1vdGxlZnQnLCAnZ3VpbHNpbmdsbGVmdCcsICdndWlsc2luZ2xyaWdodCcsICdmaScsICdmbCcsICcnLCAnZW5kYXNoJywgJ2RhZ2dlcicsICdkYWdnZXJkYmwnLCAncGVyaW9kY2VudGVyZWQnLCAnJywgJ3BhcmFncmFwaCcsICdidWxsZXQnLCAncXVvdGVzaW5nbGJhc2UnLCAncXVvdGVkYmxiYXNlJywgJ3F1b3RlZGJscmlnaHQnLCAnZ3VpbGxlbW90cmlnaHQnLCAnZWxsaXBzaXMnLCAncGVydGhvdXNhbmQnLCAnJywgJ3F1ZXN0aW9uZG93bicsICcnLCAnZ3JhdmUnLCAnYWN1dGUnLCAnY2lyY3VtZmxleCcsICd0aWxkZScsICdtYWNyb24nLCAnYnJldmUnLCAnZG90YWNjZW50JywgJ2RpZXJlc2lzJywgJycsICdyaW5nJywgJ2NlZGlsbGEnLCAnJywgJ2h1bmdhcnVtbGF1dCcsICdvZ29uZWsnLCAnY2Fyb24nLCAnZW1kYXNoJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICdBRScsICcnLCAnb3JkZmVtaW5pbmUnLCAnJywgJycsICcnLCAnJywgJ0xzbGFzaCcsICdPc2xhc2gnLCAnT0UnLCAnb3JkbWFzY3VsaW5lJywgJycsICcnLCAnJywgJycsICcnLCAnYWUnLCAnJywgJycsICcnLCAnZG90bGVzc2knLCAnJywgJycsICdsc2xhc2gnLCAnb3NsYXNoJywgJ29lJywgJ2dlcm1hbmRibHMnXTtcbnZhciBFeHBlcnRFbmNvZGluZyA9IFsnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICdzcGFjZScsICdleGNsYW1zbWFsbCcsICdIdW5nYXJ1bWxhdXRzbWFsbCcsICcnLCAnZG9sbGFyb2xkc3R5bGUnLCAnZG9sbGFyc3VwZXJpb3InLCAnYW1wZXJzYW5kc21hbGwnLCAnQWN1dGVzbWFsbCcsICdwYXJlbmxlZnRzdXBlcmlvcicsICdwYXJlbnJpZ2h0c3VwZXJpb3InLCAndHdvZG90ZW5sZWFkZXInLCAnb25lZG90ZW5sZWFkZXInLCAnY29tbWEnLCAnaHlwaGVuJywgJ3BlcmlvZCcsICdmcmFjdGlvbicsICd6ZXJvb2xkc3R5bGUnLCAnb25lb2xkc3R5bGUnLCAndHdvb2xkc3R5bGUnLCAndGhyZWVvbGRzdHlsZScsICdmb3Vyb2xkc3R5bGUnLCAnZml2ZW9sZHN0eWxlJywgJ3NpeG9sZHN0eWxlJywgJ3NldmVub2xkc3R5bGUnLCAnZWlnaHRvbGRzdHlsZScsICduaW5lb2xkc3R5bGUnLCAnY29sb24nLCAnc2VtaWNvbG9uJywgJ2NvbW1hc3VwZXJpb3InLCAndGhyZWVxdWFydGVyc2VtZGFzaCcsICdwZXJpb2RzdXBlcmlvcicsICdxdWVzdGlvbnNtYWxsJywgJycsICdhc3VwZXJpb3InLCAnYnN1cGVyaW9yJywgJ2NlbnRzdXBlcmlvcicsICdkc3VwZXJpb3InLCAnZXN1cGVyaW9yJywgJycsICcnLCAnaXN1cGVyaW9yJywgJycsICcnLCAnbHN1cGVyaW9yJywgJ21zdXBlcmlvcicsICduc3VwZXJpb3InLCAnb3N1cGVyaW9yJywgJycsICcnLCAncnN1cGVyaW9yJywgJ3NzdXBlcmlvcicsICd0c3VwZXJpb3InLCAnJywgJ2ZmJywgJ2ZpJywgJ2ZsJywgJ2ZmaScsICdmZmwnLCAncGFyZW5sZWZ0aW5mZXJpb3InLCAnJywgJ3BhcmVucmlnaHRpbmZlcmlvcicsICdDaXJjdW1mbGV4c21hbGwnLCAnaHlwaGVuc3VwZXJpb3InLCAnR3JhdmVzbWFsbCcsICdBc21hbGwnLCAnQnNtYWxsJywgJ0NzbWFsbCcsICdEc21hbGwnLCAnRXNtYWxsJywgJ0ZzbWFsbCcsICdHc21hbGwnLCAnSHNtYWxsJywgJ0lzbWFsbCcsICdKc21hbGwnLCAnS3NtYWxsJywgJ0xzbWFsbCcsICdNc21hbGwnLCAnTnNtYWxsJywgJ09zbWFsbCcsICdQc21hbGwnLCAnUXNtYWxsJywgJ1JzbWFsbCcsICdTc21hbGwnLCAnVHNtYWxsJywgJ1VzbWFsbCcsICdWc21hbGwnLCAnV3NtYWxsJywgJ1hzbWFsbCcsICdZc21hbGwnLCAnWnNtYWxsJywgJ2NvbG9ubW9uZXRhcnknLCAnb25lZml0dGVkJywgJ3J1cGlhaCcsICdUaWxkZXNtYWxsJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICdleGNsYW1kb3duc21hbGwnLCAnY2VudG9sZHN0eWxlJywgJ0xzbGFzaHNtYWxsJywgJycsICcnLCAnU2Nhcm9uc21hbGwnLCAnWmNhcm9uc21hbGwnLCAnRGllcmVzaXNzbWFsbCcsICdCcmV2ZXNtYWxsJywgJ0Nhcm9uc21hbGwnLCAnJywgJ0RvdGFjY2VudHNtYWxsJywgJycsICcnLCAnTWFjcm9uc21hbGwnLCAnJywgJycsICdmaWd1cmVkYXNoJywgJ2h5cGhlbmluZmVyaW9yJywgJycsICcnLCAnT2dvbmVrc21hbGwnLCAnUmluZ3NtYWxsJywgJ0NlZGlsbGFzbWFsbCcsICcnLCAnJywgJycsICdvbmVxdWFydGVyJywgJ29uZWhhbGYnLCAndGhyZWVxdWFydGVycycsICdxdWVzdGlvbmRvd25zbWFsbCcsICdvbmVlaWdodGgnLCAndGhyZWVlaWdodGhzJywgJ2ZpdmVlaWdodGhzJywgJ3NldmVuZWlnaHRocycsICdvbmV0aGlyZCcsICd0d290aGlyZHMnLCAnJywgJycsICd6ZXJvc3VwZXJpb3InLCAnb25lc3VwZXJpb3InLCAndHdvc3VwZXJpb3InLCAndGhyZWVzdXBlcmlvcicsICdmb3Vyc3VwZXJpb3InLCAnZml2ZXN1cGVyaW9yJywgJ3NpeHN1cGVyaW9yJywgJ3NldmVuc3VwZXJpb3InLCAnZWlnaHRzdXBlcmlvcicsICduaW5lc3VwZXJpb3InLCAnemVyb2luZmVyaW9yJywgJ29uZWluZmVyaW9yJywgJ3R3b2luZmVyaW9yJywgJ3RocmVlaW5mZXJpb3InLCAnZm91cmluZmVyaW9yJywgJ2ZpdmVpbmZlcmlvcicsICdzaXhpbmZlcmlvcicsICdzZXZlbmluZmVyaW9yJywgJ2VpZ2h0aW5mZXJpb3InLCAnbmluZWluZmVyaW9yJywgJ2NlbnRpbmZlcmlvcicsICdkb2xsYXJpbmZlcmlvcicsICdwZXJpb2RpbmZlcmlvcicsICdjb21tYWluZmVyaW9yJywgJ0FncmF2ZXNtYWxsJywgJ0FhY3V0ZXNtYWxsJywgJ0FjaXJjdW1mbGV4c21hbGwnLCAnQXRpbGRlc21hbGwnLCAnQWRpZXJlc2lzc21hbGwnLCAnQXJpbmdzbWFsbCcsICdBRXNtYWxsJywgJ0NjZWRpbGxhc21hbGwnLCAnRWdyYXZlc21hbGwnLCAnRWFjdXRlc21hbGwnLCAnRWNpcmN1bWZsZXhzbWFsbCcsICdFZGllcmVzaXNzbWFsbCcsICdJZ3JhdmVzbWFsbCcsICdJYWN1dGVzbWFsbCcsICdJY2lyY3VtZmxleHNtYWxsJywgJ0lkaWVyZXNpc3NtYWxsJywgJ0V0aHNtYWxsJywgJ050aWxkZXNtYWxsJywgJ09ncmF2ZXNtYWxsJywgJ09hY3V0ZXNtYWxsJywgJ09jaXJjdW1mbGV4c21hbGwnLCAnT3RpbGRlc21hbGwnLCAnT2RpZXJlc2lzc21hbGwnLCAnT0VzbWFsbCcsICdPc2xhc2hzbWFsbCcsICdVZ3JhdmVzbWFsbCcsICdVYWN1dGVzbWFsbCcsICdVY2lyY3VtZmxleHNtYWxsJywgJ1VkaWVyZXNpc3NtYWxsJywgJ1lhY3V0ZXNtYWxsJywgJ1Rob3Juc21hbGwnLCAnWWRpZXJlc2lzc21hbGwnXTtcblxudmFyIElTT0Fkb2JlQ2hhcnNldCA9IFsnLm5vdGRlZicsICdzcGFjZScsICdleGNsYW0nLCAncXVvdGVkYmwnLCAnbnVtYmVyc2lnbicsICdkb2xsYXInLCAncGVyY2VudCcsICdhbXBlcnNhbmQnLCAncXVvdGVyaWdodCcsICdwYXJlbmxlZnQnLCAncGFyZW5yaWdodCcsICdhc3RlcmlzaycsICdwbHVzJywgJ2NvbW1hJywgJ2h5cGhlbicsICdwZXJpb2QnLCAnc2xhc2gnLCAnemVybycsICdvbmUnLCAndHdvJywgJ3RocmVlJywgJ2ZvdXInLCAnZml2ZScsICdzaXgnLCAnc2V2ZW4nLCAnZWlnaHQnLCAnbmluZScsICdjb2xvbicsICdzZW1pY29sb24nLCAnbGVzcycsICdlcXVhbCcsICdncmVhdGVyJywgJ3F1ZXN0aW9uJywgJ2F0JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsICdicmFja2V0bGVmdCcsICdiYWNrc2xhc2gnLCAnYnJhY2tldHJpZ2h0JywgJ2FzY2lpY2lyY3VtJywgJ3VuZGVyc2NvcmUnLCAncXVvdGVsZWZ0JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsICdvJywgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsICdicmFjZWxlZnQnLCAnYmFyJywgJ2JyYWNlcmlnaHQnLCAnYXNjaWl0aWxkZScsICdleGNsYW1kb3duJywgJ2NlbnQnLCAnc3RlcmxpbmcnLCAnZnJhY3Rpb24nLCAneWVuJywgJ2Zsb3JpbicsICdzZWN0aW9uJywgJ2N1cnJlbmN5JywgJ3F1b3Rlc2luZ2xlJywgJ3F1b3RlZGJsbGVmdCcsICdndWlsbGVtb3RsZWZ0JywgJ2d1aWxzaW5nbGxlZnQnLCAnZ3VpbHNpbmdscmlnaHQnLCAnZmknLCAnZmwnLCAnZW5kYXNoJywgJ2RhZ2dlcicsICdkYWdnZXJkYmwnLCAncGVyaW9kY2VudGVyZWQnLCAncGFyYWdyYXBoJywgJ2J1bGxldCcsICdxdW90ZXNpbmdsYmFzZScsICdxdW90ZWRibGJhc2UnLCAncXVvdGVkYmxyaWdodCcsICdndWlsbGVtb3RyaWdodCcsICdlbGxpcHNpcycsICdwZXJ0aG91c2FuZCcsICdxdWVzdGlvbmRvd24nLCAnZ3JhdmUnLCAnYWN1dGUnLCAnY2lyY3VtZmxleCcsICd0aWxkZScsICdtYWNyb24nLCAnYnJldmUnLCAnZG90YWNjZW50JywgJ2RpZXJlc2lzJywgJ3JpbmcnLCAnY2VkaWxsYScsICdodW5nYXJ1bWxhdXQnLCAnb2dvbmVrJywgJ2Nhcm9uJywgJ2VtZGFzaCcsICdBRScsICdvcmRmZW1pbmluZScsICdMc2xhc2gnLCAnT3NsYXNoJywgJ09FJywgJ29yZG1hc2N1bGluZScsICdhZScsICdkb3RsZXNzaScsICdsc2xhc2gnLCAnb3NsYXNoJywgJ29lJywgJ2dlcm1hbmRibHMnLCAnb25lc3VwZXJpb3InLCAnbG9naWNhbG5vdCcsICdtdScsICd0cmFkZW1hcmsnLCAnRXRoJywgJ29uZWhhbGYnLCAncGx1c21pbnVzJywgJ1Rob3JuJywgJ29uZXF1YXJ0ZXInLCAnZGl2aWRlJywgJ2Jyb2tlbmJhcicsICdkZWdyZWUnLCAndGhvcm4nLCAndGhyZWVxdWFydGVycycsICd0d29zdXBlcmlvcicsICdyZWdpc3RlcmVkJywgJ21pbnVzJywgJ2V0aCcsICdtdWx0aXBseScsICd0aHJlZXN1cGVyaW9yJywgJ2NvcHlyaWdodCcsICdBYWN1dGUnLCAnQWNpcmN1bWZsZXgnLCAnQWRpZXJlc2lzJywgJ0FncmF2ZScsICdBcmluZycsICdBdGlsZGUnLCAnQ2NlZGlsbGEnLCAnRWFjdXRlJywgJ0VjaXJjdW1mbGV4JywgJ0VkaWVyZXNpcycsICdFZ3JhdmUnLCAnSWFjdXRlJywgJ0ljaXJjdW1mbGV4JywgJ0lkaWVyZXNpcycsICdJZ3JhdmUnLCAnTnRpbGRlJywgJ09hY3V0ZScsICdPY2lyY3VtZmxleCcsICdPZGllcmVzaXMnLCAnT2dyYXZlJywgJ090aWxkZScsICdTY2Fyb24nLCAnVWFjdXRlJywgJ1VjaXJjdW1mbGV4JywgJ1VkaWVyZXNpcycsICdVZ3JhdmUnLCAnWWFjdXRlJywgJ1lkaWVyZXNpcycsICdaY2Fyb24nLCAnYWFjdXRlJywgJ2FjaXJjdW1mbGV4JywgJ2FkaWVyZXNpcycsICdhZ3JhdmUnLCAnYXJpbmcnLCAnYXRpbGRlJywgJ2NjZWRpbGxhJywgJ2VhY3V0ZScsICdlY2lyY3VtZmxleCcsICdlZGllcmVzaXMnLCAnZWdyYXZlJywgJ2lhY3V0ZScsICdpY2lyY3VtZmxleCcsICdpZGllcmVzaXMnLCAnaWdyYXZlJywgJ250aWxkZScsICdvYWN1dGUnLCAnb2NpcmN1bWZsZXgnLCAnb2RpZXJlc2lzJywgJ29ncmF2ZScsICdvdGlsZGUnLCAnc2Nhcm9uJywgJ3VhY3V0ZScsICd1Y2lyY3VtZmxleCcsICd1ZGllcmVzaXMnLCAndWdyYXZlJywgJ3lhY3V0ZScsICd5ZGllcmVzaXMnLCAnemNhcm9uJ107XG52YXIgRXhwZXJ0Q2hhcnNldCA9IFsnLm5vdGRlZicsICdzcGFjZScsICdleGNsYW1zbWFsbCcsICdIdW5nYXJ1bWxhdXRzbWFsbCcsICdkb2xsYXJvbGRzdHlsZScsICdkb2xsYXJzdXBlcmlvcicsICdhbXBlcnNhbmRzbWFsbCcsICdBY3V0ZXNtYWxsJywgJ3BhcmVubGVmdHN1cGVyaW9yJywgJ3BhcmVucmlnaHRzdXBlcmlvcicsICd0d29kb3RlbmxlYWRlcicsICdvbmVkb3RlbmxlYWRlcicsICdjb21tYScsICdoeXBoZW4nLCAncGVyaW9kJywgJ2ZyYWN0aW9uJywgJ3plcm9vbGRzdHlsZScsICdvbmVvbGRzdHlsZScsICd0d29vbGRzdHlsZScsICd0aHJlZW9sZHN0eWxlJywgJ2ZvdXJvbGRzdHlsZScsICdmaXZlb2xkc3R5bGUnLCAnc2l4b2xkc3R5bGUnLCAnc2V2ZW5vbGRzdHlsZScsICdlaWdodG9sZHN0eWxlJywgJ25pbmVvbGRzdHlsZScsICdjb2xvbicsICdzZW1pY29sb24nLCAnY29tbWFzdXBlcmlvcicsICd0aHJlZXF1YXJ0ZXJzZW1kYXNoJywgJ3BlcmlvZHN1cGVyaW9yJywgJ3F1ZXN0aW9uc21hbGwnLCAnYXN1cGVyaW9yJywgJ2JzdXBlcmlvcicsICdjZW50c3VwZXJpb3InLCAnZHN1cGVyaW9yJywgJ2VzdXBlcmlvcicsICdpc3VwZXJpb3InLCAnbHN1cGVyaW9yJywgJ21zdXBlcmlvcicsICduc3VwZXJpb3InLCAnb3N1cGVyaW9yJywgJ3JzdXBlcmlvcicsICdzc3VwZXJpb3InLCAndHN1cGVyaW9yJywgJ2ZmJywgJ2ZpJywgJ2ZsJywgJ2ZmaScsICdmZmwnLCAncGFyZW5sZWZ0aW5mZXJpb3InLCAncGFyZW5yaWdodGluZmVyaW9yJywgJ0NpcmN1bWZsZXhzbWFsbCcsICdoeXBoZW5zdXBlcmlvcicsICdHcmF2ZXNtYWxsJywgJ0FzbWFsbCcsICdCc21hbGwnLCAnQ3NtYWxsJywgJ0RzbWFsbCcsICdFc21hbGwnLCAnRnNtYWxsJywgJ0dzbWFsbCcsICdIc21hbGwnLCAnSXNtYWxsJywgJ0pzbWFsbCcsICdLc21hbGwnLCAnTHNtYWxsJywgJ01zbWFsbCcsICdOc21hbGwnLCAnT3NtYWxsJywgJ1BzbWFsbCcsICdRc21hbGwnLCAnUnNtYWxsJywgJ1NzbWFsbCcsICdUc21hbGwnLCAnVXNtYWxsJywgJ1ZzbWFsbCcsICdXc21hbGwnLCAnWHNtYWxsJywgJ1lzbWFsbCcsICdac21hbGwnLCAnY29sb25tb25ldGFyeScsICdvbmVmaXR0ZWQnLCAncnVwaWFoJywgJ1RpbGRlc21hbGwnLCAnZXhjbGFtZG93bnNtYWxsJywgJ2NlbnRvbGRzdHlsZScsICdMc2xhc2hzbWFsbCcsICdTY2Fyb25zbWFsbCcsICdaY2Fyb25zbWFsbCcsICdEaWVyZXNpc3NtYWxsJywgJ0JyZXZlc21hbGwnLCAnQ2Fyb25zbWFsbCcsICdEb3RhY2NlbnRzbWFsbCcsICdNYWNyb25zbWFsbCcsICdmaWd1cmVkYXNoJywgJ2h5cGhlbmluZmVyaW9yJywgJ09nb25la3NtYWxsJywgJ1JpbmdzbWFsbCcsICdDZWRpbGxhc21hbGwnLCAnb25lcXVhcnRlcicsICdvbmVoYWxmJywgJ3RocmVlcXVhcnRlcnMnLCAncXVlc3Rpb25kb3duc21hbGwnLCAnb25lZWlnaHRoJywgJ3RocmVlZWlnaHRocycsICdmaXZlZWlnaHRocycsICdzZXZlbmVpZ2h0aHMnLCAnb25ldGhpcmQnLCAndHdvdGhpcmRzJywgJ3plcm9zdXBlcmlvcicsICdvbmVzdXBlcmlvcicsICd0d29zdXBlcmlvcicsICd0aHJlZXN1cGVyaW9yJywgJ2ZvdXJzdXBlcmlvcicsICdmaXZlc3VwZXJpb3InLCAnc2l4c3VwZXJpb3InLCAnc2V2ZW5zdXBlcmlvcicsICdlaWdodHN1cGVyaW9yJywgJ25pbmVzdXBlcmlvcicsICd6ZXJvaW5mZXJpb3InLCAnb25laW5mZXJpb3InLCAndHdvaW5mZXJpb3InLCAndGhyZWVpbmZlcmlvcicsICdmb3VyaW5mZXJpb3InLCAnZml2ZWluZmVyaW9yJywgJ3NpeGluZmVyaW9yJywgJ3NldmVuaW5mZXJpb3InLCAnZWlnaHRpbmZlcmlvcicsICduaW5laW5mZXJpb3InLCAnY2VudGluZmVyaW9yJywgJ2RvbGxhcmluZmVyaW9yJywgJ3BlcmlvZGluZmVyaW9yJywgJ2NvbW1haW5mZXJpb3InLCAnQWdyYXZlc21hbGwnLCAnQWFjdXRlc21hbGwnLCAnQWNpcmN1bWZsZXhzbWFsbCcsICdBdGlsZGVzbWFsbCcsICdBZGllcmVzaXNzbWFsbCcsICdBcmluZ3NtYWxsJywgJ0FFc21hbGwnLCAnQ2NlZGlsbGFzbWFsbCcsICdFZ3JhdmVzbWFsbCcsICdFYWN1dGVzbWFsbCcsICdFY2lyY3VtZmxleHNtYWxsJywgJ0VkaWVyZXNpc3NtYWxsJywgJ0lncmF2ZXNtYWxsJywgJ0lhY3V0ZXNtYWxsJywgJ0ljaXJjdW1mbGV4c21hbGwnLCAnSWRpZXJlc2lzc21hbGwnLCAnRXRoc21hbGwnLCAnTnRpbGRlc21hbGwnLCAnT2dyYXZlc21hbGwnLCAnT2FjdXRlc21hbGwnLCAnT2NpcmN1bWZsZXhzbWFsbCcsICdPdGlsZGVzbWFsbCcsICdPZGllcmVzaXNzbWFsbCcsICdPRXNtYWxsJywgJ09zbGFzaHNtYWxsJywgJ1VncmF2ZXNtYWxsJywgJ1VhY3V0ZXNtYWxsJywgJ1VjaXJjdW1mbGV4c21hbGwnLCAnVWRpZXJlc2lzc21hbGwnLCAnWWFjdXRlc21hbGwnLCAnVGhvcm5zbWFsbCcsICdZZGllcmVzaXNzbWFsbCddO1xudmFyIEV4cGVydFN1YnNldENoYXJzZXQgPSBbJy5ub3RkZWYnLCAnc3BhY2UnLCAnZG9sbGFyb2xkc3R5bGUnLCAnZG9sbGFyc3VwZXJpb3InLCAncGFyZW5sZWZ0c3VwZXJpb3InLCAncGFyZW5yaWdodHN1cGVyaW9yJywgJ3R3b2RvdGVubGVhZGVyJywgJ29uZWRvdGVubGVhZGVyJywgJ2NvbW1hJywgJ2h5cGhlbicsICdwZXJpb2QnLCAnZnJhY3Rpb24nLCAnemVyb29sZHN0eWxlJywgJ29uZW9sZHN0eWxlJywgJ3R3b29sZHN0eWxlJywgJ3RocmVlb2xkc3R5bGUnLCAnZm91cm9sZHN0eWxlJywgJ2ZpdmVvbGRzdHlsZScsICdzaXhvbGRzdHlsZScsICdzZXZlbm9sZHN0eWxlJywgJ2VpZ2h0b2xkc3R5bGUnLCAnbmluZW9sZHN0eWxlJywgJ2NvbG9uJywgJ3NlbWljb2xvbicsICdjb21tYXN1cGVyaW9yJywgJ3RocmVlcXVhcnRlcnNlbWRhc2gnLCAncGVyaW9kc3VwZXJpb3InLCAnYXN1cGVyaW9yJywgJ2JzdXBlcmlvcicsICdjZW50c3VwZXJpb3InLCAnZHN1cGVyaW9yJywgJ2VzdXBlcmlvcicsICdpc3VwZXJpb3InLCAnbHN1cGVyaW9yJywgJ21zdXBlcmlvcicsICduc3VwZXJpb3InLCAnb3N1cGVyaW9yJywgJ3JzdXBlcmlvcicsICdzc3VwZXJpb3InLCAndHN1cGVyaW9yJywgJ2ZmJywgJ2ZpJywgJ2ZsJywgJ2ZmaScsICdmZmwnLCAncGFyZW5sZWZ0aW5mZXJpb3InLCAncGFyZW5yaWdodGluZmVyaW9yJywgJ2h5cGhlbnN1cGVyaW9yJywgJ2NvbG9ubW9uZXRhcnknLCAnb25lZml0dGVkJywgJ3J1cGlhaCcsICdjZW50b2xkc3R5bGUnLCAnZmlndXJlZGFzaCcsICdoeXBoZW5pbmZlcmlvcicsICdvbmVxdWFydGVyJywgJ29uZWhhbGYnLCAndGhyZWVxdWFydGVycycsICdvbmVlaWdodGgnLCAndGhyZWVlaWdodGhzJywgJ2ZpdmVlaWdodGhzJywgJ3NldmVuZWlnaHRocycsICdvbmV0aGlyZCcsICd0d290aGlyZHMnLCAnemVyb3N1cGVyaW9yJywgJ29uZXN1cGVyaW9yJywgJ3R3b3N1cGVyaW9yJywgJ3RocmVlc3VwZXJpb3InLCAnZm91cnN1cGVyaW9yJywgJ2ZpdmVzdXBlcmlvcicsICdzaXhzdXBlcmlvcicsICdzZXZlbnN1cGVyaW9yJywgJ2VpZ2h0c3VwZXJpb3InLCAnbmluZXN1cGVyaW9yJywgJ3plcm9pbmZlcmlvcicsICdvbmVpbmZlcmlvcicsICd0d29pbmZlcmlvcicsICd0aHJlZWluZmVyaW9yJywgJ2ZvdXJpbmZlcmlvcicsICdmaXZlaW5mZXJpb3InLCAnc2l4aW5mZXJpb3InLCAnc2V2ZW5pbmZlcmlvcicsICdlaWdodGluZmVyaW9yJywgJ25pbmVpbmZlcmlvcicsICdjZW50aW5mZXJpb3InLCAnZG9sbGFyaW5mZXJpb3InLCAncGVyaW9kaW5mZXJpb3InLCAnY29tbWFpbmZlcmlvciddO1xuXG4vLyBTY3JpcHRzIGFuZCBMYW5ndWFnZXMgI1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxudmFyIExhbmdTeXNUYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gIHJlcUZlYXR1cmVJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBmZWF0dXJlQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZmVhdHVyZUluZGV4ZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdmZWF0dXJlQ291bnQnKVxufSk7XG52YXIgTGFuZ1N5c1JlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIGxhbmdTeXM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTGFuZ1N5c1RhYmxlLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIFNjcmlwdCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBkZWZhdWx0TGFuZ1N5czogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBMYW5nU3lzVGFibGUpLFxuICBjb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsYW5nU3lzUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KExhbmdTeXNSZWNvcmQsICdjb3VudCcpXG59KTtcbnZhciBTY3JpcHRSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICBzY3JpcHQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgU2NyaXB0LCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIFNjcmlwdExpc3QgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoU2NyaXB0UmVjb3JkLCByZXN0cnVjdHVyZS51aW50MTYpOyAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4vLyBGZWF0dXJlcyBhbmQgTG9va3VwcyAjXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbnZhciBGZWF0dXJlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZlYXR1cmVQYXJhbXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gcG9pbnRlclxuICBsb29rdXBDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsb29rdXBMaXN0SW5kZXhlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ2xvb2t1cENvdW50Jylcbn0pO1xudmFyIEZlYXR1cmVSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICBmZWF0dXJlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEZlYXR1cmUsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgRmVhdHVyZUxpc3QgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRmVhdHVyZVJlY29yZCwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBMb29rdXBGbGFncyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBtYXJrQXR0YWNobWVudFR5cGU6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBmbGFnczogbmV3IHJlc3RydWN0dXJlLkJpdGZpZWxkKHJlc3RydWN0dXJlLnVpbnQ4LCBbJ3JpZ2h0VG9MZWZ0JywgJ2lnbm9yZUJhc2VHbHlwaHMnLCAnaWdub3JlTGlnYXR1cmVzJywgJ2lnbm9yZU1hcmtzJywgJ3VzZU1hcmtGaWx0ZXJpbmdTZXQnXSlcbn0pO1xuZnVuY3Rpb24gTG9va3VwTGlzdChTdWJUYWJsZSkge1xuICB2YXIgTG9va3VwID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gICAgbG9va3VwVHlwZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGZsYWdzOiBMb29rdXBGbGFncyxcbiAgICBzdWJUYWJsZUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgc3ViVGFibGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBTdWJUYWJsZSksICdzdWJUYWJsZUNvdW50JyksXG4gICAgbWFya0ZpbHRlcmluZ1NldDogbmV3IHJlc3RydWN0dXJlLk9wdGlvbmFsKHJlc3RydWN0dXJlLnVpbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LmZsYWdzLmZsYWdzLnVzZU1hcmtGaWx0ZXJpbmdTZXQ7XG4gICAgfSlcbiAgfSk7XG4gIHJldHVybiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTG9va3VwKSwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbn0gLy8jIyMjIyMjIyMjIyMjIyMjI1xuLy8gQ292ZXJhZ2UgVGFibGUgI1xuLy8jIyMjIyMjIyMjIyMjIyMjI1xuXG52YXIgUmFuZ2VSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgc3RhcnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZW5kOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHN0YXJ0Q292ZXJhZ2VJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2XG59KTtcbnZhciBDb3ZlcmFnZSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIDE6IHtcbiAgICBnbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZ2x5cGhzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnZ2x5cGhDb3VudCcpXG4gIH0sXG4gIDI6IHtcbiAgICByYW5nZUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgcmFuZ2VSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoUmFuZ2VSZWNvcmQsICdyYW5nZUNvdW50JylcbiAgfVxufSk7IC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gQ2xhc3MgRGVmaW5pdGlvbiBUYWJsZSAjXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxudmFyIENsYXNzUmFuZ2VSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgc3RhcnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZW5kOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIFwiY2xhc3NcIjogcmVzdHJ1Y3R1cmUudWludDE2XG59KTtcbnZhciBDbGFzc0RlZiA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIDE6IHtcbiAgICAvLyBDbGFzcyBhcnJheVxuICAgIHN0YXJ0R2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBnbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY2xhc3NWYWx1ZUFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnZ2x5cGhDb3VudCcpXG4gIH0sXG4gIDI6IHtcbiAgICAvLyBDbGFzcyByYW5nZXNcbiAgICBjbGFzc1JhbmdlQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjbGFzc1JhbmdlUmVjb3JkOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQ2xhc3NSYW5nZVJlY29yZCwgJ2NsYXNzUmFuZ2VDb3VudCcpXG4gIH1cbn0pOyAvLyMjIyMjIyMjIyMjIyMjI1xuLy8gRGV2aWNlIFRhYmxlICNcbi8vIyMjIyMjIyMjIyMjIyMjXG5cbnZhciBEZXZpY2UgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBzdGFydFNpemUgZm9yIGhpbnRpbmcgRGV2aWNlLCBvdXRlckluZGV4IGZvciBWYXJpYXRpb25JbmRleFxuICBiOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIGVuZFNpemUgZm9yIERldmljZSwgaW5uZXJJbmRleCBmb3IgVmFyaWF0aW9uSW5kZXhcbiAgZGVsdGFGb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7IC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4vLyBDb250ZXh0dWFsIFN1YnN0aXR1dGlvbi9Qb3NpdGlvbmluZyBUYWJsZXMgI1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxudmFyIExvb2t1cFJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBzZXF1ZW5jZUluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxvb2t1cExpc3RJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2XG59KTtcbnZhciBSdWxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbG9va3VwQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgaW5wdXQ6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuZ2x5cGhDb3VudCAtIDE7XG4gIH0pLFxuICBsb29rdXBSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTG9va3VwUmVjb3JkLCAnbG9va3VwQ291bnQnKVxufSk7XG52YXIgUnVsZVNldCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFJ1bGUpLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIENsYXNzUnVsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBnbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxvb2t1cENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGNsYXNzZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuZ2x5cGhDb3VudCAtIDE7XG4gIH0pLFxuICBsb29rdXBSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTG9va3VwUmVjb3JkLCAnbG9va3VwQ291bnQnKVxufSk7XG52YXIgQ2xhc3NTZXQgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc1J1bGUpLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIENvbnRleHQgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAxOiB7XG4gICAgLy8gU2ltcGxlIGNvbnRleHRcbiAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgcnVsZVNldENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgcnVsZVNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFJ1bGVTZXQpLCAncnVsZVNldENvdW50JylcbiAgfSxcbiAgMjoge1xuICAgIC8vIENsYXNzLWJhc2VkIGNvbnRleHRcbiAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgY2xhc3NEZWY6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NEZWYpLFxuICAgIGNsYXNzU2V0Q250OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY2xhc3NTZXQ6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzU2V0KSwgJ2NsYXNzU2V0Q250JylcbiAgfSxcbiAgMzoge1xuICAgIGdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBsb29rdXBDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvdmVyYWdlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLCAnZ2x5cGhDb3VudCcpLFxuICAgIGxvb2t1cFJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShMb29rdXBSZWNvcmQsICdsb29rdXBDb3VudCcpXG4gIH1cbn0pOyAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gQ2hhaW5pbmcgQ29udGV4dHVhbCBTdWJzdGl0dXRpb24vUG9zaXRpb25pbmcgVGFibGVzICNcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbnZhciBDaGFpblJ1bGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYmFja3RyYWNrR2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBiYWNrdHJhY2s6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdiYWNrdHJhY2tHbHlwaENvdW50JyksXG4gIGlucHV0R2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBpbnB1dDogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5pbnB1dEdseXBoQ291bnQgLSAxO1xuICB9KSxcbiAgbG9va2FoZWFkR2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsb29rYWhlYWQ6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdsb29rYWhlYWRHbHlwaENvdW50JyksXG4gIGxvb2t1cENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxvb2t1cFJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShMb29rdXBSZWNvcmQsICdsb29rdXBDb3VudCcpXG59KTtcbnZhciBDaGFpblJ1bGVTZXQgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDaGFpblJ1bGUpLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIENoYWluaW5nQ29udGV4dCA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIDE6IHtcbiAgICAvLyBTaW1wbGUgY29udGV4dCBnbHlwaCBzdWJzdGl0dXRpb25cbiAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgY2hhaW5Db3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNoYWluUnVsZVNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENoYWluUnVsZVNldCksICdjaGFpbkNvdW50JylcbiAgfSxcbiAgMjoge1xuICAgIC8vIENsYXNzLWJhc2VkIGNoYWluaW5nIGNvbnRleHRcbiAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgYmFja3RyYWNrQ2xhc3NEZWY6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NEZWYpLFxuICAgIGlucHV0Q2xhc3NEZWY6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NEZWYpLFxuICAgIGxvb2thaGVhZENsYXNzRGVmOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzRGVmKSxcbiAgICBjaGFpbkNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY2hhaW5DbGFzc1NldDogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2hhaW5SdWxlU2V0KSwgJ2NoYWluQ291bnQnKVxuICB9LFxuICAzOiB7XG4gICAgLy8gQ292ZXJhZ2UtYmFzZWQgY2hhaW5pbmcgY29udGV4dFxuICAgIGJhY2t0cmFja0dseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBiYWNrdHJhY2tDb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLCAnYmFja3RyYWNrR2x5cGhDb3VudCcpLFxuICAgIGlucHV0R2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGlucHV0Q292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSwgJ2lucHV0R2x5cGhDb3VudCcpLFxuICAgIGxvb2thaGVhZEdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBsb29rYWhlYWRDb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLCAnbG9va2FoZWFkR2x5cGhDb3VudCcpLFxuICAgIGxvb2t1cENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbG9va3VwUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KExvb2t1cFJlY29yZCwgJ2xvb2t1cENvdW50JylcbiAgfVxufSk7XG5cbnZhciBfO1xuLyoqKioqKioqKioqKioqKioqKipcbiAqIFZhcmlhdGlvbiBTdG9yZSAqXG4gKioqKioqKioqKioqKioqKioqKi9cblxudmFyIEYyRE9UMTQgPSBuZXcgcmVzdHJ1Y3R1cmUuRml4ZWQoMTYsICdCRScsIDE0KTtcbnZhciBSZWdpb25BeGlzQ29vcmRpbmF0ZXMgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgc3RhcnRDb29yZDogRjJET1QxNCxcbiAgcGVha0Nvb3JkOiBGMkRPVDE0LFxuICBlbmRDb29yZDogRjJET1QxNFxufSk7XG52YXIgVmFyaWF0aW9uUmVnaW9uTGlzdCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBheGlzQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcmVnaW9uQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdmFyaWF0aW9uUmVnaW9uczogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5BcnJheShSZWdpb25BeGlzQ29vcmRpbmF0ZXMsICdheGlzQ291bnQnKSwgJ3JlZ2lvbkNvdW50Jylcbn0pO1xudmFyIERlbHRhU2V0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHNob3J0RGVsdGFzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUuaW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LnNob3J0RGVsdGFDb3VudDtcbiAgfSksXG4gIHJlZ2lvbkRlbHRhczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLmludDgsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LnJlZ2lvbkluZGV4Q291bnQgLSB0LnBhcmVudC5zaG9ydERlbHRhQ291bnQ7XG4gIH0pLFxuICBkZWx0YXM6IGZ1bmN0aW9uIGRlbHRhcyh0KSB7XG4gICAgcmV0dXJuIHQuc2hvcnREZWx0YXMuY29uY2F0KHQucmVnaW9uRGVsdGFzKTtcbiAgfVxufSk7XG52YXIgSXRlbVZhcmlhdGlvbkRhdGEgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgaXRlbUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHNob3J0RGVsdGFDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICByZWdpb25JbmRleENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHJlZ2lvbkluZGV4ZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdyZWdpb25JbmRleENvdW50JyksXG4gIGRlbHRhU2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KERlbHRhU2V0LCAnaXRlbUNvdW50Jylcbn0pO1xudmFyIEl0ZW1WYXJpYXRpb25TdG9yZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdmFyaWF0aW9uUmVnaW9uTGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBWYXJpYXRpb25SZWdpb25MaXN0KSxcbiAgdmFyaWF0aW9uRGF0YUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGl0ZW1WYXJpYXRpb25EYXRhOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBJdGVtVmFyaWF0aW9uRGF0YSksICd2YXJpYXRpb25EYXRhQ291bnQnKVxufSk7XG4vKioqKioqKioqKioqKioqKioqKioqKlxuICogRmVhdHVyZSBWYXJpYXRpb25zICpcbiAqKioqKioqKioqKioqKioqKioqKioqL1xuXG52YXIgQ29uZGl0aW9uVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAxOiAoXyA9IHtcbiAgICBheGlzSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9LCBfW1wiYXhpc0luZGV4XCJdID0gcmVzdHJ1Y3R1cmUudWludDE2LCBfLmZpbHRlclJhbmdlTWluVmFsdWUgPSBGMkRPVDE0LCBfLmZpbHRlclJhbmdlTWF4VmFsdWUgPSBGMkRPVDE0LCBfKVxufSk7XG52YXIgQ29uZGl0aW9uU2V0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGNvbmRpdGlvbkNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGNvbmRpdGlvblRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBDb25kaXRpb25UYWJsZSksICdjb25kaXRpb25Db3VudCcpXG59KTtcbnZhciBGZWF0dXJlVGFibGVTdWJzdGl0dXRpb25SZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmVhdHVyZUluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGFsdGVybmF0ZUZlYXR1cmVUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBGZWF0dXJlLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIEZlYXR1cmVUYWJsZVN1YnN0aXR1dGlvbiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBzdWJzdGl0dXRpb25Db3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzdWJzdGl0dXRpb25zOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRmVhdHVyZVRhYmxlU3Vic3RpdHV0aW9uUmVjb3JkLCAnc3Vic3RpdHV0aW9uQ291bnQnKVxufSk7XG52YXIgRmVhdHVyZVZhcmlhdGlvblJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBjb25kaXRpb25TZXQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgQ29uZGl0aW9uU2V0LCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSksXG4gIGZlYXR1cmVUYWJsZVN1YnN0aXR1dGlvbjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBGZWF0dXJlVGFibGVTdWJzdGl0dXRpb24sIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgRmVhdHVyZVZhcmlhdGlvbnMgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbWFqb3JWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1pbm9yVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBmZWF0dXJlVmFyaWF0aW9uUmVjb3JkQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgZmVhdHVyZVZhcmlhdGlvblJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShGZWF0dXJlVmFyaWF0aW9uUmVjb3JkLCAnZmVhdHVyZVZhcmlhdGlvblJlY29yZENvdW50Jylcbn0pO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSQxKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuLy8gb3RoZXJ3aXNlIGRlbGVnYXRlcyB0byB0aGUgcHJvdmlkZWQgdHlwZS5cblxudmFyIFByZWRlZmluZWRPcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFByZWRlZmluZWRPcChwcmVkZWZpbmVkT3BzLCB0eXBlKSB7XG4gICAgdGhpcy5wcmVkZWZpbmVkT3BzID0gcHJlZGVmaW5lZE9wcztcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFByZWRlZmluZWRPcC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCwgb3BlcmFuZHMpIHtcbiAgICBpZiAodGhpcy5wcmVkZWZpbmVkT3BzW29wZXJhbmRzWzBdXSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJlZGVmaW5lZE9wc1tvcGVyYW5kc1swXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHlwZS5kZWNvZGUoc3RyZWFtLCBwYXJlbnQsIG9wZXJhbmRzKTtcbiAgfTtcblxuICBfcHJvdG8uc2l6ZSA9IGZ1bmN0aW9uIHNpemUodmFsdWUsIGN0eCkge1xuICAgIHJldHVybiB0aGlzLnR5cGUuc2l6ZSh2YWx1ZSwgY3R4KTtcbiAgfTtcblxuICBfcHJvdG8uZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0cmVhbSwgdmFsdWUsIGN0eCkge1xuICAgIHZhciBpbmRleCA9IHRoaXMucHJlZGVmaW5lZE9wcy5pbmRleE9mKHZhbHVlKTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50eXBlLmVuY29kZShzdHJlYW0sIHZhbHVlLCBjdHgpO1xuICB9O1xuXG4gIHJldHVybiBQcmVkZWZpbmVkT3A7XG59KCk7XG5cbnZhciBDRkZFbmNvZGluZ1ZlcnNpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9yJE51bWJlcikge1xuICBfaW5oZXJpdHNMb29zZSQxKENGRkVuY29kaW5nVmVyc2lvbiwgX3IkTnVtYmVyKTtcblxuICBmdW5jdGlvbiBDRkZFbmNvZGluZ1ZlcnNpb24oKSB7XG4gICAgcmV0dXJuIF9yJE51bWJlci5jYWxsKHRoaXMsICdVSW50OCcpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvMiA9IENGRkVuY29kaW5nVmVyc2lvbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMi5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtKSB7XG4gICAgcmV0dXJuIHJlc3RydWN0dXJlLnVpbnQ4LmRlY29kZShzdHJlYW0pICYgMHg3ZjtcbiAgfTtcblxuICByZXR1cm4gQ0ZGRW5jb2RpbmdWZXJzaW9uO1xufShyZXN0cnVjdHVyZS5OdW1iZXIpO1xuXG52YXIgUmFuZ2UxID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZpcnN0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG5MZWZ0OiByZXN0cnVjdHVyZS51aW50OFxufSk7XG52YXIgUmFuZ2UyID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZpcnN0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG5MZWZ0OiByZXN0cnVjdHVyZS51aW50MTZcbn0pO1xudmFyIENGRkN1c3RvbUVuY29kaW5nID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChuZXcgQ0ZGRW5jb2RpbmdWZXJzaW9uKCksIHtcbiAgMDoge1xuICAgIG5Db2RlczogcmVzdHJ1Y3R1cmUudWludDgsXG4gICAgY29kZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgJ25Db2RlcycpXG4gIH0sXG4gIDE6IHtcbiAgICBuUmFuZ2VzOiByZXN0cnVjdHVyZS51aW50OCxcbiAgICByYW5nZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShSYW5nZTEsICduUmFuZ2VzJylcbiAgfSAvLyBUT0RPOiBzdXBwbGVtZW50P1xuXG59KTtcbnZhciBDRkZFbmNvZGluZyA9IG5ldyBQcmVkZWZpbmVkT3AoW1N0YW5kYXJkRW5jb2RpbmcsIEV4cGVydEVuY29kaW5nXSwgbmV3IENGRlBvaW50ZXIoQ0ZGQ3VzdG9tRW5jb2RpbmcsIHtcbiAgbGF6eTogdHJ1ZVxufSkpOyAvLyBEZWNvZGVzIGFuIGFycmF5IG9mIHJhbmdlcyB1bnRpbCB0aGUgdG90YWxcbi8vIGxlbmd0aCBpcyBlcXVhbCB0byB0aGUgcHJvdmlkZWQgbGVuZ3RoLlxuXG52YXIgUmFuZ2VBcnJheSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX3IkQXJyYXkpIHtcbiAgX2luaGVyaXRzTG9vc2UkMShSYW5nZUFycmF5LCBfciRBcnJheSk7XG5cbiAgZnVuY3Rpb24gUmFuZ2VBcnJheSgpIHtcbiAgICByZXR1cm4gX3IkQXJyYXkuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90bzMgPSBSYW5nZUFycmF5LnByb3RvdHlwZTtcblxuICBfcHJvdG8zLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCkge1xuICAgIHZhciBsZW5ndGggPSB1dGlsc18xKHRoaXMubGVuZ3RoLCBzdHJlYW0sIHBhcmVudCk7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgcmVzID0gW107XG5cbiAgICB3aGlsZSAoY291bnQgPCBsZW5ndGgpIHtcbiAgICAgIHZhciByYW5nZSA9IHRoaXMudHlwZS5kZWNvZGUoc3RyZWFtLCBwYXJlbnQpO1xuICAgICAgcmFuZ2Uub2Zmc2V0ID0gY291bnQ7XG4gICAgICBjb3VudCArPSByYW5nZS5uTGVmdCArIDE7XG4gICAgICByZXMucHVzaChyYW5nZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICByZXR1cm4gUmFuZ2VBcnJheTtcbn0ocmVzdHJ1Y3R1cmUuQXJyYXkpO1xuXG52YXIgQ0ZGQ3VzdG9tQ2hhcnNldCA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDgsIHtcbiAgMDoge1xuICAgIGdseXBoczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LnBhcmVudC5DaGFyU3RyaW5ncy5sZW5ndGggLSAxO1xuICAgIH0pXG4gIH0sXG4gIDE6IHtcbiAgICByYW5nZXM6IG5ldyBSYW5nZUFycmF5KFJhbmdlMSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LnBhcmVudC5DaGFyU3RyaW5ncy5sZW5ndGggLSAxO1xuICAgIH0pXG4gIH0sXG4gIDI6IHtcbiAgICByYW5nZXM6IG5ldyBSYW5nZUFycmF5KFJhbmdlMiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LnBhcmVudC5DaGFyU3RyaW5ncy5sZW5ndGggLSAxO1xuICAgIH0pXG4gIH1cbn0pO1xudmFyIENGRkNoYXJzZXQgPSBuZXcgUHJlZGVmaW5lZE9wKFtJU09BZG9iZUNoYXJzZXQsIEV4cGVydENoYXJzZXQsIEV4cGVydFN1YnNldENoYXJzZXRdLCBuZXcgQ0ZGUG9pbnRlcihDRkZDdXN0b21DaGFyc2V0LCB7XG4gIGxhenk6IHRydWVcbn0pKTtcbnZhciBGRFJhbmdlMyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmaXJzdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBmZDogcmVzdHJ1Y3R1cmUudWludDhcbn0pO1xudmFyIEZEUmFuZ2U0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZpcnN0OiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGZkOiByZXN0cnVjdHVyZS51aW50MTZcbn0pO1xudmFyIEZEU2VsZWN0ID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50OCwge1xuICAwOiB7XG4gICAgZmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5wYXJlbnQuQ2hhclN0cmluZ3MubGVuZ3RoO1xuICAgIH0pXG4gIH0sXG4gIDM6IHtcbiAgICBuUmFuZ2VzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgcmFuZ2VzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRkRSYW5nZTMsICduUmFuZ2VzJyksXG4gICAgc2VudGluZWw6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9LFxuICA0OiB7XG4gICAgblJhbmdlczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIHJhbmdlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEZEUmFuZ2U0LCAnblJhbmdlcycpLFxuICAgIHNlbnRpbmVsOiByZXN0cnVjdHVyZS51aW50MzJcbiAgfVxufSk7XG52YXIgcHRyID0gbmV3IENGRlBvaW50ZXIoQ0ZGUHJpdmF0ZURpY3QpO1xuXG52YXIgQ0ZGUHJpdmF0ZU9wID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ0ZGUHJpdmF0ZU9wKCkge31cblxuICB2YXIgX3Byb3RvNCA9IENGRlByaXZhdGVPcC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvNC5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQsIG9wZXJhbmRzKSB7XG4gICAgcGFyZW50Lmxlbmd0aCA9IG9wZXJhbmRzWzBdO1xuICAgIHJldHVybiBwdHIuZGVjb2RlKHN0cmVhbSwgcGFyZW50LCBbb3BlcmFuZHNbMV1dKTtcbiAgfTtcblxuICBfcHJvdG80LnNpemUgPSBmdW5jdGlvbiBzaXplKGRpY3QsIGN0eCkge1xuICAgIHJldHVybiBbQ0ZGUHJpdmF0ZURpY3Quc2l6ZShkaWN0LCBjdHgsIGZhbHNlKSwgcHRyLnNpemUoZGljdCwgY3R4KVswXV07XG4gIH07XG5cbiAgX3Byb3RvNC5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyZWFtLCBkaWN0LCBjdHgpIHtcbiAgICByZXR1cm4gW0NGRlByaXZhdGVEaWN0LnNpemUoZGljdCwgY3R4LCBmYWxzZSksIHB0ci5lbmNvZGUoc3RyZWFtLCBkaWN0LCBjdHgpWzBdXTtcbiAgfTtcblxuICByZXR1cm4gQ0ZGUHJpdmF0ZU9wO1xufSgpO1xuXG52YXIgRm9udERpY3QgPSBuZXcgQ0ZGRGljdChbLy8ga2V5ICAgICAgIG5hbWUgICAgICAgICAgICAgICAgICAgdHlwZShzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRcblsxOCwgJ1ByaXZhdGUnLCBuZXcgQ0ZGUHJpdmF0ZU9wKCksIG51bGxdLCBbWzEyLCAzOF0sICdGb250TmFtZScsICdzaWQnLCBudWxsXV0pO1xudmFyIENGRlRvcERpY3QgPSBuZXcgQ0ZGRGljdChbLy8ga2V5ICAgICAgIG5hbWUgICAgICAgICAgICAgICAgICAgdHlwZShzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRcbltbMTIsIDMwXSwgJ1JPUycsIFsnc2lkJywgJ3NpZCcsICdudW1iZXInXSwgbnVsbF0sIFswLCAndmVyc2lvbicsICdzaWQnLCBudWxsXSwgWzEsICdOb3RpY2UnLCAnc2lkJywgbnVsbF0sIFtbMTIsIDBdLCAnQ29weXJpZ2h0JywgJ3NpZCcsIG51bGxdLCBbMiwgJ0Z1bGxOYW1lJywgJ3NpZCcsIG51bGxdLCBbMywgJ0ZhbWlseU5hbWUnLCAnc2lkJywgbnVsbF0sIFs0LCAnV2VpZ2h0JywgJ3NpZCcsIG51bGxdLCBbWzEyLCAxXSwgJ2lzRml4ZWRQaXRjaCcsICdib29sZWFuJywgZmFsc2VdLCBbWzEyLCAyXSwgJ0l0YWxpY0FuZ2xlJywgJ251bWJlcicsIDBdLCBbWzEyLCAzXSwgJ1VuZGVybGluZVBvc2l0aW9uJywgJ251bWJlcicsIC0xMDBdLCBbWzEyLCA0XSwgJ1VuZGVybGluZVRoaWNrbmVzcycsICdudW1iZXInLCA1MF0sIFtbMTIsIDVdLCAnUGFpbnRUeXBlJywgJ251bWJlcicsIDBdLCBbWzEyLCA2XSwgJ0NoYXJzdHJpbmdUeXBlJywgJ251bWJlcicsIDJdLCBbWzEyLCA3XSwgJ0ZvbnRNYXRyaXgnLCAnYXJyYXknLCBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXV0sIFsxMywgJ1VuaXF1ZUlEJywgJ251bWJlcicsIG51bGxdLCBbNSwgJ0ZvbnRCQm94JywgJ2FycmF5JywgWzAsIDAsIDAsIDBdXSwgW1sxMiwgOF0sICdTdHJva2VXaWR0aCcsICdudW1iZXInLCAwXSwgWzE0LCAnWFVJRCcsICdhcnJheScsIG51bGxdLCBbMTUsICdjaGFyc2V0JywgQ0ZGQ2hhcnNldCwgSVNPQWRvYmVDaGFyc2V0XSwgWzE2LCAnRW5jb2RpbmcnLCBDRkZFbmNvZGluZywgU3RhbmRhcmRFbmNvZGluZ10sIFsxNywgJ0NoYXJTdHJpbmdzJywgbmV3IENGRlBvaW50ZXIobmV3IENGRkluZGV4KCkpLCBudWxsXSwgWzE4LCAnUHJpdmF0ZScsIG5ldyBDRkZQcml2YXRlT3AoKSwgbnVsbF0sIFtbMTIsIDIwXSwgJ1N5bnRoZXRpY0Jhc2UnLCAnbnVtYmVyJywgbnVsbF0sIFtbMTIsIDIxXSwgJ1Bvc3RTY3JpcHQnLCAnc2lkJywgbnVsbF0sIFtbMTIsIDIyXSwgJ0Jhc2VGb250TmFtZScsICdzaWQnLCBudWxsXSwgW1sxMiwgMjNdLCAnQmFzZUZvbnRCbGVuZCcsICdkZWx0YScsIG51bGxdLCAvLyBDSUQgZm9udCBzcGVjaWZpY1xuW1sxMiwgMzFdLCAnQ0lERm9udFZlcnNpb24nLCAnbnVtYmVyJywgMF0sIFtbMTIsIDMyXSwgJ0NJREZvbnRSZXZpc2lvbicsICdudW1iZXInLCAwXSwgW1sxMiwgMzNdLCAnQ0lERm9udFR5cGUnLCAnbnVtYmVyJywgMF0sIFtbMTIsIDM0XSwgJ0NJRENvdW50JywgJ251bWJlcicsIDg3MjBdLCBbWzEyLCAzNV0sICdVSURCYXNlJywgJ251bWJlcicsIG51bGxdLCBbWzEyLCAzN10sICdGRFNlbGVjdCcsIG5ldyBDRkZQb2ludGVyKEZEU2VsZWN0KSwgbnVsbF0sIFtbMTIsIDM2XSwgJ0ZEQXJyYXknLCBuZXcgQ0ZGUG9pbnRlcihuZXcgQ0ZGSW5kZXgoRm9udERpY3QpKSwgbnVsbF0sIFtbMTIsIDM4XSwgJ0ZvbnROYW1lJywgJ3NpZCcsIG51bGxdXSk7XG52YXIgVmFyaWF0aW9uU3RvcmUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGl0ZW1WYXJpYXRpb25TdG9yZTogSXRlbVZhcmlhdGlvblN0b3JlXG59KTtcbnZhciBDRkYyVG9wRGljdCA9IG5ldyBDRkZEaWN0KFtbWzEyLCA3XSwgJ0ZvbnRNYXRyaXgnLCAnYXJyYXknLCBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXV0sIFsxNywgJ0NoYXJTdHJpbmdzJywgbmV3IENGRlBvaW50ZXIobmV3IENGRkluZGV4KCkpLCBudWxsXSwgW1sxMiwgMzddLCAnRkRTZWxlY3QnLCBuZXcgQ0ZGUG9pbnRlcihGRFNlbGVjdCksIG51bGxdLCBbWzEyLCAzNl0sICdGREFycmF5JywgbmV3IENGRlBvaW50ZXIobmV3IENGRkluZGV4KEZvbnREaWN0KSksIG51bGxdLCBbMjQsICd2c3RvcmUnLCBuZXcgQ0ZGUG9pbnRlcihWYXJpYXRpb25TdG9yZSksIG51bGxdLCBbMjUsICdtYXhzdGFjaycsICdudW1iZXInLCAxOTNdXSk7XG52YXIgQ0ZGVG9wID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS5maXhlZDE2LCB7XG4gIDE6IHtcbiAgICBoZHJTaXplOiByZXN0cnVjdHVyZS51aW50OCxcbiAgICBvZmZTaXplOiByZXN0cnVjdHVyZS51aW50OCxcbiAgICBuYW1lSW5kZXg6IG5ldyBDRkZJbmRleChuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKCdsZW5ndGgnKSksXG4gICAgdG9wRGljdEluZGV4OiBuZXcgQ0ZGSW5kZXgoQ0ZGVG9wRGljdCksXG4gICAgc3RyaW5nSW5kZXg6IG5ldyBDRkZJbmRleChuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKCdsZW5ndGgnKSksXG4gICAgZ2xvYmFsU3VickluZGV4OiBuZXcgQ0ZGSW5kZXgoKVxuICB9LFxuICAyOiB7XG4gICAgaGRyU2l6ZTogcmVzdHJ1Y3R1cmUudWludDgsXG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgdG9wRGljdDogQ0ZGMlRvcERpY3QsXG4gICAgZ2xvYmFsU3VickluZGV4OiBuZXcgQ0ZGSW5kZXgoKVxuICB9XG59KTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG52YXIgQ0ZGRm9udCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENGRkZvbnQoc3RyZWFtKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5kZWNvZGUoKTtcbiAgfVxuXG4gIENGRkZvbnQuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSkge1xuICAgIHJldHVybiBuZXcgQ0ZGRm9udChzdHJlYW0pO1xuICB9O1xuXG4gIHZhciBfcHJvdG8gPSBDRkZGb250LnByb3RvdHlwZTtcblxuICBfcHJvdG8uZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKCkge1xuICAgIHZhciBzdGFydCA9IHRoaXMuc3RyZWFtLnBvcztcbiAgICB2YXIgdG9wID0gQ0ZGVG9wLmRlY29kZSh0aGlzLnN0cmVhbSk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdG9wKSB7XG4gICAgICB2YXIgdmFsID0gdG9wW2tleV07XG4gICAgICB0aGlzW2tleV0gPSB2YWw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmVyc2lvbiA8IDIpIHtcbiAgICAgIGlmICh0aGlzLnRvcERpY3RJbmRleC5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT25seSBhIHNpbmdsZSBmb250IGlzIGFsbG93ZWQgaW4gQ0ZGXCIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRvcERpY3QgPSB0aGlzLnRvcERpY3RJbmRleFswXTtcbiAgICB9XG5cbiAgICB0aGlzLmlzQ0lERm9udCA9IHRoaXMudG9wRGljdC5ST1MgIT0gbnVsbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBfcHJvdG8uc3RyaW5nID0gZnVuY3Rpb24gc3RyaW5nKHNpZCkge1xuICAgIGlmICh0aGlzLnZlcnNpb24gPj0gMikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNpZCA8IHN0YW5kYXJkU3RyaW5ncy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBzdGFuZGFyZFN0cmluZ3Nbc2lkXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpbmdJbmRleFtzaWQgLSBzdGFuZGFyZFN0cmluZ3MubGVuZ3RoXTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0Q2hhclN0cmluZyA9IGZ1bmN0aW9uIGdldENoYXJTdHJpbmcoZ2x5cGgpIHtcbiAgICB0aGlzLnN0cmVhbS5wb3MgPSB0aGlzLnRvcERpY3QuQ2hhclN0cmluZ3NbZ2x5cGhdLm9mZnNldDtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW0ucmVhZEJ1ZmZlcih0aGlzLnRvcERpY3QuQ2hhclN0cmluZ3NbZ2x5cGhdLmxlbmd0aCk7XG4gIH07XG5cbiAgX3Byb3RvLmdldEdseXBoTmFtZSA9IGZ1bmN0aW9uIGdldEdseXBoTmFtZShnaWQpIHtcbiAgICAvLyBDRkYyIGdseXBoIG5hbWVzIGFyZSBpbiB0aGUgcG9zdCB0YWJsZS5cbiAgICBpZiAodGhpcy52ZXJzaW9uID49IDIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8gQ0lELWtleWVkIGZvbnRzIGRvbid0IGhhdmUgZ2x5cGggbmFtZXNcblxuXG4gICAgaWYgKHRoaXMuaXNDSURGb250KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY2hhcnNldCA9IHRoaXMudG9wRGljdC5jaGFyc2V0O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhcnNldCkpIHtcbiAgICAgIHJldHVybiBjaGFyc2V0W2dpZF07XG4gICAgfVxuXG4gICAgaWYgKGdpZCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcubm90ZGVmJztcbiAgICB9XG5cbiAgICBnaWQgLT0gMTtcblxuICAgIHN3aXRjaCAoY2hhcnNldC52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZyhjaGFyc2V0LmdseXBoc1tnaWRdKTtcblxuICAgICAgY2FzZSAxOlxuICAgICAgY2FzZSAyOlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzZXQucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHJhbmdlID0gY2hhcnNldC5yYW5nZXNbaV07XG5cbiAgICAgICAgICBpZiAocmFuZ2Uub2Zmc2V0IDw9IGdpZCAmJiBnaWQgPD0gcmFuZ2Uub2Zmc2V0ICsgcmFuZ2UubkxlZnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZyhyYW5nZS5maXJzdCArIChnaWQgLSByYW5nZS5vZmZzZXQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBfcHJvdG8uZmRGb3JHbHlwaCA9IGZ1bmN0aW9uIGZkRm9yR2x5cGgoZ2lkKSB7XG4gICAgaWYgKCF0aGlzLnRvcERpY3QuRkRTZWxlY3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy50b3BEaWN0LkZEU2VsZWN0LnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIHRoaXMudG9wRGljdC5GRFNlbGVjdC5mZHNbZ2lkXTtcblxuICAgICAgY2FzZSAzOlxuICAgICAgY2FzZSA0OlxuICAgICAgICB2YXIgcmFuZ2VzID0gdGhpcy50b3BEaWN0LkZEU2VsZWN0LnJhbmdlcztcbiAgICAgICAgdmFyIGxvdyA9IDA7XG4gICAgICAgIHZhciBoaWdoID0gcmFuZ2VzLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7XG4gICAgICAgICAgdmFyIG1pZCA9IGxvdyArIGhpZ2ggPj4gMTtcblxuICAgICAgICAgIGlmIChnaWQgPCByYW5nZXNbbWlkXS5maXJzdCkge1xuICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7XG4gICAgICAgICAgfSBlbHNlIGlmIChtaWQgPCBoaWdoICYmIGdpZCA+IHJhbmdlc1ttaWQgKyAxXS5maXJzdCkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJhbmdlc1ttaWRdLmZkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIEZEU2VsZWN0IHZlcnNpb246IFwiICsgdGhpcy50b3BEaWN0LkZEU2VsZWN0LnZlcnNpb24pO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucHJpdmF0ZURpY3RGb3JHbHlwaCA9IGZ1bmN0aW9uIHByaXZhdGVEaWN0Rm9yR2x5cGgoZ2lkKSB7XG4gICAgaWYgKHRoaXMudG9wRGljdC5GRFNlbGVjdCkge1xuICAgICAgdmFyIGZkID0gdGhpcy5mZEZvckdseXBoKGdpZCk7XG5cbiAgICAgIGlmICh0aGlzLnRvcERpY3QuRkRBcnJheVtmZF0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9wRGljdC5GREFycmF5W2ZkXS5Qcml2YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52ZXJzaW9uIDwgMikge1xuICAgICAgcmV0dXJuIHRoaXMudG9wRGljdC5Qcml2YXRlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvcERpY3QuRkRBcnJheVswXS5Qcml2YXRlO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhDRkZGb250LCBbe1xuICAgIGtleTogXCJwb3N0c2NyaXB0TmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMudmVyc2lvbiA8IDIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZUluZGV4WzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZnVsbE5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmluZyh0aGlzLnRvcERpY3QuRnVsbE5hbWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmYW1pbHlOYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJpbmcodGhpcy50b3BEaWN0LkZhbWlseU5hbWUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDRkZGb250O1xufSgpO1xuXG52YXIgVmVydGljYWxPcmlnaW4gPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZ2x5cGhJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB2ZXJ0T3JpZ2luWTogcmVzdHJ1Y3R1cmUuaW50MTZcbn0pO1xudmFyIFZPUkcgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbWFqb3JWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1pbm9yVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBkZWZhdWx0VmVydE9yaWdpblk6IHJlc3RydWN0dXJlLmludDE2LFxuICBudW1WZXJ0T3JpZ2luWU1ldHJpY3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWV0cmljczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFZlcnRpY2FsT3JpZ2luLCAnbnVtVmVydE9yaWdpbllNZXRyaWNzJylcbn0pO1xuXG52YXIgQmlnTWV0cmljcyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBoZWlnaHQ6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICB3aWR0aDogcmVzdHJ1Y3R1cmUudWludDgsXG4gIGhvcmlCZWFyaW5nWDogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgaG9yaUJlYXJpbmdZOiByZXN0cnVjdHVyZS5pbnQ4LFxuICBob3JpQWR2YW5jZTogcmVzdHJ1Y3R1cmUudWludDgsXG4gIHZlcnRCZWFyaW5nWDogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgdmVydEJlYXJpbmdZOiByZXN0cnVjdHVyZS5pbnQ4LFxuICB2ZXJ0QWR2YW5jZTogcmVzdHJ1Y3R1cmUudWludDhcbn0pO1xudmFyIFNtYWxsTWV0cmljcyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBoZWlnaHQ6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICB3aWR0aDogcmVzdHJ1Y3R1cmUudWludDgsXG4gIGJlYXJpbmdYOiByZXN0cnVjdHVyZS5pbnQ4LFxuICBiZWFyaW5nWTogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgYWR2YW5jZTogcmVzdHJ1Y3R1cmUudWludDhcbn0pO1xudmFyIEVCRFRDb21wb25lbnQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZ2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgeE9mZnNldDogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgeU9mZnNldDogcmVzdHJ1Y3R1cmUuaW50OFxufSk7XG5cbnZhciBCeXRlQWxpZ25lZCA9IGZ1bmN0aW9uIEJ5dGVBbGlnbmVkKCkge307XG5cbnZhciBCaXRBbGlnbmVkID0gZnVuY3Rpb24gQml0QWxpZ25lZCgpIHt9O1xuXG52YXIgZ2x5cGggPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KCd2ZXJzaW9uJywge1xuICAxOiB7XG4gICAgbWV0cmljczogU21hbGxNZXRyaWNzLFxuICAgIGRhdGE6IEJ5dGVBbGlnbmVkXG4gIH0sXG4gIDI6IHtcbiAgICBtZXRyaWNzOiBTbWFsbE1ldHJpY3MsXG4gICAgZGF0YTogQml0QWxpZ25lZFxuICB9LFxuICAvLyBmb3JtYXQgMyBpcyBkZXByZWNhdGVkXG4gIC8vIGZvcm1hdCA0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgTWljcm9zb2Z0XG4gIDU6IHtcbiAgICBkYXRhOiBCaXRBbGlnbmVkXG4gIH0sXG4gIDY6IHtcbiAgICBtZXRyaWNzOiBCaWdNZXRyaWNzLFxuICAgIGRhdGE6IEJ5dGVBbGlnbmVkXG4gIH0sXG4gIDc6IHtcbiAgICBtZXRyaWNzOiBCaWdNZXRyaWNzLFxuICAgIGRhdGE6IEJpdEFsaWduZWRcbiAgfSxcbiAgODoge1xuICAgIG1ldHJpY3M6IFNtYWxsTWV0cmljcyxcbiAgICBwYWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50OCksXG4gICAgbnVtQ29tcG9uZW50czogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvbXBvbmVudHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShFQkRUQ29tcG9uZW50LCAnbnVtQ29tcG9uZW50cycpXG4gIH0sXG4gIDk6IHtcbiAgICBtZXRyaWNzOiBCaWdNZXRyaWNzLFxuICAgIHBhZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQ4KSxcbiAgICBudW1Db21wb25lbnRzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY29tcG9uZW50czogbmV3IHJlc3RydWN0dXJlLkFycmF5KEVCRFRDb21wb25lbnQsICdudW1Db21wb25lbnRzJylcbiAgfSxcbiAgMTc6IHtcbiAgICBtZXRyaWNzOiBTbWFsbE1ldHJpY3MsXG4gICAgZGF0YUxlbjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGRhdGE6IG5ldyByZXN0cnVjdHVyZS5CdWZmZXIoJ2RhdGFMZW4nKVxuICB9LFxuICAxODoge1xuICAgIG1ldHJpY3M6IEJpZ01ldHJpY3MsXG4gICAgZGF0YUxlbjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGRhdGE6IG5ldyByZXN0cnVjdHVyZS5CdWZmZXIoJ2RhdGFMZW4nKVxuICB9LFxuICAxOToge1xuICAgIGRhdGFMZW46IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBkYXRhOiBuZXcgcmVzdHJ1Y3R1cmUuQnVmZmVyKCdkYXRhTGVuJylcbiAgfVxufSk7XG5cbnZhciBTQml0TGluZU1ldHJpY3MgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYXNjZW5kZXI6IHJlc3RydWN0dXJlLmludDgsXG4gIGRlc2NlbmRlcjogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgd2lkdGhNYXg6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBjYXJldFNsb3BlTnVtZXJhdG9yOiByZXN0cnVjdHVyZS5pbnQ4LFxuICBjYXJldFNsb3BlRGVub21pbmF0b3I6IHJlc3RydWN0dXJlLmludDgsXG4gIGNhcmV0T2Zmc2V0OiByZXN0cnVjdHVyZS5pbnQ4LFxuICBtaW5PcmlnaW5TQjogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgbWluQWR2YW5jZVNCOiByZXN0cnVjdHVyZS5pbnQ4LFxuICBtYXhCZWZvcmVCTDogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgbWluQWZ0ZXJCTDogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgcGFkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUuaW50OCwgMilcbn0pO1xudmFyIENvZGVPZmZzZXRQYWlyID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGdseXBoQ29kZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBvZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7XG52YXIgSW5kZXhTdWJ0YWJsZSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIGhlYWRlcjoge1xuICAgIGltYWdlRm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgaW1hZ2VEYXRhT2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MzJcbiAgfSxcbiAgMToge1xuICAgIG9mZnNldEFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDMyLCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQucGFyZW50Lmxhc3RHbHlwaEluZGV4IC0gdC5wYXJlbnQuZmlyc3RHbHlwaEluZGV4ICsgMTtcbiAgICB9KVxuICB9LFxuICAyOiB7XG4gICAgaW1hZ2VTaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgYmlnTWV0cmljczogQmlnTWV0cmljc1xuICB9LFxuICAzOiB7XG4gICAgb2Zmc2V0QXJyYXk6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5wYXJlbnQubGFzdEdseXBoSW5kZXggLSB0LnBhcmVudC5maXJzdEdseXBoSW5kZXggKyAxO1xuICAgIH0pXG4gIH0sXG4gIDQ6IHtcbiAgICBudW1HbHlwaHM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBnbHlwaEFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQ29kZU9mZnNldFBhaXIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5udW1HbHlwaHMgKyAxO1xuICAgIH0pXG4gIH0sXG4gIDU6IHtcbiAgICBpbWFnZVNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBiaWdNZXRyaWNzOiBCaWdNZXRyaWNzLFxuICAgIG51bUdseXBoczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGdseXBoQ29kZUFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnbnVtR2x5cGhzJylcbiAgfVxufSk7XG52YXIgSW5kZXhTdWJ0YWJsZUFycmF5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZpcnN0R2x5cGhJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsYXN0R2x5cGhJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzdWJ0YWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBJbmRleFN1YnRhYmxlKVxufSk7XG52YXIgQml0bWFwU2l6ZVRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGluZGV4U3ViVGFibGVBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoSW5kZXhTdWJ0YWJsZUFycmF5LCAxKSwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pLFxuICBpbmRleFRhYmxlc1NpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbnVtYmVyT2ZJbmRleFN1YlRhYmxlczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBjb2xvclJlZjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBob3JpOiBTQml0TGluZU1ldHJpY3MsXG4gIHZlcnQ6IFNCaXRMaW5lTWV0cmljcyxcbiAgc3RhcnRHbHlwaEluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGVuZEdseXBoSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcHBlbVg6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBwcGVtWTogcmVzdHJ1Y3R1cmUudWludDgsXG4gIGJpdERlcHRoOiByZXN0cnVjdHVyZS51aW50OCxcbiAgZmxhZ3M6IG5ldyByZXN0cnVjdHVyZS5CaXRmaWVsZChyZXN0cnVjdHVyZS51aW50OCwgWydob3Jpem9udGFsJywgJ3ZlcnRpY2FsJ10pXG59KTtcbnZhciBFQkxDID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgLy8gMHgwMDAyMDAwMFxuICBudW1TaXplczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBzaXplczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEJpdG1hcFNpemVUYWJsZSwgJ251bVNpemVzJylcbn0pO1xuXG52YXIgSW1hZ2VUYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBwcGVtOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHJlc29sdXRpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgaW1hZ2VPZmZzZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCAndm9pZCcpLCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5wYXJlbnQubWF4cC5udW1HbHlwaHMgKyAxO1xuICB9KVxufSk7IC8vIFRoaXMgaXMgdGhlIEFwcGxlIHNiaXggdGFibGUsIHVzZWQgYnkgdGhlIFwiQXBwbGUgQ29sb3IgRW1vamlcIiBmb250LlxuLy8gSXQgaW5jbHVkZXMgc2V2ZXJhbCBpbWFnZSB0YWJsZXMgd2l0aCBpbWFnZXMgZm9yIGVhY2ggYml0bWFwIGdseXBoXG4vLyBvZiBzZXZlcmFsIGRpZmZlcmVudCBzaXplcy5cblxudmFyIHNiaXggPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBmbGFnczogbmV3IHJlc3RydWN0dXJlLkJpdGZpZWxkKHJlc3RydWN0dXJlLnVpbnQxNiwgWydyZW5kZXJPdXRsaW5lcyddKSxcbiAgbnVtSW1nVGFibGVzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGltYWdlVGFibGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBJbWFnZVRhYmxlKSwgJ251bUltZ1RhYmxlcycpXG59KTtcblxudmFyIExheWVyUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGdpZDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBHbHlwaCBJRCBvZiBsYXllciBnbHlwaCAobXVzdCBiZSBpbiB6LW9yZGVyIGZyb20gYm90dG9tIHRvIHRvcCkuXG4gIHBhbGV0dGVJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2IC8vIEluZGV4IHZhbHVlIHRvIHVzZSBpbiB0aGUgYXBwcm9wcmlhdGUgcGFsZXR0ZS4gVGhpcyB2YWx1ZSBtdXN0XG5cbn0pOyAvLyBiZSBsZXNzIHRoYW4gbnVtUGFsZXR0ZUVudHJpZXMgaW4gdGhlIENQQUwgdGFibGUsIGV4Y2VwdCBmb3Jcbi8vIHRoZSBzcGVjaWFsIGNhc2Ugbm90ZWQgYmVsb3cuIEVhY2ggcGFsZXR0ZSBlbnRyeSBpcyAxNiBiaXRzLlxuLy8gQSBwYWxldHRlIGluZGV4IG9mIDB4RkZGRiBpcyBhIHNwZWNpYWwgY2FzZSBpbmRpY2F0aW5nIHRoYXRcbi8vIHRoZSB0ZXh0IGZvcmVncm91bmQgY29sb3Igc2hvdWxkIGJlIHVzZWQuXG5cbnZhciBCYXNlR2x5cGhSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZ2lkOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIEdseXBoIElEIG9mIHJlZmVyZW5jZSBnbHlwaC4gVGhpcyBnbHlwaCBpcyBmb3IgcmVmZXJlbmNlIG9ubHlcbiAgLy8gYW5kIGlzIG5vdCByZW5kZXJlZCBmb3IgY29sb3IuXG4gIGZpcnN0TGF5ZXJJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBJbmRleCAoZnJvbSBiZWdpbm5pbmcgb2YgdGhlIExheWVyIFJlY29yZHMpIHRvIHRoZSBsYXllciByZWNvcmQuXG4gIC8vIFRoZXJlIHdpbGwgYmUgbnVtTGF5ZXJzIGNvbnNlY3V0aXZlIGVudHJpZXMgZm9yIHRoaXMgYmFzZSBnbHlwaC5cbiAgbnVtTGF5ZXJzOiByZXN0cnVjdHVyZS51aW50MTZcbn0pO1xudmFyIENPTFIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBudW1CYXNlR2x5cGhSZWNvcmRzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGJhc2VHbHlwaFJlY29yZDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQmFzZUdseXBoUmVjb3JkLCAnbnVtQmFzZUdseXBoUmVjb3JkcycpKSxcbiAgbGF5ZXJSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyByZXN0cnVjdHVyZS5BcnJheShMYXllclJlY29yZCwgJ251bUxheWVyUmVjb3JkcycpLCB7XG4gICAgbGF6eTogdHJ1ZVxuICB9KSxcbiAgbnVtTGF5ZXJSZWNvcmRzOiByZXN0cnVjdHVyZS51aW50MTZcbn0pO1xuXG52YXIgQ29sb3JSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYmx1ZTogcmVzdHJ1Y3R1cmUudWludDgsXG4gIGdyZWVuOiByZXN0cnVjdHVyZS51aW50OCxcbiAgcmVkOiByZXN0cnVjdHVyZS51aW50OCxcbiAgYWxwaGE6IHJlc3RydWN0dXJlLnVpbnQ4XG59KTtcbnZhciBDUEFMID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgaGVhZGVyOiB7XG4gICAgbnVtUGFsZXR0ZUVudHJpZXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBudW1QYWxldHRlczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG51bUNvbG9yUmVjb3JkczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvbG9yUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQ29sb3JSZWNvcmQsICdudW1Db2xvclJlY29yZHMnKSksXG4gICAgY29sb3JSZWNvcmRJbmRpY2VzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnbnVtUGFsZXR0ZXMnKVxuICB9LFxuICAwOiB7fSxcbiAgMToge1xuICAgIG9mZnNldFBhbGV0dGVUeXBlQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQzMiwgJ251bVBhbGV0dGVzJykpLFxuICAgIG9mZnNldFBhbGV0dGVMYWJlbEFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdudW1QYWxldHRlcycpKSxcbiAgICBvZmZzZXRQYWxldHRlRW50cnlMYWJlbEFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdudW1QYWxldHRlRW50cmllcycpKVxuICB9XG59KTtcblxudmFyIEJhc2VDb29yZCA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIDE6IHtcbiAgICAvLyBEZXNpZ24gdW5pdHMgb25seVxuICAgIGNvb3JkaW5hdGU6IHJlc3RydWN0dXJlLmludDE2IC8vIFggb3IgWSB2YWx1ZSwgaW4gZGVzaWduIHVuaXRzXG5cbiAgfSxcbiAgMjoge1xuICAgIC8vIERlc2lnbiB1bml0cyBwbHVzIGNvbnRvdXIgcG9pbnRcbiAgICBjb29yZGluYXRlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyBYIG9yIFkgdmFsdWUsIGluIGRlc2lnbiB1bml0c1xuICAgIHJlZmVyZW5jZUdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gR2x5cGhJRCBvZiBjb250cm9sIGdseXBoXG4gICAgYmFzZUNvb3JkUG9pbnQ6IHJlc3RydWN0dXJlLnVpbnQxNiAvLyBJbmRleCBvZiBjb250b3VyIHBvaW50IG9uIHRoZSByZWZlcmVuY2VHbHlwaFxuXG4gIH0sXG4gIDM6IHtcbiAgICAvLyBEZXNpZ24gdW5pdHMgcGx1cyBEZXZpY2UgdGFibGVcbiAgICBjb29yZGluYXRlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyBYIG9yIFkgdmFsdWUsIGluIGRlc2lnbiB1bml0c1xuICAgIGRldmljZVRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIERldmljZSkgLy8gRGV2aWNlIHRhYmxlIGZvciBYIG9yIFkgdmFsdWVcblxuICB9XG59KTtcbnZhciBCYXNlVmFsdWVzID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGRlZmF1bHRJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBJbmRleCBvZiBkZWZhdWx0IGJhc2VsaW5lIGZvciB0aGlzIHNjcmlwdC1zYW1lIGluZGV4IGluIHRoZSBCYXNlVGFnTGlzdFxuICBiYXNlQ29vcmRDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBiYXNlQ29vcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBCYXNlQ29vcmQpLCAnYmFzZUNvb3JkQ291bnQnKVxufSk7XG52YXIgRmVhdE1pbk1heFJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIC8vIDQtYnl0ZSBmZWF0dXJlIGlkZW50aWZpY2F0aW9uIHRhZy1tdXN0IG1hdGNoIEZlYXR1cmVUYWcgaW4gRmVhdHVyZUxpc3RcbiAgbWluQ29vcmQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQmFzZUNvb3JkLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSksXG4gIC8vIE1heSBiZSBOVUxMXG4gIG1heENvb3JkOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEJhc2VDb29yZCwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pIC8vIE1heSBiZSBOVUxMXG5cbn0pO1xudmFyIE1pbk1heCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBtaW5Db29yZDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBCYXNlQ29vcmQpLFxuICAvLyBNYXkgYmUgTlVMTFxuICBtYXhDb29yZDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBCYXNlQ29vcmQpLFxuICAvLyBNYXkgYmUgTlVMTFxuICBmZWF0TWluTWF4Q291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTWF5IGJlIDBcbiAgZmVhdE1pbk1heFJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShGZWF0TWluTWF4UmVjb3JkLCAnZmVhdE1pbk1heENvdW50JykgLy8gSW4gYWxwaGFiZXRpY2FsIG9yZGVyXG5cbn0pO1xudmFyIEJhc2VMYW5nU3lzUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgLy8gNC1ieXRlIGxhbmd1YWdlIHN5c3RlbSBpZGVudGlmaWNhdGlvbiB0YWdcbiAgbWluTWF4OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIE1pbk1heCwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBCYXNlU2NyaXB0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGJhc2VWYWx1ZXM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQmFzZVZhbHVlcyksXG4gIC8vIE1heSBiZSBOVUxMXG4gIGRlZmF1bHRNaW5NYXg6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTWluTWF4KSxcbiAgLy8gTWF5IGJlIE5VTExcbiAgYmFzZUxhbmdTeXNDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBNYXkgYmUgMFxuICBiYXNlTGFuZ1N5c1JlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShCYXNlTGFuZ1N5c1JlY29yZCwgJ2Jhc2VMYW5nU3lzQ291bnQnKSAvLyBpbiBhbHBoYWJldGljYWwgb3JkZXIgYnkgQmFzZUxhbmdTeXNUYWdcblxufSk7XG52YXIgQmFzZVNjcmlwdFJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIC8vIDQtYnl0ZSBzY3JpcHQgaWRlbnRpZmljYXRpb24gdGFnXG4gIHNjcmlwdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBCYXNlU2NyaXB0LCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIEJhc2VTY3JpcHRMaXN0ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KEJhc2VTY3JpcHRSZWNvcmQsIHJlc3RydWN0dXJlLnVpbnQxNik7IC8vIEFycmF5IG9mIDQtYnl0ZSBiYXNlbGluZSBpZGVudGlmaWNhdGlvbiB0YWdzLW11c3QgYmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyXG5cbnZhciBCYXNlVGFnTGlzdCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIEF4aXMgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYmFzZVRhZ0xpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQmFzZVRhZ0xpc3QpLFxuICAvLyBNYXkgYmUgTlVMTFxuICBiYXNlU2NyaXB0TGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBCYXNlU2NyaXB0TGlzdClcbn0pO1xudmFyIEJBU0UgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQzMiwge1xuICBoZWFkZXI6IHtcbiAgICBob3JpekF4aXM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQXhpcyksXG4gICAgLy8gTWF5IGJlIE5VTExcbiAgICB2ZXJ0QXhpczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBBeGlzKSAvLyBNYXkgYmUgTlVMTFxuXG4gIH0sXG4gIDB4MDAwMTAwMDA6IHt9LFxuICAweDAwMDEwMDAxOiB7XG4gICAgaXRlbVZhcmlhdGlvblN0b3JlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEl0ZW1WYXJpYXRpb25TdG9yZSlcbiAgfVxufSk7XG5cbnZhciBBdHRhY2hQb2ludCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgQXR0YWNoTGlzdCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gIGdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgYXR0YWNoUG9pbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBBdHRhY2hQb2ludCksICdnbHlwaENvdW50Jylcbn0pO1xudmFyIENhcmV0VmFsdWUgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAxOiB7XG4gICAgLy8gRGVzaWduIHVuaXRzIG9ubHlcbiAgICBjb29yZGluYXRlOiByZXN0cnVjdHVyZS5pbnQxNlxuICB9LFxuICAyOiB7XG4gICAgLy8gQ29udG91ciBwb2ludFxuICAgIGNhcmV0VmFsdWVQb2ludDogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH0sXG4gIDM6IHtcbiAgICAvLyBEZXNpZ24gdW5pdHMgcGx1cyBEZXZpY2UgdGFibGVcbiAgICBjb29yZGluYXRlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICBkZXZpY2VUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBEZXZpY2UpXG4gIH1cbn0pO1xudmFyIExpZ0dseXBoID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2FyZXRWYWx1ZSksIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgTGlnQ2FyZXRMaXN0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgbGlnR2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsaWdHbHlwaHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIExpZ0dseXBoKSwgJ2xpZ0dseXBoQ291bnQnKVxufSk7XG52YXIgTWFya0dseXBoU2V0c0RlZiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBtYXJrU2V0VGFibGVGb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWFya1NldENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBDb3ZlcmFnZSksICdtYXJrU2V0Q291bnQnKVxufSk7XG52YXIgR0RFRiA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDMyLCB7XG4gIGhlYWRlcjoge1xuICAgIGdseXBoQ2xhc3NEZWY6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NEZWYpLFxuICAgIGF0dGFjaExpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQXR0YWNoTGlzdCksXG4gICAgbGlnQ2FyZXRMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIExpZ0NhcmV0TGlzdCksXG4gICAgbWFya0F0dGFjaENsYXNzRGVmOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzRGVmKVxuICB9LFxuICAweDAwMDEwMDAwOiB7fSxcbiAgMHgwMDAxMDAwMjoge1xuICAgIG1hcmtHbHlwaFNldHNEZWY6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTWFya0dseXBoU2V0c0RlZilcbiAgfSxcbiAgMHgwMDAxMDAwMzoge1xuICAgIG1hcmtHbHlwaFNldHNEZWY6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTWFya0dseXBoU2V0c0RlZiksXG4gICAgaXRlbVZhcmlhdGlvblN0b3JlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEl0ZW1WYXJpYXRpb25TdG9yZSlcbiAgfVxufSk7XG5cbnZhciBWYWx1ZUZvcm1hdCA9IG5ldyByZXN0cnVjdHVyZS5CaXRmaWVsZChyZXN0cnVjdHVyZS51aW50MTYsIFsneFBsYWNlbWVudCcsICd5UGxhY2VtZW50JywgJ3hBZHZhbmNlJywgJ3lBZHZhbmNlJywgJ3hQbGFEZXZpY2UnLCAneVBsYURldmljZScsICd4QWR2RGV2aWNlJywgJ3lBZHZEZXZpY2UnXSk7XG52YXIgdHlwZXMgPSB7XG4gIHhQbGFjZW1lbnQ6IHJlc3RydWN0dXJlLmludDE2LFxuICB5UGxhY2VtZW50OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgeEFkdmFuY2U6IHJlc3RydWN0dXJlLmludDE2LFxuICB5QWR2YW5jZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHhQbGFEZXZpY2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgRGV2aWNlLCB7XG4gICAgdHlwZTogJ2dsb2JhbCcsXG4gICAgcmVsYXRpdmVUbzogJ3JlbCdcbiAgfSksXG4gIHlQbGFEZXZpY2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgRGV2aWNlLCB7XG4gICAgdHlwZTogJ2dsb2JhbCcsXG4gICAgcmVsYXRpdmVUbzogJ3JlbCdcbiAgfSksXG4gIHhBZHZEZXZpY2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgRGV2aWNlLCB7XG4gICAgdHlwZTogJ2dsb2JhbCcsXG4gICAgcmVsYXRpdmVUbzogJ3JlbCdcbiAgfSksXG4gIHlBZHZEZXZpY2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgRGV2aWNlLCB7XG4gICAgdHlwZTogJ2dsb2JhbCcsXG4gICAgcmVsYXRpdmVUbzogJ3JlbCdcbiAgfSlcbn07XG5cbnZhciBWYWx1ZVJlY29yZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFZhbHVlUmVjb3JkKGtleSkge1xuICAgIGlmIChrZXkgPT09IHZvaWQgMCkge1xuICAgICAga2V5ID0gJ3ZhbHVlRm9ybWF0JztcbiAgICB9XG5cbiAgICB0aGlzLmtleSA9IGtleTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBWYWx1ZVJlY29yZC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmJ1aWxkU3RydWN0ID0gZnVuY3Rpb24gYnVpbGRTdHJ1Y3QocGFyZW50KSB7XG4gICAgdmFyIHN0cnVjdCA9IHBhcmVudDtcblxuICAgIHdoaWxlICghc3RydWN0W3RoaXMua2V5XSAmJiBzdHJ1Y3QucGFyZW50KSB7XG4gICAgICBzdHJ1Y3QgPSBzdHJ1Y3QucGFyZW50O1xuICAgIH1cblxuICAgIGlmICghc3RydWN0W3RoaXMua2V5XSkgcmV0dXJuO1xuICAgIHZhciBmaWVsZHMgPSB7fTtcblxuICAgIGZpZWxkcy5yZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc3RydWN0Ll9zdGFydE9mZnNldDtcbiAgICB9O1xuXG4gICAgdmFyIGZvcm1hdCA9IHN0cnVjdFt0aGlzLmtleV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gZm9ybWF0KSB7XG4gICAgICBpZiAoZm9ybWF0W2tleV0pIHtcbiAgICAgICAgZmllbGRzW2tleV0gPSB0eXBlc1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KGZpZWxkcyk7XG4gIH07XG5cbiAgX3Byb3RvLnNpemUgPSBmdW5jdGlvbiBzaXplKHZhbCwgY3R4KSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRTdHJ1Y3QoY3R4KS5zaXplKHZhbCwgY3R4KTtcbiAgfTtcblxuICBfcHJvdG8uZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgdmFyIHJlcyA9IHRoaXMuYnVpbGRTdHJ1Y3QocGFyZW50KS5kZWNvZGUoc3RyZWFtLCBwYXJlbnQpO1xuICAgIGRlbGV0ZSByZXMucmVsO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgcmV0dXJuIFZhbHVlUmVjb3JkO1xufSgpO1xuXG52YXIgUGFpclZhbHVlUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHNlY29uZEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHZhbHVlMTogbmV3IFZhbHVlUmVjb3JkKCd2YWx1ZUZvcm1hdDEnKSxcbiAgdmFsdWUyOiBuZXcgVmFsdWVSZWNvcmQoJ3ZhbHVlRm9ybWF0MicpXG59KTtcbnZhciBQYWlyU2V0ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KFBhaXJWYWx1ZVJlY29yZCwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBDbGFzczJSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmFsdWUxOiBuZXcgVmFsdWVSZWNvcmQoJ3ZhbHVlRm9ybWF0MScpLFxuICB2YWx1ZTI6IG5ldyBWYWx1ZVJlY29yZCgndmFsdWVGb3JtYXQyJylcbn0pO1xudmFyIEFuY2hvciA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIDE6IHtcbiAgICAvLyBEZXNpZ24gdW5pdHMgb25seVxuICAgIHhDb29yZGluYXRlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB5Q29vcmRpbmF0ZTogcmVzdHJ1Y3R1cmUuaW50MTZcbiAgfSxcbiAgMjoge1xuICAgIC8vIERlc2lnbiB1bml0cyBwbHVzIGNvbnRvdXIgcG9pbnRcbiAgICB4Q29vcmRpbmF0ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgeUNvb3JkaW5hdGU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIGFuY2hvclBvaW50OiByZXN0cnVjdHVyZS51aW50MTZcbiAgfSxcbiAgMzoge1xuICAgIC8vIERlc2lnbiB1bml0cyBwbHVzIERldmljZSB0YWJsZXNcbiAgICB4Q29vcmRpbmF0ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgeUNvb3JkaW5hdGU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHhEZXZpY2VUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBEZXZpY2UpLFxuICAgIHlEZXZpY2VUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBEZXZpY2UpXG4gIH1cbn0pO1xudmFyIEVudHJ5RXhpdFJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBlbnRyeUFuY2hvcjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBBbmNob3IsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KSxcbiAgZXhpdEFuY2hvcjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBBbmNob3IsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgTWFya1JlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBcImNsYXNzXCI6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWFya0FuY2hvcjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBBbmNob3IsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgTWFya0FycmF5ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KE1hcmtSZWNvcmQsIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgQmFzZVJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEFuY2hvciksIGZ1bmN0aW9uICh0KSB7XG4gIHJldHVybiB0LnBhcmVudC5jbGFzc0NvdW50O1xufSk7XG52YXIgQmFzZUFycmF5ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KEJhc2VSZWNvcmQsIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgQ29tcG9uZW50UmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQW5jaG9yKSwgZnVuY3Rpb24gKHQpIHtcbiAgcmV0dXJuIHQucGFyZW50LnBhcmVudC5jbGFzc0NvdW50O1xufSk7XG52YXIgTGlnYXR1cmVBdHRhY2ggPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQ29tcG9uZW50UmVjb3JkLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIExpZ2F0dXJlQXJyYXkgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBMaWdhdHVyZUF0dGFjaCksIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgR1BPU0xvb2t1cCA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QoJ2xvb2t1cFR5cGUnLCB7XG4gIDE6IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gICAgLy8gU2luZ2xlIEFkanVzdG1lbnRcbiAgICAxOiB7XG4gICAgICAvLyBTaW5nbGUgcG9zaXRpb25pbmcgdmFsdWVcbiAgICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICAgIHZhbHVlRm9ybWF0OiBWYWx1ZUZvcm1hdCxcbiAgICAgIHZhbHVlOiBuZXcgVmFsdWVSZWNvcmQoKVxuICAgIH0sXG4gICAgMjoge1xuICAgICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgICAgdmFsdWVGb3JtYXQ6IFZhbHVlRm9ybWF0LFxuICAgICAgdmFsdWVDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgICAgdmFsdWVzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KG5ldyBWYWx1ZVJlY29yZCgpLCAndmFsdWVDb3VudCcpXG4gICAgfVxuICB9KSxcbiAgMjogbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgICAvLyBQYWlyIEFkanVzdG1lbnQgUG9zaXRpb25pbmdcbiAgICAxOiB7XG4gICAgICAvLyBBZGp1c3RtZW50cyBmb3IgZ2x5cGggcGFpcnNcbiAgICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICAgIHZhbHVlRm9ybWF0MTogVmFsdWVGb3JtYXQsXG4gICAgICB2YWx1ZUZvcm1hdDI6IFZhbHVlRm9ybWF0LFxuICAgICAgcGFpclNldENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgICBwYWlyU2V0czogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFBhaXJTZXQpLCAncGFpclNldENvdW50JylcbiAgICB9LFxuICAgIDI6IHtcbiAgICAgIC8vIENsYXNzIHBhaXIgYWRqdXN0bWVudFxuICAgICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgICAgdmFsdWVGb3JtYXQxOiBWYWx1ZUZvcm1hdCxcbiAgICAgIHZhbHVlRm9ybWF0MjogVmFsdWVGb3JtYXQsXG4gICAgICBjbGFzc0RlZjE6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NEZWYpLFxuICAgICAgY2xhc3NEZWYyOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzRGVmKSxcbiAgICAgIGNsYXNzMUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgICBjbGFzczJDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgICAgY2xhc3NSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkoQ2xhc3MyUmVjb3JkLCAnY2xhc3MyQ291bnQnKSwgJ2NsYXNzMUNvdW50JylcbiAgICB9XG4gIH0pLFxuICAzOiB7XG4gICAgLy8gQ3Vyc2l2ZSBBdHRhY2htZW50IFBvc2l0aW9uaW5nXG4gICAgZm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGVudHJ5RXhpdENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZW50cnlFeGl0UmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEVudHJ5RXhpdFJlY29yZCwgJ2VudHJ5RXhpdENvdW50JylcbiAgfSxcbiAgNDoge1xuICAgIC8vIE1hcmtUb0Jhc2UgQXR0YWNobWVudCBQb3NpdGlvbmluZ1xuICAgIGZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG1hcmtDb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgYmFzZUNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBjbGFzc0NvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbWFya0FycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIE1hcmtBcnJheSksXG4gICAgYmFzZUFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEJhc2VBcnJheSlcbiAgfSxcbiAgNToge1xuICAgIC8vIE1hcmtUb0xpZ2F0dXJlIEF0dGFjaG1lbnQgUG9zaXRpb25pbmdcbiAgICBmb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBtYXJrQ292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGxpZ2F0dXJlQ292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGNsYXNzQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBtYXJrQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTWFya0FycmF5KSxcbiAgICBsaWdhdHVyZUFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIExpZ2F0dXJlQXJyYXkpXG4gIH0sXG4gIDY6IHtcbiAgICAvLyBNYXJrVG9NYXJrIEF0dGFjaG1lbnQgUG9zaXRpb25pbmdcbiAgICBmb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBtYXJrMUNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBtYXJrMkNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBjbGFzc0NvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbWFyazFBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBNYXJrQXJyYXkpLFxuICAgIG1hcmsyQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQmFzZUFycmF5KVxuICB9LFxuICA3OiBDb250ZXh0LFxuICAvLyBDb250ZXh0dWFsIHBvc2l0aW9uaW5nXG4gIDg6IENoYWluaW5nQ29udGV4dCxcbiAgLy8gQ2hhaW5pbmcgY29udGV4dHVhbCBwb3NpdGlvbmluZ1xuICA5OiB7XG4gICAgLy8gRXh0ZW5zaW9uIFBvc2l0aW9uaW5nXG4gICAgcG9zRm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbG9va3VwVHlwZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIGNhbm5vdCBhbHNvIGJlIDlcbiAgICBleHRlbnNpb246IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgR1BPU0xvb2t1cClcbiAgfVxufSk7IC8vIEZpeCBjaXJjdWxhciByZWZlcmVuY2VcblxuR1BPU0xvb2t1cC52ZXJzaW9uc1s5XS5leHRlbnNpb24udHlwZSA9IEdQT1NMb29rdXA7XG52YXIgR1BPUyA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDMyLCB7XG4gIGhlYWRlcjoge1xuICAgIHNjcmlwdExpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgU2NyaXB0TGlzdCksXG4gICAgZmVhdHVyZUxpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgRmVhdHVyZUxpc3QpLFxuICAgIGxvb2t1cExpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgbmV3IExvb2t1cExpc3QoR1BPU0xvb2t1cCkpXG4gIH0sXG4gIDB4MDAwMTAwMDA6IHt9LFxuICAweDAwMDEwMDAxOiB7XG4gICAgZmVhdHVyZVZhcmlhdGlvbnM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgRmVhdHVyZVZhcmlhdGlvbnMpXG4gIH1cbn0pOyAvLyBleHBvcnQgR1BPU0xvb2t1cCBmb3IgSlNURiB0YWJsZVxuXG52YXIgU2VxdWVuY2UgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIEFsdGVybmF0ZVNldCA9IFNlcXVlbmNlO1xudmFyIExpZ2F0dXJlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGNvbXBDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBjb21wb25lbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LmNvbXBDb3VudCAtIDE7XG4gIH0pXG59KTtcbnZhciBMaWdhdHVyZVNldCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIExpZ2F0dXJlKSwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBHU1VCTG9va3VwID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdCgnbG9va3VwVHlwZScsIHtcbiAgMTogbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgICAvLyBTaW5nbGUgU3Vic3RpdHV0aW9uXG4gICAgMToge1xuICAgICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgICAgZGVsdGFHbHlwaElEOiByZXN0cnVjdHVyZS5pbnQxNlxuICAgIH0sXG4gICAgMjoge1xuICAgICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgICAgZ2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgICAgc3Vic3RpdHV0ZTogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdnbHlwaENvdW50JylcbiAgICB9XG4gIH0pLFxuICAyOiB7XG4gICAgLy8gTXVsdGlwbGUgU3Vic3RpdHV0aW9uXG4gICAgc3Vic3RGb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgY291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBzZXF1ZW5jZXM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBTZXF1ZW5jZSksICdjb3VudCcpXG4gIH0sXG4gIDM6IHtcbiAgICAvLyBBbHRlcm5hdGUgU3Vic3RpdHV0aW9uXG4gICAgc3Vic3RGb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgY291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBhbHRlcm5hdGVTZXQ6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBBbHRlcm5hdGVTZXQpLCAnY291bnQnKVxuICB9LFxuICA0OiB7XG4gICAgLy8gTGlnYXR1cmUgU3Vic3RpdHV0aW9uXG4gICAgc3Vic3RGb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgY291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBsaWdhdHVyZVNldHM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBMaWdhdHVyZVNldCksICdjb3VudCcpXG4gIH0sXG4gIDU6IENvbnRleHQsXG4gIC8vIENvbnRleHR1YWwgU3Vic3RpdHV0aW9uXG4gIDY6IENoYWluaW5nQ29udGV4dCxcbiAgLy8gQ2hhaW5pbmcgQ29udGV4dHVhbCBTdWJzdGl0dXRpb25cbiAgNzoge1xuICAgIC8vIEV4dGVuc2lvbiBTdWJzdGl0dXRpb25cbiAgICBzdWJzdEZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGxvb2t1cFR5cGU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyBjYW5ub3QgYWxzbyBiZSA3XG4gICAgZXh0ZW5zaW9uOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEdTVUJMb29rdXApXG4gIH0sXG4gIDg6IHtcbiAgICAvLyBSZXZlcnNlIENoYWluaW5nIENvbnRleHR1YWwgU2luZ2xlIFN1YnN0aXR1dGlvblxuICAgIHN1YnN0Rm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGJhY2t0cmFja0NvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksICdiYWNrdHJhY2tHbHlwaENvdW50JyksXG4gICAgbG9va2FoZWFkR2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGxvb2thaGVhZENvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksICdsb29rYWhlYWRHbHlwaENvdW50JyksXG4gICAgZ2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHN1YnN0aXR1dGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnZ2x5cGhDb3VudCcpXG4gIH1cbn0pOyAvLyBGaXggY2lyY3VsYXIgcmVmZXJlbmNlXG5cbkdTVUJMb29rdXAudmVyc2lvbnNbN10uZXh0ZW5zaW9uLnR5cGUgPSBHU1VCTG9va3VwO1xudmFyIEdTVUIgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQzMiwge1xuICBoZWFkZXI6IHtcbiAgICBzY3JpcHRMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFNjcmlwdExpc3QpLFxuICAgIGZlYXR1cmVMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEZlYXR1cmVMaXN0KSxcbiAgICBsb29rdXBMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIG5ldyBMb29rdXBMaXN0KEdTVUJMb29rdXApKVxuICB9LFxuICAweDAwMDEwMDAwOiB7fSxcbiAgMHgwMDAxMDAwMToge1xuICAgIGZlYXR1cmVWYXJpYXRpb25zOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEZlYXR1cmVWYXJpYXRpb25zKVxuICB9XG59KTtcblxudmFyIEpzdGZHU1VCTW9kTGlzdCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgSnN0ZlByaW9yaXR5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHNocmlua2FnZUVuYWJsZUdTVUI6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZkdTVUJNb2RMaXN0KSxcbiAgc2hyaW5rYWdlRGlzYWJsZUdTVUI6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZkdTVUJNb2RMaXN0KSxcbiAgc2hyaW5rYWdlRW5hYmxlR1BPUzogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmR1NVQk1vZExpc3QpLFxuICBzaHJpbmthZ2VEaXNhYmxlR1BPUzogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmR1NVQk1vZExpc3QpLFxuICBzaHJpbmthZ2VKc3RmTWF4OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIG5ldyBMb29rdXBMaXN0KEdQT1NMb29rdXApKSxcbiAgZXh0ZW5zaW9uRW5hYmxlR1NVQjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmR1NVQk1vZExpc3QpLFxuICBleHRlbnNpb25EaXNhYmxlR1NVQjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmR1NVQk1vZExpc3QpLFxuICBleHRlbnNpb25FbmFibGVHUE9TOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZHU1VCTW9kTGlzdCksXG4gIGV4dGVuc2lvbkRpc2FibGVHUE9TOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZHU1VCTW9kTGlzdCksXG4gIGV4dGVuc2lvbkpzdGZNYXg6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgbmV3IExvb2t1cExpc3QoR1BPU0xvb2t1cCkpXG59KTtcbnZhciBKc3RmTGFuZ1N5cyA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZQcmlvcml0eSksIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgSnN0ZkxhbmdTeXNSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICBqc3RmTGFuZ1N5czogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmTGFuZ1N5cylcbn0pO1xudmFyIEpzdGZTY3JpcHQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZXh0ZW5kZXJHbHlwaHM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgcmVzdHJ1Y3R1cmUudWludDE2KSksXG4gIC8vIGFycmF5IG9mIGdseXBocyB0byBleHRlbmQgbGluZSBsZW5ndGhcbiAgZGVmYXVsdExhbmdTeXM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZkxhbmdTeXMpLFxuICBsYW5nU3lzQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbGFuZ1N5c1JlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShKc3RmTGFuZ1N5c1JlY29yZCwgJ2xhbmdTeXNDb3VudCcpXG59KTtcbnZhciBKc3RmU2NyaXB0UmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgc2NyaXB0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZTY3JpcHQsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgSlNURiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIC8vIHNob3VsZCBiZSAweDAwMDEwMDAwXG4gIHNjcmlwdENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHNjcmlwdExpc3Q6IG5ldyByZXN0cnVjdHVyZS5BcnJheShKc3RmU2NyaXB0UmVjb3JkLCAnc2NyaXB0Q291bnQnKVxufSk7XG5cbnZhciBWYXJpYWJsZVNpemVOdW1iZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBWYXJpYWJsZVNpemVOdW1iZXIoc2l6ZSkge1xuICAgIHRoaXMuX3NpemUgPSBzaXplO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFZhcmlhYmxlU2l6ZU51bWJlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCkge1xuICAgIHN3aXRjaCAodGhpcy5zaXplKDAsIHBhcmVudCkpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkVUludDgoKTtcblxuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWRVSW50MTZCRSgpO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICAgIHJldHVybiBzdHJlYW0ucmVhZFVJbnQyNEJFKCk7XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkVUludDMyQkUoKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnNpemUgPSBmdW5jdGlvbiBzaXplKHZhbCwgcGFyZW50KSB7XG4gICAgcmV0dXJuIHV0aWxzXzEodGhpcy5fc2l6ZSwgbnVsbCwgcGFyZW50KTtcbiAgfTtcblxuICByZXR1cm4gVmFyaWFibGVTaXplTnVtYmVyO1xufSgpO1xuXG52YXIgTWFwRGF0YUVudHJ5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGVudHJ5OiBuZXcgVmFyaWFibGVTaXplTnVtYmVyKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuICgodC5wYXJlbnQuZW50cnlGb3JtYXQgJiAweDAwMzApID4+IDQpICsgMTtcbiAgfSksXG4gIG91dGVySW5kZXg6IGZ1bmN0aW9uIG91dGVySW5kZXgodCkge1xuICAgIHJldHVybiB0LmVudHJ5ID4+ICh0LnBhcmVudC5lbnRyeUZvcm1hdCAmIDB4MDAwRikgKyAxO1xuICB9LFxuICBpbm5lckluZGV4OiBmdW5jdGlvbiBpbm5lckluZGV4KHQpIHtcbiAgICByZXR1cm4gdC5lbnRyeSAmICgxIDw8ICh0LnBhcmVudC5lbnRyeUZvcm1hdCAmIDB4MDAwRikgKyAxKSAtIDE7XG4gIH1cbn0pO1xudmFyIERlbHRhU2V0SW5kZXhNYXAgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZW50cnlGb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWFwQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWFwRGF0YTogbmV3IHJlc3RydWN0dXJlLkFycmF5KE1hcERhdGFFbnRyeSwgJ21hcENvdW50Jylcbn0pO1xudmFyIEhWQVIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbWFqb3JWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1pbm9yVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBpdGVtVmFyaWF0aW9uU3RvcmU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgSXRlbVZhcmlhdGlvblN0b3JlKSxcbiAgYWR2YW5jZVdpZHRoTWFwcGluZzogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBEZWx0YVNldEluZGV4TWFwKSxcbiAgTFNCTWFwcGluZzogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBEZWx0YVNldEluZGV4TWFwKSxcbiAgUlNCTWFwcGluZzogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBEZWx0YVNldEluZGV4TWFwKVxufSk7XG5cbnZhciBTaWduYXR1cmUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZm9ybWF0OiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBvZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQzMlxufSk7XG52YXIgU2lnbmF0dXJlQmxvY2sgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYsIDIpLFxuICBjYlNpZ25hdHVyZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAvLyBMZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgUEtDUyM3IHBhY2tldCBpbiBwYlNpZ25hdHVyZVxuICBzaWduYXR1cmU6IG5ldyByZXN0cnVjdHVyZS5CdWZmZXIoJ2NiU2lnbmF0dXJlJylcbn0pO1xudmFyIERTSUcgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdWxWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBEU0lHIHRhYmxlICgweDAwMDAwMDAxKVxuICB1c051bVNpZ3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTnVtYmVyIG9mIHNpZ25hdHVyZXMgaW4gdGhlIHRhYmxlXG4gIHVzRmxhZzogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBQZXJtaXNzaW9uIGZsYWdzXG4gIHNpZ25hdHVyZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShTaWduYXR1cmUsICd1c051bVNpZ3MnKSxcbiAgc2lnbmF0dXJlQmxvY2tzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoU2lnbmF0dXJlQmxvY2ssICd1c051bVNpZ3MnKVxufSk7XG5cbnZhciBHYXNwUmFuZ2UgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgcmFuZ2VNYXhQUEVNOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIFVwcGVyIGxpbWl0IG9mIHJhbmdlLCBpbiBwcGVtXG4gIHJhbmdlR2FzcEJlaGF2aW9yOiBuZXcgcmVzdHJ1Y3R1cmUuQml0ZmllbGQocmVzdHJ1Y3R1cmUudWludDE2LCBbLy8gRmxhZ3MgZGVzY3JpYmluZyBkZXNpcmVkIHJhc3Rlcml6ZXIgYmVoYXZpb3JcbiAgJ2dyYXlzY2FsZScsICdncmlkZml0JywgJ3N5bW1ldHJpY1Ntb290aGluZycsICdzeW1tZXRyaWNHcmlkZml0JyAvLyBvbmx5IGluIHZlcnNpb24gMSwgZm9yIENsZWFyVHlwZVxuICBdKVxufSk7XG52YXIgZ2FzcCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIHNldCB0byAwXG4gIG51bVJhbmdlczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBnYXNwUmFuZ2VzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoR2FzcFJhbmdlLCAnbnVtUmFuZ2VzJykgLy8gU29ydGVkIGJ5IHBwZW1cblxufSk7XG5cbnZhciBEZXZpY2VSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgcGl4ZWxTaXplOiByZXN0cnVjdHVyZS51aW50OCxcbiAgbWF4aW11bVdpZHRoOiByZXN0cnVjdHVyZS51aW50OCxcbiAgd2lkdGhzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LnBhcmVudC5tYXhwLm51bUdseXBocztcbiAgfSlcbn0pOyAvLyBUaGUgSG9yaXpvbnRhbCBEZXZpY2UgTWV0cmljcyB0YWJsZSBzdG9yZXMgaW50ZWdlciBhZHZhbmNlIHdpZHRocyBzY2FsZWQgdG8gcGFydGljdWxhciBwaXhlbCBzaXplc1xuXG52YXIgaGRteCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG51bVJlY29yZHM6IHJlc3RydWN0dXJlLmludDE2LFxuICBzaXplRGV2aWNlUmVjb3JkOiByZXN0cnVjdHVyZS5pbnQzMixcbiAgcmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KERldmljZVJlY29yZCwgJ251bVJlY29yZHMnKVxufSk7XG5cbnZhciBLZXJuUGFpciA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBsZWZ0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHJpZ2h0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHZhbHVlOiByZXN0cnVjdHVyZS5pbnQxNlxufSk7XG52YXIgQ2xhc3NUYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmaXJzdEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG5HbHlwaHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgb2Zmc2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ25HbHlwaHMnKSxcbiAgbWF4OiBmdW5jdGlvbiBtYXgodCkge1xuICAgIHJldHVybiB0Lm9mZnNldHMubGVuZ3RoICYmIE1hdGgubWF4LmFwcGx5KE1hdGgsIHQub2Zmc2V0cyk7XG4gIH1cbn0pO1xudmFyIEtlcm4yQXJyYXkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgb2ZmOiBmdW5jdGlvbiBvZmYodCkge1xuICAgIHJldHVybiB0Ll9zdGFydE9mZnNldCAtIHQucGFyZW50LnBhcmVudC5fc3RhcnRPZmZzZXQ7XG4gIH0sXG4gIGxlbjogZnVuY3Rpb24gbGVuKHQpIHtcbiAgICByZXR1cm4gKCh0LnBhcmVudC5sZWZ0VGFibGUubWF4IC0gdC5vZmYpIC8gdC5wYXJlbnQucm93V2lkdGggKyAxKSAqICh0LnBhcmVudC5yb3dXaWR0aCAvIDIpO1xuICB9LFxuICB2YWx1ZXM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkocmVzdHJ1Y3R1cmUuaW50MTYsICdsZW4nKVxufSk7XG52YXIgS2VyblN1YnRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdCgnZm9ybWF0Jywge1xuICAwOiB7XG4gICAgblBhaXJzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgc2VhcmNoUmFuZ2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBlbnRyeVNlbGVjdG9yOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgcmFuZ2VTaGlmdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHBhaXJzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoS2VyblBhaXIsICduUGFpcnMnKVxuICB9LFxuICAyOiB7XG4gICAgcm93V2lkdGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBsZWZ0VGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NUYWJsZSwge1xuICAgICAgdHlwZTogJ3BhcmVudCdcbiAgICB9KSxcbiAgICByaWdodFRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzVGFibGUsIHtcbiAgICAgIHR5cGU6ICdwYXJlbnQnXG4gICAgfSksXG4gICAgYXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgS2VybjJBcnJheSwge1xuICAgICAgdHlwZTogJ3BhcmVudCdcbiAgICB9KVxuICB9LFxuICAzOiB7XG4gICAgZ2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGtlcm5WYWx1ZUNvdW50OiByZXN0cnVjdHVyZS51aW50OCxcbiAgICBsZWZ0Q2xhc3NDb3VudDogcmVzdHJ1Y3R1cmUudWludDgsXG4gICAgcmlnaHRDbGFzc0NvdW50OiByZXN0cnVjdHVyZS51aW50OCxcbiAgICBmbGFnczogcmVzdHJ1Y3R1cmUudWludDgsXG4gICAga2VyblZhbHVlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUuaW50MTYsICdrZXJuVmFsdWVDb3VudCcpLFxuICAgIGxlZnRDbGFzczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCAnZ2x5cGhDb3VudCcpLFxuICAgIHJpZ2h0Q2xhc3M6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgJ2dseXBoQ291bnQnKSxcbiAgICBrZXJuSW5kZXg6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LmxlZnRDbGFzc0NvdW50ICogdC5yaWdodENsYXNzQ291bnQ7XG4gICAgfSlcbiAgfVxufSk7XG52YXIgS2VyblRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdCgndmVyc2lvbicsIHtcbiAgMDoge1xuICAgIC8vIE1pY3Jvc29mdCB1c2VzIHRoaXMgZm9ybWF0XG4gICAgc3ViVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIE1pY3Jvc29mdCBoYXMgYW4gZXh0cmEgc3ViLXRhYmxlIHZlcnNpb24gbnVtYmVyXG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gTGVuZ3RoIG9mIHRoZSBzdWJ0YWJsZSwgaW4gYnl0ZXNcbiAgICBmb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAgIC8vIEZvcm1hdCBvZiBzdWJ0YWJsZVxuICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuQml0ZmllbGQocmVzdHJ1Y3R1cmUudWludDgsIFsnaG9yaXpvbnRhbCcsIC8vIDEgaWYgdGFibGUgaGFzIGhvcml6b250YWwgZGF0YSwgMCBpZiB2ZXJ0aWNhbFxuICAgICdtaW5pbXVtJywgLy8gSWYgc2V0IHRvIDEsIHRoZSB0YWJsZSBoYXMgbWluaW11bSB2YWx1ZXMuIElmIHNldCB0byAwLCB0aGUgdGFibGUgaGFzIGtlcm5pbmcgdmFsdWVzLlxuICAgICdjcm9zc1N0cmVhbScsIC8vIElmIHNldCB0byAxLCBrZXJuaW5nIGlzIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGZsb3cgb2YgdGhlIHRleHRcbiAgICAnb3ZlcnJpZGUnIC8vIElmIHNldCB0byAxIHRoZSB2YWx1ZSBpbiB0aGlzIHRhYmxlIHJlcGxhY2VzIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZVxuICAgIF0pLFxuICAgIHN1YnRhYmxlOiBLZXJuU3VidGFibGUsXG4gICAgcGFkZGluZzogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQ4LCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQubGVuZ3RoIC0gdC5fY3VycmVudE9mZnNldDtcbiAgICB9KVxuICB9LFxuICAxOiB7XG4gICAgLy8gQXBwbGUgdXNlcyB0aGlzIGZvcm1hdFxuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuQml0ZmllbGQocmVzdHJ1Y3R1cmUudWludDgsIFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAndmFyaWF0aW9uJywgLy8gU2V0IGlmIHRhYmxlIGhhcyB2YXJpYXRpb24ga2VybmluZyB2YWx1ZXNcbiAgICAnY3Jvc3NTdHJlYW0nLCAvLyBTZXQgaWYgdGFibGUgaGFzIGNyb3NzLXN0cmVhbSBrZXJuaW5nIHZhbHVlc1xuICAgICd2ZXJ0aWNhbCcgLy8gU2V0IGlmIHRhYmxlIGhhcyB2ZXJ0aWNhbCBrZXJuaW5nIHZhbHVlc1xuICAgIF0pLFxuICAgIGZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDgsXG4gICAgdHVwbGVJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHN1YnRhYmxlOiBLZXJuU3VidGFibGUsXG4gICAgcGFkZGluZzogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQ4LCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQubGVuZ3RoIC0gdC5fY3VycmVudE9mZnNldDtcbiAgICB9KVxuICB9XG59KTtcbnZhciBrZXJuID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgMDoge1xuICAgIC8vIE1pY3Jvc29mdCBWZXJzaW9uXG4gICAgblRhYmxlczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHRhYmxlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEtlcm5UYWJsZSwgJ25UYWJsZXMnKVxuICB9LFxuICAxOiB7XG4gICAgLy8gQXBwbGUgVmVyc2lvblxuICAgIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgICAvLyB0aGUgb3RoZXIgaGFsZiBvZiB0aGUgdmVyc2lvbiBudW1iZXJcbiAgICBuVGFibGVzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgdGFibGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoS2VyblRhYmxlLCAnblRhYmxlcycpXG4gIH1cbn0pO1xuXG4vLyBSZWNvcmRzIHRoZSBwcGVtIGZvciBlYWNoIGdseXBoIGF0IHdoaWNoIHRoZSBzY2FsaW5nIGJlY29tZXMgbGluZWFyIGFnYWluLFxuLy8gZGVzcGl0ZSBpbnN0cnVjdGlvbnMgZWZmZWN0aW5nIHRoZSBhZHZhbmNlIHdpZHRoXG5cbnZhciBMVFNIID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbnVtR2x5cGhzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHlQZWxzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsICdudW1HbHlwaHMnKVxufSk7XG5cbi8vIE5PVEU6IFRoZSBQQ0xUIHRhYmxlIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkIGZvciBPcGVuVHlwZSBmb250cyB3aXRoIFRydWVUeXBlIG91dGxpbmVzXG5cbnZhciBQQ0xUID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZm9udE51bWJlcjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBwaXRjaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB4SGVpZ2h0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHN0eWxlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHR5cGVGYW1pbHk6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgY2FwSGVpZ2h0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHN5bWJvbFNldDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB0eXBlZmFjZTogbmV3IHJlc3RydWN0dXJlLlN0cmluZygxNiksXG4gIGNoYXJhY3RlckNvbXBsZW1lbnQ6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoOCksXG4gIGZpbGVOYW1lOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDYpLFxuICBzdHJva2VXZWlnaHQ6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoMSksXG4gIHdpZHRoVHlwZTogbmV3IHJlc3RydWN0dXJlLlN0cmluZygxKSxcbiAgc2VyaWZTdHlsZTogcmVzdHJ1Y3R1cmUudWludDgsXG4gIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDgpXG59KTtcblxuLy8gc2l6ZXMuIFRoaXMgaXMgbmVlZGVkIGluIG9yZGVyIHRvIG1hdGNoIGZvbnQgbWV0cmljcyBvbiBXaW5kb3dzLlxuXG52YXIgUmF0aW8gPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYkNoYXJTZXQ6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAvLyBDaGFyYWN0ZXIgc2V0XG4gIHhSYXRpbzogcmVzdHJ1Y3R1cmUudWludDgsXG4gIC8vIFZhbHVlIHRvIHVzZSBmb3IgeC1SYXRpb1xuICB5U3RhcnRSYXRpbzogcmVzdHJ1Y3R1cmUudWludDgsXG4gIC8vIFN0YXJ0aW5nIHktUmF0aW8gdmFsdWVcbiAgeUVuZFJhdGlvOiByZXN0cnVjdHVyZS51aW50OCAvLyBFbmRpbmcgeS1SYXRpbyB2YWx1ZVxuXG59KTtcbnZhciB2VGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgeVBlbEhlaWdodDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyB5UGVsSGVpZ2h0IHRvIHdoaWNoIHZhbHVlcyBhcHBseVxuICB5TWF4OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gTWF4aW11bSB2YWx1ZSAoaW4gcGVscykgZm9yIHRoaXMgeVBlbEhlaWdodFxuICB5TWluOiByZXN0cnVjdHVyZS5pbnQxNiAvLyBNaW5pbXVtIHZhbHVlIChpbiBwZWxzKSBmb3IgdGhpcyB5UGVsSGVpZ2h0XG5cbn0pO1xudmFyIFZkbXhHcm91cCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICByZWNzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE51bWJlciBvZiBoZWlnaHQgcmVjb3JkcyBpbiB0aGlzIGdyb3VwXG4gIHN0YXJ0c3o6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAvLyBTdGFydGluZyB5UGVsSGVpZ2h0XG4gIGVuZHN6OiByZXN0cnVjdHVyZS51aW50OCxcbiAgLy8gRW5kaW5nIHlQZWxIZWlnaHRcbiAgZW50cmllczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHZUYWJsZSwgJ3JlY3MnKSAvLyBUaGUgVkRNWCByZWNvcmRzXG5cbn0pO1xudmFyIFZETVggPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBWZXJzaW9uIG51bWJlciAoMCBvciAxKVxuICBudW1SZWNzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE51bWJlciBvZiBWRE1YIGdyb3VwcyBwcmVzZW50XG4gIG51bVJhdGlvczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBOdW1iZXIgb2YgYXNwZWN0IHJhdGlvIGdyb3VwaW5nc1xuICByYXRpb1JhbmdlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFJhdGlvLCAnbnVtUmF0aW9zJyksXG4gIC8vIFJhdGlvIHJhbmdlc1xuICBvZmZzZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnbnVtUmF0aW9zJyksXG4gIC8vIE9mZnNldCB0byB0aGUgVkRNWCBncm91cCBmb3IgdGhpcyByYXRpbyByYW5nZVxuICBncm91cHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShWZG14R3JvdXAsICdudW1SZWNzJykgLy8gVGhlIGFjdHVhbCBWRE1YIGdyb3VwaW5nc1xuXG59KTtcblxudmFyIHZoZWEgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGUgVmVydGljYWwgSGVhZGVyIFRhYmxlXG4gIGFzY2VudDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIFRoZSB2ZXJ0aWNhbCB0eXBvZ3JhcGhpYyBhc2NlbmRlciBmb3IgdGhpcyBmb250XG4gIGRlc2NlbnQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBUaGUgdmVydGljYWwgdHlwb2dyYXBoaWMgZGVzY2VuZGVyIGZvciB0aGlzIGZvbnRcbiAgbGluZUdhcDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIFRoZSB2ZXJ0aWNhbCB0eXBvZ3JhcGhpYyBsaW5lIGdhcCBmb3IgdGhpcyBmb250XG4gIGFkdmFuY2VIZWlnaHRNYXg6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBUaGUgbWF4aW11bSBhZHZhbmNlIGhlaWdodCBtZWFzdXJlbWVudCBmb3VuZCBpbiB0aGUgZm9udFxuICBtaW5Ub3BTaWRlQmVhcmluZzogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIFRoZSBtaW5pbXVtIHRvcCBzaWRlIGJlYXJpbmcgbWVhc3VyZW1lbnQgZm91bmQgaW4gdGhlIGZvbnRcbiAgbWluQm90dG9tU2lkZUJlYXJpbmc6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBUaGUgbWluaW11bSBib3R0b20gc2lkZSBiZWFyaW5nIG1lYXN1cmVtZW50IGZvdW5kIGluIHRoZSBmb250XG4gIHlNYXhFeHRlbnQ6IHJlc3RydWN0dXJlLmludDE2LFxuICBjYXJldFNsb3BlUmlzZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIENhcmV0IHNsb3BlIChyaXNlL3J1bilcbiAgY2FyZXRTbG9wZVJ1bjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIGNhcmV0T2Zmc2V0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gU2V0IHZhbHVlIGVxdWFsIHRvIDAgZm9yIG5vbnNsYW50ZWQgZm9udHNcbiAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS5pbnQxNiwgNCksXG4gIG1ldHJpY0RhdGFGb3JtYXQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBTZXQgdG8gMFxuICBudW1iZXJPZk1ldHJpY3M6IHJlc3RydWN0dXJlLnVpbnQxNiAvLyBOdW1iZXIgb2YgYWR2YW5jZSBoZWlnaHRzIGluIHRoZSBWZXJ0aWNhbCBNZXRyaWNzIHRhYmxlXG5cbn0pO1xuXG52YXIgVm10eEVudHJ5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGFkdmFuY2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gVGhlIGFkdmFuY2UgaGVpZ2h0IG9mIHRoZSBnbHlwaFxuICBiZWFyaW5nOiByZXN0cnVjdHVyZS5pbnQxNiAvLyBUaGUgdG9wIHNpZGViZWFyaW5nIG9mIHRoZSBnbHlwaFxuXG59KTsgLy8gVmVydGljYWwgTWV0cmljcyBUYWJsZVxuXG52YXIgdm10eCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBtZXRyaWNzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KFZtdHhFbnRyeSwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQudmhlYS5udW1iZXJPZk1ldHJpY3M7XG4gIH0pLFxuICBiZWFyaW5nczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS5pbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQubWF4cC5udW1HbHlwaHMgLSB0LnBhcmVudC52aGVhLm51bWJlck9mTWV0cmljcztcbiAgfSlcbn0pO1xuXG52YXIgc2hvcnRGcmFjID0gbmV3IHJlc3RydWN0dXJlLkZpeGVkKDE2LCAnQkUnLCAxNCk7XG52YXIgQ29ycmVzcG9uZGVuY2UgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZnJvbUNvb3JkOiBzaG9ydEZyYWMsXG4gIHRvQ29vcmQ6IHNob3J0RnJhY1xufSk7XG52YXIgU2VnbWVudCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBwYWlyQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgY29ycmVzcG9uZGVuY2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShDb3JyZXNwb25kZW5jZSwgJ3BhaXJDb3VudCcpXG59KTtcbnZhciBhdmFyID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIGF4aXNDb3VudDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBzZWdtZW50OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoU2VnbWVudCwgJ2F4aXNDb3VudCcpXG59KTtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkMihzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIFVuYm91bmRlZEFycmF5QWNjZXNzb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBVbmJvdW5kZWRBcnJheUFjY2Vzc29yKHR5cGUsIHN0cmVhbSwgcGFyZW50KSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLmJhc2UgPSB0aGlzLnN0cmVhbS5wb3M7XG4gICAgdGhpcy5faXRlbXMgPSBbXTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBVbmJvdW5kZWRBcnJheUFjY2Vzc29yLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0SXRlbSA9IGZ1bmN0aW9uIGdldEl0ZW0oaW5kZXgpIHtcbiAgICBpZiAodGhpcy5faXRlbXNbaW5kZXhdID09IG51bGwpIHtcbiAgICAgIHZhciBwb3MgPSB0aGlzLnN0cmVhbS5wb3M7XG4gICAgICB0aGlzLnN0cmVhbS5wb3MgPSB0aGlzLmJhc2UgKyB0aGlzLnR5cGUuc2l6ZShudWxsLCB0aGlzLnBhcmVudCkgKiBpbmRleDtcbiAgICAgIHRoaXMuX2l0ZW1zW2luZGV4XSA9IHRoaXMudHlwZS5kZWNvZGUodGhpcy5zdHJlYW0sIHRoaXMucGFyZW50KTtcbiAgICAgIHRoaXMuc3RyZWFtLnBvcyA9IHBvcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5faXRlbXNbaW5kZXhdO1xuICB9O1xuXG4gIF9wcm90by5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgICByZXR1cm4gXCJbVW5ib3VuZGVkQXJyYXkgXCIgKyB0aGlzLnR5cGUuY29uc3RydWN0b3IubmFtZSArIFwiXVwiO1xuICB9O1xuXG4gIHJldHVybiBVbmJvdW5kZWRBcnJheUFjY2Vzc29yO1xufSgpO1xuXG52YXIgVW5ib3VuZGVkQXJyYXkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9yJEFycmF5KSB7XG4gIF9pbmhlcml0c0xvb3NlJDIoVW5ib3VuZGVkQXJyYXksIF9yJEFycmF5KTtcblxuICBmdW5jdGlvbiBVbmJvdW5kZWRBcnJheSh0eXBlKSB7XG4gICAgcmV0dXJuIF9yJEFycmF5LmNhbGwodGhpcywgdHlwZSwgMCkgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8yID0gVW5ib3VuZGVkQXJyYXkucHJvdG90eXBlO1xuXG4gIF9wcm90bzIuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgcmV0dXJuIG5ldyBVbmJvdW5kZWRBcnJheUFjY2Vzc29yKHRoaXMudHlwZSwgc3RyZWFtLCBwYXJlbnQpO1xuICB9O1xuXG4gIHJldHVybiBVbmJvdW5kZWRBcnJheTtcbn0ocmVzdHJ1Y3R1cmUuQXJyYXkpO1xudmFyIExvb2t1cFRhYmxlID0gZnVuY3Rpb24gTG9va3VwVGFibGUoVmFsdWVUeXBlKSB7XG4gIGlmIChWYWx1ZVR5cGUgPT09IHZvaWQgMCkge1xuICAgIFZhbHVlVHlwZSA9IHJlc3RydWN0dXJlLnVpbnQxNjtcbiAgfVxuXG4gIC8vIEhlbHBlciBjbGFzcyB0aGF0IG1ha2VzIGludGVybmFsIHN0cnVjdHVyZXMgaW52aXNpYmxlIHRvIHBvaW50ZXJzXG4gIHZhciBTaGFkb3cgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNoYWRvdyh0eXBlKSB7XG4gICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIH1cblxuICAgIHZhciBfcHJvdG8zID0gU2hhZG93LnByb3RvdHlwZTtcblxuICAgIF9wcm90bzMuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgY3R4KSB7XG4gICAgICBjdHggPSBjdHgucGFyZW50LnBhcmVudDtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSwgY3R4KTtcbiAgICB9O1xuXG4gICAgX3Byb3RvMy5zaXplID0gZnVuY3Rpb24gc2l6ZSh2YWwsIGN0eCkge1xuICAgICAgY3R4ID0gY3R4LnBhcmVudC5wYXJlbnQ7XG4gICAgICByZXR1cm4gdGhpcy50eXBlLnNpemUodmFsLCBjdHgpO1xuICAgIH07XG5cbiAgICBfcHJvdG8zLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHJlYW0sIHZhbCwgY3R4KSB7XG4gICAgICBjdHggPSBjdHgucGFyZW50LnBhcmVudDtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUuZW5jb2RlKHN0cmVhbSwgdmFsLCBjdHgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2hhZG93O1xuICB9KCk7XG5cbiAgVmFsdWVUeXBlID0gbmV3IFNoYWRvdyhWYWx1ZVR5cGUpO1xuICB2YXIgQmluYXJ5U2VhcmNoSGVhZGVyID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gICAgdW5pdFNpemU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBuVW5pdHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBzZWFyY2hSYW5nZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGVudHJ5U2VsZWN0b3I6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICByYW5nZVNoaWZ0OiByZXN0cnVjdHVyZS51aW50MTZcbiAgfSk7XG4gIHZhciBMb29rdXBTZWdtZW50U2luZ2xlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gICAgbGFzdEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZmlyc3RHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHZhbHVlOiBWYWx1ZVR5cGVcbiAgfSk7XG4gIHZhciBMb29rdXBTZWdtZW50QXJyYXkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgICBsYXN0R2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBmaXJzdEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgdmFsdWVzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIG5ldyByZXN0cnVjdHVyZS5BcnJheShWYWx1ZVR5cGUsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5sYXN0R2x5cGggLSB0LmZpcnN0R2x5cGggKyAxO1xuICAgIH0pLCB7XG4gICAgICB0eXBlOiAncGFyZW50J1xuICAgIH0pXG4gIH0pO1xuICB2YXIgTG9va3VwU2luZ2xlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gICAgZ2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICB2YWx1ZTogVmFsdWVUeXBlXG4gIH0pO1xuICByZXR1cm4gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgICAwOiB7XG4gICAgICB2YWx1ZXM6IG5ldyBVbmJvdW5kZWRBcnJheShWYWx1ZVR5cGUpIC8vIGxlbmd0aCA9PSBudW1iZXIgb2YgZ2x5cGhzIG1heWJlP1xuXG4gICAgfSxcbiAgICAyOiB7XG4gICAgICBiaW5hcnlTZWFyY2hIZWFkZXI6IEJpbmFyeVNlYXJjaEhlYWRlcixcbiAgICAgIHNlZ21lbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTG9va3VwU2VnbWVudFNpbmdsZSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuYmluYXJ5U2VhcmNoSGVhZGVyLm5Vbml0cztcbiAgICAgIH0pXG4gICAgfSxcbiAgICA0OiB7XG4gICAgICBiaW5hcnlTZWFyY2hIZWFkZXI6IEJpbmFyeVNlYXJjaEhlYWRlcixcbiAgICAgIHNlZ21lbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTG9va3VwU2VnbWVudEFycmF5LCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5iaW5hcnlTZWFyY2hIZWFkZXIublVuaXRzO1xuICAgICAgfSlcbiAgICB9LFxuICAgIDY6IHtcbiAgICAgIGJpbmFyeVNlYXJjaEhlYWRlcjogQmluYXJ5U2VhcmNoSGVhZGVyLFxuICAgICAgc2VnbWVudHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShMb29rdXBTaW5nbGUsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmJpbmFyeVNlYXJjaEhlYWRlci5uVW5pdHM7XG4gICAgICB9KVxuICAgIH0sXG4gICAgODoge1xuICAgICAgZmlyc3RHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgICAgY291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAgIHZhbHVlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFZhbHVlVHlwZSwgJ2NvdW50JylcbiAgICB9XG4gIH0pO1xufTtcbmZ1bmN0aW9uIFN0YXRlVGFibGUoZW50cnlEYXRhLCBsb29rdXBUeXBlKSB7XG4gIGlmIChlbnRyeURhdGEgPT09IHZvaWQgMCkge1xuICAgIGVudHJ5RGF0YSA9IHt9O1xuICB9XG5cbiAgaWYgKGxvb2t1cFR5cGUgPT09IHZvaWQgMCkge1xuICAgIGxvb2t1cFR5cGUgPSByZXN0cnVjdHVyZS51aW50MTY7XG4gIH1cblxuICB2YXIgZW50cnkgPSBPYmplY3QuYXNzaWduKHtcbiAgICBuZXdTdGF0ZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGZsYWdzOiByZXN0cnVjdHVyZS51aW50MTZcbiAgfSwgZW50cnlEYXRhKTtcbiAgdmFyIEVudHJ5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdChlbnRyeSk7XG4gIHZhciBTdGF0ZUFycmF5ID0gbmV3IFVuYm91bmRlZEFycmF5KG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQubkNsYXNzZXM7XG4gIH0pKTtcbiAgdmFyIFN0YXRlSGVhZGVyID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gICAgbkNsYXNzZXM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBjbGFzc1RhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyBMb29rdXBUYWJsZShsb29rdXBUeXBlKSksXG4gICAgc3RhdGVBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBTdGF0ZUFycmF5KSxcbiAgICBlbnRyeVRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyBVbmJvdW5kZWRBcnJheShFbnRyeSkpXG4gIH0pO1xuICByZXR1cm4gU3RhdGVIZWFkZXI7XG59IC8vIFRoaXMgaXMgdGhlIG9sZCB2ZXJzaW9uIG9mIHRoZSBTdGF0ZVRhYmxlIHN0cnVjdHVyZVxuXG5mdW5jdGlvbiBTdGF0ZVRhYmxlMShlbnRyeURhdGEsIGxvb2t1cFR5cGUpIHtcbiAgaWYgKGVudHJ5RGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgZW50cnlEYXRhID0ge307XG4gIH1cblxuICBpZiAobG9va3VwVHlwZSA9PT0gdm9pZCAwKSB7XG4gICAgbG9va3VwVHlwZSA9IHJlc3RydWN0dXJlLnVpbnQxNjtcbiAgfVxuXG4gIHZhciBDbGFzc0xvb2t1cFRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gICAgdmVyc2lvbjogZnVuY3Rpb24gdmVyc2lvbigpIHtcbiAgICAgIHJldHVybiA4O1xuICAgIH0sXG4gICAgLy8gc2ltdWxhdGUgTG9va3VwVGFibGVcbiAgICBmaXJzdEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgdmFsdWVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsIHJlc3RydWN0dXJlLnVpbnQxNilcbiAgfSk7XG4gIHZhciBlbnRyeSA9IE9iamVjdC5hc3NpZ24oe1xuICAgIG5ld1N0YXRlT2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gY29udmVydCBvZmZzZXQgdG8gc3RhdGVBcnJheSBpbmRleFxuICAgIG5ld1N0YXRlOiBmdW5jdGlvbiBuZXdTdGF0ZSh0KSB7XG4gICAgICByZXR1cm4gKHQubmV3U3RhdGVPZmZzZXQgLSAodC5wYXJlbnQuc3RhdGVBcnJheS5iYXNlIC0gdC5wYXJlbnQuX3N0YXJ0T2Zmc2V0KSkgLyB0LnBhcmVudC5uQ2xhc3NlcztcbiAgICB9LFxuICAgIGZsYWdzOiByZXN0cnVjdHVyZS51aW50MTZcbiAgfSwgZW50cnlEYXRhKTtcbiAgdmFyIEVudHJ5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdChlbnRyeSk7XG4gIHZhciBTdGF0ZUFycmF5ID0gbmV3IFVuYm91bmRlZEFycmF5KG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5uQ2xhc3NlcztcbiAgfSkpO1xuICB2YXIgU3RhdGVIZWFkZXIxID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gICAgbkNsYXNzZXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjbGFzc1RhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzTG9va3VwVGFibGUpLFxuICAgIHN0YXRlQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgU3RhdGVBcnJheSksXG4gICAgZW50cnlUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBuZXcgVW5ib3VuZGVkQXJyYXkoRW50cnkpKVxuICB9KTtcbiAgcmV0dXJuIFN0YXRlSGVhZGVyMTtcbn1cblxudmFyIEJzbG5TdWJ0YWJsZSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QoJ2Zvcm1hdCcsIHtcbiAgMDoge1xuICAgIC8vIERpc3RhbmNlLWJhc2VkLCBubyBtYXBwaW5nXG4gICAgZGVsdGFzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUuaW50MTYsIDMyKVxuICB9LFxuICAxOiB7XG4gICAgLy8gRGlzdGFuY2UtYmFzZWQsIHdpdGggbWFwcGluZ1xuICAgIGRlbHRhczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLmludDE2LCAzMiksXG4gICAgbWFwcGluZ0RhdGE6IG5ldyBMb29rdXBUYWJsZShyZXN0cnVjdHVyZS51aW50MTYpXG4gIH0sXG4gIDI6IHtcbiAgICAvLyBDb250cm9sIHBvaW50LWJhc2VkLCBubyBtYXBwaW5nXG4gICAgc3RhbmRhcmRHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvbnRyb2xQb2ludHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIDMyKVxuICB9LFxuICAzOiB7XG4gICAgLy8gQ29udHJvbCBwb2ludC1iYXNlZCwgd2l0aCBtYXBwaW5nXG4gICAgc3RhbmRhcmRHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvbnRyb2xQb2ludHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIDMyKSxcbiAgICBtYXBwaW5nRGF0YTogbmV3IExvb2t1cFRhYmxlKHJlc3RydWN0dXJlLnVpbnQxNilcbiAgfVxufSk7XG52YXIgYnNsbiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBmb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZGVmYXVsdEJhc2VsaW5lOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHN1YnRhYmxlOiBCc2xuU3VidGFibGVcbn0pO1xuXG52YXIgU2V0dGluZyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBzZXR0aW5nOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG5hbWVJbmRleDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIG5hbWU6IGZ1bmN0aW9uIG5hbWUodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5wYXJlbnQucGFyZW50Lm5hbWUucmVjb3Jkcy5mb250RmVhdHVyZXNbdC5uYW1lSW5kZXhdO1xuICB9XG59KTtcbnZhciBGZWF0dXJlTmFtZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmZWF0dXJlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG5TZXR0aW5nczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzZXR0aW5nVGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KFNldHRpbmcsICduU2V0dGluZ3MnKSwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pLFxuICBmZWF0dXJlRmxhZ3M6IG5ldyByZXN0cnVjdHVyZS5CaXRmaWVsZChyZXN0cnVjdHVyZS51aW50OCwgW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICdoYXNEZWZhdWx0JywgJ2V4Y2x1c2l2ZSddKSxcbiAgZGVmYXVsdFNldHRpbmc6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBuYW1lSW5kZXg6IHJlc3RydWN0dXJlLmludDE2LFxuICBuYW1lOiBmdW5jdGlvbiBuYW1lKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQucGFyZW50Lm5hbWUucmVjb3Jkcy5mb250RmVhdHVyZXNbdC5uYW1lSW5kZXhdO1xuICB9XG59KTtcbnZhciBmZWF0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIGZlYXR1cmVOYW1lQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcmVzZXJ2ZWQxOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgcmVzZXJ2ZWQyOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDMyKSxcbiAgZmVhdHVyZU5hbWVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRmVhdHVyZU5hbWUsICdmZWF0dXJlTmFtZUNvdW50Jylcbn0pO1xuXG52YXIgQXhpcyQxID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGF4aXNUYWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIG1pblZhbHVlOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBkZWZhdWx0VmFsdWU6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIG1heFZhbHVlOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBmbGFnczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBuYW1lSUQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbmFtZTogZnVuY3Rpb24gbmFtZSh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LnBhcmVudC5uYW1lLnJlY29yZHMuZm9udEZlYXR1cmVzW3QubmFtZUlEXTtcbiAgfVxufSk7XG52YXIgSW5zdGFuY2UgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbmFtZUlEOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG5hbWU6IGZ1bmN0aW9uIG5hbWUodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5wYXJlbnQubmFtZS5yZWNvcmRzLmZvbnRGZWF0dXJlc1t0Lm5hbWVJRF07XG4gIH0sXG4gIGZsYWdzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGNvb3JkOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUuZml4ZWQzMiwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQuYXhpc0NvdW50O1xuICB9KSxcbiAgcG9zdHNjcmlwdE5hbWVJRDogbmV3IHJlc3RydWN0dXJlLk9wdGlvbmFsKHJlc3RydWN0dXJlLnVpbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQuaW5zdGFuY2VTaXplIC0gdC5fY3VycmVudE9mZnNldCA+IDA7XG4gIH0pXG59KTtcbnZhciBmdmFyID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIG9mZnNldFRvRGF0YTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBjb3VudFNpemVQYWlyczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBheGlzQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgYXhpc1NpemU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgaW5zdGFuY2VDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBpbnN0YW5jZVNpemU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgYXhpczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEF4aXMkMSwgJ2F4aXNDb3VudCcpLFxuICBpbnN0YW5jZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KEluc3RhbmNlLCAnaW5zdGFuY2VDb3VudCcpXG59KTtcblxudmFyIHNob3J0RnJhYyQxID0gbmV3IHJlc3RydWN0dXJlLkZpeGVkKDE2LCAnQkUnLCAxNCk7XG5cbnZhciBPZmZzZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBPZmZzZXQoKSB7fVxuXG4gIE9mZnNldC5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICAvLyBJbiBzaG9ydCBmb3JtYXQsIG9mZnNldHMgYXJlIG11bHRpcGxpZWQgYnkgMi5cbiAgICAvLyBUaGlzIGRvZXNuJ3Qgc2VlbSB0byBiZSBkb2N1bWVudGVkIGJ5IEFwcGxlLCBidXQgaXRcbiAgICAvLyBpcyBpbXBsZW1lbnRlZCB0aGlzIHdheSBpbiBGcmVldHlwZS5cbiAgICByZXR1cm4gcGFyZW50LmZsYWdzID8gc3RyZWFtLnJlYWRVSW50MzJCRSgpIDogc3RyZWFtLnJlYWRVSW50MTZCRSgpICogMjtcbiAgfTtcblxuICByZXR1cm4gT2Zmc2V0O1xufSgpO1xuXG52YXIgZ3ZhciA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgYXhpc0NvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGdsb2JhbENvb3JkQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZ2xvYmFsQ29vcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoc2hvcnRGcmFjJDEsICdheGlzQ291bnQnKSwgJ2dsb2JhbENvb3JkQ291bnQnKSksXG4gIGdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgb2Zmc2V0VG9EYXRhOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG9mZnNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihPZmZzZXQsICd2b2lkJywge1xuICAgIHJlbGF0aXZlVG86ICdvZmZzZXRUb0RhdGEnLFxuICAgIGFsbG93TnVsbDogZmFsc2VcbiAgfSksIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuZ2x5cGhDb3VudCArIDE7XG4gIH0pXG59KTtcblxudmFyIENsYXNzVGFibGUkMSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgY292ZXJhZ2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc3ViRmVhdHVyZUZsYWdzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHN0YXRlVGFibGU6IG5ldyBTdGF0ZVRhYmxlMSgpXG59KTtcbnZhciBXaWR0aERlbHRhUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGp1c3RDbGFzczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBiZWZvcmVHcm93TGltaXQ6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIGJlZm9yZVNocmlua0xpbWl0OiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBhZnRlckdyb3dMaW1pdDogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgYWZ0ZXJTaHJpbmtMaW1pdDogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgZ3Jvd0ZsYWdzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHNocmlua0ZsYWdzOiByZXN0cnVjdHVyZS51aW50MTZcbn0pO1xudmFyIFdpZHRoRGVsdGFDbHVzdGVyID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KFdpZHRoRGVsdGFSZWNvcmQsIHJlc3RydWN0dXJlLnVpbnQzMik7XG52YXIgQWN0aW9uRGF0YSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QoJ2FjdGlvblR5cGUnLCB7XG4gIDA6IHtcbiAgICAvLyBEZWNvbXBvc2l0aW9uIGFjdGlvblxuICAgIGxvd2VyTGltaXQ6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gICAgdXBwZXJMaW1pdDogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgICBvcmRlcjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGdseXBoczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgcmVzdHJ1Y3R1cmUudWludDE2KVxuICB9LFxuICAxOiB7XG4gICAgLy8gVW5jb25kaXRpb25hbCBhZGQgZ2x5cGggYWN0aW9uXG4gICAgYWRkR2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9LFxuICAyOiB7XG4gICAgLy8gQ29uZGl0aW9uYWwgYWRkIGdseXBoIGFjdGlvblxuICAgIHN1YnN0VGhyZXNob2xkOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICAgIGFkZEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgc3Vic3RHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH0sXG4gIDM6IHt9LFxuICAvLyBTdHJldGNoIGdseXBoIGFjdGlvbiAobm8gZGF0YSwgbm90IHN1cHBvcnRlZCBieSBDb3JlVGV4dClcbiAgNDoge1xuICAgIC8vIER1Y3RpbGUgZ2x5cGggYWN0aW9uIChub3Qgc3VwcG9ydGVkIGJ5IENvcmVUZXh0KVxuICAgIHZhcmlhdGlvbkF4aXM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBtaW5pbXVtTGltaXQ6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gICAgbm9TdHJldGNoVmFsdWU6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gICAgbWF4aW11bUxpbWl0OiByZXN0cnVjdHVyZS5maXhlZDMyXG4gIH0sXG4gIDU6IHtcbiAgICAvLyBSZXBlYXRlZCBhZGQgZ2x5cGggYWN0aW9uXG4gICAgZmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBnbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH1cbn0pO1xudmFyIEFjdGlvbiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBhY3Rpb25DbGFzczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBhY3Rpb25UeXBlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGFjdGlvbkxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBhY3Rpb25EYXRhOiBBY3Rpb25EYXRhLFxuICBwYWRkaW5nOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDgsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuYWN0aW9uTGVuZ3RoIC0gdC5fY3VycmVudE9mZnNldDtcbiAgfSlcbn0pO1xudmFyIFBvc3Rjb21wZW5zYXRpb25BY3Rpb24gPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQWN0aW9uLCByZXN0cnVjdHVyZS51aW50MzIpO1xudmFyIFBvc3RDb21wZW5zYXRpb25UYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBsb29rdXBUYWJsZTogbmV3IExvb2t1cFRhYmxlKG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgUG9zdGNvbXBlbnNhdGlvbkFjdGlvbikpXG59KTtcbnZhciBKdXN0aWZpY2F0aW9uVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgY2xhc3NUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc1RhYmxlJDEsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KSxcbiAgd2RjT2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHBvc3RDb21wZW5zYXRpb25UYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBQb3N0Q29tcGVuc2F0aW9uVGFibGUsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KSxcbiAgd2lkdGhEZWx0YUNsdXN0ZXJzOiBuZXcgTG9va3VwVGFibGUobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBXaWR0aERlbHRhQ2x1c3Rlciwge1xuICAgIHR5cGU6ICdwYXJlbnQnLFxuICAgIHJlbGF0aXZlVG86ICd3ZGNPZmZzZXQnXG4gIH0pKVxufSk7XG52YXIganVzdCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBob3Jpem9udGFsOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEp1c3RpZmljYXRpb25UYWJsZSksXG4gIHZlcnRpY2FsOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEp1c3RpZmljYXRpb25UYWJsZSlcbn0pO1xuXG52YXIgTGlnYXR1cmVEYXRhID0ge1xuICBhY3Rpb246IHJlc3RydWN0dXJlLnVpbnQxNlxufTtcbnZhciBDb250ZXh0dWFsRGF0YSA9IHtcbiAgbWFya0luZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGN1cnJlbnRJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2XG59O1xudmFyIEluc2VydGlvbkRhdGEgPSB7XG4gIGN1cnJlbnRJbnNlcnRJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtYXJrZWRJbnNlcnRJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2XG59O1xudmFyIFN1YnN0aXR1dGlvblRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGl0ZW1zOiBuZXcgVW5ib3VuZGVkQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgTG9va3VwVGFibGUoKSkpXG59KTtcbnZhciBTdWJ0YWJsZURhdGEgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KCd0eXBlJywge1xuICAwOiB7XG4gICAgLy8gSW5kaWMgUmVhcnJhbmdlbWVudCBTdWJ0YWJsZVxuICAgIHN0YXRlVGFibGU6IG5ldyBTdGF0ZVRhYmxlKClcbiAgfSxcbiAgMToge1xuICAgIC8vIENvbnRleHR1YWwgR2x5cGggU3Vic3RpdHV0aW9uIFN1YnRhYmxlXG4gICAgc3RhdGVUYWJsZTogbmV3IFN0YXRlVGFibGUoQ29udGV4dHVhbERhdGEpLFxuICAgIHN1YnN0aXR1dGlvblRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIFN1YnN0aXR1dGlvblRhYmxlKVxuICB9LFxuICAyOiB7XG4gICAgLy8gTGlnYXR1cmUgc3VidGFibGVcbiAgICBzdGF0ZVRhYmxlOiBuZXcgU3RhdGVUYWJsZShMaWdhdHVyZURhdGEpLFxuICAgIGxpZ2F0dXJlQWN0aW9uczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgVW5ib3VuZGVkQXJyYXkocmVzdHJ1Y3R1cmUudWludDMyKSksXG4gICAgY29tcG9uZW50czogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgVW5ib3VuZGVkQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2KSksXG4gICAgbGlnYXR1cmVMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyBVbmJvdW5kZWRBcnJheShyZXN0cnVjdHVyZS51aW50MTYpKVxuICB9LFxuICA0OiB7XG4gICAgLy8gTm9uLWNvbnRleHR1YWwgR2x5cGggU3Vic3RpdHV0aW9uIFN1YnRhYmxlXG4gICAgbG9va3VwVGFibGU6IG5ldyBMb29rdXBUYWJsZSgpXG4gIH0sXG4gIDU6IHtcbiAgICAvLyBHbHlwaCBJbnNlcnRpb24gU3VidGFibGVcbiAgICBzdGF0ZVRhYmxlOiBuZXcgU3RhdGVUYWJsZShJbnNlcnRpb25EYXRhKSxcbiAgICBpbnNlcnRpb25BY3Rpb25zOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyBVbmJvdW5kZWRBcnJheShyZXN0cnVjdHVyZS51aW50MTYpKVxuICB9XG59KTtcbnZhciBTdWJ0YWJsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgY292ZXJhZ2U6IHJlc3RydWN0dXJlLnVpbnQyNCxcbiAgdHlwZTogcmVzdHJ1Y3R1cmUudWludDgsXG4gIHN1YkZlYXR1cmVGbGFnczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICB0YWJsZTogU3VidGFibGVEYXRhLFxuICBwYWRkaW5nOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDgsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQubGVuZ3RoIC0gdC5fY3VycmVudE9mZnNldDtcbiAgfSlcbn0pO1xudmFyIEZlYXR1cmVFbnRyeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmZWF0dXJlVHlwZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBmZWF0dXJlU2V0dGluZzogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBlbmFibGVGbGFnczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBkaXNhYmxlRmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQzMlxufSk7XG52YXIgTW9yeENoYWluID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGRlZmF1bHRGbGFnczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBjaGFpbkxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBuRmVhdHVyZUVudHJpZXM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgblN1YnRhYmxlczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBmZWF0dXJlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEZlYXR1cmVFbnRyeSwgJ25GZWF0dXJlRW50cmllcycpLFxuICBzdWJ0YWJsZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShTdWJ0YWJsZSwgJ25TdWJ0YWJsZXMnKVxufSk7XG52YXIgbW9yeCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHVudXNlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gIG5DaGFpbnM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgY2hhaW5zOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTW9yeENoYWluLCAnbkNoYWlucycpXG59KTtcblxudmFyIE9wdGljYWxCb3VuZHMgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbGVmdDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHRvcDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHJpZ2h0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgYm90dG9tOiByZXN0cnVjdHVyZS5pbnQxNlxufSk7XG52YXIgb3BiZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBmb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbG9va3VwVGFibGU6IG5ldyBMb29rdXBUYWJsZShPcHRpY2FsQm91bmRzKVxufSk7XG5cbnZhciB0YWJsZXMgPSB7fTtcbnRhYmxlcy5jbWFwID0gY21hcDtcbnRhYmxlcy5oZWFkID0gaGVhZDtcbnRhYmxlcy5oaGVhID0gaGhlYTtcbnRhYmxlcy5obXR4ID0gaG10eDtcbnRhYmxlcy5tYXhwID0gbWF4cDtcbnRhYmxlcy5uYW1lID0gTmFtZVRhYmxlO1xudGFibGVzWydPUy8yJ10gPSBPUzI7XG50YWJsZXMucG9zdCA9IHBvc3Q7IC8vIFRydWVUeXBlIE91dGxpbmVzXG50YWJsZXMuZnBnbSA9IGZwZ207XG50YWJsZXMubG9jYSA9IGxvY2E7XG50YWJsZXMucHJlcCA9IHByZXA7XG50YWJsZXNbJ2N2dCAnXSA9IGN2dDtcbnRhYmxlcy5nbHlmID0gZ2x5ZjsgLy8gUG9zdFNjcmlwdCBPdXRsaW5lc1xudGFibGVzWydDRkYgJ10gPSBDRkZGb250O1xudGFibGVzWydDRkYyJ10gPSBDRkZGb250O1xudGFibGVzLlZPUkcgPSBWT1JHOyAvLyBCaXRtYXAgR2x5cGhzXG50YWJsZXMuRUJMQyA9IEVCTEM7XG50YWJsZXMuQ0JMQyA9IHRhYmxlcy5FQkxDO1xudGFibGVzLnNiaXggPSBzYml4O1xudGFibGVzLkNPTFIgPSBDT0xSO1xudGFibGVzLkNQQUwgPSBDUEFMOyAvLyBBZHZhbmNlZCBPcGVuVHlwZSBUYWJsZXNcbnRhYmxlcy5CQVNFID0gQkFTRTtcbnRhYmxlcy5HREVGID0gR0RFRjtcbnRhYmxlcy5HUE9TID0gR1BPUztcbnRhYmxlcy5HU1VCID0gR1NVQjtcbnRhYmxlcy5KU1RGID0gSlNURjsgLy8gT3BlblR5cGUgdmFyaWF0aW9ucyB0YWJsZXNcbnRhYmxlcy5IVkFSID0gSFZBUjsgLy8gT3RoZXIgT3BlblR5cGUgVGFibGVzXG50YWJsZXMuRFNJRyA9IERTSUc7XG50YWJsZXMuZ2FzcCA9IGdhc3A7XG50YWJsZXMuaGRteCA9IGhkbXg7XG50YWJsZXMua2VybiA9IGtlcm47XG50YWJsZXMuTFRTSCA9IExUU0g7XG50YWJsZXMuUENMVCA9IFBDTFQ7XG50YWJsZXMuVkRNWCA9IFZETVg7XG50YWJsZXMudmhlYSA9IHZoZWE7XG50YWJsZXMudm10eCA9IHZtdHg7IC8vIEFwcGxlIEFkdmFuY2VkIFR5cG9ncmFwaHkgVGFibGVzXG50YWJsZXMuYXZhciA9IGF2YXI7XG50YWJsZXMuYnNsbiA9IGJzbG47XG50YWJsZXMuZmVhdCA9IGZlYXQ7XG50YWJsZXMuZnZhciA9IGZ2YXI7XG50YWJsZXMuZ3ZhciA9IGd2YXI7XG50YWJsZXMuanVzdCA9IGp1c3Q7XG50YWJsZXMubW9yeCA9IG1vcng7XG50YWJsZXMub3BiZCA9IG9wYmQ7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkMyhvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkMyhvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkMyhvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDMobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQzKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkMyhhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cbnZhciBUYWJsZUVudHJ5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgY2hlY2tTdW06IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgb2Zmc2V0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsICd2b2lkJywge1xuICAgIHR5cGU6ICdnbG9iYWwnXG4gIH0pLFxuICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMlxufSk7XG52YXIgRGlyZWN0b3J5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgbnVtVGFibGVzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHNlYXJjaFJhbmdlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGVudHJ5U2VsZWN0b3I6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcmFuZ2VTaGlmdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB0YWJsZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShUYWJsZUVudHJ5LCAnbnVtVGFibGVzJylcbn0pO1xuXG5EaXJlY3RvcnkucHJvY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRhYmxlcyA9IHt9O1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkMyh0aGlzLnRhYmxlcyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgdmFyIHRhYmxlID0gX3N0ZXAudmFsdWU7XG4gICAgdGFibGVzW3RhYmxlLnRhZ10gPSB0YWJsZTtcbiAgfVxuXG4gIHRoaXMudGFibGVzID0gdGFibGVzO1xufTtcblxuRGlyZWN0b3J5LnByZUVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHRhYmxlcyQxID0gW107XG5cbiAgZm9yICh2YXIgdGFnIGluIHRoaXMudGFibGVzKSB7XG4gICAgdmFyIHRhYmxlID0gdGhpcy50YWJsZXNbdGFnXTtcblxuICAgIGlmICh0YWJsZSkge1xuICAgICAgdGFibGVzJDEucHVzaCh7XG4gICAgICAgIHRhZzogdGFnLFxuICAgICAgICBjaGVja1N1bTogMCxcbiAgICAgICAgb2Zmc2V0OiBuZXcgcmVzdHJ1Y3R1cmUuVm9pZFBvaW50ZXIodGFibGVzW3RhZ10sIHRhYmxlKSxcbiAgICAgICAgbGVuZ3RoOiB0YWJsZXNbdGFnXS5zaXplKHRhYmxlKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy50YWcgPSAndHJ1ZSc7XG4gIHRoaXMubnVtVGFibGVzID0gdGFibGVzJDEubGVuZ3RoO1xuICB0aGlzLnRhYmxlcyA9IHRhYmxlcyQxO1xuICB2YXIgbWF4RXhwb25lbnRGb3IyID0gTWF0aC5mbG9vcihNYXRoLmxvZyh0aGlzLm51bVRhYmxlcykgLyBNYXRoLkxOMik7XG4gIHZhciBtYXhQb3dlck9mMiA9IE1hdGgucG93KDIsIG1heEV4cG9uZW50Rm9yMik7XG4gIHRoaXMuc2VhcmNoUmFuZ2UgPSBtYXhQb3dlck9mMiAqIDE2O1xuICB0aGlzLmVudHJ5U2VsZWN0b3IgPSBNYXRoLmxvZyhtYXhQb3dlck9mMikgLyBNYXRoLkxOMjtcbiAgdGhpcy5yYW5nZVNoaWZ0ID0gdGhpcy5udW1UYWJsZXMgKiAxNiAtIHRoaXMuc2VhcmNoUmFuZ2U7XG59O1xuXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2goYXJyLCBjbXApIHtcbiAgdmFyIG1pbiA9IDA7XG4gIHZhciBtYXggPSBhcnIubGVuZ3RoIC0gMTtcblxuICB3aGlsZSAobWluIDw9IG1heCkge1xuICAgIHZhciBtaWQgPSBtaW4gKyBtYXggPj4gMTtcbiAgICB2YXIgcmVzID0gY21wKGFyclttaWRdKTtcblxuICAgIGlmIChyZXMgPCAwKSB7XG4gICAgICBtYXggPSBtaWQgLSAxO1xuICAgIH0gZWxzZSBpZiAocmVzID4gMCkge1xuICAgICAgbWluID0gbWlkICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiByYW5nZShpbmRleCwgZW5kKSB7XG4gIHZhciByYW5nZSA9IFtdO1xuXG4gIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgIHJhbmdlLnB1c2goaW5kZXgrKyk7XG4gIH1cblxuICByZXR1cm4gcmFuZ2U7XG59XG5cbnZhciBfY2xhc3M7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNChvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkNChvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkNChvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDQobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ0KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkNChhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5LCBkZWNvcmF0b3JzLCBkZXNjcmlwdG9yLCBjb250ZXh0KSB7IHZhciBkZXNjID0ge307IE9iamVjdC5rZXlzKGRlc2NyaXB0b3IpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBkZXNjW2tleV0gPSBkZXNjcmlwdG9yW2tleV07IH0pOyBkZXNjLmVudW1lcmFibGUgPSAhIWRlc2MuZW51bWVyYWJsZTsgZGVzYy5jb25maWd1cmFibGUgPSAhIWRlc2MuY29uZmlndXJhYmxlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjIHx8IGRlc2MuaW5pdGlhbGl6ZXIpIHsgZGVzYy53cml0YWJsZSA9IHRydWU7IH0gZGVzYyA9IGRlY29yYXRvcnMuc2xpY2UoKS5yZXZlcnNlKCkucmVkdWNlKGZ1bmN0aW9uIChkZXNjLCBkZWNvcmF0b3IpIHsgcmV0dXJuIGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5LCBkZXNjKSB8fCBkZXNjOyB9LCBkZXNjKTsgaWYgKGNvbnRleHQgJiYgZGVzYy5pbml0aWFsaXplciAhPT0gdm9pZCAwKSB7IGRlc2MudmFsdWUgPSBkZXNjLmluaXRpYWxpemVyID8gZGVzYy5pbml0aWFsaXplci5jYWxsKGNvbnRleHQpIDogdm9pZCAwOyBkZXNjLmluaXRpYWxpemVyID0gdW5kZWZpbmVkOyB9IGlmIChkZXNjLmluaXRpYWxpemVyID09PSB2b2lkIDApIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIGRlc2MpOyBkZXNjID0gbnVsbDsgfSByZXR1cm4gZGVzYzsgfVxudmFyIENtYXBQcm9jZXNzb3IgPSAoX2NsYXNzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ21hcFByb2Nlc3NvcihjbWFwVGFibGUpIHtcbiAgICAvLyBBdHRlbXB0IHRvIGZpbmQgYSBVbmljb2RlIGNtYXAgZmlyc3RcbiAgICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgICB0aGlzLmNtYXAgPSB0aGlzLmZpbmRTdWJ0YWJsZShjbWFwVGFibGUsIFsvLyAzMi1iaXQgc3VidGFibGVzXG4gICAgWzMsIDEwXSwgWzAsIDZdLCBbMCwgNF0sIC8vIDE2LWJpdCBzdWJ0YWJsZXNcbiAgICBbMywgMV0sIFswLCAzXSwgWzAsIDJdLCBbMCwgMV0sIFswLCAwXV0pOyAvLyBJZiBub3QgdW5pY29kZSBjbWFwIHdhcyBmb3VuZCwgYW5kIGljb252LWxpdGUgaXMgaW5zdGFsbGVkLFxuICAgIC8vIHRha2UgdGhlIGZpcnN0IHRhYmxlIHdpdGggYSBzdXBwb3J0ZWQgZW5jb2RpbmcuXG5cbiAgICBpZiAoIXRoaXMuY21hcCAmJiBsaWIpIHtcbiAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNChjbWFwVGFibGUudGFibGVzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGNtYXAgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgdmFyIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcoY21hcC5wbGF0Zm9ybUlELCBjbWFwLmVuY29kaW5nSUQsIGNtYXAudGFibGUubGFuZ3VhZ2UgLSAxKTtcblxuICAgICAgICBpZiAobGliLmVuY29kaW5nRXhpc3RzKGVuY29kaW5nKSkge1xuICAgICAgICAgIHRoaXMuY21hcCA9IGNtYXAudGFibGU7XG4gICAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNtYXApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIGEgc3VwcG9ydGVkIGNtYXAgdGFibGVcIik7XG4gICAgfVxuXG4gICAgdGhpcy51dnMgPSB0aGlzLmZpbmRTdWJ0YWJsZShjbWFwVGFibGUsIFtbMCwgNV1dKTtcblxuICAgIGlmICh0aGlzLnV2cyAmJiB0aGlzLnV2cy52ZXJzaW9uICE9PSAxNCkge1xuICAgICAgdGhpcy51dnMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBDbWFwUHJvY2Vzc29yLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZmluZFN1YnRhYmxlID0gZnVuY3Rpb24gZmluZFN1YnRhYmxlKGNtYXBUYWJsZSwgcGFpcnMpIHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ0KHBhaXJzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgIHZhciBfc3RlcDIkdmFsdWUgPSBfc3RlcDIudmFsdWUsXG4gICAgICAgICAgcGxhdGZvcm1JRCA9IF9zdGVwMiR2YWx1ZVswXSxcbiAgICAgICAgICBlbmNvZGluZ0lEID0gX3N0ZXAyJHZhbHVlWzFdO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ0KGNtYXBUYWJsZS50YWJsZXMpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgICB2YXIgY21hcCA9IF9zdGVwMy52YWx1ZTtcblxuICAgICAgICBpZiAoY21hcC5wbGF0Zm9ybUlEID09PSBwbGF0Zm9ybUlEICYmIGNtYXAuZW5jb2RpbmdJRCA9PT0gZW5jb2RpbmdJRCkge1xuICAgICAgICAgIHJldHVybiBjbWFwLnRhYmxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX3Byb3RvLmxvb2t1cCA9IGZ1bmN0aW9uIGxvb2t1cChjb2RlcG9pbnQsIHZhcmlhdGlvblNlbGVjdG9yKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gVW5pY29kZSBjbWFwIGluIHRoaXMgZm9udCwgd2UgbmVlZCB0byByZS1lbmNvZGVcbiAgICAvLyB0aGUgY29kZXBvaW50IGluIHRoZSBlbmNvZGluZyB0aGF0IHRoZSBjbWFwIHN1cHBvcnRzLlxuICAgIGlmICh0aGlzLmVuY29kaW5nKSB7XG4gICAgICB2YXIgYnVmID0gbGliLmVuY29kZShTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlcG9pbnQpLCB0aGlzLmVuY29kaW5nKTtcbiAgICAgIGNvZGVwb2ludCA9IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvZGVwb2ludCA9IGNvZGVwb2ludCA8PCA4IHwgYnVmW2ldO1xuICAgICAgfSAvLyBPdGhlcndpc2UsIHRyeSB0byBnZXQgYSBVbmljb2RlIHZhcmlhdGlvbiBzZWxlY3RvciBmb3IgdGhpcyBjb2RlcG9pbnQgaWYgb25lIGlzIHByb3ZpZGVkLlxuXG4gICAgfSBlbHNlIGlmICh2YXJpYXRpb25TZWxlY3Rvcikge1xuICAgICAgdmFyIGdpZCA9IHRoaXMuZ2V0VmFyaWF0aW9uU2VsZWN0b3IoY29kZXBvaW50LCB2YXJpYXRpb25TZWxlY3Rvcik7XG5cbiAgICAgIGlmIChnaWQpIHtcbiAgICAgICAgcmV0dXJuIGdpZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY21hcCA9IHRoaXMuY21hcDtcblxuICAgIHN3aXRjaCAoY21hcC52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBjbWFwLmNvZGVNYXAuZ2V0KGNvZGVwb2ludCkgfHwgMDtcblxuICAgICAgY2FzZSA0OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIG1pbiA9IDA7XG4gICAgICAgICAgdmFyIG1heCA9IGNtYXAuc2VnQ291bnQgLSAxO1xuXG4gICAgICAgICAgd2hpbGUgKG1pbiA8PSBtYXgpIHtcbiAgICAgICAgICAgIHZhciBtaWQgPSBtaW4gKyBtYXggPj4gMTtcblxuICAgICAgICAgICAgaWYgKGNvZGVwb2ludCA8IGNtYXAuc3RhcnRDb2RlLmdldChtaWQpKSB7XG4gICAgICAgICAgICAgIG1heCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGVwb2ludCA+IGNtYXAuZW5kQ29kZS5nZXQobWlkKSkge1xuICAgICAgICAgICAgICBtaW4gPSBtaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIHJhbmdlT2Zmc2V0ID0gY21hcC5pZFJhbmdlT2Zmc2V0LmdldChtaWQpO1xuXG4gICAgICAgICAgICAgIHZhciBfZ2lkID0gdm9pZCAwO1xuXG4gICAgICAgICAgICAgIGlmIChyYW5nZU9mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIF9naWQgPSBjb2RlcG9pbnQgKyBjbWFwLmlkRGVsdGEuZ2V0KG1pZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gcmFuZ2VPZmZzZXQgLyAyICsgKGNvZGVwb2ludCAtIGNtYXAuc3RhcnRDb2RlLmdldChtaWQpKSAtIChjbWFwLnNlZ0NvdW50IC0gbWlkKTtcbiAgICAgICAgICAgICAgICBfZ2lkID0gY21hcC5nbHlwaEluZGV4QXJyYXkuZ2V0KGluZGV4KSB8fCAwO1xuXG4gICAgICAgICAgICAgICAgaWYgKF9naWQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgIF9naWQgKz0gY21hcC5pZERlbHRhLmdldChtaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBfZ2lkICYgMHhmZmZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgODpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPOiBjbWFwIGZvcm1hdCA4Jyk7XG5cbiAgICAgIGNhc2UgNjpcbiAgICAgIGNhc2UgMTA6XG4gICAgICAgIHJldHVybiBjbWFwLmdseXBoSW5kaWNlcy5nZXQoY29kZXBvaW50IC0gY21hcC5maXJzdENvZGUpIHx8IDA7XG5cbiAgICAgIGNhc2UgMTI6XG4gICAgICBjYXNlIDEzOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9taW4gPSAwO1xuXG4gICAgICAgICAgdmFyIF9tYXggPSBjbWFwLm5Hcm91cHMgLSAxO1xuXG4gICAgICAgICAgd2hpbGUgKF9taW4gPD0gX21heCkge1xuICAgICAgICAgICAgdmFyIF9taWQgPSBfbWluICsgX21heCA+PiAxO1xuXG4gICAgICAgICAgICB2YXIgZ3JvdXAgPSBjbWFwLmdyb3Vwcy5nZXQoX21pZCk7XG5cbiAgICAgICAgICAgIGlmIChjb2RlcG9pbnQgPCBncm91cC5zdGFydENoYXJDb2RlKSB7XG4gICAgICAgICAgICAgIF9tYXggPSBfbWlkIC0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXBvaW50ID4gZ3JvdXAuZW5kQ2hhckNvZGUpIHtcbiAgICAgICAgICAgICAgX21pbiA9IF9taWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGNtYXAudmVyc2lvbiA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAuZ2x5cGhJRCArIChjb2RlcG9pbnQgLSBncm91cC5zdGFydENoYXJDb2RlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAuZ2x5cGhJRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgMTQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVE9ETzogY21hcCBmb3JtYXQgMTQnKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBjbWFwIGZvcm1hdCBcIiArIGNtYXAudmVyc2lvbik7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5nZXRWYXJpYXRpb25TZWxlY3RvciA9IGZ1bmN0aW9uIGdldFZhcmlhdGlvblNlbGVjdG9yKGNvZGVwb2ludCwgdmFyaWF0aW9uU2VsZWN0b3IpIHtcbiAgICBpZiAoIXRoaXMudXZzKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICB2YXIgc2VsZWN0b3JzID0gdGhpcy51dnMudmFyU2VsZWN0b3JzLnRvQXJyYXkoKTtcbiAgICB2YXIgaSA9IGJpbmFyeVNlYXJjaChzZWxlY3RvcnMsIGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4gdmFyaWF0aW9uU2VsZWN0b3IgLSB4LnZhclNlbGVjdG9yO1xuICAgIH0pO1xuICAgIHZhciBzZWwgPSBzZWxlY3RvcnNbaV07XG5cbiAgICBpZiAoaSAhPT0gLTEgJiYgc2VsLmRlZmF1bHRVVlMpIHtcbiAgICAgIGkgPSBiaW5hcnlTZWFyY2goc2VsLmRlZmF1bHRVVlMsIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBjb2RlcG9pbnQgPCB4LnN0YXJ0VW5pY29kZVZhbHVlID8gLTEgOiBjb2RlcG9pbnQgPiB4LnN0YXJ0VW5pY29kZVZhbHVlICsgeC5hZGRpdGlvbmFsQ291bnQgPyArMSA6IDA7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaSAhPT0gLTEgJiYgc2VsLm5vbkRlZmF1bHRVVlMpIHtcbiAgICAgIGkgPSBiaW5hcnlTZWFyY2goc2VsLm5vbkRlZmF1bHRVVlMsIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBjb2RlcG9pbnQgLSB4LnVuaWNvZGVWYWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHNlbC5ub25EZWZhdWx0VVZTW2ldLmdseXBoSUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH07XG5cbiAgX3Byb3RvLmdldENoYXJhY3RlclNldCA9IGZ1bmN0aW9uIGdldENoYXJhY3RlclNldCgpIHtcbiAgICB2YXIgY21hcCA9IHRoaXMuY21hcDtcblxuICAgIHN3aXRjaCAoY21hcC52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiByYW5nZSgwLCBjbWFwLmNvZGVNYXAubGVuZ3RoKTtcblxuICAgICAgY2FzZSA0OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgICAgIHZhciBlbmRDb2RlcyA9IGNtYXAuZW5kQ29kZS50b0FycmF5KCk7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZENvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGFpbCA9IGVuZENvZGVzW2ldICsgMTtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGNtYXAuc3RhcnRDb2RlLmdldChpKTtcbiAgICAgICAgICAgIHJlcy5wdXNoLmFwcGx5KHJlcywgcmFuZ2Uoc3RhcnQsIHRhaWwpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgODpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPOiBjbWFwIGZvcm1hdCA4Jyk7XG5cbiAgICAgIGNhc2UgNjpcbiAgICAgIGNhc2UgMTA6XG4gICAgICAgIHJldHVybiByYW5nZShjbWFwLmZpcnN0Q29kZSwgY21hcC5maXJzdENvZGUgKyBjbWFwLmdseXBoSW5kaWNlcy5sZW5ndGgpO1xuXG4gICAgICBjYXNlIDEyOlxuICAgICAgY2FzZSAxMzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfcmVzID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ0KGNtYXAuZ3JvdXBzLnRvQXJyYXkoKSksIF9zdGVwNDsgIShfc3RlcDQgPSBfaXRlcmF0b3I0KCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgZ3JvdXAgPSBfc3RlcDQudmFsdWU7XG5cbiAgICAgICAgICAgIF9yZXMucHVzaC5hcHBseShfcmVzLCByYW5nZShncm91cC5zdGFydENoYXJDb2RlLCBncm91cC5lbmRDaGFyQ29kZSArIDEpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX3JlcztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDE0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE86IGNtYXAgZm9ybWF0IDE0Jyk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY21hcCBmb3JtYXQgXCIgKyBjbWFwLnZlcnNpb24pO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uY29kZVBvaW50c0ZvckdseXBoID0gZnVuY3Rpb24gY29kZVBvaW50c0ZvckdseXBoKGdpZCkge1xuICAgIHZhciBjbWFwID0gdGhpcy5jbWFwO1xuXG4gICAgc3dpdGNoIChjbWFwLnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciByZXMgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjbWFwLmNvZGVNYXAuZ2V0KGkpID09PSBnaWQpIHtcbiAgICAgICAgICAgICAgcmVzLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX3JlczIgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBjbWFwLnNlZ0NvdW50OyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgZW5kID0gY21hcC5lbmRDb2RlLmdldChfaSk7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBjbWFwLnN0YXJ0Q29kZS5nZXQoX2kpO1xuICAgICAgICAgICAgdmFyIHJhbmdlT2Zmc2V0ID0gY21hcC5pZFJhbmdlT2Zmc2V0LmdldChfaSk7XG4gICAgICAgICAgICB2YXIgZGVsdGEgPSBjbWFwLmlkRGVsdGEuZ2V0KF9pKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgYyA9IHN0YXJ0OyBjIDw9IGVuZDsgYysrKSB7XG4gICAgICAgICAgICAgIHZhciBnID0gMDtcblxuICAgICAgICAgICAgICBpZiAocmFuZ2VPZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBnID0gYyArIGRlbHRhO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHJhbmdlT2Zmc2V0IC8gMiArIChjIC0gc3RhcnQpIC0gKGNtYXAuc2VnQ291bnQgLSBfaSk7XG4gICAgICAgICAgICAgICAgZyA9IGNtYXAuZ2x5cGhJbmRleEFycmF5LmdldChpbmRleCkgfHwgMDtcblxuICAgICAgICAgICAgICAgIGlmIChnICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICBnICs9IGRlbHRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChnID09PSBnaWQpIHtcbiAgICAgICAgICAgICAgICBfcmVzMi5wdXNoKGMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9yZXMyO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgMTI6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX3JlczMgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDQoY21hcC5ncm91cHMudG9BcnJheSgpKSwgX3N0ZXA1OyAhKF9zdGVwNSA9IF9pdGVyYXRvcjUoKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBncm91cCA9IF9zdGVwNS52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGdpZCA+PSBncm91cC5nbHlwaElEICYmIGdpZCA8PSBncm91cC5nbHlwaElEICsgKGdyb3VwLmVuZENoYXJDb2RlIC0gZ3JvdXAuc3RhcnRDaGFyQ29kZSkpIHtcbiAgICAgICAgICAgICAgX3JlczMucHVzaChncm91cC5zdGFydENoYXJDb2RlICsgKGdpZCAtIGdyb3VwLmdseXBoSUQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX3JlczM7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAxMzpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfcmVzNCA9IFtdO1xuXG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNChjbWFwLmdyb3Vwcy50b0FycmF5KCkpLCBfc3RlcDY7ICEoX3N0ZXA2ID0gX2l0ZXJhdG9yNigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIF9ncm91cCA9IF9zdGVwNi52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGdpZCA9PT0gX2dyb3VwLmdseXBoSUQpIHtcbiAgICAgICAgICAgICAgX3JlczQucHVzaC5hcHBseShfcmVzNCwgcmFuZ2UoX2dyb3VwLnN0YXJ0Q2hhckNvZGUsIF9ncm91cC5lbmRDaGFyQ29kZSArIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX3JlczQ7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBjbWFwIGZvcm1hdCBcIiArIGNtYXAudmVyc2lvbik7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBDbWFwUHJvY2Vzc29yO1xufSgpLCAoX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MucHJvdG90eXBlLCBcImdldENoYXJhY3RlclNldFwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcy5wcm90b3R5cGUsIFwiZ2V0Q2hhcmFjdGVyU2V0XCIpLCBfY2xhc3MucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MucHJvdG90eXBlLCBcImNvZGVQb2ludHNGb3JHbHlwaFwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcy5wcm90b3R5cGUsIFwiY29kZVBvaW50c0ZvckdseXBoXCIpLCBfY2xhc3MucHJvdG90eXBlKSksIF9jbGFzcyk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNShvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkNShvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkNShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDUobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ1KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkNShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIEtlcm5Qcm9jZXNzb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBLZXJuUHJvY2Vzc29yKGZvbnQpIHtcbiAgICB0aGlzLmtlcm4gPSBmb250Lmtlcm47XG4gIH1cblxuICB2YXIgX3Byb3RvID0gS2VyblByb2Nlc3Nvci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnByb2Nlc3MgPSBmdW5jdGlvbiBwcm9jZXNzKGdseXBocywgcG9zaXRpb25zKSB7XG4gICAgZm9yICh2YXIgZ2x5cGhJbmRleCA9IDA7IGdseXBoSW5kZXggPCBnbHlwaHMubGVuZ3RoIC0gMTsgZ2x5cGhJbmRleCsrKSB7XG4gICAgICB2YXIgbGVmdCA9IGdseXBoc1tnbHlwaEluZGV4XS5pZDtcbiAgICAgIHZhciByaWdodCA9IGdseXBoc1tnbHlwaEluZGV4ICsgMV0uaWQ7XG4gICAgICBwb3NpdGlvbnNbZ2x5cGhJbmRleF0ueEFkdmFuY2UgKz0gdGhpcy5nZXRLZXJuaW5nKGxlZnQsIHJpZ2h0KTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmdldEtlcm5pbmcgPSBmdW5jdGlvbiBnZXRLZXJuaW5nKGxlZnQsIHJpZ2h0KSB7XG4gICAgdmFyIHJlcyA9IDA7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDUodGhpcy5rZXJuLnRhYmxlcyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgdGFibGUgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKHRhYmxlLmNvdmVyYWdlLmNyb3NzU3RyZWFtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHRhYmxlLnZlcnNpb24pIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGlmICghdGFibGUuY292ZXJhZ2UuaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmICh0YWJsZS5jb3ZlcmFnZS52ZXJ0aWNhbCB8fCB0YWJsZS5jb3ZlcmFnZS52YXJpYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQga2VybmluZyB0YWJsZSB2ZXJzaW9uIFwiICsgdGFibGUudmVyc2lvbik7XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWwgPSAwO1xuICAgICAgdmFyIHMgPSB0YWJsZS5zdWJ0YWJsZTtcblxuICAgICAgc3dpdGNoICh0YWJsZS5mb3JtYXQpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHZhciBwYWlySWR4ID0gYmluYXJ5U2VhcmNoKHMucGFpcnMsIGZ1bmN0aW9uIChwYWlyKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVmdCAtIHBhaXIubGVmdCB8fCByaWdodCAtIHBhaXIucmlnaHQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAocGFpcklkeCA+PSAwKSB7XG4gICAgICAgICAgICB2YWwgPSBzLnBhaXJzW3BhaXJJZHhdLnZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICB2YXIgbGVmdE9mZnNldCA9IDAsXG4gICAgICAgICAgICAgIHJpZ2h0T2Zmc2V0ID0gMDtcblxuICAgICAgICAgIGlmIChsZWZ0ID49IHMubGVmdFRhYmxlLmZpcnN0R2x5cGggJiYgbGVmdCA8IHMubGVmdFRhYmxlLmZpcnN0R2x5cGggKyBzLmxlZnRUYWJsZS5uR2x5cGhzKSB7XG4gICAgICAgICAgICBsZWZ0T2Zmc2V0ID0gcy5sZWZ0VGFibGUub2Zmc2V0c1tsZWZ0IC0gcy5sZWZ0VGFibGUuZmlyc3RHbHlwaF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxlZnRPZmZzZXQgPSBzLmFycmF5Lm9mZjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmlnaHQgPj0gcy5yaWdodFRhYmxlLmZpcnN0R2x5cGggJiYgcmlnaHQgPCBzLnJpZ2h0VGFibGUuZmlyc3RHbHlwaCArIHMucmlnaHRUYWJsZS5uR2x5cGhzKSB7XG4gICAgICAgICAgICByaWdodE9mZnNldCA9IHMucmlnaHRUYWJsZS5vZmZzZXRzW3JpZ2h0IC0gcy5yaWdodFRhYmxlLmZpcnN0R2x5cGhdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBpbmRleCA9IChsZWZ0T2Zmc2V0ICsgcmlnaHRPZmZzZXQgLSBzLmFycmF5Lm9mZikgLyAyO1xuICAgICAgICAgIHZhbCA9IHMuYXJyYXkudmFsdWVzLmdldChpbmRleCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGlmIChsZWZ0ID49IHMuZ2x5cGhDb3VudCB8fCByaWdodCA+PSBzLmdseXBoQ291bnQpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbCA9IHMua2VyblZhbHVlW3Mua2VybkluZGV4W3MubGVmdENsYXNzW2xlZnRdICogcy5yaWdodENsYXNzQ291bnQgKyBzLnJpZ2h0Q2xhc3NbcmlnaHRdXV07XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBrZXJuaW5nIHN1Yi10YWJsZSBmb3JtYXQgXCIgKyB0YWJsZS5mb3JtYXQpO1xuICAgICAgfSAvLyBNaWNyb3NvZnQgc3VwcG9ydHMgdGhlIG92ZXJyaWRlIGZsYWcsIHdoaWNoIHJlc2V0cyB0aGUgcmVzdWx0XG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSBzdW0gb2YgdGhlIHJlc3VsdHMgZnJvbSBhbGwgc3VidGFibGVzIGlzIHJldHVybmVkXG5cblxuICAgICAgaWYgKHRhYmxlLmNvdmVyYWdlLm92ZXJyaWRlKSB7XG4gICAgICAgIHJlcyA9IHZhbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcyArPSB2YWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICByZXR1cm4gS2VyblByb2Nlc3Nvcjtcbn0oKTtcblxudmFyIFRJTkZfT0sgPSAwO1xudmFyIFRJTkZfREFUQV9FUlJPUiA9IC0zO1xuXG5mdW5jdGlvbiBUcmVlKCkge1xuICB0aGlzLnRhYmxlID0gbmV3IFVpbnQxNkFycmF5KDE2KTtcbiAgLyogdGFibGUgb2YgY29kZSBsZW5ndGggY291bnRzICovXG5cbiAgdGhpcy50cmFucyA9IG5ldyBVaW50MTZBcnJheSgyODgpO1xuICAvKiBjb2RlIC0+IHN5bWJvbCB0cmFuc2xhdGlvbiB0YWJsZSAqL1xufVxuXG5mdW5jdGlvbiBEYXRhKHNvdXJjZSwgZGVzdCkge1xuICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgdGhpcy5zb3VyY2VJbmRleCA9IDA7XG4gIHRoaXMudGFnID0gMDtcbiAgdGhpcy5iaXRjb3VudCA9IDA7XG4gIHRoaXMuZGVzdCA9IGRlc3Q7XG4gIHRoaXMuZGVzdExlbiA9IDA7XG4gIHRoaXMubHRyZWUgPSBuZXcgVHJlZSgpO1xuICAvKiBkeW5hbWljIGxlbmd0aC9zeW1ib2wgdHJlZSAqL1xuXG4gIHRoaXMuZHRyZWUgPSBuZXcgVHJlZSgpO1xuICAvKiBkeW5hbWljIGRpc3RhbmNlIHRyZWUgKi9cbn1cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSB1bmluaXRpYWxpemVkIGdsb2JhbCBkYXRhIChzdGF0aWMgc3RydWN0dXJlcykgLS0gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblxudmFyIHNsdHJlZSA9IG5ldyBUcmVlKCk7XG52YXIgc2R0cmVlID0gbmV3IFRyZWUoKTtcbi8qIGV4dHJhIGJpdHMgYW5kIGJhc2UgdGFibGVzIGZvciBsZW5ndGggY29kZXMgKi9cblxudmFyIGxlbmd0aF9iaXRzID0gbmV3IFVpbnQ4QXJyYXkoMzApO1xudmFyIGxlbmd0aF9iYXNlID0gbmV3IFVpbnQxNkFycmF5KDMwKTtcbi8qIGV4dHJhIGJpdHMgYW5kIGJhc2UgdGFibGVzIGZvciBkaXN0YW5jZSBjb2RlcyAqL1xuXG52YXIgZGlzdF9iaXRzID0gbmV3IFVpbnQ4QXJyYXkoMzApO1xudmFyIGRpc3RfYmFzZSA9IG5ldyBVaW50MTZBcnJheSgzMCk7XG4vKiBzcGVjaWFsIG9yZGVyaW5nIG9mIGNvZGUgbGVuZ3RoIGNvZGVzICovXG5cbnZhciBjbGNpZHggPSBuZXcgVWludDhBcnJheShbMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNV0pO1xuLyogdXNlZCBieSB0aW5mX2RlY29kZV90cmVlcywgYXZvaWRzIGFsbG9jYXRpb25zIGV2ZXJ5IGNhbGwgKi9cblxudmFyIGNvZGVfdHJlZSA9IG5ldyBUcmVlKCk7XG52YXIgbGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KDI4OCArIDMyKTtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIHV0aWxpdHkgZnVuY3Rpb25zIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qIGJ1aWxkIGV4dHJhIGJpdHMgYW5kIGJhc2UgdGFibGVzICovXG5cbmZ1bmN0aW9uIHRpbmZfYnVpbGRfYml0c19iYXNlKGJpdHMsIGJhc2UsIGRlbHRhLCBmaXJzdCkge1xuICB2YXIgaSwgc3VtO1xuICAvKiBidWlsZCBiaXRzIHRhYmxlICovXG5cbiAgZm9yIChpID0gMDsgaSA8IGRlbHRhOyArK2kpIHtcbiAgICBiaXRzW2ldID0gMDtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCAzMCAtIGRlbHRhOyArK2kpIHtcbiAgICBiaXRzW2kgKyBkZWx0YV0gPSBpIC8gZGVsdGEgfCAwO1xuICB9XG4gIC8qIGJ1aWxkIGJhc2UgdGFibGUgKi9cblxuXG4gIGZvciAoc3VtID0gZmlyc3QsIGkgPSAwOyBpIDwgMzA7ICsraSkge1xuICAgIGJhc2VbaV0gPSBzdW07XG4gICAgc3VtICs9IDEgPDwgYml0c1tpXTtcbiAgfVxufVxuLyogYnVpbGQgdGhlIGZpeGVkIGh1ZmZtYW4gdHJlZXMgKi9cblxuXG5mdW5jdGlvbiB0aW5mX2J1aWxkX2ZpeGVkX3RyZWVzKGx0LCBkdCkge1xuICB2YXIgaTtcbiAgLyogYnVpbGQgZml4ZWQgbGVuZ3RoIHRyZWUgKi9cblxuICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7XG4gICAgbHQudGFibGVbaV0gPSAwO1xuICB9XG5cbiAgbHQudGFibGVbN10gPSAyNDtcbiAgbHQudGFibGVbOF0gPSAxNTI7XG4gIGx0LnRhYmxlWzldID0gMTEyO1xuXG4gIGZvciAoaSA9IDA7IGkgPCAyNDsgKytpKSB7XG4gICAgbHQudHJhbnNbaV0gPSAyNTYgKyBpO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IDE0NDsgKytpKSB7XG4gICAgbHQudHJhbnNbMjQgKyBpXSA9IGk7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7XG4gICAgbHQudHJhbnNbMjQgKyAxNDQgKyBpXSA9IDI4MCArIGk7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgMTEyOyArK2kpIHtcbiAgICBsdC50cmFuc1syNCArIDE0NCArIDggKyBpXSA9IDE0NCArIGk7XG4gIH1cbiAgLyogYnVpbGQgZml4ZWQgZGlzdGFuY2UgdHJlZSAqL1xuXG5cbiAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkge1xuICAgIGR0LnRhYmxlW2ldID0gMDtcbiAgfVxuXG4gIGR0LnRhYmxlWzVdID0gMzI7XG5cbiAgZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHtcbiAgICBkdC50cmFuc1tpXSA9IGk7XG4gIH1cbn1cbi8qIGdpdmVuIGFuIGFycmF5IG9mIGNvZGUgbGVuZ3RocywgYnVpbGQgYSB0cmVlICovXG5cblxudmFyIG9mZnMgPSBuZXcgVWludDE2QXJyYXkoMTYpO1xuXG5mdW5jdGlvbiB0aW5mX2J1aWxkX3RyZWUodCwgbGVuZ3Rocywgb2ZmLCBudW0pIHtcbiAgdmFyIGksIHN1bTtcbiAgLyogY2xlYXIgY29kZSBsZW5ndGggY291bnQgdGFibGUgKi9cblxuICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgIHQudGFibGVbaV0gPSAwO1xuICB9XG4gIC8qIHNjYW4gc3ltYm9sIGxlbmd0aHMsIGFuZCBzdW0gY29kZSBsZW5ndGggY291bnRzICovXG5cblxuICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHtcbiAgICB0LnRhYmxlW2xlbmd0aHNbb2ZmICsgaV1dKys7XG4gIH1cblxuICB0LnRhYmxlWzBdID0gMDtcbiAgLyogY29tcHV0ZSBvZmZzZXQgdGFibGUgZm9yIGRpc3RyaWJ1dGlvbiBzb3J0ICovXG5cbiAgZm9yIChzdW0gPSAwLCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICBvZmZzW2ldID0gc3VtO1xuICAgIHN1bSArPSB0LnRhYmxlW2ldO1xuICB9XG4gIC8qIGNyZWF0ZSBjb2RlLT5zeW1ib2wgdHJhbnNsYXRpb24gdGFibGUgKHN5bWJvbHMgc29ydGVkIGJ5IGNvZGUpICovXG5cblxuICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHtcbiAgICBpZiAobGVuZ3Roc1tvZmYgKyBpXSkgdC50cmFuc1tvZmZzW2xlbmd0aHNbb2ZmICsgaV1dKytdID0gaTtcbiAgfVxufVxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSBkZWNvZGUgZnVuY3Rpb25zIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogZ2V0IG9uZSBiaXQgZnJvbSBzb3VyY2Ugc3RyZWFtICovXG5cblxuZnVuY3Rpb24gdGluZl9nZXRiaXQoZCkge1xuICAvKiBjaGVjayBpZiB0YWcgaXMgZW1wdHkgKi9cbiAgaWYgKCFkLmJpdGNvdW50LS0pIHtcbiAgICAvKiBsb2FkIG5leHQgdGFnICovXG4gICAgZC50YWcgPSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4KytdO1xuICAgIGQuYml0Y291bnQgPSA3O1xuICB9XG4gIC8qIHNoaWZ0IGJpdCBvdXQgb2YgdGFnICovXG5cblxuICB2YXIgYml0ID0gZC50YWcgJiAxO1xuICBkLnRhZyA+Pj49IDE7XG4gIHJldHVybiBiaXQ7XG59XG4vKiByZWFkIGEgbnVtIGJpdCB2YWx1ZSBmcm9tIGEgc3RyZWFtIGFuZCBhZGQgYmFzZSAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfcmVhZF9iaXRzKGQsIG51bSwgYmFzZSkge1xuICBpZiAoIW51bSkgcmV0dXJuIGJhc2U7XG5cbiAgd2hpbGUgKGQuYml0Y291bnQgPCAyNCkge1xuICAgIGQudGFnIHw9IGQuc291cmNlW2Quc291cmNlSW5kZXgrK10gPDwgZC5iaXRjb3VudDtcbiAgICBkLmJpdGNvdW50ICs9IDg7XG4gIH1cblxuICB2YXIgdmFsID0gZC50YWcgJiAweGZmZmYgPj4+IDE2IC0gbnVtO1xuICBkLnRhZyA+Pj49IG51bTtcbiAgZC5iaXRjb3VudCAtPSBudW07XG4gIHJldHVybiB2YWwgKyBiYXNlO1xufVxuLyogZ2l2ZW4gYSBkYXRhIHN0cmVhbSBhbmQgYSB0cmVlLCBkZWNvZGUgYSBzeW1ib2wgKi9cblxuXG5mdW5jdGlvbiB0aW5mX2RlY29kZV9zeW1ib2woZCwgdCkge1xuICB3aGlsZSAoZC5iaXRjb3VudCA8IDI0KSB7XG4gICAgZC50YWcgfD0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCsrXSA8PCBkLmJpdGNvdW50O1xuICAgIGQuYml0Y291bnQgKz0gODtcbiAgfVxuXG4gIHZhciBzdW0gPSAwLFxuICAgICAgY3VyID0gMCxcbiAgICAgIGxlbiA9IDA7XG4gIHZhciB0YWcgPSBkLnRhZztcbiAgLyogZ2V0IG1vcmUgYml0cyB3aGlsZSBjb2RlIHZhbHVlIGlzIGFib3ZlIHN1bSAqL1xuXG4gIGRvIHtcbiAgICBjdXIgPSAyICogY3VyICsgKHRhZyAmIDEpO1xuICAgIHRhZyA+Pj49IDE7XG4gICAgKytsZW47XG4gICAgc3VtICs9IHQudGFibGVbbGVuXTtcbiAgICBjdXIgLT0gdC50YWJsZVtsZW5dO1xuICB9IHdoaWxlIChjdXIgPj0gMCk7XG5cbiAgZC50YWcgPSB0YWc7XG4gIGQuYml0Y291bnQgLT0gbGVuO1xuICByZXR1cm4gdC50cmFuc1tzdW0gKyBjdXJdO1xufVxuLyogZ2l2ZW4gYSBkYXRhIHN0cmVhbSwgZGVjb2RlIGR5bmFtaWMgdHJlZXMgZnJvbSBpdCAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfZGVjb2RlX3RyZWVzKGQsIGx0LCBkdCkge1xuICB2YXIgaGxpdCwgaGRpc3QsIGhjbGVuO1xuICB2YXIgaSwgbnVtLCBsZW5ndGg7XG4gIC8qIGdldCA1IGJpdHMgSExJVCAoMjU3LTI4NikgKi9cblxuICBobGl0ID0gdGluZl9yZWFkX2JpdHMoZCwgNSwgMjU3KTtcbiAgLyogZ2V0IDUgYml0cyBIRElTVCAoMS0zMikgKi9cblxuICBoZGlzdCA9IHRpbmZfcmVhZF9iaXRzKGQsIDUsIDEpO1xuICAvKiBnZXQgNCBiaXRzIEhDTEVOICg0LTE5KSAqL1xuXG4gIGhjbGVuID0gdGluZl9yZWFkX2JpdHMoZCwgNCwgNCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IDE5OyArK2kpIHtcbiAgICBsZW5ndGhzW2ldID0gMDtcbiAgfVxuICAvKiByZWFkIGNvZGUgbGVuZ3RocyBmb3IgY29kZSBsZW5ndGggYWxwaGFiZXQgKi9cblxuXG4gIGZvciAoaSA9IDA7IGkgPCBoY2xlbjsgKytpKSB7XG4gICAgLyogZ2V0IDMgYml0cyBjb2RlIGxlbmd0aCAoMC03KSAqL1xuICAgIHZhciBjbGVuID0gdGluZl9yZWFkX2JpdHMoZCwgMywgMCk7XG4gICAgbGVuZ3Roc1tjbGNpZHhbaV1dID0gY2xlbjtcbiAgfVxuICAvKiBidWlsZCBjb2RlIGxlbmd0aCB0cmVlICovXG5cblxuICB0aW5mX2J1aWxkX3RyZWUoY29kZV90cmVlLCBsZW5ndGhzLCAwLCAxOSk7XG4gIC8qIGRlY29kZSBjb2RlIGxlbmd0aHMgZm9yIHRoZSBkeW5hbWljIHRyZWVzICovXG5cbiAgZm9yIChudW0gPSAwOyBudW0gPCBobGl0ICsgaGRpc3Q7KSB7XG4gICAgdmFyIHN5bSA9IHRpbmZfZGVjb2RlX3N5bWJvbChkLCBjb2RlX3RyZWUpO1xuXG4gICAgc3dpdGNoIChzeW0pIHtcbiAgICAgIGNhc2UgMTY6XG4gICAgICAgIC8qIGNvcHkgcHJldmlvdXMgY29kZSBsZW5ndGggMy02IHRpbWVzIChyZWFkIDIgYml0cykgKi9cbiAgICAgICAgdmFyIHByZXYgPSBsZW5ndGhzW251bSAtIDFdO1xuXG4gICAgICAgIGZvciAobGVuZ3RoID0gdGluZl9yZWFkX2JpdHMoZCwgMiwgMyk7IGxlbmd0aDsgLS1sZW5ndGgpIHtcbiAgICAgICAgICBsZW5ndGhzW251bSsrXSA9IHByZXY7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAxNzpcbiAgICAgICAgLyogcmVwZWF0IGNvZGUgbGVuZ3RoIDAgZm9yIDMtMTAgdGltZXMgKHJlYWQgMyBiaXRzKSAqL1xuICAgICAgICBmb3IgKGxlbmd0aCA9IHRpbmZfcmVhZF9iaXRzKGQsIDMsIDMpOyBsZW5ndGg7IC0tbGVuZ3RoKSB7XG4gICAgICAgICAgbGVuZ3Roc1tudW0rK10gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMTg6XG4gICAgICAgIC8qIHJlcGVhdCBjb2RlIGxlbmd0aCAwIGZvciAxMS0xMzggdGltZXMgKHJlYWQgNyBiaXRzKSAqL1xuICAgICAgICBmb3IgKGxlbmd0aCA9IHRpbmZfcmVhZF9iaXRzKGQsIDcsIDExKTsgbGVuZ3RoOyAtLWxlbmd0aCkge1xuICAgICAgICAgIGxlbmd0aHNbbnVtKytdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvKiB2YWx1ZXMgMC0xNSByZXByZXNlbnQgdGhlIGFjdHVhbCBjb2RlIGxlbmd0aHMgKi9cbiAgICAgICAgbGVuZ3Roc1tudW0rK10gPSBzeW07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvKiBidWlsZCBkeW5hbWljIHRyZWVzICovXG5cblxuICB0aW5mX2J1aWxkX3RyZWUobHQsIGxlbmd0aHMsIDAsIGhsaXQpO1xuICB0aW5mX2J1aWxkX3RyZWUoZHQsIGxlbmd0aHMsIGhsaXQsIGhkaXN0KTtcbn1cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIGJsb2NrIGluZmxhdGUgZnVuY3Rpb25zIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qIGdpdmVuIGEgc3RyZWFtIGFuZCB0d28gdHJlZXMsIGluZmxhdGUgYSBibG9jayBvZiBkYXRhICovXG5cblxuZnVuY3Rpb24gdGluZl9pbmZsYXRlX2Jsb2NrX2RhdGEoZCwgbHQsIGR0KSB7XG4gIHdoaWxlICgxKSB7XG4gICAgdmFyIHN5bSA9IHRpbmZfZGVjb2RlX3N5bWJvbChkLCBsdCk7XG4gICAgLyogY2hlY2sgZm9yIGVuZCBvZiBibG9jayAqL1xuXG4gICAgaWYgKHN5bSA9PT0gMjU2KSB7XG4gICAgICByZXR1cm4gVElORl9PSztcbiAgICB9XG5cbiAgICBpZiAoc3ltIDwgMjU2KSB7XG4gICAgICBkLmRlc3RbZC5kZXN0TGVuKytdID0gc3ltO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbGVuZ3RoLCBkaXN0LCBvZmZzO1xuICAgICAgdmFyIGk7XG4gICAgICBzeW0gLT0gMjU3O1xuICAgICAgLyogcG9zc2libHkgZ2V0IG1vcmUgYml0cyBmcm9tIGxlbmd0aCBjb2RlICovXG5cbiAgICAgIGxlbmd0aCA9IHRpbmZfcmVhZF9iaXRzKGQsIGxlbmd0aF9iaXRzW3N5bV0sIGxlbmd0aF9iYXNlW3N5bV0pO1xuICAgICAgZGlzdCA9IHRpbmZfZGVjb2RlX3N5bWJvbChkLCBkdCk7XG4gICAgICAvKiBwb3NzaWJseSBnZXQgbW9yZSBiaXRzIGZyb20gZGlzdGFuY2UgY29kZSAqL1xuXG4gICAgICBvZmZzID0gZC5kZXN0TGVuIC0gdGluZl9yZWFkX2JpdHMoZCwgZGlzdF9iaXRzW2Rpc3RdLCBkaXN0X2Jhc2VbZGlzdF0pO1xuICAgICAgLyogY29weSBtYXRjaCAqL1xuXG4gICAgICBmb3IgKGkgPSBvZmZzOyBpIDwgb2ZmcyArIGxlbmd0aDsgKytpKSB7XG4gICAgICAgIGQuZGVzdFtkLmRlc3RMZW4rK10gPSBkLmRlc3RbaV07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKiBpbmZsYXRlIGFuIHVuY29tcHJlc3NlZCBibG9jayBvZiBkYXRhICovXG5cblxuZnVuY3Rpb24gdGluZl9pbmZsYXRlX3VuY29tcHJlc3NlZF9ibG9jayhkKSB7XG4gIHZhciBsZW5ndGgsIGludmxlbmd0aDtcbiAgdmFyIGk7XG4gIC8qIHVucmVhZCBmcm9tIGJpdGJ1ZmZlciAqL1xuXG4gIHdoaWxlIChkLmJpdGNvdW50ID4gOCkge1xuICAgIGQuc291cmNlSW5kZXgtLTtcbiAgICBkLmJpdGNvdW50IC09IDg7XG4gIH1cbiAgLyogZ2V0IGxlbmd0aCAqL1xuXG5cbiAgbGVuZ3RoID0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCArIDFdO1xuICBsZW5ndGggPSAyNTYgKiBsZW5ndGggKyBkLnNvdXJjZVtkLnNvdXJjZUluZGV4XTtcbiAgLyogZ2V0IG9uZSdzIGNvbXBsZW1lbnQgb2YgbGVuZ3RoICovXG5cbiAgaW52bGVuZ3RoID0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCArIDNdO1xuICBpbnZsZW5ndGggPSAyNTYgKiBpbnZsZW5ndGggKyBkLnNvdXJjZVtkLnNvdXJjZUluZGV4ICsgMl07XG4gIC8qIGNoZWNrIGxlbmd0aCAqL1xuXG4gIGlmIChsZW5ndGggIT09ICh+aW52bGVuZ3RoICYgMHgwMDAwZmZmZikpIHJldHVybiBUSU5GX0RBVEFfRVJST1I7XG4gIGQuc291cmNlSW5kZXggKz0gNDtcbiAgLyogY29weSBibG9jayAqL1xuXG4gIGZvciAoaSA9IGxlbmd0aDsgaTsgLS1pKSB7XG4gICAgZC5kZXN0W2QuZGVzdExlbisrXSA9IGQuc291cmNlW2Quc291cmNlSW5kZXgrK107XG4gIH1cbiAgLyogbWFrZSBzdXJlIHdlIHN0YXJ0IG5leHQgYmxvY2sgb24gYSBieXRlIGJvdW5kYXJ5ICovXG5cblxuICBkLmJpdGNvdW50ID0gMDtcbiAgcmV0dXJuIFRJTkZfT0s7XG59XG4vKiBpbmZsYXRlIHN0cmVhbSBmcm9tIHNvdXJjZSB0byBkZXN0ICovXG5cblxuZnVuY3Rpb24gdGluZl91bmNvbXByZXNzKHNvdXJjZSwgZGVzdCkge1xuICB2YXIgZCA9IG5ldyBEYXRhKHNvdXJjZSwgZGVzdCk7XG4gIHZhciBiZmluYWwsIGJ0eXBlLCByZXM7XG5cbiAgZG8ge1xuICAgIC8qIHJlYWQgZmluYWwgYmxvY2sgZmxhZyAqL1xuICAgIGJmaW5hbCA9IHRpbmZfZ2V0Yml0KGQpO1xuICAgIC8qIHJlYWQgYmxvY2sgdHlwZSAoMiBiaXRzKSAqL1xuXG4gICAgYnR5cGUgPSB0aW5mX3JlYWRfYml0cyhkLCAyLCAwKTtcbiAgICAvKiBkZWNvbXByZXNzIGJsb2NrICovXG5cbiAgICBzd2l0Y2ggKGJ0eXBlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIC8qIGRlY29tcHJlc3MgdW5jb21wcmVzc2VkIGJsb2NrICovXG4gICAgICAgIHJlcyA9IHRpbmZfaW5mbGF0ZV91bmNvbXByZXNzZWRfYmxvY2soZCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDE6XG4gICAgICAgIC8qIGRlY29tcHJlc3MgYmxvY2sgd2l0aCBmaXhlZCBodWZmbWFuIHRyZWVzICovXG4gICAgICAgIHJlcyA9IHRpbmZfaW5mbGF0ZV9ibG9ja19kYXRhKGQsIHNsdHJlZSwgc2R0cmVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLyogZGVjb21wcmVzcyBibG9jayB3aXRoIGR5bmFtaWMgaHVmZm1hbiB0cmVlcyAqL1xuICAgICAgICB0aW5mX2RlY29kZV90cmVlcyhkLCBkLmx0cmVlLCBkLmR0cmVlKTtcbiAgICAgICAgcmVzID0gdGluZl9pbmZsYXRlX2Jsb2NrX2RhdGEoZCwgZC5sdHJlZSwgZC5kdHJlZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXMgPSBUSU5GX0RBVEFfRVJST1I7XG4gICAgfVxuXG4gICAgaWYgKHJlcyAhPT0gVElORl9PSykgdGhyb3cgbmV3IEVycm9yKCdEYXRhIGVycm9yJyk7XG4gIH0gd2hpbGUgKCFiZmluYWwpO1xuXG4gIGlmIChkLmRlc3RMZW4gPCBkLmRlc3QubGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiBkLmRlc3Quc2xpY2UgPT09ICdmdW5jdGlvbicpIHJldHVybiBkLmRlc3Quc2xpY2UoMCwgZC5kZXN0TGVuKTtlbHNlIHJldHVybiBkLmRlc3Quc3ViYXJyYXkoMCwgZC5kZXN0TGVuKTtcbiAgfVxuXG4gIHJldHVybiBkLmRlc3Q7XG59XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSBpbml0aWFsaXphdGlvbiAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiBidWlsZCBmaXhlZCBodWZmbWFuIHRyZWVzICovXG5cblxudGluZl9idWlsZF9maXhlZF90cmVlcyhzbHRyZWUsIHNkdHJlZSk7XG4vKiBidWlsZCBleHRyYSBiaXRzIGFuZCBiYXNlIHRhYmxlcyAqL1xuXG50aW5mX2J1aWxkX2JpdHNfYmFzZShsZW5ndGhfYml0cywgbGVuZ3RoX2Jhc2UsIDQsIDMpO1xudGluZl9idWlsZF9iaXRzX2Jhc2UoZGlzdF9iaXRzLCBkaXN0X2Jhc2UsIDIsIDEpO1xuLyogZml4IGEgc3BlY2lhbCBjYXNlICovXG5cbmxlbmd0aF9iaXRzWzI4XSA9IDA7XG5sZW5ndGhfYmFzZVsyOF0gPSAyNTg7XG52YXIgdGlueUluZmxhdGUgPSB0aW5mX3VuY29tcHJlc3M7XG5cbnZhciBVbmljb2RlVHJpZSwgaW5mbGF0ZTtcbmluZmxhdGUgPSB0aW55SW5mbGF0ZTtcblxuVW5pY29kZVRyaWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBEQVRBX0JMT0NLX0xFTkdUSCwgREFUQV9HUkFOVUxBUklUWSwgREFUQV9NQVNLLCBJTkRFWF8xX09GRlNFVCwgSU5ERVhfMl9CTE9DS19MRU5HVEgsIElOREVYXzJfQk1QX0xFTkdUSCwgSU5ERVhfMl9NQVNLLCBJTkRFWF9TSElGVCwgTFNDUF9JTkRFWF8yX0xFTkdUSCwgTFNDUF9JTkRFWF8yX09GRlNFVCwgT01JVFRFRF9CTVBfSU5ERVhfMV9MRU5HVEgsIFNISUZUXzEsIFNISUZUXzFfMiwgU0hJRlRfMiwgVVRGOF8yQl9JTkRFWF8yX0xFTkdUSCwgVVRGOF8yQl9JTkRFWF8yX09GRlNFVDtcbiAgU0hJRlRfMSA9IDYgKyA1O1xuICBTSElGVF8yID0gNTtcbiAgU0hJRlRfMV8yID0gU0hJRlRfMSAtIFNISUZUXzI7XG4gIE9NSVRURURfQk1QX0lOREVYXzFfTEVOR1RIID0gMHgxMDAwMCA+PiBTSElGVF8xO1xuICBJTkRFWF8yX0JMT0NLX0xFTkdUSCA9IDEgPDwgU0hJRlRfMV8yO1xuICBJTkRFWF8yX01BU0sgPSBJTkRFWF8yX0JMT0NLX0xFTkdUSCAtIDE7XG4gIElOREVYX1NISUZUID0gMjtcbiAgREFUQV9CTE9DS19MRU5HVEggPSAxIDw8IFNISUZUXzI7XG4gIERBVEFfTUFTSyA9IERBVEFfQkxPQ0tfTEVOR1RIIC0gMTtcbiAgTFNDUF9JTkRFWF8yX09GRlNFVCA9IDB4MTAwMDAgPj4gU0hJRlRfMjtcbiAgTFNDUF9JTkRFWF8yX0xFTkdUSCA9IDB4NDAwID4+IFNISUZUXzI7XG4gIElOREVYXzJfQk1QX0xFTkdUSCA9IExTQ1BfSU5ERVhfMl9PRkZTRVQgKyBMU0NQX0lOREVYXzJfTEVOR1RIO1xuICBVVEY4XzJCX0lOREVYXzJfT0ZGU0VUID0gSU5ERVhfMl9CTVBfTEVOR1RIO1xuICBVVEY4XzJCX0lOREVYXzJfTEVOR1RIID0gMHg4MDAgPj4gNjtcbiAgSU5ERVhfMV9PRkZTRVQgPSBVVEY4XzJCX0lOREVYXzJfT0ZGU0VUICsgVVRGOF8yQl9JTkRFWF8yX0xFTkdUSDtcbiAgREFUQV9HUkFOVUxBUklUWSA9IDEgPDwgSU5ERVhfU0hJRlQ7XG5cbiAgZnVuY3Rpb24gVW5pY29kZVRyaWUoZGF0YSkge1xuICAgIHZhciBpc0J1ZmZlciwgdW5jb21wcmVzc2VkTGVuZ3RoLCB2aWV3O1xuICAgIGlzQnVmZmVyID0gdHlwZW9mIGRhdGEucmVhZFVJbnQzMkJFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkYXRhLnNsaWNlID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYgKGlzQnVmZmVyIHx8IGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICBpZiAoaXNCdWZmZXIpIHtcbiAgICAgICAgdGhpcy5oaWdoU3RhcnQgPSBkYXRhLnJlYWRVSW50MzJCRSgwKTtcbiAgICAgICAgdGhpcy5lcnJvclZhbHVlID0gZGF0YS5yZWFkVUludDMyQkUoNCk7XG4gICAgICAgIHVuY29tcHJlc3NlZExlbmd0aCA9IGRhdGEucmVhZFVJbnQzMkJFKDgpO1xuICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgxMik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aWV3ID0gbmV3IERhdGFWaWV3KGRhdGEuYnVmZmVyKTtcbiAgICAgICAgdGhpcy5oaWdoU3RhcnQgPSB2aWV3LmdldFVpbnQzMigwKTtcbiAgICAgICAgdGhpcy5lcnJvclZhbHVlID0gdmlldy5nZXRVaW50MzIoNCk7XG4gICAgICAgIHVuY29tcHJlc3NlZExlbmd0aCA9IHZpZXcuZ2V0VWludDMyKDgpO1xuICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheSgxMik7XG4gICAgICB9XG5cbiAgICAgIGRhdGEgPSBpbmZsYXRlKGRhdGEsIG5ldyBVaW50OEFycmF5KHVuY29tcHJlc3NlZExlbmd0aCkpO1xuICAgICAgZGF0YSA9IGluZmxhdGUoZGF0YSwgbmV3IFVpbnQ4QXJyYXkodW5jb21wcmVzc2VkTGVuZ3RoKSk7XG4gICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGEgPSBkYXRhLmRhdGEsIHRoaXMuaGlnaFN0YXJ0ID0gZGF0YS5oaWdoU3RhcnQsIHRoaXMuZXJyb3JWYWx1ZSA9IGRhdGEuZXJyb3JWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBVbmljb2RlVHJpZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgIHZhciBpbmRleDtcblxuICAgIGlmIChjb2RlUG9pbnQgPCAwIHx8IGNvZGVQb2ludCA+IDB4MTBmZmZmKSB7XG4gICAgICByZXR1cm4gdGhpcy5lcnJvclZhbHVlO1xuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPCAweGQ4MDAgfHwgY29kZVBvaW50ID4gMHhkYmZmICYmIGNvZGVQb2ludCA8PSAweGZmZmYpIHtcbiAgICAgIGluZGV4ID0gKHRoaXMuZGF0YVtjb2RlUG9pbnQgPj4gU0hJRlRfMl0gPDwgSU5ERVhfU0hJRlQpICsgKGNvZGVQb2ludCAmIERBVEFfTUFTSyk7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhW2luZGV4XTtcbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50IDw9IDB4ZmZmZikge1xuICAgICAgaW5kZXggPSAodGhpcy5kYXRhW0xTQ1BfSU5ERVhfMl9PRkZTRVQgKyAoY29kZVBvaW50IC0gMHhkODAwID4+IFNISUZUXzIpXSA8PCBJTkRFWF9TSElGVCkgKyAoY29kZVBvaW50ICYgREFUQV9NQVNLKTtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbaW5kZXhdO1xuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPCB0aGlzLmhpZ2hTdGFydCkge1xuICAgICAgaW5kZXggPSB0aGlzLmRhdGFbSU5ERVhfMV9PRkZTRVQgLSBPTUlUVEVEX0JNUF9JTkRFWF8xX0xFTkdUSCArIChjb2RlUG9pbnQgPj4gU0hJRlRfMSldO1xuICAgICAgaW5kZXggPSB0aGlzLmRhdGFbaW5kZXggKyAoY29kZVBvaW50ID4+IFNISUZUXzIgJiBJTkRFWF8yX01BU0spXTtcbiAgICAgIGluZGV4ID0gKGluZGV4IDw8IElOREVYX1NISUZUKSArIChjb2RlUG9pbnQgJiBEQVRBX01BU0spO1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVtpbmRleF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLmRhdGEubGVuZ3RoIC0gREFUQV9HUkFOVUxBUklUWV07XG4gIH07XG5cbiAgcmV0dXJuIFVuaWNvZGVUcmllO1xufSgpO1xuXG52YXIgdW5pY29kZVRyaWUgPSBVbmljb2RlVHJpZTtcblxudmFyIGJhc2U2NEFycmF5YnVmZmVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAvKlxuICAgKiBiYXNlNjQtYXJyYXlidWZmZXJcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlclxuICAgKlxuICAgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTmlrbGFzIHZvbiBIZXJ0emVuXG4gICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAgICovXG4gIChmdW5jdGlvbiAoKSB7XG5cbiAgICB2YXIgY2hhcnMgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjsgLy8gVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxuXG4gICAgdmFyIGxvb2t1cCA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpO1xuICAgIH1cblxuICAgIGV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gKGFycmF5YnVmZmVyKSB7XG4gICAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShhcnJheWJ1ZmZlciksXG4gICAgICAgICAgaSxcbiAgICAgICAgICBsZW4gPSBieXRlcy5sZW5ndGgsXG4gICAgICAgICAgYmFzZTY0ID0gXCJcIjtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAzKSB7XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpXSA+PiAyXTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpXSAmIDMpIDw8IDQgfCBieXRlc1tpICsgMV0gPj4gNF07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIgfCBieXRlc1tpICsgMl0gPj4gNl07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107XG4gICAgICB9XG5cbiAgICAgIGlmIChsZW4gJSAzID09PSAyKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgXCI9XCI7XG4gICAgICB9IGVsc2UgaWYgKGxlbiAlIDMgPT09IDEpIHtcbiAgICAgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cmluZygwLCBiYXNlNjQubGVuZ3RoIC0gMikgKyBcIj09XCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiYXNlNjQ7XG4gICAgfTtcblxuICAgIGV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gKGJhc2U2NCkge1xuICAgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGJhc2U2NC5sZW5ndGggKiAwLjc1LFxuICAgICAgICAgIGxlbiA9IGJhc2U2NC5sZW5ndGgsXG4gICAgICAgICAgaSxcbiAgICAgICAgICBwID0gMCxcbiAgICAgICAgICBlbmNvZGVkMSxcbiAgICAgICAgICBlbmNvZGVkMixcbiAgICAgICAgICBlbmNvZGVkMyxcbiAgICAgICAgICBlbmNvZGVkNDtcblxuICAgICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMV0gPT09IFwiPVwiKSB7XG4gICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDJdID09PSBcIj1cIikge1xuICAgICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBhcnJheWJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXJMZW5ndGgpLFxuICAgICAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICAgICAgZW5jb2RlZDEgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBlbmNvZGVkMiA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMSldO1xuICAgICAgICBlbmNvZGVkMyA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMildO1xuICAgICAgICBlbmNvZGVkNCA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMyldO1xuICAgICAgICBieXRlc1twKytdID0gZW5jb2RlZDEgPDwgMiB8IGVuY29kZWQyID4+IDQ7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoZW5jb2RlZDIgJiAxNSkgPDwgNCB8IGVuY29kZWQzID4+IDI7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoZW5jb2RlZDMgJiAzKSA8PCA2IHwgZW5jb2RlZDQgJiA2MztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFycmF5YnVmZmVyO1xuICAgIH07XG4gIH0pKCk7XG59KTtcbnZhciBiYXNlNjRBcnJheWJ1ZmZlcl8xID0gYmFzZTY0QXJyYXlidWZmZXIuZW5jb2RlO1xudmFyIGJhc2U2NEFycmF5YnVmZmVyXzIgPSBiYXNlNjRBcnJheWJ1ZmZlci5kZWNvZGU7XG5cbnZhciBiYXNlNjREZWZsYXRlZERhdGEgPSBcImVKeHRWdHR5NHpZTS9SYy83ME5pOTdMYk4xdEo0OVNYZUdJM085M09qZ2F5R0JFUlJYb28waDVOcC85ZUFLVGNwTk9IRUNBRkFnZkFBWjIvSmtjSXFuRWVWVC81NWM5SmNaeDhtbnpyYWRrNVd2YTgzY2xXOGJaanJhWmx5OHM2OGxuTFoyeTNOcnpsYTJ0ZWRraEw4Y3JHc21WdEhYaGhMeHZMQ3p2ZDhOMHQzLzBteTRtdmNjakNUYjUvbWh4ZFY2RkYyeFFHK2o2aDNMcFFQaXZuYStVVkE1bFg3cXhHV1Q1am96bk9RaGwzNGRNUTRLaFZYWDc4ZkQwZTdaN095aHNZU0h0MEFjcDlyUHFqeHhQYjNybFlHWFcxek5zeHJCei82MWVpck5VcmI0cWl1TDNKOGpiTGFaYXpMSC9JOHNjc2Y4cnk1eXcvWi9rbHlXbjJOODMrcHRuZk5QdWJabi9UN0crVzdXZlpmamJhWi8vVDdIK2EvYyt5bjFuMk14djlNSzV0YkFPUWZFRVBIYVFQbjdQaGx6SEJtekd6bXpHRmF3NGoyTnN4MnUwSTcxWndmZXpWdGJhNW1sbXN3RUw1NHZCSXJNallHVnRxQUZFbXRTM3gyWFdkWTZxdElTRExoVHU1enIweUl4K3RWaDZETU9qQks5VUs1MDRCbVpERjRORVlVZWUrVXhhQmJ5OVY1WlZ3eWtNbEgvZGtCNndjTkJBc0xsRXJrMFBsSWVkeWF3TzJCckcrVTJjeWF1aUxwR1liTUt3OVJOL0ZWaWYxRFR4aFpUNTZITmpoQVRya3lUZ29FNXVZOHJkUWczZ213dElmVDlRZXJTWTFRVUZKbVlFY3NGSVp4Z0NXUUhFUW1wMG1ad1MyaWV6OVBtaDBwNVE3MWNXMWlzdGZFTnlhTExrZkhodTB3TFpQalphUXo5SEtoUU9sWkZ5VDNFWHJPTzRpYXF6VHR3cnNoWEd0ZEtjNC9NYlp4cGtVZjQxZEZjVU1xY3RjUG5VcFpST2wvWkZpcWw1bGkwT0t1NkN5NWROOXBOcG1mUUVCV3FISjZhZzU0Sk1wQzQydEZOc0Q5Wk90SGd4dzlOVG1BNzVTVG8xTzBIa2xZamVwa1N0Mmw5US9wSjdZTTlJWEtlNEN1aWhWSDR3TFdHNmhrWjd1TkRSOXVRTmhRUFRRNitDVHJ3RjB1V2FUWi9VR3d0dmY0RHdpTDFKZW5PSUxLdWI0UnFtZ3NOekFJTHkwMFJpQllCWDRjc0hxY0V3VkxJaE5vanladW53TWtFajc0S2lmeDN5NlU3NlR6ZTlNdmZEK3ZFOTM3d2lIbDhCN0RlZnNyKy9BQ2dQdlRRVjlEaGFQMEFzaDZNeU9QUlJVY3htYmswZkhmaDY3RTAwWG1ITE9MNFdFM0lIcEJxK3N0QmtxS3EvS0hLUWlXYW1lbzBuTGVhMkhPaWtiWWlPRExwZElXbU9Hays3Zkh4ZVJzcERIWXFYQk95cTVUQkludUhjeDZGS0c5VnFpcmZNZnptZzZrZWlTb016UHFrL1Q4bWpUTTRLT09FOGRwVXY0dngrMG9ZSXgrQjVNVVA3ZENVYzdSTjllNjcyTXRobTdSWVRVSFFvMU1BSGVPMCsvT283cWxwNDFEVzJYaGx3RFVRWlRjM3lhL0pWMmIwTHNUVFFoZlZ6cFdNT0Z4bFhlTTdCQlp1Q0FYa2Q1cy9kWTE0bG5HeWRHQjJpRnRIUHQrUFFyK2JaTldhQzhQanVJcE5weUNVejZJbHFGcjg2ejNYMHpVUFpFZ1kvOW1Gc0lNdFgvN1pPWDU0Qit2T25SQmkydU5WeDB1YVNYbVJQZG9EeFVkL0ZrM0NDMTJXTmp2ekpSMDNkbGExV3VzSVUySXIvdkNpN3lYNERRaUNNemVPWVIvZjA2K2Y3M1AwK21zK2s9XCI7XG5cbnZhciBiYXNlNjREZWZsYXRlZFRyaWUgPSBcImVKd0JBeUg4M2dBUkFBQUFBQUFBQUFGUWNGMTRkeUNiKy92MjZYRktoM0ZvVWJHT3Fsb05WWHVmVXFzMnRXcUVxdG9qMUE1NnFyVkpxMnJVaUUxYmhGb3hVek90RlhzRlFXcEdoSWFFSUhuNy9YM2ZYM3ZlOTcvbmVmNTRQdmZuSHRkMTNSZGg4WExERFRlWDVmM3QwR0IwbEp3c2Q2RHc1UW1HWXU2WFlmdkxZQWpoSUFIYXhrUld1dmlrUitLSlY5aGoxWDk2cC9zNFFZYm92eC9sQnJNQXBndkIybXdJQTFORWp4YnJUV091TXFiVTFlZmRTb0M5WUQvc3VUOWlFNlQrck9mOXVvUDgwTGxOKzlCYWNQYWhQd2lwakR6KzBFbWhXRm1GQm1NajIxVEZkY0w1TkxzMDd4cEwzbWRQRm5PNU9EaWJkc2U2OWpMMzN6MytLNVE5MkI2c2psdXdDN1V2dm9NNnR4Q25HbkFCMU9jQzRjVWZDUlgwMW9leDVxUVVENjJHOGNXRCtyK0dzWTk4bmdzRExqMGo3Vms3SkJqdVljSzRhejR6Z1ZrMGt2QjdQQkN1andqKzBGVkRCTGRlWWFreGxoUERka1h6SDlIOVd3WGFOeitLNWRhZUYxMTlrSmRXdnlleDA1dTd6M1hLR0lLek9KVmFpbVZib2V5RHdQd2FzYno3V1VlU3A4QjVCQlBic2hCRUVMcHFvSllNRTg2M3pPQzU1Y3hlbHFlOExyTHE1c045NHJiS3VkTU54L0VqL3NoS1BwVk13RUtqanJRaHY4UDZvMC9aK0RJZ0kzMGJMNldUanB6NHV0bnJZcEFKeU5UZzB6ODFPUXU2MFBzTENUZXNkTVNkNjJzVE9ESnJVd2hpT0w2OFpOSitpRVBLNEY3Ym94UDFEM05MSndtVVZlRWpKWTFFelI1anBXZVlBQ2JXRlVNRUc3YVhNcm5VY25BQkExMFJQMlZHdlJxVUhGQXorZnhWaWNWOWRRY0NYL0tlaTJZWTZUaytDajB5ZGtnYUJKOWZ5bEtFYTg0NTZjM3J6ZEtWTkY2ZUtUMkxQZUxUZ0NKN1p2YUEvL2RTRzYvRUE0Q3JZWGt2SmdKdWp2UjdCN0NPOUIySHFVcjFFNWNYdTAvcTJKQlF6YytvUGV5ZTU0TFlPUDMzbURSNklyS2J2OXR4bkd3VElKMjIzQloyelhUWmM2eWZyaDM0cHZqeFMrVzgycTlEcWpsSE9rb003c2tOTXh5dzJDQ0c5amJuMEU3OVNONTlnU3lJYUFjY1crN0FTZXlMRDVDblhhN3BPendpemtJWkVNYmpXcnlncmc2bEZIOVh4eU9oNkNSNmNtOUsrTkszeE9SdUxrL00xajJmbmkybHkvRHVqL3NxN2V6KzNaZENWbWJjSTZEbi9GMVBycCt5THIya3VFaHJwR2h5WUdLZTh3WmM4ZU5pVFZJeGdXRnFYYlJ2VlBPUXdEcmNGRnNGbjlsYWw1NDRGbDRGTmMxTnlpc3F2azloUDZ2aVN3ZENNQVpLWFBaNGh0cWJURGxlV2tFblFJVVV2ZC8xWEZRS240WklmM3V3bXJWYVpSZTBDNyt4OUk4aURuZ2szODVDL0N5QzRMTlpacGlOMSt3VjNUTTQ1YUh4TlMrSExDUktyMmlvUFlzZjdjSWRYZnhSMnNQb0RTT0pwQ0F5WmVhL0I0Y0J2eVBhT0N1R0RwZjhvWU9HNjZ1SDMzOUVFcFpPekFFQnlhRWN5SXNiS3QvUldXUzY3Z0lJbWQrUURKN0xPdzd5V2xTZGk0WTNDSDZMemVqUXpZQW5IN24yd2o1WGdJVlpseFgwY21ONmFJNUhsM1pSc1VjQ0FsM1F2U0dIVTZqbS9iRUh6K01ZVmFnMDhBNHVRdTNGd1JPZGNJYWFycXhYUzkwYU5WMkVNRVozNlZkeGttREo2T2RyT002eUpQVHF1YXVtWmhtT0NDNjJRdXRsK1Q4empKTytBeUMvdVpIcFdRbEk2VWR6QnJKbm5pYkV3cUg0MGtDWSs0bHlIVjNGaVFseUFhWW5MUE1RbmFnQTZwcnZkQjlacUJsdWdkWVJYbmYrVDJiN1RYT2dMWFFIeUFESmNqUm1DRTVmSlFmdG5yT282cmxaeDJXL0hwbUdNdmhQZjNMK1oxSTU4elkrUmZ1TEVMUThLZ3VUSk0xNzVJL0VhbnBnU2EySzdJS2Y3LzVuMlBXOUtCOTlzRkRob3pUREdMMk5XUFVrMGYwcXc3T05BN2xkUmF1cmRXSzdPcW5Zc2h0Ty9lUkhjRWdPNGNmc25WOHRPTlJjemcrVHJ1RncwelE2bFlGd3dMcWorVDc3SXJTOWlHWmpCNXl2UXpUMzJTSGMzbjNMT05ISVc0L0NGeTBuajhWcEJ2REJxS1lrbmx2TDU1WE9WK0J1dGY4Tzd6RTU1VDJWb0tsSGt4Qk9rY2crTW5GbE1VeVRYSlRtM2RjQkdRMERaQnpmc2xZZldES2g4aXZkK0k2OGZ5b1BNZHlKZ1IyNXFBbVJZVGRwN3JCb3kvYk0yUmZBWENaa25FbnByb0gySkN4alFzRjBPcG5mKy9zZE1paVJQNnpldEtNNXhSTVk0eHAwS3BYM25QUXRmYmdFUFBjc3FDNWFRekdGcm84Vi9EdzFmazFqaUt3SDVxL1JZekJlVUZtUjkvZFZXQlJaK29oQWo5RVZLNWI1RWlZb0NoUytQdGN3citmZWo4NTJTM05odmdvNDErc2pmdVlaeXJkOFpDaWd2eUZKZStsQUdnSDdJcXN0STF6ZVUzWC9abDU4ODZxV3cvT1kxQjlRb0pIUW9SUmpDQi9CMzh1SExzc2ZWVllHL1VBNTlPcVQwNHQrbjBITFhCQkFUS3IwOHFBMlZZVTErVWlvYWtVRzJwaXRhK29McGtEUmI1UlBMK09HcEFLY1Z2L0lTK0VHWm9lN1M3MVFwWVBxUmxWTlFYMWtrM1p3bHhxZER0eUhBN05qUXNIbjlsOWE1SExYUi9Fc0pWSWlEdFpDb3h3YmwySEVBeGR6bXF2UU52Q1RWTXlPR0VYQ2syN2FGMWJkZ3IyeG10dDMwamQ5NUI4NmhHZXRvemNMVFpPUC85ckZxZ095MnJpajZ6WkVUN0NYbDhKajFNL2praWNVcnp0VWpMUmk5KzFzNEkxcEp4RUMvZWJySjJ3YzdqUzYzUjRaaXZ3TkdnK21RNVJONk1XQ1NJVDJRM1B6akZzcVpFTmJEc3pnOVNXL05kSHgrOHFKVjhlLy9KWE05K0NiK2JQSnBVKzlScEZGbis2d3J6c2tQZEpvQy9pSEhXazJkck43SjhidUFNbEhLWUtsRjM1SHF4QzU1cHl1WWppRkhkZU94SHlreGExV0pWT0RMZDhDSlByckxGTURCOFd0M2xjSURYZ1gxNWhydnEvSVBZU3JkNU5kMUh3emdZSDNyQjJBNGFWNjRpaUVHaW1MK2FITlZ4ZURwQ3dIY3NmQVY5L3NNOHFNOU54QVRRTGg3VzcwWkpqNFkxVnpxbDJnT05FcTVtc0p4TCtBRm5YcmVLaW9PWnBHT3RpT0dWVWFPSTExaGFzQkMxT0NJdnZLMHV5VjRTcE9idDFwcWp0SEN3T2JINlJ3NzFVMmoyY01EeGViOHplMEdzS2ViaVNlS01WT2Z6dm1pOXhYZ2JkUDM0REUrRUhSNXN6Mk1VcFRGeWt6RjBwZmZCb3NUTEkxdGRRcGtIZzlRY0MwT2J4blRSSU9FZlNQVVhVcm1za0toWmsvdUQ4OEpxa2RORHJoSmJYVkd2ZW53cUlwNW1XOTBlaVI2blh5QjljeWNZR3R3UHhQcmlEbHYyOGQrT3FCOEFBb3Izd05nK1EwT2htQWFtejJqM3YzdWlaNEMzbStLQXNjOTA1SmVxaTkyTU85ek40NnJWcGp1N2RuUEJiVXVRQ3pqUHJqK1R3WVA2TWhBSmVwZVpIRTI1dDY3aEZSQnFoS0RSRDA1cVVraFAxSjZUWGh2VytmeEZSL1J3U3M0MGtLSzV6NHd4WFVZcFVRQ2NHbE1GWHpVaER4ME1OUmwwaU9xdEdWMXhVOVFiRzhzcURrVko2RE9wK3NmbnQycnVFWDZzWTZjK3ZMUnBqd3p4MTVEa3VwOXBHNjlreERoSTdlRS9BRnZQNnB5Tlpzb3ZwczhsbTNVSlV3V0RZYnJhRCtKRFdVZzhpT3NRWlJtNXdVeFc1OGVITmxObWJzcWxBR1I2TUdkVkZmdk82VytLWGsvaFpuUHh1anFpeDRoNkprMlpuUzAvcEh0RVlMNHdQN3E3NVdybVZZN0V2Z3gyQy85U1RidFpiZjVKdDRQVXFHT3B2bW93cEdFWXBBd3I0dFZMMkpjRS9jM09UNlM3azdYNjR6Y1laZi9ZdWZJZm1hcGE4OFdUNVA2cEV2Wk1TQWRCcWlIRnJ0K3NZanUrcHB4NDZBbm5JOThnTEtWS0FFRVRJckpidDBkN05vcVBIaE5HWVc2ZFVQZGxZZnFJcG5iL01sdmg3UHcyQWN0c1A3K3NHV3ZlMlJaNmlZVGhhOTNJZkRGOVFLY3A5ckYvY2Z4djVxZElzUzZDeVlOV0plK0pHQW9oSG5WUkdXbWZNZW83dTJ0N2w0cVVURElFT0syQXl2UDlnNXdrTzJxUTVuYTFzMXluVVczM0t6QkNCM29GNkI4TFUveVF6ZUxlTlEyL0MzUDJ5RDc3WFROMjg4Qmo1d3ZVN1ZiSkFnMjNOc0tDMzJBKzFBYjhrZkZ5TnJSeFM2ckJVSGpnNUlLSVNwOGRPd1BLMUxubzlmNmJCS2ZCZDdwdEp1dlFvQVBIWE1LRTJMZmdOOEk1QnVGV085TncrVnFLeDVLODBFbDFuc2tCaC9tRjd1Mk16aU9mS2ROalpGb3kwOGQ1anhOZlp4YlRqTU4wdGZ1MkdoTHh4N0s5RHN0ZDQ1aXpPZHhYZnBWWm9KcmtyUEs4QjhYejVtdXpsb0pVWWJBK3RBd1ZNZ2RNR3VsYlMrbWFNN3lBblQzeGtOU1QzSTdNMkR6YlNmVEs5c2VvR1VrY3Z5VHJCWFltRElheTBBeitQWHNVbHFsMTZscFM3RTA4UHlpb3pDTFExM2JCaVVCMTlXYzVjRGtSRDRwOFdXQU1od1EyYnBIQ3BxcWJqOUtXU3RpZWxpaHd5WktySzM2WE5xS0pUSy9PbkxYUjJCODJieE02WUNNMjZ6TWw0SEgyV2tqWWNzUzlwaFR1cVVzOHJuMnlvbjMvbXZvR2FNdkExSVh2TUgvWmpjK25hNGNnMElLWTgzcFFBcXFva3Yrc2QwL3BVa3pnNGFPOUJPTTZXaUxvNEpiRFFobUtVZEI0aWE2VVVjektaMnRLdXJHOWw1WTNMV3JVYytDallmM0tadVlEamVMZnBTVHEyeDBjWXFORC9mUWQ4WHpJa0FGSzk0NmV1N1hNcVZYMHFlTlhaOGpXRENGNTRseGVzSWgxeG1XY2M0TzNESlZtOFAydDAweWhjanNNenIrcHRZeVVnYkdtN0JYS1d4TGRnTGlBTGVyN0gzY1JteE5maFJVSk1YTHpRWXdzc0hLbjJseTJqM3JmQTY5SGNJeXFYSnNpSmZoVEE1a2VaTGxZV0c1MFpqaHRxQTYwdFAxS0x6M0xvbkU4ZVgvbktySGwzZm56ZnlubHNYQ1lJRmZiUVJYVDRhT0d3ZlZFTE55OW1peW9iM2YxMzM4M1IvWVpFMmtyOGZ3KzY2TzVvcDZKNXpPN2kvU0pIbUZYcGFYcDVxVjU1RlhDQUdxSzJSMjJlKzByUG5VVFA0M0ZlYkFXcS9DbWRydjdGL0RhODB2cUo4elRTVUQ5M0dYek5ZS0c5dUFYeFQ1OGpQb3B6eXdiaUZJTGJXbmFMTnl0Ym1VRDhONEhtbnJ1czBVWlp5bWZMS0RQRkc5MWNZYnJkMDRBcnEyb2t0L1IrM1pqUHpna2EvTmRFR2lrMXpXZXBwZlV3RUh3TDNGWkZwbnA5Si9hMmpxZ3VZc1FXL05jSXR5WHFmY3NtYTM5MVJlZ1RTRW9Xc201WG54NlIvWkFNTVJRejcyY0gzeVZTUDdIMWpKc0k5M3VzM1VteFN4SEdnLzQzY2JVc3RsRnpHSTVHKytxZUV4UzJIQmJrNTZ1WjlqeFRCWDVYcmVmaUJac25YTEdxbGVSbVpGTHFDUTdERUgyYWZPc0VDSVkwQ1diVTMrb0JGMjRac2Q5M2kxcGpudWRrazVudjB0M0NkT3Iyc2JJSU5zdVAySFFUTDh6V1J1R3pia3hyWEFFOXNiSXZBeWlBMFZwbHhodlExZWluODJ4eWVBa05Sc1pGZkk3Yk9pdnFweHRETTBhY0JoajNjTnNOcUkremFvRE92SCtqeGl5Wi9jMHNXNkU2YnlzRSsvZFo0WTBSaElheHhiZHJtbW5GWnpKQkFGR2lCUCtqRm9iZnlQUHdhNFAzYjk0Vk1raUdNeWgxZDdhSTY1a205TFBielVUTGVxQ3JaOHdmTG1ldVp1OWIrbzlRZXN1YnVNY3Y0TGdMNlpreVVjdDVSN1FtVGZvakY0Yy9EUHM5SGZJaG10b2VXYjZ2Vzh0cXNNQzY4bEgvNlJmTVN4dlhySHVuRGkxV2VjY21KSWxXQjRmd0xaUWNoRHlxTXpLOTFWZ2MrMUFuV3VtLzdLWjhWc0RXaFpaNlVPZnl3dGVQODVRdm1hTlhKTDlDQkRxZUpBLzA5OVBpMzBjSmREemxqWGZxMHl2bDRoV0M5RXM4RWdNcGs2b0FkZXNFZmNEM2VTUDZKY1pHSWI1dm5lUStWSmdhMVZvbW01UFE0MTVneFBwem5PSEh1OFlEQnJ5Rm90ODZsQm0vUHZBZFZST2YvK3lHU250ZmNpM2c2cmV6bm0zVUgweGF1Ym13d3ZJbnNQZnJWc0NMRS9RbVQ0Q1M1bTB2dVpoZW1Sc3FZMURBU1pTaFNIcDlDQm8rTnd4QXROejFUT3lhQ2ZyVDJhWVRhemNzbTVsYXo5YjNzREpxMVp0UlhCNW9VU2NGKytYcU5XRnRlUkIvOEh4NHA5Qmh5dlZxMW5NVjljMUpNc0FLY2loSys0Y1VuK2pQUTUzYjl0R3YyT0FRK0kxcytHek1iTUtLb3RNSHJ3RkMrZEl4ZFZwdHBGT2RHY3IyejJERmg4eTFBRWRiTzhMT0R5b21uRTZkMlJWR2VzbVByRHIrZ3V5RnFseW11Q2gyV3JBRW9DTGNlTFVXeVpkRnA2TGQ1OEFXdlNXS3RVd2p3Z2VnRzBWb0hOZ0tXS3p2SXZQeWF0cG5mU1ZDRjJzVGpYdjVxb3VCa0RZbVZnSnBnaEZQcXJHRkNpSThRNW1yWTdwQzE2M2g2dnhCVTd6NjlLOS8yN2ZmVTFvc2lnMmVobVNmRVd4U3NHb1B3ZjluTEhWdm11YjltdGNyMVRzdHcvT20zZnc1SHo3KzBhUEt3TEllSE5mNHV4NkMvMXVrVDQxL2tNNFMrNlhJNi9YVDZTRHhzSHFFOUNLRC9oeXlLOG9DcTgxdHBpa1htdjJick41MlMwOGR5YWxkWjdyOTY5cGZtTGg0dTNCaVNnSXJXYXkxdUdJb1F1SXFybDQ0OGlCaVI2MkFweVUvUHE5QjNKU2xodzIrK1k1VG45aFdHeTREbHVWY0c3c0ZDSXo5SGxNZ2NOd2JYRkJGYUE5cXlBb2MxbjlrUE5laiszY0crMzA1N3k5QlJ0d1U3S1RTaUJsMlJ0MWR1eG4veEUza1dxUzRaTm9WZmcxYlFQWG1RVTNFMmFyUmpwbUhweXAzRGM3b2dySWJVQnVSUXBlM2VrcFRCSlBYc2NHR21qSTQ0bVdJTFBZMDRYRXpUbnQzUHZadGFPUFBoZW1YL2hsek9BMTVTbEo5VkM4Y01BSDJhVkVkWWtBNFJIdytSSmdpb2pSTFFKb1NQRmZwZzlGdkVkS2FmSCtpdkwyNVpmYk9aZkZ0M00zVjJmTkRRYlJucFB1RU9VeTM2WkYvNnZsMng3cGZLKytxR0QxbmxuTkFsaFZreUtIZVpqZWJIa01Vd2RRTitQR2xVZU1vbXBYb1QzVU91dlZZcDV2dFJhQ0JlRWJLcDRXNVBRWTlzZkc4eUxBajhtQzlyTEFWWG5nZDN3QVJ2UHZqampMUXg3R3QxSDAvd2ZvUXRQaXg3MzkvWkFTUkI3TURtV3hhTzFLclF3ZXk2YUdUZHBBMXlKdWFyZ3RTR042ZnhObHA1MTQzNys2bmNlMXBnYzM1NkRwbml3TXUyZ2psaW5Ca3hoN3doNk8weGoxOHNvd0ZYY1ltQ040anVSMlh0RmpFaTZkVEc1dElHeTU5YXdMdENrc0N6YXJlam9lTVoyaVR1bXhxV3IvVDBqT1BROE93d09ISlc0NzdQNHNUYXZaYmt2ZHRiRjZjUXRPckRlcVl6VlFhcUZmVmd1bW0xbHU4Unh0aXNFOU1pejN4eVpGVlhIY2NYUHpQTEtLaW45T0hxUjZud0Q0WjJ6YTErVzA2ZUk2U3VqK3FVSUZRYkc3S3BZLzFxU05UcCtucVdRUGxaclRldVdiUEt2RWt3WkRqT3NjMEZ4UWt0eERlWFpsTk1yTlVHVUl4STFGd0JEN1ZnZnl2eVUzZlZuTkpKd2NFK2JKTHY1aGhsVmh2cmZlVi9ZR1Fha2ZWT3FLQ1BiOTI4Rnp5YkFyVDlYTmMrNkowdmhBbnFtRW44aDZiaU4rbjl5b3dwRzBiaTR6bDBLQ2tvS2RuMkh3Vi9XWXZQeVRvSm84SkpsV3Q1YnZINS9yTzRQNXRHbHFFeFM5RFlhQkpaNGtyR3JvKzNIRnlaRWVUZTdMb1R3cnlEMlZmblpqczVZaS96eVNBejhxTkxCYkM2amVTSkNWT0RPcXhnZkZLUFJzVVdzYVgwZ09MMnlud0JpM2N3ZkNHdCtGa0ZvYTVyRjVTemdNOVlvalMwb2tvQWxrRDd4TGNZRlFvYVBCdVdEcGZHN1dBSUR2eGtzTXRWMTB0ZWtrZGd6MEJvai9VMUNvNVFTZ1dURmZWaEx0dk1BTjJwTkI3QTNOdjNMbWw2eWFrQ08wakZWWXI2dTVGWnU2WHFBaXp4ejV4ZzNnRm5iSnRDcTYzTi9yS1l2UmM1UVc0bXlFaDhnRlVSZ2Q3Y3JXaDQ3NXdpdXlZVExkNlJYOTAvSU4xUXozSTFhdkJvbXQ2MWZZKzJoSlZtSmgzL1VmS2x1Yk5lU21vRXU3L1pwNU9sdGhIeWlpQ0ZHYUZPUnh2c0kvV2VlaVBaQS9tczZSajE4ZVJpMk5kNFFUQlUvZUtiSFVrUHZvbGFqWkpMc3ZkRk9OeHRsLzNDNDBod1BVRlFMT0xka1huVDRwbWRaWURQSWZzRHY3WUczMG5EY2RPZjZMZUpRN1JEa2dOYlFwNGhFaGtHb3JoanVweWJaZ0pjVXR3SlgzMU9yalhSc2hWNjIxdEpEYnVpN29GVDd4Ky9IUFJ1dnZZa3c3SGNRYnNTUU5LTURRUGs0QmVjTWF1MHZEQUIxT1B4YjdjL29JdlRhMURmVWl4TWY2aEhMUkFNWE4xVkNCVXQ0Wkpuamt4Ynl2clFHN2VzWnZwZlVWazFyS3NVYzMwY2F6a1ZVNDVvTEp3TWRWYXM2V1pCZkhRbVIvN3VlaVJ5YXpWci8vZThoSmlYYndMdU5JMklIM0xzSytROXQ5elhPbXVIQmtYcE5laFd5RUM1Vi9wc3UxblhxUnlyV2F2TWVZbWdyc0hhbFBxOXdKMEMzaTZ3cWpDM0lJbWFGTXA4RjA4U2RoSTJpYTFkVVJNSTBvWExsSWN3dWNMODNieGVYQVRnQk9GeDhjVkZ1amxoOG1ZWnpGTk94Wm1Tb3IvSWJIT2FKOWhETWpZYUdUa0ZnV3ExV0ZrdzA1ZmluRElqc1YwbmduSisyYjFLZ0txdHEvb0tnWVNmSlBEMzcvZHhmY1pYTmdweWwydTlVd0JDMlc1bldGVTJVbWh1Q1ZWMU5BNGR1UjhkOWRJYkd6TXl4WTZHb3k2ZGFTWUhwUGxEdXZKZ2h5Um03ODRRUWw2WnVDK3V6dXFrMHo3bnRmZEY0N3ZZbWxtbGJuYWQ5NEw5RXovV21PVzdmTEwwZ3FFSSttUHovWk1XaC9ob25GWERSV1l2dzhyK1VzNWhuSkFtM1JLNHpaSDA4RjlyMkhLVVdyTzhYZzlKMVRjNTNVdVJTOGo4MGFuK1Qwa3ZKaklkMlA3dVRFS2RHa2tWbVc0M21odnoxQjIxR0lBeXhVU244ZzJrS0thaEE3SmkrMmNqSC82QTVBSXJtYmhNVndkanZZaVA4Zkl6dHFqS29WRjlqenpzcjU4TnIxRWI1dC9YRlp3ZEVCVTlYaHd2dmJ5QWhZMkNRR3p5MDhCb1l6WmdWNVNtMFNaUmRNaTJGWmFiVS9udjFVUis2Mmo2d0ZYaXNrYmN1ZE9SMktSU2lTaEZYZUtKT3NCcktQTmRoNjJONXp3cDg5M1M0YmZXN1UyUXQ0bzJuTTZZRktkd3NnS082VDkyOWJxb2N4ZnRmNkUwdm9QTnJEMUcxUG5CY2V3QlA1bkMrUncwbUpKMi9LNThaUlJVdzdVV0hEZER1V3lrMzBEeVg2Z0thdDJxYzN4YWdFbFVnTUoreHY2eUNYMzJFZHVobHoxYVBsS1pVays0aXhvMUYweWF3bm1KV3JNdmtVeVp2c0hWNTJDWmdBbTBJSWV3aitSR2d1aXc3eUlqTFh5b2xuQ2txWG52TXYrMlVndmoyZUV1elg1SUtXUHRncHVJTmNocEs3QnpKdVRaK0pjZHdJQlk5K1k2aHlNeGxCMlgzMU5MU0ZHOUp6aHhQWUlJc3M1WU45dEJHbTQ4UGx2S3BaeTgrZ2ZtdWRWRkRZZk9vVU5XZmhmYUllNGQ5bS93d1JmUHB6dTFDbEFIL2RqR29INTJHWTY3MjQzTkhuamh6VEMyRUlHVTd3OGJ0WWFQWXY0QlUvNGYvNGNySTVEamx3NTQzK0dXbUJQUzlHLy9CelpNV3JpUmZTYWRUTXRxODdhWG83MTE5dVYrdStZZ2YvVU1ydENkeVMrS2h4c0lMQmVvU3dWZWtKQWRnQ2huejZDTGxUcXB5dFpiNVZ0Rlh6VDBab29lWFJEMDRzQVRMK3A4c1NuaEtUVng4QjBrc0dESWhYajVEMVRjUTJLbldjYXMxaXp5cm1aY3RVRlpKME1ibU5QdnM2T3R0aDVkTlhpVlkyRFVUSnZCVjEwUW4ySHdwMytQeVU2WDB3NUtTRjFRN3hDWkxLcHhIbzdTbVkzbkJUY1h3T1NpYXlUalB5UFAxQ3dzNStOZjMrTnFvNGo3c2tRR2pHbkkrdnJDYzVibXZOZXJpZktranU5cHUvTDQ3ZkN2RDAwSHVqNFFHNEpoYytWRy9zZ2IvZXMzb0hyU2c1RHQxcEl3Z05xbEI4WDN6WWdKVm9xcjcxUm10V01pMzdDK29VWitFeUNkWEI0eVcxWEprMVBPbUlOaWJ2L1RtUGNOWnhGRFQ5SFVOUUNDMEk5OFRUczdUNG9oOUtQbldxa2hjUTFOMGxoV2lZbXhRY1JMeG1OWGNFUTkxTjdEVW9IMUNWYW5yQ2NrTDA4SVlTSXo5N1haMHRZZTNRd3RxdDhGK3pocXU0ZzhtYmQ5ZTJuSzlxM3JkYTFpQjdFZnNOTHFjTHR6eW9MZVgvb0RLWXJvbDJNNjd6RURYQk10elNyTmI1cVlhMVdQVWdCL0JYcU1ialFrQkxXWFBJU0Q0eFdpRUs5Slp3T3BTUXZ4UVpEdkllNUdCNlBpZXc0MmxSV3YrdWNqaXFLWithdHdZbGZkTElOVEpGcExQeVdlWUl3WHNINnJ0SkFybE9aY0JHeXg5Mnludk5XaTJNSGhkNjFQdllqWHVycGZIdm55dXVveGFjUGdidjB5RW9HUmZpUngyZWdxd3VQVHpiL0h4RlFaRFZLanlhTnNLdnAxc0drK2ZKbXZoSVQ4Z09seis4cXhtTmgycFViVUVMdEdnSWZsV1VBdTdxL3ZiM3dxZm00SzA1VkJ6UGJFcFFmWWZ4WVJseFFYRmxVTCtMOXprZzNGdExWWldCckd1bFRjT0hveHRWY2lhN2xQd1Bwb2xQbkFqVVRUTGp5WW5ieWl1MUM5Z1hNWktFMHc3Vk5HWExQQjNZU1lvMUdoUEpRclIrNCt4YWVKWWVKT3NVSDdJUTdsMEpZZWxhY0s4bTBwWC9VeEk4N2ZIRzhPSUJ2RXR5blpidTBVdldwL0NEVjdWeDQxbTBYcDlmclVNLzlqb3FlbmxaczJuYVBVZTNGMjhkNDNFL3l6MzVzOHRNaDVUelFadWQyY1UyeHgzYmM3dll5blFQWkoySWd6czl2NHFaVldCczg0ajNFWkpCeDcvUG9XZXUvMHMyM29IZXVuSVFBY01PTFNGVGxxTGlOWmhsTjlTa3lWZFJvdzgyVDd4MkIxelR0TkEvaXJ0RDNOUWg0NGFIMjZTLzhoMUJyUERxQ3MwMFVON3hVdlJSY05xd3hlajN1Y3EvelhqMkJZWlppZXNnNHp4MmhPdSt5QWViMnpIWE1FR0ZKQnVRSkxRdStIdnF1NFo4NG8xNnRSaHFaVmUvSDZtUnp0NWZwNzc2NTM0UlAvZ0l0eUhQNTNWV3o2QTgyWlNKMjI1RGprbjAzOUdNQ3cydzFRK1NiWks1SlJWQlRIT0IraHdUb3h6UTVoMEhOaHJwTERhRm4yVGwyVDZ3a1BmSXZZL05xeVZHWTNIWndabk8vbWFCZjUzMG8xRFgrcXFhL0MzOElQZ0x1c0VPZENYVmo0djgrOEZodk85S3czeW5XYnZ6WHhKRWRoc01HdWZQaU83NDlQYXA4dkxseW04ZzBPVFUxcXlUTUNEU2J1bHVKeHArODBwb3ZOM2pRWnh6S215akFQaXQ2UVN4UCs2VnJkSlNtbk5jcm1xaDl3d3N1VE0vVlVsUHhVb3ZpOXFoaCsyVnFUa3ZQM1dGajZsZS9rQmJIME8xK2l0TTgrV1NybitpRGpiZkJPeUd6M3E2cmp2RGpaMVRmaXNCVWxQcmF1SlB6TFRXejA5Z2VOd2RyK3ZVVS92RzcxQTJLK1BvaGlDc0ZKTER4cnE0MWpQY1luUEtVOXZZWVdZMTZ5Tmh6UDBQZmtLMkhGKzVkek93YjNPRXpsdmlWYVMxWDZ2ZEkvN0lDVE9JNzNWelNjYTBROFcwOVVLSmMwUTg0aUIrOTVwbTNzS3hlZ05zSUVZTGh3eVAvLzB2SnA0M1N3d2QrTFo2amhBOXpKOFpmeDVlMVczdmlpdkdFeHQyUXU3U1Q2R0JWNjMzTUpPaGpvR05tS1VlT0xPcnMvOGFhNit0bHBZZUZZYVB2RDlQTDR6S3R0YjkxelNTRGNMSGtlQ0FEL3JlL2hJUGd2RnQyZ1ZvNmhEandNM2lsMDdEZXBEZFFOQTZadGV3RGVpaG9qTWhqVXpGOUFKNkNCN0RPSHRPeEQyZWJrZEgyaSt3MUFIdlFYa2NXaGoyZkxrVnRkSFR6NDhlUnFYMjYxOGlha3dGSE91VVFGL0MrcjFPT2tDbDFiMU5OK3MydkozWEtjNDUzVVZsb0RMZkw1dmZoRDdaK0swTmszcWlhYXVjRXk0OEZWdDJpUkp3L3pPSDR3UWVLL2t2K29ZSWFKMUs2UnZYSFlwUVpuV3crUHVvM0d4NFk3Q1E2UnFNN1J6eWhlR3kyaWViOUhGeG5SNVBZdXZQOE9VZjNmQ0orcHdROXVQSjhQbG5RbHhGZUxaaGtXYUVQU1FqdmJwZXZuYmNxaXF6b2YrNUhBSTEwRGJ6WWV2VDFtVEZzOXl1OGdNSUgvd0hMVTdkWStDRUhoTnpCdElHSUgxK3FwQkRtUlE2dEExUFV5SU1vazJmd0ZnR0NVYlBEQ0FLSlI3VThma3BWS2lvNFpJQW4rYWpzcG5CUWdqc1czWCtiU0lublhuNXg4ZTRUVnQyL2J6ZGgvcUFUVVY3VGluSG1SaDROL2hPbW5xNkNGVWhPY250N0E4L1AxQ1IrZEUwQnBWaVZIRm9HcjBBam8zR2lSYlNybzIzNVRlYytvTi9hcHg3MG5FTGpaWjFleWtuWWlUZ2FvSzk5cFB0UnMwL204M0NMaU41MHpjTWY2N1Mwem5qZm1CNXE3TXBjYU0rOTZLN2I1SEJPa253N09IdkNycWlMUkpUTDBKek0rV0dLOVR6OVpzU2VOdHFwTUh0TTJUanh0WHNkMXZRdE9EUit4dURhRnZja204K0x0eGJIK3gzdzQ4NXVqOUlZcUdBWnk5VDFJWjk0Rzh0MmFiOHQ4bzBUcGtmVGRZejhTejFycnlmQ1l0M3B4amVta01xdXdoMFkwTHFzSHNVNUtEbEJQZGMyenZqWkQvWklwMm1BZGZhWUcyMUFlQ2RmWjBvT212akxMdUVNUldMdUtvSWdGRWMzWGwwcnlKcENjMnZSSjdnQ2llUUU1OEg3T0RHamZ5K1MxZVNwd0tLK2tDdHJvdUNOckZNRGJaaE5oMjhOWWJadWFmOEdnMnRiMGw2QjgyTGdsYnBSd1VxKy9ScXZ5RGZjeDc4Y3BDcnBqL1BETGI5ZTU5UGhqc3NrTDIzcktDaTc0RkMvZitKTXF1eE1WcGtQWkVWckpDNHRIYzdmREt1L0orWnhWRXFBUnAzNVJMSmorejRkWFBsak1pUHdTaWhIS2ZZOXpPMmh6SDBxY2g5MGFDSWVDYVBOR1FUOW1uSXAvZCs3cnp0aklWN2ZMaWRXaDhoNTBsMzdOc093aDhCMUNvTXo3em81MWxTMzVBQUZKWlB0dGx3VWNieFBkUEZWemw2Ylg4cVFuVGJUejlnaHhPdkVqL2U2Nm9NMjF3SnFYWTFWV3dLWmpwck9oMElXNE05cGJGeGJlVmVyU0hlZ2UvZHovQWZ0RDM5TT1cIjtcblxuLy8gd2UgbWF5IGJlIHJ1bm5pbmcgaW4gYSBicm93c2VyIHNvIHdlIG1ha2UgYW4gVWludDhBcnJheVxuXG52YXIgZGF0YSA9IEpTT04ucGFyc2UoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIHBha28uaW5mbGF0ZShiYXNlNjRBcnJheWJ1ZmZlcl8yKGJhc2U2NERlZmxhdGVkRGF0YSkpKSk7XG52YXIgdHJpZURhdGEgPSBwYWtvLmluZmxhdGUoYmFzZTY0QXJyYXlidWZmZXJfMihiYXNlNjREZWZsYXRlZFRyaWUpKTtcbnZhciB0cmllID0gbmV3IHVuaWNvZGVUcmllKHRyaWVEYXRhKTtcblxudmFyIGxvZzIgPSBNYXRoLmxvZzIgfHwgZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIE1hdGgubG9nKG4pIC8gTWF0aC5MTjI7XG59O1xuXG52YXIgYml0cyA9IGZ1bmN0aW9uIGJpdHMobikge1xuICByZXR1cm4gbG9nMihuKSArIDEgfCAwO1xufTsgLy8gY29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgc3RvcmVkIGZvciBlYWNoIGZpZWxkXG5cblxudmFyIENBVEVHT1JZX0JJVFMgPSBiaXRzKGRhdGEuY2F0ZWdvcmllcy5sZW5ndGggLSAxKTtcbnZhciBDT01CSU5JTkdfQklUUyA9IGJpdHMoZGF0YS5jb21iaW5pbmdDbGFzc2VzLmxlbmd0aCAtIDEpO1xudmFyIFNDUklQVF9CSVRTID0gYml0cyhkYXRhLnNjcmlwdHMubGVuZ3RoIC0gMSk7XG52YXIgRUFXX0JJVFMgPSBiaXRzKGRhdGEuZWF3Lmxlbmd0aCAtIDEpO1xudmFyIE5VTUJFUl9CSVRTID0gMTA7IC8vIGNvbXB1dGUgc2hpZnQgYW5kIG1hc2sgdmFsdWVzIGZvciBlYWNoIGZpZWxkXG5cbnZhciBDQVRFR09SWV9TSElGVCA9IENPTUJJTklOR19CSVRTICsgU0NSSVBUX0JJVFMgKyBFQVdfQklUUyArIE5VTUJFUl9CSVRTO1xudmFyIENPTUJJTklOR19TSElGVCA9IFNDUklQVF9CSVRTICsgRUFXX0JJVFMgKyBOVU1CRVJfQklUUztcbnZhciBTQ1JJUFRfU0hJRlQgPSBFQVdfQklUUyArIE5VTUJFUl9CSVRTO1xudmFyIEVBV19TSElGVCA9IE5VTUJFUl9CSVRTO1xudmFyIENBVEVHT1JZX01BU0sgPSAoMSA8PCBDQVRFR09SWV9CSVRTKSAtIDE7XG52YXIgQ09NQklOSU5HX01BU0sgPSAoMSA8PCBDT01CSU5JTkdfQklUUykgLSAxO1xudmFyIFNDUklQVF9NQVNLID0gKDEgPDwgU0NSSVBUX0JJVFMpIC0gMTtcbnZhciBFQVdfTUFTSyA9ICgxIDw8IEVBV19CSVRTKSAtIDE7XG52YXIgTlVNQkVSX01BU0sgPSAoMSA8PCBOVU1CRVJfQklUUykgLSAxO1xudmFyIGdldENhdGVnb3J5ID0gZnVuY3Rpb24gZ2V0Q2F0ZWdvcnkoY29kZVBvaW50KSB7XG4gIHZhciB2YWwgPSB0cmllLmdldChjb2RlUG9pbnQpO1xuICByZXR1cm4gZGF0YS5jYXRlZ29yaWVzW3ZhbCA+PiBDQVRFR09SWV9TSElGVCAmIENBVEVHT1JZX01BU0tdO1xufTtcbnZhciBnZXRDb21iaW5pbmdDbGFzcyA9IGZ1bmN0aW9uIGdldENvbWJpbmluZ0NsYXNzKGNvZGVQb2ludCkge1xuICB2YXIgdmFsID0gdHJpZS5nZXQoY29kZVBvaW50KTtcbiAgcmV0dXJuIGRhdGEuY29tYmluaW5nQ2xhc3Nlc1t2YWwgPj4gQ09NQklOSU5HX1NISUZUICYgQ09NQklOSU5HX01BU0tdO1xufTtcbnZhciBnZXRTY3JpcHQgPSBmdW5jdGlvbiBnZXRTY3JpcHQoY29kZVBvaW50KSB7XG4gIHZhciB2YWwgPSB0cmllLmdldChjb2RlUG9pbnQpO1xuICByZXR1cm4gZGF0YS5zY3JpcHRzW3ZhbCA+PiBTQ1JJUFRfU0hJRlQgJiBTQ1JJUFRfTUFTS107XG59O1xudmFyIGdldEVhc3RBc2lhbldpZHRoID0gZnVuY3Rpb24gZ2V0RWFzdEFzaWFuV2lkdGgoY29kZVBvaW50KSB7XG4gIHZhciB2YWwgPSB0cmllLmdldChjb2RlUG9pbnQpO1xuICByZXR1cm4gZGF0YS5lYXdbdmFsID4+IEVBV19TSElGVCAmIEVBV19NQVNLXTtcbn07XG52YXIgZ2V0TnVtZXJpY1ZhbHVlID0gZnVuY3Rpb24gZ2V0TnVtZXJpY1ZhbHVlKGNvZGVQb2ludCkge1xuICB2YXIgdmFsID0gdHJpZS5nZXQoY29kZVBvaW50KTtcbiAgdmFyIG51bSA9IHZhbCAmIE5VTUJFUl9NQVNLO1xuXG4gIGlmIChudW0gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmIChudW0gPD0gNTApIHtcbiAgICByZXR1cm4gbnVtIC0gMTtcbiAgfSBlbHNlIGlmIChudW0gPCAweDFlMCkge1xuICAgIHZhciBudW1lcmF0b3IgPSAobnVtID4+IDQpIC0gMTI7XG4gICAgdmFyIGRlbm9taW5hdG9yID0gKG51bSAmIDB4ZikgKyAxO1xuICAgIHJldHVybiBudW1lcmF0b3IgLyBkZW5vbWluYXRvcjtcbiAgfSBlbHNlIGlmIChudW0gPCAweDMwMCkge1xuICAgIHZhbCA9IChudW0gPj4gNSkgLSAxNDtcbiAgICB2YXIgZXhwID0gKG51bSAmIDB4MWYpICsgMjtcblxuICAgIHdoaWxlIChleHAgPiAwKSB7XG4gICAgICB2YWwgKj0gMTA7XG4gICAgICBleHAtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9IGVsc2Uge1xuICAgIHZhbCA9IChudW0gPj4gMikgLSAweGJmO1xuXG4gICAgdmFyIF9leHAgPSAobnVtICYgMykgKyAxO1xuXG4gICAgd2hpbGUgKF9leHAgPiAwKSB7XG4gICAgICB2YWwgKj0gNjA7XG4gICAgICBfZXhwLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufTtcbnZhciBpc0FscGhhYmV0aWMgPSBmdW5jdGlvbiBpc0FscGhhYmV0aWMoY29kZVBvaW50KSB7XG4gIHZhciBjYXRlZ29yeSA9IGdldENhdGVnb3J5KGNvZGVQb2ludCk7XG4gIHJldHVybiBjYXRlZ29yeSA9PT0gJ0x1JyB8fCBjYXRlZ29yeSA9PT0gJ0xsJyB8fCBjYXRlZ29yeSA9PT0gJ0x0JyB8fCBjYXRlZ29yeSA9PT0gJ0xtJyB8fCBjYXRlZ29yeSA9PT0gJ0xvJyB8fCBjYXRlZ29yeSA9PT0gJ05sJztcbn07XG52YXIgaXNEaWdpdCA9IGZ1bmN0aW9uIGlzRGlnaXQoY29kZVBvaW50KSB7XG4gIHJldHVybiBnZXRDYXRlZ29yeShjb2RlUG9pbnQpID09PSAnTmQnO1xufTtcbnZhciBpc1B1bmN0dWF0aW9uID0gZnVuY3Rpb24gaXNQdW5jdHVhdGlvbihjb2RlUG9pbnQpIHtcbiAgdmFyIGNhdGVnb3J5ID0gZ2V0Q2F0ZWdvcnkoY29kZVBvaW50KTtcbiAgcmV0dXJuIGNhdGVnb3J5ID09PSAnUGMnIHx8IGNhdGVnb3J5ID09PSAnUGQnIHx8IGNhdGVnb3J5ID09PSAnUGUnIHx8IGNhdGVnb3J5ID09PSAnUGYnIHx8IGNhdGVnb3J5ID09PSAnUGknIHx8IGNhdGVnb3J5ID09PSAnUG8nIHx8IGNhdGVnb3J5ID09PSAnUHMnO1xufTtcbnZhciBpc0xvd2VyQ2FzZSA9IGZ1bmN0aW9uIGlzTG93ZXJDYXNlKGNvZGVQb2ludCkge1xuICByZXR1cm4gZ2V0Q2F0ZWdvcnkoY29kZVBvaW50KSA9PT0gJ0xsJztcbn07XG52YXIgaXNVcHBlckNhc2UgPSBmdW5jdGlvbiBpc1VwcGVyQ2FzZShjb2RlUG9pbnQpIHtcbiAgcmV0dXJuIGdldENhdGVnb3J5KGNvZGVQb2ludCkgPT09ICdMdSc7XG59O1xudmFyIGlzVGl0bGVDYXNlID0gZnVuY3Rpb24gaXNUaXRsZUNhc2UoY29kZVBvaW50KSB7XG4gIHJldHVybiBnZXRDYXRlZ29yeShjb2RlUG9pbnQpID09PSAnTHQnO1xufTtcbnZhciBpc1doaXRlU3BhY2UgPSBmdW5jdGlvbiBpc1doaXRlU3BhY2UoY29kZVBvaW50KSB7XG4gIHZhciBjYXRlZ29yeSA9IGdldENhdGVnb3J5KGNvZGVQb2ludCk7XG4gIHJldHVybiBjYXRlZ29yeSA9PT0gJ1pzJyB8fCBjYXRlZ29yeSA9PT0gJ1psJyB8fCBjYXRlZ29yeSA9PT0gJ1pwJztcbn07XG52YXIgaXNCYXNlRm9ybSA9IGZ1bmN0aW9uIGlzQmFzZUZvcm0oY29kZVBvaW50KSB7XG4gIHZhciBjYXRlZ29yeSA9IGdldENhdGVnb3J5KGNvZGVQb2ludCk7XG4gIHJldHVybiBjYXRlZ29yeSA9PT0gJ05kJyB8fCBjYXRlZ29yeSA9PT0gJ05vJyB8fCBjYXRlZ29yeSA9PT0gJ05sJyB8fCBjYXRlZ29yeSA9PT0gJ0x1JyB8fCBjYXRlZ29yeSA9PT0gJ0xsJyB8fCBjYXRlZ29yeSA9PT0gJ0x0JyB8fCBjYXRlZ29yeSA9PT0gJ0xtJyB8fCBjYXRlZ29yeSA9PT0gJ0xvJyB8fCBjYXRlZ29yeSA9PT0gJ01lJyB8fCBjYXRlZ29yeSA9PT0gJ01jJztcbn07XG52YXIgaXNNYXJrID0gZnVuY3Rpb24gaXNNYXJrKGNvZGVQb2ludCkge1xuICB2YXIgY2F0ZWdvcnkgPSBnZXRDYXRlZ29yeShjb2RlUG9pbnQpO1xuICByZXR1cm4gY2F0ZWdvcnkgPT09ICdNbicgfHwgY2F0ZWdvcnkgPT09ICdNZScgfHwgY2F0ZWdvcnkgPT09ICdNYyc7XG59O1xudmFyIHVuaWNvZGUgPSB7XG4gIGdldENhdGVnb3J5OiBnZXRDYXRlZ29yeSxcbiAgZ2V0Q29tYmluaW5nQ2xhc3M6IGdldENvbWJpbmluZ0NsYXNzLFxuICBnZXRTY3JpcHQ6IGdldFNjcmlwdCxcbiAgZ2V0RWFzdEFzaWFuV2lkdGg6IGdldEVhc3RBc2lhbldpZHRoLFxuICBnZXROdW1lcmljVmFsdWU6IGdldE51bWVyaWNWYWx1ZSxcbiAgaXNBbHBoYWJldGljOiBpc0FscGhhYmV0aWMsXG4gIGlzRGlnaXQ6IGlzRGlnaXQsXG4gIGlzUHVuY3R1YXRpb246IGlzUHVuY3R1YXRpb24sXG4gIGlzTG93ZXJDYXNlOiBpc0xvd2VyQ2FzZSxcbiAgaXNVcHBlckNhc2U6IGlzVXBwZXJDYXNlLFxuICBpc1RpdGxlQ2FzZTogaXNUaXRsZUNhc2UsXG4gIGlzV2hpdGVTcGFjZTogaXNXaGl0ZVNwYWNlLFxuICBpc0Jhc2VGb3JtOiBpc0Jhc2VGb3JtLFxuICBpc01hcms6IGlzTWFya1xufTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgd2hlbiBHUE9TIGRvZXMgbm90IGRlZmluZSAnbWFyaycgb3IgJ21rbWsnIGZlYXR1cmVzXG4gKiBmb3IgcG9zaXRpb25pbmcgbWFya3MgcmVsYXRpdmUgdG8gYmFzZSBnbHlwaHMuIEl0IHVzZXMgdGhlIHVuaWNvZGVcbiAqIGNvbWJpbmluZyBjbGFzcyBwcm9wZXJ0eSB0byBwb3NpdGlvbiBtYXJrcy5cbiAqXG4gKiBCYXNlZCBvbiBjb2RlIGZyb20gSGFyZmJ1enosIHRoYW5rcyFcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9iZWhkYWQvaGFyZmJ1enovYmxvYi9tYXN0ZXIvc3JjL2hiLW90LXNoYXBlLWZhbGxiYWNrLmNjXG4gKi9cblxudmFyIFVuaWNvZGVMYXlvdXRFbmdpbmUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBVbmljb2RlTGF5b3V0RW5naW5lKGZvbnQpIHtcbiAgICB0aGlzLmZvbnQgPSBmb250O1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFVuaWNvZGVMYXlvdXRFbmdpbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5wb3NpdGlvbkdseXBocyA9IGZ1bmN0aW9uIHBvc2l0aW9uR2x5cGhzKGdseXBocywgcG9zaXRpb25zKSB7XG4gICAgLy8gZmluZCBlYWNoIGJhc2UgKyBtYXJrIGNsdXN0ZXIsIGFuZCBwb3NpdGlvbiB0aGUgbWFya3MgcmVsYXRpdmUgdG8gdGhlIGJhc2VcbiAgICB2YXIgY2x1c3RlclN0YXJ0ID0gMDtcbiAgICB2YXIgY2x1c3RlckVuZCA9IDA7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgZ2x5cGhzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2luZGV4XTtcblxuICAgICAgaWYgKGdseXBoLmlzTWFyaykge1xuICAgICAgICAvLyBUT0RPOiBoYW5kbGUgbGlnYXR1cmVzXG4gICAgICAgIGNsdXN0ZXJFbmQgPSBpbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjbHVzdGVyU3RhcnQgIT09IGNsdXN0ZXJFbmQpIHtcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uQ2x1c3RlcihnbHlwaHMsIHBvc2l0aW9ucywgY2x1c3RlclN0YXJ0LCBjbHVzdGVyRW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsdXN0ZXJTdGFydCA9IGNsdXN0ZXJFbmQgPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2x1c3RlclN0YXJ0ICE9PSBjbHVzdGVyRW5kKSB7XG4gICAgICB0aGlzLnBvc2l0aW9uQ2x1c3RlcihnbHlwaHMsIHBvc2l0aW9ucywgY2x1c3RlclN0YXJ0LCBjbHVzdGVyRW5kKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb25zO1xuICB9O1xuXG4gIF9wcm90by5wb3NpdGlvbkNsdXN0ZXIgPSBmdW5jdGlvbiBwb3NpdGlvbkNsdXN0ZXIoZ2x5cGhzLCBwb3NpdGlvbnMsIGNsdXN0ZXJTdGFydCwgY2x1c3RlckVuZCkge1xuICAgIHZhciBiYXNlID0gZ2x5cGhzW2NsdXN0ZXJTdGFydF07XG4gICAgdmFyIGJhc2VCb3ggPSBiYXNlLmNib3guY29weSgpOyAvLyBhZGp1c3QgYm91bmRpbmcgYm94IGZvciBsaWdhdHVyZSBnbHlwaHNcblxuICAgIGlmIChiYXNlLmNvZGVQb2ludHMubGVuZ3RoID4gMSkge1xuICAgICAgLy8gTFRSLiBUT0RPOiBSVEwgc3VwcG9ydC5cbiAgICAgIGJhc2VCb3gubWluWCArPSAoYmFzZS5jb2RlUG9pbnRzLmxlbmd0aCAtIDEpICogYmFzZUJveC53aWR0aCAvIGJhc2UuY29kZVBvaW50cy5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIHhPZmZzZXQgPSAtcG9zaXRpb25zW2NsdXN0ZXJTdGFydF0ueEFkdmFuY2U7XG4gICAgdmFyIHlPZmZzZXQgPSAwO1xuICAgIHZhciB5R2FwID0gdGhpcy5mb250LnVuaXRzUGVyRW0gLyAxNjsgLy8gcG9zaXRpb24gZWFjaCBvZiB0aGUgbWFyayBnbHlwaHMgcmVsYXRpdmUgdG8gdGhlIGJhc2UgZ2x5cGhcblxuICAgIGZvciAodmFyIGluZGV4ID0gY2x1c3RlclN0YXJ0ICsgMTsgaW5kZXggPD0gY2x1c3RlckVuZDsgaW5kZXgrKykge1xuICAgICAgdmFyIG1hcmsgPSBnbHlwaHNbaW5kZXhdO1xuICAgICAgdmFyIG1hcmtCb3ggPSBtYXJrLmNib3g7XG4gICAgICB2YXIgcG9zaXRpb24gPSBwb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgdmFyIGNvbWJpbmluZ0NsYXNzID0gdGhpcy5nZXRDb21iaW5pbmdDbGFzcyhtYXJrLmNvZGVQb2ludHNbMF0pO1xuXG4gICAgICBpZiAoY29tYmluaW5nQ2xhc3MgIT09ICdOb3RfUmVvcmRlcmVkJykge1xuICAgICAgICBwb3NpdGlvbi54T2Zmc2V0ID0gcG9zaXRpb24ueU9mZnNldCA9IDA7IC8vIHggcG9zaXRpb25pbmdcblxuICAgICAgICBzd2l0Y2ggKGNvbWJpbmluZ0NsYXNzKSB7XG4gICAgICAgICAgY2FzZSAnRG91YmxlX0Fib3ZlJzpcbiAgICAgICAgICBjYXNlICdEb3VibGVfQmVsb3cnOlxuICAgICAgICAgICAgLy8gTFRSLiBUT0RPOiBSVEwgc3VwcG9ydC5cbiAgICAgICAgICAgIHBvc2l0aW9uLnhPZmZzZXQgKz0gYmFzZUJveC5taW5YIC0gbWFya0JveC53aWR0aCAvIDIgLSBtYXJrQm94Lm1pblg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ0F0dGFjaGVkX0JlbG93X0xlZnQnOlxuICAgICAgICAgIGNhc2UgJ0JlbG93X0xlZnQnOlxuICAgICAgICAgIGNhc2UgJ0Fib3ZlX0xlZnQnOlxuICAgICAgICAgICAgLy8gbGVmdCBhbGlnblxuICAgICAgICAgICAgcG9zaXRpb24ueE9mZnNldCArPSBiYXNlQm94Lm1pblggLSBtYXJrQm94Lm1pblg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ0F0dGFjaGVkX0Fib3ZlX1JpZ2h0JzpcbiAgICAgICAgICBjYXNlICdCZWxvd19SaWdodCc6XG4gICAgICAgICAgY2FzZSAnQWJvdmVfUmlnaHQnOlxuICAgICAgICAgICAgLy8gcmlnaHQgYWxpZ25cbiAgICAgICAgICAgIHBvc2l0aW9uLnhPZmZzZXQgKz0gYmFzZUJveC5tYXhYIC0gbWFya0JveC53aWR0aCAtIG1hcmtCb3gubWluWDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIEF0dGFjaGVkX0JlbG93LCBBdHRhY2hlZF9BYm92ZSwgQmVsb3csIEFib3ZlLCBvdGhlclxuICAgICAgICAgICAgLy8gY2VudGVyIGFsaWduXG4gICAgICAgICAgICBwb3NpdGlvbi54T2Zmc2V0ICs9IGJhc2VCb3gubWluWCArIChiYXNlQm94LndpZHRoIC0gbWFya0JveC53aWR0aCkgLyAyIC0gbWFya0JveC5taW5YO1xuICAgICAgICB9IC8vIHkgcG9zaXRpb25pbmdcblxuXG4gICAgICAgIHN3aXRjaCAoY29tYmluaW5nQ2xhc3MpIHtcbiAgICAgICAgICBjYXNlICdEb3VibGVfQmVsb3cnOlxuICAgICAgICAgIGNhc2UgJ0JlbG93X0xlZnQnOlxuICAgICAgICAgIGNhc2UgJ0JlbG93JzpcbiAgICAgICAgICBjYXNlICdCZWxvd19SaWdodCc6XG4gICAgICAgICAgY2FzZSAnQXR0YWNoZWRfQmVsb3dfTGVmdCc6XG4gICAgICAgICAgY2FzZSAnQXR0YWNoZWRfQmVsb3cnOlxuICAgICAgICAgICAgLy8gYWRkIGEgc21hbGwgZ2FwIGJldHdlZW4gdGhlIGdseXBocyBpZiB0aGV5IGFyZSBub3QgYXR0YWNoZWRcbiAgICAgICAgICAgIGlmIChjb21iaW5pbmdDbGFzcyA9PT0gJ0F0dGFjaGVkX0JlbG93X0xlZnQnIHx8IGNvbWJpbmluZ0NsYXNzID09PSAnQXR0YWNoZWRfQmVsb3cnKSB7XG4gICAgICAgICAgICAgIGJhc2VCb3gubWluWSArPSB5R2FwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwb3NpdGlvbi55T2Zmc2V0ID0gLWJhc2VCb3gubWluWSAtIG1hcmtCb3gubWF4WTtcbiAgICAgICAgICAgIGJhc2VCb3gubWluWSArPSBtYXJrQm94LmhlaWdodDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnRG91YmxlX0Fib3ZlJzpcbiAgICAgICAgICBjYXNlICdBYm92ZV9MZWZ0JzpcbiAgICAgICAgICBjYXNlICdBYm92ZSc6XG4gICAgICAgICAgY2FzZSAnQWJvdmVfUmlnaHQnOlxuICAgICAgICAgIGNhc2UgJ0F0dGFjaGVkX0Fib3ZlJzpcbiAgICAgICAgICBjYXNlICdBdHRhY2hlZF9BYm92ZV9SaWdodCc6XG4gICAgICAgICAgICAvLyBhZGQgYSBzbWFsbCBnYXAgYmV0d2VlbiB0aGUgZ2x5cGhzIGlmIHRoZXkgYXJlIG5vdCBhdHRhY2hlZFxuICAgICAgICAgICAgaWYgKGNvbWJpbmluZ0NsYXNzID09PSAnQXR0YWNoZWRfQWJvdmUnIHx8IGNvbWJpbmluZ0NsYXNzID09PSAnQXR0YWNoZWRfQWJvdmVfUmlnaHQnKSB7XG4gICAgICAgICAgICAgIGJhc2VCb3gubWF4WSArPSB5R2FwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwb3NpdGlvbi55T2Zmc2V0ID0gYmFzZUJveC5tYXhZIC0gbWFya0JveC5taW5ZO1xuICAgICAgICAgICAgYmFzZUJveC5tYXhZICs9IG1hcmtCb3guaGVpZ2h0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBwb3NpdGlvbi54QWR2YW5jZSA9IHBvc2l0aW9uLnlBZHZhbmNlID0gMDtcbiAgICAgICAgcG9zaXRpb24ueE9mZnNldCArPSB4T2Zmc2V0O1xuICAgICAgICBwb3NpdGlvbi55T2Zmc2V0ICs9IHlPZmZzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4T2Zmc2V0IC09IHBvc2l0aW9uLnhBZHZhbmNlO1xuICAgICAgICB5T2Zmc2V0IC09IHBvc2l0aW9uLnlBZHZhbmNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfTtcblxuICBfcHJvdG8uZ2V0Q29tYmluaW5nQ2xhc3MgPSBmdW5jdGlvbiBnZXRDb21iaW5pbmdDbGFzcyhjb2RlUG9pbnQpIHtcbiAgICB2YXIgY29tYmluaW5nQ2xhc3MgPSB1bmljb2RlLmdldENvbWJpbmluZ0NsYXNzKGNvZGVQb2ludCk7IC8vIFRoYWkgLyBMYW8gbmVlZCBzb21lIHBlci1jaGFyYWN0ZXIgd29ya1xuXG4gICAgaWYgKChjb2RlUG9pbnQgJiB+MHhmZikgPT09IDB4MGUwMCkge1xuICAgICAgaWYgKGNvbWJpbmluZ0NsYXNzID09PSAnTm90X1Jlb3JkZXJlZCcpIHtcbiAgICAgICAgc3dpdGNoIChjb2RlUG9pbnQpIHtcbiAgICAgICAgICBjYXNlIDB4MGUzMTpcbiAgICAgICAgICBjYXNlIDB4MGUzNDpcbiAgICAgICAgICBjYXNlIDB4MGUzNTpcbiAgICAgICAgICBjYXNlIDB4MGUzNjpcbiAgICAgICAgICBjYXNlIDB4MGUzNzpcbiAgICAgICAgICBjYXNlIDB4MGU0NzpcbiAgICAgICAgICBjYXNlIDB4MGU0YzpcbiAgICAgICAgICBjYXNlIDB4MGUzZDpcbiAgICAgICAgICBjYXNlIDB4MGU0ZTpcbiAgICAgICAgICAgIHJldHVybiAnQWJvdmVfUmlnaHQnO1xuXG4gICAgICAgICAgY2FzZSAweDBlYjE6XG4gICAgICAgICAgY2FzZSAweDBlYjQ6XG4gICAgICAgICAgY2FzZSAweDBlYjU6XG4gICAgICAgICAgY2FzZSAweDBlYjY6XG4gICAgICAgICAgY2FzZSAweDBlYjc6XG4gICAgICAgICAgY2FzZSAweDBlYmI6XG4gICAgICAgICAgY2FzZSAweDBlY2M6XG4gICAgICAgICAgY2FzZSAweDBlY2Q6XG4gICAgICAgICAgICByZXR1cm4gJ0Fib3ZlJztcblxuICAgICAgICAgIGNhc2UgMHgwZWJjOlxuICAgICAgICAgICAgcmV0dXJuICdCZWxvdyc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID09PSAweDBlM2EpIHtcbiAgICAgICAgLy8gdmlyYW1hXG4gICAgICAgIHJldHVybiAnQmVsb3dfUmlnaHQnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAoY29tYmluaW5nQ2xhc3MpIHtcbiAgICAgIC8vIEhlYnJld1xuICAgICAgY2FzZSAnQ0NDMTAnOiAvLyBzaGV2YVxuXG4gICAgICBjYXNlICdDQ0MxMSc6IC8vIGhhdGFmIHNlZ29sXG5cbiAgICAgIGNhc2UgJ0NDQzEyJzogLy8gaGF0YWYgcGF0YWhcblxuICAgICAgY2FzZSAnQ0NDMTMnOiAvLyBoYXRhZiBxYW1hdHNcblxuICAgICAgY2FzZSAnQ0NDMTQnOiAvLyBoaXJpcVxuXG4gICAgICBjYXNlICdDQ0MxNSc6IC8vIHRzZXJlXG5cbiAgICAgIGNhc2UgJ0NDQzE2JzogLy8gc2Vnb2xcblxuICAgICAgY2FzZSAnQ0NDMTcnOiAvLyBwYXRhaFxuXG4gICAgICBjYXNlICdDQ0MxOCc6IC8vIHFhbWF0c1xuXG4gICAgICBjYXNlICdDQ0MyMCc6IC8vIHF1YnV0c1xuXG4gICAgICBjYXNlICdDQ0MyMic6XG4gICAgICAgIC8vIG1ldGVnXG4gICAgICAgIHJldHVybiAnQmVsb3cnO1xuXG4gICAgICBjYXNlICdDQ0MyMyc6XG4gICAgICAgIC8vIHJhZmVcbiAgICAgICAgcmV0dXJuICdBdHRhY2hlZF9BYm92ZSc7XG5cbiAgICAgIGNhc2UgJ0NDQzI0JzpcbiAgICAgICAgLy8gc2hpbiBkb3RcbiAgICAgICAgcmV0dXJuICdBYm92ZV9SaWdodCc7XG5cbiAgICAgIGNhc2UgJ0NDQzI1JzogLy8gc2luIGRvdFxuXG4gICAgICBjYXNlICdDQ0MxOSc6XG4gICAgICAgIC8vIGhvbGFtXG4gICAgICAgIHJldHVybiAnQWJvdmVfTGVmdCc7XG5cbiAgICAgIGNhc2UgJ0NDQzI2JzpcbiAgICAgICAgLy8gcG9pbnQgdmFyaWthXG4gICAgICAgIHJldHVybiAnQWJvdmUnO1xuXG4gICAgICBjYXNlICdDQ0MyMSc6XG4gICAgICAgIC8vIGRhZ2VzaFxuICAgICAgICBicmVhaztcbiAgICAgIC8vIEFyYWJpYyBhbmQgU3lyaWFjXG5cbiAgICAgIGNhc2UgJ0NDQzI3JzogLy8gZmF0aGF0YW5cblxuICAgICAgY2FzZSAnQ0NDMjgnOiAvLyBkYW1tYXRhblxuXG4gICAgICBjYXNlICdDQ0MzMCc6IC8vIGZhdGhhXG5cbiAgICAgIGNhc2UgJ0NDQzMxJzogLy8gZGFtbWFcblxuICAgICAgY2FzZSAnQ0NDMzMnOiAvLyBzaGFkZGFcblxuICAgICAgY2FzZSAnQ0NDMzQnOiAvLyBzdWt1blxuXG4gICAgICBjYXNlICdDQ0MzNSc6IC8vIHN1cGVyc2NyaXB0IGFsZWZcblxuICAgICAgY2FzZSAnQ0NDMzYnOlxuICAgICAgICAvLyBzdXBlcnNjcmlwdCBhbGFwaFxuICAgICAgICByZXR1cm4gJ0Fib3ZlJztcblxuICAgICAgY2FzZSAnQ0NDMjknOiAvLyBrYXNyYXRhblxuXG4gICAgICBjYXNlICdDQ0MzMic6XG4gICAgICAgIC8vIGthc3JhXG4gICAgICAgIHJldHVybiAnQmVsb3cnO1xuICAgICAgLy8gVGhhaVxuXG4gICAgICBjYXNlICdDQ0MxMDMnOlxuICAgICAgICAvLyBzYXJhIHUgLyBzYXJhIHV1XG4gICAgICAgIHJldHVybiAnQmVsb3dfUmlnaHQnO1xuXG4gICAgICBjYXNlICdDQ0MxMDcnOlxuICAgICAgICAvLyBtYWlcbiAgICAgICAgcmV0dXJuICdBYm92ZV9SaWdodCc7XG4gICAgICAvLyBMYW9cblxuICAgICAgY2FzZSAnQ0NDMTE4JzpcbiAgICAgICAgLy8gc2lnbiB1IC8gc2lnbiB1dVxuICAgICAgICByZXR1cm4gJ0JlbG93JztcblxuICAgICAgY2FzZSAnQ0NDMTIyJzpcbiAgICAgICAgLy8gbWFpXG4gICAgICAgIHJldHVybiAnQWJvdmUnO1xuICAgICAgLy8gVGliZXRhblxuXG4gICAgICBjYXNlICdDQ0MxMjknOiAvLyBzaWduIGFhXG5cbiAgICAgIGNhc2UgJ0NDQzEzMic6XG4gICAgICAgIC8vIHNpZ24gdVxuICAgICAgICByZXR1cm4gJ0JlbG93JztcblxuICAgICAgY2FzZSAnQ0NDMTMwJzpcbiAgICAgICAgLy8gc2lnbiBpXG4gICAgICAgIHJldHVybiAnQWJvdmUnO1xuICAgIH1cblxuICAgIHJldHVybiBjb21iaW5pbmdDbGFzcztcbiAgfTtcblxuICByZXR1cm4gVW5pY29kZUxheW91dEVuZ2luZTtcbn0oKTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkMSh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQxKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMShDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDEoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGdseXBoIGJvdW5kaW5nIGJveFxuICovXG52YXIgQkJveCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJCb3gobWluWCwgbWluWSwgbWF4WCwgbWF4WSkge1xuICAgIGlmIChtaW5YID09PSB2b2lkIDApIHtcbiAgICAgIG1pblggPSBJbmZpbml0eTtcbiAgICB9XG5cbiAgICBpZiAobWluWSA9PT0gdm9pZCAwKSB7XG4gICAgICBtaW5ZID0gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgaWYgKG1heFggPT09IHZvaWQgMCkge1xuICAgICAgbWF4WCA9IC1JbmZpbml0eTtcbiAgICB9XG5cbiAgICBpZiAobWF4WSA9PT0gdm9pZCAwKSB7XG4gICAgICBtYXhZID0gLUluZmluaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIFggcG9zaXRpb24gaW4gdGhlIGJvdW5kaW5nIGJveFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5taW5YID0gbWluWDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBZIHBvc2l0aW9uIGluIHRoZSBib3VuZGluZyBib3hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gICAgdGhpcy5taW5ZID0gbWluWTtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4bWltdW0gWCBwb3NpdGlvbiBpbiB0aGUgYm91bmRpbmcgYm94XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICAgIHRoaXMubWF4WCA9IG1heFg7XG4gICAgLyoqXG4gICAgICogVGhlIG1heG1pbXVtIFkgcG9zaXRpb24gaW4gdGhlIGJvdW5kaW5nIGJveFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgICB0aGlzLm1heFkgPSBtYXhZO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgd2lkdGggb2YgdGhlIGJvdW5kaW5nIGJveFxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBCQm94LnByb3RvdHlwZTtcblxuICBfcHJvdG8uYWRkUG9pbnQgPSBmdW5jdGlvbiBhZGRQb2ludCh4LCB5KSB7XG4gICAgaWYgKE1hdGguYWJzKHgpICE9PSBJbmZpbml0eSkge1xuICAgICAgaWYgKHggPCB0aGlzLm1pblgpIHtcbiAgICAgICAgdGhpcy5taW5YID0geDtcbiAgICAgIH1cblxuICAgICAgaWYgKHggPiB0aGlzLm1heFgpIHtcbiAgICAgICAgdGhpcy5tYXhYID0geDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoTWF0aC5hYnMoeSkgIT09IEluZmluaXR5KSB7XG4gICAgICBpZiAoeSA8IHRoaXMubWluWSkge1xuICAgICAgICB0aGlzLm1pblkgPSB5O1xuICAgICAgfVxuXG4gICAgICBpZiAoeSA+IHRoaXMubWF4WSkge1xuICAgICAgICB0aGlzLm1heFkgPSB5O1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uY29weSA9IGZ1bmN0aW9uIGNvcHkoKSB7XG4gICAgcmV0dXJuIG5ldyBCQm94KHRoaXMubWluWCwgdGhpcy5taW5ZLCB0aGlzLm1heFgsIHRoaXMubWF4WSk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzJDEoQkJveCwgW3tcbiAgICBrZXk6IFwid2lkdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1heFggLSB0aGlzLm1pblg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIGJveFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJoZWlnaHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1heFkgLSB0aGlzLm1pblk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJCb3g7XG59KCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNihvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkNihvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkNihvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDYobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ2KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkNihhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cbi8vIERhdGEgZnJvbSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9vdHNwZWMvc2NyaXB0dGFncy5odG1cbi8vIGFuZCBodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL1Byb3BlcnR5VmFsdWVBbGlhc2VzLnR4dC5cblxudmFyIFVOSUNPREVfU0NSSVBUUyA9IHtcbiAgQ2F1Y2FzaWFuX0FsYmFuaWFuOiAnYWdoYicsXG4gIEFyYWJpYzogJ2FyYWInLFxuICBJbXBlcmlhbF9BcmFtYWljOiAnYXJtaScsXG4gIEFybWVuaWFuOiAnYXJtbicsXG4gIEF2ZXN0YW46ICdhdnN0JyxcbiAgQmFsaW5lc2U6ICdiYWxpJyxcbiAgQmFtdW06ICdiYW11JyxcbiAgQmFzc2FfVmFoOiAnYmFzcycsXG4gIEJhdGFrOiAnYmF0aycsXG4gIEJlbmdhbGk6IFsnYm5nMicsICdiZW5nJ10sXG4gIEJvcG9tb2ZvOiAnYm9wbycsXG4gIEJyYWhtaTogJ2JyYWgnLFxuICBCcmFpbGxlOiAnYnJhaScsXG4gIEJ1Z2luZXNlOiAnYnVnaScsXG4gIEJ1aGlkOiAnYnVoZCcsXG4gIENoYWttYTogJ2Nha20nLFxuICBDYW5hZGlhbl9BYm9yaWdpbmFsOiAnY2FucycsXG4gIENhcmlhbjogJ2NhcmknLFxuICBDaGFtOiAnY2hhbScsXG4gIENoZXJva2VlOiAnY2hlcicsXG4gIENvcHRpYzogJ2NvcHQnLFxuICBDeXByaW90OiAnY3BydCcsXG4gIEN5cmlsbGljOiAnY3lybCcsXG4gIERldmFuYWdhcmk6IFsnZGV2MicsICdkZXZhJ10sXG4gIERlc2VyZXQ6ICdkc3J0JyxcbiAgRHVwbG95YW46ICdkdXBsJyxcbiAgRWd5cHRpYW5fSGllcm9nbHlwaHM6ICdlZ3lwJyxcbiAgRWxiYXNhbjogJ2VsYmEnLFxuICBFdGhpb3BpYzogJ2V0aGknLFxuICBHZW9yZ2lhbjogJ2dlb3InLFxuICBHbGFnb2xpdGljOiAnZ2xhZycsXG4gIEdvdGhpYzogJ2dvdGgnLFxuICBHcmFudGhhOiAnZ3JhbicsXG4gIEdyZWVrOiAnZ3JlaycsXG4gIEd1amFyYXRpOiBbJ2dqcjInLCAnZ3VqciddLFxuICBHdXJtdWtoaTogWydndXIyJywgJ2d1cnUnXSxcbiAgSGFuZ3VsOiAnaGFuZycsXG4gIEhhbjogJ2hhbmknLFxuICBIYW51bm9vOiAnaGFubycsXG4gIEhlYnJldzogJ2hlYnInLFxuICBIaXJhZ2FuYTogJ2hpcmEnLFxuICBQYWhhd2hfSG1vbmc6ICdobW5nJyxcbiAgS2F0YWthbmFfT3JfSGlyYWdhbmE6ICdocmt0JyxcbiAgT2xkX0l0YWxpYzogJ2l0YWwnLFxuICBKYXZhbmVzZTogJ2phdmEnLFxuICBLYXlhaF9MaTogJ2thbGknLFxuICBLYXRha2FuYTogJ2thbmEnLFxuICBLaGFyb3NodGhpOiAna2hhcicsXG4gIEtobWVyOiAna2htcicsXG4gIEtob2praTogJ2tob2onLFxuICBLYW5uYWRhOiBbJ2tuZDInLCAna25kYSddLFxuICBLYWl0aGk6ICdrdGhpJyxcbiAgVGFpX1RoYW06ICdsYW5hJyxcbiAgTGFvOiAnbGFvICcsXG4gIExhdGluOiAnbGF0bicsXG4gIExlcGNoYTogJ2xlcGMnLFxuICBMaW1idTogJ2xpbWInLFxuICBMaW5lYXJfQTogJ2xpbmEnLFxuICBMaW5lYXJfQjogJ2xpbmInLFxuICBMaXN1OiAnbGlzdScsXG4gIEx5Y2lhbjogJ2x5Y2knLFxuICBMeWRpYW46ICdseWRpJyxcbiAgTWFoYWphbmk6ICdtYWhqJyxcbiAgTWFuZGFpYzogJ21hbmQnLFxuICBNYW5pY2hhZWFuOiAnbWFuaScsXG4gIE1lbmRlX0tpa2FrdWk6ICdtZW5kJyxcbiAgTWVyb2l0aWNfQ3Vyc2l2ZTogJ21lcmMnLFxuICBNZXJvaXRpY19IaWVyb2dseXBoczogJ21lcm8nLFxuICBNYWxheWFsYW06IFsnbWxtMicsICdtbHltJ10sXG4gIE1vZGk6ICdtb2RpJyxcbiAgTW9uZ29saWFuOiAnbW9uZycsXG4gIE1ybzogJ21yb28nLFxuICBNZWV0ZWlfTWF5ZWs6ICdtdGVpJyxcbiAgTXlhbm1hcjogWydteW0yJywgJ215bXInXSxcbiAgT2xkX05vcnRoX0FyYWJpYW46ICduYXJiJyxcbiAgTmFiYXRhZWFuOiAnbmJhdCcsXG4gIE5rbzogJ25rbyAnLFxuICBPZ2hhbTogJ29nYW0nLFxuICBPbF9DaGlraTogJ29sY2snLFxuICBPbGRfVHVya2ljOiAnb3JraCcsXG4gIE9yaXlhOiBbJ29yeTInLCAnb3J5YSddLFxuICBPc21hbnlhOiAnb3NtYScsXG4gIFBhbG15cmVuZTogJ3BhbG0nLFxuICBQYXVfQ2luX0hhdTogJ3BhdWMnLFxuICBPbGRfUGVybWljOiAncGVybScsXG4gIFBoYWdzX1BhOiAncGhhZycsXG4gIEluc2NyaXB0aW9uYWxfUGFobGF2aTogJ3BobGknLFxuICBQc2FsdGVyX1BhaGxhdmk6ICdwaGxwJyxcbiAgUGhvZW5pY2lhbjogJ3BobngnLFxuICBNaWFvOiAncGxyZCcsXG4gIEluc2NyaXB0aW9uYWxfUGFydGhpYW46ICdwcnRpJyxcbiAgUmVqYW5nOiAncmpuZycsXG4gIFJ1bmljOiAncnVucicsXG4gIFNhbWFyaXRhbjogJ3NhbXInLFxuICBPbGRfU291dGhfQXJhYmlhbjogJ3NhcmInLFxuICBTYXVyYXNodHJhOiAnc2F1cicsXG4gIFNoYXZpYW46ICdzaGF3JyxcbiAgU2hhcmFkYTogJ3NocmQnLFxuICBTaWRkaGFtOiAnc2lkZCcsXG4gIEtodWRhd2FkaTogJ3NpbmQnLFxuICBTaW5oYWxhOiAnc2luaCcsXG4gIFNvcmFfU29tcGVuZzogJ3NvcmEnLFxuICBTdW5kYW5lc2U6ICdzdW5kJyxcbiAgU3lsb3RpX05hZ3JpOiAnc3lsbycsXG4gIFN5cmlhYzogJ3N5cmMnLFxuICBUYWdiYW53YTogJ3RhZ2InLFxuICBUYWtyaTogJ3Rha3InLFxuICBUYWlfTGU6ICd0YWxlJyxcbiAgTmV3X1RhaV9MdWU6ICd0YWx1JyxcbiAgVGFtaWw6IFsndG1sMicsICd0YW1sJ10sXG4gIFRhaV9WaWV0OiAndGF2dCcsXG4gIFRlbHVndTogWyd0ZWwyJywgJ3RlbHUnXSxcbiAgVGlmaW5hZ2g6ICd0Zm5nJyxcbiAgVGFnYWxvZzogJ3RnbGcnLFxuICBUaGFhbmE6ICd0aGFhJyxcbiAgVGhhaTogJ3RoYWknLFxuICBUaWJldGFuOiAndGlidCcsXG4gIFRpcmh1dGE6ICd0aXJoJyxcbiAgVWdhcml0aWM6ICd1Z2FyJyxcbiAgVmFpOiAndmFpICcsXG4gIFdhcmFuZ19DaXRpOiAnd2FyYScsXG4gIE9sZF9QZXJzaWFuOiAneHBlbycsXG4gIEN1bmVpZm9ybTogJ3hzdXgnLFxuICBZaTogJ3lpICAnLFxuICBJbmhlcml0ZWQ6ICd6aW5oJyxcbiAgQ29tbW9uOiAnenl5eScsXG4gIFVua25vd246ICd6enp6J1xufTtcbnZhciBPUEVOVFlQRV9TQ1JJUFRTID0ge307XG5cbmZvciAodmFyIHNjcmlwdCBpbiBVTklDT0RFX1NDUklQVFMpIHtcbiAgdmFyIHRhZyA9IFVOSUNPREVfU0NSSVBUU1tzY3JpcHRdO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHRhZykpIHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDYodGFnKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciB0ID0gX3N0ZXAudmFsdWU7XG4gICAgICBPUEVOVFlQRV9TQ1JJUFRTW3RdID0gc2NyaXB0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBPUEVOVFlQRV9TQ1JJUFRTW3RhZ10gPSBzY3JpcHQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGZyb21PcGVuVHlwZSh0YWcpIHtcbiAgcmV0dXJuIE9QRU5UWVBFX1NDUklQVFNbdGFnXTtcbn1cbmZ1bmN0aW9uIGZvclN0cmluZyhzdHJpbmcpIHtcbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGg7XG4gIHZhciBpZHggPSAwO1xuXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICB2YXIgY29kZSA9IHN0cmluZy5jaGFyQ29kZUF0KGlkeCsrKTsgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGhpZ2ggc3Vycm9nYXRlXG5cbiAgICBpZiAoMHhkODAwIDw9IGNvZGUgJiYgY29kZSA8PSAweGRiZmYgJiYgaWR4IDwgbGVuKSB7XG4gICAgICB2YXIgbmV4dCA9IHN0cmluZy5jaGFyQ29kZUF0KGlkeCk7IC8vIENoZWNrIGlmIHRoaXMgaXMgYSBsb3cgc3Vycm9nYXRlXG5cbiAgICAgIGlmICgweGRjMDAgPD0gbmV4dCAmJiBuZXh0IDw9IDB4ZGZmZikge1xuICAgICAgICBpZHgrKztcbiAgICAgICAgY29kZSA9ICgoY29kZSAmIDB4M0ZGKSA8PCAxMCkgKyAobmV4dCAmIDB4M0ZGKSArIDB4MTAwMDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9zY3JpcHQgPSB1bmljb2RlLmdldFNjcmlwdChjb2RlKTtcblxuICAgIGlmIChfc2NyaXB0ICE9PSAnQ29tbW9uJyAmJiBfc2NyaXB0ICE9PSAnSW5oZXJpdGVkJyAmJiBfc2NyaXB0ICE9PSAnVW5rbm93bicpIHtcbiAgICAgIHJldHVybiBVTklDT0RFX1NDUklQVFNbX3NjcmlwdF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFVOSUNPREVfU0NSSVBUUy5Vbmtub3duO1xufVxuZnVuY3Rpb24gZm9yQ29kZVBvaW50cyhjb2RlUG9pbnRzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb2RlUG9pbnQgPSBjb2RlUG9pbnRzW2ldO1xuXG4gICAgdmFyIF9zY3JpcHQyID0gdW5pY29kZS5nZXRTY3JpcHQoY29kZVBvaW50KTtcblxuICAgIGlmIChfc2NyaXB0MiAhPT0gJ0NvbW1vbicgJiYgX3NjcmlwdDIgIT09ICdJbmhlcml0ZWQnICYmIF9zY3JpcHQyICE9PSAnVW5rbm93bicpIHtcbiAgICAgIHJldHVybiBVTklDT0RFX1NDUklQVFNbX3NjcmlwdDJdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBVTklDT0RFX1NDUklQVFMuVW5rbm93bjtcbn0gLy8gVGhlIHNjcmlwdHMgaW4gdGhpcyBtYXAgYXJlIHdyaXR0ZW4gZnJvbSByaWdodCB0byBsZWZ0XG5cbnZhciBSVEwgPSB7XG4gIGFyYWI6IHRydWUsXG4gIC8vIEFyYWJpY1xuICBoZWJyOiB0cnVlLFxuICAvLyBIZWJyZXdcbiAgc3lyYzogdHJ1ZSxcbiAgLy8gU3lyaWFjXG4gIHRoYWE6IHRydWUsXG4gIC8vIFRoYWFuYVxuICBjcHJ0OiB0cnVlLFxuICAvLyBDeXByaW90IFN5bGxhYmFyeVxuICBraGFyOiB0cnVlLFxuICAvLyBLaGFyb3N0aGlcbiAgcGhueDogdHJ1ZSxcbiAgLy8gUGhvZW5pY2lhblxuICAnbmtvICc6IHRydWUsXG4gIC8vIE4nS29cbiAgbHlkaTogdHJ1ZSxcbiAgLy8gTHlkaWFuXG4gIGF2c3Q6IHRydWUsXG4gIC8vIEF2ZXN0YW5cbiAgYXJtaTogdHJ1ZSxcbiAgLy8gSW1wZXJpYWwgQXJhbWFpY1xuICBwaGxpOiB0cnVlLFxuICAvLyBJbnNjcmlwdGlvbmFsIFBhaGxhdmlcbiAgcHJ0aTogdHJ1ZSxcbiAgLy8gSW5zY3JpcHRpb25hbCBQYXJ0aGlhblxuICBzYXJiOiB0cnVlLFxuICAvLyBPbGQgU291dGggQXJhYmlhblxuICBvcmtoOiB0cnVlLFxuICAvLyBPbGQgVHVya2ljLCBPcmtob24gUnVuaWNcbiAgc2FtcjogdHJ1ZSxcbiAgLy8gU2FtYXJpdGFuXG4gIG1hbmQ6IHRydWUsXG4gIC8vIE1hbmRhaWMsIE1hbmRhZWFuXG4gIG1lcmM6IHRydWUsXG4gIC8vIE1lcm9pdGljIEN1cnNpdmVcbiAgbWVybzogdHJ1ZSxcbiAgLy8gTWVyb2l0aWMgSGllcm9nbHlwaHNcbiAgLy8gVW5pY29kZSA3LjAgKG5vdCBsaXN0ZWQgb24gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL3NjcmlwdHRhZ3MuaHRtKVxuICBtYW5pOiB0cnVlLFxuICAvLyBNYW5pY2hhZWFuXG4gIG1lbmQ6IHRydWUsXG4gIC8vIE1lbmRlIEtpa2FrdWlcbiAgbmJhdDogdHJ1ZSxcbiAgLy8gTmFiYXRhZWFuXG4gIG5hcmI6IHRydWUsXG4gIC8vIE9sZCBOb3J0aCBBcmFiaWFuXG4gIHBhbG06IHRydWUsXG4gIC8vIFBhbG15cmVuZVxuICBwaGxwOiB0cnVlIC8vIFBzYWx0ZXIgUGFobGF2aVxuXG59O1xuZnVuY3Rpb24gZGlyZWN0aW9uKHNjcmlwdCkge1xuICBpZiAoUlRMW3NjcmlwdF0pIHtcbiAgICByZXR1cm4gJ3J0bCc7XG4gIH1cblxuICByZXR1cm4gJ2x0cic7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNyhvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkNyhvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkNyhvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDcobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ3KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkNyhhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkMih0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQyKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMihDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDIoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG4vKipcbiAqIFJlcHJlc2VudHMgYSBydW4gb2YgR2x5cGggYW5kIEdseXBoUG9zaXRpb24gb2JqZWN0cy5cbiAqIFJldHVybmVkIGJ5IHRoZSBmb250IGxheW91dCBtZXRob2QuXG4gKi9cblxudmFyIEdseXBoUnVuID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gR2x5cGhSdW4oZ2x5cGhzLCBmZWF0dXJlcywgc2NyaXB0LCBsYW5ndWFnZSwgZGlyZWN0aW9uJDEpIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBHbHlwaCBvYmplY3RzIGluIHRoZSBydW5cbiAgICAgKiBAdHlwZSB7R2x5cGhbXX1cbiAgICAgKi9cbiAgICB0aGlzLmdseXBocyA9IGdseXBocztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBHbHlwaFBvc2l0aW9uIG9iamVjdHMgZm9yIGVhY2ggZ2x5cGggaW4gdGhlIHJ1blxuICAgICAqIEB0eXBlIHtHbHlwaFBvc2l0aW9uW119XG4gICAgICovXG5cbiAgICB0aGlzLnBvc2l0aW9ucyA9IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNjcmlwdCB0aGF0IHdhcyByZXF1ZXN0ZWQgZm9yIHNoYXBpbmcuIFRoaXMgd2FzIGVpdGhlciBwYXNzZWQgaW4gb3IgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7XG4gICAgLyoqXG4gICAgICogVGhlIGxhbmd1YWdlIHJlcXVlc3RlZCBmb3Igc2hhcGluZywgYXMgcGFzc2VkIGluLiBJZiBgbnVsbGAsIHRoZSBkZWZhdWx0IGxhbmd1YWdlIGZvciB0aGVcbiAgICAgKiBzY3JpcHQgd2FzIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZSB8fCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkaXJlY3Rpb24gcmVxdWVzdGVkIGZvciBzaGFwaW5nLCBhcyBwYXNzZWQgaW4gKGVpdGhlciBsdHIgb3IgcnRsKS5cbiAgICAgKiBJZiBgbnVsbGAsIHRoZSBkZWZhdWx0IGRpcmVjdGlvbiBvZiB0aGUgc2NyaXB0IGlzIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICAgIHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uJDEgfHwgZGlyZWN0aW9uKHNjcmlwdCk7XG4gICAgLyoqXG4gICAgICogVGhlIGZlYXR1cmVzIHJlcXVlc3RlZCBkdXJpbmcgc2hhcGluZy4gVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIHVzZXJcbiAgICAgKiBzcGVjaWZpZWQgZmVhdHVyZXMgYW5kIGZlYXR1cmVzIGNob3NlbiBieSB0aGUgc2hhcGVyLlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG5cbiAgICB0aGlzLmZlYXR1cmVzID0ge307IC8vIENvbnZlcnQgZmVhdHVyZXMgdG8gYW4gb2JqZWN0XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmZWF0dXJlcykpIHtcbiAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNyhmZWF0dXJlcyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciB0YWcgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgdGhpcy5mZWF0dXJlc1t0YWddID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmZWF0dXJlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlcztcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBhZHZhbmNlIHdpZHRoIG9mIHRoZSBydW4uXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzJDIoR2x5cGhSdW4sIFt7XG4gICAga2V5OiBcImFkdmFuY2VXaWR0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIHdpZHRoID0gMDtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNyh0aGlzLnBvc2l0aW9ucyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IF9zdGVwMi52YWx1ZTtcbiAgICAgICAgd2lkdGggKz0gcG9zaXRpb24ueEFkdmFuY2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFkdmFuY2UgaGVpZ2h0IG9mIHRoZSBydW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFkdmFuY2VIZWlnaHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBoZWlnaHQgPSAwO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ3KHRoaXMucG9zaXRpb25zKSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gX3N0ZXAzLnZhbHVlO1xuICAgICAgICBoZWlnaHQgKz0gcG9zaXRpb24ueUFkdmFuY2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoZWlnaHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBib3VuZGluZyBib3ggY29udGFpbmluZyBhbGwgZ2x5cGhzIGluIHRoZSBydW4uXG4gICAgICogQHR5cGUge0JCb3h9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJiYm94XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgYmJveCA9IG5ldyBCQm94KCk7XG4gICAgICB2YXIgeCA9IDA7XG4gICAgICB2YXIgeSA9IDA7XG5cbiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmdseXBocy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdmFyIGdseXBoID0gdGhpcy5nbHlwaHNbaW5kZXhdO1xuICAgICAgICB2YXIgcCA9IHRoaXMucG9zaXRpb25zW2luZGV4XTtcbiAgICAgICAgdmFyIGIgPSBnbHlwaC5iYm94O1xuICAgICAgICBiYm94LmFkZFBvaW50KGIubWluWCArIHggKyBwLnhPZmZzZXQsIGIubWluWSArIHkgKyBwLnlPZmZzZXQpO1xuICAgICAgICBiYm94LmFkZFBvaW50KGIubWF4WCArIHggKyBwLnhPZmZzZXQsIGIubWF4WSArIHkgKyBwLnlPZmZzZXQpO1xuICAgICAgICB4ICs9IHAueEFkdmFuY2U7XG4gICAgICAgIHkgKz0gcC55QWR2YW5jZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJib3g7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEdseXBoUnVuO1xufSgpO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgcG9zaXRpb25pbmcgaW5mb3JtYXRpb24gZm9yIGEgZ2x5cGggaW4gYSBHbHlwaFJ1bi5cbiAqL1xudmFyIEdseXBoUG9zaXRpb24gPSBmdW5jdGlvbiBHbHlwaFBvc2l0aW9uKHhBZHZhbmNlLCB5QWR2YW5jZSwgeE9mZnNldCwgeU9mZnNldCkge1xuICBpZiAoeEFkdmFuY2UgPT09IHZvaWQgMCkge1xuICAgIHhBZHZhbmNlID0gMDtcbiAgfVxuXG4gIGlmICh5QWR2YW5jZSA9PT0gdm9pZCAwKSB7XG4gICAgeUFkdmFuY2UgPSAwO1xuICB9XG5cbiAgaWYgKHhPZmZzZXQgPT09IHZvaWQgMCkge1xuICAgIHhPZmZzZXQgPSAwO1xuICB9XG5cbiAgaWYgKHlPZmZzZXQgPT09IHZvaWQgMCkge1xuICAgIHlPZmZzZXQgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgdG8gbW92ZSB0aGUgdmlydHVhbCBwZW4gaW4gdGhlIFggZGlyZWN0aW9uIGFmdGVyIHJlbmRlcmluZyB0aGlzIGdseXBoLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgdGhpcy54QWR2YW5jZSA9IHhBZHZhbmNlO1xuICAvKipcbiAgICogVGhlIGFtb3VudCB0byBtb3ZlIHRoZSB2aXJ0dWFsIHBlbiBpbiB0aGUgWSBkaXJlY3Rpb24gYWZ0ZXIgcmVuZGVyaW5nIHRoaXMgZ2x5cGguXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuXG4gIHRoaXMueUFkdmFuY2UgPSB5QWR2YW5jZTtcbiAgLyoqXG4gICAqIFRoZSBvZmZzZXQgZnJvbSB0aGUgcGVuIHBvc2l0aW9uIGluIHRoZSBYIGRpcmVjdGlvbiBhdCB3aGljaCB0byByZW5kZXIgdGhpcyBnbHlwaC5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cbiAgdGhpcy54T2Zmc2V0ID0geE9mZnNldDtcbiAgLyoqXG4gICAqIFRoZSBvZmZzZXQgZnJvbSB0aGUgcGVuIHBvc2l0aW9uIGluIHRoZSBZIGRpcmVjdGlvbiBhdCB3aGljaCB0byByZW5kZXIgdGhpcyBnbHlwaC5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cbiAgdGhpcy55T2Zmc2V0ID0geU9mZnNldDtcbn07XG5cbi8vIHNlZSBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA5L0FwcGVuZGl4Ri5odG1sXG4vLyBhbmQgL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29yZVRleHQuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSGVhZGVycy9TRk5UTGF5b3V0VHlwZXMuaCBvbiBhIE1hY1xudmFyIGZlYXR1cmVzID0ge1xuICBhbGxUeXBvZ3JhcGhpY0ZlYXR1cmVzOiB7XG4gICAgY29kZTogMCxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIGFsbFR5cGVGZWF0dXJlczogMFxuICB9LFxuICBsaWdhdHVyZXM6IHtcbiAgICBjb2RlOiAxLFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgcmVxdWlyZWRMaWdhdHVyZXM6IDAsXG4gICAgY29tbW9uTGlnYXR1cmVzOiAyLFxuICAgIHJhcmVMaWdhdHVyZXM6IDQsXG4gICAgLy8gbG9nb3M6IDZcbiAgICByZWJ1c1BpY3R1cmVzOiA4LFxuICAgIGRpcGh0aG9uZ0xpZ2F0dXJlczogMTAsXG4gICAgc3F1YXJlZExpZ2F0dXJlczogMTIsXG4gICAgYWJicmV2U3F1YXJlZExpZ2F0dXJlczogMTQsXG4gICAgc3ltYm9sTGlnYXR1cmVzOiAxNixcbiAgICBjb250ZXh0dWFsTGlnYXR1cmVzOiAxOCxcbiAgICBoaXN0b3JpY2FsTGlnYXR1cmVzOiAyMFxuICB9LFxuICBjdXJzaXZlQ29ubmVjdGlvbjoge1xuICAgIGNvZGU6IDIsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIHVuY29ubmVjdGVkOiAwLFxuICAgIHBhcnRpYWxseUNvbm5lY3RlZDogMSxcbiAgICBjdXJzaXZlOiAyXG4gIH0sXG4gIGxldHRlckNhc2U6IHtcbiAgICBjb2RlOiAzLFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZVxuICB9LFxuICAvLyB1cHBlckFuZExvd2VyQ2FzZTogMCAgICAgICAgICAjIGRlcHJlY2F0ZWRcbiAgLy8gYWxsQ2FwczogMSAgICAgICAgICAgICAgICAgICAgIyBkZXByZWNhdGVkXG4gIC8vIGFsbExvd2VyQ2FzZTogMiAgICAgICAgICAgICAgICMgZGVwcmVjYXRlZFxuICAvLyBzbWFsbENhcHM6IDMgICAgICAgICAgICAgICAgICAjIGRlcHJlY2F0ZWRcbiAgLy8gaW5pdGlhbENhcHM6IDQgICAgICAgICAgICAgICAgIyBkZXByZWNhdGVkXG4gIC8vIGluaXRpYWxDYXBzQW5kU21hbGxDYXBzOiA1ICAgICMgZGVwcmVjYXRlZFxuICB2ZXJ0aWNhbFN1YnN0aXR1dGlvbjoge1xuICAgIGNvZGU6IDQsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICBzdWJzdGl0dXRlVmVydGljYWxGb3JtczogMFxuICB9LFxuICBsaW5ndWlzdGljUmVhcnJhbmdlbWVudDoge1xuICAgIGNvZGU6IDUsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICBsaW5ndWlzdGljUmVhcnJhbmdlbWVudDogMFxuICB9LFxuICBudW1iZXJTcGFjaW5nOiB7XG4gICAgY29kZTogNixcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgbW9ub3NwYWNlZE51bWJlcnM6IDAsXG4gICAgcHJvcG9ydGlvbmFsTnVtYmVyczogMSxcbiAgICB0aGlyZFdpZHRoTnVtYmVyczogMixcbiAgICBxdWFydGVyV2lkdGhOdW1iZXJzOiAzXG4gIH0sXG4gIHNtYXJ0U3dhc2g6IHtcbiAgICBjb2RlOiA4LFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgd29yZEluaXRpYWxTd2FzaGVzOiAwLFxuICAgIHdvcmRGaW5hbFN3YXNoZXM6IDIsXG4gICAgLy8gbGluZUluaXRpYWxTd2FzaGVzOiA0XG4gICAgLy8gbGluZUZpbmFsU3dhc2hlczogNlxuICAgIG5vbkZpbmFsU3dhc2hlczogOFxuICB9LFxuICBkaWFjcml0aWNzOiB7XG4gICAgY29kZTogOSxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgc2hvd0RpYWNyaXRpY3M6IDAsXG4gICAgaGlkZURpYWNyaXRpY3M6IDEsXG4gICAgZGVjb21wb3NlRGlhY3JpdGljczogMlxuICB9LFxuICB2ZXJ0aWNhbFBvc2l0aW9uOiB7XG4gICAgY29kZTogMTAsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIG5vcm1hbFBvc2l0aW9uOiAwLFxuICAgIHN1cGVyaW9yczogMSxcbiAgICBpbmZlcmlvcnM6IDIsXG4gICAgb3JkaW5hbHM6IDMsXG4gICAgc2NpZW50aWZpY0luZmVyaW9yczogNFxuICB9LFxuICBmcmFjdGlvbnM6IHtcbiAgICBjb2RlOiAxMSxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgbm9GcmFjdGlvbnM6IDAsXG4gICAgdmVydGljYWxGcmFjdGlvbnM6IDEsXG4gICAgZGlhZ29uYWxGcmFjdGlvbnM6IDJcbiAgfSxcbiAgb3ZlcmxhcHBpbmdDaGFyYWN0ZXJzOiB7XG4gICAgY29kZTogMTMsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICBwcmV2ZW50T3ZlcmxhcDogMFxuICB9LFxuICB0eXBvZ3JhcGhpY0V4dHJhczoge1xuICAgIGNvZGU6IDE0LFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgLy8gaHlwaGVuc1RvRW1EYXNoOiAwXG4gICAgLy8gaHlwaGVuVG9FbkRhc2g6IDJcbiAgICBzbGFzaGVkWmVybzogNFxuICB9LFxuICAvLyBmb3JtSW50ZXJyb2Jhbmc6IDZcbiAgLy8gc21hcnRRdW90ZXM6IDhcbiAgLy8gcGVyaW9kc1RvRWxsaXBzaXM6IDEwXG4gIG1hdGhlbWF0aWNhbEV4dHJhczoge1xuICAgIGNvZGU6IDE1LFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgLy8gaHlwaGVuVG9NaW51czogMFxuICAgIC8vIGFzdGVyaXN0b011bHRpcGx5OiAyXG4gICAgLy8gc2xhc2hUb0RpdmlkZTogNFxuICAgIC8vIGluZXF1YWxpdHlMaWdhdHVyZXM6IDZcbiAgICAvLyBleHBvbmVudHM6IDhcbiAgICBtYXRoZW1hdGljYWxHcmVlazogMTBcbiAgfSxcbiAgb3JuYW1lbnRTZXRzOiB7XG4gICAgY29kZTogMTYsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIG5vT3JuYW1lbnRzOiAwLFxuICAgIGRpbmdiYXRzOiAxLFxuICAgIHBpQ2hhcmFjdGVyczogMixcbiAgICBmbGV1cm9uczogMyxcbiAgICBkZWNvcmF0aXZlQm9yZGVyczogNCxcbiAgICBpbnRlcm5hdGlvbmFsU3ltYm9sczogNSxcbiAgICBtYXRoU3ltYm9sczogNlxuICB9LFxuICBjaGFyYWN0ZXJBbHRlcm5hdGl2ZXM6IHtcbiAgICBjb2RlOiAxNyxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgbm9BbHRlcm5hdGVzOiAwXG4gIH0sXG4gIC8vIHVzZXIgZGVmaW5lZCBvcHRpb25zXG4gIGRlc2lnbkNvbXBsZXhpdHk6IHtcbiAgICBjb2RlOiAxOCxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgZGVzaWduTGV2ZWwxOiAwLFxuICAgIGRlc2lnbkxldmVsMjogMSxcbiAgICBkZXNpZ25MZXZlbDM6IDIsXG4gICAgZGVzaWduTGV2ZWw0OiAzLFxuICAgIGRlc2lnbkxldmVsNTogNFxuICB9LFxuICBzdHlsZU9wdGlvbnM6IHtcbiAgICBjb2RlOiAxOSxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgbm9TdHlsZU9wdGlvbnM6IDAsXG4gICAgZGlzcGxheVRleHQ6IDEsXG4gICAgZW5ncmF2ZWRUZXh0OiAyLFxuICAgIGlsbHVtaW5hdGVkQ2FwczogMyxcbiAgICB0aXRsaW5nQ2FwczogNCxcbiAgICB0YWxsQ2FwczogNVxuICB9LFxuICBjaGFyYWN0ZXJTaGFwZToge1xuICAgIGNvZGU6IDIwLFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICB0cmFkaXRpb25hbENoYXJhY3RlcnM6IDAsXG4gICAgc2ltcGxpZmllZENoYXJhY3RlcnM6IDEsXG4gICAgSklTMTk3OENoYXJhY3RlcnM6IDIsXG4gICAgSklTMTk4M0NoYXJhY3RlcnM6IDMsXG4gICAgSklTMTk5MENoYXJhY3RlcnM6IDQsXG4gICAgdHJhZGl0aW9uYWxBbHRPbmU6IDUsXG4gICAgdHJhZGl0aW9uYWxBbHRUd286IDYsXG4gICAgdHJhZGl0aW9uYWxBbHRUaHJlZTogNyxcbiAgICB0cmFkaXRpb25hbEFsdEZvdXI6IDgsXG4gICAgdHJhZGl0aW9uYWxBbHRGaXZlOiA5LFxuICAgIGV4cGVydENoYXJhY3RlcnM6IDEwLFxuICAgIEpJUzIwMDRDaGFyYWN0ZXJzOiAxMSxcbiAgICBob2pvQ2hhcmFjdGVyczogMTIsXG4gICAgTkxDQ2hhcmFjdGVyczogMTMsXG4gICAgdHJhZGl0aW9uYWxOYW1lc0NoYXJhY3RlcnM6IDE0XG4gIH0sXG4gIG51bWJlckNhc2U6IHtcbiAgICBjb2RlOiAyMSxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgbG93ZXJDYXNlTnVtYmVyczogMCxcbiAgICB1cHBlckNhc2VOdW1iZXJzOiAxXG4gIH0sXG4gIHRleHRTcGFjaW5nOiB7XG4gICAgY29kZTogMjIsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIHByb3BvcnRpb25hbFRleHQ6IDAsXG4gICAgbW9ub3NwYWNlZFRleHQ6IDEsXG4gICAgaGFsZldpZHRoVGV4dDogMixcbiAgICB0aGlyZFdpZHRoVGV4dDogMyxcbiAgICBxdWFydGVyV2lkdGhUZXh0OiA0LFxuICAgIGFsdFByb3BvcnRpb25hbFRleHQ6IDUsXG4gICAgYWx0SGFsZldpZHRoVGV4dDogNlxuICB9LFxuICB0cmFuc2xpdGVyYXRpb246IHtcbiAgICBjb2RlOiAyMyxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgbm9UcmFuc2xpdGVyYXRpb246IDBcbiAgfSxcbiAgLy8gaGFuamFUb0hhbmd1bDogMVxuICAvLyBoaXJhZ2FuYVRvS2F0YWthbmE6IDJcbiAgLy8ga2F0YWthbmFUb0hpcmFnYW5hOiAzXG4gIC8vIGthbmFUb1JvbWFuaXphdGlvbjogNFxuICAvLyByb21hbml6YXRpb25Ub0hpcmFnYW5hOiA1XG4gIC8vIHJvbWFuaXphdGlvblRvS2F0YWthbmE6IDZcbiAgLy8gaGFuamFUb0hhbmd1bEFsdE9uZTogN1xuICAvLyBoYW5qYVRvSGFuZ3VsQWx0VHdvOiA4XG4gIC8vIGhhbmphVG9IYW5ndWxBbHRUaHJlZTogOVxuICBhbm5vdGF0aW9uOiB7XG4gICAgY29kZTogMjQsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIG5vQW5ub3RhdGlvbjogMCxcbiAgICBib3hBbm5vdGF0aW9uOiAxLFxuICAgIHJvdW5kZWRCb3hBbm5vdGF0aW9uOiAyLFxuICAgIGNpcmNsZUFubm90YXRpb246IDMsXG4gICAgaW52ZXJ0ZWRDaXJjbGVBbm5vdGF0aW9uOiA0LFxuICAgIHBhcmVudGhlc2lzQW5ub3RhdGlvbjogNSxcbiAgICBwZXJpb2RBbm5vdGF0aW9uOiA2LFxuICAgIHJvbWFuTnVtZXJhbEFubm90YXRpb246IDcsXG4gICAgZGlhbW9uZEFubm90YXRpb246IDgsXG4gICAgaW52ZXJ0ZWRCb3hBbm5vdGF0aW9uOiA5LFxuICAgIGludmVydGVkUm91bmRlZEJveEFubm90YXRpb246IDEwXG4gIH0sXG4gIGthbmFTcGFjaW5nOiB7XG4gICAgY29kZTogMjUsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIGZ1bGxXaWR0aEthbmE6IDAsXG4gICAgcHJvcG9ydGlvbmFsS2FuYTogMVxuICB9LFxuICBpZGVvZ3JhcGhpY1NwYWNpbmc6IHtcbiAgICBjb2RlOiAyNixcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgZnVsbFdpZHRoSWRlb2dyYXBoczogMCxcbiAgICBwcm9wb3J0aW9uYWxJZGVvZ3JhcGhzOiAxLFxuICAgIGhhbGZXaWR0aElkZW9ncmFwaHM6IDJcbiAgfSxcbiAgdW5pY29kZURlY29tcG9zaXRpb246IHtcbiAgICBjb2RlOiAyNyxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIGNhbm9uaWNhbENvbXBvc2l0aW9uOiAwLFxuICAgIGNvbXBhdGliaWxpdHlDb21wb3NpdGlvbjogMixcbiAgICB0cmFuc2NvZGluZ0NvbXBvc2l0aW9uOiA0XG4gIH0sXG4gIHJ1YnlLYW5hOiB7XG4gICAgY29kZTogMjgsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICAvLyBub1J1YnlLYW5hOiAwICAgICAjIGRlcHJlY2F0ZWQgLSB1c2UgcnVieUthbmFPZmYgaW5zdGVhZFxuICAgIC8vIHJ1YnlLYW5hOiAxICAgICAjIGRlcHJlY2F0ZWQgLSB1c2UgcnVieUthbmFPbiBpbnN0ZWFkXG4gICAgcnVieUthbmE6IDJcbiAgfSxcbiAgQ0pLU3ltYm9sQWx0ZXJuYXRpdmVzOiB7XG4gICAgY29kZTogMjksXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIG5vQ0pLU3ltYm9sQWx0ZXJuYXRpdmVzOiAwLFxuICAgIENKS1N5bWJvbEFsdE9uZTogMSxcbiAgICBDSktTeW1ib2xBbHRUd286IDIsXG4gICAgQ0pLU3ltYm9sQWx0VGhyZWU6IDMsXG4gICAgQ0pLU3ltYm9sQWx0Rm91cjogNCxcbiAgICBDSktTeW1ib2xBbHRGaXZlOiA1XG4gIH0sXG4gIGlkZW9ncmFwaGljQWx0ZXJuYXRpdmVzOiB7XG4gICAgY29kZTogMzAsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIG5vSWRlb2dyYXBoaWNBbHRlcm5hdGl2ZXM6IDAsXG4gICAgaWRlb2dyYXBoaWNBbHRPbmU6IDEsXG4gICAgaWRlb2dyYXBoaWNBbHRUd286IDIsXG4gICAgaWRlb2dyYXBoaWNBbHRUaHJlZTogMyxcbiAgICBpZGVvZ3JhcGhpY0FsdEZvdXI6IDQsXG4gICAgaWRlb2dyYXBoaWNBbHRGaXZlOiA1XG4gIH0sXG4gIENKS1ZlcnRpY2FsUm9tYW5QbGFjZW1lbnQ6IHtcbiAgICBjb2RlOiAzMSxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgQ0pLVmVydGljYWxSb21hbkNlbnRlcmVkOiAwLFxuICAgIENKS1ZlcnRpY2FsUm9tYW5IQmFzZWxpbmU6IDFcbiAgfSxcbiAgaXRhbGljQ0pLUm9tYW46IHtcbiAgICBjb2RlOiAzMixcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIC8vIG5vQ0pLSXRhbGljUm9tYW46IDAgICAgICMgZGVwcmVjYXRlZCAtIHVzZSBDSktJdGFsaWNSb21hbk9mZiBpbnN0ZWFkXG4gICAgLy8gQ0pLSXRhbGljUm9tYW46IDEgICAgICMgZGVwcmVjYXRlZCAtIHVzZSBDSktJdGFsaWNSb21hbk9uIGluc3RlYWRcbiAgICBDSktJdGFsaWNSb21hbjogMlxuICB9LFxuICBjYXNlU2Vuc2l0aXZlTGF5b3V0OiB7XG4gICAgY29kZTogMzMsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICBjYXNlU2Vuc2l0aXZlTGF5b3V0OiAwLFxuICAgIGNhc2VTZW5zaXRpdmVTcGFjaW5nOiAyXG4gIH0sXG4gIGFsdGVybmF0ZUthbmE6IHtcbiAgICBjb2RlOiAzNCxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIGFsdGVybmF0ZUhvcml6S2FuYTogMCxcbiAgICBhbHRlcm5hdGVWZXJ0S2FuYTogMlxuICB9LFxuICBzdHlsaXN0aWNBbHRlcm5hdGl2ZXM6IHtcbiAgICBjb2RlOiAzNSxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIG5vU3R5bGlzdGljQWx0ZXJuYXRlczogMCxcbiAgICBzdHlsaXN0aWNBbHRPbmU6IDIsXG4gICAgc3R5bGlzdGljQWx0VHdvOiA0LFxuICAgIHN0eWxpc3RpY0FsdFRocmVlOiA2LFxuICAgIHN0eWxpc3RpY0FsdEZvdXI6IDgsXG4gICAgc3R5bGlzdGljQWx0Rml2ZTogMTAsXG4gICAgc3R5bGlzdGljQWx0U2l4OiAxMixcbiAgICBzdHlsaXN0aWNBbHRTZXZlbjogMTQsXG4gICAgc3R5bGlzdGljQWx0RWlnaHQ6IDE2LFxuICAgIHN0eWxpc3RpY0FsdE5pbmU6IDE4LFxuICAgIHN0eWxpc3RpY0FsdFRlbjogMjAsXG4gICAgc3R5bGlzdGljQWx0RWxldmVuOiAyMixcbiAgICBzdHlsaXN0aWNBbHRUd2VsdmU6IDI0LFxuICAgIHN0eWxpc3RpY0FsdFRoaXJ0ZWVuOiAyNixcbiAgICBzdHlsaXN0aWNBbHRGb3VydGVlbjogMjgsXG4gICAgc3R5bGlzdGljQWx0RmlmdGVlbjogMzAsXG4gICAgc3R5bGlzdGljQWx0U2l4dGVlbjogMzIsXG4gICAgc3R5bGlzdGljQWx0U2V2ZW50ZWVuOiAzNCxcbiAgICBzdHlsaXN0aWNBbHRFaWdodGVlbjogMzYsXG4gICAgc3R5bGlzdGljQWx0TmluZXRlZW46IDM4LFxuICAgIHN0eWxpc3RpY0FsdFR3ZW50eTogNDBcbiAgfSxcbiAgY29udGV4dHVhbEFsdGVybmF0ZXM6IHtcbiAgICBjb2RlOiAzNixcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIGNvbnRleHR1YWxBbHRlcm5hdGVzOiAwLFxuICAgIHN3YXNoQWx0ZXJuYXRlczogMixcbiAgICBjb250ZXh0dWFsU3dhc2hBbHRlcm5hdGVzOiA0XG4gIH0sXG4gIGxvd2VyQ2FzZToge1xuICAgIGNvZGU6IDM3LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBkZWZhdWx0TG93ZXJDYXNlOiAwLFxuICAgIGxvd2VyQ2FzZVNtYWxsQ2FwczogMSxcbiAgICBsb3dlckNhc2VQZXRpdGVDYXBzOiAyXG4gIH0sXG4gIHVwcGVyQ2FzZToge1xuICAgIGNvZGU6IDM4LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBkZWZhdWx0VXBwZXJDYXNlOiAwLFxuICAgIHVwcGVyQ2FzZVNtYWxsQ2FwczogMSxcbiAgICB1cHBlckNhc2VQZXRpdGVDYXBzOiAyXG4gIH0sXG4gIGxhbmd1YWdlVGFnOiB7XG4gICAgLy8gaW5kaWNlcyBpbnRvIGx0YWcgdGFibGVcbiAgICBjb2RlOiAzOSxcbiAgICBleGNsdXNpdmU6IHRydWVcbiAgfSxcbiAgQ0pLUm9tYW5TcGFjaW5nOiB7XG4gICAgY29kZTogMTAzLFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBoYWxmV2lkdGhDSktSb21hbjogMCxcbiAgICBwcm9wb3J0aW9uYWxDSktSb21hbjogMSxcbiAgICBkZWZhdWx0Q0pLUm9tYW46IDIsXG4gICAgZnVsbFdpZHRoQ0pLUm9tYW46IDNcbiAgfVxufTtcblxudmFyIGZlYXR1cmUgPSBmdW5jdGlvbiBmZWF0dXJlKG5hbWUsIHNlbGVjdG9yKSB7XG4gIHJldHVybiBbZmVhdHVyZXNbbmFtZV0uY29kZSwgZmVhdHVyZXNbbmFtZV1bc2VsZWN0b3JdXTtcbn07XG5cbnZhciBPVE1hcHBpbmcgPSB7XG4gIHJsaWc6IGZlYXR1cmUoJ2xpZ2F0dXJlcycsICdyZXF1aXJlZExpZ2F0dXJlcycpLFxuICBjbGlnOiBmZWF0dXJlKCdsaWdhdHVyZXMnLCAnY29udGV4dHVhbExpZ2F0dXJlcycpLFxuICBkbGlnOiBmZWF0dXJlKCdsaWdhdHVyZXMnLCAncmFyZUxpZ2F0dXJlcycpLFxuICBobGlnOiBmZWF0dXJlKCdsaWdhdHVyZXMnLCAnaGlzdG9yaWNhbExpZ2F0dXJlcycpLFxuICBsaWdhOiBmZWF0dXJlKCdsaWdhdHVyZXMnLCAnY29tbW9uTGlnYXR1cmVzJyksXG4gIGhpc3Q6IGZlYXR1cmUoJ2xpZ2F0dXJlcycsICdoaXN0b3JpY2FsTGlnYXR1cmVzJyksXG4gIC8vID8/XG4gIHNtY3A6IGZlYXR1cmUoJ2xvd2VyQ2FzZScsICdsb3dlckNhc2VTbWFsbENhcHMnKSxcbiAgcGNhcDogZmVhdHVyZSgnbG93ZXJDYXNlJywgJ2xvd2VyQ2FzZVBldGl0ZUNhcHMnKSxcbiAgZnJhYzogZmVhdHVyZSgnZnJhY3Rpb25zJywgJ2RpYWdvbmFsRnJhY3Rpb25zJyksXG4gIGRub206IGZlYXR1cmUoJ2ZyYWN0aW9ucycsICdkaWFnb25hbEZyYWN0aW9ucycpLFxuICAvLyA/P1xuICBudW1yOiBmZWF0dXJlKCdmcmFjdGlvbnMnLCAnZGlhZ29uYWxGcmFjdGlvbnMnKSxcbiAgLy8gPz9cbiAgYWZyYzogZmVhdHVyZSgnZnJhY3Rpb25zJywgJ3ZlcnRpY2FsRnJhY3Rpb25zJyksXG4gIC8vIGFhbHRcbiAgLy8gYWJ2ZiwgYWJ2bSwgYWJ2cywgYWtobiwgYmx3ZiwgYmx3bSwgYmx3cywgY2ZhciwgY2pjdCwgY3BzcCwgZmFsdCwgaXNvbCwgamFsdCwgbGptbywgbXNldD9cbiAgLy8gbHRyYSwgbHRybSwgbnVrdCwgcHJlZiwgcHJlcywgcHN0ZiwgcHN0cywgcmFuZCwgcmtyZiwgcnBoZiwgcnRsYSwgcnRsbSwgc2l6ZSwgdGptbywgdG51bT9cbiAgLy8gdW5pYywgdmF0dSwgdmhhbCwgdmptbywgdnBhbCwgdnJ0MlxuICAvLyBkaXN0IC0+IHRyYWsgdGFibGU/XG4gIC8vIGtlcm4sIHZrcm4gLT4ga2VybiB0YWJsZVxuICAvLyBsZmJkICsgb3BiZCArIHJ0YmQgLT4gb3BiZCB0YWJsZT9cbiAgLy8gbWFyaywgbWttayAtPiBhY250IHRhYmxlP1xuICAvLyBsb2NsIC0+IGxhbmd1YWdlVGFnICsgbHRhZyB0YWJsZVxuICBcImNhc2VcIjogZmVhdHVyZSgnY2FzZVNlbnNpdGl2ZUxheW91dCcsICdjYXNlU2Vuc2l0aXZlTGF5b3V0JyksXG4gIC8vIGFsc28gY2FzZVNlbnNpdGl2ZVNwYWNpbmdcbiAgY2NtcDogZmVhdHVyZSgndW5pY29kZURlY29tcG9zaXRpb24nLCAnY2Fub25pY2FsQ29tcG9zaXRpb24nKSxcbiAgLy8gY29tcGF0aWJpbGl0eUNvbXBvc2l0aW9uP1xuICBjcGN0OiBmZWF0dXJlKCdDSktWZXJ0aWNhbFJvbWFuUGxhY2VtZW50JywgJ0NKS1ZlcnRpY2FsUm9tYW5DZW50ZXJlZCcpLFxuICAvLyBndWVzcy4uLiwgcHJvYmFibHkgbm90IGdpdmVuIGJlbG93XG4gIHZhbHQ6IGZlYXR1cmUoJ0NKS1ZlcnRpY2FsUm9tYW5QbGFjZW1lbnQnLCAnQ0pLVmVydGljYWxSb21hbkNlbnRlcmVkJyksXG4gIHN3c2g6IGZlYXR1cmUoJ2NvbnRleHR1YWxBbHRlcm5hdGVzJywgJ3N3YXNoQWx0ZXJuYXRlcycpLFxuICBjc3doOiBmZWF0dXJlKCdjb250ZXh0dWFsQWx0ZXJuYXRlcycsICdjb250ZXh0dWFsU3dhc2hBbHRlcm5hdGVzJyksXG4gIGN1cnM6IGZlYXR1cmUoJ2N1cnNpdmVDb25uZWN0aW9uJywgJ2N1cnNpdmUnKSxcbiAgLy8gPz9cbiAgYzJwYzogZmVhdHVyZSgndXBwZXJDYXNlJywgJ3VwcGVyQ2FzZVBldGl0ZUNhcHMnKSxcbiAgYzJzYzogZmVhdHVyZSgndXBwZXJDYXNlJywgJ3VwcGVyQ2FzZVNtYWxsQ2FwcycpLFxuICBpbml0OiBmZWF0dXJlKCdzbWFydFN3YXNoJywgJ3dvcmRJbml0aWFsU3dhc2hlcycpLFxuICAvLyA/P1xuICBmaW4yOiBmZWF0dXJlKCdzbWFydFN3YXNoJywgJ3dvcmRGaW5hbFN3YXNoZXMnKSxcbiAgLy8gPz9cbiAgbWVkaTogZmVhdHVyZSgnc21hcnRTd2FzaCcsICdub25GaW5hbFN3YXNoZXMnKSxcbiAgLy8gPz9cbiAgbWVkMjogZmVhdHVyZSgnc21hcnRTd2FzaCcsICdub25GaW5hbFN3YXNoZXMnKSxcbiAgLy8gPz9cbiAgZmluMzogZmVhdHVyZSgnc21hcnRTd2FzaCcsICd3b3JkRmluYWxTd2FzaGVzJyksXG4gIC8vID8/XG4gIGZpbmE6IGZlYXR1cmUoJ3NtYXJ0U3dhc2gnLCAnd29yZEZpbmFsU3dhc2hlcycpLFxuICAvLyA/P1xuICBwa25hOiBmZWF0dXJlKCdrYW5hU3BhY2luZycsICdwcm9wb3J0aW9uYWxLYW5hJyksXG4gIGhhbGY6IGZlYXR1cmUoJ3RleHRTcGFjaW5nJywgJ2hhbGZXaWR0aFRleHQnKSxcbiAgLy8gYWxzbyBIYWxmV2lkdGhDSktSb21hbiwgSGFsZldpZHRoSWRlb2dyYXBocz9cbiAgaGFsdDogZmVhdHVyZSgndGV4dFNwYWNpbmcnLCAnYWx0SGFsZldpZHRoVGV4dCcpLFxuICBoa25hOiBmZWF0dXJlKCdhbHRlcm5hdGVLYW5hJywgJ2FsdGVybmF0ZUhvcml6S2FuYScpLFxuICB2a25hOiBmZWF0dXJlKCdhbHRlcm5hdGVLYW5hJywgJ2FsdGVybmF0ZVZlcnRLYW5hJyksXG4gIC8vIGhuZ2w6IGZlYXR1cmUgJ3RyYW5zbGl0ZXJhdGlvbicsICdoYW5qYVRvSGFuZ3VsU2VsZWN0b3InICMgZGVwcmVjYXRlZFxuICBpdGFsOiBmZWF0dXJlKCdpdGFsaWNDSktSb21hbicsICdDSktJdGFsaWNSb21hbicpLFxuICBsbnVtOiBmZWF0dXJlKCdudW1iZXJDYXNlJywgJ3VwcGVyQ2FzZU51bWJlcnMnKSxcbiAgb251bTogZmVhdHVyZSgnbnVtYmVyQ2FzZScsICdsb3dlckNhc2VOdW1iZXJzJyksXG4gIG1ncms6IGZlYXR1cmUoJ21hdGhlbWF0aWNhbEV4dHJhcycsICdtYXRoZW1hdGljYWxHcmVlaycpLFxuICAvLyBuYWx0OiBub3QgZW5vdWdoIGluZm8uIHdoYXQgdHlwZSBvZiBhbm5vdGF0aW9uP1xuICAvLyBvcm5tOiBkaXR0bywgd2hpY2ggb3JuYW1lbnQgc3R5bGU/XG4gIGNhbHQ6IGZlYXR1cmUoJ2NvbnRleHR1YWxBbHRlcm5hdGVzJywgJ2NvbnRleHR1YWxBbHRlcm5hdGVzJyksXG4gIC8vIG9yIG1vcmU/XG4gIHZydDI6IGZlYXR1cmUoJ3ZlcnRpY2FsU3Vic3RpdHV0aW9uJywgJ3N1YnN0aXR1dGVWZXJ0aWNhbEZvcm1zJyksXG4gIC8vIG9oLi4uIGJlbG93P1xuICB2ZXJ0OiBmZWF0dXJlKCd2ZXJ0aWNhbFN1YnN0aXR1dGlvbicsICdzdWJzdGl0dXRlVmVydGljYWxGb3JtcycpLFxuICB0bnVtOiBmZWF0dXJlKCdudW1iZXJTcGFjaW5nJywgJ21vbm9zcGFjZWROdW1iZXJzJyksXG4gIHBudW06IGZlYXR1cmUoJ251bWJlclNwYWNpbmcnLCAncHJvcG9ydGlvbmFsTnVtYmVycycpLFxuICBzdXBzOiBmZWF0dXJlKCd2ZXJ0aWNhbFBvc2l0aW9uJywgJ3N1cGVyaW9ycycpLFxuICBzdWJzOiBmZWF0dXJlKCd2ZXJ0aWNhbFBvc2l0aW9uJywgJ2luZmVyaW9ycycpLFxuICBvcmRuOiBmZWF0dXJlKCd2ZXJ0aWNhbFBvc2l0aW9uJywgJ29yZGluYWxzJyksXG4gIHB3aWQ6IGZlYXR1cmUoJ3RleHRTcGFjaW5nJywgJ3Byb3BvcnRpb25hbFRleHQnKSxcbiAgaHdpZDogZmVhdHVyZSgndGV4dFNwYWNpbmcnLCAnaGFsZldpZHRoVGV4dCcpLFxuICBxd2lkOiBmZWF0dXJlKCd0ZXh0U3BhY2luZycsICdxdWFydGVyV2lkdGhUZXh0JyksXG4gIC8vIGFsc28gUXVhcnRlcldpZHRoTnVtYmVycz9cbiAgdHdpZDogZmVhdHVyZSgndGV4dFNwYWNpbmcnLCAndGhpcmRXaWR0aFRleHQnKSxcbiAgLy8gYWxzbyBUaGlyZFdpZHRoTnVtYmVycz9cbiAgZndpZDogZmVhdHVyZSgndGV4dFNwYWNpbmcnLCAncHJvcG9ydGlvbmFsVGV4dCcpLFxuICAvLz8/XG4gIHBhbHQ6IGZlYXR1cmUoJ3RleHRTcGFjaW5nJywgJ2FsdFByb3BvcnRpb25hbFRleHQnKSxcbiAgdHJhZDogZmVhdHVyZSgnY2hhcmFjdGVyU2hhcGUnLCAndHJhZGl0aW9uYWxDaGFyYWN0ZXJzJyksXG4gIHNtcGw6IGZlYXR1cmUoJ2NoYXJhY3RlclNoYXBlJywgJ3NpbXBsaWZpZWRDaGFyYWN0ZXJzJyksXG4gIGpwNzg6IGZlYXR1cmUoJ2NoYXJhY3RlclNoYXBlJywgJ0pJUzE5NzhDaGFyYWN0ZXJzJyksXG4gIGpwODM6IGZlYXR1cmUoJ2NoYXJhY3RlclNoYXBlJywgJ0pJUzE5ODNDaGFyYWN0ZXJzJyksXG4gIGpwOTA6IGZlYXR1cmUoJ2NoYXJhY3RlclNoYXBlJywgJ0pJUzE5OTBDaGFyYWN0ZXJzJyksXG4gIGpwMDQ6IGZlYXR1cmUoJ2NoYXJhY3RlclNoYXBlJywgJ0pJUzIwMDRDaGFyYWN0ZXJzJyksXG4gIGV4cHQ6IGZlYXR1cmUoJ2NoYXJhY3RlclNoYXBlJywgJ2V4cGVydENoYXJhY3RlcnMnKSxcbiAgaG9qbzogZmVhdHVyZSgnY2hhcmFjdGVyU2hhcGUnLCAnaG9qb0NoYXJhY3RlcnMnKSxcbiAgbmxjazogZmVhdHVyZSgnY2hhcmFjdGVyU2hhcGUnLCAnTkxDQ2hhcmFjdGVycycpLFxuICB0bmFtOiBmZWF0dXJlKCdjaGFyYWN0ZXJTaGFwZScsICd0cmFkaXRpb25hbE5hbWVzQ2hhcmFjdGVycycpLFxuICBydWJ5OiBmZWF0dXJlKCdydWJ5S2FuYScsICdydWJ5S2FuYScpLFxuICB0aXRsOiBmZWF0dXJlKCdzdHlsZU9wdGlvbnMnLCAndGl0bGluZ0NhcHMnKSxcbiAgemVybzogZmVhdHVyZSgndHlwb2dyYXBoaWNFeHRyYXMnLCAnc2xhc2hlZFplcm8nKSxcbiAgc3MwMTogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdE9uZScpLFxuICBzczAyOiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0VHdvJyksXG4gIHNzMDM6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRUaHJlZScpLFxuICBzczA0OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0Rm91cicpLFxuICBzczA1OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0Rml2ZScpLFxuICBzczA2OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0U2l4JyksXG4gIHNzMDc6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRTZXZlbicpLFxuICBzczA4OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0RWlnaHQnKSxcbiAgc3MwOTogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdE5pbmUnKSxcbiAgc3MxMDogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdFRlbicpLFxuICBzczExOiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0RWxldmVuJyksXG4gIHNzMTI6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRUd2VsdmUnKSxcbiAgc3MxMzogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdFRoaXJ0ZWVuJyksXG4gIHNzMTQ6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRGb3VydGVlbicpLFxuICBzczE1OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0RmlmdGVlbicpLFxuICBzczE2OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0U2l4dGVlbicpLFxuICBzczE3OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0U2V2ZW50ZWVuJyksXG4gIHNzMTg6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRFaWdodGVlbicpLFxuICBzczE5OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0TmluZXRlZW4nKSxcbiAgc3MyMDogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdFR3ZW50eScpXG59OyAvLyBzYWx0OiBmZWF0dXJlICdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0T25lJyAjIGhtbSwgd2hpY2ggb25lIHRvIGNob29zZVxuLy8gQWRkIGN2MDEtY3Y5OSBmZWF0dXJlc1xuXG5mb3IgKHZhciBpJDMgPSAxOyBpJDMgPD0gOTk7IGkkMysrKSB7XG4gIE9UTWFwcGluZ1tcImN2XCIgKyAoXCIwMFwiICsgaSQzKS5zbGljZSgtMildID0gW2ZlYXR1cmVzLmNoYXJhY3RlckFsdGVybmF0aXZlcy5jb2RlLCBpJDNdO1xufSAvLyBjcmVhdGUgaW52ZXJzZSBtYXBwaW5nXG5cblxudmFyIEFBVE1hcHBpbmcgPSB7fTtcblxuZm9yICh2YXIgb3QgaW4gT1RNYXBwaW5nKSB7XG4gIHZhciBhYXQgPSBPVE1hcHBpbmdbb3RdO1xuXG4gIGlmIChBQVRNYXBwaW5nW2FhdFswXV0gPT0gbnVsbCkge1xuICAgIEFBVE1hcHBpbmdbYWF0WzBdXSA9IHt9O1xuICB9XG5cbiAgQUFUTWFwcGluZ1thYXRbMF1dW2FhdFsxXV0gPSBvdDtcbn0gLy8gTWFwcyBhbiBhcnJheSBvZiBPcGVuVHlwZSBmZWF0dXJlcyB0byBBQVQgZmVhdHVyZXNcbi8vIGluIHRoZSBmb3JtIG9mIHtmZWF0dXJlVHlwZTp7ZmVhdHVyZVNldHRpbmc6dHJ1ZX19XG5cblxuZnVuY3Rpb24gbWFwT1RUb0FBVChmZWF0dXJlcykge1xuICB2YXIgcmVzID0ge307XG5cbiAgZm9yICh2YXIgayBpbiBmZWF0dXJlcykge1xuICAgIHZhciByID0gdm9pZCAwO1xuXG4gICAgaWYgKHIgPSBPVE1hcHBpbmdba10pIHtcbiAgICAgIGlmIChyZXNbclswXV0gPT0gbnVsbCkge1xuICAgICAgICByZXNbclswXV0gPSB7fTtcbiAgICAgIH1cblxuICAgICAgcmVzW3JbMF1dW3JbMV1dID0gZmVhdHVyZXNba107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn0gLy8gTWFwcyBzdHJpbmdzIGluIGEgW2ZlYXR1cmVUeXBlLCBmZWF0dXJlU2V0dGluZ11cbi8vIHRvIHRoZWlyIGVxdWl2YWxlbnQgbnVtYmVyIGNvZGVzXG5cbmZ1bmN0aW9uIG1hcEZlYXR1cmVTdHJpbmdzKGYpIHtcbiAgdmFyIHR5cGUgPSBmWzBdLFxuICAgICAgc2V0dGluZyA9IGZbMV07XG5cbiAgaWYgKGlzTmFOKHR5cGUpKSB7XG4gICAgdmFyIHR5cGVDb2RlID0gZmVhdHVyZXNbdHlwZV0gJiYgZmVhdHVyZXNbdHlwZV0uY29kZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdHlwZUNvZGUgPSB0eXBlO1xuICB9XG5cbiAgaWYgKGlzTmFOKHNldHRpbmcpKSB7XG4gICAgdmFyIHNldHRpbmdDb2RlID0gZmVhdHVyZXNbdHlwZV0gJiYgZmVhdHVyZXNbdHlwZV1bc2V0dGluZ107XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNldHRpbmdDb2RlID0gc2V0dGluZztcbiAgfVxuXG4gIHJldHVybiBbdHlwZUNvZGUsIHNldHRpbmdDb2RlXTtcbn0gLy8gTWFwcyBBQVQgZmVhdHVyZXMgdG8gYW4gYXJyYXkgb2YgT3BlblR5cGUgZmVhdHVyZXNcbi8vIFN1cHBvcnRzIGJvdGggYXJyYXlzIGluIHRoZSBmb3JtIG9mIFtbZmVhdHVyZVR5cGUsIGZlYXR1cmVTZXR0aW5nXV1cbi8vIGFuZCBvYmplY3RzIGluIHRoZSBmb3JtIG9mIHtmZWF0dXJlVHlwZTp7ZmVhdHVyZVNldHRpbmc6dHJ1ZX19XG4vLyBmZWF0dXJlVHlwZXMgYW5kIGZlYXR1cmVTZXR0aW5ncyBjYW4gYmUgZWl0aGVyIHN0cmluZ3Mgb3IgbnVtYmVyIGNvZGVzXG5cblxuZnVuY3Rpb24gbWFwQUFUVG9PVChmZWF0dXJlcykge1xuICB2YXIgcmVzID0ge307XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdHVyZXMpKSB7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBmZWF0dXJlcy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIHIgPSB2b2lkIDA7XG4gICAgICB2YXIgZiA9IG1hcEZlYXR1cmVTdHJpbmdzKGZlYXR1cmVzW2tdKTtcblxuICAgICAgaWYgKHIgPSBBQVRNYXBwaW5nW2ZbMF1dICYmIEFBVE1hcHBpbmdbZlswXV1bZlsxXV0pIHtcbiAgICAgICAgcmVzW3JdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGZlYXR1cmVzID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIHR5cGUgaW4gZmVhdHVyZXMpIHtcbiAgICAgIHZhciBfZmVhdHVyZSA9IGZlYXR1cmVzW3R5cGVdO1xuXG4gICAgICBmb3IgKHZhciBzZXR0aW5nIGluIF9mZWF0dXJlKSB7XG4gICAgICAgIHZhciBfciA9IHZvaWQgMDtcblxuICAgICAgICB2YXIgX2YgPSBtYXBGZWF0dXJlU3RyaW5ncyhbdHlwZSwgc2V0dGluZ10pO1xuXG4gICAgICAgIGlmIChfZmVhdHVyZVtzZXR0aW5nXSAmJiAoX3IgPSBBQVRNYXBwaW5nW19mWzBdXSAmJiBBQVRNYXBwaW5nW19mWzBdXVtfZlsxXV0pKSB7XG4gICAgICAgICAgcmVzW19yXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXMocmVzKTtcbn1cblxudmFyIF9jbGFzcyQxO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDgobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDgobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDgobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ4KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkOChvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JDgoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkMSh0YXJnZXQsIHByb3BlcnR5LCBkZWNvcmF0b3JzLCBkZXNjcmlwdG9yLCBjb250ZXh0KSB7IHZhciBkZXNjID0ge307IE9iamVjdC5rZXlzKGRlc2NyaXB0b3IpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBkZXNjW2tleV0gPSBkZXNjcmlwdG9yW2tleV07IH0pOyBkZXNjLmVudW1lcmFibGUgPSAhIWRlc2MuZW51bWVyYWJsZTsgZGVzYy5jb25maWd1cmFibGUgPSAhIWRlc2MuY29uZmlndXJhYmxlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjIHx8IGRlc2MuaW5pdGlhbGl6ZXIpIHsgZGVzYy53cml0YWJsZSA9IHRydWU7IH0gZGVzYyA9IGRlY29yYXRvcnMuc2xpY2UoKS5yZXZlcnNlKCkucmVkdWNlKGZ1bmN0aW9uIChkZXNjLCBkZWNvcmF0b3IpIHsgcmV0dXJuIGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5LCBkZXNjKSB8fCBkZXNjOyB9LCBkZXNjKTsgaWYgKGNvbnRleHQgJiYgZGVzYy5pbml0aWFsaXplciAhPT0gdm9pZCAwKSB7IGRlc2MudmFsdWUgPSBkZXNjLmluaXRpYWxpemVyID8gZGVzYy5pbml0aWFsaXplci5jYWxsKGNvbnRleHQpIDogdm9pZCAwOyBkZXNjLmluaXRpYWxpemVyID0gdW5kZWZpbmVkOyB9IGlmIChkZXNjLmluaXRpYWxpemVyID09PSB2b2lkIDApIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIGRlc2MpOyBkZXNjID0gbnVsbDsgfSByZXR1cm4gZGVzYzsgfVxudmFyIEFBVExvb2t1cFRhYmxlID0gKF9jbGFzcyQxID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQUFUTG9va3VwVGFibGUodGFibGUpIHtcbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQUFUTG9va3VwVGFibGUucHJvdG90eXBlO1xuXG4gIF9wcm90by5sb29rdXAgPSBmdW5jdGlvbiBsb29rdXAoZ2x5cGgpIHtcbiAgICBzd2l0Y2ggKHRoaXMudGFibGUudmVyc2lvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICAvLyBzaW1wbGUgYXJyYXkgZm9ybWF0XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlLnZhbHVlcy5nZXRJdGVtKGdseXBoKTtcblxuICAgICAgY2FzZSAyOiAvLyBzZWdtZW50IGZvcm1hdFxuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbWluID0gMDtcbiAgICAgICAgICB2YXIgbWF4ID0gdGhpcy50YWJsZS5iaW5hcnlTZWFyY2hIZWFkZXIublVuaXRzIC0gMTtcblxuICAgICAgICAgIHdoaWxlIChtaW4gPD0gbWF4KSB7XG4gICAgICAgICAgICB2YXIgbWlkID0gbWluICsgbWF4ID4+IDE7XG4gICAgICAgICAgICB2YXIgc2VnID0gdGhpcy50YWJsZS5zZWdtZW50c1ttaWRdOyAvLyBzcGVjaWFsIGVuZCBvZiBzZWFyY2ggdmFsdWVcblxuICAgICAgICAgICAgaWYgKHNlZy5maXJzdEdseXBoID09PSAweGZmZmYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChnbHlwaCA8IHNlZy5maXJzdEdseXBoKSB7XG4gICAgICAgICAgICAgIG1heCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdseXBoID4gc2VnLmxhc3RHbHlwaCkge1xuICAgICAgICAgICAgICBtaW4gPSBtaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMudGFibGUudmVyc2lvbiA9PT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWcudmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlZy52YWx1ZXNbZ2x5cGggLSBzZWcuZmlyc3RHbHlwaF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDY6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBsb29rdXAgc2luZ2xlXG4gICAgICAgICAgdmFyIF9taW4gPSAwO1xuXG4gICAgICAgICAgdmFyIF9tYXggPSB0aGlzLnRhYmxlLmJpbmFyeVNlYXJjaEhlYWRlci5uVW5pdHMgLSAxO1xuXG4gICAgICAgICAgd2hpbGUgKF9taW4gPD0gX21heCkge1xuICAgICAgICAgICAgdmFyIG1pZCA9IF9taW4gKyBfbWF4ID4+IDE7XG4gICAgICAgICAgICB2YXIgc2VnID0gdGhpcy50YWJsZS5zZWdtZW50c1ttaWRdOyAvLyBzcGVjaWFsIGVuZCBvZiBzZWFyY2ggdmFsdWVcblxuICAgICAgICAgICAgaWYgKHNlZy5nbHlwaCA9PT0gMHhmZmZmKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZ2x5cGggPCBzZWcuZ2x5cGgpIHtcbiAgICAgICAgICAgICAgX21heCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdseXBoID4gc2VnLmdseXBoKSB7XG4gICAgICAgICAgICAgIF9taW4gPSBtaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlZy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDg6XG4gICAgICAgIC8vIGxvb2t1cCB0cmltbWVkXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlLnZhbHVlc1tnbHlwaCAtIHRoaXMudGFibGUuZmlyc3RHbHlwaF07XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gbG9va3VwIHRhYmxlIGZvcm1hdDogXCIgKyB0aGlzLnRhYmxlLnZlcnNpb24pO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZ2x5cGhzRm9yVmFsdWUgPSBmdW5jdGlvbiBnbHlwaHNGb3JWYWx1ZShjbGFzc1ZhbHVlKSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuXG4gICAgc3dpdGNoICh0aGlzLnRhYmxlLnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMjogLy8gc2VnbWVudCBmb3JtYXRcblxuICAgICAgY2FzZSA0OlxuICAgICAgICB7XG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ4KHRoaXMudGFibGUuc2VnbWVudHMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIHNlZ21lbnQgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudGFibGUudmVyc2lvbiA9PT0gMiAmJiBzZWdtZW50LnZhbHVlID09PSBjbGFzc1ZhbHVlKSB7XG4gICAgICAgICAgICAgIHJlcy5wdXNoLmFwcGx5KHJlcywgcmFuZ2Uoc2VnbWVudC5maXJzdEdseXBoLCBzZWdtZW50Lmxhc3RHbHlwaCArIDEpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzZWdtZW50LnZhbHVlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC52YWx1ZXNbaW5kZXhdID09PSBjbGFzc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICByZXMucHVzaChzZWdtZW50LmZpcnN0R2x5cGggKyBpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA2OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gbG9va3VwIHNpbmdsZVxuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDgodGhpcy50YWJsZS5zZWdtZW50cyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgX3NlZ21lbnQgPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChfc2VnbWVudC52YWx1ZSA9PT0gY2xhc3NWYWx1ZSkge1xuICAgICAgICAgICAgICByZXMucHVzaChfc2VnbWVudC5nbHlwaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA4OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gbG9va3VwIHRyaW1tZWRcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGFibGUudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50YWJsZS52YWx1ZXNbaV0gPT09IGNsYXNzVmFsdWUpIHtcbiAgICAgICAgICAgICAgcmVzLnB1c2godGhpcy50YWJsZS5maXJzdEdseXBoICsgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBsb29rdXAgdGFibGUgZm9ybWF0OiBcIiArIHRoaXMudGFibGUudmVyc2lvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICByZXR1cm4gQUFUTG9va3VwVGFibGU7XG59KCksIChfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDEoX2NsYXNzJDEucHJvdG90eXBlLCBcImdseXBoc0ZvclZhbHVlXCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDEucHJvdG90eXBlLCBcImdseXBoc0ZvclZhbHVlXCIpLCBfY2xhc3MkMS5wcm90b3R5cGUpKSwgX2NsYXNzJDEpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDkobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDkobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkOShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JDkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG52YXIgU1RBUlRfT0ZfVEVYVF9TVEFURSA9IDA7XG52YXIgRU5EX09GX1RFWFRfQ0xBU1MgPSAwO1xudmFyIE9VVF9PRl9CT1VORFNfQ0xBU1MgPSAxO1xudmFyIERFTEVURURfR0xZUEhfQ0xBU1MgPSAyO1xudmFyIERPTlRfQURWQU5DRSA9IDB4NDAwMDtcblxudmFyIEFBVFN0YXRlTWFjaGluZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFBVFN0YXRlTWFjaGluZShzdGF0ZVRhYmxlKSB7XG4gICAgdGhpcy5zdGF0ZVRhYmxlID0gc3RhdGVUYWJsZTtcbiAgICB0aGlzLmxvb2t1cFRhYmxlID0gbmV3IEFBVExvb2t1cFRhYmxlKHN0YXRlVGFibGUuY2xhc3NUYWJsZSk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQUFUU3RhdGVNYWNoaW5lLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucHJvY2VzcyA9IGZ1bmN0aW9uIHByb2Nlc3MoZ2x5cGhzLCByZXZlcnNlLCBwcm9jZXNzRW50cnkpIHtcbiAgICB2YXIgY3VycmVudFN0YXRlID0gU1RBUlRfT0ZfVEVYVF9TVEFURTsgLy8gU1RBUlRfT0ZfTElORV9TVEFURSBpcyB1c2VkIGZvciBrYXNoaWRhIGdseXBoIGluc2VydGlvbnMgc29tZXRpbWVzIEkgdGhpbms/XG5cbiAgICB2YXIgaW5kZXggPSByZXZlcnNlID8gZ2x5cGhzLmxlbmd0aCAtIDEgOiAwO1xuICAgIHZhciBkaXIgPSByZXZlcnNlID8gLTEgOiAxO1xuXG4gICAgd2hpbGUgKGRpciA9PT0gMSAmJiBpbmRleCA8PSBnbHlwaHMubGVuZ3RoIHx8IGRpciA9PT0gLTEgJiYgaW5kZXggPj0gLTEpIHtcbiAgICAgIHZhciBnbHlwaCA9IG51bGw7XG4gICAgICB2YXIgY2xhc3NDb2RlID0gT1VUX09GX0JPVU5EU19DTEFTUztcbiAgICAgIHZhciBzaG91bGRBZHZhbmNlID0gdHJ1ZTtcblxuICAgICAgaWYgKGluZGV4ID09PSBnbHlwaHMubGVuZ3RoIHx8IGluZGV4ID09PSAtMSkge1xuICAgICAgICBjbGFzc0NvZGUgPSBFTkRfT0ZfVEVYVF9DTEFTUztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdseXBoID0gZ2x5cGhzW2luZGV4XTtcblxuICAgICAgICBpZiAoZ2x5cGguaWQgPT09IDB4ZmZmZikge1xuICAgICAgICAgIC8vIGRlbGV0ZWQgZ2x5cGhcbiAgICAgICAgICBjbGFzc0NvZGUgPSBERUxFVEVEX0dMWVBIX0NMQVNTO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsYXNzQ29kZSA9IHRoaXMubG9va3VwVGFibGUubG9va3VwKGdseXBoLmlkKTtcblxuICAgICAgICAgIGlmIChjbGFzc0NvZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgY2xhc3NDb2RlID0gT1VUX09GX0JPVU5EU19DTEFTUztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHJvdyA9IHRoaXMuc3RhdGVUYWJsZS5zdGF0ZUFycmF5LmdldEl0ZW0oY3VycmVudFN0YXRlKTtcbiAgICAgIHZhciBlbnRyeUluZGV4ID0gcm93W2NsYXNzQ29kZV07XG4gICAgICB2YXIgZW50cnkgPSB0aGlzLnN0YXRlVGFibGUuZW50cnlUYWJsZS5nZXRJdGVtKGVudHJ5SW5kZXgpO1xuXG4gICAgICBpZiAoY2xhc3NDb2RlICE9PSBFTkRfT0ZfVEVYVF9DTEFTUyAmJiBjbGFzc0NvZGUgIT09IERFTEVURURfR0xZUEhfQ0xBU1MpIHtcbiAgICAgICAgcHJvY2Vzc0VudHJ5KGdseXBoLCBlbnRyeSwgaW5kZXgpO1xuICAgICAgICBzaG91bGRBZHZhbmNlID0gIShlbnRyeS5mbGFncyAmIERPTlRfQURWQU5DRSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRTdGF0ZSA9IGVudHJ5Lm5ld1N0YXRlO1xuXG4gICAgICBpZiAoc2hvdWxkQWR2YW5jZSkge1xuICAgICAgICBpbmRleCArPSBkaXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGdseXBocztcbiAgfVxuICAvKipcbiAgICogUGVyZm9ybXMgYSBkZXB0aC1maXJzdCB0cmF2ZXJzYWwgb2YgdGhlIGdseXBoIHN0cmluZ3NcbiAgICogcmVwcmVzZW50ZWQgYnkgdGhlIHN0YXRlIG1hY2hpbmUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRyYXZlcnNlID0gZnVuY3Rpb24gdHJhdmVyc2Uob3B0cywgc3RhdGUsIHZpc2l0ZWQpIHtcbiAgICBpZiAoc3RhdGUgPT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUgPSAwO1xuICAgIH1cblxuICAgIGlmICh2aXNpdGVkID09PSB2b2lkIDApIHtcbiAgICAgIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gICAgfVxuXG4gICAgaWYgKHZpc2l0ZWQuaGFzKHN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZpc2l0ZWQuYWRkKHN0YXRlKTtcbiAgICB2YXIgX3RoaXMkc3RhdGVUYWJsZSA9IHRoaXMuc3RhdGVUYWJsZSxcbiAgICAgICAgbkNsYXNzZXMgPSBfdGhpcyRzdGF0ZVRhYmxlLm5DbGFzc2VzLFxuICAgICAgICBzdGF0ZUFycmF5ID0gX3RoaXMkc3RhdGVUYWJsZS5zdGF0ZUFycmF5LFxuICAgICAgICBlbnRyeVRhYmxlID0gX3RoaXMkc3RhdGVUYWJsZS5lbnRyeVRhYmxlO1xuICAgIHZhciByb3cgPSBzdGF0ZUFycmF5LmdldEl0ZW0oc3RhdGUpOyAvLyBTa2lwIHByZWRlZmluZWQgY2xhc3Nlc1xuXG4gICAgZm9yICh2YXIgY2xhc3NDb2RlID0gNDsgY2xhc3NDb2RlIDwgbkNsYXNzZXM7IGNsYXNzQ29kZSsrKSB7XG4gICAgICB2YXIgZW50cnlJbmRleCA9IHJvd1tjbGFzc0NvZGVdO1xuICAgICAgdmFyIGVudHJ5ID0gZW50cnlUYWJsZS5nZXRJdGVtKGVudHJ5SW5kZXgpOyAvLyBUcnkgYWxsIGdseXBocyBpbiB0aGUgY2xhc3NcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ5KHRoaXMubG9va3VwVGFibGUuZ2x5cGhzRm9yVmFsdWUoY2xhc3NDb2RlKSksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBnbHlwaCA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgIGlmIChvcHRzLmVudGVyKSB7XG4gICAgICAgICAgb3B0cy5lbnRlcihnbHlwaCwgZW50cnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5Lm5ld1N0YXRlICE9PSAwKSB7XG4gICAgICAgICAgdGhpcy50cmF2ZXJzZShvcHRzLCBlbnRyeS5uZXdTdGF0ZSwgdmlzaXRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0cy5leGl0KSB7XG4gICAgICAgICAgb3B0cy5leGl0KGdseXBoLCBlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEFBVFN0YXRlTWFjaGluZTtcbn0oKTtcblxudmFyIF9jbGFzcyQyO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGEobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGEobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGEobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRhKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkYShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGEoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkMih0YXJnZXQsIHByb3BlcnR5LCBkZWNvcmF0b3JzLCBkZXNjcmlwdG9yLCBjb250ZXh0KSB7IHZhciBkZXNjID0ge307IE9iamVjdC5rZXlzKGRlc2NyaXB0b3IpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBkZXNjW2tleV0gPSBkZXNjcmlwdG9yW2tleV07IH0pOyBkZXNjLmVudW1lcmFibGUgPSAhIWRlc2MuZW51bWVyYWJsZTsgZGVzYy5jb25maWd1cmFibGUgPSAhIWRlc2MuY29uZmlndXJhYmxlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjIHx8IGRlc2MuaW5pdGlhbGl6ZXIpIHsgZGVzYy53cml0YWJsZSA9IHRydWU7IH0gZGVzYyA9IGRlY29yYXRvcnMuc2xpY2UoKS5yZXZlcnNlKCkucmVkdWNlKGZ1bmN0aW9uIChkZXNjLCBkZWNvcmF0b3IpIHsgcmV0dXJuIGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5LCBkZXNjKSB8fCBkZXNjOyB9LCBkZXNjKTsgaWYgKGNvbnRleHQgJiYgZGVzYy5pbml0aWFsaXplciAhPT0gdm9pZCAwKSB7IGRlc2MudmFsdWUgPSBkZXNjLmluaXRpYWxpemVyID8gZGVzYy5pbml0aWFsaXplci5jYWxsKGNvbnRleHQpIDogdm9pZCAwOyBkZXNjLmluaXRpYWxpemVyID0gdW5kZWZpbmVkOyB9IGlmIChkZXNjLmluaXRpYWxpemVyID09PSB2b2lkIDApIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIGRlc2MpOyBkZXNjID0gbnVsbDsgfSByZXR1cm4gZGVzYzsgfVxuXG52YXIgTUFSS19GSVJTVCA9IDB4ODAwMDtcbnZhciBNQVJLX0xBU1QgPSAweDIwMDA7XG52YXIgVkVSQiA9IDB4MDAwRjsgLy8gY29udGV4dHVhbCBzdWJzdGl0dXRpb24gYW5kIGdseXBoIGluc2VydGlvbiBmbGFnXG5cbnZhciBTRVRfTUFSSyA9IDB4ODAwMDsgLy8gbGlnYXR1cmUgZW50cnkgZmxhZ3NcblxudmFyIFNFVF9DT01QT05FTlQgPSAweDgwMDA7XG52YXIgUEVSRk9STV9BQ1RJT04gPSAweDIwMDA7IC8vIGxpZ2F0dXJlIGFjdGlvbiBtYXNrc1xuXG52YXIgTEFTVF9NQVNLID0gMHg4MDAwMDAwMDtcbnZhciBTVE9SRV9NQVNLID0gMHg0MDAwMDAwMDtcbnZhciBPRkZTRVRfTUFTSyA9IDB4M0ZGRkZGRkY7XG52YXIgUkVWRVJTRV9ESVJFQ1RJT04gPSAweDQwMDAwMDtcbnZhciBDVVJSRU5UX0lOU0VSVF9CRUZPUkUgPSAweDA4MDA7XG52YXIgTUFSS0VEX0lOU0VSVF9CRUZPUkUgPSAweDA0MDA7XG52YXIgQ1VSUkVOVF9JTlNFUlRfQ09VTlQgPSAweDAzRTA7XG52YXIgTUFSS0VEX0lOU0VSVF9DT1VOVCA9IDB4MDAxRjtcbnZhciBBQVRNb3J4UHJvY2Vzc29yID0gKF9jbGFzcyQyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQUFUTW9yeFByb2Nlc3Nvcihmb250KSB7XG4gICAgdGhpcy5wcm9jZXNzSW5kaWNSZWFycmFnZW1lbnQgPSB0aGlzLnByb2Nlc3NJbmRpY1JlYXJyYWdlbWVudC5iaW5kKHRoaXMpO1xuICAgIHRoaXMucHJvY2Vzc0NvbnRleHR1YWxTdWJzdGl0dXRpb24gPSB0aGlzLnByb2Nlc3NDb250ZXh0dWFsU3Vic3RpdHV0aW9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy5wcm9jZXNzTGlnYXR1cmUgPSB0aGlzLnByb2Nlc3NMaWdhdHVyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMucHJvY2Vzc05vbmNvbnRleHR1YWxTdWJzdGl0dXRpb25zID0gdGhpcy5wcm9jZXNzTm9uY29udGV4dHVhbFN1YnN0aXR1dGlvbnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnByb2Nlc3NHbHlwaEluc2VydGlvbiA9IHRoaXMucHJvY2Vzc0dseXBoSW5zZXJ0aW9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy5mb250ID0gZm9udDtcbiAgICB0aGlzLm1vcnggPSBmb250Lm1vcng7XG4gICAgdGhpcy5pbnB1dENhY2hlID0gbnVsbDtcbiAgfSAvLyBQcm9jZXNzZXMgYW4gYXJyYXkgb2YgZ2x5cGhzIGFuZCBhcHBsaWVzIHRoZSBzcGVjaWZpZWQgZmVhdHVyZXNcbiAgLy8gRmVhdHVyZXMgc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mIHtmZWF0dXJlVHlwZTp7ZmVhdHVyZVNldHRpbmc6dHJ1ZX19XG5cblxuICB2YXIgX3Byb3RvID0gQUFUTW9yeFByb2Nlc3Nvci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnByb2Nlc3MgPSBmdW5jdGlvbiBwcm9jZXNzKGdseXBocywgZmVhdHVyZXMpIHtcbiAgICBpZiAoZmVhdHVyZXMgPT09IHZvaWQgMCkge1xuICAgICAgZmVhdHVyZXMgPSB7fTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGEodGhpcy5tb3J4LmNoYWlucyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgY2hhaW4gPSBfc3RlcC52YWx1ZTtcbiAgICAgIHZhciBmbGFncyA9IGNoYWluLmRlZmF1bHRGbGFnczsgLy8gZW5hYmxlL2Rpc2FibGUgdGhlIHJlcXVlc3RlZCBmZWF0dXJlc1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRhKGNoYWluLmZlYXR1cmVzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBfc3RlcDIudmFsdWU7XG4gICAgICAgIHZhciBmID0gdm9pZCAwO1xuXG4gICAgICAgIGlmICgoZiA9IGZlYXR1cmVzW2ZlYXR1cmUuZmVhdHVyZVR5cGVdKSAmJiBmW2ZlYXR1cmUuZmVhdHVyZVNldHRpbmddKSB7XG4gICAgICAgICAgZmxhZ3MgJj0gZmVhdHVyZS5kaXNhYmxlRmxhZ3M7XG4gICAgICAgICAgZmxhZ3MgfD0gZmVhdHVyZS5lbmFibGVGbGFncztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRhKGNoYWluLnN1YnRhYmxlcyksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBzdWJ0YWJsZSA9IF9zdGVwMy52YWx1ZTtcblxuICAgICAgICBpZiAoc3VidGFibGUuc3ViRmVhdHVyZUZsYWdzICYgZmxhZ3MpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NTdWJ0YWJsZShzdWJ0YWJsZSwgZ2x5cGhzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gcmVtb3ZlIGRlbGV0ZWQgZ2x5cGhzXG5cblxuICAgIHZhciBpbmRleCA9IGdseXBocy5sZW5ndGggLSAxO1xuXG4gICAgd2hpbGUgKGluZGV4ID49IDApIHtcbiAgICAgIGlmIChnbHlwaHNbaW5kZXhdLmlkID09PSAweGZmZmYpIHtcbiAgICAgICAgZ2x5cGhzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG5cbiAgICAgIGluZGV4LS07XG4gICAgfVxuXG4gICAgcmV0dXJuIGdseXBocztcbiAgfTtcblxuICBfcHJvdG8ucHJvY2Vzc1N1YnRhYmxlID0gZnVuY3Rpb24gcHJvY2Vzc1N1YnRhYmxlKHN1YnRhYmxlLCBnbHlwaHMpIHtcbiAgICB0aGlzLnN1YnRhYmxlID0gc3VidGFibGU7XG4gICAgdGhpcy5nbHlwaHMgPSBnbHlwaHM7XG5cbiAgICBpZiAodGhpcy5zdWJ0YWJsZS50eXBlID09PSA0KSB7XG4gICAgICB0aGlzLnByb2Nlc3NOb25jb250ZXh0dWFsU3Vic3RpdHV0aW9ucyh0aGlzLnN1YnRhYmxlLCB0aGlzLmdseXBocyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5saWdhdHVyZVN0YWNrID0gW107XG4gICAgdGhpcy5tYXJrZWRHbHlwaCA9IG51bGw7XG4gICAgdGhpcy5maXJzdEdseXBoID0gbnVsbDtcbiAgICB0aGlzLmxhc3RHbHlwaCA9IG51bGw7XG4gICAgdGhpcy5tYXJrZWRJbmRleCA9IG51bGw7XG4gICAgdmFyIHN0YXRlTWFjaGluZSA9IHRoaXMuZ2V0U3RhdGVNYWNoaW5lKHN1YnRhYmxlKTtcbiAgICB2YXIgcHJvY2VzcyA9IHRoaXMuZ2V0UHJvY2Vzc29yKCk7XG4gICAgdmFyIHJldmVyc2UgPSAhISh0aGlzLnN1YnRhYmxlLmNvdmVyYWdlICYgUkVWRVJTRV9ESVJFQ1RJT04pO1xuICAgIHJldHVybiBzdGF0ZU1hY2hpbmUucHJvY2Vzcyh0aGlzLmdseXBocywgcmV2ZXJzZSwgcHJvY2Vzcyk7XG4gIH07XG5cbiAgX3Byb3RvLmdldFN0YXRlTWFjaGluZSA9IGZ1bmN0aW9uIGdldFN0YXRlTWFjaGluZShzdWJ0YWJsZSkge1xuICAgIHJldHVybiBuZXcgQUFUU3RhdGVNYWNoaW5lKHN1YnRhYmxlLnRhYmxlLnN0YXRlVGFibGUpO1xuICB9O1xuXG4gIF9wcm90by5nZXRQcm9jZXNzb3IgPSBmdW5jdGlvbiBnZXRQcm9jZXNzb3IoKSB7XG4gICAgc3dpdGNoICh0aGlzLnN1YnRhYmxlLnR5cGUpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0luZGljUmVhcnJhZ2VtZW50O1xuXG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NDb250ZXh0dWFsU3Vic3RpdHV0aW9uO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NMaWdhdHVyZTtcblxuICAgICAgY2FzZSA0OlxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTm9uY29udGV4dHVhbFN1YnN0aXR1dGlvbnM7XG5cbiAgICAgIGNhc2UgNTpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0dseXBoSW5zZXJ0aW9uO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG1vcnggc3VidGFibGUgdHlwZTogXCIgKyB0aGlzLnN1YnRhYmxlLnR5cGUpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucHJvY2Vzc0luZGljUmVhcnJhZ2VtZW50ID0gZnVuY3Rpb24gcHJvY2Vzc0luZGljUmVhcnJhZ2VtZW50KGdseXBoLCBlbnRyeSwgaW5kZXgpIHtcbiAgICBpZiAoZW50cnkuZmxhZ3MgJiBNQVJLX0ZJUlNUKSB7XG4gICAgICB0aGlzLmZpcnN0R2x5cGggPSBpbmRleDtcbiAgICB9XG5cbiAgICBpZiAoZW50cnkuZmxhZ3MgJiBNQVJLX0xBU1QpIHtcbiAgICAgIHRoaXMubGFzdEdseXBoID0gaW5kZXg7XG4gICAgfVxuXG4gICAgcmVvcmRlckdseXBocyh0aGlzLmdseXBocywgZW50cnkuZmxhZ3MgJiBWRVJCLCB0aGlzLmZpcnN0R2x5cGgsIHRoaXMubGFzdEdseXBoKTtcbiAgfTtcblxuICBfcHJvdG8ucHJvY2Vzc0NvbnRleHR1YWxTdWJzdGl0dXRpb24gPSBmdW5jdGlvbiBwcm9jZXNzQ29udGV4dHVhbFN1YnN0aXR1dGlvbihnbHlwaCwgZW50cnksIGluZGV4KSB7XG4gICAgdmFyIHN1YnNpdHV0aW9ucyA9IHRoaXMuc3VidGFibGUudGFibGUuc3Vic3RpdHV0aW9uVGFibGUuaXRlbXM7XG5cbiAgICBpZiAoZW50cnkubWFya0luZGV4ICE9PSAweGZmZmYpIHtcbiAgICAgIHZhciBsb29rdXAgPSBzdWJzaXR1dGlvbnMuZ2V0SXRlbShlbnRyeS5tYXJrSW5kZXgpO1xuICAgICAgdmFyIGxvb2t1cFRhYmxlID0gbmV3IEFBVExvb2t1cFRhYmxlKGxvb2t1cCk7XG4gICAgICBnbHlwaCA9IHRoaXMuZ2x5cGhzW3RoaXMubWFya2VkR2x5cGhdO1xuICAgICAgdmFyIGdpZCA9IGxvb2t1cFRhYmxlLmxvb2t1cChnbHlwaC5pZCk7XG5cbiAgICAgIGlmIChnaWQpIHtcbiAgICAgICAgdGhpcy5nbHlwaHNbdGhpcy5tYXJrZWRHbHlwaF0gPSB0aGlzLmZvbnQuZ2V0R2x5cGgoZ2lkLCBnbHlwaC5jb2RlUG9pbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkuY3VycmVudEluZGV4ICE9PSAweGZmZmYpIHtcbiAgICAgIHZhciBfbG9va3VwID0gc3Vic2l0dXRpb25zLmdldEl0ZW0oZW50cnkuY3VycmVudEluZGV4KTtcblxuICAgICAgdmFyIF9sb29rdXBUYWJsZSA9IG5ldyBBQVRMb29rdXBUYWJsZShfbG9va3VwKTtcblxuICAgICAgZ2x5cGggPSB0aGlzLmdseXBoc1tpbmRleF07XG5cbiAgICAgIHZhciBnaWQgPSBfbG9va3VwVGFibGUubG9va3VwKGdseXBoLmlkKTtcblxuICAgICAgaWYgKGdpZCkge1xuICAgICAgICB0aGlzLmdseXBoc1tpbmRleF0gPSB0aGlzLmZvbnQuZ2V0R2x5cGgoZ2lkLCBnbHlwaC5jb2RlUG9pbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkuZmxhZ3MgJiBTRVRfTUFSSykge1xuICAgICAgdGhpcy5tYXJrZWRHbHlwaCA9IGluZGV4O1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucHJvY2Vzc0xpZ2F0dXJlID0gZnVuY3Rpb24gcHJvY2Vzc0xpZ2F0dXJlKGdseXBoLCBlbnRyeSwgaW5kZXgpIHtcbiAgICBpZiAoZW50cnkuZmxhZ3MgJiBTRVRfQ09NUE9ORU5UKSB7XG4gICAgICB0aGlzLmxpZ2F0dXJlU3RhY2sucHVzaChpbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LmZsYWdzICYgUEVSRk9STV9BQ1RJT04pIHtcbiAgICAgIHZhciBfdGhpcyRsaWdhdHVyZVN0YWNrO1xuXG4gICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuc3VidGFibGUudGFibGUubGlnYXR1cmVBY3Rpb25zO1xuICAgICAgdmFyIGNvbXBvbmVudHMgPSB0aGlzLnN1YnRhYmxlLnRhYmxlLmNvbXBvbmVudHM7XG4gICAgICB2YXIgbGlnYXR1cmVMaXN0ID0gdGhpcy5zdWJ0YWJsZS50YWJsZS5saWdhdHVyZUxpc3Q7XG4gICAgICB2YXIgYWN0aW9uSW5kZXggPSBlbnRyeS5hY3Rpb247XG4gICAgICB2YXIgbGFzdCA9IGZhbHNlO1xuICAgICAgdmFyIGxpZ2F0dXJlSW5kZXggPSAwO1xuICAgICAgdmFyIGNvZGVQb2ludHMgPSBbXTtcbiAgICAgIHZhciBsaWdhdHVyZUdseXBocyA9IFtdO1xuXG4gICAgICB3aGlsZSAoIWxhc3QpIHtcbiAgICAgICAgdmFyIF9jb2RlUG9pbnRzO1xuXG4gICAgICAgIHZhciBjb21wb25lbnRHbHlwaCA9IHRoaXMubGlnYXR1cmVTdGFjay5wb3AoKTtcblxuICAgICAgICAoX2NvZGVQb2ludHMgPSBjb2RlUG9pbnRzKS51bnNoaWZ0LmFwcGx5KF9jb2RlUG9pbnRzLCB0aGlzLmdseXBoc1tjb21wb25lbnRHbHlwaF0uY29kZVBvaW50cyk7XG5cbiAgICAgICAgdmFyIGFjdGlvbiA9IGFjdGlvbnMuZ2V0SXRlbShhY3Rpb25JbmRleCsrKTtcbiAgICAgICAgbGFzdCA9ICEhKGFjdGlvbiAmIExBU1RfTUFTSyk7XG4gICAgICAgIHZhciBzdG9yZSA9ICEhKGFjdGlvbiAmIFNUT1JFX01BU0spO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gKGFjdGlvbiAmIE9GRlNFVF9NQVNLKSA8PCAyID4+IDI7IC8vIHNpZ24gZXh0ZW5kIDMwIHRvIDMyIGJpdHNcblxuICAgICAgICBvZmZzZXQgKz0gdGhpcy5nbHlwaHNbY29tcG9uZW50R2x5cGhdLmlkO1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50cy5nZXRJdGVtKG9mZnNldCk7XG4gICAgICAgIGxpZ2F0dXJlSW5kZXggKz0gY29tcG9uZW50O1xuXG4gICAgICAgIGlmIChsYXN0IHx8IHN0b3JlKSB7XG4gICAgICAgICAgdmFyIGxpZ2F0dXJlRW50cnkgPSBsaWdhdHVyZUxpc3QuZ2V0SXRlbShsaWdhdHVyZUluZGV4KTtcbiAgICAgICAgICB0aGlzLmdseXBoc1tjb21wb25lbnRHbHlwaF0gPSB0aGlzLmZvbnQuZ2V0R2x5cGgobGlnYXR1cmVFbnRyeSwgY29kZVBvaW50cyk7XG4gICAgICAgICAgbGlnYXR1cmVHbHlwaHMucHVzaChjb21wb25lbnRHbHlwaCk7XG4gICAgICAgICAgbGlnYXR1cmVJbmRleCA9IDA7XG4gICAgICAgICAgY29kZVBvaW50cyA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZ2x5cGhzW2NvbXBvbmVudEdseXBoXSA9IHRoaXMuZm9udC5nZXRHbHlwaCgweGZmZmYpO1xuICAgICAgICB9XG4gICAgICB9IC8vIFB1dCBsaWdhdHVyZSBnbHlwaCBpbmRleGVzIGJhY2sgb24gdGhlIHN0YWNrXG5cblxuICAgICAgKF90aGlzJGxpZ2F0dXJlU3RhY2sgPSB0aGlzLmxpZ2F0dXJlU3RhY2spLnB1c2guYXBwbHkoX3RoaXMkbGlnYXR1cmVTdGFjaywgbGlnYXR1cmVHbHlwaHMpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucHJvY2Vzc05vbmNvbnRleHR1YWxTdWJzdGl0dXRpb25zID0gZnVuY3Rpb24gcHJvY2Vzc05vbmNvbnRleHR1YWxTdWJzdGl0dXRpb25zKHN1YnRhYmxlLCBnbHlwaHMsIGluZGV4KSB7XG4gICAgdmFyIGxvb2t1cFRhYmxlID0gbmV3IEFBVExvb2t1cFRhYmxlKHN1YnRhYmxlLnRhYmxlLmxvb2t1cFRhYmxlKTtcblxuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGdseXBocy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpbmRleF07XG5cbiAgICAgIGlmIChnbHlwaC5pZCAhPT0gMHhmZmZmKSB7XG4gICAgICAgIHZhciBnaWQgPSBsb29rdXBUYWJsZS5sb29rdXAoZ2x5cGguaWQpO1xuXG4gICAgICAgIGlmIChnaWQpIHtcbiAgICAgICAgICAvLyAwIG1lYW5zIGRvIG5vdGhpbmdcbiAgICAgICAgICBnbHlwaHNbaW5kZXhdID0gdGhpcy5mb250LmdldEdseXBoKGdpZCwgZ2x5cGguY29kZVBvaW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLl9pbnNlcnRHbHlwaHMgPSBmdW5jdGlvbiBfaW5zZXJ0R2x5cGhzKGdseXBoSW5kZXgsIGluc2VydGlvbkFjdGlvbkluZGV4LCBjb3VudCwgaXNCZWZvcmUpIHtcbiAgICB2YXIgX3RoaXMkZ2x5cGhzO1xuXG4gICAgdmFyIGluc2VydGlvbnMgPSBbXTtcblxuICAgIHdoaWxlIChjb3VudC0tKSB7XG4gICAgICB2YXIgZ2lkID0gdGhpcy5zdWJ0YWJsZS50YWJsZS5pbnNlcnRpb25BY3Rpb25zLmdldEl0ZW0oaW5zZXJ0aW9uQWN0aW9uSW5kZXgrKyk7XG4gICAgICBpbnNlcnRpb25zLnB1c2godGhpcy5mb250LmdldEdseXBoKGdpZCkpO1xuICAgIH1cblxuICAgIGlmICghaXNCZWZvcmUpIHtcbiAgICAgIGdseXBoSW5kZXgrKztcbiAgICB9XG5cbiAgICAoX3RoaXMkZ2x5cGhzID0gdGhpcy5nbHlwaHMpLnNwbGljZS5hcHBseShfdGhpcyRnbHlwaHMsIFtnbHlwaEluZGV4LCAwXS5jb25jYXQoaW5zZXJ0aW9ucykpO1xuICB9O1xuXG4gIF9wcm90by5wcm9jZXNzR2x5cGhJbnNlcnRpb24gPSBmdW5jdGlvbiBwcm9jZXNzR2x5cGhJbnNlcnRpb24oZ2x5cGgsIGVudHJ5LCBpbmRleCkge1xuICAgIGlmIChlbnRyeS5mbGFncyAmIFNFVF9NQVJLKSB7XG4gICAgICB0aGlzLm1hcmtlZEluZGV4ID0gaW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5Lm1hcmtlZEluc2VydEluZGV4ICE9PSAweGZmZmYpIHtcbiAgICAgIHZhciBjb3VudCA9IChlbnRyeS5mbGFncyAmIE1BUktFRF9JTlNFUlRfQ09VTlQpID4+PiA1O1xuICAgICAgdmFyIGlzQmVmb3JlID0gISEoZW50cnkuZmxhZ3MgJiBNQVJLRURfSU5TRVJUX0JFRk9SRSk7XG5cbiAgICAgIHRoaXMuX2luc2VydEdseXBocyh0aGlzLm1hcmtlZEluZGV4LCBlbnRyeS5tYXJrZWRJbnNlcnRJbmRleCwgY291bnQsIGlzQmVmb3JlKTtcbiAgICB9XG5cbiAgICBpZiAoZW50cnkuY3VycmVudEluc2VydEluZGV4ICE9PSAweGZmZmYpIHtcbiAgICAgIHZhciBfY291bnQgPSAoZW50cnkuZmxhZ3MgJiBDVVJSRU5UX0lOU0VSVF9DT1VOVCkgPj4+IDU7XG5cbiAgICAgIHZhciBfaXNCZWZvcmUgPSAhIShlbnRyeS5mbGFncyAmIENVUlJFTlRfSU5TRVJUX0JFRk9SRSk7XG5cbiAgICAgIHRoaXMuX2luc2VydEdseXBocyhpbmRleCwgZW50cnkuY3VycmVudEluc2VydEluZGV4LCBfY291bnQsIF9pc0JlZm9yZSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5nZXRTdXBwb3J0ZWRGZWF0dXJlcyA9IGZ1bmN0aW9uIGdldFN1cHBvcnRlZEZlYXR1cmVzKCkge1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYSh0aGlzLm1vcnguY2hhaW5zKSwgX3N0ZXA0OyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQoKSkuZG9uZTspIHtcbiAgICAgIHZhciBjaGFpbiA9IF9zdGVwNC52YWx1ZTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYShjaGFpbi5mZWF0dXJlcyksIF9zdGVwNTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1KCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gX3N0ZXA1LnZhbHVlO1xuICAgICAgICBmZWF0dXJlcy5wdXNoKFtmZWF0dXJlLmZlYXR1cmVUeXBlLCBmZWF0dXJlLmZlYXR1cmVTZXR0aW5nXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZlYXR1cmVzO1xuICB9O1xuXG4gIF9wcm90by5nZW5lcmF0ZUlucHV0cyA9IGZ1bmN0aW9uIGdlbmVyYXRlSW5wdXRzKGdpZCkge1xuICAgIGlmICghdGhpcy5pbnB1dENhY2hlKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlSW5wdXRDYWNoZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlucHV0Q2FjaGVbZ2lkXSB8fCBbXTtcbiAgfTtcblxuICBfcHJvdG8uZ2VuZXJhdGVJbnB1dENhY2hlID0gZnVuY3Rpb24gZ2VuZXJhdGVJbnB1dENhY2hlKCkge1xuICAgIHRoaXMuaW5wdXRDYWNoZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yNiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYSh0aGlzLm1vcnguY2hhaW5zKSwgX3N0ZXA2OyAhKF9zdGVwNiA9IF9pdGVyYXRvcjYoKSkuZG9uZTspIHtcbiAgICAgIHZhciBjaGFpbiA9IF9zdGVwNi52YWx1ZTtcbiAgICAgIHZhciBmbGFncyA9IGNoYWluLmRlZmF1bHRGbGFncztcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYShjaGFpbi5zdWJ0YWJsZXMpLCBfc3RlcDc7ICEoX3N0ZXA3ID0gX2l0ZXJhdG9yNygpKS5kb25lOykge1xuICAgICAgICB2YXIgc3VidGFibGUgPSBfc3RlcDcudmFsdWU7XG5cbiAgICAgICAgaWYgKHN1YnRhYmxlLnN1YkZlYXR1cmVGbGFncyAmIGZsYWdzKSB7XG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUlucHV0c0ZvclN1YnRhYmxlKHN1YnRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZ2VuZXJhdGVJbnB1dHNGb3JTdWJ0YWJsZSA9IGZ1bmN0aW9uIGdlbmVyYXRlSW5wdXRzRm9yU3VidGFibGUoc3VidGFibGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy8gQ3VycmVudGx5LCBvbmx5IHN1cHBvcnRpbmcgbGlnYXR1cmUgc3VidGFibGVzLlxuICAgIGlmIChzdWJ0YWJsZS50eXBlICE9PSAyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJldmVyc2UgPSAhIShzdWJ0YWJsZS5jb3ZlcmFnZSAmIFJFVkVSU0VfRElSRUNUSU9OKTtcblxuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JldmVyc2Ugc3VidGFibGUsIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5zdWJ0YWJsZSA9IHN1YnRhYmxlO1xuICAgIHRoaXMubGlnYXR1cmVTdGFjayA9IFtdO1xuICAgIHZhciBzdGF0ZU1hY2hpbmUgPSB0aGlzLmdldFN0YXRlTWFjaGluZShzdWJ0YWJsZSk7XG4gICAgdmFyIHByb2Nlc3MgPSB0aGlzLmdldFByb2Nlc3NvcigpO1xuICAgIHZhciBpbnB1dCA9IFtdO1xuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHRoaXMuZ2x5cGhzID0gW107XG4gICAgc3RhdGVNYWNoaW5lLnRyYXZlcnNlKHtcbiAgICAgIGVudGVyOiBmdW5jdGlvbiBlbnRlcihnbHlwaCwgZW50cnkpIHtcbiAgICAgICAgdmFyIGdseXBocyA9IF90aGlzLmdseXBocztcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgZ2x5cGhzOiBnbHlwaHMuc2xpY2UoKSxcbiAgICAgICAgICBsaWdhdHVyZVN0YWNrOiBfdGhpcy5saWdhdHVyZVN0YWNrLnNsaWNlKClcbiAgICAgICAgfSk7IC8vIEFkZCBnbHlwaCB0byBpbnB1dCBhbmQgZ2x5cGhzIHRvIHByb2Nlc3MuXG5cbiAgICAgICAgdmFyIGcgPSBfdGhpcy5mb250LmdldEdseXBoKGdseXBoKTtcblxuICAgICAgICBpbnB1dC5wdXNoKGcpO1xuICAgICAgICBnbHlwaHMucHVzaChpbnB1dFtpbnB1dC5sZW5ndGggLSAxXSk7IC8vIFByb2Nlc3MgbGlnYXR1cmUgc3Vic3RpdHV0aW9uXG5cbiAgICAgICAgcHJvY2VzcyhnbHlwaHNbZ2x5cGhzLmxlbmd0aCAtIDFdLCBlbnRyeSwgZ2x5cGhzLmxlbmd0aCAtIDEpOyAvLyBBZGQgaW5wdXQgdG8gcmVzdWx0IGlmIG9ubHkgb25lIG1hdGNoaW5nIChub24tZGVsZXRlZCkgZ2x5cGggcmVtYWlucy5cblxuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICB2YXIgZm91bmQgPSAwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aCAmJiBjb3VudCA8PSAxOyBpKyspIHtcbiAgICAgICAgICBpZiAoZ2x5cGhzW2ldLmlkICE9PSAweGZmZmYpIHtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICBmb3VuZCA9IGdseXBoc1tpXS5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gaW5wdXQubWFwKGZ1bmN0aW9uIChnKSB7XG4gICAgICAgICAgICByZXR1cm4gZy5pZDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgX2NhY2hlID0gX3RoaXMuaW5wdXRDYWNoZVtmb3VuZF07XG5cbiAgICAgICAgICBpZiAoX2NhY2hlKSB7XG4gICAgICAgICAgICBfY2FjaGUucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5pbnB1dENhY2hlW2ZvdW5kXSA9IFtyZXN1bHRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGV4aXQ6IGZ1bmN0aW9uIGV4aXQoKSB7XG4gICAgICAgIHZhciBfc3RhY2skcG9wID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgX3RoaXMuZ2x5cGhzID0gX3N0YWNrJHBvcC5nbHlwaHM7XG4gICAgICAgIF90aGlzLmxpZ2F0dXJlU3RhY2sgPSBfc3RhY2skcG9wLmxpZ2F0dXJlU3RhY2s7XG4gICAgICAgIGlucHV0LnBvcCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBBQVRNb3J4UHJvY2Vzc29yO1xufSgpLCAoX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQyKF9jbGFzcyQyLnByb3RvdHlwZSwgXCJnZXRTdGF0ZU1hY2hpbmVcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkMi5wcm90b3R5cGUsIFwiZ2V0U3RhdGVNYWNoaW5lXCIpLCBfY2xhc3MkMi5wcm90b3R5cGUpKSwgX2NsYXNzJDIpO1xuLy8gcmV2ZXJzZSB0aGUgZ2x5cGhzIGluc2lkZSB0aG9zZSByYW5nZXMgaWYgc3BlY2lmaWVkXG4vLyByYW5nZXMgYXJlIGluIFtvZmZzZXQsIGxlbmd0aF0gZm9ybWF0XG5cbmZ1bmN0aW9uIHN3YXAoZ2x5cGhzLCByYW5nZUEsIHJhbmdlQiwgcmV2ZXJzZUEsIHJldmVyc2VCKSB7XG4gIGlmIChyZXZlcnNlQSA9PT0gdm9pZCAwKSB7XG4gICAgcmV2ZXJzZUEgPSBmYWxzZTtcbiAgfVxuXG4gIGlmIChyZXZlcnNlQiA9PT0gdm9pZCAwKSB7XG4gICAgcmV2ZXJzZUIgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBlbmQgPSBnbHlwaHMuc3BsaWNlKHJhbmdlQlswXSAtIChyYW5nZUJbMV0gLSAxKSwgcmFuZ2VCWzFdKTtcblxuICBpZiAocmV2ZXJzZUIpIHtcbiAgICBlbmQucmV2ZXJzZSgpO1xuICB9XG5cbiAgdmFyIHN0YXJ0ID0gZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtyYW5nZUFbMF0sIHJhbmdlQVsxXV0uY29uY2F0KGVuZCkpO1xuXG4gIGlmIChyZXZlcnNlQSkge1xuICAgIHN0YXJ0LnJldmVyc2UoKTtcbiAgfVxuXG4gIGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbcmFuZ2VCWzBdIC0gKHJhbmdlQVsxXSAtIDEpLCAwXS5jb25jYXQoc3RhcnQpKTtcbiAgcmV0dXJuIGdseXBocztcbn1cblxuZnVuY3Rpb24gcmVvcmRlckdseXBocyhnbHlwaHMsIHZlcmIsIGZpcnN0R2x5cGgsIGxhc3RHbHlwaCkge1xuXG4gIHN3aXRjaCAodmVyYikge1xuICAgIGNhc2UgMDpcbiAgICAgIC8vIG5vIGNoYW5nZVxuICAgICAgcmV0dXJuIGdseXBocztcblxuICAgIGNhc2UgMTpcbiAgICAgIC8vIEF4ID0+IHhBXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAxXSwgW2xhc3RHbHlwaCwgMF0pO1xuXG4gICAgY2FzZSAyOlxuICAgICAgLy8geEQgPT4gRHhcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDBdLCBbbGFzdEdseXBoLCAxXSk7XG5cbiAgICBjYXNlIDM6XG4gICAgICAvLyBBeEQgPT4gRHhBXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAxXSwgW2xhc3RHbHlwaCwgMV0pO1xuXG4gICAgY2FzZSA0OlxuICAgICAgLy8gQUJ4ID0+IHhBQlxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMl0sIFtsYXN0R2x5cGgsIDBdKTtcblxuICAgIGNhc2UgNTpcbiAgICAgIC8vIEFCeCA9PiB4QkFcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDJdLCBbbGFzdEdseXBoLCAwXSwgdHJ1ZSwgZmFsc2UpO1xuXG4gICAgY2FzZSA2OlxuICAgICAgLy8geENEID0+IENEeFxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMF0sIFtsYXN0R2x5cGgsIDJdKTtcblxuICAgIGNhc2UgNzpcbiAgICAgIC8vIHhDRCA9PiBEQ3hcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDBdLCBbbGFzdEdseXBoLCAyXSwgZmFsc2UsIHRydWUpO1xuXG4gICAgY2FzZSA4OlxuICAgICAgLy8gQXhDRCA9PiBDRHhBXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAxXSwgW2xhc3RHbHlwaCwgMl0pO1xuXG4gICAgY2FzZSA5OlxuICAgICAgLy8gQXhDRCA9PiBEQ3hBXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAxXSwgW2xhc3RHbHlwaCwgMl0sIGZhbHNlLCB0cnVlKTtcblxuICAgIGNhc2UgMTA6XG4gICAgICAvLyBBQnhEID0+IER4QUJcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDJdLCBbbGFzdEdseXBoLCAxXSk7XG5cbiAgICBjYXNlIDExOlxuICAgICAgLy8gQUJ4RCA9PiBEeEJBXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAyXSwgW2xhc3RHbHlwaCwgMV0sIHRydWUsIGZhbHNlKTtcblxuICAgIGNhc2UgMTI6XG4gICAgICAvLyBBQnhDRCA9PiBDRHhBQlxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMl0sIFtsYXN0R2x5cGgsIDJdKTtcblxuICAgIGNhc2UgMTM6XG4gICAgICAvLyBBQnhDRCA9PiBDRHhCQVxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMl0sIFtsYXN0R2x5cGgsIDJdLCB0cnVlLCBmYWxzZSk7XG5cbiAgICBjYXNlIDE0OlxuICAgICAgLy8gQUJ4Q0QgPT4gREN4QUJcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDJdLCBbbGFzdEdseXBoLCAyXSwgZmFsc2UsIHRydWUpO1xuXG4gICAgY2FzZSAxNTpcbiAgICAgIC8vIEFCeENEID0+IERDeEJBXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAyXSwgW2xhc3RHbHlwaCwgMl0sIHRydWUsIHRydWUpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdmVyYjogXCIgKyB2ZXJiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGIobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGIobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGIobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRiKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkYihvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGIoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBBQVRMYXlvdXRFbmdpbmUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBQVRMYXlvdXRFbmdpbmUoZm9udCkge1xuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgdGhpcy5tb3J4UHJvY2Vzc29yID0gbmV3IEFBVE1vcnhQcm9jZXNzb3IoZm9udCk7XG4gICAgdGhpcy5mYWxsYmFja1Bvc2l0aW9uID0gZmFsc2U7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQUFUTGF5b3V0RW5naW5lLnByb3RvdHlwZTtcblxuICBfcHJvdG8uc3Vic3RpdHV0ZSA9IGZ1bmN0aW9uIHN1YnN0aXR1dGUoZ2x5cGhSdW4pIHtcbiAgICAvLyBBQVQgZXhwZWN0cyB0aGUgZ2x5cGhzIHRvIGJlIGluIHZpc3VhbCBvcmRlciBwcmlvciB0byBtb3J4IHByb2Nlc3NpbmcsXG4gICAgLy8gc28gcmV2ZXJzZSB0aGUgZ2x5cGhzIGlmIHRoZSBzY3JpcHQgaXMgcmlnaHQtdG8tbGVmdC5cbiAgICBpZiAoZ2x5cGhSdW4uZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgICAgZ2x5cGhSdW4uZ2x5cGhzLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLm1vcnhQcm9jZXNzb3IucHJvY2VzcyhnbHlwaFJ1bi5nbHlwaHMsIG1hcE9UVG9BQVQoZ2x5cGhSdW4uZmVhdHVyZXMpKTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0QXZhaWxhYmxlRmVhdHVyZXMgPSBmdW5jdGlvbiBnZXRBdmFpbGFibGVGZWF0dXJlcyhzY3JpcHQsIGxhbmd1YWdlKSB7XG4gICAgcmV0dXJuIG1hcEFBVFRvT1QodGhpcy5tb3J4UHJvY2Vzc29yLmdldFN1cHBvcnRlZEZlYXR1cmVzKCkpO1xuICB9O1xuXG4gIF9wcm90by5zdHJpbmdzRm9yR2x5cGggPSBmdW5jdGlvbiBzdHJpbmdzRm9yR2x5cGgoZ2lkKSB7XG4gICAgdmFyIGdseXBoU3RyaW5ncyA9IHRoaXMubW9yeFByb2Nlc3Nvci5nZW5lcmF0ZUlucHV0cyhnaWQpO1xuICAgIHZhciByZXN1bHQgPSBuZXcgU2V0KCk7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGIoZ2x5cGhTdHJpbmdzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBnbHlwaHMgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgdGhpcy5fYWRkU3RyaW5ncyhnbHlwaHMsIDAsIHJlc3VsdCwgJycpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgX3Byb3RvLl9hZGRTdHJpbmdzID0gZnVuY3Rpb24gX2FkZFN0cmluZ3MoZ2x5cGhzLCBpbmRleCwgc3RyaW5ncywgc3RyaW5nKSB7XG4gICAgdmFyIGNvZGVQb2ludHMgPSB0aGlzLmZvbnQuX2NtYXBQcm9jZXNzb3IuY29kZVBvaW50c0ZvckdseXBoKGdseXBoc1tpbmRleF0pO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYihjb2RlUG9pbnRzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgIHZhciBjb2RlUG9pbnQgPSBfc3RlcDIudmFsdWU7XG4gICAgICB2YXIgcyA9IHN0cmluZyArIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCk7XG5cbiAgICAgIGlmIChpbmRleCA8IGdseXBocy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRoaXMuX2FkZFN0cmluZ3MoZ2x5cGhzLCBpbmRleCArIDEsIHN0cmluZ3MsIHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyaW5ncy5hZGQocyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBBQVRMYXlvdXRFbmdpbmU7XG59KCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYyhvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkYyhvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkYyhvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGMobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRjKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkYyhhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cbi8qKlxuICogU2hhcGluZ1BsYW5zIGFyZSB1c2VkIGJ5IHRoZSBPcGVuVHlwZSBzaGFwZXJzIHRvIHN0b3JlIHdoaWNoXG4gKiBmZWF0dXJlcyBzaG91bGQgYnkgYXBwbGllZCwgYW5kIGluIHdoYXQgb3JkZXIgdG8gYXBwbHkgdGhlbS5cbiAqIFRoZSBmZWF0dXJlcyBhcmUgYXBwbGllZCBpbiBncm91cHMgY2FsbGVkIHN0YWdlcy4gQSBmZWF0dXJlXG4gKiBjYW4gYmUgYXBwbGllZCBnbG9iYWxseSB0byBhbGwgZ2x5cGhzLCBvciBsb2NhbGx5IHRvIG9ubHlcbiAqIHNwZWNpZmljIGdseXBocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBTaGFwaW5nUGxhbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNoYXBpbmdQbGFuKGZvbnQsIHNjcmlwdCwgZGlyZWN0aW9uKSB7XG4gICAgdGhpcy5mb250ID0gZm9udDtcbiAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdDtcbiAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICB0aGlzLnN0YWdlcyA9IFtdO1xuICAgIHRoaXMuZ2xvYmFsRmVhdHVyZXMgPSB7fTtcbiAgICB0aGlzLmFsbEZlYXR1cmVzID0ge307XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGdpdmVuIGZlYXR1cmVzIHRvIHRoZSBsYXN0IHN0YWdlLlxuICAgKiBJZ25vcmVzIGZlYXR1cmVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZC5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gU2hhcGluZ1BsYW4ucHJvdG90eXBlO1xuXG4gIF9wcm90by5fYWRkRmVhdHVyZXMgPSBmdW5jdGlvbiBfYWRkRmVhdHVyZXMoZmVhdHVyZXMsIGdsb2JhbCkge1xuICAgIHZhciBzdGFnZUluZGV4ID0gdGhpcy5zdGFnZXMubGVuZ3RoIC0gMTtcbiAgICB2YXIgc3RhZ2UgPSB0aGlzLnN0YWdlc1tzdGFnZUluZGV4XTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYyhmZWF0dXJlcyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgZmVhdHVyZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICBpZiAodGhpcy5hbGxGZWF0dXJlc1tmZWF0dXJlXSA9PSBudWxsKSB7XG4gICAgICAgIHN0YWdlLnB1c2goZmVhdHVyZSk7XG4gICAgICAgIHRoaXMuYWxsRmVhdHVyZXNbZmVhdHVyZV0gPSBzdGFnZUluZGV4O1xuXG4gICAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgICB0aGlzLmdsb2JhbEZlYXR1cmVzW2ZlYXR1cmVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogQWRkIGZlYXR1cmVzIHRvIHRoZSBsYXN0IHN0YWdlXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmFkZCA9IGZ1bmN0aW9uIGFkZChhcmcsIGdsb2JhbCkge1xuICAgIGlmIChnbG9iYWwgPT09IHZvaWQgMCkge1xuICAgICAgZ2xvYmFsID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnN0YWdlcy5wdXNoKFtdKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGFyZyA9IFthcmddO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgIHRoaXMuX2FkZEZlYXR1cmVzKGFyZywgZ2xvYmFsKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLl9hZGRGZWF0dXJlcyhhcmcuZ2xvYmFsIHx8IFtdLCB0cnVlKTtcblxuICAgICAgdGhpcy5fYWRkRmVhdHVyZXMoYXJnLmxvY2FsIHx8IFtdLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGFyZ3VtZW50IHRvIFNoYXBpbmdQbGFuI2FkZFwiKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBzdGFnZVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5hZGRTdGFnZSA9IGZ1bmN0aW9uIGFkZFN0YWdlKGFyZywgZ2xvYmFsKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuc3RhZ2VzLnB1c2goYXJnLCBbXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhZ2VzLnB1c2goW10pO1xuICAgICAgdGhpcy5hZGQoYXJnLCBnbG9iYWwpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc2V0RmVhdHVyZU92ZXJyaWRlcyA9IGZ1bmN0aW9uIHNldEZlYXR1cmVPdmVycmlkZXMoZmVhdHVyZXMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmZWF0dXJlcykpIHtcbiAgICAgIHRoaXMuYWRkKGZlYXR1cmVzKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmZWF0dXJlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAodmFyIHRhZyBpbiBmZWF0dXJlcykge1xuICAgICAgICBpZiAoZmVhdHVyZXNbdGFnXSkge1xuICAgICAgICAgIHRoaXMuYWRkKHRhZyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hbGxGZWF0dXJlc1t0YWddICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgc3RhZ2UgPSB0aGlzLnN0YWdlc1t0aGlzLmFsbEZlYXR1cmVzW3RhZ11dO1xuICAgICAgICAgIHN0YWdlLnNwbGljZShzdGFnZS5pbmRleE9mKHRhZyksIDEpO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmFsbEZlYXR1cmVzW3RhZ107XG4gICAgICAgICAgZGVsZXRlIHRoaXMuZ2xvYmFsRmVhdHVyZXNbdGFnXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogQXNzaWducyB0aGUgZ2xvYmFsIGZlYXR1cmVzIHRvIHRoZSBnaXZlbiBnbHlwaHNcbiAgICovXG4gIDtcblxuICBfcHJvdG8uYXNzaWduR2xvYmFsRmVhdHVyZXMgPSBmdW5jdGlvbiBhc3NpZ25HbG9iYWxGZWF0dXJlcyhnbHlwaHMpIHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRjKGdseXBocyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgZ2x5cGggPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgIGZvciAodmFyIGZlYXR1cmUgaW4gdGhpcy5nbG9iYWxGZWF0dXJlcykge1xuICAgICAgICBnbHlwaC5mZWF0dXJlc1tmZWF0dXJlXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgcGxhbm5lZCBzdGFnZXMgdXNpbmcgdGhlIGdpdmVuIE9UUHJvY2Vzc29yXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnByb2Nlc3MgPSBmdW5jdGlvbiBwcm9jZXNzKHByb2Nlc3NvciwgZ2x5cGhzLCBwb3NpdGlvbnMpIHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRjKHRoaXMuc3RhZ2VzKSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICAgIHZhciBzdGFnZSA9IF9zdGVwMy52YWx1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBzdGFnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoIXBvc2l0aW9ucykge1xuICAgICAgICAgIHN0YWdlKHRoaXMuZm9udCwgZ2x5cGhzLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByb2Nlc3Nvci5hcHBseUZlYXR1cmVzKHN0YWdlLCBnbHlwaHMsIHBvc2l0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTaGFwaW5nUGxhbjtcbn0oKTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbnZhciBWQVJJQVRJT05fRkVBVFVSRVMgPSBbJ3J2cm4nXTtcbnZhciBDT01NT05fRkVBVFVSRVMgPSBbJ2NjbXAnLCAnbG9jbCcsICdybGlnJywgJ21hcmsnLCAnbWttayddO1xudmFyIEZSQUNUSU9OQUxfRkVBVFVSRVMgPSBbJ2ZyYWMnLCAnbnVtcicsICdkbm9tJ107XG52YXIgSE9SSVpPTlRBTF9GRUFUVVJFUyA9IFsnY2FsdCcsICdjbGlnJywgJ2xpZ2EnLCAncmNsdCcsICdjdXJzJywgJ2tlcm4nXTtcbnZhciBESVJFQ1RJT05BTF9GRUFUVVJFUyA9IHtcbiAgbHRyOiBbJ2x0cmEnLCAnbHRybSddLFxuICBydGw6IFsncnRsYScsICdydGxtJ11cbn07XG5cbnZhciBEZWZhdWx0U2hhcGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRGVmYXVsdFNoYXBlcigpIHt9XG5cbiAgRGVmYXVsdFNoYXBlci5wbGFuID0gZnVuY3Rpb24gcGxhbihfcGxhbiwgZ2x5cGhzLCBmZWF0dXJlcykge1xuICAgIC8vIFBsYW4gdGhlIGZlYXR1cmVzIHdlIHdhbnQgdG8gYXBwbHlcbiAgICB0aGlzLnBsYW5QcmVwcm9jZXNzaW5nKF9wbGFuKTtcbiAgICB0aGlzLnBsYW5GZWF0dXJlcyhfcGxhbik7XG4gICAgdGhpcy5wbGFuUG9zdHByb2Nlc3NpbmcoX3BsYW4sIGZlYXR1cmVzKTsgLy8gQXNzaWduIHRoZSBnbG9iYWwgZmVhdHVyZXMgdG8gYWxsIHRoZSBnbHlwaHNcblxuICAgIF9wbGFuLmFzc2lnbkdsb2JhbEZlYXR1cmVzKGdseXBocyk7IC8vIEFzc2lnbiBsb2NhbCBmZWF0dXJlcyB0byBnbHlwaHNcblxuXG4gICAgdGhpcy5hc3NpZ25GZWF0dXJlcyhfcGxhbiwgZ2x5cGhzKTtcbiAgfTtcblxuICBEZWZhdWx0U2hhcGVyLnBsYW5QcmVwcm9jZXNzaW5nID0gZnVuY3Rpb24gcGxhblByZXByb2Nlc3NpbmcocGxhbikge1xuICAgIHBsYW4uYWRkKHtcbiAgICAgIGdsb2JhbDogW10uY29uY2F0KFZBUklBVElPTl9GRUFUVVJFUywgRElSRUNUSU9OQUxfRkVBVFVSRVNbcGxhbi5kaXJlY3Rpb25dKSxcbiAgICAgIGxvY2FsOiBGUkFDVElPTkFMX0ZFQVRVUkVTXG4gICAgfSk7XG4gIH07XG5cbiAgRGVmYXVsdFNoYXBlci5wbGFuRmVhdHVyZXMgPSBmdW5jdGlvbiBwbGFuRmVhdHVyZXMocGxhbikgey8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC4gTGV0IHN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcy5cbiAgfTtcblxuICBEZWZhdWx0U2hhcGVyLnBsYW5Qb3N0cHJvY2Vzc2luZyA9IGZ1bmN0aW9uIHBsYW5Qb3N0cHJvY2Vzc2luZyhwbGFuLCB1c2VyRmVhdHVyZXMpIHtcbiAgICBwbGFuLmFkZChbXS5jb25jYXQoQ09NTU9OX0ZFQVRVUkVTLCBIT1JJWk9OVEFMX0ZFQVRVUkVTKSk7XG4gICAgcGxhbi5zZXRGZWF0dXJlT3ZlcnJpZGVzKHVzZXJGZWF0dXJlcyk7XG4gIH07XG5cbiAgRGVmYXVsdFNoYXBlci5hc3NpZ25GZWF0dXJlcyA9IGZ1bmN0aW9uIGFzc2lnbkZlYXR1cmVzKHBsYW4sIGdseXBocykge1xuICAgIC8vIEVuYWJsZSBjb250ZXh0dWFsIGZyYWN0aW9uc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG5cbiAgICAgIGlmIChnbHlwaC5jb2RlUG9pbnRzWzBdID09PSAweDIwNDQpIHtcbiAgICAgICAgLy8gZnJhY3Rpb24gc2xhc2hcbiAgICAgICAgdmFyIHN0YXJ0ID0gaTtcbiAgICAgICAgdmFyIGVuZCA9IGkgKyAxOyAvLyBBcHBseSBudW1lcmF0b3JcblxuICAgICAgICB3aGlsZSAoc3RhcnQgPiAwICYmIHVuaWNvZGUuaXNEaWdpdChnbHlwaHNbc3RhcnQgLSAxXS5jb2RlUG9pbnRzWzBdKSkge1xuICAgICAgICAgIGdseXBoc1tzdGFydCAtIDFdLmZlYXR1cmVzLm51bXIgPSB0cnVlO1xuICAgICAgICAgIGdseXBoc1tzdGFydCAtIDFdLmZlYXR1cmVzLmZyYWMgPSB0cnVlO1xuICAgICAgICAgIHN0YXJ0LS07XG4gICAgICAgIH0gLy8gQXBwbHkgZGVub21pbmF0b3JcblxuXG4gICAgICAgIHdoaWxlIChlbmQgPCBnbHlwaHMubGVuZ3RoICYmIHVuaWNvZGUuaXNEaWdpdChnbHlwaHNbZW5kXS5jb2RlUG9pbnRzWzBdKSkge1xuICAgICAgICAgIGdseXBoc1tlbmRdLmZlYXR1cmVzLmRub20gPSB0cnVlO1xuICAgICAgICAgIGdseXBoc1tlbmRdLmZlYXR1cmVzLmZyYWMgPSB0cnVlO1xuICAgICAgICAgIGVuZCsrO1xuICAgICAgICB9IC8vIEFwcGx5IGZyYWN0aW9uIHNsYXNoXG5cblxuICAgICAgICBnbHlwaC5mZWF0dXJlcy5mcmFjID0gdHJ1ZTtcbiAgICAgICAgaSA9IGVuZCAtIDE7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBEZWZhdWx0U2hhcGVyO1xufSgpO1xuXG5fZGVmaW5lUHJvcGVydHkoRGVmYXVsdFNoYXBlciwgXCJ6ZXJvTWFya1dpZHRoc1wiLCAnQUZURVJfR1BPUycpO1xuXG52YXIgYmFzZTY0RGVmbGF0ZWRUcmllJDEgPSBcImVKd0JEZ0x4L1FBQjhBQUFBQUFBQUFBNEFBSDlBUUwrN1pvdFRNUXdGTWU3N2I0NFFJSEE0SkJJQkFKNWx4QVNEQW1HaEhNb0JJcWdVT0JRSkFoT0lwRklESW9nU1VnSUVvbEVFZ3pKL1MvWGtwZW0zWFhYYm9QYmU4a3Y3YTNyNjN2dDY5dTZYRGNXWWh2c2duM1FsYi8vUzNrTVRzRVp1QUNYb0E5dXdDMjRBL2ZnQVR5UmZzL2dUZjRlOGc0K1pQMVRsbCtrblpsT2ZzQzFwSjRJTVE4V2t2THRLb29sK0xvcy9WMnBrTjhNd3pBTXd6QU13ekFNdzFTUDRmZWZWZjcrd1RBTXd6QU13ekM1Y2pVellqRW5Yc0ZjVzRnT09BZVA0THM5YWx1ZkZXSlRDTkZyQ2RGdmplcEY4TkxLYno3WGNJYlpNSnhqT3JpMmxlRjhzNE43OXp6UFF6MzBQN0RvT01UMW80cWN0OVQvQzA2bTFOOU9IUDNDd2xKbGlTelFkbE05bE5TazNrU2paaWgxVEgyeVF2djlKYUUyVVIvMXVYTHhMd1NUekcwUkpGcmR4UTlUWEtsMlFVcWJoTmdIZER3WG9UN1RhejdTQkhXRC9vWWtiZjFkWXlJaE92VitEVS83bFdTTnoxQnhQVzV1VE8zanhuV1ZzdmVkYit6WitvL0w5Vmxpajk1cmVyYlo3SW9NZWxUZTFYTkZhSmtraHFsdHBoalQ5WnJtVDVleTM0elZHaWpSYlF4bFg5bjd4UFR1MVpRVXVZOTk5M09hZjNucURxbkxOVWY0U0tnMWl5ZTAwNVpMSXExVTlVaU81ZkpPR0tmb040Mm54bksxTlVUT3BmYllmTkZ6cVo1VGZlMnd6V09JdUxPdFFkRW92NHFXdExoekplczZoSTVSWHdtWnYwelBDcHMwQTQ1cmt3R2FNUVh2XCI7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJDMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG52YXIgdHJpZURhdGEkMSA9IHBha28uaW5mbGF0ZShiYXNlNjRBcnJheWJ1ZmZlcl8yKGJhc2U2NERlZmxhdGVkVHJpZSQxKSk7XG52YXIgdHJpZSQxID0gbmV3IHVuaWNvZGVUcmllKHRyaWVEYXRhJDEpO1xudmFyIEZFQVRVUkVTID0gWydpc29sJywgJ2ZpbmEnLCAnZmluMicsICdmaW4zJywgJ21lZGknLCAnbWVkMicsICdpbml0J107XG52YXIgU2hhcGluZ0NsYXNzZXMgPSB7XG4gIE5vbl9Kb2luaW5nOiAwLFxuICBMZWZ0X0pvaW5pbmc6IDEsXG4gIFJpZ2h0X0pvaW5pbmc6IDIsXG4gIER1YWxfSm9pbmluZzogMyxcbiAgSm9pbl9DYXVzaW5nOiAzLFxuICBBTEFQSDogNCxcbiAgJ0RBTEFUSCBSSVNIJzogNSxcbiAgVHJhbnNwYXJlbnQ6IDZcbn07XG52YXIgSVNPTCA9ICdpc29sJztcbnZhciBGSU5BID0gJ2ZpbmEnO1xudmFyIEZJTjIgPSAnZmluMic7XG52YXIgRklOMyA9ICdmaW4zJztcbnZhciBNRURJID0gJ21lZGknO1xudmFyIE1FRDIgPSAnbWVkMic7XG52YXIgSU5JVCA9ICdpbml0JztcbnZhciBOT05FID0gbnVsbDsgLy8gRWFjaCBlbnRyeSBpcyBbcHJldkFjdGlvbiwgY3VyQWN0aW9uLCBuZXh0U3RhdGVdXG5cbnZhciBTVEFURV9UQUJMRSA9IFsvLyAgIE5vbl9Kb2luaW5nLCAgICAgICAgTGVmdF9Kb2luaW5nLCAgICAgICBSaWdodF9Kb2luaW5nLCAgICAgRHVhbF9Kb2luaW5nLCAgICAgICAgICAgQUxBUEgsICAgICAgICAgICAgREFMQVRIIFJJU0hcbi8vIFN0YXRlIDA6IHByZXYgd2FzIFUsICBub3Qgd2lsbGluZyB0byBqb2luLlxuW1tOT05FLCBOT05FLCAwXSwgW05PTkUsIElTT0wsIDJdLCBbTk9ORSwgSVNPTCwgMV0sIFtOT05FLCBJU09MLCAyXSwgW05PTkUsIElTT0wsIDFdLCBbTk9ORSwgSVNPTCwgNl1dLCAvLyBTdGF0ZSAxOiBwcmV2IHdhcyBSIG9yIElTT0wvQUxBUEgsICBub3Qgd2lsbGluZyB0byBqb2luLlxuW1tOT05FLCBOT05FLCAwXSwgW05PTkUsIElTT0wsIDJdLCBbTk9ORSwgSVNPTCwgMV0sIFtOT05FLCBJU09MLCAyXSwgW05PTkUsIEZJTjIsIDVdLCBbTk9ORSwgSVNPTCwgNl1dLCAvLyBTdGF0ZSAyOiBwcmV2IHdhcyBEL0wgaW4gSVNPTCBmb3JtLCAgd2lsbGluZyB0byBqb2luLlxuW1tOT05FLCBOT05FLCAwXSwgW05PTkUsIElTT0wsIDJdLCBbSU5JVCwgRklOQSwgMV0sIFtJTklULCBGSU5BLCAzXSwgW0lOSVQsIEZJTkEsIDRdLCBbSU5JVCwgRklOQSwgNl1dLCAvLyBTdGF0ZSAzOiBwcmV2IHdhcyBEIGluIEZJTkEgZm9ybSwgIHdpbGxpbmcgdG8gam9pbi5cbltbTk9ORSwgTk9ORSwgMF0sIFtOT05FLCBJU09MLCAyXSwgW01FREksIEZJTkEsIDFdLCBbTUVESSwgRklOQSwgM10sIFtNRURJLCBGSU5BLCA0XSwgW01FREksIEZJTkEsIDZdXSwgLy8gU3RhdGUgNDogcHJldiB3YXMgRklOQSBBTEFQSCwgIG5vdCB3aWxsaW5nIHRvIGpvaW4uXG5bW05PTkUsIE5PTkUsIDBdLCBbTk9ORSwgSVNPTCwgMl0sIFtNRUQyLCBJU09MLCAxXSwgW01FRDIsIElTT0wsIDJdLCBbTUVEMiwgRklOMiwgNV0sIFtNRUQyLCBJU09MLCA2XV0sIC8vIFN0YXRlIDU6IHByZXYgd2FzIEZJTjIvRklOMyBBTEFQSCwgIG5vdCB3aWxsaW5nIHRvIGpvaW4uXG5bW05PTkUsIE5PTkUsIDBdLCBbTk9ORSwgSVNPTCwgMl0sIFtJU09MLCBJU09MLCAxXSwgW0lTT0wsIElTT0wsIDJdLCBbSVNPTCwgRklOMiwgNV0sIFtJU09MLCBJU09MLCA2XV0sIC8vIFN0YXRlIDY6IHByZXYgd2FzIERBTEFUSC9SSVNILCAgbm90IHdpbGxpbmcgdG8gam9pbi5cbltbTk9ORSwgTk9ORSwgMF0sIFtOT05FLCBJU09MLCAyXSwgW05PTkUsIElTT0wsIDFdLCBbTk9ORSwgSVNPTCwgMl0sIFtOT05FLCBGSU4zLCA1XSwgW05PTkUsIElTT0wsIDZdXV07XG4vKipcbiAqIFRoaXMgaXMgYSBzaGFwZXIgZm9yIEFyYWJpYywgYW5kIG90aGVyIGN1cnNpdmUgc2NyaXB0cy5cbiAqIEl0IHVzZXMgZGF0YSBmcm9tIEFyYWJpY1NoYXBpbmcudHh0IGluIHRoZSBVbmljb2RlIGRhdGFiYXNlLFxuICogY29tcGlsZWQgdG8gYSBVbmljb2RlVHJpZSBieSBnZW5lcmF0ZS1kYXRhLmNvZmZlZS5cbiAqXG4gKiBUaGUgc2hhcGluZyBzdGF0ZSBtYWNoaW5lIHdhcyBwb3J0ZWQgZnJvbSBIYXJmYnV6ei5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9iZWhkYWQvaGFyZmJ1enovYmxvYi9tYXN0ZXIvc3JjL2hiLW90LXNoYXBlLWNvbXBsZXgtYXJhYmljLmNjXG4gKi9cblxudmFyIEFyYWJpY1NoYXBlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0RlZmF1bHRTaGFwZXIpIHtcbiAgX2luaGVyaXRzTG9vc2UkMyhBcmFiaWNTaGFwZXIsIF9EZWZhdWx0U2hhcGVyKTtcblxuICBmdW5jdGlvbiBBcmFiaWNTaGFwZXIoKSB7XG4gICAgcmV0dXJuIF9EZWZhdWx0U2hhcGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIEFyYWJpY1NoYXBlci5wbGFuRmVhdHVyZXMgPSBmdW5jdGlvbiBwbGFuRmVhdHVyZXMocGxhbikge1xuICAgIHBsYW4uYWRkKFsnY2NtcCcsICdsb2NsJ10pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBGRUFUVVJFUy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZlYXR1cmUgPSBGRUFUVVJFU1tpXTtcbiAgICAgIHBsYW4uYWRkU3RhZ2UoZmVhdHVyZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHBsYW4uYWRkU3RhZ2UoJ21zZXQnKTtcbiAgfTtcblxuICBBcmFiaWNTaGFwZXIuYXNzaWduRmVhdHVyZXMgPSBmdW5jdGlvbiBhc3NpZ25GZWF0dXJlcyhwbGFuLCBnbHlwaHMpIHtcbiAgICBfRGVmYXVsdFNoYXBlci5hc3NpZ25GZWF0dXJlcy5jYWxsKHRoaXMsIHBsYW4sIGdseXBocyk7XG5cbiAgICB2YXIgcHJldiA9IC0xO1xuICAgIHZhciBzdGF0ZSA9IDA7XG4gICAgdmFyIGFjdGlvbnMgPSBbXTsgLy8gQXBwbHkgdGhlIHN0YXRlIG1hY2hpbmUgdG8gbWFwIGdseXBocyB0byBmZWF0dXJlc1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjdXJBY3Rpb24gPSB2b2lkIDAsXG4gICAgICAgICAgcHJldkFjdGlvbiA9IHZvaWQgMDtcbiAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpXTtcbiAgICAgIHZhciB0eXBlID0gZ2V0U2hhcGluZ0NsYXNzKGdseXBoLmNvZGVQb2ludHNbMF0pO1xuXG4gICAgICBpZiAodHlwZSA9PT0gU2hhcGluZ0NsYXNzZXMuVHJhbnNwYXJlbnQpIHtcbiAgICAgICAgYWN0aW9uc1tpXSA9IE5PTkU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgX1NUQVRFX1RBQkxFJHN0YXRlJHR5ID0gU1RBVEVfVEFCTEVbc3RhdGVdW3R5cGVdO1xuICAgICAgcHJldkFjdGlvbiA9IF9TVEFURV9UQUJMRSRzdGF0ZSR0eVswXTtcbiAgICAgIGN1ckFjdGlvbiA9IF9TVEFURV9UQUJMRSRzdGF0ZSR0eVsxXTtcbiAgICAgIHN0YXRlID0gX1NUQVRFX1RBQkxFJHN0YXRlJHR5WzJdO1xuXG4gICAgICBpZiAocHJldkFjdGlvbiAhPT0gTk9ORSAmJiBwcmV2ICE9PSAtMSkge1xuICAgICAgICBhY3Rpb25zW3ByZXZdID0gcHJldkFjdGlvbjtcbiAgICAgIH1cblxuICAgICAgYWN0aW9uc1tpXSA9IGN1ckFjdGlvbjtcbiAgICAgIHByZXYgPSBpO1xuICAgIH0gLy8gQXBwbHkgdGhlIGNob3NlbiBmZWF0dXJlcyB0byB0aGVpciByZXNwZWN0aXZlIGdseXBoc1xuXG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgZ2x5cGhzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGZlYXR1cmUgPSB2b2lkIDA7XG4gICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaW5kZXhdO1xuXG4gICAgICBpZiAoZmVhdHVyZSA9IGFjdGlvbnNbaW5kZXhdKSB7XG4gICAgICAgIGdseXBoLmZlYXR1cmVzW2ZlYXR1cmVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEFyYWJpY1NoYXBlcjtcbn0oRGVmYXVsdFNoYXBlcik7XG5cbmZ1bmN0aW9uIGdldFNoYXBpbmdDbGFzcyhjb2RlUG9pbnQpIHtcbiAgdmFyIHJlcyA9IHRyaWUkMS5nZXQoY29kZVBvaW50KTtcblxuICBpZiAocmVzKSB7XG4gICAgcmV0dXJuIHJlcyAtIDE7XG4gIH1cblxuICB2YXIgY2F0ZWdvcnkgPSB1bmljb2RlLmdldENhdGVnb3J5KGNvZGVQb2ludCk7XG5cbiAgaWYgKGNhdGVnb3J5ID09PSAnTW4nIHx8IGNhdGVnb3J5ID09PSAnTWUnIHx8IGNhdGVnb3J5ID09PSAnQ2YnKSB7XG4gICAgcmV0dXJuIFNoYXBpbmdDbGFzc2VzLlRyYW5zcGFyZW50O1xuICB9XG5cbiAgcmV0dXJuIFNoYXBpbmdDbGFzc2VzLk5vbl9Kb2luaW5nO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDMoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxudmFyIEdseXBoSXRlcmF0b3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHbHlwaEl0ZXJhdG9yKGdseXBocywgb3B0aW9ucykge1xuICAgIHRoaXMuZ2x5cGhzID0gZ2x5cGhzO1xuICAgIHRoaXMucmVzZXQob3B0aW9ucyk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gR2x5cGhJdGVyYXRvci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQob3B0aW9ucywgaW5kZXgpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSB2b2lkIDApIHtcbiAgICAgIGluZGV4ID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuZmxhZ3MgPSBvcHRpb25zLmZsYWdzIHx8IHt9O1xuICAgIHRoaXMubWFya0F0dGFjaG1lbnRUeXBlID0gb3B0aW9ucy5tYXJrQXR0YWNobWVudFR5cGUgfHwgMDtcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gIH07XG5cbiAgX3Byb3RvLnNob3VsZElnbm9yZSA9IGZ1bmN0aW9uIHNob3VsZElnbm9yZShnbHlwaCkge1xuICAgIHJldHVybiB0aGlzLmZsYWdzLmlnbm9yZU1hcmtzICYmIGdseXBoLmlzTWFyayB8fCB0aGlzLmZsYWdzLmlnbm9yZUJhc2VHbHlwaHMgJiYgZ2x5cGguaXNCYXNlIHx8IHRoaXMuZmxhZ3MuaWdub3JlTGlnYXR1cmVzICYmIGdseXBoLmlzTGlnYXR1cmUgfHwgdGhpcy5tYXJrQXR0YWNobWVudFR5cGUgJiYgZ2x5cGguaXNNYXJrICYmIGdseXBoLm1hcmtBdHRhY2htZW50VHlwZSAhPT0gdGhpcy5tYXJrQXR0YWNobWVudFR5cGU7XG4gIH07XG5cbiAgX3Byb3RvLm1vdmUgPSBmdW5jdGlvbiBtb3ZlKGRpcikge1xuICAgIHRoaXMuaW5kZXggKz0gZGlyO1xuXG4gICAgd2hpbGUgKDAgPD0gdGhpcy5pbmRleCAmJiB0aGlzLmluZGV4IDwgdGhpcy5nbHlwaHMubGVuZ3RoICYmIHRoaXMuc2hvdWxkSWdub3JlKHRoaXMuZ2x5cGhzW3RoaXMuaW5kZXhdKSkge1xuICAgICAgdGhpcy5pbmRleCArPSBkaXI7XG4gICAgfVxuXG4gICAgaWYgKDAgPiB0aGlzLmluZGV4IHx8IHRoaXMuaW5kZXggPj0gdGhpcy5nbHlwaHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nbHlwaHNbdGhpcy5pbmRleF07XG4gIH07XG5cbiAgX3Byb3RvLm5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHJldHVybiB0aGlzLm1vdmUoKzEpO1xuICB9O1xuXG4gIF9wcm90by5wcmV2ID0gZnVuY3Rpb24gcHJldigpIHtcbiAgICByZXR1cm4gdGhpcy5tb3ZlKC0xKTtcbiAgfTtcblxuICBfcHJvdG8ucGVlayA9IGZ1bmN0aW9uIHBlZWsoY291bnQpIHtcbiAgICBpZiAoY291bnQgPT09IHZvaWQgMCkge1xuICAgICAgY291bnQgPSAxO1xuICAgIH1cblxuICAgIHZhciBpZHggPSB0aGlzLmluZGV4O1xuICAgIHZhciByZXMgPSB0aGlzLmluY3JlbWVudChjb3VudCk7XG4gICAgdGhpcy5pbmRleCA9IGlkeDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIF9wcm90by5wZWVrSW5kZXggPSBmdW5jdGlvbiBwZWVrSW5kZXgoY291bnQpIHtcbiAgICBpZiAoY291bnQgPT09IHZvaWQgMCkge1xuICAgICAgY291bnQgPSAxO1xuICAgIH1cblxuICAgIHZhciBpZHggPSB0aGlzLmluZGV4O1xuICAgIHRoaXMuaW5jcmVtZW50KGNvdW50KTtcbiAgICB2YXIgcmVzID0gdGhpcy5pbmRleDtcbiAgICB0aGlzLmluZGV4ID0gaWR4O1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgX3Byb3RvLmluY3JlbWVudCA9IGZ1bmN0aW9uIGluY3JlbWVudChjb3VudCkge1xuICAgIGlmIChjb3VudCA9PT0gdm9pZCAwKSB7XG4gICAgICBjb3VudCA9IDE7XG4gICAgfVxuXG4gICAgdmFyIGRpciA9IGNvdW50IDwgMCA/IC0xIDogMTtcbiAgICBjb3VudCA9IE1hdGguYWJzKGNvdW50KTtcblxuICAgIHdoaWxlIChjb3VudC0tKSB7XG4gICAgICB0aGlzLm1vdmUoZGlyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nbHlwaHNbdGhpcy5pbmRleF07XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzJDMoR2x5cGhJdGVyYXRvciwgW3tcbiAgICBrZXk6IFwiY3VyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nbHlwaHNbdGhpcy5pbmRleF0gfHwgbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gR2x5cGhJdGVyYXRvcjtcbn0oKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRkKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRkKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkZChvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGQobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRkKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxudmFyIERFRkFVTFRfU0NSSVBUUyA9IFsnREZMVCcsICdkZmx0JywgJ2xhdG4nXTtcblxudmFyIE9UUHJvY2Vzc29yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gT1RQcm9jZXNzb3IoZm9udCwgdGFibGUpIHtcbiAgICB0aGlzLmZvbnQgPSBmb250O1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB0aGlzLnNjcmlwdCA9IG51bGw7XG4gICAgdGhpcy5zY3JpcHRUYWcgPSBudWxsO1xuICAgIHRoaXMubGFuZ3VhZ2UgPSBudWxsO1xuICAgIHRoaXMubGFuZ3VhZ2VUYWcgPSBudWxsO1xuICAgIHRoaXMuZmVhdHVyZXMgPSB7fTtcbiAgICB0aGlzLmxvb2t1cHMgPSB7fTsgLy8gU2V0dXAgdmFyaWF0aW9uIHN1YnN0aXR1dGlvbnNcblxuICAgIHRoaXMudmFyaWF0aW9uc0luZGV4ID0gZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yID8gdGhpcy5maW5kVmFyaWF0aW9uc0luZGV4KGZvbnQuX3ZhcmlhdGlvblByb2Nlc3Nvci5ub3JtYWxpemVkQ29vcmRzKSA6IC0xOyAvLyBpbml0aWFsaXplIHRvIGRlZmF1bHQgc2NyaXB0ICsgbGFuZ3VhZ2VcblxuICAgIHRoaXMuc2VsZWN0U2NyaXB0KCk7IC8vIGN1cnJlbnQgY29udGV4dCAoc2V0IGJ5IGFwcGx5RmVhdHVyZXMpXG5cbiAgICB0aGlzLmdseXBocyA9IFtdO1xuICAgIHRoaXMucG9zaXRpb25zID0gW107IC8vIG9ubHkgdXNlZCBieSBHUE9TXG5cbiAgICB0aGlzLmxpZ2F0dXJlSUQgPSAxO1xuICAgIHRoaXMuY3VycmVudEZlYXR1cmUgPSBudWxsO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IE9UUHJvY2Vzc29yLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZmluZFNjcmlwdCA9IGZ1bmN0aW9uIGZpbmRTY3JpcHQoc2NyaXB0KSB7XG4gICAgaWYgKHRoaXMudGFibGUuc2NyaXB0TGlzdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2NyaXB0KSkge1xuICAgICAgc2NyaXB0ID0gW3NjcmlwdF07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKHNjcmlwdCksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgcyA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKHRoaXMudGFibGUuc2NyaXB0TGlzdCksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBlbnRyeSA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICBpZiAoZW50cnkudGFnID09PSBzKSB7XG4gICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX3Byb3RvLnNlbGVjdFNjcmlwdCA9IGZ1bmN0aW9uIHNlbGVjdFNjcmlwdChzY3JpcHQsIGxhbmd1YWdlLCBkaXJlY3Rpb24kMSkge1xuICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIGVudHJ5O1xuXG4gICAgaWYgKCF0aGlzLnNjcmlwdCB8fCBzY3JpcHQgIT09IHRoaXMuc2NyaXB0VGFnKSB7XG4gICAgICBlbnRyeSA9IHRoaXMuZmluZFNjcmlwdChzY3JpcHQpO1xuXG4gICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIGVudHJ5ID0gdGhpcy5maW5kU2NyaXB0KERFRkFVTFRfU0NSSVBUUyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NyaXB0VGFnO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNjcmlwdFRhZyA9IGVudHJ5LnRhZztcbiAgICAgIHRoaXMuc2NyaXB0ID0gZW50cnkuc2NyaXB0O1xuICAgICAgdGhpcy5sYW5ndWFnZSA9IG51bGw7XG4gICAgICB0aGlzLmxhbmd1YWdlVGFnID0gbnVsbDtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghZGlyZWN0aW9uJDEgfHwgZGlyZWN0aW9uJDEgIT09IHRoaXMuZGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbiQxIHx8IGRpcmVjdGlvbihzY3JpcHQpO1xuICAgIH1cblxuICAgIGlmIChsYW5ndWFnZSAmJiBsYW5ndWFnZS5sZW5ndGggPCA0KSB7XG4gICAgICBsYW5ndWFnZSArPSAnICcucmVwZWF0KDQgLSBsYW5ndWFnZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIGlmICghbGFuZ3VhZ2UgfHwgbGFuZ3VhZ2UgIT09IHRoaXMubGFuZ3VhZ2VUYWcpIHtcbiAgICAgIHRoaXMubGFuZ3VhZ2UgPSBudWxsO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKHRoaXMuc2NyaXB0LmxhbmdTeXNSZWNvcmRzKSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGxhbmcgPSBfc3RlcDMudmFsdWU7XG5cbiAgICAgICAgaWYgKGxhbmcudGFnID09PSBsYW5ndWFnZSkge1xuICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5nLmxhbmdTeXM7XG4gICAgICAgICAgdGhpcy5sYW5ndWFnZVRhZyA9IGxhbmcudGFnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5sYW5ndWFnZSkge1xuICAgICAgICB0aGlzLmxhbmd1YWdlID0gdGhpcy5zY3JpcHQuZGVmYXVsdExhbmdTeXM7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2VUYWcgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9IC8vIEJ1aWxkIGEgZmVhdHVyZSBsb29rdXAgdGFibGVcblxuXG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMuZmVhdHVyZXMgPSB7fTtcblxuICAgICAgaWYgKHRoaXMubGFuZ3VhZ2UpIHtcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZCh0aGlzLmxhbmd1YWdlLmZlYXR1cmVJbmRleGVzKSwgX3N0ZXA0OyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQoKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgZmVhdHVyZUluZGV4ID0gX3N0ZXA0LnZhbHVlO1xuICAgICAgICAgIHZhciByZWNvcmQgPSB0aGlzLnRhYmxlLmZlYXR1cmVMaXN0W2ZlYXR1cmVJbmRleF07XG4gICAgICAgICAgdmFyIHN1YnN0aXR1dGVGZWF0dXJlID0gdGhpcy5zdWJzdGl0dXRlRmVhdHVyZUZvclZhcmlhdGlvbnMoZmVhdHVyZUluZGV4KTtcbiAgICAgICAgICB0aGlzLmZlYXR1cmVzW3JlY29yZC50YWddID0gc3Vic3RpdHV0ZUZlYXR1cmUgfHwgcmVjb3JkLmZlYXR1cmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zY3JpcHRUYWc7XG4gIH07XG5cbiAgX3Byb3RvLmxvb2t1cHNGb3JGZWF0dXJlcyA9IGZ1bmN0aW9uIGxvb2t1cHNGb3JGZWF0dXJlcyh1c2VyRmVhdHVyZXMsIGV4Y2x1ZGUpIHtcbiAgICBpZiAodXNlckZlYXR1cmVzID09PSB2b2lkIDApIHtcbiAgICAgIHVzZXJGZWF0dXJlcyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBsb29rdXBzID0gW107XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3I1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKHVzZXJGZWF0dXJlcyksIF9zdGVwNTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1KCkpLmRvbmU7KSB7XG4gICAgICB2YXIgdGFnID0gX3N0ZXA1LnZhbHVlO1xuICAgICAgdmFyIGZlYXR1cmUgPSB0aGlzLmZlYXR1cmVzW3RhZ107XG5cbiAgICAgIGlmICghZmVhdHVyZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChmZWF0dXJlLmxvb2t1cExpc3RJbmRleGVzKSwgX3N0ZXA2OyAhKF9zdGVwNiA9IF9pdGVyYXRvcjYoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGxvb2t1cEluZGV4ID0gX3N0ZXA2LnZhbHVlO1xuXG4gICAgICAgIGlmIChleGNsdWRlICYmIGV4Y2x1ZGUuaW5kZXhPZihsb29rdXBJbmRleCkgIT09IC0xKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsb29rdXBzLnB1c2goe1xuICAgICAgICAgIGZlYXR1cmU6IHRhZyxcbiAgICAgICAgICBpbmRleDogbG9va3VwSW5kZXgsXG4gICAgICAgICAgbG9va3VwOiB0aGlzLnRhYmxlLmxvb2t1cExpc3QuZ2V0KGxvb2t1cEluZGV4KVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb29rdXBzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDtcbiAgICB9KTtcbiAgICByZXR1cm4gbG9va3VwcztcbiAgfTtcblxuICBfcHJvdG8uc3Vic3RpdHV0ZUZlYXR1cmVGb3JWYXJpYXRpb25zID0gZnVuY3Rpb24gc3Vic3RpdHV0ZUZlYXR1cmVGb3JWYXJpYXRpb25zKGZlYXR1cmVJbmRleCkge1xuICAgIGlmICh0aGlzLnZhcmlhdGlvbnNJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0aGlzLnRhYmxlLmZlYXR1cmVWYXJpYXRpb25zLmZlYXR1cmVWYXJpYXRpb25SZWNvcmRzW3RoaXMudmFyaWF0aW9uc0luZGV4XTtcbiAgICB2YXIgc3Vic3RpdHV0aW9ucyA9IHJlY29yZC5mZWF0dXJlVGFibGVTdWJzdGl0dXRpb24uc3Vic3RpdHV0aW9ucztcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjcgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQoc3Vic3RpdHV0aW9ucyksIF9zdGVwNzsgIShfc3RlcDcgPSBfaXRlcmF0b3I3KCkpLmRvbmU7KSB7XG4gICAgICB2YXIgc3Vic3RpdHV0aW9uID0gX3N0ZXA3LnZhbHVlO1xuXG4gICAgICBpZiAoc3Vic3RpdHV0aW9uLmZlYXR1cmVJbmRleCA9PT0gZmVhdHVyZUluZGV4KSB7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRpb24uYWx0ZXJuYXRlRmVhdHVyZVRhYmxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9wcm90by5maW5kVmFyaWF0aW9uc0luZGV4ID0gZnVuY3Rpb24gZmluZFZhcmlhdGlvbnNJbmRleChjb29yZHMpIHtcbiAgICB2YXIgdmFyaWF0aW9ucyA9IHRoaXMudGFibGUuZmVhdHVyZVZhcmlhdGlvbnM7XG5cbiAgICBpZiAoIXZhcmlhdGlvbnMpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkcyA9IHZhcmlhdGlvbnMuZmVhdHVyZVZhcmlhdGlvblJlY29yZHM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb25kaXRpb25zID0gcmVjb3Jkc1tpXS5jb25kaXRpb25TZXQuY29uZGl0aW9uVGFibGU7XG5cbiAgICAgIGlmICh0aGlzLnZhcmlhdGlvbkNvbmRpdGlvbnNNYXRjaChjb25kaXRpb25zLCBjb29yZHMpKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfTtcblxuICBfcHJvdG8udmFyaWF0aW9uQ29uZGl0aW9uc01hdGNoID0gZnVuY3Rpb24gdmFyaWF0aW9uQ29uZGl0aW9uc01hdGNoKGNvbmRpdGlvbnMsIGNvb3Jkcykge1xuICAgIHJldHVybiBjb25kaXRpb25zLmV2ZXJ5KGZ1bmN0aW9uIChjb25kaXRpb24pIHtcbiAgICAgIHZhciBjb29yZCA9IGNvbmRpdGlvbi5heGlzSW5kZXggPCBjb29yZHMubGVuZ3RoID8gY29vcmRzW2NvbmRpdGlvbi5heGlzSW5kZXhdIDogMDtcbiAgICAgIHJldHVybiBjb25kaXRpb24uZmlsdGVyUmFuZ2VNaW5WYWx1ZSA8PSBjb29yZCAmJiBjb29yZCA8PSBjb25kaXRpb24uZmlsdGVyUmFuZ2VNYXhWYWx1ZTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uYXBwbHlGZWF0dXJlcyA9IGZ1bmN0aW9uIGFwcGx5RmVhdHVyZXModXNlckZlYXR1cmVzLCBnbHlwaHMsIGFkdmFuY2VzKSB7XG4gICAgdmFyIGxvb2t1cHMgPSB0aGlzLmxvb2t1cHNGb3JGZWF0dXJlcyh1c2VyRmVhdHVyZXMpO1xuICAgIHRoaXMuYXBwbHlMb29rdXBzKGxvb2t1cHMsIGdseXBocywgYWR2YW5jZXMpO1xuICB9O1xuXG4gIF9wcm90by5hcHBseUxvb2t1cHMgPSBmdW5jdGlvbiBhcHBseUxvb2t1cHMobG9va3VwcywgZ2x5cGhzLCBwb3NpdGlvbnMpIHtcbiAgICB0aGlzLmdseXBocyA9IGdseXBocztcbiAgICB0aGlzLnBvc2l0aW9ucyA9IHBvc2l0aW9ucztcbiAgICB0aGlzLmdseXBoSXRlcmF0b3IgPSBuZXcgR2x5cGhJdGVyYXRvcihnbHlwaHMpO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yOCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChsb29rdXBzKSwgX3N0ZXA4OyAhKF9zdGVwOCA9IF9pdGVyYXRvcjgoKSkuZG9uZTspIHtcbiAgICAgIHZhciBfc3RlcDgkdmFsdWUgPSBfc3RlcDgudmFsdWUsXG4gICAgICAgICAgZmVhdHVyZSA9IF9zdGVwOCR2YWx1ZS5mZWF0dXJlLFxuICAgICAgICAgIGxvb2t1cCA9IF9zdGVwOCR2YWx1ZS5sb29rdXA7XG4gICAgICB0aGlzLmN1cnJlbnRGZWF0dXJlID0gZmVhdHVyZTtcbiAgICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5yZXNldChsb29rdXAuZmxhZ3MpO1xuXG4gICAgICB3aGlsZSAodGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4IDwgZ2x5cGhzLmxlbmd0aCkge1xuICAgICAgICBpZiAoIShmZWF0dXJlIGluIHRoaXMuZ2x5cGhJdGVyYXRvci5jdXIuZmVhdHVyZXMpKSB7XG4gICAgICAgICAgdGhpcy5nbHlwaEl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjkgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQobG9va3VwLnN1YlRhYmxlcyksIF9zdGVwOTsgIShfc3RlcDkgPSBfaXRlcmF0b3I5KCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIHRhYmxlID0gX3N0ZXA5LnZhbHVlO1xuICAgICAgICAgIHZhciByZXMgPSB0aGlzLmFwcGx5TG9va3VwKGxvb2t1cC5sb29rdXBUeXBlLCB0YWJsZSk7XG5cbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdseXBoSXRlcmF0b3IubmV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uYXBwbHlMb29rdXAgPSBmdW5jdGlvbiBhcHBseUxvb2t1cChsb29rdXAsIHRhYmxlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYXBwbHlMb29rdXAgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzXCIpO1xuICB9O1xuXG4gIF9wcm90by5hcHBseUxvb2t1cExpc3QgPSBmdW5jdGlvbiBhcHBseUxvb2t1cExpc3QobG9va3VwUmVjb3Jkcykge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5nbHlwaEl0ZXJhdG9yLm9wdGlvbnM7XG4gICAgdmFyIGdseXBoSW5kZXggPSB0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXg7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IxMCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChsb29rdXBSZWNvcmRzKSwgX3N0ZXAxMDsgIShfc3RlcDEwID0gX2l0ZXJhdG9yMTAoKSkuZG9uZTspIHtcbiAgICAgIHZhciBsb29rdXBSZWNvcmQgPSBfc3RlcDEwLnZhbHVlO1xuICAgICAgLy8gUmVzZXQgZmxhZ3MgYW5kIGZpbmQgZ2x5cGggaW5kZXggZm9yIHRoaXMgbG9va3VwIHJlY29yZFxuICAgICAgdGhpcy5nbHlwaEl0ZXJhdG9yLnJlc2V0KG9wdGlvbnMsIGdseXBoSW5kZXgpO1xuICAgICAgdGhpcy5nbHlwaEl0ZXJhdG9yLmluY3JlbWVudChsb29rdXBSZWNvcmQuc2VxdWVuY2VJbmRleCk7IC8vIEdldCB0aGUgbG9va3VwIGFuZCBzZXR1cCBmbGFncyBmb3Igc3VidGFibGVzXG5cbiAgICAgIHZhciBsb29rdXAgPSB0aGlzLnRhYmxlLmxvb2t1cExpc3QuZ2V0KGxvb2t1cFJlY29yZC5sb29rdXBMaXN0SW5kZXgpO1xuICAgICAgdGhpcy5nbHlwaEl0ZXJhdG9yLnJlc2V0KGxvb2t1cC5mbGFncywgdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4KTsgLy8gQXBwbHkgbG9va3VwIHN1YnRhYmxlcyB1bnRpbCBvbmUgbWF0Y2hlc1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IxMSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChsb29rdXAuc3ViVGFibGVzKSwgX3N0ZXAxMTsgIShfc3RlcDExID0gX2l0ZXJhdG9yMTEoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHRhYmxlID0gX3N0ZXAxMS52YWx1ZTtcblxuICAgICAgICBpZiAodGhpcy5hcHBseUxvb2t1cChsb29rdXAubG9va3VwVHlwZSwgdGFibGUpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmdseXBoSXRlcmF0b3IucmVzZXQob3B0aW9ucywgZ2x5cGhJbmRleCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgX3Byb3RvLmNvdmVyYWdlSW5kZXggPSBmdW5jdGlvbiBjb3ZlcmFnZUluZGV4KGNvdmVyYWdlLCBnbHlwaCkge1xuICAgIGlmIChnbHlwaCA9PSBudWxsKSB7XG4gICAgICBnbHlwaCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5jdXIuaWQ7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb3ZlcmFnZS52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBjb3ZlcmFnZS5nbHlwaHMuaW5kZXhPZihnbHlwaCk7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQoY292ZXJhZ2UucmFuZ2VSZWNvcmRzKSwgX3N0ZXAxMjsgIShfc3RlcDEyID0gX2l0ZXJhdG9yMTIoKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgcmFuZ2UgPSBfc3RlcDEyLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0IDw9IGdseXBoICYmIGdseXBoIDw9IHJhbmdlLmVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJhbmdlLnN0YXJ0Q292ZXJhZ2VJbmRleCArIGdseXBoIC0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9O1xuXG4gIF9wcm90by5tYXRjaCA9IGZ1bmN0aW9uIG1hdGNoKHNlcXVlbmNlSW5kZXgsIHNlcXVlbmNlLCBmbiwgbWF0Y2hlZCkge1xuICAgIHZhciBwb3MgPSB0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXg7XG4gICAgdmFyIGdseXBoID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmluY3JlbWVudChzZXF1ZW5jZUluZGV4KTtcbiAgICB2YXIgaWR4ID0gMDtcblxuICAgIHdoaWxlIChpZHggPCBzZXF1ZW5jZS5sZW5ndGggJiYgZ2x5cGggJiYgZm4oc2VxdWVuY2VbaWR4XSwgZ2x5cGgpKSB7XG4gICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICBtYXRjaGVkLnB1c2godGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4KTtcbiAgICAgIH1cblxuICAgICAgaWR4Kys7XG4gICAgICBnbHlwaCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5uZXh0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4ID0gcG9zO1xuXG4gICAgaWYgKGlkeCA8IHNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVkIHx8IHRydWU7XG4gIH07XG5cbiAgX3Byb3RvLnNlcXVlbmNlTWF0Y2hlcyA9IGZ1bmN0aW9uIHNlcXVlbmNlTWF0Y2hlcyhzZXF1ZW5jZUluZGV4LCBzZXF1ZW5jZSkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKHNlcXVlbmNlSW5kZXgsIHNlcXVlbmNlLCBmdW5jdGlvbiAoY29tcG9uZW50LCBnbHlwaCkge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudCA9PT0gZ2x5cGguaWQ7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLnNlcXVlbmNlTWF0Y2hJbmRpY2VzID0gZnVuY3Rpb24gc2VxdWVuY2VNYXRjaEluZGljZXMoc2VxdWVuY2VJbmRleCwgc2VxdWVuY2UpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHRoaXMubWF0Y2goc2VxdWVuY2VJbmRleCwgc2VxdWVuY2UsIGZ1bmN0aW9uIChjb21wb25lbnQsIGdseXBoKSB7XG4gICAgICAvLyBJZiB0aGUgY3VycmVudCBmZWF0dXJlIGRvZXNuJ3QgYXBwbHkgdG8gdGhpcyBnbHlwaCxcbiAgICAgIGlmICghKF90aGlzLmN1cnJlbnRGZWF0dXJlIGluIGdseXBoLmZlYXR1cmVzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wb25lbnQgPT09IGdseXBoLmlkO1xuICAgIH0sIFtdKTtcbiAgfTtcblxuICBfcHJvdG8uY292ZXJhZ2VTZXF1ZW5jZU1hdGNoZXMgPSBmdW5jdGlvbiBjb3ZlcmFnZVNlcXVlbmNlTWF0Y2hlcyhzZXF1ZW5jZUluZGV4LCBzZXF1ZW5jZSkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHRoaXMubWF0Y2goc2VxdWVuY2VJbmRleCwgc2VxdWVuY2UsIGZ1bmN0aW9uIChjb3ZlcmFnZSwgZ2x5cGgpIHtcbiAgICAgIHJldHVybiBfdGhpczIuY292ZXJhZ2VJbmRleChjb3ZlcmFnZSwgZ2x5cGguaWQpID49IDA7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLmdldENsYXNzSUQgPSBmdW5jdGlvbiBnZXRDbGFzc0lEKGdseXBoLCBjbGFzc0RlZikge1xuICAgIHN3aXRjaCAoY2xhc3NEZWYudmVyc2lvbikge1xuICAgICAgY2FzZSAxOlxuICAgICAgICAvLyBDbGFzcyBhcnJheVxuICAgICAgICB2YXIgaSA9IGdseXBoIC0gY2xhc3NEZWYuc3RhcnRHbHlwaDtcblxuICAgICAgICBpZiAoaSA+PSAwICYmIGkgPCBjbGFzc0RlZi5jbGFzc1ZhbHVlQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGNsYXNzRGVmLmNsYXNzVmFsdWVBcnJheVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjEzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKGNsYXNzRGVmLmNsYXNzUmFuZ2VSZWNvcmQpLCBfc3RlcDEzOyAhKF9zdGVwMTMgPSBfaXRlcmF0b3IxMygpKS5kb25lOykge1xuICAgICAgICAgIHZhciByYW5nZSA9IF9zdGVwMTMudmFsdWU7XG5cbiAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQgPD0gZ2x5cGggJiYgZ2x5cGggPD0gcmFuZ2UuZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VbXCJjbGFzc1wiXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfTtcblxuICBfcHJvdG8uY2xhc3NTZXF1ZW5jZU1hdGNoZXMgPSBmdW5jdGlvbiBjbGFzc1NlcXVlbmNlTWF0Y2hlcyhzZXF1ZW5jZUluZGV4LCBzZXF1ZW5jZSwgY2xhc3NEZWYpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHJldHVybiB0aGlzLm1hdGNoKHNlcXVlbmNlSW5kZXgsIHNlcXVlbmNlLCBmdW5jdGlvbiAoY2xhc3NJRCwgZ2x5cGgpIHtcbiAgICAgIHJldHVybiBjbGFzc0lEID09PSBfdGhpczMuZ2V0Q2xhc3NJRChnbHlwaC5pZCwgY2xhc3NEZWYpO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5hcHBseUNvbnRleHQgPSBmdW5jdGlvbiBhcHBseUNvbnRleHQodGFibGUpIHtcbiAgICBzd2l0Y2ggKHRhYmxlLnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlKTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNldCA9IHRhYmxlLnJ1bGVTZXRzW2luZGV4XTtcblxuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IxNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChzZXQpLCBfc3RlcDE0OyAhKF9zdGVwMTQgPSBfaXRlcmF0b3IxNCgpKS5kb25lOykge1xuICAgICAgICAgIHZhciBydWxlID0gX3N0ZXAxNC52YWx1ZTtcblxuICAgICAgICAgIGlmICh0aGlzLnNlcXVlbmNlTWF0Y2hlcygxLCBydWxlLmlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMb29rdXBMaXN0KHJ1bGUubG9va3VwUmVjb3Jkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaWYgKHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSkgPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSB0aGlzLmdldENsYXNzSUQodGhpcy5nbHlwaEl0ZXJhdG9yLmN1ci5pZCwgdGFibGUuY2xhc3NEZWYpO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBzZXQgPSB0YWJsZS5jbGFzc1NldFtpbmRleF07XG5cbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQoc2V0KSwgX3N0ZXAxNTsgIShfc3RlcDE1ID0gX2l0ZXJhdG9yMTUoKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgX3J1bGUgPSBfc3RlcDE1LnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY2xhc3NTZXF1ZW5jZU1hdGNoZXMoMSwgX3J1bGUuY2xhc3NlcywgdGFibGUuY2xhc3NEZWYpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxvb2t1cExpc3QoX3J1bGUubG9va3VwUmVjb3Jkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaWYgKHRoaXMuY292ZXJhZ2VTZXF1ZW5jZU1hdGNoZXMoMCwgdGFibGUuY292ZXJhZ2VzKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5TG9va3VwTGlzdCh0YWJsZS5sb29rdXBSZWNvcmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBfcHJvdG8uYXBwbHlDaGFpbmluZ0NvbnRleHQgPSBmdW5jdGlvbiBhcHBseUNoYWluaW5nQ29udGV4dCh0YWJsZSkge1xuICAgIHN3aXRjaCAodGFibGUudmVyc2lvbikge1xuICAgICAgY2FzZSAxOlxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UpO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2V0ID0gdGFibGUuY2hhaW5SdWxlU2V0c1tpbmRleF07XG5cbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQoc2V0KSwgX3N0ZXAxNjsgIShfc3RlcDE2ID0gX2l0ZXJhdG9yMTYoKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgcnVsZSA9IF9zdGVwMTYudmFsdWU7XG5cbiAgICAgICAgICBpZiAodGhpcy5zZXF1ZW5jZU1hdGNoZXMoLXJ1bGUuYmFja3RyYWNrLmxlbmd0aCwgcnVsZS5iYWNrdHJhY2spICYmIHRoaXMuc2VxdWVuY2VNYXRjaGVzKDEsIHJ1bGUuaW5wdXQpICYmIHRoaXMuc2VxdWVuY2VNYXRjaGVzKDEgKyBydWxlLmlucHV0Lmxlbmd0aCwgcnVsZS5sb29rYWhlYWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxvb2t1cExpc3QocnVsZS5sb29rdXBSZWNvcmRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICBpZiAodGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlKSA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCA9IHRoaXMuZ2V0Q2xhc3NJRCh0aGlzLmdseXBoSXRlcmF0b3IuY3VyLmlkLCB0YWJsZS5pbnB1dENsYXNzRGVmKTtcbiAgICAgICAgdmFyIHJ1bGVzID0gdGFibGUuY2hhaW5DbGFzc1NldFtpbmRleF07XG5cbiAgICAgICAgaWYgKCFydWxlcykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjE3ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKHJ1bGVzKSwgX3N0ZXAxNzsgIShfc3RlcDE3ID0gX2l0ZXJhdG9yMTcoKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgX3J1bGUyID0gX3N0ZXAxNy52YWx1ZTtcblxuICAgICAgICAgIGlmICh0aGlzLmNsYXNzU2VxdWVuY2VNYXRjaGVzKC1fcnVsZTIuYmFja3RyYWNrLmxlbmd0aCwgX3J1bGUyLmJhY2t0cmFjaywgdGFibGUuYmFja3RyYWNrQ2xhc3NEZWYpICYmIHRoaXMuY2xhc3NTZXF1ZW5jZU1hdGNoZXMoMSwgX3J1bGUyLmlucHV0LCB0YWJsZS5pbnB1dENsYXNzRGVmKSAmJiB0aGlzLmNsYXNzU2VxdWVuY2VNYXRjaGVzKDEgKyBfcnVsZTIuaW5wdXQubGVuZ3RoLCBfcnVsZTIubG9va2FoZWFkLCB0YWJsZS5sb29rYWhlYWRDbGFzc0RlZikpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5TG9va3VwTGlzdChfcnVsZTIubG9va3VwUmVjb3Jkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaWYgKHRoaXMuY292ZXJhZ2VTZXF1ZW5jZU1hdGNoZXMoLXRhYmxlLmJhY2t0cmFja0dseXBoQ291bnQsIHRhYmxlLmJhY2t0cmFja0NvdmVyYWdlKSAmJiB0aGlzLmNvdmVyYWdlU2VxdWVuY2VNYXRjaGVzKDAsIHRhYmxlLmlucHV0Q292ZXJhZ2UpICYmIHRoaXMuY292ZXJhZ2VTZXF1ZW5jZU1hdGNoZXModGFibGUuaW5wdXRHbHlwaENvdW50LCB0YWJsZS5sb29rYWhlYWRDb3ZlcmFnZSkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxvb2t1cExpc3QodGFibGUubG9va3VwUmVjb3Jkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgcmV0dXJuIE9UUHJvY2Vzc29yO1xufSgpO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQ0KHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDQoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ0KENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNChDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxudmFyIEdseXBoSW5mbyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEdseXBoSW5mbyhmb250LCBpZCwgY29kZVBvaW50cywgZmVhdHVyZXMpIHtcbiAgICBpZiAoY29kZVBvaW50cyA9PT0gdm9pZCAwKSB7XG4gICAgICBjb2RlUG9pbnRzID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5fZm9udCA9IGZvbnQ7XG4gICAgdGhpcy5jb2RlUG9pbnRzID0gY29kZVBvaW50cztcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5mZWF0dXJlcyA9IHt9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdHVyZXMpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV07XG4gICAgICAgIHRoaXMuZmVhdHVyZXNbZmVhdHVyZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZlYXR1cmVzID09PSAnb2JqZWN0Jykge1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmZlYXR1cmVzLCBmZWF0dXJlcyk7XG4gICAgfVxuXG4gICAgdGhpcy5saWdhdHVyZUlEID0gbnVsbDtcbiAgICB0aGlzLmxpZ2F0dXJlQ29tcG9uZW50ID0gbnVsbDtcbiAgICB0aGlzLmlzTGlnYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuY3Vyc2l2ZUF0dGFjaG1lbnQgPSBudWxsO1xuICAgIHRoaXMubWFya0F0dGFjaG1lbnQgPSBudWxsO1xuICAgIHRoaXMuc2hhcGVySW5mbyA9IG51bGw7XG4gICAgdGhpcy5zdWJzdGl0dXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNNdWx0aXBsaWVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gR2x5cGhJbmZvLnByb3RvdHlwZTtcblxuICBfcHJvdG8uY29weSA9IGZ1bmN0aW9uIGNvcHkoKSB7XG4gICAgcmV0dXJuIG5ldyBHbHlwaEluZm8odGhpcy5fZm9udCwgdGhpcy5pZCwgdGhpcy5jb2RlUG9pbnRzLCB0aGlzLmZlYXR1cmVzKTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MkNChHbHlwaEluZm8sIFt7XG4gICAga2V5OiBcImlkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChpZCkge1xuICAgICAgdGhpcy5faWQgPSBpZDtcbiAgICAgIHRoaXMuc3Vic3RpdHV0ZWQgPSB0cnVlO1xuICAgICAgdmFyIEdERUYgPSB0aGlzLl9mb250LkdERUY7XG5cbiAgICAgIGlmIChHREVGICYmIEdERUYuZ2x5cGhDbGFzc0RlZikge1xuICAgICAgICAvLyBUT0RPOiBjbGVhbiB0aGlzIHVwXG4gICAgICAgIHZhciBjbGFzc0lEID0gT1RQcm9jZXNzb3IucHJvdG90eXBlLmdldENsYXNzSUQoaWQsIEdERUYuZ2x5cGhDbGFzc0RlZik7XG4gICAgICAgIHRoaXMuaXNCYXNlID0gY2xhc3NJRCA9PT0gMTtcbiAgICAgICAgdGhpcy5pc0xpZ2F0dXJlID0gY2xhc3NJRCA9PT0gMjtcbiAgICAgICAgdGhpcy5pc01hcmsgPSBjbGFzc0lEID09PSAzO1xuICAgICAgICB0aGlzLm1hcmtBdHRhY2htZW50VHlwZSA9IEdERUYubWFya0F0dGFjaENsYXNzRGVmID8gT1RQcm9jZXNzb3IucHJvdG90eXBlLmdldENsYXNzSUQoaWQsIEdERUYubWFya0F0dGFjaENsYXNzRGVmKSA6IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzTWFyayA9IHRoaXMuY29kZVBvaW50cy5sZW5ndGggPiAwICYmIHRoaXMuY29kZVBvaW50cy5ldmVyeSh1bmljb2RlLmlzTWFyayk7XG4gICAgICAgIHRoaXMuaXNCYXNlID0gIXRoaXMuaXNNYXJrO1xuICAgICAgICB0aGlzLmlzTGlnYXR1cmUgPSB0aGlzLmNvZGVQb2ludHMubGVuZ3RoID4gMTtcbiAgICAgICAgdGhpcy5tYXJrQXR0YWNobWVudFR5cGUgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBHbHlwaEluZm87XG59KCk7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJDQoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eSQxKG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbi8qKlxuICogVGhpcyBpcyBhIHNoYXBlciBmb3IgdGhlIEhhbmd1bCBzY3JpcHQsIHVzZWQgYnkgdGhlIEtvcmVhbiBsYW5ndWFnZS5cbiAqIEl0IGRvZXMgdGhlIGZvbGxvd2luZzpcbiAqICAgLSBkZWNvbXBvc2UgaWYgdW5zdXBwb3J0ZWQgYnkgdGhlIGZvbnQ6XG4gKiAgICAgPExWPiAgIC0+IDxMLFY+XG4gKiAgICAgPExWVD4gIC0+IDxMLFYsVD5cbiAqICAgICA8TFYsVD4gLT4gPEwsVixUPlxuICpcbiAqICAgLSBjb21wb3NlIGlmIHN1cHBvcnRlZCBieSB0aGUgZm9udDpcbiAqICAgICA8TCxWPiAgIC0+IDxMVj5cbiAqICAgICA8TCxWLFQ+IC0+IDxMVlQ+XG4gKiAgICAgPExWLFQ+ICAtPiA8TFZUPlxuICpcbiAqICAgLSByZW9yZGVyIHRvbmUgbWFya3MgKFMgaXMgYW55IHZhbGlkIHN5bGxhYmxlKTpcbiAqICAgICA8UywgTT4gLT4gPE0sIFM+XG4gKlxuICogICAtIGFwcGx5IGxqbW8sIHZqbW8sIGFuZCB0am1vIE9wZW5UeXBlIGZlYXR1cmVzIHRvIGRlY29tcG9zZWQgSmFtbyBzZXF1ZW5jZXMuXG4gKlxuICogVGhpcyBsb2dpYyBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGRvY3VtZW50czpcbiAqICAgLSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9PcGVuVHlwZURldi9oYW5ndWwvaW50cm8uaHRtXG4gKiAgIC0gaHR0cDovL2t0dWcub3JnL35ub21vcy9oYXJmYnV6ei1oYW5ndWwvaGFuZ3Vsc2hhcGVyLnBkZlxuICovXG5cbnZhciBIYW5ndWxTaGFwZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9EZWZhdWx0U2hhcGVyKSB7XG4gIF9pbmhlcml0c0xvb3NlJDQoSGFuZ3VsU2hhcGVyLCBfRGVmYXVsdFNoYXBlcik7XG5cbiAgZnVuY3Rpb24gSGFuZ3VsU2hhcGVyKCkge1xuICAgIHJldHVybiBfRGVmYXVsdFNoYXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICBIYW5ndWxTaGFwZXIucGxhbkZlYXR1cmVzID0gZnVuY3Rpb24gcGxhbkZlYXR1cmVzKHBsYW4pIHtcbiAgICBwbGFuLmFkZChbJ2xqbW8nLCAndmptbycsICd0am1vJ10sIGZhbHNlKTtcbiAgfTtcblxuICBIYW5ndWxTaGFwZXIuYXNzaWduRmVhdHVyZXMgPSBmdW5jdGlvbiBhc3NpZ25GZWF0dXJlcyhwbGFuLCBnbHlwaHMpIHtcbiAgICB2YXIgc3RhdGUgPSAwO1xuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgZ2x5cGhzLmxlbmd0aCkge1xuICAgICAgdmFyIGFjdGlvbiA9IHZvaWQgMDtcbiAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpXTtcbiAgICAgIHZhciBjb2RlID0gZ2x5cGguY29kZVBvaW50c1swXTtcbiAgICAgIHZhciB0eXBlID0gZ2V0VHlwZShjb2RlKTtcbiAgICAgIHZhciBfU1RBVEVfVEFCTEUkc3RhdGUkdHkgPSBTVEFURV9UQUJMRSQxW3N0YXRlXVt0eXBlXTtcbiAgICAgIGFjdGlvbiA9IF9TVEFURV9UQUJMRSRzdGF0ZSR0eVswXTtcbiAgICAgIHN0YXRlID0gX1NUQVRFX1RBQkxFJHN0YXRlJHR5WzFdO1xuXG4gICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICBjYXNlIERFQ09NUE9TRTpcbiAgICAgICAgICAvLyBEZWNvbXBvc2UgdGhlIGNvbXBvc2VkIHN5bGxhYmxlIGlmIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGZvbnQuXG4gICAgICAgICAgaWYgKCFwbGFuLmZvbnQuaGFzR2x5cGhGb3JDb2RlUG9pbnQoY29kZSkpIHtcbiAgICAgICAgICAgIGkgPSBkZWNvbXBvc2UoZ2x5cGhzLCBpLCBwbGFuLmZvbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgQ09NUE9TRTpcbiAgICAgICAgICAvLyBGb3VuZCBhIGRlY29tcG9zZWQgc3lsbGFibGUuIFRyeSB0byBjb21wb3NlIGlmIHN1cHBvcnRlZCBieSB0aGUgZm9udC5cbiAgICAgICAgICBpID0gY29tcG9zZShnbHlwaHMsIGksIHBsYW4uZm9udCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUT05FX01BUks6XG4gICAgICAgICAgLy8gR290IGEgdmFsaWQgc3lsbGFibGUsIGZvbGxvd2VkIGJ5IGEgdG9uZSBtYXJrLiBNb3ZlIHRoZSB0b25lIG1hcmsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3lsbGFibGUuXG4gICAgICAgICAgcmVvcmRlclRvbmVNYXJrKGdseXBocywgaSwgcGxhbi5mb250KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIElOVkFMSUQ6XG4gICAgICAgICAgLy8gVG9uZSBtYXJrIGhhcyBubyB2YWxpZCBzeWxsYWJsZSB0byBhdHRhY2ggdG8sIHNvIGluc2VydCBhIGRvdHRlZCBjaXJjbGVcbiAgICAgICAgICBpID0gaW5zZXJ0RG90dGVkQ2lyY2xlKGdseXBocywgaSwgcGxhbi5mb250KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gSGFuZ3VsU2hhcGVyO1xufShEZWZhdWx0U2hhcGVyKTtcblxuX2RlZmluZVByb3BlcnR5JDEoSGFuZ3VsU2hhcGVyLCBcInplcm9NYXJrV2lkdGhzXCIsICdOT05FJyk7XG52YXIgSEFOR1VMX0JBU0UgPSAweGFjMDA7XG52YXIgSEFOR1VMX0VORCA9IDB4ZDdhNDtcbnZhciBIQU5HVUxfQ09VTlQgPSBIQU5HVUxfRU5EIC0gSEFOR1VMX0JBU0UgKyAxO1xudmFyIExfQkFTRSA9IDB4MTEwMDsgLy8gbGVhZFxuXG52YXIgVl9CQVNFID0gMHgxMTYxOyAvLyB2b3dlbFxuXG52YXIgVF9CQVNFID0gMHgxMWE3OyAvLyB0cmFpbFxuXG52YXIgTF9DT1VOVCA9IDE5O1xudmFyIFZfQ09VTlQgPSAyMTtcbnZhciBUX0NPVU5UID0gMjg7XG52YXIgTF9FTkQgPSBMX0JBU0UgKyBMX0NPVU5UIC0gMTtcbnZhciBWX0VORCA9IFZfQkFTRSArIFZfQ09VTlQgLSAxO1xudmFyIFRfRU5EID0gVF9CQVNFICsgVF9DT1VOVCAtIDE7XG52YXIgRE9UVEVEX0NJUkNMRSA9IDB4MjVjYztcblxudmFyIGlzTCA9IGZ1bmN0aW9uIGlzTChjb2RlKSB7XG4gIHJldHVybiAweDExMDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4MTE1ZiB8fCAweGE5NjAgPD0gY29kZSAmJiBjb2RlIDw9IDB4YTk3Yztcbn07XG5cbnZhciBpc1YgPSBmdW5jdGlvbiBpc1YoY29kZSkge1xuICByZXR1cm4gMHgxMTYwIDw9IGNvZGUgJiYgY29kZSA8PSAweDExYTcgfHwgMHhkN2IwIDw9IGNvZGUgJiYgY29kZSA8PSAweGQ3YzY7XG59O1xuXG52YXIgaXNUID0gZnVuY3Rpb24gaXNUKGNvZGUpIHtcbiAgcmV0dXJuIDB4MTFhOCA8PSBjb2RlICYmIGNvZGUgPD0gMHgxMWZmIHx8IDB4ZDdjYiA8PSBjb2RlICYmIGNvZGUgPD0gMHhkN2ZiO1xufTtcblxudmFyIGlzVG9uZSA9IGZ1bmN0aW9uIGlzVG9uZShjb2RlKSB7XG4gIHJldHVybiAweDMwMmUgPD0gY29kZSAmJiBjb2RlIDw9IDB4MzAyZjtcbn07XG5cbnZhciBpc0xWVCA9IGZ1bmN0aW9uIGlzTFZUKGNvZGUpIHtcbiAgcmV0dXJuIEhBTkdVTF9CQVNFIDw9IGNvZGUgJiYgY29kZSA8PSBIQU5HVUxfRU5EO1xufTtcblxudmFyIGlzTFYgPSBmdW5jdGlvbiBpc0xWKGNvZGUpIHtcbiAgcmV0dXJuIGNvZGUgLSBIQU5HVUxfQkFTRSA8IEhBTkdVTF9DT1VOVCAmJiAoY29kZSAtIEhBTkdVTF9CQVNFKSAlIFRfQ09VTlQgPT09IDA7XG59O1xuXG52YXIgaXNDb21iaW5pbmdMID0gZnVuY3Rpb24gaXNDb21iaW5pbmdMKGNvZGUpIHtcbiAgcmV0dXJuIExfQkFTRSA8PSBjb2RlICYmIGNvZGUgPD0gTF9FTkQ7XG59O1xuXG52YXIgaXNDb21iaW5pbmdWID0gZnVuY3Rpb24gaXNDb21iaW5pbmdWKGNvZGUpIHtcbiAgcmV0dXJuIFZfQkFTRSA8PSBjb2RlICYmIGNvZGUgPD0gVl9FTkQ7XG59O1xuXG52YXIgaXNDb21iaW5pbmdUID0gZnVuY3Rpb24gaXNDb21iaW5pbmdUKGNvZGUpIHtcbiAgcmV0dXJuICAxIDw9IGNvZGUgJiYgY29kZSA8PSBUX0VORDtcbn07IC8vIENoYXJhY3RlciBjYXRlZ29yaWVzXG5cblxudmFyIFggPSAwOyAvLyBPdGhlciBjaGFyYWN0ZXJcblxudmFyIEwgPSAxOyAvLyBMZWFkaW5nIGNvbnNvbmFudFxuXG52YXIgViA9IDI7IC8vIE1lZGlhbCB2b3dlbFxuXG52YXIgVCA9IDM7IC8vIFRyYWlsaW5nIGNvbnNvbmFudFxuXG52YXIgTFYgPSA0OyAvLyBDb21wb3NlZCA8TFY+IHN5bGxhYmxlXG5cbnZhciBMVlQgPSA1OyAvLyBDb21wb3NlZCA8TFZUPiBzeWxsYWJsZVxuXG52YXIgTSA9IDY7IC8vIFRvbmUgbWFya1xuLy8gVGhpcyBmdW5jdGlvbiBjbGFzc2lmaWVzIGEgY2hhcmFjdGVyIHVzaW5nIHRoZSBhYm92ZSBjYXRlZ29yaWVzLlxuXG5mdW5jdGlvbiBnZXRUeXBlKGNvZGUpIHtcbiAgaWYgKGlzTChjb2RlKSkge1xuICAgIHJldHVybiBMO1xuICB9XG5cbiAgaWYgKGlzVihjb2RlKSkge1xuICAgIHJldHVybiBWO1xuICB9XG5cbiAgaWYgKGlzVChjb2RlKSkge1xuICAgIHJldHVybiBUO1xuICB9XG5cbiAgaWYgKGlzTFYoY29kZSkpIHtcbiAgICByZXR1cm4gTFY7XG4gIH1cblxuICBpZiAoaXNMVlQoY29kZSkpIHtcbiAgICByZXR1cm4gTFZUO1xuICB9XG5cbiAgaWYgKGlzVG9uZShjb2RlKSkge1xuICAgIHJldHVybiBNO1xuICB9XG5cbiAgcmV0dXJuIFg7XG59IC8vIFN0YXRlIG1hY2hpbmUgYWN0aW9uc1xuXG5cbnZhciBOT19BQ1RJT04gPSAwO1xudmFyIERFQ09NUE9TRSA9IDE7XG52YXIgQ09NUE9TRSA9IDI7XG52YXIgVE9ORV9NQVJLID0gNDtcbnZhciBJTlZBTElEID0gNTsgLy8gQnVpbGQgYSBzdGF0ZSBtYWNoaW5lIHRoYXQgYWNjZXB0cyB2YWxpZCBzeWxsYWJsZXMsIGFuZCBhcHBsaWVzIGFjdGlvbnMgYWxvbmcgdGhlIHdheS5cbi8vIFRoZSBsb2dpYyB0aGlzIGlzIGltcGxlbWVudGluZyBpcyBkb2N1bWVudGVkIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuXG5cbnZhciBTVEFURV9UQUJMRSQxID0gWy8vICAgICAgIFggICAgICAgICAgICAgICAgIEwgICAgICAgICAgICAgICAgIFYgICAgICAgICAgICAgICAgVCAgICAgICAgICAgICAgICAgIExWICAgICAgICAgICAgICAgIExWVCAgICAgICAgICAgICAgIE1cbi8vIFN0YXRlIDA6IHN0YXJ0IHN0YXRlXG5bW05PX0FDVElPTiwgMF0sIFtOT19BQ1RJT04sIDFdLCBbTk9fQUNUSU9OLCAwXSwgW05PX0FDVElPTiwgMF0sIFtERUNPTVBPU0UsIDJdLCBbREVDT01QT1NFLCAzXSwgW0lOVkFMSUQsIDBdXSwgLy8gU3RhdGUgMTogPEw+XG5bW05PX0FDVElPTiwgMF0sIFtOT19BQ1RJT04sIDFdLCBbQ09NUE9TRSwgMl0sIFtOT19BQ1RJT04sIDBdLCBbREVDT01QT1NFLCAyXSwgW0RFQ09NUE9TRSwgM10sIFtJTlZBTElELCAwXV0sIC8vIFN0YXRlIDI6IDxMLFY+IG9yIDxMVj5cbltbTk9fQUNUSU9OLCAwXSwgW05PX0FDVElPTiwgMV0sIFtOT19BQ1RJT04sIDBdLCBbQ09NUE9TRSwgM10sIFtERUNPTVBPU0UsIDJdLCBbREVDT01QT1NFLCAzXSwgW1RPTkVfTUFSSywgMF1dLCAvLyBTdGF0ZSAzOiA8TCxWLFQ+IG9yIDxMVlQ+XG5bW05PX0FDVElPTiwgMF0sIFtOT19BQ1RJT04sIDFdLCBbTk9fQUNUSU9OLCAwXSwgW05PX0FDVElPTiwgMF0sIFtERUNPTVBPU0UsIDJdLCBbREVDT01QT1NFLCAzXSwgW1RPTkVfTUFSSywgMF1dXTtcblxuZnVuY3Rpb24gZ2V0R2x5cGgoZm9udCwgY29kZSwgZmVhdHVyZXMpIHtcbiAgcmV0dXJuIG5ldyBHbHlwaEluZm8oZm9udCwgZm9udC5nbHlwaEZvckNvZGVQb2ludChjb2RlKS5pZCwgW2NvZGVdLCBmZWF0dXJlcyk7XG59XG5cbmZ1bmN0aW9uIGRlY29tcG9zZShnbHlwaHMsIGksIGZvbnQpIHtcbiAgdmFyIGdseXBoID0gZ2x5cGhzW2ldO1xuICB2YXIgY29kZSA9IGdseXBoLmNvZGVQb2ludHNbMF07XG4gIHZhciBzID0gY29kZSAtIEhBTkdVTF9CQVNFO1xuICB2YXIgdCA9IFRfQkFTRSArIHMgJSBUX0NPVU5UO1xuICBzID0gcyAvIFRfQ09VTlQgfCAwO1xuICB2YXIgbCA9IExfQkFTRSArIHMgLyBWX0NPVU5UIHwgMDtcbiAgdmFyIHYgPSBWX0JBU0UgKyBzICUgVl9DT1VOVDsgLy8gRG9uJ3QgZGVjb21wb3NlIGlmIGFsbCBvZiB0aGUgY29tcG9uZW50cyBhcmUgbm90IGF2YWlsYWJsZVxuXG4gIGlmICghZm9udC5oYXNHbHlwaEZvckNvZGVQb2ludChsKSB8fCAhZm9udC5oYXNHbHlwaEZvckNvZGVQb2ludCh2KSB8fCB0ICE9PSBUX0JBU0UgJiYgIWZvbnQuaGFzR2x5cGhGb3JDb2RlUG9pbnQodCkpIHtcbiAgICByZXR1cm4gaTtcbiAgfSAvLyBSZXBsYWNlIHRoZSBjdXJyZW50IGdseXBoIHdpdGggZGVjb21wb3NlZCBMLCBWLCBhbmQgVCBnbHlwaHMsXG4gIC8vIGFuZCBhcHBseSB0aGUgcHJvcGVyIE9wZW5UeXBlIGZlYXR1cmVzIHRvIGVhY2ggY29tcG9uZW50LlxuXG5cbiAgdmFyIGxqbW8gPSBnZXRHbHlwaChmb250LCBsLCBnbHlwaC5mZWF0dXJlcyk7XG4gIGxqbW8uZmVhdHVyZXMubGptbyA9IHRydWU7XG4gIHZhciB2am1vID0gZ2V0R2x5cGgoZm9udCwgdiwgZ2x5cGguZmVhdHVyZXMpO1xuICB2am1vLmZlYXR1cmVzLnZqbW8gPSB0cnVlO1xuICB2YXIgaW5zZXJ0ID0gW2xqbW8sIHZqbW9dO1xuXG4gIGlmICh0ID4gVF9CQVNFKSB7XG4gICAgdmFyIHRqbW8gPSBnZXRHbHlwaChmb250LCB0LCBnbHlwaC5mZWF0dXJlcyk7XG4gICAgdGptby5mZWF0dXJlcy50am1vID0gdHJ1ZTtcbiAgICBpbnNlcnQucHVzaCh0am1vKTtcbiAgfVxuXG4gIGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbaSwgMV0uY29uY2F0KGluc2VydCkpO1xuICByZXR1cm4gaSArIGluc2VydC5sZW5ndGggLSAxO1xufVxuXG5mdW5jdGlvbiBjb21wb3NlKGdseXBocywgaSwgZm9udCkge1xuICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gIHZhciBjb2RlID0gZ2x5cGhzW2ldLmNvZGVQb2ludHNbMF07XG4gIHZhciB0eXBlID0gZ2V0VHlwZShjb2RlKTtcbiAgdmFyIHByZXYgPSBnbHlwaHNbaSAtIDFdLmNvZGVQb2ludHNbMF07XG4gIHZhciBwcmV2VHlwZSA9IGdldFR5cGUocHJldik7IC8vIEZpZ3VyZSBvdXQgd2hhdCB0eXBlIG9mIHN5bGxhYmxlIHdlJ3JlIGRlYWxpbmcgd2l0aFxuXG4gIHZhciBsdiwgbGptbywgdmptbywgdGptbztcblxuICBpZiAocHJldlR5cGUgPT09IExWICYmIHR5cGUgPT09IFQpIHtcbiAgICAvLyA8TFYsVD5cbiAgICBsdiA9IHByZXY7XG4gICAgdGptbyA9IGdseXBoO1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlID09PSBWKSB7XG4gICAgICAvLyA8TCxWPlxuICAgICAgbGptbyA9IGdseXBoc1tpIC0gMV07XG4gICAgICB2am1vID0gZ2x5cGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDxMLFYsVD5cbiAgICAgIGxqbW8gPSBnbHlwaHNbaSAtIDJdO1xuICAgICAgdmptbyA9IGdseXBoc1tpIC0gMV07XG4gICAgICB0am1vID0gZ2x5cGg7XG4gICAgfVxuXG4gICAgdmFyIGwgPSBsam1vLmNvZGVQb2ludHNbMF07XG4gICAgdmFyIHYgPSB2am1vLmNvZGVQb2ludHNbMF07IC8vIE1ha2Ugc3VyZSBMIGFuZCBWIGFyZSBjb21iaW5pbmcgY2hhcmFjdGVyc1xuXG4gICAgaWYgKGlzQ29tYmluaW5nTChsKSAmJiBpc0NvbWJpbmluZ1YodikpIHtcbiAgICAgIGx2ID0gSEFOR1VMX0JBU0UgKyAoKGwgLSBMX0JBU0UpICogVl9DT1VOVCArICh2IC0gVl9CQVNFKSkgKiBUX0NPVU5UO1xuICAgIH1cbiAgfVxuXG4gIHZhciB0ID0gdGptbyAmJiB0am1vLmNvZGVQb2ludHNbMF0gfHwgVF9CQVNFO1xuXG4gIGlmIChsdiAhPSBudWxsICYmICh0ID09PSBUX0JBU0UgfHwgaXNDb21iaW5pbmdUKHQpKSkge1xuICAgIHZhciBzID0gbHYgKyAodCAtIFRfQkFTRSk7IC8vIFJlcGxhY2Ugd2l0aCBhIGNvbXBvc2VkIGdseXBoIGlmIHN1cHBvcnRlZCBieSB0aGUgZm9udCxcbiAgICAvLyBvdGhlcndpc2UgYXBwbHkgdGhlIHByb3BlciBPcGVuVHlwZSBmZWF0dXJlcyB0byBlYWNoIGNvbXBvbmVudC5cblxuICAgIGlmIChmb250Lmhhc0dseXBoRm9yQ29kZVBvaW50KHMpKSB7XG4gICAgICB2YXIgZGVsID0gcHJldlR5cGUgPT09IFYgPyAzIDogMjtcbiAgICAgIGdseXBocy5zcGxpY2UoaSAtIGRlbCArIDEsIGRlbCwgZ2V0R2x5cGgoZm9udCwgcywgZ2x5cGguZmVhdHVyZXMpKTtcbiAgICAgIHJldHVybiBpIC0gZGVsICsgMTtcbiAgICB9XG4gIH0gLy8gRGlkbid0IGNvbXBvc2UgKGVpdGhlciBhIG5vbi1jb21iaW5pbmcgY29tcG9uZW50IG9yIHVuc3VwcG9ydGVkIGJ5IGZvbnQpLlxuXG5cbiAgaWYgKGxqbW8pIHtcbiAgICBsam1vLmZlYXR1cmVzLmxqbW8gPSB0cnVlO1xuICB9XG5cbiAgaWYgKHZqbW8pIHtcbiAgICB2am1vLmZlYXR1cmVzLnZqbW8gPSB0cnVlO1xuICB9XG5cbiAgaWYgKHRqbW8pIHtcbiAgICB0am1vLmZlYXR1cmVzLnRqbW8gPSB0cnVlO1xuICB9XG5cbiAgaWYgKHByZXZUeXBlID09PSBMVikge1xuICAgIC8vIFNlcXVlbmNlIHdhcyBvcmlnaW5hbGx5IDxMLFY+LCB3aGljaCBnb3QgY29tYmluZWQgZWFybGllci5cbiAgICAvLyBFaXRoZXIgdGhlIFQgd2FzIG5vbi1jb21iaW5pbmcsIG9yIHRoZSBMVlQgZ2x5cGggd2Fzbid0IHN1cHBvcnRlZC5cbiAgICAvLyBEZWNvbXBvc2UgdGhlIGdseXBoIGFnYWluIGFuZCBhcHBseSBPVCBmZWF0dXJlcy5cbiAgICBkZWNvbXBvc2UoZ2x5cGhzLCBpIC0gMSwgZm9udCk7XG4gICAgcmV0dXJuIGkgKyAxO1xuICB9XG5cbiAgcmV0dXJuIGk7XG59XG5cbmZ1bmN0aW9uIGdldExlbmd0aChjb2RlKSB7XG4gIHN3aXRjaCAoZ2V0VHlwZShjb2RlKSkge1xuICAgIGNhc2UgTFY6XG4gICAgY2FzZSBMVlQ6XG4gICAgICByZXR1cm4gMTtcblxuICAgIGNhc2UgVjpcbiAgICAgIHJldHVybiAyO1xuXG4gICAgY2FzZSBUOlxuICAgICAgcmV0dXJuIDM7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVvcmRlclRvbmVNYXJrKGdseXBocywgaSwgZm9udCkge1xuICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gIHZhciBjb2RlID0gZ2x5cGhzW2ldLmNvZGVQb2ludHNbMF07IC8vIE1vdmUgdG9uZSBtYXJrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByZXZpb3VzIHN5bGxhYmxlLCB1bmxlc3MgaXQgaXMgemVybyB3aWR0aFxuXG4gIGlmIChmb250LmdseXBoRm9yQ29kZVBvaW50KGNvZGUpLmFkdmFuY2VXaWR0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwcmV2ID0gZ2x5cGhzW2kgLSAxXS5jb2RlUG9pbnRzWzBdO1xuICB2YXIgbGVuID0gZ2V0TGVuZ3RoKHByZXYpO1xuICBnbHlwaHMuc3BsaWNlKGksIDEpO1xuICByZXR1cm4gZ2x5cGhzLnNwbGljZShpIC0gbGVuLCAwLCBnbHlwaCk7XG59XG5cbmZ1bmN0aW9uIGluc2VydERvdHRlZENpcmNsZShnbHlwaHMsIGksIGZvbnQpIHtcbiAgdmFyIGdseXBoID0gZ2x5cGhzW2ldO1xuICB2YXIgY29kZSA9IGdseXBoc1tpXS5jb2RlUG9pbnRzWzBdO1xuXG4gIGlmIChmb250Lmhhc0dseXBoRm9yQ29kZVBvaW50KERPVFRFRF9DSVJDTEUpKSB7XG4gICAgdmFyIGRvdHRlZENpcmNsZSA9IGdldEdseXBoKGZvbnQsIERPVFRFRF9DSVJDTEUsIGdseXBoLmZlYXR1cmVzKTsgLy8gSWYgdGhlIHRvbmUgbWFyayBpcyB6ZXJvIHdpZHRoLCBpbnNlcnQgdGhlIGRvdHRlZCBjaXJjbGUgYmVmb3JlLCBvdGhlcndpc2UgYWZ0ZXJcblxuICAgIHZhciBpZHggPSBmb250LmdseXBoRm9yQ29kZVBvaW50KGNvZGUpLmFkdmFuY2VXaWR0aCA9PT0gMCA/IGkgOiBpICsgMTtcbiAgICBnbHlwaHMuc3BsaWNlKGlkeCwgMCwgZG90dGVkQ2lyY2xlKTtcbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gaTtcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRlKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRlKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRlKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkZShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGUobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRlKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgSU5JVElBTF9TVEFURSA9IDE7XG52YXIgRkFJTF9TVEFURSA9IDA7XG4vKipcbiAqIEEgU3RhdGVNYWNoaW5lIHJlcHJlc2VudHMgYSBkZXRlcm1pbmlzdGljIGZpbml0ZSBhdXRvbWF0b24uXG4gKiBJdCBjYW4gcGVyZm9ybSBtYXRjaGVzIG92ZXIgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMsIHNpbWlsYXIgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gKi9cblxudmFyIFN0YXRlTWFjaGluZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFN0YXRlTWFjaGluZShkZmEpIHtcbiAgICB0aGlzLnN0YXRlVGFibGUgPSBkZmEuc3RhdGVUYWJsZTtcbiAgICB0aGlzLmFjY2VwdGluZyA9IGRmYS5hY2NlcHRpbmc7XG4gICAgdGhpcy50YWdzID0gZGZhLnRhZ3M7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gaXRlcmFibGUgb2JqZWN0IHRoYXQgeWllbGRzIHBhdHRlcm4gbWF0Y2hlcyBvdmVyIHRoZSBpbnB1dCBzZXF1ZW5jZS5cbiAgICogTWF0Y2hlcyBhcmUgb2YgdGhlIGZvcm0gW3N0YXJ0SW5kZXgsIGVuZEluZGV4LCB0YWdzXS5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gU3RhdGVNYWNoaW5lLnByb3RvdHlwZTtcblxuICBfcHJvdG8ubWF0Y2ggPSBmdW5jdGlvbiBtYXRjaChzdHIpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gX3JlZiA9IHt9LCBfcmVmW1N5bWJvbC5pdGVyYXRvcl0gPSAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICAgIHZhciBzdGF0ZSwgc3RhcnRSdW4sIGxhc3RBY2NlcHRpbmcsIGxhc3RTdGF0ZSwgcCwgYztcbiAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgc3RhdGUgPSBJTklUSUFMX1NUQVRFO1xuICAgICAgICAgICAgICBzdGFydFJ1biA9IG51bGw7XG4gICAgICAgICAgICAgIGxhc3RBY2NlcHRpbmcgPSBudWxsO1xuICAgICAgICAgICAgICBsYXN0U3RhdGUgPSBudWxsO1xuICAgICAgICAgICAgICBwID0gMDtcblxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICBpZiAoIShwIDwgc3RyLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjID0gc3RyW3BdO1xuICAgICAgICAgICAgICBsYXN0U3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgICAgc3RhdGUgPSBzZWxmLnN0YXRlVGFibGVbc3RhdGVdW2NdO1xuXG4gICAgICAgICAgICAgIGlmICghKHN0YXRlID09PSBGQUlMX1NUQVRFKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxNTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghKHN0YXJ0UnVuICE9IG51bGwgJiYgbGFzdEFjY2VwdGluZyAhPSBudWxsICYmIGxhc3RBY2NlcHRpbmcgPj0gc3RhcnRSdW4pKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEzO1xuICAgICAgICAgICAgICByZXR1cm4gW3N0YXJ0UnVuLCBsYXN0QWNjZXB0aW5nLCBzZWxmLnRhZ3NbbGFzdFN0YXRlXV07XG5cbiAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBzdGF0ZSBhcyBpZiB3ZSBzdGFydGVkIG92ZXIgZnJvbSB0aGUgaW5pdGlhbCBzdGF0ZVxuICAgICAgICAgICAgICBzdGF0ZSA9IHNlbGYuc3RhdGVUYWJsZVtJTklUSUFMX1NUQVRFXVtjXTtcbiAgICAgICAgICAgICAgc3RhcnRSdW4gPSBudWxsO1xuXG4gICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAvLyBzdGFydCBhIHJ1biBpZiBub3QgaW4gdGhlIGZhaWx1cmUgc3RhdGVcbiAgICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBGQUlMX1NUQVRFICYmIHN0YXJ0UnVuID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzdGFydFJ1biA9IHA7XG4gICAgICAgICAgICAgIH0gLy8gaWYgYWNjZXB0aW5nLCBtYXJrIHRoZSBwb3RlbnRpYWwgbWF0Y2ggZW5kXG5cblxuICAgICAgICAgICAgICBpZiAoc2VsZi5hY2NlcHRpbmdbc3RhdGVdKSB7XG4gICAgICAgICAgICAgICAgbGFzdEFjY2VwdGluZyA9IHA7XG4gICAgICAgICAgICAgIH0gLy8gcmVzZXQgdGhlIHN0YXRlIHRvIHRoZSBpbml0aWFsIHN0YXRlIGlmIHdlIGdldCBpbnRvIHRoZSBmYWlsdXJlIHN0YXRlXG5cblxuICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IEZBSUxfU1RBVEUpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IElOSVRJQUxfU1RBVEU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgcCsrO1xuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgIGlmICghKHN0YXJ0UnVuICE9IG51bGwgJiYgbGFzdEFjY2VwdGluZyAhPSBudWxsICYmIGxhc3RBY2NlcHRpbmcgPj0gc3RhcnRSdW4pKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI0O1xuICAgICAgICAgICAgICByZXR1cm4gW3N0YXJ0UnVuLCBsYXN0QWNjZXB0aW5nLCBzZWxmLnRhZ3Nbc3RhdGVdXTtcblxuICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIF9jYWxsZWUpO1xuICAgIH0pLCBfcmVmO1xuICB9XG4gIC8qKlxuICAgKiBGb3IgZWFjaCBtYXRjaCBvdmVyIHRoZSBpbnB1dCBzZXF1ZW5jZSwgYWN0aW9uIGZ1bmN0aW9ucyBtYXRjaGluZ1xuICAgKiB0aGUgdGFnIGRlZmluaXRpb25zIGluIHRoZSBpbnB1dCBwYXR0ZXJuIGFyZSBjYWxsZWQgd2l0aCB0aGUgc3RhcnRJbmRleCxcbiAgICogZW5kSW5kZXgsIGFuZCBzdWItbWF0Y2ggc2VxdWVuY2UuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmFwcGx5ID0gZnVuY3Rpb24gYXBwbHkoc3RyLCBhY3Rpb25zKSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRlKHRoaXMubWF0Y2goc3RyKSksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgX3N0ZXAkdmFsdWUgPSBfc3RlcC52YWx1ZSxcbiAgICAgICAgICBzdGFydCA9IF9zdGVwJHZhbHVlWzBdLFxuICAgICAgICAgIGVuZCA9IF9zdGVwJHZhbHVlWzFdLFxuICAgICAgICAgIHRhZ3MgPSBfc3RlcCR2YWx1ZVsyXTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZSh0YWdzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHRhZyA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbnNbdGFnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGFjdGlvbnNbdGFnXShzdGFydCwgZW5kLCBzdHIuc2xpY2Uoc3RhcnQsIGVuZCArIDEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gU3RhdGVNYWNoaW5lO1xufSgpO1xuXG52YXIgZGZhID0gU3RhdGVNYWNoaW5lO1xuXG4vLyBDYXRlb3JpZXMgdXNlZCBpbiB0aGUgT3BlblR5cGUgc3BlYzpcbi8vIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9vdGZudGRldi9kZXZhbm90L3NoYXBpbmcuYXNweFxudmFyIENBVEVHT1JJRVMgPSB7XG4gIFg6IDEgPDwgMCxcbiAgQzogMSA8PCAxLFxuICBWOiAxIDw8IDIsXG4gIE46IDEgPDwgMyxcbiAgSDogMSA8PCA0LFxuICBaV05KOiAxIDw8IDUsXG4gIFpXSjogMSA8PCA2LFxuICBNOiAxIDw8IDcsXG4gIFNNOiAxIDw8IDgsXG4gIFZEOiAxIDw8IDksXG4gIEE6IDEgPDwgMTAsXG4gIFBsYWNlaG9sZGVyOiAxIDw8IDExLFxuICBEb3R0ZWRfQ2lyY2xlOiAxIDw8IDEyLFxuICBSUzogMSA8PCAxMyxcbiAgLy8gUmVnaXN0ZXIgU2hpZnRlciwgdXNlZCBpbiBLaG1lciBPVCBzcGVjLlxuICBDb2VuZzogMSA8PCAxNCxcbiAgLy8gS2htZXItc3R5bGUgVmlyYW1hLlxuICBSZXBoYTogMSA8PCAxNSxcbiAgLy8gQXRvbWljYWxseS1lbmNvZGVkIGxvZ2ljYWwgb3IgdmlzdWFsIHJlcGhhLlxuICBSYTogMSA8PCAxNixcbiAgQ006IDEgPDwgMTcsXG4gIC8vIENvbnNvbmFudC1NZWRpYWwuXG4gIFN5bWJvbDogMSA8PCAxOCAvLyBBdmFncmFoYSwgZXRjIHRoYXQgdGFrZSBtYXJrcyAoU00sQSxWRCkuXG5cbn07IC8vIFZpc3VhbCBwb3NpdGlvbnMgaW4gYSBzeWxsYWJsZSBmcm9tIGxlZnQgdG8gcmlnaHQuXG5cbnZhciBQT1NJVElPTlMgPSB7XG4gIFN0YXJ0OiAxIDw8IDAsXG4gIFJhX1RvX0JlY29tZV9SZXBoOiAxIDw8IDEsXG4gIFByZV9NOiAxIDw8IDIsXG4gIFByZV9DOiAxIDw8IDMsXG4gIEJhc2VfQzogMSA8PCA0LFxuICBBZnRlcl9NYWluOiAxIDw8IDUsXG4gIEFib3ZlX0M6IDEgPDwgNixcbiAgQmVmb3JlX1N1YjogMSA8PCA3LFxuICBCZWxvd19DOiAxIDw8IDgsXG4gIEFmdGVyX1N1YjogMSA8PCA5LFxuICBCZWZvcmVfUG9zdDogMSA8PCAxMCxcbiAgUG9zdF9DOiAxIDw8IDExLFxuICBBZnRlcl9Qb3N0OiAxIDw8IDEyLFxuICBGaW5hbF9DOiAxIDw8IDEzLFxuICBTTVZEOiAxIDw8IDE0LFxuICBFbmQ6IDEgPDwgMTVcbn07XG52YXIgQ09OU09OQU5UX0ZMQUdTID0gQ0FURUdPUklFUy5DIHwgQ0FURUdPUklFUy5SYSB8IENBVEVHT1JJRVMuQ00gfCBDQVRFR09SSUVTLlYgfCBDQVRFR09SSUVTLlBsYWNlaG9sZGVyIHwgQ0FURUdPUklFUy5Eb3R0ZWRfQ2lyY2xlO1xudmFyIEpPSU5FUl9GTEFHUyA9IENBVEVHT1JJRVMuWldKIHwgQ0FURUdPUklFUy5aV05KO1xudmFyIEhBTEFOVF9PUl9DT0VOR19GTEFHUyA9IENBVEVHT1JJRVMuSCB8IENBVEVHT1JJRVMuQ29lbmc7XG52YXIgSU5ESUNfQ09ORklHUyA9IHtcbiAgRGVmYXVsdDoge1xuICAgIGhhc09sZFNwZWM6IGZhbHNlLFxuICAgIHZpcmFtYTogMCxcbiAgICBiYXNlUG9zOiAnTGFzdCcsXG4gICAgcmVwaFBvczogUE9TSVRJT05TLkJlZm9yZV9Qb3N0LFxuICAgIHJlcGhNb2RlOiAnSW1wbGljaXQnLFxuICAgIGJsd2ZNb2RlOiAnUHJlX0FuZF9Qb3N0J1xuICB9LFxuICBEZXZhbmFnYXJpOiB7XG4gICAgaGFzT2xkU3BlYzogdHJ1ZSxcbiAgICB2aXJhbWE6IDB4MDk0RCxcbiAgICBiYXNlUG9zOiAnTGFzdCcsXG4gICAgcmVwaFBvczogUE9TSVRJT05TLkJlZm9yZV9Qb3N0LFxuICAgIHJlcGhNb2RlOiAnSW1wbGljaXQnLFxuICAgIGJsd2ZNb2RlOiAnUHJlX0FuZF9Qb3N0J1xuICB9LFxuICBCZW5nYWxpOiB7XG4gICAgaGFzT2xkU3BlYzogdHJ1ZSxcbiAgICB2aXJhbWE6IDB4MDlDRCxcbiAgICBiYXNlUG9zOiAnTGFzdCcsXG4gICAgcmVwaFBvczogUE9TSVRJT05TLkFmdGVyX1N1YixcbiAgICByZXBoTW9kZTogJ0ltcGxpY2l0JyxcbiAgICBibHdmTW9kZTogJ1ByZV9BbmRfUG9zdCdcbiAgfSxcbiAgR3VybXVraGk6IHtcbiAgICBoYXNPbGRTcGVjOiB0cnVlLFxuICAgIHZpcmFtYTogMHgwQTRELFxuICAgIGJhc2VQb3M6ICdMYXN0JyxcbiAgICByZXBoUG9zOiBQT1NJVElPTlMuQmVmb3JlX1N1YixcbiAgICByZXBoTW9kZTogJ0ltcGxpY2l0JyxcbiAgICBibHdmTW9kZTogJ1ByZV9BbmRfUG9zdCdcbiAgfSxcbiAgR3VqYXJhdGk6IHtcbiAgICBoYXNPbGRTcGVjOiB0cnVlLFxuICAgIHZpcmFtYTogMHgwQUNELFxuICAgIGJhc2VQb3M6ICdMYXN0JyxcbiAgICByZXBoUG9zOiBQT1NJVElPTlMuQmVmb3JlX1Bvc3QsXG4gICAgcmVwaE1vZGU6ICdJbXBsaWNpdCcsXG4gICAgYmx3Zk1vZGU6ICdQcmVfQW5kX1Bvc3QnXG4gIH0sXG4gIE9yaXlhOiB7XG4gICAgaGFzT2xkU3BlYzogdHJ1ZSxcbiAgICB2aXJhbWE6IDB4MEI0RCxcbiAgICBiYXNlUG9zOiAnTGFzdCcsXG4gICAgcmVwaFBvczogUE9TSVRJT05TLkFmdGVyX01haW4sXG4gICAgcmVwaE1vZGU6ICdJbXBsaWNpdCcsXG4gICAgYmx3Zk1vZGU6ICdQcmVfQW5kX1Bvc3QnXG4gIH0sXG4gIFRhbWlsOiB7XG4gICAgaGFzT2xkU3BlYzogdHJ1ZSxcbiAgICB2aXJhbWE6IDB4MEJDRCxcbiAgICBiYXNlUG9zOiAnTGFzdCcsXG4gICAgcmVwaFBvczogUE9TSVRJT05TLkFmdGVyX1Bvc3QsXG4gICAgcmVwaE1vZGU6ICdJbXBsaWNpdCcsXG4gICAgYmx3Zk1vZGU6ICdQcmVfQW5kX1Bvc3QnXG4gIH0sXG4gIFRlbHVndToge1xuICAgIGhhc09sZFNwZWM6IHRydWUsXG4gICAgdmlyYW1hOiAweDBDNEQsXG4gICAgYmFzZVBvczogJ0xhc3QnLFxuICAgIHJlcGhQb3M6IFBPU0lUSU9OUy5BZnRlcl9Qb3N0LFxuICAgIHJlcGhNb2RlOiAnRXhwbGljaXQnLFxuICAgIGJsd2ZNb2RlOiAnUG9zdF9Pbmx5J1xuICB9LFxuICBLYW5uYWRhOiB7XG4gICAgaGFzT2xkU3BlYzogdHJ1ZSxcbiAgICB2aXJhbWE6IDB4MENDRCxcbiAgICBiYXNlUG9zOiAnTGFzdCcsXG4gICAgcmVwaFBvczogUE9TSVRJT05TLkFmdGVyX1Bvc3QsXG4gICAgcmVwaE1vZGU6ICdJbXBsaWNpdCcsXG4gICAgYmx3Zk1vZGU6ICdQb3N0X09ubHknXG4gIH0sXG4gIE1hbGF5YWxhbToge1xuICAgIGhhc09sZFNwZWM6IHRydWUsXG4gICAgdmlyYW1hOiAweDBENEQsXG4gICAgYmFzZVBvczogJ0xhc3QnLFxuICAgIHJlcGhQb3M6IFBPU0lUSU9OUy5BZnRlcl9NYWluLFxuICAgIHJlcGhNb2RlOiAnTG9nX1JlcGhhJyxcbiAgICBibHdmTW9kZTogJ1ByZV9BbmRfUG9zdCdcbiAgfSxcbiAgLy8gSGFuZGxlZCBieSBVbml2ZXJzYWxTaGFwZXJcbiAgLy8gU2luaGFsYToge1xuICAvLyAgIGhhc09sZFNwZWM6IGZhbHNlLFxuICAvLyAgIHZpcmFtYTogMHgwRENBLFxuICAvLyAgIGJhc2VQb3M6ICdMYXN0X1NpbmhhbGEnLFxuICAvLyAgIHJlcGhQb3M6IFBPU0lUSU9OUy5BZnRlcl9NYWluLFxuICAvLyAgIHJlcGhNb2RlOiAnRXhwbGljaXQnLFxuICAvLyAgIGJsd2ZNb2RlOiAnUHJlX0FuZF9Qb3N0J1xuICAvLyB9LFxuICBLaG1lcjoge1xuICAgIGhhc09sZFNwZWM6IGZhbHNlLFxuICAgIHZpcmFtYTogMHgxN0QyLFxuICAgIGJhc2VQb3M6ICdGaXJzdCcsXG4gICAgcmVwaFBvczogUE9TSVRJT05TLlJhX1RvX0JlY29tZV9SZXBoLFxuICAgIHJlcGhNb2RlOiAnVmlzX1JlcGhhJyxcbiAgICBibHdmTW9kZTogJ1ByZV9BbmRfUG9zdCdcbiAgfVxufTsgLy8gQWRkaXRpb25hbCBkZWNvbXBvc2l0aW9ucyB0aGF0IGFyZW4ndCBpbiBVbmljb2RlXG5cbnZhciBJTkRJQ19ERUNPTVBPU0lUSU9OUyA9IHtcbiAgLy8gS2htZXJcbiAgMHgxN0JFOiBbMHgxN0MxLCAweDE3QkVdLFxuICAweDE3QkY6IFsweDE3QzEsIDB4MTdCRl0sXG4gIDB4MTdDMDogWzB4MTdDMSwgMHgxN0MwXSxcbiAgMHgxN0M0OiBbMHgxN0MxLCAweDE3QzRdLFxuICAweDE3QzU6IFsweDE3QzEsIDB4MTdDNV1cbn07XG5cbnZhciBiYXNlNjREZWZsYXRlZEluZGljTWFjaGluZSA9IFwiZUp6bFhkdU81RGlPL1pkNjlvUHV0dWM3OXEzUkdHVDM1RFlXazFPMTZLclpSV094L3o2azVJc2tVamJsY0dSV1RVT2hqQ29IS1ZFVUpaTEhDc2YvZmZyNjdlWGI2Mys4L1BMMit1a3ZQLzJrQmtINWVRQTZNOWpCRFg0SXd6aE13d3pYTmJ4MGZKbEIyMEc3UWZ0QmgwR1BrUUdMbmdZOUR3YTQ5V0RNWUN4Y015NStaUHhnUXZyWHVIUVIvek1OWmg2c0dxd2VMUFNKSERaeFdEL1l4R0Z6RGp1QlZHTXUxZEszVFc5aG9iWHo4b0dEbDRiM2d0cVpZU1haV29hck1HYUhyOVQyMHJEQjY3bHVEb2dWUit2ODRNTGd4c0ZOZzVzWlFlcW0xZUNYTjUzVEtwWTBZekpOUW04SEQ5UHBCeDhHUHc1K3dtdEo3QUF2bmY1bGNxRmxhZzUyQ081RXo4SEt6UXBKdHNZWG13cSt5NmFnd3pDRUVWK1Y4R0VpaWdsSU1NWVgvRUg1eDdZV1I0djJQVHA4VmJJb0lzcm9sdzlHR095SW54VGtJOHFTYURMSngzbVlGTDdXNXRVNjBuRW00bXpMallyVFVNMmtoOGtNa3gwbU1GdlBTVVR0YTBydFRHTk9lMmFLMDlRa1RGSUxsVGpCY2puVjRsU3Y0MWtQczhFWGFYK21xM04ydUFYTm50bUNGTm1CNXJBMk5BNHo5bDJTenloSm9zbkUwUXFyam5YdFlXbmV4dytwTHRzc2l1WFFDcGFOQXZOVXNDMHJiRFZ3b3RFcDAycGMzcWVjK214K3RacWJsR2xQRnlwVXgvV3Z6M1NxTmRFUTdoZm9oNkNTWHJSMlJDd2wyOUFTTzJnUVhac2VvVTRsaXdicjFVWlJybmpCNkZpNWJYQVhKem9lYlV6OGEyT2RqdjJUQmdzT1pITHlDVWttWHJxK0pJMW5wU0hPRDhsRHJHVHRFazMydWpNa0hxWEVHbFkvMW9YOFNBNE50aVltMTJDVjJ1S01nMVlzZWhzcmtpZVQ3RWlXeldrTEtEUENneVduWVh0QXJ4MFlyMDJkdHJaaGF4TTBZaU54d2FHVDNWbXlQem1zT3RhMW02V1A5Q0dqK0NZTHo2RkJ0OXBoMUFqN0U4UkRHaXlJRTQ2eEJyZHNVSzRnUDlXcmExTXV3WkJRclI2cmxpaldFeTFCUkthaE42eWtJKzNwSHFYOXN2RjRyTlZlcGYzVXZmR1VnNGR3STRWZkdxVFFNTG5RWUJ5dkRuRXZTa0ZZRE5kR1QvdkFPWStiMFBtcTBSQ3pjZEV4WHMrcHMzM3RvUFY4YzF1TE5HYkxPRFJqSjVVV1ExamVSMm1yaWJ3ZDdxaU9hR2VSazQ4QkZSc0NRdnlxUVE4YUJxZEhFdkJvakZoSHgvV0NIL3BZMlppcU1CcWtEZkh2R0NzWlNCM01hcmd3YzVyYSs1N0tEbmFCWmw0Z0VpcGpKSm1xSWZORTVxQS82clh4SmFUV0VGaGpYZW1QUk5FZ2k1eGVneFFhNU5aQXFpRVUxeENIaTBUYXkwblFQZ1VwWlQ3ZW8vaCtNY2taSzBuYU5JVGwzU2JKeXdNMnFXTkFMMUNJaGpDZlgxWDRTVTZmMmU1UkI3a0ZMOW9UQjcxTHg3MHhQclN1WnhRSlZpRUV5bFUzZXNaY1VIRTlnV3pRQjFZMnVONjdpYW1MVVNiK3RiR1N3ZFE1anNHVVE3Tjc2OWE1SzN2WUpmSzhSQ1NGUXZvUXF6MWY3QmNUSWJkVUlZT0J6QW5yeG5Ba2tvSDBxb1BCUUhwbE5HSWVvQ1R3eVFhVEhJbFFlemxKNWRhOFQwQ2FEVm0zS1kxTzFtazAxckcyRzZPbmZ1dms1UUh6TjNvbXhLeEdqR212TVdQSzluTkRQdW9qTitmVWpvNUJtOEdkQldxZFlOWWhtOW0ySDRmLzRVT2VoYWdZQ2hkU1lUWnFUQmxVcGV0N0NrdUVhcWF3SzVkOEtDRUwzOXBqb2N0NTBTZGpaR3dPS3dSd0ZSdDBNc1pxSXBTRVNJV1p5NmFOWlVWWnMvVXVZYkNjSjlQWXA0NlY1aXdNTVpJMzlzQnlGN3lRNmlaNkxhWTNRSWQxcFQrU3g4QXFrdE1iaTZFUldLTEZlQWZteWNyQWc0T1NJMEhpOUMvS2dyWU5pYTZCUG8wanFad0JnelBPVTc3MFlZaVZUeGwzdVZKV2JseENXYWRZYWNwSUVuZ0RKck5tcDN3eGJxNDYyY1NLK2FvTUlrQkVXY2ZxUjc2akFoeTRsdWk3cFVvNURLVFhXRGVPUS9PREhMeUR3WUNKR01qR2pVZEZnUTBDdlV5cXZaeUFGU3V5SVNETngzd0F2SWJGVGdOV1Erd1VFdnR1TzIySWpxc3lidndTblpqZ20yQ1JxUUNCM0tDUGU4a05PN2JVNllaWEx0YXIrb24zcWhrK1E3MXFDNTladWZva2cwVmtRb2gxaFduV0ZBcWFDV01oM0pha1I2NXBxWFBKcHhZMkpwVTI0L3ErdzBFaWMyeGdKR1lFT2Nhekc0TklsYmZ0MHVqYWlEaGppWGhiY09RaDdpUEJUN0NkRlFnU2tPYktDRTFLRTZFVGZKOVNyU0VVa2hPYkRlNkJaczBVUDZOcDZFS1ZXelRpQ2t5bWkxZ1FmbFpMbGtOSWpHUk5DR25sNnhqUlpMTE11ajJreVRTVWZJQ1ZWQ0JTQTlWaUxKOEhCWmdKbkdKekU3aUZxVzdkWkJnS0E1cjFDUlFiUEU5eXNkY3gxc2tMaUpHOEVZcFc2TlFGckNreGVEbURtZVpZTjRZamtjemN4V0FRYzhKN3Z6UFllN3k1S3dUeERzb0R5M2dkY0dOUm9xRGNvc3hBTkc1UnRrQzBsYTlQUGdHNHkwdzYySzVKZ05FWnVZbUlGU3o1ZVlxVllFb0VHVEJiTmcrc05uN0taZUp6dmZuWkpkZW4rVDdDWTFZeG1zNVFOVWEySnFxMjhzbkhaUEVlL1k0dk5FZGxWV3YvTzBDTktseXRnZlF4dUZvTEhhRzJiMVZzVURtb05XNW5WYjBERmxCaW4waXhRY2tPYU5VWXExYkU4VExVU0MvWkFpOEJiNGxCeXhtc21tUGRHSTVFc3JxTHdZSWdGcVMzU0twaHZyVHZoUS9iamZjdjVuWEFyYVdKMkNDM05BdElrZmJVaEJRM3ZpNEo1NWg2SDZMZXpMVGpZREJ3bDVEZmxaMG9OamV4Q0xxaUpqWFlpVkZsRDlhZzBrM1pSOElZYmZ4N0ZIWG5XT1FPWHVyWXBBeTl0TVluMlF3QytHTXQyMFJsd3hKVFA5R043YkxzbXFKZ1h0TGVpdjZSaG84WXVpVVJ3bmxjY1hSWHRIaFFOaDVoWVJjLzNleHNzL2tDbGV2SDJCTDlLS2EzZUU4c1Fwem5KM3BzWEhsU2VndTZjSXNwV3NuSkJJdXdva1BxRUN1QjJBaEFZdTJhYVNNY1ladW5QeGE2WWloekEvWkF4TkF5VUVrT05ETFNOWUhHbGE5alZLaTFER1k1R0pmampFdXQxUHpjVkVCakUvL2tnTVlXVXNUTWZvUVZMQ29ybnJyT2U3RE9EWnhNSzhMYUsxVWM4RG4waVIzN1dMVVR4aVF0dWdxOXZBSkZKbzdRd1dGQlBWZzNqaU9ockp0NkdDenNoOWJqb1Zld1ZBK1RocWVpT2lIVmc5YTdWL2JLMTF5bHdmS3JOSU5adVZYYWdsbFh2ajRKdFJYY0VtQ21Ic3pLZWlsQ3E3S3pud2ZwdFFVcm5GZjZnNk9sbnFJYTFvZFlFWlE4U2VBdEROS0MxQmFFdGdGUFQramltRnFrQ1djQTN4bUd1U0tlRXRwc0dJSEl2c3NkWEF6eGJNQnZyb1RxY0IxK1ByYlA3OWt3eGFySVVHbEhicCtBczVQR2dwSUhxRGNpRzRyRk5TeE12eDB4OG9aMVFNK3IyUkdXSEErRTJnVlNPd0lwY2pCMGgwOFJxTEJqQTZpbzhWTUxqU2NCWVQ3R21RZzRLU29nbG5udFNYNThhZEZTbGdjUkdERmRYWUZIMnZRUlI3OHdRaUNSS3d4a2EySDZiVHpuSm5HYlNDKzVxMzBKMlVzTVZzNWdRWU5ZTjRZamtTeE1UUWVEQlRYandUSzB5a2tFbjUzRHlMVkk5K2JuaXMzT0xjeXJuYUQ5Q1piMHJNalg5MlpvWmpabFR3bXdzK2xNM1dHcW5VTjdPeGdZMCsxNFhrK0FCbG84alljQ2dqTHNURTRrV2RSTkxXQlVYc1RvK3M0a0xUMW0zK3doZ0ZpNnVrSm90T2tqam41aHBKQVlWN1Nxeng2aHR1WllqWlpsbjA0MTJ5OXdyUXNnVldLd2NnWUhtbk1ScVBIblVKdFRwb2ZCZ2E0UU9ZNGNEY01zT1JhY1NYUWVNL1dRc0JNSE00cTFRbWdJY3VLMmszMTQ0elVpbmpSQ1dJaUtjYzhNMUlTNGtWTlVxQnhzSWtLeFlGUE9KUjZLVnZtM1MxdGp5YjRiVnNKVHJmaUlBbG9yQ0NianVUSXR4MXFlZUMxbnNCbWo1UVpzdG5MMVNiWm9UUWd1Y1VWYlN1bGdMOFZxOXJUanNGMm5KVUZBRitTRGphNkRPajJqZG1zQ3FkajAwY0ZlNTJCamNUQUJEaFpFMVkvRG1kTnoyVk1DbDV4SlloeW1namtPdFdOWG1BNjZhTmtTN01xQmlVUVJ3ZVlkUkJxMWlJaEsxeUxHMXJ3ZTJ1REtrUzFsV3FQSVRicTZZajIwNlNPT2ZtR2t3QTFYdEtPZTArSGlOUW1Fa2JUclRDTmVMcTN1RXBDU09IUUhoOE90Q1hlYWxlTklLR2ZtSGdabkU3d1JqZE8yakxQa1dlRVEyYW5LMUl1SmFibERyTmc2a3BZNy9CSjI4MnQxNjFlTXd2bitkUld6aUR5UlQ4N2piSWgxNXptY0YxQmFENGV6TUljV1BSVWVxSVlkSEwrOWVTS1pjL3VKTDc0NFpuRWNsRjBhbDNBVmg4L1JnRnBQb09qdVdUNWtCR0xZTzJnWmdNTjExQVJ3VnNadUNUY3pPNXNRUlBOR2ZCOWpKZkFId1NTY1c5Y2VIZ3FNZDZLWXZIR2h5azNGODBlaUVKbHhua3FXQXpxTVpDeWdrL04xakFqMnJWa3dwSFJYZzhHQW10a3poWTFXc0VuSWRHMktUaFErS1Y3aEdVREZLYndGVUsxOHZmSXQraE9DT0Z6QkkyVTFwUU8zaFJYeEVrbTd6amZpMG9LeUQxYkJWamRNNUNUTDh3bEtjRDdFU3IvaFZ3TUpicnRaQlBtZTg0M0hXaXhVaFVoejYxa2hzNDZmRW9QSWNCaEdOaGFIeWZrNnhoUlVmb0NwUGFxd1MxaGlOODJVbDhJOUswZ2taTG8yUytjNm4zaWRaOUFTcS9NR3RMVHk5VXE0YUZDSXZYREZrQWVvNER6cFdCSG1rTFRyNkQwSmhySVBEY0ZXMTFFSmprSGRrMjhyTnR0MjRNVWR1djRBUGRRUGozSUJ1bDZDd0FwcWNmRk8wdEVCbWh4dDJlRVpUR0hkeUtNTk5UN2pScE5rUXpjOHVrcTIwVlBaaXNrWFp0K3M0YkEzd3gwOTZrNzFDUjRuWnBIb3FVWW1ZU1U1cE52OU5VYXM4WUE0RitBN2N1amRUYnFSaE1kOG1ya1RWYVRoVkRvMkRTLzQ1S1BDTC94blp5ME94cFhkUmlsejkzYXlRL1A5RlNhUWNsMmJxMU85WS9ETjZUM0hGaGk5dDdDRmphOVR3a1dId3VTYlhRSE03V3czMlZodEt5NnAxOHZVekl3eXl0NWtHTnRkdCs2elhQdnVKQXJUWmk2Skt0SnRwcU5tdXIweDlpZFJEZ0krckpaUG81alprRUFzdlJud3h1Zlcyc0dEUVFIV2plZFFNZ3oxT2pqY2pCVy9Yd3hyQ09JcU56dVJaQzVHNXc2RG5IalhvcHJKZVdLbHU5WE1GR3RrNnRaVWkwKzBIRVFyWHVGVHZXQnJVK1NvZ2xjV0twdDFlM1YrVkNIUHZQZGNIYk1YcnhyWlM1MnNlNGdSa29Dd0d5cHlWTUZyUlFYTWl6VDM0b3FadWU4bytQWmpRUEtwdXpWRVYyeUE3cldCQ2pNRTN0cmpYYnl5SHcvVzUvVlk5cFNTTWE5amRuOTRjenBQMi9aRUQ2TmUzM3BvUkozcGVhT1NnQkFFZXBpNVdrQmpxWUI1a2Nic1hMR2FuVHg2UW9TcUZWY3BoS0hlaEZqcllMY09RdjJHWlR2OEQzLy9iaUhLeFBHR2k5b3hCUGZtT0c0blFyRnhlODRsSG9yTjcwVTJ4NUxkQXlzai9kWjlSWm9iclBtRWpPZkt0QnhxR2JjZ1RzdFpCa0sxM01wQVZxNCt5VnFGSEVXK04yUlZiTURxSVJqenNEdzlyRTl2eWMwd2p3OXBYSTQ3VjRtTWx4emR6SE9aUGYvQktOQTN6MlRYK1krSHExRkV0TXhzV0t1SXpsQVI4eUtOWXJsaXlWTVBVNWNTdkc1cFFSaTE4YjNYQURiMjdXSjFyZ0ZYRUZrYlcybHBOaGZpcDhSbmxpcm44VGo3bUFkc1BFZVNlUWlCZWpnOEdpT2V4Y2I5Tk02ZVJLNTBiNmZubU9wZWlyeUJqUnIzU0pOci9ZaW5SeUtQenkvQmlNbWJXRWxvUnVJbHY2Mk1FUlFjNFdJbU1sdW84am1CbkpFTE5XUFU2Sm1zS1E4MnFXUnNzRm53ZFl3b1pMZFJEb2Ewd3o1bGZOcThJMEpEMmpVUUZqSmRtNklUaFd2Rktyd0luaG1GdDRMbmphOVR2bFlaUzNUTjQ5YU5ZU0YrbmNJemh6ZEpVT2czM3dBcG1vL0lPeE4rTGxTNXdrTHJ1R2NNamdQakNQT1ltc3JHeHRRRm4zeE1vZmltZEh0VVlROWt5emk4ZWMrQWh1NXJ3QzlrdWpaTHB6ckhlSi9UZVo0bU1EcHZwUWtiWDZlRXJUS1QrMVEzaFp1S0RUWTkvcXdFV2lFK3A4dVhIWGo4ZFllcDdDR2xFRDZrcjJtMmdmZzgxZGh6RXd5emZaQWxKeDRHaDVKQmpPNUhYVWtHd1c0dFdicHVVM2cydXFWV1VSMEp6dnorT0JPTEo4UmFNSzRuencveGlEcXcwVzBNVk1meXNVSHBlaGJmVXVuWStMYmc2eGpWVkFEaFIrUEtYRWtSRkxjaGJScEllOEZaSVJKS2Q4L1ZxZDR4K21iMW5nWHRqTjViUWZ2RzF5bGhxMmp5eGRYRi9JWGhNMWNjOHpCRUQ1ckc2dVlHemxDSDVWT3ovU0w0N1ExazAvVlcwTWh6K0MwdkZJVGpOMFl2amRnRm42TUVaamJoQ1R2eVdIRS8rZlZuVHFvdzFrL256M25KUTlrOStJMjRaUG9GbVBQbzEwOVRFZy9tZTFaRVBQeHhsa3E4aGU5V2o2cDRmNG9QenNGNEJFVHdZSWkxUDhXSHVtaFg5cFJpSjc4ODBPUUlGOHlqckQwdWk3aGdkS0NDd014RHFwTUVCRCtqVk4xUndMSFdBcVlQek5uUEhsWCttSDlFUDNyWCtpSDk2ZnJta2VzT09JZWNzWWhFS3AxeEMvZWk3bnQxK1RLZVd4VTFtb2FpdGdDQktLb1ZIeVNXRHBIdTlWQ0s5VThCbjZJTmUxaUFMU3NvVDM4MkxHdy9ZVkhGTFVFSmNLODhkTm5ESFhUVVFiVndyenJjQ1dwT0l1TDNSRFRCdlFMK21rVXRZbDZrcm9ncmlBZFJ5dEE2b3BOTERldjM5QmVxcXIyeDlmaDYzT3pyQjlpbjY1dUxvSjF3SGlKakVncFdlb2RtZ2s4ZHl1cUdoRXkzcXd3YTRsVzJ1UzFHWlEydnRUQjFDQmJpSTdZRnYxMVZlYnIyazh6UmFkWFBNay9YZDEvSDlNVDZ1cHhQTG1IcDY1cHBOSFdQcTFNVk1qMUhmK2hUZWYzdHJwanBxZW1LVjc1ZUNYdGNRSWdQb1JYOHVsQzE3N1VmeFl2N2VmMHczblI5ZHdOTVQ2d2J5UG5rRXBaZW9KMnlVYyt4T2h3cDE1TTBHSi9MeTJsdzkxS2NCbHRlYXVYcmxiQlZmUFhBWk1IdkpOWmI2Z1dybG8vZzUrSFR5NisvdnY3M3QvLzYvTnVudi96MG55OXZYMStIYjcvL2svK1RQajRoRXZ5NTBNSkRuV2JNZFR2eUlUMDJlTDVmeVNCdkVmNlNERGQzOTNDZmo4N2R1K253em1WeHYyNDZGZmFCb25SK1RJVjRWSlQzSFBGQlgxZHQ1ejFWOWFTK0xsdnNZYTl5WFQ5VmNVZHlYZnIvbllyNVFNMmZxL2Q5Skhwa2dydEg5OTdxNk83MHF1ay9ZMTIvZ3dLZVkzTFhSWG5DeHpmYTZKVk9Ick1PaVNGQWV2UHQ1YmV2a05uOEJPblJwMTkrLy9MMzE4OS8vZlh0bjErL3ZmNytDUy85K3VYejF5K2ZYejUvKyt2WFA5N2VYbjU1ZTQyWC8rZkwvNzYrbFpjWVpub3B2V1MwM0tXdjMxNCsvKzNsN2N2bjF3dk04dUZ4UGYveGoxKyt2RW1ZK2N2ZERCOXhtWmxXZWtsTStPeExsMmVkdFV2eDFTZVl0ZHpTK2N0TC8xMDhUNzE4ZWZVTmo4d1hzMGdiUzFlOG11OWFXamYyOElOc0psM2J6Q1A3d0lNdGZrYzcyb09lOVdOM3YrZHNsay9jcEs1ODhxUHN2OTNqZXNTZ0h0NHQyRTMvdW5PUW1wYklMWHd2Y2QvdER1UWovYzZ6UGRMVDQ5aGJmTTU3dWFpN0hkZTl6dWRtOTNhblA3cHJjLzFZdC9TUjN1d2RIQnB2SzNkN21lK2Q3aEhFNHRtNzhkMXU2MzA4MTBjQUgvME81RGsrNU9rWng0ZjdnUS9ic203ZjI5OW5leGZ1UTAvWTJ2cGFmWTRBNzlUazk3WkZ2K1BPZmY4VytUM3V5Kyt5a1Y3ZkZuNElwT0x5ZHZqaFMvNkhhZlh4YmV6NU85RGhHcnQzNmZjczBadlg4djFCMFljbGF2VDFZeXlHZDFwZkg3YVdudS83LzAwYyt6dXM5aitwdy81M2NrMS9kdnoxZy8zTGQ3V0hmby9HODBnUDM4dHMzN2dIZGR4QjR0cjQrZi8vQlZvVFlkbz1cIjtcblxudmFyIGJhc2U2NERlZmxhdGVkVXNlRGF0YSA9IFwiZUp6Tm1WdHYyellVeDcrTG52bkErNlZ2YTRhMEs1QnNXTGNXbUJFRXNxTUczbXc1a0pVT1E5SHZ2c09MTFVwMm93c1Z3R0JDbWo4ZC9ubDBEa2t6eUxkc2xkZkY0NjVhRi92c3pTTDdOVVBaTDdjL1EvMFJmdCs5aGNyK1h0OUFkZlh1QTlTZmJuNWFmblh0Yi92YXRxSHJlMWMzYnpmL3VtNVYyTWIzM2p0Ny8va3FqRDkwN1R5LzIvbit0Qk1GMFJzLy9OcWJYbnQ0N1VlVXo1dU50UTg2SHc4emhqRi9mYjc5NEJwYnU4cjYvc2xPYzJ0ZHNaVWJlb2V5aDJLMTJ6N3Q5dXQ2dlN2aC9iOWxWR0FGY1lDR0ljb05CeVA0ckk5SUVHT1IxZzVwclJBMW1EcGt5QkZwcFQyaWtSVUR4REN4QTZIaGlHRXNQVEllaVFaUjNGZ3hZaEhoM0NMQ0tXSkVXSGxHcFVOVU1zU29GZzRwNHBEQ0VhSVJraDd4QnNtQVJJeU9vemwybzVuUkNDcnNFZlBJUklnZnJUaHhBd1dYRmdrT2J5VVk5a2hIS0ZpWkdEV21BamRjdUFCSTVqeVVraUQ0YkJQRGxIU2VLQTJlS0dtendJeHdWa1pBVEl6Z0hxa0lTWStzSnh5U0FVaHFqMHlEbkduZ0VudHVJa1FhMURJMXpVUU9TZVB5QVExRzBramhFZk9JUmtoNnhDT2tQQklSTWg3cEJobkdIVE5NQVRSVUJTb0MxVWVxTUhjcHRpMUJVTHQ0Mlo2TXFmYTJtak5ITmJkVWN4b29qeWs3VU5teXRaNHBnbzBOc1cwbGd0cnJRczhFcWdMOWpySjlEVWZRSC9seVU4Q3pCVWF6bFR1MG9BajJDK0pRQkJCd0JXbGtFTUdJRUVRb0lnekJIb09kUnlROEpncEIrdTBUZ3loR2xDQktneFpsdnZFMXR4Vzg1eXpPVW5uMGRxS0FQWEhhL1ZOQmFxQmk4QVBiQjBJQ1N4VE9GdGhkc05VVlluYlJJKzR0SVkzd0FNNFpEb0dEeUltZ3dPVlJqQmxQMUV3aGFQTFY5QTc1aWkwSTc3NTZPMHY5aXJpamVCTExzWUtISmVYY293TjhEQ3VwLzdYTjROY2VLSGxtNVdPLzhISGZ1byttRmkrRXdFdlBIb04wVGFLN0Q4ZVgzcldVdmpwN3pxZFhUUlBBTVRFZGVLVE80ekxYTFhIYkhTek96Y2lBa01NNU55Z2laM1Q3eW9SRHExZVMvUGpoTkxtUnF6YTJTTno5MDR0d0ZYbnhsRTVJOVZ4dXBxcDF2Ky9Udlp0WnJ1OWxvN3RJYk1TNlhuUXVJQU5FVHpTN1pieGtmR2R5RThnQnJrWjNwZDRBc0dhZHpTZDc5bzZIUjF6eEFsQjlBZkg2cnhLUmRGMys4bUlZVkFZc3Noa1c3bHczODZTME1URXl2bWVrQlcwNUQ5M2h6Z3MyeFhzK3l2MXo0bjFseWpuVXE5bjlra3pYRzcvZVlxTzV6NTZrTFAzNEc3eHpGWnoxRDVpVWErWlo4YlJ5Y3BOSkV1UDlLZXZzM2ZtL0xsSU9oN016Sk1UakdPRTdsT1dyVmZGVXI4dkg3TTNpUzc3WkY2aXVuaWRYNlFxWFZrR0k2dnpSL29OZ0FlSFBsdFh1bjZLOFgyMmU5M1ZSWlJhdHk0ZmlxWUNxckZ0OC85OTJ1ZHUwVVoyWEQzbjEwSUpuSkM4QlhZb2YwMUg1dkMycWZOTm5OaVovQTFONmdmRHJ1c3EzK1QxMHQrc3lyNHRMOHUwMTRQUWxBbXhaVlBkLzc5WWxOTWtCTzVuaTd2di9MYnlKTGc9PVwiO1xuXG52YXIgYmFzZTY0RGVmbGF0ZWRUcmllJDIgPSBcImVKd0JkdytJOEFBUkFBQUFBQUFBQUFEWVlBRm1ENW53N1oxN2pGeFZIY2Z2N3M3T3pPN003blFMUkFoaVVTREVVRzFBSXJZVUZwQmdDb2xZVGFSVlVVUUppRUZRZzVBMkNBaHFMU0FQUVV3cy9DSGxMNHIrd1VOandiUVNFU3dRVUNGZ0ZMQ29OUVNzVVFLaUlIN1AzSFBtbmpsejNvOTdaMlYreVNmM2NjNDk1M2Qrdi9PK2QyZVgxTExzWUxBTUhBRk9CcWVBVDREUGduZUQ5MFk0bmc3T0JsOEM2eHllV3c4dUF4dkFOZUM3NEdhd0dXd0JkNEo3Tk05ZkFDNEdQd2UvQXZlRFI4QVQ0R213QlB3Ri9BMjhET2JCZjBGOU1nK2J4WEZQOEZad0lGZ0tEZ01yd0hIZ1JQQWhzQWFjQnM0Q1h3QmZBVjhGM3dCWGd1dkJKckFaYkFGM2dxM2dQdkFnZUF3OEJmNElkb0hkNEJYd0JwaXNaOWtNMkF2c0J3NEVTOEhoWUNVNEZxeXE1N3F2eG5FTk9JMWVuNFhqZWVCQ2NCRzRIRndCdmtQRHY0L2pMZUEyY0FmWVdzL0xmUjg5MnZJZ2pmOFlqcjhFVDlIcngrbnhPdkFNemgvaW50bmxtSWNOejNCcDdzYjVLK0FOMEdoa1dRZThCU3dCQjRObDRJaEdmM3h5bktmM0hnWWZ3UG5KNEJUd3FVWnVyek54UEpmR3VZRGV1eGpIYjRLckczbDltcWZjaU90TllETzREZHdCdHRKbjdxUEhIVGoraHFiM1ZJUGFDc2MvTi9SbGZkRVF6dHY0SmNUZFFlL2REVjdEZGEyWlplMW1FWGNQbk85THIwOENCelFIMHp0RWNpK1V3NXA1MjNONVprVUNQVkp6TkhRK1hxTDM4K0JhU2Z3VGFWeldGbGZqZWkzNE5JV1BleVN0YjUvajdxL1E2RUxxOWhlNXVOK214dzFDdkF1YmVmL0w2N3FPUHZlMXBseHZoaTVzeElnUmZqdzhCRHFNR0RGaXhJZ1JJMGFNV0hnY09RUTZpRHhIMTdyZmNsamZyMVRjWDY1NTVscWtmejNZQkRhRExlQk9jQS9ZRGg0QWo0SW53Yk5nVnpQZlc5cU40ei9CZjhERVZKYTF3QnpZQjd4OUt0L1BlU2VPaDRMbDRGaHdCaTNMWmk3L1ZiaS9lcXA2ZTQ4WU1XTEVtd215YjdrV2ZlLzdhc1UrZlZWVWJZc1JJMGJFNFFSdXprcmVjODZEMDlEUG5BWE9FK1o2RnpyTy9VNml4M21heDFIZ2txbmlmZW9HbkY4dHBIbkRWUEZlaDRlOGw3a0pZYmNPd2Z6enRVVTVLK2RnSS9DVFJXWTJJTjREaXJndjRQNytpN05zRGJnR1BMcTRQL3ozQ0cvdWtXVjdnelhna3VrczJ3YXlWcFlkQXk0aFIzS1BIbmZTSTg4NzJsbjJ2YkdjMDNIK2cvWmduSjI0Tno1VFhCK0g4MHZCZGpBMmkzVUJ1SFMyU0NjVzIybWFyK0s0dkpPZkg5L3BqN091ayt2MDA4NmczaU5HakJneG9oeitYWEVmSEh2OGNXSEZvdXJ6bjYrOXVia2MzSTU1NEYxVGcrdFI4cDNQdmJpL2pac24zby96UjZieStlZ09TWHJzKzdzbjZQcWFuRDg5bFg5VFI5TGJTZE42WHBMZkVwcm1QeEQyTXZjODJ6ZDlmY3B2L1V5K21TTGZUQndsMFhjU2JhQUpGazBYYytPOXAvT3cvWEU4R0N5YjdzL3ZpT2xpSGo2UDh4UEFCNmVML0ZpOGo5SjduNXpPdi9zNkE4ZlBneTlQRCtxL2ZycTRYa2JUdm93K3YzSGE3TWQ1cXJ2TVBzUitEMG5DaUYydVE5bzNncHZCTGVBMjhDUHdZM0F2K0FWNENQd1cvQTdzQkx2QWJ2QUtlQVBVV2tXYWJaenZDZllGQjRCRHdLRmdPVGkyTmFqRHZkQmhGZTZ2cG1GcmNUd1ZuQ0dKeStLZmc3RHpXOFgxUlRqL09yZ0svQXpYTitCNEV3Mi9GY2ZiRldrUlNQeTdXb00ySTV3cXFXL2RQQkYvTzNnUVBBWWVCMzlvNVh2L2Y4THhoVmIrL082NjJXY3ZJZTZyWUF6cmhUcG9nYmwyRWI0UHp2Y0RCNEYzZ2ZlMGk3S1pPTEt0RGlQNnZiOWQvbnBQcklkODJFa2FmWTYyS0s4UFpaZGZ4a2MwZmlxTFdHVWgzL0pXbFQ5cGI2UVAvRGhuVHpKT2ZZYXJWMmZpL0p4MjhiMXNLanV1YThydm4wOTFXYy9wZUhSRSt5OUVkTzlwWTdETXMwNldpYWtNYkd5L0RQVm1vMk8vUFF6dk9WektmdzNLZDBNN1haL3Zhbi8ydmUyVml2RDEzTnh2azZRdjU3L0RKM011MmJ5QWhkOU5qK1R2bWpZanJTM1UxM2ZnK0VPdzFjSDNMMXI4ZmMweENmNk9ZaHQwZkdBSXhqUmJIb1d1VHhybVNzKzIrOGNWMnpxMXpITHVYaVVxUC82MTNSLys5eEo4K2k5YXYxL244aUx2TUdSclRRWnBJNU16V1RZRDlnTDdnWU5tOHJDbE0zYmw1Lyt1aWJUWGplRHdtYnp0UDhlMUkzWitGWjJEcjBTYzQyZnlQdmJFR1huN1Y5azNOVVQzRDgvMDMrUDdJdElQcmVUS3ZwSDJZMlM5K0RIT2JwZHp6NXhPMHpzYnh5dHFnMm1maS92blc5aDhtS2pLUDZsWjIvei9MaC9QNjVweGNVZEpPZ3dydjY0NC8wY1UreWhsRWxvRzNmaXpFTGhJR0FkYzdKTnFyYnlRL0wrUUlYWDNiYld4THAwc1czQ1EvV1grM0lhcWRSNVczdXhTdGYyajFVMzZleFlMUXRjaGhva3AzQlN2dzRXYjR2bnFXYld0RmxvNWJIdzJUTWowWFVqNjY4cWtraXAxOGRXNUt2Mkh2VTVVYVpPeTY0NnRWSzMzUXZWL2pMU3FzRCt2dDJ2K0tTUlZHUmRLV1dhYi9kVEdJekFXa1VWMjhhWWFPYzBKbEdOeGZqN2VLTzY3MEt3VnozWnRORTJoTnVMakduV2pOcG5pMGlPNHJ0TzliZDNxOTIrbVM0dkNSSFh0NnNQdXN4ci9zbkJlWkdrUVlmNXRVLysySmY1ak1rN2pNR25UK01TL1luNHlhVGNHN3cyVVNmQnZMNTZsZjFuOWRtbXY1TWpuWmV2ZmdiS1U3Rjh4cm5oT2hQaVgyWjc1bHlIelQxdmhYMTVJMjlXSnFqemFaeXo5Mit0WHh3by8xK2JjeGdEWDlzdDhxcnd1eWIrMjdWZUUxVzNXcHBpUFpmNE5IVXVaVGNTNjVOby9hL01ZNDhZUVVKOG9JTkpZSVAyenEzOG5MZnJuU1l2Mks1TkpSWjhRdTMvdVpFVzdEWm5Ic1g2N203ZEYvNnhyeTZxeGtwMkw5MlR4eEh2Sys1YnpMMUg0dGl6cnY5bllQQzYwYlVMZHNuM0wvSytTRk85RlpDTE9wMjNtMUYzOURQNk8yWjVkL1VuYU0vbDlhQkcrVGZIM3hldTZvVDN6eitucUZHOFgvaGtYLytyRVo3MmtuWnNQZ1g5VmNabXcvdHJHdi93MU83ZnhyOWozeXFTbmF3VC9kam81UGlMNmw5ZXBMUDlxc1d5L0JHWjNOaDZySUdMcWo3czJWZmlOMFc3bzJ3NXZrOUQ1bGdsVHYrWTZuN2FkYzh2c0VnT3JOQ1ZyYWRzK1h0YUdWZnNqTEl3ZDJWNkpiTDlGSmE3OU5iOS80aXF4ZmVFTFc3ZmJJZ3A1bm0rbjQ0MytmU3B5NU5jV2hHNzdieFp4WXF4cnhEcXBzbkVLMjV2eURMRjNkejl2TG9lSnpON01GMFJFZTllem9sL0pIT3l0cXFzcDlxZDVtaFJsUDJxN2orVlFyL2o2MnFFMkZQTWxKcG13OEhHS09xYnJKek9QT3NYYUlHdUhaRHdtOWFTdTBuM09ubTc1SGVLbmdMVUhIZnpldDJ3ZDVWTjNaVkoxSDkvRmNyNmdxaXV5Y1pUVW5lNWNuYXc1WnZ2N3FoNGtiNWQ5RGE2ZjUvYzZaR1VZNkNkMWRYWXNqOU9heUdGeDJMUHNQZytmbGpFdkcrWUdiU25MbDlDaytYZjFzTFFmZTFaOHIyT3E0ekxwQ09laHlOS3hTVDhMZkQ0MC85VGw4MG0zREhoSm5ZZHZlS3J5aXVLemJ1NCtKOXl6V1lQRXlsOEduNzlOdVZQbDd5b3g3RS9FTy8reXhtaWJmWlFJZXdMTTk3cjlGeEYrcmRIYmc2RmpmL2Q4Sm9mZGw2VkI1Z2ltL1JnQzJ4dnEyVDl3SHpXMER5aXIvNDZSZjJ6OUNWMzdsdFVHSk8zWVpZM01yNU9ac1B2ZDl4NmFOWU51ajBObVQrczFaa3liZU96OXVZNTNBL2J6OEJrdnF2VUV2MWVrV21QSS9DdkM1cjFLL1IzMkFxUitUbGkvWldXUGtyK3FYckJ3aVIyN2EzL1pPbnJXYjM5QnRTOUkydUhBSHRWRS83TjgzUW50LzBPZjU5KzlzREhQZS94TlVJZEUyNW44SWQ1djFmVHArOXJUWjZ3aGRiQ1pGWHRSTWx6SFFXdS9wUnpMSk9PTXpCZWtyZlh0bll6WjI1dk1tNlI1S3ZvRzIzcGpHaDlGR1pnL0tHeWhxNU82L3A3ZnQyeE82UE4yR2FmNzZqaW5iK2o4eVRUZXBreWJDUCtkVjBlNHRtYXhnT1Flc3hjSjQ4OFpxajQyaG4xdDdXVGE4OVhwWTZ0dlpqanFuZ254ZjRxMGJmT3p6Y05MbDBsUUw2NWpqRFUrZXZUS2JiR0dsZExJblA4RzJOZDN2SVQ2Mi9TdHNrbENkSStodnk3dEZPS3FVNjBkdDR6S2VwdVlWUG1FMmxnbm9mV2lMSnY2NmxCMWVHeGIrTnBJSjJYWHg5VDFJOVErdzFSL1hmSklVVGRjeFVaZi92MDF2LzZzUzliaC9OL3BwTngva3IwYlV0a3cxUGRKMTlrNlRPdjljYzJhV2JhR0hTdSt0M2FwYzlIK3JqWGhYb1hMUGgvNTJ4aisrektWOU9wLzZINmN6L3JWWmsxTDBiVmJsLzNJMHV1emhPWkVRYThjaWZzUDNUNk82L3ZYRHRkZXRIdDRLcnRFdHJsdXo0emZ5K3A3UDFIekg5ZEMyb3ZPMzZ5ZnR5cDNRSDNQTWszOVROMCtMT3FwdVA4b2UvOWhrcEJ2RkRNUC93NzBTNEcyR1VoRHNhOUN3bHIwWFkzNGZWeHMzNmplRFlyMzJYZTY3SmhhZFBNNW03TEt5aVJMazMxVEdhS1hhVzdzRXE0VGI5L3pkclB0RHd4dHlqUWVrVEt4YnlSNytnZk9SMXptd0tGckhkODV0NHZ1cm1XTXJiL3VmcWFJVzZhT3ZyYVdTUlg1aHBhM0RIK0hQRzlUM3RqbENMR2x5YTRwd2szMnNiV1RyZmpXSjFONFNIMEpUZHRHZjlmbmJleVdxaTdHeU04bkRWbVpxNVRZTmczTnZ5eWRVL2srbHE2MkVwcGVDcnU0cE84aU1kcUtTUStkYjFQVkgxVVpxNmkvTHY2SldZOUQ4Z2kxZVlxOFhIU3FJditxeW0vS2s2eDdKNFZ2WThtUi81MHFYbGc4OFhmZSt2YmtOTmVwWUZMbjlxUUh5ajRidGhhWDJTOW1HL2JKeXpaZjN6U0hxVjJsTEkrTHpWd2wxR2UrYWNmS0l6VC9GRDd3TFd0b09uMi9oZFhKR2JwM3JJYjlieGwxdzNza1VhemYyd1QwdFNicGZwZnU4MXZPa2Uxcit0MWw4ZzZiZjBjYTJrWTd3dmt3dHp1dGYwcW8vNmEyb1BNZCs5c2tJcjUvbDhMbmF5Tmw5aE5pbmJTUktMK2RudEMvcnIrQlR0NmY2NzdMSUxDL0JlSGY4L1Q4NVZrdmVKdkg2a3Q5K3RSWXZ1cW1sV0I4SXZXTStJaDluNkd5SS91T1hLYy8wMUdtcTYvK1BzL3IybHJWYmNnRjluZFN4dkZ2UXQzL2hkWnAzOSt2NU9NTjJENnk3L2x3VlZ3aWJOM0svcCtEQ2liaTcvM3pmUm9UWFYxVCthU1REZmJ4WXQ2NmI5LzYvR01JTjBtS2V1c3pUckR2RUJuTVQ2WjVrVXY5WnI1aVk0N3Q3KzJtN0NOc2JLVUs3N05YVFc0em8vOEQrNGRVWldjaWhzdktISE9OUEZDL0JKK0wrc1h3dnl0OCtkbDh5WGV0ay9MN21SaHJNYVAranVPcDdaamFxaFcvNDZiTnY0UjFlS3p5aDlMTDArS2JMVk83ZHJXZmJ2MlhhbXlTOVRNRCtqdk9oY3JlSTJHaUt4cy9ab3hMZkpSUytEN1ZST3I2TFJ0aituNlhYL3htVWJIdTdOMjMrQWJVcGZ3eUd5akhMY2Z2bWZ2S09pdXMvUlR6c0NyRVpsNG1qWmV3dnVqV0VhWTVXNmh0WSs5bitQYXJMbU9HNjNmMnBtK0dWWFBFMFByRWgvZk9TNnhIdklqMWlaM3o2eVVXMW0yL25jSitNZXFQcS8ya3RrdThONmxyZi95NTJNOXA3Uk5MeDliZzNNaW1yY2RheC9oSWpEeERkVW1SdjRzK3Z2YU5OVWFHK2p1MFBzUzJkWXg2R3l1dFZQcVZsYjZOaEtibHFzOHcrajZHdnFiNFpZdE1KL0dhdis5ak01dG5mZEtPVlRkY2ZXU3JzMjA0TDZsc0ZDSXAvQlVxWmRRbDE3eFVjVk5JcU0xVDJDUTBiUmQ3aGFZWitsd01pVkZIUSswbzB5ZkwrcC9YMVcxVG01Q2xxZE5OWlhQVlVaYW5UbitiOUdUUG04cG5XMzZkVFh4dEc2dHUyT1NUTW44WGlaRk9xUDRweWgvRHRtWDRJblcrb2Y0TjFTZTBIRlcxaTlEOGJlcTVhejZtdUNuME51V3RzNWVQeFBCblRQK0h5djhBS1hSTDZBPT1cIjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRmKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRmKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRmKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkZihvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGYobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRmKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSQ1KHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkkMihvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG4vLyB3ZSBtYXkgYmUgcnVubmluZyBpbiBhIGJyb3dzZXIgc28gd2UgbWFrZSBhbiBVaW50OEFycmF5XG5cbnZhciBpbmRpY01hY2hpbmUgPSBKU09OLnBhcnNlKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBwYWtvLmluZmxhdGUoYmFzZTY0QXJyYXlidWZmZXJfMihiYXNlNjREZWZsYXRlZEluZGljTWFjaGluZSkpKSk7XG52YXIgdXNlRGF0YSA9IEpTT04ucGFyc2UoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIHBha28uaW5mbGF0ZShiYXNlNjRBcnJheWJ1ZmZlcl8yKGJhc2U2NERlZmxhdGVkVXNlRGF0YSkpKSk7XG52YXIgdHJpZURhdGEkMiA9IHBha28uaW5mbGF0ZShiYXNlNjRBcnJheWJ1ZmZlcl8yKGJhc2U2NERlZmxhdGVkVHJpZSQyKSk7XG52YXIgZGVjb21wb3NpdGlvbnMgPSB1c2VEYXRhLmRlY29tcG9zaXRpb25zO1xudmFyIHRyaWUkMiA9IG5ldyB1bmljb2RlVHJpZSh0cmllRGF0YSQyKTtcbnZhciBzdGF0ZU1hY2hpbmUgPSBuZXcgZGZhKGluZGljTWFjaGluZSk7XG4vKipcbiAqIFRoZSBJbmRpY1NoYXBlciBzdXBwb3J0cyBpbmRpYyBzY3JpcHRzIGUuZy4gRGV2YW5hZ2FyaSwgS2FubmFkYSwgZXRjLlxuICogQmFzZWQgb24gY29kZSBmcm9tIEhhcmZidXp6OiBodHRwczovL2dpdGh1Yi5jb20vYmVoZGFkL2hhcmZidXp6L2Jsb2IvbWFzdGVyL3NyYy9oYi1vdC1zaGFwZS1jb21wbGV4LWluZGljLmNjXG4gKi9cblxudmFyIEluZGljU2hhcGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRGVmYXVsdFNoYXBlcikge1xuICBfaW5oZXJpdHNMb29zZSQ1KEluZGljU2hhcGVyLCBfRGVmYXVsdFNoYXBlcik7XG5cbiAgZnVuY3Rpb24gSW5kaWNTaGFwZXIoKSB7XG4gICAgcmV0dXJuIF9EZWZhdWx0U2hhcGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIEluZGljU2hhcGVyLnBsYW5GZWF0dXJlcyA9IGZ1bmN0aW9uIHBsYW5GZWF0dXJlcyhwbGFuKSB7XG4gICAgcGxhbi5hZGRTdGFnZShzZXR1cFN5bGxhYmxlcyk7XG4gICAgcGxhbi5hZGRTdGFnZShbJ2xvY2wnLCAnY2NtcCddKTtcbiAgICBwbGFuLmFkZFN0YWdlKGluaXRpYWxSZW9yZGVyaW5nKTtcbiAgICBwbGFuLmFkZFN0YWdlKCdudWt0Jyk7XG4gICAgcGxhbi5hZGRTdGFnZSgnYWtobicpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ3JwaGYnLCBmYWxzZSk7XG4gICAgcGxhbi5hZGRTdGFnZSgncmtyZicpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ3ByZWYnLCBmYWxzZSk7XG4gICAgcGxhbi5hZGRTdGFnZSgnYmx3ZicsIGZhbHNlKTtcbiAgICBwbGFuLmFkZFN0YWdlKCdhYnZmJywgZmFsc2UpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ2hhbGYnLCBmYWxzZSk7XG4gICAgcGxhbi5hZGRTdGFnZSgncHN0ZicsIGZhbHNlKTtcbiAgICBwbGFuLmFkZFN0YWdlKCd2YXR1Jyk7XG4gICAgcGxhbi5hZGRTdGFnZSgnY2pjdCcpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ2NmYXInLCBmYWxzZSk7XG4gICAgcGxhbi5hZGRTdGFnZShmaW5hbFJlb3JkZXJpbmcpO1xuICAgIHBsYW4uYWRkU3RhZ2Uoe1xuICAgICAgbG9jYWw6IFsnaW5pdCddLFxuICAgICAgZ2xvYmFsOiBbJ3ByZXMnLCAnYWJ2cycsICdibHdzJywgJ3BzdHMnLCAnaGFsbicsICdkaXN0JywgJ2Fidm0nLCAnYmx3bScsICdjYWx0JywgJ2NsaWcnXVxuICAgIH0pOyAvLyBTZXR1cCB0aGUgaW5kaWMgY29uZmlnIGZvciB0aGUgc2VsZWN0ZWQgc2NyaXB0XG5cbiAgICBwbGFuLnVuaWNvZGVTY3JpcHQgPSBmcm9tT3BlblR5cGUocGxhbi5zY3JpcHQpO1xuICAgIHBsYW4uaW5kaWNDb25maWcgPSBJTkRJQ19DT05GSUdTW3BsYW4udW5pY29kZVNjcmlwdF0gfHwgSU5ESUNfQ09ORklHUy5EZWZhdWx0O1xuICAgIHBsYW4uaXNPbGRTcGVjID0gcGxhbi5pbmRpY0NvbmZpZy5oYXNPbGRTcGVjICYmIHBsYW4uc2NyaXB0W3BsYW4uc2NyaXB0Lmxlbmd0aCAtIDFdICE9PSAnMic7IC8vIFRPRE86IHR1cm4gb2ZmIGtlcm4gKEtobWVyKSBhbmQgbGlnYSBmZWF0dXJlcy5cbiAgfTtcblxuICBJbmRpY1NoYXBlci5hc3NpZ25GZWF0dXJlcyA9IGZ1bmN0aW9uIGFzc2lnbkZlYXR1cmVzKHBsYW4sIGdseXBocykge1xuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICAgIHZhciBjb2RlcG9pbnQgPSBnbHlwaHNbaV0uY29kZVBvaW50c1swXTtcbiAgICAgIHZhciBkID0gSU5ESUNfREVDT01QT1NJVElPTlNbY29kZXBvaW50XSB8fCBkZWNvbXBvc2l0aW9uc1tjb2RlcG9pbnRdO1xuXG4gICAgICBpZiAoZCkge1xuICAgICAgICB2YXIgZGVjb21wb3NlZCA9IGQubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgdmFyIGcgPSBwbGFuLmZvbnQuZ2x5cGhGb3JDb2RlUG9pbnQoYyk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBHbHlwaEluZm8ocGxhbi5mb250LCBnLmlkLCBbY10sIGdseXBoc1tpXS5mZWF0dXJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW2ksIDFdLmNvbmNhdChkZWNvbXBvc2VkKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIERlY29tcG9zZSBzcGxpdCBtYXRyYXNcbiAgICAvLyBUT0RPOiBkbyB0aGlzIGluIGEgbW9yZSBnZW5lcmFsIHVuaWNvZGUgbm9ybWFsaXplclxuICAgIGZvciAodmFyIGkgPSBnbHlwaHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIF9sb29wKGkpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gSW5kaWNTaGFwZXI7XG59KERlZmF1bHRTaGFwZXIpO1xuXG5fZGVmaW5lUHJvcGVydHkkMihJbmRpY1NoYXBlciwgXCJ6ZXJvTWFya1dpZHRoc1wiLCAnTk9ORScpO1xuXG5mdW5jdGlvbiBpbmRpY0NhdGVnb3J5KGdseXBoKSB7XG4gIHJldHVybiB0cmllJDIuZ2V0KGdseXBoLmNvZGVQb2ludHNbMF0pID4+IDg7XG59XG5cbmZ1bmN0aW9uIGluZGljUG9zaXRpb24oZ2x5cGgpIHtcbiAgcmV0dXJuIDEgPDwgKHRyaWUkMi5nZXQoZ2x5cGguY29kZVBvaW50c1swXSkgJiAweGZmKTtcbn1cblxudmFyIEluZGljSW5mbyA9IGZ1bmN0aW9uIEluZGljSW5mbyhjYXRlZ29yeSwgcG9zaXRpb24sIHN5bGxhYmxlVHlwZSwgc3lsbGFibGUpIHtcbiAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gIHRoaXMuc3lsbGFibGVUeXBlID0gc3lsbGFibGVUeXBlO1xuICB0aGlzLnN5bGxhYmxlID0gc3lsbGFibGU7XG59O1xuXG5mdW5jdGlvbiBzZXR1cFN5bGxhYmxlcyhmb250LCBnbHlwaHMpIHtcbiAgdmFyIHN5bGxhYmxlID0gMDtcbiAgdmFyIGxhc3QgPSAwO1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZihzdGF0ZU1hY2hpbmUubWF0Y2goZ2x5cGhzLm1hcChpbmRpY0NhdGVnb3J5KSkpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgIHZhciBfc3RlcCR2YWx1ZSA9IF9zdGVwLnZhbHVlLFxuICAgICAgICBzdGFydCA9IF9zdGVwJHZhbHVlWzBdLFxuICAgICAgICBlbmQgPSBfc3RlcCR2YWx1ZVsxXSxcbiAgICAgICAgdGFncyA9IF9zdGVwJHZhbHVlWzJdO1xuXG4gICAgaWYgKHN0YXJ0ID4gbGFzdCkge1xuICAgICAgKytzeWxsYWJsZTtcblxuICAgICAgZm9yICh2YXIgX2kgPSBsYXN0OyBfaSA8IHN0YXJ0OyBfaSsrKSB7XG4gICAgICAgIGdseXBoc1tfaV0uc2hhcGVySW5mbyA9IG5ldyBJbmRpY0luZm8oQ0FURUdPUklFUy5YLCBQT1NJVElPTlMuRW5kLCAnbm9uX2luZGljX2NsdXN0ZXInLCBzeWxsYWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgKytzeWxsYWJsZTsgLy8gQ3JlYXRlIHNoYXBlciBpbmZvXG5cbiAgICBmb3IgKHZhciBfaTIgPSBzdGFydDsgX2kyIDw9IGVuZDsgX2kyKyspIHtcbiAgICAgIGdseXBoc1tfaTJdLnNoYXBlckluZm8gPSBuZXcgSW5kaWNJbmZvKDEgPDwgaW5kaWNDYXRlZ29yeShnbHlwaHNbX2kyXSksIGluZGljUG9zaXRpb24oZ2x5cGhzW19pMl0pLCB0YWdzWzBdLCBzeWxsYWJsZSk7XG4gICAgfVxuXG4gICAgbGFzdCA9IGVuZCArIDE7XG4gIH1cblxuICBpZiAobGFzdCA8IGdseXBocy5sZW5ndGgpIHtcbiAgICArK3N5bGxhYmxlO1xuXG4gICAgZm9yICh2YXIgaSA9IGxhc3Q7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGdseXBoc1tpXS5zaGFwZXJJbmZvID0gbmV3IEluZGljSW5mbyhDQVRFR09SSUVTLlgsIFBPU0lUSU9OUy5FbmQsICdub25faW5kaWNfY2x1c3RlcicsIHN5bGxhYmxlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDb25zb25hbnQoZ2x5cGgpIHtcbiAgcmV0dXJuIGdseXBoLnNoYXBlckluZm8uY2F0ZWdvcnkgJiBDT05TT05BTlRfRkxBR1M7XG59XG5cbmZ1bmN0aW9uIGlzSm9pbmVyKGdseXBoKSB7XG4gIHJldHVybiBnbHlwaC5zaGFwZXJJbmZvLmNhdGVnb3J5ICYgSk9JTkVSX0ZMQUdTO1xufVxuXG5mdW5jdGlvbiBpc0hhbGFudE9yQ29lbmcoZ2x5cGgpIHtcbiAgcmV0dXJuIGdseXBoLnNoYXBlckluZm8uY2F0ZWdvcnkgJiBIQUxBTlRfT1JfQ09FTkdfRkxBR1M7XG59XG5cbmZ1bmN0aW9uIHdvdWxkU3Vic3RpdHV0ZShnbHlwaHMsIGZlYXR1cmUpIHtcbiAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZihnbHlwaHMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgIHZhciBfZ2x5cGgkZmVhdHVyZXM7XG5cbiAgICB2YXIgZ2x5cGggPSBfc3RlcDIudmFsdWU7XG4gICAgZ2x5cGguZmVhdHVyZXMgPSAoX2dseXBoJGZlYXR1cmVzID0ge30sIF9nbHlwaCRmZWF0dXJlc1tmZWF0dXJlXSA9IHRydWUsIF9nbHlwaCRmZWF0dXJlcyk7XG4gIH1cblxuICB2YXIgR1NVQiA9IGdseXBoc1swXS5fZm9udC5fbGF5b3V0RW5naW5lLmVuZ2luZS5HU1VCUHJvY2Vzc29yO1xuICBHU1VCLmFwcGx5RmVhdHVyZXMoW2ZlYXR1cmVdLCBnbHlwaHMpO1xuICByZXR1cm4gZ2x5cGhzLmxlbmd0aCA9PT0gMTtcbn1cblxuZnVuY3Rpb24gY29uc29uYW50UG9zaXRpb24oZm9udCwgY29uc29uYW50LCB2aXJhbWEpIHtcbiAgdmFyIGdseXBocyA9IFt2aXJhbWEsIGNvbnNvbmFudCwgdmlyYW1hXTtcblxuICBpZiAod291bGRTdWJzdGl0dXRlKGdseXBocy5zbGljZSgwLCAyKSwgJ2Jsd2YnKSB8fCB3b3VsZFN1YnN0aXR1dGUoZ2x5cGhzLnNsaWNlKDEsIDMpLCAnYmx3ZicpKSB7XG4gICAgcmV0dXJuIFBPU0lUSU9OUy5CZWxvd19DO1xuICB9IGVsc2UgaWYgKHdvdWxkU3Vic3RpdHV0ZShnbHlwaHMuc2xpY2UoMCwgMiksICdwc3RmJykgfHwgd291bGRTdWJzdGl0dXRlKGdseXBocy5zbGljZSgxLCAzKSwgJ3BzdGYnKSkge1xuICAgIHJldHVybiBQT1NJVElPTlMuUG9zdF9DO1xuICB9IGVsc2UgaWYgKHdvdWxkU3Vic3RpdHV0ZShnbHlwaHMuc2xpY2UoMCwgMiksICdwcmVmJykgfHwgd291bGRTdWJzdGl0dXRlKGdseXBocy5zbGljZSgxLCAzKSwgJ3ByZWYnKSkge1xuICAgIHJldHVybiBQT1NJVElPTlMuUG9zdF9DO1xuICB9XG5cbiAgcmV0dXJuIFBPU0lUSU9OUy5CYXNlX0M7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxSZW9yZGVyaW5nKGZvbnQsIGdseXBocywgcGxhbikge1xuICB2YXIgaW5kaWNDb25maWcgPSBwbGFuLmluZGljQ29uZmlnO1xuICB2YXIgZmVhdHVyZXMgPSBmb250Ll9sYXlvdXRFbmdpbmUuZW5naW5lLkdTVUJQcm9jZXNzb3IuZmVhdHVyZXM7XG4gIHZhciBkb3R0ZWRDaXJjbGUgPSBmb250LmdseXBoRm9yQ29kZVBvaW50KDB4MjVjYykuaWQ7XG4gIHZhciB2aXJhbWEgPSBmb250LmdseXBoRm9yQ29kZVBvaW50KGluZGljQ29uZmlnLnZpcmFtYSkuaWQ7XG5cbiAgaWYgKHZpcmFtYSkge1xuICAgIHZhciBpbmZvID0gbmV3IEdseXBoSW5mbyhmb250LCB2aXJhbWEsIFtpbmRpY0NvbmZpZy52aXJhbWFdKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZ2x5cGhzW2ldLnNoYXBlckluZm8ucG9zaXRpb24gPT09IFBPU0lUSU9OUy5CYXNlX0MpIHtcbiAgICAgICAgZ2x5cGhzW2ldLnNoYXBlckluZm8ucG9zaXRpb24gPSBjb25zb25hbnRQb3NpdGlvbihmb250LCBnbHlwaHNbaV0uY29weSgpLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBzdGFydCA9IDAsIGVuZCA9IG5leHRTeWxsYWJsZShnbHlwaHMsIDApOyBzdGFydCA8IGdseXBocy5sZW5ndGg7IHN0YXJ0ID0gZW5kLCBlbmQgPSBuZXh0U3lsbGFibGUoZ2x5cGhzLCBzdGFydCkpIHtcbiAgICB2YXIgX2dseXBocyRzdGFydCRzaGFwZXJJID0gZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLFxuICAgICAgICBjYXRlZ29yeSA9IF9nbHlwaHMkc3RhcnQkc2hhcGVySS5jYXRlZ29yeSxcbiAgICAgICAgc3lsbGFibGVUeXBlID0gX2dseXBocyRzdGFydCRzaGFwZXJJLnN5bGxhYmxlVHlwZTtcblxuICAgIGlmIChzeWxsYWJsZVR5cGUgPT09ICdzeW1ib2xfY2x1c3RlcicgfHwgc3lsbGFibGVUeXBlID09PSAnbm9uX2luZGljX2NsdXN0ZXInKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3lsbGFibGVUeXBlID09PSAnYnJva2VuX2NsdXN0ZXInICYmIGRvdHRlZENpcmNsZSkge1xuICAgICAgdmFyIGcgPSBuZXcgR2x5cGhJbmZvKGZvbnQsIGRvdHRlZENpcmNsZSwgWzB4MjVjY10pO1xuICAgICAgZy5zaGFwZXJJbmZvID0gbmV3IEluZGljSW5mbygxIDw8IGluZGljQ2F0ZWdvcnkoZyksIGluZGljUG9zaXRpb24oZyksIGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5zeWxsYWJsZVR5cGUsIGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5zeWxsYWJsZSk7IC8vIEluc2VydCBhZnRlciBwb3NzaWJsZSBSZXBoYS5cblxuICAgICAgdmFyIF9pMyA9IHN0YXJ0O1xuXG4gICAgICB3aGlsZSAoX2kzIDwgZW5kICYmIGdseXBoc1tfaTNdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuUmVwaGEpIHtcbiAgICAgICAgX2kzKys7XG4gICAgICB9XG5cbiAgICAgIGdseXBocy5zcGxpY2UoX2kzKyssIDAsIGcpO1xuICAgICAgZW5kKys7XG4gICAgfSAvLyAxLiBGaW5kIGJhc2UgY29uc29uYW50OlxuICAgIC8vXG4gICAgLy8gVGhlIHNoYXBpbmcgZW5naW5lIGZpbmRzIHRoZSBiYXNlIGNvbnNvbmFudCBvZiB0aGUgc3lsbGFibGUsIHVzaW5nIHRoZVxuICAgIC8vIGZvbGxvd2luZyBhbGdvcml0aG06IHN0YXJ0aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgc3lsbGFibGUsIG1vdmUgYmFja3dhcmRzXG4gICAgLy8gdW50aWwgYSBjb25zb25hbnQgaXMgZm91bmQgdGhhdCBkb2VzIG5vdCBoYXZlIGEgYmVsb3ctYmFzZSBvciBwb3N0LWJhc2VcbiAgICAvLyBmb3JtIChwb3N0LWJhc2UgZm9ybXMgaGF2ZSB0byBmb2xsb3cgYmVsb3ctYmFzZSBmb3JtcyksIG9yIHRoYXQgaXMgbm90IGFcbiAgICAvLyBwcmUtYmFzZSByZW9yZGVyaW5nIFJhLCBvciBhcnJpdmUgYXQgdGhlIGZpcnN0IGNvbnNvbmFudC4gVGhlIGNvbnNvbmFudFxuICAgIC8vIHN0b3BwZWQgYXQgd2lsbCBiZSB0aGUgYmFzZS5cblxuXG4gICAgdmFyIGJhc2UgPSBlbmQ7XG4gICAgdmFyIGxpbWl0ID0gc3RhcnQ7XG4gICAgdmFyIGhhc1JlcGggPSBmYWxzZTsgLy8gSWYgdGhlIHN5bGxhYmxlIHN0YXJ0cyB3aXRoIFJhICsgSGFsYW50IChpbiBhIHNjcmlwdCB0aGF0IGhhcyBSZXBoKVxuICAgIC8vIGFuZCBoYXMgbW9yZSB0aGFuIG9uZSBjb25zb25hbnQsIFJhIGlzIGV4Y2x1ZGVkIGZyb20gY2FuZGlkYXRlcyBmb3JcbiAgICAvLyBiYXNlIGNvbnNvbmFudHMuXG5cbiAgICBpZiAoaW5kaWNDb25maWcucmVwaFBvcyAhPT0gUE9TSVRJT05TLlJhX1RvX0JlY29tZV9SZXBoICYmIGZlYXR1cmVzLnJwaGYgJiYgc3RhcnQgKyAzIDw9IGVuZCAmJiAoaW5kaWNDb25maWcucmVwaE1vZGUgPT09ICdJbXBsaWNpdCcgJiYgIWlzSm9pbmVyKGdseXBoc1tzdGFydCArIDJdKSB8fCBpbmRpY0NvbmZpZy5yZXBoTW9kZSA9PT0gJ0V4cGxpY2l0JyAmJiBnbHlwaHNbc3RhcnQgKyAyXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLlpXSikpIHtcbiAgICAgIC8vIFNlZSBpZiBpdCBtYXRjaGVzIHRoZSAncnBoZicgZmVhdHVyZS5cbiAgICAgIHZhciBfZyA9IFtnbHlwaHNbc3RhcnRdLmNvcHkoKSwgZ2x5cGhzW3N0YXJ0ICsgMV0uY29weSgpLCBnbHlwaHNbc3RhcnQgKyAyXS5jb3B5KCldO1xuXG4gICAgICBpZiAod291bGRTdWJzdGl0dXRlKF9nLnNsaWNlKDAsIDIpLCAncnBoZicpIHx8IGluZGljQ29uZmlnLnJlcGhNb2RlID09PSAnRXhwbGljaXQnICYmIHdvdWxkU3Vic3RpdHV0ZShfZywgJ3JwaGYnKSkge1xuICAgICAgICBsaW1pdCArPSAyO1xuXG4gICAgICAgIHdoaWxlIChsaW1pdCA8IGVuZCAmJiBpc0pvaW5lcihnbHlwaHNbbGltaXRdKSkge1xuICAgICAgICAgIGxpbWl0Kys7XG4gICAgICAgIH1cblxuICAgICAgICBiYXNlID0gc3RhcnQ7XG4gICAgICAgIGhhc1JlcGggPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5kaWNDb25maWcucmVwaE1vZGUgPT09ICdMb2dfUmVwaGEnICYmIGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5SZXBoYSkge1xuICAgICAgbGltaXQrKztcblxuICAgICAgd2hpbGUgKGxpbWl0IDwgZW5kICYmIGlzSm9pbmVyKGdseXBoc1tsaW1pdF0pKSB7XG4gICAgICAgIGxpbWl0Kys7XG4gICAgICB9XG5cbiAgICAgIGJhc2UgPSBzdGFydDtcbiAgICAgIGhhc1JlcGggPSB0cnVlO1xuICAgIH1cblxuICAgIHN3aXRjaCAoaW5kaWNDb25maWcuYmFzZVBvcykge1xuICAgICAgY2FzZSAnTGFzdCc6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBzdGFydGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIHN5bGxhYmxlLCBtb3ZlIGJhY2t3YXJkc1xuICAgICAgICAgIHZhciBfaTQgPSBlbmQ7XG4gICAgICAgICAgdmFyIHNlZW5CZWxvdyA9IGZhbHNlO1xuXG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgdmFyIF9pbmZvID0gZ2x5cGhzWy0tX2k0XS5zaGFwZXJJbmZvOyAvLyB1bnRpbCBhIGNvbnNvbmFudCBpcyBmb3VuZFxuXG4gICAgICAgICAgICBpZiAoaXNDb25zb25hbnQoZ2x5cGhzW19pNF0pKSB7XG4gICAgICAgICAgICAgIC8vIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGJlbG93LWJhc2Ugb3IgcG9zdC1iYXNlIGZvcm1cbiAgICAgICAgICAgICAgLy8gKHBvc3QtYmFzZSBmb3JtcyBoYXZlIHRvIGZvbGxvdyBiZWxvdy1iYXNlIGZvcm1zKSxcbiAgICAgICAgICAgICAgaWYgKF9pbmZvLnBvc2l0aW9uICE9PSBQT1NJVElPTlMuQmVsb3dfQyAmJiAoX2luZm8ucG9zaXRpb24gIT09IFBPU0lUSU9OUy5Qb3N0X0MgfHwgc2VlbkJlbG93KSkge1xuICAgICAgICAgICAgICAgIGJhc2UgPSBfaTQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH0gLy8gb3IgdGhhdCBpcyBub3QgYSBwcmUtYmFzZSByZW9yZGVyaW5nIFJhLFxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBJTVBMRU1FTlRBVElPTiBOT1RFUzpcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gT3VyIHByZS1iYXNlIHJlb3JkZXJpbmcgUmEncyBhcmUgbWFya2VkIFBPU19QT1NUX0MsIHNvIHdpbGwgYmUgc2tpcHBlZFxuICAgICAgICAgICAgICAvLyBieSB0aGUgbG9naWMgYWJvdmUgYWxyZWFkeS5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gb3IgYXJyaXZlIGF0IHRoZSBmaXJzdCBjb25zb25hbnQuIFRoZSBjb25zb25hbnQgc3RvcHBlZCBhdCB3aWxsXG4gICAgICAgICAgICAgIC8vIGJlIHRoZSBiYXNlLlxuXG5cbiAgICAgICAgICAgICAgaWYgKF9pbmZvLnBvc2l0aW9uID09PSBQT1NJVElPTlMuQmVsb3dfQykge1xuICAgICAgICAgICAgICAgIHNlZW5CZWxvdyA9IHRydWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBiYXNlID0gX2k0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydCA8IF9pNCAmJiBfaW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5aV0ogJiYgZ2x5cGhzW19pNCAtIDFdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuSCkge1xuICAgICAgICAgICAgICAvLyBBIFpXSiBhZnRlciBhIEhhbGFudCBzdG9wcyB0aGUgYmFzZSBzZWFyY2gsIGFuZCByZXF1ZXN0cyBhbiBleHBsaWNpdFxuICAgICAgICAgICAgICAvLyBoYWxmIGZvcm0uXG4gICAgICAgICAgICAgIC8vIEEgWldKIGJlZm9yZSBhIEhhbGFudCwgcmVxdWVzdHMgYSBzdWJqb2luZWQgZm9ybSBpbnN0ZWFkLCBhbmQgaGVuY2VcbiAgICAgICAgICAgICAgLy8gc2VhcmNoIGNvbnRpbnVlcy4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgQmVuZ2FsaVxuICAgICAgICAgICAgICAvLyBzZXF1ZW5jZSBSYSxILFlhIHRoYXQgc2hvdWxkIGZvcm0gWWEtUGhhbGFhIGJ5IHN1YmpvaW5pbmcgWWEuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKF9pNCA+IGxpbWl0KTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ0ZpcnN0JzpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBmaXJzdCBjb25zb25hbnQgaXMgYWx3YXlzIHRoZSBiYXNlLlxuICAgICAgICAgIGJhc2UgPSBzdGFydDsgLy8gTWFyayBhbGwgc3Vic2VxdWVudCBjb25zb25hbnRzIGFzIGJlbG93LlxuXG4gICAgICAgICAgZm9yICh2YXIgX2k1ID0gYmFzZSArIDE7IF9pNSA8IGVuZDsgX2k1KyspIHtcbiAgICAgICAgICAgIGlmIChpc0NvbnNvbmFudChnbHlwaHNbX2k1XSkpIHtcbiAgICAgICAgICAgICAgZ2x5cGhzW19pNV0uc2hhcGVySW5mby5wb3NpdGlvbiA9IFBPU0lUSU9OUy5CZWxvd19DO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gLy8gSWYgdGhlIHN5bGxhYmxlIHN0YXJ0cyB3aXRoIFJhICsgSGFsYW50IChpbiBhIHNjcmlwdCB0aGF0IGhhcyBSZXBoKVxuICAgIC8vIGFuZCBoYXMgbW9yZSB0aGFuIG9uZSBjb25zb25hbnQsIFJhIGlzIGV4Y2x1ZGVkIGZyb20gY2FuZGlkYXRlcyBmb3JcbiAgICAvLyBiYXNlIGNvbnNvbmFudHMuXG4gICAgLy9cbiAgICAvLyAgT25seSBkbyB0aGlzIGZvciB1bmZvcmNlZCBSZXBoLiAoaWUuIG5vdCBmb3IgUmEsSCxaV0opXG5cblxuICAgIGlmIChoYXNSZXBoICYmIGJhc2UgPT09IHN0YXJ0ICYmIGxpbWl0IC0gYmFzZSA8PSAyKSB7XG4gICAgICBoYXNSZXBoID0gZmFsc2U7XG4gICAgfSAvLyAyLiBEZWNvbXBvc2UgYW5kIHJlb3JkZXIgTWF0cmFzOlxuICAgIC8vXG4gICAgLy8gRWFjaCBtYXRyYSBhbmQgYW55IHN5bGxhYmxlIG1vZGlmaWVyIHNpZ24gaW4gdGhlIGNsdXN0ZXIgYXJlIG1vdmVkIHRvIHRoZVxuICAgIC8vIGFwcHJvcHJpYXRlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBjb25zb25hbnQocykgaW4gdGhlIGNsdXN0ZXIuIFRoZVxuICAgIC8vIHNoYXBpbmcgZW5naW5lIGRlY29tcG9zZXMgdHdvLSBvciB0aHJlZS1wYXJ0IG1hdHJhcyBpbnRvIHRoZWlyIGNvbnN0aXR1ZW50XG4gICAgLy8gcGFydHMgYmVmb3JlIGFueSByZXBvc2l0aW9uaW5nLiBNYXRyYSBjaGFyYWN0ZXJzIGFyZSBjbGFzc2lmaWVkIGJ5IHdoaWNoXG4gICAgLy8gY29uc29uYW50IGluIGEgY29uanVuY3QgdGhleSBoYXZlIGFmZmluaXR5IGZvciBhbmQgYXJlIHJlb3JkZXJlZCB0byB0aGVcbiAgICAvLyBmb2xsb3dpbmcgcG9zaXRpb25zOlxuICAgIC8vXG4gICAgLy8gICBvIEJlZm9yZSBmaXJzdCBoYWxmIGZvcm0gaW4gdGhlIHN5bGxhYmxlXG4gICAgLy8gICBvIEFmdGVyIHN1YmpvaW5lZCBjb25zb25hbnRzXG4gICAgLy8gICBvIEFmdGVyIHBvc3QtZm9ybSBjb25zb25hbnRcbiAgICAvLyAgIG8gQWZ0ZXIgbWFpbiBjb25zb25hbnQgKGZvciBhYm92ZSBtYXJrcylcbiAgICAvL1xuICAgIC8vIElNUExFTUVOVEFUSU9OIE5PVEVTOlxuICAgIC8vXG4gICAgLy8gVGhlIG5vcm1hbGl6ZSgpIHJvdXRpbmUgaGFzIGFscmVhZHkgZGVjb21wb3NlZCBtYXRyYXMgZm9yIHVzLCBzbyB3ZSBkb24ndFxuICAgIC8vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdC5cbiAgICAvLyAzLiAgUmVvcmRlciBtYXJrcyB0byBjYW5vbmljYWwgb3JkZXI6XG4gICAgLy9cbiAgICAvLyBBZGphY2VudCBudWt0YSBhbmQgaGFsYW50IG9yIG51a3RhIGFuZCB2ZWRpYyBzaWduIGFyZSBhbHdheXMgcmVwb3NpdGlvbmVkXG4gICAgLy8gaWYgbmVjZXNzYXJ5LCBzbyB0aGF0IHRoZSBudWt0YSBpcyBmaXJzdC5cbiAgICAvL1xuICAgIC8vIElNUExFTUVOVEFUSU9OIE5PVEVTOlxuICAgIC8vXG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBkbyB0aGlzOiB0aGUgbm9ybWFsaXplKCkgcm91dGluZSBhbHJlYWR5IGRpZCB0aGlzIGZvciB1cy5cbiAgICAvLyBSZW9yZGVyIGNoYXJhY3RlcnNcblxuXG4gICAgZm9yICh2YXIgX2k2ID0gc3RhcnQ7IF9pNiA8IGJhc2U7IF9pNisrKSB7XG4gICAgICB2YXIgX2luZm8yID0gZ2x5cGhzW19pNl0uc2hhcGVySW5mbztcbiAgICAgIF9pbmZvMi5wb3NpdGlvbiA9IE1hdGgubWluKFBPU0lUSU9OUy5QcmVfQywgX2luZm8yLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA8IGVuZCkge1xuICAgICAgZ2x5cGhzW2Jhc2VdLnNoYXBlckluZm8ucG9zaXRpb24gPSBQT1NJVElPTlMuQmFzZV9DO1xuICAgIH0gLy8gTWFyayBmaW5hbCBjb25zb25hbnRzLiAgQSBmaW5hbCBjb25zb25hbnQgaXMgb25lIGFwcGVhcmluZyBhZnRlciBhIG1hdHJhLFxuICAgIC8vIGxpa2UgaW4gS2htZXIuXG5cblxuICAgIGZvciAodmFyIF9pNyA9IGJhc2UgKyAxOyBfaTcgPCBlbmQ7IF9pNysrKSB7XG4gICAgICBpZiAoZ2x5cGhzW19pN10uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5NKSB7XG4gICAgICAgIGZvciAodmFyIGogPSBfaTcgKyAxOyBqIDwgZW5kOyBqKyspIHtcbiAgICAgICAgICBpZiAoaXNDb25zb25hbnQoZ2x5cGhzW2pdKSkge1xuICAgICAgICAgICAgZ2x5cGhzW2pdLnNoYXBlckluZm8ucG9zaXRpb24gPSBQT1NJVElPTlMuRmluYWxfQztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gLy8gSGFuZGxlIGJlZ2lubmluZyBSYVxuXG5cbiAgICBpZiAoaGFzUmVwaCkge1xuICAgICAgZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLnBvc2l0aW9uID0gUE9TSVRJT05TLlJhX1RvX0JlY29tZV9SZXBoO1xuICAgIH0gLy8gRm9yIG9sZC1zdHlsZSBJbmRpYyBzY3JpcHQgdGFncywgbW92ZSB0aGUgZmlyc3QgcG9zdC1iYXNlIEhhbGFudCBhZnRlclxuICAgIC8vIGxhc3QgY29uc29uYW50LlxuICAgIC8vXG4gICAgLy8gUmVwb3J0cyBzdWdnZXN0IHRoYXQgaW4gc29tZSBzY3JpcHRzIFVuaXNjcmliZSBkb2VzIHRoaXMgb25seSBpZiB0aGVyZVxuICAgIC8vIGlzICpub3QqIGEgSGFsYW50IGFmdGVyIGxhc3QgY29uc29uYW50IGFscmVhZHkgKGVnLiBLYW5uYWRhKSwgd2hpbGUgaXRcbiAgICAvLyBkb2VzIGl0IHVuY29uZGl0aW9uYWxseSBpbiBvdGhlciBzY3JpcHRzIChlZy4gTWFsYXlhbGFtKS4gIFdlIGRvbid0XG4gICAgLy8gY3VycmVudGx5IGtub3cgYWJvdXQgb3RoZXIgc2NyaXB0cywgc28gd2Ugc2luZ2xlIG91dCBNYWxheWFsYW0gZm9yIG5vdy5cbiAgICAvL1xuICAgIC8vIEthbm5hZGEgdGVzdCBjYXNlOlxuICAgIC8vIFUrMEM5QSxVKzBDQ0QsVSswQzlBLFUrMENDRFxuICAgIC8vIFdpdGggc29tZSB2ZXJzaW9ucyBvZiBMb2hpdCBLYW5uYWRhLlxuICAgIC8vIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTU5MTE4XG4gICAgLy9cbiAgICAvLyBNYWxheWFsYW0gdGVzdCBjYXNlOlxuICAgIC8vIFUrMEQzOCxVKzBENEQsVSswRDMxLFUrMEQ0RCxVKzBEMzEsVSswRDREXG4gICAgLy8gV2l0aCBsb2hpdC10dGYtMjAxMjExMjIvTG9oaXQtTWFsYXlhbGFtLnR0ZlxuXG5cbiAgICBpZiAocGxhbi5pc09sZFNwZWMpIHtcbiAgICAgIHZhciBkaXNhbGxvd0RvdWJsZUhhbGFudHMgPSBwbGFuLnVuaWNvZGVTY3JpcHQgIT09ICdNYWxheWFsYW0nO1xuXG4gICAgICBmb3IgKHZhciBfaTggPSBiYXNlICsgMTsgX2k4IDwgZW5kOyBfaTgrKykge1xuICAgICAgICBpZiAoZ2x5cGhzW19pOF0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5IKSB7XG4gICAgICAgICAgdmFyIF9qID0gdm9pZCAwO1xuXG4gICAgICAgICAgZm9yIChfaiA9IGVuZCAtIDE7IF9qID4gX2k4OyBfai0tKSB7XG4gICAgICAgICAgICBpZiAoaXNDb25zb25hbnQoZ2x5cGhzW19qXSkgfHwgZGlzYWxsb3dEb3VibGVIYWxhbnRzICYmIGdseXBoc1tfal0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5IKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChnbHlwaHNbX2pdLnNoYXBlckluZm8uY2F0ZWdvcnkgIT09IENBVEVHT1JJRVMuSCAmJiBfaiA+IF9pOCkge1xuICAgICAgICAgICAgLy8gTW92ZSBIYWxhbnQgdG8gYWZ0ZXIgbGFzdCBjb25zb25hbnQuXG4gICAgICAgICAgICB2YXIgdCA9IGdseXBoc1tfaThdO1xuICAgICAgICAgICAgZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtfaTgsIDBdLmNvbmNhdChnbHlwaHMuc3BsaWNlKF9pOCArIDEsIF9qIC0gX2k4KSkpO1xuICAgICAgICAgICAgZ2x5cGhzW19qXSA9IHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIEF0dGFjaCBtaXNjIG1hcmtzIHRvIHByZXZpb3VzIGNoYXIgdG8gbW92ZSB3aXRoIHRoZW0uXG5cblxuICAgIHZhciBsYXN0UG9zID0gUE9TSVRJT05TLlN0YXJ0O1xuXG4gICAgZm9yICh2YXIgX2k5ID0gc3RhcnQ7IF9pOSA8IGVuZDsgX2k5KyspIHtcbiAgICAgIHZhciBfaW5mbzMgPSBnbHlwaHNbX2k5XS5zaGFwZXJJbmZvO1xuXG4gICAgICBpZiAoX2luZm8zLmNhdGVnb3J5ICYgKEpPSU5FUl9GTEFHUyB8IENBVEVHT1JJRVMuTiB8IENBVEVHT1JJRVMuUlMgfCBDQVRFR09SSUVTLkNNIHwgSEFMQU5UX09SX0NPRU5HX0ZMQUdTICYgX2luZm8zLmNhdGVnb3J5KSkge1xuICAgICAgICBfaW5mbzMucG9zaXRpb24gPSBsYXN0UG9zO1xuXG4gICAgICAgIGlmIChfaW5mbzMuY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuSCAmJiBfaW5mbzMucG9zaXRpb24gPT09IFBPU0lUSU9OUy5QcmVfTSkge1xuICAgICAgICAgIC8vIFVuaXNjcmliZSBkb2Vzbid0IG1vdmUgdGhlIEhhbGFudCB3aXRoIExlZnQgTWF0cmEuXG4gICAgICAgICAgLy8gVEVTVDogVSswOTJCLFUrMDkzRixVKzA5NERFXG4gICAgICAgICAgLy8gV2UgZm9sbG93LiAgVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHRoZSBTaW5oYWxhXG4gICAgICAgICAgLy8gVSswRERBIHNwbGl0IG1hdHJhIHNpbmNlIGl0IGRlY29tcG9zZXMgdG8gVSswREQ5LFUrMERDQVxuICAgICAgICAgIC8vIHdoZXJlIFUrMEREOSBpcyBhIGxlZnQgbWF0cmEgYW5kIFUrMERDQSBpcyB0aGUgdmlyYW1hLlxuICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gbW92ZSB0aGUgdmlyYW1hIHdpdGggdGhlIGxlZnQgbWF0cmEuXG4gICAgICAgICAgLy8gVEVTVDogVSswRDlBLFUrMEREQVxuICAgICAgICAgIGZvciAodmFyIF9qMiA9IF9pOTsgX2oyID4gc3RhcnQ7IF9qMi0tKSB7XG4gICAgICAgICAgICBpZiAoZ2x5cGhzW19qMiAtIDFdLnNoYXBlckluZm8ucG9zaXRpb24gIT09IFBPU0lUSU9OUy5QcmVfTSkge1xuICAgICAgICAgICAgICBfaW5mbzMucG9zaXRpb24gPSBnbHlwaHNbX2oyIC0gMV0uc2hhcGVySW5mby5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF9pbmZvMy5wb3NpdGlvbiAhPT0gUE9TSVRJT05TLlNNVkQpIHtcbiAgICAgICAgbGFzdFBvcyA9IF9pbmZvMy5wb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9IC8vIEZvciBwb3N0LWJhc2UgY29uc29uYW50cyBsZXQgdGhlbSBvd24gYW55dGhpbmcgYmVmb3JlIHRoZW1cbiAgICAvLyBzaW5jZSB0aGUgbGFzdCBjb25zb25hbnQgb3IgbWF0cmEuXG5cblxuICAgIHZhciBsYXN0ID0gYmFzZTtcblxuICAgIGZvciAodmFyIF9pMTAgPSBiYXNlICsgMTsgX2kxMCA8IGVuZDsgX2kxMCsrKSB7XG4gICAgICBpZiAoaXNDb25zb25hbnQoZ2x5cGhzW19pMTBdKSkge1xuICAgICAgICBmb3IgKHZhciBfajMgPSBsYXN0ICsgMTsgX2ozIDwgX2kxMDsgX2ozKyspIHtcbiAgICAgICAgICBpZiAoZ2x5cGhzW19qM10uc2hhcGVySW5mby5wb3NpdGlvbiA8IFBPU0lUSU9OUy5TTVZEKSB7XG4gICAgICAgICAgICBnbHlwaHNbX2ozXS5zaGFwZXJJbmZvLnBvc2l0aW9uID0gZ2x5cGhzW19pMTBdLnNoYXBlckluZm8ucG9zaXRpb247XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdCA9IF9pMTA7XG4gICAgICB9IGVsc2UgaWYgKGdseXBoc1tfaTEwXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLk0pIHtcbiAgICAgICAgbGFzdCA9IF9pMTA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFyciA9IGdseXBocy5zbGljZShzdGFydCwgZW5kKTtcbiAgICBhcnIuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEuc2hhcGVySW5mby5wb3NpdGlvbiAtIGIuc2hhcGVySW5mby5wb3NpdGlvbjtcbiAgICB9KTtcbiAgICBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW3N0YXJ0LCBhcnIubGVuZ3RoXS5jb25jYXQoYXJyKSk7IC8vIEZpbmQgYmFzZSBhZ2FpblxuXG4gICAgZm9yICh2YXIgX2kxMSA9IHN0YXJ0OyBfaTExIDwgZW5kOyBfaTExKyspIHtcbiAgICAgIGlmIChnbHlwaHNbX2kxMV0uc2hhcGVySW5mby5wb3NpdGlvbiA9PT0gUE9TSVRJT05TLkJhc2VfQykge1xuICAgICAgICBiYXNlID0gX2kxMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBTZXR1cCBmZWF0dXJlcyBub3dcbiAgICAvLyBSZXBoXG5cblxuICAgIGZvciAodmFyIF9pMTIgPSBzdGFydDsgX2kxMiA8IGVuZCAmJiBnbHlwaHNbX2kxMl0uc2hhcGVySW5mby5wb3NpdGlvbiA9PT0gUE9TSVRJT05TLlJhX1RvX0JlY29tZV9SZXBoOyBfaTEyKyspIHtcbiAgICAgIGdseXBoc1tfaTEyXS5mZWF0dXJlcy5ycGhmID0gdHJ1ZTtcbiAgICB9IC8vIFByZS1iYXNlXG5cblxuICAgIHZhciBibHdmID0gIXBsYW4uaXNPbGRTcGVjICYmIGluZGljQ29uZmlnLmJsd2ZNb2RlID09PSAnUHJlX0FuZF9Qb3N0JztcblxuICAgIGZvciAodmFyIF9pMTMgPSBzdGFydDsgX2kxMyA8IGJhc2U7IF9pMTMrKykge1xuICAgICAgZ2x5cGhzW19pMTNdLmZlYXR1cmVzLmhhbGYgPSB0cnVlO1xuXG4gICAgICBpZiAoYmx3Zikge1xuICAgICAgICBnbHlwaHNbX2kxM10uZmVhdHVyZXMuYmx3ZiA9IHRydWU7XG4gICAgICB9XG4gICAgfSAvLyBQb3N0LWJhc2VcblxuXG4gICAgZm9yICh2YXIgX2kxNCA9IGJhc2UgKyAxOyBfaTE0IDwgZW5kOyBfaTE0KyspIHtcbiAgICAgIGdseXBoc1tfaTE0XS5mZWF0dXJlcy5hYnZmID0gdHJ1ZTtcbiAgICAgIGdseXBoc1tfaTE0XS5mZWF0dXJlcy5wc3RmID0gdHJ1ZTtcbiAgICAgIGdseXBoc1tfaTE0XS5mZWF0dXJlcy5ibHdmID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocGxhbi5pc09sZFNwZWMgJiYgcGxhbi51bmljb2RlU2NyaXB0ID09PSAnRGV2YW5hZ2FyaScpIHtcbiAgICAgIC8vIE9sZC1zcGVjIGV5ZS1sYXNoIFJhIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcuICBGcm9tIHRoZVxuICAgICAgLy8gc3BlYzpcbiAgICAgIC8vXG4gICAgICAvLyBcIlRoZSBmZWF0dXJlICdiZWxvdy1iYXNlIGZvcm0nIGlzIGFwcGxpZWQgdG8gY29uc29uYW50c1xuICAgICAgLy8gaGF2aW5nIGJlbG93LWJhc2UgZm9ybXMgYW5kIGZvbGxvd2luZyB0aGUgYmFzZSBjb25zb25hbnQuXG4gICAgICAvLyBUaGUgZXhjZXB0aW9uIGlzIHZhdHR1LCB3aGljaCBtYXkgYXBwZWFyIGJlbG93IGhhbGYgZm9ybXNcbiAgICAgIC8vIGFzIHdlbGwgYXMgYmVsb3cgdGhlIGJhc2UgZ2x5cGguIFRoZSBmZWF0dXJlICdiZWxvdy1iYXNlXG4gICAgICAvLyBmb3JtJyB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHN1Y2ggb2NjdXJyZW5jZXMgb2YgUmEgYXMgd2VsbC5cIlxuICAgICAgLy9cbiAgICAgIC8vIFRlc3QgY2FzZTogVSswOTI0LFUrMDk0RCxVKzA5MzAsVSswOTRkLFUrMDkxNVxuICAgICAgLy8gd2l0aCBTYW5za3JpdCAyMDAzIGZvbnQuXG4gICAgICAvL1xuICAgICAgLy8gSG93ZXZlciwgbm90ZSB0aGF0IFJhLEhhbGFudCxaV0ogaXMgdGhlIGNvcnJlY3Qgd2F5IHRvXG4gICAgICAvLyByZXF1ZXN0IGV5ZWxhc2ggZm9ybSBvZiBSYSwgc28gd2Ugd291bGRibid0IGluaGliaXQgaXRcbiAgICAgIC8vIGluIHRoYXQgc2VxdWVuY2UuXG4gICAgICAvL1xuICAgICAgLy8gVGVzdCBjYXNlOiBVKzA5MjQsVSswOTRELFUrMDkzMCxVKzA5NGQsVSsyMDBELFUrMDkxNVxuICAgICAgZm9yICh2YXIgX2kxNSA9IHN0YXJ0OyBfaTE1ICsgMSA8IGJhc2U7IF9pMTUrKykge1xuICAgICAgICBpZiAoZ2x5cGhzW19pMTVdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuUmEgJiYgZ2x5cGhzW19pMTUgKyAxXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLkggJiYgKF9pMTUgKyAxID09PSBiYXNlIHx8IGdseXBoc1tfaTE1ICsgMl0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5aV0opKSB7XG4gICAgICAgICAgZ2x5cGhzW19pMTVdLmZlYXR1cmVzLmJsd2YgPSB0cnVlO1xuICAgICAgICAgIGdseXBoc1tfaTE1ICsgMV0uZmVhdHVyZXMuYmx3ZiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJlZkxlbiA9IDI7XG5cbiAgICBpZiAoZmVhdHVyZXMucHJlZiAmJiBiYXNlICsgcHJlZkxlbiA8IGVuZCkge1xuICAgICAgLy8gRmluZCBhIEhhbGFudCxSYSBzZXF1ZW5jZSBhbmQgbWFyayBpdCBmb3IgcHJlLWJhc2UgcmVvcmRlcmluZyBwcm9jZXNzaW5nLlxuICAgICAgZm9yICh2YXIgX2kxNiA9IGJhc2UgKyAxOyBfaTE2ICsgcHJlZkxlbiAtIDEgPCBlbmQ7IF9pMTYrKykge1xuICAgICAgICB2YXIgX2cyID0gW2dseXBoc1tfaTE2XS5jb3B5KCksIGdseXBoc1tfaTE2ICsgMV0uY29weSgpXTtcblxuICAgICAgICBpZiAod291bGRTdWJzdGl0dXRlKF9nMiwgJ3ByZWYnKSkge1xuICAgICAgICAgIGZvciAodmFyIF9qNCA9IDA7IF9qNCA8IHByZWZMZW47IF9qNCsrKSB7XG4gICAgICAgICAgICBnbHlwaHNbX2kxNisrXS5mZWF0dXJlcy5wcmVmID0gdHJ1ZTtcbiAgICAgICAgICB9IC8vIE1hcmsgdGhlIHN1YnNlcXVlbnQgc3R1ZmYgd2l0aCAnY2ZhcicuICBVc2VkIGluIEtobWVyLlxuICAgICAgICAgIC8vIFJlYWQgdGhlIGZlYXR1cmUgc3BlYy5cbiAgICAgICAgICAvLyBUaGlzIGFsbG93cyBkaXN0aW5ndWlzaGluZyB0aGUgZm9sbG93aW5nIGNhc2VzIHdpdGggTVMgS2htZXIgZm9udHM6XG4gICAgICAgICAgLy8gVSsxNzg0LFUrMTdEMixVKzE3OUEsVSsxN0QyLFUrMTc4MlxuICAgICAgICAgIC8vIFUrMTc4NCxVKzE3RDIsVSsxNzgyLFUrMTdEMixVKzE3OUFcblxuXG4gICAgICAgICAgaWYgKGZlYXR1cmVzLmNmYXIpIHtcbiAgICAgICAgICAgIGZvciAoOyBfaTE2IDwgZW5kOyBfaTE2KyspIHtcbiAgICAgICAgICAgICAgZ2x5cGhzW19pMTZdLmZlYXR1cmVzLmNmYXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBBcHBseSBaV0ovWldOSiBlZmZlY3RzXG5cblxuICAgIGZvciAodmFyIF9pMTcgPSBzdGFydCArIDE7IF9pMTcgPCBlbmQ7IF9pMTcrKykge1xuICAgICAgaWYgKGlzSm9pbmVyKGdseXBoc1tfaTE3XSkpIHtcbiAgICAgICAgdmFyIG5vbkpvaW5lciA9IGdseXBoc1tfaTE3XS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLlpXTko7XG4gICAgICAgIHZhciBfajUgPSBfaTE3O1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBfajUtLTsgLy8gWldKL1pXTkogc2hvdWxkIGRpc2FibGUgQ0pDVC4gIFRoZXkgZG8gdGhhdCBieSBzaW1wbHlcbiAgICAgICAgICAvLyBiZWluZyB0aGVyZSwgc2luY2Ugd2UgZG9uJ3Qgc2tpcCB0aGVtIGZvciB0aGUgQ0pDVFxuICAgICAgICAgIC8vIGZlYXR1cmUgKGllLiBGX01BTlVBTF9aV0opXG4gICAgICAgICAgLy8gQSBaV05KIGRpc2FibGVzIEhBTEYuXG5cbiAgICAgICAgICBpZiAobm9uSm9pbmVyKSB7XG4gICAgICAgICAgICBkZWxldGUgZ2x5cGhzW19qNV0uZmVhdHVyZXMuaGFsZjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKF9qNSA+IHN0YXJ0ICYmICFpc0NvbnNvbmFudChnbHlwaHNbX2o1XSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5hbFJlb3JkZXJpbmcoZm9udCwgZ2x5cGhzLCBwbGFuKSB7XG4gIHZhciBpbmRpY0NvbmZpZyA9IHBsYW4uaW5kaWNDb25maWc7XG4gIHZhciBmZWF0dXJlcyA9IGZvbnQuX2xheW91dEVuZ2luZS5lbmdpbmUuR1NVQlByb2Nlc3Nvci5mZWF0dXJlcztcblxuICBmb3IgKHZhciBzdGFydCA9IDAsIGVuZCA9IG5leHRTeWxsYWJsZShnbHlwaHMsIDApOyBzdGFydCA8IGdseXBocy5sZW5ndGg7IHN0YXJ0ID0gZW5kLCBlbmQgPSBuZXh0U3lsbGFibGUoZ2x5cGhzLCBzdGFydCkpIHtcbiAgICAvLyA0LiBGaW5hbCByZW9yZGVyaW5nOlxuICAgIC8vXG4gICAgLy8gQWZ0ZXIgdGhlIGxvY2FsaXplZCBmb3JtcyBhbmQgYmFzaWMgc2hhcGluZyBmb3JtcyBHU1VCIGZlYXR1cmVzIGhhdmUgYmVlblxuICAgIC8vIGFwcGxpZWQgKHNlZSBiZWxvdyksIHRoZSBzaGFwaW5nIGVuZ2luZSBwZXJmb3JtcyBzb21lIGZpbmFsIGdseXBoXG4gICAgLy8gcmVvcmRlcmluZyBiZWZvcmUgYXBwbHlpbmcgYWxsIHRoZSByZW1haW5pbmcgZm9udCBmZWF0dXJlcyB0byB0aGUgZW50aXJlXG4gICAgLy8gY2x1c3Rlci5cbiAgICB2YXIgdHJ5UHJlZiA9ICEhZmVhdHVyZXMucHJlZjsgLy8gRmluZCBiYXNlIGFnYWluXG5cbiAgICB2YXIgYmFzZSA9IHN0YXJ0O1xuXG4gICAgZm9yICg7IGJhc2UgPCBlbmQ7IGJhc2UrKykge1xuICAgICAgaWYgKGdseXBoc1tiYXNlXS5zaGFwZXJJbmZvLnBvc2l0aW9uID49IFBPU0lUSU9OUy5CYXNlX0MpIHtcbiAgICAgICAgaWYgKHRyeVByZWYgJiYgYmFzZSArIDEgPCBlbmQpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gYmFzZSArIDE7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKGdseXBoc1tpXS5mZWF0dXJlcy5wcmVmKSB7XG4gICAgICAgICAgICAgIGlmICghKGdseXBoc1tpXS5zdWJzdGl0dXRlZCAmJiBnbHlwaHNbaV0uaXNMaWdhdGVkICYmICFnbHlwaHNbaV0uaXNNdWx0aXBsaWVkKSkge1xuICAgICAgICAgICAgICAgIC8vIE9rLCB0aGlzIHdhcyBhICdwcmVmJyBjYW5kaWRhdGUgYnV0IGRpZG4ndCBmb3JtIGFueS5cbiAgICAgICAgICAgICAgICAvLyBCYXNlIGlzIGFyb3VuZCBoZXJlLi4uXG4gICAgICAgICAgICAgICAgYmFzZSA9IGk7XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoYmFzZSA8IGVuZCAmJiBpc0hhbGFudE9yQ29lbmcoZ2x5cGhzW2Jhc2VdKSkge1xuICAgICAgICAgICAgICAgICAgYmFzZSsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGdseXBoc1tiYXNlXS5zaGFwZXJJbmZvLnBvc2l0aW9uID0gUE9TSVRJT05TLkJBU0VfQztcbiAgICAgICAgICAgICAgICB0cnlQcmVmID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRm9yIE1hbGF5YWxhbSwgc2tpcCBvdmVyIHVuZm9ybWVkIGJlbG93LSAoYnV0IE5PVCBwb3N0LSkgZm9ybXMuXG5cblxuICAgICAgICBpZiAocGxhbi51bmljb2RlU2NyaXB0ID09PSAnTWFsYXlhbGFtJykge1xuICAgICAgICAgIGZvciAodmFyIF9pMTggPSBiYXNlICsgMTsgX2kxOCA8IGVuZDsgX2kxOCsrKSB7XG4gICAgICAgICAgICB3aGlsZSAoX2kxOCA8IGVuZCAmJiBpc0pvaW5lcihnbHlwaHNbX2kxOF0pKSB7XG4gICAgICAgICAgICAgIF9pMTgrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKF9pMTggPT09IGVuZCB8fCAhaXNIYWxhbnRPckNvZW5nKGdseXBoc1tfaTE4XSkpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9pMTgrKzsgLy8gU2tpcCBoYWxhbnQuXG5cbiAgICAgICAgICAgIHdoaWxlIChfaTE4IDwgZW5kICYmIGlzSm9pbmVyKGdseXBoc1tfaTE4XSkpIHtcbiAgICAgICAgICAgICAgX2kxOCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoX2kxOCA8IGVuZCAmJiBpc0NvbnNvbmFudChnbHlwaHNbX2kxOF0pICYmIGdseXBoc1tfaTE4XS5zaGFwZXJJbmZvLnBvc2l0aW9uID09PSBQT1NJVElPTlMuQmVsb3dfQykge1xuICAgICAgICAgICAgICBiYXNlID0gX2kxODtcbiAgICAgICAgICAgICAgZ2x5cGhzW2Jhc2VdLnNoYXBlckluZm8ucG9zaXRpb24gPSBQT1NJVElPTlMuQmFzZV9DO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydCA8IGJhc2UgJiYgZ2x5cGhzW2Jhc2VdLnNoYXBlckluZm8ucG9zaXRpb24gPiBQT1NJVElPTlMuQmFzZV9DKSB7XG4gICAgICAgICAgYmFzZS0tO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPT09IGVuZCAmJiBzdGFydCA8IGJhc2UgJiYgZ2x5cGhzW2Jhc2UgLSAxXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLlpXSikge1xuICAgICAgYmFzZS0tO1xuICAgIH1cblxuICAgIGlmIChiYXNlIDwgZW5kKSB7XG4gICAgICB3aGlsZSAoc3RhcnQgPCBiYXNlICYmIGdseXBoc1tiYXNlXS5zaGFwZXJJbmZvLmNhdGVnb3J5ICYgKENBVEVHT1JJRVMuTiB8IEhBTEFOVF9PUl9DT0VOR19GTEFHUykpIHtcbiAgICAgICAgYmFzZS0tO1xuICAgICAgfVxuICAgIH0gLy8gbyBSZW9yZGVyIG1hdHJhczpcbiAgICAvL1xuICAgIC8vIElmIGEgcHJlLWJhc2UgbWF0cmEgY2hhcmFjdGVyIGhhZCBiZWVuIHJlb3JkZXJlZCBiZWZvcmUgYXBwbHlpbmcgYmFzaWNcbiAgICAvLyBmZWF0dXJlcywgdGhlIGdseXBoIGNhbiBiZSBtb3ZlZCBjbG9zZXIgdG8gdGhlIG1haW4gY29uc29uYW50IGJhc2VkIG9uXG4gICAgLy8gd2hldGhlciBoYWxmLWZvcm1zIGhhZCBiZWVuIGZvcm1lZC4gQWN0dWFsIHBvc2l0aW9uIGZvciB0aGUgbWF0cmEgaXNcbiAgICAvLyBkZWZpbmVkIGFzIOKAnGFmdGVyIGxhc3Qgc3RhbmRhbG9uZSBoYWxhbnQgZ2x5cGgsIGFmdGVyIGluaXRpYWwgbWF0cmFcbiAgICAvLyBwb3NpdGlvbiBhbmQgYmVmb3JlIHRoZSBtYWluIGNvbnNvbmFudOKAnS4gSWYgWldKIG9yIFpXTkogZm9sbG93IHRoaXNcbiAgICAvLyBoYWxhbnQsIHBvc2l0aW9uIGlzIG1vdmVkIGFmdGVyIGl0LlxuICAgIC8vXG5cblxuICAgIGlmIChzdGFydCArIDEgPCBlbmQgJiYgc3RhcnQgPCBiYXNlKSB7XG4gICAgICAvLyBPdGhlcndpc2UgdGhlcmUgY2FuJ3QgYmUgYW55IHByZS1iYXNlIG1hdHJhIGNoYXJhY3RlcnMuXG4gICAgICAvLyBJZiB3ZSBsb3N0IHRyYWNrIG9mIGJhc2UsIGFsYXMsIHBvc2l0aW9uIGJlZm9yZSBsYXN0IHRoaW5neS5cbiAgICAgIHZhciBuZXdQb3MgPSBiYXNlID09PSBlbmQgPyBiYXNlIC0gMiA6IGJhc2UgLSAxOyAvLyBNYWxheWFsYW0gLyBUYW1pbCBkbyBub3QgaGF2ZSBcImhhbGZcIiBmb3JtcyBvciBleHBsaWNpdCB2aXJhbWEgZm9ybXMuXG4gICAgICAvLyBUaGUgZ2x5cGhzIGZvcm1lZCBieSAnaGFsZicgYXJlIENoaWxsdXMgb3IgbGlnYXRlZCBleHBsaWNpdCB2aXJhbWFzLlxuICAgICAgLy8gV2Ugd2FudCB0byBwb3NpdGlvbiBtYXRyYSBhZnRlciB0aGVtLlxuXG4gICAgICBpZiAocGxhbi51bmljb2RlU2NyaXB0ICE9PSAnTWFsYXlhbGFtJyAmJiBwbGFuLnVuaWNvZGVTY3JpcHQgIT09ICdUYW1pbCcpIHtcbiAgICAgICAgd2hpbGUgKG5ld1BvcyA+IHN0YXJ0ICYmICEoZ2x5cGhzW25ld1Bvc10uc2hhcGVySW5mby5jYXRlZ29yeSAmIChDQVRFR09SSUVTLk0gfCBIQUxBTlRfT1JfQ09FTkdfRkxBR1MpKSkge1xuICAgICAgICAgIG5ld1Bvcy0tO1xuICAgICAgICB9IC8vIElmIHdlIGZvdW5kIG5vIEhhbGFudCB3ZSBhcmUgZG9uZS5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIG9ubHkgcHJvY2VlZCBpZiB0aGUgSGFsYW50IGRvZXNcbiAgICAgICAgLy8gbm90IGJlbG9uZyB0byB0aGUgTWF0cmEgaXRzZWxmIVxuXG5cbiAgICAgICAgaWYgKGlzSGFsYW50T3JDb2VuZyhnbHlwaHNbbmV3UG9zXSkgJiYgZ2x5cGhzW25ld1Bvc10uc2hhcGVySW5mby5wb3NpdGlvbiAhPT0gUE9TSVRJT05TLlByZV9NKSB7XG4gICAgICAgICAgLy8gSWYgWldKIG9yIFpXTkogZm9sbG93IHRoaXMgaGFsYW50LCBwb3NpdGlvbiBpcyBtb3ZlZCBhZnRlciBpdC5cbiAgICAgICAgICBpZiAobmV3UG9zICsgMSA8IGVuZCAmJiBpc0pvaW5lcihnbHlwaHNbbmV3UG9zICsgMV0pKSB7XG4gICAgICAgICAgICBuZXdQb3MrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3UG9zID0gc3RhcnQ7IC8vIE5vIG1vdmUuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0IDwgbmV3UG9zICYmIGdseXBoc1tuZXdQb3NdLnNoYXBlckluZm8ucG9zaXRpb24gIT09IFBPU0lUSU9OUy5QcmVfTSkge1xuICAgICAgICAvLyBOb3cgZ28gc2VlIGlmIHRoZXJlJ3MgYWN0dWFsbHkgYW55IG1hdHJhcy4uLlxuICAgICAgICBmb3IgKHZhciBfaTE5ID0gbmV3UG9zOyBfaTE5ID4gc3RhcnQ7IF9pMTktLSkge1xuICAgICAgICAgIGlmIChnbHlwaHNbX2kxOSAtIDFdLnNoYXBlckluZm8ucG9zaXRpb24gPT09IFBPU0lUSU9OUy5QcmVfTSkge1xuICAgICAgICAgICAgdmFyIG9sZFBvcyA9IF9pMTkgLSAxO1xuXG4gICAgICAgICAgICBpZiAob2xkUG9zIDwgYmFzZSAmJiBiYXNlIDw9IG5ld1Bvcykge1xuICAgICAgICAgICAgICAvLyBTaG91bGRuJ3QgYWN0dWFsbHkgaGFwcGVuLlxuICAgICAgICAgICAgICBiYXNlLS07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB0bXAgPSBnbHlwaHNbb2xkUG9zXTtcbiAgICAgICAgICAgIGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbb2xkUG9zLCAwXS5jb25jYXQoZ2x5cGhzLnNwbGljZShvbGRQb3MgKyAxLCBuZXdQb3MgLSBvbGRQb3MpKSk7XG4gICAgICAgICAgICBnbHlwaHNbbmV3UG9zXSA9IHRtcDtcbiAgICAgICAgICAgIG5ld1Bvcy0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gbyBSZW9yZGVyIHJlcGg6XG4gICAgLy9cbiAgICAvLyBSZXBo4oCZcyBvcmlnaW5hbCBwb3NpdGlvbiBpcyBhbHdheXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3lsbGFibGUsXG4gICAgLy8gKGkuZS4gaXQgaXMgbm90IHJlb3JkZXJlZCBhdCB0aGUgY2hhcmFjdGVyIHJlb3JkZXJpbmcgc3RhZ2UpLiBIb3dldmVyLFxuICAgIC8vIGl0IHdpbGwgYmUgcmVvcmRlcmVkIGFjY29yZGluZyB0byB0aGUgYmFzaWMtZm9ybXMgc2hhcGluZyByZXN1bHRzLlxuICAgIC8vIFBvc3NpYmxlIHBvc2l0aW9ucyBmb3IgcmVwaCwgZGVwZW5kaW5nIG9uIHRoZSBzY3JpcHQsIGFyZTsgYWZ0ZXIgbWFpbixcbiAgICAvLyBiZWZvcmUgcG9zdC1iYXNlIGNvbnNvbmFudCBmb3JtcywgYW5kIGFmdGVyIHBvc3QtYmFzZSBjb25zb25hbnQgZm9ybXMuXG4gICAgLy8gVHdvIGNhc2VzOlxuICAgIC8vXG4gICAgLy8gLSBJZiByZXBoYSBpcyBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyAoUmEsSCBvciBSYSxILFpXSiksIHRoZW5cbiAgICAvLyAgIHdlIHNob3VsZCBvbmx5IG1vdmUgaXQgaWYgdGhlIHNlcXVlbmNlIGxpZ2F0ZWQgdG8gdGhlIHJlcGhhIGZvcm0uXG4gICAgLy9cbiAgICAvLyAtIElmIHJlcGhhIGlzIGVuY29kZWQgc2VwYXJhdGVseSBhbmQgaW4gdGhlIGxvZ2ljYWwgcG9zaXRpb24sIHdlIHNob3VsZCBvbmx5XG4gICAgLy8gICBtb3ZlIGl0IGlmIGl0IGRpZCBOT1QgbGlnYXRlLiAgSWYgaXQgbGlnYXRlZCwgaXQncyBwcm9iYWJseSB0aGUgZm9udCB0cnlpbmdcbiAgICAvLyAgIHRvIG1ha2UgaXQgd29yayB3aXRob3V0IHRoZSByZW9yZGVyaW5nLlxuXG5cbiAgICBpZiAoc3RhcnQgKyAxIDwgZW5kICYmIGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5wb3NpdGlvbiA9PT0gUE9TSVRJT05TLlJhX1RvX0JlY29tZV9SZXBoICYmIGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5SZXBoYSAhPT0gKGdseXBoc1tzdGFydF0uaXNMaWdhdGVkICYmICFnbHlwaHNbc3RhcnRdLmlzTXVsdGlwbGllZCkpIHtcbiAgICAgIHZhciBuZXdSZXBoUG9zID0gdm9pZCAwO1xuICAgICAgdmFyIHJlcGhQb3MgPSBpbmRpY0NvbmZpZy5yZXBoUG9zO1xuICAgICAgdmFyIGZvdW5kID0gZmFsc2U7IC8vIDEuIElmIHJlcGggc2hvdWxkIGJlIHBvc2l0aW9uZWQgYWZ0ZXIgcG9zdC1iYXNlIGNvbnNvbmFudCBmb3JtcyxcbiAgICAgIC8vICAgIHByb2NlZWQgdG8gc3RlcCA1LlxuXG4gICAgICBpZiAocmVwaFBvcyAhPT0gUE9TSVRJT05TLkFmdGVyX1Bvc3QpIHtcbiAgICAgICAgLy8gIDIuIElmIHRoZSByZXBoIHJlcG9zaXRpb25pbmcgY2xhc3MgaXMgbm90IGFmdGVyIHBvc3QtYmFzZTogdGFyZ2V0XG4gICAgICAgIC8vICAgICBwb3NpdGlvbiBpcyBhZnRlciB0aGUgZmlyc3QgZXhwbGljaXQgaGFsYW50IGdseXBoIGJldHdlZW4gdGhlXG4gICAgICAgIC8vICAgICBmaXJzdCBwb3N0LXJlcGggY29uc29uYW50IGFuZCBsYXN0IG1haW4gY29uc29uYW50LiBJZiBaV0ogb3IgWldOSlxuICAgICAgICAvLyAgICAgYXJlIGZvbGxvd2luZyB0aGlzIGhhbGFudCwgcG9zaXRpb24gaXMgbW92ZWQgYWZ0ZXIgaXQuIElmIHN1Y2hcbiAgICAgICAgLy8gICAgIHBvc2l0aW9uIGlzIGZvdW5kLCB0aGlzIGlzIHRoZSB0YXJnZXQgcG9zaXRpb24uIE90aGVyd2lzZSxcbiAgICAgICAgLy8gICAgIHByb2NlZWQgdG8gdGhlIG5leHQgc3RlcC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgIE5vdGU6IGluIG9sZC1pbXBsZW1lbnRhdGlvbiBmb250cywgd2hlcmUgY2xhc3NpZmljYXRpb25zIHdlcmVcbiAgICAgICAgLy8gICAgIGZpeGVkIGluIHNoYXBpbmcgZW5naW5lLCB0aGVyZSB3YXMgbm8gY2FzZSB3aGVyZSByZXBoIHBvc2l0aW9uXG4gICAgICAgIC8vICAgICB3aWxsIGJlIGZvdW5kIG9uIHRoaXMgc3RlcC5cbiAgICAgICAgbmV3UmVwaFBvcyA9IHN0YXJ0ICsgMTtcblxuICAgICAgICB3aGlsZSAobmV3UmVwaFBvcyA8IGJhc2UgJiYgIWlzSGFsYW50T3JDb2VuZyhnbHlwaHNbbmV3UmVwaFBvc10pKSB7XG4gICAgICAgICAgbmV3UmVwaFBvcysrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld1JlcGhQb3MgPCBiYXNlICYmIGlzSGFsYW50T3JDb2VuZyhnbHlwaHNbbmV3UmVwaFBvc10pKSB7XG4gICAgICAgICAgLy8gLT5JZiBaV0ogb3IgWldOSiBhcmUgZm9sbG93aW5nIHRoaXMgaGFsYW50LCBwb3NpdGlvbiBpcyBtb3ZlZCBhZnRlciBpdC5cbiAgICAgICAgICBpZiAobmV3UmVwaFBvcyArIDEgPCBiYXNlICYmIGlzSm9pbmVyKGdseXBoc1tuZXdSZXBoUG9zICsgMV0pKSB7XG4gICAgICAgICAgICBuZXdSZXBoUG9zKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICB9IC8vIDMuIElmIHJlcGggc2hvdWxkIGJlIHJlcG9zaXRpb25lZCBhZnRlciB0aGUgbWFpbiBjb25zb25hbnQ6IGZpbmQgdGhlXG4gICAgICAgIC8vICAgIGZpcnN0IGNvbnNvbmFudCBub3QgbGlnYXRlZCB3aXRoIG1haW4sIG9yIGZpbmQgdGhlIGZpcnN0XG4gICAgICAgIC8vICAgIGNvbnNvbmFudCB0aGF0IGlzIG5vdCBhIHBvdGVudGlhbCBwcmUtYmFzZSByZW9yZGVyaW5nIFJhLlxuXG5cbiAgICAgICAgaWYgKCFmb3VuZCAmJiByZXBoUG9zID09PSBQT1NJVElPTlMuQWZ0ZXJfTWFpbikge1xuICAgICAgICAgIG5ld1JlcGhQb3MgPSBiYXNlO1xuXG4gICAgICAgICAgd2hpbGUgKG5ld1JlcGhQb3MgKyAxIDwgZW5kICYmIGdseXBoc1tuZXdSZXBoUG9zICsgMV0uc2hhcGVySW5mby5wb3NpdGlvbiA8PSBQT1NJVElPTlMuQWZ0ZXJfTWFpbikge1xuICAgICAgICAgICAgbmV3UmVwaFBvcysrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvdW5kID0gbmV3UmVwaFBvcyA8IGVuZDtcbiAgICAgICAgfSAvLyA0LiBJZiByZXBoIHNob3VsZCBiZSBwb3NpdGlvbmVkIGJlZm9yZSBwb3N0LWJhc2UgY29uc29uYW50LCBmaW5kXG4gICAgICAgIC8vICAgIGZpcnN0IHBvc3QtYmFzZSBjbGFzc2lmaWVkIGNvbnNvbmFudCBub3QgbGlnYXRlZCB3aXRoIG1haW4uIElmIG5vXG4gICAgICAgIC8vICAgIGNvbnNvbmFudCBpcyBmb3VuZCwgdGhlIHRhcmdldCBwb3NpdGlvbiBzaG91bGQgYmUgYmVmb3JlIHRoZVxuICAgICAgICAvLyAgICBmaXJzdCBtYXRyYSwgc3lsbGFibGUgbW9kaWZpZXIgc2lnbiBvciB2ZWRpYyBzaWduLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGlzIG91ciB0YWtlIG9uIHdoYXQgc3RlcCA0IGlzIHRyeWluZyB0byBzYXkgKGFuZCBmYWlsaW5nLCBCQURMWSkuXG5cblxuICAgICAgICBpZiAoIWZvdW5kICYmIHJlcGhQb3MgPT09IFBPU0lUSU9OUy5BZnRlcl9TdWIpIHtcbiAgICAgICAgICBuZXdSZXBoUG9zID0gYmFzZTtcblxuICAgICAgICAgIHdoaWxlIChuZXdSZXBoUG9zICsgMSA8IGVuZCAmJiAhKGdseXBoc1tuZXdSZXBoUG9zICsgMV0uc2hhcGVySW5mby5wb3NpdGlvbiAmIChQT1NJVElPTlMuUG9zdF9DIHwgUE9TSVRJT05TLkFmdGVyX1Bvc3QgfCBQT1NJVElPTlMuU01WRCkpKSB7XG4gICAgICAgICAgICBuZXdSZXBoUG9zKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm91bmQgPSBuZXdSZXBoUG9zIDwgZW5kO1xuICAgICAgICB9XG4gICAgICB9IC8vICA1LiBJZiBubyBjb25zb25hbnQgaXMgZm91bmQgaW4gc3RlcHMgMyBvciA0LCBtb3ZlIHJlcGggdG8gYSBwb3NpdGlvblxuICAgICAgLy8gICAgIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZmlyc3QgcG9zdC1iYXNlIG1hdHJhLCBzeWxsYWJsZSBtb2RpZmllclxuICAgICAgLy8gICAgIHNpZ24gb3IgdmVkaWMgc2lnbiB0aGF0IGhhcyBhIHJlb3JkZXJpbmcgY2xhc3MgYWZ0ZXIgdGhlIGludGVuZGVkXG4gICAgICAvLyAgICAgcmVwaCBwb3NpdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHRoZSByZW9yZGVyaW5nIHBvc2l0aW9uIGZvciByZXBoXG4gICAgICAvLyAgICAgaXMgcG9zdC1tYWluLCBpdCB3aWxsIHNraXAgYWJvdmUtYmFzZSBtYXRyYXMgdGhhdCBhbHNvIGhhdmUgYVxuICAgICAgLy8gICAgIHBvc3QtbWFpbiBwb3NpdGlvbi5cblxuXG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIC8vIENvcGllZCBmcm9tIHN0ZXAgMi5cbiAgICAgICAgbmV3UmVwaFBvcyA9IHN0YXJ0ICsgMTtcblxuICAgICAgICB3aGlsZSAobmV3UmVwaFBvcyA8IGJhc2UgJiYgIWlzSGFsYW50T3JDb2VuZyhnbHlwaHNbbmV3UmVwaFBvc10pKSB7XG4gICAgICAgICAgbmV3UmVwaFBvcysrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld1JlcGhQb3MgPCBiYXNlICYmIGlzSGFsYW50T3JDb2VuZyhnbHlwaHNbbmV3UmVwaFBvc10pKSB7XG4gICAgICAgICAgLy8gLT5JZiBaV0ogb3IgWldOSiBhcmUgZm9sbG93aW5nIHRoaXMgaGFsYW50LCBwb3NpdGlvbiBpcyBtb3ZlZCBhZnRlciBpdC5cbiAgICAgICAgICBpZiAobmV3UmVwaFBvcyArIDEgPCBiYXNlICYmIGlzSm9pbmVyKGdseXBoc1tuZXdSZXBoUG9zICsgMV0pKSB7XG4gICAgICAgICAgICBuZXdSZXBoUG9zKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIDYuIE90aGVyd2lzZSwgcmVvcmRlciByZXBoIHRvIHRoZSBlbmQgb2YgdGhlIHN5bGxhYmxlLlxuXG5cbiAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgbmV3UmVwaFBvcyA9IGVuZCAtIDE7XG5cbiAgICAgICAgd2hpbGUgKG5ld1JlcGhQb3MgPiBzdGFydCAmJiBnbHlwaHNbbmV3UmVwaFBvc10uc2hhcGVySW5mby5wb3NpdGlvbiA9PT0gUE9TSVRJT05TLlNNVkQpIHtcbiAgICAgICAgICBuZXdSZXBoUG9zLS07XG4gICAgICAgIH0gLy8gSWYgdGhlIFJlcGggaXMgdG8gYmUgZW5kaW5nIHVwIGFmdGVyIGEgTWF0cmEsSGFsYW50IHNlcXVlbmNlLFxuICAgICAgICAvLyBwb3NpdGlvbiBpdCBiZWZvcmUgdGhhdCBIYWxhbnQgc28gaXQgY2FuIGludGVyYWN0IHdpdGggdGhlIE1hdHJhLlxuICAgICAgICAvLyBIb3dldmVyLCBpZiBpdCdzIGEgcGxhaW4gQ29uc29uYW50LEhhbGFudCB3ZSBzaG91bGRuJ3QgZG8gdGhhdC5cbiAgICAgICAgLy8gVW5pc2NyaWJlIGRvZXNuJ3QgZG8gdGhpcy5cbiAgICAgICAgLy8gVEVTVDogVSswOTMwLFUrMDk0RCxVKzA5MTUsVSswOTRCLFUrMDk0RFxuXG5cbiAgICAgICAgaWYgKGlzSGFsYW50T3JDb2VuZyhnbHlwaHNbbmV3UmVwaFBvc10pKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2kyMCA9IGJhc2UgKyAxOyBfaTIwIDwgbmV3UmVwaFBvczsgX2kyMCsrKSB7XG4gICAgICAgICAgICBpZiAoZ2x5cGhzW19pMjBdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuTSkge1xuICAgICAgICAgICAgICBuZXdSZXBoUG9zLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByZXBoID0gZ2x5cGhzW3N0YXJ0XTtcbiAgICAgIGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbc3RhcnQsIDBdLmNvbmNhdChnbHlwaHMuc3BsaWNlKHN0YXJ0ICsgMSwgbmV3UmVwaFBvcyAtIHN0YXJ0KSkpO1xuICAgICAgZ2x5cGhzW25ld1JlcGhQb3NdID0gcmVwaDtcblxuICAgICAgaWYgKHN0YXJ0IDwgYmFzZSAmJiBiYXNlIDw9IG5ld1JlcGhQb3MpIHtcbiAgICAgICAgYmFzZS0tO1xuICAgICAgfVxuICAgIH0gLy8gbyBSZW9yZGVyIHByZS1iYXNlIHJlb3JkZXJpbmcgY29uc29uYW50czpcbiAgICAvL1xuICAgIC8vIElmIGEgcHJlLWJhc2UgcmVvcmRlcmluZyBjb25zb25hbnQgaXMgZm91bmQsIHJlb3JkZXIgaXQgYWNjb3JkaW5nIHRvXG4gICAgLy8gdGhlIGZvbGxvd2luZyBydWxlczpcblxuXG4gICAgaWYgKHRyeVByZWYgJiYgYmFzZSArIDEgPCBlbmQpIHtcbiAgICAgIGZvciAodmFyIF9pMjEgPSBiYXNlICsgMTsgX2kyMSA8IGVuZDsgX2kyMSsrKSB7XG4gICAgICAgIGlmIChnbHlwaHNbX2kyMV0uZmVhdHVyZXMucHJlZikge1xuICAgICAgICAgIC8vIDEuIE9ubHkgcmVvcmRlciBhIGdseXBoIHByb2R1Y2VkIGJ5IHN1YnN0aXR1dGlvbiBkdXJpbmcgYXBwbGljYXRpb25cbiAgICAgICAgICAvLyAgICBvZiB0aGUgPHByZWY+IGZlYXR1cmUuIChOb3RlIHRoYXQgYSBmb250IG1heSBzaGFwZSBhIFJhIGNvbnNvbmFudCB3aXRoXG4gICAgICAgICAgLy8gICAgdGhlIGZlYXR1cmUgZ2VuZXJhbGx5IGJ1dCBibG9jayBpdCBpbiBjZXJ0YWluIGNvbnRleHRzLilcbiAgICAgICAgICAvLyBOb3RlOiBXZSBqdXN0IGNoZWNrIHRoYXQgc29tZXRoaW5nIGdvdCBzdWJzdGl0dXRlZC4gIFdlIGRvbid0IGNoZWNrIHRoYXRcbiAgICAgICAgICAvLyB0aGUgPHByZWY+IGZlYXR1cmUgYWN0dWFsbHkgZGlkIGl0Li4uXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBSZW9yZGVyIHByZWYgb25seSBpZiBpdCBsaWdhdGVkLlxuICAgICAgICAgIGlmIChnbHlwaHNbX2kyMV0uaXNMaWdhdGVkICYmICFnbHlwaHNbX2kyMV0uaXNNdWx0aXBsaWVkKSB7XG4gICAgICAgICAgICAvLyAyLiBUcnkgdG8gZmluZCBhIHRhcmdldCBwb3NpdGlvbiB0aGUgc2FtZSB3YXkgYXMgZm9yIHByZS1iYXNlIG1hdHJhLlxuICAgICAgICAgICAgLy8gICAgSWYgaXQgaXMgZm91bmQsIHJlb3JkZXIgcHJlLWJhc2UgY29uc29uYW50IGdseXBoLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIDMuIElmIHBvc2l0aW9uIGlzIG5vdCBmb3VuZCwgcmVvcmRlciBpbW1lZGlhdGVseSBiZWZvcmUgbWFpblxuICAgICAgICAgICAgLy8gICAgY29uc29uYW50LlxuICAgICAgICAgICAgdmFyIF9uZXdQb3MgPSBiYXNlOyAvLyBNYWxheWFsYW0gLyBUYW1pbCBkbyBub3QgaGF2ZSBcImhhbGZcIiBmb3JtcyBvciBleHBsaWNpdCB2aXJhbWEgZm9ybXMuXG4gICAgICAgICAgICAvLyBUaGUgZ2x5cGhzIGZvcm1lZCBieSAnaGFsZicgYXJlIENoaWxsdXMgb3IgbGlnYXRlZCBleHBsaWNpdCB2aXJhbWFzLlxuICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBwb3NpdGlvbiBtYXRyYSBhZnRlciB0aGVtLlxuXG4gICAgICAgICAgICBpZiAocGxhbi51bmljb2RlU2NyaXB0ICE9PSAnTWFsYXlhbGFtJyAmJiBwbGFuLnVuaWNvZGVTY3JpcHQgIT09ICdUYW1pbCcpIHtcbiAgICAgICAgICAgICAgd2hpbGUgKF9uZXdQb3MgPiBzdGFydCAmJiAhKGdseXBoc1tfbmV3UG9zIC0gMV0uc2hhcGVySW5mby5jYXRlZ29yeSAmIChDQVRFR09SSUVTLk0gfCBIQUxBTlRfT1JfQ09FTkdfRkxBR1MpKSkge1xuICAgICAgICAgICAgICAgIF9uZXdQb3MtLTtcbiAgICAgICAgICAgICAgfSAvLyBJbiBLaG1lciBjb2VuZyBtb2RlbCwgYSBILFJhIGNhbiBnbyAqYWZ0ZXIqIG1hdHJhcy4gIElmIGl0IGdvZXMgYWZ0ZXIgYVxuICAgICAgICAgICAgICAvLyBzcGxpdCBtYXRyYSwgaXQgc2hvdWxkIGJlIHJlb3JkZXJlZCB0byAqYmVmb3JlKiB0aGUgbGVmdCBwYXJ0IG9mIHN1Y2ggbWF0cmEuXG5cblxuICAgICAgICAgICAgICBpZiAoX25ld1BvcyA+IHN0YXJ0ICYmIGdseXBoc1tfbmV3UG9zIC0gMV0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5NKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9vbGRQb3MyID0gX2kyMTtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSBiYXNlICsgMTsgaiA8IF9vbGRQb3MyOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGlmIChnbHlwaHNbal0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5NKSB7XG4gICAgICAgICAgICAgICAgICAgIF9uZXdQb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfbmV3UG9zID4gc3RhcnQgJiYgaXNIYWxhbnRPckNvZW5nKGdseXBoc1tfbmV3UG9zIC0gMV0pKSB7XG4gICAgICAgICAgICAgIC8vIC0+IElmIFpXSiBvciBaV05KIGZvbGxvdyB0aGlzIGhhbGFudCwgcG9zaXRpb24gaXMgbW92ZWQgYWZ0ZXIgaXQuXG4gICAgICAgICAgICAgIGlmIChfbmV3UG9zIDwgZW5kICYmIGlzSm9pbmVyKGdseXBoc1tfbmV3UG9zXSkpIHtcbiAgICAgICAgICAgICAgICBfbmV3UG9zKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIF9vbGRQb3MgPSBfaTIxO1xuICAgICAgICAgICAgdmFyIF90bXAgPSBnbHlwaHNbX29sZFBvc107XG4gICAgICAgICAgICBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW19uZXdQb3MgKyAxLCAwXS5jb25jYXQoZ2x5cGhzLnNwbGljZShfbmV3UG9zLCBfb2xkUG9zIC0gX25ld1BvcykpKTtcbiAgICAgICAgICAgIGdseXBoc1tfbmV3UG9zXSA9IF90bXA7XG5cbiAgICAgICAgICAgIGlmIChfbmV3UG9zIDw9IGJhc2UgJiYgYmFzZSA8IF9vbGRQb3MpIHtcbiAgICAgICAgICAgICAgYmFzZSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBBcHBseSAnaW5pdCcgdG8gdGhlIExlZnQgTWF0cmEgaWYgaXQncyBhIHdvcmQgc3RhcnQuXG5cblxuICAgIGlmIChnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8ucG9zaXRpb24gPT09IFBPU0lUSU9OUy5QcmVfTSAmJiAoIXN0YXJ0IHx8ICEvQ2Z8TW4vLnRlc3QodW5pY29kZS5nZXRDYXRlZ29yeShnbHlwaHNbc3RhcnQgLSAxXS5jb2RlUG9pbnRzWzBdKSkpKSB7XG4gICAgICBnbHlwaHNbc3RhcnRdLmZlYXR1cmVzLmluaXQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBuZXh0U3lsbGFibGUoZ2x5cGhzLCBzdGFydCkge1xuICBpZiAoc3RhcnQgPj0gZ2x5cGhzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0O1xuICB2YXIgc3lsbGFibGUgPSBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8uc3lsbGFibGU7XG5cbiAgd2hpbGUgKCsrc3RhcnQgPCBnbHlwaHMubGVuZ3RoICYmIGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5zeWxsYWJsZSA9PT0gc3lsbGFibGUpIHtcbiAgfVxuXG4gIHJldHVybiBzdGFydDtcbn1cblxudmFyIGJhc2U2NERlZmxhdGVkVHJpZSQzID0gXCJlSndCRmc3cDhRQUNBQUFBQUFBQUFBQzZFQUVGRHZyeDdaeDdqRjlGRmNkbmQ3djdlMjEzdXhaYW9Md2ZwcVVJUlpvWXBERVFJTkdVSm1wREZQbkQxZ2MyWXJCQmpZMUthSWlHQWhJSmhsQmpoQnFqbFRUMUdWQmpRUGtEU0FWTmlrUkJCUlVqQVZHRVNFakZ4UGdkNzV6OHpzNmVlZDdYRm40bitXVHVZNTduek15ZG1UdjNycHBRNmhTd0Zwd0RMZ1Fid1dad3VibDJYZ1h1RnJBTmJBYzdQUDUyZ2wzQzlSdkJyV0EzMkFPK0RiNEg3Z0gzR1I1ay9uOEJIZ1cvQTA4TDhUMEZuZ0dyd0FzbWI2dk0vVldNVjhBaG9KWW8xUVhMd0Fwd1BIZ2pPQk9zQnh2QVJlQVM4Rzd3UHZBQjhGR3dIZXdBTzhFdWNBdllEZTRFZThGK2NEZTRGendBSGdhL0JyOEhmd0hQZ2hmQklhQW1sZXFBV2JBU25BQk9CV2RNRm5sZkQvYzhjS0U1M3doM003Z2NiQUhid01mQnA4MzlhK0YrQWR3TWJnTmZteHlXL1p1VDgzVlJsdjJJNy9zVng4bjVzUlgzZlRoL0VQd0svQVk4TlZtVTl4bndBbmdGL0RlUW42a3BwV2JBQ3JCcXFnaC9DdHcxNEd4d3JybDJBZHgzZ0hlQnk2WUszV3EyNHZoRDRHUGdrK0J6NFBNbXpFM0cvVExjcjRJYldMcmZ3UG0rS1gvZWZoQzRIOE5QRU1mOTRBQTRDSjR3NWRMM25vVDdWL0FQOExLNTlpcmM4UTdxSUZqYUNjZC9KUHdjMXluaVBCSHVhbkFXV0EvV21iUTI0UGdNRTlmYmpGL054ZXlZc3duWEx3V1hXZmUzT3Z3VEh6RnBuODMwNXZQUC9lV2k0L2d3MHJ3S1hBMTJkT0xqMzJucDkwekJ6eTc0dVFYczdoVDFiUStMZjZsSEgzdHhieis0Rzl6cnNLUFUvaC9vRE12MUNJNGZBMzhBVDV1MDlQSGZ6UEZqQVh0VW9kOFJJMTZQak5yUGlCRWpSb3dZTVdMRWlOY0M2enJETllFYkl2ei9rODFkLzJYTlk3OFlFZjQvQ0RQUkxkWmhCbkNYZ3hYZ09IQ2F1ZjRtdU91N2hmOE5jTThIYndmdk5QZmZDM2NMMkdiT3Q4UGRBWFoyM2VscWY3czg5MGVNR0RGaVJMMmMwekp0bDMvRWlCSDFVSGY3L2hMR2o3ZDNpL2RDZDhEOWxqQ2UvRTYzZUxldmorK3g3dCszQ01hZmY1OHVtRjZxMUNYZ2tla3dPK0h2NTVaZk5UTThYbzNqTFdBUGVCd2NNdmRXejJLTVBqdjB0d1BIZTZDRFA0RVRld2dEOXZTS3Nmd2RVNFg3c0RubkRQcndOelprWTMraG41dHdiUis3L2p5TzF3NlV1aExzQTgrRHRkUHRQMy9hSnRSZUhvVHVEcGg2ZWhEdTQ4WmVlcDc0YkRmOWVicmZ1R2RHK3VlOG1KR2UxQ2RJNFY5RzNLOTI1L3VqL083M3BEZU8rdGtEYzcxaDJiUy9vM0IrYks4NFA3azM5SDk2YjM0K1l2dXJXRnU2eXZmbW5uenZyYmkrQVZ3RU5vTE40RDNnU1hQLy9UaStBbHdGcmpiM1B3T3VBemVDVzhIdExPNDdjYndYN0FNL0JEOEY5NE1ENEtDUUJ6MFBmd0xYLzJ6dTZmMDB6K0g0SmNFditmODM3bzMxaCtjOUhNK0JvL3ZGK1VuOVltK0p2cjhHeDJmMzNUclQvcy90eXpwejZmMEMrTDhZYkFLWGdzdkFWcFAydG43UlptTHR0aDMrUHdXdUFkZUI2OEhOTEQrMzRmZ3I0T3ZnTHZCZFZyWVFQL0tVKzFIazhXZjlkcDQ1TGwwL0ZNalBZdW9ycTlSQkcrbi9zajgvM29ORzk3K0YrOGQrdVh6R2x1TnBUN3V6MDcrcjR2SXZ4dnBWaGYzTDFKTzJ5NWRhL3VmNnplYmJ0NDlxcjFrM2Y2bGZ1SWZnS293eHB3YkYrZlJnNlBlSWdWdzJ1cittSTVlcjd2b2ZJclNYTEdhdjJjcEI0UjRQOTdUQjRWSHZiUDJIN3A4dTJEY1U3MFBDMkhheEVkdnYzTkJnWHM0YXpMOTJUVWIrejVtSXE0ZTZEcitGdFdPOXYzTUR6czhmRk8xL0hkdHZlYkh4TnpENTJ3VDMwa0d4Ny9aeXVCOFU2b2l2N2F5TzJNdVppODc3bFlQNTEvamUxZWRRTjYvb0RNditDZU4rRnU1ZG5XSCtUMlZocmpWK3JvZDdzeEQzcmJpMk83R2R0TTB4RTJOcU1jZ1lZOXc2NTM3SW5XRDNsMFJpeDZjYzErcVd4YUh4a1pCUVhSb1hJRnVOQytIR0xYZlNRQkpUdCtxdUN4TTF4MSsxVExXZGdSSVNZOHZYVTl1WDJzenJTY1ljTEFheDg4SDd2TU5kcERHRGZYeTRTRzZka2NaU09mYTE5WGM0NmJDcGRoY2JkNHJ1cTI2SDNQYXVmaW5FYTExYzh3NSt2d3E3NU9xZjh0UmhZQm9iUGYrcG1oNHdTNEwvUDlmSDA4WmRhdEd6NkZ2TXNMQlV4bG1tc3g2TEt6Wi81RDlubnFoSzZHV0MyYVliR1pleS9Obm5xWVRDS2pVL0hjay9TWXg5U2FZTjlybTJiMHdmMGhldXVjcGtwNTJxbzFCN3B2dFVKL2pjanJjL1g5cStzdVRrT2RXK29XTXRBK05LOXJXRjJxOTlQbVA1bTFWK2lhbVBvVEF1dEYyV3FhSWQwdngzVHFVOXcyTHQ2N05KU3A2cnNtOXUreVdiOGo1YXFmbjljMVZTdHYzU1dEYVVCbjlPTG1Nb2RmajB6Nm4ycFdkclR2OGNFcnZ0Mnpxdzg1bHIzM0UxdjN5NW9tMGNlcFpMNVhEcFhQS3JCUDh1ZjY1MHBPdXhkWWdMdFZVK3Z1SXlyZWJibjUvSHRtL3ArZXlTbkhKSWE3Q2h0UW5lbHJ2bVBMWDlwZVEzcHoybjZrR2YrOGJMU2kzc3EvbDV5SjQwbnBiMFlFdlo5dXlUMERPWitnSnU0NWl4dkZTdXB1enI4a3RpOTlkMTJGZHEvN2JZZVMxajN6Y1ljb1NQdFZLZXgxVzN2eHpJSG1SUEc2N1RVUCs3WE1sOUhKLy94OWkwenZaS1lxK1ZTT3NtS2ZiTXlWdlZ0b3lOVTZuNWVZbk5yOVJtZVYyaHVrUTJXOHI4VER2dzFZZFVuVkkrY3RiNjJtaDdQdHYwMkRWNzdVa2FGNU9NSzMvY09ueEhMWnhiZE15OXN2c1JiSDBxeTgydHN6azZqSW1iL01UcVc1L1BzYkMrY3BIWStsYk1UU20veTc4Vys1MS9MdVBNdGNlc3JqRnQxZmJUY1U1YUxzMTdKWW0xY1ozWXd0ZU1YV3ZJTmpTRzRPY2ROVndEOXBYM2lBUlVvdjg2MEJLYUswMTY3dkh3cm5vc3RRbEo2cTRiS1VqUFVzMjBrdXVMWHFmVWRXYkdYRHNTckZCRkh6V1htTGE5TDQyT1EzbDF2ZGVZVS9QejBWZkRNWlVkUjFlQXgyV1hQVWUzYzJvNEZxRjRwSFM3UnE5TGhIejRvTEJrdnpiMkkwaDF2TzEzbzZGMlhvV2UrRjYzS3FVT0hlVStYK3hydkgrb08zMEpubjZLanFwT1AxV3EwTDlxT1AxUTNyVHc1NFkwZG5YTndRZ2FmL1RWY095aG44RXJWVEgrbW1UUUdvNCt0dHVJL1J3bVc2V1d2eTd4OVlGTjlJdjZ1VnAxSFVqUkthOGI5bmlEc01kcVhJNHl6TEpqbTZOTlBKTkNlTHV2VDkzZlVIVzdLVnYzY3RQTkRXL0QxNm5LNW85TDdITzdidXFzQTlRT2FDMks5MU4xMWtzYW8rdjJ0ZEp3akpMblNUTXNiNjcyeXVlWTFLNmxQbDVhL3lHb3ZmSTJPNWxRSnBlVURSOGF0OVk5cHVVNjBuWnFlcythZnZaS2MwSjdYVUd5TlQybjYraVBRdXRJTWF3Q3h4clhSZXJjb1MwN2NYZ2Jsdm9ZYXNzenpGL2Q5Y1plcXllWCtwK1lkMjVhYkZ1N3ltNzNRWHk5WUtXSDR3eTY3Nkc5WGE2MFUvcG5Makg5VHF5VW5Wdnova1g3bjNWQWZxVHJYVTg0YVMrYmRJM3lxK09qOTZHMEgwSFR4cmRZMHZneEpNZURFOWo1aElOWSs5anJZYW4yVFZsL2libWVHcmY5ckV3SnArWEVpREttU0k1TktadzlQbWxDT21FdlhwSFdyS1ZyS2ZIRmhBdXRuVXV1bEU1S3ZzcVdvOHIxMHBUOCtNWVVJWnY1N09zS1Z3VlNPZXRJeHpmV2lwSFUrT3JLYjFrL2RlcXpqWFJ6YkJramJaZWg2ZktHcEUxYnBLUmZaOTFOeWNkRXpYbjI2ZDBlSTViVlh4WDZiMEpDYVRXaC82YnNuS1B2cW0yVDgrN0JOUzl3eFJsYUwzT0Z6eTFEenR4QzhxOHk0a3FaajRXa3lYNm5pZnJldEQ0azRmYkp6VnR1dWVycVEwUGxyY29Pcm5pYXJnZXgwbFQ3S1Z2V3R2SlExaWFMb1crb3NyKzE0MDMxUyt1NDlyNHc2YjFIekxkVlplQnIzTFRHbnF2NzJIQlZseUgxZVNydDEyc1N2ZWRSK25iRmhhNFhNV3Q2VlA2Yzl3dGNYTzliVTNHbDR4bzdTVzJDSSsxQjV1OE1Vc3NmZy8zZTBuNlh5ZDhENlgwa0tkOXJVdG5iZkZkclErL2dYSHQ2NlQydDNndWc2L0ZKYXZpdmlkeHhiMjU5OWRtYjlrWFVyYS9ZTktUOUQvd2RPRjJ6OTBQSENFOW5aVVJlcUs1SzRXUDBiOXV4YWgzeTlReitQTkgzNlAxZWxlMmt4MXl5ZzIwM1Z6anE1OGh0VW5MMHIrc2FyM3Q5SlQ4M2FZOStqUEQ0cFcvaStiNjlNUk4zWGQ5SjFpSDJlT2Jra3NTdU1mZ2taazFDdWhmeTYwckg1NC9tam5XTXI2VjhqQ3UvenFSMW81UTA3R3RLeWJwdVN1ejZaNCt4ZlhQdEt0S3JhKzZVSTR0bC9hRE1IRmF5WDVtNWNGTmxka2xkNnhKTjJManVPbDEzL0RINjBNOU8reHRzMzdjZzVJLzJhb1hHYS9aNVhaRG9PY3BBTGR4cnB5VzBkelJtTEZIMW1uM2Q3YlBPZHd1SFN4NmFUak9sbkh6T1F2c1VtMmd2OWh6R3RSL2I5YjEzYUY1dnl5a2xhV0llY0twcS8xK3UwbjhCN1QzUFd2ZTZmNVBHN2RJYVcxdEk5VXI2OXB2dTBYZmZLaUVOYWIwaGR1OTNTam94MkRacE9uM2ZQeVY5N1ZpSFhXNVFhcUZPYWU4NjJTcDNmVTZhWTFhdEEwb3JWcXBNTTlkbTluc1crNzhJMmtiMHYweFhmMHZ2QUdMeUtQa3JxNHVVOEw3MlVYVmRTRUhyME5mL0VnUGxIaCtYcmFPNS8xOVRudk9xYldtbjVmSkQ0M0JleisxdmQzZy9YZVovcUVyNSszeFh1eVB4dmF0U0FYOHBVa2U5VGVuMzdmZUdWTmZJVGx5a2ZpYWxEdkgrUHVYYnk3SmxwVEVHLzFhTC9nbEE1YVV4bEozWGtKUnQzM1dWblVUNkQ0SmQ1cGc1YkM1Mm5zditGOTdWYmxQcU9pOS96OHB2cXBTMWY0NU9xNVFVWGZOL2VJV2VpWFo3cWlMOXNwRG9kNlg2dmVscEt2eFBLcnRzWmZQUDdUaWVFZDdYNXFXeG90M09VL09mVzg2cSt6RzdEZE40aU9ZclZEWStYbWhDbHFpRi95aVFrUDRoVmpXVEpoMTdQS0wxcE9keWN4YXViejdwZXN3NHkxZCtxVisyODd6Y3dkR0pVRG1YcVlWclVVdVUrM25rcXZOTjlFZSsveDd3dFhlN1RmTjJiZmNwYmF3M2NFa2RGOGJHWGVaZmpMNzcxTmZ6UFkwcDQvalllaFR5V3daWGY4T2x4MXgrVEdYbDZ6bjB2K3VZUFVVNWRTUW12SEljMTlrV2ZmOTVWMG9lUDFhbG54QVRhdUcvTm1MYWVwdnZVS3NZcTlZMS9xM3ozVTliNzdGb1RPbXoyNWpqZWhOUzV6d21WdXk5S3FsN01KcmFuOURFSHBXWStKc3E4MkxjN3lHSmxFWmI3YW1xY3Nmb00wWDNkRnozMm9WVWpxcmpLQnZuWW13WFplT29zbjNXMWRhcjFGdlp2UGlrN25UTDVNMlh2NmFreWZxVmszNVYrYzhOWDFYNk1lbVUxWFBJYngzNVRrbS9qcmh0U2JHZEpMbjF3Q1gvQThvM3FKND1cIjtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRnKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRnKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRnKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkZyhvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGcobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRnKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSQ2KHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkkMyhvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG4vLyB3ZSBtYXkgYmUgcnVubmluZyBpbiBhIGJyb3dzZXIgc28gd2UgbWFrZSBhbiBVaW50OEFycmF5XG5cbnZhciB1c2VEYXRhJDEgPSBKU09OLnBhcnNlKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBwYWtvLmluZmxhdGUoYmFzZTY0QXJyYXlidWZmZXJfMihiYXNlNjREZWZsYXRlZFVzZURhdGEpKSkpO1xudmFyIHRyaWVEYXRhJDMgPSBwYWtvLmluZmxhdGUoYmFzZTY0QXJyYXlidWZmZXJfMihiYXNlNjREZWZsYXRlZFRyaWUkMykpO1xudmFyIGNhdGVnb3JpZXMgPSB1c2VEYXRhJDEuY2F0ZWdvcmllcyxcbiAgICBkZWNvbXBvc2l0aW9ucyQxID0gdXNlRGF0YSQxLmRlY29tcG9zaXRpb25zO1xudmFyIHRyaWUkMyA9IG5ldyB1bmljb2RlVHJpZSh0cmllRGF0YSQzKTtcbnZhciBzdGF0ZU1hY2hpbmUkMSA9IG5ldyBkZmEodXNlRGF0YSQxKTtcbi8qKlxuICogVGhpcyBzaGFwZXIgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFVuaXZlcnNhbCBTaGFwaW5nIEVuZ2luZSwgd2hpY2hcbiAqIHVzZXMgVW5pY29kZSBkYXRhIHRvIHNoYXBlIGEgbnVtYmVyIG9mIHNjcmlwdHMgd2l0aG91dCBhIGRlZGljYXRlZCBzaGFwaW5nIGVuZ2luZS5cbiAqIFNlZSBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvT3BlblR5cGVEZXYvVVNFL2ludHJvLmh0bS5cbiAqL1xuXG52YXIgVW5pdmVyc2FsU2hhcGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRGVmYXVsdFNoYXBlcikge1xuICBfaW5oZXJpdHNMb29zZSQ2KFVuaXZlcnNhbFNoYXBlciwgX0RlZmF1bHRTaGFwZXIpO1xuXG4gIGZ1bmN0aW9uIFVuaXZlcnNhbFNoYXBlcigpIHtcbiAgICByZXR1cm4gX0RlZmF1bHRTaGFwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgVW5pdmVyc2FsU2hhcGVyLnBsYW5GZWF0dXJlcyA9IGZ1bmN0aW9uIHBsYW5GZWF0dXJlcyhwbGFuKSB7XG4gICAgcGxhbi5hZGRTdGFnZShzZXR1cFN5bGxhYmxlcyQxKTsgLy8gRGVmYXVsdCBnbHlwaCBwcmUtcHJvY2Vzc2luZyBncm91cFxuXG4gICAgcGxhbi5hZGRTdGFnZShbJ2xvY2wnLCAnY2NtcCcsICdudWt0JywgJ2FraG4nXSk7IC8vIFJlb3JkZXJpbmcgZ3JvdXBcblxuICAgIHBsYW4uYWRkU3RhZ2UoY2xlYXJTdWJzdGl0dXRpb25GbGFncyk7XG4gICAgcGxhbi5hZGRTdGFnZShbJ3JwaGYnXSwgZmFsc2UpO1xuICAgIHBsYW4uYWRkU3RhZ2UocmVjb3JkUnBoZik7XG4gICAgcGxhbi5hZGRTdGFnZShjbGVhclN1YnN0aXR1dGlvbkZsYWdzKTtcbiAgICBwbGFuLmFkZFN0YWdlKFsncHJlZiddKTtcbiAgICBwbGFuLmFkZFN0YWdlKHJlY29yZFByZWYpOyAvLyBPcnRob2dyYXBoaWMgdW5pdCBzaGFwaW5nIGdyb3VwXG5cbiAgICBwbGFuLmFkZFN0YWdlKFsncmtyZicsICdhYnZmJywgJ2Jsd2YnLCAnaGFsZicsICdwc3RmJywgJ3ZhdHUnLCAnY2pjdCddKTtcbiAgICBwbGFuLmFkZFN0YWdlKHJlb3JkZXIpOyAvLyBUb3BvZ3JhcGhpY2FsIGZlYXR1cmVzXG4gICAgLy8gU2NyaXB0cyB0aGF0IG5lZWQgdGhpcyBhcmUgaGFuZGxlZCBieSB0aGUgQXJhYmljIHNoYXBlciwgbm90IGltcGxlbWVudGVkIGhlcmUgZm9yIG5vdy5cbiAgICAvLyBwbGFuLmFkZFN0YWdlKFsnaXNvbCcsICdpbml0JywgJ21lZGknLCAnZmluYScsICdtZWQyJywgJ2ZpbjInLCAnZmluMyddLCBmYWxzZSk7XG4gICAgLy8gU3RhbmRhcmQgdG9wb2dyYXBoaWMgcHJlc2VudGF0aW9uIGFuZCBwb3NpdGlvbmFsIGZlYXR1cmUgYXBwbGljYXRpb25cblxuICAgIHBsYW4uYWRkU3RhZ2UoWydhYnZzJywgJ2Jsd3MnLCAncHJlcycsICdwc3RzJywgJ2Rpc3QnLCAnYWJ2bScsICdibHdtJ10pO1xuICB9O1xuXG4gIFVuaXZlcnNhbFNoYXBlci5hc3NpZ25GZWF0dXJlcyA9IGZ1bmN0aW9uIGFzc2lnbkZlYXR1cmVzKHBsYW4sIGdseXBocykge1xuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICAgIHZhciBjb2RlcG9pbnQgPSBnbHlwaHNbaV0uY29kZVBvaW50c1swXTtcblxuICAgICAgaWYgKGRlY29tcG9zaXRpb25zJDFbY29kZXBvaW50XSkge1xuICAgICAgICB2YXIgZGVjb21wb3NlZCA9IGRlY29tcG9zaXRpb25zJDFbY29kZXBvaW50XS5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICB2YXIgZyA9IHBsYW4uZm9udC5nbHlwaEZvckNvZGVQb2ludChjKTtcbiAgICAgICAgICByZXR1cm4gbmV3IEdseXBoSW5mbyhwbGFuLmZvbnQsIGcuaWQsIFtjXSwgZ2x5cGhzW2ldLmZlYXR1cmVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbaSwgMV0uY29uY2F0KGRlY29tcG9zZWQpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRGVjb21wb3NlIHNwbGl0IHZvd2Vsc1xuICAgIC8vIFRPRE86IGRvIHRoaXMgaW4gYSBtb3JlIGdlbmVyYWwgdW5pY29kZSBub3JtYWxpemVyXG4gICAgZm9yICh2YXIgaSA9IGdseXBocy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgX2xvb3AoaSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBVbml2ZXJzYWxTaGFwZXI7XG59KERlZmF1bHRTaGFwZXIpO1xuXG5fZGVmaW5lUHJvcGVydHkkMyhVbml2ZXJzYWxTaGFwZXIsIFwiemVyb01hcmtXaWR0aHNcIiwgJ0JFRk9SRV9HUE9TJyk7XG5cbmZ1bmN0aW9uIHVzZUNhdGVnb3J5KGdseXBoKSB7XG4gIHJldHVybiB0cmllJDMuZ2V0KGdseXBoLmNvZGVQb2ludHNbMF0pO1xufVxuXG52YXIgVVNFSW5mbyA9IGZ1bmN0aW9uIFVTRUluZm8oY2F0ZWdvcnksIHN5bGxhYmxlVHlwZSwgc3lsbGFibGUpIHtcbiAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5O1xuICB0aGlzLnN5bGxhYmxlVHlwZSA9IHN5bGxhYmxlVHlwZTtcbiAgdGhpcy5zeWxsYWJsZSA9IHN5bGxhYmxlO1xufTtcblxuZnVuY3Rpb24gc2V0dXBTeWxsYWJsZXMkMShmb250LCBnbHlwaHMpIHtcbiAgdmFyIHN5bGxhYmxlID0gMDtcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGcoc3RhdGVNYWNoaW5lJDEubWF0Y2goZ2x5cGhzLm1hcCh1c2VDYXRlZ29yeSkpKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgX3N0ZXAkdmFsdWUgPSBfc3RlcC52YWx1ZSxcbiAgICAgICAgc3RhcnQgPSBfc3RlcCR2YWx1ZVswXSxcbiAgICAgICAgZW5kID0gX3N0ZXAkdmFsdWVbMV0sXG4gICAgICAgIHRhZ3MgPSBfc3RlcCR2YWx1ZVsyXTtcbiAgICArK3N5bGxhYmxlOyAvLyBDcmVhdGUgc2hhcGVyIGluZm9cblxuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgZ2x5cGhzW2ldLnNoYXBlckluZm8gPSBuZXcgVVNFSW5mbyhjYXRlZ29yaWVzW3VzZUNhdGVnb3J5KGdseXBoc1tpXSldLCB0YWdzWzBdLCBzeWxsYWJsZSk7XG4gICAgfSAvLyBBc3NpZ24gcnBoZiBmZWF0dXJlXG5cblxuICAgIHZhciBsaW1pdCA9IGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gJ1InID8gMSA6IE1hdGgubWluKDMsIGVuZCAtIHN0YXJ0KTtcblxuICAgIGZvciAodmFyIF9pID0gc3RhcnQ7IF9pIDwgc3RhcnQgKyBsaW1pdDsgX2krKykge1xuICAgICAgZ2x5cGhzW19pXS5mZWF0dXJlcy5ycGhmID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYXJTdWJzdGl0dXRpb25GbGFncyhmb250LCBnbHlwaHMpIHtcbiAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZyhnbHlwaHMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgIHZhciBnbHlwaCA9IF9zdGVwMi52YWx1ZTtcbiAgICBnbHlwaC5zdWJzdGl0dXRlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZFJwaGYoZm9udCwgZ2x5cGhzKSB7XG4gIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGcoZ2x5cGhzKSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICB2YXIgZ2x5cGggPSBfc3RlcDMudmFsdWU7XG5cbiAgICBpZiAoZ2x5cGguc3Vic3RpdHV0ZWQgJiYgZ2x5cGguZmVhdHVyZXMucnBoZikge1xuICAgICAgLy8gTWFyayBhIHN1YnN0aXR1dGVkIHJlcGhhLlxuICAgICAgZ2x5cGguc2hhcGVySW5mby5jYXRlZ29yeSA9ICdSJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkUHJlZihmb250LCBnbHlwaHMpIHtcbiAgZm9yICh2YXIgX2l0ZXJhdG9yNCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZyhnbHlwaHMpLCBfc3RlcDQ7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNCgpKS5kb25lOykge1xuICAgIHZhciBnbHlwaCA9IF9zdGVwNC52YWx1ZTtcblxuICAgIGlmIChnbHlwaC5zdWJzdGl0dXRlZCkge1xuICAgICAgLy8gTWFyayBhIHN1YnN0aXR1dGVkIHByZWYgYXMgVlByZSwgYXMgdGhleSBiZWhhdmUgdGhlIHNhbWUgd2F5LlxuICAgICAgZ2x5cGguc2hhcGVySW5mby5jYXRlZ29yeSA9ICdWUHJlJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVvcmRlcihmb250LCBnbHlwaHMpIHtcbiAgdmFyIGRvdHRlZENpcmNsZSA9IGZvbnQuZ2x5cGhGb3JDb2RlUG9pbnQoMHgyNWNjKS5pZDtcblxuICBmb3IgKHZhciBzdGFydCA9IDAsIGVuZCA9IG5leHRTeWxsYWJsZSQxKGdseXBocywgMCk7IHN0YXJ0IDwgZ2x5cGhzLmxlbmd0aDsgc3RhcnQgPSBlbmQsIGVuZCA9IG5leHRTeWxsYWJsZSQxKGdseXBocywgc3RhcnQpKSB7XG4gICAgdmFyIGkgPSB2b2lkIDAsXG4gICAgICAgIGogPSB2b2lkIDA7XG4gICAgdmFyIGluZm8gPSBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm87XG4gICAgdmFyIHR5cGUgPSBpbmZvLnN5bGxhYmxlVHlwZTsgLy8gT25seSBhIGZldyBzeWxsYWJsZSB0eXBlcyBuZWVkIHJlb3JkZXJpbmcuXG5cbiAgICBpZiAodHlwZSAhPT0gJ3ZpcmFtYV90ZXJtaW5hdGVkX2NsdXN0ZXInICYmIHR5cGUgIT09ICdzdGFuZGFyZF9jbHVzdGVyJyAmJiB0eXBlICE9PSAnYnJva2VuX2NsdXN0ZXInKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIEluc2VydCBhIGRvdHRlZCBjaXJjbGUgZ2x5cGggaW4gYnJva2VuIGNsdXN0ZXJzLlxuXG5cbiAgICBpZiAodHlwZSA9PT0gJ2Jyb2tlbl9jbHVzdGVyJyAmJiBkb3R0ZWRDaXJjbGUpIHtcbiAgICAgIHZhciBnID0gbmV3IEdseXBoSW5mbyhmb250LCBkb3R0ZWRDaXJjbGUsIFsweDI1Y2NdKTtcbiAgICAgIGcuc2hhcGVySW5mbyA9IGluZm87IC8vIEluc2VydCBhZnRlciBwb3NzaWJsZSBSZXBoYS5cblxuICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQgJiYgZ2x5cGhzW2ldLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09ICdSJzsgaSsrKSB7XG4gICAgICB9XG5cbiAgICAgIGdseXBocy5zcGxpY2UoKytpLCAwLCBnKTtcbiAgICAgIGVuZCsrO1xuICAgIH0gLy8gTW92ZSB0aGluZ3MgZm9yd2FyZC5cblxuXG4gICAgaWYgKGluZm8uY2F0ZWdvcnkgPT09ICdSJyAmJiBlbmQgLSBzdGFydCA+IDEpIHtcbiAgICAgIC8vIEdvdCBhIHJlcGhhLiBSZW9yZGVyIGl0IHRvIGFmdGVyIGZpcnN0IGJhc2UsIGJlZm9yZSBmaXJzdCBoYWxhbnQuXG4gICAgICBmb3IgKGkgPSBzdGFydCArIDE7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICBpbmZvID0gZ2x5cGhzW2ldLnNoYXBlckluZm87XG5cbiAgICAgICAgaWYgKGlzQmFzZShpbmZvKSB8fCBpc0hhbGFudChnbHlwaHNbaV0pKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaGl0IGEgaGFsYW50LCBtb3ZlIGJlZm9yZSBpdDsgb3RoZXJ3aXNlIGl0J3MgYSBiYXNlOiBtb3ZlIHRvIGl0J3NcbiAgICAgICAgICAvLyBwbGFjZSwgYW5kIHNoaWZ0IHRoaW5ncyBpbiBiZXR3ZWVuIGJhY2t3YXJkLlxuICAgICAgICAgIGlmIChpc0hhbGFudChnbHlwaHNbaV0pKSB7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtzdGFydCwgMF0uY29uY2F0KGdseXBocy5zcGxpY2Uoc3RhcnQgKyAxLCBpIC0gc3RhcnQpLCBbZ2x5cGhzW2ldXSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBNb3ZlIHRoaW5ncyBiYWNrLlxuXG5cbiAgICBmb3IgKGkgPSBzdGFydCwgaiA9IGVuZDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICBpbmZvID0gZ2x5cGhzW2ldLnNoYXBlckluZm87XG5cbiAgICAgIGlmIChpc0Jhc2UoaW5mbykgfHwgaXNIYWxhbnQoZ2x5cGhzW2ldKSkge1xuICAgICAgICAvLyBJZiB3ZSBoaXQgYSBoYWxhbnQsIG1vdmUgYWZ0ZXIgaXQ7IG90aGVyd2lzZSBpdCdzIGEgYmFzZTogbW92ZSB0byBpdCdzXG4gICAgICAgIC8vIHBsYWNlLCBhbmQgc2hpZnQgdGhpbmdzIGluIGJldHdlZW4gYmFja3dhcmQuXG4gICAgICAgIGogPSBpc0hhbGFudChnbHlwaHNbaV0pID8gaSArIDEgOiBpO1xuICAgICAgfSBlbHNlIGlmICgoaW5mby5jYXRlZ29yeSA9PT0gJ1ZQcmUnIHx8IGluZm8uY2F0ZWdvcnkgPT09ICdWTVByZScpICYmIGogPCBpKSB7XG4gICAgICAgIGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbaiwgMSwgZ2x5cGhzW2ldXS5jb25jYXQoZ2x5cGhzLnNwbGljZShqLCBpIC0gaikpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbmV4dFN5bGxhYmxlJDEoZ2x5cGhzLCBzdGFydCkge1xuICBpZiAoc3RhcnQgPj0gZ2x5cGhzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0O1xuICB2YXIgc3lsbGFibGUgPSBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8uc3lsbGFibGU7XG5cbiAgd2hpbGUgKCsrc3RhcnQgPCBnbHlwaHMubGVuZ3RoICYmIGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5zeWxsYWJsZSA9PT0gc3lsbGFibGUpIHtcbiAgfVxuXG4gIHJldHVybiBzdGFydDtcbn1cblxuZnVuY3Rpb24gaXNIYWxhbnQoZ2x5cGgpIHtcbiAgcmV0dXJuIGdseXBoLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09ICdIJyAmJiAhZ2x5cGguaXNMaWdhdGVkO1xufVxuXG5mdW5jdGlvbiBpc0Jhc2UoaW5mbykge1xuICByZXR1cm4gaW5mby5jYXRlZ29yeSA9PT0gJ0InIHx8IGluZm8uY2F0ZWdvcnkgPT09ICdHQic7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkaChvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkaChvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkaChvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGgobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRoKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkaChhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cbnZhciBTSEFQRVJTID0ge1xuICBhcmFiOiBBcmFiaWNTaGFwZXIsXG4gIC8vIEFyYWJpY1xuICBtb25nOiBBcmFiaWNTaGFwZXIsXG4gIC8vIE1vbmdvbGlhblxuICBzeXJjOiBBcmFiaWNTaGFwZXIsXG4gIC8vIFN5cmlhY1xuICAnbmtvICc6IEFyYWJpY1NoYXBlcixcbiAgLy8gTidLb1xuICBwaGFnOiBBcmFiaWNTaGFwZXIsXG4gIC8vIFBoYWdzIFBhXG4gIG1hbmQ6IEFyYWJpY1NoYXBlcixcbiAgLy8gTWFuZGFpY1xuICBtYW5pOiBBcmFiaWNTaGFwZXIsXG4gIC8vIE1hbmljaGFlYW5cbiAgcGhscDogQXJhYmljU2hhcGVyLFxuICAvLyBQc2FsdGVyIFBhaGxhdmlcbiAgaGFuZzogSGFuZ3VsU2hhcGVyLFxuICAvLyBIYW5ndWxcbiAgYm5nMjogSW5kaWNTaGFwZXIsXG4gIC8vIEJlbmdhbGlcbiAgYmVuZzogSW5kaWNTaGFwZXIsXG4gIC8vIEJlbmdhbGlcbiAgZGV2MjogSW5kaWNTaGFwZXIsXG4gIC8vIERldmFuYWdhcmlcbiAgZGV2YTogSW5kaWNTaGFwZXIsXG4gIC8vIERldmFuYWdhcmlcbiAgZ2pyMjogSW5kaWNTaGFwZXIsXG4gIC8vIEd1amFyYXRpXG4gIGd1anI6IEluZGljU2hhcGVyLFxuICAvLyBHdWphcmF0aVxuICBndXJ1OiBJbmRpY1NoYXBlcixcbiAgLy8gR3VybXVraGlcbiAgZ3VyMjogSW5kaWNTaGFwZXIsXG4gIC8vIEd1cm11a2hpXG4gIGtuZGE6IEluZGljU2hhcGVyLFxuICAvLyBLYW5uYWRhXG4gIGtuZDI6IEluZGljU2hhcGVyLFxuICAvLyBLYW5uYWRhXG4gIG1sbTI6IEluZGljU2hhcGVyLFxuICAvLyBNYWxheWFsYW1cbiAgbWx5bTogSW5kaWNTaGFwZXIsXG4gIC8vIE1hbGF5YWxhbVxuICBvcnkyOiBJbmRpY1NoYXBlcixcbiAgLy8gT3JpeWFcbiAgb3J5YTogSW5kaWNTaGFwZXIsXG4gIC8vIE9yaXlhXG4gIHRhbWw6IEluZGljU2hhcGVyLFxuICAvLyBUYW1pbFxuICB0bWwyOiBJbmRpY1NoYXBlcixcbiAgLy8gVGFtaWxcbiAgdGVsdTogSW5kaWNTaGFwZXIsXG4gIC8vIFRlbHVndVxuICB0ZWwyOiBJbmRpY1NoYXBlcixcbiAgLy8gVGVsdWd1XG4gIGtobXI6IEluZGljU2hhcGVyLFxuICAvLyBLaG1lclxuICBiYWxpOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEJhbGluZXNlXG4gIGJhdGs6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gQmF0YWtcbiAgYnJhaDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBCcmFobWlcbiAgYnVnaTogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBCdWdpbmVzZVxuICBidWhkOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEJ1aGlkXG4gIGNha206IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gQ2hha21hXG4gIGNoYW06IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gQ2hhbVxuICBkdXBsOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIER1cGxveWFuXG4gIGVneXA6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gRWd5cHRpYW4gSGllcm9nbHlwaHNcbiAgZ3JhbjogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBHcmFudGhhXG4gIGhhbm86IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gSGFudW5vb1xuICBqYXZhOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEphdmFuZXNlXG4gIGt0aGk6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gS2FpdGhpXG4gIGthbGk6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gS2F5YWggTGlcbiAga2hhcjogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBLaGFyb3NodGhpXG4gIGtob2o6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gS2hvamtpXG4gIHNpbmQ6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gS2h1ZGF3YWRpXG4gIGxlcGM6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gTGVwY2hhXG4gIGxpbWI6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gTGltYnVcbiAgbWFoajogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBNYWhhamFuaVxuICAvLyBtYW5kOiBVbml2ZXJzYWxTaGFwZXIsIC8vIE1hbmRhaWNcbiAgLy8gbWFuaTogVW5pdmVyc2FsU2hhcGVyLCAvLyBNYW5pY2hhZWFuXG4gIG10ZWk6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gTWVpdGVpIE1heWVrXG4gIG1vZGk6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gTW9kaVxuICAvLyBtb25nOiBVbml2ZXJzYWxTaGFwZXIsIC8vIE1vbmdvbGlhblxuICAvLyAnbmtvICc6IFVuaXZlcnNhbFNoYXBlciwgLy8gTuKAmUtvXG4gIGhtbmc6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gUGFoYXdoIEhtb25nXG4gIC8vIHBoYWc6IFVuaXZlcnNhbFNoYXBlciwgLy8gUGhhZ3MtcGFcbiAgLy8gcGhscDogVW5pdmVyc2FsU2hhcGVyLCAvLyBQc2FsdGVyIFBhaGxhdmlcbiAgcmpuZzogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBSZWphbmdcbiAgc2F1cjogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBTYXVyYXNodHJhXG4gIHNocmQ6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gU2hhcmFkYVxuICBzaWRkOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFNpZGRoYW1cbiAgc2luaDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBTaW5oYWxhXG4gIHN1bmQ6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gU3VuZGFuZXNlXG4gIHN5bG86IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gU3lsb3RpIE5hZ3JpXG4gIHRnbGc6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gVGFnYWxvZ1xuICB0YWdiOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFRhZ2JhbndhXG4gIHRhbGU6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gVGFpIExlXG4gIGxhbmE6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gVGFpIFRoYW1cbiAgdGF2dDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBUYWkgVmlldFxuICB0YWtyOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFRha3JpXG4gIHRpYnQ6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gVGliZXRhblxuICB0Zm5nOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFRpZmluYWdoXG4gIHRpcmg6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gVGlyaHV0YVxuICBsYXRuOiBEZWZhdWx0U2hhcGVyLFxuICAvLyBMYXRpblxuICBERkxUOiBEZWZhdWx0U2hhcGVyIC8vIERlZmF1bHRcblxufTtcbmZ1bmN0aW9uIGNob29zZShzY3JpcHQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHNjcmlwdCkpIHtcbiAgICBzY3JpcHQgPSBbc2NyaXB0XTtcbiAgfVxuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkaChzY3JpcHQpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgIHZhciBzID0gX3N0ZXAudmFsdWU7XG4gICAgdmFyIHNoYXBlciA9IFNIQVBFUlNbc107XG5cbiAgICBpZiAoc2hhcGVyKSB7XG4gICAgICByZXR1cm4gc2hhcGVyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBEZWZhdWx0U2hhcGVyO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGkobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGkobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRpKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkaShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJDcoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBHU1VCUHJvY2Vzc29yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfT1RQcm9jZXNzb3IpIHtcbiAgX2luaGVyaXRzTG9vc2UkNyhHU1VCUHJvY2Vzc29yLCBfT1RQcm9jZXNzb3IpO1xuXG4gIGZ1bmN0aW9uIEdTVUJQcm9jZXNzb3IoKSB7XG4gICAgcmV0dXJuIF9PVFByb2Nlc3Nvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gR1NVQlByb2Nlc3Nvci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmFwcGx5TG9va3VwID0gZnVuY3Rpb24gYXBwbHlMb29rdXAobG9va3VwVHlwZSwgdGFibGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgc3dpdGNoIChsb29rdXBUeXBlKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBTaW5nbGUgU3Vic3RpdHV0aW9uXG4gICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlKTtcblxuICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZ2x5cGggPSB0aGlzLmdseXBoSXRlcmF0b3IuY3VyO1xuXG4gICAgICAgICAgc3dpdGNoICh0YWJsZS52ZXJzaW9uKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIGdseXBoLmlkID0gZ2x5cGguaWQgKyB0YWJsZS5kZWx0YUdseXBoSUQgJiAweGZmZmY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgIGdseXBoLmlkID0gdGFibGUuc3Vic3RpdHV0ZS5nZXQoaW5kZXgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBNdWx0aXBsZSBTdWJzdGl0dXRpb25cbiAgICAgICAgICB2YXIgX2luZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlKTtcblxuICAgICAgICAgIGlmIChfaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkZ2x5cGhzO1xuXG4gICAgICAgICAgICB2YXIgc2VxdWVuY2UgPSB0YWJsZS5zZXF1ZW5jZXMuZ2V0KF9pbmRleCk7XG4gICAgICAgICAgICB0aGlzLmdseXBoSXRlcmF0b3IuY3VyLmlkID0gc2VxdWVuY2VbMF07XG4gICAgICAgICAgICB0aGlzLmdseXBoSXRlcmF0b3IuY3VyLmxpZ2F0dXJlQ29tcG9uZW50ID0gMDtcbiAgICAgICAgICAgIHZhciBmZWF0dXJlcyA9IHRoaXMuZ2x5cGhJdGVyYXRvci5jdXIuZmVhdHVyZXM7XG4gICAgICAgICAgICB2YXIgY3VyR2x5cGggPSB0aGlzLmdseXBoSXRlcmF0b3IuY3VyO1xuICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gc2VxdWVuY2Uuc2xpY2UoMSkubWFwKGZ1bmN0aW9uIChnaWQsIGkpIHtcbiAgICAgICAgICAgICAgdmFyIGdseXBoID0gbmV3IEdseXBoSW5mbyhfdGhpcy5mb250LCBnaWQsIHVuZGVmaW5lZCwgZmVhdHVyZXMpO1xuICAgICAgICAgICAgICBnbHlwaC5zaGFwZXJJbmZvID0gY3VyR2x5cGguc2hhcGVySW5mbztcbiAgICAgICAgICAgICAgZ2x5cGguaXNMaWdhdGVkID0gY3VyR2x5cGguaXNMaWdhdGVkO1xuICAgICAgICAgICAgICBnbHlwaC5saWdhdHVyZUNvbXBvbmVudCA9IGkgKyAxO1xuICAgICAgICAgICAgICBnbHlwaC5zdWJzdGl0dXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGdseXBoLmlzTXVsdGlwbGllZCA9IHRydWU7XG4gICAgICAgICAgICAgIHJldHVybiBnbHlwaDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAoX3RoaXMkZ2x5cGhzID0gdGhpcy5nbHlwaHMpLnNwbGljZS5hcHBseShfdGhpcyRnbHlwaHMsIFt0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXggKyAxLCAwXS5jb25jYXQocmVwbGFjZW1lbnQpKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgMzpcbiAgICAgICAge1xuICAgICAgICAgIC8vIEFsdGVybmF0ZSBTdWJzdGl0dXRpb25cbiAgICAgICAgICB2YXIgX2luZGV4MiA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSk7XG5cbiAgICAgICAgICBpZiAoX2luZGV4MiAhPT0gLTEpIHtcbiAgICAgICAgICAgIHZhciBVU0VSX0lOREVYID0gMDsgLy8gVE9ET1xuXG4gICAgICAgICAgICB0aGlzLmdseXBoSXRlcmF0b3IuY3VyLmlkID0gdGFibGUuYWx0ZXJuYXRlU2V0LmdldChfaW5kZXgyKVtVU0VSX0lOREVYXTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBMaWdhdHVyZSBTdWJzdGl0dXRpb25cbiAgICAgICAgICB2YXIgX2luZGV4MyA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSk7XG5cbiAgICAgICAgICBpZiAoX2luZGV4MyA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGkodGFibGUubGlnYXR1cmVTZXRzLmdldChfaW5kZXgzKSksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgbGlnYXR1cmUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICAgIHZhciBtYXRjaGVkID0gdGhpcy5zZXF1ZW5jZU1hdGNoSW5kaWNlcygxLCBsaWdhdHVyZS5jb21wb25lbnRzKTtcblxuICAgICAgICAgICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgX2N1ckdseXBoID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmN1cjsgLy8gQ29uY2F0ZW5hdGUgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIHRoZSBuZXcgbGlnYXR1cmUgd2lsbCByZXByZXNlbnRcblxuICAgICAgICAgICAgdmFyIGNoYXJhY3RlcnMgPSBfY3VyR2x5cGguY29kZVBvaW50cy5zbGljZSgpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRpKG1hdGNoZWQpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgICAgICAgICB2YXIgX2luZGV4NCA9IF9zdGVwMi52YWx1ZTtcbiAgICAgICAgICAgICAgY2hhcmFjdGVycy5wdXNoLmFwcGx5KGNoYXJhY3RlcnMsIHRoaXMuZ2x5cGhzW19pbmRleDRdLmNvZGVQb2ludHMpO1xuICAgICAgICAgICAgfSAvLyBDcmVhdGUgdGhlIHJlcGxhY2VtZW50IGxpZ2F0dXJlIGdseXBoXG5cblxuICAgICAgICAgICAgdmFyIGxpZ2F0dXJlR2x5cGggPSBuZXcgR2x5cGhJbmZvKHRoaXMuZm9udCwgbGlnYXR1cmUuZ2x5cGgsIGNoYXJhY3RlcnMsIF9jdXJHbHlwaC5mZWF0dXJlcyk7XG4gICAgICAgICAgICBsaWdhdHVyZUdseXBoLnNoYXBlckluZm8gPSBfY3VyR2x5cGguc2hhcGVySW5mbztcbiAgICAgICAgICAgIGxpZ2F0dXJlR2x5cGguaXNMaWdhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxpZ2F0dXJlR2x5cGguc3Vic3RpdHV0ZWQgPSB0cnVlOyAvLyBGcm9tIEhhcmZidXp6OlxuICAgICAgICAgICAgLy8gLSBJZiBpdCAqaXMqIGEgbWFyayBsaWdhdHVyZSwgd2UgZG9uJ3QgYWxsb2NhdGUgYSBuZXcgbGlnYXR1cmUgaWQsIGFuZCBsZWF2ZVxuICAgICAgICAgICAgLy8gICB0aGUgbGlnYXR1cmUgdG8ga2VlcCBpdHMgb2xkIGxpZ2F0dXJlIGlkLiAgVGhpcyB3aWxsIGFsbG93IGl0IHRvIGF0dGFjaCB0b1xuICAgICAgICAgICAgLy8gICBhIGJhc2UgbGlnYXR1cmUgaW4gR1BPUy4gIEVnLiBpZiB0aGUgc2VxdWVuY2UgaXM6IExBTSxMQU0sU0hBRERBLEZBVEhBLEhFSCxcbiAgICAgICAgICAgIC8vICAgYW5kIExBTSxMQU0sSEVIIGZvciBhIGxpZ2F0dXJlLCB0aGV5IHdpbGwgbGVhdmUgU0hBRERBIGFuZCBGQVRIQSB3aXRoIGFcbiAgICAgICAgICAgIC8vICAgbGlnYXR1cmUgaWQgYW5kIGNvbXBvbmVudCB2YWx1ZSBvZiAyLiAgVGhlbiBpZiBTSEFEREEsRkFUSEEgZm9ybSBhIGxpZ2F0dXJlXG4gICAgICAgICAgICAvLyAgIGxhdGVyLCB3ZSBkb24ndCB3YW50IHRoZW0gdG8gbG9zZSB0aGVpciBsaWdhdHVyZSBpZC9jb21wb25lbnQsIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gICBHUE9TIHdpbGwgZmFpbCB0byBjb3JyZWN0bHkgcG9zaXRpb24gdGhlIG1hcmsgbGlnYXR1cmUgb24gdG9wIG9mIHRoZVxuICAgICAgICAgICAgLy8gICBMQU0sTEFNLEhFSCBsaWdhdHVyZS4gU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD02NzYzNDNcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAtIElmIGEgbGlnYXR1cmUgaXMgZm9ybWVkIG9mIGNvbXBvbmVudHMgdGhhdCBzb21lIG9mIHdoaWNoIGFyZSBhbHNvIGxpZ2F0dXJlc1xuICAgICAgICAgICAgLy8gICB0aGVtc2VsdmVzLCBhbmQgdGhvc2UgbGlnYXR1cmUgY29tcG9uZW50cyBoYWQgbWFya3MgYXR0YWNoZWQgdG8gKnRoZWlyKlxuICAgICAgICAgICAgLy8gICBjb21wb25lbnRzLCB3ZSBoYXZlIHRvIGF0dGFjaCB0aGUgbWFya3MgdG8gdGhlIG5ldyBsaWdhdHVyZSBjb21wb25lbnRcbiAgICAgICAgICAgIC8vICAgcG9zaXRpb25zISAgTm93ICp0aGF0KidzIHRyaWNreSEgIEFuZCB0aGVzZSBtYXJrcyBtYXkgYmUgZm9sbG93aW5nIHRoZVxuICAgICAgICAgICAgLy8gICBsYXN0IGNvbXBvbmVudCBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIHNvIHdlIHNob3VsZCBsb29wIGZvcndhcmQgbG9va2luZ1xuICAgICAgICAgICAgLy8gICBmb3IgdGhlbSBhbmQgdXBkYXRlIHRoZW0uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gICBFZy4gdGhlIHNlcXVlbmNlIGlzIExBTSxMQU0sU0hBRERBLEZBVEhBLEhFSCwgYW5kIHRoZSBmb250IGZpcnN0IGZvcm1zIGFcbiAgICAgICAgICAgIC8vICAgJ2NhbHQnIGxpZ2F0dXJlIG9mIExBTSxIRUgsIGxlYXZpbmcgdGhlIFNIQUREQSBhbmQgRkFUSEEgd2l0aCBhIGxpZ2F0dXJlXG4gICAgICAgICAgICAvLyAgIGlkIGFuZCBjb21wb25lbnQgPT0gMS4gIE5vdywgZHVyaW5nICdsaWdhJywgdGhlIExBTSBhbmQgdGhlIExBTS1IRUggbGlnYXR1cmVcbiAgICAgICAgICAgIC8vICAgZm9ybSBhIExBTS1MQU0tSEVIIGxpZ2F0dXJlLiAgV2UgbmVlZCB0byByZWFzc2lnbiB0aGUgU0hBRERBIGFuZCBGQVRIQSB0b1xuICAgICAgICAgICAgLy8gICB0aGUgbmV3IGxpZ2F0dXJlIHdpdGggYSBjb21wb25lbnQgdmFsdWUgb2YgMi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgIFRoaXMgaW4gZmFjdCBoYXBwZW5lZCB0byBhIGZvbnQuLi4gIFNlZSBodHRwczovL2J1Z3ppbGxhLmdub21lLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDM3NjMzXG5cbiAgICAgICAgICAgIHZhciBpc01hcmtMaWdhdHVyZSA9IF9jdXJHbHlwaC5pc01hcms7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF0Y2hlZC5sZW5ndGggJiYgaXNNYXJrTGlnYXR1cmU7IGkrKykge1xuICAgICAgICAgICAgICBpc01hcmtMaWdhdHVyZSA9IHRoaXMuZ2x5cGhzW21hdGNoZWRbaV1dLmlzTWFyaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGlnYXR1cmVHbHlwaC5saWdhdHVyZUlEID0gaXNNYXJrTGlnYXR1cmUgPyBudWxsIDogdGhpcy5saWdhdHVyZUlEKys7XG4gICAgICAgICAgICB2YXIgbGFzdExpZ0lEID0gX2N1ckdseXBoLmxpZ2F0dXJlSUQ7XG4gICAgICAgICAgICB2YXIgbGFzdE51bUNvbXBzID0gX2N1ckdseXBoLmNvZGVQb2ludHMubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGN1ckNvbXBzID0gbGFzdE51bUNvbXBzO1xuICAgICAgICAgICAgdmFyIGlkeCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5pbmRleCArIDE7IC8vIFNldCBsaWdhdHVyZUlEIGFuZCBsaWdhdHVyZUNvbXBvbmVudCBvbiBnbHlwaHMgdGhhdCB3ZXJlIHNraXBwZWQgaW4gdGhlIG1hdGNoZWQgc2VxdWVuY2UuXG4gICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBHUE9TIHRvIGF0dGFjaCBtYXJrcyB0byB0aGUgY29ycmVjdCBsaWdhdHVyZSBjb21wb25lbnRzLlxuXG4gICAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRpKG1hdGNoZWQpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgICAgICAgICB2YXIgbWF0Y2hJbmRleCA9IF9zdGVwMy52YWx1ZTtcblxuICAgICAgICAgICAgICAvLyBEb24ndCBhc3NpZ24gbmV3IGxpZ2F0dXJlIGNvbXBvbmVudHMgZm9yIG1hcmsgbGlnYXR1cmVzIChzZWUgYWJvdmUpXG4gICAgICAgICAgICAgIGlmIChpc01hcmtMaWdhdHVyZSkge1xuICAgICAgICAgICAgICAgIGlkeCA9IG1hdGNoSW5kZXg7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGlkeCA8IG1hdGNoSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBsaWdhdHVyZUNvbXBvbmVudCA9IGN1ckNvbXBzIC0gbGFzdE51bUNvbXBzICsgTWF0aC5taW4odGhpcy5nbHlwaHNbaWR4XS5saWdhdHVyZUNvbXBvbmVudCB8fCAxLCBsYXN0TnVtQ29tcHMpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5nbHlwaHNbaWR4XS5saWdhdHVyZUlEID0gbGlnYXR1cmVHbHlwaC5saWdhdHVyZUlEO1xuICAgICAgICAgICAgICAgICAgdGhpcy5nbHlwaHNbaWR4XS5saWdhdHVyZUNvbXBvbmVudCA9IGxpZ2F0dXJlQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbGFzdExpZ0lEID0gdGhpcy5nbHlwaHNbaWR4XS5saWdhdHVyZUlEO1xuICAgICAgICAgICAgICBsYXN0TnVtQ29tcHMgPSB0aGlzLmdseXBoc1tpZHhdLmNvZGVQb2ludHMubGVuZ3RoO1xuICAgICAgICAgICAgICBjdXJDb21wcyArPSBsYXN0TnVtQ29tcHM7XG4gICAgICAgICAgICAgIGlkeCsrOyAvLyBza2lwIGJhc2UgZ2x5cGhcbiAgICAgICAgICAgIH0gLy8gQWRqdXN0IGxpZ2F0dXJlIGNvbXBvbmVudHMgZm9yIGFueSBtYXJrcyBmb2xsb3dpbmdcblxuXG4gICAgICAgICAgICBpZiAobGFzdExpZ0lEICYmICFpc01hcmtMaWdhdHVyZSkge1xuICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IGlkeDsgX2kgPCB0aGlzLmdseXBocy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nbHlwaHNbX2ldLmxpZ2F0dXJlSUQgPT09IGxhc3RMaWdJRCkge1xuICAgICAgICAgICAgICAgICAgdmFyIGxpZ2F0dXJlQ29tcG9uZW50ID0gY3VyQ29tcHMgLSBsYXN0TnVtQ29tcHMgKyBNYXRoLm1pbih0aGlzLmdseXBoc1tfaV0ubGlnYXR1cmVDb21wb25lbnQgfHwgMSwgbGFzdE51bUNvbXBzKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2x5cGhzW19pXS5saWdhdHVyZUNvbXBvbmVudCA9IGxpZ2F0dXJlQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gRGVsZXRlIHRoZSBtYXRjaGVkIGdseXBocywgYW5kIHJlcGxhY2UgdGhlIGN1cnJlbnQgZ2x5cGggd2l0aCB0aGUgbGlnYXR1cmUgZ2x5cGhcblxuXG4gICAgICAgICAgICBmb3IgKHZhciBfaTIgPSBtYXRjaGVkLmxlbmd0aCAtIDE7IF9pMiA+PSAwOyBfaTItLSkge1xuICAgICAgICAgICAgICB0aGlzLmdseXBocy5zcGxpY2UobWF0Y2hlZFtfaTJdLCAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5nbHlwaHNbdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4XSA9IGxpZ2F0dXJlR2x5cGg7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA1OlxuICAgICAgICAvLyBDb250ZXh0dWFsIFN1YnN0aXR1dGlvblxuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUNvbnRleHQodGFibGUpO1xuXG4gICAgICBjYXNlIDY6XG4gICAgICAgIC8vIENoYWluaW5nIENvbnRleHR1YWwgU3Vic3RpdHV0aW9uXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5Q2hhaW5pbmdDb250ZXh0KHRhYmxlKTtcblxuICAgICAgY2FzZSA3OlxuICAgICAgICAvLyBFeHRlbnNpb24gU3Vic3RpdHV0aW9uXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5TG9va3VwKHRhYmxlLmxvb2t1cFR5cGUsIHRhYmxlLmV4dGVuc2lvbik7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdTVUIgbG9va3VwVHlwZSBcIiArIGxvb2t1cFR5cGUgKyBcIiBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gR1NVQlByb2Nlc3Nvcjtcbn0oT1RQcm9jZXNzb3IpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGoobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGoobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGoobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRqKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkaihvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGooYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJDgoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBHUE9TUHJvY2Vzc29yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfT1RQcm9jZXNzb3IpIHtcbiAgX2luaGVyaXRzTG9vc2UkOChHUE9TUHJvY2Vzc29yLCBfT1RQcm9jZXNzb3IpO1xuXG4gIGZ1bmN0aW9uIEdQT1NQcm9jZXNzb3IoKSB7XG4gICAgcmV0dXJuIF9PVFByb2Nlc3Nvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gR1BPU1Byb2Nlc3Nvci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmFwcGx5UG9zaXRpb25WYWx1ZSA9IGZ1bmN0aW9uIGFwcGx5UG9zaXRpb25WYWx1ZShzZXF1ZW5jZUluZGV4LCB2YWx1ZSkge1xuICAgIHZhciBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb25zW3RoaXMuZ2x5cGhJdGVyYXRvci5wZWVrSW5kZXgoc2VxdWVuY2VJbmRleCldO1xuXG4gICAgaWYgKHZhbHVlLnhBZHZhbmNlICE9IG51bGwpIHtcbiAgICAgIHBvc2l0aW9uLnhBZHZhbmNlICs9IHZhbHVlLnhBZHZhbmNlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS55QWR2YW5jZSAhPSBudWxsKSB7XG4gICAgICBwb3NpdGlvbi55QWR2YW5jZSArPSB2YWx1ZS55QWR2YW5jZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUueFBsYWNlbWVudCAhPSBudWxsKSB7XG4gICAgICBwb3NpdGlvbi54T2Zmc2V0ICs9IHZhbHVlLnhQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnlQbGFjZW1lbnQgIT0gbnVsbCkge1xuICAgICAgcG9zaXRpb24ueU9mZnNldCArPSB2YWx1ZS55UGxhY2VtZW50O1xuICAgIH0gLy8gQWRqdXN0bWVudHMgZm9yIGZvbnQgdmFyaWF0aW9uc1xuXG5cbiAgICB2YXIgdmFyaWF0aW9uUHJvY2Vzc29yID0gdGhpcy5mb250Ll92YXJpYXRpb25Qcm9jZXNzb3I7XG4gICAgdmFyIHZhcmlhdGlvblN0b3JlID0gdGhpcy5mb250LkdERUYgJiYgdGhpcy5mb250LkdERUYuaXRlbVZhcmlhdGlvblN0b3JlO1xuXG4gICAgaWYgKHZhcmlhdGlvblByb2Nlc3NvciAmJiB2YXJpYXRpb25TdG9yZSkge1xuICAgICAgaWYgKHZhbHVlLnhQbGFEZXZpY2UpIHtcbiAgICAgICAgcG9zaXRpb24ueE9mZnNldCArPSB2YXJpYXRpb25Qcm9jZXNzb3IuZ2V0RGVsdGEodmFyaWF0aW9uU3RvcmUsIHZhbHVlLnhQbGFEZXZpY2UuYSwgdmFsdWUueFBsYURldmljZS5iKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlLnlQbGFEZXZpY2UpIHtcbiAgICAgICAgcG9zaXRpb24ueU9mZnNldCArPSB2YXJpYXRpb25Qcm9jZXNzb3IuZ2V0RGVsdGEodmFyaWF0aW9uU3RvcmUsIHZhbHVlLnlQbGFEZXZpY2UuYSwgdmFsdWUueVBsYURldmljZS5iKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlLnhBZHZEZXZpY2UpIHtcbiAgICAgICAgcG9zaXRpb24ueEFkdmFuY2UgKz0gdmFyaWF0aW9uUHJvY2Vzc29yLmdldERlbHRhKHZhcmlhdGlvblN0b3JlLCB2YWx1ZS54QWR2RGV2aWNlLmEsIHZhbHVlLnhBZHZEZXZpY2UuYik7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZS55QWR2RGV2aWNlKSB7XG4gICAgICAgIHBvc2l0aW9uLnlBZHZhbmNlICs9IHZhcmlhdGlvblByb2Nlc3Nvci5nZXREZWx0YSh2YXJpYXRpb25TdG9yZSwgdmFsdWUueUFkdkRldmljZS5hLCB2YWx1ZS55QWR2RGV2aWNlLmIpO1xuICAgICAgfVxuICAgIH0gLy8gVE9ETzogZGV2aWNlIHRhYmxlc1xuXG4gIH07XG5cbiAgX3Byb3RvLmFwcGx5TG9va3VwID0gZnVuY3Rpb24gYXBwbHlMb29rdXAobG9va3VwVHlwZSwgdGFibGUpIHtcbiAgICBzd2l0Y2ggKGxvb2t1cFR5cGUpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFNpbmdsZSBwb3NpdGlvbmluZyB2YWx1ZVxuICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSk7XG5cbiAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dpdGNoICh0YWJsZS52ZXJzaW9uKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIHRoaXMuYXBwbHlQb3NpdGlvblZhbHVlKDAsIHRhYmxlLnZhbHVlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgdGhpcy5hcHBseVBvc2l0aW9uVmFsdWUoMCwgdGFibGUudmFsdWVzLmdldChpbmRleCkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBQYWlyIEFkanVzdG1lbnQgUG9zaXRpb25pbmdcbiAgICAgICAgICB2YXIgbmV4dEdseXBoID0gdGhpcy5nbHlwaEl0ZXJhdG9yLnBlZWsoKTtcblxuICAgICAgICAgIGlmICghbmV4dEdseXBoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9pbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSk7XG5cbiAgICAgICAgICBpZiAoX2luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3aXRjaCAodGFibGUudmVyc2lvbikge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAvLyBBZGp1c3RtZW50cyBmb3IgZ2x5cGggcGFpcnNcbiAgICAgICAgICAgICAgdmFyIHNldCA9IHRhYmxlLnBhaXJTZXRzLmdldChfaW5kZXgpO1xuXG4gICAgICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkaihzZXQpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgIHZhciBfcGFpciA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKF9wYWlyLnNlY29uZEdseXBoID09PSBuZXh0R2x5cGguaWQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlQb3NpdGlvblZhbHVlKDAsIF9wYWlyLnZhbHVlMSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5UG9zaXRpb25WYWx1ZSgxLCBfcGFpci52YWx1ZTIpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgIC8vIENsYXNzIHBhaXIgYWRqdXN0bWVudFxuICAgICAgICAgICAgICB2YXIgY2xhc3MxID0gdGhpcy5nZXRDbGFzc0lEKHRoaXMuZ2x5cGhJdGVyYXRvci5jdXIuaWQsIHRhYmxlLmNsYXNzRGVmMSk7XG4gICAgICAgICAgICAgIHZhciBjbGFzczIgPSB0aGlzLmdldENsYXNzSUQobmV4dEdseXBoLmlkLCB0YWJsZS5jbGFzc0RlZjIpO1xuXG4gICAgICAgICAgICAgIGlmIChjbGFzczEgPT09IC0xIHx8IGNsYXNzMiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgcGFpciA9IHRhYmxlLmNsYXNzUmVjb3Jkcy5nZXQoY2xhc3MxKS5nZXQoY2xhc3MyKTtcbiAgICAgICAgICAgICAgdGhpcy5hcHBseVBvc2l0aW9uVmFsdWUoMCwgcGFpci52YWx1ZTEpO1xuICAgICAgICAgICAgICB0aGlzLmFwcGx5UG9zaXRpb25WYWx1ZSgxLCBwYWlyLnZhbHVlMik7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDM6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBDdXJzaXZlIEF0dGFjaG1lbnQgUG9zaXRpb25pbmdcbiAgICAgICAgICB2YXIgbmV4dEluZGV4ID0gdGhpcy5nbHlwaEl0ZXJhdG9yLnBlZWtJbmRleCgpO1xuICAgICAgICAgIHZhciBfbmV4dEdseXBoID0gdGhpcy5nbHlwaHNbbmV4dEluZGV4XTtcblxuICAgICAgICAgIGlmICghX25leHRHbHlwaCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjdXJSZWNvcmQgPSB0YWJsZS5lbnRyeUV4aXRSZWNvcmRzW3RoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSldO1xuXG4gICAgICAgICAgaWYgKCFjdXJSZWNvcmQgfHwgIWN1clJlY29yZC5leGl0QW5jaG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG5leHRSZWNvcmQgPSB0YWJsZS5lbnRyeUV4aXRSZWNvcmRzW3RoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSwgX25leHRHbHlwaC5pZCldO1xuXG4gICAgICAgICAgaWYgKCFuZXh0UmVjb3JkIHx8ICFuZXh0UmVjb3JkLmVudHJ5QW5jaG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5nZXRBbmNob3IobmV4dFJlY29yZC5lbnRyeUFuY2hvcik7XG4gICAgICAgICAgdmFyIGV4aXQgPSB0aGlzLmdldEFuY2hvcihjdXJSZWNvcmQuZXhpdEFuY2hvcik7XG4gICAgICAgICAgdmFyIGN1ciA9IHRoaXMucG9zaXRpb25zW3RoaXMuZ2x5cGhJdGVyYXRvci5pbmRleF07XG4gICAgICAgICAgdmFyIG5leHQgPSB0aGlzLnBvc2l0aW9uc1tuZXh0SW5kZXhdO1xuXG4gICAgICAgICAgc3dpdGNoICh0aGlzLmRpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSAnbHRyJzpcbiAgICAgICAgICAgICAgY3VyLnhBZHZhbmNlID0gZXhpdC54ICsgY3VyLnhPZmZzZXQ7XG4gICAgICAgICAgICAgIHZhciBkID0gZW50cnkueCArIG5leHQueE9mZnNldDtcbiAgICAgICAgICAgICAgbmV4dC54QWR2YW5jZSAtPSBkO1xuICAgICAgICAgICAgICBuZXh0LnhPZmZzZXQgLT0gZDtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ3J0bCc6XG4gICAgICAgICAgICAgIGQgPSBleGl0LnggKyBjdXIueE9mZnNldDtcbiAgICAgICAgICAgICAgY3VyLnhBZHZhbmNlIC09IGQ7XG4gICAgICAgICAgICAgIGN1ci54T2Zmc2V0IC09IGQ7XG4gICAgICAgICAgICAgIG5leHQueEFkdmFuY2UgPSBlbnRyeS54ICsgbmV4dC54T2Zmc2V0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5nbHlwaEl0ZXJhdG9yLmZsYWdzLnJpZ2h0VG9MZWZ0KSB7XG4gICAgICAgICAgICB0aGlzLmdseXBoSXRlcmF0b3IuY3VyLmN1cnNpdmVBdHRhY2htZW50ID0gbmV4dEluZGV4O1xuICAgICAgICAgICAgY3VyLnlPZmZzZXQgPSBlbnRyeS55IC0gZXhpdC55O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfbmV4dEdseXBoLmN1cnNpdmVBdHRhY2htZW50ID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4O1xuICAgICAgICAgICAgY3VyLnlPZmZzZXQgPSBleGl0LnkgLSBlbnRyeS55O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIE1hcmsgdG8gYmFzZSBwb3NpdGlvbmluZ1xuICAgICAgICAgIHZhciBtYXJrSW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUubWFya0NvdmVyYWdlKTtcblxuICAgICAgICAgIGlmIChtYXJrSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSAvLyBzZWFyY2ggYmFja3dhcmQgZm9yIGEgYmFzZSBnbHlwaFxuXG5cbiAgICAgICAgICB2YXIgYmFzZUdseXBoSW5kZXggPSB0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXg7XG5cbiAgICAgICAgICB3aGlsZSAoLS1iYXNlR2x5cGhJbmRleCA+PSAwICYmICh0aGlzLmdseXBoc1tiYXNlR2x5cGhJbmRleF0uaXNNYXJrIHx8IHRoaXMuZ2x5cGhzW2Jhc2VHbHlwaEluZGV4XS5saWdhdHVyZUNvbXBvbmVudCA+IDApKSB7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGJhc2VHbHlwaEluZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBiYXNlSW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuYmFzZUNvdmVyYWdlLCB0aGlzLmdseXBoc1tiYXNlR2x5cGhJbmRleF0uaWQpO1xuXG4gICAgICAgICAgaWYgKGJhc2VJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbWFya1JlY29yZCA9IHRhYmxlLm1hcmtBcnJheVttYXJrSW5kZXhdO1xuICAgICAgICAgIHZhciBiYXNlQW5jaG9yID0gdGFibGUuYmFzZUFycmF5W2Jhc2VJbmRleF1bbWFya1JlY29yZFtcImNsYXNzXCJdXTtcbiAgICAgICAgICB0aGlzLmFwcGx5QW5jaG9yKG1hcmtSZWNvcmQsIGJhc2VBbmNob3IsIGJhc2VHbHlwaEluZGV4KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDU6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBNYXJrIHRvIGxpZ2F0dXJlIHBvc2l0aW9uaW5nXG4gICAgICAgICAgdmFyIF9tYXJrSW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUubWFya0NvdmVyYWdlKTtcblxuICAgICAgICAgIGlmIChfbWFya0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gLy8gc2VhcmNoIGJhY2t3YXJkIGZvciBhIGJhc2UgZ2x5cGhcblxuXG4gICAgICAgICAgdmFyIF9iYXNlR2x5cGhJbmRleCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5pbmRleDtcblxuICAgICAgICAgIHdoaWxlICgtLV9iYXNlR2x5cGhJbmRleCA+PSAwICYmIHRoaXMuZ2x5cGhzW19iYXNlR2x5cGhJbmRleF0uaXNNYXJrKSB7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF9iYXNlR2x5cGhJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbGlnSW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUubGlnYXR1cmVDb3ZlcmFnZSwgdGhpcy5nbHlwaHNbX2Jhc2VHbHlwaEluZGV4XS5pZCk7XG5cbiAgICAgICAgICBpZiAobGlnSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGxpZ0F0dGFjaCA9IHRhYmxlLmxpZ2F0dXJlQXJyYXlbbGlnSW5kZXhdO1xuICAgICAgICAgIHZhciBtYXJrR2x5cGggPSB0aGlzLmdseXBoSXRlcmF0b3IuY3VyO1xuICAgICAgICAgIHZhciBsaWdHbHlwaCA9IHRoaXMuZ2x5cGhzW19iYXNlR2x5cGhJbmRleF07XG4gICAgICAgICAgdmFyIGNvbXBJbmRleCA9IGxpZ0dseXBoLmxpZ2F0dXJlSUQgJiYgbGlnR2x5cGgubGlnYXR1cmVJRCA9PT0gbWFya0dseXBoLmxpZ2F0dXJlSUQgJiYgbWFya0dseXBoLmxpZ2F0dXJlQ29tcG9uZW50ID4gMCA/IE1hdGgubWluKG1hcmtHbHlwaC5saWdhdHVyZUNvbXBvbmVudCwgbGlnR2x5cGguY29kZVBvaW50cy5sZW5ndGgpIC0gMSA6IGxpZ0dseXBoLmNvZGVQb2ludHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICB2YXIgX21hcmtSZWNvcmQgPSB0YWJsZS5tYXJrQXJyYXlbX21hcmtJbmRleF07XG4gICAgICAgICAgdmFyIF9iYXNlQW5jaG9yID0gbGlnQXR0YWNoW2NvbXBJbmRleF1bX21hcmtSZWNvcmRbXCJjbGFzc1wiXV07XG4gICAgICAgICAgdGhpcy5hcHBseUFuY2hvcihfbWFya1JlY29yZCwgX2Jhc2VBbmNob3IsIF9iYXNlR2x5cGhJbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA2OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gTWFyayB0byBtYXJrIHBvc2l0aW9uaW5nXG4gICAgICAgICAgdmFyIG1hcmsxSW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUubWFyazFDb3ZlcmFnZSk7XG5cbiAgICAgICAgICBpZiAobWFyazFJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IC8vIGdldCB0aGUgcHJldmlvdXMgbWFyayB0byBhdHRhY2ggdG9cblxuXG4gICAgICAgICAgdmFyIHByZXZJbmRleCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5wZWVrSW5kZXgoLTEpO1xuICAgICAgICAgIHZhciBwcmV2ID0gdGhpcy5nbHlwaHNbcHJldkluZGV4XTtcblxuICAgICAgICAgIGlmICghcHJldiB8fCAhcHJldi5pc01hcmspIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX2N1ciA9IHRoaXMuZ2x5cGhJdGVyYXRvci5jdXI7IC8vIFRoZSBmb2xsb3dpbmcgbG9naWMgd2FzIGJvcnJvd2VkIGZyb20gSGFyZmJ1enpcblxuICAgICAgICAgIHZhciBnb29kID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAoX2N1ci5saWdhdHVyZUlEID09PSBwcmV2LmxpZ2F0dXJlSUQpIHtcbiAgICAgICAgICAgIGlmICghX2N1ci5saWdhdHVyZUlEKSB7XG4gICAgICAgICAgICAgIC8vIE1hcmtzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBiYXNlXG4gICAgICAgICAgICAgIGdvb2QgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChfY3VyLmxpZ2F0dXJlQ29tcG9uZW50ID09PSBwcmV2LmxpZ2F0dXJlQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIC8vIE1hcmtzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBsaWdhdHVyZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgZ29vZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIGxpZ2F0dXJlIGlkcyBkb24ndCBtYXRjaCwgaXQgbWF5IGJlIHRoZSBjYXNlIHRoYXQgb25lIG9mIHRoZSBtYXJrc1xuICAgICAgICAgICAgLy8gaXRzZWxmIGlzIGEgbGlnYXR1cmUsIGluIHdoaWNoIGNhc2UgbWF0Y2guXG4gICAgICAgICAgICBpZiAoX2N1ci5saWdhdHVyZUlEICYmICFfY3VyLmxpZ2F0dXJlQ29tcG9uZW50IHx8IHByZXYubGlnYXR1cmVJRCAmJiAhcHJldi5saWdhdHVyZUNvbXBvbmVudCkge1xuICAgICAgICAgICAgICBnb29kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWdvb2QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbWFyazJJbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5tYXJrMkNvdmVyYWdlLCBwcmV2LmlkKTtcblxuICAgICAgICAgIGlmIChtYXJrMkluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfbWFya1JlY29yZDIgPSB0YWJsZS5tYXJrMUFycmF5W21hcmsxSW5kZXhdO1xuICAgICAgICAgIHZhciBfYmFzZUFuY2hvcjIgPSB0YWJsZS5tYXJrMkFycmF5W21hcmsySW5kZXhdW19tYXJrUmVjb3JkMltcImNsYXNzXCJdXTtcbiAgICAgICAgICB0aGlzLmFwcGx5QW5jaG9yKF9tYXJrUmVjb3JkMiwgX2Jhc2VBbmNob3IyLCBwcmV2SW5kZXgpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgNzpcbiAgICAgICAgLy8gQ29udGV4dHVhbCBwb3NpdGlvbmluZ1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUNvbnRleHQodGFibGUpO1xuXG4gICAgICBjYXNlIDg6XG4gICAgICAgIC8vIENoYWluaW5nIGNvbnRleHR1YWwgcG9zaXRpb25pbmdcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlDaGFpbmluZ0NvbnRleHQodGFibGUpO1xuXG4gICAgICBjYXNlIDk6XG4gICAgICAgIC8vIEV4dGVuc2lvbiBwb3NpdGlvbmluZ1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxvb2t1cCh0YWJsZS5sb29rdXBUeXBlLCB0YWJsZS5leHRlbnNpb24pO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBHUE9TIHRhYmxlOiBcIiArIGxvb2t1cFR5cGUpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uYXBwbHlBbmNob3IgPSBmdW5jdGlvbiBhcHBseUFuY2hvcihtYXJrUmVjb3JkLCBiYXNlQW5jaG9yLCBiYXNlR2x5cGhJbmRleCkge1xuICAgIHZhciBiYXNlQ29vcmRzID0gdGhpcy5nZXRBbmNob3IoYmFzZUFuY2hvcik7XG4gICAgdmFyIG1hcmtDb29yZHMgPSB0aGlzLmdldEFuY2hvcihtYXJrUmVjb3JkLm1hcmtBbmNob3IpO1xuICAgIHZhciBiYXNlUG9zID0gdGhpcy5wb3NpdGlvbnNbYmFzZUdseXBoSW5kZXhdO1xuICAgIHZhciBtYXJrUG9zID0gdGhpcy5wb3NpdGlvbnNbdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4XTtcbiAgICBtYXJrUG9zLnhPZmZzZXQgPSBiYXNlQ29vcmRzLnggLSBtYXJrQ29vcmRzLng7XG4gICAgbWFya1Bvcy55T2Zmc2V0ID0gYmFzZUNvb3Jkcy55IC0gbWFya0Nvb3Jkcy55O1xuICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5jdXIubWFya0F0dGFjaG1lbnQgPSBiYXNlR2x5cGhJbmRleDtcbiAgfTtcblxuICBfcHJvdG8uZ2V0QW5jaG9yID0gZnVuY3Rpb24gZ2V0QW5jaG9yKGFuY2hvcikge1xuICAgIC8vIFRPRE86IGNvbnRvdXIgcG9pbnQsIGRldmljZSB0YWJsZXNcbiAgICB2YXIgeCA9IGFuY2hvci54Q29vcmRpbmF0ZTtcbiAgICB2YXIgeSA9IGFuY2hvci55Q29vcmRpbmF0ZTsgLy8gQWRqdXN0bWVudHMgZm9yIGZvbnQgdmFyaWF0aW9uc1xuXG4gICAgdmFyIHZhcmlhdGlvblByb2Nlc3NvciA9IHRoaXMuZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yO1xuICAgIHZhciB2YXJpYXRpb25TdG9yZSA9IHRoaXMuZm9udC5HREVGICYmIHRoaXMuZm9udC5HREVGLml0ZW1WYXJpYXRpb25TdG9yZTtcblxuICAgIGlmICh2YXJpYXRpb25Qcm9jZXNzb3IgJiYgdmFyaWF0aW9uU3RvcmUpIHtcbiAgICAgIGlmIChhbmNob3IueERldmljZVRhYmxlKSB7XG4gICAgICAgIHggKz0gdmFyaWF0aW9uUHJvY2Vzc29yLmdldERlbHRhKHZhcmlhdGlvblN0b3JlLCBhbmNob3IueERldmljZVRhYmxlLmEsIGFuY2hvci54RGV2aWNlVGFibGUuYik7XG4gICAgICB9XG5cbiAgICAgIGlmIChhbmNob3IueURldmljZVRhYmxlKSB7XG4gICAgICAgIHkgKz0gdmFyaWF0aW9uUHJvY2Vzc29yLmdldERlbHRhKHZhcmlhdGlvblN0b3JlLCBhbmNob3IueURldmljZVRhYmxlLmEsIGFuY2hvci55RGV2aWNlVGFibGUuYik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfTtcbiAgfTtcblxuICBfcHJvdG8uYXBwbHlGZWF0dXJlcyA9IGZ1bmN0aW9uIGFwcGx5RmVhdHVyZXModXNlckZlYXR1cmVzLCBnbHlwaHMsIGFkdmFuY2VzKSB7XG4gICAgX09UUHJvY2Vzc29yLnByb3RvdHlwZS5hcHBseUZlYXR1cmVzLmNhbGwodGhpcywgdXNlckZlYXR1cmVzLCBnbHlwaHMsIGFkdmFuY2VzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZml4Q3Vyc2l2ZUF0dGFjaG1lbnQoaSk7XG4gICAgfVxuXG4gICAgdGhpcy5maXhNYXJrQXR0YWNobWVudCgpO1xuICB9O1xuXG4gIF9wcm90by5maXhDdXJzaXZlQXR0YWNobWVudCA9IGZ1bmN0aW9uIGZpeEN1cnNpdmVBdHRhY2htZW50KGkpIHtcbiAgICB2YXIgZ2x5cGggPSB0aGlzLmdseXBoc1tpXTtcblxuICAgIGlmIChnbHlwaC5jdXJzaXZlQXR0YWNobWVudCAhPSBudWxsKSB7XG4gICAgICB2YXIgaiA9IGdseXBoLmN1cnNpdmVBdHRhY2htZW50O1xuICAgICAgZ2x5cGguY3Vyc2l2ZUF0dGFjaG1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5maXhDdXJzaXZlQXR0YWNobWVudChqKTtcbiAgICAgIHRoaXMucG9zaXRpb25zW2ldLnlPZmZzZXQgKz0gdGhpcy5wb3NpdGlvbnNbal0ueU9mZnNldDtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmZpeE1hcmtBdHRhY2htZW50ID0gZnVuY3Rpb24gZml4TWFya0F0dGFjaG1lbnQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdseXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGdseXBoID0gdGhpcy5nbHlwaHNbaV07XG5cbiAgICAgIGlmIChnbHlwaC5tYXJrQXR0YWNobWVudCAhPSBudWxsKSB7XG4gICAgICAgIHZhciBqID0gZ2x5cGgubWFya0F0dGFjaG1lbnQ7XG4gICAgICAgIHRoaXMucG9zaXRpb25zW2ldLnhPZmZzZXQgKz0gdGhpcy5wb3NpdGlvbnNbal0ueE9mZnNldDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNbaV0ueU9mZnNldCArPSB0aGlzLnBvc2l0aW9uc1tqXS55T2Zmc2V0O1xuXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ2x0cicpIHtcbiAgICAgICAgICBmb3IgKHZhciBrID0gajsgayA8IGk7IGsrKykge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnNbaV0ueE9mZnNldCAtPSB0aGlzLnBvc2l0aW9uc1trXS54QWR2YW5jZTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25zW2ldLnlPZmZzZXQgLT0gdGhpcy5wb3NpdGlvbnNba10ueUFkdmFuY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIF9rID0gaiArIDE7IF9rIDwgaSArIDE7IF9rKyspIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25zW2ldLnhPZmZzZXQgKz0gdGhpcy5wb3NpdGlvbnNbX2tdLnhBZHZhbmNlO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnNbaV0ueU9mZnNldCArPSB0aGlzLnBvc2l0aW9uc1tfa10ueUFkdmFuY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBHUE9TUHJvY2Vzc29yO1xufShPVFByb2Nlc3Nvcik7XG5cbnZhciBPVExheW91dEVuZ2luZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE9UTGF5b3V0RW5naW5lKGZvbnQpIHtcbiAgICB0aGlzLmZvbnQgPSBmb250O1xuICAgIHRoaXMuZ2x5cGhJbmZvcyA9IG51bGw7XG4gICAgdGhpcy5wbGFuID0gbnVsbDtcbiAgICB0aGlzLkdTVUJQcm9jZXNzb3IgPSBudWxsO1xuICAgIHRoaXMuR1BPU1Byb2Nlc3NvciA9IG51bGw7XG4gICAgdGhpcy5mYWxsYmFja1Bvc2l0aW9uID0gdHJ1ZTtcblxuICAgIGlmIChmb250LkdTVUIpIHtcbiAgICAgIHRoaXMuR1NVQlByb2Nlc3NvciA9IG5ldyBHU1VCUHJvY2Vzc29yKGZvbnQsIGZvbnQuR1NVQik7XG4gICAgfVxuXG4gICAgaWYgKGZvbnQuR1BPUykge1xuICAgICAgdGhpcy5HUE9TUHJvY2Vzc29yID0gbmV3IEdQT1NQcm9jZXNzb3IoZm9udCwgZm9udC5HUE9TKTtcbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvID0gT1RMYXlvdXRFbmdpbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5zZXR1cCA9IGZ1bmN0aW9uIHNldHVwKGdseXBoUnVuKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIC8vIE1hcCBnbHlwaHMgdG8gR2x5cGhJbmZvIG9iamVjdHMgc28gZGF0YSBjYW4gYmUgcGFzc2VkIGJldHdlZW5cbiAgICAvLyBHU1VCIGFuZCBHUE9TIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHJlYWwgKHNoYXJlZCkgR2x5cGggb2JqZWN0cy5cbiAgICB0aGlzLmdseXBoSW5mb3MgPSBnbHlwaFJ1bi5nbHlwaHMubWFwKGZ1bmN0aW9uIChnbHlwaCkge1xuICAgICAgcmV0dXJuIG5ldyBHbHlwaEluZm8oX3RoaXMuZm9udCwgZ2x5cGguaWQsIFtdLmNvbmNhdChnbHlwaC5jb2RlUG9pbnRzKSk7XG4gICAgfSk7IC8vIFNlbGVjdCBhIHNjcmlwdCBiYXNlZCBvbiB3aGF0IGlzIGF2YWlsYWJsZSBpbiBHU1VCL0dQT1MuXG5cbiAgICB2YXIgc2NyaXB0ID0gbnVsbDtcblxuICAgIGlmICh0aGlzLkdQT1NQcm9jZXNzb3IpIHtcbiAgICAgIHNjcmlwdCA9IHRoaXMuR1BPU1Byb2Nlc3Nvci5zZWxlY3RTY3JpcHQoZ2x5cGhSdW4uc2NyaXB0LCBnbHlwaFJ1bi5sYW5ndWFnZSwgZ2x5cGhSdW4uZGlyZWN0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5HU1VCUHJvY2Vzc29yKSB7XG4gICAgICBzY3JpcHQgPSB0aGlzLkdTVUJQcm9jZXNzb3Iuc2VsZWN0U2NyaXB0KGdseXBoUnVuLnNjcmlwdCwgZ2x5cGhSdW4ubGFuZ3VhZ2UsIGdseXBoUnVuLmRpcmVjdGlvbik7XG4gICAgfSAvLyBDaG9vc2UgYSBzaGFwZXIgYmFzZWQgb24gdGhlIHNjcmlwdCwgYW5kIHNldHVwIGEgc2hhcGluZyBwbGFuLlxuICAgIC8vIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBmZWF0dXJlcyB0byBhcHBseSB0byB3aGljaCBnbHlwaHMuXG5cblxuICAgIHRoaXMuc2hhcGVyID0gY2hvb3NlKHNjcmlwdCk7XG4gICAgdGhpcy5wbGFuID0gbmV3IFNoYXBpbmdQbGFuKHRoaXMuZm9udCwgc2NyaXB0LCBnbHlwaFJ1bi5kaXJlY3Rpb24pO1xuICAgIHRoaXMuc2hhcGVyLnBsYW4odGhpcy5wbGFuLCB0aGlzLmdseXBoSW5mb3MsIGdseXBoUnVuLmZlYXR1cmVzKTsgLy8gQXNzaWduIGNob3NlbiBmZWF0dXJlcyB0byBvdXRwdXQgZ2x5cGggcnVuXG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5wbGFuLmFsbEZlYXR1cmVzKSB7XG4gICAgICBnbHlwaFJ1bi5mZWF0dXJlc1trZXldID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnN1YnN0aXR1dGUgPSBmdW5jdGlvbiBzdWJzdGl0dXRlKGdseXBoUnVuKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5HU1VCUHJvY2Vzc29yKSB7XG4gICAgICB0aGlzLnBsYW4ucHJvY2Vzcyh0aGlzLkdTVUJQcm9jZXNzb3IsIHRoaXMuZ2x5cGhJbmZvcyk7IC8vIE1hcCBnbHlwaCBpbmZvcyBiYWNrIHRvIG5vcm1hbCBHbHlwaCBvYmplY3RzXG5cbiAgICAgIGdseXBoUnVuLmdseXBocyA9IHRoaXMuZ2x5cGhJbmZvcy5tYXAoZnVuY3Rpb24gKGdseXBoSW5mbykge1xuICAgICAgICByZXR1cm4gX3RoaXMyLmZvbnQuZ2V0R2x5cGgoZ2x5cGhJbmZvLmlkLCBnbHlwaEluZm8uY29kZVBvaW50cyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnBvc2l0aW9uID0gZnVuY3Rpb24gcG9zaXRpb24oZ2x5cGhSdW4pIHtcbiAgICBpZiAodGhpcy5zaGFwZXIuemVyb01hcmtXaWR0aHMgPT09ICdCRUZPUkVfR1BPUycpIHtcbiAgICAgIHRoaXMuemVyb01hcmtBZHZhbmNlcyhnbHlwaFJ1bi5wb3NpdGlvbnMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLkdQT1NQcm9jZXNzb3IpIHtcbiAgICAgIHRoaXMucGxhbi5wcm9jZXNzKHRoaXMuR1BPU1Byb2Nlc3NvciwgdGhpcy5nbHlwaEluZm9zLCBnbHlwaFJ1bi5wb3NpdGlvbnMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNoYXBlci56ZXJvTWFya1dpZHRocyA9PT0gJ0FGVEVSX0dQT1MnKSB7XG4gICAgICB0aGlzLnplcm9NYXJrQWR2YW5jZXMoZ2x5cGhSdW4ucG9zaXRpb25zKTtcbiAgICB9IC8vIFJldmVyc2UgdGhlIGdseXBocyBhbmQgcG9zaXRpb25zIGlmIHRoZSBzY3JpcHQgaXMgcmlnaHQtdG8tbGVmdFxuXG5cbiAgICBpZiAoZ2x5cGhSdW4uZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgICAgZ2x5cGhSdW4uZ2x5cGhzLnJldmVyc2UoKTtcbiAgICAgIGdseXBoUnVuLnBvc2l0aW9ucy5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuR1BPU1Byb2Nlc3NvciAmJiB0aGlzLkdQT1NQcm9jZXNzb3IuZmVhdHVyZXM7XG4gIH07XG5cbiAgX3Byb3RvLnplcm9NYXJrQWR2YW5jZXMgPSBmdW5jdGlvbiB6ZXJvTWFya0FkdmFuY2VzKHBvc2l0aW9ucykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nbHlwaEluZm9zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5nbHlwaEluZm9zW2ldLmlzTWFyaykge1xuICAgICAgICBwb3NpdGlvbnNbaV0ueEFkdmFuY2UgPSAwO1xuICAgICAgICBwb3NpdGlvbnNbaV0ueUFkdmFuY2UgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uY2xlYW51cCA9IGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgdGhpcy5nbHlwaEluZm9zID0gbnVsbDtcbiAgICB0aGlzLnBsYW4gPSBudWxsO1xuICAgIHRoaXMuc2hhcGVyID0gbnVsbDtcbiAgfTtcblxuICBfcHJvdG8uZ2V0QXZhaWxhYmxlRmVhdHVyZXMgPSBmdW5jdGlvbiBnZXRBdmFpbGFibGVGZWF0dXJlcyhzY3JpcHQsIGxhbmd1YWdlKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gW107XG5cbiAgICBpZiAodGhpcy5HU1VCUHJvY2Vzc29yKSB7XG4gICAgICB0aGlzLkdTVUJQcm9jZXNzb3Iuc2VsZWN0U2NyaXB0KHNjcmlwdCwgbGFuZ3VhZ2UpO1xuICAgICAgZmVhdHVyZXMucHVzaC5hcHBseShmZWF0dXJlcywgT2JqZWN0LmtleXModGhpcy5HU1VCUHJvY2Vzc29yLmZlYXR1cmVzKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuR1BPU1Byb2Nlc3Nvcikge1xuICAgICAgdGhpcy5HUE9TUHJvY2Vzc29yLnNlbGVjdFNjcmlwdChzY3JpcHQsIGxhbmd1YWdlKTtcbiAgICAgIGZlYXR1cmVzLnB1c2guYXBwbHkoZmVhdHVyZXMsIE9iamVjdC5rZXlzKHRoaXMuR1BPU1Byb2Nlc3Nvci5mZWF0dXJlcykpO1xuICAgIH1cblxuICAgIHJldHVybiBmZWF0dXJlcztcbiAgfTtcblxuICByZXR1cm4gT1RMYXlvdXRFbmdpbmU7XG59KCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkayhvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkayhvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkayhvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGsobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRrKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkayhhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIExheW91dEVuZ2luZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExheW91dEVuZ2luZShmb250KSB7XG4gICAgdGhpcy5mb250ID0gZm9udDtcbiAgICB0aGlzLnVuaWNvZGVMYXlvdXRFbmdpbmUgPSBudWxsO1xuICAgIHRoaXMua2VyblByb2Nlc3NvciA9IG51bGw7IC8vIENob29zZSBhbiBhZHZhbmNlZCBsYXlvdXQgZW5naW5lLiBXZSB0cnkgdGhlIEFBVCBtb3J4IHRhYmxlIGZpcnN0IHNpbmNlIG1vcmVcbiAgICAvLyBzY3JpcHRzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIGJlY2F1c2UgdGhlIHNoYXBpbmcgbG9naWMgaXMgYnVpbHQgaW50byB0aGUgZm9udC5cblxuICAgIGlmICh0aGlzLmZvbnQubW9yeCkge1xuICAgICAgdGhpcy5lbmdpbmUgPSBuZXcgQUFUTGF5b3V0RW5naW5lKHRoaXMuZm9udCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZvbnQuR1NVQiB8fCB0aGlzLmZvbnQuR1BPUykge1xuICAgICAgdGhpcy5lbmdpbmUgPSBuZXcgT1RMYXlvdXRFbmdpbmUodGhpcy5mb250KTtcbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvID0gTGF5b3V0RW5naW5lLnByb3RvdHlwZTtcblxuICBfcHJvdG8ubGF5b3V0ID0gZnVuY3Rpb24gbGF5b3V0KHN0cmluZywgZmVhdHVyZXMsIHNjcmlwdCwgbGFuZ3VhZ2UsIGRpcmVjdGlvbikge1xuICAgIC8vIE1ha2UgdGhlIGZlYXR1cmVzIHBhcmFtZXRlciBvcHRpb25hbFxuICAgIGlmICh0eXBlb2YgZmVhdHVyZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkaXJlY3Rpb24gPSBsYW5ndWFnZTtcbiAgICAgIGxhbmd1YWdlID0gc2NyaXB0O1xuICAgICAgc2NyaXB0ID0gZmVhdHVyZXM7XG4gICAgICBmZWF0dXJlcyA9IFtdO1xuICAgIH0gLy8gTWFwIHN0cmluZyB0byBnbHlwaHMgaWYgbmVlZGVkXG5cblxuICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBkZXRlY3QgdGhlIHNjcmlwdCBmcm9tIHRoZSBzdHJpbmcgaWYgbm90IHByb3ZpZGVkLlxuICAgICAgaWYgKHNjcmlwdCA9PSBudWxsKSB7XG4gICAgICAgIHNjcmlwdCA9IGZvclN0cmluZyhzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZ2x5cGhzID0gdGhpcy5mb250LmdseXBoc0ZvclN0cmluZyhzdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGRldGVjdCB0aGUgc2NyaXB0IGZyb20gdGhlIGdseXBoIGNvZGUgcG9pbnRzIGlmIG5vdCBwcm92aWRlZC5cbiAgICAgIGlmIChzY3JpcHQgPT0gbnVsbCkge1xuICAgICAgICB2YXIgY29kZVBvaW50cyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkayhzdHJpbmcpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBnbHlwaCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGNvZGVQb2ludHMucHVzaC5hcHBseShjb2RlUG9pbnRzLCBnbHlwaC5jb2RlUG9pbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjcmlwdCA9IGZvckNvZGVQb2ludHMoY29kZVBvaW50cyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBnbHlwaHMgPSBzdHJpbmc7XG4gICAgfVxuXG4gICAgdmFyIGdseXBoUnVuID0gbmV3IEdseXBoUnVuKGdseXBocywgZmVhdHVyZXMsIHNjcmlwdCwgbGFuZ3VhZ2UsIGRpcmVjdGlvbik7IC8vIFJldHVybiBlYXJseSBpZiB0aGVyZSBhcmUgbm8gZ2x5cGhzXG5cbiAgICBpZiAoZ2x5cGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZ2x5cGhSdW4ucG9zaXRpb25zID0gW107XG4gICAgICByZXR1cm4gZ2x5cGhSdW47XG4gICAgfSAvLyBTZXR1cCB0aGUgYWR2YW5jZWQgbGF5b3V0IGVuZ2luZVxuXG5cbiAgICBpZiAodGhpcy5lbmdpbmUgJiYgdGhpcy5lbmdpbmUuc2V0dXApIHtcbiAgICAgIHRoaXMuZW5naW5lLnNldHVwKGdseXBoUnVuKTtcbiAgICB9IC8vIFN1YnN0aXR1dGUgYW5kIHBvc2l0aW9uIHRoZSBnbHlwaHNcblxuXG4gICAgdGhpcy5zdWJzdGl0dXRlKGdseXBoUnVuKTtcbiAgICB0aGlzLnBvc2l0aW9uKGdseXBoUnVuKTtcbiAgICB0aGlzLmhpZGVEZWZhdWx0SWdub3JhYmxlcyhnbHlwaFJ1bi5nbHlwaHMsIGdseXBoUnVuLnBvc2l0aW9ucyk7IC8vIExldCB0aGUgbGF5b3V0IGVuZ2luZSBjbGVhbiB1cCBhbnkgc3RhdGUgaXQgbWlnaHQgaGF2ZVxuXG4gICAgaWYgKHRoaXMuZW5naW5lICYmIHRoaXMuZW5naW5lLmNsZWFudXApIHtcbiAgICAgIHRoaXMuZW5naW5lLmNsZWFudXAoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2x5cGhSdW47XG4gIH07XG5cbiAgX3Byb3RvLnN1YnN0aXR1dGUgPSBmdW5jdGlvbiBzdWJzdGl0dXRlKGdseXBoUnVuKSB7XG4gICAgLy8gQ2FsbCB0aGUgYWR2YW5jZWQgbGF5b3V0IGVuZ2luZSB0byBtYWtlIHN1YnN0aXR1dGlvbnNcbiAgICBpZiAodGhpcy5lbmdpbmUgJiYgdGhpcy5lbmdpbmUuc3Vic3RpdHV0ZSkge1xuICAgICAgdGhpcy5lbmdpbmUuc3Vic3RpdHV0ZShnbHlwaFJ1bik7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5wb3NpdGlvbiA9IGZ1bmN0aW9uIHBvc2l0aW9uKGdseXBoUnVuKSB7XG4gICAgLy8gR2V0IGluaXRpYWwgZ2x5cGggcG9zaXRpb25zXG4gICAgZ2x5cGhSdW4ucG9zaXRpb25zID0gZ2x5cGhSdW4uZ2x5cGhzLm1hcChmdW5jdGlvbiAoZ2x5cGgpIHtcbiAgICAgIHJldHVybiBuZXcgR2x5cGhQb3NpdGlvbihnbHlwaC5hZHZhbmNlV2lkdGgpO1xuICAgIH0pO1xuICAgIHZhciBwb3NpdGlvbmVkID0gbnVsbDsgLy8gQ2FsbCB0aGUgYWR2YW5jZWQgbGF5b3V0IGVuZ2luZS4gUmV0dXJucyB0aGUgZmVhdHVyZXMgYXBwbGllZC5cblxuICAgIGlmICh0aGlzLmVuZ2luZSAmJiB0aGlzLmVuZ2luZS5wb3NpdGlvbikge1xuICAgICAgcG9zaXRpb25lZCA9IHRoaXMuZW5naW5lLnBvc2l0aW9uKGdseXBoUnVuKTtcbiAgICB9IC8vIGlmIHRoZXJlIGlzIG5vIEdQT1MgdGFibGUsIHVzZSB1bmljb2RlIHByb3BlcnRpZXMgdG8gcG9zaXRpb24gbWFya3MuXG5cblxuICAgIGlmICghcG9zaXRpb25lZCAmJiAoIXRoaXMuZW5naW5lIHx8IHRoaXMuZW5naW5lLmZhbGxiYWNrUG9zaXRpb24pKSB7XG4gICAgICBpZiAoIXRoaXMudW5pY29kZUxheW91dEVuZ2luZSkge1xuICAgICAgICB0aGlzLnVuaWNvZGVMYXlvdXRFbmdpbmUgPSBuZXcgVW5pY29kZUxheW91dEVuZ2luZSh0aGlzLmZvbnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVuaWNvZGVMYXlvdXRFbmdpbmUucG9zaXRpb25HbHlwaHMoZ2x5cGhSdW4uZ2x5cGhzLCBnbHlwaFJ1bi5wb3NpdGlvbnMpO1xuICAgIH0gLy8gaWYga2VybmluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IEdQT1MsIGRvIGtlcm5pbmcgd2l0aCB0aGUgVHJ1ZVR5cGUvQUFUIGtlcm4gdGFibGVcblxuXG4gICAgaWYgKCghcG9zaXRpb25lZCB8fCAhcG9zaXRpb25lZC5rZXJuKSAmJiBnbHlwaFJ1bi5mZWF0dXJlcy5rZXJuICE9PSBmYWxzZSAmJiB0aGlzLmZvbnQua2Vybikge1xuICAgICAgaWYgKCF0aGlzLmtlcm5Qcm9jZXNzb3IpIHtcbiAgICAgICAgdGhpcy5rZXJuUHJvY2Vzc29yID0gbmV3IEtlcm5Qcm9jZXNzb3IodGhpcy5mb250KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5rZXJuUHJvY2Vzc29yLnByb2Nlc3MoZ2x5cGhSdW4uZ2x5cGhzLCBnbHlwaFJ1bi5wb3NpdGlvbnMpO1xuICAgICAgZ2x5cGhSdW4uZmVhdHVyZXMua2VybiA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5oaWRlRGVmYXVsdElnbm9yYWJsZXMgPSBmdW5jdGlvbiBoaWRlRGVmYXVsdElnbm9yYWJsZXMoZ2x5cGhzLCBwb3NpdGlvbnMpIHtcbiAgICB2YXIgc3BhY2UgPSB0aGlzLmZvbnQuZ2x5cGhGb3JDb2RlUG9pbnQoMHgyMCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdseXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaXNEZWZhdWx0SWdub3JhYmxlKGdseXBoc1tpXS5jb2RlUG9pbnRzWzBdKSkge1xuICAgICAgICBnbHlwaHNbaV0gPSBzcGFjZTtcbiAgICAgICAgcG9zaXRpb25zW2ldLnhBZHZhbmNlID0gMDtcbiAgICAgICAgcG9zaXRpb25zW2ldLnlBZHZhbmNlID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmlzRGVmYXVsdElnbm9yYWJsZSA9IGZ1bmN0aW9uIGlzRGVmYXVsdElnbm9yYWJsZShjaCkge1xuICAgIC8vIEZyb20gRGVyaXZlZENvcmVQcm9wZXJ0aWVzLnR4dCBpbiB0aGUgVW5pY29kZSBkYXRhYmFzZSxcbiAgICAvLyBtaW51cyBVKzExNUYsIFUrMTE2MCwgVSszMTY0IGFuZCBVK0ZGQTAsIHdoaWNoIGlzIHdoYXRcbiAgICAvLyBIYXJmYnV6eiBhbmQgVW5pc2NyaWJlIGRvLlxuICAgIHZhciBwbGFuZSA9IGNoID4+IDE2O1xuXG4gICAgaWYgKHBsYW5lID09PSAwKSB7XG4gICAgICAvLyBCTVBcbiAgICAgIHN3aXRjaCAoY2ggPj4gOCkge1xuICAgICAgICBjYXNlIDB4MDA6XG4gICAgICAgICAgcmV0dXJuIGNoID09PSAweDAwQUQ7XG5cbiAgICAgICAgY2FzZSAweDAzOlxuICAgICAgICAgIHJldHVybiBjaCA9PT0gMHgwMzRGO1xuXG4gICAgICAgIGNhc2UgMHgwNjpcbiAgICAgICAgICByZXR1cm4gY2ggPT09IDB4MDYxQztcblxuICAgICAgICBjYXNlIDB4MTc6XG4gICAgICAgICAgcmV0dXJuIDB4MTdCNCA8PSBjaCAmJiBjaCA8PSAweDE3QjU7XG5cbiAgICAgICAgY2FzZSAweDE4OlxuICAgICAgICAgIHJldHVybiAweDE4MEIgPD0gY2ggJiYgY2ggPD0gMHgxODBFO1xuXG4gICAgICAgIGNhc2UgMHgyMDpcbiAgICAgICAgICByZXR1cm4gMHgyMDBCIDw9IGNoICYmIGNoIDw9IDB4MjAwRiB8fCAweDIwMkEgPD0gY2ggJiYgY2ggPD0gMHgyMDJFIHx8IDB4MjA2MCA8PSBjaCAmJiBjaCA8PSAweDIwNkY7XG5cbiAgICAgICAgY2FzZSAweEZFOlxuICAgICAgICAgIHJldHVybiAweEZFMDAgPD0gY2ggJiYgY2ggPD0gMHhGRTBGIHx8IGNoID09PSAweEZFRkY7XG5cbiAgICAgICAgY2FzZSAweEZGOlxuICAgICAgICAgIHJldHVybiAweEZGRjAgPD0gY2ggJiYgY2ggPD0gMHhGRkY4O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdGhlciBwbGFuZXNcbiAgICAgIHN3aXRjaCAocGxhbmUpIHtcbiAgICAgICAgY2FzZSAweDAxOlxuICAgICAgICAgIHJldHVybiAweDFCQ0EwIDw9IGNoICYmIGNoIDw9IDB4MUJDQTMgfHwgMHgxRDE3MyA8PSBjaCAmJiBjaCA8PSAweDFEMTdBO1xuXG4gICAgICAgIGNhc2UgMHgwRTpcbiAgICAgICAgICByZXR1cm4gMHhFMDAwMCA8PSBjaCAmJiBjaCA8PSAweEUwRkZGO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZ2V0QXZhaWxhYmxlRmVhdHVyZXMgPSBmdW5jdGlvbiBnZXRBdmFpbGFibGVGZWF0dXJlcyhzY3JpcHQsIGxhbmd1YWdlKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gW107XG5cbiAgICBpZiAodGhpcy5lbmdpbmUpIHtcbiAgICAgIGZlYXR1cmVzLnB1c2guYXBwbHkoZmVhdHVyZXMsIHRoaXMuZW5naW5lLmdldEF2YWlsYWJsZUZlYXR1cmVzKHNjcmlwdCwgbGFuZ3VhZ2UpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb250Lmtlcm4gJiYgZmVhdHVyZXMuaW5kZXhPZigna2VybicpID09PSAtMSkge1xuICAgICAgZmVhdHVyZXMucHVzaCgna2VybicpO1xuICAgIH1cblxuICAgIHJldHVybiBmZWF0dXJlcztcbiAgfTtcblxuICBfcHJvdG8uc3RyaW5nc0ZvckdseXBoID0gZnVuY3Rpb24gc3RyaW5nc0ZvckdseXBoKGdpZCkge1xuICAgIHZhciByZXN1bHQgPSBuZXcgU2V0KCk7XG5cbiAgICB2YXIgY29kZVBvaW50cyA9IHRoaXMuZm9udC5fY21hcFByb2Nlc3Nvci5jb2RlUG9pbnRzRm9yR2x5cGgoZ2lkKTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGsoY29kZVBvaW50cyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgY29kZVBvaW50ID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgcmVzdWx0LmFkZChTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlUG9pbnQpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbmdpbmUgJiYgdGhpcy5lbmdpbmUuc3RyaW5nc0ZvckdseXBoKSB7XG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRrKHRoaXMuZW5naW5lLnN0cmluZ3NGb3JHbHlwaChnaWQpKSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHN0cmluZyA9IF9zdGVwMy52YWx1ZTtcbiAgICAgICAgcmVzdWx0LmFkZChzdHJpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKHJlc3VsdCk7XG4gIH07XG5cbiAgcmV0dXJuIExheW91dEVuZ2luZTtcbn0oKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRsKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRsKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRsKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkbChvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGwobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRsKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQ1KHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDUoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ1KENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbnZhciBTVkdfQ09NTUFORFMgPSB7XG4gIG1vdmVUbzogJ00nLFxuICBsaW5lVG86ICdMJyxcbiAgcXVhZHJhdGljQ3VydmVUbzogJ1EnLFxuICBiZXppZXJDdXJ2ZVRvOiAnQycsXG4gIGNsb3NlUGF0aDogJ1onXG59O1xuLyoqXG4gKiBQYXRoIG9iamVjdHMgYXJlIHJldHVybmVkIGJ5IGdseXBocyBhbmQgcmVwcmVzZW50IHRoZSBhY3R1YWxcbiAqIHZlY3RvciBvdXRsaW5lcyBmb3IgZWFjaCBnbHlwaCBpbiB0aGUgZm9udC4gUGF0aHMgY2FuIGJlIGNvbnZlcnRlZFxuICogdG8gU1ZHIHBhdGggZGF0YSBzdHJpbmdzLCBvciB0byBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0b1xuICogcmVuZGVyIHRoZSBwYXRoIHRvIGEgZ3JhcGhpY3MgY29udGV4dC5cbiAqL1xuXG52YXIgUGF0aCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBhdGgoKSB7XG4gICAgdGhpcy5jb21tYW5kcyA9IFtdO1xuICAgIHRoaXMuX2Jib3ggPSBudWxsO1xuICAgIHRoaXMuX2Nib3ggPSBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBDb21waWxlcyB0aGUgcGF0aCB0byBhIEphdmFTY3JpcHQgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB3aXRoXG4gICAqIGEgZ3JhcGhpY3MgY29udGV4dCBpbiBvcmRlciB0byByZW5kZXIgdGhlIHBhdGguXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gUGF0aC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnRvRnVuY3Rpb24gPSBmdW5jdGlvbiB0b0Z1bmN0aW9uKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKGN0eCkge1xuICAgICAgcmV0dXJuIF90aGlzLmNvbW1hbmRzLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGN0eFtjLmNvbW1hbmRdLmFwcGx5KGN0eCwgYy5hcmdzKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBwYXRoIHRvIGFuIFNWRyBwYXRoIGRhdGEgc3RyaW5nXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9TVkcgPSBmdW5jdGlvbiB0b1NWRygpIHtcbiAgICB2YXIgY21kcyA9IHRoaXMuY29tbWFuZHMubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICB2YXIgYXJncyA9IGMuYXJncy5tYXAoZnVuY3Rpb24gKGFyZykge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChhcmcgKiAxMDApIC8gMTAwO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gXCJcIiArIFNWR19DT01NQU5EU1tjLmNvbW1hbmRdICsgYXJncy5qb2luKCcgJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNtZHMuam9pbignJyk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIFwiY29udHJvbCBib3hcIiBvZiBhIHBhdGguXG4gICAqIFRoaXMgaXMgbGlrZSB0aGUgYm91bmRpbmcgYm94LCBidXQgaXQgaW5jbHVkZXMgYWxsIHBvaW50cyBpbmNsdWRpbmdcbiAgICogY29udHJvbCBwb2ludHMgb2YgYmV6aWVyIHNlZ21lbnRzIGFuZCBpcyBtdWNoIGZhc3RlciB0byBjb21wdXRlIHRoYW5cbiAgICogdGhlIHJlYWwgYm91bmRpbmcgYm94LlxuICAgKiBAdHlwZSB7QkJveH1cbiAgICovXG4gIDtcblxuICAvKipcbiAgICogQXBwbGllcyBhIG1hcHBpbmcgZnVuY3Rpb24gdG8gZWFjaCBwb2ludCBpbiB0aGUgcGF0aC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZm5cbiAgICogQHJldHVybiB7UGF0aH1cbiAgICovXG4gIF9wcm90by5tYXBQb2ludHMgPSBmdW5jdGlvbiBtYXBQb2ludHMoZm4pIHtcbiAgICB2YXIgcGF0aCA9IG5ldyBQYXRoKCk7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGwodGhpcy5jb21tYW5kcyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgYyA9IF9zdGVwLnZhbHVlO1xuICAgICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjLmFyZ3MubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgdmFyIF9mbiA9IGZuKGMuYXJnc1tpXSwgYy5hcmdzW2kgKyAxXSksXG4gICAgICAgICAgICB4ID0gX2ZuWzBdLFxuICAgICAgICAgICAgeSA9IF9mblsxXTtcblxuICAgICAgICBhcmdzLnB1c2goeCwgeSk7XG4gICAgICB9XG5cbiAgICAgIHBhdGhbYy5jb21tYW5kXS5hcHBseShwYXRoLCBhcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuICAvKipcbiAgICogVHJhbnNmb3JtcyB0aGUgcGF0aCBieSB0aGUgZ2l2ZW4gbWF0cml4LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50cmFuc2Zvcm0gPSBmdW5jdGlvbiB0cmFuc2Zvcm0obTAsIG0xLCBtMiwgbTMsIG00LCBtNSkge1xuICAgIHJldHVybiB0aGlzLm1hcFBvaW50cyhmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgeCA9IG0wICogeCArIG0yICogeSArIG00O1xuICAgICAgeSA9IG0xICogeCArIG0zICogeSArIG01O1xuICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogVHJhbnNsYXRlcyB0aGUgcGF0aCBieSB0aGUgZ2l2ZW4gb2Zmc2V0LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50cmFuc2xhdGUgPSBmdW5jdGlvbiB0cmFuc2xhdGUoeCwgeSkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybSgxLCAwLCAwLCAxLCB4LCB5KTtcbiAgfVxuICAvKipcbiAgICogUm90YXRlcyB0aGUgcGF0aCBieSB0aGUgZ2l2ZW4gYW5nbGUgKGluIHJhZGlhbnMpLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yb3RhdGUgPSBmdW5jdGlvbiByb3RhdGUoYW5nbGUpIHtcbiAgICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIHZhciBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKGNvcywgc2luLCAtc2luLCBjb3MsIDAsIDApO1xuICB9XG4gIC8qKlxuICAgKiBTY2FsZXMgdGhlIHBhdGguXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnNjYWxlID0gZnVuY3Rpb24gc2NhbGUoc2NhbGVYLCBzY2FsZVkpIHtcbiAgICBpZiAoc2NhbGVZID09PSB2b2lkIDApIHtcbiAgICAgIHNjYWxlWSA9IHNjYWxlWDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oc2NhbGVYLCAwLCAwLCBzY2FsZVksIDAsIDApO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyQ1KFBhdGgsIFt7XG4gICAga2V5OiBcImNib3hcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICghdGhpcy5fY2JveCkge1xuICAgICAgICB2YXIgY2JveCA9IG5ldyBCQm94KCk7XG5cbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkbCh0aGlzLmNvbW1hbmRzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgY29tbWFuZCA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWFuZC5hcmdzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBjYm94LmFkZFBvaW50KGNvbW1hbmQuYXJnc1tpXSwgY29tbWFuZC5hcmdzW2kgKyAxXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2JveCA9IE9iamVjdC5mcmVlemUoY2JveCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9jYm94O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBleGFjdCBib3VuZGluZyBib3ggb2YgdGhlIHBhdGggYnkgZXZhbHVhdGluZyBjdXJ2ZSBzZWdtZW50cy5cbiAgICAgKiBTbG93ZXIgdG8gY29tcHV0ZSB0aGFuIHRoZSBjb250cm9sIGJveCwgYnV0IG1vcmUgYWNjdXJhdGUuXG4gICAgICogQHR5cGUge0JCb3h9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJiYm94XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5fYmJveCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmJveDtcbiAgICAgIH1cblxuICAgICAgdmFyIGJib3ggPSBuZXcgQkJveCgpO1xuICAgICAgdmFyIGN4ID0gMCxcbiAgICAgICAgICBjeSA9IDA7XG5cbiAgICAgIHZhciBmID0gZnVuY3Rpb24gZih0KSB7XG4gICAgICAgIHJldHVybiBNYXRoLnBvdygxIC0gdCwgMykgKiBwMFtpXSArIDMgKiBNYXRoLnBvdygxIC0gdCwgMikgKiB0ICogcDFbaV0gKyAzICogKDEgLSB0KSAqIE1hdGgucG93KHQsIDIpICogcDJbaV0gKyBNYXRoLnBvdyh0LCAzKSAqIHAzW2ldO1xuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkbCh0aGlzLmNvbW1hbmRzKSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGMgPSBfc3RlcDMudmFsdWU7XG5cbiAgICAgICAgc3dpdGNoIChjLmNvbW1hbmQpIHtcbiAgICAgICAgICBjYXNlICdtb3ZlVG8nOlxuICAgICAgICAgIGNhc2UgJ2xpbmVUbyc6XG4gICAgICAgICAgICB2YXIgX2MkYXJncyA9IGMuYXJncyxcbiAgICAgICAgICAgICAgICB4ID0gX2MkYXJnc1swXSxcbiAgICAgICAgICAgICAgICB5ID0gX2MkYXJnc1sxXTtcbiAgICAgICAgICAgIGJib3guYWRkUG9pbnQoeCwgeSk7XG4gICAgICAgICAgICBjeCA9IHg7XG4gICAgICAgICAgICBjeSA9IHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3F1YWRyYXRpY0N1cnZlVG8nOlxuICAgICAgICAgIGNhc2UgJ2JlemllckN1cnZlVG8nOlxuICAgICAgICAgICAgaWYgKGMuY29tbWFuZCA9PT0gJ3F1YWRyYXRpY0N1cnZlVG8nKSB7XG4gICAgICAgICAgICAgIC8vIGh0dHA6Ly9mb250Zm9yZ2Uub3JnL2Jlemllci5odG1sXG4gICAgICAgICAgICAgIHZhciBfYyRhcmdzMiA9IGMuYXJncyxcbiAgICAgICAgICAgICAgICAgIHFwMXggPSBfYyRhcmdzMlswXSxcbiAgICAgICAgICAgICAgICAgIHFwMXkgPSBfYyRhcmdzMlsxXSxcbiAgICAgICAgICAgICAgICAgIHAzeCA9IF9jJGFyZ3MyWzJdLFxuICAgICAgICAgICAgICAgICAgcDN5ID0gX2MkYXJnczJbM107XG4gICAgICAgICAgICAgIHZhciBjcDF4ID0gY3ggKyAyIC8gMyAqIChxcDF4IC0gY3gpOyAvLyBDUDEgPSBRUDAgKyAyLzMgKiAoUVAxLVFQMClcblxuICAgICAgICAgICAgICB2YXIgY3AxeSA9IGN5ICsgMiAvIDMgKiAocXAxeSAtIGN5KTtcbiAgICAgICAgICAgICAgdmFyIGNwMnggPSBwM3ggKyAyIC8gMyAqIChxcDF4IC0gcDN4KTsgLy8gQ1AyID0gUVAyICsgMi8zICogKFFQMS1RUDIpXG5cbiAgICAgICAgICAgICAgdmFyIGNwMnkgPSBwM3kgKyAyIC8gMyAqIChxcDF5IC0gcDN5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfYyRhcmdzMyA9IGMuYXJncyxcbiAgICAgICAgICAgICAgICAgIGNwMXggPSBfYyRhcmdzM1swXSxcbiAgICAgICAgICAgICAgICAgIGNwMXkgPSBfYyRhcmdzM1sxXSxcbiAgICAgICAgICAgICAgICAgIGNwMnggPSBfYyRhcmdzM1syXSxcbiAgICAgICAgICAgICAgICAgIGNwMnkgPSBfYyRhcmdzM1szXSxcbiAgICAgICAgICAgICAgICAgIHAzeCA9IF9jJGFyZ3MzWzRdLFxuICAgICAgICAgICAgICAgICAgcDN5ID0gX2MkYXJnczNbNV07XG4gICAgICAgICAgICB9IC8vIGh0dHA6Ly9ibG9nLmhhY2tlcnMtY2FmZS5uZXQvMjAwOS8wNi9ob3ctdG8tY2FsY3VsYXRlLWJlemllci1jdXJ2ZXMtYm91bmRpbmcuaHRtbFxuXG5cbiAgICAgICAgICAgIGJib3guYWRkUG9pbnQocDN4LCBwM3kpO1xuICAgICAgICAgICAgdmFyIHAwID0gW2N4LCBjeV07XG4gICAgICAgICAgICB2YXIgcDEgPSBbY3AxeCwgY3AxeV07XG4gICAgICAgICAgICB2YXIgcDIgPSBbY3AyeCwgY3AyeV07XG4gICAgICAgICAgICB2YXIgcDMgPSBbcDN4LCBwM3ldO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIGIgPSA2ICogcDBbaV0gLSAxMiAqIHAxW2ldICsgNiAqIHAyW2ldO1xuICAgICAgICAgICAgICB2YXIgYSA9IC0zICogcDBbaV0gKyA5ICogcDFbaV0gLSA5ICogcDJbaV0gKyAzICogcDNbaV07XG4gICAgICAgICAgICAgIGMgPSAzICogcDFbaV0gLSAzICogcDBbaV07XG5cbiAgICAgICAgICAgICAgaWYgKGEgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoYiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHQgPSAtYyAvIGI7XG5cbiAgICAgICAgICAgICAgICBpZiAoMCA8IHQgJiYgdCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJib3guYWRkUG9pbnQoZih0KSwgYmJveC5tYXhZKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBiYm94LmFkZFBvaW50KGJib3gubWF4WCwgZih0KSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgYjJhYyA9IE1hdGgucG93KGIsIDIpIC0gNCAqIGMgKiBhO1xuXG4gICAgICAgICAgICAgIGlmIChiMmFjIDwgMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIHQxID0gKC1iICsgTWF0aC5zcXJ0KGIyYWMpKSAvICgyICogYSk7XG5cbiAgICAgICAgICAgICAgaWYgKDAgPCB0MSAmJiB0MSA8IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgYmJveC5hZGRQb2ludChmKHQxKSwgYmJveC5tYXhZKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgIGJib3guYWRkUG9pbnQoYmJveC5tYXhYLCBmKHQxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIHQyID0gKC1iIC0gTWF0aC5zcXJ0KGIyYWMpKSAvICgyICogYSk7XG5cbiAgICAgICAgICAgICAgaWYgKDAgPCB0MiAmJiB0MiA8IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgYmJveC5hZGRQb2ludChmKHQyKSwgYmJveC5tYXhZKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgIGJib3guYWRkUG9pbnQoYmJveC5tYXhYLCBmKHQyKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN4ID0gcDN4O1xuICAgICAgICAgICAgY3kgPSBwM3k7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fYmJveCA9IE9iamVjdC5mcmVlemUoYmJveCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBhdGg7XG59KCk7XG5cbnZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICB2YXIgY29tbWFuZCA9IF9hcnJbX2ldO1xuXG4gIFBhdGgucHJvdG90eXBlW2NvbW1hbmRdID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX2Jib3ggPSB0aGlzLl9jYm94ID0gbnVsbDtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbW1hbmRzLnB1c2goe1xuICAgICAgY29tbWFuZDogY29tbWFuZCxcbiAgICAgIGFyZ3M6IGFyZ3NcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn07XG5cbmZvciAodmFyIF9pID0gMCwgX2FyciA9IFsnbW92ZVRvJywgJ2xpbmVUbycsICdxdWFkcmF0aWNDdXJ2ZVRvJywgJ2JlemllckN1cnZlVG8nLCAnY2xvc2VQYXRoJ107IF9pIDwgX2Fyci5sZW5ndGg7IF9pKyspIHtcbiAgX2xvb3AoKTtcbn1cblxudmFyIFN0YW5kYXJkTmFtZXMgPSBbJy5ub3RkZWYnLCAnLm51bGwnLCAnbm9ubWFya2luZ3JldHVybicsICdzcGFjZScsICdleGNsYW0nLCAncXVvdGVkYmwnLCAnbnVtYmVyc2lnbicsICdkb2xsYXInLCAncGVyY2VudCcsICdhbXBlcnNhbmQnLCAncXVvdGVzaW5nbGUnLCAncGFyZW5sZWZ0JywgJ3BhcmVucmlnaHQnLCAnYXN0ZXJpc2snLCAncGx1cycsICdjb21tYScsICdoeXBoZW4nLCAncGVyaW9kJywgJ3NsYXNoJywgJ3plcm8nLCAnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJywgJ2ZpdmUnLCAnc2l4JywgJ3NldmVuJywgJ2VpZ2h0JywgJ25pbmUnLCAnY29sb24nLCAnc2VtaWNvbG9uJywgJ2xlc3MnLCAnZXF1YWwnLCAnZ3JlYXRlcicsICdxdWVzdGlvbicsICdhdCcsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLCAnTycsICdQJywgJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnYnJhY2tldGxlZnQnLCAnYmFja3NsYXNoJywgJ2JyYWNrZXRyaWdodCcsICdhc2NpaWNpcmN1bScsICd1bmRlcnNjb3JlJywgJ2dyYXZlJywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsICdvJywgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsICdicmFjZWxlZnQnLCAnYmFyJywgJ2JyYWNlcmlnaHQnLCAnYXNjaWl0aWxkZScsICdBZGllcmVzaXMnLCAnQXJpbmcnLCAnQ2NlZGlsbGEnLCAnRWFjdXRlJywgJ050aWxkZScsICdPZGllcmVzaXMnLCAnVWRpZXJlc2lzJywgJ2FhY3V0ZScsICdhZ3JhdmUnLCAnYWNpcmN1bWZsZXgnLCAnYWRpZXJlc2lzJywgJ2F0aWxkZScsICdhcmluZycsICdjY2VkaWxsYScsICdlYWN1dGUnLCAnZWdyYXZlJywgJ2VjaXJjdW1mbGV4JywgJ2VkaWVyZXNpcycsICdpYWN1dGUnLCAnaWdyYXZlJywgJ2ljaXJjdW1mbGV4JywgJ2lkaWVyZXNpcycsICdudGlsZGUnLCAnb2FjdXRlJywgJ29ncmF2ZScsICdvY2lyY3VtZmxleCcsICdvZGllcmVzaXMnLCAnb3RpbGRlJywgJ3VhY3V0ZScsICd1Z3JhdmUnLCAndWNpcmN1bWZsZXgnLCAndWRpZXJlc2lzJywgJ2RhZ2dlcicsICdkZWdyZWUnLCAnY2VudCcsICdzdGVybGluZycsICdzZWN0aW9uJywgJ2J1bGxldCcsICdwYXJhZ3JhcGgnLCAnZ2VybWFuZGJscycsICdyZWdpc3RlcmVkJywgJ2NvcHlyaWdodCcsICd0cmFkZW1hcmsnLCAnYWN1dGUnLCAnZGllcmVzaXMnLCAnbm90ZXF1YWwnLCAnQUUnLCAnT3NsYXNoJywgJ2luZmluaXR5JywgJ3BsdXNtaW51cycsICdsZXNzZXF1YWwnLCAnZ3JlYXRlcmVxdWFsJywgJ3llbicsICdtdScsICdwYXJ0aWFsZGlmZicsICdzdW1tYXRpb24nLCAncHJvZHVjdCcsICdwaScsICdpbnRlZ3JhbCcsICdvcmRmZW1pbmluZScsICdvcmRtYXNjdWxpbmUnLCAnT21lZ2EnLCAnYWUnLCAnb3NsYXNoJywgJ3F1ZXN0aW9uZG93bicsICdleGNsYW1kb3duJywgJ2xvZ2ljYWxub3QnLCAncmFkaWNhbCcsICdmbG9yaW4nLCAnYXBwcm94ZXF1YWwnLCAnRGVsdGEnLCAnZ3VpbGxlbW90bGVmdCcsICdndWlsbGVtb3RyaWdodCcsICdlbGxpcHNpcycsICdub25icmVha2luZ3NwYWNlJywgJ0FncmF2ZScsICdBdGlsZGUnLCAnT3RpbGRlJywgJ09FJywgJ29lJywgJ2VuZGFzaCcsICdlbWRhc2gnLCAncXVvdGVkYmxsZWZ0JywgJ3F1b3RlZGJscmlnaHQnLCAncXVvdGVsZWZ0JywgJ3F1b3RlcmlnaHQnLCAnZGl2aWRlJywgJ2xvemVuZ2UnLCAneWRpZXJlc2lzJywgJ1lkaWVyZXNpcycsICdmcmFjdGlvbicsICdjdXJyZW5jeScsICdndWlsc2luZ2xsZWZ0JywgJ2d1aWxzaW5nbHJpZ2h0JywgJ2ZpJywgJ2ZsJywgJ2RhZ2dlcmRibCcsICdwZXJpb2RjZW50ZXJlZCcsICdxdW90ZXNpbmdsYmFzZScsICdxdW90ZWRibGJhc2UnLCAncGVydGhvdXNhbmQnLCAnQWNpcmN1bWZsZXgnLCAnRWNpcmN1bWZsZXgnLCAnQWFjdXRlJywgJ0VkaWVyZXNpcycsICdFZ3JhdmUnLCAnSWFjdXRlJywgJ0ljaXJjdW1mbGV4JywgJ0lkaWVyZXNpcycsICdJZ3JhdmUnLCAnT2FjdXRlJywgJ09jaXJjdW1mbGV4JywgJ2FwcGxlJywgJ09ncmF2ZScsICdVYWN1dGUnLCAnVWNpcmN1bWZsZXgnLCAnVWdyYXZlJywgJ2RvdGxlc3NpJywgJ2NpcmN1bWZsZXgnLCAndGlsZGUnLCAnbWFjcm9uJywgJ2JyZXZlJywgJ2RvdGFjY2VudCcsICdyaW5nJywgJ2NlZGlsbGEnLCAnaHVuZ2FydW1sYXV0JywgJ29nb25laycsICdjYXJvbicsICdMc2xhc2gnLCAnbHNsYXNoJywgJ1NjYXJvbicsICdzY2Fyb24nLCAnWmNhcm9uJywgJ3pjYXJvbicsICdicm9rZW5iYXInLCAnRXRoJywgJ2V0aCcsICdZYWN1dGUnLCAneWFjdXRlJywgJ1Rob3JuJywgJ3Rob3JuJywgJ21pbnVzJywgJ211bHRpcGx5JywgJ29uZXN1cGVyaW9yJywgJ3R3b3N1cGVyaW9yJywgJ3RocmVlc3VwZXJpb3InLCAnb25laGFsZicsICdvbmVxdWFydGVyJywgJ3RocmVlcXVhcnRlcnMnLCAnZnJhbmMnLCAnR2JyZXZlJywgJ2dicmV2ZScsICdJZG90YWNjZW50JywgJ1NjZWRpbGxhJywgJ3NjZWRpbGxhJywgJ0NhY3V0ZScsICdjYWN1dGUnLCAnQ2Nhcm9uJywgJ2NjYXJvbicsICdkY3JvYXQnXTtcblxudmFyIF9jbGFzcyQzO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQ2KHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDYoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ2KENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNihDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQzKHRhcmdldCwgcHJvcGVydHksIGRlY29yYXRvcnMsIGRlc2NyaXB0b3IsIGNvbnRleHQpIHsgdmFyIGRlc2MgPSB7fTsgT2JqZWN0LmtleXMoZGVzY3JpcHRvcikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IGRlc2Nba2V5XSA9IGRlc2NyaXB0b3Jba2V5XTsgfSk7IGRlc2MuZW51bWVyYWJsZSA9ICEhZGVzYy5lbnVtZXJhYmxlOyBkZXNjLmNvbmZpZ3VyYWJsZSA9ICEhZGVzYy5jb25maWd1cmFibGU7IGlmICgndmFsdWUnIGluIGRlc2MgfHwgZGVzYy5pbml0aWFsaXplcikgeyBkZXNjLndyaXRhYmxlID0gdHJ1ZTsgfSBkZXNjID0gZGVjb3JhdG9ycy5zbGljZSgpLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGRlc2MsIGRlY29yYXRvcikgeyByZXR1cm4gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHksIGRlc2MpIHx8IGRlc2M7IH0sIGRlc2MpOyBpZiAoY29udGV4dCAmJiBkZXNjLmluaXRpYWxpemVyICE9PSB2b2lkIDApIHsgZGVzYy52YWx1ZSA9IGRlc2MuaW5pdGlhbGl6ZXIgPyBkZXNjLmluaXRpYWxpemVyLmNhbGwoY29udGV4dCkgOiB2b2lkIDA7IGRlc2MuaW5pdGlhbGl6ZXIgPSB1bmRlZmluZWQ7IH0gaWYgKGRlc2MuaW5pdGlhbGl6ZXIgPT09IHZvaWQgMCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYyk7IGRlc2MgPSBudWxsOyB9IHJldHVybiBkZXNjOyB9XG4vKipcbiAqIEdseXBoIG9iamVjdHMgcmVwcmVzZW50IGEgZ2x5cGggaW4gdGhlIGZvbnQuIFRoZXkgaGF2ZSB2YXJpb3VzIHByb3BlcnRpZXMgZm9yIGFjY2Vzc2luZyBtZXRyaWNzIGFuZFxuICogdGhlIGFjdHVhbCB2ZWN0b3IgcGF0aCB0aGUgZ2x5cGggcmVwcmVzZW50cywgYW5kIG1ldGhvZHMgZm9yIHJlbmRlcmluZyB0aGUgZ2x5cGggdG8gYSBncmFwaGljcyBjb250ZXh0LlxuICpcbiAqIFlvdSBkbyBub3QgY3JlYXRlIGdseXBoIG9iamVjdHMgZGlyZWN0bHkuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdmFyaW91cyBtZXRob2RzIG9uIHRoZSBmb250IG9iamVjdC5cbiAqIFRoZXJlIGFyZSBzZXZlcmFsIHN1YmNsYXNzZXMgb2YgdGhlIGJhc2UgR2x5cGggY2xhc3MgaW50ZXJuYWxseSB0aGF0IG1heSBiZSByZXR1cm5lZCBkZXBlbmRpbmdcbiAqIG9uIHRoZSBmb250IGZvcm1hdCwgYnV0IHRoZXkgYWxsIGluaGVyaXQgZnJvbSB0aGlzIGNsYXNzLlxuICovXG5cbnZhciBHbHlwaCA9IChfY2xhc3MkMyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEdseXBoKGlkLCBjb2RlUG9pbnRzLCBmb250KSB7XG4gICAgLyoqXG4gICAgICogVGhlIGdseXBoIGlkIGluIHRoZSBmb250XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdW5pY29kZSBjb2RlIHBvaW50cyB0aGF0IGFyZSByZXByZXNlbnRlZCBieSB0aGlzIGdseXBoLlxuICAgICAqIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBjb2RlIHBvaW50cyBpbiB0aGUgY2FzZSBvZiBsaWdhdHVyZXMgYW5kIG90aGVyIGdseXBoc1xuICAgICAqIHRoYXQgcmVwcmVzZW50IG11bHRpcGxlIHZpc3VhbCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtudW1iZXJbXX1cbiAgICAgKi9cblxuICAgIHRoaXMuY29kZVBvaW50cyA9IGNvZGVQb2ludHM7XG4gICAgdGhpcy5fZm9udCA9IGZvbnQ7IC8vIFRPRE86IGdldCB0aGlzIGluZm8gZnJvbSBHREVGIGlmIGF2YWlsYWJsZVxuXG4gICAgdGhpcy5pc01hcmsgPSB0aGlzLmNvZGVQb2ludHMubGVuZ3RoID4gMCAmJiB0aGlzLmNvZGVQb2ludHMuZXZlcnkodW5pY29kZS5pc01hcmspO1xuICAgIHRoaXMuaXNMaWdhdHVyZSA9IHRoaXMuY29kZVBvaW50cy5sZW5ndGggPiAxO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEdseXBoLnByb3RvdHlwZTtcblxuICBfcHJvdG8uX2dldFBhdGggPSBmdW5jdGlvbiBfZ2V0UGF0aCgpIHtcbiAgICByZXR1cm4gbmV3IFBhdGgoKTtcbiAgfTtcblxuICBfcHJvdG8uX2dldENCb3ggPSBmdW5jdGlvbiBfZ2V0Q0JveCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoLmNib3g7XG4gIH07XG5cbiAgX3Byb3RvLl9nZXRCQm94ID0gZnVuY3Rpb24gX2dldEJCb3goKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aC5iYm94O1xuICB9O1xuXG4gIF9wcm90by5fZ2V0VGFibGVNZXRyaWNzID0gZnVuY3Rpb24gX2dldFRhYmxlTWV0cmljcyh0YWJsZSkge1xuICAgIGlmICh0aGlzLmlkIDwgdGFibGUubWV0cmljcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0YWJsZS5tZXRyaWNzLmdldCh0aGlzLmlkKTtcbiAgICB9XG5cbiAgICB2YXIgbWV0cmljID0gdGFibGUubWV0cmljcy5nZXQodGFibGUubWV0cmljcy5sZW5ndGggLSAxKTtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgYWR2YW5jZTogbWV0cmljID8gbWV0cmljLmFkdmFuY2UgOiAwLFxuICAgICAgYmVhcmluZzogdGFibGUuYmVhcmluZ3MuZ2V0KHRoaXMuaWQgLSB0YWJsZS5tZXRyaWNzLmxlbmd0aCkgfHwgMFxuICAgIH07XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBfcHJvdG8uX2dldE1ldHJpY3MgPSBmdW5jdGlvbiBfZ2V0TWV0cmljcyhjYm94KSB7XG4gICAgaWYgKHRoaXMuX21ldHJpY3MpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tZXRyaWNzO1xuICAgIH1cblxuICAgIHZhciBfdGhpcyRfZ2V0VGFibGVNZXRyaWMgPSB0aGlzLl9nZXRUYWJsZU1ldHJpY3ModGhpcy5fZm9udC5obXR4KSxcbiAgICAgICAgYWR2YW5jZVdpZHRoID0gX3RoaXMkX2dldFRhYmxlTWV0cmljLmFkdmFuY2UsXG4gICAgICAgIGxlZnRCZWFyaW5nID0gX3RoaXMkX2dldFRhYmxlTWV0cmljLmJlYXJpbmc7IC8vIEZvciB2ZXJ0aWNhbCBtZXRyaWNzLCB1c2Ugdm10eCBpZiBhdmFpbGFibGUsIG9yIGZhbGwgYmFjayB0byBnbG9iYWwgZGF0YSBmcm9tIE9TLzIgb3IgaGhlYVxuXG5cbiAgICBpZiAodGhpcy5fZm9udC52bXR4KSB7XG4gICAgICB2YXIgX3RoaXMkX2dldFRhYmxlTWV0cmljMiA9IHRoaXMuX2dldFRhYmxlTWV0cmljcyh0aGlzLl9mb250LnZtdHgpLFxuICAgICAgICAgIGFkdmFuY2VIZWlnaHQgPSBfdGhpcyRfZ2V0VGFibGVNZXRyaWMyLmFkdmFuY2UsXG4gICAgICAgICAgdG9wQmVhcmluZyA9IF90aGlzJF9nZXRUYWJsZU1ldHJpYzIuYmVhcmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9zMjtcblxuICAgICAgaWYgKHR5cGVvZiBjYm94ID09PSAndW5kZWZpbmVkJyB8fCBjYm94ID09PSBudWxsKSB7XG4gICAgICAgIGNib3ggPSB0aGlzLmNib3g7XG4gICAgICB9XG5cbiAgICAgIGlmICgob3MyID0gdGhpcy5fZm9udFsnT1MvMiddKSAmJiBvczIudmVyc2lvbiA+IDApIHtcbiAgICAgICAgdmFyIGFkdmFuY2VIZWlnaHQgPSBNYXRoLmFicyhvczIudHlwb0FzY2VuZGVyIC0gb3MyLnR5cG9EZXNjZW5kZXIpO1xuICAgICAgICB2YXIgdG9wQmVhcmluZyA9IG9zMi50eXBvQXNjZW5kZXIgLSBjYm94Lm1heFk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaGhlYSA9IHRoaXMuX2ZvbnQuaGhlYTtcbiAgICAgICAgdmFyIGFkdmFuY2VIZWlnaHQgPSBNYXRoLmFicyhoaGVhLmFzY2VudCAtIGhoZWEuZGVzY2VudCk7XG4gICAgICAgIHZhciB0b3BCZWFyaW5nID0gaGhlYS5hc2NlbnQgLSBjYm94Lm1heFk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZvbnQuX3ZhcmlhdGlvblByb2Nlc3NvciAmJiB0aGlzLl9mb250LkhWQVIpIHtcbiAgICAgIGFkdmFuY2VXaWR0aCArPSB0aGlzLl9mb250Ll92YXJpYXRpb25Qcm9jZXNzb3IuZ2V0QWR2YW5jZUFkanVzdG1lbnQodGhpcy5pZCwgdGhpcy5fZm9udC5IVkFSKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fbWV0cmljcyA9IHtcbiAgICAgIGFkdmFuY2VXaWR0aDogYWR2YW5jZVdpZHRoLFxuICAgICAgYWR2YW5jZUhlaWdodDogYWR2YW5jZUhlaWdodCxcbiAgICAgIGxlZnRCZWFyaW5nOiBsZWZ0QmVhcmluZyxcbiAgICAgIHRvcEJlYXJpbmc6IHRvcEJlYXJpbmdcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZ2x5cGjigJlzIGNvbnRyb2wgYm94LlxuICAgKiBUaGlzIGlzIG9mdGVuIHRoZSBzYW1lIGFzIHRoZSBib3VuZGluZyBib3gsIGJ1dCBpcyBmYXN0ZXIgdG8gY29tcHV0ZS5cbiAgICogQmVjYXVzZSBvZiB0aGUgd2F5IGJlemllciBjdXJ2ZXMgYXJlIGRlZmluZWQsIHNvbWUgb2YgdGhlIGNvbnRyb2wgcG9pbnRzXG4gICAqIGNhbiBiZSBvdXRzaWRlIG9mIHRoZSBib3VuZGluZyBib3guIFdoZXJlIGBiYm94YCB0YWtlcyB0aGlzIGludG8gYWNjb3VudCxcbiAgICogYGNib3hgIGRvZXMgbm90LiBUaHVzLCBjYm94IGlzIGxlc3MgYWNjdXJhdGUsIGJ1dCBmYXN0ZXIgdG8gY29tcHV0ZS5cbiAgICogU2VlIFtoZXJlXShodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy9mcmVldHlwZTIvZG9jcy9nbHlwaHMvZ2x5cGhzLTYuaHRtbCNzZWN0aW9uLTIpXG4gICAqIGZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtCQm94fVxuICAgKi9cbiAgO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcGF0aCBzY2FsZWQgdG8gdGhlIGdpdmVuIGZvbnQgc2l6ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAgICogQHJldHVybiB7UGF0aH1cbiAgICovXG4gIF9wcm90by5nZXRTY2FsZWRQYXRoID0gZnVuY3Rpb24gZ2V0U2NhbGVkUGF0aChzaXplKSB7XG4gICAgdmFyIHNjYWxlID0gMSAvIHRoaXMuX2ZvbnQudW5pdHNQZXJFbSAqIHNpemU7XG4gICAgcmV0dXJuIHRoaXMucGF0aC5zY2FsZShzY2FsZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBnbHlwaCdzIGFkdmFuY2Ugd2lkdGguXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLl9nZXROYW1lID0gZnVuY3Rpb24gX2dldE5hbWUoKSB7XG4gICAgdmFyIHBvc3QgPSB0aGlzLl9mb250LnBvc3Q7XG5cbiAgICBpZiAoIXBvc3QpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAocG9zdC52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBTdGFuZGFyZE5hbWVzW3RoaXMuaWRdO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIHZhciBpZCA9IHBvc3QuZ2x5cGhOYW1lSW5kZXhbdGhpcy5pZF07XG5cbiAgICAgICAgaWYgKGlkIDwgU3RhbmRhcmROYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gU3RhbmRhcmROYW1lc1tpZF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9zdC5uYW1lc1tpZCAtIFN0YW5kYXJkTmFtZXMubGVuZ3RoXTtcblxuICAgICAgY2FzZSAyLjU6XG4gICAgICAgIHJldHVybiBTdGFuZGFyZE5hbWVzW3RoaXMuaWQgKyBwb3N0Lm9mZnNldHNbdGhpcy5pZF1dO1xuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBvc3QubWFwW3RoaXMuaWRdKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBnbHlwaCdzIG5hbWVcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIDtcblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgZ2x5cGggdG8gdGhlIGdpdmVuIGdyYXBoaWNzIGNvbnRleHQsIGF0IHRoZSBzcGVjaWZpZWQgZm9udCBzaXplLlxuICAgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyZH0gY3R4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gICAqL1xuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKGN0eCwgc2l6ZSkge1xuICAgIGN0eC5zYXZlKCk7XG4gICAgdmFyIHNjYWxlID0gMSAvIHRoaXMuX2ZvbnQuaGVhZC51bml0c1BlckVtICogc2l6ZTtcbiAgICBjdHguc2NhbGUoc2NhbGUsIHNjYWxlKTtcbiAgICB2YXIgZm4gPSB0aGlzLnBhdGgudG9GdW5jdGlvbigpO1xuICAgIGZuKGN0eCk7XG4gICAgY3R4LmZpbGwoKTtcbiAgICBjdHgucmVzdG9yZSgpO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyQ2KEdseXBoLCBbe1xuICAgIGtleTogXCJjYm94XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Q0JveCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZ2x5cGjigJlzIGJvdW5kaW5nIGJveCwgaS5lLiB0aGUgcmVjdGFuZ2xlIHRoYXQgZW5jbG9zZXMgdGhlXG4gICAgICogZ2x5cGggb3V0bGluZSBhcyB0aWdodGx5IGFzIHBvc3NpYmxlLlxuICAgICAqIEB0eXBlIHtCQm94fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYmJveFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEJCb3goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSB2ZWN0b3IgUGF0aCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnbHlwaCBvdXRsaW5lLlxuICAgICAqIEB0eXBlIHtQYXRofVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicGF0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgLy8gQ2FjaGUgdGhlIHBhdGggc28gd2Ugb25seSBkZWNvZGUgaXQgb25jZVxuICAgICAgLy8gRGVjb2RpbmcgaXMgYWN0dWFsbHkgcGVyZm9ybWVkIGJ5IHN1YmNsYXNzZXNcbiAgICAgIHJldHVybiB0aGlzLl9nZXRQYXRoKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkdmFuY2VXaWR0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldE1ldHJpY3MoKS5hZHZhbmNlV2lkdGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBnbHlwaCdzIGFkdmFuY2UgaGVpZ2h0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZHZhbmNlSGVpZ2h0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0cmljcygpLmFkdmFuY2VIZWlnaHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxpZ2F0dXJlQ2FyZXRQb3NpdGlvbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHt9XG4gIH0sIHtcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldE5hbWUoKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gR2x5cGg7XG59KCksIChfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDMoX2NsYXNzJDMucHJvdG90eXBlLCBcImNib3hcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkMy5wcm90b3R5cGUsIFwiY2JveFwiKSwgX2NsYXNzJDMucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQzKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJiYm94XCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDMucHJvdG90eXBlLCBcImJib3hcIiksIF9jbGFzcyQzLnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkMyhfY2xhc3MkMy5wcm90b3R5cGUsIFwicGF0aFwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJwYXRoXCIpLCBfY2xhc3MkMy5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDMoX2NsYXNzJDMucHJvdG90eXBlLCBcImFkdmFuY2VXaWR0aFwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJhZHZhbmNlV2lkdGhcIiksIF9jbGFzcyQzLnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkMyhfY2xhc3MkMy5wcm90b3R5cGUsIFwiYWR2YW5jZUhlaWdodFwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJhZHZhbmNlSGVpZ2h0XCIpLCBfY2xhc3MkMy5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDMoX2NsYXNzJDMucHJvdG90eXBlLCBcIm5hbWVcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkMy5wcm90b3R5cGUsIFwibmFtZVwiKSwgX2NsYXNzJDMucHJvdG90eXBlKSksIF9jbGFzcyQzKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRtKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRtKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRtKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkbShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JG0obywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRtKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSQ5KHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgR2x5ZkhlYWRlciA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBudW1iZXJPZkNvbnRvdXJzOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gaWYgbmVnYXRpdmUsIHRoaXMgaXMgYSBjb21wb3NpdGUgZ2x5cGhcbiAgeE1pbjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHlNaW46IHJlc3RydWN0dXJlLmludDE2LFxuICB4TWF4OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgeU1heDogcmVzdHJ1Y3R1cmUuaW50MTZcbn0pOyAvLyBGbGFncyBmb3Igc2ltcGxlIGdseXBoc1xuXG52YXIgT05fQ1VSVkUgPSAxIDw8IDA7XG52YXIgWF9TSE9SVF9WRUNUT1IgPSAxIDw8IDE7XG52YXIgWV9TSE9SVF9WRUNUT1IgPSAxIDw8IDI7XG52YXIgUkVQRUFUID0gMSA8PCAzO1xudmFyIFNBTUVfWCA9IDEgPDwgNDtcbnZhciBTQU1FX1kgPSAxIDw8IDU7IC8vIEZsYWdzIGZvciBjb21wb3NpdGUgZ2x5cGhzXG5cbnZhciBBUkdfMV9BTkRfMl9BUkVfV09SRFMgPSAxIDw8IDA7XG52YXIgV0VfSEFWRV9BX1NDQUxFID0gMSA8PCAzO1xudmFyIE1PUkVfQ09NUE9ORU5UUyA9IDEgPDwgNTtcbnZhciBXRV9IQVZFX0FOX1hfQU5EX1lfU0NBTEUgPSAxIDw8IDY7XG52YXIgV0VfSEFWRV9BX1RXT19CWV9UV08gPSAxIDw8IDc7XG52YXIgV0VfSEFWRV9JTlNUUlVDVElPTlMgPSAxIDw8IDg7XG5cbnZhciBQb2ludCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvaW50KG9uQ3VydmUsIGVuZENvbnRvdXIsIHgsIHkpIHtcbiAgICBpZiAoeCA9PT0gdm9pZCAwKSB7XG4gICAgICB4ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoeSA9PT0gdm9pZCAwKSB7XG4gICAgICB5ID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ3VydmUgPSBvbkN1cnZlO1xuICAgIHRoaXMuZW5kQ29udG91ciA9IGVuZENvbnRvdXI7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFBvaW50LnByb3RvdHlwZTtcblxuICBfcHJvdG8uY29weSA9IGZ1bmN0aW9uIGNvcHkoKSB7XG4gICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLm9uQ3VydmUsIHRoaXMuZW5kQ29udG91ciwgdGhpcy54LCB0aGlzLnkpO1xuICB9O1xuXG4gIHJldHVybiBQb2ludDtcbn0oKTsgLy8gUmVwcmVzZW50cyBhIGNvbXBvbmVudCBpbiBhIGNvbXBvc2l0ZSBnbHlwaFxuXG52YXIgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ29tcG9uZW50KGdseXBoSUQsIGR4LCBkeSkge1xuICB0aGlzLmdseXBoSUQgPSBnbHlwaElEO1xuICB0aGlzLmR4ID0gZHg7XG4gIHRoaXMuZHkgPSBkeTtcbiAgdGhpcy5wb3MgPSAwO1xuICB0aGlzLnNjYWxlWCA9IHRoaXMuc2NhbGVZID0gMTtcbiAgdGhpcy5zY2FsZTAxID0gdGhpcy5zY2FsZTEwID0gMDtcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgYSBUcnVlVHlwZSBnbHlwaC5cbiAqL1xuXG5cbnZhciBUVEZHbHlwaCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0dseXBoKSB7XG4gIF9pbmhlcml0c0xvb3NlJDkoVFRGR2x5cGgsIF9HbHlwaCk7XG5cbiAgZnVuY3Rpb24gVFRGR2x5cGgoKSB7XG4gICAgcmV0dXJuIF9HbHlwaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvMiA9IFRURkdseXBoLnByb3RvdHlwZTtcblxuICAvLyBQYXJzZXMganVzdCB0aGUgZ2x5cGggaGVhZGVyIGFuZCByZXR1cm5zIHRoZSBib3VuZGluZyBib3hcbiAgX3Byb3RvMi5fZ2V0Q0JveCA9IGZ1bmN0aW9uIF9nZXRDQm94KGludGVybmFsKSB7XG4gICAgLy8gV2UgbmVlZCB0byBkZWNvZGUgdGhlIGdseXBoIGlmIHZhcmlhdGlvbiBwcm9jZXNzaW5nIGlzIHJlcXVlc3RlZCxcbiAgICAvLyBzbyBpdCdzIGVhc2llciBqdXN0IHRvIHJlY29tcHV0ZSB0aGUgcGF0aCdzIGNib3ggYWZ0ZXIgZGVjb2RpbmcuXG4gICAgaWYgKHRoaXMuX2ZvbnQuX3ZhcmlhdGlvblByb2Nlc3NvciAmJiAhaW50ZXJuYWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhdGguY2JveDtcbiAgICB9XG5cbiAgICB2YXIgc3RyZWFtID0gdGhpcy5fZm9udC5fZ2V0VGFibGVTdHJlYW0oJ2dseWYnKTtcblxuICAgIHN0cmVhbS5wb3MgKz0gdGhpcy5fZm9udC5sb2NhLm9mZnNldHNbdGhpcy5pZF07XG4gICAgdmFyIGdseXBoID0gR2x5ZkhlYWRlci5kZWNvZGUoc3RyZWFtKTtcbiAgICB2YXIgY2JveCA9IG5ldyBCQm94KGdseXBoLnhNaW4sIGdseXBoLnlNaW4sIGdseXBoLnhNYXgsIGdseXBoLnlNYXgpO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGNib3gpO1xuICB9IC8vIFBhcnNlcyBhIHNpbmdsZSBnbHlwaCBjb29yZGluYXRlXG4gIDtcblxuICBfcHJvdG8yLl9wYXJzZUdseXBoQ29vcmQgPSBmdW5jdGlvbiBfcGFyc2VHbHlwaENvb3JkKHN0cmVhbSwgcHJldiwgX3Nob3J0LCBzYW1lKSB7XG4gICAgaWYgKF9zaG9ydCkge1xuICAgICAgdmFyIHZhbCA9IHN0cmVhbS5yZWFkVUludDgoKTtcblxuICAgICAgaWYgKCFzYW1lKSB7XG4gICAgICAgIHZhbCA9IC12YWw7XG4gICAgICB9XG5cbiAgICAgIHZhbCArPSBwcmV2O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2FtZSkge1xuICAgICAgICB2YXIgdmFsID0gcHJldjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB2YWwgPSBwcmV2ICsgc3RyZWFtLnJlYWRJbnQxNkJFKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfSAvLyBEZWNvZGVzIHRoZSBnbHlwaCBkYXRhIGludG8gcG9pbnRzIGZvciBzaW1wbGUgZ2x5cGhzLFxuICAvLyBvciBjb21wb25lbnRzIGZvciBjb21wb3NpdGUgZ2x5cGhzXG4gIDtcblxuICBfcHJvdG8yLl9kZWNvZGUgPSBmdW5jdGlvbiBfZGVjb2RlKCkge1xuICAgIHZhciBnbHlmUG9zID0gdGhpcy5fZm9udC5sb2NhLm9mZnNldHNbdGhpcy5pZF07XG4gICAgdmFyIG5leHRQb3MgPSB0aGlzLl9mb250LmxvY2Eub2Zmc2V0c1t0aGlzLmlkICsgMV07IC8vIE5vdGhpbmcgdG8gZG8gaWYgdGhlcmUgaXMgbm8gZGF0YSBmb3IgdGhpcyBnbHlwaFxuXG4gICAgaWYgKGdseWZQb3MgPT09IG5leHRQb3MpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBzdHJlYW0gPSB0aGlzLl9mb250Ll9nZXRUYWJsZVN0cmVhbSgnZ2x5ZicpO1xuXG4gICAgc3RyZWFtLnBvcyArPSBnbHlmUG9zO1xuICAgIHZhciBzdGFydFBvcyA9IHN0cmVhbS5wb3M7XG4gICAgdmFyIGdseXBoID0gR2x5ZkhlYWRlci5kZWNvZGUoc3RyZWFtKTtcblxuICAgIGlmIChnbHlwaC5udW1iZXJPZkNvbnRvdXJzID4gMCkge1xuICAgICAgdGhpcy5fZGVjb2RlU2ltcGxlKGdseXBoLCBzdHJlYW0pO1xuICAgIH0gZWxzZSBpZiAoZ2x5cGgubnVtYmVyT2ZDb250b3VycyA8IDApIHtcbiAgICAgIHRoaXMuX2RlY29kZUNvbXBvc2l0ZShnbHlwaCwgc3RyZWFtLCBzdGFydFBvcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdseXBoO1xuICB9O1xuXG4gIF9wcm90bzIuX2RlY29kZVNpbXBsZSA9IGZ1bmN0aW9uIF9kZWNvZGVTaW1wbGUoZ2x5cGgsIHN0cmVhbSkge1xuICAgIC8vIHRoaXMgaXMgYSBzaW1wbGUgZ2x5cGhcbiAgICBnbHlwaC5wb2ludHMgPSBbXTtcbiAgICB2YXIgZW5kUHRzT2ZDb250b3VycyA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIGdseXBoLm51bWJlck9mQ29udG91cnMpLmRlY29kZShzdHJlYW0pO1xuICAgIGdseXBoLmluc3RydWN0aW9ucyA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgcmVzdHJ1Y3R1cmUudWludDE2KS5kZWNvZGUoc3RyZWFtKTtcbiAgICB2YXIgZmxhZ3MgPSBbXTtcbiAgICB2YXIgbnVtQ29vcmRzID0gZW5kUHRzT2ZDb250b3Vyc1tlbmRQdHNPZkNvbnRvdXJzLmxlbmd0aCAtIDFdICsgMTtcblxuICAgIHdoaWxlIChmbGFncy5sZW5ndGggPCBudW1Db29yZHMpIHtcbiAgICAgIHZhciBmbGFnID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuICAgICAgZmxhZ3MucHVzaChmbGFnKTsgLy8gY2hlY2sgZm9yIHJlcGVhdCBmbGFnXG5cbiAgICAgIGlmIChmbGFnICYgUkVQRUFUKSB7XG4gICAgICAgIHZhciBjb3VudCA9IHN0cmVhbS5yZWFkVUludDgoKTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvdW50OyBqKyspIHtcbiAgICAgICAgICBmbGFncy5wdXNoKGZsYWcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZsYWcgPSBmbGFnc1tpXTtcbiAgICAgIHZhciBwb2ludCA9IG5ldyBQb2ludCghIShmbGFnICYgT05fQ1VSVkUpLCBlbmRQdHNPZkNvbnRvdXJzLmluZGV4T2YoaSkgPj0gMCwgMCwgMCk7XG4gICAgICBnbHlwaC5wb2ludHMucHVzaChwb2ludCk7XG4gICAgfVxuXG4gICAgdmFyIHB4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmbGFnID0gZmxhZ3NbaV07XG4gICAgICBnbHlwaC5wb2ludHNbaV0ueCA9IHB4ID0gdGhpcy5fcGFyc2VHbHlwaENvb3JkKHN0cmVhbSwgcHgsIGZsYWcgJiBYX1NIT1JUX1ZFQ1RPUiwgZmxhZyAmIFNBTUVfWCk7XG4gICAgfVxuXG4gICAgdmFyIHB5ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBmbGFnID0gZmxhZ3NbaV07XG4gICAgICBnbHlwaC5wb2ludHNbaV0ueSA9IHB5ID0gdGhpcy5fcGFyc2VHbHlwaENvb3JkKHN0cmVhbSwgcHksIGZsYWcgJiBZX1NIT1JUX1ZFQ1RPUiwgZmxhZyAmIFNBTUVfWSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZvbnQuX3ZhcmlhdGlvblByb2Nlc3Nvcikge1xuICAgICAgdmFyIHBvaW50cyA9IGdseXBoLnBvaW50cy5zbGljZSgpO1xuICAgICAgcG9pbnRzLnB1c2guYXBwbHkocG9pbnRzLCB0aGlzLl9nZXRQaGFudG9tUG9pbnRzKGdseXBoKSk7XG5cbiAgICAgIHRoaXMuX2ZvbnQuX3ZhcmlhdGlvblByb2Nlc3Nvci50cmFuc2Zvcm1Qb2ludHModGhpcy5pZCwgcG9pbnRzKTtcblxuICAgICAgZ2x5cGgucGhhbnRvbVBvaW50cyA9IHBvaW50cy5zbGljZSgtNCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9O1xuXG4gIF9wcm90bzIuX2RlY29kZUNvbXBvc2l0ZSA9IGZ1bmN0aW9uIF9kZWNvZGVDb21wb3NpdGUoZ2x5cGgsIHN0cmVhbSwgb2Zmc2V0KSB7XG4gICAgaWYgKG9mZnNldCA9PT0gdm9pZCAwKSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgYSBjb21wb3NpdGUgZ2x5cGhcbiAgICBnbHlwaC5jb21wb25lbnRzID0gW107XG4gICAgdmFyIGhhdmVJbnN0cnVjdGlvbnMgPSBmYWxzZTtcbiAgICB2YXIgZmxhZ3MgPSBNT1JFX0NPTVBPTkVOVFM7XG5cbiAgICB3aGlsZSAoZmxhZ3MgJiBNT1JFX0NPTVBPTkVOVFMpIHtcbiAgICAgIGZsYWdzID0gc3RyZWFtLnJlYWRVSW50MTZCRSgpO1xuICAgICAgdmFyIGdQb3MgPSBzdHJlYW0ucG9zIC0gb2Zmc2V0O1xuICAgICAgdmFyIGdseXBoSUQgPSBzdHJlYW0ucmVhZFVJbnQxNkJFKCk7XG5cbiAgICAgIGlmICghaGF2ZUluc3RydWN0aW9ucykge1xuICAgICAgICBoYXZlSW5zdHJ1Y3Rpb25zID0gKGZsYWdzICYgV0VfSEFWRV9JTlNUUlVDVElPTlMpICE9PSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmxhZ3MgJiBBUkdfMV9BTkRfMl9BUkVfV09SRFMpIHtcbiAgICAgICAgdmFyIGR4ID0gc3RyZWFtLnJlYWRJbnQxNkJFKCk7XG4gICAgICAgIHZhciBkeSA9IHN0cmVhbS5yZWFkSW50MTZCRSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGR4ID0gc3RyZWFtLnJlYWRJbnQ4KCk7XG4gICAgICAgIHZhciBkeSA9IHN0cmVhbS5yZWFkSW50OCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudChnbHlwaElELCBkeCwgZHkpO1xuICAgICAgY29tcG9uZW50LnBvcyA9IGdQb3M7XG5cbiAgICAgIGlmIChmbGFncyAmIFdFX0hBVkVfQV9TQ0FMRSkge1xuICAgICAgICAvLyBmaXhlZCBudW1iZXIgd2l0aCAxNCBiaXRzIG9mIGZyYWN0aW9uXG4gICAgICAgIGNvbXBvbmVudC5zY2FsZVggPSBjb21wb25lbnQuc2NhbGVZID0gKHN0cmVhbS5yZWFkVUludDgoKSA8PCAyNCB8IHN0cmVhbS5yZWFkVUludDgoKSA8PCAxNikgLyAxMDczNzQxODI0O1xuICAgICAgfSBlbHNlIGlmIChmbGFncyAmIFdFX0hBVkVfQU5fWF9BTkRfWV9TQ0FMRSkge1xuICAgICAgICBjb21wb25lbnQuc2NhbGVYID0gKHN0cmVhbS5yZWFkVUludDgoKSA8PCAyNCB8IHN0cmVhbS5yZWFkVUludDgoKSA8PCAxNikgLyAxMDczNzQxODI0O1xuICAgICAgICBjb21wb25lbnQuc2NhbGVZID0gKHN0cmVhbS5yZWFkVUludDgoKSA8PCAyNCB8IHN0cmVhbS5yZWFkVUludDgoKSA8PCAxNikgLyAxMDczNzQxODI0O1xuICAgICAgfSBlbHNlIGlmIChmbGFncyAmIFdFX0hBVkVfQV9UV09fQllfVFdPKSB7XG4gICAgICAgIGNvbXBvbmVudC5zY2FsZVggPSAoc3RyZWFtLnJlYWRVSW50OCgpIDw8IDI0IHwgc3RyZWFtLnJlYWRVSW50OCgpIDw8IDE2KSAvIDEwNzM3NDE4MjQ7XG4gICAgICAgIGNvbXBvbmVudC5zY2FsZTAxID0gKHN0cmVhbS5yZWFkVUludDgoKSA8PCAyNCB8IHN0cmVhbS5yZWFkVUludDgoKSA8PCAxNikgLyAxMDczNzQxODI0O1xuICAgICAgICBjb21wb25lbnQuc2NhbGUxMCA9IChzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMjQgfCBzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMTYpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgY29tcG9uZW50LnNjYWxlWSA9IChzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMjQgfCBzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMTYpIC8gMTA3Mzc0MTgyNDtcbiAgICAgIH1cblxuICAgICAgZ2x5cGguY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZvbnQuX3ZhcmlhdGlvblByb2Nlc3Nvcikge1xuICAgICAgdmFyIHBvaW50cyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdseXBoLmNvbXBvbmVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IGdseXBoLmNvbXBvbmVudHNbal07XG4gICAgICAgIHBvaW50cy5wdXNoKG5ldyBQb2ludCh0cnVlLCB0cnVlLCBjb21wb25lbnQuZHgsIGNvbXBvbmVudC5keSkpO1xuICAgICAgfVxuXG4gICAgICBwb2ludHMucHVzaC5hcHBseShwb2ludHMsIHRoaXMuX2dldFBoYW50b21Qb2ludHMoZ2x5cGgpKTtcblxuICAgICAgdGhpcy5fZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yLnRyYW5zZm9ybVBvaW50cyh0aGlzLmlkLCBwb2ludHMpO1xuXG4gICAgICBnbHlwaC5waGFudG9tUG9pbnRzID0gcG9pbnRzLnNwbGljZSgtNCwgNCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgZ2x5cGguY29tcG9uZW50c1tpXS5keCA9IHBvaW50Lng7XG4gICAgICAgIGdseXBoLmNvbXBvbmVudHNbaV0uZHkgPSBwb2ludC55O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoYXZlSW5zdHJ1Y3Rpb25zO1xuICB9O1xuXG4gIF9wcm90bzIuX2dldFBoYW50b21Qb2ludHMgPSBmdW5jdGlvbiBfZ2V0UGhhbnRvbVBvaW50cyhnbHlwaCkge1xuICAgIHZhciBjYm94ID0gdGhpcy5fZ2V0Q0JveCh0cnVlKTtcblxuICAgIGlmICh0aGlzLl9tZXRyaWNzID09IG51bGwpIHtcbiAgICAgIHRoaXMuX21ldHJpY3MgPSBHbHlwaC5wcm90b3R5cGUuX2dldE1ldHJpY3MuY2FsbCh0aGlzLCBjYm94KTtcbiAgICB9XG5cbiAgICB2YXIgX3RoaXMkX21ldHJpY3MgPSB0aGlzLl9tZXRyaWNzLFxuICAgICAgICBhZHZhbmNlV2lkdGggPSBfdGhpcyRfbWV0cmljcy5hZHZhbmNlV2lkdGgsXG4gICAgICAgIGFkdmFuY2VIZWlnaHQgPSBfdGhpcyRfbWV0cmljcy5hZHZhbmNlSGVpZ2h0LFxuICAgICAgICBsZWZ0QmVhcmluZyA9IF90aGlzJF9tZXRyaWNzLmxlZnRCZWFyaW5nLFxuICAgICAgICB0b3BCZWFyaW5nID0gX3RoaXMkX21ldHJpY3MudG9wQmVhcmluZztcbiAgICByZXR1cm4gW25ldyBQb2ludChmYWxzZSwgdHJ1ZSwgZ2x5cGgueE1pbiAtIGxlZnRCZWFyaW5nLCAwKSwgbmV3IFBvaW50KGZhbHNlLCB0cnVlLCBnbHlwaC54TWluIC0gbGVmdEJlYXJpbmcgKyBhZHZhbmNlV2lkdGgsIDApLCBuZXcgUG9pbnQoZmFsc2UsIHRydWUsIDAsIGdseXBoLnlNYXggKyB0b3BCZWFyaW5nKSwgbmV3IFBvaW50KGZhbHNlLCB0cnVlLCAwLCBnbHlwaC55TWF4ICsgdG9wQmVhcmluZyArIGFkdmFuY2VIZWlnaHQpXTtcbiAgfSAvLyBEZWNvZGVzIGZvbnQgZGF0YSwgcmVzb2x2ZXMgY29tcG9zaXRlIGdseXBocywgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgY29udG91cnNcbiAgO1xuXG4gIF9wcm90bzIuX2dldENvbnRvdXJzID0gZnVuY3Rpb24gX2dldENvbnRvdXJzKCkge1xuICAgIHZhciBnbHlwaCA9IHRoaXMuX2RlY29kZSgpO1xuXG4gICAgaWYgKCFnbHlwaCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHZhciBwb2ludHMgPSBbXTtcblxuICAgIGlmIChnbHlwaC5udW1iZXJPZkNvbnRvdXJzIDwgMCkge1xuICAgICAgLy8gcmVzb2x2ZSBjb21wb3NpdGUgZ2x5cGhzXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJG0oZ2x5cGguY29tcG9uZW50cyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICB2YXIgX2NvbnRvdXJzID0gdGhpcy5fZm9udC5nZXRHbHlwaChjb21wb25lbnQuZ2x5cGhJRCkuX2dldENvbnRvdXJzKCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfY29udG91cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgY29udG91ciA9IF9jb250b3Vyc1tpXTtcblxuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29udG91ci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIF9wb2ludCA9IGNvbnRvdXJbal07XG4gICAgICAgICAgICB2YXIgeCA9IF9wb2ludC54ICogY29tcG9uZW50LnNjYWxlWCArIF9wb2ludC55ICogY29tcG9uZW50LnNjYWxlMDEgKyBjb21wb25lbnQuZHg7XG4gICAgICAgICAgICB2YXIgeSA9IF9wb2ludC55ICogY29tcG9uZW50LnNjYWxlWSArIF9wb2ludC54ICogY29tcG9uZW50LnNjYWxlMTAgKyBjb21wb25lbnQuZHk7XG4gICAgICAgICAgICBwb2ludHMucHVzaChuZXcgUG9pbnQoX3BvaW50Lm9uQ3VydmUsIF9wb2ludC5lbmRDb250b3VyLCB4LCB5KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvaW50cyA9IGdseXBoLnBvaW50cyB8fCBbXTtcbiAgICB9IC8vIFJlY29tcHV0ZSBhbmQgY2FjaGUgbWV0cmljcyBpZiB3ZSBwZXJmb3JtZWQgdmFyaWF0aW9uIHByb2Nlc3NpbmcsIGFuZCBkb24ndCBoYXZlIGFuIEhWQVIgdGFibGVcblxuXG4gICAgaWYgKGdseXBoLnBoYW50b21Qb2ludHMgJiYgIXRoaXMuX2ZvbnQuZGlyZWN0b3J5LnRhYmxlcy5IVkFSKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzLmFkdmFuY2VXaWR0aCA9IGdseXBoLnBoYW50b21Qb2ludHNbMV0ueCAtIGdseXBoLnBoYW50b21Qb2ludHNbMF0ueDtcbiAgICAgIHRoaXMuX21ldHJpY3MuYWR2YW5jZUhlaWdodCA9IGdseXBoLnBoYW50b21Qb2ludHNbM10ueSAtIGdseXBoLnBoYW50b21Qb2ludHNbMl0ueTtcbiAgICAgIHRoaXMuX21ldHJpY3MubGVmdEJlYXJpbmcgPSBnbHlwaC54TWluIC0gZ2x5cGgucGhhbnRvbVBvaW50c1swXS54O1xuICAgICAgdGhpcy5fbWV0cmljcy50b3BCZWFyaW5nID0gZ2x5cGgucGhhbnRvbVBvaW50c1syXS55IC0gZ2x5cGgueU1heDtcbiAgICB9XG5cbiAgICB2YXIgY29udG91cnMgPSBbXTtcbiAgICB2YXIgY3VyID0gW107XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IHBvaW50cy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIHBvaW50ID0gcG9pbnRzW2tdO1xuICAgICAgY3VyLnB1c2gocG9pbnQpO1xuXG4gICAgICBpZiAocG9pbnQuZW5kQ29udG91cikge1xuICAgICAgICBjb250b3Vycy5wdXNoKGN1cik7XG4gICAgICAgIGN1ciA9IFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250b3VycztcbiAgfTtcblxuICBfcHJvdG8yLl9nZXRNZXRyaWNzID0gZnVuY3Rpb24gX2dldE1ldHJpY3MoKSB7XG4gICAgaWYgKHRoaXMuX21ldHJpY3MpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tZXRyaWNzO1xuICAgIH1cblxuICAgIHZhciBjYm94ID0gdGhpcy5fZ2V0Q0JveCh0cnVlKTtcblxuICAgIF9HbHlwaC5wcm90b3R5cGUuX2dldE1ldHJpY3MuY2FsbCh0aGlzLCBjYm94KTtcblxuICAgIGlmICh0aGlzLl9mb250Ll92YXJpYXRpb25Qcm9jZXNzb3IgJiYgIXRoaXMuX2ZvbnQuSFZBUikge1xuICAgICAgLy8gTm8gSFZBUiB0YWJsZSwgZGVjb2RlIHRoZSBnbHlwaC4gVGhpcyB0cmlnZ2VycyByZWNvbXB1dGF0aW9uIG9mIG1ldHJpY3MuXG4gICAgICB0aGlzLnBhdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX21ldHJpY3M7XG4gIH0gLy8gQ29udmVydHMgY29udG91cnMgdG8gYSBQYXRoIG9iamVjdCB0aGF0IGNhbiBiZSByZW5kZXJlZFxuICA7XG5cbiAgX3Byb3RvMi5fZ2V0UGF0aCA9IGZ1bmN0aW9uIF9nZXRQYXRoKCkge1xuICAgIHZhciBjb250b3VycyA9IHRoaXMuX2dldENvbnRvdXJzKCk7XG5cbiAgICB2YXIgcGF0aCA9IG5ldyBQYXRoKCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRvdXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY29udG91ciA9IGNvbnRvdXJzW2ldO1xuICAgICAgdmFyIGZpcnN0UHQgPSBjb250b3VyWzBdO1xuICAgICAgdmFyIGxhc3RQdCA9IGNvbnRvdXJbY29udG91ci5sZW5ndGggLSAxXTtcbiAgICAgIHZhciBzdGFydCA9IDA7XG5cbiAgICAgIGlmIChmaXJzdFB0Lm9uQ3VydmUpIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IHBvaW50IHdpbGwgYmUgY29uc3VtZWQgYnkgdGhlIG1vdmVUbyBjb21tYW5kLCBzbyBza2lwIGluIHRoZSBsb29wXG4gICAgICAgIHZhciBjdXJ2ZVB0ID0gbnVsbDtcbiAgICAgICAgc3RhcnQgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxhc3RQdC5vbkN1cnZlKSB7XG4gICAgICAgICAgLy8gU3RhcnQgYXQgdGhlIGxhc3QgcG9pbnQgaWYgdGhlIGZpcnN0IHBvaW50IGlzIG9mZiBjdXJ2ZSBhbmQgdGhlIGxhc3QgcG9pbnQgaXMgb24gY3VydmVcbiAgICAgICAgICBmaXJzdFB0ID0gbGFzdFB0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN0YXJ0IGF0IHRoZSBtaWRkbGUgaWYgYm90aCB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSBvZmYgY3VydmVcbiAgICAgICAgICBmaXJzdFB0ID0gbmV3IFBvaW50KGZhbHNlLCBmYWxzZSwgKGZpcnN0UHQueCArIGxhc3RQdC54KSAvIDIsIChmaXJzdFB0LnkgKyBsYXN0UHQueSkgLyAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdXJ2ZVB0ID0gZmlyc3RQdDtcbiAgICAgIH1cblxuICAgICAgcGF0aC5tb3ZlVG8oZmlyc3RQdC54LCBmaXJzdFB0LnkpO1xuXG4gICAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPCBjb250b3VyLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBwdCA9IGNvbnRvdXJbal07XG4gICAgICAgIHZhciBwcmV2UHQgPSBqID09PSAwID8gZmlyc3RQdCA6IGNvbnRvdXJbaiAtIDFdO1xuXG4gICAgICAgIGlmIChwcmV2UHQub25DdXJ2ZSAmJiBwdC5vbkN1cnZlKSB7XG4gICAgICAgICAgcGF0aC5saW5lVG8ocHQueCwgcHQueSk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldlB0Lm9uQ3VydmUgJiYgIXB0Lm9uQ3VydmUpIHtcbiAgICAgICAgICB2YXIgY3VydmVQdCA9IHB0O1xuICAgICAgICB9IGVsc2UgaWYgKCFwcmV2UHQub25DdXJ2ZSAmJiAhcHQub25DdXJ2ZSkge1xuICAgICAgICAgIHZhciBtaWRYID0gKHByZXZQdC54ICsgcHQueCkgLyAyO1xuICAgICAgICAgIHZhciBtaWRZID0gKHByZXZQdC55ICsgcHQueSkgLyAyO1xuICAgICAgICAgIHBhdGgucXVhZHJhdGljQ3VydmVUbyhwcmV2UHQueCwgcHJldlB0LnksIG1pZFgsIG1pZFkpO1xuICAgICAgICAgIHZhciBjdXJ2ZVB0ID0gcHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXByZXZQdC5vbkN1cnZlICYmIHB0Lm9uQ3VydmUpIHtcbiAgICAgICAgICBwYXRoLnF1YWRyYXRpY0N1cnZlVG8oY3VydmVQdC54LCBjdXJ2ZVB0LnksIHB0LngsIHB0LnkpO1xuICAgICAgICAgIHZhciBjdXJ2ZVB0ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIFRURiBwYXRoIHN0YXRlXCIpO1xuICAgICAgICB9XG4gICAgICB9IC8vIENvbm5lY3QgdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50c1xuXG5cbiAgICAgIGlmIChjdXJ2ZVB0KSB7XG4gICAgICAgIHBhdGgucXVhZHJhdGljQ3VydmVUbyhjdXJ2ZVB0LngsIGN1cnZlUHQueSwgZmlyc3RQdC54LCBmaXJzdFB0LnkpO1xuICAgICAgfVxuXG4gICAgICBwYXRoLmNsb3NlUGF0aCgpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9O1xuXG4gIHJldHVybiBUVEZHbHlwaDtcbn0oR2x5cGgpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSRhKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIE9wZW5UeXBlIFBvc3RTY3JpcHQgZ2x5cGgsIGluIHRoZSBDb21wYWN0IEZvbnQgRm9ybWF0LlxuICovXG5cbnZhciBDRkZHbHlwaCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0dseXBoKSB7XG4gIF9pbmhlcml0c0xvb3NlJGEoQ0ZGR2x5cGgsIF9HbHlwaCk7XG5cbiAgZnVuY3Rpb24gQ0ZGR2x5cGgoKSB7XG4gICAgcmV0dXJuIF9HbHlwaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQ0ZGR2x5cGgucHJvdG90eXBlO1xuXG4gIF9wcm90by5fZ2V0TmFtZSA9IGZ1bmN0aW9uIF9nZXROYW1lKCkge1xuICAgIGlmICh0aGlzLl9mb250LkNGRjIpIHtcbiAgICAgIHJldHVybiBfR2x5cGgucHJvdG90eXBlLl9nZXROYW1lLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2ZvbnRbJ0NGRiAnXS5nZXRHbHlwaE5hbWUodGhpcy5pZCk7XG4gIH07XG5cbiAgX3Byb3RvLmJpYXMgPSBmdW5jdGlvbiBiaWFzKHMpIHtcbiAgICBpZiAocy5sZW5ndGggPCAxMjQwKSB7XG4gICAgICByZXR1cm4gMTA3O1xuICAgIH0gZWxzZSBpZiAocy5sZW5ndGggPCAzMzkwMCkge1xuICAgICAgcmV0dXJuIDExMzE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAzMjc2ODtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLl9nZXRQYXRoID0gZnVuY3Rpb24gX2dldFBhdGgoKSB7XG4gICAgdmFyIHN0cmVhbSA9IHRoaXMuX2ZvbnQuc3RyZWFtO1xuICAgIHZhciBwb3MgPSBzdHJlYW0ucG9zO1xuICAgIHZhciBjZmYgPSB0aGlzLl9mb250LkNGRjIgfHwgdGhpcy5fZm9udFsnQ0ZGICddO1xuICAgIHZhciBzdHIgPSBjZmYudG9wRGljdC5DaGFyU3RyaW5nc1t0aGlzLmlkXTtcbiAgICB2YXIgZW5kID0gc3RyLm9mZnNldCArIHN0ci5sZW5ndGg7XG4gICAgc3RyZWFtLnBvcyA9IHN0ci5vZmZzZXQ7XG4gICAgdmFyIHBhdGggPSBuZXcgUGF0aCgpO1xuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciB0cmFucyA9IFtdO1xuICAgIHZhciB3aWR0aCA9IG51bGw7XG4gICAgdmFyIG5TdGVtcyA9IDA7XG4gICAgdmFyIHggPSAwLFxuICAgICAgICB5ID0gMDtcbiAgICB2YXIgdXNlZEdzdWJycztcbiAgICB2YXIgdXNlZFN1YnJzO1xuICAgIHZhciBvcGVuID0gZmFsc2U7XG4gICAgdGhpcy5fdXNlZEdzdWJycyA9IHVzZWRHc3VicnMgPSB7fTtcbiAgICB0aGlzLl91c2VkU3VicnMgPSB1c2VkU3VicnMgPSB7fTtcbiAgICB2YXIgZ3N1YnJzID0gY2ZmLmdsb2JhbFN1YnJJbmRleCB8fCBbXTtcbiAgICB2YXIgZ3N1YnJzQmlhcyA9IHRoaXMuYmlhcyhnc3VicnMpO1xuICAgIHZhciBwcml2YXRlRGljdCA9IGNmZi5wcml2YXRlRGljdEZvckdseXBoKHRoaXMuaWQpO1xuICAgIHZhciBzdWJycyA9IHByaXZhdGVEaWN0LlN1YnJzIHx8IFtdO1xuICAgIHZhciBzdWJyc0JpYXMgPSB0aGlzLmJpYXMoc3VicnMpO1xuICAgIHZhciB2c3RvcmUgPSBjZmYudG9wRGljdC52c3RvcmUgJiYgY2ZmLnRvcERpY3QudnN0b3JlLml0ZW1WYXJpYXRpb25TdG9yZTtcbiAgICB2YXIgdnNpbmRleCA9IHByaXZhdGVEaWN0LnZzaW5kZXg7XG4gICAgdmFyIHZhcmlhdGlvblByb2Nlc3NvciA9IHRoaXMuX2ZvbnQuX3ZhcmlhdGlvblByb2Nlc3NvcjtcblxuICAgIGZ1bmN0aW9uIGNoZWNrV2lkdGgoKSB7XG4gICAgICBpZiAod2lkdGggPT0gbnVsbCkge1xuICAgICAgICB3aWR0aCA9IHN0YWNrLnNoaWZ0KCkgKyBwcml2YXRlRGljdC5ub21pbmFsV2lkdGhYO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlU3RlbXMoKSB7XG4gICAgICBpZiAoc3RhY2subGVuZ3RoICUgMiAhPT0gMCkge1xuICAgICAgICBjaGVja1dpZHRoKCk7XG4gICAgICB9XG5cbiAgICAgIG5TdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTtcbiAgICAgIHJldHVybiBzdGFjay5sZW5ndGggPSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7XG4gICAgICBpZiAob3Blbikge1xuICAgICAgICBwYXRoLmNsb3NlUGF0aCgpO1xuICAgICAgfVxuXG4gICAgICBwYXRoLm1vdmVUbyh4LCB5KTtcbiAgICAgIG9wZW4gPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKCkge1xuICAgICAgd2hpbGUgKHN0cmVhbS5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIG9wID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuXG4gICAgICAgIGlmIChvcCA8IDMyKSB7XG4gICAgICAgICAgc3dpdGNoIChvcCkge1xuICAgICAgICAgICAgY2FzZSAxOiAvLyBoc3RlbVxuXG4gICAgICAgICAgICBjYXNlIDM6IC8vIHZzdGVtXG5cbiAgICAgICAgICAgIGNhc2UgMTg6IC8vIGhzdGVtaG1cblxuICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgLy8gdnN0ZW1obVxuICAgICAgICAgICAgICBwYXJzZVN0ZW1zKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIC8vIHZtb3ZldG9cbiAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjaGVja1dpZHRoKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIG1vdmVUbyh4LCB5KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgLy8gcmxpbmV0b1xuICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHBhdGgubGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNjogLy8gaGxpbmV0b1xuXG4gICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgIC8vIHZsaW5ldG9cbiAgICAgICAgICAgICAgdmFyIHBoYXNlID0gb3AgPT09IDY7XG5cbiAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBoYXNlKSB7XG4gICAgICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXRoLmxpbmVUbyh4LCB5KTtcbiAgICAgICAgICAgICAgICBwaGFzZSA9ICFwaGFzZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgIC8vIHJyY3VydmV0b1xuICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBjMXggPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB2YXIgYzF5ID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IGMyeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeSA9IGMyeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwgeCwgeSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgLy8gY2FsbHN1YnJcbiAgICAgICAgICAgICAgdmFyIGluZGV4ID0gc3RhY2sucG9wKCkgKyBzdWJyc0JpYXM7XG4gICAgICAgICAgICAgIHZhciBzdWJyID0gc3VicnNbaW5kZXhdO1xuXG4gICAgICAgICAgICAgIGlmIChzdWJyKSB7XG4gICAgICAgICAgICAgICAgdXNlZFN1YnJzW2luZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIHAgPSBzdHJlYW0ucG9zO1xuICAgICAgICAgICAgICAgIHZhciBlID0gZW5kO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wb3MgPSBzdWJyLm9mZnNldDtcbiAgICAgICAgICAgICAgICBlbmQgPSBzdWJyLm9mZnNldCArIHN1YnIubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHBhcnNlKCk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnBvcyA9IHA7XG4gICAgICAgICAgICAgICAgZW5kID0gZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAvLyByZXR1cm5cbiAgICAgICAgICAgICAgaWYgKGNmZi52ZXJzaW9uID49IDIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgLy8gZW5kY2hhclxuICAgICAgICAgICAgICBpZiAoY2ZmLnZlcnNpb24gPj0gMikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjaGVja1dpZHRoKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgICAgICAgIHBhdGguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICAgICAgb3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyB2c2luZGV4XG4gICAgICAgICAgICAgICAgaWYgKGNmZi52ZXJzaW9uIDwgMikge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2c2luZGV4IG9wZXJhdG9yIG5vdCBzdXBwb3J0ZWQgaW4gQ0ZGIHYxJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdnNpbmRleCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBibGVuZFxuICAgICAgICAgICAgICAgIGlmIChjZmYudmVyc2lvbiA8IDIpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmxlbmQgb3BlcmF0b3Igbm90IHN1cHBvcnRlZCBpbiBDRkYgdjEnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhdGlvblByb2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdibGVuZCBvcGVyYXRvciBpbiBub24tdmFyaWF0aW9uIGZvbnQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgYmxlbmRWZWN0b3IgPSB2YXJpYXRpb25Qcm9jZXNzb3IuZ2V0QmxlbmRWZWN0b3IodnN0b3JlLCB2c2luZGV4KTtcbiAgICAgICAgICAgICAgICB2YXIgbnVtQmxlbmRzID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdmFyIG51bU9wZXJhbmRzID0gbnVtQmxlbmRzICogYmxlbmRWZWN0b3IubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IHN0YWNrLmxlbmd0aCAtIG51bU9wZXJhbmRzO1xuICAgICAgICAgICAgICAgIHZhciBiYXNlID0gZGVsdGEgLSBudW1CbGVuZHM7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUJsZW5kczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgc3VtID0gc3RhY2tbYmFzZSArIGldO1xuXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGJsZW5kVmVjdG9yLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1bSArPSBibGVuZFZlY3RvcltqXSAqIHN0YWNrW2RlbHRhKytdO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBzdGFja1tiYXNlICsgaV0gPSBzdW07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgd2hpbGUgKG51bU9wZXJhbmRzLS0pIHtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgMTk6IC8vIGhpbnRtYXNrXG5cbiAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgIC8vIGNudHJtYXNrXG4gICAgICAgICAgICAgIHBhcnNlU3RlbXMoKTtcbiAgICAgICAgICAgICAgc3RyZWFtLnBvcyArPSBuU3RlbXMgKyA3ID4+IDM7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgICAvLyBybW92ZXRvXG4gICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tXaWR0aCgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIG1vdmVUbyh4LCB5KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgIC8vIGhtb3ZldG9cbiAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjaGVja1dpZHRoKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIG1vdmVUbyh4LCB5KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICAgIC8vIHJjdXJ2ZWxpbmVcbiAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+PSA4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGMxeCA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHZhciBjMXkgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB2YXIgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB2YXIgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5ID0gYzJ5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBwYXRoLmxpbmVUbyh4LCB5KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICAgIC8vIHJsaW5lY3VydmVcbiAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+PSA4KSB7XG4gICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBwYXRoLmxpbmVUbyh4LCB5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBjMXggPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgdmFyIGMxeSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB2YXIgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgdmFyIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHggPSBjMnggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5ID0gYzJ5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwgeCwgeSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgICAvLyB2dmN1cnZldG9cbiAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCAlIDIpIHtcbiAgICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID49IDQpIHtcbiAgICAgICAgICAgICAgICBjMXggPSB4O1xuICAgICAgICAgICAgICAgIGMxeSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB4ID0gYzJ4O1xuICAgICAgICAgICAgICAgIHkgPSBjMnkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICAgIC8vIGhoY3VydmV0b1xuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikge1xuICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPj0gNCkge1xuICAgICAgICAgICAgICAgIGMxeCA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGMxeSA9IHk7XG4gICAgICAgICAgICAgICAgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHggPSBjMnggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHkgPSBjMnk7XG4gICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwgeCwgeSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyODpcbiAgICAgICAgICAgICAgLy8gc2hvcnRpbnRcbiAgICAgICAgICAgICAgc3RhY2sucHVzaChzdHJlYW0ucmVhZEludDE2QkUoKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgICAgICAvLyBjYWxsZ3N1YnJcbiAgICAgICAgICAgICAgaW5kZXggPSBzdGFjay5wb3AoKSArIGdzdWJyc0JpYXM7XG4gICAgICAgICAgICAgIHN1YnIgPSBnc3VicnNbaW5kZXhdO1xuXG4gICAgICAgICAgICAgIGlmIChzdWJyKSB7XG4gICAgICAgICAgICAgICAgdXNlZEdzdWJyc1tpbmRleF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciBwID0gc3RyZWFtLnBvcztcbiAgICAgICAgICAgICAgICB2YXIgZSA9IGVuZDtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucG9zID0gc3Vici5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgZW5kID0gc3Vici5vZmZzZXQgKyBzdWJyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBwYXJzZSgpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wb3MgPSBwO1xuICAgICAgICAgICAgICAgIGVuZCA9IGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAzMDogLy8gdmhjdXJ2ZXRvXG5cbiAgICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICAgIC8vIGh2Y3VydmV0b1xuICAgICAgICAgICAgICBwaGFzZSA9IG9wID09PSAzMTtcblxuICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID49IDQpIHtcbiAgICAgICAgICAgICAgICBpZiAocGhhc2UpIHtcbiAgICAgICAgICAgICAgICAgIGMxeCA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzF5ID0geTtcbiAgICAgICAgICAgICAgICAgIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgeSA9IGMyeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICB4ID0gYzJ4ICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYzF4ID0geDtcbiAgICAgICAgICAgICAgICAgIGMxeSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICB4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHkgPSBjMnkgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHkpO1xuICAgICAgICAgICAgICAgIHBoYXNlID0gIXBoYXNlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgIG9wID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuXG4gICAgICAgICAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAvLyBhbmRcbiAgICAgICAgICAgICAgICAgIHZhciBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICB2YXIgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhICYmIGIgPyAxIDogMCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgIC8vIG9yXG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgfHwgYiA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgLy8gbm90XG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgPyAwIDogMSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgIC8vIGFic1xuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLmFicyhhKSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAvLyBhZGRcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSArIGIpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgLy8gc3ViXG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgLSBiKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgIC8vIGRpdlxuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhIC8gYik7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAvLyBuZWdcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goLWEpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgLy8gZXFcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSA9PT0gYiA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICAgIC8vIGRyb3BcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgICAgICAgLy8gcHV0XG4gICAgICAgICAgICAgICAgICB2YXIgdmFsID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICB0cmFuc1tpZHhdID0gdmFsO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgICAgICAgLy8gZ2V0XG4gICAgICAgICAgICAgICAgICBpZHggPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godHJhbnNbaWR4XSB8fCAwKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgICAgIC8vIGlmZWxzZVxuICAgICAgICAgICAgICAgICAgdmFyIHMxID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICB2YXIgczIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHZhciB2MSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgdmFyIHYyID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHYxIDw9IHYyID8gczEgOiBzMik7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICAgICAgICAvLyByYW5kb21cbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5yYW5kb20oKSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICAgICAgICAvLyBtdWxcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAqIGIpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgICAgICAgLy8gc3FydFxuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLnNxcnQoYSkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgICAgICAgLy8gZHVwXG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEsIGEpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDI4OlxuICAgICAgICAgICAgICAgICAgLy8gZXhjaFxuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChiLCBhKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICAgICAgICAgIC8vIGluZGV4XG4gICAgICAgICAgICAgICAgICBpZHggPSBzdGFjay5wb3AoKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWR4ID0gMDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaWR4ID4gc3RhY2subGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZHggPSBzdGFjay5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN0YWNrW2lkeF0pO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgICAgICAgICAgLy8gcm9sbFxuICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzdGFjay5wb3AoKTtcblxuICAgICAgICAgICAgICAgICAgdmFyIF9qID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChfaiA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChfaiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHN0YWNrW24gLSAxXTtcblxuICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gbiAtIDI7IF9pID49IDA7IF9pLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW19pICsgMV0gPSBzdGFja1tfaV07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgc3RhY2tbMF0gPSB0O1xuICAgICAgICAgICAgICAgICAgICAgIF9qLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChfaiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHN0YWNrWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDw9IG47IF9pMisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFja1tfaTJdID0gc3RhY2tbX2kyICsgMV07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgc3RhY2tbbiAtIDFdID0gdDtcbiAgICAgICAgICAgICAgICAgICAgICBfaisrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgICAgICAgIC8vIGhmbGV4XG4gICAgICAgICAgICAgICAgICBjMXggPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGMxeSA9IHk7XG4gICAgICAgICAgICAgICAgICBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHZhciBjM3ggPSBjMnggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgdmFyIGMzeSA9IGMyeTtcbiAgICAgICAgICAgICAgICAgIHZhciBjNHggPSBjM3ggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgdmFyIGM0eSA9IGMzeTtcbiAgICAgICAgICAgICAgICAgIHZhciBjNXggPSBjNHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgdmFyIGM1eSA9IGM0eTtcbiAgICAgICAgICAgICAgICAgIHZhciBjNnggPSBjNXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgdmFyIGM2eSA9IGM1eTtcbiAgICAgICAgICAgICAgICAgIHggPSBjNng7XG4gICAgICAgICAgICAgICAgICB5ID0gYzZ5O1xuICAgICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwgYzN4LCBjM3kpO1xuICAgICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvKGM0eCwgYzR5LCBjNXgsIGM1eSwgYzZ4LCBjNnkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgICAgICAgICAgLy8gZmxleFxuICAgICAgICAgICAgICAgICAgdmFyIHB0cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaTMgPSAwOyBfaTMgPD0gNTsgX2kzKyspIHtcbiAgICAgICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHB0cy5wdXNoKHgsIHkpO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8uYXBwbHkocGF0aCwgcHRzLnNsaWNlKDAsIDYpKTtcbiAgICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUby5hcHBseShwYXRoLCBwdHMuc2xpY2UoNikpO1xuICAgICAgICAgICAgICAgICAgc3RhY2suc2hpZnQoKTsgLy8gZmRcblxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDM2OlxuICAgICAgICAgICAgICAgICAgLy8gaGZsZXgxXG4gICAgICAgICAgICAgICAgICBjMXggPSB4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGMxeSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjM3ggPSBjMnggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzN5ID0gYzJ5O1xuICAgICAgICAgICAgICAgICAgYzR4ID0gYzN4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGM0eSA9IGMzeTtcbiAgICAgICAgICAgICAgICAgIGM1eCA9IGM0eCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjNXkgPSBjNHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzZ4ID0gYzV4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGM2eSA9IGM1eTtcbiAgICAgICAgICAgICAgICAgIHggPSBjNng7XG4gICAgICAgICAgICAgICAgICB5ID0gYzZ5O1xuICAgICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwgYzN4LCBjM3kpO1xuICAgICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvKGM0eCwgYzR5LCBjNXgsIGM1eSwgYzZ4LCBjNnkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgICAgICAgLy8gZmxleDFcbiAgICAgICAgICAgICAgICAgIHZhciBzdGFydHggPSB4O1xuICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0eSA9IHk7XG4gICAgICAgICAgICAgICAgICBwdHMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2k0ID0gMDsgX2k0IDw9IDQ7IF9pNCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBwdHMucHVzaCh4LCB5KTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHggLSBzdGFydHgpID4gTWF0aC5hYnMoeSAtIHN0YXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBzdGFydHk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB4ID0gc3RhcnR4O1xuICAgICAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHB0cy5wdXNoKHgsIHkpO1xuICAgICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvLmFwcGx5KHBhdGgsIHB0cy5zbGljZSgwLCA2KSk7XG4gICAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8uYXBwbHkocGF0aCwgcHRzLnNsaWNlKDYpKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3A6IDEyIFwiICsgb3ApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3A6IFwiICsgb3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvcCA8IDI0Nykge1xuICAgICAgICAgIHN0YWNrLnB1c2gob3AgLSAxMzkpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wIDwgMjUxKSB7XG4gICAgICAgICAgdmFyIGIxID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuICAgICAgICAgIHN0YWNrLnB1c2goKG9wIC0gMjQ3KSAqIDI1NiArIGIxICsgMTA4KTtcbiAgICAgICAgfSBlbHNlIGlmIChvcCA8IDI1NSkge1xuICAgICAgICAgIHZhciBiMSA9IHN0cmVhbS5yZWFkVUludDgoKTtcbiAgICAgICAgICBzdGFjay5wdXNoKC0ob3AgLSAyNTEpICogMjU2IC0gYjEgLSAxMDgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YWNrLnB1c2goc3RyZWFtLnJlYWRJbnQzMkJFKCkgLyA2NTUzNik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcGFyc2UoKTtcblxuICAgIGlmIChvcGVuKSB7XG4gICAgICBwYXRoLmNsb3NlUGF0aCgpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9O1xuXG4gIHJldHVybiBDRkZHbHlwaDtcbn0oR2x5cGgpO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSRiKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxudmFyIFNCSVhJbWFnZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBvcmlnaW5YOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG9yaWdpblk6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdHlwZTogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgZGF0YTogbmV3IHJlc3RydWN0dXJlLkJ1ZmZlcihmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5idWZsZW4gLSB0Ll9jdXJyZW50T2Zmc2V0O1xuICB9KVxufSk7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb2xvciAoZS5nLiBlbW9qaSkgZ2x5cGggaW4gQXBwbGUncyBTQklYIGZvcm1hdC5cbiAqL1xuXG52YXIgU0JJWEdseXBoID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfVFRGR2x5cGgpIHtcbiAgX2luaGVyaXRzTG9vc2UkYihTQklYR2x5cGgsIF9UVEZHbHlwaCk7XG5cbiAgZnVuY3Rpb24gU0JJWEdseXBoKCkge1xuICAgIHJldHVybiBfVFRGR2x5cGguYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNCSVhHbHlwaC5wcm90b3R5cGU7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGdseXBoIGltYWdlIGF0IHRoZSBnaXZlbiBwb2ludCBzaXplLlxuICAgKiBUaGUgb2JqZWN0IGhhcyBhIGRhdGEgcHJvcGVydHkgd2l0aCBhIEJ1ZmZlciBjb250YWluaW5nIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YSxcbiAgICogYWxvbmcgd2l0aCB0aGUgaW1hZ2UgdHlwZSwgYW5kIG9yaWdpbi5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgX3Byb3RvLmdldEltYWdlRm9yU2l6ZSA9IGZ1bmN0aW9uIGdldEltYWdlRm9yU2l6ZShzaXplKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9mb250LnNiaXguaW1hZ2VUYWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0YWJsZSA9IHRoaXMuX2ZvbnQuc2JpeC5pbWFnZVRhYmxlc1tpXTtcblxuICAgICAgaWYgKHRhYmxlLnBwZW0gPj0gc2l6ZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0cyA9IHRhYmxlLmltYWdlT2Zmc2V0cztcbiAgICB2YXIgc3RhcnQgPSBvZmZzZXRzW3RoaXMuaWRdO1xuICAgIHZhciBlbmQgPSBvZmZzZXRzW3RoaXMuaWQgKyAxXTtcblxuICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl9mb250LnN0cmVhbS5wb3MgPSBzdGFydDtcbiAgICByZXR1cm4gU0JJWEltYWdlLmRlY29kZSh0aGlzLl9mb250LnN0cmVhbSwge1xuICAgICAgYnVmbGVuOiBlbmQgLSBzdGFydFxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoY3R4LCBzaXplKSB7XG4gICAgdmFyIGltZyA9IHRoaXMuZ2V0SW1hZ2VGb3JTaXplKHNpemUpO1xuXG4gICAgaWYgKGltZyAhPSBudWxsKSB7XG4gICAgICB2YXIgc2NhbGUgPSBzaXplIC8gdGhpcy5fZm9udC51bml0c1BlckVtO1xuICAgICAgY3R4LmltYWdlKGltZy5kYXRhLCB7XG4gICAgICAgIGhlaWdodDogc2l6ZSxcbiAgICAgICAgeDogaW1nLm9yaWdpblgsXG4gICAgICAgIHk6ICh0aGlzLmJib3gubWluWSAtIGltZy5vcmlnaW5ZKSAqIHNjYWxlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZm9udC5zYml4LmZsYWdzLnJlbmRlck91dGxpbmVzKSB7XG4gICAgICBfVFRGR2x5cGgucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMsIGN0eCwgc2l6ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTQklYR2x5cGg7XG59KFRURkdseXBoKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRuKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRuKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRuKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkbihvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JG4obywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRuKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQ3KHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDcoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ3KENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkNyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkYyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIENPTFJMYXllciA9IGZ1bmN0aW9uIENPTFJMYXllcihnbHlwaCwgY29sb3IpIHtcbiAgdGhpcy5nbHlwaCA9IGdseXBoO1xuICB0aGlzLmNvbG9yID0gY29sb3I7XG59O1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29sb3IgKGUuZy4gZW1vamkpIGdseXBoIGluIE1pY3Jvc29mdCdzIENPTFIgZm9ybWF0LlxuICogRWFjaCBnbHlwaCBpbiB0aGlzIGZvcm1hdCBjb250YWluIGEgbGlzdCBvZiBjb2xvcmVkIGxheWVycywgZWFjaFxuICogb2Ygd2hpY2ggIGlzIGFub3RoZXIgdmVjdG9yIGdseXBoLlxuICovXG5cblxudmFyIENPTFJHbHlwaCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0dseXBoKSB7XG4gIF9pbmhlcml0c0xvb3NlJGMoQ09MUkdseXBoLCBfR2x5cGgpO1xuXG4gIGZ1bmN0aW9uIENPTFJHbHlwaCgpIHtcbiAgICByZXR1cm4gX0dseXBoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBDT0xSR2x5cGgucHJvdG90eXBlO1xuXG4gIF9wcm90by5fZ2V0QkJveCA9IGZ1bmN0aW9uIF9nZXRCQm94KCkge1xuICAgIHZhciBiYm94ID0gbmV3IEJCb3goKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsYXllciA9IHRoaXMubGF5ZXJzW2ldO1xuICAgICAgdmFyIGIgPSBsYXllci5nbHlwaC5iYm94O1xuICAgICAgYmJveC5hZGRQb2ludChiLm1pblgsIGIubWluWSk7XG4gICAgICBiYm94LmFkZFBvaW50KGIubWF4WCwgYi5tYXhZKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmJveDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGdseXBoIGFuZCBjb2xvciBmb3JcbiAgICogZWFjaCBsYXllciBpbiB0aGUgY29tcG9zaXRlIGNvbG9yIGdseXBoLlxuICAgKiBAdHlwZSB7b2JqZWN0W119XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcihjdHgsIHNpemUpIHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJG4odGhpcy5sYXllcnMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIF9zdGVwJHZhbHVlID0gX3N0ZXAudmFsdWUsXG4gICAgICAgICAgZ2x5cGggPSBfc3RlcCR2YWx1ZS5nbHlwaCxcbiAgICAgICAgICBjb2xvciA9IF9zdGVwJHZhbHVlLmNvbG9yO1xuICAgICAgY3R4LmZpbGxDb2xvcihbY29sb3IucmVkLCBjb2xvci5ncmVlbiwgY29sb3IuYmx1ZV0sIGNvbG9yLmFscGhhIC8gMjU1ICogMTAwKTtcbiAgICAgIGdseXBoLnJlbmRlcihjdHgsIHNpemUpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MkNyhDT0xSR2x5cGgsIFt7XG4gICAga2V5OiBcImxheWVyc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGNwYWwgPSB0aGlzLl9mb250LkNQQUw7XG4gICAgICB2YXIgY29sciA9IHRoaXMuX2ZvbnQuQ09MUjtcbiAgICAgIHZhciBsb3cgPSAwO1xuICAgICAgdmFyIGhpZ2ggPSBjb2xyLmJhc2VHbHlwaFJlY29yZC5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHtcbiAgICAgICAgdmFyIG1pZCA9IGxvdyArIGhpZ2ggPj4gMTtcbiAgICAgICAgdmFyIHJlYyA9IGNvbHIuYmFzZUdseXBoUmVjb3JkW21pZF07XG5cbiAgICAgICAgaWYgKHRoaXMuaWQgPCByZWMuZ2lkKSB7XG4gICAgICAgICAgaGlnaCA9IG1pZCAtIDE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pZCA+IHJlYy5naWQpIHtcbiAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBiYXNlTGF5ZXIgPSByZWM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gaWYgYmFzZSBnbHlwaCBub3QgZm91bmQgaW4gQ09MUiB0YWJsZSxcbiAgICAgIC8vIGRlZmF1bHQgdG8gbm9ybWFsIGdseXBoIGZyb20gZ2x5ZiBvciBDRkZcblxuXG4gICAgICBpZiAoYmFzZUxheWVyID09IG51bGwpIHtcbiAgICAgICAgdmFyIGcgPSB0aGlzLl9mb250Ll9nZXRCYXNlR2x5cGgodGhpcy5pZCk7XG5cbiAgICAgICAgdmFyIGNvbG9yID0ge1xuICAgICAgICAgIHJlZDogMCxcbiAgICAgICAgICBncmVlbjogMCxcbiAgICAgICAgICBibHVlOiAwLFxuICAgICAgICAgIGFscGhhOiAyNTVcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFtuZXcgQ09MUkxheWVyKGcsIGNvbG9yKV07XG4gICAgICB9IC8vIG90aGVyd2lzZSwgcmV0dXJuIGFuIGFycmF5IG9mIGFsbCB0aGUgbGF5ZXJzXG5cblxuICAgICAgdmFyIGxheWVycyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpID0gYmFzZUxheWVyLmZpcnN0TGF5ZXJJbmRleDsgaSA8IGJhc2VMYXllci5maXJzdExheWVySW5kZXggKyBiYXNlTGF5ZXIubnVtTGF5ZXJzOyBpKyspIHtcbiAgICAgICAgdmFyIHJlYyA9IGNvbHIubGF5ZXJSZWNvcmRzW2ldO1xuICAgICAgICB2YXIgY29sb3IgPSBjcGFsLmNvbG9yUmVjb3Jkc1tyZWMucGFsZXR0ZUluZGV4XTtcblxuICAgICAgICB2YXIgZyA9IHRoaXMuX2ZvbnQuX2dldEJhc2VHbHlwaChyZWMuZ2lkKTtcblxuICAgICAgICBsYXllcnMucHVzaChuZXcgQ09MUkxheWVyKGcsIGNvbG9yKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENPTFJHbHlwaDtcbn0oR2x5cGgpO1xuXG52YXIgVFVQTEVTX1NIQVJFX1BPSU5UX05VTUJFUlMgPSAweDgwMDA7XG52YXIgVFVQTEVfQ09VTlRfTUFTSyA9IDB4MGZmZjtcbnZhciBFTUJFRERFRF9UVVBMRV9DT09SRCA9IDB4ODAwMDtcbnZhciBJTlRFUk1FRElBVEVfVFVQTEUgPSAweDQwMDA7XG52YXIgUFJJVkFURV9QT0lOVF9OVU1CRVJTID0gMHgyMDAwO1xudmFyIFRVUExFX0lOREVYX01BU0sgPSAweDBmZmY7XG52YXIgUE9JTlRTX0FSRV9XT1JEUyA9IDB4ODA7XG52YXIgUE9JTlRfUlVOX0NPVU5UX01BU0sgPSAweDdmO1xudmFyIERFTFRBU19BUkVfWkVSTyA9IDB4ODA7XG52YXIgREVMVEFTX0FSRV9XT1JEUyA9IDB4NDA7XG52YXIgREVMVEFfUlVOX0NPVU5UX01BU0sgPSAweDNmO1xuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHRyYW5zZm9ybXMgVHJ1ZVR5cGUgZ2x5cGhzIGFjY29yZGluZyB0byB0aGUgZGF0YSBmcm9tXG4gKiB0aGUgQXBwbGUgQWR2YW5jZWQgVHlwb2dyYXBoeSB2YXJpYXRpb24gdGFibGVzIChmdmFyLCBndmFyLCBhbmQgYXZhcikuXG4gKiBUaGVzZSB0YWJsZXMgYWxsb3cgaW5maW5pdGUgYWRqdXN0bWVudHMgdG8gZ2x5cGggd2VpZ2h0LCB3aWR0aCwgc2xhbnQsXG4gKiBhbmQgb3B0aWNhbCBzaXplIHdpdGhvdXQgdGhlIGRlc2lnbmVyIG5lZWRpbmcgdG8gc3BlY2lmeSBldmVyeSBleGFjdCBzdHlsZS5cbiAqXG4gKiBBcHBsZSdzIGRvY3VtZW50YXRpb24gZm9yIHRoZXNlIHRhYmxlcyBpcyBub3QgZ3JlYXQsIHNvIHRoYW5rcyB0byB0aGVcbiAqIEZyZWV0eXBlIHByb2plY3QgZm9yIGZpZ3VyaW5nIG11Y2ggb2YgdGhpcyBvdXQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgR2x5cGhWYXJpYXRpb25Qcm9jZXNzb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHbHlwaFZhcmlhdGlvblByb2Nlc3Nvcihmb250LCBjb29yZHMpIHtcbiAgICB0aGlzLmZvbnQgPSBmb250O1xuICAgIHRoaXMubm9ybWFsaXplZENvb3JkcyA9IHRoaXMubm9ybWFsaXplQ29vcmRzKGNvb3Jkcyk7XG4gICAgdGhpcy5ibGVuZFZlY3RvcnMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gR2x5cGhWYXJpYXRpb25Qcm9jZXNzb3IucHJvdG90eXBlO1xuXG4gIF9wcm90by5ub3JtYWxpemVDb29yZHMgPSBmdW5jdGlvbiBub3JtYWxpemVDb29yZHMoY29vcmRzKSB7XG4gICAgLy8gdGhlIGRlZmF1bHQgbWFwcGluZyBpcyBsaW5lYXIgYWxvbmcgZWFjaCBheGlzLCBpbiB0d28gc2VnbWVudHM6XG4gICAgLy8gZnJvbSB0aGUgbWluVmFsdWUgdG8gZGVmYXVsdFZhbHVlLCBhbmQgZnJvbSBkZWZhdWx0VmFsdWUgdG8gbWF4VmFsdWUuXG4gICAgdmFyIG5vcm1hbGl6ZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mb250LmZ2YXIuYXhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGF4aXMgPSB0aGlzLmZvbnQuZnZhci5heGlzW2ldO1xuXG4gICAgICBpZiAoY29vcmRzW2ldIDwgYXhpcy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgbm9ybWFsaXplZC5wdXNoKChjb29yZHNbaV0gLSBheGlzLmRlZmF1bHRWYWx1ZSArIE51bWJlci5FUFNJTE9OKSAvIChheGlzLmRlZmF1bHRWYWx1ZSAtIGF4aXMubWluVmFsdWUgKyBOdW1iZXIuRVBTSUxPTikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9ybWFsaXplZC5wdXNoKChjb29yZHNbaV0gLSBheGlzLmRlZmF1bHRWYWx1ZSArIE51bWJlci5FUFNJTE9OKSAvIChheGlzLm1heFZhbHVlIC0gYXhpcy5kZWZhdWx0VmFsdWUgKyBOdW1iZXIuRVBTSUxPTikpO1xuICAgICAgfVxuICAgIH0gLy8gaWYgdGhlcmUgaXMgYW4gYXZhciB0YWJsZSwgdGhlIG5vcm1hbGl6ZWQgdmFsdWUgaXMgY2FsY3VsYXRlZFxuICAgIC8vIGJ5IGludGVycG9sYXRpbmcgYmV0d2VlbiB0aGUgdHdvIG5lYXJlc3QgbWFwcGVkIHZhbHVlcy5cblxuXG4gICAgaWYgKHRoaXMuZm9udC5hdmFyKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZm9udC5hdmFyLnNlZ21lbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNlZ21lbnQgPSB0aGlzLmZvbnQuYXZhci5zZWdtZW50W2ldO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VnbWVudC5jb3JyZXNwb25kZW5jZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHZhciBwYWlyID0gc2VnbWVudC5jb3JyZXNwb25kZW5jZVtqXTtcblxuICAgICAgICAgIGlmIChqID49IDEgJiYgbm9ybWFsaXplZFtpXSA8IHBhaXIuZnJvbUNvb3JkKSB7XG4gICAgICAgICAgICB2YXIgcHJldiA9IHNlZ21lbnQuY29ycmVzcG9uZGVuY2VbaiAtIDFdO1xuICAgICAgICAgICAgbm9ybWFsaXplZFtpXSA9ICgobm9ybWFsaXplZFtpXSAtIHByZXYuZnJvbUNvb3JkKSAqIChwYWlyLnRvQ29vcmQgLSBwcmV2LnRvQ29vcmQpICsgTnVtYmVyLkVQU0lMT04pIC8gKHBhaXIuZnJvbUNvb3JkIC0gcHJldi5mcm9tQ29vcmQgKyBOdW1iZXIuRVBTSUxPTikgKyBwcmV2LnRvQ29vcmQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfTtcblxuICBfcHJvdG8udHJhbnNmb3JtUG9pbnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnRzKGdpZCwgZ2x5cGhQb2ludHMpIHtcbiAgICBpZiAoIXRoaXMuZm9udC5mdmFyIHx8ICF0aGlzLmZvbnQuZ3Zhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBndmFyID0gdGhpcy5mb250Lmd2YXI7XG5cbiAgICBpZiAoZ2lkID49IGd2YXIuZ2x5cGhDb3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBvZmZzZXQgPSBndmFyLm9mZnNldHNbZ2lkXTtcblxuICAgIGlmIChvZmZzZXQgPT09IGd2YXIub2Zmc2V0c1tnaWQgKyAxXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gUmVhZCB0aGUgZ3ZhciBkYXRhIGZvciB0aGlzIGdseXBoXG5cblxuICAgIHZhciBzdHJlYW0gPSB0aGlzLmZvbnQuc3RyZWFtO1xuICAgIHN0cmVhbS5wb3MgPSBvZmZzZXQ7XG5cbiAgICBpZiAoc3RyZWFtLnBvcyA+PSBzdHJlYW0ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHR1cGxlQ291bnQgPSBzdHJlYW0ucmVhZFVJbnQxNkJFKCk7XG4gICAgdmFyIG9mZnNldFRvRGF0YSA9IG9mZnNldCArIHN0cmVhbS5yZWFkVUludDE2QkUoKTtcblxuICAgIGlmICh0dXBsZUNvdW50ICYgVFVQTEVTX1NIQVJFX1BPSU5UX05VTUJFUlMpIHtcbiAgICAgIHZhciBoZXJlID0gc3RyZWFtLnBvcztcbiAgICAgIHN0cmVhbS5wb3MgPSBvZmZzZXRUb0RhdGE7XG4gICAgICB2YXIgc2hhcmVkUG9pbnRzID0gdGhpcy5kZWNvZGVQb2ludHMoKTtcbiAgICAgIG9mZnNldFRvRGF0YSA9IHN0cmVhbS5wb3M7XG4gICAgICBzdHJlYW0ucG9zID0gaGVyZTtcbiAgICB9XG5cbiAgICB2YXIgb3JpZ1BvaW50cyA9IGdseXBoUG9pbnRzLm1hcChmdW5jdGlvbiAocHQpIHtcbiAgICAgIHJldHVybiBwdC5jb3B5KCk7XG4gICAgfSk7XG4gICAgdHVwbGVDb3VudCAmPSBUVVBMRV9DT1VOVF9NQVNLO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0dXBsZUNvdW50OyBpKyspIHtcbiAgICAgIHZhciB0dXBsZURhdGFTaXplID0gc3RyZWFtLnJlYWRVSW50MTZCRSgpO1xuICAgICAgdmFyIHR1cGxlSW5kZXggPSBzdHJlYW0ucmVhZFVJbnQxNkJFKCk7XG5cbiAgICAgIGlmICh0dXBsZUluZGV4ICYgRU1CRURERURfVFVQTEVfQ09PUkQpIHtcbiAgICAgICAgdmFyIHR1cGxlQ29vcmRzID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBndmFyLmF4aXNDb3VudDsgYSsrKSB7XG4gICAgICAgICAgdHVwbGVDb29yZHMucHVzaChzdHJlYW0ucmVhZEludDE2QkUoKSAvIDE2Mzg0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCh0dXBsZUluZGV4ICYgVFVQTEVfSU5ERVhfTUFTSykgPj0gZ3Zhci5nbG9iYWxDb29yZENvdW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGd2YXIgdGFibGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0dXBsZUNvb3JkcyA9IGd2YXIuZ2xvYmFsQ29vcmRzW3R1cGxlSW5kZXggJiBUVVBMRV9JTkRFWF9NQVNLXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR1cGxlSW5kZXggJiBJTlRFUk1FRElBVEVfVFVQTEUpIHtcbiAgICAgICAgdmFyIHN0YXJ0Q29vcmRzID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgX2EgPSAwOyBfYSA8IGd2YXIuYXhpc0NvdW50OyBfYSsrKSB7XG4gICAgICAgICAgc3RhcnRDb29yZHMucHVzaChzdHJlYW0ucmVhZEludDE2QkUoKSAvIDE2Mzg0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBlbmRDb29yZHMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBfYTIgPSAwOyBfYTIgPCBndmFyLmF4aXNDb3VudDsgX2EyKyspIHtcbiAgICAgICAgICBlbmRDb29yZHMucHVzaChzdHJlYW0ucmVhZEludDE2QkUoKSAvIDE2Mzg0KTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBHZXQgdGhlIGZhY3RvciBhdCB3aGljaCB0byBhcHBseSB0aGlzIHR1cGxlXG5cblxuICAgICAgdmFyIGZhY3RvciA9IHRoaXMudHVwbGVGYWN0b3IodHVwbGVJbmRleCwgdHVwbGVDb29yZHMsIHN0YXJ0Q29vcmRzLCBlbmRDb29yZHMpO1xuXG4gICAgICBpZiAoZmFjdG9yID09PSAwKSB7XG4gICAgICAgIG9mZnNldFRvRGF0YSArPSB0dXBsZURhdGFTaXplO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGhlcmUgPSBzdHJlYW0ucG9zO1xuICAgICAgc3RyZWFtLnBvcyA9IG9mZnNldFRvRGF0YTtcblxuICAgICAgaWYgKHR1cGxlSW5kZXggJiBQUklWQVRFX1BPSU5UX05VTUJFUlMpIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMuZGVjb2RlUG9pbnRzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcG9pbnRzID0gc2hhcmVkUG9pbnRzO1xuICAgICAgfSAvLyBwb2ludHMubGVuZ3RoID0gMCBtZWFucyB0aGVyZSBhcmUgZGVsdGFzIGZvciBhbGwgcG9pbnRzXG5cblxuICAgICAgdmFyIG5Qb2ludHMgPSBwb2ludHMubGVuZ3RoID09PSAwID8gZ2x5cGhQb2ludHMubGVuZ3RoIDogcG9pbnRzLmxlbmd0aDtcbiAgICAgIHZhciB4RGVsdGFzID0gdGhpcy5kZWNvZGVEZWx0YXMoblBvaW50cyk7XG4gICAgICB2YXIgeURlbHRhcyA9IHRoaXMuZGVjb2RlRGVsdGFzKG5Qb2ludHMpO1xuXG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBhbGwgcG9pbnRzXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBnbHlwaFBvaW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgcG9pbnQgPSBnbHlwaFBvaW50c1tfaV07XG4gICAgICAgICAgcG9pbnQueCArPSBNYXRoLnJvdW5kKHhEZWx0YXNbX2ldICogZmFjdG9yKTtcbiAgICAgICAgICBwb2ludC55ICs9IE1hdGgucm91bmQoeURlbHRhc1tfaV0gKiBmYWN0b3IpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb3V0UG9pbnRzID0gb3JpZ1BvaW50cy5tYXAoZnVuY3Rpb24gKHB0KSB7XG4gICAgICAgICAgcmV0dXJuIHB0LmNvcHkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBoYXNEZWx0YSA9IGdseXBoUG9pbnRzLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBwb2ludHMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgICAgIHZhciBpZHggPSBwb2ludHNbX2kyXTtcblxuICAgICAgICAgIGlmIChpZHggPCBnbHlwaFBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBfcG9pbnQgPSBvdXRQb2ludHNbaWR4XTtcbiAgICAgICAgICAgIGhhc0RlbHRhW2lkeF0gPSB0cnVlO1xuICAgICAgICAgICAgX3BvaW50LnggKz0gTWF0aC5yb3VuZCh4RGVsdGFzW19pMl0gKiBmYWN0b3IpO1xuICAgICAgICAgICAgX3BvaW50LnkgKz0gTWF0aC5yb3VuZCh5RGVsdGFzW19pMl0gKiBmYWN0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW50ZXJwb2xhdGVNaXNzaW5nRGVsdGFzKG91dFBvaW50cywgb3JpZ1BvaW50cywgaGFzRGVsdGEpO1xuXG4gICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IGdseXBoUG9pbnRzLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgICB2YXIgZGVsdGFYID0gb3V0UG9pbnRzW19pM10ueCAtIG9yaWdQb2ludHNbX2kzXS54O1xuICAgICAgICAgIHZhciBkZWx0YVkgPSBvdXRQb2ludHNbX2kzXS55IC0gb3JpZ1BvaW50c1tfaTNdLnk7XG4gICAgICAgICAgZ2x5cGhQb2ludHNbX2kzXS54ICs9IGRlbHRhWDtcbiAgICAgICAgICBnbHlwaFBvaW50c1tfaTNdLnkgKz0gZGVsdGFZO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9mZnNldFRvRGF0YSArPSB0dXBsZURhdGFTaXplO1xuICAgICAgc3RyZWFtLnBvcyA9IGhlcmU7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5kZWNvZGVQb2ludHMgPSBmdW5jdGlvbiBkZWNvZGVQb2ludHMoKSB7XG4gICAgdmFyIHN0cmVhbSA9IHRoaXMuZm9udC5zdHJlYW07XG4gICAgdmFyIGNvdW50ID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuXG4gICAgaWYgKGNvdW50ICYgUE9JTlRTX0FSRV9XT1JEUykge1xuICAgICAgY291bnQgPSAoY291bnQgJiBQT0lOVF9SVU5fQ09VTlRfTUFTSykgPDwgOCB8IHN0cmVhbS5yZWFkVUludDgoKTtcbiAgICB9XG5cbiAgICB2YXIgcG9pbnRzID0gbmV3IFVpbnQxNkFycmF5KGNvdW50KTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHBvaW50ID0gMDtcblxuICAgIHdoaWxlIChpIDwgY291bnQpIHtcbiAgICAgIHZhciBydW4gPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG4gICAgICB2YXIgcnVuQ291bnQgPSAocnVuICYgUE9JTlRfUlVOX0NPVU5UX01BU0spICsgMTtcbiAgICAgIHZhciBmbiA9IHJ1biAmIFBPSU5UU19BUkVfV09SRFMgPyBzdHJlYW0ucmVhZFVJbnQxNiA6IHN0cmVhbS5yZWFkVUludDg7XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcnVuQ291bnQgJiYgaSA8IGNvdW50OyBqKyspIHtcbiAgICAgICAgcG9pbnQgKz0gZm4uY2FsbChzdHJlYW0pO1xuICAgICAgICBwb2ludHNbaSsrXSA9IHBvaW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwb2ludHM7XG4gIH07XG5cbiAgX3Byb3RvLmRlY29kZURlbHRhcyA9IGZ1bmN0aW9uIGRlY29kZURlbHRhcyhjb3VudCkge1xuICAgIHZhciBzdHJlYW0gPSB0aGlzLmZvbnQuc3RyZWFtO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgZGVsdGFzID0gbmV3IEludDE2QXJyYXkoY291bnQpO1xuXG4gICAgd2hpbGUgKGkgPCBjb3VudCkge1xuICAgICAgdmFyIHJ1biA9IHN0cmVhbS5yZWFkVUludDgoKTtcbiAgICAgIHZhciBydW5Db3VudCA9IChydW4gJiBERUxUQV9SVU5fQ09VTlRfTUFTSykgKyAxO1xuXG4gICAgICBpZiAocnVuICYgREVMVEFTX0FSRV9aRVJPKSB7XG4gICAgICAgIGkgKz0gcnVuQ291bnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZm4gPSBydW4gJiBERUxUQVNfQVJFX1dPUkRTID8gc3RyZWFtLnJlYWRJbnQxNkJFIDogc3RyZWFtLnJlYWRJbnQ4O1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcnVuQ291bnQgJiYgaSA8IGNvdW50OyBqKyspIHtcbiAgICAgICAgICBkZWx0YXNbaSsrXSA9IGZuLmNhbGwoc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWx0YXM7XG4gIH07XG5cbiAgX3Byb3RvLnR1cGxlRmFjdG9yID0gZnVuY3Rpb24gdHVwbGVGYWN0b3IodHVwbGVJbmRleCwgdHVwbGVDb29yZHMsIHN0YXJ0Q29vcmRzLCBlbmRDb29yZHMpIHtcbiAgICB2YXIgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplZENvb3JkcztcbiAgICB2YXIgZ3ZhciA9IHRoaXMuZm9udC5ndmFyO1xuICAgIHZhciBmYWN0b3IgPSAxO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBndmFyLmF4aXNDb3VudDsgaSsrKSB7XG4gICAgICBpZiAodHVwbGVDb29yZHNbaV0gPT09IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub3JtYWxpemVkW2ldID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHR1cGxlSW5kZXggJiBJTlRFUk1FRElBVEVfVFVQTEUpID09PSAwKSB7XG4gICAgICAgIGlmIChub3JtYWxpemVkW2ldIDwgTWF0aC5taW4oMCwgdHVwbGVDb29yZHNbaV0pIHx8IG5vcm1hbGl6ZWRbaV0gPiBNYXRoLm1heCgwLCB0dXBsZUNvb3Jkc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZhY3RvciA9IChmYWN0b3IgKiBub3JtYWxpemVkW2ldICsgTnVtYmVyLkVQU0lMT04pIC8gKHR1cGxlQ29vcmRzW2ldICsgTnVtYmVyLkVQU0lMT04pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRbaV0gPCBzdGFydENvb3Jkc1tpXSB8fCBub3JtYWxpemVkW2ldID4gZW5kQ29vcmRzW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZFtpXSA8IHR1cGxlQ29vcmRzW2ldKSB7XG4gICAgICAgICAgZmFjdG9yID0gZmFjdG9yICogKG5vcm1hbGl6ZWRbaV0gLSBzdGFydENvb3Jkc1tpXSArIE51bWJlci5FUFNJTE9OKSAvICh0dXBsZUNvb3Jkc1tpXSAtIHN0YXJ0Q29vcmRzW2ldICsgTnVtYmVyLkVQU0lMT04pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZhY3RvciA9IGZhY3RvciAqIChlbmRDb29yZHNbaV0gLSBub3JtYWxpemVkW2ldICsgTnVtYmVyLkVQU0lMT04pIC8gKGVuZENvb3Jkc1tpXSAtIHR1cGxlQ29vcmRzW2ldICsgTnVtYmVyLkVQU0lMT04pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhY3RvcjtcbiAgfSAvLyBJbnRlcnBvbGF0ZXMgcG9pbnRzIHdpdGhvdXQgZGVsdGEgdmFsdWVzLlxuICAvLyBOZWVkZWQgZm9yIHRoZSDDmCBhbmQgUSBnbHlwaHMgaW4gU2tpYS5cbiAgLy8gQWxnb3JpdGhtIGZyb20gRnJlZXR5cGUuXG4gIDtcblxuICBfcHJvdG8uaW50ZXJwb2xhdGVNaXNzaW5nRGVsdGFzID0gZnVuY3Rpb24gaW50ZXJwb2xhdGVNaXNzaW5nRGVsdGFzKHBvaW50cywgaW5Qb2ludHMsIGhhc0RlbHRhKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcG9pbnQgPSAwO1xuXG4gICAgd2hpbGUgKHBvaW50IDwgcG9pbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIGZpcnN0UG9pbnQgPSBwb2ludDsgLy8gZmluZCB0aGUgZW5kIHBvaW50IG9mIHRoZSBjb250b3VyXG5cbiAgICAgIHZhciBlbmRQb2ludCA9IHBvaW50O1xuICAgICAgdmFyIHB0ID0gcG9pbnRzW2VuZFBvaW50XTtcblxuICAgICAgd2hpbGUgKCFwdC5lbmRDb250b3VyKSB7XG4gICAgICAgIHB0ID0gcG9pbnRzWysrZW5kUG9pbnRdO1xuICAgICAgfSAvLyBmaW5kIHRoZSBmaXJzdCBwb2ludCB0aGF0IGhhcyBhIGRlbHRhXG5cblxuICAgICAgd2hpbGUgKHBvaW50IDw9IGVuZFBvaW50ICYmICFoYXNEZWx0YVtwb2ludF0pIHtcbiAgICAgICAgcG9pbnQrKztcbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ID4gZW5kUG9pbnQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaXJzdERlbHRhID0gcG9pbnQ7XG4gICAgICB2YXIgY3VyRGVsdGEgPSBwb2ludDtcbiAgICAgIHBvaW50Kys7XG5cbiAgICAgIHdoaWxlIChwb2ludCA8PSBlbmRQb2ludCkge1xuICAgICAgICAvLyBmaW5kIHRoZSBuZXh0IHBvaW50IHdpdGggYSBkZWx0YSwgYW5kIGludGVycG9sYXRlIGludGVybWVkaWF0ZSBwb2ludHNcbiAgICAgICAgaWYgKGhhc0RlbHRhW3BvaW50XSkge1xuICAgICAgICAgIHRoaXMuZGVsdGFJbnRlcnBvbGF0ZShjdXJEZWx0YSArIDEsIHBvaW50IC0gMSwgY3VyRGVsdGEsIHBvaW50LCBpblBvaW50cywgcG9pbnRzKTtcbiAgICAgICAgICBjdXJEZWx0YSA9IHBvaW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcG9pbnQrKztcbiAgICAgIH0gLy8gc2hpZnQgY29udG91ciBpZiB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgZGVsdGFcblxuXG4gICAgICBpZiAoY3VyRGVsdGEgPT09IGZpcnN0RGVsdGEpIHtcbiAgICAgICAgdGhpcy5kZWx0YVNoaWZ0KGZpcnN0UG9pbnQsIGVuZFBvaW50LCBjdXJEZWx0YSwgaW5Qb2ludHMsIHBvaW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UsIGhhbmRsZSB0aGUgcmVtYWluaW5nIHBvaW50cyBhdCB0aGUgZW5kIGFuZCBiZWdpbm5pbmcgb2YgdGhlIGNvbnRvdXJcbiAgICAgICAgdGhpcy5kZWx0YUludGVycG9sYXRlKGN1ckRlbHRhICsgMSwgZW5kUG9pbnQsIGN1ckRlbHRhLCBmaXJzdERlbHRhLCBpblBvaW50cywgcG9pbnRzKTtcblxuICAgICAgICBpZiAoZmlyc3REZWx0YSA+IDApIHtcbiAgICAgICAgICB0aGlzLmRlbHRhSW50ZXJwb2xhdGUoZmlyc3RQb2ludCwgZmlyc3REZWx0YSAtIDEsIGN1ckRlbHRhLCBmaXJzdERlbHRhLCBpblBvaW50cywgcG9pbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwb2ludCA9IGVuZFBvaW50ICsgMTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmRlbHRhSW50ZXJwb2xhdGUgPSBmdW5jdGlvbiBkZWx0YUludGVycG9sYXRlKHAxLCBwMiwgcmVmMSwgcmVmMiwgaW5Qb2ludHMsIG91dFBvaW50cykge1xuICAgIGlmIChwMSA+IHAyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGl0ZXJhYmxlID0gWyd4JywgJ3knXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlcmFibGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrID0gaXRlcmFibGVbaV07XG5cbiAgICAgIGlmIChpblBvaW50c1tyZWYxXVtrXSA+IGluUG9pbnRzW3JlZjJdW2tdKSB7XG4gICAgICAgIHZhciBwID0gcmVmMTtcbiAgICAgICAgcmVmMSA9IHJlZjI7XG4gICAgICAgIHJlZjIgPSBwO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW4xID0gaW5Qb2ludHNbcmVmMV1ba107XG4gICAgICB2YXIgaW4yID0gaW5Qb2ludHNbcmVmMl1ba107XG4gICAgICB2YXIgb3V0MSA9IG91dFBvaW50c1tyZWYxXVtrXTtcbiAgICAgIHZhciBvdXQyID0gb3V0UG9pbnRzW3JlZjJdW2tdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIHBvaW50cyBoYXZlIHRoZSBzYW1lIGNvb3JkaW5hdGUgYnV0IGRpZmZlcmVudFxuICAgICAgLy8gZGVsdGEsIGluZmVycmVkIGRlbHRhIGlzIHplcm8uICBPdGhlcndpc2UgaW50ZXJwb2xhdGUuXG5cbiAgICAgIGlmIChpbjEgIT09IGluMiB8fCBvdXQxID09PSBvdXQyKSB7XG4gICAgICAgIHZhciBzY2FsZSA9IGluMSA9PT0gaW4yID8gMCA6IChvdXQyIC0gb3V0MSkgLyAoaW4yIC0gaW4xKTtcblxuICAgICAgICBmb3IgKHZhciBfcCA9IHAxOyBfcCA8PSBwMjsgX3ArKykge1xuICAgICAgICAgIHZhciBvdXQgPSBpblBvaW50c1tfcF1ba107XG5cbiAgICAgICAgICBpZiAob3V0IDw9IGluMSkge1xuICAgICAgICAgICAgb3V0ICs9IG91dDEgLSBpbjE7XG4gICAgICAgICAgfSBlbHNlIGlmIChvdXQgPj0gaW4yKSB7XG4gICAgICAgICAgICBvdXQgKz0gb3V0MiAtIGluMjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0ID0gb3V0MSArIChvdXQgLSBpbjEpICogc2NhbGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb3V0UG9pbnRzW19wXVtrXSA9IG91dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZGVsdGFTaGlmdCA9IGZ1bmN0aW9uIGRlbHRhU2hpZnQocDEsIHAyLCByZWYsIGluUG9pbnRzLCBvdXRQb2ludHMpIHtcbiAgICB2YXIgZGVsdGFYID0gb3V0UG9pbnRzW3JlZl0ueCAtIGluUG9pbnRzW3JlZl0ueDtcbiAgICB2YXIgZGVsdGFZID0gb3V0UG9pbnRzW3JlZl0ueSAtIGluUG9pbnRzW3JlZl0ueTtcblxuICAgIGlmIChkZWx0YVggPT09IDAgJiYgZGVsdGFZID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCA9IHAxOyBwIDw9IHAyOyBwKyspIHtcbiAgICAgIGlmIChwICE9PSByZWYpIHtcbiAgICAgICAgb3V0UG9pbnRzW3BdLnggKz0gZGVsdGFYO1xuICAgICAgICBvdXRQb2ludHNbcF0ueSArPSBkZWx0YVk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5nZXRBZHZhbmNlQWRqdXN0bWVudCA9IGZ1bmN0aW9uIGdldEFkdmFuY2VBZGp1c3RtZW50KGdpZCwgdGFibGUpIHtcbiAgICB2YXIgb3V0ZXJJbmRleCwgaW5uZXJJbmRleDtcblxuICAgIGlmICh0YWJsZS5hZHZhbmNlV2lkdGhNYXBwaW5nKSB7XG4gICAgICB2YXIgaWR4ID0gZ2lkO1xuXG4gICAgICBpZiAoaWR4ID49IHRhYmxlLmFkdmFuY2VXaWR0aE1hcHBpbmcubWFwQ291bnQpIHtcbiAgICAgICAgaWR4ID0gdGFibGUuYWR2YW5jZVdpZHRoTWFwcGluZy5tYXBDb3VudCAtIDE7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbnRyeUZvcm1hdCA9IHRhYmxlLmFkdmFuY2VXaWR0aE1hcHBpbmcuZW50cnlGb3JtYXQ7XG4gICAgICB2YXIgX3RhYmxlJGFkdmFuY2VXaWR0aE1hID0gdGFibGUuYWR2YW5jZVdpZHRoTWFwcGluZy5tYXBEYXRhW2lkeF07XG4gICAgICBvdXRlckluZGV4ID0gX3RhYmxlJGFkdmFuY2VXaWR0aE1hLm91dGVySW5kZXg7XG4gICAgICBpbm5lckluZGV4ID0gX3RhYmxlJGFkdmFuY2VXaWR0aE1hLmlubmVySW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dGVySW5kZXggPSAwO1xuICAgICAgaW5uZXJJbmRleCA9IGdpZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXREZWx0YSh0YWJsZS5pdGVtVmFyaWF0aW9uU3RvcmUsIG91dGVySW5kZXgsIGlubmVySW5kZXgpO1xuICB9IC8vIFNlZSBwc2V1ZG8gY29kZSBmcm9tIGBGb250IFZhcmlhdGlvbnMgT3ZlcnZpZXcnXG4gIC8vIGluIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLlxuICA7XG5cbiAgX3Byb3RvLmdldERlbHRhID0gZnVuY3Rpb24gZ2V0RGVsdGEoaXRlbVN0b3JlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KSB7XG4gICAgaWYgKG91dGVySW5kZXggPj0gaXRlbVN0b3JlLml0ZW1WYXJpYXRpb25EYXRhLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgdmFyIHZhckRhdGEgPSBpdGVtU3RvcmUuaXRlbVZhcmlhdGlvbkRhdGFbb3V0ZXJJbmRleF07XG5cbiAgICBpZiAoaW5uZXJJbmRleCA+PSB2YXJEYXRhLmRlbHRhU2V0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHZhciBkZWx0YVNldCA9IHZhckRhdGEuZGVsdGFTZXRzW2lubmVySW5kZXhdO1xuICAgIHZhciBibGVuZFZlY3RvciA9IHRoaXMuZ2V0QmxlbmRWZWN0b3IoaXRlbVN0b3JlLCBvdXRlckluZGV4KTtcbiAgICB2YXIgbmV0QWRqdXN0bWVudCA9IDA7XG5cbiAgICBmb3IgKHZhciBtYXN0ZXIgPSAwOyBtYXN0ZXIgPCB2YXJEYXRhLnJlZ2lvbkluZGV4Q291bnQ7IG1hc3RlcisrKSB7XG4gICAgICBuZXRBZGp1c3RtZW50ICs9IGRlbHRhU2V0LmRlbHRhc1ttYXN0ZXJdICogYmxlbmRWZWN0b3JbbWFzdGVyXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV0QWRqdXN0bWVudDtcbiAgfTtcblxuICBfcHJvdG8uZ2V0QmxlbmRWZWN0b3IgPSBmdW5jdGlvbiBnZXRCbGVuZFZlY3RvcihpdGVtU3RvcmUsIG91dGVySW5kZXgpIHtcbiAgICB2YXIgdmFyRGF0YSA9IGl0ZW1TdG9yZS5pdGVtVmFyaWF0aW9uRGF0YVtvdXRlckluZGV4XTtcblxuICAgIGlmICh0aGlzLmJsZW5kVmVjdG9ycy5oYXModmFyRGF0YSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsZW5kVmVjdG9ycy5nZXQodmFyRGF0YSk7XG4gICAgfVxuXG4gICAgdmFyIG5vcm1hbGl6ZWRDb29yZHMgPSB0aGlzLm5vcm1hbGl6ZWRDb29yZHM7XG4gICAgdmFyIGJsZW5kVmVjdG9yID0gW107IC8vIG91dGVyIGxvb3Agc3RlcHMgdGhyb3VnaCBtYXN0ZXIgZGVzaWducyB0byBiZSBibGVuZGVkXG5cbiAgICBmb3IgKHZhciBtYXN0ZXIgPSAwOyBtYXN0ZXIgPCB2YXJEYXRhLnJlZ2lvbkluZGV4Q291bnQ7IG1hc3RlcisrKSB7XG4gICAgICB2YXIgc2NhbGFyID0gMTtcbiAgICAgIHZhciByZWdpb25JbmRleCA9IHZhckRhdGEucmVnaW9uSW5kZXhlc1ttYXN0ZXJdO1xuICAgICAgdmFyIGF4ZXMgPSBpdGVtU3RvcmUudmFyaWF0aW9uUmVnaW9uTGlzdC52YXJpYXRpb25SZWdpb25zW3JlZ2lvbkluZGV4XTsgLy8gaW5uZXIgbG9vcCBzdGVwcyB0aHJvdWdoIGF4ZXMgaW4gdGhpcyByZWdpb25cblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBheGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBheGlzID0gYXhlc1tqXTtcbiAgICAgICAgdmFyIGF4aXNTY2FsYXIgPSB2b2lkIDA7IC8vIGNvbXB1dGUgdGhlIHNjYWxhciBjb250cmlidXRpb24gb2YgdGhpcyBheGlzXG4gICAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIHJhbmdlc1xuXG4gICAgICAgIGlmIChheGlzLnN0YXJ0Q29vcmQgPiBheGlzLnBlYWtDb29yZCB8fCBheGlzLnBlYWtDb29yZCA+IGF4aXMuZW5kQ29vcmQpIHtcbiAgICAgICAgICBheGlzU2NhbGFyID0gMTtcbiAgICAgICAgfSBlbHNlIGlmIChheGlzLnN0YXJ0Q29vcmQgPCAwICYmIGF4aXMuZW5kQ29vcmQgPiAwICYmIGF4aXMucGVha0Nvb3JkICE9PSAwKSB7XG4gICAgICAgICAgYXhpc1NjYWxhciA9IDE7IC8vIHBlYWsgb2YgMCBtZWFucyBpZ25vcmUgdGhpcyBheGlzXG4gICAgICAgIH0gZWxzZSBpZiAoYXhpcy5wZWFrQ29vcmQgPT09IDApIHtcbiAgICAgICAgICBheGlzU2NhbGFyID0gMTsgLy8gaWdub3JlIHRoaXMgcmVnaW9uIGlmIGNvb3JkcyBhcmUgb3V0IG9mIHJhbmdlXG4gICAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZENvb3Jkc1tqXSA8IGF4aXMuc3RhcnRDb29yZCB8fCBub3JtYWxpemVkQ29vcmRzW2pdID4gYXhpcy5lbmRDb29yZCkge1xuICAgICAgICAgIGF4aXNTY2FsYXIgPSAwOyAvLyBjYWxjdWxhdGUgYSBwcm9wb3J0aW9uYWwgZmFjdG9yXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG5vcm1hbGl6ZWRDb29yZHNbal0gPT09IGF4aXMucGVha0Nvb3JkKSB7XG4gICAgICAgICAgICBheGlzU2NhbGFyID0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRDb29yZHNbal0gPCBheGlzLnBlYWtDb29yZCkge1xuICAgICAgICAgICAgYXhpc1NjYWxhciA9IChub3JtYWxpemVkQ29vcmRzW2pdIC0gYXhpcy5zdGFydENvb3JkICsgTnVtYmVyLkVQU0lMT04pIC8gKGF4aXMucGVha0Nvb3JkIC0gYXhpcy5zdGFydENvb3JkICsgTnVtYmVyLkVQU0lMT04pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBheGlzU2NhbGFyID0gKGF4aXMuZW5kQ29vcmQgLSBub3JtYWxpemVkQ29vcmRzW2pdICsgTnVtYmVyLkVQU0lMT04pIC8gKGF4aXMuZW5kQ29vcmQgLSBheGlzLnBlYWtDb29yZCArIE51bWJlci5FUFNJTE9OKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gdGFrZSBwcm9kdWN0IG9mIGFsbCB0aGUgYXhpcyBzY2FsYXJzXG5cblxuICAgICAgICBzY2FsYXIgKj0gYXhpc1NjYWxhcjtcbiAgICAgIH1cblxuICAgICAgYmxlbmRWZWN0b3JbbWFzdGVyXSA9IHNjYWxhcjtcbiAgICB9XG5cbiAgICB0aGlzLmJsZW5kVmVjdG9ycy5zZXQodmFyRGF0YSwgYmxlbmRWZWN0b3IpO1xuICAgIHJldHVybiBibGVuZFZlY3RvcjtcbiAgfTtcblxuICByZXR1cm4gR2x5cGhWYXJpYXRpb25Qcm9jZXNzb3I7XG59KCk7XG5cbnZhciBjbG9uZV8xID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICB2YXIgY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ2xvbmVzIChjb3BpZXMpIGFuIE9iamVjdCB1c2luZyBkZWVwIGNvcHlpbmcuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGNpcmN1bGFyIHJlZmVyZW5jZXMgYnkgZGVmYXVsdCwgYnV0IGlmIHlvdSBhcmUgY2VydGFpblxuICAgICAqIHRoZXJlIGFyZSBubyBjaXJjdWxhciByZWZlcmVuY2VzIGluIHlvdXIgb2JqZWN0LCB5b3UgY2FuIHNhdmUgc29tZSBDUFUgdGltZVxuICAgICAqIGJ5IGNhbGxpbmcgY2xvbmUob2JqLCBmYWxzZSkuXG4gICAgICpcbiAgICAgKiBDYXV0aW9uOiBpZiBgY2lyY3VsYXJgIGlzIGZhbHNlIGFuZCBgcGFyZW50YCBjb250YWlucyBjaXJjdWxhciByZWZlcmVuY2VzLFxuICAgICAqIHlvdXIgcHJvZ3JhbSBtYXkgZW50ZXIgYW4gaW5maW5pdGUgbG9vcCBhbmQgY3Jhc2guXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYHBhcmVudGAgLSB0aGUgb2JqZWN0IHRvIGJlIGNsb25lZFxuICAgICAqIEBwYXJhbSBgY2lyY3VsYXJgIC0gc2V0IHRvIHRydWUgaWYgdGhlIG9iamVjdCB0byBiZSBjbG9uZWQgbWF5IGNvbnRhaW5cbiAgICAgKiAgICBjaXJjdWxhciByZWZlcmVuY2VzLiAob3B0aW9uYWwgLSB0cnVlIGJ5IGRlZmF1bHQpXG4gICAgICogQHBhcmFtIGBkZXB0aGAgLSBzZXQgdG8gYSBudW1iZXIgaWYgdGhlIG9iamVjdCBpcyBvbmx5IHRvIGJlIGNsb25lZCB0b1xuICAgICAqICAgIGEgcGFydGljdWxhciBkZXB0aC4gKG9wdGlvbmFsIC0gZGVmYXVsdHMgdG8gSW5maW5pdHkpXG4gICAgICogQHBhcmFtIGBwcm90b3R5cGVgIC0gc2V0cyB0aGUgcHJvdG90eXBlIHRvIGJlIHVzZWQgd2hlbiBjbG9uaW5nIGFuIG9iamVjdC5cbiAgICAgKiAgICAob3B0aW9uYWwgLSBkZWZhdWx0cyB0byBwYXJlbnQgcHJvdG90eXBlKS5cbiAgICAqL1xuXG4gICAgZnVuY3Rpb24gY2xvbmUocGFyZW50LCBjaXJjdWxhciwgZGVwdGgsIHByb3RvdHlwZSkge1xuICAgICAgdmFyIGZpbHRlcjtcblxuICAgICAgaWYgKHR5cGVvZiBjaXJjdWxhciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZGVwdGggPSBjaXJjdWxhci5kZXB0aDtcbiAgICAgICAgcHJvdG90eXBlID0gY2lyY3VsYXIucHJvdG90eXBlO1xuICAgICAgICBmaWx0ZXIgPSBjaXJjdWxhci5maWx0ZXI7XG4gICAgICAgIGNpcmN1bGFyID0gY2lyY3VsYXIuY2lyY3VsYXI7XG4gICAgICB9IC8vIG1haW50YWluIHR3byBhcnJheXMgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMsIHdoZXJlIGNvcnJlc3BvbmRpbmcgcGFyZW50c1xuICAgICAgLy8gYW5kIGNoaWxkcmVuIGhhdmUgdGhlIHNhbWUgaW5kZXhcblxuXG4gICAgICB2YXIgYWxsUGFyZW50cyA9IFtdO1xuICAgICAgdmFyIGFsbENoaWxkcmVuID0gW107XG4gICAgICB2YXIgdXNlQnVmZmVyID0gdHlwZW9mIGJ1ZmZlcl8xICE9ICd1bmRlZmluZWQnO1xuICAgICAgaWYgKHR5cGVvZiBjaXJjdWxhciA9PSAndW5kZWZpbmVkJykgY2lyY3VsYXIgPSB0cnVlO1xuICAgICAgaWYgKHR5cGVvZiBkZXB0aCA9PSAndW5kZWZpbmVkJykgZGVwdGggPSBJbmZpbml0eTsgLy8gcmVjdXJzZSB0aGlzIGZ1bmN0aW9uIHNvIHdlIGRvbid0IHJlc2V0IGFsbFBhcmVudHMgYW5kIGFsbENoaWxkcmVuXG5cbiAgICAgIGZ1bmN0aW9uIF9jbG9uZShwYXJlbnQsIGRlcHRoKSB7XG4gICAgICAgIC8vIGNsb25pbmcgbnVsbCBhbHdheXMgcmV0dXJucyBudWxsXG4gICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoZGVwdGggPT0gMCkgcmV0dXJuIHBhcmVudDtcbiAgICAgICAgdmFyIGNoaWxkO1xuICAgICAgICB2YXIgcHJvdG87XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXJlbnQgIT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsb25lLl9faXNBcnJheShwYXJlbnQpKSB7XG4gICAgICAgICAgY2hpbGQgPSBbXTtcbiAgICAgICAgfSBlbHNlIGlmIChjbG9uZS5fX2lzUmVnRXhwKHBhcmVudCkpIHtcbiAgICAgICAgICBjaGlsZCA9IG5ldyBSZWdFeHAocGFyZW50LnNvdXJjZSwgX19nZXRSZWdFeHBGbGFncyhwYXJlbnQpKTtcbiAgICAgICAgICBpZiAocGFyZW50Lmxhc3RJbmRleCkgY2hpbGQubGFzdEluZGV4ID0gcGFyZW50Lmxhc3RJbmRleDtcbiAgICAgICAgfSBlbHNlIGlmIChjbG9uZS5fX2lzRGF0ZShwYXJlbnQpKSB7XG4gICAgICAgICAgY2hpbGQgPSBuZXcgRGF0ZShwYXJlbnQuZ2V0VGltZSgpKTtcbiAgICAgICAgfSBlbHNlIGlmICh1c2VCdWZmZXIgJiYgYnVmZmVyXzEuaXNCdWZmZXIocGFyZW50KSkge1xuICAgICAgICAgIGlmIChidWZmZXJfMS5hbGxvY1Vuc2FmZSkge1xuICAgICAgICAgICAgLy8gTm9kZS5qcyA+PSA0LjUuMFxuICAgICAgICAgICAgY2hpbGQgPSBidWZmZXJfMS5hbGxvY1Vuc2FmZShwYXJlbnQubGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT2xkZXIgTm9kZS5qcyB2ZXJzaW9uc1xuICAgICAgICAgICAgY2hpbGQgPSBuZXcgYnVmZmVyXzEocGFyZW50Lmxlbmd0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFyZW50LmNvcHkoY2hpbGQpO1xuICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHByb3RvdHlwZSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGFyZW50KTtcbiAgICAgICAgICAgIGNoaWxkID0gT2JqZWN0LmNyZWF0ZShwcm90byk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkID0gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgICAgICAgcHJvdG8gPSBwcm90b3R5cGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNpcmN1bGFyKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gYWxsUGFyZW50cy5pbmRleE9mKHBhcmVudCk7XG5cbiAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxDaGlsZHJlbltpbmRleF07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWxsUGFyZW50cy5wdXNoKHBhcmVudCk7XG4gICAgICAgICAgYWxsQ2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpIGluIHBhcmVudCkge1xuICAgICAgICAgIHZhciBhdHRycztcblxuICAgICAgICAgIGlmIChwcm90bykge1xuICAgICAgICAgICAgYXR0cnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXR0cnMgJiYgYXR0cnMuc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoaWxkW2ldID0gX2Nsb25lKHBhcmVudFtpXSwgZGVwdGggLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9jbG9uZShwYXJlbnQsIGRlcHRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGxlIGZsYXQgY2xvbmUgdXNpbmcgcHJvdG90eXBlLCBhY2NlcHRzIG9ubHkgb2JqZWN0cywgdXNlZnVsbCBmb3IgcHJvcGVydHlcbiAgICAgKiBvdmVycmlkZSBvbiBGTEFUIGNvbmZpZ3VyYXRpb24gb2JqZWN0IChubyBuZXN0ZWQgcHJvcHMpLlxuICAgICAqXG4gICAgICogVVNFIFdJVEggQ0FVVElPTiEgVGhpcyBtYXkgbm90IGJlaGF2ZSBhcyB5b3Ugd2lzaCBpZiB5b3UgZG8gbm90IGtub3cgaG93IHRoaXNcbiAgICAgKiB3b3Jrcy5cbiAgICAgKi9cblxuXG4gICAgY2xvbmUuY2xvbmVQcm90b3R5cGUgPSBmdW5jdGlvbiBjbG9uZVByb3RvdHlwZShwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gICAgICB2YXIgYyA9IGZ1bmN0aW9uIGMoKSB7fTtcblxuICAgICAgYy5wcm90b3R5cGUgPSBwYXJlbnQ7XG4gICAgICByZXR1cm4gbmV3IGMoKTtcbiAgICB9OyAvLyBwcml2YXRlIHV0aWxpdHkgZnVuY3Rpb25zXG5cblxuICAgIGZ1bmN0aW9uIF9fb2JqVG9TdHIobykge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbiAgICB9XG4gICAgY2xvbmUuX19vYmpUb1N0ciA9IF9fb2JqVG9TdHI7XG5cbiAgICBmdW5jdGlvbiBfX2lzRGF0ZShvKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdvYmplY3QnICYmIF9fb2JqVG9TdHIobykgPT09ICdbb2JqZWN0IERhdGVdJztcbiAgICB9XG4gICAgY2xvbmUuX19pc0RhdGUgPSBfX2lzRGF0ZTtcblxuICAgIGZ1bmN0aW9uIF9faXNBcnJheShvKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdvYmplY3QnICYmIF9fb2JqVG9TdHIobykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuICAgIGNsb25lLl9faXNBcnJheSA9IF9faXNBcnJheTtcblxuICAgIGZ1bmN0aW9uIF9faXNSZWdFeHAobykge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJiBfX29ialRvU3RyKG8pID09PSAnW29iamVjdCBSZWdFeHBdJztcbiAgICB9XG4gICAgY2xvbmUuX19pc1JlZ0V4cCA9IF9faXNSZWdFeHA7XG5cbiAgICBmdW5jdGlvbiBfX2dldFJlZ0V4cEZsYWdzKHJlKSB7XG4gICAgICB2YXIgZmxhZ3MgPSAnJztcbiAgICAgIGlmIChyZS5nbG9iYWwpIGZsYWdzICs9ICdnJztcbiAgICAgIGlmIChyZS5pZ25vcmVDYXNlKSBmbGFncyArPSAnaSc7XG4gICAgICBpZiAocmUubXVsdGlsaW5lKSBmbGFncyArPSAnbSc7XG4gICAgICByZXR1cm4gZmxhZ3M7XG4gICAgfVxuICAgIGNsb25lLl9fZ2V0UmVnRXhwRmxhZ3MgPSBfX2dldFJlZ0V4cEZsYWdzO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfSgpO1xuXG4gIGlmICggbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGNsb25lO1xuICB9XG59KTtcblxudmFyIFN1YnNldCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFN1YnNldChmb250KSB7XG4gICAgdGhpcy5mb250ID0gZm9udDtcbiAgICB0aGlzLmdseXBocyA9IFtdO1xuICAgIHRoaXMubWFwcGluZyA9IHt9OyAvLyBhbHdheXMgaW5jbHVkZSB0aGUgbWlzc2luZyBnbHlwaFxuXG4gICAgdGhpcy5pbmNsdWRlR2x5cGgoMCk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU3Vic2V0LnByb3RvdHlwZTtcblxuICBfcHJvdG8uaW5jbHVkZUdseXBoID0gZnVuY3Rpb24gaW5jbHVkZUdseXBoKGdseXBoKSB7XG4gICAgaWYgKHR5cGVvZiBnbHlwaCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGdseXBoID0gZ2x5cGguaWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFwcGluZ1tnbHlwaF0gPT0gbnVsbCkge1xuICAgICAgdGhpcy5nbHlwaHMucHVzaChnbHlwaCk7XG4gICAgICB0aGlzLm1hcHBpbmdbZ2x5cGhdID0gdGhpcy5nbHlwaHMubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tYXBwaW5nW2dseXBoXTtcbiAgfTtcblxuICBfcHJvdG8uZW5jb2RlU3RyZWFtID0gZnVuY3Rpb24gZW5jb2RlU3RyZWFtKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgcyA9IG5ldyByZXN0cnVjdHVyZS5FbmNvZGVTdHJlYW0oKTtcbiAgICBuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5lbmNvZGUocyk7XG5cbiAgICAgIHJldHVybiBzLmVuZCgpO1xuICAgIH0pO1xuICAgIHJldHVybiBzO1xuICB9O1xuXG4gIHJldHVybiBTdWJzZXQ7XG59KCk7XG5cbnZhciBPTl9DVVJWRSQxID0gMSA8PCAwO1xudmFyIFhfU0hPUlRfVkVDVE9SJDEgPSAxIDw8IDE7XG52YXIgWV9TSE9SVF9WRUNUT1IkMSA9IDEgPDwgMjtcbnZhciBSRVBFQVQkMSA9IDEgPDwgMztcbnZhciBTQU1FX1gkMSA9IDEgPDwgNDtcbnZhciBTQU1FX1kkMSA9IDEgPDwgNTtcblxudmFyIFBvaW50JDEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQb2ludCgpIHt9XG5cbiAgUG9pbnQuc2l6ZSA9IGZ1bmN0aW9uIHNpemUodmFsKSB7XG4gICAgcmV0dXJuIHZhbCA+PSAwICYmIHZhbCA8PSAyNTUgPyAxIDogMjtcbiAgfTtcblxuICBQb2ludC5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyZWFtLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDI1NSkge1xuICAgICAgc3RyZWFtLndyaXRlVUludDgodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW0ud3JpdGVJbnQxNkJFKHZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFBvaW50O1xufSgpO1xuXG52YXIgR2x5ZiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBudW1iZXJPZkNvbnRvdXJzOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gaWYgbmVnYXRpdmUsIHRoaXMgaXMgYSBjb21wb3NpdGUgZ2x5cGhcbiAgeE1pbjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHlNaW46IHJlc3RydWN0dXJlLmludDE2LFxuICB4TWF4OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgeU1heDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIGVuZFB0c09mQ29udG91cnM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdudW1iZXJPZkNvbnRvdXJzJyksXG4gIGluc3RydWN0aW9uczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCByZXN0cnVjdHVyZS51aW50MTYpLFxuICBmbGFnczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCAwKSxcbiAgeFBvaW50czogbmV3IHJlc3RydWN0dXJlLkFycmF5KFBvaW50JDEsIDApLFxuICB5UG9pbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoUG9pbnQkMSwgMClcbn0pO1xuLyoqXG4gKiBFbmNvZGVzIFRydWVUeXBlIGdseXBoIG91dGxpbmVzXG4gKi9cblxudmFyIFRURkdseXBoRW5jb2RlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRURkdseXBoRW5jb2RlcigpIHt9XG5cbiAgdmFyIF9wcm90byA9IFRURkdseXBoRW5jb2Rlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmVuY29kZVNpbXBsZSA9IGZ1bmN0aW9uIGVuY29kZVNpbXBsZShwYXRoLCBpbnN0cnVjdGlvbnMpIHtcbiAgICBpZiAoaW5zdHJ1Y3Rpb25zID09PSB2b2lkIDApIHtcbiAgICAgIGluc3RydWN0aW9ucyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBlbmRQdHNPZkNvbnRvdXJzID0gW107XG4gICAgdmFyIHhQb2ludHMgPSBbXTtcbiAgICB2YXIgeVBvaW50cyA9IFtdO1xuICAgIHZhciBmbGFncyA9IFtdO1xuICAgIHZhciBzYW1lID0gMDtcbiAgICB2YXIgbGFzdFggPSAwLFxuICAgICAgICBsYXN0WSA9IDAsXG4gICAgICAgIGxhc3RGbGFnID0gMDtcbiAgICB2YXIgcG9pbnRDb3VudCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGguY29tbWFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gcGF0aC5jb21tYW5kc1tpXTtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjLmFyZ3MubGVuZ3RoOyBqICs9IDIpIHtcbiAgICAgICAgdmFyIHggPSBjLmFyZ3Nbal07XG4gICAgICAgIHZhciB5ID0gYy5hcmdzW2ogKyAxXTtcbiAgICAgICAgdmFyIGZsYWcgPSAwOyAvLyBJZiB0aGUgZW5kaW5nIHBvaW50IG9mIGEgcXVhZHJhdGljIGN1cnZlIGlzIHRoZSBtaWRwb2ludFxuICAgICAgICAvLyBiZXR3ZWVuIHRoZSBjb250cm9sIHBvaW50IGFuZCB0aGUgY29udHJvbCBwb2ludCBvZiB0aGUgbmV4dFxuICAgICAgICAvLyBxdWFkcmF0aWMgY3VydmUsIHdlIGNhbiBvbWl0IHRoZSBlbmRpbmcgcG9pbnQuXG5cbiAgICAgICAgaWYgKGMuY29tbWFuZCA9PT0gJ3F1YWRyYXRpY0N1cnZlVG8nICYmIGogPT09IDIpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IHBhdGguY29tbWFuZHNbaSArIDFdO1xuXG4gICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5jb21tYW5kID09PSAncXVhZHJhdGljQ3VydmVUbycpIHtcbiAgICAgICAgICAgIHZhciBtaWRYID0gKGxhc3RYICsgbmV4dC5hcmdzWzBdKSAvIDI7XG4gICAgICAgICAgICB2YXIgbWlkWSA9IChsYXN0WSArIG5leHQuYXJnc1sxXSkgLyAyO1xuXG4gICAgICAgICAgICBpZiAoeCA9PT0gbWlkWCAmJiB5ID09PSBtaWRZKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBBbGwgcG9pbnRzIGV4Y2VwdCBjb250cm9sIHBvaW50cyBhcmUgb24gY3VydmUuXG5cblxuICAgICAgICBpZiAoIShjLmNvbW1hbmQgPT09ICdxdWFkcmF0aWNDdXJ2ZVRvJyAmJiBqID09PSAwKSkge1xuICAgICAgICAgIGZsYWcgfD0gT05fQ1VSVkUkMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZsYWcgPSB0aGlzLl9lbmNvZGVQb2ludCh4LCBsYXN0WCwgeFBvaW50cywgZmxhZywgWF9TSE9SVF9WRUNUT1IkMSwgU0FNRV9YJDEpO1xuICAgICAgICBmbGFnID0gdGhpcy5fZW5jb2RlUG9pbnQoeSwgbGFzdFksIHlQb2ludHMsIGZsYWcsIFlfU0hPUlRfVkVDVE9SJDEsIFNBTUVfWSQxKTtcblxuICAgICAgICBpZiAoZmxhZyA9PT0gbGFzdEZsYWcgJiYgc2FtZSA8IDI1NSkge1xuICAgICAgICAgIGZsYWdzW2ZsYWdzLmxlbmd0aCAtIDFdIHw9IFJFUEVBVCQxO1xuICAgICAgICAgIHNhbWUrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc2FtZSA+IDApIHtcbiAgICAgICAgICAgIGZsYWdzLnB1c2goc2FtZSk7XG4gICAgICAgICAgICBzYW1lID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmbGFncy5wdXNoKGZsYWcpO1xuICAgICAgICAgIGxhc3RGbGFnID0gZmxhZztcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RYID0geDtcbiAgICAgICAgbGFzdFkgPSB5O1xuICAgICAgICBwb2ludENvdW50Kys7XG4gICAgICB9XG5cbiAgICAgIGlmIChjLmNvbW1hbmQgPT09ICdjbG9zZVBhdGgnKSB7XG4gICAgICAgIGVuZFB0c09mQ29udG91cnMucHVzaChwb2ludENvdW50IC0gMSk7XG4gICAgICB9XG4gICAgfSAvLyBDbG9zZSB0aGUgcGF0aCBpZiB0aGUgbGFzdCBjb21tYW5kIGRpZG4ndCBhbHJlYWR5XG5cblxuICAgIGlmIChwYXRoLmNvbW1hbmRzLmxlbmd0aCA+IDEgJiYgcGF0aC5jb21tYW5kc1twYXRoLmNvbW1hbmRzLmxlbmd0aCAtIDFdLmNvbW1hbmQgIT09ICdjbG9zZVBhdGgnKSB7XG4gICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2gocG9pbnRDb3VudCAtIDEpO1xuICAgIH1cblxuICAgIHZhciBiYm94ID0gcGF0aC5iYm94O1xuICAgIHZhciBnbHlmID0ge1xuICAgICAgbnVtYmVyT2ZDb250b3VyczogZW5kUHRzT2ZDb250b3Vycy5sZW5ndGgsXG4gICAgICB4TWluOiBiYm94Lm1pblgsXG4gICAgICB5TWluOiBiYm94Lm1pblksXG4gICAgICB4TWF4OiBiYm94Lm1heFgsXG4gICAgICB5TWF4OiBiYm94Lm1heFksXG4gICAgICBlbmRQdHNPZkNvbnRvdXJzOiBlbmRQdHNPZkNvbnRvdXJzLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBpbnN0cnVjdGlvbnMsXG4gICAgICBmbGFnczogZmxhZ3MsXG4gICAgICB4UG9pbnRzOiB4UG9pbnRzLFxuICAgICAgeVBvaW50czogeVBvaW50c1xuICAgIH07XG4gICAgdmFyIHNpemUgPSBHbHlmLnNpemUoZ2x5Zik7XG4gICAgdmFyIHRhaWwgPSA0IC0gc2l6ZSAlIDQ7XG4gICAgdmFyIHN0cmVhbSA9IG5ldyByZXN0cnVjdHVyZS5FbmNvZGVTdHJlYW0oc2l6ZSArIHRhaWwpO1xuICAgIEdseWYuZW5jb2RlKHN0cmVhbSwgZ2x5Zik7IC8vIEFsaWduIHRvIDQtYnl0ZSBsZW5ndGhcblxuICAgIGlmICh0YWlsICE9PSAwKSB7XG4gICAgICBzdHJlYW0uZmlsbCgwLCB0YWlsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyZWFtLmJ1ZmZlcjtcbiAgfTtcblxuICBfcHJvdG8uX2VuY29kZVBvaW50ID0gZnVuY3Rpb24gX2VuY29kZVBvaW50KHZhbHVlLCBsYXN0LCBwb2ludHMsIGZsYWcsIHNob3J0RmxhZywgc2FtZUZsYWcpIHtcbiAgICB2YXIgZGlmZiA9IHZhbHVlIC0gbGFzdDtcblxuICAgIGlmICh2YWx1ZSA9PT0gbGFzdCkge1xuICAgICAgZmxhZyB8PSBzYW1lRmxhZztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKC0yNTUgPD0gZGlmZiAmJiBkaWZmIDw9IDI1NSkge1xuICAgICAgICBmbGFnIHw9IHNob3J0RmxhZztcblxuICAgICAgICBpZiAoZGlmZiA8IDApIHtcbiAgICAgICAgICBkaWZmID0gLWRpZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmxhZyB8PSBzYW1lRmxhZztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwb2ludHMucHVzaChkaWZmKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhZztcbiAgfTtcblxuICByZXR1cm4gVFRGR2x5cGhFbmNvZGVyO1xufSgpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJG8obykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JG8obykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JG8obywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRvKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkbyhvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JG8oYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJGQoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBUVEZTdWJzZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9TdWJzZXQpIHtcbiAgX2luaGVyaXRzTG9vc2UkZChUVEZTdWJzZXQsIF9TdWJzZXQpO1xuXG4gIGZ1bmN0aW9uIFRURlN1YnNldChmb250KSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfU3Vic2V0LmNhbGwodGhpcywgZm9udCkgfHwgdGhpcztcbiAgICBfdGhpcy5nbHlwaEVuY29kZXIgPSBuZXcgVFRGR2x5cGhFbmNvZGVyKCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFRURlN1YnNldC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9hZGRHbHlwaCA9IGZ1bmN0aW9uIF9hZGRHbHlwaChnaWQpIHtcbiAgICB2YXIgZ2x5cGggPSB0aGlzLmZvbnQuZ2V0R2x5cGgoZ2lkKTtcblxuICAgIHZhciBnbHlmID0gZ2x5cGguX2RlY29kZSgpOyAvLyBnZXQgdGhlIG9mZnNldCB0byB0aGUgZ2x5cGggZnJvbSB0aGUgbG9jYSB0YWJsZVxuXG5cbiAgICB2YXIgY3VyT2Zmc2V0ID0gdGhpcy5mb250LmxvY2Eub2Zmc2V0c1tnaWRdO1xuICAgIHZhciBuZXh0T2Zmc2V0ID0gdGhpcy5mb250LmxvY2Eub2Zmc2V0c1tnaWQgKyAxXTtcblxuICAgIHZhciBzdHJlYW0gPSB0aGlzLmZvbnQuX2dldFRhYmxlU3RyZWFtKCdnbHlmJyk7XG5cbiAgICBzdHJlYW0ucG9zICs9IGN1ck9mZnNldDtcbiAgICB2YXIgYnVmZmVyID0gc3RyZWFtLnJlYWRCdWZmZXIobmV4dE9mZnNldCAtIGN1ck9mZnNldCk7IC8vIGlmIGl0IGlzIGEgY29tcG91bmQgZ2x5cGgsIGluY2x1ZGUgaXRzIGNvbXBvbmVudHNcblxuICAgIGlmIChnbHlmICYmIGdseWYubnVtYmVyT2ZDb250b3VycyA8IDApIHtcbiAgICAgIGJ1ZmZlciA9IG5ldyBidWZmZXJfMShidWZmZXIpO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJG8oZ2x5Zi5jb21wb25lbnRzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICBnaWQgPSB0aGlzLmluY2x1ZGVHbHlwaChjb21wb25lbnQuZ2x5cGhJRCk7XG4gICAgICAgIGJ1ZmZlci53cml0ZVVJbnQxNkJFKGdpZCwgY29tcG9uZW50LnBvcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChnbHlmICYmIHRoaXMuZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yKSB7XG4gICAgICAvLyBJZiB0aGlzIGlzIGEgVHJ1ZVR5cGUgdmFyaWF0aW9uIGdseXBoLCByZS1lbmNvZGUgdGhlIHBhdGhcbiAgICAgIGJ1ZmZlciA9IHRoaXMuZ2x5cGhFbmNvZGVyLmVuY29kZVNpbXBsZShnbHlwaC5wYXRoLCBnbHlmLmluc3RydWN0aW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy5nbHlmLnB1c2goYnVmZmVyKTtcbiAgICB0aGlzLmxvY2Eub2Zmc2V0cy5wdXNoKHRoaXMub2Zmc2V0KTtcbiAgICB0aGlzLmhtdHgubWV0cmljcy5wdXNoKHtcbiAgICAgIGFkdmFuY2U6IGdseXBoLmFkdmFuY2VXaWR0aCxcbiAgICAgIGJlYXJpbmc6IGdseXBoLl9nZXRNZXRyaWNzKCkubGVmdEJlYXJpbmdcbiAgICB9KTtcbiAgICB0aGlzLm9mZnNldCArPSBidWZmZXIubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLmdseWYubGVuZ3RoIC0gMTtcbiAgfTtcblxuICBfcHJvdG8uZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0cmVhbSkge1xuICAgIC8vIHRhYmxlcyByZXF1aXJlZCBieSBQREYgc3BlYzpcbiAgICAvLyAgIGhlYWQsIGhoZWEsIGxvY2EsIG1heHAsIGN2dCAsIHByZXAsIGdseWYsIGhtdHgsIGZwZ21cbiAgICAvL1xuICAgIC8vIGFkZGl0aW9uYWwgdGFibGVzIHJlcXVpcmVkIGZvciBzdGFuZGFsb25lIGZvbnRzOlxuICAgIC8vICAgbmFtZSwgY21hcCwgT1MvMiwgcG9zdFxuICAgIHRoaXMuZ2x5ZiA9IFtdO1xuICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICB0aGlzLmxvY2EgPSB7XG4gICAgICBvZmZzZXRzOiBbXVxuICAgIH07XG4gICAgdGhpcy5obXR4ID0ge1xuICAgICAgbWV0cmljczogW10sXG4gICAgICBiZWFyaW5nczogW11cbiAgICB9OyAvLyBpbmNsdWRlIGFsbCB0aGUgZ2x5cGhzXG4gICAgLy8gbm90IHVzaW5nIGEgZm9yIGxvb3AgYmVjYXVzZSB3ZSBuZWVkIHRvIHN1cHBvcnQgYWRkaW5nIG1vcmVcbiAgICAvLyBnbHlwaHMgdG8gdGhlIGFycmF5IGFzIHdlIGdvLCBhbmQgQ29mZmVlU2NyaXB0IGNhY2hlcyB0aGUgbGVuZ3RoLlxuXG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCB0aGlzLmdseXBocy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2FkZEdseXBoKHRoaXMuZ2x5cGhzW2krK10pO1xuICAgIH1cblxuICAgIHZhciBtYXhwID0gY2xvbmVfMSh0aGlzLmZvbnQubWF4cCk7XG4gICAgbWF4cC5udW1HbHlwaHMgPSB0aGlzLmdseWYubGVuZ3RoO1xuICAgIHRoaXMubG9jYS5vZmZzZXRzLnB1c2godGhpcy5vZmZzZXQpO1xuICAgIHRhYmxlcy5sb2NhLnByZUVuY29kZS5jYWxsKHRoaXMubG9jYSk7XG4gICAgdmFyIGhlYWQgPSBjbG9uZV8xKHRoaXMuZm9udC5oZWFkKTtcbiAgICBoZWFkLmluZGV4VG9Mb2NGb3JtYXQgPSB0aGlzLmxvY2EudmVyc2lvbjtcbiAgICB2YXIgaGhlYSA9IGNsb25lXzEodGhpcy5mb250LmhoZWEpO1xuICAgIGhoZWEubnVtYmVyT2ZNZXRyaWNzID0gdGhpcy5obXR4Lm1ldHJpY3MubGVuZ3RoOyAvLyBtYXAgPSBbXVxuICAgIC8vIGZvciBpbmRleCBpbiBbMC4uLjI1Nl1cbiAgICAvLyAgICAgaWYgaW5kZXggPCBAbnVtR2x5cGhzXG4gICAgLy8gICAgICAgICBtYXBbaW5kZXhdID0gaW5kZXhcbiAgICAvLyAgICAgZWxzZVxuICAgIC8vICAgICAgICAgbWFwW2luZGV4XSA9IDBcbiAgICAvL1xuICAgIC8vIGNtYXBUYWJsZSA9XG4gICAgLy8gICAgIHZlcnNpb246IDBcbiAgICAvLyAgICAgbGVuZ3RoOiAyNjJcbiAgICAvLyAgICAgbGFuZ3VhZ2U6IDBcbiAgICAvLyAgICAgY29kZU1hcDogbWFwXG4gICAgLy9cbiAgICAvLyBjbWFwID1cbiAgICAvLyAgICAgdmVyc2lvbjogMFxuICAgIC8vICAgICBudW1TdWJ0YWJsZXM6IDFcbiAgICAvLyAgICAgdGFibGVzOiBbXG4gICAgLy8gICAgICAgICBwbGF0Zm9ybUlEOiAxXG4gICAgLy8gICAgICAgICBlbmNvZGluZ0lEOiAwXG4gICAgLy8gICAgICAgICB0YWJsZTogY21hcFRhYmxlXG4gICAgLy8gICAgIF1cbiAgICAvLyBUT0RPOiBzdWJzZXQgcHJlcCwgY3Z0LCBmcGdtP1xuXG4gICAgRGlyZWN0b3J5LmVuY29kZShzdHJlYW0sIHtcbiAgICAgIHRhYmxlczoge1xuICAgICAgICBoZWFkOiBoZWFkLFxuICAgICAgICBoaGVhOiBoaGVhLFxuICAgICAgICBsb2NhOiB0aGlzLmxvY2EsXG4gICAgICAgIG1heHA6IG1heHAsXG4gICAgICAgICdjdnQgJzogdGhpcy5mb250WydjdnQgJ10sXG4gICAgICAgIHByZXA6IHRoaXMuZm9udC5wcmVwLFxuICAgICAgICBnbHlmOiB0aGlzLmdseWYsXG4gICAgICAgIGhtdHg6IHRoaXMuaG10eCxcbiAgICAgICAgZnBnbTogdGhpcy5mb250LmZwZ20gLy8gbmFtZTogY2xvbmUgQGZvbnQubmFtZVxuICAgICAgICAvLyAnT1MvMic6IGNsb25lIEBmb250WydPUy8yJ11cbiAgICAgICAgLy8gcG9zdDogY2xvbmUgQGZvbnQucG9zdFxuICAgICAgICAvLyBjbWFwOiBjbWFwXG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gVFRGU3Vic2V0O1xufShTdWJzZXQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHAobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JHAobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JHAobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRwKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkcChvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JHAoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJGUoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBDRkZTdWJzZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9TdWJzZXQpIHtcbiAgX2luaGVyaXRzTG9vc2UkZShDRkZTdWJzZXQsIF9TdWJzZXQpO1xuXG4gIGZ1bmN0aW9uIENGRlN1YnNldChmb250KSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfU3Vic2V0LmNhbGwodGhpcywgZm9udCkgfHwgdGhpcztcbiAgICBfdGhpcy5jZmYgPSBfdGhpcy5mb250WydDRkYgJ107XG5cbiAgICBpZiAoIV90aGlzLmNmZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSBDRkYgRm9udCcpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBDRkZTdWJzZXQucHJvdG90eXBlO1xuXG4gIF9wcm90by5zdWJzZXRDaGFyc3RyaW5ncyA9IGZ1bmN0aW9uIHN1YnNldENoYXJzdHJpbmdzKCkge1xuICAgIHRoaXMuY2hhcnN0cmluZ3MgPSBbXTtcbiAgICB2YXIgZ3N1YnJzID0ge307XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHAodGhpcy5nbHlwaHMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIGdpZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgdGhpcy5jaGFyc3RyaW5ncy5wdXNoKHRoaXMuY2ZmLmdldENoYXJTdHJpbmcoZ2lkKSk7XG4gICAgICB2YXIgZ2x5cGggPSB0aGlzLmZvbnQuZ2V0R2x5cGgoZ2lkKTtcbiAgICAgIHZhciBwYXRoID0gZ2x5cGgucGF0aDsgLy8gdGhpcyBjYXVzZXMgdGhlIGdseXBoIHRvIGJlIHBhcnNlZFxuXG4gICAgICBmb3IgKHZhciBzdWJyIGluIGdseXBoLl91c2VkR3N1YnJzKSB7XG4gICAgICAgIGdzdWJyc1tzdWJyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5nc3VicnMgPSB0aGlzLnN1YnNldFN1YnJzKHRoaXMuY2ZmLmdsb2JhbFN1YnJJbmRleCwgZ3N1YnJzKTtcbiAgfTtcblxuICBfcHJvdG8uc3Vic2V0U3VicnMgPSBmdW5jdGlvbiBzdWJzZXRTdWJycyhzdWJycywgdXNlZCkge1xuICAgIHZhciByZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VicnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdWJyID0gc3VicnNbaV07XG5cbiAgICAgIGlmICh1c2VkW2ldKSB7XG4gICAgICAgIHRoaXMuY2ZmLnN0cmVhbS5wb3MgPSBzdWJyLm9mZnNldDtcbiAgICAgICAgcmVzLnB1c2godGhpcy5jZmYuc3RyZWFtLnJlYWRCdWZmZXIoc3Vici5sZW5ndGgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcy5wdXNoKG5ldyBidWZmZXJfMShbMTFdKSk7IC8vIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgX3Byb3RvLnN1YnNldEZvbnRkaWN0ID0gZnVuY3Rpb24gc3Vic2V0Rm9udGRpY3QodG9wRGljdCkge1xuICAgIHRvcERpY3QuRkRBcnJheSA9IFtdO1xuICAgIHRvcERpY3QuRkRTZWxlY3QgPSB7XG4gICAgICB2ZXJzaW9uOiAwLFxuICAgICAgZmRzOiBbXVxuICAgIH07XG4gICAgdmFyIHVzZWRfZmRzID0ge307XG4gICAgdmFyIHVzZWRfc3VicnMgPSBbXTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHAodGhpcy5nbHlwaHMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgdmFyIGdpZCA9IF9zdGVwMi52YWx1ZTtcbiAgICAgIHZhciBmZCA9IHRoaXMuY2ZmLmZkRm9yR2x5cGgoZ2lkKTtcblxuICAgICAgaWYgKGZkID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghdXNlZF9mZHNbZmRdKSB7XG4gICAgICAgIHRvcERpY3QuRkRBcnJheS5wdXNoKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2ZmLnRvcERpY3QuRkRBcnJheVtmZF0pKTtcbiAgICAgICAgdXNlZF9zdWJycy5wdXNoKHt9KTtcbiAgICAgIH1cblxuICAgICAgdXNlZF9mZHNbZmRdID0gdHJ1ZTtcbiAgICAgIHRvcERpY3QuRkRTZWxlY3QuZmRzLnB1c2godG9wRGljdC5GREFycmF5Lmxlbmd0aCAtIDEpO1xuICAgICAgdmFyIGdseXBoID0gdGhpcy5mb250LmdldEdseXBoKGdpZCk7XG4gICAgICB2YXIgcGF0aCA9IGdseXBoLnBhdGg7IC8vIHRoaXMgY2F1c2VzIHRoZSBnbHlwaCB0byBiZSBwYXJzZWRcblxuICAgICAgZm9yICh2YXIgc3ViciBpbiBnbHlwaC5fdXNlZFN1YnJzKSB7XG4gICAgICAgIHVzZWRfc3VicnNbdXNlZF9zdWJycy5sZW5ndGggLSAxXVtzdWJyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3BEaWN0LkZEQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkaWN0ID0gdG9wRGljdC5GREFycmF5W2ldO1xuICAgICAgZGVsZXRlIGRpY3QuRm9udE5hbWU7XG5cbiAgICAgIGlmIChkaWN0LlByaXZhdGUgJiYgZGljdC5Qcml2YXRlLlN1YnJzKSB7XG4gICAgICAgIGRpY3QuUHJpdmF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIGRpY3QuUHJpdmF0ZSk7XG4gICAgICAgIGRpY3QuUHJpdmF0ZS5TdWJycyA9IHRoaXMuc3Vic2V0U3VicnMoZGljdC5Qcml2YXRlLlN1YnJzLCB1c2VkX3N1YnJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH07XG5cbiAgX3Byb3RvLmNyZWF0ZUNJREZvbnRkaWN0ID0gZnVuY3Rpb24gY3JlYXRlQ0lERm9udGRpY3QodG9wRGljdCkge1xuICAgIHZhciB1c2VkX3N1YnJzID0ge307XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRwKHRoaXMuZ2x5cGhzKSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICAgIHZhciBnaWQgPSBfc3RlcDMudmFsdWU7XG4gICAgICB2YXIgZ2x5cGggPSB0aGlzLmZvbnQuZ2V0R2x5cGgoZ2lkKTtcbiAgICAgIHZhciBwYXRoID0gZ2x5cGgucGF0aDsgLy8gdGhpcyBjYXVzZXMgdGhlIGdseXBoIHRvIGJlIHBhcnNlZFxuXG4gICAgICBmb3IgKHZhciBzdWJyIGluIGdseXBoLl91c2VkU3VicnMpIHtcbiAgICAgICAgdXNlZF9zdWJyc1tzdWJyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByaXZhdGVEaWN0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jZmYudG9wRGljdC5Qcml2YXRlKTtcblxuICAgIGlmICh0aGlzLmNmZi50b3BEaWN0LlByaXZhdGUgJiYgdGhpcy5jZmYudG9wRGljdC5Qcml2YXRlLlN1YnJzKSB7XG4gICAgICBwcml2YXRlRGljdC5TdWJycyA9IHRoaXMuc3Vic2V0U3VicnModGhpcy5jZmYudG9wRGljdC5Qcml2YXRlLlN1YnJzLCB1c2VkX3N1YnJzKTtcbiAgICB9XG5cbiAgICB0b3BEaWN0LkZEQXJyYXkgPSBbe1xuICAgICAgUHJpdmF0ZTogcHJpdmF0ZURpY3RcbiAgICB9XTtcbiAgICByZXR1cm4gdG9wRGljdC5GRFNlbGVjdCA9IHtcbiAgICAgIHZlcnNpb246IDMsXG4gICAgICBuUmFuZ2VzOiAxLFxuICAgICAgcmFuZ2VzOiBbe1xuICAgICAgICBmaXJzdDogMCxcbiAgICAgICAgZmQ6IDBcbiAgICAgIH1dLFxuICAgICAgc2VudGluZWw6IHRoaXMuY2hhcnN0cmluZ3MubGVuZ3RoXG4gICAgfTtcbiAgfTtcblxuICBfcHJvdG8uYWRkU3RyaW5nID0gZnVuY3Rpb24gYWRkU3RyaW5nKHN0cmluZykge1xuICAgIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RyaW5ncykge1xuICAgICAgdGhpcy5zdHJpbmdzID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5zdHJpbmdzLnB1c2goc3RyaW5nKTtcbiAgICByZXR1cm4gc3RhbmRhcmRTdHJpbmdzLmxlbmd0aCArIHRoaXMuc3RyaW5ncy5sZW5ndGggLSAxO1xuICB9O1xuXG4gIF9wcm90by5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyZWFtKSB7XG4gICAgdGhpcy5zdWJzZXRDaGFyc3RyaW5ncygpO1xuICAgIHZhciBjaGFyc2V0ID0ge1xuICAgICAgdmVyc2lvbjogdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGggPiAyNTUgPyAyIDogMSxcbiAgICAgIHJhbmdlczogW3tcbiAgICAgICAgZmlyc3Q6IDEsXG4gICAgICAgIG5MZWZ0OiB0aGlzLmNoYXJzdHJpbmdzLmxlbmd0aCAtIDJcbiAgICAgIH1dXG4gICAgfTtcbiAgICB2YXIgdG9wRGljdCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2ZmLnRvcERpY3QpO1xuICAgIHRvcERpY3QuUHJpdmF0ZSA9IG51bGw7XG4gICAgdG9wRGljdC5jaGFyc2V0ID0gY2hhcnNldDtcbiAgICB0b3BEaWN0LkVuY29kaW5nID0gbnVsbDtcbiAgICB0b3BEaWN0LkNoYXJTdHJpbmdzID0gdGhpcy5jaGFyc3RyaW5ncztcblxuICAgIGZvciAodmFyIF9pID0gMCwgX2FyciA9IFsndmVyc2lvbicsICdOb3RpY2UnLCAnQ29weXJpZ2h0JywgJ0Z1bGxOYW1lJywgJ0ZhbWlseU5hbWUnLCAnV2VpZ2h0JywgJ1Bvc3RTY3JpcHQnLCAnQmFzZUZvbnROYW1lJywgJ0ZvbnROYW1lJ107IF9pIDwgX2Fyci5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBrZXkgPSBfYXJyW19pXTtcbiAgICAgIHRvcERpY3Rba2V5XSA9IHRoaXMuYWRkU3RyaW5nKHRoaXMuY2ZmLnN0cmluZyh0b3BEaWN0W2tleV0pKTtcbiAgICB9XG5cbiAgICB0b3BEaWN0LlJPUyA9IFt0aGlzLmFkZFN0cmluZygnQWRvYmUnKSwgdGhpcy5hZGRTdHJpbmcoJ0lkZW50aXR5JyksIDBdO1xuICAgIHRvcERpY3QuQ0lEQ291bnQgPSB0aGlzLmNoYXJzdHJpbmdzLmxlbmd0aDtcblxuICAgIGlmICh0aGlzLmNmZi5pc0NJREZvbnQpIHtcbiAgICAgIHRoaXMuc3Vic2V0Rm9udGRpY3QodG9wRGljdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlQ0lERm9udGRpY3QodG9wRGljdCk7XG4gICAgfVxuXG4gICAgdmFyIHRvcCA9IHtcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICBoZHJTaXplOiB0aGlzLmNmZi5oZHJTaXplLFxuICAgICAgb2ZmU2l6ZTogdGhpcy5jZmYubGVuZ3RoLFxuICAgICAgaGVhZGVyOiB0aGlzLmNmZi5oZWFkZXIsXG4gICAgICBuYW1lSW5kZXg6IFt0aGlzLmNmZi5wb3N0c2NyaXB0TmFtZV0sXG4gICAgICB0b3BEaWN0SW5kZXg6IFt0b3BEaWN0XSxcbiAgICAgIHN0cmluZ0luZGV4OiB0aGlzLnN0cmluZ3MsXG4gICAgICBnbG9iYWxTdWJySW5kZXg6IHRoaXMuZ3N1YnJzXG4gICAgfTtcbiAgICBDRkZUb3AuZW5jb2RlKHN0cmVhbSwgdG9wKTtcbiAgfTtcblxuICByZXR1cm4gQ0ZGU3Vic2V0O1xufShTdWJzZXQpO1xuXG52YXIgX2NsYXNzJDQ7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkcShvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkcShvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkcShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JHEobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRxKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkcShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkOCh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQ4KENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkOChDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDgoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkNCh0YXJnZXQsIHByb3BlcnR5LCBkZWNvcmF0b3JzLCBkZXNjcmlwdG9yLCBjb250ZXh0KSB7IHZhciBkZXNjID0ge307IE9iamVjdC5rZXlzKGRlc2NyaXB0b3IpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBkZXNjW2tleV0gPSBkZXNjcmlwdG9yW2tleV07IH0pOyBkZXNjLmVudW1lcmFibGUgPSAhIWRlc2MuZW51bWVyYWJsZTsgZGVzYy5jb25maWd1cmFibGUgPSAhIWRlc2MuY29uZmlndXJhYmxlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjIHx8IGRlc2MuaW5pdGlhbGl6ZXIpIHsgZGVzYy53cml0YWJsZSA9IHRydWU7IH0gZGVzYyA9IGRlY29yYXRvcnMuc2xpY2UoKS5yZXZlcnNlKCkucmVkdWNlKGZ1bmN0aW9uIChkZXNjLCBkZWNvcmF0b3IpIHsgcmV0dXJuIGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5LCBkZXNjKSB8fCBkZXNjOyB9LCBkZXNjKTsgaWYgKGNvbnRleHQgJiYgZGVzYy5pbml0aWFsaXplciAhPT0gdm9pZCAwKSB7IGRlc2MudmFsdWUgPSBkZXNjLmluaXRpYWxpemVyID8gZGVzYy5pbml0aWFsaXplci5jYWxsKGNvbnRleHQpIDogdm9pZCAwOyBkZXNjLmluaXRpYWxpemVyID0gdW5kZWZpbmVkOyB9IGlmIChkZXNjLmluaXRpYWxpemVyID09PSB2b2lkIDApIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIGRlc2MpOyBkZXNjID0gbnVsbDsgfSByZXR1cm4gZGVzYzsgfVxuLyoqXG4gKiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgU0ZOVC1iYXNlZCBmb250IGZvcm1hdHMgaW4gZm9udGtpdC5cbiAqIEl0IHN1cHBvcnRzIFRydWVUeXBlLCBhbmQgUG9zdFNjcmlwdCBnbHlwaHMsIGFuZCBzZXZlcmFsIGNvbG9yIGdseXBoIGZvcm1hdHMuXG4gKi9cblxudmFyIFRURkZvbnQgPSAoX2NsYXNzJDQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBUVEZGb250LnByb2JlID0gZnVuY3Rpb24gcHJvYmUoYnVmZmVyKSB7XG4gICAgdmFyIGZvcm1hdCA9IGJ1ZmZlci50b1N0cmluZygnYXNjaWknLCAwLCA0KTtcbiAgICByZXR1cm4gZm9ybWF0ID09PSAndHJ1ZScgfHwgZm9ybWF0ID09PSAnT1RUTycgfHwgZm9ybWF0ID09PSBTdHJpbmcuZnJvbUNoYXJDb2RlKDAsIDEsIDAsIDApO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFRURkZvbnQoc3RyZWFtLCB2YXJpYXRpb25Db29yZHMpIHtcbiAgICBpZiAodmFyaWF0aW9uQ29vcmRzID09PSB2b2lkIDApIHtcbiAgICAgIHZhcmlhdGlvbkNvb3JkcyA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy52YXJpYXRpb25Db29yZHMgPSB2YXJpYXRpb25Db29yZHM7XG4gICAgdGhpcy5fZGlyZWN0b3J5UG9zID0gdGhpcy5zdHJlYW0ucG9zO1xuICAgIHRoaXMuX3RhYmxlcyA9IHt9O1xuICAgIHRoaXMuX2dseXBocyA9IHt9O1xuXG4gICAgdGhpcy5fZGVjb2RlRGlyZWN0b3J5KCk7IC8vIGRlZmluZSBwcm9wZXJ0aWVzIGZvciBlYWNoIHRhYmxlIHRvIGxhemlseSBwYXJzZVxuXG5cbiAgICBmb3IgKHZhciB0YWcgaW4gdGhpcy5kaXJlY3RvcnkudGFibGVzKSB7XG4gICAgICB2YXIgdGFibGUgPSB0aGlzLmRpcmVjdG9yeS50YWJsZXNbdGFnXTtcblxuICAgICAgaWYgKHRhYmxlc1t0YWddICYmIHRhYmxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHRhZywge1xuICAgICAgICAgIGdldDogdGhpcy5fZ2V0VGFibGUuYmluZCh0aGlzLCB0YWJsZSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIF9wcm90byA9IFRURkZvbnQucHJvdG90eXBlO1xuXG4gIF9wcm90by5fZ2V0VGFibGUgPSBmdW5jdGlvbiBfZ2V0VGFibGUodGFibGUpIHtcbiAgICBpZiAoISh0YWJsZS50YWcgaW4gdGhpcy5fdGFibGVzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fdGFibGVzW3RhYmxlLnRhZ10gPSB0aGlzLl9kZWNvZGVUYWJsZSh0YWJsZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChmb250a2l0LmxvZ0Vycm9ycykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkZWNvZGluZyB0YWJsZSBcIiArIHRhYmxlLnRhZyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl90YWJsZXNbdGFibGUudGFnXTtcbiAgfTtcblxuICBfcHJvdG8uX2dldFRhYmxlU3RyZWFtID0gZnVuY3Rpb24gX2dldFRhYmxlU3RyZWFtKHRhZykge1xuICAgIHZhciB0YWJsZSA9IHRoaXMuZGlyZWN0b3J5LnRhYmxlc1t0YWddO1xuXG4gICAgaWYgKHRhYmxlKSB7XG4gICAgICB0aGlzLnN0cmVhbS5wb3MgPSB0YWJsZS5vZmZzZXQ7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX3Byb3RvLl9kZWNvZGVEaXJlY3RvcnkgPSBmdW5jdGlvbiBfZGVjb2RlRGlyZWN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLmRpcmVjdG9yeSA9IERpcmVjdG9yeS5kZWNvZGUodGhpcy5zdHJlYW0sIHtcbiAgICAgIF9zdGFydE9mZnNldDogMFxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5fZGVjb2RlVGFibGUgPSBmdW5jdGlvbiBfZGVjb2RlVGFibGUodGFibGUpIHtcbiAgICB2YXIgcG9zID0gdGhpcy5zdHJlYW0ucG9zO1xuXG4gICAgdmFyIHN0cmVhbSA9IHRoaXMuX2dldFRhYmxlU3RyZWFtKHRhYmxlLnRhZyk7XG5cbiAgICB2YXIgcmVzdWx0ID0gdGFibGVzW3RhYmxlLnRhZ10uZGVjb2RlKHN0cmVhbSwgdGhpcywgdGFibGUubGVuZ3RoKTtcbiAgICB0aGlzLnN0cmVhbS5wb3MgPSBwb3M7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBQb3N0U2NyaXB0IG5hbWUgZm9yIHRoaXMgZm9udFxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgO1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgc3RyaW5nIGZyb20gdGhlIGZvbnQncyBgbmFtZWAgdGFibGVcbiAgICogYGxhbmdgIGlzIGEgQkNQLTQ3IGxhbmd1YWdlIGNvZGUuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIF9wcm90by5nZXROYW1lID0gZnVuY3Rpb24gZ2V0TmFtZShrZXksIGxhbmcpIHtcbiAgICBpZiAobGFuZyA9PT0gdm9pZCAwKSB7XG4gICAgICBsYW5nID0gJ2VuJztcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdGhpcy5uYW1lLnJlY29yZHNba2V5XTtcblxuICAgIGlmIChyZWNvcmQpIHtcbiAgICAgIHJldHVybiByZWNvcmRbbGFuZ107XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBmb250J3MgZnVsbCBuYW1lLCBlLmcuIFwiSGVsdmV0aWNhIEJvbGRcIlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgaXMgZ2x5cGggaW4gdGhlIGZvbnQgZm9yIHRoZSBnaXZlbiB1bmljb2RlIGNvZGUgcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlUG9pbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIF9wcm90by5oYXNHbHlwaEZvckNvZGVQb2ludCA9IGZ1bmN0aW9uIGhhc0dseXBoRm9yQ29kZVBvaW50KGNvZGVQb2ludCkge1xuICAgIHJldHVybiAhIXRoaXMuX2NtYXBQcm9jZXNzb3IubG9va3VwKGNvZGVQb2ludCk7XG4gIH1cbiAgLyoqXG4gICAqIE1hcHMgYSBzaW5nbGUgdW5pY29kZSBjb2RlIHBvaW50IHRvIGEgR2x5cGggb2JqZWN0LlxuICAgKiBEb2VzIG5vdCBwZXJmb3JtIGFueSBhZHZhbmNlZCBzdWJzdGl0dXRpb25zICh0aGVyZSBpcyBubyBjb250ZXh0IHRvIGRvIHNvKS5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVQb2ludFxuICAgKiBAcmV0dXJuIHtHbHlwaH1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZ2x5cGhGb3JDb2RlUG9pbnQgPSBmdW5jdGlvbiBnbHlwaEZvckNvZGVQb2ludChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRHbHlwaCh0aGlzLl9jbWFwUHJvY2Vzc29yLmxvb2t1cChjb2RlUG9pbnQpLCBbY29kZVBvaW50XSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgR2x5cGggb2JqZWN0cyBmb3IgdGhlIGdpdmVuIHN0cmluZy5cbiAgICogVGhpcyBpcyBvbmx5IGEgb25lLXRvLW9uZSBtYXBwaW5nIGZyb20gY2hhcmFjdGVycyB0byBnbHlwaHMuXG4gICAqIEZvciBtb3N0IHVzZXMsIHlvdSBzaG91bGQgdXNlIGZvbnQubGF5b3V0IChkZXNjcmliZWQgYmVsb3cpLCB3aGljaFxuICAgKiBwcm92aWRlcyBhIG11Y2ggbW9yZSBhZHZhbmNlZCBtYXBwaW5nIHN1cHBvcnRpbmcgQUFUIGFuZCBPcGVuVHlwZSBzaGFwaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEByZXR1cm4ge0dseXBoW119XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmdseXBoc0ZvclN0cmluZyA9IGZ1bmN0aW9uIGdseXBoc0ZvclN0cmluZyhzdHJpbmcpIHtcbiAgICB2YXIgZ2x5cGhzID0gW107XG4gICAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGg7XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgdmFyIGxhc3QgPSAtMTtcbiAgICB2YXIgc3RhdGUgPSAtMTtcblxuICAgIHdoaWxlIChpZHggPD0gbGVuKSB7XG4gICAgICB2YXIgY29kZSA9IDA7XG4gICAgICB2YXIgbmV4dFN0YXRlID0gMDtcblxuICAgICAgaWYgKGlkeCA8IGxlbikge1xuICAgICAgICAvLyBEZWNvZGUgdGhlIG5leHQgY29kZXBvaW50IGZyb20gVVRGIDE2XG4gICAgICAgIGNvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChpZHgrKyk7XG5cbiAgICAgICAgaWYgKDB4ZDgwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhkYmZmICYmIGlkeCA8IGxlbikge1xuICAgICAgICAgIHZhciBuZXh0ID0gc3RyaW5nLmNoYXJDb2RlQXQoaWR4KTtcblxuICAgICAgICAgIGlmICgweGRjMDAgPD0gbmV4dCAmJiBuZXh0IDw9IDB4ZGZmZikge1xuICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICBjb2RlID0gKChjb2RlICYgMHgzZmYpIDw8IDEwKSArIChuZXh0ICYgMHgzZmYpICsgMHgxMDAwMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gQ29tcHV0ZSB0aGUgbmV4dCBzdGF0ZTogMSBpZiB0aGUgbmV4dCBjb2RlcG9pbnQgaXMgYSB2YXJpYXRpb24gc2VsZWN0b3IsIDAgb3RoZXJ3aXNlLlxuXG5cbiAgICAgICAgbmV4dFN0YXRlID0gMHhmZTAwIDw9IGNvZGUgJiYgY29kZSA8PSAweGZlMGYgfHwgMHhlMDEwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhlMDFlZiA/IDEgOiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWR4Kys7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gMCAmJiBuZXh0U3RhdGUgPT09IDEpIHtcbiAgICAgICAgLy8gVmFyaWF0aW9uIHNlbGVjdG9yIGZvbGxvd2luZyBub3JtYWwgY29kZXBvaW50LlxuICAgICAgICBnbHlwaHMucHVzaCh0aGlzLmdldEdseXBoKHRoaXMuX2NtYXBQcm9jZXNzb3IubG9va3VwKGxhc3QsIGNvZGUpLCBbbGFzdCwgY29kZV0pKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDAgJiYgbmV4dFN0YXRlID09PSAwKSB7XG4gICAgICAgIC8vIE5vcm1hbCBjb2RlcG9pbnQgZm9sbG93aW5nIG5vcm1hbCBjb2RlcG9pbnQuXG4gICAgICAgIGdseXBocy5wdXNoKHRoaXMuZ2x5cGhGb3JDb2RlUG9pbnQobGFzdCkpO1xuICAgICAgfVxuXG4gICAgICBsYXN0ID0gY29kZTtcbiAgICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuICAgIH1cblxuICAgIHJldHVybiBnbHlwaHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBHbHlwaFJ1biBvYmplY3QsIHdoaWNoIGluY2x1ZGVzIGFuIGFycmF5IG9mIEdseXBocyBhbmQgR2x5cGhQb3NpdGlvbnMgZm9yIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW3VzZXJGZWF0dXJlc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzY3JpcHRdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGFuZ3VhZ2VdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGlyZWN0aW9uXVxuICAgKiBAcmV0dXJuIHtHbHlwaFJ1bn1cbiAgICovXG4gIF9wcm90by5sYXlvdXQgPSBmdW5jdGlvbiBsYXlvdXQoc3RyaW5nLCB1c2VyRmVhdHVyZXMsIHNjcmlwdCwgbGFuZ3VhZ2UsIGRpcmVjdGlvbikge1xuICAgIHJldHVybiB0aGlzLl9sYXlvdXRFbmdpbmUubGF5b3V0KHN0cmluZywgdXNlckZlYXR1cmVzLCBzY3JpcHQsIGxhbmd1YWdlLCBkaXJlY3Rpb24pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCBtYXAgdG8gdGhlIGdpdmVuIGdseXBoIGlkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZ2lkIC0gZ2x5cGggaWRcbiAgICovXG4gIDtcblxuICBfcHJvdG8uc3RyaW5nc0ZvckdseXBoID0gZnVuY3Rpb24gc3RyaW5nc0ZvckdseXBoKGdpZCkge1xuICAgIHJldHVybiB0aGlzLl9sYXlvdXRFbmdpbmUuc3RyaW5nc0ZvckdseXBoKGdpZCk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGFsbCBbT3BlblR5cGUgZmVhdHVyZSB0YWdzXShodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL2ZlYXR1cmV0YWdzLmh0bSlcbiAgICogKG9yIG1hcHBlZCBBQVQgdGFncykgc3VwcG9ydGVkIGJ5IHRoZSBmb250LlxuICAgKiBUaGUgZmVhdHVyZXMgcGFyYW1ldGVyIGlzIGFuIGFycmF5IG9mIE9wZW5UeXBlIGZlYXR1cmUgdGFncyB0byBiZSBhcHBsaWVkIGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IHNldC5cbiAgICogSWYgdGhpcyBpcyBhbiBBQVQgZm9udCwgdGhlIE9wZW5UeXBlIGZlYXR1cmUgdGFncyBhcmUgbWFwcGVkIHRvIEFBVCBmZWF0dXJlcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5nZXRBdmFpbGFibGVGZWF0dXJlcyA9IGZ1bmN0aW9uIGdldEF2YWlsYWJsZUZlYXR1cmVzKHNjcmlwdCwgbGFuZ3VhZ2UpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF5b3V0RW5naW5lLmdldEF2YWlsYWJsZUZlYXR1cmVzKHNjcmlwdCwgbGFuZ3VhZ2UpO1xuICB9O1xuXG4gIF9wcm90by5fZ2V0QmFzZUdseXBoID0gZnVuY3Rpb24gX2dldEJhc2VHbHlwaChnbHlwaCwgY2hhcmFjdGVycykge1xuICAgIGlmIChjaGFyYWN0ZXJzID09PSB2b2lkIDApIHtcbiAgICAgIGNoYXJhY3RlcnMgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2dseXBoc1tnbHlwaF0pIHtcbiAgICAgIGlmICh0aGlzLmRpcmVjdG9yeS50YWJsZXMuZ2x5Zikge1xuICAgICAgICB0aGlzLl9nbHlwaHNbZ2x5cGhdID0gbmV3IFRURkdseXBoKGdseXBoLCBjaGFyYWN0ZXJzLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXJlY3RvcnkudGFibGVzWydDRkYgJ10gfHwgdGhpcy5kaXJlY3RvcnkudGFibGVzLkNGRjIpIHtcbiAgICAgICAgdGhpcy5fZ2x5cGhzW2dseXBoXSA9IG5ldyBDRkZHbHlwaChnbHlwaCwgY2hhcmFjdGVycywgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dseXBoc1tnbHlwaF0gfHwgbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIGdseXBoIG9iamVjdCBmb3IgdGhlIGdpdmVuIGdseXBoIGlkLlxuICAgKiBZb3UgY2FuIHBhc3MgdGhlIGFycmF5IG9mIGNvZGUgcG9pbnRzIHRoaXMgZ2x5cGggcmVwcmVzZW50cyBmb3JcbiAgICogeW91ciB1c2UgbGF0ZXIsIGFuZCBpdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZ2x5cGggb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gZ2x5cGhcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gY2hhcmFjdGVyc1xuICAgKiBAcmV0dXJuIHtHbHlwaH1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZ2V0R2x5cGggPSBmdW5jdGlvbiBnZXRHbHlwaChnbHlwaCwgY2hhcmFjdGVycykge1xuICAgIGlmIChjaGFyYWN0ZXJzID09PSB2b2lkIDApIHtcbiAgICAgIGNoYXJhY3RlcnMgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2dseXBoc1tnbHlwaF0pIHtcbiAgICAgIGlmICh0aGlzLmRpcmVjdG9yeS50YWJsZXMuc2JpeCkge1xuICAgICAgICB0aGlzLl9nbHlwaHNbZ2x5cGhdID0gbmV3IFNCSVhHbHlwaChnbHlwaCwgY2hhcmFjdGVycywgdGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5DT0xSICYmIHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5DUEFMKSB7XG4gICAgICAgIHRoaXMuX2dseXBoc1tnbHlwaF0gPSBuZXcgQ09MUkdseXBoKGdseXBoLCBjaGFyYWN0ZXJzLCB0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2dldEJhc2VHbHlwaChnbHlwaCwgY2hhcmFjdGVycyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dseXBoc1tnbHlwaF0gfHwgbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIFN1YnNldCBmb3IgdGhpcyBmb250LlxuICAgKiBAcmV0dXJuIHtTdWJzZXR9XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmNyZWF0ZVN1YnNldCA9IGZ1bmN0aW9uIGNyZWF0ZVN1YnNldCgpIHtcbiAgICBpZiAodGhpcy5kaXJlY3RvcnkudGFibGVzWydDRkYgJ10pIHtcbiAgICAgIHJldHVybiBuZXcgQ0ZGU3Vic2V0KHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgVFRGU3Vic2V0KHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSBhdmFpbGFibGUgdmFyaWF0aW9uIGF4ZXNcbiAgICogdGhhdCB0aGlzIGZvbnQgc3VwcG9ydHMuIEtleXMgYXJlIHNldHRpbmcgdGFncywgYW5kIHZhbHVlc1xuICAgKiBjb250YWluIHRoZSBheGlzIG5hbWUsIHJhbmdlLCBhbmQgZGVmYXVsdCB2YWx1ZS5cbiAgICpcbiAgICogQHR5cGUge29iamVjdH1cbiAgICovXG4gIDtcblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBmb250IHdpdGggdGhlIGdpdmVuIHZhcmlhdGlvbiBzZXR0aW5ncyBhcHBsaWVkLlxuICAgKiBTZXR0aW5ncyBjYW4gZWl0aGVyIGJlIGFuIGluc3RhbmNlIG5hbWUsIG9yIGFuIG9iamVjdCBjb250YWluaW5nXG4gICAqIHZhcmlhdGlvbiB0YWdzIGFzIHNwZWNpZmllZCBieSB0aGUgYHZhcmlhdGlvbkF4ZXNgIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3NcbiAgICogQHJldHVybiB7VFRGRm9udH1cbiAgICovXG4gIF9wcm90by5nZXRWYXJpYXRpb24gPSBmdW5jdGlvbiBnZXRWYXJpYXRpb24oc2V0dGluZ3MpIHtcbiAgICBpZiAoISh0aGlzLmRpcmVjdG9yeS50YWJsZXMuZnZhciAmJiAodGhpcy5kaXJlY3RvcnkudGFibGVzLmd2YXIgJiYgdGhpcy5kaXJlY3RvcnkudGFibGVzLmdseWYgfHwgdGhpcy5kaXJlY3RvcnkudGFibGVzLkNGRjIpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYXJpYXRpb25zIHJlcXVpcmUgYSBmb250IHdpdGggdGhlIGZ2YXIsIGd2YXIgYW5kIGdseWYsIG9yIENGRjIgdGFibGVzLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzZXR0aW5ncyA9IHRoaXMubmFtZWRWYXJpYXRpb25zW3NldHRpbmdzXTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNldHRpbmdzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYXJpYXRpb24gc2V0dGluZ3MgbXVzdCBiZSBlaXRoZXIgYSB2YXJpYXRpb24gbmFtZSBvciBzZXR0aW5ncyBvYmplY3QuJyk7XG4gICAgfSAvLyBub3JtYWxpemUgdGhlIGNvb3JkaW5hdGVzXG5cblxuICAgIHZhciBjb29yZHMgPSB0aGlzLmZ2YXIuYXhpcy5tYXAoZnVuY3Rpb24gKGF4aXMsIGkpIHtcbiAgICAgIHZhciBheGlzVGFnID0gYXhpcy5heGlzVGFnLnRyaW0oKTtcblxuICAgICAgaWYgKGF4aXNUYWcgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGF4aXMubWluVmFsdWUsIE1hdGgubWluKGF4aXMubWF4VmFsdWUsIHNldHRpbmdzW2F4aXNUYWddKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXhpcy5kZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIHN0cmVhbSA9IG5ldyByZXN0cnVjdHVyZS5EZWNvZGVTdHJlYW0odGhpcy5zdHJlYW0uYnVmZmVyKTtcbiAgICBzdHJlYW0ucG9zID0gdGhpcy5fZGlyZWN0b3J5UG9zO1xuICAgIHZhciBmb250ID0gbmV3IFRURkZvbnQoc3RyZWFtLCBjb29yZHMpO1xuICAgIGZvbnQuX3RhYmxlcyA9IHRoaXMuX3RhYmxlcztcbiAgICByZXR1cm4gZm9udDtcbiAgfTtcblxuICAvLyBTdGFuZGFyZGl6ZWQgZm9ybWF0IHBsdWdpbiBBUElcbiAgX3Byb3RvLmdldEZvbnQgPSBmdW5jdGlvbiBnZXRGb250KG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYXJpYXRpb24obmFtZSk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzJDgoVFRGRm9udCwgW3tcbiAgICBrZXk6IFwicG9zdHNjcmlwdE5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBuYW1lID0gdGhpcy5uYW1lLnJlY29yZHMucG9zdHNjcmlwdE5hbWU7XG5cbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHZhciBsYW5nID0gT2JqZWN0LmtleXMobmFtZSlbMF07XG4gICAgICAgIHJldHVybiBuYW1lW2xhbmddO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZnVsbE5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5hbWUoJ2Z1bGxOYW1lJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmb250J3MgZmFtaWx5IG5hbWUsIGUuZy4gXCJIZWx2ZXRpY2FcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJmYW1pbHlOYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROYW1lKCdmb250RmFtaWx5Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmb250J3Mgc3ViLWZhbWlseSwgZS5nLiBcIkJvbGRcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic3ViZmFtaWx5TmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgnZm9udFN1YmZhbWlseScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZm9udCdzIGNvcHlyaWdodCBpbmZvcm1hdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjb3B5cmlnaHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5hbWUoJ2NvcHlyaWdodCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZm9udCdzIHZlcnNpb24gbnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInZlcnNpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5hbWUoJ3ZlcnNpb24nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZvbnTigJlzIFthc2NlbmRlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQXNjZW5kZXJfKHR5cG9ncmFwaHkpKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhc2NlbnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhoZWEuYXNjZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZm9udOKAmXMgW2Rlc2NlbmRlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVzY2VuZGVyKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZXNjZW50XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaGVhLmRlc2NlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2Ygc3BhY2UgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgYmV0d2VlbiBsaW5lc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsaW5lR2FwXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaGVhLmxpbmVHYXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgZnJvbSB0aGUgbm9ybWFsIHVuZGVybGluZSBwb3NpdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVuZGVybGluZVBvc2l0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3N0LnVuZGVybGluZVBvc2l0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgd2VpZ2h0IG9mIHRoZSB1bmRlcmxpbmUgdGhhdCBzaG91bGQgYmUgdXNlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bmRlcmxpbmVUaGlja25lc3NcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvc3QudW5kZXJsaW5lVGhpY2tuZXNzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIGlzIGFuIGl0YWxpYyBmb250LCB0aGUgYW5nbGUgdGhlIGN1cnNvciBzaG91bGQgYmUgZHJhd24gYXQgdG8gbWF0Y2ggdGhlIGZvbnQgZGVzaWduXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIml0YWxpY0FuZ2xlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3N0Lml0YWxpY0FuZ2xlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIGNhcGl0YWwgbGV0dGVycyBhYm92ZSB0aGUgYmFzZWxpbmUuXG4gICAgICogU2VlIFtoZXJlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYXBfaGVpZ2h0KSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjYXBIZWlnaHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBvczIgPSB0aGlzWydPUy8yJ107XG4gICAgICByZXR1cm4gb3MyID8gb3MyLmNhcEhlaWdodCA6IHRoaXMuYXNjZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIGxvd2VyIGNhc2UgbGV0dGVycyBpbiB0aGUgZm9udC5cbiAgICAgKiBTZWUgW2hlcmVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1gtaGVpZ2h0KSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ4SGVpZ2h0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgb3MyID0gdGhpc1snT1MvMiddO1xuICAgICAgcmV0dXJuIG9zMiA/IG9zMi54SGVpZ2h0IDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIGZvbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm51bUdseXBoc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubWF4cC5udW1HbHlwaHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBzaXplIG9mIHRoZSBmb2504oCZcyBpbnRlcm5hbCBjb29yZGluYXRlIGdyaWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdHNQZXJFbVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGVhZC51bml0c1BlckVtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZm9udOKAmXMgYm91bmRpbmcgYm94LCBpLmUuIHRoZSBib3ggdGhhdCBlbmNsb3NlcyBhbGwgZ2x5cGhzIGluIHRoZSBmb250LlxuICAgICAqIEB0eXBlIHtCQm94fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYmJveFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUobmV3IEJCb3godGhpcy5oZWFkLnhNaW4sIHRoaXMuaGVhZC55TWluLCB0aGlzLmhlYWQueE1heCwgdGhpcy5oZWFkLnlNYXgpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2NtYXBQcm9jZXNzb3JcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBuZXcgQ21hcFByb2Nlc3Nvcih0aGlzLmNtYXApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhbGwgb2YgdGhlIHVuaWNvZGUgY29kZSBwb2ludHMgc3VwcG9ydGVkIGJ5IHRoZSBmb250LlxuICAgICAqIEB0eXBlIHtudW1iZXJbXX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNoYXJhY3RlclNldFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NtYXBQcm9jZXNzb3IuZ2V0Q2hhcmFjdGVyU2V0KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9sYXlvdXRFbmdpbmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBuZXcgTGF5b3V0RW5naW5lKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhdmFpbGFibGVGZWF0dXJlc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2xheW91dEVuZ2luZS5nZXRBdmFpbGFibGVGZWF0dXJlcygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ2YXJpYXRpb25BeGVzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgcmVzID0ge307XG5cbiAgICAgIGlmICghdGhpcy5mdmFyKSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkcSh0aGlzLmZ2YXIuYXhpcyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBheGlzID0gX3N0ZXAudmFsdWU7XG4gICAgICAgIHJlc1theGlzLmF4aXNUYWcudHJpbSgpXSA9IHtcbiAgICAgICAgICBuYW1lOiBheGlzLm5hbWUuZW4sXG4gICAgICAgICAgbWluOiBheGlzLm1pblZhbHVlLFxuICAgICAgICAgIFwiZGVmYXVsdFwiOiBheGlzLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICBtYXg6IGF4aXMubWF4VmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBvYmplY3QgZGVzY3JpYmluZyB0aGUgbmFtZWQgdmFyaWF0aW9uIGluc3RhbmNlc1xuICAgICAqIHRoYXQgdGhlIGZvbnQgZGVzaWduZXIgaGFzIHNwZWNpZmllZC4gS2V5cyBhcmUgdmFyaWF0aW9uIG5hbWVzXG4gICAgICogYW5kIHZhbHVlcyBhcmUgdGhlIHZhcmlhdGlvbiBzZXR0aW5ncyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJuYW1lZFZhcmlhdGlvbnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciByZXMgPSB7fTtcblxuICAgICAgaWYgKCF0aGlzLmZ2YXIpIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkcSh0aGlzLmZ2YXIuaW5zdGFuY2UpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBfc3RlcDIudmFsdWU7XG4gICAgICAgIHZhciBzZXR0aW5ncyA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mdmFyLmF4aXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgYXhpcyA9IHRoaXMuZnZhci5heGlzW2ldO1xuICAgICAgICAgIHNldHRpbmdzW2F4aXMuYXhpc1RhZy50cmltKCldID0gaW5zdGFuY2UuY29vcmRbaV07XG4gICAgICAgIH1cblxuICAgICAgICByZXNbaW5zdGFuY2UubmFtZS5lbl0gPSBzZXR0aW5ncztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3ZhcmlhdGlvblByb2Nlc3NvclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCF0aGlzLmZ2YXIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciB2YXJpYXRpb25Db29yZHMgPSB0aGlzLnZhcmlhdGlvbkNvb3JkczsgLy8gSWdub3JlIGlmIG5vIHZhcmlhdGlvbiBjb29yZHMgYW5kIG5vdCBDRkYyXG5cbiAgICAgIGlmICghdmFyaWF0aW9uQ29vcmRzICYmICF0aGlzLkNGRjIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFyaWF0aW9uQ29vcmRzKSB7XG4gICAgICAgIHZhcmlhdGlvbkNvb3JkcyA9IHRoaXMuZnZhci5heGlzLm1hcChmdW5jdGlvbiAoYXhpcykge1xuICAgICAgICAgIHJldHVybiBheGlzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgR2x5cGhWYXJpYXRpb25Qcm9jZXNzb3IodGhpcywgdmFyaWF0aW9uQ29vcmRzKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVFRGRm9udDtcbn0oKSwgKF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkNChfY2xhc3MkNC5wcm90b3R5cGUsIFwiYmJveFwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJiYm94XCIpLCBfY2xhc3MkNC5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDQoX2NsYXNzJDQucHJvdG90eXBlLCBcIl9jbWFwUHJvY2Vzc29yXCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDQucHJvdG90eXBlLCBcIl9jbWFwUHJvY2Vzc29yXCIpLCBfY2xhc3MkNC5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDQoX2NsYXNzJDQucHJvdG90eXBlLCBcImNoYXJhY3RlclNldFwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJjaGFyYWN0ZXJTZXRcIiksIF9jbGFzcyQ0LnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkNChfY2xhc3MkNC5wcm90b3R5cGUsIFwiX2xheW91dEVuZ2luZVwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJfbGF5b3V0RW5naW5lXCIpLCBfY2xhc3MkNC5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDQoX2NsYXNzJDQucHJvdG90eXBlLCBcInZhcmlhdGlvbkF4ZXNcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkNC5wcm90b3R5cGUsIFwidmFyaWF0aW9uQXhlc1wiKSwgX2NsYXNzJDQucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQ0KF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJuYW1lZFZhcmlhdGlvbnNcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkNC5wcm90b3R5cGUsIFwibmFtZWRWYXJpYXRpb25zXCIpLCBfY2xhc3MkNC5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDQoX2NsYXNzJDQucHJvdG90eXBlLCBcIl92YXJpYXRpb25Qcm9jZXNzb3JcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkNC5wcm90b3R5cGUsIFwiX3ZhcmlhdGlvblByb2Nlc3NvclwiKSwgX2NsYXNzJDQucHJvdG90eXBlKSksIF9jbGFzcyQ0KTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRyKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRyKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRyKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkcihvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JHIobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRyKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxudmFyIFdPRkZEaXJlY3RvcnlFbnRyeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIG9mZnNldDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCAndm9pZCcsIHtcbiAgICB0eXBlOiAnZ2xvYmFsJ1xuICB9KSxcbiAgY29tcExlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgb3JpZ0NoZWNrc3VtOiByZXN0cnVjdHVyZS51aW50MzJcbn0pO1xudmFyIFdPRkZEaXJlY3RvcnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICAvLyBzaG91bGQgYmUgJ3dPRkYnXG4gIGZsYXZvcjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbnVtVGFibGVzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgdG90YWxTZm50U2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBtYWpvclZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWlub3JWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1ldGFPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbWV0YUxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBtZXRhT3JpZ0xlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBwcml2T2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHByaXZMZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgdGFibGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoV09GRkRpcmVjdG9yeUVudHJ5LCAnbnVtVGFibGVzJylcbn0pO1xuXG5XT0ZGRGlyZWN0b3J5LnByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0YWJsZXMgPSB7fTtcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHIodGhpcy50YWJsZXMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgIHZhciB0YWJsZSA9IF9zdGVwLnZhbHVlO1xuICAgIHRhYmxlc1t0YWJsZS50YWddID0gdGFibGU7XG4gIH1cblxuICB0aGlzLnRhYmxlcyA9IHRhYmxlcztcbn07XG5cbnZhciBUSU5GX09LJDEgPSAwO1xudmFyIFRJTkZfREFUQV9FUlJPUiQxID0gLTM7XG5cbmZ1bmN0aW9uIFRyZWUkMSgpIHtcbiAgdGhpcy50YWJsZSA9IG5ldyBVaW50MTZBcnJheSgxNik7XG4gIC8qIHRhYmxlIG9mIGNvZGUgbGVuZ3RoIGNvdW50cyAqL1xuXG4gIHRoaXMudHJhbnMgPSBuZXcgVWludDE2QXJyYXkoMjg4KTtcbiAgLyogY29kZSAtPiBzeW1ib2wgdHJhbnNsYXRpb24gdGFibGUgKi9cbn1cblxuZnVuY3Rpb24gRGF0YSQxKHNvdXJjZSwgZGVzdCkge1xuICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgdGhpcy5zb3VyY2VJbmRleCA9IDA7XG4gIHRoaXMudGFnID0gMDtcbiAgdGhpcy5iaXRjb3VudCA9IDA7XG4gIHRoaXMuZGVzdCA9IGRlc3Q7XG4gIHRoaXMuZGVzdExlbiA9IDA7XG4gIHRoaXMubHRyZWUgPSBuZXcgVHJlZSQxKCk7XG4gIC8qIGR5bmFtaWMgbGVuZ3RoL3N5bWJvbCB0cmVlICovXG5cbiAgdGhpcy5kdHJlZSA9IG5ldyBUcmVlJDEoKTtcbiAgLyogZHluYW1pYyBkaXN0YW5jZSB0cmVlICovXG59XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKlxuICogLS0gdW5pbml0aWFsaXplZCBnbG9iYWwgZGF0YSAoc3RhdGljIHN0cnVjdHVyZXMpIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cbnZhciBzbHRyZWUkMSA9IG5ldyBUcmVlJDEoKTtcbnZhciBzZHRyZWUkMSA9IG5ldyBUcmVlJDEoKTtcbi8qIGV4dHJhIGJpdHMgYW5kIGJhc2UgdGFibGVzIGZvciBsZW5ndGggY29kZXMgKi9cblxudmFyIGxlbmd0aF9iaXRzJDEgPSBuZXcgVWludDhBcnJheSgzMCk7XG52YXIgbGVuZ3RoX2Jhc2UkMSA9IG5ldyBVaW50MTZBcnJheSgzMCk7XG4vKiBleHRyYSBiaXRzIGFuZCBiYXNlIHRhYmxlcyBmb3IgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIGRpc3RfYml0cyQxID0gbmV3IFVpbnQ4QXJyYXkoMzApO1xudmFyIGRpc3RfYmFzZSQxID0gbmV3IFVpbnQxNkFycmF5KDMwKTtcbi8qIHNwZWNpYWwgb3JkZXJpbmcgb2YgY29kZSBsZW5ndGggY29kZXMgKi9cblxudmFyIGNsY2lkeCQxID0gbmV3IFVpbnQ4QXJyYXkoWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdKTtcbi8qIHVzZWQgYnkgdGluZl9kZWNvZGVfdHJlZXMsIGF2b2lkcyBhbGxvY2F0aW9ucyBldmVyeSBjYWxsICovXG5cbnZhciBjb2RlX3RyZWUkMSA9IG5ldyBUcmVlJDEoKTtcbnZhciBsZW5ndGhzJDEgPSBuZXcgVWludDhBcnJheSgyODggKyAzMik7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSB1dGlsaXR5IGZ1bmN0aW9ucyAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiBidWlsZCBleHRyYSBiaXRzIGFuZCBiYXNlIHRhYmxlcyAqL1xuXG5mdW5jdGlvbiB0aW5mX2J1aWxkX2JpdHNfYmFzZSQxKGJpdHMsIGJhc2UsIGRlbHRhLCBmaXJzdCkge1xuICB2YXIgaSwgc3VtO1xuICAvKiBidWlsZCBiaXRzIHRhYmxlICovXG5cbiAgZm9yIChpID0gMDsgaSA8IGRlbHRhOyArK2kpIHtcbiAgICBiaXRzW2ldID0gMDtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCAzMCAtIGRlbHRhOyArK2kpIHtcbiAgICBiaXRzW2kgKyBkZWx0YV0gPSBpIC8gZGVsdGEgfCAwO1xuICB9XG4gIC8qIGJ1aWxkIGJhc2UgdGFibGUgKi9cblxuXG4gIGZvciAoc3VtID0gZmlyc3QsIGkgPSAwOyBpIDwgMzA7ICsraSkge1xuICAgIGJhc2VbaV0gPSBzdW07XG4gICAgc3VtICs9IDEgPDwgYml0c1tpXTtcbiAgfVxufVxuLyogYnVpbGQgdGhlIGZpeGVkIGh1ZmZtYW4gdHJlZXMgKi9cblxuXG5mdW5jdGlvbiB0aW5mX2J1aWxkX2ZpeGVkX3RyZWVzJDEobHQsIGR0KSB7XG4gIHZhciBpO1xuICAvKiBidWlsZCBmaXhlZCBsZW5ndGggdHJlZSAqL1xuXG4gIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICBsdC50YWJsZVtpXSA9IDA7XG4gIH1cblxuICBsdC50YWJsZVs3XSA9IDI0O1xuICBsdC50YWJsZVs4XSA9IDE1MjtcbiAgbHQudGFibGVbOV0gPSAxMTI7XG5cbiAgZm9yIChpID0gMDsgaSA8IDI0OyArK2kpIHtcbiAgICBsdC50cmFuc1tpXSA9IDI1NiArIGk7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgMTQ0OyArK2kpIHtcbiAgICBsdC50cmFuc1syNCArIGldID0gaTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHtcbiAgICBsdC50cmFuc1syNCArIDE0NCArIGldID0gMjgwICsgaTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCAxMTI7ICsraSkge1xuICAgIGx0LnRyYW5zWzI0ICsgMTQ0ICsgOCArIGldID0gMTQ0ICsgaTtcbiAgfVxuICAvKiBidWlsZCBmaXhlZCBkaXN0YW5jZSB0cmVlICovXG5cblxuICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7XG4gICAgZHQudGFibGVbaV0gPSAwO1xuICB9XG5cbiAgZHQudGFibGVbNV0gPSAzMjtcblxuICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkge1xuICAgIGR0LnRyYW5zW2ldID0gaTtcbiAgfVxufVxuLyogZ2l2ZW4gYW4gYXJyYXkgb2YgY29kZSBsZW5ndGhzLCBidWlsZCBhIHRyZWUgKi9cblxuXG52YXIgb2ZmcyQxID0gbmV3IFVpbnQxNkFycmF5KDE2KTtcblxuZnVuY3Rpb24gdGluZl9idWlsZF90cmVlJDEodCwgbGVuZ3Rocywgb2ZmLCBudW0pIHtcbiAgdmFyIGksIHN1bTtcbiAgLyogY2xlYXIgY29kZSBsZW5ndGggY291bnQgdGFibGUgKi9cblxuICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgIHQudGFibGVbaV0gPSAwO1xuICB9XG4gIC8qIHNjYW4gc3ltYm9sIGxlbmd0aHMsIGFuZCBzdW0gY29kZSBsZW5ndGggY291bnRzICovXG5cblxuICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHtcbiAgICB0LnRhYmxlW2xlbmd0aHNbb2ZmICsgaV1dKys7XG4gIH1cblxuICB0LnRhYmxlWzBdID0gMDtcbiAgLyogY29tcHV0ZSBvZmZzZXQgdGFibGUgZm9yIGRpc3RyaWJ1dGlvbiBzb3J0ICovXG5cbiAgZm9yIChzdW0gPSAwLCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICBvZmZzJDFbaV0gPSBzdW07XG4gICAgc3VtICs9IHQudGFibGVbaV07XG4gIH1cbiAgLyogY3JlYXRlIGNvZGUtPnN5bWJvbCB0cmFuc2xhdGlvbiB0YWJsZSAoc3ltYm9scyBzb3J0ZWQgYnkgY29kZSkgKi9cblxuXG4gIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkge1xuICAgIGlmIChsZW5ndGhzW29mZiArIGldKSB0LnRyYW5zW29mZnMkMVtsZW5ndGhzW29mZiArIGldXSsrXSA9IGk7XG4gIH1cbn1cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKlxuICogLS0gZGVjb2RlIGZ1bmN0aW9ucyAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qIGdldCBvbmUgYml0IGZyb20gc291cmNlIHN0cmVhbSAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfZ2V0Yml0JDEoZCkge1xuICAvKiBjaGVjayBpZiB0YWcgaXMgZW1wdHkgKi9cbiAgaWYgKCFkLmJpdGNvdW50LS0pIHtcbiAgICAvKiBsb2FkIG5leHQgdGFnICovXG4gICAgZC50YWcgPSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4KytdO1xuICAgIGQuYml0Y291bnQgPSA3O1xuICB9XG4gIC8qIHNoaWZ0IGJpdCBvdXQgb2YgdGFnICovXG5cblxuICB2YXIgYml0ID0gZC50YWcgJiAxO1xuICBkLnRhZyA+Pj49IDE7XG4gIHJldHVybiBiaXQ7XG59XG4vKiByZWFkIGEgbnVtIGJpdCB2YWx1ZSBmcm9tIGEgc3RyZWFtIGFuZCBhZGQgYmFzZSAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfcmVhZF9iaXRzJDEoZCwgbnVtLCBiYXNlKSB7XG4gIGlmICghbnVtKSByZXR1cm4gYmFzZTtcblxuICB3aGlsZSAoZC5iaXRjb3VudCA8IDI0KSB7XG4gICAgZC50YWcgfD0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCsrXSA8PCBkLmJpdGNvdW50O1xuICAgIGQuYml0Y291bnQgKz0gODtcbiAgfVxuXG4gIHZhciB2YWwgPSBkLnRhZyAmIDB4ZmZmZiA+Pj4gMTYgLSBudW07XG4gIGQudGFnID4+Pj0gbnVtO1xuICBkLmJpdGNvdW50IC09IG51bTtcbiAgcmV0dXJuIHZhbCArIGJhc2U7XG59XG4vKiBnaXZlbiBhIGRhdGEgc3RyZWFtIGFuZCBhIHRyZWUsIGRlY29kZSBhIHN5bWJvbCAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfZGVjb2RlX3N5bWJvbCQxKGQsIHQpIHtcbiAgd2hpbGUgKGQuYml0Y291bnQgPCAyNCkge1xuICAgIGQudGFnIHw9IGQuc291cmNlW2Quc291cmNlSW5kZXgrK10gPDwgZC5iaXRjb3VudDtcbiAgICBkLmJpdGNvdW50ICs9IDg7XG4gIH1cblxuICB2YXIgc3VtID0gMCxcbiAgICAgIGN1ciA9IDAsXG4gICAgICBsZW4gPSAwO1xuICB2YXIgdGFnID0gZC50YWc7XG4gIC8qIGdldCBtb3JlIGJpdHMgd2hpbGUgY29kZSB2YWx1ZSBpcyBhYm92ZSBzdW0gKi9cblxuICBkbyB7XG4gICAgY3VyID0gMiAqIGN1ciArICh0YWcgJiAxKTtcbiAgICB0YWcgPj4+PSAxO1xuICAgICsrbGVuO1xuICAgIHN1bSArPSB0LnRhYmxlW2xlbl07XG4gICAgY3VyIC09IHQudGFibGVbbGVuXTtcbiAgfSB3aGlsZSAoY3VyID49IDApO1xuXG4gIGQudGFnID0gdGFnO1xuICBkLmJpdGNvdW50IC09IGxlbjtcbiAgcmV0dXJuIHQudHJhbnNbc3VtICsgY3VyXTtcbn1cbi8qIGdpdmVuIGEgZGF0YSBzdHJlYW0sIGRlY29kZSBkeW5hbWljIHRyZWVzIGZyb20gaXQgKi9cblxuXG5mdW5jdGlvbiB0aW5mX2RlY29kZV90cmVlcyQxKGQsIGx0LCBkdCkge1xuICB2YXIgaGxpdCwgaGRpc3QsIGhjbGVuO1xuICB2YXIgaSwgbnVtLCBsZW5ndGg7XG4gIC8qIGdldCA1IGJpdHMgSExJVCAoMjU3LTI4NikgKi9cblxuICBobGl0ID0gdGluZl9yZWFkX2JpdHMkMShkLCA1LCAyNTcpO1xuICAvKiBnZXQgNSBiaXRzIEhESVNUICgxLTMyKSAqL1xuXG4gIGhkaXN0ID0gdGluZl9yZWFkX2JpdHMkMShkLCA1LCAxKTtcbiAgLyogZ2V0IDQgYml0cyBIQ0xFTiAoNC0xOSkgKi9cblxuICBoY2xlbiA9IHRpbmZfcmVhZF9iaXRzJDEoZCwgNCwgNCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IDE5OyArK2kpIHtcbiAgICBsZW5ndGhzJDFbaV0gPSAwO1xuICB9XG4gIC8qIHJlYWQgY29kZSBsZW5ndGhzIGZvciBjb2RlIGxlbmd0aCBhbHBoYWJldCAqL1xuXG5cbiAgZm9yIChpID0gMDsgaSA8IGhjbGVuOyArK2kpIHtcbiAgICAvKiBnZXQgMyBiaXRzIGNvZGUgbGVuZ3RoICgwLTcpICovXG4gICAgdmFyIGNsZW4gPSB0aW5mX3JlYWRfYml0cyQxKGQsIDMsIDApO1xuICAgIGxlbmd0aHMkMVtjbGNpZHgkMVtpXV0gPSBjbGVuO1xuICB9XG4gIC8qIGJ1aWxkIGNvZGUgbGVuZ3RoIHRyZWUgKi9cblxuXG4gIHRpbmZfYnVpbGRfdHJlZSQxKGNvZGVfdHJlZSQxLCBsZW5ndGhzJDEsIDAsIDE5KTtcbiAgLyogZGVjb2RlIGNvZGUgbGVuZ3RocyBmb3IgdGhlIGR5bmFtaWMgdHJlZXMgKi9cblxuICBmb3IgKG51bSA9IDA7IG51bSA8IGhsaXQgKyBoZGlzdDspIHtcbiAgICB2YXIgc3ltID0gdGluZl9kZWNvZGVfc3ltYm9sJDEoZCwgY29kZV90cmVlJDEpO1xuXG4gICAgc3dpdGNoIChzeW0pIHtcbiAgICAgIGNhc2UgMTY6XG4gICAgICAgIC8qIGNvcHkgcHJldmlvdXMgY29kZSBsZW5ndGggMy02IHRpbWVzIChyZWFkIDIgYml0cykgKi9cbiAgICAgICAgdmFyIHByZXYgPSBsZW5ndGhzJDFbbnVtIC0gMV07XG5cbiAgICAgICAgZm9yIChsZW5ndGggPSB0aW5mX3JlYWRfYml0cyQxKGQsIDIsIDMpOyBsZW5ndGg7IC0tbGVuZ3RoKSB7XG4gICAgICAgICAgbGVuZ3RocyQxW251bSsrXSA9IHByZXY7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAxNzpcbiAgICAgICAgLyogcmVwZWF0IGNvZGUgbGVuZ3RoIDAgZm9yIDMtMTAgdGltZXMgKHJlYWQgMyBiaXRzKSAqL1xuICAgICAgICBmb3IgKGxlbmd0aCA9IHRpbmZfcmVhZF9iaXRzJDEoZCwgMywgMyk7IGxlbmd0aDsgLS1sZW5ndGgpIHtcbiAgICAgICAgICBsZW5ndGhzJDFbbnVtKytdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDE4OlxuICAgICAgICAvKiByZXBlYXQgY29kZSBsZW5ndGggMCBmb3IgMTEtMTM4IHRpbWVzIChyZWFkIDcgYml0cykgKi9cbiAgICAgICAgZm9yIChsZW5ndGggPSB0aW5mX3JlYWRfYml0cyQxKGQsIDcsIDExKTsgbGVuZ3RoOyAtLWxlbmd0aCkge1xuICAgICAgICAgIGxlbmd0aHMkMVtudW0rK10gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qIHZhbHVlcyAwLTE1IHJlcHJlc2VudCB0aGUgYWN0dWFsIGNvZGUgbGVuZ3RocyAqL1xuICAgICAgICBsZW5ndGhzJDFbbnVtKytdID0gc3ltO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyogYnVpbGQgZHluYW1pYyB0cmVlcyAqL1xuXG5cbiAgdGluZl9idWlsZF90cmVlJDEobHQsIGxlbmd0aHMkMSwgMCwgaGxpdCk7XG4gIHRpbmZfYnVpbGRfdHJlZSQxKGR0LCBsZW5ndGhzJDEsIGhsaXQsIGhkaXN0KTtcbn1cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIGJsb2NrIGluZmxhdGUgZnVuY3Rpb25zIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qIGdpdmVuIGEgc3RyZWFtIGFuZCB0d28gdHJlZXMsIGluZmxhdGUgYSBibG9jayBvZiBkYXRhICovXG5cblxuZnVuY3Rpb24gdGluZl9pbmZsYXRlX2Jsb2NrX2RhdGEkMShkLCBsdCwgZHQpIHtcbiAgd2hpbGUgKDEpIHtcbiAgICB2YXIgc3ltID0gdGluZl9kZWNvZGVfc3ltYm9sJDEoZCwgbHQpO1xuICAgIC8qIGNoZWNrIGZvciBlbmQgb2YgYmxvY2sgKi9cblxuICAgIGlmIChzeW0gPT09IDI1Nikge1xuICAgICAgcmV0dXJuIFRJTkZfT0skMTtcbiAgICB9XG5cbiAgICBpZiAoc3ltIDwgMjU2KSB7XG4gICAgICBkLmRlc3RbZC5kZXN0TGVuKytdID0gc3ltO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbGVuZ3RoLCBkaXN0LCBvZmZzO1xuICAgICAgdmFyIGk7XG4gICAgICBzeW0gLT0gMjU3O1xuICAgICAgLyogcG9zc2libHkgZ2V0IG1vcmUgYml0cyBmcm9tIGxlbmd0aCBjb2RlICovXG5cbiAgICAgIGxlbmd0aCA9IHRpbmZfcmVhZF9iaXRzJDEoZCwgbGVuZ3RoX2JpdHMkMVtzeW1dLCBsZW5ndGhfYmFzZSQxW3N5bV0pO1xuICAgICAgZGlzdCA9IHRpbmZfZGVjb2RlX3N5bWJvbCQxKGQsIGR0KTtcbiAgICAgIC8qIHBvc3NpYmx5IGdldCBtb3JlIGJpdHMgZnJvbSBkaXN0YW5jZSBjb2RlICovXG5cbiAgICAgIG9mZnMgPSBkLmRlc3RMZW4gLSB0aW5mX3JlYWRfYml0cyQxKGQsIGRpc3RfYml0cyQxW2Rpc3RdLCBkaXN0X2Jhc2UkMVtkaXN0XSk7XG4gICAgICAvKiBjb3B5IG1hdGNoICovXG5cbiAgICAgIGZvciAoaSA9IG9mZnM7IGkgPCBvZmZzICsgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZC5kZXN0W2QuZGVzdExlbisrXSA9IGQuZGVzdFtpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qIGluZmxhdGUgYW4gdW5jb21wcmVzc2VkIGJsb2NrIG9mIGRhdGEgKi9cblxuXG5mdW5jdGlvbiB0aW5mX2luZmxhdGVfdW5jb21wcmVzc2VkX2Jsb2NrJDEoZCkge1xuICB2YXIgbGVuZ3RoLCBpbnZsZW5ndGg7XG4gIHZhciBpO1xuICAvKiB1bnJlYWQgZnJvbSBiaXRidWZmZXIgKi9cblxuICB3aGlsZSAoZC5iaXRjb3VudCA+IDgpIHtcbiAgICBkLnNvdXJjZUluZGV4LS07XG4gICAgZC5iaXRjb3VudCAtPSA4O1xuICB9XG4gIC8qIGdldCBsZW5ndGggKi9cblxuXG4gIGxlbmd0aCA9IGQuc291cmNlW2Quc291cmNlSW5kZXggKyAxXTtcbiAgbGVuZ3RoID0gMjU2ICogbGVuZ3RoICsgZC5zb3VyY2VbZC5zb3VyY2VJbmRleF07XG4gIC8qIGdldCBvbmUncyBjb21wbGVtZW50IG9mIGxlbmd0aCAqL1xuXG4gIGludmxlbmd0aCA9IGQuc291cmNlW2Quc291cmNlSW5kZXggKyAzXTtcbiAgaW52bGVuZ3RoID0gMjU2ICogaW52bGVuZ3RoICsgZC5zb3VyY2VbZC5zb3VyY2VJbmRleCArIDJdO1xuICAvKiBjaGVjayBsZW5ndGggKi9cblxuICBpZiAobGVuZ3RoICE9PSAofmludmxlbmd0aCAmIDB4MDAwMGZmZmYpKSByZXR1cm4gVElORl9EQVRBX0VSUk9SJDE7XG4gIGQuc291cmNlSW5kZXggKz0gNDtcbiAgLyogY29weSBibG9jayAqL1xuXG4gIGZvciAoaSA9IGxlbmd0aDsgaTsgLS1pKSB7XG4gICAgZC5kZXN0W2QuZGVzdExlbisrXSA9IGQuc291cmNlW2Quc291cmNlSW5kZXgrK107XG4gIH1cbiAgLyogbWFrZSBzdXJlIHdlIHN0YXJ0IG5leHQgYmxvY2sgb24gYSBieXRlIGJvdW5kYXJ5ICovXG5cblxuICBkLmJpdGNvdW50ID0gMDtcbiAgcmV0dXJuIFRJTkZfT0skMTtcbn1cbi8qIGluZmxhdGUgc3RyZWFtIGZyb20gc291cmNlIHRvIGRlc3QgKi9cblxuXG5mdW5jdGlvbiB0aW5mX3VuY29tcHJlc3MkMShzb3VyY2UsIGRlc3QpIHtcbiAgdmFyIGQgPSBuZXcgRGF0YSQxKHNvdXJjZSwgZGVzdCk7XG4gIHZhciBiZmluYWwsIGJ0eXBlLCByZXM7XG5cbiAgZG8ge1xuICAgIC8qIHJlYWQgZmluYWwgYmxvY2sgZmxhZyAqL1xuICAgIGJmaW5hbCA9IHRpbmZfZ2V0Yml0JDEoZCk7XG4gICAgLyogcmVhZCBibG9jayB0eXBlICgyIGJpdHMpICovXG5cbiAgICBidHlwZSA9IHRpbmZfcmVhZF9iaXRzJDEoZCwgMiwgMCk7XG4gICAgLyogZGVjb21wcmVzcyBibG9jayAqL1xuXG4gICAgc3dpdGNoIChidHlwZSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICAvKiBkZWNvbXByZXNzIHVuY29tcHJlc3NlZCBibG9jayAqL1xuICAgICAgICByZXMgPSB0aW5mX2luZmxhdGVfdW5jb21wcmVzc2VkX2Jsb2NrJDEoZCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDE6XG4gICAgICAgIC8qIGRlY29tcHJlc3MgYmxvY2sgd2l0aCBmaXhlZCBodWZmbWFuIHRyZWVzICovXG4gICAgICAgIHJlcyA9IHRpbmZfaW5mbGF0ZV9ibG9ja19kYXRhJDEoZCwgc2x0cmVlJDEsIHNkdHJlZSQxKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgLyogZGVjb21wcmVzcyBibG9jayB3aXRoIGR5bmFtaWMgaHVmZm1hbiB0cmVlcyAqL1xuICAgICAgICB0aW5mX2RlY29kZV90cmVlcyQxKGQsIGQubHRyZWUsIGQuZHRyZWUpO1xuICAgICAgICByZXMgPSB0aW5mX2luZmxhdGVfYmxvY2tfZGF0YSQxKGQsIGQubHRyZWUsIGQuZHRyZWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVzID0gVElORl9EQVRBX0VSUk9SJDE7XG4gICAgfVxuXG4gICAgaWYgKHJlcyAhPT0gVElORl9PSyQxKSB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgZXJyb3InKTtcbiAgfSB3aGlsZSAoIWJmaW5hbCk7XG5cbiAgaWYgKGQuZGVzdExlbiA8IGQuZGVzdC5sZW5ndGgpIHtcbiAgICBpZiAodHlwZW9mIGQuZGVzdC5zbGljZSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGQuZGVzdC5zbGljZSgwLCBkLmRlc3RMZW4pO2Vsc2UgcmV0dXJuIGQuZGVzdC5zdWJhcnJheSgwLCBkLmRlc3RMZW4pO1xuICB9XG5cbiAgcmV0dXJuIGQuZGVzdDtcbn1cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIGluaXRpYWxpemF0aW9uIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdHJlZXMgKi9cblxuXG50aW5mX2J1aWxkX2ZpeGVkX3RyZWVzJDEoc2x0cmVlJDEsIHNkdHJlZSQxKTtcbi8qIGJ1aWxkIGV4dHJhIGJpdHMgYW5kIGJhc2UgdGFibGVzICovXG5cbnRpbmZfYnVpbGRfYml0c19iYXNlJDEobGVuZ3RoX2JpdHMkMSwgbGVuZ3RoX2Jhc2UkMSwgNCwgMyk7XG50aW5mX2J1aWxkX2JpdHNfYmFzZSQxKGRpc3RfYml0cyQxLCBkaXN0X2Jhc2UkMSwgMiwgMSk7XG4vKiBmaXggYSBzcGVjaWFsIGNhc2UgKi9cblxubGVuZ3RoX2JpdHMkMVsyOF0gPSAwO1xubGVuZ3RoX2Jhc2UkMVsyOF0gPSAyNTg7XG52YXIgdGlueUluZmxhdGUkMSA9IHRpbmZfdW5jb21wcmVzcyQxO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSRmKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgV09GRkZvbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9UVEZGb250KSB7XG4gIF9pbmhlcml0c0xvb3NlJGYoV09GRkZvbnQsIF9UVEZGb250KTtcblxuICBmdW5jdGlvbiBXT0ZGRm9udCgpIHtcbiAgICByZXR1cm4gX1RURkZvbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgV09GRkZvbnQucHJvYmUgPSBmdW5jdGlvbiBwcm9iZShidWZmZXIpIHtcbiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCdhc2NpaScsIDAsIDQpID09PSAnd09GRic7XG4gIH07XG5cbiAgdmFyIF9wcm90byA9IFdPRkZGb250LnByb3RvdHlwZTtcblxuICBfcHJvdG8uX2RlY29kZURpcmVjdG9yeSA9IGZ1bmN0aW9uIF9kZWNvZGVEaXJlY3RvcnkoKSB7XG4gICAgdGhpcy5kaXJlY3RvcnkgPSBXT0ZGRGlyZWN0b3J5LmRlY29kZSh0aGlzLnN0cmVhbSwge1xuICAgICAgX3N0YXJ0T2Zmc2V0OiAwXG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLl9nZXRUYWJsZVN0cmVhbSA9IGZ1bmN0aW9uIF9nZXRUYWJsZVN0cmVhbSh0YWcpIHtcbiAgICB2YXIgdGFibGUgPSB0aGlzLmRpcmVjdG9yeS50YWJsZXNbdGFnXTtcblxuICAgIGlmICh0YWJsZSkge1xuICAgICAgdGhpcy5zdHJlYW0ucG9zID0gdGFibGUub2Zmc2V0O1xuXG4gICAgICBpZiAodGFibGUuY29tcExlbmd0aCA8IHRhYmxlLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnN0cmVhbS5wb3MgKz0gMjsgLy8gc2tpcCBkZWZsYXRlIGhlYWRlclxuXG4gICAgICAgIHZhciBvdXRCdWZmZXIgPSBuZXcgYnVmZmVyXzEodGFibGUubGVuZ3RoKTtcbiAgICAgICAgdmFyIGJ1ZiA9IHRpbnlJbmZsYXRlJDEodGhpcy5zdHJlYW0ucmVhZEJ1ZmZlcih0YWJsZS5jb21wTGVuZ3RoIC0gMiksIG91dEJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgcmVzdHJ1Y3R1cmUuRGVjb2RlU3RyZWFtKGJ1Zik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIFdPRkZGb250O1xufShUVEZGb250KTtcblxuZnVuY3Rpb24gQnJvdGxpSW5wdXQoYnVmZmVyKSB7XG4gIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICB0aGlzLnBvcyA9IDA7XG59XG5cbkJyb3RsaUlucHV0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKGJ1ZiwgaSwgY291bnQpIHtcbiAgaWYgKHRoaXMucG9zICsgY291bnQgPiB0aGlzLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICBjb3VudCA9IHRoaXMuYnVmZmVyLmxlbmd0aCAtIHRoaXMucG9zO1xuICB9XG5cbiAgZm9yICh2YXIgcCA9IDA7IHAgPCBjb3VudDsgcCsrKSB7XG4gICAgYnVmW2kgKyBwXSA9IHRoaXMuYnVmZmVyW3RoaXMucG9zICsgcF07XG4gIH1cblxuICB0aGlzLnBvcyArPSBjb3VudDtcbiAgcmV0dXJuIGNvdW50O1xufTtcblxudmFyIEJyb3RsaUlucHV0XzEgPSBCcm90bGlJbnB1dDtcblxuZnVuY3Rpb24gQnJvdGxpT3V0cHV0KGJ1Zikge1xuICB0aGlzLmJ1ZmZlciA9IGJ1ZjtcbiAgdGhpcy5wb3MgPSAwO1xufVxuXG5Ccm90bGlPdXRwdXQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1ZiwgY291bnQpIHtcbiAgaWYgKHRoaXMucG9zICsgY291bnQgPiB0aGlzLmJ1ZmZlci5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignT3V0cHV0IGJ1ZmZlciBpcyBub3QgbGFyZ2UgZW5vdWdoJyk7XG4gIHRoaXMuYnVmZmVyLnNldChidWYuc3ViYXJyYXkoMCwgY291bnQpLCB0aGlzLnBvcyk7XG4gIHRoaXMucG9zICs9IGNvdW50O1xuICByZXR1cm4gY291bnQ7XG59O1xuXG52YXIgQnJvdGxpT3V0cHV0XzEgPSBCcm90bGlPdXRwdXQ7XG52YXIgc3RyZWFtcyQxID0ge1xuICBCcm90bGlJbnB1dDogQnJvdGxpSW5wdXRfMSxcbiAgQnJvdGxpT3V0cHV0OiBCcm90bGlPdXRwdXRfMVxufTtcblxuLyogQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblxuICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuICAgQml0IHJlYWRpbmcgaGVscGVyc1xuKi9cbnZhciBCUk9UTElfUkVBRF9TSVpFID0gNDA5NjtcbnZhciBCUk9UTElfSUJVRl9TSVpFID0gMiAqIEJST1RMSV9SRUFEX1NJWkUgKyAzMjtcbnZhciBCUk9UTElfSUJVRl9NQVNLID0gMiAqIEJST1RMSV9SRUFEX1NJWkUgLSAxO1xudmFyIGtCaXRNYXNrID0gbmV3IFVpbnQzMkFycmF5KFswLCAxLCAzLCA3LCAxNSwgMzEsIDYzLCAxMjcsIDI1NSwgNTExLCAxMDIzLCAyMDQ3LCA0MDk1LCA4MTkxLCAxNjM4MywgMzI3NjcsIDY1NTM1LCAxMzEwNzEsIDI2MjE0MywgNTI0Mjg3LCAxMDQ4NTc1LCAyMDk3MTUxLCA0MTk0MzAzLCA4Mzg4NjA3LCAxNjc3NzIxNV0pO1xuLyogSW5wdXQgYnl0ZSBidWZmZXIsIGNvbnNpc3Qgb2YgYSByaW5nYnVmZmVyIGFuZCBhIFwic2xhY2tcIiByZWdpb24gd2hlcmUgKi9cblxuLyogYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHJpbmdidWZmZXIgYXJlIGNvcGllZC4gKi9cblxuZnVuY3Rpb24gQnJvdGxpQml0UmVhZGVyKGlucHV0KSB7XG4gIHRoaXMuYnVmXyA9IG5ldyBVaW50OEFycmF5KEJST1RMSV9JQlVGX1NJWkUpO1xuICB0aGlzLmlucHV0XyA9IGlucHV0O1xuICAvKiBpbnB1dCBjYWxsYmFjayAqL1xuXG4gIHRoaXMucmVzZXQoKTtcbn1cblxuQnJvdGxpQml0UmVhZGVyLlJFQURfU0laRSA9IEJST1RMSV9SRUFEX1NJWkU7XG5Ccm90bGlCaXRSZWFkZXIuSUJVRl9NQVNLID0gQlJPVExJX0lCVUZfTUFTSztcblxuQnJvdGxpQml0UmVhZGVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5idWZfcHRyXyA9IDA7XG4gIC8qIG5leHQgaW5wdXQgd2lsbCB3cml0ZSBoZXJlICovXG5cbiAgdGhpcy52YWxfID0gMDtcbiAgLyogcHJlLWZldGNoZWQgYml0cyAqL1xuXG4gIHRoaXMucG9zXyA9IDA7XG4gIC8qIGJ5dGUgcG9zaXRpb24gaW4gc3RyZWFtICovXG5cbiAgdGhpcy5iaXRfcG9zXyA9IDA7XG4gIC8qIGN1cnJlbnQgYml0LXJlYWRpbmcgcG9zaXRpb24gaW4gdmFsXyAqL1xuXG4gIHRoaXMuYml0X2VuZF9wb3NfID0gMDtcbiAgLyogYml0LXJlYWRpbmcgZW5kIHBvc2l0aW9uIGZyb20gTFNCIG9mIHZhbF8gKi9cblxuICB0aGlzLmVvc18gPSAwO1xuICAvKiBpbnB1dCBzdHJlYW0gaXMgZmluaXNoZWQgKi9cblxuICB0aGlzLnJlYWRNb3JlSW5wdXQoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIHRoaXMudmFsXyB8PSB0aGlzLmJ1Zl9bdGhpcy5wb3NfXSA8PCA4ICogaTtcbiAgICArK3RoaXMucG9zXztcbiAgfVxuXG4gIHJldHVybiB0aGlzLmJpdF9lbmRfcG9zXyA+IDA7XG59O1xuLyogRmlsbHMgdXAgdGhlIGlucHV0IHJpbmdidWZmZXIgYnkgY2FsbGluZyB0aGUgaW5wdXQgY2FsbGJhY2suXG5cbiAgIERvZXMgbm90aGluZyBpZiB0aGVyZSBhcmUgYXQgbGVhc3QgMzIgYnl0ZXMgcHJlc2VudCBhZnRlciBjdXJyZW50IHBvc2l0aW9uLlxuXG4gICBSZXR1cm5zIDAgaWYgZWl0aGVyOlxuICAgIC0gdGhlIGlucHV0IGNhbGxiYWNrIHJldHVybmVkIGFuIGVycm9yLCBvclxuICAgIC0gdGhlcmUgaXMgbm8gbW9yZSBpbnB1dCBhbmQgdGhlIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLlxuXG4gICBBZnRlciBlbmNvdW50ZXJpbmcgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyZWFtLCAzMiBhZGRpdGlvbmFsIHplcm8gYnl0ZXMgYXJlXG4gICBjb3BpZWQgdG8gdGhlIHJpbmdidWZmZXIsIHRoZXJlZm9yZSBpdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlclxuICAgZXZlcnkgMzIgYnl0ZXMgb2YgaW5wdXQgaXMgcmVhZC5cbiovXG5cblxuQnJvdGxpQml0UmVhZGVyLnByb3RvdHlwZS5yZWFkTW9yZUlucHV0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5iaXRfZW5kX3Bvc18gPiAyNTYpIHtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAodGhpcy5lb3NfKSB7XG4gICAgaWYgKHRoaXMuYml0X3Bvc18gPiB0aGlzLmJpdF9lbmRfcG9zXykgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCAnICsgdGhpcy5iaXRfcG9zXyArICcgJyArIHRoaXMuYml0X2VuZF9wb3NfKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZHN0ID0gdGhpcy5idWZfcHRyXztcbiAgICB2YXIgYnl0ZXNfcmVhZCA9IHRoaXMuaW5wdXRfLnJlYWQodGhpcy5idWZfLCBkc3QsIEJST1RMSV9SRUFEX1NJWkUpO1xuXG4gICAgaWYgKGJ5dGVzX3JlYWQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Jyk7XG4gICAgfVxuXG4gICAgaWYgKGJ5dGVzX3JlYWQgPCBCUk9UTElfUkVBRF9TSVpFKSB7XG4gICAgICB0aGlzLmVvc18gPSAxO1xuICAgICAgLyogU3RvcmUgMzIgYnl0ZXMgb2YgemVybyBhZnRlciB0aGUgc3RyZWFtIGVuZC4gKi9cblxuICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCAzMjsgcCsrKSB7XG4gICAgICAgIHRoaXMuYnVmX1tkc3QgKyBieXRlc19yZWFkICsgcF0gPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkc3QgPT09IDApIHtcbiAgICAgIC8qIENvcHkgdGhlIGhlYWQgb2YgdGhlIHJpbmdidWZmZXIgdG8gdGhlIHNsYWNrIHJlZ2lvbi4gKi9cbiAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgMzI7IHArKykge1xuICAgICAgICB0aGlzLmJ1Zl9bKEJST1RMSV9SRUFEX1NJWkUgPDwgMSkgKyBwXSA9IHRoaXMuYnVmX1twXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5idWZfcHRyXyA9IEJST1RMSV9SRUFEX1NJWkU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVmX3B0cl8gPSAwO1xuICAgIH1cblxuICAgIHRoaXMuYml0X2VuZF9wb3NfICs9IGJ5dGVzX3JlYWQgPDwgMztcbiAgfVxufTtcbi8qIEd1YXJhbnRlZXMgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgMjQgYml0cyBpbiB0aGUgYnVmZmVyLiAqL1xuXG5cbkJyb3RsaUJpdFJlYWRlci5wcm90b3R5cGUuZmlsbEJpdFdpbmRvdyA9IGZ1bmN0aW9uICgpIHtcbiAgd2hpbGUgKHRoaXMuYml0X3Bvc18gPj0gOCkge1xuICAgIHRoaXMudmFsXyA+Pj49IDg7XG4gICAgdGhpcy52YWxfIHw9IHRoaXMuYnVmX1t0aGlzLnBvc18gJiBCUk9UTElfSUJVRl9NQVNLXSA8PCAyNDtcbiAgICArK3RoaXMucG9zXztcbiAgICB0aGlzLmJpdF9wb3NfID0gdGhpcy5iaXRfcG9zXyAtIDggPj4+IDA7XG4gICAgdGhpcy5iaXRfZW5kX3Bvc18gPSB0aGlzLmJpdF9lbmRfcG9zXyAtIDggPj4+IDA7XG4gIH1cbn07XG4vKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzIGZyb20gUmVhZCBCdWZmZXIuICovXG5cblxuQnJvdGxpQml0UmVhZGVyLnByb3RvdHlwZS5yZWFkQml0cyA9IGZ1bmN0aW9uIChuX2JpdHMpIHtcbiAgaWYgKDMyIC0gdGhpcy5iaXRfcG9zXyA8IG5fYml0cykge1xuICAgIHRoaXMuZmlsbEJpdFdpbmRvdygpO1xuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXMudmFsXyA+Pj4gdGhpcy5iaXRfcG9zXyAmIGtCaXRNYXNrW25fYml0c107XG4gIHRoaXMuYml0X3Bvc18gKz0gbl9iaXRzO1xuICByZXR1cm4gdmFsO1xufTtcblxudmFyIGJpdF9yZWFkZXIgPSBCcm90bGlCaXRSZWFkZXI7XG5cbnZhciBieXRlTGVuZ3RoXzEkMSA9IGJ5dGVMZW5ndGgkMTtcbnZhciB0b0J5dGVBcnJheV8xJDEgPSB0b0J5dGVBcnJheSQxO1xudmFyIGZyb21CeXRlQXJyYXlfMSQxID0gZnJvbUJ5dGVBcnJheSQxO1xudmFyIGxvb2t1cCQxID0gW107XG52YXIgcmV2TG9va3VwJDEgPSBbXTtcbnZhciBBcnIkMSA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheTtcbnZhciBjb2RlJDEgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbmZvciAodmFyIGkkNCA9IDAsIGxlbiQxID0gY29kZSQxLmxlbmd0aDsgaSQ0IDwgbGVuJDE7ICsraSQ0KSB7XG4gIGxvb2t1cCQxW2kkNF0gPSBjb2RlJDFbaSQ0XTtcbiAgcmV2TG9va3VwJDFbY29kZSQxLmNoYXJDb2RlQXQoaSQ0KV0gPSBpJDQ7XG59IC8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcblxuXG5yZXZMb29rdXAkMVsnLScuY2hhckNvZGVBdCgwKV0gPSA2MjtcbnJldkxvb2t1cCQxWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzO1xuXG5mdW5jdGlvbiBnZXRMZW5zJDEoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoO1xuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpO1xuICB9IC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcblxuXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9Jyk7XG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuO1xuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlbiA/IDAgOiA0IC0gdmFsaWRMZW4gJSA0O1xuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dO1xufSAvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcblxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoJDEoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyQxKGI2NCk7XG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF07XG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdO1xuICByZXR1cm4gKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzTGVuO1xufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCQxKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzTGVuO1xufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSQxKGI2NCkge1xuICB2YXIgdG1wO1xuICB2YXIgbGVucyA9IGdldExlbnMkMShiNjQpO1xuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdO1xuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXTtcbiAgdmFyIGFyciA9IG5ldyBBcnIkMShfYnl0ZUxlbmd0aCQxKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpO1xuICB2YXIgY3VyQnl0ZSA9IDA7IC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcblxuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMCA/IHZhbGlkTGVuIC0gNCA6IHZhbGlkTGVuO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPSByZXZMb29rdXAkMVtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTggfCByZXZMb29rdXAkMVtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyIHwgcmV2TG9va3VwJDFbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2IHwgcmV2TG9va3VwJDFbYjY0LmNoYXJDb2RlQXQoaSArIDMpXTtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCA+PiAxNiAmIDB4RkY7XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgPj4gOCAmIDB4RkY7XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGO1xuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9IHJldkxvb2t1cCQxW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyIHwgcmV2TG9va3VwJDFbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0O1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRjtcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPSByZXZMb29rdXAkMVtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTAgfCByZXZMb29rdXAkMVtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQgfCByZXZMb29rdXAkMVtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDI7XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgPj4gOCAmIDB4RkY7XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0JDEobnVtKSB7XG4gIHJldHVybiBsb29rdXAkMVtudW0gPj4gMTggJiAweDNGXSArIGxvb2t1cCQxW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwJDFbbnVtID4+IDYgJiAweDNGXSArIGxvb2t1cCQxW251bSAmIDB4M0ZdO1xufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayQxKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXA7XG4gIHZhciBvdXRwdXQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9ICh1aW50OFtpXSA8PCAxNiAmIDB4RkYwMDAwKSArICh1aW50OFtpICsgMV0gPDwgOCAmIDB4RkYwMCkgKyAodWludDhbaSArIDJdICYgMHhGRik7XG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0JDEodG1wKSk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5JDEodWludDgpIHtcbiAgdmFyIHRtcDtcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aDtcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzOyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuXG4gIHZhciBwYXJ0cyA9IFtdO1xuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MzsgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcblxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayQxKHVpbnQ4LCBpLCBpICsgbWF4Q2h1bmtMZW5ndGggPiBsZW4yID8gbGVuMiA6IGkgKyBtYXhDaHVua0xlbmd0aCkpO1xuICB9IC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcblxuXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV07XG4gICAgcGFydHMucHVzaChsb29rdXAkMVt0bXAgPj4gMl0gKyBsb29rdXAkMVt0bXAgPDwgNCAmIDB4M0ZdICsgJz09Jyk7XG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdO1xuICAgIHBhcnRzLnB1c2gobG9va3VwJDFbdG1wID4+IDEwXSArIGxvb2t1cCQxW3RtcCA+PiA0ICYgMHgzRl0gKyBsb29rdXAkMVt0bXAgPDwgMiAmIDB4M0ZdICsgJz0nKTtcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKTtcbn1cblxudmFyIGJhc2U2NEpzJDEgPSB7XG4gIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGhfMSQxLFxuICB0b0J5dGVBcnJheTogdG9CeXRlQXJyYXlfMSQxLFxuICBmcm9tQnl0ZUFycmF5OiBmcm9tQnl0ZUFycmF5XzEkMVxufTtcblxudmFyIGRpY3Rpb25hcnlfYmluID0gXCJXNS9mY1FMbjVnS2YyWFViQWlRMVhVTFgrVFp6NkFEVG9Ec2dxazZxVmZlQzBlNG02T08yd2NRMUo3NlpCVlJWMWZSa0VzZHUvLzYyelFzRkVaV1NUQ25NaGNzUUtsUzJxT2h1VllZTUdDa1YwZlhXRW9NRmJFU1hyS0VaOXdkVUVzeXc5ZzRiSmxFdDFZNm9WTXhNUlRFVmJDSXdaekp6Ym9LNWo4bTRZSDAycWdYWWh2MVYrUE00MzVzTFZ4eUhKaWhhSlJFRWhaR3FMMDN0eEdGUUxtNzZjYUdPL292eEt2ekNieS8zdk1UdFgvNDU5ZjBpZ2k3V3V0bktpTVE2d09EU29SaC84THgxVjNROTlNdkt0d0I2YkhkRVJZUlkwaFN0Sm9Nak5lVHNOWDdibitZN2U0RVEzYmY4eEJjN0wwQnN5ZkZQSzQzZEdTWHBMNmNsWUMvSTMyOGg1NC9WWXJRNWkwNjQ4RmdiR3RsODM3c3ZKMzVMM01vdC8rblBsTnBXZ0t4MWdHWFFZcVg2bitiYlo3d3V5Q0hLY1VvazEyWGpxdWI3TlhaR3pxQngwU0QrdXppTmY4N3Q3dmU0Mmp4U0tRb1czbnl4VnJXSUdsRlNoaENLeGpwWlo1TWVHbmEwK2xCa2sra2FOOEY5cUZCQUZnRW9neU1CZGNYL1QxVy9Xbk1PaS83eWNXVVFsb0VCS0dlQzQ4TWtpd3FKa0pPKzEyZVFpT0ZITW1jazZxL0lqV1czUlpsYW55MjNUQm0rY05yLzg0L29pNUdHbUdCWldyWjZqK3p5a1Zveno1ZlQvUUgvRGE2V1RiWllZUHluVk5PN2t4enVOTjJreEtLV2NoZTVXdmVpdFBLQWVjQjhZY0FIei8relhMamNMemtkRFNrdE5JRHdaRTlKOVgrdHRvNDNvSnk2NXdBcE0zbUR6WXRDd1g5bE0rTjVWUjNrWFlvMFozdDBUdFhmZ0JGZzdnVThvTjBEZ2w3ZlpsVWJoTmxsKzB1dW9oUlZLanJFZDhlZ3JTbmR5NS9UZ2QyZ3FqQTRDQVZ1QzdFU1VtTDNEWm9HbmZoUVY4dXducGk4RUd2QVZWc293TlJ4UHVkY2s3K29xQVVEa3dab3BXcUZuVzFyaXNzMHQxejZpQ0lTVktyZVlHTnZRY1h2KzFMOStqYlA4Y2QvZFBVaXFCc28ycSs3WnlGQnZFTkNra1ZyNDRpeVBidE9vT29DZWNXc2l1cU1TTUw1bHYrdk41TXpVcitEbmg3M0c3UTFZblJZSlZZWEhSSmFOQU9CeWlhSzZDdXNnRmRCUEU0MHIwcnZxWFY3dGtzS08yRHJIWVhCVHY4UDV5c3F4RXg4VkRYVUREcWtQSDZOTk9WL2EyV0g4emxrWFJFTFNhOFAraGVOeUpCQlA3UGdzRzFFdFd0TmVmNi9pK2xjYXl6UXdRQ3NkdWlkcGJLZmhXVURnQUVteWhHdS96VlRhY0k2UlMwelRBQnJPWXVlZW1uVmExOXU5ZlQyM04vVGE2UnZUcG9mNURXeWdxcmVDcXJEQWdNNExJRDErMVQvdGFVNnlURlZMcVhPdisvTXVRT0ZuYUY4dkxNS0Q3dEtXRG9CZEFMZ3hGMzN6UWNjQ2NkSHg4ZktJVmRXNjlPN3FIdFhwZUdyOWpiYnBGQStxUk1XcjVocDBzNjdGUGM3SEFpTFYwZzAvcGVabFc3aEpQWUVoWnlocFN3YWhuZjkzL3RaZ2ZxWldYRmRtZFhCenF4R0hMclFLeG9BWTZmUm9CaGdDUlBtbUd1ZVlaNUpleFRWREtVSVh6a0cvZnFwLzBVM2hBZ1FkSjl6dW11dEs2bnFXYmFxdm0xcGd1MDNJWVIrRys4czBqREJCejhjQXBaRlNCZXVXYXN5cW8yT01ES0FaQ296UytHV1N2TC9Ic0U5ckh4b29lMTdVM3MvbFRFK1ZaQWs0ajNkcDZ1SUdhQzBKTWlxUjVDVXNhYlB5TTBkT1lEUjdFYTdpcDRVU1pseWEzOFlmUHR2clgvdEJsaEhpbGo1NW5aMW5mTjI0QU9BaTlCVnR6L01ibjhBRURKQ3FKZ3NWVWE2blFuU3h2MkZzN2wvTmxDenBmWUVqbVByTnlpYi8rdDBlaTJlRU1qdk5oTGtIQ1psY2k0V2hCZTdlUFpUbXpZcWxZOSsxcHh0UzRHQis1bE0xQkhUOXRTMjcwRVdVRFlGcTFJMHlZL2ZOaUFrNGJrOXlCZ21lZi9mMms2QWxZUVpIc05Gblc4d0JReENkNjhpV3Y3LzM1YlhmejNKWm1mR2xpZ1dBS1JqSXMzSXB6eFEyN3ZBZ2xIU2lPekNZeko5TDlBMUNkaXlGdnlSNjZ1Y0E0aktpZnU1ZWh3RVIyNnlWN0hqS3FuNU1mb3pvN0NveHh0OExXV1BUNDdCZU14WDhwMFBqYjdoWm4rNmJ3N3ozTHcrNzY1M2o1c0k4Q0x1NWtUaHBNbGoxbTRjMmNoM2pHY1AxRnNUMTN2dUszcWplY0tUWmsya0hjT1pZNDBVWCtxZGF4c3RacXNxUXFnWHorUUdGOTlaSkxxcjNWWXU0YWVjbDFBYjVHbXFTOGsvR1Y1Yjk1enhRNWQ0RWZYVUo2a1RTL0NYRi9haXFLRE9UMVQ3Sno1ejBQd0RVY3dyOWNsTE4xT0pHQ2lLZnF2YWgraDNYenJCT2lMT1c4d3ZuOGdXNnFFOHZQeGkrRWZ2K1VINTVUN1BRRlZNaDZjWjFwWlFsekpwS1o3UDd1V3Z3UEdKNkRUbFI2d2J5ajNJdjJIeWVmblJvL2R2N2ROeCtxYWEwTjM4aUJzUisrVWlsN1dkNGFmd0ROc3J6REFLNGZYWnd2RVkvamRLdUlLWGxmclFkMkMzOWRXN250blJiSXA5T3RHeTlwUEJuL1YyQVNvaS8yVUpaZlMreHVHTEg4Ym5MdVBsemRUTlM2emR5azhEdC9oNnNmT1c1bXl4aDFmK3pmM3paM01YL21POWNRUHA1cE94OTY3WkE2L3BxSHZjbE5mblVGRitycStWZDdhbEtyNktXUGNJRGhwbjZ2Mks2TmxVdTZMcktvOGIvcFlwVS9HYXpmdnR3aG43dEVPVXVYaHQ1clVKZFNmNnNMallmMFZUWURnd0o4MXlhcUtUVVllai90Ykhja1NSYi9IWmljd0dKcWgxbUFIQi9JdU5zOWRjOXl1dkYzRDVYb2NtM2VsV0ZkcTVvRXk3MGRZRml0Nzl5YUxpTmpQajVVVWNWbVpVVmhRRWhXNVYyWjZDbTRIVkgvUjhxbGFtUll3QmlsZXVoMDdDYkVjZTNUWGEySm1YV0JmK296dDMxOXBzYm9vYmVaaFZud2hNWnpPZVFKemhwVERiUDcxVHY4SHVaeHhVSS8rbWEzWFc2REZERHM0K3FtcEVSd0hHQmQyZWR4d1VLbE9EUmRVV1ovZzBHT2V6cmJ6T1phdUZNYWk0UVU2R1ZIVjZhUE5CaUJuZEhTc1Y0SXpwdlVpaVl5ZzZPeXlyTDREajVxL0x3M041a0F3ZnRFVmw5ck5kN0prNVBEaWoyaFRINndJWG5zeVhrS2VQeGJtSFlnQzhBNmFuNUZvYi9LSDVHdEMwbDRlRnNvK1ZweGVkdEpIZEhwTm0rQnZ5NEM3OXlWT2tyWnNMclEzT0hDZUIwUmEra0JJUmxkVUdsRENFbXEyUndYbmZ5aDZEeithbGs2ZWZ0STJuNnNhc3RSckd3YndzekJlRFJTL0ZhL0t3UkprQ3pUc0xyL0pDczVoT1BFL01QTFlkWjFGMWZ2N0QrVm15c1g2TnBPQzhhVTlGNFFzNkh2RHlVeTlQdkZHREtaL1A1MTAxVFlIRmw4cGpqNndtL3F5Uzc1ZXRaaGhmZzBVRUw0T1ltSGs2bTZkTzE5MkF6b0l5UFNWOVFlZERBNE1sMjNyUmJxeE1QTXhmN0ZKbkRjNUZURWxWUy9QeXFnZVB6bXdWWjI2TldoUkRRK29hVDdseTdlbGw0czNEeXBTMXMwZyt0T3I3WEhycmtaajkreC9tSkJ0dHJMeDk4bEZJYVJaekh6NGFDN3I1Mi9KUTRWakhhaFkyL1lWWFpuL1FDMnp0UWIvc1kzdVJseWM1dlFTOG5MUEdUL24yNzQ5NWk4SFBBMTUyejdGaDVhRnB5bjFHUEpLSHVQTDhJdzk0RHVXM0tqa1VSQVdaWG40RVF5ODl4aUtFSE4xbWsvdGtNNGdZREJ4d05vWXZSZkU2TEZxc3hXSnRQckRHYnNuTE1hcDNLYTNNVW95dFcwY3ZpZW96T21kRVJtaGNxekcrM0htWnYyeVplaUllUVRLR2RSVDRISE54ZWttMXRZKy9uMDZyR21GbGVxTHNjU0VSemN0VEtNNkc5UDBQYzFSbVZ2cmFzY0l4YU8xQ1FDaVlQRTE1YkQ3YzN4U2VXN2dYeFlqZ3hjclVsY2JJdk8wcitZcGxoeDBrVHQzcWFmRE9tRnlNamdHeFh1NzNyZGRNSHBWMXdNdWJ5QUdjZi92NWRMcjVQNzJUYTlsQkYrZnpNSnJNeWN3dis5dm5VM0FOSWwxY0g5dGZXN2FmOHUwL0hHMHZWNDdqTkZYekZUdGFoYTF4dnplL3M4S010Q1l1Y1hjMW56ZmQvTVF5ZFVYbi9iNzJSQnQ1d08vM2pSY01IOUJkaEMveWN0S0JJdmVSWVByTnBEV3FCc084Vk1tUCtXdlJhT2NBNHpSTVIxUHZTb085MnJTN3BZRXYrZlpmRWZUTXpFZE0rNlg1dExseXhFeGhxTFJrbXM1RXVMb3ZMZng2NmRlNWZMMi95WDAySDUyRlBWd2FoclBxbU4vRTBvVlhuc0NLaGJpL3lSeFg4M25SYlVLV2h6WWNlWE9udGZ1WG41MU5zeko2TU83M3BRZjVQbDRpbjNlYzRKVThoRjdwcFYzNCttbTlyMUxZMGVlL2kxTzF3cGQ4K3pmTHp0RTBjcUJ4Z2dpQmk1QnU5NXY5bDNyOXIvVTVod2VMbitUYmZ4b3dyV0RxZEphdUtkOCtxL2RIOHNiUGtjOXR0dXlPOTRmNy9YSy9uSFg0Nk1QRkxFYjVxUWxOUHZoSjUwLzU5dDlmdDNMWHU3dVZhV2FPMmJEckRDblJTelp5V3ZGS3hPMSt2VDhNd3d1blIzYlgwQ2tmUGpxYjRLOU8xOXRuNVg1MFB2bVlwRXdIdGlXOVd0enVWL3M3NkIxenZMTE5rVmlOZDh5U3hJbC8zb3JmcVA5MFR5VEdhZjcvcng4alF6ZUhKWGRtaC9ONllEdmJ2bVRCd0NkeGZFUTFOY0w2d05NZFNJWE5xN2IxRVV6UnkxL0F4c3lrNXAyMkdNRzFiK0d4RmdiSEVyWmg5Mnd1dmNvMEF1T0xYY3Q5aHZ3Mm53L0xxSWNEUlJtSm1tWnpjZ1VhN0pwTS9XVi9TOUlVZmJGNTZUTDJvcnpxd2ViZFJEOG5JWU5KNDFEL2h6MzdGbzExcDJZMjF3elBjbjcxM3FWR2hxdGV2U3RZZkdING42OU9FSnRQdmJiTFlXdnNjRHFjM0hnbnUxNjYrdEF5TG54clgwWTV6b1lqVisrMXNJN3Q1a01yMDJLVC8rdXd0a2MrclpMT2YvcW4vczNuWUNmMTNEZzgvc0IyZGlKZ2pHcWpRK1RMaHhienl1ZTJPYjdYNi85bFV3VzdhK2xiem5Iek9ZeThMS1cxQy91UlBiUVkzS1cvMGdPOUxYdW5ITHZQTDk3YWZiYTliRnRjOWhtejdHQXR0alZZbEN2UUFpT3dBay9nQzUraGtMRXM2dHIzQVpLeExKdE9Fd2syZEx4VFlXc0lCL2ovVG9XdElXem85MDZGclNHOGlhcXFxcXFxaUlpSWlBZ3pNek16TnorQXlLKzAxL3ppOG44UytZMU1qb1JhUTgwV1UvRzhNQmxPKzUzVlBYQU5yV200d3pHVVZaVWpqQkpaVmRocGNma2pzbWNXYU8rVUVsZFhpMWUrenErSE9zQ3BrbllzaHVoOHBPTElTSnVuN1ROMEVJR1cyeFRubE9JbWVlY25vR1c0cmF4ZTJHMVQzSEV2ZllVWU1oRytnQUZPQXdoNW5LOG1aaHdKTW1ON3IyMjRRVnNORnZaODdaMHFhdHZrbmtseVBESzNIeTQ1UGdWS1hqaTUyV2VuNGQ0UGxGVlZZR25OYXArZlNwRmJLOTByWW5oVWM2bjkxUTNBWTlFMHRKT0ZyY2ZadG0vNDkxWGJjRy9qc1ZpVVBQWDc2cW1ldWl6K3FZMUhrNy8xVlBNNDA1eldWdW9oZUxVaW1wV1lkVnpDbVVkS0hlYk1kemdyWXJiOG1MMmVlTFNuUldIZG9uZlphOFJzT1U5RjM3dys1OTFsNUZMWUhpT3FXZUh0RS9sV3JCSGNSS3AzdWh0cjh5WG04TFUvNW1zK05NNlpLc3F1OTBjRlo0bzU4K2s0cmRydEI5N05BREZid21FRzdsWHF2aXJoT1RPcVUxNHh1VUYybXlJalVSY1BIclBPUTRsbU0zUGVNZzdiVXVrMG5uWmk2N2JYc1U2SDhsaHFJbzhUYU9yRWFmQ08xQVJLOVBqQzBRT29xMkJ4bU1kZ1lCOUcvbEliOSsrZnFOSjJzN0JIR0Z5Qk5tWkFSOEozS0NvMDEyaWthU1A4QkNyZjZWSTBYNXhkbmJoSElPK0I1cmJPeUI1NHpYa3pmT2J5SjRlY3d4ZnFCSk1MRmM3bTU5ck5jdzdob0huRlowYjAwemVlK2dUcXZqbTYxUGI0eG4wa2NEWDRqdkhNMHJCWFp5cEczRENLbkQvV2FhL1p0SG10RlBnTzVlRVR4K2s3UnJWZzNhU3dtMllvTlhuQ3MzWFBRRGhObitGaWE2SWxPT3VJRzZWSkg3VFA2YXZhMjZlaEtIUWEyVDROMHRjWjlkUENHbzNaZG5ObHRzSFFiZVl0NXZQbkplelYvY0FlTnlwZG1sMXZDSEk4TTgxblNSUDVRaTIrbUk4di9zeGlacnU5MTg3blJ0cDNmLzQyTmVtY09OYSs0ZVZDM1BDWnpjODhhWmg4NTFDcVNzc2hlNzB1UHhlTi9kbVl3bHdiM3Ryd01yTjFHcThqYm5BcGNWRHgveURQZVlzNS83cjYydHNRNmxMZytEaUZYVEVoelI5ZEhxdjBpVDR0Z2o4MjVXK0gzWGlSVU5VWlQya1I5UmkwK2xwK1VNM2lRdFM4dU9FMjNMeTRLWXR2cUgxM2pnaFVudEpSQWV3dXpOTERYcDhSeGRjYUEzY01ZNlRPMkllU0ZSWGV6ZVdJakNxeWhzVWRNWXVDZ1lUWlNLcEJ5cGUxelJmcThGc2h2ZkJQYzZCQVFXbDcvUXhJRHAzVkdvMUozdm40Mk9FczNxem53cytZTFJYYnlteUIxOWE5WEJ4Nm4vb3djeXhsRVl5RldDaStrRzlGK0V5RC80eW44MCthZ2FaOVA3YXkyRG55OTlhSzJvOTFGa2ZFT1k4aEJ3eWZpNXV3eDJ5NVNhSG1HK29xL3psMUZYLzhpck9mOFkzdkFjWC82dUxQNkE2bnZNTzI0ZWRTR1BqUWM4MjdSdzJhdFgrejJiS3EwQ21XOW1PdFlucjUvQWZEYTFaZlBhWG5LdGxXYm9ydXA3UVl4K09yMnVXYitOM04vLzIreURjWE1xSUpkZjU1eGw3L3ZzajRXb1BQbHhMeHRWcmtKNHcvdFRlM21MZEFUT09Zd3hjcTUydzVXeHo1TWJQZFZzNU84L2xoZkU3ZFBqMGJJaVBRM1FWMGlxbTRtM1lYOGhSZmM2alEzZldlcGV2TXFVREpkODZaNHZ3TTQwQ1dIbm4rV3Boc0dIZmllRjAyRDN0bVp2cFdEK2tCcE5DRmNMblpoY21tcmhwR3p6YmRBK3NRMWFyMThPSkQ4N0lPS09Gb1JOem5hSFBOSFVmVU5odlkxaVUrdWh2RXZwS0hhVW4zcUszZXhWVnlYNGpvaXBwM3VtN0ZtWUpXbUErV2JJRHNoUnBiVlJ4NS9ucXN0Q2d5ODdGR2JmVkI4eURHQ3FTKzJxQ3NuUnduU0FONnpnenhmZEIybkJUL3ZaNC82dXhiNm9IOGI0VkJSeGlJQjkzd0xhNDdoRzN3MlNMLzJaMjd5T1hKRndacFNKYUJZeXZhakE3dlJSWU5LcWxqWEtwdC9DRkQvdFNNcjE4REtLYndCMHhnZ0JlUGF0bDFua2kweXZxVzV6Y2hseVptSjBPVHhKM0QrZnNZSnMvbXhZTjUrTGU1b2FndGNsK1lzVnZ5OGtTakkyWUd2R2p2bXBrUlM5VzJkdFhxV25WdXhVaFVSbTFsS3RvdS9oZEVxMTlWQnA5T2pHdkhFUVNtcnB1ZjJSMjRtWEdoZWlsOEtlaUFOWThmVzFWRVJVZkJJbWI2NGoxMmNhQlptUlZpWkhiZVZNakNyUERnOUE5MElYcnRuc1lDdVp0UlEwUHlyS0RqQk5Pc1BmS3NnMXBBMDJnSGxWcjBPWGlGaHRwNm5KcVhWemNiZk0wS256QzNnZ09FTlBFOVZCZG1IS042TFlhaWpiNHdYeEpuNUEwRlNERjVqK2gxb29aeDg4NUp0M1pLek81bjdaNVdmTkVPdHl5UHFRRW5uN1dMdjVGaXMzUGRnTXNoakYxRlJ5ZGJOeWVCYnlLSTFvTjFUUlZyVks3a2dzYi96alg0TkRQSVJNY3RWZWF4VkIzOFZoMXg1S2JlSmJVMTM4QU01S3ptWnUzdW55MEVyeWd4aUpGN0dWWFVyUHpGeHJseDF1RmRBYVpGRE45Y3ZJYjc0cUQ5dHpCTW83TDdXSUVZSytzbGExRFZNSHBGMEY3YjMrWTZTK3pqdkxlRE1DcGFwbUpvMXdlQld1eEtGM3JPb2NpaDFndW40Qm9KaDFrV25WL0ptaXE2dU9oSzNWZkt4RUhFa2FmakxnSzNvdWphUHpZNlNYZzhwaGhMNFROUjF4dkpkMVdhMGFZRmZQVU1Mck5CRENoNEF1R1JUYnRLTWM2WjFVZGo4ZXZZL1pwQ3VNQVVlZmRvNjlEWlVuZ29xRTFQOUEzUEpmT2Y3V2l4Q0VqK1k2dDdmWWVIYmJ4VUFvRlYzTTg5Y0NLZm1hM2ZjMStqS1JlN01GV0ViUXFFZnl6TzJ4L3dyTzJWWUg3aVlkUTlCa1B5STgvM2tYQnBMYUNwVTdlQzBZdi9hbS90RUR1N0hacHFnMEV2SG8wbmYvUi9nUnpVV3kzMy9IWE1KUWV1MUd5bEttT2tYemxDZkdGcnVBY1BQaGFHcVpPdHUxOXpzSjFTTzJKejRadHRoNWNCWDZtUlF3V21Ed3J5RzlGVU1sWnpOY2tNZEsrSW9NSnYxck9XbkJhbVMydzJLSGlhUE1QTEMxNWhDWm00S1Rwb1p5ajRFMlRxQy9QNnI3L0VobkRNaEtpY1paMVp3eHVDN0RQekRHczUzcThnWGFJOWtGVEsrMkxUcTdiaHdzVGJyTVY4UnNmdWE1bE1TMEZ3YlRpdFVWblZhMXlUYjVJWDUxbW1ZblVjUDl3UHI4SmkxdGlZSmVKVjlHWlRyUWhGN3Z2ZFUyT1RVNDJvZ0o5RkR3aG15Y0kyTElnKyswM0M2c2NZaFV5VXVNVjV0a3c2a0dVb0wrbWpOQzM4K3dNZFdObGpuNnRHUHBSRVM3dmVxclNuNVRSdXYrZGg2SlZML2lESFUxZGI0YzlXSzMrK09ySDNQcXppRjkxNlVNVUtuOEc2N25ONjBHZldpSHJYWWhVRzN5VldteVlhazU5TkhqOHQxc21HNFVEaVd6MnJQSE5yS25ONFpvMUxCYnIyL2VGOVlaMG4wYmx4Mm5HNFgrRUtGeHZTM1cyOEpFU0QrRldrNjFWQ0Qzei9VUkdIaUpsKys3VGRCd2tDajZ0R09IM3FEYjBRcWNPRjlLenBqMEhVYi9LeUZXM1loajJWTUtKcUdabGVGQkg3dnF2ZjdXcUxDM1hNdUhWOHE4YTRzVEZ1eFV0a0QvNkpJQnZLYVZqdjk2bmRncnVLWjFrL0JIenFmMks5ZkxrN0hHWEFOeUxEZDF2eGtLL2kwNTVwbnpsK3p3NnpMbndYbFZZVnRmbWFjSmdFcFJQMWhiR2dyWVBWTjZ2MmxHK2lkUU5HbXdjS1h1Lzh4RWovUDZxZS9zQjJXbXdOcDZwcDhqYUlTTWt3ZGxlRlhZSzU1TkhXTFRUYnV0U1VxakJmREdXby9ZZzkxOHFRKzhCUlpTQUhaYmZ1Tlp6Mk8wc292MVVlNENXbFZnM3JGaE0zS2xqajlrc0dkL05VaGs0bkgrYTVVTjIrMWk4K05NM3ZSTnA3dVE2c3FleFNDdWtFVmxWWnJpSE5xRmk1ckxtOVRNV2E0cW0zaWRKcXBwUUFDb2wybDRWU3V2V0xmdGE0SmNYeTNiUk9QTmJYT2dkT2hHNDdMQzBDd1cvZE1sU3g0SmYxN2FFVTN5QTF4OXArWWMwanVwWGdjTXVZTmt1NjRpWU9rR1RvVkR1SnZsYkVLbEpxc21pSGJ2TnJJVlpFSCt5RmRGOERibGVaNmlOaVd3TXF2dE1wL21TcHd4NUt4UnJUOXAzTUFQVEhHdE1iZnZkRmh5ajl2aGFLY24zQXQ4TGMxNkFpK3ZCY1NwMXp0WGk3ckNKWngvcWw3VFhjY2xxNlE3NlVlS1dEeTlib1MwV0hJalV1V2hQRzhMQm1XNXkycmh1VHBNNXZzTHQrSE9MaDFZZjBEcVhhOXRzZkMra2FLdDJodEEwYWkvTDJpN1JLb05qRXd6dGttUlUwR2ZnVzFUeFV2UEZoZzBWN0RkZldKazVnZnJjY3BZditNQTlNMGRrR1RMRUNlWXdVaXhSempSRmRtakc3emRaSWwzWEtCOVlsaU5LSTMxbGZhN2kySkc1QzhTcytySGUwRDdaNjk2L1YzREVBT1dIblE5eU5haE1VbDVrRU5XUzZwSEtLcDJEMUJhU3JySGRFMXcycU54SXp0cFhnVUlyRjBibTE1WU1MNGI2VjFrK0dwTnlzVGFoS01WcnJTODVsVFZvOU9HSjk2STQ3ZUF5NXJZV3BSZi9tSXplb1lVMURLYVFDVFVWd3JoSGV5Tm9EcUhlbCtsTHhyOVdLemhTWXc3dnJSNitWNXEwcGZpMmszTDF6cWt1Ylk2cnJkOVpMdlN1V05mMHVxbmtZK0ZwVHZGelNXOUZwMGI5bDhKQTdUSFY5ZUNpL1BZL1NDWklVWXgzQlUyYWxqN0NtM1ZWNmVZcGlvczRiNld1Tk9KZFlYVUszelRxajVDVkcyRnFZTTRaN0N1SVUwcU8wNVhSMGQ3MUZITTBZaFptSm1UUmZMbFhFdW1OODJCR3R6ZFgwUzE5dDFlK2JVaWVLOHpSbXFwYTRRYzVUU2ppZm1hUXNZMkVUTGpoSTM2Z01SMSs3cXBqZFhYSGljZVVla2ZCYXVjSFNoQU9pRlhtdjNzTm1HUXlVNWlWZ25vb2N1b25RWEVQVEZ3c2xIdFM4UitBNDdTdEk5d2owaVNydGJpNXJNeXNjekZpSW1zUStiZEZDbG5GampwWFh3TXk2TzdxZmpPcjhGYjBhN09ESXRpc2pubjNFUU8xNit5cGQxY3d5YUFXNVl6eHo1UWtuZk1PNzY0M2ZYVy9JOXkzVTJ4SDI3T2FwcXI1NlovdEV6Z2xqNkliVDZIRUhqb3BpWHFlUmJlNW1RUXZ4dGNiRE9WdmVyTjBaZ01kenFSWVJqYVh0TVJkNTZRNGNaU21kUHZaSmRTcmhKMUQ5ek5YUHFBRXFQSWF2UGRmdWJ0NW9rZTJrbXYwZHp0SXN6U3YyVll1b3lmMVV1b3Bic1liK3VYOWg2V3B3anBndFo2Zk5OYXdOSjRxOE8zQ0ZvU2Jpb0FhT1NaTXgyR1lhUFlCK3JFYjZxalFpTlJGUTc2VHZ3TkZWS0QrQmhIOVZoY0tHc1h6bU1JN0JwdFUvQ05Xb2xNN1l6Uk92cEZBbnRzaVdKcDZlUjJkM0dhcmNZU2hWWVNVcWhtWU9XajVFOTZOSzJXdm1ZTlRlWTdaczRSVUVkdjloOVFUNEVzZUt0Nkx6THJxRU9zM2h4QVkxTWFOV3BTYTZ6Wng4RjNZT1ZlQ1lNUzg4VytDWUhEdVdlNHlvYzZZSytkakR1RU9yQlI1bHZoMHIrUTl1TTg4bHJqeDl4OUF0Z3BRVk5FOHIrM082R3Z3NTlEK2tCRi9VTVh5aGxpWVV0UGptdlhHWTZEazN4K2tFT1crR3RkTVZDNEVaVHFvUy9qbVIwUDBMUzc1RE9jL3cydm5yaTk3TTRTZGJaOHFlVTdnZzhEVmJFUmtVNWdlYU1RTzNtWXJTWXlBbmdlVVFxck4wQzAvdnNGbWNnV05YTmVpZHNUQWo3LzRNbmNKUjBjYWFCVXBiTEsxeUJDQk5SakV2Nkt2dVZTZHBQbkVNSmRzUlJ0cUorVTh0TjFnWEE0ZVBIYzZaVDBldmlJNzNVT0pGMGZFWjhZYW5lQVFxUWRHcGhOdndNNG5JcVBuWHhWMHhBMGZuQ1Qrb0FoSnV5dy9xOGpPMHk4Q2pTdGVaRXh3QnBJTjZTdk5wNkE1Ry9hYmk2ZWdlTkQvMUdUZ3VodU5qYVViYm5TYkdkNEw4OTM3RXptMzRFeWk2bjFtYWVPQnhoM1BJMGp6SkRmNW1oL0JzTEQ3RjJHT0t2bEEvNWd0dnhJMy9lVjRzTGZLVzVXeStvaW8rZXMvdTZUOFVVK25zb2Z5NTdJY2IvSmxaSFBGdENnZC94K2J3dDNaVCt4WFR0VHRUckdBYjRRZWhDNlg5Rys4WVQrb3pjTHhEc2RDanN1T3F3UEZucmRMWWFGYzkyVWkwbTRmcjM5bFltbENhcVRpdDdHNk8vM2tXRGtndFhqTkg0QmlFbS8ramVnUW5paE90ZmZmbjMzV3hzRmpoZk1kNDhIVCtmNm82WDY1ajdYUjhXTFNITUZreGJ2T1lzclJzRjFib3dEdVNRMThNa3hrNHF6MnpvR1BMNWZ1OWgySHFtdDFhc2wzUTNZdTNzek9jK3NwaUNtWDRBRVRCTTNwTG9UWVNwM3NWeGFoeWhMOGVDNG1QTjlrMngzbzB4a2lpeEl6TTNDWkZ6ZjVvUjRtZWNRNStheDJ3Q2FoMy9jcm1uSG9xUjArS01hT1B4UmlmMW9FRlJGT08va1RQUG10d3crTmZNWHhFSzZnbjZpVTMyVTZmRnJ1SXo4UTRXZ2xqdG5hQ1ZUQmdXeDdkaVVkc2hDOVpFYTV5S3BSQkJlVzEyci9pTmMvK0VnTnFtaHN3TkI4U0JvaWhIWGVERjdycldETGNtdDNWOEdZWU43cFhSeTREWmpqNERKdVVCTDVpQzNEUUFhb280dmtmdHFWVFlSR0xTM21IWjdnZG1kVFRxYmdOTi9QVGRUQ09UZ1hvbGM4OE1oWEFFVU1kWDBpeTFKTXVrNXdMc2dldTBRVVlsejJTNHNrVFd3Sno2cE9tLzhpaHJtZ0dmRmdyaStaV1VLMmdBUEhnYldhOGphb2NkU3VNNEZKWW9LaWNZWC9aU0VOa2c5UTFaekpmd1NjZlZuUjJEZWdPR3dDdm1vZ2FXSkNMUWVwdjlXTmxVNlFnc21Pd0lDcXVVMjhNbGszZDlXNUU4MWxVLzVFejBMY1g2bHdLTVdETmx1TktmQkRVeS9waEpnQmNNbmZraDlpUnhyZE96Z3MwOEpkUEI4NUx3bytHVVNiNHQzbkMrMGJ5cU1adE8yZlFKNFUyekdJcjQ5dC8yOHFtbUd2MlJhbkREN2EzRkVjZHR1dGtXOHR3d3dsVVNwYjhRYWxvZGRkYkJmTkhLRFE4MjhCZEU3T0JnRmRpS1lvaExhd0ZZcXB5YlFveEFUWnJoZUxoZEk3KzBabHU5UTFteVJjZDE1cjlVSW04SzJMR0p4cVRlZ250cU5WTUtuZjFhOHpRaXlVUjFyeG9xamlGeGVIeHFGY1lVVEhmRHU3cmhiV25nNnFPeE9zSSs1QTFwOW1SeUVQZFZrVGxFMjR2WTU0VzdiV2M2ak1nWnZOWGRmQzkvOXE3NDA4S0RzYmRMN1V0ejdRRlNEZXR6MnBpY0FyenJkcEw4T2FDSEM5VjI2UnJvZW10RFo1eU5NL0tHa1dNeVRtZm5JbkV2d3RTRDIzVWNGY2poYUUzVkt6a29hRU1LR0JmdDRYYklPNmZvclRZMWxtR1F3Vm1LaWNCQ2lBckR6RSsxb0l4RTA4ZldldmlJT0Q1VHpucUgrT29IYWR2b09QMjBkck1QZTVJcmczWEJRemlXMlhEdUhZempxUVE0d3lTc3NqWFVzNUgrdDNGV1lNSHBwVW5CSE14L25ZSVQ1ZDdPbWpEYmdEOUY2bmEzbTRsN0tka2VTTzNrVEVQWGFmaVdpbm9nYWc3YjUydGFpWmhMMVRTdkJGbUVaYWZGcTJIOGtoUWFaWHVpdENld1Q1RkJnVnRQSzBqNHhVSFBmVXozUTI4ZWFjMVoxMzlEQVAyM2Rna2k5NEVDOHZiRFBUUUM5N0hQUFNXalVORzV0V0tNc2F4QUVNS0MwNjY1WHZvMU50ZDA3d0NMTmY4UTU2bXJFUFZwQ3hsSU1WbFFsV1J4TTNvQWZwZ0ljKzhLQzNyRVhVb2c1ZzA2dnQ3emdYWThnckg3aGh3VlNhZXV2QzA2WVlSQXdwYnlrL1Vuemo5aExFWk5zMm94UFFCOXljK0duTDZ6VGdxN3JJKytLREp3WDJTUDhTZDZZelR1dzVsVi9rVTZlUXhSRDEyb21mUUFXNmNhVFI0TGlrWWtCQjFDTU9ydmdSci9WWTc1K05TQjQwQ25pNmJBREF0YUsrdnl4VldwZjlOZUtKeE4yS1lROFEyeFBCM0sxczdmdWh2V2JyMlhwZ1cwNDRWRDZEUnMwcVhvcUtmMU5Gc2FHdktKYzQ3bGVVVjNwcHBQLzVWVEtGaGFHdW9sNEVzZmpmNXp5Q3lVSG1IdGhDaGNZaDRoWUxRRitBRldzdXE0dDB3SnlXZ2R3UVZPWmlWMGVmUkhQb0s1K0Uxdmp6OXdUSm1Wa0lUQzlvRXN0QXN5WlNnRS9kYmljd0tyODlZVXhLWkkrb3dEMjA1VG01bG5ubURSdVAvSm56eFgzZ010bHJjWDBVZXNaZHh5UXFZUXVFVzRSNTF2bVE1eE9adGVVZDhTSnJ1TWxUVXpodFZ3L05xN2VVQmNxTjIvSFZvdGdmbmdpZjYweUtFdG9VeDNXWU9abFZKdUpPaDh1NTlmelNEUEZZdFFncURVQUd5R2hRT0F2S3JvWE1jT1lZMHFqblN0SlIvRzNhUCtKdDFzTFZsR1Y4UE93ci82T0dzcWV0bnlGM1RtVHFaakVOZm5YaDUxb3hlOXFWVXcyTTc4RXpBSitJTThsWjFNQlBROVpXU1ZjNEozbVdTckxLck1IUmVBNXFkR296ME9EUnNhQSt2d3hYQTJjQU00cWxmekJKQTY1ODFtNGh6eEl0UXc1ZHhyckJMM1k2a0NiVWNGeG8xUzhqeVY0NHEvLys3QVNOTnVkWjZ4ZWFOT1NJVWZmcU1uNEE5bElqRmN0WW4yZ3BFUEFiM2Y3cDNpSUJOOEgxNEZVR1E5Y3QyaFBzTCtjRXNUZ1VyUjQ3dUpWTjRuNHd0L3dnZnd3SHVPbkxkNHlvYmtvZnk4SnZ4U1FUQTdyTXBESWM2MDhTbFpGSmZaWWNtYlQwdEFIcFBFOE1ydFE0MnNpVFVOV3hxdldaT212dTlmMEpQb1FtZys2bDdzWld3eWZpNlBYa3hKbndCcmFVRzBNWUc0ellIUXozaWd5L1hzRmt4NXROUXh3NDNxdkk5ZFUzZjBEZGhPVWxIS2ptaTFWQXIyS2l5MEhad0Q4VmVFYmhoME9pRGRNWXNwb2xRc1lkU3dqQ2NqZW93SVhOWlZVUG1MMnd3SWtZaG1YS2hHb3pkQ0o0bFJLYnNmNE5CaC9YblFvUzkyTkpFV09WT0ZzMlloTjhjNVFaRmVLMHBSZEFHNDBocXZMYm1vU0E4eFFtek9PRWM3d0xjbWU5Sk9zalBDRWdwQ3dVczlFMkRvaE1IUmhVZXlHSU42VEZ2cmJueThuRHVpbHNEcHpySDVtUzc2QVBvSUVKbUl0UzY3c1FKK25md2Rkem1qUHhjQkVCQkN3MGtXRHdkMEVaQ2tOZU9EN05OUWh0Qm03S0hMOW1SeGo2VTF5V1UycHV6bElEdHBZeGRINFpQZVhCSmtUR0FKZlVyL29UQ3ovaXlwWTZ1WGFSMlYxZG9QeEpZbHJ3MmdoSDBENWdicmhGY0l4ell3aTRhLzRocVZkZjJEZHhCcDZ2R1lEamF2eE1BQW95KzErM2FpTzZTM1cvUUFLTlZYYWdEdHZzTnR4N0tzK0hLZ282VTIxQitRU1pnSW9nVjVCdCtCblhpc2RWZnk5VnlYVisyUDVmTXV2ZHBBak0xby9LOVorWG5FNEVPQ3J1ZStrY2RZSHFBUTAvWS9PbU5sUTZPSTMzakgvdUQxUmFsUGFIcEpBbTJhdjAveHRwcWRYVktORHJjOUYyaXpvMjNXdTdmaXJnYlVSRkROWDllR0dlWUJoaXlweVhaZnQyajNoVHZ6RTZQTVdLc29kLy9yRUlMRGt6QlhmaTd4aDBlRmtmYjMvMXp6UEsvUEk1TmszRmJaeVRsNG1xNUJmQm9Wb3FpUEhPNFE0UUtaQWxyUTNNZE5maTNveElqdnNNM2tBRnYzZmR1ZnVycVlSM1BTd1gvbXBHeS9HRkkvQjJNTlBpTmRPcHBXVmJzL2dqRjNZSCtRQTlqTWhsQWJodmFzQUhzdEIwSUpldzA5aUFrbVhIbDEvVEVqK2p2SE9wT0dyUFJRWGJQQURNK0lnMi9PRWNVY3BnUFRJdE10VzREZHFnZllWSS8rNGhBRldZalVHcE9QL1V3TnVCNytCYktPY0FMYmpvYmRnemVCUWZqZ05TcDJHT3B4ekdMajcwVnZxNWN3MkFvWUVOd0tMVXRKVVg4c0dSb3g0ZFZhL1RONHhLd2FLY2w5WGF3UVIvdU51czcwMEhmMTdweU5uZXpyVWdhWTllNE1BRGhFREJwc0pUNnkxZ0RKczFxNndsd0dodVV6R1I3QzhrZ3BqUHlIV3dzdnJmM3luMXpKRUlSYTVlU3hvTEFaT0NSOXhidXp0eEZSSlc5Wm1NWWZDRkowZXZtOUYyZlZudWplOTJSYzRQbDZBOGJsdU44TVp5eUpHWjArc05TYi8vRHZBRnhDMkJxbEVzRndjY1dlQWw2Q3lCY1FWMWJ4NG1RTUJQMUp4cWsxRVVBRE5MZWllUzJkVUZiUS9jL2t2d0l0Ylo3dHgwc3QxNnZpcWQ1M1dzUm1QVEt2MkFEOENVbmh0UFdnNWFVZWdOcHNZZ2FzYXcyK0VWb29lTkttclczTUZ0ajc2YllISm01SzlncEFYWlhzRTVVOERNOFhtVk9TSjFGMVduTHk2blF1cCtqeDUyYkFiK3JDcTZ5OVdYbDJCMm9aRGhmRGtXN0gzb1lmVC80eHg1Vm5jQnV4TVhQMmxOZmhVVlFqU1N6U1JidVpGRTR2RmF3bHp2ZVh4YVlLVnM4THB2QWI4SVJZRjNaSGlSbm0wQURlTlBXb2N3eFN6TnNlRzdOclNFVlpvSGRLV3FhR0VCejFOOFB0N2tGYnFoM0xZbUFibTlpMUlDaElwTHBNNUFTNm1yNk9BUEhNd3d6blZ5NjFZcEJZWDh4WkROL2ErbHQ3bit4NWo0Yk5PVnRlWjhsajNocEFIU3gxVlI4dlpIZWM0QUhPOVhGQ2RqWjllUmtTVjY1bGpNbVpWemFlajJxRm4vcXQxbHZXek5aRWZIeEszcU9KckhMNmNycjBDUnpNb3g1ZjJlOEFMQkI0VUdGWktBM3RONkY2SVhkMzJHVEpYR1E3RFRpOWovZE5jTEY5akNiRGNXR0t4b0tUWWJsSXdiTERSZUwwMExSY0RQTWNRdVhMTWg1WXpndGZqa0ZLMURQMWlEenpZWVZaejVNL2tXWVJsUnBpZzFodFZSalZDa25tK2gxTTVMaUVEWE95SFJFaHZ6Q0dwRlpqSFMwUnNLMjdvMmF2Z2RpbHJKa2FsV3FQVzNEOWdtd1YzN0hLbWZNM0Y4WVpqMmFyK3ZIRnZmM0I4Q1JvSDRrREhJSzltckFnK293aUV3TmpqZDlWK0ZzUUtZUjhjekpyVWtmN1FvaTJZYVc2RVZEWnA1ellscWlZdHVYT1RIazRmQWNaN3FCYmRMRGlKcTBXTlYxbDIrSG50azFtTVd2eHJZbWM4a0l4OEczclczNko2UmE0bExyVE9DZ2lPaWhtb3crWW56VVQxOWpiVjJCM1JXcVNIeXhraG1nc0JxTVlXdk9jVW9tMWpEUTQzNitmY2J1M3hmMmJiZXFVL2NhK0M0RE9LRStlM3F2bWVNcVczQXhlamZ6QlJGVmN3VllQcTRMMEFQU1dXb0p1KzVVWVg0cWc1VTZZVGlvcVFHUEc5WHJudVovQmt4dVlwZTZMaTg3KzE4RXNreVFXL3VBK3VrMnJwSHByNmh1dDJUbFZiS2dXa0ZweCtBWmZmd2VpdzIrVml0dGtFeWYvaWZpblMvMEl0UkwySnEzdFFPY3hQYVdPMnhyRzY4R2RGb1VwWmdGWGFQMndZVnRSYzZ4WUNmSTFDYUJxeVdwZzRieDhPSEJRd3NWNFhXTWliWlowTFlqV0V5Mkl4UTFtWnJmMS9VTmJZQ0pwbFd1M25aNFdwb2RJR1ZBMDVkK1JXU1MrRVQ5dEgzUmZHR21OSTFjSVk3ZXZaWnE3bythMGJqanlncG1SM21WZmFsa1QvU1pHVDI3UThRR2Fsd0dsRE9TOVZIQ3lGQUlMMGExUTdKaVczc2F6OWdxWThscUt5bkZyUEN6eGtVNFNJZkxjOVZmQ0k1ZWRnUmhEWHMwZWRPOTkybmhUS0hyaVJFUDFOSkM2U1JPTWdRMHhPNWtOTlpPaE1PSVQ5OUFVRWxieHFlWkY4QTN4cmZESnNXdERuVWVuQUhkWVdTd0FiWWpGcVFaK0Q1Z2kzaE5LOENTeFU5aTZmNkNsTDlJR2xqMU9QTVFBc3I4NFlHNmlqc0pwQ2FHV2o3NWMzeU9aS0JCOW1OcFFOUFVLa0swRDZ3Z0xIOE1Hb3lSeFRYNlkwNVE0QW5ZTlhNWndYTTRlaWovOVdwc00vOUNvUm5GUVhHUjZNRWFZK0ZYdlhFTzNSTzBKYVN0azZPWHVIVkFUSEpFKzFXK1RVM2JTWjJrc010cWpPMHpmU0pDZEJ2N3kyZDhETXg2VGZWbWUzcTBacFRLTU11NFlML3Q3Y2lUTnRkRGt3UG9naDNDbmp4N3FrMDhTSHdmK2Rrc1o3TTJ2Q09sZnNGMGhRNko0ZWhQQ2FIVE5yTS96QlNPcUQ4M2RCRUJDVy9GL0xFbWVoMG5PSGQ3b1ZsMy9Rby85R1VEa2tiajd5eis5Y3Z2dStkREF0eDhOekNEVFA0aUtkWnZrOU1XaWl6dnRJTExlcHlzZmxTdlRMRkJaMzdSTHdpcmlxeVJ4WXYvenJnRmQvOVhWSGgvT216QnZEWDRtaXRNUi9sVWF2czJWeDZjUjk0bHpBa3BsbTNJUk55NFRGZnU0N3R1WXM5RVFQSVBWdGE0UDY0dFYrc1o3bjN1ZWQzY2dFeDJZSytRTDUreG1zNm9zazhxUWJUeXVLVkdkYVg5RlFxazZxZkRuVDV5a3hrMFZLN0taNjJiNkRORFVmUWxxR0h4U01LdjFQMFhONUJxTWVLRzFQNFdwNVFmWkRVQ0VsZHBwb1gwVTZzczJqSWtvMlhwVVJLQ0loZmFPcUxQZlNoZHRTMzdaclQrakZSU0gyeFlWVjFybVQvTUJ0UlFoeGlPNE1RM2lBR2xhWmkrOVBXQkVJWE9WbnU5ak4xZjkyMWxXTFpreTlicWJNM0oyTUFBSTlqbXVBeDNneW9FVWE2UDJpdnMwRWVOdi9PUitBWDZxNVNXNmw1SGFvRnVTNmpyNnlnOWxpbXUrUDBLWUt6Zk1YV2NRU2ZUWHpwT3pLRUtwd0kzWUdYWnBTU3kyTFRsTWdmbUZBM0NGNlI1Yzl4V0V0UnVDZzJaUFVRMk5iNmRSRlROZDRUZkdIcm5FV1NLSFB1UnlpSlNEQVorS1gwVnhtU0hqR1BiUVRMVnBxaXhpYTJ1eWhRMzk0Z0JNdDdDM1pBbXhuL0RKUytsMWZCc0FvMkVpci9DMGpHOWNzZDQrL3RwMTJwUGMvQlZKR2FLOW1mdnI3TS9DZXp0cm1DTzVxWTA2RWRpNHhBR3RpRWhuV0Fiekx5MlZFeWF6RTFKNW5QbWdVNFJwVzRTYTBUbk9UNnc1bGd0My90TXBST2lnSEhtZXhCR0FNWTBtZGNEYkR4V0l6NDFOZ2RENm94Z0hzSlJncjVSblQ2d1pBa1RPY1N0VTROTU9RTmVtU083Z3hHYWhkRXNDK05SVkd4TVVoUW1tTTBsbFdSYmJtRkdIekVxTE00SXcwSDc1NzdLeW8rWmYrMmNVRklPdzkzZ0VZMTcxdlFhTTBITHdwanBkUlI2Sno3VjBja0U3WHpZSjBUbVk5em5MZHprdmEwdk5yQUdHVDVTVVo1dWFIRGtjR3ZJMHlTcHdrYXNFZ1pQTXNlWWN1ODV3OEhQZFNOaSs0VDZBODNpQXdEYnhnZUZjQjFaTTJpR1h6RmNFT1VsWVZyRWNrYU95b2RmdmFZU1E3R3VCNElTRTBuWUpjMTVYLzFjaURUUGJQQ2dZSks1NVZrRW9yNEx2ekw5UzJXRHk0eGorNkZPcVZ5VEFDMlpOb3doZWVlU0k1aEEvMDJsOFVZa3Y0bms5aWFWbitrQ1ZFVXN0Z2s1SHlxK2dKbTZSOXZHM3JodU05MDRoZS9oRm1OUWFVSUFUQjF5M3Z3K09teFA0WDVZaTZBNUk1akp1ZkhDakY5K0FHTnduRWxsWmpVY282WGhzTzVUNStSM3l4ejV5TFZPbkFuMHp1Uys2emRqMG5USmJFWkNiWEpkdHBmWVpmQ2VDT3FKSG9FMnZQUEZTNmVSTGpJSmxHNjlYOTNuZlIwbXhTRlh6cDFaYzBsdC9WYWZEYUltaFVNdGJucVdWYjlNNG5HTlFMTjY4QkhQN0FSOElsOWRrY3h6bUJ2OFBDWmx3OWd1WTBsdXJiQnNtTllsd0pac0EvQjE1L0hma2JqYndQZGRhVmVjbHMvZWxtREhOVzJyNGNyQXg0M2ZlTmtmUndzYU5xL3l5SjBkL3A1aFo2QVphano3REJmVW9rMFpVNjJnQ3p6N3g4ZVZmSlRLQThJV240NXZJTkxTTTFxK0hGOUNWOXFGM3pQNk1sMjFrUFBMM0NYemt1WVVsblNxVCtJajR0SS9vZDVLd0lzK3REYWpEczY0b3dON3RPQWQ2ZXVjR3orS2ZPMjZpTmNCRnBiV0E1NzMyYkJOV080a0hOcHI5RDk1NUw2MWJ2SENGL213U3J6NmVRYURqZkRFQU5xR01rRmMrTkd4cEtaekNEMnNqL0pySGQremxQUThJejdRKzJKVklpVkN1Q0tvSy9obEFFSHp2ay9QaXEzbVJMMXJUL2ZFaDlob1Q1R0ptZVlzd2cxb3RpS3lkaXpKL2ZTMlNlS0hWdTZaM0pFSGppVzhOYVRRZ1A1eGRCbGk4bkM1N1hpTjlocnF1QnU5OWhuOXpxd285MitQTTJKWHRwZVZaUzBQZHFSNW1EeURyZU1NdEV3cytDcHdhUnl5em9ZdGZjdnQ5UEpJVzBmSlZOTmkvRkZ5UnNlYTdwZUx2SnJMKzViNEdPWEo4dEFyK0FUazlmOEttaUlzUmhxUnkwdkZ6d1JWM1o1ZFozUXFJVThKUS91UXBrSmJqTVVNRmoyRjlzQ0ZlYUJqSTQrZkwvb04zK0xRZ2pJNHp1QWZRKzNJUElQRlFCY2NmMGNsSnBzZnBuQnhEODRhdHd0dXBrR3FLdnJIN2NHTmwvUWNXY1NpNndjVkRNTDZsak9nWWJvKzJCT0FXTk5qbFVCUGl5aXRVQXdibmhGdkxibnF3NDJrUjNZcDJrdjJkTWVEZGNHT1g1a1Q0UzZNNDRLSEVCL1NwQ2ZsN3hnc1V2cytKTlk5RzNPMlgvNkZFdDlGeUFuNTdscmJpdSt0bDgzc0N5bVN2cTllWmJlOW1jaEw3TVRmL1RhNzhlODB6U2YwaFlZNWVVVTcrZmYxNGp2N1h5OHFqemZ6enp2YUpucklkdkZiNUJMV0tjV0d5NS93Nyt2VjJjdklmd0hxZFRCK1J1Sks1b2o5bWJ0MEh5OTRBbWpNamp3WU5abE5TNnVpeXhObndOeXQzZ2RyZUxiNjRwLzMrMDhuWGtiOTJMVGtrUmdGT3drMW9HRVZsbGNPajVsdjFoZkFaeXdEb3dzMDk0NFU4dlVGdytBL251VnEvVUN5Z3NybVdJQm5IeVUwMWQwWEpQd3JpRU92eC9JU0s2UGs0eTJ3MGdtb2paczdsVThUdGFrQkFkbmU0di9hTnhtTXBLNFZjR01wN3NpMHlxc2lvbFhSdU9pMVoxUDdTcUQzWm1wMENXY3lLNFVibXAyU1hpWHVJNW5HTENpZUZIS0hOUklsY1kzUHlzMmR3TVRZQ2FxbHlXU0lUd3Iyb0dYdnlVM2gxUGY4ZVEzdzFibkQ3aWxvY1ZqWURrY1hSM09vMUJYZ01MVFVqTncyeE1Wd2p0cDk5TmhTVmM1YUlXckRRVDVESFBLdEN0aGVCUDR6SGN3NGR6MmVSZFRNYW1obEhodGZncUpKSEk3TkdEVXcxWEw4dnNTZVNIeUtxRHRxb0FtclFxc1l3dndpN0hXM29qV3loSWE1b3o1eEpUYXExNE5BekZMalZMUjEyclJOVVE2eG9oRG5yV0ZiNWJHOXlmOGFDRDhkNXBob2Fja2NOSnArRHczRHVlM1JNKzVSaWQ3RXVJZ3Nud2dwWDByVVdoL25xUHRCeU1oTVpaNjlOcGd2UlRLWjYyVmlaK1E3RHA1cjRLMGQ3RWZKdWl5MDZLdUlZYXVSaDVFY3JoZHQyUXBUUzFrMUFzY0VIdmFwTmJVM0hMMUYyVEZ5UjMzV3hiNU12SDVpWnNybjNTRGNzeGxubnNoTzhQTHdtZEdOK3BhV25RdU9SdFpHWDM3dWhGVDY0U2V1UHN4OFVPb2tZNk9OODVXZFExZGtpNXpFcnNKR2F6Y0JPZGRXSkVLcU5QaUpwc01EMUdyVkxyVlkrQU9kUFdRbmVUeXlQMWhSWC9sTU00Wm9nR0dPaFl1QWRyN0YvRE9pQW9jKytjbjV2bGYwemtNVUo0MFoxcmxndjlCZWxQcVZPcHhLZU9wektkRjhtYUsrMVZ2MjNNTzlrLzgrcXBMb3hySUdIMkVEUWxuR21IOENEMzFHOFFxbHlRSWNwbVI1YndtU1Z3OS9OczZJSGd1bENSZWh2Wi8rVnJNNjBDdS9yM0FvbnRGZnJsamV3NzRza1llMnV5bjdKS1F0RlFCUVJKOXJ5R2ljL3pRT3NiUzRzY1VCY3RBOGNQVG9RM3g2WkJRdTZEUHU1bTFibkN0UDhUbGxMWUEwVVRRTlZxemE1bmZldzNNb3B5MUdQVXdHNWpzbDBPVlhuaVBtQWNtTHFPNUhHOEh2M25TTGVjRTlvT2pQRFhjc1R4b0NCeFl5ekJkajR3bW55RVY0a3ZGRHVuaXBTOFNTa3ZkYU1uVEJOOWJySFVSOHhkbW1FQXAvUGRxazl1ZXh0cDF0K0pydFh3cE4vTUcydy9xaFJNcFNOeFExdWhnL2tLTzMwZVEvRnlIVURrV0hUOFY2Z0dSVTREaERNeFp1N3hYaWo5VWk2amxwV21RQ3FKZzNGa09UcTNXS25lQ1JZWnhCWE1OQVZMUWdIWFNDR1NxTmRqZWJZOTRveUlwVmpNWWVoQWlGeC90cXpCWEZIWmFMNVBlZUQ3NHJXNU95c0ZvVVhZOHNlYlVabGVGVFVhLyt6QktWVEZEb3BUUmVYTnVacTQ3UWprV254amlyQ29tbU80TC9HckZ0VlYyMUVwTXl3OHd5VGhMNVk1OWQ4OHh0bHgxZzF0dFNJQ0R3bm9mNmx0LzZ6bGlQemdWVUw4aldCakMwbzJENktnK2pOdVRoa0FsYURKc3EvQUcyYUtBLy9BNzZhdncyS05xdHYyMjNQK1dxM1N0UkRETktGRmd0c0Z1a1l0MUdGRFdvb0ZWWGl0YU5oYjNSQ3lKaTRjTWVOalJPaVBFRGI0aytHMytoRDh0c2crNWhobVNjLzh0MkpUU3dZb0N6QUk3NWRvcThRVEhlK0UvVHcwUlFTVURsVSs2dUJlTk4zaDZqSkdYL21IOG9qMGkzY2FDTnNqdlRub2g3M0J0eVpwc2ZsSExxNkFmd0pOQ0RYNFM5OGg0K3BDT2hHS0RoVjNydGtLSE1hM0VHNEo5eTh6RldJNFVzZk56Qy9SbDVtaWRObjdnd29OOWoyM0hHQ1FRK09BWnBUVFBNZGlWb3c3NDBnSXl1RXRkMHFWeE15TlhoSGNudVhSS2R3NXdEVVNMMzU4a3RqTVhtQWt2SUI3M0JMYTF2ZkY5QkFVWkluUFlKaXd4cUZXUVFCVms3Z1FING9qZlVRL0tFam4rQS9XUjZFRWU0Q3RicG9MZTFtekhrYWpnVElvRTBTTERIVmF1S2hycTEyenJBWEJHYlBQV0tDdDRER2VkcTNKeUdSYm1QRlczMmJFN1QyMCs3M0JhdFYvcVFoaEJXZldCRkhmaFlXWGpBTHRzMzhGZW1ub1QrOWJuMWpEQk1jVU1tWWdTYzBlN0dRanYyTVVCd0xVOGlvbkNwZ1YrUXJoZzdpVUlmVVk2SkZ4UjBZK1pUQ1BNK3JWdXEwR05MeUpYWDZuclVUdDhIekZCUlkxRS9GSW0yRWVWQTlOY1hyajdTNllZSUNoVlFDV3IvbTJmWVVqQzRqMFhMa3paOEdDU0xmbWtXM1BCL3hxK25sWHNLVkJPajd2VHZxS0NPTXE3WnRxcjNjUStOOGdCblBhQXBzK29Hd1dPa2J1eG5SWWoveC9XamlEY2xWcnMyMnhNSzRxQXJFMVp0azE0NTZraUpyaXc2YWJrTmVSSG9nYVBSQmdiZ0Y5WjhpL3RieldFTE40Q3ZicXRycVY5VHRHU25tUFMyRjlrcU9JQmFhekhZYUo5YmkzQW9EQnZsWmFzTWx1eHQwQkRYZmhwMDJKbjQxMWFWdDZTNFRVQjhaZ0ZEa0k2VFA2Z3dQWTg1dytvVVFTc2pJZVhWbWlucndJZEsyWkFhd2I4U2U2WE9KYk9hbGlReEhTcm5BZU9OREx1Q25GZWpJYnA0WUR0QmNRQ3dNc1lpUlpmSGVmdUVKcUpjd0tUVEo4c3g1aGpIbUpJMXNQRkhPcjZXOUFoWjJOQW9kMzhtbkxRazFnT3oyTENBb2hvUWJnTWJVSzlSTUVBM0xraUY3U3I5dExacDZsa2NpSUdoRTJWNTQ2dzNNYW01M1Z0VmtHYkI5dzBZazJYaVJuQ21icHhtSHIyazRlU0MwUnVOYmpOc1VmRElmYzhEWnZSdmdVRGUxSWxLZFpUemNUNFpHRWI1M2RwOFZ0c29abHlYekxIT2RBYnNwMUxQVFZhSHZMQTBHWURGTWJBVy9XVUJmVUFkSHdxTEZBViszdUh2WVdyQ2ZoVU9SMmk4OXF2Q0JvT2I0OHVzQUdkY0YyTTRhS243OWsvNDNXekJaK3hSMUwwdVpmaWE3MFhQOXNvUVJlZXVoWmlVblhGREcxVDgvT1hObXNzVFNuWU8rM2tWTEFnZWlZNzE5dUR3TDlGUXljZ0xQZXNzTmloTVpiQUtHN3F3UFp5RzExRzErWkEzakFYMnlkZHBZZm1hS0JsbWZjSy9WMG13SVJVREMwbkpTT1BVbDJLQjhoMTNGNGRsVlppUmhkR1k1ZmFyd04rZjloRWIxY1JpNDFaY0dEbjZYZTlNTVNUT1k4MVVMSnlYSUhTV0ZJUUhzdFZZTGlKRWlVamt0bEhpR2pudE41L2J0QjhGdSt2cDI4emwyZlpYTitkSkR5TjZFWGhTKzB5enFwbC9MU0pORVVWeG11N0JzTmRqQVkwalZzQWhrTnV1WTBFMUc0OGVqMjVtU3QrMDB5UGJRNFNSQ1ZrSXdiNklTdll0bUpSUHo5WnQ1ZGs3NmJsZitsSndBUEg1S0RGK3ZIQW1BQ0xvQ2RHMkFkaWk2ZE9Ibk5KblRtWnRvT0dPOFExankxdmVNdzZnYkxGVG9RbWZKYTduVDdBbDg5bVJiUmtaWlF4SlRLZ0s1S2M5SU56bVRKRnAwdHBBUHpObXlML0YwOGJYM25oQ3VtTS9jUi8yUlBuOWVtWjNWbGpva3R0WkQxelZXWGxVSXFFVTdTTGs1STBsRlJVMEFjRU5YQllhek5hVnpzVkhBL3NEM285aG00MndiSElSYi9CQlFUS3pBaThzMytiTXRwT09aZ0xkUXpDWVBmWDNVVXhLZDFXWVZrR0g3bGgvUkJCZ01aWndYelU5K0dZeGRCcWxHczBMUCtEWjVnMkJXTmg2RkFjUjk0NEIrSy9KVFdJM3Q5WXlWeVJobFA0Q0NvVWsvbW1GNytyMnBpbFZCanhYQkhGYUJmQnRyOWhiVm4yekR1STBrRU9HM2tCeDhDR2RQT2pYMXBoMVBPT1pKVU8xSkVHRzBqelV5MnRLNFgwQ2dWTllobWtxcVF5c1JOdEt1UGRDSnFLM1dXNTdrYVYxN3ZYZ2l5UHJsNEtFRVdnaUdGMWV1STRRa1NGSEZmMFREcm9RaUxOS0ppTGJkaEgwWUJocmlSTkNIUHhTcUptTk5va2V0YWlvb2hxTWdsaDZ3THRFR1dTTTFFWmJRZzcyaDBVSkFJUFZGQ0FKT1RocFFHR2RLZkZvdmN3RWVpQnVaSE4yT2I0dVZNNytnd1pMejFEOUU3dGE0Um1NWjI0T0JCQWc3RWg2ZExYR29mWjRVMlRGT0NRTUtqd2hWY2tqcnlkUlMrWWFxQ3cxa1l0NlVleHV6Yk5FRHlZTFRabnJZMVB6c0haSlQ0VSthd08yeGxxVFNZdTZuL1UyOU8yd1BYZ0dPRUtETVNxK3pUVXR5YzgrNmlMcDBpdmF2NEZLeCt4eFZ5NEZ4aElGL3B1Y1ZEcXBzVmUyakZPZmRaaFR6THoyUWp0enZzVEN2RFBVN2J6REgyZVhWS1VWOVRaK3FGdGFTU3huWWdZZFhLd1ZyZUlndldoVDllR0RCMk92bld5UExmSUlJZk5uZkl4VThuVzdNYmNIMDVuaGxzWXRhVzlFWlJzeFdjS2RFcUlucTFEaVpQS0N6N2lHbUFVOS9jY25uUXVkMnBOZ0lHRllPVEFXamhJcmQ2M2FQRGdmajgvc2RsRDRsK1VUbGN4VEk5amJhTXFxTjBnUXhTSHM2MElBY1czY0g0cDNWMWFTY2lUS0IyOUwxdHoyZVVRaFJpVGdUdm1xYytzR3RCTmg0a3kwbVFKR3NkeWNCUkVQK2ZBYVNzMUVSRURWbzVndmdpNSthQ043TkVDdzMwb3diQ2MxbVNwamlhaHlOVndKZDFqaUdnelN3ZlRwemYyYzVYSnZHL2cxbjBmSDg4S0hObmYrdTdaaVJNbFh1ZVNJc2xvSkJVdFc5ZXp2c3g5Z3Jmc1gvRk54bmJ4VTFMdmcwaEx4aXh5cEhLR0ZBYVB1MHhDRDhvRFRlRlN5ZlJUNnM4MTA5R01VWkw4bTJ4WHA4WDJkcFBDV1dkWDg0aWdhNEJyVGxPZnFveDRzaHFFZ2gvSHQ0cVJzdDUyY0ExeE9JVXVPeGdmVWl2cDZ2NWY4SVZ5YXJ5RWRwVms3MkVSQXdkVDRhb1kxdXNCZ21QKzBtMDZRMjE2SC9udWJ0Tll4SGFPSVlqY2FjaDNBOEV6L3pjMEtjU2hoZWwwSENZakZzQTBGallxeUo1WlVIMWFadzMreldDMGhMcE02R0RmY0FkbjlmcTJvclBtWmJXNlhYcmYrS3JjOVJ0dklJNWplRDNkRm9UMUt3Wkp3eGZVTXZjNUtMZm44clJPVzIzSnc4OXNKMmE1ZHBCM3FXRFVCV0YyaVg4T0N1S3BySG9zSjJtZmxCUitXcXM4NlZ2Z0kvWE1uc3FiOTcrVmxLZFBWeXNjelBqOEpoemYrV0N2R0JIaWpBcVlsYXZiRjYwc29NV2xIYnZLVCtTY3ZocHJnZVRsbjUxeFgwc0YrRWFkYy9sMnMyYTVCZ2tWYkhZeXowRTg1cDBMc3RxSCtnRUdpUjg0bkJSUkZJbjhoTFNackd3cWpaM0UyOWN1R2krNVo1YnA3RU04TVdGYTlzc1Mvdnk0VnJEZkVDU3Y3RFNVODREYVAwc1hJM0FwNGxXem5RNjVuUW9US1JXVTMwZ2Q3Tm44Wm93VXZHSXg0YXF5WEd3bUEvUEI0cU44bXNKVU9EZXpVSEVsMFZQOXVvK2NaOHZQRm9kU0lCNEM3bFFZakVGajh5dTQ5QzJLSVYzcXhNRllUZXZHOEtxQXIwVFBsa2J6SEhuVHBEcHZwenppQWlORmg4eGlUN0MvVGl5SDBFZ3VVdzR2eEFncG5FMjdXSXlwVit1Rk4yelc3eG5pRi9uNzV0cnM5SUo1YW1CMXpYWFoxTEZrSjZHYlMvZEZva3psNGNjMm1hbVZ3aEw0WFUwQXY1Z0RXQWwrYUVXaEFQN3QyVkl3VStFcHZmT1BEY0xBU1g3SDdsWnBYQTJYUWZiU2xENHFVMThOZmZOUG9BS01OU2NjQmZPOVlWVmdtbFc0UnlkQnFmSEFWNytoclo4NFdKR2hvNmJOVDBZTWh4eExkT3gvZHdHajBveWFrOWFBa05KOGxSSnpVdUE4c1IrZlB5aXlUZ1VIaW81K1BwK1lhS2xIcmhSNDFqWTVORVNQUzN4K3pUTWUwUzJIbkxPS0NPUVBwZHhLeXZpQnZkSHJDRFJxTytsOTZIaGhOQkxYV3Y0eUVNdUVVWW84a1huWUpNOG9JZ1ZNNFhKK3hYT2V2NFliV2Vxc3ZncTBsbXc0L1BpWXI5c1lMdCtXNUVBdVlTRm5KRWFuOEN3SndidEFTQmZMQkJwSlppUlBvci9hQ0pCWnNNK01odlM3WmVweUh2VThtNVdTbWFabnh1THRzOG9qbDZLa1M4b1NBSGtxNUdXbENCL05nSjVXM3JPMkNqMU1LN2FoeHNDcmJUVDNhMFYvUVFIK3NFcnhWNFhVV0RIeDBra0Z5MjViUG1CTUJRNkJVM0hvSGhoWWNKQjlKaFA2TlhVV0t4bkUwcmFYSEI2VTlLSHBXZFFDUUk3MnFldnA1Zk16Y20rQXZDODVyc3luVlFocnVEQTlmcDlDT2U3TjU2Y2cxVUtHU2FzODl2ck4rV2xHTFlUd2k1VysweFlkS0VHdEdDZU5Kd1hLRFUwWHFVNXVRWW5Xc013VEVOTEd0YlFNdm9HaklGSUVNekNSYWw0cm5CQWc3RC9DU244TXNDdlMrRkRKSkF6b2lpb0pFaFpKZ0FwOW4yKzFZem5yN0grNmVUNFlrSjlNcGo2MEltY1c0aTRpSERMbjlSeWRCOGR4M1FZbTNyc1g2bjRWUnJaRHNZSzZEQ0d3a3dkNW4zL0lORkVwazE2ZllwUDZKdE1RcHFFTXpjT2ZRR0FIWEJURUd6dUxKMDNHWVFMOWJtVjIvN0V4RGxSZitVdmYxc00yZnJSdENXbWFsMTJwTWd0b252U0N0UjRuMUNMVVpSZFRIREhQMU90d3FkK3JjZGxhdm5LalVCL09ZWFFIVUp6cE55Rm9LcFFLKzJPZ3JFS3BHeUlnSUJnbjJ5OVFIblRKaWhaT3BFdk9LSW9IQU1HQVhIbWoyMUx5bTM5TWJpb3c0SUYrNzd4TnVld3ppTlZCeHI2S0Q1ZSs5SHpaU0JJbFVhL0Ftc0RGSkZYZXlyUWFrUjNGd293VEdjQURKSGNFZmhHa1hZTkdTWW80ZGg0Ynh3TE0rMjh4amlxa2RuMC8zUjRVRWt2Y0JyQmZuL1N6QmMxWGhLTTJWUGxKZ0tTb3JqRGFjOTZWMlVuUVlYbDEveVpQVDREVmVsZ08rc29NamV4WHdZTzU4VkxsNXhJblFVWkk4amMzSDJDUG5DTmI5WDA1bk94SXk0TWxlY2FzVHFHSzZzMmF6NFJqcEYyY1FQMkcyOFIrN3dEUHNaRFpDL2tXdGpkb0hDN1NwZFBtcVFyVUFoTXdLVnV4Q21ZVGlEOXEvTzdHSHRadlBTTjBDQVVRTi9yeW1YWk5uaVlMbEpERTcwYnNrNlh4c2g0a0RPZHhlN0Eyd283UDlGNVl2cXFSREk2YnJmNzl5UENTcDRJMGpWb080WW5MWXRYNW56c3BSNVdCNEFLT1l0UjF1alhiT1FwUHlZRHZmUkUzRk41encwaTdyZWVoZGk3eVYwWURSS1JsbEdDR1JrNVl6K1V2MWZZbDJad3JuR3Nxc2pnQVZvMHhFVWJhOG9oamFOTUpOd1R3WkEvd0JEV0ZTQ3BnMWVVSDhNWUwyemRpb3hSVHFnR1FyRFp4UXlOenlCSlBYWkYwK294SVRKQWJqN29OQzVKd2dETVVKYU01R3FsR0NXYy8vS0NJckkrYWNsRWU0SUEwdXp2N2N1ajZHQ2RhSk9OcGkxM081NDR2YnRJSEJGK0ErSmVERlVRTnk2MUdraTNydHlRNGFVeXduNnJ1MzE0L2RrR2lQOEl3am8wSi8yVHhzNDlaa3dFbDRteCtpWVVVTzU1STZwSnpVNFArN1JScytEWFpreUtVWVpxVldyUEY0STk0bTRXeDF0WGVFNzRvOUd1WDk3N3l2Si9qa2RhazgrQW1vSFZqSTE1VitXd0JkQVJGVjJJUGlySmdWTWRzZzFQZXoyVk5IcWE3RUhXZFRrbDNYVGN5akc5Qml1ZVdGdlFmWEk4YVdTa3V1Um1xaS9IVXV6cXl2TEpmTmZzMHR4TXFsZFlZZmxXQjFCUzMxV2t1UEpHR3dYVUNwamlRU2t0a3VCTVd3SGpTa1F4ZWVocXcxS2d6MFRyem03UWJ0Z3hpRVBEVm1XQ05DQWVDZlJPVHBoZDFaTk9oekx5NlhmSnlHNlhnZDVNQ0FadzR4aWUwU2o1QW5ZMS9ha0RnTlM5WUZsM1kwNnZkNkZBc2cyZ1ZRSnR6RzdMVnExT0gyZnJiWE5IV0gvTlk4OU5OWjRRVVNKcUwyeUVjR0FEYlQzOFgwYkdkdWtxWWxTb2xpS09jc1NUdXFoY2FlbVVlWUxMb0k4K01ab3IyUnhYVFJUaEYxTHJIZnFmLzVMY0xBamRsNEVFUmdVeXNZUzJnZUUreUZkYXNVOTFVZ1VEc2MyY1NRMVpvVDkrdUxPd2RnQW1pZndRcUYwMjhJTmMySVFFRGZUbVV3M2VaeHZ6N1VkMXozeGMxUFFmZUN2ZktzQjlqT2hSajdyRnliOVhjRFdMY1lqMGJCeW9zeWNoTWV6TUxWa0ZpWWNkQkJRdHZJNkswS1J1T1pRSDJrQnNZSEphWFRrdXA4RjBlSWhPMS9HY0l3V0twcjJtb3VCN2c1VFVESk52T1JYUFhhL21VOGJoMjdUQVpZQmUyc0t4NE5TdjVPam5ISVdEMlJ1eXNDekJsVWZlTlhoRGQyanhuSG9VbGhlSjNqQkFwelVSeTBmd20yRnd3c1NVMGNhUUdsMEt2OGhvcFJRRTIxMU5udnRMUnNtQ05yaGhwRURvTmlaRXpEMlFkSldLYlJSV25hRmVkWEhBRUxTTjB0MGJmc0NzTWYwa3RmQm9YQm9OQStuWk45K3BTbG11enNwRmV2bXNxcWNNbGx6enZreVhyem9BK1J5bzFlUFhwZEdPb0p2aHlydStFQlJzbU9wN01YWjB2TlVNVXFITFVvS2dsZzFwNzNzV2VabVBjK0tBdzBwRTJ6SXNGRkU1SDQxOTJLd0R2RHhkeEVZb0RCRE5aamJnMmJtQURUZVVLSzU3SVBENGZUWUY0YzZFblh4L3RlWU1PUkJEdEloUEpuZWlabnk3TnYvekcrWW1la0lLQ294cjZrYXVFMmJadEJMdWZldE5HMEJ0Qlk3ZisvSW1VeXBNQnZkV3UvUTd2VE1Senc1YVFHWld1YzFWMEhFc0l0RllNSUJub0tHWjB4Y2FyYmEvVFlacTUwa0NhZmxGeXNZakE0RURLSHFHZHBZV2RLWW1tK2E3VEFEbVczNXlmbk9ZcFpZcmtwVkV0aXFGMEV1akkwMGFlcGxOczJrK3F5RlpOZUUzQ0RQTDlQNmI0UFEva2F0YUhrVnBMU0VWR0s3RVg2ckFhN0lWTnJ2WnRGdk9BNm9rS3ZCZ010RkRBR1pPeDg4TWVCY0o4QVIzQWdVVWVJem5BTjZ0akNVaXBHRFpPTm0xRmpXSnA0QTNRSXpTYUlPbVo3RHZGL3lzWVliTS9mRkRPVjBqbnRBalJkYXB4SnhMMGVUaHBFaEtPakNERHEya3MrM0dyd3hxSUZLTGUxV2RPeklJOFhJT1BHbnd5NkxLWFZmcFNET1RFZmFSc0d1amhwUzRoQklzTU9xSGJsMTZQSnhjNEVrYVZ1OXdwRVlsRi84NE5TdjVadW00ZHJNZnA5eVhienpBT0pxcVM0WWtJNGNCckZyQzdiTVBpQ2ZnSTNuTlpBcWtrM1FPWnFSK3l5cXgrbkRRS0JCQlo3UUtyZkdNQ0wrWHBxRmFCSlUwd3BrQmRBaGJSNGhKc21UNWF5bmx2a291b3htL05qRDVvZTZCelZJTzl1a3RNKy81ZEVDNVA3dlp2YXJtdU8vbEtYejRzQmFiVlBJQVR1S1Ryd2JKUDhYVWtkTTZ1RWN0SEtYSUNVSkdqYVpJV1JiWnA4Y3pxdVFZZlk2eW5CVUNmSVUrZ0c2d3FTSUJtWUltOXBacFhkYUwxMjFWN3EwVmpEam1Rblh2TWU3eXNvRVpuWkwxNUIwU3B4UzFqamQ4M3VOSU9LWnd1NU1QemcyTmhPeDN4TU9QWXdFbjJDVXpiU3J3QXM1T0F0cnozR0FhVWtKT1U3NFh3amFZVW1HSmRaQlMxTkpWa0dZclRvSU5MS0RqeGN1SWx5ZlZzS1FTRy9HNER5aU8yU2xRdkowZDBPdDF1T0c1SUZTQWtxK1BSVk1nVk1Edk9JSk1kcWplQ0ZLVUdSV0JXOXdpZ1l2Y2JVN0NRTC83bWVGMktaQWFXbCs0eTl1aG93QVg3ZWxvZ0F2SXRBQXhvMitTRnhHUnNIR0VXOUJuaGxUdVdpZ1l4UmNuVlVCUlFIVjQxTFYrRnI1Q0pZVjdzSGZleXdzd3g0WE10VXg2RWtCaFIrcThBWFhVQTh1UEo3M1BiNDlpOUtHOWZPbGp2WGV5Rmo5aXhnYm82Q2NiQUo3V0hXcUtIeS9oK1lqQndwNlZjTjdNODlGR3pRMDRxYnJRdGdyT0Z5YmczZ1FSVFlHNXhuNzNBcmtmUVdqQ0pST3d5M0ozOER4L0Q3ak9hNkJCTnNpdEV3MXdHcTc4MEVFaW9PZUQrWkdwMko2NkFEaVZHTWF5aUhZdWNNazhuVEsyenpUOUNuRXJhQWs5NWtRank0azBHUkVsTEw1WUFLTFFFcko1cnAxZWF5OU80RmI2eUpHbTlVNEZhTXdQR3h0S0Q2b2RJSUhLb1duaEtvMVU4S0lwRkMrTVZuNTlaWG1jN1pUQlpmc2c2RlE4VzEwWWZUcjR1MG5ZcnBIWmJaMWpYaUxtb29GMGNPbTArbVBuSkJYUXRlcGM3bjBCcU9pcE5DcUk2eXlsb1RlUlNoTktIMDRGSW8wZ2NNazBIL3hUaHlONHBQQVdqRERrRXAzbE5OUFJOVmZwTUk0NENXUmxSZ1ZpUDY0ZUswSlNScDBXVXZDV1l1bWxXL2M1OFZjei95TXdWY1c1b1liOSsyNlRFaHd2YnhpTmc0OGhsMVZJMVVYVFUvL0V0YStCTUtuR1VpdmN0Zkw1d0lOREQwZ2lRTDFpcHQ2VTdDOWNkNCtsZ3FZMmxNVVowMlV2NlBycytaRVplcjdaZldCWFZnaGxmT09yQ2x3c29PRkt6V0VmejZSWnUxZUNzK0s4Zkx2a3RzNStCWDBneXJGWXZlMEMzcUhybjVVL09oNkQvQ2lobVdJclk3SFVaUmhKYXhkZSt0bGR1NmFkWUorTGVYdXBRdzBYRXhDMzZSRVRkTkZ4Y3E5Z2xNdTRjTlFTWDljcVIvR1FZcCtJeFVrSWNOR1dWVTdadEdhNlAzWEF5b2RSdDBYZVMzVHAwMUFuQ2gwWmJVaDRWclNaZVY5UldmU29XeXhuWTNoemNaMzBHL0luRHE0d3hSckVlanJlQnhuaElRYmt4ZW54a2F4bCtrN2VMVVFrVVI2dktKMmlERk5HWDNXbVZBMXlhT0grbXZoQmQrc0U2dmFjUXpGb2J3WTVCcUVBRm1landXNW5lN0h0Vk5vbE9VZ0pjOENzVXhtYy9MQmk4TjVtdTlWc0lBNUh5RXJuUzZ6ZUN6N1ZMSTkrbi9oYlQ2aFRva01YVFZ5WEpSS1NHMmhkMmxhYlhUYnRtSzRmTkgzSVpCUHJlU0E0Rk1lVm91Vk4zekc1eDlDaUdwTHcvM3BjZW80cUdxcCtyVnAreis3eVE5OG9FZitueUg0RjMrSjlJaGVEQmE5NFdpNjN6SmJMQkNJWm03UDBhc0hHcElKdDNQekUzbTBTNFlJV3lYQkNWWEdpa2o4TXVkRFBCLzZObTJ2NEl4SjVnVTBpaTBndXk1U1VIcUdVWXpUUDBqSUpVNUU4MlJIVVh0WDRsRGRyaWhCTGRQMVlhRzFBR1VDMTJyUUt1SWFHdkNwTWpaQzliV1NDWW5qRGx2cFdia2RYTVROZUJITEtpdW9vek1HSXZrY3ptUDBhUkpTSjhQWW5MQ1ZOaEtIWEJOY2tINzllOFo4S2Myd1VlajRzUVpvSDhxRFJHa2c4Nm1hVy9aUVdHTm5MY1htcTNGbFhNNnNzUi8zUDZFL2JITXZtNkhMcnYxeVJpeGl0MjVKc0gzL0lPcjJVVjRCV0poeFhXNUJKNlhkcjA3bjlrRjNaTkFrNi9YcGM1TVNGbVlKMlI3YmRMOEtrN3ExT1U5RWxnL3RDeEo4Z2lUMjd3U1R5U0YwR094ZzRQYllKZGkvTnlpYTlObjg5Q0dEdWxmSmVtbTFhaUVyL2VsZUdTTis1TVJyVko0SzZsZ3lUVElXM2k5Y1EwZEFpNkZIdDBZTWJIM3dEU0F0R0xTQWNjZXp6eEhpdHQxUWRoVzM2Q1FnUGNBOHZJSUJoMy9KTmpmL09ibWMyeXpwazhlZFNsUzRsVmR3Z1c1dnpiWUV5Rm9GNEdDQkJieTFrZVZOdWVIQUgrZXZpK0g3b09WZlMzWHVQUVNOVFhPT05BYnpKZVNiNXN0d2RRSGwxWmpyR29FNDlJOCtBOWozdCthaGhRajc0RkNTV3Bacmo3d1JTRkpKbm53aTFUOUhMNXFyQ0ZXL0pacTZQNjJYa01XVGIrdTRsR3BLZm1td2lKV3gxNzhHT0c3S2JyWkdxeVd3bXV5S1dQa05zd2taMXE4dXB0VWx2aUlpK0FYaDJiT09UT0xzcnROa2ZxYlFKZWgyNHJlZWJrSU5Ma2p1dDVyNGQ5R1IvcjhDQmE5U1UwVVFoc25acDVjUCtScVdDaXhSbTdpNFlSRmJ0WjRFQWtodE5hNmpIYjZnUFlRdjdNS3FrUExSbVgzZEZzSzhYc1JMVlo2SUVWckNibU5EYzhvNW1xc29nakFRZm9DOUJjN1I2Z2Z3MDNtK2xRcHY2a1RmaHhzY0RJWDZzMHcrZkJ4dGtoalhBWHIxMFVvdVdDeDNDL3AvRll3SlJTL0FYUktrak9iNUNMbUs0WFJlMCt4ZUREd1ZrSlBaYXU1MmJ6TEVESENxVjBmNDRwUGdLT2tZS2dUWkozM2ZtazNUdThTZHhKMDJTSE04RmVtNVNNc1dxUnlpMkYxeW5mUkpzemNGS3lrZFdsTnFnREEvTDlsS1lCbWM3WnUvcTlpaTFGUEY0N1ZKa3FoaXJVb2I1M3pvaUp0VlZSVndNUjM0Z1Y5aXFjQmFIYlJ1OWtrdnFrM3lNcGZSRkc0OXBLS2pJaXE3aC9WcFJ3UEdUSG9ZNGNnMDVYNTAyOGlIc0x2VVcvdXora2pQeUlFaGhjS1V3Q2tKQXdiUjlwSUVHT244ejZzdkFPOGk4OXNKM2RMNXFEV0ZZYlMrSEdQUk14WXdKSXRGUU44NllFU2VKUWhuMnVyR2lMUmZmUWVMcHREbDhkQWdiK1RwNDdVUVB4V093MTdPZUNoTE4xV256bGtQTDFUNU8rTzNNZW5wbjRDM0lZNUxFZXBIcG5QZVpIYnZ1V2ZlVnRQbGtINExaalBiQnJrSlQzTm9SSnpCdDg2Q08wWHE1OW9RKzhkc20weW1SY21ReW44dzcxbWhtY3VFSTVieXVGK0M4OFZQWWx5MnNFempsekFRM3Zkbi8xK0h6Z3V3NnFGTk5icWVuaFpHYmRpRzZSd1phVEc3alRBMlg5UmRYakROOXlqMXVRcHlPNEx4OEtSQWNaY2JaTWFmcDR3UE9kNU1kWG9GWTUyVjFBOE05aGkzc3NvOTMrdXByRTBxWU5NamtFMjJDdks0SHVVeHFON29JejVwV3VFVHExbFFBanFsU2xxZEQyUm5yL2dncC9UVmtRWWpuOWxNZlllbGsyc0g1SFBkb3BZbzdNSHdsVjFvcjlCeGYrUUN5THptOTJ2ekcyd2ppSWpDL1pIRUp6ZXJvSmw2YmRGUFRwWmhvNU1WMlU4NmZMUXF4TmxHSU1xQ0d5KzlXWWhKOG9iMXIwK1doeGRlOUwyUGR5c0VUdjk3Tyt4VncrVk5OMVRaU1FONUk2bDltNUlwNnBMSXFMbTRhMUIxZmZINmdIeXFUOXA4Mk5Pam50UldHSW9mTzNiSno1R2hrdlNXYnNYdWVUQU1hSkRvdTk5a0dMcURsaHdCWk5FUTRtS1B1RHZWd1NLNFdtTGx1SHloQTk3cFppVmU4ZytKeG1uSkY4SWtWL3RDczRKcS9IZ09vQUVHUjl0Q0RzRGJEbWkzT3ZpVVFwRzVEOFhtS2NTQVVhRkxSWGIybG1KVE5ZZGh0WXlmakJZWlFtTjVxVDVDTnVhRDNCVm5sa0NrN2JzTVczQXRYa05NTVR1VzRIalVFUlNKblZRMHZzQkdhMXdvM1FoNzExNVhHZVRGM05Uejh3MDQ0MEFnVTdjM2JTWE8vS01JTmFJV1hkMG9McG9xLzAvUUp4Q1FTSjlYbll5MVc3VFlMQkpwSHNWV0QxYWhzQTdGak52UmQ2bXhDaUhzbThnNlowcG56cUlwRjFkSFV0UDJJVFU1WjFoWkhidStMM0JFRVN0QmJMOVhZdkdmRWFrdjFibWYrYk9aR25vaXVIRWRsQm5hQ2h4WUtOekIyM2I4c3c4WXlUN0FqeGZrNDllSklBdmRiVmtkRkNlMkowZ01lZmhRMGJJWnhoeDNmek1JeXNRTmlOOFBnT1VLeE9NdXIxMExkdWlnUkVEUk1aeVA0b0dXclAxR0ZZNHQ2Z3JvQVNzWjQyMW9zNDh3QWRucmJvdk5oTHQ3U2NOVUxrd1o1QUlaSlRyYmFLWVRMakExb0ozc0l1Ti9hWW9jbS85dW9RSEVJbGFjRjFzL1RNMWZMY1BUTDM4TzlmT3NqTUVJd29QS2Z2dDdvcHVJOUcySGYvUFI0YUNMRFE3d05tSWRFdVhKL1FOTDcyazVxNE5lakFsZFBmZTNVVlZxemt5czhZWi9qWU9HT3A2YytZelJDckN1cTBNMTF5N1RpTjZxazdZWFJNbi9ndWt4ckVpbWJNUWpyM2p3Uk02ZEtWWjRSVWZXUXI4bm9QWExKcTZ5aDVSM0VIMUlWT0hFU3N0L0xJdGJHMkQydlJzWlJrQU9ienZRQUFEM21iMy9HNE56b3BJMEZBaUhmYnBxMFg3MmFkZzZTUmorOE9ITVNodEZ4eExabGYvbkxnUkxiQ2x3bDVXbWFZU3MreUVqa3E0OHRZN1oyYkUwTjkxbUp3dCt1YTBObFJKSURoMEhpa0Y0VXZTVm9yRmoyWVZ1OVllUzV0ZnZsVmpQU29OdS9adTZkRVVmQk9UNTU1aGFoQmROM1NhNVh1ajJSdmF1MWxRTklhQzk0NHkwUldqOVVpTkRza0FLMVdvTCtFZlhjQzZJYkJYRlJ5VmZYL1dLWHhQQXdVeUlBR1c4Z2daMDhoY2lqS1R0MVlLblVPNlFQdmNybURWQWIwRkNMSVhuNWlkNGZEL0p4NHR3L2diWHM3V0Y5YjJSZ1h0UGhMQkc5dkY1RkVrZEhBS3JRSFpBSkMvSFd2azdudnp6RHpJWFpsZkZUSm9DM0pwR2dMUEJZN1NRVGpHbFV2RzU3N3lOdXRaMWhUZnM5LzFua1NYSzl6ektMUlozVk9EZUtVb3ZKZTBXQ3ExelZNWXhDSk1lbm1OelBJVTJTOFRBNEU3d1dtYk5reHE5ckkyZGQ2djBWcGNBUFZNeG5Ec3ZXVFdGYXl5cXZLWk83WjA4YTYyaS9vSDIvanhmOHJwbWZPNjRpbjNGTGlMMUdYOElHdFZFOU0yM3lHc0lxSmJ4RFR5K0x0YU1XRGFQcWt5bWI1VnJRZHpPdnFsZGVVMFNVaTZJaXJHOFVaM2pjcFJid0hhMUMwRHd3OUcvU0ZYM2dQdlRKUUUra3l6K2cxQmVNSUxLS08rb2xjSHpjdE9XZ3p4WUhuT0Q3ZHBDUnR1WkVYQUNqZ3Flc1pNYXNvUGdudURDNG5VdmlBQXhEYzVwbmdqb0FJVElrdmhLd2c1ZDYwOHBkclpjQStxbjVUTVQ2VW8vUXpCYU94QkNMVEpYM01nazg1ck1mc25XeDg2b0x4ZjdwMlBYNU9OcWllVGEvcU0zdFB3NFpYdmxBcDgzTlNEOEY3K1pnY3RLMVRwb1l3dGlVMmgwMkhDR2lvSDV0a1ZDcU5WVE1INXAwMHNSeTJKVTFxeURCUDJDSUkvRGc0V0RzSWwremdlWDc1ODlzcng2WU9SUlFNQmZLYm9kYkI3NDNUbDRXTEtPRW53V1VWQnNtOTRTT2xDcmFjVTcyTVN5ajA2OHdkcFlqeXoxRndDMmJqUW54bkI2TXAvcForeXlaWHRndUVhWUIra3FoalE2VVVtd1NGYXpPYityaFlqTGFvaU0rYU45LzhLS24wemFDVEZwTjllS3dXeTcvdTRFSHpPNDZUZEZTTmpNZm4yaVBTSndEUENGSGMwSTErdmpkQVp3NVpqcVIvdXppOVpuMjBvQWE1Sm5MRWsvRUEzVlJXRTdKL1hydXBmRkpQdENVdXFIUHBubEw3SVNKdFJwU1ZjQjhxc1pDbTJRRWtXb1JPdENLS3hVaDN5RWNNYldZSndrNkRsRUJHMGJaUDZlZzA2RkwzdjZSUGI3b2RHdXdtN0ZOOGZHNHdvcXRCOGU3TTVrbFBwbzk3R29PYk53dCtsdWRUQW14eUM1aG1jRngrZEl2RVpLSTZpZ0ZLSHFMSDAxaVkxbzc5MDNWekc5UUdldHlWeDVSTm1CWVVVK3pJdVN2YS95SWNFQ1VpNHBSbUUzVmtGMmF2cXVsUUVVWTR5Wi93bU5ib0J6UG1BUGV5MytkU1l0QlpVamVXV1QwcFB3Q3o0Vm96eHA5eGVDbElVNjBxdkVGTVFDYVB2UGFBNzBXbE9QOWYvZXkzOW1hY3ZwR0NWYSt6ZmE4Z080NHdieHBKVWxDOEdOL3BSTVRRdHpZOFo4L2hpTnJVK1pxNjRaZkZHSWtkajdtN2FiY0sxRUJ0d3MxWDRKL2hucXZhc1B2dkRTRFlXTitRY1FWR01xWGFsa0R0VGFkNXJZWTBUSVIxRXFveDNjendQTWpLUHZGNXNGdjE3VGh1anIxSVoxWXRsNFZYMUowdmpYS21MWTRsbVhpcFJBcm8wcVZHRWNYeEVWTU1FbDU0alFNZDRKN1JqZ29tVTBqMXB0anl4WStjTGlTeVhQZmlFY0lTMmxXREszSVNBeTZVWjNIYjV2blBuY0E5NDQxMWpjeTc1YXk2QjZEU1R6SzZVVENaUjl1REFOdFBCcnZJRGdqc2Zhck1pd29heDJPbEx4YVNvWW40aVJna3BFR3FFa3dveDV0eUk4YUtrTGxmWjEybE8xMVR4c3FSTVk4OWo1SmFPNTVYZlBKUERMMUxHU25DODhSZTlBaStOdTViWmp0d1JydkZJVFVGSFBSNFpteEdzbFFNZWNnYlpPN25IazMycUh4WWtkdldwdXAwN29qY01DYVZycEZBeUZaSkpiTnZCcFpmZGYzOUhkbzJrUHRUN3YwL2Y4Ui9CNU56NGYxdDkvM3pOTS83bjZTVUhmY1drNWRmUUZKdmNKTWdQb2xHQ3BPRmIvV0MwRkdXVTJhc3VReVQrcm04OFpLWjc4Q2VpL0NBaDkzOUNIMEpZYnBaSVB0eGMydWZYcWpTM3BISDlsbldLNGlKN09qUi9FRVNwQ28yUjNNWUt5RTdySGZoVHZXaG80Y0wxUWRONGpGVHlSNnN5TXdGbTEyNFRWRERSWE1OdmVJMURwL250d2R6OGs4a3h3N2lGU3g2K1l4Nk8rMUx6TVZyTjBCQnp6aVppOWtuZVpTemdvbGxCblZ3Qmg2b1NPUEhYcmdsck9qK1FtUi9BRVNyaERwS3JXVCs4L0FpTUR4Uy81d3dSTnVHUVBMbEo5b3ZvbWhKV244c01MVkl0UThOLzdJWHZ0RDhrZE9vSGF3K3ZCU2JGSW1Rc3YvT0NBSXVpOTlFK1lTSU9NbE12QlhrQXQrTkFaSzh3QjlKZjhDUHRCK1RPVU9SK3o3MWQvQUZYcFBCVDYrQTVGTGp4TWpMSUVvSnpyUWZxdXZ4RUlpK1dvVXpHUjFJelFGTnZiWU9ueGIyUHlRMGtHZHlYS3pXMmF4UUw4bE5BWFBrNk5FanFyUkQxb1p0S0xsRm9vZnJYdzBkQ05XQVNIenkrN1BTek9VSjNYdGFQWnN4TERqcitvNDFmS3VLV05tamladGZrT3pJdHZsVjJNREdTaGVHRjBtYTA0cUUzVFVFZnFKTXJYRm03RHBLKzI3RFN2Q1VWZjdyYk5vbGpQaGhhNVc3S0JxVnEwU2hVU1RiUm11cVB0UXJlVldINEpFVDV5TWh1cU1vU2Q0ci9OOHNEbWVRaVFRdmkxdGNadjdNb2M3ZFQ1WDVBdENENmtORUdaT3pWY05ZbHBYNEFiVHNMZ1NZWWxpaVB5Vm9uaXVZWXlTeHNCeTVjZ2IzcEQrRUswR3BiMHdKZzAzMWRQZ2FMOEpadDZzSXZ6TlBFSGZWUE9qWG1hWGo0YmQ0dm9YenBaNUdBcE1oSUxnTWJDRVdaMnp3Z2RlUWdqTkhMYlBJdCtLcXhSd1dQTFRONkh3WjBPdWlqajRVRitTZzBBdThYdUlLVzBXeGxleGRyRnJEY1pKOFNoYXVhdDNYMFhtSHlncWdMMW5BdTJockpGYjR3WlhrY1MraTM2S015VTF5RnZZdjIzYlFVSmkvM3lRcHFyL25hVU9vaUVXT3hja3lxL2dxNDNkRm91MURWRGFZTVpLOXRobzcrSVhYb2tCQ3M1R1JmT2NCSzdnM0EralhRMzlLNFlBOFBCUlc0bTUreVIwWkF4V0puY2pSVmJJVHZJQVBIWVJ0MUVKM1lMaVVicUl2b0tIdHpIS3RVeTFkZFJVUTBBVU80MXZvblpEVU9XK21yc3p3K1NXLzZRL0lVZ05wY1hGamtNN0Y0Q1NTUTJFeFpnODVvdHNNczdrcXNRRDRPeFllQk5EY1NwaWZqTW9MYjdHRWJHV1R3YXNWT2JtQi9iZlBjVWxxMHdZaFhDWUVEV1JXMDJUUDViQnJZc0tUR1dqbldEREoxRjd6V2FpMHpXLzJYc0N1dkJRalBGY1RZYVFYM3RTWFJTbThoc0FvRGRqQXJLL09GcDZ2Y1dZT0U3bGl6UDBZYys4cDE2aTcvTmlYSWlpUVRwN2M3WHVzOTI1VkV0bEtBalVkRmh5YWlMVDdWeERhZ3ByTUZ3aXg0d1owNXUwcWo3Y0RXRmQwVzlPWUhJdTNKYkpLTVhSSjFhWU5vdnVnZytRcVJON2ZOSFNpMjZWU2dCcG4rSmZNdVBvM2FlcVBXaWsvd0k1UnozQldhclBRWDRpNStkTTBucHdWT3NYK0tzT2hDN3ZEZytPSnN6NFE1emxuSWVmbFVXTDZRWU1iZjlXRGZMbW9zTEY0UWV2M21KaU91SGpvb3IvZE1lQnBBOWlLRGtNallCTmJSbzQxNEhDeGpzSHJCNEVYTmJIek5NREhDTHVOQkc2U2YrSjRNWi9FbFZzRFNMeGpJaUdzVFBodzhCUGp4YmZRdHNraitkeU5NS09PY1VZSVJCRUlxYmF6ejNsbWpsUlFocGx4cTY3M1ZrbE1NWTY1OTd2dStkODllYy96cTdNaTRnUXZoODdlaFlicE91WkVYajVnL1E3UzdCRkRBQUI5RHpHMzVTQzg1M3h0V1ZjblpRb0g1NGplT3FZTFI5TkR1d3hzVnRoVFY3Vjk5bi9CN0hTYkF5dGJFeVZUei81TmhKOGdHSWpHMEU1ajNncmlVTFVkNVJnN3RRUis5MGhKZ05RS1FIMmJ0YlNmUGNhVE9mSWV4YzFkYjFCeFVPaE0xdldDcExhWXVLcjNGZE5UdC9UM1BXQ3BFVVdES0V0ellyanB6bEwvd3JpM01JVEtzRnZ0RjhRVlYvTmhWbzk3YUtJQmdkbGlOYzEwZFdkWFZEcFZ0c05uKzJVSW9scmdxZFdBNEVZOHNvMFl2QjRhK2FMek1YaU1BdU9IUXJYWTB0citDTDEwSmJ2WnpnakpKdUIxY1JrZFQ3RFVxVHZuc3dWVXA1a2tVU0ZWdElJRllLMDUrdFF4VDY5OTJISE5XVmhXeFVzRDFQa2NlSXJsWHVVVlJvZ3dtZmRoeXJmNnp6YUw4K2MwTDdHWE1aT3RlQWhBVlFWd2RKaCs3bnJYN3g0TGFJSWZ6MkYydjdEZy91RGZ6MkZhKzRnRm0yekhBb3I4VXFpbUpHM1ZUSnRaRW9GWGhuRFlYdnhNSkZjNmt1MmJoYkN4emlqMno1VU51SzBqbXAxbW52a1ZOVWZSK1NFbWoxTHI5NEx5bTc1UE83RnMwTUlyM0dkc1dYUlhTZmdMVFZZMEZMcWJhOTd1MUluOE5BY1k3SUM2VGpXTGlnd0tFSW00M054VGRhVlR2OW1jS2t6dXpCa0tkOHgveHQxcC85QmJQN1d5YjRicG8xSzFnbk9wYkx2S3o1OHBXbDNCNTVSSi9aNW1SRExQdE5RZzE0amRPRXM5K2gvVjVVVnB3ckFJOGtHYlg4S1BWUERJTWZJcUtEakpEOVV5RE9QaGpaM3ZGQXllY3d5cTRha1VFOW1ET3RKRUsxaHBEeWk2QWU4N3NXQUNsWEdUaXdQd043UFhXd2p4YVI3OUFySFJJUGVZS1R1blZXMjRzUHIvM0hQejJJd0g4b0tINE9sV0VtdDRCTE02VzVnNGtNY1liTHdqMnVzb2REMTA4OHN0WkE3Vk9zVVNwRVZsNHc3Tk1iMUVVSE1SeEF4TEYwQ0lWKzBMM2laYitla0IxdlNEU0ZqQVozaGZMSmY3Z0ZhWHJPS24rbWhSK3JXdy9lVFhJY0FnbDRIdkZ1QmcxTE9tT0F3SkgzZW9WRWpqd2hlS0E0aWNiclFDbXZBdHBRMG1YRzBhZ1lwNW1qNFJiNm1kUStSVjRRQlBieE1xaDlDN284blAwV2tvMm9jbkNIZVJHaE4xWFZ5VDJiOUFDc0wrNnlsVXkreUMzUUVuYUtSSUpLOTFZdGFvU3JjV1pNTXd4dU0wRTlKNjhaK1l5akEwZzhwMVBmSEFBSVJPeTZTYTA0VlhPdVQ2QTM1MUZPV2hLZlRHc0ZKM1JUSkdXWVBvTGs1RlZLNE9hWVI5aGtKdmV6d0Y5dlFOMTEyNnI2aXNNR1hXVHFGVyszSEwzSS9qdXJsSWREV0lWdllZK3M2eXE3bHJGU1BBR1JkblU3UFZ3WS9TdldiWkdwWHp5M0JRMkxtQUpsck9OVXNaczRvR2tseTBWMjY3eGJENUtNWTh3b05Oc21XRzFWVmdMQ3JhOGFRQkJjSTREUDJCbE53eGhpQ3RIbGF6Nk9XRm9DVzB2TVIzRXJyRzdKeU1qVFNDbnZSY3NFSGdtUG53QTZpTnBKMkRyRmI0Z0xsaEtKeVpHYVdrQTk3SDZGRmR3RWNMVDZEUlFRTCsrZk9rVkM0Y1lHVzFURy8zaUs1ZFNoUlN1aUJ1bG1paHFnalI0NVZpMDNvMlJiUWJQM3N4dDkwVnhRNnZ6ZGxHZmtYbW1LbWpPaTA4MEpTSGtMbnRqdnNCSm52N2dLc2NPYVRPa0VhUlFxQW5DQTRIV3RCNFhuTXRPaHBSbUgyRkg4dFRYcklqQUdOV0VtdWRRTENrY1ZsR1RROTY1S2gwSDZpeFhiZ0ltUVA2YjQyQjQ5c081QzhwYzdpUmxneXZTWXZjbkg5RmdRM2F6TGJRRzJjVVc5NlNEb2pUUVN0eGtPSnlPdURHVEhBbm5Xa3oyOWFFd045RlQ4RUo0eWhYT2crakxUckNQS2VFb0o5YTdsRFhPakVyOEFnWDRCbW5NUTY2OG9XMHpZUHlRaVZNUHhLUkh0cGZuRUV5YUtoZHpOVlRobHh4RFFOZHJIZVppVUZiNk5vWTJLd3ZTYjdCblJjcEp5Ky9nL3pBWXgzZllTTjVRRWFWRDJZMVZzTld4QjBCU08xMk1Sc1JZOEpMZkFlelJNejVsVVJ1TFVuRzFUb0trNlEzMEZ1Z2hxV042Z0JOY0Z4UC9uWS9pditpYVVRT2ErMk51eW00Nnd0SS9EdlNmelNwMWpFaTRTZFlCRTdZaFRpVlY1Y1g5Z3dib1ZETVZnWnA1WUJRbEhPUXZhRE5mY0NvQ0p1WWhmNWt6NWt3aUlLUGp6Z3BjUkpIUGJPaEphamVvZVJMNTNjdU1haGhWOFo3SVJyNk00aFcwSnpUN216YU1VelFwbTg2Nnp3TTdDczA3ZkpZWHVXdmpBTWtiZTVPNlY0YnU3MXNPRzZKUTRvTDh6SWVYSGhlRlZhdnp4bWxJeUJrZ2M5SVpsRURwbE1Qcjh4bGN5c3M0cFZVZHdLMWU3Q0sya1RzU2RxN2c1U0hSQWwzcFlVQjlLbzRmc2g0cWxlT3lKdjF6M0tGU1RTdndFY1JPL0V3OG96RURZWlNxcGZvVlc5dWhKZllyTkFYUjBaM1ZtZW9BRCtyVld0d1AvMTNzRS8zSUNYM0hoREczQ01jNDc2ZEVFQzBLM3VtU0FENGorWlFMVmRGT3NXTDJDMVRINSs0S2lTV0grbE1pYm8rQjU1aFIzR3E0MEcxbjI1c0djTjBtRWNvVTJ3TjlGQ1Z5UUxCaFlPdTlhSFZMV2pFS3gySklVWmk1eVNvSFVBSTliOGhHemFMTXhDWkRNTGh2OE1rY3BUcUV3ejlLRkRwQ3BxUWhWbXNHUU44bTI0d3lCODJGQUtObWpnZktSc1hSbXNTRVNvdkF3WGpCSW9NS1NHNTFwNlVtOGIzaTdHSVNzN2tqVHEvUFpvaW9DZkp6ZktkSlROMFE0NWtRRVF1aDlIODhNM3lFczNEYnRSVEtBTHJhTTBZQzhsYWlNaU9PZTZBRG1UY0NpUkVlQVdaZWxCYUVYUmFTdWoybHgweEhhUllxRjY1TzBMbzVPQ0ZVMThBOGNNREU0TUxZbTl3MlFTcjlOZ1FBSWNSeFpzTnBBN1VKUjBlNzFKTCtWVStJU1dGazVJOTdscmE4dUdnN0dsUVloR2Q0R2M2cnhzTEZSaUllR080YWJQNFM0ZWtRMWZpcURDeTg3R1pIZDUyZm41YWFER3V2T21Jb2ZyenBWd012dGJyZVovODU1T2FYVFJjTmlORTB3ekdaU3hiamcyNnY4a284TDUzN3YvWENDV1AyTUZhQXJKcHZua2VwMHBBK084Nk1XalJBWlBRUmZ6blppU0lhVHBweTZtM3A2SHJOU3NZN2ZEdHo3Q2w0Vi9ESkFqUURveWlMMnV3ZjFVSFZkMkFJcnpCVVNsSmFUajRrNk5MOTdhL0dxaFdLVTlSVW1qbllLcG0ycitKWVVjcmtDdVpLdmNZdnJnOHBEb1VLUXl3WTlHRFdnMDNEVUZTaXJsVVhCUzVTV24vS0FudG5mMElkSEdMLzdtd1hxREcrTFpZamJFZFFtcVVxcTR5NTRUTm1XVVA3SWdjQXc1ODE2WUJ6d2lOSUppRTlNNGxQQ3plSS9GR0JlWXkzcDZJQW1INEFqWFhtdlE0SXkwWTgyTlRvYmNBZ2dUMkNkcXo2TXg0VGRHb3E5Zm4yZXRyV0tVTkZ5YXRBSHlkUVRWVVEyUzVPV1ZVbHVnY052b1VybEE4Y0pKejlNcU9hL1czaVZubzR6REhmRTd6aG9ZNWY1bFJUVlpEaHJRYlI4TFM0ZVJMejhpUE15Qkw2bzRQaUxscDg5Rmpkb2tRTGFTQm1LSFV3V3AwbmE1ZkUzdjl6bnkyWWNEWEcvamZJOXNjdHVsSFJiZGtJNWE0R09QSng0b0FKUXpWWi95WUFhZG84S05aVWRFRnM5WlBpQnNhdXNvdFhNTmViRWdyMGR5b3B1cWZTY0ZKM09ETlBIZ2NsQUNQZGNjd3YwWUpHUWRzTjJsaG9WNEhWR0J4Y0VVZVVYL2FscjRucXBjYzFDQ1IzdlI3ZzQwenRlUWcvSnZXbUZsVUU0bUFpVHBIbFlHckI3dytVMktkU3dRejJRSktCZS81ZWlpeFdpcG1mUDE1QUZXcks4U2gxR0JCWUxnemtpMXdUTWhHUW1hZ1hxSjIrRnVxSjhmMFh6WENWSkZIUWRNQXc4eGNvMTFIaE0zNDdhbHJBdSt3bVgzcERGQUJPdmtDK1dQWDBVaGcxWjVNVkhLTlJPeGFSODRZVjNzMTJVY00rNzBjSjQ2MFN6RWFLTHloNDcydk9NRDNYbmFLN3p4WmNYbFdxZW5FdmNqbWdHTlIyT0tiSTFzOFUraXdpVytIb3RIYWxwM2UxTUdEeTZCTVZJdmFqbkF6a0ZIYmVWc2dqbUpVa3JQOU9Bd25FSFlYVkJxWXgzcTdMdlhqb1ZSMG1ZOGgrWmFPbmgwNTNwZHNHa21icWh5cnlOMDFlVkh5U3IrQ2tEWWtTTWVaMXhqUE5WTStnVkxUREt1MlZHc01VSnFXTzRUd1BEUDBWT2cyLzhJVGJBVWFNR2I0TGpMN0wrUGkxMWxFVk1YVFlJbEFaL1FIbVRFTmp5eDNrRGtCZGZjdnZRdDZ0S2s2allGTTRFRzVVWERUYUY1KzFaalJ6Nlc3TWRKUEMrd1RrYkRVaW00cDVRUUgzYjlrR2syQmtpbHlldXI4QmMyMHdtNXVKU0JPOTVHZllESTFFWmlwb1JhSDd1VnZlbmVxejQzdGxUWkdSUTRhN0NObU1IZ1h5T1FRT0w2V1FrZ01VVFFEVDh2aDIxYVNkejdFUmlaVDFqSzlGK3Y2d2dGdnVFbUduZ1N2SVVSMkNKa2M1dHgxUXlnZlpuQXJ1T05vYkIxaWRDTEIxRkNmTzdOMVpkUm9jVDgvV3llK0VuRGlPOXB6cUlwbkxEbDRia2FSS1crZWtCVndIbjQ2U2h3MVgwdGNsdC8wUk9panVVQjRrSUluclZKVTRidVdmNFlJVEp0ak9KNmlLZHIxdStmbGdRZUZINzBHeEtqaGRndC9NcndmQjRLL3NYY3pRKzl6WWNyRDRkaFk2cVpoWjAxMHJyeGdnV0E4SmFaeWcycFlpajhpZVlFZzFhWkprWks5TzFSZTdzQjBpb3VmNjBySzBHZCtBWWxwN3NvcUNCQ0RHd2ZLZVVRaENCbjBFMG8wR1M2UGRtakxpMFR0Q1laZXFhenF3Tit5TklOSUE4TGszaVBEbldVaUlQTEdOY0htWkR4ZmVLMGlBZHhtL1Q3TG5OK2dlbVJMNjFoSEljME5DQVphaVlKUitPSG5MV1NlOHNMcks5MDVCNWVFSkhObFdxNFJtRVhJYUZUbW80OWY4dzYxK053ZkVVeXVKQXdWcVpDTEZjeUhCS0FjSVZqM3NOemZFT1h6VktJbmR4SHcrQVI5M293aGJDeFVaZjZHczhjejYvMVZkckZFUHJ2MzMwKzlzNkJ0TVZQSjN6bC9VZjlyVWkwWi9vcGV4ZmRMM3lrRjc2ZTk5OUdQZlZ2OGZKdi9ZLysvNWhFTW9uMXRxTkZ5VlJldlY5eTkvdUl2c0czZGJCOEdSUnJnYUVYZmh4KzJ4ZU9GdCtjRW4zUlphbk54ZEVlMitCNk1IcE5iclJFNTNQbERpZlB2RmNwNGtPNzhJTFIwVDR4eVcvV0dQeUJzcUdkb0E3ekpKQ3UxVEtiR2ZobnFnblJieGJCMkIzVVpvZVEyYnoyc1RWblV3b2tUY1RVMjFSeE4xUFlQUzNTYXI3VDBlUklzeUNOb3dyOWFtd29NVS9vZDlzMkFQdGlLTkw2RU5PbHlLQURzdEFFV0tBK3NkS0Rocko2Qk9oUkptWitRSmJBYVozLzVGcTAvbHVtQ2dFekdFYnUzeWkwWTRJNEVnVkFqcXhoNEhidVFuMEdyUmhPV3lBZnNnbFFKQVZMMXkvNnllelMyazhSRTJNc3RKTGg5Mk5PQjNHQ1lnRlh6bkY0ZDI1cWlQNFpDeUk0UllHZXN1dDZGWEs2R3dQcEtLOFdIRWtoWXVpMEF5RW1yNU1sM3VCRnRQRmRuaW9JOFJpQ29vYTdaMUcxV3V5SWkzblNOZ2x1dGMreFk4QmtlVzNKSlhQSzZqZDJWSU1wYVN4cFZ0RnErUit5U0s5SjZXRzVRdnQrQytRSDFoeVlVT1ZLNzg1N25GbXlEQllnWi9vK0FuaWJ6TlZxeVlDSlF2eURYRFRLK2lYZGtBNzFiWTdUTDNidnVMeExCUThrYlR2VEVZOWFxa1EzK01pTFdiRWdqTHpPSCtsWGdjbzFFUmd6ZDgwckRDeW1scGFSUWJPWW5LRy9PRG9GbDQ2bHpUMGNqTTVGWVZ2djBxTFViRDVseUp0TVVhQzFwRmxUa05PTng2bGxpYVg5bzBpLzF2d3M1Yk5LbjVPdUVOUUVLbUxsY1A0bzJabUpqRDR6emQzRmszMnVRNHVSV2tQU1VxYjRMQmUzRVhIZE9STkIyQldzd3M1ZGFSbk1mTlZYN2lzUFNiMWhNUWRBSmkxL3FtRE1mUlVsQ1U3NHBtbnpqYlhmTDhQVkc4TnNXNklRTTJOZTIzaUNQSXByeUpqWWJWbm01aEN2S3BNYTdITFZpTmlOYyt4VGZESWFLbTNqY3RWaUQ4QTFNOVlQSk5rMDAzVlZyNFpvMk11R1c4dmlsOFNMYUdwUFhxRzdJNERMZHRsOGE0UmJ4MUx0NHc1SHVxYWExWHpaQnRqMjA4RUpWR2NtS1lFdWFlTjI3elQ5RUU2YTA5SmVyWGRFYnBhTmdOcVlKZGhQMU5kcWlQS3NiRFJVaTg2WHZ2TkM3ck1FNW1yU1F0cnpBWlZuZHRTakNNcWQ4Qm1hZUdSNGw0WUZVTEdSQmVYSVY5WTR5eExGZHlvVU5waXkySWhlUFNXekJvZllQUDBlSWEycTVKUDRqOUc4YXQvQXFvU3NMQVV1Ulh0dmdzcVgvell3c0Urb2Y2b1NEYlVPbzRSTUp3K0RPVVRKcStobnF3S2ltOVl5L25hcHlaTlRjMnJDcTZWOWpIdEpieEdQRHdseldqL1NrM3pGL0JIT2xUL2ZTalNxN0ZxbFBJMXE2SitydThBa3UwMDhTRklOWFpmT2ZuWk5PdkdQTXRFbW4yZ0xQdCtINFFMQSsvU1llNGozOThhdXpoS0lwMlBvazNtUEM1cTFJTjFIZ1IrbW5FZmM0TmVlSFl3ZDIva3BzelIzY0JuN25pOU5iSXFodFNXRlc4eGJVSnVVUFZPZWVYdTNqMElHWm1GTml3YU5aNnJINC96UTJPRHo2dEZ4UkxzVVladTFiZmQxdUl2ZlFEdDRZRC9lZktZdjhWRjhiSEdEZ0syMncyV3F3cGk0M3ZOQ09YRkpaQ0dNcVdpUGJMOG1pbDZ0c21PVFhBV0N5TUN3NzNlMnJBRFpqMklLNnJxa3NNM0VYRjJjYkxiNHZqQjE0d2EveVhLNXZ3VSswNU16RVJKNW5Yc1hzVzIxbzdNK2dPMGpzMk95S2NpUDV1RjJpWHliMkRpcHR3UWVIZXF5Z2tyTnNxVkNTbGxkeEJNcHdIaTF2ZmM4UktwUC80TDNMbXBxNkRaY3ZoRERmeFRDRTNzcGxhY1RjT3RYZEsyZzMwM2RJV0JWZTJ3RC9HdmphMWNDbEZRNjdndzB0MVpVdHRzVWdRMVZla3k4b09wUzZrc1lFYzRicXNlQ2JaeTc2NlN2TDNGb2RtbmFobFdKUmdWQ05qUHhoTC9mazJ3eXZsS2hJVEgvVlFDaXBPSTBkTmNSYTVCMU01SG1PQmpUTGVaUUp5MjM3ZTJtb2J3bUR5Sk5IZVBoZERtaWtudkxLYURiU2hMK0lzMVhUQ0p1TFFkMndtZEpMNyttS3ZzMjk0d2hYUUQrdnRkODhLS2swRFhQOEIxWHU5Sit4bzY5Vk91RmdleGdUcmN2STZTeWx0dUxpeDlPUHVFNi9pUkpZb0JNRVh4VTRzaFFNZjRGanF3ZjFQdG5KL3dXU1pkMjlyaFpqUm1UR2dpR1RBVVFxUnorbkNkamVNZlloc0JENUx2NjBLSUxXRXZORUhmbXNEczJMMEEyNTIzNTFlVW9ZeEF5c1ZhQ0pWTGRIOVFGV0FtcUpEQ09EVWNkb28xMitnZDZiVzJib1kwcEJWSFdMNkxRREs1YllXaDFWOHZGdmkwY1JwZnd2N2NKaU1YM0FaTkp1VGRkSGVoVElkVTBZUS9zUTFkTG9GMnhRUGNDdUhLaXVDV09ZMzBESGUxT3djQ2xMQWhxQUt5cWxuSWJILzh1OVNjSnBjUzRrZ3A2SEtEVWRpT2dSYVJHU2lVQ1JCanpJNWdTa3NNWktxeTdTZDUxYWVnMHRnSit4MFRIOVlIMk1nc2FwOU43RU5aZEVCMGJleTJETVRyQkExaG41NlNFck5IZjN0S3RxeUw5YjZ5WEVQOTcvcmMramdEMk4xTE5VSDZSTTlBelAza1NpcHIwNlJrS09vbFI3SE83NjhqaldpSDFYOTJqQTdka2c3Z2NOY2pxc1pDZ2ZxV3cwdFBYZExnMjBjRjZ2blF5cGc3Z0x0a2F6ckhBb2R5WWZFTlBRWnNkZm5qTVppTnU0bkpPOTdEMS9zUUUrM3ZORnpyU0RPS3cra2VMRUNZZjdSSndWSGVQL2o3OTgzM29aMGVnb25ZQjJGbEZFNXFqMDJCL0xWT01KUWxzQjh1TmczTGVnNHF0WndudHNPU05pZFIwYWJiWm1BSzRzQ3p2dDhZaXV6MnlyTkNKb0g1TzhYdlgvdkxlUi9CQllUV2owc09QWU0vanl4UmQ1Ky9KemlLQUFCYVBjdy8zNFVBM2FqL2dMWnhaZ1JDV042bTRtM2RlbWFuTmdzeDBQMjM3L1ErRXc1VlluSlBreUNZMGNJVkhvRm4yQXkvZTdVNFAxOUFQYlBGWEVIWDk0TjZLaEVNUEc3aXdCMytJK08xamQ1bjZWU2dIZWd4Z2FTYXdPNmlRQ1lGZ0RzUFNNc05PY1VqNHEzc0Y2S3pHYUgvMHU1UFFvQWovOHpxNlVjOU1vTnJHcWhZZWIyalFvMFdsR2xYanh0YW5aTFMyNC9PSU41R3gvMmc2ODRCUERRcHdscW5rRmN4cG1QL29zbk9YckZ1dTRQcWlmb3VRSDBlRjVxQ2t2SVRRYkp3L1p2eTVtQUhXQzlvVStjVGlZaEptU2ZLc0N5dDFjR1Z4aXNLdStOeW1FUUlBeWFDZ3VkL1YwOXFUM25rLzlzL1NXc1l0aGE3eU5wekJJTU00MHJDU0dhSjl1NmxFa2wwMHZYQmlFdDdwOVA1SUJDaWF2eW5FT3Y3RmdMcVBkZXF4UmlDd3VGVk1vbFNJVUJjb3lmVUMyZTJGSlNBVWdZZFZHRmYwYjBLbjJFWmxLOTd5eXhyVDJNVmd2dFJpa2ZkYUFXOFJ3RUVmTitCNy9lSzhiQmRwN1VScGJxbjF4Y3JDNmQyVWpkc0tiekNqQkZxa0trb1p0N01yaGc2WWFnRTdzcGtxajBqT3JXTStVR1EwTVVsRzJldlAxdUUxcDJ4U3Y0ZE1LMGRuYTZFTmNOVUYreGthSjdCNzY0TmR4TENwdXZoYmxsdFZSQWY3dks1cVB0dEovOVJZRlVVU0djTGRpYm56Nm1mN1drUE8zTWtVVWhSMm1BT3VHdjhJV3c1WEcxWnZvVk1ualNBWmU2VDdXWUE5OUdFTnhvSGtNaUt4SGxDdUs1R2QwSU5ySVNJbUhRclFtdjZGNG1xVS9UVFE4bkhNRHpDUml2S3lTUThkcWtwUWduVU1ud0lrYUF1YzYvRkdxMWh3M2IyU2JhMzk4QmhVd1VaU0FJTzhYWnZudUxkWTJuNmhPWHdzK2dxOUJIVUtjS0ZBNmt6NkZEbnB4TFBJQ2EzcUdobmM5N2JvMUZUL1hKazQ4THJrSEoyQ0F0QnYwUnROOTdOMjFwbGZwWEh2WjhnTUpiN1pjNGNmSTZNYlB3c1c3QWlsQ1NYTUZJRVVFbWlyOFhMRWtsQTB6dFliR3BUVEdxdHRwNWhwRlRUSXFVeWFBSXF2TVQ5QS94K0ppNWVqQTRCaHhiL2NsMXBVZE9ENmVwZDN5aWxJZE82ajI5N3hJbm9pQlB1RURXMi9VZnNsRHloR2tRczdXeTI1M2JWbmxUK1NXZzg5ellJSy85S1hGbDVmZStqb3cycmQ1Rlh2OHpEUHJtZk1YaVVQdDlRQk8vaUs0UUdiWDVqLzdSeDFjMXZ6c1k4T05iUDNsVklhUHJoTDQrMVFyRUNUTjNueUthdkdHMGdCQnRIdlRLaEdvQkhnTVhIU3RGb3dOK0hLclByaVl1K09aMDVGcm44b2tRclBhYXhvS1AxVUxDUy9jbUtGTjNnY0g3SFFsVmpyYUNlUW10amcxcFNReGV1cVhpU0tnTHB4Yy8xT2lac1U0K240bHo0aHBhaEd5V0JVUkxpNDY0Mm4xZ245cXo5YklzYUNlRVBKMHVKbWVuTVdwMnRKbUl3TFE2VlNnRFlFck9lQkNmU2o5UDRHL3ZJN29JRitsL241ZnA5NTZRZ3hHdnVyNzd5bmF3QXUzRzlNZEZiSmJ1NDlOWm5Xbm5GY1FIanhSdWhVWXZnMVUvZTg0TjRKVGVjY2lEQUtiL0tZSUZYemxveXVFMWVZWGY1NE1taGpUcTdCL3lCVG9EenpweDN0SkNUbzNIQ21WUFlmbXRCUmUzbVBZRUUvNlJsVEl4YmY0ZlNPY2FLRkdrNGdiYVVXZTQ0aFZrOVNaemhXODB5Zlc1UVdCSHhtdFV6dk1oZlZRbGk0Z1pUa3RJT1pkOW1qSjVoc2JtenR0YUhRQjI5QW0zZFprbXgzZy9xdllvY3loWjJQWEFXc05RaUlhZitROFcvTVdQSUs3L1RqdkN4NXEyWFJwNGxWV3lkTWMyd0lRa2hhZERCMHhzbncva1NFeUdqTEtqSTRjb1ZJd3R1YlRGM0U3TUo2TFM2VU9zSktqODJYVkFWUEpKY2VwZmV3YnpFOTFpdlhadk92WWZzbU1ldnd0UHBmTXpHbUM3V0pseVcyajBqaDdBRjFKTG13RUpTS1l3SXZ1NkRIYzNZbnlMSDlaZElCblErbk9WRFJpUCtSRXBxdisrdHlwWUhJdm9KeUlDR0E0MGQ4YlI3SFIyazdkbzZVUVRIRjRvcmlZZUlRYnhLZTRUaDYrL2wxQmpVdFM5aHFPUmgzTWJndllyU3RYVGZTd2FCT21BVlFaenBZTnFzQW1ReWpZNTZNVXF0eTNjL3hINkd1aE52TmFHOXZHYkc2Y1B0Qk04VUEzZThyNTFEMEFSOWtvekt1R0dTTWdMejNuQUh4RE5uYzdHVHdwTGo3LzZIZVdwMWlrc0RlVGp3Q0xweGVqdU10cE1uR0pnc2lrdTFzT0FDd1E5dWt6RVNpRFJONzdZTkVTeFI1THBoT2xjQVNYQTV1SXRzMUxuQkljbjFKN0JMV3M0OURNQUxTbnV6OTVnZE9yVFpyMHUxU2VZSGlubm8vcEU1OHhZb1hiVk8vUytGRU1NczVxeVdrTW5wOFEzQ2x5VGxaUDUyWTlucTdiOGZJVFB1VlhVazlvaEc1RUZIdzRnQUVjakZ4ZktiM3h1QXNFangyejF3eE5iU1pNY2dTOUdLeVczUjZLd0pPTmd0QTY0TFR5eFdtOEJ2dWRwME0xRmRKUEVHb3BNNEZ2ZzdHL2hzcHRraENmSEZlZ3Y0RU53eFBlWG1ZaHh3Wnk3anMrQmVNMjd0OU9EQk15blZDTEo3UldjQk10ZVpKdHZqT1lIYjVsT25DTFlXTkVNS0M1OUJBN2NvdnUxY0FOYTJQWEwwNWlHZHVmT3prZ0ZxcUhCT3JnUVZVbUxFYytNa3o0UnE4TzZXa05yN2F0TmtINE04ZCtTRDF0L3RTenQzb0ZxbCtuZVZzK0F3RUk1SmFCSmF4QVJ0WTJaNG1Lb1VxeGRzNFVwWjBzdjN6SWJOb28wSjRmaWhsZFFUWDNYTmN1TmNabWNyQjVMVFdNZHplUnVBdEJrM2NaSFlRRjZnVGkzUE51REowbm1SKzRMUExvSHZ4UUl4UmdKOWlOTlhxZjJTWUpoY3ZDdEppVldvODVUc3lGT3VxN0V5QlBKckFkaEVnRTBjVHExNkZRWGhZUEpGcVNmaVZuMElRblBPeTBMYlU0QmVHOTRRamRZTkIwQ2lRM1FheFFxRDJlYlNNaU5qYVZhdzhXYU00WjVXbnpjVkRzcjRlR3dlU0xhMkRFM0JXVmlheGhaRkljU1RqZ3hOQ0FmZWxnK2h6blZPWW9lNVZxVFlzMWc3V3RmVG0zZTQvV2R1QzZwK3FxQU04SDRaeXJKQ0dwZXdUaFREUGU2SDdDelgvelE4VG0rcjY1SGVabitNc214VWNpRVdQbEFWYUsvVkJhUUJXZm9HL2FSTC9qU1pJUWZlcC84OUdqYXNXbWJhV3plRVoyUjFGT2p2eUpUMzdPOUI4MDQ2U1JTS1ZFblhXbEJxYmtiNVhDUzNxRmV1RTl4YjkrZnJFa254V0I1aDFEL2hydXoyaVZERUFTNytxa0V6NU90NWFnSEpjN1dDZFk5NFdzNjFzVVJjWDVuRzhVRUxHQkFIWjNpKzNWdWxBeVQwbktOTno0SzJMQkhCV0pjVEJYMXd6ZisvL3Uvai85Ky8vdjg3KzkvbDlMYmgvTC91eU5ZaVRzV1YyTHdzamFBNk14VHV6Rk1xbXhXOEp3LytJcHBkWDh0L0NsZ2kxckkxU04wVUMvcjZ0WC80bFVjMlZWMU9RUmVTZUNzalVwS1pjaHc0WFVjakhmdzZyeUNWM1I4czZWWG02N3ZwNG4rbGNQVjlnSndtYktRRXNtckppOWMydmt3cm04SEZiVllOVGFSR3E4RDkxdDluNStVK2FEL2hOdE4zSGpDL25DL3ZVb0dGU0NrWFArTmxSY21MVXFMYmlVQmw0TFlmMVUvQ0N2d3RkM3J5Q0g4Z1VtR0lUQXhpSDFPNXJuR1R6N3kxTHVGam1uRkdRMVVXdU03SHdmWHRXbDJmUEZLa2xZd05VcEYySUwvVG1hUkVUalFpTTVTSmFjSSszR3Y1TUJVOGxQNUlvNmdXa2F3cHl6TkVWR3FPZHg0WWxPMWRDdmpiV0ZaV2JDbWVpRktQU2xNS3RLY01GTHMvS1F4dGdBSGk3TlpOQ1EzMmJCQVcybWJIZmxWWjh3WEtpMUpLVkhrVzIwYm5ZbmwzZEtXSmVXSk9pWDNvS1BCRDZaYmkwWnZTSXVXa3RVSEI4cURSOERNTWgxWmZrQkw5RlM5eDVyMGhCR0xKOHBVQ0p2M05ZSCtBZThwNDBtWldkNW01ZmhvYkZqUWVRdnFUVDRWS1dJWWZSTDB0ZmFYS2lWbDc1aEhSZXVUSkVjcVZsdWcrZU9JSWM0YmRJeWR0bjJLMGlOWlBzWVdRdlFpbzJxYk8zT3FBbFBIRERPQjdEZmpHRWZWRjUxRnFxTmFjZDZRbWdGS0pwTWZMcDVESFR2NHdYbE9OS1ZYRjl6VEpwRFY0bTFzWVpxSlBob3Rjc2xpWk04eWtzS2tDa3pwaVh0K0VjUlF2U1FxbUJTOVdkV2t4TVRKWFBTdzk0anFJM3ZhckNqUXhUYXpqbE1IOGpUUzhpbGFXODAxNC92d0EvTE5hK1lpRm95eXgzcy9Lc3dQM084UVcxanRxNDV5VE0vRFg5YThNNHZvVFZhTzJlYnZ3MUVvb0R3L3lnNlkxZmFZK1d3cmRWczVZdDBoUTVFd1JmWVhTRnhyYXkxWXZTTStrWW1scExHMi85bW0xTWZtYktIWHI0NEloOG5WS2IxTTUzN1pBTlVrQ3Rkc1BaODBKVktWS2FiVkhDYWRhTFhnK0lWOGk1R1N3cFp0aTBoNmRpVGFLczlzZHBVS0VwZDdqRFVwWW1IdGlYMzNTS2lPM3R1eWRrYXhBN3BFYzlYSVFFT2ZXSmxzemo1WXBMNWJLZVF5VDdhWlNCT2FtdlNIbDh4c1d2Z28yNklQL2JxayswRUpVeitna2tjdmxVbHlQcDJrZEtGdHQ3eTVhQ2RrczlaSkpjRnA1WldlYVdLZ3RuWE1OM09Sd0dMQkUwUHRrRUllazVGWTJhVnNzVVpIdHNXSXZubGpNVkp0dVZJanBadXAvNVZMMXlQT0hXV0hrT01jNll5U1dNY2tjekQ1alVqMm1sTFZxdUZhTVU4bGVHVmFxZVhpcythUlJMOHptNFd1Qms2Y3lXZkdNeGd0cjh1c2VRRXg3ay9QdlJvWnlkOW5kZTFHVUNWODRnTVg4T2d1L0JXZXpZUFNSMjdsbHpRbkE5N29vMHBZeXhvYllVSmZzait5c1RtOXpKK1M0cGswVEdvOVZURzBLanFZaFRtQUxmb0RaVktsYTJiNXlodjI0MVB4RmFMSnMzaTA1SzBBQUlkY0d4Q0pabVQzWmRUN0NsaVI3cStrdXI3V2RRanlnWXRPV1JMOUI4RTRzNExJOEtwQWo3YkUwZGc3RExPYVgrTUdlQWkwaE1NU1NXWkV6K1J1ZFhiWkNzR1lTMFFxaVhqSDlYUWJkOHNDQituSVZUcTcvVC9GRFMreldZOXE3WjJmZHExdGRMYjZ2M2hLS1ZEQXc1Z2pqNm85cjF3SEZST2RIYzE4TUpwNFNKMlVjdnUraVE5RWdrZWtXOFZDTStwc002eSsvMlNCeTh0Tk40YTNMMU16UCtPTHN5dkVTbzVnUzdJUU9uSXFNbXZpSkJWYzZ6YlZHMW44ZVhpQTNqNDZrbXZ2dEpsZXd3TkRyeGs0U2JKT3RQL1RWL2xJVks5dWVTaE5iYk1IZnduTFRMTGhiWnVPNzllYzVYdmZnUndMRksrdzFyNVpXVzE1clZGWnJFK3dLcU5SdjVLcXNMTmZwR2dub1VVNlk3MU54RW1ON015cXdxQVFxb0lVTE93L0xidVVCMit1RTc1Z0p0K2txMXFZNExveFYrcVIvemFsdXBlYTNENStXTWVhUkluMHNBSTZERFdEaDE1OGZxVWI0WWhBeGhSRWJVTjBxeXlKWWtCVTRWMktBUlhEVDY1Z1czZ1JzaXY3eFNQWUVLTHd6Z3JpV2NXZ1ByMHNiWm52N20xWEhORlc2eFBkR05aVWR4RmlVWWxtWE5qRFZXdXU3TENrWC9uVmtyWGFKaGlZa3RCSVNDMnhnQlhRbk5FUCtjcHRXbDFlRzYyYTdDUFhybnJrVFE1QlFBU2JFcVVaV01EaVpVaXNLeUhEZUxGT2FKSUxVbzVmNmlEdDRaTzhNbHFhS0x0bzBBbVRIVlZia0d1eVBhMVIveXdac1dSb1JEb1JkTk1NSHdZVHNrbE1WbmxBZDJTMDI4MmJnTUk4ZmlKcERoNjlPU0w2SzNxYm8yMEtmcE5NdXJuWUdRU3Ivc3RGcVo3aFlzeEtsTG5LQUtoc21COEFJcEVRNGJkL05yVExUWGVmc0U2Q2hSbUtXalhLVmdwR29QczhHQWljZ0tWdzRLMHFnRGd5MUE2aEZxMVdSYXQzZkhGK0ZrVStiNkg0TldwT1UzS1hUeHJJYjJxU0hBYitxaG04aGlTUk9pLzlvZmFwanhoeUt4eG50UHBnZTZLTDVaNCtXQk1Za0FjRTYrMEhkM1loMnpCc0syTVYzaVcwWTZjdk9Dcm9YbFJiMk1NSnRkV3grM2RrRnpHaDJQZTNEWjlRcFNxcGFSL3JFMUltT3JIcVlZeWNjcGlMQzIyYW1KSWpSV1ZBaGVyVGZwUUxtbzYvSzJwbmE4NUdyRHVRUGxIMVRzYXI4aXNBSmJYTGFmU3dPb2Y0Z2c5UmtBR20vb1lwQlFRaVBVb3lEazJCQ1ExaytLSUxxNDhFckZvNFdTUmhITHEveTdtZ3czK0w4NVBwUDZ4V3I2Y2dwOXNPallqS2FnT3J4RjE0OHVodWFXdGpldDk1M2ZoMUlRaUV6Z0MrZDJJZ0JDY1VacWdUQUlDbTJiUjhvQ2pETEJzbWcrVGh5aGZEK3pCYWxzS0JZMUNlNTRZL3Q5Y3dmYkx1OVNGd0VncGhmb3BOQTN5TnhneURhZlVNM21ZVG92Wk5nUEdkZDRaRkZPajF2dGZGVzN1N04raUhFTjFIa2Vlc0RNWEtQeW9DRENHVk1vNEdDQ0Q2UEJoUTNkUlpJSHkwWS8zTWFFNXpVOW1UQ3J3d25ab2p0RStxTnBNU2tKU3BtR2UwRXpMeUZlbE1KcWhmRlE3YTUwdVh4WjhwQ2Myd3h0QUtXZ0hvZWFtUjJPN1IrYnE3SWJQWUl0TzBlc2RSZ29UYVkzOGhaTEo1eTAyb0lWd29Qb2tHSXp4QU1EdWFuUTF2bjJXRFEwMFJoNm81UU9hQ1J1OTlmd0RiUWNOMFhBdXFrRnB4VC9jZnozc2xHUlZva3JOVTBpcWlNQUpGRWJLU2NaZG1Ta1RVem5DMFUrTWZ3Rk9HZExnc2V3UnlQS3dCWllTbXk2VTMyNWlVaEJRTnhiQUMzRkxLRFY5VlNPdVFwT091a0ovR0FtdS90eUViWDlEZ0VwNmR2MXpvVTBJcXpwRzZnc3NTaklZUlZQR2dVMVFBUVlSZ0lUOGdFVjBFWHIxc3FlaDJJNnJYanRtb0NZeUVEQ2UvUGtGRWkvUTQ4RnVUMjlwNTU3aU4rTEN3azVDSy9DWjJXZEFkZlFaaDJaOVFHcnpQTFNOUmo1aWdVV3psOVZpMHJDcUg4RzFLcDRRTUxrdXdNQ0F5cGR2aURYeU9JazBBSFRNOEhCWUtoM2IwL0YrRHhvTmo0WmRvWmZDcFFWZG5aYXJxb01hSFduTUxOVmN5ZXZ5dEdzclhRRW9JYnVicVdZTm83TlJIemRjMHp2VDIxZldWaXJqN2czNml5NnB4b2dmdmdIcDF4SDFUdXJiejhReXlIblhlQkppY3BZVWN0YnpBcHd6WjFIVCtGUEVYTUFnVVpldGdlR013dDRHK0RIaURUMkx1K1BUMjFmakpDQWZWMTZhL1d1MVBxT2tVSFNUS1loV1c2UGhoSFVsTnRXekZuQTdNYlkrcjY0dmt3ZHBmTkIySmZXZ1dYQXZremQ0Mks0bE45eDdXcmc0a0lLZ1hDYjRtY1c1OTVNQ1BKL2NUZlBBTVFNRld3bnF3ZGU0dzhIWllKRnBRd2NTTWhqVno0QjhwNm5jU0NOMVg0a2x4b0lINEJOMko2dGFCTWo2bEhrQU9zOEpKQW1YcTV4c1F0clBJUElJcC9IRzZpMjF4TUdjRmdxRFhTUkYweFFnMTRkMnV5NkhnS0UxM0xTdlFlNTJvU2hGNUp4MVI2YXZ5TDR0aGhYUVpIZkM5NG9aenVQVUJLRllmMVZ2RGF4SXJ0VjZkTkdTeDdETzBpMXA2Q3pCa3VBbUVxeVdjZVFZN0Y5K1UwT2JZRHpvYTFpS2FvL2NPRC92NlE5Z0hycnIxdUNlT2s4ZlNUOU1HMjNVbDBLbU0zcitXbjZIaTZXQWNMN2dFZWF5a2ljdmdqemtqU3dGc0FYSVI4MVp4NFFKNm9vc1Z5SmtDY1QrNHhBbGRDY2locXZUZjk0SEhVUFhZcDNSRUlhUjRkaHBRRjYrRksxSDBpOWk3UHZoOG93dTNsTzRQVDFpdXF1K0RrTDJCajkra2RmR0FnMlRYdzAzaU5IeW9ieG9mTEUyaWJqc1lEUGdlRVFsUk1SN2FmWGJTR1FjblBqSTJEK3NkdG11UTc3MWRiQVNVc0RuZFU3dDU4anJyTkdSeklTdndpb0FsSHM1RkErY0JFNUNjem5rZDhOTVY2QlI2a3NuS0xQWm5NVWF3UkRVMU1aL2liM3hDZGtUYmxIS3U0YmxOaXlsSDVuMjEzeU0wenViRWllMG80Smh6Y2ZBeTNINXFoMmwxN3VMb29CTkxhTytnem9uVEgydUY4UFF1OUV5SCtwakdzQUNUTXk0Y0h6c1BkeW1VU1hZSk9NUDN5VGtYcXZPL2xwdnQwY1g1ZWtERXU5UFVmQmVaT0RrRnVBalhDYUdkaTZldzRxeEo4UG1GZndtUHBrZ1FqUWxXcW9tRlk2VWtqbWNuQXRKRzc1RVZSK05wekdwUDFFZjVxVVViZm93ckMzemNTTFgzQnhnV0VnRXgvdjljUDhIOHUxTXZ0OS9yTURZZjZzandVMXhTT1BCZ3pGRWVKTE1SVkZ0S281UUhzVVlUOFpSTENhaDI3NTk5RXVxb0M5UFlqWU82YW9BTUhCOFgxT0h3RUFZb3VIZkhCM255YjJCK1NuWnhNL3Z3L2JDdE9SakxNU3k1YVpvRXB2Z2RHdmxKZk5QRlV1L3A3WjRWVksxaGlJMC9VVHVCM1pQcTRvaEVibTdNbnRnYzFldkV0a25hb3NnWlN3bkRDMkJkTW1pYnBlZzQ4WDhJeGwrLzgreFhkYnNoUVhVUFB2eDhqVDNma0VMaXZIU21xYmhibGZORlNoV0F5UW5KM1dCVTZTTVlTSXBURG1IamRMVkFkbEFEZHo5Z0NwbFp3Nm1UaUhxRHdJc3hibTlFckd1c2lWcGcydzhRM2toS1YvUjlPajhQRmVGNDNobVcvblNkOTluWnpoeWpDWDNRT1pra0I2QnNINEg4NjZXR3l2OUUwaFZBelBZYWgydGtSZlFaTW1QMnJpbmZPZVFhbGdlMG92aGR1QmpKczlhMUdCd1JlZXJjZWlmeTQ5Y3RPaDUvNjVBVFl1TXNBa1ZsdG12VExCazRvSHBkbDZpK3A4RG9OajRGYjJ2aGRGWWVyMkpTRWlsRXdQZDVuNXpOb0dCWEVqcmVnL3doMk5Gbk5SYUlVSFNPWGE0ZUpSd3lnWm9YNnZuV25xVmRDUlQxQVJ4ZUZyTkJKK3RzZG9vTXdxblloRTd6SXhuRDhwWkgrUDBOdTF3V3hDUFRBRGZOV21xeDYyNklCSkpxNk5lYXBjR2VPbWJ0WHZsMFRlV0cwWTdPR0dWNCtFSFR0TkJJVDVXZDBCdWpsN2luWGdaZ2ZYVE01ZWZEM3FEVEo1NE85djNCa3YrdGRJUmxxMWtYY1ZEMEJFTWlybUZ4Z2xOUHQ1cGVkYjFBbnh1Q1lNQ2hVeWt3c1RJV3FUMjNYRHB2VGlLRXJ1MWNUY0VNZW5pQitIUURlaHhQWE5ta290RmR3VVBuaWxCL3U0Tng1WGM2bDhKOWpIMUVnS1pVVXQ4dDhjeW9abGVEQkV0OG9pYkRtSlJBb01LSjVPZTlDU1dTNVpNRUp2YWNzR1ZkWERXanAvWXBlNXgwcDlQWEIyUEF3dDJMUkQzZCtmdE5ncHV5dnhsUDhwQjg0b0IxaTczdkFWcHd5cm1YVzcyaGZXNkR6bjlKa2o0KyswVlE0ZDBLU3gxQXNEQTRPdFhYRG82My93K0dEK3pDN3c1U0pheHNtbmxZUlE0ZGdkakE3dFRsMktOTG5wSittdmtvRHh0dDFhNG9QYVgzRVZxajk2bzlzUktCUXFVN1pPaXVwZUFJeUxNRCtZM1l3SHgzMFhXSEI1Q1FpdzdxM21qMUVEbFAyZUJzWmJ6NzlheVVNYnlIUTdzOGd1NExnaXAxTGlHSmo3TlFqOTA1LytyZ1VZS0FBNXFkcmxIS0lrbldtcWZ1UitQQjhSZEJrRGcvTmdubFQ4OUc3MmgyTnZ5U25qN1V5QndEK21pL0lXczF4V2J4dVZ3VUlWWHVuNWNNcUJ0RmJyY2NJK0RJTGpzVlFnNmVlcTBpdGlSZmVkbjg5Q3Z5RnRwa3hhYXVFdlNBTnVabUIxcDhGR1BiVTk0SjltZWR3c1o5SGtVWWptSTdPSDVIdXhlbmRMYnhUYVlyUHVJZkUyZmZYRktob05CVXAzM0hzRkFYbUNWL1Z4cHE1QVlnRm9ScjVBeTkzWkxSbGdhSVBqaFpqWFpaQ2hUK2FFNWlXQVhNWDBvU0ZRRXR3aml1aFFRSXRUUVg1SVlyS2ZLQitxdWVUTnBsUjFIb2ZsbzUvSTZhUFBtQUN3UUNFMmpUT1lvNUR6MWNzN1NvZDBLVEcvM2tFREdrM2tVYVVDT04xOXhTSkNhYjNrTnBXWmhTV2tPOGwrU3BXNzBXbjNnMGNpT0lKTzVKWG1hNmRib3M2anlpc3V4WHdVVWhqMisxdUdoY3Z1bGlLdFd3c1VUdzRnaTFjL2RpRUVwWkhvS294VEJlTURtaFBoS1R4N1RYV1Jha1Y4aW1KUjM1NURjSUhrUjlJUkVIeG9oUDRUYnlSNUx0RlUyNHVtUlBSbUVZSGJwZTFMZ2h5eFB4N1lnVUhqTmJiUUZSUWhoNEtlVTFFYWJYeDhGUzNKQXhwMnJ3UkRvZVdrSmdXUlVTS3c2Z0dQNVUyUHVPOVY0WnVpS1hHR3pGUXVSdWYrdGtTU3NiQnRSSktoQ2kzRU51TGxYaFBialRLRDRkalhWbmZYRmRzNlpiKzFYaVVyUmZ5YXlHeEpxMStTWUJFZmJLbGdqaVNtazBvcmdUcXpTUytEWjVyVHFzSmJ0dGlOdHArS01xR0UyQUhHRnc2alFxTTV2RDZ2TXB0bVhWOU9BanE0OVVmL0x4OU9wYW0rSG41TzlwOHFvQkJBUWl4elFaNGVOVmtPOXNQekpBTXlSMXk0L1JDUVExczBwVjVLQVU1c0tMdzN0a2NGYkkvSnFyakNzSzRNdytXOGFvZDRsaW9ZdWF3VWlDeVZXQkUvcVBhRmk1Ym5rZ3BmdS9hZTQ3MTc0ckkxZnFRb1RiVzBIclU2RkFlanE3QnlNMFY0emtaVGcwMi9ZSksyTjdoVVFSQ2VaNEJJZ1NFcWdEOFhzanpHNkxJc1NidUhvSWR6L0xoRnpiTm4xY2xjaTFOSFdKMC82L084SEpNZElwRVpicWkxUnJyRmZvby9ySS83dWZtMk1QRzVsVUkwSVlKNE1BaUhSVFNPRkoyb1R2ZXJGSFlYVGhrWUZJb3lGeDZyTVlGZ2FPS000eE5XZGxPbkljS2Ivc3VwdHB0Z1RPVGRWSWY0WWdkYUFqSm5JQW00cU5OSE5RcXFBenZpNTNHa3lSQ0Vvc2VVQnJIb2hac2pVYmtSOGdmS3RjLytPYTcybHd4SjhNcTZIRGZEQVRiZmJKaHplSXVGUUpTaXcxdVpwckhselVmOTBXZ3FHNzZ6TzBlQ0IxV2RQdjFJVDZzTnh4aDkxR0VMMllwZ0M5N2lrRkh5b2FIOTJuZHdkdXFaNklZamtnMjBEWDMzTVdkb1prN1FrY0tVQ2dpc0lZc2xPYWFMeXZJSXFSS1dRajE2akUxRGxRV0pKYVBvcFdUSmpYZml4RWpSSkpvOGc0Kyt3dVFqYnErV1ZZanNxQ3VOSVFXM1lqbnhLZTJNNVpLRXFxK2NYN1pWZ25rYnNVM1JXSXlYQTFyeHY0a0dlcnNZSmpELy9hdWxkWEdtY0ViY2ZUZUYxNlkxNzA4RkIxSElmbVd2NmRTRmk2b0Q0RStSSWpDc0VaK2tZN2RLbndSZUpKdzN4Q2pLdmkza0dONDJydnloVWxJejBCcCtmTlNWNXh3Rml1QnpHMjk2ZTVzL29Ib0Z0VXlVcGxtUHVsSVBsK2UxQ1FJUVZ0amx6THp6emJWK0QvT1ZRdFl6bzVpeHRNaTVCbUh1RzROL3VLZkprNVVJUkVwNysxMm9abEt0UEJvbVhTekFZMEtndGJQenpab0hReHVqblJFVWdCVStPL2pLS2hneFZoUlB0YnF5SGlVYVJ3UnBIdjdwZ1JQeVVybkU3ZllrVmJsR21mVFkyOHRGQ3ZsSUxDMDRUejNpdmtOV1ZhekErT3NZcnh2Uk0vaGlObjhGYzRiUUJlVVpBQkd4NVMveEZmOUxiYm1rMjk4WDdpRmcyeWVpbXZzUXFxSitoWWJ0NnVxK1pmOWpDK0pjd2ljY2Q2MU5LUXRGdkdXcmdKaUhCNWx3aTZmUjhLellTN0VhRUhmL2thOUVDN0g4RCtXRWEzVEVBQ0hCa05Tai9jWHhGZXE0UmxsQytmVUZtMnh0c3RZTEwybm9zMURmenNDOXZxRERkUlZjUEEzSG85NWFFUUh2RXhWVGhYUHF5bTY1bGxrS2xmUlhiUFRSaURlcGR5bEhqbVY5WVRXQUVqbEQ5RGRRbkNlbTdBai9tbDU4T24zNjYzOTIyMTRCNXpybVF6Lzl5U0cybUZxRXdqcTVzRmw1dFlKUHc1aE56OGx5WlBVVHNyNUUwRjJDOVZNUG5aY2tXUDcrbWJ3cC9CaU43ZjRrZjd2dEduWkYySkd2aksvc0RYMVJ0Y0ZZNW9QUW5FNGxJQVlWNDlVM0M5U1AwTENZLzlpL1dJRks5T1Jqek05a0cvS0dyQXV3Rm1nZEVwZExhaXFRTnBDVEdaVnVBTzY1YWZrWTFoMzNocnF5TGpaeTkySkszL3R3ZGo5cGFmRmN3ZlhPTm1QUVdsZFBsTWU3amxQMjRKczB2OW04YklKOVRnUzJJdVJ2RTlaVlJhQ3dTSllPdEFmTDVIL1lTNEZmektXS2JlaytHRnVsaGV5S3RETmxCdHJkbXIrS1UraWJIVGRhbHpGVW1NZnh3M2YzNngrM2NRYkpMSXRTaWxXOWN1dlpFTWpLdzk4N2p5a1pSbHNIL1VJK0hsS2ZvMnRMd2VtQkVlQkZ0bXhGMnhtSXRBL2RBSWZRK3JYbm04OGRxdlhhK0dhcE9ZVnQvMndhRmltWEZ4M1RDMk1VaU9pNS9NbCszcmovWVU2SWh4MmhYZ2lEWEZzVWVRa1JBRDZ3RjNTQ1BpMmZsazdYd0tBQTR6Ym9xeW51RUxEMzEyRUo4OGxtREVWT01hMVcvSy9hOHRHeWxaUk1yTW9JTHlvTVF6emJESkhOWnJoSDc3TDlxU0M0MkhWbUtpWjVTMDAxNlVUcDgzZ09oQ3d6OVhJdEs5ZmdYZkszRjVkN25aQ0JVZWtvTHhydXRRYVBIYTE2UmpzYTBnVHJ6eWpxVG5tY0ljcnhnNlg2ZGtLaXVjdWRjMERENVc0cEpQZjB2dURXOHI1L3V3MjRZZk11eEZScEQyb3ZUMm1GWDc5eEg2SmYrTVZkdjJUWXFSNi85NTVRZ1ZQZTNKQ0QvV2pBWWNMQTl0cFhnRmlFamdlMko1bGplSS9pVXpnOTFLUXVIa0lJNG1tSFp4QzNYUU9STEFDNkc3dUZuNUxPbWxuWGtqRmRvTzk3Nm1vTlR4RWxTOEhkeFdvUEFrampvY0RSMTM2bTJsK2Y1dDZ4YWFOZ2RvZE92VHUwcmlldm5oTkFCNzlXTnJWczZFc1Bna2dmYWhGOWdTRnp6QWQrckpTcmF3NU1sbGl0N3ZVUDVZeEE4NDNsVXB1Ni81akFSMFJ2SDRyUlhrU2czbkUrTzVHRnlmZStMMHM1cjNrMDVGeWdoU0ZuS280VFRnczA3cWo0blRMcU9ZajZxYVc5a25KVERrRjVPRk1ZYm1DUCs4SDE2VHk0ODJPanZFUlY2T0Z5dzA0M0w5dzNob0ppNDA4c1IrU0dvMVd2aVhVdThkN3FTK2VoS2pwS3d4ZUN0aHNtMkxCRlNGZWV0eDB4NEFhS1B4dHAzQ3hkV3FDc0xyQjFzL2o1VEFoYzFqTlpzWFdsNnRqby9XRG9ld3h6ZzhUOE5uaFoxbmlVd0wvbmhmeWdMYW5DblJ3YUZHRHlMdytzZlpoeVoxVXRZVHA4VFlCNmRFN1IzVnNLS0g5NUNVeEo4dThOKzl1Mi85SFVOS0hXM3gzdzVHUXJmT1BhZmsydzVxWnE4TWFIVDBlYmVZM3dJc3Azck45bHJwSXNXOWMxd3MzVk5WK0p3TnowTG85K1Y3elpyNkdENTZXZTZnV1ZJdnRtYW01R1BQa1ZBYnI3NHI2U3dodUwrVFJYdFcvMHBneVgxNlZObDQvRUFENTBUblVQdXdyVzZPY1VPMlZsV1hTMGlucTg3MmtrN0dVbFc2by9vekZLcStTaXA2TGNUdFNEZkRyUFRjQ0hoeDc1SDhCZVJvbitLRzJ3Und6ZkRnV2hBTG1pV09NTzZoM3BtMVVDWkVQRWpTY3lrN3RkTHg2V3JkQTJOMVFUUEVOdk5uaENRalc2a2wwNTcvcXY3SXdScnlIclpCQ3dWU2JMTG5GUmlIZFR3azhtbFlpeEZ0MXNsRWNQRDdGVmh0MTNIeXFWZXlENTVIT1hyaDJFbEF4Snlpbkdlb0Z6d0tBOTF6ZnJkTHZEeEpTanptSW1mdlRpc3JlSTI1RURjVmZHc214TFZiZlU4UEdlLzdObVdXS2pYY2RUSjExakFsVklZL0J2L21jeGcvUTEwdkNId0tHMUdXL1hiSnE1bnhEaHlMcWlvcm43V2Q3VkVWTDhVZ1Z6cEhNalErWjhEVWdTdWtpVndXQUtrZVRsVlZlWjd0MURHbkNnSlZJZEJQWkFFSzVmOENEeURObzd0SzQvNURCamRENU1QVjg2VGFFaEdzTFZGUFFTSTY4S2xCWXk4NEZpZXZkVTlnV2g2WFpydWd2dENabWk5dmZkNmRiNlY3Rm1vRWNSSG5HMzZWWkg4TjRhWmFsZHE5elphd3QxdUJGZ3hZWXgrR3MvcVcxandBTmVGeStMQ295bXlNNnpnRzdqOGJHelV5TGh2cmJKa1RZQUVkSUNFYjRrTUt1c0tUOVYzZUl3TUxzamRVZGdpak1jKzdpS3JyK1R4clZXRzBVK1c5NVNHcnhueEdyRTRlYUpGZmd2QWpVTTRTQXk4VWFSd0U5ajZaUUg1cVlBV0d0WEJ5dkRpTFNEZk9EMHlGQTNVQ01LU3lRMzBmeXkxbUlSZzRaY2daSExOSFdsK2M5U2Vpak92Yk9KeG9ReTdsVE4ycjNZOHA2b3Z4dlVZNzRhT1lidVZlenJ5cVhBNlUrZmNwNndTVjlYNS9PWktQMTh0QjU2VWEwZ015eEpJN1h5TlQ3SXJxTjhHc0I5ckwva1A1S01yalh4Z3FLTERhK1Y1T0NINmE1aG1PV2VtTVVzZWE5dlFsOXQ1T2NlNzZQclR5VHY1MEV4T3FuZ0UzUEhQZlNMLy9BSXRQZEI3a0dueVRSaFZVVUZOZEpKMno3UnRrdFp3Z21RemhCRy9HN1FzalptSmZDRTdrNzVFbWRJS0g3eGxubURyTk0vWGJUVDZGemxkY0gvcmNSR3hsUHJ2NHFEU2NxRTdKU21RQUJKV3FSVC9UVWNKU3dvUU0rMWp2RGlndnJqakg4b2VLMmluMVMrL3lPMWo4eEF3cy9UNXUwVm5JdkFQcWFFMWF0TnVOMGN1UmxpTGNIMmowblRMNEpwY1I3dzlReWEwSm9hSGdzT2lBTExDQ3pSa2wxVVVFU3oremUvZ0lYSEd0RHdnWXJLNnBDRktKMXdlYlNEb2c0elRsUGtnWFpxeGxRRGlZTWpoRHB3VHRCVzJXeHRoV2JvdjlkdDJYOVhGTEZtY0YrZUVjMVVhUTc0Z3FaaVpzZGo2M3BIMXFjdjNWeThKWWNpb2dJVktzSjhZeTNKOXcvR2hqV1ZTUUFtclMwQlBPV0srUktWKzBsV3FYZ1lNbklGd3BjWlZEN3pQU3A1NDdpOUhsZmxCOGdWblNUR21tcTFDbE8wODFPVy9VSDExcEVRTWZrRWRERnpqTEMxQ2RvL0JkTDNzN2NYYjhKKytIenoxcmhPVVZaRklQZWhSaVo4Vll1Nis3RXI3ajVQU1p1OWcvR0JkbU56Sm15Q0Q5d2lzd2o5Qlp3K1QzaUJyZzgxcmUzNmloTUxqb1ZMb1djKzYyYTFVLzdxVlg1Q3B2VFZGN3JvY1NBS3d2NGNCVnFabTdsTERTL3FvWHM0Zk1zL1ZRaTZCdFZiTkEzdVN6S3BRZmpIMW8zeDRMcnZrT240MHpobTZoamR1RGdsekpVd0EwUE9hYmdkWEluZHA5ZnpoT28yM1BlK1JrOUdTTFgwZDcxUG9xcnk4TlFEVHpObHNhK0pUTkc5K1VyRWYrbmd4Q2pHRXNEQ2MwYnordWRWUnlIUUkxam1FTzNTK0lPUXljRXE3WHdCNnozd2ZNZmE3M204UFZScCtpT2d0WmZlU0JsMDF4bjAzdk1hUUpreWo3dm5oR0NrbHNDV1ZSVWw0eSs1b05VelE2M0IyZGJqREYzdmlrZC8zUlVNaWZQWW5YNUdsZnVrMkZzVi83UnFqSTl5S1RiRTh3SlkrNzRwN3FYTzgrZElZZ2p0TEQvTjhUSnRSaDA0Tjl0WEpBNEg1OUlrTW1MRWxndnIwUTVPQ2VWZmRBdCs1aGtoNHBRZ2ZSTUhwTDc0WGF0TFFwUGlPeUhScy9PZG1IdEJmOG5PWmN4Vkt6ZEdjbElOMTZsRTdrSitwVk1qc3BPSSs1K1RxTFJPNm0wWnBOWEpvWlJ2OU1QRFJjQWZKVXROWkh5aWcvczJ3d1JlYWtGZ1BQSndDUW11MUkzMC90Y0JiamkrTmE1M2kxVzFOK0Jxb1k3WnhvK1UvTTlYeUo0T2syU1NrQnRvT3J3dWhBWTNhMDNFdTZsOHdGZElHMWNOK2U4aG9wVGtpS0YwOTNLdUgvQmNCMzlyTWlHRExuNlhWaEdLRWFhVC92cWIvbHVmdUFkcEdFeGV2RjErSjlpdGtGaENmeW1Xcjl2R2IzQlRLNGo1OTh6Ukg3K2UrTVU5bWFydVpxYjBwa0d4UkRSRTFDRDRaOExWNHZoZ1BpZGs1dzJCcTgxNmczbkh3MS8vajNKU3R6N05SOUhJV0VMTzhUTW4zUXJQL3pacC8vK0R2OXA0Mjkvb2d2K0dBVFIrbi9VZEYrbnM5eE5rWFpRSlhZNHQ5ak1rSk5VRnlnQXR6bmRYd2pzcyt5V0g5SEFuTFFRZmhBc2tkWlMybDAxSExXdjdMN3VzNXVUSDQwOXBxaXR2ZlNPUWcvYytadDdrODc5UDNLOStXVjY4bjcrM2NaZnVSZC9kRFBQLzAzcm4rZCsvbkJ2V2ZnRGx0OCtMempxSi92eDNDbk5Pd2lYaGhvNzc4Qzk2aUQrMVRCdlJaWWVQK0VIODFMRTB2VndPT3JtQ0xCM2lLekkxeCt2SkVzclBINHVGMFVCNFRKNFgzdURmT0NvM1BZcFllME1GNGJvdWgwRFEvbDQzZnhVRjdZK2RwV3V2VFNmZkIweU8yVVFVRVRJL0x3Q1pFM0J2bmV2SjdjOXpVbFkzSDU4eHprZTZETkZEUUc4bjBXdERONExBWU40bm9nS2F2MWV6T2ZLL3ordDZ0c0NUcCtkaHg0eW1qV3VDSmsxZEVVaWZEUCtIeVM0aVAvVmc5QjJqVG85TDROYmlCdURTNG51dUhXNkgrSkRRbjJKdHFSS0drRVFQRVlFN3V6YXpYSWtjeElBcVVxMWVzYXNaQkVUbEVaWTd5N0pvK1JvVi9Jc2pZOWVJTWtVdnI0MkhjMHhxdHNhdlp2aHoxT0x3U3hNT1R1cXpsaGIwV2JkT3dCSDlFWWl5QmphdHo0MGJVeFRIYmlXeHFKMHVtYTE5cWhQcnV2Y1dKbGJpU1NINDhPTEREcGFIUHN6dnljdDQxWmZUdTEwK3Zqb3g2a09xSzZ2MEsvZ0VQcGhFdk1sL3Z3U3YrQTRIaG0zNkpTUDlJWFR5Q1pEbTRrS3NxRDVheThiMVNhZC92YWl5TzVOL3NEZkVWNlo0cTk1RSt5Zmp4cHFCb0JFVFcyQzd4bDRwSU8yYkRPRERGdXJVUHdFN0VXQzJVcGxxK0FIbUJIdmlyMlBTZ2tSMTIvUnk2NU8wYVp0UVBlWGk5bVRsRi9XajVHUSt2RmtZeWhYc0xUanJCU1A5aHdrNEdQcURQNXJCbjUvbDhiMG1MUkF2UlN6WEhjMjkzYnMzczhFc2RFM20yZXh4aWRXVkI0am9IUitTK2R6NS9XK3YwMEszVHFOMTRDREJ0aDhlV2NzVGJpd1hQc3lnSGRHaWQwUEVkeTZISG0ydi9JVXVWNVJWYXBZbXpHc1g5MG1wbklkTkdjT09xNjREYmM1R1ViWXBEOU03Uys2Y0xZLy9RbWp4RkxQNWN1VEZSbTN2QTVya0Zacm9Gbk8zYmpIRjM1dVUzczhtdkw3VHA5bnlUYzRteW1USjVzTElwN3VtU25Ha08yM2ZhZWh0ejNtbVRTN2ZiVng1clA3eDNIWElqUk5lcS9BM3hDczlKTkIwOGM5UzlCRjJPM2JPdXIwSXRzbEZ4WGdSUGRhYXBCSWk0ZFJwS0d4Vno3aXI2OXQvYmM5cVR4anZ0T3lHT2ZpTEdEaFI0Zll5d0h2MVdkT3BseElWODdUcExCeTNXYzBRUDBQOXM0RzdGQk5PZElUUy90ZXAzbzNoMVRFYTVYRERpaTdmV3RxUnpVRVJlUDJmYnh6N2JIV1dKZGJJT3hPVUpadEl0TlpwVEZSZmo2dm05c1lqUnhRVk8rV1RkaU9oZFBlVEorOFlpclB2b2VMODhsNWlMWU9IZDNiL0lta3ErMVpOMUVsM1Vpa2hmdHV0ZUVZeGYxV3Vqb2Y4UHI0SUNUdTVlelp5WjR0SFFNeGx6VUhMWU8yVk1Pb05NR0wvMjBTNWkybzJvYmZrKzhxcWRSN3h6YlJEYmdVMGxudUlnejRMZWxRNVhTN3hiTHVTUXROUzk1djNaVU9kYVV4L1FkOHF4Q3Q2eGYyRTYyeWIvSHVrTE82UnlvclY4S2dZbDVZTmM3NXkrS3ZlZnJ4WStsYy82NHk5a3ZXUDBhMGJEei9yb2pxK1JXak8wNldlcnVXcU5GVTdyM0hQSWNMV1JxbDhJQ1pzejJMcy9xT20vQ0xuNisrWCtRZjdtR3NwWUNyWm9kL2xwbDZSdzR4Ti95dXE4Z3FWNEI2YUhrMWhWRTFTZklMeFd1NWd2WHFiZkFSWVFwc3BjeEtwMUYvYzhYT1B6a1p2bW9Tdyt2RXFCTGRycTFmcjN3QVB2NU5uTTlpOEYramRBdXhrUDVaNzFjNnVoSzNlbmxuR3ltcjdVc1daS0MxMnFnVWlHOFhYR1E5bXhucXo0R1NJbHliRjllWG1icWoyc0hYK2ExamYwZ1JvT05IUmRSU3JJcTAzVHk4OWVRMUdiVi9CaytkdTQrVjE1emxzK3Z2RVJ2WjRFN1pibnhXVFZqRGpiNG8vazhqbHc0NHBUSXJVR3h4dUp2QmVPK2hldWhPanBGc082bFZKL2FYbkpEYS9iTTBRbDFjTGJYRS9QYnYzRVozdmozaVZyQjVpcmp1cFpUemxudjY3N05ySTlVTllOcWJQZ3AvSFpYUytsSm1rODd3ZWMrN1lPeFREbzJhdzJsM05mRHIzNFZObHZxV0pCa251SzdvU2xaNi9UMTB6dU9vUFpPZW9JazgxTitzTDg0M1dKMlE0WjBmWjNzY3NxQy9KVjJmdWhXaTFqR1VSU0taVjYzN2xmNTNYbm54MTYvdktFWFk4OWFWSjBmdjkxakdkZkcrRzQrc25pd0hlczRoUyt1ZE9yNFJmaEZoRy9GNWdVRzM1UWFVK01jdUxtY2xiNVpXbVIrc0c1VjZuZitQeFl6bHJuRkd4cFphSzhlcXFWbzBOZm1BV29HZlhEaVQvRm5VYld2ekdET1RyOGFrdE9aV2c0Qll2ejVZSDEyWmJmQ2NHdE5rK2REQVpOR1d2SG92K1BJT25ZOVByamc4aC93TFJyVDY5c3VhTVZaNWJOdUswMGxTVnBucVNYMU5PTi84MUZvUDkyclluZGlvbndnT2lBOFdNZjR2YzhsMTVLcUVFRzR5QW0yK1dBTjVCcmZ1MXNxOXN1V1lxZ29hamdPWXQvSkNrMWdDOHdQa0srWEtDdFJYNlRBdGd2cm51QmdOUm1uNkk4bFZEaXBPVkI5a1g2T3hrcDRaS3lkMU02R2o4L3YyVTdrK1lRQkw5NUtiOVBRRU51Y0piMEpsVzNiNXRPYk43bS9aMWoxZXYzODhkN28xNXpnWHNJOUNpa0FHQVZpUjZsa0p2N25iNEFrNDBNMkc4VEo0NDdrTitwdmZIaU9GalNVU1A2UE0rUWZiQXl3S0pDQmF4U1Z4cGl6SHNlWlV5VUJocTU5dkZ3cmt5R29SaUhibzBhcHdlRVplU0x1TmlRK0hBZWtPbmFyRmcwMGRaTlhhUGVvSFBUUlIwRm1FeXFZRXhPVmFhYU84YzB1RlVoN1U0ZS9VeGRCbXRobEJEZ2cyNTdRMzNqMWhBN0hUeFNlVFRTdVZuUFpiZ1cxbm9kd21HMTZhS0JES3hFZXR2N0Q5T2pPMEpocmJKVG5vZStrY0dvREphekZTTzgvZlVOOUp5L2c0WEs1UFVrdzJkZ1BER3BKcUJmaGU3R0ErY2p6ZkUvRUdzTU0rRlY5bmo5SUFoclNmVC9KM1FFNVRFSVl5azVVanNJNlpaY0NQcjZBOEZaVUY0ZzlubnBWbWpYOTBNTFNReXNJUEQwbkZ6cXdDY1NKbUliNW1ZdjJDbWsrQzFNREZrWlF5Q0JxNGMvWWFpOUxKNnhZa0dTL3gyczUvZnJJVzJ2bUcyV3J2MEFQcENkZ0NBOXNuRnZmcGU4dWMwT3dkUnM0Rzk5NzNQR0VCblFCNXFLckNRNm02WC9IN05Jblo3eS8xNjc0L1pYT1ZwN09ldUNSazhKRlM1MTZWSHJuSDFIa0lVSWxUSWxqakhhUXRFdGtKdG9zWXVsNzdjVndqazNnVzFBamFhNnpXZXlIR0xscGszVkhFMlZGelQyeUkvRXZsR1VTejJIOXpZRTFzNG5zS010TXFOeUtOdEwvNTlDcEZKa2k1Rm91NlZYR204dldBVEVQd3JVVk9Mdm9BOGpMdXdPelZCQ2dIQjJDcjVWNk93RVd0SkVLb2tKa2ZjODdoK3NOSFR2TWIwS1ZUcDUyODRRVFB1cG9XdlFWVXdVZW9nWlIza0JNRVNZbzBtZnVrZXdSVlBLaDUrcnpMUWI3SEtqRkZJZ1doajF3M3lOL3FDTm9QSThYRmlVZ0JOVDFoQ0hCc0F6OEw3T3l0OHdRV1VGajkyT05uL0FQeUpGZzhoenVlcW9KZE5qNTdST3JGYmZmdVMvWHhyU1hMVFJnajV1eFpqcGdRWWNlZU1jMndKcmFoUmVTS3BtM1FqSGZxRXhUTEFCMmlwVnVtRThwcWNadjhMWVhRaVBISHNnYjVCTVc4ek01cHZRaXQrbVF4OFhHYVZEY2ZWYkx5TVRsWTh4Y2ZtbS9SU0FUL0gwOVVRb2w1Z0l6N3JFU0RtbnJRNGJVUklCNGlSWE1EUXd4Z2V4MUdndER4S3AySGF5SWtSK0UvYURtQ3R0Tm0yQzZseXRXZGZPVnpENlgyU3BEV2pRRGxNUnZBcDFzeW1XdjRteTFiUENEK0UxRW1Hbk1HV2hOd215Y0puRFYyV3JRTnhPNDV1a0ViMDhBQWZmaXpZS1ZVTHAxNUk0dmJOSzVEeld3Q1NVQURmbUtoZkdTVXFpaTFMMlVzRThyQjdtTHVIdVVKWk94NCtXaWl6SEJKL2h3Ym9hQnpocE5PVnZnRlRmNWNKc0hlZjdMMUhDSTlkT1VVYmIrWXhVSlduNmRZT0x6K1RIaTkxa3pZNWR0TzVjK2dyWDd2MGpFYnN1b09Hbm9JcmVESWcvc0ZNeUcrVHlDTEljQVdkMUlaMVVORnhFOFVpZTEzdWNtNDBVMmZjeEMwdTNXTHZMT3h3dStGN01XVXNIc2R0RlFaN1crbmxmQ0FTaUFLeWg4cm5QM0V5REJ5dnRKYjZLYXg2L0hrTHpUOVN5RXlUTVZNMXpQdE0wTUpZMTREbXNXaDRNZ0QxNUVhOUhkMDBBZGtUWjBFaUc1TkFHdUlCelFKSjBKUjBuYStPQjdsUUE2VUt4TWZpaElRN0dDQ25WejY5NFF2eWtXWFR4cFMyc29EdStzbXJ1MVVkSXhTdkFzekJGRDFjOGM2Wk9vYkE4YkppSkl2dXljZ0lYQlFJWFd3aHlUZ1pEUXhKVFJYZ0V3Uk5BYXdHU1hPMGExREtqZGloTFZOcC90YUUveFloc2d3ZStWcEtFRUI0TGxyYVF5RTg0Z0VpaHhDbmJmb3lPdUpJRVh5MkZJWXcrSmpSdXN5YktsVTJnL3ZoVFNHVHlkdkN2WGhZQmR0QVh0UzJ2N0xrSHRtWGgvOGZseTFkbzhGSS9EMGY4VWJ6VmI1aCtLUmhNR1NBbVIybWhpMFlHL3VqN3dneGNmekNyTXZkaml0VUlwWERYOGFlMkpjRi8zNnFVV0lNd042SnNqYVJHTmorakV0ZUdEY0Z5VFViOFgvTkhTdWNLTUpwN3BkdXh0RDZLdXhWbHl4eHdhZWlDMUZiR0JFU084NGxieXJBdWdZeGRsKzJOOC82QWdXcG8vSWVvQU9jc0czNUlBL2IzQXVTeW9hNTVMN2xsQkxsYVdsRVd2dUNGZDhmOE5mY1RVZ3pKdjZDYkIrNm9oV3dvZGxrOW5HV0ZwQkFPYXo1dUVXNXhCdm1qbkhGZURzYjBtWHdheWozbWRZcTVneHhOZjNIMy90bkNnSHdqU3JwU2dWeExtaVR0dXN6ZFJVRklzbjZMaU1Qakw4MDh2TDF1UWhEYk03YUE0M21JU1hSZXFqU3NreW5JUmNIQ0o5cWVGb3BKZng5dHF5VW9HYlN3SmV4LzBhREUzcGxCUEd0TkJZZ1diZExvbTMrUS9iamRpelIyL0FTL2MvZEgvZDNHN3B5bDFxRFhndE9GdEVxaWR3THF4UFl0ck5FdmVhc1dxM3ZQVVV0cVRldThncG92NGJkT1FSSTJrbmVGdlJOTXJTaHlWZUV1cEsxUG9MRFBNU2ZXTUlKY3MyNjdtR0I4WDlDZWhRQ0YwZ0l5aHBQMTBtYnlNN2x3VzFlNlRHdkhCVjFzZy9VeVRnaEhQR1JxTXlhZWJDNnBiQjFXS05DUXRsYWkxR0d2bXE5elVLYVV6TGFYc1hFQll0SHhtRmJFWjJrSmhSMTY0TGhXVzJUbHAxZGhzR0U3WmdJV1JCT3gzWmN1MkR4Z0grRzgzV1RQY2VLRzBUZ1FLS2lpTk5PbFdndnFORWJucms2ZlZEK0FxUmFtMk9ndVpiMFlXU1RYODhOK2kvRUxTeGJhVVVwUHg0dkpVellnL1dvblNlQTh4VUs2dTdEUEhncHFXcEVlNkQ0Y1hnNXVLOUZJWVZiYTQ3Vi9uYit3eU90ayt6RzhSclM0RUEwb3V3YTA0aUJ5UkxTdm9KQTJGemFvYmJadFhucThHZGJmcUVwNUkyZHBmcGo1OVRDVmlmNitFNzVwNjY1ZmFpWDhnUzIxM1JxQnhUWnFmSFA0Nm5GNk5TZW5PbmV1VCt2Z2JMVWJkVEgyL3QwUkVGWFpKT0VCNkRIdng2TjZnOTk1NkNZclkvQVljbTlnRUxKWFlrclNpKzBGMGdlS0RaZ09DSVlrTFUvK0dPVzVhR2o4bXZMRmd0Rkg1K1hDOGh2QUUzQ3ZIUmZsNG9mTS9Rd2s0eDJBK1IrbnljOWdOdS85VGVtN1hXNFhSbnlSeW1mNTJ6MDljVE9kcitQRzYrUC9WYjRRaVhsd2F1YzVXQjF6M28rSUpqbGJ4SThNeVd0U3pUK2s0c0tWYmhGM3hhK3ZEdHMzTnhYYTg3aWl1K3hSSDljQXBybk9MMmg2dlY1NGlRUlh1T0FqMXM4bkxGSzhnWjcwVGhJUWNXZEYxOS8yeGFKbVQwZWZya05Ea1dicEFRUGRvOTJaOCtIbi9hTGpiT3pCOUFJL2sxMmZQczlIaFVOREoxdTZheDJWeEQzUjZQeXdON0JyTEoyNno2czNRb01wNzZxenp3ZXRyREFCS1NHa2ZXNVB3UzFHdllOVWJLNnVScXhmeVZHTnlGQjBFK091Z01NOGtLd21KbXVwdVJXTzhYa1hYWFFFQ3lSVnc5VXlJcnRDdGNjNG9OcVhxcjdBVVJCbUtuNktoejNlQk45Nkx3SUpyQUdQOW1yLzU5dVRPU3g2MzFzdXlUK1F1akRkNGJlVUZwWjBrSkVFbmpsUCtYL0tyMmtDS2huRU5UZzRCc01UT21NcWxqMldNRkxSVWxWRzBmemRDQmdVdGE5b2RySmZwVmRGb21UaTZhazB0RmpYVGNkcXF2V0JBempZNmhWckg5c2J0M1o5Z24rQVZEcFRjUUltZWZiQjRlZGlyanpyc05pZXZ2ZTRaVDRFVVpXVjNUeEVzSVcrOU1UL1JKb0tmWlpZU1JHZkMxQ3dQRy85cmRNT004cVIvTFVZdnc1Zi9lbVVTb0Q3WVNGdU9vcWNoZFVnMlVlUGQxZUN0RlNLZ3hMU1o3NjRveTRsdlJDSUg2Ym93UHhaV3d4TkZjdGtzTGVpbDQ3cGZldmNCaXBra0JJYzRuZ1pHK2t4R1o3MWE3MktRN1ZhWjZNWk9aa1FKWlhNNmtiL0FjMC9Ya0p4OGR2eWZKY1diSTN6T05FYUVQSVc4R2JrWWpzWmN3eStlTW9LcllqRG12RUVpeEh6a0NTQ1JQUnpoT2ZKWnVMZGNieDE5RUwyM01BOHJualRaWjc4N0ZHTW5rcW5wdXpCNS85MHcxZ3RVU1JhV2NiMGV0YTgxOThWRWVaTVVTZkloeXVjNC9ueXdGUTl1cW43amRxWGgrNXd3ditSSzlYb3VOUGJZZG9FZWxOR28zNEt5eVN3aWdzcmZDZTB2L1BsV1B2UXZRZzhSMEtnSE8xOG1UVlRoaFFybGJFUTBLcC9KeFBkakh5UjdFMVFQdy91dDByK0hEREc3QndaRm05SXFFVVpScHYyV3B6bE1rT2VtZUxjQXQ1Q3NyenNrTEdhVk9BeHl5U3paVi9EMkVZN3lkTlpNZjhlOFZoSGNLR0hBV05zemYxRU9xOGZOc3Rpak1ZNEpYeUFUd1RkbmNGRnFjTkRmRG8rbVdGdnhKSnBjNHNFWnRqWHlCZG9GY3hiVW1uaUNvS3E1anlkVUhOallKeE1xTjFLellWNjJNdWdjRUxWaFMzQm5kK1RMTE9oN2R3cy96U1hXenhFYjROajRhRnVuNXg0a0RXTEs1VFVGL3lDWEIvY1pZdkk5a1BnVnNHMmpTaHRYa3hmZ1QreHpqSm9mWHFQRW5JWElRMWxuSWRtVnpCT005MEVYdkpVVzZhMG5aLzdYakpHbDhUb08zSC9mZHhueG1UTktCWnhua3BYTFZnTFhDWnl3R1QzWXlTNzV3L1BBSDVJL2pNdVJzcGVqOHhaT2JVOWtSRWJSQStrcWptS1JGYUtHV0FtRlFzcEMrUUxiS1BmMFJhSzNPWHZCU1dxbzQ2cDcwd3MvZVpwdTZqQ3RaVWdReTZyNHRITVBVZEFnV0dHVVlOYnV2LzFhNksrTVZGc2QzVDE4MytUOGNhcFNvNm0wK1NoNTdmRWVHLzk1ZHlrR0pCUU1qMDlEU1cyYlkwbVVvbkR5OWE4dHJMbm5MNUI1TFczTmw4ckpaTnlzTzhaYis4MHpYeHFVR0ZwdWQzUXp3YjdiZis4bXE2eDBUQW5KVTlwRFFSOVlRbVpobG5hMnh1eEp0MGFDTy9mMVNVOGdibE9yYkl5TXN4VGxWVVc2OVZKUHpZVTJIbFJYY3FFMmxMTHhuT2JadXoydFQ5Q2l2ZlRBVVlmbXpKbHQvbE9QZ3NSNlZONjQveFFkNEpsay9SVjdVS1Z2Mkd4L0FXc21UQXVDV0toZHdDKzRIbUtFS1laaDJYaXM0S3NVUjFCZU9iczFjMTN3cUZSbm9jZG11aGVhVFYzMGd2VlhaY291ekhLSzV6d3JONTJqWEpFdVg2ZEd4M0JDcFYvKys0ZjNoeWFXL2NRSkxGS3Fhc2pzTXVPM0IzV2xNcTJneVlmZEsxZTdMMnBPL3RSeWUybXd6d1pQZmRVTXJsNXdkTHFkZDJLdi93VnRucHlXWWhkNDlMNnJzT1YrOEhYUHJXSDJLdXA4OWwydHo2YmY4MGlZU2QrVjRMUk9TT0hlYW12ZXhSNTI0cTRyNDNyVG10RnpRdkFycHZXZkxZRlpyYkZzcEJzWE5VcXFlbmp4Tk5zRlhhdFp2bEloazd0ZVVQZksrWUwzMkY4TWNUbmp2MEJaTnBwYit2c2hvQ3J0TFhqSVdxM0VKWHBWWElsRzZaTkwwZGg2cUVtMldNd0RqRDNMZk9ma0doMS9jelljLzBxaGlEMm96Tm5INDg4Mk1WVnQzSmJWRmtid293TkNPM0tMNUlvWVc1d2xWZUdDVmlPdXYxc3ZaeDdGYnp4S3pBNHpHcUJsUlJhUldDb2JYYVZxNHlZQ1diWmY4ZWlKd3QzT1krTUZpU0plbmdjRlAydDBKTWZ6T2lKN2NFQ3ZweDduZWcxUmM1eCs3bXlQSk9YdDJGb2hWUnlYdEQrL3JEb1RPeUdZSW5KZWxaTWpvbGVjVkhVaFVOcXZkWldnMkoydDBqUG1pTEZlUkQvOGZPVDRvK05HSUxiK1R1ZkNvOWNlQkJtM0pMVm4rTU8yNjc1bjdxaUVYLzZXKzE4OGNZZzNabjVOU1RqZ09LZldGU0FBTmE2cmFDeFNvVlU4NTFvSkxZMTFXSW9ZSzBkdTBlYzVFNHRDbkFQb0toNzFyaVRzalZJcDNnS3ZCYkVZUWlOWXJtSDIyb0xRV0EyQWR3TW5JRDZQWDliNThkUjJRS280cWFnMUQxWitML0Z3RUtUUjdvc09aUFdFQ1BKSUhRcVBVc001aS9DSDVZdXBWUGZGQTVwSFVCY3Nlc2g4ZU81WWh5V25hVlJQWm4vQm1kWFZ1bVpXUHhNUDVlMjh6bTJ1cUhnRm9UOUN5bUhZTk5yenJyamxYWk0wNkhuekR4WU5sSTViL1Fvc3hMbW1ycURGcW1vZ1FkcWswV0xrVWNlb0F2UXhIZ2tJeXZXVTY5QlBGcjI0VkI2K2x4NzVSbmE2ZEd0cm1PeERudkJvanZpMS80ZEhqVmVnOG93b2ZQZTFjT254VTFpb2gwMTZzL1Z1ZHY5bWhWOWYzNUF0K1NoMjhoMWJwcDh4aHIwOSt2ZjQ3RWx4M01zNmh5cDZRdkIzdDB2bkxiT2h3bzY2MGNwN0swdnZlcGFiSzdZSmZ4RVdXZnJDMll6SmZZT2p5Z1B3ZndkLzFhbVRxYTBoWjV1ZWViaFdZVk11YlJUd0lqaiswT3Ewb2hVM3pmUmZ1TDhndDU5WHNIZHdLdHhUUVE0WTJxejZnaXN4bm0yVWRsbXBFa2dPc1p6N2lFazZRT3Q4QnVQd3IrTlIwMUxUcVhtSm8xQzc2bzFOMjc0dHdKdmwrSTA2OVRpTHBlbksvbWlSeGh5WThqdllWNlcxV3VTd2hIOXE3a3V3bkpNdG03SVdjcXM3SHNueUhTcVdYTFNwWXRaR2FSMVYzdDBnYXVuaW5GUFpHdFdza0Y2NXJ0dGk0OFVWOXVWOUtNOGtmRFlzMHBnQjAwUytUbHpUWFY2UDhteHExNWI5RW44c3ozaldTc3pjaWZaYS9OdXVmUE5uTlRiMDMxcHB0dDArc1JTSC83VUc4cHpic2d0dDNPRzN1dDdCOUp6RE10Mm1UWnV5Uk5JVjhENTRUdVRycE5jSHRnbU1sWUplaVk5WFM4M05ZSmljalJqdEpTZjlCWkxzUXY2MjlRZERzS1FoVEs1Q25YaHBrN3ZNTmtIelBobTBFeFcvVkNHQXBIZlB5QmFndFpRVFFtUEh4N2c1SVhYc3JRRFB6SVZodjJMQjZJaDEzOGlTRHd3MUpOSHJEdnpVeHZwNzNNc1FCVmhXOEViclJlYVZVY0xCMVIzUFVYeWFZRzRIcEpVY0xWeE1nRHhjUGtWUlFwTDdWVEFHYWJEemJLY3ZnMTJ0NVA4VFNHUWtyai9nT3JwbmJpREh3bHVBNzN4Ylh0cy9MN3U0NjhjUldTV1J0Z1R3bFFuQTQ3RUtnME9pWkRnRnhBS1FRVWNzYkdvbUlUZ2VYVUFBeUtlMDNlQTdNcDRnbnlLUW1tMExYSnRFazZkZGtzTUpDdXhEbW1Iem1WaE8rWGFOMkE1NE1JaDNuaXc1Q0Y3UHdpWEZacm5BOHdPZGVITHZ2aGRvcUlERzlQREk3VW5XV0hxNTI2VDh5Nml4SlBoa3VWS1pub1VydU9wVWdPT3AzaUlLQmprK3lpMXZIbzVjSXRIWGIxUElLekdhWmxSUzBnNWQzTVYycEQ4RlFkR1lMWjczYWFlL2VFSVVlUE1jNE5GejhwSVVmTENyckY0alZXSDVnUW5lTjNTOHZBTkJtVVhyRWNLR242aElVTjk1eTF2cHN2THdiR3B6VjlMMFpLVGFuNlREWE0wNTIzNnVMSmNJRU1LVkF4S05UMEs4V2xqdXdObnkzQk5RUmZ6b3ZBODViZUk5enIxQUdOWW5ZQ1ZrUjFhR25nV1VSVXJncVIrZ1JyUWh4VzgxbDNDSGV2anZHRVB6UE1UeGRzSWZCOWRmR1JiWlUwY2cvMW1jdWJ0RUNYNHR2YWVkbU5BdlR4Q0p0YzJRYW9VYWxHZkVOQ0dLN0lTL084Q1JwZE9WY2E4RVdDUnd2MnNTV0U4Q0pQVzVQQ3VnakNYUGQzaDZVNjBjUEQrYmRodFhadVlCNnN0Y292ZUU3U201TU0yeXZmVUhYRlNXN0t6TG1pNy9FZUVXTDB3cWNPSDlNT1NLamhDSEhtdytKR0xjWUUvN1NCWlFDUmdnb3gwWlpUQXhybHpOTlhZWEw1Zk5JamtkVDRZTXFWVXo2cDhZRHQwNDl2NE9YR2RnM3FUcnRMQlVYT1pmN2FoUGxaQVkvTys3U3AwYnZHU0hkeVE4QjFMT3NwbHFNYjlTZThWQUU3Z0lkU1p2eGJSU3JmbCtMazVRYXFpNVFKY2Vxaml0ZEVyY0hYZy8zTXJ5bGpQU0lBTWFhbG9GbTFjVndCSjhETm1rRHFvR1JPU0hGZXRyZ2pRNUNhaHVLa2RINXBSUGlnTXJnVHRsRkk4dWZKUEpTVWxHZ1RqYkJTdnBSYzB6eXBpVW42VTVLWnFjUm95cnR6aG1KNy9jYWVaa21WUndKUWVMT0c4TFk2dlA1Q2hwS2hjOEpzMEVsK242RlhxYng5SXRkdEx0WVA5MmtLZmFUTHRDaThTdExaZEVOSmE5RXgxbk9vejFrUTdxeG9pWkZLUnlMZjRPNENIUlQwVC8wVzlGOGVwTktWb2V5eFVYaHkzc1FNTXNKalFKRXlNT2ptT2hNRmdPbW1sc2NWNGVGaTFDbGRVOTJ5andsZWlyRUtQVzNiUEF1RWhSWlY3SnNLVjNMcjVjRVRBaUZ1WDVOdzVVbEY3ZDJIWjk2Qmgwc2dGSUw1S0dhS1NvVllWbHZkS3BaSlZQNStOWjd4REVrUWhtRGdzREtjaWF6SkNYSjZaTjJCM0ZZMmY2Vlp5R2wvdDRhdW5HSUFrL0JIYVMraStTcGRSZm5CL09rdE92eWppbldOZk05S3NyNld3dENhMWhDbWVSSTZpY3BGTTRvOHF1Q0xzaWtVMHRNb1pJLzlFcVhSTXBLR2FXem9mbDRuUXVWUW0xN2Q1ZlU1cVhDUWVDRHFWYUw5WEo5cUowOG4zRzNFRlpTMjhTSEViM2NkUkJkdE8wWWNUemlsM1Frbk5LRWUvc21RMWZUYjBYYnB5TkI1eEFldUlsZis1S1dsRVkwRHFKYnNuekpsUXhKUE9WeUhpS014NVh1OUZjRXYxRmJnNkZobTR0K0p5eTVKQzFXM1lPOGRZTHNPMFBYUGJ4b2RCZ3R0VGJIM3J0OUNwMWxKSWsycjNPMVpxdTk0ZVJibkl6MmY1MGxXb2xZenVLc2o0UE1vazRhYkhMTzhOQUM4ODRoaVh4NUZ5NXBXS08wYldMN3VFR1hhSkN0em5oUDY3U2xRNHhqV0lmZ3E2RXBaMjhRTXR1Wks3SkMwUkdibDluQTRYdEZMdWcvTkxNb0gxcEd0OUlvbkFKcWNFREx5SDZURFJPY2JzbUdQYUdJeE1vNDFJVUFuUVZQTVBHQnlwNG1PbWg5WlFNa0JBY2tzVUs1NUxzWmo3RTV6NVh1Wm95V0NLdTZuSG1EcTIyeEkvOVo4WWR4Snk0a1dwRDE2akxWcnB3R0xXZnlPRDBXZCtjQnpGQnhWYUd2N1M1azlxd2gvNXQvTFFFWHNScUkzUTlSbTNRSW9hWlc5R2xzRGFLT1V5eWt5V3VoTk9wclNFaTBzMUc0cmdvaVgxVjc0M0VFTHRpK3BKdTVvZzZYMGc2b1R5blVxbGhIOWs2ZXp5UmkwNU5HWkh6MG52cDNIT0pyN2VickFVRnJEamJrRkJPYkV2ZFFXa2tVYkwwcEV2TVU0Nlg1OHZGOWo5RjNqNmtweWV0TlVCSXRyRXViVzladk1QTTRxTnFMbHNTQkpxT0gzWGJOd3YvY1hEWE54TjhpRkx6VWh0ZWlzWVkrUmxIWU91UDI5L0NiK0wreHYrMzVSdjd4dWRuWjZvaEs0Y01QZkNHOEtJN2RObWpOay9INGU4NHBPeG4vc1pISzlwc2Z2ajhuY0E4cUp6N084eHFieEVTRGl2R0pPWnpGN281UEpMUTdnMzRxQVdveXVBK3gzYnRVOThMVDZaeUd5Y2VJWGpycW9iMkNBVnFsNFZPVFFQVVFZdkhWL2c0ekF1Q1pHdllRQnRmMHdtZDVsaWxydnVFbjFCWExueTAxQjRoNFNNRGxZc25OcG05ZDdtOWg1Nzh1ZnBlZjlaNFdwbHFXUXZxbzUyZnlVQTdKMjRlWkQ1YXY2U3lHSVY5a3BtSE5xeXZkZnpjcEVNdzk3QnZrblYyZnErTUZIdW45QlQzTHNmOHBienZpc1dpSVF2WWtuZys4VnhrMVYrZGxpMXU1NmtZNTBMUmphUGRvdHZUNUJ3cXR3eUYrZW1vL3o5SjN5VlVWR2ZLcnhRdEpNT0FRV29RaWkvNGRwOXdneWJTYTVta3VjbVJMdEVRWi9wejB0TC9OVmNnV0FkOTVuRVEzVGc2dE5idXluM0llcHo2NUwzaHVNVVVCbnRsbFd1dTREYnRPRlNNU2JwSUxWNGZ5NndsTTBTT3ZpNkNwTGg4MWMxTHJlSXZLZDYxdUVXQmNEdzFsVUJVVzFJMForbS9QYVJsWCtQUS9veGcwWWU2S1VpSWlURjRBRE5rNTlZZHB0NS9ya3htcTl0VjVLY3AvZVFMVVZWbUJ6UU5WdXl0UUNQNkV6ZDBHOGVMeFd5SHBtWldKM2JBemtXVHRnNGxabHc0MlNRZXpFbWlVUGFKVXVSL3FrbFZBLzg3UzRBckZDcEFMZFkzUVJkVXczRzNYYldVcDZhcTl6MHpVaXpjUGE3MzUxcDlKWE9aeWZkWkJGbnF0OTBWelFuZFhCL213ZjhMQzlTVGo1a2VuVnBOdXFPUVFQM21JUkpqN2VWMjFGeEc4VkF4S3JFbjNjK1hmbVo4MDBFUGI5LzVsSWxpanNjVWJCNmRhMFJRYU1vb2swenVnMUcwdEtpL0pCQzRydzcvRDNtNEFSekFrek1jVnJEY1QyU3lGdFVkV0FzRmxzUERGcVYzTitFanlYYW9FZVB3cm9hWkNpTHFFemI4TVcrUE5FOVRtVEMwMUV6V2xpNTFQelp2VXFrbXl1Uk9VK1Y2aWsrTGUvOXFUNm53elV6Zjl0UDY4dFllaTBZYURHeDZrQWQ3am4xY0txT0N1WWJpRUxIOXpZcWNjNE1uUkpqa2VHaXFhR3dMSW1oeWVLcyt4S0pNQmxPSjA1b3c5Z0dDS1oxVnBuTUtvU0NUYk1TK1grMjN5MDQyek9iNU10Y1kvNm9CZUFvMVZ5ODlPVHlocGF2RlA3OGpYQ2NGSDB0N0d4MjRoTUVPbTJnc0VmR2FiVnBRZ3ZGcWJRS01za25GUlJtdVBIY1p1MFN1L1dNRnBoWnZCMnIvRUdiRzcycnBHR2hvM2grTXN6MHVHeko3aE5LMnVxUWlFMXFtbjB6Z2FjS1lZWkJDcXN4VitzamJwb1ZkU2lsVy9iOTRuMnhOYjY0OFZtTklvaXpxRVdoQm5zZW4rZDBrYkNQbVJJdGZXcVNCZU9kOVduZTNjNmJjZDZ1dlhPSjZXZGlTc3VYcTBuZGhxclE0UW9XVWpDall0WjBFQWhuU09QMW00NHhrZjBPN2pYZ2hyelNKV3hQNGEvdDcyalUyOVZ1MnJ2dTRuN0hmSGtrbVFPTUdTUytOUGVMR081STczbUMyQjcrbE1pQlFRWlJNOS85bGlMSWZvd3VwVUZBYlBCYlIrbHhETTZNOFB0Z2gxcGFKcTVSdnM3eUV1TFF2LzdkMW9VMndvRlNiM0ZNUFdRT0tNdUN1SjdwRERqcEljbHVzNVRlRW9NQnkyWWRWQjRmeG1lc2FDZU1Oc0VnVEhLUzVXRFNHeU5VT29FcGNDMk9GV3RJUmYwdzI3Y2szNC9EanhSVFZJY2M5K2txWkU2aU1TaVZEc2lLZFAvWHo1WGZFaG0vc0JoTzUwcDFydkpEbGt5eXh1SjlTUGdzN1llVUpCalhkZUFrRStQOU9RSm02U1pubjFzdmNkdUk3OGRZbWJrRTJtdHppUHJjalZpc1hHNzhzcEx2YlphU0Z4L1Jrczl6UDRMS24wQ2R6LzNKc2V0a1QwNkE4Zi95Q2dNTzZNYjFIbWUwSko3YjJ3WnoxcWxlcVR1S0JHb2toUFZVWjBkVnUrdG5RWU5FWTFmbWtaU3o2K0VHWjVFekw3NjU3bXJlWkdSM2pVZmFFazQ1OFBEbmlCenNTbUJLaERSemZYYW1lcnlKdjkvRDVtNkhJcVowUitvdUNFNTREenA0SUp1dUQxZTREYzVpK1BwU09SSmZHMjN1VmdxaXhBTUR2Y2hNUjBuWmRINWJyY2xZd1JvSlJXdi9ybHhHUkk1ZmZENU5QR21JRHQ3dkRFMTQzNHBZZFZaSUZoODlCczk0SEdHSmJUd3JOOFQ2bGgxSFpGVE9CNGxXeldqNkVWcXhTTXZDMC9saldCUTNGMmtjL21PMmI2dFdvblQySkVxRXdGdHM4cnoyaCtvV05kczljZVIyY2I3elp2SlREcHBIYUVoSzVhdldxc3NlV2EyRHQ1QkJoYWJkV1NrdFM4MG9NUXJMNFR2QU05YjVITW15RG5PK09ra2JNWGZVSkc3ZVhxVElHNmxxU09FYnFWUitxWWRQN3VXYjU3V0VKcXp5aDQxMUdBVnNEaW5QczdLdlVlWEl0bGNNZE9VV3pYQkg2enNjeW1WMUxMVkN0YzhJZVBvanpYSEY5bTViNXpHd0JSZHpjeVVKa2l1OTM4QXBtQWF5UmRKclgxUG1WZ3VXVXZ0MlRoUTYyY3pJdFR5V0pNVzJBbi9oZERmTUs3U2lGUWxHSWRBYmx0SHozeWNvaDdqOVY3R3hOV0JwYnRjU2RxbTRYeFJ3VGF3YzNjYloreGZTdjlxUWZFa0RLZlpUd0NrcVdHSS91cjI1MEl0WGxNbGg2dlVOV0VZSWc5QTNHemJnbWJxdlROOGpzMllNbzg3Q1U1eTZuWjRkYkpMRFFKajlmYzd5TTd0WnpKRFpGdHFPY1U4K21aallscTRWbWlmSTIzaUhiMVpvVDlFK2tUMmRvbG5QMUFmaU9rdDdQUUNTeWtCaVh5NW12NjM3SWVnV1NLajlJS3JZWmY0THU5K0k3dWIrbWtSZGx2WXplaGgvamFKOW43SFVINWIySWJnZU5ka1k3d3gxeVZ6eFM3cGJ2a3k2K25tVlV0UmxsRUZmd2VVUTAvbkcwMTdXb1VZU3hzK2oyQjRGVi9GNjJFdEhsTVdaWFlyakdIcHRobk5iMXg2NkxLWjBRZTkySU5XSGRmUi92cXAwMndNUzhyMUc0ZEpxSG9rOEttUTc5NDdHMTNhNFlYYnNHZ0hjQnZSdVZ1MWVBaTQvQTUrWml4bWRTWE03M0x1cEIvTEg3Tzl5eExUVlhKVHlCYkkxUzQ5VElST3JmVkNPYi9jelo5cE00SnNaeDhrVXo4ZFFHdjdnVVdLeFh2VEg3UU0vM0oyT3VYWGdjaVVocVkrY2d0YU9saVFRVk9ZdGhCTFYzeHBFU1pUM3JtZkVZTlp4bXBCYmIyNENSYW84NnBybitpOVROT2g4VnhSSkdYSmZYSEFUSkhzMVQ1dHhnYy9vcFlyWThYamxHUVFiUmNveElCY25Wc01qbVUxeW1tSVVMNGR2aUpYbmRNQUowWWV0K2M3TzUyL3A5OHl0bG1Bc0dCYVRBbU1oaW1BbnZwMVRXTkdNOUJwdWl0R2ordDgxMENVMlVob3JyalBLR3RUaFZDOFdhWHcwNFdGblQ1ZlRqcW1QeXJRMHROM0NrTHNjdFZ5MnhyMFpXZ2lXVloxT3JsRmpqeEpZc09pWnYyY0FvT3ZFKzdzWTBJL1R3V2NacU1veUlLTk9mdHdQN3crK1JmZzY3bGpmb3ZLWWE1MGlmM2Z6RS84YVBZVmV5L05xMzUrbkgyc0xQaC9mUDVUc3lsU0tHT1o0azY5ZDJQbkg0MytrcSsrc1JYSFFxR0FyV2R3aHgraHB3UUM2SmdUMnV4ZWhZVTRaYnc3b05iNi9ITGlrUHlKUk9HSzJvdXlyK3Z6c2VFU3A5RzUwVDRBeUZyU3FPUTBycm9DWVA0c01ERkJySG4zNDJFeVpUTWxTeWs0N3JIU3E4OVk5L25JM3pHNWxYMTZaNWx4cGhndUxPY1pVbmRMOHdOY3JreWpIODJqcWc4Qm84T1lreW5yeFp2YkZubzVsVVMzT1ByOEtvM21YOU5vUlBkWU9LS2pEMDdidmdGZ3BaL1JGK1l6a1d2Si9Icy90VWJmZUd6R1dMeE5BamZEekhITVZTRHdCNVNhYlFMc0laSGlCcDQzRmpHa2FpZW5Zb0RkMThodTJCR3dPSzdVM283MEsvV1kva3V1S2RtZHJ5a0lCVWRHMm12RTkxTDFKdFRiaDIwbU9MYmsxdkNBYW11N3V0bFhlR1Uyb29WaWtiVS9hY3RjZ21zQzFGS2sycW1qM0dXZUlXYmo0dEdJeEU3QkxjQldVdnZjbmQvbFl4c01WNEY5MTdmV2VGQi9YYklOTjNxR3ZJeVRwQ2FsejFsVmV3ZElHcWVBUy9nQjhNaStzQStCcURpWDNWR0QyZVV1blRSYlNZK0F1RHk0RTNReDNoQWh3blNYWCtCMHp1ajNlUTFtaVM4VnV4MnovbDYvQmtXdGpLR1U3MmFKa09DV2hHY1NmMytrRmtrQjE1dkdPc1FyU2RGcjZxVGowZ0JZaU9sbkJPNDExNzBnT1dIU1VvQlZSVTJKandwcFlkaElGRGZ1N3RJUkhjY1NOTTVLWk9GRFB6MFRHTUFqenpFcGVMd1RXcCtrbjIwMWtVNk5qYmlNUUp4ODMrTFgxZTF0WjEwa3VDaEpaL1hCVVExZHdhQkhqVERKRHFPeW1wRWs4WDJNM1Z0VncyMUprc0NoQTh3MXRUZWZPM1JKMUZNYnFaMDFiSEhrdWREQi9PaExmZTdQNUdPSGFJMjhaWEtUTXVxbzBoTFdRNEhhYkJzR0c3TmJQMVJpWHRFVHowNzRlcjZ3L09lckpXRXFqbWtxMnk1MXExQlZJK0pVdWRuVmEzb2dCcHpkaEZFN2ZDN2t5YnJBdDJaNlJxRGpBVEFVRVllWUs0NVdNdXBCS1FSdFFsVSt1TnNqbnpqNlptR3JlekErQVNyV3hRNkxNa0hSWHFYd05xN2Z0djI4ZFV4L1pTSmNpRFhQMlNXSnNXYU4wRmpQWDlZa282TG9iWjdhWVcvSWRVa3RJOWFwVEx5SFM4RHlXUHl1b1p5eE4xVEsvdnRmeGszSHdXaDZKY3paQzhGdG4wYklKYXkyZytuNXdkN2xtOXJFc0tPK3N2cVZtaStjMWo4OGhTQ3hienJnNCtIRVAwTnQxL0I2WVcxWFZtMDlUMUNwQUtqYzluMThoanFzYUZHZGZ5dmExWkcwWHUzaXA2TjZKR3B5VFNxWTVoNEJPbHBMUGFPbnl3NDVQZFhUTitEdEFLZzdETHJMRlRuV3Vzb1NCSGszczBkN1lvdUpIcTg1L1IwOVRmYzM3RU5YWkY0OGVBWUxucTlHTGlvTmN3RFpyQzZGVzZnb2RCOEpucVlVUHZuMHBXTGZRejBsTTBZeThNeWJnbjg0RHMzUTliRFAxMGJMeU9WK3F6eGE0UmQ5RGh1N2NqdThtTWFPTlhLM1VxbUJROXFJZzdldEl3RXFNL2tFQ2svRHpqYTRCczF4UitRL3RDYmM4SUtyU0dzVGRKSjB2Z2U3SUcyMFc2ODd1Vm1LNmljV1E2Y0QzbHdGemdOTUd0RnZPNXF5SmVLZmxHTEFBY1FaT3JreFZ3eTNjV3ZxbEdwdmptZjlRZTZBcDIwTVBiVjkyRFBWME9oRk00a3o4WXIwZmZDMnpMV1NRMWtxWTZRZFFydHRSM2toMVlMdFFkMWtDRXY1aFZvUElSV2w1RVJjVVR0dEJJcldwNlhzNUVoaDVPVVV3STVhRUJ2dWlEbVVvRU5tblZ3MUZvaENyYlJwMUExRStYU2xXVk9UaTdBRFcrNU9oYjl6MXZLNHF4NVI1bFBkR0NQQkpaMDBtQytTc3A4VlViZ3BHQXZYV011V1FRUmJDcUk2UnIyanR4Wnh0ZlA3Vy84b256K3l6MEdzNzZMYVQ1SFg5ZWN5aVpDQi9aUi9nRnRNeFBzRHdvaG9lQ1J0aXVMeEUxR00xdlVFVWdCdjg2K2VlaEw1OC9QNTZRRkdRL01xT2UvdkM3Nkw2M2p6bWVheDRleGQvT0tUVXZrWGcrZk9KVUh5Y2g5eHQvOWdvSk1yYXBTZ3ZYcmo4Kzh2ay9OODBmMjJTZXdqNmN5R3F0MUI2bXp0b2VrbFZISHJhb3VodkhKYUcvT3VCejZESEtNcEZtUVVMVTFiUldseVlFMFJQWFlZa1V5Y0llbU43VEx0Z05DSlg2QnFkeXhES2tlZ083bkpLNXhRN09WWURaVE1mOWJWSGlkdGs2RFFYOUV0K1Y5TTdlc2dic1lCZEVlVXBzQjBYdncya2Q5K3JJN1YrbTQ3dStPL3RxN213NzI2MkhVMVdsUzl1RnpzVjZKeElITm1VQ3kwUVM5ZTA3N0pHUkZiRzY1ejMvZE9LQi9aayt5RGRLcFVtZFhqbi9hUzNONW52NGZLN2JNSEhtUGxIZDRFMitpVGJWNXJwelNjUm54azZLQVJ1RFRKOFExTHBLMm1QOGdqMUVidUo5Ukl5WStFV0s0aENpSURCQVMxVG0ySUVYQUZmZ0tQZ2RMOU82bUFhMDZ3akNjVUFMNkVzeFBRV085Vk5lZ0JQbS8wR2drWmJEeEN5bnh1algvOTJ2bUdjalpSTUFZNDVwdWFrMnNGTENMU3dYcEVzeXk1Zm5GMGpHSkJobStmTlNIS0tVVWZ5KzI3NkE3L2ZlTE9GeHhVdUhSTkpJMk9zZW54eXZmOERBR09iVDYwcGZUVGxoRWc5dS9LS2toSnFtNVUxLytCRWNTa3BGREE1WGVDcXh3WG1QYWMxamN1WjNKV1ErcDBOZFd6Yi81djFadkY4R3RNVEZGRWRRanBMTzBid1BiMEJITlduaXAzbGlEWEkyZlhmMDVqanZmSjBOcGpMQ1VnZlRoOUNNRllWRktFZDRaL09HLzJDK040MzVtbksrOXQxZ3ZDaVZjYWFIN3JLNCtQakN2cFZOaXordDJReXFIMU84eDNKS1pWbDZRK0xwL1hLOHdNalZNc2xPcTlGZFN3NUZ0VXMvQ3B0WEg5UFcrd2JXSGdyVjE3UjVqVFZPdEd0S0Z1M25iODBUK0UwdHY5UWt6VzNKMmRiYXcvOGRkQUtaMHB4SWFFcUxqbFByamkzVmdKM0d2ZEZ2bHFEODA3NXdveGg0ZlZ0MEpaRTBLVkZzQXZxaGUwZHFOOWIzNWp0U3BuWU1Ya1UrdlpxK0lBSGFkM0lIYzJzL0xZcm5EMWFuZkc0NklGaU1JcjlvTmJaRFd2d3RocVlOcU9pZ2FLZC9YbExVNFhIZmsvUFhJalBzTHkvOS9rQXRRKy93S0graEkvSVJPV2o1RlB2VFpBVDlmN2o0WlhReUc0TTBUdWpNQUZYWWtLdkVIdjF4aHlTZWtnWEdHcU54V2VXS2xmOGREQWxMdUIxY2IvcU9EK3JrN2Ntd3QrMXlLcGs5Y3VkcUJhblRpNnpUYlhSdFY4cXlsTnRqeU9WS3kxSFR6MEdXOXJqdDZzU2pBWmNUNVIrS2R0eVliMHp5cUc5cFNMdUN3NVdCd0FuN2ZqQmpLTExveExYTUkrNTJMOWNMd0lSMkI2T2xsSlpMSEo4dkR4bVdkdEYrUUpubXQxcnNIUElXWTIwbGZ0azhmWWVQa0FJZzZIZ241MzJRb0lwZWdNeGlXZ0FPZmU1L1U0NEFQUjhBYzBOZVpyVmgzZ0VoczEyVyt0VlNpV2lVUWVrZi9ZQkVDVXk1ZmRZYkEwOGRkN1Z6UEFQOWFpVmNJQjlrNnRZN1dkSjF3TlYrYkhleWROdG1DNkc1SUN0RkMxWndtSlUvajhoZjBJOFRSVktTaXo1b1lJYTkzRXBVSTc4WDhHWUlBWmFieDQ3L244TERBQUowbk50UDFycFJPcHJxS01CUmVjU2hjYTZxWHVUU0kzalpCTE9CM1ZwMzgxQjVyQ0doalN2aC9OU1ZrWXAycUlkUC9CZz1cIjtcblxuLyoqXG4gKiBUaGUgbm9ybWFsIGRpY3Rpb25hcnktZGF0YS5qcyBpcyBxdWl0ZSBsYXJnZSwgd2hpY2ggbWFrZXMgaXRcbiAqIHVuc3VpdGFibGUgZm9yIGJyb3dzZXIgdXNhZ2UuIEluIG9yZGVyIHRvIG1ha2UgaXQgc21hbGxlcixcbiAqIHdlIHJlYWQgZGljdGlvbmFyeS5iaW4sIHdoaWNoIGlzIGEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mXG4gKiB0aGUgZGljdGlvbmFyeSwgYW5kIG9uIGluaXRpYWwgbG9hZCwgQnJvdGxpIGRlY29tcHJlc3Nlc1xuICogaXQncyBvd24gZGljdGlvbmFyeS4g8J+YnFxuICovXG5cbnZhciBpbml0ID0gZnVuY3Rpb24gaW5pdChCcm90bGlEZWNvbXByZXNzQnVmZmVyKSB7XG4gIHZhciBjb21wcmVzc2VkID0gYmFzZTY0SnMkMS50b0J5dGVBcnJheShkaWN0aW9uYXJ5X2Jpbik7XG4gIHJldHVybiBCcm90bGlEZWNvbXByZXNzQnVmZmVyKGNvbXByZXNzZWQpO1xufTtcblxudmFyIGRpY3Rpb25hcnlEYXRhQ29tcHJlc3NlZCA9IHtcbiAgaW5pdDogaW5pdFxufTtcblxudmFyIGRpY3Rpb25hcnkgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gIC8qIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gIFxuICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBcbiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFxuICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIFxuICAgICBDb2xsZWN0aW9uIG9mIHN0YXRpYyBkaWN0aW9uYXJ5IHdvcmRzLlxuICAqL1xuICBleHBvcnRzLmluaXQgPSBmdW5jdGlvbiAoQnJvdGxpRGVjb21wcmVzc0J1ZmZlcikge1xuICAgIGV4cG9ydHMuZGljdGlvbmFyeSA9IGRpY3Rpb25hcnlEYXRhQ29tcHJlc3NlZC5pbml0KEJyb3RsaURlY29tcHJlc3NCdWZmZXIpO1xuICB9O1xuXG4gIGV4cG9ydHMub2Zmc2V0c0J5TGVuZ3RoID0gbmV3IFVpbnQzMkFycmF5KFswLCAwLCAwLCAwLCAwLCA0MDk2LCA5MjE2LCAyMTUwNCwgMzU4NDAsIDQ0MDMyLCA1MzI0OCwgNjM0ODgsIDc0NzUyLCA4NzA0MCwgOTM2OTYsIDEwMDg2NCwgMTA0NzA0LCAxMDY3NTIsIDEwODkyOCwgMTEzNTM2LCAxMTU5NjgsIDExODUyOCwgMTE5ODcyLCAxMjEyODAsIDEyMjAxNl0pO1xuICBleHBvcnRzLnNpemVCaXRzQnlMZW5ndGggPSBuZXcgVWludDhBcnJheShbMCwgMCwgMCwgMCwgMTAsIDEwLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgOSwgOSwgOCwgNywgNywgOCwgNywgNywgNiwgNiwgNSwgNV0pO1xuICBleHBvcnRzLm1pbkRpY3Rpb25hcnlXb3JkTGVuZ3RoID0gNDtcbiAgZXhwb3J0cy5tYXhEaWN0aW9uYXJ5V29yZExlbmd0aCA9IDI0O1xufSk7XG52YXIgZGljdGlvbmFyeV8xID0gZGljdGlvbmFyeS5pbml0O1xudmFyIGRpY3Rpb25hcnlfMiA9IGRpY3Rpb25hcnkuZGljdGlvbmFyeTtcbnZhciBkaWN0aW9uYXJ5XzMgPSBkaWN0aW9uYXJ5Lm9mZnNldHNCeUxlbmd0aDtcbnZhciBkaWN0aW9uYXJ5XzQgPSBkaWN0aW9uYXJ5LnNpemVCaXRzQnlMZW5ndGg7XG52YXIgZGljdGlvbmFyeV81ID0gZGljdGlvbmFyeS5taW5EaWN0aW9uYXJ5V29yZExlbmd0aDtcbnZhciBkaWN0aW9uYXJ5XzYgPSBkaWN0aW9uYXJ5Lm1heERpY3Rpb25hcnlXb3JkTGVuZ3RoO1xuXG5mdW5jdGlvbiBIdWZmbWFuQ29kZShiaXRzLCB2YWx1ZSkge1xuICB0aGlzLmJpdHMgPSBiaXRzO1xuICAvKiBudW1iZXIgb2YgYml0cyB1c2VkIGZvciB0aGlzIHN5bWJvbCAqL1xuXG4gIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgLyogc3ltYm9sIHZhbHVlIG9yIHRhYmxlIG9mZnNldCAqL1xufVxuXG52YXIgSHVmZm1hbkNvZGVfMSA9IEh1ZmZtYW5Db2RlO1xudmFyIE1BWF9MRU5HVEggPSAxNTtcbi8qIFJldHVybnMgcmV2ZXJzZShyZXZlcnNlKGtleSwgbGVuKSArIDEsIGxlbiksIHdoZXJlIHJldmVyc2Uoa2V5LCBsZW4pIGlzIHRoZVxuICAgYml0LXdpc2UgcmV2ZXJzYWwgb2YgdGhlIGxlbiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIGtleS4gKi9cblxuZnVuY3Rpb24gR2V0TmV4dEtleShrZXksIGxlbikge1xuICB2YXIgc3RlcCA9IDEgPDwgbGVuIC0gMTtcblxuICB3aGlsZSAoa2V5ICYgc3RlcCkge1xuICAgIHN0ZXAgPj49IDE7XG4gIH1cblxuICByZXR1cm4gKGtleSAmIHN0ZXAgLSAxKSArIHN0ZXA7XG59XG4vKiBTdG9yZXMgY29kZSBpbiB0YWJsZVswXSwgdGFibGVbc3RlcF0sIHRhYmxlWzIqc3RlcF0sIC4uLiwgdGFibGVbZW5kXSAqL1xuXG4vKiBBc3N1bWVzIHRoYXQgZW5kIGlzIGFuIGludGVnZXIgbXVsdGlwbGUgb2Ygc3RlcCAqL1xuXG5cbmZ1bmN0aW9uIFJlcGxpY2F0ZVZhbHVlKHRhYmxlLCBpLCBzdGVwLCBlbmQsIGNvZGUpIHtcbiAgZG8ge1xuICAgIGVuZCAtPSBzdGVwO1xuICAgIHRhYmxlW2kgKyBlbmRdID0gbmV3IEh1ZmZtYW5Db2RlKGNvZGUuYml0cywgY29kZS52YWx1ZSk7XG4gIH0gd2hpbGUgKGVuZCA+IDApO1xufVxuLyogUmV0dXJucyB0aGUgdGFibGUgd2lkdGggb2YgdGhlIG5leHQgMm5kIGxldmVsIHRhYmxlLiBjb3VudCBpcyB0aGUgaGlzdG9ncmFtXG4gICBvZiBiaXQgbGVuZ3RocyBmb3IgdGhlIHJlbWFpbmluZyBzeW1ib2xzLCBsZW4gaXMgdGhlIGNvZGUgbGVuZ3RoIG9mIHRoZSBuZXh0XG4gICBwcm9jZXNzZWQgc3ltYm9sICovXG5cblxuZnVuY3Rpb24gTmV4dFRhYmxlQml0U2l6ZShjb3VudCwgbGVuLCByb290X2JpdHMpIHtcbiAgdmFyIGxlZnQgPSAxIDw8IGxlbiAtIHJvb3RfYml0cztcblxuICB3aGlsZSAobGVuIDwgTUFYX0xFTkdUSCkge1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8PSAwKSBicmVhaztcbiAgICArK2xlbjtcbiAgICBsZWZ0IDw8PSAxO1xuICB9XG5cbiAgcmV0dXJuIGxlbiAtIHJvb3RfYml0cztcbn1cblxudmFyIEJyb3RsaUJ1aWxkSHVmZm1hblRhYmxlID0gZnVuY3Rpb24gQnJvdGxpQnVpbGRIdWZmbWFuVGFibGUocm9vdF90YWJsZSwgdGFibGUsIHJvb3RfYml0cywgY29kZV9sZW5ndGhzLCBjb2RlX2xlbmd0aHNfc2l6ZSkge1xuICB2YXIgc3RhcnRfdGFibGUgPSB0YWJsZTtcbiAgdmFyIGNvZGU7XG4gIC8qIGN1cnJlbnQgdGFibGUgZW50cnkgKi9cblxuICB2YXIgbGVuO1xuICAvKiBjdXJyZW50IGNvZGUgbGVuZ3RoICovXG5cbiAgdmFyIHN5bWJvbDtcbiAgLyogc3ltYm9sIGluZGV4IGluIG9yaWdpbmFsIG9yIHNvcnRlZCB0YWJsZSAqL1xuXG4gIHZhciBrZXk7XG4gIC8qIHJldmVyc2VkIHByZWZpeCBjb2RlICovXG5cbiAgdmFyIHN0ZXA7XG4gIC8qIHN0ZXAgc2l6ZSB0byByZXBsaWNhdGUgdmFsdWVzIGluIGN1cnJlbnQgdGFibGUgKi9cblxuICB2YXIgbG93O1xuICAvKiBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5ICovXG5cbiAgdmFyIG1hc2s7XG4gIC8qIG1hc2sgZm9yIGxvdyBiaXRzICovXG5cbiAgdmFyIHRhYmxlX2JpdHM7XG4gIC8qIGtleSBsZW5ndGggb2YgY3VycmVudCB0YWJsZSAqL1xuXG4gIHZhciB0YWJsZV9zaXplO1xuICAvKiBzaXplIG9mIGN1cnJlbnQgdGFibGUgKi9cblxuICB2YXIgdG90YWxfc2l6ZTtcbiAgLyogc3VtIG9mIHJvb3QgdGFibGUgc2l6ZSBhbmQgMm5kIGxldmVsIHRhYmxlIHNpemVzICovXG5cbiAgdmFyIHNvcnRlZDtcbiAgLyogc3ltYm9scyBzb3J0ZWQgYnkgY29kZSBsZW5ndGggKi9cblxuICB2YXIgY291bnQgPSBuZXcgSW50MzJBcnJheShNQVhfTEVOR1RIICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqL1xuXG4gIHZhciBvZmZzZXQgPSBuZXcgSW50MzJBcnJheShNQVhfTEVOR1RIICsgMSk7XG4gIC8qIG9mZnNldHMgaW4gc29ydGVkIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqL1xuXG4gIHNvcnRlZCA9IG5ldyBJbnQzMkFycmF5KGNvZGVfbGVuZ3Roc19zaXplKTtcbiAgLyogYnVpbGQgaGlzdG9ncmFtIG9mIGNvZGUgbGVuZ3RocyAqL1xuXG4gIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgY29kZV9sZW5ndGhzX3NpemU7IHN5bWJvbCsrKSB7XG4gICAgY291bnRbY29kZV9sZW5ndGhzW3N5bWJvbF1dKys7XG4gIH1cbiAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHNvcnRlZCBzeW1ib2wgdGFibGUgYnkgY29kZSBsZW5ndGggKi9cblxuXG4gIG9mZnNldFsxXSA9IDA7XG5cbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhfTEVOR1RIOyBsZW4rKykge1xuICAgIG9mZnNldFtsZW4gKyAxXSA9IG9mZnNldFtsZW5dICsgY291bnRbbGVuXTtcbiAgfVxuICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovXG5cblxuICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IGNvZGVfbGVuZ3Roc19zaXplOyBzeW1ib2wrKykge1xuICAgIGlmIChjb2RlX2xlbmd0aHNbc3ltYm9sXSAhPT0gMCkge1xuICAgICAgc29ydGVkW29mZnNldFtjb2RlX2xlbmd0aHNbc3ltYm9sXV0rK10gPSBzeW1ib2w7XG4gICAgfVxuICB9XG5cbiAgdGFibGVfYml0cyA9IHJvb3RfYml0cztcbiAgdGFibGVfc2l6ZSA9IDEgPDwgdGFibGVfYml0cztcbiAgdG90YWxfc2l6ZSA9IHRhYmxlX3NpemU7XG4gIC8qIHNwZWNpYWwgY2FzZSBjb2RlIHdpdGggb25seSBvbmUgdmFsdWUgKi9cblxuICBpZiAob2Zmc2V0W01BWF9MRU5HVEhdID09PSAxKSB7XG4gICAgZm9yIChrZXkgPSAwOyBrZXkgPCB0b3RhbF9zaXplOyArK2tleSkge1xuICAgICAgcm9vdF90YWJsZVt0YWJsZSArIGtleV0gPSBuZXcgSHVmZm1hbkNvZGUoMCwgc29ydGVkWzBdICYgMHhmZmZmKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG90YWxfc2l6ZTtcbiAgfVxuICAvKiBmaWxsIGluIHJvb3QgdGFibGUgKi9cblxuXG4gIGtleSA9IDA7XG4gIHN5bWJvbCA9IDA7XG5cbiAgZm9yIChsZW4gPSAxLCBzdGVwID0gMjsgbGVuIDw9IHJvb3RfYml0czsgKytsZW4sIHN0ZXAgPDw9IDEpIHtcbiAgICBmb3IgKDsgY291bnRbbGVuXSA+IDA7IC0tY291bnRbbGVuXSkge1xuICAgICAgY29kZSA9IG5ldyBIdWZmbWFuQ29kZShsZW4gJiAweGZmLCBzb3J0ZWRbc3ltYm9sKytdICYgMHhmZmZmKTtcbiAgICAgIFJlcGxpY2F0ZVZhbHVlKHJvb3RfdGFibGUsIHRhYmxlICsga2V5LCBzdGVwLCB0YWJsZV9zaXplLCBjb2RlKTtcbiAgICAgIGtleSA9IEdldE5leHRLZXkoa2V5LCBsZW4pO1xuICAgIH1cbiAgfVxuICAvKiBmaWxsIGluIDJuZCBsZXZlbCB0YWJsZXMgYW5kIGFkZCBwb2ludGVycyB0byByb290IHRhYmxlICovXG5cblxuICBtYXNrID0gdG90YWxfc2l6ZSAtIDE7XG4gIGxvdyA9IC0xO1xuXG4gIGZvciAobGVuID0gcm9vdF9iaXRzICsgMSwgc3RlcCA9IDI7IGxlbiA8PSBNQVhfTEVOR1RIOyArK2xlbiwgc3RlcCA8PD0gMSkge1xuICAgIGZvciAoOyBjb3VudFtsZW5dID4gMDsgLS1jb3VudFtsZW5dKSB7XG4gICAgICBpZiAoKGtleSAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgICAgdGFibGUgKz0gdGFibGVfc2l6ZTtcbiAgICAgICAgdGFibGVfYml0cyA9IE5leHRUYWJsZUJpdFNpemUoY291bnQsIGxlbiwgcm9vdF9iaXRzKTtcbiAgICAgICAgdGFibGVfc2l6ZSA9IDEgPDwgdGFibGVfYml0cztcbiAgICAgICAgdG90YWxfc2l6ZSArPSB0YWJsZV9zaXplO1xuICAgICAgICBsb3cgPSBrZXkgJiBtYXNrO1xuICAgICAgICByb290X3RhYmxlW3N0YXJ0X3RhYmxlICsgbG93XSA9IG5ldyBIdWZmbWFuQ29kZSh0YWJsZV9iaXRzICsgcm9vdF9iaXRzICYgMHhmZiwgdGFibGUgLSBzdGFydF90YWJsZSAtIGxvdyAmIDB4ZmZmZik7XG4gICAgICB9XG5cbiAgICAgIGNvZGUgPSBuZXcgSHVmZm1hbkNvZGUobGVuIC0gcm9vdF9iaXRzICYgMHhmZiwgc29ydGVkW3N5bWJvbCsrXSAmIDB4ZmZmZik7XG4gICAgICBSZXBsaWNhdGVWYWx1ZShyb290X3RhYmxlLCB0YWJsZSArIChrZXkgPj4gcm9vdF9iaXRzKSwgc3RlcCwgdGFibGVfc2l6ZSwgY29kZSk7XG4gICAgICBrZXkgPSBHZXROZXh0S2V5KGtleSwgbGVuKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxfc2l6ZTtcbn07XG5cbnZhciBodWZmbWFuID0ge1xuICBIdWZmbWFuQ29kZTogSHVmZm1hbkNvZGVfMSxcbiAgQnJvdGxpQnVpbGRIdWZmbWFuVGFibGU6IEJyb3RsaUJ1aWxkSHVmZm1hblRhYmxlXG59O1xuXG4vKiBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXG4gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4gICBMb29rdXAgdGFibGUgdG8gbWFwIHRoZSBwcmV2aW91cyB0d28gYnl0ZXMgdG8gYSBjb250ZXh0IGlkLlxuXG4gICBUaGVyZSBhcmUgZm91ciBkaWZmZXJlbnQgY29udGV4dCBtb2RlbGluZyBtb2RlcyBkZWZpbmVkIGhlcmU6XG4gICAgIENPTlRFWFRfTFNCNjogY29udGV4dCBpZCBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNiBiaXRzIG9mIHRoZSBsYXN0IGJ5dGUsXG4gICAgIENPTlRFWFRfTVNCNjogY29udGV4dCBpZCBpcyB0aGUgbW9zdCBzaWduaWZpY2FudCA2IGJpdHMgb2YgdGhlIGxhc3QgYnl0ZSxcbiAgICAgQ09OVEVYVF9VVEY4OiBzZWNvbmQtb3JkZXIgY29udGV4dCBtb2RlbCB0dW5lZCBmb3IgVVRGOC1lbmNvZGVkIHRleHQsXG4gICAgIENPTlRFWFRfU0lHTkVEOiBzZWNvbmQtb3JkZXIgY29udGV4dCBtb2RlbCB0dW5lZCBmb3Igc2lnbmVkIGludGVnZXJzLlxuXG4gICBUaGUgY29udGV4dCBpZCBmb3IgdGhlIFVURjggY29udGV4dCBtb2RlbCBpcyBjYWxjdWxhdGVkIGFzIGZvbGxvd3MuIElmIHAxXG4gICBhbmQgcDIgYXJlIHRoZSBwcmV2aW91cyB0d28gYnl0ZXMsIHdlIGNhbGN1YWx0ZSB0aGUgY29udGV4dCBhc1xuXG4gICAgIGNvbnRleHQgPSBrQ29udGV4dExvb2t1cFtwMV0gfCBrQ29udGV4dExvb2t1cFtwMiArIDI1Nl0uXG5cbiAgIElmIHRoZSBwcmV2aW91cyB0d28gYnl0ZXMgYXJlIEFTQ0lJIGNoYXJhY3RlcnMgKGkuZS4gPCAxMjgpLCB0aGlzIHdpbGwgYmVcbiAgIGVxdWl2YWxlbnQgdG9cblxuICAgICBjb250ZXh0ID0gNCAqIGNvbnRleHQxKHAxKSArIGNvbnRleHQyKHAyKSxcblxuICAgd2hlcmUgY29udGV4dDEgaXMgYmFzZWQgb24gdGhlIHByZXZpb3VzIGJ5dGUgaW4gdGhlIGZvbGxvd2luZyB3YXk6XG5cbiAgICAgMCAgOiBub24tQVNDSUkgY29udHJvbFxuICAgICAxICA6IFxcdCwgXFxuLCBcXHJcbiAgICAgMiAgOiBzcGFjZVxuICAgICAzICA6IG90aGVyIHB1bmN0dWF0aW9uXG4gICAgIDQgIDogXCIgJ1xuICAgICA1ICA6ICVcbiAgICAgNiAgOiAoIDwgWyB7XG4gICAgIDcgIDogKSA+IF0gfVxuICAgICA4ICA6ICwgOyA6XG4gICAgIDkgIDogLlxuICAgICAxMCA6ID1cbiAgICAgMTEgOiBudW1iZXJcbiAgICAgMTIgOiB1cHBlci1jYXNlIHZvd2VsXG4gICAgIDEzIDogdXBwZXItY2FzZSBjb25zb25hbnRcbiAgICAgMTQgOiBsb3dlci1jYXNlIHZvd2VsXG4gICAgIDE1IDogbG93ZXItY2FzZSBjb25zb25hbnRcblxuICAgYW5kIGNvbnRleHQyIGlzIGJhc2VkIG9uIHRoZSBzZWNvbmQgbGFzdCBieXRlOlxuXG4gICAgIDAgOiBjb250cm9sLCBzcGFjZVxuICAgICAxIDogcHVuY3R1YXRpb25cbiAgICAgMiA6IHVwcGVyLWNhc2UgbGV0dGVyLCBudW1iZXJcbiAgICAgMyA6IGxvd2VyLWNhc2UgbGV0dGVyXG5cbiAgIElmIHRoZSBsYXN0IGJ5dGUgaXMgQVNDSUksIGFuZCB0aGUgc2Vjb25kIGxhc3QgYnl0ZSBpcyBub3QgKGluIGEgdmFsaWQgVVRGOFxuICAgc3RyZWFtIGl0IHdpbGwgYmUgYSBjb250aW51YXRpb24gYnl0ZSwgdmFsdWUgYmV0d2VlbiAxMjggYW5kIDE5MSksIHRoZVxuICAgY29udGV4dCBpcyB0aGUgc2FtZSBhcyBpZiB0aGUgc2Vjb25kIGxhc3QgYnl0ZSB3YXMgYW4gQVNDSUkgY29udHJvbCBvciBzcGFjZS5cblxuICAgSWYgdGhlIGxhc3QgYnl0ZSBpcyBhIFVURjggbGVhZCBieXRlICh2YWx1ZSA+PSAxOTIpLCB0aGVuIHRoZSBuZXh0IGJ5dGUgd2lsbFxuICAgYmUgYSBjb250aW51YXRpb24gYnl0ZSBhbmQgdGhlIGNvbnRleHQgaWQgaXMgMiBvciAzIGRlcGVuZGluZyBvbiB0aGUgTFNCIG9mXG4gICB0aGUgbGFzdCBieXRlIGFuZCB0byBhIGxlc3NlciBleHRlbnQgb24gdGhlIHNlY29uZCBsYXN0IGJ5dGUgaWYgaXQgaXMgQVNDSUkuXG5cbiAgIElmIHRoZSBsYXN0IGJ5dGUgaXMgYSBVVEY4IGNvbnRpbnVhdGlvbiBieXRlLCB0aGUgc2Vjb25kIGxhc3QgYnl0ZSBjYW4gYmU6XG4gICAgIC0gY29udGludWF0aW9uIGJ5dGU6IHRoZSBuZXh0IGJ5dGUgaXMgcHJvYmFibHkgQVNDSUkgb3IgbGVhZCBieXRlIChhc3N1bWluZ1xuICAgICAgIDQtYnl0ZSBVVEY4IGNoYXJhY3RlcnMgYXJlIHJhcmUpIGFuZCB0aGUgY29udGV4dCBpZCBpcyAwIG9yIDEuXG4gICAgIC0gbGVhZCBieXRlICgxOTIgLSAyMDcpOiBuZXh0IGJ5dGUgaXMgQVNDSUkgb3IgbGVhZCBieXRlLCBjb250ZXh0IGlzIDAgb3IgMVxuICAgICAtIGxlYWQgYnl0ZSAoMjA4IC0gMjU1KTogbmV4dCBieXRlIGlzIGNvbnRpbnVhdGlvbiBieXRlLCBjb250ZXh0IGlzIDIgb3IgM1xuXG4gICBUaGUgcG9zc2libGUgdmFsdWUgY29tYmluYXRpb25zIG9mIHRoZSBwcmV2aW91cyB0d28gYnl0ZXMsIHRoZSByYW5nZSBvZlxuICAgY29udGV4dCBpZHMgYW5kIHRoZSB0eXBlIG9mIHRoZSBuZXh0IGJ5dGUgaXMgc3VtbWFyaXplZCBpbiB0aGUgdGFibGUgYmVsb3c6XG5cbiAgIHwtLS0tLS0tLVxcLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gICB8ICAgICAgICAgXFwgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdCBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgfCBTZWNvbmQgICBcXC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgIHwgbGFzdCBieXRlIFxcICAgIEFTQ0lJICAgICAgICAgICAgfCAgIGNvbnQuIGJ5dGUgICAgICAgIHwgICBsZWFkIGJ5dGUgICAgICB8XG4gICB8ICAgICAgICAgICAgXFwgICAoMC0xMjcpICAgICAgICAgIHwgICAoMTI4LTE5MSkgICAgICAgICB8ICAgKDE5Mi0pICAgICAgICAgfFxuICAgfD09PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09fFxuICAgfCAgQVNDSUkgICAgICB8IG5leHQ6IEFTQ0lJL2xlYWQgIHwgIG5vdCB2YWxpZCAgICAgICAgICB8ICBuZXh0OiBjb250LiAgICAgfFxuICAgfCAgKDAtMTI3KSAgICB8IGNvbnRleHQ6IDQgLSA2MyAgIHwgICAgICAgICAgICAgICAgICAgICB8ICBjb250ZXh0OiAyIC0gMyAgfFxuICAgfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgfCAgY29udC4gYnl0ZSB8IG5leHQ6IEFTQ0lJL2xlYWQgIHwgIG5leHQ6IEFTQ0lJL2xlYWQgICB8ICBuZXh0OiBjb250LiAgICAgfFxuICAgfCAgKDEyOC0xOTEpICB8IGNvbnRleHQ6IDQgLSA2MyAgIHwgIGNvbnRleHQ6IDAgLSAxICAgICB8ICBjb250ZXh0OiAyIC0gMyAgfFxuICAgfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgfCAgbGVhZCBieXRlICB8IG5vdCB2YWxpZCAgICAgICAgIHwgIG5leHQ6IEFTQ0lJL2xlYWQgICB8ICBub3QgdmFsaWQgICAgICAgfFxuICAgfCAgKDE5Mi0yMDcpICB8ICAgICAgICAgICAgICAgICAgIHwgIGNvbnRleHQ6IDAgLSAxICAgICB8ICAgICAgICAgICAgICAgICAgfFxuICAgfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgfCAgbGVhZCBieXRlICB8IG5vdCB2YWxpZCAgICAgICAgIHwgIG5leHQ6IGNvbnQuICAgICAgICB8ICBub3QgdmFsaWQgICAgICAgfFxuICAgfCAgKDIwOC0pICAgICB8ICAgICAgICAgICAgICAgICAgIHwgIGNvbnRleHQ6IDIgLSAzICAgICB8ICAgICAgICAgICAgICAgICAgfFxuICAgfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfFxuXG4gICBUaGUgY29udGV4dCBpZCBmb3IgdGhlIHNpZ25lZCBjb250ZXh0IG1vZGUgaXMgY2FsY3VsYXRlZCBhczpcblxuICAgICBjb250ZXh0ID0gKGtDb250ZXh0TG9va3VwWzUxMiArIHAxXSA8PCAzKSB8IGtDb250ZXh0TG9va3VwWzUxMiArIHAyXS5cblxuICAgRm9yIGFueSBjb250ZXh0IG1vZGVsaW5nIG1vZGVzLCB0aGUgY29udGV4dCBpZHMgY2FuIGJlIGNhbGN1bGF0ZWQgYnkgfC1pbmdcbiAgIHRvZ2V0aGVyIHR3byBsb29rdXBzIGZyb20gb25lIHRhYmxlIHVzaW5nIGNvbnRleHQgbW9kZWwgZGVwZW5kZW50IG9mZnNldHM6XG5cbiAgICAgY29udGV4dCA9IGtDb250ZXh0TG9va3VwW29mZnNldDEgKyBwMV0gfCBrQ29udGV4dExvb2t1cFtvZmZzZXQyICsgcDJdLlxuXG4gICB3aGVyZSBvZmZzZXQxIGFuZCBvZmZzZXQyIGFyZSBkZXBlbmRlbnQgb24gdGhlIGNvbnRleHQgbW9kZS5cbiovXG4vKiBDb21tb24gY29udGV4dCBsb29rdXAgdGFibGUgZm9yIGFsbCBjb250ZXh0IG1vZGVzLiAqL1xuXG52YXIgbG9va3VwJDIgPSBuZXcgVWludDhBcnJheShbXG4vKiBDT05URVhUX1VURjgsIGxhc3QgYnl0ZS4gKi9cblxuLyogQVNDSUkgcmFuZ2UuICovXG4wLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA0LCA0LCAwLCAwLCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA4LCAxMiwgMTYsIDEyLCAxMiwgMjAsIDEyLCAxNiwgMjQsIDI4LCAxMiwgMTIsIDMyLCAxMiwgMzYsIDEyLCA0NCwgNDQsIDQ0LCA0NCwgNDQsIDQ0LCA0NCwgNDQsIDQ0LCA0NCwgMzIsIDMyLCAyNCwgNDAsIDI4LCAxMiwgMTIsIDQ4LCA1MiwgNTIsIDUyLCA0OCwgNTIsIDUyLCA1MiwgNDgsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNDgsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNDgsIDUyLCA1MiwgNTIsIDUyLCA1MiwgMjQsIDEyLCAyOCwgMTIsIDEyLCAxMiwgNTYsIDYwLCA2MCwgNjAsIDU2LCA2MCwgNjAsIDYwLCA1NiwgNjAsIDYwLCA2MCwgNjAsIDYwLCA1NiwgNjAsIDYwLCA2MCwgNjAsIDYwLCA1NiwgNjAsIDYwLCA2MCwgNjAsIDYwLCAyNCwgMTIsIDI4LCAxMiwgMCxcbi8qIFVURjggY29udGludWF0aW9uIGJ5dGUgcmFuZ2UuICovXG4wLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLFxuLyogVVRGOCBsZWFkIGJ5dGUgcmFuZ2UuICovXG4yLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLFxuLyogQ09OVEVYVF9VVEY4IHNlY29uZCBsYXN0IGJ5dGUuICovXG5cbi8qIEFTQ0lJIHJhbmdlLiAqL1xuMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMSwgMSwgMSwgMSwgMCxcbi8qIFVURjggY29udGludWF0aW9uIGJ5dGUgcmFuZ2UuICovXG4wLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuLyogVVRGOCBsZWFkIGJ5dGUgcmFuZ2UuICovXG4wLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLFxuLyogQ09OVEVYVF9TSUdORUQsIHNlY29uZCBsYXN0IGJ5dGUuICovXG4wLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA3LFxuLyogQ09OVEVYVF9TSUdORUQsIGxhc3QgYnl0ZSwgc2FtZSBhcyB0aGUgYWJvdmUgdmFsdWVzIHNoaWZ0ZWQgYnkgMyBiaXRzLiAqL1xuMCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA1Nixcbi8qIENPTlRFWFRfTFNCNiwgbGFzdCBieXRlLiAqL1xuMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2Myxcbi8qIENPTlRFWFRfTVNCNiwgbGFzdCBieXRlLiAqL1xuMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNiwgNiwgNiwgNiwgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOSwgOSwgOSwgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsIDIzLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwgMjUsIDI1LCAyNSwgMjUsIDI2LCAyNiwgMjYsIDI2LCAyNywgMjcsIDI3LCAyNywgMjgsIDI4LCAyOCwgMjgsIDI5LCAyOSwgMjksIDI5LCAzMCwgMzAsIDMwLCAzMCwgMzEsIDMxLCAzMSwgMzEsIDMyLCAzMiwgMzIsIDMyLCAzMywgMzMsIDMzLCAzMywgMzQsIDM0LCAzNCwgMzQsIDM1LCAzNSwgMzUsIDM1LCAzNiwgMzYsIDM2LCAzNiwgMzcsIDM3LCAzNywgMzcsIDM4LCAzOCwgMzgsIDM4LCAzOSwgMzksIDM5LCAzOSwgNDAsIDQwLCA0MCwgNDAsIDQxLCA0MSwgNDEsIDQxLCA0MiwgNDIsIDQyLCA0MiwgNDMsIDQzLCA0MywgNDMsIDQ0LCA0NCwgNDQsIDQ0LCA0NSwgNDUsIDQ1LCA0NSwgNDYsIDQ2LCA0NiwgNDYsIDQ3LCA0NywgNDcsIDQ3LCA0OCwgNDgsIDQ4LCA0OCwgNDksIDQ5LCA0OSwgNDksIDUwLCA1MCwgNTAsIDUwLCA1MSwgNTEsIDUxLCA1MSwgNTIsIDUyLCA1MiwgNTIsIDUzLCA1MywgNTMsIDUzLCA1NCwgNTQsIDU0LCA1NCwgNTUsIDU1LCA1NSwgNTUsIDU2LCA1NiwgNTYsIDU2LCA1NywgNTcsIDU3LCA1NywgNTgsIDU4LCA1OCwgNTgsIDU5LCA1OSwgNTksIDU5LCA2MCwgNjAsIDYwLCA2MCwgNjEsIDYxLCA2MSwgNjEsIDYyLCA2MiwgNjIsIDYyLCA2MywgNjMsIDYzLCA2Myxcbi8qIENPTlRFWFRfe00sTH1TQjYsIHNlY29uZCBsYXN0IGJ5dGUsICovXG4wLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSk7XG52YXIgbG9va3VwT2Zmc2V0cyA9IG5ldyBVaW50MTZBcnJheShbXG4vKiBDT05URVhUX0xTQjYgKi9cbjEwMjQsIDE1MzYsXG4vKiBDT05URVhUX01TQjYgKi9cbjEyODAsIDE1MzYsXG4vKiBDT05URVhUX1VURjggKi9cbjAsIDI1Nixcbi8qIENPTlRFWFRfU0lHTkVEICovXG43NjgsIDUxMl0pO1xudmFyIGNvbnRleHQgPSB7XG4gIGxvb2t1cDogbG9va3VwJDIsXG4gIGxvb2t1cE9mZnNldHM6IGxvb2t1cE9mZnNldHNcbn07XG5cbi8qIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cbiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiAgIExvb2t1cCB0YWJsZXMgdG8gbWFwIHByZWZpeCBjb2RlcyB0byB2YWx1ZSByYW5nZXMuIFRoaXMgaXMgdXNlZCBkdXJpbmdcbiAgIGRlY29kaW5nIG9mIHRoZSBibG9jayBsZW5ndGhzLCBsaXRlcmFsIGluc2VydGlvbiBsZW5ndGhzIGFuZCBjb3B5IGxlbmd0aHMuXG4qL1xuXG4vKiBSZXByZXNlbnRzIHRoZSByYW5nZSBvZiB2YWx1ZXMgYmVsb25naW5nIHRvIGEgcHJlZml4IGNvZGU6ICovXG5cbi8qIFtvZmZzZXQsIG9mZnNldCArIDJebmJpdHMpICovXG5mdW5jdGlvbiBQcmVmaXhDb2RlUmFuZ2Uob2Zmc2V0LCBuYml0cykge1xuICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgdGhpcy5uYml0cyA9IG5iaXRzO1xufVxuXG52YXIga0Jsb2NrTGVuZ3RoUHJlZml4Q29kZSA9IFtuZXcgUHJlZml4Q29kZVJhbmdlKDEsIDIpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDUsIDIpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDksIDIpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDEzLCAyKSwgbmV3IFByZWZpeENvZGVSYW5nZSgxNywgMyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMjUsIDMpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDMzLCAzKSwgbmV3IFByZWZpeENvZGVSYW5nZSg0MSwgMyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNDksIDQpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDY1LCA0KSwgbmV3IFByZWZpeENvZGVSYW5nZSg4MSwgNCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoOTcsIDQpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDExMywgNSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTQ1LCA1KSwgbmV3IFByZWZpeENvZGVSYW5nZSgxNzcsIDUpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDIwOSwgNSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMjQxLCA2KSwgbmV3IFByZWZpeENvZGVSYW5nZSgzMDUsIDYpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDM2OSwgNyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNDk3LCA4KSwgbmV3IFByZWZpeENvZGVSYW5nZSg3NTMsIDkpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDEyNjUsIDEwKSwgbmV3IFByZWZpeENvZGVSYW5nZSgyMjg5LCAxMSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNDMzNywgMTIpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDg0MzMsIDEzKSwgbmV3IFByZWZpeENvZGVSYW5nZSgxNjYyNSwgMjQpXTtcbnZhciBrSW5zZXJ0TGVuZ3RoUHJlZml4Q29kZSA9IFtuZXcgUHJlZml4Q29kZVJhbmdlKDAsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDEsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDIsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDMsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDQsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDUsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDYsIDEpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDgsIDEpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDEwLCAyKSwgbmV3IFByZWZpeENvZGVSYW5nZSgxNCwgMiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTgsIDMpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDI2LCAzKSwgbmV3IFByZWZpeENvZGVSYW5nZSgzNCwgNCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNTAsIDQpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDY2LCA1KSwgbmV3IFByZWZpeENvZGVSYW5nZSg5OCwgNSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTMwLCA2KSwgbmV3IFByZWZpeENvZGVSYW5nZSgxOTQsIDcpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDMyMiwgOCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNTc4LCA5KSwgbmV3IFByZWZpeENvZGVSYW5nZSgxMDkwLCAxMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMjExNCwgMTIpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDYyMTAsIDE0KSwgbmV3IFByZWZpeENvZGVSYW5nZSgyMjU5NCwgMjQpXTtcbnZhciBrQ29weUxlbmd0aFByZWZpeENvZGUgPSBbbmV3IFByZWZpeENvZGVSYW5nZSgyLCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSgzLCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSg0LCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSg1LCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSg2LCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSg3LCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSg4LCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSg5LCAwKSwgbmV3IFByZWZpeENvZGVSYW5nZSgxMCwgMSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTIsIDEpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDE0LCAyKSwgbmV3IFByZWZpeENvZGVSYW5nZSgxOCwgMiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMjIsIDMpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDMwLCAzKSwgbmV3IFByZWZpeENvZGVSYW5nZSgzOCwgNCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNTQsIDQpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDcwLCA1KSwgbmV3IFByZWZpeENvZGVSYW5nZSgxMDIsIDUpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDEzNCwgNiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTk4LCA3KSwgbmV3IFByZWZpeENvZGVSYW5nZSgzMjYsIDgpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDU4MiwgOSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTA5NCwgMTApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDIxMTgsIDI0KV07XG52YXIga0luc2VydFJhbmdlTHV0ID0gWzAsIDAsIDgsIDgsIDAsIDE2LCA4LCAxNiwgMTZdO1xudmFyIGtDb3B5UmFuZ2VMdXQgPSBbMCwgOCwgMCwgOCwgMTYsIDAsIDE2LCA4LCAxNl07XG52YXIgcHJlZml4ID0ge1xuICBrQmxvY2tMZW5ndGhQcmVmaXhDb2RlOiBrQmxvY2tMZW5ndGhQcmVmaXhDb2RlLFxuICBrSW5zZXJ0TGVuZ3RoUHJlZml4Q29kZToga0luc2VydExlbmd0aFByZWZpeENvZGUsXG4gIGtDb3B5TGVuZ3RoUHJlZml4Q29kZToga0NvcHlMZW5ndGhQcmVmaXhDb2RlLFxuICBrSW5zZXJ0UmFuZ2VMdXQ6IGtJbnNlcnRSYW5nZUx1dCxcbiAga0NvcHlSYW5nZUx1dDoga0NvcHlSYW5nZUx1dFxufTtcblxuLyogQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblxuICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuICAgVHJhbnNmb3JtYXRpb25zIG9uIGRpY3Rpb25hcnkgd29yZHMuXG4qL1xuXG52YXIga0lkZW50aXR5ID0gMDtcbnZhciBrT21pdExhc3QxID0gMTtcbnZhciBrT21pdExhc3QyID0gMjtcbnZhciBrT21pdExhc3QzID0gMztcbnZhciBrT21pdExhc3Q0ID0gNDtcbnZhciBrT21pdExhc3Q1ID0gNTtcbnZhciBrT21pdExhc3Q2ID0gNjtcbnZhciBrT21pdExhc3Q3ID0gNztcbnZhciBrT21pdExhc3Q4ID0gODtcbnZhciBrT21pdExhc3Q5ID0gOTtcbnZhciBrVXBwZXJjYXNlRmlyc3QgPSAxMDtcbnZhciBrVXBwZXJjYXNlQWxsID0gMTE7XG52YXIga09taXRGaXJzdDEgPSAxMjtcbnZhciBrT21pdEZpcnN0MiA9IDEzO1xudmFyIGtPbWl0Rmlyc3QzID0gMTQ7XG52YXIga09taXRGaXJzdDQgPSAxNTtcbnZhciBrT21pdEZpcnN0NSA9IDE2O1xudmFyIGtPbWl0Rmlyc3Q2ID0gMTc7XG52YXIga09taXRGaXJzdDcgPSAxODtcbnZhciBrT21pdEZpcnN0OSA9IDIwO1xuXG5mdW5jdGlvbiBUcmFuc2Zvcm0kMihwcmVmaXgsIHRyYW5zZm9ybSwgc3VmZml4KSB7XG4gIHRoaXMucHJlZml4ID0gbmV3IFVpbnQ4QXJyYXkocHJlZml4Lmxlbmd0aCk7XG4gIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICB0aGlzLnN1ZmZpeCA9IG5ldyBVaW50OEFycmF5KHN1ZmZpeC5sZW5ndGgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlZml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5wcmVmaXhbaV0gPSBwcmVmaXguY2hhckNvZGVBdChpKTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3VmZml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5zdWZmaXhbaV0gPSBzdWZmaXguY2hhckNvZGVBdChpKTtcbiAgfVxufVxuXG52YXIga1RyYW5zZm9ybXMgPSBbbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrSWRlbnRpdHksIFwiIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0Rmlyc3QxLCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCIgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiB0aGUgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtJZGVudGl0eSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcInMgXCIsIGtJZGVudGl0eSwgXCIgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBvZiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBhbmQgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRGaXJzdDIsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRMYXN0MSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiwgXCIsIGtJZGVudGl0eSwgXCIgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiwgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCIgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBpbiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIHRvIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiZSBcIiwga0lkZW50aXR5LCBcIiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiXFxcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIuXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIlxcXCI+XCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIlxcblwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0TGFzdDMsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIl1cIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIGZvciBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdEZpcnN0MywgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdExhc3QyLCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgYSBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIHRoYXQgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiLiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIi5cIiwga0lkZW50aXR5LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrSWRlbnRpdHksIFwiLCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdEZpcnN0NCwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIHdpdGggXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIidcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIGZyb20gXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBieSBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdEZpcnN0NSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdEZpcnN0NiwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiB0aGUgXCIsIGtJZGVudGl0eSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdExhc3Q0LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIuIFRoZSBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgb24gXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBhcyBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIGlzIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0TGFzdDcsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRMYXN0MSwgXCJpbmcgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIlxcblxcdFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCI6XCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtJZGVudGl0eSwgXCIuIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJlZCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdEZpcnN0OSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdEZpcnN0NywgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdExhc3Q2LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIoXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIiwgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRMYXN0OCwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIGF0IFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJseSBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiB0aGUgXCIsIGtJZGVudGl0eSwgXCIgb2YgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRMYXN0NSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdExhc3Q5LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiLCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiXFxcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiLlwiLCBrSWRlbnRpdHksIFwiKFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCJcXFwiPlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCI9XFxcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrSWRlbnRpdHksIFwiLlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiLmNvbS9cIiwga0lkZW50aXR5LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIHRoZSBcIiwga0lkZW50aXR5LCBcIiBvZiB0aGUgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIidcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiLiBUaGlzIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIsXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIuXCIsIGtJZGVudGl0eSwgXCIgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIihcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiLlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgbm90IFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrSWRlbnRpdHksIFwiPVxcXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiZXIgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VBbGwsIFwiIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJhbCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUFsbCwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiPSdcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIlxcXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiLiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga0lkZW50aXR5LCBcIihcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiZnVsIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiLiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiaXZlIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJsZXNzIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiJ1wiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJlc3QgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCIuXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCJcXFwiPlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrSWRlbnRpdHksIFwiPSdcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiLFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJpemUgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCIuXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcXHhjMlxceGEwXCIsIGtJZGVudGl0eSwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga0lkZW50aXR5LCBcIixcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiPVxcXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIj1cXFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIm91cyBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIiwgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIj0nXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCIsXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VBbGwsIFwiPVxcXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUFsbCwgXCIsIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiLFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiKFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiLiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUFsbCwgXCIuXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCI9J1wiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlQWxsLCBcIi4gXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCI9XFxcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlQWxsLCBcIj0nXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCI9J1wiKV07XG52YXIga1RyYW5zZm9ybXNfMSA9IGtUcmFuc2Zvcm1zO1xudmFyIGtOdW1UcmFuc2Zvcm1zID0ga1RyYW5zZm9ybXMubGVuZ3RoO1xuXG5mdW5jdGlvbiBUb1VwcGVyQ2FzZShwLCBpKSB7XG4gIGlmIChwW2ldIDwgMHhjMCkge1xuICAgIGlmIChwW2ldID49IDk3ICYmIHBbaV0gPD0gMTIyKSB7XG4gICAgICBwW2ldIF49IDMyO1xuICAgIH1cblxuICAgIHJldHVybiAxO1xuICB9XG4gIC8qIEFuIG92ZXJseSBzaW1wbGlmaWVkIHVwcGVyY2FzaW5nIG1vZGVsIGZvciB1dGYtOC4gKi9cblxuXG4gIGlmIChwW2ldIDwgMHhlMCkge1xuICAgIHBbaSArIDFdIF49IDMyO1xuICAgIHJldHVybiAyO1xuICB9XG4gIC8qIEFuIGFyYml0cmFyeSB0cmFuc2Zvcm0gZm9yIHRocmVlIGJ5dGUgY2hhcmFjdGVycy4gKi9cblxuXG4gIHBbaSArIDJdIF49IDU7XG4gIHJldHVybiAzO1xufVxuXG52YXIgdHJhbnNmb3JtRGljdGlvbmFyeVdvcmQgPSBmdW5jdGlvbiB0cmFuc2Zvcm1EaWN0aW9uYXJ5V29yZChkc3QsIGlkeCwgd29yZCwgbGVuLCB0cmFuc2Zvcm0pIHtcbiAgdmFyIHByZWZpeCA9IGtUcmFuc2Zvcm1zW3RyYW5zZm9ybV0ucHJlZml4O1xuICB2YXIgc3VmZml4ID0ga1RyYW5zZm9ybXNbdHJhbnNmb3JtXS5zdWZmaXg7XG4gIHZhciB0ID0ga1RyYW5zZm9ybXNbdHJhbnNmb3JtXS50cmFuc2Zvcm07XG4gIHZhciBza2lwID0gdCA8IGtPbWl0Rmlyc3QxID8gMCA6IHQgLSAoa09taXRGaXJzdDEgLSAxKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgc3RhcnRfaWR4ID0gaWR4O1xuICB2YXIgdXBwZXJjYXNlO1xuXG4gIGlmIChza2lwID4gbGVuKSB7XG4gICAgc2tpcCA9IGxlbjtcbiAgfVxuXG4gIHZhciBwcmVmaXhfcG9zID0gMDtcblxuICB3aGlsZSAocHJlZml4X3BvcyA8IHByZWZpeC5sZW5ndGgpIHtcbiAgICBkc3RbaWR4KytdID0gcHJlZml4W3ByZWZpeF9wb3MrK107XG4gIH1cblxuICB3b3JkICs9IHNraXA7XG4gIGxlbiAtPSBza2lwO1xuXG4gIGlmICh0IDw9IGtPbWl0TGFzdDkpIHtcbiAgICBsZW4gLT0gdDtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGRzdFtpZHgrK10gPSBkaWN0aW9uYXJ5LmRpY3Rpb25hcnlbd29yZCArIGldO1xuICB9XG5cbiAgdXBwZXJjYXNlID0gaWR4IC0gbGVuO1xuXG4gIGlmICh0ID09PSBrVXBwZXJjYXNlRmlyc3QpIHtcbiAgICBUb1VwcGVyQ2FzZShkc3QsIHVwcGVyY2FzZSk7XG4gIH0gZWxzZSBpZiAodCA9PT0ga1VwcGVyY2FzZUFsbCkge1xuICAgIHdoaWxlIChsZW4gPiAwKSB7XG4gICAgICB2YXIgc3RlcCA9IFRvVXBwZXJDYXNlKGRzdCwgdXBwZXJjYXNlKTtcbiAgICAgIHVwcGVyY2FzZSArPSBzdGVwO1xuICAgICAgbGVuIC09IHN0ZXA7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN1ZmZpeF9wb3MgPSAwO1xuXG4gIHdoaWxlIChzdWZmaXhfcG9zIDwgc3VmZml4Lmxlbmd0aCkge1xuICAgIGRzdFtpZHgrK10gPSBzdWZmaXhbc3VmZml4X3BvcysrXTtcbiAgfVxuXG4gIHJldHVybiBpZHggLSBzdGFydF9pZHg7XG59O1xuXG52YXIgdHJhbnNmb3JtID0ge1xuICBrVHJhbnNmb3Jtczoga1RyYW5zZm9ybXNfMSxcbiAga051bVRyYW5zZm9ybXM6IGtOdW1UcmFuc2Zvcm1zLFxuICB0cmFuc2Zvcm1EaWN0aW9uYXJ5V29yZDogdHJhbnNmb3JtRGljdGlvbmFyeVdvcmRcbn07XG5cbi8qIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cbiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG52YXIgQnJvdGxpSW5wdXQkMSA9IHN0cmVhbXMkMS5Ccm90bGlJbnB1dDtcbnZhciBCcm90bGlPdXRwdXQkMSA9IHN0cmVhbXMkMS5Ccm90bGlPdXRwdXQ7XG52YXIgSHVmZm1hbkNvZGUkMSA9IGh1ZmZtYW4uSHVmZm1hbkNvZGU7XG52YXIgQnJvdGxpQnVpbGRIdWZmbWFuVGFibGUkMSA9IGh1ZmZtYW4uQnJvdGxpQnVpbGRIdWZmbWFuVGFibGU7XG52YXIga0RlZmF1bHRDb2RlTGVuZ3RoID0gODtcbnZhciBrQ29kZUxlbmd0aFJlcGVhdENvZGUgPSAxNjtcbnZhciBrTnVtTGl0ZXJhbENvZGVzID0gMjU2O1xudmFyIGtOdW1JbnNlcnRBbmRDb3B5Q29kZXMgPSA3MDQ7XG52YXIga051bUJsb2NrTGVuZ3RoQ29kZXMgPSAyNjtcbnZhciBrTGl0ZXJhbENvbnRleHRCaXRzID0gNjtcbnZhciBrRGlzdGFuY2VDb250ZXh0Qml0cyA9IDI7XG52YXIgSFVGRk1BTl9UQUJMRV9CSVRTID0gODtcbnZhciBIVUZGTUFOX1RBQkxFX01BU0sgPSAweGZmO1xuLyogTWF4aW11bSBwb3NzaWJsZSBIdWZmbWFuIHRhYmxlIHNpemUgZm9yIGFuIGFscGhhYmV0IHNpemUgb2YgNzA0LCBtYXggY29kZVxuICogbGVuZ3RoIDE1IGFuZCByb290IHRhYmxlIGJpdHMgOC4gKi9cblxudmFyIEhVRkZNQU5fTUFYX1RBQkxFX1NJWkUgPSAxMDgwO1xudmFyIENPREVfTEVOR1RIX0NPREVTID0gMTg7XG52YXIga0NvZGVMZW5ndGhDb2RlT3JkZXIgPSBuZXcgVWludDhBcnJheShbMSwgMiwgMywgNCwgMCwgNSwgMTcsIDYsIDE2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1XSk7XG52YXIgTlVNX0RJU1RBTkNFX1NIT1JUX0NPREVTID0gMTY7XG52YXIga0Rpc3RhbmNlU2hvcnRDb2RlSW5kZXhPZmZzZXQgPSBuZXcgVWludDhBcnJheShbMywgMiwgMSwgMCwgMywgMywgMywgMywgMywgMywgMiwgMiwgMiwgMiwgMiwgMl0pO1xudmFyIGtEaXN0YW5jZVNob3J0Q29kZVZhbHVlT2Zmc2V0ID0gbmV3IEludDhBcnJheShbMCwgMCwgMCwgMCwgLTEsIDEsIC0yLCAyLCAtMywgMywgLTEsIDEsIC0yLCAyLCAtMywgM10pO1xudmFyIGtNYXhIdWZmbWFuVGFibGVTaXplID0gbmV3IFVpbnQxNkFycmF5KFsyNTYsIDQwMiwgNDM2LCA0NjgsIDUwMCwgNTM0LCA1NjYsIDU5OCwgNjMwLCA2NjIsIDY5NCwgNzI2LCA3NTgsIDc5MCwgODIyLCA4NTQsIDg4NiwgOTIwLCA5NTIsIDk4NCwgMTAxNiwgMTA0OCwgMTA4MF0pO1xuXG5mdW5jdGlvbiBEZWNvZGVXaW5kb3dCaXRzKGJyKSB7XG4gIHZhciBuO1xuXG4gIGlmIChici5yZWFkQml0cygxKSA9PT0gMCkge1xuICAgIHJldHVybiAxNjtcbiAgfVxuXG4gIG4gPSBici5yZWFkQml0cygzKTtcblxuICBpZiAobiA+IDApIHtcbiAgICByZXR1cm4gMTcgKyBuO1xuICB9XG5cbiAgbiA9IGJyLnJlYWRCaXRzKDMpO1xuXG4gIGlmIChuID4gMCkge1xuICAgIHJldHVybiA4ICsgbjtcbiAgfVxuXG4gIHJldHVybiAxNztcbn1cbi8qIERlY29kZXMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLi4yNTVdLCBieSByZWFkaW5nIDEgLSAxMSBiaXRzLiAqL1xuXG5cbmZ1bmN0aW9uIERlY29kZVZhckxlblVpbnQ4KGJyKSB7XG4gIGlmIChici5yZWFkQml0cygxKSkge1xuICAgIHZhciBuYml0cyA9IGJyLnJlYWRCaXRzKDMpO1xuXG4gICAgaWYgKG5iaXRzID09PSAwKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJyLnJlYWRCaXRzKG5iaXRzKSArICgxIDw8IG5iaXRzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gTWV0YUJsb2NrTGVuZ3RoKCkge1xuICB0aGlzLm1ldGFfYmxvY2tfbGVuZ3RoID0gMDtcbiAgdGhpcy5pbnB1dF9lbmQgPSAwO1xuICB0aGlzLmlzX3VuY29tcHJlc3NlZCA9IDA7XG4gIHRoaXMuaXNfbWV0YWRhdGEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gRGVjb2RlTWV0YUJsb2NrTGVuZ3RoKGJyKSB7XG4gIHZhciBvdXQgPSBuZXcgTWV0YUJsb2NrTGVuZ3RoKCk7XG4gIHZhciBzaXplX25pYmJsZXM7XG4gIHZhciBzaXplX2J5dGVzO1xuICB2YXIgaTtcbiAgb3V0LmlucHV0X2VuZCA9IGJyLnJlYWRCaXRzKDEpO1xuXG4gIGlmIChvdXQuaW5wdXRfZW5kICYmIGJyLnJlYWRCaXRzKDEpKSB7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHNpemVfbmliYmxlcyA9IGJyLnJlYWRCaXRzKDIpICsgNDtcblxuICBpZiAoc2l6ZV9uaWJibGVzID09PSA3KSB7XG4gICAgb3V0LmlzX21ldGFkYXRhID0gdHJ1ZTtcbiAgICBpZiAoYnIucmVhZEJpdHMoMSkgIT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXNlcnZlZCBiaXQnKTtcbiAgICBzaXplX2J5dGVzID0gYnIucmVhZEJpdHMoMik7XG4gICAgaWYgKHNpemVfYnl0ZXMgPT09IDApIHJldHVybiBvdXQ7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9ieXRlczsgaSsrKSB7XG4gICAgICB2YXIgbmV4dF9ieXRlID0gYnIucmVhZEJpdHMoOCk7XG4gICAgICBpZiAoaSArIDEgPT09IHNpemVfYnl0ZXMgJiYgc2l6ZV9ieXRlcyA+IDEgJiYgbmV4dF9ieXRlID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2l6ZSBieXRlJyk7XG4gICAgICBvdXQubWV0YV9ibG9ja19sZW5ndGggfD0gbmV4dF9ieXRlIDw8IGkgKiA4O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9uaWJibGVzOyArK2kpIHtcbiAgICAgIHZhciBuZXh0X25pYmJsZSA9IGJyLnJlYWRCaXRzKDQpO1xuICAgICAgaWYgKGkgKyAxID09PSBzaXplX25pYmJsZXMgJiYgc2l6ZV9uaWJibGVzID4gNCAmJiBuZXh0X25pYmJsZSA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpemUgbmliYmxlJyk7XG4gICAgICBvdXQubWV0YV9ibG9ja19sZW5ndGggfD0gbmV4dF9uaWJibGUgPDwgaSAqIDQ7XG4gICAgfVxuICB9XG5cbiAgKytvdXQubWV0YV9ibG9ja19sZW5ndGg7XG5cbiAgaWYgKCFvdXQuaW5wdXRfZW5kICYmICFvdXQuaXNfbWV0YWRhdGEpIHtcbiAgICBvdXQuaXNfdW5jb21wcmVzc2VkID0gYnIucmVhZEJpdHMoMSk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyogRGVjb2RlcyB0aGUgbmV4dCBIdWZmbWFuIGNvZGUgZnJvbSBiaXQtc3RyZWFtLiAqL1xuXG5cbmZ1bmN0aW9uIFJlYWRTeW1ib2wodGFibGUsIGluZGV4LCBicikge1xuICB2YXIgbmJpdHM7XG4gIGJyLmZpbGxCaXRXaW5kb3coKTtcbiAgaW5kZXggKz0gYnIudmFsXyA+Pj4gYnIuYml0X3Bvc18gJiBIVUZGTUFOX1RBQkxFX01BU0s7XG4gIG5iaXRzID0gdGFibGVbaW5kZXhdLmJpdHMgLSBIVUZGTUFOX1RBQkxFX0JJVFM7XG5cbiAgaWYgKG5iaXRzID4gMCkge1xuICAgIGJyLmJpdF9wb3NfICs9IEhVRkZNQU5fVEFCTEVfQklUUztcbiAgICBpbmRleCArPSB0YWJsZVtpbmRleF0udmFsdWU7XG4gICAgaW5kZXggKz0gYnIudmFsXyA+Pj4gYnIuYml0X3Bvc18gJiAoMSA8PCBuYml0cykgLSAxO1xuICB9XG5cbiAgYnIuYml0X3Bvc18gKz0gdGFibGVbaW5kZXhdLmJpdHM7XG4gIHJldHVybiB0YWJsZVtpbmRleF0udmFsdWU7XG59XG5cbmZ1bmN0aW9uIFJlYWRIdWZmbWFuQ29kZUxlbmd0aHMoY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzLCBudW1fc3ltYm9scywgY29kZV9sZW5ndGhzLCBicikge1xuICB2YXIgc3ltYm9sID0gMDtcbiAgdmFyIHByZXZfY29kZV9sZW4gPSBrRGVmYXVsdENvZGVMZW5ndGg7XG4gIHZhciByZXBlYXQgPSAwO1xuICB2YXIgcmVwZWF0X2NvZGVfbGVuID0gMDtcbiAgdmFyIHNwYWNlID0gMzI3Njg7XG4gIHZhciB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKykge1xuICAgIHRhYmxlLnB1c2gobmV3IEh1ZmZtYW5Db2RlJDEoMCwgMCkpO1xuICB9XG5cbiAgQnJvdGxpQnVpbGRIdWZmbWFuVGFibGUkMSh0YWJsZSwgMCwgNSwgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzLCBDT0RFX0xFTkdUSF9DT0RFUyk7XG5cbiAgd2hpbGUgKHN5bWJvbCA8IG51bV9zeW1ib2xzICYmIHNwYWNlID4gMCkge1xuICAgIHZhciBwID0gMDtcbiAgICB2YXIgY29kZV9sZW47XG4gICAgYnIucmVhZE1vcmVJbnB1dCgpO1xuICAgIGJyLmZpbGxCaXRXaW5kb3coKTtcbiAgICBwICs9IGJyLnZhbF8gPj4+IGJyLmJpdF9wb3NfICYgMzE7XG4gICAgYnIuYml0X3Bvc18gKz0gdGFibGVbcF0uYml0cztcbiAgICBjb2RlX2xlbiA9IHRhYmxlW3BdLnZhbHVlICYgMHhmZjtcblxuICAgIGlmIChjb2RlX2xlbiA8IGtDb2RlTGVuZ3RoUmVwZWF0Q29kZSkge1xuICAgICAgcmVwZWF0ID0gMDtcbiAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2wrK10gPSBjb2RlX2xlbjtcblxuICAgICAgaWYgKGNvZGVfbGVuICE9PSAwKSB7XG4gICAgICAgIHByZXZfY29kZV9sZW4gPSBjb2RlX2xlbjtcbiAgICAgICAgc3BhY2UgLT0gMzI3NjggPj4gY29kZV9sZW47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBleHRyYV9iaXRzID0gY29kZV9sZW4gLSAxNDtcbiAgICAgIHZhciBvbGRfcmVwZWF0O1xuICAgICAgdmFyIHJlcGVhdF9kZWx0YTtcbiAgICAgIHZhciBuZXdfbGVuID0gMDtcblxuICAgICAgaWYgKGNvZGVfbGVuID09PSBrQ29kZUxlbmd0aFJlcGVhdENvZGUpIHtcbiAgICAgICAgbmV3X2xlbiA9IHByZXZfY29kZV9sZW47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXBlYXRfY29kZV9sZW4gIT09IG5ld19sZW4pIHtcbiAgICAgICAgcmVwZWF0ID0gMDtcbiAgICAgICAgcmVwZWF0X2NvZGVfbGVuID0gbmV3X2xlbjtcbiAgICAgIH1cblxuICAgICAgb2xkX3JlcGVhdCA9IHJlcGVhdDtcblxuICAgICAgaWYgKHJlcGVhdCA+IDApIHtcbiAgICAgICAgcmVwZWF0IC09IDI7XG4gICAgICAgIHJlcGVhdCA8PD0gZXh0cmFfYml0cztcbiAgICAgIH1cblxuICAgICAgcmVwZWF0ICs9IGJyLnJlYWRCaXRzKGV4dHJhX2JpdHMpICsgMztcbiAgICAgIHJlcGVhdF9kZWx0YSA9IHJlcGVhdCAtIG9sZF9yZXBlYXQ7XG5cbiAgICAgIGlmIChzeW1ib2wgKyByZXBlYXRfZGVsdGEgPiBudW1fc3ltYm9scykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWFkSHVmZm1hbkNvZGVMZW5ndGhzXSBzeW1ib2wgKyByZXBlYXRfZGVsdGEgPiBudW1fc3ltYm9scycpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHJlcGVhdF9kZWx0YTsgeCsrKSB7XG4gICAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2wgKyB4XSA9IHJlcGVhdF9jb2RlX2xlbjtcbiAgICAgIH1cblxuICAgICAgc3ltYm9sICs9IHJlcGVhdF9kZWx0YTtcblxuICAgICAgaWYgKHJlcGVhdF9jb2RlX2xlbiAhPT0gMCkge1xuICAgICAgICBzcGFjZSAtPSByZXBlYXRfZGVsdGEgPDwgMTUgLSByZXBlYXRfY29kZV9sZW47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHNwYWNlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiW1JlYWRIdWZmbWFuQ29kZUxlbmd0aHNdIHNwYWNlID0gXCIgKyBzcGFjZSk7XG4gIH1cblxuICBmb3IgKDsgc3ltYm9sIDwgbnVtX3N5bWJvbHM7IHN5bWJvbCsrKSB7XG4gICAgY29kZV9sZW5ndGhzW3N5bWJvbF0gPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRIdWZmbWFuQ29kZShhbHBoYWJldF9zaXplLCB0YWJsZXMsIHRhYmxlLCBicikge1xuICB2YXIgdGFibGVfc2l6ZSA9IDA7XG4gIHZhciBzaW1wbGVfY29kZV9vcl9za2lwO1xuICB2YXIgY29kZV9sZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoYWxwaGFiZXRfc2l6ZSk7XG4gIGJyLnJlYWRNb3JlSW5wdXQoKTtcbiAgLyogc2ltcGxlX2NvZGVfb3Jfc2tpcCBpcyB1c2VkIGFzIGZvbGxvd3M6XG4gICAgIDEgZm9yIHNpbXBsZSBjb2RlO1xuICAgICAwIGZvciBubyBza2lwcGluZywgMiBza2lwcyAyIGNvZGUgbGVuZ3RocywgMyBza2lwcyAzIGNvZGUgbGVuZ3RocyAqL1xuXG4gIHNpbXBsZV9jb2RlX29yX3NraXAgPSBici5yZWFkQml0cygyKTtcblxuICBpZiAoc2ltcGxlX2NvZGVfb3Jfc2tpcCA9PT0gMSkge1xuICAgIC8qIFJlYWQgc3ltYm9scywgY29kZXMgJiBjb2RlIGxlbmd0aHMgZGlyZWN0bHkuICovXG4gICAgdmFyIGk7XG4gICAgdmFyIG1heF9iaXRzX2NvdW50ZXIgPSBhbHBoYWJldF9zaXplIC0gMTtcbiAgICB2YXIgbWF4X2JpdHMgPSAwO1xuICAgIHZhciBzeW1ib2xzID0gbmV3IEludDMyQXJyYXkoNCk7XG4gICAgdmFyIG51bV9zeW1ib2xzID0gYnIucmVhZEJpdHMoMikgKyAxO1xuXG4gICAgd2hpbGUgKG1heF9iaXRzX2NvdW50ZXIpIHtcbiAgICAgIG1heF9iaXRzX2NvdW50ZXIgPj49IDE7XG4gICAgICArK21heF9iaXRzO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltYm9sczsgKytpKSB7XG4gICAgICBzeW1ib2xzW2ldID0gYnIucmVhZEJpdHMobWF4X2JpdHMpICUgYWxwaGFiZXRfc2l6ZTtcbiAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2xzW2ldXSA9IDI7XG4gICAgfVxuXG4gICAgY29kZV9sZW5ndGhzW3N5bWJvbHNbMF1dID0gMTtcblxuICAgIHN3aXRjaCAobnVtX3N5bWJvbHMpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaWYgKHN5bWJvbHNbMF0gPT09IHN5bWJvbHNbMV0gfHwgc3ltYm9sc1swXSA9PT0gc3ltYm9sc1syXSB8fCBzeW1ib2xzWzFdID09PSBzeW1ib2xzWzJdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVhZEh1ZmZtYW5Db2RlXSBpbnZhbGlkIHN5bWJvbHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIGlmIChzeW1ib2xzWzBdID09PSBzeW1ib2xzWzFdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVhZEh1ZmZtYW5Db2RlXSBpbnZhbGlkIHN5bWJvbHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2xzWzFdXSA9IDE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIGlmIChzeW1ib2xzWzBdID09PSBzeW1ib2xzWzFdIHx8IHN5bWJvbHNbMF0gPT09IHN5bWJvbHNbMl0gfHwgc3ltYm9sc1swXSA9PT0gc3ltYm9sc1szXSB8fCBzeW1ib2xzWzFdID09PSBzeW1ib2xzWzJdIHx8IHN5bWJvbHNbMV0gPT09IHN5bWJvbHNbM10gfHwgc3ltYm9sc1syXSA9PT0gc3ltYm9sc1szXSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW1JlYWRIdWZmbWFuQ29kZV0gaW52YWxpZCBzeW1ib2xzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnIucmVhZEJpdHMoMSkpIHtcbiAgICAgICAgICBjb2RlX2xlbmd0aHNbc3ltYm9sc1syXV0gPSAzO1xuICAgICAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2xzWzNdXSA9IDM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29kZV9sZW5ndGhzW3N5bWJvbHNbMF1dID0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvKiBEZWNvZGUgSHVmZm1hbi1jb2RlZCBjb2RlIGxlbmd0aHMuICovXG4gICAgdmFyIGk7XG4gICAgdmFyIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KENPREVfTEVOR1RIX0NPREVTKTtcbiAgICB2YXIgc3BhY2UgPSAzMjtcbiAgICB2YXIgbnVtX2NvZGVzID0gMDtcbiAgICAvKiBTdGF0aWMgSHVmZm1hbiBjb2RlIGZvciB0aGUgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG5cbiAgICB2YXIgaHVmZiA9IFtuZXcgSHVmZm1hbkNvZGUkMSgyLCAwKSwgbmV3IEh1ZmZtYW5Db2RlJDEoMiwgNCksIG5ldyBIdWZmbWFuQ29kZSQxKDIsIDMpLCBuZXcgSHVmZm1hbkNvZGUkMSgzLCAyKSwgbmV3IEh1ZmZtYW5Db2RlJDEoMiwgMCksIG5ldyBIdWZmbWFuQ29kZSQxKDIsIDQpLCBuZXcgSHVmZm1hbkNvZGUkMSgyLCAzKSwgbmV3IEh1ZmZtYW5Db2RlJDEoNCwgMSksIG5ldyBIdWZmbWFuQ29kZSQxKDIsIDApLCBuZXcgSHVmZm1hbkNvZGUkMSgyLCA0KSwgbmV3IEh1ZmZtYW5Db2RlJDEoMiwgMyksIG5ldyBIdWZmbWFuQ29kZSQxKDMsIDIpLCBuZXcgSHVmZm1hbkNvZGUkMSgyLCAwKSwgbmV3IEh1ZmZtYW5Db2RlJDEoMiwgNCksIG5ldyBIdWZmbWFuQ29kZSQxKDIsIDMpLCBuZXcgSHVmZm1hbkNvZGUkMSg0LCA1KV07XG5cbiAgICBmb3IgKGkgPSBzaW1wbGVfY29kZV9vcl9za2lwOyBpIDwgQ09ERV9MRU5HVEhfQ09ERVMgJiYgc3BhY2UgPiAwOyArK2kpIHtcbiAgICAgIHZhciBjb2RlX2xlbl9pZHggPSBrQ29kZUxlbmd0aENvZGVPcmRlcltpXTtcbiAgICAgIHZhciBwID0gMDtcbiAgICAgIHZhciB2O1xuICAgICAgYnIuZmlsbEJpdFdpbmRvdygpO1xuICAgICAgcCArPSBici52YWxfID4+PiBici5iaXRfcG9zXyAmIDE1O1xuICAgICAgYnIuYml0X3Bvc18gKz0gaHVmZltwXS5iaXRzO1xuICAgICAgdiA9IGh1ZmZbcF0udmFsdWU7XG4gICAgICBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHNbY29kZV9sZW5faWR4XSA9IHY7XG5cbiAgICAgIGlmICh2ICE9PSAwKSB7XG4gICAgICAgIHNwYWNlIC09IDMyID4+IHY7XG4gICAgICAgICsrbnVtX2NvZGVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghKG51bV9jb2RlcyA9PT0gMSB8fCBzcGFjZSA9PT0gMCkpIHRocm93IG5ldyBFcnJvcignW1JlYWRIdWZmbWFuQ29kZV0gaW52YWxpZCBudW1fY29kZXMgb3Igc3BhY2UnKTtcbiAgICBSZWFkSHVmZm1hbkNvZGVMZW5ndGhzKGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywgYWxwaGFiZXRfc2l6ZSwgY29kZV9sZW5ndGhzLCBicik7XG4gIH1cblxuICB0YWJsZV9zaXplID0gQnJvdGxpQnVpbGRIdWZmbWFuVGFibGUkMSh0YWJsZXMsIHRhYmxlLCBIVUZGTUFOX1RBQkxFX0JJVFMsIGNvZGVfbGVuZ3RocywgYWxwaGFiZXRfc2l6ZSk7XG5cbiAgaWYgKHRhYmxlX3NpemUgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJbUmVhZEh1ZmZtYW5Db2RlXSBCdWlsZEh1ZmZtYW5UYWJsZSBmYWlsZWQ6IFwiKTtcbiAgfVxuXG4gIHJldHVybiB0YWJsZV9zaXplO1xufVxuXG5mdW5jdGlvbiBSZWFkQmxvY2tMZW5ndGgodGFibGUsIGluZGV4LCBicikge1xuICB2YXIgY29kZTtcbiAgdmFyIG5iaXRzO1xuICBjb2RlID0gUmVhZFN5bWJvbCh0YWJsZSwgaW5kZXgsIGJyKTtcbiAgbmJpdHMgPSBwcmVmaXgua0Jsb2NrTGVuZ3RoUHJlZml4Q29kZVtjb2RlXS5uYml0cztcbiAgcmV0dXJuIHByZWZpeC5rQmxvY2tMZW5ndGhQcmVmaXhDb2RlW2NvZGVdLm9mZnNldCArIGJyLnJlYWRCaXRzKG5iaXRzKTtcbn1cblxuZnVuY3Rpb24gVHJhbnNsYXRlU2hvcnRDb2Rlcyhjb2RlLCByaW5nYnVmZmVyLCBpbmRleCkge1xuICB2YXIgdmFsO1xuXG4gIGlmIChjb2RlIDwgTlVNX0RJU1RBTkNFX1NIT1JUX0NPREVTKSB7XG4gICAgaW5kZXggKz0ga0Rpc3RhbmNlU2hvcnRDb2RlSW5kZXhPZmZzZXRbY29kZV07XG4gICAgaW5kZXggJj0gMztcbiAgICB2YWwgPSByaW5nYnVmZmVyW2luZGV4XSArIGtEaXN0YW5jZVNob3J0Q29kZVZhbHVlT2Zmc2V0W2NvZGVdO1xuICB9IGVsc2Uge1xuICAgIHZhbCA9IGNvZGUgLSBOVU1fRElTVEFOQ0VfU0hPUlRfQ09ERVMgKyAxO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gTW92ZVRvRnJvbnQodiwgaW5kZXgpIHtcbiAgdmFyIHZhbHVlID0gdltpbmRleF07XG4gIHZhciBpID0gaW5kZXg7XG5cbiAgZm9yICg7IGk7IC0taSkge1xuICAgIHZbaV0gPSB2W2kgLSAxXTtcbiAgfVxuXG4gIHZbMF0gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gSW52ZXJzZU1vdmVUb0Zyb250VHJhbnNmb3JtKHYsIHZfbGVuKSB7XG4gIHZhciBtdGYgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuICB2YXIgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICBtdGZbaV0gPSBpO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IHZfbGVuOyArK2kpIHtcbiAgICB2YXIgaW5kZXggPSB2W2ldO1xuICAgIHZbaV0gPSBtdGZbaW5kZXhdO1xuICAgIGlmIChpbmRleCkgTW92ZVRvRnJvbnQobXRmLCBpbmRleCk7XG4gIH1cbn1cbi8qIENvbnRhaW5zIGEgY29sbGVjdGlvbiBvZiBodWZmbWFuIHRyZWVzIHdpdGggdGhlIHNhbWUgYWxwaGFiZXQgc2l6ZS4gKi9cblxuXG5mdW5jdGlvbiBIdWZmbWFuVHJlZUdyb3VwKGFscGhhYmV0X3NpemUsIG51bV9odHJlZXMpIHtcbiAgdGhpcy5hbHBoYWJldF9zaXplID0gYWxwaGFiZXRfc2l6ZTtcbiAgdGhpcy5udW1faHRyZWVzID0gbnVtX2h0cmVlcztcbiAgdGhpcy5jb2RlcyA9IG5ldyBBcnJheShudW1faHRyZWVzICsgbnVtX2h0cmVlcyAqIGtNYXhIdWZmbWFuVGFibGVTaXplW2FscGhhYmV0X3NpemUgKyAzMSA+Pj4gNV0pO1xuICB0aGlzLmh0cmVlcyA9IG5ldyBVaW50MzJBcnJheShudW1faHRyZWVzKTtcbn1cblxuSHVmZm1hblRyZWVHcm91cC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKGJyKSB7XG4gIHZhciBpO1xuICB2YXIgdGFibGVfc2l6ZTtcbiAgdmFyIG5leHQgPSAwO1xuXG4gIGZvciAoaSA9IDA7IGkgPCB0aGlzLm51bV9odHJlZXM7ICsraSkge1xuICAgIHRoaXMuaHRyZWVzW2ldID0gbmV4dDtcbiAgICB0YWJsZV9zaXplID0gUmVhZEh1ZmZtYW5Db2RlKHRoaXMuYWxwaGFiZXRfc2l6ZSwgdGhpcy5jb2RlcywgbmV4dCwgYnIpO1xuICAgIG5leHQgKz0gdGFibGVfc2l6ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gRGVjb2RlQ29udGV4dE1hcChjb250ZXh0X21hcF9zaXplLCBicikge1xuICB2YXIgb3V0ID0ge1xuICAgIG51bV9odHJlZXM6IG51bGwsXG4gICAgY29udGV4dF9tYXA6IG51bGxcbiAgfTtcbiAgdmFyIHVzZV9ybGVfZm9yX3plcm9zO1xuICB2YXIgbWF4X3J1bl9sZW5ndGhfcHJlZml4ID0gMDtcbiAgdmFyIHRhYmxlO1xuICB2YXIgaTtcbiAgYnIucmVhZE1vcmVJbnB1dCgpO1xuICB2YXIgbnVtX2h0cmVlcyA9IG91dC5udW1faHRyZWVzID0gRGVjb2RlVmFyTGVuVWludDgoYnIpICsgMTtcbiAgdmFyIGNvbnRleHRfbWFwID0gb3V0LmNvbnRleHRfbWFwID0gbmV3IFVpbnQ4QXJyYXkoY29udGV4dF9tYXBfc2l6ZSk7XG5cbiAgaWYgKG51bV9odHJlZXMgPD0gMSkge1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICB1c2VfcmxlX2Zvcl96ZXJvcyA9IGJyLnJlYWRCaXRzKDEpO1xuXG4gIGlmICh1c2VfcmxlX2Zvcl96ZXJvcykge1xuICAgIG1heF9ydW5fbGVuZ3RoX3ByZWZpeCA9IGJyLnJlYWRCaXRzKDQpICsgMTtcbiAgfVxuXG4gIHRhYmxlID0gW107XG5cbiAgZm9yIChpID0gMDsgaSA8IEhVRkZNQU5fTUFYX1RBQkxFX1NJWkU7IGkrKykge1xuICAgIHRhYmxlW2ldID0gbmV3IEh1ZmZtYW5Db2RlJDEoMCwgMCk7XG4gIH1cblxuICBSZWFkSHVmZm1hbkNvZGUobnVtX2h0cmVlcyArIG1heF9ydW5fbGVuZ3RoX3ByZWZpeCwgdGFibGUsIDAsIGJyKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dF9tYXBfc2l6ZTspIHtcbiAgICB2YXIgY29kZTtcbiAgICBici5yZWFkTW9yZUlucHV0KCk7XG4gICAgY29kZSA9IFJlYWRTeW1ib2wodGFibGUsIDAsIGJyKTtcblxuICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICBjb250ZXh0X21hcFtpXSA9IDA7XG4gICAgICArK2k7XG4gICAgfSBlbHNlIGlmIChjb2RlIDw9IG1heF9ydW5fbGVuZ3RoX3ByZWZpeCkge1xuICAgICAgdmFyIHJlcHMgPSAxICsgKDEgPDwgY29kZSkgKyBici5yZWFkQml0cyhjb2RlKTtcblxuICAgICAgd2hpbGUgKC0tcmVwcykge1xuICAgICAgICBpZiAoaSA+PSBjb250ZXh0X21hcF9zaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0RlY29kZUNvbnRleHRNYXBdIGkgPj0gY29udGV4dF9tYXBfc2l6ZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHRfbWFwW2ldID0gMDtcbiAgICAgICAgKytpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0X21hcFtpXSA9IGNvZGUgLSBtYXhfcnVuX2xlbmd0aF9wcmVmaXg7XG4gICAgICArK2k7XG4gICAgfVxuICB9XG5cbiAgaWYgKGJyLnJlYWRCaXRzKDEpKSB7XG4gICAgSW52ZXJzZU1vdmVUb0Zyb250VHJhbnNmb3JtKGNvbnRleHRfbWFwLCBjb250ZXh0X21hcF9zaXplKTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIERlY29kZUJsb2NrVHlwZShtYXhfYmxvY2tfdHlwZSwgdHJlZXMsIHRyZWVfdHlwZSwgYmxvY2tfdHlwZXMsIHJpbmdidWZmZXJzLCBpbmRleGVzLCBicikge1xuICB2YXIgcmluZ2J1ZmZlciA9IHRyZWVfdHlwZSAqIDI7XG4gIHZhciBpbmRleCA9IHRyZWVfdHlwZTtcbiAgdmFyIHR5cGVfY29kZSA9IFJlYWRTeW1ib2wodHJlZXMsIHRyZWVfdHlwZSAqIEhVRkZNQU5fTUFYX1RBQkxFX1NJWkUsIGJyKTtcbiAgdmFyIGJsb2NrX3R5cGU7XG5cbiAgaWYgKHR5cGVfY29kZSA9PT0gMCkge1xuICAgIGJsb2NrX3R5cGUgPSByaW5nYnVmZmVyc1tyaW5nYnVmZmVyICsgKGluZGV4ZXNbaW5kZXhdICYgMSldO1xuICB9IGVsc2UgaWYgKHR5cGVfY29kZSA9PT0gMSkge1xuICAgIGJsb2NrX3R5cGUgPSByaW5nYnVmZmVyc1tyaW5nYnVmZmVyICsgKGluZGV4ZXNbaW5kZXhdIC0gMSAmIDEpXSArIDE7XG4gIH0gZWxzZSB7XG4gICAgYmxvY2tfdHlwZSA9IHR5cGVfY29kZSAtIDI7XG4gIH1cblxuICBpZiAoYmxvY2tfdHlwZSA+PSBtYXhfYmxvY2tfdHlwZSkge1xuICAgIGJsb2NrX3R5cGUgLT0gbWF4X2Jsb2NrX3R5cGU7XG4gIH1cblxuICBibG9ja190eXBlc1t0cmVlX3R5cGVdID0gYmxvY2tfdHlwZTtcbiAgcmluZ2J1ZmZlcnNbcmluZ2J1ZmZlciArIChpbmRleGVzW2luZGV4XSAmIDEpXSA9IGJsb2NrX3R5cGU7XG4gICsraW5kZXhlc1tpbmRleF07XG59XG5cbmZ1bmN0aW9uIENvcHlVbmNvbXByZXNzZWRCbG9ja1RvT3V0cHV0KG91dHB1dCwgbGVuLCBwb3MsIHJpbmdidWZmZXIsIHJpbmdidWZmZXJfbWFzaywgYnIpIHtcbiAgdmFyIHJiX3NpemUgPSByaW5nYnVmZmVyX21hc2sgKyAxO1xuICB2YXIgcmJfcG9zID0gcG9zICYgcmluZ2J1ZmZlcl9tYXNrO1xuICB2YXIgYnJfcG9zID0gYnIucG9zXyAmIGJpdF9yZWFkZXIuSUJVRl9NQVNLO1xuICB2YXIgbmJ5dGVzO1xuICAvKiBGb3Igc2hvcnQgbGVuZ3RocyBjb3B5IGJ5dGUtYnktYnl0ZSAqL1xuXG4gIGlmIChsZW4gPCA4IHx8IGJyLmJpdF9wb3NfICsgKGxlbiA8PCAzKSA8IGJyLmJpdF9lbmRfcG9zXykge1xuICAgIHdoaWxlIChsZW4tLSA+IDApIHtcbiAgICAgIGJyLnJlYWRNb3JlSW5wdXQoKTtcbiAgICAgIHJpbmdidWZmZXJbcmJfcG9zKytdID0gYnIucmVhZEJpdHMoOCk7XG5cbiAgICAgIGlmIChyYl9wb3MgPT09IHJiX3NpemUpIHtcbiAgICAgICAgb3V0cHV0LndyaXRlKHJpbmdidWZmZXIsIHJiX3NpemUpO1xuICAgICAgICByYl9wb3MgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChici5iaXRfZW5kX3Bvc18gPCAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcignW0NvcHlVbmNvbXByZXNzZWRCbG9ja1RvT3V0cHV0XSBici5iaXRfZW5kX3Bvc18gPCAzMicpO1xuICB9XG4gIC8qIENvcHkgcmVtYWluaW5nIDAtNCBieXRlcyBmcm9tIGJyLnZhbF8gdG8gcmluZ2J1ZmZlci4gKi9cblxuXG4gIHdoaWxlIChici5iaXRfcG9zXyA8IDMyKSB7XG4gICAgcmluZ2J1ZmZlcltyYl9wb3NdID0gYnIudmFsXyA+Pj4gYnIuYml0X3Bvc187XG4gICAgYnIuYml0X3Bvc18gKz0gODtcbiAgICArK3JiX3BvcztcbiAgICAtLWxlbjtcbiAgfVxuICAvKiBDb3B5IHJlbWFpbmluZyBieXRlcyBmcm9tIGJyLmJ1Zl8gdG8gcmluZ2J1ZmZlci4gKi9cblxuXG4gIG5ieXRlcyA9IGJyLmJpdF9lbmRfcG9zXyAtIGJyLmJpdF9wb3NfID4+IDM7XG5cbiAgaWYgKGJyX3BvcyArIG5ieXRlcyA+IGJpdF9yZWFkZXIuSUJVRl9NQVNLKSB7XG4gICAgdmFyIHRhaWwgPSBiaXRfcmVhZGVyLklCVUZfTUFTSyArIDEgLSBicl9wb3M7XG5cbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRhaWw7IHgrKykge1xuICAgICAgcmluZ2J1ZmZlcltyYl9wb3MgKyB4XSA9IGJyLmJ1Zl9bYnJfcG9zICsgeF07XG4gICAgfVxuXG4gICAgbmJ5dGVzIC09IHRhaWw7XG4gICAgcmJfcG9zICs9IHRhaWw7XG4gICAgbGVuIC09IHRhaWw7XG4gICAgYnJfcG9zID0gMDtcbiAgfVxuXG4gIGZvciAodmFyIHggPSAwOyB4IDwgbmJ5dGVzOyB4KyspIHtcbiAgICByaW5nYnVmZmVyW3JiX3BvcyArIHhdID0gYnIuYnVmX1ticl9wb3MgKyB4XTtcbiAgfVxuXG4gIHJiX3BvcyArPSBuYnl0ZXM7XG4gIGxlbiAtPSBuYnl0ZXM7XG4gIC8qIElmIHdlIHdyb3RlIHBhc3QgdGhlIGxvZ2ljYWwgZW5kIG9mIHRoZSByaW5nYnVmZmVyLCBjb3B5IHRoZSB0YWlsIG9mIHRoZVxuICAgICByaW5nYnVmZmVyIHRvIGl0cyBiZWdpbm5pbmcgYW5kIGZsdXNoIHRoZSByaW5nYnVmZmVyIHRvIHRoZSBvdXRwdXQuICovXG5cbiAgaWYgKHJiX3BvcyA+PSByYl9zaXplKSB7XG4gICAgb3V0cHV0LndyaXRlKHJpbmdidWZmZXIsIHJiX3NpemUpO1xuICAgIHJiX3BvcyAtPSByYl9zaXplO1xuXG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCByYl9wb3M7IHgrKykge1xuICAgICAgcmluZ2J1ZmZlclt4XSA9IHJpbmdidWZmZXJbcmJfc2l6ZSArIHhdO1xuICAgIH1cbiAgfVxuICAvKiBJZiB3ZSBoYXZlIG1vcmUgdG8gY29weSB0aGFuIHRoZSByZW1haW5pbmcgc2l6ZSBvZiB0aGUgcmluZ2J1ZmZlciwgdGhlbiB3ZVxuICAgICBmaXJzdCBmaWxsIHRoZSByaW5nYnVmZmVyIGZyb20gdGhlIGlucHV0IGFuZCB0aGVuIGZsdXNoIHRoZSByaW5nYnVmZmVyIHRvXG4gICAgIHRoZSBvdXRwdXQgKi9cblxuXG4gIHdoaWxlIChyYl9wb3MgKyBsZW4gPj0gcmJfc2l6ZSkge1xuICAgIG5ieXRlcyA9IHJiX3NpemUgLSByYl9wb3M7XG5cbiAgICBpZiAoYnIuaW5wdXRfLnJlYWQocmluZ2J1ZmZlciwgcmJfcG9zLCBuYnl0ZXMpIDwgbmJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tDb3B5VW5jb21wcmVzc2VkQmxvY2tUb091dHB1dF0gbm90IGVub3VnaCBieXRlcycpO1xuICAgIH1cblxuICAgIG91dHB1dC53cml0ZShyaW5nYnVmZmVyLCByYl9zaXplKTtcbiAgICBsZW4gLT0gbmJ5dGVzO1xuICAgIHJiX3BvcyA9IDA7XG4gIH1cbiAgLyogQ29weSBzdHJhaWdodCBmcm9tIHRoZSBpbnB1dCBvbnRvIHRoZSByaW5nYnVmZmVyLiBUaGUgcmluZ2J1ZmZlciB3aWxsIGJlXG4gICAgIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBhdCBhIGxhdGVyIHRpbWUuICovXG5cblxuICBpZiAoYnIuaW5wdXRfLnJlYWQocmluZ2J1ZmZlciwgcmJfcG9zLCBsZW4pIDwgbGVuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbQ29weVVuY29tcHJlc3NlZEJsb2NrVG9PdXRwdXRdIG5vdCBlbm91Z2ggYnl0ZXMnKTtcbiAgfVxuICAvKiBSZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgYml0IHJlYWRlci4gKi9cblxuXG4gIGJyLnJlc2V0KCk7XG59XG4vKiBBZHZhbmNlcyB0aGUgYml0IHJlYWRlciBwb3NpdGlvbiB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5IGFuZCB2ZXJpZmllc1xuICAgdGhhdCBhbnkgc2tpcHBlZCBiaXRzIGFyZSBzZXQgdG8gemVyby4gKi9cblxuXG5mdW5jdGlvbiBKdW1wVG9CeXRlQm91bmRhcnkoYnIpIHtcbiAgdmFyIG5ld19iaXRfcG9zID0gYnIuYml0X3Bvc18gKyA3ICYgfjc7XG4gIHZhciBwYWRfYml0cyA9IGJyLnJlYWRCaXRzKG5ld19iaXRfcG9zIC0gYnIuYml0X3Bvc18pO1xuICByZXR1cm4gcGFkX2JpdHMgPT0gMDtcbn1cblxuZnVuY3Rpb24gQnJvdGxpRGVjb21wcmVzc2VkU2l6ZShidWZmZXIpIHtcbiAgdmFyIGlucHV0ID0gbmV3IEJyb3RsaUlucHV0JDEoYnVmZmVyKTtcbiAgdmFyIGJyID0gbmV3IGJpdF9yZWFkZXIoaW5wdXQpO1xuICBEZWNvZGVXaW5kb3dCaXRzKGJyKTtcbiAgdmFyIG91dCA9IERlY29kZU1ldGFCbG9ja0xlbmd0aChicik7XG4gIHJldHVybiBvdXQubWV0YV9ibG9ja19sZW5ndGg7XG59XG5cbnZhciBCcm90bGlEZWNvbXByZXNzZWRTaXplXzEgPSBCcm90bGlEZWNvbXByZXNzZWRTaXplO1xuXG5mdW5jdGlvbiBCcm90bGlEZWNvbXByZXNzQnVmZmVyKGJ1ZmZlciwgb3V0cHV0X3NpemUpIHtcbiAgdmFyIGlucHV0ID0gbmV3IEJyb3RsaUlucHV0JDEoYnVmZmVyKTtcblxuICBpZiAob3V0cHV0X3NpemUgPT0gbnVsbCkge1xuICAgIG91dHB1dF9zaXplID0gQnJvdGxpRGVjb21wcmVzc2VkU2l6ZShidWZmZXIpO1xuICB9XG5cbiAgdmFyIG91dHB1dF9idWZmZXIgPSBuZXcgVWludDhBcnJheShvdXRwdXRfc2l6ZSk7XG4gIHZhciBvdXRwdXQgPSBuZXcgQnJvdGxpT3V0cHV0JDEob3V0cHV0X2J1ZmZlcik7XG4gIEJyb3RsaURlY29tcHJlc3MoaW5wdXQsIG91dHB1dCk7XG5cbiAgaWYgKG91dHB1dC5wb3MgPCBvdXRwdXQuYnVmZmVyLmxlbmd0aCkge1xuICAgIG91dHB1dC5idWZmZXIgPSBvdXRwdXQuYnVmZmVyLnN1YmFycmF5KDAsIG91dHB1dC5wb3MpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dC5idWZmZXI7XG59XG5cbnZhciBCcm90bGlEZWNvbXByZXNzQnVmZmVyXzEgPSBCcm90bGlEZWNvbXByZXNzQnVmZmVyO1xuXG5mdW5jdGlvbiBCcm90bGlEZWNvbXByZXNzKGlucHV0LCBvdXRwdXQpIHtcbiAgdmFyIGk7XG4gIHZhciBwb3MgPSAwO1xuICB2YXIgaW5wdXRfZW5kID0gMDtcbiAgdmFyIHdpbmRvd19iaXRzID0gMDtcbiAgdmFyIG1heF9iYWNrd2FyZF9kaXN0YW5jZTtcbiAgdmFyIG1heF9kaXN0YW5jZSA9IDA7XG4gIHZhciByaW5nYnVmZmVyX3NpemU7XG4gIHZhciByaW5nYnVmZmVyX21hc2s7XG4gIHZhciByaW5nYnVmZmVyO1xuICB2YXIgcmluZ2J1ZmZlcl9lbmQ7XG4gIC8qIFRoaXMgcmluZyBidWZmZXIgaG9sZHMgYSBmZXcgcGFzdCBjb3B5IGRpc3RhbmNlcyB0aGF0IHdpbGwgYmUgdXNlZCBieSAqL1xuXG4gIC8qIHNvbWUgc3BlY2lhbCBkaXN0YW5jZSBjb2Rlcy4gKi9cblxuICB2YXIgZGlzdF9yYiA9IFsxNiwgMTUsIDExLCA0XTtcbiAgdmFyIGRpc3RfcmJfaWR4ID0gMDtcbiAgLyogVGhlIHByZXZpb3VzIDIgYnl0ZXMgdXNlZCBmb3IgY29udGV4dC4gKi9cblxuICB2YXIgcHJldl9ieXRlMSA9IDA7XG4gIHZhciBwcmV2X2J5dGUyID0gMDtcbiAgdmFyIGhncm91cCA9IFtuZXcgSHVmZm1hblRyZWVHcm91cCgwLCAwKSwgbmV3IEh1ZmZtYW5UcmVlR3JvdXAoMCwgMCksIG5ldyBIdWZmbWFuVHJlZUdyb3VwKDAsIDApXTtcbiAgdmFyIGJsb2NrX3R5cGVfdHJlZXM7XG4gIHZhciBibG9ja19sZW5fdHJlZXM7XG4gIHZhciBicjtcbiAgLyogV2UgbmVlZCB0aGUgc2xhY2sgcmVnaW9uIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XG4gICAgICAgLSBhbHdheXMgZG9pbmcgdHdvIDgtYnl0ZSBjb3BpZXMgZm9yIGZhc3QgYmFja3dhcmQgY29weWluZ1xuICAgICAgIC0gdHJhbnNmb3Jtc1xuICAgICAgIC0gZmx1c2hpbmcgdGhlIGlucHV0IHJpbmdidWZmZXIgd2hlbiBkZWNvZGluZyB1bmNvbXByZXNzZWQgYmxvY2tzICovXG5cbiAgdmFyIGtSaW5nQnVmZmVyV3JpdGVBaGVhZFNsYWNrID0gMTI4ICsgYml0X3JlYWRlci5SRUFEX1NJWkU7XG4gIGJyID0gbmV3IGJpdF9yZWFkZXIoaW5wdXQpO1xuICAvKiBEZWNvZGUgd2luZG93IHNpemUuICovXG5cbiAgd2luZG93X2JpdHMgPSBEZWNvZGVXaW5kb3dCaXRzKGJyKTtcbiAgbWF4X2JhY2t3YXJkX2Rpc3RhbmNlID0gKDEgPDwgd2luZG93X2JpdHMpIC0gMTY7XG4gIHJpbmdidWZmZXJfc2l6ZSA9IDEgPDwgd2luZG93X2JpdHM7XG4gIHJpbmdidWZmZXJfbWFzayA9IHJpbmdidWZmZXJfc2l6ZSAtIDE7XG4gIHJpbmdidWZmZXIgPSBuZXcgVWludDhBcnJheShyaW5nYnVmZmVyX3NpemUgKyBrUmluZ0J1ZmZlcldyaXRlQWhlYWRTbGFjayArIGRpY3Rpb25hcnkubWF4RGljdGlvbmFyeVdvcmRMZW5ndGgpO1xuICByaW5nYnVmZmVyX2VuZCA9IHJpbmdidWZmZXJfc2l6ZTtcbiAgYmxvY2tfdHlwZV90cmVlcyA9IFtdO1xuICBibG9ja19sZW5fdHJlZXMgPSBbXTtcblxuICBmb3IgKHZhciB4ID0gMDsgeCA8IDMgKiBIVUZGTUFOX01BWF9UQUJMRV9TSVpFOyB4KyspIHtcbiAgICBibG9ja190eXBlX3RyZWVzW3hdID0gbmV3IEh1ZmZtYW5Db2RlJDEoMCwgMCk7XG4gICAgYmxvY2tfbGVuX3RyZWVzW3hdID0gbmV3IEh1ZmZtYW5Db2RlJDEoMCwgMCk7XG4gIH1cblxuICB3aGlsZSAoIWlucHV0X2VuZCkge1xuICAgIHZhciBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4gPSAwO1xuICAgIHZhciBpc191bmNvbXByZXNzZWQ7XG4gICAgdmFyIGJsb2NrX2xlbmd0aCA9IFsxIDw8IDI4LCAxIDw8IDI4LCAxIDw8IDI4XTtcbiAgICB2YXIgYmxvY2tfdHlwZSA9IFswXTtcbiAgICB2YXIgbnVtX2Jsb2NrX3R5cGVzID0gWzEsIDEsIDFdO1xuICAgIHZhciBibG9ja190eXBlX3JiID0gWzAsIDEsIDAsIDEsIDAsIDFdO1xuICAgIHZhciBibG9ja190eXBlX3JiX2luZGV4ID0gWzBdO1xuICAgIHZhciBkaXN0YW5jZV9wb3N0Zml4X2JpdHM7XG4gICAgdmFyIG51bV9kaXJlY3RfZGlzdGFuY2VfY29kZXM7XG4gICAgdmFyIGRpc3RhbmNlX3Bvc3RmaXhfbWFzaztcbiAgICB2YXIgbnVtX2Rpc3RhbmNlX2NvZGVzO1xuICAgIHZhciBjb250ZXh0X21hcCA9IG51bGw7XG4gICAgdmFyIGNvbnRleHRfbW9kZXMgPSBudWxsO1xuICAgIHZhciBudW1fbGl0ZXJhbF9odHJlZXM7XG4gICAgdmFyIGRpc3RfY29udGV4dF9tYXAgPSBudWxsO1xuICAgIHZhciBudW1fZGlzdF9odHJlZXM7XG4gICAgdmFyIGNvbnRleHRfb2Zmc2V0ID0gMDtcbiAgICB2YXIgY29udGV4dF9tYXBfc2xpY2UgPSBudWxsO1xuICAgIHZhciBsaXRlcmFsX2h0cmVlX2luZGV4ID0gMDtcbiAgICB2YXIgZGlzdF9jb250ZXh0X29mZnNldCA9IDA7XG4gICAgdmFyIGRpc3RfY29udGV4dF9tYXBfc2xpY2UgPSBudWxsO1xuICAgIHZhciBkaXN0X2h0cmVlX2luZGV4ID0gMDtcbiAgICB2YXIgY29udGV4dF9sb29rdXBfb2Zmc2V0MSA9IDA7XG4gICAgdmFyIGNvbnRleHRfbG9va3VwX29mZnNldDIgPSAwO1xuICAgIHZhciBjb250ZXh0X21vZGU7XG4gICAgdmFyIGh0cmVlX2NvbW1hbmQ7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7XG4gICAgICBoZ3JvdXBbaV0uY29kZXMgPSBudWxsO1xuICAgICAgaGdyb3VwW2ldLmh0cmVlcyA9IG51bGw7XG4gICAgfVxuXG4gICAgYnIucmVhZE1vcmVJbnB1dCgpO1xuXG4gICAgdmFyIF9vdXQgPSBEZWNvZGVNZXRhQmxvY2tMZW5ndGgoYnIpO1xuXG4gICAgbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuID0gX291dC5tZXRhX2Jsb2NrX2xlbmd0aDtcblxuICAgIGlmIChwb3MgKyBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4gPiBvdXRwdXQuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgLyogV2UgbmVlZCB0byBncm93IHRoZSBvdXRwdXQgYnVmZmVyIHRvIGZpdCB0aGUgYWRkaXRpb25hbCBkYXRhLiAqL1xuICAgICAgdmFyIHRtcCA9IG5ldyBVaW50OEFycmF5KHBvcyArIG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbik7XG4gICAgICB0bXAuc2V0KG91dHB1dC5idWZmZXIpO1xuICAgICAgb3V0cHV0LmJ1ZmZlciA9IHRtcDtcbiAgICB9XG5cbiAgICBpbnB1dF9lbmQgPSBfb3V0LmlucHV0X2VuZDtcbiAgICBpc191bmNvbXByZXNzZWQgPSBfb3V0LmlzX3VuY29tcHJlc3NlZDtcblxuICAgIGlmIChfb3V0LmlzX21ldGFkYXRhKSB7XG4gICAgICBKdW1wVG9CeXRlQm91bmRhcnkoYnIpO1xuXG4gICAgICBmb3IgKDsgbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuID4gMDsgLS1tZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4pIHtcbiAgICAgICAgYnIucmVhZE1vcmVJbnB1dCgpO1xuICAgICAgICAvKiBSZWFkIG9uZSBieXRlIGFuZCBpZ25vcmUgaXQuICovXG5cbiAgICAgICAgYnIucmVhZEJpdHMoOCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4gPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc191bmNvbXByZXNzZWQpIHtcbiAgICAgIGJyLmJpdF9wb3NfID0gYnIuYml0X3Bvc18gKyA3ICYgfjc7XG4gICAgICBDb3B5VW5jb21wcmVzc2VkQmxvY2tUb091dHB1dChvdXRwdXQsIG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbiwgcG9zLCByaW5nYnVmZmVyLCByaW5nYnVmZmVyX21hc2ssIGJyKTtcbiAgICAgIHBvcyArPSBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW47XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7XG4gICAgICBudW1fYmxvY2tfdHlwZXNbaV0gPSBEZWNvZGVWYXJMZW5VaW50OChicikgKyAxO1xuXG4gICAgICBpZiAobnVtX2Jsb2NrX3R5cGVzW2ldID49IDIpIHtcbiAgICAgICAgUmVhZEh1ZmZtYW5Db2RlKG51bV9ibG9ja190eXBlc1tpXSArIDIsIGJsb2NrX3R5cGVfdHJlZXMsIGkgKiBIVUZGTUFOX01BWF9UQUJMRV9TSVpFLCBicik7XG4gICAgICAgIFJlYWRIdWZmbWFuQ29kZShrTnVtQmxvY2tMZW5ndGhDb2RlcywgYmxvY2tfbGVuX3RyZWVzLCBpICogSFVGRk1BTl9NQVhfVEFCTEVfU0laRSwgYnIpO1xuICAgICAgICBibG9ja19sZW5ndGhbaV0gPSBSZWFkQmxvY2tMZW5ndGgoYmxvY2tfbGVuX3RyZWVzLCBpICogSFVGRk1BTl9NQVhfVEFCTEVfU0laRSwgYnIpO1xuICAgICAgICBibG9ja190eXBlX3JiX2luZGV4W2ldID0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBici5yZWFkTW9yZUlucHV0KCk7XG4gICAgZGlzdGFuY2VfcG9zdGZpeF9iaXRzID0gYnIucmVhZEJpdHMoMik7XG4gICAgbnVtX2RpcmVjdF9kaXN0YW5jZV9jb2RlcyA9IE5VTV9ESVNUQU5DRV9TSE9SVF9DT0RFUyArIChici5yZWFkQml0cyg0KSA8PCBkaXN0YW5jZV9wb3N0Zml4X2JpdHMpO1xuICAgIGRpc3RhbmNlX3Bvc3RmaXhfbWFzayA9ICgxIDw8IGRpc3RhbmNlX3Bvc3RmaXhfYml0cykgLSAxO1xuICAgIG51bV9kaXN0YW5jZV9jb2RlcyA9IG51bV9kaXJlY3RfZGlzdGFuY2VfY29kZXMgKyAoNDggPDwgZGlzdGFuY2VfcG9zdGZpeF9iaXRzKTtcbiAgICBjb250ZXh0X21vZGVzID0gbmV3IFVpbnQ4QXJyYXkobnVtX2Jsb2NrX3R5cGVzWzBdKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tfdHlwZXNbMF07ICsraSkge1xuICAgICAgYnIucmVhZE1vcmVJbnB1dCgpO1xuICAgICAgY29udGV4dF9tb2Rlc1tpXSA9IGJyLnJlYWRCaXRzKDIpIDw8IDE7XG4gICAgfVxuXG4gICAgdmFyIF9vMSA9IERlY29kZUNvbnRleHRNYXAobnVtX2Jsb2NrX3R5cGVzWzBdIDw8IGtMaXRlcmFsQ29udGV4dEJpdHMsIGJyKTtcblxuICAgIG51bV9saXRlcmFsX2h0cmVlcyA9IF9vMS5udW1faHRyZWVzO1xuICAgIGNvbnRleHRfbWFwID0gX28xLmNvbnRleHRfbWFwO1xuXG4gICAgdmFyIF9vMiA9IERlY29kZUNvbnRleHRNYXAobnVtX2Jsb2NrX3R5cGVzWzJdIDw8IGtEaXN0YW5jZUNvbnRleHRCaXRzLCBicik7XG5cbiAgICBudW1fZGlzdF9odHJlZXMgPSBfbzIubnVtX2h0cmVlcztcbiAgICBkaXN0X2NvbnRleHRfbWFwID0gX28yLmNvbnRleHRfbWFwO1xuICAgIGhncm91cFswXSA9IG5ldyBIdWZmbWFuVHJlZUdyb3VwKGtOdW1MaXRlcmFsQ29kZXMsIG51bV9saXRlcmFsX2h0cmVlcyk7XG4gICAgaGdyb3VwWzFdID0gbmV3IEh1ZmZtYW5UcmVlR3JvdXAoa051bUluc2VydEFuZENvcHlDb2RlcywgbnVtX2Jsb2NrX3R5cGVzWzFdKTtcbiAgICBoZ3JvdXBbMl0gPSBuZXcgSHVmZm1hblRyZWVHcm91cChudW1fZGlzdGFuY2VfY29kZXMsIG51bV9kaXN0X2h0cmVlcyk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7XG4gICAgICBoZ3JvdXBbaV0uZGVjb2RlKGJyKTtcbiAgICB9XG5cbiAgICBjb250ZXh0X21hcF9zbGljZSA9IDA7XG4gICAgZGlzdF9jb250ZXh0X21hcF9zbGljZSA9IDA7XG4gICAgY29udGV4dF9tb2RlID0gY29udGV4dF9tb2Rlc1tibG9ja190eXBlWzBdXTtcbiAgICBjb250ZXh0X2xvb2t1cF9vZmZzZXQxID0gY29udGV4dC5sb29rdXBPZmZzZXRzW2NvbnRleHRfbW9kZV07XG4gICAgY29udGV4dF9sb29rdXBfb2Zmc2V0MiA9IGNvbnRleHQubG9va3VwT2Zmc2V0c1tjb250ZXh0X21vZGUgKyAxXTtcbiAgICBodHJlZV9jb21tYW5kID0gaGdyb3VwWzFdLmh0cmVlc1swXTtcblxuICAgIHdoaWxlIChtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4gPiAwKSB7XG4gICAgICB2YXIgY21kX2NvZGU7XG4gICAgICB2YXIgcmFuZ2VfaWR4O1xuICAgICAgdmFyIGluc2VydF9jb2RlO1xuICAgICAgdmFyIGNvcHlfY29kZTtcbiAgICAgIHZhciBpbnNlcnRfbGVuZ3RoO1xuICAgICAgdmFyIGNvcHlfbGVuZ3RoO1xuICAgICAgdmFyIGRpc3RhbmNlX2NvZGU7XG4gICAgICB2YXIgZGlzdGFuY2U7XG4gICAgICB2YXIgY29udGV4dCQxO1xuICAgICAgdmFyIGo7XG4gICAgICB2YXIgY29weV9kc3Q7XG4gICAgICBici5yZWFkTW9yZUlucHV0KCk7XG5cbiAgICAgIGlmIChibG9ja19sZW5ndGhbMV0gPT09IDApIHtcbiAgICAgICAgRGVjb2RlQmxvY2tUeXBlKG51bV9ibG9ja190eXBlc1sxXSwgYmxvY2tfdHlwZV90cmVlcywgMSwgYmxvY2tfdHlwZSwgYmxvY2tfdHlwZV9yYiwgYmxvY2tfdHlwZV9yYl9pbmRleCwgYnIpO1xuICAgICAgICBibG9ja19sZW5ndGhbMV0gPSBSZWFkQmxvY2tMZW5ndGgoYmxvY2tfbGVuX3RyZWVzLCBIVUZGTUFOX01BWF9UQUJMRV9TSVpFLCBicik7XG4gICAgICAgIGh0cmVlX2NvbW1hbmQgPSBoZ3JvdXBbMV0uaHRyZWVzW2Jsb2NrX3R5cGVbMV1dO1xuICAgICAgfVxuXG4gICAgICAtLWJsb2NrX2xlbmd0aFsxXTtcbiAgICAgIGNtZF9jb2RlID0gUmVhZFN5bWJvbChoZ3JvdXBbMV0uY29kZXMsIGh0cmVlX2NvbW1hbmQsIGJyKTtcbiAgICAgIHJhbmdlX2lkeCA9IGNtZF9jb2RlID4+IDY7XG5cbiAgICAgIGlmIChyYW5nZV9pZHggPj0gMikge1xuICAgICAgICByYW5nZV9pZHggLT0gMjtcbiAgICAgICAgZGlzdGFuY2VfY29kZSA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzdGFuY2VfY29kZSA9IDA7XG4gICAgICB9XG5cbiAgICAgIGluc2VydF9jb2RlID0gcHJlZml4LmtJbnNlcnRSYW5nZUx1dFtyYW5nZV9pZHhdICsgKGNtZF9jb2RlID4+IDMgJiA3KTtcbiAgICAgIGNvcHlfY29kZSA9IHByZWZpeC5rQ29weVJhbmdlTHV0W3JhbmdlX2lkeF0gKyAoY21kX2NvZGUgJiA3KTtcbiAgICAgIGluc2VydF9sZW5ndGggPSBwcmVmaXgua0luc2VydExlbmd0aFByZWZpeENvZGVbaW5zZXJ0X2NvZGVdLm9mZnNldCArIGJyLnJlYWRCaXRzKHByZWZpeC5rSW5zZXJ0TGVuZ3RoUHJlZml4Q29kZVtpbnNlcnRfY29kZV0ubmJpdHMpO1xuICAgICAgY29weV9sZW5ndGggPSBwcmVmaXgua0NvcHlMZW5ndGhQcmVmaXhDb2RlW2NvcHlfY29kZV0ub2Zmc2V0ICsgYnIucmVhZEJpdHMocHJlZml4LmtDb3B5TGVuZ3RoUHJlZml4Q29kZVtjb3B5X2NvZGVdLm5iaXRzKTtcbiAgICAgIHByZXZfYnl0ZTEgPSByaW5nYnVmZmVyW3BvcyAtIDEgJiByaW5nYnVmZmVyX21hc2tdO1xuICAgICAgcHJldl9ieXRlMiA9IHJpbmdidWZmZXJbcG9zIC0gMiAmIHJpbmdidWZmZXJfbWFza107XG5cbiAgICAgIGZvciAoaiA9IDA7IGogPCBpbnNlcnRfbGVuZ3RoOyArK2opIHtcbiAgICAgICAgYnIucmVhZE1vcmVJbnB1dCgpO1xuXG4gICAgICAgIGlmIChibG9ja19sZW5ndGhbMF0gPT09IDApIHtcbiAgICAgICAgICBEZWNvZGVCbG9ja1R5cGUobnVtX2Jsb2NrX3R5cGVzWzBdLCBibG9ja190eXBlX3RyZWVzLCAwLCBibG9ja190eXBlLCBibG9ja190eXBlX3JiLCBibG9ja190eXBlX3JiX2luZGV4LCBicik7XG4gICAgICAgICAgYmxvY2tfbGVuZ3RoWzBdID0gUmVhZEJsb2NrTGVuZ3RoKGJsb2NrX2xlbl90cmVlcywgMCwgYnIpO1xuICAgICAgICAgIGNvbnRleHRfb2Zmc2V0ID0gYmxvY2tfdHlwZVswXSA8PCBrTGl0ZXJhbENvbnRleHRCaXRzO1xuICAgICAgICAgIGNvbnRleHRfbWFwX3NsaWNlID0gY29udGV4dF9vZmZzZXQ7XG4gICAgICAgICAgY29udGV4dF9tb2RlID0gY29udGV4dF9tb2Rlc1tibG9ja190eXBlWzBdXTtcbiAgICAgICAgICBjb250ZXh0X2xvb2t1cF9vZmZzZXQxID0gY29udGV4dC5sb29rdXBPZmZzZXRzW2NvbnRleHRfbW9kZV07XG4gICAgICAgICAgY29udGV4dF9sb29rdXBfb2Zmc2V0MiA9IGNvbnRleHQubG9va3VwT2Zmc2V0c1tjb250ZXh0X21vZGUgKyAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQkMSA9IGNvbnRleHQubG9va3VwW2NvbnRleHRfbG9va3VwX29mZnNldDEgKyBwcmV2X2J5dGUxXSB8IGNvbnRleHQubG9va3VwW2NvbnRleHRfbG9va3VwX29mZnNldDIgKyBwcmV2X2J5dGUyXTtcbiAgICAgICAgbGl0ZXJhbF9odHJlZV9pbmRleCA9IGNvbnRleHRfbWFwW2NvbnRleHRfbWFwX3NsaWNlICsgY29udGV4dCQxXTtcbiAgICAgICAgLS1ibG9ja19sZW5ndGhbMF07XG4gICAgICAgIHByZXZfYnl0ZTIgPSBwcmV2X2J5dGUxO1xuICAgICAgICBwcmV2X2J5dGUxID0gUmVhZFN5bWJvbChoZ3JvdXBbMF0uY29kZXMsIGhncm91cFswXS5odHJlZXNbbGl0ZXJhbF9odHJlZV9pbmRleF0sIGJyKTtcbiAgICAgICAgcmluZ2J1ZmZlcltwb3MgJiByaW5nYnVmZmVyX21hc2tdID0gcHJldl9ieXRlMTtcblxuICAgICAgICBpZiAoKHBvcyAmIHJpbmdidWZmZXJfbWFzaykgPT09IHJpbmdidWZmZXJfbWFzaykge1xuICAgICAgICAgIG91dHB1dC53cml0ZShyaW5nYnVmZmVyLCByaW5nYnVmZmVyX3NpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgKytwb3M7XG4gICAgICB9XG5cbiAgICAgIG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbiAtPSBpbnNlcnRfbGVuZ3RoO1xuICAgICAgaWYgKG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbiA8PSAwKSBicmVhaztcblxuICAgICAgaWYgKGRpc3RhbmNlX2NvZGUgPCAwKSB7XG4gICAgICAgIHZhciBjb250ZXh0JDE7XG4gICAgICAgIGJyLnJlYWRNb3JlSW5wdXQoKTtcblxuICAgICAgICBpZiAoYmxvY2tfbGVuZ3RoWzJdID09PSAwKSB7XG4gICAgICAgICAgRGVjb2RlQmxvY2tUeXBlKG51bV9ibG9ja190eXBlc1syXSwgYmxvY2tfdHlwZV90cmVlcywgMiwgYmxvY2tfdHlwZSwgYmxvY2tfdHlwZV9yYiwgYmxvY2tfdHlwZV9yYl9pbmRleCwgYnIpO1xuICAgICAgICAgIGJsb2NrX2xlbmd0aFsyXSA9IFJlYWRCbG9ja0xlbmd0aChibG9ja19sZW5fdHJlZXMsIDIgKiBIVUZGTUFOX01BWF9UQUJMRV9TSVpFLCBicik7XG4gICAgICAgICAgZGlzdF9jb250ZXh0X29mZnNldCA9IGJsb2NrX3R5cGVbMl0gPDwga0Rpc3RhbmNlQ29udGV4dEJpdHM7XG4gICAgICAgICAgZGlzdF9jb250ZXh0X21hcF9zbGljZSA9IGRpc3RfY29udGV4dF9vZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICAtLWJsb2NrX2xlbmd0aFsyXTtcbiAgICAgICAgY29udGV4dCQxID0gKGNvcHlfbGVuZ3RoID4gNCA/IDMgOiBjb3B5X2xlbmd0aCAtIDIpICYgMHhmZjtcbiAgICAgICAgZGlzdF9odHJlZV9pbmRleCA9IGRpc3RfY29udGV4dF9tYXBbZGlzdF9jb250ZXh0X21hcF9zbGljZSArIGNvbnRleHQkMV07XG4gICAgICAgIGRpc3RhbmNlX2NvZGUgPSBSZWFkU3ltYm9sKGhncm91cFsyXS5jb2RlcywgaGdyb3VwWzJdLmh0cmVlc1tkaXN0X2h0cmVlX2luZGV4XSwgYnIpO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZV9jb2RlID49IG51bV9kaXJlY3RfZGlzdGFuY2VfY29kZXMpIHtcbiAgICAgICAgICB2YXIgbmJpdHM7XG4gICAgICAgICAgdmFyIHBvc3RmaXg7XG4gICAgICAgICAgdmFyIG9mZnNldDtcbiAgICAgICAgICBkaXN0YW5jZV9jb2RlIC09IG51bV9kaXJlY3RfZGlzdGFuY2VfY29kZXM7XG4gICAgICAgICAgcG9zdGZpeCA9IGRpc3RhbmNlX2NvZGUgJiBkaXN0YW5jZV9wb3N0Zml4X21hc2s7XG4gICAgICAgICAgZGlzdGFuY2VfY29kZSA+Pj0gZGlzdGFuY2VfcG9zdGZpeF9iaXRzO1xuICAgICAgICAgIG5iaXRzID0gKGRpc3RhbmNlX2NvZGUgPj4gMSkgKyAxO1xuICAgICAgICAgIG9mZnNldCA9ICgyICsgKGRpc3RhbmNlX2NvZGUgJiAxKSA8PCBuYml0cykgLSA0O1xuICAgICAgICAgIGRpc3RhbmNlX2NvZGUgPSBudW1fZGlyZWN0X2Rpc3RhbmNlX2NvZGVzICsgKG9mZnNldCArIGJyLnJlYWRCaXRzKG5iaXRzKSA8PCBkaXN0YW5jZV9wb3N0Zml4X2JpdHMpICsgcG9zdGZpeDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogQ29udmVydCB0aGUgZGlzdGFuY2UgY29kZSB0byB0aGUgYWN0dWFsIGRpc3RhbmNlIGJ5IHBvc3NpYmx5IGxvb2tpbmcgKi9cblxuICAgICAgLyogdXAgcGFzdCBkaXN0bmFjZXMgZnJvbSB0aGUgcmluZ2J1ZmZlci4gKi9cblxuXG4gICAgICBkaXN0YW5jZSA9IFRyYW5zbGF0ZVNob3J0Q29kZXMoZGlzdGFuY2VfY29kZSwgZGlzdF9yYiwgZGlzdF9yYl9pZHgpO1xuXG4gICAgICBpZiAoZGlzdGFuY2UgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignW0Jyb3RsaURlY29tcHJlc3NdIGludmFsaWQgZGlzdGFuY2UnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvcyA8IG1heF9iYWNrd2FyZF9kaXN0YW5jZSAmJiBtYXhfZGlzdGFuY2UgIT09IG1heF9iYWNrd2FyZF9kaXN0YW5jZSkge1xuICAgICAgICBtYXhfZGlzdGFuY2UgPSBwb3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXhfZGlzdGFuY2UgPSBtYXhfYmFja3dhcmRfZGlzdGFuY2U7XG4gICAgICB9XG5cbiAgICAgIGNvcHlfZHN0ID0gcG9zICYgcmluZ2J1ZmZlcl9tYXNrO1xuXG4gICAgICBpZiAoZGlzdGFuY2UgPiBtYXhfZGlzdGFuY2UpIHtcbiAgICAgICAgaWYgKGNvcHlfbGVuZ3RoID49IGRpY3Rpb25hcnkubWluRGljdGlvbmFyeVdvcmRMZW5ndGggJiYgY29weV9sZW5ndGggPD0gZGljdGlvbmFyeS5tYXhEaWN0aW9uYXJ5V29yZExlbmd0aCkge1xuICAgICAgICAgIHZhciBvZmZzZXQgPSBkaWN0aW9uYXJ5Lm9mZnNldHNCeUxlbmd0aFtjb3B5X2xlbmd0aF07XG4gICAgICAgICAgdmFyIHdvcmRfaWQgPSBkaXN0YW5jZSAtIG1heF9kaXN0YW5jZSAtIDE7XG4gICAgICAgICAgdmFyIHNoaWZ0ID0gZGljdGlvbmFyeS5zaXplQml0c0J5TGVuZ3RoW2NvcHlfbGVuZ3RoXTtcbiAgICAgICAgICB2YXIgbWFzayA9ICgxIDw8IHNoaWZ0KSAtIDE7XG4gICAgICAgICAgdmFyIHdvcmRfaWR4ID0gd29yZF9pZCAmIG1hc2s7XG4gICAgICAgICAgdmFyIHRyYW5zZm9ybV9pZHggPSB3b3JkX2lkID4+IHNoaWZ0O1xuICAgICAgICAgIG9mZnNldCArPSB3b3JkX2lkeCAqIGNvcHlfbGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKHRyYW5zZm9ybV9pZHggPCB0cmFuc2Zvcm0ua051bVRyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgIHZhciBsZW4gPSB0cmFuc2Zvcm0udHJhbnNmb3JtRGljdGlvbmFyeVdvcmQocmluZ2J1ZmZlciwgY29weV9kc3QsIG9mZnNldCwgY29weV9sZW5ndGgsIHRyYW5zZm9ybV9pZHgpO1xuICAgICAgICAgICAgY29weV9kc3QgKz0gbGVuO1xuICAgICAgICAgICAgcG9zICs9IGxlbjtcbiAgICAgICAgICAgIG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbiAtPSBsZW47XG5cbiAgICAgICAgICAgIGlmIChjb3B5X2RzdCA+PSByaW5nYnVmZmVyX2VuZCkge1xuICAgICAgICAgICAgICBvdXRwdXQud3JpdGUocmluZ2J1ZmZlciwgcmluZ2J1ZmZlcl9zaXplKTtcblxuICAgICAgICAgICAgICBmb3IgKHZhciBfeCA9IDA7IF94IDwgY29weV9kc3QgLSByaW5nYnVmZmVyX2VuZDsgX3grKykge1xuICAgICAgICAgICAgICAgIHJpbmdidWZmZXJbX3hdID0gcmluZ2J1ZmZlcltyaW5nYnVmZmVyX2VuZCArIF94XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhY2t3YXJkIHJlZmVyZW5jZS4gcG9zOiBcIiArIHBvcyArIFwiIGRpc3RhbmNlOiBcIiArIGRpc3RhbmNlICsgXCIgbGVuOiBcIiArIGNvcHlfbGVuZ3RoICsgXCIgYnl0ZXMgbGVmdDogXCIgKyBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhY2t3YXJkIHJlZmVyZW5jZS4gcG9zOiBcIiArIHBvcyArIFwiIGRpc3RhbmNlOiBcIiArIGRpc3RhbmNlICsgXCIgbGVuOiBcIiArIGNvcHlfbGVuZ3RoICsgXCIgYnl0ZXMgbGVmdDogXCIgKyBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGlzdGFuY2VfY29kZSA+IDApIHtcbiAgICAgICAgICBkaXN0X3JiW2Rpc3RfcmJfaWR4ICYgM10gPSBkaXN0YW5jZTtcbiAgICAgICAgICArK2Rpc3RfcmJfaWR4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvcHlfbGVuZ3RoID4gbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYWNrd2FyZCByZWZlcmVuY2UuIHBvczogXCIgKyBwb3MgKyBcIiBkaXN0YW5jZTogXCIgKyBkaXN0YW5jZSArIFwiIGxlbjogXCIgKyBjb3B5X2xlbmd0aCArIFwiIGJ5dGVzIGxlZnQ6IFwiICsgbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBjb3B5X2xlbmd0aDsgKytqKSB7XG4gICAgICAgICAgcmluZ2J1ZmZlcltwb3MgJiByaW5nYnVmZmVyX21hc2tdID0gcmluZ2J1ZmZlcltwb3MgLSBkaXN0YW5jZSAmIHJpbmdidWZmZXJfbWFza107XG5cbiAgICAgICAgICBpZiAoKHBvcyAmIHJpbmdidWZmZXJfbWFzaykgPT09IHJpbmdidWZmZXJfbWFzaykge1xuICAgICAgICAgICAgb3V0cHV0LndyaXRlKHJpbmdidWZmZXIsIHJpbmdidWZmZXJfc2l6ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgKytwb3M7XG4gICAgICAgICAgLS1tZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8qIFdoZW4gd2UgZ2V0IGhlcmUsIHdlIG11c3QgaGF2ZSBpbnNlcnRlZCBhdCBsZWFzdCBvbmUgbGl0ZXJhbCBhbmQgKi9cblxuICAgICAgLyogbWFkZSBhIGNvcHkgb2YgYXQgbGVhc3QgbGVuZ3RoIHR3bywgdGhlcmVmb3JlIGFjY2Vzc2luZyB0aGUgbGFzdCAyICovXG5cbiAgICAgIC8qIGJ5dGVzIGlzIHZhbGlkLiAqL1xuXG5cbiAgICAgIHByZXZfYnl0ZTEgPSByaW5nYnVmZmVyW3BvcyAtIDEgJiByaW5nYnVmZmVyX21hc2tdO1xuICAgICAgcHJldl9ieXRlMiA9IHJpbmdidWZmZXJbcG9zIC0gMiAmIHJpbmdidWZmZXJfbWFza107XG4gICAgfVxuICAgIC8qIFByb3RlY3QgcG9zIGZyb20gb3ZlcmZsb3csIHdyYXAgaXQgYXJvdW5kIGF0IGV2ZXJ5IEdCIG9mIGlucHV0IGRhdGEgKi9cblxuXG4gICAgcG9zICY9IDB4M2ZmZmZmZmY7XG4gIH1cblxuICBvdXRwdXQud3JpdGUocmluZ2J1ZmZlciwgcG9zICYgcmluZ2J1ZmZlcl9tYXNrKTtcbn1cblxudmFyIEJyb3RsaURlY29tcHJlc3NfMSA9IEJyb3RsaURlY29tcHJlc3M7XG5kaWN0aW9uYXJ5LmluaXQoQnJvdGxpRGVjb21wcmVzc0J1ZmZlcik7XG52YXIgZGVjb2RlID0ge1xuICBCcm90bGlEZWNvbXByZXNzZWRTaXplOiBCcm90bGlEZWNvbXByZXNzZWRTaXplXzEsXG4gIEJyb3RsaURlY29tcHJlc3NCdWZmZXI6IEJyb3RsaURlY29tcHJlc3NCdWZmZXJfMSxcbiAgQnJvdGxpRGVjb21wcmVzczogQnJvdGxpRGVjb21wcmVzc18xXG59O1xuXG52YXIgZGVjb21wcmVzcyA9IGRlY29kZS5Ccm90bGlEZWNvbXByZXNzQnVmZmVyO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSRnKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgVHJ1ZVR5cGUgZ2x5cGggaW4gdGhlIFdPRkYyIGZvcm1hdCwgd2hpY2ggY29tcHJlc3NlcyBnbHlwaHMgZGlmZmVyZW50bHkuXG4gKi9cblxudmFyIFdPRkYyR2x5cGggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9UVEZHbHlwaCkge1xuICBfaW5oZXJpdHNMb29zZSRnKFdPRkYyR2x5cGgsIF9UVEZHbHlwaCk7XG5cbiAgZnVuY3Rpb24gV09GRjJHbHlwaCgpIHtcbiAgICByZXR1cm4gX1RURkdseXBoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBXT0ZGMkdseXBoLnByb3RvdHlwZTtcblxuICBfcHJvdG8uX2RlY29kZSA9IGZ1bmN0aW9uIF9kZWNvZGUoKSB7XG4gICAgLy8gV2UgaGF2ZSB0byBkZWNvZGUgaW4gYWR2YW5jZSAoaW4gV09GRjJGb250KSwgc28ganVzdCByZXR1cm4gdGhlIHByZS1kZWNvZGVkIGRhdGEuXG4gICAgcmV0dXJuIHRoaXMuX2ZvbnQuX3RyYW5zZm9ybWVkR2x5cGhzW3RoaXMuaWRdO1xuICB9O1xuXG4gIF9wcm90by5fZ2V0Q0JveCA9IGZ1bmN0aW9uIF9nZXRDQm94KCkge1xuICAgIHJldHVybiB0aGlzLnBhdGguYmJveDtcbiAgfTtcblxuICByZXR1cm4gV09GRjJHbHlwaDtcbn0oVFRGR2x5cGgpO1xuXG52YXIgQmFzZTEyOCA9IHtcbiAgZGVjb2RlOiBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtKSB7XG4gICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgdmFyIGl0ZXJhYmxlID0gWzAsIDEsIDIsIDMsIDRdO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBpdGVyYWJsZS5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGNvZGUgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7IC8vIElmIGFueSBvZiB0aGUgdG9wIHNldmVuIGJpdHMgYXJlIHNldCB0aGVuIHdlJ3JlIGFib3V0IHRvIG92ZXJmbG93LlxuXG4gICAgICBpZiAocmVzdWx0ICYgMHhlMDAwMDAwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ092ZXJmbG93Jyk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCA9IHJlc3VsdCA8PCA3IHwgY29kZSAmIDB4N2Y7XG5cbiAgICAgIGlmICgoY29kZSAmIDB4ODApID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgYmFzZSAxMjggbnVtYmVyJyk7XG4gIH1cbn07XG52YXIga25vd25UYWdzID0gWydjbWFwJywgJ2hlYWQnLCAnaGhlYScsICdobXR4JywgJ21heHAnLCAnbmFtZScsICdPUy8yJywgJ3Bvc3QnLCAnY3Z0ICcsICdmcGdtJywgJ2dseWYnLCAnbG9jYScsICdwcmVwJywgJ0NGRiAnLCAnVk9SRycsICdFQkRUJywgJ0VCTEMnLCAnZ2FzcCcsICdoZG14JywgJ2tlcm4nLCAnTFRTSCcsICdQQ0xUJywgJ1ZETVgnLCAndmhlYScsICd2bXR4JywgJ0JBU0UnLCAnR0RFRicsICdHUE9TJywgJ0dTVUInLCAnRUJTQycsICdKU1RGJywgJ01BVEgnLCAnQ0JEVCcsICdDQkxDJywgJ0NPTFInLCAnQ1BBTCcsICdTVkcgJywgJ3NiaXgnLCAnYWNudCcsICdhdmFyJywgJ2JkYXQnLCAnYmxvYycsICdic2xuJywgJ2N2YXInLCAnZmRzYycsICdmZWF0JywgJ2ZtdHgnLCAnZnZhcicsICdndmFyJywgJ2hzdHknLCAnanVzdCcsICdsY2FyJywgJ21vcnQnLCAnbW9yeCcsICdvcGJkJywgJ3Byb3AnLCAndHJhaycsICdaYXBmJywgJ1NpbGYnLCAnR2xhdCcsICdHbG9jJywgJ0ZlYXQnLCAnU2lsbCddO1xudmFyIFdPRkYyRGlyZWN0b3J5RW50cnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBjdXN0b21UYWc6IG5ldyByZXN0cnVjdHVyZS5PcHRpb25hbChuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiAodC5mbGFncyAmIDB4M2YpID09PSAweDNmO1xuICB9KSxcbiAgdGFnOiBmdW5jdGlvbiB0YWcodCkge1xuICAgIHJldHVybiB0LmN1c3RvbVRhZyB8fCBrbm93blRhZ3NbdC5mbGFncyAmIDB4M2ZdO1xuICB9LFxuICAvLyB8fCAoKCkgPT4geyB0aHJvdyBuZXcgRXJyb3IoYEJhZCB0YWc6ICR7ZmxhZ3MgJiAweDNmfWApOyB9KSgpOyB9LFxuICBsZW5ndGg6IEJhc2UxMjgsXG4gIHRyYW5zZm9ybVZlcnNpb246IGZ1bmN0aW9uIHRyYW5zZm9ybVZlcnNpb24odCkge1xuICAgIHJldHVybiB0LmZsYWdzID4+PiA2ICYgMHgwMztcbiAgfSxcbiAgdHJhbnNmb3JtZWQ6IGZ1bmN0aW9uIHRyYW5zZm9ybWVkKHQpIHtcbiAgICByZXR1cm4gdC50YWcgPT09ICdnbHlmJyB8fCB0LnRhZyA9PT0gJ2xvY2EnID8gdC50cmFuc2Zvcm1WZXJzaW9uID09PSAwIDogdC50cmFuc2Zvcm1WZXJzaW9uICE9PSAwO1xuICB9LFxuICB0cmFuc2Zvcm1MZW5ndGg6IG5ldyByZXN0cnVjdHVyZS5PcHRpb25hbChCYXNlMTI4LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnRyYW5zZm9ybWVkO1xuICB9KVxufSk7XG52YXIgV09GRjJEaXJlY3RvcnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICAvLyBzaG91bGQgYmUgJ3dPRjInXG4gIGZsYXZvcjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbnVtVGFibGVzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgdG90YWxTZm50U2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICB0b3RhbENvbXByZXNzZWRTaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG1ham9yVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtaW5vclZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWV0YU9mZnNldDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBtZXRhTGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG1ldGFPcmlnTGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHByaXZPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgcHJpdkxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICB0YWJsZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShXT0ZGMkRpcmVjdG9yeUVudHJ5LCAnbnVtVGFibGVzJylcbn0pO1xuXG5XT0ZGMkRpcmVjdG9yeS5wcm9jZXNzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGFibGVzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0YWJsZSA9IHRoaXMudGFibGVzW2ldO1xuICAgIHRhYmxlc1t0YWJsZS50YWddID0gdGFibGU7XG4gIH1cblxuICByZXR1cm4gdGhpcy50YWJsZXMgPSB0YWJsZXM7XG59O1xuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSRoKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuLyoqXG4gKiBTdWJjbGFzcyBvZiBUVEZGb250IHRoYXQgcmVwcmVzZW50cyBhIFRURi9PVEYgZm9udCBjb21wcmVzc2VkIGJ5IFdPRkYyXG4gKiBTZWUgc3BlYyBoZXJlOiBodHRwOi8vd3d3LnczLm9yZy9UUi9XT0ZGMi9cbiAqL1xuXG52YXIgV09GRjJGb250ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfVFRGRm9udCkge1xuICBfaW5oZXJpdHNMb29zZSRoKFdPRkYyRm9udCwgX1RURkZvbnQpO1xuXG4gIGZ1bmN0aW9uIFdPRkYyRm9udCgpIHtcbiAgICByZXR1cm4gX1RURkZvbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgV09GRjJGb250LnByb2JlID0gZnVuY3Rpb24gcHJvYmUoYnVmZmVyKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygnYXNjaWknLCAwLCA0KSA9PT0gJ3dPRjInO1xuICB9O1xuXG4gIHZhciBfcHJvdG8gPSBXT0ZGMkZvbnQucHJvdG90eXBlO1xuXG4gIF9wcm90by5fZGVjb2RlRGlyZWN0b3J5ID0gZnVuY3Rpb24gX2RlY29kZURpcmVjdG9yeSgpIHtcbiAgICB0aGlzLmRpcmVjdG9yeSA9IFdPRkYyRGlyZWN0b3J5LmRlY29kZSh0aGlzLnN0cmVhbSk7XG4gICAgdGhpcy5fZGF0YVBvcyA9IHRoaXMuc3RyZWFtLnBvcztcbiAgfTtcblxuICBfcHJvdG8uX2RlY29tcHJlc3MgPSBmdW5jdGlvbiBfZGVjb21wcmVzcygpIHtcbiAgICAvLyBkZWNvbXByZXNzIGRhdGEgYW5kIHNldHVwIHRhYmxlIG9mZnNldHMgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5XG4gICAgaWYgKCF0aGlzLl9kZWNvbXByZXNzZWQpIHtcbiAgICAgIHRoaXMuc3RyZWFtLnBvcyA9IHRoaXMuX2RhdGFQb3M7XG4gICAgICB2YXIgYnVmZmVyID0gdGhpcy5zdHJlYW0ucmVhZEJ1ZmZlcih0aGlzLmRpcmVjdG9yeS50b3RhbENvbXByZXNzZWRTaXplKTtcbiAgICAgIHZhciBkZWNvbXByZXNzZWRTaXplID0gMDtcblxuICAgICAgZm9yICh2YXIgdGFnIGluIHRoaXMuZGlyZWN0b3J5LnRhYmxlcykge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLmRpcmVjdG9yeS50YWJsZXNbdGFnXTtcbiAgICAgICAgZW50cnkub2Zmc2V0ID0gZGVjb21wcmVzc2VkU2l6ZTtcbiAgICAgICAgZGVjb21wcmVzc2VkU2l6ZSArPSBlbnRyeS50cmFuc2Zvcm1MZW5ndGggIT0gbnVsbCA/IGVudHJ5LnRyYW5zZm9ybUxlbmd0aCA6IGVudHJ5Lmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgdmFyIGRlY29tcHJlc3NlZCA9IGRlY29tcHJlc3MoYnVmZmVyLCBkZWNvbXByZXNzZWRTaXplKTtcblxuICAgICAgaWYgKCFkZWNvbXByZXNzZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBkZWNvZGluZyBjb21wcmVzc2VkIGRhdGEgaW4gV09GRjInKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdHJlYW0gPSBuZXcgcmVzdHJ1Y3R1cmUuRGVjb2RlU3RyZWFtKG5ldyBidWZmZXJfMShkZWNvbXByZXNzZWQpKTtcbiAgICAgIHRoaXMuX2RlY29tcHJlc3NlZCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5fZGVjb2RlVGFibGUgPSBmdW5jdGlvbiBfZGVjb2RlVGFibGUodGFibGUpIHtcbiAgICB0aGlzLl9kZWNvbXByZXNzKCk7XG5cbiAgICByZXR1cm4gX1RURkZvbnQucHJvdG90eXBlLl9kZWNvZGVUYWJsZS5jYWxsKHRoaXMsIHRhYmxlKTtcbiAgfSAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBnZXQgYSBnbHlwaCBhbmQgcmV0dXJuIG91clxuICAvLyBjdXN0b20gc3ViY2xhc3MgaWYgdGhlcmUgaXMgYSBnbHlmIHRhYmxlLlxuICA7XG5cbiAgX3Byb3RvLl9nZXRCYXNlR2x5cGggPSBmdW5jdGlvbiBfZ2V0QmFzZUdseXBoKGdseXBoLCBjaGFyYWN0ZXJzKSB7XG4gICAgaWYgKGNoYXJhY3RlcnMgPT09IHZvaWQgMCkge1xuICAgICAgY2hhcmFjdGVycyA9IFtdO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZ2x5cGhzW2dseXBoXSkge1xuICAgICAgaWYgKHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5nbHlmICYmIHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5nbHlmLnRyYW5zZm9ybWVkKSB7XG4gICAgICAgIGlmICghdGhpcy5fdHJhbnNmb3JtZWRHbHlwaHMpIHtcbiAgICAgICAgICB0aGlzLl90cmFuc2Zvcm1HbHlmVGFibGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9nbHlwaHNbZ2x5cGhdID0gbmV3IFdPRkYyR2x5cGgoZ2x5cGgsIGNoYXJhY3RlcnMsIHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF9UVEZGb250LnByb3RvdHlwZS5fZ2V0QmFzZUdseXBoLmNhbGwodGhpcywgZ2x5cGgsIGNoYXJhY3RlcnMpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uX3RyYW5zZm9ybUdseWZUYWJsZSA9IGZ1bmN0aW9uIF90cmFuc2Zvcm1HbHlmVGFibGUoKSB7XG4gICAgdGhpcy5fZGVjb21wcmVzcygpO1xuXG4gICAgdGhpcy5zdHJlYW0ucG9zID0gdGhpcy5kaXJlY3RvcnkudGFibGVzLmdseWYub2Zmc2V0O1xuICAgIHZhciB0YWJsZSA9IEdseWZUYWJsZS5kZWNvZGUodGhpcy5zdHJlYW0pO1xuICAgIHZhciBnbHlwaHMgPSBbXTtcblxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0YWJsZS5udW1HbHlwaHM7IGluZGV4KyspIHtcbiAgICAgIHZhciBnbHlwaCA9IHt9O1xuICAgICAgdmFyIG5Db250b3VycyA9IHRhYmxlLm5Db250b3Vycy5yZWFkSW50MTZCRSgpO1xuICAgICAgZ2x5cGgubnVtYmVyT2ZDb250b3VycyA9IG5Db250b3VycztcblxuICAgICAgaWYgKG5Db250b3VycyA+IDApIHtcbiAgICAgICAgLy8gc2ltcGxlIGdseXBoXG4gICAgICAgIHZhciBuUG9pbnRzID0gW107XG4gICAgICAgIHZhciB0b3RhbFBvaW50cyA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuQ29udG91cnM7IGkrKykge1xuICAgICAgICAgIHZhciBfciA9IHJlYWQyNTVVSW50MTYodGFibGUublBvaW50cyk7XG5cbiAgICAgICAgICB0b3RhbFBvaW50cyArPSBfcjtcbiAgICAgICAgICBuUG9pbnRzLnB1c2godG90YWxQb2ludHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2x5cGgucG9pbnRzID0gZGVjb2RlVHJpcGxldCh0YWJsZS5mbGFncywgdGFibGUuZ2x5cGhzLCB0b3RhbFBvaW50cyk7XG5cbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG5Db250b3VyczsgX2krKykge1xuICAgICAgICAgIGdseXBoLnBvaW50c1tuUG9pbnRzW19pXSAtIDFdLmVuZENvbnRvdXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGluc3RydWN0aW9uU2l6ZSA9IHJlYWQyNTVVSW50MTYodGFibGUuZ2x5cGhzKTtcbiAgICAgIH0gZWxzZSBpZiAobkNvbnRvdXJzIDwgMCkge1xuICAgICAgICAvLyBjb21wb3NpdGUgZ2x5cGhcbiAgICAgICAgdmFyIGhhdmVJbnN0cnVjdGlvbnMgPSBUVEZHbHlwaC5wcm90b3R5cGUuX2RlY29kZUNvbXBvc2l0ZS5jYWxsKHtcbiAgICAgICAgICBfZm9udDogdGhpc1xuICAgICAgICB9LCBnbHlwaCwgdGFibGUuY29tcG9zaXRlcyk7XG5cbiAgICAgICAgaWYgKGhhdmVJbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25TaXplID0gcmVhZDI1NVVJbnQxNih0YWJsZS5nbHlwaHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdseXBocy5wdXNoKGdseXBoKTtcbiAgICB9XG5cbiAgICB0aGlzLl90cmFuc2Zvcm1lZEdseXBocyA9IGdseXBocztcbiAgfTtcblxuICByZXR1cm4gV09GRjJGb250O1xufShUVEZGb250KTsgLy8gU3BlY2lhbCBjbGFzcyB0aGF0IGFjY2VwdHMgYSBsZW5ndGggYW5kIHJldHVybnMgYSBzdWItc3RyZWFtIGZvciB0aGF0IGRhdGFcblxudmFyIFN1YnN0cmVhbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFN1YnN0cmVhbShsZW5ndGgpIHtcbiAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICB0aGlzLl9idWYgPSBuZXcgcmVzdHJ1Y3R1cmUuQnVmZmVyKGxlbmd0aCk7XG4gIH1cblxuICB2YXIgX3Byb3RvMiA9IFN1YnN0cmVhbS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMi5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICByZXR1cm4gbmV3IHJlc3RydWN0dXJlLkRlY29kZVN0cmVhbSh0aGlzLl9idWYuZGVjb2RlKHN0cmVhbSwgcGFyZW50KSk7XG4gIH07XG5cbiAgcmV0dXJuIFN1YnN0cmVhbTtcbn0oKTsgLy8gVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyB0aGUgZW50aXJlIGdseWYgdGFibGVcblxuXG52YXIgR2x5ZlRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbnVtR2x5cGhzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGluZGV4Rm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG5Db250b3VyU3RyZWFtU2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBuUG9pbnRzU3RyZWFtU2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBmbGFnU3RyZWFtU2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBnbHlwaFN0cmVhbVNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgY29tcG9zaXRlU3RyZWFtU2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBiYm94U3RyZWFtU2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBpbnN0cnVjdGlvblN0cmVhbVNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbkNvbnRvdXJzOiBuZXcgU3Vic3RyZWFtKCduQ29udG91clN0cmVhbVNpemUnKSxcbiAgblBvaW50czogbmV3IFN1YnN0cmVhbSgnblBvaW50c1N0cmVhbVNpemUnKSxcbiAgZmxhZ3M6IG5ldyBTdWJzdHJlYW0oJ2ZsYWdTdHJlYW1TaXplJyksXG4gIGdseXBoczogbmV3IFN1YnN0cmVhbSgnZ2x5cGhTdHJlYW1TaXplJyksXG4gIGNvbXBvc2l0ZXM6IG5ldyBTdWJzdHJlYW0oJ2NvbXBvc2l0ZVN0cmVhbVNpemUnKSxcbiAgYmJveGVzOiBuZXcgU3Vic3RyZWFtKCdiYm94U3RyZWFtU2l6ZScpLFxuICBpbnN0cnVjdGlvbnM6IG5ldyBTdWJzdHJlYW0oJ2luc3RydWN0aW9uU3RyZWFtU2l6ZScpXG59KTtcbnZhciBXT1JEX0NPREUgPSAyNTM7XG52YXIgT05FX01PUkVfQllURV9DT0RFMiA9IDI1NDtcbnZhciBPTkVfTU9SRV9CWVRFX0NPREUxID0gMjU1O1xudmFyIExPV0VTVF9VX0NPREUgPSAyNTM7XG5cbmZ1bmN0aW9uIHJlYWQyNTVVSW50MTYoc3RyZWFtKSB7XG4gIHZhciBjb2RlID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuXG4gIGlmIChjb2RlID09PSBXT1JEX0NPREUpIHtcbiAgICByZXR1cm4gc3RyZWFtLnJlYWRVSW50MTZCRSgpO1xuICB9XG5cbiAgaWYgKGNvZGUgPT09IE9ORV9NT1JFX0JZVEVfQ09ERTEpIHtcbiAgICByZXR1cm4gc3RyZWFtLnJlYWRVSW50OCgpICsgTE9XRVNUX1VfQ09ERTtcbiAgfVxuXG4gIGlmIChjb2RlID09PSBPTkVfTU9SRV9CWVRFX0NPREUyKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5yZWFkVUludDgoKSArIExPV0VTVF9VX0NPREUgKiAyO1xuICB9XG5cbiAgcmV0dXJuIGNvZGU7XG59XG5cbmZ1bmN0aW9uIHdpdGhTaWduKGZsYWcsIGJhc2V2YWwpIHtcbiAgcmV0dXJuIGZsYWcgJiAxID8gYmFzZXZhbCA6IC1iYXNldmFsO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVUcmlwbGV0KGZsYWdzLCBnbHlwaHMsIG5Qb2ludHMpIHtcbiAgdmFyIHk7XG4gIHZhciB4ID0geSA9IDA7XG4gIHZhciByZXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5Qb2ludHM7IGkrKykge1xuICAgIHZhciBkeCA9IDAsXG4gICAgICAgIGR5ID0gMDtcbiAgICB2YXIgZmxhZyA9IGZsYWdzLnJlYWRVSW50OCgpO1xuICAgIHZhciBvbkN1cnZlID0gIShmbGFnID4+IDcpO1xuICAgIGZsYWcgJj0gMHg3ZjtcblxuICAgIGlmIChmbGFnIDwgMTApIHtcbiAgICAgIGR4ID0gMDtcbiAgICAgIGR5ID0gd2l0aFNpZ24oZmxhZywgKChmbGFnICYgMTQpIDw8IDcpICsgZ2x5cGhzLnJlYWRVSW50OCgpKTtcbiAgICB9IGVsc2UgaWYgKGZsYWcgPCAyMCkge1xuICAgICAgZHggPSB3aXRoU2lnbihmbGFnLCAoKGZsYWcgLSAxMCAmIDE0KSA8PCA3KSArIGdseXBocy5yZWFkVUludDgoKSk7XG4gICAgICBkeSA9IDA7XG4gICAgfSBlbHNlIGlmIChmbGFnIDwgODQpIHtcbiAgICAgIHZhciBiMCA9IGZsYWcgLSAyMDtcbiAgICAgIHZhciBiMSA9IGdseXBocy5yZWFkVUludDgoKTtcbiAgICAgIGR4ID0gd2l0aFNpZ24oZmxhZywgMSArIChiMCAmIDB4MzApICsgKGIxID4+IDQpKTtcbiAgICAgIGR5ID0gd2l0aFNpZ24oZmxhZyA+PiAxLCAxICsgKChiMCAmIDB4MGMpIDw8IDIpICsgKGIxICYgMHgwZikpO1xuICAgIH0gZWxzZSBpZiAoZmxhZyA8IDEyMCkge1xuICAgICAgdmFyIGIwID0gZmxhZyAtIDg0O1xuICAgICAgZHggPSB3aXRoU2lnbihmbGFnLCAxICsgKGIwIC8gMTIgPDwgOCkgKyBnbHlwaHMucmVhZFVJbnQ4KCkpO1xuICAgICAgZHkgPSB3aXRoU2lnbihmbGFnID4+IDEsIDEgKyAoYjAgJSAxMiA+PiAyIDw8IDgpICsgZ2x5cGhzLnJlYWRVSW50OCgpKTtcbiAgICB9IGVsc2UgaWYgKGZsYWcgPCAxMjQpIHtcbiAgICAgIHZhciBiMSA9IGdseXBocy5yZWFkVUludDgoKTtcbiAgICAgIHZhciBiMiA9IGdseXBocy5yZWFkVUludDgoKTtcbiAgICAgIGR4ID0gd2l0aFNpZ24oZmxhZywgKGIxIDw8IDQpICsgKGIyID4+IDQpKTtcbiAgICAgIGR5ID0gd2l0aFNpZ24oZmxhZyA+PiAxLCAoKGIyICYgMHgwZikgPDwgOCkgKyBnbHlwaHMucmVhZFVJbnQ4KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkeCA9IHdpdGhTaWduKGZsYWcsIGdseXBocy5yZWFkVUludDE2QkUoKSk7XG4gICAgICBkeSA9IHdpdGhTaWduKGZsYWcgPj4gMSwgZ2x5cGhzLnJlYWRVSW50MTZCRSgpKTtcbiAgICB9XG5cbiAgICB4ICs9IGR4O1xuICAgIHkgKz0gZHk7XG4gICAgcmVzLnB1c2gobmV3IFBvaW50KG9uQ3VydmUsIGZhbHNlLCB4LCB5KSk7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHMobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JHMobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JHMobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRzKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkcyhvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JHMoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDkodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MkOShDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDkoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ5KENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxudmFyIFRUQ0hlYWRlciA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDMyLCB7XG4gIDB4MDAwMTAwMDA6IHtcbiAgICBudW1Gb250czogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIG9mZnNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MzIsICdudW1Gb250cycpXG4gIH0sXG4gIDB4MDAwMjAwMDA6IHtcbiAgICBudW1Gb250czogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIG9mZnNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MzIsICdudW1Gb250cycpLFxuICAgIGRzaWdUYWc6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBkc2lnTGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZHNpZ09mZnNldDogcmVzdHJ1Y3R1cmUudWludDMyXG4gIH1cbn0pO1xuXG52YXIgVHJ1ZVR5cGVDb2xsZWN0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgVHJ1ZVR5cGVDb2xsZWN0aW9uLnByb2JlID0gZnVuY3Rpb24gcHJvYmUoYnVmZmVyKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygnYXNjaWknLCAwLCA0KSA9PT0gJ3R0Y2YnO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFRydWVUeXBlQ29sbGVjdGlvbihzdHJlYW0pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcblxuICAgIGlmIChzdHJlYW0ucmVhZFN0cmluZyg0KSAhPT0gJ3R0Y2YnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIFRydWVUeXBlIGNvbGxlY3Rpb24nKTtcbiAgICB9XG5cbiAgICB0aGlzLmhlYWRlciA9IFRUQ0hlYWRlci5kZWNvZGUoc3RyZWFtKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBUcnVlVHlwZUNvbGxlY3Rpb24ucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRGb250ID0gZnVuY3Rpb24gZ2V0Rm9udChuYW1lKSB7XG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRzKHRoaXMuaGVhZGVyLm9mZnNldHMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIG9mZnNldCA9IF9zdGVwLnZhbHVlO1xuICAgICAgdmFyIHN0cmVhbSA9IG5ldyByZXN0cnVjdHVyZS5EZWNvZGVTdHJlYW0odGhpcy5zdHJlYW0uYnVmZmVyKTtcbiAgICAgIHN0cmVhbS5wb3MgPSBvZmZzZXQ7XG4gICAgICB2YXIgZm9udCA9IG5ldyBUVEZGb250KHN0cmVhbSk7XG5cbiAgICAgIGlmIChmb250LnBvc3RzY3JpcHROYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBmb250O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyQ5KFRydWVUeXBlQ29sbGVjdGlvbiwgW3tcbiAgICBrZXk6IFwiZm9udHNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBmb250cyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRzKHRoaXMuaGVhZGVyLm9mZnNldHMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICB2YXIgc3RyZWFtID0gbmV3IHJlc3RydWN0dXJlLkRlY29kZVN0cmVhbSh0aGlzLnN0cmVhbS5idWZmZXIpO1xuICAgICAgICBzdHJlYW0ucG9zID0gb2Zmc2V0O1xuICAgICAgICBmb250cy5wdXNoKG5ldyBUVEZGb250KHN0cmVhbSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9udHM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRydWVUeXBlQ29sbGVjdGlvbjtcbn0oKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSR0KG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSR0KG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSR0KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkdChvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JHQobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSR0KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyRhKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJGEoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyRhKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkYShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbnZhciBERm9udE5hbWUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKHJlc3RydWN0dXJlLnVpbnQ4KTtcbnZhciBERm9udERhdGEgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbGVuOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGJ1ZjogbmV3IHJlc3RydWN0dXJlLkJ1ZmZlcignbGVuJylcbn0pO1xudmFyIFJlZiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBpZDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBuYW1lT2Zmc2V0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgYXR0cjogcmVzdHJ1Y3R1cmUudWludDgsXG4gIGRhdGFPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQyNCxcbiAgaGFuZGxlOiByZXN0cnVjdHVyZS51aW50MzJcbn0pO1xudmFyIFR5cGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbmFtZTogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgbWF4VHlwZUluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHJlZkxpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KFJlZiwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5tYXhUeXBlSW5kZXggKyAxO1xuICB9KSwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBUeXBlTGlzdCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdHlwZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShUeXBlLCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0Lmxlbmd0aCArIDE7XG4gIH0pXG59KTtcbnZhciBERm9udE1hcCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQ4LCAyNCksXG4gIHR5cGVMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFR5cGVMaXN0KSxcbiAgbmFtZUxpc3RPZmZzZXQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgJ3ZvaWQnKVxufSk7XG52YXIgREZvbnRIZWFkZXIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZGF0YU9mZnNldDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBtYXA6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgREZvbnRNYXApLFxuICBkYXRhTGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG1hcExlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyXG59KTtcblxudmFyIERGb250ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgREZvbnQucHJvYmUgPSBmdW5jdGlvbiBwcm9iZShidWZmZXIpIHtcbiAgICB2YXIgc3RyZWFtID0gbmV3IHJlc3RydWN0dXJlLkRlY29kZVN0cmVhbShidWZmZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBoZWFkZXIgPSBERm9udEhlYWRlci5kZWNvZGUoc3RyZWFtKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSR0KGhlYWRlci5tYXAudHlwZUxpc3QudHlwZXMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIHR5cGUgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKHR5cGUubmFtZSA9PT0gJ3NmbnQnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBmdW5jdGlvbiBERm9udChzdHJlYW0pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLmhlYWRlciA9IERGb250SGVhZGVyLmRlY29kZSh0aGlzLnN0cmVhbSk7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSR0KHRoaXMuaGVhZGVyLm1hcC50eXBlTGlzdC50eXBlcyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgdHlwZSA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkdCh0eXBlLnJlZkxpc3QpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgICB2YXIgcmVmID0gX3N0ZXAzLnZhbHVlO1xuXG4gICAgICAgIGlmIChyZWYubmFtZU9mZnNldCA+PSAwKSB7XG4gICAgICAgICAgdGhpcy5zdHJlYW0ucG9zID0gcmVmLm5hbWVPZmZzZXQgKyB0aGlzLmhlYWRlci5tYXAubmFtZUxpc3RPZmZzZXQ7XG4gICAgICAgICAgcmVmLm5hbWUgPSBERm9udE5hbWUuZGVjb2RlKHRoaXMuc3RyZWFtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWYubmFtZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUubmFtZSA9PT0gJ3NmbnQnKSB7XG4gICAgICAgIHRoaXMuc2ZudCA9IHR5cGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIF9wcm90byA9IERGb250LnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0Rm9udCA9IGZ1bmN0aW9uIGdldEZvbnQobmFtZSkge1xuICAgIGlmICghdGhpcy5zZm50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSR0KHRoaXMuc2ZudC5yZWZMaXN0KSwgX3N0ZXA0OyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQoKSkuZG9uZTspIHtcbiAgICAgIHZhciByZWYgPSBfc3RlcDQudmFsdWU7XG4gICAgICB2YXIgcG9zID0gdGhpcy5oZWFkZXIuZGF0YU9mZnNldCArIHJlZi5kYXRhT2Zmc2V0ICsgNDtcbiAgICAgIHZhciBzdHJlYW0gPSBuZXcgcmVzdHJ1Y3R1cmUuRGVjb2RlU3RyZWFtKHRoaXMuc3RyZWFtLmJ1ZmZlci5zbGljZShwb3MpKTtcbiAgICAgIHZhciBmb250ID0gbmV3IFRURkZvbnQoc3RyZWFtKTtcblxuICAgICAgaWYgKGZvbnQucG9zdHNjcmlwdE5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZvbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzJGEoREZvbnQsIFt7XG4gICAga2V5OiBcImZvbnRzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgZm9udHMgPSBbXTtcblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkdCh0aGlzLnNmbnQucmVmTGlzdCksIF9zdGVwNTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1KCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciByZWYgPSBfc3RlcDUudmFsdWU7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLmhlYWRlci5kYXRhT2Zmc2V0ICsgcmVmLmRhdGFPZmZzZXQgKyA0O1xuICAgICAgICB2YXIgc3RyZWFtID0gbmV3IHJlc3RydWN0dXJlLkRlY29kZVN0cmVhbSh0aGlzLnN0cmVhbS5idWZmZXIuc2xpY2UocG9zKSk7XG4gICAgICAgIGZvbnRzLnB1c2gobmV3IFRURkZvbnQoc3RyZWFtKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmb250cztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gREZvbnQ7XG59KCk7XG5cbmZvbnRraXQucmVnaXN0ZXJGb3JtYXQoVFRGRm9udCk7XG5mb250a2l0LnJlZ2lzdGVyRm9ybWF0KFdPRkZGb250KTtcbmZvbnRraXQucmVnaXN0ZXJGb3JtYXQoV09GRjJGb250KTtcbmZvbnRraXQucmVnaXN0ZXJGb3JtYXQoVHJ1ZVR5cGVDb2xsZWN0aW9uKTtcbmZvbnRraXQucmVnaXN0ZXJGb3JtYXQoREZvbnQpO1xuXG5leHBvcnQgZGVmYXVsdCBmb250a2l0O1xuIiwiLyogdHNsaW50OmRpc2FibGUgbWF4LWNsYXNzZXMtcGVyLWZpbGUgKi9cbmltcG9ydCB7IGRlY29tcHJlc3NKc29uLCBwYWRTdGFydCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEFsbEVuY29kaW5nc0NvbXByZXNzZWQgZnJvbSAnLi9hbGwtZW5jb2RpbmdzLmNvbXByZXNzZWQuanNvbic7XG52YXIgZGVjb21wcmVzc2VkRW5jb2RpbmdzID0gZGVjb21wcmVzc0pzb24oQWxsRW5jb2RpbmdzQ29tcHJlc3NlZCk7XG52YXIgYWxsVW5pY29kZU1hcHBpbmdzID0gSlNPTi5wYXJzZShkZWNvbXByZXNzZWRFbmNvZGluZ3MpO1xudmFyIEVuY29kaW5nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEVuY29kaW5nKG5hbWUsIHVuaWNvZGVNYXBwaW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmNhbkVuY29kZVVuaWNvZGVDb2RlUG9pbnQgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY29kZVBvaW50IGluIF90aGlzLnVuaWNvZGVNYXBwaW5ncztcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbmNvZGVVbmljb2RlQ29kZVBvaW50ID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgICAgICAgICAgdmFyIG1hcHBlZCA9IF90aGlzLnVuaWNvZGVNYXBwaW5nc1tjb2RlUG9pbnRdO1xuICAgICAgICAgICAgaWYgKCFtYXBwZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xuICAgICAgICAgICAgICAgIHZhciBoZXhDb2RlID0gXCIweFwiICsgcGFkU3RhcnQoY29kZVBvaW50LnRvU3RyaW5nKDE2KSwgNCwgJzAnKTtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0gX3RoaXMubmFtZSArIFwiIGNhbm5vdCBlbmNvZGUgXFxcIlwiICsgc3RyICsgXCJcXFwiIChcIiArIGhleENvZGUgKyBcIilcIjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGNvZGU6IG1hcHBlZFswXSwgbmFtZTogbWFwcGVkWzFdIH07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc3VwcG9ydGVkQ29kZVBvaW50cyA9IE9iamVjdC5rZXlzKHVuaWNvZGVNYXBwaW5ncylcbiAgICAgICAgICAgIC5tYXAoTnVtYmVyKVxuICAgICAgICAgICAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgLSBiOyB9KTtcbiAgICAgICAgdGhpcy51bmljb2RlTWFwcGluZ3MgPSB1bmljb2RlTWFwcGluZ3M7XG4gICAgfVxuICAgIHJldHVybiBFbmNvZGluZztcbn0oKSk7XG5leHBvcnQgdmFyIEVuY29kaW5ncyA9IHtcbiAgICBTeW1ib2w6IG5ldyBFbmNvZGluZygnU3ltYm9sJywgYWxsVW5pY29kZU1hcHBpbmdzLnN5bWJvbCksXG4gICAgWmFwZkRpbmdiYXRzOiBuZXcgRW5jb2RpbmcoJ1phcGZEaW5nYmF0cycsIGFsbFVuaWNvZGVNYXBwaW5ncy56YXBmZGluZ2JhdHMpLFxuICAgIFdpbkFuc2k6IG5ldyBFbmNvZGluZygnV2luQW5zaScsIGFsbFVuaWNvZGVNYXBwaW5ncy53aW4xMjUyKSxcbn07XG4iLCJpbXBvcnQgeyBkZWNvbXByZXNzSnNvbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IENvdXJpZXJCb2xkQ29tcHJlc3NlZCBmcm9tICcuL0NvdXJpZXItQm9sZC5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IENvdXJpZXJCb2xkT2JsaXF1ZUNvbXByZXNzZWQgZnJvbSAnLi9Db3VyaWVyLUJvbGRPYmxpcXVlLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgQ291cmllck9ibGlxdWVDb21wcmVzc2VkIGZyb20gJy4vQ291cmllci1PYmxpcXVlLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgQ291cmllckNvbXByZXNzZWQgZnJvbSAnLi9Db3VyaWVyLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgSGVsdmV0aWNhQm9sZENvbXByZXNzZWQgZnJvbSAnLi9IZWx2ZXRpY2EtQm9sZC5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IEhlbHZldGljYUJvbGRPYmxpcXVlQ29tcHJlc3NlZCBmcm9tICcuL0hlbHZldGljYS1Cb2xkT2JsaXF1ZS5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IEhlbHZldGljYU9ibGlxdWVDb21wcmVzc2VkIGZyb20gJy4vSGVsdmV0aWNhLU9ibGlxdWUuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBIZWx2ZXRpY2FDb21wcmVzc2VkIGZyb20gJy4vSGVsdmV0aWNhLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgVGltZXNCb2xkQ29tcHJlc3NlZCBmcm9tICcuL1RpbWVzLUJvbGQuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBUaW1lc0JvbGRJdGFsaWNDb21wcmVzc2VkIGZyb20gJy4vVGltZXMtQm9sZEl0YWxpYy5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IFRpbWVzSXRhbGljQ29tcHJlc3NlZCBmcm9tICcuL1RpbWVzLUl0YWxpYy5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IFRpbWVzUm9tYW5Db21wcmVzc2VkIGZyb20gJy4vVGltZXMtUm9tYW4uY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBTeW1ib2xDb21wcmVzc2VkIGZyb20gJy4vU3ltYm9sLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgWmFwZkRpbmdiYXRzQ29tcHJlc3NlZCBmcm9tICcuL1phcGZEaW5nYmF0cy5jb21wcmVzc2VkLmpzb24nO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgY29tcHJlc3NlZEpzb25Gb3JGb250TmFtZSA9IHtcbiAgICAnQ291cmllcic6IENvdXJpZXJDb21wcmVzc2VkLFxuICAgICdDb3VyaWVyLUJvbGQnOiBDb3VyaWVyQm9sZENvbXByZXNzZWQsXG4gICAgJ0NvdXJpZXItT2JsaXF1ZSc6IENvdXJpZXJPYmxpcXVlQ29tcHJlc3NlZCxcbiAgICAnQ291cmllci1Cb2xkT2JsaXF1ZSc6IENvdXJpZXJCb2xkT2JsaXF1ZUNvbXByZXNzZWQsXG4gICAgJ0hlbHZldGljYSc6IEhlbHZldGljYUNvbXByZXNzZWQsXG4gICAgJ0hlbHZldGljYS1Cb2xkJzogSGVsdmV0aWNhQm9sZENvbXByZXNzZWQsXG4gICAgJ0hlbHZldGljYS1PYmxpcXVlJzogSGVsdmV0aWNhT2JsaXF1ZUNvbXByZXNzZWQsXG4gICAgJ0hlbHZldGljYS1Cb2xkT2JsaXF1ZSc6IEhlbHZldGljYUJvbGRPYmxpcXVlQ29tcHJlc3NlZCxcbiAgICAnVGltZXMtUm9tYW4nOiBUaW1lc1JvbWFuQ29tcHJlc3NlZCxcbiAgICAnVGltZXMtQm9sZCc6IFRpbWVzQm9sZENvbXByZXNzZWQsXG4gICAgJ1RpbWVzLUl0YWxpYyc6IFRpbWVzSXRhbGljQ29tcHJlc3NlZCxcbiAgICAnVGltZXMtQm9sZEl0YWxpYyc6IFRpbWVzQm9sZEl0YWxpY0NvbXByZXNzZWQsXG4gICAgJ1N5bWJvbCc6IFN5bWJvbENvbXByZXNzZWQsXG4gICAgJ1phcGZEaW5nYmF0cyc6IFphcGZEaW5nYmF0c0NvbXByZXNzZWQsXG59O1xuZXhwb3J0IHZhciBGb250TmFtZXM7XG4oZnVuY3Rpb24gKEZvbnROYW1lcykge1xuICAgIEZvbnROYW1lc1tcIkNvdXJpZXJcIl0gPSBcIkNvdXJpZXJcIjtcbiAgICBGb250TmFtZXNbXCJDb3VyaWVyQm9sZFwiXSA9IFwiQ291cmllci1Cb2xkXCI7XG4gICAgRm9udE5hbWVzW1wiQ291cmllck9ibGlxdWVcIl0gPSBcIkNvdXJpZXItT2JsaXF1ZVwiO1xuICAgIEZvbnROYW1lc1tcIkNvdXJpZXJCb2xkT2JsaXF1ZVwiXSA9IFwiQ291cmllci1Cb2xkT2JsaXF1ZVwiO1xuICAgIEZvbnROYW1lc1tcIkhlbHZldGljYVwiXSA9IFwiSGVsdmV0aWNhXCI7XG4gICAgRm9udE5hbWVzW1wiSGVsdmV0aWNhQm9sZFwiXSA9IFwiSGVsdmV0aWNhLUJvbGRcIjtcbiAgICBGb250TmFtZXNbXCJIZWx2ZXRpY2FPYmxpcXVlXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICAgIEZvbnROYW1lc1tcIkhlbHZldGljYUJvbGRPYmxpcXVlXCJdID0gXCJIZWx2ZXRpY2EtQm9sZE9ibGlxdWVcIjtcbiAgICBGb250TmFtZXNbXCJUaW1lc1JvbWFuXCJdID0gXCJUaW1lcy1Sb21hblwiO1xuICAgIEZvbnROYW1lc1tcIlRpbWVzUm9tYW5Cb2xkXCJdID0gXCJUaW1lcy1Cb2xkXCI7XG4gICAgRm9udE5hbWVzW1wiVGltZXNSb21hbkl0YWxpY1wiXSA9IFwiVGltZXMtSXRhbGljXCI7XG4gICAgRm9udE5hbWVzW1wiVGltZXNSb21hbkJvbGRJdGFsaWNcIl0gPSBcIlRpbWVzLUJvbGRJdGFsaWNcIjtcbiAgICBGb250TmFtZXNbXCJTeW1ib2xcIl0gPSBcIlN5bWJvbFwiO1xuICAgIEZvbnROYW1lc1tcIlphcGZEaW5nYmF0c1wiXSA9IFwiWmFwZkRpbmdiYXRzXCI7XG59KShGb250TmFtZXMgfHwgKEZvbnROYW1lcyA9IHt9KSk7XG52YXIgZm9udENhY2hlID0ge307XG52YXIgRm9udCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGb250KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmdldFdpZHRoT2ZHbHlwaCA9IGZ1bmN0aW9uIChnbHlwaE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5DaGFyV2lkdGhzW2dseXBoTmFtZV07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0WEF4aXNLZXJuaW5nRm9yUGFpciA9IGZ1bmN0aW9uIChsZWZ0R2x5cGhOYW1lLCByaWdodEdseXBoTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIChfdGhpcy5LZXJuUGFpclhBbW91bnRzW2xlZnRHbHlwaE5hbWVdIHx8IHt9KVtyaWdodEdseXBoTmFtZV07XG4gICAgICAgIH07XG4gICAgfVxuICAgIEZvbnQubG9hZCA9IGZ1bmN0aW9uIChmb250TmFtZSkge1xuICAgICAgICB2YXIgY2FjaGVkRm9udCA9IGZvbnRDYWNoZVtmb250TmFtZV07XG4gICAgICAgIGlmIChjYWNoZWRGb250KVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEZvbnQ7XG4gICAgICAgIHZhciBqc29uID0gZGVjb21wcmVzc0pzb24oY29tcHJlc3NlZEpzb25Gb3JGb250TmFtZVtmb250TmFtZV0pO1xuICAgICAgICB2YXIgZm9udCA9IE9iamVjdC5hc3NpZ24obmV3IEZvbnQoKSwgSlNPTi5wYXJzZShqc29uKSk7XG4gICAgICAgIGZvbnQuQ2hhcldpZHRocyA9IGZvbnQuQ2hhck1ldHJpY3MucmVkdWNlKGZ1bmN0aW9uIChhY2MsIG1ldHJpYykge1xuICAgICAgICAgICAgYWNjW21ldHJpYy5OXSA9IG1ldHJpYy5XWDtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgZm9udC5LZXJuUGFpclhBbW91bnRzID0gZm9udC5LZXJuUGFpcnMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIF9hKSB7XG4gICAgICAgICAgICB2YXIgbmFtZTEgPSBfYVswXSwgbmFtZTIgPSBfYVsxXSwgd2lkdGggPSBfYVsyXTtcbiAgICAgICAgICAgIGlmICghYWNjW25hbWUxXSlcbiAgICAgICAgICAgICAgICBhY2NbbmFtZTFdID0ge307XG4gICAgICAgICAgICBhY2NbbmFtZTFdW25hbWUyXSA9IHdpZHRoO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuICAgICAgICBmb250Q2FjaGVbZm9udE5hbWVdID0gZm9udDtcbiAgICAgICAgcmV0dXJuIGZvbnQ7XG4gICAgfTtcbiAgICByZXR1cm4gRm9udDtcbn0oKSk7XG5leHBvcnQgeyBGb250IH07XG4iLCJleHBvcnQgKiBmcm9tICcuL0ZvbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9FbmNvZGluZyc7XG4iLCIvKlxuICogVGhlIGBjaGFyc2AsIGBsb29rdXBgLCBhbmQgYGRlY29kZUZyb21CYXNlNjRgIG1lbWJlcnMgb2YgdGhpcyBmaWxlIGFyZVxuICogbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgICAgYmFzZTY0LWFycmF5YnVmZmVyXG4gKiAgICAgaHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlclxuICpcbiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTIgTmlrbGFzIHZvbiBIZXJ0emVuXG4gKiAgICAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqL1xuaW1wb3J0IHBha28gZnJvbSAncGFrbyc7XG52YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG4vLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguXG52YXIgbG9va3VwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpO1xufVxuZXhwb3J0IHZhciBkZWNvZGVGcm9tQmFzZTY0ID0gZnVuY3Rpb24gKGJhc2U2NCkge1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBiYXNlNjQubGVuZ3RoICogMC43NTtcbiAgICB2YXIgbGVuID0gYmFzZTY0Lmxlbmd0aDtcbiAgICB2YXIgaTtcbiAgICB2YXIgcCA9IDA7XG4gICAgdmFyIGVuY29kZWQxO1xuICAgIHZhciBlbmNvZGVkMjtcbiAgICB2YXIgZW5jb2RlZDM7XG4gICAgdmFyIGVuY29kZWQ0O1xuICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDFdID09PSAnPScpIHtcbiAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlckxlbmd0aCk7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgICAgIGVuY29kZWQxID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkpXTtcbiAgICAgICAgZW5jb2RlZDIgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDEpXTtcbiAgICAgICAgZW5jb2RlZDMgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDIpXTtcbiAgICAgICAgZW5jb2RlZDQgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSArIDMpXTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9IChlbmNvZGVkMSA8PCAyKSB8IChlbmNvZGVkMiA+PiA0KTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9ICgoZW5jb2RlZDIgJiAxNSkgPDwgNCkgfCAoZW5jb2RlZDMgPj4gMik7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQzICYgMykgPDwgNikgfCAoZW5jb2RlZDQgJiA2Myk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn07XG52YXIgYXJyYXlUb1N0cmluZyA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn07XG5leHBvcnQgdmFyIGRlY29tcHJlc3NKc29uID0gZnVuY3Rpb24gKGNvbXByZXNzZWRKc29uKSB7XG4gICAgcmV0dXJuIGFycmF5VG9TdHJpbmcocGFrby5pbmZsYXRlKGRlY29kZUZyb21CYXNlNjQoY29tcHJlc3NlZEpzb24pKSk7XG59O1xuZXhwb3J0IHZhciBwYWRTdGFydCA9IGZ1bmN0aW9uICh2YWx1ZSwgbGVuZ3RoLCBwYWRDaGFyKSB7XG4gICAgdmFyIHBhZGRpbmcgPSAnJztcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsZW5ndGggLSB2YWx1ZS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgcGFkZGluZyArPSBwYWRDaGFyO1xuICAgIH1cbiAgICByZXR1cm4gcGFkZGluZyArIHZhbHVlO1xufTtcbiIsImltcG9ydCBwYWtvIGZyb20gJ3Bha28nO1xuXG52YXIgVVBORyA9IHt9O1xuXG5cdFxuXG5VUE5HLnRvUkdCQTggPSBmdW5jdGlvbihvdXQpXG57XG5cdHZhciB3ID0gb3V0LndpZHRoLCBoID0gb3V0LmhlaWdodDtcblx0aWYob3V0LnRhYnMuYWNUTD09bnVsbCkgcmV0dXJuIFtVUE5HLnRvUkdCQTguZGVjb2RlSW1hZ2Uob3V0LmRhdGEsIHcsIGgsIG91dCkuYnVmZmVyXTtcblx0XG5cdHZhciBmcm1zID0gW107XG5cdGlmKG91dC5mcmFtZXNbMF0uZGF0YT09bnVsbCkgb3V0LmZyYW1lc1swXS5kYXRhID0gb3V0LmRhdGE7XG5cdFxuXHR2YXIgbGVuID0gdypoKjQsIGltZyA9IG5ldyBVaW50OEFycmF5KGxlbiksIGVtcHR5ID0gbmV3IFVpbnQ4QXJyYXkobGVuKSwgcHJldj1uZXcgVWludDhBcnJheShsZW4pO1xuXHRmb3IodmFyIGk9MDsgaTxvdXQuZnJhbWVzLmxlbmd0aDsgaSsrKVxuXHR7XG5cdFx0dmFyIGZybSA9IG91dC5mcmFtZXNbaV07XG5cdFx0dmFyIGZ4PWZybS5yZWN0LngsIGZ5PWZybS5yZWN0LnksIGZ3ID0gZnJtLnJlY3Qud2lkdGgsIGZoID0gZnJtLnJlY3QuaGVpZ2h0O1xuXHRcdHZhciBmZGF0YSA9IFVQTkcudG9SR0JBOC5kZWNvZGVJbWFnZShmcm0uZGF0YSwgZncsZmgsIG91dCk7XG5cdFx0XG5cdFx0aWYoaSE9MCkgZm9yKHZhciBqPTA7IGo8bGVuOyBqKyspIHByZXZbal09aW1nW2pdO1xuXHRcdFxuXHRcdGlmICAgICAoZnJtLmJsZW5kPT0wKSBVUE5HLl9jb3B5VGlsZShmZGF0YSwgZncsIGZoLCBpbWcsIHcsIGgsIGZ4LCBmeSwgMCk7XG5cdFx0ZWxzZSBpZihmcm0uYmxlbmQ9PTEpIFVQTkcuX2NvcHlUaWxlKGZkYXRhLCBmdywgZmgsIGltZywgdywgaCwgZngsIGZ5LCAxKTtcblx0XHRcblx0XHRmcm1zLnB1c2goaW1nLmJ1ZmZlci5zbGljZSgwKSk7XG5cdFx0XG5cdFx0aWYgICAgIChmcm0uZGlzcG9zZT09MCkge31cblx0XHRlbHNlIGlmKGZybS5kaXNwb3NlPT0xKSBVUE5HLl9jb3B5VGlsZShlbXB0eSwgZncsIGZoLCBpbWcsIHcsIGgsIGZ4LCBmeSwgMCk7XG5cdFx0ZWxzZSBpZihmcm0uZGlzcG9zZT09MikgZm9yKHZhciBqPTA7IGo8bGVuOyBqKyspIGltZ1tqXT1wcmV2W2pdO1xuXHR9XG5cdHJldHVybiBmcm1zO1xufVxuVVBORy50b1JHQkE4LmRlY29kZUltYWdlID0gZnVuY3Rpb24oZGF0YSwgdywgaCwgb3V0KVxue1xuXHR2YXIgYXJlYSA9IHcqaCwgYnBwID0gVVBORy5kZWNvZGUuX2dldEJQUChvdXQpO1xuXHR2YXIgYnBsID0gTWF0aC5jZWlsKHcqYnBwLzgpO1x0Ly8gYnl0ZXMgcGVyIGxpbmVcblxuXHR2YXIgYmYgPSBuZXcgVWludDhBcnJheShhcmVhKjQpLCBiZjMyID0gbmV3IFVpbnQzMkFycmF5KGJmLmJ1ZmZlcik7XG5cdHZhciBjdHlwZSA9IG91dC5jdHlwZSwgZGVwdGggPSBvdXQuZGVwdGg7XG5cdHZhciBycyA9IFVQTkcuX2Jpbi5yZWFkVXNob3J0O1xuXHRcblx0Ly9jb25zb2xlLmxvZyhjdHlwZSwgZGVwdGgpO1xuXHR2YXIgdGltZSA9IERhdGUubm93KCk7XG5cblx0aWYgICAgIChjdHlwZT09NikgeyAvLyBSR0IgKyBhbHBoYVxuXHRcdHZhciBxYXJlYSA9IGFyZWE8PDI7XG5cdFx0aWYoZGVwdGg9PSA4KSBmb3IodmFyIGk9MDsgaTxxYXJlYTtpKz00KSB7ICBiZltpXSA9IGRhdGFbaV07ICBiZltpKzFdID0gZGF0YVtpKzFdOyAgYmZbaSsyXSA9IGRhdGFbaSsyXTsgIGJmW2krM10gPSBkYXRhW2krM107IH1cblx0XHRpZihkZXB0aD09MTYpIGZvcih2YXIgaT0wOyBpPHFhcmVhO2krKyApIHsgIGJmW2ldID0gZGF0YVtpPDwxXTsgIH1cblx0fVxuXHRlbHNlIGlmKGN0eXBlPT0yKSB7XHQvLyBSR0Jcblx0XHR2YXIgdHM9b3V0LnRhYnNbXCJ0Uk5TXCJdO1xuXHRcdGlmKHRzPT1udWxsKSB7XG5cdFx0XHRpZihkZXB0aD09IDgpIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHRpPWkqMzsgIGJmMzJbaV0gPSAoMjU1PDwyNCl8KGRhdGFbdGkrMl08PDE2KXwoZGF0YVt0aSsxXTw8OCl8ZGF0YVt0aV07ICB9XG5cdFx0XHRpZihkZXB0aD09MTYpIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHRpPWkqNjsgIGJmMzJbaV0gPSAoMjU1PDwyNCl8KGRhdGFbdGkrNF08PDE2KXwoZGF0YVt0aSsyXTw8OCl8ZGF0YVt0aV07ICB9XG5cdFx0fVxuXHRcdGVsc2UgeyAgdmFyIHRyPXRzWzBdLCB0Zz10c1sxXSwgdGI9dHNbMl07XG5cdFx0XHRpZihkZXB0aD09IDgpIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHFpPWk8PDIsIHRpPWkqMzsgIGJmMzJbaV0gPSAoMjU1PDwyNCl8KGRhdGFbdGkrMl08PDE2KXwoZGF0YVt0aSsxXTw8OCl8ZGF0YVt0aV07XG5cdFx0XHRcdGlmKGRhdGFbdGldICAgPT10ciAmJiBkYXRhW3RpKzFdICAgPT10ZyAmJiBkYXRhW3RpKzJdICAgPT10YikgYmZbcWkrM10gPSAwOyAgfVxuXHRcdFx0aWYoZGVwdGg9PTE2KSBmb3IodmFyIGk9MDsgaTxhcmVhOyBpKyspIHsgIHZhciBxaT1pPDwyLCB0aT1pKjY7ICBiZjMyW2ldID0gKDI1NTw8MjQpfChkYXRhW3RpKzRdPDwxNil8KGRhdGFbdGkrMl08PDgpfGRhdGFbdGldO1xuXHRcdFx0XHRpZihycyhkYXRhLHRpKT09dHIgJiYgcnMoZGF0YSx0aSsyKT09dGcgJiYgcnMoZGF0YSx0aSs0KT09dGIpIGJmW3FpKzNdID0gMDsgIH1cblx0XHR9XG5cdH1cblx0ZWxzZSBpZihjdHlwZT09Mykge1x0Ly8gcGFsZXR0ZVxuXHRcdHZhciBwPW91dC50YWJzW1wiUExURVwiXSwgYXA9b3V0LnRhYnNbXCJ0Uk5TXCJdLCB0bD1hcD9hcC5sZW5ndGg6MDtcblx0XHQvL2NvbnNvbGUubG9nKHAsIGFwKTtcblx0XHRpZihkZXB0aD09MSkgZm9yKHZhciB5PTA7IHk8aDsgeSsrKSB7ICB2YXIgczAgPSB5KmJwbCwgdDAgPSB5Knc7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTx3OyBpKyspIHsgdmFyIHFpPSh0MCtpKTw8Miwgaj0oKGRhdGFbczArKGk+PjMpXT4+KDctKChpJjcpPDwwKSkpJiAxKSwgY2o9MypqOyAgYmZbcWldPXBbY2pdOyAgYmZbcWkrMV09cFtjaisxXTsgIGJmW3FpKzJdPXBbY2orMl07ICBiZltxaSszXT0oajx0bCk/YXBbal06MjU1OyAgfVxuXHRcdH1cblx0XHRpZihkZXB0aD09MikgZm9yKHZhciB5PTA7IHk8aDsgeSsrKSB7ICB2YXIgczAgPSB5KmJwbCwgdDAgPSB5Knc7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTx3OyBpKyspIHsgdmFyIHFpPSh0MCtpKTw8Miwgaj0oKGRhdGFbczArKGk+PjIpXT4+KDYtKChpJjMpPDwxKSkpJiAzKSwgY2o9MypqOyAgYmZbcWldPXBbY2pdOyAgYmZbcWkrMV09cFtjaisxXTsgIGJmW3FpKzJdPXBbY2orMl07ICBiZltxaSszXT0oajx0bCk/YXBbal06MjU1OyAgfVxuXHRcdH1cblx0XHRpZihkZXB0aD09NCkgZm9yKHZhciB5PTA7IHk8aDsgeSsrKSB7ICB2YXIgczAgPSB5KmJwbCwgdDAgPSB5Knc7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTx3OyBpKyspIHsgdmFyIHFpPSh0MCtpKTw8Miwgaj0oKGRhdGFbczArKGk+PjEpXT4+KDQtKChpJjEpPDwyKSkpJjE1KSwgY2o9MypqOyAgYmZbcWldPXBbY2pdOyAgYmZbcWkrMV09cFtjaisxXTsgIGJmW3FpKzJdPXBbY2orMl07ICBiZltxaSszXT0oajx0bCk/YXBbal06MjU1OyAgfVxuXHRcdH1cblx0XHRpZihkZXB0aD09OCkgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrICkgeyAgdmFyIHFpPWk8PDIsIGo9ZGF0YVtpXSAgICAgICAgICAgICAgICAgICAgICAsIGNqPTMqajsgIGJmW3FpXT1wW2NqXTsgIGJmW3FpKzFdPXBbY2orMV07ICBiZltxaSsyXT1wW2NqKzJdOyAgYmZbcWkrM109KGo8dGwpP2FwW2pdOjI1NTsgIH1cblx0fVxuXHRlbHNlIGlmKGN0eXBlPT00KSB7XHQvLyBncmF5ICsgYWxwaGFcblx0XHRpZihkZXB0aD09IDgpICBmb3IodmFyIGk9MDsgaTxhcmVhOyBpKyspIHsgIHZhciBxaT1pPDwyLCBkaT1pPDwxLCBncj1kYXRhW2RpXTsgIGJmW3FpXT1ncjsgIGJmW3FpKzFdPWdyOyAgYmZbcWkrMl09Z3I7ICBiZltxaSszXT1kYXRhW2RpKzFdOyAgfVxuXHRcdGlmKGRlcHRoPT0xNikgIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHFpPWk8PDIsIGRpPWk8PDIsIGdyPWRhdGFbZGldOyAgYmZbcWldPWdyOyAgYmZbcWkrMV09Z3I7ICBiZltxaSsyXT1ncjsgIGJmW3FpKzNdPWRhdGFbZGkrMl07ICB9XG5cdH1cblx0ZWxzZSBpZihjdHlwZT09MCkge1x0Ly8gZ3JheVxuXHRcdHZhciB0ciA9IG91dC50YWJzW1widFJOU1wiXSA/IG91dC50YWJzW1widFJOU1wiXSA6IC0xO1xuXHRcdGZvcih2YXIgeT0wOyB5PGg7IHkrKykge1xuXHRcdFx0dmFyIG9mZiA9IHkqYnBsLCB0byA9IHkqdztcblx0XHRcdGlmICAgICAoZGVwdGg9PSAxKSBmb3IodmFyIHg9MDsgeDx3OyB4KyspIHsgIHZhciBncj0yNTUqKChkYXRhW29mZisoeD4+PjMpXT4+Pig3IC0oKHgmNykgICApKSkmIDEpLCBhbD0oZ3I9PXRyKjI1NSk/MDoyNTU7ICBiZjMyW3RvK3hdPShhbDw8MjQpfChncjw8MTYpfChncjw8OCl8Z3I7ICB9XG5cdFx0XHRlbHNlIGlmKGRlcHRoPT0gMikgZm9yKHZhciB4PTA7IHg8dzsgeCsrKSB7ICB2YXIgZ3I9IDg1KigoZGF0YVtvZmYrKHg+Pj4yKV0+Pj4oNiAtKCh4JjMpPDwxKSkpJiAzKSwgYWw9KGdyPT10ciogODUpPzA6MjU1OyAgYmYzMlt0byt4XT0oYWw8PDI0KXwoZ3I8PDE2KXwoZ3I8PDgpfGdyOyAgfVxuXHRcdFx0ZWxzZSBpZihkZXB0aD09IDQpIGZvcih2YXIgeD0wOyB4PHc7IHgrKykgeyAgdmFyIGdyPSAxNyooKGRhdGFbb2ZmKyh4Pj4+MSldPj4+KDQgLSgoeCYxKTw8MikpKSYxNSksIGFsPShncj09dHIqIDE3KT8wOjI1NTsgIGJmMzJbdG8reF09KGFsPDwyNCl8KGdyPDwxNil8KGdyPDw4KXxncjsgIH1cblx0XHRcdGVsc2UgaWYoZGVwdGg9PSA4KSBmb3IodmFyIHg9MDsgeDx3OyB4KyspIHsgIHZhciBncj1kYXRhW29mZisgICAgIHhdLCBhbD0oZ3IgICAgICAgICAgICAgICAgID09dHIpPzA6MjU1OyAgYmYzMlt0byt4XT0oYWw8PDI0KXwoZ3I8PDE2KXwoZ3I8PDgpfGdyOyAgfVxuXHRcdFx0ZWxzZSBpZihkZXB0aD09MTYpIGZvcih2YXIgeD0wOyB4PHc7IHgrKykgeyAgdmFyIGdyPWRhdGFbb2ZmKyh4PDwxKV0sIGFsPShycyhkYXRhLG9mZisoeDw8aSkpPT10cik/MDoyNTU7ICBiZjMyW3RvK3hdPShhbDw8MjQpfChncjw8MTYpfChncjw8OCl8Z3I7ICB9XG5cdFx0fVxuXHR9XG5cdC8vY29uc29sZS5sb2coRGF0ZS5ub3coKS10aW1lKTtcblx0cmV0dXJuIGJmO1xufVxuXG5cblxuVVBORy5kZWNvZGUgPSBmdW5jdGlvbihidWZmKVxue1xuXHR2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGJ1ZmYpLCBvZmZzZXQgPSA4LCBiaW4gPSBVUE5HLl9iaW4sIHJVcyA9IGJpbi5yZWFkVXNob3J0LCByVWkgPSBiaW4ucmVhZFVpbnQ7XG5cdHZhciBvdXQgPSB7dGFiczp7fSwgZnJhbWVzOltdfTtcblx0dmFyIGRkID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpLCBkb2ZmID0gMDtcdCAvLyBwdXQgYWxsIElEQVQgZGF0YSBpbnRvIGl0XG5cdHZhciBmZCwgZm9mZiA9IDA7XHQvLyBmcmFtZXNcblx0XG5cdHZhciBtZ2NrID0gWzB4ODksIDB4NTAsIDB4NGUsIDB4NDcsIDB4MGQsIDB4MGEsIDB4MWEsIDB4MGFdO1xuXHRmb3IodmFyIGk9MDsgaTw4OyBpKyspIGlmKGRhdGFbaV0hPW1nY2tbaV0pIHRocm93IFwiVGhlIGlucHV0IGlzIG5vdCBhIFBORyBmaWxlIVwiO1xuXG5cdHdoaWxlKG9mZnNldDxkYXRhLmxlbmd0aClcblx0e1xuXHRcdHZhciBsZW4gID0gYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCk7ICBvZmZzZXQgKz0gNDtcblx0XHR2YXIgdHlwZSA9IGJpbi5yZWFkQVNDSUkoZGF0YSwgb2Zmc2V0LCA0KTsgIG9mZnNldCArPSA0O1xuXHRcdC8vY29uc29sZS5sb2codHlwZSxsZW4pO1xuXHRcdFxuXHRcdGlmICAgICAodHlwZT09XCJJSERSXCIpICB7ICBVUE5HLmRlY29kZS5fSUhEUihkYXRhLCBvZmZzZXQsIG91dCk7ICB9XG5cdFx0ZWxzZSBpZih0eXBlPT1cIklEQVRcIikge1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8bGVuOyBpKyspIGRkW2RvZmYraV0gPSBkYXRhW29mZnNldCtpXTtcblx0XHRcdGRvZmYgKz0gbGVuO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiYWNUTFwiKSAge1xuXHRcdFx0b3V0LnRhYnNbdHlwZV0gPSB7ICBudW1fZnJhbWVzOnJVaShkYXRhLCBvZmZzZXQpLCBudW1fcGxheXM6clVpKGRhdGEsIG9mZnNldCs0KSAgfTtcblx0XHRcdGZkID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiZmNUTFwiKSAge1xuXHRcdFx0aWYoZm9mZiE9MCkgeyAgdmFyIGZyID0gb3V0LmZyYW1lc1tvdXQuZnJhbWVzLmxlbmd0aC0xXTtcblx0XHRcdFx0ZnIuZGF0YSA9IFVQTkcuZGVjb2RlLl9kZWNvbXByZXNzKG91dCwgZmQuc2xpY2UoMCxmb2ZmKSwgZnIucmVjdC53aWR0aCwgZnIucmVjdC5oZWlnaHQpOyAgZm9mZj0wO1xuXHRcdFx0fVxuXHRcdFx0dmFyIHJjdCA9IHt4OnJVaShkYXRhLCBvZmZzZXQrMTIpLHk6clVpKGRhdGEsIG9mZnNldCsxNiksd2lkdGg6clVpKGRhdGEsIG9mZnNldCs0KSxoZWlnaHQ6clVpKGRhdGEsIG9mZnNldCs4KX07XG5cdFx0XHR2YXIgZGVsID0gclVzKGRhdGEsIG9mZnNldCsyMik7ICBkZWwgPSByVXMoZGF0YSwgb2Zmc2V0KzIwKSAvIChkZWw9PTA/MTAwOmRlbCk7XG5cdFx0XHR2YXIgZnJtID0ge3JlY3Q6cmN0LCBkZWxheTpNYXRoLnJvdW5kKGRlbCoxMDAwKSwgZGlzcG9zZTpkYXRhW29mZnNldCsyNF0sIGJsZW5kOmRhdGFbb2Zmc2V0KzI1XX07XG5cdFx0XHQvL2NvbnNvbGUubG9nKGZybSk7XG5cdFx0XHRvdXQuZnJhbWVzLnB1c2goZnJtKTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cImZkQVRcIikge1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8bGVuLTQ7IGkrKykgZmRbZm9mZitpXSA9IGRhdGFbb2Zmc2V0K2krNF07XG5cdFx0XHRmb2ZmICs9IGxlbi00O1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwicEhZc1wiKSB7XG5cdFx0XHRvdXQudGFic1t0eXBlXSA9IFtiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KSwgYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCs0KSwgZGF0YVtvZmZzZXQrOF1dO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiY0hSTVwiKSB7XG5cdFx0XHRvdXQudGFic1t0eXBlXSA9IFtdO1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8ODsgaSsrKSBvdXQudGFic1t0eXBlXS5wdXNoKGJpbi5yZWFkVWludChkYXRhLCBvZmZzZXQraSo0KSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJ0RVh0XCIpIHtcblx0XHRcdGlmKG91dC50YWJzW3R5cGVdPT1udWxsKSBvdXQudGFic1t0eXBlXSA9IHt9O1xuXHRcdFx0dmFyIG56ID0gYmluLm5leHRaZXJvKGRhdGEsIG9mZnNldCk7XG5cdFx0XHR2YXIga2V5dyA9IGJpbi5yZWFkQVNDSUkoZGF0YSwgb2Zmc2V0LCBuei1vZmZzZXQpO1xuXHRcdFx0dmFyIHRleHQgPSBiaW4ucmVhZEFTQ0lJKGRhdGEsIG56KzEsIG9mZnNldCtsZW4tbnotMSk7XG5cdFx0XHRvdXQudGFic1t0eXBlXVtrZXl3XSA9IHRleHQ7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJpVFh0XCIpIHtcblx0XHRcdGlmKG91dC50YWJzW3R5cGVdPT1udWxsKSBvdXQudGFic1t0eXBlXSA9IHt9O1xuXHRcdFx0dmFyIG56ID0gMCwgb2ZmID0gb2Zmc2V0O1xuXHRcdFx0bnogPSBiaW4ubmV4dFplcm8oZGF0YSwgb2ZmKTtcblx0XHRcdHZhciBrZXl3ID0gYmluLnJlYWRBU0NJSShkYXRhLCBvZmYsIG56LW9mZik7ICBvZmYgPSBueiArIDE7XG5cdFx0XHR2YXIgY2ZsYWcgPSBkYXRhW29mZl0sIGNtZXRoID0gZGF0YVtvZmYrMV07ICBvZmYrPTI7XG5cdFx0XHRueiA9IGJpbi5uZXh0WmVybyhkYXRhLCBvZmYpO1xuXHRcdFx0dmFyIGx0YWcgPSBiaW4ucmVhZEFTQ0lJKGRhdGEsIG9mZiwgbnotb2ZmKTsgIG9mZiA9IG56ICsgMTtcblx0XHRcdG56ID0gYmluLm5leHRaZXJvKGRhdGEsIG9mZik7XG5cdFx0XHR2YXIgdGtleXcgPSBiaW4ucmVhZFVURjgoZGF0YSwgb2ZmLCBuei1vZmYpOyAgb2ZmID0gbnogKyAxO1xuXHRcdFx0dmFyIHRleHQgID0gYmluLnJlYWRVVEY4KGRhdGEsIG9mZiwgbGVuLShvZmYtb2Zmc2V0KSk7XG5cdFx0XHRvdXQudGFic1t0eXBlXVtrZXl3XSA9IHRleHQ7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJQTFRFXCIpIHtcblx0XHRcdG91dC50YWJzW3R5cGVdID0gYmluLnJlYWRCeXRlcyhkYXRhLCBvZmZzZXQsIGxlbik7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJoSVNUXCIpIHtcblx0XHRcdHZhciBwbCA9IG91dC50YWJzW1wiUExURVwiXS5sZW5ndGgvMztcblx0XHRcdG91dC50YWJzW3R5cGVdID0gW107ICBmb3IodmFyIGk9MDsgaTxwbDsgaSsrKSBvdXQudGFic1t0eXBlXS5wdXNoKHJVcyhkYXRhLCBvZmZzZXQraSoyKSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJ0Uk5TXCIpIHtcblx0XHRcdGlmICAgICAob3V0LmN0eXBlPT0zKSBvdXQudGFic1t0eXBlXSA9IGJpbi5yZWFkQnl0ZXMoZGF0YSwgb2Zmc2V0LCBsZW4pO1xuXHRcdFx0ZWxzZSBpZihvdXQuY3R5cGU9PTApIG91dC50YWJzW3R5cGVdID0gclVzKGRhdGEsIG9mZnNldCk7XG5cdFx0XHRlbHNlIGlmKG91dC5jdHlwZT09Mikgb3V0LnRhYnNbdHlwZV0gPSBbIHJVcyhkYXRhLG9mZnNldCksclVzKGRhdGEsb2Zmc2V0KzIpLHJVcyhkYXRhLG9mZnNldCs0KSBdO1xuXHRcdFx0Ly9lbHNlIGNvbnNvbGUubG9nKFwidFJOUyBmb3IgdW5zdXBwb3J0ZWQgY29sb3IgdHlwZVwiLG91dC5jdHlwZSwgbGVuKTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cImdBTUFcIikgb3V0LnRhYnNbdHlwZV0gPSBiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KS8xMDAwMDA7XG5cdFx0ZWxzZSBpZih0eXBlPT1cInNSR0JcIikgb3V0LnRhYnNbdHlwZV0gPSBkYXRhW29mZnNldF07XG5cdFx0ZWxzZSBpZih0eXBlPT1cImJLR0RcIilcblx0XHR7XG5cdFx0XHRpZiAgICAgKG91dC5jdHlwZT09MCB8fCBvdXQuY3R5cGU9PTQpIG91dC50YWJzW3R5cGVdID0gW3JVcyhkYXRhLCBvZmZzZXQpXTtcblx0XHRcdGVsc2UgaWYob3V0LmN0eXBlPT0yIHx8IG91dC5jdHlwZT09Nikgb3V0LnRhYnNbdHlwZV0gPSBbclVzKGRhdGEsIG9mZnNldCksIHJVcyhkYXRhLCBvZmZzZXQrMiksIHJVcyhkYXRhLCBvZmZzZXQrNCldO1xuXHRcdFx0ZWxzZSBpZihvdXQuY3R5cGU9PTMpIG91dC50YWJzW3R5cGVdID0gZGF0YVtvZmZzZXRdO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiSUVORFwiKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0Ly9lbHNlIHsgIGxvZyhcInVua25vd24gY2h1bmsgdHlwZVwiLCB0eXBlLCBsZW4pOyAgfVxuXHRcdG9mZnNldCArPSBsZW47XG5cdFx0dmFyIGNyYyA9IGJpbi5yZWFkVWludChkYXRhLCBvZmZzZXQpOyAgb2Zmc2V0ICs9IDQ7XG5cdH1cblx0aWYoZm9mZiE9MCkgeyAgdmFyIGZyID0gb3V0LmZyYW1lc1tvdXQuZnJhbWVzLmxlbmd0aC0xXTtcblx0XHRmci5kYXRhID0gVVBORy5kZWNvZGUuX2RlY29tcHJlc3Mob3V0LCBmZC5zbGljZSgwLGZvZmYpLCBmci5yZWN0LndpZHRoLCBmci5yZWN0LmhlaWdodCk7ICBmb2ZmPTA7XG5cdH1cdFxuXHRvdXQuZGF0YSA9IFVQTkcuZGVjb2RlLl9kZWNvbXByZXNzKG91dCwgZGQsIG91dC53aWR0aCwgb3V0LmhlaWdodCk7XG5cdFxuXHRkZWxldGUgb3V0LmNvbXByZXNzOyAgZGVsZXRlIG91dC5pbnRlcmxhY2U7ICBkZWxldGUgb3V0LmZpbHRlcjtcblx0cmV0dXJuIG91dDtcbn1cblxuVVBORy5kZWNvZGUuX2RlY29tcHJlc3MgPSBmdW5jdGlvbihvdXQsIGRkLCB3LCBoKSB7XG5cdHZhciB0aW1lID0gRGF0ZS5ub3coKTtcblx0dmFyIGJwcCA9IFVQTkcuZGVjb2RlLl9nZXRCUFAob3V0KSwgYnBsID0gTWF0aC5jZWlsKHcqYnBwLzgpLCBidWZmID0gbmV3IFVpbnQ4QXJyYXkoKGJwbCsxK291dC5pbnRlcmxhY2UpKmgpO1xuXHRkZCA9IFVQTkcuZGVjb2RlLl9pbmZsYXRlKGRkLGJ1ZmYpO1xuXHQvL2NvbnNvbGUubG9nKGRkLmxlbmd0aCwgYnVmZi5sZW5ndGgpO1xuXHQvL2NvbnNvbGUubG9nKERhdGUubm93KCktdGltZSk7XG5cblx0dmFyIHRpbWU9RGF0ZS5ub3coKTtcblx0aWYgICAgIChvdXQuaW50ZXJsYWNlPT0wKSBkZCA9IFVQTkcuZGVjb2RlLl9maWx0ZXJaZXJvKGRkLCBvdXQsIDAsIHcsIGgpO1xuXHRlbHNlIGlmKG91dC5pbnRlcmxhY2U9PTEpIGRkID0gVVBORy5kZWNvZGUuX3JlYWRJbnRlcmxhY2UoZGQsIG91dCk7XG5cdC8vY29uc29sZS5sb2coRGF0ZS5ub3coKS10aW1lKTtcblx0cmV0dXJuIGRkO1xufVxuXG5VUE5HLmRlY29kZS5faW5mbGF0ZSA9IGZ1bmN0aW9uKGRhdGEsIGJ1ZmYpIHsgIHZhciBvdXQ9VVBOR1tcImluZmxhdGVSYXdcIl0obmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsIDIsZGF0YS5sZW5ndGgtNiksYnVmZik7ICByZXR1cm4gb3V0OyAgfVxuVVBORy5pbmZsYXRlUmF3PWZ1bmN0aW9uKCl7dmFyIEg9e307SC5IPXt9O0guSC5OPWZ1bmN0aW9uKE4sVyl7dmFyIFI9VWludDhBcnJheSxpPTAsbT0wLEo9MCxoPTAsUT0wLFg9MCx1PTAsdz0wLGQ9MCx2LEM7XG5pZihOWzBdPT0zJiZOWzFdPT0wKXJldHVybiBXP1c6bmV3IFIoMCk7dmFyIFY9SC5ILG49Vi5iLEE9Vi5lLGw9Vi5SLE09Vi5uLEk9Vi5BLGU9Vi5aLGI9Vi5tLFo9Vz09bnVsbDtcbmlmKFopVz1uZXcgUihOLmxlbmd0aD4+PjI8PDMpO3doaWxlKGk9PTApe2k9bihOLGQsMSk7bT1uKE4sZCsxLDIpO2QrPTM7aWYobT09MCl7aWYoKGQmNykhPTApZCs9OC0oZCY3KTtcbnZhciBEPShkPj4+MykrNCxxPU5bRC00XXxOW0QtM108PDg7aWYoWilXPUguSC5XKFcsdytxKTtXLnNldChuZXcgUihOLmJ1ZmZlcixOLmJ5dGVPZmZzZXQrRCxxKSx3KTtkPUQrcTw8MztcbncrPXE7Y29udGludWV9aWYoWilXPUguSC5XKFcsdysoMTw8MTcpKTtpZihtPT0xKXt2PWIuSjtDPWIuaDtYPSgxPDw5KS0xO3U9KDE8PDUpLTF9aWYobT09Mil7Sj1BKE4sZCw1KSsyNTc7XG5oPUEoTixkKzUsNSkrMTtRPUEoTixkKzEwLDQpKzQ7ZCs9MTQ7dmFyIEU9ZCxqPTE7Zm9yKHZhciBjPTA7YzwzODtjKz0yKXtiLlFbY109MDtiLlFbYysxXT0wfWZvcih2YXIgYz0wO1xuYzxRO2MrKyl7dmFyIEs9QShOLGQrYyozLDMpO2IuUVsoYi5YW2NdPDwxKSsxXT1LO2lmKEs+ailqPUt9ZCs9MypRO00oYi5RLGopO0koYi5RLGosYi51KTt2PWIudztDPWIuZDtcbmQ9bChiLnUsKDE8PGopLTEsSitoLE4sZCxiLnYpO3ZhciByPVYuVihiLnYsMCxKLGIuQyk7WD0oMTw8ciktMTt2YXIgUz1WLlYoYi52LEosaCxiLkQpO3U9KDE8PFMpLTE7TShiLkMscik7XG5JKGIuQyxyLHYpO00oYi5ELFMpO0koYi5ELFMsQyl9d2hpbGUoITApe3ZhciBUPXZbZShOLGQpJlhdO2QrPVQmMTU7dmFyIHA9VD4+PjQ7aWYocD4+Pjg9PTApe1dbdysrXT1wfWVsc2UgaWYocD09MjU2KXticmVha31lbHNle3ZhciB6PXcrcC0yNTQ7XG5pZihwPjI2NCl7dmFyIF89Yi5xW3AtMjU3XTt6PXcrKF8+Pj4zKStBKE4sZCxfJjcpO2QrPV8mN312YXIgJD1DW2UoTixkKSZ1XTtkKz0kJjE1O3ZhciBzPSQ+Pj40LFk9Yi5jW3NdLGE9KFk+Pj40KStuKE4sZCxZJjE1KTtcbmQrPVkmMTU7d2hpbGUodzx6KXtXW3ddPVdbdysrLWFdO1dbd109V1t3KystYV07V1t3XT1XW3crKy1hXTtXW3ddPVdbdysrLWFdfXc9en19fXJldHVybiBXLmxlbmd0aD09dz9XOlcuc2xpY2UoMCx3KX07XG5ILkguVz1mdW5jdGlvbihOLFcpe3ZhciBSPU4ubGVuZ3RoO2lmKFc8PVIpcmV0dXJuIE47dmFyIFY9bmV3IFVpbnQ4QXJyYXkoUjw8MSk7Vi5zZXQoTiwwKTtyZXR1cm4gVn07XG5ILkguUj1mdW5jdGlvbihOLFcsUixWLG4sQSl7dmFyIGw9SC5ILmUsTT1ILkguWixJPTA7d2hpbGUoSTxSKXt2YXIgZT1OW00oVixuKSZXXTtuKz1lJjE1O3ZhciBiPWU+Pj40O1xuaWYoYjw9MTUpe0FbSV09YjtJKyt9ZWxzZXt2YXIgWj0wLG09MDtpZihiPT0xNil7bT0zK2woVixuLDIpO24rPTI7Wj1BW0ktMV19ZWxzZSBpZihiPT0xNyl7bT0zK2woVixuLDMpO1xubis9M31lbHNlIGlmKGI9PTE4KXttPTExK2woVixuLDcpO24rPTd9dmFyIEo9SSttO3doaWxlKEk8Sil7QVtJXT1aO0krK319fXJldHVybiBufTtILkguVj1mdW5jdGlvbihOLFcsUixWKXt2YXIgbj0wLEE9MCxsPVYubGVuZ3RoPj4+MTtcbndoaWxlKEE8Uil7dmFyIE09TltBK1ddO1ZbQTw8MV09MDtWWyhBPDwxKSsxXT1NO2lmKE0+biluPU07QSsrfXdoaWxlKEE8bCl7VltBPDwxXT0wO1ZbKEE8PDEpKzFdPTA7QSsrfXJldHVybiBufTtcbkguSC5uPWZ1bmN0aW9uKE4sVyl7dmFyIFI9SC5ILm0sVj1OLmxlbmd0aCxuLEEsbCxNLEksZT1SLmo7Zm9yKHZhciBNPTA7TTw9VztNKyspZVtNXT0wO2ZvcihNPTE7TTxWO00rPTIpZVtOW01dXSsrO1xudmFyIGI9Ui5LO249MDtlWzBdPTA7Zm9yKEE9MTtBPD1XO0ErKyl7bj1uK2VbQS0xXTw8MTtiW0FdPW59Zm9yKGw9MDtsPFY7bCs9Mil7ST1OW2wrMV07aWYoSSE9MCl7TltsXT1iW0ldO1xuYltJXSsrfX19O0guSC5BPWZ1bmN0aW9uKE4sVyxSKXt2YXIgVj1OLmxlbmd0aCxuPUguSC5tLEE9bi5yO2Zvcih2YXIgbD0wO2w8VjtsKz0yKWlmKE5bbCsxXSE9MCl7dmFyIE09bD4+MSxJPU5bbCsxXSxlPU08PDR8SSxiPVctSSxaPU5bbF08PGIsbT1aKygxPDxiKTtcbndoaWxlKFohPW0pe3ZhciBKPUFbWl0+Pj4xNS1XO1JbSl09ZTtaKyt9fX07SC5ILmw9ZnVuY3Rpb24oTixXKXt2YXIgUj1ILkgubS5yLFY9MTUtVztmb3IodmFyIG49MDtuPE4ubGVuZ3RoO1xubis9Mil7dmFyIEE9TltuXTw8Vy1OW24rMV07TltuXT1SW0FdPj4+Vn19O0guSC5NPWZ1bmN0aW9uKE4sVyxSKXtSPVI8PChXJjcpO3ZhciBWPVc+Pj4zO05bVl18PVI7TltWKzFdfD1SPj4+OH07XG5ILkguST1mdW5jdGlvbihOLFcsUil7Uj1SPDwoVyY3KTt2YXIgVj1XPj4+MztOW1ZdfD1SO05bVisxXXw9Uj4+Pjg7TltWKzJdfD1SPj4+MTZ9O0guSC5lPWZ1bmN0aW9uKE4sVyxSKXtyZXR1cm4oTltXPj4+M118TlsoVz4+PjMpKzFdPDw4KT4+PihXJjcpJigxPDxSKS0xfTtcbkguSC5iPWZ1bmN0aW9uKE4sVyxSKXtyZXR1cm4oTltXPj4+M118TlsoVz4+PjMpKzFdPDw4fE5bKFc+Pj4zKSsyXTw8MTYpPj4+KFcmNykmKDE8PFIpLTF9O0guSC5aPWZ1bmN0aW9uKE4sVyl7cmV0dXJuKE5bVz4+PjNdfE5bKFc+Pj4zKSsxXTw8OHxOWyhXPj4+MykrMl08PDE2KT4+PihXJjcpfTtcbkguSC5pPWZ1bmN0aW9uKE4sVyl7cmV0dXJuKE5bVz4+PjNdfE5bKFc+Pj4zKSsxXTw8OHxOWyhXPj4+MykrMl08PDE2fE5bKFc+Pj4zKSszXTw8MjQpPj4+KFcmNyl9O0guSC5tPWZ1bmN0aW9uKCl7dmFyIE49VWludDE2QXJyYXksVz1VaW50MzJBcnJheTtcbnJldHVybntLOm5ldyBOKDE2KSxqOm5ldyBOKDE2KSxYOlsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSxTOlszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDk5OSw5OTksOTk5XSxUOlswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsMCwwLDBdLHE6bmV3IE4oMzIpLHA6WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3Nyw2NTUzNSw2NTUzNV0sejpbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywwLDBdLGM6bmV3IFcoMzIpLEo6bmV3IE4oNTEyKSxfOltdLGg6bmV3IE4oMzIpLCQ6W10sdzpuZXcgTigzMjc2OCksQzpbXSx2OltdLGQ6bmV3IE4oMzI3NjgpLEQ6W10sdTpuZXcgTig1MTIpLFE6W10scjpuZXcgTigxPDwxNSksczpuZXcgVygyODYpLFk6bmV3IFcoMzApLGE6bmV3IFcoMTkpLHQ6bmV3IFcoMTVlMyksazpuZXcgTigxPDwxNiksZzpuZXcgTigxPDwxNSl9fSgpO1xuKGZ1bmN0aW9uKCl7dmFyIE49SC5ILm0sVz0xPDwxNTtmb3IodmFyIFI9MDtSPFc7UisrKXt2YXIgVj1SO1Y9KFYmMjg2MzMxMTUzMCk+Pj4xfChWJjE0MzE2NTU3NjUpPDwxO1xuVj0oViYzNDM1OTczODM2KT4+PjJ8KFYmODU4OTkzNDU5KTw8MjtWPShWJjQwNDIzMjIxNjApPj4+NHwoViYyNTI2NDUxMzUpPDw0O1Y9KFYmNDI3ODI1NTM2MCk+Pj44fChWJjE2NzExOTM1KTw8ODtcbk4ucltSXT0oVj4+PjE2fFY8PDE2KT4+PjE3fWZ1bmN0aW9uIG4oQSxsLE0pe3doaWxlKGwtLSE9MClBLnB1c2goMCxNKX1mb3IodmFyIFI9MDtSPDMyO1IrKyl7Ti5xW1JdPU4uU1tSXTw8M3xOLlRbUl07XG5OLmNbUl09Ti5wW1JdPDw0fE4ueltSXX1uKE4uXywxNDQsOCk7bihOLl8sMjU1LTE0Myw5KTtuKE4uXywyNzktMjU1LDcpO24oTi5fLDI4Ny0yNzksOCk7SC5ILm4oTi5fLDkpO1xuSC5ILkEoTi5fLDksTi5KKTtILkgubChOLl8sOSk7bihOLiQsMzIsNSk7SC5ILm4oTi4kLDUpO0guSC5BKE4uJCw1LE4uaCk7SC5ILmwoTi4kLDUpO24oTi5RLDE5LDApO24oTi5DLDI4NiwwKTtcbm4oTi5ELDMwLDApO24oTi52LDMyMCwwKX0oKSk7cmV0dXJuIEguSC5OfSgpXG5cblxuVVBORy5kZWNvZGUuX3JlYWRJbnRlcmxhY2UgPSBmdW5jdGlvbihkYXRhLCBvdXQpXG57XG5cdHZhciB3ID0gb3V0LndpZHRoLCBoID0gb3V0LmhlaWdodDtcblx0dmFyIGJwcCA9IFVQTkcuZGVjb2RlLl9nZXRCUFAob3V0KSwgY2JwcCA9IGJwcD4+MywgYnBsID0gTWF0aC5jZWlsKHcqYnBwLzgpO1xuXHR2YXIgaW1nID0gbmV3IFVpbnQ4QXJyYXkoIGggKiBicGwgKTtcblx0dmFyIGRpID0gMDtcblxuXHR2YXIgc3RhcnRpbmdfcm93ICA9IFsgMCwgMCwgNCwgMCwgMiwgMCwgMSBdO1xuXHR2YXIgc3RhcnRpbmdfY29sICA9IFsgMCwgNCwgMCwgMiwgMCwgMSwgMCBdO1xuXHR2YXIgcm93X2luY3JlbWVudCA9IFsgOCwgOCwgOCwgNCwgNCwgMiwgMiBdO1xuXHR2YXIgY29sX2luY3JlbWVudCA9IFsgOCwgOCwgNCwgNCwgMiwgMiwgMSBdO1xuXG5cdHZhciBwYXNzPTA7XG5cdHdoaWxlKHBhc3M8Nylcblx0e1xuXHRcdHZhciByaSA9IHJvd19pbmNyZW1lbnRbcGFzc10sIGNpID0gY29sX2luY3JlbWVudFtwYXNzXTtcblx0XHR2YXIgc3cgPSAwLCBzaCA9IDA7XG5cdFx0dmFyIGNyID0gc3RhcnRpbmdfcm93W3Bhc3NdOyAgd2hpbGUoY3I8aCkgeyAgY3IrPXJpOyAgc2grKzsgIH1cblx0XHR2YXIgY2MgPSBzdGFydGluZ19jb2xbcGFzc107ICB3aGlsZShjYzx3KSB7ICBjYys9Y2k7ICBzdysrOyAgfVxuXHRcdHZhciBicGxsID0gTWF0aC5jZWlsKHN3KmJwcC84KTtcblx0XHRVUE5HLmRlY29kZS5fZmlsdGVyWmVybyhkYXRhLCBvdXQsIGRpLCBzdywgc2gpO1xuXG5cdFx0dmFyIHk9MCwgcm93ID0gc3RhcnRpbmdfcm93W3Bhc3NdO1xuXHRcdHdoaWxlKHJvdzxoKVxuXHRcdHtcblx0XHRcdHZhciBjb2wgPSBzdGFydGluZ19jb2xbcGFzc107XG5cdFx0XHR2YXIgY2RpID0gKGRpK3kqYnBsbCk8PDM7XG5cblx0XHRcdHdoaWxlKGNvbDx3KVxuXHRcdFx0e1xuXHRcdFx0XHRpZihicHA9PTEpIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZGF0YVtjZGk+PjNdOyAgdmFsID0gKHZhbD4+KDctKGNkaSY3KSkpJjE7XG5cdFx0XHRcdFx0aW1nW3JvdypicGwgKyAoY29sPj4zKV0gfD0gKHZhbCA8PCAoNy0oKGNvbCY3KTw8MCkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihicHA9PTIpIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZGF0YVtjZGk+PjNdOyAgdmFsID0gKHZhbD4+KDYtKGNkaSY3KSkpJjM7XG5cdFx0XHRcdFx0aW1nW3JvdypicGwgKyAoY29sPj4yKV0gfD0gKHZhbCA8PCAoNi0oKGNvbCYzKTw8MSkpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihicHA9PTQpIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZGF0YVtjZGk+PjNdOyAgdmFsID0gKHZhbD4+KDQtKGNkaSY3KSkpJjE1O1xuXHRcdFx0XHRcdGltZ1tyb3cqYnBsICsgKGNvbD4+MSldIHw9ICh2YWwgPDwgKDQtKChjb2wmMSk8PDIpKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYoYnBwPj04KSB7XG5cdFx0XHRcdFx0dmFyIGlpID0gcm93KmJwbCtjb2wqY2JwcDtcblx0XHRcdFx0XHRmb3IodmFyIGo9MDsgajxjYnBwOyBqKyspIGltZ1tpaStqXSA9IGRhdGFbKGNkaT4+Mykral07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2RpKz1icHA7ICBjb2wrPWNpO1xuXHRcdFx0fVxuXHRcdFx0eSsrOyAgcm93ICs9IHJpO1xuXHRcdH1cblx0XHRpZihzdypzaCE9MCkgZGkgKz0gc2ggKiAoMSArIGJwbGwpO1xuXHRcdHBhc3MgPSBwYXNzICsgMTtcblx0fVxuXHRyZXR1cm4gaW1nO1xufVxuXG5VUE5HLmRlY29kZS5fZ2V0QlBQID0gZnVuY3Rpb24ob3V0KSB7XG5cdHZhciBub2MgPSBbMSxudWxsLDMsMSwyLG51bGwsNF1bb3V0LmN0eXBlXTtcblx0cmV0dXJuIG5vYyAqIG91dC5kZXB0aDtcbn1cblxuVVBORy5kZWNvZGUuX2ZpbHRlclplcm8gPSBmdW5jdGlvbihkYXRhLCBvdXQsIG9mZiwgdywgaClcbntcblx0dmFyIGJwcCA9IFVQTkcuZGVjb2RlLl9nZXRCUFAob3V0KSwgYnBsID0gTWF0aC5jZWlsKHcqYnBwLzgpLCBwYWV0aCA9IFVQTkcuZGVjb2RlLl9wYWV0aDtcblx0YnBwID0gTWF0aC5jZWlsKGJwcC84KTtcblx0XG5cdHZhciBpPTAsIGRpPTEsIHR5cGU9ZGF0YVtvZmZdLCB4PTA7XG5cdFxuXHRpZih0eXBlPjEpIGRhdGFbb2ZmXT1bMCwwLDFdW3R5cGUtMl07ICBcblx0aWYodHlwZT09MykgZm9yKHg9YnBwOyB4PGJwbDsgeCsrKSBkYXRhW3grMV0gPSAoZGF0YVt4KzFdICsgKGRhdGFbeCsxLWJwcF0+Pj4xKSApJjI1NTtcblxuXHRmb3IodmFyIHk9MDsgeTxoOyB5KyspICB7XG5cdFx0aSA9IG9mZit5KmJwbDsgZGkgPSBpK3krMTtcblx0XHR0eXBlID0gZGF0YVtkaS0xXTsgeD0wO1xuXG5cdFx0aWYgICAgICh0eXBlPT0wKSAgIGZvcig7IHg8YnBsOyB4KyspIGRhdGFbaSt4XSA9IGRhdGFbZGkreF07XG5cdFx0ZWxzZSBpZih0eXBlPT0xKSB7IGZvcig7IHg8YnBwOyB4KyspIGRhdGFbaSt4XSA9IGRhdGFbZGkreF07XG5cdFx0XHRcdFx0XHQgICBmb3IoOyB4PGJwbDsgeCsrKSBkYXRhW2kreF0gPSAoZGF0YVtkaSt4XSArIGRhdGFbaSt4LWJwcF0pOyAgfVxuXHRcdGVsc2UgaWYodHlwZT09MikgeyBmb3IoOyB4PGJwbDsgeCsrKSBkYXRhW2kreF0gPSAoZGF0YVtkaSt4XSArIGRhdGFbaSt4LWJwbF0pOyAgfVxuXHRcdGVsc2UgaWYodHlwZT09MykgeyBmb3IoOyB4PGJwcDsgeCsrKSBkYXRhW2kreF0gPSAoZGF0YVtkaSt4XSArICggZGF0YVtpK3gtYnBsXT4+PjEpKTtcblx0XHRcdCAgICAgICAgICAgICAgIGZvcig7IHg8YnBsOyB4KyspIGRhdGFbaSt4XSA9IChkYXRhW2RpK3hdICsgKChkYXRhW2kreC1icGxdK2RhdGFbaSt4LWJwcF0pPj4+MSkgKTsgIH1cblx0XHRlbHNlICAgICAgICAgICAgIHsgZm9yKDsgeDxicHA7IHgrKykgZGF0YVtpK3hdID0gKGRhdGFbZGkreF0gKyBwYWV0aCgwLCBkYXRhW2kreC1icGxdLCAwKSk7XG5cdFx0XHRcdFx0XHQgICBmb3IoOyB4PGJwbDsgeCsrKSBkYXRhW2kreF0gPSAoZGF0YVtkaSt4XSArIHBhZXRoKGRhdGFbaSt4LWJwcF0sIGRhdGFbaSt4LWJwbF0sIGRhdGFbaSt4LWJwcC1icGxdKSApOyAgfVxuXHR9XG5cdHJldHVybiBkYXRhO1xufVxuXG5VUE5HLmRlY29kZS5fcGFldGggPSBmdW5jdGlvbihhLGIsYylcbntcblx0dmFyIHAgPSBhK2ItYywgcGEgPSAocC1hKSwgcGIgPSAocC1iKSwgcGMgPSAocC1jKTtcblx0aWYgKHBhKnBhIDw9IHBiKnBiICYmIHBhKnBhIDw9IHBjKnBjKSAgcmV0dXJuIGE7XG5cdGVsc2UgaWYgKHBiKnBiIDw9IHBjKnBjKSAgcmV0dXJuIGI7XG5cdHJldHVybiBjO1xufVxuXG5VUE5HLmRlY29kZS5fSUhEUiA9IGZ1bmN0aW9uKGRhdGEsIG9mZnNldCwgb3V0KVxue1xuXHR2YXIgYmluID0gVVBORy5fYmluO1xuXHRvdXQud2lkdGggID0gYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCk7ICBvZmZzZXQgKz0gNDtcblx0b3V0LmhlaWdodCA9IGJpbi5yZWFkVWludChkYXRhLCBvZmZzZXQpOyAgb2Zmc2V0ICs9IDQ7XG5cdG91dC5kZXB0aCAgICAgPSBkYXRhW29mZnNldF07ICBvZmZzZXQrKztcblx0b3V0LmN0eXBlICAgICA9IGRhdGFbb2Zmc2V0XTsgIG9mZnNldCsrO1xuXHRvdXQuY29tcHJlc3MgID0gZGF0YVtvZmZzZXRdOyAgb2Zmc2V0Kys7XG5cdG91dC5maWx0ZXIgICAgPSBkYXRhW29mZnNldF07ICBvZmZzZXQrKztcblx0b3V0LmludGVybGFjZSA9IGRhdGFbb2Zmc2V0XTsgIG9mZnNldCsrO1xufVxuXG5VUE5HLl9iaW4gPSB7XG5cdG5leHRaZXJvICAgOiBmdW5jdGlvbihkYXRhLHApICB7ICB3aGlsZShkYXRhW3BdIT0wKSBwKys7ICByZXR1cm4gcDsgIH0sXG5cdHJlYWRVc2hvcnQgOiBmdW5jdGlvbihidWZmLHApICB7ICByZXR1cm4gKGJ1ZmZbcF08PCA4KSB8IGJ1ZmZbcCsxXTsgIH0sXG5cdHdyaXRlVXNob3J0OiBmdW5jdGlvbihidWZmLHAsbil7ICBidWZmW3BdID0gKG4+PjgpJjI1NTsgIGJ1ZmZbcCsxXSA9IG4mMjU1OyAgfSxcblx0cmVhZFVpbnQgICA6IGZ1bmN0aW9uKGJ1ZmYscCkgIHsgIHJldHVybiAoYnVmZltwXSooMjU2KjI1NioyNTYpKSArICgoYnVmZltwKzFdPDwxNikgfCAoYnVmZltwKzJdPDwgOCkgfCBidWZmW3ArM10pOyAgfSxcblx0d3JpdGVVaW50ICA6IGZ1bmN0aW9uKGJ1ZmYscCxuKXsgIGJ1ZmZbcF09KG4+PjI0KSYyNTU7ICBidWZmW3ArMV09KG4+PjE2KSYyNTU7ICBidWZmW3ArMl09KG4+PjgpJjI1NTsgIGJ1ZmZbcCszXT1uJjI1NTsgIH0sXG5cdHJlYWRBU0NJSSAgOiBmdW5jdGlvbihidWZmLHAsbCl7ICB2YXIgcyA9IFwiXCI7ICBmb3IodmFyIGk9MDsgaTxsOyBpKyspIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZmW3AraV0pOyAgcmV0dXJuIHM7ICAgIH0sXG5cdHdyaXRlQVNDSUkgOiBmdW5jdGlvbihkYXRhLHAscyl7ICBmb3IodmFyIGk9MDsgaTxzLmxlbmd0aDsgaSsrKSBkYXRhW3AraV0gPSBzLmNoYXJDb2RlQXQoaSk7ICB9LFxuXHRyZWFkQnl0ZXMgIDogZnVuY3Rpb24oYnVmZixwLGwpeyAgdmFyIGFyciA9IFtdOyAgIGZvcih2YXIgaT0wOyBpPGw7IGkrKykgYXJyLnB1c2goYnVmZltwK2ldKTsgICByZXR1cm4gYXJyOyAgfSxcblx0cGFkIDogZnVuY3Rpb24obikgeyByZXR1cm4gbi5sZW5ndGggPCAyID8gXCIwXCIgKyBuIDogbjsgfSxcblx0cmVhZFVURjggOiBmdW5jdGlvbihidWZmLCBwLCBsKSB7XG5cdFx0dmFyIHMgPSBcIlwiLCBucztcblx0XHRmb3IodmFyIGk9MDsgaTxsOyBpKyspIHMgKz0gXCIlXCIgKyBVUE5HLl9iaW4ucGFkKGJ1ZmZbcCtpXS50b1N0cmluZygxNikpO1xuXHRcdHRyeSB7ICBucyA9IGRlY29kZVVSSUNvbXBvbmVudChzKTsgfVxuXHRcdGNhdGNoKGUpIHsgIHJldHVybiBVUE5HLl9iaW4ucmVhZEFTQ0lJKGJ1ZmYsIHAsIGwpOyAgfVxuXHRcdHJldHVybiAgbnM7XG5cdH1cbn1cblVQTkcuX2NvcHlUaWxlID0gZnVuY3Rpb24oc2IsIHN3LCBzaCwgdGIsIHR3LCB0aCwgeG9mZiwgeW9mZiwgbW9kZSlcbntcblx0dmFyIHcgPSBNYXRoLm1pbihzdyx0dyksIGggPSBNYXRoLm1pbihzaCx0aCk7XG5cdHZhciBzaT0wLCB0aT0wO1xuXHRmb3IodmFyIHk9MDsgeTxoOyB5KyspXG5cdFx0Zm9yKHZhciB4PTA7IHg8dzsgeCsrKVxuXHRcdHtcblx0XHRcdGlmKHhvZmY+PTAgJiYgeW9mZj49MCkgeyAgc2kgPSAoeSpzdyt4KTw8MjsgIHRpID0gKCggeW9mZit5KSp0dyt4b2ZmK3gpPDwyOyAgfVxuXHRcdFx0ZWxzZSAgICAgICAgICAgICAgICAgICB7ICBzaSA9ICgoLXlvZmYreSkqc3cteG9mZit4KTw8MjsgIHRpID0gKHkqdHcreCk8PDI7ICB9XG5cdFx0XHRcblx0XHRcdGlmICAgICAobW9kZT09MCkgeyAgdGJbdGldID0gc2Jbc2ldOyAgdGJbdGkrMV0gPSBzYltzaSsxXTsgIHRiW3RpKzJdID0gc2Jbc2krMl07ICB0Ylt0aSszXSA9IHNiW3NpKzNdOyAgfVxuXHRcdFx0ZWxzZSBpZihtb2RlPT0xKSB7XG5cdFx0XHRcdHZhciBmYSA9IHNiW3NpKzNdKigxLzI1NSksIGZyPXNiW3NpXSpmYSwgZmc9c2Jbc2krMV0qZmEsIGZiPXNiW3NpKzJdKmZhOyBcblx0XHRcdFx0dmFyIGJhID0gdGJbdGkrM10qKDEvMjU1KSwgYnI9dGJbdGldKmJhLCBiZz10Ylt0aSsxXSpiYSwgYmI9dGJbdGkrMl0qYmE7IFxuXHRcdFx0XHRcblx0XHRcdFx0dmFyIGlmYT0xLWZhLCBvYSA9IGZhK2JhKmlmYSwgaW9hID0gKG9hPT0wPzA6MS9vYSk7XG5cdFx0XHRcdHRiW3RpKzNdID0gMjU1Km9hOyAgXG5cdFx0XHRcdHRiW3RpKzBdID0gKGZyK2JyKmlmYSkqaW9hOyAgXG5cdFx0XHRcdHRiW3RpKzFdID0gKGZnK2JnKmlmYSkqaW9hOyAgIFxuXHRcdFx0XHR0Ylt0aSsyXSA9IChmYitiYippZmEpKmlvYTsgIFxuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZihtb2RlPT0yKXtcdC8vIGNvcHkgb25seSBkaWZmZXJlbmNlcywgb3RoZXJ3aXNlIHplcm9cblx0XHRcdFx0dmFyIGZhID0gc2Jbc2krM10sIGZyPXNiW3NpXSwgZmc9c2Jbc2krMV0sIGZiPXNiW3NpKzJdOyBcblx0XHRcdFx0dmFyIGJhID0gdGJbdGkrM10sIGJyPXRiW3RpXSwgYmc9dGJbdGkrMV0sIGJiPXRiW3RpKzJdOyBcblx0XHRcdFx0aWYoZmE9PWJhICYmIGZyPT1iciAmJiBmZz09YmcgJiYgZmI9PWJiKSB7ICB0Ylt0aV09MDsgIHRiW3RpKzFdPTA7ICB0Ylt0aSsyXT0wOyAgdGJbdGkrM109MDsgIH1cblx0XHRcdFx0ZWxzZSB7ICB0Ylt0aV09ZnI7ICB0Ylt0aSsxXT1mZzsgIHRiW3RpKzJdPWZiOyAgdGJbdGkrM109ZmE7ICB9XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKG1vZGU9PTMpe1x0Ly8gY2hlY2sgaWYgY2FuIGJlIGJsZW5kZWRcblx0XHRcdFx0dmFyIGZhID0gc2Jbc2krM10sIGZyPXNiW3NpXSwgZmc9c2Jbc2krMV0sIGZiPXNiW3NpKzJdOyBcblx0XHRcdFx0dmFyIGJhID0gdGJbdGkrM10sIGJyPXRiW3RpXSwgYmc9dGJbdGkrMV0sIGJiPXRiW3RpKzJdOyBcblx0XHRcdFx0aWYoZmE9PWJhICYmIGZyPT1iciAmJiBmZz09YmcgJiYgZmI9PWJiKSBjb250aW51ZTtcblx0XHRcdFx0Ly9pZihmYSE9MjU1ICYmIGJhIT0wKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdGlmKGZhPDIyMCAmJiBiYT4yMCkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0cmV0dXJuIHRydWU7XG59XG5cblxuXG5cblVQTkcuZW5jb2RlID0gZnVuY3Rpb24oYnVmcywgdywgaCwgcHMsIGRlbHMsIHRhYnMsIGZvcmJpZFBsdGUpXG57XG5cdGlmKHBzPT1udWxsKSBwcz0wO1xuXHRpZihmb3JiaWRQbHRlPT1udWxsKSBmb3JiaWRQbHRlID0gZmFsc2U7XG5cblx0dmFyIG5pbWcgPSBVUE5HLmVuY29kZS5jb21wcmVzcyhidWZzLCB3LCBoLCBwcywgW2ZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIGZvcmJpZFBsdGVdKTtcblx0VVBORy5lbmNvZGUuY29tcHJlc3NQTkcobmltZywgLTEpO1xuXHRcblx0cmV0dXJuIFVQTkcuZW5jb2RlLl9tYWluKG5pbWcsIHcsIGgsIGRlbHMsIHRhYnMpO1xufVxuXG5VUE5HLmVuY29kZUxMID0gZnVuY3Rpb24oYnVmcywgdywgaCwgY2MsIGFjLCBkZXB0aCwgZGVscywgdGFicykge1xuXHR2YXIgbmltZyA9IHsgIGN0eXBlOiAwICsgKGNjPT0xID8gMCA6IDIpICsgKGFjPT0wID8gMCA6IDQpLCAgICAgIGRlcHRoOiBkZXB0aCwgIGZyYW1lczogW10gIH07XG5cdFxuXHR2YXIgdGltZSA9IERhdGUubm93KCk7XG5cdHZhciBiaXBwID0gKGNjK2FjKSpkZXB0aCwgYmlwbCA9IGJpcHAgKiB3O1xuXHRmb3IodmFyIGk9MDsgaTxidWZzLmxlbmd0aDsgaSsrKVxuXHRcdG5pbWcuZnJhbWVzLnB1c2goeyAgcmVjdDp7eDowLHk6MCx3aWR0aDp3LGhlaWdodDpofSwgIGltZzpuZXcgVWludDhBcnJheShidWZzW2ldKSwgYmxlbmQ6MCwgZGlzcG9zZToxLCBicHA6TWF0aC5jZWlsKGJpcHAvOCksIGJwbDpNYXRoLmNlaWwoYmlwbC84KSAgfSk7XG5cdFxuXHRVUE5HLmVuY29kZS5jb21wcmVzc1BORyhuaW1nLCAwLCB0cnVlKTtcblx0XG5cdHZhciBvdXQgPSBVUE5HLmVuY29kZS5fbWFpbihuaW1nLCB3LCBoLCBkZWxzLCB0YWJzKTtcblx0cmV0dXJuIG91dDtcbn1cblxuVVBORy5lbmNvZGUuX21haW4gPSBmdW5jdGlvbihuaW1nLCB3LCBoLCBkZWxzLCB0YWJzKSB7XG5cdGlmKHRhYnM9PW51bGwpIHRhYnM9e307XG5cdHZhciBjcmMgPSBVUE5HLmNyYy5jcmMsIHdVaSA9IFVQTkcuX2Jpbi53cml0ZVVpbnQsIHdVcyA9IFVQTkcuX2Jpbi53cml0ZVVzaG9ydCwgd0FzID0gVVBORy5fYmluLndyaXRlQVNDSUk7XG5cdHZhciBvZmZzZXQgPSA4LCBhbmltID0gbmltZy5mcmFtZXMubGVuZ3RoPjEsIHBsdEFscGhhID0gZmFsc2U7XG5cdFxuXHR2YXIgbGVuZyA9IDggKyAoMTYrNSs0KSAvKisgKDkrNCkqLyArIChhbmltID8gMjAgOiAwKTtcblx0aWYodGFic1tcInNSR0JcIl0hPW51bGwpIGxlbmcgKz0gOCsxKzQ7XG5cdGlmKHRhYnNbXCJwSFlzXCJdIT1udWxsKSBsZW5nICs9IDgrOSs0O1xuXHRpZihuaW1nLmN0eXBlPT0zKSB7XG5cdFx0dmFyIGRsID0gbmltZy5wbHRlLmxlbmd0aDtcblx0XHRmb3IodmFyIGk9MDsgaTxkbDsgaSsrKSBpZigobmltZy5wbHRlW2ldPj4+MjQpIT0yNTUpIHBsdEFscGhhID0gdHJ1ZTtcblx0XHRsZW5nICs9ICg4ICsgZGwqMyArIDQpICsgKHBsdEFscGhhID8gKDggKyBkbCoxICsgNCkgOiAwKTtcblx0fVxuXHRmb3IodmFyIGo9MDsgajxuaW1nLmZyYW1lcy5sZW5ndGg7IGorKylcblx0e1xuXHRcdHZhciBmciA9IG5pbWcuZnJhbWVzW2pdO1xuXHRcdGlmKGFuaW0pIGxlbmcgKz0gMzg7XG5cdFx0bGVuZyArPSBmci5jaW1nLmxlbmd0aCArIDEyO1xuXHRcdGlmKGohPTApIGxlbmcrPTQ7XG5cdH1cblx0bGVuZyArPSAxMjsgXG5cdFxuXHR2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KGxlbmcpO1xuXHR2YXIgd3I9WzB4ODksIDB4NTAsIDB4NGUsIDB4NDcsIDB4MGQsIDB4MGEsIDB4MWEsIDB4MGFdO1xuXHRmb3IodmFyIGk9MDsgaTw4OyBpKyspIGRhdGFbaV09d3JbaV07XG5cdFxuXHR3VWkoZGF0YSxvZmZzZXQsIDEzKTsgICAgIG9mZnNldCs9NDtcblx0d0FzKGRhdGEsb2Zmc2V0LFwiSUhEUlwiKTsgIG9mZnNldCs9NDtcblx0d1VpKGRhdGEsb2Zmc2V0LHcpOyAgb2Zmc2V0Kz00O1xuXHR3VWkoZGF0YSxvZmZzZXQsaCk7ICBvZmZzZXQrPTQ7XG5cdGRhdGFbb2Zmc2V0XSA9IG5pbWcuZGVwdGg7ICBvZmZzZXQrKzsgIC8vIGRlcHRoXG5cdGRhdGFbb2Zmc2V0XSA9IG5pbWcuY3R5cGU7ICBvZmZzZXQrKzsgIC8vIGN0eXBlXG5cdGRhdGFbb2Zmc2V0XSA9IDA7ICBvZmZzZXQrKzsgIC8vIGNvbXByZXNzXG5cdGRhdGFbb2Zmc2V0XSA9IDA7ICBvZmZzZXQrKzsgIC8vIGZpbHRlclxuXHRkYXRhW29mZnNldF0gPSAwOyAgb2Zmc2V0Kys7ICAvLyBpbnRlcmxhY2Vcblx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC0xNywxNykpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblxuXHQvLyAxMyBieXRlcyB0byBzYXksIHRoYXQgaXQgaXMgc1JHQlxuXHRpZih0YWJzW1wic1JHQlwiXSE9bnVsbCkge1xuXHRcdHdVaShkYXRhLG9mZnNldCwgMSk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdHdBcyhkYXRhLG9mZnNldCxcInNSR0JcIik7ICBvZmZzZXQrPTQ7XG5cdFx0ZGF0YVtvZmZzZXRdID0gdGFic1tcInNSR0JcIl07ICBvZmZzZXQrKztcblx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTUsNSkpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblx0fVxuXHRpZih0YWJzW1wicEhZc1wiXSE9bnVsbCkge1xuXHRcdHdVaShkYXRhLG9mZnNldCwgOSk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdHdBcyhkYXRhLG9mZnNldCxcInBIWXNcIik7ICBvZmZzZXQrPTQ7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCB0YWJzW1wicEhZc1wiXVswXSk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdHdVaShkYXRhLG9mZnNldCwgdGFic1tcInBIWXNcIl1bMV0pOyAgICAgIG9mZnNldCs9NDtcblx0XHRkYXRhW29mZnNldF09dGFic1tcInBIWXNcIl1bMl07XHRcdFx0b2Zmc2V0Kys7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC0xMywxMykpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblx0fVxuXG5cdGlmKGFuaW0pIHtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIDgpOyAgICAgIG9mZnNldCs9NDtcblx0XHR3QXMoZGF0YSxvZmZzZXQsXCJhY1RMXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdHdVaShkYXRhLG9mZnNldCwgbmltZy5mcmFtZXMubGVuZ3RoKTsgICAgIG9mZnNldCs9NDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIHRhYnNbXCJsb29wXCJdIT1udWxsP3RhYnNbXCJsb29wXCJdOjApOyAgICAgIG9mZnNldCs9NDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTEyLDEyKSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXHR9XG5cblx0aWYobmltZy5jdHlwZT09Mykge1xuXHRcdHZhciBkbCA9IG5pbWcucGx0ZS5sZW5ndGg7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCBkbCozKTsgIG9mZnNldCs9NDtcblx0XHR3QXMoZGF0YSxvZmZzZXQsXCJQTFRFXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdGZvcih2YXIgaT0wOyBpPGRsOyBpKyspe1xuXHRcdFx0dmFyIHRpPWkqMywgYz1uaW1nLnBsdGVbaV0sIHI9KGMpJjI1NSwgZz0oYz4+PjgpJjI1NSwgYj0oYz4+PjE2KSYyNTU7XG5cdFx0XHRkYXRhW29mZnNldCt0aSswXT1yOyAgZGF0YVtvZmZzZXQrdGkrMV09ZzsgIGRhdGFbb2Zmc2V0K3RpKzJdPWI7XG5cdFx0fVxuXHRcdG9mZnNldCs9ZGwqMztcblx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LWRsKjMtNCxkbCozKzQpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cblx0XHRpZihwbHRBbHBoYSkge1xuXHRcdFx0d1VpKGRhdGEsb2Zmc2V0LCBkbCk7ICBvZmZzZXQrPTQ7XG5cdFx0XHR3QXMoZGF0YSxvZmZzZXQsXCJ0Uk5TXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8ZGw7IGkrKykgIGRhdGFbb2Zmc2V0K2ldPShuaW1nLnBsdGVbaV0+Pj4yNCkmMjU1O1xuXHRcdFx0b2Zmc2V0Kz1kbDtcblx0XHRcdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtZGwtNCxkbCs0KSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXHRcdH1cblx0fVxuXHRcblx0dmFyIGZpID0gMDtcblx0Zm9yKHZhciBqPTA7IGo8bmltZy5mcmFtZXMubGVuZ3RoOyBqKyspXG5cdHtcblx0XHR2YXIgZnIgPSBuaW1nLmZyYW1lc1tqXTtcblx0XHRpZihhbmltKSB7XG5cdFx0XHR3VWkoZGF0YSwgb2Zmc2V0LCAyNik7ICAgICBvZmZzZXQrPTQ7XG5cdFx0XHR3QXMoZGF0YSwgb2Zmc2V0LFwiZmNUTFwiKTsgIG9mZnNldCs9NDtcblx0XHRcdHdVaShkYXRhLCBvZmZzZXQsIGZpKyspOyAgIG9mZnNldCs9NDtcblx0XHRcdHdVaShkYXRhLCBvZmZzZXQsIGZyLnJlY3Qud2lkdGggKTsgICBvZmZzZXQrPTQ7XG5cdFx0XHR3VWkoZGF0YSwgb2Zmc2V0LCBmci5yZWN0LmhlaWdodCk7ICAgb2Zmc2V0Kz00O1xuXHRcdFx0d1VpKGRhdGEsIG9mZnNldCwgZnIucmVjdC54KTsgICBvZmZzZXQrPTQ7XG5cdFx0XHR3VWkoZGF0YSwgb2Zmc2V0LCBmci5yZWN0LnkpOyAgIG9mZnNldCs9NDtcblx0XHRcdHdVcyhkYXRhLCBvZmZzZXQsIGRlbHNbal0pOyAgIG9mZnNldCs9Mjtcblx0XHRcdHdVcyhkYXRhLCBvZmZzZXQsICAxMDAwKTsgICBvZmZzZXQrPTI7XG5cdFx0XHRkYXRhW29mZnNldF0gPSBmci5kaXNwb3NlOyAgb2Zmc2V0Kys7XHQvLyBkaXNwb3NlXG5cdFx0XHRkYXRhW29mZnNldF0gPSBmci5ibGVuZCAgOyAgb2Zmc2V0Kys7XHQvLyBibGVuZFxuXHRcdFx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC0zMCwzMCkpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblx0XHR9XG5cdFx0XHRcdFxuXHRcdHZhciBpbWdkID0gZnIuY2ltZywgZGwgPSBpbWdkLmxlbmd0aDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIGRsKyhqPT0wPzA6NCkpOyAgICAgb2Zmc2V0Kz00O1xuXHRcdHZhciBpb2ZmID0gb2Zmc2V0O1xuXHRcdHdBcyhkYXRhLG9mZnNldCwoaj09MCk/XCJJREFUXCI6XCJmZEFUXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdGlmKGohPTApIHsgIHdVaShkYXRhLCBvZmZzZXQsIGZpKyspOyAgb2Zmc2V0Kz00OyAgfVxuXHRcdGRhdGEuc2V0KGltZ2Qsb2Zmc2V0KTtcblx0XHRvZmZzZXQgKz0gZGw7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLGlvZmYsb2Zmc2V0LWlvZmYpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cdH1cblxuXHR3VWkoZGF0YSxvZmZzZXQsIDApOyAgICAgb2Zmc2V0Kz00O1xuXHR3QXMoZGF0YSxvZmZzZXQsXCJJRU5EXCIpOyAgb2Zmc2V0Kz00O1xuXHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTQsNCkpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblxuXHRyZXR1cm4gZGF0YS5idWZmZXI7XG59XG5cblVQTkcuZW5jb2RlLmNvbXByZXNzUE5HID0gZnVuY3Rpb24ob3V0LCBmaWx0ZXIsIGxldmVsWmVybykge1xuXHRmb3IodmFyIGk9MDsgaTxvdXQuZnJhbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGZybSA9IG91dC5mcmFtZXNbaV0sIG53PWZybS5yZWN0LndpZHRoLCBuaD1mcm0ucmVjdC5oZWlnaHQ7XG5cdFx0dmFyIGZkYXRhID0gbmV3IFVpbnQ4QXJyYXkobmgqZnJtLmJwbCtuaCk7XG5cdFx0ZnJtLmNpbWcgPSBVUE5HLmVuY29kZS5fZmlsdGVyWmVybyhmcm0uaW1nLG5oLGZybS5icHAsZnJtLmJwbCxmZGF0YSwgZmlsdGVyLCBsZXZlbFplcm8pO1xuXHR9XG59XG5cblxuXG5VUE5HLmVuY29kZS5jb21wcmVzcyA9IGZ1bmN0aW9uKGJ1ZnMsIHcsIGgsIHBzLCBwcm1zKSAvLyBwcm1zOiAgb25seUJsZW5kLCBtaW5CaXRzLCBmb3JiaWRQbHRlXG57XG5cdC8vdmFyIHRpbWUgPSBEYXRlLm5vdygpO1xuXHR2YXIgb25seUJsZW5kID0gcHJtc1swXSwgZXZlbkNyZCA9IHBybXNbMV0sIGZvcmJpZFByZXYgPSBwcm1zWzJdLCBtaW5CaXRzID0gcHJtc1szXSwgZm9yYmlkUGx0ZSA9IHBybXNbNF07XG5cdFxuXHR2YXIgY3R5cGUgPSA2LCBkZXB0aCA9IDgsIGFscGhhQW5kPTI1NVxuXHRcblx0Zm9yKHZhciBqPTA7IGo8YnVmcy5sZW5ndGg7IGorKykgIHsgIC8vIHdoZW4gbm90IHF1YW50aXplZCwgb3RoZXIgZnJhbWVzIGNhbiBjb250YWluIGNvbG9ycywgdGhhdCBhcmUgbm90IGluIGFuIGluaXRpYWwgZnJhbWVcblx0XHR2YXIgaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnVmc1tqXSksIGlsZW4gPSBpbWcubGVuZ3RoO1xuXHRcdGZvcih2YXIgaT0wOyBpPGlsZW47IGkrPTQpIGFscGhhQW5kICY9IGltZ1tpKzNdO1xuXHR9XG5cdHZhciBnb3RBbHBoYSA9IChhbHBoYUFuZCE9MjU1KTtcblx0XG5cdC8vY29uc29sZS5sb2coXCJhbHBoYSBjaGVja1wiLCBEYXRlLm5vdygpLXRpbWUpOyAgdGltZSA9IERhdGUubm93KCk7XG5cdFxuXHQvL3ZhciBicnV0ZSA9IGdvdEFscGhhICYmIGZvckdJRjtcdFx0Ly8gYnJ1dGUgOiBmcmFtZXMgY2FuIG9ubHkgYmUgY29waWVkLCBub3QgXCJibGVuZGVkXCJcblx0dmFyIGZybXMgPSBVUE5HLmVuY29kZS5mcmFtaXplKGJ1ZnMsIHcsIGgsIG9ubHlCbGVuZCwgZXZlbkNyZCwgZm9yYmlkUHJldik7XG5cdC8vY29uc29sZS5sb2coXCJmcmFtaXplXCIsIERhdGUubm93KCktdGltZSk7ICB0aW1lID0gRGF0ZS5ub3coKTtcblx0XG5cdHZhciBjbWFwPXt9LCBwbHRlPVtdLCBpbmRzPVtdOyAgXG5cdFxuXHRpZihwcyE9MCkge1xuXHRcdHZhciBuYnVmcyA9IFtdOyAgZm9yKHZhciBpPTA7IGk8ZnJtcy5sZW5ndGg7IGkrKykgbmJ1ZnMucHVzaChmcm1zW2ldLmltZy5idWZmZXIpO1xuXHRcdFxuXHRcdHZhciBhYnVmID0gVVBORy5lbmNvZGUuY29uY2F0UkdCQShuYnVmcyksIHFyZXMgPSBVUE5HLnF1YW50aXplKGFidWYsIHBzKTsgIFxuXHRcdHZhciBjb2YgPSAwLCBiYiA9IG5ldyBVaW50OEFycmF5KHFyZXMuYWJ1Zik7XG5cdFx0Zm9yKHZhciBpPTA7IGk8ZnJtcy5sZW5ndGg7IGkrKykgeyAgdmFyIHRpPWZybXNbaV0uaW1nLCBibG49dGkubGVuZ3RoOyAgaW5kcy5wdXNoKG5ldyBVaW50OEFycmF5KHFyZXMuaW5kcy5idWZmZXIsIGNvZj4+MiwgYmxuPj4yKSk7XG5cdFx0XHRmb3IodmFyIGo9MDsgajxibG47IGorPTQpIHsgIHRpW2pdPWJiW2NvZitqXTsgIHRpW2orMV09YmJbY29mK2orMV07ICB0aVtqKzJdPWJiW2NvZitqKzJdOyAgdGlbaiszXT1iYltjb2YraiszXTsgIH0gICAgY29mKz1ibG47ICB9XG5cdFx0XG5cdFx0Zm9yKHZhciBpPTA7IGk8cXJlcy5wbHRlLmxlbmd0aDsgaSsrKSBwbHRlLnB1c2gocXJlcy5wbHRlW2ldLmVzdC5yZ2JhKTtcblx0XHQvL2NvbnNvbGUubG9nKFwicXVhbnRpemVcIiwgRGF0ZS5ub3coKS10aW1lKTsgIHRpbWUgPSBEYXRlLm5vdygpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIHdoYXQgaWYgcHM9PTAsIGJ1dCB0aGVyZSBhcmUgPD0yNTYgY29sb3JzPyAgd2Ugc3RpbGwgbmVlZCB0byBkZXRlY3QsIGlmIHRoZSBwYWxldHRlIGNvdWxkIGJlIHVzZWRcblx0XHRmb3IodmFyIGo9MDsgajxmcm1zLmxlbmd0aDsgaisrKSAgeyAgLy8gd2hlbiBub3QgcXVhbnRpemVkLCBvdGhlciBmcmFtZXMgY2FuIGNvbnRhaW4gY29sb3JzLCB0aGF0IGFyZSBub3QgaW4gYW4gaW5pdGlhbCBmcmFtZVxuXHRcdFx0dmFyIGZybSA9IGZybXNbal0sIGltZzMyID0gbmV3IFVpbnQzMkFycmF5KGZybS5pbWcuYnVmZmVyKSwgbnc9ZnJtLnJlY3Qud2lkdGgsIGlsZW4gPSBpbWczMi5sZW5ndGg7XG5cdFx0XHR2YXIgaW5kID0gbmV3IFVpbnQ4QXJyYXkoaWxlbik7ICBpbmRzLnB1c2goaW5kKTtcblx0XHRcdGZvcih2YXIgaT0wOyBpPGlsZW47IGkrKykge1xuXHRcdFx0XHR2YXIgYyA9IGltZzMyW2ldO1xuXHRcdFx0XHRpZiAgICAgKGkhPTAgJiYgYz09aW1nMzJbaS0gMV0pIGluZFtpXT1pbmRbaS0xXTtcblx0XHRcdFx0ZWxzZSBpZihpPm53ICYmIGM9PWltZzMyW2ktbnddKSBpbmRbaV09aW5kW2ktbnddO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR2YXIgY21jID0gY21hcFtjXTtcblx0XHRcdFx0XHRpZihjbWM9PW51bGwpIHsgIGNtYXBbY109Y21jPXBsdGUubGVuZ3RoOyAgcGx0ZS5wdXNoKGMpOyAgaWYocGx0ZS5sZW5ndGg+PTMwMCkgYnJlYWs7ICB9XG5cdFx0XHRcdFx0aW5kW2ldPWNtYztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvL2NvbnNvbGUubG9nKFwibWFrZSBwYWxldHRlXCIsIERhdGUubm93KCktdGltZSk7ICB0aW1lID0gRGF0ZS5ub3coKTtcblx0fVxuXHRcblx0dmFyIGNjPXBsdGUubGVuZ3RoOyAvL2NvbnNvbGUubG9nKFwiY29sb3JzOlwiLGNjKTtcblx0aWYoY2M8PTI1NiAmJiBmb3JiaWRQbHRlPT1mYWxzZSkge1xuXHRcdGlmKGNjPD0gMikgZGVwdGg9MTsgIGVsc2UgaWYoY2M8PSA0KSBkZXB0aD0yOyAgZWxzZSBpZihjYzw9MTYpIGRlcHRoPTQ7ICBlbHNlIGRlcHRoPTg7XG5cdFx0ZGVwdGggPSAgTWF0aC5tYXgoZGVwdGgsIG1pbkJpdHMpO1xuXHR9XG5cdFxuXHRmb3IodmFyIGo9MDsgajxmcm1zLmxlbmd0aDsgaisrKVxuXHR7XG5cdFx0dmFyIGZybSA9IGZybXNbal0sIG54PWZybS5yZWN0LngsIG55PWZybS5yZWN0LnksIG53PWZybS5yZWN0LndpZHRoLCBuaD1mcm0ucmVjdC5oZWlnaHQ7XG5cdFx0dmFyIGNpbWcgPSBmcm0uaW1nLCBjaW1nMzIgPSBuZXcgVWludDMyQXJyYXkoY2ltZy5idWZmZXIpO1xuXHRcdHZhciBicGwgPSA0Km53LCBicHA9NDtcblx0XHRpZihjYzw9MjU2ICYmIGZvcmJpZFBsdGU9PWZhbHNlKSB7XG5cdFx0XHRicGwgPSBNYXRoLmNlaWwoZGVwdGgqbncvOCk7XG5cdFx0XHR2YXIgbmltZyA9IG5ldyBVaW50OEFycmF5KGJwbCpuaCk7XG5cdFx0XHR2YXIgaW5qID0gaW5kc1tqXTtcblx0XHRcdGZvcih2YXIgeT0wOyB5PG5oOyB5KyspIHsgIHZhciBpPXkqYnBsLCBpaT15Km53O1xuXHRcdFx0XHRpZiAgICAgKGRlcHRoPT04KSBmb3IodmFyIHg9MDsgeDxudzsgeCsrKSBuaW1nW2krKHgpICAgXSAgID0gIChpbmpbaWkreF0gICAgICAgICAgICAgKTtcblx0XHRcdFx0ZWxzZSBpZihkZXB0aD09NCkgZm9yKHZhciB4PTA7IHg8bnc7IHgrKykgbmltZ1tpKyh4Pj4xKV0gIHw9ICAoaW5qW2lpK3hdPDwoNC0oeCYxKSo0KSk7XG5cdFx0XHRcdGVsc2UgaWYoZGVwdGg9PTIpIGZvcih2YXIgeD0wOyB4PG53OyB4KyspIG5pbWdbaSsoeD4+MildICB8PSAgKGlualtpaSt4XTw8KDYtKHgmMykqMikpO1xuXHRcdFx0XHRlbHNlIGlmKGRlcHRoPT0xKSBmb3IodmFyIHg9MDsgeDxudzsgeCsrKSBuaW1nW2krKHg+PjMpXSAgfD0gIChpbmpbaWkreF08PCg3LSh4JjcpKjEpKTtcblx0XHRcdH1cblx0XHRcdGNpbWc9bmltZzsgIGN0eXBlPTM7ICBicHA9MTtcblx0XHR9XG5cdFx0ZWxzZSBpZihnb3RBbHBoYT09ZmFsc2UgJiYgZnJtcy5sZW5ndGg9PTEpIHtcdC8vIHNvbWUgbmV4dCBcInJlZHVjZWRcIiBmcmFtZXMgbWF5IGNvbnRhaW4gYWxwaGEgZm9yIGJsZW5kaW5nXG5cdFx0XHR2YXIgbmltZyA9IG5ldyBVaW50OEFycmF5KG53Km5oKjMpLCBhcmVhPW53Km5oO1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7IHZhciB0aT1pKjMsIHFpPWkqNDsgIG5pbWdbdGldPWNpbWdbcWldOyAgbmltZ1t0aSsxXT1jaW1nW3FpKzFdOyAgbmltZ1t0aSsyXT1jaW1nW3FpKzJdOyAgfVxuXHRcdFx0Y2ltZz1uaW1nOyAgY3R5cGU9MjsgIGJwcD0zOyAgYnBsPTMqbnc7XG5cdFx0fVxuXHRcdGZybS5pbWc9Y2ltZzsgIGZybS5icGw9YnBsOyAgZnJtLmJwcD1icHA7XG5cdH1cblx0Ly9jb25zb2xlLmxvZyhcImNvbG9ycyA9PiBwYWxldHRlIGluZGljZXNcIiwgRGF0ZS5ub3coKS10aW1lKTsgIHRpbWUgPSBEYXRlLm5vdygpO1xuXHRcblx0cmV0dXJuIHtjdHlwZTpjdHlwZSwgZGVwdGg6ZGVwdGgsIHBsdGU6cGx0ZSwgZnJhbWVzOmZybXMgIH07XG59XG5VUE5HLmVuY29kZS5mcmFtaXplID0gZnVuY3Rpb24oYnVmcyx3LGgsYWx3YXlzQmxlbmQsZXZlbkNyZCxmb3JiaWRQcmV2KSB7XG5cdC8qICBESVNQT1NFXG5cdCAgICAtIDAgOiBubyBjaGFuZ2Vcblx0XHQtIDEgOiBjbGVhciB0byB0cmFuc3BhcmVudFxuXHRcdC0gMiA6IHJldHN0b3JlIHRvIGNvbnRlbnQgYmVmb3JlIHJlbmRlcmluZyAocHJldmlvdXMgZnJhbWUgZGlzcG9zZWQpXG5cdFx0QkxFTkRcblx0XHQtIDAgOiByZXBsYWNlXG5cdFx0LSAxIDogYmxlbmRcblx0Ki9cblx0dmFyIGZybXMgPSBbXTtcblx0Zm9yKHZhciBqPTA7IGo8YnVmcy5sZW5ndGg7IGorKykge1xuXHRcdHZhciBjaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnVmc1tqXSksIGNpbWczMiA9IG5ldyBVaW50MzJBcnJheShjaW1nLmJ1ZmZlcik7XG5cdFx0dmFyIG5pbWc7XG5cdFx0XG5cdFx0dmFyIG54PTAsIG55PTAsIG53PXcsIG5oPWgsIGJsZW5kPWFsd2F5c0JsZW5kPzE6MDtcblx0XHRpZihqIT0wKSB7XG5cdFx0XHR2YXIgdGxpbSA9IChmb3JiaWRQcmV2IHx8IGFsd2F5c0JsZW5kIHx8IGo9PTEgfHwgZnJtc1tqLTJdLmRpc3Bvc2UhPTApPzE6MiwgdHN0cCA9IDAsIHRhcmVhID0gMWU5O1xuXHRcdFx0Zm9yKHZhciBpdD0wOyBpdDx0bGltOyBpdCsrKVxuXHRcdFx0e1xuXHRcdFx0XHR2YXIgcGltZyA9IG5ldyBVaW50OEFycmF5KGJ1ZnNbai0xLWl0XSksIHAzMiA9IG5ldyBVaW50MzJBcnJheShidWZzW2otMS1pdF0pO1xuXHRcdFx0XHR2YXIgbWl4PXcsbWl5PWgsbWF4PS0xLG1heT0tMTtcblx0XHRcdFx0Zm9yKHZhciB5PTA7IHk8aDsgeSsrKSBmb3IodmFyIHg9MDsgeDx3OyB4KyspIHtcblx0XHRcdFx0XHR2YXIgaSA9IHkqdyt4O1xuXHRcdFx0XHRcdGlmKGNpbWczMltpXSE9cDMyW2ldKSB7XG5cdFx0XHRcdFx0XHRpZih4PG1peCkgbWl4PXg7ICBpZih4Pm1heCkgbWF4PXg7XG5cdFx0XHRcdFx0XHRpZih5PG1peSkgbWl5PXk7ICBpZih5Pm1heSkgbWF5PXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKG1heD09LTEpIG1peD1taXk9bWF4PW1heT0wO1xuXHRcdFx0XHRpZihldmVuQ3JkKSB7ICBpZigobWl4JjEpPT0xKW1peC0tOyAgaWYoKG1peSYxKT09MSltaXktLTsgIH1cblx0XHRcdFx0dmFyIHNhcmVhID0gKG1heC1taXgrMSkqKG1heS1taXkrMSk7XG5cdFx0XHRcdGlmKHNhcmVhPHRhcmVhKSB7XG5cdFx0XHRcdFx0dGFyZWEgPSBzYXJlYTsgIHRzdHAgPSBpdDtcblx0XHRcdFx0XHRueCA9IG1peDsgbnkgPSBtaXk7IG53ID0gbWF4LW1peCsxOyBuaCA9IG1heS1taXkrMTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHQvLyBhbHdheXNCbGVuZDogcG9rdWQgemppc3TDrW0sIMW+ZSBibGVuZGl0IG5lbHplLCBuYXN0YXbDrW0gcMWZZWRjaG96w61tdSBzbsOtbWt1IGRpc3Bvc2U9MS4gWmFqaXN0w61tLCBhYnkgb2JzYWhvdmFsIG3Fr2ogb2Jkw6lsbsOtay5cblx0XHRcdHZhciBwaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnVmc1tqLTEtdHN0cF0pO1xuXHRcdFx0aWYodHN0cD09MSkgZnJtc1tqLTFdLmRpc3Bvc2UgPSAyO1xuXHRcdFx0XG5cdFx0XHRuaW1nID0gbmV3IFVpbnQ4QXJyYXkobncqbmgqNCk7XG5cdFx0XHRVUE5HLl9jb3B5VGlsZShwaW1nLHcsaCwgbmltZyxudyxuaCwgLW54LC1ueSwgMCk7XG5cdFx0XHRcblx0XHRcdGJsZW5kID0gIFVQTkcuX2NvcHlUaWxlKGNpbWcsdyxoLCBuaW1nLG53LG5oLCAtbngsLW55LCAzKSA/IDEgOiAwO1xuXHRcdFx0aWYoYmxlbmQ9PTEpIFVQTkcuZW5jb2RlLl9wcmVwYXJlRGlmZihjaW1nLHcsaCxuaW1nLHt4Om54LHk6bnksd2lkdGg6bncsaGVpZ2h0Om5ofSk7XG5cdFx0XHRlbHNlICAgICAgICAgVVBORy5fY29weVRpbGUoY2ltZyx3LGgsIG5pbWcsbncsbmgsIC1ueCwtbnksIDApO1xuXHRcdFx0Ly9VUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgbmltZyxudyxuaCwgLW54LC1ueSwgYmxlbmQ9PTE/MjowKTtcblx0XHR9XG5cdFx0ZWxzZSBuaW1nID0gY2ltZy5zbGljZSgwKTtcdC8vIGltZyBtYXkgYmUgcmV3cml0dGVuIGZ1cnRoZXIgLi4uIGRvbid0IHJld3JpdGUgaW5wdXRcblx0XHRcblx0XHRmcm1zLnB1c2goe3JlY3Q6e3g6bngseTpueSx3aWR0aDpudyxoZWlnaHQ6bmh9LCBpbWc6bmltZywgYmxlbmQ6YmxlbmQsIGRpc3Bvc2U6MH0pO1xuXHR9XG5cdFxuXHRcblx0aWYoYWx3YXlzQmxlbmQpIGZvcih2YXIgaj0wOyBqPGZybXMubGVuZ3RoOyBqKyspIHtcblx0XHR2YXIgZnJtID0gZnJtc1tqXTsgIGlmKGZybS5ibGVuZD09MSkgY29udGludWU7XG5cdFx0dmFyIHIwID0gZnJtLnJlY3QsIHIxID0gZnJtc1tqLTFdLnJlY3Rcblx0XHR2YXIgbWlYID0gTWF0aC5taW4ocjAueCwgcjEueCksIG1pWSA9IE1hdGgubWluKHIwLnksIHIxLnkpO1xuXHRcdHZhciBtYVggPSBNYXRoLm1heChyMC54K3IwLndpZHRoLCByMS54K3IxLndpZHRoKSwgbWFZID0gTWF0aC5tYXgocjAueStyMC5oZWlnaHQsIHIxLnkrcjEuaGVpZ2h0KTtcblx0XHR2YXIgciA9IHt4Om1pWCwgeTptaVksIHdpZHRoOm1hWC1taVgsIGhlaWdodDptYVktbWlZfTtcblx0XHRcblx0XHRmcm1zW2otMV0uZGlzcG9zZSA9IDE7XG5cdFx0aWYoai0xIT0wKSBcblx0XHRVUE5HLmVuY29kZS5fdXBkYXRlRnJhbWUoYnVmcywgdyxoLGZybXMsIGotMSxyLCBldmVuQ3JkKTtcblx0XHRVUE5HLmVuY29kZS5fdXBkYXRlRnJhbWUoYnVmcywgdyxoLGZybXMsIGogICxyLCBldmVuQ3JkKTtcblx0fVxuXHR2YXIgYXJlYSA9IDA7XG5cdGlmKGJ1ZnMubGVuZ3RoIT0xKSBmb3IodmFyIGk9MDsgaTxmcm1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGZybSA9IGZybXNbaV07XG5cdFx0YXJlYSArPSBmcm0ucmVjdC53aWR0aCpmcm0ucmVjdC5oZWlnaHQ7XG5cdFx0Ly9pZihpPT0wIHx8IGZybS5ibGVuZCE9MSkgY29udGludWU7XG5cdFx0Ly92YXIgb2IgPSBuZXcgVWludDhBcnJheShcblx0XHQvL2NvbnNvbGUubG9nKGZybS5ibGVuZCwgZnJtLmRpc3Bvc2UsIGZybS5yZWN0KTtcblx0fVxuXHQvL2lmKGFyZWEhPTApIGNvbnNvbGUubG9nKGFyZWEpO1xuXHRyZXR1cm4gZnJtcztcbn1cblVQTkcuZW5jb2RlLl91cGRhdGVGcmFtZSA9IGZ1bmN0aW9uKGJ1ZnMsIHcsaCwgZnJtcywgaSwgciwgZXZlbkNyZCkge1xuXHR2YXIgVTggPSBVaW50OEFycmF5LCBVMzIgPSBVaW50MzJBcnJheTtcblx0dmFyIHBpbWcgPSBuZXcgVTgoYnVmc1tpLTFdKSwgcGltZzMyID0gbmV3IFUzMihidWZzW2ktMV0pLCBuaW1nID0gaSsxPGJ1ZnMubGVuZ3RoID8gbmV3IFU4KGJ1ZnNbaSsxXSk6bnVsbDtcblx0dmFyIGNpbWcgPSBuZXcgVTgoYnVmc1tpXSksIGNpbWczMiA9IG5ldyBVMzIoY2ltZy5idWZmZXIpO1xuXHRcblx0dmFyIG1peD13LG1peT1oLG1heD0tMSxtYXk9LTE7XG5cdGZvcih2YXIgeT0wOyB5PHIuaGVpZ2h0OyB5KyspIGZvcih2YXIgeD0wOyB4PHIud2lkdGg7IHgrKykge1xuXHRcdHZhciBjeCA9IHIueCt4LCBjeSA9IHIueSt5O1xuXHRcdHZhciBqID0gY3kqdytjeCwgY2MgPSBjaW1nMzJbal07XG5cdFx0Ly8gbm8gbmVlZCB0byBkcmF3IHRyYW5zcGFyZW5jeSwgb3IgdG8gZGlzcG9zZSBpdC4gT3IsIGlmIHdyaXRpbmcgdGhlIHNhbWUgY29sb3IgYW5kIHRoZSBuZXh0IG9uZSBkb2VzIG5vdCBuZWVkIHRyYW5zcGFyZW5jeS5cblx0XHRpZihjYz09MCB8fCAoZnJtc1tpLTFdLmRpc3Bvc2U9PTAgJiYgcGltZzMyW2pdPT1jYyAmJiAobmltZz09bnVsbCB8fCBuaW1nW2oqNCszXSE9MCkpLyoqLykge31cblx0XHRlbHNlIHtcblx0XHRcdGlmKGN4PG1peCkgbWl4PWN4OyAgaWYoY3g+bWF4KSBtYXg9Y3g7XG5cdFx0XHRpZihjeTxtaXkpIG1peT1jeTsgIGlmKGN5Pm1heSkgbWF5PWN5O1xuXHRcdH1cblx0fVxuXHRpZihtYXg9PS0xKSBtaXg9bWl5PW1heD1tYXk9MDtcblx0aWYoZXZlbkNyZCkgeyAgaWYoKG1peCYxKT09MSltaXgtLTsgIGlmKChtaXkmMSk9PTEpbWl5LS07ICB9XG5cdHIgPSB7eDptaXgsIHk6bWl5LCB3aWR0aDptYXgtbWl4KzEsIGhlaWdodDptYXktbWl5KzF9O1xuXHRcblx0dmFyIGZyID0gZnJtc1tpXTsgIGZyLnJlY3QgPSByOyAgZnIuYmxlbmQgPSAxOyAgZnIuaW1nID0gbmV3IFVpbnQ4QXJyYXkoci53aWR0aCpyLmhlaWdodCo0KTtcblx0aWYoZnJtc1tpLTFdLmRpc3Bvc2U9PTApIHtcblx0XHRVUE5HLl9jb3B5VGlsZShwaW1nLHcsaCwgZnIuaW1nLHIud2lkdGgsci5oZWlnaHQsIC1yLngsLXIueSwgMCk7XG5cdFx0VVBORy5lbmNvZGUuX3ByZXBhcmVEaWZmKGNpbWcsdyxoLGZyLmltZyxyKTtcblx0XHQvL1VQTkcuX2NvcHlUaWxlKGNpbWcsdyxoLCBmci5pbWcsci53aWR0aCxyLmhlaWdodCwgLXIueCwtci55LCAyKTtcblx0fVxuXHRlbHNlXG5cdFx0VVBORy5fY29weVRpbGUoY2ltZyx3LGgsIGZyLmltZyxyLndpZHRoLHIuaGVpZ2h0LCAtci54LC1yLnksIDApO1xufVxuVVBORy5lbmNvZGUuX3ByZXBhcmVEaWZmID0gZnVuY3Rpb24oY2ltZywgdyxoLCBuaW1nLCByZWMpIHtcblx0VVBORy5fY29weVRpbGUoY2ltZyx3LGgsIG5pbWcscmVjLndpZHRoLHJlYy5oZWlnaHQsIC1yZWMueCwtcmVjLnksIDIpO1xuXHQvKlxuXHR2YXIgbjMyID0gbmV3IFVpbnQzMkFycmF5KG5pbWcuYnVmZmVyKTtcblx0dmFyIG9nID0gbmV3IFVpbnQ4QXJyYXkocmVjLndpZHRoKnJlYy5oZWlnaHQqNCksIG8zMiA9IG5ldyBVaW50MzJBcnJheShvZy5idWZmZXIpO1xuXHRVUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgb2cscmVjLndpZHRoLHJlYy5oZWlnaHQsIC1yZWMueCwtcmVjLnksIDApO1xuXHRmb3IodmFyIGk9NDsgaTxuaW1nLmxlbmd0aDsgaSs9NCkge1xuXHRcdGlmKG5pbWdbaS0xXSE9MCAmJiBuaW1nW2krM109PTAgJiYgbzMyW2k+Pj4yXT09bzMyWyhpPj4+MiktMV0pIHtcblx0XHRcdG4zMltpPj4+Ml09bzMyW2k+Pj4yXTtcblx0XHRcdC8vdmFyIGogPSBpLCBjPXAzMlsoaT4+PjIpLTFdO1xuXHRcdFx0Ly93aGlsZShwMzJbaj4+PjJdPT1jKSB7ICBuMzJbaj4+PjJdPWM7ICBqKz00OyAgfVxuXHRcdH1cblx0fVxuXHRmb3IodmFyIGk9bmltZy5sZW5ndGgtODsgaT4wOyBpLT00KSB7XG5cdFx0aWYobmltZ1tpKzddIT0wICYmIG5pbWdbaSszXT09MCAmJiBvMzJbaT4+PjJdPT1vMzJbKGk+Pj4yKSsxXSkge1xuXHRcdFx0bjMyW2k+Pj4yXT1vMzJbaT4+PjJdO1xuXHRcdFx0Ly92YXIgaiA9IGksIGM9cDMyWyhpPj4+MiktMV07XG5cdFx0XHQvL3doaWxlKHAzMltqPj4+Ml09PWMpIHsgIG4zMltqPj4+Ml09YzsgIGorPTQ7ICB9XG5cdFx0fVxuXHR9Ki9cbn1cblxuVVBORy5lbmNvZGUuX2ZpbHRlclplcm8gPSBmdW5jdGlvbihpbWcsaCxicHAsYnBsLGRhdGEsIGZpbHRlciwgbGV2ZWxaZXJvKVxue1xuXHR2YXIgZmxzID0gW10sIGZ0cnk9WzAsMSwyLDMsNF07XG5cdGlmICAgICAoZmlsdGVyIT0tMSkgICAgICAgICAgICAgZnRyeT1bZmlsdGVyXTtcblx0ZWxzZSBpZihoKmJwbD41MDAwMDAgfHwgYnBwPT0xKSBmdHJ5PVswXTtcblx0dmFyIG9wdHM7ICBpZihsZXZlbFplcm8pIG9wdHM9e2xldmVsOjB9O1xuXHRcblx0dmFyIENNUFIgPSAobGV2ZWxaZXJvICYmIFVaSVAhPW51bGwpID8gVVpJUCA6IHBha287XG5cdFxuXHRmb3IodmFyIGk9MDsgaTxmdHJ5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0Zm9yKHZhciB5PTA7IHk8aDsgeSsrKSBVUE5HLmVuY29kZS5fZmlsdGVyTGluZShkYXRhLCBpbWcsIHksIGJwbCwgYnBwLCBmdHJ5W2ldKTtcblx0XHQvL3ZhciBuaW1nID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuXHRcdC8vdmFyIHN6ID0gVVpJUC5GLmRlZmxhdGUoZGF0YSwgbmltZyk7ICBmbHMucHVzaChuaW1nLnNsaWNlKDAsc3opKTtcblx0XHQvL3ZhciBkZmwgPSBwYWtvW1wiZGVmbGF0ZVwiXShkYXRhKSwgZGw9ZGZsLmxlbmd0aC00O1xuXHRcdC8vdmFyIGNyYyA9IChkZmxbZGwrM108PDI0KXwoZGZsW2RsKzJdPDwxNil8KGRmbFtkbCsxXTw8OCl8KGRmbFtkbCswXTw8MCk7XG5cdFx0Ly9jb25zb2xlLmxvZyhjcmMsIFVaSVAuYWRsZXIoZGF0YSwyLGRhdGEubGVuZ3RoLTYpKTtcblx0XHRmbHMucHVzaChDTVBSW1wiZGVmbGF0ZVwiXShkYXRhLG9wdHMpKTtcblx0fVxuXHR2YXIgdGksIHRzaXplPTFlOTtcblx0Zm9yKHZhciBpPTA7IGk8ZmxzLmxlbmd0aDsgaSsrKSBpZihmbHNbaV0ubGVuZ3RoPHRzaXplKSB7ICB0aT1pOyAgdHNpemU9ZmxzW2ldLmxlbmd0aDsgIH1cblx0cmV0dXJuIGZsc1t0aV07XG59XG5VUE5HLmVuY29kZS5fZmlsdGVyTGluZSA9IGZ1bmN0aW9uKGRhdGEsIGltZywgeSwgYnBsLCBicHAsIHR5cGUpXG57XG5cdHZhciBpID0geSpicGwsIGRpID0gaSt5LCBwYWV0aCA9IFVQTkcuZGVjb2RlLl9wYWV0aFxuXHRkYXRhW2RpXT10eXBlOyAgZGkrKztcblxuXHRpZih0eXBlPT0wKSB7XG5cdFx0aWYoYnBsPDUwMCkgZm9yKHZhciB4PTA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSBpbWdbaSt4XTtcblx0XHRlbHNlIGRhdGEuc2V0KG5ldyBVaW50OEFycmF5KGltZy5idWZmZXIsaSxicGwpLGRpKTtcblx0fVxuXHRlbHNlIGlmKHR5cGU9PTEpIHtcblx0XHRmb3IodmFyIHg9ICAwOyB4PGJwcDsgeCsrKSBkYXRhW2RpK3hdID0gIGltZ1tpK3hdO1xuXHRcdGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0taW1nW2kreC1icHBdKzI1NikmMjU1O1xuXHR9XG5cdGVsc2UgaWYoeT09MCkge1xuXHRcdGZvcih2YXIgeD0gIDA7IHg8YnBwOyB4KyspIGRhdGFbZGkreF0gPSBpbWdbaSt4XTtcblxuXHRcdGlmKHR5cGU9PTIpIGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSBpbWdbaSt4XTtcblx0XHRpZih0eXBlPT0zKSBmb3IodmFyIHg9YnBwOyB4PGJwbDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdIC0gKGltZ1tpK3gtYnBwXT4+MSkgKzI1NikmMjU1O1xuXHRcdGlmKHR5cGU9PTQpIGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0gLSBwYWV0aChpbWdbaSt4LWJwcF0sIDAsIDApICsyNTYpJjI1NTtcblx0fVxuXHRlbHNlIHtcblx0XHRpZih0eXBlPT0yKSB7IGZvcih2YXIgeD0gIDA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0rMjU2IC0gaW1nW2kreC1icGxdKSYyNTU7ICB9XG5cdFx0aWYodHlwZT09MykgeyBmb3IodmFyIHg9ICAwOyB4PGJwcDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdKzI1NiAtIChpbWdbaSt4LWJwbF0+PjEpKSYyNTU7XG5cdFx0XHRcdFx0ICBmb3IodmFyIHg9YnBwOyB4PGJwbDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdKzI1NiAtICgoaW1nW2kreC1icGxdK2ltZ1tpK3gtYnBwXSk+PjEpKSYyNTU7ICB9XG5cdFx0aWYodHlwZT09NCkgeyBmb3IodmFyIHg9ICAwOyB4PGJwcDsgeCsrKSBkYXRhW2RpK3hdID0gKGltZ1tpK3hdKzI1NiAtIHBhZXRoKDAsIGltZ1tpK3gtYnBsXSwgMCkpJjI1NTtcblx0XHRcdFx0XHQgIGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0rMjU2IC0gcGFldGgoaW1nW2kreC1icHBdLCBpbWdbaSt4LWJwbF0sIGltZ1tpK3gtYnBwLWJwbF0pKSYyNTU7ICB9XG5cdH1cbn1cblxuVVBORy5jcmMgPSB7XG5cdHRhYmxlIDogKCBmdW5jdGlvbigpIHtcblx0ICAgdmFyIHRhYiA9IG5ldyBVaW50MzJBcnJheSgyNTYpO1xuXHQgICBmb3IgKHZhciBuPTA7IG48MjU2OyBuKyspIHtcblx0XHRcdHZhciBjID0gbjtcblx0XHRcdGZvciAodmFyIGs9MDsgazw4OyBrKyspIHtcblx0XHRcdFx0aWYgKGMgJiAxKSAgYyA9IDB4ZWRiODgzMjAgXiAoYyA+Pj4gMSk7XG5cdFx0XHRcdGVsc2UgICAgICAgIGMgPSBjID4+PiAxO1xuXHRcdFx0fVxuXHRcdFx0dGFiW25dID0gYzsgIH1cblx0XHRyZXR1cm4gdGFiOyAgfSkoKSxcblx0dXBkYXRlIDogZnVuY3Rpb24oYywgYnVmLCBvZmYsIGxlbikge1xuXHRcdGZvciAodmFyIGk9MDsgaTxsZW47IGkrKykgIGMgPSBVUE5HLmNyYy50YWJsZVsoYyBeIGJ1ZltvZmYraV0pICYgMHhmZl0gXiAoYyA+Pj4gOCk7XG5cdFx0cmV0dXJuIGM7XG5cdH0sXG5cdGNyYyA6IGZ1bmN0aW9uKGIsbyxsKSAgeyAgcmV0dXJuIFVQTkcuY3JjLnVwZGF0ZSgweGZmZmZmZmZmLGIsbyxsKSBeIDB4ZmZmZmZmZmY7ICB9XG59XG5cblxuVVBORy5xdWFudGl6ZSA9IGZ1bmN0aW9uKGFidWYsIHBzKVxue1x0XG5cdHZhciBvaW1nID0gbmV3IFVpbnQ4QXJyYXkoYWJ1ZiksIG5pbWcgPSBvaW1nLnNsaWNlKDApLCBuaW1nMzIgPSBuZXcgVWludDMyQXJyYXkobmltZy5idWZmZXIpO1xuXHRcblx0dmFyIEtEID0gVVBORy5xdWFudGl6ZS5nZXRLRHRyZWUobmltZywgcHMpO1xuXHR2YXIgcm9vdCA9IEtEWzBdLCBsZWFmcyA9IEtEWzFdO1xuXHRcblx0dmFyIHBsYW5lRHN0ID0gVVBORy5xdWFudGl6ZS5wbGFuZURzdDtcblx0dmFyIHNiID0gb2ltZywgdGIgPSBuaW1nMzIsIGxlbj1zYi5sZW5ndGg7XG5cdFx0XG5cdHZhciBpbmRzID0gbmV3IFVpbnQ4QXJyYXkob2ltZy5sZW5ndGg+PjIpO1xuXHRmb3IodmFyIGk9MDsgaTxsZW47IGkrPTQpIHtcblx0XHR2YXIgcj1zYltpXSooMS8yNTUpLCBnPXNiW2krMV0qKDEvMjU1KSwgYj1zYltpKzJdKigxLzI1NSksIGE9c2JbaSszXSooMS8yNTUpO1xuXHRcdFxuXHRcdC8vICBleGFjdCwgYnV0IHRvbyBzbG93IDooXG5cdFx0dmFyIG5kID0gVVBORy5xdWFudGl6ZS5nZXROZWFyZXN0KHJvb3QsIHIsIGcsIGIsIGEpO1xuXHRcdC8vdmFyIG5kID0gcm9vdDtcblx0XHQvL3doaWxlKG5kLmxlZnQpIG5kID0gKHBsYW5lRHN0KG5kLmVzdCxyLGcsYixhKTw9MCkgPyBuZC5sZWZ0IDogbmQucmlnaHQ7XG5cdFx0XG5cdFx0aW5kc1tpPj4yXSA9IG5kLmluZDtcblx0XHR0YltpPj4yXSA9IG5kLmVzdC5yZ2JhO1xuXHR9XG5cdHJldHVybiB7ICBhYnVmOm5pbWcuYnVmZmVyLCBpbmRzOmluZHMsIHBsdGU6bGVhZnMgIH07XG59XG5cblVQTkcucXVhbnRpemUuZ2V0S0R0cmVlID0gZnVuY3Rpb24obmltZywgcHMsIGVycikge1xuXHRpZihlcnI9PW51bGwpIGVyciA9IDAuMDAwMTtcblx0dmFyIG5pbWczMiA9IG5ldyBVaW50MzJBcnJheShuaW1nLmJ1ZmZlcik7XG5cdFxuXHR2YXIgcm9vdCA9IHtpMDowLCBpMTpuaW1nLmxlbmd0aCwgYnN0Om51bGwsIGVzdDpudWxsLCB0ZHN0OjAsIGxlZnQ6bnVsbCwgcmlnaHQ6bnVsbCB9OyAgLy8gYmFzaWMgc3RhdGlzdGljLCBleHRyYSBzdGF0aXN0aWNcblx0cm9vdC5ic3QgPSBVUE5HLnF1YW50aXplLnN0YXRzKCAgbmltZyxyb290LmkwLCByb290LmkxICApOyAgcm9vdC5lc3QgPSBVUE5HLnF1YW50aXplLmVzdGF0cyggcm9vdC5ic3QgKTtcblx0dmFyIGxlYWZzID0gW3Jvb3RdO1xuXHRcblx0d2hpbGUobGVhZnMubGVuZ3RoPHBzKVxuXHR7XG5cdFx0dmFyIG1heEwgPSAwLCBtaT0wO1xuXHRcdGZvcih2YXIgaT0wOyBpPGxlYWZzLmxlbmd0aDsgaSsrKSBpZihsZWFmc1tpXS5lc3QuTCA+IG1heEwpIHsgIG1heEw9bGVhZnNbaV0uZXN0Lkw7ICBtaT1pOyAgfVxuXHRcdGlmKG1heEw8ZXJyKSBicmVhaztcblx0XHR2YXIgbm9kZSA9IGxlYWZzW21pXTtcblx0XHRcblx0XHR2YXIgczAgPSBVUE5HLnF1YW50aXplLnNwbGl0UGl4ZWxzKG5pbWcsbmltZzMyLCBub2RlLmkwLCBub2RlLmkxLCBub2RlLmVzdC5lLCBub2RlLmVzdC5lTXEyNTUpO1xuXHRcdHZhciBzMHdyb25nID0gKG5vZGUuaTA+PXMwIHx8IG5vZGUuaTE8PXMwKTtcblx0XHQvL2NvbnNvbGUubG9nKG1heEwsIGxlYWZzLmxlbmd0aCwgbWkpO1xuXHRcdGlmKHMwd3JvbmcpIHsgIG5vZGUuZXN0Lkw9MDsgIGNvbnRpbnVlOyAgfVxuXHRcdFxuXHRcdFxuXHRcdHZhciBsbiA9IHtpMDpub2RlLmkwLCBpMTpzMCwgYnN0Om51bGwsIGVzdDpudWxsLCB0ZHN0OjAsIGxlZnQ6bnVsbCwgcmlnaHQ6bnVsbCB9OyAgbG4uYnN0ID0gVVBORy5xdWFudGl6ZS5zdGF0cyggbmltZywgbG4uaTAsIGxuLmkxICk7ICBcblx0XHRsbi5lc3QgPSBVUE5HLnF1YW50aXplLmVzdGF0cyggbG4uYnN0ICk7XG5cdFx0dmFyIHJuID0ge2kwOnMwLCBpMTpub2RlLmkxLCBic3Q6bnVsbCwgZXN0Om51bGwsIHRkc3Q6MCwgbGVmdDpudWxsLCByaWdodDpudWxsIH07ICBybi5ic3QgPSB7UjpbXSwgbTpbXSwgTjpub2RlLmJzdC5OLWxuLmJzdC5OfTtcblx0XHRmb3IodmFyIGk9MDsgaTwxNjsgaSsrKSBybi5ic3QuUltpXSA9IG5vZGUuYnN0LlJbaV0tbG4uYnN0LlJbaV07XG5cdFx0Zm9yKHZhciBpPTA7IGk8IDQ7IGkrKykgcm4uYnN0Lm1baV0gPSBub2RlLmJzdC5tW2ldLWxuLmJzdC5tW2ldO1xuXHRcdHJuLmVzdCA9IFVQTkcucXVhbnRpemUuZXN0YXRzKCBybi5ic3QgKTtcblx0XHRcblx0XHRub2RlLmxlZnQgPSBsbjsgIG5vZGUucmlnaHQgPSBybjtcblx0XHRsZWFmc1ttaV09bG47ICBsZWFmcy5wdXNoKHJuKTtcblx0fVxuXHRsZWFmcy5zb3J0KGZ1bmN0aW9uKGEsYikgeyAgcmV0dXJuIGIuYnN0Lk4tYS5ic3QuTjsgIH0pO1xuXHRmb3IodmFyIGk9MDsgaTxsZWFmcy5sZW5ndGg7IGkrKykgbGVhZnNbaV0uaW5kPWk7XG5cdHJldHVybiBbcm9vdCwgbGVhZnNdO1xufVxuXG5VUE5HLnF1YW50aXplLmdldE5lYXJlc3QgPSBmdW5jdGlvbihuZCwgcixnLGIsYSlcbntcblx0aWYobmQubGVmdD09bnVsbCkgeyAgbmQudGRzdCA9IFVQTkcucXVhbnRpemUuZGlzdChuZC5lc3QucSxyLGcsYixhKTsgIHJldHVybiBuZDsgIH1cblx0dmFyIHBsYW5lRHN0ID0gVVBORy5xdWFudGl6ZS5wbGFuZURzdChuZC5lc3QscixnLGIsYSk7XG5cdFxuXHR2YXIgbm9kZTAgPSBuZC5sZWZ0LCBub2RlMSA9IG5kLnJpZ2h0O1xuXHRpZihwbGFuZURzdD4wKSB7ICBub2RlMD1uZC5yaWdodDsgIG5vZGUxPW5kLmxlZnQ7ICB9XG5cdFxuXHR2YXIgbG4gPSBVUE5HLnF1YW50aXplLmdldE5lYXJlc3Qobm9kZTAsIHIsZyxiLGEpO1xuXHRpZihsbi50ZHN0PD1wbGFuZURzdCpwbGFuZURzdCkgcmV0dXJuIGxuO1xuXHR2YXIgcm4gPSBVUE5HLnF1YW50aXplLmdldE5lYXJlc3Qobm9kZTEsIHIsZyxiLGEpO1xuXHRyZXR1cm4gcm4udGRzdDxsbi50ZHN0ID8gcm4gOiBsbjtcbn1cblVQTkcucXVhbnRpemUucGxhbmVEc3QgPSBmdW5jdGlvbihlc3QsIHIsZyxiLGEpIHsgIHZhciBlID0gZXN0LmU7ICByZXR1cm4gZVswXSpyICsgZVsxXSpnICsgZVsyXSpiICsgZVszXSphIC0gZXN0LmVNcTsgIH1cblVQTkcucXVhbnRpemUuZGlzdCAgICAgPSBmdW5jdGlvbihxLCAgIHIsZyxiLGEpIHsgIHZhciBkMD1yLXFbMF0sIGQxPWctcVsxXSwgZDI9Yi1xWzJdLCBkMz1hLXFbM107ICByZXR1cm4gZDAqZDArZDEqZDErZDIqZDIrZDMqZDM7ICB9XG5cblVQTkcucXVhbnRpemUuc3BsaXRQaXhlbHMgPSBmdW5jdGlvbihuaW1nLCBuaW1nMzIsIGkwLCBpMSwgZSwgZU1xKVxue1xuXHR2YXIgdmVjRG90ID0gVVBORy5xdWFudGl6ZS52ZWNEb3Q7XG5cdGkxLT00O1xuXHR2YXIgc2hmcyA9IDA7XG5cdHdoaWxlKGkwPGkxKVxuXHR7XG5cdFx0d2hpbGUodmVjRG90KG5pbWcsIGkwLCBlKTw9ZU1xKSBpMCs9NDtcblx0XHR3aGlsZSh2ZWNEb3QobmltZywgaTEsIGUpPiBlTXEpIGkxLT00O1xuXHRcdGlmKGkwPj1pMSkgYnJlYWs7XG5cdFx0XG5cdFx0dmFyIHQgPSBuaW1nMzJbaTA+PjJdOyAgbmltZzMyW2kwPj4yXSA9IG5pbWczMltpMT4+Ml07ICBuaW1nMzJbaTE+PjJdPXQ7XG5cdFx0XG5cdFx0aTArPTQ7ICBpMS09NDtcblx0fVxuXHR3aGlsZSh2ZWNEb3QobmltZywgaTAsIGUpPmVNcSkgaTAtPTQ7XG5cdHJldHVybiBpMCs0O1xufVxuVVBORy5xdWFudGl6ZS52ZWNEb3QgPSBmdW5jdGlvbihuaW1nLCBpLCBlKVxue1xuXHRyZXR1cm4gbmltZ1tpXSplWzBdICsgbmltZ1tpKzFdKmVbMV0gKyBuaW1nW2krMl0qZVsyXSArIG5pbWdbaSszXSplWzNdO1xufVxuVVBORy5xdWFudGl6ZS5zdGF0cyA9IGZ1bmN0aW9uKG5pbWcsIGkwLCBpMSl7XG5cdHZhciBSID0gWzAsMCwwLDAsICAwLDAsMCwwLCAgMCwwLDAsMCwgIDAsMCwwLDBdO1xuXHR2YXIgbSA9IFswLDAsMCwwXTtcblx0dmFyIE4gPSAoaTEtaTApPj4yO1xuXHRmb3IodmFyIGk9aTA7IGk8aTE7IGkrPTQpXG5cdHtcblx0XHR2YXIgciA9IG5pbWdbaV0qKDEvMjU1KSwgZyA9IG5pbWdbaSsxXSooMS8yNTUpLCBiID0gbmltZ1tpKzJdKigxLzI1NSksIGEgPSBuaW1nW2krM10qKDEvMjU1KTtcblx0XHQvL3ZhciByID0gbmltZ1tpXSwgZyA9IG5pbWdbaSsxXSwgYiA9IG5pbWdbaSsyXSwgYSA9IG5pbWdbaSszXTtcblx0XHRtWzBdKz1yOyAgbVsxXSs9ZzsgIG1bMl0rPWI7ICBtWzNdKz1hO1xuXHRcdFxuXHRcdFJbIDBdICs9IHIqcjsgIFJbIDFdICs9IHIqZzsgIFJbIDJdICs9IHIqYjsgIFJbIDNdICs9IHIqYTsgIFxuXHRcdCAgICAgICAgICAgICAgIFJbIDVdICs9IGcqZzsgIFJbIDZdICs9IGcqYjsgIFJbIDddICs9IGcqYTsgXG5cdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlsxMF0gKz0gYipiOyAgUlsxMV0gKz0gYiphOyAgXG5cdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlsxNV0gKz0gYSphOyAgXG5cdH1cblx0Uls0XT1SWzFdOyAgUls4XT1SWzJdOyAgUls5XT1SWzZdOyAgUlsxMl09UlszXTsgIFJbMTNdPVJbN107ICBSWzE0XT1SWzExXTtcblx0XG5cdHJldHVybiB7UjpSLCBtOm0sIE46Tn07XG59XG5VUE5HLnF1YW50aXplLmVzdGF0cyA9IGZ1bmN0aW9uKHN0YXRzKXtcblx0dmFyIFIgPSBzdGF0cy5SLCBtID0gc3RhdHMubSwgTiA9IHN0YXRzLk47XG5cdFxuXHQvLyB3aGVuIGFsbCBzYW1wbGVzIGFyZSBlcXVhbCwgYnV0IE4gaXMgbGFyZ2UgKG1pbGxpb25zKSwgdGhlIFJqIGNhbiBiZSBub24temVybyAoIDAuMDAwMy4uLi4gLSBwcmVjaXNzaW9uIGVycm9yKVxuXHR2YXIgbTAgPSBtWzBdLCBtMSA9IG1bMV0sIG0yID0gbVsyXSwgbTMgPSBtWzNdLCBpTiA9IChOPT0wID8gMCA6IDEvTik7XG5cdHZhciBSaiA9IFtcblx0XHRSWyAwXSAtIG0wKm0wKmlOLCAgUlsgMV0gLSBtMCptMSppTiwgIFJbIDJdIC0gbTAqbTIqaU4sICBSWyAzXSAtIG0wKm0zKmlOLCAgXG5cdFx0UlsgNF0gLSBtMSptMCppTiwgIFJbIDVdIC0gbTEqbTEqaU4sICBSWyA2XSAtIG0xKm0yKmlOLCAgUlsgN10gLSBtMSptMyppTixcblx0XHRSWyA4XSAtIG0yKm0wKmlOLCAgUlsgOV0gLSBtMiptMSppTiwgIFJbMTBdIC0gbTIqbTIqaU4sICBSWzExXSAtIG0yKm0zKmlOLCAgXG5cdFx0UlsxMl0gLSBtMyptMCppTiwgIFJbMTNdIC0gbTMqbTEqaU4sICBSWzE0XSAtIG0zKm0yKmlOLCAgUlsxNV0gLSBtMyptMyppTiBcblx0XTtcblx0XG5cdHZhciBBID0gUmosIE0gPSBVUE5HLk00O1xuXHR2YXIgYiA9IFswLjUsMC41LDAuNSwwLjVdLCBtaSA9IDAsIHRtaSA9IDA7XG5cdFxuXHRpZihOIT0wKVxuXHRmb3IodmFyIGk9MDsgaTwxMDsgaSsrKSB7XG5cdFx0YiA9IE0ubXVsdFZlYyhBLCBiKTsgIHRtaSA9IE1hdGguc3FydChNLmRvdChiLGIpKTsgIGIgPSBNLnNtbCgxL3RtaSwgIGIpO1xuXHRcdGlmKE1hdGguYWJzKHRtaS1taSk8MWUtOSkgYnJlYWs7ICBtaSA9IHRtaTtcblx0fVx0XG5cdC8vYiA9IFswLDAsMSwwXTsgIG1pPU47XG5cdHZhciBxID0gW20wKmlOLCBtMSppTiwgbTIqaU4sIG0zKmlOXTtcblx0dmFyIGVNcTI1NSA9IE0uZG90KE0uc21sKDI1NSxxKSxiKTtcblx0XG5cdHJldHVybiB7ICBDb3Y6UmosIHE6cSwgZTpiLCBMOm1pLCAgZU1xMjU1OmVNcTI1NSwgZU1xIDogTS5kb3QoYixxKSxcblx0XHRcdFx0cmdiYTogKCgoTWF0aC5yb3VuZCgyNTUqcVszXSk8PDI0KSB8IChNYXRoLnJvdW5kKDI1NSpxWzJdKTw8MTYpIHwgIChNYXRoLnJvdW5kKDI1NSpxWzFdKTw8OCkgfCAoTWF0aC5yb3VuZCgyNTUqcVswXSk8PDApKT4+PjApICB9O1xufVxuVVBORy5NNCA9IHtcblx0bXVsdFZlYyA6IGZ1bmN0aW9uKG0sdikge1xuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bVsgMF0qdlswXSArIG1bIDFdKnZbMV0gKyBtWyAyXSp2WzJdICsgbVsgM10qdlszXSxcblx0XHRcdFx0bVsgNF0qdlswXSArIG1bIDVdKnZbMV0gKyBtWyA2XSp2WzJdICsgbVsgN10qdlszXSxcblx0XHRcdFx0bVsgOF0qdlswXSArIG1bIDldKnZbMV0gKyBtWzEwXSp2WzJdICsgbVsxMV0qdlszXSxcblx0XHRcdFx0bVsxMl0qdlswXSArIG1bMTNdKnZbMV0gKyBtWzE0XSp2WzJdICsgbVsxNV0qdlszXVxuXHRcdFx0XTtcblx0fSxcblx0ZG90IDogZnVuY3Rpb24oeCx5KSB7ICByZXR1cm4gIHhbMF0qeVswXSt4WzFdKnlbMV0reFsyXSp5WzJdK3hbM10qeVszXTsgIH0sXG5cdHNtbCA6IGZ1bmN0aW9uKGEseSkgeyAgcmV0dXJuIFthKnlbMF0sYSp5WzFdLGEqeVsyXSxhKnlbM11dOyAgfVxufVxuXG5VUE5HLmVuY29kZS5jb25jYXRSR0JBID0gZnVuY3Rpb24oYnVmcykge1xuXHR2YXIgdGxlbiA9IDA7XG5cdGZvcih2YXIgaT0wOyBpPGJ1ZnMubGVuZ3RoOyBpKyspIHRsZW4gKz0gYnVmc1tpXS5ieXRlTGVuZ3RoO1xuXHR2YXIgbmltZyA9IG5ldyBVaW50OEFycmF5KHRsZW4pLCBub2ZmPTA7XG5cdGZvcih2YXIgaT0wOyBpPGJ1ZnMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnVmc1tpXSksIGlsID0gaW1nLmxlbmd0aDtcblx0XHRmb3IodmFyIGo9MDsgajxpbDsgais9NCkgeyAgXG5cdFx0XHR2YXIgcj1pbWdbal0sIGc9aW1nW2orMV0sIGI9aW1nW2orMl0sIGEgPSBpbWdbaiszXTtcblx0XHRcdGlmKGE9PTApIHI9Zz1iPTA7XG5cdFx0XHRuaW1nW25vZmYral09cjsgIG5pbWdbbm9mZitqKzFdPWc7ICBuaW1nW25vZmYraisyXT1iOyAgbmltZ1tub2ZmK2orM109YTsgIH1cblx0XHRub2ZmICs9IGlsO1xuXHR9XG5cdHJldHVybiBuaW1nLmJ1ZmZlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVVBORztcblxuIiwidmFyIGdldERlZmF1bHRQYXJlbnQgPSBmdW5jdGlvbiAob3JpZ2luYWxUYXJnZXQpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHNhbXBsZVRhcmdldCA9IEFycmF5LmlzQXJyYXkob3JpZ2luYWxUYXJnZXQpID8gb3JpZ2luYWxUYXJnZXRbMF0gOiBvcmlnaW5hbFRhcmdldDtcbiAgICByZXR1cm4gc2FtcGxlVGFyZ2V0Lm93bmVyRG9jdW1lbnQuYm9keTtcbn07XG52YXIgY291bnRlck1hcCA9IG5ldyBXZWFrTWFwKCk7XG52YXIgdW5jb250cm9sbGVkTm9kZXMgPSBuZXcgV2Vha01hcCgpO1xudmFyIG1hcmtlck1hcCA9IHt9O1xudmFyIGxvY2tDb3VudCA9IDA7XG52YXIgdW53cmFwSG9zdCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgJiYgKG5vZGUuaG9zdCB8fCB1bndyYXBIb3N0KG5vZGUucGFyZW50Tm9kZSkpO1xufTtcbnZhciBjb3JyZWN0VGFyZ2V0cyA9IGZ1bmN0aW9uIChwYXJlbnQsIHRhcmdldHMpIHtcbiAgICByZXR1cm4gdGFyZ2V0c1xuICAgICAgICAubWFwKGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgaWYgKHBhcmVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb3JyZWN0ZWRUYXJnZXQgPSB1bndyYXBIb3N0KHRhcmdldCk7XG4gICAgICAgIGlmIChjb3JyZWN0ZWRUYXJnZXQgJiYgcGFyZW50LmNvbnRhaW5zKGNvcnJlY3RlZFRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JyZWN0ZWRUYXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcignYXJpYS1oaWRkZW4nLCB0YXJnZXQsICdpbiBub3QgY29udGFpbmVkIGluc2lkZScsIHBhcmVudCwgJy4gRG9pbmcgbm90aGluZycpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9KVxuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh4KSB7IHJldHVybiBCb29sZWFuKHgpOyB9KTtcbn07XG4vKipcbiAqIE1hcmtzIGV2ZXJ5dGhpbmcgZXhjZXB0IGdpdmVuIG5vZGUob3Igbm9kZXMpIGFzIGFyaWEtaGlkZGVuXG4gKiBAcGFyYW0ge0VsZW1lbnQgfCBFbGVtZW50W119IG9yaWdpbmFsVGFyZ2V0IC0gZWxlbWVudHMgdG8ga2VlcCBvbiB0aGUgcGFnZVxuICogQHBhcmFtIFtwYXJlbnROb2RlXSAtIHRvcCBlbGVtZW50LCBkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5XG4gKiBAcGFyYW0ge1N0cmluZ30gW21hcmtlck5hbWVdIC0gYSBzcGVjaWFsIGF0dHJpYnV0ZSB0byBtYXJrIGV2ZXJ5IG5vZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBbY29udHJvbEF0dHJpYnV0ZV0gLSBodG1sIEF0dHJpYnV0ZSB0byBjb250cm9sXG4gKiBAcmV0dXJuIHtVbmRvfSB1bmRvIGNvbW1hbmRcbiAqL1xudmFyIGFwcGx5QXR0cmlidXRlVG9PdGhlcnMgPSBmdW5jdGlvbiAob3JpZ2luYWxUYXJnZXQsIHBhcmVudE5vZGUsIG1hcmtlck5hbWUsIGNvbnRyb2xBdHRyaWJ1dGUpIHtcbiAgICB2YXIgdGFyZ2V0cyA9IGNvcnJlY3RUYXJnZXRzKHBhcmVudE5vZGUsIEFycmF5LmlzQXJyYXkob3JpZ2luYWxUYXJnZXQpID8gb3JpZ2luYWxUYXJnZXQgOiBbb3JpZ2luYWxUYXJnZXRdKTtcbiAgICBpZiAoIW1hcmtlck1hcFttYXJrZXJOYW1lXSkge1xuICAgICAgICBtYXJrZXJNYXBbbWFya2VyTmFtZV0gPSBuZXcgV2Vha01hcCgpO1xuICAgIH1cbiAgICB2YXIgbWFya2VyQ291bnRlciA9IG1hcmtlck1hcFttYXJrZXJOYW1lXTtcbiAgICB2YXIgaGlkZGVuTm9kZXMgPSBbXTtcbiAgICB2YXIgZWxlbWVudHNUb0tlZXAgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGVsZW1lbnRzVG9TdG9wID0gbmV3IFNldCh0YXJnZXRzKTtcbiAgICB2YXIga2VlcCA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICBpZiAoIWVsIHx8IGVsZW1lbnRzVG9LZWVwLmhhcyhlbCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50c1RvS2VlcC5hZGQoZWwpO1xuICAgICAgICBrZWVwKGVsLnBhcmVudE5vZGUpO1xuICAgIH07XG4gICAgdGFyZ2V0cy5mb3JFYWNoKGtlZXApO1xuICAgIHZhciBkZWVwID0gZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICBpZiAoIXBhcmVudCB8fCBlbGVtZW50c1RvU3RvcC5oYXMocGFyZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocGFyZW50LmNoaWxkcmVuLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRzVG9LZWVwLmhhcyhub2RlKSkge1xuICAgICAgICAgICAgICAgIGRlZXAobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0ciA9IG5vZGUuZ2V0QXR0cmlidXRlKGNvbnRyb2xBdHRyaWJ1dGUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWxyZWFkeUhpZGRlbiA9IGF0dHIgIT09IG51bGwgJiYgYXR0ciAhPT0gJ2ZhbHNlJztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvdW50ZXJWYWx1ZSA9IChjb3VudGVyTWFwLmdldChub2RlKSB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXJWYWx1ZSA9IChtYXJrZXJDb3VudGVyLmdldChub2RlKSB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ZXJNYXAuc2V0KG5vZGUsIGNvdW50ZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlckNvdW50ZXIuc2V0KG5vZGUsIG1hcmtlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJWYWx1ZSA9PT0gMSAmJiBhbHJlYWR5SGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNvbnRyb2xsZWROb2Rlcy5zZXQobm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtlclZhbHVlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShtYXJrZXJOYW1lLCAndHJ1ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWxyZWFkeUhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSwgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdhcmlhLWhpZGRlbjogY2Fubm90IG9wZXJhdGUgb24gJywgbm9kZSwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGRlZXAocGFyZW50Tm9kZSk7XG4gICAgZWxlbWVudHNUb0tlZXAuY2xlYXIoKTtcbiAgICBsb2NrQ291bnQrKztcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBoaWRkZW5Ob2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICB2YXIgY291bnRlclZhbHVlID0gY291bnRlck1hcC5nZXQobm9kZSkgLSAxO1xuICAgICAgICAgICAgdmFyIG1hcmtlclZhbHVlID0gbWFya2VyQ291bnRlci5nZXQobm9kZSkgLSAxO1xuICAgICAgICAgICAgY291bnRlck1hcC5zZXQobm9kZSwgY291bnRlclZhbHVlKTtcbiAgICAgICAgICAgIG1hcmtlckNvdW50ZXIuc2V0KG5vZGUsIG1hcmtlclZhbHVlKTtcbiAgICAgICAgICAgIGlmICghY291bnRlclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1bmNvbnRyb2xsZWROb2Rlcy5oYXMobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuY29udHJvbGxlZE5vZGVzLmRlbGV0ZShub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbWFya2VyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShtYXJrZXJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxvY2tDb3VudC0tO1xuICAgICAgICBpZiAoIWxvY2tDb3VudCkge1xuICAgICAgICAgICAgLy8gY2xlYXJcbiAgICAgICAgICAgIGNvdW50ZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAgICAgY291bnRlck1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB1bmNvbnRyb2xsZWROb2RlcyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICBtYXJrZXJNYXAgPSB7fTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuLyoqXG4gKiBNYXJrcyBldmVyeXRoaW5nIGV4Y2VwdCBnaXZlbiBub2RlKG9yIG5vZGVzKSBhcyBhcmlhLWhpZGRlblxuICogQHBhcmFtIHtFbGVtZW50IHwgRWxlbWVudFtdfSBvcmlnaW5hbFRhcmdldCAtIGVsZW1lbnRzIHRvIGtlZXAgb24gdGhlIHBhZ2VcbiAqIEBwYXJhbSBbcGFyZW50Tm9kZV0gLSB0b3AgZWxlbWVudCwgZGVmYXVsdHMgdG8gZG9jdW1lbnQuYm9keVxuICogQHBhcmFtIHtTdHJpbmd9IFttYXJrZXJOYW1lXSAtIGEgc3BlY2lhbCBhdHRyaWJ1dGUgdG8gbWFyayBldmVyeSBub2RlXG4gKiBAcmV0dXJuIHtVbmRvfSB1bmRvIGNvbW1hbmRcbiAqL1xuZXhwb3J0IHZhciBoaWRlT3RoZXJzID0gZnVuY3Rpb24gKG9yaWdpbmFsVGFyZ2V0LCBwYXJlbnROb2RlLCBtYXJrZXJOYW1lKSB7XG4gICAgaWYgKG1hcmtlck5hbWUgPT09IHZvaWQgMCkgeyBtYXJrZXJOYW1lID0gJ2RhdGEtYXJpYS1oaWRkZW4nOyB9XG4gICAgdmFyIHRhcmdldHMgPSBBcnJheS5mcm9tKEFycmF5LmlzQXJyYXkob3JpZ2luYWxUYXJnZXQpID8gb3JpZ2luYWxUYXJnZXQgOiBbb3JpZ2luYWxUYXJnZXRdKTtcbiAgICB2YXIgYWN0aXZlUGFyZW50Tm9kZSA9IHBhcmVudE5vZGUgfHwgZ2V0RGVmYXVsdFBhcmVudChvcmlnaW5hbFRhcmdldCk7XG4gICAgaWYgKCFhY3RpdmVQYXJlbnROb2RlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9O1xuICAgIH1cbiAgICAvLyB3ZSBzaG91bGQgbm90IGhpZGUgYXJpYUxpdmUgZWxlbWVudHMgLSBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L2FyaWEtaGlkZGVuL2lzc3Vlcy8xMFxuICAgIHRhcmdldHMucHVzaC5hcHBseSh0YXJnZXRzLCBBcnJheS5mcm9tKGFjdGl2ZVBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCgnW2FyaWEtbGl2ZV0nKSkpO1xuICAgIHJldHVybiBhcHBseUF0dHJpYnV0ZVRvT3RoZXJzKHRhcmdldHMsIGFjdGl2ZVBhcmVudE5vZGUsIG1hcmtlck5hbWUsICdhcmlhLWhpZGRlbicpO1xufTtcbi8qKlxuICogTWFya3MgZXZlcnl0aGluZyBleGNlcHQgZ2l2ZW4gbm9kZShvciBub2RlcykgYXMgaW5lcnRcbiAqIEBwYXJhbSB7RWxlbWVudCB8IEVsZW1lbnRbXX0gb3JpZ2luYWxUYXJnZXQgLSBlbGVtZW50cyB0byBrZWVwIG9uIHRoZSBwYWdlXG4gKiBAcGFyYW0gW3BhcmVudE5vZGVdIC0gdG9wIGVsZW1lbnQsIGRlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBbbWFya2VyTmFtZV0gLSBhIHNwZWNpYWwgYXR0cmlidXRlIHRvIG1hcmsgZXZlcnkgbm9kZVxuICogQHJldHVybiB7VW5kb30gdW5kbyBjb21tYW5kXG4gKi9cbmV4cG9ydCB2YXIgaW5lcnRPdGhlcnMgPSBmdW5jdGlvbiAob3JpZ2luYWxUYXJnZXQsIHBhcmVudE5vZGUsIG1hcmtlck5hbWUpIHtcbiAgICBpZiAobWFya2VyTmFtZSA9PT0gdm9pZCAwKSB7IG1hcmtlck5hbWUgPSAnZGF0YS1pbmVydC1lZCc7IH1cbiAgICB2YXIgYWN0aXZlUGFyZW50Tm9kZSA9IHBhcmVudE5vZGUgfHwgZ2V0RGVmYXVsdFBhcmVudChvcmlnaW5hbFRhcmdldCk7XG4gICAgaWYgKCFhY3RpdmVQYXJlbnROb2RlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9O1xuICAgIH1cbiAgICByZXR1cm4gYXBwbHlBdHRyaWJ1dGVUb090aGVycyhvcmlnaW5hbFRhcmdldCwgYWN0aXZlUGFyZW50Tm9kZSwgbWFya2VyTmFtZSwgJ2luZXJ0Jyk7XG59O1xuLyoqXG4gKiBAcmV0dXJucyBpZiBjdXJyZW50IGJyb3dzZXIgc3VwcG9ydHMgaW5lcnRcbiAqL1xuZXhwb3J0IHZhciBzdXBwb3J0c0luZXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIEhUTUxFbGVtZW50LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgnaW5lcnQnKTtcbn07XG4vKipcbiAqIEF1dG9tYXRpYyBmdW5jdGlvbiB0byBcInN1cHByZXNzXCIgRE9NIGVsZW1lbnRzIC0gX2hpZGVfIG9yIF9pbmVydF8gaW4gdGhlIGJlc3QgcG9zc2libGUgd2F5XG4gKiBAcGFyYW0ge0VsZW1lbnQgfCBFbGVtZW50W119IG9yaWdpbmFsVGFyZ2V0IC0gZWxlbWVudHMgdG8ga2VlcCBvbiB0aGUgcGFnZVxuICogQHBhcmFtIFtwYXJlbnROb2RlXSAtIHRvcCBlbGVtZW50LCBkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5XG4gKiBAcGFyYW0ge1N0cmluZ30gW21hcmtlck5hbWVdIC0gYSBzcGVjaWFsIGF0dHJpYnV0ZSB0byBtYXJrIGV2ZXJ5IG5vZGVcbiAqIEByZXR1cm4ge1VuZG99IHVuZG8gY29tbWFuZFxuICovXG5leHBvcnQgdmFyIHN1cHByZXNzT3RoZXJzID0gZnVuY3Rpb24gKG9yaWdpbmFsVGFyZ2V0LCBwYXJlbnROb2RlLCBtYXJrZXJOYW1lKSB7XG4gICAgaWYgKG1hcmtlck5hbWUgPT09IHZvaWQgMCkgeyBtYXJrZXJOYW1lID0gJ2RhdGEtc3VwcHJlc3NlZCc7IH1cbiAgICByZXR1cm4gKHN1cHBvcnRzSW5lcnQoKSA/IGluZXJ0T3RoZXJzIDogaGlkZU90aGVycykob3JpZ2luYWxUYXJnZXQsIHBhcmVudE5vZGUsIG1hcmtlck5hbWUpO1xufTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgSGVsbWV0IH0gZnJvbSBcInJlYWN0LWhlbG1ldFwiO1xyXG5cclxuZnVuY3Rpb24gVGl0bGUoeyB0aXRsZSwgZHJpdmUgfSkge1xyXG4gIHJldHVybiAoXHJcbiAgICA8SGVsbWV0PlxyXG4gICAgICA8dGl0bGU+e2RyaXZlID8gdGl0bGUgOiBgJHt0aXRsZX0gLSBPcGVuU2lnbuKEomB9PC90aXRsZT5cclxuICAgICAgPG1ldGEgbmFtZT1cImRlc2NyaXB0aW9uXCIgY29udGVudD17YCR7dGl0bGV9IC0gT3BlblNpZ27ihKJgfSAvPlxyXG4gICAgICA8bGlua1xyXG4gICAgICAgIHJlbD1cImljb25cIlxyXG4gICAgICAgIHR5cGU9XCJpbWFnZS9wbmdcIlxyXG4gICAgICAgIGhyZWY9e2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZmV2X0ljb25cIil9XHJcbiAgICAgICAgc2l6ZXM9XCI0MHg0MFwiXHJcbiAgICAgIC8+XHJcbiAgICA8L0hlbG1ldD5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBUaXRsZTtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG5mdW5jdGlvbiBCb3JkZXJSZXNpemUoeyByaWdodCwgdG9wIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2Ake3JpZ2h0ID8gYC1yaWdodC1bMTJweF1gIDogXCItcmlnaHQtWzFweF1cIn0gJHtcbiAgICAgICAgdG9wID8gYC1ib3R0b20tWzExcHhdYCA6IFwiLWJvdHRvbS1bMXB4XVwiXG4gICAgICB9IGFic29sdXRlIGlubGluZS1ibG9jayB3LVsxNHB4XSBoLVsxNHB4XSBob3ZlcjpjdXJzb3Itc3ctcmVzaXplIGJvcmRlci1yLVszcHhdIGJvcmRlci1iLVszcHhdIGJvcmRlci1bIzE4OGFlMl1gfVxuICAgID48L2Rpdj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQm9yZGVyUmVzaXplO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xuZnVuY3Rpb24gRGVmYXVsdFNpZ25hdHVyZSh7IGRlZmF1bHRTaWduSW1nLCB4eVBvc3Rpb24sIHNldERlZmF1bHRTaWduQWxlcnQgfSkge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG5cbiAgY29uc3QgY29uZmlybVRvYWRkRGVmYXVsdFNpZ24gPSAoKSA9PiB7XG4gICAgaWYgKHh5UG9zdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICBzZXREZWZhdWx0U2lnbkFsZXJ0KHtcbiAgICAgICAgaXNTaG93OiB0cnVlLFxuICAgICAgICBhbGVydE1lc3NhZ2U6IHQoXCJkZWZhdWx0LXNpZ24tYWxlcnRcIilcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXREZWZhdWx0U2lnbkFsZXJ0KHtcbiAgICAgICAgaXNTaG93OiB0cnVlLFxuICAgICAgICBhbGVydE1lc3NhZ2U6IHQoXCJwbGVhc2Utc2VsZWN0LXBvc2l0aW9uIVwiKVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBkYXRhLXR1dD1cInJlYWN0b3VyVGhpcmRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtMiBwci0yIHB0LTIgcGItMSB0ZXh0LVsxNXB4XSB0ZXh0LWJhc2UtY29udGVudCBmb250LXNlbWlib2xkIGJvcmRlci1iLVsxcHhdIGJvcmRlci1iYXNlLTMwMFwiPlxuICAgICAgICB7dChcInNpZ25hdHVyZVwiKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBtdC1bMTBweF0gZm9udC1zZW1pYm9sZFwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UtY29udGVudFwiPnt0KFwiWW91ci1TaWduYXR1cmVcIil9PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm9wLWNhcmQgc2hhZG93LW1kIGgtWzExMXB4XSB3LVs5MCVdIHAtMlwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIGFsdD1cInNpZ25hdHVyZVwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb250YWluXCJcbiAgICAgICAgICAgIHNyYz17ZGVmYXVsdFNpZ25JbWd9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnkgb3AtYnRuLXNtIG10LVsxMHB4XVwiXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gY29uZmlybVRvYWRkRGVmYXVsdFNpZ24oKX1cbiAgICAgICAgPlxuICAgICAgICAgIHt0KFwiYXV0by1zaWduLWFsbFwiKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRGVmYXVsdFNpZ25hdHVyZTtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgUHJldk5leHQgZnJvbSBcIi4vUHJldk5leHRcIjtcclxuaW1wb3J0IHtcclxuICBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlLFxyXG4gIGhhbmRsZURvd25sb2FkUGRmLFxyXG4gIGhhbmRsZVRvUHJpbnRcclxufSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcclxuaW1wb3J0IFwiLi4vLi4vc3R5bGVzL3NpZ25hdHVyZS5jc3NcIjtcclxuaW1wb3J0ICogYXMgRHJvcGRvd25NZW51IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtZHJvcGRvd24tbWVudVwiO1xyXG5pbXBvcnQgTW9kYWxVaSBmcm9tIFwiLi4vLi4vcHJpbWl0aXZlcy9Nb2RhbFVpXCI7XHJcbmltcG9ydCBMb2FkZXIgZnJvbSBcIi4uLy4uL3ByaW1pdGl2ZXMvTG9hZGVyXCI7XHJcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcclxuXHJcbmZ1bmN0aW9uIEhlYWRlcih7XHJcbiAgaXNQZGZSZXF1ZXN0RmlsZXMsXHJcbiAgaXNQbGFjZWhvbGRlcixcclxuICBzZXRJc0RlY2xpbmUsXHJcbiAgcGFnZU51bWJlcixcclxuICBhbGxQYWdlcyxcclxuICBjaGFuZ2VQYWdlLFxyXG4gIHBkZlVybCxcclxuICBlbWJlZFdpZGdldHNEYXRhLFxyXG4gIHBkZkRldGFpbHMsXHJcbiAgc2lnbmVyUG9zLFxyXG4gIHNpZ25lcnNkYXRhLFxyXG4gIGlzTWFpbFNlbmQsXHJcbiAgYWxlcnRTZW5kRW1haWwsXHJcbiAgaXNDb21wbGV0ZWQsXHJcbiAgaXNTaG93SGVhZGVyLFxyXG4gIGRlY2xpbmUsXHJcbiAgY3VycmVudFNpZ25lcixcclxuICBhbHJlYWR5U2lnbixcclxuICBpc1NpZ25Zb3Vyc2VsZixcclxuICBzZXRJc0VtYWlsLFxyXG4gIGNvbXBsZXRlQnRuVGl0bGUsXHJcbiAgc2V0SXNFZGl0VGVtcGxhdGUsXHJcbiAgaXNQdWJsaWNUZW1wbGF0ZSxcclxuICBjbGlja09uWm9vbUluLFxyXG4gIGNsaWNrT25ab29tT3V0LFxyXG4gIGhhbmRsZVJvdGF0aW9uRnVuLFxyXG4gIGlzRGlzYWJsZVJvdGF0ZSxcclxuICB0ZW1wbGF0ZUlkXHJcbn0pIHtcclxuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XHJcbiAgY29uc3QgZmlsdGVyUHJlZmlsbCA9XHJcbiAgICBzaWduZXJQb3MgJiYgc2lnbmVyUG9zPy5maWx0ZXIoKGRhdGEpID0+IGRhdGEuUm9sZSAhPT0gXCJwcmVmaWxsXCIpO1xyXG4gIGNvbnN0IGlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPCA3Njc7XHJcbiAgY29uc3QgW2lzRG93bmxvYWRpbmcsIHNldElzRG93bmxvYWRpbmddID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgaXNHdWVzdFNpZ25lciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNHdWVzdFNpZ25lclwiKTtcclxuXHJcbiAgLy9mdW5jdGlvbiBmb3Igc2hvdyBkZWNsaW5lIGFsZXJ0XHJcbiAgY29uc3QgaGFuZGxlRGVjbGluZVBkZkFsZXJ0ID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgY29uc3QgY3VycmVudERlY2xpbmUgPSB7IGN1cnJudDogXCJTdXJlXCIsIGlzRGVjbGluZWQ6IHRydWUgfTtcclxuICAgIHNldElzRGVjbGluZShjdXJyZW50RGVjbGluZSk7XHJcbiAgfTtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHB5LVs1cHhdXCI+XHJcbiAgICAgIHtpc01vYmlsZSAmJiBpc1Nob3dIZWFkZXIgPyAoXHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgaWQ9XCJuYXZiYXJcIlxyXG4gICAgICAgICAgY2xhc3NOYW1lPXtpc0d1ZXN0U2lnbmVyID8gXCJzdGlja3lTaWduZXJIZWFkXCIgOiBcInN0aWNreUhlYWRcIn1cclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIHdpZHRoOiBpc0d1ZXN0U2lnbmVyXHJcbiAgICAgICAgICAgICAgPyB3aW5kb3cuaW5uZXJXaWR0aFxyXG4gICAgICAgICAgICAgIDogd2luZG93LmlubmVyV2lkdGggLSAzMCArIFwicHhcIlxyXG4gICAgICAgICAgfX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBweS1bNXB4XSBweC1bMTBweF0gXCI+XHJcbiAgICAgICAgICAgIDxkaXYgb25DbGljaz17KCkgPT4gd2luZG93Lmhpc3RvcnkuZ28oLTIpfT5cclxuICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXJyb3ctbGVmdCB0ZXh0LWJhc2UtY29udGVudFwiXHJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8UHJldk5leHRcclxuICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgIGFsbFBhZ2VzPXthbGxQYWdlc31cclxuICAgICAgICAgICAgICBjaGFuZ2VQYWdlPXtjaGFuZ2VQYWdlfVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICB7aXNDb21wbGV0ZWQgJiYgYWxyZWFkeVNpZ24gPyAoXHJcbiAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Sb290PlxyXG4gICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5UcmlnZ2VyIGFzQ2hpbGQ+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbGluayBvcC1saW5rLXByaW1hcnkgbm8tdW5kZXJsaW5lIHRleHQtWzE2cHhdIGZvbnQtc2VtaWJvbGQgcHItWzNweF0gcGwtWzVweF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZWxsaXBzaXMtdlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuVHJpZ2dlcj5cclxuICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuUG9ydGFsPlxyXG4gICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LkNvbnRlbnRcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJEcm9wZG93bk1lbnVDb250ZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBzaWRlT2Zmc2V0PXs1fVxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJEcm9wZG93bk1lbnVJdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkUGRmKHBkZkRldGFpbHMsIHBkZlVybCwgc2V0SXNEb3dubG9hZGluZylcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hcnJvdy1kb3duIG1yLVszcHhdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7dChcImRvd25sb2FkXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICB7aXNDb21wbGV0ZWQgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIkRyb3Bkb3duTWVudUl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkQ2VydGlmaWNhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvcmRlci1ub25lIGJnLVsjZmZmXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hd2FyZCBtci1bM3B4XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJjZXJ0aWZpY2F0ZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAge2lzU2lnbllvdXJzZWxmICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJEcm9wZG93bk1lbnVJdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNFbWFpbCh0cnVlKX1cclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWVudmVsb3BlIG1yLVszcHhdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcIm1haWxcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51SXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9QcmludChlLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtcHJpbnQgbXItWzNweF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwicHJpbnRcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxyXG4gICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Db250ZW50PlxyXG4gICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuUG9ydGFsPlxyXG4gICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlJvb3Q+XHJcbiAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYXJvdW5kIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgey8qIGN1cnJlbnQgc2lnbmVyIGlzIGNoZWNraW5nIHVzZXIgc2VuZCByZXF1ZXN0IGFuZCBjaGVjayBzdGF0dXMgb2YgcGRmIHNpZ24gdGhhbiBpZiBjdXJyZW50IFxyXG4gICAgICAgICAgICAgICAgdXNlciBleGlzdCB0aGFuIHNob3cgZmluaXNoIGJ1dHRvbiBlbHNlIG5vXHJcbiAgICAgICAgICAgICAgICAqL31cclxuICAgICAgICAgICAgICAgIHtjdXJyZW50U2lnbmVyICYmIChcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlclwiIGRhdGEtdHV0PVwicmVhY3RvdXJGaWZ0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtkZWNsaW5lICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVjbGluZVBkZkFsZXJ0KCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtW3JlZF0gYm9yZGVyLW5vbmUgZm9udC1bNjUwXSB0ZXh0LVsxNHB4XSBtci0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJkZWNsaW5lXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICB7aXNQbGFjZWhvbGRlciA/IChcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNNYWlsU2VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnRTZW5kRW1haWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNYWlsU2VuZCA/IFwiXCIgOiBcIm9wLWxpbmstcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayBuby11bmRlcmxpbmUgZm9udC1bNjUwXSB0ZXh0LVsxNHB4XWB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwiaGVhZGVyQXJlYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb21wbGV0ZUJ0blRpdGxlID8gY29tcGxldGVCdG5UaXRsZSA6IHQoXCJzZW5kXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10dXQ9XCJyZWFjdG91clRoaXJkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZW1iZWRXaWRnZXRzRGF0YSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItbm9uZSBmb250LVs2NTBdIHRleHQtWzE0cHhdIG9wLWxpbmsgb3AtbGluay1wcmltYXJ5IG5vLXVuZGVybGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiZmluaXNoXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlJvb3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlRyaWdnZXIgYXNDaGlsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb250LVs2NTBdIHRleHQtWzE4cHhdIHB4LTIgbWwtWzRweF0gdGV4dC1iYXNlLWNvbnRlbnQgbm8tdW5kZXJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWVsbGlwc2lzLXZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlBvcnRhbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Db250ZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctd2hpdGUgc2hhZG93LW1kIHJvdW5kZWQtbWQgcHgtMyBweS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlT2Zmc2V0PXs1fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciB0ZXh0LVsxM3B4XSBmb2N1czpvdXRsaW5lLW5vbmUgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRQZGYoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzWzBdPy5VUkwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXJyb3ctZG93biBtci1bM3B4XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1bNTAwXVwiPnt0KFwiZG93bmxvYWRcIil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51Lkl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyFpc0Rpc2FibGVSb3RhdGUgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgdGV4dC1bMTNweF0gZm9jdXM6b3V0bGluZS1ub25lIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVSb3RhdGlvbkZ1big5MCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1yb3RhdGUtcmlnaHQgdGV4dC1ncmF5LTUwMCAyeGw6dGV4dC1bMzBweF0gbXItWzNweF1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1bNTAwXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJyb3RhdGUtcmlnaHRcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51Lkl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciB0ZXh0LVsxM3B4XSBmb2N1czpvdXRsaW5lLW5vbmUgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVJvdGF0aW9uRnVuKC05MCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1yb3RhdGUtbGVmdCB0ZXh0LWdyYXktNTAwIDJ4bDp0ZXh0LVszMHB4XSBtci1bM3B4XVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LVs1MDBdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInJvdGF0ZS1sZWZ0XCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgdGV4dC1bMTNweF0gZm9jdXM6b3V0bGluZS1ub25lIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGNsaWNrT25ab29tSW4oKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1tYWduaWZ5aW5nLWdsYXNzLXBsdXMgdGV4dC1ncmF5LTUwMCAyeGw6dGV4dC1bMzBweF1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LVs1MDBdXCI+e3QoXCJ6b29tLWluXCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgdGV4dC1bMTNweF0gZm9jdXM6b3V0bGluZS1ub25lIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGNsaWNrT25ab29tT3V0KCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtbWFnbmlmeWluZy1nbGFzcy1taW51cyB0ZXh0LWdyYXktNTAwIDJ4bDp0ZXh0LVszMHB4XVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtWzUwMF1cIj57dChcInpvb20tb3V0XCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Db250ZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuUG9ydGFsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlJvb3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIHtpc1B1YmxpY1RlbXBsYXRlICYmIChcclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwicmVhY3RvdXJUaGlyZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZW1iZWRXaWRnZXRzRGF0YSgpfVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlci1ub25lIGZvbnQtWzY1MF0gdGV4dC1bMTRweF0gb3AtbGluayBvcC1saW5rLXByaW1hcnkgbm8tdW5kZXJsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt0KFwic2lnbi1ub3dcIil9XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApIDogKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciB3LWZ1bGwgZ2FwLXktMSBtbC0xXCI+XHJcbiAgICAgICAgICA8UHJldk5leHRcclxuICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgYWxsUGFnZXM9e2FsbFBhZ2VzfVxyXG4gICAgICAgICAgICBjaGFuZ2VQYWdlPXtjaGFuZ2VQYWdlfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIHtpc1BsYWNlaG9sZGVyID8gKFxyXG4gICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBteC1bMTAwcHhdIGxnOm14LTAgb3JkZXItbGFzdCBsZzpvcmRlci1ub25lXCI+XHJcbiAgICAgICAgICAgICAgICB7IWlzTWFpbFNlbmQgJiZcclxuICAgICAgICAgICAgICAgICAgc2lnbmVyc2RhdGEubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICBzaWduZXJzZGF0YS5sZW5ndGggIT09IGZpbHRlclByZWZpbGwubGVuZ3RoICYmIChcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAge2ZpbHRlclByZWZpbGwubGVuZ3RoID09PSAwID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxM3B4XSB0ZXh0LVsjZjU0MDVlXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiYWRkXCIpfSB7c2lnbmVyc2RhdGEubGVuZ3RoIC0gZmlsdGVyUHJlZmlsbC5sZW5ndGh9e1wiIFwifVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwicmVjaXBpZW50c1wiKX0ge3QoXCJ3aWRnZXRzLW5hbWUuc2lnbmF0dXJlXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxM3B4XSB0ZXh0LVsjZjU0MDVlXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiYWRkXCIpfSB7c2lnbmVyc2RhdGEubGVuZ3RoIC0gZmlsdGVyUHJlZmlsbC5sZW5ndGh9e1wiIFwifVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwibW9yZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInJlY2lwaWVudHNcIil9IHt0KFwid2lkZ2V0cy1uYW1lLnNpZ25hdHVyZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXhcIj5cclxuICAgICAgICAgICAgICAgIHtzZXRJc0VkaXRUZW1wbGF0ZSAmJiAoXHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRJc0VkaXRUZW1wbGF0ZSh0cnVlKX1cclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvdXRsaW5lLW5vbmUgYm9yZGVyLW5vbmUgdGV4dC1jZW50ZXIgbXItWzNweF1cIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZ2VhciBmYS1sZ1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB3aW5kb3cuaGlzdG9yeS5nbygtMil9XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0IG9wLWJ0bi1zbSBtci1bM3B4XVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIHt0KFwiYmFja1wiKX1cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNNYWlsU2VuZCAmJiB0cnVlfVxyXG4gICAgICAgICAgICAgICAgICBkYXRhLXR1dD1cImhlYWRlckFyZWFcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnkgb3AtYnRuLXNtIG1yLVszcHhdXCJcclxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gYWxlcnRTZW5kRW1haWwoKX1cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAge2NvbXBsZXRlQnRuVGl0bGVcclxuICAgICAgICAgICAgICAgICAgICA/IGNvbXBsZXRlQnRuVGl0bGVcclxuICAgICAgICAgICAgICAgICAgICA6IGlzTWFpbFNlbmRcclxuICAgICAgICAgICAgICAgICAgICAgID8gdChcInNlbnRcIilcclxuICAgICAgICAgICAgICAgICAgICAgIDogdChcInNlbmRcIil9XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICApIDogaXNQZGZSZXF1ZXN0RmlsZXMgPyAoXHJcbiAgICAgICAgICAgIGFscmVhZHlTaWduID8gKFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gaGFuZGxlVG9QcmludChlLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpfVxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1uZXV0cmFsIG9wLWJ0bi1zbSBtci1bM3B4XSBzaGFkb3dcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXByaW50IHB5LVszcHhdXCJcclxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj57dChcInByaW50XCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAge2lzQ29tcGxldGVkICYmIChcclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlKHBkZkRldGFpbHMsIHNldElzRG93bmxvYWRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tc2Vjb25kYXJ5IG9wLWJ0bi1zbSBtci1bM3B4XSBzaGFkb3dcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWF3YXJkIHB5LVszcHhdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj57dChcImNlcnRpZmljYXRlXCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1zbSBtci1bM3B4XSBzaGFkb3dcIlxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkUGRmKHBkZkRldGFpbHMsIHBkZlVybCwgc2V0SXNEb3dubG9hZGluZylcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWRvd25sb2FkIHB5LVszcHhdXCJcclxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj57dChcImRvd25sb2FkXCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleFwiIGRhdGEtdHV0PVwicmVhY3RvdXJGaWZ0aFwiPlxyXG4gICAgICAgICAgICAgICAgeyF0ZW1wbGF0ZUlkICYmIChcclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHdpbmRvdy5oaXN0b3J5LmdvKC0yKX1cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0IG9wLWJ0bi1zbSBtci1bM3B4XVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7dChcImJhY2tcIil9XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIHtjdXJyZW50U2lnbmVyICYmIChcclxuICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICB7dGVtcGxhdGVJZCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRQZGYoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdCBvcC1idG4tc20gbXItWzNweF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj57dChcImRvd25sb2FkXCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnkgb3AtYnRuLXNtIG1yLVszcHhdIHNoYWRvd1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVEZWNsaW5lUGRmQWxlcnQoKX1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7dChcImRlY2xpbmVcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnkgb3AtYnRuLXNtIG1yLVszcHhdIHNoYWRvd1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBlbWJlZFdpZGdldHNEYXRhKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3QoXCJmaW5pc2hcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgeyF0ZW1wbGF0ZUlkICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tbmV1dHJhbCBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZFBkZihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0Rvd25sb2FkaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWFycm93LWRvd24gZm9udC1zZW1pYm9sZCBsZzpoaWRkZW5cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPnt0KFwiZG93bmxvYWRcIil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApIDogaXNDb21wbGV0ZWQgPyAoXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICAgIHtpc0NvbXBsZXRlZCAmJiAoXHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkQ2VydGlmaWNhdGUocGRmRGV0YWlscywgc2V0SXNEb3dubG9hZGluZylcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXNlY29uZGFyeSBvcC1idG4tc20gZ2FwLTAgZm9udC1tZWRpdW0gdGV4dC1bMTJweF0gbXItWzNweF0gc2hhZG93XCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXdhcmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9jayBtbC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3QoXCJjZXJ0aWZpY2F0ZVwiKX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gaGFuZGxlVG9QcmludChlLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpfVxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLW5ldXRyYWwgb3AtYnRuLXNtIGdhcC0wIGZvbnQtbWVkaXVtIHRleHQtWzEycHhdIG1yLVszcHhdIHNoYWRvd1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtcHJpbnRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2sgbWwtMVwiPnt0KFwicHJpbnRcIil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1zbSBnYXAtMCBmb250LW1lZGl1bSB0ZXh0LVsxMnB4XSBtci1bM3B4XSBzaGFkb3dcIlxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRQZGYocGRmRGV0YWlscywgcGRmVXJsLCBzZXRJc0Rvd25sb2FkaW5nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWRvd25sb2FkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrIG1sLTFcIj57dChcImRvd25sb2FkXCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4taW5mbyBvcC1idG4tc20gZ2FwLTAgZm9udC1tZWRpdW0gdGV4dC1bMTJweF0gbXItWzNweF0gc2hhZG93XCJcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRW1haWwodHJ1ZSl9XHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZW52ZWxvcGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2sgbWwtMVwiPnt0KFwibWFpbFwiKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgKSA6IGlzUHVibGljVGVtcGxhdGUgPyAoXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1zbSAgc2hhZG93XCJcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGVtYmVkV2lkZ2V0c0RhdGEoKX1cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7dChcInNpZ24tbm93XCIpfVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHdpbmRvdy5oaXN0b3J5LmdvKC0yKX1cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdCBvcC1idG4tc20gbXItWzNweF1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt0KFwiYmFja1wiKX1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gbXItWzNweF1cIlxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZW1iZWRXaWRnZXRzRGF0YSgpfVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt0KFwiZmluaXNoXCIpfVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICl9XHJcbiAgICAgIHtpc0Rvd25sb2FkaW5nID09PSBcInBkZlwiICYmIChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIHotWzIwMF0gaW5zZXQtMCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBiZy1ibGFjayBiZy1vcGFjaXR5LTMwXCI+XHJcbiAgICAgICAgICA8TG9hZGVyIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICl9XHJcbiAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgaXNPcGVuPXtpc0Rvd25sb2FkaW5nID09PSBcImNlcnRpZmljYXRlXCJ9XHJcbiAgICAgICAgdGl0bGU9e1xyXG4gICAgICAgICAgaXNEb3dubG9hZGluZyA9PT0gXCJjZXJ0aWZpY2F0ZVwiXHJcbiAgICAgICAgICAgID8gdChcImdlbmVyYXRpbmctY2VydGlmaWNhdGVcIilcclxuICAgICAgICAgICAgOiB0KFwicGRmLWRvd25sb2FkXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhhbmRsZUNsb3NlPXsoKSA9PiBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpfVxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTMgbWQ6cC01IHRleHQtWzEzcHhdIG1kOnRleHQtYmFzZSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UtY29udGVudFwiPlxyXG4gICAgICAgICAge2lzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIn17XCIgXCJ9XHJcbiAgICAgICAgICA8cD57dChcImdlbmVyYXRlLWNlcnRpZmljYXRlLWFsZXJ0XCIpfTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9Nb2RhbFVpPlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSGVhZGVyO1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XG5cbmZ1bmN0aW9uIFBkZlpvb20ocHJvcHMpIHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xuXG4gIHJldHVybiAoXG4gICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmZsZXggZmxleC1jb2wgZ2FwLTEgdGV4dC1jZW50ZXIgbWQ6dy1bNSVdIG10LVs0M3B4XSAyeGw6bXQtWzYzcHhdXCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzc05hbWU9XCJiZy1ncmF5LTUwIHB4LVs0cHhdIDJ4bDpweC1bMTVweF0gMnhsOnB5LVsxMHB4XSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHByb3BzLmNsaWNrT25ab29tSW4oKX1cbiAgICAgICAgdGl0bGU9e3QoXCJ6b29tLWluXCIpfVxuICAgICAgPlxuICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1tYWduaWZ5aW5nLWdsYXNzLXBsdXMgdGV4dC1ncmF5LTUwMCAyeGw6dGV4dC1bMzBweF1cIj48L2k+XG4gICAgICA8L3NwYW4+XG4gICAgICB7IXByb3BzPy5pc0Rpc2FibGVSb3RhdGUgJiYgKFxuICAgICAgICA8PlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJiZy1ncmF5LTUwIHB4LVs0cHhdIDJ4bDpweC1bMTVweF0gMnhsOnB5LVsxMHB4XSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5oYW5kbGVSb3RhdGlvbkZ1big5MCl9XG4gICAgICAgICAgICB0aXRsZT17dChcInJvdGF0ZS1yaWdodFwiKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1yb3RhdGUtcmlnaHQgdGV4dC1ncmF5LTUwMCAyeGw6dGV4dC1bMzBweF1cIj48L2k+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJiZy1ncmF5LTUwIHB4LVs0cHhdIDJ4bDpweC1bMTVweF0gMnhsOnB5LVsxMHB4XSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICB0aXRsZT17dChcInJvdGF0ZS1sZWZ0XCIpfVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gcHJvcHMuaGFuZGxlUm90YXRpb25GdW4oLTkwKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1yb3RhdGUtbGVmdCB0ZXh0LWdyYXktNTAwIDJ4bDp0ZXh0LVszMHB4XVwiPjwvaT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvPlxuICAgICAgKX1cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzTmFtZT1cImJnLWdyYXktNTAgcHgtWzRweF0gMnhsOnB4LVsxNXB4XSAyeGw6cHktWzEwcHhdXCJcbiAgICAgICAgb25DbGljaz17KCkgPT4gcHJvcHMuY2xpY2tPblpvb21PdXQoKX1cbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBjdXJzb3I6IHByb3BzLnpvb21QZXJjZW50ID4gMCA/IFwicG9pbnRlclwiIDogXCJkZWZhdWx0XCJcbiAgICAgICAgfX1cbiAgICAgICAgdGl0bGU9e3QoXCJ6b29tLW91dFwiKX1cbiAgICAgID5cbiAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtbWFnbmlmeWluZy1nbGFzcy1taW51cyB0ZXh0LWdyYXktNTAwIDJ4bDp0ZXh0LVszMHB4XVwiPjwvaT5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBkZlpvb207XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgQm9yZGVyUmVzaXplIGZyb20gXCIuL0JvcmRlclJlc2l6ZVwiO1xyXG5pbXBvcnQgUGxhY2Vob2xkZXJCb3JkZXIgZnJvbSBcIi4vUGxhY2Vob2xkZXJCb3JkZXJcIjtcclxuaW1wb3J0IHsgUm5kIH0gZnJvbSBcInJlYWN0LXJuZFwiO1xyXG5pbXBvcnQge1xyXG4gIGRlZmF1bHRXaWR0aEhlaWdodCxcclxuICBmb250Q29sb3JBcnIsXHJcbiAgZm9udHNpemVBcnIsXHJcbiAgZ2V0Q29udGFpbmVyU2NhbGUsXHJcbiAgaGFuZGxlQ29weU5leHRUb1dpZGdldCxcclxuICBpc1RhYkFuZE1vYmlsZSxcclxuICBvbkNoYW5nZUlucHV0LFxyXG4gIHJhZGlvQnV0dG9uV2lkZ2V0LFxyXG4gIHRleHRJbnB1dFdpZGdldCxcclxuICB0ZXh0V2lkZ2V0XHJcbn0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L1V0aWxzXCI7XHJcbmltcG9ydCBQbGFjZWhvbGRlclR5cGUgZnJvbSBcIi4vUGxhY2Vob2xkZXJUeXBlXCI7XHJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5pbXBvcnQgXCIuLi8uLi9zdHlsZXMvb3BlbnNpZ25kcml2ZS5jc3NcIjtcclxuaW1wb3J0IE1vZGFsVWkgZnJvbSBcIi4uLy4uL3ByaW1pdGl2ZXMvTW9kYWxVaVwiO1xyXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XHJcblxyXG5jb25zdCBzZWxlY3RGb3JtYXQgPSAoZGF0YSkgPT4ge1xyXG4gIHN3aXRjaCAoZGF0YSkge1xyXG4gICAgY2FzZSBcIkxcIjpcclxuICAgICAgcmV0dXJuIFwiTU0vZGQveXl5eVwiO1xyXG4gICAgY2FzZSBcIkRELU1NLVlZWVlcIjpcclxuICAgICAgcmV0dXJuIFwiZGQtTU0teXl5eVwiO1xyXG4gICAgY2FzZSBcIkREL01NL1lZWVlcIjpcclxuICAgICAgcmV0dXJuIFwiZGQvTU0veXl5eVwiO1xyXG4gICAgY2FzZSBcIkxMXCI6XHJcbiAgICAgIHJldHVybiBcIk1NTU0gZGQsIHl5eXlcIjtcclxuICAgIGNhc2UgXCJERCBNTU0sIFlZWVlcIjpcclxuICAgICAgcmV0dXJuIFwiZGQgTU1NLCB5eXl5XCI7XHJcbiAgICBjYXNlIFwiWVlZWS1NTS1ERFwiOlxyXG4gICAgICByZXR1cm4gXCJ5eXl5LU1NLWRkXCI7XHJcbiAgICBjYXNlIFwiTU0tREQtWVlZWVwiOlxyXG4gICAgICByZXR1cm4gXCJNTS1kZC15eXl5XCI7XHJcbiAgICBjYXNlIFwiTU0uREQuWVlZWVwiOlxyXG4gICAgICByZXR1cm4gXCJNTS5kZC55eXl5XCI7XHJcbiAgICBjYXNlIFwiTU1NIERELCBZWVlZXCI6XHJcbiAgICAgIHJldHVybiBcIk1NTSBkZCwgeXl5eVwiO1xyXG4gICAgY2FzZSBcIkREIE1NTU0sIFlZWVlcIjpcclxuICAgICAgcmV0dXJuIFwiZGQgTU1NTSwgeXl5eVwiO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIFwiTU0vZGQveXl5eVwiO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGNoYW5nZURhdGVUb01vbWVudEZvcm1hdCA9IChmb3JtYXQpID0+IHtcclxuICBzd2l0Y2ggKGZvcm1hdCkge1xyXG4gICAgY2FzZSBcIk1NL2RkL3l5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiTFwiO1xyXG4gICAgY2FzZSBcImRkLU1NLXl5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiREQtTU0tWVlZWVwiO1xyXG4gICAgY2FzZSBcImRkL01NL3l5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiREQvTU0vWVlZWVwiO1xyXG4gICAgY2FzZSBcIk1NTU0gZGQsIHl5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiTExcIjtcclxuICAgIGNhc2UgXCJkZCBNTU0sIHl5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiREQgTU1NLCBZWVlZXCI7XHJcbiAgICBjYXNlIFwieXl5eS1NTS1kZFwiOlxyXG4gICAgICByZXR1cm4gXCJZWVlZLU1NLUREXCI7XHJcbiAgICBjYXNlIFwiTU0tZGQteXl5eVwiOlxyXG4gICAgICByZXR1cm4gXCJNTS1ERC1ZWVlZXCI7XHJcbiAgICBjYXNlIFwiTU0uZGQueXl5eVwiOlxyXG4gICAgICByZXR1cm4gXCJNTS5ERC5ZWVlZXCI7XHJcbiAgICBjYXNlIFwiTU1NIGRkLCB5eXl5XCI6XHJcbiAgICAgIHJldHVybiBcIk1NTSBERCwgWVlZWVwiO1xyXG4gICAgY2FzZSBcImRkIE1NTU0sIHl5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiREQgTU1NTSwgWVlZWVwiO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIFwiTFwiO1xyXG4gIH1cclxufTtcclxuXHJcbi8vZnVuY3Rpb24gdG8gZ2V0IGRlZmF1bHQgZGF0ZVxyXG5jb25zdCBnZXREZWZhdWx0ZGF0ZSA9IChzZWxlY3RlZERhdGUsIGZvcm1hdCA9IFwiZGQtTU0teXl5eVwiKSA9PiB7XHJcbiAgbGV0IGRhdGU7XHJcbiAgaWYgKGZvcm1hdCAmJiBmb3JtYXQgPT09IFwiZGQtTU0teXl5eVwiKSB7XHJcbiAgICBjb25zdCBuZXdkYXRlID0gc2VsZWN0ZWREYXRlXHJcbiAgICAgID8gc2VsZWN0ZWREYXRlXHJcbiAgICAgIDogbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdChjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQoZm9ybWF0KSk7XHJcbiAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSBuZXdkYXRlLnNwbGl0KFwiLVwiKTtcclxuICAgIGRhdGUgPSBuZXcgRGF0ZShgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gKTtcclxuICB9IGVsc2Uge1xyXG4gICAgZGF0ZSA9IG5ldyBEYXRlKHNlbGVjdGVkRGF0ZSk7XHJcbiAgfVxyXG4gIGNvbnN0IHZhbHVlID0gZGF0ZTtcclxuICByZXR1cm4gdmFsdWU7XHJcbn07XHJcbi8vZnVuY3Rpb24gdG8gZ2V0IGRlZmF1bHQgZm9ybWF0XHJcbmNvbnN0IGdldERlZmF1bHRGb3JtYXQgPSAoZGF0ZUZvcm1hdCkgPT4gZGF0ZUZvcm1hdCB8fCBcIk1NL2RkL3l5eXlcIjtcclxuXHJcbmZ1bmN0aW9uIFBsYWNlaG9sZGVyKHByb3BzKSB7XHJcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xyXG4gIGNvbnN0IFtwbGFjZWhvbGRlckJvcmRlciwgc2V0UGxhY2Vob2xkZXJCb3JkZXJdID0gdXNlU3RhdGUoeyB3OiAwLCBoOiAwIH0pO1xyXG4gIGNvbnN0IFtpc0RyYWdnaW5nRW5hYmxlZCwgc2V0RHJhZ2dpbmdFbmFibGVkXSA9IHVzZVN0YXRlKHRydWUpO1xyXG4gIGNvbnN0IFtpc0RhdGVNb2RhbCwgc2V0SXNEYXRlTW9kYWxdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtjb250YWluZXJTY2FsZSwgc2V0Q29udGFpbmVyU2NhbGVdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbc2VsZWN0RGF0ZSwgc2V0U2VsZWN0RGF0ZV0gPSB1c2VTdGF0ZSh7XHJcbiAgICBkYXRlOlxyXG4gICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJkYXRlXCJcclxuICAgICAgICA/IG1vbWVudChcclxuICAgICAgICAgICAgZ2V0RGVmYXVsdGRhdGUoXHJcbiAgICAgICAgICAgICAgcHJvcHM/LnBvcz8ub3B0aW9ucz8ucmVzcG9uc2UsXHJcbiAgICAgICAgICAgICAgcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXRcclxuICAgICAgICAgICAgKS5nZXRUaW1lKClcclxuICAgICAgICAgICkuZm9ybWF0KFxyXG4gICAgICAgICAgICBjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXQpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgOiBcIlwiLFxyXG4gICAgZm9ybWF0OlxyXG4gICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJkYXRlXCJcclxuICAgICAgICA/IGdldERlZmF1bHRGb3JtYXQocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXQpXHJcbiAgICAgICAgOiBcIlwiXHJcbiAgfSk7XHJcbiAgY29uc3QgW2RhdGVGb3JtYXQsIHNldERhdGVGb3JtYXRdID0gdXNlU3RhdGUoW10pO1xyXG4gIGNvbnN0IFtjbGlja29uV2lkZ2V0LCBzZXRDbGlja29uV2lkZ2V0XSA9IHVzZVN0YXRlKHt9KTtcclxuICBjb25zdCBbc3RhcnREYXRlLCBzZXRTdGFydERhdGVdID0gdXNlU3RhdGUoXHJcbiAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJkYXRlXCIgJiZcclxuICAgICAgZ2V0RGVmYXVsdGRhdGUoXHJcbiAgICAgICAgcHJvcHM/LnBvcz8ub3B0aW9ucz8ucmVzcG9uc2UsXHJcbiAgICAgICAgcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXRcclxuICAgICAgKVxyXG4gICk7XHJcbiAgY29uc3QgW2dldENoZWNrYm94UmVuZGVyV2lkdGgsIHNldEdldENoZWNrYm94UmVuZGVyV2lkdGhdID0gdXNlU3RhdGUoe1xyXG4gICAgd2lkdGg6IG51bGwsXHJcbiAgICBoZWlnaHQ6IG51bGxcclxuICB9KTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IGdldFBkZlBhZ2VXaWR0aCA9IHByb3BzLnBkZk9yaWdpbmFsV0guZmluZChcclxuICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gcHJvcHMucGFnZU51bWJlclxyXG4gICAgKTtcclxuICAgIHNldENvbnRhaW5lclNjYWxlKHByb3BzLmNvbnRhaW5lcldILndpZHRoIC8gZ2V0UGRmUGFnZVdpZHRoLndpZHRoKTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbcHJvcHMuY29udGFpbmVyV0gud2lkdGgsIHByb3BzLnBkZk9yaWdpbmFsV0hdKTtcclxuICBjb25zdCBkYXRlRm9ybWF0QXJyID0gW1xyXG4gICAgXCJMXCIsXHJcbiAgICBcIkRELU1NLVlZWVlcIixcclxuICAgIFwiWVlZWS1NTS1ERFwiLFxyXG4gICAgXCJNTS5ERC5ZWVlZXCIsXHJcbiAgICBcIk1NLURELVlZWVlcIixcclxuICAgIFwiTU1NIERELCBZWVlZXCIsXHJcbiAgICBcIkxMXCIsXHJcbiAgICBcIkREIE1NTSwgWVlZWVwiLFxyXG4gICAgXCJERCBNTU1NLCBZWVlZXCJcclxuICBdO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgdXBkYXRlV2lkdGggPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJuZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgaWYgKHJuZEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHJuZEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgc2V0R2V0Q2hlY2tib3hSZW5kZXJXaWR0aCh7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gRGVsYXkgdG8gZW5zdXJlIHJlbmRlcmluZyBpcyBjb21wbGV0ZVxyXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KHVwZGF0ZVdpZHRoLCAwKTtcclxuXHJcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICB9LCBbcHJvcHMucG9zXSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCBjbG9zZU1lbnVPbk91dHNpZGVDbGljayA9IChlKSA9PiB7XHJcbiAgICAgIGlmICghaXNEcmFnZ2luZ0VuYWJsZWQgJiYgIWUudGFyZ2V0LmNsb3Nlc3QoXCIjY2hhbmdlSXNEcmFnZ2luZ1wiKSkge1xyXG4gICAgICAgIHNldERyYWdnaW5nRW5hYmxlZCh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgY2xvc2VNZW51T25PdXRzaWRlQ2xpY2spO1xyXG5cclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIC8vIENsZWFudXAgdGhlIGV2ZW50IGxpc3RlbmVyIHdoZW4gdGhlIGNvbXBvbmVudCB1bm1vdW50c1xyXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgY2xvc2VNZW51T25PdXRzaWRlQ2xpY2spO1xyXG4gICAgfTtcclxuICB9LCBbaXNEcmFnZ2luZ0VuYWJsZWRdKTtcclxuICAvL2Z1bmN0aW9uIGNoYW5nZSBmb3JtYXQgYXJyYXkgbGlzdCB3aXRoIHNlbGVjdGVkIGRhdGUgYW5kIGZvcm1hdFxyXG4gIGNvbnN0IGNoYW5nZURhdGVGb3JtYXQgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB1cGRhdGVEYXRlID0gW107XHJcbiAgICBkYXRlRm9ybWF0QXJyLm1hcCgoZGF0YSkgPT4ge1xyXG4gICAgICBsZXQgZGF0ZTtcclxuICAgICAgaWYgKHNlbGVjdERhdGUgJiYgc2VsZWN0RGF0ZS5mb3JtYXQgPT09IFwiZGQtTU0teXl5eVwiKSB7XHJcbiAgICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gc2VsZWN0RGF0ZS5kYXRlLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICBkYXRlID0gbmV3IERhdGUoYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHNlbGVjdERhdGU/LmRhdGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0VGltZSgpO1xyXG4gICAgICBjb25zdCBuZXdEYXRlID0gbW9tZW50KG1pbGxpc2Vjb25kcykuZm9ybWF0KGRhdGEpO1xyXG4gICAgICBjb25zdCBkYXRlT2JqID0ge1xyXG4gICAgICAgIGRhdGU6IG5ld0RhdGUsXHJcbiAgICAgICAgZm9ybWF0OiBzZWxlY3RGb3JtYXQoZGF0YSlcclxuICAgICAgfTtcclxuICAgICAgdXBkYXRlRGF0ZS5wdXNoKGRhdGVPYmopO1xyXG4gICAgfSk7XHJcbiAgICBzZXREYXRlRm9ybWF0KHVwZGF0ZURhdGUpO1xyXG4gIH07XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMuaXNQbGFjZWhvbGRlciB8fCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZikge1xyXG4gICAgICBzZWxlY3REYXRlICYmIGNoYW5nZURhdGVGb3JtYXQoKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbc2VsZWN0RGF0ZV0pO1xyXG5cclxuICAvL2BoYW5kbGVXaWRnZXRJZGFuZFBvcHVwYCBpcyB1c2VkIHRvIHNldCBjdXJyZW50IHdpZGdldCBpZCBhbmQgb3BlbiByZWxhdGl2ZSBwb3B1cFxyXG4gIGNvbnN0IGhhbmRsZVdpZGdldElkYW5kUG9wdXAgPSAoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMuc2V0U2VsZWN0V2lkZ2V0SWQpIHtcclxuICAgICAgcHJvcHMuc2V0U2VsZWN0V2lkZ2V0SWQocHJvcHMucG9zLmtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgd2lkZ2V0VHlwZUV4aXN0ID0gW1xyXG4gICAgICB0ZXh0SW5wdXRXaWRnZXQsXHJcbiAgICAgIFwiY2hlY2tib3hcIixcclxuICAgICAgXCJuYW1lXCIsXHJcbiAgICAgIFwiY29tcGFueVwiLFxyXG4gICAgICBcImpvYiB0aXRsZVwiLFxyXG4gICAgICBcImRhdGVcIixcclxuICAgICAgXCJlbWFpbFwiLFxyXG4gICAgICB0ZXh0V2lkZ2V0XHJcbiAgICBdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKTtcclxuXHJcbiAgICBpZiAod2lkZ2V0VHlwZUV4aXN0KSB7XHJcbiAgICAgIHNldERyYWdnaW5nRW5hYmxlZChmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoKHByb3BzLmlzTmVlZFNpZ24gfHwgcHJvcHMuaXNTaWduWW91cnNlbGYpICYmICFwcm9wcy5pc0RyYWdnaW5nKSB7XHJcbiAgICAgIGlmIChwcm9wcz8uaXNwdWJsaWNUZW1wbGF0ZSkge1xyXG4gICAgICAgIHByb3BzLmhhbmRsZVVzZXJEZXRhaWxzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHByb3BzLnBvcy50eXBlKSB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcInNpZ25hdHVyZVwiIHx8XHJcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcInN0YW1wXCIgfHxcclxuICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiaW1hZ2VcIlxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHByb3BzLnNldElzU2lnblBhZCh0cnVlKTtcclxuICAgICAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChwcm9wcy5wb3MuaXNTdGFtcCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnBvcy50eXBlID09PSBcImluaXRpYWxzXCIpIHtcclxuICAgICAgICAgICAgcHJvcHMuc2V0SXNTaWduUGFkKHRydWUpO1xyXG4gICAgICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICAgICAgICBwcm9wcy5zZXRJc1N0YW1wKHByb3BzLnBvcy5pc1N0YW1wKTtcclxuICAgICAgICAgICAgcHJvcHMuc2V0SXNJbml0aWFsKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwcm9wcy5zZXRJc1NpZ25QYWQodHJ1ZSk7XHJcbiAgICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChwcm9wcy5wb3M/LmlzU3RhbXAgPyBwcm9wcy5wb3MuaXNTdGFtcCA6IGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHByb3BzLmlzUGxhY2Vob2xkZXIgJiZcclxuICAgICAgIXByb3BzLmlzRHJhZ2dpbmcgJiZcclxuICAgICAgcHJvcHMucG9zLnR5cGUgIT09IHRleHRXaWRnZXRcclxuICAgICkge1xyXG4gICAgICBpZiAocHJvcHMucG9zLmtleSA9PT0gcHJvcHMuc2VsZWN0V2lkZ2V0SWQpIHtcclxuICAgICAgICBwcm9wcy5oYW5kbGVMaW5rVXNlcihwcm9wcy5kYXRhLklkKTtcclxuICAgICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcy5kYXRhLklkKTtcclxuICAgICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcclxuICAgICAgICAgIChkYXRhKSA9PiBkYXRhLklkID09PSBwcm9wcy5kYXRhLklkXHJcbiAgICAgICAgKTtcclxuICAgICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoIXByb3BzLnBvcy50eXBlKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAhcHJvcHMucG9zLnR5cGUgJiZcclxuICAgICAgICBwcm9wcy5pc05lZWRTaWduICYmXHJcbiAgICAgICAgcHJvcHMuZGF0YS5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWRcclxuICAgICAgKSB7XHJcbiAgICAgICAgcHJvcHMuc2V0SXNTaWduUGFkKHRydWUpO1xyXG4gICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XHJcbiAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChwcm9wcy5wb3MuaXNTdGFtcCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMucG9zLnR5cGUgPT09IFwic2lnbmF0dXJlXCIpIHx8XHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwic3RhbXBcIlxyXG4gICAgICApIHtcclxuICAgICAgICBwcm9wcy5zZXRJc1NpZ25QYWQodHJ1ZSk7XHJcbiAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgICBwcm9wcy5zZXRJc1N0YW1wKHByb3BzLnBvcy5pc1N0YW1wKTtcclxuICAgICAgfSBlbHNlIGlmIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLnBvcy50eXBlID09PSBcImRyb3Bkb3duXCIpIHtcclxuICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIgPSAoKSA9PiB7XHJcbiAgICBwcm9wcy5zZXRDdXJyV2lkZ2V0c0RldGFpbHMgJiYgcHJvcHMuc2V0Q3VycldpZGdldHNEZXRhaWxzKHByb3BzLnBvcyk7XHJcbiAgICBpZiAoIXByb3BzLmlzTmVlZFNpZ24pIHtcclxuICAgICAgcHJvcHMuc2V0V2lkZ2V0VHlwZShwcm9wcy5wb3MudHlwZSk7XHJcbiAgICB9XHJcbiAgICBpZiAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpIHtcclxuICAgICAgaGFuZGxlV2lkZ2V0SWRhbmRQb3B1cCgpO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgcHJvcHM/LmlzTmVlZFNpZ24gJiZcclxuICAgICAgcHJvcHM/LnVuaXF1ZUlkICYmXHJcbiAgICAgIHByb3BzLmRhdGE/LklkID09PSBwcm9wcz8udW5pcXVlSWRcclxuICAgICkge1xyXG4gICAgICBoYW5kbGVXaWRnZXRJZGFuZFBvcHVwKCk7XHJcbiAgICB9IGVsc2UgaWYgKHByb3BzLmlzUGxhY2Vob2xkZXIgfHwgcHJvcHMuaXNTaWduWW91cnNlbGYpIHtcclxuICAgICAgaGFuZGxlV2lkZ2V0SWRhbmRQb3B1cCgpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgLy9gaGFuZGxlT25DbGlja1NldHRpbmdJY29uYCBpcyB1c2VkIHNldCBjdXJyZW50IHdpZGdldCBkZXRhaWxzIGFuZCBvcGVuIHNldHRpbmcgb2YgaXRcclxuICBjb25zdCBoYW5kbGVPbkNsaWNrU2V0dGluZ0ljb24gPSAoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMucG9zLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0KSB7XHJcbiAgICAgIHByb3BzLnNldElzUmFkaW8odHJ1ZSk7XHJcbiAgICB9IGVsc2UgaWYgKHByb3BzLnBvcy50eXBlID09PSBcImRyb3Bkb3duXCIpIHtcclxuICAgICAgcHJvcHM/LnNldFNob3dEcm9wZG93bih0cnVlKTtcclxuICAgIH0gZWxzZSBpZiAocHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICBwcm9wcz8uc2V0SXNDaGVja2JveCh0cnVlKTtcclxuICAgIH1cclxuICAgIC8vY29uZGl0aW9uIHRvIGhhbmRsZSBzZXR0aW5nIGljb24gZm9yIHNpZ255b3VyLXNlbGYgZmxvdyBmb3IgYWxsIHR5cGUgdGV4dCB3aWRnZXRzXHJcbiAgICBlbHNlIGlmIChcclxuICAgICAgW1xyXG4gICAgICAgIHRleHRJbnB1dFdpZGdldCxcclxuICAgICAgICB0ZXh0V2lkZ2V0LFxyXG4gICAgICAgIFwibmFtZVwiLFxyXG4gICAgICAgIFwiY29tcGFueVwiLFxyXG4gICAgICAgIFwiam9iIHRpdGxlXCIsXHJcbiAgICAgICAgXCJlbWFpbFwiXHJcbiAgICAgIF0uaW5jbHVkZXMocHJvcHMucG9zLnR5cGUpICYmXHJcbiAgICAgIHByb3BzLmlzU2lnbllvdXJzZWxmXHJcbiAgICApIHtcclxuICAgICAgcHJvcHMuaGFuZGxlVGV4dFNldHRpbmdNb2RhbCh0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHByb3BzPy5oYW5kbGVOYW1lTW9kYWwgJiYgcHJvcHM/LmhhbmRsZU5hbWVNb2RhbCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvL2NvbmRpdGlvbiBmb3Igb25seSBwbGFjZWhvbGRlciBhbmQgdGVtcGxhdGUgZmxvd1xyXG4gICAgaWYgKHByb3BzLmRhdGEgJiYgcHJvcHM/LnBvcz8udHlwZSAhPT0gdGV4dFdpZGdldCkge1xyXG4gICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcz8uZGF0YT8uSWQpO1xyXG4gICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcclxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xyXG4gICAgfVxyXG4gICAgLy9jb25kaXRpb24gdG8gaGFuZGxlIGluIHBsYWNlaG9sZGVyIGFuZCB0ZW1wbGF0ZSBmbG93IGZvciB0ZXh0IHdpZGdldCBzaWduZXJJZCBmb3IgdGV4dCB3aWRnZXRzIGkgaGF2ZSB0byBzZXQgdW5pcXVlSWQgaW4gdGVtcFNpZ25lcklkIGJlY2F1c2VcclxuICAgIC8vaXQgZG9lcyBub3QgaGF2ZSBhbnkgc2lnbmVyIHVzZXIgYW5kIGFueSBzaWduZXJvYmpJZFxyXG4gICAgZWxzZSBpZiAocHJvcHMuZGF0YSAmJiBwcm9wcy5wb3MudHlwZSA9PT0gdGV4dFdpZGdldCkge1xyXG4gICAgICBwcm9wcy5zZXRUZW1wU2lnbmVySWQocHJvcHMudW5pcXVlSWQpO1xyXG4gICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcz8uZGF0YT8uSWQpO1xyXG4gICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcclxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxyXG4gICAgICApO1xyXG4gICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XHJcbiAgICB9XHJcbiAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xyXG4gICAgcHJvcHMuc2V0V2lkZ2V0VHlwZShwcm9wcy5wb3MudHlwZSk7XHJcbiAgICBwcm9wcy5zZXRDdXJyV2lkZ2V0c0RldGFpbHMocHJvcHMucG9zKTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gdG8gc2V0IHJlcXVpcmVkIHN0YXRlIHZhbHVlIG9uY2xpY2sgb24gd2lkZ2V0J3MgY29weSBpY29uXHJcbiAgY29uc3QgaGFuZGxlQ29weVBsYWNlaG9sZGVyID0gKGUpID0+IHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgdGV4dCB3aWRnZXQgc2lnbmVyIG9iaiBpZCBhbmQgdW5pcXVlIGlkXHJcbiAgICAvL3doZW4gdXNlciBjbGljayBvbiBjb3B5IGljb24gb2YgdGV4dCB3aWRnZXQgaW4gdGhhdCBjb25kaXRpb24gdGV4dCB3aWRnZXQgZG9lcyBub3QgaGF2ZSBhbnkgc2lnbmVyT2JqSWRcclxuICAgIC8vaW4gdGhhdCBjYXNlIGkgaGF2ZSB0byBzYXZlIGluIHRlbXBTaWduZXJJZCBhcyBhIHVuaXF1ZSBpZCBvZiBwcmV2aW91cyBzZWxlY3Qgc2lnbmVyJ3MgdW5pcXVlIGlkXHJcbiAgICAvL2FuZCBvbiBzYXZlIG9yIGNhbmNlbCBidXR0b24gb2YgY29weSBhbGwgcGFnZSBwb3B1cCBpIGhhdmUgc2V0IHRoaXMgdGVtcCBzaWduZXIgSWQgaW4gdW5pcXVlIGlkXHJcblxyXG4gICAgaWYgKHByb3BzLmRhdGEgJiYgcHJvcHM/LnBvcz8udHlwZSAhPT0gdGV4dFdpZGdldCkge1xyXG4gICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcz8uZGF0YT8uSWQpO1xyXG4gICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcclxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xyXG4gICAgfSBlbHNlIGlmIChwcm9wcy5kYXRhICYmIHByb3BzLnBvcy50eXBlID09PSB0ZXh0V2lkZ2V0KSB7XHJcbiAgICAgIHByb3BzLnNldFRlbXBTaWduZXJJZChwcm9wcy51bmlxdWVJZCk7XHJcbiAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzPy5kYXRhPy5JZCk7XHJcbiAgICAgIGNvbnN0IGNoZWNrSW5kZXggPSBwcm9wcy54eVBvc3Rpb24uZmluZEluZGV4KFxyXG4gICAgICAgIChkYXRhKSA9PiBkYXRhLklkID09PSBwcm9wcy5kYXRhLklkXHJcbiAgICAgICk7XHJcbiAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvL2NoZWNraW5nIHdpZGdldCdzIHR5cGUgYW5kIG9wZW4gd2lkZ2V0IGNvcHkgbW9kYWwgZm9yIHJlcXVpcmVkIHdpZGdldHNcclxuICAgIGlmIChcclxuICAgICAgW1wic2lnbmF0dXJlXCIsIHRleHRXaWRnZXQsIFwic3RhbXBcIiwgXCJpbml0aWFsXCJdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKVxyXG4gICAgKSB7XHJcbiAgICAgIHByb3BzLnNldElzUGFnZUNvcHkodHJ1ZSk7XHJcbiAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL2Z1bmN0aW9uIHRvIGNyZWF0ZSBuZXcgd2lkZ2V0IG5leHQgdG8ganVzdCB3aWRnZXRcclxuICAgICAgaGFuZGxlQ29weU5leHRUb1dpZGdldChcclxuICAgICAgICBwcm9wcy5wb3MsXHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUsXHJcbiAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxyXG4gICAgICAgIHByb3BzLmluZGV4LFxyXG4gICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcclxuICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLy9mdW5jdGlvbiB0byBzYXZlIGRhdGUgYW5kIGZvcm1hdCBvbiBsb2NhbCBhcnJheSBvbmNoYW5nZSBkYXRlIGFuZCBvbmNsaWNrIGZvcm1hdFxyXG4gIGNvbnN0IGhhbmRsZVNhdmVEYXRlID0gKGRhdGEsIGlzRGF0ZUNoYW5nZSkgPT4ge1xyXG4gICAgbGV0IHVwZGF0ZURhdGUgPSBkYXRhLmRhdGU7XHJcbiAgICAvL2NoZWNrIGlmIGRhdGUgY2hhbmdlIGJ5IHVzZXJcclxuICAgIGlmIChpc0RhdGVDaGFuZ2UpIHtcclxuICAgICAgLy9gY2hhbmdlRGF0ZVRvTW9tZW50Rm9ybWF0YCBpcyB1c2VkIHRvIGNvbnZlcnQgZGF0ZSBhcyBwZXIgcmVxdWlyZWQgdG8gbW9tZW50IHBhY2thZ2VcclxuICAgICAgdXBkYXRlRGF0ZSA9IG1vbWVudChkYXRhLmRhdGUpLmZvcm1hdChcclxuICAgICAgICBjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQoZGF0YS5mb3JtYXQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICAvL3VzaW5nIG1vbWVudCBwYWNrYWdlIGlzIHVzZWQgdG8gY2hhbmdlIGRhdGUgYXMgcGVyIHRoZSBmb3JtYXQgcHJvdmlkZWQgaW4gc2VsZWN0RGF0ZSBvYmogZS5nLiAtIE1NL2RkL3l5eXkgLT4gMDMvMTIvMjAyNFxyXG4gICAgLy9gZ2V0RGVmYXVsdGRhdGVgIGlzIHVzZWQgdG8gY29udmVydCB1cGRhdGUgZGF0ZSBpbiBuZXcgRGF0ZSgpIGZvcm1hdFxyXG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudChcclxuICAgICAgZ2V0RGVmYXVsdGRhdGUodXBkYXRlRGF0ZSwgZGF0YT8uZm9ybWF0KS5nZXRUaW1lKClcclxuICAgICkuZm9ybWF0KGNoYW5nZURhdGVUb01vbWVudEZvcm1hdChkYXRhPy5mb3JtYXQpKTtcclxuXHJcbiAgICAvL2BvbkNoYW5nZUlucHV0YCBpcyB1c2VkIHRvIHNhdmUgZGF0YSByZWxhdGVkIHRvIGRhdGUgaW4gYSBwbGFjZWhvbGRlciBmaWVsZFxyXG4gICAgb25DaGFuZ2VJbnB1dChcclxuICAgICAgZGF0ZSxcclxuICAgICAgcHJvcHMucG9zLmtleSxcclxuICAgICAgcHJvcHMueHlQb3N0aW9uLFxyXG4gICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxyXG4gICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGEuSWQsXHJcbiAgICAgIGZhbHNlLFxyXG4gICAgICBkYXRhPy5mb3JtYXQsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIHByb3BzLmZvbnRTaXplIHx8IHByb3BzLnBvcz8ub3B0aW9ucz8uZm9udFNpemUgfHwgXCIxMlwiLFxyXG4gICAgICBwcm9wcy5mb250Q29sb3IgfHwgcHJvcHMucG9zPy5vcHRpb25zPy5mb250Q29sb3IgfHwgXCJibGFja1wiXHJcbiAgICApO1xyXG4gICAgc2V0U2VsZWN0RGF0ZSh7IGRhdGU6IGRhdGUsIGZvcm1hdDogZGF0YT8uZm9ybWF0IH0pO1xyXG4gIH07XHJcbiAgY29uc3QgUGxhY2Vob2xkZXJJY29uID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgcHJvcHMuaXNTaG93Qm9yZGVyICYmIChcclxuICAgICAgICA8PlxyXG4gICAgICAgICAgeyhwcm9wcy5pc1BsYWNlaG9sZGVyIHx8IHByb3BzLmlzU2lnbllvdXJzZWxmKSAmJiAoXHJcbiAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgey8qIGNvbmRpdGlvbiB0byBhZGQgc2V0dGluZyBpY29uIGZvciBzaWdueW91ci1zZWxmIGZsb3cgZm9yIHBhcnRpY3VsYXIgdGV4dCB3aWRnZXRzXHJcbiAgICAgICAgICAgIGFuZCBhbHNvIGl0IGhhdmUgZGlmZnJlbnQgcG9zaXRpb24gXHJcbiAgICAgICAgICAgICovfVxyXG4gICAgICAgICAgICAgIHtbXHJcbiAgICAgICAgICAgICAgICBcImNoZWNrYm94XCIsXHJcbiAgICAgICAgICAgICAgICB0ZXh0SW5wdXRXaWRnZXQsXHJcbiAgICAgICAgICAgICAgICB0ZXh0V2lkZ2V0LFxyXG4gICAgICAgICAgICAgICAgXCJuYW1lXCIsXHJcbiAgICAgICAgICAgICAgICBcImNvbXBhbnlcIixcclxuICAgICAgICAgICAgICAgIFwiam9iIHRpdGxlXCIsXHJcbiAgICAgICAgICAgICAgICBcImVtYWlsXCJcclxuICAgICAgICAgICAgICBdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKSAmJiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiA/IChcclxuICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbkNsaWNrU2V0dGluZ0ljb24oKTtcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbigpO1xyXG4gICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1nZWFyIGljb25cIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIiMxODhhZTJcIixcclxuICAgICAgICAgICAgICAgICAgICByaWdodDogXCIyOXB4XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBcIi0xOXB4XCJcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgIC8qIGNvbmRpdGlvbiB0byBhZGQgc2V0dGluZyBpY29uIGZvciBwbGFjZWhvbGRlciAmIHRlbXBsYXRlIGZsb3cgZm9yIGFsbCB3aWRnZXRzIGV4Y2VwdCBzaWduYXR1cmUgYW5kIGRhdGUgKi9cclxuICAgICAgICAgICAgICAgICgoIXByb3BzPy5wb3M/LnR5cGUgJiYgcHJvcHMucG9zLmlzU3RhbXApIHx8XHJcbiAgICAgICAgICAgICAgICAgIChwcm9wcz8ucG9zPy50eXBlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIVtcImRhdGVcIiwgXCJzaWduYXR1cmVcIl0uaW5jbHVkZXMocHJvcHMucG9zLnR5cGUpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIXByb3BzLmlzU2lnbllvdXJzZWxmKSkgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25DbGlja1NldHRpbmdJY29uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICBvblRvdWNoRW5kPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZ2VhciBpY29uXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwiIzE4OGFlMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHByb3BzPy5wb3M/LnR5cGUgPT09IHRleHRXaWRnZXQgPyBcIjMycHhcIiA6IFwiNDdweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdG9wOiBcIi0xOXB4XCJcclxuICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgey8qIGNvbmRpdGlvbiBmb3IgdXNlcmljb24gZm9yIGFsbCB3aWRnZXRzIGV4Y2VwdCB0ZXh0IHdpZGdldHMgYW5kIHNpZ255b3VyLXNlbGYgZmxvdyAqL31cclxuICAgICAgICAgICAgICB7cHJvcHMucG9zLnR5cGUgIT09IHRleHRXaWRnZXQgJiYgIXByb3BzLmlzU2lnbllvdXJzZWxmICYmIChcclxuICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwiYXNzaWduU2lnbmVyXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtdXNlciBpY29uXCJcclxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmhhbmRsZUxpbmtVc2VyKHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrSW5kZXggPSBwcm9wcy54eVBvc3Rpb24uZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmhhbmRsZUxpbmtVc2VyKHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrSW5kZXggPSBwcm9wcy54eVBvc3Rpb24uZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6IFwiIzE4OGFlMlwiLCByaWdodDogXCIzMnB4XCIsIHRvcDogXCItMThweFwiIH19XHJcbiAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgKX1cclxuICAgICAgICAgIHsvKiBzZXR0aW5nIGljb24gb25seSBmb3IgZGF0ZSB3aWRnZXRzICovfVxyXG4gICAgICAgICAge3Byb3BzLnBvcy50eXBlID09PSBcImRhdGVcIiAmJiBzZWxlY3REYXRlICYmIChcclxuICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcHJvcHMuc2V0Q3VycldpZGdldHNEZXRhaWxzKHByb3BzLnBvcyk7XHJcbiAgICAgICAgICAgICAgICBzZXRJc0RhdGVNb2RhbCghaXNEYXRlTW9kYWwpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHNldENsaWNrb25XaWRnZXQocHJvcHMucG9zKTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XHJcbiAgICAgICAgICAgICAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICBvblRvdWNoRW5kPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcHJvcHMuc2V0Q3VycldpZGdldHNEZXRhaWxzKHByb3BzLnBvcyk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgc2V0SXNEYXRlTW9kYWwoIWlzRGF0ZU1vZGFsKTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XHJcbiAgICAgICAgICAgICAgICAgIHByb3BzLnNldFVuaXF1ZUlkKHByb3BzLmRhdGEuSWQpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgekluZGV4OiBcIjk5XCIsXHJcbiAgICAgICAgICAgICAgICB0b3A6IFwiLTE4cHhcIixcclxuICAgICAgICAgICAgICAgIHJpZ2h0OiBwcm9wcy5pc1BsYWNlaG9sZGVyID8gXCI1MHB4XCIgOiBcIjMwcHhcIixcclxuICAgICAgICAgICAgICAgIGNvbG9yOiBcIiMxODhhZTJcIixcclxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiBcIjE0cHhcIlxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZ2VhciBpY29uXCJcclxuICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICl9XHJcbiAgICAgICAgICB7LyogY29weSBpY29uIGZvciBhbGwgd2lkZ2V0cyAqL31cclxuICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWNvcHkgaWNvblwiXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBoYW5kbGVDb3B5UGxhY2Vob2xkZXIoZSl9XHJcbiAgICAgICAgICAgIG9uVG91Y2hFbmQ9eyhlKSA9PiBoYW5kbGVDb3B5UGxhY2Vob2xkZXIoZSl9XHJcbiAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiBcIiMxODhhZTJcIiwgcmlnaHQ6IFwiMTJweFwiLCB0b3A6IFwiLTE4cHhcIiB9fVxyXG4gICAgICAgICAgPjwvaT5cclxuICAgICAgICAgIHsvKiBkZWxldGUgaWNvbiBmb3IgYWxsIHdpZGdldHMgKi99XHJcbiAgICAgICAgICA8aVxyXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1jaXJjbGUteG1hcmsgaWNvblwiXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAvL2NvbmRpdGlvbiBmb3IgdGVtcGxhdGUgYW5kIHBsYWNlaG9sZGVyIGZsb3dcclxuICAgICAgICAgICAgICBpZiAocHJvcHMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgcHJvcHMuaGFuZGxlRGVsZXRlU2lnbihwcm9wcy5wb3Mua2V5LCBwcm9wcy5kYXRhLklkKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy9jb25kaXRpb24gZm9yIHNpZ255b3VyLXNlbGYgZmxvd1xyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJvcHMuaGFuZGxlRGVsZXRlU2lnbihwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgICAgICAgICAgIHByb3BzLnNldElzU3RhbXAoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgLy9mb3IgbW9iaWxlIGFuZCB0YWJsZXQgdG91Y2ggZXZlbnRcclxuICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcclxuICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIGZvciB0ZW1wbGF0ZSBhbmQgcGxhY2Vob2xkZXIgZmxvd1xyXG4gICAgICAgICAgICAgIGlmIChwcm9wcy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVEZWxldGVTaWduKHByb3BzLnBvcy5rZXksIHByb3BzLmRhdGE/LklkKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy9jb25kaXRpb24gZm9yIHNpZ255b3VyLXNlbGYgZmxvd1xyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJvcHMuaGFuZGxlRGVsZXRlU2lnbihwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgICAgICAgICAgIHByb3BzLnNldElzU3RhbXAoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6IFwiIzE4OGFlMlwiLCByaWdodDogXCItOHB4XCIsIHRvcDogXCItMThweFwiIH19XHJcbiAgICAgICAgICA+PC9pPlxyXG4gICAgICAgIDwvPlxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH07XHJcbiAgY29uc3QgeFBvcyA9IChwb3MsIHNpZ25Zb3Vyc2VsZikgPT4ge1xyXG4gICAgY29uc3QgY29udGFpbmVyU2NhbGUgPSBnZXRDb250YWluZXJTY2FsZShcclxuICAgICAgcHJvcHMucGRmT3JpZ2luYWxXSCxcclxuICAgICAgcHJvcHMucGFnZU51bWJlcixcclxuICAgICAgcHJvcHMuY29udGFpbmVyV0hcclxuICAgICk7XHJcbiAgICBjb25zdCByZXNpemVQb3MgPSBwb3MueFBvc2l0aW9uO1xyXG4gICAgaWYgKHNpZ25Zb3Vyc2VsZikge1xyXG4gICAgICByZXR1cm4gcmVzaXplUG9zICogY29udGFpbmVyU2NhbGUgKiBwcm9wcy5zY2FsZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vY2hlY2tpbmcgYm90aCBjb25kaXRpb24gbW9iaWxlIGFuZCBkZXNrdG9wIHZpZXdcclxuICAgICAgaWYgKHBvcy5pc01vYmlsZSAmJiBwb3Muc2NhbGUpIHtcclxuICAgICAgICBpZiAocHJvcHMuc2NhbGUgPiAxKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzaXplUG9zICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGUgKiBwcm9wcy5zY2FsZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBpZiAocG9zLnNjYWxlID09PSBjb250YWluZXJTY2FsZSkge1xyXG4gICAgICAgIC8vICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZSAqIHByb3BzLnNjYWxlO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIGNvbnRhaW5lclNjYWxlICogcHJvcHMuc2NhbGU7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCB5UG9zID0gKHBvcywgc2lnbllvdXJzZWxmKSA9PiB7XHJcbiAgICBjb25zdCBjb250YWluZXJTY2FsZSA9IGdldENvbnRhaW5lclNjYWxlKFxyXG4gICAgICBwcm9wcy5wZGZPcmlnaW5hbFdILFxyXG4gICAgICBwcm9wcy5wYWdlTnVtYmVyLFxyXG4gICAgICBwcm9wcy5jb250YWluZXJXSFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHJlc2l6ZVBvcyA9IHBvcy55UG9zaXRpb247XHJcblxyXG4gICAgaWYgKHNpZ25Zb3Vyc2VsZikge1xyXG4gICAgICByZXR1cm4gcmVzaXplUG9zICogY29udGFpbmVyU2NhbGUgKiBwcm9wcy5zY2FsZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vY2hlY2tpbmcgYm90aCBjb25kaXRpb24gbW9iaWxlIGFuZCBkZXNrdG9wIHZpZXdcclxuICAgICAgaWYgKHBvcy5pc01vYmlsZSAmJiBwb3Muc2NhbGUpIHtcclxuICAgICAgICBpZiAocHJvcHMuc2NhbGUgPiAxKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzaXplUG9zICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGUgKiBwcm9wcy5zY2FsZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBlbHNlIGlmIChwb3Muc2NhbGUgPT09IGNvbnRhaW5lclNjYWxlKSB7XHJcbiAgICAgIC8vICAgaWYgKHByb3BzLnNjYWxlID4gMSkge1xyXG4gICAgICAvLyAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZSAqIHByb3BzLnNjYWxlO1xyXG4gICAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAgIC8vICAgICByZXR1cm4gcmVzaXplUG9zICogcG9zLnNjYWxlO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gcmVzaXplUG9zICogY29udGFpbmVyU2NhbGUgKiBwcm9wcy5zY2FsZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGdldEN1cnNvciA9ICgpID0+IHtcclxuICAgIGlmIChwcm9wcy5kYXRhICYmIHByb3BzLmlzTmVlZFNpZ24pIHtcclxuICAgICAgaWYgKHByb3BzPy5zaWduZXJPYmpJZCAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpIHtcclxuICAgICAgICByZXR1cm4gXCJwb2ludGVyXCI7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvcHM/LnVuaXF1ZUlkICYmIHByb3BzLmRhdGE/LklkID09PSBwcm9wcy51bmlxdWVJZCkge1xyXG4gICAgICAgIHJldHVybiBcInBvaW50ZXJcIjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gXCJub3QtYWxsb3dlZFwiO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCJhbGwtc2Nyb2xsXCI7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDw+XHJcbiAgICAgIDxSbmRcclxuICAgICAgICBpZD17cHJvcHMucG9zLmtleX1cclxuICAgICAgICBkYXRhLXR1dD17cHJvcHMucG9zLmtleSA9PT0gcHJvcHMudW5TaWduZWRXaWRnZXRJZCA/IFwiSXNTaWduZWRcIiA6IFwiXCJ9XHJcbiAgICAgICAga2V5PXtwcm9wcy5wb3Mua2V5fVxyXG4gICAgICAgIGxvY2tBc3BlY3RSYXRpbz17XHJcbiAgICAgICAgICAhW1xyXG4gICAgICAgICAgICB0ZXh0V2lkZ2V0LFxyXG4gICAgICAgICAgICBcImVtYWlsXCIsXHJcbiAgICAgICAgICAgIFwibmFtZVwiLFxyXG4gICAgICAgICAgICBcImNvbXBhbnlcIixcclxuICAgICAgICAgICAgXCJqb2IgdGl0bGVcIixcclxuICAgICAgICAgICAgdGV4dElucHV0V2lkZ2V0XHJcbiAgICAgICAgICBdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKSAmJlxyXG4gICAgICAgICAgKHByb3BzLnBvcy5XaWR0aFxyXG4gICAgICAgICAgICA/IHByb3BzLnBvcy5XaWR0aCAvIHByb3BzLnBvcy5IZWlnaHRcclxuICAgICAgICAgICAgOiBkZWZhdWx0V2lkdGhIZWlnaHQocHJvcHMucG9zLnR5cGUpLndpZHRoIC9cclxuICAgICAgICAgICAgICBkZWZhdWx0V2lkdGhIZWlnaHQocHJvcHMucG9zLnR5cGUpLmhlaWdodClcclxuICAgICAgICB9XHJcbiAgICAgICAgZW5hYmxlUmVzaXppbmc9e3tcclxuICAgICAgICAgIHRvcDogZmFsc2UsXHJcbiAgICAgICAgICByaWdodDogZmFsc2UsXHJcbiAgICAgICAgICBib3R0b206IGZhbHNlLFxyXG4gICAgICAgICAgbGVmdDogZmFsc2UsXHJcbiAgICAgICAgICB0b3BSaWdodDogZmFsc2UsXHJcbiAgICAgICAgICBib3R0b21SaWdodDpcclxuICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5pc05lZWRTaWduXHJcbiAgICAgICAgICAgICAgPyBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQgJiZcclxuICAgICAgICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgJiZcclxuICAgICAgICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSByYWRpb0J1dHRvbldpZGdldFxyXG4gICAgICAgICAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgICAgICAgICA6IGZhbHNlXHJcbiAgICAgICAgICAgICAgOiBwcm9wcy5wb3MudHlwZSAhPT0gcmFkaW9CdXR0b25XaWRnZXQgJiZcclxuICAgICAgICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgJiZcclxuICAgICAgICAgICAgICAgIHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkICYmXHJcbiAgICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgYm90dG9tTGVmdDogZmFsc2UsXHJcbiAgICAgICAgICB0b3BMZWZ0OiBmYWxzZVxyXG4gICAgICAgIH19XHJcbiAgICAgICAgYm91bmRzPVwicGFyZW50XCJcclxuICAgICAgICBjbGFzc05hbWU9XCJzaWduWW91cnNlbGZCbG9ja1wiXHJcbiAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgIGJvcmRlcjogXCIxcHggc29saWQgIzAwN2JmZlwiLFxyXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxyXG4gICAgICAgICAgdGV4dEFsaWduOlxyXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJuYW1lXCIgJiZcclxuICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IFwiY29tcGFueVwiICYmXHJcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImpvYiB0aXRsZVwiICYmXHJcbiAgICAgICAgICAgIFwiY2VudGVyXCIsXHJcbiAgICAgICAgICBjdXJzb3I6IGdldEN1cnNvcigpLFxyXG4gICAgICAgICAgekluZGV4OlxyXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJkYXRlXCJcclxuICAgICAgICAgICAgICA/IHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkXHJcbiAgICAgICAgICAgICAgICA/IDk5ICsgMVxyXG4gICAgICAgICAgICAgICAgOiA5OVxyXG4gICAgICAgICAgICAgIDogcHJvcHM/LnBvcz8uekluZGV4XHJcbiAgICAgICAgICAgICAgICA/IHByb3BzLnBvcy56SW5kZXhcclxuICAgICAgICAgICAgICAgIDogXCI1XCIsXHJcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBwcm9wcy5kYXRhID8gcHJvcHMuZGF0YS5ibG9ja0NvbG9yIDogXCJyZ2IoMjAzIDIzMyAyMzcpXCJcclxuICAgICAgICB9fVxyXG4gICAgICAgIG9uRHJhZz17KCkgPT4ge1xyXG4gICAgICAgICAgc2V0RHJhZ2dpbmdFbmFibGVkKHRydWUpO1xyXG4gICAgICAgICAgcHJvcHMuaGFuZGxlVGFiRHJhZyAmJiBwcm9wcy5oYW5kbGVUYWJEcmFnKHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICAgIH19XHJcbiAgICAgICAgc2l6ZT17e1xyXG4gICAgICAgICAgd2lkdGg6XHJcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCB8fFxyXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgPyBcImF1dG9cIlxyXG4gICAgICAgICAgICAgIDogcHJvcHMucG9zV2lkdGgocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiksXHJcbiAgICAgICAgICBoZWlnaHQ6XHJcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCB8fFxyXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgPyBcImF1dG9cIlxyXG4gICAgICAgICAgICAgIDogcHJvcHMucG9zSGVpZ2h0KHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpXHJcbiAgICAgICAgfX1cclxuICAgICAgICBvblJlc2l6ZVN0YXJ0PXsoKSA9PiB7XHJcbiAgICAgICAgICBzZXREcmFnZ2luZ0VuYWJsZWQodHJ1ZSk7XHJcbiAgICAgICAgICBwcm9wcy5zZXRJc1Jlc2l6ZSAmJiBwcm9wcy5zZXRJc1Jlc2l6ZSh0cnVlKTtcclxuICAgICAgICB9fVxyXG4gICAgICAgIG9uUmVzaXplU3RvcD17KGUsIGRpcmVjdGlvbiwgcmVmKSA9PiB7XHJcbiAgICAgICAgICBwcm9wcy5zZXRJc1Jlc2l6ZSAmJiBwcm9wcy5zZXRJc1Jlc2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICBwcm9wcy5oYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZSAmJlxyXG4gICAgICAgICAgICBwcm9wcy5oYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZShcclxuICAgICAgICAgICAgICByZWYsXHJcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcclxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxyXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxyXG4gICAgICAgICAgICAgIGNvbnRhaW5lclNjYWxlLFxyXG4gICAgICAgICAgICAgIHByb3BzLnNjYWxlLFxyXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YS5JZCxcclxuICAgICAgICAgICAgICBwcm9wcy5pc1Jlc2l6ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH19XHJcbiAgICAgICAgZGlzYWJsZURyYWdnaW5nPXtcclxuICAgICAgICAgIHByb3BzLmlzTmVlZFNpZ25cclxuICAgICAgICAgICAgPyB0cnVlXHJcbiAgICAgICAgICAgIDogcHJvcHMuaXNQbGFjZWhvbGRlciAmJiAhW3RleHRXaWRnZXRdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKVxyXG4gICAgICAgICAgICAgID8gZmFsc2VcclxuICAgICAgICAgICAgICA6ICFpc0RyYWdnaW5nRW5hYmxlZFxyXG4gICAgICAgIH1cclxuICAgICAgICBvbkRyYWdTdG9wPXsoZXZlbnQsIGRyYWdFbGVtZW50KSA9PlxyXG4gICAgICAgICAgcHJvcHMuaGFuZGxlU3RvcCAmJlxyXG4gICAgICAgICAgcHJvcHMuaGFuZGxlU3RvcChldmVudCwgZHJhZ0VsZW1lbnQsIHByb3BzLmRhdGE/LklkLCBwcm9wcy5wb3M/LmtleSlcclxuICAgICAgICB9XHJcbiAgICAgICAgcG9zaXRpb249e3tcclxuICAgICAgICAgIHg6IHhQb3MocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiksXHJcbiAgICAgICAgICB5OiB5UG9zKHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpXHJcbiAgICAgICAgfX1cclxuICAgICAgICBvblJlc2l6ZT17KGUsIGRpcmVjdGlvbiwgcmVmKSA9PiB7XHJcbiAgICAgICAgICBzZXRQbGFjZWhvbGRlckJvcmRlcih7XHJcbiAgICAgICAgICAgIHc6IHJlZi5vZmZzZXRXaWR0aCAvIChwcm9wcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlKSxcclxuICAgICAgICAgICAgaDogcmVmLm9mZnNldEhlaWdodCAvIChwcm9wcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlKVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfX1cclxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIoKX1cclxuICAgICAgPlxyXG4gICAgICAgIHtwcm9wcy5pc1Nob3dCb3JkZXIgJiZcclxuICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gcmFkaW9CdXR0b25XaWRnZXQgJiZcclxuICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJjaGVja2JveFwiICYmXHJcbiAgICAgICAgcHJvcHMucG9zLmtleSA9PT0gcHJvcHMuc2VsZWN0V2lkZ2V0SWQgPyAoXHJcbiAgICAgICAgICA8Qm9yZGVyUmVzaXplIHJpZ2h0PXstMTJ9IHRvcD17LTExfSAvPlxyXG4gICAgICAgICkgOiBwcm9wcy5kYXRhICYmIHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMucG9zLnR5cGUgIT09IFwiY2hlY2tib3hcIiA/IChcclxuICAgICAgICAgIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCAmJlxyXG4gICAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXHJcbiAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJjaGVja2JveFwiID8gKFxyXG4gICAgICAgICAgICA8Qm9yZGVyUmVzaXplIC8+XHJcbiAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICA8PjwvPlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkgOiAoXHJcbiAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gcmFkaW9CdXR0b25XaWRnZXQgJiZcclxuICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgJiZcclxuICAgICAgICAgIHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkICYmIDxCb3JkZXJSZXNpemUgLz5cclxuICAgICAgICApfVxyXG5cclxuICAgICAgICB7cHJvcHMuaXNTaG93Qm9yZGVyICYmIHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkICYmIChcclxuICAgICAgICAgIDxQbGFjZWhvbGRlckJvcmRlclxyXG4gICAgICAgICAgICBzZXREcmFnZ2luZ0VuYWJsZWQ9e3NldERyYWdnaW5nRW5hYmxlZH1cclxuICAgICAgICAgICAgcG9zPXtwcm9wcy5wb3N9XHJcbiAgICAgICAgICAgIGlzUGxhY2Vob2xkZXI9e3Byb3BzLmlzUGxhY2Vob2xkZXJ9XHJcbiAgICAgICAgICAgIGdldENoZWNrYm94UmVuZGVyV2lkdGg9e2dldENoZWNrYm94UmVuZGVyV2lkdGh9XHJcbiAgICAgICAgICAgIHNjYWxlPXtwcm9wcy5zY2FsZX1cclxuICAgICAgICAgICAgY29udGFpbmVyU2NhbGU9e2NvbnRhaW5lclNjYWxlfVxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlckJvcmRlcj17cGxhY2Vob2xkZXJCb3JkZXJ9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICl9XHJcbiAgICAgICAge2lzVGFiQW5kTW9iaWxlID8gKFxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0cmV0Y2hcIlxyXG4gICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgIGxlZnQ6IHhQb3MocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiksXHJcbiAgICAgICAgICAgICAgdG9wOiB5UG9zKHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpLFxyXG4gICAgICAgICAgICAgIHdpZHRoOlxyXG4gICAgICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0IHx8XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgID8gXCJhdXRvXCJcclxuICAgICAgICAgICAgICAgICAgOiBwcm9wcy5wb3NXaWR0aChwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKSxcclxuICAgICAgICAgICAgICBoZWlnaHQ6XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQgfHxcclxuICAgICAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgPyBcImF1dG9cIlxyXG4gICAgICAgICAgICAgICAgICA6IHByb3BzLnBvc0hlaWdodChwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKSxcclxuICAgICAgICAgICAgICB6SW5kZXg6IFwiMTBcIlxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICBvblRvdWNoRW5kPXsoKSA9PiBoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIoKX1cclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlT25DbGlja1BsYWNlaG9sZGVyKCl9XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHtwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJiA8UGxhY2Vob2xkZXJJY29uIC8+fVxyXG5cclxuICAgICAgICAgICAgPFBsYWNlaG9sZGVyVHlwZVxyXG4gICAgICAgICAgICAgIHBvcz17cHJvcHMucG9zfVxyXG4gICAgICAgICAgICAgIHh5UG9zdGlvbj17cHJvcHMueHlQb3N0aW9ufVxyXG4gICAgICAgICAgICAgIGluZGV4PXtwcm9wcy5pbmRleH1cclxuICAgICAgICAgICAgICBzZXRYeVBvc3Rpb249e3Byb3BzLnNldFh5UG9zdGlvbn1cclxuICAgICAgICAgICAgICBkYXRhPXtwcm9wcy5kYXRhfVxyXG4gICAgICAgICAgICAgIHNldFNpZ25LZXk9e3Byb3BzLnNldFNpZ25LZXl9XHJcbiAgICAgICAgICAgICAgaXNTaG93RHJvcGRvd249e3Byb3BzPy5pc1Nob3dEcm9wZG93bn1cclxuICAgICAgICAgICAgICBpc1BsYWNlaG9sZGVyPXtwcm9wcy5pc1BsYWNlaG9sZGVyfVxyXG4gICAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXtwcm9wcy5pc1NpZ25Zb3Vyc2VsZn1cclxuICAgICAgICAgICAgICBzaWduZXJPYmpJZD17cHJvcHMuc2lnbmVyT2JqSWR9XHJcbiAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e3Byb3BzLmhhbmRsZVVzZXJOYW1lfVxyXG4gICAgICAgICAgICAgIHNldERyYWdnaW5nRW5hYmxlZD17c2V0RHJhZ2dpbmdFbmFibGVkfVxyXG4gICAgICAgICAgICAgIHBkZkRldGFpbHM9e3Byb3BzPy5wZGZEZXRhaWxzICYmIHByb3BzPy5wZGZEZXRhaWxzWzBdfVxyXG4gICAgICAgICAgICAgIGlzTmVlZFNpZ249e3Byb3BzLmlzTmVlZFNpZ259XHJcbiAgICAgICAgICAgICAgc2V0U2VsZWN0RGF0ZT17c2V0U2VsZWN0RGF0ZX1cclxuICAgICAgICAgICAgICBzZWxlY3REYXRlPXtzZWxlY3REYXRlfVxyXG4gICAgICAgICAgICAgIHNldFZhbGlkYXRlQWxlcnQ9e3Byb3BzLnNldFZhbGlkYXRlQWxlcnR9XHJcbiAgICAgICAgICAgICAgc2V0U3RhcnREYXRlPXtzZXRTdGFydERhdGV9XHJcbiAgICAgICAgICAgICAgc3RhcnREYXRlPXtzdGFydERhdGV9XHJcbiAgICAgICAgICAgICAgaGFuZGxlU2F2ZURhdGU9e2hhbmRsZVNhdmVEYXRlfVxyXG4gICAgICAgICAgICAgIHhQb3M9e3Byb3BzLnhQb3N9XHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApIDogKFxyXG4gICAgICAgICAgPD5cclxuICAgICAgICAgICAge3Byb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkICYmIDxQbGFjZWhvbGRlckljb24gLz59XHJcbiAgICAgICAgICAgIDxQbGFjZWhvbGRlclR5cGVcclxuICAgICAgICAgICAgICBwb3M9e3Byb3BzLnBvc31cclxuICAgICAgICAgICAgICB4eVBvc3Rpb249e3Byb3BzLnh5UG9zdGlvbn1cclxuICAgICAgICAgICAgICBpbmRleD17cHJvcHMuaW5kZXh9XHJcbiAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtwcm9wcy5zZXRYeVBvc3Rpb259XHJcbiAgICAgICAgICAgICAgZGF0YT17cHJvcHMuZGF0YX1cclxuICAgICAgICAgICAgICBzZXRTaWduS2V5PXtwcm9wcy5zZXRTaWduS2V5fVxyXG4gICAgICAgICAgICAgIGlzU2hvd0Ryb3Bkb3duPXtwcm9wcz8uaXNTaG93RHJvcGRvd259XHJcbiAgICAgICAgICAgICAgaXNQbGFjZWhvbGRlcj17cHJvcHMuaXNQbGFjZWhvbGRlcn1cclxuICAgICAgICAgICAgICBpc1NpZ25Zb3Vyc2VsZj17cHJvcHMuaXNTaWduWW91cnNlbGZ9XHJcbiAgICAgICAgICAgICAgc2lnbmVyT2JqSWQ9e3Byb3BzLnNpZ25lck9iaklkfVxyXG4gICAgICAgICAgICAgIGhhbmRsZVVzZXJOYW1lPXtwcm9wcy5oYW5kbGVVc2VyTmFtZX1cclxuICAgICAgICAgICAgICBzZXREcmFnZ2luZ0VuYWJsZWQ9e3NldERyYWdnaW5nRW5hYmxlZH1cclxuICAgICAgICAgICAgICBwZGZEZXRhaWxzPXtwcm9wcz8ucGRmRGV0YWlscyAmJiBwcm9wcz8ucGRmRGV0YWlsc1swXX1cclxuICAgICAgICAgICAgICBpc05lZWRTaWduPXtwcm9wcy5pc05lZWRTaWdufVxyXG4gICAgICAgICAgICAgIHNldFNlbGVjdERhdGU9e3NldFNlbGVjdERhdGV9XHJcbiAgICAgICAgICAgICAgc2VsZWN0RGF0ZT17c2VsZWN0RGF0ZX1cclxuICAgICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0PXtwcm9wcy5zZXRWYWxpZGF0ZUFsZXJ0fVxyXG4gICAgICAgICAgICAgIHNldFN0YXJ0RGF0ZT17c2V0U3RhcnREYXRlfVxyXG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZT17c3RhcnREYXRlfVxyXG4gICAgICAgICAgICAgIGhhbmRsZVNhdmVEYXRlPXtoYW5kbGVTYXZlRGF0ZX1cclxuICAgICAgICAgICAgICB4UG9zPXtwcm9wcy54UG9zfVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC8+XHJcbiAgICAgICAgKX1cclxuICAgICAgPC9SbmQ+XHJcbiAgICAgIDxNb2RhbFVpIGlzT3Blbj17aXNEYXRlTW9kYWx9IHRpdGxlPXt0KFwid2lkZ2V0LWluZm9cIil9IHNob3dDbG9zZT17ZmFsc2V9PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1bMTAwJV0gcC1bMjBweF1cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4+e3QoXCJmb3JtYXRcIil9IDogPC9zcGFuPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXhcIj5cclxuICAgICAgICAgICAgICA8c2VsZWN0XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtbC1bN3B4XSBvcC1zZWxlY3Qgb3Atc2VsZWN0LWJvcmRlcmVkIG9wLXNlbGVjdC1zbSBmb2N1czpvdXRsaW5lLW5vbmUgaG92ZXI6Ym9yZGVyLWJhc2UtY29udGVudCB0ZXh0LXhzXCJcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT17XCJcIn1cclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gZS50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgIHNldFNlbGVjdERhdGUoZGF0ZUZvcm1hdFtzZWxlY3RlZEluZGV4XSk7XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiBkaXNhYmxlZD5cclxuICAgICAgICAgICAgICAgICAge3QoXCJzZWxlY3QtZGF0ZS1mb3JtYXRcIil9XHJcbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIHtkYXRlRm9ybWF0Lm1hcCgoZGF0YSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBjbGFzc05hbWU9XCJ0ZXh0LVsxM3B4XVwiIHZhbHVlPXtpbmR9IGtleT17aW5kfT5cclxuICAgICAgICAgICAgICAgICAgICAgIHtkYXRhPy5kYXRlID8gZGF0YT8uZGF0ZSA6IFwibm9kYXRhXCJ9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1ncmF5LTQwMCBtbC0xXCI+XHJcbiAgICAgICAgICAgICAge3NlbGVjdERhdGUuZm9ybWF0fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgbXQtNCBtZDptdC0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt0KFwiZm9udC1zaXplXCIpfSA6PC9zcGFuPlxyXG4gICAgICAgICAgICA8c2VsZWN0XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWwtWzNweF0gbWQ6bWw6WzdweF0gb3Atc2VsZWN0IG9wLXNlbGVjdC1ib3JkZXJlZCBvcC1zZWxlY3Qtc20gZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdGV4dC14c1wiXHJcbiAgICAgICAgICAgICAgdmFsdWU9e3Byb3BzLmZvbnRTaXplIHx8IGNsaWNrb25XaWRnZXQub3B0aW9ucz8uZm9udFNpemUgfHwgXCIxMlwifVxyXG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gcHJvcHMuc2V0Rm9udFNpemUoZS50YXJnZXQudmFsdWUpfVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge2ZvbnRzaXplQXJyLm1hcCgoc2l6ZSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIGNsYXNzTmFtZT1cInRleHQtWzEzcHhdXCIgdmFsdWU9e3NpemV9IGtleT17aW5kfT5cclxuICAgICAgICAgICAgICAgICAgICB7c2l6ZX1cclxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlciBtbC0yIG1kOm1sLTQgXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3QoXCJjb2xvclwiKX06IDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c2VsZWN0XHJcbiAgICAgICAgICAgICAgICB2YWx1ZT17XHJcbiAgICAgICAgICAgICAgICAgIHByb3BzLmZvbnRDb2xvciB8fCBjbGlja29uV2lkZ2V0Lm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gcHJvcHMuc2V0Rm9udENvbG9yKGUudGFyZ2V0LnZhbHVlKX1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1sLVs0cHhdIG1kOm1sWzdweF0gb3Atc2VsZWN0IG9wLXNlbGVjdC1ib3JkZXJlZCBvcC1zZWxlY3Qtc20gZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdGV4dC14c1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge2ZvbnRDb2xvckFyci5tYXAoKGNvbG9yLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtjb2xvcn0ga2V5PXtpbmR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAge3QoYGNvbG9yLXR5cGUuJHtjb2xvcn1gKX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOlxyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmZvbnRDb2xvciB8fCBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIlxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNSBoLVsxOXB4XSBtbC0xXCJcclxuICAgICAgICAgICAgICA+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1bMXB4XSB3LWZ1bGwgbXktWzE1cHhdIGJnLVsjOWY5ZjlmXVwiPjwvZGl2PlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgIHNldElzRGF0ZU1vZGFsKGZhbHNlKTtcclxuICAgICAgICAgICAgICBoYW5kbGVTYXZlRGF0ZShzZWxlY3REYXRlKTtcclxuICAgICAgICAgICAgICBwcm9wcy5zZXRGb250Q29sb3IoXCJcIik7XHJcbiAgICAgICAgICAgICAgcHJvcHMuc2V0Rm9udFNpemUoXCJcIik7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt0KFwic2F2ZVwiKX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L01vZGFsVWk+XHJcbiAgICA8Lz5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQbGFjZWhvbGRlcjtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyB0aGVtZUNvbG9yIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L2NvbnN0XCI7XHJcbmltcG9ydCB7XHJcbiAgZGVmYXVsdFdpZHRoSGVpZ2h0LFxyXG4gIGlzTW9iaWxlLFxyXG4gIHJhZGlvQnV0dG9uV2lkZ2V0LFxyXG4gIHJlc2l6ZUJvcmRlckV4dHJhV2lkdGgsXHJcbiAgdGV4dFdpZGdldFxyXG59IGZyb20gXCIuLi8uLi9jb25zdGFudC9VdGlsc1wiO1xyXG5mdW5jdGlvbiBQbGFjZWhvbGRlckJvcmRlcihwcm9wcykge1xyXG4gIGNvbnN0IGdldFJlc2l6ZUJvcmRlckV4dHJhV2lkdGggPSByZXNpemVCb3JkZXJFeHRyYVdpZHRoKCk7XHJcbiAgY29uc3QgZGVmYXVsdFdpZHRoID0gZGVmYXVsdFdpZHRoSGVpZ2h0KHByb3BzLnBvcy50eXBlKS53aWR0aDtcclxuICBjb25zdCBkZWZhdWx0SGVpZ2h0ID0gZGVmYXVsdFdpZHRoSGVpZ2h0KHByb3BzLnBvcy50eXBlKS5oZWlnaHQ7XHJcbiAgY29uc3Qgd2lkdGggPSAoKSA9PiB7XHJcbiAgICBjb25zdCBnZXRXaWR0aCA9XHJcbiAgICAgIHByb3BzLnBsYWNlaG9sZGVyQm9yZGVyLncgfHwgcHJvcHMucG9zLldpZHRoIHx8IGRlZmF1bHRXaWR0aDtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGdldFdpZHRoICogcHJvcHMuc2NhbGUgKiBwcm9wcy5jb250YWluZXJTY2FsZSArIGdldFJlc2l6ZUJvcmRlckV4dHJhV2lkdGhcclxuICAgICk7XHJcbiAgfTtcclxuICBjb25zdCBoZWlnaHQgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBnZXRIZWlnaHQgPVxyXG4gICAgICBwcm9wcy5wbGFjZWhvbGRlckJvcmRlci5oIHx8IHByb3BzLnBvcy5IZWlnaHQgfHwgZGVmYXVsdEhlaWdodDtcclxuXHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBnZXRIZWlnaHQgKiBwcm9wcy5zY2FsZSAqIHByb3BzLmNvbnRhaW5lclNjYWxlICsgZ2V0UmVzaXplQm9yZGVyRXh0cmFXaWR0aFxyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVNaW5XaWR0aCA9ICgpID0+IHtcclxuICAgIGlmIChwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiIHx8IHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCkge1xyXG4gICAgICByZXR1cm4gcHJvcHMuZ2V0Q2hlY2tib3hSZW5kZXJXaWR0aC53aWR0aCArIGdldFJlc2l6ZUJvcmRlckV4dHJhV2lkdGg7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gd2lkdGgoKTtcclxuICAgIH1cclxuICB9O1xyXG4gIGNvbnN0IGhhbmRsZU1pbkhlaWdodCA9ICgpID0+IHtcclxuICAgIGlmIChwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiIHx8IHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCkge1xyXG4gICAgICByZXR1cm4gcHJvcHMuZ2V0Q2hlY2tib3hSZW5kZXJXaWR0aC5oZWlnaHQgKyBnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGhlaWdodCgpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXZcclxuICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiAhaXNNb2JpbGUgJiYgcHJvcHM/LnNldERyYWdnaW5nRW5hYmxlZCh0cnVlKX1cclxuICAgICAgb25Ub3VjaEVuZD17KCkgPT5cclxuICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gdGV4dFdpZGdldCAmJiBwcm9wcz8uc2V0RHJhZ2dpbmdFbmFibGVkKHRydWUpXHJcbiAgICAgIH1cclxuICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5saW5lLWJsb2NrIHctWzE0cHhdIGgtWzE0cHhdICBib3JkZXItWzAuMnB4XSBvdmVyZmxvdy1oaWRkZW4gYm9yZGVyLWRhc2hlZFwiXHJcbiAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lQ29sb3IsXHJcbiAgICAgICAgbWluV2lkdGg6IGhhbmRsZU1pbldpZHRoKCkgfHwgMCxcclxuICAgICAgICBtaW5IZWlnaHQ6IGhhbmRsZU1pbkhlaWdodCgpIHx8IDBcclxuICAgICAgfX1cclxuICAgID48L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQbGFjZWhvbGRlckJvcmRlcjtcclxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUsIGZvcndhcmRSZWYsIHVzZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgZ2V0TW9udGgsXG4gIGdldFllYXIsXG4gIG9uQ2hhbmdlSGVpZ2h0T2ZUZXh0QXJlYSxcbiAgb25DaGFuZ2VJbnB1dCxcbiAgcmFkaW9CdXR0b25XaWRnZXQsXG4gIHJhbmdlLFxuICB0ZXh0SW5wdXRXaWRnZXQsXG4gIHRleHRXaWRnZXRcbn0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L1V0aWxzXCI7XG5pbXBvcnQgRGF0ZVBpY2tlciBmcm9tIFwicmVhY3QtZGF0ZXBpY2tlclwiO1xuaW1wb3J0IFwicmVhY3QtZGF0ZXBpY2tlci9kaXN0L3JlYWN0LWRhdGVwaWNrZXIuY3NzXCI7XG5pbXBvcnQgXCIuLi8uLi9zdHlsZXMvc2lnbmF0dXJlLmNzc1wiO1xuaW1wb3J0IFJlZ2V4UGFyc2VyIGZyb20gXCJyZWdleC1wYXJzZXJcIjtcbmltcG9ydCB7IGVtYWlsUmVnZXggfSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvY29uc3RcIjtcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcbmNvbnN0IHRleHRXaWRnZXRDbHMgPVxuICBcInctZnVsbCBoLWZ1bGwgbWQ6bWluLXctZnVsbCBtZDptaW4taC1mdWxsIHotWzk5OV0gdGV4dC1bMTJweF0gcm91bmRlZC1bMnB4XSBib3JkZXItWzFweF0gYm9yZGVyLVsjMDA3YmZmXSBvdmVyZmxvdy1oaWRkZW4gcmVzaXplLW5vbmUgb3V0bGluZS1ub25lIHRleHQtYmFzZS1jb250ZW50IGl0ZW0tY2VudGVyIHdoaXRlc3BhY2UtcHJlLXdyYXAgYmctd2hpdGVcIjtcbmNvbnN0IHNlbGVjdFdpZGdldENscyA9XG4gIFwidy1mdWxsIGgtZnVsbCBhYnNvbHV0ZSBsZWZ0LTAgdG9wLTAgYm9yZGVyLVsxcHhdIGJvcmRlci1bIzAwN2JmZl0gcm91bmRlZC1bMnB4XSBmb2N1czpvdXRsaW5lLW5vbmUgdGV4dC1iYXNlLWNvbnRlbnRcIjtcbmZ1bmN0aW9uIFBsYWNlaG9sZGVyVHlwZShwcm9wcykge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG4gIGNvbnN0IHR5cGUgPSBwcm9wcz8ucG9zPy50eXBlO1xuICBjb25zdCB3aWRnZXRUeXBlVHJhc2xhdGlvbiA9IHQoYHdpZGdldHMtbmFtZS4ke3Byb3BzPy5wb3M/LnR5cGV9YCk7XG4gIGNvbnN0IFtzZWxlY3RPcHRpb24sIHNldFNlbGVjdE9wdGlvbl0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW3ZhbGlkYXRlUGxhY2Vob2xkZXIsIHNldFZhbGlkYXRlUGxhY2Vob2xkZXJdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBbdGV4dFZhbHVlLCBzZXRUZXh0VmFsdWVdID0gdXNlU3RhdGUoKTtcbiAgY29uc3QgW3NlbGVjdGVkQ2hlY2tib3gsIHNldFNlbGVjdGVkQ2hlY2tib3hdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCB5ZWFycyA9IHJhbmdlKDE5OTAsIGdldFllYXIobmV3IERhdGUoKSkgKyAxNiwgMSk7XG4gIGNvbnN0IGZvbnRTaXplID0gKHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZSB8fCBcIjEyXCIpICsgXCJweFwiO1xuICBjb25zdCBmb250Q29sb3IgPSBwcm9wcy5wb3Mub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIjtcbiAgY29uc3QgbW9udGhzID0gW1xuICAgIFwiSmFudWFyeVwiLFxuICAgIFwiRmVicnVhcnlcIixcbiAgICBcIk1hcmNoXCIsXG4gICAgXCJBcHJpbFwiLFxuICAgIFwiTWF5XCIsXG4gICAgXCJKdW5lXCIsXG4gICAgXCJKdWx5XCIsXG4gICAgXCJBdWd1c3RcIixcbiAgICBcIlNlcHRlbWJlclwiLFxuICAgIFwiT2N0b2JlclwiLFxuICAgIFwiTm92ZW1iZXJcIixcbiAgICBcIkRlY2VtYmVyXCJcbiAgXTtcbiAgY29uc3QgdmFsaWRhdGVFeHByZXNzaW9uID0gKHJlZ2V4VmFsaWRhdGlvbikgPT4ge1xuICAgIGlmICh0ZXh0VmFsdWUgJiYgcmVnZXhWYWxpZGF0aW9uKSB7XG4gICAgICBsZXQgcmVnZXhPYmplY3QgPSByZWdleFZhbGlkYXRpb247XG4gICAgICBpZiAocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy50eXBlID09PSBcInJlZ2V4XCIpIHtcbiAgICAgICAgcmVnZXhPYmplY3QgPSBSZWdleFBhcnNlcihyZWdleFZhbGlkYXRpb24pO1xuICAgICAgfVxuICAgICAgLy8gbmV3IFJlZ0V4cChyZWdleFZhbGlkYXRpb24pO1xuICAgICAgbGV0IGlzVmFsaWRhdGUgPSByZWdleE9iamVjdC50ZXN0KHRleHRWYWx1ZSk7XG4gICAgICBpZiAoIWlzVmFsaWRhdGUpIHtcbiAgICAgICAgcHJvcHM/LnNldFZhbGlkYXRlQWxlcnQodHJ1ZSk7XG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRCbHVyID0gKCkgPT4ge1xuICAgIHByb3BzLnNldERyYWdnaW5nRW5hYmxlZCh0cnVlKTtcbiAgICBjb25zdCB2YWxpZGF0ZVR5cGUgPSBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LnR5cGU7XG4gICAgbGV0IHJlZ2V4VmFsaWRhdGlvbjtcbiAgICBpZiAodmFsaWRhdGVUeXBlICYmIHZhbGlkYXRlVHlwZSAhPT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHN3aXRjaCAodmFsaWRhdGVUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJlbWFpbFwiOlxuICAgICAgICAgIHJlZ2V4VmFsaWRhdGlvbiA9IGVtYWlsUmVnZXg7XG4gICAgICAgICAgdmFsaWRhdGVFeHByZXNzaW9uKHJlZ2V4VmFsaWRhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICByZWdleFZhbGlkYXRpb24gPSAvXlswLTlcXHNdKiQvO1xuICAgICAgICAgIHZhbGlkYXRlRXhwcmVzc2lvbihyZWdleFZhbGlkYXRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlZ2V4VmFsaWRhdGlvbiA9IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8ucGF0dGVybiB8fCBcIlwiO1xuICAgICAgICAgIHZhbGlkYXRlRXhwcmVzc2lvbihyZWdleFZhbGlkYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVUZXh0VmFsaWQgPSAoZSkgPT4ge1xuICAgIGNvbnN0IHRleHRJbnB1dCA9IGUudGFyZ2V0LnZhbHVlO1xuICAgIHNldFRleHRWYWx1ZSh0ZXh0SW5wdXQpO1xuICB9O1xuICBmdW5jdGlvbiBjaGVja1JlZ3VsYXJFeHByZXNzKHZhbGlkYXRlVHlwZSkge1xuICAgIHN3aXRjaCAodmFsaWRhdGVUeXBlKSB7XG4gICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcihcImRlbW9AZ21haWwuY29tXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcihcIjEyMzQ1XCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgIHNldFZhbGlkYXRlUGxhY2Vob2xkZXIoXCJwbGVhc2UgZW50ZXIgdGV4dFwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzZXRWYWxpZGF0ZVBsYWNlaG9sZGVyKFwicGxlYXNlIGVudGVyIHZhbHVlXCIpO1xuICAgIH1cbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGUgJiYgdHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHByb3BzLmlzTmVlZFNpZ24pIHtcbiAgICAgIGNvbnN0IGlzRGVmYXVsdFZhbHVlID0gcHJvcHMucG9zLm9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChpc0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICBzZXRTZWxlY3RlZENoZWNrYm94KGlzRGVmYXVsdFZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BzLnBvcz8ub3B0aW9ucz8uaGludCkge1xuICAgICAgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcihwcm9wcy5wb3M/Lm9wdGlvbnMuaGludCk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LnR5cGUpIHtcbiAgICAgIGNoZWNrUmVndWxhckV4cHJlc3MocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy50eXBlKTtcbiAgICB9XG4gICAgc2V0VGV4dFZhbHVlKFxuICAgICAgcHJvcHMucG9zPy5vcHRpb25zPy5yZXNwb25zZVxuICAgICAgICA/IHByb3BzLnBvcz8ub3B0aW9ucz8ucmVzcG9uc2VcbiAgICAgICAgOiBwcm9wcy5wb3M/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZVxuICAgICAgICAgID8gcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWVcbiAgICAgICAgICA6IFwiXCJcbiAgICApO1xuICAgIHNldFNlbGVjdE9wdGlvbihcbiAgICAgIHByb3BzLnBvcz8ub3B0aW9ucz8ucmVzcG9uc2VcbiAgICAgICAgPyBwcm9wcy5wb3M/Lm9wdGlvbnM/LnJlc3BvbnNlXG4gICAgICAgIDogcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWVcbiAgICAgICAgICA/IHByb3BzLnBvcz8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlXG4gICAgICAgICAgOiBcIlwiXG4gICAgKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgIFtcIm5hbWVcIiwgXCJlbWFpbFwiLCBcImpvYiB0aXRsZVwiLCBcImNvbXBhbnlcIl0uaW5jbHVkZXMocHJvcHMucG9zPy50eXBlKSAmJlxuICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxuICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzPy5zaWduZXJPYmpJZFxuICAgICkge1xuICAgICAgY29uc3QgZGVmYXVsdERhdGEgPSBwcm9wcy5wb3M/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChkZWZhdWx0RGF0YSkge1xuICAgICAgICBzZXRUZXh0VmFsdWUoZGVmYXVsdERhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtwcm9wcy5wb3M/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZV0pO1xuXG4gIGNvbnN0IEV4YW1wbGVDdXN0b21JbnB1dCA9IGZvcndhcmRSZWYoKHsgdmFsdWUsIG9uQ2xpY2sgfSwgcmVmKSA9PiAoXG4gICAgPGRpdlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICBjb2xvcjogZm9udENvbG9yLFxuICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCJcbiAgICAgIH19XG4gICAgICBjbGFzc05hbWU9e2Ake3NlbGVjdFdpZGdldENsc30gb3ZlcmZsb3ctaGlkZGVuYH1cbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICByZWY9e3JlZn1cbiAgICA+XG4gICAgICB7dmFsdWV9XG4gICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1jYWxlbmRhciAgbWwtWzVweF1cIj48L2k+XG4gICAgPC9kaXY+XG4gICkpO1xuICBFeGFtcGxlQ3VzdG9tSW5wdXQuZGlzcGxheU5hbWUgPSBcIkV4YW1wbGVDdXN0b21JbnB1dFwiO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgW1wibmFtZVwiLCBcImVtYWlsXCIsIFwiam9iIHRpdGxlXCIsIFwiY29tcGFueVwiXS5pbmNsdWRlcyh0eXBlKSAmJlxuICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxuICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkXG4gICAgKSB7XG4gICAgICBjb25zdCBpc0RlZmF1bHQgPSB0cnVlO1xuICAgICAgY29uc3Qgc2VuZGVyVXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBFeHRhbmRfQ2xhc3NgKTtcbiAgICAgIGNvbnN0IGpzb25TZW5kZXIgPSBKU09OLnBhcnNlKHNlbmRlclVzZXIpO1xuICAgICAgb25DaGFuZ2VJbnB1dChcbiAgICAgICAganNvblNlbmRlciAmJiBqc29uU2VuZGVyWzBdLFxuICAgICAgICBudWxsLFxuICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgIG51bGwsXG4gICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcbiAgICAgICAgcHJvcHMuZGF0YS5JZCxcbiAgICAgICAgaXNEZWZhdWx0XG4gICAgICApO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFt0eXBlXSk7XG4gIC8vZnVuY3Rpb24gZm9yIHNob3cgY2hlY2tlZCBjaGVja2JveFxuICBjb25zdCBzZWxlY3RDaGVja2JveCA9IChpbmQpID0+IHtcbiAgICBjb25zdCByZXMgPSBwcm9wcy5wb3Mub3B0aW9ucz8ucmVzcG9uc2U7XG4gICAgY29uc3QgZGVmYXVsdENoZWNrID0gcHJvcHMucG9zLm9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcbiAgICBpZiAocmVzICYmIHJlcz8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXNTZWxlY3RJbmRleCA9IHJlcy5pbmRleE9mKGluZCk7XG4gICAgICBpZiAoaXNTZWxlY3RJbmRleCA+IC0xKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gfVxuICAgIH0gZWxzZSBpZiAoZGVmYXVsdENoZWNrKSB7XG4gICAgICBjb25zdCBpc1NlbGVjdEluZGV4ID0gZGVmYXVsdENoZWNrLmluZGV4T2YoaW5kKTtcbiAgICAgIGlmIChpc1NlbGVjdEluZGV4ID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUmFkaW9DaGVjayA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdERhdGEgPSBwcm9wcy5wb3Mub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xuICAgIGlmICh0ZXh0VmFsdWUgPT09IGRhdGEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZGVmYXVsdERhdGEgPT09IGRhdGEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8vZnVuY3Rpb24gZm9yIHNldCBjaGVja2VkIGFuZCB1bmNoZWNrZWQgdmFsdWUgb2YgY2hlY2tib3hcbiAgY29uc3QgaGFuZGxlQ2hlY2tib3hWYWx1ZSA9IChpc0NoZWNrZWQsIGluZCkgPT4ge1xuICAgIGxldCB1cGRhdGVTZWxlY3RlZENoZWNrYm94ID0gW10sXG4gICAgICBjaGVja2VkTGlzdDtcbiAgICBsZXQgaXNEZWZhdWx0VmFsdWUsIGlzRGVmYXVsdEVtcHR5O1xuICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgIHVwZGF0ZVNlbGVjdGVkQ2hlY2tib3ggPSBzZWxlY3RlZENoZWNrYm94ID8gc2VsZWN0ZWRDaGVja2JveCA6IFtdO1xuXG4gICAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgIHVwZGF0ZVNlbGVjdGVkQ2hlY2tib3gucHVzaChpbmQpO1xuICAgICAgICBzZXRTZWxlY3RlZENoZWNrYm94KHVwZGF0ZVNlbGVjdGVkQ2hlY2tib3gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tlZExpc3QgPSBzZWxlY3RlZENoZWNrYm94LmZpbHRlcigoZGF0YSkgPT4gZGF0YSAhPT0gaW5kKTtcbiAgICAgICAgc2V0U2VsZWN0ZWRDaGVja2JveChjaGVja2VkTGlzdCk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuaXNOZWVkU2lnbikge1xuICAgICAgICBpc0RlZmF1bHRWYWx1ZSA9IHByb3BzLnBvcy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNEZWZhdWx0VmFsdWUgJiYgaXNEZWZhdWx0VmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICBpc0RlZmF1bHRFbXB0eSA9IHRydWU7XG4gICAgICB9XG4gICAgICBvbkNoYW5nZUlucHV0KFxuICAgICAgICBjaGVja2VkTGlzdCA/IGNoZWNrZWRMaXN0IDogdXBkYXRlU2VsZWN0ZWRDaGVja2JveCxcbiAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGEuSWQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBudWxsLFxuICAgICAgICBpc0RlZmF1bHRFbXB0eVxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLy9mdW5jdGlvbiB0byBoYW5kbGUgc2VsZWN0IHJhZGlvIHdpZGdldCBhbmQgc2V0IHZhbHVlIHNlbGV0Y2VkIGJ5IHVzZXJcbiAgY29uc3QgaGFuZGxlQ2hlY2tSYWRpbyA9IChpc0NoZWNrZWQsIGRhdGEpID0+IHtcbiAgICBsZXQgaXNEZWZhdWx0VmFsdWUsXG4gICAgICBpc0RlZmF1bHRFbXB0eSxcbiAgICAgIGlzUmFkaW8gPSB0cnVlO1xuICAgIGlmIChwcm9wcy5pc05lZWRTaWduKSB7XG4gICAgICBpc0RlZmF1bHRWYWx1ZSA9IHByb3BzLnBvcy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIGlmIChpc0RlZmF1bHRWYWx1ZSkge1xuICAgICAgaXNEZWZhdWx0RW1wdHkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICBzZXRUZXh0VmFsdWUoZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRleHRWYWx1ZShcIlwiKTtcbiAgICB9XG4gICAgb25DaGFuZ2VJbnB1dChcbiAgICAgIGRhdGEsXG4gICAgICBwcm9wcy5wb3Mua2V5LFxuICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgcHJvcHMuaW5kZXgsXG4gICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGEuSWQsXG4gICAgICBmYWxzZSxcbiAgICAgIG51bGwsXG4gICAgICBpc0RlZmF1bHRFbXB0eSxcbiAgICAgIGlzUmFkaW9cbiAgICApO1xuICB9O1xuICAvL2Z1bmN0aW9uIHRvIHNldCBvbmNoYW5nZSBkYXRlXG4gIGNvbnN0IGhhbmRsZU9uRGF0ZUNoYW5nZSA9IChkYXRlKSA9PiB7XG4gICAgcHJvcHMuc2V0U3RhcnREYXRlKGRhdGUpO1xuICAgIGNvbnN0IGlzRGF0ZUNoYW5nZSA9IHRydWU7XG4gICAgY29uc3QgZGF0ZU9iaiA9IHtcbiAgICAgIGRhdGU6IGRhdGUsXG4gICAgICBmb3JtYXQ6IHByb3BzLnNlbGVjdERhdGUuZm9ybWF0XG4gICAgfTtcbiAgICBwcm9wcy5oYW5kbGVTYXZlRGF0ZShkYXRlT2JqLCBpc0RhdGVDaGFuZ2UpO1xuICB9O1xuICAvL2hhbmRsZSBoZWlnaHQgb24gZW50ZXIgcHJlc3MgaW4gdGV4dCBhcmVhXG4gIGNvbnN0IGhhbmRsZUVudGVyUHJlc3MgPSAoZSkgPT4ge1xuICAgIGNvbnN0IGhlaWdodCA9IDE4O1xuICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAvL2Z1bmN0aW9uIHRvIHNhdmUgaGVpZ2h0IG9mIHRleHQgYXJlYVxuICAgICAgb25DaGFuZ2VIZWlnaHRPZlRleHRBcmVhKFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHByb3BzLnBvcy50eXBlLFxuICAgICAgICBwcm9wcy5wb3Mua2V5LFxuICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgIHByb3BzLmluZGV4LFxuICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic2lnbmF0dXJlXCI6XG4gICAgICByZXR1cm4gcHJvcHMucG9zLlNpZ25VcmwgPyAoXG4gICAgICAgIDxpbWdcbiAgICAgICAgICBhbHQ9XCJzaWduYXR1cmVcIlxuICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICBzcmM9e3Byb3BzLnBvcy5TaWduVXJsfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgXCJcbiAgICAgICAgLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gdy1mdWxsIGgtZnVsbCB0ZXh0LWJsYWNrIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxuICAgICAgICAgICAgcHJvcHM/LmhhbmRsZVVzZXJOYW1lKFxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uSWQsXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5Sb2xlLFxuICAgICAgICAgICAgICB3aWRnZXRUeXBlVHJhc2xhdGlvblxuICAgICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgXCJzdGFtcFwiOlxuICAgICAgcmV0dXJuIHByb3BzLnBvcy5TaWduVXJsID8gKFxuICAgICAgICA8aW1nXG4gICAgICAgICAgYWx0PVwic3RhbXBcIlxuICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICBzcmM9e3Byb3BzLnBvcy5TaWduVXJsfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGxcIlxuICAgICAgICAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSB3LWZ1bGwgaC1mdWxsIHRleHQtYmxhY2sgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICB7cHJvcHM/LmhhbmRsZVVzZXJOYW1lICYmXG4gICAgICAgICAgICBwcm9wcz8uaGFuZGxlVXNlck5hbWUoXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5JZCxcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LlJvbGUsXG4gICAgICAgICAgICAgIHdpZGdldFR5cGVUcmFzbGF0aW9uXG4gICAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IHN0eWxlPXt7IHpJbmRleDogcHJvcHMuaXNTaWduWW91cnNlbGYgJiYgXCI5OVwiIH19PlxuICAgICAgICAgIHtwcm9wcy5wb3Mub3B0aW9ucz8udmFsdWVzPy5tYXAoKGRhdGEsIGluZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPGRpdiBrZXk9e2luZH0gY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXIgZ2FwLTAuNVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGZvbnRTaXplXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcbiAgICAgICAgICAgICAgICAgICAgaW5kID09PSAwID8gXCJtdC0wXCIgOiBcIm10LVs1cHhdXCJcbiAgICAgICAgICAgICAgICAgIH0gZmxleCBqdXN0aWZ5LWNlbnRlciBvcC1jaGVja2JveCByb3VuZGVkLVsxcHhdIGB9XG4gICAgICAgICAgICAgICAgICBvbkJsdXI9e2hhbmRsZUlucHV0Qmx1cn1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxuICAgICAgICAgICAgICAgICAgICAocHJvcHMucG9zLm9wdGlvbnM/LmlzUmVhZE9ubHkgfHxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCAhPT0gcHJvcHMuc2lnbmVyT2JqSWQpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0Q2hlY2tib3goaW5kKX1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvcHMuaXNQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UmVxdWlyZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5wb3Mub3B0aW9ucz8udmFsaWRhdGlvbj8ubWF4UmVxdWlyZWRDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heENvdW50SW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVxdWlyZWQgJiYgcGFyc2VJbnQobWF4UmVxdWlyZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4Q291bnRJbnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENoZWNrYm94ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaGVja2JveD8ubGVuZ3RoIDw9IG1heENvdW50SW50IC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDaGVja2JveFZhbHVlKGUudGFyZ2V0LmNoZWNrZWQsIGluZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoZWNrYm94VmFsdWUoZS50YXJnZXQuY2hlY2tlZCwgaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tib3hWYWx1ZShlLnRhcmdldC5jaGVja2VkLCBpbmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgeyFwcm9wcy5wb3Mub3B0aW9ucz8uaXNIaWRlTGFiZWwgJiYgKFxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3JcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyBtYi0wIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge2RhdGF9XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgdGV4dElucHV0V2lkZ2V0OlxuICAgICAgcmV0dXJuIHByb3BzLmlzU2lnbllvdXJzZWxmIHx8XG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCkgPyAoXG4gICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3ZhbGlkYXRlUGxhY2Vob2xkZXIgfHwgXCJwbGVhc2UgZW50ZXIgdmFsdWVcIn1cbiAgICAgICAgICByb3dzPXsxfVxuICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlRW50ZXJQcmVzc31cbiAgICAgICAgICB2YWx1ZT17dGV4dFZhbHVlfVxuICAgICAgICAgIG9uQmx1cj17aGFuZGxlSW5wdXRCbHVyfVxuICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgc2V0VGV4dFZhbHVlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWQsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH19XG4gICAgICAgICAgY2xhc3NOYW1lPXt0ZXh0V2lkZ2V0Q2xzfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjb2xzPVwiNTBcIlxuICAgICAgICAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yLFxuICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4+e3dpZGdldFR5cGVUcmFzbGF0aW9ufTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgXCJkcm9wZG93blwiOlxuICAgICAgcmV0dXJuIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCA/IChcbiAgICAgICAgPHNlbGVjdFxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjbGFzc05hbWU9e2Ake3NlbGVjdFdpZGdldENsc30gdGV4dC1bMTJweF0gYmctaW5oZXJpdGB9XG4gICAgICAgICAgaWQ9XCJteURyb3Bkb3duXCJcbiAgICAgICAgICB2YWx1ZT17c2VsZWN0T3B0aW9ufVxuICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgc2V0U2VsZWN0T3B0aW9uKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWQsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7LyogRGVmYXVsdC9UaXRsZSBvcHRpb24gKi99XG4gICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgICBjb2xvcjogZm9udENvbG9yXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdmFsdWU9XCJcIlxuICAgICAgICAgICAgZGlzYWJsZWRcbiAgICAgICAgICAgIGhpZGRlblxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtwcm9wcz8ucG9zPy5vcHRpb25zPy5uYW1lfVxuICAgICAgICAgIDwvb3B0aW9uPlxuXG4gICAgICAgICAge3Byb3BzLnBvcz8ub3B0aW9ucz8udmFsdWVzPy5tYXAoKGRhdGEsIGluZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogZm9udENvbG9yXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBrZXk9e2luZH1cbiAgICAgICAgICAgICAgICB2YWx1ZT17ZGF0YX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtkYXRhfVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjbGFzc05hbWU9XCIgb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgICAgPlxuICAgICAgICAgIHtwcm9wcy5wb3M/Lm9wdGlvbnM/Lm5hbWVcbiAgICAgICAgICAgID8gcHJvcHMucG9zLm9wdGlvbnMubmFtZVxuICAgICAgICAgICAgOiB3aWRnZXRUeXBlVHJhc2xhdGlvbn1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgXCJpbml0aWFsc1wiOlxuICAgICAgcmV0dXJuIHByb3BzLnBvcy5TaWduVXJsID8gKFxuICAgICAgICA8aW1nXG4gICAgICAgICAgYWx0PVwiaW5pdGlhbHNcIlxuICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICBzcmM9e3Byb3BzLnBvcy5TaWduVXJsfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGxcIlxuICAgICAgICAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSB3LWZ1bGwgaC1mdWxsIHRleHQtYmxhY2sgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICB7cHJvcHM/LmhhbmRsZVVzZXJOYW1lICYmXG4gICAgICAgICAgICBwcm9wcz8uaGFuZGxlVXNlck5hbWUoXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5JZCxcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LlJvbGUsXG4gICAgICAgICAgICAgIHdpZGdldFR5cGVUcmFzbGF0aW9uXG4gICAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgY2FzZSBcIm5hbWVcIjpcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxuICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtcIm5hbWVcIn1cbiAgICAgICAgICByb3dzPXsxfVxuICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlRW50ZXJQcmVzc31cbiAgICAgICAgICB2YWx1ZT17dGV4dFZhbHVlfVxuICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNEZWZhdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBoYW5kbGVUZXh0VmFsaWQoZSk7XG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxuICAgICAgICAgICAgICBpc0RlZmF1bHRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfX1cbiAgICAgICAgICBjbGFzc05hbWU9e3RleHRXaWRnZXRDbHN9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3JcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNvbHM9XCI1MFwiXG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3IsXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj57d2lkZ2V0VHlwZVRyYXNsYXRpb259PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgY2FzZSBcImNvbXBhbnlcIjpcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxuICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgdGV4dFwiXG4gICAgICAgICAgcm93cz17MX1cbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XG4gICAgICAgICAgdmFsdWU9e3RleHRWYWx1ZX1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgIGhhbmRsZVRleHRWYWxpZChlKTtcbiAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWQsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH19XG4gICAgICAgICAgY2xhc3NOYW1lPXt0ZXh0V2lkZ2V0Q2xzfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjb2xzPVwiNTBcIlxuICAgICAgICAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yLFxuICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCJcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4+e3dpZGdldFR5cGVUcmFzbGF0aW9ufTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgXCJqb2IgdGl0bGVcIjpcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxuICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtcImpvYiB0aXRsZVwifVxuICAgICAgICAgIHJvd3M9ezF9XG4gICAgICAgICAgb25LZXlEb3duPXtoYW5kbGVFbnRlclByZXNzfVxuICAgICAgICAgIHZhbHVlPXt0ZXh0VmFsdWV9XG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICBoYW5kbGVUZXh0VmFsaWQoZSk7XG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxuICAgICAgICAgIH19XG4gICAgICAgICAgY29scz1cIjUwXCJcbiAgICAgICAgLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvcixcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWwsIHNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuPnt3aWRnZXRUeXBlVHJhc2xhdGlvbn08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIHByb3BzLmlzU2lnbllvdXJzZWxmIHx8XG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCkgPyAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgICAgIHJlbmRlckN1c3RvbUhlYWRlcj17KHsgZGF0ZSwgY2hhbmdlWWVhciwgY2hhbmdlTW9udGggfSkgPT4gKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1zdGFydCBtbC0yIFwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLXRyYW5zcGFyZW50IG91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17bW9udGhzW2dldE1vbnRoKGRhdGUpXX1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoeyB0YXJnZXQ6IHsgdmFsdWUgfSB9KSA9PlxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VNb250aChtb250aHMuaW5kZXhPZih2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge21vbnRocy5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17b3B0aW9ufSB2YWx1ZT17b3B0aW9ufT5cbiAgICAgICAgICAgICAgICAgICAgICB7b3B0aW9ufVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLXRyYW5zcGFyZW50IG91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17Z2V0WWVhcihkYXRlKX1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoeyB0YXJnZXQ6IHsgdmFsdWUgfSB9KSA9PiBjaGFuZ2VZZWFyKHZhbHVlKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eWVhcnMubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e29wdGlvbn0gdmFsdWU9e29wdGlvbn0+XG4gICAgICAgICAgICAgICAgICAgICAge29wdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgZGlzYWJsZWQ9e1xuICAgICAgICAgICAgICBwcm9wcy5pc1BsYWNlaG9sZGVyIHx8XG4gICAgICAgICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmXG4gICAgICAgICAgICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgIT09IHByb3BzLnNpZ25lck9iaklkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25CbHVyPXtoYW5kbGVJbnB1dEJsdXJ9XG4gICAgICAgICAgICBjbG9zZU9uU2Nyb2xsPXt0cnVlfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtzZWxlY3RXaWRnZXRDbHN9IG91dGxpbmUtWyMwMDdiZmZdYH1cbiAgICAgICAgICAgIHNlbGVjdGVkPXtcbiAgICAgICAgICAgICAgcHJvcHM/LnN0YXJ0RGF0ZVxuICAgICAgICAgICAgICAgID8gcHJvcHM/LnN0YXJ0RGF0ZVxuICAgICAgICAgICAgICAgIDogcHJvcHMucG9zLm9wdGlvbnM/LnJlc3BvbnNlICYmXG4gICAgICAgICAgICAgICAgICBuZXcgRGF0ZShwcm9wcy5wb3Mub3B0aW9ucy5yZXNwb25zZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXsoZGF0ZSkgPT4gaGFuZGxlT25EYXRlQ2hhbmdlKGRhdGUpfVxuICAgICAgICAgICAgcG9wcGVyUGxhY2VtZW50PVwidG9wLWVuZFwiXG4gICAgICAgICAgICBjdXN0b21JbnB1dD17PEV4YW1wbGVDdXN0b21JbnB1dCAvPn1cbiAgICAgICAgICAgIGRhdGVGb3JtYXQ9e1xuICAgICAgICAgICAgICBwcm9wcy5zZWxlY3REYXRlXG4gICAgICAgICAgICAgICAgPyBwcm9wcy5zZWxlY3REYXRlPy5mb3JtYXRcbiAgICAgICAgICAgICAgICA6IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XG4gICAgICAgICAgICAgICAgICA/IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XG4gICAgICAgICAgICAgICAgICA6IFwiTU0vZGQveXl5eVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3IsXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCJcbiAgICAgICAgICB9fVxuICAgICAgICAgIGNsYXNzTmFtZT1cIml0ZW1zLWNlbnRlciBvdmVyZmxvdy1oaWRkZW5cIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICB7cHJvcHMuc2VsZWN0RGF0ZVxuICAgICAgICAgICAgICA/IHByb3BzLnNlbGVjdERhdGU/LmZvcm1hdFxuICAgICAgICAgICAgICA6IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XG4gICAgICAgICAgICAgICAgPyBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LmZvcm1hdFxuICAgICAgICAgICAgICAgIDogXCJNTS9kZC95eXl5XCJ9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgICByZXR1cm4gcHJvcHMucG9zLlNpZ25VcmwgPyAoXG4gICAgICAgIDxpbWdcbiAgICAgICAgICBhbHQ9XCJpbWFnZVwiXG4gICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgIHNyYz17cHJvcHMucG9zLlNpZ25Vcmx9XG4gICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiXG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIHtwcm9wcz8uaGFuZGxlVXNlck5hbWUgJiZcbiAgICAgICAgICAgIHByb3BzPy5oYW5kbGVVc2VyTmFtZShcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LklkLFxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uUm9sZSxcbiAgICAgICAgICAgICAgd2lkZ2V0VHlwZVRyYXNsYXRpb25cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxuICAgICAgICAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQpID8gKFxuICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtcImVudGVyIGVtYWlsXCJ9XG4gICAgICAgICAgcm93cz17MX1cbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XG4gICAgICAgICAgdmFsdWU9e3RleHRWYWx1ZX1cbiAgICAgICAgICBvbkJsdXI9e2hhbmRsZUlucHV0Qmx1cn1cbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgIGhhbmRsZVRleHRWYWxpZChlKTtcbiAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWQsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH19XG4gICAgICAgICAgY2xhc3NOYW1lPXt0ZXh0V2lkZ2V0Q2xzfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yLFxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjb2xzPVwiNTBcIlxuICAgICAgICAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yLFxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4+e3dpZGdldFR5cGVUcmFzbGF0aW9ufTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIGNhc2UgcmFkaW9CdXR0b25XaWRnZXQ6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIHtwcm9wcy5wb3Mub3B0aW9ucz8udmFsdWVzLm1hcCgoZGF0YSwgaW5kKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8ZGl2IGtleT17aW5kfSBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlciBnYXAtMC41XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogaW5kID4gMCA/IFwiMTBweFwiIDogXCIwcHhcIlxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgganVzdGlmeS1jZW50ZXIgb3AtcmFkaW9gfVxuICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxuICAgICAgICAgICAgICAgICAgICAocHJvcHMucG9zLm9wdGlvbnM/LmlzUmVhZE9ubHkgfHxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCAhPT0gcHJvcHMuc2lnbmVyT2JqSWQpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjaGVja2VkPXtoYW5kbGVSYWRpb0NoZWNrKGRhdGEpfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJvcHMuaXNQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoZWNrUmFkaW8oZS50YXJnZXQuY2hlY2tlZCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB7IXByb3BzLnBvcy5vcHRpb25zPy5pc0hpZGVMYWJlbCAmJiAoXG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1iLTBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7ZGF0YX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgY2FzZSB0ZXh0V2lkZ2V0OlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB0ZXh0XCJcbiAgICAgICAgICByb3dzPXsxfVxuICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlRW50ZXJQcmVzc31cbiAgICAgICAgICB2YWx1ZT17dGV4dFZhbHVlfVxuICAgICAgICAgIG9uQmx1cj17aGFuZGxlSW5wdXRCbHVyfVxuICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgc2V0VGV4dFZhbHVlKGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQoXG4gICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWQsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH19XG4gICAgICAgICAgY2xhc3NOYW1lPXt0ZXh0V2lkZ2V0Q2xzfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjb2xzPVwiNTBcIlxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHByb3BzLnBvcy5TaWduVXJsID8gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICBhbHQ9XCJpbWFnZVwiXG4gICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICBzcmM9e3Byb3BzLnBvcy5TaWduVXJsfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIHtwcm9wcy5wb3MuaXNTdGFtcCA/IDxkaXY+c3RhbXA8L2Rpdj4gOiA8ZGl2PnNpZ25hdHVyZTwvZGl2Pn1cbiAgICAgICAgICB7cHJvcHM/LmhhbmRsZVVzZXJOYW1lICYmXG4gICAgICAgICAgICBwcm9wcz8uaGFuZGxlVXNlck5hbWUocHJvcHM/LmRhdGE/LklkLCBwcm9wcz8uZGF0YT8uUm9sZSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQbGFjZWhvbGRlclR5cGU7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XG5cbmZ1bmN0aW9uIFByZXZOZXh0KHsgcGFnZU51bWJlciwgYWxsUGFnZXMsIGNoYW5nZVBhZ2UgfSkge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG4gIC8vZm9yIGdvIHRvIHByZXZpb3VzIHBhZ2VcbiAgZnVuY3Rpb24gcHJldmlvdXNQYWdlKCkge1xuICAgIGNoYW5nZVBhZ2UoLTEpO1xuICB9XG4gIC8vZm9yIGdvIHRvIG5leHQgcGFnZVxuICBmdW5jdGlvbiBuZXh0UGFnZSgpIHtcbiAgICBjaGFuZ2VQYWdlKDEpO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tbmV1dHJhbCBvcC1idG4teHMgbWQ6b3AtYnRuLXNtIGZvbnQtc2VtaWJvbGQgdGV4dC14c1wiXG4gICAgICAgIGRpc2FibGVkPXtwYWdlTnVtYmVyIDw9IDF9XG4gICAgICAgIG9uQ2xpY2s9e3ByZXZpb3VzUGFnZX1cbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmxvY2tcIj5cbiAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1iYWNrd2FyZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtYmFzZS1jb250ZW50IGZvbnQtbWVkaXVtIG14LTIgMnhsOnRleHQtWzMwcHhdXCI+XG4gICAgICAgIHtwYWdlTnVtYmVyIHx8IChhbGxQYWdlcyA/IDEgOiBcIi0tXCIpfSB7dChcIm9mXCIpfSB7YWxsUGFnZXMgfHwgXCItLVwifVxuICAgICAgPC9zcGFuPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLW5ldXRyYWwgb3AtYnRuLXhzIG1kOm9wLWJ0bi1zbSBmb250LXNlbWlib2xkIHRleHQteHNcIlxuICAgICAgICBkaXNhYmxlZD17cGFnZU51bWJlciA+PSBhbGxQYWdlc31cbiAgICAgICAgb25DbGljaz17bmV4dFBhZ2V9XG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJsb2NrXCI+XG4gICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZm9yd2FyZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByZXZOZXh0O1xuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xuaW1wb3J0IHsgRG9jdW1lbnQsIFBhZ2UgfSBmcm9tIFwicmVhY3QtcGRmXCI7XG5pbXBvcnQgeyB1c2VTZWxlY3RvciB9IGZyb20gXCJyZWFjdC1yZWR1eFwiO1xuXG5mdW5jdGlvbiBSZW5kZXJBbGxQZGZQYWdlKHtcbiAgc2lnblBkZlVybCxcbiAgYWxsUGFnZXMsXG4gIHNldEFsbFBhZ2VzLFxuICBzZXRQYWdlTnVtYmVyLFxuICBzZXRTaWduQnRuUG9zaXRpb24sXG4gIHBhZ2VOdW1iZXIsXG4gIHNpZ25lclBvcyxcbiAgc2lnbmVyT2JqZWN0SWQsXG4gIGNvbnRhaW5lcldILFxuICBwZGZSb3RhdGVCYXNlNjRcbn0pIHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xuICBjb25zdCBbc2lnblBhZ2VOdW1iZXIsIHNldFNpZ25QYWdlTnVtYmVyXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2Jvb2ttYXJrQ29sb3IsIHNldEJvb2ttYXJrQ29sb3JdID0gdXNlU3RhdGUoXCJcIik7XG4gIC8vc2V0IGFsbCBudW1iZXIgb2YgcGFnZXMgYWZ0ZXIgbG9hZCBwZGZcbiAgZnVuY3Rpb24gb25Eb2N1bWVudExvYWQoeyBudW1QYWdlcyB9KSB7XG4gICAgc2V0QWxsUGFnZXMobnVtUGFnZXMpO1xuICAgIC8vY2hlY2sgaWYgc2lnbmVyUG9zIGFycmF5IGV4aXN0IHRoZW4gc2F2ZSBwYWdlIG51bWJlciBleGlzdCBpbiBzaWduZXJQb3MgYXJyYXkgdG8gc2hvdyBib29rbWFyayBpY29uXG4gICAgaWYgKHNpZ25lclBvcykge1xuICAgICAgY29uc3QgY2hlY2tVc2VyID0gc2lnbmVyUG9zLmZpbHRlcihcbiAgICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkXG4gICAgICApO1xuICAgICAgc2V0Qm9va21hcmtDb2xvcihjaGVja1VzZXJbMF0/LmJsb2NrQ29sb3IpO1xuICAgICAgbGV0IHBhZ2VOdW1iZXJBcnIgPSBbXTtcbiAgICAgIGlmIChjaGVja1VzZXI/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2hlY2tVc2VyWzBdPy5wbGFjZUhvbGRlcj8ubWFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgcGFnZU51bWJlckFyci5wdXNoKGRhdGE/LnBhZ2VOdW1iZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzZXRTaWduUGFnZU51bWJlcihwYWdlTnVtYmVyQXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgcGFnZUNvbnRhaW5lciA9IHVzZVJlZigpO1xuICBjb25zdCBpc0hlYWRlciA9IHVzZVNlbGVjdG9yKChzdGF0ZSkgPT4gc3RhdGUuc2hvd0hlYWRlcik7XG4gIGNvbnN0IFtwYWdlV2lkdGgsIHNldFBhZ2VXaWR0aF0gPSB1c2VTdGF0ZShcIlwiKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZVNpemUgPSAoKSA9PiB7XG4gICAgICBpZiAocGFnZUNvbnRhaW5lci5jdXJyZW50KSB7XG4gICAgICAgIHNldFBhZ2VXaWR0aChwYWdlQ29udGFpbmVyLmN1cnJlbnQub2Zmc2V0V2lkdGgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBVc2Ugc2V0VGltZW91dCB0byB3YWl0IGZvciB0aGUgdHJhbnNpdGlvbiB0byBjb21wbGV0ZVxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCh1cGRhdGVTaXplLCAxMDApOyAvLyBtYXRjaCB0aGUgdHJhbnNpdGlvbiBkdXJhdGlvblxuXG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH0sIFtpc0hlYWRlciwgcGFnZUNvbnRhaW5lciwgY29udGFpbmVyV0hdKTtcbiAgLy8nZnVuY3Rpb24gYGFkZFNpZ25hdHVyZUJvb2ttYXJrYCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIHBhZ2Ugd2hlcmUgdGhlIHVzZXIncyBzaWduYXR1cmUgaXMgbG9jYXRlZC5cbiAgY29uc3QgYWRkU2lnbmF0dXJlQm9va21hcmsgPSAoaW5kZXgpID0+IHtcbiAgICBjb25zdCBpc3BhZ2VOdW1iZXIgPSBzaWduUGFnZU51bWJlci5pbmNsdWRlcyhpbmRleCArIDEpO1xuICAgIHJldHVybiAoXG4gICAgICBpc3BhZ2VOdW1iZXIgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIHotMjAgdG9wLVsxcHhdIC1yaWdodC1bMTNweF0gLXRyYW5zbGF0ZS14LTEvMiAtdHJhbnNsYXRlLXktMS8yXCI+XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiBib29rbWFya0NvbG9yIHx8IFwicmVkXCIgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLXNvbGlkIGZhLWJvb2ttYXJrXCJcbiAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIClcbiAgICApO1xuICB9O1xuICBjb25zdCBwZGZEYXRhQmFzZTY0ID0gYGRhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCwke3BkZlJvdGF0ZUJhc2U2NH1gO1xuICByZXR1cm4gKFxuICAgIDxkaXYgcmVmPXtwYWdlQ29udGFpbmVyfSBjbGFzc05hbWU9XCJoaWRkZW4gdy1bMjAlXSBiZy1iYXNlLTEwMCBtZDpibG9ja1wiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC0yIHByLTIgcHQtMiBwYi0xIHRleHQtWzE1cHhdIHRleHQtYmFzZS1jb250ZW50IGZvbnQtc2VtaWJvbGQgYm9yZGVyLWItWzFweF0gYm9yZGVyLWJhc2UtMzAwXCI+XG4gICAgICAgIHt0KFwicGFnZXNcIil9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtgZmxleCBoLVs5MCVdIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBtLTIgIFxuICAgICAgICAgYXV0b1NpZ25TY3JvbGwgaGlkZS1zY3JvbGxiYXIgbWF4LWgtWzEwMHZoXSBgfVxuICAgICAgPlxuICAgICAgICA8RG9jdW1lbnRcbiAgICAgICAgICBsb2FkaW5nPXt0KFwibG9hZGluZy1kb2NcIil9XG4gICAgICAgICAgb25Mb2FkU3VjY2Vzcz17b25Eb2N1bWVudExvYWR9XG4gICAgICAgICAgZmlsZT17KHBkZlJvdGF0ZUJhc2U2NCAmJiBwZGZEYXRhQmFzZTY0KSB8fCBzaWduUGRmVXJsfVxuICAgICAgICA+XG4gICAgICAgICAge0FycmF5LmZyb20obmV3IEFycmF5KGFsbFBhZ2VzKSwgKGVsLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIgLSAxID09PSBpbmRleCA/IFwiYm9yZGVyLVtyZWRdXCIgOiBcImJvcmRlci1bIzg3ODc4N11cIlxuICAgICAgICAgICAgICB9IGJvcmRlci0yICAgbS1bMTBweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgcmVsYXRpdmVgfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0UGFnZU51bWJlcihpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIGlmIChzZXRTaWduQnRuUG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgIHNldFNpZ25CdG5Qb3NpdGlvbihbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7c2lnbmVyUG9zICYmIGFkZFNpZ25hdHVyZUJvb2ttYXJrKGluZGV4KX1cblxuICAgICAgICAgICAgICB7LyogPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSB6LVsxXSBvdmVyZmxvdy1oaWRkZW5cIj4gKi99XG4gICAgICAgICAgICAgIDxQYWdlXG4gICAgICAgICAgICAgICAga2V5PXtgcGFnZV8ke2luZGV4ICsgMX1gfVxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e2luZGV4ICsgMX1cbiAgICAgICAgICAgICAgICB3aWR0aD17cGFnZVdpZHRoIC0gNjB9XG4gICAgICAgICAgICAgICAgc2NhbGU9ezF9XG4gICAgICAgICAgICAgICAgcmVuZGVyQW5ub3RhdGlvbkxheWVyPXtmYWxzZX1cbiAgICAgICAgICAgICAgICByZW5kZXJUZXh0TGF5ZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB7LyogPC9kaXY+ICovfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvRG9jdW1lbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyQWxsUGRmUGFnZTtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IFJTQyBmcm9tIFwicmVhY3Qtc2Nyb2xsYmFycy1jdXN0b21cIjtcclxuaW1wb3J0IHsgRG9jdW1lbnQsIFBhZ2UgfSBmcm9tIFwicmVhY3QtcGRmXCI7XHJcbmltcG9ydCB7XHJcbiAgZGVmYXVsdFdpZHRoSGVpZ2h0LFxyXG4gIGdldENvbnRhaW5lclNjYWxlLFxyXG4gIGhhbmRsZUltYWdlUmVzaXplLFxyXG4gIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplXHJcbn0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L1V0aWxzXCI7XHJcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwiLi9QbGFjZWhvbGRlclwiO1xyXG5pbXBvcnQgQWxlcnQgZnJvbSBcIi4uLy4uL3ByaW1pdGl2ZXMvQWxlcnRcIjtcclxuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xyXG5cclxuZnVuY3Rpb24gUmVuZGVyUGRmKHtcclxuICBwYWdlTnVtYmVyLFxyXG4gIGRyb3AsXHJcbiAgc2lnbmVyUG9zLFxyXG4gIHN1Y2Nlc3NFbWFpbCxcclxuICBoYW5kbGVUYWJEcmFnLFxyXG4gIGhhbmRsZVN0b3AsXHJcbiAgaXNEcmFnZ2luZyxcclxuICBzZXRJc1NpZ25QYWQsXHJcbiAgc2V0SXNTdGFtcCxcclxuICBoYW5kbGVEZWxldGVTaWduLFxyXG4gIHNldFNpZ25LZXksXHJcbiAgcGRmRGV0YWlscyxcclxuICB4eVBvc3Rpb24sXHJcbiAgcGFnZURldGFpbHMsXHJcbiAgcGRmUmVxdWVzdCxcclxuICBzaWduZXJPYmplY3RJZCxcclxuICBzaWduZWRTaWduZXJzLFxyXG4gIHBkZkxvYWQsXHJcbiAgc2V0UGRmTG9hZCxcclxuICBwbGFjZWhvbGRlcixcclxuICBzZXRTaWduZXJQb3MsXHJcbiAgc2V0WHlQb3N0aW9uLFxyXG4gIGluZGV4LFxyXG4gIGNvbnRhaW5lcldILFxyXG4gIHNldElzUmVzaXplLFxyXG4gIGhhbmRsZUxpbmtVc2VyLFxyXG4gIHNldFVuaXF1ZUlkLFxyXG4gIHNpZ25lcnNkYXRhLFxyXG4gIHNldElzUGFnZUNvcHksXHJcbiAgc2V0U2hvd0Ryb3Bkb3duLFxyXG4gIHNldElzSW5pdGlhbCxcclxuICBzZXRJc1ZhbGlkYXRlLFxyXG4gIHNldFdpZGdldFR5cGUsXHJcbiAgc2V0VmFsaWRhdGVBbGVydCxcclxuICBzZXRJc1JhZGlvLFxyXG4gIHNldEN1cnJXaWRnZXRzRGV0YWlscyxcclxuICBzZXRTZWxlY3RXaWRnZXRJZCxcclxuICBzZWxlY3RXaWRnZXRJZCxcclxuICB1blNpZ25lZFdpZGdldElkLFxyXG4gIHNldElzQ2hlY2tib3gsXHJcbiAgaGFuZGxlTmFtZU1vZGFsLFxyXG4gIGhhbmRsZVRleHRTZXR0aW5nTW9kYWwsXHJcbiAgc2V0VGVtcFNpZ25lcklkLFxyXG4gIHVuaXF1ZUlkLFxyXG4gIHBkZk9yaWdpbmFsV0gsXHJcbiAgc2NhbGUsXHJcbiAgc2V0SXNTZWxlY3RJZCxcclxuICBpc3B1YmxpY1RlbXBsYXRlLFxyXG4gIGhhbmRsZVVzZXJEZXRhaWxzLFxyXG4gIHBkZlJvdGF0ZUJhc2U2NCxcclxuICBmb250U2l6ZSxcclxuICBzZXRGb250U2l6ZSxcclxuICBmb250Q29sb3IsXHJcbiAgc2V0Rm9udENvbG9yXHJcbn0pIHtcclxuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XHJcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDc2NztcclxuXHJcbiAgLy9jaGVjayBpc0d1ZXN0U2lnbmVyIGlzIHByZXNlbnQgaW4gbG9jYWwgaWYgeWVzIHRoYW4gaGFuZGxlIGxvZ2luIGZsb3cgaGVhZGVyIGluIG1vYmlsZSB2aWV3XHJcbiAgY29uc3QgaXNHdWVzdFNpZ25lciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNHdWVzdFNpZ25lclwiKTtcclxuXHJcbiAgLy8gaGFuZGxlIHNpZ25hdHVyZSBibG9jayB3aWR0aCBhbmQgaGVpZ2h0IGFjY29yZGluZyB0byBzY3JlZW5cclxuICBjb25zdCBwb3NXaWR0aCA9IChwb3MsIHNpZ25Zb3Vyc2VsZikgPT4ge1xyXG4gICAgY29uc3QgY29udGFpbmVyU2NhbGUgPSBnZXRDb250YWluZXJTY2FsZShcclxuICAgICAgcGRmT3JpZ2luYWxXSCxcclxuICAgICAgcGFnZU51bWJlcixcclxuICAgICAgY29udGFpbmVyV0hcclxuICAgICk7XHJcbiAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBkZWZhdWx0V2lkdGhIZWlnaHQocG9zLnR5cGUpLndpZHRoO1xyXG4gICAgY29uc3QgcG9zV2lkdGggPSBwb3MuV2lkdGggPyBwb3MuV2lkdGggOiBkZWZhdWx0V2lkdGg7XHJcbiAgICBpZiAoc2lnbllvdXJzZWxmKSB7XHJcbiAgICAgIHJldHVybiBwb3NXaWR0aCAqIHNjYWxlICogY29udGFpbmVyU2NhbGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xyXG4gICAgICAgIGlmIChwb3MuSXNSZXNpemUpIHtcclxuICAgICAgICAgIGlmIChzY2FsZSA+IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBvc1dpZHRoICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGUgKiBzY2FsZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwb3NXaWR0aCAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoc2NhbGUgPiAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwb3NXaWR0aCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlICogc2NhbGU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gcG9zV2lkdGggKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHBvc1dpZHRoICogc2NhbGUgKiBjb250YWluZXJTY2FsZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgY29uc3QgcG9zSGVpZ2h0ID0gKHBvcywgc2lnbllvdXJzZWxmKSA9PiB7XHJcbiAgICBjb25zdCBjb250YWluZXJTY2FsZSA9IGdldENvbnRhaW5lclNjYWxlKFxyXG4gICAgICBwZGZPcmlnaW5hbFdILFxyXG4gICAgICBwYWdlTnVtYmVyLFxyXG4gICAgICBjb250YWluZXJXSFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHBvc0hlaWdodCA9IHBvcy5IZWlnaHQgfHwgZGVmYXVsdFdpZHRoSGVpZ2h0KHBvcy50eXBlKS5oZWlnaHQ7XHJcbiAgICBpZiAoc2lnbllvdXJzZWxmKSB7XHJcbiAgICAgIHJldHVybiBwb3NIZWlnaHQgKiBzY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHBvcy5pc01vYmlsZSAmJiBwb3Muc2NhbGUpIHtcclxuICAgICAgICBpZiAocG9zLklzUmVzaXplKSB7XHJcbiAgICAgICAgICBpZiAoc2NhbGUgPiAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwb3NIZWlnaHQgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZSAqIHNjYWxlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoc2NhbGUgPiAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwb3NIZWlnaHQgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZSAqIHNjYWxlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gcG9zSGVpZ2h0ICogc2NhbGUgKiBjb250YWluZXJTY2FsZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vZnVuY3Rpb24gZm9yIHJlbmRlciBwbGFjZWhvbGRlciBibG9jayBvdmVyIHBkZiBkb2N1bWVudFxyXG4gIGNvbnN0IGNoZWNrU2lnbmVkU2lnbmVycyA9IChkYXRhKSA9PiB7XHJcbiAgICBsZXQgY2hlY2tTaWduID0gW107XHJcbiAgICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgcXVpY2sgc2VuZCBmbG93IGFuZCB1c2luZyBub3JtYWwgcmVxdWVzdCBzaWduIGZsb3dcclxuICAgIGNoZWNrU2lnbiA9IHNpZ25lZFNpZ25lcnNcclxuICAgICAgPyBzaWduZWRTaWduZXJzPy5maWx0ZXIoXHJcbiAgICAgICAgICAoc2lnbikgPT5cclxuICAgICAgICAgICAgc2lnbj8uSWQgPT09IGRhdGE/LklkIHx8IHNpZ24/Lm9iamVjdElkID09PSBkYXRhPy5zaWduZXJPYmpJZFxyXG4gICAgICAgIClcclxuICAgICAgOiBbXTtcclxuICAgIGNvbnN0IGhhbmRsZUFsbFVzZXJOYW1lID0gKElkLCBSb2xlLCB0eXBlKSA9PiB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWJsYWNrIHRleHQtWzhweF0gZm9udC1ib2xkXCI+XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBwZGZEZXRhaWxzWzBdLlNpZ25lcnM/LmZpbmQoXHJcbiAgICAgICAgICAgICAgICAoc2lnbmVyKSA9PiBzaWduZXIub2JqZWN0SWQgPT09IGRhdGEuc2lnbmVyT2JqSWRcclxuICAgICAgICAgICAgICApPy5OYW1lXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAge3R5cGUgJiYgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSBmb250LWJvbGRcIj57dHlwZX08L2Rpdj59XHJcbiAgICAgICAgICB7Um9sZSAmJiAoXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ibGFjayB0ZXh0LVs4cHhdIGZvbnQtbWVkaXVtXCI+XHJcbiAgICAgICAgICAgICAge2AoJHtSb2xlfSlgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICl9XHJcbiAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBjaGVja1NpZ24ubGVuZ3RoID09PSAwICYmXHJcbiAgICAgIGRhdGEucGxhY2VIb2xkZXIubWFwKChwbGFjZURhdGEsIGtleSkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtrZXl9PlxyXG4gICAgICAgICAgICB7cGxhY2VEYXRhLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIgJiZcclxuICAgICAgICAgICAgICBwbGFjZURhdGEucG9zLm1hcCgocG9zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICBwb3MgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e3Bvcy5rZXl9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFBsYWNlaG9sZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcz17cG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduS2V5PXtzZXRTaWduS2V5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcD17c2V0SXNTdGFtcH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemU9e2hhbmRsZUltYWdlUmVzaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgeHlQb3N0aW9uPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFh5UG9zdGlvbj17c2V0U2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXtkYXRhfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1Jlc2l6ZT17c2V0SXNSZXNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0JvcmRlcj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lck9iaklkPXtzaWduZXJPYmplY3RJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93RHJvcGRvd249e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTmVlZFNpZ249e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zV2lkdGg9e3Bvc1dpZHRofVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NIZWlnaHQ9e3Bvc0hlaWdodH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e2hhbmRsZUFsbFVzZXJOYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0RyYWdnaW5nPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlQWxlcnQ9e3NldFZhbGlkYXRlQWxlcnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuU2lnbmVkV2lkZ2V0SWQ9e3VuU2lnbmVkV2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e3NldEN1cnJXaWRnZXRzRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQ9e3VuaXF1ZUlkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSD17cGRmT3JpZ2luYWxXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNwdWJsaWNUZW1wbGF0ZT17aXNwdWJsaWNUZW1wbGF0ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlckRldGFpbHM9e2hhbmRsZVVzZXJEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIHJlbmRlciBwbGFjZWhvbGRlciBibG9jayBvdmVyIHBkZiBkb2N1bWVudFxyXG5cclxuICBjb25zdCBoYW5kbGVVc2VyTmFtZSA9IChJZCwgUm9sZSwgdHlwZSkgPT4ge1xyXG4gICAgaWYgKElkKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrU2lnbiA9IHNpZ25lcnNkYXRhLmZpbmQoKHNpZ24pID0+IHNpZ24uSWQgPT09IElkKTtcclxuICAgICAgaWYgKGNoZWNrU2lnbj8uTmFtZSkge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICA8PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtYmxhY2sgdGV4dC1bOHB4XSBmb250LW1lZGl1bVwiPlxyXG4gICAgICAgICAgICAgIHtjaGVja1NpZ24/Lk5hbWV9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB7dHlwZSAmJiA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIGZvbnQtYm9sZFwiPnt0eXBlfTwvZGl2Pn1cclxuICAgICAgICAgICAge1JvbGUgJiYgKFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ibGFjayB0ZXh0LVs4cHhdIGZvbnQtbWVkaXVtXCI+XHJcbiAgICAgICAgICAgICAgICB7YCgke1JvbGV9KWB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgICA8Lz5cclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICA8PlxyXG4gICAgICAgICAgICB7dHlwZSAmJiA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIGZvbnQtYm9sZFwiPnt0eXBlfTwvZGl2Pn1cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWJsYWNrIHRleHQtWzhweF0gZm9udC1tZWRpdW1cIj57Um9sZX08L2Rpdj5cclxuICAgICAgICAgIDwvPlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgPD5cclxuICAgICAgICAgIHt0eXBlICYmIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gZm9udC1ib2xkXCI+e3R5cGV9PC9kaXY+fVxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWJsYWNrIHRleHQtWzhweF0gZm9udC1tZWRpdW1cIj57Um9sZX08L2Rpdj5cclxuICAgICAgICA8Lz5cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9O1xyXG4gIGNvbnN0IHBkZkRhdGFCYXNlNjQgPSBgZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LCR7cGRmUm90YXRlQmFzZTY0fWA7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICB7c3VjY2Vzc0VtYWlsICYmIChcclxuICAgICAgICA8QWxlcnQgdHlwZT17XCJzdWNjZXNzXCJ9Pnt0KFwic3VjY2Vzcy1lbWFpbC1hbGVydFwiKX08L0FsZXJ0PlxyXG4gICAgICApfVxyXG4gICAgICB7aXNNb2JpbGUgPyAoXHJcbiAgICAgICAgPFJTQ1xyXG4gICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcclxuICAgICAgICAgICAgYm94U2hhZG93OiBcInJnYmEoMTcsIDEyLCA0NiwgMC4xNSkgMHB4IDQ4cHggMTAwcHggMHB4XCIsXHJcbiAgICAgICAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0IC0gMjAwLFxyXG4gICAgICAgICAgICB6SW5kZXg6IDBcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICBjbGFzc05hbWU9XCJoLWZ1bGxcIlxyXG4gICAgICAgICAgbm9TY3JvbGxZPXtmYWxzZX1cclxuICAgICAgICAgIG5vU2Nyb2xsWD17c2NhbGUgPT09IDEgPyB0cnVlIDogZmFsc2V9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBkYXRhLXR1dD1cInJlYWN0b3VyRm9ydGhcIlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgICAgIGlzR3Vlc3RTaWduZXIgPyBcIjMwcHhcIiA6IFwiXCJcclxuICAgICAgICAgICAgfSBib3JkZXItWzAuMXB4XSBib3JkZXItWyNlYmU4ZThdIG92ZXJmbG93LXgtYXV0b2B9XHJcbiAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgd2lkdGg6IGNvbnRhaW5lcldIPy53aWR0aCAmJiBjb250YWluZXJXSD8ud2lkdGggKiBzY2FsZVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICByZWY9e2Ryb3B9XHJcbiAgICAgICAgICAgIGlkPVwiY29udGFpbmVyXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge2NvbnRhaW5lcldIPy53aWR0aCAmJlxyXG4gICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0gubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgIChwZGZSZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHNpZ25lclBvcy5tYXAoKGRhdGEsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtrZXl9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2hlY2tTaWduZWRTaWduZXJzKGRhdGEpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgOiBwbGFjZWhvbGRlciAvLyBwbGFjZWhvbGRlciBtb2JpbGVcclxuICAgICAgICAgICAgICAgICAgPyBzaWduZXJQb3MubWFwKChkYXRhLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2luZH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge2RhdGEucGxhY2VIb2xkZXIubWFwKChwbGFjZURhdGEsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmRleH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BsYWNlRGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZURhdGEucG9zLm1hcCgocG9zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17cG9zLmtleX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGxhY2Vob2xkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zPXtwb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUGFnZUNvcHk9e3NldElzUGFnZUNvcHl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURlbGV0ZVNpZ249e2hhbmRsZURlbGV0ZVNpZ259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRhYkRyYWc9e2hhbmRsZVRhYkRyYWd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVN0b3A9e2hhbmRsZVN0b3B9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVJbWFnZVJlc2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eVBvc3Rpb249e3NpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtzZXRTaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9e2RhdGF9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUmVzaXplPXtzZXRJc1Jlc2l6ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hvd0Ryb3Bkb3duPXtzZXRTaG93RHJvcGRvd259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0JvcmRlcj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQbGFjZWhvbGRlcj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VW5pcXVlSWQ9e3NldFVuaXF1ZUlkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVMaW5rVXNlcj17aGFuZGxlTGlua1VzZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVzZXJOYW1lPXtoYW5kbGVVc2VyTmFtZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NXaWR0aD17cG9zV2lkdGh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc0hlaWdodD17cG9zSGVpZ2h0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RyYWdnaW5nPXtpc0RyYWdnaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1ZhbGlkYXRlPXtzZXRJc1ZhbGlkYXRlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWRnZXRUeXBlPXtzZXRXaWRnZXRUeXBlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1JhZGlvPXtzZXRJc1JhZGlvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0NoZWNrYm94PXtzZXRJc0NoZWNrYm94fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVOYW1lTW9kYWw9e2hhbmRsZU5hbWVNb2RhbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVtcFNpZ25lcklkPXtzZXRUZW1wU2lnbmVySWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkPXt1bmlxdWVJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbD17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NlbGVjdElkPXtzZXRJc1NlbGVjdElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvbnRTaXplPXtzZXRGb250U2l6ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udENvbG9yPXtmb250Q29sb3J9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvbnRDb2xvcj17c2V0Rm9udENvbG9yfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICA6ICFwZGZEZXRhaWxzPy5bMF0/LklzQ29tcGxldGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgeHlQb3N0aW9uLm1hcCgoZGF0YSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucG9zLm1hcCgocG9zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQbGFjZWhvbGRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M9e3Bvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNQYWdlQ29weT17c2V0SXNQYWdlQ29weX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbktleT17c2V0U2lnbktleX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVsZXRlU2lnbj17aGFuZGxlRGVsZXRlU2lnbn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcD17c2V0SXNTdGFtcH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGFiRHJhZz17aGFuZGxlVGFiRHJhZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RvcD17aGFuZGxlU3RvcH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemU9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eVBvc3Rpb249e3h5UG9zdGlvbn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtzZXRYeVBvc3Rpb259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTaWduUGFkPXtzZXRJc1NpZ25QYWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0JvcmRlcj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc1dpZHRoPXtwb3NXaWR0aH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zSGVpZ2h0PXtwb3NIZWlnaHR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM9e3BkZkRldGFpbHNbMF19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRHJhZ2dpbmc9e2lzRHJhZ2dpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5pdGlhbD17c2V0SXNJbml0aWFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWRnZXRUeXBlPXtzZXRXaWRnZXRUeXBlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RXaWRnZXRJZD17c2V0U2VsZWN0V2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFdpZGdldElkPXtzZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e2hhbmRsZVVzZXJOYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0NoZWNrYm94PXtzZXRJc0NoZWNrYm94fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0PXtzZXRWYWxpZGF0ZUFsZXJ0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWw9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0g9e3BkZk9yaWdpbmFsV0h9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9udFNpemU9e3NldEZvbnRTaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250Q29sb3I9e2ZvbnRDb2xvcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9udENvbG9yPXtzZXRGb250Q29sb3J9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSl9XHJcblxyXG4gICAgICAgICAgICA8RG9jdW1lbnRcclxuICAgICAgICAgICAgICBvbkxvYWRFcnJvcj17KCkgPT4gc2V0UGRmTG9hZChmYWxzZSl9XHJcbiAgICAgICAgICAgICAgbG9hZGluZz17dChcImxvYWRpbmctZG9jXCIpfVxyXG4gICAgICAgICAgICAgIG9uTG9hZFN1Y2Nlc3M9e3BhZ2VEZXRhaWxzfVxyXG4gICAgICAgICAgICAgIC8vIHJlZj17cGRmUmVmfSdcclxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2V0U2VsZWN0V2lkZ2V0SWQpIHtcclxuICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICBmaWxlPXtcclxuICAgICAgICAgICAgICAgIChwZGZSb3RhdGVCYXNlNjQgJiYgcGRmRGF0YUJhc2U2NCkgfHxcclxuICAgICAgICAgICAgICAgIHBkZkRldGFpbHNbMF0/LlNpZ25lZFVybCB8fFxyXG4gICAgICAgICAgICAgICAgcGRmRGV0YWlsc1swXS5VUkxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8UGFnZVxyXG4gICAgICAgICAgICAgICAgc2NhbGU9e3NjYWxlIHx8IDF9XHJcbiAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxyXG4gICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgIHdpZHRoPXtjb250YWluZXJXSC53aWR0aH1cclxuICAgICAgICAgICAgICAgIHJlbmRlckFubm90YXRpb25MYXllcj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICByZW5kZXJUZXh0TGF5ZXI9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgb25HZXRBbm5vdGF0aW9uc0Vycm9yPXsoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJhbm5vdGF0aW9uIGVycm9yXCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9Eb2N1bWVudD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvUlNDPlxyXG4gICAgICApIDogKFxyXG4gICAgICAgIDxSU0NcclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXHJcbiAgICAgICAgICAgIGJveFNoYWRvdzogXCJyZ2JhKDE3LCAxMiwgNDYsIDAuMTUpIDBweCA0OHB4IDEwMHB4IDBweFwiLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCArIFwicHhcIixcclxuICAgICAgICAgICAgekluZGV4OiAwXHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgICAgbm9TY3JvbGxZPXtmYWxzZX1cclxuICAgICAgICAgIG5vU2Nyb2xsWD17c2NhbGUgPT09IDEgPyB0cnVlIDogZmFsc2V9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgIHdpZHRoOiBjb250YWluZXJXSD8ud2lkdGggJiYgY29udGFpbmVyV0g/LndpZHRoICogc2NhbGVcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgcmVmPXtkcm9wfVxyXG4gICAgICAgICAgICBpZD1cImNvbnRhaW5lclwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHtwZGZMb2FkICYmXHJcbiAgICAgICAgICAgICAgY29udGFpbmVyV0g/LndpZHRoICYmXHJcbiAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSC5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgKHBkZlJlcXVlc3QgLy9wZGYgcmVxdWVzdCBzaWduIGZsb3dcclxuICAgICAgICAgICAgICAgID8gc2lnbmVyUG9zPy5tYXAoKGRhdGEsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtrZXl9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2hlY2tTaWduZWRTaWduZXJzKGRhdGEpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgOiBwbGFjZWhvbGRlciAvL3BsYWNlaG9sZGVyIGFuZCB0ZW1wbGF0ZSBmbG93XHJcbiAgICAgICAgICAgICAgICAgID8gc2lnbmVyUG9zLm1hcCgoZGF0YSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhPy5wbGFjZUhvbGRlciAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT8ucGxhY2VIb2xkZXIubWFwKChwbGFjZURhdGEsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17aW5kZXh9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BsYWNlRGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlRGF0YS5wb3MubWFwKChwb3MpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17cG9zLmtleX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQbGFjZWhvbGRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcz17cG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUGFnZUNvcHk9e3NldElzUGFnZUNvcHl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbktleT17c2V0U2lnbktleX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWxldGVTaWduPXtoYW5kbGVEZWxldGVTaWdufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGFiRHJhZz17aGFuZGxlVGFiRHJhZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdG9wPXtoYW5kbGVTdG9wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUltYWdlUmVzaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFh5UG9zdGlvbj17c2V0U2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9e2RhdGF9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNSZXNpemU9e3NldElzUmVzaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNob3dEcm9wZG93bj17c2V0U2hvd0Ryb3Bkb3dufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0JvcmRlcj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BsYWNlaG9sZGVyPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVuaXF1ZUlkPXtzZXRVbmlxdWVJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVMaW5rVXNlcj17aGFuZGxlTGlua1VzZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e2hhbmRsZVVzZXJOYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NXaWR0aD17cG9zV2lkdGh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zSGVpZ2h0PXtwb3NIZWlnaHR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEcmFnZ2luZz17aXNEcmFnZ2luZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1ZhbGlkYXRlPXtzZXRJc1ZhbGlkYXRlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZGdldFR5cGU9e3NldFdpZGdldFR5cGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNSYWRpbz17c2V0SXNSYWRpb31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0NoZWNrYm94PXtzZXRJc0NoZWNrYm94fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQ9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5hbWVNb2RhbD17aGFuZGxlTmFtZU1vZGFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRlbXBTaWduZXJJZD17c2V0VGVtcFNpZ25lcklkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkPXt1bmlxdWVJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXh0U2V0dGluZ01vZGFsPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9e3NjYWxlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTZWxlY3RJZD17c2V0SXNTZWxlY3RJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9udFNpemU9e3NldEZvbnRTaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRDb2xvcj17Zm9udENvbG9yfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvbnRDb2xvcj17c2V0Rm9udENvbG9yfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgIDogIXBkZkRldGFpbHM/LlswXT8uSXNDb21wbGV0ZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICB4eVBvc3Rpb24/Lm1hcCgoZGF0YSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzaWdueW91cnNlbGYgZmxvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17aW5kfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7ZGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBvcy5tYXAoKHBvcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e3Bvcy5rZXl9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFBsYWNlaG9sZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcz17cG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1BhZ2VDb3B5PXtzZXRJc1BhZ2VDb3B5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduS2V5PXtzZXRTaWduS2V5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWxldGVTaWduPXtoYW5kbGVEZWxldGVTaWdufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0YW1wPXtzZXRJc1N0YW1wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUYWJEcmFnPXtoYW5kbGVUYWJEcmFnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdG9wPXsoZXZlbnQsIGRyYWdFbGVtZW50KSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVN0b3AoZXZlbnQsIGRyYWdFbGVtZW50LCBwb3MudHlwZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17eHlQb3N0aW9ufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRYeVBvc3Rpb249e3NldFh5UG9zdGlvbn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTaWduUGFkPXtzZXRJc1NpZ25QYWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0JvcmRlcj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc1dpZHRoPXtwb3NXaWR0aH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zSGVpZ2h0PXtwb3NIZWlnaHR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM9e3BkZkRldGFpbHNbMF19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRHJhZ2dpbmc9e2lzRHJhZ2dpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5pdGlhbD17c2V0SXNJbml0aWFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRXaWRnZXRUeXBlPXtzZXRXaWRnZXRUeXBlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RXaWRnZXRJZD17c2V0U2VsZWN0V2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFdpZGdldElkPXtzZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e2hhbmRsZVVzZXJOYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0NoZWNrYm94PXtzZXRJc0NoZWNrYm94fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0PXtzZXRWYWxpZGF0ZUFsZXJ0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWw9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSD17cGRmT3JpZ2luYWxXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU9e2ZvbnRTaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb250U2l6ZT17c2V0Rm9udFNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRDb2xvcj17Zm9udENvbG9yfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb250Q29sb3I9e3NldEZvbnRDb2xvcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSl9XHJcblxyXG4gICAgICAgICAgICB7LyogdGhpcyBjb21wb25lbnQgZm9yIHJlbmRlciBwZGYgZG9jdW1lbnQgaXMgaW4gbWlkZGxlIG9mIHRoZSBjb21wb25lbnQgKi99XHJcbiAgICAgICAgICAgIDxEb2N1bWVudFxyXG4gICAgICAgICAgICAgIG9uTG9hZEVycm9yPXsoKSA9PiBzZXRQZGZMb2FkKGZhbHNlKX1cclxuICAgICAgICAgICAgICBsb2FkaW5nPXt0KFwibG9hZGluZy1kb2NcIil9XHJcbiAgICAgICAgICAgICAgb25Mb2FkU3VjY2Vzcz17cGFnZURldGFpbHN9XHJcbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNldFNlbGVjdFdpZGdldElkKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgLy8gcmVmPXtwZGZSZWZ9XHJcbiAgICAgICAgICAgICAgZmlsZT17XHJcbiAgICAgICAgICAgICAgICAocGRmUm90YXRlQmFzZTY0ICYmIHBkZkRhdGFCYXNlNjQpIHx8XHJcbiAgICAgICAgICAgICAgICBwZGZEZXRhaWxzWzBdPy5TaWduZWRVcmwgfHxcclxuICAgICAgICAgICAgICAgIHBkZkRldGFpbHNbMF0uVVJMXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPFBhZ2VcclxuICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XHJcbiAgICAgICAgICAgICAgICB3aWR0aD17Y29udGFpbmVyV0gud2lkdGh9XHJcbiAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGUgfHwgMX1cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XCItei1bMV1cIn0gLy8gd2hlbiB1c2VyIHpvb20taW4gaW4gdGFibGV0IHdpZGdldHMgbW92ZSBiYWNrd2FyZCB0aGF0J3Mgd2h5IHBhc3MgLXotWzFdXHJcbiAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgcmVuZGVyQW5ub3RhdGlvbkxheWVyPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgIHJlbmRlclRleHRMYXllcj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICBvbkdldEFubm90YXRpb25zRXJyb3I9eyhlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImFubm90YXRpb24gZXJyb3JcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0RvY3VtZW50PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9SU0M+XHJcbiAgICAgICl9XHJcbiAgICA8Lz5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJQZGY7XHJcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcbmltcG9ydCBTaWduYXR1cmVDYW52YXMgZnJvbSBcInJlYWN0LXNpZ25hdHVyZS1jYW52YXNcIjtcbmZ1bmN0aW9uIFNpZ25QYWQoe1xuICBpc1NpZ25QYWQsXG4gIGlzU3RhbXAsXG4gIHNldElzSW1hZ2VTZWxlY3QsXG4gIG9uU2F2ZVNpZ24sXG4gIHNldElzU2lnblBhZCxcbiAgc2V0SW1hZ2UsXG4gIGlzSW1hZ2VTZWxlY3QsXG4gIGltYWdlUmVmLFxuICBvbkltYWdlQ2hhbmdlLFxuICBvblNhdmVJbWFnZSxcbiAgaW1hZ2UsXG4gIGRlZmF1bHRTaWduLFxuICBzZXRTaWduYXR1cmUsXG4gIG15SW5pdGlhbCxcbiAgaXNJbml0aWFsLFxuICBzZXRJc0luaXRpYWwsXG4gIHNldElzU3RhbXAsXG4gIHdpZGdldFR5cGUsXG4gIGN1cnJXaWRnZXRzRGV0YWlscyxcbiAgc2V0Q3VycldpZGdldHNEZXRhaWxzXG59KSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW3BlbkNvbG9yLCBzZXRQZW5Db2xvcl0gPSB1c2VTdGF0ZShcImJsdWVcIik7XG4gIGNvbnN0IGFsbENvbG9yID0gW1wiYmx1ZVwiLCBcInJlZFwiLCBcImJsYWNrXCJdO1xuICBjb25zdCBjYW52YXNSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IFtpc0RlZmF1bHRTaWduLCBzZXRJc0RlZmF1bHRTaWduXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2lzVGFiLCBzZXRJc1RhYl0gPSB1c2VTdGF0ZShcImRyYXdcIik7XG4gIGNvbnN0IFtpc1NpZ25JbWcsIHNldElzU2lnbkltZ10gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW3NpZ25WYWx1ZSwgc2V0U2lnblZhbHVlXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbdGV4dFdpZHRoLCBzZXRUZXh0V2lkdGhdID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFt0ZXh0SGVpZ2h0LCBzZXRUZXh0SGVpZ2h0XSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbc2lnbmF0dXJlVHlwZSwgc2V0U2lnbmF0dXJlVHlwZV0gPSB1c2VTdGF0ZShcImRyYXdcIik7XG4gIGNvbnN0IGZvbnRPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6IFwiRmFzdGhhbmRcIiB9LFxuICAgIHsgdmFsdWU6IFwiRGFuY2luZyBTY3JpcHRcIiB9LFxuICAgIHsgdmFsdWU6IFwiQ2VkYXJ2aWxsZSBDdXJzaXZlXCIgfSxcbiAgICB7IHZhbHVlOiBcIkRlbGljaW91cyBIYW5kcmF3blwiIH1cbiAgICAvLyBBZGQgbW9yZSBmb250IG9wdGlvbnMgYXMgbmVlZGVkXG4gIF07XG4gIGNvbnN0IFtmb250U2VsZWN0LCBzZXRGb250U2VsZWN0XSA9IHVzZVN0YXRlKGZvbnRPcHRpb25zWzBdLnZhbHVlKTtcblxuICBjb25zdCBzZW5kZXJVc2VyID1cbiAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgIGBQYXJzZS8ke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKX0vY3VycmVudFVzZXJgXG4gICAgKSAmJlxuICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgYFBhcnNlLyR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpfS9jdXJyZW50VXNlcmBcbiAgICApO1xuICBjb25zdCBqc29uU2VuZGVyID0gSlNPTi5wYXJzZShzZW5kZXJVc2VyKTtcbiAgY29uc3QgY3VycmVudFVzZXJOYW1lID0ganNvblNlbmRlciAmJiBqc29uU2VuZGVyLm5hbWU7XG5cbiAgLy9mdW5jdGlvbiBmb3IgY2xlYXIgc2lnbmF0dXJlIGltYWdlXG4gIGNvbnN0IGhhbmRsZUNsZWFyID0gKCkgPT4ge1xuICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscyh7fSk7XG4gICAgaWYgKGlzVGFiID09PSBcImRyYXdcIikge1xuICAgICAgaWYgKGNhbnZhc1JlZi5jdXJyZW50KSB7XG4gICAgICAgIGNhbnZhc1JlZi5jdXJyZW50LmNsZWFyKCk7XG4gICAgICB9IGVsc2UgaWYgKGlzU3RhbXApIHtcbiAgICAgICAgc2V0SW1hZ2UoXCJcIik7XG4gICAgICB9XG4gICAgICBzZXRJc1NpZ25JbWcoXCJcIik7XG4gICAgfSBlbHNlIGlmIChpc1RhYiA9PT0gXCJ1cGxvYWRJbWFnZVwiKSB7XG4gICAgICBzZXRJbWFnZShcIlwiKTtcbiAgICB9XG4gICAgLy8gc2V0SXNJbml0aWFsKGZhbHNlKTtcbiAgfTtcbiAgLy9mdW5jdGlvbiBmb3Igc2V0IHNpZ25hdHVyZSB1cmxcbiAgY29uc3QgaGFuZGxlU2lnbmF0dXJlQ2hhbmdlID0gKGRhdGEpID0+IHtcbiAgICBzZXRTaWduYXR1cmUoZGF0YSk7XG4gICAgc2V0SXNTaWduSW1nKGRhdGEpO1xuICB9O1xuICAvL3NhdmUgYnV0dG9uIGNvbXBvbmVudFxuICBjb25zdCBTYXZlQnRuID0gKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICB7KGlzVGFiID09PSBcImRyYXdcIiB8fCBpc1RhYiA9PT0gXCJ1cGxvYWRJbWFnZVwiKSAmJiAoXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0IG1yLTEgbXQtWzJweF1cIlxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlQ2xlYXIoKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dChcImNsZWFyXCIpfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICApfVxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzKHt9KTtcbiAgICAgICAgICAgIGlmICghaW1hZ2UpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVGFiID09PSBcIm15c2lnbmF0dXJlXCIpIHtcbiAgICAgICAgICAgICAgICBzZXRJc1NpZ25JbWcoXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlzSW5pdGlhbCkge1xuICAgICAgICAgICAgICAgICAgb25TYXZlU2lnbihzaWduYXR1cmVUeXBlLCBcImluaXRpYWxzXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBvblNhdmVTaWduKG51bGwsIFwiZGVmYXVsdFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzVGFiID09PSBcInR5cGVcIikge1xuICAgICAgICAgICAgICAgICAgc2V0SXNTaWduSW1nKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgb25TYXZlU2lnbihcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICFpc0luaXRpYWwgJiYgdGV4dFdpZHRoID4gMTUwID8gMTUwIDogdGV4dFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAhaXNJbml0aWFsICYmIHRleHRIZWlnaHQgPiAzNSA/IDM1IDogdGV4dEhlaWdodFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc2V0SXNTaWduSW1nKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgY2FudmFzUmVmLmN1cnJlbnQuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgIG9uU2F2ZVNpZ24oc2lnbmF0dXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2V0UGVuQ29sb3IoXCJibHVlXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2V0SXNTaWduSW1nKFwiXCIpO1xuICAgICAgICAgICAgICBvblNhdmVJbWFnZShzaWduYXR1cmVUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldElzU2lnblBhZChmYWxzZSk7XG4gICAgICAgICAgICBzZXRJc0luaXRpYWwoZmFsc2UpO1xuICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XG4gICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKGZhbHNlKTtcbiAgICAgICAgICAgIHNldEltYWdlKCk7XG4gICAgICAgICAgICBzZXRJc1RhYihcImRyYXdcIik7XG4gICAgICAgICAgICBzZXRTaWduVmFsdWUoXCJcIik7XG4gICAgICAgICAgICBzZXRJc1N0YW1wKGZhbHNlKTtcbiAgICAgICAgICB9fVxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICBpc1NpZ25JbWcgfHwgaW1hZ2UgfHwgaXNEZWZhdWx0U2lnbiB8fCB0ZXh0V2lkdGhcbiAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgIDogXCJwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgICB9IG9wLWJ0biBvcC1idG4tcHJpbWFyeSBzaGFkb3ctbGdgfVxuICAgICAgICAgIGRpc2FibGVkPXtcbiAgICAgICAgICAgIChpc1RhYiA9PT0gXCJkcmF3XCIgJiYgaXNTaWduSW1nKSB8fFxuICAgICAgICAgICAgKGlzVGFiID09PSBcImltYWdlXCIgJiYgaW1hZ2UpIHx8XG4gICAgICAgICAgICAoaXNUYWIgPT09IFwibXlzaWduYXR1cmVcIiAmJiBpc0RlZmF1bHRTaWduKSB8fFxuICAgICAgICAgICAgKGlzVGFiID09PSBcInR5cGVcIiAmJiB0ZXh0V2lkdGgpXG4gICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgOiBpbWFnZVxuICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICA6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgID5cbiAgICAgICAgICB7dChcInNhdmVcIil9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfTtcbiAgLy91c2VFZmZlY3QgZm9yIHNldCBhbHJlYWR5IGRyYXcgb3Igc2F2ZSBzaWduYXR1cmUgdXJsL3RleHQgdXJsIG9mIHNpZ25hdHVyZSB0ZXh0IHR5cGUgYW5kIGRyYXcgdHlwZSBmb3IgaW5pdGlhbCB0eXBlIGFuZCBzaWduYXR1cmUgdHlwZSB3aWRnZXRzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGN1cnJXaWRnZXRzRGV0YWlscyAmJiBjYW52YXNSZWYuY3VycmVudCkge1xuICAgICAgY29uc3QgaXNXaWRnZXRUeXBlID0gY3VycldpZGdldHNEZXRhaWxzPy50eXBlO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlVHlwZSA9IGN1cnJXaWRnZXRzRGV0YWlscz8uc2lnbmF0dXJlVHlwZTtcbiAgICAgIGNvbnN0IHVybCA9IGN1cnJXaWRnZXRzRGV0YWlscz8uU2lnblVybDtcbiAgICAgIC8vY2hlY2tpbmcgd2lkZ2V0IHR5cGUgYW5kIGRyYXcgdHlwZSBzaWduYXR1cmUgdXJsXG4gICAgICBpZiAoaXNJbml0aWFsKSB7XG4gICAgICAgIGlmIChpc1dpZGdldFR5cGUgPT09IFwiaW5pdGlhbHNcIiAmJiBzaWduYXR1cmVUeXBlID09PSBcImRyYXdcIiAmJiB1cmwpIHtcbiAgICAgICAgICBjYW52YXNSZWYuY3VycmVudC5mcm9tRGF0YVVSTCh1cmwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpc1dpZGdldFR5cGUgPT09IFwic2lnbmF0dXJlXCIgJiZcbiAgICAgICAgc2lnbmF0dXJlVHlwZSA9PT0gXCJkcmF3XCIgJiZcbiAgICAgICAgdXJsXG4gICAgICApIHtcbiAgICAgICAgY2FudmFzUmVmLmN1cnJlbnQuZnJvbURhdGFVUkwodXJsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0cmltbWVkTmFtZSA9IGN1cnJlbnRVc2VyTmFtZSAmJiBjdXJyZW50VXNlck5hbWUudHJpbSgpO1xuICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gdHJpbW1lZE5hbWU/LmNoYXJBdCgwKTtcbiAgICBjb25zdCB1c2VyTmFtZSA9IGlzSW5pdGlhbCA/IGZpcnN0Q2hhcmFjdGVyIDogY3VycmVudFVzZXJOYW1lO1xuICAgIHNldFNpZ25WYWx1ZSh1c2VyTmFtZSk7XG4gICAgc2V0Rm9udFNlbGVjdChcIkZhc3RoYW5kXCIpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbaXNTaWduUGFkXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbG9hZEZvbnQgPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBkb2N1bWVudC5mb250cy5sb2FkKGAyMHB4ICR7Zm9udFNlbGVjdH1gKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0Rm9udFNUeWxlID0gZm9udE9wdGlvbnMuZmluZChcbiAgICAgICAgICAoZm9udCkgPT4gZm9udC52YWx1ZSA9PT0gZm9udFNlbGVjdFxuICAgICAgICApO1xuICAgICAgICBzZXRGb250U2VsZWN0KHNlbGVjdEZvbnRTVHlsZT8udmFsdWUgfHwgZm9udE9wdGlvbnNbMF0udmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGxvYWRpbmcgZm9udDpcIiwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsb2FkRm9udCgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2ZvbnRTZWxlY3RdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIExvYWQgdGhlIGRlZmF1bHQgc2lnbmF0dXJlIGFmdGVyIHRoZSBjb21wb25lbnQgbW91bnRzXG4gICAgaWYgKGNhbnZhc1JlZi5jdXJyZW50KSB7XG4gICAgICBjYW52YXNSZWYuY3VycmVudC5mcm9tRGF0YVVSTChpc1NpZ25JbWcpO1xuICAgIH1cbiAgICBpZiAoaXNUYWIgPT09IFwidHlwZVwiKSB7XG4gICAgICBjb25zdCB0cmltbWVkTmFtZSA9IHNpZ25WYWx1ZSA/IHNpZ25WYWx1ZS50cmltKCkgOiBjdXJyZW50VXNlck5hbWUudHJpbSgpO1xuICAgICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSB0cmltbWVkTmFtZS5jaGFyQXQoMCk7XG4gICAgICBjb25zdCB1c2VyTmFtZSA9IGlzSW5pdGlhbCA/IGZpcnN0Q2hhcmFjdGVyIDogc2lnblZhbHVlO1xuICAgICAgc2V0U2lnblZhbHVlKHVzZXJOYW1lKTtcbiAgICAgIGNvbnZlcnRUb0ltZyhmb250U2VsZWN0LCB1c2VyTmFtZSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2lzVGFiXSk7XG4gIC8vZnVuY3Rpb24gZm9yIGNvbnZlcnQgaW5wdXQgdGV4dCB2YWx1ZSBpbiBpbWFnZVxuICBjb25zdCBjb252ZXJ0VG9JbWcgPSBhc3luYyAoZm9udFN0eWxlLCB0ZXh0LCBjb2xvcikgPT4ge1xuICAgIC8vZ2V0IHRleHQgY29udGVudCB0byBjb252ZXJ0IGluIGltYWdlXG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIGNvbnN0IGZvbnRmYW1pbHkgPSBmb250U3R5bGVcbiAgICAgID8gZm9udFN0eWxlXG4gICAgICA6IGZvbnRTZWxlY3RcbiAgICAgICAgPyBmb250U2VsZWN0XG4gICAgICAgIDogXCJGYXN0aGFuZFwiO1xuICAgIGNvbnN0IGZvbnRTaXplVmFsdWUgPSBcIjQwcHhcIjtcbiAgICAvL2NyZWF0aW5nIHNwYW4gZm9yIGdldHRpbmcgdGV4dCBjb250ZW50IHdpZHRoXG4gICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIHNwYW4udGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcbiAgICBzcGFuLnN0eWxlLmZvbnQgPSBgJHtmb250U2l6ZVZhbHVlfSAke2ZvbnRmYW1pbHl9YDsgLy8gaGVyZSBwdXQgeW91ciB0ZXh0IHNpemUgYW5kIGZvbnQgZmFtaWx5XG4gICAgc3Bhbi5zdHlsZS5jb2xvciA9IGNvbG9yID8gY29sb3IgOiBwZW5Db2xvcjtcbiAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSBcImhpZGRlblwiO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7IC8vIFJlcGxhY2UgJ2NvbnRhaW5lcicgd2l0aCB0aGUgSUQgb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50XG5cbiAgICAvL2NyZWF0ZSBjYW52YXMgdG8gcmVuZGVyIHRleHQgaW4gY2FudmFzIGFuZCBjb252ZXJ0IGluIGltYWdlXG4gICAgY29uc3QgY2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgLy8gRHJhdyB0aGUgdGV4dCBjb250ZW50IG9uIHRoZSBjYW52YXNcbiAgICBjb25zdCBjdHggPSBjYW52YXNFbGVtZW50LmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjb25zdCBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgICBjb25zdCBhZGRFeHRyYVdpZHRoID0gaXNJbml0aWFsID8gMTAgOiA1MDtcbiAgICBjb25zdCB3aWR0aCA9IHNwYW4ub2Zmc2V0V2lkdGggKyBhZGRFeHRyYVdpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHNwYW4ub2Zmc2V0SGVpZ2h0O1xuICAgIHNldFRleHRXaWR0aCh3aWR0aCk7XG4gICAgc2V0VGV4dEhlaWdodChoZWlnaHQpO1xuICAgIGNvbnN0IGZvbnQgPSBzcGFuLnN0eWxlW1wiZm9udFwiXTtcbiAgICAvLyBTZXQgdGhlIGNhbnZhcyBkaW1lbnNpb25zIHRvIG1hdGNoIHRoZSBzcGFuXG4gICAgY2FudmFzRWxlbWVudC53aWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcbiAgICBjYW52YXNFbGVtZW50LmhlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XG5cbiAgICAvLyBZb3UgY2FuIGN1c3RvbWl6ZSB0ZXh0IHN0eWxlcyBpZiBuZWVkZWRcbiAgICBjdHguZm9udCA9IGZvbnQ7XG4gICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yID8gY29sb3IgOiBwZW5Db2xvcjsgLy8gU2V0IHRoZSB0ZXh0IGNvbG9yXG4gICAgY3R4LnRleHRBbGlnbiA9IFwiY2VudGVyXCI7XG4gICAgY3R4LnRleHRCYXNlbGluZSA9IFwibWlkZGxlXCI7XG4gICAgY3R4LnNjYWxlKHBpeGVsUmF0aW8sIHBpeGVsUmF0aW8pO1xuICAgIC8vIERyYXcgdGhlIGNvbnRlbnQgb2YgdGhlIHNwYW4gb250byB0aGUgY2FudmFzXG4gICAgY3R4LmZpbGxUZXh0KHNwYW4udGV4dENvbnRlbnQsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7IC8vIEFkanVzdCB0aGUgeCx5LWNvb3JkaW5hdGUgYXMgbmVlZGVkXG4gICAgLy9yZW1vdmUgc3BhbiB0YWdcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgIC8vIENvbnZlcnQgdGhlIGNhbnZhcyB0byBpbWFnZSBkYXRhXG4gICAgY29uc3QgZGF0YVVybCA9IGNhbnZhc0VsZW1lbnQudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpO1xuICAgIHNldFNpZ25hdHVyZShkYXRhVXJsKTtcbiAgfTtcblxuICBjb25zdCBQZW5Db2xvckNvbXBvbmVudCA9IChwcm9wcykgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgaXRlbXMtc3RhcnRcIj5cbiAgICAgICAge2FsbENvbG9yLm1hcCgoZGF0YSwga2V5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiBcIjVweFwiLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBkYXRhLFxuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTpcbiAgICAgICAgICAgICAgICAgIGtleSA9PT0gMCAmJiBwZW5Db2xvciA9PT0gXCJibHVlXCJcbiAgICAgICAgICAgICAgICAgICAgPyBcIjJweCBzb2xpZCBibHVlXCJcbiAgICAgICAgICAgICAgICAgICAgOiBrZXkgPT09IDEgJiYgcGVuQ29sb3IgPT09IFwicmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiMnB4IHNvbGlkIHJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBrZXkgPT09IDIgJiYgcGVuQ29sb3IgPT09IFwiYmxhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIjJweCBzb2xpZCBibGFja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiMnB4IHNvbGlkIHdoaXRlXCJcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIHByb3BzPy5jb252ZXJ0VG9JbWcgJiZcbiAgICAgICAgICAgICAgICAgIHByb3BzPy5jb252ZXJ0VG9JbWcoZm9udFNlbGVjdCwgc2lnblZhbHVlLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBzZXRQZW5Db2xvcihcImJsdWVcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgIHNldFBlbkNvbG9yKFwicmVkXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICBzZXRQZW5Db2xvcihcImJsYWNrXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXBlbi1uaWJcIlxuICAgICAgICAgICAgICB3aWR0aD17MjB9XG4gICAgICAgICAgICAgIGhlaWdodD17MjB9XG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICk7XG4gICAgICAgIH0pfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2PlxuICAgICAge2lzU2lnblBhZCAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbW9kYWwgb3AtbW9kYWwtb3BlblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbW9kYWwtYm94IHB4LVsxM3B4XSBwdC0yIHBiLTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gdGV4dC1iYXNlLWNvbnRlbnQgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMS4ycmVtXVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtWzNweF1cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gZ2FwLVs1cHhdIG1kOmdhcC1bOHB4XSB0ZXh0LVsxMXB4XSBtZDp0ZXh0LWJhc2VcIj5cbiAgICAgICAgICAgICAgICAgICAge2lzU3RhbXAgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1iYXNlLWNvbnRlbnQgZm9udC1ib2xkIHRleHQtbGdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt3aWRnZXRUeXBlID09PSBcImltYWdlXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJXaWRnZXRzRGV0YWlscz8udHlwZSA9PT0gXCJpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gdChcInVwbG9hZC1pbWFnZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHQoXCJ1cGxvYWQtc3RhbXAtaW1hZ2VcIil9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1RhYihcImRyYXdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2lnbkltZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmUoaXNTaWduSW1nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhYiA9PT0gXCJkcmF3XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIm9wLWxpbmstcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJuby11bmRlcmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayB1bmRlcmxpbmUtb2Zmc2V0LTggbWwtWzJweF1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJkcmF3XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEZWZhdWx0U2lnbihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNUYWIoXCJ1cGxvYWRJbWFnZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZVR5cGUoXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWIgPT09IFwidXBsb2FkSW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwib3AtbGluay1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIm5vLXVuZGVybGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBvcC1saW5rIHVuZGVybGluZS1vZmZzZXQtOCBtbC1bMnB4XWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInVwbG9hZC1pbWFnZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1RhYihcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmVUeXBlKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhYiA9PT0gXCJ0eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIm9wLWxpbmstcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJuby11bmRlcmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayB1bmRlcmxpbmUtb2Zmc2V0LTggbWwtWzJweF1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJ0eXBlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHshaXNJbml0aWFsICYmIGRlZmF1bHRTaWduID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24odHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW1hZ2VTZWxlY3QodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwibXlzaWduYXR1cmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZVR5cGUoXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEltYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWIgPT09IFwibXlzaWduYXR1cmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJuby11bmRlcmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBvcC1saW5rIHVuZGVybGluZS1vZmZzZXQtOCBtbC1bMnB4XWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJteS1zaWduYXR1cmVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBteUluaXRpYWwgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEZWZhdWx0U2lnbih0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwibXlzaWduYXR1cmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlVHlwZShcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFiID09PSBcIm15c2lnbmF0dXJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIm5vLXVuZGVybGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayB1bmRlcmxpbmUtb2Zmc2V0LTggbWwtWzJweF1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcIm15LWluaXRpYWxzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMS41cmVtXSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc2V0UGVuQ29sb3IoXCJibHVlXCIpO1xuICAgICAgICAgICAgICAgICAgc2V0SXNTaWduUGFkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIHNldElzSW5pdGlhbChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgc2V0SW1hZ2UoKTtcbiAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwiZHJhd1wiKTtcbiAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZVR5cGUoXCJkcmF3XCIpO1xuICAgICAgICAgICAgICAgICAgc2V0U2lnblZhbHVlKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICZ0aW1lcztcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC1bMjBweF0gaC1mdWxsXCI+XG4gICAgICAgICAgICAgIHtpc0RlZmF1bHRTaWduID8gKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwiMS4zcHggc29saWQgIzAwN2JmZlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tOiA2LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbCA/IFwiaW50aWFsU2lnbmF0dXJlQ2FudmFzXCIgOiBcInNpZ25hdHVyZUNhbnZhc1wiXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwic3RhbXAgaW1nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgb2JqZWN0LWNvbnRhaW4gYmctd2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3JjPXtpc0luaXRpYWwgPyBteUluaXRpYWwgOiBkZWZhdWx0U2lnbn1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxTYXZlQnRuIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgKSA6IGlzSW1hZ2VTZWxlY3QgfHwgaXNTdGFtcCA/IChcbiAgICAgICAgICAgICAgICAhaW1hZ2UgPyAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwiMS4zcHggc29saWQgIzAwN2JmZlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tOiA2LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbCA/IFwiaW50aWFsU2lnbmF0dXJlQ2FudmFzXCIgOiBcInNpZ25hdHVyZUNhbnZhc1wiXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGltYWdlUmVmLmN1cnJlbnQuY2xpY2soKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uSW1hZ2VDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmaWxldHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCJpbWFnZS9wbmcsaW1hZ2UvanBlZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9e2ltYWdlUmVmfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1jbG91ZC11cGxvYWQtYWx0IHVwbG9hZEltZ0xvZ29cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMHB4XVwiPnt0KFwidXBsb2FkXCIpfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwiMS4zcHggc29saWQgIzAwN2JmZlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMnB4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiaW50aWFsU2lnbmF0dXJlQ2FudmFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwic2lnbmF0dXJlQ2FudmFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInByaW50IGltZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj17aW1hZ2VSZWZ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz17aW1hZ2Uuc3JjfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIiBvYmplY3QtY29udGFpbiBoLWZ1bGwgdy1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2F2ZUJ0biAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSA6IGlzVGFiID09PSBcInR5cGVcIiA/IChcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXItWzVweF0gdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICB7aXNJbml0aWFsID8gdChcImluaXRpYWwtdGViXCIpIDogdChcInNpZ25hdHVyZS10YWJcIil9OlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aD17aXNJbml0aWFsID8gMyA6IDMwfVxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGZvbnRGYW1pbHk6IGZvbnRTZWxlY3QsIGNvbG9yOiBwZW5Db2xvciB9fVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtbC0xIG9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkIG9wLWlucHV0LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBob3Zlcjpib3JkZXItYmFzZS1jb250ZW50IHctZnVsbCB0ZXh0LVsyMHB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJZb3VyIHNpZ25hdHVyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NpZ25WYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25WYWx1ZShlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG9JbWcoZm9udFNlbGVjdCwgZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9yZGVyLVsxcHhdIGJvcmRlci1bI2Q2ZDNkM10gbXQtWzEwcHhdIG1sLVs1cHhdXCI+XG4gICAgICAgICAgICAgICAgICAgIHtmb250T3B0aW9ucy5tYXAoKGZvbnQsIGluZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aW5kfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogZm9udC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2VsZWN0ID09PSBmb250LnZhbHVlICYmIFwicmdiKDIwNiAyMjUgMjQ3KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb250U2VsZWN0KGZvbnQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb0ltZyhmb250LnZhbHVlLCBzaWduVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiNXB4IDEwcHggNXB4IDEwcHhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBcIjIwcHhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBwZW5Db2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2lnblZhbHVlID8gc2lnblZhbHVlIDogXCJZb3VyIHNpZ25hdHVyZVwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtWzEwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgIDxQZW5Db2xvckNvbXBvbmVudCBjb252ZXJ0VG9JbWc9e2NvbnZlcnRUb0ltZ30gLz5cbiAgICAgICAgICAgICAgICAgICAgPFNhdmVCdG4gLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPFNpZ25hdHVyZUNhbnZhc1xuICAgICAgICAgICAgICAgICAgICAgIHJlZj17Y2FudmFzUmVmfVxuICAgICAgICAgICAgICAgICAgICAgIHBlbkNvbG9yPXtwZW5Db2xvcn1cbiAgICAgICAgICAgICAgICAgICAgICBjYW52YXNQcm9wcz17e1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBpc0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImludGlhbFNpZ25hdHVyZUNhbnZhc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJzaWduYXR1cmVDYW52YXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogXCIxLjZweCBzb2xpZCAjMDA3YmZmXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCIycHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yPVwicmdiKDI1NSwgMjU1LCAyNTUpXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkVuZD17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25hdHVyZUNoYW5nZShjYW52YXNSZWYuY3VycmVudD8udG9EYXRhVVJMKCkpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGRvdFNpemU9ezF9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtWzEwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgIDxQZW5Db2xvckNvbXBvbmVudCAvPlxuICAgICAgICAgICAgICAgICAgICA8U2F2ZUJ0biAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBTaWduUGFkO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyBkYXJrZW5Db2xvciwgZ2V0Rmlyc3RMZXR0ZXIgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcclxuXHJcbmZ1bmN0aW9uIFNpZ25lckxpc3RDb21wb25lbnQocHJvcHMpIHtcclxuICBjb25zdCBjaGVja1NpZ25lckJhY2tDb2xvciA9IChvYmopID0+IHtcclxuICAgIGlmIChvYmopIHtcclxuICAgICAgbGV0IGRhdGEgPSBcIlwiO1xyXG4gICAgICBpZiAob2JqPy5JZCkge1xyXG4gICAgICAgIGRhdGEgPSBwcm9wcy5zaWduZXJQb3MuZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSBvYmouSWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRhdGEgPSBwcm9wcy5zaWduZXJQb3MuZmlsdGVyKFxyXG4gICAgICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IG9iai5vYmplY3RJZFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwICYmIGRhdGFbMF0uYmxvY2tDb2xvcjtcclxuICAgIH1cclxuICB9O1xyXG4gIGNvbnN0IGNoZWNrVXNlck5hbWVDb2xvciA9IChvYmopID0+IHtcclxuICAgIGNvbnN0IGdldEJhY2tDb2xvciA9IGNoZWNrU2lnbmVyQmFja0NvbG9yKG9iaik7XHJcbiAgICBpZiAoZ2V0QmFja0NvbG9yKSB7XHJcbiAgICAgIGNvbnN0IGNvbG9yID0gZGFya2VuQ29sb3IoZ2V0QmFja0NvbG9yLCAwLjQpO1xyXG4gICAgICByZXR1cm4gY29sb3I7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCIjYWJkMWQwXCI7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXZcclxuICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC14bCBteC0xIGZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIHB5LVsxMHB4XSBtdC0xXCJcclxuICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZDogY2hlY2tTaWduZXJCYWNrQ29sb3IocHJvcHMub2JqKSB9fVxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZDogY2hlY2tVc2VyTmFtZUNvbG9yKHByb3BzLm9iaikgfX1cclxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IHctWzMwcHhdIGgtWzMwcHhdIHJvdW5kZWQtZnVsbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgbXgtMVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxMnB4XSB0ZXh0LWNlbnRlciBmb250LWJvbGQgdGV4dC1ibGFjayB1cHBlcmNhc2VcIj5cclxuICAgICAgICAgIHtnZXRGaXJzdExldHRlcihcclxuICAgICAgICAgICAgcHJvcHMub2JqPy5OYW1lIHx8IHByb3BzLm9iaj8uZW1haWwgfHwgcHJvcHMub2JqPy5Sb2xlXHJcbiAgICAgICAgICApfVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzEycHhdIGZvbnQtYm9sZCB0ZXh0LVsjNDI0MjQyXSB3LVsxMDBweF0gd2hpdGVzcGFjZS1ub3dyYXAgb3ZlcmZsb3ctaGlkZGVuIHRleHQtZWxsaXBzaXNcIj5cclxuICAgICAgICAgIHtwcm9wcy5vYmo/Lk5hbWUgfHwgcHJvcHM/Lm9iaj8uUm9sZX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTBweF0gZm9udC1tZWRpdW0gdGV4dC1bIzQyNDI0Ml0gdy1bMTAwcHhdIHdoaXRlc3BhY2Utbm93cmFwIG92ZXJmbG93LWhpZGRlbiB0ZXh0LWVsbGlwc2lzXCI+XHJcbiAgICAgICAgICB7cHJvcHMub2JqPy5FbWFpbCB8fCBwcm9wcy5vYmo/LmVtYWlsfVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaWduZXJMaXN0Q29tcG9uZW50O1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTG9hZGVyIGZyb20gXCIuLi8uLi9wcmltaXRpdmVzL0xvYWRlclwiO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xuXG5mdW5jdGlvbiBWZXJpZnlFbWFpbChwcm9wcykge1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG4gIHJldHVybiAoXG4gICAgPGRpYWxvZyBjbGFzc05hbWU9XCJvcC1tb2RhbCBvcC1tb2RhbC1vcGVuIGFic29sdXRlIHotWzE5OTldXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1kOnctWzQwJV0gdy1bODAlXSBvcC1tb2RhbC1ib3ggcC0wIG92ZXJmbG93LXktYXV0byBoaWRlLXNjcm9sbGJhciB0ZXh0LXNtXCI+XG4gICAgICAgIDxoMyBjbGFzc05hbWU9XCJmb250LWJvbGQgdGV4dC1sZyBwdC1bMTVweF0gcHgtWzIwcHhdIHRleHQtYmFzZS1jb250ZW50XCI+XG4gICAgICAgICAge3QoXCJvdHAtdmVyaWZpY2F0aW9uXCIpfVxuICAgICAgICA8L2gzPlxuICAgICAgICB7cHJvcHMuaXNWZXJpZnlNb2RhbCA/IChcbiAgICAgICAgICA8Zm9ybVxuICAgICAgICAgICAgb25TdWJtaXQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgIHByb3BzLnNldElzVmVyaWZ5TW9kYWwoZmFsc2UpO1xuICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVWZXJpZnlFbWFpbChlKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC02IHB5LTMgdGV4dC1iYXNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cIm1iLTJcIj57dChcImVudGVyLW90cFwiKX08L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBvbkludmFsaWQ9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0Q3VzdG9tVmFsaWRpdHkodChcImlucHV0LXJlcXVpcmVkXCIpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvbklucHV0PXsoZSkgPT4gZS50YXJnZXQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIil9XG4gICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGVsXCJcbiAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV17NH1cIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBvcC1pbnB1dCBvcC1pbnB1dC1ib3JkZXJlZCBvcC1pbnB1dC1zbSBmb2N1czpvdXRsaW5lLW5vbmUgaG92ZXI6Ym9yZGVyLWJhc2UtY29udGVudCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dChcIm90cC1wbGFjZWhvbGRlclwiKX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17cHJvcHMub3RwfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gcHJvcHMuc2V0T3RwKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC02IG15LTNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAge3QoXCJ2ZXJpZnlcIil9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnkgbWwtMlwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHByb3BzLmhhbmRsZVJlc2VuZChlKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt0KFwicmVzZW5kXCIpfVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgKSA6IHByb3BzLm90cExvYWRlciA/IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtWzE1MHB4XSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgPExvYWRlciAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtNiBweS0zIHRleHQtYmFzZS1jb250ZW50XCI+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtYi0yIHRleHQtc21cIj57dChcInZlcmlmeS1lbWFpbFwiKX08L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTAgbXQtM1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5oYW5kbGVWZXJpZnlCdG4oKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt0KFwic2VuZC1vdHBcIil9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2RpYWxvZz5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVyaWZ5RW1haWw7XG4iLCJpbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFBERkRvY3VtZW50LCByZ2IsIGRlZ3JlZXMgfSBmcm9tIFwicGRmLWxpYlwiO1xuaW1wb3J0IFBhcnNlIGZyb20gXCJwYXJzZVwiO1xuaW1wb3J0IHsgYXBwSW5mbyB9IGZyb20gXCIuL2FwcGluZm9cIjtcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gXCJmaWxlLXNhdmVyXCI7XG5pbXBvcnQgcHJpbnRNb2R1bGUgZnJvbSBcInByaW50LWpzXCI7XG5pbXBvcnQgeyB2YWxpZHBsYW4gfSBmcm9tIFwiLi4vanNvbi9wbGFuc0FyclwiO1xuaW1wb3J0IGZvbnRraXQgZnJvbSBcIkBwZGYtbGliL2ZvbnRraXRcIjtcblxuZXhwb3J0IGNvbnN0IGZvbnRzaXplQXJyID0gWzIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4XTtcbmV4cG9ydCBjb25zdCBmb250Q29sb3JBcnIgPSBbXCJyZWRcIiwgXCJibGFja1wiLCBcImJsdWVcIiwgXCJ5ZWxsb3dcIl07XG5leHBvcnQgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDc2NztcbmV4cG9ydCBjb25zdCBpc1RhYkFuZE1vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgMTAyMztcbmV4cG9ydCBjb25zdCB0ZXh0SW5wdXRXaWRnZXQgPSBcInRleHQgaW5wdXRcIjtcbmV4cG9ydCBjb25zdCB0ZXh0V2lkZ2V0ID0gXCJ0ZXh0XCI7XG5leHBvcnQgY29uc3QgcmFkaW9CdXR0b25XaWRnZXQgPSBcInJhZGlvIGJ1dHRvblwiO1xuZXhwb3J0IGNvbnN0IGZpbGVhc2J5dGVzID0gYXN5bmMgKGZpbGVwYXRoKSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmlsZXBhdGgpOyAvLyBBZGp1c3QgdGhlIHBhdGggYWNjb3JkaW5nbHlcbiAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xufTtcblxuZXhwb3J0IGNvbnN0IG9wZW5Jbk5ld1RhYiA9ICh1cmwsIHRhcmdldCkgPT4ge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgd2luZG93Lm9wZW4odXJsLCB0YXJnZXQsIFwibm9vcGVuZXIsbm9yZWZlcnJlclwiKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cub3Blbih1cmwsIFwiX2JsYW5rXCIsIFwibm9vcGVuZXIsbm9yZWZlcnJlclwiKTtcbiAgfVxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoU3Vic2NyaXB0aW9uKFxuICBleHRVc2VySWQsXG4gIGNvbnRhY3RPYmpJZCxcbiAgaXNHdWVzdFNpZ24gPSBmYWxzZVxuKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgRXh0YW5kX0NsYXNzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJFeHRhbmRfQ2xhc3NcIik7XG4gICAgY29uc3QgZXh0Q2xhc3MgPSBFeHRhbmRfQ2xhc3MgJiYgSlNPTi5wYXJzZShFeHRhbmRfQ2xhc3MpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiZXh0Q2xhc3MgXCIsIGV4dENsYXNzKTtcbiAgICBsZXQgZXh0VXNlcjtcbiAgICBpZiAoZXh0Q2xhc3MgJiYgZXh0Q2xhc3MubGVuZ3RoID4gMCkge1xuICAgICAgZXh0VXNlciA9IGV4dENsYXNzWzBdLm9iamVjdElkO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHRVc2VyID0gZXh0VXNlcklkO1xuICAgIH1cbiAgICBjb25zdCBiYXNlVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpO1xuICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVUkx9ZnVuY3Rpb25zL2dldHN1YnNjcmlwdGlvbnNgO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICBzZXNzaW9uVG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICB9O1xuICAgIGNvbnN0IHBhcmFtcyA9IGlzR3Vlc3RTaWduXG4gICAgICA/IHsgY29udGFjdElkOiBjb250YWN0T2JqSWQgfVxuICAgICAgOiB7IGV4dFVzZXJJZDogZXh0VXNlciB9O1xuICAgIGNvbnN0IHRlbmF0UmVzID0gYXdhaXQgYXhpb3MucG9zdCh1cmwsIHBhcmFtcywgeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xuICAgIGxldCBwbGFuLCBzdGF0dXMsIGJpbGxpbmdEYXRlLCBhZG1pbklkO1xuICAgIGlmIChpc0d1ZXN0U2lnbikge1xuICAgICAgcGxhbiA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5wbGFuO1xuICAgICAgc3RhdHVzID0gdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/LmlzU3Vic2NyaWJlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcGxhbiA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5QbGFuQ29kZTtcbiAgICAgIGJpbGxpbmdEYXRlID0gdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/Lk5leHRfYmlsbGluZ19kYXRlPy5pc287XG4gICAgICBjb25zdCBhbGxvd2VkVXNlcnMgPSB0ZW5hdFJlcy5kYXRhPy5yZXN1bHQ/LnJlc3VsdD8uQWxsb3dlZFVzZXJzIHx8IDA7XG4gICAgICBhZG1pbklkID0gdGVuYXRSZXM/LmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5FeHRVc2VyUHRyPy5vYmplY3RJZDtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYWxsb3dlZFVzZXJzXCIsIGFsbG93ZWRVc2Vycyk7XG4gICAgfVxuICAgIHJldHVybiB7IHBsYW4sIGJpbGxpbmdEYXRlLCBzdGF0dXMsIGFkbWluSWQgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gZmV0Y2ggc3Vic2NyaXB0aW9uXCIsIGVycik7XG4gICAgcmV0dXJuIHsgcGxhbjogXCJcIiwgYmlsbGluZ0RhdGU6IFwiXCIsIHN0YXR1czogXCJcIiwgYWRtaW5JZDogXCJcIiB9O1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaFN1YnNjcmlwdGlvbkluZm8oKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgRXh0YW5kX0NsYXNzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJFeHRhbmRfQ2xhc3NcIik7XG4gICAgY29uc3QgZXh0Q2xhc3MgPSBFeHRhbmRfQ2xhc3MgJiYgSlNPTi5wYXJzZShFeHRhbmRfQ2xhc3MpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwiZXh0Q2xhc3MgXCIsIGV4dENsYXNzKTtcbiAgICBpZiAoZXh0Q2xhc3MgJiYgZXh0Q2xhc3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXh0VXNlciA9IGV4dENsYXNzWzBdLm9iamVjdElkO1xuICAgICAgY29uc3QgYmFzZVVSTCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKTtcbiAgICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVUkx9ZnVuY3Rpb25zL2dldHN1YnNjcmlwdGlvbnNgO1xuICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICAgIHNlc3Npb25Ub2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgZXh0VXNlcklkOiBleHRVc2VyIH07XG4gICAgICBjb25zdCB0ZW5hdFJlcyA9IGF3YWl0IGF4aW9zLnBvc3QodXJsLCBwYXJhbXMsIHsgaGVhZGVyczogaGVhZGVycyB9KTtcblxuICAgICAgY29uc3QgcHJpY2UgPVxuICAgICAgICB0ZW5hdFJlcy5kYXRhPy5yZXN1bHQ/LnJlc3VsdD8uU3Vic2NyaXB0aW9uRGV0YWlscz8uZGF0YT8uc3Vic2NyaXB0aW9uXG4gICAgICAgICAgPy5wbGFuPy5wcmljZTtcbiAgICAgIGNvbnN0IHRvdGFsUHJpY2UgPVxuICAgICAgICB0ZW5hdFJlcy5kYXRhPy5yZXN1bHQ/LnJlc3VsdD8uU3Vic2NyaXB0aW9uRGV0YWlscz8uZGF0YT8uc3Vic2NyaXB0aW9uXG4gICAgICAgICAgPy5hbW91bnQ7XG4gICAgICBjb25zdCBwbGFuSWQgPVxuICAgICAgICB0ZW5hdFJlcy5kYXRhPy5yZXN1bHQ/LnJlc3VsdD8uU3Vic2NyaXB0aW9uRGV0YWlscz8uZGF0YT8uc3Vic2NyaXB0aW9uXG4gICAgICAgICAgPy5zdWJzY3JpcHRpb25faWQ7XG4gICAgICBjb25zdCBwbGFuX2NvZGUgPVxuICAgICAgICB0ZW5hdFJlcy5kYXRhPy5yZXN1bHQ/LnJlc3VsdD8uU3Vic2NyaXB0aW9uRGV0YWlscz8uZGF0YT8uc3Vic2NyaXB0aW9uXG4gICAgICAgICAgPy5wbGFuPy5wbGFuX2NvZGU7XG4gICAgICBjb25zdCB0b3RhbEFsbG93ZWRVc2VyID0gdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/LkFsbG93ZWRVc2VycyB8fCAwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgcHJpY2U6IHByaWNlLFxuICAgICAgICB0b3RhbFByaWNlOiB0b3RhbFByaWNlLFxuICAgICAgICBwbGFuSWQ6IHBsYW5JZCxcbiAgICAgICAgcGxhbl9jb2RlOiBwbGFuX2NvZGUsXG4gICAgICAgIHRvdGFsQWxsb3dlZFVzZXI6IHRvdGFsQWxsb3dlZFVzZXJcbiAgICAgIH07XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmxvZyhcIkVyciBpbiBmZXRjaCBzdWJzY3JpcHRpb25cIiwgZXJyKTtcbiAgICByZXR1cm4geyBzdGF0dXM6IFwiZXJyb3JcIiwgZXJyb3I6IGVyciB9O1xuICB9XG59XG4vL2Z1bmN0aW9uIHRvIGdldCBzdWJjcmlwaXRpb24gZGV0YWlscyBmcm9tIHN1YnNjcmlwdGlvbiBjbGFzc1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrSXNTdWJzY3JpYmVkKCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoU3Vic2NyaXB0aW9uKCk7XG4gICAgaWYgKHJlcy5wbGFuID09PSBcImZyZWVwbGFuXCIpIHtcbiAgICAgIHJldHVybiB7IHBsYW46IHJlcy5wbGFuLCBpc1ZhbGlkOiBmYWxzZSwgYWRtaW5JZDogcmVzPy5hZG1pbklkIH07XG4gICAgfSBlbHNlIGlmIChyZXMuYmlsbGluZ0RhdGUpIHtcbiAgICAgIGNvbnN0IHBsYW4gPSB2YWxpZHBsYW5bcmVzLnBsYW5dIHx8IGZhbHNlO1xuICAgICAgaWYgKHBsYW4gJiYgbmV3IERhdGUocmVzLmJpbGxpbmdEYXRlKSA+IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgcmV0dXJuIHsgcGxhbjogcmVzLnBsYW4sIGlzVmFsaWQ6IHRydWUsIGFkbWluSWQ6IHJlcz8uYWRtaW5JZCB9O1xuICAgICAgfSBlbHNlIGlmIChuZXcgRGF0ZShyZXMuYmlsbGluZ0RhdGUpID4gbmV3IERhdGUoKSkge1xuICAgICAgICByZXR1cm4geyBwbGFuOiByZXMucGxhbiwgaXNWYWxpZDogdHJ1ZSwgYWRtaW5JZDogcmVzPy5hZG1pbklkIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4geyBwbGFuOiByZXMucGxhbiwgaXNWYWxpZDogZmFsc2UsIGFkbWluSWQ6IHJlcz8uYWRtaW5JZCB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geyBwbGFuOiByZXMucGxhbiwgaXNWYWxpZDogZmFsc2UsIGFkbWluSWQ6IHJlcz8uYWRtaW5JZCB9O1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gZmV0Y2ggc3Vic2NyaXB0aW9uXCIsIGVycik7XG4gICAgcmV0dXJuIHsgcGxhbjogXCJuby1wbGFuXCIsIGlzVmFsaWQ6IGZhbHNlLCBhZG1pbklkOiBcIlwiIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbG9yID0gW1xuICBcIiM5M2EzZGJcIixcbiAgXCIjZTZjM2RiXCIsXG4gIFwiI2MwZTNiY1wiLFxuICBcIiNiY2UzZGJcIixcbiAgXCIjYjhjY2RiXCIsXG4gIFwiI2NlYjhkYlwiLFxuICBcIiNmZmNjZmZcIixcbiAgXCIjOTlmZmNjXCIsXG4gIFwiI2NjOTlmZlwiLFxuICBcIiNmZmNjOTlcIixcbiAgXCIjNjZjY2ZmXCIsXG4gIFwiI2ZmZmZjY1wiXG5dO1xuXG5leHBvcnQgY29uc3QgbmFtZUNvbG9yID0gW1xuICBcIiMzMDRmYmZcIixcbiAgXCIjN2Q1MjcwXCIsXG4gIFwiIzVmODI1YlwiLFxuICBcIiM1NzgwNzdcIixcbiAgXCIjNTc2ZTgwXCIsXG4gIFwiIzZkNTI3ZFwiLFxuICBcIiNjYzAwY2NcIixcbiAgXCIjMDA2NjY2XCIsXG4gIFwiI2NjMDBmZlwiLFxuICBcIiNmZjk5MDBcIixcbiAgXCIjMzM2Njk5XCIsXG4gIFwiI2NjOTkwMFwiXG5dO1xuZXhwb3J0IGNvbnN0IHRvRGF0YVVybCA9IChmaWxlKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgcmVhZGVyLm9ubG9hZGVuZCA9IChlKSA9PiB7XG4gICAgICByZXNvbHZlKGUudGFyZ2V0LnJlc3VsdCk7XG4gICAgfTtcbiAgfSk7XG59O1xuXG4vL2Z1bmN0aW9uIGZvciBnZXR0aW5nIGRvY3VtZW50IGRldGFpbHMgZm9yIGdldERyaXZlIGNsb3VkIGZ1bmN0aW9uXG5leHBvcnQgY29uc3QgZ2V0RHJpdmUgPSBhc3luYyAoZG9jdW1lbnRJZCwgc2tpcCA9IDAsIGxpbWl0ID0gMTAwKSA9PiB7XG4gIGNvbnN0IGRhdGEgPSB7XG4gICAgZG9jSWQ6IGRvY3VtZW50SWQgJiYgZG9jdW1lbnRJZCxcbiAgICBsaW1pdDogbGltaXQsXG4gICAgc2tpcDogc2tpcFxuICB9O1xuICBjb25zdCBkcml2ZURlYXRpbHMgPSBhd2FpdCBheGlvc1xuICAgIC5wb3N0KGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvZ2V0RHJpdmVgLCBkYXRhLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxuICAgICAgICBzZXNzaW9udG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKChMaXN0ZGF0YSkgPT4ge1xuICAgICAgY29uc3QganNvbiA9IExpc3RkYXRhLmRhdGE7XG5cbiAgICAgIGlmIChqc29uICYmIGpzb24ucmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgICAgfSBlbHNlIGlmIChqc29uICYmIGpzb24ucmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBqc29uLnJlc3VsdDtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJFcnIgaW4gZ2V0RHJpdmUgY2xvdWQgZnVuY3Rpb25cIiwgZXJyKTtcbiAgICAgIHJldHVybiBcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIjtcbiAgICB9KTtcblxuICByZXR1cm4gZHJpdmVEZWF0aWxzO1xufTtcblxuLy8gYHBkZk5ld1dpZHRoRnVuYCBmdW5jdGlvbiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBwZGYgd2lkdGggdG8gcmVuZGVyIGluIG1pZGRsZSBjb250YWluZXJcbmV4cG9ydCBjb25zdCBwZGZOZXdXaWR0aEZ1biA9IChkaXZSZWYpID0+IHtcbiAgY29uc3QgcGRmV2lkdGggPSBkaXZSZWYuY3VycmVudC5vZmZzZXRXaWR0aDtcbiAgcmV0dXJuIHBkZldpZHRoO1xufTtcblxuLy9gY29udHJhY3RVc2Vyc2AgZnVuY3Rpb24gaXMgdXNlZCB0byBnZXQgY29udHJhY3RfVXNlciBkZXRhaWxzXG5leHBvcnQgY29uc3QgY29udHJhY3RVc2VycyA9IGFzeW5jICgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1c2VyRGV0YWlscyA9IGF3YWl0IFBhcnNlLkNsb3VkLnJ1bihcImdldFVzZXJEZXRhaWxzXCIpO1xuICAgIGxldCBkYXRhID0gW107XG4gICAgaWYgKHVzZXJEZXRhaWxzKSB7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh1c2VyRGV0YWlscykpO1xuICAgICAgZGF0YS5wdXNoKGpzb24pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gZ2V0VXNlckRldGFpbHMgY2xvdWQgZnVuY3Rpb25cIiwgZXJyKTtcbiAgICByZXR1cm4gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCI7XG4gIH1cbn07XG5cbi8vZnVuY3Rpb24gZm9yIHJlc2l6ZSBpbWFnZSBhbmQgdXBkYXRlIHdpZHRoIGFuZCBoZWlnaHQgZm9yIG11bGl0aXNpZ25lcnNcbmV4cG9ydCBjb25zdCBoYW5kbGVJbWFnZVJlc2l6ZSA9IChcbiAgcmVmLFxuICBrZXksXG4gIHNpZ25lclBvcyxcbiAgc2V0U2lnbmVyUG9zLFxuICBwYWdlTnVtYmVyLFxuICBjb250YWluZXJTY2FsZSxcbiAgc2NhbGUsXG4gIHNpZ25lcklkLFxuICBzaG93UmVzaXplXG4pID0+IHtcbiAgY29uc3QgZmlsdGVyU2lnbmVyUG9zID0gc2lnbmVyUG9zLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5JZCA9PT0gc2lnbmVySWQpO1xuICBpZiAoZmlsdGVyU2lnbmVyUG9zLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBnZXRQbGFjZUhvbGRlciA9IGZpbHRlclNpZ25lclBvc1swXS5wbGFjZUhvbGRlcjtcbiAgICBjb25zdCBnZXRQYWdlTnVtZXIgPSBnZXRQbGFjZUhvbGRlci5maWx0ZXIoXG4gICAgICAoZGF0YSkgPT4gZGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyXG4gICAgKTtcbiAgICBpZiAoZ2V0UGFnZU51bWVyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdldFhZZGF0YSA9IGdldFBhZ2VOdW1lclswXS5wb3M7XG4gICAgICBjb25zdCBnZXRQb3NEYXRhID0gZ2V0WFlkYXRhO1xuICAgICAgY29uc3QgYWRkU2lnblBvcyA9IGdldFBvc0RhdGEubWFwKCh1cmwpID0+IHtcbiAgICAgICAgaWYgKHVybC5rZXkgPT09IGtleSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi51cmwsXG4gICAgICAgICAgICBXaWR0aDogcmVmLm9mZnNldFdpZHRoIC8gKGNvbnRhaW5lclNjYWxlICogc2NhbGUpLFxuICAgICAgICAgICAgSGVpZ2h0OiByZWYub2Zmc2V0SGVpZ2h0IC8gKGNvbnRhaW5lclNjYWxlICogc2NhbGUpLFxuICAgICAgICAgICAgSXNSZXNpemU6IHNob3dSZXNpemUgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmV3VXBkYXRlU2lnblBvcyA9IGdldFBsYWNlSG9sZGVyLm1hcCgob2JqKSA9PiB7XG4gICAgICAgIGlmIChvYmoucGFnZU51bWJlciA9PT0gcGFnZU51bWJlcikge1xuICAgICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiBhZGRTaWduUG9zIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBuZXdVcGRhdGVTaWduZXIgPSBzaWduZXJQb3MubWFwKChvYmopID0+IHtcbiAgICAgICAgaWYgKG9iai5JZCA9PT0gc2lnbmVySWQpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBuZXdVcGRhdGVTaWduUG9zIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH0pO1xuXG4gICAgICBzZXRTaWduZXJQb3MobmV3VXBkYXRlU2lnbmVyKTtcbiAgICB9XG4gIH1cbn07XG5leHBvcnQgY29uc3Qgd2lkZ2V0cyA9IFtcbiAge1xuICAgIHR5cGU6IFwic2lnbmF0dXJlXCIsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1wZW4tbmliXCIsXG4gICAgaWNvblNpemU6IFwiMjBweFwiXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcInN0YW1wXCIsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1zdGFtcFwiLFxuICAgIGljb25TaXplOiBcIjE5cHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogXCJpbml0aWFsc1wiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtc2lnbmF0dXJlXCIsXG4gICAgaWNvblNpemU6IFwiMTVweFwiXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcIm5hbWVcIixcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXVzZXJcIixcbiAgICBpY29uU2l6ZTogXCIyMXB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiam9iIHRpdGxlXCIsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1hZGRyZXNzLWNhcmRcIixcbiAgICBpY29uU2l6ZTogXCIxN3B4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiY29tcGFueVwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtYnVpbGRpbmdcIixcbiAgICBpY29uU2l6ZTogXCIyNXB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtY2FsZW5kYXItZGF5c1wiLFxuICAgIGljb25TaXplOiBcIjIwcHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogdGV4dFdpZGdldCxcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXRleHQtd2lkdGhcIixcbiAgICBpY29uU2l6ZTogXCIyMHB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IHRleHRJbnB1dFdpZGdldCxcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLWZvbnRcIixcbiAgICBpY29uU2l6ZTogXCIyMXB4XCJcbiAgfSxcbiAge1xuICAgIHR5cGU6IFwiY2hlY2tib3hcIixcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXNxdWFyZS1jaGVja1wiLFxuICAgIGljb25TaXplOiBcIjIycHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogXCJkcm9wZG93blwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtY2lyY2xlLWNoZXZyb24tZG93blwiLFxuICAgIGljb25TaXplOiBcIjE5cHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogcmFkaW9CdXR0b25XaWRnZXQsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1jaXJjbGUtZG90XCIsXG4gICAgaWNvblNpemU6IFwiMjBweFwiXG4gIH0sXG4gIHtcbiAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1pbWFnZVwiLFxuICAgIGljb25TaXplOiBcIjIwcHhcIlxuICB9LFxuICB7XG4gICAgdHlwZTogXCJlbWFpbFwiLFxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtZW52ZWxvcGVcIixcbiAgICBpY29uU2l6ZTogXCIyMHB4XCJcbiAgfVxuXTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGUgPSAoKSA9PiB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFRpbWUoKTtcbiAgY29uc3QgbmV3RGF0ZSA9IG1vbWVudChtaWxsaXNlY29uZHMpLmZvcm1hdChcIk1NL0REL1lZWVlcIik7XG4gIHJldHVybiBuZXdEYXRlO1xufTtcbmV4cG9ydCBjb25zdCBhZGRXaWRnZXRPcHRpb25zID0gKHR5cGUpID0+IHtcbiAgY29uc3QgZGVmYXVsdE9wdCA9IHtcbiAgICBuYW1lOiB0eXBlLFxuICAgIHN0YXR1czogXCJyZXF1aXJlZFwiXG4gIH07XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJzaWduYXR1cmVcIjpcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xuICAgIGNhc2UgXCJzdGFtcFwiOlxuICAgICAgcmV0dXJuIGRlZmF1bHRPcHQ7XG4gICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWZhdWx0T3B0LFxuICAgICAgICBvcHRpb25zOiB7IGlzUmVhZE9ubHk6IGZhbHNlLCBpc0hpZGVMYWJlbDogZmFsc2UgfVxuICAgICAgfTtcbiAgICBjYXNlIHRleHRJbnB1dFdpZGdldDpcbiAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRPcHQgfTtcbiAgICBjYXNlIFwiaW5pdGlhbHNcIjpcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xuICAgIGNhc2UgXCJuYW1lXCI6XG4gICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0IH07XG4gICAgY2FzZSBcImNvbXBhbnlcIjpcbiAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRPcHQgfTtcbiAgICBjYXNlIFwiam9iIHRpdGxlXCI6XG4gICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0IH07XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZmF1bHRPcHQsXG4gICAgICAgIHJlc3BvbnNlOiBnZXREYXRlKCksXG4gICAgICAgIHZhbGlkYXRpb246IHsgZm9ybWF0OiBcIk1NL2RkL3l5eXlcIiwgdHlwZTogXCJkYXRlLWZvcm1hdFwiIH1cbiAgICAgIH07XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRPcHQsIHZhbGlkYXRpb246IHsgdHlwZTogXCJlbWFpbFwiLCBwYXR0ZXJuOiBcIlwiIH0gfTtcbiAgICBjYXNlIFwiZHJvcGRvd25cIjpcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xuICAgIGNhc2UgcmFkaW9CdXR0b25XaWRnZXQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWZhdWx0T3B0LFxuICAgICAgICB2YWx1ZXM6IFtdLFxuICAgICAgICBpc1JlYWRPbmx5OiBmYWxzZSxcbiAgICAgICAgaXNIaWRlTGFiZWw6IGZhbHNlXG4gICAgICB9O1xuICAgIGNhc2UgdGV4dFdpZGdldDpcbiAgICAgIHJldHVybiBkZWZhdWx0T3B0O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge307XG4gIH1cbn07XG5leHBvcnQgY29uc3QgZ2V0V2lkZ2V0VHlwZSA9IChpdGVtLCB3aWRnZXROYW1lKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJvcC1idG4gdy1maXQgbWQ6dy1bMTAwJV0gb3AtYnRuLXByaW1hcnkgb3AtYnRuLW91dGxpbmUgb3AtYnRuLXNtIGZvY3VzOm91dGxpbmUtbm9uZSBvdXRsaW5lIG91dGxpbmUtWzEuNXB4XSBtbC1bNnB4XSBtZDptbC0wIHAtMCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbCBmbGV4IG1kOmp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktc3RhcnQgaXRlbXMtY2VudGVyIHRleHQtWzEzcHhdIG1sLTFcIj5cbiAgICAgICAgICB7IWlzTW9iaWxlICYmIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWdyaXAtdmVydGljYWwgbWwtWzNweF1cIj48L2k+fVxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1kOmlubGluZS1ibG9jayB0ZXh0LWNlbnRlciB0ZXh0LVsxNXB4XSBtbC1bNXB4XSBmb250LXNlbWlib2xkIHByLTEgbWQ6cHItMFwiPlxuICAgICAgICAgICAge3dpZGdldE5hbWV9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsyMHB4XSBvcC1idG4gb3AtYnRuLXByaW1hcnkgcm91bmRlZC1ub25lIHctWzQwcHhdIGgtZnVsbCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxpIGNsYXNzTmFtZT17aXRlbS5pY29ufT48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdFdpZHRoSGVpZ2h0ID0gKHR5cGUpID0+IHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcInNpZ25hdHVyZVwiOlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiA2MCB9O1xuICAgIGNhc2UgXCJzdGFtcFwiOlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiA2MCB9O1xuICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1LCBoZWlnaHQ6IDE1IH07XG4gICAgY2FzZSB0ZXh0SW5wdXRXaWRnZXQ6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDI1IH07XG4gICAgY2FzZSBcImRyb3Bkb3duXCI6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTIwLCBoZWlnaHQ6IDIyIH07XG4gICAgY2FzZSBcImluaXRpYWxzXCI6XG4gICAgICByZXR1cm4geyB3aWR0aDogNTAsIGhlaWdodDogNTAgfTtcbiAgICBjYXNlIFwibmFtZVwiOlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAyNSB9O1xuICAgIGNhc2UgXCJjb21wYW55XCI6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDI1IH07XG4gICAgY2FzZSBcImpvYiB0aXRsZVwiOlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAyNSB9O1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTAwLCBoZWlnaHQ6IDIwIH07XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgICByZXR1cm4geyB3aWR0aDogNzAsIGhlaWdodDogNzAgfTtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogMjAgfTtcbiAgICBjYXNlIHJhZGlvQnV0dG9uV2lkZ2V0OlxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDUsIGhlaWdodDogMTAgfTtcbiAgICBjYXNlIHRleHRXaWRnZXQ6XG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDI1IH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogNjAgfTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJvcmRlckV4dHJhV2lkdGggPSAoKSA9PiB7XG4gIHJldHVybiAyMDtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCYXNlNjRGcm9tVXJsKHVybCwgYXV0b3NpZ24pIHtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoKHVybCk7XG4gIGNvbnN0IGJsb2IgPSBhd2FpdCBkYXRhLmJsb2IoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGRmQmFzZSA9IHRoaXMucmVzdWx0O1xuICAgICAgaWYgKGF1dG9zaWduKSB7XG4gICAgICAgIHJlc29sdmUocGRmQmFzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzdWZmaXhiYXNlNjQgPSBwZGZCYXNlLnNwbGl0KFwiLFwiKS5wb3AoKTtcbiAgICAgICAgcmVzb2x2ZShzdWZmaXhiYXNlNjQpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QmFzZTY0RnJvbUlNRyh1cmwpIHtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoKHVybCk7XG4gIGNvbnN0IGJsb2IgPSBhd2FpdCBkYXRhLmJsb2IoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGRmQmFzZSA9IHRoaXMucmVzdWx0O1xuXG4gICAgICByZXNvbHZlKHBkZkJhc2UpO1xuICAgIH07XG4gIH0pO1xufVxuLy9mdW5jdGlvbiBmb3IgY29udmVydCBzaWduYXR1cmUgcG5nIGJhc2U2NCB1cmwgdG8ganBlZyBiYXNlNjRcbmV4cG9ydCBjb25zdCBjb252ZXJ0UE5HdG9KUEVHID0gKGJhc2U2NERhdGEpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgIGltZy5zcmMgPSBiYXNlNjREYXRhO1xuXG4gICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuXG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IFwiI2ZmZmZmZlwiOyAvLyB3aGl0ZSBjb2xvclxuICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAvLyBDb252ZXJ0IHRvIEpQRUcgYnkgdXNpbmcgdGhlIGNhbnZhcy50b0RhdGFVUkwoKSBtZXRob2RcbiAgICAgIGNvbnN0IGpwZWdCYXNlNjREYXRhID0gY2FudmFzLnRvRGF0YVVSTChcImltYWdlL2pwZWdcIik7XG5cbiAgICAgIHJlc29sdmUoanBlZ0Jhc2U2NERhdGEpO1xuICAgIH07XG5cbiAgICBpbWcub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICB9KTtcbn07XG5cbi8vZnVuY3Rpb24gZm9yIHJlc2l6ZSBpbWFnZSBhbmQgdXBkYXRlIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHNpZ24teW91cnNlbGZcbmV4cG9ydCBjb25zdCBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZSA9IChcbiAgcmVmLFxuICBrZXksXG4gIHh5UG9zdGlvbixcbiAgc2V0WHlQb3N0aW9uLFxuICBpbmRleCxcbiAgY29udGFpbmVyU2NhbGUsXG4gIHNjYWxlXG4pID0+IHtcbiAgY29uc3QgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XG4gIGNvbnN0IGdldFBvc0RhdGEgPSBnZXRYWWRhdGE7XG4gIGNvbnN0IGFkZFNpZ24gPSBnZXRQb3NEYXRhLm1hcCgodXJsKSA9PiB7XG4gICAgaWYgKHVybC5rZXkgPT09IGtleSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udXJsLFxuICAgICAgICBXaWR0aDogcmVmLm9mZnNldFdpZHRoIC8gKHNjYWxlICogY29udGFpbmVyU2NhbGUpLFxuICAgICAgICBIZWlnaHQ6IHJlZi5vZmZzZXRIZWlnaHQgLyAoc2NhbGUgKiBjb250YWluZXJTY2FsZSksXG4gICAgICAgIElzUmVzaXplOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xuICB9KTtcblxuICBjb25zdCBuZXdVcGRhdGVVcmwgPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xuICAgIGlmIChpbmQgPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4geyAuLi5vYmosIHBvczogYWRkU2lnbiB9O1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9KTtcbiAgc2V0WHlQb3N0aW9uKG5ld1VwZGF0ZVVybCk7XG59O1xuXG4vL2Z1bmN0aW9uIGZvciBjYWxsIGNsb3VkIGZ1bmN0aW9uIHNpZ25QZGYgYW5kIGdlbmVyYXRlIGRpZ2l0YWwgc2lnbmF0dXJlXG5leHBvcnQgY29uc3Qgc2lnblBkZkZ1biA9IGFzeW5jIChcbiAgYmFzZTY0VXJsLFxuICBkb2N1bWVudElkLFxuICBzaWduZXJPYmplY3RJZCxcbiAgb2JqZWN0SWQsXG4gIGlzU3Vic2NyaWJlZCxcbiAgYWN0aXZlTWFpbEFkYXB0ZXIsXG4gIHdpZGdldHNcbikgPT4ge1xuICBsZXQgaXNDdXN0b21Db21wbGV0aW9uTWFpbCA9IGZhbHNlO1xuICB0cnkge1xuICAgIC8vZ2V0IHRlbmFudCBkZXRhaWxzXG4gICAgY29uc3QgdGVuYW50RGV0YWlscyA9IGF3YWl0IGdldFRlbmFudERldGFpbHMob2JqZWN0SWQpO1xuICAgIGlmICh0ZW5hbnREZXRhaWxzICYmIHRlbmFudERldGFpbHMgPT09IFwidXNlciBkb2VzIG5vdCBleGlzdCFcIikge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcImVycm9yXCIsIG1lc3NhZ2U6IFwiVXNlciBkb2VzIG5vdCBleGlzdC5cIiB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRlbmFudERldGFpbHM/LkNvbXBsZXRpb25Cb2R5ICYmXG4gICAgICAgIHRlbmFudERldGFpbHM/LkNvbXBsZXRpb25TdWJqZWN0ICYmXG4gICAgICAgIGlzU3Vic2NyaWJlZFxuICAgICAgKSB7XG4gICAgICAgIGlzQ3VzdG9tQ29tcGxldGlvbk1haWwgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGJlbG93IGZvciBsb29wIGlzIHVzZWQgdG8gZ2V0IGZpcnN0IHNpZ25hdHVyZSBvZiB1c2VyIHRvIHNlbmQgaWYgdG8gc2lnbnBkZlxuICAgIC8vIGZvciBhZGRpbmcgaXQgaW4gY29tcGxldGlvbiBjZXJ0aWZpY2F0ZVxuICAgIGxldCBnZXRTaWduYXR1cmU7XG4gICAgZm9yIChsZXQgaXRlbSBvZiB3aWRnZXRzKSB7XG4gICAgICBpZiAoIWdldFNpZ25hdHVyZSkge1xuICAgICAgICBjb25zdCB0eXBlRXhpc3QgPSBpdGVtLnBvcy5zb21lKChkYXRhKSA9PiBkYXRhPy50eXBlKTtcbiAgICAgICAgaWYgKHR5cGVFeGlzdCkge1xuICAgICAgICAgIGdldFNpZ25hdHVyZSA9IGl0ZW0ucG9zLmZpbmQoKGRhdGEpID0+IGRhdGE/LnR5cGUgPT09IFwic2lnbmF0dXJlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdldFNpZ25hdHVyZSA9IGl0ZW0ucG9zLmZpbmQoKGRhdGEpID0+ICFkYXRhLmlzU3RhbXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJhc2U2NFNpZ24gPSBnZXRTaWduYXR1cmUuU2lnblVybDtcbiAgICAvL2NoZWNrIGh0dHBzIHR5cGUgc2lnbmF0dXJlIChkZWZhdWx0IHNpZ25hdHVyZSBleGlzdCkgdGhlbiBjb252ZXJ0IGluIGJhc2U2NFxuICAgIGNvbnN0IGlzVXJsID0gYmFzZTY0U2lnbi5pbmNsdWRlcyhcImh0dHBzXCIpO1xuICAgIGlmIChpc1VybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYmFzZTY0U2lnbiA9IGF3YWl0IGZldGNoSW1hZ2VCYXNlNjQoYmFzZTY0U2lnbik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3JcIiwgZSk7XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBcInNvbWV0aGluZyB3ZW50IHdyb25nLlwiIH07XG4gICAgICB9XG4gICAgfVxuICAgIC8vY2hhbmdlIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQgdG8gMTAwLzQwIGluIHBuZyBiYXNlNjRcbiAgICBjb25zdCBnZXROZXdzZTY0ID0gYXdhaXQgY2hhbmdlSW1hZ2VXSChiYXNlNjRTaWduKTtcbiAgICAvL3JlbW92ZSBzdWZmaWl4IG9mIGJhc2U2NFxuICAgIGNvbnN0IHN1ZmZpeGJhc2U2NCA9IGdldE5ld3NlNjQgJiYgZ2V0TmV3c2U2NC5zcGxpdChcIixcIikucG9wKCk7XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBtYWlsUHJvdmlkZXI6IGFjdGl2ZU1haWxBZGFwdGVyLFxuICAgICAgcGRmRmlsZTogYmFzZTY0VXJsLFxuICAgICAgZG9jSWQ6IGRvY3VtZW50SWQsXG4gICAgICB1c2VySWQ6IHNpZ25lck9iamVjdElkLFxuICAgICAgaXNDdXN0b21Db21wbGV0aW9uTWFpbDogaXNDdXN0b21Db21wbGV0aW9uTWFpbCxcbiAgICAgIHNpZ25hdHVyZTogc3VmZml4YmFzZTY0XG4gICAgfTtcbiAgICBjb25zdCByZXNTaWduUGRmID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwic2lnblBkZlwiLCBwYXJhbXMpO1xuICAgIGlmIChyZXNTaWduUGRmKSB7XG4gICAgICBjb25zdCBzaWduZWRQZGYgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc1NpZ25QZGYpKTtcbiAgICAgIHJldHVybiBzaWduZWRQZGY7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gc2lnblBkZiBjbG91ZCBmdW5jdGlvbiBcIiwgZS5tZXNzYWdlKTtcbiAgICBpZiAoZSAmJiBlPy5tZXNzYWdlPy5pbmNsdWRlcyhcImlzIGVuY3J5cHRlZC5cIikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBtZXNzYWdlOiBcIkN1cnJlbnRseSBlbmNyeXB0ZWQgcGRmIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkLlwiXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBlLm1lc3NhZ2UgPT09IFwiUEtDUyMxMiBNQUMgY291bGQgbm90IGJlIHZlcmlmaWVkLiBJbnZhbGlkIHBhc3N3b3JkP1wiXG4gICAgKSB7XG4gICAgICByZXR1cm4geyBzdGF0dXM6IFwiZXJyb3JcIiwgbWVzc2FnZTogXCJQRlggZmlsZSBwYXNzd29yZCBpcyBpbnZhbGlkLlwiIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBcInNvbWV0aGluZyB3ZW50IHdyb25nLlwiIH07XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmFuZG9tSWQgPSAoKSA9PiB7XG4gIGNvbnN0IHJhbmRvbUJ5dGVzID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDE2QXJyYXkoMSkpO1xuICBjb25zdCByYW5kb21WYWx1ZSA9IHJhbmRvbUJ5dGVzWzBdO1xuICBjb25zdCByYW5kb21EaWdpdCA9IDEwMDAgKyAocmFuZG9tVmFsdWUgJSA5MDAwKTtcbiAgcmV0dXJuIHJhbmRvbURpZ2l0O1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURvY3VtZW50ID0gYXN5bmMgKFxuICB0ZW1wbGF0ZSxcbiAgcGxhY2Vob2xkZXJzLFxuICBzaWduZXJEYXRhLFxuICBwZGZVcmxcbikgPT4ge1xuICBpZiAodGVtcGxhdGUgJiYgdGVtcGxhdGUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IERvYyA9IHRlbXBsYXRlWzBdO1xuXG4gICAgbGV0IHBsYWNlaG9sZGVyc0FyciA9IFtdO1xuICAgIGlmIChwbGFjZWhvbGRlcnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHBsYWNlaG9sZGVyc0FyciA9IHBsYWNlaG9sZGVycztcbiAgICB9XG4gICAgbGV0IHNpZ25lcnMgPSBbXTtcbiAgICBpZiAoc2lnbmVyRGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgc2lnbmVyRGF0YS5mb3JFYWNoKCh4KSA9PiB7XG4gICAgICAgIGlmICh4Lm9iamVjdElkKSB7XG4gICAgICAgICAgY29uc3Qgb2JqID0ge1xuICAgICAgICAgICAgX190eXBlOiBcIlBvaW50ZXJcIixcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJjb250cmFjdHNfQ29udGFjdGJvb2tcIixcbiAgICAgICAgICAgIG9iamVjdElkOiB4Lm9iamVjdElkXG4gICAgICAgICAgfTtcbiAgICAgICAgICBzaWduZXJzLnB1c2gob2JqKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBOYW1lOiBEb2MuTmFtZSxcbiAgICAgIFVSTDogcGRmVXJsLFxuICAgICAgU2lnbmVkVXJsOiBEb2MuU2lnbmVkVXJsLFxuICAgICAgU2VudFRvT3RoZXJzOiBEb2MuU2VudFRvT3RoZXJzLFxuICAgICAgRGVzY3JpcHRpb246IERvYy5EZXNjcmlwdGlvbixcbiAgICAgIE5vdGU6IERvYy5Ob3RlLFxuICAgICAgUGxhY2Vob2xkZXJzOiBwbGFjZWhvbGRlcnNBcnIsXG4gICAgICBFeHRVc2VyUHRyOiB7XG4gICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJjb250cmFjdHNfVXNlcnNcIixcbiAgICAgICAgb2JqZWN0SWQ6IERvYy5FeHRVc2VyUHRyLm9iamVjdElkXG4gICAgICB9LFxuICAgICAgQ3JlYXRlZEJ5OiB7XG4gICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJfVXNlclwiLFxuICAgICAgICBvYmplY3RJZDogRG9jLkNyZWF0ZWRCeS5vYmplY3RJZFxuICAgICAgfSxcbiAgICAgIFNpZ25lcnM6IHNpZ25lcnMsXG4gICAgICBTZW5kaW5PcmRlcjogRG9jPy5TZW5kaW5PcmRlciB8fCBmYWxzZSxcbiAgICAgIEF1dG9tYXRpY1JlbWluZGVyczogRG9jPy5BdXRvbWF0aWNSZW1pbmRlcnMgfHwgZmFsc2UsXG4gICAgICBSZW1pbmRPbmNlSW5FdmVyeTogcGFyc2VJbnQoRG9jPy5SZW1pbmRPbmNlSW5FdmVyeSB8fCA1KVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXhpb3MucG9zdChcbiAgICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfWNsYXNzZXMvY29udHJhY3RzX0RvY3VtZW50YCxcbiAgICAgICAgZGF0YSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJzdWNjZXNzXCIsIGlkOiByZXMuZGF0YS5vYmplY3RJZCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coXCJheG9pcyBlcnIgXCIsIGVycik7XG4gICAgICByZXR1cm4geyBzdGF0dXM6IFwiZXJyb3JcIiwgaWQ6IFwiU29tZXRoaW5nIFdlbnQgV3JvbmchXCIgfTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaXJzdExldHRlciA9IChuYW1lKSA9PiB7XG4gIGNvbnN0IGZpcnN0TGV0dGVyID0gbmFtZT8uY2hhckF0KDApO1xuICByZXR1cm4gZmlyc3RMZXR0ZXI7XG59O1xuXG5leHBvcnQgY29uc3QgZGFya2VuQ29sb3IgPSAoY29sb3IsIGZhY3RvcikgPT4ge1xuICAvLyBSZW1vdmUgJyMnIGZyb20gdGhlIGNvbG9yIGNvZGUgYW5kIHBhcnNlIGl0IHRvIGdldCBSR0IgdmFsdWVzXG4gIGNvbnN0IGhleCA9IGNvbG9yLnJlcGxhY2UoXCIjXCIsIFwiXCIpO1xuICBjb25zdCByID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygwLCAyKSwgMTYpO1xuICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xuICBjb25zdCBiID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZyg0LCA2KSwgMTYpO1xuXG4gIC8vIERhcmtlbiB0aGUgY29sb3IgYnkgcmVkdWNpbmcgZWFjaCBSR0IgY29tcG9uZW50XG4gIGNvbnN0IGRhcmtlclIgPSBNYXRoLmZsb29yKHIgKiAoMSAtIGZhY3RvcikpO1xuICBjb25zdCBkYXJrZXJHID0gTWF0aC5mbG9vcihnICogKDEgLSBmYWN0b3IpKTtcbiAgY29uc3QgZGFya2VyQiA9IE1hdGguZmxvb3IoYiAqICgxIC0gZmFjdG9yKSk7XG5cbiAgLy8gQ29udmVydCB0aGUgZGFya2VuZWQgUkdCIGNvbXBvbmVudHMgYmFjayB0byBoZXhcbiAgcmV0dXJuIGAjJHsoKGRhcmtlclIgPDwgMTYpIHwgKGRhcmtlckcgPDwgOCkgfCBkYXJrZXJCKVxuICAgIC50b1N0cmluZygxNilcbiAgICAucGFkU3RhcnQoNiwgXCIwXCIpfWA7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkWkluZGV4ID0gKHNpZ25lclBvcywga2V5LCBzZXRaSW5kZXgpID0+IHtcbiAgcmV0dXJuIHNpZ25lclBvcy5tYXAoKGl0ZW0pID0+IHtcbiAgICBpZiAoaXRlbS5wbGFjZUhvbGRlciAmJiBpdGVtLnBsYWNlSG9sZGVyLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIGEgbmVzdGVkIGFycmF5LCByZWN1cnNpdmVseSBhZGQgdGhlIGZpZWxkIHRvIHRoZSBsYXN0IG9iamVjdFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgcGxhY2VIb2xkZXI6IGFkZFpJbmRleChpdGVtLnBsYWNlSG9sZGVyLCBrZXksIHNldFpJbmRleClcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpdGVtLnBvcyAmJiBpdGVtLnBvcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyBuZXN0ZWQgYXJyYXksIGFkZCB0aGUgbmV3IGZpZWxkXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBwb3M6IGFkZFpJbmRleChpdGVtLnBvcywga2V5LCBzZXRaSW5kZXgpXG4gICAgICAgIC8vIEFkanVzdCB0aGlzIGxpbmUgdG8gYWRkIHRoZSBkZXNpcmVkIGZpZWxkXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXRlbS5rZXkgPT09IGtleSkge1xuICAgICAgICBzZXRaSW5kZXgoaXRlbS56SW5kZXgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgekluZGV4OiBpdGVtLnpJbmRleCA/IGl0ZW0uekluZGV4ICsgMSA6IDFcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vL2Z1bmN0aW9uIGZvciBzYXZlIHdpZGdldHMgdmFsdWUgb24gb25jaGFuZ2UgZnVuY3Rpb25cbmV4cG9ydCBjb25zdCBvbkNoYW5nZUlucHV0ID0gKFxuICB2YWx1ZSxcbiAgc2lnbktleSxcbiAgeHlQb3N0aW9uLFxuICBpbmRleCxcbiAgc2V0WHlQb3N0aW9uLFxuICB1c2VySWQsXG4gIGluaXRpYWwsXG4gIGRhdGVGb3JtYXQsXG4gIGlzRGVmYXVsdEVtcHR5LFxuICBpc1JhZGlvLFxuICBmb250U2l6ZSxcbiAgZm9udENvbG9yXG4pID0+IHtcbiAgY29uc3QgaXNTaWduZXJzID0geHlQb3N0aW9uLnNvbWUoKGRhdGEpID0+IGRhdGEuc2lnbmVyUHRyKTtcbiAgbGV0IGZpbHRlclNpZ25lclBvcztcbiAgaWYgKGlzU2lnbmVycykge1xuICAgIGlmICh1c2VySWQpIHtcbiAgICAgIGZpbHRlclNpZ25lclBvcyA9IHh5UG9zdGlvbi5maWx0ZXIoKGRhdGEpID0+IGRhdGEuSWQgPT09IHVzZXJJZCk7XG4gICAgfVxuICAgIGNvbnN0IGdldFBsYWNlSG9sZGVyID0gZmlsdGVyU2lnbmVyUG9zWzBdPy5wbGFjZUhvbGRlcjtcbiAgICBpZiAoaW5pdGlhbCkge1xuICAgICAgY29uc3QgeHlEYXRhID0gYWRkSW5pdGlhbERhdGEoeHlQb3N0aW9uLCBzZXRYeVBvc3Rpb24sIHZhbHVlLCB1c2VySWQpO1xuICAgICAgc2V0WHlQb3N0aW9uKHh5RGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdldFBhZ2VOdW1lciA9IGdldFBsYWNlSG9sZGVyLmZpbHRlcihcbiAgICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gaW5kZXhcbiAgICAgICk7XG4gICAgICBpZiAoZ2V0UGFnZU51bWVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZ2V0WFlkYXRhID0gZ2V0UGFnZU51bWVyWzBdLnBvcztcbiAgICAgICAgY29uc3QgZ2V0UG9zRGF0YSA9IGdldFhZZGF0YTtcbiAgICAgICAgY29uc3QgYWRkU2lnblBvcyA9IGdldFBvc0RhdGEubWFwKChwb3NpdGlvbikgPT4ge1xuICAgICAgICAgIGlmIChwb3NpdGlvbi5rZXkgPT09IHNpZ25LZXkpIHtcbiAgICAgICAgICAgIGlmIChkYXRlRm9ybWF0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgICAgICAgIGZvbnRDb2xvcjogZm9udENvbG9yLFxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGUtZm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogZGF0ZUZvcm1hdCAvLyBUaGlzIGluZGljYXRlcyB0aGUgcmVxdWlyZWQgZGF0ZSBmb3JtYXQgZXhwbGljaXRseS5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRGVmYXVsdEVtcHR5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogaXNSYWRpbyA/IFwiXCIgOiBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbmV3VXBkYXRlU2lnblBvcyA9IGdldFBsYWNlSG9sZGVyLm1hcCgob2JqKSA9PiB7XG4gICAgICAgICAgaWYgKG9iai5wYWdlTnVtYmVyID09PSBpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IGFkZFNpZ25Qb3MgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbmV3VXBkYXRlU2lnbmVyID0geHlQb3N0aW9uLm1hcCgob2JqKSA9PiB7XG4gICAgICAgICAgaWYgKG9iai5JZCA9PT0gdXNlcklkKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBuZXdVcGRhdGVTaWduUG9zIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldFh5UG9zdGlvbihuZXdVcGRhdGVTaWduZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSBnZXRYWWRhdGEubWFwKChwb3NpdGlvbkRhdGEpID0+IHtcbiAgICAgIGlmIChwb3NpdGlvbkRhdGEua2V5ID09PSBzaWduS2V5KSB7XG4gICAgICAgIGlmIChkYXRlRm9ybWF0KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uRGF0YSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgLi4ucG9zaXRpb25EYXRhLm9wdGlvbnMsXG4gICAgICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgICBmb250Q29sb3I6IGZvbnRDb2xvcixcbiAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZS1mb3JtYXRcIixcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IGRhdGVGb3JtYXQgLy8gVGhpcyBpbmRpY2F0ZXMgdGhlIHJlcXVpcmVkIGRhdGUgZm9ybWF0IGV4cGxpY2l0bHkuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wb3NpdGlvbkRhdGEsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgIC4uLnBvc2l0aW9uRGF0YS5vcHRpb25zLFxuICAgICAgICAgICAgICByZXNwb25zZTogdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcG9zaXRpb25EYXRhO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdXBkYXRlUGxhY2Vob2xkZXIgPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xuICAgICAgaWYgKGluZCA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IHVwZGF0ZVBvc2l0aW9uIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0pO1xuICAgIHNldFh5UG9zdGlvbih1cGRhdGVQbGFjZWhvbGRlcik7XG4gIH1cbn07XG5cbi8vZnVuY3Rpb24gdG8gaW5jcmVhc2UgaGVpZ2h0IG9mIHRleHQgYXJlYSBvbiBwcmVzcyBlbnRlclxuZXhwb3J0IGNvbnN0IG9uQ2hhbmdlSGVpZ2h0T2ZUZXh0QXJlYSA9IChcbiAgaGVpZ2h0LFxuICB3aWRnZXRUeXBlLFxuICBzaWduS2V5LFxuICB4eVBvc3Rpb24sXG4gIGluZGV4LFxuICBzZXRYeVBvc3Rpb24sXG4gIHVzZXJJZFxuKSA9PiB7XG4gIGNvbnN0IGlzU2lnbmVycyA9IHh5UG9zdGlvbi5zb21lKChkYXRhKSA9PiBkYXRhLnNpZ25lclB0cik7XG4gIGxldCBmaWx0ZXJTaWduZXJQb3M7XG4gIGlmIChpc1NpZ25lcnMpIHtcbiAgICBpZiAodXNlcklkKSB7XG4gICAgICBmaWx0ZXJTaWduZXJQb3MgPSB4eVBvc3Rpb24uZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSB1c2VySWQpO1xuICAgIH1cbiAgICBjb25zdCBnZXRQbGFjZUhvbGRlciA9IGZpbHRlclNpZ25lclBvc1swXT8ucGxhY2VIb2xkZXI7XG5cbiAgICBjb25zdCBnZXRQYWdlTnVtZXIgPSBnZXRQbGFjZUhvbGRlci5maWx0ZXIoXG4gICAgICAoZGF0YSkgPT4gZGF0YS5wYWdlTnVtYmVyID09PSBpbmRleFxuICAgICk7XG4gICAgaWYgKGdldFBhZ2VOdW1lci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBnZXRYWWRhdGEgPSBnZXRQYWdlTnVtZXJbMF0ucG9zO1xuICAgICAgY29uc3QgZ2V0UG9zRGF0YSA9IGdldFhZZGF0YTtcbiAgICAgIGNvbnN0IGFkZFNpZ25Qb3MgPSBnZXRQb3NEYXRhLm1hcCgocG9zaXRpb24pID0+IHtcbiAgICAgICAgaWYgKHBvc2l0aW9uLmtleSA9PT0gc2lnbktleSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgICAgIEhlaWdodDogcG9zaXRpb24uSGVpZ2h0XG4gICAgICAgICAgICAgID8gcG9zaXRpb24uSGVpZ2h0ICsgaGVpZ2h0XG4gICAgICAgICAgICAgIDogZGVmYXVsdFdpZHRoSGVpZ2h0KHdpZGdldFR5cGUpLmhlaWdodCArIGhlaWdodFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXdVcGRhdGVTaWduUG9zID0gZ2V0UGxhY2VIb2xkZXIubWFwKChvYmopID0+IHtcbiAgICAgICAgaWYgKG9iai5wYWdlTnVtYmVyID09PSBpbmRleCkge1xuICAgICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiBhZGRTaWduUG9zIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBuZXdVcGRhdGVTaWduZXIgPSB4eVBvc3Rpb24ubWFwKChvYmopID0+IHtcbiAgICAgICAgaWYgKG9iai5JZCA9PT0gdXNlcklkKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwbGFjZUhvbGRlcjogbmV3VXBkYXRlU2lnblBvcyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9KTtcblxuICAgICAgc2V0WHlQb3N0aW9uKG5ld1VwZGF0ZVNpZ25lcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBnZXRYWWRhdGEgPSB4eVBvc3Rpb25baW5kZXhdLnBvcztcblxuICAgIGNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gZ2V0WFlkYXRhLm1hcCgocG9zaXRpb24pID0+IHtcbiAgICAgIGlmIChwb3NpdGlvbi5rZXkgPT09IHNpZ25LZXkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgICBIZWlnaHQ6IHBvc2l0aW9uLkhlaWdodFxuICAgICAgICAgICAgPyBwb3NpdGlvbi5IZWlnaHQgKyBoZWlnaHRcbiAgICAgICAgICAgIDogZGVmYXVsdFdpZHRoSGVpZ2h0KHdpZGdldFR5cGUpLmhlaWdodCArIGhlaWdodFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdXBkYXRlUGxhY2Vob2xkZXIgPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xuICAgICAgaWYgKGluZCA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IHVwZGF0ZVBvc2l0aW9uIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0pO1xuICAgIHNldFh5UG9zdGlvbih1cGRhdGVQbGFjZWhvbGRlcik7XG4gIH1cbn07XG4vL2NhbGN1bGF0ZSB3aWR0aCBhbmQgaGVpZ2h0XG5leHBvcnQgY29uc3QgY2FsY3VsYXRlSW5pdGlhbFdpZHRoSGVpZ2h0ID0gKHdpZGdldERhdGEpID0+IHtcbiAgY29uc3QgaW50aWFsVGV4dCA9IHdpZGdldERhdGE7XG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgc3Bhbi50ZXh0Q29udGVudCA9IGludGlhbFRleHQ7XG4gIHNwYW4uc3R5bGUuZm9udCA9IGAxNHB4YDsgLy8gaGVyZSBwdXQgeW91ciB0ZXh0IHNpemUgYW5kIGZvbnQgZmFtaWx5XG4gIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaGlkZGVuXCI7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gIGNvbnN0IHdpZHRoID0gc3Bhbi5vZmZzZXRXaWR0aDtcbiAgY29uc3QgaGVpZ2h0ID0gc3Bhbi5vZmZzZXRIZWlnaHQ7XG5cbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgcmV0dXJuIHtcbiAgICBnZXRXaWR0aDogd2lkdGgsXG4gICAgZ2V0SGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn07XG5leHBvcnQgY29uc3QgYWRkSW5pdGlhbERhdGEgPSAoc2lnbmVyUG9zLCBzZXRYeVBvc3Rpb24sIHZhbHVlLCB1c2VySWQpID0+IHtcbiAgZnVuY3Rpb24gd2lkZ2V0RGF0YVZhbHVlKHR5cGUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJuYW1lXCI6XG4gICAgICAgIHJldHVybiB2YWx1ZT8uTmFtZTtcbiAgICAgIGNhc2UgXCJjb21wYW55XCI6XG4gICAgICAgIHJldHVybiB2YWx1ZT8uQ29tcGFueTtcbiAgICAgIGNhc2UgXCJqb2IgdGl0bGVcIjpcbiAgICAgICAgcmV0dXJuIHZhbHVlPy5Kb2JUaXRsZTtcbiAgICAgIGNhc2UgXCJlbWFpbFwiOlxuICAgICAgICByZXR1cm4gdmFsdWU/LkVtYWlsO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaWduZXJQb3MubWFwKChpdGVtKSA9PiB7XG4gICAgaWYgKGl0ZW0ucGxhY2VIb2xkZXIgJiYgaXRlbS5wbGFjZUhvbGRlci5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIG5lc3RlZCBhcnJheSwgcmVjdXJzaXZlbHkgYWRkIHRoZSBmaWVsZCB0byB0aGUgbGFzdCBvYmplY3RcbiAgICAgIGlmIChpdGVtLklkID09PSB1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIHBsYWNlSG9sZGVyOiBhZGRJbml0aWFsRGF0YShcbiAgICAgICAgICAgIGl0ZW0ucGxhY2VIb2xkZXIsXG4gICAgICAgICAgICBzZXRYeVBvc3Rpb24sXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICAgIClcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaXRlbVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXRlbS5wb3MgJiYgaXRlbS5wb3MubGVuZ3RoID4gMCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbmVzdGVkIGFycmF5LCBhZGQgdGhlIG5ldyBmaWVsZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgcG9zOiBhZGRJbml0aWFsRGF0YShpdGVtLnBvcywgc2V0WHlQb3N0aW9uLCB2YWx1ZSwgdXNlcklkKVxuICAgICAgICAvLyBBZGp1c3QgdGhpcyBsaW5lIHRvIGFkZCB0aGUgZGVzaXJlZCBmaWVsZFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgd2lkZ2V0RGF0YSA9IHdpZGdldERhdGFWYWx1ZShpdGVtLnR5cGUpO1xuICAgICAgaWYgKFtcIm5hbWVcIiwgXCJjb21wYW55XCIsIFwiam9iIHRpdGxlXCIsIFwiZW1haWxcIl0uaW5jbHVkZXMoaXRlbS50eXBlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgLi4uaXRlbS5vcHRpb25zLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB3aWRnZXREYXRhXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFdpZHRoOlxuICAgICAgICAgIC8vICAgY2FsY3VsYXRlSW5pdGlhbFdpZHRoSGVpZ2h0KGl0ZW0udHlwZSwgd2lkZ2V0RGF0YSkuZ2V0V2lkdGggfHxcbiAgICAgICAgICAvLyAgIGl0ZW0/LldpZHRoLFxuICAgICAgICAgIC8vIEhlaWdodDpcbiAgICAgICAgICAvLyAgIGNhbGN1bGF0ZUluaXRpYWxXaWR0aEhlaWdodChpdGVtLnR5cGUsIHdpZGdldERhdGEpLmdldEhlaWdodCB8fFxuICAgICAgICAgIC8vICAgaXRlbT8uSGVpZ2h0XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLml0ZW1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLy9mdW5jdGlvbiBmb3IgZW1iZWQgZG9jdW1lbnQgaWRcbmV4cG9ydCBjb25zdCBlbWJlZERvY0lkID0gYXN5bmMgKHBkZkRvYywgZG9jdW1lbnRJZCwgYWxsUGFnZXMpID0+IHtcbiAgLy8gYGZvbnRCeXRlc2AgaXMgdXNlZCB0byBlbWJlZCBjdXN0b20gZm9udCBpbiBwZGZcbiAgY29uc3QgZm9udEJ5dGVzID0gYXdhaXQgZmlsZWFzYnl0ZXMoXG4gICAgXCJodHRwczovL2Nkbi5vcGVuc2lnbmxhYnMuY29tL3dlYmZvbnRzL3RpbWVzLnR0ZlwiXG4gICk7XG4gIHBkZkRvYy5yZWdpc3RlckZvbnRraXQoZm9udGtpdCk7XG4gIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KGZvbnRCeXRlcywgeyBzdWJzZXQ6IHRydWUgfSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsUGFnZXM7IGkrKykge1xuICAgIGNvbnN0IGZvbnRTaXplID0gMTA7XG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSBkb2N1bWVudElkICYmIGBPcGVuU2lnbuKEoiBEb2N1bWVudElkOiAke2RvY3VtZW50SWR9IGA7XG4gICAgY29uc3QgcGFnZXMgPSBwZGZEb2MuZ2V0UGFnZXMoKTtcbiAgICBjb25zdCBwYWdlID0gcGFnZXNbaV07XG4gICAgY29uc3QgZ2V0T2JqID0gY29tcGVuc2F0ZVJvdGF0aW9uKFxuICAgICAgcGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlLFxuICAgICAgMTAsXG4gICAgICA1LFxuICAgICAgMSxcbiAgICAgIHBhZ2UuZ2V0U2l6ZSgpLFxuICAgICAgZm9udFNpemUsXG4gICAgICByZ2IoMC41LCAwLjUsIDAuNSksXG4gICAgICBmb250LFxuICAgICAgcGFnZVxuICAgICk7XG4gICAgcGFnZS5kcmF3VGV4dCh0ZXh0Q29udGVudCwgZ2V0T2JqKTtcbiAgfVxufTtcblxuLy9mdW5jdGlvbiBmb3Igc2F2ZSBidXR0b24gdG8gc2F2ZSBzaWduYXR1cmUgb3IgaW1hZ2UgdXJsXG5leHBvcnQgZnVuY3Rpb24gb25TYXZlU2lnbihcbiAgdHlwZSxcbiAgeHlQb3N0aW9uLFxuICBpbmRleCxcbiAgc2lnbktleSxcbiAgc2lnbmF0dXJlSW1nLFxuICBpbWdXSCxcbiAgaXNEZWZhdWx0U2lnbixcbiAgaXNUeXBlVGV4dFxuKSB7XG4gIGxldCBnZXRJTUdXSDtcbiAgbGV0IGdldFhZZGF0YSA9IHh5UG9zdGlvbltpbmRleF0ucG9zO1xuICBjb25zdCB1cGRhdGVYWURhdGEgPSBnZXRYWWRhdGEubWFwKChwb3NpdGlvbikgPT4ge1xuICAgIGlmIChwb3NpdGlvbi5rZXkgPT09IHNpZ25LZXkpIHtcbiAgICAgIGlmIChpc0RlZmF1bHRTaWduID09PSBcImluaXRpYWxzXCIpIHtcbiAgICAgICAgbGV0IGltZ1dIID0geyB3aWR0aDogcG9zaXRpb24uV2lkdGgsIGhlaWdodDogcG9zaXRpb24uSGVpZ2h0IH07XG4gICAgICAgIGdldElNR1dIID0gY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8oaW1nV0gsIHBvc2l0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNEZWZhdWx0U2lnbiA9PT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgZ2V0SU1HV0ggPSBjYWxjdWxhdGVJbWdBc3BlY3RSYXRpbyhpbWdXSCwgcG9zaXRpb24pO1xuICAgICAgfSBlbHNlIGlmIChpc1R5cGVUZXh0KSB7XG4gICAgICAgIGdldElNR1dIID0geyBuZXdXaWR0aDogaW1nV0gud2lkdGgsIG5ld0hlaWdodDogaW1nV0guaGVpZ2h0IH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBkZWZhdWx0V2lkdGhIZWlnaHQocG9zaXRpb24/LnR5cGUpLndpZHRoO1xuICAgICAgICBjb25zdCBkZWZhdWx0SGVpZ2h0ID0gZGVmYXVsdFdpZHRoSGVpZ2h0KHBvc2l0aW9uPy50eXBlKS5oZWlnaHQ7XG5cbiAgICAgICAgZ2V0SU1HV0ggPSBjYWxjdWxhdGVJbWdBc3BlY3RSYXRpbyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3aWR0aDogZGVmYXVsdFdpZHRoID8gZGVmYXVsdFdpZHRoIDogMTUwLFxuICAgICAgICAgICAgaGVpZ2h0OiBkZWZhdWx0SGVpZ2h0ID8gZGVmYXVsdEhlaWdodCA6IDYwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwb3NpdGlvblxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb3NXaWR0aCA9IGdldElNR1dIID8gZ2V0SU1HV0gubmV3V2lkdGggOiAxNTA7XG4gICAgICBjb25zdCBwb3NIZWlnaHQgPSBnZXRJTUdXSCA/IGdldElNR1dILm5ld0hlaWdodCA6IDYwO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgV2lkdGg6IHBvc1dpZHRoLFxuICAgICAgICBIZWlnaHQ6IHBvc0hlaWdodCxcbiAgICAgICAgU2lnblVybDogc2lnbmF0dXJlSW1nLFxuICAgICAgICBzaWduYXR1cmVUeXBlOiB0eXBlICYmIHR5cGUsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAuLi5wb3NpdGlvbi5vcHRpb25zLFxuICAgICAgICAgIHJlc3BvbnNlOiBzaWduYXR1cmVJbWdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9KTtcblxuICBjb25zdCB1cGRhdGVYWXBvc2l0aW9uID0geHlQb3N0aW9uLm1hcCgob2JqLCBpbmQpID0+IHtcbiAgICBpZiAoaW5kID09PSBpbmRleCkge1xuICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IHVwZGF0ZVhZRGF0YSB9O1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9KTtcbiAgcmV0dXJuIHVwZGF0ZVhZcG9zaXRpb247XG59XG5cbmV4cG9ydCBjb25zdCBjYWxjdWxhdGVJbWdBc3BlY3RSYXRpbyA9IChpbWdXSCwgcG9zKSA9PiB7XG4gIGxldCBuZXdXaWR0aCwgbmV3SGVpZ2h0O1xuXG4gIGNvbnN0IHBsYWNlaG9sZGVySGVpZ2h0ID0gcG9zICYmIHBvcy5IZWlnaHQgPyBwb3MuSGVpZ2h0IDogNjA7XG4gIGNvbnN0IGFzcGVjdFJhdGlvID0gaW1nV0gud2lkdGggLyBpbWdXSC5oZWlnaHQ7XG4gIG5ld1dpZHRoID0gYXNwZWN0UmF0aW8gKiBwbGFjZWhvbGRlckhlaWdodDtcbiAgbmV3SGVpZ2h0ID0gcGxhY2Vob2xkZXJIZWlnaHQ7XG5cbiAgcmV0dXJuIHsgbmV3SGVpZ2h0LCBuZXdXaWR0aCB9O1xufTtcblxuLy9mdW5jdGlvbiBmb3IgdXBsb2FkIHN0YW1wIG9yIGltYWdlXG5leHBvcnQgZnVuY3Rpb24gb25TYXZlSW1hZ2UoeHlQb3N0aW9uLCBpbmRleCwgc2lnbktleSwgaW1nV0gsIGltYWdlKSB7XG4gIGxldCBnZXRJTUdXSDtcblxuICAvL2dldCBjdXJyZW50IHBhZ2UgcG9zaXRpb25cbiAgY29uc3QgZ2V0WFlEYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XG4gIGNvbnN0IHVwZGF0ZVhZRGF0YSA9IGdldFhZRGF0YS5tYXAoKHBvc2l0aW9uKSA9PiB7XG4gICAgaWYgKHBvc2l0aW9uLmtleSA9PT0gc2lnbktleSkge1xuICAgICAgZ2V0SU1HV0ggPSBjYWxjdWxhdGVJbWdBc3BlY3RSYXRpbyhpbWdXSCwgcG9zaXRpb24pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgV2lkdGg6IGdldElNR1dILm5ld1dpZHRoLFxuICAgICAgICBIZWlnaHQ6IGdldElNR1dILm5ld0hlaWdodCxcbiAgICAgICAgU2lnblVybDogaW1hZ2Uuc3JjLFxuICAgICAgICBJbWFnZVR5cGU6IGltYWdlLmltZ1R5cGUsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAuLi5wb3NpdGlvbi5vcHRpb25zLFxuICAgICAgICAgIHJlc3BvbnNlOiBpbWFnZS5zcmNcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9KTtcblxuICBjb25zdCB1cGRhdGVYWXBvc2l0aW9uID0geHlQb3N0aW9uLm1hcCgob2JqLCBpbmQpID0+IHtcbiAgICBpZiAoaW5kID09PSBpbmRleCkge1xuICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IHVwZGF0ZVhZRGF0YSB9O1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9KTtcbiAgcmV0dXJuIHVwZGF0ZVhZcG9zaXRpb247XG59XG5cbi8vZnVuY3Rpb24gZm9yIHNlbGVjdCBpbWFnZSBhbmQgdXBsb2FkIGltYWdlXG5leHBvcnQgY29uc3Qgb25JbWFnZVNlbGVjdCA9IChldmVudCwgc2V0SW1nV0gsIHNldEltYWdlKSA9PiB7XG4gIGNvbnN0IGltYWdlVHlwZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXS50eXBlO1xuICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICByZWFkZXIucmVhZEFzRGF0YVVSTChldmVudC50YXJnZXQuZmlsZXNbMF0pO1xuICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKGUpIHtcbiAgICBsZXQgd2lkdGgsIGhlaWdodDtcbiAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuXG4gICAgaW1hZ2Uuc3JjID0gZS50YXJnZXQucmVzdWx0O1xuICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpZHRoID0gaW1hZ2Uud2lkdGg7XG4gICAgICBoZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XG4gICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IDQ2MCAvIDE4NDtcbiAgICAgIGNvbnN0IGltZ1IgPSB3aWR0aCAvIGhlaWdodDtcblxuICAgICAgaWYgKGltZ1IgPiBhc3BlY3RSYXRpbykge1xuICAgICAgICB3aWR0aCA9IDQ2MDtcbiAgICAgICAgaGVpZ2h0ID0gNDYwIC8gaW1nUjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpZHRoID0gMTg0ICogaW1nUjtcbiAgICAgICAgaGVpZ2h0ID0gMTg0O1xuICAgICAgfVxuICAgICAgc2V0SW1nV0goeyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH0pO1xuICAgIH07XG5cbiAgICBpbWFnZS5zcmMgPSByZWFkZXIucmVzdWx0O1xuXG4gICAgc2V0SW1hZ2UoeyBzcmM6IGltYWdlLnNyYywgaW1nVHlwZTogaW1hZ2VUeXBlIH0pO1xuICB9O1xufTtcbi8vY29udmVydCBodHRwcyB1cmwgdG8gYmFzZTY0XG5leHBvcnQgY29uc3QgZmV0Y2hJbWFnZUJhc2U2NCA9IGFzeW5jIChpbWFnZVVybCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goaW1hZ2VVcmwpO1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYmFzZTY0ZGF0YSA9IHJlYWRlci5yZXN1bHQ7XG4gICAgICAgIHJlc29sdmUoYmFzZTY0ZGF0YSk7XG4gICAgICB9O1xuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgY29udmVydGluZyBVUkwgdG8gYmFzZTY0OlwiLCBlcnJvcik7XG4gIH1cbn07XG4vL2Z1bmN0aW9uIGZvciBzZWxlY3QgaW1hZ2UgYW5kIHVwbG9hZCBpbWFnZVxuZXhwb3J0IGNvbnN0IGNoYW5nZUltYWdlV0ggPSBhc3luYyAoYmFzZTY0SW1hZ2UpID0+IHtcbiAgY29uc3QgbmV3V2lkdGggPSAzMDA7XG4gIGNvbnN0IG5ld0hlaWdodCA9IDEyMDtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcuc3JjID0gYmFzZTY0SW1hZ2U7XG4gICAgaW1nLm9ubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY2FudmFzLndpZHRoID0gbmV3V2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgY29uc3QgcmVzaXplZEJhc2U2NCA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIiwgMS4wKTtcbiAgICAgIHJlc29sdmUocmVzaXplZEJhc2U2NCk7XG4gICAgfTtcbiAgICBpbWcub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICB9KTtcbn07XG5cbi8vZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGZvbnQgc2l6ZSBvZiB0ZXh0IGFyZWEgd2lkZ2V0c1xuY29uc3QgY2FsY3VsYXRlRm9udFNpemUgPSAocG9zaXRpb24sIGNvbnRhaW5lclNjYWxlLCBzaWdueW91cnNlbGYpID0+IHtcbiAgY29uc3QgZm9udCA9IHBvc2l0aW9uPy5vcHRpb25zPy5mb250U2l6ZSB8fCAxMjtcbiAgaWYgKCFzaWdueW91cnNlbGYgJiYgcG9zaXRpb24/LmlzTW9iaWxlICYmIHBvc2l0aW9uPy5zY2FsZSkge1xuICAgIHJldHVybiBmb250IC8gcG9zaXRpb24/LnNjYWxlIC8gY29udGFpbmVyU2NhbGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZvbnQgLyBjb250YWluZXJTY2FsZTtcbiAgfVxufTtcblxuY29uc3QgZ2V0V2lkZ2V0c0ZvbnRDb2xvciA9ICh0eXBlKSA9PiB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJyZWRcIjpcbiAgICAgIHJldHVybiByZ2IoMSwgMCwgMCk7XG4gICAgY2FzZSBcImJsYWNrXCI6XG4gICAgICByZXR1cm4gcmdiKDAsIDAsIDApO1xuICAgIGNhc2UgXCJibHVlXCI6XG4gICAgICByZXR1cm4gcmdiKDAsIDAsIDEpO1xuICAgIGNhc2UgXCJ5ZWxsb3dcIjpcbiAgICAgIHJldHVybiByZ2IoMC45LCAxLCAwKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHJnYigwLCAwLCAwKTtcbiAgfVxufTtcbi8vZnVuY3Rpb24gZm9yIGVtYmVkIG11bHRpcGxlIHNpZ25hdHVyZSB1c2luZyBwZGYtbGliXG5leHBvcnQgY29uc3QgbXVsdGlTaWduRW1iZWQgPSBhc3luYyAoXG4gIHdpZGdldHMsXG4gIHBkZkRvYyxcbiAgc2lnbnlvdXJzZWxmLFxuICBzY2FsZSxcbiAgcGRmT3JpZ2luYWxXSCxcbiAgY29udGFpbmVyV0hcbikgPT4ge1xuICAvLyBgZm9udEJ5dGVzYCBpcyB1c2VkIHRvIGVtYmVkIGN1c3RvbSBmb250IGluIHBkZlxuICBjb25zdCBmb250Qnl0ZXMgPSBhd2FpdCBmaWxlYXNieXRlcyhcbiAgICBcImh0dHBzOi8vY2RuLm9wZW5zaWdubGFicy5jb20vd2ViZm9udHMvdGltZXMudHRmXCJcbiAgKTtcbiAgcGRmRG9jLnJlZ2lzdGVyRm9udGtpdChmb250a2l0KTtcbiAgY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoZm9udEJ5dGVzLCB7IHN1YnNldDogdHJ1ZSB9KTtcbiAgZm9yIChsZXQgaXRlbSBvZiB3aWRnZXRzKSB7XG4gICAgY29uc3QgY29udGFpbmVyU2NhbGUgPSBnZXRDb250YWluZXJTY2FsZShcbiAgICAgIHBkZk9yaWdpbmFsV0gsXG4gICAgICBpdGVtPy5wYWdlTnVtYmVyLFxuICAgICAgY29udGFpbmVyV0hcbiAgICApO1xuICAgIGNvbnN0IHR5cGVFeGlzdCA9IGl0ZW0ucG9zLnNvbWUoKGRhdGEpID0+IGRhdGE/LnR5cGUpO1xuICAgIGxldCB1cGRhdGVJdGVtO1xuXG4gICAgaWYgKHR5cGVFeGlzdCkge1xuICAgICAgaWYgKHNpZ255b3Vyc2VsZikge1xuICAgICAgICB1cGRhdGVJdGVtID0gaXRlbS5wb3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGVJdGVtID0gaXRlbS5wb3MuZmlsdGVyKFxuICAgICAgICAgIChkYXRhKSA9PiBkYXRhPy5vcHRpb25zPy5zdGF0dXMgPT09IFwicmVxdWlyZWRcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVJdGVtID0gaXRlbS5wb3M7XG4gICAgfVxuICAgIGNvbnN0IHBhZ2VObyA9IGl0ZW0ucGFnZU51bWJlcjtcbiAgICBjb25zdCB3aWRnZXRzUG9zaXRpb25BcnIgPSB1cGRhdGVJdGVtO1xuICAgIGNvbnN0IHBhZ2VzID0gcGRmRG9jLmdldFBhZ2VzKCk7XG4gICAgY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKCk7XG4gICAgY29uc3QgcGFnZSA9IHBhZ2VzW3BhZ2VObyAtIDFdO1xuICAgIGNvbnN0IGltYWdlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgd2lkZ2V0c1Bvc2l0aW9uQXJyLm1hcChhc3luYyAodXJsKSA9PiB7XG4gICAgICAgIGxldCBzaWduVXJsID0gdXJsLlNpZ25VcmwgJiYgdXJsLlNpZ25Vcmw7XG4gICAgICAgIGlmIChzaWduVXJsKSB7XG4gICAgICAgICAgaWYgKHVybC5JbWFnZVR5cGUgPT09IFwiaW1hZ2UvcG5nXCIpIHtcbiAgICAgICAgICAgIC8vZnVuY3Rpb24gZm9yIGNvbnZlcnQgc2lnbmF0dXJlIHBuZyBiYXNlNjQgdXJsIHRvIGpwZWcgYmFzZTY0XG4gICAgICAgICAgICBjb25zdCBuZXdVcmwgPSBhd2FpdCBjb252ZXJ0UE5HdG9KUEVHKHNpZ25VcmwpO1xuICAgICAgICAgICAgc2lnblVybCA9IG5ld1VybDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goc2lnblVybCk7XG4gICAgICAgICAgcmV0dXJuIHJlcy5hcnJheUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB3aWRnZXRzUG9zaXRpb25BcnIuZm9yRWFjaChhc3luYyAocG9zaXRpb24sIGlkKSA9PiB7XG4gICAgICBsZXQgaW1nO1xuICAgICAgaWYgKFtcInNpZ25hdHVyZVwiLCBcInN0YW1wXCIsIFwiaW5pdGlhbHNcIiwgXCJpbWFnZVwiXS5pbmNsdWRlcyhwb3NpdGlvbi50eXBlKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHBvc2l0aW9uLkltYWdlVHlwZSAmJiBwb3NpdGlvbi5JbWFnZVR5cGUgPT09IFwiaW1hZ2UvcG5nXCIpIHx8XG4gICAgICAgICAgcG9zaXRpb24uSW1hZ2VUeXBlID09PSBcImltYWdlL2pwZWdcIlxuICAgICAgICApIHtcbiAgICAgICAgICBpbWcgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcoaW1hZ2VzW2lkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW1nID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKGltYWdlc1tpZF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFwb3NpdGlvbi50eXBlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAocG9zaXRpb24uSW1hZ2VUeXBlICYmIHBvc2l0aW9uLkltYWdlVHlwZSA9PT0gXCJpbWFnZS9wbmdcIikgfHxcbiAgICAgICAgICBwb3NpdGlvbi5JbWFnZVR5cGUgPT09IFwiaW1hZ2UvanBlZ1wiXG4gICAgICAgICkge1xuICAgICAgICAgIGltZyA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZyhpbWFnZXNbaWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbWcgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcoaW1hZ2VzW2lkXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCB3aWRnZXRXaWR0aCwgd2lkZ2V0SGVpZ2h0O1xuICAgICAgd2lkZ2V0V2lkdGggPSBwbGFjZWhvbGRlcldpZHRoKHBvc2l0aW9uKTtcbiAgICAgIHdpZGdldEhlaWdodCA9IHBsYWNlaG9sZGVySGVpZ2h0KHBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IHhQb3MgPSAocG9zaXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXplUG9zID0gcG9zaXRpb24ueFBvc2l0aW9uO1xuICAgICAgICAvL2ZpcnN0IHR3byBjb25kaXRpb24gaGFuZGxlIHRvIG9sZCBkYXRhIGFscmVhZHkgc2F2ZWQgZnJvbSBtb2JpbGUgdmlldyB3aGljaCBzY2FsZSBwb2ludCBkaWZmcmVudFxuICAgICAgICBpZiAoaXNNb2JpbGUgJiYgcG9zaXRpb24uaXNNb2JpbGUpIHtcbiAgICAgICAgICAvL2lmIHBvcy5pc01vYmlsZSBmYWxzZSAtLSBwbGFjZWhvbGRlciBzYXZlZCBmcm9tIGRlc2t0b3AgdmlldyB0aGVuIGhhbmRsZSBwb3NpdGlvbiBpbiBtb2JpbGUgdmlldyBkaXZpZGVkIGJ5IHNjYWxlXG4gICAgICAgICAgY29uc3QgeCA9IHJlc2l6ZVBvcyAqIChwb3NpdGlvbi5zY2FsZSAvIHNjYWxlKTtcbiAgICAgICAgICByZXR1cm4geCAqIHNjYWxlO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uLmlzTW9iaWxlICYmIHBvc2l0aW9uLnNjYWxlKSB7XG4gICAgICAgICAgY29uc3QgeCA9IHJlc2l6ZVBvcyAqIHBvc2l0aW9uLnNjYWxlO1xuICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXNpemVQb3M7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCB5UG9zID0gKHBvc2l0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZVBvcyA9IHBvc2l0aW9uLnlQb3NpdGlvbjtcblxuICAgICAgICBpZiAocG9zaXRpb24uaXNNb2JpbGUgJiYgcG9zaXRpb24uc2NhbGUpIHtcbiAgICAgICAgICBpZiAocG9zaXRpb24uSXNSZXNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IHkgPSByZXNpemVQb3MgKiBwb3NpdGlvbi5zY2FsZTtcbiAgICAgICAgICAgIHJldHVybiB5O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB5ID0gcmVzaXplUG9zICogcG9zaXRpb24uc2NhbGU7XG4gICAgICAgICAgICByZXR1cm4geTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNvbG9yID0gcG9zaXRpb24/Lm9wdGlvbnM/LmZvbnRDb2xvcjtcbiAgICAgIGNvbnN0IHVwZGF0ZUNvbG9ySW5SZ2IgPSBnZXRXaWRnZXRzRm9udENvbG9yKGNvbG9yKTtcbiAgICAgIGNvbnN0IGZvbnRTaXplID0gcGFyc2VJbnQocG9zaXRpb24/Lm9wdGlvbnM/LmZvbnRTaXplIHx8IDEzKTtcbiAgICAgIGNvbnN0IHdpZGdldFR5cGVFeGlzdCA9IFtcbiAgICAgICAgdGV4dFdpZGdldCxcbiAgICAgICAgdGV4dElucHV0V2lkZ2V0LFxuICAgICAgICBcIm5hbWVcIixcbiAgICAgICAgXCJjb21wYW55XCIsXG4gICAgICAgIFwiam9iIHRpdGxlXCIsXG4gICAgICAgIFwiZGF0ZVwiLFxuICAgICAgICBcImVtYWlsXCJcbiAgICAgIF0uaW5jbHVkZXMocG9zaXRpb24udHlwZSk7XG4gICAgICBpZiAocG9zaXRpb24udHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgIGxldCBjaGVja2JveEdhcEZyb21Ub3AsIGlzQ2hlY2s7XG4gICAgICAgIGxldCB5ID0geVBvcyhwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNGb250U2l6ZSA9IGZvbnRTaXplIHx8IDEzO1xuICAgICAgICBjb25zdCBjaGVja2JveFNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgY29uc3QgY2hlY2tib3hUZXh0R2FwRnJvbUxlZnQgPSBmb250U2l6ZSArIDUgfHwgMjI7XG4gICAgICAgIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8udmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwb3NpdGlvbj8ub3B0aW9ucz8udmFsdWVzLmZvckVhY2goKGl0ZW0sIGluZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tib3hSYW5kb21JZCA9IFwiY2hlY2tib3hcIiArIHJhbmRvbUlkKCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlICYmXG4gICAgICAgICAgICAgIHBvc2l0aW9uPy5vcHRpb25zPy5yZXNwb25zZT8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlzQ2hlY2sgPSBwb3NpdGlvbj8ub3B0aW9ucz8ucmVzcG9uc2U/LmluY2x1ZGVzKGluZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgaXNDaGVjayA9IHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWU/LmluY2x1ZGVzKGluZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94ID0gZm9ybS5jcmVhdGVDaGVja0JveChjaGVja2JveFJhbmRvbUlkKTtcblxuICAgICAgICAgICAgaWYgKGluZCA+IDApIHtcbiAgICAgICAgICAgICAgeSA9IHkgKyBjaGVja2JveEdhcEZyb21Ub3A7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGVja2JveEdhcEZyb21Ub3AgPSBmb250U2l6ZSArIDUgfHwgMjY7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghcG9zaXRpb24/Lm9wdGlvbnM/LmlzSGlkZUxhYmVsKSB7XG4gICAgICAgICAgICAgIC8vIGJlbG93IGxpbmUgb2YgY29kZSBpcyB1c2VkIHRvIGVtYmVkIGxhYmVsIHdpdGggcmFkaW8gYnV0dG9uIGluIHBkZlxuICAgICAgICAgICAgICBjb25zdCBvcHRpb25zUG9zaXRpb24gPSBjb21wZW5zYXRlUm90YXRpb24oXG4gICAgICAgICAgICAgICAgcGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlLFxuICAgICAgICAgICAgICAgIHhQb3MocG9zaXRpb24pICsgY2hlY2tib3hUZXh0R2FwRnJvbUxlZnQsXG4gICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgIHBhZ2UuZ2V0U2l6ZSgpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNGb250U2l6ZSxcbiAgICAgICAgICAgICAgICB1cGRhdGVDb2xvckluUmdiLFxuICAgICAgICAgICAgICAgIGZvbnQsXG4gICAgICAgICAgICAgICAgcGFnZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBwYWdlLmRyYXdUZXh0KGl0ZW0sIG9wdGlvbnNQb3NpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2hlY2tib3hPYmogPSB7XG4gICAgICAgICAgICAgIHg6IHhQb3MocG9zaXRpb24pLFxuICAgICAgICAgICAgICB5OiB5LFxuICAgICAgICAgICAgICB3aWR0aDogY2hlY2tib3hTaXplLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGNoZWNrYm94U2l6ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNoZWNrYm94T2JqID0gZ2V0V2lkZ2V0UG9zaXRpb24ocGFnZSwgY2hlY2tib3hPYmosIDEpO1xuICAgICAgICAgICAgY2hlY2tib3guYWRkVG9QYWdlKHBhZ2UsIGNoZWNrYm94T2JqKTtcblxuICAgICAgICAgICAgLy9hcHBsaWVkIHdoaWNoIGNoZWNrYm94IHNob3VsZCBiZSBjaGVja2VkXG4gICAgICAgICAgICBpZiAoaXNDaGVjaykge1xuICAgICAgICAgICAgICBjaGVja2JveC5jaGVjaygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2hlY2tib3gudW5jaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2tib3guZW5hYmxlUmVhZE9ubHkoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh3aWRnZXRUeXBlRXhpc3QpIHtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBjYWxjdWxhdGVGb250U2l6ZShcbiAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICBjb250YWluZXJTY2FsZSxcbiAgICAgICAgICBzaWdueW91cnNlbGZcbiAgICAgICAgKTtcbiAgICAgICAgcGFyc2VJbnQoZm9udFNpemUpO1xuICAgICAgICBsZXQgdGV4dENvbnRlbnQ7XG4gICAgICAgIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8ucmVzcG9uc2UpIHtcbiAgICAgICAgICB0ZXh0Q29udGVudCA9IHBvc2l0aW9uLm9wdGlvbnM/LnJlc3BvbnNlO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICB0ZXh0Q29udGVudCA9IHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZml4ZWRXaWR0aCA9IHdpZGdldFdpZHRoOyAvLyBTZXQgeW91ciBmaXhlZCB3aWR0aFxuICAgICAgICBjb25zdCBpc05ld09uRW50ZXJMaW5lRXhpc3QgPSB0ZXh0Q29udGVudC5pbmNsdWRlcyhcIlxcblwiKTtcblxuICAgICAgICAvLyBGdW5jdGlvbiB0byBicmVhayB0ZXh0IGludG8gbGluZXMgYmFzZWQgb24gdGhlIGZpeGVkIHdpZHRoXG4gICAgICAgIGNvbnN0IE5ld2JyZWFrVGV4dEludG9MaW5lcyA9ICh0ZXh0Q29udGVudCwgd2lkdGgpID0+IHtcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgICAgICAgIGxldCBjdXJyZW50TGluZSA9IFwiXCI7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHdvcmQgb2YgdGV4dENvbnRlbnQuc3BsaXQoXCIgXCIpKSB7XG4gICAgICAgICAgICAvL2dldCB0ZXh0IGxpbmUgd2lkdGhcbiAgICAgICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUoXG4gICAgICAgICAgICAgIGAke2N1cnJlbnRMaW5lfSAke3dvcmR9YCxcbiAgICAgICAgICAgICAgZm9udFNpemVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2NoZWNrIHRleHQgY29udGVudCBsaW5lIHdpZHRoIGlzIGxlc3Mgb3IgZXF1YWwgdG8gY29udGFpbmVyIHdpZHRoXG4gICAgICAgICAgICBpZiAobGluZVdpZHRoIDw9IHdpZHRoKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lICs9IGAgJHt3b3JkfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lLnRyaW0oKSk7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gYCR7d29yZH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lLnRyaW0oKSk7XG4gICAgICAgICAgcmV0dXJuIGxpbmVzO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEZ1bmN0aW9uIHRvIGJyZWFrIHRleHQgaW50byBsaW5lcyBiYXNlZCBvbiB3aGVuIHVzZXIgZ28gbmV4dCBsaW5lIG9uIHByZXNzIGVudGVyIGJ1dHRvblxuICAgICAgICBjb25zdCBicmVha1RleHRJbnRvTGluZXMgPSAodGV4dENvbnRlbnQsIHdpZHRoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbGluZXMgPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiB0ZXh0Q29udGVudC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgICAgICAgY29uc3QgbGluZVdpZHRoID0gZm9udC53aWR0aE9mVGV4dEF0U2l6ZShgJHt3b3JkfWAsIGZvbnRTaXplKTtcbiAgICAgICAgICAgIC8vY2hlY2tpbmcgc3RyaW5nIGxlbmd0aCB0byBjb250YWluZXIgd2lkdGhcbiAgICAgICAgICAgIC8vaWYgc3RyaW5nIGxlbmd0aCBpcyBsZXNzIHRoZW4gY29udGFpbmVyIHdpZHRoIGl0IG1lYW5zIHVzZXIgcHJlc3MgZW50ZXIgYnV0dG9uXG4gICAgICAgICAgICBpZiAobGluZVdpZHRoIDw9IHdpZHRoKSB7XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2god29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2Vsc2UgYWRqdXN0IHRleHQgY29udGVudCBhY2NvcmRpbmcgdG8gd2lkdGggYW5kIHNlbmQgaXQgaW4gbmV3IGxpbmVcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBuZXdMaW5lID0gTmV3YnJlYWtUZXh0SW50b0xpbmVzKHdvcmQsIHdpZHRoKTtcbiAgICAgICAgICAgICAgbGluZXMucHVzaCguLi5uZXdMaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy9jaGVjayBpZiB0ZXh0IGNvbnRlbnQgaGF2ZSBgXFxuYCBzdHJpbmcgaXQgbWVhbnMgdXNlciBwcmVzcyBlbnRlciB0byBnbyBuZXh0IGxpbmUgYW5kIGhhbmRsZSBjb25kaXRpb25cbiAgICAgICAgLy9lbHNlIGF1dG8gYWRqdXN0IHRleHQgY29udGVudCBhY2NvcmRpbmcgdG8gY29udGFpbmVyIHdpZHRoXG4gICAgICAgIGNvbnN0IGxpbmVzID0gaXNOZXdPbkVudGVyTGluZUV4aXN0XG4gICAgICAgICAgPyBicmVha1RleHRJbnRvTGluZXModGV4dENvbnRlbnQsIGZpeGVkV2lkdGgpXG4gICAgICAgICAgOiBOZXdicmVha1RleHRJbnRvTGluZXModGV4dENvbnRlbnQsIGZpeGVkV2lkdGgpO1xuICAgICAgICAvLyBTZXQgaW5pdGlhbCB5LWNvb3JkaW5hdGUgZm9yIHRoZSBmaXJzdCBsaW5lXG4gICAgICAgIGxldCB4ID0geFBvcyhwb3NpdGlvbik7XG4gICAgICAgIGxldCB5ID0geVBvcyhwb3NpdGlvbik7XG4gICAgICAgIC8vIEVtYmVkIGVhY2ggbGluZSBvbiB0aGUgcGFnZVxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0UG9zaXRpb24gPSBjb21wZW5zYXRlUm90YXRpb24oXG4gICAgICAgICAgICBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGUsXG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICBwYWdlLmdldFNpemUoKSxcbiAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgdXBkYXRlQ29sb3JJblJnYixcbiAgICAgICAgICAgIGZvbnQsXG4gICAgICAgICAgICBwYWdlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwYWdlLmRyYXdUZXh0KGxpbmUsIHRleHRQb3NpdGlvbik7XG4gICAgICAgICAgeSArPSAxODsgLy8gQWRqdXN0IHRoZSBsaW5lIGhlaWdodCBhcyBuZWVkZWRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbi50eXBlID09PSBcImRyb3Bkb3duXCIpIHtcbiAgICAgICAgY29uc3QgZm9udHNpemUgPSBwYXJzZUludChwb3NpdGlvbj8ub3B0aW9ucz8uZm9udFNpemUpIHx8IDEyO1xuXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duUmFuZG9tSWQgPSBcImRyb3Bkb3duXCIgKyByYW5kb21JZCgpO1xuICAgICAgICBjb25zdCBkcm9wZG93biA9IGZvcm0uY3JlYXRlRHJvcGRvd24oZHJvcGRvd25SYW5kb21JZCk7XG4gICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbnMocG9zaXRpb24/Lm9wdGlvbnM/LnZhbHVlcyk7XG4gICAgICAgIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8ucmVzcG9uc2UpIHtcbiAgICAgICAgICBkcm9wZG93bi5zZWxlY3QocG9zaXRpb24ub3B0aW9ucz8ucmVzcG9uc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICBkcm9wZG93bi5zZWxlY3QocG9zaXRpb24/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVmaW5lIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2Ugc3RyaW5nXG4gICAgICAgIC8vIEV4YW1wbGUgZm9ybWF0OiBgL0ZvbnROYW1lIEZvbnRTaXplIFRmIDAgZ2Agd2hlcmU6XG4gICAgICAgIC8vIC0gYC9Gb250TmFtZWAgaXMgdGhlIG5hbWUgb2YgdGhlIGZvbnQgKGUuZy4sIGAvSGVsdmAgZm9yIEhlbHZldGljYSlcbiAgICAgICAgLy8gLSBgRm9udFNpemVgIGlzIHRoZSBzaXplIHlvdSB3YW50IHRvIHNldCAoZS5nLiwgMTIpXG4gICAgICAgIC8vIC0gYFRmYCBzcGVjaWZpZXMgdGhlIGZvbnQgYW5kIHNpemVcbiAgICAgICAgLy8gLSBgMCBnYCBzZXRzIHRoZSB0ZXh0IGNvbG9yIHRvIGJsYWNrXG4gICAgICAgIGNvbnN0IGRlZmF1bHRBcHBlYXJhbmNlID0gYC9IZWx2ICR7Zm9udHNpemV9IFRmIDAgZ2A7XG4gICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIGZvciB0aGUgZHJvcGRvd24gZmllbGRcbiAgICAgICAgZHJvcGRvd24uYWNyb0ZpZWxkLnNldERlZmF1bHRBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlKTtcbiAgICAgICAgZHJvcGRvd24uc2V0Rm9udFNpemUoZm9udHNpemUpO1xuICAgICAgICBjb25zdCBkcm9wZG93bk9iaiA9IHtcbiAgICAgICAgICB4OiB4UG9zKHBvc2l0aW9uKSxcbiAgICAgICAgICB5OiB5UG9zKHBvc2l0aW9uKSxcbiAgICAgICAgICB3aWR0aDogd2lkZ2V0V2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiB3aWRnZXRIZWlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZHJvcGRvd25PcHRpb24gPSBnZXRXaWRnZXRQb3NpdGlvbihwYWdlLCBkcm9wZG93bk9iaiwgMSk7XG4gICAgICAgIGNvbnN0IGRyb3Bkb3duU2VsZWN0ZWQgPSB7IC4uLmRyb3Bkb3duT3B0aW9uLCBmb250OiBmb250IH07XG4gICAgICAgIGRyb3Bkb3duLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyhmb250KTtcbiAgICAgICAgZHJvcGRvd24uYWRkVG9QYWdlKHBhZ2UsIGRyb3Bkb3duU2VsZWN0ZWQpO1xuICAgICAgICBkcm9wZG93bi5lbmFibGVSZWFkT25seSgpO1xuICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbi50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCkge1xuICAgICAgICBjb25zdCByYWRpb1JhbmRvbUlkID0gXCJyYWRpb1wiICsgcmFuZG9tSWQoKTtcbiAgICAgICAgY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uY3JlYXRlUmFkaW9Hcm91cChyYWRpb1JhbmRvbUlkKTtcbiAgICAgICAgbGV0IHJhZGlvT3B0aW9uR2FwRnJvbVRvcDtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZvbnRTaXplID0gZm9udFNpemUgfHwgMTM7XG4gICAgICAgIGNvbnN0IHJhZGlvVGV4dEdhcEZyb21MZWZ0ID0gZm9udFNpemUgKyA1IHx8IDIwO1xuICAgICAgICBjb25zdCByYWRpb1NpemUgPSBmb250U2l6ZTtcbiAgICAgICAgbGV0IHkgPSB5UG9zKHBvc2l0aW9uKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy52YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHBvc2l0aW9uPy5vcHRpb25zPy52YWx1ZXMuZm9yRWFjaCgoaXRlbSwgaW5kKSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kID4gMCkge1xuICAgICAgICAgICAgICB5ID0geSArIHJhZGlvT3B0aW9uR2FwRnJvbVRvcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJhZGlvT3B0aW9uR2FwRnJvbVRvcCA9IGZvbnRTaXplICsgMTAgfHwgMjU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBvc2l0aW9uPy5vcHRpb25zPy5pc0hpZGVMYWJlbCkge1xuICAgICAgICAgICAgICAvLyBiZWxvdyBsaW5lIG9mIGNvZGUgaXMgdXNlZCB0byBlbWJlZCBsYWJlbCB3aXRoIHJhZGlvIGJ1dHRvbiBpbiBwZGZcblxuICAgICAgICAgICAgICBjb25zdCBvcHRpb25zUG9zaXRpb24gPSBjb21wZW5zYXRlUm90YXRpb24oXG4gICAgICAgICAgICAgICAgcGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlLFxuICAgICAgICAgICAgICAgIHhQb3MocG9zaXRpb24pICsgcmFkaW9UZXh0R2FwRnJvbUxlZnQsXG4gICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgIHBhZ2UuZ2V0U2l6ZSgpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNGb250U2l6ZSxcbiAgICAgICAgICAgICAgICB1cGRhdGVDb2xvckluUmdiLFxuICAgICAgICAgICAgICAgIGZvbnQsXG4gICAgICAgICAgICAgICAgcGFnZVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHBhZ2UuZHJhd1RleHQoaXRlbSwgb3B0aW9uc1Bvc2l0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByYWRpb09iaiA9IHtcbiAgICAgICAgICAgICAgeDogeFBvcyhwb3NpdGlvbiksXG4gICAgICAgICAgICAgIHk6IHksXG4gICAgICAgICAgICAgIHdpZHRoOiByYWRpb1NpemUsXG4gICAgICAgICAgICAgIGhlaWdodDogcmFkaW9TaXplXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByYWRpb09iaiA9IGdldFdpZGdldFBvc2l0aW9uKHBhZ2UsIHJhZGlvT2JqLCAxKTtcbiAgICAgICAgICAgIHJhZGlvR3JvdXAuYWRkT3B0aW9uVG9QYWdlKGl0ZW0sIHBhZ2UsIHJhZGlvT2JqKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlKSB7XG4gICAgICAgICAgcmFkaW9Hcm91cC5zZWxlY3QocG9zaXRpb24ub3B0aW9ucz8ucmVzcG9uc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICByYWRpb0dyb3VwLnNlbGVjdChwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByYWRpb0dyb3VwLmVuYWJsZVJlYWRPbmx5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSB7XG4gICAgICAgICAgeDogeFBvcyhwb3NpdGlvbiksXG4gICAgICAgICAgeTogeVBvcyhwb3NpdGlvbiksXG4gICAgICAgICAgd2lkdGg6IHdpZGdldFdpZHRoLFxuICAgICAgICAgIGhlaWdodDogd2lkZ2V0SGVpZ2h0XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaW1hZ2VPcHRpb25zID0gZ2V0V2lkZ2V0UG9zaXRpb24ocGFnZSwgc2lnbmF0dXJlLCAxKTtcbiAgICAgICAgcGFnZS5kcmF3SW1hZ2UoaW1nLCBpbWFnZU9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHBkZkJ5dGVzID0gYXdhaXQgcGRmRG9jLnNhdmVBc0Jhc2U2NCh7IHVzZU9iamVjdFN0cmVhbXM6IGZhbHNlIH0pO1xuICAvL2NvbnNvbGUubG9nKFwicGRmXCIsIHBkZkJ5dGVzKTtcbiAgcmV0dXJuIHBkZkJ5dGVzO1xufTtcblxuLy8gZnVuY3Rpb24gZm9yIHZhbGlkYXRpbmcgVVJMc1xuZXhwb3J0IGZ1bmN0aW9uIHVybFZhbGlkYXRvcih1cmwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBuZXdVcmwgPSBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIG5ld1VybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IG5ld1VybC5wcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vL2NhbGN1bGF0ZSBwbGFjZWhvbGRlciB3aWR0aCB0byBlbWJlZCBpbiBwZGZcbmV4cG9ydCBjb25zdCBwbGFjZWhvbGRlcldpZHRoID0gKHBvcykgPT4ge1xuICBjb25zdCBkZWZhdWx0V2lkdGggPSBkZWZhdWx0V2lkdGhIZWlnaHQocG9zLnR5cGUpLndpZHRoO1xuICBjb25zdCBwb3NXaWR0aCA9IHBvcy5XaWR0aCB8fCBkZWZhdWx0V2lkdGg7XG5cbiAgLy9jb25kaXRpb24gdG8gaGFuZGxlIG9sZCBkYXRhIHNhdmVkIGZyb20gbW9iaWxlIHZpZXcgdG8gZ2V0IHdpZHRoaFxuICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xuICAgIGlmIChwb3MuSXNSZXNpemUpIHtcbiAgICAgIHJldHVybiBwb3NXaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBvc1dpZHRoICogcG9zLnNjYWxlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcG9zV2lkdGg7XG4gIH1cbn07XG5cbi8vY2FsY3VsYXRlIHBsYWNlaG9sZGVyIGhlaWdodCB0byBlbWJlZCBpbiBwZGZcbmV4cG9ydCBjb25zdCBwbGFjZWhvbGRlckhlaWdodCA9IChwb3MpID0+IHtcbiAgY29uc3QgcG9zSGVpZ2h0ID0gcG9zLkhlaWdodDtcbiAgY29uc3QgZGVmYXVsdEhlaWdodCA9IGRlZmF1bHRXaWR0aEhlaWdodChwb3MudHlwZSkuaGVpZ2h0O1xuICBjb25zdCBwb3NVcGRhdGVIZWlnaHQgPSBwb3NIZWlnaHQgfHwgZGVmYXVsdEhlaWdodDtcblxuICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgb2xkIGRhdGEgc2F2ZWQgZnJvbSBtb2JpbGUgdmlldyB0byBnZXQgaGVpZ2h0XG4gIGlmIChwb3MuaXNNb2JpbGUgJiYgcG9zLnNjYWxlKSB7XG4gICAgaWYgKHBvcy5Jc1Jlc2l6ZSkge1xuICAgICAgcmV0dXJuIHBvc1VwZGF0ZUhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBvc1VwZGF0ZUhlaWdodCAqIHBvcy5zY2FsZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBvc1VwZGF0ZUhlaWdodDtcbiAgfVxufTtcblxuLy9mdW5jdGlvbiBmb3IgZ2V0dGluZyBjb250cmFjdHNfY29udGFjdGJvb2sgZGV0YWlsc1xuZXhwb3J0IGNvbnN0IGNvbnRhY3RCb29rID0gYXN5bmMgKG9iamVjdElkKSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF4aW9zXG4gICAgLmdldChcbiAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgICBcImJhc2VVcmxcIlxuICAgICAgKX1jbGFzc2VzL2NvbnRyYWN0c19Db250YWN0Ym9vaz93aGVyZT17XCJvYmplY3RJZFwiOlwiJHtvYmplY3RJZH1cIn1gLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcbiAgICAgICAgICBcIlgtUGFyc2UtU2Vzc2lvbi1Ub2tlblwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG4gICAgLnRoZW4oKExpc3RkYXRhKSA9PiB7XG4gICAgICBjb25zdCBqc29uID0gTGlzdGRhdGEuZGF0YTtcbiAgICAgIGNvbnN0IHJlcyA9IGpzb24ucmVzdWx0cztcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSlcblxuICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcIkVyciBpbiBjb250cmFjdHNfQ29udGFjdGJvb2sgY2xhc3MgXCIsIGVycik7XG4gICAgICByZXR1cm4gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCI7XG4gICAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vL2Z1bmN0aW9uIGZvciBnZXR0aW5nIGRvY3VtZW50IGRldGFpbHMgZnJvbSBjb250cmFjdF9Eb2N1bWVudHMgY2xhc3NcbmV4cG9ydCBjb25zdCBjb250cmFjdERvY3VtZW50ID0gYXN5bmMgKGRvY3VtZW50SWQpID0+IHtcbiAgY29uc3QgZGF0YSA9IHtcbiAgICBkb2NJZDogZG9jdW1lbnRJZFxuICB9O1xuICBjb25zdCBkb2N1bWVudERlYXRpbHMgPSBhd2FpdCBheGlvc1xuICAgIC5wb3N0KGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvZ2V0RG9jdW1lbnRgLCBkYXRhLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxuICAgICAgICBzZXNzaW9uVG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKChMaXN0ZGF0YSkgPT4ge1xuICAgICAgY29uc3QganNvbiA9IExpc3RkYXRhLmRhdGE7XG4gICAgICBsZXQgZGF0YSA9IFtdO1xuICAgICAgaWYgKGpzb24gJiYganNvbi5yZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICB9IGVsc2UgaWYgKGpzb24gJiYganNvbi5yZXN1bHQpIHtcbiAgICAgICAgZGF0YS5wdXNoKGpzb24ucmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJFcnIgaW4gZ2V0RG9jdW1lbnQgY2xvdWQgZnVuY3Rpb24gXCIsIGVycik7XG4gICAgICByZXR1cm4gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCI7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGRvY3VtZW50RGVhdGlscztcbn07XG5cbi8vZnVuY3Rpb24gZm9yIGFkZCBkZWZhdWx0IHNpZ25hdHVyZSBvciBpbWFnZSBmb3IgYWxsIHJlcXVlc3RlZCBsb2NhdGlvblxuZXhwb3J0IGNvbnN0IGFkZERlZmF1bHRTaWduYXR1cmVJbWcgPSAoeHlQb3N0aW9uLCBkZWZhdWx0U2lnbkltZykgPT4ge1xuICBsZXQgaW1nV0ggPSB7IHdpZHRoOiBcIlwiLCBoZWlnaHQ6IFwiXCIgfTtcbiAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gIGltZy5zcmMgPSBkZWZhdWx0U2lnbkltZztcbiAgaWYgKGltZy5jb21wbGV0ZSkge1xuICAgIGltZ1dIID0ge1xuICAgICAgd2lkdGg6IGltZy53aWR0aCxcbiAgICAgIGhlaWdodDogaW1nLmhlaWdodFxuICAgIH07XG4gIH1cblxuICBsZXQgeHlEZWZhdWx0UG9zID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeHlQb3N0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGdldElNR1dIO1xuICAgIGNvbnN0IGdldFhZZGF0YSA9IHh5UG9zdGlvbltpXS5wb3M7XG4gICAgY29uc3QgZ2V0UGFnZU5vID0geHlQb3N0aW9uW2ldLnBhZ2VOdW1iZXI7XG4gICAgY29uc3QgZ2V0UG9zRGF0YSA9IGdldFhZZGF0YTtcblxuICAgIGNvbnN0IGFkZFNpZ24gPSBnZXRQb3NEYXRhLm1hcCgocG9zaXRpb24pID0+IHtcbiAgICAgIGdldElNR1dIID0gY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8oaW1nV0gsIHBvc2l0aW9uKTtcbiAgICAgIGlmIChwb3NpdGlvbi50eXBlKSB7XG4gICAgICAgIGlmIChwb3NpdGlvbj8udHlwZSA9PT0gXCJzaWduYXR1cmVcIikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgICAgIFNpZ25Vcmw6IGRlZmF1bHRTaWduSW1nLFxuICAgICAgICAgICAgV2lkdGg6IGdldElNR1dILm5ld1dpZHRoLFxuICAgICAgICAgICAgSGVpZ2h0OiBnZXRJTUdXSC5uZXdIZWlnaHQsXG4gICAgICAgICAgICBJbWFnZVR5cGU6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAuLi5wb3NpdGlvbi5vcHRpb25zLFxuICAgICAgICAgICAgICByZXNwb25zZTogZGVmYXVsdFNpZ25JbWdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uICYmICFwb3NpdGlvbi5pc1N0YW1wKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucG9zaXRpb24sXG4gICAgICAgICAgU2lnblVybDogZGVmYXVsdFNpZ25JbWcsXG4gICAgICAgICAgV2lkdGg6IGdldElNR1dILm5ld1dpZHRoLFxuICAgICAgICAgIEhlaWdodDogZ2V0SU1HV0gubmV3SGVpZ2h0LFxuICAgICAgICAgIEltYWdlVHlwZTogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgLi4ucG9zaXRpb24ub3B0aW9ucyxcbiAgICAgICAgICAgIHJlc3BvbnNlOiBkZWZhdWx0U2lnbkltZ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9KTtcblxuICAgIGNvbnN0IG5ld1h5cG9zID0ge1xuICAgICAgcGFnZU51bWJlcjogZ2V0UGFnZU5vLFxuICAgICAgcG9zOiBhZGRTaWduXG4gICAgfTtcbiAgICB4eURlZmF1bHRQb3MucHVzaChuZXdYeXBvcyk7XG4gIH1cbiAgcmV0dXJuIHh5RGVmYXVsdFBvcztcbn07XG5cbi8vZnVuY3Rpb24gZm9yIGNyZWF0ZSBsaXN0IG9mIHllYXIgZm9yIGRhdGUgd2lkZ2V0XG5leHBvcnQgY29uc3QgcmFuZ2UgPSAoc3RhcnQsIGVuZCwgc3RlcCkgPT4ge1xuICBjb25zdCByYW5nZSA9IFtdO1xuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpICs9IHN0ZXApIHtcbiAgICByYW5nZS5wdXNoKGkpO1xuICB9XG4gIHJldHVybiByYW5nZTtcbn07XG4vL2Z1bmN0aW9uIGZvciBnZXQgbW9udGhcbmV4cG9ydCBjb25zdCBnZXRNb250aCA9IChkYXRlKSA9PiB7XG4gIGNvbnN0IG5ld01vbnRoID0gbmV3IERhdGUoZGF0ZSkuZ2V0TW9udGgoKTtcbiAgcmV0dXJuIG5ld01vbnRoO1xufTtcblxuLy9mdW5jdGlvbiBmb3IgZ2V0IHllYXJcbmV4cG9ydCBjb25zdCBnZXRZZWFyID0gKGRhdGUpID0+IHtcbiAgY29uc3QgbmV3WWVhciA9IG5ldyBEYXRlKGRhdGUpLmdldEZ1bGxZZWFyKCk7XG4gIHJldHVybiBuZXdZZWFyO1xufTtcblxuLy9mdW5jdGlvbiB0byBjcmVhdGUvY29weSB3aWRnZXQgbmV4dCB0byBhbHJlYWR5IGRyb3BwZWQgd2lkZ2V0XG5leHBvcnQgY29uc3QgaGFuZGxlQ29weU5leHRUb1dpZGdldCA9IChcbiAgcG9zaXRpb24sXG4gIHdpZGdldFR5cGUsXG4gIHh5UG9zdGlvbixcbiAgaW5kZXgsXG4gIHNldFh5UG9zdGlvbixcbiAgdXNlcklkXG4pID0+IHtcbiAgbGV0IGZpbHRlclNpZ25lclBvcztcbiAgLy9nZXQgcG9zaXRpb24gb2YgcHJldmlvdXMgd2lkZ2V0IGFuZCBjcmVhdGUgbmV3IHdpZGdldCBuZXh0IHRvIHRoYXQgd2lkZ2V0IG9uIHNhbWUgZGF0YSBleGNlcHRcbiAgLy8geFBvc2l0aW9uIGFuZCBrZXlcbiAgbGV0IG5ld3Bvc2l0aW9uID0gcG9zaXRpb247XG4gIGNvbnN0IGNhbGN1bGF0ZVhQb3NpdGlvbiA9XG4gICAgcGFyc2VJbnQocG9zaXRpb24ueFBvc2l0aW9uKSArXG4gICAgZGVmYXVsdFdpZHRoSGVpZ2h0KHdpZGdldFR5cGUpLndpZHRoICtcbiAgICByZXNpemVCb3JkZXJFeHRyYVdpZHRoKCk7XG4gIGNvbnN0IG5ld0lkID0gcmFuZG9tSWQoKTtcbiAgbmV3cG9zaXRpb24gPSB7IC4uLm5ld3Bvc2l0aW9uLCB4UG9zaXRpb246IGNhbGN1bGF0ZVhQb3NpdGlvbiwga2V5OiBuZXdJZCB9O1xuICAvL2lmIGNvbmRpdGlvbiB0byBjcmVhdGUgd2lkZ2V0IGluIHJlcXVlc3Qtc2lnbiBmbG93XG4gIGlmICh1c2VySWQpIHtcbiAgICBmaWx0ZXJTaWduZXJQb3MgPSB4eVBvc3Rpb24uZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSB1c2VySWQpO1xuICAgIGNvbnN0IGdldFBsYWNlSG9sZGVyID0gZmlsdGVyU2lnbmVyUG9zICYmIGZpbHRlclNpZ25lclBvc1swXT8ucGxhY2VIb2xkZXI7XG4gICAgY29uc3QgZ2V0UGFnZU51bWVyID0gZ2V0UGxhY2VIb2xkZXI/LmZpbHRlcihcbiAgICAgIChkYXRhKSA9PiBkYXRhLnBhZ2VOdW1iZXIgPT09IGluZGV4XG4gICAgKTtcbiAgICBjb25zdCBnZXRYWWRhdGEgPSBnZXRQYWdlTnVtZXIgJiYgZ2V0UGFnZU51bWVyWzBdPy5wb3M7XG4gICAgZ2V0WFlkYXRhLnB1c2gobmV3cG9zaXRpb24pO1xuICAgIGlmIChnZXRQYWdlTnVtZXIgJiYgZ2V0UGFnZU51bWVyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25Qb3MgPSBnZXRQbGFjZUhvbGRlci5tYXAoKG9iaikgPT4ge1xuICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IGluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IGdldFhZZGF0YSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmV3VXBkYXRlU2lnbmVyID0geHlQb3N0aW9uLm1hcCgob2JqKSA9PiB7XG4gICAgICAgIGlmIChvYmouSWQgPT09IHVzZXJJZCkge1xuICAgICAgICAgIHJldHVybiB7IC4uLm9iaiwgcGxhY2VIb2xkZXI6IG5ld1VwZGF0ZVNpZ25Qb3MgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSk7XG5cbiAgICAgIHNldFh5UG9zdGlvbihuZXdVcGRhdGVTaWduZXIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XT8ucG9zIHx8IFtdO1xuICAgIGdldFhZZGF0YS5wdXNoKG5ld3Bvc2l0aW9uKTtcbiAgICBjb25zdCB1cGRhdGVQbGFjZWhvbGRlciA9IHh5UG9zdGlvbi5tYXAoKG9iaiwgaW5kKSA9PiB7XG4gICAgICBpZiAoaW5kID09PSBpbmRleCkge1xuICAgICAgICByZXR1cm4geyAuLi5vYmosIHBvczogZ2V0WFlkYXRhIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0pO1xuXG4gICAgc2V0WHlQb3N0aW9uKHVwZGF0ZVBsYWNlaG9sZGVyKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVOYW1lID0gKGZpbGVVcmwpID0+IHtcbiAgaWYgKGZpbGVVcmwpIHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGZpbGVVcmwpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdXJsLnBhdGhuYW1lLnN1YnN0cmluZyh1cmwucGF0aG5hbWUuaW5kZXhPZihcIl9cIikgKyAxKTtcbiAgICByZXR1cm4gZmlsZW5hbWUgfHwgXCJcIjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxufTtcblxuLy9mZXRjaCB0ZW5hbnQgYXBwIGxvZ28gZnJvbSBgcGFydG5lcnNfVGVuYW50YCBjbGFzcyBieSBkb21haW4gbmFtZVxuZXhwb3J0IGNvbnN0IGdldEFwcExvZ28gPSBhc3luYyAoKSA9PiB7XG4gIGlmICh3aW5kb3cubG9jYXRpb24uaG9zdCA9PT0gXCJhcHAub3BlbnNpZ25sYWJzLmNvbVwiKSB7XG4gICAgcmV0dXJuIHsgbG9nbzogYXBwSW5mby5hcHBsb2dvLCB1c2VyOiBcImV4aXN0XCIgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkb21haW4gPSB3aW5kb3cubG9jYXRpb24uaG9zdDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGVuYW50ID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwiZ2V0bG9nb2J5ZG9tYWluXCIsIHtcbiAgICAgICAgZG9tYWluOiBkb21haW5cbiAgICAgIH0pO1xuICAgICAgaWYgKHRlbmFudCkge1xuICAgICAgICByZXR1cm4geyBsb2dvOiB0ZW5hbnQ/LmxvZ28sIHVzZXI6IHRlbmFudD8udXNlciB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gZ2V0bG9nbyBcIiwgZXJyKTtcbiAgICAgIHJldHVybiB7IGxvZ286IGFwcEluZm8uYXBwbG9nbywgdXNlcjogXCJleGlzdFwiIH07XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGVuYW50RGV0YWlscyA9IGFzeW5jIChvYmplY3RJZCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHRlbmFudENyZWRpdHNRdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShcInBhcnRuZXJzX1RlbmFudFwiKTtcbiAgICB0ZW5hbnRDcmVkaXRzUXVlcnkuZXF1YWxUbyhcIlVzZXJJZFwiLCB7XG4gICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxuICAgICAgY2xhc3NOYW1lOiBcIl9Vc2VyXCIsXG4gICAgICBvYmplY3RJZDogb2JqZWN0SWRcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0ZW5hbnRDcmVkaXRzUXVlcnkuZmlyc3QoKTtcbiAgICBpZiAocmVzKSB7XG4gICAgICBjb25zdCB1cGRhdGVSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlcztcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gXCJ1c2VyIGRvZXMgbm90IGV4aXN0IVwiO1xuICB9XG59O1xuXG4vL2Z1bmN0aW9uIHRvIGNvbnZlcnQgdmFyaWFibGUgc3RyaW5nIG5hbWUgdG8gdmFyaWFibGUgdmFsdWUgb2YgZW1haWwgYm9keSBhbmQgc3ViamVjdFxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VNYWlsVmFyaWJsZXMoc3ViamVjdCwgYm9keSwgdmFyaWFibGVzKSB7XG4gIGxldCByZXBsYWNlZFN1YmplY3QgPSBzdWJqZWN0O1xuICBsZXQgcmVwbGFjZWRCb2R5ID0gYm9keTtcblxuICBmb3IgKGNvbnN0IHZhcmlhYmxlIGluIHZhcmlhYmxlcykge1xuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChge3ske3ZhcmlhYmxlfX19YCwgXCJnXCIpO1xuICAgIGlmIChzdWJqZWN0KSB7XG4gICAgICByZXBsYWNlZFN1YmplY3QgPSByZXBsYWNlZFN1YmplY3QucmVwbGFjZShyZWdleCwgdmFyaWFibGVzW3ZhcmlhYmxlXSk7XG4gICAgfVxuICAgIGlmIChib2R5KSB7XG4gICAgICByZXBsYWNlZEJvZHkgPSByZXBsYWNlZEJvZHkucmVwbGFjZShyZWdleCwgdmFyaWFibGVzW3ZhcmlhYmxlXSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHN1YmplY3Q6IHJlcGxhY2VkU3ViamVjdCxcbiAgICBib2R5OiByZXBsYWNlZEJvZHlcbiAgfTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGNvcHl0b0RhdGEgPSAodXJsKSA9PiB7XG4gIC8vIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpO1xuICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCkge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHVybCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBuYXZpZ2F0b3IuY2xpcGJvYXJkXG4gICAgY29uc3QgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgdGV4dEFyZWEudmFsdWUgPSB1cmw7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0QXJlYSk7XG4gICAgdGV4dEFyZWEuc2VsZWN0KCk7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjb3B5XCIpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydFBkZkFycmF5QnVmZmVyID0gYXN5bmMgKHVybCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAvLyBDaGVjayBpZiB0aGUgcmVzcG9uc2Ugd2FzIHN1Y2Nlc3NmdWwgKHN0YXR1cyAyMDApXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuIFwiRXJyb3JcIjtcbiAgICB9XG4gICAgLy8gQ29udmVydCB0aGUgcmVzcG9uc2UgdG8gQXJyYXlCdWZmZXJcbiAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gICAgcmV0dXJuIGFycmF5QnVmZmVyO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBkYXRhOlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIFwiRXJyb3JcIjtcbiAgfVxufTtcbi8vYGhhbmRsZVNlbmRPVFBgIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBvdHAgb24gdXNlcidzIGVtYWlsIHVzaW5nIGBTZW5kT1RQTWFpbFYxYCBjbG91ZCBmdW5jdGlvblxuZXhwb3J0IGNvbnN0IGhhbmRsZVNlbmRPVFAgPSBhc3luYyAoZW1haWwpID0+IHtcbiAgdHJ5IHtcbiAgICBsZXQgdXJsID0gYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfWZ1bmN0aW9ucy9TZW5kT1RQTWFpbFYxYDtcbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpXG4gICAgfTtcbiAgICBjb25zdCBib2R5ID0geyBlbWFpbDogZW1haWwgfTtcbiAgICBhd2FpdCBheGlvcy5wb3N0KHVybCwgYm9keSwgeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFsZXJ0KGVycm9yLm1lc3NhZ2UpO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGZldGNoVXJsID0gYXN5bmMgKHVybCwgcGRmTmFtZSkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBva1wiKTtcbiAgICB9XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcbiAgICBzYXZlQXMoYmxvYiwgYCR7c2FuaXRpemVGaWxlTmFtZShwZGZOYW1lKX1fc2lnbmVkX2J5X09wZW5TaWdu4oSiLnBkZmApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGFsZXJ0KFwic29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCIpO1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkb3dubG9hZGluZyB0aGUgZmlsZTpcIiwgZXJyb3IpO1xuICB9XG59O1xuLy9oYW5kbGUgZG93bmxvYWQgc2lnbmVkIHBkZlxuZXhwb3J0IGNvbnN0IGhhbmRsZURvd25sb2FkUGRmID0gYXN5bmMgKFxuICBwZGZEZXRhaWxzLFxuICBwZGZVcmwsXG4gIHNldElzRG93bmxvYWRpbmdcbikgPT4ge1xuICBjb25zdCBwZGZOYW1lID0gcGRmRGV0YWlsc1swXSAmJiBwZGZEZXRhaWxzWzBdLk5hbWU7XG4gIHNldElzRG93bmxvYWRpbmcoXCJwZGZcIik7XG4gIHRyeSB7XG4gICAgLy8gY29uc3QgdXJsID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwiZ2V0c2lnbmVkdXJsXCIsIHsgdXJsOiBwZGZVcmwgfSk7XG4gICAgY29uc3QgYXhpb3NSZXMgPSBhd2FpdCBheGlvcy5wb3N0KFxuICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfS9mdW5jdGlvbnMvZ2V0c2lnbmVkdXJsYCxcbiAgICAgIHsgdXJsOiBwZGZVcmwgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiY29udGVudC10eXBlXCI6IFwiQXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgICBjb25zdCB1cmwgPSBheGlvc1Jlcy5kYXRhLnJlc3VsdDtcbiAgICBhd2FpdCBmZXRjaFVybCh1cmwsIHBkZk5hbWUpO1xuICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGdldHNpZ25lZHVybFwiLCBlcnIpO1xuICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XG4gICAgYWxlcnQoXCJzb21ldGhpbmcgd2VudCB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIik7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzYW5pdGl6ZUZpbGVOYW1lID0gKHBkZk5hbWUpID0+IHtcbiAgLy8gUmVwbGFjZSBzcGFjZXMgd2l0aCB1bmRlcnNjb3JlXG4gIHJldHVybiBwZGZOYW1lLnJlcGxhY2UoLyAvZywgXCJfXCIpO1xufTtcbi8vZnVuY3Rpb24gZm9yIHByaW50IGRpZ2l0YWwgc2lnbiBwZGZcbmV4cG9ydCBjb25zdCBoYW5kbGVUb1ByaW50ID0gYXN5bmMgKGV2ZW50LCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcpID0+IHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgc2V0SXNEb3dubG9hZGluZyhcInBkZlwiKTtcbiAgdHJ5IHtcbiAgICAvLyBjb25zdCB1cmwgPSBhd2FpdCBQYXJzZS5DbG91ZC5ydW4oXCJnZXRzaWduZWR1cmxcIiwgeyB1cmw6IHBkZlVybCB9KTtcbiAgICAvL2Bsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIilgIGlzIGFsc28gdXNlIGluIHB1YmxpYy1wcm9maWxlIGZsb3cgZm9yIHB1YmxpYy1zaWduXG4gICAgLy9pZiB3ZSBnaXZlIHRoaXMgYGFwcEluZm8uYmFzZVVybGAgYXMgYSBiYXNlIHVybCB0aGVuIGluIHB1YmxpYy1wcm9maWxlIGl0IHdpbGwgY3JlYXRlIGJhc2UgdXJsIG9mIGl0J3Mgd2luZG93LmxvY2F0aW9uLm9yaWdpbiBleC0gb3BlbnNpZ24ubWUgd2hpY2ggaXMgbm90IGJhc2UgdXJsXG4gICAgY29uc3QgYXhpb3NSZXMgPSBhd2FpdCBheGlvcy5wb3N0KFxuICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfS9mdW5jdGlvbnMvZ2V0c2lnbmVkdXJsYCxcbiAgICAgIHsgdXJsOiBwZGZVcmwgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiY29udGVudC10eXBlXCI6IFwiQXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXG4gICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgICBjb25zdCB1cmwgPSBheGlvc1Jlcy5kYXRhLnJlc3VsdDtcbiAgICBjb25zdCBwZGYgPSBhd2FpdCBnZXRCYXNlNjRGcm9tVXJsKHVybCk7XG4gICAgY29uc3QgaXNBbmRyb2lkRGV2aWNlID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKTtcbiAgICBjb25zdCBpc0FwcGxlRGV2aWNlID1cbiAgICAgICgvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pIHx8XG4gICAgICAgIChuYXZpZ2F0b3IucGxhdGZvcm0gPT09IFwiTWFjSW50ZWxcIiAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKSkgJiZcbiAgICAgICF3aW5kb3cuTVNTdHJlYW07XG4gICAgaWYgKGlzQW5kcm9pZERldmljZSB8fCBpc0FwcGxlRGV2aWNlKSB7XG4gICAgICBjb25zdCBieXRlQXJyYXkgPSBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIGF0b2IocGRmKVxuICAgICAgICAgIC5zcGxpdChcIlwiKVxuICAgICAgICAgIC5tYXAoKGNoYXIpID0+IGNoYXIuY2hhckNvZGVBdCgwKSlcbiAgICAgICk7XG4gICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J5dGVBcnJheV0sIHsgdHlwZTogXCJhcHBsaWNhdGlvbi9wZGZcIiB9KTtcbiAgICAgIGNvbnN0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgd2luZG93Lm9wZW4oYmxvYlVybCwgXCJfYmxhbmtcIik7XG4gICAgICBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmludE1vZHVsZSh7IHByaW50YWJsZTogcGRmLCB0eXBlOiBcInBkZlwiLCBiYXNlNjQ6IHRydWUgfSk7XG4gICAgICBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc2V0SXNEb3dubG9hZGluZyhcIlwiKTtcbiAgICBjb25zb2xlLmxvZyhcImVyciBpbiBnZXRzaWduZWR1cmxcIiwgZXJyKTtcbiAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcbiAgfVxufTtcblxuLy9oYW5kbGUgZG93bmxvYWQgc2lnbmVkIHBkZlxuZXhwb3J0IGNvbnN0IGhhbmRsZURvd25sb2FkQ2VydGlmaWNhdGUgPSBhc3luYyAoXG4gIHBkZkRldGFpbHMsXG4gIHNldElzRG93bmxvYWRpbmdcbikgPT4ge1xuICBpZiAocGRmRGV0YWlscz8ubGVuZ3RoID4gMCAmJiBwZGZEZXRhaWxzWzBdPy5DZXJ0aWZpY2F0ZVVybCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmZXRjaChwZGZEZXRhaWxzWzBdICYmIHBkZkRldGFpbHNbMF0/LkNlcnRpZmljYXRlVXJsKTtcbiAgICAgIGNvbnN0IGNlcnRpZmljYXRlVXJsID0gcGRmRGV0YWlsc1swXSAmJiBwZGZEZXRhaWxzWzBdPy5DZXJ0aWZpY2F0ZVVybDtcbiAgICAgIHNhdmVBcyhjZXJ0aWZpY2F0ZVVybCwgYENlcnRpZmljYXRlX3NpZ25lZF9ieV9PcGVuU2lnbuKEoi5wZGZgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGRvd25sb2FkIGluIGNlcnRpZmljYXRlXCIsIGVycik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHNldElzRG93bmxvYWRpbmcoXCJjZXJ0aWZpY2F0ZVwiKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgZG9jSWQ6IHBkZkRldGFpbHNbMF0/Lm9iamVjdElkXG4gICAgICB9O1xuICAgICAgY29uc3QgZG9jRGV0YWlscyA9IGF3YWl0IGF4aW9zLnBvc3QoXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvZ2V0RG9jdW1lbnRgLFxuICAgICAgICBkYXRhLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxuICAgICAgICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKGRvY0RldGFpbHMuZGF0YSAmJiBkb2NEZXRhaWxzLmRhdGEucmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IGRvYyA9IGRvY0RldGFpbHMuZGF0YS5yZXN1bHQ7XG4gICAgICAgIGlmIChkb2M/LkNlcnRpZmljYXRlVXJsKSB7XG4gICAgICAgICAgYXdhaXQgZmV0Y2goZG9jPy5DZXJ0aWZpY2F0ZVVybCk7XG4gICAgICAgICAgY29uc3QgY2VydGlmaWNhdGVVcmwgPSBkb2M/LkNlcnRpZmljYXRlVXJsO1xuICAgICAgICAgIHNhdmVBcyhjZXJ0aWZpY2F0ZVVybCwgYENlcnRpZmljYXRlX3NpZ25lZF9ieV9PcGVuU2lnbuKEoi5wZGZgKTtcbiAgICAgICAgICBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldElzRG93bmxvYWRpbmcoXCJjZXJ0aWZpY2F0ZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gZG93bmxvYWQgaW4gY2VydGlmaWNhdGVcIiwgZXJyKTtcbiAgICAgIGFsZXJ0KFwic29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCIpO1xuICAgIH1cbiAgfVxufTtcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQ29udGFjdCh2YWx1ZSkge1xuICB0cnkge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gUGFyc2UuVXNlci5jdXJyZW50KCk7XG4gICAgY29uc3QgY29udGFjdGJvb2sgPSBuZXcgUGFyc2UuUXVlcnkoXCJjb250cmFjdHNfQ29udGFjdGJvb2tcIik7XG4gICAgY29udGFjdGJvb2suZXF1YWxUbyhcbiAgICAgIFwiQ3JlYXRlZEJ5XCIsXG4gICAgICBQYXJzZS5Vc2VyLmNyZWF0ZVdpdGhvdXREYXRhKGN1cnJlbnRVc2VyLmlkKVxuICAgICk7XG4gICAgY29udGFjdGJvb2subm90RXF1YWxUbyhcIklzRGVsZXRlZFwiLCB0cnVlKTtcbiAgICBjb250YWN0Ym9vay5tYXRjaGVzKFwiRW1haWxcIiwgbmV3IFJlZ0V4cCh2YWx1ZSwgXCJpXCIpKTtcblxuICAgIGNvbnN0IGNvbnRhY3RSZXMgPSBhd2FpdCBjb250YWN0Ym9vay5maW5kKCk7XG4gICAgaWYgKGNvbnRhY3RSZXMpIHtcbiAgICAgIGNvbnN0IHJlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29udGFjdFJlcykpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIHN1Z2dlc3Rpb25zOlwiLCBlcnJvcik7XG4gIH1cbn1cbi8vIGBjb21wZW5zYXRlUm90YXRpb25gIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHggYW5kIHkgcG9zaXRpb24gb2Ygd2lkZ2V0IG9uIHBvcnRhaXQsIGxhbmRzY2FwZSBwZGYgZm9yIHBkZi1saWJcbmZ1bmN0aW9uIGNvbXBlbnNhdGVSb3RhdGlvbihcbiAgcGFnZVJvdGF0aW9uLFxuICB4LFxuICB5LFxuICBzY2FsZSxcbiAgZGltZW5zaW9ucyxcbiAgZm9udFNpemUsXG4gIHVwZGF0ZUNvbG9ySW5SZ2IsXG4gIGZvbnQsXG4gIHBhZ2Vcbikge1xuICAvLyBFbnN1cmUgcGFnZVJvdGF0aW9uIGlzIGJldHdlZW4gMCBhbmQgMzYwIGRlZ3JlZXNcbiAgcGFnZVJvdGF0aW9uID0gKChwYWdlUm90YXRpb24gJSAzNjApICsgMzYwKSAlIDM2MDtcbiAgbGV0IHJvdGF0aW9uUmFkcyA9IChwYWdlUm90YXRpb24gKiBNYXRoLlBJKSAvIDE4MDtcblxuICAvLyBDb29yZGluYXRlcyBhcmUgZnJvbSBib3R0b20tbGVmdFxuICBsZXQgY29vcmRzRnJvbUJvdHRvbUxlZnQgPSB7IHg6IHggLyBzY2FsZSB9O1xuICBpZiAocGFnZVJvdGF0aW9uID09PSA5MCB8fCBwYWdlUm90YXRpb24gPT09IDI3MCkge1xuICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgPSBkaW1lbnNpb25zLndpZHRoIC0gKHkgKyBmb250U2l6ZSkgLyBzY2FsZTtcbiAgfSBlbHNlIHtcbiAgICBjb29yZHNGcm9tQm90dG9tTGVmdC55ID0gZGltZW5zaW9ucy5oZWlnaHQgLSAoeSArIGZvbnRTaXplKSAvIHNjYWxlO1xuICB9XG5cbiAgbGV0IGRyYXdYID0gbnVsbDtcbiAgbGV0IGRyYXdZID0gbnVsbDtcblxuICBpZiAocGFnZVJvdGF0aW9uID09PSA5MCkge1xuICAgIGRyYXdYID1cbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpIC1cbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLnNpbihyb3RhdGlvblJhZHMpICtcbiAgICAgIGRpbWVuc2lvbnMud2lkdGg7XG4gICAgZHJhd1kgPVxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueCAqIE1hdGguc2luKHJvdGF0aW9uUmFkcykgK1xuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguY29zKHJvdGF0aW9uUmFkcyk7XG4gIH0gZWxzZSBpZiAocGFnZVJvdGF0aW9uID09PSAxODApIHtcbiAgICBkcmF3WCA9XG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC54ICogTWF0aC5jb3Mocm90YXRpb25SYWRzKSAtXG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC55ICogTWF0aC5zaW4ocm90YXRpb25SYWRzKSArXG4gICAgICBkaW1lbnNpb25zLndpZHRoO1xuICAgIGRyYXdZID1cbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLnNpbihyb3RhdGlvblJhZHMpICtcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpICtcbiAgICAgIGRpbWVuc2lvbnMuaGVpZ2h0O1xuICB9IGVsc2UgaWYgKHBhZ2VSb3RhdGlvbiA9PT0gMjcwKSB7XG4gICAgZHJhd1ggPVxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueCAqIE1hdGguY29zKHJvdGF0aW9uUmFkcykgLVxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguc2luKHJvdGF0aW9uUmFkcyk7XG4gICAgZHJhd1kgPVxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueCAqIE1hdGguc2luKHJvdGF0aW9uUmFkcykgK1xuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguY29zKHJvdGF0aW9uUmFkcykgK1xuICAgICAgZGltZW5zaW9ucy5oZWlnaHQ7XG4gIH0gZWxzZSBpZiAocGFnZVJvdGF0aW9uID09PSAwIHx8IHBhZ2VSb3RhdGlvbiA9PT0gMzYwKSB7XG4gICAgLy8gTm8gcm90YXRpb24gb3IgZnVsbCByb3RhdGlvblxuICAgIGRyYXdYID0gY29vcmRzRnJvbUJvdHRvbUxlZnQueDtcbiAgICBkcmF3WSA9IGNvb3Jkc0Zyb21Cb3R0b21MZWZ0Lnk7XG4gIH1cbiAgaWYgKGZvbnQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogZHJhd1gsXG4gICAgICB5OiBkcmF3WSxcbiAgICAgIGZvbnQsXG4gICAgICBjb2xvcjogdXBkYXRlQ29sb3JJblJnYixcbiAgICAgIHNpemU6IGZvbnRTaXplLFxuICAgICAgcm90YXRlOiBwYWdlLmdldFJvdGF0aW9uKClcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IHg6IGRyYXdYLCB5OiBkcmF3WSB9O1xuICB9XG59XG5cbi8vIGBnZXRXaWRnZXRQb3NpdGlvbmAgaXMgdXNlZCB0byBjYWx1bGNhdGUgcG9zaXRpb24gb2YgaW1hZ2UgdHlwZSB3aWRnZXQgbGlrZSB4LCB5LCB3aWR0aCwgaGVpZ2h0IGZvciBwZGYtbGliXG5mdW5jdGlvbiBnZXRXaWRnZXRQb3NpdGlvbihwYWdlLCBpbWFnZSwgc2l6ZVJhdGlvKSB7XG4gIGxldCBwYWdlV2lkdGg7XG4gIC8vIHBhZ2VIZWlnaHQ7XG4gIGlmIChbOTAsIDI3MF0uaW5jbHVkZXMocGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlKSkge1xuICAgIHBhZ2VXaWR0aCA9IHBhZ2UuZ2V0SGVpZ2h0KCk7XG4gIH0gZWxzZSB7XG4gICAgcGFnZVdpZHRoID0gcGFnZS5nZXRXaWR0aCgpO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBpZiAoIWltYWdlPy5oYXNPd25Qcm9wZXJ0eShcInZwV2lkdGhcIikpIHtcbiAgICBpbWFnZVtcInZwV2lkdGhcIl0gPSBwYWdlV2lkdGg7XG4gIH1cblxuICBjb25zdCBwYWdlUmF0aW8gPSBwYWdlV2lkdGggLyAoaW1hZ2UudnBXaWR0aCAqIHNpemVSYXRpbyk7XG4gIGNvbnN0IGltYWdlV2lkdGggPSBpbWFnZS53aWR0aCAqIHNpemVSYXRpbyAqIHBhZ2VSYXRpbztcbiAgY29uc3QgaW1hZ2VIZWlnaHQgPSBpbWFnZS5oZWlnaHQgKiBzaXplUmF0aW8gKiBwYWdlUmF0aW87XG4gIGNvbnN0IGltYWdlWCA9IGltYWdlLnggKiBzaXplUmF0aW8gKiBwYWdlUmF0aW87XG4gIGNvbnN0IGltYWdlWUZyb21Ub3AgPSBpbWFnZS55ICogc2l6ZVJhdGlvICogcGFnZVJhdGlvO1xuXG4gIGNvbnN0IGNvcnJlY3Rpb24gPSBjb21wZW5zYXRlUm90YXRpb24oXG4gICAgcGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlLFxuICAgIGltYWdlWCxcbiAgICBpbWFnZVlGcm9tVG9wLFxuICAgIDEsXG4gICAgcGFnZS5nZXRTaXplKCksXG4gICAgaW1hZ2VIZWlnaHRcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBpbWFnZVdpZHRoLFxuICAgIGhlaWdodDogaW1hZ2VIZWlnaHQsXG4gICAgeDogY29ycmVjdGlvbi54LFxuICAgIHk6IGNvcnJlY3Rpb24ueSxcbiAgICByb3RhdGU6IHBhZ2UuZ2V0Um90YXRpb24oKVxuICB9O1xufVxuLy9mdW5jdGlvbiB0byB1c2UgY2FsY3VsYXRlIHBkZiByZW5kZXJpbmcgc2NhbGUgaW4gdGhlIGNvbnRhaW5lclxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lclNjYWxlID0gKHBkZk9yaWdpbmFsV0gsIHBhZ2VOdW1iZXIsIGNvbnRhaW5lcldIKSA9PiB7XG4gIGNvbnN0IGdldFBkZlBhZ2VXaWR0aCA9IHBkZk9yaWdpbmFsV0guZmluZChcbiAgICAoZGF0YSkgPT4gZGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyXG4gICk7XG4gIGNvbnN0IGNvbnRhaW5lclNjYWxlID0gY29udGFpbmVyV0g/LndpZHRoIC8gZ2V0UGRmUGFnZVdpZHRoPy53aWR0aCB8fCAxO1xuICByZXR1cm4gY29udGFpbmVyU2NhbGU7XG59O1xuXG4vL2Z1bmN0aW9uIHRvIGdldCBjdXJyZW50IGxhZ3VhZ2UgYW5kIHNldCBpdCBpbiBsb2NhbFxuZXhwb3J0IGNvbnN0IHNhdmVMYW5ndWFnZUluTG9jYWwgPSAoaTE4bikgPT4ge1xuICBjb25zdCBkZXRlY3RlZExhbmd1YWdlID0gaTE4bi5sYW5ndWFnZSB8fCBcImVuXCI7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaTE4bmV4dExuZ1wiLCBkZXRlY3RlZExhbmd1YWdlKTtcbn07XG4vL2Z1bmN0aW9uIHRvIGdldCBkZWZhdWx0IHNpZ25hdHVyIGVvZiBjdXJyZW50IHVzZXIgZnJvbSBgY29udHJhY3RzX1NpZ25hdHVyZWAgY2xhc3NcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0U2lnbmF0dXJlID0gYXN5bmMgKG9iamVjdElkKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJjb250cmFjdHNfU2lnbmF0dXJlXCIpO1xuICAgIHF1ZXJ5LmVxdWFsVG8oXCJVc2VySWRcIiwge1xuICAgICAgX190eXBlOiBcIlBvaW50ZXJcIixcbiAgICAgIGNsYXNzTmFtZTogXCJfVXNlclwiLFxuICAgICAgb2JqZWN0SWQ6IG9iamVjdElkXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeS5maXJzdCgpO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGNvbnN0IHJlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICBjb25zdCBkZWZhdWx0U2lnbmF0dXJlID0gcmVzPy5JbWFnZVVSTFxuICAgICAgICA/IGF3YWl0IGdldEJhc2U2NEZyb21VcmwocmVzPy5JbWFnZVVSTCwgdHJ1ZSlcbiAgICAgICAgOiBcIlwiO1xuICAgICAgY29uc3QgZGVmYXVsdEluaXRpYWwgPSByZXM/LkluaXRpYWxzXG4gICAgICAgID8gYXdhaXQgZ2V0QmFzZTY0RnJvbVVybChyZXM/LkluaXRpYWxzLCB0cnVlKVxuICAgICAgICA6IFwiXCI7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgIHJlczoge1xuICAgICAgICAgIGRlZmF1bHRTaWduYXR1cmU6IGRlZmF1bHRTaWduYXR1cmUsXG4gICAgICAgICAgZGVmYXVsdEluaXRpYWw6IGRlZmF1bHRJbml0aWFsXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmxvZyhcIkVycm9yOiBlcnJvciBpbiBmZXRjaCBkYXRhIGluIGNvbnRyYWN0c19TaWduYXR1cmVcIiwgZXJyKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBcImVycm9yXCJcbiAgICB9O1xuICB9XG59O1xuXG4vL2Z1bmN0aW9uIHRvIHJvdGF0ZSBwZGYgcGFnZVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJvdGF0ZVBkZlBhZ2UoXG4gIHVybCxcbiAgcm90YXRlRGVncmVlLFxuICBwYWdlTnVtYmVyLFxuICBwZGZSb3RhdGVCYXNlNjRcbikge1xuICBsZXQgZmlsZTtcblxuICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgcGRmIGJhc2U2NCBpbiBhcnJheUJ1ZmZlciBmb3JtYXRcbiAgaWYgKHBkZlJvdGF0ZUJhc2U2NCkge1xuICAgIGZpbGUgPSBiYXNlNjRUb0FycmF5QnVmZmVyKHBkZlJvdGF0ZUJhc2U2NCk7XG4gIH0gZWxzZSB7XG4gICAgLy9jb25kaXRpb24gdG8gaGFuZGxlIHBkZiB1cmwgaW4gYXJyYXlCdWZmZXIgZm9ybWF0XG4gICAgZmlsZSA9IGF3YWl0IGNvbnZlcnRQZGZBcnJheUJ1ZmZlcih1cmwpO1xuICB9XG4gIC8vIExvYWQgdGhlIGV4aXN0aW5nIFBERlxuICBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKGZpbGUpO1xuICAvLyBHZXQgdGhlIHBhZ2UgYWNjb3JkaW5nIHRvIHBhZ2UgbnVtYmVyXG4gIGNvbnN0IHBhZ2UgPSBwZGZEb2MuZ2V0UGFnZShwYWdlTnVtYmVyKTtcbiAgLy9nZXQgY3VycmVudCBwYWdlIHJvdGF0aW9uIGFuZ2xlXG4gIGNvbnN0IGN1cnJlbnRSb3RhdGlvbiA9IHBhZ2UuZ2V0Um90YXRpb24oKS5hbmdsZTtcbiAgLy8gQXBwbHkgdGhlIHJvdGF0aW9uIGluIHRoZSBjb3VudGVyY2xvY2t3aXNlIGRpcmVjdGlvblxuICBsZXQgbmV3Um90YXRpb24gPSAoY3VycmVudFJvdGF0aW9uICsgcm90YXRlRGVncmVlKSAlIDM2MDtcbiAgLy8gQWRqdXN0IGZvciBuZWdhdGl2ZSBhbmdsZXMgdG8ga2VlcCB3aXRoaW4gMC0zNTkgcmFuZ2VcbiAgaWYgKG5ld1JvdGF0aW9uIDwgMCkge1xuICAgIG5ld1JvdGF0aW9uICs9IDM2MDtcbiAgfVxuICBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMobmV3Um90YXRpb24pKTtcbiAgY29uc3QgcGRmYmFzZTY0ID0gYXdhaXQgcGRmRG9jLnNhdmVBc0Jhc2U2NCh7IHVzZU9iamVjdFN0cmVhbXM6IGZhbHNlIH0pO1xuICAvL2NvbnZlcnQgYmFzZTY0IHRvIGFycmF5YnVmZmVyIGlzIHVzZWQgaW4gcGRmLWxpYlxuICAvL3BkZmJhc2U2NCBpcyB1c2VkIHRvIHNob3cgcGRmIHJvdGF0ZWQgZm9ybWF0XG4gIGNvbnN0IGFycmF5QnVmZmVyID0gYmFzZTY0VG9BcnJheUJ1ZmZlcihwZGZiYXNlNjQpO1xuICAvL2BiYXNlNjRgIGlzIHVzZWQgdG8gc2hvdyBwZGZcbiAgcmV0dXJuIHsgYXJyYXlCdWZmZXI6IGFycmF5QnVmZmVyLCBiYXNlNjQ6IHBkZmJhc2U2NCB9O1xufVxuZnVuY3Rpb24gYmFzZTY0VG9BcnJheUJ1ZmZlcihiYXNlNjQpIHtcbiAgLy8gRGVjb2RlIHRoZSBiYXNlNjQgc3RyaW5nIHRvIGEgYmluYXJ5IHN0cmluZ1xuICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKGJhc2U2NCk7XG4gIC8vIENyZWF0ZSBhIG5ldyBBcnJheUJ1ZmZlciB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgYmluYXJ5IHN0cmluZ1xuICBjb25zdCBsZW4gPSBiaW5hcnlTdHJpbmcubGVuZ3RoO1xuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gIC8vIENvbnZlcnQgdGhlIGJpbmFyeSBzdHJpbmcgdG8gYSBieXRlIGFycmF5XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBieXRlc1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIC8vIFJldHVybiB0aGUgQXJyYXlCdWZmZXJcbiAgcmV0dXJuIGJ5dGVzLmJ1ZmZlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRCYXNlNjRUb0ZpbGUgPSBhc3luYyAocGRmTmFtZSwgcGRmQmFzZTY0KSA9PiB7XG4gIGNvbnN0IGZpbGVOYW1lID0gc2FuaXRpemVGaWxlTmFtZShwZGZOYW1lKSArIFwiLnBkZlwiO1xuICBjb25zdCBwZGZGaWxlID0gbmV3IFBhcnNlLkZpbGUoZmlsZU5hbWUsIHsgYmFzZTY0OiBwZGZCYXNlNjQgfSk7XG4gIC8vIFNhdmUgdGhlIFBhcnNlIEZpbGUgaWYgbmVlZGVkXG4gIGNvbnN0IHBkZkRhdGEgPSBhd2FpdCBwZGZGaWxlLnNhdmUoKTtcbiAgY29uc3QgcGRmVXJsID0gcGRmRGF0YS51cmwoKTtcbiAgcmV0dXJuIHBkZlVybDtcbn07XG5leHBvcnQgY29uc3Qgb25DbGlja1pvb21JbiA9IChzY2FsZSwgem9vbVBlcmNlbnQsIHNldFNjYWxlLCBzZXRab29tUGVyY2VudCkgPT4ge1xuICBzZXRTY2FsZShzY2FsZSArIDAuMSAqIHNjYWxlKTtcbiAgc2V0Wm9vbVBlcmNlbnQoem9vbVBlcmNlbnQgKyAxMCk7XG59O1xuZXhwb3J0IGNvbnN0IG9uQ2xpY2tab29tT3V0ID0gKFxuICB6b29tUGVyY2VudCxcbiAgc2NhbGUsXG4gIHNldFpvb21QZXJjZW50LFxuICBzZXRTY2FsZVxuKSA9PiB7XG4gIGlmICh6b29tUGVyY2VudCA+IDApIHtcbiAgICBpZiAoem9vbVBlcmNlbnQgPT09IDEwKSB7XG4gICAgICBzZXRTY2FsZSgxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0U2NhbGUoc2NhbGUgLSAwLjEgKiBzY2FsZSk7XG4gICAgfVxuICAgIHNldFpvb21QZXJjZW50KHpvb21QZXJjZW50IC0gMTApO1xuICB9XG59O1xuXG4vL2Z1bmN0aW9uIHRvIHVzZSByZW1vdmUgd2lkZ2V0cyBmcm9tIGN1cnJlbnQgcGFnZSB3aGVuIHVzZXIgd2FudCB0byByb3RhdGUgcGFnZVxuZXhwb3J0IGNvbnN0IGhhbmRsZVJlbW92ZVdpZGdldHMgPSAoXG4gIHNldFNpZ25lclBvcyxcbiAgc2lnbmVyUG9zLFxuICBwYWdlTnVtYmVyLFxuICBzZXRJc1JvdGF0ZVxuKSA9PiB7XG4gIGNvbnN0IHVwZGF0ZWRTaWduZXJQb3MgPSBzaWduZXJQb3MubWFwKChwbGFjZWhvbGRlck9iaikgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5wbGFjZWhvbGRlck9iaixcbiAgICAgIHBsYWNlSG9sZGVyOiBwbGFjZWhvbGRlck9iaj8ucGxhY2VIb2xkZXI/LmZpbHRlcihcbiAgICAgICAgKGRhdGEpID0+IGRhdGE/LnBhZ2VOdW1iZXIgIT09IHBhZ2VOdW1iZXJcbiAgICAgIClcbiAgICB9O1xuICB9KTtcbiAgc2V0U2lnbmVyUG9zKHVwZGF0ZWRTaWduZXJQb3MpO1xuICBzZXRJc1JvdGF0ZSh7XG4gICAgc3RhdHVzOiBmYWxzZSxcbiAgICBkZWdyZWU6IDBcbiAgfSk7XG59O1xuLy9mdW5jdGlvbiB0byBzaG93IHdhcm5pbmcgd2hlbiB1c2VyIHJvdGF0ZSBwYWdlIGFuZCB0aGVyZSBhcmUgc29tZSBhbHJlYWR5IHdpZGdldHMgb24gdGhhdCBwYWdlXG5leHBvcnQgY29uc3QgaGFuZGxlUm90YXRlV2FybmluZyA9IChzaWduZXJQb3MsIHBhZ2VOdW1iZXIpID0+IHtcbiAgY29uc3QgcGxhY2Vob2xkZXJFeGlzdCA9IHNpZ25lclBvcz8uc29tZSgocGxhY2Vob2xkZXJPYmopID0+XG4gICAgcGxhY2Vob2xkZXJPYmo/LnBsYWNlSG9sZGVyPy5zb21lKChkYXRhKSA9PiBkYXRhPy5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyKVxuICApO1xuICBpZiAocGxhY2Vob2xkZXJFeGlzdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcbiIsImltcG9ydCBsb2dvIGZyb20gXCIuLi9hc3NldHMvaW1hZ2VzL2xvZ28ucG5nXCI7XG5pbXBvcnQgeyBpc0VuYWJsZVN1YnNjcmlwdGlvbiB9IGZyb20gXCIuL2NvbnN0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZXJVcmxfZm4oKSB7XG4gIGxldCBiYXNlVXJsO1xuICBpZiAoaXNFbmFibGVTdWJzY3JpcHRpb24pIHtcbiAgICBiYXNlVXJsID0gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NFUlZFUlVSTFxuICAgICAgPyBwcm9jZXNzLmVudi5SRUFDVF9BUFBfU0VSVkVSVVJMXG4gICAgICA6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBcIi9hcGkvYXBwXCI7XG4gIH0gZWxzZSB7XG4gICAgYmFzZVVybCA9IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9TRVJWRVJVUkxcbiAgICAgID8gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NFUlZFUlVSTFxuICAgICAgOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvYXBwXCI7XG4gIH1cbiAgcmV0dXJuIGJhc2VVcmw7XG59XG5leHBvcnQgY29uc3QgYXBwSW5mbyA9IHtcbiAgYXBwbG9nbzogbG9nbyxcbiAgYXBwSWQ6IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUFBJRCA/IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9BUFBJRCA6IFwib3BlbnNpZ25cIixcbiAgYmFzZVVybDogc2VydmVyVXJsX2ZuKCksXG4gIGRlZmF1bHRSb2xlOiBcImNvbnRyYWN0c19Vc2VyXCIsXG4gIGZiQXBwSWQ6IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9GQkFQUElEXG4gICAgPyBgJHtwcm9jZXNzLmVudi5SRUFDVF9BUFBfRkJBUFBJRH1gXG4gICAgOiBcIlwiLFxuICBmZXZfSWNvbjpcbiAgICBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0NBWUFBQUJYQXZtSEFBQUFBWE5TUjBJQXJzNGM2UUFBQUxsSlJFRlVhRVB0bU4wTndqQU1CcE54WURLWWlNMVlwOTBnOTNDS1N0SDFOYklkZno5MjFEa2VyMlBjK0pzMWNERjdNWEF4QVNNR1lrQWlnQkk2dmg5WndvWFA1M3Vab0FZY3Zod2RBM21BVmJJMmFTYis5ekZLVTRJVVJCNmovSG9QVUlFYTJHM2lHSUFoUVFEbEFVSW9FMmRpYWJJa2xJU1MwTm9GUGVibzc3UkY2T2VuRUYzUW50T20xMjhoZTBHS3J3SHlBQ0ZvejJNZ0JxU0drcEFFY0hzNDdvSHRONUFGYWtBQ3FNTmpRRU1vRThTQUJGQ0huNEhFMnpHSFNMZUVBQUFBQUVsRlRrU3VRbUNDXCIsXG4gIGdvb2dsZUNsaWV0SWQ6IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9HT09HTEVDTElFTlRJRFxuICAgID8gYCR7cHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0dPT0dMRUNMSUVOVElEfWBcbiAgICA6IFwiXCIsXG4gIG1ldGFEZXNjcmlwdGlvbjpcbiAgICBcIlRoZSBmYXN0ZXN0IHdheSB0byBzaWduIFBERnMgJiByZXF1ZXN0IHNpZ25hdHVyZXMgZnJvbSBvdGhlcnMuXCIsXG4gIHNldHRpbmdzOiBbXG4gICAge1xuICAgICAgcm9sZTogXCJjb250cmFjdHNfQWRtaW5cIixcbiAgICAgIG1lbnVJZDogXCJWUGg5MWgwWkhrXCIsXG4gICAgICBwYWdlVHlwZTogXCJkYXNoYm9hcmRcIixcbiAgICAgIHBhZ2VJZDogXCIzNUtCb1Nnb0FLXCIsXG4gICAgICBleHRlbmRlZF9jbGFzczogXCJjb250cmFjdHNfVXNlcnNcIlxuICAgIH0sXG4gICAge1xuICAgICAgcm9sZTogXCJjb250cmFjdHNfT3JnQWRtaW5cIixcbiAgICAgIG1lbnVJZDogXCJWUGg5MWgwWkhrXCIsXG4gICAgICBwYWdlVHlwZTogXCJkYXNoYm9hcmRcIixcbiAgICAgIHBhZ2VJZDogXCIzNUtCb1Nnb0FLXCIsXG4gICAgICBleHRlbmRlZF9jbGFzczogXCJjb250cmFjdHNfVXNlcnNcIlxuICAgIH0sXG4gICAge1xuICAgICAgcm9sZTogXCJjb250cmFjdHNfRWRpdG9yXCIsXG4gICAgICBtZW51SWQ6IFwiSDl2UmZFWUtoVFwiLFxuICAgICAgcGFnZVR5cGU6IFwiZGFzaGJvYXJkXCIsXG4gICAgICBwYWdlSWQ6IFwiMzVLQm9TZ29BS1wiLFxuICAgICAgZXh0ZW5kZWRfY2xhc3M6IFwiY29udHJhY3RzX1VzZXJzXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIHJvbGU6IFwiY29udHJhY3RzX1VzZXJcIixcbiAgICAgIG1lbnVJZDogXCJIOXZSZkVZS2hUXCIsXG4gICAgICBwYWdlVHlwZTogXCJkYXNoYm9hcmRcIixcbiAgICAgIHBhZ2VJZDogXCIzNUtCb1Nnb0FLXCIsXG4gICAgICBleHRlbmRlZF9jbGFzczogXCJjb250cmFjdHNfVXNlcnNcIlxuICAgIH1cbiAgXVxufTtcbiIsImV4cG9ydCBjb25zdCBjb250YWN0Q2xzID0gXCJjb250cmFjdHNfQ29udGFjdGJvb2tcIjtcclxuZXhwb3J0IGNvbnN0IHRlbXBsYXRlQ2xzID0gXCJjb250cmFjdHNfVGVtcGxhdGVcIjtcclxuZXhwb3J0IGNvbnN0IGRvY3VtZW50Q2xzID0gXCJjb250cmFjdHNfRG9jdW1lbnRcIjtcclxuZXhwb3J0IGNvbnN0IHRoZW1lQ29sb3IgPSBcIiM0N2EzYWRcIjtcclxuZXhwb3J0IGNvbnN0IGljb25Db2xvciA9IFwiIzY4Njk2OFwiO1xyXG5leHBvcnQgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcclxuZXhwb3J0IGNvbnN0IGlzRW5hYmxlU3Vic2NyaXB0aW9uID1cclxuICBwcm9jZXNzLmVudi5SRUFDVF9BUFBfRU5BQkxFX1NVQlNDUklQVElPTiAmJlxyXG4gIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9FTkFCTEVfU1VCU0NSSVBUSU9OPy50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIlxyXG4gICAgPyB0cnVlXHJcbiAgICA6IGZhbHNlO1xyXG5leHBvcnQgY29uc3QgaXNTdGFnaW5nID1cclxuICB3aW5kb3cubG9jYXRpb24ub3JpZ2luID09PSBcImh0dHBzOi8vc3RhZ2luZy1hcHAub3BlbnNpZ25sYWJzLmNvbVwiO1xyXG5leHBvcnQgY29uc3QgaXNQdWJsaWNTdGFnaW5nID1cclxuICB3aW5kb3cubG9jYXRpb24ub3JpZ2luID09PSBcImh0dHBzOi8vc3RhZ2luZy5vcGVuc2lnbi5tZVwiO1xyXG4iLCJpbXBvcnQgeyBpc1N0YWdpbmcgfSBmcm9tIFwiLi4vY29uc3RhbnQvY29uc3RcIjtcblxuY29uc3QgcGxhbnMgPSBbXG4gIHtcbiAgICBwbGFuTmFtZTogXCJPUEVOU0lHTuKEoiBGUkVFXCIsXG4gICAgY29kZTogeyBtb250aGx5OiBcImZyZWVwbGFuXCIsIHllYXJseTogXCJmcmVlcGxhblwiIH0sXG4gICAgaW1nOiBcImZyZWUucG5nXCIsXG4gICAgY3VycmVuY3k6IFwiXCIsXG4gICAgbW9udGhseVByaWNlOiBcIkZyZWVcIixcbiAgICB5ZWFybHlQcmljZTogXCJGcmVlXCIsXG4gICAgc3VidGl0bGU6IFwiRnJlZSBVbmxpbWl0ZWQgRS1zaWduYXR1cmVzLCBGb3JldmVyLlwiLFxuICAgIGJ0bjogeyB0ZXh0OiBcIlN1YnNjcmliZVwiLCBjb2xvcjogXCJvcC1idG4tcHJpbWFyeVwiIH0sXG4gICAgdXJsOiBcIlwiLFxuICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICBiZW5lZml0czogW1xuICAgICAgXCJVbmxpbWl0ZWQgZGlnaXRhbCBzaWduYXR1cmVzXCIsXG4gICAgICBcIlNpZ24gZG9jdW1lbnRzIHlvdXJzZWxmXCIsXG4gICAgICBcIlJlcXVlc3Qgc2lnbmF0dXJlcyBmcm9tIG90aGVyc1wiLFxuICAgICAgXCIxNCBmaWVsZCB0eXBlc1wiLFxuICAgICAgXCJBdXRvbWF0aWMgZS1zaWduYXR1cmVzXCIsXG4gICAgICBcIkNvbXBsZXRpb24gY2VydGlmaWNhdGVzXCIsXG4gICAgICBcIlNlbmQgaW4gb3JkZXJcIixcbiAgICAgIFwiRG9jdW1lbnQgdGVtcGxhdGVzXCIsXG4gICAgICBcIkltcG9ydCBmcm9tIERyb3Bib3hcIixcbiAgICAgIFwiQ29udGFjdCBib29rXCIsXG4gICAgICBcIkRvY3VtZW50IGV4cGlyeSBzdXBwb3J0XCIsXG4gICAgICBcIkRlY2xpbmUgZG9jdW1lbnQgc3VwcG9ydFwiLFxuICAgICAgXCJFbWFpbCBub3RpZmljYXRpb25zXCIsXG4gICAgICBcIlJlY2lwaWVudCBhdXRoZW50aWNhdGlvbiB1c2luZyBPVFBcIixcbiAgICAgIFwiUHVibGljIHByb2ZpbGVzXCIsXG4gICAgICBcIkFuZCBtdWNoIG1vcmVcIlxuICAgIF0sXG4gICAgeWVhcmx5QmVuZWZpdHM6IFtcbiAgICAgIFwiVW5saW1pdGVkIGRpZ2l0YWwgc2lnbmF0dXJlc1wiLFxuICAgICAgXCJTaWduIGRvY3VtZW50cyB5b3Vyc2VsZlwiLFxuICAgICAgXCJSZXF1ZXN0IHNpZ25hdHVyZXMgZnJvbSBvdGhlcnNcIixcbiAgICAgIFwiMTQgZmllbGQgdHlwZXNcIixcbiAgICAgIFwiQXV0b21hdGljIGUtc2lnbmF0dXJlc1wiLFxuICAgICAgXCJDb21wbGV0aW9uIGNlcnRpZmljYXRlc1wiLFxuICAgICAgXCJTZW5kIGluIG9yZGVyXCIsXG4gICAgICBcIkRvY3VtZW50IHRlbXBsYXRlc1wiLFxuICAgICAgXCJJbXBvcnQgZnJvbSBEcm9wYm94XCIsXG4gICAgICBcIkNvbnRhY3QgYm9va1wiLFxuICAgICAgXCJEb2N1bWVudCBleHBpcnkgc3VwcG9ydFwiLFxuICAgICAgXCJEZWNsaW5lIGRvY3VtZW50IHN1cHBvcnRcIixcbiAgICAgIFwiRW1haWwgbm90aWZpY2F0aW9uc1wiLFxuICAgICAgXCJSZWNpcGllbnQgYXV0aGVudGljYXRpb24gdXNpbmcgT1RQXCIsXG4gICAgICBcIlB1YmxpYyBwcm9maWxlc1wiLFxuICAgICAgXCJBbmQgbXVjaCBtb3JlXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBwbGFuTmFtZTogXCJPUEVOU0lHTuKEoiBQUk9GRVNTSU9OQUxcIixcbiAgICBjb2RlOiBpc1N0YWdpbmdcbiAgICAgID8geyBtb250aGx5OiBcInByby13ZWVrbHlcIiwgeWVhcmx5OiBcInByby15ZWFybHlcIiB9XG4gICAgICA6IHsgbW9udGhseTogXCJwcm9mZXNzaW9uYWwtbW9udGhseVwiLCB5ZWFybHk6IFwicHJvZmVzc2lvbmFsLXllYXJseVwiIH0sXG4gICAgaW1nOiBcInByb2Zlc3Npb25hbC5wbmdcIixcbiAgICBjdXJyZW5jeTogXCIkXCIsXG4gICAgbW9udGhseVByaWNlOiBcIjI5Ljk5XCIsXG4gICAgeWVhcmx5UHJpY2U6IGA5Ljk5PHN1cCBzdHlsZT1cImZvbnQtc2l6ZTogMTdweDtcIj4vbW9udGg8L3N1cD5gLFxuICAgIHN1YnRpdGxlOiBcIkV4Y2x1c2l2ZSBBY2Nlc3MgdG8gYWR2YW5jZWQgZmVhdHVyZXMuXCIsXG4gICAgYnRuOiB7IHRleHQ6IFwiU3Vic2NyaWJlXCIsIGNvbG9yOiBcIm9wLWJ0bi1wcmltYXJ5XCIgfSxcbiAgICB1cmw6IGlzU3RhZ2luZ1xuICAgICAgPyBcImh0dHBzOi8vYmlsbGluZy56b2hvLmluL3N1YnNjcmliZS85NjI3ZjYyYTA5ZGYxYzhjZTUwMGYyZjRkYzgzMjhkZDg0ZWNkYTIwZWVhZTEzODc4Y2U1ODFkNjAyNDBmMjA2L3Byby13ZWVrbHlcIlxuICAgICAgOiBcImh0dHBzOi8vYmlsbGluZy5vcGVuc2lnbmxhYnMuY29tL3N1YnNjcmliZS9lZjc5ODQ4NmU2YTBhMTFlYTY1ZjJiYWU4ZjJhZjkwMWQxYTA5ZGZhODA4NTU4NWNkZDRlYzRkN2YzMjEzN2YzL3Byb2Zlc3Npb25hbC1tb250aGx5XCIsXG4gICAgeWVhcmx5VXJsOiBpc1N0YWdpbmdcbiAgICAgID8gXCJodHRwczovL2JpbGxpbmcuem9oby5pbi9zdWJzY3JpYmUvOTYyN2Y2MmEwOWRmMWM4Y2U1MDBmMmY0ZGM4MzI4ZGRjMTg0NDExMTI5MjI0ZjFmMjllZDg0ZjZjZWYzYjg2Mi9wcm8teWVhcmx5XCJcbiAgICAgIDogXCJodHRwczovL2JpbGxpbmcub3BlbnNpZ25sYWJzLmNvbS9zdWJzY3JpYmUvZWY3OTg0ODZlNmEwYTExZWE2NWYyYmFlOGYyYWY5MDFkOGFkMTEzNTE5MGRmZjk1MTMzMDM2MGU0NzU4NWE3MS9wcm9mZXNzaW9uYWwteWVhcmx5XCIsXG4gICAgdGFyZ2V0OiBcIl9zZWxmXCIsXG4gICAgYmVuZWZpdHM6IFtcbiAgICAgIFwiRXZlcnl0aGluZyBpbiBPcGVuU2lnbuKEoiBmcmVlXCIsXG4gICAgICBcIkZpZWxkIHZhbGlkYXRpb25zXCIsXG4gICAgICBcIlJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0aW9uc1wiLFxuICAgICAgXCJPcmdhbml6ZSBkb2NzIGluIE9wZW5TaWdu4oSiIERyaXZlXCIsXG4gICAgICBcIldlYmhvb2tzXCIsXG4gICAgICBcIlphcGllciBpbnRlZ3JhdGlvblwiLFxuICAgICAgXCJBUEkgQWNjZXNzXCIsXG4gICAgICBcInVwdG8gMTAwIEFQSSBzaWduYXR1cmVzXCIsXG4gICAgICBcIkN1c3RvbSBlbWFpbCB0ZW1wbGF0ZXNcIixcbiAgICAgIFwiQXV0byByZW1pbmRlcnNcIixcbiAgICAgIFwiQnVsayBzZW5kICh1cHRvIDEwMCBkb2NzKVwiLFxuICAgICAgXCJQcmVtaXVtIFB1YmxpYyBwcm9maWxlIHVzZXJuYW1lc1wiLFxuICAgICAgXCJFbWJlZGRpbmcgKGNvbWluZyBzb29uKVwiXG4gICAgXSxcbiAgICB5ZWFybHlCZW5lZml0czogW1xuICAgICAgXCJFdmVyeXRoaW5nIGluIE9wZW5TaWdu4oSiIGZyZWVcIixcbiAgICAgIFwiRmllbGQgdmFsaWRhdGlvbnNcIixcbiAgICAgIFwiUmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRpb25zXCIsXG4gICAgICBcIk9yZ2FuaXplIGRvY3MgaW4gT3BlblNpZ27ihKIgRHJpdmVcIixcbiAgICAgIFwiV2ViaG9va3NcIixcbiAgICAgIFwiWmFwaWVyIGludGVncmF0aW9uXCIsXG4gICAgICBcIkFQSSBBY2Nlc3NcIixcbiAgICAgIFwidXB0byAyNDAgQVBJIHNpZ25hdHVyZXNcIixcbiAgICAgIFwiQ3VzdG9tIGVtYWlsIHRlbXBsYXRlc1wiLFxuICAgICAgXCJBdXRvIHJlbWluZGVyc1wiLFxuICAgICAgXCJCdWxrIHNlbmQgKHVwdG8gMjQwIGRvY3MpXCIsXG4gICAgICBcIlByZW1pdW0gUHVibGljIHByb2ZpbGUgdXNlcm5hbWVzXCIsXG4gICAgICBcIkVtYmVkZGluZyAoY29taW5nIHNvb24pXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBwbGFuTmFtZTogXCJPUEVOU0lHTuKEoiBURUFNU1wiLFxuICAgIGNvZGU6IHsgbW9udGhseTogXCJ0ZWFtcy1tb250aGx5XCIsIHllYXJseTogXCJ0ZWFtcy15ZWFybHlcIiB9LFxuICAgIGltZzogXCJ0ZWFtcy5wbmdcIixcbiAgICBjdXJyZW5jeTogXCIkXCIsXG4gICAgbW9udGhseVByaWNlOiBgMzkuOTk8c3VwIHN0eWxlPVwiZm9udC1zaXplOiAxN3B4O1wiPi91c2VyPC9zdXA+YCxcbiAgICB5ZWFybHlQcmljZTogYDE5Ljk5PHN1cCBzdHlsZT1cImZvbnQtc2l6ZTogMTdweDtcIj4vdXNlci9tb250aDwvc3VwPmAsXG4gICAgc3VidGl0bGU6IFwiRXhjbHVzaXZlIEFjY2VzcyB0byBhZHZhbmNlZCBmZWF0dXJlcy5cIixcbiAgICBidG46IHsgdGV4dDogXCJTdWJzY3JpYmVcIiwgY29sb3I6IFwib3AtYnRuLWFjY2VudFwiIH0sXG4gICAgdXJsOiBpc1N0YWdpbmdcbiAgICAgID8gXCJodHRwczovL2JpbGxpbmcuem9oby5pbi9zdWJzY3JpYmUvZWQ4MDk3MjczYTgyYjZiZjM5ODkyYzExYTNiYjNjMzgxZWIyNzA1NzM2MDE0Y2ZiZGJkZTFjY2YxYzdhMTg5ZC90ZWFtcy1tb250aGx5XCJcbiAgICAgIDogXCJodHRwczovL2JpbGxpbmcub3BlbnNpZ25sYWJzLmNvbS9zdWJzY3JpYmUvZWY3OTg0ODZlNmEwYTExZWE2NWYyYmFlOGYyYWY5MDEyMzdkMDcwMmJmYWE5NTk0MDYzMDY2MzVkODBmMTM4Yy90ZWFtcy1tb250aGx5XCIsXG4gICAgeWVhcmx5VXJsOiBpc1N0YWdpbmdcbiAgICAgID8gXCJodHRwczovL2JpbGxpbmcuem9oby5pbi9zdWJzY3JpYmUvZWQ4MDk3MjczYTgyYjZiZjM5ODkyYzExYTNiYjNjMzgxZWIyNzA1NzM2MDE0Y2ZiZGJkZTFjY2YxYzdhMTg5ZC90ZWFtcy15ZWFybHlcIlxuICAgICAgOiBcImh0dHBzOi8vYmlsbGluZy5vcGVuc2lnbmxhYnMuY29tL3N1YnNjcmliZS9lZjc5ODQ4NmU2YTBhMTFlYTY1ZjJiYWU4ZjJhZjkwMTFhODY0OTk0YmJlZWVjNzFmY2YxMDYxODg2MzAxOTlkL3RlYW1zLXllYXJseVwiLFxuICAgIHRhcmdldDogXCJfc2VsZlwiLFxuICAgIGJlbmVmaXRzOiBbXG4gICAgICBcIkV2ZXJ5dGhpbmcgaW4gT3BlblNpZ27ihKIgcHJvZmVzc2lvbmFsXCIsXG4gICAgICBcInVwdG8gMTAwIEFQSSBzaWduYXR1cmVzXCIsXG4gICAgICBcIlRlYW1zIGFuZCBPcmdhbml6YXRpb25zXCIsXG4gICAgICBcIlNoYXJlIFRlbXBsYXRlcyB3aXRoIHRlYW1zXCIsXG4gICAgICBcIlNoYXJlIFRlbXBsYXRlcyB3aXRoIGluZGl2aWR1YWxzXCIsXG4gICAgICBcIkRvY3VtZW50SWQgcmVtb3ZhbCBmcm9tIHNpZ25lZCBkb2NzXCIsXG4gICAgICBcIkJ1bGsgc2VuZCAodXB0byAxMDAgZG9jcylcIixcbiAgICAgIFwiUmVxdWVzdCBQYXltZW50cyAoY29taW5nIHNvb24pXCIsXG4gICAgICBcIk1vYmlsZSBhcHAgKGNvbWluZyBzb29uKVwiXG4gICAgXSxcbiAgICB5ZWFybHlCZW5lZml0czogW1xuICAgICAgXCJFdmVyeXRoaW5nIGluIE9wZW5TaWdu4oSiIHByb2Zlc3Npb25hbFwiLFxuICAgICAgXCJ1cHRvIDUwMCBBUEkgc2lnbmF0dXJlc1wiLFxuICAgICAgXCJUZWFtcyBhbmQgT3JnYW5pemF0aW9uc1wiLFxuICAgICAgXCJTaGFyZSBUZW1wbGF0ZXMgd2l0aCB0ZWFtc1wiLFxuICAgICAgXCJTaGFyZSBUZW1wbGF0ZXMgd2l0aCBpbmRpdmlkdWFsc1wiLFxuICAgICAgXCJEb2N1bWVudElkIHJlbW92YWwgZnJvbSBzaWduZWQgZG9jc1wiLFxuICAgICAgXCJCdWxrIHNlbmQgKHVwdG8gNTAwIGRvY3MpXCIsXG4gICAgICBcIlJlcXVlc3QgUGF5bWVudHMgKGNvbWluZyBzb29uKVwiLFxuICAgICAgXCJNb2JpbGUgYXBwIChjb21pbmcgc29vbilcIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIHBsYW5OYW1lOiBcIk9QRU5TSUdO4oSiIEVOVEVSUFJJU0VcIixcbiAgICBpbWc6IFwiZW50ZXJwcmlzZS5wbmdcIixcbiAgICBjdXJyZW5jeTogXCJcIixcbiAgICBtb250aGx5UHJpY2U6IGA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMjJweDtcIj5SZXF1ZXN0IFByaWNlPC9wPmAsXG4gICAgeWVhcmx5UHJpY2U6IGA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMjJweDtcIj5SZXF1ZXN0IFByaWNlPC9wPmAsXG4gICAgc3VidGl0bGU6IFwiU2NhbGFibGUgRmVhdHVyZXMgd2l0aCBwcmlvcml0eSBzdXBwb3J0LlwiLFxuICAgIGJ0bjogeyB0ZXh0OiBcIkNvbnRhY3QgdXNcIiwgY29sb3I6IFwib3AtYnRuLXByaW1hcnlcIiB9LFxuICAgIHVybDogXCJodHRwczovL3d3dy5vcGVuc2lnbmxhYnMuY29tL2NvbnRhY3QtdXNcIixcbiAgICB0YXJnZXQ6IFwiX2JsYW5rXCIsXG4gICAgYmVuZWZpdHM6IFtcbiAgICAgIFwiQWxsIGZlYXR1cmVzXCIsXG4gICAgICBcIkN1c3RvbSBkb21haW5cIixcbiAgICAgIFwiQ3VzdG9tIGJyYW5kaW5nXCIsXG4gICAgICBcIlVwdGltZSBTTEFcIixcbiAgICAgIFwiU1NPIHN1cHBvcnRcIixcbiAgICAgIFwiUHJpb3JpdHkgc3VwcG9ydFwiXG4gICAgXSxcbiAgICB5ZWFybHlCZW5lZml0czogW1xuICAgICAgXCJBbGwgZmVhdHVyZXNcIixcbiAgICAgIFwiQ3VzdG9tIGRvbWFpblwiLFxuICAgICAgXCJDdXN0b20gYnJhbmRpbmdcIixcbiAgICAgIFwiVXB0aW1lIFNMQVwiLFxuICAgICAgXCJTU08gc3VwcG9ydFwiLFxuICAgICAgXCJQcmlvcml0eSBzdXBwb3J0XCJcbiAgICBdXG4gIH1cbl07XG5cbmV4cG9ydCBjb25zdCB2YWxpZHBsYW4gPSB7XG4gIFwidGVhbS13ZWVrbHlcIjogdHJ1ZSxcbiAgXCJ0ZWFtLXllYXJseVwiOiB0cnVlLFxuICBcInRlYW1zLW1vbnRobHlcIjogdHJ1ZSxcbiAgXCJ0ZWFtcy15ZWFybHlcIjogdHJ1ZSxcbiAgXCJlbnRlcnByaXNlLW1vbnRobHlcIjogdHJ1ZSxcbiAgXCJlbnRlcnByaXNlLXllYXJseVwiOiB0cnVlXG59O1xuZXhwb3J0IGNvbnN0IHBhaWRVcmwgPSAocGxhbikgPT4ge1xuICBjb25zdCB0ZWFtcGVyaW9kID0ge1xuICAgIFwidGVhbS13ZWVrbHlcIjogXCJtb250aGx5XCIsXG4gICAgXCJ0ZWFtLXllYXJseVwiOiBcInllYXJseVwiLFxuICAgIFwidGVhbXMtbW9udGhseVwiOiBcIm1vbnRobHlcIixcbiAgICBcInRlYW1zLXllYXJseVwiOiBcInllYXJseVwiXG4gIH07XG4gIGNvbnN0IHBlcmlvZCA9IHRlYW1wZXJpb2RbcGxhbl0gfHwgXCJcIjtcbiAgaWYgKHBlcmlvZCkge1xuICAgIGNvbnN0IGV4dFVzZXIgPVxuICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJFeHRhbmRfQ2xhc3NcIikgJiZcbiAgICAgIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJFeHRhbmRfQ2xhc3NcIikpPy5bMF07XG4gICAgY29uc3QgdXNlciA9IHtcbiAgICAgIG5hbWU6IGV4dFVzZXI/Lk5hbWUsXG4gICAgICBlbWFpbDogZXh0VXNlcj8uRW1haWwsXG4gICAgICBjb21wYW55OiBleHRVc2VyPy5Db21wYW55LFxuICAgICAgcGhvbmU6IGV4dFVzZXI/LlBob25lXG4gICAgfTtcbiAgICAvLyBjb25zb2xlLmxvZyhcInVzZXJEZXRhaWxzIFwiLCB1c2VyRGV0YWlscyk7XG4gICAgY29uc3QgZnVsbG5hbWUgPSB1c2VyICYmIHVzZXIubmFtZSA/IHVzZXIubmFtZS5zcGxpdChcIiBcIikgOiBcIlwiO1xuICAgIGNvbnN0IGZpcnN0bmFtZSA9IGZ1bGxuYW1lPy5bMF1cbiAgICAgID8gXCJmaXJzdF9uYW1lPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGZ1bGxuYW1lPy5bMF0pXG4gICAgICA6IFwiXCI7XG4gICAgY29uc3QgbGFzdG5hbWUgPSBmdWxsbmFtZT8uWzFdXG4gICAgICA/IFwiJmxhc3RfbmFtZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChmdWxsbmFtZT8uWzFdKVxuICAgICAgOiBcIlwiO1xuICAgIGNvbnN0IG5hbWUgPSBmaXJzdG5hbWUgPyBmaXJzdG5hbWUgKyBsYXN0bmFtZSA6IFwiXCI7XG4gICAgY29uc3QgZW1haWwgPVxuICAgICAgdXNlciAmJiB1c2VyLmVtYWlsID8gXCImZW1haWw9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodXNlci5lbWFpbCkgOiBcIlwiO1xuICAgIGNvbnN0IGNvbXBhbnkgPVxuICAgICAgdXNlciAmJiB1c2VyLmNvbXBhbnlcbiAgICAgICAgPyBcIiZjb21wYW55X25hbWU9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodXNlci5jb21wYW55KVxuICAgICAgICA6IFwiXCI7XG4gICAgY29uc3QgcGhvbmUgPVxuICAgICAgdXNlciAmJiB1c2VyLnBob25lID8gXCImbW9iaWxlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIucGhvbmUpIDogXCJcIjtcbiAgICBjb25zdCBhbGxvd2VkVXNlcnMgPVxuICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhbGxvd2VkVXNlcnNcIikgJiZcbiAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWxsb3dlZFVzZXJzXCIpID4gMFxuICAgICAgICA/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWxsb3dlZFVzZXJzXCIpIC0gMVxuICAgICAgICA6IFwiXCI7XG4gICAgY29uc3QgcXVhbnRpdHkgPSBhbGxvd2VkVXNlcnNcbiAgICAgID8gYGFkZG9uX2NvZGUlNUIwJTVEPWV4dHJhLXRlYW1zLXVzZXJzLSR7cGVyaW9kfSZhZGRvbl9xdWFudGl0eSU1QjAlNUQ9JHthbGxvd2VkVXNlcnN9JmBcbiAgICAgIDogXCJcIjtcblxuICAgIGNvbnN0IGRldGFpbHMgPVxuICAgICAgXCI/c2hpcHBpbmdfY291bnRyeV9jb2RlPVVTJmJpbGxpbmdfY291bnRyeV9jb2RlPVVTJmJpbGxpbmdfc3RhdGVfY29kZT1DQSZcIiArXG4gICAgICBxdWFudGl0eSArXG4gICAgICBuYW1lICtcbiAgICAgIGVtYWlsICtcbiAgICAgIGNvbXBhbnkgK1xuICAgICAgcGhvbmU7XG5cbiAgICBpZiAodXNlcikge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJ1c2VyRGV0YWlsc1wiLCBKU09OLnN0cmluZ2lmeSh1c2VyKSk7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHtcbiAgICAgIG1vbnRobHk6IGlzU3RhZ2luZ1xuICAgICAgICA/IFwiaHR0cHM6Ly9iaWxsaW5nLnpvaG8uaW4vc3Vic2NyaWJlL2VkODA5NzI3M2E4MmI2YmYzOTg5MmMxMWEzYmIzYzM4MWViMjcwNTczNjAxNGNmYmRiZGUxY2NmMWM3YTE4OWQvdGVhbXMtbW9udGhseVwiXG4gICAgICAgIDogXCJodHRwczovL2JpbGxpbmcub3BlbnNpZ25sYWJzLmNvbS9zdWJzY3JpYmUvZWY3OTg0ODZlNmEwYTExZWE2NWYyYmFlOGYyYWY5MDEyMzdkMDcwMmJmYWE5NTk0MDYzMDY2MzVkODBmMTM4Yy90ZWFtcy1tb250aGx5XCIsXG4gICAgICB5ZWFybHk6IGlzU3RhZ2luZ1xuICAgICAgICA/IFwiaHR0cHM6Ly9iaWxsaW5nLnpvaG8uaW4vc3Vic2NyaWJlL2VkODA5NzI3M2E4MmI2YmYzOTg5MmMxMWEzYmIzYzM4MWViMjcwNTczNjAxNGNmYmRiZGUxY2NmMWM3YTE4OWQvdGVhbXMteWVhcmx5XCJcbiAgICAgICAgOiBcImh0dHBzOi8vYmlsbGluZy5vcGVuc2lnbmxhYnMuY29tL3N1YnNjcmliZS9lZjc5ODQ4NmU2YTBhMTFlYTY1ZjJiYWU4ZjJhZjkwMTFhODY0OTk0YmJlZWVjNzFmY2YxMDYxODg2MzAxOTlkL3RlYW1zLXllYXJseVwiXG4gICAgfTtcblxuICAgIGNvbnN0IHBsYW51cmwgPSB1cmxbcGVyaW9kXSArIGRldGFpbHM7XG4gICAgcmV0dXJuIHBsYW51cmw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiL3N1YnNjcmlwdGlvblwiO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgcGxhbnM7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCB7IGlzRW5hYmxlU3Vic2NyaXB0aW9uLCBpc1N0YWdpbmcsIHRoZW1lQ29sb3IgfSBmcm9tIFwiLi4vY29uc3RhbnQvY29uc3RcIjtcclxuaW1wb3J0IHsgUERGRG9jdW1lbnQgfSBmcm9tIFwicGRmLWxpYlwiO1xyXG5pbXBvcnQgXCIuLi9zdHlsZXMvc2lnbmF0dXJlLmNzc1wiO1xyXG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XHJcbmltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcclxuaW1wb3J0IHsgRG5kUHJvdmlkZXIgfSBmcm9tIFwicmVhY3QtZG5kXCI7XHJcbmltcG9ydCB7IEhUTUw1QmFja2VuZCB9IGZyb20gXCJyZWFjdC1kbmQtaHRtbDUtYmFja2VuZFwiO1xyXG5pbXBvcnQgU2lnblBhZCBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvU2lnblBhZFwiO1xyXG5pbXBvcnQgUmVuZGVyQWxsUGRmUGFnZSBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvUmVuZGVyQWxsUGRmUGFnZVwiO1xyXG5pbXBvcnQgVG91ciBmcm9tIFwicmVhY3RvdXJcIjtcclxuaW1wb3J0IENvbmZldHRpIGZyb20gXCJyZWFjdC1jb25mZXR0aVwiO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuaW1wb3J0IHtcclxuICBjb250cmFjdERvY3VtZW50LFxyXG4gIG11bHRpU2lnbkVtYmVkLFxyXG4gIGVtYmVkRG9jSWQsXHJcbiAgcGRmTmV3V2lkdGhGdW4sXHJcbiAgc2lnblBkZkZ1bixcclxuICBvbkltYWdlU2VsZWN0LFxyXG4gIG9uU2F2ZVNpZ24sXHJcbiAgb25TYXZlSW1hZ2UsXHJcbiAgYWRkRGVmYXVsdFNpZ25hdHVyZUltZyxcclxuICByYWRpb0J1dHRvbldpZGdldCxcclxuICByZXBsYWNlTWFpbFZhcmlibGVzLFxyXG4gIGZldGNoU3Vic2NyaXB0aW9uLFxyXG4gIGNvbnZlcnRQZGZBcnJheUJ1ZmZlcixcclxuICBjb250cmFjdFVzZXJzLFxyXG4gIGhhbmRsZVNlbmRPVFAsXHJcbiAgY29udGFjdEJvb2ssXHJcbiAgaGFuZGxlRG93bmxvYWRQZGYsXHJcbiAgaGFuZGxlVG9QcmludCxcclxuICBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlLFxyXG4gIGdldERlZmF1bHRTaWduYXR1cmUsXHJcbiAgb25DbGlja1pvb21JbixcclxuICBvbkNsaWNrWm9vbU91dCxcclxuICBmZXRjaFVybFxyXG59IGZyb20gXCIuLi9jb25zdGFudC9VdGlsc1wiO1xyXG5pbXBvcnQgTG9hZGVyV2l0aE1zZyBmcm9tIFwiLi4vcHJpbWl0aXZlcy9Mb2FkZXJXaXRoTXNnXCI7XHJcbmltcG9ydCBIYW5kbGVFcnJvciBmcm9tIFwiLi4vcHJpbWl0aXZlcy9IYW5kbGVFcnJvclwiO1xyXG5pbXBvcnQgSGVhZGVyIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9QZGZIZWFkZXJcIjtcclxuaW1wb3J0IFJlbmRlclBkZiBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvUmVuZGVyUGRmXCI7XHJcbmltcG9ydCBQZGZEZWNsaW5lTW9kYWwgZnJvbSBcIi4uL3ByaW1pdGl2ZXMvUGRmRGVjbGluZU1vZGFsXCI7XHJcbmltcG9ydCBUaXRsZSBmcm9tIFwiLi4vY29tcG9uZW50cy9UaXRsZVwiO1xyXG5pbXBvcnQgRGVmYXVsdFNpZ25hdHVyZSBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvRGVmYXVsdFNpZ25hdHVyZVwiO1xyXG5pbXBvcnQgTW9kYWxVaSBmcm9tIFwiLi4vcHJpbWl0aXZlcy9Nb2RhbFVpXCI7XHJcbmltcG9ydCBUb3VyQ29udGVudFdpdGhCdG4gZnJvbSBcIi4uL3ByaW1pdGl2ZXMvVG91ckNvbnRlbnRXaXRoQnRuXCI7XHJcbmltcG9ydCBMb2FkZXIgZnJvbSBcIi4uL3ByaW1pdGl2ZXMvTG9hZGVyXCI7XHJcbmltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSBcInJlYWN0LXJlZHV4XCI7XHJcbmltcG9ydCBTaWduZXJMaXN0Q29tcG9uZW50IGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9TaWduZXJMaXN0Q29tcG9uZW50XCI7XHJcbmltcG9ydCBWZXJpZnlFbWFpbCBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvVmVyaWZ5RW1haWxcIjtcclxuaW1wb3J0IFBkZlpvb20gZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL1BkZlpvb21cIjtcclxuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xyXG5cclxuZnVuY3Rpb24gUGRmUmVxdWVzdEZpbGVzKHByb3BzKSB7XHJcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xyXG4gIGNvbnN0IFtwZGZEZXRhaWxzLCBzZXRQZGZEZXRhaWxzXSA9IHVzZVN0YXRlKFtdKTtcclxuICBjb25zdCBbc2lnbmVkU2lnbmVycywgc2V0U2lnbmVkU2lnbmVyc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgY29uc3QgW3Vuc2lnbmVkU2lnbmVycywgc2V0VW5TaWduZWRTaWduZXJzXSA9IHVzZVN0YXRlKFtdKTtcclxuICBjb25zdCBbaXNTaWduUGFkLCBzZXRJc1NpZ25QYWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtwZGZVcmwsIHNldFBkZlVybF0gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFthbGxQYWdlcywgc2V0QWxsUGFnZXNdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgY29uc3QgbnVtUGFnZXMgPSAxO1xyXG4gIGNvbnN0IFtwYWdlTnVtYmVyLCBzZXRQYWdlTnVtYmVyXSA9IHVzZVN0YXRlKDEpO1xyXG4gIGNvbnN0IFtpbWFnZSwgc2V0SW1hZ2VdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgY29uc3QgW2lzSW1hZ2VTZWxlY3QsIHNldElzSW1hZ2VTZWxlY3RdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtzaWduYXR1cmUsIHNldFNpZ25hdHVyZV0gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFtpc1N0YW1wLCBzZXRJc1N0YW1wXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbc2lnbktleSwgc2V0U2lnbktleV0gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFtpbWdXSCwgc2V0SW1nV0hdID0gdXNlU3RhdGUoe30pO1xyXG4gIGNvbnN0IGltYWdlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gIGNvbnN0IFtoYW5kbGVFcnJvciwgc2V0SGFuZGxlRXJyb3JdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbc2VsZWN0V2lkZ2V0SWQsIHNldFNlbGVjdFdpZGdldElkXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtvdHBMb2FkZXIsIHNldE90cExvYWRlcl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzQ2VsZWJyYXRpb24sIHNldElzQ2VsZWJyYXRpb25dID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtyZXF1ZXN0U2lnblRvdXIsIHNldFJlcXVlc3RTaWduVG91cl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3RvdXJTdGF0dXMsIHNldFRvdXJTdGF0dXNdID0gdXNlU3RhdGUoW10pO1xyXG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZSh7XHJcbiAgICBpc0xvYWQ6IHRydWUsXHJcbiAgICBtZXNzYWdlOiB0KFwibG9hZGluZy1tc3NnXCIpXHJcbiAgfSk7XHJcbiAgY29uc3QgW2RlZmF1bHRTaWduSW1nLCBzZXREZWZhdWx0U2lnbkltZ10gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFtpc0RvY0lkLCBzZXRJc0RvY0lkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbcGRmTmV3V2lkdGgsIHNldFBkZk5ld1dpZHRoXSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW3BkZk9yaWdpbmFsV0gsIHNldFBkZk9yaWdpbmFsV0hdID0gdXNlU3RhdGUoW10pO1xyXG4gIGNvbnN0IFtzaWduZXJQb3MsIHNldFNpZ25lclBvc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgY29uc3QgW3NpZ25lck9iamVjdElkLCBzZXRTaWduZXJPYmplY3RJZF0gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFtpc1VpTG9hZGluZywgc2V0SXNVaUxvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc0RlY2xpbmUsIHNldElzRGVjbGluZV0gPSB1c2VTdGF0ZSh7IGlzRGVjbGluZWQ6IGZhbHNlIH0pO1xyXG4gIGNvbnN0IFtjdXJyZW50U2lnbmVyLCBzZXRDdXJyZW50U2lnbmVyXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNBbGVydCwgc2V0SXNBbGVydF0gPSB1c2VTdGF0ZSh7IGlzU2hvdzogZmFsc2UsIGFsZXJ0TWVzc2FnZTogXCJcIiB9KTtcclxuICBjb25zdCBbdW5TaWduZWRXaWRnZXRJZCwgc2V0VW5TaWduZWRXaWRnZXRJZF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbZXhwaXJlZERhdGUsIHNldEV4cGlyZWREYXRlXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtpc1Jlc2l6ZSwgc2V0SXNSZXNpemVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtzaWduZXJVc2VySWQsIHNldFNpZ25lclVzZXJJZF0gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFtpc0RvbnRTaG93LCBzZXRJc0RvbnRTaG93XSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNEb3dubG9hZGluZywgc2V0SXNEb3dubG9hZGluZ10gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbZGVmYXVsdFNpZ25BbGVydCwgc2V0RGVmYXVsdFNpZ25BbGVydF0gPSB1c2VTdGF0ZSh7XHJcbiAgICBpc1Nob3c6IGZhbHNlLFxyXG4gICAgYWxlcnRNZXNzYWdlOiBcIlwiXHJcbiAgfSk7XHJcbiAgY29uc3QgW2lzU3Vic2NyaWJlZCwgc2V0SXNTdWJzY3JpYmVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNDb21wbGV0ZWQsIHNldElzQ29tcGxldGVkXSA9IHVzZVN0YXRlKHtcclxuICAgIGlzQ2VydGlmaWNhdGU6IGZhbHNlLFxyXG4gICAgaXNNb2RhbDogZmFsc2VcclxuICB9KTtcclxuICBjb25zdCBbbXlJbml0aWFsLCBzZXRNeUluaXRpYWxdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2lzSW5pdGlhbCwgc2V0SXNJbml0aWFsXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbcGRmTG9hZCwgc2V0UGRmTG9hZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzU2lnbmVkLCBzZXRJc1NpZ25lZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzRXhwaXJlZCwgc2V0SXNFeHBpcmVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbYWxyZWFkeVNpZ24sIHNldEFscmVhZHlTaWduXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbY29udGFpbmVyV0gsIHNldENvbnRhaW5lcldIXSA9IHVzZVN0YXRlKHt9KTtcclxuICBjb25zdCBbdmFsaWRhdGVBbGVydCwgc2V0VmFsaWRhdGVBbGVydF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3dpZGdldHNUb3VyLCBzZXRXaWRnZXRzVG91cl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW21pblJlcXVpcmVkQ291bnQsIHNldG1pblJlcXVpcmVkQ291bnRdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbc2VuZEluT3JkZXIsIHNldFNlbmRJbk9yZGVyXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbY3VycldpZGdldHNEZXRhaWxzLCBzZXRDdXJyV2lkZ2V0c0RldGFpbHNdID0gdXNlU3RhdGUoe30pO1xyXG4gIGNvbnN0IFtpc1N1YnNjcmlwdGlvbkV4cGlyZWQsIHNldElzU3Vic2NyaXB0aW9uRXhwaXJlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2V4dFVzZXJJZCwgc2V0RXh0VXNlcklkXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtpc0VtYWlsVmVyaWZpZWQsIHNldElzRW1haWxWZXJpZmllZF0gPSB1c2VTdGF0ZSh0cnVlKTtcclxuICBjb25zdCBbaXNWZXJpZnlNb2RhbCwgc2V0SXNWZXJpZnlNb2RhbF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW290cCwgc2V0T3RwXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtjb250cmFjdE5hbWUsIHNldENvbnRyYWN0TmFtZV0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbem9vbVBlcmNlbnQsIHNldFpvb21QZXJjZW50XSA9IHVzZVN0YXRlKDApO1xyXG4gIGNvbnN0IFtzY2FsZSwgc2V0U2NhbGVdID0gdXNlU3RhdGUoMSk7XHJcbiAgY29uc3QgW3VuaXF1ZUlkLCBzZXRVbmlxdWVJZF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbaXNQdWJsaWNUZW1wbGF0ZSwgc2V0SXNQdWJsaWNUZW1wbGF0ZV0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2NvbnRhY3QsIHNldENvbnRhY3RdID0gdXNlU3RhdGUoeyBuYW1lOiBcIlwiLCBwaG9uZTogXCJcIiwgZW1haWw6IFwiXCIgfSk7XHJcbiAgY29uc3QgW2lzT3RwLCBzZXRJc090cF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtyZXMsIHNldFJlc10gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgY29uc3QgW2RvY3VtZW50SWQsIHNldERvY3VtZW50SWRdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2lzUHVibGljQ29udGFjdCwgc2V0SXNQdWJsaWNDb250YWN0XSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbcGRmQXJyYXlCdWZmZXIsIHNldFBkZkFycmF5QnVmZmVyXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtwbGFuY29kZSwgc2V0UGxhbkNvZGVdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgaXNIZWFkZXIgPSB1c2VTZWxlY3Rvcigoc3RhdGUpID0+IHN0YXRlLnNob3dIZWFkZXIpO1xyXG4gIGNvbnN0IGRpdlJlZiA9IHVzZVJlZihudWxsKTtcclxuXHJcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDc2NztcclxuXHJcbiAgbGV0IGlzR3Vlc3RTaWduRmxvdyA9IGZhbHNlO1xyXG4gIGxldCBzZW5kbWFpbDtcclxuICBsZXQgZ2V0RG9jSWQgPSBcIlwiO1xyXG4gIGNvbnN0IHJvdXRlID0gIXByb3BzLnRlbXBsYXRlSWQgJiYgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOyAvLycvbG9hZC9yZWNpcGllbnRTaWduUGRmL1RPQVZ1aFhiZncvZlBBS2RLMXFnWCdcclxuICAvL3dpbmRvdy5sb2NhdGlvbi5zZWFyY2ggPSA/c2VuZG1haWw9ZmFsc2VcclxuICBjb25zdCBnZXRRdWVyeSA9XHJcbiAgICAhcHJvcHMudGVtcGxhdGVJZCAmJlxyXG4gICAgd2luZG93LmxvY2F0aW9uPy5zZWFyY2ggJiZcclxuICAgIHdpbmRvdy5sb2NhdGlvbj8uc2VhcmNoPy5zcGxpdChcIj9cIik7IC8vWycnLCdzZW5kbWFpbD1mYWxzZSddXHJcblxyXG4gIC8vJ3NlbmRtYWlsPWZhbHNlJ1xyXG4gIGlmIChnZXRRdWVyeSkge1xyXG4gICAgc2VuZG1haWwgPSBnZXRRdWVyeVsxXS5zcGxpdChcIj1cIilbMV07IC8vZmFsc2VcclxuICB9XHJcbiAgY29uc3QgY2hlY2tTcGxpdCA9IHJvdXRlICYmIHJvdXRlPy5zcGxpdChcIi9cIik7IC8vIFsnJywgJ2xvYWQnLCAncmVjaXBpZW50U2lnblBkZicsICdUT0FWdWhYYmZ3JywgJ2ZQQUtkSzFxZ1gnXVxyXG4gIGlmIChjaGVja1NwbGl0ICYmIGNoZWNrU3BsaXQubGVuZ3RoID4gNCkge1xyXG4gICAgaXNHdWVzdFNpZ25GbG93ID0gdHJ1ZTtcclxuICAgIGdldERvY0lkID0gY2hlY2tTcGxpdFszXTtcclxuICB9IGVsc2Uge1xyXG4gICAgZ2V0RG9jSWQgPSBjaGVja1NwbGl0WzJdO1xyXG4gIH1cclxuICBsZXQgZ2V0RG9jdW1lbnRJZCA9IGdldERvY0lkIHx8IGRvY3VtZW50SWQ7XHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmIChnZXREb2N1bWVudElkKSB7XHJcbiAgICAgIHNldERvY3VtZW50SWQoZ2V0RG9jdW1lbnRJZCk7XHJcbiAgICAgIGdldERvY3VtZW50RGV0YWlscyhnZXREb2N1bWVudElkKTtcclxuICAgIH0gZWxzZSBpZiAocHJvcHMudGVtcGxhdGVJZCkge1xyXG4gICAgICBnZXRUZW1wbGF0ZURldGFpbHMoKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbcHJvcHMudGVtcGxhdGVJZCwgZ2V0RG9jdW1lbnRJZF0pO1xyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCB1cGRhdGVTaXplID0gKCkgPT4ge1xyXG4gICAgICBpZiAoZGl2UmVmLmN1cnJlbnQpIHtcclxuICAgICAgICBjb25zdCBwZGZXaWR0aCA9IHBkZk5ld1dpZHRoRnVuKGRpdlJlZik7XHJcbiAgICAgICAgc2V0UGRmTmV3V2lkdGgocGRmV2lkdGgpO1xyXG4gICAgICAgIHNldENvbnRhaW5lcldIKHtcclxuICAgICAgICAgIHdpZHRoOiBkaXZSZWYuY3VycmVudC5vZmZzZXRXaWR0aCxcclxuICAgICAgICAgIGhlaWdodDogZGl2UmVmLmN1cnJlbnQub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gd2FpdCBmb3IgdGhlIHRyYW5zaXRpb24gdG8gY29tcGxldGVcclxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCh1cGRhdGVTaXplLCAxMDApOyAvLyBtYXRjaCB0aGUgdHJhbnNpdGlvbiBkdXJhdGlvblxyXG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lcik7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXHJcbiAgfSwgW2RpdlJlZi5jdXJyZW50LCBpc0hlYWRlcl0pO1xyXG4gIC8vZnVuY3Rpb24gdG8gdXNlIHJlc2VuZCBvdHAgZm9yIGVtYWlsIHZlcmlmaWNhdGlvblxyXG4gIGNvbnN0IGhhbmRsZVJlc2VuZCA9IGFzeW5jIChlKSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBzZXRPdHBMb2FkZXIodHJ1ZSk7XHJcbiAgICBjb25zdCBsb2NhbHVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgYFBhcnNlLyR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpfS9jdXJyZW50VXNlcmBcclxuICAgICk7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IEpTT04ucGFyc2UobG9jYWx1c2VyKTtcclxuICAgIGF3YWl0IGhhbmRsZVNlbmRPVFAoY3VycmVudFVzZXI/LmVtYWlsKTtcclxuICAgIHNldE90cExvYWRlcihmYWxzZSk7XHJcbiAgICBhbGVydCh0KFwib3RwLXNlbnQtYWxlcnRcIikpO1xyXG4gIH07XHJcbiAgLy9gaGFuZGxlVmVyaWZ5RW1haWxgIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdmVyaWZ5IGVtYWlsIHdpdGggb3RwXHJcbiAgY29uc3QgaGFuZGxlVmVyaWZ5RW1haWwgPSBhc3luYyAoZSkgPT4ge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgc2V0T3RwTG9hZGVyKHRydWUpO1xyXG4gICAgY29uc3QgbG9jYWx1c2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgIGBQYXJzZS8ke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKX0vY3VycmVudFVzZXJgXHJcbiAgICApO1xyXG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBKU09OLnBhcnNlKGxvY2FsdXNlcik7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNFbWFpbCA9IGF3YWl0IFBhcnNlLkNsb3VkLnJ1bihcInZlcmlmeWVtYWlsXCIsIHtcclxuICAgICAgICBvdHA6IG90cCxcclxuICAgICAgICBlbWFpbDogY3VycmVudFVzZXI/LmVtYWlsXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAocmVzRW1haWw/Lm1lc3NhZ2UgPT09IFwiRW1haWwgaXMgdmVyaWZpZWQuXCIpIHtcclxuICAgICAgICBzZXRJc0VtYWlsVmVyaWZpZWQodHJ1ZSk7XHJcbiAgICAgICAgYWxlcnQodChcIkVtYWlsLXZlcmlmaWVkLWFsZXJ0LTFcIikpO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc0VtYWlsPy5tZXNzYWdlID09PSBcIkVtYWlsIGlzIGFscmVhZHkgdmVyaWZpZWQuXCIpIHtcclxuICAgICAgICBzZXRJc0VtYWlsVmVyaWZpZWQodHJ1ZSk7XHJcbiAgICAgICAgYWxlcnQodChcIkVtYWlsLXZlcmlmaWVkLWFsZXJ0LTJcIikpO1xyXG4gICAgICB9XHJcbiAgICAgIHNldE90cChcIlwiKTtcclxuICAgICAgc2V0SXNWZXJpZnlNb2RhbChmYWxzZSk7XHJcbiAgICAgIC8vaGFuZGxlUmVjaXBpZW50U2lnbigpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgYWxlcnQoZXJyb3IubWVzc2FnZSk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICBzZXRPdHBMb2FkZXIoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgLy9gaGFuZGxlVmVyaWZ5QnRuYCBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgb3RwIG9uIHVzZXIgbWFpbFxyXG4gIGNvbnN0IGhhbmRsZVZlcmlmeUJ0biA9IGFzeW5jICgpID0+IHtcclxuICAgIHNldElzVmVyaWZ5TW9kYWwodHJ1ZSk7XHJcbiAgICBjb25zdCBsb2NhbHVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgYFBhcnNlLyR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpfS9jdXJyZW50VXNlcmBcclxuICAgICk7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IEpTT04ucGFyc2UobG9jYWx1c2VyKTtcclxuICAgIGF3YWl0IGhhbmRsZVNlbmRPVFAoY3VycmVudFVzZXI/LmVtYWlsKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVOYXZpZ2F0aW9uID0gKCkgPT4ge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi9zdWJzY3JpcHRpb25cIjtcclxuICB9O1xyXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrSXNTdWJzY3JpYmVkKGV4dFVzZXJJZCwgY29udGFjdElkKSB7XHJcbiAgICBjb25zdCBpc0d1ZXN0U2lnbiA9IGlzR3Vlc3RTaWduRmxvdyB8fCBmYWxzZTtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoU3Vic2NyaXB0aW9uKGV4dFVzZXJJZCwgY29udGFjdElkLCBpc0d1ZXN0U2lnbik7XHJcbiAgICBjb25zdCBwbGFuID0gcmVzLnBsYW47XHJcbiAgICBjb25zdCBiaWxsaW5nRGF0ZSA9IHJlcz8uYmlsbGluZ0RhdGU7XHJcbiAgICBjb25zdCBzdGF0dXMgPSByZXM/LnN0YXR1cztcclxuICAgIHNldFBsYW5Db2RlKHBsYW4pO1xyXG4gICAgaWYgKHBsYW4gPT09IFwiZnJlZXBsYW5cIikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAoYmlsbGluZ0RhdGUpIHtcclxuICAgICAgaWYgKG5ldyBEYXRlKGJpbGxpbmdEYXRlKSA+IG5ldyBEYXRlKCkpIHtcclxuICAgICAgICBzZXRJc1N1YnNjcmliZWQodHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGlzR3Vlc3RTaWduKSB7XHJcbiAgICAgICAgICBzZXRJc1N1YnNjcmlwdGlvbkV4cGlyZWQodHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGhhbmRsZU5hdmlnYXRpb24ocGxhbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGlzR3Vlc3RTaWduKSB7XHJcbiAgICAgIGlmIChzdGF0dXMpIHtcclxuICAgICAgICBzZXRJc1N1YnNjcmliZWQodHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0SXNTdWJzY3JpcHRpb25FeHBpcmVkKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaXNHdWVzdFNpZ24pIHtcclxuICAgICAgICBzZXRJc1N1YnNjcmlwdGlvbkV4cGlyZWQodHJ1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaGFuZGxlTmF2aWdhdGlvbihyZXMucGxhbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLy9mdW5jdGlvbiBmb3IgZ2V0IGRvY3VtZW50IGRldGFpbHMgZm9yIHBlcnRpY3VsYXIgc2lnbmVyIHdpdGggc2lnbmVyJ29iamVjdCBpZFxyXG4gIGNvbnN0IGdldFRlbXBsYXRlRGV0YWlscyA9IGFzeW5jICgpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgdGVtcGxhdGVJZDogcHJvcHMudGVtcGxhdGVJZCwgaXNwdWJsaWM6IHRydWUgfTtcclxuICAgICAgY29uc3QgdGVtcGxhdGVEZWF0aWxzID0gYXdhaXQgYXhpb3MucG9zdChcclxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2dldFRlbXBsYXRlYCxcclxuICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgICAgc2Vzc2lvbnRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBkb2N1bWVudERhdGEgPVxyXG4gICAgICAgIHRlbXBsYXRlRGVhdGlscy5kYXRhICYmIHRlbXBsYXRlRGVhdGlscy5kYXRhLnJlc3VsdFxyXG4gICAgICAgICAgPyBbdGVtcGxhdGVEZWF0aWxzLmRhdGEucmVzdWx0XVxyXG4gICAgICAgICAgOiBbXTtcclxuICAgICAgaWYgKGRvY3VtZW50RGF0YSAmJiBkb2N1bWVudERhdGFbMF0/LmVycm9yKSB7XHJcbiAgICAgICAgcHJvcHM/LnNldFRlbXBsYXRlU3RhdHVzKHtcclxuICAgICAgICAgIHN0YXR1czogXCJJbnZhbGlkXCJcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmIChkb2N1bWVudERhdGEgJiYgZG9jdW1lbnREYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAoZG9jdW1lbnREYXRhWzBdPy5Jc1B1YmxpYykge1xyXG4gICAgICAgICAgcHJvcHM/LnNldFRlbXBsYXRlU3RhdHVzKHtcclxuICAgICAgICAgICAgc3RhdHVzOiBcIlN1Y2Nlc3NcIlxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCB1cmwgPVxyXG4gICAgICAgICAgICBkb2N1bWVudERhdGFbMF0gJiZcclxuICAgICAgICAgICAgKGRvY3VtZW50RGF0YVswXT8uU2lnbmVkVXJsIHx8IGRvY3VtZW50RGF0YVswXT8uVVJMKTtcclxuICAgICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgLy9jb252ZXJ0IGRvY3VtZW50IHVybCBpbiBhcnJheSBidWZmZXIgZm9ybWF0IHRvIHVzZSBlbWJlZCB3aWRnZXRzIGluIHBkZiB1c2luZyBwZGYtbGliXHJcbiAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgY29udmVydFBkZkFycmF5QnVmZmVyKHVybCk7XHJcbiAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlciA9PT0gXCJFcnJvclwiKSB7XHJcbiAgICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHNldFBkZkFycmF5QnVmZmVyKGFycmF5QnVmZmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2V0SXNQdWJsaWNUZW1wbGF0ZSh0cnVlKTtcclxuICAgICAgICAgIGNvbnN0IGdldFB1YmxpY1JvbGUgPSBkb2N1bWVudERhdGFbMF0/LlB1YmxpY1JvbGVbMF07XHJcbiAgICAgICAgICBjb25zdCBnZXRVbmlxdWVJZERldGFpbHMgPSBkb2N1bWVudERhdGFbMF0/LlBsYWNlaG9sZGVycy5maW5kKFxyXG4gICAgICAgICAgICAoeCkgPT4geC5Sb2xlID09PSBnZXRQdWJsaWNSb2xlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKGdldFVuaXF1ZUlkRGV0YWlscykge1xyXG4gICAgICAgICAgICBzZXRVbmlxdWVJZChnZXRVbmlxdWVJZERldGFpbHMuSWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2V0U2lnbmVyUG9zKGRvY3VtZW50RGF0YVswXT8uUGxhY2Vob2xkZXJzKTtcclxuICAgICAgICAgIGxldCBwbGFjZWhvbGRlcnNPclNpZ25lcnMgPSBbXTtcclxuICAgICAgICAgIC8vIGNvbnN0IHBsYWNlaG9sZGVyID0gZG9jdW1lbnREYXRhWzBdPy5QbGFjZWhvbGRlcnM7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IHBsYWNlaG9sZGVyIG9mIGRvY3VtZW50RGF0YVswXS5QbGFjZWhvbGRlcnMpIHtcclxuICAgICAgICAgICAgLy9gZW1haWxFeGlzdGAgdmFyaWFibGUgdG8gaGFuZGxlIGNvbmRpdGlvbiBmb3IgcXVpY2sgc2VuZCBmbG93IGFuZCBzaG93IHVuc2lnbmVkIHNpZ25lcnMgbGlzdFxyXG4gICAgICAgICAgICBjb25zdCBzaWduZXJJZEV4aXN0ID0gcGxhY2Vob2xkZXI/LnNpZ25lck9iaklkO1xyXG4gICAgICAgICAgICBpZiAoc2lnbmVySWRFeGlzdCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGdldFNpZ25lckRhdGEgPSBkb2N1bWVudERhdGFbMF0uU2lnbmVycy5maW5kKFxyXG4gICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEub2JqZWN0SWQgPT09IHBsYWNlaG9sZGVyPy5zaWduZXJPYmpJZFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzT3JTaWduZXJzLnB1c2goZ2V0U2lnbmVyRGF0YSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzT3JTaWduZXJzLnB1c2gocGxhY2Vob2xkZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzZXRVblNpZ25lZFNpZ25lcnMocGxhY2Vob2xkZXJzT3JTaWduZXJzKTtcclxuICAgICAgICAgIHNldFBkZkRldGFpbHMoZG9jdW1lbnREYXRhKTtcclxuICAgICAgICAgIHNldElzTG9hZGluZyh7XHJcbiAgICAgICAgICAgIGlzTG9hZDogZmFsc2VcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwcm9wcz8uc2V0VGVtcGxhdGVTdGF0dXMoe1xyXG4gICAgICAgICAgICBzdGF0dXM6IFwiUHJpdmF0ZVwiXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJvcHM/LnNldFRlbXBsYXRlU3RhdHVzKHtcclxuICAgICAgICAgIHN0YXR1czogXCJJbnZhbGlkXCJcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGdldCB0ZW1wbGF0ZSBkZXRhaWxzIFwiLCBlcnIpO1xyXG4gICAgICBpZiAoZXJyPy5yZXNwb25zZT8uZGF0YT8uY29kZSA9PT0gMTAxKSB7XHJcbiAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcImVycm9yLXRlbXBsYXRlXCIpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIGdldCBkb2N1bWVudCBkZXRhaWxzIGZvciBwZXJ0aWN1bGFyIHNpZ25lciB3aXRoIHNpZ25lcidvYmplY3QgaWRcclxuICBjb25zdCBnZXREb2N1bWVudERldGFpbHMgPSBhc3luYyAoZG9jSWQsIGlzTmV4dFVzZXIpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHNlbmRlclVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBqc29uU2VuZGVyID0gSlNPTi5wYXJzZShzZW5kZXJVc2VyKTtcclxuICAgICAgbGV0IGN1cnJVc2VySWQ7XHJcbiAgICAgIC8vZ2V0dGluZyBkb2N1bWVudCBkZXRhaWxzXHJcbiAgICAgIGNvbnN0IGRvY3VtZW50RGF0YSA9IGF3YWl0IGNvbnRyYWN0RG9jdW1lbnQoZG9jdW1lbnRJZCB8fCBkb2NJZCk7XHJcbiAgICAgIGlmIChkb2N1bWVudERhdGEgJiYgZG9jdW1lbnREYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCB1cmwgPVxyXG4gICAgICAgICAgZG9jdW1lbnREYXRhWzBdICYmXHJcbiAgICAgICAgICAoZG9jdW1lbnREYXRhWzBdPy5TaWduZWRVcmwgfHwgZG9jdW1lbnREYXRhWzBdPy5VUkwpO1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgIC8vY29udmVydCBkb2N1bWVudCB1cmwgaW4gYXJyYXkgYnVmZmVyIGZvcm1hdCB0byB1c2UgZW1iZWQgd2lkZ2V0cyBpbiBwZGYgdXNpbmcgcGRmLWxpYlxyXG4gICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBjb252ZXJ0UGRmQXJyYXlCdWZmZXIodXJsKTtcclxuICAgICAgICAgIGlmIChhcnJheUJ1ZmZlciA9PT0gXCJFcnJvclwiKSB7XHJcbiAgICAgICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldFBkZkFycmF5QnVmZmVyKGFycmF5QnVmZmVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRFeHRVc2VySWQoZG9jdW1lbnREYXRhWzBdPy5FeHRVc2VyUHRyPy5vYmplY3RJZCk7XHJcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPVxyXG4gICAgICAgICAgZG9jdW1lbnREYXRhWzBdLklzQ29tcGxldGVkICYmIGRvY3VtZW50RGF0YVswXS5Jc0NvbXBsZXRlZDtcclxuICAgICAgICBjb25zdCBleHBpcmVEYXRlID0gZG9jdW1lbnREYXRhWzBdLkV4cGlyeURhdGUuaXNvO1xyXG4gICAgICAgIGNvbnN0IGRlY2xpbmVkID1cclxuICAgICAgICAgIGRvY3VtZW50RGF0YVswXS5Jc0RlY2xpbmVkICYmIGRvY3VtZW50RGF0YVswXS5Jc0RlY2xpbmVkO1xyXG4gICAgICAgIGNvbnN0IGV4cGlyZVVwZGF0ZURhdGUgPSBuZXcgRGF0ZShleHBpcmVEYXRlKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgY29uc3QgY3VyckRhdGUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICBjb25zdCBnZXRTaWduZXJzID0gZG9jdW1lbnREYXRhWzBdLlNpZ25lcnM7XHJcbiAgICAgICAgY29uc3QgZ2V0Q3VycmVudFNpZ25lciA9XHJcbiAgICAgICAgICBnZXRTaWduZXJzICYmXHJcbiAgICAgICAgICBnZXRTaWduZXJzLmZpbHRlcihcclxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEuVXNlcklkLm9iamVjdElkID09PSBqc29uU2VuZGVyPy5vYmplY3RJZFxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY3VyclVzZXJJZCA9IGdldEN1cnJlbnRTaWduZXJbMF0gPyBnZXRDdXJyZW50U2lnbmVyWzBdLm9iamVjdElkIDogXCJcIjtcclxuICAgICAgICBpZiAoaXNFbmFibGVTdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgIGF3YWl0IGNoZWNrSXNTdWJzY3JpYmVkKFxyXG4gICAgICAgICAgICBkb2N1bWVudERhdGFbMF0/LkV4dFVzZXJQdHI/Lm9iamVjdElkLFxyXG4gICAgICAgICAgICBjdXJyVXNlcklkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VyclVzZXJJZCkge1xyXG4gICAgICAgICAgc2V0U2lnbmVyT2JqZWN0SWQoY3VyclVzZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkb2N1bWVudERhdGFbMF0uU2lnbmVkVXJsKSB7XHJcbiAgICAgICAgICBzZXRQZGZVcmwoZG9jdW1lbnREYXRhWzBdLlNpZ25lZFVybCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNldFBkZlVybChkb2N1bWVudERhdGFbMF0uVVJMKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzQ29tcGxldGVkKSB7XHJcbiAgICAgICAgICBzZXRJc1NpZ25lZCh0cnVlKTtcclxuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IGlzQ2VydGlmaWNhdGU6IHRydWUsIGlzTW9kYWw6IHRydWUgfTtcclxuICAgICAgICAgIHNldEFscmVhZHlTaWduKHRydWUpO1xyXG4gICAgICAgICAgc2V0SXNDb21wbGV0ZWQoZGF0YSk7XHJcbiAgICAgICAgICBzZXRJc0NlbGVicmF0aW9uKHRydWUpO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBzZXRJc0NlbGVicmF0aW9uKGZhbHNlKSwgNTAwMCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkZWNsaW5lZCkge1xyXG4gICAgICAgICAgY29uc3QgY3VycmVudERlY2xpbmUgPSB7XHJcbiAgICAgICAgICAgIGN1cnJudDogXCJhbm90aGVyXCIsXHJcbiAgICAgICAgICAgIGlzRGVjbGluZWQ6IHRydWVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBzZXRJc0RlY2xpbmUoY3VycmVudERlY2xpbmUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY3VyckRhdGUgPiBleHBpcmVVcGRhdGVEYXRlKSB7XHJcbiAgICAgICAgICBjb25zdCBleHBpcmVEYXRlRm9ybWF0ID0gbW9tZW50KG5ldyBEYXRlKGV4cGlyZURhdGUpKS5mb3JtYXQoXHJcbiAgICAgICAgICAgIFwiTU1NIERELCBZWVlZXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBzZXRJc0V4cGlyZWQodHJ1ZSk7XHJcbiAgICAgICAgICBzZXRFeHBpcmVkRGF0ZShleHBpcmVEYXRlRm9ybWF0KTtcclxuICAgICAgICB9IC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHNpZ25lciBpcyBub3QgYSBsYXN0IHNpZ25lciBhbmQgaGFuZGxlIHRoZSBjb21wbGV0ZSBtZXNzYWdlLlxyXG4gICAgICAgIGVsc2UgaWYgKGlzTmV4dFVzZXIpIHtcclxuICAgICAgICAgIHNldElzQ2VsZWJyYXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHNldElzQ2VsZWJyYXRpb24oZmFsc2UpLCA1MDAwKTtcclxuICAgICAgICAgIHNldElzQ29tcGxldGVkKHtcclxuICAgICAgICAgICAgaXNNb2RhbDogdHJ1ZSxcclxuICAgICAgICAgICAgbWVzc2FnZTogdChcImRvY3VtZW50LXNpZ25lZC1hbGVydC0xXCIpXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGN1cnJVc2VySWQpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJyZW50VXNlciA9IGRvY3VtZW50RGF0YVswXS5QbGFjZWhvbGRlcnMuZmluZChcclxuICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YT8uc2lnbmVyT2JqSWQgPT09IGN1cnJVc2VySWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKGNoZWNrQ3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgICBzZXRDdXJyZW50U2lnbmVyKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGF1ZGl0dHJhaWxEYXRhID1cclxuICAgICAgICAgIGRvY3VtZW50RGF0YVswXS5BdWRpdFRyYWlsICYmXHJcbiAgICAgICAgICBkb2N1bWVudERhdGFbMF0uQXVkaXRUcmFpbC5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICBkb2N1bWVudERhdGFbMF0uQXVkaXRUcmFpbC5maWx0ZXIoXHJcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLkFjdGl2aXR5ID09PSBcIlNpZ25lZFwiXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBjaGVja0FscmVhZHlTaWduID1cclxuICAgICAgICAgIGRvY3VtZW50RGF0YVswXS5BdWRpdFRyYWlsICYmXHJcbiAgICAgICAgICBkb2N1bWVudERhdGFbMF0uQXVkaXRUcmFpbC5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICBkb2N1bWVudERhdGFbMF0uQXVkaXRUcmFpbC5maWx0ZXIoXHJcbiAgICAgICAgICAgIChkYXRhKSA9PlxyXG4gICAgICAgICAgICAgIGRhdGEuVXNlclB0cj8ub2JqZWN0SWQgPT09IGN1cnJVc2VySWQgJiZcclxuICAgICAgICAgICAgICBkYXRhLkFjdGl2aXR5ID09PSBcIlNpZ25lZFwiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGNoZWNrQWxyZWFkeVNpZ24gJiZcclxuICAgICAgICAgIGNoZWNrQWxyZWFkeVNpZ25bMF0gJiZcclxuICAgICAgICAgIGNoZWNrQWxyZWFkeVNpZ24ubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2V0QWxyZWFkeVNpZ24odHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9iaiA9IGRvY3VtZW50RGF0YT8uWzBdO1xyXG4gICAgICAgICAgc2V0U2VuZEluT3JkZXIob2JqPy5TZW5kaW5PcmRlciB8fCBmYWxzZSk7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIG9iaiAmJlxyXG4gICAgICAgICAgICBvYmouU2lnbmVycyAmJlxyXG4gICAgICAgICAgICBvYmouU2lnbmVycy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgIG9iai5QbGFjZWhvbGRlcnMgJiZcclxuICAgICAgICAgICAgb2JqLlBsYWNlaG9sZGVycy5sZW5ndGggPiAwXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICAgIGV2ZW50OiBcInZpZXdlZFwiLFxyXG4gICAgICAgICAgICAgIGNvbnRhY3RJZDogY3VyclVzZXJJZCxcclxuICAgICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogZG9jdW1lbnREYXRhPy5bMF0ub2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBmaWxlOiBkb2N1bWVudERhdGE/LlswXT8uU2lnbmVkVXJsIHx8IGRvY3VtZW50RGF0YT8uWzBdPy5VUkwsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBkb2N1bWVudERhdGE/LlswXS5OYW1lLFxyXG4gICAgICAgICAgICAgICAgbm90ZTogZG9jdW1lbnREYXRhPy5bMF0uTm90ZSB8fCBcIlwiLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRvY3VtZW50RGF0YT8uWzBdLkRlc2NyaXB0aW9uIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBzaWduZXJzOiBkb2N1bWVudERhdGE/LlswXS5TaWduZXJzPy5tYXAoKHgpID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHg/Lk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiB4Py5FbWFpbCxcclxuICAgICAgICAgICAgICAgICAgcGhvbmU6IHg/LlBob25lXHJcbiAgICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgICAgICB2aWV3ZWRCeToganNvblNlbmRlci5lbWFpbCxcclxuICAgICAgICAgICAgICAgIHZpZXdlZEF0OiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBkb2N1bWVudERhdGE/LlswXS5jcmVhdGVkQXRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IGF4aW9zLnBvc3QoXHJcbiAgICAgICAgICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2NhbGx3ZWJob29rYCxcclxuICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb250b2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnIgXCIsIGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzaWduZXJzID0gW107XHJcbiAgICAgICAgbGV0IHVuU2lnbmVkU2lnbmVyID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyc09yU2lnbmVycyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgcGxhY2Vob2xkZXIgb2YgZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycykge1xyXG4gICAgICAgICAgLy9gZW1haWxFeGlzdGAgdmFyaWFibGUgdG8gaGFuZGxlIGNvbmRpdGlvbiBmb3IgcXVpY2sgc2VuZCBmbG93IGFuZCBzaG93IHVuc2lnbmVkIHNpZ25lcnMgbGlzdFxyXG4gICAgICAgICAgY29uc3Qgc2lnbmVySWRFeGlzdCA9IHBsYWNlaG9sZGVyPy5zaWduZXJPYmpJZDtcclxuICAgICAgICAgIGlmIChzaWduZXJJZEV4aXN0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdldFNpZ25lckRhdGEgPSBkb2N1bWVudERhdGFbMF0uU2lnbmVycy5maW5kKFxyXG4gICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLm9iamVjdElkID09PSBwbGFjZWhvbGRlcj8uc2lnbmVyT2JqSWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXJzT3JTaWduZXJzLnB1c2goZ2V0U2lnbmVyRGF0YSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcnNPclNpZ25lcnMucHVzaChwbGFjZWhvbGRlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIGFscmVhZHkgc2lnbmVkIGRvY3VtZW50IGJ5IHNvbWVvbmVcclxuICAgICAgICBpZiAoYXVkaXR0cmFpbERhdGEgJiYgYXVkaXR0cmFpbERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgc2V0SXNEb2NJZCh0cnVlKTtcclxuXHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGxhY2Vob2xkZXJzT3JTaWduZXJzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrRW1haWwgPSBpdGVtPy5lbWFpbDtcclxuICAgICAgICAgICAgLy9pZiBlbWFpbCBleGlzdCB0aGVuIGNvbXBhcmUgdXNlciBzaWduZWQgYnkgdXNpbmcgZW1haWwgZWxzZSBzaWduZXJzIG9iamVjdElkXHJcbiAgICAgICAgICAgIGNvbnN0IGVtYWlsT3JJZCA9IGNoZWNrRW1haWwgPyBpdGVtLmVtYWlsIDogaXRlbT8ub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgIC8vYGlzU2lnbmVkU2lnbmF0dXJlYCB2YXJpYWJsZSB0byBoYW5kbGUgYnJlYWsgbG9vcCB3aGVuZXZlciBpdCBnZXQgdHJ1ZVxyXG4gICAgICAgICAgICBsZXQgaXNTaWduZWRTaWduYXR1cmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy9jaGVja2luZyB0aGUgc2lnbmVyIHdobyBzaWduZWQgdGhlIGRvY3VtZW50IGJ5IHVzaW5nIGF1ZGl0IHRyYWlsIGRldGFpbHMuXHJcbiAgICAgICAgICAgIC8vYW5kIHNhdmUgc2lnbmVkU2lnbmVycyBhbmQgdW5zaWduZWRTaWduZXJzIGRldGFpbHNcclxuICAgICAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgYXVkaXR0cmFpbERhdGEpIHtcclxuICAgICAgICAgICAgICBjb25zdCBzaWduZWRFeGlzdCA9IGNoZWNrRW1haWxcclxuICAgICAgICAgICAgICAgID8gZG9jPy5Vc2VyUHRyPy5FbWFpbFxyXG4gICAgICAgICAgICAgICAgOiBkb2M/LlVzZXJQdHI/Lm9iamVjdElkO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZW1haWxPcklkID09PSBzaWduZWRFeGlzdCkge1xyXG4gICAgICAgICAgICAgICAgc2lnbmVycy5wdXNoKHsgLi4uaXRlbSB9KTtcclxuICAgICAgICAgICAgICAgIGlzU2lnbmVkU2lnbmF0dXJlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWlzU2lnbmVkU2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICAgICAgdW5TaWduZWRTaWduZXIucHVzaCh7IC4uLml0ZW0gfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNldFNpZ25lZFNpZ25lcnMoc2lnbmVycyk7XHJcbiAgICAgICAgICBzZXRVblNpZ25lZFNpZ25lcnModW5TaWduZWRTaWduZXIpO1xyXG4gICAgICAgICAgc2V0U2lnbmVyUG9zKGRvY3VtZW50RGF0YVswXS5QbGFjZWhvbGRlcnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIGlzIHNob3cgdGhlcmUgYXJlIG5vIGRldGFpbHMgaW4gYXVkaXQgdHJhaWwgdGhlbiBkaXJlY3QgcHVzaCBhbGwgc2lnbmVycyBkZXRhaWxzXHJcbiAgICAgICAgICAvL2luIHVuc2lnbmVkc2lnbmVycyBhcnJheVxyXG4gICAgICAgICAgc2V0VW5TaWduZWRTaWduZXJzKHBsYWNlaG9sZGVyc09yU2lnbmVycyk7XHJcbiAgICAgICAgICBzZXRTaWduZXJQb3MoZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFBkZkRldGFpbHMoZG9jdW1lbnREYXRhKTtcclxuICAgICAgICAvL2NoZWNraW5nIGlmIGNvbmRpdGlvbiBjdXJyZW50IHVzZXIgYWxyZWFkeSBzaWduIG9yIG93bmVyIGRvZXMgbm90IGV4aXN0IGFzIGEgc2lnbmVyIG9yIGRvY3VtZW50IGhhcyBiZWVuIGRlY2xpbmVkIGJ5IHNvbWVvbmUgb3IgZG9jdW1lbnQgaGFzIGJlZW4gZXhwaXJlZFxyXG4gICAgICAgIC8vdGhlbiBzdG9wIHRvIGRpc3BsYXkgdG91ciBtZXNzYWdlXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgKGNoZWNrQWxyZWFkeVNpZ24gJiZcclxuICAgICAgICAgICAgY2hlY2tBbHJlYWR5U2lnblswXSAmJlxyXG4gICAgICAgICAgICBjaGVja0FscmVhZHlTaWduLmxlbmd0aCA+IDApIHx8XHJcbiAgICAgICAgICAhY3VyclVzZXJJZCB8fFxyXG4gICAgICAgICAgZGVjbGluZWQgfHxcclxuICAgICAgICAgIGN1cnJEYXRlID4gZXhwaXJlVXBkYXRlRGF0ZVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgc2V0UmVxdWVzdFNpZ25Ub3VyKHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIHRvIGNoZWNrIGN1cnJlbnQgdXNlciBleGlzdCBpbiBjb250cmFjdHNfVXNlcnMgY2xhc3MgYW5kIGNoZWNrIHRvdXIgbWVzc2FnZSBzdGF0dXNcclxuICAgICAgICAgIC8vaWYgbm90IHRoZW4gY2hlY2sgdXNlciBleGlzdCBpbiBjb250cmFjdHNfQ29udGFjdGJvb2sgY2xhc3MgYW5kIGNoZWNrIHRvdXIgbWVzc2FnZSBzdGF0dVxyXG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY29udHJhY3RVc2VycygpO1xyXG4gICAgICAgICAgaWYgKHJlcyA9PT0gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpIHtcclxuICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChyZXNbMF0gJiYgcmVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgc2V0Q29udHJhY3ROYW1lKFwiX1VzZXJzXCIpO1xyXG4gICAgICAgICAgICBjdXJyVXNlcklkID0gcmVzWzBdLm9iamVjdElkO1xyXG4gICAgICAgICAgICBzZXRTaWduZXJVc2VySWQoY3VyclVzZXJJZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvdXJEYXRhID0gcmVzWzBdLlRvdXJTdGF0dXMgJiYgcmVzWzBdLlRvdXJTdGF0dXM7XHJcbiAgICAgICAgICAgIGlmICh0b3VyRGF0YSAmJiB0b3VyRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tUb3VyUmVxdWVzdCA9IHRvdXJEYXRhLmZpbHRlcihcclxuICAgICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhPy5yZXF1ZXN0U2lnblxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgc2V0VG91clN0YXR1cyh0b3VyRGF0YSk7XHJcbiAgICAgICAgICAgICAgc2V0UmVxdWVzdFNpZ25Ub3VyKGNoZWNrVG91clJlcXVlc3RbMF0/LnJlcXVlc3RTaWduIHx8IGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmIChyZXM/Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjb250YWN0Qm9vayhjdXJyVXNlcklkKTtcclxuICAgICAgICAgICAgaWYgKHJlcyA9PT0gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpIHtcclxuICAgICAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzWzBdICYmIHJlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICBzZXRDb250cmFjdE5hbWUoXCJfQ29udGFjdGJvb2tcIik7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSByZXNbMF0ub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgICAgc2V0U2lnbmVyVXNlcklkKG9iamVjdElkKTtcclxuICAgICAgICAgICAgICBjb25zdCB0b3VyRGF0YSA9IHJlc1swXS5Ub3VyU3RhdHVzICYmIHJlc1swXS5Ub3VyU3RhdHVzO1xyXG4gICAgICAgICAgICAgIGlmICh0b3VyRGF0YSAmJiB0b3VyRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja1RvdXJSZXF1ZXN0ID0gdG91ckRhdGEuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YT8ucmVxdWVzdFNpZ25cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBzZXRUb3VyU3RhdHVzKHRvdXJEYXRhKTtcclxuICAgICAgICAgICAgICAgIHNldFJlcXVlc3RTaWduVG91cihjaGVja1RvdXJSZXF1ZXN0WzBdPy5yZXF1ZXN0U2lnbiB8fCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwidXNlci1ub3QtZXhpc3RcIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldElzVWlMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICBkb2N1bWVudERhdGEgPT09IFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiIHx8XHJcbiAgICAgICAgKGRvY3VtZW50RGF0YS5yZXN1bHQgJiYgZG9jdW1lbnREYXRhLnJlc3VsdC5lcnJvcilcclxuICAgICAgKSB7XHJcbiAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgIHNldElzTG9hZGluZyh7IGlzTG9hZDogZmFsc2UgfSk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gIGdldERvY3VtZW50IGNsb3VkIGZ1bmN0aW9uIFwiKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwibm8tZGF0YVwiKSk7XHJcbiAgICAgICAgc2V0SXNVaUxvYWRpbmcoeyBpc0xvYWQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vZnVuY3Rpb24gdG8gZ2V0IGRlZmF1bHQgc2lnbmF0dXIgZW9mIGN1cnJlbnQgdXNlciBmcm9tIGBjb250cmFjdHNfU2lnbmF0dXJlYCBjbGFzc1xyXG4gICAgICBjb25zdCBkZWZhdWx0U2lnblJlcyA9IGF3YWl0IGdldERlZmF1bHRTaWduYXR1cmUoanNvblNlbmRlci5vYmplY3RJZCk7XHJcbiAgICAgIGlmIChkZWZhdWx0U2lnblJlcz8uc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgIHNldERlZmF1bHRTaWduSW1nKGRlZmF1bHRTaWduUmVzPy5yZXM/LmRlZmF1bHRTaWduYXR1cmUpO1xyXG4gICAgICAgIHNldE15SW5pdGlhbChkZWZhdWx0U2lnblJlcz8ucmVzPy5kZWZhdWx0SW5pdGlhbCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdFNpZ25SZXM/LnN0YXR1cyA9PT0gXCJlcnJvclwiKSB7XHJcbiAgICAgICAgc2V0SGFuZGxlRXJyb3IoXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHNldElzTG9hZGluZyh7IGlzTG9hZDogZmFsc2UgfSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJFcnJvcjogZXJyb3IgaW4gZ2V0RG9jdW1lbnREZXRhaWxzXCIsIGVycik7XHJcbiAgICAgIHNldEhhbmRsZUVycm9yKFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiKTtcclxuICAgICAgc2V0SXNMb2FkaW5nKHsgaXNMb2FkOiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIGVtYmVkIHNpZ25hdHVyZSBvciBpbWFnZSB1cmwgaW4gcGRmXHJcbiAgYXN5bmMgZnVuY3Rpb24gZW1iZWRXaWRnZXRzRGF0YSgpIHtcclxuICAgIC8vZm9yIGVtYWlsVmVyaWZpZWQgZGF0YSBjaGVja2luZyBmaXJzdCBpbiBsb2NhbHN0b3JhZ2VcclxuICAgIGNvbnN0IGxvY2FsdXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGxldCBjdXJyZW50VXNlciA9IEpTT04ucGFyc2UobG9jYWx1c2VyKTtcclxuICAgIC8vaWYgZW1haWxWZXJpZmllZCBkYXRhIGlzIG5vdCBwcmVzZW50IGluIGxvY2FsIHVzZXIgZGV0YWlscyB0aGVuIGZldGNoIGFnYWluIGluIF9Vc2VyIGNsYXNzXHJcbiAgICBpZiAoIWN1cnJlbnRVc2VyPy5lbWFpbFZlcmlmaWVkKSB7XHJcbiAgICAgIGNvbnN0IHVzZXJRdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShQYXJzZS5Vc2VyKTtcclxuICAgICAgY29uc3QgZ2V0VXNlciA9IGF3YWl0IHVzZXJRdWVyeS5nZXQoY3VycmVudFVzZXI/Lm9iamVjdElkLCB7XHJcbiAgICAgICAgc2Vzc2lvblRva2VuOiBjdXJyZW50VXNlcj8uc2Vzc2lvblRva2VuXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoZ2V0VXNlcikge1xyXG4gICAgICAgIGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnZXRVc2VyKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBpc0VtYWlsVmVyaWZpZWQgPSBjdXJyZW50VXNlcj8uZW1haWxWZXJpZmllZDtcclxuICAgIC8vY2hlY2sgaWYgaXNFbWFpbFZlcmlmaWVkIHRoZW4gZ28gb24gbmV4dCBzdGVwXHJcbiAgICBpZiAoaXNFbWFpbFZlcmlmaWVkKSB7XHJcbiAgICAgIHNldElzRW1haWxWZXJpZmllZChpc0VtYWlsVmVyaWZpZWQpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrVXNlciA9IHNpZ25lclBvcy5maWx0ZXIoXHJcbiAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChjaGVja1VzZXIgJiYgY2hlY2tVc2VyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBjaGVja2JveEV4aXN0LFxyXG4gICAgICAgICAgICByZXF1aXJlZFJhZGlvLFxyXG4gICAgICAgICAgICBzaG93QWxlcnQgPSBmYWxzZSxcclxuICAgICAgICAgICAgd2lkZ2V0S2V5LFxyXG4gICAgICAgICAgICByYWRpb0V4aXN0LFxyXG4gICAgICAgICAgICByZXF1aXJlZENoZWNrYm94LFxyXG4gICAgICAgICAgICBUb3VyUGFnZU51bWJlcjsgLy8gYHBhZ2VOdW1iZXJgIGlzIHVzZWQgdG8gY2hlY2sgb24gd2hpY2ggcGFnZSB1c2VyIGRpZCBub3QgZmlsbCB3aWRnZXQncyBkYXRhIHRoZW4gY2hhbmdlIGN1cnJlbnQgcGFnZU51bWJlciBhbmQgc2hvdyB0b3VyIG1lc3NhZ2Ugb24gdGhhdCBwYWdlXHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgLy9nZXQgY3VycmVudCBwYWdlXHJcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlUGFnZSA9IGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXT8ucGFnZU51bWJlcjtcclxuICAgICAgICAgICAgICAvL2NoZWNraW5nIGNoZWNib3ggdHlwZSB3aWRnZXRcclxuICAgICAgICAgICAgICBjaGVja2JveEV4aXN0ID1cclxuICAgICAgICAgICAgICAgIGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXS5wb3Nbal0udHlwZSA9PT0gXCJjaGVja2JveFwiO1xyXG4gICAgICAgICAgICAgIC8vY2hlY2tpbmcgcmFkaW8gYnV0dG9uIHR5cGUgd2lkZ2V0XHJcbiAgICAgICAgICAgICAgcmFkaW9FeGlzdCA9XHJcbiAgICAgICAgICAgICAgICBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zW2pdLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0O1xyXG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIGNoZWNrYm94IHdpZGdldCBleGlzdCBvciBub3RcclxuICAgICAgICAgICAgICBpZiAoY2hlY2tib3hFeGlzdCkge1xyXG4gICAgICAgICAgICAgICAgLy9nZXQgYWxsIHJlcXVpcmVkIHR5cGUgY2hlY2tib3hcclxuICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2hlY2tib3ggPSBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICFwb3NpdGlvbi5vcHRpb25zPy5pc1JlYWRPbmx5ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24udHlwZSA9PT0gXCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgLy9pZiByZXF1aXJlZCB0eXBlIGNoZWNrYm94IGRhdGEgZXhpdCB0aGVuIGNoZWNrIHVzZXIgY2hlY2tlZCBhbGwgY2hlY2tib3ggb3Igc29tZSBjaGVja2JveCByZW1haW4gdG8gY2hlY2tcclxuICAgICAgICAgICAgICAgIC8vYWxzbyB2YWxpZGF0ZSB0byBtaW5pbXVtIGFuZCBtYXhpbXVtIHJlcXVpcmVkIGNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRDaGVja2JveCAmJiByZXF1aXJlZENoZWNrYm94Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1aXJlZENoZWNrYm94Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9nZXQgbWluaW11bSByZXF1aXJlZCBjb3VudCBpZiAgZXhpdFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbkNvdW50ID1cclxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2hlY2tib3hbaV0ub3B0aW9ucz8udmFsaWRhdGlvbj8ubWluUmVxdWlyZWRDb3VudDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZU1pbiA9IG1pbkNvdW50ICYmIHBhcnNlSW50KG1pbkNvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAvL2dldCBtYXhpbXVtIHJlcXVpcmVkIGNvdW50IGlmICBleGl0XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4Q291bnQgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRDaGVja2JveFtpXS5vcHRpb25zPy52YWxpZGF0aW9uPy5tYXhSZXF1aXJlZENvdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlTWF4ID0gbWF4Q291bnQgJiYgcGFyc2VJbnQobWF4Q291bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vaW4gYHJlc3BvbnNlYCB2YXJpYWJsZSBpcyB1c2VkIHRvIGdldCBob3cgbWFueSBjaGVja2JveCBjaGVja2VkIGJ5IHVzZXJcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZENoZWNrYm94W2ldLm9wdGlvbnM/LnJlc3BvbnNlPy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9pbiBgZGVmYXVsdFZhbHVlYCB2YXJpYWJsZSBpcyB1c2VkIHRvIGdldCBob3cgbWFueSBjaGVja2JveCBjaGVja2VkIGJ5IGRlZmF1bHRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRDaGVja2JveFtpXS5vcHRpb25zPy5kZWZhdWx0VmFsdWU/Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbmRpdGlvbiB0byBjaGVjayAgcGFyc2VNaW4gIGFuZCBwYXJzZU1heCBncmVhdGVyIHRoYW4gMCAgdGhlbiBjb25zaWRlciBpdCBhcyBhIHJlcXVpcmVkIGNoZWNrIGJveFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTWluID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFyc2VNYXggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAhcmVzcG9uc2UgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICFkZWZhdWx0VmFsdWUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICFzaG93QWxlcnRcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHNob3dBbGVydCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRLZXkgPSByZXF1aXJlZENoZWNrYm94W2ldLmtleTtcclxuICAgICAgICAgICAgICAgICAgICAgIFRvdXJQYWdlTnVtYmVyID0gdXBkYXRlUGFnZTtcclxuICAgICAgICAgICAgICAgICAgICAgIHNldG1pblJlcXVpcmVkQ291bnQocGFyc2VNaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIHRvIHZhbGlkYXRlIG1pbmltdW0gcmVxdWlyZWQgY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTWluID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgKHBhcnNlTWluID4gcmVzcG9uc2UgfHwgIXJlc3BvbnNlKVxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93QWxlcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FsZXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0S2V5ID0gcmVxdWlyZWRDaGVja2JveFtpXS5rZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRvdXJQYWdlTnVtYmVyID0gdXBkYXRlUGFnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0bWluUmVxdWlyZWRDb3VudChwYXJzZU1pbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIHJhZGlvIHdpZGdldCBleGlzdCBvciBub3RcclxuICAgICAgICAgICAgICBlbHNlIGlmIChyYWRpb0V4aXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBhbGwgcmVxdWlyZWQgdHlwZSByYWRpbyBidXR0b25cclxuICAgICAgICAgICAgICAgIHJlcXVpcmVkUmFkaW8gPSBjaGVja1VzZXJbMF0ucGxhY2VIb2xkZXJbaV0ucG9zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgKHBvc2l0aW9uKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICFwb3NpdGlvbi5vcHRpb25zPy5pc1JlYWRPbmx5ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24udHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXRcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAvL2lmIHJlcXVpcmVkIHR5cGUgcmFkaW8gZGF0YSBleGl0IHRoZW4gY2hlY2sgdXNlciBjaGVja2VkIGFsbCByYWRpbyBidXR0b24gb3Igc29tZSByYWRpbyByZW1haW4gdG8gY2hlY2tcclxuICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFJhZGlvICYmIHJlcXVpcmVkUmFkaW8/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrU2lnbmVkO1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVpcmVkUmFkaW8/Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTaWduZWQgPSByZXF1aXJlZFJhZGlvW2ldPy5vcHRpb25zPy5yZXNwb25zZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrU2lnbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tEZWZhdWx0U2lnbmVkID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRSYWRpb1tpXT8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0RlZmF1bHRTaWduZWQgJiYgIXNob3dBbGVydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QWxlcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRLZXkgPSByZXF1aXJlZFJhZGlvW2ldLmtleTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVG91clBhZ2VOdW1iZXIgPSB1cGRhdGVQYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRtaW5SZXF1aXJlZENvdW50KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIHRvIGNoZWNrIGFsbCB0eXBlIHdpZGdldCBkYXRhIGZpbGwgb3Igbm90IGV4Y2VwdCBjaGVja2JveCBhbmQgcmFkaW8gYnV0dG9uXHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBhbGwgcmVxdWlyZWQgdHlwZSB3aWRnZXRzIGV4Y2VwdCBjaGVja2JveCBhbmQgcmFkaW9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkV2lkZ2V0cyA9IGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXS5wb3MuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAocG9zaXRpb24pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24ub3B0aW9ucz8uc3RhdHVzID09PSBcInJlcXVpcmVkXCIgJiZcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi50eXBlICE9PSByYWRpb0J1dHRvbldpZGdldCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnR5cGUgIT09IFwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZFdpZGdldHMgJiYgcmVxdWlyZWRXaWRnZXRzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBjaGVja1NpZ25lZDtcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1aXJlZFdpZGdldHM/Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTaWduZWQgPSByZXF1aXJlZFdpZGdldHNbaV0/Lm9wdGlvbnM/LnJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tTaWduZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrU2lnblVybCA9IHJlcXVpcmVkV2lkZ2V0c1tpXT8ucG9zPy5TaWduVXJsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja1NpZ25VcmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrRGVmYXVsdFNpZ25lZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRXaWRnZXRzW2ldPy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tEZWZhdWx0U2lnbmVkICYmICFzaG93QWxlcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWxlcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldEtleSA9IHJlcXVpcmVkV2lkZ2V0c1tpXS5rZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVG91clBhZ2VOdW1iZXIgPSB1cGRhdGVQYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldG1pblJlcXVpcmVkQ291bnQobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy93aGVuIHNob3dBbGVydCBpcyB0cnVlIHRoZW4gYnJlYWsgdGhlIGxvb3AgYW5kIHNob3cgYWxlcnQgdG8gZmlsbCByZXF1aXJlZCBkYXRhIGluIHdpZGdldHNcclxuICAgICAgICAgICAgaWYgKHNob3dBbGVydCkge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoY2hlY2tib3hFeGlzdCAmJiByZXF1aXJlZENoZWNrYm94ICYmIHNob3dBbGVydCkge1xyXG4gICAgICAgICAgICBzZXRVblNpZ25lZFdpZGdldElkKHdpZGdldEtleSk7XHJcbiAgICAgICAgICAgIHNldFBhZ2VOdW1iZXIoVG91clBhZ2VOdW1iZXIpO1xyXG4gICAgICAgICAgICBzZXRXaWRnZXRzVG91cih0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAocmFkaW9FeGlzdCAmJiBzaG93QWxlcnQpIHtcclxuICAgICAgICAgICAgc2V0VW5TaWduZWRXaWRnZXRJZCh3aWRnZXRLZXkpO1xyXG4gICAgICAgICAgICBzZXRQYWdlTnVtYmVyKFRvdXJQYWdlTnVtYmVyKTtcclxuICAgICAgICAgICAgc2V0V2lkZ2V0c1RvdXIodHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHNob3dBbGVydCkge1xyXG4gICAgICAgICAgICBzZXRVblNpZ25lZFdpZGdldElkKHdpZGdldEtleSk7XHJcbiAgICAgICAgICAgIHNldFBhZ2VOdW1iZXIoVG91clBhZ2VOdW1iZXIpO1xyXG4gICAgICAgICAgICBzZXRXaWRnZXRzVG91cih0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldElzVWlMb2FkaW5nKHRydWUpO1xyXG4gICAgICAgICAgICAvLyBgd2lkZ2V0c2AgaXMgVXNlZCB0byByZXR1cm4gd2lkZ2V0cyBkZXRhaWxzIHdpdGggcGFnZSBudW1iZXIgb2YgY3VycmVudCB1c2VyXHJcbiAgICAgICAgICAgIGNvbnN0IHdpZGdldHMgPSBjaGVja1VzZXI/LlswXT8ucGxhY2VIb2xkZXI7XHJcblxyXG4gICAgICAgICAgICAvLyBMb2FkIGEgUERGRG9jdW1lbnQgZnJvbSB0aGUgZXhpc3RpbmcgUERGIGJ5dGVzXHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUGRmQnl0ZXMgPSBwZGZBcnJheUJ1ZmZlcjtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKGV4aXN0aW5nUGRmQnl0ZXMpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGlzU2lnbllvdXJTZWxmRmxvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGV4dFVzZXJQdHIgPSBwZGZEZXRhaWxzWzBdLkV4dFVzZXJQdHI7XHJcbiAgICAgICAgICAgICAgY29uc3QgSGVhZGVyRG9jSWQgPSBleHRVc2VyUHRyPy5IZWFkZXJEb2NJZDtcclxuICAgICAgICAgICAgICAvL2VtYmVkIGRvY3VtZW50J3Mgb2JqZWN0IGlkIHRvIGFsbCBwYWdlcyBpbiBwZGYgZG9jdW1lbnRcclxuICAgICAgICAgICAgICBpZiAoIUhlYWRlckRvY0lkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzRG9jSWQpIHtcclxuICAgICAgICAgICAgICAgICAgYXdhaXQgZW1iZWREb2NJZChwZGZEb2MsIGRvY3VtZW50SWQsIGFsbFBhZ2VzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy9lbWJlZCBtdWx0aSBzaWduYXR1cmUgaW4gcGRmXHJcbiAgICAgICAgICAgICAgY29uc3QgcGRmQnl0ZXMgPSBhd2FpdCBtdWx0aVNpZ25FbWJlZChcclxuICAgICAgICAgICAgICAgIHdpZGdldHMsXHJcbiAgICAgICAgICAgICAgICBwZGZEb2MsXHJcbiAgICAgICAgICAgICAgICBpc1NpZ25Zb3VyU2VsZkZsb3csXHJcbiAgICAgICAgICAgICAgICBzY2FsZSxcclxuICAgICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0gsXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJXSFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJwZGZ0ZVwiLCBwZGZCeXRlcyk7XHJcbiAgICAgICAgICAgICAgLy9nZXQgRXhpc3RVc2VyUHRyIG9iamVjdCBpZCBvZiB1c2VyIGNsYXNzIHRvIGdldCB0ZW5hbnREZXRhaWxzXHJcbiAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSBwZGZEZXRhaWxzPy5bMF0/LkV4dFVzZXJQdHI/LlVzZXJJZD8ub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgICAgLy9nZXQgRXhpc3RVc2VyUHRyIGVtYWlsIHRvIGdldCB1c2VyRGV0YWlsc1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvbnRyYWN0VXNlcnMoKTtcclxuICAgICAgICAgICAgICBsZXQgYWN0aXZlTWFpbEFkYXB0ZXIgPSBcIlwiO1xyXG4gICAgICAgICAgICAgIGlmIChyZXMgPT09IFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgICAgICAgICAgICBzZXRJc0xvYWRpbmcoeyBpc0xvYWQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlcyB8fCByZXM/Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlTWFpbEFkYXB0ZXIgPSBcIlwiO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzWzBdICYmIHJlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGFjdGl2ZU1haWxBZGFwdGVyID0gcmVzWzBdPy5hY3RpdmVfbWFpbF9hZGFwdGVyO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL2Z1bmN0aW9uIGZvciBjYWxsIHRvIGVtYmVkIHNpZ25hdHVyZSBpbiBwZGYgYW5kIGdldCBkaWdpdGFsIHNpZ25hdHVyZSBwZGZcclxuICAgICAgICAgICAgICBjb25zdCByZXNTaWduID0gYXdhaXQgc2lnblBkZkZ1bihcclxuICAgICAgICAgICAgICAgIHBkZkJ5dGVzLFxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRJZCxcclxuICAgICAgICAgICAgICAgIHNpZ25lck9iamVjdElkLFxyXG4gICAgICAgICAgICAgICAgb2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBpc1N1YnNjcmliZWQsXHJcbiAgICAgICAgICAgICAgICBhY3RpdmVNYWlsQWRhcHRlcixcclxuICAgICAgICAgICAgICAgIHdpZGdldHNcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGlmIChyZXNTaWduICYmIHJlc1NpZ24uc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgICAgICAgc2V0UGRmVXJsKHJlcy5kYXRhKTtcclxuICAgICAgICAgICAgICAgIHNldElzU2lnbmVkKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2V0U2lnbmVkU2lnbmVycyhbXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRVblNpZ25lZFNpZ25lcnMoW10pO1xyXG4gICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnREZXRhaWxzKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwZGZEZXRhaWxzPy5bMF0uU2lnbmVycy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgICAgICh4KSA9PiB4LkVtYWlsID09PSBjdXJyZW50VXNlcj8uZW1haWxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdJbmRleCA9IGluZGV4ICsgMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJtYWlsID0ge1xyXG4gICAgICAgICAgICAgICAgICBFbWFpbDogcGRmRGV0YWlscz8uWzBdPy5QbGFjZWhvbGRlcnNbbmV3SW5kZXhdPy5lbWFpbCB8fCBcIlwiXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IHVzZXJtYWlsPy5FbWFpbFxyXG4gICAgICAgICAgICAgICAgICA/IHVzZXJtYWlsXHJcbiAgICAgICAgICAgICAgICAgIDogcGRmRGV0YWlscz8uWzBdPy5TaWduZXJzW25ld0luZGV4XTtcclxuICAgICAgICAgICAgICAgIGlmIChzZW5kbWFpbCAhPT0gXCJmYWxzZVwiICYmIHNlbmRJbk9yZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcGRmRGV0YWlscz8uWzBdPy5SZXF1ZXN0Qm9keTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN1YmplY3QgPSBwZGZEZXRhaWxzPy5bMF0/LlJlcXVlc3RTdWJqZWN0O1xyXG4gICAgICAgICAgICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGlyZURhdGUgPSBwZGZEZXRhaWxzPy5bMF0uRXhwaXJ5RGF0ZS5pc287XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGV4cGlyZURhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsRXhwaXJlRGF0ZSA9IG5ld0RhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgXCJlbi1VU1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXk6IFwibnVtZXJpY1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb250aDogXCJsb25nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHllYXI6IFwibnVtZXJpY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VuZGVyRW1haWwgPSBwZGZEZXRhaWxzPy5bMF0uRXh0VXNlclB0ci5FbWFpbDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VuZGVyUGhvbmUgPSBwZGZEZXRhaWxzPy5bMF0/LkV4dFVzZXJQdHI/LlBob25lO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbmRlck5hbWUgPSBgJHtwZGZEZXRhaWxzPy5bMF0uRXh0VXNlclB0ci5OYW1lfWA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWdQbmcgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImh0dHBzOi8vcWlraW5ub3ZhdGlvbi5hbXMzLmRpZ2l0YWxvY2VhbnNwYWNlcy5jb20vbG9nby5wbmdcIjtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJiYXNlVXJsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICl9ZnVuY3Rpb25zL3NlbmRtYWlsdjNgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSB1c2VyPy5vYmplY3RJZDtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RVcmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy9lbmNvZGUgdGhpcyB1cmwgdmFsdWUgYCR7cGRmRGV0YWlscz8uWzBdLm9iamVjdElkfS8ke3VzZXIuRW1haWx9LyR7b2JqZWN0SWR9YCB0byBiYXNlNjQgdXNpbmcgYGJ0b2FgIGZ1bmN0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RlQmFzZTY0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUJhc2U2NCA9IGJ0b2EoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGRmRGV0YWlscz8uWzBdLm9iamVjdElkfS8ke3VzZXIuRW1haWx9LyR7b2JqZWN0SWR9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlQmFzZTY0ID0gYnRvYShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwZGZEZXRhaWxzPy5bMF0ub2JqZWN0SWR9LyR7dXNlci5FbWFpbH1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0UHVibGljVXJsID0gaXNTdGFnaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJodHRwczovL3N0YWdpbmctYXBwLm9wZW5zaWdubGFicy5jb21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiaHR0cHM6Ly9hcHAub3BlbnNpZ25sYWJzLmNvbVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHNpZ25QZGYgPSBwcm9wcz8udGVtcGxhdGVJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAke2hvc3RQdWJsaWNVcmx9L2xvZ2luLyR7ZW5jb2RlQmFzZTY0fWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgJHtob3N0VXJsfS9sb2dpbi8ke2VuY29kZUJhc2U2NH1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlblNpZ25VcmwgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImh0dHBzOi8vd3d3Lm9wZW5zaWdubGFicy5jb20vY29udGFjdC11c1wiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JnTmFtZSA9IHBkZkRldGFpbHNbMF0/LkV4dFVzZXJQdHIuQ29tcGFueVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHBkZkRldGFpbHNbMF0uRXh0VXNlclB0ci5Db21wYW55XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoZW1lQkdjb2xvciA9IHRoZW1lQ29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGFjZVZhcjtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0Qm9keSAmJiByZXF1ZXN0U3ViamVjdCAmJiBpc1N1YnNjcmliZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZWRSZXF1ZXN0Qm9keSA9IHJlcXVlc3RCb2R5LnJlcGxhY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgL1wiL2csXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaHRtbFJlcUJvZHkgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0nQ29udGVudC1UeXBlJyBjb250ZW50PSd0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnIC8+PC9oZWFkPjxib2R5PlwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFJlcXVlc3RCb2R5ICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvYm9keT4gPC9odG1sPlwiO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFibGVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50X3RpdGxlOiBwZGZEZXRhaWxzPy5bMF0uTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXJfbmFtZTogc2VuZGVyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXJfbWFpbDogc2VuZGVyRW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyX3Bob25lOiBzZW5kZXJQaG9uZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcl9uYW1lOiB1c2VyLk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJfZW1haWw6IHVzZXIuRW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJfcGhvbmU6IHVzZXIuUGhvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJ5X2RhdGU6IGxvY2FsRXhwaXJlRGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYW55X25hbWU6IG9yZ05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmluZ191cmw6IGA8YSBocmVmPSR7c2lnblBkZn0+U2lnbiBoZXJlPC9hPmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVZhciA9IHJlcGxhY2VNYWlsVmFyaWJsZXMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN1YmplY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbFJlcUJvZHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbFByb3ZpZGVyOiBhY3RpdmVNYWlsQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0VXNlcklkOiBleHRVc2VySWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudDogdXNlci5FbWFpbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdDogcmVxdWVzdFN1YmplY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlcGxhY2VWYXI/LnN1YmplY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGAke3BkZkRldGFpbHM/LlswXS5FeHRVc2VyUHRyLk5hbWV9IGhhcyByZXF1ZXN0ZWQgeW91IHRvIHNpZ24gXCIke3BkZkRldGFpbHM/LlswXS5OYW1lfVwiYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTogc2VuZGVyRW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYW46IHBsYW5jb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sOiByZXF1ZXN0Qm9keVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVwbGFjZVZhcj8uYm9keVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCI8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSdDb250ZW50LVR5cGUnIGNvbnRlbnQ9J3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcgLz4gPC9oZWFkPiAgIDxib2R5PiA8ZGl2IHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OyBwYWRkaW5nOiAyMHB4Jz0+IDxkaXYgICBzdHlsZT0nIGJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4xKSAwcHggNHB4IDEycHg7YmFja2dyb3VuZDogd2hpdGU7cGFkZGluZy1ib3R0b206IDIwcHg7Jz4gPGRpdiBzdHlsZT0ncGFkZGluZzoxMHB4IDEwcHggMCAxMHB4Jz48aW1nIHNyYz1cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdQbmcgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgaGVpZ2h0PSc1MCcgc3R5bGU9J3BhZGRpbmc6IDIwcHgsd2lkdGg6MTcwcHgsaGVpZ2h0OjQwcHgnIC8+PC9kaXY+ICA8ZGl2ICBzdHlsZT0nIHBhZGRpbmc6IDJweDtmb250LWZhbWlseTogc3lzdGVtLXVpO2JhY2tncm91bmQtY29sb3I6XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVCR2NvbG9yICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiOyc+PHAgc3R5bGU9J2ZvbnQtc2l6ZTogMjBweDtmb250LXdlaWdodDogNDAwO2NvbG9yOiB3aGl0ZTtwYWRkaW5nLWxlZnQ6IDIwcHg7JyA+IERpZ2l0YWwgU2lnbmF0dXJlIFJlcXVlc3Q8L3A+PC9kaXY+PGRpdj48cCBzdHlsZT0ncGFkZGluZzogMjBweDtmb250LWZhbWlseTogc3lzdGVtLXVpO2ZvbnQtc2l6ZTogMTRweDsgICBtYXJnaW4tYm90dG9tOiAxMHB4Oyc+IFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM/LlswXS5FeHRVc2VyUHRyLk5hbWUgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgaGFzIHJlcXVlc3RlZCB5b3UgdG8gcmV2aWV3IGFuZCBzaWduIDxzdHJvbmc+IFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM/LlswXS5OYW1lICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPC9zdHJvbmc+LjwvcD48ZGl2IHN0eWxlPSdwYWRkaW5nOiA1cHggMHB4IDVweCAyNXB4O2Rpc3BsYXk6IGZsZXg7ZmxleC1kaXJlY3Rpb246IHJvdztqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsnPjx0YWJsZT4gPHRyPiA8dGQgc3R5bGU9J2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXNpemU6MTVweCc+U2VuZGVyPC90ZD4gPHRkPiA8L3RkPiA8dGQgIHN0eWxlPSdjb2xvcjojNjI2MzYzO2ZvbnQtd2VpZ2h0OmJvbGQnPlwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlckVtYWlsICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPC90ZD48L3RyPjx0cj48dGQgc3R5bGU9J2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXNpemU6MTVweCc+T3JnYW5pemF0aW9uPC90ZD4gPHRkPiA8L3RkPjx0ZCBzdHlsZT0nY29sb3I6IzYyNjM2Mztmb250LXdlaWdodDpib2xkJz4gXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnTmFtZSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvdGQ+PC90cj4gPHRyPiA8dGQgc3R5bGU9J2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXNpemU6MTVweCc+RXhwaXJlcyBvbjwvdGQ+PHRkPiA8L3RkPiA8dGQgc3R5bGU9J2NvbG9yOiM2MjYzNjM7Zm9udC13ZWlnaHQ6Ym9sZCc+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxFeHBpcmVEYXRlICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPC90ZD48L3RyPjx0cj4gPHRkPjwvdGQ+IDx0ZD4gPC90ZD48L3RyPjwvdGFibGU+IDwvZGl2PiA8ZGl2IHN0eWxlPSdtYXJnaW4tbGVmdDo3MHB4Jz48YSBocmVmPVwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25QZGYgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+IDxidXR0b24gc3R5bGU9J3BhZGRpbmc6IDEycHggMTJweCAxMnB4IDEycHg7YmFja2dyb3VuZC1jb2xvcjogI2Q0NmIwZjtjb2xvcjogd2hpdGU7ICBib3JkZXI6IDBweDtib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMDUpIDBweCA2cHggMjRweCAwcHgscmdiYSgwLCAwLCAwLCAwLjA4KSAwcHggMHB4IDBweCAxcHg7Zm9udC13ZWlnaHQ6Ym9sZDttYXJnaW4tdG9wOjMwcHgnPlNpZ24gaGVyZTwvYnV0dG9uPjwvYT4gPC9kaXY+IDxkaXYgc3R5bGU9J2Rpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogY2VudGVyO21hcmdpbi10b3A6IDEwcHg7Jz4gPC9kaXY+PC9kaXY+PC9kaXY+PGRpdj48cD4gVGhpcyBpcyBhbiBhdXRvbWF0ZWQgZW1haWwgZnJvbSBPcGVuU2lnbuKEoi4gRm9yIGFueSBxdWVyaWVzIHJlZ2FyZGluZyB0aGlzIGVtYWlsLCBwbGVhc2UgY29udGFjdCB0aGUgc2VuZGVyIFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlckVtYWlsICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIGRpcmVjdGx5LklmIHlvdSB0aGluayB0aGlzIGVtYWlsIGlzIGluYXBwcm9wcmlhdGUgb3Igc3BhbSwgeW91IG1heSBmaWxlIGEgY29tcGxhaW50IHdpdGggT3BlblNpZ27ihKIgICA8YSBocmVmPSBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuU2lnblVybCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiB0YXJnZXQ9X2JsYW5rPmhlcmU8L2E+LjwvcD4gPC9kaXY+PC9kaXY+PC9ib2R5PiA8L2h0bWw+XCJcclxuICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBheGlvcy5wb3N0KHVybCwgcGFyYW1zLCB7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3JcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZXRJc1VpTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRJc0FsZXJ0KHsgaXNTaG93OiB0cnVlLCBhbGVydE1lc3NhZ2U6IHJlc1NpZ24ubWVzc2FnZSB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgIHNldElzVWlMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgICAgICBpZiAoZXJyICYmIGVyci5tZXNzYWdlLmluY2x1ZGVzKFwiaXMgZW5jcnlwdGVkLlwiKSkge1xyXG4gICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7XHJcbiAgICAgICAgICAgICAgICAgIGlzU2hvdzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgYWxlcnRNZXNzYWdlOiB0KFwiZW5jcnlwdGVkLXBkZi1ub3Qtc3VwcG9ydFwiKVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIHJlcXVlc3Qgc2lnbmluZ1wiLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7XHJcbiAgICAgICAgICAgICAgICAgIGlzU2hvdzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgYWxlcnRNZXNzYWdlOiB0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzZXRJc1NpZ25QYWQoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXRJc0FsZXJ0KHtcclxuICAgICAgICAgICAgaXNTaG93OiB0cnVlLFxyXG4gICAgICAgICAgICBhbGVydE1lc3NhZ2U6IHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGVtYmVkc2lnblwiLCBlcnIpO1xyXG4gICAgICAgIHNldElzVWlMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICBzZXRJc0FsZXJ0KHtcclxuICAgICAgICAgIGlzU2hvdzogdHJ1ZSxcclxuICAgICAgICAgIGFsZXJ0TWVzc2FnZTogdChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIilcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9lbHNlIHZlcmlmeSB1c2VycyBlbWFpbFxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHVzZXJRdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShQYXJzZS5Vc2VyKTtcclxuICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgdXNlclF1ZXJ5LmdldChjdXJyZW50VXNlcj8ub2JqZWN0SWQsIHtcclxuICAgICAgICAgIHNlc3Npb25Ub2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICBpc0VtYWlsVmVyaWZpZWQgPSB1c2VyPy5nZXQoXCJlbWFpbFZlcmlmaWVkXCIpO1xyXG4gICAgICAgICAgc2V0SXNFbWFpbFZlcmlmaWVkKGlzRW1haWxWZXJpZmllZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvciBpbiBzYXZlIHVzZXIncyBlbWFpbFZlcmlmaWVkIGluIHVzZXIgY2xhc3NcIik7XHJcbiAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL2Z1bmN0aW9uIGZvciB1cGRhdGUgVG91clN0YXR1c1xyXG4gIGNvbnN0IGNsb3NlVG91ciA9IGFzeW5jICgpID0+IHtcclxuICAgIHNldFdpZGdldHNUb3VyKGZhbHNlKTtcclxuICB9O1xyXG5cclxuICBjb25zdCB0b3VyQ29uZmlnID0gW1xyXG4gICAge1xyXG4gICAgICBzZWxlY3RvcjogJ1tkYXRhLXR1dD1cIklzU2lnbmVkXCJdJyxcclxuICAgICAgY29udGVudDogbWluUmVxdWlyZWRDb3VudFxyXG4gICAgICAgID8gdChcInNpZ25hdHVyZS12YWxpZGF0ZS1hbGVydFwiLCB7IG1pblJlcXVpcmVkQ291bnQgfSlcclxuICAgICAgICA6IHQoXCJzaWduYXR1cmUtdmFsaWRhdGUtYWxlcnQtMlwiKSxcclxuICAgICAgcG9zaXRpb246IFwidG9wXCIsXHJcbiAgICAgIHN0eWxlOiB7IGZvbnRTaXplOiBcIjEzcHhcIiB9XHJcbiAgICB9XHJcbiAgXTtcclxuICAvL2Z1bmN0aW9uIGZvciBnZXQgcGRmIHBhZ2UgZGV0YWlsc1xyXG4gIGNvbnN0IHBhZ2VEZXRhaWxzID0gYXN5bmMgKHBkZikgPT4ge1xyXG4gICAgbGV0IHBkZldIT2JqID0gW107XHJcbiAgICBjb25zdCB0b3RhbFBhZ2VzID0gcGRmLm51bVBhZ2VzOyAvLyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlc1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRvdGFsUGFnZXM7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgZ2V0UGFnZSA9IGF3YWl0IHBkZi5nZXRQYWdlKGluZGV4ICsgMSk7XHJcbiAgICAgIGNvbnN0IHNjYWxlID0gMTtcclxuICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRQYWdlLmdldFZpZXdwb3J0KHsgc2NhbGUgfSk7XHJcbiAgICAgIHBkZldIT2JqLnB1c2goeyBwYWdlTnVtYmVyOiBpbmRleCArIDEsIHdpZHRoLCBoZWlnaHQgfSk7XHJcbiAgICB9XHJcbiAgICBzZXRQZGZPcmlnaW5hbFdIKHBkZldIT2JqKTtcclxuICAgIHNldFBkZkxvYWQodHJ1ZSk7XHJcbiAgfTtcclxuICAvL2Z1bmN0aW9uIGZvciBjaGFuZ2UgcGFnZVxyXG4gIGZ1bmN0aW9uIGNoYW5nZVBhZ2Uob2Zmc2V0KSB7XHJcbiAgICBzZXRQYWdlTnVtYmVyKChwcmV2UGFnZU51bWJlcikgPT4gcHJldlBhZ2VOdW1iZXIgKyBvZmZzZXQpO1xyXG4gIH1cclxuXHJcbiAgLy9mdW5jdGlvbiBmb3IgaW1hZ2UgdXBsb2FkIG9yIHVwZGF0ZVxyXG4gIGNvbnN0IG9uSW1hZ2VDaGFuZ2UgPSAoZXZlbnQpID0+IHtcclxuICAgIGlmIChldmVudC50YXJnZXQuZmlsZXMgJiYgZXZlbnQudGFyZ2V0LmZpbGVzWzBdKSB7XHJcbiAgICAgIG9uSW1hZ2VTZWxlY3QoZXZlbnQsIHNldEltZ1dILCBzZXRJbWFnZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuICAvL2Z1bmN0aW9uIGZvciB1cGxvYWQgc3RhbXAgaW1hZ2VcclxuICBjb25zdCBzYXZlSW1hZ2UgPSAoKSA9PiB7XHJcbiAgICAvL2dldCBjdXJyZW50IHNpZ25lcnMgcGxhY2Vob2xkZXIgcG9zaXRpb24gZGF0YVxyXG4gICAgY29uc3QgY3VycmVudFNpZ25lciA9IHNpZ25lclBvcy5maWx0ZXIoXHJcbiAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZFxyXG4gICAgKTtcclxuICAgIC8vZ2V0IGN1cnJlbnQgcGFnZW51bWJlciBwbGFjZWhvbGRlciBpbmRleFxyXG4gICAgY29uc3QgZ2V0SW5kZXggPSBjdXJyZW50U2lnbmVyWzBdLnBsYWNlSG9sZGVyLmZpbmRJbmRleCgob2JqZWN0KSA9PiB7XHJcbiAgICAgIHJldHVybiBvYmplY3QucGFnZU51bWJlciA9PT0gcGFnZU51bWJlcjtcclxuICAgIH0pO1xyXG4gICAgLy9nZXQgY3VycmVudCBzaWduZXIgcGxhY2Vob2xkZXIgcG9zaXRpb24gZGF0YVxyXG4gICAgY29uc3QgcGxhY2Vob2xkZXJQb3NpdGlvbiA9IGN1cnJlbnRTaWduZXJbMF0ucGxhY2VIb2xkZXI7XHJcbiAgICAvL2Z1bmN0aW9uIG9mIHNhdmUgaW1hZ2UgYW5kIGdldCB1cGRhdGVkIHBvc2l0aW9uIHdpdGggaW1hZ2UgdXJsXHJcbiAgICBjb25zdCBnZXRVcGRhdGVQb3NpdGlvbiA9IG9uU2F2ZUltYWdlKFxyXG4gICAgICBwbGFjZWhvbGRlclBvc2l0aW9uLFxyXG4gICAgICBnZXRJbmRleCxcclxuICAgICAgc2lnbktleSxcclxuICAgICAgaW1nV0gsXHJcbiAgICAgIGltYWdlXHJcbiAgICApO1xyXG5cclxuICAgIC8vcmVwbGFjZSB1cGRhdGVkIHBsYWNlaG9sZGVyIHBvc2l0aW9uIHdpdGggb2xkIGRhdGFcclxuICAgIHBsYWNlaG9sZGVyUG9zaXRpb24uc3BsaWNlKFxyXG4gICAgICAwLFxyXG4gICAgICBwbGFjZWhvbGRlclBvc2l0aW9uLmxlbmd0aCxcclxuICAgICAgLi4uZ2V0VXBkYXRlUG9zaXRpb25cclxuICAgICk7XHJcbiAgICAvL2dldCBjdXJyZW50IHNpZ25lcnMgcGxhY2Vob2xkZXIgcG9zaXRpb24gZGF0YSBpbmRleCBudW1iZXIgaW4gYXJyYXlcclxuICAgIGNvbnN0IGluZGV4b2ZTaWduZXIgPSBzaWduZXJQb3MuZmluZEluZGV4KChvYmplY3QpID0+IHtcclxuICAgICAgcmV0dXJuIG9iamVjdC5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWQ7XHJcbiAgICB9KTtcclxuICAgIC8vdXBkYXRlIGN1cnJlbnQgc2lnbmVycyBkYXRhIHdpdGggbmV3IHBsYWNlaG9sZGVyIHBvc2l0aW9uIGFycmF5IGRhdGFcclxuICAgIHNldFNpZ25lclBvcygocHJldlN0YXRlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld1N0YXRlID0gWy4uLnByZXZTdGF0ZV07IC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHN0YXRlXHJcbiAgICAgIG5ld1N0YXRlLnNwbGljZShpbmRleG9mU2lnbmVyLCAxLCAuLi5jdXJyZW50U2lnbmVyKTsgLy8gTW9kaWZ5IHRoZSBjb3B5XHJcbiAgICAgIHJldHVybiBuZXdTdGF0ZTsgLy8gVXBkYXRlIHRoZSBzdGF0ZSB3aXRoIHRoZSBtb2RpZmllZCBjb3B5XHJcbiAgICB9KTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIHNhdmUgYnV0dG9uIHRvIHNhdmUgc2lnbmF0dXJlIG9yIGltYWdlIHVybFxyXG4gIGNvbnN0IHNhdmVTaWduID0gKHR5cGUsIGlzRGVmYXVsdFNpZ24sIHdpZHRoLCBoZWlnaHQpID0+IHtcclxuICAgIGNvbnN0IGlzVHlwZVRleHQgPSB3aWR0aCAmJiBoZWlnaHQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICBjb25zdCBzaWduYXR1cmVJbWcgPSBpc0RlZmF1bHRTaWduXHJcbiAgICAgID8gaXNEZWZhdWx0U2lnbiA9PT0gXCJpbml0aWFsc1wiXHJcbiAgICAgICAgPyBteUluaXRpYWxcclxuICAgICAgICA6IGRlZmF1bHRTaWduSW1nXHJcbiAgICAgIDogc2lnbmF0dXJlO1xyXG4gICAgbGV0IGltZ1dIID0geyB3aWR0aDogd2lkdGggPyB3aWR0aCA6IFwiXCIsIGhlaWdodDogaGVpZ2h0ID8gaGVpZ2h0IDogXCJcIiB9O1xyXG4gICAgc2V0SXNTaWduUGFkKGZhbHNlKTtcclxuICAgIHNldElzSW1hZ2VTZWxlY3QoZmFsc2UpO1xyXG4gICAgc2V0SW1hZ2UoKTtcclxuXHJcbiAgICAvL2dldCBjdXJyZW50IHNpZ25lcnMgcGxhY2Vob2xkZXIgcG9zaXRpb24gZGF0YVxyXG4gICAgY29uc3QgY3VycmVudFNpZ25lciA9IHNpZ25lclBvcy5maWx0ZXIoXHJcbiAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZFxyXG4gICAgKTtcclxuICAgIC8vZ2V0IGN1cnJlbnQgcGFnZW51bWJlciBwbGFjZWhvbGRlciBpbmRleFxyXG4gICAgY29uc3QgZ2V0SW5kZXggPSBjdXJyZW50U2lnbmVyWzBdLnBsYWNlSG9sZGVyLmZpbmRJbmRleCgob2JqZWN0KSA9PiB7XHJcbiAgICAgIHJldHVybiBvYmplY3QucGFnZU51bWJlciA9PT0gcGFnZU51bWJlcjtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vc2V0IGRlZmF1bHQgc2lnbmF0dXJlIGltYWdlIHdpZHRoIGFuZCBoZWlnaHRcclxuICAgIGlmIChpc0RlZmF1bHRTaWduKSB7XHJcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWcuc3JjID0gZGVmYXVsdFNpZ25JbWc7XHJcbiAgICAgIGlmIChpbWcuY29tcGxldGUpIHtcclxuICAgICAgICBpbWdXSCA9IHsgd2lkdGg6IGltZy53aWR0aCwgaGVpZ2h0OiBpbWcuaGVpZ2h0IH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVyIHBsYWNlaG9sZGVyIHBvc2l0aW9uIGRhdGFcclxuICAgIGNvbnN0IHBsYWNlaG9sZGVyUG9zaXRpb24gPSBjdXJyZW50U2lnbmVyWzBdLnBsYWNlSG9sZGVyO1xyXG4gICAgLy9mdW5jdGlvbiBvZiBzYXZlIHNpZ25hdHVyZSBpbWFnZSBhbmQgZ2V0IHVwZGF0ZWQgcG9zaXRpb24gd2l0aCBzaWduYXR1cmUgaW1hZ2UgdXJsXHJcbiAgICBjb25zdCBnZXRVcGRhdGVQb3NpdGlvbiA9IG9uU2F2ZVNpZ24oXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIHBsYWNlaG9sZGVyUG9zaXRpb24sXHJcbiAgICAgIGdldEluZGV4LFxyXG4gICAgICBzaWduS2V5LFxyXG4gICAgICBzaWduYXR1cmVJbWcsXHJcbiAgICAgIGltZ1dILFxyXG4gICAgICBpc0RlZmF1bHRTaWduLFxyXG4gICAgICBpc1R5cGVUZXh0XHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZVNpZ25lckRhdGEgPSBjdXJyZW50U2lnbmVyLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgIGlmIChvYmouc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwbGFjZUhvbGRlcjogZ2V0VXBkYXRlUG9zaXRpb24gfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaW5kZXggPSBzaWduZXJQb3MuZmluZEluZGV4KFxyXG4gICAgICAoZGF0YSkgPT4gZGF0YS5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWRcclxuICAgICk7XHJcbiAgICBzZXRTaWduZXJQb3MoKHByZXZTdGF0ZSkgPT4ge1xyXG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IFsuLi5wcmV2U3RhdGVdO1xyXG4gICAgICBuZXdTdGF0ZS5zcGxpY2UoaW5kZXgsIDEsIC4uLnVwZGF0ZVNpZ25lckRhdGEpO1xyXG4gICAgICByZXR1cm4gbmV3U3RhdGU7XHJcbiAgICB9KTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIHNldCBkZWNsaW5lIHRydWUgb24gcHJlc3MgZGVjbGluZSBidXR0b25cclxuICBjb25zdCBkZWNsaW5lRG9jID0gYXN5bmMgKHJlYXNvbikgPT4ge1xyXG4gICAgY29uc3Qgc2VuZGVyVXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGpzb25TZW5kZXIgPSBKU09OLnBhcnNlKHNlbmRlclVzZXIpO1xyXG4gICAgc2V0SXNEZWNsaW5lKHsgaXNEZWNsaW5lZDogZmFsc2UgfSk7XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBJc0RlY2xpbmVkOiB0cnVlLFxyXG4gICAgICBEZWNsaW5lUmVhc29uOiByZWFzb24sXHJcbiAgICAgIERlY2xpbmVCeToge1xyXG4gICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXHJcbiAgICAgICAgY2xhc3NOYW1lOiBcIl9Vc2VyXCIsXHJcbiAgICAgICAgb2JqZWN0SWQ6IGpzb25TZW5kZXI/Lm9iamVjdElkXHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBzZXRJc1VpTG9hZGluZyh0cnVlKTtcclxuXHJcbiAgICBhd2FpdCBheGlvc1xyXG4gICAgICAucHV0KFxyXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICAgICAgXCJiYXNlVXJsXCJcclxuICAgICAgICApfWNsYXNzZXMvY29udHJhY3RzX0RvY3VtZW50LyR7ZG9jdW1lbnRJZH1gLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gcmVzdWx0LmRhdGE7XHJcbiAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgY29uc3QgY3VycmVudERlY2xpbmUgPSB7IGN1cnJudDogXCJZb3VEZWNsaW5lZFwiLCBpc0RlY2xpbmVkOiB0cnVlIH07XHJcbiAgICAgICAgICBzZXRJc0RlY2xpbmUoY3VycmVudERlY2xpbmUpO1xyXG4gICAgICAgICAgc2V0SXNVaUxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICBldmVudDogXCJkZWNsaW5lZFwiLFxyXG4gICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgb2JqZWN0SWQ6IHBkZkRldGFpbHM/LlswXS5vYmplY3RJZCxcclxuICAgICAgICAgICAgICBmaWxlOiBwZGZEZXRhaWxzPy5bMF0/LlNpZ25lZFVybCB8fCBwZGZEZXRhaWxzPy5bMF0/LlVSTCxcclxuICAgICAgICAgICAgICBuYW1lOiBwZGZEZXRhaWxzPy5bMF0uTmFtZSxcclxuICAgICAgICAgICAgICBub3RlOiBwZGZEZXRhaWxzPy5bMF0uTm90ZSB8fCBcIlwiLFxyXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBwZGZEZXRhaWxzPy5bMF0uRGVzY3JpcHRpb24gfHwgXCJcIixcclxuICAgICAgICAgICAgICBzaWduZXJzOiBwZGZEZXRhaWxzPy5bMF0uU2lnbmVycz8ubWFwKCh4KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogeD8uTmFtZSxcclxuICAgICAgICAgICAgICAgIGVtYWlsOiB4Py5FbWFpbCxcclxuICAgICAgICAgICAgICAgIHBob25lOiB4Py5QaG9uZVxyXG4gICAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICAgICBkZWNsaW5lZEJ5OiBqc29uU2VuZGVyLmVtYWlsLFxyXG4gICAgICAgICAgICAgIGRlY2xpbmVkQXQ6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBwZGZEZXRhaWxzPy5bMF0uY3JlYXRlZEF0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgYXhpb3MucG9zdChcclxuICAgICAgICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2NhbGx3ZWJob29rYCxcclxuICAgICAgICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgICAgICAgICAgc2Vzc2lvbnRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyIFwiLCBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIHVwZGF0aW5nIGZpZWxkIGlzIGRlY2xpbmUgXCIsIGVycik7XHJcbiAgICAgICAgc2V0SXNVaUxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgIGFsZXJ0KHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgfSk7XHJcbiAgfTtcclxuICAvL2Z1bmN0aW9uIHRvIGFkZCBkZWZhdWx0IHNpZ25hdHVyZSBmb3IgYWxsIHJlcXVlc3RlZCBwbGFjZWhvbGRlciBvZiBzaWduXHJcbiAgY29uc3QgYWRkRGVmYXVsdFNpZ25hdHVyZSA9ICgpID0+IHtcclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXHJcbiAgICBjb25zdCBjdXJyZW50U2lnbmVyUG9zaXRpb24gPSBzaWduZXJQb3MuZmlsdGVyKFxyXG4gICAgICAoZGF0YSkgPT4gZGF0YS5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWRcclxuICAgICk7XHJcbiAgICAvL2Z1bmN0aW9uIGZvciBzYXZlIGRlZmF1bHQgc2lnbmF0dXJlIHVybCBmb3IgYWxsIHBsYWNlaG9sZGVyIHBvc2l0aW9uXHJcbiAgICBjb25zdCB1cGRhdGVQbGFjZSA9IGFkZERlZmF1bHRTaWduYXR1cmVJbWcoXHJcbiAgICAgIGN1cnJlbnRTaWduZXJQb3NpdGlvblswXS5wbGFjZUhvbGRlcixcclxuICAgICAgZGVmYXVsdFNpZ25JbWdcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlc2lnbmVyUG9zID0gc2lnbmVyUG9zLm1hcCgoeCkgPT5cclxuICAgICAgeC5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWQgPyB7IC4uLngsIHBsYWNlSG9sZGVyOiB1cGRhdGVQbGFjZSB9IDogeFxyXG4gICAgKTtcclxuICAgIHNldFNpZ25lclBvcyh1cGRhdGVzaWduZXJQb3MpO1xyXG4gICAgc2V0RGVmYXVsdFNpZ25BbGVydCh7IGlzU2hvdzogZmFsc2UsIGFsZXJ0TWVzc2FnZTogXCJcIiB9KTtcclxuICB9O1xyXG4gIGNvbnN0IGhhbmRsZURvbnRTaG93ID0gKGlzQ2hlY2tlZCkgPT4ge1xyXG4gICAgc2V0SXNEb250U2hvdyhpc0NoZWNrZWQpO1xyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiB0byBjbG9zZSB0b3VyIGFuZCBzYXZlIHRvdXIgc3RhdHVzXHJcbiAgY29uc3QgY2xvc2VSZXF1ZXN0U2lnblRvdXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBzZXRSZXF1ZXN0U2lnblRvdXIodHJ1ZSk7XHJcbiAgICBpZiAoaXNEb250U2hvdykge1xyXG4gICAgICBsZXQgdXBkYXRlZFRvdXJTdGF0dXMgPSBbXTtcclxuICAgICAgaWYgKHRvdXJTdGF0dXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHVwZGF0ZWRUb3VyU3RhdHVzID0gWy4uLnRvdXJTdGF0dXNdO1xyXG4gICAgICAgIGNvbnN0IHJlcXVlc3RTaWduSW5kZXggPSB0b3VyU3RhdHVzLmZpbmRJbmRleChcclxuICAgICAgICAgIChvYmopID0+IG9ialtcInJlcXVlc3RTaWduXCJdID09PSBmYWxzZSB8fCBvYmpbXCJyZXF1ZXN0U2lnblwiXSA9PT0gdHJ1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHJlcXVlc3RTaWduSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICB1cGRhdGVkVG91clN0YXR1c1tyZXF1ZXN0U2lnbkluZGV4XSA9IHsgcmVxdWVzdFNpZ246IHRydWUgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdXBkYXRlZFRvdXJTdGF0dXMucHVzaCh7IHJlcXVlc3RTaWduOiB0cnVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB1cGRhdGVkVG91clN0YXR1cyA9IFt7IHJlcXVlc3RTaWduOiB0cnVlIH1dO1xyXG4gICAgICB9XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgYXhpb3MucHV0KFxyXG4gICAgICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgICAgICAgIFwiYmFzZVVybFwiXHJcbiAgICAgICAgICApfWNsYXNzZXMvY29udHJhY3RzJHtjb250cmFjdE5hbWV9LyR7c2lnbmVyVXNlcklkfWAsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIFRvdXJTdGF0dXM6IHVwZGF0ZWRUb3VyU3RhdHVzXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgICAgICBcIlgtUGFyc2UtU2Vzc2lvbi1Ub2tlblwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ1cGRhdGUgdG91ciBtZXNzYWdlcyBlcnJvclwiLCBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgY29uc3QgcmVxdWVzdFNpZ25Ub3VyRnVuY3Rpb24gPSAoKSA9PiB7XHJcbiAgICBjb25zdCB0b3VyQ29uZmlnID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgc2VsZWN0b3I6ICdbZGF0YS10dXQ9XCJyZWFjdG91ckZpcnN0XCJdJyxcclxuICAgICAgICBjb250ZW50OiAoKSA9PiAoXHJcbiAgICAgICAgICA8VG91ckNvbnRlbnRXaXRoQnRuXHJcbiAgICAgICAgICAgIG1lc3NhZ2U9e3QoXCJ0b3VyLW1zc2cucGRmLXJlcXVlc3QtZmlsZS0xXCIpfVxyXG4gICAgICAgICAgICBpc0NoZWNrZWQ9e2hhbmRsZURvbnRTaG93fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApLFxyXG4gICAgICAgIHBvc2l0aW9uOiBcInRvcFwiLFxyXG4gICAgICAgIHN0eWxlOiB7IGZvbnRTaXplOiBcIjEzcHhcIiB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBzZWxlY3RvcjogJ1tkYXRhLXR1dD1cInBkZkFyZWFcIl0nLFxyXG4gICAgICAgIGNvbnRlbnQ6ICgpID0+IChcclxuICAgICAgICAgIDxUb3VyQ29udGVudFdpdGhCdG5cclxuICAgICAgICAgICAgbWVzc2FnZT17dChcInRvdXItbXNzZy5wZGYtcmVxdWVzdC1maWxlLTJcIil9XHJcbiAgICAgICAgICAgIGlzQ2hlY2tlZD17aGFuZGxlRG9udFNob3d9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICksXHJcbiAgICAgICAgcG9zaXRpb246IFwidG9wXCIsXHJcbiAgICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHNlbGVjdG9yOiAnW2RhdGEtdHV0PVwicmVhY3RvdXJGaWZ0aFwiXScsXHJcbiAgICAgICAgY29udGVudDogKCkgPT4gKFxyXG4gICAgICAgICAgPFRvdXJDb250ZW50V2l0aEJ0blxyXG4gICAgICAgICAgICBtZXNzYWdlPXt0KFwidG91ci1tc3NnLnBkZi1yZXF1ZXN0LWZpbGUtM1wiKX1cclxuICAgICAgICAgICAgaXNDaGVja2VkPXtoYW5kbGVEb250U2hvd31cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKSxcclxuICAgICAgICBwb3NpdGlvbjogXCJ0b3BcIixcclxuICAgICAgICBzdHlsZTogeyBmb250U2l6ZTogXCIxM3B4XCIgfVxyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gICAgY29uc3Qgc2lnbmVkQnlTdGVwID0ge1xyXG4gICAgICBzZWxlY3RvcjogJ1tkYXRhLXR1dD1cInJlYWN0b3VyU2Vjb25kXCJdJyxcclxuICAgICAgY29udGVudDogKCkgPT4gKFxyXG4gICAgICAgIDxUb3VyQ29udGVudFdpdGhCdG5cclxuICAgICAgICAgIG1lc3NhZ2U9e3QoXCJ0b3VyLW1zc2cucGRmLXJlcXVlc3QtZmlsZS00XCIpfVxyXG4gICAgICAgICAgaXNDaGVja2VkPXtoYW5kbGVEb250U2hvd31cclxuICAgICAgICAvPlxyXG4gICAgICApLFxyXG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIixcclxuICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cclxuICAgIH07XHJcbiAgICAvL2NoZWNraW5nIGlmIHNpZ25lZCBieSB1c2VyIGNvbXBvbmVudCBleGlzdCB0aGVuIGFkZCBzaWduZWQgc3RlcFxyXG4gICAgY29uc3Qgc2lnbmVkQnkgPVxyXG4gICAgICBzaWduZWRTaWduZXJzLmxlbmd0aCA+IDBcclxuICAgICAgICA/IFsuLi50b3VyQ29uZmlnLnNsaWNlKDAsIDApLCBzaWduZWRCeVN0ZXAsIC4uLnRvdXJDb25maWcuc2xpY2UoMCldXHJcbiAgICAgICAgOiB0b3VyQ29uZmlnO1xyXG5cclxuICAgIC8vY2hlY2tpbmcgaWYgZGVmYXVsdCBzaWduYXR1cmUgY29tcG9uZW50IGV4aXN0IHRoZW4gYWRkIGRlZmF1bHRTaWduIHN0ZXBcclxuICAgIGNvbnN0IGRlZmF1bHRTaWduU3RlcCA9IHtcclxuICAgICAgc2VsZWN0b3I6ICdbZGF0YS10dXQ9XCJyZWFjdG91clRoaXJkXCJdJyxcclxuICAgICAgY29udGVudDogKCkgPT4gKFxyXG4gICAgICAgIDxUb3VyQ29udGVudFdpdGhCdG5cclxuICAgICAgICAgIG1lc3NhZ2U9e3QoXCJ0b3VyLW1zc2cucGRmLXJlcXVlc3QtZmlsZS01XCIpfVxyXG4gICAgICAgICAgaXNDaGVja2VkPXtoYW5kbGVEb250U2hvd31cclxuICAgICAgICAvPlxyXG4gICAgICApLFxyXG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIixcclxuICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cclxuICAgIH07XHJcbiAgICAvL2luZGV4IGlzIGhhbmRsZSBpcyBzaWduZWQgYnkgZXhpc3QgdGhlbiAyIGVsc2UgMSB0byBhZGQgdG91ciBzdGVwXHJcbiAgICBjb25zdCBpbmRleCA9IHNpZ25lZFNpZ25lcnMubGVuZ3RoID4gMCA/IDIgOiAxO1xyXG4gICAgY29uc3QgZGVmYXVsdFNpZ25Ub3VyID0gZGVmYXVsdFNpZ25JbWdcclxuICAgICAgPyBbLi4uc2lnbmVkQnkuc2xpY2UoMCwgaW5kZXgpLCBkZWZhdWx0U2lnblN0ZXAsIC4uLnNpZ25lZEJ5LnNsaWNlKGluZGV4KV1cclxuICAgICAgOiBzaWduZWRCeTtcclxuXHJcbiAgICBpZiAoaXNNb2JpbGUpIHtcclxuICAgICAgdG91ckNvbmZpZy5zaGlmdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxUb3VyXHJcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2U9e2Nsb3NlUmVxdWVzdFNpZ25Ub3VyfVxyXG4gICAgICAgIHN0ZXBzPXtpc01vYmlsZSA/IHRvdXJDb25maWcgOiBkZWZhdWx0U2lnblRvdXJ9XHJcbiAgICAgICAgaXNPcGVuPXt0cnVlfVxyXG4gICAgICAgIGNsb3NlV2l0aE1hc2s9e2ZhbHNlfVxyXG4gICAgICAgIHJvdW5kZWQ9ezV9XHJcbiAgICAgIC8+XHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZVVzZXJEZXRhaWxzID0gKCkgPT4ge1xyXG4gICAgc2V0SXNQdWJsaWNDb250YWN0KHRydWUpO1xyXG4gIH07XHJcblxyXG4gIC8vYGhhbmRsZVB1YmxpY1VzZXJgIGZ1bmN0aW9uIHRvIHVzZSBjcmVhdGUgdXNlciBmcm9tIHB1YmxpYyByb2xlIGFuZCBjcmVhdGUgZG9jdW1lbnQgZnJvbSBwdWJsaWMgdGVtcGxhdGVcclxuICBjb25zdCBoYW5kbGVQdWJsaWNVc2VyID0gYXN5bmMgKGUpID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHNldExvYWRpbmcodHJ1ZSk7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgLi4uY29udGFjdCxcclxuICAgICAgICB0ZW1wbGF0ZWlkOiBwZGZEZXRhaWxzWzBdPy5vYmplY3RJZCxcclxuICAgICAgICByb2xlOiBwZGZEZXRhaWxzWzBdPy5QdWJsaWNSb2xlWzBdXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IHVzZXJSZXMgPSBhd2FpdCBheGlvcy5wb3N0KFxyXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICAgICAgXCJiYXNlVXJsXCJcclxuICAgICAgICApfS9mdW5jdGlvbnMvcHVibGljdXNlcmxpbmtjb250YWN0dG9kb2NgLFxyXG4gICAgICAgIHBhcmFtcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHVzZXJSZXM/LmRhdGE/LnJlc3VsdCkge1xyXG4gICAgICAgIHNldFJlcyh1c2VyUmVzLmRhdGEucmVzdWx0KTtcclxuICAgICAgICBhd2FpdCBTZW5kT3RwKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvciBpbiBwdWJsaWMtc2lnbiB0byBjcmVhdGUgdXNlciBkZXRhaWxzXCIpO1xyXG4gICAgICAgIGFsZXJ0KHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImVcIiwgZSk7XHJcbiAgICAgIC8vICAgc2V0SXNMb2FkZXIoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gKGUpID0+IHtcclxuICAgIGxldCB7IG5hbWUsIHZhbHVlIH0gPSBlLnRhcmdldDtcclxuICAgIGlmIChuYW1lID09PSBcImVtYWlsXCIpIHtcclxuICAgICAgdmFsdWUgPSB2YWx1ZT8udG9Mb3dlckNhc2UoKT8ucmVwbGFjZSgvXFxzL2csIFwiXCIpO1xyXG4gICAgfVxyXG4gICAgc2V0Q29udGFjdCh7IC4uLmNvbnRhY3QsIFtuYW1lXTogdmFsdWUgfSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgU2VuZE90cCA9IGFzeW5jICgpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgZW1haWw6IGNvbnRhY3QuZW1haWwsIGRvY0lkOiByZXMuZG9jSWQgfTtcclxuICAgICAgY29uc3QgT3RwID0gYXdhaXQgYXhpb3MucG9zdChcclxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9L2Z1bmN0aW9ucy9TZW5kT1RQTWFpbFYxYCxcclxuICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChPdHApIHtcclxuICAgICAgICBzZXRJc090cCh0cnVlKTtcclxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJlcnJvciBpbiB2ZXJpZnkgb3RwIGluIHB1YmxpYy1zaWduXCIsIGVycm9yKTtcclxuICAgICAgYWxlcnQodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vdmVyaWZ5IE9UUCBzZW5kIG9uIHZpYSBlbWFpbFxyXG4gIGNvbnN0IFZlcmlmeU9UUCA9IGFzeW5jIChlKSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBzZXRMb2FkaW5nKHRydWUpO1xyXG4gICAgY29uc3Qgc2VydmVyVXJsID1cclxuICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKTtcclxuICAgIGNvbnN0IHBhcnNlSWQgPVxyXG4gICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIikgJiYgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpO1xyXG4gICAgaWYgKG90cCkge1xyXG4gICAgICAvLyBzZXRMb2FkaW5nKHRydWUpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCB1cmwgPSBgJHtzZXJ2ZXJVcmx9L2Z1bmN0aW9ucy9BdXRoTG9naW5Bc01haWwvYDtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogcGFyc2VJZFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbGV0IGJvZHkgPSB7IGVtYWlsOiBjb250YWN0LmVtYWlsLCBvdHA6IG90cCB9O1xyXG4gICAgICAgIGxldCB1c2VyID0gYXdhaXQgYXhpb3MucG9zdCh1cmwsIGJvZHksIHsgaGVhZGVyczogaGVhZGVycyB9KTtcclxuICAgICAgICBpZiAodXNlci5kYXRhLnJlc3VsdCA9PT0gXCJJbnZhbGlkIE90cFwiKSB7XHJcbiAgICAgICAgICBhbGVydCh0KFwiaW52YWxpZC1vdHBcIikpO1xyXG4gICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyLmRhdGEucmVzdWx0ID09PSBcInVzZXIgbm90IGZvdW5kIVwiKSB7XHJcbiAgICAgICAgICBhbGVydCh0KFwidXNlci1ub3QtZm91bmRcIikpO1xyXG4gICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBfdXNlciA9IHVzZXIuZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgICBjb25zdCBwYXJzZUlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpO1xyXG4gICAgICAgICAgYXdhaXQgUGFyc2UuVXNlci5iZWNvbWUoX3VzZXIuc2Vzc2lvblRva2VuKTtcclxuICAgICAgICAgIGNvbnN0IGNvbnRyYWN0VXNlckRldGFpbHMgPSBhd2FpdCBjb250cmFjdFVzZXJzKCk7XHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIlVzZXJJbmZvcm1hdGlvblwiLCBKU09OLnN0cmluZ2lmeShfdXNlcikpO1xyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgIGBQYXJzZS8ke3BhcnNlSWR9L2N1cnJlbnRVc2VyYCxcclxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoX3VzZXIpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKGNvbnRyYWN0VXNlckRldGFpbHMgJiYgY29udHJhY3RVc2VyRGV0YWlscy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICAgIFwiRXh0YW5kX0NsYXNzXCIsXHJcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29udHJhY3RVc2VyRGV0YWlscylcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInVzZXJuYW1lXCIsIF91c2VyLm5hbWUpO1xyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2Nlc3N0b2tlblwiLCBfdXNlci5zZXNzaW9uVG9rZW4pO1xyXG4gICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAvLyBuYXZpZ2F0ZShgL2xvYWQvcmVjaXBpZW50U2lnblBkZi8ke3Jlcz8uZG9jSWR9LyR7cmVzPy5jb250YWN0SWR9YCk7XHJcbiAgICAgICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm15X21vZGFsXCIpLmNsb3NlKCk7XHJcbiAgICAgICAgICBzZXRJc1B1YmxpY0NvbnRhY3QoZmFsc2UpO1xyXG4gICAgICAgICAgc2V0SXNQdWJsaWNUZW1wbGF0ZShmYWxzZSk7XHJcbiAgICAgICAgICBzZXRJc0xvYWRpbmcoeyBpc0xvYWQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgc2V0RG9jdW1lbnRJZChyZXM/LmRvY0lkKTtcclxuICAgICAgICAgIGdldERvY3VtZW50RGV0YWlscyhyZXM/LmRvY0lkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnIgXCIsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYWxlcnQodChcImVudGVyLW90cC1hbGVydFwiKSk7XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBoYW5kbGVDbG9zZU90cCA9ICgpID0+IHtcclxuICAgIHNldElzUHVibGljQ29udGFjdChmYWxzZSk7XHJcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcclxuICAgIHNldElzT3RwKGZhbHNlKTtcclxuICAgIHNldE90cCgpO1xyXG4gICAgc2V0Q29udGFjdCh7IG5hbWU6IFwiXCIsIGVtYWlsOiBcIlwiLCBwaG9uZTogXCJcIiB9KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBjbGlja09uWm9vbUluID0gKCkgPT4ge1xyXG4gICAgb25DbGlja1pvb21JbihzY2FsZSwgem9vbVBlcmNlbnQsIHNldFNjYWxlLCBzZXRab29tUGVyY2VudCk7XHJcbiAgfTtcclxuICBjb25zdCBjbGlja09uWm9vbU91dCA9ICgpID0+IHtcclxuICAgIG9uQ2xpY2tab29tT3V0KHpvb21QZXJjZW50LCBzY2FsZSwgc2V0Wm9vbVBlcmNlbnQsIHNldFNjYWxlKTtcclxuICB9O1xyXG4gIGNvbnN0IGhhbmRsZURvd25sb2FkQnRuID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgY29uc3QgdXJsID0gcGRmRGV0YWlscz8uWzBdPy5TaWduZWRVcmwgfHwgcGRmRGV0YWlscz8uWzBdPy5VUkw7XHJcbiAgICBjb25zdCBuYW1lID0gcGRmRGV0YWlscz8uWzBdPy5OYW1lO1xyXG4gICAgYXdhaXQgZmV0Y2hVcmwodXJsLCBuYW1lKTtcclxuICB9O1xyXG4gIGNvbnN0IGhhbmRsZURlY2xpbmVNc3NnID0gKCkgPT4ge1xyXG4gICAgY29uc3QgdXNlciA9IHBkZkRldGFpbHNbMF0/LkRlY2xpbmVCeT8uZW1haWw7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIHt0KFwiZGVjbGluZS1hbGVydC0zXCIpfVxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMlwiPlxyXG4gICAgICAgICAge1wiIFwifVxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj57dChcImRlY2xpbmUtYnlcIil9PC9zcGFuPiA6IHt1c2VyfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMlwiPlxyXG4gICAgICAgICAge1wiIFwifVxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj57dChcInJlYXNvblwiKX08L3NwYW4+IDp7XCIgXCJ9XHJcbiAgICAgICAgICB7cGRmRGV0YWlsc1swXT8uRGVjbGluZVJlYXNvbn17XCIgXCJ9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgKTtcclxuICB9O1xyXG4gIHJldHVybiAoXHJcbiAgICA8RG5kUHJvdmlkZXIgYmFja2VuZD17SFRNTDVCYWNrZW5kfT5cclxuICAgICAgPFRpdGxlIHRpdGxlPXtwcm9wcy50ZW1wbGF0ZUlkID8gXCJQdWJsaWMgU2lnblwiIDogXCJSZXF1ZXN0IFNpZ25cIn0gLz5cclxuICAgICAge2lzU3Vic2NyaXB0aW9uRXhwaXJlZCA/IChcclxuICAgICAgICA8TW9kYWxVaVxyXG4gICAgICAgICAgdGl0bGU9e3QoXCJzdWJzY3JpcHRpb24tZXhwaXJlZFwiKX1cclxuICAgICAgICAgIGlzT3Blbj17aXNTdWJzY3JpcHRpb25FeHBpcmVkfVxyXG4gICAgICAgICAgc2hvd0Nsb3NlPXtmYWxzZX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHB5LTQgbWQ6cHktNSBnYXAtNVwiPlxyXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtbGcgZm9udC1ub3JtYWxcIj5cclxuICAgICAgICAgICAgICB7dChcIm93bmVyLXN1YnNjcmlwdGlvbi1leHBpcmVkXCIpfVxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L01vZGFsVWk+XHJcbiAgICAgICkgOiAoXHJcbiAgICAgICAgPD5cclxuICAgICAgICAgIHtpc0xvYWRpbmcuaXNMb2FkID8gKFxyXG4gICAgICAgICAgICA8TG9hZGVyV2l0aE1zZyBpc0xvYWRpbmc9e2lzTG9hZGluZ30gLz5cclxuICAgICAgICAgICkgOiBoYW5kbGVFcnJvciA/IChcclxuICAgICAgICAgICAgPEhhbmRsZUVycm9yIGhhbmRsZUVycm9yPXtoYW5kbGVFcnJvcn0gLz5cclxuICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAge2lzVWlMb2FkaW5nICYmIChcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaC1bMTAwdmhdIHctZnVsbCBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciB6LVs5OTldIGJnLVsjZTZmMmYyXSBiZy1vcGFjaXR5LTgwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxMb2FkZXIgLz5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1iYXNlLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7dChcImxvYWRpbmctbXNzZ1wiKX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICB7aXNDZWxlYnJhdGlvbiAmJiAoXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHotWzEwMDBdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxDb25mZXR0aVxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPXt3aW5kb3cuaW5uZXJXaWR0aH1cclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9e3dpbmRvdy5pbm5lckhlaWdodH1cclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czpcclxuICAgICAgICAgICAgICAgICAgICBpc0V4cGlyZWQgfHxcclxuICAgICAgICAgICAgICAgICAgICAoaXNEZWNsaW5lLmlzRGVjbGluZWQgJiYgaXNEZWNsaW5lLmN1cnJudCA9PT0gXCJhbm90aGVyXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwiYXV0b1wiXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcclxuICAgICAgICAgICAgICAgICAgcHJvcHMudGVtcGxhdGVJZCAmJiBcIm0tMSBib3JkZXItWzAuNXB4XSBib3JkZXItZ3JheS0zMDBcIlxyXG4gICAgICAgICAgICAgICAgfSByZWxhdGl2ZSBvcC1jYXJkIG92ZXJmbG93LWhpZGRlbiBmbGV4IGZsZXgtY29sIG1kOmZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBiZy1iYXNlLTMwMGB9XHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgeyFyZXF1ZXN0U2lnblRvdXIgJiZcclxuICAgICAgICAgICAgICAgICAgc2lnbmVyT2JqZWN0SWQgJiZcclxuICAgICAgICAgICAgICAgICAgcmVxdWVzdFNpZ25Ub3VyRnVuY3Rpb24oKX1cclxuICAgICAgICAgICAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgICAgICAgICAgIGlzT3Blbj17aXNBbGVydC5pc1Nob3d9XHJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPXt0KFwiYWxlcnQtbWVzc2FnZVwiKX1cclxuICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7IGlzU2hvdzogZmFsc2UsIGFsZXJ0TWVzc2FnZTogXCJcIiB9KVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIHAtWzIwcHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+e2lzQWxlcnQuYWxlcnRNZXNzYWdlfTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0FsZXJ0KHsgaXNTaG93OiBmYWxzZSwgYWxlcnRNZXNzYWdlOiBcIlwiIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBtdC0zIHB4LTRcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIHt0KFwib2tcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9Nb2RhbFVpPlxyXG5cclxuICAgICAgICAgICAgICAgIDxUb3VyXHJcbiAgICAgICAgICAgICAgICAgIHNob3dOdW1iZXI9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgICBzaG93TmF2aWdhdGlvbj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICAgIHNob3dOYXZpZ2F0aW9uTnVtYmVyPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgb25SZXF1ZXN0Q2xvc2U9e2Nsb3NlVG91cn1cclxuICAgICAgICAgICAgICAgICAgc3RlcHM9e3RvdXJDb25maWd9XHJcbiAgICAgICAgICAgICAgICAgIGlzT3Blbj17d2lkZ2V0c1RvdXJ9XHJcbiAgICAgICAgICAgICAgICAgIHJvdW5kZWQ9ezV9XHJcbiAgICAgICAgICAgICAgICAgIGNsb3NlV2l0aE1hc2s9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICAgICAgICB7LyogdGhpcyBtb2RhbCBpcyB1c2VkIHRvIHNob3cgZGVjbGluZSBhbGVydCAqL31cclxuICAgICAgICAgICAgICAgIDxQZGZEZWNsaW5lTW9kYWxcclxuICAgICAgICAgICAgICAgICAgc2hvdz17aXNEZWNsaW5lLmlzRGVjbGluZWR9XHJcbiAgICAgICAgICAgICAgICAgIGhlYWRNc2c9e1xyXG4gICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHNbMF0/LklzRGVjbGluZWRcclxuICAgICAgICAgICAgICAgICAgICAgID8gdChcImRvY3VtZW50LWRlY2xpbmVkXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICA6IHQoXCJkb2N1bWVudC1kZWNsaW5lXCIpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYm9keU1zc2c9e1xyXG4gICAgICAgICAgICAgICAgICAgIGlzRGVjbGluZS5jdXJybnQgPT09IFwiU3VyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA/IHQoXCJkZWNsaW5lLWFsZXJ0LTFcIilcclxuICAgICAgICAgICAgICAgICAgICAgIDogaXNEZWNsaW5lLmN1cnJudCA9PT0gXCJZb3VEZWNsaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdChcImRlY2xpbmUtYWxlcnQtMlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGlzRGVjbGluZS5jdXJybnQgPT09IFwiYW5vdGhlclwiICYmIGhhbmRsZURlY2xpbmVNc3NnKClcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBmb290ZXJNZXNzYWdlPXtpc0RlY2xpbmUuY3Vycm50ID09PSBcIlN1cmVcIn1cclxuICAgICAgICAgICAgICAgICAgZGVjbGluZURvYz17ZGVjbGluZURvY31cclxuICAgICAgICAgICAgICAgICAgc2V0SXNEZWNsaW5lPXtzZXRJc0RlY2xpbmV9XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgey8qIHRoaXMgbW9kYWwgaXMgdXNlZCBmb3Igc2hvdyBleHBpcmVkIGFsZXJ0ICovfVxyXG4gICAgICAgICAgICAgICAgPFBkZkRlY2xpbmVNb2RhbFxyXG4gICAgICAgICAgICAgICAgICBzaG93PXtpc0V4cGlyZWR9XHJcbiAgICAgICAgICAgICAgICAgIGhlYWRNc2c9e3QoXCJleHBpcmVkLWRvYy10aXRsZVwiKX1cclxuICAgICAgICAgICAgICAgICAgYm9keU1zc2c9e3QoXCJleHBpcmVkLW9uLW1zc2dcIiwgeyBleHBpcmVkRGF0ZSB9KX1cclxuICAgICAgICAgICAgICAgICAgaXNEb3dubG9hZEJ0bj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRCdG49e2hhbmRsZURvd25sb2FkQnRufVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIHshaXNFbWFpbFZlcmlmaWVkICYmIChcclxuICAgICAgICAgICAgICAgICAgPFZlcmlmeUVtYWlsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNWZXJpZnlNb2RhbD17aXNWZXJpZnlNb2RhbH1cclxuICAgICAgICAgICAgICAgICAgICBzZXRJc1ZlcmlmeU1vZGFsPXtzZXRJc1ZlcmlmeU1vZGFsfVxyXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVZlcmlmeUVtYWlsPXtoYW5kbGVWZXJpZnlFbWFpbH1cclxuICAgICAgICAgICAgICAgICAgICBzZXRPdHA9e3NldE90cH1cclxuICAgICAgICAgICAgICAgICAgICBvdHA9e290cH1cclxuICAgICAgICAgICAgICAgICAgICBvdHBMb2FkZXI9e290cExvYWRlcn1cclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVWZXJpZnlCdG49e2hhbmRsZVZlcmlmeUJ0bn1cclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVSZXNlbmQ9e2hhbmRsZVJlc2VuZH1cclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICA8TW9kYWxVaVxyXG4gICAgICAgICAgICAgICAgICBpc09wZW49e2lzUHVibGljQ29udGFjdH1cclxuICAgICAgICAgICAgICAgICAgdGl0bGU9e2lzT3RwID8gdChcInZlcmlmeS1lbWFpbC0xXCIpIDogdChcImNvbnRhY3QtZGV0YWlsc1wiKX1cclxuICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IGhhbmRsZUNsb3NlT3RwKCl9XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIHAtWzIwcHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge2lzT3RwID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPGZvcm0gb25TdWJtaXQ9e1ZlcmlmeU9UUH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItWzAuNzVyZW1dXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJsb2NrIHRleHQteHMgZm9udC1zZW1pYm9sZCBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImdldC1vdHAtYWxlcnRcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxM3B4XSB0ZXh0LVtyZWRdXCI+ICo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm90cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dChcIm90cC1wbGFjZWhvbGRlclwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW52YWxpZD17KGUpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldEN1c3RvbVZhbGlkaXR5KHQoXCJpbnB1dC1yZXF1aXJlZFwiKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5wdXQ9eyhlKSA9PiBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eShcIlwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17b3RwfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRPdHAoZS50YXJnZXQudmFsdWUpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1pbnB1dCBvcC1pbnB1dC1ib3JkZXJlZCBvcC1pbnB1dC1zbSBmb2N1czpvdXRsaW5lLW5vbmUgaG92ZXI6Ym9yZGVyLWJhc2UtY29udGVudCB3LWZ1bGwgdGV4dC14c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNiBmbGV4IGp1c3RpZnktc3RhcnQgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyB0KFwibG9hZGluZ1wiKSA6IHQoXCJ2ZXJpZnlcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVDbG9zZU90cCgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiY2FuY2VsXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPGZvcm1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1iYXNlLWNvbnRlbnQgcC0yIG14LWF1dG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvblN1Ym1pdD17aGFuZGxlUHVibGljVXNlcn1cclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi1bMC43NXJlbV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC14cyBmb250LXNlbWlib2xkIG1iLVs1cHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcIm5hbWVcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxM3B4XSB0ZXh0LVtyZWRdXCI+ICo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwibmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29udGFjdC5uYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25JbnZhbGlkPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0Q3VzdG9tVmFsaWRpdHkodChcImlucHV0LXJlcXVpcmVkXCIpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25JbnB1dD17KGUpID0+IGUudGFyZ2V0LnNldEN1c3RvbVZhbGlkaXR5KFwiXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtaW5wdXQgb3AtaW5wdXQtYm9yZGVyZWQgb3AtaW5wdXQtc20gZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdy1mdWxsIHRleHQteHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLVswLjc1cmVtXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgbWItWzVweF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiZW1haWxcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxM3B4XSB0ZXh0LVtyZWRdXCI+ICo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJlbWFpbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZW1haWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbnRhY3QuZW1haWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkludmFsaWQ9eyhlKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eSh0KFwiaW5wdXQtcmVxdWlyZWRcIikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbklucHV0PXsoZSkgPT4gZS50YXJnZXQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1pbnB1dCBvcC1pbnB1dC1ib3JkZXJlZCBvcC1pbnB1dC1zbSBmb2N1czpvdXRsaW5lLW5vbmUgaG92ZXI6Ym9yZGVyLWJhc2UtY29udGVudCB3LWZ1bGwgdGV4dC14c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItWzAuNzVyZW1dXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJsb2NrIHRleHQteHMgZm9udC1zZW1pYm9sZCBtYi1bNXB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJwaG9uZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbnRhY3QucGhvbmV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicGhvbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3QoXCJwaG9uZS1vcHRpb25hbFwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtaW5wdXQgb3AtaW5wdXQtYm9yZGVyZWQgb3AtaW5wdXQtc20gZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdy1mdWxsIHRleHQteHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC02IGZsZXgganVzdGlmeS1zdGFydCBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17bG9hZGluZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bG9hZGluZyA/IHQoXCJsb2FkaW5nXCIpIDogdChcInN1Ym1pdFwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUNsb3NlT3RwKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJjbG9zZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L01vZGFsVWk+XHJcbiAgICAgICAgICAgICAgICA8TW9kYWxVaVxyXG4gICAgICAgICAgICAgICAgICBpc09wZW49e2RlZmF1bHRTaWduQWxlcnQuaXNTaG93fVxyXG4gICAgICAgICAgICAgICAgICB0aXRsZT17dChcImF1dG8tc2lnbi1hbGxcIil9XHJcbiAgICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHNldERlZmF1bHRTaWduQWxlcnQoeyBpc1Nob3c6IGZhbHNlLCBhbGVydE1lc3NhZ2U6IFwiXCIgfSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtZnVsbCBwLVsyMHB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPntkZWZhdWx0U2lnbkFsZXJ0LmFsZXJ0TWVzc2FnZX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLVsxcHhdIHctZnVsbCBteS1bMTVweF0gYmctWyM5ZjlmOWZdXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAge2RlZmF1bHRTaWduSW1nID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGFkZERlZmF1bHRTaWduYXR1cmUoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJ5ZXNcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERlZmF1bHRTaWduQWxlcnQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Nob3c6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydE1lc3NhZ2U6IFwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiY2xvc2VcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0FsZXJ0KHsgaXNTaG93OiBmYWxzZSwgYWxlcnRNZXNzYWdlOiBcIlwiIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwib2tcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvTW9kYWxVaT5cclxuICAgICAgICAgICAgICAgIHsvKiB0aGlzIGNvbXBvbmVudCB1c2VkIHRvIHJlbmRlciBhbGwgcGRmIHBhZ2VzIGluIGxlZnQgc2lkZSAqL31cclxuICAgICAgICAgICAgICAgIDxSZW5kZXJBbGxQZGZQYWdlXHJcbiAgICAgICAgICAgICAgICAgIHNpZ25lclBvcz17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICBzaWduZXJPYmplY3RJZD17c2lnbmVyT2JqZWN0SWR9XHJcbiAgICAgICAgICAgICAgICAgIHNpZ25QZGZVcmw9e1xyXG4gICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHNbMF0gJiZcclxuICAgICAgICAgICAgICAgICAgICAocGRmRGV0YWlsc1swXT8uU2lnbmVkVXJsIHx8IHBkZkRldGFpbHNbMF0/LlVSTClcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBhbGxQYWdlcz17YWxsUGFnZXN9XHJcbiAgICAgICAgICAgICAgICAgIHNldEFsbFBhZ2VzPXtzZXRBbGxQYWdlc31cclxuICAgICAgICAgICAgICAgICAgc2V0UGFnZU51bWJlcj17c2V0UGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIHsvKiBwZGYgcmVuZGVyIHZpZXcgKi99XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIiB3LWZ1bGwgbWQ6dy1bNTclXSBmbGV4IG1yLTRcIj5cclxuICAgICAgICAgICAgICAgICAgPFBkZlpvb21cclxuICAgICAgICAgICAgICAgICAgICBjbGlja09uWm9vbUluPXtjbGlja09uWm9vbUlufVxyXG4gICAgICAgICAgICAgICAgICAgIGNsaWNrT25ab29tT3V0PXtjbGlja09uWm9vbU91dH1cclxuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FibGVSb3RhdGU9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiIHctZnVsbCBtZDp3LVs5NSVdIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHsvKiB0aGlzIG1vZGFsIGlzIHVzZWQgc2hvdyB0aGlzIGRvY3VtZW50IGlzIGFscmVhZHkgc2lnbiAqL31cclxuICAgICAgICAgICAgICAgICAgICA8TW9kYWxVaVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNPcGVuPXtpc0NvbXBsZXRlZC5pc01vZGFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e3QoXCJkb2N1bWVudC1zaWduZWRcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZT17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNDb21wbGV0ZWQoKHByZXYpID0+ICh7IC4uLnByZXYsIGlzTW9kYWw6IGZhbHNlIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVkdWNlV2lkdGg9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAhaXNDb21wbGV0ZWQ/Lm1lc3NhZ2UgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJtZDptaW4tdy1bNDQwcHhdIG1kOm1heC13LVs0MDBweF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1mdWxsIHAtWzIwcHhdIHRleHQtYmFzZS1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc0NvbXBsZXRlZD8ubWVzc2FnZSA/IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cD57aXNDb21wbGV0ZWQ/Lm1lc3NhZ2V9PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtWzE1cHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57dChcImRvY3VtZW50LXNpZ25lZC1hbGVydC00XCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgeyFpc0NvbXBsZXRlZD8ubWVzc2FnZSAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG10LTQgZ2FwLTEgcHgtWzE1cHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRvUHJpbnQoZSwgcGRmVXJsLCBzZXRJc0Rvd25sb2FkaW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb250LVs1MDBdIHRleHQtWzEzcHhdIG1yLVs1cHhdIG9wLWJ0biBvcC1idG4tbmV1dHJhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtcHJpbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwicHJpbnRcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRG93bmxvYWRpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9udC1bNTAwXSB0ZXh0LVsxM3B4XSBtci1bNXB4XSBvcC1idG4gb3AtYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXdhcmQgbXgtWzNweF0gbGc6bXgtMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJjZXJ0aWZpY2F0ZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb250LVs1MDBdIHRleHQtWzEzcHhdIG1yLVs1cHhdIG9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRQZGYoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWRvd25sb2FkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImRvd25sb2FkXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvTW9kYWxVaT5cclxuICAgICAgICAgICAgICAgICAgICB7aXNEb3dubG9hZGluZyA9PT0gXCJwZGZcIiAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIHotWzEwMDBdIGluc2V0LTAgZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgYmctYmxhY2sgYmctb3BhY2l0eS0zMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8TG9hZGVyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc09wZW49e2lzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIn1cclxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNEb3dubG9hZGluZyA9PT0gXCJjZXJ0aWZpY2F0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0KFwiZ2VuZXJhdGluZy1jZXJ0aWZpY2F0ZVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogdChcInBkZi1kb3dubG9hZFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHNldElzRG93bmxvYWRpbmcoXCJcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTMgbWQ6cC01IHRleHQtWzEzcHhdIG1kOnRleHQtYmFzZSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aXNEb3dubG9hZGluZyA9PT0gXCJjZXJ0aWZpY2F0ZVwifXtcIiBcIn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3QoXCJnZW5lcmF0ZS1jZXJ0aWZpY2F0ZS1hbGVydFwiKX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L01vZGFsVWk+XHJcbiAgICAgICAgICAgICAgICAgICAgey8qIHRoaXMgY29tcG9uZW50IGlzIHVzZWQgZm9yIHNpZ25hdHVyZSBwYWQgbW9kYWwgKi99XHJcbiAgICAgICAgICAgICAgICAgICAgPFNpZ25QYWRcclxuICAgICAgICAgICAgICAgICAgICAgIGlzU2lnblBhZD17aXNTaWduUGFkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNTdGFtcD17aXNTdGFtcH1cclxuICAgICAgICAgICAgICAgICAgICAgIHNldElzSW1hZ2VTZWxlY3Q9e3NldElzSW1hZ2VTZWxlY3R9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cclxuICAgICAgICAgICAgICAgICAgICAgIHNldEltYWdlPXtzZXRJbWFnZX1cclxuICAgICAgICAgICAgICAgICAgICAgIGlzSW1hZ2VTZWxlY3Q9e2lzSW1hZ2VTZWxlY3R9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZVJlZj17aW1hZ2VSZWZ9XHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkltYWdlQ2hhbmdlPXtvbkltYWdlQ2hhbmdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlPXtzZXRTaWduYXR1cmV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZT17aW1hZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICBvblNhdmVJbWFnZT17c2F2ZUltYWdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgb25TYXZlU2lnbj17c2F2ZVNpZ259XHJcbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2lnbj17ZGVmYXVsdFNpZ25JbWd9XHJcbiAgICAgICAgICAgICAgICAgICAgICBteUluaXRpYWw9e215SW5pdGlhbH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbD17aXNJbml0aWFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0YW1wPXtzZXRJc1N0YW1wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgY3VycldpZGdldHNEZXRhaWxzPXtjdXJyV2lkZ2V0c0RldGFpbHN9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e3NldEN1cnJXaWRnZXRzRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgIHsvKiBwZGYgaGVhZGVyIHdoaWNoIGNvbnRhaW4gZnVuaXNoIGJhY2sgYnV0dG9uICovfVxyXG4gICAgICAgICAgICAgICAgICAgIDxIZWFkZXJcclxuICAgICAgICAgICAgICAgICAgICAgIGlzUGRmUmVxdWVzdEZpbGVzPXtpc1B1YmxpY1RlbXBsYXRlID8gZmFsc2UgOiB0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgIGFsbFBhZ2VzPXthbGxQYWdlc31cclxuICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVBhZ2U9e2NoYW5nZVBhZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzPXtwZGZEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2lnbmVyUG9zPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25lZD17aXNTaWduZWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXRlZD17aXNDb21wbGV0ZWQuaXNDZXJ0aWZpY2F0ZX1cclxuICAgICAgICAgICAgICAgICAgICAgIGVtYmVkV2lkZ2V0c0RhdGE9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1B1YmxpY1RlbXBsYXRlID8gaGFuZGxlVXNlckRldGFpbHMgOiBlbWJlZFdpZGdldHNEYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpc1Nob3dIZWFkZXI9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlY2xpbmU9e3NldElzRGVjbGluZX1cclxuICAgICAgICAgICAgICAgICAgICAgIGRlY2xpbmU9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2lnbmVyPXtjdXJyZW50U2lnbmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgcGRmVXJsPXtwZGZVcmx9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5U2lnbj17YWxyZWFkeVNpZ259XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJXSD17Y29udGFpbmVyV0h9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpc1B1YmxpY1RlbXBsYXRlPXtpc1B1YmxpY1RlbXBsYXRlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2tPblpvb21Jbj17Y2xpY2tPblpvb21Jbn1cclxuICAgICAgICAgICAgICAgICAgICAgIGNsaWNrT25ab29tT3V0PXtjbGlja09uWm9vbU91dH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZVJvdGF0ZT17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSWQ9e3Byb3BzLnRlbXBsYXRlSWR9XHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiByZWY9e2RpdlJlZn0gZGF0YS10dXQ9XCJwZGZBcmVhXCIgY2xhc3NOYW1lPVwiaC1bOTUlXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge2NvbnRhaW5lcldIICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgPFJlbmRlclBkZlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSD17cGRmT3JpZ2luYWxXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZOZXdXaWR0aD17cGRmTmV3V2lkdGh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTaWduUGFkPXtzZXRJc1NpZ25QYWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcD17c2V0SXNTdGFtcH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduS2V5PXtzZXRTaWduS2V5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHM9e3BkZkRldGFpbHN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVyUG9zPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0VtYWlsPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZVcmw9e3BkZlVybH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBudW1QYWdlcz17bnVtUGFnZXN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZURldGFpbHM9e3BhZ2VEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZlJlcXVlc3Q9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVyT2JqZWN0SWQ9e3NpZ25lck9iamVjdElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZFNpZ25lcnM9e3NpZ25lZFNpZ25lcnN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGRmTG9hZD17c2V0UGRmTG9hZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZMb2FkPXtwZGZMb2FkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25lclBvcz17c2V0U2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luaXRpYWw9e3NldElzSW5pdGlhbH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0PXtzZXRWYWxpZGF0ZUFsZXJ0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHVuU2lnbmVkV2lkZ2V0SWQ9e3VuU2lnbmVkV2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQ9e3NldFNlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFdpZGdldElkPXtzZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e3NldEN1cnJXaWRnZXRzRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZSZWY9e2RpdlJlZn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1Jlc2l6ZT17c2V0SXNSZXNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXNpemU9e2lzUmVzaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNjYWxlPXtzZXRTY2FsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQ9e3VuaXF1ZUlkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzcHVibGljVGVtcGxhdGU9e2lzUHVibGljVGVtcGxhdGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlckRldGFpbHM9e2hhbmRsZVVzZXJEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBtZDp3LVsyMyVdIGJnLWJhc2UtMTAwIG92ZXJmbG93LXktYXV0byBoaWRlLXNjcm9sbGJhciBoaWRkZW4gbWQ6aW5saW5lLWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgbWF4LWgtc2NyZWVuYH0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NpZ25lZFNpZ25lcnMubGVuZ3RoID4gMCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10dXQ9XCJyZWFjdG91clNlY29uZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXgtMiBwci0yIHB0LTIgcGItMSB0ZXh0LVsxNXB4XSB0ZXh0LWJhc2UtY29udGVudCBmb250LXNlbWlib2xkIGJvcmRlci1iLVsxcHhdIGJvcmRlci1iYXNlLTMwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57dChcInNpZ25lZC1ieVwiKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LVsycHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3NpZ25lZFNpZ25lcnMubWFwKChvYmosIGluZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2luZH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNpZ25lckxpc3RDb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZD17aW5kfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqPXtvYmp9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01lbnU9e2lzSGVhZGVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVyUG9zPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHt1bnNpZ25lZFNpZ25lcnMubGVuZ3RoID4gMCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10dXQ9XCJyZWFjdG91ckZpcnN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteC0yIHByLTIgcHQtMiBwYi0xIHRleHQtWzE1cHhdIHRleHQtYmFzZS1jb250ZW50IGZvbnQtc2VtaWJvbGQgYm9yZGVyLWItWzFweF0gYm9yZGVyLWJhc2UtMzAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt0KFwieWV0LXRvLXNpZ25cIil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC1bNXB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt1bnNpZ25lZFNpZ25lcnMubWFwKChvYmosIGluZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2luZH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNpZ25lckxpc3RDb21wb25lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZD17aW5kfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqPXtvYmp9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01lbnU9e2lzSGVhZGVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVyUG9zPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAge2RlZmF1bHRTaWduSW1nICYmICFhbHJlYWR5U2lnbiAmJiBjdXJyZW50U2lnbmVyICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgIDxEZWZhdWx0U2lnbmF0dXJlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTaWduSW1nPXtkZWZhdWx0U2lnbkltZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlck9iamVjdElkPXtzaWduZXJPYmplY3RJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nPXtzZXRJc0xvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXREZWZhdWx0U2lnbkFsZXJ0PXtzZXREZWZhdWx0U2lnbkFsZXJ0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICl9XHJcbiAgICAgICAgICA8TW9kYWxVaVxyXG4gICAgICAgICAgICBpc09wZW49e3ZhbGlkYXRlQWxlcnR9XHJcbiAgICAgICAgICAgIHRpdGxlPXt0KFwidmFsaWRhdGlvbi1hbGVydFwiKX1cclxuICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHNldFZhbGlkYXRlQWxlcnQoZmFsc2UpfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtWzEwMCVdIHAtWzIwcHhdXCI+XHJcbiAgICAgICAgICAgICAgPHA+e3QoXCJ2YWxpZGF0aW9uLWFsZXJ0LTFcIil9PC9wPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1bMXB4XSBiZy1bIzlmOWY5Zl0gdy1mdWxsIG15LVsxNXB4XVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZhbGlkYXRlQWxlcnQoZmFsc2UpfVxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7dChcImNsb3NlXCIpfVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvTW9kYWxVaT5cclxuICAgICAgICA8Lz5cclxuICAgICAgKX1cclxuICAgIDwvRG5kUHJvdmlkZXI+XHJcbiAgKTtcclxufVxyXG5leHBvcnQgZGVmYXVsdCBQZGZSZXF1ZXN0RmlsZXM7XHJcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuY29uc3QgQWxlcnQgPSAoeyBjaGlsZHJlbiwgdHlwZSwgY2xhc3NOYW1lIH0pID0+IHtcbiAgY29uc3QgdGV4dGNvbG9yID0gdHlwZSA/IHRoZW1lKHR5cGUpIDogdGhlbWUoKTtcbiAgZnVuY3Rpb24gdGhlbWUoY29sb3IpIHtcbiAgICBzd2l0Y2ggKGNvbG9yKSB7XG4gICAgICBjYXNlIFwic3VjY2Vzc1wiOlxuICAgICAgICByZXR1cm4gXCJvcC1hbGVydC1zdWNjZXNzXCI7XG4gICAgICBjYXNlIFwiaW5mb1wiOlxuICAgICAgICByZXR1cm4gXCJvcC1hbGVydC1pbmZvXCI7XG4gICAgICBjYXNlIFwiZGFuZ2VyXCI6XG4gICAgICAgIHJldHVybiBcIm9wLWFsZXJ0LWVycm9yXCI7XG4gICAgICBjYXNlIFwid2FybmluZ1wiOlxuICAgICAgICByZXR1cm4gXCJvcC1hbGVydC13YXJuaW5nXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICBjaGlsZHJlbiAmJiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17YCR7XG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICAgICA/IGNsYXNzTmFtZVxuICAgICAgICAgICAgOiBcInotWzEwMDBdIGZpeGVkIHRvcC0yMCBsZWZ0LTEvMiB0cmFuc2Zvcm0gLXRyYW5zbGF0ZS14LTEvMiB0ZXh0LXNtXCJcbiAgICAgICAgfSAgYH1cbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BvcC1hbGVydCAke3RleHRjb2xvcn1gfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtbC0zXCI+e2NoaWxkcmVufTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbGVydDtcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuXHJcbmZ1bmN0aW9uIEhhbmRsZUVycm9yKHsgaGFuZGxlRXJyb3IgfSkge1xyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGgtWzEwMHZoXVwiPlxyXG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsyMHB4XSB0ZXh0LVtncmF5XVwiPntoYW5kbGVFcnJvcn08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIYW5kbGVFcnJvcjtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG5jb25zdCBMb2FkZXIgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJvcC1sb2FkaW5nIG9wLWxvYWRpbmctaW5maW5pdHkgdy1bNHJlbV0gdGV4dC1uZXV0cmFsXCI+PC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBMb2FkZXI7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTG9hZGVyIGZyb20gXCIuL0xvYWRlclwiO1xuXG5mdW5jdGlvbiBMb2FkZXJXaXRoTXNnKHsgaXNMb2FkaW5nIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGgtWzEwMHZoXVwiPlxuICAgICAgPExvYWRlciAvPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1iYXNlLWNvdGVudFwiPntpc0xvYWRpbmcubWVzc2FnZX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvYWRlcldpdGhNc2c7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmNvbnN0IE1vZGFsVWkgPSAoe1xuICBjaGlsZHJlbixcbiAgdGl0bGUsXG4gIGlzT3BlbixcbiAgaGFuZGxlQ2xvc2UsXG4gIHNob3dIZWFkZXIgPSB0cnVlLFxuICBzaG93Q2xvc2UgPSB0cnVlLFxuICByZWR1Y2VXaWR0aFxufSkgPT4ge1xuICBjb25zdCB3aWR0aCA9IHJlZHVjZVdpZHRoO1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7aXNPcGVuICYmIChcbiAgICAgICAgPGRpYWxvZyBjbGFzc05hbWU9XCJvcC1tb2RhbCBvcC1tb2RhbC1vcGVuXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcbiAgICAgICAgICAgICAgd2lkdGggfHwgXCJtZDptaW4tdy1bNTAwcHhdXCJcbiAgICAgICAgICAgIH0gb3AtbW9kYWwtYm94IHAtMCBtYXgtaC05MCBvdmVyZmxvdy15LWF1dG8gaGlkZS1zY3JvbGxiYXIgdGV4dC1zbWB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3Nob3dIZWFkZXIgJiYgKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIHt0aXRsZSAmJiAoXG4gICAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwidGV4dC1iYXNlLWNvbnRlbnQgZm9udC1ib2xkIHRleHQtbGcgcHQtWzE1cHhdIHB4LVsyMHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge3Nob3dDbG9zZSAmJiAoXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tc20gb3AtYnRuLWNpcmNsZSBvcC1idG4tZ2hvc3QgdGV4dC1iYXNlLWNvbnRlbnQgYWJzb2x1dGUgcmlnaHQtMiB0b3AtMlwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUNsb3NlICYmIGhhbmRsZUNsb3NlKCl9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIOKclVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPGRpdj57Y2hpbGRyZW59PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGlhbG9nPlxuICAgICAgKX1cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1vZGFsVWk7XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBcIi4uL3N0eWxlcy9zaWduYXR1cmUuY3NzXCI7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XG5cbmZ1bmN0aW9uIEN1c3RvbU1vZGFsKHByb3BzKSB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW3JlYXNvbiwgc2V0UmVhc29uXSA9IHVzZVN0YXRlKFwiXCIpO1xuICByZXR1cm4gKFxuICAgIHByb3BzLnNob3cgJiYgKFxuICAgICAgPGRpYWxvZyBjbGFzc05hbWU9XCJvcC1tb2RhbCBvcC1tb2RhbC1vcGVuIGFic29sdXRlIHotWzQ0OF1cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LVs5NSVdIG1kOnctWzYwJV0gbGc6dy1bNDAlXSBvcC1tb2RhbC1ib3ggcC0wIG92ZXJmbG93LXktYXV0byBoaWRlLXNjcm9sbGJhciB0ZXh0LXNtXCI+XG4gICAgICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtYmFzZS1jb250ZW50IGZvbnQtYm9sZCB0ZXh0LWxnIHB0LVsxNXB4XSBweC1bMjBweF1cIj5cbiAgICAgICAgICAgIHtwcm9wcz8uaGVhZE1zZyAmJiBwcm9wcz8uaGVhZE1zZ31cbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC1bMTBweF0gcHgtWzIwcHhdXCI+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LVsxNXB4XVwiPntwcm9wcy5ib2R5TXNzZyAmJiBwcm9wcy5ib2R5TXNzZ308L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge3Byb3BzLmlzRG93bmxvYWRCdG4gJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktc3RhcnQgdy1mdWxsIG1sLVsyMHB4XSBtYi0zIG10LTFcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHByb3BzLmhhbmRsZURvd25sb2FkQnRuKCl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBEb3dubG9hZFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge3Byb3BzLmZvb3Rlck1lc3NhZ2UgJiYgKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC0zXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICByb3dzPXszfVxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJSZWFzb24gKG9wdGlvbmFsKVwiXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJweC00IG9wLXRleHRhcmVhIG9wLXRleHRhcmVhLWJvcmRlcmVkIGZvY3VzOm91dGxpbmUtbm9uZSBob3Zlcjpib3JkZXItYmFzZS1jb250ZW50IHctZnVsbCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXtyZWFzb259XG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFJlYXNvbihlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm0tWzE1cHhdXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG1yLTIgcHgtNlwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UmVhc29uKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICBwcm9wcy5kZWNsaW5lRG9jKHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt0KFwieWVzXCIpfVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRSZWFzb24oXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnNldElzRGVjbGluZSh7IGlzRGVjbGluZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7dChcImNsb3NlXCIpfVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaWFsb2c+XG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDdXN0b21Nb2RhbDtcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRvdXJDb250ZW50V2l0aEJ0bih7IG1lc3NhZ2UsIGlzQ2hlY2tlZCwgdmlkZW8gfSkge1xyXG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcclxuICBjb25zdCBbaXNDaGVjaywgc2V0SXNDaGVja10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNoZWNrID0gKCkgPT4ge1xyXG4gICAgc2V0SXNDaGVjayghaXNDaGVjayk7XHJcbiAgICBpZiAoaXNDaGVja2VkKSB7XHJcbiAgICAgIGlzQ2hlY2tlZCghaXNDaGVjayk7XHJcbiAgICB9XHJcbiAgfTtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdj5cclxuICAgICAgPHA+e21lc3NhZ2V9PC9wPlxyXG4gICAgICB7dmlkZW8gJiYgKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbXktWzEwcHhdIGJvcmRlci1bMS4zcHhdIGJvcmRlci1ncmF5LTQwMCByb3VuZGVkLXNtXCI+XHJcbiAgICAgICAgICA8aWZyYW1lXHJcbiAgICAgICAgICAgIHNyYz17dmlkZW99XHJcbiAgICAgICAgICAgIHRpdGxlPVwiWW91VHViZSB2aWRlbyBwbGF5ZXJcIlxyXG4gICAgICAgICAgICBhbGxvdz1cImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmU7IHdlYi1zaGFyZVwiXHJcbiAgICAgICAgICAgIGFsbG93RnVsbFNjcmVlblxyXG4gICAgICAgICAgPjwvaWZyYW1lPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApfVxyXG4gICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbWItMFwiPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWNoZWNrYm94IG9wLWNoZWNrYm94LXhzIG1yLTFcIlxyXG4gICAgICAgICAgY2hlY2tlZD17aXNDaGVja31cclxuICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGVja31cclxuICAgICAgICAvPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIiM3ODc4NzggdGV4dC1bMTJweF1cIj57dChcInRvdXItY29udGVudFwiKX08L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcbiIsImltcG9ydCB7IGNyZWF0ZVNsaWNlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcclxuXHJcbmNvbnN0IHNob3dUZW5hbnRTbGljZSA9IGNyZWF0ZVNsaWNlKHtcclxuICBuYW1lOiBcInNob3dUZW5hbnRcIixcclxuICBpbml0aWFsU3RhdGU6IFwiXCIsXHJcbiAgcmVkdWNlcnM6IHtcclxuICAgIHNob3dUZW5hbnQ6IChzdGF0ZSwgYWN0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcclxuICAgIH0sXHJcbiAgfSxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgeyBzaG93VGVuYW50IH0gPSBzaG93VGVuYW50U2xpY2UuYWN0aW9ucztcclxuZXhwb3J0IGRlZmF1bHQgc2hvd1RlbmFudFNsaWNlLnJlZHVjZXI7IiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UgfSBmcm9tIFwiQHJlZHV4anMvdG9vbGtpdFwiO1xyXG5cclxuY29uc3QgdG91clN0ZXBTbGljZSA9IGNyZWF0ZVNsaWNlKHtcclxuICBuYW1lOiBcInRvdXJTdGVwXCIsXHJcbiAgaW5pdGlhbFN0YXRlOiBbXSxcclxuICByZWR1Y2Vyczoge1xyXG4gICAgc2F2ZVRvdXJTdGVwczogKHN0YXRlLCBhY3Rpb24pID0+IHtcclxuICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xyXG4gICAgfSxcclxuICAgIHJlbW92ZVRvdXJTdGVwczogKCkgPT4ge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgfVxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCB7IHNhdmVUb3VyU3RlcHMsIHJlbW92ZVRvdXJTdGVwcyB9ID0gdG91clN0ZXBTbGljZS5hY3Rpb25zO1xyXG5leHBvcnQgZGVmYXVsdCB0b3VyU3RlcFNsaWNlLnJlZHVjZXI7XHJcbiIsImltcG9ydCB7IGNyZWF0ZVNsaWNlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcclxuaW1wb3J0IHsgYXBwSW5mbyB9IGZyb20gXCIuLi8uLi9jb25zdGFudC9hcHBpbmZvXCI7XHJcblxyXG5jb25zdCBpbmZvU2xpY2UgPSBjcmVhdGVTbGljZSh7XHJcbiAgbmFtZTogXCJpbmZvXCIsXHJcbiAgaW5pdGlhbFN0YXRlOiB7fSxcclxuICByZWR1Y2Vyczoge1xyXG4gICAgZmV0Y2hBcHBJbmZvOiAoKSA9PiB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYmFzZVVybFwiLCBgJHthcHBJbmZvLmJhc2VVcmx9L2ApO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInBhcnNlQXBwSWRcIiwgYXBwSW5mby5hcHBJZCk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYXBwTG9nb1wiLCBhcHBJbmZvLmFwcGxvZ28pO1xyXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcInVzZXJTZXR0aW5nc1wiKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJ1c2VyU2V0dGluZ3NcIiwgSlNPTi5zdHJpbmdpZnkoYXBwSW5mby5zZXR0aW5ncykpO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImZldl9JY29uXCIsIGFwcEluZm8uZmV2X0ljb24pO1xyXG4gICAgICByZXR1cm4gYXBwSW5mbztcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG5leHBvcnQgY29uc3QgeyBmZXRjaEFwcEluZm8gfSA9IGluZm9TbGljZS5hY3Rpb25zO1xyXG5leHBvcnQgZGVmYXVsdCBpbmZvU2xpY2UucmVkdWNlcjtcclxuIiwiaW1wb3J0IHsgY3JlYXRlU2xpY2UgfSBmcm9tIFwiQHJlZHV4anMvdG9vbGtpdFwiO1xyXG5cclxuY29uc3Qgc2hvd0hlYWRlclNsaWNlID0gY3JlYXRlU2xpY2Uoe1xyXG4gIG5hbWU6IFwic2hvd1RlbmFudFwiLFxyXG4gIGluaXRpYWxTdGF0ZTogXCJcIixcclxuICByZWR1Y2Vyczoge1xyXG4gICAgc2hvd0hlYWRlcjogKHN0YXRlLCBhY3Rpb24pID0+IHtcclxuICAgICAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgeyBzaG93SGVhZGVyIH0gPSBzaG93SGVhZGVyU2xpY2UuYWN0aW9ucztcclxuZXhwb3J0IGRlZmF1bHQgc2hvd0hlYWRlclNsaWNlLnJlZHVjZXI7XHJcbiIsIi8vIGltcG9ydCB7IGNyZWF0ZVN0b3JlLCBhcHBseU1pZGRsZXdhcmUgfSBmcm9tIFwicmVkdXhcIjtcclxuLy8gaW1wb3J0IHRodW5rIGZyb20gXCJyZWR1eC10aHVua1wiO1xyXG4vLyBpbXBvcnQgcmVkdWNlcnMgZnJvbSBcIi4vcmVkdWNlcnNcIjtcclxuXHJcbi8vIGV4cG9ydCBjb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlKHJlZHVjZXJzLCBhcHBseU1pZGRsZXdhcmUodGh1bmspKTtcclxuaW1wb3J0IHsgY29uZmlndXJlU3RvcmUgfSBmcm9tIFwiQHJlZHV4anMvdG9vbGtpdFwiO1xyXG5pbXBvcnQgaW5mb1JlZHVjZXIgZnJvbSBcIi4vcmVkdWNlcnMvaW5mb1JlZHVjZXJcIjtcclxuaW1wb3J0IFNob3dUZW5hbnQgZnJvbSBcIi4vcmVkdWNlcnMvU2hvd1RlbmFudFwiO1xyXG5pbXBvcnQgVG91clN0ZXBzUmVkdWNlciBmcm9tIFwiLi9yZWR1Y2Vycy9Ub3VyU3RlcHNSZWR1Y2VyXCI7XHJcbmltcG9ydCBzaG93SGVhZGVyIGZyb20gXCIuL3JlZHVjZXJzL3Nob3dIZWFkZXJcIjtcclxuZXhwb3J0IGNvbnN0IHN0b3JlID0gY29uZmlndXJlU3RvcmUoe1xyXG4gIHJlZHVjZXI6IHtcclxuICAgIGFwcEluZm86IGluZm9SZWR1Y2VyLFxyXG4gICAgVG91clN0ZXBzOiBUb3VyU3RlcHNSZWR1Y2VyLFxyXG4gICAgU2hvd1RlbmFudCxcclxuICAgIHNob3dIZWFkZXJcclxuICB9XHJcbn0pO1xyXG4iLCJpbXBvcnQgaTE4biBmcm9tIFwiaTE4bmV4dFwiO1xuaW1wb3J0IHsgaW5pdFJlYWN0STE4bmV4dCB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XG5pbXBvcnQgTGFuZ3VhZ2VEZXRlY3RvciBmcm9tIFwiaTE4bmV4dC1icm93c2VyLWxhbmd1YWdlZGV0ZWN0b3JcIjtcbmltcG9ydCBlbiBmcm9tIFwiLi9sb2NhbGVzL2VuL3RyYW5zbGF0aW9uLmpzb25cIjtcbmltcG9ydCBmciBmcm9tIFwiLi9sb2NhbGVzL2ZyL3RyYW5zbGF0aW9uLmpzb25cIjtcblxuaTE4blxuICAudXNlKExhbmd1YWdlRGV0ZWN0b3IpXG4gIC51c2UoaW5pdFJlYWN0STE4bmV4dClcbiAgLmluaXQoe1xuICAgIHJlc291cmNlczoge1xuICAgICAgZW46IHtcbiAgICAgICAgdHJhbnNsYXRpb246IGVuXG4gICAgICB9LFxuICAgICAgZnI6IHtcbiAgICAgICAgdHJhbnNsYXRpb246IGZyXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZhbGxiYWNrTG5nOiBcImVuXCIsIC8vIGZhbGxiYWNrIGxhbmd1YWdlXG4gICAgZGV0ZWN0aW9uOiB7XG4gICAgICAvLyBTcGVjaWZpZXMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgdG8gZmFsbCBiYWNrIHRvIGlmIHRoZSBkZXRlY3RlZCBsYW5ndWFnZSBpcyBub3QgYXZhaWxhYmxlLlxuICAgICAgb3JkZXI6IFtcImxvY2FsU3RvcmFnZVwiLCBcIm5hdmlnYXRvclwiXVxuICAgICAgLy8gRGVmaW5lcyB3aGVyZSB0aGUgZGV0ZWN0ZWQgbGFuZ3VhZ2Ugc2hvdWxkIGJlIGNhY2hlZC5cbiAgICB9LFxuICAgIGRlYnVnOiBmYWxzZSxcbiAgICBpbnRlcnBvbGF0aW9uOiB7XG4gICAgICBlc2NhcGVWYWx1ZTogZmFsc2UgLy8gUmVhY3QgYWxyZWFkeSBkb2VzIGVzY2FwaW5nXG4gICAgfSxcbiAgICB3aGl0ZWxpc3Q6IFtcImVuXCIsIFwiZnJcIl0gLy8gTGlzdCBvZiBhbGxvd2VkIGxhbmd1YWdlc1xuICB9KTtcblxuZXhwb3J0IGRlZmF1bHQgaTE4bjtcbiIsImZ1bmN0aW9uIHIoZSl7dmFyIG8sdCxmPVwiXCI7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGV8fFwibnVtYmVyXCI9PXR5cGVvZiBlKWYrPWU7ZWxzZSBpZihcIm9iamVjdFwiPT10eXBlb2YgZSlpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgbj1lLmxlbmd0aDtmb3Iobz0wO288bjtvKyspZVtvXSYmKHQ9cihlW29dKSkmJihmJiYoZis9XCIgXCIpLGYrPXQpfWVsc2UgZm9yKHQgaW4gZSllW3RdJiYoZiYmKGYrPVwiIFwiKSxmKz10KTtyZXR1cm4gZn1mdW5jdGlvbiBlKCl7Zm9yKHZhciBlLG8sdD0wLGY9XCJcIixuPWFyZ3VtZW50cy5sZW5ndGg7dDxuO3QrKykoZT1hcmd1bWVudHNbdF0pJiYobz1yKGUpKSYmKGYmJihmKz1cIiBcIiksZis9byk7cmV0dXJuIGZ9bW9kdWxlLmV4cG9ydHM9ZSxtb2R1bGUuZXhwb3J0cy5jbHN4PWU7IiwidmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIHRvQ2xhc3NOYW1lID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpXG4gICAgICAgIHN0ciArPSB2YWw7XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIHRtcCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgdmFyIGwgPSB2YWwubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKGkgPCBsKSB7XG4gICAgICAgICAgICAgICAgdG1wID0gdG9DbGFzc05hbWUodmFsW2krK10pO1xuICAgICAgICAgICAgICAgIGlmICh0bXApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gdG1wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBndWFyZC1mb3ItaW5cbiAgICAgICAgICAgIGZvciAodG1wIGluIHZhbCkge1xuICAgICAgICAgICAgICAgIGlmICh0bXAgJiYgdmFsW3RtcF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gdG1wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBjbmIoKSB7XG4gICAgdmFyIGwgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgbjtcbiAgICB2YXIgdG1wO1xuICAgIHZhciBzdHIgPSAnJztcbiAgICB3aGlsZSAoaSA8IGwpIHtcbiAgICAgICAgbiA9IGFyZ3VtZW50c1tpKytdO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgdG1wID0gdG9DbGFzc05hbWUobik7XG4gICAgICAgICAgICBpZiAodG1wKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cikge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHIgKz0gdG1wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG4iLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vZW5jLWJhc2U2NFwiKSwgcmVxdWlyZShcIi4vbWQ1XCIpLCByZXF1aXJlKFwiLi9ldnBrZGZcIiksIHJlcXVpcmUoXCIuL2NpcGhlci1jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2VuYy1iYXNlNjRcIiwgXCIuL21kNVwiLCBcIi4vZXZwa2RmXCIsIFwiLi9jaXBoZXItY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIEJsb2NrQ2lwaGVyID0gQ19saWIuQmxvY2tDaXBoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBMb29rdXAgdGFibGVzXG5cdCAgICB2YXIgU0JPWCA9IFtdO1xuXHQgICAgdmFyIElOVl9TQk9YID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8wID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8xID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8yID0gW107XG5cdCAgICB2YXIgU1VCX01JWF8zID0gW107XG5cdCAgICB2YXIgSU5WX1NVQl9NSVhfMCA9IFtdO1xuXHQgICAgdmFyIElOVl9TVUJfTUlYXzEgPSBbXTtcblx0ICAgIHZhciBJTlZfU1VCX01JWF8yID0gW107XG5cdCAgICB2YXIgSU5WX1NVQl9NSVhfMyA9IFtdO1xuXG5cdCAgICAvLyBDb21wdXRlIGxvb2t1cCB0YWJsZXNcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gQ29tcHV0ZSBkb3VibGUgdGFibGVcblx0ICAgICAgICB2YXIgZCA9IFtdO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcblx0ICAgICAgICAgICAgaWYgKGkgPCAxMjgpIHtcblx0ICAgICAgICAgICAgICAgIGRbaV0gPSBpIDw8IDE7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBkW2ldID0gKGkgPDwgMSkgXiAweDExYjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIC8vIFdhbGsgR0YoMl44KVxuXHQgICAgICAgIHZhciB4ID0gMDtcblx0ICAgICAgICB2YXIgeGkgPSAwO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBzYm94XG5cdCAgICAgICAgICAgIHZhciBzeCA9IHhpIF4gKHhpIDw8IDEpIF4gKHhpIDw8IDIpIF4gKHhpIDw8IDMpIF4gKHhpIDw8IDQpO1xuXHQgICAgICAgICAgICBzeCA9IChzeCA+Pj4gOCkgXiAoc3ggJiAweGZmKSBeIDB4NjM7XG5cdCAgICAgICAgICAgIFNCT1hbeF0gPSBzeDtcblx0ICAgICAgICAgICAgSU5WX1NCT1hbc3hdID0geDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIG11bHRpcGxpY2F0aW9uXG5cdCAgICAgICAgICAgIHZhciB4MiA9IGRbeF07XG5cdCAgICAgICAgICAgIHZhciB4NCA9IGRbeDJdO1xuXHQgICAgICAgICAgICB2YXIgeDggPSBkW3g0XTtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIHN1YiBieXRlcywgbWl4IGNvbHVtbnMgdGFibGVzXG5cdCAgICAgICAgICAgIHZhciB0ID0gKGRbc3hdICogMHgxMDEpIF4gKHN4ICogMHgxMDEwMTAwKTtcblx0ICAgICAgICAgICAgU1VCX01JWF8wW3hdID0gKHQgPDwgMjQpIHwgKHQgPj4+IDgpO1xuXHQgICAgICAgICAgICBTVUJfTUlYXzFbeF0gPSAodCA8PCAxNikgfCAodCA+Pj4gMTYpO1xuXHQgICAgICAgICAgICBTVUJfTUlYXzJbeF0gPSAodCA8PCA4KSAgfCAodCA+Pj4gMjQpO1xuXHQgICAgICAgICAgICBTVUJfTUlYXzNbeF0gPSB0O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgaW52IHN1YiBieXRlcywgaW52IG1peCBjb2x1bW5zIHRhYmxlc1xuXHQgICAgICAgICAgICB2YXIgdCA9ICh4OCAqIDB4MTAxMDEwMSkgXiAoeDQgKiAweDEwMDAxKSBeICh4MiAqIDB4MTAxKSBeICh4ICogMHgxMDEwMTAwKTtcblx0ICAgICAgICAgICAgSU5WX1NVQl9NSVhfMFtzeF0gPSAodCA8PCAyNCkgfCAodCA+Pj4gOCk7XG5cdCAgICAgICAgICAgIElOVl9TVUJfTUlYXzFbc3hdID0gKHQgPDwgMTYpIHwgKHQgPj4+IDE2KTtcblx0ICAgICAgICAgICAgSU5WX1NVQl9NSVhfMltzeF0gPSAodCA8PCA4KSAgfCAodCA+Pj4gMjQpO1xuXHQgICAgICAgICAgICBJTlZfU1VCX01JWF8zW3N4XSA9IHQ7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBuZXh0IGNvdW50ZXJcblx0ICAgICAgICAgICAgaWYgKCF4KSB7XG5cdCAgICAgICAgICAgICAgICB4ID0geGkgPSAxO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgeCA9IHgyIF4gZFtkW2RbeDggXiB4Ml1dXTtcblx0ICAgICAgICAgICAgICAgIHhpIF49IGRbZFt4aV1dO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSgpKTtcblxuXHQgICAgLy8gUHJlY29tcHV0ZWQgUmNvbiBsb29rdXBcblx0ICAgIHZhciBSQ09OID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzZdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFFUyBibG9jayBjaXBoZXIgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgQUVTID0gQ19hbGdvLkFFUyA9IEJsb2NrQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIHQ7XG5cblx0ICAgICAgICAgICAgLy8gU2tpcCByZXNldCBvZiBuUm91bmRzIGhhcyBiZWVuIHNldCBiZWZvcmUgYW5kIGtleSBkaWQgbm90IGNoYW5nZVxuXHQgICAgICAgICAgICBpZiAodGhpcy5fblJvdW5kcyAmJiB0aGlzLl9rZXlQcmlvclJlc2V0ID09PSB0aGlzLl9rZXkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5fa2V5UHJpb3JSZXNldCA9IHRoaXMuX2tleTtcblx0ICAgICAgICAgICAgdmFyIGtleVdvcmRzID0ga2V5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIga2V5U2l6ZSA9IGtleS5zaWdCeXRlcyAvIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBudW1iZXIgb2Ygcm91bmRzXG5cdCAgICAgICAgICAgIHZhciBuUm91bmRzID0gdGhpcy5fblJvdW5kcyA9IGtleVNpemUgKyA2O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgbnVtYmVyIG9mIGtleSBzY2hlZHVsZSByb3dzXG5cdCAgICAgICAgICAgIHZhciBrc1Jvd3MgPSAoblJvdW5kcyArIDEpICogNDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIGtleSBzY2hlZHVsZVxuXHQgICAgICAgICAgICB2YXIga2V5U2NoZWR1bGUgPSB0aGlzLl9rZXlTY2hlZHVsZSA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBrc1JvdyA9IDA7IGtzUm93IDwga3NSb3dzOyBrc1JvdysrKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoa3NSb3cgPCBrZXlTaXplKSB7XG5cdCAgICAgICAgICAgICAgICAgICAga2V5U2NoZWR1bGVba3NSb3ddID0ga2V5V29yZHNba3NSb3ddO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ID0ga2V5U2NoZWR1bGVba3NSb3cgLSAxXTtcblxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghKGtzUm93ICUga2V5U2l6ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUm90IHdvcmRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICh0IDw8IDgpIHwgKHQgPj4+IDI0KTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWIgd29yZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKFNCT1hbdCA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyh0ID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsodCA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbdCAmIDB4ZmZdO1xuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1peCBSY29uXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHQgXj0gUkNPTlsoa3NSb3cgLyBrZXlTaXplKSB8IDBdIDw8IDI0O1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5U2l6ZSA+IDYgJiYga3NSb3cgJSBrZXlTaXplID09IDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ViIHdvcmRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdCA9IChTQk9YW3QgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsodCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHQgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3QgJiAweGZmXTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgICAgICBrZXlTY2hlZHVsZVtrc1Jvd10gPSBrZXlTY2hlZHVsZVtrc1JvdyAtIGtleVNpemVdIF4gdDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgaW52IGtleSBzY2hlZHVsZVxuXHQgICAgICAgICAgICB2YXIgaW52S2V5U2NoZWR1bGUgPSB0aGlzLl9pbnZLZXlTY2hlZHVsZSA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpbnZLc1JvdyA9IDA7IGludktzUm93IDwga3NSb3dzOyBpbnZLc1JvdysrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIga3NSb3cgPSBrc1Jvd3MgLSBpbnZLc1JvdztcblxuXHQgICAgICAgICAgICAgICAgaWYgKGludktzUm93ICUgNCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ga2V5U2NoZWR1bGVba3NSb3ddO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGtleVNjaGVkdWxlW2tzUm93IC0gNF07XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGlmIChpbnZLc1JvdyA8IDQgfHwga3NSb3cgPD0gNCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGludktleVNjaGVkdWxlW2ludktzUm93XSA9IHQ7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGludktleVNjaGVkdWxlW2ludktzUm93XSA9IElOVl9TVUJfTUlYXzBbU0JPWFt0ID4+PiAyNF1dIF4gSU5WX1NVQl9NSVhfMVtTQk9YWyh0ID4+PiAxNikgJiAweGZmXV0gXlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVl9TVUJfTUlYXzJbU0JPWFsodCA+Pj4gOCkgJiAweGZmXV0gXiBJTlZfU1VCX01JWF8zW1NCT1hbdCAmIDB4ZmZdXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBlbmNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZG9DcnlwdEJsb2NrKE0sIG9mZnNldCwgdGhpcy5fa2V5U2NoZWR1bGUsIFNVQl9NSVhfMCwgU1VCX01JWF8xLCBTVUJfTUlYXzIsIFNVQl9NSVhfMywgU0JPWCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGRlY3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTd2FwIDJuZCBhbmQgNHRoIHJvd3Ncblx0ICAgICAgICAgICAgdmFyIHQgPSBNW29mZnNldCArIDFdO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDFdID0gTVtvZmZzZXQgKyAzXTtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAzXSA9IHQ7XG5cblx0ICAgICAgICAgICAgdGhpcy5fZG9DcnlwdEJsb2NrKE0sIG9mZnNldCwgdGhpcy5faW52S2V5U2NoZWR1bGUsIElOVl9TVUJfTUlYXzAsIElOVl9TVUJfTUlYXzEsIElOVl9TVUJfTUlYXzIsIElOVl9TVUJfTUlYXzMsIElOVl9TQk9YKTtcblxuXHQgICAgICAgICAgICAvLyBJbnYgc3dhcCAybmQgYW5kIDR0aCByb3dzXG5cdCAgICAgICAgICAgIHZhciB0ID0gTVtvZmZzZXQgKyAxXTtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAxXSA9IE1bb2Zmc2V0ICsgM107XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgM10gPSB0O1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9DcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0LCBrZXlTY2hlZHVsZSwgU1VCX01JWF8wLCBTVUJfTUlYXzEsIFNVQl9NSVhfMiwgU1VCX01JWF8zLCBTQk9YKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBuUm91bmRzID0gdGhpcy5fblJvdW5kcztcblxuXHQgICAgICAgICAgICAvLyBHZXQgaW5wdXQsIGFkZCByb3VuZCBrZXlcblx0ICAgICAgICAgICAgdmFyIHMwID0gTVtvZmZzZXRdICAgICBeIGtleVNjaGVkdWxlWzBdO1xuXHQgICAgICAgICAgICB2YXIgczEgPSBNW29mZnNldCArIDFdIF4ga2V5U2NoZWR1bGVbMV07XG5cdCAgICAgICAgICAgIHZhciBzMiA9IE1bb2Zmc2V0ICsgMl0gXiBrZXlTY2hlZHVsZVsyXTtcblx0ICAgICAgICAgICAgdmFyIHMzID0gTVtvZmZzZXQgKyAzXSBeIGtleVNjaGVkdWxlWzNdO1xuXG5cdCAgICAgICAgICAgIC8vIEtleSBzY2hlZHVsZSByb3cgY291bnRlclxuXHQgICAgICAgICAgICB2YXIga3NSb3cgPSA0O1xuXG5cdCAgICAgICAgICAgIC8vIFJvdW5kc1xuXHQgICAgICAgICAgICBmb3IgKHZhciByb3VuZCA9IDE7IHJvdW5kIDwgblJvdW5kczsgcm91bmQrKykge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hpZnQgcm93cywgc3ViIGJ5dGVzLCBtaXggY29sdW1ucywgYWRkIHJvdW5kIGtleVxuXHQgICAgICAgICAgICAgICAgdmFyIHQwID0gU1VCX01JWF8wW3MwID4+PiAyNF0gXiBTVUJfTUlYXzFbKHMxID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhfMlsoczIgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYXzNbczMgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICAgICAgdmFyIHQxID0gU1VCX01JWF8wW3MxID4+PiAyNF0gXiBTVUJfTUlYXzFbKHMyID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhfMlsoczMgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYXzNbczAgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICAgICAgdmFyIHQyID0gU1VCX01JWF8wW3MyID4+PiAyNF0gXiBTVUJfTUlYXzFbKHMzID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhfMlsoczAgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYXzNbczEgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICAgICAgdmFyIHQzID0gU1VCX01JWF8wW3MzID4+PiAyNF0gXiBTVUJfTUlYXzFbKHMwID4+PiAxNikgJiAweGZmXSBeIFNVQl9NSVhfMlsoczEgPj4+IDgpICYgMHhmZl0gXiBTVUJfTUlYXzNbczIgJiAweGZmXSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBVcGRhdGUgc3RhdGVcblx0ICAgICAgICAgICAgICAgIHMwID0gdDA7XG5cdCAgICAgICAgICAgICAgICBzMSA9IHQxO1xuXHQgICAgICAgICAgICAgICAgczIgPSB0Mjtcblx0ICAgICAgICAgICAgICAgIHMzID0gdDM7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBTaGlmdCByb3dzLCBzdWIgYnl0ZXMsIGFkZCByb3VuZCBrZXlcblx0ICAgICAgICAgICAgdmFyIHQwID0gKChTQk9YW3MwID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMxID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczIgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MzICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgIHZhciB0MSA9ICgoU0JPWFtzMSA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMiA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMzID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMCAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICB2YXIgdDIgPSAoKFNCT1hbczIgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczMgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMCA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczEgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgdmFyIHQzID0gKChTQk9YW3MzID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMwID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczEgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MyICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cblx0ICAgICAgICAgICAgLy8gU2V0IG91dHB1dFxuXHQgICAgICAgICAgICBNW29mZnNldF0gICAgID0gdDA7XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMV0gPSB0MTtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAyXSA9IHQyO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDNdID0gdDM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGtleVNpemU6IDI1Ni8zMlxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb25zIHRvIHRoZSBjaXBoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0ID0gQ3J5cHRvSlMuQUVTLmVuY3J5cHQobWVzc2FnZSwga2V5LCBjZmcpO1xuXHQgICAgICogICAgIHZhciBwbGFpbnRleHQgID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoY2lwaGVydGV4dCwga2V5LCBjZmcpO1xuXHQgICAgICovXG5cdCAgICBDLkFFUyA9IEJsb2NrQ2lwaGVyLl9jcmVhdGVIZWxwZXIoQUVTKTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5BRVM7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vZXZwa2RmXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL2V2cGtkZlwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0LyoqXG5cdCAqIENpcGhlciBjb3JlIGNvbXBvbmVudHMuXG5cdCAqL1xuXHRDcnlwdG9KUy5saWIuQ2lwaGVyIHx8IChmdW5jdGlvbiAodW5kZWZpbmVkKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgQnVmZmVyZWRCbG9ja0FsZ29yaXRobSA9IENfbGliLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG07XG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYztcblx0ICAgIHZhciBVdGY4ID0gQ19lbmMuVXRmODtcblx0ICAgIHZhciBCYXNlNjQgPSBDX2VuYy5CYXNlNjQ7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXHQgICAgdmFyIEV2cEtERiA9IENfYWxnby5FdnBLREY7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBjaXBoZXIgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGtleVNpemUgVGhpcyBjaXBoZXIncyBrZXkgc2l6ZS4gRGVmYXVsdDogNCAoMTI4IGJpdHMpXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gaXZTaXplIFRoaXMgY2lwaGVyJ3MgSVYgc2l6ZS4gRGVmYXVsdDogNCAoMTI4IGJpdHMpXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX0VOQ19YRk9STV9NT0RFIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGVuY3J5cHRpb24gbW9kZS5cblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBfREVDX1hGT1JNX01PREUgQSBjb25zdGFudCByZXByZXNlbnRpbmcgZGVjcnlwdGlvbiBtb2RlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ2lwaGVyID0gQ19saWIuQ2lwaGVyID0gQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBpdiBUaGUgSVYgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKCksXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHRoaXMgY2lwaGVyIGluIGVuY3J5cHRpb24gbW9kZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyfSBBIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlciA9IENyeXB0b0pTLmFsZ28uQUVTLmNyZWF0ZUVuY3J5cHRvcihrZXlXb3JkQXJyYXksIHsgaXY6IGl2V29yZEFycmF5IH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZUVuY3J5cHRvcjogZnVuY3Rpb24gKGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9FTkNfWEZPUk1fTU9ERSwga2V5LCBjZmcpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHRoaXMgY2lwaGVyIGluIGRlY3J5cHRpb24gbW9kZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyfSBBIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlciA9IENyeXB0b0pTLmFsZ28uQUVTLmNyZWF0ZURlY3J5cHRvcihrZXlXb3JkQXJyYXksIHsgaXY6IGl2V29yZEFycmF5IH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZURlY3J5cHRvcjogZnVuY3Rpb24gKGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0aGlzLl9ERUNfWEZPUk1fTU9ERSwga2V5LCBjZmcpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgY2lwaGVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHhmb3JtTW9kZSBFaXRoZXIgdGhlIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiB0cmFuc29ybWF0aW9uIG1vZGUgY29uc3RhbnQuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGtleSBUaGUga2V5LlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXIgPSBDcnlwdG9KUy5hbGdvLkFFUy5jcmVhdGUoQ3J5cHRvSlMuYWxnby5BRVMuX0VOQ19YRk9STV9NT0RFLCBrZXlXb3JkQXJyYXksIHsgaXY6IGl2V29yZEFycmF5IH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uICh4Zm9ybU1vZGUsIGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIFN0b3JlIHRyYW5zZm9ybSBtb2RlIGFuZCBrZXlcblx0ICAgICAgICAgICAgdGhpcy5feGZvcm1Nb2RlID0geGZvcm1Nb2RlO1xuXHQgICAgICAgICAgICB0aGlzLl9rZXkgPSBrZXk7XG5cblx0ICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgY2lwaGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBjaXBoZXIucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBSZXNldCBkYXRhIGJ1ZmZlclxuXHQgICAgICAgICAgICBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0LmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1jaXBoZXIgbG9naWNcblx0ICAgICAgICAgICAgdGhpcy5fZG9SZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBBZGRzIGRhdGEgdG8gYmUgZW5jcnlwdGVkIG9yIGRlY3J5cHRlZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YVVwZGF0ZSBUaGUgZGF0YSB0byBlbmNyeXB0IG9yIGRlY3J5cHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkYXRhIGFmdGVyIHByb2Nlc3NpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIucHJvY2VzcygnZGF0YScpO1xuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLnByb2Nlc3Mod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZGF0YVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBBcHBlbmRcblx0ICAgICAgICAgICAgdGhpcy5fYXBwZW5kKGRhdGFVcGRhdGUpO1xuXG5cdCAgICAgICAgICAgIC8vIFByb2Nlc3MgYXZhaWxhYmxlIGJsb2Nrc1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2VzcygpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBGaW5hbGl6ZXMgdGhlIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiBwcm9jZXNzLlxuXHQgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGRhdGFVcGRhdGUgVGhlIGZpbmFsIGRhdGEgdG8gZW5jcnlwdCBvciBkZWNyeXB0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGF0YSBhZnRlciBmaW5hbCBwcm9jZXNzaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLmZpbmFsaXplKCk7XG5cdCAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIuZmluYWxpemUoJ2RhdGEnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5maW5hbGl6ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbiAoZGF0YVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBGaW5hbCBkYXRhIHVwZGF0ZVxuXHQgICAgICAgICAgICBpZiAoZGF0YVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kKGRhdGFVcGRhdGUpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1jaXBoZXIgbG9naWNcblx0ICAgICAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkRGF0YSA9IHRoaXMuX2RvRmluYWxpemUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gZmluYWxQcm9jZXNzZWREYXRhO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBrZXlTaXplOiAxMjgvMzIsXG5cblx0ICAgICAgICBpdlNpemU6IDEyOC8zMixcblxuXHQgICAgICAgIF9FTkNfWEZPUk1fTU9ERTogMSxcblxuXHQgICAgICAgIF9ERUNfWEZPUk1fTU9ERTogMixcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgc2hvcnRjdXQgZnVuY3Rpb25zIHRvIGEgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciB0byBjcmVhdGUgYSBoZWxwZXIgZm9yLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBlbmNyeXB0IGFuZCBkZWNyeXB0IHNob3J0Y3V0IGZ1bmN0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIEFFUyA9IENyeXB0b0pTLmxpYi5DaXBoZXIuX2NyZWF0ZUhlbHBlcihDcnlwdG9KUy5hbGdvLkFFUyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2NyZWF0ZUhlbHBlcjogKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgZnVuY3Rpb24gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXNzd29yZEJhc2VkQ2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2VyaWFsaXphYmxlQ2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjaXBoZXIpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICAgICAgZW5jcnlwdDogZnVuY3Rpb24gKG1lc3NhZ2UsIGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RDaXBoZXJTdHJhdGVneShrZXkpLmVuY3J5cHQoY2lwaGVyLCBtZXNzYWdlLCBrZXksIGNmZyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXJ0ZXh0LCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KS5kZWNyeXB0KGNpcGhlciwgY2lwaGVydGV4dCwga2V5LCBjZmcpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfSgpKVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBzdHJlYW0gY2lwaGVyIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgdGhpcyBjaXBoZXIgb3BlcmF0ZXMgb24uIERlZmF1bHQ6IDEgKDMyIGJpdHMpXG5cdCAgICAgKi9cblx0ICAgIHZhciBTdHJlYW1DaXBoZXIgPSBDX2xpYi5TdHJlYW1DaXBoZXIgPSBDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBQcm9jZXNzIHBhcnRpYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHZhciBmaW5hbFByb2Nlc3NlZEJsb2NrcyA9IHRoaXMuX3Byb2Nlc3MoISEnZmx1c2gnKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gZmluYWxQcm9jZXNzZWRCbG9ja3M7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGJsb2NrU2l6ZTogMVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogTW9kZSBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX21vZGUgPSBDLm1vZGUgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBYnN0cmFjdCBiYXNlIGJsb2NrIGNpcGhlciBtb2RlIHRlbXBsYXRlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQmxvY2tDaXBoZXJNb2RlID0gQ19saWIuQmxvY2tDaXBoZXJNb2RlID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgdGhpcyBtb2RlIGZvciBlbmNyeXB0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBBIGJsb2NrIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBpdiBUaGUgSVYgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBtb2RlID0gQ3J5cHRvSlMubW9kZS5DQkMuY3JlYXRlRW5jcnlwdG9yKGNpcGhlciwgaXYud29yZHMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZUVuY3J5cHRvcjogZnVuY3Rpb24gKGNpcGhlciwgaXYpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuRW5jcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyB0aGlzIG1vZGUgZm9yIGRlY3J5cHRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIEEgYmxvY2sgY2lwaGVyIGluc3RhbmNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGl2IFRoZSBJViB3b3Jkcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG1vZGUgPSBDcnlwdG9KUy5tb2RlLkNCQy5jcmVhdGVEZWNyeXB0b3IoY2lwaGVyLCBpdi53b3Jkcyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY3JlYXRlRGVjcnlwdG9yOiBmdW5jdGlvbiAoY2lwaGVyLCBpdikge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5EZWNyeXB0b3IuY3JlYXRlKGNpcGhlciwgaXYpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgbW9kZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgQSBibG9jayBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gaXYgVGhlIElWIHdvcmRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgbW9kZSA9IENyeXB0b0pTLm1vZGUuQ0JDLkVuY3J5cHRvci5jcmVhdGUoY2lwaGVyLCBpdi53b3Jkcyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNpcGhlciwgaXYpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY2lwaGVyID0gY2lwaGVyO1xuXHQgICAgICAgICAgICB0aGlzLl9pdiA9IGl2O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIENpcGhlciBCbG9jayBDaGFpbmluZyBtb2RlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ0JDID0gQ19tb2RlLkNCQyA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWJzdHJhY3QgYmFzZSBDQkMgbW9kZS5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICB2YXIgQ0JDID0gQmxvY2tDaXBoZXJNb2RlLmV4dGVuZCgpO1xuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ0JDIGVuY3J5cHRvci5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBDQkMuRW5jcnlwdG9yID0gQ0JDLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBQcm9jZXNzZXMgdGhlIGRhdGEgYmxvY2sgYXQgb2Zmc2V0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyBUaGUgZGF0YSB3b3JkcyB0byBvcGVyYXRlIG9uLlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgd2hlcmUgdGhlIGJsb2NrIHN0YXJ0cy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIG1vZGUucHJvY2Vzc0Jsb2NrKGRhdGEud29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXI7XG5cdCAgICAgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gY2lwaGVyLmJsb2NrU2l6ZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gWE9SIGFuZCBlbmNyeXB0XG5cdCAgICAgICAgICAgICAgICB4b3JCbG9jay5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSk7XG5cdCAgICAgICAgICAgICAgICBjaXBoZXIuZW5jcnlwdEJsb2NrKHdvcmRzLCBvZmZzZXQpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGJsb2NrIHRvIHVzZSB3aXRoIG5leHQgYmxvY2tcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZCbG9jayA9IHdvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmxvY2tTaXplKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ0JDIGRlY3J5cHRvci5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBDQkMuRGVjcnlwdG9yID0gQ0JDLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBQcm9jZXNzZXMgdGhlIGRhdGEgYmxvY2sgYXQgb2Zmc2V0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyBUaGUgZGF0YSB3b3JkcyB0byBvcGVyYXRlIG9uLlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgd2hlcmUgdGhlIGJsb2NrIHN0YXJ0cy5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIG1vZGUucHJvY2Vzc0Jsb2NrKGRhdGEud29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBwcm9jZXNzQmxvY2s6IGZ1bmN0aW9uICh3b3Jkcywgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgICAgIHZhciBjaXBoZXIgPSB0aGlzLl9jaXBoZXI7XG5cdCAgICAgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gY2lwaGVyLmJsb2NrU2l6ZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBibG9jayB0byB1c2Ugd2l0aCBuZXh0IGJsb2NrXG5cdCAgICAgICAgICAgICAgICB2YXIgdGhpc0Jsb2NrID0gd29yZHMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBibG9ja1NpemUpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBEZWNyeXB0IGFuZCBYT1Jcblx0ICAgICAgICAgICAgICAgIGNpcGhlci5kZWNyeXB0QmxvY2sod29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAgICB4b3JCbG9jay5jYWxsKHRoaXMsIHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgYmVjb21lcyB0aGUgcHJldmlvdXMgYmxvY2tcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZCbG9jayA9IHRoaXNCbG9jaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXG5cdCAgICAgICAgZnVuY3Rpb24geG9yQmxvY2sod29yZHMsIG9mZnNldCwgYmxvY2tTaXplKSB7XG5cdCAgICAgICAgICAgIHZhciBibG9jaztcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgaXYgPSB0aGlzLl9pdjtcblxuXHQgICAgICAgICAgICAvLyBDaG9vc2UgbWl4aW5nIGJsb2NrXG5cdCAgICAgICAgICAgIGlmIChpdikge1xuXHQgICAgICAgICAgICAgICAgYmxvY2sgPSBpdjtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIElWIGZvciBzdWJzZXF1ZW50IGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgdGhpcy5faXYgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBibG9jayA9IHRoaXMuX3ByZXZCbG9jaztcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFhPUiBibG9ja3Ncblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbb2Zmc2V0ICsgaV0gXj0gYmxvY2tbaV07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICByZXR1cm4gQ0JDO1xuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBQYWRkaW5nIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfcGFkID0gQy5wYWQgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBQS0NTICM1LzcgcGFkZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIFBrY3M3ID0gQ19wYWQuUGtjczcgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUGFkcyBkYXRhIHVzaW5nIHRoZSBhbGdvcml0aG0gZGVmaW5lZCBpbiBQS0NTICM1LzcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gZGF0YSBUaGUgZGF0YSB0byBwYWQuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbXVsdGlwbGUgdGhhdCB0aGUgZGF0YSBzaG91bGQgYmUgcGFkZGVkIHRvLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBDcnlwdG9KUy5wYWQuUGtjczcucGFkKHdvcmRBcnJheSwgNCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFkOiBmdW5jdGlvbiAoZGF0YSwgYmxvY2tTaXplKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemVCeXRlcyA9IGJsb2NrU2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgcGFkZGluZyBieXRlc1xuXHQgICAgICAgICAgICB2YXIgblBhZGRpbmdCeXRlcyA9IGJsb2NrU2l6ZUJ5dGVzIC0gZGF0YS5zaWdCeXRlcyAlIGJsb2NrU2l6ZUJ5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENyZWF0ZSBwYWRkaW5nIHdvcmRcblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmdXb3JkID0gKG5QYWRkaW5nQnl0ZXMgPDwgMjQpIHwgKG5QYWRkaW5nQnl0ZXMgPDwgMTYpIHwgKG5QYWRkaW5nQnl0ZXMgPDwgOCkgfCBuUGFkZGluZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENyZWF0ZSBwYWRkaW5nXG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nV29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuUGFkZGluZ0J5dGVzOyBpICs9IDQpIHtcblx0ICAgICAgICAgICAgICAgIHBhZGRpbmdXb3Jkcy5wdXNoKHBhZGRpbmdXb3JkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB2YXIgcGFkZGluZyA9IFdvcmRBcnJheS5jcmVhdGUocGFkZGluZ1dvcmRzLCBuUGFkZGluZ0J5dGVzKTtcblxuXHQgICAgICAgICAgICAvLyBBZGQgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhLmNvbmNhdChwYWRkaW5nKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogVW5wYWRzIGRhdGEgdGhhdCBoYWQgYmVlbiBwYWRkZWQgdXNpbmcgdGhlIGFsZ29yaXRobSBkZWZpbmVkIGluIFBLQ1MgIzUvNy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBkYXRhIFRoZSBkYXRhIHRvIHVucGFkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBDcnlwdG9KUy5wYWQuUGtjczcudW5wYWQod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB1bnBhZDogZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICAgICAgLy8gR2V0IG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGZyb20gbGFzdCBieXRlXG5cdCAgICAgICAgICAgIHZhciBuUGFkZGluZ0J5dGVzID0gZGF0YS53b3Jkc1soZGF0YS5zaWdCeXRlcyAtIDEpID4+PiAyXSAmIDB4ZmY7XG5cblx0ICAgICAgICAgICAgLy8gUmVtb3ZlIHBhZGRpbmdcblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyAtPSBuUGFkZGluZ0J5dGVzO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBibG9jayBjaXBoZXIgdGVtcGxhdGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJsb2NrU2l6ZSBUaGUgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyB0aGlzIGNpcGhlciBvcGVyYXRlcyBvbi4gRGVmYXVsdDogNCAoMTI4IGJpdHMpXG5cdCAgICAgKi9cblx0ICAgIHZhciBCbG9ja0NpcGhlciA9IENfbGliLkJsb2NrQ2lwaGVyID0gQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtNb2RlfSBtb2RlIFRoZSBibG9jayBtb2RlIHRvIHVzZS4gRGVmYXVsdDogQ0JDXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtQYWRkaW5nfSBwYWRkaW5nIFRoZSBwYWRkaW5nIHN0cmF0ZWd5IHRvIHVzZS4gRGVmYXVsdDogUGtjczdcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IENpcGhlci5jZmcuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgbW9kZTogQ0JDLFxuXHQgICAgICAgICAgICBwYWRkaW5nOiBQa2NzN1xuXHQgICAgICAgIH0pLFxuXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIG1vZGVDcmVhdG9yO1xuXG5cdCAgICAgICAgICAgIC8vIFJlc2V0IGNpcGhlclxuXHQgICAgICAgICAgICBDaXBoZXIucmVzZXQuY2FsbCh0aGlzKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGNmZyA9IHRoaXMuY2ZnO1xuXHQgICAgICAgICAgICB2YXIgaXYgPSBjZmcuaXY7XG5cdCAgICAgICAgICAgIHZhciBtb2RlID0gY2ZnLm1vZGU7XG5cblx0ICAgICAgICAgICAgLy8gUmVzZXQgYmxvY2sgbW9kZVxuXHQgICAgICAgICAgICBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0VOQ19YRk9STV9NT0RFKSB7XG5cdCAgICAgICAgICAgICAgICBtb2RlQ3JlYXRvciA9IG1vZGUuY3JlYXRlRW5jcnlwdG9yO1xuXHQgICAgICAgICAgICB9IGVsc2UgLyogaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9ERUNfWEZPUk1fTU9ERSkgKi8ge1xuXHQgICAgICAgICAgICAgICAgbW9kZUNyZWF0b3IgPSBtb2RlLmNyZWF0ZURlY3J5cHRvcjtcblx0ICAgICAgICAgICAgICAgIC8vIEtlZXAgYXQgbGVhc3Qgb25lIGJsb2NrIGluIHRoZSBidWZmZXIgZm9yIHVucGFkZGluZ1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbWluQnVmZmVyU2l6ZSA9IDE7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAodGhpcy5fbW9kZSAmJiB0aGlzLl9tb2RlLl9fY3JlYXRvciA9PSBtb2RlQ3JlYXRvcikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbW9kZS5pbml0KHRoaXMsIGl2ICYmIGl2LndvcmRzKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21vZGUgPSBtb2RlQ3JlYXRvci5jYWxsKG1vZGUsIHRoaXMsIGl2ICYmIGl2LndvcmRzKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21vZGUuX19jcmVhdG9yID0gbW9kZUNyZWF0b3I7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICB0aGlzLl9tb2RlLnByb2Nlc3NCbG9jayh3b3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGZpbmFsUHJvY2Vzc2VkQmxvY2tzO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nID0gdGhpcy5jZmcucGFkZGluZztcblxuXHQgICAgICAgICAgICAvLyBGaW5hbGl6ZVxuXHQgICAgICAgICAgICBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0VOQ19YRk9STV9NT0RFKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBQYWQgZGF0YVxuXHQgICAgICAgICAgICAgICAgcGFkZGluZy5wYWQodGhpcy5fZGF0YSwgdGhpcy5ibG9ja1NpemUpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgZmluYWxQcm9jZXNzZWRCbG9ja3MgPSB0aGlzLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAodGhpcy5feGZvcm1Nb2RlID09IHRoaXMuX0RFQ19YRk9STV9NT0RFKSAqLyB7XG5cdCAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICAgICAgZmluYWxQcm9jZXNzZWRCbG9ja3MgPSB0aGlzLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFVucGFkIGRhdGFcblx0ICAgICAgICAgICAgICAgIHBhZGRpbmcudW5wYWQoZmluYWxQcm9jZXNzZWRCbG9ja3MpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZpbmFsUHJvY2Vzc2VkQmxvY2tzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDEyOC8zMlxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQSBjb2xsZWN0aW9uIG9mIGNpcGhlciBwYXJhbWV0ZXJzLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBjaXBoZXJ0ZXh0IFRoZSByYXcgY2lwaGVydGV4dC5cblx0ICAgICAqIEBwcm9wZXJ0eSB7V29yZEFycmF5fSBrZXkgVGhlIGtleSB0byB0aGlzIGNpcGhlcnRleHQuXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gaXYgVGhlIElWIHVzZWQgaW4gdGhlIGNpcGhlcmluZyBvcGVyYXRpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gc2FsdCBUaGUgc2FsdCB1c2VkIHdpdGggYSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi5cblx0ICAgICAqIEBwcm9wZXJ0eSB7Q2lwaGVyfSBhbGdvcml0aG0gVGhlIGNpcGhlciBhbGdvcml0aG0uXG5cdCAgICAgKiBAcHJvcGVydHkge01vZGV9IG1vZGUgVGhlIGJsb2NrIG1vZGUgdXNlZCBpbiB0aGUgY2lwaGVyaW5nIG9wZXJhdGlvbi5cblx0ICAgICAqIEBwcm9wZXJ0eSB7UGFkZGluZ30gcGFkZGluZyBUaGUgcGFkZGluZyBzY2hlbWUgdXNlZCBpbiB0aGUgY2lwaGVyaW5nIG9wZXJhdGlvbi5cblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIGJsb2NrIHNpemUgb2YgdGhlIGNpcGhlci5cblx0ICAgICAqIEBwcm9wZXJ0eSB7Rm9ybWF0fSBmb3JtYXR0ZXIgVGhlIGRlZmF1bHQgZm9ybWF0dGluZyBzdHJhdGVneSB0byBjb252ZXJ0IHRoaXMgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYSBzdHJpbmcuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDaXBoZXJQYXJhbXMgPSBDX2xpYi5DaXBoZXJQYXJhbXMgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNpcGhlclBhcmFtcyBBbiBvYmplY3Qgd2l0aCBhbnkgb2YgdGhlIHBvc3NpYmxlIGNpcGhlciBwYXJhbWV0ZXJzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVyUGFyYW1zID0gQ3J5cHRvSlMubGliLkNpcGhlclBhcmFtcy5jcmVhdGUoe1xuXHQgICAgICAgICAqICAgICAgICAgY2lwaGVydGV4dDogY2lwaGVydGV4dFdvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIGtleToga2V5V29yZEFycmF5LFxuXHQgICAgICAgICAqICAgICAgICAgaXY6IGl2V29yZEFycmF5LFxuXHQgICAgICAgICAqICAgICAgICAgc2FsdDogc2FsdFdvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIGFsZ29yaXRobTogQ3J5cHRvSlMuYWxnby5BRVMsXG5cdCAgICAgICAgICogICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcblx0ICAgICAgICAgKiAgICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5QS0NTNyxcblx0ICAgICAgICAgKiAgICAgICAgIGJsb2NrU2l6ZTogNCxcblx0ICAgICAgICAgKiAgICAgICAgIGZvcm1hdHRlcjogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0xcblx0ICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNpcGhlclBhcmFtcykge1xuXHQgICAgICAgICAgICB0aGlzLm1peEluKGNpcGhlclBhcmFtcyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIHRoaXMgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0Zvcm1hdH0gZm9ybWF0dGVyIChPcHRpb25hbCkgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gdXNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgc3RyaW5naWZpZWQgY2lwaGVyIHBhcmFtcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEB0aHJvd3MgRXJyb3IgSWYgbmVpdGhlciB0aGUgZm9ybWF0dGVyIG5vciB0aGUgZGVmYXVsdCBmb3JtYXR0ZXIgaXMgc2V0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gY2lwaGVyUGFyYW1zICsgJyc7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSBjaXBoZXJQYXJhbXMudG9TdHJpbmcoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IGNpcGhlclBhcmFtcy50b1N0cmluZyhDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIChmb3JtYXR0ZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIChmb3JtYXR0ZXIgfHwgdGhpcy5mb3JtYXR0ZXIpLnN0cmluZ2lmeSh0aGlzKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBGb3JtYXQgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19mb3JtYXQgPSBDLmZvcm1hdCA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIE9wZW5TU0wgZm9ybWF0dGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIE9wZW5TU0xGb3JtYXR0ZXIgPSBDX2Zvcm1hdC5PcGVuU1NMID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgY2lwaGVyIHBhcmFtcyBvYmplY3QgdG8gYW4gT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfSBjaXBoZXJQYXJhbXMgVGhlIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG9wZW5TU0xTdHJpbmcgPSBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTC5zdHJpbmdpZnkoY2lwaGVyUGFyYW1zKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIChjaXBoZXJQYXJhbXMpIHtcblx0ICAgICAgICAgICAgdmFyIHdvcmRBcnJheTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBjaXBoZXJQYXJhbXMuY2lwaGVydGV4dDtcblx0ICAgICAgICAgICAgdmFyIHNhbHQgPSBjaXBoZXJQYXJhbXMuc2FsdDtcblxuXHQgICAgICAgICAgICAvLyBGb3JtYXRcblx0ICAgICAgICAgICAgaWYgKHNhbHQpIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRBcnJheSA9IFdvcmRBcnJheS5jcmVhdGUoWzB4NTM2MTZjNzQsIDB4NjU2NDVmNWZdKS5jb25jYXQoc2FsdCkuY29uY2F0KGNpcGhlcnRleHQpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgd29yZEFycmF5ID0gY2lwaGVydGV4dDtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiB3b3JkQXJyYXkudG9TdHJpbmcoQmFzZTY0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYW4gT3BlblNTTC1jb21wYXRpYmxlIHN0cmluZyB0byBhIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG9wZW5TU0xTdHIgVGhlIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IFRoZSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlclBhcmFtcyA9IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMLnBhcnNlKG9wZW5TU0xTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAob3BlblNTTFN0cikge1xuXHQgICAgICAgICAgICB2YXIgc2FsdDtcblxuXHQgICAgICAgICAgICAvLyBQYXJzZSBiYXNlNjRcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBCYXNlNjQucGFyc2Uob3BlblNTTFN0cik7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHRXb3JkcyA9IGNpcGhlcnRleHQud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gVGVzdCBmb3Igc2FsdFxuXHQgICAgICAgICAgICBpZiAoY2lwaGVydGV4dFdvcmRzWzBdID09IDB4NTM2MTZjNzQgJiYgY2lwaGVydGV4dFdvcmRzWzFdID09IDB4NjU2NDVmNWYpIHtcblx0ICAgICAgICAgICAgICAgIC8vIEV4dHJhY3Qgc2FsdFxuXHQgICAgICAgICAgICAgICAgc2FsdCA9IFdvcmRBcnJheS5jcmVhdGUoY2lwaGVydGV4dFdvcmRzLnNsaWNlKDIsIDQpKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHNhbHQgZnJvbSBjaXBoZXJ0ZXh0XG5cdCAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0V29yZHMuc3BsaWNlKDAsIDQpO1xuXHQgICAgICAgICAgICAgICAgY2lwaGVydGV4dC5zaWdCeXRlcyAtPSAxNjtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBDaXBoZXJQYXJhbXMuY3JlYXRlKHsgY2lwaGVydGV4dDogY2lwaGVydGV4dCwgc2FsdDogc2FsdCB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEEgY2lwaGVyIHdyYXBwZXIgdGhhdCByZXR1cm5zIGNpcGhlcnRleHQgYXMgYSBzZXJpYWxpemFibGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgKi9cblx0ICAgIHZhciBTZXJpYWxpemFibGVDaXBoZXIgPSBDX2xpYi5TZXJpYWxpemFibGVDaXBoZXIgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtGb3JtYXR0ZXJ9IGZvcm1hdCBUaGUgZm9ybWF0dGluZyBzdHJhdGVneSB0byBjb252ZXJ0IGNpcGhlciBwYXJhbSBvYmplY3RzIHRvIGFuZCBmcm9tIGEgc3RyaW5nLiBEZWZhdWx0OiBPcGVuU1NMXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIGZvcm1hdDogT3BlblNTTEZvcm1hdHRlclxuXHQgICAgICAgIH0pLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRW5jcnlwdHMgYSBtZXNzYWdlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGVuY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGtleSBUaGUga2V5LlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IEEgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCBrZXkpO1xuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwga2V5LCB7IGl2OiBpdiB9KTtcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsIGtleSwgeyBpdjogaXYsIGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZW5jcnlwdDogZnVuY3Rpb24gKGNpcGhlciwgbWVzc2FnZSwga2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICAgICAgdmFyIGVuY3J5cHRvciA9IGNpcGhlci5jcmVhdGVFbmNyeXB0b3Ioa2V5LCBjZmcpO1xuXHQgICAgICAgICAgICB2YXIgY2lwaGVydGV4dCA9IGVuY3J5cHRvci5maW5hbGl6ZShtZXNzYWdlKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgY2lwaGVyQ2ZnID0gZW5jcnlwdG9yLmNmZztcblxuXHQgICAgICAgICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBzZXJpYWxpemFibGUgY2lwaGVyIHBhcmFtc1xuXHQgICAgICAgICAgICByZXR1cm4gQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7XG5cdCAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0OiBjaXBoZXJ0ZXh0LFxuXHQgICAgICAgICAgICAgICAga2V5OiBrZXksXG5cdCAgICAgICAgICAgICAgICBpdjogY2lwaGVyQ2ZnLml2LFxuXHQgICAgICAgICAgICAgICAgYWxnb3JpdGhtOiBjaXBoZXIsXG5cdCAgICAgICAgICAgICAgICBtb2RlOiBjaXBoZXJDZmcubW9kZSxcblx0ICAgICAgICAgICAgICAgIHBhZGRpbmc6IGNpcGhlckNmZy5wYWRkaW5nLFxuXHQgICAgICAgICAgICAgICAgYmxvY2tTaXplOiBjaXBoZXIuYmxvY2tTaXplLFxuXHQgICAgICAgICAgICAgICAgZm9ybWF0dGVyOiBjZmcuZm9ybWF0XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBEZWNyeXB0cyBzZXJpYWxpemVkIGNpcGhlcnRleHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgYWxnb3JpdGhtIHRvIHVzZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc3xzdHJpbmd9IGNpcGhlcnRleHQgVGhlIGNpcGhlcnRleHQgdG8gZGVjcnlwdC5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHBsYWludGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgZm9ybWF0dGVkQ2lwaGVydGV4dCwga2V5LCB7IGl2OiBpdiwgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgY2lwaGVydGV4dFBhcmFtcywga2V5LCB7IGl2OiBpdiwgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBkZWNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBjaXBoZXJ0ZXh0LCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gQ2lwaGVyUGFyYW1zXG5cdCAgICAgICAgICAgIGNpcGhlcnRleHQgPSB0aGlzLl9wYXJzZShjaXBoZXJ0ZXh0LCBjZmcuZm9ybWF0KTtcblxuXHQgICAgICAgICAgICAvLyBEZWNyeXB0XG5cdCAgICAgICAgICAgIHZhciBwbGFpbnRleHQgPSBjaXBoZXIuY3JlYXRlRGVjcnlwdG9yKGtleSwgY2ZnKS5maW5hbGl6ZShjaXBoZXJ0ZXh0LmNpcGhlcnRleHQpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBwbGFpbnRleHQ7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIHNlcmlhbGl6ZWQgY2lwaGVydGV4dCB0byBDaXBoZXJQYXJhbXMsXG5cdCAgICAgICAgICogZWxzZSBhc3N1bWVkIENpcGhlclBhcmFtcyBhbHJlYWR5IGFuZCByZXR1cm5zIGNpcGhlcnRleHQgdW5jaGFuZ2VkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN8c3RyaW5nfSBjaXBoZXJ0ZXh0IFRoZSBjaXBoZXJ0ZXh0LlxuXHQgICAgICAgICAqIEBwYXJhbSB7Rm9ybWF0dGVyfSBmb3JtYXQgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gdXNlIHRvIHBhcnNlIHNlcmlhbGl6ZWQgY2lwaGVydGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gVGhlIHVuc2VyaWFsaXplZCBjaXBoZXJ0ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuX3BhcnNlKGNpcGhlcnRleHRTdHJpbmdPclBhcmFtcywgZm9ybWF0KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfcGFyc2U6IGZ1bmN0aW9uIChjaXBoZXJ0ZXh0LCBmb3JtYXQpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBjaXBoZXJ0ZXh0ID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0LnBhcnNlKGNpcGhlcnRleHQsIHRoaXMpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGNpcGhlcnRleHQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBLZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2tkZiA9IEMua2RmID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogT3BlblNTTCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi5cblx0ICAgICAqL1xuXHQgICAgdmFyIE9wZW5TU0xLZGYgPSBDX2tkZi5PcGVuU1NMID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIERlcml2ZXMgYSBrZXkgYW5kIElWIGZyb20gYSBwYXNzd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gZGVyaXZlIGZyb20uXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGtleVNpemUgVGhlIHNpemUgaW4gd29yZHMgb2YgdGhlIGtleSB0byBnZW5lcmF0ZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gaXZTaXplIFRoZSBzaXplIGluIHdvcmRzIG9mIHRoZSBJViB0byBnZW5lcmF0ZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgKE9wdGlvbmFsKSBBIDY0LWJpdCBzYWx0IHRvIHVzZS4gSWYgb21pdHRlZCwgYSBzYWx0IHdpbGwgYmUgZ2VuZXJhdGVkIHJhbmRvbWx5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0IHdpdGggdGhlIGtleSwgSVYsIGFuZCBzYWx0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IENyeXB0b0pTLmtkZi5PcGVuU1NMLmV4ZWN1dGUoJ1Bhc3N3b3JkJywgMjU2LzMyLCAxMjgvMzIpO1xuXHQgICAgICAgICAqICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IENyeXB0b0pTLmtkZi5PcGVuU1NMLmV4ZWN1dGUoJ1Bhc3N3b3JkJywgMjU2LzMyLCAxMjgvMzIsICdzYWx0c2FsdCcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIChwYXNzd29yZCwga2V5U2l6ZSwgaXZTaXplLCBzYWx0LCBoYXNoZXIpIHtcblx0ICAgICAgICAgICAgLy8gR2VuZXJhdGUgcmFuZG9tIHNhbHRcblx0ICAgICAgICAgICAgaWYgKCFzYWx0KSB7XG5cdCAgICAgICAgICAgICAgICBzYWx0ID0gV29yZEFycmF5LnJhbmRvbSg2NC84KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIERlcml2ZSBrZXkgYW5kIElWXG5cdCAgICAgICAgICAgIGlmICghaGFzaGVyKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIga2V5ID0gRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IGtleVNpemUgKyBpdlNpemUgfSkuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB2YXIga2V5ID0gRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IGtleVNpemUgKyBpdlNpemUsIGhhc2hlcjogaGFzaGVyIH0pLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgICAgICAgICB9XG5cblxuXHQgICAgICAgICAgICAvLyBTZXBhcmF0ZSBrZXkgYW5kIElWXG5cdCAgICAgICAgICAgIHZhciBpdiA9IFdvcmRBcnJheS5jcmVhdGUoa2V5LndvcmRzLnNsaWNlKGtleVNpemUpLCBpdlNpemUgKiA0KTtcblx0ICAgICAgICAgICAga2V5LnNpZ0J5dGVzID0ga2V5U2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIHBhcmFtc1xuXHQgICAgICAgICAgICByZXR1cm4gQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7IGtleToga2V5LCBpdjogaXYsIHNhbHQ6IHNhbHQgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBIHNlcmlhbGl6YWJsZSBjaXBoZXIgd3JhcHBlciB0aGF0IGRlcml2ZXMgdGhlIGtleSBmcm9tIGEgcGFzc3dvcmQsXG5cdCAgICAgKiBhbmQgcmV0dXJucyBjaXBoZXJ0ZXh0IGFzIGEgc2VyaWFsaXphYmxlIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICovXG5cdCAgICB2YXIgUGFzc3dvcmRCYXNlZENpcGhlciA9IENfbGliLlBhc3N3b3JkQmFzZWRDaXBoZXIgPSBTZXJpYWxpemFibGVDaXBoZXIuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge0tERn0ga2RmIFRoZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiB0byB1c2UgdG8gZ2VuZXJhdGUgYSBrZXkgYW5kIElWIGZyb20gYSBwYXNzd29yZC4gRGVmYXVsdDogT3BlblNTTFxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogU2VyaWFsaXphYmxlQ2lwaGVyLmNmZy5leHRlbmQoe1xuXHQgICAgICAgICAgICBrZGY6IE9wZW5TU0xLZGZcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEVuY3J5cHRzIGEgbWVzc2FnZSB1c2luZyBhIHBhc3N3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGVuY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsICdwYXNzd29yZCcpO1xuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsICdwYXNzd29yZCcsIHsgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBlbmNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBtZXNzYWdlLCBwYXNzd29yZCwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBEZXJpdmUga2V5IGFuZCBvdGhlciBwYXJhbXNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRQYXJhbXMgPSBjZmcua2RmLmV4ZWN1dGUocGFzc3dvcmQsIGNpcGhlci5rZXlTaXplLCBjaXBoZXIuaXZTaXplLCBjZmcuc2FsdCwgY2ZnLmhhc2hlcik7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIElWIHRvIGNvbmZpZ1xuXHQgICAgICAgICAgICBjZmcuaXYgPSBkZXJpdmVkUGFyYW1zLml2O1xuXG5cdCAgICAgICAgICAgIC8vIEVuY3J5cHRcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBTZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdC5jYWxsKHRoaXMsIGNpcGhlciwgbWVzc2FnZSwgZGVyaXZlZFBhcmFtcy5rZXksIGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gTWl4IGluIGRlcml2ZWQgcGFyYW1zXG5cdCAgICAgICAgICAgIGNpcGhlcnRleHQubWl4SW4oZGVyaXZlZFBhcmFtcyk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNpcGhlcnRleHQ7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIERlY3J5cHRzIHNlcmlhbGl6ZWQgY2lwaGVydGV4dCB1c2luZyBhIHBhc3N3b3JkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN8c3RyaW5nfSBjaXBoZXJ0ZXh0IFRoZSBjaXBoZXJ0ZXh0IHRvIGRlY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcGxhaW50ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlBhc3N3b3JkQmFzZWRDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgZm9ybWF0dGVkQ2lwaGVydGV4dCwgJ3Bhc3N3b3JkJywgeyBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqICAgICB2YXIgcGxhaW50ZXh0ID0gQ3J5cHRvSlMubGliLlBhc3N3b3JkQmFzZWRDaXBoZXIuZGVjcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgY2lwaGVydGV4dFBhcmFtcywgJ3Bhc3N3b3JkJywgeyBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGRlY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXIsIGNpcGhlcnRleHQsIHBhc3N3b3JkLCBjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIENpcGhlclBhcmFtc1xuXHQgICAgICAgICAgICBjaXBoZXJ0ZXh0ID0gdGhpcy5fcGFyc2UoY2lwaGVydGV4dCwgY2ZnLmZvcm1hdCk7XG5cblx0ICAgICAgICAgICAgLy8gRGVyaXZlIGtleSBhbmQgb3RoZXIgcGFyYW1zXG5cdCAgICAgICAgICAgIHZhciBkZXJpdmVkUGFyYW1zID0gY2ZnLmtkZi5leGVjdXRlKHBhc3N3b3JkLCBjaXBoZXIua2V5U2l6ZSwgY2lwaGVyLml2U2l6ZSwgY2lwaGVydGV4dC5zYWx0LCBjZmcuaGFzaGVyKTtcblxuXHQgICAgICAgICAgICAvLyBBZGQgSVYgdG8gY29uZmlnXG5cdCAgICAgICAgICAgIGNmZy5pdiA9IGRlcml2ZWRQYXJhbXMuaXY7XG5cblx0ICAgICAgICAgICAgLy8gRGVjcnlwdFxuXHQgICAgICAgICAgICB2YXIgcGxhaW50ZXh0ID0gU2VyaWFsaXphYmxlQ2lwaGVyLmRlY3J5cHQuY2FsbCh0aGlzLCBjaXBoZXIsIGNpcGhlcnRleHQsIGRlcml2ZWRQYXJhbXMua2V5LCBjZmcpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBwbGFpbnRleHQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdH0oKSk7XG5cblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRyb290LkNyeXB0b0pTID0gZmFjdG9yeSgpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcblxuXHQvKmdsb2JhbHMgd2luZG93LCBnbG9iYWwsIHJlcXVpcmUqL1xuXG5cdC8qKlxuXHQgKiBDcnlwdG9KUyBjb3JlIGNvbXBvbmVudHMuXG5cdCAqL1xuXHR2YXIgQ3J5cHRvSlMgPSBDcnlwdG9KUyB8fCAoZnVuY3Rpb24gKE1hdGgsIHVuZGVmaW5lZCkge1xuXG5cdCAgICB2YXIgY3J5cHRvO1xuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGZyb20gd2luZG93IChCcm93c2VyKVxuXHQgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSB3aW5kb3cuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGluIHdlYiB3b3JrZXIgKEJyb3dzZXIpXG5cdCAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gc2VsZi5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gZnJvbSB3b3JrZXJcblx0ICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcy5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSBnbG9iYWxUaGlzLmNyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIChleHBlcmltZW50YWwgSUUgMTEpIGNyeXB0byBmcm9tIHdpbmRvdyAoQnJvd3Nlcilcblx0ICAgIGlmICghY3J5cHRvICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5tc0NyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IHdpbmRvdy5tc0NyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBmcm9tIGdsb2JhbCAoTm9kZUpTKVxuXHQgICAgaWYgKCFjcnlwdG8gJiYgdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsLmNyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IGdsb2JhbC5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gaW1wb3J0IHZpYSByZXF1aXJlIChOb2RlSlMpXG5cdCAgICBpZiAoIWNyeXB0byAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGVycikge31cblx0ICAgIH1cblxuXHQgICAgLypcblx0ICAgICAqIENyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZSBwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuXHQgICAgICpcblx0ICAgICAqIEFzIE1hdGgucmFuZG9tKCkgaXMgY3J5cHRvZ3JhcGhpY2FsbHkgbm90IHNhZmUgdG8gdXNlXG5cdCAgICAgKi9cblx0ICAgIHZhciBjcnlwdG9TZWN1cmVSYW5kb21JbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKGNyeXB0bykge1xuXHQgICAgICAgICAgICAvLyBVc2UgZ2V0UmFuZG9tVmFsdWVzIG1ldGhvZCAoQnJvd3Nlcilcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50MzJBcnJheSgxKSlbMF07XG5cdCAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBVc2UgcmFuZG9tQnl0ZXMgbWV0aG9kIChOb2RlSlMpXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvLnJhbmRvbUJ5dGVzID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tQnl0ZXMoNCkucmVhZEludDMyTEUoKTtcblx0ICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblxuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignTmF0aXZlIGNyeXB0byBtb2R1bGUgY291bGQgbm90IGJlIHVzZWQgdG8gZ2V0IHNlY3VyZSByYW5kb20gbnVtYmVyLicpO1xuXHQgICAgfTtcblxuXHQgICAgLypcblx0ICAgICAqIExvY2FsIHBvbHlmaWxsIG9mIE9iamVjdC5jcmVhdGVcblxuXHQgICAgICovXG5cdCAgICB2YXIgY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGZ1bmN0aW9uIEYoKSB7fVxuXG5cdCAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvYmopIHtcblx0ICAgICAgICAgICAgdmFyIHN1YnR5cGU7XG5cblx0ICAgICAgICAgICAgRi5wcm90b3R5cGUgPSBvYmo7XG5cblx0ICAgICAgICAgICAgc3VidHlwZSA9IG5ldyBGKCk7XG5cblx0ICAgICAgICAgICAgRi5wcm90b3R5cGUgPSBudWxsO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBzdWJ0eXBlO1xuXHQgICAgICAgIH07XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIENyeXB0b0pTIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEMgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBMaWJyYXJ5IG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfbGliID0gQy5saWIgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBCYXNlIG9iamVjdCBmb3IgcHJvdG90eXBhbCBpbmhlcml0YW5jZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEJhc2UgPSBDX2xpYi5CYXNlID0gKGZ1bmN0aW9uICgpIHtcblxuXG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbSB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG92ZXJyaWRlcyBQcm9wZXJ0aWVzIHRvIGNvcHkgaW50byB0aGUgbmV3IG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgbmV3IG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIE15VHlwZSA9IENyeXB0b0pTLmxpYi5CYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgZmllbGQ6ICd2YWx1ZScsXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICAgICAgbWV0aG9kOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgfVxuXHQgICAgICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBleHRlbmQ6IGZ1bmN0aW9uIChvdmVycmlkZXMpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNwYXduXG5cdCAgICAgICAgICAgICAgICB2YXIgc3VidHlwZSA9IGNyZWF0ZSh0aGlzKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gQXVnbWVudFxuXHQgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlcykge1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUubWl4SW4ob3ZlcnJpZGVzKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGRlZmF1bHQgaW5pdGlhbGl6ZXJcblx0ICAgICAgICAgICAgICAgIGlmICghc3VidHlwZS5oYXNPd25Qcm9wZXJ0eSgnaW5pdCcpIHx8IHRoaXMuaW5pdCA9PT0gc3VidHlwZS5pbml0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3VidHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLiRzdXBlci5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZXIncyBwcm90b3R5cGUgaXMgdGhlIHN1YnR5cGUgb2JqZWN0XG5cdCAgICAgICAgICAgICAgICBzdWJ0eXBlLmluaXQucHJvdG90eXBlID0gc3VidHlwZTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVmZXJlbmNlIHN1cGVydHlwZVxuXHQgICAgICAgICAgICAgICAgc3VidHlwZS4kc3VwZXIgPSB0aGlzO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gc3VidHlwZTtcblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogRXh0ZW5kcyB0aGlzIG9iamVjdCBhbmQgcnVucyB0aGUgaW5pdCBtZXRob2QuXG5cdCAgICAgICAgICAgICAqIEFyZ3VtZW50cyB0byBjcmVhdGUoKSB3aWxsIGJlIHBhc3NlZCB0byBpbml0KCkuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBpbnN0YW5jZSA9IE15VHlwZS5jcmVhdGUoKTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5leHRlbmQoKTtcblx0ICAgICAgICAgICAgICAgIGluc3RhbmNlLmluaXQuYXBwbHkoaW5zdGFuY2UsIGFyZ3VtZW50cyk7XG5cblx0ICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIG9iamVjdC5cblx0ICAgICAgICAgICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIHNvbWUgbG9naWMgd2hlbiB5b3VyIG9iamVjdHMgYXJlIGNyZWF0ZWQuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgTXlUeXBlID0gQ3J5cHRvSlMubGliLkJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAgICAgICogICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgICAgIC8vIC4uLlxuXHQgICAgICAgICAgICAgKiAgICAgICAgIH1cblx0ICAgICAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBpbnRvIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyB0byBtaXggaW4uXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICBNeVR5cGUubWl4SW4oe1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIGZpZWxkOiAndmFsdWUnXG5cdCAgICAgICAgICAgICAqICAgICB9KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIG1peEluOiBmdW5jdGlvbiAocHJvcGVydGllcykge1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlOYW1lIGluIHByb3BlcnRpZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIElFIHdvbid0IGNvcHkgdG9TdHJpbmcgdXNpbmcgdGhlIGxvb3AgYWJvdmVcblx0ICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KCd0b1N0cmluZycpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmluZyA9IHByb3BlcnRpZXMudG9TdHJpbmc7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBjbG9uZS5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBjbG9uZSA9IGluc3RhbmNlLmNsb25lKCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdC5wcm90b3R5cGUuZXh0ZW5kKHRoaXMpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgIH0oKSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQW4gYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7QXJyYXl9IHdvcmRzIFRoZSBhcnJheSBvZiAzMi1iaXQgd29yZHMuXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gc2lnQnl0ZXMgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgKi9cblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXkgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyAoT3B0aW9uYWwpIEFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc2lnQnl0ZXMgKE9wdGlvbmFsKSBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJ5dGVzIGluIHRoZSB3b3Jkcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKCk7XG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZShbMHgwMDAxMDIwMywgMHgwNDA1MDYwN10pO1xuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAwMTAyMDMsIDB4MDQwNTA2MDddLCA2KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAod29yZHMsIHNpZ0J5dGVzKSB7XG5cdCAgICAgICAgICAgIHdvcmRzID0gdGhpcy53b3JkcyA9IHdvcmRzIHx8IFtdO1xuXG5cdCAgICAgICAgICAgIGlmIChzaWdCeXRlcyAhPSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSBzaWdCeXRlcztcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgPSB3b3Jkcy5sZW5ndGggKiA0O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIHRoaXMgd29yZCBhcnJheSB0byBhIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7RW5jb2Rlcn0gZW5jb2RlciAoT3B0aW9uYWwpIFRoZSBlbmNvZGluZyBzdHJhdGVneSB0byB1c2UuIERlZmF1bHQ6IENyeXB0b0pTLmVuYy5IZXhcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN0cmluZ2lmaWVkIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSB3b3JkQXJyYXkgKyAnJztcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IHdvcmRBcnJheS50b1N0cmluZygpO1xuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5LnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gKGVuY29kZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIChlbmNvZGVyIHx8IEhleCkuc3RyaW5naWZ5KHRoaXMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25jYXRlbmF0ZXMgYSB3b3JkIGFycmF5IHRvIHRoaXMgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkgdG8gYXBwZW5kLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHdvcmRBcnJheTEuY29uY2F0KHdvcmRBcnJheTIpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNvbmNhdDogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHRoaXNXb3JkcyA9IHRoaXMud29yZHM7XG5cdCAgICAgICAgICAgIHZhciB0aGF0V29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciB0aGlzU2lnQnl0ZXMgPSB0aGlzLnNpZ0J5dGVzO1xuXHQgICAgICAgICAgICB2YXIgdGhhdFNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENsYW1wIGV4Y2VzcyBiaXRzXG5cdCAgICAgICAgICAgIHRoaXMuY2xhbXAoKTtcblxuXHQgICAgICAgICAgICAvLyBDb25jYXRcblx0ICAgICAgICAgICAgaWYgKHRoaXNTaWdCeXRlcyAlIDQpIHtcblx0ICAgICAgICAgICAgICAgIC8vIENvcHkgb25lIGJ5dGUgYXQgYSB0aW1lXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoYXRTaWdCeXRlczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHRoYXRCeXRlID0gKHRoYXRXb3Jkc1tpID4+PiAyXSA+Pj4gKDI0IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpc1dvcmRzWyh0aGlzU2lnQnl0ZXMgKyBpKSA+Pj4gMl0gfD0gdGhhdEJ5dGUgPDwgKDI0IC0gKCh0aGlzU2lnQnl0ZXMgKyBpKSAlIDQpICogOCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyBDb3B5IG9uZSB3b3JkIGF0IGEgdGltZVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGF0U2lnQnl0ZXM7IGogKz0gNCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXNXb3Jkc1sodGhpc1NpZ0J5dGVzICsgaikgPj4+IDJdID0gdGhhdFdvcmRzW2ogPj4+IDJdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuc2lnQnl0ZXMgKz0gdGhhdFNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENoYWluYWJsZVxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVtb3ZlcyBpbnNpZ25pZmljYW50IGJpdHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHdvcmRBcnJheS5jbGFtcCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNsYW1wOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB0aGlzLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB0aGlzLnNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENsYW1wXG5cdCAgICAgICAgICAgIHdvcmRzW3NpZ0J5dGVzID4+PiAyXSAmPSAweGZmZmZmZmZmIDw8ICgzMiAtIChzaWdCeXRlcyAlIDQpICogOCk7XG5cdCAgICAgICAgICAgIHdvcmRzLmxlbmd0aCA9IE1hdGguY2VpbChzaWdCeXRlcyAvIDQpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBjbG9uZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNsb25lID0gd29yZEFycmF5LmNsb25lKCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gQmFzZS5jbG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICBjbG9uZS53b3JkcyA9IHRoaXMud29yZHMuc2xpY2UoMCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgd29yZCBhcnJheSBmaWxsZWQgd2l0aCByYW5kb20gYnl0ZXMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbkJ5dGVzIFRoZSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIHRvIGdlbmVyYXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcmFuZG9tIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LnJhbmRvbSgxNik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmFuZG9tOiBmdW5jdGlvbiAobkJ5dGVzKSB7XG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdO1xuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbkJ5dGVzOyBpICs9IDQpIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzLnB1c2goY3J5cHRvU2VjdXJlUmFuZG9tSW50KCkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgbkJ5dGVzKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBFbmNvZGVyIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfZW5jID0gQy5lbmMgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBIZXggZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBIZXggPSBDX2VuYy5IZXggPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgaGV4IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoZXggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaGV4U3RyaW5nID0gQ3J5cHRvSlMuZW5jLkhleC5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IHdvcmRBcnJheS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIGhleENoYXJzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2lnQnl0ZXM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGJpdGUgPSAod29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgaGV4Q2hhcnMucHVzaCgoYml0ZSA+Pj4gNCkudG9TdHJpbmcoMTYpKTtcblx0ICAgICAgICAgICAgICAgIGhleENoYXJzLnB1c2goKGJpdGUgJiAweDBmKS50b1N0cmluZygxNikpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGhleENoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIGhleCBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGhleFN0ciBUaGUgaGV4IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGhleFN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChoZXhTdHIpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGhleFN0ckxlbmd0aCA9IGhleFN0ci5sZW5ndGg7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZXhTdHJMZW5ndGg7IGkgKz0gMikge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbaSA+Pj4gM10gfD0gcGFyc2VJbnQoaGV4U3RyLnN1YnN0cihpLCAyKSwgMTYpIDw8ICgyNCAtIChpICUgOCkgKiA0KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQod29yZHMsIGhleFN0ckxlbmd0aCAvIDIpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogTGF0aW4xIGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgTGF0aW4xID0gQ19lbmMuTGF0aW4xID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIExhdGluMSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgTGF0aW4xIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGxhdGluMVN0cmluZyA9IENyeXB0b0pTLmVuYy5MYXRpbjEuc3RyaW5naWZ5KHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciBsYXRpbjFDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBiaXRlID0gKHdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIGxhdGluMUNoYXJzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShiaXRlKSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbGF0aW4xQ2hhcnMuam9pbignJyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgTGF0aW4xIHN0cmluZyB0byBhIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF0aW4xU3RyIFRoZSBMYXRpbjEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5MYXRpbjEucGFyc2UobGF0aW4xU3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGxhdGluMVN0cikge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgbGF0aW4xU3RyTGVuZ3RoID0gbGF0aW4xU3RyLmxlbmd0aDtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGluMVN0ckxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkc1tpID4+PiAyXSB8PSAobGF0aW4xU3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKSA8PCAoMjQgLSAoaSAlIDQpICogOCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBsYXRpbjFTdHJMZW5ndGgpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogVVRGLTggZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBVdGY4ID0gQ19lbmMuVXRmOCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBVVEYtOCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVRGLTggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgdXRmOFN0cmluZyA9IENyeXB0b0pTLmVuYy5VdGY4LnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoTGF0aW4xLnN0cmluZ2lmeSh3b3JkQXJyYXkpKSk7XG5cdCAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWFsZm9ybWVkIFVURi04IGRhdGEnKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIFVURi04IHN0cmluZyB0byBhIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXRmOFN0ciBUaGUgVVRGLTggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKHV0ZjhTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAodXRmOFN0cikge1xuXHQgICAgICAgICAgICByZXR1cm4gTGF0aW4xLnBhcnNlKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudCh1dGY4U3RyKSkpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYnVmZmVyZWQgYmxvY2sgYWxnb3JpdGhtIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIFRoZSBwcm9wZXJ0eSBibG9ja1NpemUgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhIGNvbmNyZXRlIHN1YnR5cGUuXG5cdCAgICAgKlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IF9taW5CdWZmZXJTaXplIFRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgc2hvdWxkIGJlIGtlcHQgdW5wcm9jZXNzZWQgaW4gdGhlIGJ1ZmZlci4gRGVmYXVsdDogMFxuXHQgICAgICovXG5cdCAgICB2YXIgQnVmZmVyZWRCbG9ja0FsZ29yaXRobSA9IENfbGliLkJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgYmxvY2sgYWxnb3JpdGhtJ3MgZGF0YSBidWZmZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0ucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBJbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB0aGlzLl9kYXRhID0gbmV3IFdvcmRBcnJheS5pbml0KCk7XG5cdCAgICAgICAgICAgIHRoaXMuX25EYXRhQnl0ZXMgPSAwO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBBZGRzIG5ldyBkYXRhIHRvIHRoaXMgYmxvY2sgYWxnb3JpdGhtJ3MgYnVmZmVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGFwcGVuZC4gU3RyaW5ncyBhcmUgY29udmVydGVkIHRvIGEgV29yZEFycmF5IHVzaW5nIFVURi04LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9hcHBlbmQoJ2RhdGEnKTtcblx0ICAgICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fYXBwZW5kKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2FwcGVuZDogZnVuY3Rpb24gKGRhdGEpIHtcblx0ICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gV29yZEFycmF5LCBlbHNlIGFzc3VtZSBXb3JkQXJyYXkgYWxyZWFkeVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgIGRhdGEgPSBVdGY4LnBhcnNlKGRhdGEpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQXBwZW5kXG5cdCAgICAgICAgICAgIHRoaXMuX2RhdGEuY29uY2F0KGRhdGEpO1xuXHQgICAgICAgICAgICB0aGlzLl9uRGF0YUJ5dGVzICs9IGRhdGEuc2lnQnl0ZXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFByb2Nlc3NlcyBhdmFpbGFibGUgZGF0YSBibG9ja3MuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbnZva2VzIF9kb1Byb2Nlc3NCbG9jayhvZmZzZXQpLCB3aGljaCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgY29uY3JldGUgc3VidHlwZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZG9GbHVzaCBXaGV0aGVyIGFsbCBibG9ja3MgYW5kIHBhcnRpYWwgYmxvY2tzIHNob3VsZCBiZSBwcm9jZXNzZWQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBwcm9jZXNzZWQgZGF0YS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHByb2Nlc3NlZERhdGEgPSBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLl9wcm9jZXNzKCk7XG5cdCAgICAgICAgICogICAgIHZhciBwcm9jZXNzZWREYXRhID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fcHJvY2VzcyghISdmbHVzaCcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9wcm9jZXNzOiBmdW5jdGlvbiAoZG9GbHVzaCkge1xuXHQgICAgICAgICAgICB2YXIgcHJvY2Vzc2VkV29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBkYXRhU2lnQnl0ZXMgPSBkYXRhLnNpZ0J5dGVzO1xuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplID0gdGhpcy5ibG9ja1NpemU7XG5cdCAgICAgICAgICAgIHZhciBibG9ja1NpemVCeXRlcyA9IGJsb2NrU2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgYmxvY2tzIHJlYWR5XG5cdCAgICAgICAgICAgIHZhciBuQmxvY2tzUmVhZHkgPSBkYXRhU2lnQnl0ZXMgLyBibG9ja1NpemVCeXRlcztcblx0ICAgICAgICAgICAgaWYgKGRvRmx1c2gpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFJvdW5kIHVwIHRvIGluY2x1ZGUgcGFydGlhbCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIG5CbG9ja3NSZWFkeSA9IE1hdGguY2VpbChuQmxvY2tzUmVhZHkpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gUm91bmQgZG93biB0byBpbmNsdWRlIG9ubHkgZnVsbCBibG9ja3MsXG5cdCAgICAgICAgICAgICAgICAvLyBsZXNzIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgbXVzdCByZW1haW4gaW4gdGhlIGJ1ZmZlclxuXHQgICAgICAgICAgICAgICAgbkJsb2Nrc1JlYWR5ID0gTWF0aC5tYXgoKG5CbG9ja3NSZWFkeSB8IDApIC0gdGhpcy5fbWluQnVmZmVyU2l6ZSwgMCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDb3VudCB3b3JkcyByZWFkeVxuXHQgICAgICAgICAgICB2YXIgbldvcmRzUmVhZHkgPSBuQmxvY2tzUmVhZHkgKiBibG9ja1NpemU7XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgYnl0ZXMgcmVhZHlcblx0ICAgICAgICAgICAgdmFyIG5CeXRlc1JlYWR5ID0gTWF0aC5taW4obldvcmRzUmVhZHkgKiA0LCBkYXRhU2lnQnl0ZXMpO1xuXG5cdCAgICAgICAgICAgIC8vIFByb2Nlc3MgYmxvY2tzXG5cdCAgICAgICAgICAgIGlmIChuV29yZHNSZWFkeSkge1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbldvcmRzUmVhZHk7IG9mZnNldCArPSBibG9ja1NpemUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWFsZ29yaXRobSBsb2dpY1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvUHJvY2Vzc0Jsb2NrKGRhdGFXb3Jkcywgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHByb2Nlc3NlZCB3b3Jkc1xuXHQgICAgICAgICAgICAgICAgcHJvY2Vzc2VkV29yZHMgPSBkYXRhV29yZHMuc3BsaWNlKDAsIG5Xb3Jkc1JlYWR5KTtcblx0ICAgICAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgLT0gbkJ5dGVzUmVhZHk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gcHJvY2Vzc2VkIHdvcmRzXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQocHJvY2Vzc2VkV29yZHMsIG5CeXRlc1JlYWR5KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBjbG9uZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNsb25lID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5jbG9uZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEJhc2UuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUuX2RhdGEgPSB0aGlzLl9kYXRhLmNsb25lKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfbWluQnVmZmVyU2l6ZTogMFxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgaGFzaGVyIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgdGhpcyBoYXNoZXIgb3BlcmF0ZXMgb24uIERlZmF1bHQ6IDE2ICg1MTIgYml0cylcblx0ICAgICAqL1xuXHQgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlciA9IEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCgpLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGhhc2hlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBoYXNoIGNvbXB1dGF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaGFzaGVyID0gQ3J5cHRvSlMuYWxnby5TSEEyNTYuY3JlYXRlKCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZXNldHMgdGhpcyBoYXNoZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFJlc2V0IGRhdGEgYnVmZmVyXG5cdCAgICAgICAgICAgIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0ucmVzZXQuY2FsbCh0aGlzKTtcblxuXHQgICAgICAgICAgICAvLyBQZXJmb3JtIGNvbmNyZXRlLWhhc2hlciBsb2dpY1xuXHQgICAgICAgICAgICB0aGlzLl9kb1Jlc2V0KCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFVwZGF0ZXMgdGhpcyBoYXNoZXIgd2l0aCBhIG1lc3NhZ2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgVGhlIG1lc3NhZ2UgdG8gYXBwZW5kLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7SGFzaGVyfSBUaGlzIGhhc2hlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgaGFzaGVyLnVwZGF0ZSgnbWVzc2FnZScpO1xuXHQgICAgICAgICAqICAgICBoYXNoZXIudXBkYXRlKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdXBkYXRlOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBBcHBlbmRcblx0ICAgICAgICAgICAgdGhpcy5fYXBwZW5kKG1lc3NhZ2VVcGRhdGUpO1xuXG5cdCAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaGFzaFxuXHQgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ2hhaW5hYmxlXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBGaW5hbGl6ZXMgdGhlIGhhc2ggY29tcHV0YXRpb24uXG5cdCAgICAgICAgICogTm90ZSB0aGF0IHRoZSBmaW5hbGl6ZSBvcGVyYXRpb24gaXMgZWZmZWN0aXZlbHkgYSBkZXN0cnVjdGl2ZSwgcmVhZC1vbmNlIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSAoT3B0aW9uYWwpIEEgZmluYWwgbWVzc2FnZSB1cGRhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaGFzaCA9IGhhc2hlci5maW5hbGl6ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgaGFzaCA9IGhhc2hlci5maW5hbGl6ZSgnbWVzc2FnZScpO1xuXHQgICAgICAgICAqICAgICB2YXIgaGFzaCA9IGhhc2hlci5maW5hbGl6ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBGaW5hbCBtZXNzYWdlIHVwZGF0ZVxuXHQgICAgICAgICAgICBpZiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kKG1lc3NhZ2VVcGRhdGUpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1oYXNoZXIgbG9naWNcblx0ICAgICAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9kb0ZpbmFsaXplKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGhhc2g7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGJsb2NrU2l6ZTogNTEyLzMyLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHNob3J0Y3V0IGZ1bmN0aW9uIHRvIGEgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2hlciB0byBjcmVhdGUgYSBoZWxwZXIgZm9yLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBzaG9ydGN1dCBmdW5jdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIFNIQTI1NiA9IENyeXB0b0pTLmxpYi5IYXNoZXIuX2NyZWF0ZUhlbHBlcihDcnlwdG9KUy5hbGdvLlNIQTI1Nik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2NyZWF0ZUhlbHBlcjogZnVuY3Rpb24gKGhhc2hlcikge1xuXHQgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UsIGNmZykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBoYXNoZXIuaW5pdChjZmcpLmZpbmFsaXplKG1lc3NhZ2UpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIGEgc2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaGVyIHRvIHVzZSBpbiB0aGlzIEhNQUMgaGVscGVyLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBzaG9ydGN1dCBmdW5jdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIEhtYWNTSEEyNTYgPSBDcnlwdG9KUy5saWIuSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKENyeXB0b0pTLmFsZ28uU0hBMjU2KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfY3JlYXRlSG1hY0hlbHBlcjogZnVuY3Rpb24gKGhhc2hlcikge1xuXHQgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UsIGtleSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDX2FsZ28uSE1BQy5pbml0KGhhc2hlciwga2V5KS5maW5hbGl6ZShtZXNzYWdlKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBbGdvcml0aG0gbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvID0ge307XG5cblx0ICAgIHJldHVybiBDO1xuXHR9KE1hdGgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUztcblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEJhc2U2NCBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEJhc2U2NCA9IENfZW5jLkJhc2U2NCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBCYXNlNjQgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEJhc2U2NCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBiYXNlNjRTdHJpbmcgPSBDcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cblx0ICAgICAgICAgICAgLy8gQ2xhbXAgZXhjZXNzIGJpdHNcblx0ICAgICAgICAgICAgd29yZEFycmF5LmNsYW1wKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgYmFzZTY0Q2hhcnMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSArPSAzKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYnl0ZTEgPSAod29yZHNbaSA+Pj4gMl0gICAgICAgPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgICAgICAgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgdmFyIGJ5dGUyID0gKHdvcmRzWyhpICsgMSkgPj4+IDJdID4+PiAoMjQgLSAoKGkgKyAxKSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIHZhciBieXRlMyA9ICh3b3Jkc1soaSArIDIpID4+PiAyXSA+Pj4gKDI0IC0gKChpICsgMikgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cblx0ICAgICAgICAgICAgICAgIHZhciB0cmlwbGV0ID0gKGJ5dGUxIDw8IDE2KSB8IChieXRlMiA8PCA4KSB8IGJ5dGUzO1xuXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgKGogPCA0KSAmJiAoaSArIGogKiAwLjc1IDwgc2lnQnl0ZXMpOyBqKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBiYXNlNjRDaGFycy5wdXNoKG1hcC5jaGFyQXQoKHRyaXBsZXQgPj4+ICg2ICogKDMgLSBqKSkpICYgMHgzZikpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmdcblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmdDaGFyID0gbWFwLmNoYXJBdCg2NCk7XG5cdCAgICAgICAgICAgIGlmIChwYWRkaW5nQ2hhcikge1xuXHQgICAgICAgICAgICAgICAgd2hpbGUgKGJhc2U2NENoYXJzLmxlbmd0aCAlIDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBiYXNlNjRDaGFycy5wdXNoKHBhZGRpbmdDaGFyKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBiYXNlNjRDaGFycy5qb2luKCcnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBCYXNlNjQgc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlNjRTdHIgVGhlIEJhc2U2NCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShiYXNlNjRTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoYmFzZTY0U3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgYmFzZTY0U3RyTGVuZ3RoID0gYmFzZTY0U3RyLmxlbmd0aDtcblx0ICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcDtcblx0ICAgICAgICAgICAgdmFyIHJldmVyc2VNYXAgPSB0aGlzLl9yZXZlcnNlTWFwO1xuXG5cdCAgICAgICAgICAgIGlmICghcmV2ZXJzZU1hcCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldmVyc2VNYXAgPSB0aGlzLl9yZXZlcnNlTWFwID0gW107XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXAubGVuZ3RoOyBqKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZU1hcFttYXAuY2hhckNvZGVBdChqKV0gPSBqO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIElnbm9yZSBwYWRkaW5nXG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nQ2hhciA9IG1hcC5jaGFyQXQoNjQpO1xuXHQgICAgICAgICAgICBpZiAocGFkZGluZ0NoYXIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBwYWRkaW5nSW5kZXggPSBiYXNlNjRTdHIuaW5kZXhPZihwYWRkaW5nQ2hhcik7XG5cdCAgICAgICAgICAgICAgICBpZiAocGFkZGluZ0luZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJhc2U2NFN0ckxlbmd0aCA9IHBhZGRpbmdJbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgcmV0dXJuIHBhcnNlTG9vcChiYXNlNjRTdHIsIGJhc2U2NFN0ckxlbmd0aCwgcmV2ZXJzZU1hcCk7XG5cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX21hcDogJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89J1xuXHQgICAgfTtcblxuXHQgICAgZnVuY3Rpb24gcGFyc2VMb29wKGJhc2U2NFN0ciwgYmFzZTY0U3RyTGVuZ3RoLCByZXZlcnNlTWFwKSB7XG5cdCAgICAgIHZhciB3b3JkcyA9IFtdO1xuXHQgICAgICB2YXIgbkJ5dGVzID0gMDtcblx0ICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYXNlNjRTdHJMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgaWYgKGkgJSA0KSB7XG5cdCAgICAgICAgICAgICAgdmFyIGJpdHMxID0gcmV2ZXJzZU1hcFtiYXNlNjRTdHIuY2hhckNvZGVBdChpIC0gMSldIDw8ICgoaSAlIDQpICogMik7XG5cdCAgICAgICAgICAgICAgdmFyIGJpdHMyID0gcmV2ZXJzZU1hcFtiYXNlNjRTdHIuY2hhckNvZGVBdChpKV0gPj4+ICg2IC0gKGkgJSA0KSAqIDIpO1xuXHQgICAgICAgICAgICAgIHZhciBiaXRzQ29tYmluZWQgPSBiaXRzMSB8IGJpdHMyO1xuXHQgICAgICAgICAgICAgIHdvcmRzW25CeXRlcyA+Pj4gMl0gfD0gYml0c0NvbWJpbmVkIDw8ICgyNCAtIChuQnl0ZXMgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICAgIG5CeXRlcysrO1xuXHQgICAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBXb3JkQXJyYXkuY3JlYXRlKHdvcmRzLCBuQnl0ZXMpO1xuXHQgICAgfVxuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLmVuYy5CYXNlNjQ7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdHJldHVybiBDcnlwdG9KUy5lbmMuVXRmODtcblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnksIHVuZGVmKSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpLCByZXF1aXJlKFwiLi9zaGExXCIpLCByZXF1aXJlKFwiLi9obWFjXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIiwgXCIuL3NoYTFcIiwgXCIuL2htYWNcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXHQgICAgdmFyIE1ENSA9IENfYWxnby5NRDU7XG5cblx0ICAgIC8qKlxuXHQgICAgICogVGhpcyBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBpcyBtZWFudCB0byBjb25mb3JtIHdpdGggRVZQX0J5dGVzVG9LZXkuXG5cdCAgICAgKiB3d3cub3BlbnNzbC5vcmcvZG9jcy9jcnlwdG8vRVZQX0J5dGVzVG9LZXkuaHRtbFxuXHQgICAgICovXG5cdCAgICB2YXIgRXZwS0RGID0gQ19hbGdvLkV2cEtERiA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0ga2V5U2l6ZSBUaGUga2V5IHNpemUgaW4gd29yZHMgdG8gZ2VuZXJhdGUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZS4gRGVmYXVsdDogTUQ1XG5cdCAgICAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGl0ZXJhdGlvbnMgVGhlIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHBlcmZvcm0uIERlZmF1bHQ6IDFcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAgICAga2V5U2l6ZTogMTI4LzMyLFxuXHQgICAgICAgICAgICBoYXNoZXI6IE1ENSxcblx0ICAgICAgICAgICAgaXRlcmF0aW9uczogMVxuXHQgICAgICAgIH0pLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUgZGVyaXZhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uRXZwS0RGLmNyZWF0ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIga2RmID0gQ3J5cHRvSlMuYWxnby5FdnBLREYuY3JlYXRlKHsga2V5U2l6ZTogOCB9KTtcblx0ICAgICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IDgsIGl0ZXJhdGlvbnM6IDEwMDAgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGNmZykge1xuXHQgICAgICAgICAgICB0aGlzLmNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBEZXJpdmVzIGEga2V5IGZyb20gYSBwYXNzd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gc2FsdCBBIHNhbHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkZXJpdmVkIGtleS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGtleSA9IGtkZi5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjb21wdXRlOiBmdW5jdGlvbiAocGFzc3dvcmQsIHNhbHQpIHtcblx0ICAgICAgICAgICAgdmFyIGJsb2NrO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBjZmcgPSB0aGlzLmNmZztcblxuXHQgICAgICAgICAgICAvLyBJbml0IGhhc2hlclxuXHQgICAgICAgICAgICB2YXIgaGFzaGVyID0gY2ZnLmhhc2hlci5jcmVhdGUoKTtcblxuXHQgICAgICAgICAgICAvLyBJbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB2YXIgZGVyaXZlZEtleSA9IFdvcmRBcnJheS5jcmVhdGUoKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRLZXlXb3JkcyA9IGRlcml2ZWRLZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBrZXlTaXplID0gY2ZnLmtleVNpemU7XG5cdCAgICAgICAgICAgIHZhciBpdGVyYXRpb25zID0gY2ZnLml0ZXJhdGlvbnM7XG5cblx0ICAgICAgICAgICAgLy8gR2VuZXJhdGUga2V5XG5cdCAgICAgICAgICAgIHdoaWxlIChkZXJpdmVkS2V5V29yZHMubGVuZ3RoIDwga2V5U2l6ZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFzaGVyLnVwZGF0ZShibG9jayk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBibG9jayA9IGhhc2hlci51cGRhdGUocGFzc3dvcmQpLmZpbmFsaXplKHNhbHQpO1xuXHQgICAgICAgICAgICAgICAgaGFzaGVyLnJlc2V0KCk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGlvbnNcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBoYXNoZXIuZmluYWxpemUoYmxvY2spO1xuXHQgICAgICAgICAgICAgICAgICAgIGhhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBkZXJpdmVkS2V5LmNvbmNhdChibG9jayk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZGVyaXZlZEtleS5zaWdCeXRlcyA9IGtleVNpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIHJldHVybiBkZXJpdmVkS2V5O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIERlcml2ZXMgYSBrZXkgZnJvbSBhIHBhc3N3b3JkLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkLlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBzYWx0IEEgc2FsdC5cblx0ICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBjb21wdXRhdGlvbi5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBkZXJpdmVkIGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLkV2cEtERihwYXNzd29yZCwgc2FsdCk7XG5cdCAgICAgKiAgICAgdmFyIGtleSA9IENyeXB0b0pTLkV2cEtERihwYXNzd29yZCwgc2FsdCwgeyBrZXlTaXplOiA4IH0pO1xuXHQgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5FdnBLREYocGFzc3dvcmQsIHNhbHQsIHsga2V5U2l6ZTogOCwgaXRlcmF0aW9uczogMTAwMCB9KTtcblx0ICAgICAqL1xuXHQgICAgQy5FdnBLREYgPSBmdW5jdGlvbiAocGFzc3dvcmQsIHNhbHQsIGNmZykge1xuXHQgICAgICAgIHJldHVybiBFdnBLREYuY3JlYXRlKGNmZykuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7XG5cdCAgICB9O1xuXHR9KCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLkV2cEtERjtcblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIEJhc2UgPSBDX2xpYi5CYXNlO1xuXHQgICAgdmFyIENfZW5jID0gQy5lbmM7XG5cdCAgICB2YXIgVXRmOCA9IENfZW5jLlV0Zjg7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEhNQUMgYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgSE1BQyA9IENfYWxnby5ITUFDID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBITUFDLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtIYXNoZXJ9IGhhc2hlciBUaGUgaGFzaCBhbGdvcml0aG0gdG8gdXNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaG1hY0hhc2hlciA9IENyeXB0b0pTLmFsZ28uSE1BQy5jcmVhdGUoQ3J5cHRvSlMuYWxnby5TSEEyNTYsIGtleSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKGhhc2hlciwga2V5KSB7XG5cdCAgICAgICAgICAgIC8vIEluaXQgaGFzaGVyXG5cdCAgICAgICAgICAgIGhhc2hlciA9IHRoaXMuX2hhc2hlciA9IG5ldyBoYXNoZXIuaW5pdCgpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIFdvcmRBcnJheSwgZWxzZSBhc3N1bWUgV29yZEFycmF5IGFscmVhZHlcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgIGtleSA9IFV0ZjgucGFyc2Uoa2V5KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgaGFzaGVyQmxvY2tTaXplID0gaGFzaGVyLmJsb2NrU2l6ZTtcblx0ICAgICAgICAgICAgdmFyIGhhc2hlckJsb2NrU2l6ZUJ5dGVzID0gaGFzaGVyQmxvY2tTaXplICogNDtcblxuXHQgICAgICAgICAgICAvLyBBbGxvdyBhcmJpdHJhcnkgbGVuZ3RoIGtleXNcblx0ICAgICAgICAgICAgaWYgKGtleS5zaWdCeXRlcyA+IGhhc2hlckJsb2NrU2l6ZUJ5dGVzKSB7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSBoYXNoZXIuZmluYWxpemUoa2V5KTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIENsYW1wIGV4Y2VzcyBiaXRzXG5cdCAgICAgICAgICAgIGtleS5jbGFtcCgpO1xuXG5cdCAgICAgICAgICAgIC8vIENsb25lIGtleSBmb3IgaW5uZXIgYW5kIG91dGVyIHBhZHNcblx0ICAgICAgICAgICAgdmFyIG9LZXkgPSB0aGlzLl9vS2V5ID0ga2V5LmNsb25lKCk7XG5cdCAgICAgICAgICAgIHZhciBpS2V5ID0gdGhpcy5faUtleSA9IGtleS5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgb0tleVdvcmRzID0gb0tleS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIGlLZXlXb3JkcyA9IGlLZXkud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gWE9SIGtleXMgd2l0aCBwYWQgY29uc3RhbnRzXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFzaGVyQmxvY2tTaXplOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIG9LZXlXb3Jkc1tpXSBePSAweDVjNWM1YzVjO1xuXHQgICAgICAgICAgICAgICAgaUtleVdvcmRzW2ldIF49IDB4MzYzNjM2MzY7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgb0tleS5zaWdCeXRlcyA9IGlLZXkuc2lnQnl0ZXMgPSBoYXNoZXJCbG9ja1NpemVCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBSZXNldHMgdGhpcyBITUFDIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBobWFjSGFzaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGhhc2hlciA9IHRoaXMuX2hhc2hlcjtcblxuXHQgICAgICAgICAgICAvLyBSZXNldFxuXHQgICAgICAgICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgICAgaGFzaGVyLnVwZGF0ZSh0aGlzLl9pS2V5KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogVXBkYXRlcyB0aGlzIEhNQUMgd2l0aCBhIG1lc3NhZ2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgVGhlIG1lc3NhZ2UgdG8gYXBwZW5kLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7SE1BQ30gVGhpcyBITUFDIGluc3RhbmNlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBobWFjSGFzaGVyLnVwZGF0ZSgnbWVzc2FnZScpO1xuXHQgICAgICAgICAqICAgICBobWFjSGFzaGVyLnVwZGF0ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaGVyLnVwZGF0ZShtZXNzYWdlVXBkYXRlKTtcblxuXHQgICAgICAgICAgICAvLyBDaGFpbmFibGVcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEZpbmFsaXplcyB0aGUgSE1BQyBjb21wdXRhdGlvbi5cblx0ICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIGZpbmFsaXplIG9wZXJhdGlvbiBpcyBlZmZlY3RpdmVseSBhIGRlc3RydWN0aXZlLCByZWFkLW9uY2Ugb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIChPcHRpb25hbCkgQSBmaW5hbCBtZXNzYWdlIHVwZGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBobWFjID0gaG1hY0hhc2hlci5maW5hbGl6ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgaG1hYyA9IGhtYWNIYXNoZXIuZmluYWxpemUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhtYWMgPSBobWFjSGFzaGVyLmZpbmFsaXplKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBoYXNoZXIgPSB0aGlzLl9oYXNoZXI7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBITUFDXG5cdCAgICAgICAgICAgIHZhciBpbm5lckhhc2ggPSBoYXNoZXIuZmluYWxpemUobWVzc2FnZVVwZGF0ZSk7XG5cdCAgICAgICAgICAgIGhhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAgICB2YXIgaG1hYyA9IGhhc2hlci5maW5hbGl6ZSh0aGlzLl9vS2V5LmNsb25lKCkuY29uY2F0KGlubmVySGFzaCkpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBobWFjO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9KCkpO1xuXG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoTWF0aCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIEhhc2hlciA9IENfbGliLkhhc2hlcjtcblx0ICAgIHZhciBDX2FsZ28gPSBDLmFsZ287XG5cblx0ICAgIC8vIENvbnN0YW50cyB0YWJsZVxuXHQgICAgdmFyIFQgPSBbXTtcblxuXHQgICAgLy8gQ29tcHV0ZSBjb25zdGFudHNcblx0ICAgIChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XG5cdCAgICAgICAgICAgIFRbaV0gPSAoTWF0aC5hYnMoTWF0aC5zaW4oaSArIDEpKSAqIDB4MTAwMDAwMDAwKSB8IDA7XG5cdCAgICAgICAgfVxuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBNRDUgaGFzaCBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBNRDUgPSBDX2FsZ28uTUQ1ID0gSGFzaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBXb3JkQXJyYXkuaW5pdChbXG5cdCAgICAgICAgICAgICAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LFxuXHQgICAgICAgICAgICAgICAgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NlxuXHQgICAgICAgICAgICBdKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0X2kgPSBvZmZzZXQgKyBpO1xuXHQgICAgICAgICAgICAgICAgdmFyIE1fb2Zmc2V0X2kgPSBNW29mZnNldF9pXTtcblxuXHQgICAgICAgICAgICAgICAgTVtvZmZzZXRfaV0gPSAoXG5cdCAgICAgICAgICAgICAgICAgICAgKCgoTV9vZmZzZXRfaSA8PCA4KSAgfCAoTV9vZmZzZXRfaSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICAgICAoKChNX29mZnNldF9pIDw8IDI0KSB8IChNX29mZnNldF9pID4+PiA4KSkgICYgMHhmZjAwZmYwMClcblx0ICAgICAgICAgICAgICAgICk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIEggPSB0aGlzLl9oYXNoLndvcmRzO1xuXG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8wICA9IE1bb2Zmc2V0ICsgMF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xICA9IE1bb2Zmc2V0ICsgMV07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8yICA9IE1bb2Zmc2V0ICsgMl07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8zICA9IE1bb2Zmc2V0ICsgM107XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF80ICA9IE1bb2Zmc2V0ICsgNF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF81ICA9IE1bb2Zmc2V0ICsgNV07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF82ICA9IE1bb2Zmc2V0ICsgNl07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF83ICA9IE1bb2Zmc2V0ICsgN107XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF84ICA9IE1bb2Zmc2V0ICsgOF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF85ICA9IE1bb2Zmc2V0ICsgOV07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xMCA9IE1bb2Zmc2V0ICsgMTBdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTEgPSBNW29mZnNldCArIDExXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzEyID0gTVtvZmZzZXQgKyAxMl07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xMyA9IE1bb2Zmc2V0ICsgMTNdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTQgPSBNW29mZnNldCArIDE0XTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzE1ID0gTVtvZmZzZXQgKyAxNV07XG5cblx0ICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWJsZXNcblx0ICAgICAgICAgICAgdmFyIGEgPSBIWzBdO1xuXHQgICAgICAgICAgICB2YXIgYiA9IEhbMV07XG5cdCAgICAgICAgICAgIHZhciBjID0gSFsyXTtcblx0ICAgICAgICAgICAgdmFyIGQgPSBIWzNdO1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGF0aW9uXG5cdCAgICAgICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCBNX29mZnNldF8wLCAgNywgIFRbMF0pO1xuXHQgICAgICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfMSwgIDEyLCBUWzFdKTtcblx0ICAgICAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzIsICAxNywgVFsyXSk7XG5cdCAgICAgICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCBNX29mZnNldF8zLCAgMjIsIFRbM10pO1xuXHQgICAgICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgTV9vZmZzZXRfNCwgIDcsICBUWzRdKTtcblx0ICAgICAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzUsICAxMiwgVFs1XSk7XG5cdCAgICAgICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF82LCAgMTcsIFRbNl0pO1xuXHQgICAgICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfNywgIDIyLCBUWzddKTtcblx0ICAgICAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzgsICA3LCAgVFs4XSk7XG5cdCAgICAgICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCBNX29mZnNldF85LCAgMTIsIFRbOV0pO1xuXHQgICAgICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTAsIDE3LCBUWzEwXSk7XG5cdCAgICAgICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCBNX29mZnNldF8xMSwgMjIsIFRbMTFdKTtcblx0ICAgICAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEyLCA3LCAgVFsxMl0pO1xuXHQgICAgICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTMsIDEyLCBUWzEzXSk7XG5cdCAgICAgICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF8xNCwgMTcsIFRbMTRdKTtcblx0ICAgICAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzE1LCAyMiwgVFsxNV0pO1xuXG5cdCAgICAgICAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCBNX29mZnNldF8xLCAgNSwgIFRbMTZdKTtcblx0ICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzYsICA5LCAgVFsxN10pO1xuXHQgICAgICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgTV9vZmZzZXRfMTEsIDE0LCBUWzE4XSk7XG5cdCAgICAgICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBNX29mZnNldF8wLCAgMjAsIFRbMTldKTtcblx0ICAgICAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzUsICA1LCAgVFsyMF0pO1xuXHQgICAgICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgTV9vZmZzZXRfMTAsIDksICBUWzIxXSk7XG5cdCAgICAgICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBNX29mZnNldF8xNSwgMTQsIFRbMjJdKTtcblx0ICAgICAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzQsICAyMCwgVFsyM10pO1xuXHQgICAgICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgTV9vZmZzZXRfOSwgIDUsICBUWzI0XSk7XG5cdCAgICAgICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBNX29mZnNldF8xNCwgOSwgIFRbMjVdKTtcblx0ICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzMsICAxNCwgVFsyNl0pO1xuXHQgICAgICAgICAgICBiID0gR0coYiwgYywgZCwgYSwgTV9vZmZzZXRfOCwgIDIwLCBUWzI3XSk7XG5cdCAgICAgICAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCBNX29mZnNldF8xMywgNSwgIFRbMjhdKTtcblx0ICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzIsICA5LCAgVFsyOV0pO1xuXHQgICAgICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgTV9vZmZzZXRfNywgIDE0LCBUWzMwXSk7XG5cdCAgICAgICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBNX29mZnNldF8xMiwgMjAsIFRbMzFdKTtcblxuXHQgICAgICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfNSwgIDQsICBUWzMyXSk7XG5cdCAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF84LCAgMTEsIFRbMzNdKTtcblx0ICAgICAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzExLCAxNiwgVFszNF0pO1xuXHQgICAgICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTQsIDIzLCBUWzM1XSk7XG5cdCAgICAgICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF8xLCAgNCwgIFRbMzZdKTtcblx0ICAgICAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzQsICAxMSwgVFszN10pO1xuXHQgICAgICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgTV9vZmZzZXRfNywgIDE2LCBUWzM4XSk7XG5cdCAgICAgICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF8xMCwgMjMsIFRbMzldKTtcblx0ICAgICAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEzLCA0LCAgVFs0MF0pO1xuXHQgICAgICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgTV9vZmZzZXRfMCwgIDExLCBUWzQxXSk7XG5cdCAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF8zLCAgMTYsIFRbNDJdKTtcblx0ICAgICAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzYsICAyMywgVFs0M10pO1xuXHQgICAgICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfOSwgIDQsICBUWzQ0XSk7XG5cdCAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF8xMiwgMTEsIFRbNDVdKTtcblx0ICAgICAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzE1LCAxNiwgVFs0Nl0pO1xuXHQgICAgICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgTV9vZmZzZXRfMiwgIDIzLCBUWzQ3XSk7XG5cblx0ICAgICAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzAsICA2LCAgVFs0OF0pO1xuXHQgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfNywgIDEwLCBUWzQ5XSk7XG5cdCAgICAgICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCBNX29mZnNldF8xNCwgMTUsIFRbNTBdKTtcblx0ICAgICAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzUsICAyMSwgVFs1MV0pO1xuXHQgICAgICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfMTIsIDYsICBUWzUyXSk7XG5cdCAgICAgICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCBNX29mZnNldF8zLCAgMTAsIFRbNTNdKTtcblx0ICAgICAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzEwLCAxNSwgVFs1NF0pO1xuXHQgICAgICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfMSwgIDIxLCBUWzU1XSk7XG5cdCAgICAgICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCBNX29mZnNldF84LCAgNiwgIFRbNTZdKTtcblx0ICAgICAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzE1LCAxMCwgVFs1N10pO1xuXHQgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfNiwgIDE1LCBUWzU4XSk7XG5cdCAgICAgICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCBNX29mZnNldF8xMywgMjEsIFRbNTldKTtcblx0ICAgICAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzQsICA2LCAgVFs2MF0pO1xuXHQgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTEsIDEwLCBUWzYxXSk7XG5cdCAgICAgICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCBNX29mZnNldF8yLCAgMTUsIFRbNjJdKTtcblx0ICAgICAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzksICAyMSwgVFs2M10pO1xuXG5cdCAgICAgICAgICAgIC8vIEludGVybWVkaWF0ZSBoYXNoIHZhbHVlXG5cdCAgICAgICAgICAgIEhbMF0gPSAoSFswXSArIGEpIHwgMDtcblx0ICAgICAgICAgICAgSFsxXSA9IChIWzFdICsgYikgfCAwO1xuXHQgICAgICAgICAgICBIWzJdID0gKEhbMl0gKyBjKSB8IDA7XG5cdCAgICAgICAgICAgIEhbM10gPSAoSFszXSArIGQpIHwgMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4O1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpO1xuXG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsSCA9IE1hdGguZmxvb3IobkJpdHNUb3RhbCAvIDB4MTAwMDAwMDAwKTtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWxMID0gbkJpdHNUb3RhbDtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNV0gPSAoXG5cdCAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsSCA8PCA4KSAgfCAobkJpdHNUb3RhbEggPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsSCA8PCAyNCkgfCAobkJpdHNUb3RhbEggPj4+IDgpKSAgJiAweGZmMDBmZjAwKVxuXHQgICAgICAgICAgICApO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IChcblx0ICAgICAgICAgICAgICAgICgoKG5CaXRzVG90YWxMIDw8IDgpICB8IChuQml0c1RvdGFsTCA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICgoKG5CaXRzVG90YWxMIDw8IDI0KSB8IChuQml0c1RvdGFsTCA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApXG5cdCAgICAgICAgICAgICk7XG5cblx0ICAgICAgICAgICAgZGF0YS5zaWdCeXRlcyA9IChkYXRhV29yZHMubGVuZ3RoICsgMSkgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIEhhc2ggZmluYWwgYmxvY2tzXG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3MoKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGhhc2ggPSB0aGlzLl9oYXNoO1xuXHQgICAgICAgICAgICB2YXIgSCA9IGhhc2gud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gU3dhcCBlbmRpYW5cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgICAgICB2YXIgSF9pID0gSFtpXTtcblxuXHQgICAgICAgICAgICAgICAgSFtpXSA9ICgoKEhfaSA8PCA4KSAgfCAoSF9pID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgICAgICAgICgoKEhfaSA8PCAyNCkgfCAoSF9pID4+PiA4KSkgICYgMHhmZjAwZmYwMCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBSZXR1cm4gZmluYWwgY29tcHV0ZWQgaGFzaFxuXHQgICAgICAgICAgICByZXR1cm4gaGFzaDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb25lID0gSGFzaGVyLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9oYXNoID0gdGhpcy5faGFzaC5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgZnVuY3Rpb24gRkYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArICgoYiAmIGMpIHwgKH5iICYgZCkpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gR0coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArICgoYiAmIGQpIHwgKGMgJiB+ZCkpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gSEgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArIChiIF4gYyBeIGQpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgZnVuY3Rpb24gSUkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuXHQgICAgICAgIHZhciBuID0gYSArIChjIF4gKGIgfCB+ZCkpICsgeCArIHQ7XG5cdCAgICAgICAgcmV0dXJuICgobiA8PCBzKSB8IChuID4+PiAoMzIgLSBzKSkpICsgYjtcblx0ICAgIH1cblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgaGFzaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLk1ENSgnbWVzc2FnZScpO1xuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuTUQ1KHdvcmRBcnJheSk7XG5cdCAgICAgKi9cblx0ICAgIEMuTUQ1ID0gSGFzaGVyLl9jcmVhdGVIZWxwZXIoTUQ1KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNNRDUobWVzc2FnZSwga2V5KTtcblx0ICAgICAqL1xuXHQgICAgQy5IbWFjTUQ1ID0gSGFzaGVyLl9jcmVhdGVIbWFjSGVscGVyKE1ENSk7XG5cdH0oTWF0aCkpO1xuXG5cblx0cmV0dXJuIENyeXB0b0pTLk1ENTtcblxufSkpOyIsIjsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtcIi4vY29yZVwiXSwgZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gR2xvYmFsIChicm93c2VyKVxuXHRcdGZhY3Rvcnkocm9vdC5DcnlwdG9KUyk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24gKENyeXB0b0pTKSB7XG5cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBSZXVzYWJsZSBvYmplY3Rcblx0ICAgIHZhciBXID0gW107XG5cblx0ICAgIC8qKlxuXHQgICAgICogU0hBLTEgaGFzaCBhbGdvcml0aG0uXG5cdCAgICAgKi9cblx0ICAgIHZhciBTSEExID0gQ19hbGdvLlNIQTEgPSBIYXNoZXIuZXh0ZW5kKHtcblx0ICAgICAgICBfZG9SZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB0aGlzLl9oYXNoID0gbmV3IFdvcmRBcnJheS5pbml0KFtcblx0ICAgICAgICAgICAgICAgIDB4Njc0NTIzMDEsIDB4ZWZjZGFiODksXG5cdCAgICAgICAgICAgICAgICAweDk4YmFkY2ZlLCAweDEwMzI1NDc2LFxuXHQgICAgICAgICAgICAgICAgMHhjM2QyZTFmMFxuXHQgICAgICAgICAgICBdKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvUHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBIID0gdGhpcy5faGFzaC53b3JkcztcblxuXHQgICAgICAgICAgICAvLyBXb3JraW5nIHZhcmlhYmxlc1xuXHQgICAgICAgICAgICB2YXIgYSA9IEhbMF07XG5cdCAgICAgICAgICAgIHZhciBiID0gSFsxXTtcblx0ICAgICAgICAgICAgdmFyIGMgPSBIWzJdO1xuXHQgICAgICAgICAgICB2YXIgZCA9IEhbM107XG5cdCAgICAgICAgICAgIHZhciBlID0gSFs0XTtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRhdGlvblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDgwOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIGlmIChpIDwgMTYpIHtcblx0ICAgICAgICAgICAgICAgICAgICBXW2ldID0gTVtvZmZzZXQgKyBpXSB8IDA7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBuID0gV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XTtcblx0ICAgICAgICAgICAgICAgICAgICBXW2ldID0gKG4gPDwgMSkgfCAobiA+Pj4gMzEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICB2YXIgdCA9ICgoYSA8PCA1KSB8IChhID4+PiAyNykpICsgZSArIFdbaV07XG5cdCAgICAgICAgICAgICAgICBpZiAoaSA8IDIwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCArPSAoKGIgJiBjKSB8ICh+YiAmIGQpKSArIDB4NWE4Mjc5OTk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCA0MCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgKz0gKGIgXiBjIF4gZCkgKyAweDZlZDllYmExO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgNjApIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ICs9ICgoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCkpIC0gMHg3MGU0NDMyNDtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAoaSA8IDgwKSAqLyB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCArPSAoYiBeIGMgXiBkKSAtIDB4MzU5ZDNlMmE7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIGUgPSBkO1xuXHQgICAgICAgICAgICAgICAgZCA9IGM7XG5cdCAgICAgICAgICAgICAgICBjID0gKGIgPDwgMzApIHwgKGIgPj4+IDIpO1xuXHQgICAgICAgICAgICAgICAgYiA9IGE7XG5cdCAgICAgICAgICAgICAgICBhID0gdDtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIEludGVybWVkaWF0ZSBoYXNoIHZhbHVlXG5cdCAgICAgICAgICAgIEhbMF0gPSAoSFswXSArIGEpIHwgMDtcblx0ICAgICAgICAgICAgSFsxXSA9IChIWzFdICsgYikgfCAwO1xuXHQgICAgICAgICAgICBIWzJdID0gKEhbMl0gKyBjKSB8IDA7XG5cdCAgICAgICAgICAgIEhbM10gPSAoSFszXSArIGQpIHwgMDtcblx0ICAgICAgICAgICAgSFs0XSA9IChIWzRdICsgZSkgfCAwO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBfZG9GaW5hbGl6ZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhO1xuXHQgICAgICAgICAgICB2YXIgZGF0YVdvcmRzID0gZGF0YS53b3JkcztcblxuXHQgICAgICAgICAgICB2YXIgbkJpdHNUb3RhbCA9IHRoaXMuX25EYXRhQnl0ZXMgKiA4O1xuXHQgICAgICAgICAgICB2YXIgbkJpdHNMZWZ0ID0gZGF0YS5zaWdCeXRlcyAqIDg7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmdcblx0ICAgICAgICAgICAgZGF0YVdvcmRzW25CaXRzTGVmdCA+Pj4gNV0gfD0gMHg4MCA8PCAoMjQgLSBuQml0c0xlZnQgJSAzMik7XG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTRdID0gTWF0aC5mbG9vcihuQml0c1RvdGFsIC8gMHgxMDAwMDAwMDApO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE1XSA9IG5CaXRzVG90YWw7XG5cdCAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSBkYXRhV29yZHMubGVuZ3RoICogNDtcblxuXHQgICAgICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIGZpbmFsIGNvbXB1dGVkIGhhc2hcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhc2g7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICBjbG9uZS5faGFzaCA9IHRoaXMuX2hhc2guY2xvbmUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEExKCdtZXNzYWdlJyk7XG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5TSEExKHdvcmRBcnJheSk7XG5cdCAgICAgKi9cblx0ICAgIEMuU0hBMSA9IEhhc2hlci5fY3JlYXRlSGVscGVyKFNIQTEpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gaGFzaC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30ga2V5IFRoZSBzZWNyZXQga2V5LlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIEhNQUMuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBobWFjID0gQ3J5cHRvSlMuSG1hY1NIQTEobWVzc2FnZSwga2V5KTtcblx0ICAgICAqL1xuXHQgICAgQy5IbWFjU0hBMSA9IEhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihTSEExKTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5TSEExO1xuXG59KSk7IiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGA6cm9vdCB7XG4gIC0tYmxhY2stYTE6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XG4gIC0tYmxhY2stYTI6IHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgLS1ibGFjay1hMzogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgLS1ibGFjay1hNDogcmdiYSgwLCAwLCAwLCAwLjIpO1xuICAtLWJsYWNrLWE1OiByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gIC0tYmxhY2stYTY6IHJnYmEoMCwgMCwgMCwgMC40KTtcbiAgLS1ibGFjay1hNzogcmdiYSgwLCAwLCAwLCAwLjUpO1xuICAtLWJsYWNrLWE4OiByZ2JhKDAsIDAsIDAsIDAuNik7XG4gIC0tYmxhY2stYTk6IHJnYmEoMCwgMCwgMCwgMC43KTtcbiAgLS1ibGFjay1hMTA6IHJnYmEoMCwgMCwgMCwgMC44KTtcbiAgLS1ibGFjay1hMTE6IHJnYmEoMCwgMCwgMCwgMC45KTtcbiAgLS1ibGFjay1hMTI6IHJnYmEoMCwgMCwgMCwgMC45NSk7XG59XG5cbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yKGRpc3BsYXktcDMgMSAxIDEpKSB7XG4gIEBtZWRpYSAoY29sb3ItZ2FtdXQ6IHAzKSB7XG4gICAgOnJvb3Qge1xuICAgICAgLS1ibGFjay1hMTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMDUpO1xuICAgICAgLS1ibGFjay1hMjogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMSk7XG4gICAgICAtLWJsYWNrLWEzOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4xNSk7XG4gICAgICAtLWJsYWNrLWE0OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4yKTtcbiAgICAgIC0tYmxhY2stYTU6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjMpO1xuICAgICAgLS1ibGFjay1hNjogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuNCk7XG4gICAgICAtLWJsYWNrLWE3OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC41KTtcbiAgICAgIC0tYmxhY2stYTg6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjYpO1xuICAgICAgLS1ibGFjay1hOTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuNyk7XG4gICAgICAtLWJsYWNrLWExMDogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuOCk7XG4gICAgICAtLWJsYWNrLWExMTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuOSk7XG4gICAgICAtLWJsYWNrLWExMjogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuOTUpO1xuICAgIH1cbiAgfVxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvYmxhY2stYWxwaGEuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0UsK0JBQStCO0VBQy9CLDhCQUE4QjtFQUM5QiwrQkFBK0I7RUFDL0IsOEJBQThCO0VBQzlCLDhCQUE4QjtFQUM5Qiw4QkFBOEI7RUFDOUIsOEJBQThCO0VBQzlCLDhCQUE4QjtFQUM5Qiw4QkFBOEI7RUFDOUIsK0JBQStCO0VBQy9CLCtCQUErQjtFQUMvQixnQ0FBZ0M7QUFDbEM7O0FBRUE7RUFDRTtJQUNFO01BQ0UsMENBQTBDO01BQzFDLHlDQUF5QztNQUN6QywwQ0FBMEM7TUFDMUMseUNBQXlDO01BQ3pDLHlDQUF5QztNQUN6Qyx5Q0FBeUM7TUFDekMseUNBQXlDO01BQ3pDLHlDQUF5QztNQUN6Qyx5Q0FBeUM7TUFDekMsMENBQTBDO01BQzFDLDBDQUEwQztNQUMxQywyQ0FBMkM7SUFDN0M7RUFDRjtBQUNGXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290IHtcXG4gIC0tYmxhY2stYTE6IHJnYmEoMCwgMCwgMCwgMC4wNSk7XFxuICAtLWJsYWNrLWEyOiByZ2JhKDAsIDAsIDAsIDAuMSk7XFxuICAtLWJsYWNrLWEzOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xcbiAgLS1ibGFjay1hNDogcmdiYSgwLCAwLCAwLCAwLjIpO1xcbiAgLS1ibGFjay1hNTogcmdiYSgwLCAwLCAwLCAwLjMpO1xcbiAgLS1ibGFjay1hNjogcmdiYSgwLCAwLCAwLCAwLjQpO1xcbiAgLS1ibGFjay1hNzogcmdiYSgwLCAwLCAwLCAwLjUpO1xcbiAgLS1ibGFjay1hODogcmdiYSgwLCAwLCAwLCAwLjYpO1xcbiAgLS1ibGFjay1hOTogcmdiYSgwLCAwLCAwLCAwLjcpO1xcbiAgLS1ibGFjay1hMTA6IHJnYmEoMCwgMCwgMCwgMC44KTtcXG4gIC0tYmxhY2stYTExOiByZ2JhKDAsIDAsIDAsIDAuOSk7XFxuICAtLWJsYWNrLWExMjogcmdiYSgwLCAwLCAwLCAwLjk1KTtcXG59XFxuXFxuQHN1cHBvcnRzIChjb2xvcjogY29sb3IoZGlzcGxheS1wMyAxIDEgMSkpIHtcXG4gIEBtZWRpYSAoY29sb3ItZ2FtdXQ6IHAzKSB7XFxuICAgIDpyb290IHtcXG4gICAgICAtLWJsYWNrLWExOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4wNSk7XFxuICAgICAgLS1ibGFjay1hMjogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMSk7XFxuICAgICAgLS1ibGFjay1hMzogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMTUpO1xcbiAgICAgIC0tYmxhY2stYTQ6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjIpO1xcbiAgICAgIC0tYmxhY2stYTU6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjMpO1xcbiAgICAgIC0tYmxhY2stYTY6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjQpO1xcbiAgICAgIC0tYmxhY2stYTc6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjUpO1xcbiAgICAgIC0tYmxhY2stYTg6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjYpO1xcbiAgICAgIC0tYmxhY2stYTk6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjcpO1xcbiAgICAgIC0tYmxhY2stYTEwOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC44KTtcXG4gICAgICAtLWJsYWNrLWExMTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuOSk7XFxuICAgICAgLS1ibGFjay1hMTI6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjk1KTtcXG4gICAgfVxcbiAgfVxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xuICAtLW1hdXZlLTE6ICNmZGZjZmQ7XG4gIC0tbWF1dmUtMjogI2ZhZjlmYjtcbiAgLS1tYXV2ZS0zOiAjZjJlZmYzO1xuICAtLW1hdXZlLTQ6ICNlYWU3ZWM7XG4gIC0tbWF1dmUtNTogI2UzZGZlNjtcbiAgLS1tYXV2ZS02OiAjZGJkOGUwO1xuICAtLW1hdXZlLTc6ICNkMGNkZDc7XG4gIC0tbWF1dmUtODogI2JjYmFjNztcbiAgLS1tYXV2ZS05OiAjOGU4Yzk5O1xuICAtLW1hdXZlLTEwOiAjODQ4MjhlO1xuICAtLW1hdXZlLTExOiAjNjU2MzZkO1xuICAtLW1hdXZlLTEyOiAjMjExZjI2O1xufVxuXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSkge1xuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xuICAgIDpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XG4gICAgICAtLW1hdXZlLTE6IGNvbG9yKGRpc3BsYXktcDMgMC45OTEgMC45ODggMC45OTIpO1xuICAgICAgLS1tYXV2ZS0yOiBjb2xvcihkaXNwbGF5LXAzIDAuOTggMC45NzYgMC45ODQpO1xuICAgICAgLS1tYXV2ZS0zOiBjb2xvcihkaXNwbGF5LXAzIDAuOTQ2IDAuOTM4IDAuOTUyKTtcbiAgICAgIC0tbWF1dmUtNDogY29sb3IoZGlzcGxheS1wMyAwLjkxNSAwLjkwNiAwLjkyNSk7XG4gICAgICAtLW1hdXZlLTU6IGNvbG9yKGRpc3BsYXktcDMgMC44ODYgMC44NzYgMC45MDEpO1xuICAgICAgLS1tYXV2ZS02OiBjb2xvcihkaXNwbGF5LXAzIDAuODU2IDAuODQ2IDAuODc1KTtcbiAgICAgIC0tbWF1dmUtNzogY29sb3IoZGlzcGxheS1wMyAwLjgxNCAwLjgwNCAwLjg0KTtcbiAgICAgIC0tbWF1dmUtODogY29sb3IoZGlzcGxheS1wMyAwLjczNSAwLjcyOCAwLjc3Nyk7XG4gICAgICAtLW1hdXZlLTk6IGNvbG9yKGRpc3BsYXktcDMgMC41NTUgMC41NDkgMC41OTYpO1xuICAgICAgLS1tYXV2ZS0xMDogY29sb3IoZGlzcGxheS1wMyAwLjUxNCAwLjUwOCAwLjU1Mik7XG4gICAgICAtLW1hdXZlLTExOiBjb2xvcihkaXNwbGF5LXAzIDAuMzk1IDAuMzg4IDAuNDI0KTtcbiAgICAgIC0tbWF1dmUtMTI6IGNvbG9yKGRpc3BsYXktcDMgMC4xMjggMC4xMjIgMC4xNDcpO1xuICAgIH1cbiAgfVxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvbWF1dmUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0Usa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRTtJQUNFO01BQ0UsOENBQThDO01BQzlDLDZDQUE2QztNQUM3Qyw4Q0FBOEM7TUFDOUMsOENBQThDO01BQzlDLDhDQUE4QztNQUM5Qyw4Q0FBOEM7TUFDOUMsNkNBQTZDO01BQzdDLDhDQUE4QztNQUM5Qyw4Q0FBOEM7TUFDOUMsK0NBQStDO01BQy9DLCtDQUErQztNQUMvQywrQ0FBK0M7SUFDakQ7RUFDRjtBQUNGXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XFxuICAtLW1hdXZlLTE6ICNmZGZjZmQ7XFxuICAtLW1hdXZlLTI6ICNmYWY5ZmI7XFxuICAtLW1hdXZlLTM6ICNmMmVmZjM7XFxuICAtLW1hdXZlLTQ6ICNlYWU3ZWM7XFxuICAtLW1hdXZlLTU6ICNlM2RmZTY7XFxuICAtLW1hdXZlLTY6ICNkYmQ4ZTA7XFxuICAtLW1hdXZlLTc6ICNkMGNkZDc7XFxuICAtLW1hdXZlLTg6ICNiY2JhYzc7XFxuICAtLW1hdXZlLTk6ICM4ZThjOTk7XFxuICAtLW1hdXZlLTEwOiAjODQ4MjhlO1xcbiAgLS1tYXV2ZS0xMTogIzY1NjM2ZDtcXG4gIC0tbWF1dmUtMTI6ICMyMTFmMjY7XFxufVxcblxcbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yKGRpc3BsYXktcDMgMSAxIDEpKSB7XFxuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xcbiAgICA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xcbiAgICAgIC0tbWF1dmUtMTogY29sb3IoZGlzcGxheS1wMyAwLjk5MSAwLjk4OCAwLjk5Mik7XFxuICAgICAgLS1tYXV2ZS0yOiBjb2xvcihkaXNwbGF5LXAzIDAuOTggMC45NzYgMC45ODQpO1xcbiAgICAgIC0tbWF1dmUtMzogY29sb3IoZGlzcGxheS1wMyAwLjk0NiAwLjkzOCAwLjk1Mik7XFxuICAgICAgLS1tYXV2ZS00OiBjb2xvcihkaXNwbGF5LXAzIDAuOTE1IDAuOTA2IDAuOTI1KTtcXG4gICAgICAtLW1hdXZlLTU6IGNvbG9yKGRpc3BsYXktcDMgMC44ODYgMC44NzYgMC45MDEpO1xcbiAgICAgIC0tbWF1dmUtNjogY29sb3IoZGlzcGxheS1wMyAwLjg1NiAwLjg0NiAwLjg3NSk7XFxuICAgICAgLS1tYXV2ZS03OiBjb2xvcihkaXNwbGF5LXAzIDAuODE0IDAuODA0IDAuODQpO1xcbiAgICAgIC0tbWF1dmUtODogY29sb3IoZGlzcGxheS1wMyAwLjczNSAwLjcyOCAwLjc3Nyk7XFxuICAgICAgLS1tYXV2ZS05OiBjb2xvcihkaXNwbGF5LXAzIDAuNTU1IDAuNTQ5IDAuNTk2KTtcXG4gICAgICAtLW1hdXZlLTEwOiBjb2xvcihkaXNwbGF5LXAzIDAuNTE0IDAuNTA4IDAuNTUyKTtcXG4gICAgICAtLW1hdXZlLTExOiBjb2xvcihkaXNwbGF5LXAzIDAuMzk1IDAuMzg4IDAuNDI0KTtcXG4gICAgICAtLW1hdXZlLTEyOiBjb2xvcihkaXNwbGF5LXAzIDAuMTI4IDAuMTIyIDAuMTQ3KTtcXG4gICAgfVxcbiAgfVxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xuICAtLXZpb2xldC0xOiAjZmRmY2ZlO1xuICAtLXZpb2xldC0yOiAjZmFmOGZmO1xuICAtLXZpb2xldC0zOiAjZjRmMGZlO1xuICAtLXZpb2xldC00OiAjZWJlNGZmO1xuICAtLXZpb2xldC01OiAjZTFkOWZmO1xuICAtLXZpb2xldC02OiAjZDRjYWZlO1xuICAtLXZpb2xldC03OiAjYzJiNWY1O1xuICAtLXZpb2xldC04OiAjYWE5OWVjO1xuICAtLXZpb2xldC05OiAjNmU1NmNmO1xuICAtLXZpb2xldC0xMDogIzY1NGRjNDtcbiAgLS12aW9sZXQtMTE6ICM2NTUwYjk7XG4gIC0tdmlvbGV0LTEyOiAjMmYyNjVmO1xufVxuXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSkge1xuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xuICAgIDpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XG4gICAgICAtLXZpb2xldC0xOiBjb2xvcihkaXNwbGF5LXAzIDAuOTkxIDAuOTg4IDAuOTk1KTtcbiAgICAgIC0tdmlvbGV0LTI6IGNvbG9yKGRpc3BsYXktcDMgMC45NzggMC45NzQgMC45OTgpO1xuICAgICAgLS12aW9sZXQtMzogY29sb3IoZGlzcGxheS1wMyAwLjk1MyAwLjk0MyAwLjk5Myk7XG4gICAgICAtLXZpb2xldC00OiBjb2xvcihkaXNwbGF5LXAzIDAuOTE2IDAuODk3IDEpO1xuICAgICAgLS12aW9sZXQtNTogY29sb3IoZGlzcGxheS1wMyAwLjg3NiAwLjg1MSAxKTtcbiAgICAgIC0tdmlvbGV0LTY6IGNvbG9yKGRpc3BsYXktcDMgMC44MjUgMC43OTMgMC45ODEpO1xuICAgICAgLS12aW9sZXQtNzogY29sb3IoZGlzcGxheS1wMyAwLjc1MiAwLjcxMiAwLjk0Myk7XG4gICAgICAtLXZpb2xldC04OiBjb2xvcihkaXNwbGF5LXAzIDAuNjU0IDAuNjAyIDAuOTAyKTtcbiAgICAgIC0tdmlvbGV0LTk6IGNvbG9yKGRpc3BsYXktcDMgMC40MTcgMC4zNDEgMC43ODQpO1xuICAgICAgLS12aW9sZXQtMTA6IGNvbG9yKGRpc3BsYXktcDMgMC4zODEgMC4zMDYgMC43NDEpO1xuICAgICAgLS12aW9sZXQtMTE6IGNvbG9yKGRpc3BsYXktcDMgMC4zODMgMC4zMTcgMC43MDIpO1xuICAgICAgLS12aW9sZXQtMTI6IGNvbG9yKGRpc3BsYXktcDMgMC4xNzkgMC4xNSAwLjM1OSk7XG4gICAgfVxuICB9XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy92aW9sZXQuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0UsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsb0JBQW9CO0VBQ3BCLG9CQUFvQjtFQUNwQixvQkFBb0I7QUFDdEI7O0FBRUE7RUFDRTtJQUNFO01BQ0UsK0NBQStDO01BQy9DLCtDQUErQztNQUMvQywrQ0FBK0M7TUFDL0MsMkNBQTJDO01BQzNDLDJDQUEyQztNQUMzQywrQ0FBK0M7TUFDL0MsK0NBQStDO01BQy9DLCtDQUErQztNQUMvQywrQ0FBK0M7TUFDL0MsZ0RBQWdEO01BQ2hELGdEQUFnRDtNQUNoRCwrQ0FBK0M7SUFDakQ7RUFDRjtBQUNGXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290LCAubGlnaHQsIC5saWdodC10aGVtZSB7XFxuICAtLXZpb2xldC0xOiAjZmRmY2ZlO1xcbiAgLS12aW9sZXQtMjogI2ZhZjhmZjtcXG4gIC0tdmlvbGV0LTM6ICNmNGYwZmU7XFxuICAtLXZpb2xldC00OiAjZWJlNGZmO1xcbiAgLS12aW9sZXQtNTogI2UxZDlmZjtcXG4gIC0tdmlvbGV0LTY6ICNkNGNhZmU7XFxuICAtLXZpb2xldC03OiAjYzJiNWY1O1xcbiAgLS12aW9sZXQtODogI2FhOTllYztcXG4gIC0tdmlvbGV0LTk6ICM2ZTU2Y2Y7XFxuICAtLXZpb2xldC0xMDogIzY1NGRjNDtcXG4gIC0tdmlvbGV0LTExOiAjNjU1MGI5O1xcbiAgLS12aW9sZXQtMTI6ICMyZjI2NWY7XFxufVxcblxcbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yKGRpc3BsYXktcDMgMSAxIDEpKSB7XFxuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xcbiAgICA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xcbiAgICAgIC0tdmlvbGV0LTE6IGNvbG9yKGRpc3BsYXktcDMgMC45OTEgMC45ODggMC45OTUpO1xcbiAgICAgIC0tdmlvbGV0LTI6IGNvbG9yKGRpc3BsYXktcDMgMC45NzggMC45NzQgMC45OTgpO1xcbiAgICAgIC0tdmlvbGV0LTM6IGNvbG9yKGRpc3BsYXktcDMgMC45NTMgMC45NDMgMC45OTMpO1xcbiAgICAgIC0tdmlvbGV0LTQ6IGNvbG9yKGRpc3BsYXktcDMgMC45MTYgMC44OTcgMSk7XFxuICAgICAgLS12aW9sZXQtNTogY29sb3IoZGlzcGxheS1wMyAwLjg3NiAwLjg1MSAxKTtcXG4gICAgICAtLXZpb2xldC02OiBjb2xvcihkaXNwbGF5LXAzIDAuODI1IDAuNzkzIDAuOTgxKTtcXG4gICAgICAtLXZpb2xldC03OiBjb2xvcihkaXNwbGF5LXAzIDAuNzUyIDAuNzEyIDAuOTQzKTtcXG4gICAgICAtLXZpb2xldC04OiBjb2xvcihkaXNwbGF5LXAzIDAuNjU0IDAuNjAyIDAuOTAyKTtcXG4gICAgICAtLXZpb2xldC05OiBjb2xvcihkaXNwbGF5LXAzIDAuNDE3IDAuMzQxIDAuNzg0KTtcXG4gICAgICAtLXZpb2xldC0xMDogY29sb3IoZGlzcGxheS1wMyAwLjM4MSAwLjMwNiAwLjc0MSk7XFxuICAgICAgLS12aW9sZXQtMTE6IGNvbG9yKGRpc3BsYXktcDMgMC4zODMgMC4zMTcgMC43MDIpO1xcbiAgICAgIC0tdmlvbGV0LTEyOiBjb2xvcihkaXNwbGF5LXAzIDAuMTc5IDAuMTUgMC4zNTkpO1xcbiAgICB9XFxuICB9XFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYEBjaGFyc2V0IFwiVVRGLThcIjtcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb246OmJlZm9yZSB7XG4gIGJvcmRlci1jb2xvcjogI2NjYztcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXdpZHRoOiAzcHggM3B4IDAgMDtcbiAgY29udGVudDogXCJcIjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGhlaWdodDogOXB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNnB4O1xuICB3aWR0aDogOXB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXItd3JhcHBlciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcGFkZGluZzogMDtcbiAgYm9yZGVyOiAwO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlciB7XG4gIGZvbnQtZmFtaWx5OiBcIkhlbHZldGljYSBOZXVlXCIsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMC44cmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjb2xvcjogIzAwMDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2FlYWVhZTtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbGluZS1oZWlnaHQ6IGluaXRpYWw7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyLS10aW1lLW9ubHkgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIHtcbiAgYm9yZGVyLWxlZnQ6IDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5IC5yZWFjdC1kYXRlcGlja2VyX190aW1lLFxuLnJlYWN0LWRhdGVwaWNrZXItLXRpbWUtb25seSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3gge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwLjNyZW07XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlciB7XG4gIHotaW5kZXg6IDE7XG4gIGxpbmUtaGVpZ2h0OiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXItcG9wcGVyIC5yZWFjdC1kYXRlcGlja2VyX190cmlhbmdsZSB7XG4gIHN0cm9rZTogI2FlYWVhZTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlcltkYXRhLXBsYWNlbWVudF49Ym90dG9tXSAucmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGUge1xuICBmaWxsOiAjZjBmMGYwO1xuICBjb2xvcjogI2YwZjBmMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlcltkYXRhLXBsYWNlbWVudF49dG9wXSAucmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGUge1xuICBmaWxsOiAjZmZmO1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlciB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNhZWFlYWU7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuM3JlbTtcbiAgcGFkZGluZzogOHB4IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWUge1xuICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgcGFkZGluZy1yaWdodDogNXB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZS0tb25seSkge1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlcjpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0taGFzLXRpbWUtc2VsZWN0KSB7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwLjNyZW07XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2VsZWN0LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLWNvbnRhaW5lci0tc2VsZWN0LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tY29udGFpbmVyLS1zZWxlY3QsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi1jb250YWluZXItLXNjcm9sbCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi1jb250YWluZXItLXNjcm9sbCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2Nyb2xsIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW46IDAgMTVweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgsXG4ucmVhY3QtZGF0ZXBpY2tlci10aW1lX19oZWFkZXIsXG4ucmVhY3QtZGF0ZXBpY2tlci15ZWFyLWhlYWRlciB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIGNvbG9yOiAjMDAwO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZm9udC1zaXplOiAwLjk0NHJlbTtcbn1cblxuaDIucmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aCB7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyIHtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMnB4O1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG4gIHotaW5kZXg6IDE7XG4gIGhlaWdodDogMzJweDtcbiAgd2lkdGg6IDMycHg7XG4gIHRleHQtaW5kZW50OiAtOTk5ZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tcHJldmlvdXMge1xuICBsZWZ0OiAycHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dCB7XG4gIHJpZ2h0OiAycHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10aW1lOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10b2RheS1idXR0b24pIHtcbiAgcmlnaHQ6IDg1cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogMDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMge1xuICB0b3A6IDRweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyB7XG4gIHRvcDogLTRweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uOmhvdmVyICo6OmJlZm9yZSB7XG4gIGJvcmRlci1jb2xvcjogI2E2YTZhNjtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAtMXB4O1xuICBmb250LXNpemU6IDIwcHg7XG4gIHdpZHRoOiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tbmV4dCB7XG4gIGxlZnQ6IC0ycHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1uZXh0OjpiZWZvcmUge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4gIGxlZnQ6IC03cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1wcmV2aW91cyB7XG4gIHJpZ2h0OiAtMnB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tcHJldmlvdXM6OmJlZm9yZSB7XG4gIHRyYW5zZm9ybTogcm90YXRlKDIyNWRlZyk7XG4gIHJpZ2h0OiAtN3B4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtY29udGFpbmVyIHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyIHtcbiAgbWFyZ2luOiAwLjRyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXdyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIG1heC13aWR0aDogMTgwcHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogNHJlbTtcbiAgbWFyZ2luOiAycHg7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19tb250aCB7XG4gIG1hcmdpbjogMC40cmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGggLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGggLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDRyZW07XG4gIG1hcmdpbjogMnB4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIge1xuICBjbGVhcjogYm90aDtcbiAgd2lkdGg6IDEwMCU7XG4gIGZsb2F0OiBsZWZ0O1xuICBtYXJnaW46IDVweCAwIDEwcHggMTVweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19jYXB0aW9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dCB7XG4gIHdpZHRoOiBhdXRvO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dFt0eXBlPXRpbWVdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dFt0eXBlPXRpbWVdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICBtYXJnaW46IDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IGlucHV0W3R5cGU9dGltZV0ge1xuICAtbW96LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9fZGVsaW1pdGVyIHtcbiAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIge1xuICBmbG9hdDogcmlnaHQ7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2FlYWVhZTtcbiAgd2lkdGg6IDg1cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXItLXdpdGgtdG9kYXktYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYWVhZWFlO1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IC04N3B4O1xuICB0b3A6IDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB7XG4gIHdpZHRoOiA4NXB4O1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG4gIG1hcmdpbjogMCBhdXRvO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIG1hcmdpbjogMDtcbiAgaGVpZ2h0OiBjYWxjKDE5NXB4ICsgMS43cmVtIC8gMik7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgcGFkZGluZy1yaWdodDogMDtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbSB7XG4gIGhlaWdodDogMzBweDtcbiAgcGFkZGluZzogNXB4IDEwcHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbTpob3ZlciB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1zZWxlY3RlZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLWRpc2FibGVkIHtcbiAgY29sb3I6ICNjY2M7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tZGlzYWJsZWQ6aG92ZXIge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXIge1xuICBjb2xvcjogI2NjYztcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMS43cmVtO1xuICBsaW5lLWhlaWdodDogMS43cmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG1hcmdpbjogMC4xNjZyZW07XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXIucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWNsaWNrYWJsZSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tY2xpY2thYmxlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZCk6aG92ZXIge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xuICBjb2xvcjogI2ZmZjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tc2VsZWN0ZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJhODdkMDtcbiAgY29sb3I6ICNmZmY7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lcyB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG1hcmdpbi1ib3R0b206IC04cHg7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lLFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLW5hbWUge1xuICBjb2xvcjogIzAwMDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMS43cmVtO1xuICBsaW5lLWhlaWdodDogMS43cmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG1hcmdpbjogMC4xNjZyZW07XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19kYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dCxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0IHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0OmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQ6aG92ZXIge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS10b2RheSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS10b2RheSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXRvZGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tdG9kYXkge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1oaWdobGlnaHRlZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNkY2M0YTtcbiAgY29sb3I6ICNmZmY7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzJiZTNmO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0xIHtcbiAgY29sb3I6IG1hZ2VudGE7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZC1jdXN0b20tMixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0yLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIge1xuICBjb2xvcjogZ3JlZW47XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5cyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5cyxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXMge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNjgwMztcbiAgY29sb3I6ICNmZmY7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5cyAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5cyAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXMgLm92ZXJsYXkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogMTAwJTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XG4gIGNvbG9yOiAjZmZmO1xuICBwYWRkaW5nOiA0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDBzLCBvcGFjaXR5IDAuM3MgZWFzZS1pbi1vdXQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5czpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5czpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXM6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2Y1MzAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5czpob3ZlciAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5IHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgb3BhY2l0eTogMTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xuICBjb2xvcjogI2ZmZjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkOmhvdmVyLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXNlbGVjdGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2U6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWtleWJvYXJkLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2JhZDlmMTtcbiAgY29sb3I6IHJnYigwLCAwLCAwKTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgzMywgMTA3LCAxNjUsIDAuNSk7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xuICBjb2xvcjogIzAwMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tZGlzYWJsZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1kaXNhYmxlZCB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgY29sb3I6ICNjY2M7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tZGlzYWJsZWQgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1kaXNhYmxlZCAub3ZlcmxheSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiA3MCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xuICBjb2xvcjogI2ZmZjtcbiAgcGFkZGluZzogNHB4O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwcywgb3BhY2l0eSAwLjNzIGVhc2UtaW4tb3V0O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fY2FsZW5kYXItaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcGFkZGluZzogMC41cmVtO1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3ZpZXctY2FsZW5kYXItaWNvbiBpbnB1dCB7XG4gIHBhZGRpbmc6IDZweCAxMHB4IDVweCAyNXB4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXcsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3IHtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3OmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldzpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93IHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2IzYjNiMztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3cge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpO1xuICByaWdodDogLTE2cHg7XG4gIHRvcDogMDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24sXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24sXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93biB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDUwJTtcbiAgbGVmdDogMjUlO1xuICB0b3A6IDMwcHg7XG4gIHotaW5kZXg6IDE7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYWVhZWFlO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd246aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd246aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bjpob3ZlciB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLS1zY3JvbGxhYmxlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLS1zY3JvbGxhYmxlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tLXNjcm9sbGFibGUge1xuICBoZWlnaHQ6IDE1MHB4O1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24sXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb24ge1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmZpcnN0LW9mLXR5cGUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmZpcnN0LW9mLXR5cGUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246Zmlyc3Qtb2YtdHlwZSB7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuM3JlbTtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDAuM3JlbTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpsYXN0LW9mLXR5cGUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmxhc3Qtb2YtdHlwZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpsYXN0LW9mLXR5cGUge1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMC4zcmVtO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nIHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2IzYjNiMztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy1wcmV2aW91cyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMge1xuICBib3JkZXItdG9wLWNvbG9yOiAjYjNiM2IzO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24tLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uLS1zZWxlY3RlZCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMTVweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb24ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IDA7XG4gIG91dGxpbmU6IDA7XG4gIHBhZGRpbmc6IDAgNnB4IDAgMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiAwO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbjo6YWZ0ZXIge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XG4gIGNvbG9yOiAjZmZmO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGhlaWdodDogMTZweDtcbiAgd2lkdGg6IDE2cHg7XG4gIHBhZGRpbmc6IDJweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBjb250ZW50OiBcIsOXXCI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbi0tZGlzYWJsZWQge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbi0tZGlzYWJsZWQ6OmFmdGVyIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdG9kYXktYnV0dG9uIHtcbiAgYmFja2dyb3VuZDogI2YwZjBmMDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNhZWFlYWU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgcGFkZGluZzogNXB4IDA7XG4gIGNsZWFyOiBsZWZ0O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB3aWR0aDogMTAwdnc7XG4gIGhlaWdodDogMTAwdmg7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTtcbiAgbGVmdDogMDtcbiAgdG9wOiAwO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAgei1pbmRleDogMjE0NzQ4MzY0Nztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1uYW1lIHtcbiAgd2lkdGg6IDNyZW07XG4gIGxpbmUtaGVpZ2h0OiAzcmVtO1xufVxuQG1lZGlhIChtYXgtd2lkdGg6IDQwMHB4KSwgKG1heC1oZWlnaHQ6IDU1MHB4KSB7XG4gIC5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lLFxuICAucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXksXG4gIC5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbmFtZSB7XG4gICAgd2lkdGg6IDJyZW07XG4gICAgbGluZS1oZWlnaHQ6IDJyZW07XG4gIH1cbn1cbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlciB7XG4gIGZvbnQtc2l6ZTogMS40NHJlbTtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2NoaWxkcmVuLWNvbnRhaW5lciB7XG4gIHdpZHRoOiAxMy44cmVtO1xuICBtYXJnaW46IDAuNHJlbTtcbiAgcGFkZGluZy1yaWdodDogMC4ycmVtO1xuICBwYWRkaW5nLWxlZnQ6IDAuMnJlbTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fYXJpYS1saXZlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBjbGlwLXBhdGg6IGNpcmNsZSgwKTtcbiAgYm9yZGVyOiAwO1xuICBoZWlnaHQ6IDFweDtcbiAgbWFyZ2luOiAtMXB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwYWRkaW5nOiAwO1xuICB3aWR0aDogMXB4O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2FsZW5kYXItaWNvbiB7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTI1ZW07XG59XG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL2Rpc3QvcmVhY3QtZGF0ZXBpY2tlci5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsZ0JBQWdCO0FBQ2hCOzs7RUFHRSxrQkFBa0I7RUFDbEIsbUJBQW1CO0VBQ25CLHlCQUF5QjtFQUN6QixXQUFXO0VBQ1gsY0FBYztFQUNkLFdBQVc7RUFDWCxrQkFBa0I7RUFDbEIsUUFBUTtFQUNSLFVBQVU7QUFDWjtBQUNBO0VBQ0UscUJBQXFCO0VBQ3JCLFVBQVU7RUFDVixTQUFTO0FBQ1g7O0FBRUE7RUFDRSwyREFBMkQ7RUFDM0QsaUJBQWlCO0VBQ2pCLHNCQUFzQjtFQUN0QixXQUFXO0VBQ1gseUJBQXlCO0VBQ3pCLHFCQUFxQjtFQUNyQixxQkFBcUI7RUFDckIsa0JBQWtCO0VBQ2xCLG9CQUFvQjtBQUN0Qjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7QUFDQTs7RUFFRSxpQ0FBaUM7RUFDakMsa0NBQWtDO0FBQ3BDOztBQUVBO0VBQ0UsVUFBVTtFQUNWLGNBQWM7QUFDaEI7QUFDQTtFQUNFLGVBQWU7QUFDakI7QUFDQTtFQUNFLGFBQWE7RUFDYixjQUFjO0FBQ2hCO0FBQ0E7RUFDRSxVQUFVO0VBQ1YsV0FBVztBQUNiOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLHlCQUF5QjtFQUN6QixnQ0FBZ0M7RUFDaEMsOEJBQThCO0VBQzlCLGNBQWM7RUFDZCxrQkFBa0I7QUFDcEI7QUFDQTtFQUNFLG1CQUFtQjtFQUNuQixp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OztFQUdFLFdBQVc7RUFDWCxpQkFBaUI7QUFDbkI7QUFDQTtFQUNFOzs7SUFHRSxXQUFXO0lBQ1gsaUJBQWlCO0VBQ25CO0FBQ0Y7QUFDQTs7RUFFRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxjQUFjO0VBQ2QsY0FBYztFQUNkLHFCQUFxQjtFQUNyQixvQkFBb0I7RUFDcEIsWUFBWTtBQUNkOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLG9CQUFvQjtFQUNwQixTQUFTO0VBQ1QsV0FBVztFQUNYLFlBQVk7RUFDWixnQkFBZ0I7RUFDaEIsVUFBVTtFQUNWLFVBQVU7RUFDVixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxVQUFVO0VBQ1YsV0FBVztFQUNYLHdCQUF3QjtBQUMxQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdywgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbjo6YmVmb3JlIHtcXG4gIGJvcmRlci1jb2xvcjogI2NjYztcXG4gIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICBib3JkZXItd2lkdGg6IDNweCAzcHggMCAwO1xcbiAgY29udGVudDogXFxcIlxcXCI7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIGhlaWdodDogOXB4O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiA2cHg7XFxuICB3aWR0aDogOXB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlci13cmFwcGVyIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHBhZGRpbmc6IDA7XFxuICBib3JkZXI6IDA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyIHtcXG4gIGZvbnQtZmFtaWx5OiBcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiAwLjhyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgY29sb3I6ICMwMDA7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjYWVhZWFlO1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgbGluZS1oZWlnaHQ6IGluaXRpYWw7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyLS10aW1lLW9ubHkgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIHtcXG4gIGJvcmRlci1sZWZ0OiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5IC5yZWFjdC1kYXRlcGlja2VyX190aW1lLFxcbi5yZWFjdC1kYXRlcGlja2VyLS10aW1lLW9ubHkgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHtcXG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAuM3JlbTtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlciB7XFxuICB6LWluZGV4OiAxO1xcbiAgbGluZS1oZWlnaHQ6IDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlciAucmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGUge1xcbiAgc3Ryb2tlOiAjYWVhZWFlO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXJbZGF0YS1wbGFjZW1lbnRePWJvdHRvbV0gLnJlYWN0LWRhdGVwaWNrZXJfX3RyaWFuZ2xlIHtcXG4gIGZpbGw6ICNmMGYwZjA7XFxuICBjb2xvcjogI2YwZjBmMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXItcG9wcGVyW2RhdGEtcGxhY2VtZW50Xj10b3BdIC5yZWFjdC1kYXRlcGlja2VyX190cmlhbmdsZSB7XFxuICBmaWxsOiAjZmZmO1xcbiAgY29sb3I6ICNmZmY7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXIge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWVhZWFlO1xcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMC4zcmVtO1xcbiAgcGFkZGluZzogOHB4IDA7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWUge1xcbiAgcGFkZGluZy1ib3R0b206IDhweDtcXG4gIHBhZGRpbmctbGVmdDogNXB4O1xcbiAgcGFkZGluZy1yaWdodDogNXB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lLS1vbmx5KSB7XFxuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS1oYXMtdGltZS1zZWxlY3QpIHtcXG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwLjNyZW07XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2VsZWN0LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi1jb250YWluZXItLXNlbGVjdCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXItLXNlbGVjdCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi1jb250YWluZXItLXNjcm9sbCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tY29udGFpbmVyLS1zY3JvbGwsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tY29udGFpbmVyLS1zY3JvbGwge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgbWFyZ2luOiAwIDE1cHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLFxcbi5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlcixcXG4ucmVhY3QtZGF0ZXBpY2tlci15ZWFyLWhlYWRlciB7XFxuICBtYXJnaW4tdG9wOiAwO1xcbiAgY29sb3I6ICMwMDA7XFxuICBmb250LXdlaWdodDogYm9sZDtcXG4gIGZvbnQtc2l6ZTogMC45NDRyZW07XFxufVxcblxcbmgyLnJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgge1xcbiAgcGFkZGluZzogMDtcXG4gIG1hcmdpbjogMDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyIHtcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uIHtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAycHg7XFxuICBwYWRkaW5nOiAwO1xcbiAgYm9yZGVyOiBub25lO1xcbiAgei1pbmRleDogMTtcXG4gIGhlaWdodDogMzJweDtcXG4gIHdpZHRoOiAzMnB4O1xcbiAgdGV4dC1pbmRlbnQ6IC05OTllbTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1wcmV2aW91cyB7XFxuICBsZWZ0OiAycHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0IHtcXG4gIHJpZ2h0OiAycHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0LS13aXRoLXRpbWU6bm90KC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0LS13aXRoLXRvZGF5LWJ1dHRvbikge1xcbiAgcmlnaHQ6IDg1cHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycyB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB0b3A6IDA7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMge1xcbiAgdG9wOiA0cHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyB7XFxuICB0b3A6IC00cHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uOmhvdmVyICo6OmJlZm9yZSB7XFxuICBib3JkZXItY29sb3I6ICNhNmE2YTY7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24ge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgdG9wOiAtMXB4O1xcbiAgZm9udC1zaXplOiAyMHB4O1xcbiAgd2lkdGg6IDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLW5leHQge1xcbiAgbGVmdDogLTJweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tbmV4dDo6YmVmb3JlIHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcXG4gIGxlZnQ6IC03cHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLXByZXZpb3VzIHtcXG4gIHJpZ2h0OiAtMnB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1wcmV2aW91czo6YmVmb3JlIHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDIyNWRlZyk7XFxuICByaWdodDogLTdweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWNvbnRhaW5lciB7XFxuICBmbG9hdDogbGVmdDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXIge1xcbiAgbWFyZ2luOiAwLjRyZW07XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXdyYXBwZXIge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXgtd3JhcDogd3JhcDtcXG4gIG1heC13aWR0aDogMTgwcHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgd2lkdGg6IDRyZW07XFxuICBtYXJnaW46IDJweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoIHtcXG4gIG1hcmdpbjogMC40cmVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGggLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoIC5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgd2lkdGg6IDRyZW07XFxuICBtYXJnaW46IDJweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIHtcXG4gIGNsZWFyOiBib3RoO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBmbG9hdDogbGVmdDtcXG4gIG1hcmdpbjogNXB4IDAgMTBweCAxNXB4O1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2NhcHRpb24ge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBtYXJnaW4tbGVmdDogMTBweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dCB7XFxuICB3aWR0aDogYXV0bztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dFt0eXBlPXRpbWVdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXRbdHlwZT10aW1lXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICBtYXJnaW46IDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXRbdHlwZT10aW1lXSB7XFxuICAtbW96LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19kZWxpbWl0ZXIge1xcbiAgbWFyZ2luLWxlZnQ6IDVweDtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIHtcXG4gIGZsb2F0OiByaWdodDtcXG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2FlYWVhZTtcXG4gIHdpZHRoOiA4NXB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXItLXdpdGgtdG9kYXktYnV0dG9uIHtcXG4gIGRpc3BsYXk6IGlubGluZTtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNhZWFlYWU7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICByaWdodDogLTg3cHg7XFxuICB0b3A6IDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3gge1xcbiAgd2lkdGg6IDg1cHg7XFxuICBvdmVyZmxvdy14OiBoaWRkZW47XFxuICBtYXJnaW46IDAgYXV0bztcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwLjNyZW07XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IHtcXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XFxuICBtYXJnaW46IDA7XFxuICBoZWlnaHQ6IGNhbGMoMTk1cHggKyAxLjdyZW0gLyAyKTtcXG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcXG4gIHBhZGRpbmctcmlnaHQ6IDA7XFxuICBwYWRkaW5nLWxlZnQ6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbSB7XFxuICBoZWlnaHQ6IDMwcHg7XFxuICBwYWRkaW5nOiA1cHggMTBweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtOmhvdmVyIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1zZWxlY3RlZCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xcbiAgY29sb3I6IHdoaXRlO1xcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1zZWxlY3RlZDpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tZGlzYWJsZWQge1xcbiAgY29sb3I6ICNjY2M7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1kaXNhYmxlZDpob3ZlciB7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyIHtcXG4gIGNvbG9yOiAjY2NjO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgd2lkdGg6IDEuN3JlbTtcXG4gIGxpbmUtaGVpZ2h0OiAxLjdyZW07XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBtYXJnaW46IDAuMTY2cmVtO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXIucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWNsaWNrYWJsZSB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tY2xpY2thYmxlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0ta2V5Ym9hcmQtc2VsZWN0ZWQpOmhvdmVyIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tc2VsZWN0ZWQge1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0ta2V5Ym9hcmQtc2VsZWN0ZWQge1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJhODdkMDtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZXMge1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIG1hcmdpbi1ib3R0b206IC04cHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrIHtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLW5hbWUge1xcbiAgY29sb3I6ICMwMDA7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogMS43cmVtO1xcbiAgbGluZS1oZWlnaHQ6IDEuN3JlbTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIG1hcmdpbjogMC4xNjZyZW07XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0IHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheTpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0OmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQ6aG92ZXIge1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tdG9kYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXRvZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXRvZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXRvZGF5IHtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQge1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzNkY2M0YTtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQ6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMyYmUzZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0xLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0xLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0xIHtcXG4gIGNvbG9yOiBtYWdlbnRhO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZC1jdXN0b20tMixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIge1xcbiAgY29sb3I6IGdyZWVuO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5cyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXMsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXMsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXMge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNjgwMztcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5cyAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXMgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXMgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXMgLm92ZXJsYXkge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm90dG9tOiAxMDAlO1xcbiAgbGVmdDogNTAlO1xcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcXG4gIGNvbG9yOiAjZmZmO1xcbiAgcGFkZGluZzogNHB4O1xcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcXG4gIG9wYWNpdHk6IDA7XFxuICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDBzLCBvcGFjaXR5IDAuM3MgZWFzZS1pbi1vdXQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1ob2xpZGF5czpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5czpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1ob2xpZGF5czpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2Y1MzAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5czpob3ZlciAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXM6aG92ZXIgLm92ZXJsYXkge1xcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gIG9wYWNpdHk6IDE7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tc2VsZWN0ZWQ6aG92ZXIsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZTpob3ZlciwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2U6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXNlbGVjdGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZTpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2U6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0ta2V5Ym9hcmQtc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNiYWQ5ZjE7XFxuICBjb2xvcjogcmdiKDAsIDAsIDApO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1rZXlib2FyZC1zZWxlY3RlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDMzLCAxMDcsIDE2NSwgMC41KTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLCAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XFxuICBjb2xvcjogIzAwMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIGNvbG9yOiAjY2NjO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tZGlzYWJsZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tZGlzYWJsZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWQ6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZCAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1kaXNhYmxlZCAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1kaXNhYmxlZCAub3ZlcmxheSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3R0b206IDcwJTtcXG4gIGxlZnQ6IDUwJTtcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XFxuICBjb2xvcjogI2ZmZjtcXG4gIHBhZGRpbmc6IDRweDtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICB2aXNpYmlsaXR5OiBoaWRkZW47XFxuICBvcGFjaXR5OiAwO1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwcywgb3BhY2l0eSAwLjNzIGVhc2UtaW4tb3V0O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtY29udGFpbmVyIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdpZHRoOiAxMDAlO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX19jYWxlbmRhci1pY29uIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHBhZGRpbmc6IDAuNXJlbTtcXG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdmlldy1jYWxlbmRhci1pY29uIGlucHV0IHtcXG4gIHBhZGRpbmc6IDZweCAxMHB4IDVweCAyNXB4O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXcsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXcge1xcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldzpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3OmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3cge1xcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2IzYjNiMztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3LS1kb3duLWFycm93IHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7XFxuICByaWdodDogLTE2cHg7XFxuICB0b3A6IDA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93biB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgd2lkdGg6IDUwJTtcXG4gIGxlZnQ6IDI1JTtcXG4gIHRvcDogMzBweDtcXG4gIHotaW5kZXg6IDE7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBib3JkZXI6IDFweCBzb2xpZCAjYWVhZWFlO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bjpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd246aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd246aG92ZXIge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi0tc2Nyb2xsYWJsZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tLXNjcm9sbGFibGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tLXNjcm9sbGFibGUge1xcbiAgaGVpZ2h0OiAxNTBweDtcXG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24sXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uIHtcXG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xcbiAgd2lkdGg6IDEwMCU7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246Zmlyc3Qtb2YtdHlwZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmZpcnN0LW9mLXR5cGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmZpcnN0LW9mLXR5cGUge1xcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMC4zcmVtO1xcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDAuM3JlbTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmxhc3Qtb2YtdHlwZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmxhc3Qtb2YtdHlwZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246bGFzdC1vZi10eXBlIHtcXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwLjNyZW07XFxuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nIHtcXG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiM2IzYjM7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy1wcmV2aW91cyB7XFxuICBib3JkZXItdG9wLWNvbG9yOiAjYjNiM2IzO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb24tLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24tLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbi0tc2VsZWN0ZWQge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgbGVmdDogMTVweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb24ge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICBib3JkZXI6IDA7XFxuICBvdXRsaW5lOiAwO1xcbiAgcGFkZGluZzogMCA2cHggMCAwO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgcmlnaHQ6IDA7XFxuICBoZWlnaHQ6IDEwMCU7XFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb246OmFmdGVyIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XFxuICBjb2xvcjogI2ZmZjtcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXG4gIGhlaWdodDogMTZweDtcXG4gIHdpZHRoOiAxNnB4O1xcbiAgcGFkZGluZzogMnB4O1xcbiAgZm9udC1zaXplOiAxMnB4O1xcbiAgbGluZS1oZWlnaHQ6IDE7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIGNvbnRlbnQ6IFxcXCLDl1xcXCI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uLS1kaXNhYmxlZCB7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uLS1kaXNhYmxlZDo6YWZ0ZXIge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYztcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RvZGF5LWJ1dHRvbiB7XFxuICBiYWNrZ3JvdW5kOiAjZjBmMGYwO1xcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNhZWFlYWU7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBmb250LXdlaWdodDogYm9sZDtcXG4gIHBhZGRpbmc6IDVweCAwO1xcbiAgY2xlYXI6IGxlZnQ7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwge1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgd2lkdGg6IDEwMHZ3O1xcbiAgaGVpZ2h0OiAxMDB2aDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTtcXG4gIGxlZnQ6IDA7XFxuICB0b3A6IDA7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgei1pbmRleDogMjE0NzQ4MzY0NztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbmFtZSB7XFxuICB3aWR0aDogM3JlbTtcXG4gIGxpbmUtaGVpZ2h0OiAzcmVtO1xcbn1cXG5AbWVkaWEgKG1heC13aWR0aDogNDAwcHgpLCAobWF4LWhlaWdodDogNTUwcHgpIHtcXG4gIC5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lLFxcbiAgLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxcbiAgLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1uYW1lIHtcXG4gICAgd2lkdGg6IDJyZW07XFxuICAgIGxpbmUtaGVpZ2h0OiAycmVtO1xcbiAgfVxcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLFxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyIHtcXG4gIGZvbnQtc2l6ZTogMS40NHJlbTtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2NoaWxkcmVuLWNvbnRhaW5lciB7XFxuICB3aWR0aDogMTMuOHJlbTtcXG4gIG1hcmdpbjogMC40cmVtO1xcbiAgcGFkZGluZy1yaWdodDogMC4ycmVtO1xcbiAgcGFkZGluZy1sZWZ0OiAwLjJyZW07XFxuICBoZWlnaHQ6IGF1dG87XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19hcmlhLWxpdmUge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgY2xpcC1wYXRoOiBjaXJjbGUoMCk7XFxuICBib3JkZXI6IDA7XFxuICBoZWlnaHQ6IDFweDtcXG4gIG1hcmdpbjogLTFweDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBwYWRkaW5nOiAwO1xcbiAgd2lkdGg6IDFweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19jYWxlbmRhci1pY29uIHtcXG4gIHdpZHRoOiAxZW07XFxuICBoZWlnaHQ6IDFlbTtcXG4gIHZlcnRpY2FsLWFsaWduOiAtMC4xMjVlbTtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPSUyNzI0JTI3IGhlaWdodD0lMjcyNCUyNyBzdHJva2U9JTI3JTIzMDAwJTI3IHZpZXdCb3g9JTI3MCAwIDI0IDI0JTI3IHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3JTNFJTNDc3R5bGUlM0Uuc3Bpbm5lcl9WOG0xJTdCdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7YW5pbWF0aW9uOnNwaW5uZXJfektvYSAycyBsaW5lYXIgaW5maW5pdGUlN0Quc3Bpbm5lcl9WOG0xIGNpcmNsZSU3QnN0cm9rZS1saW5lY2FwOnJvdW5kO2FuaW1hdGlvbjpzcGlubmVyX1lwWlMgMS41cyBlYXNlLW91dCBpbmZpbml0ZSU3RCU0MGtleWZyYW1lcyBzcGlubmVyX3pLb2ElN0IxMDAlMjUlN0J0cmFuc2Zvcm06cm90YXRlJTI4MzYwZGVnJTI5JTdEJTdEJTQwa2V5ZnJhbWVzIHNwaW5uZXJfWXBaUyU3QjAlMjUlN0JzdHJva2UtZGFzaGFycmF5OjAgMTUwO3N0cm9rZS1kYXNob2Zmc2V0OjAlN0Q0Ny41JTI1JTdCc3Ryb2tlLWRhc2hhcnJheTo0MiAxNTA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTE2JTdEOTUlMjUlMkMxMDAlMjUlN0JzdHJva2UtZGFzaGFycmF5OjQyIDE1MDtzdHJva2UtZGFzaG9mZnNldDotNTklN0QlN0QlM0MlMkZzdHlsZSUzRSUzQ2cgY2xhc3M9JTI3c3Bpbm5lcl9WOG0xJTI3JTNFJTNDY2lyY2xlIGN4PSUyNzEyJTI3IGN5PSUyNzEyJTI3IHI9JTI3OS41JTI3IGZpbGw9JTI3bm9uZSUyNyBzdHJva2Utd2lkdGg9JTI3MyUyNyUzRSUzQyUyRmNpcmNsZSUzRSUzQyUyRmclM0UlM0MlMkZzdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHhtbG5zOnhsaW5rPSUyN2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmslMjcgc3R5bGU9JTI3c2hhcGUtcmVuZGVyaW5nOiBhdXRvOyUyNyB3aWR0aD0lMjcyMDBweCUyNyBoZWlnaHQ9JTI3MjAwcHglMjcgdmlld0JveD0lMjcwIDAgMTAwIDEwMCUyNyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSUyN3hNaWRZTWlkJTI3JTNFJTNDcGF0aCBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlPSUyNyUyMzBhMGEwYSUyNyBzdHJva2Utd2lkdGg9JTI3MTAlMjcgc3Ryb2tlLWRhc2hhcnJheT0lMjcyMDUuMjcxMTQyNTc4MTI1IDUxLjMxNzc4NTY0NDUzMTI1NiUyNyBkPSUyN00yNC4zIDMwQzExLjQgMzAgNSA0My4zIDUgNTBzNi40IDIwIDE5LjMgMjBjMTkuMyAwIDMyLjEtNDAgNTEuNC00MCBDODguNiAzMCA5NSA0My4zIDk1IDUwcy02LjQgMjAtMTkuMyAyMEM1Ni40IDcwIDQzLjYgMzAgMjQuMyAzMHolMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcgc3R5bGU9JTI3dHJhbnNmb3JtOnNjYWxlJTI4MC44JTI5O3RyYW5zZm9ybS1vcmlnaW46NTBweCA1MHB4JTI3JTNFJTNDYW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSUyN3N0cm9rZS1kYXNob2Zmc2V0JTI3IHJlcGVhdENvdW50PSUyN2luZGVmaW5pdGUlMjcgZHVyPSUyNzJzJTI3IGtleVRpbWVzPSUyNzA7MSUyNyB2YWx1ZXM9JTI3MDsyNTYuNTg4OTI4MjIyNjU2MjUlMjclM0UlM0MvYW5pbWF0ZSUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBU0VsRVFWUjRuR05nd0FNa0pTVWJwS1NrT3ZDcElhVDVQeFNUYm9nVVFqTVlNd3hlSUlYbVZGSXhBOFVHRER5UUdnMERuSURpNkpLVWxDeEhNcUNlWkFPZ2hqU0FNRDVGQUtmZWFVUmRVRnhDQUFBQUFFbEZUa1N1UW1DQ1wiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAvKlxuISB0YWlsd2luZGNzcyB2My40LjEwIHwgTUlUIExpY2Vuc2UgfCBodHRwczovL3RhaWx3aW5kY3NzLmNvbVxuKi8vKlxuMS4gUHJldmVudCBwYWRkaW5nIGFuZCBib3JkZXIgZnJvbSBhZmZlY3RpbmcgZWxlbWVudCB3aWR0aC4gKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3pkZXZzL2Nzc3JlbWVkeS9pc3N1ZXMvNClcbjIuIEFsbG93IGFkZGluZyBhIGJvcmRlciB0byBhbiBlbGVtZW50IGJ5IGp1c3QgYWRkaW5nIGEgYm9yZGVyLXdpZHRoLiAoaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kY3NzL3RhaWx3aW5kY3NzL3B1bGwvMTE2KVxuKi9cblxuKixcbjo6YmVmb3JlLFxuOjphZnRlciB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8qIDEgKi9cbiAgYm9yZGVyLXdpZHRoOiAwOyAvKiAyICovXG4gIGJvcmRlci1zdHlsZTogc29saWQ7IC8qIDIgKi9cbiAgYm9yZGVyLWNvbG9yOiAjZTVlN2ViOyAvKiAyICovXG59XG5cbjo6YmVmb3JlLFxuOjphZnRlciB7XG4gIC0tdHctY29udGVudDogJyc7XG59XG5cbi8qXG4xLiBVc2UgYSBjb25zaXN0ZW50IHNlbnNpYmxlIGxpbmUtaGVpZ2h0IGluIGFsbCBicm93c2Vycy5cbjIuIFByZXZlbnQgYWRqdXN0bWVudHMgb2YgZm9udCBzaXplIGFmdGVyIG9yaWVudGF0aW9uIGNoYW5nZXMgaW4gaU9TLlxuMy4gVXNlIGEgbW9yZSByZWFkYWJsZSB0YWIgc2l6ZS5cbjQuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgc2Fuc1xcYCBmb250LWZhbWlseSBieSBkZWZhdWx0LlxuNS4gVXNlIHRoZSB1c2VyJ3MgY29uZmlndXJlZCBcXGBzYW5zXFxgIGZvbnQtZmVhdHVyZS1zZXR0aW5ncyBieSBkZWZhdWx0LlxuNi4gVXNlIHRoZSB1c2VyJ3MgY29uZmlndXJlZCBcXGBzYW5zXFxgIGZvbnQtdmFyaWF0aW9uLXNldHRpbmdzIGJ5IGRlZmF1bHQuXG43LiBEaXNhYmxlIHRhcCBoaWdobGlnaHRzIG9uIGlPU1xuKi9cblxuaHRtbCxcbjpob3N0IHtcbiAgbGluZS1oZWlnaHQ6IDEuNTsgLyogMSAqL1xuICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7IC8qIDIgKi8gLyogMyAqL1xuICB0YWItc2l6ZTogNDsgLyogMyAqL1xuICBmb250LWZhbWlseTogdWktc2Fucy1zZXJpZiwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmLCBcIkFwcGxlIENvbG9yIEVtb2ppXCIsIFwiU2Vnb2UgVUkgRW1vamlcIiwgXCJTZWdvZSBVSSBTeW1ib2xcIiwgXCJOb3RvIENvbG9yIEVtb2ppXCI7IC8qIDQgKi9cbiAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiBub3JtYWw7IC8qIDUgKi9cbiAgZm9udC12YXJpYXRpb24tc2V0dGluZ3M6IG5vcm1hbDsgLyogNiAqL1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OyAvKiA3ICovXG59XG5cbi8qXG4xLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBhbGwgYnJvd3NlcnMuXG4yLiBJbmhlcml0IGxpbmUtaGVpZ2h0IGZyb20gXFxgaHRtbFxcYCBzbyB1c2VycyBjYW4gc2V0IHRoZW0gYXMgYSBjbGFzcyBkaXJlY3RseSBvbiB0aGUgXFxgaHRtbFxcYCBlbGVtZW50LlxuKi9cblxuYm9keSB7XG4gIG1hcmdpbjogMDsgLyogMSAqL1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDsgLyogMiAqL1xufVxuXG4vKlxuMS4gQWRkIHRoZSBjb3JyZWN0IGhlaWdodCBpbiBGaXJlZm94LlxuMi4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2Ugb2YgYm9yZGVyIGNvbG9yIGluIEZpcmVmb3guIChodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTA2NTUpXG4zLiBFbnN1cmUgaG9yaXpvbnRhbCBydWxlcyBhcmUgdmlzaWJsZSBieSBkZWZhdWx0LlxuKi9cblxuaHIge1xuICBoZWlnaHQ6IDA7IC8qIDEgKi9cbiAgY29sb3I6IGluaGVyaXQ7IC8qIDIgKi9cbiAgYm9yZGVyLXRvcC13aWR0aDogMXB4OyAvKiAzICovXG59XG5cbi8qXG5BZGQgdGhlIGNvcnJlY3QgdGV4dCBkZWNvcmF0aW9uIGluIENocm9tZSwgRWRnZSwgYW5kIFNhZmFyaS5cbiovXG5cbmFiYnI6d2hlcmUoW3RpdGxlXSkge1xuICAtd2Via2l0LXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcbiAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBkb3R0ZWQ7XG59XG5cbi8qXG5SZW1vdmUgdGhlIGRlZmF1bHQgZm9udCBzaXplIGFuZCB3ZWlnaHQgZm9yIGhlYWRpbmdzLlxuKi9cblxuaDEsXG5oMixcbmgzLFxuaDQsXG5oNSxcbmg2IHtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBmb250LXdlaWdodDogaW5oZXJpdDtcbn1cblxuLypcblJlc2V0IGxpbmtzIHRvIG9wdGltaXplIGZvciBvcHQtaW4gc3R5bGluZyBpbnN0ZWFkIG9mIG9wdC1vdXQuXG4qL1xuXG5hIHtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcbn1cblxuLypcbkFkZCB0aGUgY29ycmVjdCBmb250IHdlaWdodCBpbiBFZGdlIGFuZCBTYWZhcmkuXG4qL1xuXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cblxuLypcbjEuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgbW9ub1xcYCBmb250LWZhbWlseSBieSBkZWZhdWx0LlxuMi4gVXNlIHRoZSB1c2VyJ3MgY29uZmlndXJlZCBcXGBtb25vXFxgIGZvbnQtZmVhdHVyZS1zZXR0aW5ncyBieSBkZWZhdWx0LlxuMy4gVXNlIHRoZSB1c2VyJ3MgY29uZmlndXJlZCBcXGBtb25vXFxgIGZvbnQtdmFyaWF0aW9uLXNldHRpbmdzIGJ5IGRlZmF1bHQuXG40LiBDb3JyZWN0IHRoZSBvZGQgXFxgZW1cXGAgZm9udCBzaXppbmcgaW4gYWxsIGJyb3dzZXJzLlxuKi9cblxuY29kZSxcbmtiZCxcbnNhbXAsXG5wcmUge1xuICBmb250LWZhbWlseTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIFwiTGliZXJhdGlvbiBNb25vXCIsIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlOyAvKiAxICovXG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogbm9ybWFsOyAvKiAyICovXG4gIGZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOiBub3JtYWw7IC8qIDMgKi9cbiAgZm9udC1zaXplOiAxZW07IC8qIDQgKi9cbn1cblxuLypcbkFkZCB0aGUgY29ycmVjdCBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLlxuKi9cblxuc21hbGwge1xuICBmb250LXNpemU6IDgwJTtcbn1cblxuLypcblByZXZlbnQgXFxgc3ViXFxgIGFuZCBcXGBzdXBcXGAgZWxlbWVudHMgZnJvbSBhZmZlY3RpbmcgdGhlIGxpbmUgaGVpZ2h0IGluIGFsbCBicm93c2Vycy5cbiovXG5cbnN1YixcbnN1cCB7XG4gIGZvbnQtc2l6ZTogNzUlO1xuICBsaW5lLWhlaWdodDogMDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbnN1YiB7XG4gIGJvdHRvbTogLTAuMjVlbTtcbn1cblxuc3VwIHtcbiAgdG9wOiAtMC41ZW07XG59XG5cbi8qXG4xLiBSZW1vdmUgdGV4dCBpbmRlbnRhdGlvbiBmcm9tIHRhYmxlIGNvbnRlbnRzIGluIENocm9tZSBhbmQgU2FmYXJpLiAoaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9OTk5MDg4LCBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAxMjk3KVxuMi4gQ29ycmVjdCB0YWJsZSBib3JkZXIgY29sb3IgaW5oZXJpdGFuY2UgaW4gYWxsIENocm9tZSBhbmQgU2FmYXJpLiAoaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9OTM1NzI5LCBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTk1MDE2KVxuMy4gUmVtb3ZlIGdhcHMgYmV0d2VlbiB0YWJsZSBib3JkZXJzIGJ5IGRlZmF1bHQuXG4qL1xuXG50YWJsZSB7XG4gIHRleHQtaW5kZW50OiAwOyAvKiAxICovXG4gIGJvcmRlci1jb2xvcjogaW5oZXJpdDsgLyogMiAqL1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyAvKiAzICovXG59XG5cbi8qXG4xLiBDaGFuZ2UgdGhlIGZvbnQgc3R5bGVzIGluIGFsbCBicm93c2Vycy5cbjIuIFJlbW92ZSB0aGUgbWFyZ2luIGluIEZpcmVmb3ggYW5kIFNhZmFyaS5cbjMuIFJlbW92ZSBkZWZhdWx0IHBhZGRpbmcgaW4gYWxsIGJyb3dzZXJzLlxuKi9cblxuYnV0dG9uLFxuaW5wdXQsXG5vcHRncm91cCxcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7IC8qIDEgKi9cbiAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiBpbmhlcml0OyAvKiAxICovXG4gIGZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOiBpbmhlcml0OyAvKiAxICovXG4gIGZvbnQtc2l6ZTogMTAwJTsgLyogMSAqL1xuICBmb250LXdlaWdodDogaW5oZXJpdDsgLyogMSAqL1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDsgLyogMSAqL1xuICBsZXR0ZXItc3BhY2luZzogaW5oZXJpdDsgLyogMSAqL1xuICBjb2xvcjogaW5oZXJpdDsgLyogMSAqL1xuICBtYXJnaW46IDA7IC8qIDIgKi9cbiAgcGFkZGluZzogMDsgLyogMyAqL1xufVxuXG4vKlxuUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBFZGdlIGFuZCBGaXJlZm94LlxuKi9cblxuYnV0dG9uLFxuc2VsZWN0IHtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG59XG5cbi8qXG4xLiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuMi4gUmVtb3ZlIGRlZmF1bHQgYnV0dG9uIHN0eWxlcy5cbiovXG5cbmJ1dHRvbixcbmlucHV0OndoZXJlKFt0eXBlPSdidXR0b24nXSksXG5pbnB1dDp3aGVyZShbdHlwZT0ncmVzZXQnXSksXG5pbnB1dDp3aGVyZShbdHlwZT0nc3VibWl0J10pIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IC8qIDEgKi9cbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IC8qIDIgKi9cbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsgLyogMiAqL1xufVxuXG4vKlxuVXNlIHRoZSBtb2Rlcm4gRmlyZWZveCBmb2N1cyBzdHlsZSBmb3IgYWxsIGZvY3VzYWJsZSBlbGVtZW50cy5cbiovXG5cbjotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IGF1dG87XG59XG5cbi8qXG5SZW1vdmUgdGhlIGFkZGl0aW9uYWwgXFxgOmludmFsaWRcXGAgc3R5bGVzIGluIEZpcmVmb3guIChodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9nZWNrby1kZXYvYmxvYi8yZjllYWNkOWQzZDk5NWM5MzdiNDI1MWE1NTU3ZDk1ZDQ5NGM5YmUxL2xheW91dC9zdHlsZS9yZXMvZm9ybXMuY3NzI0w3MjgtTDczNylcbiovXG5cbjotbW96LXVpLWludmFsaWQge1xuICBib3gtc2hhZG93OiBub25lO1xufVxuXG4vKlxuQWRkIHRoZSBjb3JyZWN0IHZlcnRpY2FsIGFsaWdubWVudCBpbiBDaHJvbWUgYW5kIEZpcmVmb3guXG4qL1xuXG5wcm9ncmVzcyB7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cblxuLypcbkNvcnJlY3QgdGhlIGN1cnNvciBzdHlsZSBvZiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBidXR0b25zIGluIFNhZmFyaS5cbiovXG5cbjo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbjo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gIGhlaWdodDogYXV0bztcbn1cblxuLypcbjEuIENvcnJlY3QgdGhlIG9kZCBhcHBlYXJhbmNlIGluIENocm9tZSBhbmQgU2FmYXJpLlxuMi4gQ29ycmVjdCB0aGUgb3V0bGluZSBzdHlsZSBpbiBTYWZhcmkuXG4qL1xuXG5bdHlwZT0nc2VhcmNoJ10ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsgLyogMSAqL1xuICBvdXRsaW5lLW9mZnNldDogLTJweDsgLyogMiAqL1xufVxuXG4vKlxuUmVtb3ZlIHRoZSBpbm5lciBwYWRkaW5nIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIG1hY09TLlxuKi9cblxuOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG4vKlxuMS4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cbjIuIENoYW5nZSBmb250IHByb3BlcnRpZXMgdG8gXFxgaW5oZXJpdFxcYCBpbiBTYWZhcmkuXG4qL1xuXG46Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247IC8qIDEgKi9cbiAgZm9udDogaW5oZXJpdDsgLyogMiAqL1xufVxuXG4vKlxuQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gQ2hyb21lIGFuZCBTYWZhcmkuXG4qL1xuXG5zdW1tYXJ5IHtcbiAgZGlzcGxheTogbGlzdC1pdGVtO1xufVxuXG4vKlxuUmVtb3ZlcyB0aGUgZGVmYXVsdCBzcGFjaW5nIGFuZCBib3JkZXIgZm9yIGFwcHJvcHJpYXRlIGVsZW1lbnRzLlxuKi9cblxuYmxvY2txdW90ZSxcbmRsLFxuZGQsXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYsXG5ocixcbmZpZ3VyZSxcbnAsXG5wcmUge1xuICBtYXJnaW46IDA7XG59XG5cbmZpZWxkc2V0IHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG5sZWdlbmQge1xuICBwYWRkaW5nOiAwO1xufVxuXG5vbCxcbnVsLFxubWVudSB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuLypcblJlc2V0IGRlZmF1bHQgc3R5bGluZyBmb3IgZGlhbG9ncy5cbiovXG5kaWFsb2cge1xuICBwYWRkaW5nOiAwO1xufVxuXG4vKlxuUHJldmVudCByZXNpemluZyB0ZXh0YXJlYXMgaG9yaXpvbnRhbGx5IGJ5IGRlZmF1bHQuXG4qL1xuXG50ZXh0YXJlYSB7XG4gIHJlc2l6ZTogdmVydGljYWw7XG59XG5cbi8qXG4xLiBSZXNldCB0aGUgZGVmYXVsdCBwbGFjZWhvbGRlciBvcGFjaXR5IGluIEZpcmVmb3guIChodHRwczovL2dpdGh1Yi5jb20vdGFpbHdpbmRsYWJzL3RhaWx3aW5kY3NzL2lzc3Vlcy8zMzAwKVxuMi4gU2V0IHRoZSBkZWZhdWx0IHBsYWNlaG9sZGVyIGNvbG9yIHRvIHRoZSB1c2VyJ3MgY29uZmlndXJlZCBncmF5IDQwMCBjb2xvci5cbiovXG5cbmlucHV0OjpwbGFjZWhvbGRlcixcbnRleHRhcmVhOjpwbGFjZWhvbGRlciB7XG4gIG9wYWNpdHk6IDE7IC8qIDEgKi9cbiAgY29sb3I6ICM5Y2EzYWY7IC8qIDIgKi9cbn1cblxuLypcblNldCB0aGUgZGVmYXVsdCBjdXJzb3IgZm9yIGJ1dHRvbnMuXG4qL1xuXG5idXR0b24sXG5bcm9sZT1cImJ1dHRvblwiXSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLypcbk1ha2Ugc3VyZSBkaXNhYmxlZCBidXR0b25zIGRvbid0IGdldCB0aGUgcG9pbnRlciBjdXJzb3IuXG4qL1xuOmRpc2FibGVkIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4vKlxuMS4gTWFrZSByZXBsYWNlZCBlbGVtZW50cyBcXGBkaXNwbGF5OiBibG9ja1xcYCBieSBkZWZhdWx0LiAoaHR0cHM6Ly9naXRodWIuY29tL21vemRldnMvY3NzcmVtZWR5L2lzc3Vlcy8xNClcbjIuIEFkZCBcXGB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlXFxgIHRvIGFsaWduIHJlcGxhY2VkIGVsZW1lbnRzIG1vcmUgc2Vuc2libHkgYnkgZGVmYXVsdC4gKGh0dHBzOi8vZ2l0aHViLmNvbS9qZW5zaW1tb25zL2Nzc3JlbWVkeS9pc3N1ZXMvMTQjaXNzdWVjb21tZW50LTYzNDkzNDIxMClcbiAgIFRoaXMgY2FuIHRyaWdnZXIgYSBwb29ybHkgY29uc2lkZXJlZCBsaW50IGVycm9yIGluIHNvbWUgdG9vbHMgYnV0IGlzIGluY2x1ZGVkIGJ5IGRlc2lnbi5cbiovXG5cbmltZyxcbnN2ZyxcbnZpZGVvLFxuY2FudmFzLFxuYXVkaW8sXG5pZnJhbWUsXG5lbWJlZCxcbm9iamVjdCB7XG4gIGRpc3BsYXk6IGJsb2NrOyAvKiAxICovXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IC8qIDIgKi9cbn1cblxuLypcbkNvbnN0cmFpbiBpbWFnZXMgYW5kIHZpZGVvcyB0byB0aGUgcGFyZW50IHdpZHRoIGFuZCBwcmVzZXJ2ZSB0aGVpciBpbnRyaW5zaWMgYXNwZWN0IHJhdGlvLiAoaHR0cHM6Ly9naXRodWIuY29tL21vemRldnMvY3NzcmVtZWR5L2lzc3Vlcy8xNClcbiovXG5cbmltZyxcbnZpZGVvIHtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi8qIE1ha2UgZWxlbWVudHMgd2l0aCB0aGUgSFRNTCBoaWRkZW4gYXR0cmlidXRlIHN0YXkgaGlkZGVuIGJ5IGRlZmF1bHQgKi9cbltoaWRkZW5dIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuOnJvb3QsXG5bZGF0YS10aGVtZV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbn1cblxuQHN1cHBvcnRzIG5vdCAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICA6cm9vdCB7XG4gICAgY29sb3Itc2NoZW1lOiBsaWdodDtcbiAgICAtLWZhbGxiYWNrLXA6ICM0OTFlZmY7XG4gICAgLS1mYWxsYmFjay1wYzogI2Q0ZGJmZjtcbiAgICAtLWZhbGxiYWNrLXM6ICNmZjQxYzc7XG4gICAgLS1mYWxsYmFjay1zYzogI2ZmZjlmYztcbiAgICAtLWZhbGxiYWNrLWE6ICMwMGNmYmQ7XG4gICAgLS1mYWxsYmFjay1hYzogIzAwMTAwZDtcbiAgICAtLWZhbGxiYWNrLW46ICMyYjM0NDA7XG4gICAgLS1mYWxsYmFjay1uYzogI2Q3ZGRlNDtcbiAgICAtLWZhbGxiYWNrLWIxOiAjZmZmZmZmO1xuICAgIC0tZmFsbGJhY2stYjI6ICNlNWU2ZTY7XG4gICAgLS1mYWxsYmFjay1iMzogI2U1ZTZlNjtcbiAgICAtLWZhbGxiYWNrLWJjOiAjMWYyOTM3O1xuICAgIC0tZmFsbGJhY2staW46ICMwMGIzZjA7XG4gICAgLS1mYWxsYmFjay1pbmM6ICMwMDAwMDA7XG4gICAgLS1mYWxsYmFjay1zdTogIzAwY2E5MjtcbiAgICAtLWZhbGxiYWNrLXN1YzogIzAwMDAwMDtcbiAgICAtLWZhbGxiYWNrLXdhOiAjZmZjMjJkO1xuICAgIC0tZmFsbGJhY2std2FjOiAjMDAwMDAwO1xuICAgIC0tZmFsbGJhY2stZXI6ICNmZjZmNzA7XG4gICAgLS1mYWxsYmFjay1lcmM6ICMwMDAwMDA7XG4gIH1cblxuICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7XG5cbiAgICA6cm9vdCB7XG4gICAgICBjb2xvci1zY2hlbWU6IGRhcms7XG4gICAgICAtLWZhbGxiYWNrLXA6ICM3NTgyZmY7XG4gICAgICAtLWZhbGxiYWNrLXBjOiAjMDUwNjE3O1xuICAgICAgLS1mYWxsYmFjay1zOiAjZmY3MWNmO1xuICAgICAgLS1mYWxsYmFjay1zYzogIzE5MDIxMTtcbiAgICAgIC0tZmFsbGJhY2stYTogIzAwYzdiNTtcbiAgICAgIC0tZmFsbGJhY2stYWM6ICMwMDBlMGM7XG4gICAgICAtLWZhbGxiYWNrLW46ICMyYTMyM2M7XG4gICAgICAtLWZhbGxiYWNrLW5jOiAjYTZhZGJiO1xuICAgICAgLS1mYWxsYmFjay1iMTogIzFkMjMyYTtcbiAgICAgIC0tZmFsbGJhY2stYjI6ICMxOTFlMjQ7XG4gICAgICAtLWZhbGxiYWNrLWIzOiAjMTUxOTFlO1xuICAgICAgLS1mYWxsYmFjay1iYzogI2E2YWRiYjtcbiAgICAgIC0tZmFsbGJhY2staW46ICMwMGIzZjA7XG4gICAgICAtLWZhbGxiYWNrLWluYzogIzAwMDAwMDtcbiAgICAgIC0tZmFsbGJhY2stc3U6ICMwMGNhOTI7XG4gICAgICAtLWZhbGxiYWNrLXN1YzogIzAwMDAwMDtcbiAgICAgIC0tZmFsbGJhY2std2E6ICNmZmMyMmQ7XG4gICAgICAtLWZhbGxiYWNrLXdhYzogIzAwMDAwMDtcbiAgICAgIC0tZmFsbGJhY2stZXI6ICNmZjZmNzA7XG4gICAgICAtLWZhbGxiYWNrLWVyYzogIzAwMDAwMDtcbiAgICB9XG4gIH1cbn1cblxuaHRtbCB7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG5cbioge1xuICBzY3JvbGxiYXItY29sb3I6IGNvbG9yLW1peChpbiBva2xjaCwgY3VycmVudENvbG9yIDM1JSwgdHJhbnNwYXJlbnQpIHRyYW5zcGFyZW50O1xufVxuXG4qOmhvdmVyIHtcbiAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsY2gsIGN1cnJlbnRDb2xvciA2MCUsIHRyYW5zcGFyZW50KSB0cmFuc3BhcmVudDtcbn1cblxuOnJvb3Qge1xuICBjb2xvci1zY2hlbWU6IGRhcms7XG4gIC0taW46IDcyLjA2JSAwLjE5MSAyMzEuNjtcbiAgLS1zdTogNjQuOCUgMC4xNTAgMTYwO1xuICAtLXdhOiA4NC43MSUgMC4xOTkgODMuODc7XG4gIC0tZXI6IDcxLjc2JSAwLjIyMSAyMi4xODtcbiAgLS1wYzogMTMuMTM4JSAwLjAzOTIgMjc1Ljc1O1xuICAtLXNjOiAxNC45NiUgMC4wNTIgMzQyLjU1O1xuICAtLWFjOiAxNC45MDIlIDAuMDMzNCAxODMuNjE7XG4gIC0taW5jOiAwJSAwIDA7XG4gIC0tc3VjOiAwJSAwIDA7XG4gIC0td2FjOiAwJSAwIDA7XG4gIC0tZXJjOiAwJSAwIDA7XG4gIC0tcm91bmRlZC1ib3g6IDFyZW07XG4gIC0tcm91bmRlZC1idG46IDAuNXJlbTtcbiAgLS1yb3VuZGVkLWJhZGdlOiAxLjlyZW07XG4gIC0tYW5pbWF0aW9uLWJ0bjogMC4yNXM7XG4gIC0tYW5pbWF0aW9uLWlucHV0OiAuMnM7XG4gIC0tYnRuLWZvY3VzLXNjYWxlOiAwLjk1O1xuICAtLWJvcmRlci1idG46IDFweDtcbiAgLS10YWItYm9yZGVyOiAxcHg7XG4gIC0tdGFiLXJhZGl1czogMC41cmVtO1xuICAtLXA6IDY1LjY5JSAwLjE5NiAyNzUuNzU7XG4gIC0tczogNzQuOCUgMC4yNiAzNDIuNTU7XG4gIC0tYTogNzQuNTElIDAuMTY3IDE4My42MTtcbiAgLS1uOiAzMS4zODE1JSAwLjAyMTEwOCAyNTQuMTM5MTc1O1xuICAtLW5jOiA3NC42NDc3JSAwLjAyMTYgMjY0LjQzNTk2NDtcbiAgLS1iMTogMjUuMzI2NyUgMC4wMTU4OTYgMjUyLjQxNzU2ODtcbiAgLS1iMjogMjMuMjYwNyUgMC4wMTM4MDcgMjUzLjEwMDY3NTtcbiAgLS1iMzogMjEuMTQ4NCUgMC4wMTE2NSAyNTQuMDg3OTM5O1xuICAtLWJjOiA3NC42NDc3JSAwLjAyMTYgMjY0LjQzNTk2NDtcbn1cblxuW2RhdGEtdGhlbWU9ZGFya10ge1xuICBjb2xvci1zY2hlbWU6IGRhcms7XG4gIC0taW46IDcyLjA2JSAwLjE5MSAyMzEuNjtcbiAgLS1zdTogNjQuOCUgMC4xNTAgMTYwO1xuICAtLXdhOiA4NC43MSUgMC4xOTkgODMuODc7XG4gIC0tZXI6IDcxLjc2JSAwLjIyMSAyMi4xODtcbiAgLS1wYzogMTMuMTM4JSAwLjAzOTIgMjc1Ljc1O1xuICAtLXNjOiAxNC45NiUgMC4wNTIgMzQyLjU1O1xuICAtLWFjOiAxNC45MDIlIDAuMDMzNCAxODMuNjE7XG4gIC0taW5jOiAwJSAwIDA7XG4gIC0tc3VjOiAwJSAwIDA7XG4gIC0td2FjOiAwJSAwIDA7XG4gIC0tZXJjOiAwJSAwIDA7XG4gIC0tcm91bmRlZC1ib3g6IDFyZW07XG4gIC0tcm91bmRlZC1idG46IDAuNXJlbTtcbiAgLS1yb3VuZGVkLWJhZGdlOiAxLjlyZW07XG4gIC0tYW5pbWF0aW9uLWJ0bjogMC4yNXM7XG4gIC0tYW5pbWF0aW9uLWlucHV0OiAuMnM7XG4gIC0tYnRuLWZvY3VzLXNjYWxlOiAwLjk1O1xuICAtLWJvcmRlci1idG46IDFweDtcbiAgLS10YWItYm9yZGVyOiAxcHg7XG4gIC0tdGFiLXJhZGl1czogMC41cmVtO1xuICAtLXA6IDY1LjY5JSAwLjE5NiAyNzUuNzU7XG4gIC0tczogNzQuOCUgMC4yNiAzNDIuNTU7XG4gIC0tYTogNzQuNTElIDAuMTY3IDE4My42MTtcbiAgLS1uOiAzMS4zODE1JSAwLjAyMTEwOCAyNTQuMTM5MTc1O1xuICAtLW5jOiA3NC42NDc3JSAwLjAyMTYgMjY0LjQzNTk2NDtcbiAgLS1iMTogMjUuMzI2NyUgMC4wMTU4OTYgMjUyLjQxNzU2ODtcbiAgLS1iMjogMjMuMjYwNyUgMC4wMTM4MDcgMjUzLjEwMDY3NTtcbiAgLS1iMzogMjEuMTQ4NCUgMC4wMTE2NSAyNTQuMDg3OTM5O1xuICAtLWJjOiA3NC42NDc3JSAwLjAyMTYgMjY0LjQzNTk2NDtcbn1cblxuW2RhdGEtdGhlbWU9b3BlbnNpZ25jc3NdIHtcbiAgLS1wOiAyOS40NjUzJSAwLjExNDU0OCAyNTkuMDYwMTI5O1xuICAtLXJvdW5kZWQtYm94OiAxcmVtO1xuICAtLXJvdW5kZWQtYmFkZ2U6IDEuOXJlbTtcbiAgLS1hbmltYXRpb24tYnRuOiAwLjI1cztcbiAgLS1hbmltYXRpb24taW5wdXQ6IC4ycztcbiAgLS1idG4tZm9jdXMtc2NhbGU6IDAuOTU7XG4gIC0tYm9yZGVyLWJ0bjogMXB4O1xuICAtLXBjOiA4NC40NTMxJSAwLjAwNDcwMiAyNTguMzI2NzkxO1xuICAtLXM6IDMyLjc4MzclIDAuMDQwODg1IDI2MS4zNDY4NztcbiAgLS1zYzogODUuODMzOSUgMC4wMjMwMDYgMjYwLjcxOTQ0MjtcbiAgLS1hOiA1Ny40NDM4JSAwLjIzMTQ5MSAyMi4xNzk5MDk7XG4gIC0tYWM6IDkxLjQyNDclIDAuMDQzOTM1IDIzLjE3OTU3OTtcbiAgLS1uOiA4NC4xMzczJSAwLjAyNDE1NyAyNTYuMTE0MTtcbiAgLS1uYzogMTguNDA4MSUgMC4wMDM3NTggMTY0LjU5NzY1NDtcbiAgLS1iMTogMTAwJSAwIDA7XG4gIC0tYjI6IDkwLjA2MDElIDAgMDtcbiAgLS1iMzogODAuMTUxNyUgMCAwO1xuICAtLWJjOiAyMC4wMTkzJSAwIDA7XG4gIC0taW46IDczLjQ1OTIlIDAuMTU4ODc0IDIzNi4zNTc1MTQ7XG4gIC0taW5jOiA5Ni45ODcxJSAwLjAwMTMyNCAxMDYuNDIzODIxO1xuICAtLXN1OiA2NC44MTU5JSAwLjE0NzQwNSAxNTkuNjcyNjY2O1xuICAtLXN1YzogOTYuOTg3MSUgMC4wMDEzMjQgMTA2LjQyMzgyMTtcbiAgLS13YTogODMuODM5OCUgMC4xNzIyMDkgODMuNTczOTY3O1xuICAtLXdhYzogODguMDAwNSUgMC4wMjUwNCAyNTEuOTE2OTg7XG4gIC0tZXI6IDgwLjQ5MDIlIDAuMTEyMDE3IDE1LjcyNzUyMjtcbiAgLS1lcmM6IDE1Ljk5NyUgMC4wMjMyODQgMTQuODk4NTE3O1xuICAtLXJvdW5kZWQtYnRuOiAxLjlyZW07XG4gIC0tdGFiLWJvcmRlcjogMnB4O1xuICAtLXRhYi1yYWRpdXM6IDAuN3JlbTtcbn1cblxuKiwgOjpiZWZvcmUsIDo6YWZ0ZXIge1xuICAtLXR3LWJvcmRlci1zcGFjaW5nLXg6IDA7XG4gIC0tdHctYm9yZGVyLXNwYWNpbmcteTogMDtcbiAgLS10dy10cmFuc2xhdGUteDogMDtcbiAgLS10dy10cmFuc2xhdGUteTogMDtcbiAgLS10dy1yb3RhdGU6IDA7XG4gIC0tdHctc2tldy14OiAwO1xuICAtLXR3LXNrZXcteTogMDtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIC0tdHctcGFuLXg6ICA7XG4gIC0tdHctcGFuLXk6ICA7XG4gIC0tdHctcGluY2gtem9vbTogIDtcbiAgLS10dy1zY3JvbGwtc25hcC1zdHJpY3RuZXNzOiBwcm94aW1pdHk7XG4gIC0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbjogIDtcbiAgLS10dy1ncmFkaWVudC12aWEtcG9zaXRpb246ICA7XG4gIC0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246ICA7XG4gIC0tdHctb3JkaW5hbDogIDtcbiAgLS10dy1zbGFzaGVkLXplcm86ICA7XG4gIC0tdHctbnVtZXJpYy1maWd1cmU6ICA7XG4gIC0tdHctbnVtZXJpYy1zcGFjaW5nOiAgO1xuICAtLXR3LW51bWVyaWMtZnJhY3Rpb246ICA7XG4gIC0tdHctcmluZy1pbnNldDogIDtcbiAgLS10dy1yaW5nLW9mZnNldC13aWR0aDogMHB4O1xuICAtLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmO1xuICAtLXR3LXJpbmctY29sb3I6IHJnYig1OSAxMzAgMjQ2IC8gMC41KTtcbiAgLS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1yaW5nLXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7XG4gIC0tdHctYmx1cjogIDtcbiAgLS10dy1icmlnaHRuZXNzOiAgO1xuICAtLXR3LWNvbnRyYXN0OiAgO1xuICAtLXR3LWdyYXlzY2FsZTogIDtcbiAgLS10dy1odWUtcm90YXRlOiAgO1xuICAtLXR3LWludmVydDogIDtcbiAgLS10dy1zYXR1cmF0ZTogIDtcbiAgLS10dy1zZXBpYTogIDtcbiAgLS10dy1kcm9wLXNoYWRvdzogIDtcbiAgLS10dy1iYWNrZHJvcC1ibHVyOiAgO1xuICAtLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6ICA7XG4gIC0tdHctYmFja2Ryb3AtY29udHJhc3Q6ICA7XG4gIC0tdHctYmFja2Ryb3AtZ3JheXNjYWxlOiAgO1xuICAtLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6ICA7XG4gIC0tdHctYmFja2Ryb3AtaW52ZXJ0OiAgO1xuICAtLXR3LWJhY2tkcm9wLW9wYWNpdHk6ICA7XG4gIC0tdHctYmFja2Ryb3Atc2F0dXJhdGU6ICA7XG4gIC0tdHctYmFja2Ryb3Atc2VwaWE6ICA7XG4gIC0tdHctY29udGFpbi1zaXplOiAgO1xuICAtLXR3LWNvbnRhaW4tbGF5b3V0OiAgO1xuICAtLXR3LWNvbnRhaW4tcGFpbnQ6ICA7XG4gIC0tdHctY29udGFpbi1zdHlsZTogIDtcbn1cblxuOjpiYWNrZHJvcCB7XG4gIC0tdHctYm9yZGVyLXNwYWNpbmcteDogMDtcbiAgLS10dy1ib3JkZXItc3BhY2luZy15OiAwO1xuICAtLXR3LXRyYW5zbGF0ZS14OiAwO1xuICAtLXR3LXRyYW5zbGF0ZS15OiAwO1xuICAtLXR3LXJvdGF0ZTogMDtcbiAgLS10dy1za2V3LXg6IDA7XG4gIC0tdHctc2tldy15OiAwO1xuICAtLXR3LXNjYWxlLXg6IDE7XG4gIC0tdHctc2NhbGUteTogMTtcbiAgLS10dy1wYW4teDogIDtcbiAgLS10dy1wYW4teTogIDtcbiAgLS10dy1waW5jaC16b29tOiAgO1xuICAtLXR3LXNjcm9sbC1zbmFwLXN0cmljdG5lc3M6IHByb3hpbWl0eTtcbiAgLS10dy1ncmFkaWVudC1mcm9tLXBvc2l0aW9uOiAgO1xuICAtLXR3LWdyYWRpZW50LXZpYS1wb3NpdGlvbjogIDtcbiAgLS10dy1ncmFkaWVudC10by1wb3NpdGlvbjogIDtcbiAgLS10dy1vcmRpbmFsOiAgO1xuICAtLXR3LXNsYXNoZWQtemVybzogIDtcbiAgLS10dy1udW1lcmljLWZpZ3VyZTogIDtcbiAgLS10dy1udW1lcmljLXNwYWNpbmc6ICA7XG4gIC0tdHctbnVtZXJpYy1mcmFjdGlvbjogIDtcbiAgLS10dy1yaW5nLWluc2V0OiAgO1xuICAtLXR3LXJpbmctb2Zmc2V0LXdpZHRoOiAwcHg7XG4gIC0tdHctcmluZy1vZmZzZXQtY29sb3I6ICNmZmY7XG4gIC0tdHctcmluZy1jb2xvcjogcmdiKDU5IDEzMCAyNDYgLyAwLjUpO1xuICAtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXJpbmctc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMCAjMDAwMDtcbiAgLS10dy1ibHVyOiAgO1xuICAtLXR3LWJyaWdodG5lc3M6ICA7XG4gIC0tdHctY29udHJhc3Q6ICA7XG4gIC0tdHctZ3JheXNjYWxlOiAgO1xuICAtLXR3LWh1ZS1yb3RhdGU6ICA7XG4gIC0tdHctaW52ZXJ0OiAgO1xuICAtLXR3LXNhdHVyYXRlOiAgO1xuICAtLXR3LXNlcGlhOiAgO1xuICAtLXR3LWRyb3Atc2hhZG93OiAgO1xuICAtLXR3LWJhY2tkcm9wLWJsdXI6ICA7XG4gIC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzczogIDtcbiAgLS10dy1iYWNrZHJvcC1jb250cmFzdDogIDtcbiAgLS10dy1iYWNrZHJvcC1ncmF5c2NhbGU6ICA7XG4gIC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZTogIDtcbiAgLS10dy1iYWNrZHJvcC1pbnZlcnQ6ICA7XG4gIC0tdHctYmFja2Ryb3Atb3BhY2l0eTogIDtcbiAgLS10dy1iYWNrZHJvcC1zYXR1cmF0ZTogIDtcbiAgLS10dy1iYWNrZHJvcC1zZXBpYTogIDtcbiAgLS10dy1jb250YWluLXNpemU6ICA7XG4gIC0tdHctY29udGFpbi1sYXlvdXQ6ICA7XG4gIC0tdHctY29udGFpbi1wYWludDogIDtcbiAgLS10dy1jb250YWluLXN0eWxlOiAgO1xufVxyXG4uY29udGFpbmVyIHtcbiAgd2lkdGg6IDEwMCU7XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiA2NDBweCkge1xuXG4gIC5jb250YWluZXIge1xuICAgIG1heC13aWR0aDogNjQwcHg7XG4gIH1cbn1cclxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG5cbiAgLmNvbnRhaW5lciB7XG4gICAgbWF4LXdpZHRoOiA3NjhweDtcbiAgfVxufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogMTAyNHB4KSB7XG5cbiAgLmNvbnRhaW5lciB7XG4gICAgbWF4LXdpZHRoOiAxMDI0cHg7XG4gIH1cbn1cclxuQG1lZGlhIChtaW4td2lkdGg6IDEyODBweCkge1xuXG4gIC5jb250YWluZXIge1xuICAgIG1heC13aWR0aDogMTI4MHB4O1xuICB9XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiAxNTM2cHgpIHtcblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDE1MzZweDtcbiAgfVxufVxyXG4ub3AtYWxlcnQge1xuICBkaXNwbGF5OiBncmlkO1xuICB3aWR0aDogMTAwJTtcbiAgZ3JpZC1hdXRvLWZsb3c6IHJvdztcbiAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1pdGVtczogY2VudGVyO1xuICBnYXA6IDFyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIHBhZGRpbmc6IDFyZW07XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS1hbGVydC1iZzogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpLzEpKTtcbiAgLS1hbGVydC1iZy1taXg6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSk7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFsZXJ0LWJnKTtcbn1cclxuQG1lZGlhIChtaW4td2lkdGg6IDY0MHB4KSB7XG5cbiAgLm9wLWFsZXJ0IHtcbiAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBtaW5tYXgoYXV0bywxZnIpO1xuICAgIGp1c3RpZnktaXRlbXM6IHN0YXJ0O1xuICAgIHRleHQtYWxpZ246IHN0YXJ0O1xuICB9XG59XHJcbi5vcC1iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMjAwbXM7XG4gIGhlaWdodDogMS4yNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIHdpZHRoOiBmaXQtY29udGVudDtcbiAgcGFkZGluZy1sZWZ0OiAwLjU2M3JlbTtcbiAgcGFkZGluZy1yaWdodDogMC41NjNyZW07XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYmFkZ2UsIDEuOXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5AbWVkaWEgKGhvdmVyOmhvdmVyKSB7XG5cbiAgLm9wLW1lbnUgbGkgPiAqOm5vdCh1bCwgLm9wLW1lbnUtdGl0bGUsIGRldGFpbHMsIC5vcC1idG4pOmFjdGl2ZSxcbi5vcC1tZW51IGxpID4gKjpub3QodWwsIC5vcC1tZW51LXRpdGxlLCBkZXRhaWxzLCAub3AtYnRuKS5vcC1hY3RpdmUsXG4ub3AtbWVudSBsaSA+IGRldGFpbHMgPiBzdW1tYXJ5OmFjdGl2ZSB7XG4gICAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stbmMsb2tsY2godmFyKC0tbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIC5vcC10YWI6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICB9XG5cbiAgLm9wLXRhYnMtYm94ZWQgOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSk6aG92ZXIsIC5vcC10YWJzLWJveGVkIDppcyhpbnB1dDpjaGVja2VkKTpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICAub3AtdGFibGUgdHIub3AtaG92ZXI6aG92ZXIsXG4gIC5vcC10YWJsZSB0ci5vcC1ob3ZlcjpudGgtY2hpbGQoZXZlbik6aG92ZXIge1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgfVxufVxyXG4ub3AtYnRuIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGhlaWdodDogM3JlbTtcbiAgbWluLWhlaWdodDogM3JlbTtcbiAgZmxleC1zaHJpbms6IDA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1jb2xvcjogb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMikpIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxZW07XG4gIGdhcDogMC41cmVtO1xuICBmb250LXdlaWdodDogNjAwO1xuICB0ZXh0LWRlY29yYXRpb24tbGluZTogbm9uZTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMjAwbXM7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgYm9yZGVyLXdpZHRoOiB2YXIoLS1ib3JkZXItYnRuLCAxcHgpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm07XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS10dy1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBva2xjaCh2YXIoLS1idG4tY29sb3IsIHZhcigtLWIyKSkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbn1cclxuLm9wLWJ0bi1kaXNhYmxlZCxcbiAgLm9wLWJ0bltkaXNhYmxlZF0sXG4gIC5vcC1idG46ZGlzYWJsZWQge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cclxuLm9wLWJ0bi1zcXVhcmUge1xuICBoZWlnaHQ6IDNyZW07XG4gIHdpZHRoOiAzcmVtO1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tY2lyY2xlIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICB3aWR0aDogM3JlbTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbjp3aGVyZSgub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSkpLFxuOndoZXJlKC5vcC1idG46aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdKSkge1xuICB3aWR0aDogYXV0bztcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG59XHJcbi5vcC1idG46aXMoaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdKTphZnRlcixcbi5vcC1idG46aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdKTphZnRlciB7XG4gIC0tdHctY29udGVudDogYXR0cihhcmlhLWxhYmVsKTtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG59XHJcbi5vcC1jYXJkIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG59XHJcbi5vcC1jYXJkOmZvY3VzIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3AtY2FyZC1ib2R5IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleDogMSAxIGF1dG87XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHBhZGRpbmc6IHZhcigtLXBhZGRpbmctY2FyZCwgMnJlbSk7XG4gIGdhcDogMC41cmVtO1xufVxyXG4ub3AtY2FyZC1ib2R5IDp3aGVyZShwKSB7XG4gIGZsZXgtZ3JvdzogMTtcbn1cclxuLm9wLWNhcmQtYWN0aW9ucyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gIGdhcDogMC41cmVtO1xufVxyXG4ub3AtY2FyZCBmaWd1cmUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cclxuLm9wLWNhcmQub3AtaW1hZ2UtZnVsbCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGw6YmVmb3JlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBjb250ZW50OiBcIlwiO1xuICB6LWluZGV4OiAxMDtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgb3BhY2l0eTogMC43NTtcbn1cclxuLm9wLWNhcmQub3AtaW1hZ2UtZnVsbDpiZWZvcmUsXG4gICAgLm9wLWNhcmQub3AtaW1hZ2UtZnVsbCA+ICoge1xuICBncmlkLWNvbHVtbi1zdGFydDogMTtcbiAgZ3JpZC1yb3ctc3RhcnQ6IDE7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGwgPiBmaWd1cmUgaW1nIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvYmplY3QtZml0OiBjb3Zlcjtcbn1cclxuLm9wLWNhcmQub3AtaW1hZ2UtZnVsbCA+IC5vcC1jYXJkLWJvZHkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDIwO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW5jLG9rbGNoKHZhcigtLW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1jaGVja2JveCB7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICAtLWNoa2JnOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpO1xuICAtLWNoa2ZnOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgd2lkdGg6IDEuNXJlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtZGl2aWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gIG1hcmdpbi10b3A6IDFyZW07XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG4gIGhlaWdodDogMXJlbTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cclxuLm9wLWRpdmlkZXI6YmVmb3JlLFxuICAub3AtZGl2aWRlcjphZnRlciB7XG4gIGhlaWdodDogMC4xMjVyZW07XG4gIHdpZHRoOiAxMDAlO1xuICBmbGV4LWdyb3c6IDE7XG4gIC0tdHctY29udGVudDogJyc7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4xKSk7XG59XHJcbi5vcC1kcm9wZG93biB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxyXG4ub3AtZHJvcGRvd24gPiAqOm5vdChzdW1tYXJ5KTpmb2N1cyB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWRyb3Bkb3duIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxyXG4ub3AtZHJvcGRvd246aXMoOm5vdChkZXRhaWxzKSkgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zZm9ybS1vcmlnaW46IHRvcDtcbiAgLS10dy1zY2FsZS14OiAuOTU7XG4gIC0tdHctc2NhbGUteTogLjk1O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMjAwbXM7XG59XHJcbi5vcC1kcm9wZG93bi1lbmQgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICBpbnNldC1pbmxpbmUtZW5kOiAwcHg7XG59XHJcbi5vcC1kcm9wZG93bi1sZWZ0IC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgYm90dG9tOiBhdXRvO1xuICBpbnNldC1pbmxpbmUtZW5kOiAxMDAlO1xuICB0b3A6IDBweDtcbiAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQ7XG59XHJcbi5vcC1kcm9wZG93bi1yaWdodCAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogYXV0bztcbiAgaW5zZXQtaW5saW5lLXN0YXJ0OiAxMDAlO1xuICB0b3A6IDBweDtcbiAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdDtcbn1cclxuLm9wLWRyb3Bkb3duLWJvdHRvbSAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogYXV0bztcbiAgdG9wOiAxMDAlO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3A7XG59XHJcbi5vcC1kcm9wZG93bi10b3AgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICBib3R0b206IDEwMCU7XG4gIHRvcDogYXV0bztcbiAgdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tO1xufVxyXG4ub3AtZHJvcGRvd24tZW5kLm9wLWRyb3Bkb3duLXJpZ2h0IC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgYm90dG9tOiAwcHg7XG4gIHRvcDogYXV0bztcbn1cclxuLm9wLWRyb3Bkb3duLWVuZC5vcC1kcm9wZG93bi1sZWZ0IC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgYm90dG9tOiAwcHg7XG4gIHRvcDogYXV0bztcbn1cclxuLm9wLWRyb3Bkb3duLm9wLWRyb3Bkb3duLW9wZW4gLm9wLWRyb3Bkb3duLWNvbnRlbnQsXG4ub3AtZHJvcGRvd246bm90KC5vcC1kcm9wZG93bi1ob3Zlcik6Zm9jdXMgLm9wLWRyb3Bkb3duLWNvbnRlbnQsXG4ub3AtZHJvcGRvd246Zm9jdXMtd2l0aGluIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgb3BhY2l0eTogMTtcbn1cclxuQG1lZGlhIChob3ZlcjogaG92ZXIpIHtcblxuICAub3AtZHJvcGRvd24ub3AtZHJvcGRvd24taG92ZXI6aG92ZXIgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuXG4gIC5vcC1idG46aG92ZXIge1xuICAgIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMyxva2xjaCh2YXIoLS1iMykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gICAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChcbiAgICAgICAgICAgIGluIG9rbGFiLFxuICAgICAgICAgICAgb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMikpIC8gdmFyKC0tdHctYmctb3BhY2l0eSwgMSkpIDkwJSxcbiAgICAgICAgICAgIGJsYWNrXG4gICAgICAgICAgKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KFxuICAgICAgICAgICAgaW4gb2tsYWIsXG4gICAgICAgICAgICBva2xjaCh2YXIoLS1idG4tY29sb3IsIHZhcigtLWIyKSkgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSwgMSkpIDkwJSxcbiAgICAgICAgICAgIGJsYWNrXG4gICAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBAc3VwcG9ydHMgbm90IChjb2xvcjogb2tsY2goMCUgMCAwKSkge1xuXG4gICAgLm9wLWJ0bjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1idG4tY29sb3IsIHZhcigtLWZhbGxiYWNrLWIyKSk7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tZmFsbGJhY2stYjIpKTtcbiAgICB9XG4gIH1cblxuICAub3AtYnRuLm9wLWdsYXNzOmhvdmVyIHtcbiAgICAtLWdsYXNzLW9wYWNpdHk6IDI1JTtcbiAgICAtLWdsYXNzLWJvcmRlci1vcGFjaXR5OiAxNSU7XG4gIH1cblxuICAub3AtYnRuLWdob3N0OmhvdmVyIHtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogb2tsY2goMCUgMCAwKSkge1xuXG4gICAgLm9wLWJ0bi1naG9zdDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lOmhvdmVyIHtcbiAgICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tcHJpbWFyeTpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG4tb3V0bGluZS5vcC1idG4tcHJpbWFyeTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tc2Vjb25kYXJ5OmhvdmVyIHtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc2Msb2tsY2godmFyKC0tc2MpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zZWNvbmRhcnk6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICB9XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudDpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWFjLG9rbGNoKHZhcigtLWFjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG4tb3V0bGluZS5vcC1idG4tYWNjZW50OmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS8xKSkgOTAlLCBibGFjayk7XG4gICAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zdWNjZXNzOmhvdmVyIHtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc3VjLG9rbGNoKHZhcigtLXN1YykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXN1Y2Nlc3M6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zdSxva2xjaCh2YXIoLS1zdSkvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1pbmZvOmhvdmVyIHtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW5jLG9rbGNoKHZhcigtLWluYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWluZm86aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi13YXJuaW5nOmhvdmVyIHtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2std2FjLG9rbGNoKHZhcigtLXdhYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXdhcm5pbmc6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXdhLG9rbGNoKHZhcigtLXdhKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1lcnJvcjpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyYyxva2xjaCh2YXIoLS1lcmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1lcnJvcjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS8xKSkgOTAlLCBibGFjayk7XG4gICAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stZXIsb2tsY2godmFyKC0tZXIpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICB9XG4gIH1cblxuICAub3AtYnRuLWRpc2FibGVkOmhvdmVyLFxuICAgIC5vcC1idG5bZGlzYWJsZWRdOmhvdmVyLFxuICAgIC5vcC1idG46ZGlzYWJsZWQ6aG92ZXIge1xuICAgIC0tdHctYm9yZGVyLW9wYWNpdHk6IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAgIC0tdHctYmctb3BhY2l0eTogMC4yO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG46aXMoaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQpOmhvdmVyLCAub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJyYWRpb1wiXTpjaGVja2VkKTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1kcm9wZG93bi5vcC1kcm9wZG93bi1ob3Zlcjpob3ZlciAub3AtZHJvcGRvd24tY29udGVudCB7XG4gICAgLS10dy1zY2FsZS14OiAxO1xuICAgIC0tdHctc2NhbGUteTogMTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgfVxuXG4gIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUpKTpub3QoLm9wLWFjdGl2ZSwgLm9wLWJ0bik6aG92ZXIsIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKTpub3QoLm9wLWFjdGl2ZSwgLm9wLWJ0bik6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAgIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUpKTpub3QoLm9wLWFjdGl2ZSwgLm9wLWJ0bik6aG92ZXIsIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKTpub3QoLm9wLWFjdGl2ZSwgLm9wLWJ0bik6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMSkpO1xuICAgIH1cbiAgfVxuXG4gIC5vcC10YWJbZGlzYWJsZWRdLFxuICAgIC5vcC10YWJbZGlzYWJsZWRdOmhvdmVyIHtcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG4gIH1cbn1cclxuLm9wLWRyb3Bkb3duOmlzKGRldGFpbHMpIHN1bW1hcnk6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuICBkaXNwbGF5OiBub25lO1xufVxyXG4ub3AtZmlsZS1pbnB1dCB7XG4gIGhlaWdodDogM3JlbTtcbiAgZmxleC1zaHJpbms6IDE7XG4gIHBhZGRpbmctaW5saW5lLWVuZDogMXJlbTtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgbGluZS1oZWlnaHQ6IDEuNXJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLWZpbGUtaW5wdXQ6OmZpbGUtc2VsZWN0b3ItYnV0dG9uIHtcbiAgbWFyZ2luLWlubGluZS1lbmQ6IDFyZW07XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDFlbTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMjAwbXM7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stbmMsb2tsY2godmFyKC0tbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7XG4gIGJvcmRlci13aWR0aDogdmFyKC0tYm9yZGVyLWJ0biwgMXB4KTtcbiAgYW5pbWF0aW9uOiBidXR0b24tcG9wIHZhcigtLWFuaW1hdGlvbi1idG4sIDAuMjVzKSBlYXNlLW91dDtcbn1cclxuLm9wLWZvb3RlciB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIHdpZHRoOiAxMDAlO1xuICBncmlkLWF1dG8tZmxvdzogcm93O1xuICBwbGFjZS1pdGVtczogc3RhcnQ7XG4gIGNvbHVtbi1nYXA6IDFyZW07XG4gIHJvdy1nYXA6IDIuNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG59XHJcbi5vcC1mb290ZXIgPiAqIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgcGxhY2UtaXRlbXM6IHN0YXJ0O1xuICBnYXA6IDAuNXJlbTtcbn1cclxuLm9wLWZvb3Rlci1jZW50ZXIge1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XHJcbi5vcC1mb290ZXItY2VudGVyID4gKiB7XG4gIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiA0OHJlbSkge1xuXG4gIC5vcC1mb290ZXIge1xuICAgIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gIH1cblxuICAub3AtZm9vdGVyLWNlbnRlciB7XG4gICAgZ3JpZC1hdXRvLWZsb3c6IHJvdyBkZW5zZTtcbiAgfVxufVxyXG4ub3AtaW5wdXQge1xuICBmbGV4LXNocmluazogMTtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gIGhlaWdodDogM3JlbTtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICBmb250LXNpemU6IDFyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xuICBsaW5lLWhlaWdodDogMS41cmVtO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC1pbnB1dFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuLm9wLWlucHV0LW1kW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xuICBtYXJnaW4tdG9wOiAtMXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogLTFyZW07XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiAtMXJlbTtcbn1cclxuLm9wLWlucHV0LXhzW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xuICBtYXJnaW4tdG9wOiAtMC4yNXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogLTAuMjVyZW07XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiAtMHB4O1xufVxyXG4ub3AtaW5wdXQtc21bdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7XG4gIG1hcmdpbi10b3A6IDBweDtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICBtYXJnaW4taW5saW5lLWVuZDogLTBweDtcbn1cclxuLm9wLWpvaW4ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xufVxyXG4ub3Atam9pbiA6d2hlcmUoLm9wLWpvaW4taXRlbSkge1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogMDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogMDtcbn1cclxuLm9wLWpvaW4gLm9wLWpvaW4taXRlbTpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpLFxuICAub3Atam9pbiAqOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAwO1xufVxyXG4ub3Atam9pbiAub3Atam9pbi1pdGVtOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCksXG4gIC5vcC1qb2luICo6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogMDtcbn1cclxuLm9wLWpvaW4gLm9wLWRyb3Bkb3duIC5vcC1qb2luLWl0ZW06Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSxcbiAgLm9wLWpvaW4gKjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIC5vcC1kcm9wZG93biAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWpvaW4gOndoZXJlKC5vcC1qb2luLWl0ZW06Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSksXG4gIC5vcC1qb2luIDp3aGVyZSgqOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSkge1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWpvaW4gLm9wLWpvaW4taXRlbTpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpLFxuICAub3Atam9pbiAqOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAwO1xufVxyXG4ub3Atam9pbiA6d2hlcmUoLm9wLWpvaW4taXRlbTpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpKSxcbiAgLm9wLWpvaW4gOndoZXJlKCo6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSAub3Atam9pbi1pdGVtKSB7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbkBzdXBwb3J0cyBub3Qgc2VsZWN0b3IoOmhhcygqKSkge1xuXG4gIDp3aGVyZSgub3Atam9pbiAqKSB7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbiAgfVxufVxyXG5Ac3VwcG9ydHMgc2VsZWN0b3IoOmhhcygqKSkge1xuXG4gIDp3aGVyZSgub3Atam9pbiAqOmhhcygub3Atam9pbi1pdGVtKSkge1xuICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG4gIH1cbn1cclxuLm9wLWxpbmsge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiB1bmRlcmxpbmU7XG59XHJcbi5vcC1tZW51IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgcGFkZGluZzogMC41cmVtO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGkgdWwpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiAxcmVtO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogMC41cmVtO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGk6bm90KC5vcC1tZW51LXRpdGxlKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSwgLm9wLWJ0bikpLCAub3AtbWVudSA6d2hlcmUobGk6bm90KC5vcC1tZW51LXRpdGxlKSA+IGRldGFpbHMgPiBzdW1tYXJ5Om5vdCgub3AtbWVudS10aXRsZSkpIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjVyZW07XG4gIGdyaWQtYXV0by1jb2x1bW5zOiBtaW5tYXgoYXV0bywgbWF4LWNvbnRlbnQpIGF1dG8gbWF4LWNvbnRlbnQ7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XHJcbi5vcC1tZW51IGxpLm9wLWRpc2FibGVkIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjMpKTtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpID4gLm9wLW1lbnUtZHJvcGRvd246bm90KC5vcC1tZW51LWRyb3Bkb3duLXNob3cpKSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XHJcbjp3aGVyZSgub3AtbWVudSBsaSkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xufVxyXG46d2hlcmUoLm9wLW1lbnUgbGkpIC5vcC1iYWRnZSB7XG4gIGp1c3RpZnktc2VsZjogZW5kO1xufVxyXG4ub3AtbW9kYWwge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBpbnNldDogMHB4O1xuICBtYXJnaW46IDBweDtcbiAgZGlzcGxheTogZ3JpZDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXgtaGVpZ2h0OiBub25lO1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiBub25lO1xuICBqdXN0aWZ5LWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDBweDtcbiAgb3BhY2l0eTogMDtcbiAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjtcbiAgei1pbmRleDogOTk5O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eSwgdmlzaWJpbGl0eTtcbiAgb3ZlcmZsb3cteTogaGlkZGVuO1xufVxyXG46d2hlcmUoLm9wLW1vZGFsKSB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XHJcbi5vcC1tb2RhbC1ib3gge1xuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gNWVtKTtcbiAgZ3JpZC1jb2x1bW4tc3RhcnQ6IDE7XG4gIGdyaWQtcm93LXN0YXJ0OiAxO1xuICB3aWR0aDogOTEuNjY2NjY3JTtcbiAgbWF4LXdpZHRoOiAzMnJlbTtcbiAgLS10dy1zY2FsZS14OiAuOTtcbiAgLS10dy1zY2FsZS15OiAuOTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBwYWRkaW5nOiAxLjVyZW07XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICBib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMjUpIDBweCAyNXB4IDUwcHggLTEycHg7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47XG59XHJcbi5vcC1tb2RhbC1vcGVuLFxuLm9wLW1vZGFsOnRhcmdldCxcbi5vcC1tb2RhbC10b2dnbGU6Y2hlY2tlZCArIC5vcC1tb2RhbCxcbi5vcC1tb2RhbFtvcGVuXSB7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICBvcGFjaXR5OiAxO1xufVxyXG46cm9vdDpoYXMoOmlzKC5vcC1tb2RhbC1vcGVuLCAub3AtbW9kYWw6dGFyZ2V0LCAub3AtbW9kYWwtdG9nZ2xlOmNoZWNrZWQgKyAub3AtbW9kYWwsIC5vcC1tb2RhbFtvcGVuXSkpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlO1xufVxyXG4ub3AtbmF2YmFyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogdmFyKC0tbmF2YmFyLXBhZGRpbmcsIDAuNXJlbSk7XG4gIG1pbi1oZWlnaHQ6IDRyZW07XG4gIHdpZHRoOiAxMDAlO1xufVxyXG46d2hlcmUoLm9wLW5hdmJhciA+ICo6bm90KHNjcmlwdCwgc3R5bGUpKSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxyXG4ub3AtcmFkaW8ge1xuICBmbGV4LXNocmluazogMDtcbiAgLS1jaGtiZzogdmFyKC0tYmMpO1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgd2lkdGg6IDEuNXJlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLXNlbGVjdCB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICBoZWlnaHQ6IDNyZW07XG4gIG1pbi1oZWlnaHQ6IDNyZW07XG4gIHBhZGRpbmctaW5saW5lLXN0YXJ0OiAxcmVtO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IDIuNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgdHJhbnNwYXJlbnQgNTAlLCBjdXJyZW50Q29sb3IgNTAlKSxcbiAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBjdXJyZW50Q29sb3IgNTAlLCB0cmFuc3BhcmVudCA1MCUpO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjYWxjKDEwMCUgLSAyMHB4KSBjYWxjKDFweCArIDUwJSksXG4gICAgY2FsYygxMDAlIC0gMTYuMXB4KSBjYWxjKDFweCArIDUwJSk7XG4gIGJhY2tncm91bmQtc2l6ZTogNHB4IDRweCxcbiAgICA0cHggNHB4O1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xufVxyXG4ub3Atc2VsZWN0W211bHRpcGxlXSB7XG4gIGhlaWdodDogYXV0bztcbn1cclxuLm9wLXRhYnMge1xuICBkaXNwbGF5OiBncmlkO1xuICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG59XHJcbi5vcC10YWJzLWxpZnRlZDpoYXMoLm9wLXRhYi1jb250ZW50W2NsYXNzXj1cIm9wLXJvdW5kZWQtXCJdKVxuICAgIC5vcC10YWI6Zmlyc3QtY2hpbGQ6bm90KDppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSksIC5vcC10YWJzLWxpZnRlZDpoYXMoLm9wLXRhYi1jb250ZW50W2NsYXNzKj1cIiBvcC1yb3VuZGVkLVwiXSlcbiAgICAub3AtdGFiOmZpcnN0LWNoaWxkOm5vdCg6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkpIHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XHJcbi5vcC10YWIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGdyaWQtcm93LXN0YXJ0OiAxO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgaGVpZ2h0OiAycmVtO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgLS10YWItcGFkZGluZzogMXJlbTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDAuNTtcbiAgLS10YWItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8xKSk7XG4gIC0tdGFiLWJnOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xuICAtLXRhYi1ib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS8xKSk7XG4gIGNvbG9yOiB2YXIoLS10YWItY29sb3IpO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogdmFyKC0tdGFiLXBhZGRpbmcsIDFyZW0pO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKTtcbn1cclxuLm9wLXRhYjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl0pIHtcbiAgd2lkdGg6IGF1dG87XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDBweDtcbn1cclxuLm9wLXRhYjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl0pOmFmdGVyIHtcbiAgLS10dy1jb250ZW50OiBhdHRyKGFyaWEtbGFiZWwpO1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbn1cclxuLm9wLXRhYjpub3QoaW5wdXQpOmVtcHR5IHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBncmlkLWNvbHVtbi1zdGFydDogc3BhbiA5OTk5O1xufVxyXG46Y2hlY2tlZCArIC5vcC10YWItY29udGVudDpudGgtY2hpbGQoMiksXG4gIDppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSArIC5vcC10YWItY29udGVudDpudGgtY2hpbGQoMikge1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiAwcHg7XG59XHJcbmlucHV0Lm9wLXRhYjpjaGVja2VkICsgLm9wLXRhYi1jb250ZW50LFxuOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pICsgLm9wLXRhYi1jb250ZW50IHtcbiAgZGlzcGxheTogYmxvY2s7XG59XHJcbi5vcC10YWJsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG59XHJcbi5vcC10YWJsZSA6d2hlcmUoLm9wLXRhYmxlLXBpbi1yb3dzIHRoZWFkIHRyKSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIHRvcDogMHB4O1xuICB6LWluZGV4OiAxO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKC5vcC10YWJsZS1waW4tcm93cyB0Zm9vdCB0cikge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICBib3R0b206IDBweDtcbiAgei1pbmRleDogMTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRhYmxlIDp3aGVyZSgub3AtdGFibGUtcGluLWNvbHMgdHIgdGgpIHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgbGVmdDogMHB4O1xuICByaWdodDogMHB4O1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdGV4dGFyZWEge1xuICBtaW4taGVpZ2h0OiAzcmVtO1xuICBmbGV4LXNocmluazogMTtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRvZ2dsZSB7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICAtLXRnbGJnOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xuICAtLWhhbmRsZW9mZnNldDogMS41cmVtO1xuICAtLWhhbmRsZW9mZnNldGNhbGN1bGF0b3I6IGNhbGModmFyKC0taGFuZGxlb2Zmc2V0KSAqIC0xKTtcbiAgLS10b2dnbGVoYW5kbGVib3JkZXI6IDAgMDtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHdpZHRoOiAzcmVtO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJhZGdlLCAxLjlyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjUpKTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCxcbiAgICBib3gtc2hhZG93IHZhcigtLWFuaW1hdGlvbi1pbnB1dCwgMC4ycykgZWFzZS1vdXQ7XG4gIGJveC1zaGFkb3c6IHZhcigtLWhhbmRsZW9mZnNldGNhbGN1bGF0b3IpIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgIDAgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQsXG4gICAgdmFyKC0tdG9nZ2xlaGFuZGxlYm9yZGVyKTtcbn1cclxuLm9wLWFsZXJ0LWluZm8ge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS8wLjIpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbmMsb2tsY2godmFyKC0taW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tYWxlcnQtYmc6IHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS8xKSk7XG4gIC0tYWxlcnQtYmctbWl4OiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xufVxyXG4ub3AtYWxlcnQtc3VjY2VzcyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpLzAuMikpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1Yyxva2xjaCh2YXIoLS1zdWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS1hbGVydC1iZzogdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpLzEpKTtcbiAgLS1hbGVydC1iZy1taXg6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSk7XG59XHJcbi5vcC1hbGVydC13YXJuaW5nIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMC4yKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2std2FjLG9rbGNoKHZhcigtLXdhYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLWFsZXJ0LWJnOiB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMSkpO1xuICAtLWFsZXJ0LWJnLW1peDogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbn1cclxuLm9wLWFsZXJ0LWVycm9yIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMC4yKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stZXJjLG9rbGNoKHZhcigtLWVyYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLWFsZXJ0LWJnOiB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpO1xuICAtLWFsZXJ0LWJnLW1peDogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbn1cclxuLm9wLWJhZGdlLXByaW1hcnkge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1iYWRnZS1vdXRsaW5lLm9wLWJhZGdlLXByaW1hcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IG5vLXByZWZlcmVuY2UpIHtcblxuICAub3AtYnRuIHtcbiAgICBhbmltYXRpb246IGJ1dHRvbi1wb3AgdmFyKC0tYW5pbWF0aW9uLWJ0biwgMC4yNXMpIGVhc2Utb3V0O1xuICB9XG59XHJcbi5vcC1idG46YWN0aXZlOmhvdmVyLFxuICAub3AtYnRuOmFjdGl2ZTpmb2N1cyB7XG4gIGFuaW1hdGlvbjogYnV0dG9uLXBvcCAwcyBlYXNlLW91dDtcbiAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1idG4tZm9jdXMtc2NhbGUsIDAuOTcpKTtcbn1cclxuQHN1cHBvcnRzIG5vdCAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAub3AtYnRuIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1idG4tY29sb3IsIHZhcigtLWZhbGxiYWNrLWIyKSk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idG4tY29sb3IsIHZhcigtLWZhbGxiYWNrLWIyKSk7XG4gIH1cblxuICAub3AtYnRuLXByaW1hcnkge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wKTtcbiAgfVxuXG4gIC5vcC1idG4tc2Vjb25kYXJ5IHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyk7XG4gIH1cblxuICAub3AtYnRuLWFjY2VudCB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWZhbGxiYWNrLWEpO1xuICB9XG5cbiAgLm9wLWJ0bi1uZXV0cmFsIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2stbik7XG4gIH1cblxuICAub3AtYnRuLWluZm8ge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbik7XG4gIH1cblxuICAub3AtYnRuLWVycm9yIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2stZXIpO1xuICB9XG59XHJcbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gIC5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoXG4gICAgICAgICAgaW4gb2tsYWIsXG4gICAgICAgICAgb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMykpIC8gdmFyKC0tdHctYmctb3BhY2l0eSwgMSkpIDkwJSxcbiAgICAgICAgICBibGFja1xuICAgICAgICApO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KFxuICAgICAgICAgIGluIG9rbGFiLFxuICAgICAgICAgIG9rbGNoKHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tYjMpKSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5LCAxKSkgOTAlLFxuICAgICAgICAgIGJsYWNrXG4gICAgICAgICk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnkub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS8xKSkgOTAlLCBibGFjayk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXNlY29uZGFyeS5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA5MCUsIGJsYWNrKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tYWNjZW50Lm9wLWJ0bi1hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDkwJSwgYmxhY2spO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zdWNjZXNzLm9wLWJ0bi1hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpLzEpKSA5MCUsIGJsYWNrKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4taW5mby5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS8xKSkgOTAlLCBibGFjayk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXdhcm5pbmcub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMSkpIDkwJSwgYmxhY2spO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1lcnJvci5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS8xKSkgOTAlLCBibGFjayk7XG4gIH1cbn1cclxuLm9wLWJ0bjpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWJ0bi1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKTtcbn1cclxuQHN1cHBvcnRzIChjb2xvcjogb2tsY2goMCUgMCAwKSkge1xuXG4gIC5vcC1idG4tcHJpbWFyeSB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLXApO1xuICB9XG5cbiAgLm9wLWJ0bi1zZWNvbmRhcnkge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1zKTtcbiAgfVxuXG4gIC5vcC1idG4tYWNjZW50IHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tYSk7XG4gIH1cblxuICAub3AtYnRuLW5ldXRyYWwge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1uKTtcbiAgfVxuXG4gIC5vcC1idG4taW5mbyB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWluKTtcbiAgfVxuXG4gIC5vcC1idG4tZXJyb3Ige1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1lcik7XG4gIH1cbn1cclxuLm9wLWJ0bi1zZWNvbmRhcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXNjLG9rbGNoKHZhcigtLXNjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvMSkpO1xufVxyXG4ub3AtYnRuLWFjY2VudCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYWMsb2tsY2godmFyKC0tYWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS8xKSk7XG59XHJcbi5vcC1idG4tbmV1dHJhbCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stbmMsb2tsY2godmFyKC0tbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS8xKSk7XG59XHJcbi5vcC1idG4taW5mbyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW5jLG9rbGNoKHZhcigtLWluYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpO1xufVxyXG4ub3AtYnRuLWVycm9yIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcmMsb2tsY2godmFyKC0tZXJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS8xKSk7XG59XHJcbi5vcC1idG4ub3AtZ2xhc3Mge1xuICAtLXR3LXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXNoYWRvdyk7XG4gIG91dGxpbmUtY29sb3I6IGN1cnJlbnRDb2xvcjtcbn1cclxuLm9wLWJ0bi5vcC1nbGFzcy5vcC1idG4tYWN0aXZlIHtcbiAgLS1nbGFzcy1vcGFjaXR5OiAyNSU7XG4gIC0tZ2xhc3MtYm9yZGVyLW9wYWNpdHk6IDE1JTtcbn1cclxuLm9wLWJ0bi1naG9zdCB7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgLS10dy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xuICBvdXRsaW5lLWNvbG9yOiBjdXJyZW50Q29sb3I7XG59XHJcbi5vcC1idG4tZ2hvc3Qub3AtYnRuLWFjdGl2ZSB7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLWJ0bi1saW5rLm9wLWJ0bi1hY3RpdmUge1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lIHtcbiAgYm9yZGVyLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMCAjMDAwMDtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnkub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcGMsb2tsY2godmFyKC0tcGMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zZWNvbmRhcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXNlY29uZGFyeS5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zYyxva2xjaCh2YXIoLS1zYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tYWNjZW50Lm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWFjLG9rbGNoKHZhcigtLWFjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tc3VjY2VzcyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zdWNjZXNzLm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1Yyxva2xjaCh2YXIoLS1zdWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1pbmZvIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWluZm8ub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW5jLG9rbGNoKHZhcigtLWluYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXdhcm5pbmcge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhLG9rbGNoKHZhcigtLXdhKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4td2FybmluZy5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay13YWMsb2tsY2godmFyKC0td2FjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3Ige1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3Iub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stZXJjLG9rbGNoKHZhcigtLWVyYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLm9wLWJ0bi1kaXNhYmxlZCxcbiAgLm9wLWJ0bltkaXNhYmxlZF0sXG4gIC5vcC1idG46ZGlzYWJsZWQge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMC4yO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCksXG4ub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJyYWRpb1wiXTpjaGVja2VkKSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcGMsb2tsY2godmFyKC0tcGMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCk6Zm9jdXMtdmlzaWJsZSwgLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl06Y2hlY2tlZCk6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpO1xufVxyXG5Aa2V5ZnJhbWVzIGJ1dHRvbi1wb3Age1xuXG4gIDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKHZhcigtLWJ0bi1mb2N1cy1zY2FsZSwgMC45OCkpO1xuICB9XG5cbiAgNDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMDIpO1xuICB9XG5cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgfVxufVxyXG4ub3AtY2FyZCA6d2hlcmUoZmlndXJlOmZpcnN0LWNoaWxkKSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogdW5zZXQ7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogdW5zZXQ7XG59XHJcbi5vcC1jYXJkIDp3aGVyZShmaWd1cmU6bGFzdC1jaGlsZCkge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiB1bnNldDtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IHVuc2V0O1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG4ub3AtY2FyZDpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWNhcmQub3AtYm9yZGVyZWQge1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcbi5vcC1jYXJkLm9wLWNvbXBhY3QgLm9wLWNhcmQtYm9keSB7XG4gIHBhZGRpbmc6IDFyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xufVxyXG4ub3AtY2FyZC10aXRsZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC41cmVtO1xuICBmb250LXNpemU6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjc1cmVtO1xuICBmb250LXdlaWdodDogNjAwO1xufVxyXG4ub3AtY2FyZC5vcC1pbWFnZS1mdWxsIDp3aGVyZShmaWd1cmUpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWNoZWNrYm94OmZvY3VzIHtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cclxuLm9wLWNoZWNrYm94OmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpO1xufVxyXG4ub3AtY2hlY2tib3g6ZGlzYWJsZWQge1xuICBib3JkZXItd2lkdGg6IDBweDtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtY2hlY2tib3g6Y2hlY2tlZCxcbiAgLm9wLWNoZWNrYm94W2FyaWEtY2hlY2tlZD1cInRydWVcIl0ge1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBhbmltYXRpb246IGNoZWNrbWFyayB2YXIoLS1hbmltYXRpb24taW5wdXQsIDAuMnMpIGVhc2Utb3V0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jaGtiZyk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCgtNDVkZWcsIHRyYW5zcGFyZW50IDY1JSwgdmFyKC0tY2hrYmcpIDY1Ljk5JSksXG4gICAgICBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHRyYW5zcGFyZW50IDc1JSwgdmFyKC0tY2hrYmcpIDc1Ljk5JSksXG4gICAgICBsaW5lYXItZ3JhZGllbnQoLTQ1ZGVnLCB2YXIoLS1jaGtiZykgNDAlLCB0cmFuc3BhcmVudCA0MC45OSUpLFxuICAgICAgbGluZWFyLWdyYWRpZW50KFxuICAgICAgICA0NWRlZyxcbiAgICAgICAgdmFyKC0tY2hrYmcpIDMwJSxcbiAgICAgICAgdmFyKC0tY2hrZmcpIDMwLjk5JSxcbiAgICAgICAgdmFyKC0tY2hrZmcpIDQwJSxcbiAgICAgICAgdHJhbnNwYXJlbnQgNDAuOTklXG4gICAgICApLFxuICAgICAgbGluZWFyLWdyYWRpZW50KC00NWRlZywgdmFyKC0tY2hrZmcpIDUwJSwgdmFyKC0tY2hrYmcpIDUwLjk5JSk7XG59XHJcbi5vcC1jaGVja2JveDppbmRldGVybWluYXRlIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYW5pbWF0aW9uOiBjaGVja21hcmsgdmFyKC0tYW5pbWF0aW9uLWlucHV0LCAwLjJzKSBlYXNlLW91dDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCA4MCUsIHZhcigtLWNoa2JnKSA4MCUpLFxuICAgICAgbGluZWFyLWdyYWRpZW50KC05MGRlZywgdHJhbnNwYXJlbnQgODAlLCB2YXIoLS1jaGtiZykgODAlKSxcbiAgICAgIGxpbmVhci1ncmFkaWVudCgwZGVnLCB2YXIoLS1jaGtiZykgNDMlLCB2YXIoLS1jaGtmZykgNDMlLCB2YXIoLS1jaGtmZykgNTclLCB2YXIoLS1jaGtiZykgNTclKTtcbn1cclxuQGtleWZyYW1lcyBjaGVja21hcmsge1xuXG4gIDAlIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uLXk6IDVweDtcbiAgfVxuXG4gIDUwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbi15OiAtMnB4O1xuICB9XG5cbiAgMTAwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbi15OiAwO1xuICB9XG59XHJcbi5vcC1kaXZpZGVyOm5vdCg6ZW1wdHkpIHtcbiAgZ2FwOiAxcmVtO1xufVxyXG4ub3AtZHJvcGRvd24ub3AtZHJvcGRvd24tb3BlbiAub3AtZHJvcGRvd24tY29udGVudCxcbi5vcC1kcm9wZG93bjpmb2N1cyAub3AtZHJvcGRvd24tY29udGVudCxcbi5vcC1kcm9wZG93bjpmb2N1cy13aXRoaW4gLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICAtLXR3LXNjYWxlLXg6IDE7XG4gIC0tdHctc2NhbGUteTogMTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcbi5vcC1maWxlLWlucHV0LWJvcmRlcmVkIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtZmlsZS1pbnB1dDpmb2N1cyB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLWZpbGUtaW5wdXQtZGlzYWJsZWQsXG4gIC5vcC1maWxlLWlucHV0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtZmlsZS1pbnB1dC1kaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC1maWxlLWlucHV0W2Rpc2FibGVkXTo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtZmlsZS1pbnB1dC1kaXNhYmxlZDo6ZmlsZS1zZWxlY3Rvci1idXR0b24sIC5vcC1maWxlLWlucHV0W2Rpc2FibGVkXTo6ZmlsZS1zZWxlY3Rvci1idXR0b24ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMC4yO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWlucHV0IGlucHV0IHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxyXG4ub3AtaW5wdXQgaW5wdXQ6Zm9jdXMge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1pbnB1dFtsaXN0XTo6LXdlYmtpdC1jYWxlbmRhci1waWNrZXItaW5kaWNhdG9yIHtcbiAgbGluZS1oZWlnaHQ6IDFlbTtcbn1cclxuLm9wLWlucHV0LWJvcmRlcmVkIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC1pbnB1dDpmb2N1cyxcbiAgLm9wLWlucHV0OmZvY3VzLXdpdGhpbiB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC1pbnB1dDpoYXMoPiBpbnB1dFtkaXNhYmxlZF0pLFxuICAub3AtaW5wdXQtZGlzYWJsZWQsXG4gIC5vcC1pbnB1dDpkaXNhYmxlZCxcbiAgLm9wLWlucHV0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuNCkpO1xufVxyXG4ub3AtaW5wdXQ6aGFzKD4gaW5wdXRbZGlzYWJsZWRdKTo6cGxhY2Vob2xkZXIsXG4gIC5vcC1pbnB1dC1kaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC1pbnB1dDpkaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC1pbnB1dFtkaXNhYmxlZF06OnBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5KSkpO1xuICAtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWlucHV0Omhhcyg+IGlucHV0W2Rpc2FibGVkXSkgPiBpbnB1dFtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxyXG4ub3AtaW5wdXQ6Oi13ZWJraXQtZGF0ZS1hbmQtdGltZS12YWx1ZSB7XG4gIHRleHQtYWxpZ246IGluaGVyaXQ7XG59XHJcbi5vcC1qb2luID4gOndoZXJlKCo6bm90KDpmaXJzdC1jaGlsZCkpIHtcbiAgbWFyZ2luLXRvcDogMHB4O1xuICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IC0xcHg7XG59XHJcbi5vcC1qb2luID4gOndoZXJlKCo6bm90KDpmaXJzdC1jaGlsZCkpOmlzKC5vcC1idG4pIHtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogY2FsYyh2YXIoLS1ib3JkZXItYnRuKSAqIC0xKTtcbn1cclxuLm9wLWpvaW4taXRlbTpmb2N1cyB7XG4gIGlzb2xhdGlvbjogaXNvbGF0ZTtcbn1cclxuLm9wLWxpbmstcHJpbWFyeSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbkBzdXBwb3J0cyAoY29sb3I6Y29sb3ItbWl4KGluIG9rbGFiLGJsYWNrLGJsYWNrKSkge1xuXG4gIEBtZWRpYSAoaG92ZXI6aG92ZXIpIHtcblxuICAgIC5vcC1saW5rLXByaW1hcnk6aG92ZXIge1xuICAgICAgY29sb3I6IGNvbG9yLW1peChpbiBva2xhYix2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA4MCUsYmxhY2spO1xuICAgIH1cblxuICAgIC5vcC1saW5rLXNlY29uZGFyeTpob3ZlciB7XG4gICAgICBjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvMSkpIDgwJSxibGFjayk7XG4gICAgfVxuXG4gICAgLm9wLWxpbmstYWNjZW50OmhvdmVyIHtcbiAgICAgIGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS8xKSkgODAlLGJsYWNrKTtcbiAgICB9XG4gIH1cbn1cclxuLm9wLWxpbmstc2Vjb25kYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWxpbmstYWNjZW50IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1hLG9rbGNoKHZhcigtLWEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWxpbms6Zm9jdXMge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1saW5rOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lOiAycHggc29saWQgY3VycmVudENvbG9yO1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3AtbG9hZGluZyB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGFzcGVjdC1yYXRpbzogMSAvIDE7XG4gIHdpZHRoOiAxLjVyZW07XG4gIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgLXdlYmtpdC1tYXNrLXNpemU6IDEwMCU7XG4gICAgICAgICAgbWFzay1zaXplOiAxMDAlO1xuICAtd2Via2l0LW1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgICAgICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xuICAtd2Via2l0LW1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX199KTtcbiAgICAgICAgICBtYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19ffSk7XG59XHJcbi5vcC1sb2FkaW5nLWluZmluaXR5IHtcbiAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19ffSk7XG4gICAgICAgICAgbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xufVxyXG46d2hlcmUoLm9wLW1lbnUgbGk6ZW1wdHkpIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgb3BhY2l0eTogMC4xO1xuICBtYXJnaW46IDAuNXJlbSAxcmVtO1xuICBoZWlnaHQ6IDFweDtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpIHVsKTpiZWZvcmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogMC43NXJlbTtcbiAgaW5zZXQtaW5saW5lLXN0YXJ0OiAwcHg7XG4gIHRvcDogMC43NXJlbTtcbiAgd2lkdGg6IDFweDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgb3BhY2l0eTogMC4xO1xuICBjb250ZW50OiBcIlwiO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGk6bm90KC5vcC1tZW51LXRpdGxlKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSwgLm9wLWJ0bikpLFxuLm9wLW1lbnUgOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKSB7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDFyZW07XG4gIHBhZGRpbmctdG9wOiAwLjVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAwLjVyZW07XG4gIHRleHQtYWxpZ246IHN0YXJ0O1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAyMDBtcztcbiAgdGV4dC13cmFwOiBiYWxhbmNlO1xufVxyXG46d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlKSk6bm90KHN1bW1hcnksIC5vcC1hY3RpdmUsIC5vcC1idG4pLm9wLWZvY3VzLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlKSk6bm90KHN1bW1hcnksIC5vcC1hY3RpdmUsIC5vcC1idG4pOmZvY3VzLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlKSk6aXMoc3VtbWFyeSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmZvY3VzLXZpc2libGUsIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKTpub3Qoc3VtbWFyeSwgLm9wLWFjdGl2ZSwgLm9wLWJ0bikub3AtZm9jdXMsIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKTpub3Qoc3VtbWFyeSwgLm9wLWFjdGl2ZSwgLm9wLWJ0bik6Zm9jdXMsIDp3aGVyZSgub3AtbWVudSBsaTpub3QoLm9wLW1lbnUtdGl0bGUsIC5vcC1kaXNhYmxlZCkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKTppcyhzdW1tYXJ5KTpub3QoLm9wLWFjdGl2ZSwgLm9wLWJ0bik6Zm9jdXMtdmlzaWJsZSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLW1lbnUgbGkgPiAqOm5vdCh1bCwgLm9wLW1lbnUtdGl0bGUsIGRldGFpbHMsIC5vcC1idG4pOmFjdGl2ZSxcbi5vcC1tZW51IGxpID4gKjpub3QodWwsIC5vcC1tZW51LXRpdGxlLCBkZXRhaWxzLCAub3AtYnRuKS5vcC1hY3RpdmUsXG4ub3AtbWVudSBsaSA+IGRldGFpbHMgPiBzdW1tYXJ5OmFjdGl2ZSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW5jLG9rbGNoKHZhcigtLW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaSA+IGRldGFpbHMgPiBzdW1tYXJ5KTo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaSA+IGRldGFpbHMgPiBzdW1tYXJ5KTphZnRlcixcbi5vcC1tZW51IDp3aGVyZShsaSA+IC5vcC1tZW51LWRyb3Bkb3duLXRvZ2dsZSk6YWZ0ZXIge1xuICBqdXN0aWZ5LXNlbGY6IGVuZDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi10b3A6IC0wLjVyZW07XG4gIGhlaWdodDogMC41cmVtO1xuICB3aWR0aDogMC41cmVtO1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgbWFyZ2luLXRvcDtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHRyYW5zZm9ybS1vcmlnaW46IDc1JSA3NSU7XG4gIGJveC1zaGFkb3c6IDJweCAycHg7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGkgPiBkZXRhaWxzW29wZW5dID4gc3VtbWFyeSk6YWZ0ZXIsXG4ub3AtbWVudSA6d2hlcmUobGkgPiAub3AtbWVudS1kcm9wZG93bi10b2dnbGUub3AtbWVudS1kcm9wZG93bi1zaG93KTphZnRlciB7XG4gIHRyYW5zZm9ybTogcm90YXRlKDIyNWRlZyk7XG4gIG1hcmdpbi10b3A6IDA7XG59XHJcbi5vcC1tb2NrdXAtYnJvd3NlciAub3AtbW9ja3VwLWJyb3dzZXItdG9vbGJhciAub3AtaW5wdXQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDEuNzVyZW07XG4gIHdpZHRoOiAyNHJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIHBhZGRpbmctbGVmdDogMnJlbTtcbiAgZGlyZWN0aW9uOiBsdHI7XG59XHJcbi5vcC1tb2NrdXAtYnJvd3NlciAub3AtbW9ja3VwLWJyb3dzZXItdG9vbGJhciAub3AtaW5wdXQ6YmVmb3JlIHtcbiAgY29udGVudDogXCJcIjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAwLjVyZW07XG4gIHRvcDogNTAlO1xuICBhc3BlY3QtcmF0aW86IDEgLyAxO1xuICBoZWlnaHQ6IDAuNzVyZW07XG4gIC0tdHctdHJhbnNsYXRlLXk6IC01MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIGJvcmRlci13aWR0aDogMnB4O1xuICBib3JkZXItY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgb3BhY2l0eTogMC42O1xufVxyXG4ub3AtbW9ja3VwLWJyb3dzZXIgLm9wLW1vY2t1cC1icm93c2VyLXRvb2xiYXIgLm9wLWlucHV0OmFmdGVyIHtcbiAgY29udGVudDogXCJcIjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAxLjI1cmVtO1xuICB0b3A6IDUwJTtcbiAgaGVpZ2h0OiAwLjVyZW07XG4gIC0tdHctdHJhbnNsYXRlLXk6IDI1JTtcbiAgLS10dy1yb3RhdGU6IC00NWRlZztcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogY3VycmVudENvbG9yO1xuICBvcGFjaXR5OiAwLjY7XG59XHJcbi5vcC1tb2RhbDpub3QoZGlhbG9nOm5vdCgub3AtbW9kYWwtb3BlbikpLFxuICAub3AtbW9kYWw6OmJhY2tkcm9wIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDY7XG4gIGFuaW1hdGlvbjogbW9kYWwtcG9wIDAuMnMgZWFzZS1vdXQ7XG59XHJcbi5vcC1tb2RhbC1vcGVuIC5vcC1tb2RhbC1ib3gsXG4ub3AtbW9kYWwtdG9nZ2xlOmNoZWNrZWQgKyAub3AtbW9kYWwgLm9wLW1vZGFsLWJveCxcbi5vcC1tb2RhbDp0YXJnZXQgLm9wLW1vZGFsLWJveCxcbi5vcC1tb2RhbFtvcGVuXSAub3AtbW9kYWwtYm94IHtcbiAgLS10dy10cmFuc2xhdGUteTogMHB4O1xuICAtLXR3LXNjYWxlLXg6IDE7XG4gIC0tdHctc2NhbGUteTogMTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcbkBrZXlmcmFtZXMgbW9kYWwtcG9wIHtcblxuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxufVxyXG5Aa2V5ZnJhbWVzIHByb2dyZXNzLWxvYWRpbmcge1xuXG4gIDUwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbi14OiAtMTE1JTtcbiAgfVxufVxyXG4ub3AtcmFkaW86Zm9jdXMge1xuICBib3gtc2hhZG93OiBub25lO1xufVxyXG4ub3AtcmFkaW86Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8xKSk7XG59XHJcbi5vcC1yYWRpbzpjaGVja2VkLFxuICAub3AtcmFkaW9bYXJpYS1jaGVja2VkPVwidHJ1ZVwiXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIGFuaW1hdGlvbjogcmFkaW9tYXJrIHZhcigtLWFuaW1hdGlvbi1pbnB1dCwgMC4ycykgZWFzZS1vdXQ7XG4gIGJveC1zaGFkb3c6IDAgMCAwIDRweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0LFxuICAgICAgMCAwIDAgNHB4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQ7XG59XHJcbi5vcC1yYWRpbzpkaXNhYmxlZCB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIG9wYWNpdHk6IDAuMjtcbn1cclxuQGtleWZyYW1lcyByYWRpb21hcmsge1xuXG4gIDAlIHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAxMnB4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQsXG4gICAgICAwIDAgMCAxMnB4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQ7XG4gIH1cblxuICA1MCUge1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0LFxuICAgICAgMCAwIDAgM3B4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQ7XG4gIH1cblxuICAxMDAlIHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCA0cHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldCxcbiAgICAgIDAgMCAwIDRweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0O1xuICB9XG59XHJcbkBrZXlmcmFtZXMgcmF0aW5nLXBvcCB7XG5cbiAgMCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMC4xMjVlbSk7XG4gIH1cblxuICA0MCUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMC4xMjVlbSk7XG4gIH1cblxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XG4gIH1cbn1cclxuLm9wLXNlbGVjdC1ib3JkZXJlZCB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3Atc2VsZWN0OmZvY3VzIHtcbiAgYm94LXNoYWRvdzogbm9uZTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLXNlbGVjdC1kaXNhYmxlZCxcbiAgLm9wLXNlbGVjdDpkaXNhYmxlZCxcbiAgLm9wLXNlbGVjdFtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjQpKTtcbn1cclxuLm9wLXNlbGVjdC1kaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC1zZWxlY3Q6ZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3Atc2VsZWN0W2Rpc2FibGVkXTo6cGxhY2Vob2xkZXIge1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eTogMC4yO1xufVxyXG4ub3Atc2VsZWN0LW11bHRpcGxlLFxuICAub3Atc2VsZWN0W211bHRpcGxlXSxcbiAgLm9wLXNlbGVjdFtzaXplXS5vcC1zZWxlY3Q6bm90KFtzaXplPVwiMVwiXSkge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xufVxyXG5bZGlyPVwicnRsXCJdIC5vcC1zZWxlY3Qge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjYWxjKDAlICsgMTJweCkgY2FsYygxcHggKyA1MCUpLFxuICAgIGNhbGMoMCUgKyAxNnB4KSBjYWxjKDFweCArIDUwJSk7XG59XHJcbkBrZXlmcmFtZXMgc2tlbGV0b24ge1xuXG4gIGZyb20ge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDE1MCU7XG4gIH1cblxuICB0byB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTUwJTtcbiAgfVxufVxyXG4ub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmZvY3VzLXZpc2libGUge1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiAwO1xufVxyXG4ub3AtdGFiOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSksIC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCkge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG59XHJcbi5vcC10YWI6Zm9jdXMge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC10YWI6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAtNXB4O1xufVxyXG4ub3AtdGFiLWRpc2FibGVkLFxuICAub3AtdGFiW2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMC4yO1xufVxyXG4ub3AtdGFicy1ib3JkZXJlZCA+IC5vcC10YWIge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMC4yO1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICBib3JkZXItYm90dG9tLXdpZHRoOiBjYWxjKHZhcigtLXRhYi1ib3JkZXIsIDFweCkgKyAxcHgpO1xufVxyXG4ub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiIHtcbiAgYm9yZGVyOiB2YXIoLS10YWItYm9yZGVyLCAxcHgpIHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItd2lkdGg6IDAgMCB2YXIoLS10YWItYm9yZGVyLCAxcHgpIDA7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IHZhcigtLXRhYi1yYWRpdXMsIDAuNXJlbSk7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiB2YXIoLS10YWItcmFkaXVzLCAwLjVyZW0pO1xuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS10YWItYm9yZGVyLWNvbG9yKTtcbiAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS10YWItcGFkZGluZywgMXJlbSk7XG4gIHBhZGRpbmctdG9wOiB2YXIoLS10YWItYm9yZGVyLCAxcHgpO1xufVxyXG4ub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSksIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10YWItYmcpO1xuICBib3JkZXItd2lkdGg6IHZhcigtLXRhYi1ib3JkZXIsIDFweCkgdmFyKC0tdGFiLWJvcmRlciwgMXB4KSAwIHZhcigtLXRhYi1ib3JkZXIsIDFweCk7XG4gIGJvcmRlci1pbmxpbmUtc3RhcnQtY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpO1xuICBib3JkZXItaW5saW5lLWVuZC1jb2xvcjogdmFyKC0tdGFiLWJvcmRlci1jb2xvcik7XG4gIGJvcmRlci10b3AtY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogY2FsYyh2YXIoLS10YWItcGFkZGluZywgMXJlbSkgLSB2YXIoLS10YWItYm9yZGVyLCAxcHgpKTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiBjYWxjKHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKSAtIHZhcigtLXRhYi1ib3JkZXIsIDFweCkpO1xuICBwYWRkaW5nLWJvdHRvbTogdmFyKC0tdGFiLWJvcmRlciwgMXB4KTtcbiAgcGFkZGluZy10b3A6IDA7XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpiZWZvcmUsIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCk6YmVmb3JlIHtcbiAgei1pbmRleDogMTtcbiAgY29udGVudDogXCJcIjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IGNhbGMoMTAwJSArIHZhcigtLXRhYi1yYWRpdXMsIDAuNXJlbSkgKiAyKTtcbiAgaGVpZ2h0OiB2YXIoLS10YWItcmFkaXVzLCAwLjVyZW0pO1xuICBib3R0b206IDA7XG4gIGJhY2tncm91bmQtc2l6ZTogdmFyKC0tdGFiLXJhZGl1cywgMC41cmVtKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIGxlZnQsXG4gICAgICAgIHRvcCByaWdodDtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgLS10YWItZ3JhZDogY2FsYyg2OSUgLSB2YXIoLS10YWItYm9yZGVyLCAxcHgpKTtcbiAgLS1yYWRpdXMtc3RhcnQ6IHJhZGlhbC1ncmFkaWVudChcbiAgICAgICAgY2lyY2xlIGF0IHRvcCBsZWZ0LFxuICAgICAgICB0cmFuc3BhcmVudCB2YXIoLS10YWItZ3JhZCksXG4gICAgICAgIHZhcigtLXRhYi1ib3JkZXItY29sb3IpIGNhbGModmFyKC0tdGFiLWdyYWQpICsgMC4yNXB4KSxcbiAgICAgICAgdmFyKC0tdGFiLWJvcmRlci1jb2xvcikgY2FsYyh2YXIoLS10YWItZ3JhZCkgKyB2YXIoLS10YWItYm9yZGVyLCAxcHgpKSxcbiAgICAgICAgdmFyKC0tdGFiLWJnKSBjYWxjKHZhcigtLXRhYi1ncmFkKSArIHZhcigtLXRhYi1ib3JkZXIsIDFweCkgKyAwLjI1cHgpXG4gICAgICApO1xuICAtLXJhZGl1cy1lbmQ6IHJhZGlhbC1ncmFkaWVudChcbiAgICAgICAgY2lyY2xlIGF0IHRvcCByaWdodCxcbiAgICAgICAgdHJhbnNwYXJlbnQgdmFyKC0tdGFiLWdyYWQpLFxuICAgICAgICB2YXIoLS10YWItYm9yZGVyLWNvbG9yKSBjYWxjKHZhcigtLXRhYi1ncmFkKSArIDAuMjVweCksXG4gICAgICAgIHZhcigtLXRhYi1ib3JkZXItY29sb3IpIGNhbGModmFyKC0tdGFiLWdyYWQpICsgdmFyKC0tdGFiLWJvcmRlciwgMXB4KSksXG4gICAgICAgIHZhcigtLXRhYi1iZykgY2FsYyh2YXIoLS10YWItZ3JhZCkgKyB2YXIoLS10YWItYm9yZGVyLCAxcHgpICsgMC4yNXB4KVxuICAgICAgKTtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLXN0YXJ0KSwgdmFyKC0tcmFkaXVzLWVuZCk7XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpmaXJzdC1jaGlsZDpiZWZvcmUsIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCk6Zmlyc3QtY2hpbGQ6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLWVuZCk7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCByaWdodDtcbn1cclxuW2Rpcj1cInJ0bFwiXSAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSk6Zmlyc3QtY2hpbGQ6YmVmb3JlLCBbZGlyPVwicnRsXCJdIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCk6Zmlyc3QtY2hpbGQ6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLXN0YXJ0KTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIGxlZnQ7XG59XHJcbi5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpsYXN0LWNoaWxkOmJlZm9yZSwgLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKTpsYXN0LWNoaWxkOmJlZm9yZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLXJhZGl1cy1zdGFydCk7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCBsZWZ0O1xufVxyXG5bZGlyPVwicnRsXCJdIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKTpsYXN0LWNoaWxkOmJlZm9yZSwgW2Rpcj1cInJ0bFwiXSAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpOmxhc3QtY2hpbGQ6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLWVuZCk7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCByaWdodDtcbn1cclxuLm9wLXRhYnMtbGlmdGVkXG4gID4gOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSlcbiAgKyAub3AtdGFicy1saWZ0ZWRcbiAgOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSk6YmVmb3JlLCAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpICsgLm9wLXRhYnMtbGlmdGVkIC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCk6YmVmb3JlIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0tcmFkaXVzLWVuZCk7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCByaWdodDtcbn1cclxuLm9wLXRhYnMtYm94ZWQge1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgcGFkZGluZzogMC4yNXJlbTtcbn1cclxuLm9wLXRhYnMtYm94ZWQgLm9wLXRhYiB7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xufVxyXG4ub3AtdGFicy1ib3hlZCA6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSk6bm90KC5vcC10YWItZGlzYWJsZWQpOm5vdChbZGlzYWJsZWRdKSwgLm9wLXRhYnMtYm94ZWQgOmlzKGlucHV0OmNoZWNrZWQpIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcGMsb2tsY2godmFyKC0tcGMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRhYmxlOndoZXJlKFtkaXI9XCJydGxcIl0sIFtkaXI9XCJydGxcIl0gKikge1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cclxuLm9wLXRhYmxlIDp3aGVyZSh0aCwgdGQpIHtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICBwYWRkaW5nLXRvcDogMC43NXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuNzVyZW07XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XHJcbi5vcC10YWJsZSB0ci5vcC1hY3RpdmUsXG4gIC5vcC10YWJsZSB0ci5vcC1hY3RpdmU6bnRoLWNoaWxkKGV2ZW4pLFxuICAub3AtdGFibGUtemVicmEgdGJvZHkgdHI6bnRoLWNoaWxkKGV2ZW4pIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRhYmxlIDp3aGVyZSh0aGVhZCB0ciwgdGJvZHkgdHI6bm90KDpsYXN0LWNoaWxkKSwgdGJvZHkgdHI6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCkge1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAxcHg7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRhYmxlIDp3aGVyZSh0aGVhZCwgdGZvb3QpIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xuICBsaW5lLWhlaWdodDogMXJlbTtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjYpKTtcbn1cclxuLm9wLXRhYmxlIDp3aGVyZSh0Zm9vdCkge1xuICBib3JkZXItdG9wLXdpZHRoOiAxcHg7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci10b3AtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHRhcmVhLWJvcmRlcmVkIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC10ZXh0YXJlYTpmb2N1cyB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC10ZXh0YXJlYS1kaXNhYmxlZCxcbiAgLm9wLXRleHRhcmVhOmRpc2FibGVkLFxuICAub3AtdGV4dGFyZWFbZGlzYWJsZWRdIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC40KSk7XG59XHJcbi5vcC10ZXh0YXJlYS1kaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC10ZXh0YXJlYTpkaXNhYmxlZDo6cGxhY2Vob2xkZXIsXG4gIC5vcC10ZXh0YXJlYVtkaXNhYmxlZF06OnBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5KSkpO1xuICAtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuQGtleWZyYW1lcyB0b2FzdC1wb3Age1xuXG4gIDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOSk7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxufVxyXG5bZGlyPVwicnRsXCJdIC5vcC10b2dnbGUge1xuICAtLWhhbmRsZW9mZnNldGNhbGN1bGF0b3I6IGNhbGModmFyKC0taGFuZGxlb2Zmc2V0KSAqIDEpO1xufVxyXG4ub3AtdG9nZ2xlOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC10b2dnbGU6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG59XHJcbi5vcC10b2dnbGU6Y2hlY2tlZCxcbiAgLm9wLXRvZ2dsZVthcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yOiB2YXIoLS1oYW5kbGVvZmZzZXQpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbltkaXI9XCJydGxcIl0gLm9wLXRvZ2dsZTpjaGVja2VkLCBbZGlyPVwicnRsXCJdIC5vcC10b2dnbGVbYXJpYS1jaGVja2VkPVwidHJ1ZVwiXSB7XG4gIC0taGFuZGxlb2Zmc2V0Y2FsY3VsYXRvcjogY2FsYyh2YXIoLS1oYW5kbGVvZmZzZXQpICogLTEpO1xufVxyXG4ub3AtdG9nZ2xlOmluZGV0ZXJtaW5hdGUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIGJveC1zaGFkb3c6IGNhbGModmFyKC0taGFuZGxlb2Zmc2V0KSAvIDIpIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgICAgY2FsYyh2YXIoLS1oYW5kbGVvZmZzZXQpIC8gLTIpIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgICAgMCAwIDAgMnB4IHZhcigtLXRnbGJnKSBpbnNldDtcbn1cclxuW2Rpcj1cInJ0bFwiXSAub3AtdG9nZ2xlOmluZGV0ZXJtaW5hdGUge1xuICBib3gtc2hhZG93OiBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgLyAyKSAwIDAgMnB4IHZhcigtLXRnbGJnKSBpbnNldCxcbiAgICAgICAgY2FsYyh2YXIoLS1oYW5kbGVvZmZzZXQpIC8gLTIpIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgICAgICAwIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0O1xufVxyXG4ub3AtdG9nZ2xlLXNlY29uZGFyeTpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSk7XG59XHJcbi5vcC10b2dnbGUtc2Vjb25kYXJ5OmNoZWNrZWQsXG4gICAgLm9wLXRvZ2dsZS1zZWNvbmRhcnlbYXJpYS1jaGVja2VkPVwidHJ1ZVwiXSB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMC4xO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zYyxva2xjaCh2YXIoLS1zYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtdG9nZ2xlOmRpc2FibGVkIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBvcGFjaXR5OiAwLjM7XG4gIC0tdG9nZ2xlaGFuZGxlYm9yZGVyOiAwIDAgMCAzcHggdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKSBpbnNldCxcbiAgICAgIHZhcigtLWhhbmRsZW9mZnNldGNhbGN1bGF0b3IpIDAgMCAzcHggdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKSBpbnNldDtcbn1cclxuLm5vLWFuaW1hdGlvbiB7XG4gIC0tYnRuLWZvY3VzLXNjYWxlOiAxO1xuICAtLWFuaW1hdGlvbi1idG46IDA7XG4gIC0tYW5pbWF0aW9uLWlucHV0OiAwO1xufVxyXG4ub3AtYnRuLXhzIHtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIG1pbi1oZWlnaHQ6IDEuNXJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwLjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNXJlbTtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xufVxyXG4ub3AtYnRuLXNtIHtcbiAgaGVpZ2h0OiAycmVtO1xuICBtaW4taGVpZ2h0OiAycmVtO1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG59XHJcbi5vcC1idG4tc3F1YXJlOndoZXJlKC5vcC1idG4teHMpIHtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHdpZHRoOiAxLjVyZW07XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm9wLWJ0bi1zbSkge1xuICBoZWlnaHQ6IDJyZW07XG4gIHdpZHRoOiAycmVtO1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tc3F1YXJlOndoZXJlKC5vcC1idG4tbWQpIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICB3aWR0aDogM3JlbTtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLXNxdWFyZTp3aGVyZSgub3AtYnRuLWxnKSB7XG4gIGhlaWdodDogNHJlbTtcbiAgd2lkdGg6IDRyZW07XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm9wLWJ0bi14cykge1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgd2lkdGg6IDEuNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tY2lyY2xlOndoZXJlKC5vcC1idG4tc20pIHtcbiAgaGVpZ2h0OiAycmVtO1xuICB3aWR0aDogMnJlbTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tY2lyY2xlOndoZXJlKC5vcC1idG4tbWQpIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICB3aWR0aDogM3JlbTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tY2lyY2xlOndoZXJlKC5vcC1idG4tbGcpIHtcbiAgaGVpZ2h0OiA0cmVtO1xuICB3aWR0aDogNHJlbTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBwYWRkaW5nOiAwcHg7XG59XHJcblt0eXBlPVwiY2hlY2tib3hcIl0ub3AtY2hlY2tib3gteHMge1xuICBoZWlnaHQ6IDFyZW07XG4gIHdpZHRoOiAxcmVtO1xufVxyXG5bdHlwZT1cImNoZWNrYm94XCJdLm9wLWNoZWNrYm94LXNtIHtcbiAgaGVpZ2h0OiAxLjI1cmVtO1xuICB3aWR0aDogMS4yNXJlbTtcbn1cclxuLm9wLWZpbGUtaW5wdXQtc20ge1xuICBoZWlnaHQ6IDJyZW07XG4gIHBhZGRpbmctaW5saW5lLWVuZDogMC43NXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xufVxyXG4ub3AtZmlsZS1pbnB1dC1zbTo6ZmlsZS1zZWxlY3Rvci1idXR0b24ge1xuICBtYXJnaW4tcmlnaHQ6IDAuNzVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG59XHJcbi5vcC1pbnB1dC14cyB7XG4gIGhlaWdodDogMS41cmVtO1xuICBwYWRkaW5nLWxlZnQ6IDAuNXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC41cmVtO1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxcmVtO1xuICBsaW5lLWhlaWdodDogMS42MjU7XG59XHJcbi5vcC1pbnB1dC1zbSB7XG4gIGhlaWdodDogMnJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjc1cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMnJlbTtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCB7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XHJcbi5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwgLm9wLWpvaW4taXRlbTpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpLFxuICAub3Atam9pbi5vcC1qb2luLXZlcnRpY2FsICo6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbi5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwgLm9wLWpvaW4taXRlbTpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpLFxuICAub3Atam9pbi5vcC1qb2luLXZlcnRpY2FsICo6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogMDtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbi5vcC1qb2luLm9wLWpvaW4taG9yaXpvbnRhbCB7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG59XHJcbi5vcC1qb2luLm9wLWpvaW4taG9yaXpvbnRhbCAub3Atam9pbi1pdGVtOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCksXG4gIC5vcC1qb2luLm9wLWpvaW4taG9yaXpvbnRhbCAqOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG4ub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwgLm9wLWpvaW4taXRlbTpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpLFxuICAub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwgKjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogMDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogaW5oZXJpdDtcbn1cclxuW3R5cGU9XCJyYWRpb1wiXS5vcC1yYWRpby14cyB7XG4gIGhlaWdodDogMXJlbTtcbiAgd2lkdGg6IDFyZW07XG59XHJcbi5vcC1zZWxlY3Qtc20ge1xuICBoZWlnaHQ6IDJyZW07XG4gIG1pbi1oZWlnaHQ6IDJyZW07XG4gIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbiAgcGFkZGluZy1yaWdodDogMnJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDJyZW07XG59XHJcbltkaXI9XCJydGxcIl0gLm9wLXNlbGVjdC1zbSB7XG4gIHBhZGRpbmctbGVmdDogMnJlbTtcbiAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbn1cclxuLm9wLXRhYnMtbWQgOndoZXJlKC5vcC10YWIpIHtcbiAgaGVpZ2h0OiAycmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIC0tdGFiLXBhZGRpbmc6IDFyZW07XG59XHJcbi5vcC10YWJzLWxnIDp3aGVyZSgub3AtdGFiKSB7XG4gIGhlaWdodDogM3JlbTtcbiAgZm9udC1zaXplOiAxLjEyNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xuICAtLXRhYi1wYWRkaW5nOiAxLjI1cmVtO1xufVxyXG4ub3AtdGFicy1zbSA6d2hlcmUoLm9wLXRhYikge1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IC43NXJlbTtcbiAgLS10YWItcGFkZGluZzogMC43NXJlbTtcbn1cclxuLm9wLXRhYnMteHMgOndoZXJlKC5vcC10YWIpIHtcbiAgaGVpZ2h0OiAxLjI1cmVtO1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAuNzVyZW07XG4gIC0tdGFiLXBhZGRpbmc6IDAuNXJlbTtcbn1cclxuLm9wLWNhcmQtY29tcGFjdCAub3AtY2FyZC1ib2R5IHtcbiAgcGFkZGluZzogMXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG59XHJcbi5vcC1jYXJkLWNvbXBhY3QgLm9wLWNhcmQtdGl0bGUge1xuICBtYXJnaW4tYm90dG9tOiAwLjI1cmVtO1xufVxyXG4ub3AtY2FyZC1ub3JtYWwgLm9wLWNhcmQtYm9keSB7XG4gIHBhZGRpbmc6IHZhcigtLXBhZGRpbmctY2FyZCwgMnJlbSk7XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNXJlbTtcbn1cclxuLm9wLWNhcmQtbm9ybWFsIC5vcC1jYXJkLXRpdGxlIHtcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKSB7XG4gIG1hcmdpbi1sZWZ0OiAwcHg7XG4gIG1hcmdpbi1yaWdodDogMHB4O1xuICBtYXJnaW4tdG9wOiAtMXB4O1xufVxyXG4ub3Atam9pbi5vcC1qb2luLXZlcnRpY2FsID4gOndoZXJlKCo6bm90KDpmaXJzdC1jaGlsZCkpOmlzKC5vcC1idG4pIHtcbiAgbWFyZ2luLXRvcDogY2FsYyh2YXIoLS1ib3JkZXItYnRuKSAqIC0xKTtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsID4gOndoZXJlKCo6bm90KDpmaXJzdC1jaGlsZCkpIHtcbiAgbWFyZ2luLXRvcDogMHB4O1xuICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IC0xcHg7XG59XHJcbi5vcC1qb2luLm9wLWpvaW4taG9yaXpvbnRhbCA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKTppcygub3AtYnRuKSB7XG4gIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IGNhbGModmFyKC0tYm9yZGVyLWJ0bikgKiAtMSk7XG59XHJcbi5vcC1tZW51LXNtIDp3aGVyZShsaTpub3QoLm9wLW1lbnUtdGl0bGUpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlKSksIC5vcC1tZW51LXNtIDp3aGVyZShsaTpub3QoLm9wLW1lbnUtdGl0bGUpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSkge1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXRvcDogMC4yNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuMjVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xufVxyXG4ub3AtbWVudS1zbSAub3AtbWVudS10aXRsZSB7XG4gIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbiAgcGFkZGluZy10b3A6IDAuNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbn1cclxuLm9wLW1vZGFsLXRvcCA6d2hlcmUoLm9wLW1vZGFsLWJveCkge1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiBub25lO1xuICAtLXR3LXRyYW5zbGF0ZS15OiAtMi41cmVtO1xuICAtLXR3LXNjYWxlLXg6IDE7XG4gIC0tdHctc2NhbGUteTogMTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMHB4O1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMHB4O1xufVxyXG4ub3AtbW9kYWwtbWlkZGxlIDp3aGVyZSgub3AtbW9kYWwtYm94KSB7XG4gIHdpZHRoOiA5MS42NjY2NjclO1xuICBtYXgtd2lkdGg6IDMycmVtO1xuICAtLXR3LXRyYW5zbGF0ZS15OiAwcHg7XG4gIC0tdHctc2NhbGUteDogLjk7XG4gIC0tdHctc2NhbGUteTogLjk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbn1cclxuLm9wLW1vZGFsLWJvdHRvbSA6d2hlcmUoLm9wLW1vZGFsLWJveCkge1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiBub25lO1xuICAtLXR3LXRyYW5zbGF0ZS15OiAyLjVyZW07XG4gIC0tdHctc2NhbGUteDogMTtcbiAgLS10dy1zY2FsZS15OiAxO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMHB4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwcHg7XG59XHJcbi5zci1vbmx5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMXB4O1xuICBoZWlnaHQ6IDFweDtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luOiAtMXB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjbGlwOiByZWN0KDAsIDAsIDAsIDApO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBib3JkZXItd2lkdGg6IDA7XG59XHJcbi5wb2ludGVyLWV2ZW50cy1ub25lIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XHJcbi52aXNpYmxlIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbn1cclxuLmZpeGVkIHtcbiAgcG9zaXRpb246IGZpeGVkO1xufVxyXG4uYWJzb2x1dGUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XHJcbi5yZWxhdGl2ZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cclxuLnN0aWNreSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG59XHJcbi5pbnNldC0wIHtcbiAgaW5zZXQ6IDBweDtcbn1cclxuLi1ib3R0b20tXFxcXFsxMXB4XFxcXF0ge1xuICBib3R0b206IC0xMXB4O1xufVxyXG4uLWJvdHRvbS1cXFxcWzFweFxcXFxdIHtcbiAgYm90dG9tOiAtMXB4O1xufVxyXG4uLXJpZ2h0LTEge1xuICByaWdodDogLTAuMjVyZW07XG59XHJcbi4tcmlnaHQtXFxcXFsxMnB4XFxcXF0ge1xuICByaWdodDogLTEycHg7XG59XHJcbi4tcmlnaHQtXFxcXFsxM3B4XFxcXF0ge1xuICByaWdodDogLTEzcHg7XG59XHJcbi4tcmlnaHQtXFxcXFsxcHhcXFxcXSB7XG4gIHJpZ2h0OiAtMXB4O1xufVxyXG4uLXRvcC0xMiB7XG4gIHRvcDogLTNyZW07XG59XHJcbi5ib3R0b20tMCB7XG4gIGJvdHRvbTogMHB4O1xufVxyXG4uYm90dG9tLTQge1xuICBib3R0b206IDFyZW07XG59XHJcbi5sZWZ0LTAge1xuICBsZWZ0OiAwcHg7XG59XHJcbi5sZWZ0LTFcXFxcLzIge1xuICBsZWZ0OiA1MCU7XG59XHJcbi5yaWdodC0wIHtcbiAgcmlnaHQ6IDBweDtcbn1cclxuLnJpZ2h0LTEge1xuICByaWdodDogMC4yNXJlbTtcbn1cclxuLnJpZ2h0LTIge1xuICByaWdodDogMC41cmVtO1xufVxyXG4ucmlnaHQtMyB7XG4gIHJpZ2h0OiAwLjc1cmVtO1xufVxyXG4ucmlnaHQtNCB7XG4gIHJpZ2h0OiAxcmVtO1xufVxyXG4ucmlnaHQtNSB7XG4gIHJpZ2h0OiAxLjI1cmVtO1xufVxyXG4ucmlnaHQtXFxcXFsxMHB4XFxcXF0ge1xuICByaWdodDogMTBweDtcbn1cclxuLnRvcC0wIHtcbiAgdG9wOiAwcHg7XG59XHJcbi50b3AtMSB7XG4gIHRvcDogMC4yNXJlbTtcbn1cclxuLnRvcC0yIHtcbiAgdG9wOiAwLjVyZW07XG59XHJcbi50b3AtMjAge1xuICB0b3A6IDVyZW07XG59XHJcbi50b3AtMyB7XG4gIHRvcDogMC43NXJlbTtcbn1cclxuLnRvcC1cXFxcWzEwXFxcXCVcXFxcXSB7XG4gIHRvcDogMTAlO1xufVxyXG4udG9wLVxcXFxbMXB4XFxcXF0ge1xuICB0b3A6IDFweDtcbn1cclxuLnRvcC1cXFxcWzJcXFxcLjU1cmVtXFxcXF0ge1xuICB0b3A6IDIuNTVyZW07XG59XHJcbi50b3AtXFxcXFs1MFxcXFwlXFxcXF0ge1xuICB0b3A6IDUwJTtcbn1cclxuLnRvcC1hdXRvIHtcbiAgdG9wOiBhdXRvO1xufVxyXG4uLXotXFxcXFsxXFxcXF0ge1xuICB6LWluZGV4OiAtMTtcbn1cclxuLnotMTAge1xuICB6LWluZGV4OiAxMDtcbn1cclxuLnotMjAge1xuICB6LWluZGV4OiAyMDtcbn1cclxuLnotMzAge1xuICB6LWluZGV4OiAzMDtcbn1cclxuLnotNDAge1xuICB6LWluZGV4OiA0MDtcbn1cclxuLnotNTAge1xuICB6LWluZGV4OiA1MDtcbn1cclxuLnotXFxcXFsxMDAwXFxcXF0ge1xuICB6LWluZGV4OiAxMDAwO1xufVxyXG4uei1cXFxcWzEwMFxcXFxdIHtcbiAgei1pbmRleDogMTAwO1xufVxyXG4uei1cXFxcWzEzMDBcXFxcXSB7XG4gIHotaW5kZXg6IDEzMDA7XG59XHJcbi56LVxcXFxbMTk5OVxcXFxdIHtcbiAgei1pbmRleDogMTk5OTtcbn1cclxuLnotXFxcXFsxXFxcXF0ge1xuICB6LWluZGV4OiAxO1xufVxyXG4uei1cXFxcWzIwMFxcXFxdIHtcbiAgei1pbmRleDogMjAwO1xufVxyXG4uei1cXFxcWzIwXFxcXF0ge1xuICB6LWluZGV4OiAyMDtcbn1cclxuLnotXFxcXFszMFxcXFxdIHtcbiAgei1pbmRleDogMzA7XG59XHJcbi56LVxcXFxbNDQ4XFxcXF0ge1xuICB6LWluZGV4OiA0NDg7XG59XHJcbi56LVxcXFxbNTAwXFxcXF0ge1xuICB6LWluZGV4OiA1MDA7XG59XHJcbi56LVxcXFxbNTAxXFxcXF0ge1xuICB6LWluZGV4OiA1MDE7XG59XHJcbi56LVxcXFxbNzBcXFxcXSB7XG4gIHotaW5kZXg6IDcwO1xufVxyXG4uei1cXFxcWzk5OVxcXFxdIHtcbiAgei1pbmRleDogOTk5O1xufVxyXG4uei1cXFxcWzk5XFxcXF0ge1xuICB6LWluZGV4OiA5OTtcbn1cclxuLm9yZGVyLWxhc3Qge1xuICBvcmRlcjogOTk5OTtcbn1cclxuLmNvbC1zcGFuLTEyIHtcbiAgZ3JpZC1jb2x1bW46IHNwYW4gMTIgLyBzcGFuIDEyO1xufVxyXG4ubS0xIHtcbiAgbWFyZ2luOiAwLjI1cmVtO1xufVxyXG4ubS0yIHtcbiAgbWFyZ2luOiAwLjVyZW07XG59XHJcbi5tLTgge1xuICBtYXJnaW46IDJyZW07XG59XHJcbi5tLVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luOiAxMHB4O1xufVxyXG4ubS1cXFxcWzE1cHhcXFxcXSB7XG4gIG1hcmdpbjogMTVweDtcbn1cclxuLm0tXFxcXFsyMHB4XFxcXF0ge1xuICBtYXJnaW46IDIwcHg7XG59XHJcbi5tLVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW46IDJweDtcbn1cclxuLm0tXFxcXFs0cHhcXFxcXSB7XG4gIG1hcmdpbjogNHB4O1xufVxyXG4ubXgtMSB7XG4gIG1hcmdpbi1sZWZ0OiAwLjI1cmVtO1xuICBtYXJnaW4tcmlnaHQ6IDAuMjVyZW07XG59XHJcbi5teC0yIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNXJlbTtcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG59XHJcbi5teC0zIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNzVyZW07XG4gIG1hcmdpbi1yaWdodDogMC43NXJlbTtcbn1cclxuLm14LTQge1xuICBtYXJnaW4tbGVmdDogMXJlbTtcbiAgbWFyZ2luLXJpZ2h0OiAxcmVtO1xufVxyXG4ubXgtOCB7XG4gIG1hcmdpbi1sZWZ0OiAycmVtO1xuICBtYXJnaW4tcmlnaHQ6IDJyZW07XG59XHJcbi5teC1cXFxcWzEwMHB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMTAwcHg7XG4gIG1hcmdpbi1yaWdodDogMTAwcHg7XG59XHJcbi5teC1cXFxcWzI1XFxcXCVcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAyNSU7XG4gIG1hcmdpbi1yaWdodDogMjUlO1xufVxyXG4ubXgtXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG4gIG1hcmdpbi1yaWdodDogMnB4O1xufVxyXG4ubXgtXFxcXFszcHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAzcHg7XG4gIG1hcmdpbi1yaWdodDogM3B4O1xufVxyXG4ubXgtXFxcXFs0cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA0cHg7XG4gIG1hcmdpbi1yaWdodDogNHB4O1xufVxyXG4ubXgtXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA1cHg7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xufVxyXG4ubXgtYXV0byB7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XHJcbi5teS0wXFxcXC41IHtcbiAgbWFyZ2luLXRvcDogMC4xMjVyZW07XG4gIG1hcmdpbi1ib3R0b206IDAuMTI1cmVtO1xufVxyXG4ubXktMSB7XG4gIG1hcmdpbi10b3A6IDAuMjVyZW07XG4gIG1hcmdpbi1ib3R0b206IDAuMjVyZW07XG59XHJcbi5teS0yIHtcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG59XHJcbi5teS0zIHtcbiAgbWFyZ2luLXRvcDogMC43NXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLm15LTQge1xuICBtYXJnaW4tdG9wOiAxcmVtO1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xufVxyXG4ubXktXFxcXFsxMHB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xufVxyXG4ubXktXFxcXFsxNXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xufVxyXG4ubXktXFxcXFsxcHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDFweDtcbiAgbWFyZ2luLWJvdHRvbTogMXB4O1xufVxyXG4ubXktXFxcXFsyMHB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAyMHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxyXG4ubXktXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDJweDtcbiAgbWFyZ2luLWJvdHRvbTogMnB4O1xufVxyXG4ubXktXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxyXG4ubWItMCB7XG4gIG1hcmdpbi1ib3R0b206IDBweDtcbn1cclxuLm1iLTBcXFxcLjUge1xuICBtYXJnaW4tYm90dG9tOiAwLjEyNXJlbTtcbn1cclxuLm1iLTEge1xuICBtYXJnaW4tYm90dG9tOiAwLjI1cmVtO1xufVxyXG4ubWItMTEge1xuICBtYXJnaW4tYm90dG9tOiAyLjc1cmVtO1xufVxyXG4ubWItMiB7XG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbn1cclxuLm1iLTJcXFxcLjUge1xuICBtYXJnaW4tYm90dG9tOiAwLjYyNXJlbTtcbn1cclxuLm1iLTMge1xuICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtO1xufVxyXG4ubWItNCB7XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG59XHJcbi5tYi04IHtcbiAgbWFyZ2luLWJvdHRvbTogMnJlbTtcbn1cclxuLm1iLVxcXFxbMFxcXFwuMzVyZW1cXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDAuMzVyZW07XG59XHJcbi5tYi1cXFxcWzBcXFxcLjVyZW1cXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbn1cclxuLm1iLVxcXFxbMFxcXFwuNzVyZW1cXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDAuNzVyZW07XG59XHJcbi5tYi1cXFxcWzEwcHhcXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XHJcbi5tYi1cXFxcWzE1cHhcXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XG59XHJcbi5tYi1cXFxcWzE2cHhcXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDE2cHg7XG59XHJcbi5tYi1cXFxcWzJweFxcXFxdIHtcbiAgbWFyZ2luLWJvdHRvbTogMnB4O1xufVxyXG4ubWItXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cclxuLm1sLTBcXFxcLjUge1xuICBtYXJnaW4tbGVmdDogMC4xMjVyZW07XG59XHJcbi5tbC0xIHtcbiAgbWFyZ2luLWxlZnQ6IDAuMjVyZW07XG59XHJcbi5tbC0xXFxcXC41IHtcbiAgbWFyZ2luLWxlZnQ6IDAuMzc1cmVtO1xufVxyXG4ubWwtMiB7XG4gIG1hcmdpbi1sZWZ0OiAwLjVyZW07XG59XHJcbi5tbC0zIHtcbiAgbWFyZ2luLWxlZnQ6IDAuNzVyZW07XG59XHJcbi5tbC00IHtcbiAgbWFyZ2luLWxlZnQ6IDFyZW07XG59XHJcbi5tbC1cXFxcWzBcXFxcLjVyZW1cXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAwLjVyZW07XG59XHJcbi5tbC1cXFxcWzEwcHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxyXG4ubWwtXFxcXFsxM3B4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMTNweDtcbn1cclxuLm1sLVxcXFxbMjBweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDIwcHg7XG59XHJcbi5tbC1cXFxcWzJweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDJweDtcbn1cclxuLm1sLVxcXFxbM3B4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogM3B4O1xufVxyXG4ubWwtXFxcXFs0cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA0cHg7XG59XHJcbi5tbC1cXFxcWzVweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDVweDtcbn1cclxuLm1sLVxcXFxbNnB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogNnB4O1xufVxyXG4ubWwtXFxcXFs3cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA3cHg7XG59XHJcbi5tbC1cXFxcWzhweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDhweDtcbn1cclxuLm1yLTEge1xuICBtYXJnaW4tcmlnaHQ6IDAuMjVyZW07XG59XHJcbi5tci0xXFxcXC41IHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjM3NXJlbTtcbn1cclxuLm1yLTIge1xuICBtYXJnaW4tcmlnaHQ6IDAuNXJlbTtcbn1cclxuLm1yLTQge1xuICBtYXJnaW4tcmlnaHQ6IDFyZW07XG59XHJcbi5tci1cXFxcWzEwcHhcXFxcXSB7XG4gIG1hcmdpbi1yaWdodDogMTBweDtcbn1cclxuLm1yLVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tcmlnaHQ6IDJweDtcbn1cclxuLm1yLVxcXFxbM3B4XFxcXF0ge1xuICBtYXJnaW4tcmlnaHQ6IDNweDtcbn1cclxuLm1yLVxcXFxbNHB4XFxcXF0ge1xuICBtYXJnaW4tcmlnaHQ6IDRweDtcbn1cclxuLm1yLVxcXFxbNXB4XFxcXF0ge1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cclxuLm1yLVxcXFxbOHB4XFxcXF0ge1xuICBtYXJnaW4tcmlnaHQ6IDhweDtcbn1cclxuLm10LTAge1xuICBtYXJnaW4tdG9wOiAwcHg7XG59XHJcbi5tdC0wXFxcXC41IHtcbiAgbWFyZ2luLXRvcDogMC4xMjVyZW07XG59XHJcbi5tdC0xIHtcbiAgbWFyZ2luLXRvcDogMC4yNXJlbTtcbn1cclxuLm10LTIge1xuICBtYXJnaW4tdG9wOiAwLjVyZW07XG59XHJcbi5tdC0yXFxcXC41IHtcbiAgbWFyZ2luLXRvcDogMC42MjVyZW07XG59XHJcbi5tdC0zIHtcbiAgbWFyZ2luLXRvcDogMC43NXJlbTtcbn1cclxuLm10LTQge1xuICBtYXJnaW4tdG9wOiAxcmVtO1xufVxyXG4ubXQtNiB7XG4gIG1hcmdpbi10b3A6IDEuNXJlbTtcbn1cclxuLm10LVxcXFxbMFxcXFwuNHJlbVxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMC40cmVtO1xufVxyXG4ubXQtXFxcXFswXFxcXC41cmVtXFxcXF0ge1xuICBtYXJnaW4tdG9wOiAwLjVyZW07XG59XHJcbi5tdC1cXFxcWzBcXFxcLjc1MHJlbVxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMC43NTByZW07XG59XHJcbi5tdC1cXFxcWzEwcHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG59XHJcbi5tdC1cXFxcWzE0cHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDE0cHg7XG59XHJcbi5tdC1cXFxcWzE1cHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDE1cHg7XG59XHJcbi5tdC1cXFxcWzFyZW1cXFxcXSB7XG4gIG1hcmdpbi10b3A6IDFyZW07XG59XHJcbi5tdC1cXFxcWzJweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMnB4O1xufVxyXG4ubXQtXFxcXFszcHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDNweDtcbn1cclxuLm10LVxcXFxbNDNweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogNDNweDtcbn1cclxuLm10LVxcXFxbNXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiA1cHg7XG59XHJcbi5tdC1cXFxcWzZweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogNnB4O1xufVxyXG4ubXQtXFxcXFs4cHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDhweDtcbn1cclxuLm10LVxcXFxbOXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiA5cHg7XG59XHJcbi5ibG9jayB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxyXG4uaW5saW5lLWJsb2NrIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxyXG4uaW5saW5lIHtcbiAgZGlzcGxheTogaW5saW5lO1xufVxyXG4uZmxleCB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XHJcbi5pbmxpbmUtZmxleCB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxyXG4udGFibGUge1xuICBkaXNwbGF5OiB0YWJsZTtcbn1cclxuLmdyaWQge1xuICBkaXNwbGF5OiBncmlkO1xufVxyXG4uY29udGVudHMge1xuICBkaXNwbGF5OiBjb250ZW50cztcbn1cclxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XHJcbi5oLTIge1xuICBoZWlnaHQ6IDAuNXJlbTtcbn1cclxuLmgtNSB7XG4gIGhlaWdodDogMS4yNXJlbTtcbn1cclxuLmgtXFxcXFswXFxcXC41cHhcXFxcXSB7XG4gIGhlaWdodDogMC41cHg7XG59XHJcbi5oLVxcXFxbMVxcXFwuNHJlbVxcXFxdIHtcbiAgaGVpZ2h0OiAxLjRyZW07XG59XHJcbi5oLVxcXFxbMVxcXFwuN3JlbVxcXFxdIHtcbiAgaGVpZ2h0OiAxLjdyZW07XG59XHJcbi5oLVxcXFxbMTAwXFxcXCVcXFxcXSB7XG4gIGhlaWdodDogMTAwJTtcbn1cclxuLmgtXFxcXFsxMDBweFxcXFxdIHtcbiAgaGVpZ2h0OiAxMDBweDtcbn1cclxuLmgtXFxcXFsxMDB2aFxcXFxdIHtcbiAgaGVpZ2h0OiAxMDB2aDtcbn1cclxuLmgtXFxcXFsxMTFweFxcXFxdIHtcbiAgaGVpZ2h0OiAxMTFweDtcbn1cclxuLmgtXFxcXFsxMjBweFxcXFxdIHtcbiAgaGVpZ2h0OiAxMjBweDtcbn1cclxuLmgtXFxcXFsxMzBweFxcXFxdIHtcbiAgaGVpZ2h0OiAxMzBweDtcbn1cclxuLmgtXFxcXFsxNDBweFxcXFxdIHtcbiAgaGVpZ2h0OiAxNDBweDtcbn1cclxuLmgtXFxcXFsxNHB4XFxcXF0ge1xuICBoZWlnaHQ6IDE0cHg7XG59XHJcbi5oLVxcXFxbMTUwcHhcXFxcXSB7XG4gIGhlaWdodDogMTUwcHg7XG59XHJcbi5oLVxcXFxbMTlweFxcXFxdIHtcbiAgaGVpZ2h0OiAxOXB4O1xufVxyXG4uaC1cXFxcWzFweFxcXFxdIHtcbiAgaGVpZ2h0OiAxcHg7XG59XHJcbi5oLVxcXFxbMjAwcHhcXFxcXSB7XG4gIGhlaWdodDogMjAwcHg7XG59XHJcbi5oLVxcXFxbMjBweFxcXFxdIHtcbiAgaGVpZ2h0OiAyMHB4O1xufVxyXG4uaC1cXFxcWzI1MHB4XFxcXF0ge1xuICBoZWlnaHQ6IDI1MHB4O1xufVxyXG4uaC1cXFxcWzI1cHhcXFxcXSB7XG4gIGhlaWdodDogMjVweDtcbn1cclxuLmgtXFxcXFsyNnB4XFxcXF0ge1xuICBoZWlnaHQ6IDI2cHg7XG59XHJcbi5oLVxcXFxbMzAwcHhcXFxcXSB7XG4gIGhlaWdodDogMzAwcHg7XG59XHJcbi5oLVxcXFxbMzBweFxcXFxdIHtcbiAgaGVpZ2h0OiAzMHB4O1xufVxyXG4uaC1cXFxcWzMxN3B4XFxcXF0ge1xuICBoZWlnaHQ6IDMxN3B4O1xufVxyXG4uaC1cXFxcWzMycHhcXFxcXSB7XG4gIGhlaWdodDogMzJweDtcbn1cclxuLmgtXFxcXFszNXB4XFxcXF0ge1xuICBoZWlnaHQ6IDM1cHg7XG59XHJcbi5oLVxcXFxbMzhweFxcXFxdIHtcbiAgaGVpZ2h0OiAzOHB4O1xufVxyXG4uaC1cXFxcWzQwcHhcXFxcXSB7XG4gIGhlaWdodDogNDBweDtcbn1cclxuLmgtXFxcXFs1MDBweFxcXFxdIHtcbiAgaGVpZ2h0OiA1MDBweDtcbn1cclxuLmgtXFxcXFs1MHZoXFxcXF0ge1xuICBoZWlnaHQ6IDUwdmg7XG59XHJcbi5oLVxcXFxbNjBweFxcXFxdIHtcbiAgaGVpZ2h0OiA2MHB4O1xufVxyXG4uaC1cXFxcWzY2cHhcXFxcXSB7XG4gIGhlaWdodDogNjZweDtcbn1cclxuLmgtXFxcXFs3MHB4XFxcXF0ge1xuICBoZWlnaHQ6IDcwcHg7XG59XHJcbi5oLVxcXFxbNzVweFxcXFxdIHtcbiAgaGVpZ2h0OiA3NXB4O1xufVxyXG4uaC1cXFxcWzkwXFxcXCVcXFxcXSB7XG4gIGhlaWdodDogOTAlO1xufVxyXG4uaC1cXFxcWzk1XFxcXCVcXFxcXSB7XG4gIGhlaWdodDogOTUlO1xufVxyXG4uaC1mdWxsIHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxyXG4uaC1zY3JlZW4ge1xuICBoZWlnaHQ6IDEwMHZoO1xufVxyXG4ubWF4LWgtOTYge1xuICBtYXgtaGVpZ2h0OiAyNHJlbTtcbn1cclxuLm1heC1oLVxcXFxbMTAwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDEwMHB4O1xufVxyXG4ubWF4LWgtXFxcXFsxMDB2aFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMTAwdmg7XG59XHJcbi5tYXgtaC1cXFxcWzE4MHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAxODBweDtcbn1cclxuLm1heC1oLVxcXFxbMjEwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDIxMHB4O1xufVxyXG4ubWF4LWgtXFxcXFsyNTBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMjUwcHg7XG59XHJcbi5tYXgtaC1cXFxcWzMwMHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAzMDBweDtcbn1cclxuLm1heC1oLVxcXFxbMzEwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDMxMHB4O1xufVxyXG4ubWF4LWgtXFxcXFszNDBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMzQwcHg7XG59XHJcbi5tYXgtaC1cXFxcWzM1cHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDM1cHg7XG59XHJcbi5tYXgtaC1cXFxcWzM4cHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDM4cHg7XG59XHJcbi5tYXgtaC1cXFxcWzYwMHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiA2MDBweDtcbn1cclxuLm1heC1oLWZ1bGwge1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xufVxyXG4ubWF4LWgtc2NyZWVuIHtcbiAgbWF4LWhlaWdodDogMTAwdmg7XG59XHJcbi5taW4taC1tYXgge1xuICBtaW4taGVpZ2h0OiBtYXgtY29udGVudDtcbn1cclxuLm1pbi1oLXNjcmVlbiB7XG4gIG1pbi1oZWlnaHQ6IDEwMHZoO1xufVxyXG4udy0wIHtcbiAgd2lkdGg6IDBweDtcbn1cclxuLnctMVxcXFwvNCB7XG4gIHdpZHRoOiAyNSU7XG59XHJcbi53LTUge1xuICB3aWR0aDogMS4yNXJlbTtcbn1cclxuLnctNTIge1xuICB3aWR0aDogMTNyZW07XG59XHJcbi53LTkge1xuICB3aWR0aDogMi4yNXJlbTtcbn1cclxuLnctXFxcXFsxXFxcXC40cmVtXFxcXF0ge1xuICB3aWR0aDogMS40cmVtO1xufVxyXG4udy1cXFxcWzFcXFxcLjdyZW1cXFxcXSB7XG4gIHdpZHRoOiAxLjdyZW07XG59XHJcbi53LVxcXFxbMTAwcHhcXFxcXSB7XG4gIHdpZHRoOiAxMDBweDtcbn1cclxuLnctXFxcXFsxMHB4XFxcXF0ge1xuICB3aWR0aDogMTBweDtcbn1cclxuLnctXFxcXFsxMTBweFxcXFxdIHtcbiAgd2lkdGg6IDExMHB4O1xufVxyXG4udy1cXFxcWzEyMHB4XFxcXF0ge1xuICB3aWR0aDogMTIwcHg7XG59XHJcbi53LVxcXFxbMTRweFxcXFxdIHtcbiAgd2lkdGg6IDE0cHg7XG59XHJcbi53LVxcXFxbMTUwcHhcXFxcXSB7XG4gIHdpZHRoOiAxNTBweDtcbn1cclxuLnctXFxcXFsxOFxcXFwlXFxcXF0ge1xuICB3aWR0aDogMTglO1xufVxyXG4udy1cXFxcWzE4MHB4XFxcXF0ge1xuICB3aWR0aDogMTgwcHg7XG59XHJcbi53LVxcXFxbMTgzcHhcXFxcXSB7XG4gIHdpZHRoOiAxODNweDtcbn1cclxuLnctXFxcXFsyMFxcXFwlXFxcXF0ge1xuICB3aWR0aDogMjAlO1xufVxyXG4udy1cXFxcWzIwMHB4XFxcXF0ge1xuICB3aWR0aDogMjAwcHg7XG59XHJcbi53LVxcXFxbMjEwcHhcXFxcXSB7XG4gIHdpZHRoOiAyMTBweDtcbn1cclxuLnctXFxcXFsyMjBweFxcXFxdIHtcbiAgd2lkdGg6IDIyMHB4O1xufVxyXG4udy1cXFxcWzIzXFxcXCVcXFxcXSB7XG4gIHdpZHRoOiAyMyU7XG59XHJcbi53LVxcXFxbMjNweFxcXFxdIHtcbiAgd2lkdGg6IDIzcHg7XG59XHJcbi53LVxcXFxbMjUwcHhcXFxcXSB7XG4gIHdpZHRoOiAyNTBweDtcbn1cclxuLnctXFxcXFsyNXB4XFxcXF0ge1xuICB3aWR0aDogMjVweDtcbn1cclxuLnctXFxcXFsyNnB4XFxcXF0ge1xuICB3aWR0aDogMjZweDtcbn1cclxuLnctXFxcXFsyODBweFxcXFxdIHtcbiAgd2lkdGg6IDI4MHB4O1xufVxyXG4udy1cXFxcWzMwXFxcXCVcXFxcXSB7XG4gIHdpZHRoOiAzMCU7XG59XHJcbi53LVxcXFxbMzBweFxcXFxdIHtcbiAgd2lkdGg6IDMwcHg7XG59XHJcbi53LVxcXFxbMzVweFxcXFxdIHtcbiAgd2lkdGg6IDM1cHg7XG59XHJcbi53LVxcXFxbNDBweFxcXFxdIHtcbiAgd2lkdGg6IDQwcHg7XG59XHJcbi53LVxcXFxbNDUwcHhcXFxcXSB7XG4gIHdpZHRoOiA0NTBweDtcbn1cclxuLnctXFxcXFs0cmVtXFxcXF0ge1xuICB3aWR0aDogNHJlbTtcbn1cclxuLnctXFxcXFs1MFxcXFwlXFxcXF0ge1xuICB3aWR0aDogNTAlO1xufVxyXG4udy1cXFxcWzUwcHhcXFxcXSB7XG4gIHdpZHRoOiA1MHB4O1xufVxyXG4udy1cXFxcWzYwcHhcXFxcXSB7XG4gIHdpZHRoOiA2MHB4O1xufVxyXG4udy1cXFxcWzY1cHhcXFxcXSB7XG4gIHdpZHRoOiA2NXB4O1xufVxyXG4udy1cXFxcWzcwXFxcXCVcXFxcXSB7XG4gIHdpZHRoOiA3MCU7XG59XHJcbi53LVxcXFxbNzVweFxcXFxdIHtcbiAgd2lkdGg6IDc1cHg7XG59XHJcbi53LVxcXFxbODBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDgwJTtcbn1cclxuLnctXFxcXFs4N1xcXFwlXFxcXF0ge1xuICB3aWR0aDogODclO1xufVxyXG4udy1cXFxcWzkwXFxcXCVcXFxcXSB7XG4gIHdpZHRoOiA5MCU7XG59XHJcbi53LVxcXFxbOTBweFxcXFxdIHtcbiAgd2lkdGg6IDkwcHg7XG59XHJcbi53LVxcXFxbOTVcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDk1JTtcbn1cclxuLnctYXV0byB7XG4gIHdpZHRoOiBhdXRvO1xufVxyXG4udy1maXQge1xuICB3aWR0aDogZml0LWNvbnRlbnQ7XG59XHJcbi53LWZ1bGwge1xuICB3aWR0aDogMTAwJTtcbn1cclxuLnctbWF4IHtcbiAgd2lkdGg6IG1heC1jb250ZW50O1xufVxyXG4ubWluLXctNTYge1xuICBtaW4td2lkdGg6IDE0cmVtO1xufVxyXG4ubWluLXctXFxcXFszMDBweFxcXFxdIHtcbiAgbWluLXdpZHRoOiAzMDBweDtcbn1cclxuLm1pbi13LVxcXFxbNDhweFxcXFxdIHtcbiAgbWluLXdpZHRoOiA0OHB4O1xufVxyXG4ubWluLXctXFxcXFs5MFxcXFwlXFxcXF0ge1xuICBtaW4td2lkdGg6IDkwJTtcbn1cclxuLm1heC13LTU2IHtcbiAgbWF4LXdpZHRoOiAxNHJlbTtcbn1cclxuLm1heC13LVxcXFxbMjAwcHhcXFxcXSB7XG4gIG1heC13aWR0aDogMjAwcHg7XG59XHJcbi5tYXgtdy1cXFxcWzI1MHB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDI1MHB4O1xufVxyXG4ubWF4LXctXFxcXFsyNzBweFxcXFxdIHtcbiAgbWF4LXdpZHRoOiAyNzBweDtcbn1cclxuLm1heC13LVxcXFxbMzUwcHhcXFxcXSB7XG4gIG1heC13aWR0aDogMzUwcHg7XG59XHJcbi5tYXgtdy1cXFxcWzQ1MHB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDQ1MHB4O1xufVxyXG4ubWF4LXctXFxcXFs0NXB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDQ1cHg7XG59XHJcbi5tYXgtdy1cXFxcWzUwMHB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDUwMHB4O1xufVxyXG4ubWF4LXctc20ge1xuICBtYXgtd2lkdGg6IDI0cmVtO1xufVxyXG4uZmxleC0xIHtcbiAgZmxleDogMSAxIDAlO1xufVxyXG4uZmxleC1ub25lIHtcbiAgZmxleDogbm9uZTtcbn1cclxuLmJvcmRlci1jb2xsYXBzZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG59XHJcbi4tdHJhbnNsYXRlLXgtMVxcXFwvMiB7XG4gIC0tdHctdHJhbnNsYXRlLXg6IC01MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4uLXRyYW5zbGF0ZS15LTFcXFxcLzIge1xuICAtLXR3LXRyYW5zbGF0ZS15OiAtNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbn1cclxuLi10cmFuc2xhdGUteS1cXFxcWzUwXFxcXCVcXFxcXSB7XG4gIC0tdHctdHJhbnNsYXRlLXk6IC01MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4udHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcbi5jdXJzb3ItXFxcXFt1cmxcXFxcKFxcXFwnZGF0YVxcXFw6aW1hZ2VcXFxcL3BuZ1xcXFw7YmFzZTY0XFxcXDJjIGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4XFxcXC85aEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBU0VsRVFWUjRuR05nd0FNa0pTVWJwS1NrT3ZDcElhVDVQeFNUYm9nVVFqTVlNd3hlSUlYbVZGSXhBOFVHRER5UUdnMERuSURpNkpLVWxDeEhNcUNlWkFPZ2hqU0FNRDVGQUtmZWFVUmRVRnhDQUFBQUFFbEZUa1N1UW1DQ1xcXFwnXFxcXClcXFxcMmMgX3BvaW50ZXJcXFxcXSB7XG4gIGN1cnNvcjogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pLCBwb2ludGVyO1xufVxyXG4uY3Vyc29yLWFsbC1zY3JvbGwge1xuICBjdXJzb3I6IGFsbC1zY3JvbGw7XG59XHJcbi5jdXJzb3ItY3Jvc3NoYWlyIHtcbiAgY3Vyc29yOiBjcm9zc2hhaXI7XG59XHJcbi5jdXJzb3ItZGVmYXVsdCB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cclxuLmN1cnNvci1wb2ludGVyIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxyXG4uY3Vyc29yLXByb2dyZXNzIHtcbiAgY3Vyc29yOiBwcm9ncmVzcztcbn1cclxuLnNlbGVjdC1ub25lIHtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cclxuLnJlc2l6ZS1ub25lIHtcbiAgcmVzaXplOiBub25lO1xufVxyXG4ucmVzaXplIHtcbiAgcmVzaXplOiBib3RoO1xufVxyXG4ubGlzdC1kaXNjIHtcbiAgbGlzdC1zdHlsZS10eXBlOiBkaXNjO1xufVxyXG4ubGlzdC1ub25lIHtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xufVxyXG4uZ3JpZC1jb2xzLTEge1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgxLCBtaW5tYXgoMCwgMWZyKSk7XG59XHJcbi5ncmlkLWNvbHMtMTIge1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgxMiwgbWlubWF4KDAsIDFmcikpO1xufVxyXG4uZ3JpZC1jb2xzLTIge1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoMCwgMWZyKSk7XG59XHJcbi5mbGV4LXJvdyB7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG59XHJcbi5mbGV4LWNvbCB7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XHJcbi5mbGV4LXdyYXAge1xuICBmbGV4LXdyYXA6IHdyYXA7XG59XHJcbi5pdGVtcy1zdGFydCB7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xufVxyXG4uaXRlbXMtY2VudGVyIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cclxuLml0ZW1zLXN0cmV0Y2gge1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbn1cclxuLmp1c3RpZnktc3RhcnQge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG59XHJcbi5qdXN0aWZ5LWVuZCB7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG59XHJcbi5qdXN0aWZ5LWNlbnRlciB7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxyXG4uanVzdGlmeS1iZXR3ZWVuIHtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxyXG4uanVzdGlmeS1hcm91bmQge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbn1cclxuLmdhcC0wIHtcbiAgZ2FwOiAwcHg7XG59XHJcbi5nYXAtMFxcXFwuNSB7XG4gIGdhcDogMC4xMjVyZW07XG59XHJcbi5nYXAtMSB7XG4gIGdhcDogMC4yNXJlbTtcbn1cclxuLmdhcC0yIHtcbiAgZ2FwOiAwLjVyZW07XG59XHJcbi5nYXAtMyB7XG4gIGdhcDogMC43NXJlbTtcbn1cclxuLmdhcC00IHtcbiAgZ2FwOiAxcmVtO1xufVxyXG4uZ2FwLTUge1xuICBnYXA6IDEuMjVyZW07XG59XHJcbi5nYXAtOCB7XG4gIGdhcDogMnJlbTtcbn1cclxuLmdhcC1cXFxcWzEwcHhcXFxcXSB7XG4gIGdhcDogMTBweDtcbn1cclxuLmdhcC1cXFxcWzVweFxcXFxdIHtcbiAgZ2FwOiA1cHg7XG59XHJcbi5nYXAtXFxcXFs4cHhcXFxcXSB7XG4gIGdhcDogOHB4O1xufVxyXG4uZ2FwLXgtMiB7XG4gIGNvbHVtbi1nYXA6IDAuNXJlbTtcbn1cclxuLmdhcC14LTQge1xuICBjb2x1bW4tZ2FwOiAxcmVtO1xufVxyXG4uZ2FwLXgtNSB7XG4gIGNvbHVtbi1nYXA6IDEuMjVyZW07XG59XHJcbi5nYXAteC1cXFxcWzJweFxcXFxdIHtcbiAgY29sdW1uLWdhcDogMnB4O1xufVxyXG4uZ2FwLXgtXFxcXFs1cHhcXFxcXSB7XG4gIGNvbHVtbi1nYXA6IDVweDtcbn1cclxuLmdhcC15LTEge1xuICByb3ctZ2FwOiAwLjI1cmVtO1xufVxyXG4uZ2FwLXktMiB7XG4gIHJvdy1nYXA6IDAuNXJlbTtcbn1cclxuLmdhcC15LTMge1xuICByb3ctZ2FwOiAwLjc1cmVtO1xufVxyXG4uZ2FwLXktXFxcXFsycHhcXFxcXSB7XG4gIHJvdy1nYXA6IDJweDtcbn1cclxuLnBsYWNlLXNlbGYtY2VudGVyIHtcbiAgcGxhY2Utc2VsZjogY2VudGVyO1xufVxyXG4uc2VsZi1zdGFydCB7XG4gIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG59XHJcbi5zZWxmLWNlbnRlciB7XG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcbn1cclxuLm92ZXJmbG93LWF1dG8ge1xuICBvdmVyZmxvdzogYXV0bztcbn1cclxuLm92ZXJmbG93LWhpZGRlbiB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XHJcbi5vdmVyZmxvdy14LWF1dG8ge1xuICBvdmVyZmxvdy14OiBhdXRvO1xufVxyXG4ub3ZlcmZsb3cteS1hdXRvIHtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cclxuLm92ZXJmbG93LXgtc2Nyb2xsIHtcbiAgb3ZlcmZsb3cteDogc2Nyb2xsO1xufVxyXG4ub3ZlcmZsb3cteS1zY3JvbGwge1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG59XHJcbi50ZXh0LWVsbGlwc2lzIHtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG59XHJcbi53aGl0ZXNwYWNlLW5vd3JhcCB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XHJcbi53aGl0ZXNwYWNlLXByZS13cmFwIHtcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xufVxyXG4uYnJlYWstd29yZHMge1xuICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xufVxyXG4uYnJlYWstYWxsIHtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxyXG4ucm91bmRlZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XG59XHJcbi5yb3VuZGVkLVxcXFxbMXB4XFxcXF0ge1xuICBib3JkZXItcmFkaXVzOiAxcHg7XG59XHJcbi5yb3VuZGVkLVxcXFxbMnB4XFxcXF0ge1xuICBib3JkZXItcmFkaXVzOiAycHg7XG59XHJcbi5yb3VuZGVkLWJveCB7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbn1cclxuLnJvdW5kZWQtZnVsbCB7XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbn1cclxuLnJvdW5kZWQtbGcge1xuICBib3JkZXItcmFkaXVzOiAwLjVyZW07XG59XHJcbi5yb3VuZGVkLW1kIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zNzVyZW07XG59XHJcbi5yb3VuZGVkLW5vbmUge1xuICBib3JkZXItcmFkaXVzOiAwcHg7XG59XHJcbi5yb3VuZGVkLXNtIHtcbiAgYm9yZGVyLXJhZGl1czogMC4xMjVyZW07XG59XHJcbi5yb3VuZGVkLXhsIHtcbiAgYm9yZGVyLXJhZGl1czogMC43NXJlbTtcbn1cclxuLnJvdW5kZWQtci1ub25lIHtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDBweDtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDBweDtcbn1cclxuLmJvcmRlciB7XG4gIGJvcmRlci13aWR0aDogMXB4O1xufVxyXG4uYm9yZGVyLTIge1xuICBib3JkZXItd2lkdGg6IDJweDtcbn1cclxuLmJvcmRlci1cXFxcWzBcXFxcLjFweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAwLjFweDtcbn1cclxuLmJvcmRlci1cXFxcWzBcXFxcLjJweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAwLjJweDtcbn1cclxuLmJvcmRlci1cXFxcWzBcXFxcLjVweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAwLjVweDtcbn1cclxuLmJvcmRlci1cXFxcWzFcXFxcLjNweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAxLjNweDtcbn1cclxuLmJvcmRlci1cXFxcWzFcXFxcLjVweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAxLjVweDtcbn1cclxuLmJvcmRlci1cXFxcWzFweFxcXFxdIHtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG59XHJcbi5ib3JkZXItXFxcXFsycHhcXFxcXSB7XG4gIGJvcmRlci13aWR0aDogMnB4O1xufVxyXG4uYm9yZGVyLXktXFxcXFsxcHhcXFxcXSB7XG4gIGJvcmRlci10b3Atd2lkdGg6IDFweDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4O1xufVxyXG4uYm9yZGVyLWItXFxcXFsxcHhcXFxcXSB7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDFweDtcbn1cclxuLmJvcmRlci1iLVxcXFxbM3B4XFxcXF0ge1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAzcHg7XG59XHJcbi5ib3JkZXItci1cXFxcWzNweFxcXFxdIHtcbiAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAzcHg7XG59XHJcbi5ib3JkZXItdC1cXFxcWzFweFxcXFxdIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMXB4O1xufVxyXG4uYm9yZGVyLWRhc2hlZCB7XG4gIGJvcmRlci1zdHlsZTogZGFzaGVkO1xufVxyXG4uYm9yZGVyLW5vbmUge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcIzAwN2JmZlxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMCAxMjMgMjU1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjMTg4YWUyXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyNCAxMzggMjI2IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjMzNiYmZmXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYig1MSAxODcgMjU1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjODc4Nzg3XFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigxMzUgMTM1IDEzNSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcIzg4OFxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMTM2IDEzNiAxMzYgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCM4YThhOGFcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDEzOCAxMzggMTM4IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjY2VjZWNlXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyMDYgMjA2IDIwNiAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcI2Q2ZDNkM1xcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjE0IDIxMSAyMTEgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCNlYmU4ZThcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDIzNSAyMzIgMjMyIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW2dyYXlcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDEyOCAxMjggMTI4IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW3JlZFxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjU1IDAgMCAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItYmFzZS0yMDAge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuLmJvcmRlci1iYXNlLTMwMCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4uYm9yZGVyLWJhc2UtY29udGVudCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4uYm9yZGVyLWdyYXktMzAwIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLWdyYXktNDAwIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMTU2IDE2MyAxNzUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLWluZGlnby04MDAge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYig1NSA0OCAxNjMgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLXQtcHJpbWFyeSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci10b3AtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjMmVkOGI2XFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYig0NiAyMTYgMTgyIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcIzU3NjA4MVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoODcgOTYgMTI5IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcIzhhOGE4YVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTM4IDEzOCAxMzggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjOTNhM2RiXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigxNDcgMTYzIDIxOSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCM5ZjlmOWZcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1OSAxNTkgMTU5IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcI0NBRTRGQVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjAyIDIyOCAyNTAgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjYjdiM2IzXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigxODMgMTc5IDE3OSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNjY2NcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwNCAyMDQgMjA0IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcI2UzZTJlMVxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI3IDIyNiAyMjUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjZTZmMmYyXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzAgMjQyIDI0MiAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNlNmYyZjJcXFxcXVxcXFwvNzAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjMwIDI0MiAyNDIgLyAwLjcpO1xufVxyXG4uYmctXFxcXFtcXFxcI2ZmZlxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1iYXNlLTEwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5iZy1iYXNlLTIwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5iZy1iYXNlLTMwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5iZy1iYXNlLWNvbnRlbnQge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4uYmctYmFzZS1jb250ZW50XFxcXC8zMCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjMpKTtcbn1cclxuLmJnLWJsYWNrIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMCAwIDAgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1ibGFja1xcXFwvMzAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMCAwIDAgLyAwLjMpO1xufVxyXG4uYmctYmx1ZS01MDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYig1OSAxMzAgMjQ2IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctZ3JheS0yMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjkgMjMxIDIzNSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLWdyYXktMzAwIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1ncmF5LTQwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE1NiAxNjMgMTc1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctZ3JheS01MCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0OSAyNTAgMjUxIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctaW5oZXJpdCB7XG4gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XG59XHJcbi5iZy10cmFuc3BhcmVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxyXG4uYmctd2hpdGUge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLXdoaXRlXFxcXC8yMCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIDAuMik7XG59XHJcbi5iZy1vcGFjaXR5LTIwIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAwLjI7XG59XHJcbi5iZy1vcGFjaXR5LTI1IHtcbiAgLS10dy1iZy1vcGFjaXR5OiAwLjI1O1xufVxyXG4uYmctb3BhY2l0eS0zMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMC4zO1xufVxyXG4uYmctb3BhY2l0eS01MCB7XG4gIC0tdHctYmctb3BhY2l0eTogMC41O1xufVxyXG4uYmctb3BhY2l0eS04MCB7XG4gIC0tdHctYmctb3BhY2l0eTogMC44O1xufVxyXG4uZmlsbC1jdXJyZW50IHtcbiAgZmlsbDogY3VycmVudENvbG9yO1xufVxyXG4ub2JqZWN0LWNvbnRhaW4ge1xuICBvYmplY3QtZml0OiBjb250YWluO1xufVxyXG4ucC0wIHtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ucC0xIHtcbiAgcGFkZGluZzogMC4yNXJlbTtcbn1cclxuLnAtMTQge1xuICBwYWRkaW5nOiAzLjVyZW07XG59XHJcbi5wLTIge1xuICBwYWRkaW5nOiAwLjVyZW07XG59XHJcbi5wLTMge1xuICBwYWRkaW5nOiAwLjc1cmVtO1xufVxyXG4ucC00IHtcbiAgcGFkZGluZzogMXJlbTtcbn1cclxuLnAtXFxcXFsxMHB4XFxcXF0ge1xuICBwYWRkaW5nOiAxMHB4O1xufVxyXG4ucC1cXFxcWzE1cHhcXFxcXSB7XG4gIHBhZGRpbmc6IDE1cHg7XG59XHJcbi5wLVxcXFxbMTZweFxcXFxdIHtcbiAgcGFkZGluZzogMTZweDtcbn1cclxuLnAtXFxcXFsxcHhcXFxcXSB7XG4gIHBhZGRpbmc6IDFweDtcbn1cclxuLnAtXFxcXFsyMHB4XFxcXF0ge1xuICBwYWRkaW5nOiAyMHB4O1xufVxyXG4ucC1cXFxcWzJweFxcXFxdIHtcbiAgcGFkZGluZzogMnB4O1xufVxyXG4ucC1cXFxcWzMwcHhcXFxcXSB7XG4gIHBhZGRpbmc6IDMwcHg7XG59XHJcbi5wLVxcXFxbM3B4XFxcXF0ge1xuICBwYWRkaW5nOiAzcHg7XG59XHJcbi5wLVxcXFxbNXB4XFxcXF0ge1xuICBwYWRkaW5nOiA1cHg7XG59XHJcbi5wLVxcXFxbOHB4XFxcXF0ge1xuICBwYWRkaW5nOiA4cHg7XG59XHJcbi5weC0wIHtcbiAgcGFkZGluZy1sZWZ0OiAwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDBweDtcbn1cclxuLnB4LTEge1xuICBwYWRkaW5nLWxlZnQ6IDAuMjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuMjVyZW07XG59XHJcbi5weC0yIHtcbiAgcGFkZGluZy1sZWZ0OiAwLjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNXJlbTtcbn1cclxuLnB4LTMge1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG59XHJcbi5weC00IHtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xufVxyXG4ucHgtNiB7XG4gIHBhZGRpbmctbGVmdDogMS41cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxLjVyZW07XG59XHJcbi5weC03IHtcbiAgcGFkZGluZy1sZWZ0OiAxLjc1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxLjc1cmVtO1xufVxyXG4ucHgtOCB7XG4gIHBhZGRpbmctbGVmdDogMnJlbTtcbiAgcGFkZGluZy1yaWdodDogMnJlbTtcbn1cclxuLnB4LVxcXFxbMVxcXFwuMjVyZW1cXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMS4yNXJlbTtcbiAgcGFkZGluZy1yaWdodDogMS4yNXJlbTtcbn1cclxuLnB4LVxcXFxbMTBweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xuICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xufVxyXG4ucHgtXFxcXFsxMnB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDEycHg7XG4gIHBhZGRpbmctcmlnaHQ6IDEycHg7XG59XHJcbi5weC1cXFxcWzEzcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMTNweDtcbiAgcGFkZGluZy1yaWdodDogMTNweDtcbn1cclxuLnB4LVxcXFxbMTVweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAxNXB4O1xuICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xufVxyXG4ucHgtXFxcXFsyMHB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDIwcHg7XG59XHJcbi5weC1cXFxcWzI1cHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMjVweDtcbiAgcGFkZGluZy1yaWdodDogMjVweDtcbn1cclxuLnB4LVxcXFxbM3B4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDNweDtcbiAgcGFkZGluZy1yaWdodDogM3B4O1xufVxyXG4ucHgtXFxcXFs0MHB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDQwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDQwcHg7XG59XHJcbi5weC1cXFxcWzRweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiA0cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDRweDtcbn1cclxuLnB5LTEge1xuICBwYWRkaW5nLXRvcDogMC4yNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuMjVyZW07XG59XHJcbi5weS0xXFxcXC41IHtcbiAgcGFkZGluZy10b3A6IDAuMzc1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC4zNzVyZW07XG59XHJcbi5weS0xMCB7XG4gIHBhZGRpbmctdG9wOiAyLjVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAyLjVyZW07XG59XHJcbi5weS0yIHtcbiAgcGFkZGluZy10b3A6IDAuNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbn1cclxuLnB5LTMge1xuICBwYWRkaW5nLXRvcDogMC43NXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuNzVyZW07XG59XHJcbi5weS00IHtcbiAgcGFkZGluZy10b3A6IDFyZW07XG4gIHBhZGRpbmctYm90dG9tOiAxcmVtO1xufVxyXG4ucHktXFxcXFtcXFxcLjc1cmVtXFxcXF0ge1xuICBwYWRkaW5nLXRvcDogLjc1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogLjc1cmVtO1xufVxyXG4ucHktXFxcXFsxXFxcXC41cHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAxLjVweDtcbiAgcGFkZGluZy1ib3R0b206IDEuNXB4O1xufVxyXG4ucHktXFxcXFsxMHB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMTBweDtcbiAgcGFkZGluZy1ib3R0b206IDEwcHg7XG59XHJcbi5weS1cXFxcWzFweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDFweDtcbiAgcGFkZGluZy1ib3R0b206IDFweDtcbn1cclxuLnB5LVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG4gIHBhZGRpbmctYm90dG9tOiAyMHB4O1xufVxyXG4ucHktXFxcXFszcHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAzcHg7XG4gIHBhZGRpbmctYm90dG9tOiAzcHg7XG59XHJcbi5weS1cXFxcWzVweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDVweDtcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbn1cclxuLnB5LVxcXFxbOHB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogOHB4O1xuICBwYWRkaW5nLWJvdHRvbTogOHB4O1xufVxyXG4ucGItMCB7XG4gIHBhZGRpbmctYm90dG9tOiAwcHg7XG59XHJcbi5wYi0xIHtcbiAgcGFkZGluZy1ib3R0b206IDAuMjVyZW07XG59XHJcbi5wYi0yIHtcbiAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbn1cclxuLnBiLTMge1xuICBwYWRkaW5nLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLnBiLVxcXFxbMTVweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDE1cHg7XG59XHJcbi5wYi1cXFxcWzFweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDFweDtcbn1cclxuLnBiLVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XG59XHJcbi5wYi1cXFxcWzVweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbn1cclxuLnBsLTMge1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG59XHJcbi5wbC02IHtcbiAgcGFkZGluZy1sZWZ0OiAxLjVyZW07XG59XHJcbi5wbC1cXFxcWzEwcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbn1cclxuLnBsLVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xufVxyXG4ucGwtXFxcXFs1cHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogNXB4O1xufVxyXG4ucHItMSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuMjVyZW07XG59XHJcbi5wci0yIHtcbiAgcGFkZGluZy1yaWdodDogMC41cmVtO1xufVxyXG4ucHItXFxcXFszcHhcXFxcXSB7XG4gIHBhZGRpbmctcmlnaHQ6IDNweDtcbn1cclxuLnByLVxcXFxbNXB4XFxcXF0ge1xuICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG59XHJcbi5wdC0wIHtcbiAgcGFkZGluZy10b3A6IDBweDtcbn1cclxuLnB0LTEge1xuICBwYWRkaW5nLXRvcDogMC4yNXJlbTtcbn1cclxuLnB0LTIge1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xufVxyXG4ucHQtMyB7XG4gIHBhZGRpbmctdG9wOiAwLjc1cmVtO1xufVxyXG4ucHQtNCB7XG4gIHBhZGRpbmctdG9wOiAxcmVtO1xufVxyXG4ucHQtXFxcXFsxMHB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMTBweDtcbn1cclxuLnB0LVxcXFxbMTVweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDE1cHg7XG59XHJcbi5wdC1cXFxcWzIwcHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAyMHB4O1xufVxyXG4udGV4dC1sZWZ0IHtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cclxuLnRleHQtY2VudGVyIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxyXG4uYWxpZ24tYmFzZWxpbmUge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XHJcbi50ZXh0LTJ4bCB7XG4gIGZvbnQtc2l6ZTogMS41cmVtO1xuICBsaW5lLWhlaWdodDogMnJlbTtcbn1cclxuLnRleHQtM3hsIHtcbiAgZm9udC1zaXplOiAxLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDIuMjVyZW07XG59XHJcbi50ZXh0LVxcXFxbMVxcXFwuMnJlbVxcXFxdIHtcbiAgZm9udC1zaXplOiAxLjJyZW07XG59XHJcbi50ZXh0LVxcXFxbMVxcXFwuNXJlbVxcXFxdIHtcbiAgZm9udC1zaXplOiAxLjVyZW07XG59XHJcbi50ZXh0LVxcXFxbMTBweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxMHB4O1xufVxyXG4udGV4dC1cXFxcWzExcHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMTFweDtcbn1cclxuLnRleHQtXFxcXFsxMnB4XFxcXF0ge1xuICBmb250LXNpemU6IDEycHg7XG59XHJcbi50ZXh0LVxcXFxbMTNweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxM3B4O1xufVxyXG4udGV4dC1cXFxcWzE0cHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cclxuLnRleHQtXFxcXFsxNXB4XFxcXF0ge1xuICBmb250LXNpemU6IDE1cHg7XG59XHJcbi50ZXh0LVxcXFxbMTZweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxNnB4O1xufVxyXG4udGV4dC1cXFxcWzE4cHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMThweDtcbn1cclxuLnRleHQtXFxcXFsyMHB4XFxcXF0ge1xuICBmb250LXNpemU6IDIwcHg7XG59XHJcbi50ZXh0LVxcXFxbMjVweFxcXFxdIHtcbiAgZm9udC1zaXplOiAyNXB4O1xufVxyXG4udGV4dC1cXFxcWzMwcHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMzBweDtcbn1cclxuLnRleHQtXFxcXFs0MHB4XFxcXF0ge1xuICBmb250LXNpemU6IDQwcHg7XG59XHJcbi50ZXh0LVxcXFxbNjBweFxcXFxdIHtcbiAgZm9udC1zaXplOiA2MHB4O1xufVxyXG4udGV4dC1cXFxcWzhweFxcXFxdIHtcbiAgZm9udC1zaXplOiA4cHg7XG59XHJcbi50ZXh0LWJhc2Uge1xuICBmb250LXNpemU6IDFyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG59XHJcbi50ZXh0LWxnIHtcbiAgZm9udC1zaXplOiAxLjEyNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XG59XHJcbi50ZXh0LXNtIHtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG59XHJcbi50ZXh0LXhsIHtcbiAgZm9udC1zaXplOiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMS43NXJlbTtcbn1cclxuLnRleHQteHMge1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxcmVtO1xufVxyXG4uZm9udC1cXFxcWzQwMFxcXFxdIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbn1cclxuLmZvbnQtXFxcXFs1MDBcXFxcXSB7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XHJcbi5mb250LVxcXFxbNjUwXFxcXF0ge1xuICBmb250LXdlaWdodDogNjUwO1xufVxyXG4uZm9udC1cXFxcWzcwMFxcXFxdIHtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbn1cclxuLmZvbnQtYm9sZCB7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG59XHJcbi5mb250LWV4dHJhbGlnaHQge1xuICBmb250LXdlaWdodDogMjAwO1xufVxyXG4uZm9udC1saWdodCB7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG59XHJcbi5mb250LW1lZGl1bSB7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XHJcbi5mb250LW5vcm1hbCB7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG59XHJcbi5mb250LXNlbWlib2xkIHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbn1cclxuLnVwcGVyY2FzZSB7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG59XHJcbi5sb3dlcmNhc2Uge1xuICB0ZXh0LXRyYW5zZm9ybTogbG93ZXJjYXNlO1xufVxyXG4uY2FwaXRhbGl6ZSB7XG4gIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xufVxyXG4uaXRhbGljIHtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjMDAyODYyXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigwIDQwIDk4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbXFxcXCMzM2JiZmZcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDUxIDE4NyAyNTUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcIzQyNDI0MlxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoNjYgNjYgNjYgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcIzg3ODc4N1xcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMTM1IDEzNSAxMzUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcI2E2NGI0ZVxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMTY2IDc1IDc4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbXFxcXCNhYzQ4NDhcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDE3MiA3MiA3MiAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjZjU0MDVlXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyNDUgNjQgOTQgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcI2ZhYjAwNVxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjUwIDE3NiA1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbYmx1ZVxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMCAwIDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW2dyYXlcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDEyOCAxMjggMTI4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbZ3JlZW5cXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDAgMTI4IDAgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtncmV5XFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxMjggMTI4IDEyOCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW3JlZFxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjU1IDAgMCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1iYXNlLTEwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLnRleHQtYmFzZS1jb250ZW50IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1ibGFjayB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDAgMCAwIC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWJsdWUtNjAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMzcgOTkgMjM1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWJsdWUtODAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMzAgNjQgMTc1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWdyYXktMzAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtZ3JheS00MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxNTYgMTYzIDE3NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1ncmF5LTUwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDEwNyAxMTQgMTI4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWdyYXktNzAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoNTUgNjUgODEgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtZ3JlZW4tNjAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjIgMTYzIDc0IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LW5ldXRyYWwge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1wcmltYXJ5LWNvbnRlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi50ZXh0LXJlZC01MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyMzkgNjggNjggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtcmVkLTYwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDIyMCAzOCAzOCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC10cmFuc3BhcmVudCB7XG4gIGNvbG9yOiB0cmFuc3BhcmVudDtcbn1cclxuLnRleHQtd2hpdGUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udW5kZXJsaW5lIHtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTtcbn1cclxuLm5vLXVuZGVybGluZSB7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiBub25lO1xufVxyXG4udW5kZXJsaW5lLW9mZnNldC0xIHtcbiAgdGV4dC11bmRlcmxpbmUtb2Zmc2V0OiAxcHg7XG59XHJcbi51bmRlcmxpbmUtb2Zmc2V0LTIge1xuICB0ZXh0LXVuZGVybGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLnVuZGVybGluZS1vZmZzZXQtOCB7XG4gIHRleHQtdW5kZXJsaW5lLW9mZnNldDogOHB4O1xufVxyXG4ub3BhY2l0eS01MCB7XG4gIG9wYWNpdHk6IDAuNTtcbn1cclxuLnNoYWRvdyB7XG4gIC0tdHctc2hhZG93OiAwIDFweCAzcHggMCByZ2IoMCAwIDAgLyAwLjEpLCAwIDFweCAycHggLTFweCByZ2IoMCAwIDAgLyAwLjEpO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAzcHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDFweCAycHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xufVxyXG4uc2hhZG93LWxnIHtcbiAgLS10dy1zaGFkb3c6IDAgMTBweCAxNXB4IC0zcHggcmdiKDAgMCAwIC8gMC4xKSwgMCA0cHggNnB4IC00cHggcmdiKDAgMCAwIC8gMC4xKTtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAxMHB4IDE1cHggLTNweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDRweCA2cHggLTRweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xufVxyXG4uc2hhZG93LW1kIHtcbiAgLS10dy1zaGFkb3c6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuMSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuMSk7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgNHB4IDZweCAtMXB4IHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgMnB4IDRweCAtMnB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXNoYWRvdyk7XG59XHJcbi5vdXRsaW5lLW5vbmUge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vdXRsaW5lIHtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG59XHJcbi5vdXRsaW5lLTEge1xuICBvdXRsaW5lLXdpZHRoOiAxcHg7XG59XHJcbi5vdXRsaW5lLVxcXFxbMVxcXFwuNXB4XFxcXF0ge1xuICBvdXRsaW5lLXdpZHRoOiAxLjVweDtcbn1cclxuLm91dGxpbmUtXFxcXFtcXFxcIzAwN2JmZlxcXFxdIHtcbiAgb3V0bGluZS1jb2xvcjogIzAwN2JmZjtcbn1cclxuLm91dGxpbmUtc2xhdGUtMzAwXFxcXC81MCB7XG4gIG91dGxpbmUtY29sb3I6IHJnYigyMDMgMjEzIDIyNSAvIDAuNSk7XG59XHJcbi5yaW5nLVxcXFxbMXB4XFxcXF0ge1xuICAtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpIHZhcigtLXR3LXJpbmctb2Zmc2V0LWNvbG9yKTtcbiAgLS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygxcHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3cpLCB2YXIoLS10dy1yaW5nLXNoYWRvdyksIHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKTtcbn1cclxuLnJpbmctXFxcXFsycHhcXFxcXSB7XG4gIC0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpO1xuICAtLXR3LXJpbmctc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCBjYWxjKDJweCArIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSkgdmFyKC0tdHctcmluZy1jb2xvcik7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksIHZhcigtLXR3LXJpbmctc2hhZG93KSwgdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApO1xufVxyXG4ucmluZy1cXFxcW1xcXFwjMDAyODYyXFxcXF0ge1xuICAtLXR3LXJpbmctb3BhY2l0eTogMTtcbiAgLS10dy1yaW5nLWNvbG9yOiByZ2IoMCA0MCA5OCAvIHZhcigtLXR3LXJpbmctb3BhY2l0eSkpO1xufVxyXG4ucmluZy1ncmF5LTQwMCB7XG4gIC0tdHctcmluZy1vcGFjaXR5OiAxO1xuICAtLXR3LXJpbmctY29sb3I6IHJnYigxNTYgMTYzIDE3NSAvIHZhcigtLXR3LXJpbmctb3BhY2l0eSkpO1xufVxyXG4ucmluZy1vZmZzZXQtMiB7XG4gIC0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDJweDtcbn1cclxuLmJsdXIge1xuICAtLXR3LWJsdXI6IGJsdXIoOHB4KTtcbiAgZmlsdGVyOiB2YXIoLS10dy1ibHVyKSB2YXIoLS10dy1icmlnaHRuZXNzKSB2YXIoLS10dy1jb250cmFzdCkgdmFyKC0tdHctZ3JheXNjYWxlKSB2YXIoLS10dy1odWUtcm90YXRlKSB2YXIoLS10dy1pbnZlcnQpIHZhcigtLXR3LXNhdHVyYXRlKSB2YXIoLS10dy1zZXBpYSkgdmFyKC0tdHctZHJvcC1zaGFkb3cpO1xufVxyXG4uZmlsdGVyIHtcbiAgZmlsdGVyOiB2YXIoLS10dy1ibHVyKSB2YXIoLS10dy1icmlnaHRuZXNzKSB2YXIoLS10dy1jb250cmFzdCkgdmFyKC0tdHctZ3JheXNjYWxlKSB2YXIoLS10dy1odWUtcm90YXRlKSB2YXIoLS10dy1pbnZlcnQpIHZhcigtLXR3LXNhdHVyYXRlKSB2YXIoLS10dy1zZXBpYSkgdmFyKC0tdHctZHJvcC1zaGFkb3cpO1xufVxyXG4udHJhbnNpdGlvbiB7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAxNTBtcztcbn1cclxuLnRyYW5zaXRpb24tYWxsIHtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogYWxsO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMTUwbXM7XG59XHJcblxyXG5ib2R5IHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLyogQ3VzdG9tIENTUyB0byBoaWRlIHNjcm9sbGJhciAqL1xyXG4uaGlkZS1zY3JvbGxiYXI6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcclxuICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4uaGlkZS1zY3JvbGxiYXIge1xyXG4gIC1tcy1vdmVyZmxvdy1zdHlsZTogbm9uZTtcclxuICAvKiBJRSBhbmQgRWRnZSAqL1xyXG4gIHNjcm9sbGJhci13aWR0aDogbm9uZTtcclxuICAvKiBGaXJlZm94ICovXHJcbn1cclxuXHJcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2NnB4KSB7XHJcbiAgLmJCb2ZHciB7XHJcbiAgICB3aWR0aDogMTRweCAhaW1wb3J0YW50O1xyXG4gIH1cclxufVxyXG5cclxuLyogYmVsb3cgY3NzIGNsYXNzIHJlcGxhY2UgYm9vdHN0cmFwIGJhY2tncm91bmQgY29sb3Igd2l0aCBkYWlzeSAqL1xyXG4ub3AtYmctcHJpbWFyeSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLm9wLWJnLXNlY29uZGFyeSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLm9wLWJnLWluZm8ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLm9wLWJnLXN1Y2Nlc3Mge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLm9wLWJnLXdhcm5pbmcge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhLG9rbGNoKHZhcigtLXdhKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLyogYmVsb3cgY3NzIGNsYXNzIHJlcGxhY2UgYm9vdHN0cmFwIHRleHQgY29sb3Igd2l0aCBkYWlzeSAqL1xyXG4ub3AtdGV4dC1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuXHJcbi5vcC10ZXh0LXNlY29uZGFyeSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcblxyXG4ub3AtdGV4dC1pbmZvIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5cclxuLm9wLXRleHQtYWNjZW50IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1hLG9rbGNoKHZhcigtLWEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuXHJcbi5vcC10ZXh0LXN1Y2Nlc3Mge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcblxyXG4ub3AtdGV4dC13YXJuaW5nIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5cclxuLm9wLWJvcmRlci1wcmltYXJ5IHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG5cclxuLyogQ1NTIGZvciBzY3JvbGxiYXIgY3VzdG9taXphdGlvbiAqL1xyXG4qIHtcclxuICBzY3JvbGxiYXItd2lkdGg6IHRoaW47XHJcbiAgLyogRm9yIEZpcmVmb3ggKi9cclxuICBzY3JvbGxiYXItY29sb3I6IGdyYXk7XHJcbiAgLyogRm9yIEZpcmVmb3ggKi9cclxufVxyXG5cclxuLyogRm9yIHdlYmtpdC1iYXNlZCBicm93c2VycyBsaWtlIENocm9tZSwgU2FmYXJpICovXHJcbio6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcclxuICB3aWR0aDogNXB4O1xyXG59XHJcblxyXG4qOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XHJcbn1cclxuXHJcbio6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xyXG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XHJcbn1cclxuXHJcbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuXG4gIC5tZFxcXFw6b3AtYnRuLXNtIHtcbiAgICBoZWlnaHQ6IDJyZW07XG4gICAgbWluLWhlaWdodDogMnJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gICAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbiAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpvcC1idG4tbWQge1xuICAgIGhlaWdodDogM3JlbTtcbiAgICBtaW4taGVpZ2h0OiAzcmVtO1xuICAgIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIH1cblxuICAub3AtYnRuLXNxdWFyZTp3aGVyZSgubWRcXFxcOm9wLWJ0bi1zbSkge1xuICAgIGhlaWdodDogMnJlbTtcbiAgICB3aWR0aDogMnJlbTtcbiAgICBwYWRkaW5nOiAwcHg7XG4gIH1cblxuICAub3AtYnRuLXNxdWFyZTp3aGVyZSgubWRcXFxcOm9wLWJ0bi1tZCkge1xuICAgIGhlaWdodDogM3JlbTtcbiAgICB3aWR0aDogM3JlbTtcbiAgICBwYWRkaW5nOiAwcHg7XG4gIH1cblxuICAub3AtYnRuLWNpcmNsZTp3aGVyZSgubWRcXFxcOm9wLWJ0bi1zbSkge1xuICAgIGhlaWdodDogMnJlbTtcbiAgICB3aWR0aDogMnJlbTtcbiAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgcGFkZGluZzogMHB4O1xuICB9XG5cbiAgLm9wLWJ0bi1jaXJjbGU6d2hlcmUoLm1kXFxcXDpvcC1idG4tbWQpIHtcbiAgICBoZWlnaHQ6IDNyZW07XG4gICAgd2lkdGg6IDNyZW07XG4gICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIHBhZGRpbmc6IDBweDtcbiAgfVxufVxyXG5cclxuLmFmdGVyXFxcXDphYnNvbHV0ZTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxyXG5cclxuLmFmdGVyXFxcXDpzdGFydC1cXFxcWzJweFxcXFxdOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICBpbnNldC1pbmxpbmUtc3RhcnQ6IDJweDtcbn1cclxuXHJcbi5hZnRlclxcXFw6dG9wLVxcXFxbMnB4XFxcXF06OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIHRvcDogMnB4O1xufVxyXG5cclxuLmFmdGVyXFxcXDpoLTQ6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIGhlaWdodDogMXJlbTtcbn1cclxuXHJcbi5hZnRlclxcXFw6dy00OjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICB3aWR0aDogMXJlbTtcbn1cclxuXHJcbi5hZnRlclxcXFw6cm91bmRlZC1mdWxsOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOmJvcmRlcjo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOmJvcmRlci1ncmF5LTMwMDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG5cclxuLmFmdGVyXFxcXDpiZy13aGl0ZTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOnRyYW5zaXRpb24tYWxsOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBhbGw7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAxNTBtcztcbn1cclxuXHJcbi5hZnRlclxcXFw6Y29udGVudC1cXFxcW1xcXFwnXFxcXCdcXFxcXTo6YWZ0ZXIge1xuICAtLXR3LWNvbnRlbnQ6ICcnO1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbn1cclxuXHJcbi5sYXN0XFxcXDptYi0wXFxcXC41Omxhc3QtY2hpbGQge1xuICBtYXJnaW4tYm90dG9tOiAwLjEyNXJlbTtcbn1cclxuXHJcbi5jaGVja2VkXFxcXDpiZy13aGl0ZTpjaGVja2VkIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcblxyXG4uY2hlY2tlZFxcXFw6XFxcXFstLXRnbGJnXFxcXDpcXFxcIzMzNjhmZlxcXFxdOmNoZWNrZWQge1xuICAtLXRnbGJnOiAjMzM2OGZmO1xufVxyXG5cclxuLmhvdmVyXFxcXDpjdXJzb3Itc3ctcmVzaXplOmhvdmVyIHtcbiAgY3Vyc29yOiBzdy1yZXNpemU7XG59XHJcblxyXG4uaG92ZXJcXFxcOmJvcmRlci1cXFxcW1xcXFwjZDJlM2ZjXFxcXF06aG92ZXIge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyMTAgMjI3IDI1MiAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcblxyXG4uaG92ZXJcXFxcOmJvcmRlci1iYXNlLWNvbnRlbnQ6aG92ZXIge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6YmctXFxcXFtcXFxcI2VjZjNmZWI3XFxcXF06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWNmM2ZlYjc7XG59XHJcblxyXG4uaG92ZXJcXFxcOmJnLWJhc2UtMzAwOmhvdmVyIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMyxva2xjaCh2YXIoLS1iMykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6YmctdHJhbnNwYXJlbnQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cclxuXHJcbi5ob3ZlclxcXFw6dGV4dC1iYXNlLWNvbnRlbnQ6aG92ZXIge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcblxyXG4uaG92ZXJcXFxcOnRleHQtYmx1ZS04MDA6aG92ZXIge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigzMCA2NCAxNzUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6dGV4dC13aGl0ZTpob3ZlciB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcblxyXG4uaG92ZXJcXFxcOnVuZGVybGluZTpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiB1bmRlcmxpbmU7XG59XHJcblxyXG4uaG92ZXJcXFxcOm5vLXVuZGVybGluZTpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiBub25lO1xufVxyXG5cclxuLmhvdmVyXFxcXDpzaGFkb3ctbGc6aG92ZXIge1xuICAtLXR3LXNoYWRvdzogMCAxMHB4IDE1cHggLTNweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDRweCA2cHggLTRweCByZ2IoMCAwIDAgLyAwLjEpO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDEwcHggMTVweCAtM3B4IHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgNHB4IDZweCAtNHB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXNoYWRvdyk7XG59XHJcblxyXG4uZm9jdXNcXFxcOmJnLWJhc2UtMzAwOmZvY3VzIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMyxva2xjaCh2YXIoLS1iMykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuXHJcbi5mb2N1c1xcXFw6b3V0bGluZS1ub25lOmZvY3VzIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG5cclxuLmRpc2FibGVkXFxcXDp0ZXh0LVxcXFxbXFxcXCM1YzVjNWNcXFxcXTpkaXNhYmxlZCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDkyIDkyIDkyIC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcblxyXG4uZ3JvdXA6aG92ZXIgLmdyb3VwLWhvdmVyXFxcXDpib3JkZXItYmFzZS1jb250ZW50IHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcblxyXG4ucGVlcjpjaGVja2VkIH4gLnBlZXItY2hlY2tlZFxcXFw6YmctYmx1ZS02MDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigzNyA5OSAyMzUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcblxyXG4ucGVlcjpjaGVja2VkIH4gLnBlZXItY2hlY2tlZFxcXFw6YWZ0ZXJcXFxcOnRyYW5zbGF0ZS14LWZ1bGw6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIC0tdHctdHJhbnNsYXRlLXg6IDEwMCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG5cclxuLnBlZXI6Y2hlY2tlZCB+IC5wZWVyLWNoZWNrZWRcXFxcOmFmdGVyXFxcXDpib3JkZXItd2hpdGU6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuXHJcbi5wZWVyOmZvY3VzIH4gLnBlZXItZm9jdXNcXFxcOm91dGxpbmUtbm9uZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuXHJcbi5wZWVyOmZvY3VzIH4gLnBlZXItZm9jdXNcXFxcOnJpbmctMSB7XG4gIC0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpO1xuICAtLXR3LXJpbmctc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCBjYWxjKDFweCArIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSkgdmFyKC0tdHctcmluZy1jb2xvcik7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksIHZhcigtLXR3LXJpbmctc2hhZG93KSwgdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApO1xufVxyXG5cclxuLnBlZXI6Zm9jdXMgfiAucGVlci1mb2N1c1xcXFw6cmluZy1ibGFjayB7XG4gIC0tdHctcmluZy1vcGFjaXR5OiAxO1xuICAtLXR3LXJpbmctY29sb3I6IHJnYigwIDAgMCAvIHZhcigtLXR3LXJpbmctb3BhY2l0eSkpO1xufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG5cbiAgLm1kXFxcXDpjb2wtc3Bhbi0xMiB7XG4gICAgZ3JpZC1jb2x1bW46IHNwYW4gMTIgLyBzcGFuIDEyO1xuICB9XG5cbiAgLm1kXFxcXDpjb2wtc3Bhbi02IHtcbiAgICBncmlkLWNvbHVtbjogc3BhbiA2IC8gc3BhbiA2O1xuICB9XG5cbiAgLm1kXFxcXDptLTAge1xuICAgIG1hcmdpbjogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDptLTEwIHtcbiAgICBtYXJnaW46IDIuNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6bS0yIHtcbiAgICBtYXJnaW46IDAuNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6bS1cXFxcWzIwcHhcXFxcXSB7XG4gICAgbWFyZ2luOiAyMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpteC0wIHtcbiAgICBtYXJnaW4tbGVmdDogMHB4O1xuICAgIG1hcmdpbi1yaWdodDogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDptYi0wIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gIH1cblxuICAubWRcXFxcOm1iLTMge1xuICAgIG1hcmdpbi1ib3R0b206IDAuNzVyZW07XG4gIH1cblxuICAubWRcXFxcOm1sLTAge1xuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gIH1cblxuICAubWRcXFxcOm1sLTQge1xuICAgIG1hcmdpbi1sZWZ0OiAxcmVtO1xuICB9XG5cbiAgLm1kXFxcXDptci0wIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bXQtMiB7XG4gICAgbWFyZ2luLXRvcDogMC41cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICAubWRcXFxcOmlubGluZS1ibG9jayB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG5cbiAgLm1kXFxcXDpmbGV4IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgLm1kXFxcXDpoaWRkZW4ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAubWRcXFxcOmgtXFxcXFsyMDBweFxcXFxdIHtcbiAgICBoZWlnaHQ6IDIwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpoLVxcXFxbNDAwcHhcXFxcXSB7XG4gICAgaGVpZ2h0OiA0MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6aC1cXFxcWzQwcHhcXFxcXSB7XG4gICAgaGVpZ2h0OiA0MHB4O1xuICB9XG5cbiAgLm1kXFxcXDpoLVxcXFxbNjZweFxcXFxdIHtcbiAgICBoZWlnaHQ6IDY2cHg7XG4gIH1cblxuICAubWRcXFxcOmgtXFxcXFs5NVxcXFwlXFxcXF0ge1xuICAgIGhlaWdodDogOTUlO1xuICB9XG5cbiAgLm1kXFxcXDptYXgtaC1cXFxcWzQwMHB4XFxcXF0ge1xuICAgIG1heC1oZWlnaHQ6IDQwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDptaW4taC1mdWxsIHtcbiAgICBtaW4taGVpZ2h0OiAxMDAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMTAwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFsxNVxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiAxNSU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFsxNTBweFxcXFxdIHtcbiAgICB3aWR0aDogMTUwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFsyMDBweFxcXFxdIHtcbiAgICB3aWR0aDogMjAwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFsyM1xcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiAyMyU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFsyNTBweFxcXFxdIHtcbiAgICB3aWR0aDogMjUwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFszMDBweFxcXFxdIHtcbiAgICB3aWR0aDogMzAwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFszNTBweFxcXFxdIHtcbiAgICB3aWR0aDogMzUwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs0MFxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA0MCU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs0MDBweFxcXFxdIHtcbiAgICB3aWR0aDogNDAwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs1XFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDUlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNTBcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNTAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNTAwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDUwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNTVcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNTUlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNTdcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNTclO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNjBcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNjAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNzBcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNzAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbOTJcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogOTIlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbOTVcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogOTUlO1xuICB9XG5cbiAgLm1kXFxcXDp3LWF1dG8ge1xuICAgIHdpZHRoOiBhdXRvO1xuICB9XG5cbiAgLm1kXFxcXDptaW4tdy1cXFxcWzQ0MHB4XFxcXF0ge1xuICAgIG1pbi13aWR0aDogNDQwcHg7XG4gIH1cblxuICAubWRcXFxcOm1pbi13LVxcXFxbNTAwcHhcXFxcXSB7XG4gICAgbWluLXdpZHRoOiA1MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWluLXctZnVsbCB7XG4gICAgbWluLXdpZHRoOiAxMDAlO1xuICB9XG5cbiAgLm1kXFxcXDptYXgtdy1cXFxcWzQwMHB4XFxcXF0ge1xuICAgIG1heC13aWR0aDogNDAwcHg7XG4gIH1cblxuICAubWRcXFxcOm1heC13LVxcXFxbNDUwcHhcXFxcXSB7XG4gICAgbWF4LXdpZHRoOiA0NTBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWF4LXctXFxcXFs1MDBweFxcXFxdIHtcbiAgICBtYXgtd2lkdGg6IDUwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpncmlkLWNvbHMtMiB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgbWlubWF4KDAsIDFmcikpO1xuICB9XG5cbiAgLm1kXFxcXDpmbGV4LXJvdyB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuXG4gIC5tZFxcXFw6aXRlbXMtY2VudGVyIHtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG5cbiAgLm1kXFxcXDpqdXN0aWZ5LXN0YXJ0IHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIH1cblxuICAubWRcXFxcOmp1c3RpZnktYmV0d2VlbiB7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICB9XG5cbiAgLm1kXFxcXDpnYXAtMSB7XG4gICAgZ2FwOiAwLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpnYXAtNiB7XG4gICAgZ2FwOiAxLjVyZW07XG4gIH1cblxuICAubWRcXFxcOmdhcC1cXFxcWzEycHhcXFxcXSB7XG4gICAgZ2FwOiAxMnB4O1xuICB9XG5cbiAgLm1kXFxcXDpnYXAtXFxcXFs4cHhcXFxcXSB7XG4gICAgZ2FwOiA4cHg7XG4gIH1cblxuICAubWRcXFxcOmdhcC15LTAge1xuICAgIHJvdy1nYXA6IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6cC0xMCB7XG4gICAgcGFkZGluZzogMi41cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpwLTQge1xuICAgIHBhZGRpbmc6IDFyZW07XG4gIH1cblxuICAubWRcXFxcOnAtNSB7XG4gICAgcGFkZGluZzogMS4yNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cHktMCB7XG4gICAgcGFkZGluZy10b3A6IDBweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpweS01IHtcbiAgICBwYWRkaW5nLXRvcDogMS4yNXJlbTtcbiAgICBwYWRkaW5nLWJvdHRvbTogMS4yNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cGItMCB7XG4gICAgcGFkZGluZy1ib3R0b206IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6cGItNCB7XG4gICAgcGFkZGluZy1ib3R0b206IDFyZW07XG4gIH1cblxuICAubWRcXFxcOnBsLTgge1xuICAgIHBhZGRpbmctbGVmdDogMnJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cHItMCB7XG4gICAgcGFkZGluZy1yaWdodDogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpwdC0zIHtcbiAgICBwYWRkaW5nLXRvcDogMC43NXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6dGV4dC1lbmQge1xuICAgIHRleHQtYWxpZ246IGVuZDtcbiAgfVxuXG4gIC5tZFxcXFw6dGV4dC0yeGwge1xuICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAycmVtO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LTN4bCB7XG4gICAgZm9udC1zaXplOiAxLjg3NXJlbTtcbiAgICBsaW5lLWhlaWdodDogMi4yNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6dGV4dC1cXFxcWzEzcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAxM3B4O1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LVxcXFxbMTVweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDE1cHg7XG4gIH1cblxuICAubWRcXFxcOnRleHQtXFxcXFsyM3B4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogMjNweDtcbiAgfVxuXG4gIC5tZFxcXFw6dGV4dC1cXFxcWzMwcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAzMHB4O1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LWJhc2Uge1xuICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS41cmVtO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LWxnIHtcbiAgICBmb250LXNpemU6IDEuMTI1cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjc1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LXNtIHtcbiAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LXhsIHtcbiAgICBmb250LXNpemU6IDEuMjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XG4gIH1cbn1cclxuXHJcbkBtZWRpYSAobWluLXdpZHRoOiAxMDI0cHgpIHtcblxuICAubGdcXFxcOnJlbGF0aXZlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cblxuICAubGdcXFxcOm9yZGVyLW5vbmUge1xuICAgIG9yZGVyOiAwO1xuICB9XG5cbiAgLmxnXFxcXDpjb2wtc3Bhbi0xMiB7XG4gICAgZ3JpZC1jb2x1bW46IHNwYW4gMTIgLyBzcGFuIDEyO1xuICB9XG5cbiAgLmxnXFxcXDpjb2wtc3Bhbi02IHtcbiAgICBncmlkLWNvbHVtbjogc3BhbiA2IC8gc3BhbiA2O1xuICB9XG5cbiAgLmxnXFxcXDpteC0wIHtcbiAgICBtYXJnaW4tbGVmdDogMHB4O1xuICAgIG1hcmdpbi1yaWdodDogMHB4O1xuICB9XG5cbiAgLmxnXFxcXDptbC00IHtcbiAgICBtYXJnaW4tbGVmdDogMXJlbTtcbiAgfVxuXG4gIC5sZ1xcXFw6YmxvY2sge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgLmxnXFxcXDpoaWRkZW4ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAubGdcXFxcOnctXFxcXFs0MFxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA0MCU7XG4gIH1cblxuICAubGdcXFxcOnctXFxcXFs0MDBweFxcXFxdIHtcbiAgICB3aWR0aDogNDAwcHg7XG4gIH1cblxuICAubGdcXFxcOnctXFxcXFs1MDBweFxcXFxdIHtcbiAgICB3aWR0aDogNTAwcHg7XG4gIH1cblxuICAubGdcXFxcOnAtMTAge1xuICAgIHBhZGRpbmc6IDIuNXJlbTtcbiAgfVxuXG4gIC5sZ1xcXFw6cC0xNiB7XG4gICAgcGFkZGluZzogNHJlbTtcbiAgfVxuXG4gIC5sZ1xcXFw6cC00IHtcbiAgICBwYWRkaW5nOiAxcmVtO1xuICB9XG5cbiAgLmxnXFxcXDp0ZXh0LVxcXFxbMTIwcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAxMjBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6dGV4dC1cXFxcWzMwcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAzMHB4O1xuICB9XG5cbiAgLmxnXFxcXDp0ZXh0LVxcXFxbNTBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDUwcHg7XG4gIH1cblxuICAubGdcXFxcOnRleHQtbGcge1xuICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XG4gIH1cbn1cclxuXHJcbkBtZWRpYSAobWluLXdpZHRoOiAxMjgwcHgpIHtcblxuICAueGxcXFxcOnctXFxcXFs1MDBweFxcXFxdIHtcbiAgICB3aWR0aDogNTAwcHg7XG4gIH1cbn1cclxuXHJcbkBtZWRpYSAobWluLXdpZHRoOiAxNTM2cHgpIHtcblxuICAuXFxcXDMyeGxcXFxcOm0tNSB7XG4gICAgbWFyZ2luOiAxLjI1cmVtO1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDptdC1cXFxcWzYzcHhcXFxcXSB7XG4gICAgbWFyZ2luLXRvcDogNjNweDtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6bWF4LXctXFxcXFs1MDBweFxcXFxdIHtcbiAgICBtYXgtd2lkdGg6IDUwMHB4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDpwLTMge1xuICAgIHBhZGRpbmc6IDAuNzVyZW07XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOnB4LVxcXFxbMTVweFxcXFxdIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gICAgcGFkZGluZy1yaWdodDogMTVweDtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6cHktXFxcXFsxMHB4XFxcXF0ge1xuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDp0ZXh0LVxcXFxbMjBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOnRleHQtXFxcXFsyNXB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogMjVweDtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6dGV4dC1cXFxcWzMwcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAzMHB4O1xuICB9XG59XHJcblxyXG4ucGVlcjpjaGVja2VkIH4gLnJ0bFxcXFw6cGVlci1jaGVja2VkXFxcXDphZnRlclxcXFw6LXRyYW5zbGF0ZS14LWZ1bGw6d2hlcmUoW2Rpcj1cInJ0bFwiXSwgW2Rpcj1cInJ0bFwiXSAqKTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgLS10dy10cmFuc2xhdGUteDogLTEwMCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG5cclxuQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xuXG4gIC5kYXJrXFxcXDpib3JkZXItYmxhY2sge1xuICAgIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMCAwIDAgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xuICB9XG5cbiAgLmRhcmtcXFxcOmJnLWdyYXktNzAwIHtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDU1IDY1IDgxIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xuICB9XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJw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O0VBQWQsVUFBYztBQUFBOztBQUFkO0VBQUEsVUFBYztBQUFBOztBQUFkOzs7RUFBQSxnQkFBYztFQUFkLFNBQWM7RUFBZCxVQUFjO0FBQUE7O0FBQWQ7O0NBQWM7QUFBZDtFQUFBLFVBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGdCQUFjO0FBQUE7O0FBQWQ7OztDQUFjOztBQUFkOztFQUFBLFVBQWMsRUFBZCxNQUFjO0VBQWQsY0FBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7RUFBQSxlQUFjO0FBQUE7O0FBQWQ7O0NBQWM7QUFBZDtFQUFBLGVBQWM7QUFBQTs7QUFBZDs7OztDQUFjOztBQUFkOzs7Ozs7OztFQUFBLGNBQWMsRUFBZCxNQUFjO0VBQWQsc0JBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7O0VBQUEsZUFBYztFQUFkLFlBQWM7QUFBQTs7QUFBZCx3RUFBYztBQUFkO0VBQUEsYUFBYztBQUFBOztBQUFkOztFQUFBLHVEQUFjO0VBQWQ7QUFBYzs7QUFBZDs7RUFBQTtJQUFBLG1CQUFjO0lBQWQscUJBQWM7SUFBZCxzQkFBYztJQUFkLHFCQUFjO0lBQWQsc0JBQWM7SUFBZCxxQkFBYztJQUFkLHNCQUFjO0lBQWQscUJBQWM7SUFBZCxzQkFBYztJQUFkLHNCQUFjO0lBQWQsc0JBQWM7SUFBZCxzQkFBYztJQUFkLHNCQUFjO0lBQWQsc0JBQWM7SUFBZCx1QkFBYztJQUFkLHNCQUFjO0lBQWQsdUJBQWM7SUFBZCxzQkFBYztJQUFkLHVCQUFjO0lBQWQsc0JBQWM7SUFBZDtFQUFjOztFQUFkOztJQUFBO01BQUEsa0JBQWM7TUFBZCxxQkFBYztNQUFkLHNCQUFjO01BQWQscUJBQWM7TUFBZCxzQkFBYztNQUFkLHFCQUFjO01BQWQsc0JBQWM7TUFBZCxxQkFBYztNQUFkLHNCQUFjO01BQWQsc0JBQWM7TUFBZCxzQkFBYztNQUFkLHNCQUFjO01BQWQsc0JBQWM7TUFBZCxzQkFBYztNQUFkLHVCQUFjO01BQWQsc0JBQWM7TUFBZCx1QkFBYztNQUFk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QjtJQUFwQiwwRUFBb0I7SUFBcEIsb0JBQW9CO0lBQXBCO0VBQW9COztFQUFwQjtJQUFBLG9CQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7O0lBQUE7TUFBQSxxRkFBb0I7TUFBcEI7SUFBb0I7RUFBQTs7RUFBcEI7SUFBQSxvQkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCOztJQUFBO01BQUEscUZBQW9CO01BQXBCO0lBQW9CO0VBQUE7O0VBQXBCO0lBQUEsb0JBQW9CO0lBQXBCO0VBQW9COztFQUFwQjs7SUFBQTtNQUFBLHFGQUFvQjtNQUFwQjtJQUFvQjtFQUFBOztFQUFwQjtJQUFBLG9CQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7O0lBQUE7TUFBQSx1RkFBb0I7TUFBcEI7SUFBb0I7RUFBQTs7RUFBcEI7SUFBQSxvQkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCOztJQUFBO01BQUEsdUZBQW9CO01BQXBCO0lBQW9CO0VBQUE7O0VBQXBCO0lBQUEsb0JBQW9CO0lBQXBCO0VBQW9COztFQUFwQjs7SUFBQTtNQUFBLHVGQUFvQjtNQUFwQjtJQUFvQjtFQUFBOztFQUFwQjtJQUFBLG9CQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7O0lBQUE7TUFBQSx1RkFBb0I7TUFBcEI7SUFBb0I7RUFBQTs7RUFBcEI7OztJQUFBLHNCQUFvQjtJQUFwQix3RUFBb0I7SUFBcEIsb0JBQW9CO0lBQXBCLGlFQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7O0lBQUE7TUFBQSxxRkFBb0I7TUFBcEI7SUFBb0I7RUFBQTs7RUFBcEI7SUFBQSxlQUFvQjtJQUFwQixlQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7SUFBQSxlQUFvQjtJQUFwQiw4QkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCOztJQUFBO01BQUE7SUFBb0I7RUFBQTs7RUFBcEI7O0lBQUEsbUJBQW9CO0lBQXBCLGlFQUFvQjtJQUFwQjtFQUFvQjtBQUFBO0FBQXBCO0VBQUE7QUFBb0I7QUFBcEI7RUFBQSxZQUFvQjtFQUFwQixjQUFvQjtFQUFwQix3QkFBb0I7RUFBcEIsZUFBb0I7RUFBcEIsY0FBb0I7RUFBcEIsbUJBQW9CO0VBQXBCLGdCQUFvQjtFQUFwQix5Q0FBb0I7RUFBcEIsaUJBQW9CO0VBQXBCLDBFQUFvQjtFQUFwQixzQkFBb0I7RUFBcEIsa0JBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsdUJBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQixZQUFvQjtFQUFwQixjQUFvQjtFQUFwQixlQUFvQjtFQUFwQix5QkFBb0I7VUFBcEIsaUJBQW9CO0VBQXBCLGVBQW9CO0VBQXBCLG1CQUFvQjtFQUFwQix1QkFBb0I7RUFBcEIsa0JBQW9CO0VBQXBCLG1CQUFvQjtFQUFwQixrQkFBb0I7RUFBcEIsbUJBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQixnQkFBb0I7RUFBcEIsZ0tBQW9CO0VBQXBCLHdKQUFvQjtFQUFwQixpTEFBb0I7RUFBcEIsd0RBQW9CO0VBQXBCLHNEQUFvQjtFQUFwQiwwQkFBb0I7RUFBcEIsbUJBQW9CO0VBQXBCLHNCQUFvQjtFQUFwQix3RUFBb0I7RUFBcEIsa0JBQW9CO0VBQXBCLHdFQUFvQjtFQUFwQixnQkFBb0I7RUFBcEIseUJBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQixpRUFBb0I7RUFBcEIsMEJBQW9CO0VBQXBCLG9DQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBLGFBQW9CO0VBQXBCLFdBQW9CO0VBQXBCLG1CQUFvQjtFQUFwQixrQkFBb0I7RUFBcEIsZ0JBQW9CO0VBQXBCLGVBQW9CO0VBQXBCLG1CQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBLGFBQW9CO0VBQXBCLGtCQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBLG1CQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBO0FBQW9CO0FBQXBCOztFQUFBO0lBQUE7RUFBb0I7O0VBQXBCO0lBQUE7RUFBb0I7QUFBQTtBQUFwQjtFQUFBLGNBQW9CO0VBQXBCLHdCQUFvQjtVQUFwQixnQkFBb0I7RUFBcEIsWUFBb0I7RUFBcEIsa0JBQW9CO0VBQXBCLG1CQUFvQjtFQUFwQixlQUFvQjtFQUFwQixjQUFvQjtFQUFwQixtQkFBb0I7RUFBcEIseUNBQW9CO0VBQXBCLGlCQUFvQjtFQUFwQix5QkFBb0I7RUFBcEIsa0JBQW9CO0VBQXBCO0FBQW9CO0FBQXBCOztFQUFBLGlCQUFvQjtFQUFwQixvQkFBb0I7RUFBcEI7QUFBb0I7QUFBcEI7RUFBQSxvQkFBb0I7RUFBcEIsdUJBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsZUFBb0I7RUFBcEIsa0JBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsb0JBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBLDBCQUFvQjtFQUFwQix3QkFBb0I7RUFBcEIsMEJBQW9CO0VBQXBCO0FBQW9CO0FBQXBCOztFQUFBLDBCQUFvQjtFQUFwQix3QkFBb0I7RUFBcEIsMEJBQW9CO0VBQXBCO0FBQW9CO0FBQXBCOztFQUFBLDBCQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjs7RUFBQSxnQ0FBb0I7RUFBcEI7QUFBb0I7QUFBcEI7O0VBQUEsZ0NBQW9CO0VBQXBCO0FBQW9CO0FBQXBCOztFQUFBLDBCQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjs7RUFBQSxnQ0FBb0I7RUFBcEI7QUFBb0I7QUFBcEI7O0VBQUE7SUFBQTtFQUFvQjtBQUFBO0FBQXBCOztFQUFBO0lBQUE7RUFBb0I7QUFBQTtBQUFwQjtFQUFBLGVBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsYUFBb0I7RUFBcEIsc0JBQW9CO0VBQXBCLGVBQW9CO0VBQXBCLG1CQUFvQjtFQUFwQixvQkFBb0I7RUFBcEI7QUFBb0I7QUFBcEI7RUFBQSxrQkFBb0I7RUFBcEIsbUJBQW9CO0VBQXBCLHlCQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBLGFBQW9CO0VBQXBCLHNCQUFvQjtFQUFwQix5QkFBb0I7RUFBcEIsbUJBQW9CO0VBQXBCLFdBQW9CO0VBQXBCLDZEQUFvQjtFQUFwQix5QkFBb0I7VUFBcEI7QUFBb0I7QUFBcEI7RUFBQSxtQkFBb0I7RUFBcEIseUJBQW9CO1VBQXBCLGlCQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBO0FBQW9CO0FBQXBCO0VBQUEsa0JBQW9CO0VBQXBCLGFBQW9CO0VBQXBCLGNBQW9CO0VBQXBCLHNCQUFvQjtFQUFwQixlQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBO0FBQW9CO0FBQXBCO0VBQUEsb0JBQW9CO0VBQXBCLGVBQW9CO0VBQXBCLFVBQW9CO0VBQXBCLFdBQW9CO0VBQXBCLGFBQW9CO0VBQXBCLFlBQW9CO0VBQXBCLGdCQUFvQjtFQUFwQixXQUFvQjtFQUFwQixlQUFvQjtFQUFwQixxQkFBb0I7RUFBcEIsWUFBb0I7RUFBcEIsVUFBb0I7RUFBcEIsNEJBQW9CO0VBQXBCLFlBQW9CO0VBQXBCLDZCQUFvQjtFQUFwQixjQUFvQjtFQUFwQiwwQkFBb0I7RUFBcEIsc0RBQW9CO0VBQXBCLG1EQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBO0FBQW9CO0FBQXBCO0VBQUEsNkJBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQixpQkFBb0I7RUFBcEIsaUJBQW9CO0VBQXBCLGdCQUFvQjtFQUFwQixnQkFBb0I7RUFBcEIsZ0JBQW9CO0VBQXBCLCtMQUFvQjtFQUFwQixvREFBb0I7RUFBcEIsbURBQW9CO0VBQXBCLGdEQUFvQjtFQUFwQixpREFBb0I7RUFBcEIsa0JBQW9CO0VBQXBCLDBFQUFvQjtFQUFwQixlQUFvQjtFQUFwQixnS0FBb0I7RUFBcEIsd0pBQW9CO0VBQXBCLGlMQUFvQjtFQUFwQix3REFBb0I7RUFBcEIsc0RBQW9CO0VBQXBCLDBCQUFvQjtFQUFwQixtREFBb0I7RUFBcEIsZ0JBQW9CO0VBQXBCO0FBQW9CO0FBQXBCOzs7O0VBQUEsb0JBQW9CO0VBQXBCLG1CQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBLGdCQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBLGFBQW9CO0VBQXBCLG1CQUFvQjtFQUFwQixzQ0FBb0I7RUFBcEIsZ0JBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsb0JBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsY0FBb0I7RUFBcEIsa0JBQW9CO0VBQXBCLGNBQW9CO0VBQXBCLGFBQW9CO0VBQXBCLGVBQW9CO0VBQXBCLHdCQUFvQjtVQUFwQixnQkFBb0I7RUFBcEIscUJBQW9CO0VBQXBCLGlCQUFvQjtFQUFwQiwwRUFBb0I7RUFBcEI7QUFBb0I7QUFBcEI7RUFBQSxvQkFBb0I7RUFBcEIsZUFBb0I7RUFBcEIseUJBQW9CO1VBQXBCLGlCQUFvQjtFQUFwQix3QkFBb0I7VUFBcEIsZ0JBQW9CO0VBQXBCLFlBQW9CO0VBQXBCLGdCQUFvQjtFQUFwQiwwQkFBb0I7RUFBcEIsMEJBQW9CO0VBQXBCLG1CQUFvQjtFQUFwQixvQkFBb0I7RUFBcEIsY0FBb0I7RUFBcEIseUNBQW9CO0VBQXBCLGlCQUFvQjtFQUFwQix5QkFBb0I7RUFBcEIsa0JBQW9CO0VBQXBCLDBFQUFvQjtFQUFwQjs4REFBb0I7RUFBcEI7dUNBQW9CO0VBQXBCO1dBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUE7QUFBb0I7QUFBcEI7RUFBQSxhQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjs7O0VBQUE7QUFBb0I7QUFBcEI7RUFBQSxrQkFBb0I7RUFBcEIsaUJBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQixZQUFvQjtFQUFwQixlQUFvQjtFQUFwQix5QkFBb0I7VUFBcEIsaUJBQW9CO0VBQXBCLHdCQUFvQjtVQUFwQixnQkFBb0I7RUFBcEIsZUFBb0I7RUFBcEIsbUJBQW9CO0VBQXBCLHVCQUFvQjtFQUFwQixrQkFBb0I7RUFBcEIsbUJBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQixjQUFvQjtFQUFwQixtQkFBb0I7RUFBcEIsc0JBQW9CO0VBQXBCLGtEQUFvQjtFQUFwQiwrQ0FBb0I7RUFBcEIseURBQW9CO0VBQXBCLHVCQUFvQjtFQUFwQiw4Q0FBb0I7RUFBcEI7QUFBb0I7QUFBcEI7RUFBQSxXQUFvQjtFQUFwQiwrQkFBb0I7RUFBcEI7QUFBb0I7QUFBcEI7RUFBQSw4QkFBb0I7RUFBcEI7QUFBb0I7QUFBcEI7RUFBQSxlQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjs7RUFBQTtBQUFvQjtBQUFwQjs7RUFBQTtBQUFvQjtBQUFwQjtFQUFBLGtCQUFvQjtFQUFwQixXQUFvQjtFQUFwQix1Q0FBb0I7RUFBcEIsZ0JBQW9CO0VBQXBCLG1CQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBLGdCQUFvQjtFQUFwQixRQUFvQjtFQUFwQixVQUFvQjtFQUFwQixrQkFBb0I7RUFBcEI7QUFBb0I7QUFBcEI7RUFBQSxnQkFBb0I7RUFBcEIsV0FBb0I7RUFBcEIsVUFBb0I7RUFBcEIsa0JBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsZ0JBQW9CO0VBQXBCLFNBQW9CO0VBQXBCLFVBQW9CO0VBQXBCLGtCQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBLGdCQUFvQjtFQUFwQixjQUFvQjtFQUFwQixrQkFBb0I7RUFBcEIsbUJBQW9CO0VBQXBCLG1CQUFvQjtFQUFwQixzQkFBb0I7RUFBcEIsbUJBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQixjQUFvQjtFQUFwQix5Q0FBb0I7RUFBcEIsaUJBQW9CO0VBQXBCLHlCQUFvQjtFQUFwQixrQkFBb0I7RUFBcEI7QUFBb0I7QUFBcEI7RUFBQSxjQUFvQjtFQUFwQiw4Q0FBb0I7RUFBcEIsc0JBQW9CO0VBQXBCLHdEQUFvQjtFQUFwQix5QkFBb0I7RUFBcEIsY0FBb0I7RUFBcEIsV0FBb0I7RUFBcEIsZUFBb0I7RUFBcEIsd0JBQW9CO1VBQXBCLGdCQUFvQjtFQUFwQiwyQ0FBb0I7RUFBcEIsaUJBQW9CO0VBQXBCLDBCQUFvQjtFQUFwQiw4QkFBb0I7RUFBcEIsOENBQW9CO0VBQXBCO29EQUFvQjtFQUFwQjs7O0FBQW9CO0FBQXBCO0VBQUEscURBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQixtRUFBb0I7RUFBcEIsaURBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEscURBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQixtRUFBb0I7RUFBcEIsaURBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEscURBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQixtRUFBb0I7RUFBcEIsaURBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEscURBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQixtRUFBb0I7RUFBcEIsaURBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsc0JBQW9CO0VBQXBCLHdFQUFvQjtFQUFwQixrQkFBb0I7RUFBcEIsd0VBQW9CO0VBQXBCLG9CQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjtFQUFBLG9CQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjs7RUFBQTtJQUFBO0VBQW9CO0FBQUE7QUFBcEI7O0VBQUEsaUNBQW9CO0VBQXBCO0FBQW9CO0FBQXBCOztFQUFBO0lBQUEsc0RBQW9CO0lBQXBCO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9CO0FBQUE7QUFBcEI7O0VBQUE7SUFBQTs7OztTQUFvQjtJQUFwQjs7Ozs7RUFBb0I7O0VBQXBCO0lBQUEscUZBQW9CO0lBQXBCO0VBQW9COztFQUFwQjtJQUFBLHFGQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7SUFBQSxxRkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCO0lBQUEsdUZBQW9CO0lBQXBCO0VBQW9COztFQUFwQjtJQUFBLHVGQUFvQjtJQUFwQjtFQUFvQjs7RUFBcEI7SUFBQSx1RkFBb0I7SUFBcEI7RUFBb0I7O0VBQXBCO0lBQUEsdUZBQW9CO0lBQXBCO0VBQW9CO0FBQUE7QUFBcEI7RUFBQSxvQkFBb0I7RUFBcEIsa0JBQW9CO0VBQXBCO0FBQW9CO0FBQXBCO0VBQUEsb0JBQW9CO0VBQXBCLGlFQUFvQjtFQUFwQjtBQUFvQjtBQUFwQjs7RUFBQTtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9COztFQUFwQjtJQUFBO0VBQW9CO0FBQUE7QUFBcEI7RUFBQSxvQkFBb0I7RUFBcEIsaUVBQW9C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RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsb0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZ0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxlQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSx5QkFBbUI7VUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsNEJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEscUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsc0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHFCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHFCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHFCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHFCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHFCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGlCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsaUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxlQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG1CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFB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R0M7O0VBaEdEO0lBQUEsWUFnR0M7SUFoR0QsV0FnR0M7SUFoR0QscUJBZ0dDO0lBaEdEO0VBZ0dDO0FBQUE7O0FBaEdEO0VBQUEsMEJBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLDBCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSwwQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsMEJBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLDBCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSwwQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsMEJBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLDBCQWdHQztFQWhHRCxzQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsMEJBZ0dDO0VBaEdELGtCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSwwQkFnR0M7RUFoR0Qsd0JBZ0dDO0VBaEdELHdEQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSxnQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUE7QUFnR0M7O0FBaEdEO0VBQUEsa0JBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBO0FBZ0dDOztBQWhHRDtFQUFBO0FBZ0dDOztBQWhHRDtFQUFBLHNCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSxzQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUE7QUFnR0M7O0FBaEdEO0VBQUEsa0JBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBO0FBZ0dDOztBQWhHRDtFQUFBLG9CQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSxvQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsb0JBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBO0FBZ0dDOztBQWhHRDtFQUFBO0FBZ0dDOztBQWhHRDtFQUFBLCtFQWdHQztFQWhHRCxtR0FnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsa0JBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLDhCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSxvQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsc0JBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLGtCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSwwQkFnR0M7RUFoR0Qsc0JBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLDBCQWdHQztFQWhHRCxzQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsOEJBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLDJHQWdHQztFQWhHRCx5R0FnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsb0JBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDs7RUFBQTtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBLGdCQWdHQztJQWhHRDtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQSxnQkFnR0M7SUFoR0Q7RUFnR0M7O0VBaEdEO0lBQUEsb0JBZ0dDO0lBaEdEO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBLGlCQWdHQztJQWhHRDtFQWdHQzs7RUFoR0Q7SUFBQSxtQkFnR0M7SUFoR0Q7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUEsZUFnR0M7SUFoR0Q7RUFnR0M7O0VBaEdEO0lBQUEsbUJBZ0dDO0lBaEdEO0VBZ0dDOztFQWhHRDtJQUFBLG1CQWdHQztJQWhHRDtFQWdHQzs7RUFoR0Q7SUFBQSxrQkFnR0M7SUFoR0Q7RUFnR0M7QUFBQTs7QUFoR0Q7O0VBQUE7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQSxnQkFnR0M7SUFoR0Q7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUEsbUJBZ0dDO0lBaEdEO0VBZ0dDO0FBQUE7O0FBaEdEOztFQUFBO0lBQUE7RUFnR0M7QUFBQTs7QUFoR0Q7O0VBQUE7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQSxrQkFnR0M7SUFoR0Q7RUFnR0M7O0VBaEdEO0lBQUEsaUJBZ0dDO0lBaEdEO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDO0FBQUE7O0FBaEdEO0VBQUEsMEJBZ0dDO0VBaEdELHVCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7O0VBQUE7SUFBQSxzQkFnR0M7SUFoR0Q7RUFnR0M7O0VBaEdEO0lBQUEsa0JBZ0dDO0lBaEdEO0VBZ0dDO0FBQUFcIixcInNvdXJjZXNDb250ZW50XCI6W1wiQHRhaWx3aW5kIGJhc2U7XFxyXFxuQHRhaWx3aW5kIGNvbXBvbmVudHM7XFxyXFxuQHRhaWx3aW5kIHV0aWxpdGllcztcXHJcXG5cXHJcXG5ib2R5IHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBDdXN0b20gQ1NTIHRvIGhpZGUgc2Nyb2xsYmFyICovXFxyXFxuLmhpZGUtc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhciB7XFxyXFxuICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uaGlkZS1zY3JvbGxiYXIge1xcclxcbiAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lO1xcclxcbiAgLyogSUUgYW5kIEVkZ2UgKi9cXHJcXG4gIHNjcm9sbGJhci13aWR0aDogbm9uZTtcXHJcXG4gIC8qIEZpcmVmb3ggKi9cXHJcXG59XFxyXFxuXFxyXFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY2cHgpIHtcXHJcXG4gIC5iQm9mR3Ige1xcclxcbiAgICB3aWR0aDogMTRweCAhaW1wb3J0YW50O1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG4vKiBiZWxvdyBjc3MgY2xhc3MgcmVwbGFjZSBib290c3RyYXAgYmFja2dyb3VuZCBjb2xvciB3aXRoIGRhaXN5ICovXFxyXFxuLm9wLWJnLXByaW1hcnkge1xcclxcbiAgQGFwcGx5IGJnLXByaW1hcnk7XFxyXFxufVxcclxcblxcclxcbi5vcC1iZy1zZWNvbmRhcnkge1xcclxcbiAgQGFwcGx5IGJnLXNlY29uZGFyeTtcXHJcXG59XFxyXFxuXFxyXFxuLm9wLWJnLWluZm8ge1xcclxcbiAgQGFwcGx5IGJnLWluZm87XFxyXFxufVxcclxcblxcclxcbi5vcC1iZy1zdWNjZXNzIHtcXHJcXG4gIEBhcHBseSBiZy1zdWNjZXNzO1xcclxcbn1cXHJcXG5cXHJcXG4ub3AtYmctd2FybmluZyB7XFxyXFxuICBAYXBwbHkgYmctd2FybmluZztcXHJcXG59XFxyXFxuXFxyXFxuLyogYmVsb3cgY3NzIGNsYXNzIHJlcGxhY2UgYm9vdHN0cmFwIHRleHQgY29sb3Igd2l0aCBkYWlzeSAqL1xcclxcbi5vcC10ZXh0LXByaW1hcnkge1xcclxcbiAgQGFwcGx5IHRleHQtcHJpbWFyeTtcXHJcXG59XFxyXFxuXFxyXFxuLm9wLXRleHQtc2Vjb25kYXJ5IHtcXHJcXG4gIEBhcHBseSB0ZXh0LXNlY29uZGFyeTtcXHJcXG59XFxyXFxuXFxyXFxuLm9wLXRleHQtaW5mbyB7XFxyXFxuICBAYXBwbHkgdGV4dC1pbmZvO1xcclxcbn1cXHJcXG5cXHJcXG4ub3AtdGV4dC1hY2NlbnQge1xcclxcbiAgQGFwcGx5IHRleHQtYWNjZW50O1xcclxcbn1cXHJcXG5cXHJcXG4ub3AtdGV4dC1zdWNjZXNzIHtcXHJcXG4gIEBhcHBseSB0ZXh0LXN1Y2Nlc3M7XFxyXFxufVxcclxcblxcclxcbi5vcC10ZXh0LXdhcm5pbmcge1xcclxcbiAgQGFwcGx5IHRleHQtd2FybmluZztcXHJcXG59XFxyXFxuXFxyXFxuLm9wLWJvcmRlci1wcmltYXJ5IHtcXHJcXG4gIEBhcHBseSBib3JkZXItcHJpbWFyeTtcXHJcXG59XFxyXFxuXFxyXFxuLyogQ1NTIGZvciBzY3JvbGxiYXIgY3VzdG9taXphdGlvbiAqL1xcclxcbioge1xcclxcbiAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xcclxcbiAgLyogRm9yIEZpcmVmb3ggKi9cXHJcXG4gIHNjcm9sbGJhci1jb2xvcjogZ3JheTtcXHJcXG4gIC8qIEZvciBGaXJlZm94ICovXFxyXFxufVxcclxcblxcclxcbi8qIEZvciB3ZWJraXQtYmFzZWQgYnJvd3NlcnMgbGlrZSBDaHJvbWUsIFNhZmFyaSAqL1xcclxcbio6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcXHJcXG4gIHdpZHRoOiA1cHg7XFxyXFxufVxcclxcblxcclxcbio6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcclxcbn1cXHJcXG5cXHJcXG4qOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBncmF5O1xcclxcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMF9fXyBmcm9tIFwiLSEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy9ibGFjay1hbHBoYS5jc3NcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzFfX18gZnJvbSBcIi0hLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvbWF1dmUuY3NzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8yX19fIGZyb20gXCItIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL3Zpb2xldC5jc3NcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLmkoX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8wX19fKTtcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLmkoX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8xX19fKTtcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLmkoX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8yX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLkNvbnRleHRNZW51Q29udGVudCxcclxuLkNvbnRleHRNZW51U3ViQ29udGVudCB7XHJcbiAgbWluLXdpZHRoOiAxMzVweDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICBib3JkZXItcmFkaXVzOiA2cHg7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICBwYWRkaW5nOiA1cHg7XHJcbiAgYm94LXNoYWRvdzpcclxuICAgIDBweCAxMHB4IDM4cHggLTEwcHggcmdiYSgyMiwgMjMsIDI0LCAwLjM1KSxcclxuICAgIDBweCAxMHB4IDIwcHggLTE1cHggcmdiYSgyMiwgMjMsIDI0LCAwLjIpO1xyXG4gIHotaW5kZXg6IDk5O1xyXG59XHJcblxyXG4uQ29udGV4dE1lbnVJdGVtLFxyXG4uQ29udGV4dE1lbnVDaGVja2JveEl0ZW0sXHJcbi5Db250ZXh0TWVudVJhZGlvSXRlbSxcclxuLkNvbnRleHRNZW51U3ViVHJpZ2dlciB7XHJcbiAgZm9udC1zaXplOiAxM3B4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxO1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgaGVpZ2h0OiAyNXB4O1xyXG4gIHBhZGRpbmc6IDAgNXB4O1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICBwYWRkaW5nLWxlZnQ6IDE1cHg7XHJcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcclxuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbn1cclxuXHJcbi5Db250ZXh0TWVudVN1YlRyaWdnZXJbZGF0YS1zdGF0ZT1cIm9wZW5cIl0ge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XHJcbn1cclxuXHJcbi5Db250ZXh0TWVudUl0ZW1bZGF0YS1kaXNhYmxlZF0sXHJcbi5Db250ZXh0TWVudUNoZWNrYm94SXRlbVtkYXRhLWRpc2FibGVkXSxcclxuLkNvbnRleHRNZW51UmFkaW9JdGVtW2RhdGEtZGlzYWJsZWRdLFxyXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyW2RhdGEtZGlzYWJsZWRdIHtcclxuICBjb2xvcjogdmFyKC0tbWF1dmUtOCk7XHJcbiAgcG9pbnRlci1ldmVudHM6IFwibm9uZVwiO1xyXG59XHJcblxyXG4uQ29udGV4dE1lbnVJdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdLFxyXG4uQ29udGV4dE1lbnVDaGVja2JveEl0ZW1bZGF0YS1oaWdobGlnaHRlZF0sXHJcbi5Db250ZXh0TWVudVJhZGlvSXRlbVtkYXRhLWhpZ2hsaWdodGVkXSxcclxuLkNvbnRleHRNZW51U3ViVHJpZ2dlcltkYXRhLWhpZ2hsaWdodGVkXSB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RhZDlkYjtcclxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcclxufVxyXG5cclxuLkNvbnRleHRNZW51TGFiZWwge1xyXG4gIHBhZGRpbmctbGVmdDogMjVweDtcclxuICBmb250LXNpemU6IDEycHg7XHJcbiAgbGluZS1oZWlnaHQ6IDI1cHg7XHJcbiAgY29sb3I6IHZhcigtLW1hdXZlLTExKTtcclxufVxyXG5cclxuLkNvbnRleHRNZW51SXRlbUluZGljYXRvciB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIGxlZnQ6IDA7XHJcbiAgd2lkdGg6IDI1cHg7XHJcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxufVxyXG5cclxuLlJpZ2h0U2xvdCB7XHJcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XHJcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xyXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS0xMSk7XHJcbn1cclxuXHJcbltkYXRhLWhpZ2hsaWdodGVkXSA+IC5SaWdodFNsb3Qge1xyXG4gIGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuW2RhdGEtZGlzYWJsZWRdIC5SaWdodFNsb3Qge1xyXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS04KTtcclxufVxyXG5cclxuLmRyb3Bkb3duLW1lbnUge1xyXG4gIG1pbi13aWR0aDogMTByZW07XHJcbn1cclxuXHJcbi5kcm9wZG93bi1pdGVtIHtcclxuICBkaXNwbGF5OiBibG9jaztcclxuICB3aWR0aDogMTAwJTtcclxuICBwYWRkaW5nOiAwLjNyZW0gMS4ycmVtO1xyXG4gIGNsZWFyOiBib3RoO1xyXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgY29sb3I6ICMzOTNhMzk7XHJcbiAgdGV4dC1hbGlnbjogaW5oZXJpdDtcclxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG4gIGJvcmRlcjogMDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5kcm9wZG93bi1pdGVtOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkOWRiO1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xyXG59XHJcblxyXG4ubW9kYWwge1xyXG4gIG1hcmdpbi10b3A6IDUwcHg7XHJcbn1cclxuLnBkZk5hbWUge1xyXG4gIGZvbnQtc2l6ZTogMTBweDtcclxuICBmb250LXdlaWdodDogNjAwO1xyXG59XHJcblxyXG5cclxuLmhyU3R5bGUge1xyXG4gIG1hcmdpbi10b3A6IDByZW0gIWltcG9ydGFudDtcclxuICBtYXJnaW4tYm90dG9tOiAwcmVtICFpbXBvcnRhbnQ7XHJcbiAgYm9yZGVyOiAwO1xyXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbn1cclxuXHJcbi5zdGF0dXMtYmFkZ2Uge1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICB0b3A6IDA7XHJcbiAgcmlnaHQ6IDA7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcclxuICB3aWR0aDogMjRweDtcclxuICBoZWlnaHQ6IDI0cHg7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xyXG59XHJcblxyXG4uc3RhdHVzLWJhZGdlIGkge1xyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxufVxyXG5cclxuLyogU3RhdHVzLXNwZWNpZmljIGNvbG9ycyAqL1xyXG4uY29tcGxldGVkIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGNhZjUwO1xyXG4gIGNvbG9yOiAjZmZmO1xyXG59XHJcblxyXG4uaW4tcHJvZ3Jlc3Mge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmMxMDc7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcbi5kZWNsaW5lZCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjtcclxuICBjb2xvcjogI2ZmZjtcclxufVxyXG5cclxuLmV4cGlyZWQge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICM5ZTllOWU7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcbi5kcmFmdCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA3OWNkYztcclxuICBjb2xvcjogI2ZmZjtcclxufVxyXG5cclxuXHJcbi5zb3J0IHtcclxuICBwYWRkaW5nOiA4cHggMTVweDtcclxuICBtYXJnaW46IDVweDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4uc29ydDpob3ZlciB7XHJcbiAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMTY4LCAyMDQsIDIwNiwgMC4xKTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tYXV2ZS0zKTtcclxuICBib3JkZXItcmFkaXVzOiAycHg7XHJcbn1cclxuXHJcbi5maWxlTmFtZSB7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHdpZHRoOiAxMDBweDtcclxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcclxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICBmb250LXNpemU6IDExcHg7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIGZvbnQtd2VpZ2h0OiA0ODA7XHJcbn1cclxuXHJcbmEge1xyXG4gIGFsbDogdW5zZXQ7XHJcbn1cclxuXHJcbi5Ib3ZlckNhcmRDb250ZW50IHtcclxuICBib3JkZXItcmFkaXVzOiA2cHg7XHJcbiAgcGFkZGluZzogNXB4IDEwcHg7XHJcbiAgd2lkdGg6IDE3MHB4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gIGJveC1zaGFkb3c6XHJcbiAgICBoc2woMjA2IDIyJSA3JSAvIDM1JSkgMHB4IDEwcHggMzhweCAtMTBweCxcclxuICAgIGhzbCgyMDYgMjIlIDclIC8gMjAlKSAwcHggMTBweCAyMHB4IC0xNXB4O1xyXG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogNDAwbXM7XHJcbiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSk7XHJcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybSwgb3BhY2l0eTtcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxufVxyXG5cclxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVwidG9wXCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVEb3duQW5kRmFkZTtcclxufVxyXG5cclxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVwicmlnaHRcIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZUxlZnRBbmRGYWRlO1xyXG59XHJcblxyXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XCJib3R0b21cIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVVwQW5kRmFkZTtcclxufVxyXG5cclxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVwibGVmdFwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlUmlnaHRBbmRGYWRlO1xyXG59XHJcblxyXG4uSG92ZXJDYXJkQXJyb3cge1xyXG4gIGZpbGw6IHdoaXRlO1xyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIHNsaWRlVXBBbmRGYWRlIHtcclxuICAwJSB7XHJcbiAgICBvcGFjaXR5OiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDJweCk7XHJcbiAgfVxyXG5cclxuICAxMDAlIHtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XHJcbiAgfVxyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIHNsaWRlUmlnaHRBbmRGYWRlIHtcclxuICAwJSB7XHJcbiAgICBvcGFjaXR5OiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0ycHgpO1xyXG4gIH1cclxuXHJcbiAgMTAwJSB7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xyXG4gIH1cclxufVxyXG5cclxuQGtleWZyYW1lcyBzbGlkZURvd25BbmRGYWRlIHtcclxuICAwJSB7XHJcbiAgICBvcGFjaXR5OiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpO1xyXG4gIH1cclxuXHJcbiAgMTAwJSB7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xyXG4gIH1cclxufVxyXG5cclxuQGtleWZyYW1lcyBzbGlkZUxlZnRBbmRGYWRlIHtcclxuICAwJSB7XHJcbiAgICBvcGFjaXR5OiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDJweCk7XHJcbiAgfVxyXG5cclxuICAxMDAlIHtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgKG1pbi13aWR0aDogMzEwcHgpIGFuZCAobWF4LXdpZHRoOiA1NTBweCkge1xyXG4gIC5zb3J0IHtcclxuICAgIHBhZGRpbmc6IDJweDtcclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwOXB4KSB7XHJcbiAgLnNvcnQge1xyXG4gICAgcGFkZGluZzogMnB4O1xyXG4gIH1cclxufVxyXG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9zdHlsZXMvb3BlbnNpZ25kcml2ZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBSUE7O0VBRUUsZ0JBQWdCO0VBQ2hCLHVCQUF1QjtFQUN2QixrQkFBa0I7RUFDbEIsZ0JBQWdCO0VBQ2hCLFlBQVk7RUFDWjs7NkNBRTJDO0VBQzNDLFdBQVc7QUFDYjs7QUFFQTs7OztFQUlFLGVBQWU7RUFDZixjQUFjO0VBQ2QsdUJBQXVCO0VBQ3ZCLGtCQUFrQjtFQUNsQixhQUFhO0VBQ2IsbUJBQW1CO0VBQ25CLFlBQVk7RUFDWixjQUFjO0VBQ2Qsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQix5QkFBaUI7VUFBakIsaUJBQWlCO0VBQ2pCLGFBQWE7QUFDZjs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0Qix1QkFBdUI7QUFDekI7O0FBRUE7Ozs7RUFJRSxx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QUNFO0lBQ0UsWUFBWTtFQUNkO0FBQ0Y7O0FBRUE7RUFDRTtJQUNFLFlBQVk7RUFDZDtBQUNGXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIkBpbXBvcnQgXFxcIkByYWRpeC11aS9jb2xvcnMvYmxhY2stYWxwaGEuY3NzXFxcIjtcXHJcXG5AaW1wb3J0IFxcXCJAcmFkaXgtdWkvY29sb3JzL21hdXZlLmNzc1xcXCI7XFxyXFxuQGltcG9ydCBcXFwiQHJhZGl4LXVpL2NvbG9ycy92aW9sZXQuY3NzXFxcIjtcXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVDb250ZW50LFxcclxcbi5Db250ZXh0TWVudVN1YkNvbnRlbnQge1xcclxcbiAgbWluLXdpZHRoOiAxMzVweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG4gIHBhZGRpbmc6IDVweDtcXHJcXG4gIGJveC1zaGFkb3c6XFxyXFxuICAgIDBweCAxMHB4IDM4cHggLTEwcHggcmdiYSgyMiwgMjMsIDI0LCAwLjM1KSxcXHJcXG4gICAgMHB4IDEwcHggMjBweCAtMTVweCByZ2JhKDIyLCAyMywgMjQsIDAuMik7XFxyXFxuICB6LWluZGV4OiA5OTtcXHJcXG59XFxyXFxuXFxyXFxuLkNvbnRleHRNZW51SXRlbSxcXHJcXG4uQ29udGV4dE1lbnVDaGVja2JveEl0ZW0sXFxyXFxuLkNvbnRleHRNZW51UmFkaW9JdGVtLFxcclxcbi5Db250ZXh0TWVudVN1YlRyaWdnZXIge1xcclxcbiAgZm9udC1zaXplOiAxM3B4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDE7XFxyXFxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgaGVpZ2h0OiAyNXB4O1xcclxcbiAgcGFkZGluZzogMCA1cHg7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDE1cHg7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5Db250ZXh0TWVudVN1YlRyaWdnZXJbZGF0YS1zdGF0ZT1cXFwib3BlblxcXCJdIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XFxyXFxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcXHJcXG59XFxyXFxuXFxyXFxuLkNvbnRleHRNZW51SXRlbVtkYXRhLWRpc2FibGVkXSxcXHJcXG4uQ29udGV4dE1lbnVDaGVja2JveEl0ZW1bZGF0YS1kaXNhYmxlZF0sXFxyXFxuLkNvbnRleHRNZW51UmFkaW9JdGVtW2RhdGEtZGlzYWJsZWRdLFxcclxcbi5Db250ZXh0TWVudVN1YlRyaWdnZXJbZGF0YS1kaXNhYmxlZF0ge1xcclxcbiAgY29sb3I6IHZhcigtLW1hdXZlLTgpO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IFxcXCJub25lXFxcIjtcXHJcXG59XFxyXFxuXFxyXFxuLkNvbnRleHRNZW51SXRlbVtkYXRhLWhpZ2hsaWdodGVkXSxcXHJcXG4uQ29udGV4dE1lbnVDaGVja2JveEl0ZW1bZGF0YS1oaWdobGlnaHRlZF0sXFxyXFxuLkNvbnRleHRNZW51UmFkaW9JdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdLFxcclxcbi5Db250ZXh0TWVudVN1YlRyaWdnZXJbZGF0YS1oaWdobGlnaHRlZF0ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RhZDlkYjtcXHJcXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xcclxcbn1cXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVMYWJlbCB7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDI1cHg7XFxyXFxuICBmb250LXNpemU6IDEycHg7XFxyXFxuICBsaW5lLWhlaWdodDogMjVweDtcXHJcXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS0xMSk7XFxyXFxufVxcclxcblxcclxcbi5Db250ZXh0TWVudUl0ZW1JbmRpY2F0b3Ige1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHdpZHRoOiAyNXB4O1xcclxcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5SaWdodFNsb3Qge1xcclxcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxyXFxuICBjb2xvcjogdmFyKC0tbWF1dmUtMTEpO1xcclxcbn1cXHJcXG5cXHJcXG5bZGF0YS1oaWdobGlnaHRlZF0gPiAuUmlnaHRTbG90IHtcXHJcXG4gIGNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuW2RhdGEtZGlzYWJsZWRdIC5SaWdodFNsb3Qge1xcclxcbiAgY29sb3I6IHZhcigtLW1hdXZlLTgpO1xcclxcbn1cXHJcXG5cXHJcXG4uZHJvcGRvd24tbWVudSB7XFxyXFxuICBtaW4td2lkdGg6IDEwcmVtO1xcclxcbn1cXHJcXG5cXHJcXG4uZHJvcGRvd24taXRlbSB7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgcGFkZGluZzogMC4zcmVtIDEuMnJlbTtcXHJcXG4gIGNsZWFyOiBib3RoO1xcclxcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXHJcXG4gIGNvbG9yOiAjMzkzYTM5O1xcclxcbiAgdGV4dC1hbGlnbjogaW5oZXJpdDtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXHJcXG4gIGJvcmRlcjogMDtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLmRyb3Bkb3duLWl0ZW06aG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RhZDlkYjtcXHJcXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xcclxcbn1cXHJcXG5cXHJcXG4ubW9kYWwge1xcclxcbiAgbWFyZ2luLXRvcDogNTBweDtcXHJcXG59XFxyXFxuLnBkZk5hbWUge1xcclxcbiAgZm9udC1zaXplOiAxMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDYwMDtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLmhyU3R5bGUge1xcclxcbiAgbWFyZ2luLXRvcDogMHJlbSAhaW1wb3J0YW50O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMHJlbSAhaW1wb3J0YW50O1xcclxcbiAgYm9yZGVyOiAwO1xcclxcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcXHJcXG59XFxyXFxuXFxyXFxuLnN0YXR1cy1iYWRnZSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxyXFxuICB3aWR0aDogMjRweDtcXHJcXG4gIGhlaWdodDogMjRweDtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xcclxcbn1cXHJcXG5cXHJcXG4uc3RhdHVzLWJhZGdlIGkge1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBTdGF0dXMtc3BlY2lmaWMgY29sb3JzICovXFxyXFxuLmNvbXBsZXRlZCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGNhZjUwO1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcblxcclxcbi5pbi1wcm9ncmVzcyB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZjMTA3O1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcblxcclxcbi5kZWNsaW5lZCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2O1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcblxcclxcbi5leHBpcmVkIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICM5ZTllOWU7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLmRyYWZ0IHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICMwNzljZGM7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLnNvcnQge1xcclxcbiAgcGFkZGluZzogOHB4IDE1cHg7XFxyXFxuICBtYXJnaW46IDVweDtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5zb3J0OmhvdmVyIHtcXHJcXG4gIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDE2OCwgMjA0LCAyMDYsIDAuMSk7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tYXV2ZS0zKTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDJweDtcXHJcXG59XFxyXFxuXFxyXFxuLmZpbGVOYW1lIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAxMDBweDtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG4gIGZvbnQtc2l6ZTogMTFweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA0ODA7XFxyXFxufVxcclxcblxcclxcbmEge1xcclxcbiAgYWxsOiB1bnNldDtcXHJcXG59XFxyXFxuXFxyXFxuLkhvdmVyQ2FyZENvbnRlbnQge1xcclxcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xcclxcbiAgcGFkZGluZzogNXB4IDEwcHg7XFxyXFxuICB3aWR0aDogMTcwcHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIGJveC1zaGFkb3c6XFxyXFxuICAgIGhzbCgyMDYgMjIlIDclIC8gMzUlKSAwcHggMTBweCAzOHB4IC0xMHB4LFxcclxcbiAgICBoc2woMjA2IDIyJSA3JSAvIDIwJSkgMHB4IDEwcHggMjBweCAtMTVweDtcXHJcXG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogNDAwbXM7XFxyXFxuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcXHJcXG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XFxcInRvcFxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZURvd25BbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XFxcInJpZ2h0XFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlTGVmdEFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cXFwiYm90dG9tXFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlVXBBbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XFxcImxlZnRcXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVSaWdodEFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ib3ZlckNhcmRBcnJvdyB7XFxyXFxuICBmaWxsOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuQGtleWZyYW1lcyBzbGlkZVVwQW5kRmFkZSB7XFxyXFxuICAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgycHgpO1xcclxcbiAgfVxcclxcblxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQGtleWZyYW1lcyBzbGlkZVJpZ2h0QW5kRmFkZSB7XFxyXFxuICAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMnB4KTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbkBrZXlmcmFtZXMgc2xpZGVEb3duQW5kRmFkZSB7XFxyXFxuICAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbkBrZXlmcmFtZXMgc2xpZGVMZWZ0QW5kRmFkZSB7XFxyXFxuICAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgycHgpO1xcclxcbiAgfVxcclxcblxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQG1lZGlhIChtaW4td2lkdGg6IDMxMHB4KSBhbmQgKG1heC13aWR0aDogNTUwcHgpIHtcXHJcXG4gIC5zb3J0IHtcXHJcXG4gICAgcGFkZGluZzogMnB4O1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMDlweCkge1xcclxcbiAgLnNvcnQge1xcclxcbiAgICBwYWRkaW5nOiAycHg7XFxyXFxuICB9XFxyXFxufVxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCJAaW1wb3J0IHVybChodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUZhc3RoYW5kJmRpc3BsYXk9c3dhcCk7XCJdKTtcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCJAaW1wb3J0IHVybChodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PURhbmNpbmcrU2NyaXB0JmRpc3BsYXk9c3dhcCk7XCJdKTtcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCJAaW1wb3J0IHVybChodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PURlbGljaW91cytIYW5kcmF3biZkaXNwbGF5PXN3YXApO1wiXSk7XG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1DZWRhcnZpbGxlK0N1cnNpdmUmZGlzcGxheT1zd2FwKTtcIl0pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtY29udGFpbmVyIHtcclxuICBwb3NpdGlvbjogaW5pdGlhbCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ud2lkZ2V0cyB7XHJcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcclxuICAvKiBEaXNhYmxlIHRleHQgc2VsZWN0aW9uIGluIFdlYktpdCBicm93c2VycyAqL1xyXG4gIHVzZXItc2VsZWN0OiBub25lO1xyXG59XHJcblxyXG4ucmFkaW9CdXR0b24ge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgbGVmdDogMHB4O1xyXG4gIHRvcDogMHB4O1xyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxuICBib3JkZXI6IDFweCBzb2xpZCAjMDA3YmZmO1xyXG4gIGJvcmRlci1yYWRpdXM6IDUwcHg7XHJcbn1cclxuXHJcbi5zaWduYXR1cmVDYW52YXMge1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4ODg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xyXG4gIHdpZHRoOiA0NjBweDtcclxuICBoZWlnaHQ6IDE4NHB4O1xyXG59XHJcblxyXG4uaW50aWFsU2lnbmF0dXJlQ2FudmFzIHtcclxuICBib3JkZXI6IDJweCBzb2xpZCAjODg4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcclxuICB3aWR0aDogMTUwcHg7XHJcbiAgaGVpZ2h0OiAxNTBweDtcclxufVxyXG5cclxuLmludGlhbFNpZ25hdHVyZSB7XHJcbiAgYm9yZGVyOiAycHggc29saWQgIzg4ODtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XHJcbiAgd2lkdGg6IDE4M3B4O1xyXG4gIGhlaWdodDogMTgzcHg7XHJcbn1cclxuXHJcbi5wZW5Db250YWluZXJEZWZhdWx0IHtcclxuICB3aWR0aDogNDYwcHg7XHJcbn1cclxuXHJcbi5pY29uIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgZm9udC1zaXplOiAxNHB4O1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICB6LWluZGV4OiAyO1xyXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xyXG59XHJcblxyXG4uU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1kge1xyXG4gIHdpZHRoOiA0cHggIWltcG9ydGFudDtcclxufVxyXG4uU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1gge1xyXG4gIGhlaWdodDogNHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5zaWduWW91cnNlbGZCbG9jayB7XHJcbiAgcGFkZGluZzogMHB4O1xyXG4gIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDtcclxufVxyXG5cclxuLnNlbmRNYWlsIHtcclxuICBib3gtc2hhZG93OlxyXG4gICAgMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSxcclxuICAgIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTgpO1xyXG4gIHBhZGRpbmc6IDNweCAzMHB4O1xyXG4gIGNvbG9yOiB3aGl0ZTtcclxuICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XHJcbiAgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xyXG59XHJcblxyXG4udXNlciB7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbn1cclxuLmRpc2FibGVkIHtcclxuICBvcGFjaXR5OiAwLjU7XHJcbiAgLyogRXhhbXBsZTogcmVkdWNlIG9wYWNpdHkgdG8gdmlzdWFsbHkgaW5kaWNhdGUgZGlzYWJsZWQgc3RhdGUgKi9cclxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxuICAvKiBQcmV2ZW50cyBtb3VzZSBjbGlja3MgYW5kIG90aGVyIGV2ZW50cyAqL1xyXG4gIC8qIGJhY2tncm91bmQtY29sb3I6ICM4ODg7ICovXHJcbn1cclxuXHJcbi5zaWduVGFiIHtcclxuICBjdXJzb3I6IHBvaW50ZXIgIWltcG9ydGFudDtcclxuICBmb250LXdlaWdodDogNDAwICFpbXBvcnRhbnQ7XHJcbiAgbWFyZ2luOiA3cHggIWltcG9ydGFudDtcclxuICBmb250LXNpemU6IDE1cHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLnNpZ25lckNvbXBvbmVudCB7XHJcbiAgLyogYm94LXNoYWRvdzogcmdiYSgxNywgMTIsIDQ2LCAwLjE1KSAwcHggNDhweCAxMDBweCAwcHg7ICovXHJcbiAgLyogd2lkdGg6IDE4MHB4OyAqL1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG59XHJcblxyXG4udXBsb2FkSW1nTG9nbyB7XHJcbiAgZm9udC1zaXplOiA1MHB4O1xyXG59XHJcblxyXG4uRHJvcGRvd25NZW51Q29udGVudCxcclxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnQge1xyXG4gIG1pbi13aWR0aDogMTMwcHg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcclxuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XHJcbiAgcGFkZGluZzogNXB4O1xyXG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogNDAwbXM7XHJcbiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSk7XHJcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybSwgb3BhY2l0eTtcclxuICB6LWluZGV4OiAzMCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XCJ0b3BcIl0sXHJcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cInRvcFwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlRG93bkFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cInJpZ2h0XCJdLFxyXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XCJyaWdodFwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlTGVmdEFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cImJvdHRvbVwiXSxcclxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVwiYm90dG9tXCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVVcEFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cImxlZnRcIl0sXHJcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cImxlZnRcIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVJpZ2h0QW5kRmFkZTtcclxufVxyXG5cclxuLkRyb3Bkb3duTWVudUl0ZW0ge1xyXG4gIGZvbnQtc2l6ZTogMTNweDtcclxuICBsaW5lLWhlaWdodDogMTtcclxuICBjb2xvcjogYmxhY2s7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgaGVpZ2h0OiAyNXB4O1xyXG4gIHBhZGRpbmc6IDAgNXB4O1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XHJcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcclxuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbiAgYm9yZGVyOiBub25lO1xyXG59XHJcblxyXG4uU2VsZWN0VHJpZ2dlciB7XHJcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgcGFkZGluZzogMCA3MHB4O1xyXG4gIGZvbnQtc2l6ZTogMTNweDtcclxuICBsaW5lLWhlaWdodDogMTtcclxuICBoZWlnaHQ6IDM1cHg7XHJcbiAgZ2FwOiA1cHg7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICM4ODdhYmY7XHJcbiAgd2lkdGg6IDEwMHB4O1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG59XHJcblxyXG4uc2VsZWN0RW1haWwge1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gIHBhZGRpbmc6IDAgMTVweDtcclxuICBmb250LXNpemU6IDEzcHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE7XHJcbiAgaGVpZ2h0OiAzNXB4O1xyXG4gIGdhcDogNXB4O1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjODg3YWJmO1xyXG4gIHdpZHRoOiAyMDBweDtcclxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcclxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxufVxyXG5cclxub3B0aW9uIHtcclxuICBvdmVyZmxvdy15OiBzY3JvbGw7XHJcbn1cclxuXHJcbi5TZWxlY3RUcmlnZ2VyOmhvdmVyIHtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgb3V0bGluZTogbm9uZTtcclxufVxyXG5cclxuLnNlbGVjdEVtYWlsOmhvdmVyIHtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgb3V0bGluZTogbm9uZTtcclxufVxyXG5cclxuLlNlbGVjdFRyaWdnZXI6Zm9jdXMge1xyXG4gIC8qIGJveC1zaGFkb3c6IDAgMCAwIDJweCBibGFjazsgKi9cclxuICBib3JkZXI6IG5vbmU7XHJcbiAgb3V0bGluZTogbm9uZTtcclxufVxyXG5cclxuLnNlbGVjdEVtYWlsOmZvY3VzIHtcclxuICAvKiBib3gtc2hhZG93OiAwIDAgMCAycHggYmxhY2s7ICovXHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbn1cclxuXHJcbi5TZWxlY3RUcmlnZ2VyW2RhdGEtcGxhY2Vob2xkZXJdIHtcclxuICBjb2xvcjogYmxhY2s7XHJcbn1cclxuXHJcbi5TZWxlY3RJY29uIHtcclxuICBjb2xvcjogVmFyKC0tdmlvbGV0LTExKTtcclxufVxyXG5cclxuLlNlbGVjdENvbnRlbnQge1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xyXG4gIGJveC1zaGFkb3c6XHJcbiAgICAwcHggMTBweCAzOHB4IC0xMHB4IHJnYmEoMjIsIDIzLCAyNCwgMC4zNSksXHJcbiAgICAwcHggMTBweCAyMHB4IC0xNXB4IHJnYmEoMjIsIDIzLCAyNCwgMC4yKTtcclxufVxyXG5cclxuLlNlbGVjdFZpZXdwb3J0IHtcclxuICBwYWRkaW5nOiA1cHg7XHJcbn1cclxuXHJcbi5TZWxlY3RJdGVtIHtcclxuICBmb250LXNpemU6IDEzcHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XHJcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBoZWlnaHQ6IDI1cHg7XHJcbiAgcGFkZGluZzogMCAzNXB4IDAgMjVweDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcclxuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG4gIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5TZWxlY3RJdGVtW2RhdGEtZGlzYWJsZWRdIHtcclxuICBjb2xvcjogdmFyKC0tbWF1dmUtOCk7XHJcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XHJcbn1cclxuXHJcbi5TZWxlY3RJdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdIHtcclxuICBvdXRsaW5lOiBub25lO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXZpb2xldC05KTtcclxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTEpO1xyXG59XHJcblxyXG4uU2VsZWN0TGFiZWwge1xyXG4gIHBhZGRpbmc6IDAgMjVweDtcclxuICBmb250LXNpemU6IDEycHg7XHJcbiAgbGluZS1oZWlnaHQ6IDI1cHg7XHJcbiAgY29sb3I6IHZhcigtLW1hdXZlLTExKTtcclxufVxyXG5cclxuLlNlbGVjdFNlcGFyYXRvciB7XHJcbiAgaGVpZ2h0OiAxcHg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdmlvbGV0LTYpO1xyXG4gIG1hcmdpbjogNXB4O1xyXG59XHJcblxyXG4uU2VsZWN0SXRlbUluZGljYXRvciB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIGxlZnQ6IDA7XHJcbiAgd2lkdGg6IDI1cHg7XHJcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxufVxyXG5cclxuLlNlbGVjdFNjcm9sbEJ1dHRvbiB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGhlaWdodDogMjVweDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcclxuICBjdXJzb3I6IGRlZmF1bHQ7XHJcbn1cclxuXHJcbi5kcm9wRG93blN0eWxlIHtcclxuICB3aWR0aDogYXV0bztcclxufVxyXG5cclxuLmF1dG9TaWduU2Nyb2xsIHtcclxuICBvdmVyZmxvdy15OiBhdXRvO1xyXG59XHJcblxyXG4uYXV0b1NpZ25TY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcclxuICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4udmFsaWRhdGVJbnB1dFRleHQge1xyXG4gIHdpZHRoOiA3NiU7XHJcbn1cclxuXHJcbi5yYWRpb0dyb3VwSW5wdXQge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4ucmFkaW9Hcm91cCB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcclxufVxyXG5cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY2cHgpIHtcclxuICAudmFsaWRhdGVJbnB1dFRleHQge1xyXG4gICAgd2lkdGg6IDkzJTtcclxuICB9XHJcblxyXG4gIC5kcm9wZG93bi1tZW51IHtcclxuICAgIG1pbi13aWR0aDogMHJlbSAhaW1wb3J0YW50O1xyXG4gIH1cclxuXHJcbiAgI25hdmJhciB7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgei1pbmRleDogNDk7XHJcbiAgfVxyXG5cclxuICAvKiBOYXZiYXIgbGlua3MgKi9cclxuICAjbmF2YmFyIGEge1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGNvbG9yOiAjZjJmMmYyO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgcGFkZGluZzogMTRweDtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICB9XHJcblxyXG4gICNuYXZiYXIgYS5hY3RpdmUge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzRjYWY1MDtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICB9XHJcblxyXG4gIC8qIFBhZ2UgY29udGVudCAqL1xyXG4gIC5jb250ZW50IHtcclxuICAgIHBhZGRpbmc6IDE2cHg7XHJcbiAgfVxyXG5cclxuICAvKiBUaGUgc3RpY2t5IGNsYXNzIGlzIGFkZGVkIHRvIHRoZSBuYXZiYXJcclxuICB3aXRoIEpTIHdoZW4gaXQgcmVhY2hlcyBpdHMgc2Nyb2xsIHBvc2l0aW9uICovXHJcbiAgLnN0aWNreUhlYWQge1xyXG4gICAgdG9wOiA1MHB4O1xyXG4gICAgbGVmdDogMC45cmVtO1xyXG4gIH1cclxuXHJcbiAgLnN0aWNreVNpZ25lckhlYWQge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gIH1cclxuXHJcbiAgLyogQWRkIHNvbWUgdG9wIHBhZGRpbmcgdG8gdGhlIHBhZ2UgY29udGVudFxyXG4gIHRvIHByZXZlbnQgc3VkZGVuIHF1aWNrIG1vdmVtZW50IChhcyB0aGVcclxuICBuYXZpZ2F0aW9uIGJhciBnZXRzIGEgbmV3IHBvc2l0aW9uIGF0IHRoZSB0b3Agb2YgdGhlXHJcbiAgcGFnZSAocG9zaXRpb246Zml4ZWQgYW5kIHRvcDowKSAqL1xyXG4gIC5zdGlja3lIZWFkICsgLmNvbnRlbnQge1xyXG4gICAgcGFkZGluZy10b3A6IDYwcHg7XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODdweCkgYW5kIChtaW4td2lkdGg6IDM1MXB4KSB7XHJcbiAgLnNpZ25hdHVyZUNhbnZhcyB7XHJcbiAgICB3aWR0aDogMzAwcHg7XHJcbiAgICBoZWlnaHQ6IDEyMHB4O1xyXG4gIH1cclxuXHJcbiAgLnBlbkNvbnRhaW5lckRlZmF1bHQge1xyXG4gICAgd2lkdGg6IDMwMHB4O1xyXG4gIH1cclxuXHJcbiAgLnVwbG9hZEltZ0xvZ28ge1xyXG4gICAgZm9udC1zaXplOiAzMHB4O1xyXG4gIH1cclxuXHJcbiAgLnNpZ25UYWIge1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xyXG4gICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG59XHJcblxyXG4uc2Nyb2xsLWhpZGU6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcclxuICBkaXNwbGF5OiBub25lO1xyXG59XHJcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDM1MHB4KSBhbmQgKG1pbi13aWR0aDogMzExcHgpIHtcclxuICAuc2lnbmF0dXJlQ2FudmFzIHtcclxuICAgIHdpZHRoOiAyODBweDtcclxuICAgIGhlaWdodDogMTEycHg7XHJcbiAgfVxyXG5cclxuICAucGVuQ29udGFpbmVyRGVmYXVsdCB7XHJcbiAgICB3aWR0aDogMjgwcHg7XHJcbiAgfVxyXG5cclxuICAuc2lnblRhYiB7XHJcbiAgICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XHJcblxyXG4gICAgZm9udC1zaXplOiAxMHB4ICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG5cclxuICAudXBsb2FkSW1nTG9nbyB7XHJcbiAgICBmb250LXNpemU6IDI1cHg7XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMTBweCkge1xyXG4gIC5zaWduYXR1cmVDYW52YXMge1xyXG4gICAgd2lkdGg6IDIzMHB4O1xyXG4gICAgaGVpZ2h0OiA5MnB4O1xyXG4gIH1cclxuXHJcbiAgLnBlbkNvbnRhaW5lckRlZmF1bHQge1xyXG4gICAgd2lkdGg6IDIzMHB4O1xyXG4gIH1cclxuXHJcbiAgLnNpZ25UYWIge1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xyXG4gICAgZm9udC1zaXplOiA4cHggIWltcG9ydGFudDtcclxuICB9XHJcblxyXG4gIC51cGxvYWRJbWdMb2dvIHtcclxuICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICB9XHJcbn1cclxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvc3R5bGVzL3NpZ25hdHVyZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBS0E7RUFDRSw0QkFBNEI7QUFDOUI7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsOENBQThDO0VBRTlDLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxZQUFZO0VBQ1osa0JBQWtCO0VBQ2xCLFNBQVM7RUFDVCxRQUFRO0VBQ1IsZUFBZTtFQUNmLHlCQUF5QjtFQUN6QixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsb0NBQW9DO0VBQ3BDLFlBQVk7RUFDWixhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsb0NBQW9DO0VBQ3BDLFlBQVk7RUFDWixhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsb0NBQW9DO0VBQ3BDLFlBQVk7RUFDWixhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsZUFBZTtFQUNmLGVBQWU7RUFDZixVQUFVO0VBQ1YsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UscUJBQXFCO0FBQ3ZCO0FBQ0E7RUFDRSxzQkFBc0I7QUFDeEI7O0FBRUE7RUFDRSxZQUFZO0VBQ1osd0JBQXdCO0VBQ3hCLGtDQUFrQztFQUNsQyw4QkFBOEI7QUFDaEM7O0FBRUE7RUFDRTs7aUNBRStCO0VBQy9CLGlCQUFpQjtFQUNqQixZQUFZO0VBQ1osMkJBQTJCO0VBQzNCLDBCQUEwQjtFQUMxQixZQUFZO0VBQ1osaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsbUJBQW1CO0VBQ25CLDJCQUEyQjtFQUMzQix1QkFBdUI7QUFDekI7QUFDQTtFQUNFLFlBQVk7RUFDWixnRUFBZ0U7RUFDaEUsb0JBQW9CO0VBQ3BCLDJDQUEyQztFQUMzQyw0QkFBNEI7QUFDOUI7O0FBRUE7RUFDRSwwQkFBMEI7RUFDMUIsMkJBQTJCO0VBQzNCLHNCQUFzQjtFQUN0QiwwQkFBMEI7QUFDNUI7O0FBRUE7RUFDRSwyREFBMkQ7RUFDM0Qsa0JBQWtCO0VBQ2xCLHVCQUF1QjtBQUN6Qjs7QUFFQTtFQUNFLGVBQWU7QUFDakI7O0FBRUE7O0VBRUUsZ0JBQWdCO0VBQ2hCLHNCQUFzQjtFQUN0QixxQ0FBcUM7RUFDckMsc0JBQXNCO0VBQ3RCLFlBQVk7RUFDWix5QkFBeUI7RUFDekIsd0RBQXdEO0VBQ3hELCtCQUErQjtFQUMvQixzQkFBc0I7QUFDeEI7O0FBRUE7O0VBRUUsZ0NBQWdDO0FBQ2xDOztBQUVBOztFQUVFLGdDQUFnQztBQUNsQzs7QUFFQTs7RUFFRSw4QkFBOEI7QUFDaEM7O0FBRUE7O0VBRUUsaUNBQWlDO0FBQ25DOztBQUVBO0VBQ0UsZUFBZTtFQUNmLGNBQWM7RUFDZCxZQUFZO0VBQ1osc0JBQXNCO0VBQ3RCLGFBQWE7RUFDYixtQkFBbUI7RUFDbkIsWUFBWTtFQUNaLGNBQWM7RUFDZCxrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLHlCQUFpQjtVQUFqQixpQkFBaUI7RUFDakIsYUFBYTtFQUNiLFlBQVk7QUFDZDs7QUFFQTtFQUNFLG9CQUFvQjtFQUNwQixtQkFBbUI7RUFDbkIsdUJBQXVCO0VBQ3ZCLGtCQUFrQjtFQUNsQixlQUFlO0VBQ2YsZUFBZTtFQUNmLGNBQWM7RUFDZCxZQUFZO0VBQ1osUUFBUTtFQUNSLFlBQVk7RUFDWix5QkFBeUI7RUFDekIsWUFBWTtFQUNaLG1CQUFtQjtFQUNuQiwyQkFBMkI7RUFDM0IsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsbUJBQW1CO0VBQ25CLHVCQUF1QjtFQUN2QixrQkFBa0I7RUFDbEIsZUFBZTtFQUNmLGVBQWU7RUFDZixjQUFjO0VBQ2QsWUFBWTtFQUNaLFFBQVE7RUFDUixZQUFZO0VBQ1oseUJBQXlCO0VBQ3pCLFlBQVk7RUFDWixtQkFBbUI7RUFDbkIsMkJBQTJCO0VBQzNCLHVCQUF1QjtBQUN6Qjs7QUFFQTtFQUNFLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLFlBQVk7RUFDWixhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxZQUFZO0VBQ1osYUFBYTtBQUNmOztBQUVBO0VBQ0UsaUNBQWlDO0VBQ2pDLFlBQVk7RUFDWixhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxpQ0FBaUM7RUFDakMsWUFBWTtFQUNaLGFBQWE7QUFDZjs7QUFFQTtFQUNFLFlBQVk7QUFDZDs7QUFFQTtFQUNFLHVCQUF1QjtBQUN6Qjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQix1QkFBdUI7RUFDdkIsa0JBQWtCO0VBQ2xCOzs2Q0FFMkM7QUFDN0M7O0FBRUE7RUFDRSxZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxlQUFlO0VBQ2YsY0FBYztFQUNkLHVCQUF1QjtFQUN2QixrQkFBa0I7RUFDbEIsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQixZQUFZO0VBQ1osc0JBQXNCO0VBQ3RCLGtCQUFrQjtFQUNsQix5QkFBaUI7VUFBakIsaUJBQWlCO0VBQ2pCLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQixvQkFBb0I7QUFDdEI7O0FBRUE7RUFDRSxhQUFhO0VBQ2IsaUNBQWlDO0VBQ2pDLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLGVBQWU7RUFDZixlQUFlO0VBQ2YsaUJBQWlCO0VBQ2pCLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxpQ0FBaUM7RUFDakMsV0FBVztBQUNiOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLE9BQU87RUFDUCxXQUFXO0VBQ1gsb0JBQW9CO0VBQ3BCLG1CQUFtQjtFQUNuQix1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxhQUFhO0VBQ2IsbUJBQW1CO0VBQ25CLHVCQUF1QjtFQUN2QixZQUFZO0VBQ1osdUJBQXVCO0VBQ3ZCLHVCQUF1QjtFQUN2QixlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsYUFBYTtBQUNmOztBQUVBO0VBQ0UsVUFBVTtBQUNaOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0UsYUFBYTtFQUNiLHNCQUFzQjtFQUN0QiwyQkFBMkI7QUFDN0I7O0FBRUE7RUFDRTtJQUNFLFVBQVU7RUFDWjs7RUFFQTtJQUNFLDBCQUEwQjtFQUM1Qjs7RUFFQTtJQUNFLGdCQUFnQjtJQUNoQixXQUFXO0VBQ2I7O0VBRUEsaUJBQWlCO0VBQ2pCO0lBQ0UsV0FBVztJQUNYLGNBQWM7SUFDZCxjQUFjO0lBQ2Qsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYixxQkFBcUI7RUFDdkI7O0VBRUE7SUFDRSx5QkFBeUI7SUFDekIsWUFBWTtFQUNkOztFQUVBLGlCQUFpQjtFQUNqQjtJQUNFLGFBQWE7RUFDZjs7RUFFQTsrQ0FDNkM7RUFDN0M7SUFDRSxTQUFTO0lBQ1QsWUFBWTtFQUNkOztFQUVBO0lBQ0UsZUFBZTtFQUNqQjs7RUFFQTs7O21DQUdpQztFQUNqQztJQUNFLGlCQUFpQjtFQUNuQjtBQUNGOztBQUVBO0VBQ0U7SUFDRSxZQUFZO0lBQ1osYUFBYTtFQUNmOztFQUVBO0lBQ0UsWUFBWTtFQUNkOztFQUVBO0lBQ0UsZUFBZTtFQUNqQjs7RUFFQTtJQUNFLDJCQUEyQjtJQUMzQiwwQkFBMEI7RUFDNUI7QUFDRjs7QUFFQTtFQUNFLGFBQWE7QUFDZjtBQUNBO0VBQ0U7SUFDRSxZQUFZO0lBQ1osYUFBYTtFQUNmOztFQUVBO0lBQ0UsWUFBWTtFQUNkOztFQUVBO0lBQ0UsMkJBQTJCOztJQUUzQiwwQkFBMEI7RUFDNUI7O0VBRUE7SUFDRSxlQUFlO0VBQ2pCO0FBQ0Y7O0FBRUE7RUFDRTtJQUNFLFlBQVk7SUFDWixZQUFZO0VBQ2Q7O0VBRUE7SUFDRSxZQUFZO0VBQ2Q7O0VBRUE7SUFDRSwyQkFBMkI7SUFDM0IseUJBQXlCO0VBQzNCOztFQUVBO0lBQ0UsZUFBZTtFQUNqQjtBQUNGXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIkBpbXBvcnQgdXJsKFxcXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUZhc3RoYW5kJmRpc3BsYXk9c3dhcFxcXCIpO1xcclxcbkBpbXBvcnQgdXJsKFxcXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PURhbmNpbmcrU2NyaXB0JmRpc3BsYXk9c3dhcFxcXCIpO1xcclxcbkBpbXBvcnQgdXJsKFxcXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PURlbGljaW91cytIYW5kcmF3biZkaXNwbGF5PXN3YXBcXFwiKTtcXHJcXG5AaW1wb3J0IHVybChcXFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1DZWRhcnZpbGxlK0N1cnNpdmUmZGlzcGxheT1zd2FwXFxcIik7XFxyXFxuXFxyXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lciB7XFxyXFxuICBwb3NpdGlvbjogaW5pdGlhbCAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4ud2lkZ2V0cyB7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgLyogRGlzYWJsZSB0ZXh0IHNlbGVjdGlvbiBpbiBXZWJLaXQgYnJvd3NlcnMgKi9cXHJcXG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLnJhZGlvQnV0dG9uIHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgaGVpZ2h0OiAxMDAlO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbGVmdDogMHB4O1xcclxcbiAgdG9wOiAwcHg7XFxyXFxuICBmb250LXNpemU6IDEycHg7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjMDA3YmZmO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLnNpZ25hdHVyZUNhbnZhcyB7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCAjODg4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcclxcbiAgd2lkdGg6IDQ2MHB4O1xcclxcbiAgaGVpZ2h0OiAxODRweDtcXHJcXG59XFxyXFxuXFxyXFxuLmludGlhbFNpZ25hdHVyZUNhbnZhcyB7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCAjODg4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcclxcbiAgd2lkdGg6IDE1MHB4O1xcclxcbiAgaGVpZ2h0OiAxNTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmludGlhbFNpZ25hdHVyZSB7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCAjODg4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcclxcbiAgd2lkdGg6IDE4M3B4O1xcclxcbiAgaGVpZ2h0OiAxODNweDtcXHJcXG59XFxyXFxuXFxyXFxuLnBlbkNvbnRhaW5lckRlZmF1bHQge1xcclxcbiAgd2lkdGg6IDQ2MHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uaWNvbiB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBmb250LXNpemU6IDE0cHg7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICB6LWluZGV4OiAyO1xcclxcbiAgYmFja2dyb3VuZDogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi5TY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWSB7XFxyXFxuICB3aWR0aDogNHB4ICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcbi5TY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWCB7XFxyXFxuICBoZWlnaHQ6IDRweCAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uc2lnbllvdXJzZWxmQmxvY2sge1xcclxcbiAgcGFkZGluZzogMHB4O1xcclxcbiAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXIgIWltcG9ydGFudDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLnNlbmRNYWlsIHtcXHJcXG4gIGJveC1zaGFkb3c6XFxyXFxuICAgIDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSksXFxyXFxuICAgIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTgpO1xcclxcbiAgcGFkZGluZzogM3B4IDMwcHg7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxuICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XFxyXFxuICBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4udXNlciB7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxufVxcclxcbi5kaXNhYmxlZCB7XFxyXFxuICBvcGFjaXR5OiAwLjU7XFxyXFxuICAvKiBFeGFtcGxlOiByZWR1Y2Ugb3BhY2l0eSB0byB2aXN1YWxseSBpbmRpY2F0ZSBkaXNhYmxlZCBzdGF0ZSAqL1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxuICAvKiBQcmV2ZW50cyBtb3VzZSBjbGlja3MgYW5kIG90aGVyIGV2ZW50cyAqL1xcclxcbiAgLyogYmFja2dyb3VuZC1jb2xvcjogIzg4ODsgKi9cXHJcXG59XFxyXFxuXFxyXFxuLnNpZ25UYWIge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyICFpbXBvcnRhbnQ7XFxyXFxuICBmb250LXdlaWdodDogNDAwICFpbXBvcnRhbnQ7XFxyXFxuICBtYXJnaW46IDdweCAhaW1wb3J0YW50O1xcclxcbiAgZm9udC1zaXplOiAxNXB4ICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5zaWduZXJDb21wb25lbnQge1xcclxcbiAgLyogYm94LXNoYWRvdzogcmdiYSgxNywgMTIsIDQ2LCAwLjE1KSAwcHggNDhweCAxMDBweCAwcHg7ICovXFxyXFxuICAvKiB3aWR0aDogMTgwcHg7ICovXFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLnVwbG9hZEltZ0xvZ28ge1xcclxcbiAgZm9udC1zaXplOiA1MHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uRHJvcGRvd25NZW51Q29udGVudCxcXHJcXG4uRHJvcGRvd25NZW51U3ViQ29udGVudCB7XFxyXFxuICBtaW4td2lkdGg6IDEzMHB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xNSk7XFxyXFxuICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xcclxcbiAgcGFkZGluZzogNXB4O1xcclxcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiA0MDBtcztcXHJcXG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xcclxcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybSwgb3BhY2l0eTtcXHJcXG4gIHotaW5kZXg6IDMwICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cXFwidG9wXFxcIl0sXFxyXFxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVxcXCJ0b3BcXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVEb3duQW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVxcXCJyaWdodFxcXCJdLFxcclxcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cXFwicmlnaHRcXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVMZWZ0QW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVxcXCJib3R0b21cXFwiXSxcXHJcXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XFxcImJvdHRvbVxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVVwQW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVxcXCJsZWZ0XFxcIl0sXFxyXFxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVxcXCJsZWZ0XFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlUmlnaHRBbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uRHJvcGRvd25NZW51SXRlbSB7XFxyXFxuICBmb250LXNpemU6IDEzcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMTtcXHJcXG4gIGNvbG9yOiBibGFjaztcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGhlaWdodDogMjVweDtcXHJcXG4gIHBhZGRpbmc6IDAgNXB4O1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0VHJpZ2dlciB7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gIHBhZGRpbmc6IDAgNzBweDtcXHJcXG4gIGZvbnQtc2l6ZTogMTNweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcclxcbiAgaGVpZ2h0OiAzNXB4O1xcclxcbiAgZ2FwOiA1cHg7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjODg3YWJmO1xcclxcbiAgd2lkdGg6IDEwMHB4O1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbn1cXHJcXG5cXHJcXG4uc2VsZWN0RW1haWwge1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgcGFkZGluZzogMCAxNXB4O1xcclxcbiAgZm9udC1zaXplOiAxM3B4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDE7XFxyXFxuICBoZWlnaHQ6IDM1cHg7XFxyXFxuICBnYXA6IDVweDtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICM4ODdhYmY7XFxyXFxuICB3aWR0aDogMjAwcHg7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxufVxcclxcblxcclxcbm9wdGlvbiB7XFxyXFxuICBvdmVyZmxvdy15OiBzY3JvbGw7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RUcmlnZ2VyOmhvdmVyIHtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5zZWxlY3RFbWFpbDpob3ZlciB7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0VHJpZ2dlcjpmb2N1cyB7XFxyXFxuICAvKiBib3gtc2hhZG93OiAwIDAgMCAycHggYmxhY2s7ICovXFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uc2VsZWN0RW1haWw6Zm9jdXMge1xcclxcbiAgLyogYm94LXNoYWRvdzogMCAwIDAgMnB4IGJsYWNrOyAqL1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFRyaWdnZXJbZGF0YS1wbGFjZWhvbGRlcl0ge1xcclxcbiAgY29sb3I6IGJsYWNrO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0SWNvbiB7XFxyXFxuICBjb2xvcjogVmFyKC0tdmlvbGV0LTExKTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdENvbnRlbnQge1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xcclxcbiAgYm94LXNoYWRvdzpcXHJcXG4gICAgMHB4IDEwcHggMzhweCAtMTBweCByZ2JhKDIyLCAyMywgMjQsIDAuMzUpLFxcclxcbiAgICAwcHggMTBweCAyMHB4IC0xNXB4IHJnYmEoMjIsIDIzLCAyNCwgMC4yKTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFZpZXdwb3J0IHtcXHJcXG4gIHBhZGRpbmc6IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdEl0ZW0ge1xcclxcbiAgZm9udC1zaXplOiAxM3B4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDE7XFxyXFxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgaGVpZ2h0OiAyNXB4O1xcclxcbiAgcGFkZGluZzogMCAzNXB4IDAgMjVweDtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgei1pbmRleDogMTAgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdEl0ZW1bZGF0YS1kaXNhYmxlZF0ge1xcclxcbiAgY29sb3I6IHZhcigtLW1hdXZlLTgpO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RJdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdIHtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS12aW9sZXQtOSk7XFxyXFxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTEpO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0TGFiZWwge1xcclxcbiAgcGFkZGluZzogMCAyNXB4O1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI1cHg7XFxyXFxuICBjb2xvcjogdmFyKC0tbWF1dmUtMTEpO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0U2VwYXJhdG9yIHtcXHJcXG4gIGhlaWdodDogMXB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdmlvbGV0LTYpO1xcclxcbiAgbWFyZ2luOiA1cHg7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RJdGVtSW5kaWNhdG9yIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB3aWR0aDogMjVweDtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0U2Nyb2xsQnV0dG9uIHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICBoZWlnaHQ6IDI1cHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xcclxcbiAgY3Vyc29yOiBkZWZhdWx0O1xcclxcbn1cXHJcXG5cXHJcXG4uZHJvcERvd25TdHlsZSB7XFxyXFxuICB3aWR0aDogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmF1dG9TaWduU2Nyb2xsIHtcXHJcXG4gIG92ZXJmbG93LXk6IGF1dG87XFxyXFxufVxcclxcblxcclxcbi5hdXRvU2lnblNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIge1xcclxcbiAgZGlzcGxheTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLnZhbGlkYXRlSW5wdXRUZXh0IHtcXHJcXG4gIHdpZHRoOiA3NiU7XFxyXFxufVxcclxcblxcclxcbi5yYWRpb0dyb3VwSW5wdXQge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbi5yYWRpb0dyb3VwIHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjZweCkge1xcclxcbiAgLnZhbGlkYXRlSW5wdXRUZXh0IHtcXHJcXG4gICAgd2lkdGg6IDkzJTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5kcm9wZG93bi1tZW51IHtcXHJcXG4gICAgbWluLXdpZHRoOiAwcmVtICFpbXBvcnRhbnQ7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAjbmF2YmFyIHtcXHJcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG4gICAgei1pbmRleDogNDk7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAvKiBOYXZiYXIgbGlua3MgKi9cXHJcXG4gICNuYXZiYXIgYSB7XFxyXFxuICAgIGZsb2F0OiBsZWZ0O1xcclxcbiAgICBkaXNwbGF5OiBibG9jaztcXHJcXG4gICAgY29sb3I6ICNmMmYyZjI7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gICAgcGFkZGluZzogMTRweDtcXHJcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcclxcbiAgfVxcclxcblxcclxcbiAgI25hdmJhciBhLmFjdGl2ZSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0Y2FmNTA7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC8qIFBhZ2UgY29udGVudCAqL1xcclxcbiAgLmNvbnRlbnQge1xcclxcbiAgICBwYWRkaW5nOiAxNnB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLyogVGhlIHN0aWNreSBjbGFzcyBpcyBhZGRlZCB0byB0aGUgbmF2YmFyXFxyXFxuICB3aXRoIEpTIHdoZW4gaXQgcmVhY2hlcyBpdHMgc2Nyb2xsIHBvc2l0aW9uICovXFxyXFxuICAuc3RpY2t5SGVhZCB7XFxyXFxuICAgIHRvcDogNTBweDtcXHJcXG4gICAgbGVmdDogMC45cmVtO1xcclxcbiAgfVxcclxcblxcclxcbiAgLnN0aWNreVNpZ25lckhlYWQge1xcclxcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAvKiBBZGQgc29tZSB0b3AgcGFkZGluZyB0byB0aGUgcGFnZSBjb250ZW50XFxyXFxuICB0byBwcmV2ZW50IHN1ZGRlbiBxdWljayBtb3ZlbWVudCAoYXMgdGhlXFxyXFxuICBuYXZpZ2F0aW9uIGJhciBnZXRzIGEgbmV3IHBvc2l0aW9uIGF0IHRoZSB0b3Agb2YgdGhlXFxyXFxuICBwYWdlIChwb3NpdGlvbjpmaXhlZCBhbmQgdG9wOjApICovXFxyXFxuICAuc3RpY2t5SGVhZCArIC5jb250ZW50IHtcXHJcXG4gICAgcGFkZGluZy10b3A6IDYwcHg7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4N3B4KSBhbmQgKG1pbi13aWR0aDogMzUxcHgpIHtcXHJcXG4gIC5zaWduYXR1cmVDYW52YXMge1xcclxcbiAgICB3aWR0aDogMzAwcHg7XFxyXFxuICAgIGhlaWdodDogMTIwcHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAucGVuQ29udGFpbmVyRGVmYXVsdCB7XFxyXFxuICAgIHdpZHRoOiAzMDBweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC51cGxvYWRJbWdMb2dvIHtcXHJcXG4gICAgZm9udC1zaXplOiAzMHB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnNpZ25UYWIge1xcclxcbiAgICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG4uc2Nyb2xsLWhpZGU6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcXHJcXG4gIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDM1MHB4KSBhbmQgKG1pbi13aWR0aDogMzExcHgpIHtcXHJcXG4gIC5zaWduYXR1cmVDYW52YXMge1xcclxcbiAgICB3aWR0aDogMjgwcHg7XFxyXFxuICAgIGhlaWdodDogMTEycHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAucGVuQ29udGFpbmVyRGVmYXVsdCB7XFxyXFxuICAgIHdpZHRoOiAyODBweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5zaWduVGFiIHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xcclxcblxcclxcbiAgICBmb250LXNpemU6IDEwcHggIWltcG9ydGFudDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC51cGxvYWRJbWdMb2dvIHtcXHJcXG4gICAgZm9udC1zaXplOiAyNXB4O1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMTBweCkge1xcclxcbiAgLnNpZ25hdHVyZUNhbnZhcyB7XFxyXFxuICAgIHdpZHRoOiAyMzBweDtcXHJcXG4gICAgaGVpZ2h0OiA5MnB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnBlbkNvbnRhaW5lckRlZmF1bHQge1xcclxcbiAgICB3aWR0aDogMjMwcHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAuc2lnblRhYiB7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcXHJcXG4gICAgZm9udC1zaXplOiA4cHggIWltcG9ydGFudDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC51cGxvYWRJbWdMb2dvIHtcXHJcXG4gICAgZm9udC1zaXplOiAyMHB4O1xcclxcbiAgfVxcclxcbn1cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107XG5cbiAgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IFwiXCI7XG4gICAgICB2YXIgbmVlZExheWVyID0gdHlwZW9mIGl0ZW1bNV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBjb250ZW50ICs9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07XG5cbiAgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgbGlzdC5pID0gZnVuY3Rpb24gaShtb2R1bGVzLCBtZWRpYSwgZGVkdXBlLCBzdXBwb3J0cywgbGF5ZXIpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIHVuZGVmaW5lZF1dO1xuICAgIH1cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbW9kdWxlcy5sZW5ndGg7IF9rKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2tdKTtcbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtWzVdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBsaXN0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBpZiAoIXVybCkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgdXJsID0gU3RyaW5nKHVybC5fX2VzTW9kdWxlID8gdXJsLmRlZmF1bHQgOiB1cmwpO1xuXG4gIC8vIElmIHVybCBpcyBhbHJlYWR5IHdyYXBwZWQgaW4gcXVvdGVzLCByZW1vdmUgdGhlbVxuICBpZiAoL15bJ1wiXS4qWydcIl0kLy50ZXN0KHVybCkpIHtcbiAgICB1cmwgPSB1cmwuc2xpY2UoMSwgLTEpO1xuICB9XG4gIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICB1cmwgKz0gb3B0aW9ucy5oYXNoO1xuICB9XG5cbiAgLy8gU2hvdWxkIHVybCBiZSB3cmFwcGVkP1xuICAvLyBTZWUgaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy12YWx1ZXMtMy8jdXJsc1xuICBpZiAoL1tcIicoKSBcXHRcXG5dfCglMjApLy50ZXN0KHVybCkgfHwgb3B0aW9ucy5uZWVkUXVvdGVzKSB7XG4gICAgcmV0dXJuIFwiXFxcIlwiLmNvbmNhdCh1cmwucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpLCBcIlxcXCJcIik7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCJpbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyJztcblxuLyoqXG4gKiBBZGFwdGVkIGZyb20gUmVhY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iL21hc3Rlci9wYWNrYWdlcy9zaGFyZWQvZm9ybWF0UHJvZEVycm9yTWVzc2FnZS5qc1xuICpcbiAqIERvIG5vdCByZXF1aXJlIHRoaXMgbW9kdWxlIGRpcmVjdGx5ISBVc2Ugbm9ybWFsIHRocm93IGVycm9yIGNhbGxzLiBUaGVzZSBtZXNzYWdlcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggZXJyb3IgY29kZXNcbiAqIGR1cmluZyBidWlsZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoY29kZSkge1xuICByZXR1cm4gXCJNaW5pZmllZCBSZWR1eCBlcnJvciAjXCIgKyBjb2RlICsgXCI7IHZpc2l0IGh0dHBzOi8vcmVkdXguanMub3JnL0Vycm9ycz9jb2RlPVwiICsgY29kZSArIFwiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIFwiICsgJ3VzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMuICc7XG59XG5cbi8vIElubGluZWQgdmVyc2lvbiBvZiB0aGUgYHN5bWJvbC1vYnNlcnZhYmxlYCBwb2x5ZmlsbFxudmFyICQkb2JzZXJ2YWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5vYnNlcnZhYmxlIHx8ICdAQG9ic2VydmFibGUnO1xufSkoKTtcblxuLyoqXG4gKiBUaGVzZSBhcmUgcHJpdmF0ZSBhY3Rpb24gdHlwZXMgcmVzZXJ2ZWQgYnkgUmVkdXguXG4gKiBGb3IgYW55IHVua25vd24gYWN0aW9ucywgeW91IG11c3QgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlLlxuICogSWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuXG4gKiBEbyBub3QgcmVmZXJlbmNlIHRoZXNlIGFjdGlvbiB0eXBlcyBkaXJlY3RseSBpbiB5b3VyIGNvZGUuXG4gKi9cbnZhciByYW5kb21TdHJpbmcgPSBmdW5jdGlvbiByYW5kb21TdHJpbmcoKSB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoJycpLmpvaW4oJy4nKTtcbn07XG5cbnZhciBBY3Rpb25UeXBlcyA9IHtcbiAgSU5JVDogXCJAQHJlZHV4L0lOSVRcIiArIHJhbmRvbVN0cmluZygpLFxuICBSRVBMQUNFOiBcIkBAcmVkdXgvUkVQTEFDRVwiICsgcmFuZG9tU3RyaW5nKCksXG4gIFBST0JFX1VOS05PV05fQUNUSU9OOiBmdW5jdGlvbiBQUk9CRV9VTktOT1dOX0FDVElPTigpIHtcbiAgICByZXR1cm4gXCJAQHJlZHV4L1BST0JFX1VOS05PV05fQUNUSU9OXCIgKyByYW5kb21TdHJpbmcoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcmd1bWVudCBhcHBlYXJzIHRvIGJlIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIHZhciBwcm90byA9IG9iajtcblxuICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSAhPT0gbnVsbCkge1xuICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gcHJvdG87XG59XG5cbi8vIElubGluZWQgLyBzaG9ydGVuZWQgdmVyc2lvbiBvZiBga2luZE9mYCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2tpbmQtb2ZcbmZ1bmN0aW9uIG1pbmlLaW5kT2YodmFsKSB7XG4gIGlmICh2YWwgPT09IHZvaWQgMCkgcmV0dXJuICd1bmRlZmluZWQnO1xuICBpZiAodmFsID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAge1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIH1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiAnYXJyYXknO1xuICBpZiAoaXNEYXRlKHZhbCkpIHJldHVybiAnZGF0ZSc7XG4gIGlmIChpc0Vycm9yKHZhbCkpIHJldHVybiAnZXJyb3InO1xuICB2YXIgY29uc3RydWN0b3JOYW1lID0gY3Rvck5hbWUodmFsKTtcblxuICBzd2l0Y2ggKGNvbnN0cnVjdG9yTmFtZSkge1xuICAgIGNhc2UgJ1N5bWJvbCc6XG4gICAgY2FzZSAnUHJvbWlzZSc6XG4gICAgY2FzZSAnV2Vha01hcCc6XG4gICAgY2FzZSAnV2Vha1NldCc6XG4gICAgY2FzZSAnTWFwJzpcbiAgICBjYXNlICdTZXQnOlxuICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbiAgfSAvLyBvdGhlclxuXG5cbiAgcmV0dXJuIHR5cGUuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzL2csICcnKTtcbn1cblxuZnVuY3Rpb24gY3Rvck5hbWUodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nID8gdmFsLmNvbnN0cnVjdG9yLm5hbWUgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBpc0Vycm9yKHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIHZhbC5tZXNzYWdlID09PSAnc3RyaW5nJyAmJiB2YWwuY29uc3RydWN0b3IgJiYgdHlwZW9mIHZhbC5jb25zdHJ1Y3Rvci5zdGFja1RyYWNlTGltaXQgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHR5cGVvZiB2YWwudG9EYXRlU3RyaW5nID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWwuZ2V0RGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsLnNldERhdGUgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGtpbmRPZih2YWwpIHtcbiAgdmFyIHR5cGVPZlZhbCA9IHR5cGVvZiB2YWw7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB0eXBlT2ZWYWwgPSBtaW5pS2luZE9mKHZhbCk7XG4gIH1cblxuICByZXR1cm4gdHlwZU9mVmFsO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKlxuICogKipXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBjb25maWd1cmVTdG9yZWAgbWV0aG9kXG4gKiBvZiB0aGUgYEByZWR1eGpzL3Rvb2xraXRgIHBhY2thZ2UqKiwgd2hpY2ggcmVwbGFjZXMgYGNyZWF0ZVN0b3JlYC5cbiAqXG4gKiBSZWR1eCBUb29sa2l0IGlzIG91ciByZWNvbW1lbmRlZCBhcHByb2FjaCBmb3Igd3JpdGluZyBSZWR1eCBsb2dpYyB0b2RheSxcbiAqIGluY2x1ZGluZyBzdG9yZSBzZXR1cCwgcmVkdWNlcnMsIGRhdGEgZmV0Y2hpbmcsIGFuZCBtb3JlLlxuICpcbiAqICoqRm9yIG1vcmUgZGV0YWlscywgcGxlYXNlIHJlYWQgdGhpcyBSZWR1eCBkb2NzIHBhZ2U6KipcbiAqICoqaHR0cHM6Ly9yZWR1eC5qcy5vcmcvaW50cm9kdWN0aW9uL3doeS1ydGstaXMtcmVkdXgtdG9kYXkqKlxuICpcbiAqIGBjb25maWd1cmVTdG9yZWAgZnJvbSBSZWR1eCBUb29sa2l0IGlzIGFuIGltcHJvdmVkIHZlcnNpb24gb2YgYGNyZWF0ZVN0b3JlYCB0aGF0XG4gKiBzaW1wbGlmaWVzIHNldHVwIGFuZCBoZWxwcyBhdm9pZCBjb21tb24gYnVncy5cbiAqXG4gKiBZb3Ugc2hvdWxkIG5vdCBiZSB1c2luZyB0aGUgYHJlZHV4YCBjb3JlIHBhY2thZ2UgYnkgaXRzZWxmIHRvZGF5LCBleGNlcHQgZm9yIGxlYXJuaW5nIHB1cnBvc2VzLlxuICogVGhlIGBjcmVhdGVTdG9yZWAgbWV0aG9kIGZyb20gdGhlIGNvcmUgYHJlZHV4YCBwYWNrYWdlIHdpbGwgbm90IGJlIHJlbW92ZWQsIGJ1dCB3ZSBlbmNvdXJhZ2VcbiAqIGFsbCB1c2VycyB0byBtaWdyYXRlIHRvIHVzaW5nIFJlZHV4IFRvb2xraXQgZm9yIGFsbCBSZWR1eCBjb2RlLlxuICpcbiAqIElmIHlvdSB3YW50IHRvIHVzZSBgY3JlYXRlU3RvcmVgIHdpdGhvdXQgdGhpcyB2aXN1YWwgZGVwcmVjYXRpb24gd2FybmluZywgdXNlXG4gKiB0aGUgYGxlZ2FjeV9jcmVhdGVTdG9yZWAgaW1wb3J0IGluc3RlYWQ6XG4gKlxuICogYGltcG9ydCB7IGxlZ2FjeV9jcmVhdGVTdG9yZSBhcyBjcmVhdGVTdG9yZX0gZnJvbSAncmVkdXgnYFxuICpcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpIHtcbiAgdmFyIF9yZWYyO1xuXG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVuaGFuY2VyID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbmhhbmNlciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMCkgOiAnSXQgbG9va3MgbGlrZSB5b3UgYXJlIHBhc3Npbmcgc2V2ZXJhbCBzdG9yZSBlbmhhbmNlcnMgdG8gJyArICdjcmVhdGVTdG9yZSgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIEluc3RlYWQsIGNvbXBvc2UgdGhlbSAnICsgJ3RvZ2V0aGVyIHRvIGEgc2luZ2xlIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjY3JlYXRpbmctYS1zdG9yZS13aXRoLWVuaGFuY2VycyBmb3IgYW4gZXhhbXBsZS4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGVuaGFuY2VyID09PSAndW5kZWZpbmVkJykge1xuICAgIGVuaGFuY2VyID0gcHJlbG9hZGVkU3RhdGU7XG4gICAgcHJlbG9hZGVkU3RhdGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEpIDogXCJFeHBlY3RlZCB0aGUgZW5oYW5jZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihlbmhhbmNlcikgKyBcIidcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuaGFuY2VyKGNyZWF0ZVN0b3JlKShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSA6IFwiRXhwZWN0ZWQgdGhlIHJvb3QgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKHJlZHVjZXIpICsgXCInXCIpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICB2YXIgY3VycmVudExpc3RlbmVycyA9IFtdO1xuICB2YXIgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIHZhciBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGlzIG1ha2VzIGEgc2hhbGxvdyBjb3B5IG9mIGN1cnJlbnRMaXN0ZW5lcnMgc28gd2UgY2FuIHVzZVxuICAgKiBuZXh0TGlzdGVuZXJzIGFzIGEgdGVtcG9yYXJ5IGxpc3Qgd2hpbGUgZGlzcGF0Y2hpbmcuXG4gICAqXG4gICAqIFRoaXMgcHJldmVudHMgYW55IGJ1Z3MgYXJvdW5kIGNvbnN1bWVycyBjYWxsaW5nXG4gICAqIHN1YnNjcmliZS91bnN1YnNjcmliZSBpbiB0aGUgbWlkZGxlIG9mIGEgZGlzcGF0Y2guXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKG5leHRMaXN0ZW5lcnMgPT09IGN1cnJlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgc3RhdGUgdHJlZSBtYW5hZ2VkIGJ5IHRoZSBzdG9yZS5cbiAgICpcbiAgICogQHJldHVybnMge2FueX0gVGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBvZiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzKSA6ICdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLmdldFN0YXRlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ1RoZSByZWR1Y2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIHRoZSBzdGF0ZSBhcyBhbiBhcmd1bWVudC4gJyArICdQYXNzIGl0IGRvd24gZnJvbSB0aGUgdG9wIHJlZHVjZXIgaW5zdGVhZCBvZiByZWFkaW5nIGl0IGZyb20gdGhlIHN0b3JlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH1cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGFuZ2UgbGlzdGVuZXIuIEl0IHdpbGwgYmUgY2FsbGVkIGFueSB0aW1lIGFuIGFjdGlvbiBpcyBkaXNwYXRjaGVkLFxuICAgKiBhbmQgc29tZSBwYXJ0IG9mIHRoZSBzdGF0ZSB0cmVlIG1heSBwb3RlbnRpYWxseSBoYXZlIGNoYW5nZWQuIFlvdSBtYXkgdGhlblxuICAgKiBjYWxsIGBnZXRTdGF0ZSgpYCB0byByZWFkIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgaW5zaWRlIHRoZSBjYWxsYmFjay5cbiAgICpcbiAgICogWW91IG1heSBjYWxsIGBkaXNwYXRjaCgpYCBmcm9tIGEgY2hhbmdlIGxpc3RlbmVyLCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAgICogY2F2ZWF0czpcbiAgICpcbiAgICogMS4gVGhlIHN1YnNjcmlwdGlvbnMgYXJlIHNuYXBzaG90dGVkIGp1c3QgYmVmb3JlIGV2ZXJ5IGBkaXNwYXRjaCgpYCBjYWxsLlxuICAgKiBJZiB5b3Ugc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIHdoaWxlIHRoZSBsaXN0ZW5lcnMgYXJlIGJlaW5nIGludm9rZWQsIHRoaXNcbiAgICogd2lsbCBub3QgaGF2ZSBhbnkgZWZmZWN0IG9uIHRoZSBgZGlzcGF0Y2goKWAgdGhhdCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuXG4gICAqIEhvd2V2ZXIsIHRoZSBuZXh0IGBkaXNwYXRjaCgpYCBjYWxsLCB3aGV0aGVyIG5lc3RlZCBvciBub3QsIHdpbGwgdXNlIGEgbW9yZVxuICAgKiByZWNlbnQgc25hcHNob3Qgb2YgdGhlIHN1YnNjcmlwdGlvbiBsaXN0LlxuICAgKlxuICAgKiAyLiBUaGUgbGlzdGVuZXIgc2hvdWxkIG5vdCBleHBlY3QgdG8gc2VlIGFsbCBzdGF0ZSBjaGFuZ2VzLCBhcyB0aGUgc3RhdGVcbiAgICogbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQgbXVsdGlwbGUgdGltZXMgZHVyaW5nIGEgbmVzdGVkIGBkaXNwYXRjaCgpYCBiZWZvcmVcbiAgICogdGhlIGxpc3RlbmVyIGlzIGNhbGxlZC4gSXQgaXMsIGhvd2V2ZXIsIGd1YXJhbnRlZWQgdGhhdCBhbGwgc3Vic2NyaWJlcnNcbiAgICogcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGBkaXNwYXRjaCgpYCBzdGFydGVkIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGxhdGVzdFxuICAgKiBzdGF0ZSBieSB0aGUgdGltZSBpdCBleGl0cy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgQSBjYWxsYmFjayB0byBiZSBpbnZva2VkIG9uIGV2ZXJ5IGRpc3BhdGNoLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoaXMgY2hhbmdlIGxpc3RlbmVyLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQpIDogXCJFeHBlY3RlZCB0aGUgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihsaXN0ZW5lcikgKyBcIidcIik7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUpIDogJ1lvdSBtYXkgbm90IGNhbGwgc3RvcmUuc3Vic2NyaWJlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ0lmIHlvdSB3b3VsZCBsaWtlIHRvIGJlIG5vdGlmaWVkIGFmdGVyIHRoZSBzdG9yZSBoYXMgYmVlbiB1cGRhdGVkLCBzdWJzY3JpYmUgZnJvbSBhICcgKyAnY29tcG9uZW50IGFuZCBpbnZva2Ugc3RvcmUuZ2V0U3RhdGUoKSBpbiB0aGUgY2FsbGJhY2sgdG8gYWNjZXNzIHRoZSBsYXRlc3Qgc3RhdGUuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS9zdG9yZSNzdWJzY3JpYmVsaXN0ZW5lciBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgIH1cblxuICAgIHZhciBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICBuZXh0TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgIGlmICghaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNikgOiAnWW91IG1heSBub3QgdW5zdWJzY3JpYmUgZnJvbSBhIHN0b3JlIGxpc3RlbmVyIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgICB9XG5cbiAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgICAgdmFyIGluZGV4ID0gbmV4dExpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgIG5leHRMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIGN1cnJlbnRMaXN0ZW5lcnMgPSBudWxsO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uLiBJdCBpcyB0aGUgb25seSB3YXkgdG8gdHJpZ2dlciBhIHN0YXRlIGNoYW5nZS5cbiAgICpcbiAgICogVGhlIGByZWR1Y2VyYCBmdW5jdGlvbiwgdXNlZCB0byBjcmVhdGUgdGhlIHN0b3JlLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZVxuICAgKiBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBnaXZlbiBgYWN0aW9uYC4gSXRzIHJldHVybiB2YWx1ZSB3aWxsXG4gICAqIGJlIGNvbnNpZGVyZWQgdGhlICoqbmV4dCoqIHN0YXRlIG9mIHRoZSB0cmVlLCBhbmQgdGhlIGNoYW5nZSBsaXN0ZW5lcnNcbiAgICogd2lsbCBiZSBub3RpZmllZC5cbiAgICpcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBwbGFpbiBvYmplY3QgYWN0aW9ucy4gSWYgeW91IHdhbnQgdG9cbiAgICogZGlzcGF0Y2ggYSBQcm9taXNlLCBhbiBPYnNlcnZhYmxlLCBhIHRodW5rLCBvciBzb21ldGhpbmcgZWxzZSwgeW91IG5lZWQgdG9cbiAgICogd3JhcCB5b3VyIHN0b3JlIGNyZWF0aW5nIGZ1bmN0aW9uIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgbWlkZGxld2FyZS4gRm9yXG4gICAqIGV4YW1wbGUsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGByZWR1eC10aHVua2AgcGFja2FnZS4gRXZlbiB0aGVcbiAgICogbWlkZGxld2FyZSB3aWxsIGV2ZW50dWFsbHkgZGlzcGF0Y2ggcGxhaW4gb2JqZWN0IGFjdGlvbnMgdXNpbmcgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24gQSBwbGFpbiBvYmplY3QgcmVwcmVzZW50aW5nIOKAnHdoYXQgY2hhbmdlZOKAnS4gSXQgaXNcbiAgICogYSBnb29kIGlkZWEgdG8ga2VlcCBhY3Rpb25zIHNlcmlhbGl6YWJsZSBzbyB5b3UgY2FuIHJlY29yZCBhbmQgcmVwbGF5IHVzZXJcbiAgICogc2Vzc2lvbnMsIG9yIHVzZSB0aGUgdGltZSB0cmF2ZWxsaW5nIGByZWR1eC1kZXZ0b29sc2AuIEFuIGFjdGlvbiBtdXN0IGhhdmVcbiAgICogYSBgdHlwZWAgcHJvcGVydHkgd2hpY2ggbWF5IG5vdCBiZSBgdW5kZWZpbmVkYC4gSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlXG4gICAqIHN0cmluZyBjb25zdGFudHMgZm9yIGFjdGlvbiB0eXBlcy5cbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gRm9yIGNvbnZlbmllbmNlLCB0aGUgc2FtZSBhY3Rpb24gb2JqZWN0IHlvdSBkaXNwYXRjaGVkLlxuICAgKlxuICAgKiBOb3RlIHRoYXQsIGlmIHlvdSB1c2UgYSBjdXN0b20gbWlkZGxld2FyZSwgaXQgbWF5IHdyYXAgYGRpc3BhdGNoKClgIHRvXG4gICAqIHJldHVybiBzb21ldGhpbmcgZWxzZSAoZm9yIGV4YW1wbGUsIGEgUHJvbWlzZSB5b3UgY2FuIGF3YWl0KS5cbiAgICovXG5cblxuICBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNykgOiBcIkFjdGlvbnMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLiBJbnN0ZWFkLCB0aGUgYWN0dWFsIHR5cGUgd2FzOiAnXCIgKyBraW5kT2YoYWN0aW9uKSArIFwiJy4gWW91IG1heSBuZWVkIHRvIGFkZCBtaWRkbGV3YXJlIHRvIHlvdXIgc3RvcmUgc2V0dXAgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIG90aGVyIHZhbHVlcywgc3VjaCBhcyAncmVkdXgtdGh1bmsnIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBmdW5jdGlvbnMuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNtaWRkbGV3YXJlIGFuZCBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNi1hc3luYy1sb2dpYyN1c2luZy10aGUtcmVkdXgtdGh1bmstbWlkZGxld2FyZSBmb3IgZXhhbXBsZXMuXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg4KSA6ICdBY3Rpb25zIG1heSBub3QgaGF2ZSBhbiB1bmRlZmluZWQgXCJ0eXBlXCIgcHJvcGVydHkuIFlvdSBtYXkgaGF2ZSBtaXNzcGVsbGVkIGFuIGFjdGlvbiB0eXBlIHN0cmluZyBjb25zdGFudC4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOSkgOiAnUmVkdWNlcnMgbWF5IG5vdCBkaXNwYXRjaCBhY3Rpb25zLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRSZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBsaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzID0gbmV4dExpc3RlbmVycztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb247XG4gIH1cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSByZWR1Y2VyIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBzdG9yZSB0byBjYWxjdWxhdGUgdGhlIHN0YXRlLlxuICAgKlxuICAgKiBZb3UgbWlnaHQgbmVlZCB0aGlzIGlmIHlvdXIgYXBwIGltcGxlbWVudHMgY29kZSBzcGxpdHRpbmcgYW5kIHlvdSB3YW50IHRvXG4gICAqIGxvYWQgc29tZSBvZiB0aGUgcmVkdWNlcnMgZHluYW1pY2FsbHkuIFlvdSBtaWdodCBhbHNvIG5lZWQgdGhpcyBpZiB5b3VcbiAgICogaW1wbGVtZW50IGEgaG90IHJlbG9hZGluZyBtZWNoYW5pc20gZm9yIFJlZHV4LlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0UmVkdWNlciBUaGUgcmVkdWNlciBmb3IgdGhlIHN0b3JlIHRvIHVzZSBpbnN0ZWFkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG5cblxuICBmdW5jdGlvbiByZXBsYWNlUmVkdWNlcihuZXh0UmVkdWNlcikge1xuICAgIGlmICh0eXBlb2YgbmV4dFJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEwKSA6IFwiRXhwZWN0ZWQgdGhlIG5leHRSZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YobmV4dFJlZHVjZXIpKTtcbiAgICB9XG5cbiAgICBjdXJyZW50UmVkdWNlciA9IG5leHRSZWR1Y2VyOyAvLyBUaGlzIGFjdGlvbiBoYXMgYSBzaW1pbGlhciBlZmZlY3QgdG8gQWN0aW9uVHlwZXMuSU5JVC5cbiAgICAvLyBBbnkgcmVkdWNlcnMgdGhhdCBleGlzdGVkIGluIGJvdGggdGhlIG5ldyBhbmQgb2xkIHJvb3RSZWR1Y2VyXG4gICAgLy8gd2lsbCByZWNlaXZlIHRoZSBwcmV2aW91cyBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgICAvLyB0aGUgbmV3IHN0YXRlIHRyZWUgd2l0aCBhbnkgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBvbGQgb25lLlxuXG4gICAgZGlzcGF0Y2goe1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUkVQTEFDRVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBJbnRlcm9wZXJhYmlsaXR5IHBvaW50IGZvciBvYnNlcnZhYmxlL3JlYWN0aXZlIGxpYnJhcmllcy5cbiAgICogQHJldHVybnMge29ic2VydmFibGV9IEEgbWluaW1hbCBvYnNlcnZhYmxlIG9mIHN0YXRlIGNoYW5nZXMuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIG9ic2VydmFibGUgcHJvcG9zYWw6XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9ic2VydmFibGVcbiAgICovXG5cblxuICBmdW5jdGlvbiBvYnNlcnZhYmxlKCkge1xuICAgIHZhciBfcmVmO1xuXG4gICAgdmFyIG91dGVyU3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIHJldHVybiBfcmVmID0ge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbWluaW1hbCBvYnNlcnZhYmxlIHN1YnNjcmlwdGlvbiBtZXRob2QuXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JzZXJ2ZXIgQW55IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIG9ic2VydmVyLlxuICAgICAgICogVGhlIG9ic2VydmVyIG9iamVjdCBzaG91bGQgaGF2ZSBhIGBuZXh0YCBtZXRob2QuXG4gICAgICAgKiBAcmV0dXJucyB7c3Vic2NyaXB0aW9ufSBBbiBvYmplY3Qgd2l0aCBhbiBgdW5zdWJzY3JpYmVgIG1ldGhvZCB0aGF0IGNhblxuICAgICAgICogYmUgdXNlZCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSBmcm9tIHRoZSBzdG9yZSwgYW5kIHByZXZlbnQgZnVydGhlclxuICAgICAgICogZW1pc3Npb24gb2YgdmFsdWVzIGZyb20gdGhlIG9ic2VydmFibGUuXG4gICAgICAgKi9cbiAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09ICdvYmplY3QnIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTEpIDogXCJFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKG9ic2VydmVyKSArIFwiJ1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9ic2VydmVTdGF0ZSgpIHtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIubmV4dCkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChnZXRTdGF0ZSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlU3RhdGUoKTtcbiAgICAgICAgdmFyIHVuc3Vic2NyaWJlID0gb3V0ZXJTdWJzY3JpYmUob2JzZXJ2ZVN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1bnN1YnNjcmliZTogdW5zdWJzY3JpYmVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LCBfcmVmWyQkb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBfcmVmO1xuICB9IC8vIFdoZW4gYSBzdG9yZSBpcyBjcmVhdGVkLCBhbiBcIklOSVRcIiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCBzbyB0aGF0IGV2ZXJ5XG4gIC8vIHJlZHVjZXIgcmV0dXJucyB0aGVpciBpbml0aWFsIHN0YXRlLiBUaGlzIGVmZmVjdGl2ZWx5IHBvcHVsYXRlc1xuICAvLyB0aGUgaW5pdGlhbCBzdGF0ZSB0cmVlLlxuXG5cbiAgZGlzcGF0Y2goe1xuICAgIHR5cGU6IEFjdGlvblR5cGVzLklOSVRcbiAgfSk7XG4gIHJldHVybiBfcmVmMiA9IHtcbiAgICBkaXNwYXRjaDogZGlzcGF0Y2gsXG4gICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXG4gICAgZ2V0U3RhdGU6IGdldFN0YXRlLFxuICAgIHJlcGxhY2VSZWR1Y2VyOiByZXBsYWNlUmVkdWNlclxuICB9LCBfcmVmMlskJG9ic2VydmFibGVdID0gb2JzZXJ2YWJsZSwgX3JlZjI7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBSZWR1eCBzdG9yZSB0aGF0IGhvbGRzIHRoZSBzdGF0ZSB0cmVlLlxuICpcbiAqICoqV2UgcmVjb21tZW5kIHVzaW5nIGBjb25maWd1cmVTdG9yZWAgZnJvbSB0aGVcbiAqIGBAcmVkdXhqcy90b29sa2l0YCBwYWNrYWdlKiosIHdoaWNoIHJlcGxhY2VzIGBjcmVhdGVTdG9yZWA6XG4gKiAqKmh0dHBzOi8vcmVkdXguanMub3JnL2ludHJvZHVjdGlvbi93aHktcnRrLWlzLXJlZHV4LXRvZGF5KipcbiAqXG4gKiBUaGUgb25seSB3YXkgdG8gY2hhbmdlIHRoZSBkYXRhIGluIHRoZSBzdG9yZSBpcyB0byBjYWxsIGBkaXNwYXRjaCgpYCBvbiBpdC5cbiAqXG4gKiBUaGVyZSBzaG91bGQgb25seSBiZSBhIHNpbmdsZSBzdG9yZSBpbiB5b3VyIGFwcC4gVG8gc3BlY2lmeSBob3cgZGlmZmVyZW50XG4gKiBwYXJ0cyBvZiB0aGUgc3RhdGUgdHJlZSByZXNwb25kIHRvIGFjdGlvbnMsIHlvdSBtYXkgY29tYmluZSBzZXZlcmFsIHJlZHVjZXJzXG4gKiBpbnRvIGEgc2luZ2xlIHJlZHVjZXIgZnVuY3Rpb24gYnkgdXNpbmcgYGNvbWJpbmVSZWR1Y2Vyc2AuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVkdWNlciBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmV4dCBzdGF0ZSB0cmVlLCBnaXZlblxuICogdGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBhbmQgdGhlIGFjdGlvbiB0byBoYW5kbGUuXG4gKlxuICogQHBhcmFtIHthbnl9IFtwcmVsb2FkZWRTdGF0ZV0gVGhlIGluaXRpYWwgc3RhdGUuIFlvdSBtYXkgb3B0aW9uYWxseSBzcGVjaWZ5IGl0XG4gKiB0byBoeWRyYXRlIHRoZSBzdGF0ZSBmcm9tIHRoZSBzZXJ2ZXIgaW4gdW5pdmVyc2FsIGFwcHMsIG9yIHRvIHJlc3RvcmUgYVxuICogcHJldmlvdXNseSBzZXJpYWxpemVkIHVzZXIgc2Vzc2lvbi5cbiAqIElmIHlvdSB1c2UgYGNvbWJpbmVSZWR1Y2Vyc2AgdG8gcHJvZHVjZSB0aGUgcm9vdCByZWR1Y2VyIGZ1bmN0aW9uLCB0aGlzIG11c3QgYmVcbiAqIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNoYXBlIGFzIGBjb21iaW5lUmVkdWNlcnNgIGtleXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2VuaGFuY2VyXSBUaGUgc3RvcmUgZW5oYW5jZXIuIFlvdSBtYXkgb3B0aW9uYWxseSBzcGVjaWZ5IGl0XG4gKiB0byBlbmhhbmNlIHRoZSBzdG9yZSB3aXRoIHRoaXJkLXBhcnR5IGNhcGFiaWxpdGllcyBzdWNoIGFzIG1pZGRsZXdhcmUsXG4gKiB0aW1lIHRyYXZlbCwgcGVyc2lzdGVuY2UsIGV0Yy4gVGhlIG9ubHkgc3RvcmUgZW5oYW5jZXIgdGhhdCBzaGlwcyB3aXRoIFJlZHV4XG4gKiBpcyBgYXBwbHlNaWRkbGV3YXJlKClgLlxuICpcbiAqIEByZXR1cm5zIHtTdG9yZX0gQSBSZWR1eCBzdG9yZSB0aGF0IGxldHMgeW91IHJlYWQgdGhlIHN0YXRlLCBkaXNwYXRjaCBhY3Rpb25zXG4gKiBhbmQgc3Vic2NyaWJlIHRvIGNoYW5nZXMuXG4gKi9cblxudmFyIGxlZ2FjeV9jcmVhdGVTdG9yZSA9IGNyZWF0ZVN0b3JlO1xuXG4vKipcbiAqIFByaW50cyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUgaWYgaXQgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG5cblxuICB0cnkge1xuICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgaWYgeW91IGVuYWJsZVxuICAgIC8vIFwiYnJlYWsgb24gYWxsIGV4Y2VwdGlvbnNcIiBpbiB5b3VyIGNvbnNvbGUsXG4gICAgLy8gaXQgd291bGQgcGF1c2UgdGhlIGV4ZWN1dGlvbiBhdCB0aGlzIGxpbmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9IGNhdGNoIChlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG5cbn1cblxuZnVuY3Rpb24gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShpbnB1dFN0YXRlLCByZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpIHtcbiAgdmFyIHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICB2YXIgYXJndW1lbnROYW1lID0gYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlcy5JTklUID8gJ3ByZWxvYWRlZFN0YXRlIGFyZ3VtZW50IHBhc3NlZCB0byBjcmVhdGVTdG9yZScgOiAncHJldmlvdXMgc3RhdGUgcmVjZWl2ZWQgYnkgdGhlIHJlZHVjZXInO1xuXG4gIGlmIChyZWR1Y2VyS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ1N0b3JlIGRvZXMgbm90IGhhdmUgYSB2YWxpZCByZWR1Y2VyLiBNYWtlIHN1cmUgdGhlIGFyZ3VtZW50IHBhc3NlZCAnICsgJ3RvIGNvbWJpbmVSZWR1Y2VycyBpcyBhbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSByZWR1Y2Vycy4nO1xuICB9XG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGlucHV0U3RhdGUpKSB7XG4gICAgcmV0dXJuIFwiVGhlIFwiICsgYXJndW1lbnROYW1lICsgXCIgaGFzIHVuZXhwZWN0ZWQgdHlwZSBvZiBcXFwiXCIgKyBraW5kT2YoaW5wdXRTdGF0ZSkgKyBcIlxcXCIuIEV4cGVjdGVkIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgXCIgKyAoXCJrZXlzOiBcXFwiXCIgKyByZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKSArIFwiXFxcIlwiKTtcbiAgfVxuXG4gIHZhciB1bmV4cGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKGlucHV0U3RhdGUpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuICFyZWR1Y2Vycy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICF1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XTtcbiAgfSk7XG4gIHVuZXhwZWN0ZWRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldID0gdHJ1ZTtcbiAgfSk7XG4gIGlmIChhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVzLlJFUExBQ0UpIHJldHVybjtcblxuICBpZiAodW5leHBlY3RlZEtleXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBcIlVuZXhwZWN0ZWQgXCIgKyAodW5leHBlY3RlZEtleXMubGVuZ3RoID4gMSA/ICdrZXlzJyA6ICdrZXknKSArIFwiIFwiICsgKFwiXFxcIlwiICsgdW5leHBlY3RlZEtleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCIgZm91bmQgaW4gXCIgKyBhcmd1bWVudE5hbWUgKyBcIi4gXCIpICsgXCJFeHBlY3RlZCB0byBmaW5kIG9uZSBvZiB0aGUga25vd24gcmVkdWNlciBrZXlzIGluc3RlYWQ6IFwiICsgKFwiXFxcIlwiICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyBcIlxcXCIuIFVuZXhwZWN0ZWQga2V5cyB3aWxsIGJlIGlnbm9yZWQuXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFJlZHVjZXJTaGFwZShyZWR1Y2Vycykge1xuICBPYmplY3Qua2V5cyhyZWR1Y2VycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHJlZHVjZXIgPSByZWR1Y2Vyc1trZXldO1xuICAgIHZhciBpbml0aWFsU3RhdGUgPSByZWR1Y2VyKHVuZGVmaW5lZCwge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuSU5JVFxuICAgIH0pO1xuXG4gICAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMikgOiBcIlRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiIHJldHVybmVkIHVuZGVmaW5lZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIFwiICsgXCJJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgXCIgKyBcImV4cGxpY2l0bHkgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgXCIgKyBcIm5vdCBiZSB1bmRlZmluZWQuIElmIHlvdSBkb24ndCB3YW50IHRvIHNldCBhIHZhbHVlIGZvciB0aGlzIHJlZHVjZXIsIFwiICsgXCJ5b3UgY2FuIHVzZSBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLlwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlZHVjZXIodW5kZWZpbmVkLCB7XG4gICAgICB0eXBlOiBBY3Rpb25UeXBlcy5QUk9CRV9VTktOT1dOX0FDVElPTigpXG4gICAgfSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMykgOiBcIlRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXFxcIlwiICsga2V5ICsgXCJcXFwiIHJldHVybmVkIHVuZGVmaW5lZCB3aGVuIHByb2JlZCB3aXRoIGEgcmFuZG9tIHR5cGUuIFwiICsgKFwiRG9uJ3QgdHJ5IHRvIGhhbmRsZSAnXCIgKyBBY3Rpb25UeXBlcy5JTklUICsgXCInIG9yIG90aGVyIGFjdGlvbnMgaW4gXFxcInJlZHV4LypcXFwiIFwiKSArIFwibmFtZXNwYWNlLiBUaGV5IGFyZSBjb25zaWRlcmVkIHByaXZhdGUuIEluc3RlYWQsIHlvdSBtdXN0IHJldHVybiB0aGUgXCIgKyBcImN1cnJlbnQgc3RhdGUgZm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHVubGVzcyBpdCBpcyB1bmRlZmluZWQsIFwiICsgXCJpbiB3aGljaCBjYXNlIHlvdSBtdXN0IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgXCIgKyBcImFjdGlvbiB0eXBlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZCwgYnV0IGNhbiBiZSBudWxsLlwiKTtcbiAgICB9XG4gIH0pO1xufVxuLyoqXG4gKiBUdXJucyBhbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBkaWZmZXJlbnQgcmVkdWNlciBmdW5jdGlvbnMsIGludG8gYSBzaW5nbGVcbiAqIHJlZHVjZXIgZnVuY3Rpb24uIEl0IHdpbGwgY2FsbCBldmVyeSBjaGlsZCByZWR1Y2VyLCBhbmQgZ2F0aGVyIHRoZWlyIHJlc3VsdHNcbiAqIGludG8gYSBzaW5nbGUgc3RhdGUgb2JqZWN0LCB3aG9zZSBrZXlzIGNvcnJlc3BvbmQgdG8gdGhlIGtleXMgb2YgdGhlIHBhc3NlZFxuICogcmVkdWNlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlZHVjZXJzIEFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgY29ycmVzcG9uZCB0byBkaWZmZXJlbnRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBjb21iaW5lZCBpbnRvIG9uZS4gT25lIGhhbmR5IHdheSB0byBvYnRhaW5cbiAqIGl0IGlzIHRvIHVzZSBFUzYgYGltcG9ydCAqIGFzIHJlZHVjZXJzYCBzeW50YXguIFRoZSByZWR1Y2VycyBtYXkgbmV2ZXIgcmV0dXJuXG4gKiB1bmRlZmluZWQgZm9yIGFueSBhY3Rpb24uIEluc3RlYWQsIHRoZXkgc2hvdWxkIHJldHVybiB0aGVpciBpbml0aWFsIHN0YXRlXG4gKiBpZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZW0gd2FzIHVuZGVmaW5lZCwgYW5kIHRoZSBjdXJyZW50IHN0YXRlIGZvciBhbnlcbiAqIHVucmVjb2duaXplZCBhY3Rpb24uXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIHJlZHVjZXIgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGV2ZXJ5IHJlZHVjZXIgaW5zaWRlIHRoZVxuICogcGFzc2VkIG9iamVjdCwgYW5kIGJ1aWxkcyBhIHN0YXRlIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNoYXBlLlxuICovXG5cblxuZnVuY3Rpb24gY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGZpbmFsUmVkdWNlcnMgPSB7fTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IHJlZHVjZXJLZXlzW2ldO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2FybmluZyhcIk5vIHJlZHVjZXIgcHJvdmlkZWQgZm9yIGtleSBcXFwiXCIgKyBrZXkgKyBcIlxcXCJcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmaW5hbFJlZHVjZXJzW2tleV0gPSByZWR1Y2Vyc1trZXldO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmaW5hbFJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMoZmluYWxSZWR1Y2Vycyk7IC8vIFRoaXMgaXMgdXNlZCB0byBtYWtlIHN1cmUgd2UgZG9uJ3Qgd2FybiBhYm91dCB0aGUgc2FtZVxuICAvLyBrZXlzIG11bHRpcGxlIHRpbWVzLlxuXG4gIHZhciB1bmV4cGVjdGVkS2V5Q2FjaGU7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGUgPSB7fTtcbiAgfVxuXG4gIHZhciBzaGFwZUFzc2VydGlvbkVycm9yO1xuXG4gIHRyeSB7XG4gICAgYXNzZXJ0UmVkdWNlclNoYXBlKGZpbmFsUmVkdWNlcnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hhcGVBc3NlcnRpb25FcnJvciA9IGU7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gY29tYmluYXRpb24oc3RhdGUsIGFjdGlvbikge1xuICAgIGlmIChzdGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgICBzdGF0ZSA9IHt9O1xuICAgIH1cblxuICAgIGlmIChzaGFwZUFzc2VydGlvbkVycm9yKSB7XG4gICAgICB0aHJvdyBzaGFwZUFzc2VydGlvbkVycm9yO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgd2FybmluZ01lc3NhZ2UgPSBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKHN0YXRlLCBmaW5hbFJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSk7XG5cbiAgICAgIGlmICh3YXJuaW5nTWVzc2FnZSkge1xuICAgICAgICB3YXJuaW5nKHdhcm5pbmdNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciBuZXh0U3RhdGUgPSB7fTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBmaW5hbFJlZHVjZXJLZXlzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9rZXkgPSBmaW5hbFJlZHVjZXJLZXlzW19pXTtcbiAgICAgIHZhciByZWR1Y2VyID0gZmluYWxSZWR1Y2Vyc1tfa2V5XTtcbiAgICAgIHZhciBwcmV2aW91c1N0YXRlRm9yS2V5ID0gc3RhdGVbX2tleV07XG4gICAgICB2YXIgbmV4dFN0YXRlRm9yS2V5ID0gcmVkdWNlcihwcmV2aW91c1N0YXRlRm9yS2V5LCBhY3Rpb24pO1xuXG4gICAgICBpZiAodHlwZW9mIG5leHRTdGF0ZUZvcktleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGFjdGlvblR5cGUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE0KSA6IFwiV2hlbiBjYWxsZWQgd2l0aCBhbiBhY3Rpb24gb2YgdHlwZSBcIiArIChhY3Rpb25UeXBlID8gXCJcXFwiXCIgKyBTdHJpbmcoYWN0aW9uVHlwZSkgKyBcIlxcXCJcIiA6ICcodW5rbm93biB0eXBlKScpICsgXCIsIHRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXFxcIlwiICsgX2tleSArIFwiXFxcIiByZXR1cm5lZCB1bmRlZmluZWQuIFwiICsgXCJUbyBpZ25vcmUgYW4gYWN0aW9uLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgcHJldmlvdXMgc3RhdGUuIFwiICsgXCJJZiB5b3Ugd2FudCB0aGlzIHJlZHVjZXIgdG8gaG9sZCBubyB2YWx1ZSwgeW91IGNhbiByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC5cIik7XG4gICAgICB9XG5cbiAgICAgIG5leHRTdGF0ZVtfa2V5XSA9IG5leHRTdGF0ZUZvcktleTtcbiAgICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IG5leHRTdGF0ZUZvcktleSAhPT0gcHJldmlvdXNTdGF0ZUZvcktleTtcbiAgICB9XG5cbiAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBmaW5hbFJlZHVjZXJLZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoc3RhdGUpLmxlbmd0aDtcbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuLyoqXG4gKiBUdXJucyBhbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb24gY3JlYXRvcnMsIGludG8gYW4gb2JqZWN0IHdpdGggdGhlXG4gKiBzYW1lIGtleXMsIGJ1dCB3aXRoIGV2ZXJ5IGZ1bmN0aW9uIHdyYXBwZWQgaW50byBhIGBkaXNwYXRjaGAgY2FsbCBzbyB0aGV5XG4gKiBtYXkgYmUgaW52b2tlZCBkaXJlY3RseS4gVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UgbWV0aG9kLCBhcyB5b3UgY2FuIGNhbGxcbiAqIGBzdG9yZS5kaXNwYXRjaChNeUFjdGlvbkNyZWF0b3JzLmRvU29tZXRoaW5nKCkpYCB5b3Vyc2VsZiBqdXN0IGZpbmUuXG4gKlxuICogRm9yIGNvbnZlbmllbmNlLCB5b3UgY2FuIGFsc28gcGFzcyBhbiBhY3Rpb24gY3JlYXRvciBhcyB0aGUgZmlyc3QgYXJndW1lbnQsXG4gKiBhbmQgZ2V0IGEgZGlzcGF0Y2ggd3JhcHBlZCBmdW5jdGlvbiBpbiByZXR1cm4uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IGFjdGlvbkNyZWF0b3JzIEFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvblxuICogY3JlYXRvciBmdW5jdGlvbnMuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluIGl0IGlzIHRvIHVzZSBFUzYgYGltcG9ydCAqIGFzYFxuICogc3ludGF4LiBZb3UgbWF5IGFsc28gcGFzcyBhIHNpbmdsZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBkaXNwYXRjaCBUaGUgYGRpc3BhdGNoYCBmdW5jdGlvbiBhdmFpbGFibGUgb24geW91ciBSZWR1eFxuICogc3RvcmUuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gVGhlIG9iamVjdCBtaW1pY2tpbmcgdGhlIG9yaWdpbmFsIG9iamVjdCwgYnV0IHdpdGhcbiAqIGV2ZXJ5IGFjdGlvbiBjcmVhdG9yIHdyYXBwZWQgaW50byB0aGUgYGRpc3BhdGNoYCBjYWxsLiBJZiB5b3UgcGFzc2VkIGFcbiAqIGZ1bmN0aW9uIGFzIGBhY3Rpb25DcmVhdG9yc2AsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHNvIGJlIGEgc2luZ2xlXG4gKiBmdW5jdGlvbi5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9ycyhhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyAhPT0gJ29iamVjdCcgfHwgYWN0aW9uQ3JlYXRvcnMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNikgOiBcImJpbmRBY3Rpb25DcmVhdG9ycyBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwgYnV0IGluc3RlYWQgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihhY3Rpb25DcmVhdG9ycykgKyBcIicuIFwiICsgXCJEaWQgeW91IHdyaXRlIFxcXCJpbXBvcnQgQWN0aW9uQ3JlYXRvcnMgZnJvbVxcXCIgaW5zdGVhZCBvZiBcXFwiaW1wb3J0ICogYXMgQWN0aW9uQ3JlYXRvcnMgZnJvbVxcXCI/XCIpO1xuICB9XG5cbiAgdmFyIGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcblxuICBmb3IgKHZhciBrZXkgaW4gYWN0aW9uQ3JlYXRvcnMpIHtcbiAgICB2YXIgYWN0aW9uQ3JlYXRvciA9IGFjdGlvbkNyZWF0b3JzW2tleV07XG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGJvdW5kQWN0aW9uQ3JlYXRvcnNba2V5XSA9IGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYm91bmRBY3Rpb25DcmVhdG9ycztcbn1cblxuLyoqXG4gKiBDb21wb3NlcyBzaW5nbGUtYXJndW1lbnQgZnVuY3Rpb25zIGZyb20gcmlnaHQgdG8gbGVmdC4gVGhlIHJpZ2h0bW9zdFxuICogZnVuY3Rpb24gY2FuIHRha2UgbXVsdGlwbGUgYXJndW1lbnRzIGFzIGl0IHByb3ZpZGVzIHRoZSBzaWduYXR1cmUgZm9yXG4gKiB0aGUgcmVzdWx0aW5nIGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gey4uLkZ1bmN0aW9ufSBmdW5jcyBUaGUgZnVuY3Rpb25zIHRvIGNvbXBvc2UuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24gb2J0YWluZWQgYnkgY29tcG9zaW5nIHRoZSBhcmd1bWVudCBmdW5jdGlvbnNcbiAqIGZyb20gcmlnaHQgdG8gbGVmdC4gRm9yIGV4YW1wbGUsIGNvbXBvc2UoZiwgZywgaCkgaXMgaWRlbnRpY2FsIHRvIGRvaW5nXG4gKiAoLi4uYXJncykgPT4gZihnKGgoLi4uYXJncykpKS5cbiAqL1xuZnVuY3Rpb24gY29tcG9zZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGZ1bmNzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGZ1bmNzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH07XG4gIH1cblxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZ1bmNzWzBdO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmNzLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYShiLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKSk7XG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0b3JlIGVuaGFuY2VyIHRoYXQgYXBwbGllcyBtaWRkbGV3YXJlIHRvIHRoZSBkaXNwYXRjaCBtZXRob2RcbiAqIG9mIHRoZSBSZWR1eCBzdG9yZS4gVGhpcyBpcyBoYW5keSBmb3IgYSB2YXJpZXR5IG9mIHRhc2tzLCBzdWNoIGFzIGV4cHJlc3NpbmdcbiAqIGFzeW5jaHJvbm91cyBhY3Rpb25zIGluIGEgY29uY2lzZSBtYW5uZXIsIG9yIGxvZ2dpbmcgZXZlcnkgYWN0aW9uIHBheWxvYWQuXG4gKlxuICogU2VlIGByZWR1eC10aHVua2AgcGFja2FnZSBhcyBhbiBleGFtcGxlIG9mIHRoZSBSZWR1eCBtaWRkbGV3YXJlLlxuICpcbiAqIEJlY2F1c2UgbWlkZGxld2FyZSBpcyBwb3RlbnRpYWxseSBhc3luY2hyb25vdXMsIHRoaXMgc2hvdWxkIGJlIHRoZSBmaXJzdFxuICogc3RvcmUgZW5oYW5jZXIgaW4gdGhlIGNvbXBvc2l0aW9uIGNoYWluLlxuICpcbiAqIE5vdGUgdGhhdCBlYWNoIG1pZGRsZXdhcmUgd2lsbCBiZSBnaXZlbiB0aGUgYGRpc3BhdGNoYCBhbmQgYGdldFN0YXRlYCBmdW5jdGlvbnNcbiAqIGFzIG5hbWVkIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gey4uLkZ1bmN0aW9ufSBtaWRkbGV3YXJlcyBUaGUgbWlkZGxld2FyZSBjaGFpbiB0byBiZSBhcHBsaWVkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIHN0b3JlIGVuaGFuY2VyIGFwcGx5aW5nIHRoZSBtaWRkbGV3YXJlLlxuICovXG5cbmZ1bmN0aW9uIGFwcGx5TWlkZGxld2FyZSgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1pZGRsZXdhcmVzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIG1pZGRsZXdhcmVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChjcmVhdGVTdG9yZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RvcmUgPSBjcmVhdGVTdG9yZS5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG5cbiAgICAgIHZhciBfZGlzcGF0Y2ggPSBmdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTUpIDogJ0Rpc3BhdGNoaW5nIHdoaWxlIGNvbnN0cnVjdGluZyB5b3VyIG1pZGRsZXdhcmUgaXMgbm90IGFsbG93ZWQuICcgKyAnT3RoZXIgbWlkZGxld2FyZSB3b3VsZCBub3QgYmUgYXBwbGllZCB0byB0aGlzIGRpc3BhdGNoLicpO1xuICAgICAgfTtcblxuICAgICAgdmFyIG1pZGRsZXdhcmVBUEkgPSB7XG4gICAgICAgIGdldFN0YXRlOiBzdG9yZS5nZXRTdGF0ZSxcbiAgICAgICAgZGlzcGF0Y2g6IGZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICAgICAgICAgIHJldHVybiBfZGlzcGF0Y2guYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIGNoYWluID0gbWlkZGxld2FyZXMubWFwKGZ1bmN0aW9uIChtaWRkbGV3YXJlKSB7XG4gICAgICAgIHJldHVybiBtaWRkbGV3YXJlKG1pZGRsZXdhcmVBUEkpO1xuICAgICAgfSk7XG4gICAgICBfZGlzcGF0Y2ggPSBjb21wb3NlLmFwcGx5KHZvaWQgMCwgY2hhaW4pKHN0b3JlLmRpc3BhdGNoKTtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0b3JlKSwge30sIHtcbiAgICAgICAgZGlzcGF0Y2g6IF9kaXNwYXRjaFxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHsgQWN0aW9uVHlwZXMgYXMgX19ET19OT1RfVVNFX19BY3Rpb25UeXBlcywgYXBwbHlNaWRkbGV3YXJlLCBiaW5kQWN0aW9uQ3JlYXRvcnMsIGNvbWJpbmVSZWR1Y2VycywgY29tcG9zZSwgY3JlYXRlU3RvcmUsIGxlZ2FjeV9jcmVhdGVTdG9yZSB9O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbFxudmFyIFJlZmxlY3RBcHBseSA9IFIgJiYgdHlwZW9mIFIuYXBwbHkgPT09ICdmdW5jdGlvbidcbiAgPyBSLmFwcGx5XG4gIDogZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwodGFyZ2V0LCByZWNlaXZlciwgYXJncyk7XG4gIH1cblxudmFyIFJlZmxlY3RPd25LZXlzXG5pZiAoUiAmJiB0eXBlb2YgUi5vd25LZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gUi5vd25LZXlzXG59IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpO1xuICB9O1xufSBlbHNlIHtcbiAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpIHtcbiAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSBjb25zb2xlLndhcm4od2FybmluZyk7XG59XG5cbnZhciBOdW1iZXJJc05hTiA9IE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBOdW1iZXJJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbm1vZHVsZS5leHBvcnRzLm9uY2UgPSBvbmNlO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50ID0gMDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxudmFyIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBsaXN0ZW5lcik7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24oYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgYXJnICsgJy4nKTtcbiAgICB9XG4gICAgZGVmYXVsdE1heExpc3RlbmVycyA9IGFyZztcbiAgfVxufSk7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG5cbiAgaWYgKHRoaXMuX2V2ZW50cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIG4gKyAnLicpO1xuICB9XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gIHZhciBkb0Vycm9yID0gKHR5cGUgPT09ICdlcnJvcicpO1xuXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZClcbiAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpO1xuICBlbHNlIGlmICghZG9FcnJvcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAoZG9FcnJvcikge1xuICAgIHZhciBlcjtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKVxuICAgICAgZXIgPSBhcmdzWzBdO1xuICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAvLyBOb3RlOiBUaGUgY29tbWVudHMgb24gdGhlIGB0aHJvd2AgbGluZXMgYXJlIGludGVudGlvbmFsLCB0aGV5IHNob3dcbiAgICAgIC8vIHVwIGluIE5vZGUncyBvdXRwdXQgaWYgdGhpcyByZXN1bHRzIGluIGFuIHVuaGFuZGxlZCBleGNlcHRpb24uXG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9XG4gICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuaGFuZGxlZCBlcnJvci4nICsgKGVyID8gJyAoJyArIGVyLm1lc3NhZ2UgKyAnKScgOiAnJykpO1xuICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgdGhyb3cgZXJyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICB9XG5cbiAgdmFyIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUmVmbGVjdEFwcGx5KGhhbmRsZXIsIHRoaXMsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBSZWZsZWN0QXBwbHkobGlzdGVuZXJzW2ldLCB0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHtcbiAgdmFyIG07XG4gIHZhciBldmVudHM7XG4gIHZhciBleGlzdGluZztcblxuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFJlLWFzc2lnbiBgZXZlbnRzYCBiZWNhdXNlIGEgbmV3TGlzdGVuZXIgaGFuZGxlciBjb3VsZCBoYXZlIGNhdXNlZCB0aGVcbiAgICAgIC8vIHRoaXMuX2V2ZW50cyB0byBiZSBhc3NpZ25lZCB0byBhIG5ldyBvYmplY3RcbiAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICAgIH1cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9XG4gICAgICAgIHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6IFtleGlzdGluZywgbGlzdGVuZXJdO1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIH0gZWxzZSBpZiAocHJlcGVuZCkge1xuICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBvbmNlV3JhcHBlcigpIHtcbiAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLCB0aGlzLndyYXBGbik7XG4gICAgdGhpcy5maXJlZCA9IHRydWU7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCwgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTtcbiAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtcbiAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkO1xuICByZXR1cm4gd3JhcHBlZDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgdGhpcy5vbih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRPbmNlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHwgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgZXZlbnRzW3R5cGVdID0gbGlzdFswXTtcblxuICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcbiAgICAgICAgdmFyIGtleTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGxpc3RlbmVycyA9IGV2ZW50c1t0eXBlXTtcblxuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICAgICAgfSBlbHNlIGlmIChsaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5mdW5jdGlvbiBfbGlzdGVuZXJzKHRhcmdldCwgdHlwZSwgdW53cmFwKSB7XG4gIHZhciBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgcmV0dXJuIHVud3JhcCA/IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdIDogW2V2bGlzdGVuZXJdO1xuXG4gIHJldHVybiB1bndyYXAgP1xuICAgIHVud3JhcExpc3RlbmVycyhldmxpc3RlbmVyKSA6IGFycmF5Q2xvbmUoZXZsaXN0ZW5lciwgZXZsaXN0ZW5lci5sZW5ndGgpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnMgPSBmdW5jdGlvbiByYXdMaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBsaXN0ZW5lckNvdW50LmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07XG5cbmZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLCBuKSB7XG4gIHZhciBjb3B5ID0gbmV3IEFycmF5KG4pO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKylcbiAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gb25jZShlbWl0dGVyLCBuYW1lKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgcmVzb2x2ZXIpO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7XG4gICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICB9O1xuXG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHtcbiAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBoYW5kbGVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgJ2Vycm9yJywgaGFuZGxlciwgZmxhZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCBsaXN0ZW5lciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgIGVtaXR0ZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gRXZlbnRUYXJnZXQgZG9lcyBub3QgaGF2ZSBgZXJyb3JgIGV2ZW50IHNlbWFudGljcyBsaWtlIE5vZGVcbiAgICAvLyBFdmVudEVtaXR0ZXJzLCB3ZSBkbyBub3QgbGlzdGVuIGZvciBgZXJyb3JgIGV2ZW50cyBoZXJlLlxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiB3cmFwTGlzdGVuZXIoYXJnKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gYHsgb25jZTogdHJ1ZSB9YCBzdXBwb3J0IHNvIHdlXG4gICAgICAvLyBoYXZlIHRvIGRvIGl0IG1hbnVhbGx5LlxuICAgICAgaWYgKGZsYWdzLm9uY2UpIHtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIHdyYXBMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcihhcmcpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImVtaXR0ZXJcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZW1pdHRlcik7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJhc3NldHMvaW1hZ2VzL2xvZ28uMmE3YmZmMGMxMTg5MTgzZmFmZTcxZDdkNWI5NGUwY2QucG5nXCI7IiwiKGZ1bmN0aW9uKGEsYil7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSxiKTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBleHBvcnRzKWIoKTtlbHNle2IoKSxhLkZpbGVTYXZlcj17ZXhwb3J0czp7fX0uZXhwb3J0c319KSh0aGlzLGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihhLGIpe3JldHVyblwidW5kZWZpbmVkXCI9PXR5cGVvZiBiP2I9e2F1dG9Cb206ITF9Olwib2JqZWN0XCIhPXR5cGVvZiBiJiYoY29uc29sZS53YXJuKFwiRGVwcmVjYXRlZDogRXhwZWN0ZWQgdGhpcmQgYXJndW1lbnQgdG8gYmUgYSBvYmplY3RcIiksYj17YXV0b0JvbTohYn0pLGIuYXV0b0JvbSYmL15cXHMqKD86dGV4dFxcL1xcUyp8YXBwbGljYXRpb25cXC94bWx8XFxTKlxcL1xcUypcXCt4bWwpXFxzKjsuKmNoYXJzZXRcXHMqPVxccyp1dGYtOC9pLnRlc3QoYS50eXBlKT9uZXcgQmxvYihbXCJcXHVGRUZGXCIsYV0se3R5cGU6YS50eXBlfSk6YX1mdW5jdGlvbiBjKGEsYixjKXt2YXIgZD1uZXcgWE1MSHR0cFJlcXVlc3Q7ZC5vcGVuKFwiR0VUXCIsYSksZC5yZXNwb25zZVR5cGU9XCJibG9iXCIsZC5vbmxvYWQ9ZnVuY3Rpb24oKXtnKGQucmVzcG9uc2UsYixjKX0sZC5vbmVycm9yPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcihcImNvdWxkIG5vdCBkb3dubG9hZCBmaWxlXCIpfSxkLnNlbmQoKX1mdW5jdGlvbiBkKGEpe3ZhciBiPW5ldyBYTUxIdHRwUmVxdWVzdDtiLm9wZW4oXCJIRUFEXCIsYSwhMSk7dHJ5e2Iuc2VuZCgpfWNhdGNoKGEpe31yZXR1cm4gMjAwPD1iLnN0YXR1cyYmMjk5Pj1iLnN0YXR1c31mdW5jdGlvbiBlKGEpe3RyeXthLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiKSl9Y2F0Y2goYyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50c1wiKTtiLmluaXRNb3VzZUV2ZW50KFwiY2xpY2tcIiwhMCwhMCx3aW5kb3csMCwwLDAsODAsMjAsITEsITEsITEsITEsMCxudWxsKSxhLmRpc3BhdGNoRXZlbnQoYil9fXZhciBmPVwib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy53aW5kb3c9PT13aW5kb3c/d2luZG93Olwib2JqZWN0XCI9PXR5cGVvZiBzZWxmJiZzZWxmLnNlbGY9PT1zZWxmP3NlbGY6XCJvYmplY3RcIj09dHlwZW9mIGdsb2JhbCYmZ2xvYmFsLmdsb2JhbD09PWdsb2JhbD9nbG9iYWw6dm9pZCAwLGE9Zi5uYXZpZ2F0b3ImJi9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJi9BcHBsZVdlYktpdC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIS9TYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksZz1mLnNhdmVBc3x8KFwib2JqZWN0XCIhPXR5cGVvZiB3aW5kb3d8fHdpbmRvdyE9PWY/ZnVuY3Rpb24oKXt9OlwiZG93bmxvYWRcImluIEhUTUxBbmNob3JFbGVtZW50LnByb3RvdHlwZSYmIWE/ZnVuY3Rpb24oYixnLGgpe3ZhciBpPWYuVVJMfHxmLndlYmtpdFVSTCxqPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO2c9Z3x8Yi5uYW1lfHxcImRvd25sb2FkXCIsai5kb3dubG9hZD1nLGoucmVsPVwibm9vcGVuZXJcIixcInN0cmluZ1wiPT10eXBlb2YgYj8oai5ocmVmPWIsai5vcmlnaW49PT1sb2NhdGlvbi5vcmlnaW4/ZShqKTpkKGouaHJlZik/YyhiLGcsaCk6ZShqLGoudGFyZ2V0PVwiX2JsYW5rXCIpKTooai5ocmVmPWkuY3JlYXRlT2JqZWN0VVJMKGIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLnJldm9rZU9iamVjdFVSTChqLmhyZWYpfSw0RTQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKGopfSwwKSl9OlwibXNTYXZlT3JPcGVuQmxvYlwiaW4gbmF2aWdhdG9yP2Z1bmN0aW9uKGYsZyxoKXtpZihnPWd8fGYubmFtZXx8XCJkb3dubG9hZFwiLFwic3RyaW5nXCIhPXR5cGVvZiBmKW5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGIoZixoKSxnKTtlbHNlIGlmKGQoZikpYyhmLGcsaCk7ZWxzZXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtpLmhyZWY9ZixpLnRhcmdldD1cIl9ibGFua1wiLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKGkpfSl9fTpmdW5jdGlvbihiLGQsZSxnKXtpZihnPWd8fG9wZW4oXCJcIixcIl9ibGFua1wiKSxnJiYoZy5kb2N1bWVudC50aXRsZT1nLmRvY3VtZW50LmJvZHkuaW5uZXJUZXh0PVwiZG93bmxvYWRpbmcuLi5cIiksXCJzdHJpbmdcIj09dHlwZW9mIGIpcmV0dXJuIGMoYixkLGUpO3ZhciBoPVwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCI9PT1iLnR5cGUsaT0vY29uc3RydWN0b3IvaS50ZXN0KGYuSFRNTEVsZW1lbnQpfHxmLnNhZmFyaSxqPS9DcmlPU1xcL1tcXGRdKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigoanx8aCYmaXx8YSkmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBGaWxlUmVhZGVyKXt2YXIgaz1uZXcgRmlsZVJlYWRlcjtrLm9ubG9hZGVuZD1mdW5jdGlvbigpe3ZhciBhPWsucmVzdWx0O2E9aj9hOmEucmVwbGFjZSgvXmRhdGE6W147XSo7LyxcImRhdGE6YXR0YWNobWVudC9maWxlO1wiKSxnP2cubG9jYXRpb24uaHJlZj1hOmxvY2F0aW9uPWEsZz1udWxsfSxrLnJlYWRBc0RhdGFVUkwoYil9ZWxzZXt2YXIgbD1mLlVSTHx8Zi53ZWJraXRVUkwsbT1sLmNyZWF0ZU9iamVjdFVSTChiKTtnP2cubG9jYXRpb249bTpsb2NhdGlvbi5ocmVmPW0sZz1udWxsLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtsLnJldm9rZU9iamVjdFVSTChtKX0sNEU0KX19KTtmLnNhdmVBcz1nLnNhdmVBcz1nLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJihtb2R1bGUuZXhwb3J0cz1nKX0pO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxlU2F2ZXIubWluLmpzLm1hcCIsImV4cG9ydCB2YXIgZm9jdXNPbiA9IGZ1bmN0aW9uICh0YXJnZXQsIGZvY3VzT3B0aW9ucykge1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIC8vIG5vdCBjbGVhciBob3csIGJ1dCBpcyBwb3NzaWJsZSBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L2ZvY3VzLWxvY2svaXNzdWVzLzUzXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCdmb2N1cycgaW4gdGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5mb2N1cyhmb2N1c09wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoJ2NvbnRlbnRXaW5kb3cnIGluIHRhcmdldCAmJiB0YXJnZXQuY29udGVudFdpbmRvdykge1xuICAgICAgICB0YXJnZXQuY29udGVudFdpbmRvdy5mb2N1cygpO1xuICAgIH1cbn07XG4iLCIvKipcbiAqIGRlZmluZXMgYSBmb2N1cyBncm91cFxuICovXG5leHBvcnQgdmFyIEZPQ1VTX0dST1VQID0gJ2RhdGEtZm9jdXMtbG9jayc7XG4vKipcbiAqIGRpc2FibGVzIGVsZW1lbnQgZGlzY292ZXJ5IGluc2lkZSBhIGdyb3VwIG1hcmtlZCBieSBrZXlcbiAqL1xuZXhwb3J0IHZhciBGT0NVU19ESVNBQkxFRCA9ICdkYXRhLWZvY3VzLWxvY2stZGlzYWJsZWQnO1xuLyoqXG4gKiBhbGxvd3MgdW5jb250cm9sbGVkIGZvY3VzIHdpdGhpbiB0aGUgbWFya2VkIGFyZWEsIGVmZmVjdGl2ZWx5IGRpc2FibGluZyBmb2N1cyBsb2NrIGZvciBpdCdzIGNvbnRlbnRcbiAqL1xuZXhwb3J0IHZhciBGT0NVU19BTExPVyA9ICdkYXRhLW5vLWZvY3VzLWxvY2snO1xuLyoqXG4gKiBpbnN0cnVjdHMgYXV0b2ZvY3VzIGVuZ2luZSB0byBwaWNrIGRlZmF1bHQgYXV0b2ZvY3VzIGluc2lkZSBhIGdpdmVuIG5vZGVcbiAqIGNhbiBiZSBzZXQgb24gdGhlIGVsZW1lbnQgb3IgY29udGFpbmVyXG4gKi9cbmV4cG9ydCB2YXIgRk9DVVNfQVVUTyA9ICdkYXRhLWF1dG9mb2N1cy1pbnNpZGUnO1xuLyoqXG4gKiBpbnN0cnVjdHMgYXV0b2ZvY3VzIHRvIGlnbm9yZSBlbGVtZW50cyB3aXRoaW4gYSBnaXZlbiBub2RlXG4gKiBjYW4gYmUgc2V0IG9uIHRoZSBlbGVtZW50IG9yIGNvbnRhaW5lclxuICovXG5leHBvcnQgdmFyIEZPQ1VTX05PX0FVVE9GT0NVUyA9ICdkYXRhLW5vLWF1dG9mb2N1cyc7XG4iLCJpbXBvcnQgeyBjb250YWlucyB9IGZyb20gJy4vdXRpbHMvRE9NdXRpbHMnO1xuaW1wb3J0IHsgZ2V0QWxsQWZmZWN0ZWROb2RlcyB9IGZyb20gJy4vdXRpbHMvYWxsLWFmZmVjdGVkJztcbmltcG9ydCB7IGdldEZpcnN0LCB0b0FycmF5IH0gZnJvbSAnLi91dGlscy9hcnJheSc7XG5pbXBvcnQgeyBnZXRBY3RpdmVFbGVtZW50IH0gZnJvbSAnLi91dGlscy9nZXRBY3RpdmVFbGVtZW50JztcbnZhciBmb2N1c0luRnJhbWUgPSBmdW5jdGlvbiAoZnJhbWUsIGFjdGl2ZUVsZW1lbnQpIHsgcmV0dXJuIGZyYW1lID09PSBhY3RpdmVFbGVtZW50OyB9O1xudmFyIGZvY3VzSW5zaWRlSWZyYW1lID0gZnVuY3Rpb24gKHRvcE5vZGUsIGFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0b0FycmF5KHRvcE5vZGUucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJykpLnNvbWUoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGZvY3VzSW5GcmFtZShub2RlLCBhY3RpdmVFbGVtZW50KTsgfSkpO1xufTtcbi8qKlxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUsIGlmIHRoZSBjdXJyZW50IGZvY3VzIGlzIGluc2lkZSBnaXZlbiBub2RlIG9yIG5vZGVzLlxuICogU3VwcG9ydHMgbm9kZXMgaGlkZGVuIGluc2lkZSBzaGFkb3dEb21cbiAqL1xuZXhwb3J0IHZhciBmb2N1c0luc2lkZSA9IGZ1bmN0aW9uICh0b3BOb2RlLCBhY3RpdmVFbGVtZW50KSB7XG4gICAgLy8gY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50ICYmIGdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICBpZiAoYWN0aXZlRWxlbWVudCA9PT0gdm9pZCAwKSB7IGFjdGl2ZUVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KGdldEZpcnN0KHRvcE5vZGUpLm93bmVyRG9jdW1lbnQpOyB9XG4gICAgaWYgKCFhY3RpdmVFbGVtZW50IHx8IChhY3RpdmVFbGVtZW50LmRhdGFzZXQgJiYgYWN0aXZlRWxlbWVudC5kYXRhc2V0LmZvY3VzR3VhcmQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEFsbEFmZmVjdGVkTm9kZXModG9wTm9kZSkuc29tZShmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gY29udGFpbnMobm9kZSwgYWN0aXZlRWxlbWVudCkgfHwgZm9jdXNJbnNpZGVJZnJhbWUobm9kZSwgYWN0aXZlRWxlbWVudCk7XG4gICAgfSk7XG59O1xuIiwiaW1wb3J0IHsgRk9DVVNfQUxMT1cgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBjb250YWlucyB9IGZyb20gJy4vdXRpbHMvRE9NdXRpbHMnO1xuaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gJy4vdXRpbHMvYXJyYXknO1xuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudCB9IGZyb20gJy4vdXRpbHMvZ2V0QWN0aXZlRWxlbWVudCc7XG4vKipcbiAqIGNoZWNrcyBpZiBmb2N1cyBpcyBoaWRkZW4gRlJPTSB0aGUgZm9jdXMtbG9ja1xuICogaWUgY29udGFpbmVkIGluc2lkZSBhIG5vZGUgZm9jdXMtbG9jayBzaGFsbCBpZ25vcmVcbiAqXG4gKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBjb3VwbGVkIHdpdGgge0BsaW5rIEZPQ1VTX0FMTE9XfSBjb25zdGFudFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBmb2N1cyBpcyBjdXJyZW50bHkgaXMgaW4gXCJhbGxvd1wiIGFyZWFcbiAqL1xuZXhwb3J0IHZhciBmb2N1c0lzSGlkZGVuID0gZnVuY3Rpb24gKGluRG9jdW1lbnQpIHtcbiAgICBpZiAoaW5Eb2N1bWVudCA9PT0gdm9pZCAwKSB7IGluRG9jdW1lbnQgPSBkb2N1bWVudDsgfVxuICAgIHZhciBhY3RpdmVFbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudChpbkRvY3VtZW50KTtcbiAgICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyB0aGlzIGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyBGT0NVU19BTExPVyB3aXRoaW4gc2hhZG93IGRvbVxuICAgIHJldHVybiB0b0FycmF5KGluRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltcIi5jb25jYXQoRk9DVVNfQUxMT1csIFwiXVwiKSkpLnNvbWUoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGNvbnRhaW5zKG5vZGUsIGFjdGl2ZUVsZW1lbnQpOyB9KTtcbn07XG4iLCJpbXBvcnQgeyBORVdfRk9DVVMsIG5ld0ZvY3VzIH0gZnJvbSAnLi9zb2x2ZXInO1xuaW1wb3J0IHsgZ2V0Rm9jdXNhYmxlTm9kZXMgfSBmcm9tICcuL3V0aWxzL0RPTXV0aWxzJztcbmltcG9ydCB7IGdldEFsbEFmZmVjdGVkTm9kZXMgfSBmcm9tICcuL3V0aWxzL2FsbC1hZmZlY3RlZCc7XG5pbXBvcnQgeyBhc0FycmF5LCBnZXRGaXJzdCB9IGZyb20gJy4vdXRpbHMvYXJyYXknO1xuaW1wb3J0IHsgcGlja0F1dG9mb2N1cyB9IGZyb20gJy4vdXRpbHMvYXV0by1mb2N1cyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVFbGVtZW50IH0gZnJvbSAnLi91dGlscy9nZXRBY3RpdmVFbGVtZW50JztcbmltcG9ydCB7IGlzRGVmaW5lZCwgaXNOb3RBR3VhcmQgfSBmcm9tICcuL3V0aWxzL2lzJztcbmltcG9ydCB7IGFsbFBhcmVudEF1dG9mb2N1c2FibGVzLCBnZXRUb3BDb21tb25QYXJlbnQgfSBmcm9tICcuL3V0aWxzL3BhcmVudGluZyc7XG52YXIgcmVvcmRlck5vZGVzID0gZnVuY3Rpb24gKHNyY05vZGVzLCBkc3ROb2Rlcykge1xuICAgIHZhciByZW1hcCA9IG5ldyBNYXAoKTtcbiAgICAvLyBubyBTZXQoZHN0Tm9kZXMpIGZvciBJRTExIDooXG4gICAgZHN0Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5KSB7IHJldHVybiByZW1hcC5zZXQoZW50aXR5Lm5vZGUsIGVudGl0eSk7IH0pO1xuICAgIC8vIHJlbWFwIHRvIGRzdE5vZGVzXG4gICAgcmV0dXJuIHNyY05vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gcmVtYXAuZ2V0KG5vZGUpOyB9KS5maWx0ZXIoaXNEZWZpbmVkKTtcbn07XG4vKipcbiAqIGNvbnRhaW5zIHRoZSBtYWluIGxvZ2ljIG9mIHRoZSBgZm9jdXMtbG9ja2AgcGFja2FnZS5cbiAqXG4gKiAhIHlvdSBwcm9iYWJseSBkb250IG5lZWQgdGhpcyBmdW5jdGlvbiAhXG4gKlxuICogZ2l2ZW4gdG9wIG5vZGUocykgYW5kIHRoZSBsYXN0IGFjdGl2ZSBlbGVtZW50IHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYmUgZm9jdXNlZCBuZXh0XG4gKiBAcmV0dXJucyBlbGVtZW50IHdoaWNoIHNob3VsZCBiZSBmb2N1c2VkIHRvIG1vdmUgZm9jdXMgaW5zaWRlXG4gKiBAcGFyYW0gdG9wTm9kZVxuICogQHBhcmFtIGxhc3ROb2RlXG4gKi9cbmV4cG9ydCB2YXIgZm9jdXNTb2x2ZXIgPSBmdW5jdGlvbiAodG9wTm9kZSwgbGFzdE5vZGUpIHtcbiAgICB2YXIgYWN0aXZlRWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoYXNBcnJheSh0b3BOb2RlKS5sZW5ndGggPiAwID8gZG9jdW1lbnQgOiBnZXRGaXJzdCh0b3BOb2RlKS5vd25lckRvY3VtZW50KTtcbiAgICB2YXIgZW50cmllcyA9IGdldEFsbEFmZmVjdGVkTm9kZXModG9wTm9kZSkuZmlsdGVyKGlzTm90QUd1YXJkKTtcbiAgICB2YXIgY29tbW9uUGFyZW50ID0gZ2V0VG9wQ29tbW9uUGFyZW50KGFjdGl2ZUVsZW1lbnQgfHwgdG9wTm9kZSwgdG9wTm9kZSwgZW50cmllcyk7XG4gICAgdmFyIHZpc2liaWxpdHlDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB2YXIgYW55Rm9jdXNhYmxlID0gZ2V0Rm9jdXNhYmxlTm9kZXMoZW50cmllcywgdmlzaWJpbGl0eUNhY2hlKTtcbiAgICB2YXIgaW5uZXJFbGVtZW50cyA9IGFueUZvY3VzYWJsZS5maWx0ZXIoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIGlzTm90QUd1YXJkKG5vZGUpO1xuICAgIH0pO1xuICAgIGlmICghaW5uZXJFbGVtZW50c1swXSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgb3V0ZXJOb2RlcyA9IGdldEZvY3VzYWJsZU5vZGVzKFtjb21tb25QYXJlbnRdLCB2aXNpYmlsaXR5Q2FjaGUpLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBfYS5ub2RlO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcbiAgICB2YXIgb3JkZXJlZElubmVyRWxlbWVudHMgPSByZW9yZGVyTm9kZXMob3V0ZXJOb2RlcywgaW5uZXJFbGVtZW50cyk7XG4gICAgLy8gY29sbGVjdCBpbm5lciBmb2N1c2FibGUgYW5kIHNlcGFyYXRlbHkgdGFiYmFibGVzXG4gICAgdmFyIGlubmVyRm9jdXNhYmxlcyA9IG9yZGVyZWRJbm5lckVsZW1lbnRzLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBfYS5ub2RlO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcbiAgICB2YXIgaW5uZXJUYWJiYWJsZSA9IG9yZGVyZWRJbm5lckVsZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIHRhYkluZGV4ID0gX2EudGFiSW5kZXg7XG4gICAgICAgIHJldHVybiB0YWJJbmRleCA+PSAwO1xuICAgIH0pLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBfYS5ub2RlO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcbiAgICB2YXIgbmV3SWQgPSBuZXdGb2N1cyhpbm5lckZvY3VzYWJsZXMsIGlubmVyVGFiYmFibGUsIG91dGVyTm9kZXMsIGFjdGl2ZUVsZW1lbnQsIGxhc3ROb2RlKTtcbiAgICBpZiAobmV3SWQgPT09IE5FV19GT0NVUykge1xuICAgICAgICB2YXIgZm9jdXNOb2RlID0gXG4gICAgICAgIC8vIGZpcnN0IHRyeSBvbmx5IHRhYmJhYmxlLCBhbmQgdGhlIGZhbGxiYWNrIHRvIGFsbCBmb2N1c2FibGUsIGFzIGxvbmcgYXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQgc2hvdWxkIGJlIHBpY2tlZCBmb3IgZm9jdXNcbiAgICAgICAgcGlja0F1dG9mb2N1cyhhbnlGb2N1c2FibGUsIGlubmVyVGFiYmFibGUsIGFsbFBhcmVudEF1dG9mb2N1c2FibGVzKGVudHJpZXMsIHZpc2liaWxpdHlDYWNoZSkpIHx8XG4gICAgICAgICAgICBwaWNrQXV0b2ZvY3VzKGFueUZvY3VzYWJsZSwgaW5uZXJGb2N1c2FibGVzLCBhbGxQYXJlbnRBdXRvZm9jdXNhYmxlcyhlbnRyaWVzLCB2aXNpYmlsaXR5Q2FjaGUpKTtcbiAgICAgICAgaWYgKGZvY3VzTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogZm9jdXNOb2RlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ2ZvY3VzLWxvY2s6IGNhbm5vdCBmaW5kIGFueSBub2RlIHRvIG1vdmUgZm9jdXMgaW50bycpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobmV3SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbmV3SWQ7XG4gICAgfVxuICAgIHJldHVybiBvcmRlcmVkSW5uZXJFbGVtZW50c1tuZXdJZF07XG59O1xuIiwiaW1wb3J0IHsgZ2V0QWxsQWZmZWN0ZWROb2RlcyB9IGZyb20gJy4vdXRpbHMvYWxsLWFmZmVjdGVkJztcbmltcG9ydCB7IGlzR3VhcmQsIGlzTm90QUd1YXJkIH0gZnJvbSAnLi91dGlscy9pcyc7XG5pbXBvcnQgeyBnZXRUb3BDb21tb25QYXJlbnQgfSBmcm9tICcuL3V0aWxzL3BhcmVudGluZyc7XG5pbXBvcnQgeyBvcmRlckJ5VGFiSW5kZXggfSBmcm9tICcuL3V0aWxzL3RhYk9yZGVyJztcbmltcG9ydCB7IGdldEZvY3VzYWJsZXMgfSBmcm9tICcuL3V0aWxzL3RhYlV0aWxzJztcbi8qKlxuICogdHJhdmVyc2VzIGFsbCByZWxhdGVkIG5vZGVzIChpbmNsdWRpbmcgZ3JvdXBzKSByZXR1cm5pbmcgYSBsaXN0IG9mIGFsbCBub2RlcyhvdXRlciBhbmQgaW50ZXJuYWwpIHdpdGggbWV0YSBpbmZvcm1hdGlvblxuICogVGhpcyBpcyBsb3ctbGV2ZWwgQVBJIVxuICogQHJldHVybnMgbGlzdCBvZiBmb2N1c2FibGUgZWxlbWVudHMgaW5zaWRlIGEgZ2l2ZW4gdG9wKCEpIG5vZGUuXG4gKiBAc2VlIHtAbGluayBnZXRGb2N1c2FibGVOb2Rlc30gcHJvdmlkaW5nIGEgc2ltcGxlciBBUElcbiAqL1xuZXhwb3J0IHZhciBleHBhbmRGb2N1c2FibGVOb2RlcyA9IGZ1bmN0aW9uICh0b3BOb2RlKSB7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRBbGxBZmZlY3RlZE5vZGVzKHRvcE5vZGUpLmZpbHRlcihpc05vdEFHdWFyZCk7XG4gICAgdmFyIGNvbW1vblBhcmVudCA9IGdldFRvcENvbW1vblBhcmVudCh0b3BOb2RlLCB0b3BOb2RlLCBlbnRyaWVzKTtcbiAgICB2YXIgb3V0ZXJOb2RlcyA9IG9yZGVyQnlUYWJJbmRleChnZXRGb2N1c2FibGVzKFtjb21tb25QYXJlbnRdLCB0cnVlKSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgdmFyIGlubmVyRWxlbWVudHMgPSBnZXRGb2N1c2FibGVzKGVudHJpZXMsIGZhbHNlKTtcbiAgICByZXR1cm4gb3V0ZXJOb2Rlcy5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZSwgaW5kZXggPSBfYS5pbmRleDtcbiAgICAgICAgcmV0dXJuICh7XG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgbG9ja0l0ZW06IGlubmVyRWxlbWVudHMuaW5kZXhPZihub2RlKSA+PSAwLFxuICAgICAgICAgICAgZ3VhcmQ6IGlzR3VhcmQobm9kZSksXG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbiIsImltcG9ydCB7IGZvY3VzT24gfSBmcm9tICcuL2NvbW1hbmRzJztcbmltcG9ydCB7IGZvY3VzU29sdmVyIH0gZnJvbSAnLi9mb2N1c1NvbHZlcic7XG52YXIgZ3VhcmRDb3VudCA9IDA7XG52YXIgbG9ja0Rpc2FibGVkID0gZmFsc2U7XG4vKipcbiAqIFRoZSBtYWluIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGZvY3VzLWxvY2sgcGFja2FnZVxuICpcbiAqIENvbnRhaW5zIGZvY3VzIGF0IGEgZ2l2ZW4gbm9kZS5cbiAqIFRoZSBsYXN0IGZvY3VzZWQgZWxlbWVudCB3aWxsIGhlbHAgdG8gZGV0ZXJtaW5lIHdoaWNoIGVsZW1lbnQoZmlyc3Qgb3IgbGFzdCkgc2hvdWxkIGJlIGZvY3VzZWQuXG4gKiBUaGUgZm91bmQgZWxlbWVudCB3aWxsIGJlIGZvY3VzZWQuXG4gKlxuICogVGhpcyBpcyBvbmUgdGltZSBhY3Rpb24gKG1vdmUpLCBub3QgYSBwZXJzaXN0ZW50IGZvY3VzLWxvY2tcbiAqXG4gKiBIVE1MIG1hcmtlcnMgKHNlZSB7QGxpbmsgaW1wb3J0KCcuL2NvbnN0YW50cycpLkZPQ1VTX0FVVE99IGNvbnN0YW50cykgY2FuIGNvbnRyb2wgYXV0b2ZvY3VzXG4gKiBAc2VlIHtAbGluayBmb2N1c1NvbHZlcn0gZm9yIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCBhdXRvZm9jdXNcbiAqL1xuZXhwb3J0IHZhciBtb3ZlRm9jdXNJbnNpZGUgPSBmdW5jdGlvbiAodG9wTm9kZSwgbGFzdE5vZGUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHZhciBmb2N1c2FibGUgPSBmb2N1c1NvbHZlcih0b3BOb2RlLCBsYXN0Tm9kZSk7XG4gICAgLy8gZ2xvYmFsIGxvY2FsIHNpZGUgZWZmZWN0IHRvIGNvdW50YWluIHJlY3Vyc2l2ZSBsb2NrIGFjdGl2YXRpb24gYW5kIHJlc29sdmUgZm9jdXMtZmlnaHRpbmdcbiAgICBpZiAobG9ja0Rpc2FibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGZvY3VzYWJsZSkge1xuICAgICAgICAvKiogK0ZPQ1VTLUZJR0hUSU5HIHByZXZlbnRpb24gKiovXG4gICAgICAgIGlmIChndWFyZENvdW50ID4gMikge1xuICAgICAgICAgICAgLy8gd2UgaGF2ZSByZWN1cnNpdmUgZW50ZXJlZCBiYWNrIHRoZSBsb2NrIGFjdGl2YXRpb25cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZvY3VzTG9jazogZm9jdXMtZmlnaHRpbmcgZGV0ZWN0ZWQuIE9ubHkgb25lIGZvY3VzIG1hbmFnZW1lbnQgc3lzdGVtIGNvdWxkIGJlIGFjdGl2ZS4gJyArXG4gICAgICAgICAgICAgICAgJ1NlZSBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L2ZvY3VzLWxvY2svI2ZvY3VzLWZpZ2h0aW5nJyk7XG4gICAgICAgICAgICBsb2NrRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbG9ja0Rpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAxKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBndWFyZENvdW50Kys7XG4gICAgICAgIGZvY3VzT24oZm9jdXNhYmxlLm5vZGUsIG9wdGlvbnMuZm9jdXNPcHRpb25zKTtcbiAgICAgICAgZ3VhcmRDb3VudC0tO1xuICAgIH1cbn07XG4iLCJpbXBvcnQgeyBnZXRUYWJiYWJsZU5vZGVzIH0gZnJvbSAnLi91dGlscy9ET011dGlscyc7XG5mdW5jdGlvbiB3ZWFrUmVmKHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgLy8gIzY4IFNhZmFyaSAxNC4xIGRvbnQgaGF2ZSBpdCB5ZXRcbiAgICAvLyBGSVhNRTogcmVtb3ZlIGluIDIwMjVcbiAgICBpZiAodHlwZW9mIFdlYWtSZWYgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWx1ZSB8fCBudWxsOyB9O1xuICAgIH1cbiAgICB2YXIgdyA9IHZhbHVlID8gbmV3IFdlYWtSZWYodmFsdWUpIDogbnVsbDtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHcgPT09IG51bGwgfHwgdyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdy5kZXJlZigpKSB8fCBudWxsOyB9O1xufVxuZXhwb3J0IHZhciByZWNvcmRFbGVtZW50TG9jYXRpb24gPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHN0YWNrID0gW107XG4gICAgdmFyIGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBjdXJyZW50OiB3ZWFrUmVmKGN1cnJlbnRFbGVtZW50KSxcbiAgICAgICAgICAgIHBhcmVudDogd2Vha1JlZihjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50KSxcbiAgICAgICAgICAgIGxlZnQ6IHdlYWtSZWYoY3VycmVudEVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyksXG4gICAgICAgICAgICByaWdodDogd2Vha1JlZihjdXJyZW50RWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpLFxuICAgICAgICB9KTtcbiAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBlbGVtZW50OiB3ZWFrUmVmKGVsZW1lbnQpLFxuICAgICAgICBzdGFjazogc3RhY2ssXG4gICAgICAgIG93bmVyRG9jdW1lbnQ6IGVsZW1lbnQub3duZXJEb2N1bWVudCxcbiAgICB9O1xufTtcbnZhciByZXN0b3JlRm9jdXNUbyA9IGZ1bmN0aW9uIChsb2NhdGlvbikge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgaWYgKCFsb2NhdGlvbikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgc3RhY2sgPSBsb2NhdGlvbi5zdGFjaywgb3duZXJEb2N1bWVudCA9IGxvY2F0aW9uLm93bmVyRG9jdW1lbnQ7XG4gICAgdmFyIHZpc2liaWxpdHlDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIHN0YWNrXzEgPSBzdGFjazsgX2kgPCBzdGFja18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgbGluZSA9IHN0YWNrXzFbX2ldO1xuICAgICAgICB2YXIgcGFyZW50XzEgPSAoX2EgPSBsaW5lLnBhcmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwobGluZSk7XG4gICAgICAgIC8vIGlzIGl0IHN0aWxsIGhlcmU/XG4gICAgICAgIGlmIChwYXJlbnRfMSAmJiBvd25lckRvY3VtZW50LmNvbnRhaW5zKHBhcmVudF8xKSkge1xuICAgICAgICAgICAgdmFyIGxlZnQgPSAoX2IgPSBsaW5lLmxlZnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKGxpbmUpO1xuICAgICAgICAgICAgdmFyIHNhdmVkQ3VycmVudCA9IGxpbmUuY3VycmVudCgpO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBwYXJlbnRfMS5jb250YWlucyhzYXZlZEN1cnJlbnQpID8gc2F2ZWRDdXJyZW50IDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gKF9jID0gbGluZS5yaWdodCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNhbGwobGluZSk7XG4gICAgICAgICAgICB2YXIgZm9jdXNhYmxlcyA9IGdldFRhYmJhYmxlTm9kZXMoW3BhcmVudF8xXSwgdmlzaWJpbGl0eUNhY2hlKTtcbiAgICAgICAgICAgIHZhciBhaW0gPSBcbiAgICAgICAgICAgIC8vIHRoYXQgaXMgZWxlbWVudCBpdHNlbGZcbiAgICAgICAgICAgIChfZSA9IChfZCA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudCAhPT0gdm9pZCAwID8gY3VycmVudCA6IFxuICAgICAgICAgICAgLy8gb3Igc29tZXRoaW5nIGluIGl0J3MgcGxhY2VcbiAgICAgICAgICAgIGxlZnQgPT09IG51bGwgfHwgbGVmdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGVmdC5uZXh0RWxlbWVudFNpYmxpbmcpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFxuICAgICAgICAgICAgLy8gb3Igc29tZWJvZHkgdG8gdGhlIHJpZ2h0LCBzdGlsbCBjbG9zZSBlbm91Z2hcbiAgICAgICAgICAgIHJpZ2h0KSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBcbiAgICAgICAgICAgIC8vIG9yIHNvbWVib2R5IHRvIHRoZSBsZWZ0LCBzb21ldGhpbmc/XG4gICAgICAgICAgICBsZWZ0O1xuICAgICAgICAgICAgd2hpbGUgKGFpbSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9mID0gMCwgZm9jdXNhYmxlc18xID0gZm9jdXNhYmxlczsgX2YgPCBmb2N1c2FibGVzXzEubGVuZ3RoOyBfZisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmb2N1c2FibGUgPSBmb2N1c2FibGVzXzFbX2ZdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWltID09PSBudWxsIHx8IGFpbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWltLmNvbnRhaW5zKGZvY3VzYWJsZS5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzYWJsZS5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFpbSA9IGFpbS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBwYXJlbnQgY29udGFpbnMgYSBmb2N1c2FibGUgLSBtb3ZlIHRoZXJlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzYWJsZXNbMF0ubm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBub3RoaW5nIG1hdGNoZWRcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbi8qKlxuICogQ2FwdHVyZXMgdGhlIGN1cnJlbnQgZm9jdXNlZCBlbGVtZW50IHRvIHJlc3RvcmUgZm9jdXMgYXMgY2xvc2UgYXMgcG9zc2libGUgaW4gdGhlIGZ1dHVyZVxuICogSGFuZGxlcyBzaXR1YXRpb25zIHdoZXJlIHRoZSBmb2N1c2VkIGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gb3Igbm8gbG9uZ2VyIGZvY3VzYWJsZVxuICogbW92aW5nIGZvY3VzIHRvIHRoZSBjbG9zZXN0IGZvY3VzYWJsZSBlbGVtZW50XG4gKiBAcGFyYW0gdGFyZ2V0RWxlbWVudCAtIGVsZW1lbnQgd2hlcmUgZm9jdXMgc2hvdWxkIGJlIHJlc3RvcmVkXG4gKiBAcmV0dXJucyBhIGZ1bmN0aW9uIHJldHVybmluZyBhIG5ldyBlbGVtZW50IHRvIGZvY3VzXG4gKi9cbmV4cG9ydCB2YXIgY2FwdHVyZUZvY3VzUmVzdG9yZSA9IGZ1bmN0aW9uICh0YXJnZXRFbGVtZW50KSB7XG4gICAgdmFyIGxvY2F0aW9uID0gcmVjb3JkRWxlbWVudExvY2F0aW9uKHRhcmdldEVsZW1lbnQpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiByZXN0b3JlRm9jdXNUbyhsb2NhdGlvbik7XG4gICAgfTtcbn07XG4iLCJpbXBvcnQgeyBmb2N1c09uIH0gZnJvbSAnLi9jb21tYW5kcyc7XG5pbXBvcnQgeyBnZXRUYWJiYWJsZU5vZGVzLCBjb250YWlucywgZ2V0Rm9jdXNhYmxlTm9kZXMgfSBmcm9tICcuL3V0aWxzL0RPTXV0aWxzJztcbmltcG9ydCB7IGFzQXJyYXkgfSBmcm9tICcuL3V0aWxzL2FycmF5Jztcbi8qKlxuICogZm9yIGEgZ2l2ZW4gYGVsZW1lbnRgIGluIGEgZ2l2ZW4gYHNjb3BlYCByZXR1cm5zIGZvY3VzYWJsZSBzaWJsaW5nc1xuICogQHBhcmFtIGVsZW1lbnQgLSBiYXNlIGVsZW1lbnRcbiAqIEBwYXJhbSBzY29wZSAtIGNvbW1vbiBwYXJlbnQuIENhbiBiZSBkb2N1bWVudCwgYnV0IGJldHRlciB0byBuYXJyb3cgaXQgZG93biBmb3IgcGVyZm9ybWFuY2UgcmVhc29uc1xuICogQHJldHVybnMge3ByZXYsbmV4dH0gLSByZWZlcmVuY2VzIHRvIGEgZm9jdXNhYmxlIGVsZW1lbnQgYmVmb3JlIGFuZCBhZnRlclxuICogQHJldHVybnMgdW5kZWZpbmVkIC0gaWYgb3BlcmF0aW9uIGlzIG5vdCBhcHBsaWNhYmxlXG4gKi9cbmV4cG9ydCB2YXIgZ2V0UmVsYXRpdmVGb2N1c2FibGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgc2NvcGUsIHVzZVRhYmJhYmxlcykge1xuICAgIGlmICghZWxlbWVudCB8fCAhc2NvcGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignbm8gZWxlbWVudCBvciBzY29wZSBnaXZlbicpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHZhciBzaGFyZHMgPSBhc0FycmF5KHNjb3BlKTtcbiAgICBpZiAoc2hhcmRzLmV2ZXJ5KGZ1bmN0aW9uIChzaGFyZCkgeyByZXR1cm4gIWNvbnRhaW5zKHNoYXJkLCBlbGVtZW50KTsgfSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQWN0aXZlIGVsZW1lbnQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgc2NvcGUnKTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICB2YXIgZm9jdXNhYmxlcyA9IHVzZVRhYmJhYmxlc1xuICAgICAgICA/IGdldFRhYmJhYmxlTm9kZXMoc2hhcmRzLCBuZXcgTWFwKCkpXG4gICAgICAgIDogZ2V0Rm9jdXNhYmxlTm9kZXMoc2hhcmRzLCBuZXcgTWFwKCkpO1xuICAgIHZhciBjdXJyZW50ID0gZm9jdXNhYmxlcy5maW5kSW5kZXgoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGUgPT09IGVsZW1lbnQ7XG4gICAgfSk7XG4gICAgaWYgKGN1cnJlbnQgPT09IC0xKSB7XG4gICAgICAgIC8vIGFuIGVkZ2UgY2FzZSwgd2hlbiBhbmNob3IgZWxlbWVudCBpcyBub3QgZm91bmRcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJldjogZm9jdXNhYmxlc1tjdXJyZW50IC0gMV0sXG4gICAgICAgIG5leHQ6IGZvY3VzYWJsZXNbY3VycmVudCArIDFdLFxuICAgICAgICBmaXJzdDogZm9jdXNhYmxlc1swXSxcbiAgICAgICAgbGFzdDogZm9jdXNhYmxlc1tmb2N1c2FibGVzLmxlbmd0aCAtIDFdLFxuICAgIH07XG59O1xudmFyIGdldEJvdW5kYXJ5ID0gZnVuY3Rpb24gKHNoYXJkcywgdXNlVGFiYmFibGVzKSB7XG4gICAgdmFyIHNldCA9IHVzZVRhYmJhYmxlc1xuICAgICAgICA/IGdldFRhYmJhYmxlTm9kZXMoYXNBcnJheShzaGFyZHMpLCBuZXcgTWFwKCkpXG4gICAgICAgIDogZ2V0Rm9jdXNhYmxlTm9kZXMoYXNBcnJheShzaGFyZHMpLCBuZXcgTWFwKCkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGZpcnN0OiBzZXRbMF0sXG4gICAgICAgIGxhc3Q6IHNldFtzZXQubGVuZ3RoIC0gMV0sXG4gICAgfTtcbn07XG52YXIgZGVmYXVsdE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgc2NvcGU6IGRvY3VtZW50LmJvZHksXG4gICAgICAgIGN5Y2xlOiB0cnVlLFxuICAgICAgICBvbmx5VGFiYmFibGU6IHRydWUsXG4gICAgfSwgb3B0aW9ucyk7XG59O1xudmFyIG1vdmVGb2N1cyA9IGZ1bmN0aW9uIChmcm9tRWxlbWVudCwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHZhciBuZXdPcHRpb25zID0gZGVmYXVsdE9wdGlvbnMob3B0aW9ucyk7XG4gICAgdmFyIHNvbHV0aW9uID0gZ2V0UmVsYXRpdmVGb2N1c2FibGUoZnJvbUVsZW1lbnQsIG5ld09wdGlvbnMuc2NvcGUsIG5ld09wdGlvbnMub25seVRhYmJhYmxlKTtcbiAgICBpZiAoIXNvbHV0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRhcmdldCA9IGNiKHNvbHV0aW9uLCBuZXdPcHRpb25zLmN5Y2xlKTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGZvY3VzT24odGFyZ2V0Lm5vZGUsIG5ld09wdGlvbnMuZm9jdXNPcHRpb25zKTtcbiAgICB9XG59O1xuLyoqXG4gKiBmb2N1c2VzIG5leHQgZWxlbWVudCBpbiB0aGUgdGFiLW9yZGVyXG4gKiBAcGFyYW0gZnJvbUVsZW1lbnQgLSBjb21tb24gcGFyZW50IHRvIHNjb3BlIGFjdGl2ZSBlbGVtZW50IHNlYXJjaCBvciB0YWIgY3ljbGUgb3JkZXJcbiAqIEBwYXJhbSB7Rm9jdXNOZXh0T3B0aW9uc30gW29wdGlvbnNdIC0gZm9jdXMgb3B0aW9uc1xuICovXG5leHBvcnQgdmFyIGZvY3VzTmV4dEVsZW1lbnQgPSBmdW5jdGlvbiAoZnJvbUVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIG1vdmVGb2N1cyhmcm9tRWxlbWVudCwgb3B0aW9ucywgZnVuY3Rpb24gKF9hLCBjeWNsZSkge1xuICAgICAgICB2YXIgbmV4dCA9IF9hLm5leHQsIGZpcnN0ID0gX2EuZmlyc3Q7XG4gICAgICAgIHJldHVybiBuZXh0IHx8IChjeWNsZSAmJiBmaXJzdCk7XG4gICAgfSk7XG59O1xuLyoqXG4gKiBmb2N1c2VzIHByZXYgZWxlbWVudCBpbiB0aGUgdGFiIG9yZGVyXG4gKiBAcGFyYW0gZnJvbUVsZW1lbnQgLSBjb21tb24gcGFyZW50IHRvIHNjb3BlIGFjdGl2ZSBlbGVtZW50IHNlYXJjaCBvciB0YWIgY3ljbGUgb3JkZXJcbiAqIEBwYXJhbSB7Rm9jdXNOZXh0T3B0aW9uc30gW29wdGlvbnNdIC0gZm9jdXMgb3B0aW9uc1xuICovXG5leHBvcnQgdmFyIGZvY3VzUHJldkVsZW1lbnQgPSBmdW5jdGlvbiAoZnJvbUVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIG1vdmVGb2N1cyhmcm9tRWxlbWVudCwgb3B0aW9ucywgZnVuY3Rpb24gKF9hLCBjeWNsZSkge1xuICAgICAgICB2YXIgcHJldiA9IF9hLnByZXYsIGxhc3QgPSBfYS5sYXN0O1xuICAgICAgICByZXR1cm4gcHJldiB8fCAoY3ljbGUgJiYgbGFzdCk7XG4gICAgfSk7XG59O1xudmFyIHBpY2tCb3VuZGFyeSA9IGZ1bmN0aW9uIChzY29wZSwgb3B0aW9ucywgd2hhdCkge1xuICAgIHZhciBfYTtcbiAgICB2YXIgYm91bmRhcnkgPSBnZXRCb3VuZGFyeShzY29wZSwgKF9hID0gb3B0aW9ucy5vbmx5VGFiYmFibGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRydWUpO1xuICAgIHZhciBub2RlID0gYm91bmRhcnlbd2hhdF07XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgICAgZm9jdXNPbihub2RlLm5vZGUsIG9wdGlvbnMuZm9jdXNPcHRpb25zKTtcbiAgICB9XG59O1xuLyoqXG4gKiBmb2N1c2VzIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHRhYi1vcmRlclxuICogQHBhcmFtIHtGb2N1c05leHRPcHRpb25zfSBvcHRpb25zIC0gZm9jdXMgb3B0aW9uc1xuICovXG5leHBvcnQgdmFyIGZvY3VzRmlyc3RFbGVtZW50ID0gZnVuY3Rpb24gKHNjb3BlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBwaWNrQm91bmRhcnkoc2NvcGUsIG9wdGlvbnMsICdmaXJzdCcpO1xufTtcbi8qKlxuICogZm9jdXNlcyBsYXN0IGVsZW1lbnQgaW4gdGhlIHRhYiBvcmRlclxuICogQHBhcmFtIHtGb2N1c05leHRPcHRpb25zfSBvcHRpb25zIC0gZm9jdXMgb3B0aW9uc1xuICovXG5leHBvcnQgdmFyIGZvY3VzTGFzdEVsZW1lbnQgPSBmdW5jdGlvbiAoc2NvcGUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHBpY2tCb3VuZGFyeShzY29wZSwgb3B0aW9ucywgJ2xhc3QnKTtcbn07XG4iLCJpbXBvcnQgeyBjb3JyZWN0Tm9kZXMgfSBmcm9tICcuL3V0aWxzL2NvcnJlY3RGb2N1cyc7XG5pbXBvcnQgeyBwaWNrRm9jdXNhYmxlIH0gZnJvbSAnLi91dGlscy9maXJzdEZvY3VzJztcbmltcG9ydCB7IGlzR3VhcmQgfSBmcm9tICcuL3V0aWxzL2lzJztcbmV4cG9ydCB2YXIgTkVXX0ZPQ1VTID0gJ05FV19GT0NVUyc7XG4vKipcbiAqIE1haW4gc29sdmVyIGZvciB0aGUgXCJmaW5kIG5leHQgZm9jdXNcIiBxdWVzdGlvblxuICogQHBhcmFtIGlubmVyTm9kZXMgLSB1c2VkIHRvIGNvbnRyb2wgXCJyZXR1cm4gZm9jdXNcIlxuICogQHBhcmFtIGlubmVyVGFiYmFibGVzIC0gdXNlZCB0byBjb250cm9sIFwiYXV0b2ZvY3VzXCJcbiAqIEBwYXJhbSBvdXRlck5vZGVzXG4gKiBAcGFyYW0gYWN0aXZlRWxlbWVudFxuICogQHBhcmFtIGxhc3ROb2RlXG4gKiBAcmV0dXJucyB7bnVtYmVyfHN0cmluZ3x1bmRlZmluZWR8Kn1cbiAqL1xuZXhwb3J0IHZhciBuZXdGb2N1cyA9IGZ1bmN0aW9uIChpbm5lck5vZGVzLCBpbm5lclRhYmJhYmxlcywgb3V0ZXJOb2RlcywgYWN0aXZlRWxlbWVudCwgbGFzdE5vZGUpIHtcbiAgICB2YXIgY250ID0gaW5uZXJOb2Rlcy5sZW5ndGg7XG4gICAgdmFyIGZpcnN0Rm9jdXMgPSBpbm5lck5vZGVzWzBdO1xuICAgIHZhciBsYXN0Rm9jdXMgPSBpbm5lck5vZGVzW2NudCAtIDFdO1xuICAgIHZhciBpc09uR3VhcmQgPSBpc0d1YXJkKGFjdGl2ZUVsZW1lbnQpO1xuICAgIC8vIGZvY3VzIGlzIGluc2lkZVxuICAgIGlmIChhY3RpdmVFbGVtZW50ICYmIGlubmVyTm9kZXMuaW5kZXhPZihhY3RpdmVFbGVtZW50KSA+PSAwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBhY3RpdmVJbmRleCA9IGFjdGl2ZUVsZW1lbnQgIT09IHVuZGVmaW5lZCA/IG91dGVyTm9kZXMuaW5kZXhPZihhY3RpdmVFbGVtZW50KSA6IC0xO1xuICAgIHZhciBsYXN0SW5kZXggPSBsYXN0Tm9kZSA/IG91dGVyTm9kZXMuaW5kZXhPZihsYXN0Tm9kZSkgOiBhY3RpdmVJbmRleDtcbiAgICB2YXIgbGFzdE5vZGVJbnNpZGUgPSBsYXN0Tm9kZSA/IGlubmVyTm9kZXMuaW5kZXhPZihsYXN0Tm9kZSkgOiAtMTtcbiAgICAvLyBubyBhY3RpdmUgZm9jdXMgKG9yIGZvY3VzIGlzIG9uIHRoZSBib2R5KVxuICAgIGlmIChhY3RpdmVJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgLy8ga25vd24gZmFsbGJhY2tcbiAgICAgICAgaWYgKGxhc3ROb2RlSW5zaWRlICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3ROb2RlSW5zaWRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBORVdfRk9DVVM7XG4gICAgfVxuICAgIC8vIG5ldyBmb2N1cywgbm90aGluZyB0byBjYWxjdWxhdGVcbiAgICBpZiAobGFzdE5vZGVJbnNpZGUgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBORVdfRk9DVVM7XG4gICAgfVxuICAgIHZhciBpbmRleERpZmYgPSBhY3RpdmVJbmRleCAtIGxhc3RJbmRleDtcbiAgICB2YXIgZmlyc3ROb2RlSW5kZXggPSBvdXRlck5vZGVzLmluZGV4T2YoZmlyc3RGb2N1cyk7XG4gICAgdmFyIGxhc3ROb2RlSW5kZXggPSBvdXRlck5vZGVzLmluZGV4T2YobGFzdEZvY3VzKTtcbiAgICB2YXIgY29ycmVjdGVkTm9kZXMgPSBjb3JyZWN0Tm9kZXMob3V0ZXJOb2Rlcyk7XG4gICAgdmFyIGNvcnJlY3RlZEluZGV4ID0gYWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gY29ycmVjdGVkTm9kZXMuaW5kZXhPZihhY3RpdmVFbGVtZW50KSA6IC0xO1xuICAgIHZhciBjb3JyZWN0ZWRJbmRleERpZmYgPSBjb3JyZWN0ZWRJbmRleCAtIChsYXN0Tm9kZSA/IGNvcnJlY3RlZE5vZGVzLmluZGV4T2YobGFzdE5vZGUpIDogYWN0aXZlSW5kZXgpO1xuICAgIC8vIG9sZCBmb2N1c1xuICAgIGlmICghaW5kZXhEaWZmICYmIGxhc3ROb2RlSW5zaWRlID49IDApIHtcbiAgICAgICAgcmV0dXJuIGxhc3ROb2RlSW5zaWRlO1xuICAgIH1cbiAgICAvLyBubyB0YWJiYWJsZSBlbGVtZW50cywgYXV0b2ZvY3VzIGlzIG5vdCBwb3NzaWJsZVxuICAgIGlmIChpbm5lclRhYmJhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gYW4gZWRnZSBjYXNlIHdpdGggbm8gdGFiYmFibGUgZWxlbWVudHNcbiAgICAgICAgLy8gcmV0dXJuIHRoZSBsYXN0IGZvY3VzYWJsZSBvbmVcbiAgICAgICAgLy8gd2l0aCBzb21lIHByb2JhYmlsaXR5IHRoaXMgd2lsbCBwcmV2ZW50IGZvY3VzIGZyb20gY3ljbGluZyBhY3Jvc3MgdGhlIGxvY2ssIGJ1dCB0aGVyZSBpcyBubyB0YWJiYWxlIGVsZW1lbnRzIHRvIGN5Y2xlIHRvXG4gICAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICB9XG4gICAgdmFyIHJldHVybkZpcnN0Tm9kZSA9IHBpY2tGb2N1c2FibGUoaW5uZXJOb2RlcywgaW5uZXJUYWJiYWJsZXNbMF0pO1xuICAgIHZhciByZXR1cm5MYXN0Tm9kZSA9IHBpY2tGb2N1c2FibGUoaW5uZXJOb2RlcywgaW5uZXJUYWJiYWJsZXNbaW5uZXJUYWJiYWJsZXMubGVuZ3RoIC0gMV0pO1xuICAgIC8vIGZpcnN0IGVsZW1lbnRcbiAgICBpZiAoYWN0aXZlSW5kZXggPD0gZmlyc3ROb2RlSW5kZXggJiYgaXNPbkd1YXJkICYmIE1hdGguYWJzKGluZGV4RGlmZikgPiAxKSB7XG4gICAgICAgIHJldHVybiByZXR1cm5MYXN0Tm9kZTtcbiAgICB9XG4gICAgLy8gbGFzdCBlbGVtZW50XG4gICAgaWYgKGFjdGl2ZUluZGV4ID49IGxhc3ROb2RlSW5kZXggJiYgaXNPbkd1YXJkICYmIE1hdGguYWJzKGluZGV4RGlmZikgPiAxKSB7XG4gICAgICAgIHJldHVybiByZXR1cm5GaXJzdE5vZGU7XG4gICAgfVxuICAgIC8vIGp1bXAgb3V0LCBidXQgbm90IG9uIHRoZSBndWFyZFxuICAgIGlmIChpbmRleERpZmYgJiYgTWF0aC5hYnMoY29ycmVjdGVkSW5kZXhEaWZmKSA+IDEpIHtcbiAgICAgICAgcmV0dXJuIGxhc3ROb2RlSW5zaWRlO1xuICAgIH1cbiAgICAvLyBmb2N1cyBhYm92ZSBsb2NrXG4gICAgaWYgKGFjdGl2ZUluZGV4IDw9IGZpcnN0Tm9kZUluZGV4KSB7XG4gICAgICAgIHJldHVybiByZXR1cm5MYXN0Tm9kZTtcbiAgICB9XG4gICAgLy8gZm9jdXMgYmVsb3cgbG9ja1xuICAgIGlmIChhY3RpdmVJbmRleCA+IGxhc3ROb2RlSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHJldHVybkZpcnN0Tm9kZTtcbiAgICB9XG4gICAgLy8gaW5kZXggaXMgaW5zaWRlIHRhYiBvcmRlciwgYnV0IG91dHNpZGUgTG9ja1xuICAgIGlmIChpbmRleERpZmYpIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGluZGV4RGlmZikgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbGFzdE5vZGVJbnNpZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChjbnQgKyBsYXN0Tm9kZUluc2lkZSArIGluZGV4RGlmZikgJSBjbnQ7XG4gICAgfVxuICAgIC8vIGRvIG5vdGhpbmdcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbiIsImltcG9ydCB7IHRvQXJyYXkgfSBmcm9tICcuL2FycmF5JztcbmltcG9ydCB7IGlzQXV0b0ZvY3VzQWxsb3dlZENhY2hlZCwgaXNWaXNpYmxlQ2FjaGVkLCBub3RIaWRkZW5JbnB1dCB9IGZyb20gJy4vaXMnO1xuaW1wb3J0IHsgb3JkZXJCeVRhYkluZGV4IH0gZnJvbSAnLi90YWJPcmRlcic7XG5pbXBvcnQgeyBnZXRGb2N1c2FibGVzLCBnZXRQYXJlbnRBdXRvZm9jdXNhYmxlcyB9IGZyb20gJy4vdGFiVXRpbHMnO1xuLyoqXG4gKiBnaXZlbiBsaXN0IG9mIGZvY3VzYWJsZSBlbGVtZW50cyBrZWVwcyB0aGUgb25lcyB1c2VyIGNhbiBpbnRlcmFjdCB3aXRoXG4gKiBAcGFyYW0gbm9kZXNcbiAqIEBwYXJhbSB2aXNpYmlsaXR5Q2FjaGVcbiAqL1xuZXhwb3J0IHZhciBmaWx0ZXJGb2N1c2FibGUgPSBmdW5jdGlvbiAobm9kZXMsIHZpc2liaWxpdHlDYWNoZSkge1xuICAgIHJldHVybiB0b0FycmF5KG5vZGVzKVxuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBpc1Zpc2libGVDYWNoZWQodmlzaWJpbGl0eUNhY2hlLCBub2RlKTsgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm90SGlkZGVuSW5wdXQobm9kZSk7IH0pO1xufTtcbmV4cG9ydCB2YXIgZmlsdGVyQXV0b0ZvY3VzYWJsZSA9IGZ1bmN0aW9uIChub2RlcywgY2FjaGUpIHtcbiAgICBpZiAoY2FjaGUgPT09IHZvaWQgMCkgeyBjYWNoZSA9IG5ldyBNYXAoKTsgfVxuICAgIHJldHVybiB0b0FycmF5KG5vZGVzKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGlzQXV0b0ZvY3VzQWxsb3dlZENhY2hlZChjYWNoZSwgbm9kZSk7IH0pO1xufTtcbi8qKlxuICogIV9fV0FSTklOR19fISBMb3cgbGV2ZWwgQVBJLlxuICogQHJldHVybnMgYWxsIHRhYmJhYmxlIG5vZGVzXG4gKlxuICogQHNlZSB7QGxpbmsgZ2V0Rm9jdXNhYmxlTm9kZXN9IHRvIGdldCBhbnkgZm9jdXNhYmxlIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gdG9wTm9kZXMgLSBhcnJheSBvZiB0b3AgbGV2ZWwgSFRNTEVsZW1lbnRzIHRvIHNlYXJjaCBpbnNpZGVcbiAqIEBwYXJhbSB2aXNpYmlsaXR5Q2FjaGUgLSBhbiBjYWNoZSB0byBzdG9yZSBpbnRlcm1lZGlhdGUgbWVhc3VyZW1lbnRzLiBFeHBlY3RlZCB0byBiZSBhIGZyZXNoIGBuZXcgTWFwYCBvbiBldmVyeSBjYWxsXG4gKi9cbmV4cG9ydCB2YXIgZ2V0VGFiYmFibGVOb2RlcyA9IGZ1bmN0aW9uICh0b3BOb2RlcywgdmlzaWJpbGl0eUNhY2hlLCB3aXRoR3VhcmRzKSB7XG4gICAgcmV0dXJuIG9yZGVyQnlUYWJJbmRleChmaWx0ZXJGb2N1c2FibGUoZ2V0Rm9jdXNhYmxlcyh0b3BOb2Rlcywgd2l0aEd1YXJkcyksIHZpc2liaWxpdHlDYWNoZSksIHRydWUsIHdpdGhHdWFyZHMpO1xufTtcbi8qKlxuICogIV9fV0FSTklOR19fISBMb3cgbGV2ZWwgQVBJLlxuICpcbiAqIEByZXR1cm5zIGFueXRoaW5nIFwiZm9jdXNhYmxlXCIsIG5vdCBvbmx5IHRhYmJhYmxlLiBUaGUgZGlmZmVyZW5jZSBpcyBpbiBgdGFiSW5kZXg9LTFgXG4gKiAod2l0aG91dCBndWFyZHMsIGFzIGxvbmcgYXMgdGhleSBhcmUgbm90IGV4cGVjdGVkIHRvIGJlIGV2ZXIgZm9jdXNlZClcbiAqXG4gKiBAc2VlIHtAbGluayBnZXRUYWJiYWJsZU5vZGVzfSB0byBnZXQgb25seSB0YWJibGUgbm9kZXMgZWxlbWVudFxuICpcbiAqIEBwYXJhbSB0b3BOb2RlcyAtIGFycmF5IG9mIHRvcCBsZXZlbCBIVE1MRWxlbWVudHMgdG8gc2VhcmNoIGluc2lkZVxuICogQHBhcmFtIHZpc2liaWxpdHlDYWNoZSAtIGFuIGNhY2hlIHRvIHN0b3JlIGludGVybWVkaWF0ZSBtZWFzdXJlbWVudHMuIEV4cGVjdGVkIHRvIGJlIGEgZnJlc2ggYG5ldyBNYXBgIG9uIGV2ZXJ5IGNhbGxcbiAqL1xuZXhwb3J0IHZhciBnZXRGb2N1c2FibGVOb2RlcyA9IGZ1bmN0aW9uICh0b3BOb2RlcywgdmlzaWJpbGl0eUNhY2hlKSB7XG4gICAgcmV0dXJuIG9yZGVyQnlUYWJJbmRleChmaWx0ZXJGb2N1c2FibGUoZ2V0Rm9jdXNhYmxlcyh0b3BOb2RlcyksIHZpc2liaWxpdHlDYWNoZSksIGZhbHNlKTtcbn07XG4vKipcbiAqIHJldHVybiBsaXN0IG9mIG5vZGVzIHdoaWNoIGFyZSBleHBlY3RlZCB0byBiZSBhdXRvLWZvY3VzZWRcbiAqIEBwYXJhbSB0b3BOb2RlXG4gKiBAcGFyYW0gdmlzaWJpbGl0eUNhY2hlXG4gKi9cbmV4cG9ydCB2YXIgcGFyZW50QXV0b2ZvY3VzYWJsZXMgPSBmdW5jdGlvbiAodG9wTm9kZSwgdmlzaWJpbGl0eUNhY2hlKSB7XG4gICAgcmV0dXJuIGZpbHRlckZvY3VzYWJsZShnZXRQYXJlbnRBdXRvZm9jdXNhYmxlcyh0b3BOb2RlKSwgdmlzaWJpbGl0eUNhY2hlKTtcbn07XG4vKlxuICogRGV0ZXJtaW5lcyBpZiBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiBzY29wZSwgaW5jbHVkaW5nIG5lc3RlZCBzaGFkb3cgRE9Nc1xuICovXG5leHBvcnQgdmFyIGNvbnRhaW5zID0gZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50KSB7XG4gICAgaWYgKHNjb3BlLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5zKHNjb3BlLnNoYWRvd1Jvb3QsIGVsZW1lbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihzY29wZSkuY29udGFpbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHNjb3BlKS5jb250YWlucy5jYWxsKHNjb3BlLCBlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvQXJyYXkoc2NvcGUuY2hpbGRyZW4pLnNvbWUoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBpZnJhbWVCb2R5ID0gKF9hID0gY2hpbGQuY29udGVudERvY3VtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYm9keTtcbiAgICAgICAgICAgICAgICBpZiAoaWZyYW1lQm9keSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnMoaWZyYW1lQm9keSwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb250YWlucyhjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG4iLCJpbXBvcnQgeyBGT0NVU19ESVNBQkxFRCwgRk9DVVNfR1JPVVAgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgYXNBcnJheSwgdG9BcnJheSB9IGZyb20gJy4vYXJyYXknO1xuLyoqXG4gKiBpbiBjYXNlIG9mIG11bHRpcGxlIG5vZGVzIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlclxuICoga2VlcHMgb25seSB0b3Agb25lc1xuICogdGhpcyBpcyBPKG5sb2duKVxuICogQHBhcmFtIG5vZGVzXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xudmFyIGZpbHRlck5lc3RlZCA9IGZ1bmN0aW9uIChub2Rlcykge1xuICAgIHZhciBjb250YWluZWQgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGwgPSBub2Rlcy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpICs9IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IGkgKyAxOyBqIDwgbDsgaiArPSAxKSB7XG4gICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBub2Rlc1tpXS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2Rlc1tqXSk7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG4gICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lZC5hZGQoaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVkLmFkZChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChfLCBpbmRleCkgeyByZXR1cm4gIWNvbnRhaW5lZC5oYXMoaW5kZXgpOyB9KTtcbn07XG4vKipcbiAqIGZpbmRzIHRvcCBtb3N0IHBhcmVudCBmb3IgYSBub2RlXG4gKiBAcGFyYW0gbm9kZVxuICogQHJldHVybnMgeyp9XG4gKi9cbnZhciBnZXRUb3BQYXJlbnQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLnBhcmVudE5vZGUgPyBnZXRUb3BQYXJlbnQobm9kZS5wYXJlbnROb2RlKSA6IG5vZGU7XG59O1xuLyoqXG4gKiByZXR1cm5zIGFsbCBcImZvY3VzIGNvbnRhaW5lcnNcIiBpbnNpZGUgYSBnaXZlbiBub2RlXG4gKiBAcGFyYW0gbm9kZSAtIG5vZGUgb3Igbm9kZXMgdG8gbG9vayBpbnNpZGVcbiAqIEByZXR1cm5zIEVsZW1lbnRbXVxuICovXG5leHBvcnQgdmFyIGdldEFsbEFmZmVjdGVkTm9kZXMgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBub2RlcyA9IGFzQXJyYXkobm9kZSk7XG4gICAgcmV0dXJuIG5vZGVzLmZpbHRlcihCb29sZWFuKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY3VycmVudE5vZGUpIHtcbiAgICAgICAgdmFyIGdyb3VwID0gY3VycmVudE5vZGUuZ2V0QXR0cmlidXRlKEZPQ1VTX0dST1VQKTtcbiAgICAgICAgYWNjLnB1c2guYXBwbHkoYWNjLCAoZ3JvdXBcbiAgICAgICAgICAgID8gZmlsdGVyTmVzdGVkKHRvQXJyYXkoZ2V0VG9wUGFyZW50KGN1cnJlbnROb2RlKS5xdWVyeVNlbGVjdG9yQWxsKFwiW1wiLmNvbmNhdChGT0NVU19HUk9VUCwgXCI9XFxcIlwiKS5jb25jYXQoZ3JvdXAsIFwiXFxcIl06bm90KFtcIikuY29uY2F0KEZPQ1VTX0RJU0FCTEVELCBcIj1cXFwiZGlzYWJsZWRcXFwiXSlcIikpKSlcbiAgICAgICAgICAgIDogW2N1cnJlbnROb2RlXSkpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcbn07XG4iLCIvKlxuSUUxMSBzdXBwb3J0XG4gKi9cbmV4cG9ydCB2YXIgdG9BcnJheSA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHJldCA9IEFycmF5KGEubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcmV0W2ldID0gYVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn07XG5leHBvcnQgdmFyIGFzQXJyYXkgPSBmdW5jdGlvbiAoYSkgeyByZXR1cm4gKEFycmF5LmlzQXJyYXkoYSkgPyBhIDogW2FdKTsgfTtcbmV4cG9ydCB2YXIgZ2V0Rmlyc3QgPSBmdW5jdGlvbiAoYSkgeyByZXR1cm4gKEFycmF5LmlzQXJyYXkoYSkgPyBhWzBdIDogYSk7IH07XG4iLCJpbXBvcnQgeyBmaWx0ZXJBdXRvRm9jdXNhYmxlIH0gZnJvbSAnLi9ET011dGlscyc7XG5pbXBvcnQgeyBwaWNrRmlyc3RGb2N1cyB9IGZyb20gJy4vZmlyc3RGb2N1cyc7XG5pbXBvcnQgeyBnZXREYXRhc2V0IH0gZnJvbSAnLi9pcyc7XG52YXIgZmluZEF1dG9Gb2N1c2VkID0gZnVuY3Rpb24gKGF1dG9Gb2N1c2FibGVzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGF1dG9mb2N1cyA9IChfYSA9IGdldERhdGFzZXQobm9kZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hdXRvZm9jdXM7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgbm9kZS5hdXRvZm9jdXMgfHxcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAoYXV0b2ZvY3VzICE9PSB1bmRlZmluZWQgJiYgYXV0b2ZvY3VzICE9PSAnZmFsc2UnKSB8fFxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGF1dG9Gb2N1c2FibGVzLmluZGV4T2Yobm9kZSkgPj0gMCk7XG4gICAgfTtcbn07XG5leHBvcnQgdmFyIHBpY2tBdXRvZm9jdXMgPSBmdW5jdGlvbiAobm9kZXNJbmRleGVzLCBvcmRlcmVkTm9kZXMsIGdyb3Vwcykge1xuICAgIHZhciBub2RlcyA9IG5vZGVzSW5kZXhlcy5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBub2RlID0gX2Eubm9kZTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSk7XG4gICAgdmFyIGF1dG9Gb2N1c2FibGUgPSBmaWx0ZXJBdXRvRm9jdXNhYmxlKG5vZGVzLmZpbHRlcihmaW5kQXV0b0ZvY3VzZWQoZ3JvdXBzKSkpO1xuICAgIGlmIChhdXRvRm9jdXNhYmxlICYmIGF1dG9Gb2N1c2FibGUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBwaWNrRmlyc3RGb2N1cyhhdXRvRm9jdXNhYmxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHBpY2tGaXJzdEZvY3VzKGZpbHRlckF1dG9Gb2N1c2FibGUob3JkZXJlZE5vZGVzKSk7XG59O1xuIiwiaW1wb3J0IHsgaXNSYWRpb0VsZW1lbnQgfSBmcm9tICcuL2lzJztcbnZhciBmaW5kU2VsZWN0ZWRSYWRpbyA9IGZ1bmN0aW9uIChub2RlLCBub2Rlcykge1xuICAgIHJldHVybiBub2Rlc1xuICAgICAgICAuZmlsdGVyKGlzUmFkaW9FbGVtZW50KVxuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwubmFtZSA9PT0gbm9kZS5uYW1lOyB9KVxuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuY2hlY2tlZDsgfSlbMF0gfHwgbm9kZTtcbn07XG5leHBvcnQgdmFyIGNvcnJlY3ROb2RlID0gZnVuY3Rpb24gKG5vZGUsIG5vZGVzKSB7XG4gICAgaWYgKGlzUmFkaW9FbGVtZW50KG5vZGUpICYmIG5vZGUubmFtZSkge1xuICAgICAgICByZXR1cm4gZmluZFNlbGVjdGVkUmFkaW8obm9kZSwgbm9kZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbn07XG4vKipcbiAqIGdpdmluZyBhIHNldCBvZiByYWRpbyBpbnB1dHMga2VlcHMgb25seSBzZWxlY3RlZCAodGFiYmFibGUpIG9uZXNcbiAqIEBwYXJhbSBub2Rlc1xuICovXG5leHBvcnQgdmFyIGNvcnJlY3ROb2RlcyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICAgIC8vIElFMTEgaGFzIG5vIFNldChhcnJheSkgY29uc3RydWN0b3JcbiAgICB2YXIgcmVzdWx0U2V0ID0gbmV3IFNldCgpO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHJlc3VsdFNldC5hZGQoY29ycmVjdE5vZGUobm9kZSwgbm9kZXMpKTsgfSk7XG4gICAgLy8gdXNpbmcgZmlsdGVyIHRvIHN1cHBvcnQgSUUxMVxuICAgIHJldHVybiBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHJlc3VsdFNldC5oYXMobm9kZSk7IH0pO1xufTtcbiIsImltcG9ydCB7IGNvcnJlY3ROb2RlIH0gZnJvbSAnLi9jb3JyZWN0Rm9jdXMnO1xuZXhwb3J0IHZhciBwaWNrRmlyc3RGb2N1cyA9IGZ1bmN0aW9uIChub2Rlcykge1xuICAgIGlmIChub2Rlc1swXSAmJiBub2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybiBjb3JyZWN0Tm9kZShub2Rlc1swXSwgbm9kZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZXNbMF07XG59O1xuZXhwb3J0IHZhciBwaWNrRm9jdXNhYmxlID0gZnVuY3Rpb24gKG5vZGVzLCBub2RlKSB7XG4gICAgcmV0dXJuIG5vZGVzLmluZGV4T2YoY29ycmVjdE5vZGUobm9kZSwgbm9kZXMpKTtcbn07XG4iLCIvKipcbiAqIHJldHVybnMgYWN0aXZlIGVsZW1lbnQgZnJvbSBkb2N1bWVudCBvciBmcm9tIG5lc3RlZCBzaGFkb3dkb21zXG4gKi9cbmltcG9ydCB7IHNhZmVQcm9iZSB9IGZyb20gJy4vc2FmZSc7XG4vKipcbiAqIHJldHVybnMgY3VycmVudCBhY3RpdmUgZWxlbWVudC4gSWYgdGhlIGFjdGl2ZSBlbGVtZW50IGlzIGEgXCJjb250YWluZXJcIiBpdHNlbGYoc2hhZG93Um9vdCBvciBpZnJhbWUpIHJldHVybnMgYWN0aXZlIGVsZW1lbnQgaW5zaWRlIGl0XG4gKiBAcGFyYW0gW2luRG9jdW1lbnRdXG4gKi9cbmV4cG9ydCB2YXIgZ2V0QWN0aXZlRWxlbWVudCA9IGZ1bmN0aW9uIChpbkRvY3VtZW50KSB7XG4gICAgaWYgKGluRG9jdW1lbnQgPT09IHZvaWQgMCkgeyBpbkRvY3VtZW50ID0gZG9jdW1lbnQ7IH1cbiAgICBpZiAoIWluRG9jdW1lbnQgfHwgIWluRG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgYWN0aXZlRWxlbWVudCA9IGluRG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICByZXR1cm4gKGFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdFxuICAgICAgICA/IGdldEFjdGl2ZUVsZW1lbnQoYWN0aXZlRWxlbWVudC5zaGFkb3dSb290KVxuICAgICAgICA6IGFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSUZyYW1lRWxlbWVudCAmJiBzYWZlUHJvYmUoZnVuY3Rpb24gKCkgeyByZXR1cm4gYWN0aXZlRWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50OyB9KVxuICAgICAgICAgICAgPyBnZXRBY3RpdmVFbGVtZW50KGFjdGl2ZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudClcbiAgICAgICAgICAgIDogYWN0aXZlRWxlbWVudCk7XG59O1xuIiwiaW1wb3J0IHsgRk9DVVNfTk9fQVVUT0ZPQ1VTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbnZhciBpc0VsZW1lbnRIaWRkZW4gPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIC8vIHdlIGNhbiBtZWFzdXJlIG9ubHkgXCJlbGVtZW50c1wiXG4gICAgLy8gY29uc2lkZXIgb3RoZXJzIGFzIFwidmlzaWJsZVwiXG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKTtcbiAgICBpZiAoIWNvbXB1dGVkU3R5bGUgfHwgIWNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdkaXNwbGF5JykgPT09ICdub25lJyB8fCBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ2hpZGRlbicpO1xufTtcbnZhciBnZXRQYXJlbnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIGNhbiBhbHNvIHBvaW50IG9uIFNoYWRvd1Jvb3QuIEluIHRoaXMgY2FzZSAuaG9zdCB3aWxsIHBvaW50IG9uIHRoZSBuZXh0IG5vZGVcbiAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlICYmIG5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFXG4gICAgICAgID8gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5ob3N0XG4gICAgICAgIDogbm9kZS5wYXJlbnROb2RlO1xufTtcbnZhciBpc1RvcE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gbm9kZSA9PT0gZG9jdW1lbnQgfHwgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9OT0RFKTtcbn07XG52YXIgaXNJbmVydCA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLmhhc0F0dHJpYnV0ZSgnaW5lcnQnKTsgfTtcbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVzdGluZy1saWJyYXJ5L2plc3QtZG9tL2Jsb2IvbWFpbi9zcmMvdG8tYmUtdmlzaWJsZS5qc1xuICovXG52YXIgaXNWaXNpYmxlVW5jYWNoZWQgPSBmdW5jdGlvbiAobm9kZSwgY2hlY2tQYXJlbnQpIHtcbiAgICByZXR1cm4gIW5vZGUgfHwgaXNUb3BOb2RlKG5vZGUpIHx8ICghaXNFbGVtZW50SGlkZGVuKG5vZGUpICYmICFpc0luZXJ0KG5vZGUpICYmIGNoZWNrUGFyZW50KGdldFBhcmVudE5vZGUobm9kZSkpKTtcbn07XG5leHBvcnQgdmFyIGlzVmlzaWJsZUNhY2hlZCA9IGZ1bmN0aW9uICh2aXNpYmlsaXR5Q2FjaGUsIG5vZGUpIHtcbiAgICB2YXIgY2FjaGVkID0gdmlzaWJpbGl0eUNhY2hlLmdldChub2RlKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGlzVmlzaWJsZVVuY2FjaGVkKG5vZGUsIGlzVmlzaWJsZUNhY2hlZC5iaW5kKHVuZGVmaW5lZCwgdmlzaWJpbGl0eUNhY2hlKSk7XG4gICAgdmlzaWJpbGl0eUNhY2hlLnNldChub2RlLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIGlzQXV0b0ZvY3VzQWxsb3dlZFVuY2FjaGVkID0gZnVuY3Rpb24gKG5vZGUsIGNoZWNrUGFyZW50KSB7XG4gICAgcmV0dXJuIG5vZGUgJiYgIWlzVG9wTm9kZShub2RlKSA/IChpc0F1dG9Gb2N1c0FsbG93ZWQobm9kZSkgPyBjaGVja1BhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKSA6IGZhbHNlKSA6IHRydWU7XG59O1xuZXhwb3J0IHZhciBpc0F1dG9Gb2N1c0FsbG93ZWRDYWNoZWQgPSBmdW5jdGlvbiAoY2FjaGUsIG5vZGUpIHtcbiAgICB2YXIgY2FjaGVkID0gY2FjaGUuZ2V0KG5vZGUpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gaXNBdXRvRm9jdXNBbGxvd2VkVW5jYWNoZWQobm9kZSwgaXNBdXRvRm9jdXNBbGxvd2VkQ2FjaGVkLmJpbmQodW5kZWZpbmVkLCBjYWNoZSkpO1xuICAgIGNhY2hlLnNldChub2RlLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IHZhciBnZXREYXRhc2V0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIG5vZGUuZGF0YXNldDtcbn07XG5leHBvcnQgdmFyIGlzSFRNTEJ1dHRvbkVsZW1lbnQgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS50YWdOYW1lID09PSAnQlVUVE9OJzsgfTtcbmV4cG9ydCB2YXIgaXNIVE1MSW5wdXRFbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ0lOUFVUJzsgfTtcbmV4cG9ydCB2YXIgaXNSYWRpb0VsZW1lbnQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBpc0hUTUxJbnB1dEVsZW1lbnQobm9kZSkgJiYgbm9kZS50eXBlID09PSAncmFkaW8nO1xufTtcbmV4cG9ydCB2YXIgbm90SGlkZGVuSW5wdXQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiAhKChpc0hUTUxJbnB1dEVsZW1lbnQobm9kZSkgfHwgaXNIVE1MQnV0dG9uRWxlbWVudChub2RlKSkgJiYgKG5vZGUudHlwZSA9PT0gJ2hpZGRlbicgfHwgbm9kZS5kaXNhYmxlZCkpO1xufTtcbmV4cG9ydCB2YXIgaXNBdXRvRm9jdXNBbGxvd2VkID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgYXR0cmlidXRlID0gbm9kZS5nZXRBdHRyaWJ1dGUoRk9DVVNfTk9fQVVUT0ZPQ1VTKTtcbiAgICByZXR1cm4gIVt0cnVlLCAndHJ1ZScsICcnXS5pbmNsdWRlcyhhdHRyaWJ1dGUpO1xufTtcbmV4cG9ydCB2YXIgaXNHdWFyZCA9IGZ1bmN0aW9uIChub2RlKSB7IHZhciBfYTsgcmV0dXJuIEJvb2xlYW4obm9kZSAmJiAoKF9hID0gZ2V0RGF0YXNldChub2RlKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvY3VzR3VhcmQpKTsgfTtcbmV4cG9ydCB2YXIgaXNOb3RBR3VhcmQgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gIWlzR3VhcmQobm9kZSk7IH07XG5leHBvcnQgdmFyIGlzRGVmaW5lZCA9IGZ1bmN0aW9uICh4KSB7IHJldHVybiBCb29sZWFuKHgpOyB9O1xuIiwiaW1wb3J0IHsgcGFyZW50QXV0b2ZvY3VzYWJsZXMgfSBmcm9tICcuL0RPTXV0aWxzJztcbmltcG9ydCB7IGNvbnRhaW5zIH0gZnJvbSAnLi9ET011dGlscyc7XG5pbXBvcnQgeyBhc0FycmF5IH0gZnJvbSAnLi9hcnJheSc7XG52YXIgZ2V0UGFyZW50cyA9IGZ1bmN0aW9uIChub2RlLCBwYXJlbnRzKSB7XG4gICAgaWYgKHBhcmVudHMgPT09IHZvaWQgMCkgeyBwYXJlbnRzID0gW107IH1cbiAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICBnZXRQYXJlbnRzKG5vZGUucGFyZW50Tm9kZS5ob3N0IHx8IG5vZGUucGFyZW50Tm9kZSwgcGFyZW50cyk7XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRzO1xufTtcbi8qKlxuICogZmluZHMgYSBwYXJlbnQgZm9yIGJvdGggbm9kZUEgYW5kIG5vZGVCXG4gKiBAcGFyYW0gbm9kZUFcbiAqIEBwYXJhbSBub2RlQlxuICogQHJldHVybnMge2Jvb2xlYW58Kn1cbiAqL1xuZXhwb3J0IHZhciBnZXRDb21tb25QYXJlbnQgPSBmdW5jdGlvbiAobm9kZUEsIG5vZGVCKSB7XG4gICAgdmFyIHBhcmVudHNBID0gZ2V0UGFyZW50cyhub2RlQSk7XG4gICAgdmFyIHBhcmVudHNCID0gZ2V0UGFyZW50cyhub2RlQik7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci1mb3Itb2ZcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudHNBLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjdXJyZW50UGFyZW50ID0gcGFyZW50c0FbaV07XG4gICAgICAgIGlmIChwYXJlbnRzQi5pbmRleE9mKGN1cnJlbnRQYXJlbnQpID49IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5leHBvcnQgdmFyIGdldFRvcENvbW1vblBhcmVudCA9IGZ1bmN0aW9uIChiYXNlQWN0aXZlRWxlbWVudCwgbGVmdEVudHJ5LCByaWdodEVudHJpZXMpIHtcbiAgICB2YXIgYWN0aXZlRWxlbWVudHMgPSBhc0FycmF5KGJhc2VBY3RpdmVFbGVtZW50KTtcbiAgICB2YXIgbGVmdEVudHJpZXMgPSBhc0FycmF5KGxlZnRFbnRyeSk7XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBhY3RpdmVFbGVtZW50c1swXTtcbiAgICB2YXIgdG9wQ29tbW9uID0gZmFsc2U7XG4gICAgbGVmdEVudHJpZXMuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHRvcENvbW1vbiA9IGdldENvbW1vblBhcmVudCh0b3BDb21tb24gfHwgZW50cnksIGVudHJ5KSB8fCB0b3BDb21tb247XG4gICAgICAgIHJpZ2h0RW50cmllcy5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoc3ViRW50cnkpIHtcbiAgICAgICAgICAgIHZhciBjb21tb24gPSBnZXRDb21tb25QYXJlbnQoYWN0aXZlRWxlbWVudCwgc3ViRW50cnkpO1xuICAgICAgICAgICAgaWYgKGNvbW1vbikge1xuICAgICAgICAgICAgICAgIGlmICghdG9wQ29tbW9uIHx8IGNvbnRhaW5zKGNvbW1vbiwgdG9wQ29tbW9uKSkge1xuICAgICAgICAgICAgICAgICAgICB0b3BDb21tb24gPSBjb21tb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0b3BDb21tb24gPSBnZXRDb21tb25QYXJlbnQoY29tbW9uLCB0b3BDb21tb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgLy8gVE9ETzogYWRkIGFzc2VydCBoZXJlP1xuICAgIHJldHVybiB0b3BDb21tb247XG59O1xuLyoqXG4gKiByZXR1cm4gbGlzdCBvZiBub2RlcyB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gYmUgYXV0b2ZvY3VzZWQgaW5zaWRlIGEgZ2l2ZW4gdG9wIG5vZGVzXG4gKiBAcGFyYW0gZW50cmllc1xuICogQHBhcmFtIHZpc2liaWxpdHlDYWNoZVxuICovXG5leHBvcnQgdmFyIGFsbFBhcmVudEF1dG9mb2N1c2FibGVzID0gZnVuY3Rpb24gKGVudHJpZXMsIHZpc2liaWxpdHlDYWNoZSkge1xuICAgIHJldHVybiBlbnRyaWVzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBub2RlKSB7IHJldHVybiBhY2MuY29uY2F0KHBhcmVudEF1dG9mb2N1c2FibGVzKG5vZGUsIHZpc2liaWxpdHlDYWNoZSkpOyB9LCBbXSk7XG59O1xuIiwiZXhwb3J0IHZhciBzYWZlUHJvYmUgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2IoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gJy4vYXJyYXknO1xuZXhwb3J0IHZhciB0YWJTb3J0ID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgYVRhYiA9IE1hdGgubWF4KDAsIGEudGFiSW5kZXgpO1xuICAgIHZhciBiVGFiID0gTWF0aC5tYXgoMCwgYi50YWJJbmRleCk7XG4gICAgdmFyIHRhYkRpZmYgPSBhVGFiIC0gYlRhYjtcbiAgICB2YXIgaW5kZXhEaWZmID0gYS5pbmRleCAtIGIuaW5kZXg7XG4gICAgaWYgKHRhYkRpZmYpIHtcbiAgICAgICAgaWYgKCFhVGFiKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWJUYWIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFiRGlmZiB8fCBpbmRleERpZmY7XG59O1xudmFyIGdldFRhYkluZGV4ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAobm9kZS50YWJJbmRleCA8IDApIHtcbiAgICAgICAgLy8gYWxsIFwiZm9jdXNhYmxlXCIgZWxlbWVudHMgYXJlIGFscmVhZHkgcHJlc2VsZWN0ZWRcbiAgICAgICAgLy8gYnV0IHNvbWUgbWlnaHQgaGF2ZSBpbXBsaWNpdCBuZWdhdGl2ZSB0YWJJbmRleFxuICAgICAgICAvLyByZXR1cm4gMCBmb3IgPGF1ZGlvIHdpdGhvdXQgdGFiSW5kZXggYXR0cmlidXRlIC0gaXQgaXMgXCJ0YWJiYWJsZVwiXG4gICAgICAgIGlmICghbm9kZS5oYXNBdHRyaWJ1dGUoJ3RhYmluZGV4JykpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2RlLnRhYkluZGV4O1xufTtcbmV4cG9ydCB2YXIgb3JkZXJCeVRhYkluZGV4ID0gZnVuY3Rpb24gKG5vZGVzLCBmaWx0ZXJOZWdhdGl2ZSwga2VlcEd1YXJkcykge1xuICAgIHJldHVybiB0b0FycmF5KG5vZGVzKVxuICAgICAgICAubWFwKGZ1bmN0aW9uIChub2RlLCBpbmRleCkge1xuICAgICAgICB2YXIgdGFiSW5kZXggPSBnZXRUYWJJbmRleChub2RlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICB0YWJJbmRleDoga2VlcEd1YXJkcyAmJiB0YWJJbmRleCA9PT0gLTEgPyAoKG5vZGUuZGF0YXNldCB8fCB7fSkuZm9jdXNHdWFyZCA/IDAgOiAtMSkgOiB0YWJJbmRleCxcbiAgICAgICAgfTtcbiAgICB9KVxuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiAhZmlsdGVyTmVnYXRpdmUgfHwgZGF0YS50YWJJbmRleCA+PSAwOyB9KVxuICAgICAgICAuc29ydCh0YWJTb3J0KTtcbn07XG4iLCJpbXBvcnQgeyBGT0NVU19BVVRPIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IHRvQXJyYXkgfSBmcm9tICcuL2FycmF5JztcbmltcG9ydCB7IHRhYmJhYmxlcyB9IGZyb20gJy4vdGFiYmFibGVzJztcbnZhciBxdWVyeVRhYmJhYmxlcyA9IHRhYmJhYmxlcy5qb2luKCcsJyk7XG52YXIgcXVlcnlHdWFyZFRhYmJhYmxlcyA9IFwiXCIuY29uY2F0KHF1ZXJ5VGFiYmFibGVzLCBcIiwgW2RhdGEtZm9jdXMtZ3VhcmRdXCIpO1xudmFyIGdldEZvY3VzYWJsZXNXaXRoU2hhZG93RG9tID0gZnVuY3Rpb24gKHBhcmVudCwgd2l0aEd1YXJkcykge1xuICAgIHJldHVybiB0b0FycmF5KChwYXJlbnQuc2hhZG93Um9vdCB8fCBwYXJlbnQpLmNoaWxkcmVuKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQoY2hpbGQubWF0Y2hlcyh3aXRoR3VhcmRzID8gcXVlcnlHdWFyZFRhYmJhYmxlcyA6IHF1ZXJ5VGFiYmFibGVzKSA/IFtjaGlsZF0gOiBbXSwgZ2V0Rm9jdXNhYmxlc1dpdGhTaGFkb3dEb20oY2hpbGQpKTtcbiAgICB9LCBbXSk7XG59O1xudmFyIGdldEZvY3VzYWJsZXNXaXRoSUZyYW1lID0gZnVuY3Rpb24gKHBhcmVudCwgd2l0aEd1YXJkcykge1xuICAgIHZhciBfYTtcbiAgICAvLyBjb250ZW50RG9jdW1lbnQgb2YgaWZyYW1lIHdpbGwgYmUgbnVsbCBpZiBjdXJyZW50IG9yaWdpbiBjYW5ub3QgYWNjZXNzIGl0XG4gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50ICYmICgoX2EgPSBwYXJlbnQuY29udGVudERvY3VtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYm9keSkpIHtcbiAgICAgICAgcmV0dXJuIGdldEZvY3VzYWJsZXMoW3BhcmVudC5jb250ZW50RG9jdW1lbnQuYm9keV0sIHdpdGhHdWFyZHMpO1xuICAgIH1cbiAgICByZXR1cm4gW3BhcmVudF07XG59O1xuZXhwb3J0IHZhciBnZXRGb2N1c2FibGVzID0gZnVuY3Rpb24gKHBhcmVudHMsIHdpdGhHdWFyZHMpIHtcbiAgICByZXR1cm4gcGFyZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGFyZW50KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGZvY3VzYWJsZVdpdGhTaGFkb3dEb20gPSBnZXRGb2N1c2FibGVzV2l0aFNoYWRvd0RvbShwYXJlbnQsIHdpdGhHdWFyZHMpO1xuICAgICAgICB2YXIgZm9jdXNhYmxlV2l0aElmcmFtZXMgPSAoX2EgPSBbXSkuY29uY2F0LmFwcGx5KF9hLCBmb2N1c2FibGVXaXRoU2hhZG93RG9tLm1hcChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gZ2V0Rm9jdXNhYmxlc1dpdGhJRnJhbWUobm9kZSwgd2l0aEd1YXJkcyk7IH0pKTtcbiAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQoXG4gICAgICAgIC8vIGFkZCBhbGwgdGFiYmFibGVzIGluc2lkZSBhbmQgd2l0aGluIHNoYWRvdyBET01zIGluIERPTSBvcmRlclxuICAgICAgICBmb2N1c2FibGVXaXRoSWZyYW1lcywgXG4gICAgICAgIC8vIGFkZCBpZiBub2RlIGlzIHRhYmJhYmxlIGl0c2VsZlxuICAgICAgICBwYXJlbnQucGFyZW50Tm9kZVxuICAgICAgICAgICAgPyB0b0FycmF5KHBhcmVudC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlUYWJiYWJsZXMpKS5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUgPT09IHBhcmVudDsgfSlcbiAgICAgICAgICAgIDogW10pO1xuICAgIH0sIFtdKTtcbn07XG4vKipcbiAqIHJldHVybiBhIGxpc3Qgb2YgZm9jdXNhYmxlIG5vZGVzIHdpdGhpbiBhbiBhcmVhIG1hcmtlZCBhcyBcImF1dG8tZm9jdXNhYmxlXCJcbiAqIEBwYXJhbSBwYXJlbnRcbiAqL1xuZXhwb3J0IHZhciBnZXRQYXJlbnRBdXRvZm9jdXNhYmxlcyA9IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICB2YXIgcGFyZW50Rm9jdXMgPSBwYXJlbnQucXVlcnlTZWxlY3RvckFsbChcIltcIi5jb25jYXQoRk9DVVNfQVVUTywgXCJdXCIpKTtcbiAgICByZXR1cm4gdG9BcnJheShwYXJlbnRGb2N1cylcbiAgICAgICAgLm1hcChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gZ2V0Rm9jdXNhYmxlcyhbbm9kZV0pOyB9KVxuICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhY2MsIG5vZGVzKSB7IHJldHVybiBhY2MuY29uY2F0KG5vZGVzKTsgfSwgW10pO1xufTtcbiIsIi8qKlxuICogbGlzdCBvZiB0aGUgb2JqZWN0IHRvIGJlIGNvbnNpZGVyZWQgYXMgZm9jdXNhYmxlXG4gKi9cbmV4cG9ydCB2YXIgdGFiYmFibGVzID0gW1xuICAgICdidXR0b246ZW5hYmxlZCcsXG4gICAgJ3NlbGVjdDplbmFibGVkJyxcbiAgICAndGV4dGFyZWE6ZW5hYmxlZCcsXG4gICAgJ2lucHV0OmVuYWJsZWQnLFxuICAgIC8vIGVsZW1lbnRzIHdpdGggZXhwbGljaXQgcm9sZXMgd2lsbCBhbHNvIHVzZSBleHBsaWNpdCB0YWJpbmRleFxuICAgIC8vICdbcm9sZT1cImJ1dHRvblwiXScsXG4gICAgJ2FbaHJlZl0nLFxuICAgICdhcmVhW2hyZWZdJyxcbiAgICAnc3VtbWFyeScsXG4gICAgJ2lmcmFtZScsXG4gICAgJ29iamVjdCcsXG4gICAgJ2VtYmVkJyxcbiAgICAnYXVkaW9bY29udHJvbHNdJyxcbiAgICAndmlkZW9bY29udHJvbHNdJyxcbiAgICAnW3RhYmluZGV4XScsXG4gICAgJ1tjb250ZW50ZWRpdGFibGVdJyxcbiAgICAnW2F1dG9mb2N1c10nLFxuXTtcbiIsIi8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycywgVmxhZGltaXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS5cblxuLyoqXG4gKiBmb2N1cy1vdXRsaW5lLW1hbmFnZXJcbiAqXG4gKiBXYXRjaCB1c2VycyBrZXlib2FyZCBpbnB1dCBhbmQgbWFuYWdlIHRoZSBmb2N1cyBvdXRsaW5lIHZpc2liaWxpdHlcbiAqL1xuXG4vKipcbiAqIFRoZSBjbGFzcyBuYW1lIHRvIHNldCBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudC5cbiAqIEBjb25zdFxuICovXG52YXIgQ0xBU1NfTkFNRSA9ICdmb2N1cy1vdXRsaW5lLWhpZGRlbic7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBzZXRzIGEgQ1NTIGNsYXNzIG5hbWUgb24gdGhlIEhUTUwgZWxlbWVudCB3aGVuIGEgdXNlciBwcmVzc2VzIHRoZVxuICogdGFiIGtleS4gSXQgcmVtb3ZlcyB0aGUgY2xhc3MgbmFtZSB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhbnl3aGVyZS5cbiAqXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gd3JpdGUgQ1NTIGxpa2UgdGhpczpcbiAqXG4gKiBodG1sLmZvY3VzLW91dGxpbmUtaGlkZGVuICo6Zm9jdXMge1xuICogICAgIG91dGxpbmU6IG5vbmU7XG4gKiB9XG4gKlxuICogQW5kIHRoZSBvdXRsaW5lIHdpbGwgb25seSBiZSBzaG93biBpZiB0aGUgdXNlciB1c2VzIHRoZSBrZXlib2FyZCB0byBnZXQgdG8gaXQuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEZvY3VzT3V0bGluZU1hbmFnZXIgKCkge1xuICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGF0LmZvY3VzQnlLZXlib2FyZCA9IHRydWU7XG4gICAgfSwgdHJ1ZSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB0aGF0LmZvY3VzQnlLZXlib2FyZCA9IGZhbHNlO1xuICAgIH0sIHRydWUpO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgLy8gVXBkYXRlIHZpc2liaWxpdHkgb25seSB3aGVuIGZvY3VzIGlzIGFjdHVhbGx5IGNoYW5nZWQuXG4gICAgICAgIHRoYXQudXBkYXRlVmlzaWJpbGl0eSgpO1xuICAgIH0sIHRydWUpO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5oYXNGb2N1cygpKSB7XG4gICAgICAgICAgICAgICAgdGhhdC5mb2N1c0J5S2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoYXQudXBkYXRlVmlzaWJpbGl0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAwKTtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSgpO1xufVxuXG5Gb2N1c091dGxpbmVNYW5hZ2VyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGZvY3VzIGNoYW5nZSBpcyB0cmlnZ2VyZWQgYnkgVEFCIGtleS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZvY3VzQnlLZXlib2FyZDogdHJ1ZSxcblxuICAgIHVwZGF0ZVZpc2liaWxpdHk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5oaWRkZW4gPSAhdGhpcy5mb2N1c0J5S2V5Ym9hcmQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGZvY3VzIG91dGxpbmUgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzZXQgaGlkZGVuKGhpZGRlbikge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShDTEFTU19OQU1FLCBoaWRkZW4pO1xuICAgIH0sXG5cbiAgICBnZXQgaGlkZGVuKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FKTtcbiAgICB9XG59O1xuXG5uZXcgRm9jdXNPdXRsaW5lTWFuYWdlcigpO1xuIiwidmFyIGN1cnJlbnROb25jZTtcbmV4cG9ydCB2YXIgc2V0Tm9uY2UgPSBmdW5jdGlvbiAobm9uY2UpIHtcbiAgICBjdXJyZW50Tm9uY2UgPSBub25jZTtcbn07XG5leHBvcnQgdmFyIGdldE5vbmNlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjdXJyZW50Tm9uY2UpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb25jZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIF9fd2VicGFja19ub25jZV9fO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4vKipcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyEgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG52YXIgUkVBQ1RfU1RBVElDUyA9IHtcbiAgY2hpbGRDb250ZXh0VHlwZXM6IHRydWUsXG4gIGNvbnRleHRUeXBlOiB0cnVlLFxuICBjb250ZXh0VHlwZXM6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIGdldERlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM6IHRydWUsXG4gIG1peGluczogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIEtOT1dOX1NUQVRJQ1MgPSB7XG4gIG5hbWU6IHRydWUsXG4gIGxlbmd0aDogdHJ1ZSxcbiAgcHJvdG90eXBlOiB0cnVlLFxuICBjYWxsZXI6IHRydWUsXG4gIGNhbGxlZTogdHJ1ZSxcbiAgYXJndW1lbnRzOiB0cnVlLFxuICBhcml0eTogdHJ1ZVxufTtcbnZhciBGT1JXQVJEX1JFRl9TVEFUSUNTID0ge1xuICAnJCR0eXBlb2YnOiB0cnVlLFxuICByZW5kZXI6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZVxufTtcbnZhciBNRU1PX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIGNvbXBhcmU6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZSxcbiAgdHlwZTogdHJ1ZVxufTtcbnZhciBUWVBFX1NUQVRJQ1MgPSB7fTtcblRZUEVfU1RBVElDU1tyZWFjdElzLkZvcndhcmRSZWZdID0gRk9SV0FSRF9SRUZfU1RBVElDUztcblRZUEVfU1RBVElDU1tyZWFjdElzLk1lbW9dID0gTUVNT19TVEFUSUNTO1xuXG5mdW5jdGlvbiBnZXRTdGF0aWNzKGNvbXBvbmVudCkge1xuICAvLyBSZWFjdCB2MTYuMTEgYW5kIGJlbG93XG4gIGlmIChyZWFjdElzLmlzTWVtbyhjb21wb25lbnQpKSB7XG4gICAgcmV0dXJuIE1FTU9fU1RBVElDUztcbiAgfSAvLyBSZWFjdCB2MTYuMTIgYW5kIGFib3ZlXG5cblxuICByZXR1cm4gVFlQRV9TVEFUSUNTW2NvbXBvbmVudFsnJCR0eXBlb2YnXV0gfHwgUkVBQ1RfU1RBVElDUztcbn1cblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgb2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbmZ1bmN0aW9uIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgc291cmNlQ29tcG9uZW50LCBibGFja2xpc3QpIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2VDb21wb25lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgaG9pc3Qgb3ZlciBzdHJpbmcgKGh0bWwpIGNvbXBvbmVudHNcbiAgICBpZiAob2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICB2YXIgaW5oZXJpdGVkQ29tcG9uZW50ID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlQ29tcG9uZW50KTtcblxuICAgICAgaWYgKGluaGVyaXRlZENvbXBvbmVudCAmJiBpbmhlcml0ZWRDb21wb25lbnQgIT09IG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgICBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIGluaGVyaXRlZENvbXBvbmVudCwgYmxhY2tsaXN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ29tcG9uZW50KTtcblxuICAgIGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlQ29tcG9uZW50KSk7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldFN0YXRpY3MgPSBnZXRTdGF0aWNzKHRhcmdldENvbXBvbmVudCk7XG4gICAgdmFyIHNvdXJjZVN0YXRpY3MgPSBnZXRTdGF0aWNzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoIUtOT1dOX1NUQVRJQ1Nba2V5XSAmJiAhKGJsYWNrbGlzdCAmJiBibGFja2xpc3Rba2V5XSkgJiYgIShzb3VyY2VTdGF0aWNzICYmIHNvdXJjZVN0YXRpY3Nba2V5XSkgJiYgISh0YXJnZXRTdGF0aWNzICYmIHRhcmdldFN0YXRpY3Nba2V5XSkpIHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlQ29tcG9uZW50LCBrZXkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQXZvaWQgZmFpbHVyZXMgZnJvbSByZWFkLW9ubHkgcHJvcGVydGllc1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldENvbXBvbmVudCwga2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhvaXN0Tm9uUmVhY3RTdGF0aWNzO1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIGhhc1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKSA6IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKSA6IDB4ZWFjYjtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKSA6IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKSA6IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKSA6IDB4ZWFjZDtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0JykgOiAweGVhY2U7IC8vIFRPRE86IFdlIGRvbid0IHVzZSBBc3luY01vZGUgb3IgQ29uY3VycmVudE1vZGUgYW55bW9yZS4gVGhleSB3ZXJlIHRlbXBvcmFyeVxuLy8gKHVuc3RhYmxlKSBBUElzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQuIENhbiB3ZSByZW1vdmUgdGhlIHN5bWJvbHM/XG5cbnZhciBSRUFDVF9BU1lOQ19NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5hc3luY19tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb25jdXJyZW50X21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKSA6IDB4ZWFkMDtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKSA6IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0JykgOiAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubWVtbycpIDogMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKSA6IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYmxvY2snKSA6IDB4ZWFkOTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnVuZGFtZW50YWwnKSA6IDB4ZWFkNTtcbnZhciBSRUFDVF9SRVNQT05ERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnJlc3BvbmRlcicpIDogMHhlYWQ2O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zY29wZScpIDogMHhlYWQ3O1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IC8vIE5vdGU6IGl0cyB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyBpZiBpdCdzIGEgcG9seWZpbGwuXG4gIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9SRVNQT05ERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9TQ09QRV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0JMT0NLX1RZUEUpO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0FTWU5DX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0gLy8gQXN5bmNNb2RlIGlzIGRlcHJlY2F0ZWQgYWxvbmcgd2l0aCBpc0FzeW5jTW9kZVxuXG52YXIgQXN5bmNNb2RlID0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xudmFyIENvbmN1cnJlbnRNb2RlID0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE3Ky4gVXBkYXRlIHlvdXIgY29kZSB0byB1c2UgJyArICdSZWFjdElzLmlzQ29uY3VycmVudE1vZGUoKSBpbnN0ZWFkLiBJdCBoYXMgdGhlIGV4YWN0IHNhbWUgQVBJLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkgfHwgdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5cbmV4cG9ydHMuQXN5bmNNb2RlID0gQXN5bmNNb2RlO1xuZXhwb3J0cy5Db25jdXJyZW50TW9kZSA9IENvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5Db250ZXh0Q29uc3VtZXIgPSBDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IENvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuRWxlbWVudCA9IEVsZW1lbnQ7XG5leHBvcnRzLkZvcndhcmRSZWYgPSBGb3J3YXJkUmVmO1xuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuZXhwb3J0cy5MYXp5ID0gTGF6eTtcbmV4cG9ydHMuTWVtbyA9IE1lbW87XG5leHBvcnRzLlBvcnRhbCA9IFBvcnRhbDtcbmV4cG9ydHMuUHJvZmlsZXIgPSBQcm9maWxlcjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFN0cmljdE1vZGU7XG5leHBvcnRzLlN1c3BlbnNlID0gU3VzcGVuc2U7XG5leHBvcnRzLmlzQXN5bmNNb2RlID0gaXNBc3luY01vZGU7XG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBpc0NvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lciA9IGlzQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGlzQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGlzRm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7XG5leHBvcnRzLmlzTGF6eSA9IGlzTGF6eTtcbmV4cG9ydHMuaXNNZW1vID0gaXNNZW1vO1xuZXhwb3J0cy5pc1BvcnRhbCA9IGlzUG9ydGFsO1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gaXNQcm9maWxlcjtcbmV4cG9ydHMuaXNTdHJpY3RNb2RlID0gaXNTdHJpY3RNb2RlO1xuZXhwb3J0cy5pc1N1c3BlbnNlID0gaXNTdXNwZW5zZTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlO1xuZXhwb3J0cy50eXBlT2YgPSB0eXBlT2Y7XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsImltcG9ydCBlIGZyb21cInZvaWQtZWxlbWVudHNcIjt2YXIgdD0vXFxzKFteJ1wiL1xccz48XSs/KVtcXHMvPl18KFteXFxzPV0rKT1cXHM/KFwiLio/XCJ8Jy4qPycpL2c7ZnVuY3Rpb24gbihuKXt2YXIgcj17dHlwZTpcInRhZ1wiLG5hbWU6XCJcIix2b2lkRWxlbWVudDohMSxhdHRyczp7fSxjaGlsZHJlbjpbXX0saT1uLm1hdGNoKC88XFwvPyhbXlxcc10rPylbL1xccz5dLyk7aWYoaSYmKHIubmFtZT1pWzFdLChlW2lbMV1dfHxcIi9cIj09PW4uY2hhckF0KG4ubGVuZ3RoLTIpKSYmKHIudm9pZEVsZW1lbnQ9ITApLHIubmFtZS5zdGFydHNXaXRoKFwiIS0tXCIpKSl7dmFyIHM9bi5pbmRleE9mKFwiLS1cXHgzZVwiKTtyZXR1cm57dHlwZTpcImNvbW1lbnRcIixjb21tZW50Oi0xIT09cz9uLnNsaWNlKDQscyk6XCJcIn19Zm9yKHZhciBhPW5ldyBSZWdFeHAodCksYz1udWxsO251bGwhPT0oYz1hLmV4ZWMobikpOylpZihjWzBdLnRyaW0oKSlpZihjWzFdKXt2YXIgbz1jWzFdLnRyaW0oKSxsPVtvLFwiXCJdO28uaW5kZXhPZihcIj1cIik+LTEmJihsPW8uc3BsaXQoXCI9XCIpKSxyLmF0dHJzW2xbMF1dPWxbMV0sYS5sYXN0SW5kZXgtLX1lbHNlIGNbMl0mJihyLmF0dHJzW2NbMl1dPWNbM10udHJpbSgpLnN1YnN0cmluZygxLGNbM10ubGVuZ3RoLTEpKTtyZXR1cm4gcn12YXIgcj0vPFthLXpBLVowLTlcXC1cXCFcXC9dKD86XCJbXlwiXSpcInwnW14nXSonfFteJ1wiPl0pKj4vZyxpPS9eXFxzKiQvLHM9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBhKGUsdCl7c3dpdGNoKHQudHlwZSl7Y2FzZVwidGV4dFwiOnJldHVybiBlK3QuY29udGVudDtjYXNlXCJ0YWdcIjpyZXR1cm4gZSs9XCI8XCIrdC5uYW1lKyh0LmF0dHJzP2Z1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKXQucHVzaChuKyc9XCInK2Vbbl0rJ1wiJyk7cmV0dXJuIHQubGVuZ3RoP1wiIFwiK3Quam9pbihcIiBcIik6XCJcIn0odC5hdHRycyk6XCJcIikrKHQudm9pZEVsZW1lbnQ/XCIvPlwiOlwiPlwiKSx0LnZvaWRFbGVtZW50P2U6ZSt0LmNoaWxkcmVuLnJlZHVjZShhLFwiXCIpK1wiPC9cIit0Lm5hbWUrXCI+XCI7Y2FzZVwiY29tbWVudFwiOnJldHVybiBlK1wiXFx4M2MhLS1cIit0LmNvbW1lbnQrXCItLVxceDNlXCJ9fXZhciBjPXtwYXJzZTpmdW5jdGlvbihlLHQpe3R8fCh0PXt9KSx0LmNvbXBvbmVudHN8fCh0LmNvbXBvbmVudHM9cyk7dmFyIGEsYz1bXSxvPVtdLGw9LTEsbT0hMTtpZigwIT09ZS5pbmRleE9mKFwiPFwiKSl7dmFyIHU9ZS5pbmRleE9mKFwiPFwiKTtjLnB1c2goe3R5cGU6XCJ0ZXh0XCIsY29udGVudDotMT09PXU/ZTplLnN1YnN0cmluZygwLHUpfSl9cmV0dXJuIGUucmVwbGFjZShyLGZ1bmN0aW9uKHIscyl7aWYobSl7aWYociE9PVwiPC9cIithLm5hbWUrXCI+XCIpcmV0dXJuO209ITF9dmFyIHUsZj1cIi9cIiE9PXIuY2hhckF0KDEpLGg9ci5zdGFydHNXaXRoKFwiXFx4M2MhLS1cIikscD1zK3IubGVuZ3RoLGQ9ZS5jaGFyQXQocCk7aWYoaCl7dmFyIHY9bihyKTtyZXR1cm4gbDwwPyhjLnB1c2godiksYyk6KCh1PW9bbF0pLmNoaWxkcmVuLnB1c2godiksYyl9aWYoZiYmKGwrKyxcInRhZ1wiPT09KGE9bihyKSkudHlwZSYmdC5jb21wb25lbnRzW2EubmFtZV0mJihhLnR5cGU9XCJjb21wb25lbnRcIixtPSEwKSxhLnZvaWRFbGVtZW50fHxtfHwhZHx8XCI8XCI9PT1kfHxhLmNoaWxkcmVuLnB1c2goe3R5cGU6XCJ0ZXh0XCIsY29udGVudDplLnNsaWNlKHAsZS5pbmRleE9mKFwiPFwiLHApKX0pLDA9PT1sJiZjLnB1c2goYSksKHU9b1tsLTFdKSYmdS5jaGlsZHJlbi5wdXNoKGEpLG9bbF09YSksKCFmfHxhLnZvaWRFbGVtZW50KSYmKGw+LTEmJihhLnZvaWRFbGVtZW50fHxhLm5hbWU9PT1yLnNsaWNlKDIsLTEpKSYmKGwtLSxhPS0xPT09bD9jOm9bbF0pLCFtJiZcIjxcIiE9PWQmJmQpKXt1PS0xPT09bD9jOm9bbF0uY2hpbGRyZW47dmFyIHg9ZS5pbmRleE9mKFwiPFwiLHApLGc9ZS5zbGljZShwLC0xPT09eD92b2lkIDA6eCk7aS50ZXN0KGcpJiYoZz1cIiBcIiksKHg+LTEmJmwrdS5sZW5ndGg+PTB8fFwiIFwiIT09ZykmJnUucHVzaCh7dHlwZTpcInRleHRcIixjb250ZW50Omd9KX19KSxjfSxzdHJpbmdpZnk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUrYShcIlwiLHQpfSxcIlwiKX19O2V4cG9ydCBkZWZhdWx0IGM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odG1sLXBhcnNlLXN0cmluZ2lmeS5tb2R1bGUuanMubWFwXG4iLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHJlc3VsdCA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmcgPyBuYXRpdmVNaW4ocmVzdWx0LCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVib3VuY2U7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQWZyaWthYW5zIFthZl1cbi8vISBhdXRob3IgOiBXZXJuZXIgTW9sbGVudHplIDogaHR0cHM6Ly9naXRodWIuY29tL3dlcm5lcm1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBhZiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FmJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpZV9GZWJydWFyaWVfTWFhcnRfQXByaWxfTWVpX0p1bmllX0p1bGllX0F1Z3VzdHVzX1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTXJ0X0Fwcl9NZWlfSnVuX0p1bF9BdWdfU2VwX09rdF9Ob3ZfRGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1NvbmRhZ19NYWFuZGFnX0RpbnNkYWdfV29lbnNkYWdfRG9uZGVyZGFnX1ZyeWRhZ19TYXRlcmRhZycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1Nvbl9NYWFfRGluX1dvZV9Eb25fVnJ5X1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTb19NYV9EaV9Xb19Eb19Wcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL3ZtfG5tL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9ebm0kL2kudGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAndm0nIDogJ1ZNJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnbm0nIDogJ05NJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tWYW5kYWcgb21dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbTcO0cmUgb21dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbR2lzdGVyIG9tXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYWFzXSBkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvb3IgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGdlbGVkZScsXG4gICAgICAgICAgICBzOiBcIiduIHBhYXIgc2Vrb25kZXNcIixcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vrb25kZXMnLFxuICAgICAgICAgICAgbTogXCInbiBtaW51dXRcIixcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlJyxcbiAgICAgICAgICAgIGg6IFwiJ24gdXVyXCIsXG4gICAgICAgICAgICBoaDogJyVkIHVyZScsXG4gICAgICAgICAgICBkOiBcIiduIGRhZ1wiLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWUnLFxuICAgICAgICAgICAgTTogXCInbiBtYWFuZFwiLFxuICAgICAgICAgICAgTU06ICclZCBtYWFuZGUnLFxuICAgICAgICAgICAgeTogXCInbiBqYWFyXCIsXG4gICAgICAgICAgICB5eTogJyVkIGphYXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3RlfGRlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICtcbiAgICAgICAgICAgICAgICAobnVtYmVyID09PSAxIHx8IG51bWJlciA9PT0gOCB8fCBudW1iZXIgPj0gMjAgPyAnc3RlJyA6ICdkZScpXG4gICAgICAgICAgICApOyAvLyBUaGFua3MgdG8gSm9yaXMgUsO2bGluZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qanVwaXRlclxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1hYW5kYWcgaXMgZGllIGVlcnN0ZSBkYWcgdmFuIGRpZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBEaWUgd2VlayB3YXQgZGllIDRkZSBKYW51YXJpZSBiZXZhdCBpcyBkaWUgZWVyc3RlIHdlZWsgdmFuIGRpZSBqYWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFmO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoQWxnZXJpYSkgW2FyLWR6XVxuLy8hIGF1dGhvciA6IEFtaW5lIFJvdWtoOiBodHRwczovL2dpdGh1Yi5jb20vQW1pbmUyN1xuLy8hIGF1dGhvciA6IEFiZGVsIFNhaWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcbi8vISBhdXRob3IgOiBBaG1lZCBFbGtoYXRpYlxuLy8hIGF1dGhvciA6IGZvcmFiaSBodHRwczovL2dpdGh1Yi5jb20vZm9yYWJpXG4vLyEgYXV0aG9yIDogTm91cmVkZGluZSBMT1VBSEVESiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub3VyZWRkaW5lbVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHBsdXJhbEZvcm0gPSBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgcmV0dXJuIG4gPT09IDBcbiAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICA6IG4gPT09IDFcbiAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgOiBuID09PSAyXG4gICAgICAgICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICAgICAgICA6IG4gJSAxMDAgPj0gMyAmJiBuICUgMTAwIDw9IDEwXG4gICAgICAgICAgICAgICAgICAgICAgPyAzXG4gICAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDExXG4gICAgICAgICAgICAgICAgICAgICAgICA/IDRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogNTtcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFscyA9IHtcbiAgICAgICAgICAgIHM6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICAgICAgJ9ir2KfZhtmK2Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYq9in2YbZitiq2KfZhicsICfYq9in2YbZitiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYq9mI2KfZhicsXG4gICAgICAgICAgICAgICAgJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBtOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINiv2YLZitmC2KknLFxuICAgICAgICAgICAgICAgICfYr9mC2YrZgtipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2K/ZgtmK2YLYqtin2YYnLCAn2K/ZgtmK2YLYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICAgICAgJyVkINiv2YLZitmC2KknLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBoOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINiz2KfYudipJyxcbiAgICAgICAgICAgICAgICAn2LPYp9i52Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYs9in2LnYqtin2YYnLCAn2LPYp9i52KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINmK2YjZhScsXG4gICAgICAgICAgICAgICAgJ9mK2YjZhSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfZitmI2YXYp9mGJywgJ9mK2YjZhdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgICAgICclZCDZitmI2YXZi9inJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmFJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBNOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINi02YfYsScsXG4gICAgICAgICAgICAgICAgJ9i02YfYsSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfYtNmH2LHYp9mGJywgJ9i02YfYsdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LHYpycsXG4gICAgICAgICAgICAgICAgJyVkINi02YfYsScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYudin2YUnLFxuICAgICAgICAgICAgICAgICfYudin2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LnYp9mF2KfZhicsICfYudin2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LnZiNin2YUnLFxuICAgICAgICAgICAgICAgICclZCDYudin2YXZi9inJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mFJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbGl6ZSA9IGZ1bmN0aW9uICh1KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgIHZhciBmID0gcGx1cmFsRm9ybShudW1iZXIpLFxuICAgICAgICAgICAgICAgICAgICBzdHIgPSBwbHVyYWxzW3VdW3BsdXJhbEZvcm0obnVtYmVyKV07XG4gICAgICAgICAgICAgICAgaWYgKGYgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyW3dpdGhvdXRTdWZmaXggPyAwIDogMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRocyA9IFtcbiAgICAgICAgICAgICfYrNin2YbZgdmKJyxcbiAgICAgICAgICAgICfZgdmK2YHYsdmKJyxcbiAgICAgICAgICAgICfZhdin2LHYsycsXG4gICAgICAgICAgICAn2KPZgdix2YrZhCcsXG4gICAgICAgICAgICAn2YXYp9mKJyxcbiAgICAgICAgICAgICfYrNmI2KfZhicsXG4gICAgICAgICAgICAn2KzZiNmK2YTZitipJyxcbiAgICAgICAgICAgICfYo9mI2KonLFxuICAgICAgICAgICAgJ9iz2KjYqtmF2KjYsScsXG4gICAgICAgICAgICAn2KPZg9iq2YjYqNixJyxcbiAgICAgICAgICAgICfZhtmI2YHZhdio2LEnLFxuICAgICAgICAgICAgJ9iv2YrYs9mF2KjYsScsXG4gICAgICAgIF07XG5cbiAgICB2YXIgYXJEeiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLWR6Jywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC9cXHUyMDBGTS9cXHUyMDBGWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9mL2Kcg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2KjYudivICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBzczogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBtOiBwbHVyYWxpemUoJ20nKSxcbiAgICAgICAgICAgIG1tOiBwbHVyYWxpemUoJ20nKSxcbiAgICAgICAgICAgIGg6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgaGg6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgZDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBkZDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBNOiBwbHVyYWxpemUoJ00nKSxcbiAgICAgICAgICAgIE1NOiBwbHVyYWxpemUoJ00nKSxcbiAgICAgICAgICAgIHk6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICAgICAgeXk6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhckR6O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoS3V3YWl0KSBbYXIta3ddXG4vLyEgYXV0aG9yIDogTnVzcmV0IFBhcmxhazogaHR0cHM6Ly9naXRodWIuY29tL251c3JldHBhcmxha1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGFyS3cgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1rdycsIHtcbiAgICAgICAgbW9udGhzOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KrZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9in2K3Yr1/Yp9iq2YbZitmGX9ir2YTYp9ir2KfYoV/Yp9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhckt3O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoTGlieWEpIFthci1seV1cbi8vISBhdXRob3IgOiBBbGkgSG1lcjogaHR0cHM6Ly9naXRodWIuY29tL2tpa29hbmlzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJzEnLFxuICAgICAgICAgICAgMjogJzInLFxuICAgICAgICAgICAgMzogJzMnLFxuICAgICAgICAgICAgNDogJzQnLFxuICAgICAgICAgICAgNTogJzUnLFxuICAgICAgICAgICAgNjogJzYnLFxuICAgICAgICAgICAgNzogJzcnLFxuICAgICAgICAgICAgODogJzgnLFxuICAgICAgICAgICAgOTogJzknLFxuICAgICAgICAgICAgMDogJzAnLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxGb3JtID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIHJldHVybiBuID09PSAwXG4gICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgOiBuID09PSAxXG4gICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgIDogbiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMFxuICAgICAgICAgICAgICAgICAgICAgID8gM1xuICAgICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAxMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyA0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IDU7XG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbHMgPSB7XG4gICAgICAgICAgICBzOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICfYq9in2YbZitipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2KvYp9mG2YrYqtin2YYnLCAn2KvYp9mG2YrYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KvZiNin2YYnLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAn2K/ZgtmK2YLYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iv2YLZitmC2KrYp9mGJywgJ9iv2YLZitmC2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJ9iz2KfYudipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2LPYp9i52KrYp9mGJywgJ9iz2KfYudiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDZitmI2YUnLFxuICAgICAgICAgICAgICAgICfZitmI2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2YrZiNmF2KfZhicsICfZitmI2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgTTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYtNmH2LEnLFxuICAgICAgICAgICAgICAgICfYtNmH2LEg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LTZh9ix2KfZhicsICfYtNmH2LHZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ix2KcnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LEnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHk6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LnYp9mFJyxcbiAgICAgICAgICAgICAgICAn2LnYp9mFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i52KfZhdin2YYnLCAn2LnYp9mF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i52YjYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxpemUgPSBmdW5jdGlvbiAodSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IHBsdXJhbEZvcm0obnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcGx1cmFsc1t1XVtwbHVyYWxGb3JtKG51bWJlcildO1xuICAgICAgICAgICAgICAgIGlmIChmID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0clt3aXRob3V0U3VmZml4ID8gMCA6IDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBtb250aHMgPSBbXG4gICAgICAgICAgICAn2YrZhtin2YrYsScsXG4gICAgICAgICAgICAn2YHYqNix2KfZitixJyxcbiAgICAgICAgICAgICfZhdin2LHYsycsXG4gICAgICAgICAgICAn2KPYqNix2YrZhCcsXG4gICAgICAgICAgICAn2YXYp9mK2YgnLFxuICAgICAgICAgICAgJ9mK2YjZhtmK2YgnLFxuICAgICAgICAgICAgJ9mK2YjZhNmK2YgnLFxuICAgICAgICAgICAgJ9ij2LrYs9i32LMnLFxuICAgICAgICAgICAgJ9iz2KjYqtmF2KjYsScsXG4gICAgICAgICAgICAn2KPZg9iq2YjYqNixJyxcbiAgICAgICAgICAgICfZhtmI2YHZhdio2LEnLFxuICAgICAgICAgICAgJ9iv2YrYs9mF2KjYsScsXG4gICAgICAgIF07XG5cbiAgICB2YXIgYXJMeSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLWx5Jywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC9cXHUyMDBGTS9cXHUyMDBGWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9mL2Kcg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2KjYudivICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBzczogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBtOiBwbHVyYWxpemUoJ20nKSxcbiAgICAgICAgICAgIG1tOiBwbHVyYWxpemUoJ20nKSxcbiAgICAgICAgICAgIGg6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgaGg6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgZDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBkZDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBNOiBwbHVyYWxpemUoJ00nKSxcbiAgICAgICAgICAgIE1NOiBwbHVyYWxpemUoJ00nKSxcbiAgICAgICAgICAgIHk6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICAgICAgeXk6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhckx5O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoTW9yb2NjbykgW2FyLW1hXVxuLy8hIGF1dGhvciA6IEVsRmFkaWxpIFlhc3NpbmUgOiBodHRwczovL2dpdGh1Yi5jb20vRWxGYWRpbGlZXG4vLyEgYXV0aG9yIDogQWJkZWwgU2FpZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBhck1hID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXItbWEnLCB7XG4gICAgICAgIG1vbnRoczogJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mKX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiNiyX9i62LTYql/YtNiq2YbYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YbYqNixX9iv2KzZhtio2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mKX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiNiyX9i62LTYql/YtNiq2YbYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YbYqNixX9iv2KzZhtio2LEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYp9it2K9f2KfYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KfYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/YpyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfZgdmKICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogJ9ir2YjYp9mGJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBtOiAn2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgaDogJ9iz2KfYudipJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICBkOiAn2YrZiNmFJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgTTogJ9i02YfYsScsXG4gICAgICAgICAgICBNTTogJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgIHk6ICfYs9mG2KknLFxuICAgICAgICAgICAgeXk6ICclZCDYs9mG2YjYp9iqJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyTWE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJhYmljIChQYWxlc3RpbmUpIFthci1wc11cbi8vISBhdXRob3IgOiBNYWpkIEFsLVNoaWhhYmkgOiBodHRwczovL2dpdGh1Yi5jb20vbWFqZGFsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ9mhJyxcbiAgICAgICAgICAgIDI6ICfZoicsXG4gICAgICAgICAgICAzOiAn2aMnLFxuICAgICAgICAgICAgNDogJ9mkJyxcbiAgICAgICAgICAgIDU6ICfZpScsXG4gICAgICAgICAgICA2OiAn2aYnLFxuICAgICAgICAgICAgNzogJ9mnJyxcbiAgICAgICAgICAgIDg6ICfZqCcsXG4gICAgICAgICAgICA5OiAn2aknLFxuICAgICAgICAgICAgMDogJ9mgJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAgICAgJ9miJzogJzInLFxuICAgICAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAgICAgJ9mlJzogJzUnLFxuICAgICAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAgICAgJ9moJzogJzgnLFxuICAgICAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAgICAgJ9mgJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGFyUHMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1wcycsIHtcbiAgICAgICAgbW9udGhzOiAn2YPYp9mG2YjZhiDYp9mE2KvYp9mG2Ypf2LTYqNin2Ldf2KLYsNin2LFf2YbZitiz2KfZhl/Yo9mK2ZHYp9ixX9it2LLZitix2KfZhl/YqtmF2ZHZiNiyX9ii2Khf2KPZitmE2YjZhF/Yqti02LHZiiDYp9mE2KPZiNmR2YRf2KrYtNix2YrZhiDYp9mE2KvYp9mG2Ypf2YPYp9mG2YjZhiDYp9mE2KPZiNmR2YQnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9mD2aJf2LTYqNin2Ldf2KLYsNin2LFf2YbZitiz2KfZhl/Yo9mK2ZHYp9ixX9it2LLZitix2KfZhl/YqtmF2ZHZiNiyX9ii2Khf2KPZitmE2YjZhF/YqtmhX9iq2aJf2YPZoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b2aPZpNml2abZp9mo2anZoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcnKSAvLyByZXZlcnNlZCBzaW5jZSBuZWdhdGl2ZSBsb29rYmVoaW5kIG5vdCBzdXBwb3J0ZWQgZXZlcnl3aGVyZVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9mh2aJdKD8hW1xcdTA2MmFcXHUwNjQzXSkvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhclBzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyAoU2F1ZGkgQXJhYmlhKSBbYXItc2FdXG4vLyEgYXV0aG9yIDogU3VoYWlsIEFsa293YWlsZWV0IDogaHR0cHM6Ly9naXRodWIuY29tL3hzb2hcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn2aEnLFxuICAgICAgICAgICAgMjogJ9miJyxcbiAgICAgICAgICAgIDM6ICfZoycsXG4gICAgICAgICAgICA0OiAn2aQnLFxuICAgICAgICAgICAgNTogJ9mlJyxcbiAgICAgICAgICAgIDY6ICfZpicsXG4gICAgICAgICAgICA3OiAn2acnLFxuICAgICAgICAgICAgODogJ9moJyxcbiAgICAgICAgICAgIDk6ICfZqScsXG4gICAgICAgICAgICAwOiAn2aAnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn2aEnOiAnMScsXG4gICAgICAgICAgICAn2aInOiAnMicsXG4gICAgICAgICAgICAn2aMnOiAnMycsXG4gICAgICAgICAgICAn2aQnOiAnNCcsXG4gICAgICAgICAgICAn2aUnOiAnNScsXG4gICAgICAgICAgICAn2aYnOiAnNicsXG4gICAgICAgICAgICAn2acnOiAnNycsXG4gICAgICAgICAgICAn2agnOiAnOCcsXG4gICAgICAgICAgICAn2aknOiAnOScsXG4gICAgICAgICAgICAn2aAnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgYXJTYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLXNhJywge1xuICAgICAgICBtb250aHM6ICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZitmIX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiF/Yo9i62LPYt9izX9iz2KjYqtmF2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmB2YXYqNixX9iv2YrYs9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2YrZiF/ZitmI2YbZitmIX9mK2YjZhNmK2Yhf2KPYutiz2LfYs1/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b2aHZotmj2aTZpdmm2afZqNmp2aBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyU2E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlICA6ICBBcmFiaWMgKFR1bmlzaWEpIFthci10bl1cbi8vISBhdXRob3IgOiBOYWRlciBUb3VrYWJyaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9uYWRlcmlvXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgYXJUbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLXRuJywge1xuICAgICAgICBtb250aHM6ICfYrNin2YbZgdmKX9mB2YrZgdix2Ypf2YXYp9ix2LNf2KPZgdix2YrZhF/Zhdin2Ypf2KzZiNin2YZf2KzZiNmK2YTZitipX9ij2YjYql/Ys9io2KrZhdio2LFf2KPZg9iq2YjYqNixX9mG2YjZgdmF2KjYsV/Yr9mK2LPZhdio2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9is2KfZhtmB2Ypf2YHZitmB2LHZil/Zhdin2LHYs1/Yo9mB2LHZitmEX9mF2KfZil/YrNmI2KfZhl/YrNmI2YrZhNmK2Klf2KPZiNiqX9iz2KjYqtmF2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmB2YXYqNixX9iv2YrYs9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9ij2K3Yr1/Ypdir2YbZitmGX9ir2YTYp9ir2KfYoV/Yo9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJUbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgW2FyXVxuLy8hIGF1dGhvciA6IEFiZGVsIFNhaWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcbi8vISBhdXRob3IgOiBBaG1lZCBFbGtoYXRpYlxuLy8hIGF1dGhvciA6IGZvcmFiaSBodHRwczovL2dpdGh1Yi5jb20vZm9yYWJpXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ9mhJyxcbiAgICAgICAgICAgIDI6ICfZoicsXG4gICAgICAgICAgICAzOiAn2aMnLFxuICAgICAgICAgICAgNDogJ9mkJyxcbiAgICAgICAgICAgIDU6ICfZpScsXG4gICAgICAgICAgICA2OiAn2aYnLFxuICAgICAgICAgICAgNzogJ9mnJyxcbiAgICAgICAgICAgIDg6ICfZqCcsXG4gICAgICAgICAgICA5OiAn2aknLFxuICAgICAgICAgICAgMDogJ9mgJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAgICAgJ9miJzogJzInLFxuICAgICAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAgICAgJ9mlJzogJzUnLFxuICAgICAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAgICAgJ9moJzogJzgnLFxuICAgICAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAgICAgJ9mgJzogJzAnLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxGb3JtID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIHJldHVybiBuID09PSAwXG4gICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgOiBuID09PSAxXG4gICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgIDogbiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMFxuICAgICAgICAgICAgICAgICAgICAgID8gM1xuICAgICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAxMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyA0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IDU7XG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbHMgPSB7XG4gICAgICAgICAgICBzOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICfYq9in2YbZitipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2KvYp9mG2YrYqtin2YYnLCAn2KvYp9mG2YrYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KvZiNin2YYnLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAn2K/ZgtmK2YLYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iv2YLZitmC2KrYp9mGJywgJ9iv2YLZitmC2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiv2YLYp9im2YInLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJ9iz2KfYudipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2LPYp9i52KrYp9mGJywgJ9iz2KfYudiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZDogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDZitmI2YUnLFxuICAgICAgICAgICAgICAgICfZitmI2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2YrZiNmF2KfZhicsICfZitmI2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgTTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYtNmH2LEnLFxuICAgICAgICAgICAgICAgICfYtNmH2LEg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LTZh9ix2KfZhicsICfYtNmH2LHZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ix2KcnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LEnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHk6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LnYp9mFJyxcbiAgICAgICAgICAgICAgICAn2LnYp9mFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i52KfZhdin2YYnLCAn2LnYp9mF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i52YjYp9mFJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mF2YvYpycsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhScsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxpemUgPSBmdW5jdGlvbiAodSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IHBsdXJhbEZvcm0obnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcGx1cmFsc1t1XVtwbHVyYWxGb3JtKG51bWJlcildO1xuICAgICAgICAgICAgICAgIGlmIChmID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0clt3aXRob3V0U3VmZml4ID8gMCA6IDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBtb250aHMgPSBbXG4gICAgICAgICAgICAn2YrZhtin2YrYsScsXG4gICAgICAgICAgICAn2YHYqNix2KfZitixJyxcbiAgICAgICAgICAgICfZhdin2LHYsycsXG4gICAgICAgICAgICAn2KPYqNix2YrZhCcsXG4gICAgICAgICAgICAn2YXYp9mK2YgnLFxuICAgICAgICAgICAgJ9mK2YjZhtmK2YgnLFxuICAgICAgICAgICAgJ9mK2YjZhNmK2YgnLFxuICAgICAgICAgICAgJ9ij2LrYs9i32LMnLFxuICAgICAgICAgICAgJ9iz2KjYqtmF2KjYsScsXG4gICAgICAgICAgICAn2KPZg9iq2YjYqNixJyxcbiAgICAgICAgICAgICfZhtmI2YHZhdio2LEnLFxuICAgICAgICAgICAgJ9iv2YrYs9mF2KjYsScsXG4gICAgICAgIF07XG5cbiAgICB2YXIgYXIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhcicsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QvXFx1MjAwRk0vXFx1MjAwRllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YtXzZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9mFJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KfZhNmK2YjZhSDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9i62K/Zi9inINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9io2LnYryAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgc3M6IHBsdXJhbGl6ZSgncycpLFxuICAgICAgICAgICAgbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBtbTogcGx1cmFsaXplKCdtJyksXG4gICAgICAgICAgICBoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGhoOiBwbHVyYWxpemUoJ2gnKSxcbiAgICAgICAgICAgIGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgZGQ6IHBsdXJhbGl6ZSgnZCcpLFxuICAgICAgICAgICAgTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICBNTTogcGx1cmFsaXplKCdNJyksXG4gICAgICAgICAgICB5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgICAgIHl5OiBwbHVyYWxpemUoJ3knKSxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9mh2aLZo9mk2aXZptmn2ajZqdmgXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXplcmJhaWphbmkgW2F6XVxuLy8hIGF1dGhvciA6IHRvcGNoaXlldiA6IGh0dHBzOi8vZ2l0aHViLmNvbS90b3BjaGl5ZXZcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMTogJy1pbmNpJyxcbiAgICAgICAgNTogJy1pbmNpJyxcbiAgICAgICAgODogJy1pbmNpJyxcbiAgICAgICAgNzA6ICctaW5jaScsXG4gICAgICAgIDgwOiAnLWluY2knLFxuICAgICAgICAyOiAnLW5jaScsXG4gICAgICAgIDc6ICctbmNpJyxcbiAgICAgICAgMjA6ICctbmNpJyxcbiAgICAgICAgNTA6ICctbmNpJyxcbiAgICAgICAgMzogJy3DvG5jw7wnLFxuICAgICAgICA0OiAnLcO8bmPDvCcsXG4gICAgICAgIDEwMDogJy3DvG5jw7wnLFxuICAgICAgICA2OiAnLW5jxLEnLFxuICAgICAgICA5OiAnLXVuY3UnLFxuICAgICAgICAxMDogJy11bmN1JyxcbiAgICAgICAgMzA6ICctdW5jdScsXG4gICAgICAgIDYwOiAnLcSxbmPEsScsXG4gICAgICAgIDkwOiAnLcSxbmPEsScsXG4gICAgfTtcblxuICAgIHZhciBheiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2F6Jywge1xuICAgICAgICBtb250aHM6ICd5YW52YXJfZmV2cmFsX21hcnRfYXByZWxfbWF5X2l5dW5faXl1bF9hdnF1c3Rfc2VudHlhYnJfb2t0eWFicl9ub3lhYnJfZGVrYWJyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ3lhbl9mZXZfbWFyX2Fwcl9tYXlfaXluX2l5bF9hdnFfc2VuX29rdF9ub3lfZGVrJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdCYXphcl9CYXphciBlcnTJmXNpX8OHyZlyxZ/JmW5iyZkgYXjFn2FtxLFfw4fJmXLFn8mZbmLJmV9Dw7xtyZkgYXjFn2FtxLFfQ8O8bcmZX8WeyZluYsmZJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdCYXpfQnpFX8OHQXhfw4fJmXJfQ0F4X0PDvG1fxZ7JmW4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnQnpfQkVfw4dBX8OHyZlfQ0FfQ8O8X8WeyZknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tidWfDvG4gc2FhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tzYWJhaCBzYWF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tnyZlsyZluIGjJmWZ0yZldIGRkZGQgW3NhYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZMO8bsmZbl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdba2XDp8mZbiBoyZlmdMmZXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHNvbnJhJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDJmXZ2yZlsJyxcbiAgICAgICAgICAgIHM6ICdiaXIgbmXDp8mZIHNhbml5yZknLFxuICAgICAgICAgICAgc3M6ICclZCBzYW5pecmZJyxcbiAgICAgICAgICAgIG06ICdiaXIgZMmZcWlxyZknLFxuICAgICAgICAgICAgbW06ICclZCBkyZlxaXHJmScsXG4gICAgICAgICAgICBoOiAnYmlyIHNhYXQnLFxuICAgICAgICAgICAgaGg6ICclZCBzYWF0JyxcbiAgICAgICAgICAgIGQ6ICdiaXIgZ8O8bicsXG4gICAgICAgICAgICBkZDogJyVkIGfDvG4nLFxuICAgICAgICAgICAgTTogJ2JpciBheScsXG4gICAgICAgICAgICBNTTogJyVkIGF5JyxcbiAgICAgICAgICAgIHk6ICdiaXIgaWwnLFxuICAgICAgICAgICAgeXk6ICclZCBpbCcsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9nZWPJmXxzyZloyZlyfGfDvG5kw7x6fGF4xZ9hbS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKGfDvG5kw7x6fGF4xZ9hbSkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZ2VjyZknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3PJmWjJmXInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2fDvG5kw7x6JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdheMWfYW0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKMSxbmPEsXxpbmNpfG5jaXzDvG5jw7x8bmPEsXx1bmN1KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHplcm9cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3EsW5jxLEnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBiID0gKG51bWJlciAlIDEwMCkgLSBhLFxuICAgICAgICAgICAgICAgIGMgPSBudW1iZXIgPj0gMTAwID8gMTAwIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0gfHwgc3VmZml4ZXNbY10pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXo7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQmVsYXJ1c2lhbiBbYmVdXG4vLyEgYXV0aG9yIDogRG1pdHJ5IERlbWlkb3YgOiBodHRwczovL2dpdGh1Yi5jb20vZGVtaWRvdjkxXG4vLyEgYXV0aG9yOiBQcmFsZXNrYTogaHR0cDovL3ByYWxlc2thLnByby9cbi8vISBBdXRob3IgOiBNZW5lbGlvbiBFbGVuc8O6bGUgOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcGx1cmFsKHdvcmQsIG51bSkge1xuICAgICAgICB2YXIgZm9ybXMgPSB3b3JkLnNwbGl0KCdfJyk7XG4gICAgICAgIHJldHVybiBudW0gJSAxMCA9PT0gMSAmJiBudW0gJSAxMDAgIT09IDExXG4gICAgICAgICAgICA/IGZvcm1zWzBdXG4gICAgICAgICAgICA6IG51bSAlIDEwID49IDIgJiYgbnVtICUgMTAgPD0gNCAmJiAobnVtICUgMTAwIDwgMTAgfHwgbnVtICUgMTAwID49IDIwKVxuICAgICAgICAgICAgICA/IGZvcm1zWzFdXG4gICAgICAgICAgICAgIDogZm9ybXNbMl07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHNzOiB3aXRob3V0U3VmZml4ID8gJ9GB0LXQutGD0L3QtNCwX9GB0LXQutGD0L3QtNGLX9GB0LXQutGD0L3QtCcgOiAn0YHQtdC60YPQvdC00YNf0YHQtdC60YPQvdC00Ytf0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG1tOiB3aXRob3V0U3VmZml4ID8gJ9GF0LLRltC70ZbQvdCwX9GF0LLRltC70ZbQvdGLX9GF0LLRltC70ZbQvScgOiAn0YXQstGW0LvRltC90YNf0YXQstGW0LvRltC90Ytf0YXQstGW0LvRltC9JyxcbiAgICAgICAgICAgIGhoOiB3aXRob3V0U3VmZml4ID8gJ9Cz0LDQtNC30ZbQvdCwX9Cz0LDQtNC30ZbQvdGLX9Cz0LDQtNC30ZbQvScgOiAn0LPQsNC00LfRltC90YNf0LPQsNC00LfRltC90Ytf0LPQsNC00LfRltC9JyxcbiAgICAgICAgICAgIGRkOiAn0LTQt9C10L3RjF/QtNC90ZZf0LTQt9GR0L0nLFxuICAgICAgICAgICAgTU06ICfQvNC10YHRj9GGX9C80LXRgdGP0YbRi1/QvNC10YHRj9GG0LDRnicsXG4gICAgICAgICAgICB5eTogJ9Cz0L7QtF/Qs9Cw0LTRi1/Qs9Cw0LTQvtGeJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ20nKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfRhdCy0ZbQu9GW0L3QsCcgOiAn0YXQstGW0LvRltC90YMnO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2gnKSB7XG4gICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICfQs9Cw0LTQt9GW0L3QsCcgOiAn0LPQsNC00LfRltC90YMnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIHBsdXJhbChmb3JtYXRba2V5XSwgK251bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYmUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdiZScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfRgdGC0YPQtNC30LXQvdGPX9C70Y7RgtCw0LPQsF/RgdCw0LrQsNCy0ZbQutCwX9C60YDQsNGB0LDQstGW0LrQsF/RgtGA0LDRntC90Y9f0YfRjdGA0LLQtdC90Y9f0LvRltC/0LXQvdGPX9C20L3RltGe0L3Rj1/QstC10YDQsNGB0L3Rj1/QutCw0YHRgtGA0YvRh9C90ZbQutCwX9C70ZbRgdGC0LDQv9Cw0LTQsF/RgdC90LXQttC90Y8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9GB0YLRg9C00LfQtdC90Yxf0LvRjtGC0Ytf0YHQsNC60LDQstGW0Lpf0LrRgNCw0YHQsNCy0ZbQul/RgtGA0LDQstC10L3RjF/Rh9GN0YDQstC10L3RjF/Qu9GW0L/QtdC90Yxf0LbQvdGW0LLQtdC90Yxf0LLQtdGA0LDRgdC10L3RjF/QutCw0YHRgtGA0YvRh9C90ZbQul/Qu9GW0YHRgtCw0L/QsNC0X9GB0L3QtdC20LDQvdGMJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn0YHRgtGD0LRf0LvRjtGCX9GB0LDQul/QutGA0LDRgV/RgtGA0LDQsl/Rh9GN0YDQsl/Qu9GW0L9f0LbQvdGW0LJf0LLQtdGAX9C60LDRgdGCX9C70ZbRgdGCX9GB0L3QtdC2Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czoge1xuICAgICAgICAgICAgZm9ybWF0OiAn0L3Rj9C00LfQtdC70Y5f0L/QsNC90Y/QtNC30LXQu9Cw0Lpf0LDRntGC0L7RgNCw0Lpf0YHQtdGA0LDQtNGDX9GH0LDRhtCy0LXRgF/Qv9GP0YLQvdGW0YbRg1/RgdGD0LHQvtGC0YMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9C90Y/QtNC30LXQu9GPX9C/0LDQvdGP0LTQt9C10LvQsNC6X9Cw0Z7RgtC+0YDQsNC6X9GB0LXRgNCw0LTQsF/Rh9Cw0YbQstC10YBf0L/Rj9GC0L3RltGG0LBf0YHRg9Cx0L7RgtCwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvXFxbID9b0KPRg9GeXSA/KD860LzRltC90YPQu9GD0Y580L3QsNGB0YLRg9C/0L3Rg9GOKT8gP1xcXSA/ZGRkZC8sXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQvdC0X9C/0L1f0LDRgl/RgdGAX9GH0YZf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9C90LRf0L/QvV/QsNGCX9GB0YBf0YfRhl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVkg0LMuJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZINCzLiwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZINCzLiwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQodGR0L3QvdGPINGeXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9CX0LDRntGC0YDQsCDRnl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQo9GH0L7RgNCwINGeXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW9CjXSBkZGRkIFvRnl0gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CjINC80ZbQvdGD0LvRg9GOXSBkZGRkIFvRnl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0KMg0LzRltC90YPQu9GLXSBkZGRkIFvRnl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9C/0YDQsNC3ICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDRgtCw0LzRgycsXG4gICAgICAgICAgICBzOiAn0L3QtdC60LDQu9GM0LrRliDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGhoOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZDogJ9C00LfQtdC90YwnLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNOiAn0LzQtdGB0Y/RhicsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHk6ICfQs9C+0LQnLFxuICAgICAgICAgICAgeXk6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/QvdC+0YfRi3zRgNCw0L3RltGG0Yt80LTQvdGPfNCy0LXRh9Cw0YDQsC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNC00L3Rj3zQstC10YfQsNGA0LApJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C90L7Rh9GLJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRgNCw0L3RltGG0YsnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C00L3Rjyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LLQtdGH0LDRgNCwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjRlnzRi3zQs9CwKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG51bWJlciAlIDEwID09PSAyIHx8IG51bWJlciAlIDEwID09PSAzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyICUgMTAwICE9PSAxMiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyICUgMTAwICE9PSAxM1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBudW1iZXIgKyAnLdGWJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgKyAnLdGLJztcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LPQsCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJlO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJ1bGdhcmlhbiBbYmddXG4vLyEgYXV0aG9yIDogS3Jhc2VuIEJvcmlzb3YgOiBodHRwczovL2dpdGh1Yi5jb20va3JhelxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGJnID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYmcnLCB7XG4gICAgICAgIG1vbnRoczogJ9GP0L3Rg9Cw0YDQuF/RhNC10LLRgNGD0LDRgNC4X9C80LDRgNGCX9Cw0L/RgNC40Ltf0LzQsNC5X9GO0L3QuF/RjtC70Lhf0LDQstCz0YPRgdGCX9GB0LXQv9GC0LXQvNCy0YDQuF/QvtC60YLQvtC80LLRgNC4X9C90L7QtdC80LLRgNC4X9C00LXQutC10LzQstGA0LgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0Y/QvdGDX9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDQuV/RjtC90Lhf0Y7Qu9C4X9Cw0LLQs1/RgdC10L9f0L7QutGCX9C90L7QtV/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn0L3QtdC00LXQu9GPX9C/0L7QvdC10LTQtdC70L3QuNC6X9Cy0YLQvtGA0L3QuNC6X9GB0YDRj9C00LBf0YfQtdGC0LLRitGA0YLRitC6X9C/0LXRgtGK0Lpf0YHRitCx0L7RgtCwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0L3QtdC0X9C/0L7QvV/QstGC0L5f0YHRgNGPX9GH0LXRgl/Qv9C10YJf0YHRitCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9C90LRf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9CU0L3QtdGBINCyXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Cj0YLRgNC1INCyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9CyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9CS0YfQtdGA0LAg0LJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQnNC40L3QsNC70LDRgtCwXSBkZGRkIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQnNC40L3QsNC70LjRj10gZGRkZCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfRgdC70LXQtCAlcycsXG4gICAgICAgICAgICBwYXN0OiAn0L/RgNC10LTQuCAlcycsXG4gICAgICAgICAgICBzOiAn0L3Rj9C60L7Qu9C60L4g0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgc3M6ICclZCDRgdC10LrRg9C90LTQuCcsXG4gICAgICAgICAgICBtOiAn0LzQuNC90YPRgtCwJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LzQuNC90YPRgtC4JyxcbiAgICAgICAgICAgIGg6ICfRh9Cw0YEnLFxuICAgICAgICAgICAgaGg6ICclZCDRh9Cw0YHQsCcsXG4gICAgICAgICAgICBkOiAn0LTQtdC9JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0LTQtdC90LAnLFxuICAgICAgICAgICAgdzogJ9GB0LXQtNC80LjRhtCwJyxcbiAgICAgICAgICAgIHd3OiAnJWQg0YHQtdC00LzQuNGG0LgnLFxuICAgICAgICAgICAgTTogJ9C80LXRgdC10YYnLFxuICAgICAgICAgICAgTU06ICclZCDQvNC10YHQtdGG0LAnLFxuICAgICAgICAgICAgeTogJ9Cz0L7QtNC40L3QsCcsXG4gICAgICAgICAgICB5eTogJyVkINCz0L7QtNC40L3QuCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0LXQsnzQtdC9fNGC0Lh80LLQuHzRgNC4fNC80LgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGxhc3REaWdpdCA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGxhc3QyRGlnaXRzID0gbnVtYmVyICUgMTAwO1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10LInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC10L0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0MkRpZ2l0cyA+IDEwICYmIGxhc3QyRGlnaXRzIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGA0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDcgfHwgbGFzdERpZ2l0ID09PSA4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LzQuCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGC0LgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYmc7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQmFtYmFyYSBbYm1dXG4vLyEgYXV0aG9yIDogRXN0ZWxsZSBDb21tZW50IDogaHR0cHM6Ly9naXRodWIuY29tL2VzdGVsbGVjb21tZW50XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgYm0gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdibScsIHtcbiAgICAgICAgbW9udGhzOiAnWmFud3V5ZWthbG9fRmV3dXJ1eWVrYWxvX01hcmlzaWthbG9fQXdpcmlsaWthbG9fTcmba2Fsb19adXfJm25rYWxvX1p1bHV5ZWthbG9fVXRpa2Fsb19TyZt0YW5idXJ1a2Fsb1/JlGt1dMmUYnVydWthbG9fTm93YW5idXJ1a2Fsb19EZXNhbmJ1cnVrYWxvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ1phbl9GZXdfTWFyX0F3aV9NyZtfWnV3X1p1bF9VdGlfU8mbdF/JlGt1X05vd19EZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnS2FyaV9OdMmbbsmbbl9UYXJhdGFfQXJhYmFfQWxhbWlzYV9KdW1hX1NpYmlyaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0thcl9OdMmbX1Rhcl9BcmFfQWxhX0p1bV9TaWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnS2FfTnRfVGFfQXJfQWxfSnVfU2knLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnTU1NTSBbdGlsZV0gRCBbc2FuXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ01NTU0gW3RpbGVdIEQgW3Nhbl0gWVlZWSBbbMmbcsmbXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBNTU1NIFt0aWxlXSBEIFtzYW5dIFlZWVkgW2zJm3LJm10gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tCaSBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbU2luaSBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbZG9uIGzJm3LJm10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tLdW51IGzJm3LJm10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFt0yZttyZtuZW4gbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIGvJlG7JlCcsXG4gICAgICAgICAgICBwYXN0OiAnYSBiyZsgJXMgYsmUJyxcbiAgICAgICAgICAgIHM6ICdzYW5nYSBkYW1hIGRhbWEnLFxuICAgICAgICAgICAgc3M6ICdzZWtvbmRpICVkJyxcbiAgICAgICAgICAgIG06ICdtaW5pdGkga2VsZW4nLFxuICAgICAgICAgICAgbW06ICdtaW5pdGkgJWQnLFxuICAgICAgICAgICAgaDogJ2zJm3LJmyBrZWxlbicsXG4gICAgICAgICAgICBoaDogJ2zJm3LJmyAlZCcsXG4gICAgICAgICAgICBkOiAndGlsZSBrZWxlbicsXG4gICAgICAgICAgICBkZDogJ3RpbGUgJWQnLFxuICAgICAgICAgICAgTTogJ2thbG8ga2VsZW4nLFxuICAgICAgICAgICAgTU06ICdrYWxvICVkJyxcbiAgICAgICAgICAgIHk6ICdzYW4ga2VsZW4nLFxuICAgICAgICAgICAgeXk6ICdzYW4gJWQnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYm07XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQmVuZ2FsaSAoQmFuZ2xhZGVzaCkgW2JuLWJkXVxuLy8hIGF1dGhvciA6IEFzcmFmIEhvc3NhaW4gUGF0b2FyeSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hc2h3b29sZm9yZFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgp6cnLFxuICAgICAgICAgICAgMjogJ+CnqCcsXG4gICAgICAgICAgICAzOiAn4KepJyxcbiAgICAgICAgICAgIDQ6ICfgp6onLFxuICAgICAgICAgICAgNTogJ+CnqycsXG4gICAgICAgICAgICA2OiAn4KesJyxcbiAgICAgICAgICAgIDc6ICfgp60nLFxuICAgICAgICAgICAgODogJ+CnricsXG4gICAgICAgICAgICA5OiAn4KevJyxcbiAgICAgICAgICAgIDA6ICfgp6YnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KenJzogJzEnLFxuICAgICAgICAgICAgJ+CnqCc6ICcyJyxcbiAgICAgICAgICAgICfgp6knOiAnMycsXG4gICAgICAgICAgICAn4KeqJzogJzQnLFxuICAgICAgICAgICAgJ+Cnqyc6ICc1JyxcbiAgICAgICAgICAgICfgp6wnOiAnNicsXG4gICAgICAgICAgICAn4KetJzogJzcnLFxuICAgICAgICAgICAgJ+Cnric6ICc4JyxcbiAgICAgICAgICAgICfgp68nOiAnOScsXG4gICAgICAgICAgICAn4KemJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGJuQmQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdibi1iZCcsIHtcbiAgICAgICAgbW9udGhzOiAn4Kac4Ka+4Kao4KeB4Kef4Ka+4Kaw4Ka/X+Cmq+Cnh+CmrOCnjeCmsOCngeCnn+CmvuCmsOCmv1/gpq7gpr7gprDgp43gpppf4KaP4Kaq4KeN4Kaw4Ka/4KayX+CmruCnh1/gppzgp4Hgpqhf4Kac4KeB4Kay4Ka+4KaHX+CmhuCml+CmuOCnjeCmn1/gprjgp4fgpqrgp43gpp/gp4fgpq7gp43gpqzgprBf4KaF4KaV4KeN4Kaf4KeL4Kas4KawX+CmqOCmreCnh+CmruCnjeCmrOCmsF/gpqHgpr/gprjgp4fgpq7gp43gpqzgprAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CmnOCmvuCmqOCngV/gpqvgp4fgpqzgp43gprDgp4Ff4Kau4Ka+4Kaw4KeN4KaaX+Cmj+CmquCnjeCmsOCmv+Cmsl/gpq7gp4df4Kac4KeB4KaoX+CmnOCngeCmsuCmvuCmh1/gpobgppfgprjgp43gpp9f4Ka44KeH4Kaq4KeN4KafX+CmheCmleCnjeCmn+Cni1/gpqjgpq3gp4df4Kah4Ka/4Ka44KeHJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn4Kaw4Kas4Ka/4Kas4Ka+4KawX+CmuOCni+CmruCmrOCmvuCmsF/gpq7gppngp43gppfgprLgpqzgpr7gprBf4Kas4KeB4Kan4Kas4Ka+4KawX+CmrOCng+CmueCmuOCnjeCmquCmpOCmv+CmrOCmvuCmsF/gprbgp4HgppXgp43gprDgpqzgpr7gprBf4Ka24Kao4Ka/4Kas4Ka+4KawJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4Kaw4Kas4Ka/X+CmuOCni+Cmrl/gpq7gppngp43gppfgprJf4Kas4KeB4KanX+CmrOCng+CmueCmuOCnjeCmquCmpOCmv1/gprbgp4HgppXgp43gprBf4Ka24Kao4Ka/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CmsOCmrOCmv1/gprjgp4vgpq5f4Kau4KaZ4KeN4KaX4KayX+CmrOCngeCmp1/gpqzgp4Pgprlf4Ka24KeB4KaV4KeN4KawX+CmtuCmqOCmvycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3Mg4Ka44Kau4KefJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgprjgpq7gp58nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KaG4KacXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CmhuCml+CmvuCmruCngOCmleCmvuCmsl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+Cml+CmpOCmleCmvuCmsl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KaX4KakXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCmquCmsOCnhycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4KaG4KaX4KeHJyxcbiAgICAgICAgICAgIHM6ICfgppXgp5/gp4fgppUg4Ka44KeH4KaV4KeH4Kao4KeN4KahJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Ka44KeH4KaV4KeH4Kao4KeN4KahJyxcbiAgICAgICAgICAgIG06ICfgpo/gppUg4Kau4Ka/4Kao4Ka/4KafJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4Kau4Ka/4Kao4Ka/4KafJyxcbiAgICAgICAgICAgIGg6ICfgpo/gppUg4KaY4Kao4KeN4Kaf4Ka+JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KaY4Kao4KeN4Kaf4Ka+JyxcbiAgICAgICAgICAgIGQ6ICfgpo/gppUg4Kam4Ka/4KaoJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Kam4Ka/4KaoJyxcbiAgICAgICAgICAgIE06ICfgpo/gppUg4Kau4Ka+4Ka4JyxcbiAgICAgICAgICAgIE1NOiAnJWQg4Kau4Ka+4Ka4JyxcbiAgICAgICAgICAgIHk6ICfgpo/gppUg4Kas4Kab4KawJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Kas4Kab4KawJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Cnp+CnqOCnqeCnquCnq+CnrOCnreCnruCnr+Cnpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4Kaw4Ka+4KakfOCmreCni+CmsHzgprjgppXgpr7gprJ84Kam4KeB4Kaq4KeB4KawfOCmrOCmv+CmleCmvuCmsnzgprjgpqjgp43gpqfgp43gpq/gpr584Kaw4Ka+4KakLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4Kaw4Ka+4KakJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kat4KeL4KawJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CmuOCmleCmvuCmsicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpqbgp4Hgpqrgp4HgprAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMyA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kas4Ka/4KaV4Ka+4KayJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Ka44Kao4KeN4Kan4KeN4Kav4Ka+Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kaw4Ka+4KakJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmreCni+CmsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Ka44KaV4Ka+4KayJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpqbgp4Hgpqrgp4HgprAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmrOCmv+CmleCmvuCmsic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Ka44Kao4KeN4Kan4KeN4Kav4Ka+JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprDgpr7gpqQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYm5CZDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCZW5nYWxpIFtibl1cbi8vISBhdXRob3IgOiBLYXVzaGlrIEdhbmRoaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rYXVzaGlrZ2FuZGhpXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+CnpycsXG4gICAgICAgICAgICAyOiAn4KeoJyxcbiAgICAgICAgICAgIDM6ICfgp6knLFxuICAgICAgICAgICAgNDogJ+CnqicsXG4gICAgICAgICAgICA1OiAn4KerJyxcbiAgICAgICAgICAgIDY6ICfgp6wnLFxuICAgICAgICAgICAgNzogJ+CnrScsXG4gICAgICAgICAgICA4OiAn4KeuJyxcbiAgICAgICAgICAgIDk6ICfgp68nLFxuICAgICAgICAgICAgMDogJ+CnpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgp6cnOiAnMScsXG4gICAgICAgICAgICAn4KeoJzogJzInLFxuICAgICAgICAgICAgJ+CnqSc6ICczJyxcbiAgICAgICAgICAgICfgp6onOiAnNCcsXG4gICAgICAgICAgICAn4KerJzogJzUnLFxuICAgICAgICAgICAgJ+CnrCc6ICc2JyxcbiAgICAgICAgICAgICfgp60nOiAnNycsXG4gICAgICAgICAgICAn4KeuJzogJzgnLFxuICAgICAgICAgICAgJ+Cnryc6ICc5JyxcbiAgICAgICAgICAgICfgp6YnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgYm4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdibicsIHtcbiAgICAgICAgbW9udGhzOiAn4Kac4Ka+4Kao4KeB4Kef4Ka+4Kaw4Ka/X+Cmq+Cnh+CmrOCnjeCmsOCngeCnn+CmvuCmsOCmv1/gpq7gpr7gprDgp43gpppf4KaP4Kaq4KeN4Kaw4Ka/4KayX+CmruCnh1/gppzgp4Hgpqhf4Kac4KeB4Kay4Ka+4KaHX+CmhuCml+CmuOCnjeCmn1/gprjgp4fgpqrgp43gpp/gp4fgpq7gp43gpqzgprBf4KaF4KaV4KeN4Kaf4KeL4Kas4KawX+CmqOCmreCnh+CmruCnjeCmrOCmsF/gpqHgpr/gprjgp4fgpq7gp43gpqzgprAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CmnOCmvuCmqOCngV/gpqvgp4fgpqzgp43gprDgp4Ff4Kau4Ka+4Kaw4KeN4KaaX+Cmj+CmquCnjeCmsOCmv+Cmsl/gpq7gp4df4Kac4KeB4KaoX+CmnOCngeCmsuCmvuCmh1/gpobgppfgprjgp43gpp9f4Ka44KeH4Kaq4KeN4KafX+CmheCmleCnjeCmn+Cni1/gpqjgpq3gp4df4Kah4Ka/4Ka44KeHJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn4Kaw4Kas4Ka/4Kas4Ka+4KawX+CmuOCni+CmruCmrOCmvuCmsF/gpq7gppngp43gppfgprLgpqzgpr7gprBf4Kas4KeB4Kan4Kas4Ka+4KawX+CmrOCng+CmueCmuOCnjeCmquCmpOCmv+CmrOCmvuCmsF/gprbgp4HgppXgp43gprDgpqzgpr7gprBf4Ka24Kao4Ka/4Kas4Ka+4KawJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4Kaw4Kas4Ka/X+CmuOCni+Cmrl/gpq7gppngp43gppfgprJf4Kas4KeB4KanX+CmrOCng+CmueCmuOCnjeCmquCmpOCmv1/gprbgp4HgppXgp43gprBf4Ka24Kao4Ka/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CmsOCmrOCmv1/gprjgp4vgpq5f4Kau4KaZ4KeN4KaX4KayX+CmrOCngeCmp1/gpqzgp4Pgprlf4Ka24KeB4KaV4KeN4KawX+CmtuCmqOCmvycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3Mg4Ka44Kau4KefJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgprjgpq7gp58nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KaG4KacXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CmhuCml+CmvuCmruCngOCmleCmvuCmsl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+Cml+CmpOCmleCmvuCmsl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KaX4KakXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCmquCmsOCnhycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4KaG4KaX4KeHJyxcbiAgICAgICAgICAgIHM6ICfgppXgp5/gp4fgppUg4Ka44KeH4KaV4KeH4Kao4KeN4KahJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Ka44KeH4KaV4KeH4Kao4KeN4KahJyxcbiAgICAgICAgICAgIG06ICfgpo/gppUg4Kau4Ka/4Kao4Ka/4KafJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4Kau4Ka/4Kao4Ka/4KafJyxcbiAgICAgICAgICAgIGg6ICfgpo/gppUg4KaY4Kao4KeN4Kaf4Ka+JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KaY4Kao4KeN4Kaf4Ka+JyxcbiAgICAgICAgICAgIGQ6ICfgpo/gppUg4Kam4Ka/4KaoJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Kam4Ka/4KaoJyxcbiAgICAgICAgICAgIE06ICfgpo/gppUg4Kau4Ka+4Ka4JyxcbiAgICAgICAgICAgIE1NOiAnJWQg4Kau4Ka+4Ka4JyxcbiAgICAgICAgICAgIHk6ICfgpo/gppUg4Kas4Kab4KawJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Kas4Kab4KawJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Cnp+CnqOCnqeCnquCnq+CnrOCnreCnruCnr+Cnpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CmsOCmvuCmpHzgprjgppXgpr7gprJ84Kam4KeB4Kaq4KeB4KawfOCmrOCmv+CmleCmvuCmsnzgprDgpr7gpqQvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKG1lcmlkaWVtID09PSAn4Kaw4Ka+4KakJyAmJiBob3VyID49IDQpIHx8XG4gICAgICAgICAgICAgICAgKG1lcmlkaWVtID09PSAn4Kam4KeB4Kaq4KeB4KawJyAmJiBob3VyIDwgNSkgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+CmrOCmv+CmleCmvuCmsidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprDgpr7gpqQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmuOCmleCmvuCmsic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kam4KeB4Kaq4KeB4KawJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpqzgpr/gppXgpr7gprInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmsOCmvuCmpCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBibjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUaWJldGFuIFtib11cbi8vISBhdXRob3IgOiBUaHVwdGVuIE4uIENoYWtyaXNoYXIgOiBodHRwczovL2dpdGh1Yi5jb20vdmFqcmFkb2dcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4LyhJyxcbiAgICAgICAgICAgIDI6ICfgvKInLFxuICAgICAgICAgICAgMzogJ+C8oycsXG4gICAgICAgICAgICA0OiAn4LykJyxcbiAgICAgICAgICAgIDU6ICfgvKUnLFxuICAgICAgICAgICAgNjogJ+C8picsXG4gICAgICAgICAgICA3OiAn4LynJyxcbiAgICAgICAgICAgIDg6ICfgvKgnLFxuICAgICAgICAgICAgOTogJ+C8qScsXG4gICAgICAgICAgICAwOiAn4LygJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+C8oSc6ICcxJyxcbiAgICAgICAgICAgICfgvKInOiAnMicsXG4gICAgICAgICAgICAn4LyjJzogJzMnLFxuICAgICAgICAgICAgJ+C8pCc6ICc0JyxcbiAgICAgICAgICAgICfgvKUnOiAnNScsXG4gICAgICAgICAgICAn4LymJzogJzYnLFxuICAgICAgICAgICAgJ+C8pyc6ICc3JyxcbiAgICAgICAgICAgICfgvKgnOiAnOCcsXG4gICAgICAgICAgICAn4LypJzogJzknLFxuICAgICAgICAgICAgJ+C8oCc6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBibyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JvJywge1xuICAgICAgICBtb250aHM6ICfgvZ/gvrPgvIvgvZbgvIvgvZHgvYTgvIvgvZTgvbxf4L2f4L6z4LyL4L2W4LyL4L2C4L2J4L2y4L2m4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9guC9puC9tOC9mOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvZ7gvbLgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2j4L6U4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9keC+suC9tOC9guC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvZHgvbTgvZPgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2i4L6S4L6x4L2R4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9keC9guC9tOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvYXgvbTgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2F4L204LyL4L2C4L2F4L2y4L2C4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9heC9tOC8i+C9guC9ieC9suC9puC8i+C9lCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4L2f4L6z4LyLMV/gvZ/gvrPgvIsyX+C9n+C+s+C8izNf4L2f4L6z4LyLNF/gvZ/gvrPgvIs1X+C9n+C+s+C8izZf4L2f4L6z4LyLN1/gvZ/gvrPgvIs4X+C9n+C+s+C8izlf4L2f4L6z4LyLMTBf4L2f4L6z4LyLMTFf4L2f4L6z4LyLMTInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogL14o4L2f4L6z4LyLXFxkezEsMn0pLyxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn4L2C4L2f4L2g4LyL4L2J4L2y4LyL4L2Y4LyLX+C9guC9n+C9oOC8i+C9n+C+s+C8i+C9luC8i1/gvYLgvZ/gvaDgvIvgvZjgvbLgvYLgvIvgvZHgvZjgvaLgvItf4L2C4L2f4L2g4LyL4L2j4L634L2C4LyL4L2U4LyLX+C9guC9n+C9oOC8i+C9leC9tOC9ouC8i+C9luC9tF/gvYLgvZ/gvaDgvIvgvZTgvIvgvabgvYTgvabgvItf4L2C4L2f4L2g4LyL4L2m4L6k4L264L2T4LyL4L2U4LyLJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgvYngvbLgvIvgvZjgvItf4L2f4L6z4LyL4L2W4LyLX+C9mOC9suC9guC8i+C9keC9mOC9ouC8i1/gvaPgvrfgvYLgvIvgvZTgvItf4L2V4L204L2i4LyL4L2W4L20X+C9lOC8i+C9puC9hOC9puC8i1/gvabgvqTgvbrgvZPgvIvgvZTgvIsnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4L2J4L2yX+C9n+C+s1/gvZjgvbLgvYJf4L2j4L634L2CX+C9leC9tOC9ol/gvabgvYTgvaZf4L2m4L6k4L264L2TJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+C9keC9suC8i+C9ouC9suC9hF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgvabgvYTgvIvgvYngvbLgvZNdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+C9luC9keC9tOC9k+C8i+C9leC+suC9guC8i+C9ouC+l+C9uuC9puC8i+C9mF0sIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4L2B4LyL4L2m4L2EXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgvZbgvZHgvbTgvZPgvIvgvZXgvrLgvYLgvIvgvZjgvZDgvaDgvIvgvZhdIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4L2j4LyLJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgvabgvpTgvZPgvIvgvaMnLFxuICAgICAgICAgICAgczogJ+C9o+C9mOC8i+C9puC9hCcsXG4gICAgICAgICAgICBzczogJyVkIOC9puC+kOC9ouC8i+C9huC8jScsXG4gICAgICAgICAgICBtOiAn4L2m4L6Q4L2i4LyL4L2Y4LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4L2m4L6Q4L2i4LyL4L2YJyxcbiAgICAgICAgICAgIGg6ICfgvYbgvbTgvIvgvZrgvbzgvZHgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgaGg6ICclZCDgvYbgvbTgvIvgvZrgvbzgvZEnLFxuICAgICAgICAgICAgZDogJ+C9ieC9suC9k+C8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICBkZDogJyVkIOC9ieC9suC9k+C8iycsXG4gICAgICAgICAgICBNOiAn4L2f4L6z4LyL4L2W4LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4L2f4L6z4LyL4L2WJyxcbiAgICAgICAgICAgIHk6ICfgvaPgvbzgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgeXk6ICclZCDgvaPgvbwnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4Lyh4Lyi4Lyj4Lyk4Lyl4Lym4Lyn4Lyo4Lyp4LygXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4L2Y4L2a4L2T4LyL4L2Y4L28fOC9nuC9vOC9guC9puC8i+C9gOC9pnzgvYngvbLgvZPgvIvgvYLgvbTgvYR84L2R4L2C4L284L2E4LyL4L2R4L2CfOC9mOC9muC9k+C8i+C9mOC9vC8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobWVyaWRpZW0gPT09ICfgvZjgvZrgvZPgvIvgvZjgvbwnICYmIGhvdXIgPj0gNCkgfHxcbiAgICAgICAgICAgICAgICAobWVyaWRpZW0gPT09ICfgvYngvbLgvZPgvIvgvYLgvbTgvYQnICYmIGhvdXIgPCA1KSB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4L2R4L2C4L284L2E4LyL4L2R4L2CJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9mOC9muC9k+C8i+C9mOC9vCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2e4L284L2C4L2m4LyL4L2A4L2mJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvYngvbLgvZPgvIvgvYLgvbTgvYQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9keC9guC9vOC9hOC8i+C9keC9gic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2Y4L2a4L2T4LyL4L2Y4L28JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJyZXRvbiBbYnJdXG4vLyEgYXV0aG9yIDogSmVhbi1CYXB0aXN0ZSBMZSBEdWlnb3UgOiBodHRwczovL2dpdGh1Yi5jb20vamJsZWR1aWdvdVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aE11dGF0aW9uKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtbTogJ211bnV0ZW5uJyxcbiAgICAgICAgICAgIE1NOiAnbWl6JyxcbiAgICAgICAgICAgIGRkOiAnZGV2ZXpoJyxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIG11dGF0aW9uKGZvcm1hdFtrZXldLCBudW1iZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzcGVjaWFsTXV0YXRpb25Gb3JZZWFycyhudW1iZXIpIHtcbiAgICAgICAgc3dpdGNoIChsYXN0TnVtYmVyKG51bWJlcikpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyBibG9heic7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnIHZsb2F6JztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsYXN0TnVtYmVyKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyID4gOSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3ROdW1iZXIobnVtYmVyICUgMTApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG11dGF0aW9uKHRleHQsIG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gc29mdE11dGF0aW9uKHRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzb2Z0TXV0YXRpb24odGV4dCkge1xuICAgICAgICB2YXIgbXV0YXRpb25UYWJsZSA9IHtcbiAgICAgICAgICAgIG06ICd2JyxcbiAgICAgICAgICAgIGI6ICd2JyxcbiAgICAgICAgICAgIGQ6ICd6JyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG11dGF0aW9uVGFibGVbdGV4dC5jaGFyQXQoMCldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtdXRhdGlvblRhYmxlW3RleHQuY2hhckF0KDApXSArIHRleHQuc3Vic3RyaW5nKDEpO1xuICAgIH1cblxuICAgIHZhciBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZ2VuL2ksXG4gICAgICAgICAgICAvXmNbyrxcXCddaHdlL2ksXG4gICAgICAgICAgICAvXm1ldS9pLFxuICAgICAgICAgICAgL15lYnIvaSxcbiAgICAgICAgICAgIC9ebWFlL2ksXG4gICAgICAgICAgICAvXihtZXp8ZXZlKS9pLFxuICAgICAgICAgICAgL15nb3UvaSxcbiAgICAgICAgICAgIC9eZW9zL2ksXG4gICAgICAgICAgICAvXmd3ZS9pLFxuICAgICAgICAgICAgL15oZXIvaSxcbiAgICAgICAgICAgIC9eZHUvaSxcbiAgICAgICAgICAgIC9ea2VyL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGdlbnZlcnxjW8q8XFwnXWh3ZXZyZXJ8bWV1cnpofGVicmVsfG1hZXxtZXpoZXZlbnxnb3VlcmV8ZW9zdHxnd2VuZ29sb3xoZXJlfGR1fGtlcnp1fGdlbnxjW8q8XFwnXWh3ZXxtZXV8ZWJyfG1hZXxldmV8Z291fGVvc3xnd2V8aGVyfGR1fGtlcikvaSxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXggPVxuICAgICAgICAgICAgL14oZ2VudmVyfGNbyrxcXCddaHdldnJlcnxtZXVyemh8ZWJyZWx8bWFlfG1lemhldmVufGdvdWVyZXxlb3N0fGd3ZW5nb2xvfGhlcmV8ZHV8a2VyenUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXggPVxuICAgICAgICAgICAgL14oZ2VufGNbyrxcXCddaHdlfG1ldXxlYnJ8bWFlfGV2ZXxnb3V8ZW9zfGd3ZXxoZXJ8ZHV8a2VyKS9pLFxuICAgICAgICBmdWxsV2Vla2RheXNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9ec3VsL2ksXG4gICAgICAgICAgICAvXmx1bi9pLFxuICAgICAgICAgICAgL15tZXVyemgvaSxcbiAgICAgICAgICAgIC9ebWVyY1vKvFxcJ11oZXIvaSxcbiAgICAgICAgICAgIC9eeWFvdS9pLFxuICAgICAgICAgICAgL15nd2VuZXIvaSxcbiAgICAgICAgICAgIC9ec2Fkb3JuL2ksXG4gICAgICAgIF0sXG4gICAgICAgIHNob3J0V2Vla2RheXNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eU3VsL2ksXG4gICAgICAgICAgICAvXkx1bi9pLFxuICAgICAgICAgICAgL15NZXUvaSxcbiAgICAgICAgICAgIC9eTWVyL2ksXG4gICAgICAgICAgICAvXllhby9pLFxuICAgICAgICAgICAgL15Hd2UvaSxcbiAgICAgICAgICAgIC9eU2FkL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1pbldlZWtkYXlzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXlN1L2ksXG4gICAgICAgICAgICAvXkx1L2ksXG4gICAgICAgICAgICAvXk1lKFtecl18JCkvaSxcbiAgICAgICAgICAgIC9eTWVyL2ksXG4gICAgICAgICAgICAvXllhL2ksXG4gICAgICAgICAgICAvXkd3L2ksXG4gICAgICAgICAgICAvXlNhL2ksXG4gICAgICAgIF07XG5cbiAgICB2YXIgYnIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdicicsIHtcbiAgICAgICAgbW9udGhzOiAnR2VudmVyX0PKvGh3ZXZyZXJfTWV1cnpoX0VicmVsX01hZV9NZXpoZXZlbl9Hb3VlcmVfRW9zdF9Hd2VuZ29sb19IZXJlX0R1X0tlcnp1Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0dlbl9Dyrxod2VfTWV1X0Vicl9NYWVfRXZlX0dvdV9Fb3NfR3dlX0hlcl9EdV9LZXInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VsX0x1bl9NZXVyemhfTWVyY8q8aGVyX1lhb3VfR3dlbmVyX1NhZG9ybicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bF9MdW5fTWV1X01lcl9ZYW9fR3dlX1NhZCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9MdV9NZV9NZXJfWWFfR3dfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2U6IG1pbldlZWtkYXlzUGFyc2UsXG4gICAgICAgIGZ1bGxXZWVrZGF5c1BhcnNlOiBmdWxsV2Vla2RheXNQYXJzZSxcbiAgICAgICAgc2hvcnRXZWVrZGF5c1BhcnNlOiBzaG9ydFdlZWtkYXlzUGFyc2UsXG4gICAgICAgIG1pbldlZWtkYXlzUGFyc2U6IG1pbldlZWtkYXlzUGFyc2UsXG5cbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6IG1vbnRoc1N0cmljdFJlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OiBtb250aHNTaG9ydFN0cmljdFJlZ2V4LFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbYSB2aXpdIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFthIHZpel0gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFthIHZpel0gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGl6aXYgZGFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbV2FyY8q8aG9hemggZGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbZGFdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbRGVjyrxoIGRhXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3Bhc2V0IGRhXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2EtYmVubiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgyrx6bycsXG4gICAgICAgICAgICBzOiAndW4gbmViZXVkIHNlZ29uZGVubm/DuScsXG4gICAgICAgICAgICBzczogJyVkIGVpbGVubicsXG4gICAgICAgICAgICBtOiAndXIgdnVudXRlbm4nLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZVdpdGhNdXRhdGlvbixcbiAgICAgICAgICAgIGg6ICd1biBldXInLFxuICAgICAgICAgICAgaGg6ICclZCBldXInLFxuICAgICAgICAgICAgZDogJ3VuIGRldmV6aCcsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aE11dGF0aW9uLFxuICAgICAgICAgICAgTTogJ3VyIG1peicsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aE11dGF0aW9uLFxuICAgICAgICAgICAgeTogJ3VyIGJsb2F6JyxcbiAgICAgICAgICAgIHl5OiBzcGVjaWFsTXV0YXRpb25Gb3JZZWFycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGHDsXx2ZXQpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IG51bWJlciA9PT0gMSA/ICdhw7EnIDogJ3ZldCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9hLm0ufGcubS4vLCAvLyBnb3VkZSBtZXJlbm4gfCBhLXJhb2sgbWVyZW5uXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuID09PSAnZy5tLic7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gaG91ciA8IDEyID8gJ2EubS4nIDogJ2cubS4nO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJvc25pYW4gW2JzXVxuLy8hIGF1dGhvciA6IE5lZGltIENob2xpY2ggOiBodHRwczovL2dpdGh1Yi5jb20vZnJvbnR5YXJkXG4vLyEgYXV0aG9yIDogUmFzaWQgUmVkemljIDogaHR0cHM6Ly9naXRodWIuY29tL3Jhc2lkcmVcbi8vISBiYXNlZCBvbiAoaHIpIHRyYW5zbGF0aW9uIGJ5IEJvamFuIE1hcmtvdmnEh1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4XG4gICAgICAgICAgICAgICAgICAgID8gJ2plZG5hIG1pbnV0YSdcbiAgICAgICAgICAgICAgICAgICAgOiBpc0Z1dHVyZVxuICAgICAgICAgICAgICAgICAgICAgID8gJ2plZG51IG1pbnV0dSdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdqZWRuZSBtaW51dGUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRhJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2plZGFuIHNhdCcgOiAnamVkYW4gc2F0JztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0YSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2RhbmEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWMnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNhJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2knO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBicyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JzJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJ0X2FwcmlsX21hal9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJhcl9va3RvYmFyX25vdmVtYmFyX2RlY2VtYmFyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hai5fanVuLl9qdWwuX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGplbGphX3BvbmVkamVsamFrX3V0b3Jha19zcmlqZWRhX8SNZXR2cnRha19wZXRha19zdWJvdGEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZWQuX3Bvbi5fdXRvLl9zcmkuX8SNZXQuX3BldC5fc3ViLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb191dF9zcl/EjWVfcGVfc3UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmFzIHVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc3V0cmEgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW25lZGplbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3JpamVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2p1xI1lciB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbHVdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsZV0gW3N1Ym90ZV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsaV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmlqZSAlcycsXG4gICAgICAgICAgICBzOiAncGFyIHNla3VuZGknLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICdkYW4nLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06ICdtamVzZWMnLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6ICdnb2RpbnUnLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBicztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDYXRhbGFuIFtjYV1cbi8vISBhdXRob3IgOiBKdWFuIEcuIEh1cnRhZG8gOiBodHRwczovL2dpdGh1Yi5jb20vanVhbmdodXJ0YWRvXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgY2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdjYScsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdnZW5lcl9mZWJyZXJfbWFyw6dfYWJyaWxfbWFpZ19qdW55X2p1bGlvbF9hZ29zdF9zZXRlbWJyZV9vY3R1YnJlX25vdmVtYnJlX2Rlc2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogXCJkZSBnZW5lcl9kZSBmZWJyZXJfZGUgbWFyw6dfZCdhYnJpbF9kZSBtYWlnX2RlIGp1bnlfZGUganVsaW9sX2QnYWdvc3RfZGUgc2V0ZW1icmVfZCdvY3R1YnJlX2RlIG5vdmVtYnJlX2RlIGRlc2VtYnJlXCIuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9EW29EXT8oXFxzKStNTU1NLyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnZ2VuLl9mZWJyLl9tYXLDp19hYnIuX21haWdfanVueV9qdWwuX2FnLl9zZXQuX29jdC5fbm92Ll9kZXMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ2RpdW1lbmdlX2RpbGx1bnNfZGltYXJ0c19kaW1lY3Jlc19kaWpvdXNfZGl2ZW5kcmVzX2Rpc3NhYnRlJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkZy5fZGwuX2R0Ll9kYy5fZGouX2R2Ll9kcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGdfZGxfZHRfZGNfZGpfZHZfZHMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBsbDogJ0QgTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFtkZV0gWVlZWSBbYSBsZXNdIEg6bW0nLFxuICAgICAgICAgICAgbGxsOiAnRCBNTU0gWVlZWSwgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gW2RlXSBZWVlZIFthIGxlc10gSDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkIEQgTU1NIFlZWVksIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F2dWkgYSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2RlbcOgIGEgJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnbGVzJyA6ICdsYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYWhpciBhICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbZWxdIGRkZGQgW3Bhc3NhdCBhICcgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpICE9PSAxID8gJ2xlcycgOiAnbGEnKSArXG4gICAgICAgICAgICAgICAgICAgICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IFwiZCdhcXXDrSAlc1wiLFxuICAgICAgICAgICAgcGFzdDogJ2ZhICVzJyxcbiAgICAgICAgICAgIHM6ICd1bnMgc2Vnb25zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vnb25zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0cycsXG4gICAgICAgICAgICBoOiAndW5hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JlcycsXG4gICAgICAgICAgICBkOiAndW4gZGlhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGllcycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzb3MnLFxuICAgICAgICAgICAgeTogJ3VuIGFueScsXG4gICAgICAgICAgICB5eTogJyVkIGFueXMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0ocnxufHR8w6h8YSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPVxuICAgICAgICAgICAgICAgIG51bWJlciA9PT0gMVxuICAgICAgICAgICAgICAgICAgICA/ICdyJ1xuICAgICAgICAgICAgICAgICAgICA6IG51bWJlciA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgID8gJ24nXG4gICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3InXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bWJlciA9PT0gNFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICd0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICfDqCc7XG4gICAgICAgICAgICBpZiAocGVyaW9kID09PSAndycgfHwgcGVyaW9kID09PSAnVycpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAnYSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ3plY2ggW2NzXVxuLy8hIGF1dGhvciA6IHBldHJiZWxhIDogaHR0cHM6Ly9naXRodWIuY29tL3BldHJiZWxhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0ge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnbGVkZW5fw7pub3JfYsWZZXplbl9kdWJlbl9rdsSbdGVuX8SNZXJ2ZW5fxI1lcnZlbmVjX3NycGVuX3rDocWZw61fxZnDrWplbl9saXN0b3BhZF9wcm9zaW5lYycuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6ICdsZWRuYV/Dum5vcmFfYsWZZXpuYV9kdWJuYV9rdsSbdG5hX8SNZXJ2bmFfxI1lcnZlbmNlX3NycG5hX3rDocWZw61fxZnDrWpuYV9saXN0b3BhZHVfcHJvc2luY2UnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvREQ/W28uXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK01NTU0vLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydCA9ICdsZWRfw7pub19ixZllX2R1Yl9rdsSbX8SNdm5fxI12Y19zcnBfesOhxZlfxZnDrWpfbGlzX3Bybycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmxlZC9pLFxuICAgICAgICAgICAgL17Dum5vL2ksXG4gICAgICAgICAgICAvXmLFmWUvaSxcbiAgICAgICAgICAgIC9eZHViL2ksXG4gICAgICAgICAgICAvXmt2xJsvaSxcbiAgICAgICAgICAgIC9eKMSNdm58xI1lcnZlbiR8xI1lcnZuYSkvaSxcbiAgICAgICAgICAgIC9eKMSNdmN8xI1lcnZlbmVjfMSNZXJ2ZW5jZSkvaSxcbiAgICAgICAgICAgIC9ec3JwL2ksXG4gICAgICAgICAgICAvXnrDocWZL2ksXG4gICAgICAgICAgICAvXsWZw61qL2ksXG4gICAgICAgICAgICAvXmxpcy9pLFxuICAgICAgICAgICAgL15wcm8vaSxcbiAgICAgICAgXSxcbiAgICAgICAgLy8gTk9URTogJ8SNZXJ2ZW4nIGlzIHN1YnN0cmluZyBvZiAnxI1lcnZlbmVjJzsgdGhlcmVmb3JlICfEjWVydmVuZWMnIG11c3QgcHJlY2VkZSAnxI1lcnZlbicgaW4gdGhlIHJlZ2V4IHRvIGJlIGZ1bGx5IG1hdGNoZWQuXG4gICAgICAgIC8vIE90aGVyd2lzZSBwYXJzZXIgbWF0Y2hlcyAnMS4gxI1lcnZlbmVjJyBhcyAnMS4gxI1lcnZlbicgKyAnZWMnLlxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihsZWRlbnzDum5vcnxixZllemVufGR1YmVufGt2xJt0ZW58xI1lcnZlbmVjfMSNZXJ2ZW5jZXzEjWVydmVufMSNZXJ2bmF8c3JwZW58esOhxZnDrXzFmcOtamVufGxpc3RvcGFkfHByb3NpbmVjfGxlZHzDum5vfGLFmWV8ZHVifGt2xJt8xI12bnzEjXZjfHNycHx6w6HFmXzFmcOtanxsaXN8cHJvKS9pO1xuXG4gICAgZnVuY3Rpb24gcGx1cmFsKG4pIHtcbiAgICAgICAgcmV0dXJuIG4gPiAxICYmIG4gPCA1ICYmIH5+KG4gLyAxMCkgIT09IDE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOiAvLyBhIGZldyBzZWNvbmRzIC8gaW4gYSBmZXcgc2Vjb25kcyAvIGEgZmV3IHNlY29uZHMgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAncMOhciBzZWt1bmQnIDogJ3DDoXIgc2VrdW5kYW1pJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzogLy8gOSBzZWNvbmRzIC8gaW4gOSBzZWNvbmRzIC8gOSBzZWNvbmRzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnc2VrdW5keScgOiAnc2VrdW5kJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdzZWt1bmRhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ20nOiAvLyBhIG1pbnV0ZSAvIGluIGEgbWludXRlIC8gYSBtaW51dGUgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnbWludXRhJyA6IGlzRnV0dXJlID8gJ21pbnV0dScgOiAnbWludXRvdSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6IC8vIDkgbWludXRlcyAvIGluIDkgbWludXRlcyAvIDkgbWludXRlcyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21pbnV0eScgOiAnbWludXQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ21pbnV0YW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdoJzogLy8gYW4gaG91ciAvIGluIGFuIGhvdXIgLyBhbiBob3VyIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2hvZGluYScgOiBpc0Z1dHVyZSA/ICdob2RpbnUnIDogJ2hvZGlub3UnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOiAvLyA5IGhvdXJzIC8gaW4gOSBob3VycyAvIDkgaG91cnMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdob2RpbnknIDogJ2hvZGluJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdob2RpbmFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZCc6IC8vIGEgZGF5IC8gaW4gYSBkYXkgLyBhIGRheSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkZW4nIDogJ2RuZW0nO1xuICAgICAgICAgICAgY2FzZSAnZGQnOiAvLyA5IGRheXMgLyBpbiA5IGRheXMgLyA5IGRheXMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdkbnknIDogJ2Ruw60nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2RueSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnTSc6IC8vIGEgbW9udGggLyBpbiBhIG1vbnRoIC8gYSBtb250aCBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtxJtzw61jJyA6ICdtxJtzw61jZW0nO1xuICAgICAgICAgICAgY2FzZSAnTU0nOiAvLyA5IG1vbnRocyAvIGluIDkgbW9udGhzIC8gOSBtb250aHMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtxJtzw61jZScgOiAnbcSbc8OtY8WvJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtxJtzw61jaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAneSc6IC8vIGEgeWVhciAvIGluIGEgeWVhciAvIGEgeWVhciBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdyb2snIDogJ3Jva2VtJztcbiAgICAgICAgICAgIGNhc2UgJ3l5JzogLy8gOSB5ZWFycyAvIGluIDkgeWVhcnMgLyA5IHllYXJzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAncm9reScgOiAnbGV0Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdsZXR5JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY3MgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdjcycsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHNTaG9ydCxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgLy8gTk9URTogJ8SNZXJ2ZW4nIGlzIHN1YnN0cmluZyBvZiAnxI1lcnZlbmVjJzsgdGhlcmVmb3JlICfEjWVydmVuZWMnIG11c3QgcHJlY2VkZSAnxI1lcnZlbicgaW4gdGhlIHJlZ2V4IHRvIGJlIGZ1bGx5IG1hdGNoZWQuXG4gICAgICAgIC8vIE90aGVyd2lzZSBwYXJzZXIgbWF0Y2hlcyAnMS4gxI1lcnZlbmVjJyBhcyAnMS4gxI1lcnZlbicgKyAnZWMnLlxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGxlZGVufGxlZG5hfMO6bm9yYXzDum5vcnxixZllemVufGLFmWV6bmF8ZHViZW58ZHVibmF8a3bEm3RlbnxrdsSbdG5hfMSNZXJ2ZW5lY3zEjWVydmVuY2V8xI1lcnZlbnzEjWVydm5hfHNycGVufHNycG5hfHrDocWZw618xZnDrWplbnzFmcOtam5hfGxpc3RvcGFkdXxsaXN0b3BhZHxwcm9zaW5lY3xwcm9zaW5jZSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGxlZHzDum5vfGLFmWV8ZHVifGt2xJt8xI12bnzEjXZjfHNycHx6w6HFmXzFmcOtanxsaXN8cHJvKS9pLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZMSbbGVfcG9uZMSbbMOtX8O6dGVyw71fc3TFmWVkYV/EjXR2cnRla19ww6F0ZWtfc29ib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVfcG9fw7p0X3N0X8SNdF9ww6Ffc28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fw7p0X3N0X8SNdF9ww6Ffc28nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBsOiAnRC4gTS4gWVlZWScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RuZXMgdl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1t6w610cmEgdl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBuZWTEm2xpIHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBkZGRkIFt2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZlIHN0xZllZHUgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2ZSDEjXR2cnRlayB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgcMOhdGVrIHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBzb2JvdHUgdl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW3bEjWVyYSB2XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bG91IG5lZMSbbGkgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw6ldIGRkZGQgW3ZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWxvdSBzdMWZZWR1IHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO9XSBkZGRkIFt2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsb3Ugc29ib3R1IHZdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAncMWZZWQgJXMnLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENodXZhc2ggW2N2XVxuLy8hIGF1dGhvciA6IEFuYXRvbHkgTWlyb25vdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taXJvbnRvbGlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBjdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2N2Jywge1xuICAgICAgICBtb250aHM6ICfQutOR0YDQu9Cw0Ydf0L3QsNGA05HRgV/Qv9GD0Yhf0LDQutCwX9C80LDQuV/Sq9OX0YDRgtC80LVf0YPRgtORX9Kr0YPRgNC70LBf0LDQstOR0L1f0Y7Qv9CwX9GH07PQul/RgNCw0YjRgtCw0LInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0LrTkdGAX9C90LDRgF/Qv9GD0Yhf0LDQutCwX9C80LDQuV/Sq9OX0YBf0YPRgtORX9Kr0YPRgF/QsNCy0L1f0Y7Qv9CwX9GH07PQul/RgNCw0YgnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ9Cy0YvRgNGB0LDRgNC90LjQutGD0L1f0YLRg9C90YLQuNC60YPQvV/Ri9GC0LvQsNGA0LjQutGD0L1f0Y7QvdC60YPQvV/QutOX0qvQvdC10YDQvdC40LrRg9C9X9GN0YDQvdC10LrRg9C9X9GI05HQvNCw0YLQutGD0L0nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9Cy0YvRgF/RgtGD0L1f0YvRgtC7X9GO0L1f0LrTl9KrX9GN0YDQvV/RiNOR0LwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0LLRgF/RgtC9X9GL0YJf0Y7QvV/QutKrX9GN0YBf0YjQvCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELU1NLVlZWVknLFxuICAgICAgICAgICAgTEw6ICdZWVlZIFvSq9GD0LvRhdC4XSBNTU1NIFvRg9C505HRhdOX0L1dIERbLdC805fRiNOXXScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZIFvSq9GD0LvRhdC4XSBNTU1NIFvRg9C505HRhdOX0L1dIERbLdC805fRiNOXXSwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIFlZWVkgW9Kr0YPQu9GF0LhdIE1NTU0gW9GD0LnTkdGF05fQvV0gRFst0LzTl9GI05ddLCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9Cf0LDRj9C9XSBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0KvRgNCw0L1dIExUIFvRgdC10YXQtdGC0YDQtV0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vTltC90LXRgF0gTFQgW9GB0LXRhdC10YLRgNC1XScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vSqtC40YLQtdGBXSBkZGRkIExUIFvRgdC10YXQtdGC0YDQtV0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb0JjRgNGC0L3Tl10gZGRkZCBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBmdW5jdGlvbiAob3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGFmZml4ID0gL9GB0LXRhdC10YIkL2kuZXhlYyhvdXRwdXQpXG4gICAgICAgICAgICAgICAgICAgID8gJ9GA0LXQvSdcbiAgICAgICAgICAgICAgICAgICAgOiAv0qvRg9C7JC9pLmV4ZWMob3V0cHV0KVxuICAgICAgICAgICAgICAgICAgICAgID8gJ9GC0LDQvSdcbiAgICAgICAgICAgICAgICAgICAgICA6ICfRgNCw0L0nO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBhZmZpeDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXN0OiAnJXMg0LrQsNGP0LvQu9CwJyxcbiAgICAgICAgICAgIHM6ICfQv9OX0YAt0LjQuiDSq9C10LrQutGD0L3RgicsXG4gICAgICAgICAgICBzczogJyVkINKr0LXQutC60YPQvdGCJyxcbiAgICAgICAgICAgIG06ICfQv9OX0YAg0LzQuNC90YPRgicsXG4gICAgICAgICAgICBtbTogJyVkINC80LjQvdGD0YInLFxuICAgICAgICAgICAgaDogJ9C/05fRgCDRgdC10YXQtdGCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YHQtdGF0LXRgicsXG4gICAgICAgICAgICBkOiAn0L/Tl9GAINC60YPQvScsXG4gICAgICAgICAgICBkZDogJyVkINC60YPQvScsXG4gICAgICAgICAgICBNOiAn0L/Tl9GAINGD0LnTkdGFJyxcbiAgICAgICAgICAgIE1NOiAnJWQg0YPQudOR0YUnLFxuICAgICAgICAgICAgeTogJ9C/05fRgCDSq9GD0LsnLFxuICAgICAgICAgICAgeXk6ICclZCDSq9GD0LsnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0t0LzTl9GILyxcbiAgICAgICAgb3JkaW5hbDogJyVkLdC805fRiCcsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjdjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBXZWxzaCBbY3ldXG4vLyEgYXV0aG9yIDogUm9iZXJ0IEFsbGVuIDogaHR0cHM6Ly9naXRodWIuY29tL3JvYmdhbGxlblxuLy8hIGF1dGhvciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yeWFuZ3JlYXZlc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGN5ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnY3knLCB7XG4gICAgICAgIG1vbnRoczogJ0lvbmF3cl9DaHdlZnJvcl9NYXdydGhfRWJyaWxsX01haV9NZWhlZmluX0dvcmZmZW5uYWZfQXdzdF9NZWRpX0h5ZHJlZl9UYWNod2VkZF9SaGFnZnlyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0lvbl9DaHdlX01hd19FYnJfTWFpX01laF9Hb3JfQXdzX01lZF9IeWRfVGFjaF9SaGFnJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdEeWRkIFN1bF9EeWRkIExsdW5fRHlkZCBNYXdydGhfRHlkZCBNZXJjaGVyX0R5ZGQgSWF1X0R5ZGQgR3dlbmVyX0R5ZGQgU2Fkd3JuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdWxfTGx1bl9NYXdfTWVyX0lhdV9Hd2VfU2FkJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X0xsX01hX01lX0lhX0d3X1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIC8vIHRpbWUgZm9ybWF0cyBhcmUgdGhlIHNhbWUgYXMgZW4tZ2JcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIZWRkaXcgYW1dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbWWZvcnkgYW1dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYW1dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbRGRvZSBhbV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtkaXdldGhhZiBhbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdtZXduICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB5biDDtGwnLFxuICAgICAgICAgICAgczogJ3ljaHlkaWcgZWlsaWFkYXUnLFxuICAgICAgICAgICAgc3M6ICclZCBlaWxpYWQnLFxuICAgICAgICAgICAgbTogJ211bnVkJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbXVudWQnLFxuICAgICAgICAgICAgaDogJ2F3cicsXG4gICAgICAgICAgICBoaDogJyVkIGF3cicsXG4gICAgICAgICAgICBkOiAnZGl3cm5vZCcsXG4gICAgICAgICAgICBkZDogJyVkIGRpd3Jub2QnLFxuICAgICAgICAgICAgTTogJ21pcycsXG4gICAgICAgICAgICBNTTogJyVkIG1pcycsXG4gICAgICAgICAgICB5OiAnYmx3eWRkeW4nLFxuICAgICAgICAgICAgeXk6ICclZCBmbHluZWRkJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGZlZHxhaW58YWZ8aWx8eWRkfGVkfGVnKS8sXG4gICAgICAgIC8vIHRyYWRpdGlvbmFsIG9yZGluYWwgbnVtYmVycyBhYm92ZSAzMSBhcmUgbm90IGNvbW1vbmx5IHVzZWQgaW4gY29sbG9xdWlhbCBXZWxzaFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlcixcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJyxcbiAgICAgICAgICAgICAgICBsb29rdXAgPSBbXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAnYWYnLFxuICAgICAgICAgICAgICAgICAgICAnaWwnLFxuICAgICAgICAgICAgICAgICAgICAneWRkJyxcbiAgICAgICAgICAgICAgICAgICAgJ3lkZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZCcsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsIC8vIDFhZiB0byAxMGZlZFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJywgLy8gMTFlZyB0byAyMGZlZFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoYiA+IDIwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGIgPT09IDQwIHx8IGIgPT09IDUwIHx8IGIgPT09IDYwIHx8IGIgPT09IDgwIHx8IGIgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnZmVkJzsgLy8gbm90IDMwYWluLCA3MGFpbiBvciA5MGFpblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICdhaW4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYiA+IDApIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBsb29rdXBbYl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3k7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRGFuaXNoIFtkYV1cbi8vISBhdXRob3IgOiBVbHJpayBOaWVsc2VuIDogaHR0cHM6Ly9naXRodWIuY29tL21yYmFzZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGRhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZGEnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnRzX2FwcmlsX21hal9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFyX2Fwcl9tYWpfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ3PDuG5kYWdfbWFuZGFnX3RpcnNkYWdfb25zZGFnX3RvcnNkYWdfZnJlZGFnX2zDuHJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzw7huX21hbl90aXJfb25zX3Rvcl9mcmVfbMO4cicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzw7hfbWFfdGlfb25fdG9fZnJfbMO4Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgW2QuXSBELiBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tpIGRhZyBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbaSBtb3JnZW4ga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ3DDpSBkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaSBnw6VyIGtsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbaV0gZGRkZFtzIGtsLl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgc2lkZW4nLFxuICAgICAgICAgICAgczogJ2bDpSBzZWt1bmRlcicsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZGVyJyxcbiAgICAgICAgICAgIG06ICdldCBtaW51dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0dGVyJyxcbiAgICAgICAgICAgIGg6ICdlbiB0aW1lJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGltZXInLFxuICAgICAgICAgICAgZDogJ2VuIGRhZycsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2UnLFxuICAgICAgICAgICAgTTogJ2VuIG3DpW5lZCcsXG4gICAgICAgICAgICBNTTogJyVkIG3DpW5lZGVyJyxcbiAgICAgICAgICAgIHk6ICdldCDDpXInLFxuICAgICAgICAgICAgeXk6ICclZCDDpXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdlcm1hbiAoQXVzdHJpYSkgW2RlLWF0XVxuLy8hIGF1dGhvciA6IGxsdWNocyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9sbHVjaHNcbi8vISBhdXRob3I6IE1lbmVsaW9uIEVsZW5zw7psZTogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcbi8vISBhdXRob3IgOiBNYXJ0aW4gR3JvbGxlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9NYWRNR1xuLy8hIGF1dGhvciA6IE1pa29sYWogRGFkZWxhIDogaHR0cHM6Ly9naXRodWIuY29tL21pazAxYWpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtOiBbJ2VpbmUgTWludXRlJywgJ2VpbmVyIE1pbnV0ZSddLFxuICAgICAgICAgICAgaDogWydlaW5lIFN0dW5kZScsICdlaW5lciBTdHVuZGUnXSxcbiAgICAgICAgICAgIGQ6IFsnZWluIFRhZycsICdlaW5lbSBUYWcnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyBUYWdlJywgbnVtYmVyICsgJyBUYWdlbiddLFxuICAgICAgICAgICAgdzogWydlaW5lIFdvY2hlJywgJ2VpbmVyIFdvY2hlJ10sXG4gICAgICAgICAgICBNOiBbJ2VpbiBNb25hdCcsICdlaW5lbSBNb25hdCddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIE1vbmF0ZScsIG51bWJlciArICcgTW9uYXRlbiddLFxuICAgICAgICAgICAgeTogWydlaW4gSmFocicsICdlaW5lbSBKYWhyJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgSmFocmUnLCBudW1iZXIgKyAnIEphaHJlbiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGRlQXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkZS1hdCcsIHtcbiAgICAgICAgbW9udGhzOiAnSsOkbm5lcl9GZWJydWFyX03DpHJ6X0FwcmlsX01haV9KdW5pX0p1bGlfQXVndXN0X1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0RlemVtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKw6RuLl9GZWIuX03DpHJ6X0Fwci5fTWFpX0p1bmlfSnVsaV9BdWcuX1NlcC5fT2t0Ll9Ob3YuX0Rlei4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1Nvbm50YWdfTW9udGFnX0RpZW5zdGFnX01pdHR3b2NoX0Rvbm5lcnN0YWdfRnJlaXRhZ19TYW1zdGFnJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTby5fTW8uX0RpLl9NaS5fRG8uX0ZyLl9TYS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toZXV0ZSB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dlc3Rlcm4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2xldHp0ZW5dIGRkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzOiAnZWluIHBhYXIgU2VrdW5kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBTZWt1bmRlbicsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06ICclZCBNaW51dGVuJyxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgdzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHd3OiAnJWQgV29jaGVuJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkZUF0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdlcm1hbiAoU3dpdHplcmxhbmQpIFtkZS1jaF1cbi8vISBhdXRob3IgOiBzc2NodWVsbGVyIDogaHR0cHM6Ly9naXRodWIuY29tL3NzY2h1ZWxsZXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtOiBbJ2VpbmUgTWludXRlJywgJ2VpbmVyIE1pbnV0ZSddLFxuICAgICAgICAgICAgaDogWydlaW5lIFN0dW5kZScsICdlaW5lciBTdHVuZGUnXSxcbiAgICAgICAgICAgIGQ6IFsnZWluIFRhZycsICdlaW5lbSBUYWcnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyBUYWdlJywgbnVtYmVyICsgJyBUYWdlbiddLFxuICAgICAgICAgICAgdzogWydlaW5lIFdvY2hlJywgJ2VpbmVyIFdvY2hlJ10sXG4gICAgICAgICAgICBNOiBbJ2VpbiBNb25hdCcsICdlaW5lbSBNb25hdCddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIE1vbmF0ZScsIG51bWJlciArICcgTW9uYXRlbiddLFxuICAgICAgICAgICAgeTogWydlaW4gSmFocicsICdlaW5lbSBKYWhyJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgSmFocmUnLCBudW1iZXIgKyAnIEphaHJlbiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGRlQ2ggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkZS1jaCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyX0ZlYnJ1YXJfTcOkcnpfQXByaWxfTWFpX0p1bmlfSnVsaV9BdWd1c3RfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGV6ZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0phbi5fRmViLl9Nw6Ryel9BcHIuX01haV9KdW5pX0p1bGlfQXVnLl9TZXAuX09rdC5fTm92Ll9EZXouJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdTb25udGFnX01vbnRhZ19EaWVuc3RhZ19NaXR0d29jaF9Eb25uZXJzdGFnX0ZyZWl0YWdfU2Ftc3RhZycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU29fTW9fRGlfTWlfRG9fRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toZXV0ZSB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dlc3Rlcm4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2xldHp0ZW5dIGRkZGQgW3VtXSBMVCBbVWhyXScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ZvciAlcycsXG4gICAgICAgICAgICBzOiAnZWluIHBhYXIgU2VrdW5kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBTZWt1bmRlbicsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06ICclZCBNaW51dGVuJyxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogJyVkIFN0dW5kZW4nLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgdzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHd3OiAnJWQgV29jaGVuJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkZUNoO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdlcm1hbiBbZGVdXG4vLyEgYXV0aG9yIDogbGx1Y2hzIDogaHR0cHM6Ly9naXRodWIuY29tL2xsdWNoc1xuLy8hIGF1dGhvcjogTWVuZWxpb24gRWxlbnPDumxlOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuLy8hIGF1dGhvciA6IE1pa29sYWogRGFkZWxhIDogaHR0cHM6Ly9naXRodWIuY29tL21pazAxYWpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtOiBbJ2VpbmUgTWludXRlJywgJ2VpbmVyIE1pbnV0ZSddLFxuICAgICAgICAgICAgaDogWydlaW5lIFN0dW5kZScsICdlaW5lciBTdHVuZGUnXSxcbiAgICAgICAgICAgIGQ6IFsnZWluIFRhZycsICdlaW5lbSBUYWcnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyBUYWdlJywgbnVtYmVyICsgJyBUYWdlbiddLFxuICAgICAgICAgICAgdzogWydlaW5lIFdvY2hlJywgJ2VpbmVyIFdvY2hlJ10sXG4gICAgICAgICAgICBNOiBbJ2VpbiBNb25hdCcsICdlaW5lbSBNb25hdCddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIE1vbmF0ZScsIG51bWJlciArICcgTW9uYXRlbiddLFxuICAgICAgICAgICAgeTogWydlaW4gSmFocicsICdlaW5lbSBKYWhyJ10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgSmFocmUnLCBudW1iZXIgKyAnIEphaHJlbiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGRlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZGUnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcl9GZWJydWFyX03DpHJ6X0FwcmlsX01haV9KdW5pX0p1bGlfQXVndXN0X1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0RlemVtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKYW4uX0ZlYi5fTcOkcnpfQXByLl9NYWlfSnVuaV9KdWxpX0F1Zy5fU2VwLl9Pa3QuX05vdi5fRGV6Licuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnU29ubnRhZ19Nb250YWdfRGllbnN0YWdfTWl0dHdvY2hfRG9ubmVyc3RhZ19GcmVpdGFnX1NhbXN0YWcnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1NvLl9Nby5fRGkuX01pLl9Eby5fRnIuX1NhLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTb19Nb19EaV9NaV9Eb19Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2hldXRlIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb3JnZW4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZ2VzdGVybiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbbGV0enRlbl0gZGRkZCBbdW1dIExUIFtVaHJdJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAndm9yICVzJyxcbiAgICAgICAgICAgIHM6ICdlaW4gcGFhciBTZWt1bmRlbicsXG4gICAgICAgICAgICBzczogJyVkIFNla3VuZGVuJyxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogJyVkIE1pbnV0ZW4nLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiAnJWQgU3R1bmRlbicsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgd3c6ICclZCBXb2NoZW4nLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRlO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hbGRpdmlhbiBbZHZdXG4vLyEgYXV0aG9yIDogSmF3aXNoIEhhbWVlZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYXdpc2hcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICAgICAn3pberN6C3qreh96m3oPeqScsXG4gICAgICAgICAgICAn3orerN6E3rDeg96q3ofept6D3qknLFxuICAgICAgICAgICAgJ96J3qfeg96o3pfeqicsXG4gICAgICAgICAgICAn3oferd6V3rDeg96p3o3eqicsXG4gICAgICAgICAgICAn3onerScsXG4gICAgICAgICAgICAn3pbeq96C3rAnLFxuICAgICAgICAgICAgJ96W3qrejd6m3ofeqCcsXG4gICAgICAgICAgICAn3ofer96O3qbekN6w3pPeqicsXG4gICAgICAgICAgICAn3pDerN6V3rDek96s3onesN6E3qbeg96qJyxcbiAgICAgICAgICAgICfeh96u3obesN6T3q/ehN6m3oPeqicsXG4gICAgICAgICAgICAn3oLert6I3qzeid6w3oTept6D3qonLFxuICAgICAgICAgICAgJ96R3qjekN6s3onesN6E3qbeg96qJyxcbiAgICAgICAgXSxcbiAgICAgICAgd2Vla2RheXMgPSBbXG4gICAgICAgICAgICAn3ofep96L3qjeh96w3ozepicsXG4gICAgICAgICAgICAn3oDer96J3qYnLFxuICAgICAgICAgICAgJ96H3qbegt6w3o7ep96D3qYnLFxuICAgICAgICAgICAgJ96E3qrei96mJyxcbiAgICAgICAgICAgICfehN6q3oPep96Q3rDeit6m3ozeqCcsXG4gICAgICAgICAgICAn3oDeqt6G3qreg96qJyxcbiAgICAgICAgICAgICfegN6u3oLeqN6A3qjeg96qJyxcbiAgICAgICAgXTtcblxuICAgIHZhciBkdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2R2Jywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6IHdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNNaW46ICfeh96n3oveqF/egN6v3onepl/eh96m3oLesF/ehN6q3ovepl/ehN6q3oPep1/egN6q3obeql/egN6u3oLeqCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QvTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv3onehnzeid6KLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ96J3oonID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ96J3oYnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ96J3oonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1veid6o3ofept6L3qpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb3onep96L3qbeid6nXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1veh96o3ofesN6U3qxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW96K3qfeh96o3ozeqt6I3qhdIGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfejN6s3oPerd6O3qbeh96oICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfeht6q3oPeqN6C3rAgJXMnLFxuICAgICAgICAgICAgczogJ96Q3qjeht6q3oLesN6M3qreht6u3oXerN6H3rAnLFxuICAgICAgICAgICAgc3M6ICdkJSDekN6o3obeqt6C3rDejN6qJyxcbiAgICAgICAgICAgIG06ICfeid6o3oLeqN6T3qzeh96wJyxcbiAgICAgICAgICAgIG1tOiAn3oneqN6C3qjek96qICVkJyxcbiAgICAgICAgICAgIGg6ICfejt6m3pHeqN6H3qjeg96s3ofesCcsXG4gICAgICAgICAgICBoaDogJ96O3qbekd6o3ofeqN6D3qogJWQnLFxuICAgICAgICAgICAgZDogJ96L3qreiN6m3oDerN6H3rAnLFxuICAgICAgICAgICAgZGQ6ICfei96q3ojept6Q3rAgJWQnLFxuICAgICAgICAgICAgTTogJ96J3qbegN6s3ofesCcsXG4gICAgICAgICAgICBNTTogJ96J3qbekN6wICVkJyxcbiAgICAgICAgICAgIHk6ICfeh96m3oDept6D3qzeh96wJyxcbiAgICAgICAgICAgIHl5OiAn3ofept6A3qbeg96qICVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDcsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkdjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHcmVlayBbZWxdXG4vLyEgYXV0aG9yIDogQWdnZWxvcyBLYXJhbGlhcyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZWhpZWxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0eXBlb2YgRnVuY3Rpb24gIT09ICd1bmRlZmluZWQnICYmIGlucHV0IGluc3RhbmNlb2YgRnVuY3Rpb24pIHx8XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBGdW5jdGlvbl0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIGVsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZWwnLCB7XG4gICAgICAgIG1vbnRoc05vbWluYXRpdmVFbDpcbiAgICAgICAgICAgICfOmc6xzr3Ov8+FzqzPgc65zr/Pgl/Ops61zrLPgc6/z4XOrM+BzrnOv8+CX86czqzPgc+EzrnOv8+CX86Rz4DPgc6vzrvOuc6/z4JfzpzOrM65zr/Pgl/Omc6/z43Ovc65zr/Pgl/Omc6/z43Ou865zr/Pgl/Okc+NzrPOv8+Fz4PPhM6/z4JfzqPOtc+Az4TOrc68zrLPgc65zr/Pgl/On866z4TPjs6yz4HOuc6/z4Jfzp3Ov86tzrzOss+BzrnOv8+CX86UzrXOus6tzrzOss+BzrnOv8+CJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc0dlbml0aXZlRWw6XG4gICAgICAgICAgICAnzpnOsc69zr/Phc6xz4HOr86/z4VfzqbOtc6yz4HOv8+FzrHPgc6vzr/PhV/OnM6xz4HPhM6vzr/PhV/Okc+Az4HOuc67zq/Ov8+FX86czrHOkM6/z4VfzpnOv8+Fzr3Or86/z4VfzpnOv8+FzrvOr86/z4VfzpHPhc6zzr/Pjc+Dz4TOv8+FX86jzrXPgM+EzrXOvM6yz4HOr86/z4Vfzp/Ous+Ez4nOss+Bzq/Ov8+FX86dzr/Otc68zrLPgc6vzr/PhV/OlM61zrrOtc68zrLPgc6vzr/PhScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHM6IGZ1bmN0aW9uIChtb21lbnRUb0Zvcm1hdCwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudFRvRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc05vbWluYXRpdmVFbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdHlwZW9mIGZvcm1hdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAvRC8udGVzdChmb3JtYXQuc3Vic3RyaW5nKDAsIGZvcm1hdC5pbmRleE9mKCdNTU1NJykpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBkYXkgbnVtYmVyIGJlZm9yZSAnTU1NTSdcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzR2VuaXRpdmVFbFttb21lbnRUb0Zvcm1hdC5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc05vbWluYXRpdmVFbFttb21lbnRUb0Zvcm1hdC5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfOmc6xzr1fzqbOtc6yX86czrHPgV/Okc+Az4FfzpzOsc+KX86Zzr/Phc69X86Zzr/Phc67X86Rz4XOs1/Oo861z4Bfzp/Ous+EX86dzr/OtV/OlM61zronLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnzprPhc+BzrnOsc66zq5fzpTOtc+Fz4TOrc+BzrFfzqTPgc6vz4TOt1/OpM61z4TOrM+Bz4TOt1/OoM6tzrzPgM+EzrdfzqDOsc+BzrHPg866zrXPhc6uX86jzqzOss6yzrHPhM6/Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnzprPhc+BX86UzrXPhV/OpM+BzrlfzqTOtc+EX86gzrXOvF/OoM6xz4FfzqPOsc6yJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ86az4VfzpTOtV/OpM+BX86kzrVfzqDOtV/OoM6xX86jzrEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnzrzOvCcgOiAnzpzOnCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ8+AzrwnIDogJ86gzpwnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKVswXSA9PT0gJ868JztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL1vOoM6cXVxcLj/OnD9cXC4/L2ksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyRWw6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbzqPOrs68zrXPgc6xIHt9XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW86Rz43Pgc65zr8ge31dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbe31dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbzqfOuM61z4Ige31dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW8+Ezr8gz4DPgc6/zrfOs86/z43OvM61zr3Ov10gZGRkZCBbe31dIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW8+EzrfOvSDPgM+Bzr/Ot86zzr/Pjc68zrXOvc63XSBkZGRkIFt7fV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjogZnVuY3Rpb24gKGtleSwgbW9tKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJFbFtrZXldLFxuICAgICAgICAgICAgICAgIGhvdXJzID0gbW9tICYmIG1vbS5ob3VycygpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24ob3V0cHV0KSkge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5hcHBseShtb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dC5yZXBsYWNlKCd7fScsIGhvdXJzICUgMTIgPT09IDEgPyAnz4PPhM63JyA6ICfPg8+EzrnPgicpO1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ8+DzrUgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIM+Az4HOuc69JyxcbiAgICAgICAgICAgIHM6ICfOu86vzrPOsSDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEnLFxuICAgICAgICAgICAgc3M6ICclZCDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEnLFxuICAgICAgICAgICAgbTogJ86tzr3OsSDOu861z4DPhM+MJyxcbiAgICAgICAgICAgIG1tOiAnJWQgzrvOtc+Az4TOrCcsXG4gICAgICAgICAgICBoOiAnzrzOr86xIM+Oz4HOsScsXG4gICAgICAgICAgICBoaDogJyVkIM+Oz4HOtc+CJyxcbiAgICAgICAgICAgIGQ6ICfOvM6vzrEgzrzOrc+BzrEnLFxuICAgICAgICAgICAgZGQ6ICclZCDOvM6tz4HOtc+CJyxcbiAgICAgICAgICAgIE06ICfOrc69zrHPgiDOvM6uzr3Osc+CJyxcbiAgICAgICAgICAgIE1NOiAnJWQgzrzOrs69zrXPgicsXG4gICAgICAgICAgICB5OiAnzq3Ovc6xz4Igz4fPgc+Mzr3Ov8+CJyxcbiAgICAgICAgICAgIHl5OiAnJWQgz4fPgc+Mzr3Ouc6xJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9zrcvLFxuICAgICAgICBvcmRpbmFsOiAnJWTOtycsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDRzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChBdXN0cmFsaWEpIFtlbi1hdV1cbi8vISBhdXRob3IgOiBKYXJlZCBNb3JzZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYXJjb2FsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5BdSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWF1Jywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbkF1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKENhbmFkYSkgW2VuLWNhXVxuLy8hIGF1dGhvciA6IEpvbmF0aGFuIEFib3VyYmloIDogaHR0cHM6Ly9naXRodWIuY29tL2pvbmJjYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuQ2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1jYScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuQ2E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoVW5pdGVkIEtpbmdkb20pIFtlbi1nYl1cbi8vISBhdXRob3IgOiBDaHJpcyBHZWRyaW0gOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXNnZWRyaW1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbkdiID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4tZ2InLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5HYjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChJcmVsYW5kKSBbZW4taWVdXG4vLyEgYXV0aG9yIDogQ2hyaXMgQ2FydGxpZGdlIDogaHR0cHM6Ly9naXRodWIuY29tL2NocmlzY2FydGxpZGdlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5JZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWllJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5JZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChJc3JhZWwpIFtlbi1pbF1cbi8vISBhdXRob3IgOiBDaHJpcyBHZWRyaW0gOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXNnZWRyaW1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbklsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4taWwnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuSWw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoSW5kaWEpIFtlbi1pbl1cbi8vISBhdXRob3IgOiBKYXRpbiBBZ3Jhd2FsIDogaHR0cHM6Ly9naXRodWIuY29tL2phdGluYWcyMlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuSW4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1pbicsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5JbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChOZXcgWmVhbGFuZCkgW2VuLW56XVxuLy8hIGF1dGhvciA6IEx1a2UgTWNHcmVnb3IgOiBodHRwczovL2dpdGh1Yi5jb20vbHVrZW1jZ3JlZ29yXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5OeiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLW56Jywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbk56O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKFNpbmdhcG9yZSkgW2VuLXNnXVxuLy8hIGF1dGhvciA6IE1hdHRoZXcgQ2FzdHJpbGxvbi1NYWRyaWdhbCA6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZWNoZGltZW5zaW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5TZyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLXNnJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuU2c7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRXNwZXJhbnRvIFtlb11cbi8vISBhdXRob3IgOiBDb2xpbiBEZWFuIDogaHR0cHM6Ly9naXRodWIuY29tL2NvbGluZGVhblxuLy8hIGF1dGhvciA6IE1pYSBOb3JkZW50b2Z0IEltcGVyYXRvcmkgOiBodHRwczovL2dpdGh1Yi5jb20vbWllc3Rhc21pYVxuLy8hIGNvbW1lbnQgOiBtaWVzdGFzbWlhIGNvcnJlY3RlZCB0aGUgdHJhbnNsYXRpb24gYnkgY29saW5kZWFuXG4vLyEgY29tbWVudCA6IFZpdmFrdm8gY29ycmVjdGVkIHRoZSB0cmFuc2xhdGlvbiBieSBjb2xpbmRlYW4gYW5kIG1pZXN0YXNtaWFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VvJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJvX2ZlYnJ1YXJvX21hcnRvX2Fwcmlsb19tYWpvX2p1bmlvX2p1bGlvX2HFrWd1c3RvX3NlcHRlbWJyb19va3RvYnJvX25vdmVtYnJvX2RlY2VtYnJvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFydF9hcHJfbWFqX2p1bl9qdWxfYcWtZ19zZXB0X29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ2RpbWFuxIlvX2x1bmRvX21hcmRvX21lcmtyZWRvX8S1YcWtZG9fdmVuZHJlZG9fc2FiYXRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGltX2x1bl9tYXJkX21lcmtfxLVhxa1fdmVuX3NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkaV9sdV9tYV9tZV/EtWFfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnW2xhXSBEWy1hbiBkZV0gTU1NTSwgWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdbbGFdIERbLWFuIGRlXSBNTU1NLCBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkW25dLCBbbGFdIERbLWFuIGRlXSBNTU1NLCBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIFtsYV0gRFstYW4gZGVdIE1NTSwgWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9bYXBdXFwudFxcLm0vaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgPT09ICdwJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwLnQubS4nIDogJ1AuVC5NLic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2EudC5tLicgOiAnQS5ULk0uJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSG9kaWHFrSBqZV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tNb3JnYcWtIGplXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGRbbiBqZV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIaWVyYcWtIGplXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1twYXNpbnRhbl0gZGRkZFtuIGplXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3Bvc3QgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2FudGHFrSAlcycsXG4gICAgICAgICAgICBzOiAna2Vsa2FqIHNla3VuZG9qJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kb2onLFxuICAgICAgICAgICAgbTogJ3VudSBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9qJyxcbiAgICAgICAgICAgIGg6ICd1bnUgaG9ybycsXG4gICAgICAgICAgICBoaDogJyVkIGhvcm9qJyxcbiAgICAgICAgICAgIGQ6ICd1bnUgdGFnbycsIC8vbmUgJ2RpdXJubycsIMSJYXIgZXN0YXMgdXppdGEgcG9yIHByb2tzaW11bW9cbiAgICAgICAgICAgIGRkOiAnJWQgdGFnb2onLFxuICAgICAgICAgICAgTTogJ3VudSBtb25hdG8nLFxuICAgICAgICAgICAgTU06ICclZCBtb25hdG9qJyxcbiAgICAgICAgICAgIHk6ICd1bnUgamFybycsXG4gICAgICAgICAgICB5eTogJyVkIGphcm9qJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9YS8sXG4gICAgICAgIG9yZGluYWw6ICclZGEnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3BhbmlzaCAoRG9taW5pY2FuIFJlcHVibGljKSBbZXMtZG9dXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPVxuICAgICAgICAgICAgJ2VuZS5fZmViLl9tYXIuX2Fici5fbWF5Ll9qdW4uX2p1bC5fYWdvLl9zZXAuX29jdC5fbm92Ll9kaWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZW5lL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9eYWJyL2ksXG4gICAgICAgICAgICAvXm1heS9pLFxuICAgICAgICAgICAgL15qdW4vaSxcbiAgICAgICAgICAgIC9eanVsL2ksXG4gICAgICAgICAgICAvXmFnby9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kaWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZXxlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaTtcblxuICAgIHZhciBlc0RvID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXMtZG8nLCB7XG4gICAgICAgIG1vbnRoczogJ2VuZXJvX2ZlYnJlcm9fbWFyem9fYWJyaWxfbWF5b19qdW5pb19qdWxpb19hZ29zdG9fc2VwdGllbWJyZV9vY3R1YnJlX25vdmllbWJyZV9kaWNpZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21pbmdvX2x1bmVzX21hcnRlc19tacOpcmNvbGVzX2p1ZXZlc192aWVybmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb20uX2x1bi5fbWFyLl9tacOpLl9qdWUuX3ZpZS5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWlfanVfdmlfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG95IGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbWHDsWFuYSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW2EgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYXllciBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW2VsXSBkZGRkIFtwYXNhZG8gYSBsYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ10gTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VuICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdoYWNlICVzJyxcbiAgICAgICAgICAgIHM6ICd1bm9zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGTDrWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkw61hcycsXG4gICAgICAgICAgICB3OiAndW5hIHNlbWFuYScsXG4gICAgICAgICAgICB3dzogJyVkIHNlbWFuYXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1biBhw7FvJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYcOxb3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVzRG87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3BhbmlzaCAoTWV4aWNvKSBbZXMtbXhdXG4vLyEgYXV0aG9yIDogSkMgRnJhbmNvIDogaHR0cHM6Ly9naXRodWIuY29tL2pjZnJhbmNvXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPVxuICAgICAgICAgICAgJ2VuZS5fZmViLl9tYXIuX2Fici5fbWF5Ll9qdW4uX2p1bC5fYWdvLl9zZXAuX29jdC5fbm92Ll9kaWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZW5lL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9eYWJyL2ksXG4gICAgICAgICAgICAvXm1heS9pLFxuICAgICAgICAgICAgL15qdW4vaSxcbiAgICAgICAgICAgIC9eanVsL2ksXG4gICAgICAgICAgICAvXmFnby9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kaWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZXxlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaTtcblxuICAgIHZhciBlc014ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXMtbXgnLCB7XG4gICAgICAgIG1vbnRoczogJ2VuZXJvX2ZlYnJlcm9fbWFyem9fYWJyaWxfbWF5b19qdW5pb19qdWxpb19hZ29zdG9fc2VwdGllbWJyZV9vY3R1YnJlX25vdmllbWJyZV9kaWNpZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21pbmdvX2x1bmVzX21hcnRlc19tacOpcmNvbGVzX2p1ZXZlc192aWVybmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb20uX2x1bi5fbWFyLl9tacOpLl9qdWUuX3ZpZS5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWlfanVfdmlfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2hveSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7FhbmEgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F5ZXIgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tlbF0gZGRkZCBbcGFzYWRvIGEgbGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaGFjZSAlcycsXG4gICAgICAgICAgICBzOiAndW5vcyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bmEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgdzogJ3VuYSBzZW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZW1hbmFzJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYcOxbycsXG4gICAgICAgICAgICB5eTogJyVkIGHDsW9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICAgICAgaW52YWxpZERhdGU6ICdGZWNoYSBpbnbDoWxpZGEnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVzTXg7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3BhbmlzaCAoVW5pdGVkIFN0YXRlcykgW2VzLXVzXVxuLy8hIGF1dGhvciA6IGJ1c3R0YSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9idXN0dGFcbi8vISBhdXRob3IgOiBjaHJpc3JvZHogOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXNyb2R6XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPVxuICAgICAgICAgICAgJ2VuZS5fZmViLl9tYXIuX2Fici5fbWF5Ll9qdW4uX2p1bC5fYWdvLl9zZXAuX29jdC5fbm92Ll9kaWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZW5lL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9eYWJyL2ksXG4gICAgICAgICAgICAvXm1heS9pLFxuICAgICAgICAgICAgL15qdW4vaSxcbiAgICAgICAgICAgIC9eanVsL2ksXG4gICAgICAgICAgICAvXmFnby9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kaWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZXxlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaTtcblxuICAgIHZhciBlc1VzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXMtdXMnLCB7XG4gICAgICAgIG1vbnRoczogJ2VuZXJvX2ZlYnJlcm9fbWFyem9fYWJyaWxfbWF5b19qdW5pb19qdWxpb19hZ29zdG9fc2VwdGllbWJyZV9vY3R1YnJlX25vdmllbWJyZV9kaWNpZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21pbmdvX2x1bmVzX21hcnRlc19tacOpcmNvbGVzX2p1ZXZlc192aWVybmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb20uX2x1bi5fbWFyLl9tacOpLl9qdWUuX3ZpZS5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWlfanVfdmlfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ01NL0REL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG95IGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbWHDsWFuYSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW2EgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYXllciBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW2VsXSBkZGRkIFtwYXNhZG8gYSBsYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ10gTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VuICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdoYWNlICVzJyxcbiAgICAgICAgICAgIHM6ICd1bm9zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGTDrWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkw61hcycsXG4gICAgICAgICAgICB3OiAndW5hIHNlbWFuYScsXG4gICAgICAgICAgICB3dzogJyVkIHNlbWFuYXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1biBhw7FvJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYcOxb3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVzVXM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3BhbmlzaCBbZXNdXG4vLyEgYXV0aG9yIDogSnVsaW8gTmFwdXLDrSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qdWxpb25jXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnREb3QgPVxuICAgICAgICAgICAgJ2VuZS5fZmViLl9tYXIuX2Fici5fbWF5Ll9qdW4uX2p1bC5fYWdvLl9zZXAuX29jdC5fbm92Ll9kaWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2VuZV9mZWJfbWFyX2Ficl9tYXlfanVuX2p1bF9hZ29fc2VwX29jdF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eZW5lL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9eYWJyL2ksXG4gICAgICAgICAgICAvXm1heS9pLFxuICAgICAgICAgICAgL15qdW4vaSxcbiAgICAgICAgICAgIC9eanVsL2ksXG4gICAgICAgICAgICAvXmFnby9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2N0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kaWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZXxlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaTtcblxuICAgIHZhciBlcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VzJywge1xuICAgICAgICBtb250aHM6ICdlbmVyb19mZWJyZXJvX21hcnpvX2FicmlsX21heW9fanVuaW9fanVsaW9fYWdvc3RvX3NlcHRpZW1icmVfb2N0dWJyZV9ub3ZpZW1icmVfZGljaWVtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3RbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lXFwuP3xmZWJcXC4/fG1hclxcLj98YWJyXFwuP3xtYXlcXC4/fGp1blxcLj98anVsXFwuP3xhZ29cXC4/fHNlcFxcLj98b2N0XFwuP3xub3ZcXC4/fGRpY1xcLj8pL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOiAnZG9taW5nb19sdW5lc19tYXJ0ZXNfbWnDqXJjb2xlc19qdWV2ZXNfdmllcm5lc19zw6FiYWRvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tLl9sdW4uX21hci5fbWnDqS5fanVlLl92aWUuX3PDoWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX21pX2p1X3ZpX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tob3kgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1ttYcOxYW5hIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1theWVyIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbZWxdIGRkZGQgW3Bhc2FkbyBhIGxhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnXSBMVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2hhY2UgJXMnLFxuICAgICAgICAgICAgczogJ3Vub3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW5hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW4gZMOtYScsXG4gICAgICAgICAgICBkZDogJyVkIGTDrWFzJyxcbiAgICAgICAgICAgIHc6ICd1bmEgc2VtYW5hJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2VtYW5hcycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VuIGHDsW8nLFxuICAgICAgICAgICAgeXk6ICclZCBhw7FvcycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgICAgIGludmFsaWREYXRlOiAnRmVjaGEgaW52w6FsaWRhJyxcbiAgICB9KTtcblxuICAgIHJldHVybiBlcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFc3RvbmlhbiBbZXRdXG4vLyEgYXV0aG9yIDogSGVucnkgS2VobG1hbm4gOiBodHRwczovL2dpdGh1Yi5jb20vbWFkaGVucnlcbi8vISBpbXByb3ZlbWVudHMgOiBJbGxpbWFyIFRhbWJlayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYWd1bGthXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgczogWydtw7VuZSBzZWt1bmRpJywgJ23DtW5pIHNla3VuZCcsICdwYWFyIHNla3VuZGl0J10sXG4gICAgICAgICAgICBzczogW251bWJlciArICdzZWt1bmRpJywgbnVtYmVyICsgJ3Nla3VuZGl0J10sXG4gICAgICAgICAgICBtOiBbJ8O8aGUgbWludXRpJywgJ8O8a3MgbWludXQnXSxcbiAgICAgICAgICAgIG1tOiBbbnVtYmVyICsgJyBtaW51dGknLCBudW1iZXIgKyAnIG1pbnV0aXQnXSxcbiAgICAgICAgICAgIGg6IFsnw7xoZSB0dW5uaScsICd0dW5kIGFlZ2EnLCAnw7xrcyB0dW5kJ10sXG4gICAgICAgICAgICBoaDogW251bWJlciArICcgdHVubmknLCBudW1iZXIgKyAnIHR1bmRpJ10sXG4gICAgICAgICAgICBkOiBbJ8O8aGUgcMOkZXZhJywgJ8O8a3MgcMOkZXYnXSxcbiAgICAgICAgICAgIE06IFsna3V1IGFqYScsICdrdXUgYWVnYScsICfDvGtzIGt1dSddLFxuICAgICAgICAgICAgTU06IFtudW1iZXIgKyAnIGt1dScsIG51bWJlciArICcga3V1ZCddLFxuICAgICAgICAgICAgeTogWyfDvGhlIGFhc3RhJywgJ2Fhc3RhJywgJ8O8a3MgYWFzdGEnXSxcbiAgICAgICAgICAgIHl5OiBbbnVtYmVyICsgJyBhYXN0YScsIG51bWJlciArICcgYWFzdGF0J10sXG4gICAgICAgIH07XG4gICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0W2tleV1bMl0gPyBmb3JtYXRba2V5XVsyXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0Z1dHVyZSA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGV0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXQnLCB7XG4gICAgICAgIG1vbnRoczogJ2phYW51YXJfdmVlYnJ1YXJfbcOkcnRzX2FwcmlsbF9tYWlfanV1bmlfanV1bGlfYXVndXN0X3NlcHRlbWJlcl9va3Rvb2Jlcl9ub3ZlbWJlcl9kZXRzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phYW5fdmVlYnJfbcOkcnRzX2Fwcl9tYWlfanV1bmlfanV1bGlfYXVnX3NlcHRfb2t0X25vdl9kZXRzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdww7xoYXDDpGV2X2VzbWFzcMOkZXZfdGVpc2lww6Rldl9rb2xtYXDDpGV2X25lbGphcMOkZXZfcmVlZGVfbGF1cMOkZXYnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1BfRV9UX0tfTl9SX0wnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnUF9FX1RfS19OX1JfTCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1TDpG5hLF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tIb21tZSxdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW0rDpHJnbWluZV0gZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0VpbGUsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tFZWxtaW5lXSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgcMOkcmFzdCcsXG4gICAgICAgICAgICBwYXN0OiAnJXMgdGFnYXNpJyxcbiAgICAgICAgICAgIHM6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBzczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogJyVkIHDDpGV2YScsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQmFzcXVlIFtldV1cbi8vISBhdXRob3IgOiBFbmVrbyBJbGxhcnJhbWVuZGkgOiBodHRwczovL2dpdGh1Yi5jb20vZWlsbGFycmFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBldSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2V1Jywge1xuICAgICAgICBtb250aHM6ICd1cnRhcnJpbGFfb3RzYWlsYV9tYXJ0eG9hX2FwaXJpbGFfbWFpYXR6YV9la2FpbmFfdXp0YWlsYV9hYnV6dHVhX2lyYWlsYV91cnJpYV9hemFyb2FfYWJlbmR1YScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAndXJ0Ll9vdHMuX21hci5fYXBpLl9tYWkuX2VrYS5fdXp0Ll9hYnUuX2lyYS5fdXJyLl9hemEuX2FiZS4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnaWdhbmRlYV9hc3RlbGVoZW5hX2FzdGVhcnRlYV9hc3RlYXprZW5hX29zdGVndW5hX29zdGlyYWxhX2xhcnVuYmF0YScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnaWcuX2FsLl9hci5fYXouX29nLl9vbC5fbHIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2lnX2FsX2FyX2F6X29nX29sX2xyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnWVlZWVtrb10gTU1NTVtyZW5dIERbYV0nLFxuICAgICAgICAgICAgTExMOiAnWVlZWVtrb10gTU1NTVtyZW5dIERbYV0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIFlZWVlba29dIE1NTU1bcmVuXSBEW2FdIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdZWVlZLU0tRCcsXG4gICAgICAgICAgICBsbDogJ1lZWVlba29dIE1NTSBEW2FdJyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVlba29dIE1NTSBEW2FdIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIFlZWVlba29dIE1NTSBEW2FdIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZ2F1cl0gTFRbZXRhbl0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1tiaWhhcl0gTFRbZXRhbl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIExUW2V0YW5dJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbYXR6b10gTFRbZXRhbl0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbYXVycmVrb10gZGRkZCBMVFtldGFuXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIGJhcnJ1JyxcbiAgICAgICAgICAgIHBhc3Q6ICdkdWVsYSAlcycsXG4gICAgICAgICAgICBzOiAnc2VndW5kbyBiYXR6dWsnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvJyxcbiAgICAgICAgICAgIG06ICdtaW51dHUgYmF0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXR1JyxcbiAgICAgICAgICAgIGg6ICdvcmR1IGJhdCcsXG4gICAgICAgICAgICBoaDogJyVkIG9yZHUnLFxuICAgICAgICAgICAgZDogJ2VndW4gYmF0JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZWd1bicsXG4gICAgICAgICAgICBNOiAnaGlsYWJldGUgYmF0JyxcbiAgICAgICAgICAgIE1NOiAnJWQgaGlsYWJldGUnLFxuICAgICAgICAgICAgeTogJ3VydGUgYmF0JyxcbiAgICAgICAgICAgIHl5OiAnJWQgdXJ0ZScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUGVyc2lhbiBbZmFdXG4vLyEgYXV0aG9yIDogRWJyYWhpbSBCeWFnb3dpIDogaHR0cHM6Ly9naXRodWIuY29tL2VicmFtaW5pb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfbsScsXG4gICAgICAgICAgICAyOiAn27InLFxuICAgICAgICAgICAgMzogJ9uzJyxcbiAgICAgICAgICAgIDQ6ICfbtCcsXG4gICAgICAgICAgICA1OiAn27UnLFxuICAgICAgICAgICAgNjogJ9u2JyxcbiAgICAgICAgICAgIDc6ICfbtycsXG4gICAgICAgICAgICA4OiAn27gnLFxuICAgICAgICAgICAgOTogJ9u5JyxcbiAgICAgICAgICAgIDA6ICfbsCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfbsSc6ICcxJyxcbiAgICAgICAgICAgICfbsic6ICcyJyxcbiAgICAgICAgICAgICfbsyc6ICczJyxcbiAgICAgICAgICAgICfbtCc6ICc0JyxcbiAgICAgICAgICAgICfbtSc6ICc1JyxcbiAgICAgICAgICAgICfbtic6ICc2JyxcbiAgICAgICAgICAgICfbtyc6ICc3JyxcbiAgICAgICAgICAgICfbuCc6ICc4JyxcbiAgICAgICAgICAgICfbuSc6ICc5JyxcbiAgICAgICAgICAgICfbsCc6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBmYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZhJywge1xuICAgICAgICBtb250aHM6ICfamNin2YbZiNuM2Ydf2YHZiNix24zZh1/Zhdin2LHYs1/YotmI2LHbjNmEX9mF2Ydf2pjZiNim2YZf2pjZiNim24zZh1/Yp9mI2Kpf2LPZvtiq2KfZhdio2LFf2Kfaqdiq2KjYsV/ZhtmI2KfZhdio2LFf2K/Ys9in2YXYqNixJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfamNin2YbZiNuM2Ydf2YHZiNix24zZh1/Zhdin2LHYs1/YotmI2LHbjNmEX9mF2Ydf2pjZiNim2YZf2pjZiNim24zZh1/Yp9mI2Kpf2LPZvtiq2KfZhdio2LFf2Kfaqdiq2KjYsV/ZhtmI2KfZhdio2LFf2K/Ys9in2YXYqNixJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ9uM2qlcXHUyMDBj2LTZhtio2Ydf2K/ZiNi02YbYqNmHX9iz2YdcXHUyMDBj2LTZhtio2Ydf2obZh9in2LHYtNmG2KjZh1/ZvtmG2KxcXHUyMDBj2LTZhtio2Ydf2KzZhdi52Ydf2LTZhtio2YcnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDpcbiAgICAgICAgICAgICfbjNqpXFx1MjAwY9i02YbYqNmHX9iv2YjYtNmG2KjZh1/Ys9mHXFx1MjAwY9i02YbYqNmHX9qG2YfYp9ix2LTZhtio2Ydf2b7ZhtisXFx1MjAwY9i02YbYqNmHX9is2YXYudmHX9i02YbYqNmHJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn24xf2K9f2LNf2oZf2b5f2Kxf2LQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2YLYqNmEINin2LIg2LjZh9ixfNio2LnYryDYp9iyINi42YfYsS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC/YqNi52K8g2KfYsiDYuNmH2LEvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YLYqNmEINin2LIg2LjZh9ixJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYqNi52K8g2KfYsiDYuNmH2LEnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mF2LHZiNiyINiz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9mB2LHYr9inINiz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9iz2KfYudiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9iv24zYsdmI2LIg2LPYp9i52KpdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2b7bjNi0XSBb2LPYp9i52KpdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2K/YsSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg2b7bjNi0JyxcbiAgICAgICAgICAgIHM6ICfahtmG2K8g2KvYp9mG24zZhycsXG4gICAgICAgICAgICBzczogJyVkINir2KfZhtuM2YcnLFxuICAgICAgICAgICAgbTogJ9uM2qkg2K/ZgtuM2YLZhycsXG4gICAgICAgICAgICBtbTogJyVkINiv2YLbjNmC2YcnLFxuICAgICAgICAgICAgaDogJ9uM2qkg2LPYp9i52KonLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYqicsXG4gICAgICAgICAgICBkOiAn24zaqSDYsdmI2LInLFxuICAgICAgICAgICAgZGQ6ICclZCDYsdmI2LInLFxuICAgICAgICAgICAgTTogJ9uM2qkg2YXYp9mHJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2YXYp9mHJyxcbiAgICAgICAgICAgIHk6ICfbjNqpINiz2KfZhCcsXG4gICAgICAgICAgICB5eTogJyVkINiz2KfZhCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1vbsC3buV0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3ZhS8sXG4gICAgICAgIG9yZGluYWw6ICclZNmFJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGaW5uaXNoIFtmaV1cbi8vISBhdXRob3IgOiBUYXJtbyBBaWRhbnRhdXN0YSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ibGVhZG9mXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbnVtYmVyc1Bhc3QgPVxuICAgICAgICAgICAgJ25vbGxhIHlrc2kga2Frc2kga29sbWUgbmVsasOkIHZpaXNpIGt1dXNpIHNlaXRzZW3DpG4ga2FoZGVrc2FuIHloZGVrc8Okbicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJyAnXG4gICAgICAgICAgICApLFxuICAgICAgICBudW1iZXJzRnV0dXJlID0gW1xuICAgICAgICAgICAgJ25vbGxhJyxcbiAgICAgICAgICAgICd5aGRlbicsXG4gICAgICAgICAgICAna2FoZGVuJyxcbiAgICAgICAgICAgICdrb2xtZW4nLFxuICAgICAgICAgICAgJ25lbGrDpG4nLFxuICAgICAgICAgICAgJ3ZpaWRlbicsXG4gICAgICAgICAgICAna3V1ZGVuJyxcbiAgICAgICAgICAgIG51bWJlcnNQYXN0WzddLFxuICAgICAgICAgICAgbnVtYmVyc1Bhc3RbOF0sXG4gICAgICAgICAgICBudW1iZXJzUGFzdFs5XSxcbiAgICAgICAgXTtcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdtdXV0YW1hbiBzZWt1bm5pbicgOiAnbXV1dGFtYSBzZWt1bnRpJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICdzZWt1bm5pbicgOiAnc2VrdW50aWEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ21pbnV1dGluJyA6ICdtaW51dXR0aSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAnbWludXV0aW4nIDogJ21pbnV1dHRpYSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAndHVubmluJyA6ICd0dW50aSc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAndHVubmluJyA6ICd0dW50aWEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ3DDpGl2w6RuJyA6ICdww6RpdsOkJztcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICdww6RpdsOkbicgOiAncMOkaXbDpMOkJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdrdXVrYXVkZW4nIDogJ2t1dWthdXNpJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICdrdXVrYXVkZW4nIDogJ2t1dWthdXR0YSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAndnVvZGVuJyA6ICd2dW9zaSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNGdXR1cmUgPyAndnVvZGVuJyA6ICd2dW90dGEnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IHZlcmJhbE51bWJlcihudW1iZXIsIGlzRnV0dXJlKSArICcgJyArIHJlc3VsdDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmVyYmFsTnVtYmVyKG51bWJlciwgaXNGdXR1cmUpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlciA8IDEwXG4gICAgICAgICAgICA/IGlzRnV0dXJlXG4gICAgICAgICAgICAgICAgPyBudW1iZXJzRnV0dXJlW251bWJlcl1cbiAgICAgICAgICAgICAgICA6IG51bWJlcnNQYXN0W251bWJlcl1cbiAgICAgICAgICAgIDogbnVtYmVyO1xuICAgIH1cblxuICAgIHZhciBmaSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZpJywge1xuICAgICAgICBtb250aHM6ICd0YW1taWt1dV9oZWxtaWt1dV9tYWFsaXNrdXVfaHVodGlrdXVfdG91a29rdXVfa2Vzw6RrdXVfaGVpbsOka3V1X2Vsb2t1dV9zeXlza3V1X2xva2FrdXVfbWFycmFza3V1X2pvdWx1a3V1Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICd0YW1taV9oZWxtaV9tYWFsaXNfaHVodGlfdG91a29fa2Vzw6RfaGVpbsOkX2Vsb19zeXlzX2xva2FfbWFycmFzX2pvdWx1Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3N1bm51bnRhaV9tYWFuYW50YWlfdGlpc3RhaV9rZXNraXZpaWtrb190b3JzdGFpX3BlcmphbnRhaV9sYXVhbnRhaScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc3VfbWFfdGlfa2VfdG9fcGVfbGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc3VfbWFfdGlfa2VfdG9fcGVfbGEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hILm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRG8gTU1NTVt0YV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEbyBNTU1NW3RhXSBZWVlZLCBba2xvXSBISC5tbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRG8gTU1NTVt0YV0gWVlZWSwgW2tsb10gSEgubW0nLFxuICAgICAgICAgICAgbDogJ0QuTS5ZWVlZJyxcbiAgICAgICAgICAgIGxsOiAnRG8gTU1NIFlZWVknLFxuICAgICAgICAgICAgbGxsOiAnRG8gTU1NIFlZWVksIFtrbG9dIEhILm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIERvIE1NTSBZWVlZLCBba2xvXSBISC5tbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW3TDpG7DpMOkbl0gW2tsb10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1todW9tZW5uYV0gW2tsb10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbG9dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZWlsZW5dIFtrbG9dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3ZpaW1lXSBkZGRkW25hXSBba2xvXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHDDpMOkc3TDpCcsXG4gICAgICAgICAgICBwYXN0OiAnJXMgc2l0dGVuJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmaTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGaWxpcGlubyBbZmlsXVxuLy8hIGF1dGhvciA6IERhbiBIYWdtYW4gOiBodHRwczovL2dpdGh1Yi5jb20vaGFnbWFuZGFuXG4vLyEgYXV0aG9yIDogTWF0dGhldyBDbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0aGV3ZGVlY29cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBmaWwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmaWwnLCB7XG4gICAgICAgIG1vbnRoczogJ0VuZXJvX1BlYnJlcm9fTWFyc29fQWJyaWxfTWF5b19IdW55b19IdWx5b19BZ29zdG9fU2V0eWVtYnJlX09rdHVicmVfTm9ieWVtYnJlX0Rpc3llbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdFbmVfUGViX01hcl9BYnJfTWF5X0h1bl9IdWxfQWdvX1NldF9Pa3RfTm9iX0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdMaW5nZ29fTHVuZXNfTWFydGVzX01peWVya3VsZXNfSHV3ZWJlc19CaXllcm5lc19TYWJhZG8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdMaW5fTHVuX01hcl9NaXlfSHV3X0JpeV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnTGlfTHVfTWFfTWlfSHVfQmlfU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnTU0vRC9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnTU1NTSBELCBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ01NTU0gRCwgWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBERCwgWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnTFQgW25nYXlvbmcgYXJhd10nLFxuICAgICAgICAgICAgbmV4dERheTogJ1tCdWthcyBuZ10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdMVCBbc2Egc3VzdW5vZCBuYV0gZGRkZCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnTFQgW2thaGFwb25dJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnTFQgW25vb25nIG5ha2FyYWFuZ10gZGRkZCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3NhIGxvb2IgbmcgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFuZyBuYWthbGlwYXMnLFxuICAgICAgICAgICAgczogJ2lsYW5nIHNlZ3VuZG8nLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvJyxcbiAgICAgICAgICAgIG06ICdpc2FuZyBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG8nLFxuICAgICAgICAgICAgaDogJ2lzYW5nIG9yYXMnLFxuICAgICAgICAgICAgaGg6ICclZCBvcmFzJyxcbiAgICAgICAgICAgIGQ6ICdpc2FuZyBhcmF3JyxcbiAgICAgICAgICAgIGRkOiAnJWQgYXJhdycsXG4gICAgICAgICAgICBNOiAnaXNhbmcgYnV3YW4nLFxuICAgICAgICAgICAgTU06ICclZCBidXdhbicsXG4gICAgICAgICAgICB5OiAnaXNhbmcgdGFvbicsXG4gICAgICAgICAgICB5eTogJyVkIHRhb24nLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEZhcm9lc2UgW2ZvXVxuLy8hIGF1dGhvciA6IFJhZ25hciBKb2hhbm5lc2VuIDogaHR0cHM6Ly9naXRodWIuY29tL3JhZ25hcjEyM1xuLy8hIGF1dGhvciA6IEtyaXN0aWFuIFNha2FyaXNzb24gOiBodHRwczovL2dpdGh1Yi5jb20vc2FrYXJpc3NvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGZvID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZm8nLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnNfYXByw61sX21haV9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFyX2Fwcl9tYWlfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdzdW5udWRhZ3VyX23DoW5hZGFndXJfdMO9c2RhZ3VyX21pa3VkYWd1cl9ow7NzZGFndXJfZnLDrWdnamFkYWd1cl9sZXlnYXJkYWd1cicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc3VuX23DoW5fdMO9c19taWtfaMOzc19mcsOtX2xleScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzdV9tw6FfdMO9X21pX2jDs19mcl9sZScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBELiBNTU1NLCBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbw40gZGFnIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vDjSBtb3JnaW4ga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vDjSBnasOhciBrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3PDrcOwc3R1XSBkZGRkIFtrbF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd1bSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgc8Otw7BhbmknLFxuICAgICAgICAgICAgczogJ2bDoSBzZWt1bmQnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmRpcicsXG4gICAgICAgICAgICBtOiAnZWluIG1pbnV0dHVyJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXR0aXInLFxuICAgICAgICAgICAgaDogJ2VpbiB0w61taScsXG4gICAgICAgICAgICBoaDogJyVkIHTDrW1hcicsXG4gICAgICAgICAgICBkOiAnZWluIGRhZ3VyJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnYXInLFxuICAgICAgICAgICAgTTogJ2VpbiBtw6FuYcOwdXInLFxuICAgICAgICAgICAgTU06ICclZCBtw6FuYcOwaXInLFxuICAgICAgICAgICAgeTogJ2VpdHQgw6FyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw6FyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmbztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGcmVuY2ggKENhbmFkYSkgW2ZyLWNhXVxuLy8hIGF1dGhvciA6IEpvbmF0aGFuIEFib3VyYmloIDogaHR0cHM6Ly9naXRodWIuY29tL2pvbmJjYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGZyQ2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmci1jYScsIHtcbiAgICAgICAgbW9udGhzOiAnamFudmllcl9mw6l2cmllcl9tYXJzX2F2cmlsX21haV9qdWluX2p1aWxsZXRfYW/Du3Rfc2VwdGVtYnJlX29jdG9icmVfbm92ZW1icmVfZMOpY2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW52Ll9mw6l2ci5fbWFyc19hdnIuX21haV9qdWluX2p1aWwuX2Fvw7t0X3NlcHQuX29jdC5fbm92Ll9kw6ljLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2RpbWFuY2hlX2x1bmRpX21hcmRpX21lcmNyZWRpX2pldWRpX3ZlbmRyZWRpX3NhbWVkaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RpbS5fbHVuLl9tYXIuX21lci5famV1Ll92ZW4uX3NhbS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGlfbHVfbWFfbWVfamVfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0F1am91cmTigJlodWkgw6BdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRGVtYWluIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8OgXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0hpZXIgw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZGVybmllciDDoF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkYW5zICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdpbCB5IGEgJXMnLFxuICAgICAgICAgICAgczogJ3F1ZWxxdWVzIHNlY29uZGVzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kZXMnLFxuICAgICAgICAgICAgbTogJ3VuZSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICd1bmUgaGV1cmUnLFxuICAgICAgICAgICAgaGg6ICclZCBoZXVyZXMnLFxuICAgICAgICAgICAgZDogJ3VuIGpvdXInLFxuICAgICAgICAgICAgZGQ6ICclZCBqb3VycycsXG4gICAgICAgICAgICBNOiAndW4gbW9pcycsXG4gICAgICAgICAgICBNTTogJyVkIG1vaXMnLFxuICAgICAgICAgICAgeTogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGVyfGUpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggbWFzY3VsaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogbW9pcywgdHJpbWVzdHJlLCBqb3VyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdlcicgOiAnZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBmZW1pbmluZSBncmFtbWF0aWNhbCBnZW5kZXI6IHNlbWFpbmVcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAncmUnIDogJ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmckNhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEZyZW5jaCAoU3dpdHplcmxhbmQpIFtmci1jaF1cbi8vISBhdXRob3IgOiBHYXNwYXJkIEJ1Y2hlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9nYXNwYXJkXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZnJDaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZyLWNoJywge1xuICAgICAgICBtb250aHM6ICdqYW52aWVyX2bDqXZyaWVyX21hcnNfYXZyaWxfbWFpX2p1aW5fanVpbGxldF9hb8O7dF9zZXB0ZW1icmVfb2N0b2JyZV9ub3ZlbWJyZV9kw6ljZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbnYuX2bDqXZyLl9tYXJzX2F2ci5fbWFpX2p1aW5fanVpbC5fYW/Du3Rfc2VwdC5fb2N0Ll9ub3YuX2TDqWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnZGltYW5jaGVfbHVuZGlfbWFyZGlfbWVyY3JlZGlfamV1ZGlfdmVuZHJlZGlfc2FtZWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGltLl9sdW4uX21hci5fbWVyLl9qZXUuX3Zlbi5fc2FtLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkaV9sdV9tYV9tZV9qZV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQXVqb3VyZOKAmWh1aSDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tEZW1haW4gw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSGllciDDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtkZXJuaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhbnMgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2lsIHkgYSAlcycsXG4gICAgICAgICAgICBzOiAncXVlbHF1ZXMgc2Vjb25kZXMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRlcycsXG4gICAgICAgICAgICBtOiAndW5lIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ3VuZSBoZXVyZScsXG4gICAgICAgICAgICBoaDogJyVkIGhldXJlcycsXG4gICAgICAgICAgICBkOiAndW4gam91cicsXG4gICAgICAgICAgICBkZDogJyVkIGpvdXJzJyxcbiAgICAgICAgICAgIE06ICd1biBtb2lzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9pcycsXG4gICAgICAgICAgICB5OiAndW4gYW4nLFxuICAgICAgICAgICAgeXk6ICclZCBhbnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZXJ8ZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBtYXNjdWxpbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBtb2lzLCB0cmltZXN0cmUsIGpvdXJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ2VyJyA6ICdlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIGZlbWluaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogc2VtYWluZVxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdyZScgOiAnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnJDaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGcmVuY2ggW2ZyXVxuLy8hIGF1dGhvciA6IEpvaG4gRmlzY2hlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qZnJvZmZpY2VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTdHJpY3RSZWdleCA9XG4gICAgICAgICAgICAvXihqYW52aWVyfGbDqXZyaWVyfG1hcnN8YXZyaWx8bWFpfGp1aW58anVpbGxldHxhb8O7dHxzZXB0ZW1icmV8b2N0b2JyZXxub3ZlbWJyZXxkw6ljZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXggPVxuICAgICAgICAgICAgLyhqYW52XFwuP3xmw6l2clxcLj98bWFyc3xhdnJcXC4/fG1haXxqdWlufGp1aWxcXC4/fGFvw7t0fHNlcHRcXC4/fG9jdFxcLj98bm92XFwuP3xkw6ljXFwuPykvaSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgLyhqYW52XFwuP3xmw6l2clxcLj98bWFyc3xhdnJcXC4/fG1haXxqdWlufGp1aWxcXC4/fGFvw7t0fHNlcHRcXC4/fG9jdFxcLj98bm92XFwuP3xkw6ljXFwuP3xqYW52aWVyfGbDqXZyaWVyfG1hcnN8YXZyaWx8bWFpfGp1aW58anVpbGxldHxhb8O7dHxzZXB0ZW1icmV8b2N0b2JyZXxub3ZlbWJyZXxkw6ljZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15qYW52L2ksXG4gICAgICAgICAgICAvXmbDqXZyL2ksXG4gICAgICAgICAgICAvXm1hcnMvaSxcbiAgICAgICAgICAgIC9eYXZyL2ksXG4gICAgICAgICAgICAvXm1haS9pLFxuICAgICAgICAgICAgL15qdWluL2ksXG4gICAgICAgICAgICAvXmp1aWwvaSxcbiAgICAgICAgICAgIC9eYW/Du3QvaSxcbiAgICAgICAgICAgIC9ec2VwdC9pLFxuICAgICAgICAgICAgL15vY3QvaSxcbiAgICAgICAgICAgIC9ebm92L2ksXG4gICAgICAgICAgICAvXmTDqWMvaSxcbiAgICAgICAgXTtcblxuICAgIHZhciBmciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZyJywge1xuICAgICAgICBtb250aHM6ICdqYW52aWVyX2bDqXZyaWVyX21hcnNfYXZyaWxfbWFpX2p1aW5fanVpbGxldF9hb8O7dF9zZXB0ZW1icmVfb2N0b2JyZV9ub3ZlbWJyZV9kw6ljZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbnYuX2bDqXZyLl9tYXJzX2F2ci5fbWFpX2p1aW5fanVpbC5fYW/Du3Rfc2VwdC5fb2N0Ll9ub3YuX2TDqWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OiBtb250aHNTdHJpY3RSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDogbW9udGhzU2hvcnRTdHJpY3RSZWdleCxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICdkaW1hbmNoZV9sdW5kaV9tYXJkaV9tZXJjcmVkaV9qZXVkaV92ZW5kcmVkaV9zYW1lZGknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkaW0uX2x1bi5fbWFyLl9tZXIuX2pldS5fdmVuLl9zYW0uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RpX2x1X21hX21lX2plX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tBdWpvdXJk4oCZaHVpIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0RlbWFpbiDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2Rlcm5pZXIgw6BdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFucyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaWwgeSBhICVzJyxcbiAgICAgICAgICAgIHM6ICdxdWVscXVlcyBzZWNvbmRlcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGVzJyxcbiAgICAgICAgICAgIG06ICd1bmUgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAndW5lIGhldXJlJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaGV1cmVzJyxcbiAgICAgICAgICAgIGQ6ICd1biBqb3VyJyxcbiAgICAgICAgICAgIGRkOiAnJWQgam91cnMnLFxuICAgICAgICAgICAgdzogJ3VuZSBzZW1haW5lJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2VtYWluZXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1vaXMnLFxuICAgICAgICAgICAgTU06ICclZCBtb2lzJyxcbiAgICAgICAgICAgIHk6ICd1biBhbicsXG4gICAgICAgICAgICB5eTogJyVkIGFucycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShlcnwpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IFJldHVybiAnZScgd2hlbiBkYXkgb2YgbW9udGggPiAxLiBNb3ZlIHRoaXMgY2FzZSBpbnNpZGVcbiAgICAgICAgICAgICAgICAvLyBibG9jayBmb3IgbWFzY3VsaW5lIHdvcmRzIGJlbG93LlxuICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMzM3NVxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdlcicgOiAnJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIG1hc2N1bGluZSBncmFtbWF0aWNhbCBnZW5kZXI6IG1vaXMsIHRyaW1lc3RyZSwgam91clxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJ2UnKTtcblxuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggZmVtaW5pbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBzZW1haW5lXG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ3JlJyA6ICdlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBGcmlzaWFuIFtmeV1cbi8vISBhdXRob3IgOiBSb2JpbiB2YW4gZGVyIFZsaWV0IDogaHR0cHM6Ly9naXRodWIuY29tL3JvYmluMHZhbjBkZXIwdlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0V2l0aERvdHMgPVxuICAgICAgICAgICAgJ2phbi5fZmViLl9tcnQuX2Fwci5fbWFpX2p1bi5fanVsLl9hdWcuX3NlcC5fb2t0Ll9ub3YuX2Rlcy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0V2l0aG91dERvdHMgPVxuICAgICAgICAgICAgJ2phbl9mZWJfbXJ0X2Fwcl9tYWlfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVzJy5zcGxpdCgnXycpO1xuXG4gICAgdmFyIGZ5ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZnknLCB7XG4gICAgICAgIG1vbnRoczogJ2phbm5ld2FyaXNfZmVicmV3YXJpc19tYWFydF9hcHJpbF9tYWFpZV9qdW55X2p1bHlfYXVndXN0dXNfc2VwdGltYmVyX29rdG9iZXJfbm92aW1iZXJfZGVzaW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRob3V0RG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ3NuZWluX21vYW5kZWlfdGlpc2RlaV93b2Fuc2RlaV90b25nZXJzZGVpX2ZyZWVkX3NuZW9uJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc2kuX21vLl90aS5fd28uX3RvLl9mci5fc28uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NpX01vX1RpX1dvX1RvX0ZyX1NvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1toam9lZCBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb2FybiBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdXN0ZXIgb21dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW8O0ZnLDu25lXSBkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvZXIgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGx5bicsXG4gICAgICAgICAgICBzOiAnaW4gcGVhciBzZWtvbmRlbicsXG4gICAgICAgICAgICBzczogJyVkIHNla29uZGVuJyxcbiAgICAgICAgICAgIG06ICdpZW4gbWluw7p0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlbicsXG4gICAgICAgICAgICBoOiAnaWVuIG9lcmUnLFxuICAgICAgICAgICAgaGg6ICclZCBvZXJlbicsXG4gICAgICAgICAgICBkOiAnaWVuIGRlaScsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2VuJyxcbiAgICAgICAgICAgIE06ICdpZW4gbW9hbm5lJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9hbm5lbicsXG4gICAgICAgICAgICB5OiAnaWVuIGppZXInLFxuICAgICAgICAgICAgeXk6ICclZCBqaWVycmVuJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0ZXxkZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIG51bWJlciArXG4gICAgICAgICAgICAgICAgKG51bWJlciA9PT0gMSB8fCBudW1iZXIgPT09IDggfHwgbnVtYmVyID49IDIwID8gJ3N0ZScgOiAnZGUnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ5O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IElyaXNoIG9yIElyaXNoIEdhZWxpYyBbZ2FdXG4vLyEgYXV0aG9yIDogQW5kcsOpIFNpbHZhIDogaHR0cHM6Ly9naXRodWIuY29tL2Fza3B0XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ0VhbsOhaXInLFxuICAgICAgICAgICAgJ0ZlYWJocmEnLFxuICAgICAgICAgICAgJ03DoXJ0YScsXG4gICAgICAgICAgICAnQWlicmXDoW4nLFxuICAgICAgICAgICAgJ0JlYWx0YWluZScsXG4gICAgICAgICAgICAnTWVpdGhlYW1oJyxcbiAgICAgICAgICAgICdJw7ppbCcsXG4gICAgICAgICAgICAnTMO6bmFzYScsXG4gICAgICAgICAgICAnTWXDoW4gRsOzbWhhaXInLFxuICAgICAgICAgICAgJ0RlaXJlYWRoIEbDs21oYWlyJyxcbiAgICAgICAgICAgICdTYW1oYWluJyxcbiAgICAgICAgICAgICdOb2xsYWlnJyxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSBbXG4gICAgICAgICAgICAnRWFuJyxcbiAgICAgICAgICAgICdGZWFiaCcsXG4gICAgICAgICAgICAnTcOhcnQnLFxuICAgICAgICAgICAgJ0FpYicsXG4gICAgICAgICAgICAnQmVhbCcsXG4gICAgICAgICAgICAnTWVpdGgnLFxuICAgICAgICAgICAgJ0nDumlsJyxcbiAgICAgICAgICAgICdMw7puJyxcbiAgICAgICAgICAgICdNLkYuJyxcbiAgICAgICAgICAgICdELkYuJyxcbiAgICAgICAgICAgICdTYW1oJyxcbiAgICAgICAgICAgICdOb2xsJyxcbiAgICAgICAgXSxcbiAgICAgICAgd2Vla2RheXMgPSBbXG4gICAgICAgICAgICAnRMOpIERvbWhuYWlnaCcsXG4gICAgICAgICAgICAnRMOpIEx1YWluJyxcbiAgICAgICAgICAgICdEw6kgTcOhaXJ0JyxcbiAgICAgICAgICAgICdEw6kgQ8OpYWRhb2luJyxcbiAgICAgICAgICAgICdEw6lhcmRhb2luJyxcbiAgICAgICAgICAgICdEw6kgaEFvaW5lJyxcbiAgICAgICAgICAgICdEw6kgU2F0aGFpcm4nLFxuICAgICAgICBdLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0ID0gWydEb21oJywgJ0x1YW4nLCAnTcOhaXJ0JywgJ0PDqWFkJywgJ0TDqWFyJywgJ0FvaW5lJywgJ1NhdGgnXSxcbiAgICAgICAgd2Vla2RheXNNaW4gPSBbJ0RvJywgJ0x1JywgJ03DoScsICdDw6knLCAnRMOpJywgJ0EnLCAnU2EnXTtcblxuICAgIHZhciBnYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2dhJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRoc1Nob3J0LFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogd2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IHdlZWtkYXlzU2hvcnQsXG4gICAgICAgIHdlZWtkYXlzTWluOiB3ZWVrZGF5c01pbixcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tJbm5pdSBhZ10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBbcOhcmFjaCBhZ10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthZ10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJbm7DqSBhZ10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtzZW8gY2FpdGVdIFthZ10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDDsyBzaGluJyxcbiAgICAgICAgICAgIHM6ICdjw7pwbGEgc29pY2luZCcsXG4gICAgICAgICAgICBzczogJyVkIHNvaWNpbmQnLFxuICAgICAgICAgICAgbTogJ27Ds2ltw6lhZCcsXG4gICAgICAgICAgICBtbTogJyVkIG7Ds2ltw6lhZCcsXG4gICAgICAgICAgICBoOiAndWFpciBhbiBjaGxvaWcnLFxuICAgICAgICAgICAgaGg6ICclZCB1YWlyIGFuIGNobG9pZycsXG4gICAgICAgICAgICBkOiAnbMOhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgbMOhJyxcbiAgICAgICAgICAgIE06ICdtw60nLFxuICAgICAgICAgICAgTU06ICclZCBtw61vbm5hJyxcbiAgICAgICAgICAgIHk6ICdibGlhaW4nLFxuICAgICAgICAgICAgeXk6ICclZCBibGlhaW4nLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZHxuYXxtaCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbnVtYmVyID09PSAxID8gJ2QnIDogbnVtYmVyICUgMTAgPT09IDIgPyAnbmEnIDogJ21oJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBnYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTY290dGlzaCBHYWVsaWMgW2dkXVxuLy8hIGF1dGhvciA6IEpvbiBBc2hkb3duIDogaHR0cHM6Ly9naXRodWIuY29tL2pvbmFzaGRvd25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICAgICAnQW0gRmFvaWxsZWFjaCcsXG4gICAgICAgICAgICAnQW4gR2VhcnJhbicsXG4gICAgICAgICAgICAnQW0gTcOgcnQnLFxuICAgICAgICAgICAgJ0FuIEdpYmxlYW4nLFxuICAgICAgICAgICAgJ0FuIEPDqGl0ZWFuJyxcbiAgICAgICAgICAgICdBbiB0LcOSZ21oaW9zJyxcbiAgICAgICAgICAgICdBbiB0LUl1Y2hhcicsXG4gICAgICAgICAgICAnQW4gTMO5bmFzdGFsJyxcbiAgICAgICAgICAgICdBbiB0LVN1bHRhaW4nLFxuICAgICAgICAgICAgJ0FuIETDoG1oYWlyJyxcbiAgICAgICAgICAgICdBbiB0LVNhbWhhaW4nLFxuICAgICAgICAgICAgJ0FuIETDuWJobGFjaGQnLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNTaG9ydCA9IFtcbiAgICAgICAgICAgICdGYW9pJyxcbiAgICAgICAgICAgICdHZWFyJyxcbiAgICAgICAgICAgICdNw6BydCcsXG4gICAgICAgICAgICAnR2libCcsXG4gICAgICAgICAgICAnQ8OoaXQnLFxuICAgICAgICAgICAgJ8OSZ21oJyxcbiAgICAgICAgICAgICdJdWNoJyxcbiAgICAgICAgICAgICdMw7luJyxcbiAgICAgICAgICAgICdTdWx0JyxcbiAgICAgICAgICAgICdEw6BtaCcsXG4gICAgICAgICAgICAnU2FtaCcsXG4gICAgICAgICAgICAnRMO5YmgnLFxuICAgICAgICBdLFxuICAgICAgICB3ZWVrZGF5cyA9IFtcbiAgICAgICAgICAgICdEaWTDsm1obmFpY2gnLFxuICAgICAgICAgICAgJ0RpbHVhaW4nLFxuICAgICAgICAgICAgJ0RpbcOgaXJ0JyxcbiAgICAgICAgICAgICdEaWNpYWRhaW4nLFxuICAgICAgICAgICAgJ0RpYXJkYW9pbicsXG4gICAgICAgICAgICAnRGloYW9pbmUnLFxuICAgICAgICAgICAgJ0Rpc2F0aGFpcm5lJyxcbiAgICAgICAgXSxcbiAgICAgICAgd2Vla2RheXNTaG9ydCA9IFsnRGlkJywgJ0RpbCcsICdEaW0nLCAnRGljJywgJ0RpYScsICdEaWgnLCAnRGlzJ10sXG4gICAgICAgIHdlZWtkYXlzTWluID0gWydEw7InLCAnTHUnLCAnTcOgJywgJ0NpJywgJ0FyJywgJ0hhJywgJ1NhJ107XG5cbiAgICB2YXIgZ2QgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdnZCcsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHNTaG9ydCxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6IHdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiB3ZWVrZGF5c1Nob3J0LFxuICAgICAgICB3ZWVrZGF5c01pbjogd2Vla2RheXNNaW4sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQW4tZGl1Z2ggYWlnXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0EtbcOgaXJlYWNoIGFpZ10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthaWddIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbQW4tZMOoIGFpZ10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtzZW8gY2hhaWRoXSBbYWlnXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2FubiBhbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnYmhvIGNoaW9ubiAlcycsXG4gICAgICAgICAgICBzOiAnYmVhZ2FuIGRpb2dhbicsXG4gICAgICAgICAgICBzczogJyVkIGRpb2dhbicsXG4gICAgICAgICAgICBtOiAnbWlvbmFpZCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pb25haWRlYW4nLFxuICAgICAgICAgICAgaDogJ3VhaXInLFxuICAgICAgICAgICAgaGg6ICclZCB1YWlyZWFuJyxcbiAgICAgICAgICAgIGQ6ICdsYXRoYScsXG4gICAgICAgICAgICBkZDogJyVkIGxhdGhhJyxcbiAgICAgICAgICAgIE06ICdtw6xvcycsXG4gICAgICAgICAgICBNTTogJyVkIG3DrG9zYW4nLFxuICAgICAgICAgICAgeTogJ2JsaWFkaG5hJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYmxpYWRobmEnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZHxuYXxtaCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbnVtYmVyID09PSAxID8gJ2QnIDogbnVtYmVyICUgMTAgPT09IDIgPyAnbmEnIDogJ21oJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBnZDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHYWxpY2lhbiBbZ2xdXG4vLyEgYXV0aG9yIDogSnVhbiBHLiBIdXJ0YWRvIDogaHR0cHM6Ly9naXRodWIuY29tL2p1YW5naHVydGFkb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGdsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ2wnLCB7XG4gICAgICAgIG1vbnRoczogJ3hhbmVpcm9fZmVicmVpcm9fbWFyem9fYWJyaWxfbWFpb194dcOxb194dWxsb19hZ29zdG9fc2V0ZW1icm9fb3V0dWJyb19ub3ZlbWJyb19kZWNlbWJybycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAneGFuLl9mZWIuX21hci5fYWJyLl9tYWkuX3h1w7EuX3h1bC5fYWdvLl9zZXQuX291dC5fbm92Ll9kZWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnZG9taW5nb19sdW5zX21hcnRlc19tw6lyY29yZXNfeG92ZXNfdmVucmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb20uX2x1bi5fbWFyLl9tw6lyLl94b3YuX3Zlbi5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbcOpX3hvX3ZlX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tob3hlICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ8OhcycgOiAnw6EnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbWHDscOhICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ8OhcycgOiAnw6EnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnw6FzJyA6ICdhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW29udGUgJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnw6EnIDogJ2EnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbb10gZGRkZCBbcGFzYWRvICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ8OhcycgOiAnYScpICsgJ10gTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgICAgIGlmIChzdHIuaW5kZXhPZigndW4nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ24nICsgc3RyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VuICcgKyBzdHI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdDogJ2hhaSAlcycsXG4gICAgICAgICAgICBzOiAndW5zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VuaGEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1biBhbm8nLFxuICAgICAgICAgICAgeXk6ICclZCBhbm9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBnbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLb25rYW5pIERldmFuYWdhcmkgc2NyaXB0IFtnb20tZGV2YV1cbi8vISBhdXRob3IgOiBUaGUgRGlzY292ZXJlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9XaWtpRGlzY292ZXJlclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHM6IFsn4KSl4KWL4KSh4KSv4KS+IOCkuOClheCkleCkguCkoeCkvuCkguCkqOClgCcsICfgpKXgpYvgpKHgpYcg4KS44KWF4KSV4KSC4KShJ10sXG4gICAgICAgICAgICBzczogW251bWJlciArICcg4KS44KWF4KSV4KSC4KSh4KS+4KSC4KSo4KWAJywgbnVtYmVyICsgJyDgpLjgpYXgpJXgpILgpKEnXSxcbiAgICAgICAgICAgIG06IFsn4KSP4KSV4KS+IOCkruCkv+Cko+Ckn+CkvuCkqCcsICfgpI/gpJUg4KSu4KS/4KSo4KWC4KSfJ10sXG4gICAgICAgICAgICBtbTogW251bWJlciArICcg4KSu4KS/4KSj4KSf4KS+4KSC4KSo4KWAJywgbnVtYmVyICsgJyDgpK7gpL/gpKPgpJ/gpL7gpIInXSxcbiAgICAgICAgICAgIGg6IFsn4KSP4KSV4KS+IOCkteCksOCkvuCkqCcsICfgpI/gpJUg4KS14KSwJ10sXG4gICAgICAgICAgICBoaDogW251bWJlciArICcg4KS14KSw4KS+4KSC4KSo4KWAJywgbnVtYmVyICsgJyDgpLXgpLDgpL7gpIInXSxcbiAgICAgICAgICAgIGQ6IFsn4KSP4KSV4KS+IOCkpuCkv+CkuOCkvuCkqCcsICfgpI/gpJUg4KSm4KWA4KS4J10sXG4gICAgICAgICAgICBkZDogW251bWJlciArICcg4KSm4KS/4KS44KS+4KSC4KSo4KWAJywgbnVtYmVyICsgJyDgpKbgpYDgpLgnXSxcbiAgICAgICAgICAgIE06IFsn4KSP4KSV4KS+IOCkruCljeCkueCkr+CkqOCljeCkr+CkvuCkqCcsICfgpI/gpJUg4KSu4KWN4KS54KSv4KSo4KWLJ10sXG4gICAgICAgICAgICBNTTogW251bWJlciArICcg4KSu4KWN4KS54KSv4KSo4KWN4KSv4KS+4KSo4KWAJywgbnVtYmVyICsgJyDgpK7gpY3gpLngpK/gpKjgpYcnXSxcbiAgICAgICAgICAgIHk6IFsn4KSP4KSV4KS+IOCkteCksOCljeCkuOCkvuCkqCcsICfgpI/gpJUg4KS14KSw4KWN4KS4J10sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcg4KS14KSw4KWN4KS44KS+4KSC4KSo4KWAJywgbnVtYmVyICsgJyDgpLXgpLDgpY3gpLjgpL7gpIInXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG5cbiAgICB2YXIgZ29tRGV2YSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2dvbS1kZXZhJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ+CknOCkvuCkqOClh+CkteCkvuCksOClgF/gpKvgpYfgpKzgpY3gpLDgpYHgpLXgpL7gpLDgpYBf4KSu4KS+4KSw4KWN4KSaX+Ckj+CkquCljeCksOClgOCksl/gpK7gpYdf4KSc4KWC4KSoX+CknOClgeCksuCkr1/gpJHgpJfgpLjgpY3gpJ9f4KS44KSq4KWN4KSf4KWH4KSC4KSs4KSwX+CkkeCkleCljeCkn+Cli+CkrOCksF/gpKjgpYvgpLXgpY3gpLngpYfgpILgpKzgpLBf4KSh4KS/4KS44KWH4KSC4KSs4KSwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ+CknOCkvuCkqOClh+CkteCkvuCksOClgOCkmuCljeCkr+Ckvl/gpKvgpYfgpKzgpY3gpLDgpYHgpLXgpL7gpLDgpYDgpJrgpY3gpK/gpL5f4KSu4KS+4KSw4KWN4KSa4KS+4KSa4KWN4KSv4KS+X+Ckj+CkquCljeCksOClgOCksuCkvuCkmuCljeCkr+Ckvl/gpK7gpYfgpK/gpL7gpJrgpY3gpK/gpL5f4KSc4KWC4KSo4KS+4KSa4KWN4KSv4KS+X+CknOClgeCksuCkr+CkvuCkmuCljeCkr+Ckvl/gpJHgpJfgpLjgpY3gpJ/gpL7gpJrgpY3gpK/gpL5f4KS44KSq4KWN4KSf4KWH4KSC4KSs4KSw4KS+4KSa4KWN4KSv4KS+X+CkkeCkleCljeCkn+Cli+CkrOCksOCkvuCkmuCljeCkr+Ckvl/gpKjgpYvgpLXgpY3gpLngpYfgpILgpKzgpLDgpL7gpJrgpY3gpK/gpL5f4KSh4KS/4KS44KWH4KSC4KSs4KSw4KS+4KSa4KWN4KSv4KS+Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL01NTU0oXFxzKStEW29EXT8vLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgpJzgpL7gpKjgpYcuX+Ckq+Clh+CkrOCljeCksOClgS5f4KSu4KS+4KSw4KWN4KSaX+Ckj+CkquCljeCksOClgC5f4KSu4KWHX+CknOClguCkqF/gpJzgpYHgpLIuX+CkkeCkly5f4KS44KSq4KWN4KSf4KWH4KSCLl/gpJHgpJXgpY3gpJ/gpYsuX+CkqOCli+CkteCljeCkueClh+Ckgi5f4KSh4KS/4KS44KWH4KSCLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+CkhuCkr+CkpOCkvuCksF/gpLjgpYvgpK7gpL7gpLBf4KSu4KSC4KSX4KSz4KS+4KSwX+CkrOClgeCkp+CkteCkvuCksF/gpKzgpL/gpLDgpYfgpLjgpY3gpKTgpL7gpLBf4KS44KWB4KSV4KWN4KSw4KS+4KSwX+CktuClh+CkqOCkteCkvuCksCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CkhuCkr+CkpC5f4KS44KWL4KSuLl/gpK7gpILgpJfgpLMuX+CkrOClgeCkpy5f4KSs4KWN4KSw4KWH4KS44KWN4KSkLl/gpLjgpYHgpJXgpY3gpLAuX+CktuClh+CkqC4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4KSGX+CkuOCli1/gpK7gpIJf4KSs4KWBX+CkrOCljeCksOClh1/gpLjgpYFf4KS24KWHJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSBb4KS14KS+4KSc4KSk4KS+4KSCXScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MgW+CkteCkvuCknOCkpOCkvuCkgl0nLFxuICAgICAgICAgICAgTDogJ0RELU1NLVlZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBBIGg6bW0gW+CkteCkvuCknOCkpOCkvuCkgl0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gRG8sIFlZWVksIEEgaDptbSBb4KS14KS+4KSc4KSk4KS+4KSCXScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkLCBEIE1NTSBZWVlZLCBBIGg6bW0gW+CkteCkvuCknOCkpOCkvuCkgl0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgpIbgpK/gpJxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KSr4KS+4KSy4KWN4KSv4KS+4KSCXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vgpKvgpYHgpKHgpLLgpYtdIGRkZGRbLF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgpJXgpL7gpLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+Ckq+CkvuCkn+CksuCli10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgpIbgpKbgpYDgpIInLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o4KS14KWH4KSwKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgb3JkaW5hbCAn4KS14KWH4KSwJyBvbmx5IGFwcGxpZXMgdG8gZGF5IG9mIHRoZSBtb250aFxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+CkteClh+CksCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrXG4gICAgICAgICAgICBkb3k6IDMsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhciAoNyArIDAgLSA0KVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4KSw4KS+4KSk4KWAfOCkuOCkleCkvuCks+ClgOCkgnzgpKbgpKjgpKrgpL7gpLDgpL7gpIJ84KS44KS+4KSC4KSc4KWHLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4KSw4KS+4KSk4KWAJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KS44KSV4KS+4KSz4KWA4KSCJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkpuCkqOCkquCkvuCksOCkvuCkgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+IDEyID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLjgpL7gpILgpJzgpYcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSk4KWAJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpJXgpL7gpLPgpYDgpIInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkpuCkqOCkquCkvuCksOCkvuCkgic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KS+4KSC4KSc4KWHJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpYAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdvbURldmE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS29ua2FuaSBMYXRpbiBzY3JpcHQgW2dvbS1sYXRuXVxuLy8hIGF1dGhvciA6IFRoZSBEaXNjb3ZlcmVyIDogaHR0cHM6Ly9naXRodWIuY29tL1dpa2lEaXNjb3ZlcmVyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgczogWyd0aG9kZGVhIHNla29uZGFtbmknLCAndGhvZGRlIHNla29uZCddLFxuICAgICAgICAgICAgc3M6IFtudW1iZXIgKyAnIHNla29uZGFtbmknLCBudW1iZXIgKyAnIHNla29uZCddLFxuICAgICAgICAgICAgbTogWydla2EgbWludGFuJywgJ2VrIG1pbnV0J10sXG4gICAgICAgICAgICBtbTogW251bWJlciArICcgbWludGFtbmknLCBudW1iZXIgKyAnIG1pbnRhbSddLFxuICAgICAgICAgICAgaDogWydla2Egdm9yYW4nLCAnZWsgdm9yJ10sXG4gICAgICAgICAgICBoaDogW251bWJlciArICcgdm9yYW1uaScsIG51bWJlciArICcgdm9yYW0nXSxcbiAgICAgICAgICAgIGQ6IFsnZWthIGRpc2FuJywgJ2VrIGRpcyddLFxuICAgICAgICAgICAgZGQ6IFtudW1iZXIgKyAnIGRpc2FtbmknLCBudW1iZXIgKyAnIGRpcyddLFxuICAgICAgICAgICAgTTogWydla2EgbWhvaW5lYW4nLCAnZWsgbWhvaW5vJ10sXG4gICAgICAgICAgICBNTTogW251bWJlciArICcgbWhvaW5lYW1uaScsIG51bWJlciArICcgbWhvaW5lJ10sXG4gICAgICAgICAgICB5OiBbJ2VrYSB2b3JzYW4nLCAnZWsgdm9yb3MnXSxcbiAgICAgICAgICAgIHl5OiBbbnVtYmVyICsgJyB2b3JzYW1uaScsIG51bWJlciArICcgdm9yc2FtJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc0Z1dHVyZSA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgdmFyIGdvbUxhdG4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdnb20tbGF0bicsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdKYW5lcl9GZWJyZXJfTWFyc19BYnJpbF9NYWlfSnVuX0p1bGFpX0Fnb3N0X1NldGVtYnJfT3R1YnJfTm92ZW1icl9EZXplbWJyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ0phbmVyYWNoZWFfRmVicmVyYWNoZWFfTWFyc2FjaGVhX0FicmlsYWNoZWFfTWFpYWNoZWFfSnVuYWNoZWFfSnVsYWlhY2hlYV9BZ29zdGFjaGVhX1NldGVtYnJhY2hlYV9PdHVicmFjaGVhX05vdmVtYnJhY2hlYV9EZXplbWJyYWNoZWEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvTU1NTShcXHMpK0Rbb0RdPy8sXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0phbi5fRmViLl9NYXJzX0Fici5fTWFpX0p1bl9KdWwuX0Fnby5fU2V0Ll9PdHUuX05vdi5fRGV6Licuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6IFwiQWl0YXJfU29tYXJfTW9uZ2xsYXJfQnVkaHZhcl9CaXJlc3Rhcl9TdWtyYXJfU29uJ3ZhclwiLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdBaXQuX1NvbS5fTW9uLl9CdWQuX0JyZS5fU3VrLl9Tb24uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0FpX1NtX01vX0J1X0JyX1N1X1NuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSBbdmF6dGFdJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyBbdmF6dGFdJyxcbiAgICAgICAgICAgIEw6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgQSBoOm1tIFt2YXp0YV0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gRG8sIFlZWVksIEEgaDptbSBbdmF6dGFdJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIEQgTU1NIFlZWVksIEEgaDptbSBbdmF6dGFdJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQWl6XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0ZhbGVhbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbRnVkZGxvXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS2FsXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tGYXR0bG9dIGRkZGRbLF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWRpbScsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShlcikvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIG9yZGluYWwgJ2VyJyBvbmx5IGFwcGxpZXMgdG8gZGF5IG9mIHRoZSBtb250aFxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ2VyJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWtcbiAgICAgICAgICAgIGRveTogMywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyICg3ICsgMCAtIDQpXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9yYXRpfHNva2FsbGltfGRvbnBhcmFtfHNhbmplLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAncmF0aScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3Nva2FsbGltJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ2RvbnBhcmFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID4gMTIgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NhbmplJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JhdGknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3Nva2FsbGltJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkb25wYXJhbSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc2FuamUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JhdGknO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdvbUxhdG47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR3VqYXJhdGkgW2d1XVxuLy8hIGF1dGhvciA6IEthdXNoaWsgVGhhbmtpIDogaHR0cHM6Ly9naXRodWIuY29tL0thdXNoaWsxOTg3XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+CrpycsXG4gICAgICAgICAgICAyOiAn4KuoJyxcbiAgICAgICAgICAgIDM6ICfgq6knLFxuICAgICAgICAgICAgNDogJ+CrqicsXG4gICAgICAgICAgICA1OiAn4KurJyxcbiAgICAgICAgICAgIDY6ICfgq6wnLFxuICAgICAgICAgICAgNzogJ+CrrScsXG4gICAgICAgICAgICA4OiAn4KuuJyxcbiAgICAgICAgICAgIDk6ICfgq68nLFxuICAgICAgICAgICAgMDogJ+CrpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgq6cnOiAnMScsXG4gICAgICAgICAgICAn4KuoJzogJzInLFxuICAgICAgICAgICAgJ+CrqSc6ICczJyxcbiAgICAgICAgICAgICfgq6onOiAnNCcsXG4gICAgICAgICAgICAn4KurJzogJzUnLFxuICAgICAgICAgICAgJ+CrrCc6ICc2JyxcbiAgICAgICAgICAgICfgq60nOiAnNycsXG4gICAgICAgICAgICAn4KuuJzogJzgnLFxuICAgICAgICAgICAgJ+Crryc6ICc5JyxcbiAgICAgICAgICAgICfgq6YnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgZ3UgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdndScsIHtcbiAgICAgICAgbW9udGhzOiAn4Kqc4Kq+4Kqo4KuN4Kqv4KuB4KqG4Kqw4KuAX+Cqq+Crh+CqrOCrjeCqsOCrgeCqhuCqsOCrgF/gqq7gqr7gqrDgq43gqppf4KqP4Kqq4KuN4Kqw4Kq/4KqyX+CqruCrh1/gqpzgq4Lgqqhf4Kqc4KuB4Kqy4Kq+4KqIX+CqkeCql+CquOCrjeCqn1/gqrjgqqrgq43gqp/gq4fgqq7gq43gqqzgqrBf4KqR4KqV4KuN4Kqf4KuN4Kqs4KqwX+CqqOCqteCrh+CqruCrjeCqrOCqsF/gqqHgqr/gqrjgq4fgqq7gq43gqqzgqrAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CqnOCqvuCqqOCrjeCqr+CrgS5f4Kqr4KuH4Kqs4KuN4Kqw4KuBLl/gqq7gqr7gqrDgq43gqppf4KqP4Kqq4KuN4Kqw4Kq/Ll/gqq7gq4df4Kqc4KuC4KqoX+CqnOCrgeCqsuCqvi5f4KqR4KqXLl/gqrjgqqrgq43gqp/gq4cuX+CqkeCqleCrjeCqn+CrjS5f4Kqo4Kq14KuHLl/gqqHgqr/gqrjgq4cuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn4Kqw4Kq14Kq/4Kq14Kq+4KqwX+CquOCri+CqruCqteCqvuCqsF/gqq7gqoLgqpfgqrPgqrXgqr7gqrBf4Kqs4KuB4Kqn4KuN4Kq14Kq+4KqwX+Cql+CrgeCqsOCrgeCqteCqvuCqsF/gqrbgq4HgqpXgq43gqrDgqrXgqr7gqrBf4Kq24Kqo4Kq/4Kq14Kq+4KqwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4Kqw4Kq14Kq/X+CquOCri+Cqrl/gqq7gqoLgqpfgqrNf4Kqs4KuB4Kqn4KuNX+Cql+CrgeCqsOCrgV/gqrbgq4HgqpXgq43gqrBf4Kq24Kqo4Kq/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CqsF/gqrjgq4tf4Kqu4KqCX+CqrOCrgV/gqpfgq4Ff4Kq24KuBX+Cqticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIOCqteCqvuCql+CrjeCqr+CrhycsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3Mg4Kq14Kq+4KqX4KuN4Kqv4KuHJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgqrXgqr7gqpfgq43gqq/gq4cnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4Kq14Kq+4KqX4KuN4Kqv4KuHJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KqG4KqcXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CqleCqvuCqsuCrh10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+Cql+Cqh+CqleCqvuCqsuCrh10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4Kqq4Kq+4Kqb4Kqy4Kq+XSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCqruCqvicsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4Kqq4Kq54KuH4Kqy4Kq+JyxcbiAgICAgICAgICAgIHM6ICfgqoXgqq7gq4HgqpUg4Kqq4Kqz4KuLJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Kq44KuH4KqV4KqC4KqhJyxcbiAgICAgICAgICAgIG06ICfgqo/gqpUg4Kqu4Kq/4Kqo4Kq/4KqfJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4Kqu4Kq/4Kqo4Kq/4KqfJyxcbiAgICAgICAgICAgIGg6ICfgqo/gqpUg4KqV4Kqy4Kq+4KqVJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KqV4Kqy4Kq+4KqVJyxcbiAgICAgICAgICAgIGQ6ICfgqo/gqpUg4Kqm4Kq/4Kq14Kq4JyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Kqm4Kq/4Kq14Kq4JyxcbiAgICAgICAgICAgIE06ICfgqo/gqpUg4Kqu4Kq54Kq/4Kqo4KuLJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4Kqu4Kq54Kq/4Kqo4KuLJyxcbiAgICAgICAgICAgIHk6ICfgqo/gqpUg4Kq14Kqw4KuN4Kq3JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Kq14Kqw4KuN4Kq3JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Crp+CrqOCrqeCrquCrq+CrrOCrreCrruCrr+Crpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gR3VqYXJhdGkgbm90YXRpb24gZm9yIG1lcmlkaWVtcyBhcmUgcXVpdGUgZnV6enkgaW4gcHJhY3RpY2UuIFdoaWxlIHRoZXJlIGV4aXN0c1xuICAgICAgICAvLyBhIHJpZ2lkIG5vdGlvbiBvZiBhICdQYWhhcicgaXQgaXMgbm90IHVzZWQgYXMgcmlnaWRseSBpbiBtb2Rlcm4gR3VqYXJhdGkuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gqrDgqr7gqqR84Kqs4Kqq4KuL4KqwfOCquOCqteCqvuCqsHzgqrjgqr7gqoLgqpwvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgqrDgqr7gqqQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqrjgqrXgqr7gqrAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kqs4Kqq4KuL4KqwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqrjgqr7gqoLgqpwnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kqw4Kq+4KqkJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqrjgqrXgqr7gqrAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CqrOCqquCri+CqsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kq44Kq+4KqC4KqcJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqrDgqr7gqqQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3U7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSGVicmV3IFtoZV1cbi8vISBhdXRob3IgOiBUb21lciBDb2hlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS90b21lclxuLy8hIGF1dGhvciA6IE1vc2hlIFNpbWFudG92IDogaHR0cHM6Ly9naXRodWIuY29tL0RldmVsb3BtZW50SUxcbi8vISBhdXRob3IgOiBUYWwgQXRlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9UYWxBdGVyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgaGUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdoZScsIHtcbiAgICAgICAgbW9udGhzOiAn15nXoNeV15DXqF/XpNeR16jXldeQ16hf157XqNelX9eQ16TXqNeZ15xf157XkNeZX9eZ15XXoNeZX9eZ15XXnNeZX9eQ15XXkteV16HXmF/Xodek15jXnteR16hf15DXlden15jXldeR16hf16DXldeR157XkdeoX9eT16bXnteR16gnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9eZ16DXldezX9ek15HXqNezX9ee16jXpV/XkNek16jXs1/XnteQ15lf15nXldeg15lf15nXldec15lf15DXldeS17Nf16HXpNeY17Nf15DXlden17Nf16DXldeR17Nf15PXptee17MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn16jXkNep15XXn1/Xqdeg15lf16nXnNeZ16nXmV/XqNeR15nXoteZX9eX157Xmdep15lf16nXmdep15lf16nXkdeqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn15DXs1/XkdezX9eS17Nf15PXs1/XlNezX9eV17Nf16nXsycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfXkF/XkV/Xkl/Xk1/XlF/XlV/XqScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFvXkV1NTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBb15FdTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFvXkV1NTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgbDogJ0QvTS9ZWVlZJyxcbiAgICAgICAgICAgIGxsOiAnRCBNTU0gWVlZWScsXG4gICAgICAgICAgICBsbGw6ICdEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIEQgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vXlNeZ15XXnSDXkda+XUxUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb157Xl9eoINeR1r5dTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvXkdep16LXlF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vXkNeq157XldecINeR1r5dTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb15HXmdeV151dIGRkZGQgW9eU15DXl9eo15XXnyDXkdep16LXlF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfXkdei15XXkyAlcycsXG4gICAgICAgICAgICBwYXN0OiAn15zXpNeg15kgJXMnLFxuICAgICAgICAgICAgczogJ9ee16HXpNeoINep16DXmdeV16onLFxuICAgICAgICAgICAgc3M6ICclZCDXqdeg15nXldeqJyxcbiAgICAgICAgICAgIG06ICfXk9en15QnLFxuICAgICAgICAgICAgbW06ICclZCDXk9en15XXqicsXG4gICAgICAgICAgICBoOiAn16nXoteUJyxcbiAgICAgICAgICAgIGhoOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9ep16LXqteZ15nXnSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINep16LXldeqJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkOiAn15nXldedJyxcbiAgICAgICAgICAgIGRkOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ9eZ15XXnteZ15nXnSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINeZ157XmdedJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBNOiAn15fXldeT16knLFxuICAgICAgICAgICAgTU06IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAn15fXldeT16nXmdeZ150nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDXl9eV15PXqdeZ150nO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHk6ICfXqdeg15QnLFxuICAgICAgICAgICAgeXk6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAn16nXoNeq15nXmdedJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciAlIDEwID09PSAwICYmIG51bWJlciAhPT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg16nXoNeUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg16nXoNeZ150nO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTpcbiAgICAgICAgICAgIC/XkNeX15RcItemfNec16TXoNeUXCLXpnzXkNeX16jXmSDXlNem15TXqNeZ15nXnXzXnNek16DXmSDXlNem15TXqNeZ15nXnXzXnNek16DXldeqINeR15XXp9eofNeR15HXlden16h815HXoteo15EvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o15DXl9eUXCLXpnzXkNeX16jXmSDXlNem15TXqNeZ15nXnXzXkdei16jXkSkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn15zXpNeg15XXqiDXkdeV16fXqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn15HXkdeV16fXqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ9ec16TXoNeUXCLXpicgOiAn15zXpNeg15kg15TXpteU16jXmdeZ150nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfXkNeX15RcItemJyA6ICfXkNeX16jXmSDXlNem15TXqNeZ15nXnSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn15HXoteo15EnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhlO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEhpbmRpIFtoaV1cbi8vISBhdXRob3IgOiBNYXlhbmsgU2luZ2hhbCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXlhbmtzaW5naGFsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+ClpycsXG4gICAgICAgICAgICAyOiAn4KWoJyxcbiAgICAgICAgICAgIDM6ICfgpaknLFxuICAgICAgICAgICAgNDogJ+ClqicsXG4gICAgICAgICAgICA1OiAn4KWrJyxcbiAgICAgICAgICAgIDY6ICfgpawnLFxuICAgICAgICAgICAgNzogJ+ClrScsXG4gICAgICAgICAgICA4OiAn4KWuJyxcbiAgICAgICAgICAgIDk6ICfgpa8nLFxuICAgICAgICAgICAgMDogJ+ClpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgpacnOiAnMScsXG4gICAgICAgICAgICAn4KWoJzogJzInLFxuICAgICAgICAgICAgJ+ClqSc6ICczJyxcbiAgICAgICAgICAgICfgpaonOiAnNCcsXG4gICAgICAgICAgICAn4KWrJzogJzUnLFxuICAgICAgICAgICAgJ+ClrCc6ICc2JyxcbiAgICAgICAgICAgICfgpa0nOiAnNycsXG4gICAgICAgICAgICAn4KWuJzogJzgnLFxuICAgICAgICAgICAgJ+Clryc6ICc5JyxcbiAgICAgICAgICAgICfgpaYnOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL17gpJzgpKgvaSxcbiAgICAgICAgICAgIC9e4KSr4KS84KSwfOCkq+CksC9pLFxuICAgICAgICAgICAgL17gpK7gpL7gpLDgpY3gpJovaSxcbiAgICAgICAgICAgIC9e4KSF4KSq4KWN4KSw4KWIL2ksXG4gICAgICAgICAgICAvXuCkruCkiC9pLFxuICAgICAgICAgICAgL17gpJzgpYLgpKgvaSxcbiAgICAgICAgICAgIC9e4KSc4KWB4KSyL2ksXG4gICAgICAgICAgICAvXuCkheCkly9pLFxuICAgICAgICAgICAgL17gpLjgpL/gpKTgpIJ84KS44KS/4KSkL2ksXG4gICAgICAgICAgICAvXuCkheCkleCljeCkn+Clgi9pLFxuICAgICAgICAgICAgL17gpKjgpLV84KSo4KS14KSCL2ksXG4gICAgICAgICAgICAvXuCkpuCkv+CkuOCkgnzgpKbgpL/gpLgvaSxcbiAgICAgICAgXSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9e4KSc4KSoL2ksXG4gICAgICAgICAgICAvXuCkq+CkvOCksC9pLFxuICAgICAgICAgICAgL17gpK7gpL7gpLDgpY3gpJovaSxcbiAgICAgICAgICAgIC9e4KSF4KSq4KWN4KSw4KWIL2ksXG4gICAgICAgICAgICAvXuCkruCkiC9pLFxuICAgICAgICAgICAgL17gpJzgpYLgpKgvaSxcbiAgICAgICAgICAgIC9e4KSc4KWB4KSyL2ksXG4gICAgICAgICAgICAvXuCkheCkly9pLFxuICAgICAgICAgICAgL17gpLjgpL/gpKQvaSxcbiAgICAgICAgICAgIC9e4KSF4KSV4KWN4KSf4KWCL2ksXG4gICAgICAgICAgICAvXuCkqOCktS9pLFxuICAgICAgICAgICAgL17gpKbgpL/gpLgvaSxcbiAgICAgICAgXTtcblxuICAgIHZhciBoaSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2hpJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ+CknOCkqOCkteCksOClgF/gpKvgpLzgpLDgpLXgpLDgpYBf4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCliOCksl/gpK7gpIhf4KSc4KWC4KSoX+CknOClgeCksuCkvuCkiF/gpIXgpJfgpLjgpY3gpKRf4KS44KS/4KSk4KSu4KWN4KSs4KSwX+CkheCkleCljeCkn+ClguCkrOCksF/gpKjgpLXgpK7gpY3gpKzgpLBf4KSm4KS/4KS44KSu4KWN4KSs4KSwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfgpJzgpKjgpLXgpLDgpYBf4KSr4KSw4KS14KSw4KWAX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpYjgpLJf4KSu4KSIX+CknOClguCkqF/gpJzgpYHgpLLgpL7gpIhf4KSF4KSX4KS44KWN4KSkX+CkuOCkv+CkpOCkguCkrOCksF/gpIXgpJXgpY3gpJ/gpYLgpKzgpLBf4KSo4KS14KSC4KSs4KSwX+CkpuCkv+CkuOCkguCkrOCksCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CknOCkqC5f4KSr4KS84KSwLl/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KWILl/gpK7gpIhf4KSc4KWC4KSoX+CknOClgeCksi5f4KSF4KSXLl/gpLjgpL/gpKQuX+CkheCkleCljeCkn+Clgi5f4KSo4KS1Ll/gpKbgpL/gpLguJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ+CksOCkteCkv+CkteCkvuCksF/gpLjgpYvgpK7gpLXgpL7gpLBf4KSu4KSC4KSX4KSy4KS14KS+4KSwX+CkrOClgeCkp+CkteCkvuCksF/gpJfgpYHgpLDgpYLgpLXgpL7gpLBf4KS24KWB4KSV4KWN4KSw4KS14KS+4KSwX+CktuCkqOCkv+CkteCkvuCksCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CksOCkteCkv1/gpLjgpYvgpK5f4KSu4KSC4KSX4KSyX+CkrOClgeCkp1/gpJfgpYHgpLDgpYJf4KS24KWB4KSV4KWN4KSwX+CktuCkqOCkvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgpLBf4KS44KWLX+CkruCkgl/gpKzgpYFf4KSX4KWBX+CktuClgV/gpLYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCkrOCknOClhycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCkrOCknOClhycsXG4gICAgICAgIH0sXG5cbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBzaG9ydE1vbnRoc1BhcnNlLFxuXG4gICAgICAgIG1vbnRoc1JlZ2V4OlxuICAgICAgICAgICAgL14o4KSc4KSo4KS14KSw4KWAfOCknOCkqFxcLj984KSr4KS84KSw4KS14KSw4KWAfOCkq+CksOCkteCksOClgHzgpKvgpLzgpLBcXC4/fOCkruCkvuCksOCljeCkmj984KSF4KSq4KWN4KSw4KWI4KSyfOCkheCkquCljeCksOCliFxcLj984KSu4KSIP3zgpJzgpYLgpKg/fOCknOClgeCksuCkvuCkiHzgpJzgpYHgpLJcXC4/fOCkheCkl+CkuOCljeCkpHzgpIXgpJdcXC4/fOCkuOCkv+CkpOCkruCljeCkrOCksHzgpLjgpL/gpKTgpILgpKzgpLB84KS44KS/4KSkXFwuP3zgpIXgpJXgpY3gpJ/gpYLgpKzgpLB84KSF4KSV4KWN4KSf4KWCXFwuP3zgpKjgpLXgpK7gpY3gpKzgpLB84KSo4KS14KSC4KSs4KSwfOCkqOCktVxcLj984KSm4KS/4KS44KSu4KWN4KSs4KSwfOCkpuCkv+CkuOCkguCkrOCksHzgpKbgpL/gpLhcXC4/KS9pLFxuXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6XG4gICAgICAgICAgICAvXijgpJzgpKjgpLXgpLDgpYB84KSc4KSoXFwuP3zgpKvgpLzgpLDgpLXgpLDgpYB84KSr4KSw4KS14KSw4KWAfOCkq+CkvOCksFxcLj984KSu4KS+4KSw4KWN4KSaP3zgpIXgpKrgpY3gpLDgpYjgpLJ84KSF4KSq4KWN4KSw4KWIXFwuP3zgpK7gpIg/fOCknOClguCkqD984KSc4KWB4KSy4KS+4KSIfOCknOClgeCkslxcLj984KSF4KSX4KS44KWN4KSkfOCkheCkl1xcLj984KS44KS/4KSk4KSu4KWN4KSs4KSwfOCkuOCkv+CkpOCkguCkrOCksHzgpLjgpL/gpKRcXC4/fOCkheCkleCljeCkn+ClguCkrOCksHzgpIXgpJXgpY3gpJ/gpYJcXC4/fOCkqOCkteCkruCljeCkrOCksHzgpKjgpLXgpILgpKzgpLB84KSo4KS1XFwuP3zgpKbgpL/gpLjgpK7gpY3gpKzgpLB84KSm4KS/4KS44KSC4KSs4KSwfOCkpuCkv+CkuFxcLj8pL2ksXG5cbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXijgpJzgpKjgpLXgpLDgpYA/fOCkq+CkvOCksOCkteCksOClgHzgpKvgpLDgpLXgpLDgpYA/fOCkruCkvuCksOCljeCkmj984KSF4KSq4KWN4KSw4KWI4KSyP3zgpK7gpIg/fOCknOClguCkqD984KSc4KWB4KSy4KS+4KSIP3zgpIXgpJfgpLjgpY3gpKQ/fOCkuOCkv+CkpOCkruCljeCkrOCksHzgpLjgpL/gpKTgpILgpKzgpLB84KS44KS/4KSkP1xcLj984KSF4KSV4KWN4KSf4KWC4KSs4KSwfOCkheCkleCljeCkn+ClglxcLj984KSo4KS14KSu4KWN4KSs4KSwfOCkqOCkteCkguCkrOCksD984KSm4KS/4KS44KSu4KWN4KSs4KSwfOCkpuCkv+CkuOCkguCkrOCksD8pL2ksXG5cbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKOCknOCkqFxcLj984KSr4KS84KSwXFwuP3zgpK7gpL7gpLDgpY3gpJo/fOCkheCkquCljeCksOCliFxcLj984KSu4KSIP3zgpJzgpYLgpKg/fOCknOClgeCkslxcLj984KSF4KSXXFwuP3zgpLjgpL/gpKRcXC4/fOCkheCkleCljeCkn+ClglxcLj984KSo4KS1XFwuP3zgpKbgpL/gpLhcXC4/KS9pLFxuXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpJXgpLJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgpJXgpLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CkquCkv+Ckm+CksuClh10gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgpK7gpYfgpIInLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCkquCkueCksuClhycsXG4gICAgICAgICAgICBzOiAn4KSV4KWB4KSbIOCkueClgCDgpJXgpY3gpLfgpKMnLFxuICAgICAgICAgICAgc3M6ICclZCDgpLjgpYfgpJXgpILgpKEnLFxuICAgICAgICAgICAgbTogJ+Ckj+CklSDgpK7gpL/gpKjgpJ8nLFxuICAgICAgICAgICAgbW06ICclZCDgpK7gpL/gpKjgpJ8nLFxuICAgICAgICAgICAgaDogJ+Ckj+CklSDgpJjgpILgpJ/gpL4nLFxuICAgICAgICAgICAgaGg6ICclZCDgpJjgpILgpJ/gpYcnLFxuICAgICAgICAgICAgZDogJ+Ckj+CklSDgpKbgpL/gpKgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgpKbgpL/gpKgnLFxuICAgICAgICAgICAgTTogJ+Ckj+CklSDgpK7gpLngpYDgpKjgpYcnLFxuICAgICAgICAgICAgTU06ICclZCDgpK7gpLngpYDgpKjgpYcnLFxuICAgICAgICAgICAgeTogJ+Ckj+CklSDgpLXgpLDgpY3gpLcnLFxuICAgICAgICAgICAgeXk6ICclZCDgpLXgpLDgpY3gpLcnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4KWn4KWo4KWp4KWq4KWr4KWs4KWt4KWu4KWv4KWmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvLyBIaW5kaSBub3RhdGlvbiBmb3IgbWVyaWRpZW1zIGFyZSBxdWl0ZSBmdXp6eSBpbiBwcmFjdGljZS4gV2hpbGUgdGhlcmUgZXhpc3RzXG4gICAgICAgIC8vIGEgcmlnaWQgbm90aW9uIG9mIGEgJ1BhaGFyJyBpdCBpcyBub3QgdXNlZCBhcyByaWdpZGx5IGluIG1vZGVybiBIaW5kaS5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CksOCkvuCkpHzgpLjgpYHgpKzgpLl84KSm4KWL4KSq4KS54KSwfOCktuCkvuCkri8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CksOCkvuCkpCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOClgeCkrOCkuScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKbgpYvgpKrgpLngpLAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CktuCkvuCkricpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOClgeCkrOCkuSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KWL4KSq4KS54KSwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLbgpL7gpK4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBoaTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDcm9hdGlhbiBbaHJdXG4vLyEgYXV0aG9yIDogQm9qYW4gTWFya292acSHIDogaHR0cHM6Ly9naXRodWIuY29tL2JtYXJrb3ZpY1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmRlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnamVkbmEgbWludXRhJyA6ICdqZWRuZSBtaW51dGUnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWludXRhJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2plZGFuIHNhdCcgOiAnamVkbm9nIHNhdGEnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdGknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdkYW4nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuYSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlYyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2EnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaHInLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAnc2lqZcSNbmphX3ZlbGphxI1lX2/FvnVqa2FfdHJhdm5qYV9zdmlibmphX2xpcG5qYV9zcnBuamFfa29sb3ZvemFfcnVqbmFfbGlzdG9wYWRhX3N0dWRlbm9nYV9wcm9zaW5jYScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnc2lqZcSNYW5qX3ZlbGphxI1hX2/FvnVqYWtfdHJhdmFual9zdmliYW5qX2xpcGFual9zcnBhbmpfa29sb3Zvel9ydWphbl9saXN0b3BhZF9zdHVkZW5pX3Byb3NpbmFjJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnc2lqLl92ZWxqLl9vxb51Ll90cmEuX3N2aS5fbGlwLl9zcnAuX2tvbC5fcnVqLl9saXMuX3N0dS5fcHJvLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGplbGphX3BvbmVkamVsamFrX3V0b3Jha19zcmlqZWRhX8SNZXR2cnRha19wZXRha19zdWJvdGEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZWQuX3Bvbi5fdXRvLl9zcmkuX8SNZXQuX3BldC5fc3ViLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb191dF9zcl/EjWVfcGVfc3UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRG8gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0RvIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEbyBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmFzIHVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc3V0cmEgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW25lZGplbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3JpamVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2p1xI1lciB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWx1XSBbbmVkamVsanVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbHVdIFtzcmlqZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWxlXSBbc3Vib3RlXSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWxpXSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByaWplICVzJyxcbiAgICAgICAgICAgIHM6ICdwYXIgc2VrdW5kaScsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiAnZGFuJyxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiAnbWplc2VjJyxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiAnZ29kaW51JyxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaHI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSHVuZ2FyaWFuIFtodV1cbi8vISBhdXRob3IgOiBBZGFtIEJydW5uZXIgOiBodHRwczovL2dpdGh1Yi5jb20vYWRhbWJydW5uZXJcbi8vISBhdXRob3IgOiBQZXRlciBWaXN6dCAgOiBodHRwczovL2dpdGh1Yi5jb20vcGFzc2F0Z3RcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB3ZWVrRW5kaW5ncyA9XG4gICAgICAgICd2YXPDoXJuYXAgaMOpdGbFkW4ga2VkZGVuIHN6ZXJkw6FuIGNzw7x0w7ZydMO2a8O2biBww6ludGVrZW4gc3pvbWJhdG9uJy5zcGxpdCgnICcpO1xuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIG51bSA9IG51bWJlcjtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4XG4gICAgICAgICAgICAgICAgICAgID8gJ27DqWjDoW55IG3DoXNvZHBlcmMnXG4gICAgICAgICAgICAgICAgICAgIDogJ27DqWjDoW55IG3DoXNvZHBlcmNlJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXgpXG4gICAgICAgICAgICAgICAgICAgID8gJyBtw6Fzb2RwZXJjJ1xuICAgICAgICAgICAgICAgICAgICA6ICcgbcOhc29kcGVyY2UnO1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlZ3knICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIHBlcmMnIDogJyBwZXJjZScpO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgcGVyYycgOiAnIHBlcmNlJyk7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VneScgKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgw7NyYScgOiAnIMOzcsOhamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIMOzcmEnIDogJyDDs3LDoWphJyk7XG4gICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VneScgKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgbmFwJyA6ICcgbmFwamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIG5hcCcgOiAnIG5hcGphJyk7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VneScgKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgaMOzbmFwJyA6ICcgaMOzbmFwamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICsgKGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyAnIGjDs25hcCcgOiAnIGjDs25hcGphJyk7XG4gICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VneScgKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgw6l2JyA6ICcgw6l2ZScpO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgw6l2JyA6ICcgw6l2ZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgZnVuY3Rpb24gd2Vlayhpc0Z1dHVyZSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGlzRnV0dXJlID8gJycgOiAnW23Dumx0XSAnKSArXG4gICAgICAgICAgICAnWycgK1xuICAgICAgICAgICAgd2Vla0VuZGluZ3NbdGhpcy5kYXkoKV0gK1xuICAgICAgICAgICAgJ10gTFRbLWtvcl0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIGh1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaHUnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnXDoXJfZmVicnXDoXJfbcOhcmNpdXNfw6FwcmlsaXNfbcOhanVzX2rDum5pdXNfasO6bGl1c19hdWd1c3p0dXNfc3plcHRlbWJlcl9va3TDs2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX23DoXJjLl/DoXByLl9tw6FqLl9qw7puLl9qw7psLl9hdWcuX3N6ZXB0Ll9va3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ3Zhc8Ohcm5hcF9ow6l0ZsWRX2tlZGRfc3plcmRhX2Nzw7x0w7ZydMO2a19ww6ludGVrX3N6b21iYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICd2YXNfaMOpdF9rZWRkX3N6ZV9jc8O8dF9ww6luX3N6bycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICd2X2hfa19zemVfY3NfcF9zem8nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS5NTS5ERC4nLFxuICAgICAgICAgICAgTEw6ICdZWVlZLiBNTU1NIEQuJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkuIE1NTU0gRC4gSDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWS4gTU1NTSBELiwgZGRkZCBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2RlfGR1L2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LmNoYXJBdCgxKS50b0xvd2VyQ2FzZSgpID09PSAndSc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPT09IHRydWUgPyAnZGUnIDogJ0RFJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPT09IHRydWUgPyAnZHUnIDogJ0RVJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbbWFdIExUWy1rb3JdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbaG9sbmFwXSBMVFsta29yXScsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3ZWVrLmNhbGwodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1t0ZWduYXBdIExUWy1rb3JdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdlZWsuY2FsbCh0aGlzLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBtw7psdmEnLFxuICAgICAgICAgICAgcGFzdDogJyVzJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBodTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcm1lbmlhbiBbaHktYW1dXG4vLyEgYXV0aG9yIDogQXJtZW5kYXJhYnlhbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hcm1lbmRhcmFieWFuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgaHlBbSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2h5LWFtJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9Ww1bjWgtW21b7VodaA1atf1oPVpdW/1oDVvtWh1oDVq1/VtNWh1oDVv9WrX9Wh1brWgNWr1azVq1/VtNWh1bXVq9W91atf1bDVuNaC1bbVq9W91atf1bDVuNaC1azVq9W91atf1oXVo9W41b3Vv9W41b3Vq1/VvdWl1brVv9Wl1bTVotWl1oDVq1/VsNW41a/Vv9Wl1bTVotWl1oDVq1/VttW41bXVpdW01aLVpdaA1atf1aTVpdWv1b/VpdW01aLVpdaA1asnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9Ww1bjWgtW21b7VodaAX9aD1aXVv9aA1b7VodaAX9W01aHWgNW/X9Wh1brWgNWr1axf1bTVodW11avVvV/VsNW41oLVttWr1b1f1bDVuNaC1azVq9W9X9aF1aPVuNW91b/VuNW9X9W91aXVutW/1aXVtNWi1aXWgF/VsNW41a/Vv9Wl1bTVotWl1oBf1bbVuNW11aXVtNWi1aXWgF/VpNWl1a/Vv9Wl1bTVotWl1oAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDogJ9Ww1bbVvl/Wg9W/1oBf1bTWgNW/X9Wh1brWgF/VtNW11b1f1bDVttW9X9Ww1azVvV/WhdWj1b1f1b3VutW/X9Ww1a/Vv1/VttW01aJf1aTVr9W/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfVr9Wr1oDVodWv1atf1aXWgNWv1bjWgtW31aHVotWp1atf1aXWgNWl1oTVt9Wh1aLVqdWrX9W51bjWgNWl1oTVt9Wh1aLVqdWrX9Ww1avVttWj1bfVodWi1anVq1/VuNaC1oDVotWh1alf1bfVodWi1aHVqScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn1a/WgNWvX9Wl1oDVr1/VpdaA1oRf1bnWgNaEX9Ww1bbVo1/VuNaC1oDVol/Vt9Wi1aknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn1a/WgNWvX9Wl1oDVr1/VpdaA1oRf1bnWgNaEX9Ww1bbVo1/VuNaC1oDVol/Vt9Wi1aknLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVkg1akuJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZINWpLiwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZINWpLiwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vVodW11b3WhdaAXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9W+1aHVstWoXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9Wl1oDVpdWvXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBb1oXWgNWoINWq1aHVtNWoXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1vVodW21oHVodWuXSBkZGRkIFvWhdaA1agg1arVodW01ahdIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINWw1aXVv9W4JyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDVodW81aHVuycsXG4gICAgICAgICAgICBzOiAn1bTVqyDWhNWh1bbVqyDVvtWh1bXWgNWv1bXVodW2JyxcbiAgICAgICAgICAgIHNzOiAnJWQg1b7VodW11oDVr9W11aHVticsXG4gICAgICAgICAgICBtOiAn1oDVuNW61aUnLFxuICAgICAgICAgICAgbW06ICclZCDWgNW41brVpScsXG4gICAgICAgICAgICBoOiAn1arVodW0JyxcbiAgICAgICAgICAgIGhoOiAnJWQg1arVodW0JyxcbiAgICAgICAgICAgIGQ6ICfWhdaAJyxcbiAgICAgICAgICAgIGRkOiAnJWQg1oXWgCcsXG4gICAgICAgICAgICBNOiAn1aHVtNWr1b0nLFxuICAgICAgICAgICAgTU06ICclZCDVodW01avVvScsXG4gICAgICAgICAgICB5OiAn1b/VodaA1asnLFxuICAgICAgICAgICAgeXk6ICclZCDVv9Wh1oDVqycsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/Vo9Wr1bfVpdaA1b7VoXzVodW81aHVvtW41b/VvtWhfNaB1aXWgNWl1a/VvtWhfNWl1oDVpdWv1bjVtdWh1bYvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijWgdWl1oDVpdWv1b7VoXzVpdaA1aXVr9W41bXVodW2KSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1aPVq9W31aXWgNW+1aEnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Wh1bzVodW+1bjVv9W+1aEnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9aB1aXWgNWl1a/VvtWhJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfVpdaA1aXVr9W41bXVodW2JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9fFxcZHsxLDJ9LSjVq9W2fNaA1aQpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREbyc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdWr1bYnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdaA1aQnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBoeUFtO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEluZG9uZXNpYW4gW2lkXVxuLy8hIGF1dGhvciA6IE1vaGFtbWFkIFNhdHJpbyBVdG9tbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS90eW9rXG4vLyEgcmVmZXJlbmNlOiBodHRwOi8vaWQud2lraXNvdXJjZS5vcmcvd2lraS9QZWRvbWFuX1VtdW1fRWphYW5fQmFoYXNhX0luZG9uZXNpYV95YW5nX0Rpc2VtcHVybmFrYW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBpZCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2lkJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpX0ZlYnJ1YXJpX01hcmV0X0FwcmlsX01laV9KdW5pX0p1bGlfQWd1c3R1c19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWVpX0p1bl9KdWxfQWd0X1NlcF9Pa3RfTm92X0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdNaW5nZ3VfU2VuaW5fU2VsYXNhX1JhYnVfS2FtaXNfSnVtYXRfU2FidHUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdNaW5fU2VuX1NlbF9SYWJfS2FtX0p1bV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnTWdfU25fU2xfUmJfS21fSm1fU2InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hILm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9wYWdpfHNpYW5nfHNvcmV8bWFsYW0vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdwYWdpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NpYW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzb3JlJyB8fCBtZXJpZGllbSA9PT0gJ21hbGFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdwYWdpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc2lhbmcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzb3JlJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdtYWxhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hhcmkgaW5pIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0Jlc29rIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3B1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0tlbWFyaW4gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbbGFsdSBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkYWxhbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgeWFuZyBsYWx1JyxcbiAgICAgICAgICAgIHM6ICdiZWJlcmFwYSBkZXRpaycsXG4gICAgICAgICAgICBzczogJyVkIGRldGlrJyxcbiAgICAgICAgICAgIG06ICdzZW1lbml0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWVuaXQnLFxuICAgICAgICAgICAgaDogJ3NlamFtJyxcbiAgICAgICAgICAgIGhoOiAnJWQgamFtJyxcbiAgICAgICAgICAgIGQ6ICdzZWhhcmknLFxuICAgICAgICAgICAgZGQ6ICclZCBoYXJpJyxcbiAgICAgICAgICAgIE06ICdzZWJ1bGFuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgYnVsYW4nLFxuICAgICAgICAgICAgeTogJ3NldGFodW4nLFxuICAgICAgICAgICAgeXk6ICclZCB0YWh1bicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpZDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBJY2VsYW5kaWMgW2lzXVxuLy8hIGF1dGhvciA6IEhpbnJpayDDlnJuIFNpZ3Vyw7Bzc29uIDogaHR0cHM6Ly9naXRodWIuY29tL2hpbnJpa1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcGx1cmFsKG4pIHtcbiAgICAgICAgaWYgKG4gJSAxMDAgPT09IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChuICUgMTAgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmVcbiAgICAgICAgICAgICAgICAgICAgPyAnbm9ra3JhciBzZWvDum5kdXInXG4gICAgICAgICAgICAgICAgICAgIDogJ25va2tydW0gc2Vrw7puZHVtJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArXG4gICAgICAgICAgICAgICAgICAgICAgICAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdzZWvDum5kdXInIDogJ3Nla8O6bmR1bScpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnc2Vrw7puZGEnO1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnbcOtbsO6dGEnIDogJ23DrW7DunR1JztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ23DrW7DunR1cicgOiAnbcOtbsO6dHVtJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtw61uw7p0YSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcOtbsO6dHUnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIGlmIChwbHVyYWwobnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAna2x1a2t1c3R1bmRpcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdrbHVra3VzdHVuZHVtJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdrbHVra3VzdHVuZCc7XG4gICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RhZ3VyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ2RhZycgOiAnZGVnaSc7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2RhZ2FyJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKGlzRnV0dXJlID8gJ2RhZ2EnIDogJ2TDtmd1bScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2RhZ3VyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpc0Z1dHVyZSA/ICdkYWcnIDogJ2RlZ2knKTtcbiAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnbcOhbnXDsHVyJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ23DoW51w7AnIDogJ23DoW51w7BpJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbcOhbnXDsGlyJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKGlzRnV0dXJlID8gJ23DoW51w7BpJyA6ICdtw6FudcOwdW0nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtw6FudcOwdXInO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKGlzRnV0dXJlID8gJ23DoW51w7AnIDogJ23DoW51w7BpJyk7XG4gICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICfDoXInIDogJ8OhcmknO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGlmIChwbHVyYWwobnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnw6FyJyA6ICfDoXJ1bScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnw6FyJyA6ICfDoXJpJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaXMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdpcycsIHtcbiAgICAgICAgbW9udGhzOiAnamFuw7phcl9mZWJyw7phcl9tYXJzX2FwcsOtbF9tYcOtX2rDum7DrV9qw7psw61fw6Fnw7pzdF9zZXB0ZW1iZXJfb2t0w7NiZXJfbsOzdmVtYmVyX2Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFyX2Fwcl9tYcOtX2rDum5fasO6bF/DoWfDul9zZXBfb2t0X27Ds3ZfZGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdzdW5udWRhZ3VyX23DoW51ZGFndXJfw75yacOwanVkYWd1cl9tacOwdmlrdWRhZ3VyX2ZpbW10dWRhZ3VyX2bDtnN0dWRhZ3VyX2xhdWdhcmRhZ3VyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzdW5fbcOhbl/DvnJpX21pw7BfZmltX2bDtnNfbGF1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X03DoV/DnnJfTWlfRmlfRsO2X0xhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIFtrbC5dIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBba2wuXSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbw60gZGFnIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vDoSBtb3JndW4ga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vDrSBnw6ZyIGtsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbc8Otw7Bhc3RhXSBkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZWZ0aXIgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2Z5cmlyICVzIHPDrcOwYW4nLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiAna2x1a2t1c3R1bmQnLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBJdGFsaWFuIChTd2l0emVybGFuZCkgW2l0LWNoXVxuLy8hIGF1dGhvciA6IHhmaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS94ZmhcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBpdENoID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaXQtY2gnLCB7XG4gICAgICAgIG1vbnRoczogJ2dlbm5haW9fZmViYnJhaW9fbWFyem9fYXByaWxlX21hZ2dpb19naXVnbm9fbHVnbGlvX2Fnb3N0b19zZXR0ZW1icmVfb3R0b2JyZV9ub3ZlbWJyZV9kaWNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdnZW5fZmViX21hcl9hcHJfbWFnX2dpdV9sdWdfYWdvX3NldF9vdHRfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21lbmljYV9sdW5lZMOsX21hcnRlZMOsX21lcmNvbGVkw6xfZ2lvdmVkw6xfdmVuZXJkw6xfc2FiYXRvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tX2x1bl9tYXJfbWVyX2dpb192ZW5fc2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX21lX2dpX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbT2dnaSBhbGxlXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0RvbWFuaSBhbGxlXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2FsbGVdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSWVyaSBhbGxlXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tsYSBzY29yc2FdIGRkZGQgW2FsbGVdIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW2xvIHNjb3Jzb10gZGRkZCBbYWxsZV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKC9eWzAtOV0uKyQvLnRlc3QocykgPyAndHJhJyA6ICdpbicpICsgJyAnICsgcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXN0OiAnJXMgZmEnLFxuICAgICAgICAgICAgczogJ2FsY3VuaSBzZWNvbmRpJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kaScsXG4gICAgICAgICAgICBtOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRpJyxcbiAgICAgICAgICAgIGg6IFwidW4nb3JhXCIsXG4gICAgICAgICAgICBoaDogJyVkIG9yZScsXG4gICAgICAgICAgICBkOiAndW4gZ2lvcm5vJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZ2lvcm5pJyxcbiAgICAgICAgICAgIE06ICd1biBtZXNlJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzaScsXG4gICAgICAgICAgICB5OiAndW4gYW5ubycsXG4gICAgICAgICAgICB5eTogJyVkIGFubmknLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0Q2g7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSXRhbGlhbiBbaXRdXG4vLyEgYXV0aG9yIDogTG9yZW56byA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGllbVxuLy8hIGF1dGhvcjogTWF0dGlhIExhcmVudGlzOiBodHRwczovL2dpdGh1Yi5jb20vbm9zdGFsZ2lhelxuLy8hIGF1dGhvcjogTWFyY28gOiBodHRwczovL2dpdGh1Yi5jb20vTWFuZnJlOThcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBpdCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2l0Jywge1xuICAgICAgICBtb250aHM6ICdnZW5uYWlvX2ZlYmJyYWlvX21hcnpvX2FwcmlsZV9tYWdnaW9fZ2l1Z25vX2x1Z2xpb19hZ29zdG9fc2V0dGVtYnJlX290dG9icmVfbm92ZW1icmVfZGljZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnZ2VuX2ZlYl9tYXJfYXByX21hZ19naXVfbHVnX2Fnb19zZXRfb3R0X25vdl9kaWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnZG9tZW5pY2FfbHVuZWTDrF9tYXJ0ZWTDrF9tZXJjb2xlZMOsX2dpb3ZlZMOsX3ZlbmVyZMOsX3NhYmF0bycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbV9sdW5fbWFyX21lcl9naW9fdmVuX3NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb19sdV9tYV9tZV9naV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tPZ2dpIGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSA+IDEgPyAnbGxlICcgOiB0aGlzLmhvdXJzKCkgPT09IDAgPyAnICcgOiBcImxsJ1wiKSArXG4gICAgICAgICAgICAgICAgICAgICddTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tEb21hbmkgYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpID4gMSA/ICdsbGUgJyA6IHRoaXMuaG91cnMoKSA9PT0gMCA/ICcgJyA6IFwibGwnXCIpICtcbiAgICAgICAgICAgICAgICAgICAgJ11MVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ2RkZGQgW2EnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSA+IDEgPyAnbGxlICcgOiB0aGlzLmhvdXJzKCkgPT09IDAgPyAnICcgOiBcImxsJ1wiKSArXG4gICAgICAgICAgICAgICAgICAgICddTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tJZXJpIGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSA+IDEgPyAnbGxlICcgOiB0aGlzLmhvdXJzKCkgPT09IDAgPyAnICcgOiBcImxsJ1wiKSArXG4gICAgICAgICAgICAgICAgICAgICddTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbTGEgc2NvcnNhXSBkZGRkIFthJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbGxlICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmhvdXJzKCkgPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJsbCdcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICddTFQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW0xvIHNjb3Jzb10gZGRkZCBbYScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2xsZSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5ob3VycygpID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwibGwnXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXUxUJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd0cmEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGZhJyxcbiAgICAgICAgICAgIHM6ICdhbGN1bmkgc2Vjb25kaScsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGknLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0aScsXG4gICAgICAgICAgICBoOiBcInVuJ29yYVwiLFxuICAgICAgICAgICAgaGg6ICclZCBvcmUnLFxuICAgICAgICAgICAgZDogJ3VuIGdpb3JubycsXG4gICAgICAgICAgICBkZDogJyVkIGdpb3JuaScsXG4gICAgICAgICAgICB3OiAndW5hIHNldHRpbWFuYScsXG4gICAgICAgICAgICB3dzogJyVkIHNldHRpbWFuZScsXG4gICAgICAgICAgICBNOiAndW4gbWVzZScsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2knLFxuICAgICAgICAgICAgeTogJ3VuIGFubm8nLFxuICAgICAgICAgICAgeXk6ICclZCBhbm5pJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpdDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBKYXBhbmVzZSBbamFdXG4vLyEgYXV0aG9yIDogTEkgTG9uZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYXJ5b25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBqYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2phJywge1xuICAgICAgICBlcmFzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcyMDE5LTA1LTAxJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+S7pOWSjCcsXG4gICAgICAgICAgICAgICAgbmFycm93OiAn44u/JyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnUicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMTk4OS0wMS0wOCcsXG4gICAgICAgICAgICAgICAgdW50aWw6ICcyMDE5LTA0LTMwJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+W5s+aIkCcsXG4gICAgICAgICAgICAgICAgbmFycm93OiAn4427JyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnSCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMTkyNi0xMi0yNScsXG4gICAgICAgICAgICAgICAgdW50aWw6ICcxOTg5LTAxLTA3JyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+aYreWSjCcsXG4gICAgICAgICAgICAgICAgbmFycm93OiAn4428JyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnUycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMTkxMi0wNy0zMCcsXG4gICAgICAgICAgICAgICAgdW50aWw6ICcxOTI2LTEyLTI0JyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+Wkp+atoycsXG4gICAgICAgICAgICAgICAgbmFycm93OiAn4429JyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnVCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMTg3My0wMS0wMScsXG4gICAgICAgICAgICAgICAgdW50aWw6ICcxOTEyLTA3LTI5JyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDYsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+aYjuayuycsXG4gICAgICAgICAgICAgICAgbmFycm93OiAn442+JyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnTScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMS0wMS0wMScsXG4gICAgICAgICAgICAgICAgdW50aWw6ICcxODczLTEyLTMxJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+ilv+aapicsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQUQnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdBRCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMC0xMi0zMScsXG4gICAgICAgICAgICAgICAgdW50aWw6IC1JbmZpbml0eSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ+e0gOWFg+WJjScsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQkMnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdCQycsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBlcmFZZWFyT3JkaW5hbFJlZ2V4OiAvKOWFg3xcXGQrKeW5tC8sXG4gICAgICAgIGVyYVllYXJPcmRpbmFsUGFyc2U6IGZ1bmN0aW9uIChpbnB1dCwgbWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXSA9PT0gJ+WFgycgPyAxIDogcGFyc2VJbnQobWF0Y2hbMV0gfHwgaW5wdXQsIDEwKTtcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzOiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn5pel5puc5pelX+aciOabnOaXpV/ngavmm5zml6Vf5rC05puc5pelX+acqOabnOaXpV/ph5Hmm5zml6Vf5Zyf5puc5pelJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn5pelX+aciF/ngatf5rC0X+acqF/ph5Ff5ZyfJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+aXpV/mnIhf54GrX+awtF/mnKhf6YeRX+Wcnycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ5bm0TeaciETml6UgZGRkZCBISDptbScsXG4gICAgICAgICAgICBsOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBsbDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnlubRN5pyIROaXpShkZGQpIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+WNiOWJjXzljYjlvowvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfljYjlvownO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Y2I5YmNJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfljYjlvownO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vku4rml6VdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb5piO5pelXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmIChub3cud2VlaygpICE9PSB0aGlzLndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vmnaXpgLFdZGRkZCBMVCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1vmmKjml6VdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMud2VlaygpICE9PSBub3cud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+WFiOmAsV1kZGRkIExUJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3ml6UvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgPT09IDEgPyAn5YWD5bm0JyA6IG51bWJlciArICflubQnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz5b6MJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+WJjScsXG4gICAgICAgICAgICBzOiAn5pWw56eSJyxcbiAgICAgICAgICAgIHNzOiAnJWTnp5InLFxuICAgICAgICAgICAgbTogJzHliIYnLFxuICAgICAgICAgICAgbW06ICclZOWIhicsXG4gICAgICAgICAgICBoOiAnMeaZgumWkycsXG4gICAgICAgICAgICBoaDogJyVk5pmC6ZaTJyxcbiAgICAgICAgICAgIGQ6ICcx5pelJyxcbiAgICAgICAgICAgIGRkOiAnJWTml6UnLFxuICAgICAgICAgICAgTTogJzHjg7bmnIgnLFxuICAgICAgICAgICAgTU06ICclZOODtuaciCcsXG4gICAgICAgICAgICB5OiAnMeW5tCcsXG4gICAgICAgICAgICB5eTogJyVk5bm0JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBqYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBKYXZhbmVzZSBbanZdXG4vLyEgYXV0aG9yIDogUm9ueSBMYW50aXAgOiBodHRwczovL2dpdGh1Yi5jb20vbGFudGlwXG4vLyEgcmVmZXJlbmNlOiBodHRwOi8vanYud2lraXBlZGlhLm9yZy93aWtpL0Jhc2FfSmF3YVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGp2ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnanYnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcmlfRmVicnVhcmlfTWFyZXRfQXByaWxfTWVpX0p1bmlfSnVsaV9BZ3VzdHVzX1NlcHRlbWJlcl9Pa3RvYmVyX05vcGVtYmVyX0Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NZWlfSnVuX0p1bF9BZ3NfU2VwX09rdF9Ob3BfRGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ01pbmdndV9TZW5lbl9TZWxvc29fUmVidV9LZW1pc19KZW11d2FoX1NlcHR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnTWluX1Nlbl9TZWxfUmViX0tlbV9KZW1fU2VwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ01nX1NuX1NsX1JiX0ttX0ptX1NwJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIFtwdWt1bF0gSEgubW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvZW5qaW5nfHNpeWFuZ3xzb250ZW58bmRhbHUvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdlbmppbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnc2l5YW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzb250ZW4nIHx8IG1lcmlkaWVtID09PSAnbmRhbHUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VuamluZyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NpeWFuZyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NvbnRlbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbmRhbHUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tEaW50ZW4gcHVuaWtvIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW01iZW5qYW5nIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3B1a3VsXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0thbGEgd2luZ2kgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBba2VwZW5na2VyIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3dvbnRlbiBpbmcgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGluZ2thbmcga2VwZW5na2VyJyxcbiAgICAgICAgICAgIHM6ICdzYXdldGF3aXMgZGV0aWsnLFxuICAgICAgICAgICAgc3M6ICclZCBkZXRpaycsXG4gICAgICAgICAgICBtOiAnc2V0dW5nZ2FsIG1lbml0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWVuaXQnLFxuICAgICAgICAgICAgaDogJ3NldHVuZ2dhbCBqYW0nLFxuICAgICAgICAgICAgaGg6ICclZCBqYW0nLFxuICAgICAgICAgICAgZDogJ3NlZGludGVuJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGludGVuJyxcbiAgICAgICAgICAgIE06ICdzZXd1bGFuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgd3VsYW4nLFxuICAgICAgICAgICAgeTogJ3NldGF1bicsXG4gICAgICAgICAgICB5eTogJyVkIHRhdW4nLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ganY7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR2VvcmdpYW4gW2thXVxuLy8hIGF1dGhvciA6IElyYWtsaSBKYW5pYXNodmlsaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9JcmFrbGlKYW5pXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIga2EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrYScsIHtcbiAgICAgICAgbW9udGhzOiAn4YOY4YOQ4YOc4YOV4YOQ4YOg4YOYX+GDl+GDlOGDkeGDlOGDoOGDleGDkOGDmuGDmF/hg5vhg5Dhg6Dhg6Lhg5hf4YOQ4YOe4YOg4YOY4YOa4YOYX+GDm+GDkOGDmOGDoeGDmF/hg5jhg5Xhg5zhg5jhg6Hhg5hf4YOY4YOV4YOa4YOY4YOh4YOYX+GDkOGDkuGDleGDmOGDoeGDouGDnV/hg6Hhg5Thg6Xhg6Lhg5Thg5vhg5Hhg5Thg6Dhg5hf4YOd4YOl4YOi4YOd4YOb4YOR4YOU4YOg4YOYX+GDnOGDneGDlOGDm+GDkeGDlOGDoOGDmF/hg5Phg5Thg5nhg5Thg5vhg5Hhg5Thg6Dhg5gnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn4YOY4YOQ4YOcX+GDl+GDlOGDkV/hg5vhg5Dhg6Bf4YOQ4YOe4YOgX+GDm+GDkOGDmF/hg5jhg5Xhg5xf4YOY4YOV4YOaX+GDkOGDkuGDlV/hg6Hhg5Thg6Vf4YOd4YOl4YOiX+GDnOGDneGDlF/hg5Phg5Thg5knLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfhg5nhg5Xhg5jhg6Dhg5Bf4YOd4YOg4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDoeGDkOGDm+GDqOGDkOGDkeGDkOGDl+GDmF/hg53hg5fhg67hg6jhg5Dhg5Hhg5Dhg5fhg5hf4YOu4YOj4YOX4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDnuGDkOGDoOGDkOGDoeGDmeGDlOGDleGDmF/hg6jhg5Dhg5Hhg5Dhg5fhg5gnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiAn4YOZ4YOV4YOY4YOg4YOQ4YOhX+GDneGDoOGDqOGDkOGDkeGDkOGDl+GDoV/hg6Hhg5Dhg5vhg6jhg5Dhg5Hhg5Dhg5fhg6Ff4YOd4YOX4YOu4YOo4YOQ4YOR4YOQ4YOX4YOhX+GDruGDo+GDl+GDqOGDkOGDkeGDkOGDl+GDoV/hg57hg5Dhg6Dhg5Dhg6Hhg5nhg5Thg5Xhg6Ff4YOo4YOQ4YOR4YOQ4YOX4YOhJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogLyjhg6zhg5jhg5zhg5B84YOo4YOU4YOb4YOT4YOU4YOSKS8sXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfhg5nhg5Xhg5hf4YOd4YOg4YOoX+GDoeGDkOGDm1/hg53hg5fhg65f4YOu4YOj4YOXX+GDnuGDkOGDoF/hg6jhg5Dhg5EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4YOZ4YOVX+GDneGDoF/hg6Hhg5Bf4YOd4YOXX+GDruGDo1/hg57hg5Bf4YOo4YOQJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+GDk+GDpuGDlOGDoV0gTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1vhg67hg5Xhg5Dhg5pdIExUWy3hg5bhg5RdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4YOS4YOj4YOo4YOY4YOcXSBMVFst4YOW4YOUXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vhg6jhg5Thg5vhg5Phg5Thg5JdIGRkZGQgTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4YOs4YOY4YOc4YOQXSBkZGRkIExULeGDluGDlCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAvKOGDrOGDkOGDm3zhg6zhg6Phg5d84YOh4YOQ4YOQ4YOXfOGDrOGDlOGDmnzhg5Phg6Z84YOX4YOVKSjhg5h84YOUKS8sXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgkMCwgJDEsICQyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJDIgPT09ICfhg5gnID8gJDEgKyAn4YOo4YOYJyA6ICQxICsgJDIgKyAn4YOo4YOYJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFzdDogZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoLyjhg6zhg5Dhg5vhg5h84YOs4YOj4YOX4YOYfOGDoeGDkOGDkOGDl+GDmHzhg5Phg6bhg5R84YOX4YOV4YOUKS8udGVzdChzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC8o4YOYfOGDlCkkLywgJ+GDmOGDoSDhg6zhg5jhg5wnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKC/hg6zhg5Thg5rhg5gvLnRlc3QocykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgv4YOs4YOU4YOa4YOYJC8sICfhg6zhg5rhg5jhg6Eg4YOs4YOY4YOcJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHM6ICfhg6Dhg5Dhg5vhg5Phg5Thg5zhg5jhg5vhg5Qg4YOs4YOQ4YOb4YOYJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4YOs4YOQ4YOb4YOYJyxcbiAgICAgICAgICAgIG06ICfhg6zhg6Phg5fhg5gnLFxuICAgICAgICAgICAgbW06ICclZCDhg6zhg6Phg5fhg5gnLFxuICAgICAgICAgICAgaDogJ+GDoeGDkOGDkOGDl+GDmCcsXG4gICAgICAgICAgICBoaDogJyVkIOGDoeGDkOGDkOGDl+GDmCcsXG4gICAgICAgICAgICBkOiAn4YOT4YOm4YOUJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4YOT4YOm4YOUJyxcbiAgICAgICAgICAgIE06ICfhg5fhg5Xhg5QnLFxuICAgICAgICAgICAgTU06ICclZCDhg5fhg5Xhg5QnLFxuICAgICAgICAgICAgeTogJ+GDrOGDlOGDmuGDmCcsXG4gICAgICAgICAgICB5eTogJyVkIOGDrOGDlOGDmuGDmCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC8wfDEt4YOa4YOYfOGDm+GDlC1cXGR7MSwyfXxcXGR7MSwyfS3hg5QvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3hg5rhg5gnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG51bWJlciA8IDIwIHx8XG4gICAgICAgICAgICAgICAgKG51bWJlciA8PSAxMDAgJiYgbnVtYmVyICUgMjAgPT09IDApIHx8XG4gICAgICAgICAgICAgICAgbnVtYmVyICUgMTAwID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+GDm+GDlC0nICsgbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct4YOUJztcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLFxuICAgICAgICAgICAgZG95OiA3LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGthO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEthemFraCBba2tdXG4vLyEgYXV0aG9ycyA6IE51cmxhbiBSYWtoaW16aGFub3YgOiBodHRwczovL2dpdGh1Yi5jb20vbnVybGFuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDA6ICct0YjRlicsXG4gICAgICAgIDE6ICct0YjRlicsXG4gICAgICAgIDI6ICct0YjRlicsXG4gICAgICAgIDM6ICct0YjRlicsXG4gICAgICAgIDQ6ICct0YjRlicsXG4gICAgICAgIDU6ICct0YjRlicsXG4gICAgICAgIDY6ICct0YjRiycsXG4gICAgICAgIDc6ICct0YjRlicsXG4gICAgICAgIDg6ICct0YjRlicsXG4gICAgICAgIDk6ICct0YjRiycsXG4gICAgICAgIDEwOiAnLdGI0YsnLFxuICAgICAgICAyMDogJy3RiNGLJyxcbiAgICAgICAgMzA6ICct0YjRiycsXG4gICAgICAgIDQwOiAnLdGI0YsnLFxuICAgICAgICA1MDogJy3RiNGWJyxcbiAgICAgICAgNjA6ICct0YjRiycsXG4gICAgICAgIDcwOiAnLdGI0ZYnLFxuICAgICAgICA4MDogJy3RiNGWJyxcbiAgICAgICAgOTA6ICct0YjRiycsXG4gICAgICAgIDEwMDogJy3RiNGWJyxcbiAgICB9O1xuXG4gICAgdmFyIGtrID0gbW9tZW50LmRlZmluZUxvY2FsZSgna2snLCB7XG4gICAgICAgIG1vbnRoczogJ9Kb0LDSo9GC0LDRgF/QsNKb0L/QsNC9X9C90LDRg9GA0YvQt1/RgdOZ0YPRltGAX9C80LDQvNGL0YBf0LzQsNGD0YHRi9C8X9GI0ZbQu9C00LVf0YLQsNC80YvQt1/Sm9GL0YDQutKv0LnQtdC6X9Kb0LDQt9Cw0L1f0pvQsNGA0LDRiNCwX9C20LXQu9GC0L7Sm9GB0LDQvScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfSm9Cw0qNf0LDSm9C/X9C90LDRg1/RgdOZ0YNf0LzQsNC8X9C80LDRg1/RiNGW0Ltf0YLQsNC8X9Kb0YvRgF/Sm9Cw0Ldf0pvQsNGAX9C20LXQuycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfQttC10LrRgdC10L3QsdGWX9C00q/QudGB0LXQvdCx0ZZf0YHQtdC50YHQtdC90LHRll/RgdOZ0YDRgdC10L3QsdGWX9Cx0LXQudGB0LXQvdCx0ZZf0LbSsdC80LBf0YHQtdC90LHRlicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C20LXQul/QtNKv0Llf0YHQtdC5X9GB05nRgF/QsdC10Llf0LbSsdC8X9GB0LXQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQttC6X9C00Llf0YHQuV/RgdGAX9Cx0Llf0LbQvF/RgdC9Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9CR0q/Qs9GW0L0g0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQldGA0YLQtdKjINGB0LDSk9Cw0YJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQmtC10YjQtSDRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vTqNGC0LrQtdC9INCw0L/RgtCw0L3Ri9KjXSBkZGRkIFvRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINGW0YjRltC90LTQtScsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0LHSsdGA0YvQvScsXG4gICAgICAgICAgICBzOiAn0LHRltGA0L3QtdGI0LUg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG06ICfQsdGW0YAg0LzQuNC90YPRgicsXG4gICAgICAgICAgICBtbTogJyVkINC80LjQvdGD0YInLFxuICAgICAgICAgICAgaDogJ9Cx0ZbRgCDRgdCw0pPQsNGCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YHQsNKT0LDRgicsXG4gICAgICAgICAgICBkOiAn0LHRltGAINC60q/QvScsXG4gICAgICAgICAgICBkZDogJyVkINC60q/QvScsXG4gICAgICAgICAgICBNOiAn0LHRltGAINCw0LknLFxuICAgICAgICAgICAgTU06ICclZCDQsNC5JyxcbiAgICAgICAgICAgIHk6ICfQsdGW0YAg0LbRi9C7JyxcbiAgICAgICAgICAgIHl5OiAnJWQg0LbRi9C7JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjRiNGWfNGI0YspLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBiID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW251bWJlcl0gfHwgc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga2s7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2FtYm9kaWFuIFtrbV1cbi8vISBhdXRob3IgOiBLcnV5IFZhbm5hIDogaHR0cHM6Ly9naXRodWIuY29tL2tydXl2YW5uYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfhn6EnLFxuICAgICAgICAgICAgMjogJ+GfoicsXG4gICAgICAgICAgICAzOiAn4Z+jJyxcbiAgICAgICAgICAgIDQ6ICfhn6QnLFxuICAgICAgICAgICAgNTogJ+GfpScsXG4gICAgICAgICAgICA2OiAn4Z+mJyxcbiAgICAgICAgICAgIDc6ICfhn6cnLFxuICAgICAgICAgICAgODogJ+GfqCcsXG4gICAgICAgICAgICA5OiAn4Z+pJyxcbiAgICAgICAgICAgIDA6ICfhn6AnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4Z+hJzogJzEnLFxuICAgICAgICAgICAgJ+Gfoic6ICcyJyxcbiAgICAgICAgICAgICfhn6MnOiAnMycsXG4gICAgICAgICAgICAn4Z+kJzogJzQnLFxuICAgICAgICAgICAgJ+GfpSc6ICc1JyxcbiAgICAgICAgICAgICfhn6YnOiAnNicsXG4gICAgICAgICAgICAn4Z+nJzogJzcnLFxuICAgICAgICAgICAgJ+GfqCc6ICc4JyxcbiAgICAgICAgICAgICfhn6knOiAnOScsXG4gICAgICAgICAgICAn4Z+gJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGttID0gbW9tZW50LmRlZmluZUxvY2FsZSgna20nLCB7XG4gICAgICAgIG1vbnRoczogJ+GemOGegOGemuGetl/hnoDhnrvhnpjhn5Lhnpfhn4hf4Z6Y4Z644Z6T4Z62X+GemOGfgeGen+Getl/hnqfhnp/hnpfhnrZf4Z6Y4Z634Z6Q4Z674Z6T4Z62X+GegOGegOGfkuGegOGeiuGetl/hnp/hnrjhnqDhnrZf4Z6A4Z6J4Z+S4Z6J4Z62X+Gej+Geu+Gem+Getl/hnpzhnrfhnoXhn5LhnobhnrfhnoDhnrZf4Z6S4Z+S4Z6T4Z68Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfhnpjhnoDhnprhnrZf4Z6A4Z674Z6Y4Z+S4Z6X4Z+IX+GemOGeuOGek+Getl/hnpjhn4Hhnp/hnrZf4Z6n4Z6f4Z6X4Z62X+GemOGet+GekOGeu+Gek+Getl/hnoDhnoDhn5LhnoDhnorhnrZf4Z6f4Z644Z6g4Z62X+GegOGeieGfkuGeieGetl/hno/hnrvhnpvhnrZf4Z6c4Z634Z6F4Z+S4Z6G4Z634Z6A4Z62X+GekuGfkuGek+GevCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+GeouGetuGekeGet+Gej+GfkuGemV/hnoXhn5DhnpPhn5LhnpFf4Z6i4Z6E4Z+S4Z6C4Z624Z6aX+GeluGeu+Gekl/hnpbhn5LhnprhnqDhnp/hn5LhnpThno/hnrfhn41f4Z6f4Z674Z6A4Z+S4Z6aX+Gen+GfheGemuGfjScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+GeouGetl/hnoVf4Z6iX+Gell/hnpbhn5Lhnppf4Z6f4Z67X+Genycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfhnqLhnrZf4Z6FX+Geol/hnpZf4Z6W4Z+S4Z6aX+Gen+Geu1/hnp8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4Z6W4Z+S4Z6a4Z654Z6AfOGem+GfkuGehOGetuGehS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn4Z6b4Z+S4Z6E4Z624Z6FJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+GeluGfkuGemuGeueGegCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Z6b4Z+S4Z6E4Z624Z6FJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4Z6Q4Z+S4Z6E4Z+D4Z6T4Z+B4Z+HIOGemOGfieGfhOGehF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vhnp/hn5LhnqLhn4LhnoAg4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW+GemOGfieGfhOGehF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vhnpjhn5Lhnp/hnrfhnpvhnpjhnrfhnokg4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW+Gen+GelOGfkuGej+GetuGeoOGfjeGemOGeu+Gek10gW+GemOGfieGfhOGehF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+GekeGfgOGejycsXG4gICAgICAgICAgICBwYXN0OiAnJXPhnpjhnrvhnpMnLFxuICAgICAgICAgICAgczogJ+GelOGfieGeu+Gek+GfkuGemOGetuGek+GenOGet+Gek+GetuGekeGeuCcsXG4gICAgICAgICAgICBzczogJyVkIOGenOGet+Gek+GetuGekeGeuCcsXG4gICAgICAgICAgICBtOiAn4Z6Y4Z694Z6Z4Z6T4Z624Z6R4Z64JyxcbiAgICAgICAgICAgIG1tOiAnJWQg4Z6T4Z624Z6R4Z64JyxcbiAgICAgICAgICAgIGg6ICfhnpjhnr3hnpnhnpjhn4nhn4ThnoQnLFxuICAgICAgICAgICAgaGg6ICclZCDhnpjhn4nhn4ThnoQnLFxuICAgICAgICAgICAgZDogJ+GemOGeveGemeGekOGfkuGehOGfgycsXG4gICAgICAgICAgICBkZDogJyVkIOGekOGfkuGehOGfgycsXG4gICAgICAgICAgICBNOiAn4Z6Y4Z694Z6Z4Z6B4Z+CJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4Z6B4Z+CJyxcbiAgICAgICAgICAgIHk6ICfhnpjhnr3hnpnhnobhn5LhnpPhnrbhn4YnLFxuICAgICAgICAgICAgeXk6ICclZCDhnobhn5LhnpPhnrbhn4YnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAv4Z6R4Z64XFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiAn4Z6R4Z64JWQnLFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4Z+h4Z+i4Z+j4Z+k4Z+l4Z+m4Z+n4Z+o4Z+p4Z+gXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga207XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS2FubmFkYSBba25dXG4vLyEgYXV0aG9yIDogUmFqZWV2IE5haWsgOiBodHRwczovL2dpdGh1Yi5jb20vcmFqZWV2bmFpa3RlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+CzpycsXG4gICAgICAgICAgICAyOiAn4LOoJyxcbiAgICAgICAgICAgIDM6ICfgs6knLFxuICAgICAgICAgICAgNDogJ+CzqicsXG4gICAgICAgICAgICA1OiAn4LOrJyxcbiAgICAgICAgICAgIDY6ICfgs6wnLFxuICAgICAgICAgICAgNzogJ+CzrScsXG4gICAgICAgICAgICA4OiAn4LOuJyxcbiAgICAgICAgICAgIDk6ICfgs68nLFxuICAgICAgICAgICAgMDogJ+CzpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgs6cnOiAnMScsXG4gICAgICAgICAgICAn4LOoJzogJzInLFxuICAgICAgICAgICAgJ+CzqSc6ICczJyxcbiAgICAgICAgICAgICfgs6onOiAnNCcsXG4gICAgICAgICAgICAn4LOrJzogJzUnLFxuICAgICAgICAgICAgJ+CzrCc6ICc2JyxcbiAgICAgICAgICAgICfgs60nOiAnNycsXG4gICAgICAgICAgICAn4LOuJzogJzgnLFxuICAgICAgICAgICAgJ+Czryc6ICc5JyxcbiAgICAgICAgICAgICfgs6YnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIga24gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrbicsIHtcbiAgICAgICAgbW9udGhzOiAn4LKc4LKo4LK14LKw4LK/X+Cyq+CzhuCyrOCzjeCysOCyteCysOCyv1/gsq7gsr7gsrDgs43gsprgs41f4LKP4LKq4LON4LKw4LK/4LKy4LONX+CyruCzhuCzlV/gspzgs4Lgsqjgs41f4LKc4LOB4LKy4LOG4LOWX+CyhuCyl+CyuOCzjeCyn+CzjV/gsrjgs4bgsqrgs43gsp/gs4bgsoLgsqzgsrDgs41f4LKF4LKV4LON4LKf4LOG4LOC4LOV4LKs4LKw4LONX+CyqOCyteCzhuCyguCyrOCysOCzjV/gsqHgsr/gsrjgs4bgsoLgsqzgsrDgs40nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CynOCyqF/gsqvgs4bgsqzgs43gsrBf4LKu4LK+4LKw4LON4LKa4LONX+Cyj+CyquCzjeCysOCyv+CysuCzjV/gsq7gs4bgs5Vf4LKc4LOC4LKo4LONX+CynOCzgeCysuCzhuCzll/gsobgspfgsrjgs43gsp/gs41f4LK44LOG4LKq4LON4LKf4LOG4LKCX+CyheCyleCzjeCyn+CzhuCzguCzlV/gsqjgsrXgs4bgsoJf4LKh4LK/4LK44LOG4LKCJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn4LKt4LK+4LKo4LOB4LK14LK+4LKwX+CyuOCzhuCzguCzleCyruCyteCyvuCysF/gsq7gsoLgspfgsrPgsrXgsr7gsrBf4LKs4LOB4LKn4LK14LK+4LKwX+Cyl+CzgeCysOCzgeCyteCyvuCysF/gsrbgs4HgspXgs43gsrDgsrXgsr7gsrBf4LK24LKo4LK/4LK14LK+4LKwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4LKt4LK+4LKo4LOBX+CyuOCzhuCzguCzleCyrl/gsq7gsoLgspfgsrNf4LKs4LOB4LKnX+Cyl+CzgeCysOCzgV/gsrbgs4HgspXgs43gsrBf4LK24LKo4LK/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CyreCyvl/gsrjgs4bgs4Lgs5Vf4LKu4LKCX+CyrOCzgV/gspfgs4Ff4LK24LOBX+Cyticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgsofgsoLgsqbgs4FdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4LKo4LK+4LKz4LOGXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4LKo4LK/4LKo4LON4LKo4LOGXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgspXgs4bgs4Lgsqjgs4bgsq9dIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4LKo4LKC4LKk4LKwJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgsrngsr/gsoLgsqbgs4YnLFxuICAgICAgICAgICAgczogJ+CyleCzhuCysuCyteCzgSDgspXgs43gsrfgsqPgspfgsrPgs4EnLFxuICAgICAgICAgICAgc3M6ICclZCDgsrjgs4bgspXgs4bgsoLgsqHgs4HgspfgsrPgs4EnLFxuICAgICAgICAgICAgbTogJ+CykuCyguCypuCzgSDgsqjgsr/gsq7gsr/gsrcnLFxuICAgICAgICAgICAgbW06ICclZCDgsqjgsr/gsq7gsr/gsrcnLFxuICAgICAgICAgICAgaDogJ+CykuCyguCypuCzgSDgspfgsoLgsp/gs4YnLFxuICAgICAgICAgICAgaGg6ICclZCDgspfgsoLgsp/gs4YnLFxuICAgICAgICAgICAgZDogJ+CykuCyguCypuCzgSDgsqbgsr/gsqgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgsqbgsr/gsqgnLFxuICAgICAgICAgICAgTTogJ+CykuCyguCypuCzgSDgsqTgsr/gsoLgspfgsrPgs4EnLFxuICAgICAgICAgICAgTU06ICclZCDgsqTgsr/gsoLgspfgsrPgs4EnLFxuICAgICAgICAgICAgeTogJ+CykuCyguCypuCzgSDgsrXgsrDgs43gsrcnLFxuICAgICAgICAgICAgeXk6ICclZCDgsrXgsrDgs43gsrcnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4LOn4LOo4LOp4LOq4LOr4LOs4LOt4LOu4LOv4LOmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LKw4LK+4LKk4LON4LKw4LK/fOCyrOCzhuCys+Cyv+Cyl+CzjeCyl+Czhnzgsq7gsqfgs43gsq/gsr7gsrngs43gsqh84LK44LKC4LKc4LOGLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4LKw4LK+4LKk4LON4LKw4LK/Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LKs4LOG4LKz4LK/4LKX4LON4LKX4LOGJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CyruCyp+CzjeCyr+CyvuCyueCzjeCyqCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LK44LKC4LKc4LOGJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CysOCyvuCypOCzjeCysOCyvyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LKs4LOG4LKz4LK/4LKX4LON4LKX4LOGJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsq7gsqfgs43gsq/gsr7gsrngs43gsqgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CyuOCyguCynOCzhic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LKw4LK+4LKk4LON4LKw4LK/JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOCyqOCzhuCzlSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+CyqOCzhuCzlSc7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBrbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLb3JlYW4gW2tvXVxuLy8hIGF1dGhvciA6IEt5dW5nd29vaywgUGFyayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9reXVuZ3cwMGtcbi8vISBhdXRob3IgOiBKZWVleXVsIExlZSA8amVlZXl1bEBnbWFpbC5jb20+XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIga28gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrbycsIHtcbiAgICAgICAgbW9udGhzOiAnMeyblF8y7JuUXzPsm5RfNOyblF817JuUXzbsm5RfN+yblF847JuUXznsm5RfMTDsm5RfMTHsm5RfMTLsm5QnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeyblF8y7JuUXzPsm5RfNOyblF817JuUXzbsm5RfN+yblF847JuUXznsm5RfMTDsm5RfMTHsm5RfMTLsm5QnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn7J287JqU7J28X+yblOyalOydvF/tmZTsmpTsnbxf7IiY7JqU7J28X+uqqeyalOydvF/quIjsmpTsnbxf7Yag7JqU7J28Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn7J28X+yblF/tmZRf7IiYX+uqqV/quIhf7YagJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+ydvF/sm5Rf7ZmUX+yImF/rqqlf6riIX+2GoCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS5NTS5ERC4nLFxuICAgICAgICAgICAgTEw6ICdZWVlZ64WEIE1NTU0gROydvCcsXG4gICAgICAgICAgICBMTEw6ICdZWVlZ64WEIE1NTU0gROydvCBBIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVnrhYQgTU1NTSBE7J28IGRkZGQgQSBoOm1tJyxcbiAgICAgICAgICAgIGw6ICdZWVlZLk1NLkRELicsXG4gICAgICAgICAgICBsbDogJ1lZWVnrhYQgTU1NTSBE7J28JyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVnrhYQgTU1NTSBE7J28IEEgaDptbScsXG4gICAgICAgICAgICBsbGxsOiAnWVlZWeuFhCBNTU1NIETsnbwgZGRkZCBBIGg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ+yYpOuKmCBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAn64K07J28IExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAn7Ja07KCcIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAn7KeA64Kc7KO8IGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDtm4QnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOyghCcsXG4gICAgICAgICAgICBzOiAn66qHIOy0iCcsXG4gICAgICAgICAgICBzczogJyVk7LSIJyxcbiAgICAgICAgICAgIG06ICcx67aEJyxcbiAgICAgICAgICAgIG1tOiAnJWTrtoQnLFxuICAgICAgICAgICAgaDogJ+2VnCDsi5zqsIQnLFxuICAgICAgICAgICAgaGg6ICclZOyLnOqwhCcsXG4gICAgICAgICAgICBkOiAn7ZWY66OoJyxcbiAgICAgICAgICAgIGRkOiAnJWTsnbwnLFxuICAgICAgICAgICAgTTogJ+2VnCDri6wnLFxuICAgICAgICAgICAgTU06ICclZOuLrCcsXG4gICAgICAgICAgICB5OiAn7J28IOuFhCcsXG4gICAgICAgICAgICB5eTogJyVk64WEJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KOydvHzsm5R87KO8KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+ydvCc7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn7JuUJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfso7wnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/smKTsoIR87Jik7ZuELyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW4gPT09ICfsmKTtm4QnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCAxMiA/ICfsmKTsoIQnIDogJ+yYpO2bhCc7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga287XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTm9ydGhlcm4gS3VyZGlzaCBba3Uta21yXVxuLy8hIGF1dGhvcnMgOiBNYXpsdW0gw5Z6ZG9nYW4gOiBodHRwczovL2dpdGh1Yi5jb20vbWVyZ2VoZXpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzOiBbJ8OnZW5kIHNhbsOueWUnLCAnw6dlbmQgc2Fuw655ZXlhbiddLFxuICAgICAgICAgICAgc3M6IFtudW0gKyAnIHNhbsOueWUnLCBudW0gKyAnIHNhbsOueWV5YW4nXSxcbiAgICAgICAgICAgIG06IFsnZGVxw65xZXllaycsICdkZXHDrnFleWVrw6onXSxcbiAgICAgICAgICAgIG1tOiBbbnVtICsgJyBkZXHDrnFlJywgbnVtICsgJyBkZXHDrnFleWFuJ10sXG4gICAgICAgICAgICBoOiBbJ3NhZXRlaycsICdzYWV0ZWvDqiddLFxuICAgICAgICAgICAgaGg6IFtudW0gKyAnIHNhZXQnLCBudW0gKyAnIHNhZXRhbiddLFxuICAgICAgICAgICAgZDogWydyb2playcsICdyb2pla8OqJ10sXG4gICAgICAgICAgICBkZDogW251bSArICcgcm9qJywgbnVtICsgJyByb2phbiddLFxuICAgICAgICAgICAgdzogWydoZWZ0ZXllaycsICdoZWZ0ZXlla8OqJ10sXG4gICAgICAgICAgICB3dzogW251bSArICcgaGVmdGUnLCBudW0gKyAnIGhlZnRleWFuJ10sXG4gICAgICAgICAgICBNOiBbJ21laGVrJywgJ21laGVrw6onXSxcbiAgICAgICAgICAgIE1NOiBbbnVtICsgJyBtZWgnLCBudW0gKyAnIG1laGFuJ10sXG4gICAgICAgICAgICB5OiBbJ3NhbGVrJywgJ3NhbGVrw6onXSxcbiAgICAgICAgICAgIHl5OiBbbnVtICsgJyBzYWwnLCBudW0gKyAnIHNhbGFuJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG4gICAgLy8gZnVuY3Rpb24gb2JsaXF1ZU51bVN1ZmZpeChudW0pIHtcbiAgICAvLyAgICAgaWYobnVtLmluY2x1ZGVzKCc6JykpXG4gICAgLy8gICAgICAgICBudW0gPSBwYXJzZUludChudW0uc3BsaXQoJzonKVswXSk7XG4gICAgLy8gICAgIGVsc2VcbiAgICAvLyAgICAgICAgIG51bSA9IHBhcnNlSW50KG51bSk7XG4gICAgLy8gICAgIHJldHVybiBudW0gPT0gMCB8fCBudW0gJSAxMCA9PSAxID8gJ8OqJ1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIDogKG51bSA+IDEwICYmIG51bSAlIDEwID09IDAgPyAnw64nIDogJ2FuJyk7XG4gICAgLy8gfVxuICAgIGZ1bmN0aW9uIGV6YWZlTnVtU3VmZml4KG51bSkge1xuICAgICAgICBudW0gPSAnJyArIG51bTtcbiAgICAgICAgdmFyIGwgPSBudW0uc3Vic3RyaW5nKG51bS5sZW5ndGggLSAxKSxcbiAgICAgICAgICAgIGxsID0gbnVtLmxlbmd0aCA+IDEgPyBudW0uc3Vic3RyaW5nKG51bS5sZW5ndGggLSAyKSA6ICcnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKGxsID09IDEyIHx8IGxsID09IDEzKSAmJlxuICAgICAgICAgICAgKGwgPT0gJzInIHx8IGwgPT0gJzMnIHx8IGxsID09ICc1MCcgfHwgbCA9PSAnNzAnIHx8IGwgPT0gJzgwJylcbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuICd5w6onO1xuICAgICAgICByZXR1cm4gJ8OqJztcbiAgICB9XG5cbiAgICB2YXIga3VLbXIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrdS1rbXInLCB7XG4gICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgc3BlbGxpbmcgcnVsZXMgZGVmaW5lZCBieSB0aGUgd29yayBncm91cCBvZiBXZXFmYSBNZXpvcG90YW15YXnDqiAoTWVzb3BvdGFtaWEgRm91bmRhdGlvbilcbiAgICAgICAgLy8gdGhpcyBzaG91bGQgYmU6ICdLYW7Du25hIFBhxZ/Drm5fU2liYXRfQWRhcl9Ow65zYW5fR3VsYW5fSGV6w65yYW5fVMOucm1laF9UZWJheF/Djmxvbl/Dh2lyw655YSBQw6rFn8Oubl/Dh2lyw655YSBQYcWfw65uX0thbsO7bmEgUMOqxZ/Drm4nXG4gICAgICAgIC8vIEJ1dCB0aGUgbmFtZXMgYmVsb3cgYXJlIG1vcmUgd2VsbCBrbm93biBhbmQgaGFuZHlcbiAgICAgICAgbW9udGhzOiAnUsOqYmVuZGFuX1NpYmF0X0FkYXJfTsOuc2FuX0d1bGFuX0hlesOucmFuX1TDrnJtZWhfVGViYXhfw45sb25fQ290bWVoX01pamRhcl9CZXJmYW5iYXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnUsOqYl9TaWJfQWRhX07DrnNfR3VsX0hlel9Uw65yX1RlYl/DjmxvX0NvdF9NaWpfQmVyJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ1lla8WfZW1fRHXFn2VtX1PDqsWfZW1fw4dhcsWfZW1fUMOqbmPFn2VtX8OObl/FnmVtw64nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdZZWtfRHVfU8OqX8OHYXJfUMOqbl/Djm5fxZ5lbScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdZZV9EdV9Tw6pfw4dhX1DDql/Djm5fxZ5lJy5zcGxpdCgnXycpLFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2JuJyA6ICdCTic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3BuJyA6ICdQTic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9ibnxCTnxwbnxQTi8sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRG8gTU1NTVthXSBZWVlZW2FuXScsXG4gICAgICAgICAgICBMTEw6ICdEbyBNTU1NW2FdIFlZWVlbYW5dIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEbyBNTU1NW2FdIFlZWVlbYW5dIEhIOm1tJyxcbiAgICAgICAgICAgIGxsOiAnRG8gTU1NWy5dIFlZWVlbYW5dJyxcbiAgICAgICAgICAgIGxsbDogJ0RvIE1NTVsuXSBZWVlZW2FuXSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkWy5dLCBEbyBNTU1bLl0gWVlZWVthbl0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vDjnJvIGRpIHNhZXRdIExUIFtkZV0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1tTaWLDqiBkaSBzYWV0XSBMVCBbZGVdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbZGkgc2FldF0gTFQgW2RlXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0R1aCBkaSBzYWV0XSBMVCBbZGVdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZFthIGJvcsOuIGRpIHNhZXRdIExUIFtkZV0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkaSAlcyBkZScsXG4gICAgICAgICAgICBwYXN0OiAnYmVyw64gJXMnLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgdzogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHd3OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oPzp5w6p8w6p8XFwuKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW0sIHBlcmlvZCkge1xuICAgICAgICAgICAgdmFyIHAgPSBwZXJpb2QudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChwLmluY2x1ZGVzKCd3JykgfHwgcC5pbmNsdWRlcygnbScpKSByZXR1cm4gbnVtICsgJy4nO1xuXG4gICAgICAgICAgICByZXR1cm4gbnVtICsgZXphZmVOdW1TdWZmaXgobnVtKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGt1S21yO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEt1cmRpc2ggW2t1XVxuLy8hIGF1dGhvciA6IFNoYWhyYW0gTWViYXNoYXIgOiBodHRwczovL2dpdGh1Yi5jb20vU2hhaHJhbU1lYmFzaGFyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ9mhJyxcbiAgICAgICAgICAgIDI6ICfZoicsXG4gICAgICAgICAgICAzOiAn2aMnLFxuICAgICAgICAgICAgNDogJ9mkJyxcbiAgICAgICAgICAgIDU6ICfZpScsXG4gICAgICAgICAgICA2OiAn2aYnLFxuICAgICAgICAgICAgNzogJ9mnJyxcbiAgICAgICAgICAgIDg6ICfZqCcsXG4gICAgICAgICAgICA5OiAn2aknLFxuICAgICAgICAgICAgMDogJ9mgJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ9mhJzogJzEnLFxuICAgICAgICAgICAgJ9miJzogJzInLFxuICAgICAgICAgICAgJ9mjJzogJzMnLFxuICAgICAgICAgICAgJ9mkJzogJzQnLFxuICAgICAgICAgICAgJ9mlJzogJzUnLFxuICAgICAgICAgICAgJ9mmJzogJzYnLFxuICAgICAgICAgICAgJ9mnJzogJzcnLFxuICAgICAgICAgICAgJ9moJzogJzgnLFxuICAgICAgICAgICAgJ9mpJzogJzknLFxuICAgICAgICAgICAgJ9mgJzogJzAnLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHMgPSBbXG4gICAgICAgICAgICAn2qnYp9mG2YjZhtuMINiv2YjZiNuV2YUnLFxuICAgICAgICAgICAgJ9i02YjYqNin2KonLFxuICAgICAgICAgICAgJ9im2KfYstin2LEnLFxuICAgICAgICAgICAgJ9mG24zYs9in2YYnLFxuICAgICAgICAgICAgJ9im2KfbjNin2LEnLFxuICAgICAgICAgICAgJ9it2YjYstuV24zYsdin2YYnLFxuICAgICAgICAgICAgJ9iq25XZhdmF2YjYsicsXG4gICAgICAgICAgICAn2KbYp9ioJyxcbiAgICAgICAgICAgICfYptuV24zZhNmI2YjZhCcsXG4gICAgICAgICAgICAn2KrYtNix24zZhtuMINuM25XZg9uV2YUnLFxuICAgICAgICAgICAgJ9iq2LTYsduM2YbbjCDYr9mI2YjbldmFJyxcbiAgICAgICAgICAgICfZg9in2YbZiNmG24wg24zbldqp25XZhScsXG4gICAgICAgIF07XG5cbiAgICB2YXIga3UgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrdScsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ9uM2YfigIzZg9i02YfigIzZhdmF2YfigIxf2K/ZiNmI2LTZh+KAjNmF2YXZh+KAjF/Ys9uO2LTZh+KAjNmF2YXZh+KAjF/ahtmI2KfYsdi02YfigIzZhdmF2YfigIxf2b7bjtmG2KzYtNmH4oCM2YXZhdmH4oCMX9mH2YfigIzbjNmG24xf2LTZh+KAjNmF2YXZh+KAjCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OlxuICAgICAgICAgICAgJ9uM2YfigIzZg9i02YfigIzZhV/Yr9mI2YjYtNmH4oCM2YVf2LPbjti02YfigIzZhV/ahtmI2KfYsdi02YfigIzZhV/ZvtuO2YbYrNi02YfigIzZhV/Zh9mH4oCM24zZhtuMX9i02YfigIzZhdmF2YfigIwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn24xf2K9f2LNf2oZf2b5f2Ydf2LQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2KbbjtmI2KfYsdmH4oCMfNio2YfigIzbjNin2YbbjC8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC/YptuO2YjYp9ix2YfigIwvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2KjZh+KAjNuM2KfZhtuMJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYptuO2YjYp9ix2YfigIwnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYptmH4oCM2YXYsduGINmD2KfYqtqY2YXbjtixXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9io2YfigIzbjNin2YbbjCDZg9in2KramNmF247YsV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvZg9in2KramNmF247YsV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYr9mI247ZhtuOINmD2KfYqtqY2YXbjtixXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9mD2KfYqtqY2YXbjtixXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mE2YfigIwgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzJyxcbiAgICAgICAgICAgIHM6ICfahtmH4oCM2YbYryDahtix2YPZh+KAjNuM2YfigIzZgycsXG4gICAgICAgICAgICBzczogJ9qG2LHZg9mH4oCMICVkJyxcbiAgICAgICAgICAgIG06ICfbjNmH4oCM2YMg2K7ZiNmE2YfigIzZgycsXG4gICAgICAgICAgICBtbTogJyVkINiu2YjZhNmH4oCM2YMnLFxuICAgICAgICAgICAgaDogJ9uM2YfigIzZgyDZg9in2KramNmF247YsScsXG4gICAgICAgICAgICBoaDogJyVkINmD2KfYqtqY2YXbjtixJyxcbiAgICAgICAgICAgIGQ6ICfbjNmH4oCM2YMg2pXbhtqYJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2pXbhtqYJyxcbiAgICAgICAgICAgIE06ICfbjNmH4oCM2YMg2YXYp9mG2q8nLFxuICAgICAgICAgICAgTU06ICclZCDZhdin2YbarycsXG4gICAgICAgICAgICB5OiAn24zZh+KAjNmDINiz2KfatScsXG4gICAgICAgICAgICB5eTogJyVkINiz2KfatScsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1vZodmi2aPZpNml2abZp9mo2anZoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDEyLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxMnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGt1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEt5cmd5eiBba3ldXG4vLyEgYXV0aG9yIDogQ2h5bmd5eiBBcnlzdGFuIHV1bHUgOiBodHRwczovL2dpdGh1Yi5jb20vY2h5bmd5elxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN1ZmZpeGVzID0ge1xuICAgICAgICAwOiAnLdGH0q8nLFxuICAgICAgICAxOiAnLdGH0LgnLFxuICAgICAgICAyOiAnLdGH0LgnLFxuICAgICAgICAzOiAnLdGH0q8nLFxuICAgICAgICA0OiAnLdGH0q8nLFxuICAgICAgICA1OiAnLdGH0LgnLFxuICAgICAgICA2OiAnLdGH0YsnLFxuICAgICAgICA3OiAnLdGH0LgnLFxuICAgICAgICA4OiAnLdGH0LgnLFxuICAgICAgICA5OiAnLdGH0YMnLFxuICAgICAgICAxMDogJy3Rh9GDJyxcbiAgICAgICAgMjA6ICct0YfRiycsXG4gICAgICAgIDMwOiAnLdGH0YMnLFxuICAgICAgICA0MDogJy3Rh9GLJyxcbiAgICAgICAgNTA6ICct0YfSrycsXG4gICAgICAgIDYwOiAnLdGH0YsnLFxuICAgICAgICA3MDogJy3Rh9C4JyxcbiAgICAgICAgODA6ICct0YfQuCcsXG4gICAgICAgIDkwOiAnLdGH0YMnLFxuICAgICAgICAxMDA6ICct0YfSrycsXG4gICAgfTtcblxuICAgIHZhciBreSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2t5Jywge1xuICAgICAgICBtb250aHM6ICfRj9C90LLQsNGA0Yxf0YTQtdCy0YDQsNC70Yxf0LzQsNGA0YJf0LDQv9GA0LXQu9GMX9C80LDQuV/QuNGO0L3RjF/QuNGO0LvRjF/QsNCy0LPRg9GB0YJf0YHQtdC90YLRj9Cx0YDRjF/QvtC60YLRj9Cx0YDRjF/QvdC+0Y/QsdGA0Yxf0LTQtdC60LDQsdGA0YwnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0Y/QvdCyX9GE0LXQsl/QvNCw0YDRgl/QsNC/0YBf0LzQsNC5X9C40Y7QvdGMX9C40Y7Qu9GMX9Cw0LLQs1/RgdC10L1f0L7QutGCX9C90L7Rj1/QtNC10LonLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn0JbQtdC60YjQtdC80LHQuF/QlNKv0LnRiNOp0LzQsdKvX9Co0LXQudGI0LXQvNCx0Lhf0KjQsNGA0YjQtdC80LHQuF/QkdC10LnRiNC10LzQsdC4X9CW0YPQvNCwX9CY0YjQtdC80LHQuCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9CW0LXQul/QlNKv0Llf0KjQtdC5X9Co0LDRgF/QkdC10Llf0JbRg9C8X9CY0YjQtScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQltC6X9CU0Llf0KjQuV/QqNGAX9CR0Llf0JbQvF/QmNGIJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9CR0q/Qs9Kv0L0g0YHQsNCw0YJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0K3RgNGC0LXSoyDRgdCw0LDRgl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvRgdCw0LDRgl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQmtC10YfRjdGNINGB0LDQsNGCXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vTqNGC0LrTqdC9INCw0L/RgtCw0L3Ri9C9XSBkZGRkIFvQutKv0L3Sr10gW9GB0LDQsNGCXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINC40YfQuNC90LTQtScsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0LzRg9GA0YPQvScsXG4gICAgICAgICAgICBzOiAn0LHQuNGA0L3QtdGH0LUg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG06ICfQsdC40YAg0LzSr9C906nRgicsXG4gICAgICAgICAgICBtbTogJyVkINC80q/QvdOp0YInLFxuICAgICAgICAgICAgaDogJ9Cx0LjRgCDRgdCw0LDRgicsXG4gICAgICAgICAgICBoaDogJyVkINGB0LDQsNGCJyxcbiAgICAgICAgICAgIGQ6ICfQsdC40YAg0LrSr9C9JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0LrSr9C9JyxcbiAgICAgICAgICAgIE06ICfQsdC40YAg0LDQuScsXG4gICAgICAgICAgICBNTTogJyVkINCw0LknLFxuICAgICAgICAgICAgeTogJ9Cx0LjRgCDQttGL0LsnLFxuICAgICAgICAgICAgeXk6ICclZCDQttGL0LsnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNGH0Lh80YfRi3zRh9KvfNGH0YMpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBiID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW251bWJlcl0gfHwgc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga3k7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTHV4ZW1ib3VyZ2lzaCBbbGJdXG4vLyEgYXV0aG9yIDogbXdlaW1lcnNraXJjaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9td2VpbWVyc2tpcmNoXG4vLyEgYXV0aG9yIDogRGF2aWQgUmFpc29uIDogaHR0cHM6Ly9naXRodWIuY29tL2t3aXNhdHpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBtOiBbJ2VuZyBNaW51dHQnLCAnZW5nZXIgTWludXR0J10sXG4gICAgICAgICAgICBoOiBbJ2VuZyBTdG9ubicsICdlbmdlciBTdG9ubiddLFxuICAgICAgICAgICAgZDogWydlZW4gRGFnJywgJ2VuZ2VtIERhZyddLFxuICAgICAgICAgICAgTTogWydlZSBNb3VudCcsICdlbmdlbSBNb3VudCddLFxuICAgICAgICAgICAgeTogWydlZSBKb2VyJywgJ2VuZ2VtIEpvZXInXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzRnV0dXJlVGltZShzdHJpbmcpIHtcbiAgICAgICAgdmFyIG51bWJlciA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YoJyAnKSk7XG4gICAgICAgIGlmIChlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobnVtYmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuICdhICcgKyBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdhbiAnICsgc3RyaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzUGFzdFRpbWUoc3RyaW5nKSB7XG4gICAgICAgIHZhciBudW1iZXIgPSBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5pbmRleE9mKCcgJykpO1xuICAgICAgICBpZiAoZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcikpIHtcbiAgICAgICAgICAgIHJldHVybiAndmlydSAnICsgc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAndmlydW4gJyArIHN0cmluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3b3JkIGJlZm9yZSB0aGUgZ2l2ZW4gbnVtYmVyIGxvc2VzIHRoZSAnLW4nIGVuZGluZy5cbiAgICAgKiBlLmcuICdhbiAxMCBEZWVnJyBidXQgJ2EgNSBEZWVnJ1xuICAgICAqXG4gICAgICogQHBhcmFtIG51bWJlciB7aW50ZWdlcn1cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobnVtYmVyKSB7XG4gICAgICAgIG51bWJlciA9IHBhcnNlSW50KG51bWJlciwgMTApO1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICAvLyBOZWdhdGl2ZSBOdW1iZXIgLS0+IGFsd2F5cyB0cnVlXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCAxMCkge1xuICAgICAgICAgICAgLy8gT25seSAxIGRpZ2l0XG4gICAgICAgICAgICBpZiAoNCA8PSBudW1iZXIgJiYgbnVtYmVyIDw9IDcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCAxMDApIHtcbiAgICAgICAgICAgIC8vIDIgZGlnaXRzXG4gICAgICAgICAgICB2YXIgbGFzdERpZ2l0ID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgZmlyc3REaWdpdCA9IG51bWJlciAvIDEwO1xuICAgICAgICAgICAgaWYgKGxhc3REaWdpdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIoZmlyc3REaWdpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKGxhc3REaWdpdCk7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgMTAwMDApIHtcbiAgICAgICAgICAgIC8vIDMgb3IgNCBkaWdpdHMgLS0+IHJlY3Vyc2l2ZWx5IGNoZWNrIGZpcnN0IGRpZ2l0XG4gICAgICAgICAgICB3aGlsZSAobnVtYmVyID49IDEwKSB7XG4gICAgICAgICAgICAgICAgbnVtYmVyID0gbnVtYmVyIC8gMTA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZWlmZWxlclJlZ2VsQXBwbGllc1RvTnVtYmVyKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBbnl0aGluZyBsYXJnZXIgdGhhbiA0IGRpZ2l0czogcmVjdXJzaXZlbHkgY2hlY2sgZmlyc3Qgbi0zIGRpZ2l0c1xuICAgICAgICAgICAgbnVtYmVyID0gbnVtYmVyIC8gMTAwMDtcbiAgICAgICAgICAgIHJldHVybiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsYiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2xiJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJfRmVicnVhcl9Nw6RlcnpfQWJyw6tsbF9NZWVfSnVuaV9KdWxpX0F1Z3VzdF9TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXplbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnSmFuLl9GZWJyLl9NcnouX0Fici5fTWVlX0p1bi5fSnVsLl9BdWcuX1NlcHQuX09rdC5fTm92Ll9EZXouJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1Nvbm5kZWdfTcOpaW5kZWdfRMOrbnNjaGRlZ19Nw6t0dHdvY2hfRG9ubmVzY2hkZWdfRnJlaWRlZ19TYW1zY2hkZWcnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1NvLl9Nw6kuX0TDqy5fTcOrLl9Eby5fRnIuX1NhLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTb19Nw6lfRMOrX03Dq19Eb19Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tIFtBdWVyXScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzIFtBdWVyXScsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbSBbQXVlcl0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tIFtBdWVyXScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hhdXQgdW1dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW011ZXIgdW1dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbdW1dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbR8Orc2NodGVyIHVtXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudCBkYXRlIHN0cmluZyBmb3IgJ0TDq25zY2hkZWcnIChUdWVzZGF5KSBhbmQgJ0Rvbm5lc2NoZGVnJyAoVGh1cnNkYXkpIGR1ZSB0byBwaG9ub2xvZ2ljYWwgcnVsZVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW0xlc2NodGVuXSBkZGRkIFt1bV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbTGVzY2h0ZV0gZGRkZCBbdW1dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogcHJvY2Vzc0Z1dHVyZVRpbWUsXG4gICAgICAgICAgICBwYXN0OiBwcm9jZXNzUGFzdFRpbWUsXG4gICAgICAgICAgICBzOiAnZSBwdWVyIFNla29ubmVuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgU2Vrb25uZW4nLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiAnJWQgTWludXR0ZW4nLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiAnJWQgU3Rvbm5lbicsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6ICclZCBEZWVnJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogJyVkIE3DqWludCcsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6ICclZCBKb2VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBsYjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBMYW8gW2xvXVxuLy8hIGF1dGhvciA6IFJ5YW4gSGFydCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yeWFuaGFydDJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBsbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2xvJywge1xuICAgICAgICBtb250aHM6ICfguqHgurHguofguoHguq3guplf4LqB4Lq44Lqh4Lqe4LqyX+C6oeC6teC6meC6sl/gu4DguqHguqrgurJf4Lqe4Lq24LqU4Lqq4Lqw4Lqe4LqyX+C6oeC6tOC6luC6uOC6meC6sl/guoHgu43guqXgurDguoHgurvgupRf4Lqq4Lq04LqH4Lqr4LqyX+C6geC6seC6meC6jeC6sl/gupXgurjguqXgurJf4Lqe4Lqw4LqI4Lq04LqBX+C6l+C6seC6meC6p+C6sicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4Lqh4Lqx4LqH4LqB4Lqt4LqZX+C6geC6uOC6oeC6nuC6sl/guqHgurXgupngurJf4LuA4Lqh4Lqq4LqyX+C6nuC6tuC6lOC6quC6sOC6nuC6sl/guqHgurTgupbgurjgupngurJf4LqB4LuN4Lql4Lqw4LqB4Lq74LqUX+C6quC6tOC6h+C6q+C6sl/guoHgurHgupnguo3gurJf4LqV4Lq44Lql4LqyX+C6nuC6sOC6iOC6tOC6gV/gupfgurHgupnguqfgurInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfguq3gurLgupfgurTgupRf4LqI4Lqx4LqZX+C6reC6seC6h+C6hOC6suC6mV/gup7gurjgupRf4Lqe4Lqw4Lqr4Lqx4LqUX+C6quC6uOC6gV/gu4DguqrgurvgurInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgupfgurTgupRf4LqI4Lqx4LqZX+C6reC6seC6h+C6hOC6suC6mV/gup7gurjgupRf4Lqe4Lqw4Lqr4Lqx4LqUX+C6quC6uOC6gV/gu4DguqrgurvgurInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4LqXX+C6iF/guq3guoRf4LqeX+C6nuC6q1/guqrguoFf4LqqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ+C6p+C6seC6mWRkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LqV4Lqt4LqZ4LuA4LqK4Lq74LuJ4LqyfOC6leC6reC6meC7geC6peC6hy8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn4LqV4Lqt4LqZ4LuB4Lql4LqHJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C6leC6reC6meC7gOC6iuC6u+C7ieC6sic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LqV4Lqt4LqZ4LuB4Lql4LqHJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4Lqh4Lq34LuJ4LqZ4Lq14LuJ4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C6oeC6t+C7ieC6reC6t+C7iOC6meC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4Lqn4Lqx4LqZXWRkZGRb4Luc4LuJ4Lqy4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C6oeC6t+C7ieC6p+C6suC6meC6meC6teC7ieC7gOC6p+C6peC6sl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4Lqn4Lqx4LqZXWRkZGRb4LuB4Lql4LuJ4Lqn4LqZ4Lq14LuJ4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ+C6reC6teC6gSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXPgupzgu4jgurLgupnguqHgurInLFxuICAgICAgICAgICAgczogJ+C6muC7jeC7iOC7gOC6l+C6u+C7iOC6suC7g+C6lOC6p+C6tOC6meC6suC6l+C6tScsXG4gICAgICAgICAgICBzczogJyVkIOC6p+C6tOC6meC6suC6l+C6tScsXG4gICAgICAgICAgICBtOiAnMSDgupngurLgupfgurUnLFxuICAgICAgICAgICAgbW06ICclZCDgupngurLgupfgurUnLFxuICAgICAgICAgICAgaDogJzEg4LqK4Lq74LuI4Lqn4LuC4Lqh4LqHJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4LqK4Lq74LuI4Lqn4LuC4Lqh4LqHJyxcbiAgICAgICAgICAgIGQ6ICcxIOC6oeC6t+C7iScsXG4gICAgICAgICAgICBkZDogJyVkIOC6oeC6t+C7iScsXG4gICAgICAgICAgICBNOiAnMSDgu4DgupTgurfguq3gupknLFxuICAgICAgICAgICAgTU06ICclZCDgu4DgupTgurfguq3gupknLFxuICAgICAgICAgICAgeTogJzEg4Lqb4Lq1JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4Lqb4Lq1JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogLyjgupfgurXgu4gpXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ+C6l+C6teC7iCcgKyBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbG87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTGl0aHVhbmlhbiBbbHRdXG4vLyEgYXV0aG9yIDogTWluZGF1Z2FzIE1vesWrcmFzIDogaHR0cHM6Ly9naXRodWIuY29tL21tb3p1cmFzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdW5pdHMgPSB7XG4gICAgICAgIHNzOiAnc2VrdW5kxJdfc2VrdW5kxb5pxbNfc2VrdW5kZXMnLFxuICAgICAgICBtOiAnbWludXTEl19taW51dMSXc19taW51dMSZJyxcbiAgICAgICAgbW06ICdtaW51dMSXc19taW51xI1pxbNfbWludXRlcycsXG4gICAgICAgIGg6ICd2YWxhbmRhX3ZhbGFuZG9zX3ZhbGFuZMSFJyxcbiAgICAgICAgaGg6ICd2YWxhbmRvc192YWxhbmTFs192YWxhbmRhcycsXG4gICAgICAgIGQ6ICdkaWVuYV9kaWVub3NfZGllbsSFJyxcbiAgICAgICAgZGQ6ICdkaWVub3NfZGllbsWzX2RpZW5hcycsXG4gICAgICAgIE06ICdtxJdudW9fbcSXbmVzaW9fbcSXbmVzxK8nLFxuICAgICAgICBNTTogJ23El25lc2lhaV9txJduZXNpxbNfbcSXbmVzaXVzJyxcbiAgICAgICAgeTogJ21ldGFpX21ldMWzX21ldHVzJyxcbiAgICAgICAgeXk6ICdtZXRhaV9tZXTFs19tZXR1cycsXG4gICAgfTtcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVTZWNvbmRzKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuICdrZWxpb3Mgc2VrdW5kxJdzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICdrZWxpxbMgc2VrdW5kxb5pxbMnIDogJ2tlbGlhcyBzZWt1bmRlcyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlU2luZ3VsYXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4XG4gICAgICAgICAgICA/IGZvcm1zKGtleSlbMF1cbiAgICAgICAgICAgIDogaXNGdXR1cmVcbiAgICAgICAgICAgICAgPyBmb3JtcyhrZXkpWzFdXG4gICAgICAgICAgICAgIDogZm9ybXMoa2V5KVsyXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3BlY2lhbChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAwIHx8IChudW1iZXIgPiAxMCAmJiBudW1iZXIgPCAyMCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZvcm1zKGtleSkge1xuICAgICAgICByZXR1cm4gdW5pdHNba2V5XS5zcGxpdCgnXycpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgcmVzdWx0ICsgdHJhbnNsYXRlU2luZ3VsYXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXlbMF0sIGlzRnV0dXJlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHNwZWNpYWwobnVtYmVyKSA/IGZvcm1zKGtleSlbMV0gOiBmb3JtcyhrZXkpWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyBmb3JtcyhrZXkpWzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHNwZWNpYWwobnVtYmVyKSA/IGZvcm1zKGtleSlbMV0gOiBmb3JtcyhrZXkpWzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgbHQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdsdCcsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdzYXVzaW9fdmFzYXJpb19rb3ZvX2JhbGFuZMW+aW9fZ2VndcW+xJdzX2JpcsW+ZWxpb19saWVwb3NfcnVncGrFq8SNaW9fcnVnc8SXam9fc3BhbGlvX2xhcGtyacSNaW9fZ3J1b2TFvmlvJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdzYXVzaXNfdmFzYXJpc19rb3Zhc19iYWxhbmRpc19nZWd1xb7El19iaXLFvmVsaXNfbGllcGFfcnVncGrFq3Rpc19ydWdzxJdqaXNfc3BhbGlzX2xhcGtyaXRpc19ncnVvZGlzJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NP3xNTU1NPyhcXFtbXlxcW1xcXV0qXFxdfFxccykrRFtvRF0/LyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdzYXVfdmFzX2tvdl9iYWxfZ2VnX2Jpcl9saWVfcmdwX3Jnc19zcGFfbGFwX2dyZCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ3Nla21hZGllbsSvX3Bpcm1hZGllbsSvX2FudHJhZGllbsSvX3RyZcSNaWFkaWVuxK9fa2V0dmlydGFkaWVuxK9fcGVua3RhZGllbsSvX8WhZcWhdGFkaWVuxK8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ3Nla21hZGllbmlzX3Bpcm1hZGllbmlzX2FudHJhZGllbmlzX3RyZcSNaWFkaWVuaXNfa2V0dmlydGFkaWVuaXNfcGVua3RhZGllbmlzX8WhZcWhdGFkaWVuaXMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9kZGRkIEhIOm1tLyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1Nla19QaXJfQW50X1RyZV9LZXRfUGVuX8WgZcWhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NfUF9BX1RfS19Qbl/FoCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0sIEhIOm1tIFt2YWwuXScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBkZGRkLCBISDptbSBbdmFsLl0nLFxuICAgICAgICAgICAgbDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgbGw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0nLFxuICAgICAgICAgICAgbGxsOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBISDptbSBbdmFsLl0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXSwgZGRkLCBISDptbSBbdmFsLl0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vFoGlhbmRpZW5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbUnl0b2pdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1Zha2FyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tQcmHEl2p1c8SvXSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAncG8gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByaWXFoSAlcycsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGVTZWNvbmRzLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZVNpbmd1bGFyLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LW9qaS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLW9qaSc7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBsdDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBMYXR2aWFuIFtsdl1cbi8vISBhdXRob3IgOiBLcmlzdGFwcyBLYXJsc29ucyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9za2Frcmlcbi8vISBhdXRob3IgOiBKxIFuaXMgRWxtZXJpcyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9KYW5pc0VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB1bml0cyA9IHtcbiAgICAgICAgc3M6ICdzZWt1bmRlc19zZWt1bmTEk21fc2VrdW5kZV9zZWt1bmRlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgbTogJ21pbsWrdGVzX21pbsWrdMSTbV9taW7Fq3RlX21pbsWrdGVzJy5zcGxpdCgnXycpLFxuICAgICAgICBtbTogJ21pbsWrdGVzX21pbsWrdMSTbV9taW7Fq3RlX21pbsWrdGVzJy5zcGxpdCgnXycpLFxuICAgICAgICBoOiAnc3R1bmRhc19zdHVuZMSBbV9zdHVuZGFfc3R1bmRhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgaGg6ICdzdHVuZGFzX3N0dW5kxIFtX3N0dW5kYV9zdHVuZGFzJy5zcGxpdCgnXycpLFxuICAgICAgICBkOiAnZGllbmFzX2RpZW7EgW1fZGllbmFfZGllbmFzJy5zcGxpdCgnXycpLFxuICAgICAgICBkZDogJ2RpZW5hc19kaWVuxIFtX2RpZW5hX2RpZW5hcycuc3BsaXQoJ18nKSxcbiAgICAgICAgTTogJ23Ek25lxaFhX23Ek25lxaFpZW1fbcSTbmVzaXNfbcSTbmXFoWknLnNwbGl0KCdfJyksXG4gICAgICAgIE1NOiAnbcSTbmXFoWFfbcSTbmXFoWllbV9txJNuZXNpc19txJNuZcWhaScuc3BsaXQoJ18nKSxcbiAgICAgICAgeTogJ2dhZGFfZ2FkaWVtX2dhZHNfZ2FkaScuc3BsaXQoJ18nKSxcbiAgICAgICAgeXk6ICdnYWRhX2dhZGllbV9nYWRzX2dhZGknLnNwbGl0KCdfJyksXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gd2l0aG91dFN1ZmZpeCBib29sZWFuIHRydWUgPSBhIGxlbmd0aCBvZiB0aW1lOyBmYWxzZSA9IGJlZm9yZS9hZnRlciBhIHBlcmlvZCBvZiB0aW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvcm1hdChmb3JtcywgbnVtYmVyLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAvLyBFLmcuIFwiMjEgbWluxat0ZVwiLCBcIjMgbWluxat0ZXNcIi5cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMSAmJiBudW1iZXIgJSAxMDAgIT09IDExID8gZm9ybXNbMl0gOiBmb3Jtc1szXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEUuZy4gXCIyMSBtaW7Fq3Rlc1wiIGFzIGluIFwicMSTYyAyMSBtaW7Fq3Rlc1wiLlxuICAgICAgICAgICAgLy8gRS5nLiBcIjMgbWluxat0xJNtXCIgYXMgaW4gXCJwxJNjIDMgbWluxat0xJNtXCIuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICUgMTAgPT09IDEgJiYgbnVtYmVyICUgMTAwICE9PSAxMSA/IGZvcm1zWzBdIDogZm9ybXNbMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFBsdXJhbChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgZm9ybWF0KHVuaXRzW2tleV0sIG51bWJlciwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcihudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHVuaXRzW2tleV0sIG51bWJlciwgd2l0aG91dFN1ZmZpeCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlU2Vjb25kcyhudW1iZXIsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnZGHFvmFzIHNla3VuZGVzJyA6ICdkYcW+xIFtIHNla3VuZMSTbSc7XG4gICAgfVxuXG4gICAgdmFyIGx2ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbHYnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnbEgXJpc19mZWJydcSBcmlzX21hcnRzX2FwcsSrbGlzX21haWpzX2rFq25panNfasWrbGlqc19hdWd1c3RzX3NlcHRlbWJyaXNfb2t0b2JyaXNfbm92ZW1icmlzX2RlY2VtYnJpcycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdqYW5fZmViX21hcl9hcHJfbWFpX2rFq25fasWrbF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdzdsSTdGRpZW5hX3Bpcm1kaWVuYV9vdHJkaWVuYV90cmXFoWRpZW5hX2NldHVydGRpZW5hX3BpZWt0ZGllbmFfc2VzdGRpZW5hJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdl9QX09fVF9DX1BrX1MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3ZfUF9PX1RfQ19Qa19TJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZLicsXG4gICAgICAgICAgICBMTDogJ1lZWVkuIFtnYWRhXSBELiBNTU1NJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkuIFtnYWRhXSBELiBNTU1NLCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWS4gW2dhZGFdIEQuIE1NTU0sIGRkZGQsIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbxaBvZGllbiBwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tSxKt0IHB1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3B1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1Zha2FyIHB1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tQYWfEgWp1xaHEgV0gZGRkZCBbcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAncMSTYyAlcycsXG4gICAgICAgICAgICBwYXN0OiAncGlybXMgJXMnLFxuICAgICAgICAgICAgczogcmVsYXRpdmVTZWNvbmRzLFxuICAgICAgICAgICAgc3M6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtOiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGg6IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIGhoOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZDogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNOiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHk6IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGx2O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1vbnRlbmVncmluIFttZV1cbi8vISBhdXRob3IgOiBNaW9kcmFnIE5pa2HEjSA8bWlvZHJhZ0ByZXN0YXJ0aXQubWU+IDogaHR0cHM6Ly9naXRodWIuY29tL21pb2RyYWduaWthY1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRyYW5zbGF0b3IgPSB7XG4gICAgICAgIHdvcmRzOiB7XG4gICAgICAgICAgICAvL0RpZmZlcmVudCBncmFtbWF0aWNhbCBjYXNlc1xuICAgICAgICAgICAgc3M6IFsnc2VrdW5kJywgJ3Nla3VuZGEnLCAnc2VrdW5kaSddLFxuICAgICAgICAgICAgbTogWydqZWRhbiBtaW51dCcsICdqZWRub2cgbWludXRhJ10sXG4gICAgICAgICAgICBtbTogWydtaW51dCcsICdtaW51dGEnLCAnbWludXRhJ10sXG4gICAgICAgICAgICBoOiBbJ2plZGFuIHNhdCcsICdqZWRub2cgc2F0YSddLFxuICAgICAgICAgICAgaGg6IFsnc2F0JywgJ3NhdGEnLCAnc2F0aSddLFxuICAgICAgICAgICAgZGQ6IFsnZGFuJywgJ2RhbmEnLCAnZGFuYSddLFxuICAgICAgICAgICAgTU06IFsnbWplc2VjJywgJ21qZXNlY2EnLCAnbWplc2VjaSddLFxuICAgICAgICAgICAgeXk6IFsnZ29kaW5hJywgJ2dvZGluZScsICdnb2RpbmEnXSxcbiAgICAgICAgfSxcbiAgICAgICAgY29ycmVjdEdyYW1tYXRpY2FsQ2FzZTogZnVuY3Rpb24gKG51bWJlciwgd29yZEtleSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gMVxuICAgICAgICAgICAgICAgID8gd29yZEtleVswXVxuICAgICAgICAgICAgICAgIDogbnVtYmVyID49IDIgJiYgbnVtYmVyIDw9IDRcbiAgICAgICAgICAgICAgICAgID8gd29yZEtleVsxXVxuICAgICAgICAgICAgICAgICAgOiB3b3JkS2V5WzJdO1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICAgICAgdmFyIHdvcmRLZXkgPSB0cmFuc2xhdG9yLndvcmRzW2tleV07XG4gICAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gd29yZEtleVswXSA6IHdvcmRLZXlbMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIG51bWJlciArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0b3IuY29ycmVjdEdyYW1tYXRpY2FsQ2FzZShudW1iZXIsIHdvcmRLZXkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgdmFyIG1lID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbWUnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnRfYXByaWxfbWFqX2p1bl9qdWxfYXZndXN0X3NlcHRlbWJhcl9va3RvYmFyX25vdmVtYmFyX2RlY2VtYmFyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hal9qdW5fanVsX2F2Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWRqZWxqYV9wb25lZGplbGpha191dG9yYWtfc3JpamVkYV/EjWV0dnJ0YWtfcGV0YWtfc3Vib3RhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmVkLl9wb24uX3V0by5fc3JpLl/EjWV0Ll9wZXQuX3N1Yi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdXRfc3JfxI1lX3BlX3N1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3NqdXRyYSB1XSBMVCcsXG5cbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRqZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3NyaWplZHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzdWJvdHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdcSNZSB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBsYXN0V2Vla0RheXMgPSBbXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW25lZGplbGplXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbcG9uZWRqZWxqa2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFt1dG9ya2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW3NyaWplZGVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFvEjWV0dnJ0a2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFtwZXRrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbc3Vib3RlXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RXZWVrRGF5c1t0aGlzLmRheSgpXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmlqZSAlcycsXG4gICAgICAgICAgICBzOiAnbmVrb2xpa28gc2VrdW5kaScsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogJ2RhbicsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiAnbWplc2VjJyxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6ICdnb2RpbnUnLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1lO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hb3JpIFttaV1cbi8vISBhdXRob3IgOiBKb2huIENvcnJpZ2FuIDxyb2JiaWVjbG9zZXRAZ21haWwuY29tPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb2huaWRlYWxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtaSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21pJywge1xuICAgICAgICBtb250aHM6ICdLb2hpLXTEgXRlX0h1aS10YW5ndXJ1X1BvdXTFqy10ZS1yYW5naV9QYWVuZ2Etd2jEgXdoxIFfSGFyYXR1YV9QaXBpcmlfSMWNbmdvaW5nb2lfSGVyZS10dXJpLWvFjWvEgV9NYWh1cnVfV2hpcmluZ2EtxIEtbnVrdV9XaGlyaW5nYS3EgS1yYW5naV9IYWtpaGVhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdLb2hpX0h1aV9Qb3VfUGFlX0hhcmFfUGlwaV9IxY1uZ29pX0hlcmVfTWFodV9XaGktbnVfV2hpLXJhX0hha2knLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUmVnZXg6IC8oPzpbJ2EtelxcdTAxMDFcXHUwMTREXFx1MDE2Ql0rXFwtPyl7MSwzfS9pLFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDogLyg/OlsnYS16XFx1MDEwMVxcdTAxNERcXHUwMTZCXStcXC0/KXsxLDN9L2ksXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IC8oPzpbJ2EtelxcdTAxMDFcXHUwMTREXFx1MDE2Ql0rXFwtPyl7MSwzfS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OiAvKD86WydhLXpcXHUwMTAxXFx1MDE0RFxcdTAxNkJdK1xcLT8pezEsMn0vaSxcbiAgICAgICAgd2Vla2RheXM6ICdSxIF0YXB1X01hbmVfVMWrcmVpX1dlbmVyZWlfVMSBaXRlX1BhcmFpcmVfSMSBdGFyZWknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdUYV9NYV9UxatfV2VfVMSBaV9QYV9IxIEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnVGFfTWFfVMWrX1dlX1TEgWlfUGFfSMSBJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIFtpXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgW2ldIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaSB0ZWllIG1haGFuYSwgaV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1thcG9wbyBpXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2ldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaW5hbmFoaSBpXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3doYWthbXV0dW5nYSBpXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2kgcm90byBpICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBpIG11YScsXG4gICAgICAgICAgICBzOiAndGUgaMSTa29uYSBydWFydWEnLFxuICAgICAgICAgICAgc3M6ICclZCBoxJNrb25hJyxcbiAgICAgICAgICAgIG06ICdoZSBtZW5ldGknLFxuICAgICAgICAgICAgbW06ICclZCBtZW5ldGknLFxuICAgICAgICAgICAgaDogJ3RlIGhhb3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaGFvcmEnLFxuICAgICAgICAgICAgZDogJ2hlIHJhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgcmEnLFxuICAgICAgICAgICAgTTogJ2hlIG1hcmFtYScsXG4gICAgICAgICAgICBNTTogJyVkIG1hcmFtYScsXG4gICAgICAgICAgICB5OiAnaGUgdGF1JyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGF1JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtaTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWNlZG9uaWFuIFtta11cbi8vISBhdXRob3IgOiBCb3Jpc2xhdiBNaWNrb3YgOiBodHRwczovL2dpdGh1Yi5jb20vQjBrMFxuLy8hIGF1dGhvciA6IFNhc2hrbyBUb2Rvcm92IDogaHR0cHM6Ly9naXRodWIuY29tL2JreWNlaFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1rID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbWsnLCB7XG4gICAgICAgIG1vbnRoczogJ9GY0LDQvdGD0LDRgNC4X9GE0LXQstGA0YPQsNGA0Lhf0LzQsNGA0YJf0LDQv9GA0LjQu1/QvNCw0Zhf0ZjRg9C90Lhf0ZjRg9C70Lhf0LDQstCz0YPRgdGCX9GB0LXQv9GC0LXQvNCy0YDQuF/QvtC60YLQvtC80LLRgNC4X9C90L7QtdC80LLRgNC4X9C00LXQutC10LzQstGA0LgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0ZjQsNC9X9GE0LXQsl/QvNCw0YBf0LDQv9GAX9C80LDRmF/RmNGD0L1f0ZjRg9C7X9Cw0LLQs1/RgdC10L9f0L7QutGCX9C90L7QtV/QtNC10LonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn0L3QtdC00LXQu9CwX9C/0L7QvdC10LTQtdC70L3QuNC6X9Cy0YLQvtGA0L3QuNC6X9GB0YDQtdC00LBf0YfQtdGC0LLRgNGC0L7Qul/Qv9C10YLQvtC6X9GB0LDQsdC+0YLQsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C90LXQtF/Qv9C+0L1f0LLRgtC+X9GB0YDQtV/Rh9C10YJf0L/QtdGCX9GB0LDQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQvWVf0L9vX9Cy0YJf0YHRgF/Rh9C1X9C/0LVf0YFhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQlNC10L3QtdGBINCy0L5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0KPRgtGA0LUg0LLQvl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb0JLQvl0gZGRkZCBb0LLQvl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vQktGH0LXRgNCwINCy0L5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQmNC30LzQuNC90LDRgtCw0YLQsF0gZGRkZCBb0LLQvl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQmNC30LzQuNC90LDRgtC40L7Rgl0gZGRkZCBb0LLQvl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9C30LAgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9C/0YDQtdC0ICVzJyxcbiAgICAgICAgICAgIHM6ICfQvdC10LrQvtC70LrRgyDRgdC10LrRg9C90LTQuCcsXG4gICAgICAgICAgICBzczogJyVkINGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIG06ICfQtdC00L3QsCDQvNC40L3Rg9GC0LAnLFxuICAgICAgICAgICAgbW06ICclZCDQvNC40L3Rg9GC0LgnLFxuICAgICAgICAgICAgaDogJ9C10LTQtdC9INGH0LDRgScsXG4gICAgICAgICAgICBoaDogJyVkINGH0LDRgdCwJyxcbiAgICAgICAgICAgIGQ6ICfQtdC00LXQvSDQtNC10L0nLFxuICAgICAgICAgICAgZGQ6ICclZCDQtNC10L3QsCcsXG4gICAgICAgICAgICBNOiAn0LXQtNC10L0g0LzQtdGB0LXRhicsXG4gICAgICAgICAgICBNTTogJyVkINC80LXRgdC10YbQuCcsXG4gICAgICAgICAgICB5OiAn0LXQtNC90LAg0LPQvtC00LjQvdCwJyxcbiAgICAgICAgICAgIHl5OiAnJWQg0LPQvtC00LjQvdC4JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQtdCyfNC10L180YLQuHzQstC4fNGA0Lh80LzQuCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgbGFzdERpZ2l0ID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgbGFzdDJEaWdpdHMgPSBudW1iZXIgJSAxMDA7XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LXQsic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3QyRGlnaXRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LXQvSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3QyRGlnaXRzID4gMTAgJiYgbGFzdDJEaWdpdHMgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGC0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QstC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0YDQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gNyB8fCBsYXN0RGlnaXQgPT09IDgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QvNC4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0YLQuCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtaztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWxheWFsYW0gW21sXVxuLy8hIGF1dGhvciA6IEZsb3lkIFBpbmsgOiBodHRwczovL2dpdGh1Yi5jb20vZmxveWRwaW5rXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbWwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtbCcsIHtcbiAgICAgICAgbW9udGhzOiAn4LSc4LSo4LWB4LS14LSw4LS/X+C0q+C1huC0rOC1jeC0sOC1geC0teC0sOC0v1/gtK7gtL7gtbzgtJrgtY3gtJrgtY1f4LSP4LSq4LWN4LSw4LS/4LW9X+C0ruC1h+C0r+C1jV/gtJzgtYLgtbpf4LSc4LWC4LSy4LWIX+C0k+C0l+C0uOC1jeC0seC1jeC0seC1jV/gtLjgtYbgtKrgtY3gtLHgtY3gtLHgtILgtKzgtbxf4LSS4LSV4LWN4LSf4LWL4LSs4LW8X+C0qOC0teC0guC0rOC1vF/gtKHgtL/gtLjgtILgtKzgtbwnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+C0nOC0qOC1gS5f4LSr4LWG4LSs4LWN4LSw4LWBLl/gtK7gtL7gtbwuX+C0j+C0quC1jeC0sOC0vy5f4LSu4LWH4LSv4LWNX+C0nOC1guC1ul/gtJzgtYLgtLLgtYguX+C0k+C0ly5f4LS44LWG4LSq4LWN4LSx4LWN4LSxLl/gtJLgtJXgtY3gtJ/gtYsuX+C0qOC0teC0gi5f4LSh4LS/4LS44LSCLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfgtJ7gtL7gtK/gtLHgtL7gtLTgtY3gtJpf4LSk4LS/4LSZ4LWN4LSV4LSz4LS+4LS04LWN4LSaX+C0muC1iuC0teC1jeC0teC0vuC0tOC1jeC0ml/gtKzgtYHgtKfgtKjgtL7gtLTgtY3gtJpf4LS14LWN4LSv4LS+4LS04LS+4LS04LWN4LSaX+C0teC1huC0s+C1jeC0s+C0v+C0r+C0vuC0tOC1jeC0ml/gtLbgtKjgtL/gtK/gtL7gtLTgtY3gtJonLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+C0nuC0vuC0r+C1vF/gtKTgtL/gtJngtY3gtJXgtb5f4LSa4LWK4LS14LWN4LS1X+C0rOC1geC0p+C1u1/gtLXgtY3gtK/gtL7gtLTgtIJf4LS14LWG4LSz4LWN4LSz4LS/X+C0tuC0qOC0vycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgtJ7gtL5f4LSk4LS/X+C0muC1il/gtKzgtYFf4LS14LWN4LSv4LS+X+C0teC1hl/gtLYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSAt4LSo4LWBJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyAt4LSo4LWBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSAt4LSo4LWBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIC3gtKjgtYEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgtIfgtKjgtY3gtKjgtY1dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4LSo4LS+4LSz4LWGXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4LSH4LSo4LWN4LSo4LSy4LWGXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgtJXgtLTgtL/gtJ7gtY3gtJ5dIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4LSV4LS04LS/4LSe4LWN4LSe4LWNJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgtK7gtYHgtbvgtKrgtY0nLFxuICAgICAgICAgICAgczogJ+C0heC1veC0qiDgtKjgtL/gtK7gtL/gtLfgtJngtY3gtJngtb4nLFxuICAgICAgICAgICAgc3M6ICclZCDgtLjgtYbgtJXgtY3gtJXgtbvgtKHgtY0nLFxuICAgICAgICAgICAgbTogJ+C0kuC0sOC1gSDgtK7gtL/gtKjgtL/gtLHgtY3gtLHgtY0nLFxuICAgICAgICAgICAgbW06ICclZCDgtK7gtL/gtKjgtL/gtLHgtY3gtLHgtY0nLFxuICAgICAgICAgICAgaDogJ+C0kuC0sOC1gSDgtK7gtKPgtL/gtJXgtY3gtJXgtYLgtbwnLFxuICAgICAgICAgICAgaGg6ICclZCDgtK7gtKPgtL/gtJXgtY3gtJXgtYLgtbwnLFxuICAgICAgICAgICAgZDogJ+C0kuC0sOC1gSDgtKbgtL/gtLXgtLjgtIInLFxuICAgICAgICAgICAgZGQ6ICclZCDgtKbgtL/gtLXgtLjgtIInLFxuICAgICAgICAgICAgTTogJ+C0kuC0sOC1gSDgtK7gtL7gtLjgtIInLFxuICAgICAgICAgICAgTU06ICclZCDgtK7gtL7gtLjgtIInLFxuICAgICAgICAgICAgeTogJ+C0kuC0sOC1gSDgtLXgtbzgtLfgtIInLFxuICAgICAgICAgICAgeXk6ICclZCDgtLXgtbzgtLfgtIInLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LSw4LS+4LSk4LWN4LSw4LS/fOC0sOC0vuC0teC0v+C0suC1hnzgtIngtJrgtY3gtJog4LSV4LS04LS/4LSe4LWN4LSe4LWNfOC0teC1iOC0leC1geC0qOC1jeC0qOC1h+C0sOC0gnzgtLDgtL7gtKTgtY3gtLDgtL8vaSxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+C0sOC0vuC0pOC1jeC0sOC0vycgJiYgaG91ciA+PSA0KSB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4LSJ4LSa4LWN4LSaIOC0leC0tOC0v+C0nuC1jeC0nuC1jScgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+C0teC1iOC0leC1geC0qOC1jeC0qOC1h+C0sOC0gidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtLDgtL7gtKTgtY3gtLDgtL8nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C0sOC0vuC0teC0v+C0suC1hic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LSJ4LSa4LWN4LSaIOC0leC0tOC0v+C0nuC1jeC0nuC1jSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LS14LWI4LSV4LWB4LSo4LWN4LSo4LWH4LSw4LSCJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtLDgtL7gtKTgtY3gtLDgtL8nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1sO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1vbmdvbGlhbiBbbW5dXG4vLyEgYXV0aG9yIDogSmF2a2hsYW50dWdzIE55YW1kb3JqIDogaHR0cHM6Ly9naXRodWIuY29tL2phdmtoYWFuajdcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9GF0Y3QtNGF0Y3QvSDRgdC10LrRg9C90LQnIDogJ9GF0Y3QtNGF0Y3QvSDRgdC10LrRg9C90LTRi9C9JztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINGB0LXQutGD0L3QtCcgOiAnINGB0LXQutGD0L3QtNGL0L0nKTtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg0LzQuNC90YPRgicgOiAnINC80LjQvdGD0YLRi9C9Jyk7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINGG0LDQsycgOiAnINGG0LDQs9C40LnQvScpO1xuICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDTqdC006nRgCcgOiAnINOp0LTRgNC40LnQvScpO1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDRgdCw0YAnIDogJyDRgdCw0YDRi9C9Jyk7XG4gICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINC20LjQuycgOiAnINC20LjQu9C40LnQvScpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1uID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbW4nLCB7XG4gICAgICAgIG1vbnRoczogJ9Cd0Y3Qs9C00q/Qs9GN0Y3RgCDRgdCw0YBf0KXQvtGR0YDQtNGD0LPQsNCw0YAg0YHQsNGAX9CT0YPRgNCw0LLQtNGD0LPQsNCw0YAg0YHQsNGAX9CU06nRgNOp0LLQtNKv0LPRjdGN0YAg0YHQsNGAX9Ci0LDQstC00YPQs9Cw0LDRgCDRgdCw0YBf0JfRg9GA0LPQsNC00YPQs9Cw0LDRgCDRgdCw0YBf0JTQvtC70LTRg9Cz0LDQsNGAINGB0LDRgF/QndCw0LnQvNC00YPQs9Cw0LDRgCDRgdCw0YBf0JXRgdC00q/Qs9GN0Y3RgCDRgdCw0YBf0JDRgNCw0LLQtNGD0LPQsNCw0YAg0YHQsNGAX9CQ0YDQstCw0L0g0L3RjdCz0LTSr9Cz0Y3RjdGAINGB0LDRgF/QkNGA0LLQsNC9INGF0L7RkdGA0LTRg9Cz0LDQsNGAINGB0LDRgCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnMSDRgdCw0YBfMiDRgdCw0YBfMyDRgdCw0YBfNCDRgdCw0YBfNSDRgdCw0YBfNiDRgdCw0YBfNyDRgdCw0YBfOCDRgdCw0YBfOSDRgdCw0YBfMTAg0YHQsNGAXzExINGB0LDRgF8xMiDRgdCw0YAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfQndGP0Lxf0JTQsNCy0LDQsF/QnNGP0LPQvNCw0YBf0JvRhdCw0LPQstCwX9Cf0q/RgNGN0LJf0JHQsNCw0YHQsNC9X9CR0Y/QvNCx0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQndGP0Lxf0JTQsNCyX9Cc0Y/Qs1/Qm9GF0LBf0J/Sr9GAX9CR0LDQsF/QkdGP0LwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0J3Rj1/QlNCwX9Cc0Y9f0JvRhV/Qn9KvX9CR0LBf0JHRjycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVkg0L7QvdGLIE1NTU3Ri9C9IEQnLFxuICAgICAgICAgICAgTExMOiAnWVlZWSDQvtC90YsgTU1NTdGL0L0gRCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgWVlZWSDQvtC90YsgTU1NTdGL0L0gRCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/SrtOofNKu0KUvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfSrtClJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Ku06gnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Ku0KUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vTqNC906nTqdC006nRgF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQnNCw0YDQs9Cw0LDRiF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb0JjRgNGN0YVdIGRkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vTqNGH0LjQs9C006nRgF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb06jQvdCz06nRgNGB06nQvV0gZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINC00LDRgNCw0LAnLFxuICAgICAgICAgICAgcGFzdDogJyVzINOp0LzQvdOpJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9INOp0LTTqdGALyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINOp0LTTqdGAJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1uO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hcmF0aGkgW21yXVxuLy8hIGF1dGhvciA6IEhhcnNoYWQgS2FsZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rYWxlaHZcbi8vISBhdXRob3IgOiBWaXZlayBBdGhhbHllIDogaHR0cHM6Ly9naXRodWIuY29tL3ZuYXRoYWx5ZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgpacnLFxuICAgICAgICAgICAgMjogJ+ClqCcsXG4gICAgICAgICAgICAzOiAn4KWpJyxcbiAgICAgICAgICAgIDQ6ICfgpaonLFxuICAgICAgICAgICAgNTogJ+ClqycsXG4gICAgICAgICAgICA2OiAn4KWsJyxcbiAgICAgICAgICAgIDc6ICfgpa0nLFxuICAgICAgICAgICAgODogJ+ClricsXG4gICAgICAgICAgICA5OiAn4KWvJyxcbiAgICAgICAgICAgIDA6ICfgpaYnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KWnJzogJzEnLFxuICAgICAgICAgICAgJ+ClqCc6ICcyJyxcbiAgICAgICAgICAgICfgpaknOiAnMycsXG4gICAgICAgICAgICAn4KWqJzogJzQnLFxuICAgICAgICAgICAgJ+Clqyc6ICc1JyxcbiAgICAgICAgICAgICfgpawnOiAnNicsXG4gICAgICAgICAgICAn4KWtJzogJzcnLFxuICAgICAgICAgICAgJ+Clric6ICc4JyxcbiAgICAgICAgICAgICfgpa8nOiAnOScsXG4gICAgICAgICAgICAn4KWmJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lTXIobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSAnJztcbiAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpJXgpL7gpLngpYAg4KS44KWH4KSV4KSC4KSmJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KS44KWH4KSV4KSC4KSmJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJUg4KSu4KS/4KSo4KS/4KSfJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSu4KS/4KSo4KS/4KSf4KWHJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJUg4KSk4KS+4KS4JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSk4KS+4KS4JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJUg4KSm4KS/4KS14KS4JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSm4KS/4KS14KS4JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJUg4KSu4KS54KS/4KSo4KS+JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSu4KS54KS/4KSo4KWHJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJUg4KS14KSw4KWN4KS3JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KS14KSw4KWN4KS34KWHJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHN0cmluZykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSV4KS+4KS54KWAIOCkuOClh+CkleCkguCkpuCkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkuOClh+CkleCkguCkpuCkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkruCkv+CkqOCkv+Ckn+Ckvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkruCkv+CkqOCkv+Ckn+CkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkpOCkvuCkuOCkvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkpOCkvuCkuOCkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkpuCkv+CkteCkuOCkvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkpuCkv+CkteCkuOCkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkruCkueCkv+CkqOCljeCkr+Ckvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkruCkueCkv+CkqOCljeCkr+CkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAn4KSP4KSV4KS+IOCkteCksOCljeCkt+Ckvic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJyVkIOCkteCksOCljeCkt+CkvuCkgic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgbXIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtcicsIHtcbiAgICAgICAgbW9udGhzOiAn4KSc4KS+4KSo4KWH4KS14KS+4KSw4KWAX+Ckq+Clh+CkrOCljeCksOClgeCkteCkvuCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSP4KSq4KWN4KSw4KS/4KSyX+CkruClh1/gpJzgpYLgpKhf4KSc4KWB4KSy4KWIX+CkkeCkl+CkuOCljeCkn1/gpLjgpKrgpY3gpJ/gpYfgpILgpKzgpLBf4KSR4KSV4KWN4KSf4KWL4KSs4KSwX+CkqOCli+CkteCljeCkueClh+CkguCkrOCksF/gpKHgpL/gpLjgpYfgpILgpKzgpLAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CknOCkvuCkqOClhy5f4KSr4KWH4KSs4KWN4KSw4KWBLl/gpK7gpL7gpLDgpY3gpJouX+Ckj+CkquCljeCksOCkvy5f4KSu4KWHLl/gpJzgpYLgpKguX+CknOClgeCksuCliC5f4KSR4KSXLl/gpLjgpKrgpY3gpJ/gpYfgpIIuX+CkkeCkleCljeCkn+Cliy5f4KSo4KWL4KS14KWN4KS54KWH4KSCLl/gpKHgpL/gpLjgpYfgpIIuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn4KSw4KS14KS/4KS14KS+4KSwX+CkuOCli+CkruCkteCkvuCksF/gpK7gpILgpJfgpLPgpLXgpL7gpLBf4KSs4KWB4KSn4KS14KS+4KSwX+Ckl+ClgeCksOClguCkteCkvuCksF/gpLbgpYHgpJXgpY3gpLDgpLXgpL7gpLBf4KS24KSo4KS/4KS14KS+4KSwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4KSw4KS14KS/X+CkuOCli+Ckrl/gpK7gpILgpJfgpLNf4KSs4KWB4KSnX+Ckl+ClgeCksOClgl/gpLbgpYHgpJXgpY3gpLBf4KS24KSo4KS/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CksF/gpLjgpYtf4KSu4KSCX+CkrOClgV/gpJfgpYFf4KS24KWBX+Ckticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIOCkteCkvuCknOCkpOCkvicsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3Mg4KS14KS+4KSc4KSk4KS+JyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgpLXgpL7gpJzgpKTgpL4nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4KS14KS+4KSc4KSk4KS+JyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KSG4KScXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CkieCkpuCljeCkr+Ckvl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CkleCkvuCksl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KSu4KS+4KSX4KWA4KSyXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz4KSu4KSn4KWN4KSv4KWHJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+CkquClguCksOCljeCkteClgCcsXG4gICAgICAgICAgICBzOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIHNzOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIG06IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgaDogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBkOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIE06IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgeTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgpafgpajgpangpargpavgpazgpa3gpa7gpa/gpaZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gpKrgpLngpL7gpJ/gpYd84KS44KSV4KS+4KSz4KWAfOCkpuClgeCkquCkvuCksOClgHzgpLjgpL7gpK/gpILgpJXgpL7gpLPgpYB84KSw4KS+4KSk4KWN4KSw4KWALyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4KSq4KS54KS+4KSf4KWHJyB8fCBtZXJpZGllbSA9PT0gJ+CkuOCkleCkvuCks+ClgCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgpKbgpYHgpKrgpL7gpLDgpYAnIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgpLjgpL7gpK/gpILgpJXgpL7gpLPgpYAnIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgpLDgpL7gpKTgpY3gpLDgpYAnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMiA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA+PSAwICYmIGhvdXIgPCA2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKrgpLngpL7gpJ/gpYcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOCkleCkvuCks+ClgCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KWB4KSq4KS+4KSw4KWAJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpL7gpK/gpILgpJXgpL7gpLPgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOCljeCksOClgCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWxheSBbbXMtbXldXG4vLyEgbm90ZSA6IERFUFJFQ0FURUQsIHRoZSBjb3JyZWN0IG9uZSBpcyBbbXNdXG4vLyEgYXV0aG9yIDogV2VsZGFuIEphbWlsaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS93ZWxkYW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtc015ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbXMtbXknLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcmlfRmVicnVhcmlfTWFjX0FwcmlsX01laV9KdW5fSnVsYWlfT2dvc19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EaXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hY19BcHJfTWVpX0p1bl9KdWxfT2dzX1NlcF9Pa3RfTm92X0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdBaGFkX0lzbmluX1NlbGFzYV9SYWJ1X0toYW1pc19KdW1hYXRfU2FidHUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdBaGRfSXNuX1NlbF9SYWJfS2hhX0p1bV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnQWhfSXNfU2xfUmJfS21fSm1fU2InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hILm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9wYWdpfHRlbmdhaGFyaXxwZXRhbmd8bWFsYW0vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdwYWdpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3RlbmdhaGFyaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAncGV0YW5nJyB8fCBtZXJpZGllbSA9PT0gJ21hbGFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdwYWdpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAndGVuZ2FoYXJpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGV0YW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdtYWxhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hhcmkgaW5pIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0Vzb2sgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS2VsbWFyaW4gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbbGVwYXMgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFsYW0gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHlhbmcgbGVwYXMnLFxuICAgICAgICAgICAgczogJ2JlYmVyYXBhIHNhYXQnLFxuICAgICAgICAgICAgc3M6ICclZCBzYWF0JyxcbiAgICAgICAgICAgIG06ICdzZW1pbml0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWluaXQnLFxuICAgICAgICAgICAgaDogJ3NlamFtJyxcbiAgICAgICAgICAgIGhoOiAnJWQgamFtJyxcbiAgICAgICAgICAgIGQ6ICdzZWhhcmknLFxuICAgICAgICAgICAgZGQ6ICclZCBoYXJpJyxcbiAgICAgICAgICAgIE06ICdzZWJ1bGFuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgYnVsYW4nLFxuICAgICAgICAgICAgeTogJ3NldGFodW4nLFxuICAgICAgICAgICAgeXk6ICclZCB0YWh1bicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtc015O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hbGF5IFttc11cbi8vISBhdXRob3IgOiBXZWxkYW4gSmFtaWxpIDogaHR0cHM6Ly9naXRodWIuY29tL3dlbGRhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1zID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbXMnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcmlfRmVicnVhcmlfTWFjX0FwcmlsX01laV9KdW5fSnVsYWlfT2dvc19TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EaXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hY19BcHJfTWVpX0p1bl9KdWxfT2dzX1NlcF9Pa3RfTm92X0Rpcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdBaGFkX0lzbmluX1NlbGFzYV9SYWJ1X0toYW1pc19KdW1hYXRfU2FidHUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdBaGRfSXNuX1NlbF9SYWJfS2hhX0p1bV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnQWhfSXNfU2xfUmJfS21fSm1fU2InLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hILm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9wYWdpfHRlbmdhaGFyaXxwZXRhbmd8bWFsYW0vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdwYWdpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3RlbmdhaGFyaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAncGV0YW5nJyB8fCBtZXJpZGllbSA9PT0gJ21hbGFtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdwYWdpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAndGVuZ2FoYXJpJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGV0YW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdtYWxhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hhcmkgaW5pIHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0Vzb2sgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS2VsbWFyaW4gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbbGVwYXMgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFsYW0gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHlhbmcgbGVwYXMnLFxuICAgICAgICAgICAgczogJ2JlYmVyYXBhIHNhYXQnLFxuICAgICAgICAgICAgc3M6ICclZCBzYWF0JyxcbiAgICAgICAgICAgIG06ICdzZW1pbml0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWluaXQnLFxuICAgICAgICAgICAgaDogJ3NlamFtJyxcbiAgICAgICAgICAgIGhoOiAnJWQgamFtJyxcbiAgICAgICAgICAgIGQ6ICdzZWhhcmknLFxuICAgICAgICAgICAgZGQ6ICclZCBoYXJpJyxcbiAgICAgICAgICAgIE06ICdzZWJ1bGFuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgYnVsYW4nLFxuICAgICAgICAgICAgeTogJ3NldGFodW4nLFxuICAgICAgICAgICAgeXk6ICclZCB0YWh1bicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBNYWx0ZXNlIChNYWx0YSkgW210XVxuLy8hIGF1dGhvciA6IEFsZXNzYW5kcm8gTWFydWNjaWEgOiBodHRwczovL2dpdGh1Yi5jb20vYWxlc21hXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtdCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFubmFyX0ZyYXJfTWFyenVfQXByaWxfTWVqanVfxKB1bmp1X0x1bGp1X0F3d2lzc3VfU2V0dGVtYnJ1X090dHVicnVfTm92ZW1icnVfRGnEi2VtYnJ1Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GcmFfTWFyX0Fwcl9NZWpfxKB1bl9MdWxfQXd3X1NldF9PdHRfTm92X0RpxIsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ0lsLcSmYWRkX0l0LVRuZWpuX0l0LVRsaWV0YV9MLUVyYmfEp2FfSWwtxKZhbWlzX0lsLcSgaW1nxKdhX0lzLVNpYnQnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ8SmYWRfVG5lX1RsaV9FcmJfxKZhbV/EoGltX1NpYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfEpmFfVG5fVGxfRXJfxKZhX8SgaV9TaScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tJbGx1bSBmaWwtXUxUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbR8SnYWRhIGZpbC1dTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtmaWwtXUxUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSWwtYmllcmHEpyBmaWwtXUxUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbbGkgZ8SnYWRkYV0gW2ZpbC1dTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdm4oCZICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBpbHUnLFxuICAgICAgICAgICAgczogJ2Z0aXQgc2Vrb25kaScsXG4gICAgICAgICAgICBzczogJyVkIHNla29uZGknLFxuICAgICAgICAgICAgbTogJ21pbnV0YScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0aScsXG4gICAgICAgICAgICBoOiAnc2llZ8SnYScsXG4gICAgICAgICAgICBoaDogJyVkIHNpZWfEp2F0JyxcbiAgICAgICAgICAgIGQ6ICfEoXVybmF0YScsXG4gICAgICAgICAgICBkZDogJyVkIMShcmFuZXQnLFxuICAgICAgICAgICAgTTogJ3hhaGFyJyxcbiAgICAgICAgICAgIE1NOiAnJWQgeGh1cicsXG4gICAgICAgICAgICB5OiAnc2VuYScsXG4gICAgICAgICAgICB5eTogJyVkIHNuaScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbXQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQnVybWVzZSBbbXldXG4vLyEgYXV0aG9yIDogU3F1YXIgdGVhbSwgbXlzcXVhci5jb21cbi8vISBhdXRob3IgOiBEYXZpZCBSb3NzZWxsYXQgOiBodHRwczovL2dpdGh1Yi5jb20vZ2hvbGFkclxuLy8hIGF1dGhvciA6IFRpbiBBdW5nIExpbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS90aGFueWF3emlubWluXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+GBgScsXG4gICAgICAgICAgICAyOiAn4YGCJyxcbiAgICAgICAgICAgIDM6ICfhgYMnLFxuICAgICAgICAgICAgNDogJ+GBhCcsXG4gICAgICAgICAgICA1OiAn4YGFJyxcbiAgICAgICAgICAgIDY6ICfhgYYnLFxuICAgICAgICAgICAgNzogJ+GBhycsXG4gICAgICAgICAgICA4OiAn4YGIJyxcbiAgICAgICAgICAgIDk6ICfhgYknLFxuICAgICAgICAgICAgMDogJ+GBgCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfhgYEnOiAnMScsXG4gICAgICAgICAgICAn4YGCJzogJzInLFxuICAgICAgICAgICAgJ+GBgyc6ICczJyxcbiAgICAgICAgICAgICfhgYQnOiAnNCcsXG4gICAgICAgICAgICAn4YGFJzogJzUnLFxuICAgICAgICAgICAgJ+GBhic6ICc2JyxcbiAgICAgICAgICAgICfhgYcnOiAnNycsXG4gICAgICAgICAgICAn4YGIJzogJzgnLFxuICAgICAgICAgICAgJ+GBiSc6ICc5JyxcbiAgICAgICAgICAgICfhgYAnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgbXkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdteScsIHtcbiAgICAgICAgbW9udGhzOiAn4YCH4YCU4YC64YCU4YCd4YCr4YCb4YCuX+GAluGAseGAluGAseGArOGAuuGAneGAq+GAm+GArl/hgJnhgJDhgLpf4YCn4YCV4YC84YCuX+GAmeGAsV/hgIfhgL3hgJThgLpf4YCH4YCw4YCc4YCt4YCv4YCE4YC6X+GAnuGAvOGAguGAr+GAkOGAul/hgIXhgIDhgLrhgJDhgIThgLrhgJjhgKxf4YCh4YCx4YCs4YCA4YC64YCQ4YCt4YCv4YCY4YCsX+GAlOGAreGAr+GAneGAhOGAuuGAmOGArF/hgJLhgK7hgIfhgIThgLrhgJjhgKwnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn4YCH4YCU4YC6X+GAluGAsV/hgJnhgJDhgLpf4YCV4YC84YCuX+GAmeGAsV/hgIfhgL3hgJThgLpf4YCc4YCt4YCv4YCE4YC6X+GAnuGAvF/hgIXhgIDhgLpf4YCh4YCx4YCs4YCA4YC6X+GAlOGAreGAr1/hgJLhgK4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn4YCQ4YCU4YCE4YC64YC54YCC4YCU4YC94YCxX+GAkOGAlOGAhOGAuuGAueGAnOGArF/hgKHhgIThgLrhgLnhgILhgKtf4YCX4YCv4YCS4YC54YCT4YCf4YCw4YC4X+GAgOGAvOGArOGAnuGAleGAkOGAseGAuF/hgJ7hgLHhgKzhgIDhgLzhgKxf4YCF4YCU4YCxJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4YCU4YC94YCxX+GAnOGArF/hgILhgKtf4YCf4YCw4YC4X+GAgOGAvOGArF/hgJ7hgLHhgKxf4YCU4YCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+GAlOGAveGAsV/hgJzhgKxf4YCC4YCrX+GAn+GAsOGAuF/hgIDhgLzhgKxf4YCe4YCx4YCsX+GAlOGAsScuc3BsaXQoJ18nKSxcblxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4YCa4YCU4YCxLl0gTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1vhgJnhgJThgIDhgLrhgJbhgLzhgJThgLpdIExUIFvhgJnhgL7hgKxdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+GAmeGAlOGAsS7hgIBdIExUIFvhgJnhgL7hgKxdJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+GAleGAvOGAruGAuOGAgeGAsuGAt+GAnuGAseGArF0gZGRkZCBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ+GAnOGArOGAmeGAiuGAuuGAtyAlcyDhgJnhgL7hgKwnLFxuICAgICAgICAgICAgcGFzdDogJ+GAnOGAveGAlOGAuuGAgeGAsuGAt+GAnuGAseGArCAlcyDhgIAnLFxuICAgICAgICAgICAgczogJ+GAheGAgOGAueGAgOGAlOGAui7hgKHhgJThgIrhgLrhgLjhgIThgJrhgLonLFxuICAgICAgICAgICAgc3M6ICclZCDhgIXhgIDhgLnhgIDhgJThgLfhgLonLFxuICAgICAgICAgICAgbTogJ+GAkOGAheGAuuGAmeGAreGAlOGAheGAuicsXG4gICAgICAgICAgICBtbTogJyVkIOGAmeGAreGAlOGAheGAuicsXG4gICAgICAgICAgICBoOiAn4YCQ4YCF4YC64YCU4YCs4YCb4YCuJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4YCU4YCs4YCb4YCuJyxcbiAgICAgICAgICAgIGQ6ICfhgJDhgIXhgLrhgJvhgIDhgLonLFxuICAgICAgICAgICAgZGQ6ICclZCDhgJvhgIDhgLonLFxuICAgICAgICAgICAgTTogJ+GAkOGAheGAuuGAnCcsXG4gICAgICAgICAgICBNTTogJyVkIOGAnCcsXG4gICAgICAgICAgICB5OiAn4YCQ4YCF4YC64YCU4YC+4YCF4YC6JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4YCU4YC+4YCF4YC6JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+GBgeGBguGBg+GBhOGBheGBhuGBh+GBiOGBieGBgF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG15O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE5vcndlZ2lhbiBCb2ttw6VsIFtuYl1cbi8vISBhdXRob3JzIDogRXNwZW4gSG92bGFuZHNkYWwgOiBodHRwczovL2dpdGh1Yi5jb20vcmV4eGFyc1xuLy8hICAgICAgICAgICBTaWd1cmQgR2FydG1hbm4gOiBodHRwczovL2dpdGh1Yi5jb20vc2lndXJkZ2Fcbi8vISAgICAgICAgICAgU3RlcGhlbiBSYW10aHVuIDogaHR0cHM6Ly9naXRodWIuY29tL3N0ZXBoZW5yYW10aHVuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbmIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCduYicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFyc19hcHJpbF9tYWlfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hcnNfYXByLl9tYWlfanVuaV9qdWxpX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdzw7huZGFnX21hbmRhZ190aXJzZGFnX29uc2RhZ190b3JzZGFnX2ZyZWRhZ19sw7hyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc8O4Ll9tYS5fdGkuX29uLl90by5fZnIuX2zDuC4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc8O4X21hX3RpX29uX3RvX2ZyX2zDuCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaSBkYWcga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2kgbW9yZ2VuIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaSBnw6VyIGtsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZm9ycmlnZV0gZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ29tICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBzaWRlbicsXG4gICAgICAgICAgICBzOiAnbm9lbiBzZWt1bmRlcicsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZGVyJyxcbiAgICAgICAgICAgIG06ICdldHQgbWludXR0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXR0ZXInLFxuICAgICAgICAgICAgaDogJ8OpbiB0aW1lJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGltZXInLFxuICAgICAgICAgICAgZDogJ8OpbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdlcicsXG4gICAgICAgICAgICB3OiAnw6luIHVrZScsXG4gICAgICAgICAgICB3dzogJyVkIHVrZXInLFxuICAgICAgICAgICAgTTogJ8OpbiBtw6VuZWQnLFxuICAgICAgICAgICAgTU06ICclZCBtw6VuZWRlcicsXG4gICAgICAgICAgICB5OiAnZXR0IMOlcicsXG4gICAgICAgICAgICB5eTogJyVkIMOlcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTmVwYWxlc2UgW25lXVxuLy8hIGF1dGhvciA6IHN1dmFzaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdXZhc2hcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KWnJyxcbiAgICAgICAgICAgIDI6ICfgpagnLFxuICAgICAgICAgICAgMzogJ+ClqScsXG4gICAgICAgICAgICA0OiAn4KWqJyxcbiAgICAgICAgICAgIDU6ICfgpasnLFxuICAgICAgICAgICAgNjogJ+ClrCcsXG4gICAgICAgICAgICA3OiAn4KWtJyxcbiAgICAgICAgICAgIDg6ICfgpa4nLFxuICAgICAgICAgICAgOTogJ+ClrycsXG4gICAgICAgICAgICAwOiAn4KWmJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Clpyc6ICcxJyxcbiAgICAgICAgICAgICfgpagnOiAnMicsXG4gICAgICAgICAgICAn4KWpJzogJzMnLFxuICAgICAgICAgICAgJ+Clqic6ICc0JyxcbiAgICAgICAgICAgICfgpasnOiAnNScsXG4gICAgICAgICAgICAn4KWsJzogJzYnLFxuICAgICAgICAgICAgJ+ClrSc6ICc3JyxcbiAgICAgICAgICAgICfgpa4nOiAnOCcsXG4gICAgICAgICAgICAn4KWvJzogJzknLFxuICAgICAgICAgICAgJ+Clpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBuZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ25lJywge1xuICAgICAgICBtb250aHM6ICfgpJzgpKjgpLXgpLDgpYBf4KSr4KWH4KSs4KWN4KSw4KWB4KS14KSw4KWAX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpL/gpLJf4KSu4KSIX+CknOClgeCkqF/gpJzgpYHgpLLgpL7gpIhf4KSF4KSX4KS34KWN4KSfX+CkuOClh+CkquCljeCkn+Clh+CkruCljeCkrOCksF/gpIXgpJXgpY3gpJ/gpYvgpKzgpLBf4KSo4KWL4KSt4KWH4KSu4KWN4KSs4KSwX+CkoeCkv+CkuOClh+CkruCljeCkrOCksCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4KSc4KSoLl/gpKvgpYfgpKzgpY3gpLDgpYEuX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpL8uX+CkruCkiF/gpJzgpYHgpKhf4KSc4KWB4KSy4KS+4KSILl/gpIXgpJcuX+CkuOClh+CkquCljeCkny5f4KSF4KSV4KWN4KSf4KWLLl/gpKjgpYvgpK3gpYcuX+CkoeCkv+CkuOClhy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfgpIbgpIfgpKTgpKzgpL7gpLBf4KS44KWL4KSu4KSs4KS+4KSwX+CkruCkmeCljeCkl+CksuCkrOCkvuCksF/gpKzgpYHgpKfgpKzgpL7gpLBf4KSs4KS/4KS54KS/4KSs4KS+4KSwX+CktuClgeCkleCljeCksOCkrOCkvuCksF/gpLbgpKjgpL/gpKzgpL7gpLAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgpIbgpIfgpKQuX+CkuOCli+Ckri5f4KSu4KSZ4KWN4KSX4KSyLl/gpKzgpYHgpKcuX+CkrOCkv+CkueCkvy5f4KS24KWB4KSV4KWN4KSwLl/gpLbgpKjgpL8uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+Ckhi5f4KS44KWLLl/gpK7gpIIuX+CkrOClgS5f4KSs4KS/Ll/gpLbgpYEuX+Ckti4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQeCkleCliyBoOm1tIOCkrOCknOClhycsXG4gICAgICAgICAgICBMVFM6ICdB4KSV4KWLIGg6bW06c3Mg4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEHgpJXgpYsgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBB4KSV4KWLIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Clp+ClqOClqeClquClq+ClrOClreClruClr+Clpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CksOCkvuCkpOCkv3zgpKzgpL/gpLngpL7gpKh84KSm4KS/4KSJ4KSB4KS44KWLfOCkuOCkvuCkgeCknS8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CksOCkvuCkpOCkvycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkrOCkv+CkueCkvuCkqCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpKbgpL/gpIngpIHgpLjgpYsnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkvuCkgeCknScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpL8nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkrOCkv+CkueCkvuCkqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KS/4KSJ4KSB4KS44KWLJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpL7gpIHgpJ0nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOCkvyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CkhuCknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpK3gpYvgpLLgpL9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+CkhuCkieCkgeCkpuCli10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CkueCkv+CknOCli10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KSX4KSP4KSV4KWLXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPgpK7gpL4nLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCkheCkl+CkvuCkoeCkvycsXG4gICAgICAgICAgICBzOiAn4KSV4KWH4KS54KWAIOCkleCljeCkt+CkoycsXG4gICAgICAgICAgICBzczogJyVkIOCkuOClh+CkleClh+Cko+CljeCkoScsXG4gICAgICAgICAgICBtOiAn4KSP4KSVIOCkruCkv+CkqOClh+CknycsXG4gICAgICAgICAgICBtbTogJyVkIOCkruCkv+CkqOClh+CknycsXG4gICAgICAgICAgICBoOiAn4KSP4KSVIOCkmOCko+CljeCkn+CkvicsXG4gICAgICAgICAgICBoaDogJyVkIOCkmOCko+CljeCkn+CkvicsXG4gICAgICAgICAgICBkOiAn4KSP4KSVIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBNOiAn4KSP4KSVIOCkruCkueCkv+CkqOCkvicsXG4gICAgICAgICAgICBNTTogJyVkIOCkruCkueCkv+CkqOCkvicsXG4gICAgICAgICAgICB5OiAn4KSP4KSVIOCkrOCksOCljeCktycsXG4gICAgICAgICAgICB5eTogJyVkIOCkrOCksOCljeCktycsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBEdXRjaCAoQmVsZ2l1bSkgW25sLWJlXVxuLy8hIGF1dGhvciA6IEpvcmlzIFLDtmxpbmcgOiBodHRwczovL2dpdGh1Yi5jb20vam9yaXNyb2xpbmdcbi8vISBhdXRob3IgOiBKYWNvYiBNaWRkYWcgOiBodHRwczovL2dpdGh1Yi5jb20vbWlkZGFnalxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0V2l0aERvdHMgPVxuICAgICAgICAgICAgJ2phbi5fZmViLl9tcnQuX2Fwci5fbWVpX2p1bi5fanVsLl9hdWcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0V2l0aG91dERvdHMgPVxuICAgICAgICAgICAgJ2phbl9mZWJfbXJ0X2Fwcl9tZWlfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eamFuL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL14obWFhcnR8bXJ0XFwuPykkL2ksXG4gICAgICAgICAgICAvXmFwci9pLFxuICAgICAgICAgICAgL15tZWkkL2ksXG4gICAgICAgICAgICAvXmp1bltpLl0/JC9pLFxuICAgICAgICAgICAgL15qdWxbaS5dPyQvaSxcbiAgICAgICAgICAgIC9eYXVnL2ksXG4gICAgICAgICAgICAvXnNlcC9pLFxuICAgICAgICAgICAgL15va3QvaSxcbiAgICAgICAgICAgIC9ebm92L2ksXG4gICAgICAgICAgICAvXmRlYy9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihqYW51YXJpfGZlYnJ1YXJpfG1hYXJ0fGFwcmlsfG1laXxqdVtubF1pfGF1Z3VzdHVzfHNlcHRlbWJlcnxva3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyfGphblxcLj98ZmViXFwuP3xtcnRcXC4/fGFwclxcLj98anVbbmxdXFwuP3xhdWdcXC4/fHNlcFxcLj98b2t0XFwuP3xub3ZcXC4/fGRlY1xcLj8pL2k7XG5cbiAgICB2YXIgbmxCZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ25sLWJlJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJpX2ZlYnJ1YXJpX21hYXJ0X2FwcmlsX21laV9qdW5pX2p1bGlfYXVndXN0dXNfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90cztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRob3V0RG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRXaXRoRG90c1ttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oamFudWFyaXxmZWJydWFyaXxtYWFydHxhcHJpbHxtZWl8anVbbmxdaXxhdWd1c3R1c3xzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcikvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGphblxcLj98ZmViXFwuP3xtcnRcXC4/fGFwclxcLj98bWVpfGp1W25sXVxcLj98YXVnXFwuP3xzZXBcXC4/fG9rdFxcLj98bm92XFwuP3xkZWNcXC4/KS9pLFxuXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG5cbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnem9uZGFnX21hYW5kYWdfZGluc2RhZ193b2Vuc2RhZ19kb25kZXJkYWdfdnJpamRhZ196YXRlcmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3pvLl9tYS5fZGkuX3dvLl9kby5fdnIuX3phLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICd6b19tYV9kaV93b19kb192cl96YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbdmFuZGFhZyBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb3JnZW4gb21dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZ2lzdGVyZW4gb21dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2FmZ2Vsb3Blbl0gZGRkZCBbb21dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb3ZlciAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgZ2VsZWRlbicsXG4gICAgICAgICAgICBzOiAnZWVuIHBhYXIgc2Vjb25kZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRlbicsXG4gICAgICAgICAgICBtOiAnw6nDqW4gbWludXV0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlbicsXG4gICAgICAgICAgICBoOiAnw6nDqW4gdXVyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdXVyJyxcbiAgICAgICAgICAgIGQ6ICfDqcOpbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdlbicsXG4gICAgICAgICAgICBNOiAnw6nDqW4gbWFhbmQnLFxuICAgICAgICAgICAgTU06ICclZCBtYWFuZGVuJyxcbiAgICAgICAgICAgIHk6ICfDqcOpbiBqYWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgamFhcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdGV8ZGUpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBudW1iZXIgK1xuICAgICAgICAgICAgICAgIChudW1iZXIgPT09IDEgfHwgbnVtYmVyID09PSA4IHx8IG51bWJlciA+PSAyMCA/ICdzdGUnIDogJ2RlJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBubEJlO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IER1dGNoIFtubF1cbi8vISBhdXRob3IgOiBKb3JpcyBSw7ZsaW5nIDogaHR0cHM6Ly9naXRodWIuY29tL2pvcmlzcm9saW5nXG4vLyEgYXV0aG9yIDogSmFjb2IgTWlkZGFnIDogaHR0cHM6Ly9naXRodWIuY29tL21pZGRhZ2pcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTaG9ydFdpdGhEb3RzID1cbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbXJ0Ll9hcHIuX21laV9qdW4uX2p1bC5fYXVnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNTaG9ydFdpdGhvdXREb3RzID1cbiAgICAgICAgICAgICdqYW5fZmViX21ydF9hcHJfbWVpX2p1bl9qdWxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmphbi9pLFxuICAgICAgICAgICAgL15mZWIvaSxcbiAgICAgICAgICAgIC9eKG1hYXJ0fG1ydFxcLj8pJC9pLFxuICAgICAgICAgICAgL15hcHIvaSxcbiAgICAgICAgICAgIC9ebWVpJC9pLFxuICAgICAgICAgICAgL15qdW5baS5dPyQvaSxcbiAgICAgICAgICAgIC9eanVsW2kuXT8kL2ksXG4gICAgICAgICAgICAvXmF1Zy9pLFxuICAgICAgICAgICAgL15zZXAvaSxcbiAgICAgICAgICAgIC9eb2t0L2ksXG4gICAgICAgICAgICAvXm5vdi9pLFxuICAgICAgICAgICAgL15kZWMvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oamFudWFyaXxmZWJydWFyaXxtYWFydHxhcHJpbHxtZWl8anVbbmxdaXxhdWd1c3R1c3xzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcnxqYW5cXC4/fGZlYlxcLj98bXJ0XFwuP3xhcHJcXC4/fGp1W25sXVxcLj98YXVnXFwuP3xzZXBcXC4/fG9rdFxcLj98bm92XFwuP3xkZWNcXC4/KS9pO1xuXG4gICAgdmFyIG5sID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbmwnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcmlfZmVicnVhcmlfbWFhcnRfYXByaWxfbWVpX2p1bmlfanVsaV9hdWd1c3R1c19zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGZ1bmN0aW9uIChtLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhEb3RzO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhvdXREb3RzW20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhEb3RzW20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihqYW51YXJpfGZlYnJ1YXJpfG1hYXJ0fGFwcmlsfG1laXxqdVtubF1pfGF1Z3VzdHVzfHNlcHRlbWJlcnxva3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oamFuXFwuP3xmZWJcXC4/fG1ydFxcLj98YXByXFwuP3xtZWl8anVbbmxdXFwuP3xhdWdcXC4/fHNlcFxcLj98b2t0XFwuP3xub3ZcXC4/fGRlY1xcLj8pL2ksXG5cbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcblxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICd6b25kYWdfbWFhbmRhZ19kaW5zZGFnX3dvZW5zZGFnX2RvbmRlcmRhZ192cmlqZGFnX3phdGVyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnem8uX21hLl9kaS5fd28uX2RvLl92ci5femEuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3pvX21hX2RpX3dvX2RvX3ZyX3phJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC1NTS1ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1t2YW5kYWFnIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vcmdlbiBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tnaXN0ZXJlbiBvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbYWZnZWxvcGVuXSBkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvdmVyICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBnZWxlZGVuJyxcbiAgICAgICAgICAgIHM6ICdlZW4gcGFhciBzZWNvbmRlbicsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGVuJyxcbiAgICAgICAgICAgIG06ICfDqcOpbiBtaW51dXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVuJyxcbiAgICAgICAgICAgIGg6ICfDqcOpbiB1dXInLFxuICAgICAgICAgICAgaGg6ICclZCB1dXInLFxuICAgICAgICAgICAgZDogJ8Opw6luIGRhZycsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2VuJyxcbiAgICAgICAgICAgIHc6ICfDqcOpbiB3ZWVrJyxcbiAgICAgICAgICAgIHd3OiAnJWQgd2VrZW4nLFxuICAgICAgICAgICAgTTogJ8Opw6luIG1hYW5kJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWFhbmRlbicsXG4gICAgICAgICAgICB5OiAnw6nDqW4gamFhcicsXG4gICAgICAgICAgICB5eTogJyVkIGphYXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3RlfGRlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICtcbiAgICAgICAgICAgICAgICAobnVtYmVyID09PSAxIHx8IG51bWJlciA9PT0gOCB8fCBudW1iZXIgPj0gMjAgPyAnc3RlJyA6ICdkZScpXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTnlub3JzayBbbm5dXG4vLyEgYXV0aG9ycyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZWNodXdpbmRcbi8vISAgICAgICAgICAgU3RlcGhlbiBSYW10aHVuIDogaHR0cHM6Ly9naXRodWIuY29tL3N0ZXBoZW5yYW10aHVuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbm4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdubicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFyc19hcHJpbF9tYWlfanVuaV9qdWxpX2F1Z3VzdF9zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZXNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFuLl9mZWIuX21hcnNfYXByLl9tYWlfanVuaV9qdWxpX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdzdW5kYWdfbcOlbmRhZ190eXNkYWdfb25zZGFnX3RvcnNkYWdfZnJlZGFnX2xhdXJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzdS5fbcOlLl90eS5fb24uX3RvLl9mci5fbGF1Licuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzdV9tw6VfdHlfb25fdG9fZnJfbGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIFtrbC5dIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSBZWVlZIFtrbC5dIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSSBkYWcga2xva2thXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0kgbW9yZ29uIGtsb2trYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSSBnw6VyIGtsb2trYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbRsO4cmVnw6VhbmRlXSBkZGRkIFtrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb20gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHNpZGFuJyxcbiAgICAgICAgICAgIHM6ICdub2tyZSBzZWt1bmQnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmQnLFxuICAgICAgICAgICAgbTogJ2VpdCBtaW51dHQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHQnLFxuICAgICAgICAgICAgaDogJ2VpbiB0aW1lJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGltYXInLFxuICAgICAgICAgICAgZDogJ2VpbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdhcicsXG4gICAgICAgICAgICB3OiAnZWkgdmVrZScsXG4gICAgICAgICAgICB3dzogJyVkIHZla2VyJyxcbiAgICAgICAgICAgIE06ICdlaW4gbcOlbmFkJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOlbmFkZXInLFxuICAgICAgICAgICAgeTogJ2VpdCDDpXInLFxuICAgICAgICAgICAgeXk6ICclZCDDpXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5uO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE9jY2l0YW4sIGxlbmdhZG9jaWFuIGRpYWxlY3RlIFtvYy1sbmNdXG4vLyEgYXV0aG9yIDogUXVlbnRpbiBQQUfDiFMgOiBodHRwczovL2dpdGh1Yi5jb20vUXVlbnR5MzFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBvY0xuYyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ29jLWxuYycsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdnZW5pw6hyX2ZlYnJpw6hyX21hcsOnX2FicmlsX21haV9qdW5oX2p1bGhldF9hZ29zdF9zZXRlbWJyZV9vY3TDsmJyZV9ub3ZlbWJyZV9kZWNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6IFwiZGUgZ2VuacOocl9kZSBmZWJyacOocl9kZSBtYXLDp19kJ2FicmlsX2RlIG1haV9kZSBqdW5oX2RlIGp1bGhldF9kJ2Fnb3N0X2RlIHNldGVtYnJlX2Qnb2N0w7JicmVfZGUgbm92ZW1icmVfZGUgZGVjZW1icmVcIi5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL0Rbb0RdPyhcXHMpK01NTU0vLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdnZW4uX2ZlYnIuX21hcsOnX2Fici5fbWFpX2p1bmhfanVsaC5fYWdvLl9zZXQuX29jdC5fbm92Ll9kZWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnZGltZW5nZV9kaWx1bnNfZGltYXJzX2RpbcOoY3Jlc19kaWrDsnVzX2RpdmVuZHJlc19kaXNzYWJ0ZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RnLl9kbC5fZG0uX2RjLl9kai5fZHYuX2RzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkZ19kbF9kbV9kY19kal9kdl9kcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIGxsOiAnRCBNTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gW2RlXSBZWVlZIFthXSBIOm1tJyxcbiAgICAgICAgICAgIGxsbDogJ0QgTU1NIFlZWVksIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFtkZV0gWVlZWSBbYV0gSDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkIEQgTU1NIFlZWVksIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1t1w6hpIGFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbZGVtYW4gYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2nDqHIgYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtwYXNzYXQgYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IFwiZCdhcXXDrSAlc1wiLFxuICAgICAgICAgICAgcGFzdDogJ2ZhICVzJyxcbiAgICAgICAgICAgIHM6ICd1bmFzIHNlZ29uZGFzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vnb25kYXMnLFxuICAgICAgICAgICAgbTogJ3VuYSBtaW51dGEnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGFzJyxcbiAgICAgICAgICAgIGg6ICd1bmEgb3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgb3JhcycsXG4gICAgICAgICAgICBkOiAndW4gam9ybicsXG4gICAgICAgICAgICBkZDogJyVkIGpvcm5zJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYW4nLFxuICAgICAgICAgICAgeXk6ICclZCBhbnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0ocnxufHR8w6h8YSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPVxuICAgICAgICAgICAgICAgIG51bWJlciA9PT0gMVxuICAgICAgICAgICAgICAgICAgICA/ICdyJ1xuICAgICAgICAgICAgICAgICAgICA6IG51bWJlciA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgID8gJ24nXG4gICAgICAgICAgICAgICAgICAgICAgOiBudW1iZXIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3InXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bWJlciA9PT0gNFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICd0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICfDqCc7XG4gICAgICAgICAgICBpZiAocGVyaW9kID09PSAndycgfHwgcGVyaW9kID09PSAnVycpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAnYSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9jTG5jO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFB1bmphYmkgKEluZGlhKSBbcGEtaW5dXG4vLyEgYXV0aG9yIDogSGFycHJlZXQgU2luZ2ggOiBodHRwczovL2dpdGh1Yi5jb20vaGFycHJlZXRraGFsc2FndGJpdFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgqacnLFxuICAgICAgICAgICAgMjogJ+CpqCcsXG4gICAgICAgICAgICAzOiAn4KmpJyxcbiAgICAgICAgICAgIDQ6ICfgqaonLFxuICAgICAgICAgICAgNTogJ+CpqycsXG4gICAgICAgICAgICA2OiAn4KmsJyxcbiAgICAgICAgICAgIDc6ICfgqa0nLFxuICAgICAgICAgICAgODogJ+CpricsXG4gICAgICAgICAgICA5OiAn4KmvJyxcbiAgICAgICAgICAgIDA6ICfgqaYnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KmnJzogJzEnLFxuICAgICAgICAgICAgJ+CpqCc6ICcyJyxcbiAgICAgICAgICAgICfgqaknOiAnMycsXG4gICAgICAgICAgICAn4KmqJzogJzQnLFxuICAgICAgICAgICAgJ+Cpqyc6ICc1JyxcbiAgICAgICAgICAgICfgqawnOiAnNicsXG4gICAgICAgICAgICAn4KmtJzogJzcnLFxuICAgICAgICAgICAgJ+Cpric6ICc4JyxcbiAgICAgICAgICAgICfgqa8nOiAnOScsXG4gICAgICAgICAgICAn4KmmJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIHBhSW4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdwYS1pbicsIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIG1vbnRocyBuYW1lIGFzIHBlciBOYW5ha3NoYWhpIENhbGVuZGFyIGJ1dCB0aGV5IGFyZSBub3QgdXNlZCBhcyByaWdpZGx5IGluIG1vZGVybiBQdW5qYWJpLlxuICAgICAgICBtb250aHM6ICfgqJzgqKjgqLXgqLDgqYBf4Kir4Ki84Kiw4Ki14Kiw4KmAX+CoruCovuCosOComl/gqIXgqKrgqY3gqLDgqYjgqLJf4Kiu4KiIX+ConOCpguCoqF/gqJzgqYHgqLLgqL7gqIhf4KiF4KiX4Ki44KikX+CouOCopOCpsOCorOCosF/gqIXgqJXgqKTgqYLgqKzgqLBf4Kio4Ki14Kmw4Kis4KiwX+CopuCouOCpsOCorOCosCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4Kic4Kio4Ki14Kiw4KmAX+Coq+CovOCosOCoteCosOCpgF/gqK7gqL7gqLDgqJpf4KiF4Kiq4KmN4Kiw4KmI4KiyX+CoruCoiF/gqJzgqYLgqKhf4Kic4KmB4Kiy4Ki+4KiIX+CoheCol+CouOCopF/gqLjgqKTgqbDgqKzgqLBf4KiF4KiV4Kik4KmC4Kis4KiwX+CoqOCoteCpsOCorOCosF/gqKbgqLjgqbDgqKzgqLAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfgqJDgqKTgqLXgqL7gqLBf4Ki44KmL4Kiu4Ki14Ki+4KiwX+CoruCpsOCol+CosuCoteCovuCosF/gqKzgqYHgqKfgqLXgqL7gqLBf4Ki14KmA4Kiw4Ki14Ki+4KiwX+CouOCovOCpgeCpseColeCosOCoteCovuCosF/gqLjgqLzgqKjgqYDgqJrgqLDgqLXgqL7gqLAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgqJDgqKRf4Ki44KmL4KiuX+CoruCpsOCol+Cosl/gqKzgqYHgqKdf4Ki14KmA4KiwX+CouOCovOCpgeColeCosF/gqLjgqLzgqKjgqYAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4KiQ4KikX+CouOCpi+Corl/gqK7gqbDgqJfgqLJf4Kis4KmB4KinX+CoteCpgOCosF/gqLjgqLzgqYHgqJXgqLBf4Ki44Ki84Kio4KmAJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0g4Ki14Kic4KmHJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyDgqLXgqJzgqYcnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCoteConOCphycsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSDgqLXgqJzgqYcnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgqIXgqJxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KiV4KiyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vgqIXgqJfgqLLgqL5dIGRkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KiV4KiyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgqKrgqL/gqJvgqLLgqYddIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4Ki14Ki/4Kmx4KiaJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgqKrgqL/gqJvgqLLgqYcnLFxuICAgICAgICAgICAgczogJ+ColeCpgeConSDgqLjgqJXgqL/gqbDgqJ8nLFxuICAgICAgICAgICAgc3M6ICclZCDgqLjgqJXgqL/gqbDgqJ8nLFxuICAgICAgICAgICAgbTogJ+Coh+ColSDgqK7gqL/gqbDgqJ8nLFxuICAgICAgICAgICAgbW06ICclZCDgqK7gqL/gqbDgqJ8nLFxuICAgICAgICAgICAgaDogJ+Coh+CpseColSDgqJjgqbDgqJ/gqL4nLFxuICAgICAgICAgICAgaGg6ICclZCDgqJjgqbDgqJ/gqYcnLFxuICAgICAgICAgICAgZDogJ+Coh+CpseColSDgqKbgqL/gqKgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgqKbgqL/gqKgnLFxuICAgICAgICAgICAgTTogJ+Coh+CpseColSDgqK7gqLngqYDgqKjgqL4nLFxuICAgICAgICAgICAgTU06ICclZCDgqK7gqLngqYDgqKjgqYcnLFxuICAgICAgICAgICAgeTogJ+Coh+CpseColSDgqLjgqL7gqLInLFxuICAgICAgICAgICAgeXk6ICclZCDgqLjgqL7gqLInLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4Kmn4Kmo4Kmp4Kmq4Kmr4Kms4Kmt4Kmu4Kmv4KmmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvLyBQdW5qYWJpIG5vdGF0aW9uIGZvciBtZXJpZGllbXMgYXJlIHF1aXRlIGZ1enp5IGluIHByYWN0aWNlLiBXaGlsZSB0aGVyZSBleGlzdHNcbiAgICAgICAgLy8gYSByaWdpZCBub3Rpb24gb2YgYSAnUGFoYXInIGl0IGlzIG5vdCB1c2VkIGFzIHJpZ2lkbHkgaW4gbW9kZXJuIFB1bmphYmkuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gqLDgqL7gqKR84Ki44Ki14KmH4KiwfOCopuCpgeCoquCoueCov+CosHzgqLjgqLzgqL7gqK4vLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgqLDgqL7gqKQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqLjgqLXgqYfgqLAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Kim4KmB4Kiq4Ki54Ki/4KiwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqLjgqLzgqL7gqK4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kiw4Ki+4KikJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqLjgqLXgqYfgqLAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CopuCpgeCoquCoueCov+CosCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Ki44Ki84Ki+4KiuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqLDgqL7gqKQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGFJbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBQb2xpc2ggW3BsXVxuLy8hIGF1dGhvciA6IFJhZmFsIEhpcnN6IDogaHR0cHM6Ly9naXRodWIuY29tL2V2b0xcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNOb21pbmF0aXZlID1cbiAgICAgICAgICAgICdzdHljemXFhF9sdXR5X21hcnplY19rd2llY2llxYRfbWFqX2N6ZXJ3aWVjX2xpcGllY19zaWVycGllxYRfd3J6ZXNpZcWEX3Bhxbpkemllcm5pa19saXN0b3BhZF9ncnVkemllxYQnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU3ViamVjdGl2ZSA9XG4gICAgICAgICAgICAnc3R5Y3puaWFfbHV0ZWdvX21hcmNhX2t3aWV0bmlhX21hamFfY3plcndjYV9saXBjYV9zaWVycG5pYV93cnplxZtuaWFfcGHFumR6aWVybmlrYV9saXN0b3BhZGFfZ3J1ZG5pYScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9ec3R5L2ksXG4gICAgICAgICAgICAvXmx1dC9pLFxuICAgICAgICAgICAgL15tYXIvaSxcbiAgICAgICAgICAgIC9ea3dpL2ksXG4gICAgICAgICAgICAvXm1hai9pLFxuICAgICAgICAgICAgL15jemUvaSxcbiAgICAgICAgICAgIC9ebGlwL2ksXG4gICAgICAgICAgICAvXnNpZS9pLFxuICAgICAgICAgICAgL153cnovaSxcbiAgICAgICAgICAgIC9ecGHFui9pLFxuICAgICAgICAgICAgL15saXMvaSxcbiAgICAgICAgICAgIC9eZ3J1L2ksXG4gICAgICAgIF07XG4gICAgZnVuY3Rpb24gcGx1cmFsKG4pIHtcbiAgICAgICAgcmV0dXJuIG4gJSAxMCA8IDUgJiYgbiAlIDEwID4gMSAmJiB+fihuIC8gMTApICUgMTAgIT09IDE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnc2VrdW5keScgOiAnc2VrdW5kJyk7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdtaW51dGEnIDogJ21pbnV0xJknO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWludXR5JyA6ICdtaW51dCcpO1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnZ29kemluYScgOiAnZ29kemluxJknO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnZ29kemlueScgOiAnZ29kemluJyk7XG4gICAgICAgICAgICBjYXNlICd3dyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICd0eWdvZG5pZScgOiAndHlnb2RuaScpO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWllc2nEhWNlJyA6ICdtaWVzacSZY3knKTtcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2xhdGEnIDogJ2xhdCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHBsID0gbW9tZW50LmRlZmluZUxvY2FsZSgncGwnLCB7XG4gICAgICAgIG1vbnRoczogZnVuY3Rpb24gKG1vbWVudFRvRm9ybWF0LCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbW9tZW50VG9Gb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzTm9taW5hdGl2ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL0QgTU1NTS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1N1YmplY3RpdmVbbW9tZW50VG9Gb3JtYXQubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNOb21pbmF0aXZlW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDogJ3N0eV9sdXRfbWFyX2t3aV9tYWpfY3plX2xpcF9zaWVfd3J6X3BhxbpfbGlzX2dydScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnbmllZHppZWxhX3BvbmllZHppYcWCZWtfd3RvcmVrX8Wbcm9kYV9jendhcnRla19wacSFdGVrX3NvYm90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25kel9wb25fd3RfxZtyX2N6d19wdF9zb2InLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnTmRfUG5fV3RfxZpyX0N6X1B0X1NvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0R6acWbIG9dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbSnV0cm8gb10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyBuaWVkemllbMSZIG9dIExUJztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXZSB3dG9yZWsgb10gTFQnO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgxZtyb2TEmSBvXSBMVCc7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyBzb2JvdMSZIG9dIExUJztcblxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbV10gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1djem9yYWogb10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyB6ZXN6xYLEhSBuaWVkemllbMSZIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyB6ZXN6xYLEhSDFm3JvZMSZIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyB6ZXN6xYLEhSBzb2JvdMSZIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1cgemVzesWCeV0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB0ZW11JyxcbiAgICAgICAgICAgIHM6ICdraWxrYSBzZWt1bmQnLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogJzEgZHppZcWEJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZG5pJyxcbiAgICAgICAgICAgIHc6ICd0eWR6aWXFhCcsXG4gICAgICAgICAgICB3dzogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogJ21pZXNpxIVjJyxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiAncm9rJyxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUG9ydHVndWVzZSAoQnJhemlsKSBbcHQtYnJdXG4vLyEgYXV0aG9yIDogQ2FpbyBSaWJlaXJvIFBlcmVpcmEgOiBodHRwczovL2dpdGh1Yi5jb20vY2Fpby1yaWJlaXJvLXBlcmVpcmFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBwdEJyID0gbW9tZW50LmRlZmluZUxvY2FsZSgncHQtYnInLCB7XG4gICAgICAgIG1vbnRoczogJ2phbmVpcm9fZmV2ZXJlaXJvX21hcsOnb19hYnJpbF9tYWlvX2p1bmhvX2p1bGhvX2Fnb3N0b19zZXRlbWJyb19vdXR1YnJvX25vdmVtYnJvX2RlemVtYnJvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZXZfbWFyX2Ficl9tYWlfanVuX2p1bF9hZ29fc2V0X291dF9ub3ZfZGV6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdkb21pbmdvX3NlZ3VuZGEtZmVpcmFfdGVyw6dhLWZlaXJhX3F1YXJ0YS1mZWlyYV9xdWludGEtZmVpcmFfc2V4dGEtZmVpcmFfc8OhYmFkbycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tX3NlZ190ZXJfcXVhX3F1aV9zZXhfc8OhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb18ywqpfM8KqXzTCql81wqpfNsKqX3PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgW8Ogc10gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBbw6BzXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hvamUgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0FtYW5ow6Mgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8Ogc10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tPbnRlbSDDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgPT09IDAgfHwgdGhpcy5kYXkoKSA9PT0gNlxuICAgICAgICAgICAgICAgICAgICA/ICdbw5psdGltb10gZGRkZCBbw6BzXSBMVCcgLy8gU2F0dXJkYXkgKyBTdW5kYXlcbiAgICAgICAgICAgICAgICAgICAgOiAnW8OabHRpbWFdIGRkZGQgW8Ogc10gTFQnOyAvLyBNb25kYXkgLSBGcmlkYXlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VtICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdow6EgJXMnLFxuICAgICAgICAgICAgczogJ3BvdWNvcyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1bSBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bWEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1bSBkaWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkaWFzJyxcbiAgICAgICAgICAgIE06ICd1bSBtw6pzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VtIGFubycsXG4gICAgICAgICAgICB5eTogJyVkIGFub3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgaW52YWxpZERhdGU6ICdEYXRhIGludsOhbGlkYScsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHRCcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBQb3J0dWd1ZXNlIFtwdF1cbi8vISBhdXRob3IgOiBKZWZmZXJzb24gOiBodHRwczovL2dpdGh1Yi5jb20vamFsZXg3OVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHB0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgncHQnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbmVpcm9fZmV2ZXJlaXJvX21hcsOnb19hYnJpbF9tYWlvX2p1bmhvX2p1bGhvX2Fnb3N0b19zZXRlbWJyb19vdXR1YnJvX25vdmVtYnJvX2RlemVtYnJvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZXZfbWFyX2Ficl9tYWlfanVuX2p1bF9hZ29fc2V0X291dF9ub3ZfZGV6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdEb21pbmdvX1NlZ3VuZGEtZmVpcmFfVGVyw6dhLWZlaXJhX1F1YXJ0YS1mZWlyYV9RdWludGEtZmVpcmFfU2V4dGEtZmVpcmFfU8OhYmFkbycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnRG9tX1NlZ19UZXJfUXVhX1F1aV9TZXhfU8OhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdEb18ywqpfM8KqXzTCql81wqpfNsKqX1PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2RlXSBNTU1NIFtkZV0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hvamUgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0FtYW5ow6Mgw6BzXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8Ogc10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tPbnRlbSDDoHNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgPT09IDAgfHwgdGhpcy5kYXkoKSA9PT0gNlxuICAgICAgICAgICAgICAgICAgICA/ICdbw5psdGltb10gZGRkZCBbw6BzXSBMVCcgLy8gU2F0dXJkYXkgKyBTdW5kYXlcbiAgICAgICAgICAgICAgICAgICAgOiAnW8OabHRpbWFdIGRkZGQgW8Ogc10gTFQnOyAvLyBNb25kYXkgLSBGcmlkYXlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VtICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdow6EgJXMnLFxuICAgICAgICAgICAgczogJ3NlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VtIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VtYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VtIGRpYScsXG4gICAgICAgICAgICBkZDogJyVkIGRpYXMnLFxuICAgICAgICAgICAgdzogJ3VtYSBzZW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZW1hbmFzJyxcbiAgICAgICAgICAgIE06ICd1bSBtw6pzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VtIGFubycsXG4gICAgICAgICAgICB5eTogJyVkIGFub3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHB0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFJvbWFuaWFuIFtyb11cbi8vISBhdXRob3IgOiBWbGFkIEd1cmRpZ2EgOiBodHRwczovL2dpdGh1Yi5jb20vZ3VyZGlnYVxuLy8hIGF1dGhvciA6IFZhbGVudGluIEFnYWNoaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hdmFseVxuLy8hIGF1dGhvciA6IEVtYW51ZWwgQ2Vwb2kgOiBodHRwczovL2dpdGh1Yi5jb20vY2VwZW1cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgICAgICBzczogJ3NlY3VuZGUnLFxuICAgICAgICAgICAgICAgIG1tOiAnbWludXRlJyxcbiAgICAgICAgICAgICAgICBoaDogJ29yZScsXG4gICAgICAgICAgICAgICAgZGQ6ICd6aWxlJyxcbiAgICAgICAgICAgICAgICB3dzogJ3PEg3B0xINtw6JuaScsXG4gICAgICAgICAgICAgICAgTU06ICdsdW5pJyxcbiAgICAgICAgICAgICAgICB5eTogJ2FuaScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VwYXJhdG9yID0gJyAnO1xuICAgICAgICBpZiAobnVtYmVyICUgMTAwID49IDIwIHx8IChudW1iZXIgPj0gMTAwICYmIG51bWJlciAlIDEwMCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9ICcgZGUgJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyICsgc2VwYXJhdG9yICsgZm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIHJvID0gbW9tZW50LmRlZmluZUxvY2FsZSgncm8nLCB7XG4gICAgICAgIG1vbnRoczogJ2lhbnVhcmllX2ZlYnJ1YXJpZV9tYXJ0aWVfYXByaWxpZV9tYWlfaXVuaWVfaXVsaWVfYXVndXN0X3NlcHRlbWJyaWVfb2N0b21icmllX25vaWVtYnJpZV9kZWNlbWJyaWUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2lhbi5fZmViLl9tYXJ0Ll9hcHIuX21haV9pdW4uX2l1bC5fYXVnLl9zZXB0Ll9vY3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2R1bWluaWPEg19sdW5pX21hcsibaV9taWVyY3VyaV9qb2lfdmluZXJpX3PDom1ixIN0xIMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdEdW1fTHVuX01hcl9NaWVfSm9pX1Zpbl9Tw6JtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0R1X0x1X01hX01pX0pvX1ZpX1PDoicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2F6aSBsYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttw6JpbmUgbGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbbGFdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaWVyaSBsYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZm9zdGFdIGRkZGQgW2xhXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3Blc3RlICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDDrm4gdXJtxIMnLFxuICAgICAgICAgICAgczogJ2PDonRldmEgc2VjdW5kZScsXG4gICAgICAgICAgICBzczogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG06ICd1biBtaW51dCcsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGg6ICdvIG9yxIMnLFxuICAgICAgICAgICAgaGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkOiAnbyB6aScsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHc6ICdvIHPEg3B0xINtw6JuxIMnLFxuICAgICAgICAgICAgd3c6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBNOiAnbyBsdW7EgycsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHk6ICd1biBhbicsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFJ1c3NpYW4gW3J1XVxuLy8hIGF1dGhvciA6IFZpa3Rvcm1pbmF0b3IgOiBodHRwczovL2dpdGh1Yi5jb20vVmlrdG9ybWluYXRvclxuLy8hIGF1dGhvciA6IE1lbmVsaW9uIEVsZW5zw7psZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlXG4vLyEgYXV0aG9yIDog0JrQvtGA0LXQvdCx0LXRgNCzINCc0LDRgNC6IDogaHR0cHM6Ly9naXRodWIuY29tL3NvY2tldHBhaXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHBsdXJhbCh3b3JkLCBudW0pIHtcbiAgICAgICAgdmFyIGZvcm1zID0gd29yZC5zcGxpdCgnXycpO1xuICAgICAgICByZXR1cm4gbnVtICUgMTAgPT09IDEgJiYgbnVtICUgMTAwICE9PSAxMVxuICAgICAgICAgICAgPyBmb3Jtc1swXVxuICAgICAgICAgICAgOiBudW0gJSAxMCA+PSAyICYmIG51bSAlIDEwIDw9IDQgJiYgKG51bSAlIDEwMCA8IDEwIHx8IG51bSAlIDEwMCA+PSAyMClcbiAgICAgICAgICAgICAgPyBmb3Jtc1sxXVxuICAgICAgICAgICAgICA6IGZvcm1zWzJdO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzczogd2l0aG91dFN1ZmZpeCA/ICfRgdC10LrRg9C90LTQsF/RgdC10LrRg9C90LTRi1/RgdC10LrRg9C90LQnIDogJ9GB0LXQutGD0L3QtNGDX9GB0LXQutGD0L3QtNGLX9GB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtbTogd2l0aG91dFN1ZmZpeCA/ICfQvNC40L3Rg9GC0LBf0LzQuNC90YPRgtGLX9C80LjQvdGD0YInIDogJ9C80LjQvdGD0YLRg1/QvNC40L3Rg9GC0Ytf0LzQuNC90YPRgicsXG4gICAgICAgICAgICBoaDogJ9GH0LDRgV/Rh9Cw0YHQsF/Rh9Cw0YHQvtCyJyxcbiAgICAgICAgICAgIGRkOiAn0LTQtdC90Yxf0LTQvdGPX9C00L3QtdC5JyxcbiAgICAgICAgICAgIHd3OiAn0L3QtdC00LXQu9GPX9C90LXQtNC10LvQuF/QvdC10LTQtdC70YwnLFxuICAgICAgICAgICAgTU06ICfQvNC10YHRj9GGX9C80LXRgdGP0YbQsF/QvNC10YHRj9GG0LXQsicsXG4gICAgICAgICAgICB5eTogJ9Cz0L7QtF/Qs9C+0LTQsF/Qu9C10YInLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoa2V5ID09PSAnbScpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9C80LjQvdGD0YLQsCcgOiAn0LzQuNC90YPRgtGDJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBwbHVyYWwoZm9ybWF0W2tleV0sICtudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgL17Rj9C90LIvaSxcbiAgICAgICAgL17RhNC10LIvaSxcbiAgICAgICAgL17QvNCw0YAvaSxcbiAgICAgICAgL17QsNC/0YAvaSxcbiAgICAgICAgL17QvNCwW9C50Y9dL2ksXG4gICAgICAgIC9e0LjRjtC9L2ksXG4gICAgICAgIC9e0LjRjtC7L2ksXG4gICAgICAgIC9e0LDQstCzL2ksXG4gICAgICAgIC9e0YHQtdC9L2ksXG4gICAgICAgIC9e0L7QutGCL2ksXG4gICAgICAgIC9e0L3QvtGPL2ksXG4gICAgICAgIC9e0LTQtdC6L2ksXG4gICAgXTtcblxuICAgIC8vIGh0dHA6Ly9uZXcuZ3JhbW90YS5ydS9zcHJhdmthL3J1bGVzLzEzOS1wcm9wIDogwqcgMTAzXG4gICAgLy8g0KHQvtC60YDQsNGJ0LXQvdC40Y8g0LzQtdGB0Y/RhtC10LI6IGh0dHA6Ly9uZXcuZ3JhbW90YS5ydS9zcHJhdmthL2J1cm8vc2VhcmNoLWFuc3dlcj9zPTI0MjYzN1xuICAgIC8vIENMRFIgZGF0YTogICAgICAgICAgaHR0cDovL3d3dy51bmljb2RlLm9yZy9jbGRyL2NoYXJ0cy8yOC9zdW1tYXJ5L3J1Lmh0bWwjMTc1M1xuICAgIHZhciBydSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3J1Jywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9GP0L3QstCw0YDRj1/RhNC10LLRgNCw0LvRj1/QvNCw0YDRgtCwX9Cw0L/RgNC10LvRj1/QvNCw0Y9f0LjRjtC90Y9f0LjRjtC70Y9f0LDQstCz0YPRgdGC0LBf0YHQtdC90YLRj9Cx0YDRj1/QvtC60YLRj9Cx0YDRj1/QvdC+0Y/QsdGA0Y9f0LTQtdC60LDQsdGA0Y8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9GP0L3QstCw0YDRjF/RhNC10LLRgNCw0LvRjF/QvNCw0YDRgl/QsNC/0YDQtdC70Yxf0LzQsNC5X9C40Y7QvdGMX9C40Y7Qu9GMX9Cw0LLQs9GD0YHRgl/RgdC10L3RgtGP0LHRgNGMX9C+0LrRgtGP0LHRgNGMX9C90L7Rj9Cx0YDRjF/QtNC10LrQsNCx0YDRjCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiB7XG4gICAgICAgICAgICAvLyDQv9C+IENMRFIg0LjQvNC10L3QvdC+IFwi0LjRjtC7LlwiINC4IFwi0LjRjtC9LlwiLCDQvdC+INC60LDQutC+0Lkg0YHQvNGL0YHQuyDQvNC10L3Rj9GC0Ywg0LHRg9C60LLRgyDQvdCwINGC0L7Rh9C60YM/XG4gICAgICAgICAgICBmb3JtYXQ6ICfRj9C90LIuX9GE0LXQstGALl/QvNCw0YAuX9Cw0L/RgC5f0LzQsNGPX9C40Y7QvdGPX9C40Y7Qu9GPX9Cw0LLQsy5f0YHQtdC90YIuX9C+0LrRgi5f0L3QvtGP0LEuX9C00LXQui4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9GP0L3Qsi5f0YTQtdCy0YAuX9C80LDRgNGCX9Cw0L/RgC5f0LzQsNC5X9C40Y7QvdGMX9C40Y7Qu9GMX9Cw0LLQsy5f0YHQtdC90YIuX9C+0LrRgi5f0L3QvtGP0LEuX9C00LXQui4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5czoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn0LLQvtGB0LrRgNC10YHQtdC90YzQtV/Qv9C+0L3QtdC00LXQu9GM0L3QuNC6X9Cy0YLQvtGA0L3QuNC6X9GB0YDQtdC00LBf0YfQtdGC0LLQtdGA0LNf0L/Rj9GC0L3QuNGG0LBf0YHRg9Cx0LHQvtGC0LAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiAn0LLQvtGB0LrRgNC10YHQtdC90YzQtV/Qv9C+0L3QtdC00LXQu9GM0L3QuNC6X9Cy0YLQvtGA0L3QuNC6X9GB0YDQtdC00YNf0YfQtdGC0LLQtdGA0LNf0L/Rj9GC0L3QuNGG0YNf0YHRg9Cx0LHQvtGC0YMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvXFxbID9b0JLQsl0gPyg/OtC/0YDQvtGI0LvRg9GOfNGB0LvQtdC00YPRjtGJ0YPRjnzRjdGC0YMpPyA/XSA/ZGRkZC8sXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQstGBX9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9Cy0YFf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG5cbiAgICAgICAgLy8g0L/QvtC70L3Ri9C1INC90LDQt9Cy0LDQvdC40Y8g0YEg0L/QsNC00LXQttCw0LzQuCwg0L/QviDRgtGA0Lgg0LHRg9C60LLRiywg0LTQu9GPINC90LXQutC+0YLQvtGA0YvRhSwg0L/QviA0INCx0YPQutCy0YssINGB0L7QutGA0LDRidC10L3QuNGPINGBINGC0L7Rh9C60L7QuSDQuCDQsdC10Lcg0YLQvtGH0LrQuFxuICAgICAgICBtb250aHNSZWdleDpcbiAgICAgICAgICAgIC9eKNGP0L3QstCw0YBb0YzRj1180Y/QvdCyXFwuP3zRhNC10LLRgNCw0Ltb0YzRj1180YTQtdCy0YA/XFwuP3zQvNCw0YDRgtCwP3zQvNCw0YBcXC4/fNCw0L/RgNC10Ltb0YzRj1180LDQv9GAXFwuP3zQvNCwW9C50Y9dfNC40Y7QvVvRjNGPXXzQuNGO0L1cXC4/fNC40Y7Qu1vRjNGPXXzQuNGO0LtcXC4/fNCw0LLQs9GD0YHRgtCwP3zQsNCy0LNcXC4/fNGB0LXQvdGC0Y/QsdGAW9GM0Y9dfNGB0LXQvdGCP1xcLj980L7QutGC0Y/QsdGAW9GM0Y9dfNC+0LrRglxcLj980L3QvtGP0LHRgFvRjNGPXXzQvdC+0Y/QsT9cXC4/fNC00LXQutCw0LHRgFvRjNGPXXzQtNC10LpcXC4/KS9pLFxuXG4gICAgICAgIC8vINC60L7Qv9C40Y8g0L/RgNC10LTRi9C00YPRidC10LPQvlxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OlxuICAgICAgICAgICAgL14o0Y/QvdCy0LDRgFvRjNGPXXzRj9C90LJcXC4/fNGE0LXQstGA0LDQu1vRjNGPXXzRhNC10LLRgD9cXC4/fNC80LDRgNGC0LA/fNC80LDRgFxcLj980LDQv9GA0LXQu1vRjNGPXXzQsNC/0YBcXC4/fNC80LBb0LnRj1180LjRjtC9W9GM0Y9dfNC40Y7QvVxcLj980LjRjtC7W9GM0Y9dfNC40Y7Qu1xcLj980LDQstCz0YPRgdGC0LA/fNCw0LLQs1xcLj980YHQtdC90YLRj9Cx0YBb0YzRj1180YHQtdC90YI/XFwuP3zQvtC60YLRj9Cx0YBb0YzRj1180L7QutGCXFwuP3zQvdC+0Y/QsdGAW9GM0Y9dfNC90L7Rj9CxP1xcLj980LTQtdC60LDQsdGAW9GM0Y9dfNC00LXQulxcLj8pL2ksXG5cbiAgICAgICAgLy8g0L/QvtC70L3Ri9C1INC90LDQt9Cy0LDQvdC40Y8g0YEg0L/QsNC00LXQttCw0LzQuFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKNGP0L3QstCw0YBb0Y/RjF180YTQtdCy0YDQsNC7W9GP0YxdfNC80LDRgNGC0LA/fNCw0L/RgNC10Ltb0Y/RjF180LzQsFvRj9C5XXzQuNGO0L1b0Y/RjF180LjRjtC7W9GP0YxdfNCw0LLQs9GD0YHRgtCwP3zRgdC10L3RgtGP0LHRgFvRj9GMXXzQvtC60YLRj9Cx0YBb0Y/RjF180L3QvtGP0LHRgFvRj9GMXXzQtNC10LrQsNCx0YBb0Y/RjF0pL2ksXG5cbiAgICAgICAgLy8g0JLRi9GA0LDQttC10L3QuNC1LCDQutC+0YLQvtGA0L7QtSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0LXRgiDRgtC+0LvRjNC60L4g0YHQvtC60YDQsNGJ0ZHQvdC90YvQvCDRhNC+0YDQvNCw0LxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKNGP0L3QslxcLnzRhNC10LLRgD9cXC580LzQsNGAW9GCLl180LDQv9GAXFwufNC80LBb0Y/QuV180LjRjtC9W9GM0Y8uXXzQuNGO0Ltb0YzRjy5dfNCw0LLQs1xcLnzRgdC10L3Rgj9cXC580L7QutGCXFwufNC90L7Rj9CxP1xcLnzQtNC10LpcXC4pL2ksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZINCzLicsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSDQsy4sIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZINCzLiwgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9Ch0LXQs9C+0LTQvdGPLCDQsl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQl9Cw0LLRgtGA0LAsINCyXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9CS0YfQtdGA0LAsINCyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmIChub3cud2VlaygpICE9PSB0aGlzLndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDRgdC70LXQtNGD0Y7RidC10LVdIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINGB0LvQtdC00YPRjtGJ0LjQuV0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0YHQu9C10LTRg9GO0YnRg9GOXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRheSgpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQktC+XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmIChub3cud2VlaygpICE9PSB0aGlzLndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDQv9GA0L7RiNC70L7QtV0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0L/RgNC+0YjQu9GL0LldIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINC/0YDQvtGI0LvRg9GOXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRheSgpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQktC+XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSXSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9GH0LXRgNC10LcgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzINC90LDQt9Cw0LQnLFxuICAgICAgICAgICAgczogJ9C90LXRgdC60L7Qu9GM0LrQviDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgc3M6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoOiAn0YfQsNGBJyxcbiAgICAgICAgICAgIGhoOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZDogJ9C00LXQvdGMJyxcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgdzogJ9C90LXQtNC10LvRjycsXG4gICAgICAgICAgICB3dzogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE06ICfQvNC10YHRj9GGJyxcbiAgICAgICAgICAgIE1NOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeTogJ9Cz0L7QtCcsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9C90L7Rh9C4fNGD0YLRgNCwfNC00L3Rj3zQstC10YfQtdGA0LAvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o0LTQvdGPfNCy0LXRh9C10YDQsCkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0L3QvtGH0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GD0YLRgNCwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQtNC90Y8nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Cy0LXRh9C10YDQsCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0Ll80LPQvnzRjykvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LknO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Qs9C+JztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0Y8nO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBydTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTaW5kaGkgW3NkXVxuLy8hIGF1dGhvciA6IE5hcmFpbiBTYWdhciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9uYXJhaW5zYWdhclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9IFtcbiAgICAgICAgICAgICfYrNmG2YjYsdmKJyxcbiAgICAgICAgICAgICfZgdmK2KjYsdmI2LHZiicsXG4gICAgICAgICAgICAn2YXYp9ix2oYnLFxuICAgICAgICAgICAgJ9in2b7YsdmK2YQnLFxuICAgICAgICAgICAgJ9mF2KbZiicsXG4gICAgICAgICAgICAn2KzZiNmGJyxcbiAgICAgICAgICAgICfYrNmI2YTYp9ih2ZAnLFxuICAgICAgICAgICAgJ9ii2q/Ys9m9JyxcbiAgICAgICAgICAgICfYs9mK2b7ZvdmF2KjYsScsXG4gICAgICAgICAgICAn2KLaqtm92YjYqNixJyxcbiAgICAgICAgICAgICfZhtmI2YXYqNixJyxcbiAgICAgICAgICAgICfaitiz2YXYqNixJyxcbiAgICAgICAgXSxcbiAgICAgICAgZGF5cyA9IFsn2KLahtixJywgJ9iz2YjZhdixJywgJ9in2rHYp9ix2YgnLCAn2KfYsdio2LknLCAn2K7ZhdmK2LMnLCAn2KzZhdi5JywgJ9qH2Ybah9ixJ107XG5cbiAgICB2YXIgc2QgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzZCcsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiBkYXlzLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGF5cyxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZNiMIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i12KjYrXzYtNin2YUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2LTYp9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtdio2K0nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICfYtNin2YUnO1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9qEXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9iz2oDYp9q72YpdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2Kfas9mK2YYg2YfZgdiq2Yog2KrZil0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vaqtin2YTZh9mHXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1var9iy2LHZitmEINmH2YHYqtmKXSBkZGRkIFvYqtmKXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINm+2YjYoScsXG4gICAgICAgICAgICBwYXN0OiAnJXMg2KfasycsXG4gICAgICAgICAgICBzOiAn2obZhtivINiz2YraqtmG2oonLFxuICAgICAgICAgICAgc3M6ICclZCDYs9mK2qrZhtqKJyxcbiAgICAgICAgICAgIG06ICfZh9qqINmF2YbZvScsXG4gICAgICAgICAgICBtbTogJyVkINmF2YbZvScsXG4gICAgICAgICAgICBoOiAn2YfaqiDaqtmE2KfaqicsXG4gICAgICAgICAgICBoaDogJyVkINqq2YTYp9qqJyxcbiAgICAgICAgICAgIGQ6ICfZh9qqINqP2YrZhtmH2YYnLFxuICAgICAgICAgICAgZGQ6ICclZCDaj9mK2YbZh9mGJyxcbiAgICAgICAgICAgIE06ICfZh9qqINmF2YfZitmG2YgnLFxuICAgICAgICAgICAgTU06ICclZCDZhdmH2YrZhtinJyxcbiAgICAgICAgICAgIHk6ICfZh9qqINiz2KfZhCcsXG4gICAgICAgICAgICB5eTogJyVkINiz2KfZhCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNkO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE5vcnRoZXJuIFNhbWkgW3NlXVxuLy8hIGF1dGhvcnMgOiBCw6VyZCBSb2xzdGFkIEhlbnJpa3NlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rYXJhbWVsbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHNlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc2UnLCB7XG4gICAgICAgIG1vbnRoczogJ2/EkcSRYWphZ2Vtw6FubnVfZ3VvdnZhbcOhbm51X25qdWvEjWFtw6FubnVfY3VvxYtvbcOhbm51X21pZXNzZW3DoW5udV9nZWFzc2Vtw6FubnVfc3VvaWRuZW3DoW5udV9ib3JnZW3DoW5udV/EjWFrxI1hbcOhbm51X2dvbGdnb3Rtw6FubnVfc2vDoWJtYW3DoW5udV9qdW92bGFtw6FubnUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2/EkcSRal9ndW92X25qdWtfY3VvX21pZXNfZ2Vhc19zdW9pX2JvcmdfxI1ha8SNX2dvbGdfc2vDoWJfanVvdicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnc290bmFiZWFpdmlfdnVvc3PDoXJnYV9tYcWLxYtlYsOhcmdhX2dhc2thdmFoa2t1X2R1b3Jhc3RhdF9iZWFyamFkYXRfbMOhdnZhcmRhdCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnc290bl92dW9zX21hxYtfZ2Fza19kdW9yX2JlYXJfbMOhdicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzX3ZfbV9nX2RfYl9MJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ01NTU0gRC4gW2IuXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ01NTU0gRC4gW2IuXSBZWVlZIFt0aS5dIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIEQuIFtiLl0gWVlZWSBbdGkuXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW290bmUgdGldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbaWh0dGluIHRpXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3RpXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2lrdGUgdGldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW292ZGRpdF0gZGRkZCBbdGldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgZ2Vhxb5lcycsXG4gICAgICAgICAgICBwYXN0OiAnbWHFi2l0ICVzJyxcbiAgICAgICAgICAgIHM6ICdtb2FkZGUgc2VrdW5kZGF0JyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kZGF0JyxcbiAgICAgICAgICAgIG06ICdva3RhIG1pbnVodGEnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51aHRhdCcsXG4gICAgICAgICAgICBoOiAnb2t0YSBkaWltbXUnLFxuICAgICAgICAgICAgaGg6ICclZCBkaWltbXV0JyxcbiAgICAgICAgICAgIGQ6ICdva3RhIGJlYWl2aScsXG4gICAgICAgICAgICBkZDogJyVkIGJlYWl2dml0JyxcbiAgICAgICAgICAgIE06ICdva3RhIG3DoW5udScsXG4gICAgICAgICAgICBNTTogJyVkIG3DoW51dCcsXG4gICAgICAgICAgICB5OiAnb2t0YSBqYWhraScsXG4gICAgICAgICAgICB5eTogJyVkIGphZ2l0JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTaW5oYWxlc2UgW3NpXVxuLy8hIGF1dGhvciA6IFNhbXBhdGggU2l0aW5hbWFsdXdhIDogaHR0cHM6Ly9naXRodWIuY29tL3NhbXBhdGhzcmlzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICAvKmpzaGludCAtVzEwMCovXG4gICAgdmFyIHNpID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc2knLCB7XG4gICAgICAgIG1vbnRoczogJ+C2ouC2seC3gOC3j+C2u+C3kl/gtrTgt5ngtrbgtrvgt4Dgt4/gtrvgt5Jf4La44LeP4La74LeK4Lat4LeUX+C2heC2tOC3iuKAjeC2u+C3muC2veC3il/gtrjgt5Dgtrrgt5Jf4Lai4LeW4Lax4LeSX+C2ouC3luC2veC3kl/gtoXgtpzgt53gt4Pgt4rgtq3gt5Rf4LeD4LeQ4La04LeK4Lat4LeQ4La44LeK4La24La74LeKX+C2lOC2muC3iuC2reC3neC2tuC2u+C3il/gtrHgt5zgt4Dgt5Dgtrjgt4rgtrbgtrvgt4pf4Lav4LeZ4LeD4LeQ4La44LeK4La24La74LeKJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ+C2ouC2sV/gtrTgt5ngtrZf4La44LeP4La74LeKX+C2heC2tOC3il/gtrjgt5Dgtrrgt5Jf4Lai4LeW4Lax4LeSX+C2ouC3luC2veC3kl/gtoXgtpzgt51f4LeD4LeQ4La04LeKX+C2lOC2muC3il/gtrHgt5zgt4Dgt5Bf4Lav4LeZ4LeD4LeQJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfgtongtrvgt5Lgtq/gt49f4LeD4Laz4LeU4Lav4LePX+C2heC2n+C3hOC2u+C3lOC3gOC3j+C2r+C3j1/gtrbgtq/gt4/gtq/gt49f4La24LeK4oCN4La74LeE4LeD4LeK4La04Lat4LeS4Lax4LeK4Lav4LePX+C3g+C3kuC2muC3lOC2u+C3j+C2r+C3j1/gt4Pgt5ngtrHgt4Pgt5Tgtrvgt4/gtq/gt48nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+C2ieC2u+C3kl/gt4PgtrPgt5Rf4LaF4LafX+C2tuC2r+C3j1/gtrbgt4rigI3gtrvgt4Rf4LeD4LeS4Laa4LeUX+C3g+C3meC2sScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgtolf4LeDX+C2hV/gtrZf4La24LeK4oCN4La7X+C3g+C3kl/gt4Pgt5knLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnYSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ2EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVkgTU1NTSBEJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkgTU1NTSBELCBhIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVkgTU1NTSBEIFvgt4Dgt5DgtrHgt5JdIGRkZGQsIGEgaDptbTpzcycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+C2heC2r10gTFRb4LanXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C3hOC3meC2p10gTFRb4LanXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFRb4LanXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+C2iuC2uuC3ml0gTFRb4LanXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgtrTgt4Pgt5Tgtpzgt5LgtrpdIGRkZGQgTFRb4LanXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz4Laa4LeS4Lax4LeKJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+C2muC2pyDgtrTgt5ngtrsnLFxuICAgICAgICAgICAgczogJ+C2reC2reC3iuC2tOC2uyDgtprgt5Lgt4Tgt5LgtrTgtronLFxuICAgICAgICAgICAgc3M6ICfgtq3gtq3gt4rgtrTgtrsgJWQnLFxuICAgICAgICAgICAgbTogJ+C2uOC3kuC2seC3kuC2reC3iuC2reC3lOC3gCcsXG4gICAgICAgICAgICBtbTogJ+C2uOC3kuC2seC3kuC2reC3iuC2reC3lCAlZCcsXG4gICAgICAgICAgICBoOiAn4La04LeQ4La6JyxcbiAgICAgICAgICAgIGhoOiAn4La04LeQ4La6ICVkJyxcbiAgICAgICAgICAgIGQ6ICfgtq/gt5LgtrHgtronLFxuICAgICAgICAgICAgZGQ6ICfgtq/gt5LgtrEgJWQnLFxuICAgICAgICAgICAgTTogJ+C2uOC3j+C3g+C2uicsXG4gICAgICAgICAgICBNTTogJ+C2uOC3j+C3gyAlZCcsXG4gICAgICAgICAgICB5OiAn4LeA4LeD4La7JyxcbiAgICAgICAgICAgIHl5OiAn4LeA4LeD4La7ICVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9IOC3gOC3kOC2seC3ki8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnIOC3gOC3kOC2seC3kic7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gtrTgt5ngtrsg4LeA4La74LeUfOC2tOC3g+C3iiDgt4Dgtrvgt5R84La04LeZLuC3gHzgtrQu4LeALi8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn4La0LuC3gC4nIHx8IGlucHV0ID09PSAn4La04LeD4LeKIOC3gOC2u+C3lCc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAn4La0LuC3gC4nIDogJ+C2tOC3g+C3iiDgt4Dgtrvgt5QnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfgtrTgt5ku4LeALicgOiAn4La04LeZ4La7IOC3gOC2u+C3lCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2k7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2xvdmFrIFtza11cbi8vISBhdXRob3IgOiBNYXJ0aW4gTWlua2EgOiBodHRwczovL2dpdGh1Yi5jb20vazJzXG4vLyEgYmFzZWQgb24gd29yayBvZiBwZXRyYmVsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRyYmVsYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9XG4gICAgICAgICAgICAnamFudcOhcl9mZWJydcOhcl9tYXJlY19hcHLDrWxfbcOhal9qw7puX2rDumxfYXVndXN0X3NlcHRlbWJlcl9va3TDs2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydCA9ICdqYW5fZmViX21hcl9hcHJfbcOhal9qw7puX2rDumxfYXVnX3NlcF9va3Rfbm92X2RlYycuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBwbHVyYWwobikge1xuICAgICAgICByZXR1cm4gbiA+IDEgJiYgbiA8IDU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOiAvLyBhIGZldyBzZWNvbmRzIC8gaW4gYSBmZXcgc2Vjb25kcyAvIGEgZmV3IHNlY29uZHMgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAncMOhciBzZWvDum5kJyA6ICdww6FyIHNla3VuZGFtaSc7XG4gICAgICAgICAgICBjYXNlICdzcyc6IC8vIDkgc2Vjb25kcyAvIGluIDkgc2Vjb25kcyAvIDkgc2Vjb25kcyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Nla3VuZHknIDogJ3Nla8O6bmQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ3Nla3VuZGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbSc6IC8vIGEgbWludXRlIC8gaW4gYSBtaW51dGUgLyBhIG1pbnV0ZSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdtaW7DunRhJyA6IGlzRnV0dXJlID8gJ21pbsO6dHUnIDogJ21pbsO6dG91JztcbiAgICAgICAgICAgIGNhc2UgJ21tJzogLy8gOSBtaW51dGVzIC8gaW4gOSBtaW51dGVzIC8gOSBtaW51dGVzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWluw7p0eScgOiAnbWluw7p0Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtaW7DunRhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2gnOiAvLyBhbiBob3VyIC8gaW4gYW4gaG91ciAvIGFuIGhvdXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnaG9kaW5hJyA6IGlzRnV0dXJlID8gJ2hvZGludScgOiAnaG9kaW5vdSc7XG4gICAgICAgICAgICBjYXNlICdoaCc6IC8vIDkgaG91cnMgLyBpbiA5IGhvdXJzIC8gOSBob3VycyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2hvZGlueScgOiAnaG9kw61uJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdob2RpbmFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZCc6IC8vIGEgZGF5IC8gaW4gYSBkYXkgLyBhIGRheSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkZcWIJyA6ICdkxYhvbSc7XG4gICAgICAgICAgICBjYXNlICdkZCc6IC8vIDkgZGF5cyAvIGluIDkgZGF5cyAvIDkgZGF5cyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2RuaScgOiAnZG7DrScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnZMWIYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdNJzogLy8gYSBtb250aCAvIGluIGEgbW9udGggLyBhIG1vbnRoIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2lhYycgOiAnbWVzaWFjb20nO1xuICAgICAgICAgICAgY2FzZSAnTU0nOiAvLyA5IG1vbnRocyAvIGluIDkgbW9udGhzIC8gOSBtb250aHMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtZXNpYWNlJyA6ICdtZXNpYWNvdicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbWVzaWFjbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ3knOiAvLyBhIHllYXIgLyBpbiBhIHllYXIgLyBhIHllYXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAncm9rJyA6ICdyb2tvbSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6IC8vIDkgeWVhcnMgLyBpbiA5IHllYXJzIC8gOSB5ZWFycyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3Jva3knIDogJ3Jva292Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdyb2ttaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNrID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc2snLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzU2hvcnQsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkZcS+YV9wb25kZWxva191dG9yb2tfc3RyZWRhX8WhdHZydG9rX3BpYXRva19zb2JvdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZV9wb191dF9zdF/FoXRfcGlfc28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnbmVfcG9fdXRfc3RfxaF0X3BpX3NvJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkbmVzIG9dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbemFqdHJhIG9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3YgbmVkZcS+dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHN0cmVkdSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZvIMWhdHZydG9rIG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBwaWF0b2sgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHNvYm90dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbdsSNZXJhIG9dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw7ogbmVkZcS+dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDvV0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO6IHN0cmVkdSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDvV0gZGRkZCBbb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO6IHNvYm90dSBvXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByZWQgJXMnLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNrO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNsb3ZlbmlhbiBbc2xdXG4vLyEgYXV0aG9yIDogUm9iZXJ0IFNlZG92xaFlayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zZWRvdnNla1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlXG4gICAgICAgICAgICAgICAgICAgID8gJ25la2FqIHNla3VuZCdcbiAgICAgICAgICAgICAgICAgICAgOiAnbmVrYWogc2VrdW5kYW1pJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4ID8gJ3Nla3VuZG8nIDogJ3Nla3VuZGknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3Nla3VuZGknIDogJ3Nla3VuZGFoJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnc2VrdW5kZScgOiAnc2VrdW5kYWgnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ2VuYSBtaW51dGEnIDogJ2VubyBtaW51dG8nO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggPyAnbWludXRhJyA6ICdtaW51dG8nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21pbnV0aScgOiAnbWludXRhbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtaW51dGUnIDogJ21pbnV0YW1pJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtaW51dCcgOiAnbWludXRhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnZW5hIHVyYScgOiAnZW5vIHVybyc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCA/ICd1cmEnIDogJ3Vybyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAndXJpJyA6ICd1cmFtYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3VyZScgOiAndXJhbWknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3VyJyA6ICd1cmFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdlbiBkYW4nIDogJ2VuaW0gZG5lbSc7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkYW4nIDogJ2RuZW0nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2RuaScgOiAnZG5ldm9tYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZG5pJyA6ICdkbmV2aSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdlbiBtZXNlYycgOiAnZW5pbSBtZXNlY2VtJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2VjJyA6ICdtZXNlY2VtJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNlY2EnIDogJ21lc2VjZW1hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWVzZWNlJyA6ICdtZXNlY2knO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2VjZXYnIDogJ21lc2VjaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdlbm8gbGV0bycgOiAnZW5pbSBsZXRvbSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdsZXRvJyA6ICdsZXRvbSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbGV0aScgOiAnbGV0b21hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbGV0YScgOiAnbGV0aSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbGV0JyA6ICdsZXRpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NsJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJlY19hcHJpbF9tYWpfanVuaWpfanVsaWpfYXZndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hai5fanVuLl9qdWwuX2F2Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGVsamFfcG9uZWRlbGpla190b3Jla19zcmVkYV/EjWV0cnRla19wZXRla19zb2JvdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZWQuX3Bvbi5fdG9yLl9zcmUuX8SNZXQuX3BldC5fc29iLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb190b19zcl/EjWVfcGVfc28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC4gTU0uIFlZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZGFuZXMgb2JdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbanV0cmkgb2JdIExUJyxcblxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gW25lZGVsam9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBbc3JlZG9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBbc29ib3RvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdl0gZGRkZCBbb2JdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1t2xI1lcmFqIG9iXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcmVqxaFuam9dIFtuZWRlbGpvXSBbb2JdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlasWhbmpvXSBbc3JlZG9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcmVqxaFuam9dIFtzb2JvdG9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcmVqxaFuamldIGRkZGQgW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnxI1leiAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJlZCAlcycsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2w7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQWxiYW5pYW4gW3NxXVxuLy8hIGF1dGhvciA6IEZsYWvDq3JpbSBJc21hbmkgOiBodHRwczovL2dpdGh1Yi5jb20vZmxha2VyaW1pXG4vLyEgYXV0aG9yIDogTWVuZWxpb24gRWxlbnPDumxlIDogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcbi8vISBhdXRob3IgOiBPZXJkIEN1a2FsbGEgOiBodHRwczovL2dpdGh1Yi5jb20vb2VyZFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHNxID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3EnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbmFyX1Noa3VydF9NYXJzX1ByaWxsX01hal9RZXJzaG9yX0tvcnJpa19HdXNodF9TaHRhdG9yX1RldG9yX07Dq250b3JfRGhqZXRvcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fU2hrX01hcl9QcmlfTWFqX1Flcl9Lb3JfR3VzX1NodF9UZXRfTsOrbl9EaGonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnRSBEaWVsX0UgSMOrbsOrX0UgTWFydMOrX0UgTcOrcmt1csOrX0UgRW5qdGVfRSBQcmVtdGVfRSBTaHR1bsOrJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnRGllX0jDq25fTWFyX03Dq3JfRW5qX1ByZV9TaHQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnRF9IX01hX03Dq19FX1BfU2gnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL1BEfE1ELyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQuY2hhckF0KDApID09PSAnTSc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBob3VycyA8IDEyID8gJ1BEJyA6ICdNRCc7XG4gICAgICAgIH0sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbU290IG7Dq10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tOZXPDq3IgbsOrXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW27Dq10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tEamUgbsOrXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2Uga2FsdWFyIG7Dq10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICduw6sgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIG3DqyBwYXLDqycsXG4gICAgICAgICAgICBzOiAnZGlzYSBzZWtvbmRhJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vrb25kYScsXG4gICAgICAgICAgICBtOiAnbmrDqyBtaW51dMOrJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRhJyxcbiAgICAgICAgICAgIGg6ICduasOrIG9yw6snLFxuICAgICAgICAgICAgaGg6ICclZCBvcsOrJyxcbiAgICAgICAgICAgIGQ6ICduasOrIGRpdMOrJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGl0w6snLFxuICAgICAgICAgICAgTTogJ25qw6sgbXVhaicsXG4gICAgICAgICAgICBNTTogJyVkIG11YWonLFxuICAgICAgICAgICAgeTogJ25qw6sgdml0JyxcbiAgICAgICAgICAgIHl5OiAnJWQgdml0ZScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2VyYmlhbiBDeXJpbGxpYyBbc3ItY3lybF1cbi8vISBhdXRob3IgOiBNaWxhbiBKYW5hxI1rb3ZpxIc8bWlsYW5qYW5hY2tvdmljQGdtYWlsLmNvbT4gOiBodHRwczovL2dpdGh1Yi5jb20vbWlsYW4talxuLy8hIGF1dGhvciA6IFN0ZWZhbiBDcm5qYWtvdmnEhyA8c3RlZmFuQGhvdG1haWwucnM+IDogaHR0cHM6Ly9naXRodWIuY29tL2Nybmpha292aWNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0cmFuc2xhdG9yID0ge1xuICAgICAgICB3b3Jkczoge1xuICAgICAgICAgICAgLy9EaWZmZXJlbnQgZ3JhbW1hdGljYWwgY2FzZXNcbiAgICAgICAgICAgIHNzOiBbJ9GB0LXQutGD0L3QtNCwJywgJ9GB0LXQutGD0L3QtNC1JywgJ9GB0LXQutGD0L3QtNC4J10sXG4gICAgICAgICAgICBtOiBbJ9GY0LXQtNCw0L0g0LzQuNC90YPRgicsICfRmNC10LTQvdC+0LMg0LzQuNC90YPRgtCwJ10sXG4gICAgICAgICAgICBtbTogWyfQvNC40L3Rg9GCJywgJ9C80LjQvdGD0YLQsCcsICfQvNC40L3Rg9GC0LAnXSxcbiAgICAgICAgICAgIGg6IFsn0ZjQtdC00LDQvSDRgdCw0YInLCAn0ZjQtdC00L3QvtCzINGB0LDRgtCwJ10sXG4gICAgICAgICAgICBoaDogWyfRgdCw0YInLCAn0YHQsNGC0LAnLCAn0YHQsNGC0LgnXSxcbiAgICAgICAgICAgIGQ6IFsn0ZjQtdC00LDQvSDQtNCw0L0nLCAn0ZjQtdC00L3QvtCzINC00LDQvdCwJ10sXG4gICAgICAgICAgICBkZDogWyfQtNCw0L0nLCAn0LTQsNC90LAnLCAn0LTQsNC90LAnXSxcbiAgICAgICAgICAgIE06IFsn0ZjQtdC00LDQvSDQvNC10YHQtdGGJywgJ9GY0LXQtNC90L7QsyDQvNC10YHQtdGG0LAnXSxcbiAgICAgICAgICAgIE1NOiBbJ9C80LXRgdC10YYnLCAn0LzQtdGB0LXRhtCwJywgJ9C80LXRgdC10YbQuCddLFxuICAgICAgICAgICAgeTogWyfRmNC10LTQvdGDINCz0L7QtNC40L3RgycsICfRmNC10LTQvdC1INCz0L7QtNC40L3QtSddLFxuICAgICAgICAgICAgeXk6IFsn0LPQvtC00LjQvdGDJywgJ9Cz0L7QtNC40L3QtScsICfQs9C+0LTQuNC90LAnXSxcbiAgICAgICAgfSxcbiAgICAgICAgY29ycmVjdEdyYW1tYXRpY2FsQ2FzZTogZnVuY3Rpb24gKG51bWJlciwgd29yZEtleSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG51bWJlciAlIDEwID49IDEgJiZcbiAgICAgICAgICAgICAgICBudW1iZXIgJSAxMCA8PSA0ICYmXG4gICAgICAgICAgICAgICAgKG51bWJlciAlIDEwMCA8IDEwIHx8IG51bWJlciAlIDEwMCA+PSAyMClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMSA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdvcmRLZXlbMl07XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgdmFyIHdvcmRLZXkgPSB0cmFuc2xhdG9yLndvcmRzW2tleV0sXG4gICAgICAgICAgICAgICAgd29yZDtcblxuICAgICAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBOb21pbmF0aXZcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAneScgJiYgd2l0aG91dFN1ZmZpeCkgcmV0dXJuICfRmNC10LTQvdCwINCz0L7QtNC40L3QsCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyB3b3JkS2V5WzBdIDogd29yZEtleVsxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd29yZCA9IHRyYW5zbGF0b3IuY29ycmVjdEdyYW1tYXRpY2FsQ2FzZShudW1iZXIsIHdvcmRLZXkpO1xuICAgICAgICAgICAgLy8gTm9taW5hdGl2XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAneXknICYmIHdpdGhvdXRTdWZmaXggJiYgd29yZCA9PT0gJ9Cz0L7QtNC40L3RgycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDQs9C+0LTQuNC90LAnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgd29yZDtcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgdmFyIHNyQ3lybCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NyLWN5cmwnLCB7XG4gICAgICAgIG1vbnRoczogJ9GY0LDQvdGD0LDRgF/RhNC10LHRgNGD0LDRgF/QvNCw0YDRgl/QsNC/0YDQuNC7X9C80LDRmF/RmNGD0L1f0ZjRg9C7X9Cw0LLQs9GD0YHRgl/RgdC10L/RgtC10LzQsdCw0YBf0L7QutGC0L7QsdCw0YBf0L3QvtCy0LXQvNCx0LDRgF/QtNC10YbQtdC80LHQsNGAJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfRmNCw0L0uX9GE0LXQsS5f0LzQsNGALl/QsNC/0YAuX9C80LDRmF/RmNGD0L1f0ZjRg9C7X9Cw0LLQsy5f0YHQtdC/Ll/QvtC60YIuX9C90L7Qsi5f0LTQtdGGLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfQvdC10LTQtdGZ0LBf0L/QvtC90LXQtNC10ZnQsNC6X9GD0YLQvtGA0LDQul/RgdGA0LXQtNCwX9GH0LXRgtCy0YDRgtCw0Lpf0L/QtdGC0LDQul/RgdGD0LHQvtGC0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQvdC10LQuX9C/0L7QvS5f0YPRgtC+Ll/RgdGA0LUuX9GH0LXRgi5f0L/QtdGCLl/RgdGD0LEuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9C90LVf0L/Qvl/Rg9GCX9GB0YBf0YfQtV/Qv9C1X9GB0YMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdELiBNLiBZWVlZLicsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWS4nLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZLiBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkuIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQtNCw0L3QsNGBINGDXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9GB0YPRgtGA0LAg0YNdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9GDXSBb0L3QtdC00LXRmdGDXSBb0YNdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0YNdIFvRgdGA0LXQtNGDXSBb0YNdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0YNdIFvRgdGD0LHQvtGC0YNdIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gZGRkZCBb0YNdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1vRmNGD0YfQtSDRg10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGFzdFdlZWtEYXlzID0gW1xuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQtV0gW9C90LXQtNC10ZnQtV0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C+0LNdIFvQv9C+0L3QtdC00LXRmdC60LBdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQvtCzXSBb0YPRgtC+0YDQutCwXSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70LVdIFvRgdGA0LXQtNC1XSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70L7Qs10gW9GH0LXRgtCy0YDRgtC60LBdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQvtCzXSBb0L/QtdGC0LrQsF0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C1XSBb0YHRg9Cx0L7RgtC1XSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXN0V2Vla0RheXNbdGhpcy5kYXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQt9CwICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfQv9GA0LUgJXMnLFxuICAgICAgICAgICAgczogJ9C90LXQutC+0LvQuNC60L4g0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzckN5cmw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2VyYmlhbiBbc3JdXG4vLyEgYXV0aG9yIDogTWlsYW4gSmFuYcSNa292acSHPG1pbGFuamFuYWNrb3ZpY0BnbWFpbC5jb20+IDogaHR0cHM6Ly9naXRodWIuY29tL21pbGFuLWpcbi8vISBhdXRob3IgOiBTdGVmYW4gQ3JuamFrb3ZpxIcgPHN0ZWZhbkBob3RtYWlsLnJzPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jcm5qYWtvdmljXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdHJhbnNsYXRvciA9IHtcbiAgICAgICAgd29yZHM6IHtcbiAgICAgICAgICAgIC8vRGlmZmVyZW50IGdyYW1tYXRpY2FsIGNhc2VzXG4gICAgICAgICAgICBzczogWydzZWt1bmRhJywgJ3Nla3VuZGUnLCAnc2VrdW5kaSddLFxuICAgICAgICAgICAgbTogWydqZWRhbiBtaW51dCcsICdqZWRub2cgbWludXRhJ10sXG4gICAgICAgICAgICBtbTogWydtaW51dCcsICdtaW51dGEnLCAnbWludXRhJ10sXG4gICAgICAgICAgICBoOiBbJ2plZGFuIHNhdCcsICdqZWRub2cgc2F0YSddLFxuICAgICAgICAgICAgaGg6IFsnc2F0JywgJ3NhdGEnLCAnc2F0aSddLFxuICAgICAgICAgICAgZDogWydqZWRhbiBkYW4nLCAnamVkbm9nIGRhbmEnXSxcbiAgICAgICAgICAgIGRkOiBbJ2RhbicsICdkYW5hJywgJ2RhbmEnXSxcbiAgICAgICAgICAgIE06IFsnamVkYW4gbWVzZWMnLCAnamVkbm9nIG1lc2VjYSddLFxuICAgICAgICAgICAgTU06IFsnbWVzZWMnLCAnbWVzZWNhJywgJ21lc2VjaSddLFxuICAgICAgICAgICAgeTogWydqZWRudSBnb2RpbnUnLCAnamVkbmUgZ29kaW5lJ10sXG4gICAgICAgICAgICB5eTogWydnb2RpbnUnLCAnZ29kaW5lJywgJ2dvZGluYSddLFxuICAgICAgICB9LFxuICAgICAgICBjb3JyZWN0R3JhbW1hdGljYWxDYXNlOiBmdW5jdGlvbiAobnVtYmVyLCB3b3JkS2V5KSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICUgMTAgPj0gMSAmJlxuICAgICAgICAgICAgICAgIG51bWJlciAlIDEwIDw9IDQgJiZcbiAgICAgICAgICAgICAgICAobnVtYmVyICUgMTAwIDwgMTAgfHwgbnVtYmVyICUgMTAwID49IDIwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAxID8gd29yZEtleVswXSA6IHdvcmRLZXlbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd29yZEtleVsyXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICB2YXIgd29yZEtleSA9IHRyYW5zbGF0b3Iud29yZHNba2V5XSxcbiAgICAgICAgICAgICAgICB3b3JkO1xuXG4gICAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIE5vbWluYXRpdlxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICd5JyAmJiB3aXRob3V0U3VmZml4KSByZXR1cm4gJ2plZG5hIGdvZGluYSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXggPyB3b3JkS2V5WzBdIDogd29yZEtleVsxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd29yZCA9IHRyYW5zbGF0b3IuY29ycmVjdEdyYW1tYXRpY2FsQ2FzZShudW1iZXIsIHdvcmRLZXkpO1xuICAgICAgICAgICAgLy8gTm9taW5hdGl2XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAneXknICYmIHdpdGhvdXRTdWZmaXggJiYgd29yZCA9PT0gJ2dvZGludScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyBnb2RpbmEnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgd29yZDtcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgdmFyIHNyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3InLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnRfYXByaWxfbWFqX2p1bl9qdWxfYXZndXN0X3NlcHRlbWJhcl9va3RvYmFyX25vdmVtYmFyX2RlY2VtYmFyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbWFyLl9hcHIuX21hal9qdW5fanVsX2F2Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICduZWRlbGphX3BvbmVkZWxqYWtfdXRvcmFrX3NyZWRhX8SNZXR2cnRha19wZXRha19zdWJvdGEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZWQuX3Bvbi5fdXRvLl9zcmUuX8SNZXQuX3BldC5fc3ViLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb191dF9zcl/EjWVfcGVfc3UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdELiBNLiBZWVlZLicsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWS4nLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZLiBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkuIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkYW5hcyB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3N1dHJhIHVdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtuZWRlbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3JlZHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzdWJvdHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1tqdcSNZSB1XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBsYXN0V2Vla0RheXMgPSBbXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW25lZGVsamVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFtwb25lZGVsamthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbdXRvcmthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtzcmVkZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW8SNZXR2cnRrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3BldGthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtzdWJvdGVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFdlZWtEYXlzW3RoaXMuZGF5KCldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByZSAlcycsXG4gICAgICAgICAgICBzOiAnbmVrb2xpa28gc2VrdW5kaScsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IHNpU3dhdGkgW3NzXVxuLy8hIGF1dGhvciA6IE5pY29sYWkgRGF2aWVzPG1haWxAbmljb2xhaS5pbz4gOiBodHRwczovL2dpdGh1Yi5jb20vbmljb2xhaWRhdmllc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHNzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3MnLCB7XG4gICAgICAgIG1vbnRoczogXCJCaGltYmlkdndhbmVfSW5kbG92YW5hX0luZGxvdidsZW5raHVsdV9NYWJhc2FfSW5raHdla2h3ZXRpX0luaGxhYmFfS2hvbHdhbmVfSW5nY2lfSW55b25pX0ltcGhhbGFfTHdldGlfSW5nb25nb25pXCIuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdCaGlfSW5hX0ludV9NYWJfSW5rX0luaF9LaG9fSWdjX0lueV9JbXBfTHdlX0lnbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnTGlzb250Zm9fVW1zb21idWx1a29fTGVzaWJpbGlfTGVzaXRzYXRmdV9MZXNpbmVfTGVzaWhsYW51X1VtZ2NpYmVsbycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnTGlzX1VtYl9Mc2JfTGVzX0xzaV9Mc2hfVW1nJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0xpX1VzX0xiX0x0X0xzX0xoX1VnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW05hbXVobGEgbmdhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0t1c2FzYSBuZ2FdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbbmdhXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0l0b2xvIG5nYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtsZWxpcGhlbGlsZV0gW25nYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICduZ2EgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3dlbnRla2EgbmdhICVzJyxcbiAgICAgICAgICAgIHM6ICdlbWl6dXp3YW5hIGxvbWNhbmUnLFxuICAgICAgICAgICAgc3M6ICclZCBtenV6d2FuYScsXG4gICAgICAgICAgICBtOiAndW16dXp1JyxcbiAgICAgICAgICAgIG1tOiAnJWQgZW1penV6dScsXG4gICAgICAgICAgICBoOiAnbGlob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgZW1haG9yYScsXG4gICAgICAgICAgICBkOiAnbGlsYW5nYScsXG4gICAgICAgICAgICBkZDogJyVkIGVtYWxhbmdhJyxcbiAgICAgICAgICAgIE06ICdpbnlhbmdhJyxcbiAgICAgICAgICAgIE1NOiAnJWQgdGlueWFuZ2EnLFxuICAgICAgICAgICAgeTogJ3Vtbnlha2EnLFxuICAgICAgICAgICAgeXk6ICclZCBpbWlueWFrYScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9la3VzZW5pfGVtaW5pfGVudHNhbWJhbWF8ZWJ1c3VrdS8sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdla3VzZW5pJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZW1pbmknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlbnRzYW1iYW1hJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlYnVzdWt1JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAnZWt1c2VuaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdlbWluaScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnZW50c2FtYmFtYScgfHwgbWVyaWRpZW0gPT09ICdlYnVzdWt1Jykge1xuICAgICAgICAgICAgICAgIGlmIChob3VyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0vLFxuICAgICAgICBvcmRpbmFsOiAnJWQnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3M7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3dlZGlzaCBbc3ZdXG4vLyEgYXV0aG9yIDogSmVucyBBbG0gOiBodHRwczovL2dpdGh1Yi5jb20vdWxtdXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3N2Jywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJpX2ZlYnJ1YXJpX21hcnNfYXByaWxfbWFqX2p1bmlfanVsaV9hdWd1c3RpX3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFyX2Fwcl9tYWpfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ3PDtm5kYWdfbcOlbmRhZ190aXNkYWdfb25zZGFnX3RvcnNkYWdfZnJlZGFnX2zDtnJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzw7ZuX23DpW5fdGlzX29uc190b3JfZnJlX2zDtnInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnc8O2X23DpV90aV9vbl90b19mcl9sw7YnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICAgICAgbGxsOiAnRCBNTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnZGRkIEQgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tJZGFnXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0ltb3Jnb25dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSWfDpXJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW1DDpV0gZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tJXSBkZGRkW3NdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb20gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2bDtnIgJXMgc2VkYW4nLFxuICAgICAgICAgICAgczogJ27DpWdyYSBzZWt1bmRlcicsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZGVyJyxcbiAgICAgICAgICAgIG06ICdlbiBtaW51dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXInLFxuICAgICAgICAgICAgaDogJ2VuIHRpbW1lJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdGltbWFyJyxcbiAgICAgICAgICAgIGQ6ICdlbiBkYWcnLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdhcicsXG4gICAgICAgICAgICBNOiAnZW4gbcOlbmFkJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOlbmFkZXInLFxuICAgICAgICAgICAgeTogJ2V0dCDDpXInLFxuICAgICAgICAgICAgeXk6ICclZCDDpXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oXFw6ZXxcXDphKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJzplJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJzphJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICc6YSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJzplJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnOmUnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN2O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFN3YWhpbGkgW3N3XVxuLy8hIGF1dGhvciA6IEZhaGFkIEthc3NpbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWRzZWxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3N3Jywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJpX0ZlYnJ1YXJpX01hY2hpX0FwcmlsaV9NZWlfSnVuaV9KdWxhaV9BZ29zdGlfU2VwdGVtYmFfT2t0b2JhX05vdmVtYmFfRGVzZW1iYScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hY19BcHJfTWVpX0p1bl9KdWxfQWdvX1NlcF9Pa3RfTm92X0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnSnVtYXBpbGlfSnVtYXRhdHVfSnVtYW5uZV9KdW1hdGFub19BbGhhbWlzaV9JanVtYWFfSnVtYW1vc2knLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0pwbF9KdGF0X0pubmVfSnRhbl9BbGhfSWptX0ptb3MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnSjJfSjNfSjRfSjVfQWxfSWpfSjEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaGg6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2xlbyBzYWFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdba2VzaG8gc2FhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1t3aWtpIGlqYXlvXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2phbmFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3dpa2kgaWxpeW9waXRhXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIGJhYWRheWUnLFxuICAgICAgICAgICAgcGFzdDogJ3Rva2VhICVzJyxcbiAgICAgICAgICAgIHM6ICdoaXZpIHB1bmRlJyxcbiAgICAgICAgICAgIHNzOiAnc2VrdW5kZSAlZCcsXG4gICAgICAgICAgICBtOiAnZGFraWthIG1vamEnLFxuICAgICAgICAgICAgbW06ICdkYWtpa2EgJWQnLFxuICAgICAgICAgICAgaDogJ3NhYSBsaW1vamEnLFxuICAgICAgICAgICAgaGg6ICdtYXNhYSAlZCcsXG4gICAgICAgICAgICBkOiAnc2lrdSBtb2phJyxcbiAgICAgICAgICAgIGRkOiAnc2lrdSAlZCcsXG4gICAgICAgICAgICBNOiAnbXdlemkgbW1vamEnLFxuICAgICAgICAgICAgTU06ICdtaWV6aSAlZCcsXG4gICAgICAgICAgICB5OiAnbXdha2EgbW1vamEnLFxuICAgICAgICAgICAgeXk6ICdtaWFrYSAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUYW1pbCBbdGFdXG4vLyEgYXV0aG9yIDogQXJqdW5rdW1hciBLcmlzaG5hbW9vcnRoeSA6IGh0dHBzOi8vZ2l0aHViLmNvbS90azEyMDQwNFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgr6cnLFxuICAgICAgICAgICAgMjogJ+CvqCcsXG4gICAgICAgICAgICAzOiAn4K+pJyxcbiAgICAgICAgICAgIDQ6ICfgr6onLFxuICAgICAgICAgICAgNTogJ+CvqycsXG4gICAgICAgICAgICA2OiAn4K+sJyxcbiAgICAgICAgICAgIDc6ICfgr60nLFxuICAgICAgICAgICAgODogJ+CvricsXG4gICAgICAgICAgICA5OiAn4K+vJyxcbiAgICAgICAgICAgIDA6ICfgr6YnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4K+nJzogJzEnLFxuICAgICAgICAgICAgJ+CvqCc6ICcyJyxcbiAgICAgICAgICAgICfgr6knOiAnMycsXG4gICAgICAgICAgICAn4K+qJzogJzQnLFxuICAgICAgICAgICAgJ+Cvqyc6ICc1JyxcbiAgICAgICAgICAgICfgr6wnOiAnNicsXG4gICAgICAgICAgICAn4K+tJzogJzcnLFxuICAgICAgICAgICAgJ+Cvric6ICc4JyxcbiAgICAgICAgICAgICfgr68nOiAnOScsXG4gICAgICAgICAgICAn4K+mJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIHRhID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGEnLCB7XG4gICAgICAgIG1vbnRoczogJ+CunOCuqeCuteCusOCuv1/grqrgrr/grqrgr43grrDgrrXgrrDgrr9f4K6u4K6+4K6w4K+N4K6a4K+NX+Cuj+CuquCvjeCusOCusuCvjV/grq7gr4df4K6c4K+C4K6p4K+NX+CunOCvguCusuCviF/grobgrpXgrrjgr43grp/gr41f4K6a4K+G4K6q4K+N4K6f4K+G4K6u4K+N4K6q4K6w4K+NX+CuheCuleCvjeCun+Cvh+CuvuCuquCusOCvjV/grqjgrrXgrq7gr43grqrgrrDgr41f4K6f4K6/4K6a4K6u4K+N4K6q4K6w4K+NJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgrpzgrqngrrXgrrDgrr9f4K6q4K6/4K6q4K+N4K6w4K614K6w4K6/X+CuruCuvuCusOCvjeCumuCvjV/gro/grqrgr43grrDgrrLgr41f4K6u4K+HX+CunOCvguCuqeCvjV/grpzgr4LgrrLgr4hf4K6G4K6V4K644K+N4K6f4K+NX+CumuCvhuCuquCvjeCun+CvhuCuruCvjeCuquCusOCvjV/groXgrpXgr43grp/gr4fgrr7grqrgrrDgr41f4K6o4K614K6u4K+N4K6q4K6w4K+NX+Cun+Cuv+CumuCuruCvjeCuquCusOCvjScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfgrp7grr7grq/grr/grrHgr43grrHgr4HgrpXgr43grpXgrr/grrTgrq7gr4hf4K6k4K6/4K6Z4K+N4K6V4K6f4K+N4K6V4K6/4K604K6u4K+IX+CumuCvhuCuteCvjeCuteCuvuCur+CvjeCuleCuv+CutOCuruCviF/grqrgr4HgrqTgrqngr43grpXgrr/grrTgrq7gr4hf4K614K6/4K6v4K6+4K604K6V4K+N4K6V4K6/4K604K6u4K+IX+CuteCvhuCus+CvjeCus+Cuv+CuleCvjeCuleCuv+CutOCuruCviF/grprgrqngrr/grpXgr43grpXgrr/grrTgrq7gr4gnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CunuCuvuCur+Cuv+CuseCvgV/grqTgrr/grpngr43grpXgrrPgr41f4K6a4K+G4K614K+N4K614K6+4K6v4K+NX+CuquCvgeCupOCuqeCvjV/grrXgrr/grq/grr7grrTgrqngr41f4K614K+G4K6z4K+N4K6z4K6/X+CumuCuqeCuvycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgrp7grr5f4K6k4K6/X+CumuCvhl/grqrgr4Ff4K614K6/X+CuteCvhl/grponLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgrofgrqngr43grrHgr4FdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4K6o4K6+4K6z4K+IXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4K6o4K+H4K6x4K+N4K6x4K+BXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgrpXgrp/grqjgr43grqQg4K614K6+4K6w4K6u4K+NXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCuh+CusuCvjScsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4K6u4K+B4K6p4K+NJyxcbiAgICAgICAgICAgIHM6ICfgrpLgrrDgr4Eg4K6a4K6/4K6yIOCuteCuv+CuqOCuvuCun+Cuv+CuleCus+CvjScsXG4gICAgICAgICAgICBzczogJyVkIOCuteCuv+CuqOCuvuCun+Cuv+CuleCus+CvjScsXG4gICAgICAgICAgICBtOiAn4K6S4K6w4K+BIOCuqOCuv+CuruCuv+Cun+CuruCvjScsXG4gICAgICAgICAgICBtbTogJyVkIOCuqOCuv+CuruCuv+Cun+CumeCvjeCuleCus+CvjScsXG4gICAgICAgICAgICBoOiAn4K6S4K6w4K+BIOCuruCuo+CuvyDgrqjgr4fgrrDgrq7gr40nLFxuICAgICAgICAgICAgaGg6ICclZCDgrq7grqPgrr8g4K6o4K+H4K6w4K6u4K+NJyxcbiAgICAgICAgICAgIGQ6ICfgrpLgrrDgr4Eg4K6o4K6+4K6z4K+NJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4K6o4K6+4K6f4K+N4K6V4K6z4K+NJyxcbiAgICAgICAgICAgIE06ICfgrpLgrrDgr4Eg4K6u4K6+4K6k4K6u4K+NJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4K6u4K6+4K6k4K6Z4K+N4K6V4K6z4K+NJyxcbiAgICAgICAgICAgIHk6ICfgrpLgrrDgr4Eg4K614K6w4K+B4K6f4K6u4K+NJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4K6G4K6j4K+N4K6f4K+B4K6V4K6z4K+NJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ94K614K6k4K+BLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfgrrXgrqTgr4EnO1xuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4K+n4K+o4K+p4K+q4K+r4K+s4K+t4K+u4K+v4K+mXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvLyByZWZlciBodHRwOi8vdGEud2lraXBlZGlhLm9yZy9zLzFlcjFcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+Cur+CuvuCuruCuruCvjXzgrrXgr4jgrpXgrrHgr4h84K6V4K6+4K6y4K+IfOCuqOCuo+CvjeCuquCuleCusuCvjXzgro7grrHgr43grqrgrr7grp/gr4F84K6u4K6+4K6y4K+ILyxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCur+CuvuCuruCuruCvjSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCA2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K614K+I4K6V4K6x4K+IJzsgLy8g4K614K+I4K6V4K6x4K+IXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuleCuvuCusuCviCc7IC8vIOCuleCuvuCusuCviFxuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrqjgrqPgr43grqrgrpXgrrLgr40nOyAvLyDgrqjgrqPgr43grqrgrpXgrrLgr41cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6O4K6x4K+N4K6q4K6+4K6f4K+BJzsgLy8g4K6O4K6x4K+N4K6q4K6+4K6f4K+BXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuruCuvuCusuCviCc7IC8vIOCuruCuvuCusuCviFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrq/grr7grq7grq7gr40nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgrq/grr7grq7grq7gr40nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCAyID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgrrXgr4jgrpXgrrHgr4gnIHx8IG1lcmlkaWVtID09PSAn4K6V4K6+4K6y4K+IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CuqOCuo+CvjeCuquCuleCusuCvjScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0YTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUZWx1Z3UgW3RlXVxuLy8hIGF1dGhvciA6IEtyaXNobmEgQ2hhaXRhbnlhIFRob3RhIDogaHR0cHM6Ly9naXRodWIuY29tL2tjdGhvdGFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0ZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RlJywge1xuICAgICAgICBtb250aHM6ICfgsJzgsKjgsLXgsLDgsL9f4LCr4LC/4LCs4LGN4LCw4LC14LCw4LC/X+CwruCwvuCwsOCxjeCwmuCwv1/gsI/gsKrgsY3gsLDgsL/gsLLgsY1f4LCu4LGHX+CwnOCxguCwqOCxjV/gsJzgsYHgsLLgsYhf4LCG4LCX4LC44LGN4LCf4LGBX+CwuOCxhuCwquCxjeCwn+CxhuCwguCwrOCwsOCxjV/gsIXgsJXgsY3gsJ/gsYvgsKzgsLDgsY1f4LCo4LC14LCC4LCs4LCw4LGNX+CwoeCwv+CwuOCxhuCwguCwrOCwsOCxjScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4LCc4LCoLl/gsKvgsL/gsKzgsY3gsLAuX+CwruCwvuCwsOCxjeCwmuCwv1/gsI/gsKrgsY3gsLDgsL8uX+CwruCxh1/gsJzgsYLgsKjgsY1f4LCc4LGB4LCy4LGIX+CwhuCwly5f4LC44LGG4LCq4LGNLl/gsIXgsJXgsY3gsJ/gsYsuX+CwqOCwtS5f4LCh4LC/4LC44LGGLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfgsIbgsKbgsL/gsLXgsL7gsLDgsIJf4LC44LGL4LCu4LC14LC+4LCw4LCCX+CwruCwguCwl+Cws+CwteCwvuCwsOCwgl/gsKzgsYHgsKfgsLXgsL7gsLDgsIJf4LCX4LGB4LCw4LGB4LC14LC+4LCw4LCCX+CwtuCxgeCwleCxjeCwsOCwteCwvuCwsOCwgl/gsLbgsKjgsL/gsLXgsL7gsLDgsIInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CwhuCwpuCwv1/gsLjgsYvgsK5f4LCu4LCC4LCX4LCzX+CwrOCxgeCwp1/gsJfgsYHgsLDgsYFf4LC24LGB4LCV4LGN4LCwX+CwtuCwqOCwvycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgsIZf4LC44LGLX+CwruCwgl/gsKzgsYFf4LCX4LGBX+CwtuCxgV/gsLYnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4LCo4LGH4LCh4LGBXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CwsOCxh+CwquCxgV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CwqOCwv+CwqOCxjeCwqF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4LCX4LCkXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCwsuCxiycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4LCV4LGN4LCw4LC/4LCk4LCCJyxcbiAgICAgICAgICAgIHM6ICfgsJXgsYrgsKjgsY3gsKjgsL8g4LCV4LGN4LC34LCj4LC+4LCy4LGBJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4LC44LGG4LCV4LCo4LGN4LCy4LGBJyxcbiAgICAgICAgICAgIG06ICfgsJLgsJUg4LCo4LC/4LCu4LC/4LC34LCCJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4LCo4LC/4LCu4LC/4LC34LC+4LCy4LGBJyxcbiAgICAgICAgICAgIGg6ICfgsJLgsJUg4LCX4LCC4LCfJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4LCX4LCC4LCf4LCy4LGBJyxcbiAgICAgICAgICAgIGQ6ICfgsJLgsJUg4LCw4LGL4LCc4LGBJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4LCw4LGL4LCc4LGB4LCy4LGBJyxcbiAgICAgICAgICAgIE06ICfgsJLgsJUg4LCo4LGG4LCyJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4LCo4LGG4LCy4LCy4LGBJyxcbiAgICAgICAgICAgIHk6ICfgsJLgsJUg4LC44LCC4LC14LCk4LGN4LC44LCw4LCCJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4LC44LCC4LC14LCk4LGN4LC44LCw4LC+4LCy4LGBJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ94LC1LyxcbiAgICAgICAgb3JkaW5hbDogJyVk4LC1JyxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CwsOCwvuCwpOCxjeCwsOCwv3zgsIngsKbgsK/gsIJ84LCu4LCn4LGN4LCv4LC+4LC54LGN4LCo4LCCfOCwuOCwvuCwr+CwguCwpOCxjeCwsOCwgi8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CwsOCwvuCwpOCxjeCwsOCwvycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CwieCwpuCwr+CwgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsK7gsKfgsY3gsK/gsL7gsLngsY3gsKjgsIInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CwuOCwvuCwr+CwguCwpOCxjeCwsOCwgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsLDgsL7gsKTgsY3gsLDgsL8nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CwieCwpuCwr+Cwgic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LCu4LCn4LGN4LCv4LC+4LC54LGN4LCo4LCCJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsLjgsL7gsK/gsILgsKTgsY3gsLDgsIInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CwsOCwvuCwpOCxjeCwsOCwvyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUZXR1biBEaWxpIChFYXN0IFRpbW9yKSBbdGV0XVxuLy8hIGF1dGhvciA6IEpvc2h1YSBCcm9va3MgOiBodHRwczovL2dpdGh1Yi5jb20vam9zaGJyb29rc1xuLy8hIGF1dGhvciA6IE9ub3JpbyBEZSBKLiBBZm9uc28gOiBodHRwczovL2dpdGh1Yi5jb20vbWFyb2JvXG4vLyEgYXV0aG9yIDogU29uaWEgU2ltb2VzIDogaHR0cHM6Ly9naXRodWIuY29tL3Nvbmlhc2ltb2VzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdGV0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGV0Jywge1xuICAgICAgICBtb250aHM6ICdKYW5laXJ1X0ZldmVyZWlydV9NYXJzdV9BYnJpbF9NYWl1X0p1w7F1X0p1bGx1X0FndXN0dV9TZXRlbWJydV9PdXR1YnJ1X05vdmVtYnJ1X0RlemVtYnJ1Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZXZfTWFyX0Ficl9NYWlfSnVuX0p1bF9BZ29fU2V0X091dF9Ob3ZfRGV6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0RvbWluZ3VfU2VndW5kYV9UZXJzYV9LdWFydGFfS2ludGFfU2VzdGFfU2FiYWR1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnRG9tX1NlZ19UZXJzX0t1YV9LaW50X1Nlc3RfU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0RvX1NlZ19UZV9LdV9LaV9TZXNfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbT2hpbiBpaGFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQWJhbiBpaGFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbaWhhXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0hvcmlzZWlrIGloYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtzZW1hbmEga290dWtdIFtpaGFdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaWhhICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBsaXViYScsXG4gICAgICAgICAgICBzOiAnc2VndW5kdSBiYWx1bicsXG4gICAgICAgICAgICBzczogJ3NlZ3VuZHUgJWQnLFxuICAgICAgICAgICAgbTogJ21pbnV0dSBpZGEnLFxuICAgICAgICAgICAgbW06ICdtaW51dHUgJWQnLFxuICAgICAgICAgICAgaDogJ29yYXMgaWRhJyxcbiAgICAgICAgICAgIGhoOiAnb3JhcyAlZCcsXG4gICAgICAgICAgICBkOiAnbG9yb24gaWRhJyxcbiAgICAgICAgICAgIGRkOiAnbG9yb24gJWQnLFxuICAgICAgICAgICAgTTogJ2Z1bGFuIGlkYScsXG4gICAgICAgICAgICBNTTogJ2Z1bGFuICVkJyxcbiAgICAgICAgICAgIHk6ICd0aW5hbiBpZGEnLFxuICAgICAgICAgICAgeXk6ICd0aW5hbiAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZXQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGFqaWsgW3RnXVxuLy8hIGF1dGhvciA6IE9yaWYgTi4gSnIuIDogaHR0cHM6Ly9naXRodWIuY29tL29yaWYtanJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMDogJy3Rg9C8JyxcbiAgICAgICAgMTogJy3Rg9C8JyxcbiAgICAgICAgMjogJy3RjtC8JyxcbiAgICAgICAgMzogJy3RjtC8JyxcbiAgICAgICAgNDogJy3Rg9C8JyxcbiAgICAgICAgNTogJy3Rg9C8JyxcbiAgICAgICAgNjogJy3Rg9C8JyxcbiAgICAgICAgNzogJy3Rg9C8JyxcbiAgICAgICAgODogJy3Rg9C8JyxcbiAgICAgICAgOTogJy3Rg9C8JyxcbiAgICAgICAgMTA6ICct0YPQvCcsXG4gICAgICAgIDEyOiAnLdGD0LwnLFxuICAgICAgICAxMzogJy3Rg9C8JyxcbiAgICAgICAgMjA6ICct0YPQvCcsXG4gICAgICAgIDMwOiAnLdGO0LwnLFxuICAgICAgICA0MDogJy3Rg9C8JyxcbiAgICAgICAgNTA6ICct0YPQvCcsXG4gICAgICAgIDYwOiAnLdGD0LwnLFxuICAgICAgICA3MDogJy3Rg9C8JyxcbiAgICAgICAgODA6ICct0YPQvCcsXG4gICAgICAgIDkwOiAnLdGD0LwnLFxuICAgICAgICAxMDA6ICct0YPQvCcsXG4gICAgfTtcblxuICAgIHZhciB0ZyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RnJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9GP0L3QstCw0YDQuF/RhNC10LLRgNCw0LvQuF/QvNCw0YDRgtC4X9Cw0L/RgNC10LvQuF/QvNCw0LnQuF/QuNGO0L3QuF/QuNGO0LvQuF/QsNCy0LPRg9GB0YLQuF/RgdC10L3RgtGP0LHRgNC4X9C+0LrRgtGP0LHRgNC4X9C90L7Rj9Cx0YDQuF/QtNC10LrQsNCx0YDQuCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn0Y/QvdCy0LDRgF/RhNC10LLRgNCw0Ltf0LzQsNGA0YJf0LDQv9GA0LXQu1/QvNCw0Llf0LjRjtC9X9C40Y7Qu1/QsNCy0LPRg9GB0YJf0YHQtdC90YLRj9Cx0YBf0L7QutGC0Y/QsdGAX9C90L7Rj9Cx0YBf0LTQtdC60LDQsdGAJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfRj9C90LJf0YTQtdCyX9C80LDRgF/QsNC/0YBf0LzQsNC5X9C40Y7QvV/QuNGO0Ltf0LDQstCzX9GB0LXQvV/QvtC60YJf0L3QvtGPX9C00LXQuicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfRj9C60YjQsNC90LHQtV/QtNGD0YjQsNC90LHQtV/RgdC10YjQsNC90LHQtV/Rh9C+0YDRiNCw0L3QsdC1X9C/0LDQvdK30YjQsNC90LHQtV/St9GD0LzRitCwX9GI0LDQvdCx0LUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfRj9GI0LFf0LTRiNCxX9GB0YjQsV/Rh9GI0LFf0L/RiNCxX9K30YPQvF/RiNC90LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0Y/RiF/QtNGIX9GB0Yhf0YfRiF/Qv9GIX9K30Lxf0YjQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vQmNC80YDTr9C3INGB0L7QsNGC0LhdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0KTQsNGA0LTQviDRgdC+0LDRgtC4XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9CU0LjRgNOv0Lcg0YHQvtCw0YLQuF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkW9C4XSBb0rPQsNGE0YLQsNC4INC+0Y/QvdC00LAg0YHQvtCw0YLQuF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkW9C4XSBb0rPQsNGE0YLQsNC4INCz0YPQt9Cw0YjRgtCwINGB0L7QsNGC0LhdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0LHQsNGK0LTQuCAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0L/QtdGIJyxcbiAgICAgICAgICAgIHM6ICfRj9C60YfQsNC90LQg0YHQvtC90LjRjycsXG4gICAgICAgICAgICBtOiAn0Y/QuiDQtNCw0pvQuNKb0LAnLFxuICAgICAgICAgICAgbW06ICclZCDQtNCw0pvQuNKb0LAnLFxuICAgICAgICAgICAgaDogJ9GP0Log0YHQvtCw0YInLFxuICAgICAgICAgICAgaGg6ICclZCDRgdC+0LDRgicsXG4gICAgICAgICAgICBkOiAn0Y/QuiDRgNOv0LcnLFxuICAgICAgICAgICAgZGQ6ICclZCDRgNOv0LcnLFxuICAgICAgICAgICAgTTogJ9GP0Log0LzQvtKzJyxcbiAgICAgICAgICAgIE1NOiAnJWQg0LzQvtKzJyxcbiAgICAgICAgICAgIHk6ICfRj9C6INGB0L7QuycsXG4gICAgICAgICAgICB5eTogJyVkINGB0L7QuycsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/RiNCw0LF80YHRg9Cx0rN80YDTr9C3fNCx0LXQs9C+0rMvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfRiNCw0LEnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfRgdGD0LHSsycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfRgNOv0LcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ9Cx0LXQs9C+0rMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YjQsNCxJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRgdGD0LHSsyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YDTr9C3JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQsdC10LPQvtKzJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRiNCw0LEnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNGD0Lx80Y7QvCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYSA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGIgPSBudW1iZXIgPj0gMTAwID8gMTAwIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoc3VmZml4ZXNbbnVtYmVyXSB8fCBzdWZmaXhlc1thXSB8fCBzdWZmaXhlc1tiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDF0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUaGFpIFt0aF1cbi8vISBhdXRob3IgOiBLcmlkc2FkYSBUaGFuYWJ1bHBvbmcgOiBodHRwczovL2dpdGh1Yi5jb20vc2lyblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRoID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGgnLCB7XG4gICAgICAgIG1vbnRoczogJ+C4oeC4geC4o+C4suC4hOC4oV/guIHguLjguKHguKDguLLguJ7guLHguJnguJjguYxf4Lih4Li14LiZ4Liy4LiE4LihX+C5gOC4oeC4qeC4suC4ouC4mV/guJ7guKTguKnguKDguLLguITguKFf4Lih4Li04LiW4Li44LiZ4Liy4Lii4LiZX+C4geC4o+C4geC4juC4suC4hOC4oV/guKrguLTguIfguKvguLLguITguKFf4LiB4Lix4LiZ4Lii4Liy4Lii4LiZX+C4leC4uOC4peC4suC4hOC4oV/guJ7guKTguKjguIjguLTguIHguLLguKLguJlf4LiY4Lix4LiZ4Lin4Liy4LiE4LihJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfguKEu4LiELl/guIEu4LieLl/guKHguLUu4LiELl/guYDguKEu4LiiLl/guJ4u4LiELl/guKHguLQu4LiiLl/guIEu4LiELl/guKou4LiELl/guIEu4LiiLl/guJUu4LiELl/guJ4u4LiiLl/guJgu4LiELicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+C4reC4suC4l+C4tOC4leC4ouC5jF/guIjguLHguJnguJfguKPguYxf4Lit4Lix4LiH4LiE4Liy4LijX+C4nuC4uOC4mF/guJ7guKTguKvguLHguKrguJrguJTguLVf4Lio4Li44LiB4Lij4LmMX+C5gOC4quC4suC4o+C5jCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+C4reC4suC4l+C4tOC4leC4ouC5jF/guIjguLHguJnguJfguKPguYxf4Lit4Lix4LiH4LiE4Liy4LijX+C4nuC4uOC4mF/guJ7guKTguKvguLHguKpf4Lio4Li44LiB4Lij4LmMX+C5gOC4quC4suC4o+C5jCcuc3BsaXQoJ18nKSwgLy8geWVzLCB0aHJlZSBjaGFyYWN0ZXJzIGRpZmZlcmVuY2VcbiAgICAgICAgd2Vla2RheXNNaW46ICfguK3guLIuX+C4iC5f4LitLl/guJ4uX+C4nuC4pC5f4LioLl/guKouJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIOC5gOC4p+C4peC4siBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICfguKfguLHguJlkZGRk4LiX4Li14LmIIEQgTU1NTSBZWVlZIOC5gOC4p+C4peC4siBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C4geC5iOC4reC4meC5gOC4l+C4teC5iOC4ouC4h3zguKvguKXguLHguIfguYDguJfguLXguYjguKLguIcvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+C4q+C4peC4seC4h+C5gOC4l+C4teC5iOC4ouC4hyc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfguIHguYjguK3guJnguYDguJfguLXguYjguKLguIcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C4q+C4peC4seC4h+C5gOC4l+C4teC5iOC4ouC4hyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+C4p+C4seC4meC4meC4teC5iSDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4Lie4Lij4Li44LmI4LiH4LiZ4Li14LmJIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkW+C4q+C4meC5ieC4siDguYDguKfguKXguLJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4LmA4Lih4Li34LmI4Lit4Lin4Liy4LiZ4LiZ4Li14LmJIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4Lin4Lix4LiZXWRkZGRb4LiX4Li14LmI4LmB4Lil4LmJ4LinIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfguK3guLXguIEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVz4LiX4Li14LmI4LmB4Lil4LmJ4LinJyxcbiAgICAgICAgICAgIHM6ICfguYTguKHguYjguIHguLXguYjguKfguLTguJnguLLguJfguLUnLFxuICAgICAgICAgICAgc3M6ICclZCDguKfguLTguJnguLLguJfguLUnLFxuICAgICAgICAgICAgbTogJzEg4LiZ4Liy4LiX4Li1JyxcbiAgICAgICAgICAgIG1tOiAnJWQg4LiZ4Liy4LiX4Li1JyxcbiAgICAgICAgICAgIGg6ICcxIOC4iuC4seC5iOC4p+C5guC4oeC4hycsXG4gICAgICAgICAgICBoaDogJyVkIOC4iuC4seC5iOC4p+C5guC4oeC4hycsXG4gICAgICAgICAgICBkOiAnMSDguKfguLHguJknLFxuICAgICAgICAgICAgZGQ6ICclZCDguKfguLHguJknLFxuICAgICAgICAgICAgdzogJzEg4Liq4Lix4Lib4LiU4Liy4Lir4LmMJyxcbiAgICAgICAgICAgIHd3OiAnJWQg4Liq4Lix4Lib4LiU4Liy4Lir4LmMJyxcbiAgICAgICAgICAgIE06ICcxIOC5gOC4lOC4t+C4reC4mScsXG4gICAgICAgICAgICBNTTogJyVkIOC5gOC4lOC4t+C4reC4mScsXG4gICAgICAgICAgICB5OiAnMSDguJvguLUnLFxuICAgICAgICAgICAgeXk6ICclZCDguJvguLUnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFR1cmttZW4gW3RrXVxuLy8hIGF1dGhvciA6IEF0YW15cmF0IEFiZHlyYWhtYW5vdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hdGFteXJhdGFiZHlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMTogXCInaW5qaVwiLFxuICAgICAgICA1OiBcIidpbmppXCIsXG4gICAgICAgIDg6IFwiJ2luamlcIixcbiAgICAgICAgNzA6IFwiJ2luamlcIixcbiAgICAgICAgODA6IFwiJ2luamlcIixcbiAgICAgICAgMjogXCInbmppXCIsXG4gICAgICAgIDc6IFwiJ25qaVwiLFxuICAgICAgICAyMDogXCInbmppXCIsXG4gICAgICAgIDUwOiBcIiduamlcIixcbiAgICAgICAgMzogXCInw7xuamlcIixcbiAgICAgICAgNDogXCInw7xuamlcIixcbiAgICAgICAgMTAwOiBcIifDvG5qaVwiLFxuICAgICAgICA2OiBcIiduanlcIixcbiAgICAgICAgOTogXCIndW5qeVwiLFxuICAgICAgICAxMDogXCIndW5qeVwiLFxuICAgICAgICAzMDogXCIndW5qeVwiLFxuICAgICAgICA2MDogXCIneW5qeVwiLFxuICAgICAgICA5MDogXCIneW5qeVwiLFxuICAgIH07XG5cbiAgICB2YXIgdGsgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0aycsIHtcbiAgICAgICAgbW9udGhzOiAnw51hbndhcl9GZXdyYWxfTWFydF9BcHJlbF9NYcO9X0nDvXVuX0nDvXVsX0F3Z3VzdF9TZW50w71hYnJfT2t0w71hYnJfTm/DvWFicl9EZWthYnInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnw51hbl9GZXdfTWFyX0Fwcl9NYcO9X0nDvW5fScO9bF9Bd2dfU2VuX09rdF9Ob8O9X0Rlaycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfDnWVrxZ9lbmJlX0R1xZ9lbmJlX1NpxZ9lbmJlX8OHYXLFn2VuYmVfUGVuxZ9lbmJlX0FubmFfxZ5lbmJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnw51la19EdcWfX1NpxZ9fw4dhcl9QZW5fQW5uX8WeZW4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnw51rX0TFn19TxZ9fw4dyX1BuX0FuX8Webicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tidWfDvG4gc2FnYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbZXJ0aXIgc2FnYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW2luZGlraV0gZGRkZCBbc2FnYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZMO8w71uXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tnZcOnZW5dIGRkZGQgW3NhZ2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHNvxYgnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMO2xYgnLFxuICAgICAgICAgICAgczogJ2Jpcm7DpMOnZSBzZWt1bnQnLFxuICAgICAgICAgICAgbTogJ2JpciBtaW51dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0JyxcbiAgICAgICAgICAgIGg6ICdiaXIgc2FnYXQnLFxuICAgICAgICAgICAgaGg6ICclZCBzYWdhdCcsXG4gICAgICAgICAgICBkOiAnYmlyIGfDvG4nLFxuICAgICAgICAgICAgZGQ6ICclZCBnw7xuJyxcbiAgICAgICAgICAgIE06ICdiaXIgYcO9JyxcbiAgICAgICAgICAgIE1NOiAnJWQgYcO9JyxcbiAgICAgICAgICAgIHk6ICdiaXIgw715bCcsXG4gICAgICAgICAgICB5eTogJyVkIMO9eWwnLFxuICAgICAgICB9LFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRG8nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0REJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHplcm9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBcIid1bmp5XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAobnVtYmVyICUgMTAwKSAtIGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0gfHwgc3VmZml4ZXNbY10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGs7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGFnYWxvZyAoUGhpbGlwcGluZXMpIFt0bC1waF1cbi8vISBhdXRob3IgOiBEYW4gSGFnbWFuIDogaHR0cHM6Ly9naXRodWIuY29tL2hhZ21hbmRhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRsUGggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0bC1waCcsIHtcbiAgICAgICAgbW9udGhzOiAnRW5lcm9fUGVicmVyb19NYXJzb19BYnJpbF9NYXlvX0h1bnlvX0h1bHlvX0Fnb3N0b19TZXR5ZW1icmVfT2t0dWJyZV9Ob2J5ZW1icmVfRGlzeWVtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0VuZV9QZWJfTWFyX0Ficl9NYXlfSHVuX0h1bF9BZ29fU2V0X09rdF9Ob2JfRGlzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0xpbmdnb19MdW5lc19NYXJ0ZXNfTWl5ZXJrdWxlc19IdXdlYmVzX0JpeWVybmVzX1NhYmFkbycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0xpbl9MdW5fTWFyX01peV9IdXdfQml5X1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdMaV9MdV9NYV9NaV9IdV9CaV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdNTS9EL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnTU1NTSBELCBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIERELCBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdMVCBbbmdheW9uZyBhcmF3XScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0J1a2FzIG5nXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ0xUIFtzYSBzdXN1bm9kIG5hXSBkZGRkJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdMVCBba2FoYXBvbl0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdMVCBbbm9vbmcgbmFrYXJhYW5nXSBkZGRkJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnc2EgbG9vYiBuZyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYW5nIG5ha2FsaXBhcycsXG4gICAgICAgICAgICBzOiAnaWxhbmcgc2VndW5kbycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG8nLFxuICAgICAgICAgICAgbTogJ2lzYW5nIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0bycsXG4gICAgICAgICAgICBoOiAnaXNhbmcgb3JhcycsXG4gICAgICAgICAgICBoaDogJyVkIG9yYXMnLFxuICAgICAgICAgICAgZDogJ2lzYW5nIGFyYXcnLFxuICAgICAgICAgICAgZGQ6ICclZCBhcmF3JyxcbiAgICAgICAgICAgIE06ICdpc2FuZyBidXdhbicsXG4gICAgICAgICAgICBNTTogJyVkIGJ1d2FuJyxcbiAgICAgICAgICAgIHk6ICdpc2FuZyB0YW9uJyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGFvbicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0bFBoO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEtsaW5nb24gW3RsaF1cbi8vISBhdXRob3IgOiBEb21pbmlrYSBLcnVrIDogaHR0cHM6Ly9naXRodWIuY29tL2FtYXJhbnRocm9zZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG51bWJlcnNOb3VucyA9ICdwYWdoX3dh4oCZX2NoYeKAmV93ZWpfbG9TX3ZhZ2hfamF2X1NvY2hfY2hvcmdoX0h1dCcuc3BsaXQoJ18nKTtcblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZUZ1dHVyZShvdXRwdXQpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBvdXRwdXQ7XG4gICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgb3V0cHV0LmluZGV4T2YoJ2phaicpICE9PSAtMVxuICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnbGVTJ1xuICAgICAgICAgICAgICAgIDogb3V0cHV0LmluZGV4T2YoJ2phcicpICE9PSAtMVxuICAgICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICd3YVEnXG4gICAgICAgICAgICAgICAgICA6IG91dHB1dC5pbmRleE9mKCdESVMnKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICduZW0nXG4gICAgICAgICAgICAgICAgICAgIDogdGltZSArICcgcElxJztcbiAgICAgICAgcmV0dXJuIHRpbWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlUGFzdChvdXRwdXQpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBvdXRwdXQ7XG4gICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgb3V0cHV0LmluZGV4T2YoJ2phaicpICE9PSAtMVxuICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnSHXigJknXG4gICAgICAgICAgICAgICAgOiBvdXRwdXQuaW5kZXhPZignamFyJykgIT09IC0xXG4gICAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ3dlbidcbiAgICAgICAgICAgICAgICAgIDogb3V0cHV0LmluZGV4T2YoJ0RJUycpICE9PSAtMVxuICAgICAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ2JlbidcbiAgICAgICAgICAgICAgICAgICAgOiB0aW1lICsgJyByZXQnO1xuICAgICAgICByZXR1cm4gdGltZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBudW1iZXJOb3VuID0gbnVtYmVyQXNOb3VuKG51bWJlcik7XG4gICAgICAgIHN3aXRjaCAoc3RyaW5nKSB7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIGx1cCc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIHR1cCc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIHJlcCc7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIGphaic7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIGphcic7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck5vdW4gKyAnIERJUyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBudW1iZXJBc05vdW4obnVtYmVyKSB7XG4gICAgICAgIHZhciBodW5kcmVkID0gTWF0aC5mbG9vcigobnVtYmVyICUgMTAwMCkgLyAxMDApLFxuICAgICAgICAgICAgdGVuID0gTWF0aC5mbG9vcigobnVtYmVyICUgMTAwKSAvIDEwKSxcbiAgICAgICAgICAgIG9uZSA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgd29yZCA9ICcnO1xuICAgICAgICBpZiAoaHVuZHJlZCA+IDApIHtcbiAgICAgICAgICAgIHdvcmQgKz0gbnVtYmVyc05vdW5zW2h1bmRyZWRdICsgJ3ZhdGxoJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVuID4gMCkge1xuICAgICAgICAgICAgd29yZCArPSAod29yZCAhPT0gJycgPyAnICcgOiAnJykgKyBudW1iZXJzTm91bnNbdGVuXSArICdtYUgnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbmUgPiAwKSB7XG4gICAgICAgICAgICB3b3JkICs9ICh3b3JkICE9PSAnJyA/ICcgJyA6ICcnKSArIG51bWJlcnNOb3Vuc1tvbmVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3b3JkID09PSAnJyA/ICdwYWdoJyA6IHdvcmQ7XG4gICAgfVxuXG4gICAgdmFyIHRsaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RsaCcsIHtcbiAgICAgICAgbW9udGhzOiAndGVyYeKAmSBqYXIgd2HigJlfdGVyYeKAmSBqYXIgY2hh4oCZX3RlcmHigJkgamFyIHdlal90ZXJh4oCZIGphciBsb1NfdGVyYeKAmSBqYXIgdmFnaF90ZXJh4oCZIGphciBqYXZfdGVyYeKAmSBqYXIgU29jaF90ZXJh4oCZIGphciBjaG9yZ2hfdGVyYeKAmSBqYXIgSHV0X3RlcmHigJkgamFyIHdh4oCZbWFIX3RlcmHigJkgamFyIHdh4oCZbWFIIHdh4oCZX3RlcmHigJkgamFyIHdh4oCZbWFIIGNoYeKAmScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFyIHdh4oCZX2phciBjaGHigJlfamFyIHdlal9qYXIgbG9TX2phciB2YWdoX2phciBqYXZfamFyIFNvY2hfamFyIGNob3JnaF9qYXIgSHV0X2phciB3YeKAmW1hSF9qYXIgd2HigJltYUggd2HigJlfamFyIHdh4oCZbWFIIGNoYeKAmScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2xvam1JdGphal9EYVNqYWpfcG92amFqX2doSXRsaGphal9sb2doamFqX2J1cWphal9naEluamFqJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OlxuICAgICAgICAgICAgJ2xvam1JdGphal9EYVNqYWpfcG92amFqX2doSXRsaGphal9sb2doamFqX2J1cWphal9naEluamFqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjpcbiAgICAgICAgICAgICdsb2ptSXRqYWpfRGFTamFqX3Bvdmphal9naEl0bGhqYWpfbG9naGphal9idXFqYWpfZ2hJbmphaicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tEYUhqYWpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbd2HigJlsZVNdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnTExMJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbd2HigJlIdeKAmV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdMTEwnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IHRyYW5zbGF0ZUZ1dHVyZSxcbiAgICAgICAgICAgIHBhc3Q6IHRyYW5zbGF0ZVBhc3QsXG4gICAgICAgICAgICBzOiAncHVTIGx1cCcsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogJ3dh4oCZIHR1cCcsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogJ3dh4oCZIHJlcCcsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogJ3dh4oCZIGphaicsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogJ3dh4oCZIGphcicsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogJ3dh4oCZIERJUycsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRsaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUdXJraXNoIFt0cl1cbi8vISBhdXRob3JzIDogRXJoYW4gR3VuZG9nYW4gOiBodHRwczovL2dpdGh1Yi5jb20vZXJoYW5ndW5kb2dhbixcbi8vISAgICAgICAgICAgQnVyYWsgWWnEn2l0IEtheWE6IGh0dHBzOi8vZ2l0aHViLmNvbS9CWUtcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMTogXCInaW5jaVwiLFxuICAgICAgICA1OiBcIidpbmNpXCIsXG4gICAgICAgIDg6IFwiJ2luY2lcIixcbiAgICAgICAgNzA6IFwiJ2luY2lcIixcbiAgICAgICAgODA6IFwiJ2luY2lcIixcbiAgICAgICAgMjogXCInbmNpXCIsXG4gICAgICAgIDc6IFwiJ25jaVwiLFxuICAgICAgICAyMDogXCInbmNpXCIsXG4gICAgICAgIDUwOiBcIiduY2lcIixcbiAgICAgICAgMzogXCInw7xuY8O8XCIsXG4gICAgICAgIDQ6IFwiJ8O8bmPDvFwiLFxuICAgICAgICAxMDA6IFwiJ8O8bmPDvFwiLFxuICAgICAgICA2OiBcIiduY8SxXCIsXG4gICAgICAgIDk6IFwiJ3VuY3VcIixcbiAgICAgICAgMTA6IFwiJ3VuY3VcIixcbiAgICAgICAgMzA6IFwiJ3VuY3VcIixcbiAgICAgICAgNjA6IFwiJ8SxbmPEsVwiLFxuICAgICAgICA5MDogXCInxLFuY8SxXCIsXG4gICAgfTtcblxuICAgIHZhciB0ciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RyJywge1xuICAgICAgICBtb250aHM6ICdPY2FrX8WedWJhdF9NYXJ0X05pc2FuX01hecSxc19IYXppcmFuX1RlbW11el9BxJ91c3Rvc19FeWzDvGxfRWtpbV9LYXPEsW1fQXJhbMSxaycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdPY2FfxZ51Yl9NYXJfTmlzX01heV9IYXpfVGVtX0HEn3VfRXlsX0VraV9LYXNfQXJhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1BhemFyX1BhemFydGVzaV9TYWzEsV/Dh2FyxZ9hbWJhX1BlcsWfZW1iZV9DdW1hX0N1bWFydGVzaScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1Bhel9QenRfU2FsX8OHYXJfUGVyX0N1bV9DbXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnUHpfUHRfU2Ffw4dhX1BlX0N1X0N0Jy5zcGxpdCgnXycpLFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ8O2w7YnIDogJ8OWw5YnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfDtnMnIDogJ8OWUyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/DtsO2fMOWw5Z8w7ZzfMOWUy8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAnw7ZzJyB8fCBpbnB1dCA9PT0gJ8OWUyc7XG4gICAgICAgIH0sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbYnVnw7xuIHNhYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbeWFyxLFuIHNhYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW2dlbGVjZWtdIGRkZGQgW3NhYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZMO8bl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbZ2XDp2VuXSBkZGRkIFtzYWF0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIHNvbnJhJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDDtm5jZScsXG4gICAgICAgICAgICBzOiAnYmlya2HDpyBzYW5peWUnLFxuICAgICAgICAgICAgc3M6ICclZCBzYW5peWUnLFxuICAgICAgICAgICAgbTogJ2JpciBkYWtpa2EnLFxuICAgICAgICAgICAgbW06ICclZCBkYWtpa2EnLFxuICAgICAgICAgICAgaDogJ2JpciBzYWF0JyxcbiAgICAgICAgICAgIGhoOiAnJWQgc2FhdCcsXG4gICAgICAgICAgICBkOiAnYmlyIGfDvG4nLFxuICAgICAgICAgICAgZGQ6ICclZCBnw7xuJyxcbiAgICAgICAgICAgIHc6ICdiaXIgaGFmdGEnLFxuICAgICAgICAgICAgd3c6ICclZCBoYWZ0YScsXG4gICAgICAgICAgICBNOiAnYmlyIGF5JyxcbiAgICAgICAgICAgIE1NOiAnJWQgYXknLFxuICAgICAgICAgICAgeTogJ2JpciB5xLFsJyxcbiAgICAgICAgICAgIHl5OiAnJWQgecSxbCcsXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEbyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgemVyb1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIFwiJ8SxbmPEsVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICBiID0gKG51bWJlciAlIDEwMCkgLSBhLFxuICAgICAgICAgICAgICAgICAgICAgICAgYyA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdIHx8IHN1ZmZpeGVzW2NdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRhbG9zc2FuIFt0emxdXG4vLyEgYXV0aG9yIDogUm9iaW4gdmFuIGRlciBWbGlldCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JpbjB2YW4wZGVyMHZcbi8vISBhdXRob3IgOiBJdXN0w6wgQ2FudW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIC8vIEFmdGVyIHRoZSB5ZWFyIHRoZXJlIHNob3VsZCBiZSBhIHNsYXNoIGFuZCB0aGUgYW1vdW50IG9mIHllYXJzIHNpbmNlIERlY2VtYmVyIDI2LCAxOTc5IGluIFJvbWFuIG51bWVyYWxzLlxuICAgIC8vIFRoaXMgaXMgY3VycmVudGx5IHRvbyBkaWZmaWN1bHQgKG1heWJlIGV2ZW4gaW1wb3NzaWJsZSkgdG8gYWRkLlxuICAgIHZhciB0emwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0emwnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcl9GZXZyYWdsaF9NYXLDp19BdnLDr3VfTWFpX0fDvG5fSnVsaWFfR3VzY2h0X1NldGVtdmFyX0xpc3RvcMOkdHNfTm9lbXZhcl9aZWNlbXZhcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmV2X01hcl9BdnJfTWFpX0fDvG5fSnVsX0d1c19TZXRfTGlzX05vZV9aZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU8O6bGFkaV9Mw7puZcOnaV9NYWl0emlfTcOhcmN1cmlfWGjDumFkaV9WacOpbmVyw6dpX1PDoXR1cmknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTw7psX0zDum5fTWFpX03DoXJfWGjDul9WacOpX1PDoXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU8O6X0zDul9NYV9Nw6FfWGhfVmlfU8OhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISC5tbScsXG4gICAgICAgICAgICBMVFM6ICdISC5tbS5zcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gW2RhbGxhc10gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFtkYWxsYXNdIFlZWVkgSEgubW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIFtsaV0gRC4gTU1NTSBbZGFsbGFzXSBZWVlZIEhILm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2RcXCdvfGRcXCdhL2ksXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiZCdvXCIgPT09IGlucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyBcImQnb1wiIDogXCJEJ09cIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyBcImQnYVwiIDogXCJEJ0FcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbb3hoaSDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tkZW3DoCDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpZWlyaSDDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbc8O8ciBlbF0gZGRkZCBbbGFzdGV1IMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ29zcHJlaSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnamElcycsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgczogWyd2aWVuc2FzIHNlY3VuZHMnLCBcIidpZW5zYXMgc2VjdW5kc1wiXSxcbiAgICAgICAgICAgIHNzOiBbbnVtYmVyICsgJyBzZWN1bmRzJywgJycgKyBudW1iZXIgKyAnIHNlY3VuZHMnXSxcbiAgICAgICAgICAgIG06IFtcIiduIG3DrXV0XCIsIFwiJ2llbnMgbcOtdXRcIl0sXG4gICAgICAgICAgICBtbTogW251bWJlciArICcgbcOtdXRzJywgJycgKyBudW1iZXIgKyAnIG3DrXV0cyddLFxuICAgICAgICAgICAgaDogW1wiJ24gw75vcmFcIiwgXCInaWVuc2Egw75vcmFcIl0sXG4gICAgICAgICAgICBoaDogW251bWJlciArICcgw75vcmFzJywgJycgKyBudW1iZXIgKyAnIMO+b3JhcyddLFxuICAgICAgICAgICAgZDogW1wiJ24geml1YVwiLCBcIidpZW5zYSB6aXVhXCJdLFxuICAgICAgICAgICAgZGQ6IFtudW1iZXIgKyAnIHppdWFzJywgJycgKyBudW1iZXIgKyAnIHppdWFzJ10sXG4gICAgICAgICAgICBNOiBbXCInbiBtZXNcIiwgXCInaWVucyBtZXNcIl0sXG4gICAgICAgICAgICBNTTogW251bWJlciArICcgbWVzZW4nLCAnJyArIG51bWJlciArICcgbWVzZW4nXSxcbiAgICAgICAgICAgIHk6IFtcIiduIGFyXCIsIFwiJ2llbnMgYXJcIl0sXG4gICAgICAgICAgICB5eTogW251bWJlciArICcgYXJzJywgJycgKyBudW1iZXIgKyAnIGFycyddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXNGdXR1cmVcbiAgICAgICAgICAgID8gZm9ybWF0W2tleV1bMF1cbiAgICAgICAgICAgIDogd2l0aG91dFN1ZmZpeFxuICAgICAgICAgICAgICA/IGZvcm1hdFtrZXldWzBdXG4gICAgICAgICAgICAgIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHR6bDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDZW50cmFsIEF0bGFzIFRhbWF6aWdodCBMYXRpbiBbdHptLWxhdG5dXG4vLyEgYXV0aG9yIDogQWJkZWwgU2FpZCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hYmRlbHNhaWRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0em1MYXRuID0gbW9tZW50LmRlZmluZUxvY2FsZSgndHptLWxhdG4nLCB7XG4gICAgICAgIG1vbnRoczogJ2lubmF5cl9icsukYXlyy6RfbWFyy6Rzy6RfaWJyaXJfbWF5eXdfeXdueXdfeXdseXd6X8mjd8WhdF/FoXd0YW5iaXJfa3TLpHdicsukX253d2FuYmlyX2R3am5iaXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2lubmF5cl9icsukYXlyy6RfbWFyy6Rzy6RfaWJyaXJfbWF5eXdfeXdueXdfeXdseXd6X8mjd8WhdF/FoXd0YW5iaXJfa3TLpHdicsukX253d2FuYmlyX2R3am5iaXInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICdhc2FtYXNfYXluYXNfYXNpbmFzX2FrcmFzX2Frd2FzX2FzaW13YXNfYXNp4biNeWFzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnYXNhbWFzX2F5bmFzX2FzaW5hc19ha3Jhc19ha3dhc19hc2ltd2FzX2FzaeG4jXlhcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdhc2FtYXNfYXluYXNfYXNpbmFzX2FrcmFzX2Frd2FzX2FzaW13YXNfYXNp4biNeWFzJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbYXNka2ggZ10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1thc2thIGddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbZ10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1thc3NhbnQgZ10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtnXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhZGtoIHMgeWFuICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICd5YW4gJXMnLFxuICAgICAgICAgICAgczogJ2ltaWsnLFxuICAgICAgICAgICAgc3M6ICclZCBpbWlrJyxcbiAgICAgICAgICAgIG06ICdtaW514biNJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludeG4jScsXG4gICAgICAgICAgICBoOiAnc2HJm2EnLFxuICAgICAgICAgICAgaGg6ICclZCB0YXNzYcmbaW4nLFxuICAgICAgICAgICAgZDogJ2FzcycsXG4gICAgICAgICAgICBkZDogJyVkIG9zc2FuJyxcbiAgICAgICAgICAgIE06ICdheW93cicsXG4gICAgICAgICAgICBNTTogJyVkIGl5eWlybicsXG4gICAgICAgICAgICB5OiAnYXNnYXMnLFxuICAgICAgICAgICAgeXk6ICclZCBpc2dhc24nLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDEyLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxMnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHR6bUxhdG47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2VudHJhbCBBdGxhcyBUYW1hemlnaHQgW3R6bV1cbi8vISBhdXRob3IgOiBBYmRlbCBTYWlkIDogaHR0cHM6Ly9naXRodWIuY29tL2FiZGVsc2FpZFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHR6bSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3R6bScsIHtcbiAgICAgICAgbW9udGhzOiAn4rWJ4rWP4rWP4rSw4rWi4rWUX+K0seK1leK0sOK1ouK1lV/itY7itLDitZXitZpf4rWJ4rSx4rWU4rWJ4rWUX+K1juK0sOK1ouK1ouK1k1/itaLitZPitY/itaLitZNf4rWi4rWT4rWN4rWi4rWT4rWjX+K1luK1k+K1m+K1nF/itZvitZPitZzitLDitY/itLHitYnitZRf4rS94rWf4rWT4rSx4rWVX+K1j+K1k+K1oeK0sOK1j+K0seK1ieK1lF/itLfitZPitYritY/itLHitYnitZQnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+K1ieK1j+K1j+K0sOK1ouK1lF/itLHitZXitLDitaLitZVf4rWO4rSw4rWV4rWaX+K1ieK0seK1lOK1ieK1lF/itY7itLDitaLitaLitZNf4rWi4rWT4rWP4rWi4rWTX+K1ouK1k+K1jeK1ouK1k+K1o1/itZbitZPitZvitZxf4rWb4rWT4rWc4rSw4rWP4rSx4rWJ4rWUX+K0veK1n+K1k+K0seK1lV/itY/itZPitaHitLDitY/itLHitYnitZRf4rS34rWT4rWK4rWP4rSx4rWJ4rWUJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn4rSw4rWZ4rSw4rWO4rSw4rWZX+K0sOK1ouK1j+K0sOK1mV/itLDitZnitYnitY/itLDitZlf4rSw4rS94rWU4rSw4rWZX+K0sOK0veK1oeK0sOK1mV/itLDitZnitYnitY7itaHitLDitZlf4rSw4rWZ4rWJ4rS54rWi4rSw4rWZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4rSw4rWZ4rSw4rWO4rSw4rWZX+K0sOK1ouK1j+K0sOK1mV/itLDitZnitYnitY/itLDitZlf4rSw4rS94rWU4rSw4rWZX+K0sOK0veK1oeK0sOK1mV/itLDitZnitYnitY7itaHitLDitZlf4rSw4rWZ4rWJ4rS54rWi4rSw4rWZJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+K0sOK1meK0sOK1juK0sOK1mV/itLDitaLitY/itLDitZlf4rSw4rWZ4rWJ4rWP4rSw4rWZX+K0sOK0veK1lOK0sOK1mV/itLDitL3itaHitLDitZlf4rSw4rWZ4rWJ4rWO4rWh4rSw4rWZX+K0sOK1meK1ieK0ueK1ouK0sOK1mScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+K0sOK1meK0t+K1hSDitLRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4rSw4rWZ4rS94rSwIOK0tF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvitLRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4rSw4rWa4rSw4rWP4rWcIOK0tF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvitLRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn4rS34rSw4rS34rWFIOK1mSDitaLitLDitY8gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ+K1ouK0sOK1jyAlcycsXG4gICAgICAgICAgICBzOiAn4rWJ4rWO4rWJ4rS9JyxcbiAgICAgICAgICAgIHNzOiAnJWQg4rWJ4rWO4rWJ4rS9JyxcbiAgICAgICAgICAgIG06ICfitY7itYnitY/itZPitLonLFxuICAgICAgICAgICAgbW06ICclZCDitY7itYnitY/itZPitLonLFxuICAgICAgICAgICAgaDogJ+K1meK0sOK1hOK0sCcsXG4gICAgICAgICAgICBoaDogJyVkIOK1nOK0sOK1meK1meK0sOK1hOK1ieK1jycsXG4gICAgICAgICAgICBkOiAn4rSw4rWZ4rWZJyxcbiAgICAgICAgICAgIGRkOiAnJWQgb+K1meK1meK0sOK1jycsXG4gICAgICAgICAgICBNOiAn4rSw4rWib+K1k+K1lCcsXG4gICAgICAgICAgICBNTTogJyVkIOK1ieK1ouK1ouK1ieK1lOK1jycsXG4gICAgICAgICAgICB5OiAn4rSw4rWZ4rSz4rSw4rWZJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4rWJ4rWZ4rSz4rSw4rWZ4rWPJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0em07XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVXlnaHVyIChDaGluYSkgW3VnLWNuXVxuLy8hIGF1dGhvcjogYm95YXEgOiBodHRwczovL2dpdGh1Yi5jb20vYm95YXFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB1Z0NuID0gbW9tZW50LmRlZmluZUxvY2FsZSgndWctY24nLCB7XG4gICAgICAgIG1vbnRoczogJ9mK2KfZhtuL2KfYsV/ZgduQ24vYsdin2YRf2YXYp9ix2Kpf2KbYp9m+2LHbkNmEX9mF2KfZil/YptmJ2Yrbh9mGX9im2YnZituH2YRf2KbYp9uL2Lrbh9iz2Kpf2LPbkNmG2Krbldio2YnYsV/YptuG2YPYqtuV2KjZidixX9mG2YjZitin2KjZidixX9iv25DZg9in2KjZidixJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfZitin2Ybbi9in2LFf2YHbkNuL2LHYp9mEX9mF2KfYsdiqX9im2KfZvtix25DZhF/Zhdin2Ypf2KbZidmK24fZhl/YptmJ2Yrbh9mEX9im2Kfbi9i624fYs9iqX9iz25DZhtiq25XYqNmJ2LFf2KbbhtmD2Krbldio2YnYsV/ZhtmI2YrYp9io2YnYsV/Yr9uQ2YPYp9io2YnYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9mK25XZg9i025XZhtio25Vf2K/biNi025XZhtio25Vf2LPbldmK2LTbldmG2KjblV/ahtin2LHYtNuV2YbYqNuVX9m+25XZiti025XZhtio25Vf2KzbiNmF25Vf2LTbldmG2KjblScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9mK25Vf2K/biF/Ys9uVX9qG2Kdf2b7blV/YrNuIX9i025UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2YrblV/Yr9uIX9iz25Vf2obYp1/ZvtuVX9is24hf2LTblScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZLdmK2YnZhNmJTS3Yptin2YrZhtmJ2q1ELdmD24jZhtmJJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkt2YrZidmE2YlNLdim2KfZitmG2YnarUQt2YPbiNmG2YnYjCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZNiMIFlZWVkt2YrZidmE2YlNLdim2KfZitmG2YnarUQt2YPbiNmG2YnYjCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/ZituQ2LHZidmFINmD25DahtuVfNiz25XavtuV2LF82obbiNi02KrZidmGINio24fYsduH2YZ82obbiNi0fNqG24jYtNiq2YnZhiDZg9uQ2YrZidmGfNmD25Xahi8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ9mK25DYsdmJ2YUg2YPbkNqG25UnIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfYs9uV2r7bldixJyB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn2obbiNi02KrZidmGINio24fYsduH2YYnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfahtuI2LTYqtmJ2YYg2YPbkNmK2YnZhicgfHwgbWVyaWRpZW0gPT09ICfZg9uV2oYnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgdmFyIGhtID0gaG91ciAqIDEwMCArIG1pbnV0ZTtcbiAgICAgICAgICAgIGlmIChobSA8IDYwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YrbkNix2YnZhSDZg9uQ2obblSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYs9uV2r7bldixJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMTMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfahtuI2LTYqtmJ2YYg2Kjbh9ix24fZhic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2obbiNi0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfahtuI2LTYqtmJ2YYg2YPbkNmK2YnZhic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YPbldqGJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KjbiNqv24jZhiDYs9in2KbbldiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9im25XYqtuVINiz2KfYptuV2KpdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW9mD25DZhNuV2LHZg9mJXSBkZGRkIFvYs9in2KbbldiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9iq24bZhtuI2q/biNmGXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vYptin2YTYr9mJ2YbZgtmJXSBkZGRkIFvYs9in2KbbldiqXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINmD25DZitmJ2YYnLFxuICAgICAgICAgICAgcGFzdDogJyVzINio24fYsduH2YYnLFxuICAgICAgICAgICAgczogJ9mG25XahtqG25Ug2LPbkNmD2YjZhtiqJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2LPbkNmD2YjZhtiqJyxcbiAgICAgICAgICAgIG06ICfYqNmJ2LEg2YXZidmG24fYqicsXG4gICAgICAgICAgICBtbTogJyVkINmF2YnZhtuH2KonLFxuICAgICAgICAgICAgaDogJ9io2YnYsSDYs9in2KbbldiqJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2LPYp9im25XYqicsXG4gICAgICAgICAgICBkOiAn2KjZidixINmD24jZhicsXG4gICAgICAgICAgICBkZDogJyVkINmD24jZhicsXG4gICAgICAgICAgICBNOiAn2KjZidixINim2KfZiicsXG4gICAgICAgICAgICBNTTogJyVkINim2KfZiicsXG4gICAgICAgICAgICB5OiAn2KjZidixINmK2YnZhCcsXG4gICAgICAgICAgICB5eTogJyVkINmK2YnZhCcsXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KC3Zg9uI2YbZiXwt2KbYp9mKfC3avtuV2b7YqtuVKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Zg9uI2YbZiSc7XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdq+25XZvtiq25UnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgLy8gR0IvVCA3NDA4LTE5OTTjgIrmlbDmja7lhYPlkozkuqTmjaLmoLzlvI/Ct+S/oeaBr+S6pOaNosK35pel5pyf5ZKM5pe26Ze06KGo56S65rOV44CL5LiOSVNPIDg2MDE6MTk4OOetieaViFxuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVnQ247XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVWtyYWluaWFuIFt1a11cbi8vISBhdXRob3IgOiB6ZW1sYW5pbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS96ZW1sYW5pblxuLy8hIEF1dGhvciA6IE1lbmVsaW9uIEVsZW5zw7psZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwbHVyYWwod29yZCwgbnVtKSB7XG4gICAgICAgIHZhciBmb3JtcyA9IHdvcmQuc3BsaXQoJ18nKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDEwID09PSAxICYmIG51bSAlIDEwMCAhPT0gMTFcbiAgICAgICAgICAgID8gZm9ybXNbMF1cbiAgICAgICAgICAgIDogbnVtICUgMTAgPj0gMiAmJiBudW0gJSAxMCA8PSA0ICYmIChudW0gJSAxMDAgPCAxMCB8fCBudW0gJSAxMDAgPj0gMjApXG4gICAgICAgICAgICAgID8gZm9ybXNbMV1cbiAgICAgICAgICAgICAgOiBmb3Jtc1syXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFBsdXJhbChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgc3M6IHdpdGhvdXRTdWZmaXggPyAn0YHQtdC60YPQvdC00LBf0YHQtdC60YPQvdC00Lhf0YHQtdC60YPQvdC0JyA6ICfRgdC10LrRg9C90LTRg1/RgdC10LrRg9C90LTQuF/RgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbW06IHdpdGhvdXRTdWZmaXggPyAn0YXQstC40LvQuNC90LBf0YXQstC40LvQuNC90Lhf0YXQstC40LvQuNC9JyA6ICfRhdCy0LjQu9C40L3Rg1/RhdCy0LjQu9C40L3QuF/RhdCy0LjQu9C40L0nLFxuICAgICAgICAgICAgaGg6IHdpdGhvdXRTdWZmaXggPyAn0LPQvtC00LjQvdCwX9Cz0L7QtNC40L3QuF/Qs9C+0LTQuNC9JyA6ICfQs9C+0LTQuNC90YNf0LPQvtC00LjQvdC4X9Cz0L7QtNC40L0nLFxuICAgICAgICAgICAgZGQ6ICfQtNC10L3RjF/QtNC90ZZf0LTQvdGW0LInLFxuICAgICAgICAgICAgTU06ICfQvNGW0YHRj9GG0Yxf0LzRltGB0Y/RhtGWX9C80ZbRgdGP0YbRltCyJyxcbiAgICAgICAgICAgIHl5OiAn0YDRltC6X9GA0L7QutC4X9GA0L7QutGW0LInLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoa2V5ID09PSAnbScpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9GF0LLQuNC70LjQvdCwJyA6ICfRhdCy0LjQu9C40L3Rgyc7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaCcpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9Cz0L7QtNC40L3QsCcgOiAn0LPQvtC00LjQvdGDJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBwbHVyYWwoZm9ybWF0W2tleV0sICtudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzQ2FzZVJlcGxhY2UobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciB3ZWVrZGF5cyA9IHtcbiAgICAgICAgICAgICAgICBub21pbmF0aXZlOlxuICAgICAgICAgICAgICAgICAgICAn0L3QtdC00ZbQu9GPX9C/0L7QvdC10LTRltC70L7Qul/QstGW0LLRgtC+0YDQvtC6X9GB0LXRgNC10LTQsF/Rh9C10YLQstC10YBf0L/igJnRj9GC0L3QuNGG0Y9f0YHRg9Cx0L7RgtCwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGFjY3VzYXRpdmU6XG4gICAgICAgICAgICAgICAgICAgICfQvdC10LTRltC70Y5f0L/QvtC90LXQtNGW0LvQvtC6X9Cy0ZbQstGC0L7RgNC+0Lpf0YHQtdGA0LXQtNGDX9GH0LXRgtCy0LXRgF/Qv+KAmdGP0YLQvdC40YbRjl/RgdGD0LHQvtGC0YMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZ2VuaXRpdmU6XG4gICAgICAgICAgICAgICAgICAgICfQvdC10LTRltC70ZZf0L/QvtC90LXQtNGW0LvQutCwX9Cy0ZbQstGC0L7RgNC60LBf0YHQtdGA0LXQtNC4X9GH0LXRgtCy0LXRgNCz0LBf0L/igJnRj9GC0L3QuNGG0ZZf0YHRg9Cx0L7RgtC4Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5vdW5DYXNlO1xuXG4gICAgICAgIGlmIChtID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheXNbJ25vbWluYXRpdmUnXVxuICAgICAgICAgICAgICAgIC5zbGljZSgxLCA3KVxuICAgICAgICAgICAgICAgIC5jb25jYXQod2Vla2RheXNbJ25vbWluYXRpdmUnXS5zbGljZSgwLCAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla2RheXNbJ25vbWluYXRpdmUnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vdW5DYXNlID0gLyhcXFtb0JLQstCj0YNdXFxdKSA/ZGRkZC8udGVzdChmb3JtYXQpXG4gICAgICAgICAgICA/ICdhY2N1c2F0aXZlJ1xuICAgICAgICAgICAgOiAvXFxbPyg/OtC80LjQvdGD0LvQvtGXfNC90LDRgdGC0YPQv9C90L7Rlyk/ID9cXF0gP2RkZGQvLnRlc3QoZm9ybWF0KVxuICAgICAgICAgICAgICA/ICdnZW5pdGl2ZSdcbiAgICAgICAgICAgICAgOiAnbm9taW5hdGl2ZSc7XG4gICAgICAgIHJldHVybiB3ZWVrZGF5c1tub3VuQ2FzZV1bbS5kYXkoKV07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKHN0cikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ciArICfQvicgKyAodGhpcy5ob3VycygpID09PSAxMSA/ICfQsScgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHVrID0gbW9tZW50LmRlZmluZUxvY2FsZSgndWsnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAn0YHRltGH0L3Rj1/Qu9GO0YLQvtCz0L5f0LHQtdGA0LXQt9C90Y9f0LrQstGW0YLQvdGPX9GC0YDQsNCy0L3Rj1/Rh9C10YDQstC90Y9f0LvQuNC/0L3Rj1/RgdC10YDQv9C90Y9f0LLQtdGA0LXRgdC90Y9f0LbQvtCy0YLQvdGPX9C70LjRgdGC0L7Qv9Cw0LTQsF/Qs9GA0YPQtNC90Y8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ9GB0ZbRh9C10L3RjF/Qu9GO0YLQuNC5X9Cx0LXRgNC10LfQtdC90Yxf0LrQstGW0YLQtdC90Yxf0YLRgNCw0LLQtdC90Yxf0YfQtdGA0LLQtdC90Yxf0LvQuNC/0LXQvdGMX9GB0LXRgNC/0LXQvdGMX9Cy0LXRgNC10YHQtdC90Yxf0LbQvtCy0YLQtdC90Yxf0LvQuNGB0YLQvtC/0LDQtF/Qs9GA0YPQtNC10L3RjCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn0YHRltGHX9C70Y7Rgl/QsdC10YBf0LrQstGW0YJf0YLRgNCw0LJf0YfQtdGA0LJf0LvQuNC/X9GB0LXRgNC/X9Cy0LXRgF/QttC+0LLRgl/Qu9C40YHRgl/Qs9GA0YPQtCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6IHdlZWtkYXlzQ2FzZVJlcGxhY2UsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQvdC0X9C/0L1f0LLRgl/RgdGAX9GH0YJf0L/Rgl/RgdCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9C90LRf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVkg0YAuJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZINGALiwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZINGALiwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQodGM0L7Qs9C+0LTQvdGWICcpLFxuICAgICAgICAgICAgbmV4dERheTogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQl9Cw0LLRgtGA0LAgJyksXG4gICAgICAgICAgICBsYXN0RGF5OiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9CS0YfQvtGA0LAgJyksXG4gICAgICAgICAgICBuZXh0V2VlazogcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQo10gZGRkZCBbJyksXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0hvdXJzRnVuY3Rpb24oJ1vQnNC40L3Rg9C70L7Rl10gZGRkZCBbJykuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9Cc0LjQvdGD0LvQvtCz0L5dIGRkZGQgWycpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0LfQsCAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0YLQvtC80YMnLFxuICAgICAgICAgICAgczogJ9C00LXQutGW0LvRjNC60LAg0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIHNzOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaDogJ9Cz0L7QtNC40L3RgycsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQ6ICfQtNC10L3RjCcsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE06ICfQvNGW0YHRj9GG0YwnLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5OiAn0YDRltC6JyxcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICB9LFxuICAgICAgICAvLyBNLiBFLjogdGhvc2UgdHdvIGFyZSB2aXJ0dWFsbHkgdW51c2VkIGJ1dCBhIHVzZXIgbWlnaHQgd2FudCB0byBpbXBsZW1lbnQgdGhlbSBmb3IgaGlzL2hlciB3ZWJzaXRlIGZvciBzb21lIHJlYXNvblxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0L3QvtGH0ZZ80YDQsNC90LrRg3zQtNC90Y980LLQtdGH0L7RgNCwLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o0LTQvdGPfNCy0LXRh9C+0YDQsCkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0L3QvtGH0ZYnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GA0LDQvdC60YMnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C00L3Rjyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LLQtdGH0L7RgNCwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQuXzQs9C+KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QuSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCz0L4nO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB1aztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBVcmR1IFt1cl1cbi8vISBhdXRob3IgOiBTYXdvb2QgQWxhbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9pYm5lc2F5ZWVkXG4vLyEgYXV0aG9yIDogWmFjayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9aYWNrVmlzaW9uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9is2YbZiNix24wnLFxuICAgICAgICAgICAgJ9mB2LHZiNix24wnLFxuICAgICAgICAgICAgJ9mF2KfYsdqGJyxcbiAgICAgICAgICAgICfYp9m+2LHbjNmEJyxcbiAgICAgICAgICAgICfZhdim24wnLFxuICAgICAgICAgICAgJ9is2YjZhicsXG4gICAgICAgICAgICAn2KzZiNmE2KfYptuMJyxcbiAgICAgICAgICAgICfYp9qv2LPYqicsXG4gICAgICAgICAgICAn2LPYqtmF2KjYsScsXG4gICAgICAgICAgICAn2Kfaqdiq2YjYqNixJyxcbiAgICAgICAgICAgICfZhtmI2YXYqNixJyxcbiAgICAgICAgICAgICfYr9iz2YXYqNixJyxcbiAgICAgICAgXSxcbiAgICAgICAgZGF5cyA9IFsn2KfYqtmI2KfYsScsICfZvtuM2LEnLCAn2YXZhtqv2YQnLCAn2KjYr9q+JywgJ9is2YXYudix2KfYqicsICfYrNmF2LnbgScsICfbgdmB2KrbgSddO1xuXG4gICAgdmFyIHVyID0gbW9tZW50LmRlZmluZUxvY2FsZSgndXInLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5czogZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogZGF5cyxcbiAgICAgICAgd2Vla2RheXNNaW46IGRheXMsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGTYjCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/Ytdio2K182LTYp9mFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9i02KfZhScgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2LXYqNitJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAn2LTYp9mFJztcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb2KLYrCDYqNmI2YLYql0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vaqdmEINio2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9io2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9qv2LDYtNiq24Eg2LHZiNiyINio2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1var9iw2LTYqtuBXSBkZGRkIFvYqNmI2YLYql0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDYqNi52K8nLFxuICAgICAgICAgICAgcGFzdDogJyVzINmC2KjZhCcsXG4gICAgICAgICAgICBzOiAn2obZhtivINiz24zaqdmG2ognLFxuICAgICAgICAgICAgc3M6ICclZCDYs9uM2qnZhtqIJyxcbiAgICAgICAgICAgIG06ICfYp9uM2qkg2YXZhtm5JyxcbiAgICAgICAgICAgIG1tOiAnJWQg2YXZhtm5JyxcbiAgICAgICAgICAgIGg6ICfYp9uM2qkg2q/avtmG2bnbgScsXG4gICAgICAgICAgICBoaDogJyVkINqv2r7Zhtm525InLFxuICAgICAgICAgICAgZDogJ9in24zaqSDYr9mGJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2K/ZhicsXG4gICAgICAgICAgICBNOiAn2KfbjNqpINmF2KfbgScsXG4gICAgICAgICAgICBNTTogJyVkINmF2KfbgScsXG4gICAgICAgICAgICB5OiAn2KfbjNqpINiz2KfZhCcsXG4gICAgICAgICAgICB5eTogJyVkINiz2KfZhCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFV6YmVrIExhdGluIFt1ei1sYXRuXVxuLy8hIGF1dGhvciA6IFJhc3VsYmVrIE1pcnpheWV2IDogZ2l0aHViLmNvbS9SYXN1bGJlZWVrXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdXpMYXRuID0gbW9tZW50LmRlZmluZUxvY2FsZSgndXotbGF0bicsIHtcbiAgICAgICAgbW9udGhzOiAnWWFudmFyX0ZldnJhbF9NYXJ0X0FwcmVsX01heV9JeXVuX0l5dWxfQXZndXN0X1NlbnRhYnJfT2t0YWJyX05veWFicl9EZWthYnInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnWWFuX0Zldl9NYXJfQXByX01heV9JeXVuX0l5dWxfQXZnX1Nlbl9Pa3RfTm95X0Rlaycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnWWFrc2hhbmJhX0R1c2hhbmJhX1Nlc2hhbmJhX0Nob3JzaGFuYmFfUGF5c2hhbmJhX0p1bWFfU2hhbmJhJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdZYWtfRHVzaF9TZXNoX0Nob3JfUGF5X0p1bV9TaGFuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1lhX0R1X1NlX0Nob19QYV9KdV9TaGEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ0QgTU1NTSBZWVlZLCBkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQnVndW4gc29hdF0gTFQgW2RhXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0VydGFnYV0gTFQgW2RhXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2t1bmkgc29hdF0gTFQgW2RhXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0tlY2hhIHNvYXRdIExUIFtkYV0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6IFwiW08ndGdhbl0gZGRkZCBba3VuaSBzb2F0XSBMVCBbZGFdXCIsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ1lhcWluICVzIGljaGlkYScsXG4gICAgICAgICAgICBwYXN0OiAnQmlyIG5lY2hhICVzIG9sZGluJyxcbiAgICAgICAgICAgIHM6ICdzb25peWEnLFxuICAgICAgICAgICAgc3M6ICclZCBzb25peWEnLFxuICAgICAgICAgICAgbTogJ2JpciBkYXFpcWEnLFxuICAgICAgICAgICAgbW06ICclZCBkYXFpcWEnLFxuICAgICAgICAgICAgaDogJ2JpciBzb2F0JyxcbiAgICAgICAgICAgIGhoOiAnJWQgc29hdCcsXG4gICAgICAgICAgICBkOiAnYmlyIGt1bicsXG4gICAgICAgICAgICBkZDogJyVkIGt1bicsXG4gICAgICAgICAgICBNOiAnYmlyIG95JyxcbiAgICAgICAgICAgIE1NOiAnJWQgb3knLFxuICAgICAgICAgICAgeTogJ2JpciB5aWwnLFxuICAgICAgICAgICAgeXk6ICclZCB5aWwnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdXpMYXRuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFV6YmVrIFt1el1cbi8vISBhdXRob3IgOiBTYXJkb3IgTXVtaW5vdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tdW1pbm9mZlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHV6ID0gbW9tZW50LmRlZmluZUxvY2FsZSgndXonLCB7XG4gICAgICAgIG1vbnRoczogJ9GP0L3QstCw0YBf0YTQtdCy0YDQsNC7X9C80LDRgNGCX9Cw0L/RgNC10Ltf0LzQsNC5X9C40Y7QvV/QuNGO0Ltf0LDQstCz0YPRgdGCX9GB0LXQvdGC0Y/QsdGAX9C+0LrRgtGP0LHRgF/QvdC+0Y/QsdGAX9C00LXQutCw0LHRgCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfRj9C90LJf0YTQtdCyX9C80LDRgF/QsNC/0YBf0LzQsNC5X9C40Y7QvV/QuNGO0Ltf0LDQstCzX9GB0LXQvV/QvtC60YJf0L3QvtGPX9C00LXQuicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfQr9C60YjQsNC90LHQsF/QlNGD0YjQsNC90LHQsF/QodC10YjQsNC90LHQsF/Qp9C+0YDRiNCw0L3QsdCwX9Cf0LDQudGI0LDQvdCx0LBf0JbRg9C80LBf0KjQsNC90LHQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9Cv0LrRiF/QlNGD0Yhf0KHQtdGIX9Cn0L7RgF/Qn9Cw0Llf0JbRg9C8X9Co0LDQvScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQr9C6X9CU0YNf0KHQtV/Qp9C+X9Cf0LBf0JbRg1/QqNCwJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdEIE1NTU0gWVlZWSwgZGRkZCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9CR0YPQs9GD0L0g0YHQvtCw0YJdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Ct0YDRgtCw0LPQsF0gTFQgW9C00LBdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb0LrRg9C90Lgg0YHQvtCw0YJdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9Ca0LXRh9CwINGB0L7QsNGCXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb0KPRgtCz0LDQvV0gZGRkZCBb0LrRg9C90Lgg0YHQvtCw0YJdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9Cv0LrQuNC9ICVzINC40YfQuNC00LAnLFxuICAgICAgICAgICAgcGFzdDogJ9CR0LjRgCDQvdC10YfQsCAlcyDQvtC70LTQuNC9JyxcbiAgICAgICAgICAgIHM6ICfRhNGD0YDRgdCw0YInLFxuICAgICAgICAgICAgc3M6ICclZCDRhNGD0YDRgdCw0YInLFxuICAgICAgICAgICAgbTogJ9Cx0LjRgCDQtNCw0LrQuNC60LAnLFxuICAgICAgICAgICAgbW06ICclZCDQtNCw0LrQuNC60LAnLFxuICAgICAgICAgICAgaDogJ9Cx0LjRgCDRgdC+0LDRgicsXG4gICAgICAgICAgICBoaDogJyVkINGB0L7QsNGCJyxcbiAgICAgICAgICAgIGQ6ICfQsdC40YAg0LrRg9C9JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0LrRg9C9JyxcbiAgICAgICAgICAgIE06ICfQsdC40YAg0L7QuScsXG4gICAgICAgICAgICBNTTogJyVkINC+0LknLFxuICAgICAgICAgICAgeTogJ9Cx0LjRgCDQudC40LsnLFxuICAgICAgICAgICAgeXk6ICclZCDQudC40LsnLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdXo7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVmlldG5hbWVzZSBbdmldXG4vLyEgYXV0aG9yIDogQmFuZyBOZ3V5ZW4gOiBodHRwczovL2dpdGh1Yi5jb20vYmFuZ25rXG4vLyEgYXV0aG9yIDogQ2hpZW4gS2lyYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGllbmtpcmFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB2aSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3ZpJywge1xuICAgICAgICBtb250aHM6ICd0aMOhbmcgMV90aMOhbmcgMl90aMOhbmcgM190aMOhbmcgNF90aMOhbmcgNV90aMOhbmcgNl90aMOhbmcgN190aMOhbmcgOF90aMOhbmcgOV90aMOhbmcgMTBfdGjDoW5nIDExX3Row6FuZyAxMicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnVGhnIDAxX1RoZyAwMl9UaGcgMDNfVGhnIDA0X1RoZyAwNV9UaGcgMDZfVGhnIDA3X1RoZyAwOF9UaGcgMDlfVGhnIDEwX1RoZyAxMV9UaGcgMTInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdjaOG7pyBuaOG6rXRfdGjhu6kgaGFpX3Ro4bupIGJhX3Ro4bupIHTGsF90aOG7qSBuxINtX3Ro4bupIHPDoXVfdGjhu6kgYuG6o3knLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdDTl9UMl9UM19UNF9UNV9UNl9UNycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdDTl9UMl9UM19UNF9UNV9UNl9UNycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvc2F8Y2gvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL15jaCQvaS50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdzYScgOiAnU0EnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdjaCcgOiAnQ0gnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBbbsSDbV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gW27Eg21dIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBbbsSDbV0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsOiAnREQvTS9ZWVlZJyxcbiAgICAgICAgICAgIGxsOiAnRCBNTU0gWVlZWScsXG4gICAgICAgICAgICBsbGw6ICdEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIEQgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIw7RtIG5heSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW05nw6B5IG1haSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW3R14bqnbiB04bubaSBsw7pjXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0jDtG0gcXVhIGzDumNdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbdHXhuqduIHRyxrDhu5tjIGzDumNdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgdOG7m2knLFxuICAgICAgICAgICAgcGFzdDogJyVzIHRyxrDhu5tjJyxcbiAgICAgICAgICAgIHM6ICd2w6BpIGdpw6J5JyxcbiAgICAgICAgICAgIHNzOiAnJWQgZ2nDonknLFxuICAgICAgICAgICAgbTogJ23hu5l0IHBow7p0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgcGjDunQnLFxuICAgICAgICAgICAgaDogJ23hu5l0IGdp4budJyxcbiAgICAgICAgICAgIGhoOiAnJWQgZ2nhu50nLFxuICAgICAgICAgICAgZDogJ23hu5l0IG5nw6B5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgbmfDoHknLFxuICAgICAgICAgICAgdzogJ23hu5l0IHR14bqnbicsXG4gICAgICAgICAgICB3dzogJyVkIHR14bqnbicsXG4gICAgICAgICAgICBNOiAnbeG7mXQgdGjDoW5nJyxcbiAgICAgICAgICAgIE1NOiAnJWQgdGjDoW5nJyxcbiAgICAgICAgICAgIHk6ICdt4buZdCBuxINtJyxcbiAgICAgICAgICAgIHl5OiAnJWQgbsSDbScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2aTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBQc2V1ZG8gW3gtcHNldWRvXVxuLy8hIGF1dGhvciA6IEFuZHJldyBIb29kIDogaHR0cHM6Ly9naXRodWIuY29tL2FuZHJld2hvb2QxMjVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB4UHNldWRvID0gbW9tZW50LmRlZmluZUxvY2FsZSgneC1wc2V1ZG8nLCB7XG4gICAgICAgIG1vbnRoczogJ0p+w6HDscO6w6F+csO9X0Z+w6licsO6fsOhcsO9X35Nw6FyY35oX8OBcH5yw61sX35Nw6HDvV9+SsO6w7HDqX5fSsO6bH7DvV/DgcO6fmfDunN0fl9Tw6lwfnTDqW1ifsOpcl/Dk35jdMOzYn7DqXJfw5F+w7N2w6ltfmLDqXJffkTDqWPDqX5tYsOpcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnSn7DocOxX35Gw6liX35Nw6FyX37DgXByX35Nw6HDvV9+SsO6w7FffkrDumxffsOBw7pnX35Tw6lwX37Dk2N0X37DkcOzdl9+RMOpYycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdTfsO6w7Fkw6F+w71fTcOzfsOxZMOhw71+X1TDusOpfnNkw6HDvX5fV8OpZH7DscOpc2R+w6HDvV9UfmjDunJzfmTDocO9X35GcsOtZH7DocO9X1N+w6F0w7pyfmTDocO9Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTfsO6w7Fffk3Ds8OxX35Uw7rDqV9+V8OpZF9+VGjDul9+RnLDrV9+U8OhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTfsO6X03Ds35fVMO6X35Xw6lfVH5oX0Zyfl9Tw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUfsOzZMOhfsO9IMOhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUfsOzbcOzfnJyw7N+dyDDoXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW8OdfsOpc3R+w6lyZMOhfsO9IMOhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTH7DoXN0XSBkZGRkIFvDoXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnw61+w7EgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMOhfmfDsycsXG4gICAgICAgICAgICBzOiAnw6EgfmbDqXcgfnPDqWPDs37DsWRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc37DqWPDs8OxfmRzJyxcbiAgICAgICAgICAgIG06ICfDoSB+bcOtw7F+w7p0w6knLFxuICAgICAgICAgICAgbW06ICclZCBtfsOtw7HDun50w6lzJyxcbiAgICAgICAgICAgIGg6ICfDoX7DsSBow7N+w7pyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaH7Ds8O6cnMnLFxuICAgICAgICAgICAgZDogJ8OhIH5kw6HDvScsXG4gICAgICAgICAgICBkZDogJyVkIGR+w6HDvXMnLFxuICAgICAgICAgICAgTTogJ8OhIH5tw7PDsX50aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1+w7PDsXR+aHMnLFxuICAgICAgICAgICAgeTogJ8OhIH7DvcOpw6FyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw71+w6nDoXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHRofHN0fG5kfHJkKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHhQc2V1ZG87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogWW9ydWJhIE5pZ2VyaWEgW3lvXVxuLy8hIGF1dGhvciA6IEF0b2xhZ2JlIEFiaXNveWUgOiBodHRwczovL2dpdGh1Yi5jb20vYW5kZWxhLWJhdG9sYWdiZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHlvID0gbW9tZW50LmRlZmluZUxvY2FsZSgneW8nLCB7XG4gICAgICAgIG1vbnRoczogJ1PhurnMgXLhurnMgV9FzIByZcyAbGXMgF/hurhy4bq5zIBuYcyAX0nMgGdiZcyBX0XMgGJpYmlfT8yAa3XMgGR1X0Fn4bq5bW9fT8yAZ3XMgW5fT3dld2Vf4buMzIB3YcyAcmHMgF9CZcyBbHXMgV/hu4zMgHDhurnMgMyAJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ1PhurnMgXJfRcyAcmxf4bq4cm5fScyAZ2JfRcyAYmlfT8yAa3XMgF9BZ+G6uV9PzIBndcyBX093ZV/hu4zMgHdhzIBfQmXMgWxf4buMzIBw4bq5zIDMgCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdBzIBpzIBrdcyBX0FqZcyBX0nMgHPhurnMgWd1bl/hu4xq4buNzIFydcyBX+G7jGrhu43MgWLhu41f4bq4dGnMgF9BzIBiYcyBbeG6ucyBdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdBzIBpzIBrX0FqZcyBX0nMgHPhurnMgV/hu4xqcl/hu4xqYl/hurh0acyAX0HMgGJhzIEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnQcyAacyAX0FqX0nMgHNf4buMcl/hu4xiX+G6uHRfQcyAYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbT8yAbmnMgCBuaV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vhu4zMgGxhIG5pXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogXCJkZGRkIFvhu4xz4bq5zIAgdG/MgW4nYuG7jV0gW25pXSBMVFwiLFxuICAgICAgICAgICAgbGFzdERheTogJ1tBzIBuYSBuaV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvhu4xz4bq5zIAgdG/MgWzhu43MgV0gW25pXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ25pzIEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGvhu41qYcyBJyxcbiAgICAgICAgICAgIHM6ICdpzIBz4bq5anXMgSBhYXlhzIEgZGllJyxcbiAgICAgICAgICAgIHNzOiAnYWF5YcyBICVkJyxcbiAgICAgICAgICAgIG06ICdpzIBz4bq5anXMgSBrYW4nLFxuICAgICAgICAgICAgbW06ICdpzIBz4bq5anXMgSAlZCcsXG4gICAgICAgICAgICBoOiAnd2HMgWthdGkga2FuJyxcbiAgICAgICAgICAgIGhoOiAnd2HMgWthdGkgJWQnLFxuICAgICAgICAgICAgZDogJ+G7jWrhu43MgSBrYW4nLFxuICAgICAgICAgICAgZGQ6ICfhu41q4buNzIEgJWQnLFxuICAgICAgICAgICAgTTogJ29zdcyAIGthbicsXG4gICAgICAgICAgICBNTTogJ29zdcyAICVkJyxcbiAgICAgICAgICAgIHk6ICfhu41kdcyBbiBrYW4nLFxuICAgICAgICAgICAgeXk6ICfhu41kdcyBbiAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC/hu41q4buNzIFcXHNcXGR7MSwyfS8sXG4gICAgICAgIG9yZGluYWw6ICfhu41q4buNzIEgJWQnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4geW87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2hpbmVzZSAoQ2hpbmEpIFt6aC1jbl1cbi8vISBhdXRob3IgOiBzdXVwaWMgOiBodHRwczovL2dpdGh1Yi5jb20vc3V1cGljXG4vLyEgYXV0aG9yIDogWmVubyBaZW5nIDogaHR0cHM6Ly9naXRodWIuY29tL3plbm96ZW5nXG4vLyEgYXV0aG9yIDogdXUxMDkgOiBodHRwczovL2dpdGh1Yi5jb20vdXUxMDlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB6aENuID0gbW9tZW50LmRlZmluZUxvY2FsZSgnemgtY24nLCB7XG4gICAgICAgIG1vbnRoczogJ+S4gOaciF/kuozmnIhf5LiJ5pyIX+Wbm+aciF/kupTmnIhf5YWt5pyIX+S4g+aciF/lhavmnIhf5Lmd5pyIX+WNgeaciF/ljYHkuIDmnIhf5Y2B5LqM5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJzHmnIhfMuaciF8z5pyIXzTmnIhfNeaciF825pyIXzfmnIhfOOaciF855pyIXzEw5pyIXzEx5pyIXzEy5pyIJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+aYn+acn+aXpV/mmJ/mnJ/kuIBf5pif5pyf5LqMX+aYn+acn+S4iV/mmJ/mnJ/lm5tf5pif5pyf5LqUX+aYn+acn+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+WRqOaXpV/lkajkuIBf5ZGo5LqMX+WRqOS4iV/lkajlm5tf5ZGo5LqUX+WRqOWFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfml6Vf5LiAX+S6jF/kuIlf5ZubX+S6lF/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnlubRN5pyIROaXpUFo54K5bW3liIYnLFxuICAgICAgICAgICAgTExMTDogJ1lZWVnlubRN5pyIROaXpWRkZGRBaOeCuW1t5YiGJyxcbiAgICAgICAgICAgIGw6ICdZWVlZL00vRCcsXG4gICAgICAgICAgICBsbDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5YeM5pmofOaXqeS4inzkuIrljYh85Lit5Y2IfOS4i+WNiHzmmZrkuIovLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICflh4zmmagnIHx8IG1lcmlkaWVtID09PSAn5pep5LiKJyB8fCBtZXJpZGllbSA9PT0gJ+S4iuWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuIvljYgnIHx8IG1lcmlkaWVtID09PSAn5pma5LiKJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICfkuK3ljYgnXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgdmFyIGhtID0gaG91ciAqIDEwMCArIG1pbnV0ZTtcbiAgICAgICAgICAgIGlmIChobSA8IDYwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5YeM5pmoJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCA5MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aXqeS4iic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTEzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiK5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMjMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuK3ljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDE4MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4i+WNiCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pma5LiKJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb5LuK5aSpXUxUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb5piO5aSpXUxUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdy53ZWVrKCkgIT09IHRoaXMud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+S4i11kZGRMVCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5pysXWRkZExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1vmmKjlpKldTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53ZWVrKCkgIT09IG5vdy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5LiKXWRkZExUJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vmnKxdZGRkTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o5pelfOaciHzlkagpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfmnIgnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+WRqCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+WQjicsXG4gICAgICAgICAgICBwYXN0OiAnJXPliY0nLFxuICAgICAgICAgICAgczogJ+WHoOenkicsXG4gICAgICAgICAgICBzczogJyVkIOenkicsXG4gICAgICAgICAgICBtOiAnMSDliIbpkp8nLFxuICAgICAgICAgICAgbW06ICclZCDliIbpkp8nLFxuICAgICAgICAgICAgaDogJzEg5bCP5pe2JyxcbiAgICAgICAgICAgIGhoOiAnJWQg5bCP5pe2JyxcbiAgICAgICAgICAgIGQ6ICcxIOWkqScsXG4gICAgICAgICAgICBkZDogJyVkIOWkqScsXG4gICAgICAgICAgICB3OiAnMSDlkagnLFxuICAgICAgICAgICAgd3c6ICclZCDlkagnLFxuICAgICAgICAgICAgTTogJzEg5Liq5pyIJyxcbiAgICAgICAgICAgIE1NOiAnJWQg5Liq5pyIJyxcbiAgICAgICAgICAgIHk6ICcxIOW5tCcsXG4gICAgICAgICAgICB5eTogJyVkIOW5tCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIC8vIEdCL1QgNzQwOC0xOTk044CK5pWw5o2u5YWD5ZKM5Lqk5o2i5qC85byPwrfkv6Hmga/kuqTmjaLCt+aXpeacn+WSjOaXtumXtOihqOekuuazleOAi+S4jklTTyA4NjAxOjE5ODjnrYnmlYhcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB6aENuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENoaW5lc2UgKEhvbmcgS29uZykgW3poLWhrXVxuLy8hIGF1dGhvciA6IEJlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZW4tbGluXG4vLyEgYXV0aG9yIDogQ2hyaXMgTGFtIDogaHR0cHM6Ly9naXRodWIuY29tL2hlaGFjaHJpc1xuLy8hIGF1dGhvciA6IEtvbnN0YW50aW4gOiBodHRwczovL2dpdGh1Yi5jb20vc2tmZFxuLy8hIGF1dGhvciA6IEFudGhvbnkgOiBodHRwczovL2dpdGh1Yi5jb20vYW50aG9ueWxhdVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHpoSGsgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd6aC1oaycsIHtcbiAgICAgICAgbW9udGhzOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn5pif5pyf5pelX+aYn+acn+S4gF/mmJ/mnJ/kuoxf5pif5pyf5LiJX+aYn+acn+Wbm1/mmJ/mnJ/kupRf5pif5pyf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn6YCx5pelX+mAseS4gF/pgLHkuoxf6YCx5LiJX+mAseWbm1/pgLHkupRf6YCx5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+aXpV/kuIBf5LqMX+S4iV/lm5tf5LqUX+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdZWVlZL00vRCcsXG4gICAgICAgICAgICBsbDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5YeM5pmofOaXqeS4inzkuIrljYh85Lit5Y2IfOS4i+WNiHzmmZrkuIovLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICflh4zmmagnIHx8IG1lcmlkaWVtID09PSAn5pep5LiKJyB8fCBtZXJpZGllbSA9PT0gJ+S4iuWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuK3ljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WHjOaZqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfml6nkuIonO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4iuWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtID09PSAxMjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuK3ljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDE4MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4i+WNiCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pma5LiKJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb5LuK5aSpXUxUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb5piO5aSpXUxUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+S4i11kZGRkTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vmmKjlpKldTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb5LiKXWRkZGRMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o5pelfOaciHzpgLEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfmnIgnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+mAsSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+W+jCcsXG4gICAgICAgICAgICBwYXN0OiAnJXPliY0nLFxuICAgICAgICAgICAgczogJ+W5vuenkicsXG4gICAgICAgICAgICBzczogJyVkIOenkicsXG4gICAgICAgICAgICBtOiAnMSDliIbpkJgnLFxuICAgICAgICAgICAgbW06ICclZCDliIbpkJgnLFxuICAgICAgICAgICAgaDogJzEg5bCP5pmCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg5bCP5pmCJyxcbiAgICAgICAgICAgIGQ6ICcxIOWkqScsXG4gICAgICAgICAgICBkZDogJyVkIOWkqScsXG4gICAgICAgICAgICBNOiAnMSDlgIvmnIgnLFxuICAgICAgICAgICAgTU06ICclZCDlgIvmnIgnLFxuICAgICAgICAgICAgeTogJzEg5bm0JyxcbiAgICAgICAgICAgIHl5OiAnJWQg5bm0JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB6aEhrO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENoaW5lc2UgKE1hY2F1KSBbemgtbW9dXG4vLyEgYXV0aG9yIDogQmVuIDogaHR0cHM6Ly9naXRodWIuY29tL2Jlbi1saW5cbi8vISBhdXRob3IgOiBDaHJpcyBMYW0gOiBodHRwczovL2dpdGh1Yi5jb20vaGVoYWNocmlzXG4vLyEgYXV0aG9yIDogVGFuIFl1YW5ob25nIDogaHR0cHM6Ly9naXRodWIuY29tL2xlMHRhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHpoTW8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd6aC1tbycsIHtcbiAgICAgICAgbW9udGhzOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn5pif5pyf5pelX+aYn+acn+S4gF/mmJ/mnJ/kuoxf5pif5pyf5LiJX+aYn+acn+Wbm1/mmJ/mnJ/kupRf5pif5pyf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn6YCx5pelX+mAseS4gF/pgLHkuoxf6YCx5LiJX+mAseWbm1/pgLHkupRf6YCx5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+aXpV/kuIBf5LqMX+S4iV/lm5tf5LqUX+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdEL00vWVlZWScsXG4gICAgICAgICAgICBsbDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5YeM5pmofOaXqeS4inzkuIrljYh85Lit5Y2IfOS4i+WNiHzmmZrkuIovLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICflh4zmmagnIHx8IG1lcmlkaWVtID09PSAn5pep5LiKJyB8fCBtZXJpZGllbSA9PT0gJ+S4iuWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuK3ljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WHjOaZqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfml6nkuIonO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDExMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4iuWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuWkqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vmmI7lpKldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+S4i11kZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5aSpXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vkuIpdZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o5pelfOaciHzpgLEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfmnIgnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+mAsSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+WFpycsXG4gICAgICAgICAgICBwYXN0OiAnJXPliY0nLFxuICAgICAgICAgICAgczogJ+W5vuenkicsXG4gICAgICAgICAgICBzczogJyVkIOenkicsXG4gICAgICAgICAgICBtOiAnMSDliIbpkJgnLFxuICAgICAgICAgICAgbW06ICclZCDliIbpkJgnLFxuICAgICAgICAgICAgaDogJzEg5bCP5pmCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg5bCP5pmCJyxcbiAgICAgICAgICAgIGQ6ICcxIOWkqScsXG4gICAgICAgICAgICBkZDogJyVkIOWkqScsXG4gICAgICAgICAgICBNOiAnMSDlgIvmnIgnLFxuICAgICAgICAgICAgTU06ICclZCDlgIvmnIgnLFxuICAgICAgICAgICAgeTogJzEg5bm0JyxcbiAgICAgICAgICAgIHl5OiAnJWQg5bm0JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB6aE1vO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENoaW5lc2UgKFRhaXdhbikgW3poLXR3XVxuLy8hIGF1dGhvciA6IEJlbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZW4tbGluXG4vLyEgYXV0aG9yIDogQ2hyaXMgTGFtIDogaHR0cHM6Ly9naXRodWIuY29tL2hlaGFjaHJpc1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHpoVHcgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd6aC10dycsIHtcbiAgICAgICAgbW9udGhzOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn5pif5pyf5pelX+aYn+acn+S4gF/mmJ/mnJ/kuoxf5pif5pyf5LiJX+aYn+acn+Wbm1/mmJ/mnJ/kupRf5pif5pyf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn6YCx5pelX+mAseS4gF/pgLHkuoxf6YCx5LiJX+mAseWbm1/pgLHkupRf6YCx5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+aXpV/kuIBf5LqMX+S4iV/lm5tf5LqUX+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeW5tE3mnIhE5pelIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZ5bm0TeaciETml6VkZGRkIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdZWVlZL00vRCcsXG4gICAgICAgICAgICBsbDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5YeM5pmofOaXqeS4inzkuIrljYh85Lit5Y2IfOS4i+WNiHzmmZrkuIovLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICflh4zmmagnIHx8IG1lcmlkaWVtID09PSAn5pep5LiKJyB8fCBtZXJpZGllbSA9PT0gJ+S4iuWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfkuK3ljYgnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHZhciBobSA9IGhvdXIgKiAxMDAgKyBtaW51dGU7XG4gICAgICAgICAgICBpZiAoaG0gPCA2MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WHjOaZqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgOTAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfml6nkuIonO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDExMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4iuWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5Lit5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxODAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIvljYgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aZmuS4iic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuWkqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vmmI7lpKldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+S4i11kZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb5pio5aSpXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vkuIpdZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o5pelfOaciHzpgLEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5pelJztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfmnIgnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+mAsSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+W+jCcsXG4gICAgICAgICAgICBwYXN0OiAnJXPliY0nLFxuICAgICAgICAgICAgczogJ+W5vuenkicsXG4gICAgICAgICAgICBzczogJyVkIOenkicsXG4gICAgICAgICAgICBtOiAnMSDliIbpkJgnLFxuICAgICAgICAgICAgbW06ICclZCDliIbpkJgnLFxuICAgICAgICAgICAgaDogJzEg5bCP5pmCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg5bCP5pmCJyxcbiAgICAgICAgICAgIGQ6ICcxIOWkqScsXG4gICAgICAgICAgICBkZDogJyVkIOWkqScsXG4gICAgICAgICAgICBNOiAnMSDlgIvmnIgnLFxuICAgICAgICAgICAgTU06ICclZCDlgIvmnIgnLFxuICAgICAgICAgICAgeTogJzEg5bm0JyxcbiAgICAgICAgICAgIHl5OiAnJWQg5bm0JyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB6aFR3O1xuXG59KSkpO1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2FmXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hZi5qc1wiLFxuXHRcIi4vYWYuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FmLmpzXCIsXG5cdFwiLi9hclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIuanNcIixcblx0XCIuL2FyLWR6XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1kei5qc1wiLFxuXHRcIi4vYXItZHouanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWR6LmpzXCIsXG5cdFwiLi9hci1rd1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIta3cuanNcIixcblx0XCIuL2FyLWt3LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1rdy5qc1wiLFxuXHRcIi4vYXItbHlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWx5LmpzXCIsXG5cdFwiLi9hci1seS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItbHkuanNcIixcblx0XCIuL2FyLW1hXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1tYS5qc1wiLFxuXHRcIi4vYXItbWEuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLW1hLmpzXCIsXG5cdFwiLi9hci1wc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItcHMuanNcIixcblx0XCIuL2FyLXBzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1wcy5qc1wiLFxuXHRcIi4vYXItc2FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXNhLmpzXCIsXG5cdFwiLi9hci1zYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItc2EuanNcIixcblx0XCIuL2FyLXRuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci10bi5qc1wiLFxuXHRcIi4vYXItdG4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXRuLmpzXCIsXG5cdFwiLi9hci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIuanNcIixcblx0XCIuL2F6XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hei5qc1wiLFxuXHRcIi4vYXouanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2F6LmpzXCIsXG5cdFwiLi9iZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmUuanNcIixcblx0XCIuL2JlLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iZS5qc1wiLFxuXHRcIi4vYmdcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JnLmpzXCIsXG5cdFwiLi9iZy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmcuanNcIixcblx0XCIuL2JtXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibS5qc1wiLFxuXHRcIi4vYm0uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JtLmpzXCIsXG5cdFwiLi9iblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4uanNcIixcblx0XCIuL2JuLWJkXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibi1iZC5qc1wiLFxuXHRcIi4vYm4tYmQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLWJkLmpzXCIsXG5cdFwiLi9ibi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4uanNcIixcblx0XCIuL2JvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iby5qc1wiLFxuXHRcIi4vYm8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JvLmpzXCIsXG5cdFwiLi9iclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYnIuanNcIixcblx0XCIuL2JyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ici5qc1wiLFxuXHRcIi4vYnNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JzLmpzXCIsXG5cdFwiLi9icy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYnMuanNcIixcblx0XCIuL2NhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jYS5qc1wiLFxuXHRcIi4vY2EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2NhLmpzXCIsXG5cdFwiLi9jc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3MuanNcIixcblx0XCIuL2NzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jcy5qc1wiLFxuXHRcIi4vY3ZcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2N2LmpzXCIsXG5cdFwiLi9jdi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3YuanNcIixcblx0XCIuL2N5XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jeS5qc1wiLFxuXHRcIi4vY3kuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2N5LmpzXCIsXG5cdFwiLi9kYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGEuanNcIixcblx0XCIuL2RhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kYS5qc1wiLFxuXHRcIi4vZGVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLmpzXCIsXG5cdFwiLi9kZS1hdFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtYXQuanNcIixcblx0XCIuL2RlLWF0LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS1hdC5qc1wiLFxuXHRcIi4vZGUtY2hcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWNoLmpzXCIsXG5cdFwiLi9kZS1jaC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtY2guanNcIixcblx0XCIuL2RlLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS5qc1wiLFxuXHRcIi4vZHZcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2R2LmpzXCIsXG5cdFwiLi9kdi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZHYuanNcIixcblx0XCIuL2VsXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbC5qc1wiLFxuXHRcIi4vZWwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VsLmpzXCIsXG5cdFwiLi9lbi1hdVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tYXUuanNcIixcblx0XCIuL2VuLWF1LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1hdS5qc1wiLFxuXHRcIi4vZW4tY2FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWNhLmpzXCIsXG5cdFwiLi9lbi1jYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tY2EuanNcIixcblx0XCIuL2VuLWdiXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1nYi5qc1wiLFxuXHRcIi4vZW4tZ2IuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWdiLmpzXCIsXG5cdFwiLi9lbi1pZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWUuanNcIixcblx0XCIuL2VuLWllLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pZS5qc1wiLFxuXHRcIi4vZW4taWxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWlsLmpzXCIsXG5cdFwiLi9lbi1pbC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWwuanNcIixcblx0XCIuL2VuLWluXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbi5qc1wiLFxuXHRcIi4vZW4taW4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWluLmpzXCIsXG5cdFwiLi9lbi1uelwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tbnouanNcIixcblx0XCIuL2VuLW56LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1uei5qc1wiLFxuXHRcIi4vZW4tc2dcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLXNnLmpzXCIsXG5cdFwiLi9lbi1zZy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tc2cuanNcIixcblx0XCIuL2VvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lby5qc1wiLFxuXHRcIi4vZW8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VvLmpzXCIsXG5cdFwiLi9lc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMuanNcIixcblx0XCIuL2VzLWRvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy1kby5qc1wiLFxuXHRcIi4vZXMtZG8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLWRvLmpzXCIsXG5cdFwiLi9lcy1teFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtbXguanNcIixcblx0XCIuL2VzLW14LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy1teC5qc1wiLFxuXHRcIi4vZXMtdXNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLXVzLmpzXCIsXG5cdFwiLi9lcy11cy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtdXMuanNcIixcblx0XCIuL2VzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy5qc1wiLFxuXHRcIi4vZXRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2V0LmpzXCIsXG5cdFwiLi9ldC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXQuanNcIixcblx0XCIuL2V1XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldS5qc1wiLFxuXHRcIi4vZXUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2V1LmpzXCIsXG5cdFwiLi9mYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmEuanNcIixcblx0XCIuL2ZhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mYS5qc1wiLFxuXHRcIi4vZmlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZpLmpzXCIsXG5cdFwiLi9maS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmkuanNcIixcblx0XCIuL2ZpbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmlsLmpzXCIsXG5cdFwiLi9maWwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZpbC5qc1wiLFxuXHRcIi4vZm9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZvLmpzXCIsXG5cdFwiLi9mby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZm8uanNcIixcblx0XCIuL2ZyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci5qc1wiLFxuXHRcIi4vZnItY2FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNhLmpzXCIsXG5cdFwiLi9mci1jYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2EuanNcIixcblx0XCIuL2ZyLWNoXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci1jaC5qc1wiLFxuXHRcIi4vZnItY2guanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNoLmpzXCIsXG5cdFwiLi9mci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnIuanNcIixcblx0XCIuL2Z5XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9meS5qc1wiLFxuXHRcIi4vZnkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2Z5LmpzXCIsXG5cdFwiLi9nYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2EuanNcIixcblx0XCIuL2dhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nYS5qc1wiLFxuXHRcIi4vZ2RcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dkLmpzXCIsXG5cdFwiLi9nZC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2QuanNcIixcblx0XCIuL2dsXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nbC5qc1wiLFxuXHRcIi4vZ2wuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dsLmpzXCIsXG5cdFwiLi9nb20tZGV2YVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWRldmEuanNcIixcblx0XCIuL2dvbS1kZXZhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nb20tZGV2YS5qc1wiLFxuXHRcIi4vZ29tLWxhdG5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dvbS1sYXRuLmpzXCIsXG5cdFwiLi9nb20tbGF0bi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWxhdG4uanNcIixcblx0XCIuL2d1XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ndS5qc1wiLFxuXHRcIi4vZ3UuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2d1LmpzXCIsXG5cdFwiLi9oZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGUuanNcIixcblx0XCIuL2hlLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oZS5qc1wiLFxuXHRcIi4vaGlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hpLmpzXCIsXG5cdFwiLi9oaS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGkuanNcIixcblx0XCIuL2hyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oci5qc1wiLFxuXHRcIi4vaHIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hyLmpzXCIsXG5cdFwiLi9odVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHUuanNcIixcblx0XCIuL2h1LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9odS5qc1wiLFxuXHRcIi4vaHktYW1cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2h5LWFtLmpzXCIsXG5cdFwiLi9oeS1hbS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHktYW0uanNcIixcblx0XCIuL2lkXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pZC5qc1wiLFxuXHRcIi4vaWQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2lkLmpzXCIsXG5cdFwiLi9pc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXMuanNcIixcblx0XCIuL2lzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pcy5qc1wiLFxuXHRcIi4vaXRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LmpzXCIsXG5cdFwiLi9pdC1jaFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXQtY2guanNcIixcblx0XCIuL2l0LWNoLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC1jaC5qc1wiLFxuXHRcIi4vaXQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LmpzXCIsXG5cdFwiLi9qYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvamEuanNcIixcblx0XCIuL2phLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9qYS5qc1wiLFxuXHRcIi4vanZcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2p2LmpzXCIsXG5cdFwiLi9qdi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvanYuanNcIixcblx0XCIuL2thXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rYS5qc1wiLFxuXHRcIi4va2EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2thLmpzXCIsXG5cdFwiLi9ra1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2suanNcIixcblx0XCIuL2trLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ray5qc1wiLFxuXHRcIi4va21cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ttLmpzXCIsXG5cdFwiLi9rbS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva20uanNcIixcblx0XCIuL2tuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbi5qc1wiLFxuXHRcIi4va24uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2tuLmpzXCIsXG5cdFwiLi9rb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva28uanNcIixcblx0XCIuL2tvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rby5qc1wiLFxuXHRcIi4va3VcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t1LmpzXCIsXG5cdFwiLi9rdS1rbXJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t1LWttci5qc1wiLFxuXHRcIi4va3Uta21yLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS1rbXIuanNcIixcblx0XCIuL2t1LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS5qc1wiLFxuXHRcIi4va3lcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t5LmpzXCIsXG5cdFwiLi9reS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3kuanNcIixcblx0XCIuL2xiXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sYi5qc1wiLFxuXHRcIi4vbGIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2xiLmpzXCIsXG5cdFwiLi9sb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbG8uanNcIixcblx0XCIuL2xvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sby5qc1wiLFxuXHRcIi4vbHRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x0LmpzXCIsXG5cdFwiLi9sdC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbHQuanNcIixcblx0XCIuL2x2XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sdi5qc1wiLFxuXHRcIi4vbHYuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x2LmpzXCIsXG5cdFwiLi9tZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWUuanNcIixcblx0XCIuL21lLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tZS5qc1wiLFxuXHRcIi4vbWlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21pLmpzXCIsXG5cdFwiLi9taS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWkuanNcIixcblx0XCIuL21rXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tay5qc1wiLFxuXHRcIi4vbWsuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21rLmpzXCIsXG5cdFwiLi9tbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWwuanNcIixcblx0XCIuL21sLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tbC5qc1wiLFxuXHRcIi4vbW5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21uLmpzXCIsXG5cdFwiLi9tbi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbW4uanNcIixcblx0XCIuL21yXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tci5qc1wiLFxuXHRcIi4vbXIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21yLmpzXCIsXG5cdFwiLi9tc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXMuanNcIixcblx0XCIuL21zLW15XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tcy1teS5qc1wiLFxuXHRcIi4vbXMtbXkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21zLW15LmpzXCIsXG5cdFwiLi9tcy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXMuanNcIixcblx0XCIuL210XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tdC5qc1wiLFxuXHRcIi4vbXQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL210LmpzXCIsXG5cdFwiLi9teVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXkuanNcIixcblx0XCIuL215LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9teS5qc1wiLFxuXHRcIi4vbmJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25iLmpzXCIsXG5cdFwiLi9uYi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmIuanNcIixcblx0XCIuL25lXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9uZS5qc1wiLFxuXHRcIi4vbmUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25lLmpzXCIsXG5cdFwiLi9ubFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmwuanNcIixcblx0XCIuL25sLWJlXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC1iZS5qc1wiLFxuXHRcIi4vbmwtYmUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25sLWJlLmpzXCIsXG5cdFwiLi9ubC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmwuanNcIixcblx0XCIuL25uXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubi5qc1wiLFxuXHRcIi4vbm4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25uLmpzXCIsXG5cdFwiLi9vYy1sbmNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL29jLWxuYy5qc1wiLFxuXHRcIi4vb2MtbG5jLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9vYy1sbmMuanNcIixcblx0XCIuL3BhLWluXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wYS1pbi5qc1wiLFxuXHRcIi4vcGEtaW4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3BhLWluLmpzXCIsXG5cdFwiLi9wbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcGwuanNcIixcblx0XCIuL3BsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wbC5qc1wiLFxuXHRcIi4vcHRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3B0LmpzXCIsXG5cdFwiLi9wdC1iclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcHQtYnIuanNcIixcblx0XCIuL3B0LWJyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wdC1ici5qc1wiLFxuXHRcIi4vcHQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3B0LmpzXCIsXG5cdFwiLi9yb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcm8uanNcIixcblx0XCIuL3JvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9yby5qc1wiLFxuXHRcIi4vcnVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3J1LmpzXCIsXG5cdFwiLi9ydS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcnUuanNcIixcblx0XCIuL3NkXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZC5qc1wiLFxuXHRcIi4vc2QuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NkLmpzXCIsXG5cdFwiLi9zZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2UuanNcIixcblx0XCIuL3NlLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZS5qc1wiLFxuXHRcIi4vc2lcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NpLmpzXCIsXG5cdFwiLi9zaS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2kuanNcIixcblx0XCIuL3NrXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zay5qc1wiLFxuXHRcIi4vc2suanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NrLmpzXCIsXG5cdFwiLi9zbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2wuanNcIixcblx0XCIuL3NsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zbC5qc1wiLFxuXHRcIi4vc3FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NxLmpzXCIsXG5cdFwiLi9zcS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3EuanNcIixcblx0XCIuL3NyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zci5qc1wiLFxuXHRcIi4vc3ItY3lybFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3ItY3lybC5qc1wiLFxuXHRcIi4vc3ItY3lybC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3ItY3lybC5qc1wiLFxuXHRcIi4vc3IuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NyLmpzXCIsXG5cdFwiLi9zc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3MuanNcIixcblx0XCIuL3NzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zcy5qc1wiLFxuXHRcIi4vc3ZcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N2LmpzXCIsXG5cdFwiLi9zdi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3YuanNcIixcblx0XCIuL3N3XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zdy5qc1wiLFxuXHRcIi4vc3cuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N3LmpzXCIsXG5cdFwiLi90YVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGEuanNcIixcblx0XCIuL3RhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90YS5qc1wiLFxuXHRcIi4vdGVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RlLmpzXCIsXG5cdFwiLi90ZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGUuanNcIixcblx0XCIuL3RldFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGV0LmpzXCIsXG5cdFwiLi90ZXQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RldC5qc1wiLFxuXHRcIi4vdGdcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RnLmpzXCIsXG5cdFwiLi90Zy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGcuanNcIixcblx0XCIuL3RoXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90aC5qc1wiLFxuXHRcIi4vdGguanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RoLmpzXCIsXG5cdFwiLi90a1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGsuanNcIixcblx0XCIuL3RrLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ay5qc1wiLFxuXHRcIi4vdGwtcGhcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsLXBoLmpzXCIsXG5cdFwiLi90bC1waC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGwtcGguanNcIixcblx0XCIuL3RsaFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGxoLmpzXCIsXG5cdFwiLi90bGguanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RsaC5qc1wiLFxuXHRcIi4vdHJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RyLmpzXCIsXG5cdFwiLi90ci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHIuanNcIixcblx0XCIuL3R6bFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHpsLmpzXCIsXG5cdFwiLi90emwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bC5qc1wiLFxuXHRcIi4vdHptXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90em0uanNcIixcblx0XCIuL3R6bS1sYXRuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90em0tbGF0bi5qc1wiLFxuXHRcIi4vdHptLWxhdG4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bS1sYXRuLmpzXCIsXG5cdFwiLi90em0uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bS5qc1wiLFxuXHRcIi4vdWctY25cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VnLWNuLmpzXCIsXG5cdFwiLi91Zy1jbi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdWctY24uanNcIixcblx0XCIuL3VrXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ay5qc1wiLFxuXHRcIi4vdWsuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VrLmpzXCIsXG5cdFwiLi91clwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXIuanNcIixcblx0XCIuL3VyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ci5qc1wiLFxuXHRcIi4vdXpcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3V6LmpzXCIsXG5cdFwiLi91ei1sYXRuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ei1sYXRuLmpzXCIsXG5cdFwiLi91ei1sYXRuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ei1sYXRuLmpzXCIsXG5cdFwiLi91ei5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXouanNcIixcblx0XCIuL3ZpXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS92aS5qc1wiLFxuXHRcIi4vdmkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3ZpLmpzXCIsXG5cdFwiLi94LXBzZXVkb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUveC1wc2V1ZG8uanNcIixcblx0XCIuL3gtcHNldWRvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS94LXBzZXVkby5qc1wiLFxuXHRcIi4veW9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3lvLmpzXCIsXG5cdFwiLi95by5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUveW8uanNcIixcblx0XCIuL3poLWNuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1jbi5qc1wiLFxuXHRcIi4vemgtY24uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLWNuLmpzXCIsXG5cdFwiLi96aC1oa1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtaGsuanNcIixcblx0XCIuL3poLWhrLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1oay5qc1wiLFxuXHRcIi4vemgtbW9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLW1vLmpzXCIsXG5cdFwiLi96aC1tby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtbW8uanNcIixcblx0XCIuL3poLXR3XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC10dy5qc1wiLFxuXHRcIi4vemgtdHcuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLXR3LmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKiRcIjsiLCIvLyEgbW9tZW50LmpzXG4vLyEgdmVyc2lvbiA6IDIuMzAuMVxuLy8hIGF1dGhvcnMgOiBUaW0gV29vZCwgSXNrcmVuIENoZXJuZXYsIE1vbWVudC5qcyBjb250cmlidXRvcnNcbi8vISBsaWNlbnNlIDogTUlUXG4vLyEgbW9tZW50anMuY29tXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIGdsb2JhbC5tb21lbnQgPSBmYWN0b3J5KClcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGhvb2tDYWxsYmFjaztcblxuICAgIGZ1bmN0aW9uIGhvb2tzKCkge1xuICAgICAgICByZXR1cm4gaG9va0NhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBkb25lIHRvIHJlZ2lzdGVyIHRoZSBtZXRob2QgY2FsbGVkIHdpdGggbW9tZW50KClcbiAgICAvLyB3aXRob3V0IGNyZWF0aW5nIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAgICBmdW5jdGlvbiBzZXRIb29rQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICAgICAgaG9va0NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBcnJheShpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBBcnJheSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgQXJyYXldJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gICAgICAgIC8vIElFOCB3aWxsIHRyZWF0IHVuZGVmaW5lZCBhbmQgbnVsbCBhcyBvYmplY3QgaWYgaXQgd2Fzbid0IGZvclxuICAgICAgICAvLyBpbnB1dCAhPSBudWxsXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpbnB1dCAhPSBudWxsICYmXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBPYmplY3RdJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc093blByb3AoYSwgYikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIGIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT2JqZWN0RW1wdHkob2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcykge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGs7XG4gICAgICAgICAgICBmb3IgKGsgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3Aob2JqLCBrKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT09IHZvaWQgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc051bWJlcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RhdGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRGF0ZV0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFwKGFyciwgZm4pIHtcbiAgICAgICAgdmFyIHJlcyA9IFtdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGFyckxlbiA9IGFyci5sZW5ndGg7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnJMZW47ICsraSkge1xuICAgICAgICAgICAgcmVzLnB1c2goZm4oYXJyW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmQoYSwgYikge1xuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGIsIGkpKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndG9TdHJpbmcnKSkge1xuICAgICAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndmFsdWVPZicpKSB7XG4gICAgICAgICAgICBhLnZhbHVlT2YgPSBiLnZhbHVlT2Y7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIHRydWUpLnV0YygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmF1bHRQYXJzaW5nRmxhZ3MoKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZGVlcCBjbG9uZSB0aGlzIG9iamVjdC5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVtcHR5OiBmYWxzZSxcbiAgICAgICAgICAgIHVudXNlZFRva2VuczogW10sXG4gICAgICAgICAgICB1bnVzZWRJbnB1dDogW10sXG4gICAgICAgICAgICBvdmVyZmxvdzogLTIsXG4gICAgICAgICAgICBjaGFyc0xlZnRPdmVyOiAwLFxuICAgICAgICAgICAgbnVsbElucHV0OiBmYWxzZSxcbiAgICAgICAgICAgIGludmFsaWRFcmE6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkTW9udGg6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkRm9ybWF0OiBmYWxzZSxcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBpc286IGZhbHNlLFxuICAgICAgICAgICAgcGFyc2VkRGF0ZVBhcnRzOiBbXSxcbiAgICAgICAgICAgIGVyYTogbnVsbCxcbiAgICAgICAgICAgIG1lcmlkaWVtOiBudWxsLFxuICAgICAgICAgICAgcmZjMjgyMjogZmFsc2UsXG4gICAgICAgICAgICB3ZWVrZGF5TWlzbWF0Y2g6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcnNpbmdGbGFncyhtKSB7XG4gICAgICAgIGlmIChtLl9wZiA9PSBudWxsKSB7XG4gICAgICAgICAgICBtLl9wZiA9IGRlZmF1bHRQYXJzaW5nRmxhZ3MoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5fcGY7XG4gICAgfVxuXG4gICAgdmFyIHNvbWU7XG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5zb21lKSB7XG4gICAgICAgIHNvbWUgPSBBcnJheS5wcm90b3R5cGUuc29tZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzb21lID0gZnVuY3Rpb24gKGZ1bikge1xuICAgICAgICAgICAgdmFyIHQgPSBPYmplY3QodGhpcyksXG4gICAgICAgICAgICAgICAgbGVuID0gdC5sZW5ndGggPj4+IDAsXG4gICAgICAgICAgICAgICAgaTtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gdCAmJiBmdW4uY2FsbCh0aGlzLCB0W2ldLCBpLCB0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkKG0pIHtcbiAgICAgICAgdmFyIGZsYWdzID0gbnVsbCxcbiAgICAgICAgICAgIHBhcnNlZFBhcnRzID0gZmFsc2UsXG4gICAgICAgICAgICBpc05vd1ZhbGlkID0gbS5fZCAmJiAhaXNOYU4obS5fZC5nZXRUaW1lKCkpO1xuICAgICAgICBpZiAoaXNOb3dWYWxpZCkge1xuICAgICAgICAgICAgZmxhZ3MgPSBnZXRQYXJzaW5nRmxhZ3MobSk7XG4gICAgICAgICAgICBwYXJzZWRQYXJ0cyA9IHNvbWUuY2FsbChmbGFncy5wYXJzZWREYXRlUGFydHMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgIT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaXNOb3dWYWxpZCA9XG4gICAgICAgICAgICAgICAgZmxhZ3Mub3ZlcmZsb3cgPCAwICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRFcmEgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZE1vbnRoICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRXZWVrZGF5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLndlZWtkYXlNaXNtYXRjaCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5udWxsSW5wdXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZEZvcm1hdCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy51c2VySW52YWxpZGF0ZWQgJiZcbiAgICAgICAgICAgICAgICAoIWZsYWdzLm1lcmlkaWVtIHx8IChmbGFncy5tZXJpZGllbSAmJiBwYXJzZWRQYXJ0cykpO1xuICAgICAgICAgICAgaWYgKG0uX3N0cmljdCkge1xuICAgICAgICAgICAgICAgIGlzTm93VmFsaWQgPVxuICAgICAgICAgICAgICAgICAgICBpc05vd1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNoYXJzTGVmdE92ZXIgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MudW51c2VkVG9rZW5zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbiA9PSBudWxsIHx8ICFPYmplY3QuaXNGcm96ZW4obSkpIHtcbiAgICAgICAgICAgIG0uX2lzVmFsaWQgPSBpc05vd1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTm93VmFsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG0uX2lzVmFsaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW52YWxpZChmbGFncykge1xuICAgICAgICB2YXIgbSA9IGNyZWF0ZVVUQyhOYU4pO1xuICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0ZW5kKGdldFBhcnNpbmdGbGFncyhtKSwgZmxhZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLnVzZXJJbnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBQbHVnaW5zIHRoYXQgYWRkIHByb3BlcnRpZXMgc2hvdWxkIGFsc28gYWRkIHRoZSBrZXkgaGVyZSAobnVsbCB2YWx1ZSksXG4gICAgLy8gc28gd2UgY2FuIHByb3Blcmx5IGNsb25lIG91cnNlbHZlcy5cbiAgICB2YXIgbW9tZW50UHJvcGVydGllcyA9IChob29rcy5tb21lbnRQcm9wZXJ0aWVzID0gW10pLFxuICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBjb3B5Q29uZmlnKHRvLCBmcm9tKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIG1vbWVudFByb3BlcnRpZXNMZW4gPSBtb21lbnRQcm9wZXJ0aWVzLmxlbmd0aDtcblxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzQU1vbWVudE9iamVjdCkpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pKSkge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fZikpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2wpKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9zdHJpY3QpKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fdHptKSkge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzVVRDKSkge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9vZmZzZXQpKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fcGYpKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sb2NhbGUpKSB7XG4gICAgICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudFByb3BlcnRpZXNMZW4gPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbW9tZW50UHJvcGVydGllc0xlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvcCA9IG1vbWVudFByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICAgICAgdmFsID0gZnJvbVtwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9bcHJvcF0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH1cblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgICAgICBjb3B5Q29uZmlnKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShjb25maWcuX2QgIT0gbnVsbCA/IGNvbmZpZy5fZC5nZXRUaW1lKCkgOiBOYU4pO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgICAgIC8vIG9iamVjdHMuXG4gICAgICAgIGlmICh1cGRhdGVJblByb2dyZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudChvYmopIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG9iaiBpbnN0YW5jZW9mIE1vbWVudCB8fCAob2JqICE9IG51bGwgJiYgb2JqLl9pc0FNb21lbnRPYmplY3QgIT0gbnVsbClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3YXJuKG1zZykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FyblxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRGVwcmVjYXRpb24gd2FybmluZzogJyArIG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGUobXNnLCBmbikge1xuICAgICAgICB2YXIgZmlyc3RUaW1lID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlcihudWxsLCBtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpcnN0VGltZSkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW10sXG4gICAgICAgICAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBhcmdMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdMZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0gJ1xcblsnICsgaSArICddICc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChhcmd1bWVudHNbMF0sIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnICs9IGtleSArICc6ICcgKyBhcmd1bWVudHNbMF1ba2V5XSArICcsICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnNsaWNlKDAsIC0yKTsgLy8gUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGFuZCBzcGFjZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChhcmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgICAgICBtc2cgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbkFyZ3VtZW50czogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzKS5qb2luKCcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoKS5zdGFja1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSwgZm4pO1xuICAgIH1cblxuICAgIHZhciBkZXByZWNhdGlvbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCBtc2cpIHtcbiAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobmFtZSwgbXNnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlcHJlY2F0aW9uc1tuYW1lXSkge1xuICAgICAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICAgICAgZGVwcmVjYXRpb25zW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9IGZhbHNlO1xuICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodHlwZW9mIEZ1bmN0aW9uICE9PSAndW5kZWZpbmVkJyAmJiBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldChjb25maWcpIHtcbiAgICAgICAgdmFyIHByb3AsIGk7XG4gICAgICAgIGZvciAoaSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGNvbmZpZywgaSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIC8vIExlbmllbnQgb3JkaW5hbCBwYXJzaW5nIGFjY2VwdHMganVzdCBhIG51bWJlciBpbiBhZGRpdGlvbiB0b1xuICAgICAgICAvLyBudW1iZXIgKyAocG9zc2libHkpIHN0dWZmIGNvbWluZyBmcm9tIF9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLlxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICh0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLnNvdXJjZSB8fCB0aGlzLl9vcmRpbmFsUGFyc2Uuc291cmNlKSArXG4gICAgICAgICAgICAgICAgJ3wnICtcbiAgICAgICAgICAgICAgICAvXFxkezEsMn0vLnNvdXJjZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBleHRlbmQoe30sIHBhcmVudENvbmZpZyksXG4gICAgICAgICAgICBwcm9wO1xuICAgICAgICBmb3IgKHByb3AgaW4gY2hpbGRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChwYXJlbnRDb25maWdbcHJvcF0pICYmIGlzT2JqZWN0KGNoaWxkQ29uZmlnW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKHJlc1twcm9wXSwgcGFyZW50Q29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKHJlc1twcm9wXSwgY2hpbGRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRDb25maWdbcHJvcF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSBjaGlsZENvbmZpZ1twcm9wXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVzW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHByb3AgaW4gcGFyZW50Q29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaGFzT3duUHJvcChwYXJlbnRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgIWhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNoYW5nZXMgdG8gcHJvcGVydGllcyBkb24ndCBtb2RpZnkgcGFyZW50IGNvbmZpZ1xuICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGV4dGVuZCh7fSwgcmVzW3Byb3BdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvY2FsZShjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldChjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGtleXM7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMpIHtcbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGtleXMgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgICAgICByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChvYmosIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRDYWxlbmRhciA9IHtcbiAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY2FsZW5kYXIoa2V5LCBtb20sIG5vdykge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XSB8fCB0aGlzLl9jYWxlbmRhclsnc2FtZUVsc2UnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KSA/IG91dHB1dC5jYWxsKG1vbSwgbm93KSA6IG91dHB1dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB6ZXJvRmlsbChudW1iZXIsIHRhcmdldExlbmd0aCwgZm9yY2VTaWduKSB7XG4gICAgICAgIHZhciBhYnNOdW1iZXIgPSAnJyArIE1hdGguYWJzKG51bWJlciksXG4gICAgICAgICAgICB6ZXJvc1RvRmlsbCA9IHRhcmdldExlbmd0aCAtIGFic051bWJlci5sZW5ndGgsXG4gICAgICAgICAgICBzaWduID0gbnVtYmVyID49IDA7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc2lnbiA/IChmb3JjZVNpZ24gPyAnKycgOiAnJykgOiAnLScpICtcbiAgICAgICAgICAgIE1hdGgucG93KDEwLCBNYXRoLm1heCgwLCB6ZXJvc1RvRmlsbCkpLnRvU3RyaW5nKCkuc3Vic3RyKDEpICtcbiAgICAgICAgICAgIGFic051bWJlclxuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXR0aW5nVG9rZW5zID1cbiAgICAgICAgICAgIC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhbSGhdbW0oc3MpP3xNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98V1tvfFddP3xRbz98TnsxLDV9fFlZWVlZWXxZWVlZWXxZWVlZfFlZfHl7Miw0fXx5bz98Z2coZ2dnPyk/fEdHKEdHRz8pP3xlfEV8YXxBfGhoP3xISD98a2s/fG1tP3xzcz98U3sxLDl9fHh8WHx6ej98Wlo/fC4pL2csXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2csXG4gICAgICAgIGZvcm1hdEZ1bmN0aW9ucyA9IHt9LFxuICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9ucyA9IHt9O1xuXG4gICAgLy8gdG9rZW46ICAgICdNJ1xuICAgIC8vIHBhZGRlZDogICBbJ01NJywgMl1cbiAgICAvLyBvcmRpbmFsOiAgJ01vJ1xuICAgIC8vIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7IHRoaXMubW9udGgoKSArIDEgfVxuICAgIGZ1bmN0aW9uIGFkZEZvcm1hdFRva2VuKHRva2VuLCBwYWRkZWQsIG9yZGluYWwsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBmdW5jID0gY2FsbGJhY2s7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmdW5jID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2NhbGxiYWNrXSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZGRlZCkge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbcGFkZGVkWzBdXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gemVyb0ZpbGwoZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBwYWRkZWRbMV0sIHBhZGRlZFsyXSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcmRpbmFsKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1tvcmRpbmFsXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkub3JkaW5hbChcbiAgICAgICAgICAgICAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgICAgICAgICAgICB0b2tlblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlRm9ybWF0dGluZ1Rva2VucyhpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQubWF0Y2goL1xcW1tcXHNcXFNdLykpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9cXFxcL2csICcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlRm9ybWF0RnVuY3Rpb24oZm9ybWF0KSB7XG4gICAgICAgIHZhciBhcnJheSA9IGZvcm1hdC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsZW5ndGg7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV0pIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbaV0gPSByZW1vdmVGb3JtYXR0aW5nVG9rZW5zKGFycmF5W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobW9tKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gJycsXG4gICAgICAgICAgICAgICAgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBpc0Z1bmN0aW9uKGFycmF5W2ldKVxuICAgICAgICAgICAgICAgICAgICA/IGFycmF5W2ldLmNhbGwobW9tLCBmb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgIDogYXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCBkYXRlIHVzaW5nIG5hdGl2ZSBkYXRlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG0ubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxvY2FsZURhdGEoKSk7XG4gICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdID1cbiAgICAgICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdIHx8IG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpO1xuXG4gICAgICAgIHJldHVybiBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XShtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHBhbmRGb3JtYXQoZm9ybWF0LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGkgPSA1O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VMb25nRGF0ZUZvcm1hdFRva2VucyhpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5sb25nRGF0ZUZvcm1hdChpbnB1dCkgfHwgaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPj0gMCAmJiBsb2NhbEZvcm1hdHRpbmdUb2tlbnMudGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMsXG4gICAgICAgICAgICAgICAgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICBpIC09IDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQgPSB7XG4gICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgTDogJ01NL0REL1lZWVknLFxuICAgICAgICBMTDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgIExMTDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvbmdEYXRlRm9ybWF0KGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSxcbiAgICAgICAgICAgIGZvcm1hdFVwcGVyID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5LnRvVXBwZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChmb3JtYXQgfHwgIWZvcm1hdFVwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSA9IGZvcm1hdFVwcGVyXG4gICAgICAgICAgICAubWF0Y2goZm9ybWF0dGluZ1Rva2VucylcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHRvaykge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnTU1NTScgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnTU0nIHx8XG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ0REJyB8fFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdkZGRkJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdEludmFsaWREYXRlID0gJ0ludmFsaWQgZGF0ZSc7XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludmFsaWREYXRlO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0T3JkaW5hbCA9ICclZCcsXG4gICAgICAgIGRlZmF1bHREYXlPZk1vbnRoT3JkaW5hbFBhcnNlID0gL1xcZHsxLDJ9LztcblxuICAgIGZ1bmN0aW9uIG9yZGluYWwobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoJyVkJywgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFJlbGF0aXZlVGltZSA9IHtcbiAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICB3OiAnYSB3ZWVrJyxcbiAgICAgICAgd3c6ICclZCB3ZWVrcycsXG4gICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMuX3JlbGF0aXZlVGltZVtzdHJpbmddO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvdXRwdXQpXG4gICAgICAgICAgICA/IG91dHB1dChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpXG4gICAgICAgICAgICA6IG91dHB1dC5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhc3RGdXR1cmUoZGlmZiwgb3V0cHV0KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbZGlmZiA+IDAgPyAnZnV0dXJlJyA6ICdwYXN0J107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGZvcm1hdCkgPyBmb3JtYXQob3V0cHV0KSA6IGZvcm1hdC5yZXBsYWNlKC8lcy9pLCBvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhbGlhc2VzID0ge1xuICAgICAgICBEOiAnZGF0ZScsXG4gICAgICAgIGRhdGVzOiAnZGF0ZScsXG4gICAgICAgIGRhdGU6ICdkYXRlJyxcbiAgICAgICAgZDogJ2RheScsXG4gICAgICAgIGRheXM6ICdkYXknLFxuICAgICAgICBkYXk6ICdkYXknLFxuICAgICAgICBlOiAnd2Vla2RheScsXG4gICAgICAgIHdlZWtkYXlzOiAnd2Vla2RheScsXG4gICAgICAgIHdlZWtkYXk6ICd3ZWVrZGF5JyxcbiAgICAgICAgRTogJ2lzb1dlZWtkYXknLFxuICAgICAgICBpc293ZWVrZGF5czogJ2lzb1dlZWtkYXknLFxuICAgICAgICBpc293ZWVrZGF5OiAnaXNvV2Vla2RheScsXG4gICAgICAgIERERDogJ2RheU9mWWVhcicsXG4gICAgICAgIGRheW9meWVhcnM6ICdkYXlPZlllYXInLFxuICAgICAgICBkYXlvZnllYXI6ICdkYXlPZlllYXInLFxuICAgICAgICBoOiAnaG91cicsXG4gICAgICAgIGhvdXJzOiAnaG91cicsXG4gICAgICAgIGhvdXI6ICdob3VyJyxcbiAgICAgICAgbXM6ICdtaWxsaXNlY29uZCcsXG4gICAgICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kJyxcbiAgICAgICAgbWlsbGlzZWNvbmQ6ICdtaWxsaXNlY29uZCcsXG4gICAgICAgIG06ICdtaW51dGUnLFxuICAgICAgICBtaW51dGVzOiAnbWludXRlJyxcbiAgICAgICAgbWludXRlOiAnbWludXRlJyxcbiAgICAgICAgTTogJ21vbnRoJyxcbiAgICAgICAgbW9udGhzOiAnbW9udGgnLFxuICAgICAgICBtb250aDogJ21vbnRoJyxcbiAgICAgICAgUTogJ3F1YXJ0ZXInLFxuICAgICAgICBxdWFydGVyczogJ3F1YXJ0ZXInLFxuICAgICAgICBxdWFydGVyOiAncXVhcnRlcicsXG4gICAgICAgIHM6ICdzZWNvbmQnLFxuICAgICAgICBzZWNvbmRzOiAnc2Vjb25kJyxcbiAgICAgICAgc2Vjb25kOiAnc2Vjb25kJyxcbiAgICAgICAgZ2c6ICd3ZWVrWWVhcicsXG4gICAgICAgIHdlZWt5ZWFyczogJ3dlZWtZZWFyJyxcbiAgICAgICAgd2Vla3llYXI6ICd3ZWVrWWVhcicsXG4gICAgICAgIEdHOiAnaXNvV2Vla1llYXInLFxuICAgICAgICBpc293ZWVreWVhcnM6ICdpc29XZWVrWWVhcicsXG4gICAgICAgIGlzb3dlZWt5ZWFyOiAnaXNvV2Vla1llYXInLFxuICAgICAgICB3OiAnd2VlaycsXG4gICAgICAgIHdlZWtzOiAnd2VlaycsXG4gICAgICAgIHdlZWs6ICd3ZWVrJyxcbiAgICAgICAgVzogJ2lzb1dlZWsnLFxuICAgICAgICBpc293ZWVrczogJ2lzb1dlZWsnLFxuICAgICAgICBpc293ZWVrOiAnaXNvV2VlaycsXG4gICAgICAgIHk6ICd5ZWFyJyxcbiAgICAgICAgeWVhcnM6ICd5ZWFyJyxcbiAgICAgICAgeWVhcjogJ3llYXInLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVVbml0cyh1bml0cykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHVuaXRzID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBhbGlhc2VzW3VuaXRzXSB8fCBhbGlhc2VzW3VuaXRzLnRvTG93ZXJDYXNlKCldXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVPYmplY3RVbml0cyhpbnB1dE9iamVjdCkge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0ge30sXG4gICAgICAgICAgICBub3JtYWxpemVkUHJvcCxcbiAgICAgICAgICAgIHByb3A7XG5cbiAgICAgICAgZm9yIChwcm9wIGluIGlucHV0T2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChpbnB1dE9iamVjdCwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvcCA9IG5vcm1hbGl6ZVVuaXRzKHByb3ApO1xuICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkUHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkSW5wdXRbbm9ybWFsaXplZFByb3BdID0gaW5wdXRPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRJbnB1dDtcbiAgICB9XG5cbiAgICB2YXIgcHJpb3JpdGllcyA9IHtcbiAgICAgICAgZGF0ZTogOSxcbiAgICAgICAgZGF5OiAxMSxcbiAgICAgICAgd2Vla2RheTogMTEsXG4gICAgICAgIGlzb1dlZWtkYXk6IDExLFxuICAgICAgICBkYXlPZlllYXI6IDQsXG4gICAgICAgIGhvdXI6IDEzLFxuICAgICAgICBtaWxsaXNlY29uZDogMTYsXG4gICAgICAgIG1pbnV0ZTogMTQsXG4gICAgICAgIG1vbnRoOiA4LFxuICAgICAgICBxdWFydGVyOiA3LFxuICAgICAgICBzZWNvbmQ6IDE1LFxuICAgICAgICB3ZWVrWWVhcjogMSxcbiAgICAgICAgaXNvV2Vla1llYXI6IDEsXG4gICAgICAgIHdlZWs6IDUsXG4gICAgICAgIGlzb1dlZWs6IDUsXG4gICAgICAgIHllYXI6IDEsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdldFByaW9yaXRpemVkVW5pdHModW5pdHNPYmopIHtcbiAgICAgICAgdmFyIHVuaXRzID0gW10sXG4gICAgICAgICAgICB1O1xuICAgICAgICBmb3IgKHUgaW4gdW5pdHNPYmopIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKHVuaXRzT2JqLCB1KSkge1xuICAgICAgICAgICAgICAgIHVuaXRzLnB1c2goeyB1bml0OiB1LCBwcmlvcml0eTogcHJpb3JpdGllc1t1XSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1bml0cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdW5pdHM7XG4gICAgfVxuXG4gICAgdmFyIG1hdGNoMSA9IC9cXGQvLCAvLyAgICAgICAwIC0gOVxuICAgICAgICBtYXRjaDIgPSAvXFxkXFxkLywgLy8gICAgICAwMCAtIDk5XG4gICAgICAgIG1hdGNoMyA9IC9cXGR7M30vLCAvLyAgICAgMDAwIC0gOTk5XG4gICAgICAgIG1hdGNoNCA9IC9cXGR7NH0vLCAvLyAgICAwMDAwIC0gOTk5OVxuICAgICAgICBtYXRjaDYgPSAvWystXT9cXGR7Nn0vLCAvLyAtOTk5OTk5IC0gOTk5OTk5XG4gICAgICAgIG1hdGNoMXRvMiA9IC9cXGRcXGQ/LywgLy8gICAgICAgMCAtIDk5XG4gICAgICAgIG1hdGNoM3RvNCA9IC9cXGRcXGRcXGRcXGQ/LywgLy8gICAgIDk5OSAtIDk5OTlcbiAgICAgICAgbWF0Y2g1dG82ID0gL1xcZFxcZFxcZFxcZFxcZFxcZD8vLCAvLyAgIDk5OTk5IC0gOTk5OTk5XG4gICAgICAgIG1hdGNoMXRvMyA9IC9cXGR7MSwzfS8sIC8vICAgICAgIDAgLSA5OTlcbiAgICAgICAgbWF0Y2gxdG80ID0gL1xcZHsxLDR9LywgLy8gICAgICAgMCAtIDk5OTlcbiAgICAgICAgbWF0Y2gxdG82ID0gL1srLV0/XFxkezEsNn0vLCAvLyAtOTk5OTk5IC0gOTk5OTk5XG4gICAgICAgIG1hdGNoVW5zaWduZWQgPSAvXFxkKy8sIC8vICAgICAgIDAgLSBpbmZcbiAgICAgICAgbWF0Y2hTaWduZWQgPSAvWystXT9cXGQrLywgLy8gICAgLWluZiAtIGluZlxuICAgICAgICBtYXRjaE9mZnNldCA9IC9afFsrLV1cXGRcXGQ6P1xcZFxcZC9naSwgLy8gKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgICAgIG1hdGNoU2hvcnRPZmZzZXQgPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy9naSwgLy8gKzAwIC0wMCArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcbiAgICAgICAgbWF0Y2hUaW1lc3RhbXAgPSAvWystXT9cXGQrKFxcLlxcZHsxLDN9KT8vLCAvLyAxMjM0NTY3ODkgMTIzNDU2Nzg5LjEyM1xuICAgICAgICAvLyBhbnkgd29yZCAob3IgdHdvKSBjaGFyYWN0ZXJzIG9yIG51bWJlcnMgaW5jbHVkaW5nIHR3by90aHJlZSB3b3JkIG1vbnRoIGluIGFyYWJpYy5cbiAgICAgICAgLy8gaW5jbHVkZXMgc2NvdHRpc2ggZ2FlbGljIHR3byB3b3JkIGFuZCBoeXBoZW5hdGVkIG1vbnRoc1xuICAgICAgICBtYXRjaFdvcmQgPVxuICAgICAgICAgICAgL1swLTldezAsMjU2fVsnYS16XFx1MDBBMC1cXHUwNUZGXFx1MDcwMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRjA3XFx1RkYxMC1cXHVGRkVGXXsxLDI1Nn18W1xcdTA2MDAtXFx1MDZGRlxcL117MSwyNTZ9KFxccyo/W1xcdTA2MDAtXFx1MDZGRl17MSwyNTZ9KXsxLDJ9L2ksXG4gICAgICAgIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8gPSAvXlsxLTldXFxkPy8sIC8vICAgICAgICAgMS05OVxuICAgICAgICBtYXRjaDF0bzJIYXNaZXJvID0gL14oWzEtOV1cXGR8XFxkKS8sIC8vICAgICAgICAgICAwLTk5XG4gICAgICAgIHJlZ2V4ZXM7XG5cbiAgICByZWdleGVzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRSZWdleFRva2VuKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICAgICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KVxuICAgICAgICAgICAgPyByZWdleFxuICAgICAgICAgICAgOiBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZURhdGEpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpc1N0cmljdCAmJiBzdHJpY3RSZWdleCA/IHN0cmljdFJlZ2V4IDogcmVnZXg7XG4gICAgICAgICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHJlZ2V4ZXMsIHRva2VuKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodW5lc2NhcGVGb3JtYXQodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWdleGVzW3Rva2VuXShjb25maWcuX3N0cmljdCwgY29uZmlnLl9sb2NhbGUpO1xuICAgIH1cblxuICAgIC8vIENvZGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NjE0OTMvaXMtdGhlcmUtYS1yZWdleHAtZXNjYXBlLWZ1bmN0aW9uLWluLWphdmFzY3JpcHRcbiAgICBmdW5jdGlvbiB1bmVzY2FwZUZvcm1hdChzKSB7XG4gICAgICAgIHJldHVybiByZWdleEVzY2FwZShcbiAgICAgICAgICAgIHNcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnXFxcXCcsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAvXFxcXChcXFspfFxcXFwoXFxdKXxcXFsoW15cXF1cXFtdKilcXF18XFxcXCguKS9nLFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAobWF0Y2hlZCwgcDEsIHAyLCBwMywgcDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwMSB8fCBwMiB8fCBwMyB8fCBwNDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWdleEVzY2FwZShzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0Zsb29yKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgLy8gLTAgLT4gMFxuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpIHx8IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JbnQoYXJndW1lbnRGb3JDb2VyY2lvbikge1xuICAgICAgICB2YXIgY29lcmNlZE51bWJlciA9ICthcmd1bWVudEZvckNvZXJjaW9uLFxuICAgICAgICAgICAgdmFsdWUgPSAwO1xuXG4gICAgICAgIGlmIChjb2VyY2VkTnVtYmVyICE9PSAwICYmIGlzRmluaXRlKGNvZXJjZWROdW1iZXIpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGFic0Zsb29yKGNvZXJjZWROdW1iZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHZhciB0b2tlbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFBhcnNlVG9rZW4odG9rZW4sIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgZnVuYyA9IGNhbGxiYWNrLFxuICAgICAgICAgICAgdG9rZW5MZW47XG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0b2tlbiA9IFt0b2tlbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTnVtYmVyKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBhcnJheVtjYWxsYmFja10gPSB0b0ludChpbnB1dCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRva2VuTGVuID0gdG9rZW4ubGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5MZW47IGkrKykge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuW2ldXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRXZWVrUGFyc2VUb2tlbih0b2tlbiwgY2FsbGJhY2spIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICAgICAgY29uZmlnLl93ID0gY29uZmlnLl93IHx8IHt9O1xuICAgICAgICAgICAgY2FsbGJhY2soaW5wdXQsIGNvbmZpZy5fdywgY29uZmlnLCB0b2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBpbnB1dCwgY29uZmlnKSB7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGhhc093blByb3AodG9rZW5zLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbl0oaW5wdXQsIGNvbmZpZy5fYSwgY29uZmlnLCB0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgIH1cblxuICAgIHZhciBZRUFSID0gMCxcbiAgICAgICAgTU9OVEggPSAxLFxuICAgICAgICBEQVRFID0gMixcbiAgICAgICAgSE9VUiA9IDMsXG4gICAgICAgIE1JTlVURSA9IDQsXG4gICAgICAgIFNFQ09ORCA9IDUsXG4gICAgICAgIE1JTExJU0VDT05EID0gNixcbiAgICAgICAgV0VFSyA9IDcsXG4gICAgICAgIFdFRUtEQVkgPSA4O1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1knLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55ZWFyKCk7XG4gICAgICAgIHJldHVybiB5IDw9IDk5OTkgPyB6ZXJvRmlsbCh5LCA0KSA6ICcrJyArIHk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZJywgNF0sIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsIDVdLCAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVlZJywgNiwgdHJ1ZV0sIDAsICd5ZWFyJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdZJywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVknLCBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVknLCBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVlZJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ1lZWVlZJywgJ1lZWVlZWSddLCBZRUFSKTtcbiAgICBhZGRQYXJzZVRva2VuKCdZWVlZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9XG4gICAgICAgICAgICBpbnB1dC5sZW5ndGggPT09IDIgPyBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCkgOiB0b0ludChpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1knLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgaG9va3MucGFyc2VUd29EaWdpdFllYXIgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRvSW50KGlucHV0KSArICh0b0ludChpbnB1dCkgPiA2OCA/IDE5MDAgOiAyMDAwKTtcbiAgICB9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFllYXIgPSBtYWtlR2V0U2V0KCdGdWxsWWVhcicsIHRydWUpO1xuXG4gICAgZnVuY3Rpb24gZ2V0SXNMZWFwWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXRTZXQodW5pdCwga2VlcFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzZXQkMSh0aGlzLCB1bml0LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIGtlZXBUaW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQobW9tLCB1bml0KSB7XG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkID0gbW9tLl9kLFxuICAgICAgICAgICAgaXNVVEMgPSBtb20uX2lzVVRDO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgICAgICAgY2FzZSAnTWlsbGlzZWNvbmRzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ01pbGxpc2Vjb25kcygpIDogZC5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICAgICAgICAgIGNhc2UgJ1NlY29uZHMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDU2Vjb25kcygpIDogZC5nZXRTZWNvbmRzKCk7XG4gICAgICAgICAgICBjYXNlICdNaW51dGVzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ01pbnV0ZXMoKSA6IGQuZ2V0TWludXRlcygpO1xuICAgICAgICAgICAgY2FzZSAnSG91cnMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDSG91cnMoKSA6IGQuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDRGF0ZSgpIDogZC5nZXREYXRlKCk7XG4gICAgICAgICAgICBjYXNlICdEYXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDRGF5KCkgOiBkLmdldERheSgpO1xuICAgICAgICAgICAgY2FzZSAnTW9udGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDTW9udGgoKSA6IGQuZ2V0TW9udGgoKTtcbiAgICAgICAgICAgIGNhc2UgJ0Z1bGxZZWFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVEMgPyBkLmdldFVUQ0Z1bGxZZWFyKCkgOiBkLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBOYU47IC8vIEp1c3QgaW4gY2FzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0JDEobW9tLCB1bml0LCB2YWx1ZSkge1xuICAgICAgICB2YXIgZCwgaXNVVEMsIHllYXIsIG1vbnRoLCBkYXRlO1xuXG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSB8fCBpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGQgPSBtb20uX2Q7XG4gICAgICAgIGlzVVRDID0gbW9tLl9pc1VUQztcblxuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ01pbGxpc2Vjb25kcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKGlzVVRDXG4gICAgICAgICAgICAgICAgICAgID8gZC5zZXRVVENNaWxsaXNlY29uZHModmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIDogZC5zZXRNaWxsaXNlY29uZHModmFsdWUpKTtcbiAgICAgICAgICAgIGNhc2UgJ1NlY29uZHMnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChpc1VUQyA/IGQuc2V0VVRDU2Vjb25kcyh2YWx1ZSkgOiBkLnNldFNlY29uZHModmFsdWUpKTtcbiAgICAgICAgICAgIGNhc2UgJ01pbnV0ZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChpc1VUQyA/IGQuc2V0VVRDTWludXRlcyh2YWx1ZSkgOiBkLnNldE1pbnV0ZXModmFsdWUpKTtcbiAgICAgICAgICAgIGNhc2UgJ0hvdXJzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ0hvdXJzKHZhbHVlKSA6IGQuc2V0SG91cnModmFsdWUpKTtcbiAgICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChpc1VUQyA/IGQuc2V0VVRDRGF0ZSh2YWx1ZSkgOiBkLnNldERhdGUodmFsdWUpKTtcbiAgICAgICAgICAgIC8vIGNhc2UgJ0RheSc6IC8vIE5vdCByZWFsXG4gICAgICAgICAgICAvLyAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ0RheSh2YWx1ZSkgOiBkLnNldERheSh2YWx1ZSkpO1xuICAgICAgICAgICAgLy8gY2FzZSAnTW9udGgnOiAvLyBOb3QgdXNlZCBiZWNhdXNlIHdlIG5lZWQgdG8gcGFzcyB0d28gdmFyaWFibGVzXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIHZvaWQgKGlzVVRDID8gZC5zZXRVVENNb250aCh2YWx1ZSkgOiBkLnNldE1vbnRoKHZhbHVlKSk7XG4gICAgICAgICAgICBjYXNlICdGdWxsWWVhcic6XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFNlZSBiZWxvdyAuLi5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBKdXN0IGluIGNhc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHllYXIgPSB2YWx1ZTtcbiAgICAgICAgbW9udGggPSBtb20ubW9udGgoKTtcbiAgICAgICAgZGF0ZSA9IG1vbS5kYXRlKCk7XG4gICAgICAgIGRhdGUgPSBkYXRlID09PSAyOSAmJiBtb250aCA9PT0gMSAmJiAhaXNMZWFwWWVhcih5ZWFyKSA/IDI4IDogZGF0ZTtcbiAgICAgICAgdm9pZCAoaXNVVENcbiAgICAgICAgICAgID8gZC5zZXRVVENGdWxsWWVhcih5ZWFyLCBtb250aCwgZGF0ZSlcbiAgICAgICAgICAgIDogZC5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgZGF0ZSkpO1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHN0cmluZ0dldCh1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdHJpbmdTZXQodW5pdHMsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdW5pdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIHZhciBwcmlvcml0aXplZCA9IGdldFByaW9yaXRpemVkVW5pdHModW5pdHMpLFxuICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgcHJpb3JpdGl6ZWRMZW4gPSBwcmlvcml0aXplZC5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJpb3JpdGl6ZWRMZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXNbcHJpb3JpdGl6ZWRbaV0udW5pdF0odW5pdHNbcHJpb3JpdGl6ZWRbaV0udW5pdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vZChuLCB4KSB7XG4gICAgICAgIHJldHVybiAoKG4gJSB4KSArIHgpICUgeDtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXhPZjtcblxuICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikge1xuICAgICAgICBpbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXhPZiA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICAvLyBJIGtub3dcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1tpXSA9PT0gbykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c0luTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgICAgaWYgKGlzTmFOKHllYXIpIHx8IGlzTmFOKG1vbnRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW9kTW9udGggPSBtb2QobW9udGgsIDEyKTtcbiAgICAgICAgeWVhciArPSAobW9udGggLSBtb2RNb250aCkgLyAxMjtcbiAgICAgICAgcmV0dXJuIG1vZE1vbnRoID09PSAxXG4gICAgICAgICAgICA/IGlzTGVhcFllYXIoeWVhcilcbiAgICAgICAgICAgICAgICA/IDI5XG4gICAgICAgICAgICAgICAgOiAyOFxuICAgICAgICAgICAgOiAzMSAtICgobW9kTW9udGggJSA3KSAlIDIpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNJywgWydNTScsIDJdLCAnTW8nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoKCkgKyAxO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTU1NTScsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignTScsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignTU0nLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5tb250aHNTaG9ydFJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdNTU1NJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5tb250aHNSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnTScsICdNTSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9IHRvSW50KGlucHV0KSAtIDE7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnTU1NJywgJ01NTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgbW9udGggPSBjb25maWcuX2xvY2FsZS5tb250aHNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGZpbmQgYSBtb250aCBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWQuXG4gICAgICAgIGlmIChtb250aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBhcnJheVtNT05USF0gPSBtb250aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRNb250aCA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRocyA9XG4gICAgICAgICAgICAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQgPVxuICAgICAgICAgICAgJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICBNT05USFNfSU5fRk9STUFUID0gL0Rbb0RdPyhcXFtbXlxcW1xcXV0qXFxdfFxccykrTU1NTT8vLFxuICAgICAgICBkZWZhdWx0TW9udGhzU2hvcnRSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdE1vbnRoc1JlZ2V4ID0gbWF0Y2hXb3JkO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlTW9udGhzKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocylcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21vbnRoc1xuICAgICAgICAgICAgICAgIDogdGhpcy5fbW9udGhzWydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzKVxuICAgICAgICAgICAgPyB0aGlzLl9tb250aHNbbS5tb250aCgpXVxuICAgICAgICAgICAgOiB0aGlzLl9tb250aHNbXG4gICAgICAgICAgICAgICAgICAodGhpcy5fbW9udGhzLmlzRm9ybWF0IHx8IE1PTlRIU19JTl9GT1JNQVQpLnRlc3QoZm9ybWF0KVxuICAgICAgICAgICAgICAgICAgICAgID8gJ2Zvcm1hdCdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdzdGFuZGFsb25lJ1xuICAgICAgICAgICAgICBdW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlTW9udGhzU2hvcnQobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzU2hvcnQpXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNTaG9ydFxuICAgICAgICAgICAgICAgIDogdGhpcy5fbW9udGhzU2hvcnRbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydClcbiAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU2hvcnRbbS5tb250aCgpXVxuICAgICAgICAgICAgOiB0aGlzLl9tb250aHNTaG9ydFtcbiAgICAgICAgICAgICAgICAgIE1PTlRIU19JTl9GT1JNQVQudGVzdChmb3JtYXQpID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSdcbiAgICAgICAgICAgICAgXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVN0cmljdFBhcnNlKG1vbnRoTmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBpaSxcbiAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgIGxsYyA9IG1vbnRoTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCB1c2VkXG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7ICsraSkge1xuICAgICAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRoc1Nob3J0KFxuICAgICAgICAgICAgICAgICAgICBtb20sXG4gICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnTU1NJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnTU1NJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1BhcnNlKG1vbnRoTmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVTdHJpY3RQYXJzZS5jYWxsKHRoaXMsIG1vbnRoTmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogYWRkIHNvcnRpbmdcbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSBtb250aCAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlclxuICAgICAgICAvLyBzZWUgc29ydGluZyBpbiBjb21wdXRlTW9udGhzUGFyc2VcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICYmICF0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKS5yZXBsYWNlKCcuJywgJycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsXG4gICAgICAgICAgICAgICAgICAgICdpJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0cmljdCAmJiAhdGhpcy5fbW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9XG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ01NTU0nICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ01NTScgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzZXRNb250aChtb20sIHZhbHVlKSB7XG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gTm8gb3BcbiAgICAgICAgICAgIHJldHVybiBtb207XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKC9eXFxkKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0b0ludCh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbW9tLmxvY2FsZURhdGEoKS5tb250aHNQYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogQW5vdGhlciBzaWxlbnQgZmFpbHVyZT9cbiAgICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtb250aCA9IHZhbHVlLFxuICAgICAgICAgICAgZGF0ZSA9IG1vbS5kYXRlKCk7XG5cbiAgICAgICAgZGF0ZSA9IGRhdGUgPCAyOSA/IGRhdGUgOiBNYXRoLm1pbihkYXRlLCBkYXlzSW5Nb250aChtb20ueWVhcigpLCBtb250aCkpO1xuICAgICAgICB2b2lkIChtb20uX2lzVVRDXG4gICAgICAgICAgICA/IG1vbS5fZC5zZXRVVENNb250aChtb250aCwgZGF0ZSlcbiAgICAgICAgICAgIDogbW9tLl9kLnNldE1vbnRoKG1vbnRoLCBkYXRlKSk7XG4gICAgICAgIHJldHVybiBtb207XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0TW9udGgodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCAnTW9udGgnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERheXNJbk1vbnRoKCkge1xuICAgICAgICByZXR1cm4gZGF5c0luTW9udGgodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzU2hvcnRSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBkZWZhdWx0TW9udGhzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNb250aHNQYXJzZSgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNob3J0UGllY2VzID0gW10sXG4gICAgICAgICAgICBsb25nUGllY2VzID0gW10sXG4gICAgICAgICAgICBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgIHNob3J0UCxcbiAgICAgICAgICAgIGxvbmdQO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIHNob3J0UCA9IHJlZ2V4RXNjYXBlKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ1AgPSByZWdleEVzY2FwZSh0aGlzLm1vbnRocyhtb20sICcnKSk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHNob3J0UCk7XG4gICAgICAgICAgICBsb25nUGllY2VzLnB1c2gobG9uZ1ApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25nUCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHNob3J0UCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSBtb250aCAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlciBpdFxuICAgICAgICAvLyB3aWxsIG1hdGNoIHRoZSBsb25nZXIgcGllY2UuXG4gICAgICAgIHNob3J0UGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbG9uZ1BpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIG1peGVkUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcblxuICAgICAgICB0aGlzLl9tb250aHNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRGF0ZSh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xuICAgICAgICAvLyBjYW4ndCBqdXN0IGFwcGx5KCkgdG8gY3JlYXRlIGEgZGF0ZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE4MTM0OFxuICAgICAgICB2YXIgZGF0ZTtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkLCBoLCBNLCBzLCBtcyk7XG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGF0ZS5nZXRGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDRGF0ZSh5KSB7XG4gICAgICAgIHZhciBkYXRlLCBhcmdzO1xuICAgICAgICAvLyB0aGUgRGF0ZS5VVEMgZnVuY3Rpb24gcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgYXJnc1swXSA9IHkgKyA0MDA7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMuYXBwbHkobnVsbCwgYXJncykpO1xuICAgICAgICAgICAgaWYgKGlzRmluaXRlKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgLy8gc3RhcnQtb2YtZmlyc3Qtd2VlayAtIHN0YXJ0LW9mLXllYXJcbiAgICBmdW5jdGlvbiBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIC8vIGZpcnN0LXdlZWsgZGF5IC0tIHdoaWNoIGphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrICg0IGZvciBpc28sIDEgZm9yIG90aGVyKVxuICAgICAgICAgICAgZndkID0gNyArIGRvdyAtIGRveSxcbiAgICAgICAgICAgIC8vIGZpcnN0LXdlZWsgZGF5IGxvY2FsIHdlZWtkYXkgLS0gd2hpY2ggbG9jYWwgd2Vla2RheSBpcyBmd2RcbiAgICAgICAgICAgIGZ3ZGx3ID0gKDcgKyBjcmVhdGVVVENEYXRlKHllYXIsIDAsIGZ3ZCkuZ2V0VVRDRGF5KCkgLSBkb3cpICUgNztcblxuICAgICAgICByZXR1cm4gLWZ3ZGx3ICsgZndkIC0gMTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlI0NhbGN1bGF0aW5nX2FfZGF0ZV9naXZlbl90aGVfeWVhci4yQ193ZWVrX251bWJlcl9hbmRfd2Vla2RheVxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrcyh5ZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgbG9jYWxXZWVrZGF5ID0gKDcgKyB3ZWVrZGF5IC0gZG93KSAlIDcsXG4gICAgICAgICAgICB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRheU9mWWVhciA9IDEgKyA3ICogKHdlZWsgLSAxKSArIGxvY2FsV2Vla2RheSArIHdlZWtPZmZzZXQsXG4gICAgICAgICAgICByZXNZZWFyLFxuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyO1xuXG4gICAgICAgIGlmIChkYXlPZlllYXIgPD0gMCkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgLSAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5c0luWWVhcihyZXNZZWFyKSArIGRheU9mWWVhcjtcbiAgICAgICAgfSBlbHNlIGlmIChkYXlPZlllYXIgPiBkYXlzSW5ZZWFyKHllYXIpKSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhciArIDE7XG4gICAgICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlPZlllYXIgLSBkYXlzSW5ZZWFyKHllYXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXI7XG4gICAgICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlPZlllYXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcjogcmVzWWVhcixcbiAgICAgICAgICAgIGRheU9mWWVhcjogcmVzRGF5T2ZZZWFyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtPZlllYXIobW9tLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldChtb20ueWVhcigpLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrID0gTWF0aC5mbG9vcigobW9tLmRheU9mWWVhcigpIC0gd2Vla09mZnNldCAtIDEpIC8gNykgKyAxLFxuICAgICAgICAgICAgcmVzV2VlayxcbiAgICAgICAgICAgIHJlc1llYXI7XG5cbiAgICAgICAgaWYgKHdlZWsgPCAxKSB7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSAtIDE7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlayArIHdlZWtzSW5ZZWFyKHJlc1llYXIsIGRvdywgZG95KTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrID4gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlayAtIHdlZWtzSW5ZZWFyKG1vbS55ZWFyKCksIGRvdywgZG95KTtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpO1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2VlazogcmVzV2VlayxcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla3NJblllYXIoeWVhciwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICAgICAgd2Vla09mZnNldE5leHQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciArIDEsIGRvdywgZG95KTtcbiAgICAgICAgcmV0dXJuIChkYXlzSW5ZZWFyKHllYXIpIC0gd2Vla09mZnNldCArIHdlZWtPZmZzZXROZXh0KSAvIDc7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3cnLCBbJ3d3JywgMl0sICd3bycsICd3ZWVrJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ1cnLCBbJ1dXJywgMl0sICdXbycsICdpc29XZWVrJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd3JywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCd3dycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdXJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdXVycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFxuICAgICAgICBbJ3cnLCAnd3cnLCAnVycsICdXVyddLFxuICAgICAgICBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDEpXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyBMT0NBTEVTXG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrKG1vbSkge1xuICAgICAgICByZXR1cm4gd2Vla09mWWVhcihtb20sIHRoaXMuX3dlZWsuZG93LCB0aGlzLl93ZWVrLmRveSkud2VlaztcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWsgPSB7XG4gICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mV2VlaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZZZWFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3k7XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2VlayhpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKChpbnB1dCAtIHdlZWspICogNywgJ2QnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRJU09XZWVrKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gd2Vla09mWWVhcih0aGlzLCAxLCA0KS53ZWVrO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2QnLCAwLCAnZG8nLCAnZGF5Jyk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbih0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdlJywgMCwgMCwgJ3dlZWtkYXknKTtcbiAgICBhZGRGb3JtYXRUb2tlbignRScsIDAsIDAsICdpc29XZWVrZGF5Jyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdkJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdlJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdFJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdkZCcsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNNaW5SZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkZGQnLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydkZCcsICdkZGQnLCAnZGRkZCddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIHdlZWtkYXkgPSBjb25maWcuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IGEgd2Vla2RheSBuYW1lLCBtYXJrIHRoZSBkYXRlIGFzIGludmFsaWRcbiAgICAgICAgaWYgKHdlZWtkYXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2Vlay5kID0gd2Vla2RheTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRXZWVrZGF5ID0gaW5wdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZCcsICdlJywgJ0UnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW5dID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGlucHV0LCBsb2NhbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOYU4oaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0ID0gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VJc29XZWVrZGF5KGlucHV0LCBsb2NhbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCkgJSA3IHx8IDc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzTmFOKGlucHV0KSA/IG51bGwgOiBpbnB1dDtcbiAgICB9XG5cbiAgICAvLyBMT0NBTEVTXG4gICAgZnVuY3Rpb24gc2hpZnRXZWVrZGF5cyh3cywgbikge1xuICAgICAgICByZXR1cm4gd3Muc2xpY2UobiwgNykuY29uY2F0KHdzLnNsaWNlKDAsIG4pKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWtkYXlzID1cbiAgICAgICAgICAgICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoJ18nKSxcbiAgICAgICAgZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQgPSAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4gPSAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGRlZmF1bHRXZWVrZGF5c1JlZ2V4ID0gbWF0Y2hXb3JkLFxuICAgICAgICBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4ID0gbWF0Y2hXb3JkLFxuICAgICAgICBkZWZhdWx0V2Vla2RheXNNaW5SZWdleCA9IG1hdGNoV29yZDtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgd2Vla2RheXMgPSBpc0FycmF5KHRoaXMuX3dlZWtkYXlzKVxuICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c1xuICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c1tcbiAgICAgICAgICAgICAgICAgIG0gJiYgbSAhPT0gdHJ1ZSAmJiB0aGlzLl93ZWVrZGF5cy5pc0Zvcm1hdC50ZXN0KGZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgICA/ICdmb3JtYXQnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnc3RhbmRhbG9uZSdcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIG0gPT09IHRydWVcbiAgICAgICAgICAgID8gc2hpZnRXZWVrZGF5cyh3ZWVrZGF5cywgdGhpcy5fd2Vlay5kb3cpXG4gICAgICAgICAgICA6IG1cbiAgICAgICAgICAgICAgPyB3ZWVrZGF5c1ttLmRheSgpXVxuICAgICAgICAgICAgICA6IHdlZWtkYXlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzU2hvcnQobSkge1xuICAgICAgICByZXR1cm4gbSA9PT0gdHJ1ZVxuICAgICAgICAgICAgPyBzaGlmdFdlZWtkYXlzKHRoaXMuX3dlZWtkYXlzU2hvcnQsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNTaG9ydFttLmRheSgpXVxuICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzU2hvcnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNNaW4obSkge1xuICAgICAgICByZXR1cm4gbSA9PT0gdHJ1ZVxuICAgICAgICAgICAgPyBzaGlmdFdlZWtkYXlzKHRoaXMuX3dlZWtkYXlzTWluLCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogbVxuICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldXG4gICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNNaW47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UkMSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBpaSxcbiAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgIGxsYyA9IHdlZWtkYXlOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNNaW4oXG4gICAgICAgICAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICApLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5c1Nob3J0KFxuICAgICAgICAgICAgICAgICAgICBtb20sXG4gICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnZGRkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2RkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2RkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c1BhcnNlKHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgbW9tLCByZWdleDtcblxuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU3RyaWN0UGFyc2UkMS5jYWxsKHRoaXMsIHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuXG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICBpZiAoc3RyaWN0ICYmICF0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFxcXC4/JykgKyAnJCcsXG4gICAgICAgICAgICAgICAgICAgICdpJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9XG4gICAgICAgICAgICAgICAgICAgICdeJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheXMobW9tLCAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnfF4nICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ3xeJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheXNNaW4obW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRlc3QgdGhlIHJlZ2V4XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnZGRkZCcgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ2RkZCcgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdkZCcgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCAmJiB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXREYXlPZldlZWsoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRheSA9IGdldCh0aGlzLCAnRGF5Jyk7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbnB1dCA9IHBhcnNlV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKGlucHV0IC0gZGF5LCAnZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRheTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldExvY2FsZURheU9mV2VlayhpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdlZWtkYXkgPSAodGhpcy5kYXkoKSArIDcgLSB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3cpICUgNztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrZGF5IDogdGhpcy5hZGQoaW5wdXQgLSB3ZWVrZGF5LCAnZCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT0RheU9mV2VlayhpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgIC8vIGFzIGEgZ2V0dGVyLCByZXR1cm5zIDcgaW5zdGVhZCBvZiAwICgxLTcgcmFuZ2UgaW5zdGVhZCBvZiAwLTYpXG4gICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cblxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWtkYXkgOiB3ZWVrZGF5IC0gNyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKSB8fCA3O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla2RheXNSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IGRlZmF1bHRXZWVrZGF5c1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1Nob3J0UmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1Nob3J0UmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCA9IGRlZmF1bHRXZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzTWluUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzTWluUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzTWluUmVnZXggPSBkZWZhdWx0V2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4XG4gICAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZVdlZWtkYXlzUGFyc2UoKSB7XG4gICAgICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYi5sZW5ndGggLSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtaW5QaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIHNob3J0UGllY2VzID0gW10sXG4gICAgICAgICAgICBsb25nUGllY2VzID0gW10sXG4gICAgICAgICAgICBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgIG1pbnAsXG4gICAgICAgICAgICBzaG9ydHAsXG4gICAgICAgICAgICBsb25ncDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICBtaW5wID0gcmVnZXhFc2NhcGUodGhpcy53ZWVrZGF5c01pbihtb20sICcnKSk7XG4gICAgICAgICAgICBzaG9ydHAgPSByZWdleEVzY2FwZSh0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ3AgPSByZWdleEVzY2FwZSh0aGlzLndlZWtkYXlzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1pblBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgc2hvcnRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHNob3J0cCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIHdlZWtkYXkgKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBtaW5QaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbWluUGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIGhGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgJSAxMiB8fCAxMjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpIHx8IDI0O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdIJywgWydISCcsIDJdLCAwLCAnaG91cicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdoJywgWydoaCcsIDJdLCAwLCBoRm9ybWF0KTtcbiAgICBhZGRGb3JtYXRUb2tlbignaycsIFsna2snLCAyXSwgMCwga0Zvcm1hdCk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgJycgK1xuICAgICAgICAgICAgaEZvcm1hdC5hcHBseSh0aGlzKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMikgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5zZWNvbmRzKCksIDIpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyB0aGlzLmhvdXJzKCkgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMik7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignSG1tc3MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAnJyArXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCkgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW0odG9rZW4sIGxvd2VyY2FzZSkge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbih0b2tlbiwgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1lcmlkaWVtKFxuICAgICAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgICAgICBsb3dlcmNhc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG1lcmlkaWVtKCdhJywgdHJ1ZSk7XG4gICAgbWVyaWRpZW0oJ0EnLCBmYWxzZSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBmdW5jdGlvbiBtYXRjaE1lcmlkaWVtKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fbWVyaWRpZW1QYXJzZTtcbiAgICB9XG5cbiAgICBhZGRSZWdleFRva2VuKCdhJywgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignQScsIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0gnLCBtYXRjaDF0bzIsIG1hdGNoMXRvMkhhc1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2gnLCBtYXRjaDF0bzIsIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2snLCBtYXRjaDF0bzIsIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0hIJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2hoJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2trJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG4gICAgYWRkUmVnZXhUb2tlbignaG1tJywgbWF0Y2gzdG80KTtcbiAgICBhZGRSZWdleFRva2VuKCdobW1zcycsIG1hdGNoNXRvNik7XG4gICAgYWRkUmVnZXhUb2tlbignSG1tJywgbWF0Y2gzdG80KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW1zcycsIG1hdGNoNXRvNik7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnSCcsICdISCddLCBIT1VSKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnaycsICdrayddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIGtJbnB1dCA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSBrSW5wdXQgPT09IDI0ID8gMCA6IGtJbnB1dDtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnYScsICdBJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2lzUG0gPSBjb25maWcuX2xvY2FsZS5pc1BNKGlucHV0KTtcbiAgICAgICAgY29uZmlnLl9tZXJpZGllbSA9IGlucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydoJywgJ2hoJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignaG1tJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MpKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignaG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0LFxuICAgICAgICAgICAgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdIbW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIHZhciBwb3MxID0gaW5wdXQubGVuZ3RoIC0gNCxcbiAgICAgICAgICAgIHBvczIgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgICAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMSwgMikpO1xuICAgICAgICBhcnJheVtTRUNPTkRdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczIpKTtcbiAgICB9KTtcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUlzUE0oaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IFF1aXJrcyBNb2RlICYgSUU3IFN0YW5kYXJkcyBNb2RlIGRvIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3RyaW5ncyBsaWtlIGFycmF5c1xuICAgICAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICAgICAgcmV0dXJuIChpbnB1dCArICcnKS50b0xvd2VyQ2FzZSgpLmNoYXJBdCgwKSA9PT0gJ3AnO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZSA9IC9bYXBdXFwuP20/XFwuPy9pLFxuICAgICAgICAvLyBTZXR0aW5nIHRoZSBob3VyIHNob3VsZCBrZWVwIHRoZSB0aW1lLCBiZWNhdXNlIHRoZSB1c2VyIGV4cGxpY2l0bHlcbiAgICAgICAgLy8gc3BlY2lmaWVkIHdoaWNoIGhvdXIgdGhleSB3YW50LiBTbyB0cnlpbmcgdG8gbWFpbnRhaW4gdGhlIHNhbWUgaG91ciAoaW5cbiAgICAgICAgLy8gYSBuZXcgdGltZXpvbmUpIG1ha2VzIHNlbnNlLiBBZGRpbmcvc3VidHJhY3RpbmcgaG91cnMgZG9lcyBub3QgZm9sbG93XG4gICAgICAgIC8vIHRoaXMgcnVsZS5cbiAgICAgICAgZ2V0U2V0SG91ciA9IG1ha2VHZXRTZXQoJ0hvdXJzJywgdHJ1ZSk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNZXJpZGllbShob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAncG0nIDogJ1BNJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2FtJyA6ICdBTSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYmFzZUNvbmZpZyA9IHtcbiAgICAgICAgY2FsZW5kYXI6IGRlZmF1bHRDYWxlbmRhcixcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IGRlZmF1bHRMb25nRGF0ZUZvcm1hdCxcbiAgICAgICAgaW52YWxpZERhdGU6IGRlZmF1bHRJbnZhbGlkRGF0ZSxcbiAgICAgICAgb3JkaW5hbDogZGVmYXVsdE9yZGluYWwsXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IGRlZmF1bHREYXlPZk1vbnRoT3JkaW5hbFBhcnNlLFxuICAgICAgICByZWxhdGl2ZVRpbWU6IGRlZmF1bHRSZWxhdGl2ZVRpbWUsXG5cbiAgICAgICAgbW9udGhzOiBkZWZhdWx0TG9jYWxlTW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LFxuXG4gICAgICAgIHdlZWs6IGRlZmF1bHRMb2NhbGVXZWVrLFxuXG4gICAgICAgIHdlZWtkYXlzOiBkZWZhdWx0TG9jYWxlV2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0LFxuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlLFxuICAgIH07XG5cbiAgICAvLyBpbnRlcm5hbCBzdG9yYWdlIGZvciBsb2NhbGUgY29uZmlnIGZpbGVzXG4gICAgdmFyIGxvY2FsZXMgPSB7fSxcbiAgICAgICAgbG9jYWxlRmFtaWxpZXMgPSB7fSxcbiAgICAgICAgZ2xvYmFsTG9jYWxlO1xuXG4gICAgZnVuY3Rpb24gY29tbW9uUHJlZml4KGFycjEsIGFycjIpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBtaW5sID0gTWF0aC5taW4oYXJyMS5sZW5ndGgsIGFycjIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG1pbmw7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlubDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVMb2NhbGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgPyBrZXkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdfJywgJy0nKSA6IGtleTtcbiAgICB9XG5cbiAgICAvLyBwaWNrIHRoZSBsb2NhbGUgZnJvbSB0aGUgYXJyYXlcbiAgICAvLyB0cnkgWydlbi1hdScsICdlbi1nYiddIGFzICdlbi1hdScsICdlbi1nYicsICdlbicsIGFzIGluIG1vdmUgdGhyb3VnaCB0aGUgbGlzdCB0cnlpbmcgZWFjaFxuICAgIC8vIHN1YnN0cmluZyBmcm9tIG1vc3Qgc3BlY2lmaWMgdG8gbGVhc3QsIGJ1dCBtb3ZlIHRvIHRoZSBuZXh0IGFycmF5IGl0ZW0gaWYgaXQncyBhIG1vcmUgc3BlY2lmaWMgdmFyaWFudCB0aGFuIHRoZSBjdXJyZW50IHJvb3RcbiAgICBmdW5jdGlvbiBjaG9vc2VMb2NhbGUobmFtZXMpIHtcbiAgICAgICAgdmFyIGkgPSAwLFxuICAgICAgICAgICAgaixcbiAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICBzcGxpdDtcblxuICAgICAgICB3aGlsZSAoaSA8IG5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBuZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgIG5leHQubGVuZ3RoID49IGogJiZcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uUHJlZml4KHNwbGl0LCBuZXh0KSA+PSBqIC0gMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHRoYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xvY2FsZU5hbWVTYW5lKG5hbWUpIHtcbiAgICAgICAgLy8gUHJldmVudCBuYW1lcyB0aGF0IGxvb2sgbGlrZSBmaWxlc3lzdGVtIHBhdGhzLCBpLmUgY29udGFpbiAnLycgb3IgJ1xcJ1xuICAgICAgICAvLyBFbnN1cmUgbmFtZSBpcyBhdmFpbGFibGUgYW5kIGZ1bmN0aW9uIHJldHVybnMgYm9vbGVhblxuICAgICAgICByZXR1cm4gISEobmFtZSAmJiBuYW1lLm1hdGNoKCdeW14vXFxcXFxcXFxdKiQnKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9hZExvY2FsZShuYW1lKSB7XG4gICAgICAgIHZhciBvbGRMb2NhbGUgPSBudWxsLFxuICAgICAgICAgICAgYWxpYXNlZFJlcXVpcmU7XG4gICAgICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHJlZ2lzdGVyIGFuZCBsb2FkIGFsbCB0aGUgbG9jYWxlcyBpbiBOb2RlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIG1vZHVsZSAmJlxuICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgJiZcbiAgICAgICAgICAgIGlzTG9jYWxlTmFtZVNhbmUobmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9sZExvY2FsZSA9IGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICAgICAgICAgICAgICBhbGlhc2VkUmVxdWlyZSA9IHJlcXVpcmU7XG4gICAgICAgICAgICAgICAgYWxpYXNlZFJlcXVpcmUoJy4vbG9jYWxlLycgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUob2xkTG9jYWxlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIG5vdCBmb3VuZCB0byBhdm9pZCByZXBlYXRpbmcgZXhwZW5zaXZlIGZpbGUgcmVxdWlyZSBjYWxsIGNhdXNpbmcgaGlnaCBDUFVcbiAgICAgICAgICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBmaW5kIGVuLVVTLCBlbl9VUywgZW4tdXMgZm9yIGV2ZXJ5IGZvcm1hdCBjYWxsXG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IG51bGw7IC8vIG51bGwgbWVhbnMgbm90IGZvdW5kXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgbG9jYWxlIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGxvY2FsZS4gIElmXG4gICAgLy8gbm8gYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4sIGl0IHdpbGwgc2ltcGx5IHJldHVybiB0aGUgY3VycmVudCBnbG9iYWxcbiAgICAvLyBsb2NhbGUga2V5LlxuICAgIGZ1bmN0aW9uIGdldFNldEdsb2JhbExvY2FsZShrZXksIHZhbHVlcykge1xuICAgICAgICB2YXIgZGF0YTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkZWZpbmVMb2NhbGUoa2V5LCB2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIG1vbWVudC5kdXJhdGlvbi5fbG9jYWxlID0gbW9tZW50Ll9sb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGdsb2JhbExvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vd2FybiB1c2VyIGlmIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGJ1dCB0aGUgbG9jYWxlIGNvdWxkIG5vdCBiZSBzZXRcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0xvY2FsZSAnICsga2V5ICsgJyBub3QgZm91bmQuIERpZCB5b3UgZm9yZ2V0IHRvIGxvYWQgaXQ/J1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGUuX2FiYnI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVmaW5lTG9jYWxlKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgICAgICBjb25maWcuYWJiciA9IG5hbWU7XG4gICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKFxuICAgICAgICAgICAgICAgICAgICAnZGVmaW5lTG9jYWxlT3ZlcnJpZGUnLFxuICAgICAgICAgICAgICAgICAgICAndXNlIG1vbWVudC51cGRhdGVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSB0byBjaGFuZ2UgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnYW4gZXhpc3RpbmcgbG9jYWxlLiBtb21lbnQuZGVmaW5lTG9jYWxlKGxvY2FsZU5hbWUsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZykgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbG9jYWxlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RlZmluZS1sb2NhbGUvIGZvciBtb3JlIGluZm8uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlc1tuYW1lXS5fY29uZmlnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlc1tjb25maWcucGFyZW50TG9jYWxlXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0uX2NvbmZpZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGNvbmZpZy5wYXJlbnRMb2NhbGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBuZXcgTG9jYWxlKG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZykpO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxlRmFtaWxpZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZUxvY2FsZSh4Lm5hbWUsIHguY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc2V0IHRoZSBsb2NhbGUgQUZURVIgYWxsIGNoaWxkIGxvY2FsZXMgaGF2ZSBiZWVuXG4gICAgICAgICAgICAvLyBjcmVhdGVkLCBzbyB3ZSB3b24ndCBlbmQgdXAgd2l0aCB0aGUgY2hpbGQgbG9jYWxlIHNldC5cbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcblxuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB1c2VmdWwgZm9yIHRlc3RpbmdcbiAgICAgICAgICAgIGRlbGV0ZSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVMb2NhbGUobmFtZSwgY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSxcbiAgICAgICAgICAgICAgICB0bXBMb2NhbGUsXG4gICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gYmFzZUNvbmZpZztcblxuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCAmJiBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGNoaWxkIGxvY2FsZSBpbi1wbGFjZSB0byBhdm9pZCBtZW1vcnktbGVha3NcbiAgICAgICAgICAgICAgICBsb2NhbGVzW25hbWVdLnNldChtZXJnZUNvbmZpZ3MobG9jYWxlc1tuYW1lXS5fY29uZmlnLCBjb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTUVSR0VcbiAgICAgICAgICAgICAgICB0bXBMb2NhbGUgPSBsb2FkTG9jYWxlKG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICh0bXBMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSB0bXBMb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKTtcbiAgICAgICAgICAgICAgICBpZiAodG1wTG9jYWxlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlTG9jYWxlIGlzIGNhbGxlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbG9jYWxlXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBhYmJyIHNvIGl0IHdpbGwgaGF2ZSBhIG5hbWUgKGdldHRlcnMgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZCBvdGhlcndpc2UpLlxuICAgICAgICAgICAgICAgICAgICBjb25maWcuYWJiciA9IG5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoY29uZmlnKTtcbiAgICAgICAgICAgICAgICBsb2NhbGUucGFyZW50TG9jYWxlID0gbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbG9jYWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBub3c6IGFsc28gc2V0IHRoZSBsb2NhbGVcbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhc3MgbnVsbCBmb3IgY29uZmlnIHRvIHVudXBkYXRlLCB1c2VmdWwgZm9yIHRlc3RzXG4gICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0ucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZXNbbmFtZV0ucGFyZW50TG9jYWxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZ2V0U2V0R2xvYmFsTG9jYWxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIGxvY2FsZSBkYXRhXG4gICAgZnVuY3Rpb24gZ2V0TG9jYWxlKGtleSkge1xuICAgICAgICB2YXIgbG9jYWxlO1xuXG4gICAgICAgIGlmIChrZXkgJiYga2V5Ll9sb2NhbGUgJiYga2V5Ll9sb2NhbGUuX2FiYnIpIHtcbiAgICAgICAgICAgIGtleSA9IGtleS5fbG9jYWxlLl9hYmJyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxMb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgICAgLy9zaG9ydC1jaXJjdWl0IGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShrZXkpO1xuICAgICAgICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrZXkgPSBba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaG9vc2VMb2NhbGUoa2V5KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TG9jYWxlcygpIHtcbiAgICAgICAgcmV0dXJuIGtleXMobG9jYWxlcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tPdmVyZmxvdyhtKSB7XG4gICAgICAgIHZhciBvdmVyZmxvdyxcbiAgICAgICAgICAgIGEgPSBtLl9hO1xuXG4gICAgICAgIGlmIChhICYmIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9PT0gLTIpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID1cbiAgICAgICAgICAgICAgICBhW01PTlRIXSA8IDAgfHwgYVtNT05USF0gPiAxMVxuICAgICAgICAgICAgICAgICAgICA/IE1PTlRIXG4gICAgICAgICAgICAgICAgICAgIDogYVtEQVRFXSA8IDEgfHwgYVtEQVRFXSA+IGRheXNJbk1vbnRoKGFbWUVBUl0sIGFbTU9OVEhdKVxuICAgICAgICAgICAgICAgICAgICAgID8gREFURVxuICAgICAgICAgICAgICAgICAgICAgIDogYVtIT1VSXSA8IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYVtIT1VSXSA+IDI0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChhW0hPVVJdID09PSAyNCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFbTUlOVVRFXSAhPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbU0VDT05EXSAhPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbTUlMTElTRUNPTkRdICE9PSAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gSE9VUlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhW01JTlVURV0gPCAwIHx8IGFbTUlOVVRFXSA+IDU5XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gTUlOVVRFXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYVtTRUNPTkRdIDwgMCB8fCBhW1NFQ09ORF0gPiA1OVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU0VDT05EXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhW01JTExJU0VDT05EXSA8IDAgfHwgYVtNSUxMSVNFQ09ORF0gPiA5OTlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTUlMTElTRUNPTkRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLTE7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93RGF5T2ZZZWFyICYmXG4gICAgICAgICAgICAgICAgKG92ZXJmbG93IDwgWUVBUiB8fCBvdmVyZmxvdyA+IERBVEUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IERBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtzICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla2RheSAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUtEQVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gaXNvIDg2MDEgcmVnZXhcbiAgICAvLyAwMDAwLTAwLTAwIDAwMDAtVzAwIG9yIDAwMDAtVzAwLTAgKyBUICsgMDAgb3IgMDA6MDAgb3IgMDA6MDA6MDAgb3IgMDA6MDA6MDAuMDAwICsgKzAwOjAwIG9yICswMDAwIG9yICswMClcbiAgICB2YXIgZXh0ZW5kZWRJc29SZWdleCA9XG4gICAgICAgICAgICAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pLSg/OlxcZFxcZC1cXGRcXGR8V1xcZFxcZC1cXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzo6XFxkXFxkKD86OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbKy1dXFxkXFxkKD86Oj9cXGRcXGQpP3xcXHMqWik/KT8kLyxcbiAgICAgICAgYmFzaWNJc29SZWdleCA9XG4gICAgICAgICAgICAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pKD86XFxkXFxkXFxkXFxkfFdcXGRcXGRcXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkfCkpKD86KFR8ICkoXFxkXFxkKD86XFxkXFxkKD86XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvLFxuICAgICAgICB0elJlZ2V4ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vLFxuICAgICAgICBpc29EYXRlcyA9IFtcbiAgICAgICAgICAgIFsnWVlZWVlZLU1NLUREJywgL1srLV1cXGR7Nn0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICAgICAgWydZWVlZLU1NLUREJywgL1xcZHs0fS1cXGRcXGQtXFxkXFxkL10sXG4gICAgICAgICAgICBbJ0dHR0ctW1ddV1ctRScsIC9cXGR7NH0tV1xcZFxcZC1cXGQvXSxcbiAgICAgICAgICAgIFsnR0dHRy1bV11XVycsIC9cXGR7NH0tV1xcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWS1EREQnLCAvXFxkezR9LVxcZHszfS9dLFxuICAgICAgICAgICAgWydZWVlZLU1NJywgL1xcZHs0fS1cXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVlZWU1NREQnLCAvWystXVxcZHsxMH0vXSxcbiAgICAgICAgICAgIFsnWVlZWU1NREQnLCAvXFxkezh9L10sXG4gICAgICAgICAgICBbJ0dHR0dbV11XV0UnLCAvXFxkezR9V1xcZHszfS9dLFxuICAgICAgICAgICAgWydHR0dHW1ddV1cnLCAvXFxkezR9V1xcZHsyfS8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWURERCcsIC9cXGR7N30vXSxcbiAgICAgICAgICAgIFsnWVlZWU1NJywgL1xcZHs2fS8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWScsIC9cXGR7NH0vLCBmYWxzZV0sXG4gICAgICAgIF0sXG4gICAgICAgIC8vIGlzbyB0aW1lIGZvcm1hdHMgYW5kIHJlZ2V4ZXNcbiAgICAgICAgaXNvVGltZXMgPSBbXG4gICAgICAgICAgICBbJ0hIOm1tOnNzLlNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgICAgICBbJ0hIOm1tOnNzLFNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFxuICAgICAgICAgICAgWydISDptbTpzcycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICAgICAgWydISDptbScsIC9cXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgICAgICBbJ0hIbW1zcy5TU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgICAgIFsnSEhtbXNzLFNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkLFxcZCsvXSxcbiAgICAgICAgICAgIFsnSEhtbXNzJywgL1xcZFxcZFxcZFxcZFxcZFxcZC9dLFxuICAgICAgICAgICAgWydISG1tJywgL1xcZFxcZFxcZFxcZC9dLFxuICAgICAgICAgICAgWydISCcsIC9cXGRcXGQvXSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNwTmV0SnNvblJlZ2V4ID0gL15cXC8/RGF0ZVxcKCgtP1xcZCspL2ksXG4gICAgICAgIC8vIFJGQyAyODIyIHJlZ2V4OiBGb3IgZGV0YWlscyBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI4MjIjc2VjdGlvbi0zLjNcbiAgICAgICAgcmZjMjgyMiA9XG4gICAgICAgICAgICAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLD9cXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KFsrLV1cXGR7NH0pKSQvLFxuICAgICAgICBvYnNPZmZzZXRzID0ge1xuICAgICAgICAgICAgVVQ6IDAsXG4gICAgICAgICAgICBHTVQ6IDAsXG4gICAgICAgICAgICBFRFQ6IC00ICogNjAsXG4gICAgICAgICAgICBFU1Q6IC01ICogNjAsXG4gICAgICAgICAgICBDRFQ6IC01ICogNjAsXG4gICAgICAgICAgICBDU1Q6IC02ICogNjAsXG4gICAgICAgICAgICBNRFQ6IC02ICogNjAsXG4gICAgICAgICAgICBNU1Q6IC03ICogNjAsXG4gICAgICAgICAgICBQRFQ6IC03ICogNjAsXG4gICAgICAgICAgICBQU1Q6IC04ICogNjAsXG4gICAgICAgIH07XG5cbiAgICAvLyBkYXRlIGZyb20gaXNvIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JU08oY29uZmlnKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHN0cmluZyA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIG1hdGNoID0gZXh0ZW5kZWRJc29SZWdleC5leGVjKHN0cmluZykgfHwgYmFzaWNJc29SZWdleC5leGVjKHN0cmluZyksXG4gICAgICAgICAgICBhbGxvd1RpbWUsXG4gICAgICAgICAgICBkYXRlRm9ybWF0LFxuICAgICAgICAgICAgdGltZUZvcm1hdCxcbiAgICAgICAgICAgIHR6Rm9ybWF0LFxuICAgICAgICAgICAgaXNvRGF0ZXNMZW4gPSBpc29EYXRlcy5sZW5ndGgsXG4gICAgICAgICAgICBpc29UaW1lc0xlbiA9IGlzb1RpbWVzLmxlbmd0aDtcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmlzbyA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvRGF0ZXNMZW47IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNvRGF0ZXNbaV1bMV0uZXhlYyhtYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdCA9IGlzb0RhdGVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBhbGxvd1RpbWUgPSBpc29EYXRlc1tpXVsyXSAhPT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRlRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbM10pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvVGltZXNMZW47IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzb1RpbWVzW2ldWzFdLmV4ZWMobWF0Y2hbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsyXSBzaG91bGQgYmUgJ1QnIG9yIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lRm9ybWF0ID0gKG1hdGNoWzJdIHx8ICcgJykgKyBpc29UaW1lc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aW1lRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFsbG93VGltZSAmJiB0aW1lRm9ybWF0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbNF0pIHtcbiAgICAgICAgICAgICAgICBpZiAodHpSZWdleC5leGVjKG1hdGNoWzRdKSkge1xuICAgICAgICAgICAgICAgICAgICB0ekZvcm1hdCA9ICdaJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZy5fZiA9IGRhdGVGb3JtYXQgKyAodGltZUZvcm1hdCB8fCAnJykgKyAodHpGb3JtYXQgfHwgJycpO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRyYWN0RnJvbVJGQzI4MjJTdHJpbmdzKFxuICAgICAgICB5ZWFyU3RyLFxuICAgICAgICBtb250aFN0cixcbiAgICAgICAgZGF5U3RyLFxuICAgICAgICBob3VyU3RyLFxuICAgICAgICBtaW51dGVTdHIsXG4gICAgICAgIHNlY29uZFN0clxuICAgICkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgdW50cnVuY2F0ZVllYXIoeWVhclN0ciksXG4gICAgICAgICAgICBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0ciksXG4gICAgICAgICAgICBwYXJzZUludChkYXlTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGhvdXJTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KG1pbnV0ZVN0ciwgMTApLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChzZWNvbmRTdHIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlSW50KHNlY29uZFN0ciwgMTApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW50cnVuY2F0ZVllYXIoeWVhclN0cikge1xuICAgICAgICB2YXIgeWVhciA9IHBhcnNlSW50KHllYXJTdHIsIDEwKTtcbiAgICAgICAgaWYgKHllYXIgPD0gNDkpIHtcbiAgICAgICAgICAgIHJldHVybiAyMDAwICsgeWVhcjtcbiAgICAgICAgfSBlbHNlIGlmICh5ZWFyIDw9IDk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIDE5MDAgKyB5ZWFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5ZWFyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgICAgICAgcmV0dXJuIHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXChbXigpXSpcXCl8W1xcblxcdF0vZywgJyAnKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCAnICcpXG4gICAgICAgICAgICAucmVwbGFjZSgvXlxcc1xccyovLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHNcXHMqJC8sICcnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja1dlZWtkYXkod2Vla2RheVN0ciwgcGFyc2VkSW5wdXQsIGNvbmZpZykge1xuICAgICAgICBpZiAod2Vla2RheVN0cikge1xuICAgICAgICAgICAgLy8gVE9ETzogUmVwbGFjZSB0aGUgdmFuaWxsYSBKUyBEYXRlIG9iamVjdCB3aXRoIGFuIGluZGVwZW5kZW50IGRheS1vZi13ZWVrIGNoZWNrLlxuICAgICAgICAgICAgdmFyIHdlZWtkYXlQcm92aWRlZCA9IGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0LmluZGV4T2Yod2Vla2RheVN0ciksXG4gICAgICAgICAgICAgICAgd2Vla2RheUFjdHVhbCA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRJbnB1dFswXSxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSW5wdXRbMV0sXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZElucHV0WzJdXG4gICAgICAgICAgICAgICAgKS5nZXREYXkoKTtcbiAgICAgICAgICAgIGlmICh3ZWVrZGF5UHJvdmlkZWQgIT09IHdlZWtkYXlBY3R1YWwpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVPZmZzZXQob2JzT2Zmc2V0LCBtaWxpdGFyeU9mZnNldCwgbnVtT2Zmc2V0KSB7XG4gICAgICAgIGlmIChvYnNPZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNPZmZzZXRzW29ic09mZnNldF07XG4gICAgICAgIH0gZWxzZSBpZiAobWlsaXRhcnlPZmZzZXQpIHtcbiAgICAgICAgICAgIC8vIHRoZSBvbmx5IGFsbG93ZWQgbWlsaXRhcnkgdHogaXMgWlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBwYXJzZUludChudW1PZmZzZXQsIDEwKSxcbiAgICAgICAgICAgICAgICBtID0gaG0gJSAxMDAsXG4gICAgICAgICAgICAgICAgaCA9IChobSAtIG0pIC8gMTAwO1xuICAgICAgICAgICAgcmV0dXJuIGggKiA2MCArIG07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGFuZCB0aW1lIGZyb20gcmVmIDI4MjIgZm9ybWF0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHJmYzI4MjIuZXhlYyhwcmVwcm9jZXNzUkZDMjgyMihjb25maWcuX2kpKSxcbiAgICAgICAgICAgIHBhcnNlZEFycmF5O1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHBhcnNlZEFycmF5ID0gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyhcbiAgICAgICAgICAgICAgICBtYXRjaFs0XSxcbiAgICAgICAgICAgICAgICBtYXRjaFszXSxcbiAgICAgICAgICAgICAgICBtYXRjaFsyXSxcbiAgICAgICAgICAgICAgICBtYXRjaFs1XSxcbiAgICAgICAgICAgICAgICBtYXRjaFs2XSxcbiAgICAgICAgICAgICAgICBtYXRjaFs3XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghY2hlY2tXZWVrZGF5KG1hdGNoWzFdLCBwYXJzZWRBcnJheSwgY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uZmlnLl9hID0gcGFyc2VkQXJyYXk7XG4gICAgICAgICAgICBjb25maWcuX3R6bSA9IGNhbGN1bGF0ZU9mZnNldChtYXRjaFs4XSwgbWF0Y2hbOV0sIG1hdGNoWzEwXSk7XG5cbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IGNyZWF0ZVVUQ0RhdGUuYXBwbHkobnVsbCwgY29uZmlnLl9hKTtcbiAgICAgICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnJmYzI4MjIgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gMSkgQVNQLk5FVCwgMikgSVNPLCAzKSBSRkMgMjgyMiBmb3JtYXRzLCBvciA0KSBvcHRpb25hbCBmYWxsYmFjayBpZiBwYXJzaW5nIGlzbid0IHN0cmljdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKSB7XG4gICAgICAgIHZhciBtYXRjaGVkID0gYXNwTmV0SnNvblJlZ2V4LmV4ZWMoY29uZmlnLl9pKTtcbiAgICAgICAgaWYgKG1hdGNoZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKCttYXRjaGVkWzFdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tUkZDMjgyMihjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX3N0cmljdCkge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaW5hbCBhdHRlbXB0LCB1c2UgSW5wdXQgRmFsbGJhY2tcbiAgICAgICAgICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ3ZhbHVlIHByb3ZpZGVkIGlzIG5vdCBpbiBhIHJlY29nbml6ZWQgUkZDMjgyMiBvciBJU08gZm9ybWF0LiBtb21lbnQgY29uc3RydWN0aW9uIGZhbGxzIGJhY2sgdG8ganMgRGF0ZSgpLCAnICtcbiAgICAgICAgICAgICd3aGljaCBpcyBub3QgcmVsaWFibGUgYWNyb3NzIGFsbCBicm93c2VycyBhbmQgdmVyc2lvbnMuIE5vbiBSRkMyODIyL0lTTyBkYXRlIGZvcm1hdHMgYXJlICcgK1xuICAgICAgICAgICAgJ2Rpc2NvdXJhZ2VkLiBQbGVhc2UgcmVmZXIgdG8gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9qcy1kYXRlLyBmb3IgbW9yZSBpbmZvLicsXG4gICAgICAgIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5faSArIChjb25maWcuX3VzZVVUQyA/ICcgVVRDJyA6ICcnKSk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gUGljayB0aGUgZmlyc3QgZGVmaW5lZCBvZiB0d28gb3IgdGhyZWUgYXJndW1lbnRzLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRzKGEsIGIsIGMpIHtcbiAgICAgICAgaWYgKGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VycmVudERhdGVBcnJheShjb25maWcpIHtcbiAgICAgICAgLy8gaG9va3MgaXMgYWN0dWFsbHkgdGhlIGV4cG9ydGVkIG1vbWVudCBvYmplY3RcbiAgICAgICAgdmFyIG5vd1ZhbHVlID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgbm93VmFsdWUuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgICAgICAgICAgICBub3dWYWx1ZS5nZXRVVENNb250aCgpLFxuICAgICAgICAgICAgICAgIG5vd1ZhbHVlLmdldFVUQ0RhdGUoKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtub3dWYWx1ZS5nZXRGdWxsWWVhcigpLCBub3dWYWx1ZS5nZXRNb250aCgpLCBub3dWYWx1ZS5nZXREYXRlKCldO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnQgYW4gYXJyYXkgdG8gYSBkYXRlLlxuICAgIC8vIHRoZSBhcnJheSBzaG91bGQgbWlycm9yIHRoZSBwYXJhbWV0ZXJzIGJlbG93XG4gICAgLy8gbm90ZTogYWxsIHZhbHVlcyBwYXN0IHRoZSB5ZWFyIGFyZSBvcHRpb25hbCBhbmQgd2lsbCBkZWZhdWx0IHRvIHRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUuXG4gICAgLy8gW3llYXIsIG1vbnRoLCBkYXkgLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmRdXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUFycmF5KGNvbmZpZykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBpbnB1dCA9IFtdLFxuICAgICAgICAgICAgY3VycmVudERhdGUsXG4gICAgICAgICAgICBleHBlY3RlZFdlZWtkYXksXG4gICAgICAgICAgICB5ZWFyVG9Vc2U7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudERhdGUgPSBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZyk7XG5cbiAgICAgICAgLy9jb21wdXRlIGRheSBvZiB0aGUgeWVhciBmcm9tIHdlZWtzIGFuZCB3ZWVrZGF5c1xuICAgICAgICBpZiAoY29uZmlnLl93ICYmIGNvbmZpZy5fYVtEQVRFXSA9PSBudWxsICYmIGNvbmZpZy5fYVtNT05USF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSBkYXkgb2YgdGhlIHllYXIgaXMgc2V0LCBmaWd1cmUgb3V0IHdoYXQgaXQgaXNcbiAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHllYXJUb1VzZSA9IGRlZmF1bHRzKGNvbmZpZy5fYVtZRUFSXSwgY3VycmVudERhdGVbWUVBUl0pO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPiBkYXlzSW5ZZWFyKHllYXJUb1VzZSkgfHxcbiAgICAgICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA9PT0gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93RGF5T2ZZZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoeWVhclRvVXNlLCAwLCBjb25maWcuX2RheU9mWWVhcik7XG4gICAgICAgICAgICBjb25maWcuX2FbTU9OVEhdID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgICAgICAgICAgY29uZmlnLl9hW0RBVEVdID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgZGF0ZS5cbiAgICAgICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxuICAgICAgICAvLyAqIGlmIGRheSBvZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBtb250aCBhbmQgeWVhclxuICAgICAgICAvLyAqIGlmIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG9ubHkgeWVhclxuICAgICAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgJiYgY29uZmlnLl9hW2ldID09IG51bGw7ICsraSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSBjdXJyZW50RGF0ZVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFplcm8gb3V0IHdoYXRldmVyIHdhcyBub3QgZGVmYXVsdGVkLCBpbmNsdWRpbmcgdGltZVxuICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPVxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9PSBudWxsID8gKGkgPT09IDIgPyAxIDogMCkgOiBjb25maWcuX2FbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgMjQ6MDA6MDAuMDAwXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9PT0gMjQgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNSU5VVEVdID09PSAwICYmXG4gICAgICAgICAgICBjb25maWcuX2FbU0VDT05EXSA9PT0gMCAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW01JTExJU0VDT05EXSA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbmZpZy5fbmV4dERheSA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLl9kID0gKGNvbmZpZy5fdXNlVVRDID8gY3JlYXRlVVRDRGF0ZSA6IGNyZWF0ZURhdGUpLmFwcGx5KFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGlucHV0XG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdGVkV2Vla2RheSA9IGNvbmZpZy5fdXNlVVRDXG4gICAgICAgICAgICA/IGNvbmZpZy5fZC5nZXRVVENEYXkoKVxuICAgICAgICAgICAgOiBjb25maWcuX2QuZ2V0RGF5KCk7XG5cbiAgICAgICAgLy8gQXBwbHkgdGltZXpvbmUgb2Zmc2V0IGZyb20gaW5wdXQuIFRoZSBhY3R1YWwgdXRjT2Zmc2V0IGNhbiBiZSBjaGFuZ2VkXG4gICAgICAgIC8vIHdpdGggcGFyc2Vab25lLlxuICAgICAgICBpZiAoY29uZmlnLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX25leHREYXkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDI0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZm9yIG1pc21hdGNoaW5nIGRheSBvZiB3ZWVrXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbmZpZy5fdyAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbmZpZy5fdy5kICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgY29uZmlnLl93LmQgIT09IGV4cGVjdGVkV2Vla2RheVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLndlZWtkYXlNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlPZlllYXJGcm9tV2Vla0luZm8oY29uZmlnKSB7XG4gICAgICAgIHZhciB3LCB3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3ksIHRlbXAsIHdlZWtkYXlPdmVyZmxvdywgY3VyV2VlaztcblxuICAgICAgICB3ID0gY29uZmlnLl93O1xuICAgICAgICBpZiAody5HRyAhPSBudWxsIHx8IHcuVyAhPSBudWxsIHx8IHcuRSAhPSBudWxsKSB7XG4gICAgICAgICAgICBkb3cgPSAxO1xuICAgICAgICAgICAgZG95ID0gNDtcblxuICAgICAgICAgICAgLy8gVE9ETzogV2UgbmVlZCB0byB0YWtlIHRoZSBjdXJyZW50IGlzb1dlZWtZZWFyLCBidXQgdGhhdCBkZXBlbmRzIG9uXG4gICAgICAgICAgICAvLyBob3cgd2UgaW50ZXJwcmV0IG5vdyAobG9jYWwsIHV0YywgZml4ZWQgb2Zmc2V0KS4gU28gY3JlYXRlXG4gICAgICAgICAgICAvLyBhIG5vdyB2ZXJzaW9uIG9mIGN1cnJlbnQgY29uZmlnICh0YWtlIGxvY2FsL3V0Yy9vZmZzZXQgZmxhZ3MsIGFuZFxuICAgICAgICAgICAgLy8gY3JlYXRlIG5vdykuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKFxuICAgICAgICAgICAgICAgIHcuR0csXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdLFxuICAgICAgICAgICAgICAgIHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgMSwgNCkueWVhclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHdlZWsgPSBkZWZhdWx0cyh3LlcsIDEpO1xuICAgICAgICAgICAgd2Vla2RheSA9IGRlZmF1bHRzKHcuRSwgMSk7XG4gICAgICAgICAgICBpZiAod2Vla2RheSA8IDEgfHwgd2Vla2RheSA+IDcpIHtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG93ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG93O1xuICAgICAgICAgICAgZG95ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG95O1xuXG4gICAgICAgICAgICBjdXJXZWVrID0gd2Vla09mWWVhcihjcmVhdGVMb2NhbCgpLCBkb3csIGRveSk7XG5cbiAgICAgICAgICAgIHdlZWtZZWFyID0gZGVmYXVsdHMody5nZywgY29uZmlnLl9hW1lFQVJdLCBjdXJXZWVrLnllYXIpO1xuXG4gICAgICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgd2Vlay5cbiAgICAgICAgICAgIHdlZWsgPSBkZWZhdWx0cyh3LncsIGN1cldlZWsud2Vlayk7XG5cbiAgICAgICAgICAgIGlmICh3LmQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIHdlZWtkYXkgLS0gbG93IGRheSBudW1iZXJzIGFyZSBjb25zaWRlcmVkIG5leHQgd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmQ7XG4gICAgICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAwIHx8IHdlZWtkYXkgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh3LmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGxvY2FsIHdlZWtkYXkgLS0gY291bnRpbmcgc3RhcnRzIGZyb20gYmVnaW5uaW5nIG9mIHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gdy5lICsgZG93O1xuICAgICAgICAgICAgICAgIGlmICh3LmUgPCAwIHx8IHcuZSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gYmVnaW5uaW5nIG9mIHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gZG93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh3ZWVrIDwgMSB8fCB3ZWVrID4gd2Vla3NJblllYXIod2Vla1llYXIsIGRvdywgZG95KSkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93V2Vla3MgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWtkYXlPdmVyZmxvdyAhPSBudWxsKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrZGF5ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRlbXAgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IHRlbXAueWVhcjtcbiAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdGVtcC5kYXlPZlllYXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgSVNPIHN0YW5kYXJkXG4gICAgaG9va3MuSVNPXzg2MDEgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBSRkMgMjgyMiBmb3JtXG4gICAgaG9va3MuUkZDXzI4MjIgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGZvcm1hdCBzdHJpbmdcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZykge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSBjcmVhdGlvbiBmbG93IHRvIHByZXZlbnQgY2lyY3VsYXIgZGVwc1xuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5JU09fODYwMSkge1xuICAgICAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLlJGQ18yODIyKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tUkZDMjgyMihjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpZy5fYSA9IFtdO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IHRydWU7XG5cbiAgICAgICAgLy8gVGhpcyBhcnJheSBpcyB1c2VkIHRvIG1ha2UgYSBEYXRlLCBlaXRoZXIgd2l0aCBgbmV3IERhdGVgIG9yIGBEYXRlLlVUQ2BcbiAgICAgICAgdmFyIHN0cmluZyA9ICcnICsgY29uZmlnLl9pLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHBhcnNlZElucHV0LFxuICAgICAgICAgICAgdG9rZW5zLFxuICAgICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgICBza2lwcGVkLFxuICAgICAgICAgICAgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggPSAwLFxuICAgICAgICAgICAgZXJhLFxuICAgICAgICAgICAgdG9rZW5MZW47XG5cbiAgICAgICAgdG9rZW5zID1cbiAgICAgICAgICAgIGV4cGFuZEZvcm1hdChjb25maWcuX2YsIGNvbmZpZy5fbG9jYWxlKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSB8fCBbXTtcbiAgICAgICAgdG9rZW5MZW4gPSB0b2tlbnMubGVuZ3RoO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5MZW47IGkrKykge1xuICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICAgICAgICBwYXJzZWRJbnB1dCA9IChzdHJpbmcubWF0Y2goZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpKSB8fFxuICAgICAgICAgICAgICAgIFtdKVswXTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIHNraXBwZWQgPSBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSk7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHNraXBwZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgIHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSArIHBhcnNlZElucHV0Lmxlbmd0aFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCArPSBwYXJzZWRJbnB1dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkb24ndCBwYXJzZSBpZiBpdCdzIG5vdCBhIGtub3duIHRva2VuXG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgcGFyc2VkSW5wdXQsIGNvbmZpZyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5fc3RyaWN0ICYmICFwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCByZW1haW5pbmcgdW5wYXJzZWQgaW5wdXQgbGVuZ3RoIHRvIHRoZSBzdHJpbmdcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuY2hhcnNMZWZ0T3ZlciA9XG4gICAgICAgICAgICBzdHJpbmdMZW5ndGggLSB0b3RhbFBhcnNlZElucHV0TGVuZ3RoO1xuICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIF8xMmggZmxhZyBpZiBob3VyIGlzIDw9IDEyXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA8PSAxMiAmJlxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5wYXJzZWREYXRlUGFydHMgPSBjb25maWcuX2Euc2xpY2UoMCk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLm1lcmlkaWVtID0gY29uZmlnLl9tZXJpZGllbTtcbiAgICAgICAgLy8gaGFuZGxlIG1lcmlkaWVtXG4gICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IG1lcmlkaWVtRml4V3JhcChcbiAgICAgICAgICAgIGNvbmZpZy5fbG9jYWxlLFxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdLFxuICAgICAgICAgICAgY29uZmlnLl9tZXJpZGllbVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGhhbmRsZSBlcmFcbiAgICAgICAgZXJhID0gZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZXJhO1xuICAgICAgICBpZiAoZXJhICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbWUVBUl0gPSBjb25maWcuX2xvY2FsZS5lcmFzQ29udmVydFllYXIoZXJhLCBjb25maWcuX2FbWUVBUl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIGNoZWNrT3ZlcmZsb3coY29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJpZGllbUZpeFdyYXAobG9jYWxlLCBob3VyLCBtZXJpZGllbSkge1xuICAgICAgICB2YXIgaXNQbTtcblxuICAgICAgICBpZiAobWVyaWRpZW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gbm90aGluZyB0byBkb1xuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsZS5tZXJpZGllbUhvdXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS5tZXJpZGllbUhvdXIoaG91ciwgbWVyaWRpZW0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZS5pc1BNICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrXG4gICAgICAgICAgICBpc1BtID0gbG9jYWxlLmlzUE0obWVyaWRpZW0pO1xuICAgICAgICAgICAgaWYgKGlzUG0gJiYgaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQbSAmJiBob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW5cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgYXJyYXkgb2YgZm9ybWF0IHN0cmluZ3NcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIHZhciB0ZW1wQ29uZmlnLFxuICAgICAgICAgICAgYmVzdE1vbWVudCxcbiAgICAgICAgICAgIHNjb3JlVG9CZWF0LFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSxcbiAgICAgICAgICAgIHZhbGlkRm9ybWF0Rm91bmQsXG4gICAgICAgICAgICBiZXN0Rm9ybWF0SXNWYWxpZCA9IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlnZkxlbiA9IGNvbmZpZy5fZi5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGNvbmZpZ2ZMZW4gPT09IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRGb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25maWdmTGVuOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSA9IDA7XG4gICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICB0ZW1wQ29uZmlnID0gY29weUNvbmZpZyh7fSwgY29uZmlnKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuX3VzZVVUQyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVtcENvbmZpZy5fdXNlVVRDID0gY29uZmlnLl91c2VVVEM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZW1wQ29uZmlnLl9mID0gY29uZmlnLl9mW2ldO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcblxuICAgICAgICAgICAgaWYgKGlzVmFsaWQodGVtcENvbmZpZykpIHtcbiAgICAgICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW55IGlucHV0IHRoYXQgd2FzIG5vdCBwYXJzZWQgYWRkIGEgcGVuYWx0eSBmb3IgdGhhdCBmb3JtYXRcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuY2hhcnNMZWZ0T3ZlcjtcblxuICAgICAgICAgICAgLy9vciB0b2tlbnNcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykudW51c2VkVG9rZW5zLmxlbmd0aCAqIDEwO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuc2NvcmUgPSBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgICAgIGlmICghYmVzdEZvcm1hdElzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNjb3JlIDwgc2NvcmVUb0JlYXQgfHxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEZvcm1hdEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0Rm9ybWF0SXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCkge1xuICAgICAgICAgICAgICAgICAgICBzY29yZVRvQmVhdCA9IGN1cnJlbnRTY29yZTtcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZXh0ZW5kKGNvbmZpZywgYmVzdE1vbWVudCB8fCB0ZW1wQ29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tT2JqZWN0KGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGNvbmZpZy5faSksXG4gICAgICAgICAgICBkYXlPckRhdGUgPSBpLmRheSA9PT0gdW5kZWZpbmVkID8gaS5kYXRlIDogaS5kYXk7XG4gICAgICAgIGNvbmZpZy5fYSA9IG1hcChcbiAgICAgICAgICAgIFtpLnllYXIsIGkubW9udGgsIGRheU9yRGF0ZSwgaS5ob3VyLCBpLm1pbnV0ZSwgaS5zZWNvbmQsIGkubWlsbGlzZWNvbmRdLFxuICAgICAgICAgICAgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmogJiYgcGFyc2VJbnQob2JqLCAxMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRnJvbUNvbmZpZyhjb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhwcmVwYXJlQ29uZmlnKGNvbmZpZykpKTtcbiAgICAgICAgaWYgKHJlcy5fbmV4dERheSkge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGlzIHNtYXJ0IGVub3VnaCBhcm91bmQgRFNUXG4gICAgICAgICAgICByZXMuYWRkKDEsICdkJyk7XG4gICAgICAgICAgICByZXMuX25leHREYXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXBhcmVDb25maWcoY29uZmlnKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIGZvcm1hdCA9IGNvbmZpZy5fZjtcblxuICAgICAgICBjb25maWcuX2xvY2FsZSA9IGNvbmZpZy5fbG9jYWxlIHx8IGdldExvY2FsZShjb25maWcuX2wpO1xuXG4gICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCAoZm9ybWF0ID09PSB1bmRlZmluZWQgJiYgaW5wdXQgPT09ICcnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoeyBudWxsSW5wdXQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uZmlnLl9pID0gaW5wdXQgPSBjb25maWcuX2xvY2FsZS5wcmVwYXJzZShpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNNb21lbnQoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vbWVudChjaGVja092ZXJmbG93KGlucHV0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gaW5wdXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShmb3JtYXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkKGNvbmZpZykpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pO1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQudmFsdWVPZigpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nKGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IG1hcChpbnB1dC5zbGljZSgwKSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tT2JqZWN0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGlzVVRDKSB7XG4gICAgICAgIHZhciBjID0ge307XG5cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gdHJ1ZSB8fCBmb3JtYXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdHJpY3QgPSBmb3JtYXQ7XG4gICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9jYWxlID09PSB0cnVlIHx8IGxvY2FsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGxvY2FsZTtcbiAgICAgICAgICAgIGxvY2FsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChpc09iamVjdChpbnB1dCkgJiYgaXNPYmplY3RFbXB0eShpbnB1dCkpIHx8XG4gICAgICAgICAgICAoaXNBcnJheShpbnB1dCkgJiYgaW5wdXQubGVuZ3RoID09PSAwKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlucHV0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9iamVjdCBjb25zdHJ1Y3Rpb24gbXVzdCBiZSBkb25lIHRoaXMgd2F5LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQyM1xuICAgICAgICBjLl9pc0FNb21lbnRPYmplY3QgPSB0cnVlO1xuICAgICAgICBjLl91c2VVVEMgPSBjLl9pc1VUQyA9IGlzVVRDO1xuICAgICAgICBjLl9sID0gbG9jYWxlO1xuICAgICAgICBjLl9pID0gaW5wdXQ7XG4gICAgICAgIGMuX2YgPSBmb3JtYXQ7XG4gICAgICAgIGMuX3N0cmljdCA9IHN0cmljdDtcblxuICAgICAgICByZXR1cm4gY3JlYXRlRnJvbUNvbmZpZyhjKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbChpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHZhciBwcm90b3R5cGVNaW4gPSBkZXByZWNhdGUoXG4gICAgICAgICAgICAnbW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPCB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBwcm90b3R5cGVNYXggPSBkZXByZWNhdGUoXG4gICAgICAgICAgICAnbW9tZW50KCkubWF4IGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPiB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgLy8gUGljayBhIG1vbWVudCBtIGZyb20gbW9tZW50cyBzbyB0aGF0IG1bZm5dKG90aGVyKSBpcyB0cnVlIGZvciBhbGxcbiAgICAvLyBvdGhlci4gVGhpcyByZWxpZXMgb24gdGhlIGZ1bmN0aW9uIGZuIHRvIGJlIHRyYW5zaXRpdmUuXG4gICAgLy9cbiAgICAvLyBtb21lbnRzIHNob3VsZCBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMgb3IgYW4gYXJyYXksIHdob3NlXG4gICAgLy8gZmlyc3QgZWxlbWVudCBpcyBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cy5cbiAgICBmdW5jdGlvbiBwaWNrQnkoZm4sIG1vbWVudHMpIHtcbiAgICAgICAgdmFyIHJlcywgaTtcbiAgICAgICAgaWYgKG1vbWVudHMubGVuZ3RoID09PSAxICYmIGlzQXJyYXkobW9tZW50c1swXSkpIHtcbiAgICAgICAgICAgIG1vbWVudHMgPSBtb21lbnRzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJlcyA9IG1vbWVudHNbMF07XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBtb21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoIW1vbWVudHNbaV0uaXNWYWxpZCgpIHx8IG1vbWVudHNbaV1bZm5dKHJlcykpIHtcbiAgICAgICAgICAgICAgICByZXMgPSBtb21lbnRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogVXNlIFtdLnNvcnQgaW5zdGVhZD9cbiAgICBmdW5jdGlvbiBtaW4oKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQmVmb3JlJywgYXJncyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF4KCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0FmdGVyJywgYXJncyk7XG4gICAgfVxuXG4gICAgdmFyIG5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIERhdGUubm93ID8gRGF0ZS5ub3coKSA6ICtuZXcgRGF0ZSgpO1xuICAgIH07XG5cbiAgICB2YXIgb3JkZXJpbmcgPSBbXG4gICAgICAgICd5ZWFyJyxcbiAgICAgICAgJ3F1YXJ0ZXInLFxuICAgICAgICAnbW9udGgnLFxuICAgICAgICAnd2VlaycsXG4gICAgICAgICdkYXknLFxuICAgICAgICAnaG91cicsXG4gICAgICAgICdtaW51dGUnLFxuICAgICAgICAnc2Vjb25kJyxcbiAgICAgICAgJ21pbGxpc2Vjb25kJyxcbiAgICBdO1xuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvblZhbGlkKG0pIHtcbiAgICAgICAgdmFyIGtleSxcbiAgICAgICAgICAgIHVuaXRIYXNEZWNpbWFsID0gZmFsc2UsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgb3JkZXJMZW4gPSBvcmRlcmluZy5sZW5ndGg7XG4gICAgICAgIGZvciAoa2V5IGluIG0pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBoYXNPd25Qcm9wKG0sIGtleSkgJiZcbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICBpbmRleE9mLmNhbGwob3JkZXJpbmcsIGtleSkgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIChtW2tleV0gPT0gbnVsbCB8fCAhaXNOYU4obVtrZXldKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXJMZW47ICsraSkge1xuICAgICAgICAgICAgaWYgKG1bb3JkZXJpbmdbaV1dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVuaXRIYXNEZWNpbWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gb25seSBhbGxvdyBub24taW50ZWdlcnMgZm9yIHNtYWxsZXN0IHVuaXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQobVtvcmRlcmluZ1tpXV0pICE9PSB0b0ludChtW29yZGVyaW5nW2ldXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pdEhhc0RlY2ltYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVmFsaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW52YWxpZCQxKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oTmFOKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBEdXJhdGlvbihkdXJhdGlvbikge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoZHVyYXRpb24pLFxuICAgICAgICAgICAgeWVhcnMgPSBub3JtYWxpemVkSW5wdXQueWVhciB8fCAwLFxuICAgICAgICAgICAgcXVhcnRlcnMgPSBub3JtYWxpemVkSW5wdXQucXVhcnRlciB8fCAwLFxuICAgICAgICAgICAgbW9udGhzID0gbm9ybWFsaXplZElucHV0Lm1vbnRoIHx8IDAsXG4gICAgICAgICAgICB3ZWVrcyA9IG5vcm1hbGl6ZWRJbnB1dC53ZWVrIHx8IG5vcm1hbGl6ZWRJbnB1dC5pc29XZWVrIHx8IDAsXG4gICAgICAgICAgICBkYXlzID0gbm9ybWFsaXplZElucHV0LmRheSB8fCAwLFxuICAgICAgICAgICAgaG91cnMgPSBub3JtYWxpemVkSW5wdXQuaG91ciB8fCAwLFxuICAgICAgICAgICAgbWludXRlcyA9IG5vcm1hbGl6ZWRJbnB1dC5taW51dGUgfHwgMCxcbiAgICAgICAgICAgIHNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQuc2Vjb25kIHx8IDAsXG4gICAgICAgICAgICBtaWxsaXNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQubWlsbGlzZWNvbmQgfHwgMDtcblxuICAgICAgICB0aGlzLl9pc1ZhbGlkID0gaXNEdXJhdGlvblZhbGlkKG5vcm1hbGl6ZWRJbnB1dCk7XG5cbiAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gZm9yIGRhdGVBZGRSZW1vdmVcbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID1cbiAgICAgICAgICAgICttaWxsaXNlY29uZHMgK1xuICAgICAgICAgICAgc2Vjb25kcyAqIDFlMyArIC8vIDEwMDBcbiAgICAgICAgICAgIG1pbnV0ZXMgKiA2ZTQgKyAvLyAxMDAwICogNjBcbiAgICAgICAgICAgIGhvdXJzICogMTAwMCAqIDYwICogNjA7IC8vdXNpbmcgMTAwMCAqIDYwICogNjAgaW5zdGVhZCBvZiAzNmU1IHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMjk3OFxuICAgICAgICAvLyBCZWNhdXNlIG9mIGRhdGVBZGRSZW1vdmUgdHJlYXRzIDI0IGhvdXJzIGFzIGRpZmZlcmVudCBmcm9tIGFcbiAgICAgICAgLy8gZGF5IHdoZW4gd29ya2luZyBhcm91bmQgRFNULCB3ZSBuZWVkIHRvIHN0b3JlIHRoZW0gc2VwYXJhdGVseVxuICAgICAgICB0aGlzLl9kYXlzID0gK2RheXMgKyB3ZWVrcyAqIDc7XG4gICAgICAgIC8vIEl0IGlzIGltcG9zc2libGUgdG8gdHJhbnNsYXRlIG1vbnRocyBpbnRvIGRheXMgd2l0aG91dCBrbm93aW5nXG4gICAgICAgIC8vIHdoaWNoIG1vbnRocyB5b3UgYXJlIGFyZSB0YWxraW5nIGFib3V0LCBzbyB3ZSBoYXZlIHRvIHN0b3JlXG4gICAgICAgIC8vIGl0IHNlcGFyYXRlbHkuXG4gICAgICAgIHRoaXMuX21vbnRocyA9ICttb250aHMgKyBxdWFydGVycyAqIDMgKyB5ZWFycyAqIDEyO1xuXG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcblxuICAgICAgICB0aGlzLl9sb2NhbGUgPSBnZXRMb2NhbGUoKTtcblxuICAgICAgICB0aGlzLl9idWJibGUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0R1cmF0aW9uKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRHVyYXRpb247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzUm91bmQobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgtMSAqIG51bWJlcikgKiAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG4gICAgZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnJheTEsIGFycmF5MiwgZG9udENvbnZlcnQpIHtcbiAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGRpZmZzID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChkb250Q29udmVydCAmJiBhcnJheTFbaV0gIT09IGFycmF5MltpXSkgfHxcbiAgICAgICAgICAgICAgICAoIWRvbnRDb252ZXJ0ICYmIHRvSW50KGFycmF5MVtpXSkgIT09IHRvSW50KGFycmF5MltpXSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBkaWZmcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaWZmcyArIGxlbmd0aERpZmY7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0KHRva2VuLCBzZXBhcmF0b3IpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnV0Y09mZnNldCgpLFxuICAgICAgICAgICAgICAgIHNpZ24gPSAnKyc7XG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7XG4gICAgICAgICAgICAgICAgc2lnbiA9ICctJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgc2lnbiArXG4gICAgICAgICAgICAgICAgemVyb0ZpbGwofn4ob2Zmc2V0IC8gNjApLCAyKSArXG4gICAgICAgICAgICAgICAgc2VwYXJhdG9yICtcbiAgICAgICAgICAgICAgICB6ZXJvRmlsbCh+fm9mZnNldCAlIDYwLCAyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb2Zmc2V0KCdaJywgJzonKTtcbiAgICBvZmZzZXQoJ1paJywgJycpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWicsIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1paJywgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ1onLCAnWlonXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fdXNlVVRDID0gdHJ1ZTtcbiAgICAgICAgY29uZmlnLl90em0gPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIHRpbWV6b25lIGNodW5rZXJcbiAgICAvLyAnKzEwOjAwJyA+IFsnMTAnLCAgJzAwJ11cbiAgICAvLyAnLTE1MzAnICA+IFsnLTE1JywgJzMwJ11cbiAgICB2YXIgY2h1bmtPZmZzZXQgPSAvKFtcXCtcXC1dfFxcZFxcZCkvZ2k7XG5cbiAgICBmdW5jdGlvbiBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoZXIsIHN0cmluZykge1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IChzdHJpbmcgfHwgJycpLm1hdGNoKG1hdGNoZXIpLFxuICAgICAgICAgICAgY2h1bmssXG4gICAgICAgICAgICBwYXJ0cyxcbiAgICAgICAgICAgIG1pbnV0ZXM7XG5cbiAgICAgICAgaWYgKG1hdGNoZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY2h1bmsgPSBtYXRjaGVzW21hdGNoZXMubGVuZ3RoIC0gMV0gfHwgW107XG4gICAgICAgIHBhcnRzID0gKGNodW5rICsgJycpLm1hdGNoKGNodW5rT2Zmc2V0KSB8fCBbJy0nLCAwLCAwXTtcbiAgICAgICAgbWludXRlcyA9ICsocGFydHNbMV0gKiA2MCkgKyB0b0ludChwYXJ0c1syXSk7XG5cbiAgICAgICAgcmV0dXJuIG1pbnV0ZXMgPT09IDAgPyAwIDogcGFydHNbMF0gPT09ICcrJyA/IG1pbnV0ZXMgOiAtbWludXRlcztcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYSBtb21lbnQgZnJvbSBpbnB1dCwgdGhhdCBpcyBsb2NhbC91dGMvem9uZSBlcXVpdmFsZW50IHRvIG1vZGVsLlxuICAgIGZ1bmN0aW9uIGNsb25lV2l0aE9mZnNldChpbnB1dCwgbW9kZWwpIHtcbiAgICAgICAgdmFyIHJlcywgZGlmZjtcbiAgICAgICAgaWYgKG1vZGVsLl9pc1VUQykge1xuICAgICAgICAgICAgcmVzID0gbW9kZWwuY2xvbmUoKTtcbiAgICAgICAgICAgIGRpZmYgPVxuICAgICAgICAgICAgICAgIChpc01vbWVudChpbnB1dCkgfHwgaXNEYXRlKGlucHV0KVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LnZhbHVlT2YoKVxuICAgICAgICAgICAgICAgICAgICA6IGNyZWF0ZUxvY2FsKGlucHV0KS52YWx1ZU9mKCkpIC0gcmVzLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIC8vIFVzZSBsb3ctbGV2ZWwgYXBpLCBiZWNhdXNlIHRoaXMgZm4gaXMgbG93LWxldmVsIGFwaS5cbiAgICAgICAgICAgIHJlcy5fZC5zZXRUaW1lKHJlcy5fZC52YWx1ZU9mKCkgKyBkaWZmKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldChyZXMsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQpLmxvY2FsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXRlT2Zmc2V0KG0pIHtcbiAgICAgICAgLy8gT24gRmlyZWZveC4yNCBEYXRlI2dldFRpbWV6b25lT2Zmc2V0IHJldHVybnMgYSBmbG9hdGluZyBwb2ludC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvcHVsbC8xODcxXG4gICAgICAgIHJldHVybiAtTWF0aC5yb3VuZChtLl9kLmdldFRpbWV6b25lT2Zmc2V0KCkpO1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbW9tZW50IGlzIG11dGF0ZWQuXG4gICAgLy8gSXQgaXMgaW50ZW5kZWQgdG8ga2VlcCB0aGUgb2Zmc2V0IGluIHN5bmMgd2l0aCB0aGUgdGltZXpvbmUuXG4gICAgaG9va3MudXBkYXRlT2Zmc2V0ID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICAvLyBrZWVwTG9jYWxUaW1lID0gdHJ1ZSBtZWFucyBvbmx5IGNoYW5nZSB0aGUgdGltZXpvbmUsIHdpdGhvdXRcbiAgICAvLyBhZmZlY3RpbmcgdGhlIGxvY2FsIGhvdXIuIFNvIDU6MzE6MjYgKzAzMDAgLS1bdXRjT2Zmc2V0KDIsIHRydWUpXS0tPlxuICAgIC8vIDU6MzE6MjYgKzAyMDAgSXQgaXMgcG9zc2libGUgdGhhdCA1OjMxOjI2IGRvZXNuJ3QgZXhpc3Qgd2l0aCBvZmZzZXRcbiAgICAvLyArMDIwMCwgc28gd2UgYWRqdXN0IHRoZSB0aW1lIGFzIG5lZWRlZCwgdG8gYmUgdmFsaWQuXG4gICAgLy9cbiAgICAvLyBLZWVwaW5nIHRoZSB0aW1lIGFjdHVhbGx5IGFkZHMvc3VidHJhY3RzIChvbmUgaG91cilcbiAgICAvLyBmcm9tIHRoZSBhY3R1YWwgcmVwcmVzZW50ZWQgdGltZS4gVGhhdCBpcyB3aHkgd2UgY2FsbCB1cGRhdGVPZmZzZXRcbiAgICAvLyBhIHNlY29uZCB0aW1lLiBJbiBjYXNlIGl0IHdhbnRzIHVzIHRvIGNoYW5nZSB0aGUgb2Zmc2V0IGFnYWluXG4gICAgLy8gX2NoYW5nZUluUHJvZ3Jlc3MgPT0gdHJ1ZSBjYXNlLCB0aGVuIHdlIGhhdmUgdG8gYWRqdXN0LCBiZWNhdXNlXG4gICAgLy8gdGhlcmUgaXMgbm8gc3VjaCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lem9uZS5cbiAgICBmdW5jdGlvbiBnZXRTZXRPZmZzZXQoaW5wdXQsIGtlZXBMb2NhbFRpbWUsIGtlZXBNaW51dGVzKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLl9vZmZzZXQgfHwgMCxcbiAgICAgICAgICAgIGxvY2FsQWRqdXN0O1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoU2hvcnRPZmZzZXQsIGlucHV0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhpbnB1dCkgPCAxNiAmJiAha2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0ICogNjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzVVRDICYmIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICBsb2NhbEFkanVzdCA9IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vZmZzZXQgPSBpbnB1dDtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsb2NhbEFkanVzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGQobG9jYWxBZGp1c3QsICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSBpbnB1dCkge1xuICAgICAgICAgICAgICAgIGlmICgha2VlcExvY2FsVGltZSB8fCB0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFN1YnRyYWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUR1cmF0aW9uKGlucHV0IC0gb2Zmc2V0LCAnbScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/IG9mZnNldCA6IGdldERhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRab25lKGlucHV0LCBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gLWlucHV0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldChpbnB1dCwga2VlcExvY2FsVGltZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC10aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9VVEMoa2VlcExvY2FsVGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9Mb2NhbChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1VUQykge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VidHJhY3QoZ2V0RGF0ZU9mZnNldCh0aGlzKSwgJ20nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0aGlzLl90em0sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5faSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhciB0Wm9uZSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hPZmZzZXQsIHRoaXMuX2kpO1xuICAgICAgICAgICAgaWYgKHRab25lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0Wm9uZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc0FsaWduZWRIb3VyT2Zmc2V0KGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dCA9IGlucHV0ID8gY3JlYXRlTG9jYWwoaW5wdXQpLnV0Y09mZnNldCgpIDogMDtcblxuICAgICAgICByZXR1cm4gKHRoaXMudXRjT2Zmc2V0KCkgLSBpbnB1dCkgJSA2MCA9PT0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoMCkudXRjT2Zmc2V0KCkgfHxcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoNSkudXRjT2Zmc2V0KClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWQoKSB7XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5faXNEU1RTaGlmdGVkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjID0ge30sXG4gICAgICAgICAgICBvdGhlcjtcblxuICAgICAgICBjb3B5Q29uZmlnKGMsIHRoaXMpO1xuICAgICAgICBjID0gcHJlcGFyZUNvbmZpZyhjKTtcblxuICAgICAgICBpZiAoYy5fYSkge1xuICAgICAgICAgICAgb3RoZXIgPSBjLl9pc1VUQyA/IGNyZWF0ZVVUQyhjLl9hKSA6IGNyZWF0ZUxvY2FsKGMuX2EpO1xuICAgICAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID1cbiAgICAgICAgICAgICAgICB0aGlzLmlzVmFsaWQoKSAmJiBjb21wYXJlQXJyYXlzKGMuX2EsIG90aGVyLnRvQXJyYXkoKSkgPiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTG9jYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/ICF0aGlzLl9pc1VUQyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXRjT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXRjKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyAmJiB0aGlzLl9vZmZzZXQgPT09IDAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBU1AuTkVUIGpzb24gZGF0ZSBmb3JtYXQgcmVnZXhcbiAgICB2YXIgYXNwTmV0UmVnZXggPSAvXigtfFxcKyk/KD86KFxcZCopWy4gXSk/KFxcZCspOihcXGQrKSg/OjooXFxkKykoXFwuXFxkKik/KT8kLyxcbiAgICAgICAgLy8gZnJvbSBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2Nsb3N1cmVfZ29vZ19kYXRlX2RhdGUuanMuc291cmNlLmh0bWxcbiAgICAgICAgLy8gc29tZXdoYXQgbW9yZSBpbiBsaW5lIHdpdGggNC40LjMuMiAyMDA0IHNwZWMsIGJ1dCBhbGxvd3MgZGVjaW1hbCBhbnl3aGVyZVxuICAgICAgICAvLyBhbmQgZnVydGhlciBtb2RpZmllZCB0byBhbGxvdyBmb3Igc3RyaW5ncyBjb250YWluaW5nIGJvdGggd2VlayBhbmQgZGF5XG4gICAgICAgIGlzb1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKC18XFwrKT9QKD86KFstK10/WzAtOSwuXSopWSk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopVyk/KD86KFstK10/WzAtOSwuXSopRCk/KD86VCg/OihbLStdP1swLTksLl0qKUgpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVMpPyk/JC87XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEdXJhdGlvbihpbnB1dCwga2V5KSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IGlucHV0LFxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgYWdhaW5zdCByZWdleHAgaXMgZXhwZW5zaXZlLCBkbyBpdCBvbiBkZW1hbmRcbiAgICAgICAgICAgIG1hdGNoID0gbnVsbCxcbiAgICAgICAgICAgIHNpZ24sXG4gICAgICAgICAgICByZXQsXG4gICAgICAgICAgICBkaWZmUmVzO1xuXG4gICAgICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbXM6IGlucHV0Ll9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICAgICAgZDogaW5wdXQuX2RheXMsXG4gICAgICAgICAgICAgICAgTTogaW5wdXQuX21vbnRocyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpIHx8ICFpc05hTigraW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uW2tleV0gPSAraW5wdXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uLm1pbGxpc2Vjb25kcyA9ICtpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgobWF0Y2ggPSBhc3BOZXRSZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSBtYXRjaFsxXSA9PT0gJy0nID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICBkOiB0b0ludChtYXRjaFtEQVRFXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIGg6IHRvSW50KG1hdGNoW0hPVVJdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbTogdG9JbnQobWF0Y2hbTUlOVVRFXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIHM6IHRvSW50KG1hdGNoW1NFQ09ORF0pICogc2lnbixcbiAgICAgICAgICAgICAgICBtczogdG9JbnQoYWJzUm91bmQobWF0Y2hbTUlMTElTRUNPTkRdICogMTAwMCkpICogc2lnbiwgLy8gdGhlIG1pbGxpc2Vjb25kIGRlY2ltYWwgcG9pbnQgaXMgaW5jbHVkZWQgaW4gdGhlIG1hdGNoXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKChtYXRjaCA9IGlzb1JlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IG1hdGNoWzFdID09PSAnLScgPyAtMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5OiBwYXJzZUlzbyhtYXRjaFsyXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgTTogcGFyc2VJc28obWF0Y2hbM10sIHNpZ24pLFxuICAgICAgICAgICAgICAgIHc6IHBhcnNlSXNvKG1hdGNoWzRdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBkOiBwYXJzZUlzbyhtYXRjaFs1XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgaDogcGFyc2VJc28obWF0Y2hbNl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIG06IHBhcnNlSXNvKG1hdGNoWzddLCBzaWduKSxcbiAgICAgICAgICAgICAgICBzOiBwYXJzZUlzbyhtYXRjaFs4XSwgc2lnbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZHVyYXRpb24gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAoJ2Zyb20nIGluIGR1cmF0aW9uIHx8ICd0bycgaW4gZHVyYXRpb24pXG4gICAgICAgICkge1xuICAgICAgICAgICAgZGlmZlJlcyA9IG1vbWVudHNEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKGR1cmF0aW9uLmZyb20pLFxuICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKGR1cmF0aW9uLnRvKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGR1cmF0aW9uLm1zID0gZGlmZlJlcy5taWxsaXNlY29uZHM7XG4gICAgICAgICAgICBkdXJhdGlvbi5NID0gZGlmZlJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXQgPSBuZXcgRHVyYXRpb24oZHVyYXRpb24pO1xuXG4gICAgICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSAmJiBoYXNPd25Qcm9wKGlucHV0LCAnX2xvY2FsZScpKSB7XG4gICAgICAgICAgICByZXQuX2xvY2FsZSA9IGlucHV0Ll9sb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkgJiYgaGFzT3duUHJvcChpbnB1dCwgJ19pc1ZhbGlkJykpIHtcbiAgICAgICAgICAgIHJldC5faXNWYWxpZCA9IGlucHV0Ll9pc1ZhbGlkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjcmVhdGVEdXJhdGlvbi5mbiA9IER1cmF0aW9uLnByb3RvdHlwZTtcbiAgICBjcmVhdGVEdXJhdGlvbi5pbnZhbGlkID0gY3JlYXRlSW52YWxpZCQxO1xuXG4gICAgZnVuY3Rpb24gcGFyc2VJc28oaW5wLCBzaWduKSB7XG4gICAgICAgIC8vIFdlJ2Qgbm9ybWFsbHkgdXNlIH5+aW5wIGZvciB0aGlzLCBidXQgdW5mb3J0dW5hdGVseSBpdCBhbHNvXG4gICAgICAgIC8vIGNvbnZlcnRzIGZsb2F0cyB0byBpbnRzLlxuICAgICAgICAvLyBpbnAgbWF5IGJlIHVuZGVmaW5lZCwgc28gY2FyZWZ1bCBjYWxsaW5nIHJlcGxhY2Ugb24gaXQuXG4gICAgICAgIHZhciByZXMgPSBpbnAgJiYgcGFyc2VGbG9hdChpbnAucmVwbGFjZSgnLCcsICcuJykpO1xuICAgICAgICAvLyBhcHBseSBzaWduIHdoaWxlIHdlJ3JlIGF0IGl0XG4gICAgICAgIHJldHVybiAoaXNOYU4ocmVzKSA/IDAgOiByZXMpICogc2lnbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXMgPSB7fTtcblxuICAgICAgICByZXMubW9udGhzID1cbiAgICAgICAgICAgIG90aGVyLm1vbnRoKCkgLSBiYXNlLm1vbnRoKCkgKyAob3RoZXIueWVhcigpIC0gYmFzZS55ZWFyKCkpICogMTI7XG4gICAgICAgIGlmIChiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJykuaXNBZnRlcihvdGhlcikpIHtcbiAgICAgICAgICAgIC0tcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSArb3RoZXIgLSArYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcztcbiAgICAgICAgaWYgKCEoYmFzZS5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbWlsbGlzZWNvbmRzOiAwLCBtb250aHM6IDAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIG90aGVyID0gY2xvbmVXaXRoT2Zmc2V0KG90aGVyLCBiYXNlKTtcbiAgICAgICAgaWYgKGJhc2UuaXNCZWZvcmUob3RoZXIpKSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2Uob3RoZXIsIGJhc2UpO1xuICAgICAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9IC1yZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgcmVzLm1vbnRocyA9IC1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiByZW1vdmUgJ25hbWUnIGFyZyBhZnRlciBkZXByZWNhdGlvbiBpcyByZW1vdmVkXG4gICAgZnVuY3Rpb24gY3JlYXRlQWRkZXIoZGlyZWN0aW9uLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBkdXIsIHRtcDtcbiAgICAgICAgICAgIC8vaW52ZXJ0IHRoZSBhcmd1bWVudHMsIGJ1dCBjb21wbGFpbiBhYm91dCBpdFxuICAgICAgICAgICAgaWYgKHBlcmlvZCAhPT0gbnVsbCAmJiAhaXNOYU4oK3BlcmlvZCkpIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUoXG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICdtb21lbnQoKS4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyhwZXJpb2QsIG51bWJlcikgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBtb21lbnQoKS4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyhudW1iZXIsIHBlcmlvZCkuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2FkZC1pbnZlcnRlZC1wYXJhbS8gZm9yIG1vcmUgaW5mby4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0bXAgPSB2YWw7XG4gICAgICAgICAgICAgICAgdmFsID0gcGVyaW9kO1xuICAgICAgICAgICAgICAgIHBlcmlvZCA9IHRtcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZHVyID0gY3JlYXRlRHVyYXRpb24odmFsLCBwZXJpb2QpO1xuICAgICAgICAgICAgYWRkU3VidHJhY3QodGhpcywgZHVyLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkU3VidHJhY3QobW9tLCBkdXJhdGlvbiwgaXNBZGRpbmcsIHVwZGF0ZU9mZnNldCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgIGRheXMgPSBhYnNSb3VuZChkdXJhdGlvbi5fZGF5cyksXG4gICAgICAgICAgICBtb250aHMgPSBhYnNSb3VuZChkdXJhdGlvbi5fbW9udGhzKTtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVPZmZzZXQgPSB1cGRhdGVPZmZzZXQgPT0gbnVsbCA/IHRydWUgOiB1cGRhdGVPZmZzZXQ7XG5cbiAgICAgICAgaWYgKG1vbnRocykge1xuICAgICAgICAgICAgc2V0TW9udGgobW9tLCBnZXQobW9tLCAnTW9udGgnKSArIG1vbnRocyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5cykge1xuICAgICAgICAgICAgc2V0JDEobW9tLCAnRGF0ZScsIGdldChtb20sICdEYXRlJykgKyBkYXlzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIG1vbS5fZC5zZXRUaW1lKG1vbS5fZC52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZU9mZnNldCkge1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KG1vbSwgZGF5cyB8fCBtb250aHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFkZCA9IGNyZWF0ZUFkZGVyKDEsICdhZGQnKSxcbiAgICAgICAgc3VidHJhY3QgPSBjcmVhdGVBZGRlcigtMSwgJ3N1YnRyYWN0Jyk7XG5cbiAgICBmdW5jdGlvbiBpc1N0cmluZyhpbnB1dCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZztcbiAgICB9XG5cbiAgICAvLyB0eXBlIE1vbWVudElucHV0ID0gTW9tZW50IHwgRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBNb21lbnRJbnB1dE9iamVjdCB8IHZvaWQ7IC8vIG51bGwgfCB1bmRlZmluZWRcbiAgICBmdW5jdGlvbiBpc01vbWVudElucHV0KGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc01vbWVudChpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzRGF0ZShpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzU3RyaW5nKGlucHV0KSB8fFxuICAgICAgICAgICAgaXNOdW1iZXIoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc051bWJlck9yU3RyaW5nQXJyYXkoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc01vbWVudElucHV0T2JqZWN0KGlucHV0KSB8fFxuICAgICAgICAgICAgaW5wdXQgPT09IG51bGwgfHxcbiAgICAgICAgICAgIGlucHV0ID09PSB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudElucHV0T2JqZWN0KGlucHV0KSB7XG4gICAgICAgIHZhciBvYmplY3RUZXN0ID0gaXNPYmplY3QoaW5wdXQpICYmICFpc09iamVjdEVtcHR5KGlucHV0KSxcbiAgICAgICAgICAgIHByb3BlcnR5VGVzdCA9IGZhbHNlLFxuICAgICAgICAgICAgcHJvcGVydGllcyA9IFtcbiAgICAgICAgICAgICAgICAneWVhcnMnLFxuICAgICAgICAgICAgICAgICd5ZWFyJyxcbiAgICAgICAgICAgICAgICAneScsXG4gICAgICAgICAgICAgICAgJ21vbnRocycsXG4gICAgICAgICAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgICAgICAgICAnTScsXG4gICAgICAgICAgICAgICAgJ2RheXMnLFxuICAgICAgICAgICAgICAgICdkYXknLFxuICAgICAgICAgICAgICAgICdkJyxcbiAgICAgICAgICAgICAgICAnZGF0ZXMnLFxuICAgICAgICAgICAgICAgICdkYXRlJyxcbiAgICAgICAgICAgICAgICAnRCcsXG4gICAgICAgICAgICAgICAgJ2hvdXJzJyxcbiAgICAgICAgICAgICAgICAnaG91cicsXG4gICAgICAgICAgICAgICAgJ2gnLFxuICAgICAgICAgICAgICAgICdtaW51dGVzJyxcbiAgICAgICAgICAgICAgICAnbWludXRlJyxcbiAgICAgICAgICAgICAgICAnbScsXG4gICAgICAgICAgICAgICAgJ3NlY29uZHMnLFxuICAgICAgICAgICAgICAgICdzZWNvbmQnLFxuICAgICAgICAgICAgICAgICdzJyxcbiAgICAgICAgICAgICAgICAnbWlsbGlzZWNvbmRzJyxcbiAgICAgICAgICAgICAgICAnbWlsbGlzZWNvbmQnLFxuICAgICAgICAgICAgICAgICdtcycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgcHJvcGVydHlMZW4gPSBwcm9wZXJ0aWVzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcGVydHlMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgcHJvcGVydHlUZXN0ID0gcHJvcGVydHlUZXN0IHx8IGhhc093blByb3AoaW5wdXQsIHByb3BlcnR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYmplY3RUZXN0ICYmIHByb3BlcnR5VGVzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc051bWJlck9yU3RyaW5nQXJyYXkoaW5wdXQpIHtcbiAgICAgICAgdmFyIGFycmF5VGVzdCA9IGlzQXJyYXkoaW5wdXQpLFxuICAgICAgICAgICAgZGF0YVR5cGVUZXN0ID0gZmFsc2U7XG4gICAgICAgIGlmIChhcnJheVRlc3QpIHtcbiAgICAgICAgICAgIGRhdGFUeXBlVGVzdCA9XG4gICAgICAgICAgICAgICAgaW5wdXQuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNOdW1iZXIoaXRlbSkgJiYgaXNTdHJpbmcoaW5wdXQpO1xuICAgICAgICAgICAgICAgIH0pLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXlUZXN0ICYmIGRhdGFUeXBlVGVzdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0NhbGVuZGFyU3BlYyhpbnB1dCkge1xuICAgICAgICB2YXIgb2JqZWN0VGVzdCA9IGlzT2JqZWN0KGlucHV0KSAmJiAhaXNPYmplY3RFbXB0eShpbnB1dCksXG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBmYWxzZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAgICAgJ3NhbWVEYXknLFxuICAgICAgICAgICAgICAgICduZXh0RGF5JyxcbiAgICAgICAgICAgICAgICAnbGFzdERheScsXG4gICAgICAgICAgICAgICAgJ25leHRXZWVrJyxcbiAgICAgICAgICAgICAgICAnbGFzdFdlZWsnLFxuICAgICAgICAgICAgICAgICdzYW1lRWxzZScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHByb3BlcnR5O1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBwcm9wZXJ0eVRlc3QgfHwgaGFzT3duUHJvcChpbnB1dCwgcHJvcGVydHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9iamVjdFRlc3QgJiYgcHJvcGVydHlUZXN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENhbGVuZGFyRm9ybWF0KG15TW9tZW50LCBub3cpIHtcbiAgICAgICAgdmFyIGRpZmYgPSBteU1vbWVudC5kaWZmKG5vdywgJ2RheXMnLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGRpZmYgPCAtNlxuICAgICAgICAgICAgPyAnc2FtZUVsc2UnXG4gICAgICAgICAgICA6IGRpZmYgPCAtMVxuICAgICAgICAgICAgICA/ICdsYXN0V2VlaydcbiAgICAgICAgICAgICAgOiBkaWZmIDwgMFxuICAgICAgICAgICAgICAgID8gJ2xhc3REYXknXG4gICAgICAgICAgICAgICAgOiBkaWZmIDwgMVxuICAgICAgICAgICAgICAgICAgPyAnc2FtZURheSdcbiAgICAgICAgICAgICAgICAgIDogZGlmZiA8IDJcbiAgICAgICAgICAgICAgICAgICAgPyAnbmV4dERheSdcbiAgICAgICAgICAgICAgICAgICAgOiBkaWZmIDwgN1xuICAgICAgICAgICAgICAgICAgICAgID8gJ25leHRXZWVrJ1xuICAgICAgICAgICAgICAgICAgICAgIDogJ3NhbWVFbHNlJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciQxKHRpbWUsIGZvcm1hdHMpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBmb3Igc2luZ2xlIHBhcmFtZXRlciwgZm9ybWF0cyBvbmx5IG92ZXJsb2FkIHRvIHRoZSBjYWxlbmRhciBmdW5jdGlvblxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKCFhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICB0aW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvcm1hdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTW9tZW50SW5wdXQoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgICAgIHRpbWUgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICAgICAgZm9ybWF0cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDYWxlbmRhclNwZWMoYXJndW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgICAgIGZvcm1hdHMgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICAgICAgdGltZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSB3YW50IHRvIGNvbXBhcmUgdGhlIHN0YXJ0IG9mIHRvZGF5LCB2cyB0aGlzLlxuICAgICAgICAvLyBHZXR0aW5nIHN0YXJ0LW9mLXRvZGF5IGRlcGVuZHMgb24gd2hldGhlciB3ZSdyZSBsb2NhbC91dGMvb2Zmc2V0IG9yIG5vdC5cbiAgICAgICAgdmFyIG5vdyA9IHRpbWUgfHwgY3JlYXRlTG9jYWwoKSxcbiAgICAgICAgICAgIHNvZCA9IGNsb25lV2l0aE9mZnNldChub3csIHRoaXMpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgZm9ybWF0ID0gaG9va3MuY2FsZW5kYXJGb3JtYXQodGhpcywgc29kKSB8fCAnc2FtZUVsc2UnLFxuICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICBmb3JtYXRzICYmXG4gICAgICAgICAgICAgICAgKGlzRnVuY3Rpb24oZm9ybWF0c1tmb3JtYXRdKVxuICAgICAgICAgICAgICAgICAgICA/IGZvcm1hdHNbZm9ybWF0XS5jYWxsKHRoaXMsIG5vdylcbiAgICAgICAgICAgICAgICAgICAgOiBmb3JtYXRzW2Zvcm1hdF0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChcbiAgICAgICAgICAgIG91dHB1dCB8fCB0aGlzLmxvY2FsZURhdGEoKS5jYWxlbmRhcihmb3JtYXQsIHRoaXMsIGNyZWF0ZUxvY2FsKG5vdykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50KHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQWZ0ZXIoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID4gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxJbnB1dC52YWx1ZU9mKCkgPCB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZWZvcmUoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmV0d2Vlbihmcm9tLCB0bywgdW5pdHMsIGluY2x1c2l2aXR5KSB7XG4gICAgICAgIHZhciBsb2NhbEZyb20gPSBpc01vbWVudChmcm9tKSA/IGZyb20gOiBjcmVhdGVMb2NhbChmcm9tKSxcbiAgICAgICAgICAgIGxvY2FsVG8gPSBpc01vbWVudCh0bykgPyB0byA6IGNyZWF0ZUxvY2FsKHRvKTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxGcm9tLmlzVmFsaWQoKSAmJiBsb2NhbFRvLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpbmNsdXNpdml0eSA9IGluY2x1c2l2aXR5IHx8ICcoKSc7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoaW5jbHVzaXZpdHlbMF0gPT09ICcoJ1xuICAgICAgICAgICAgICAgID8gdGhpcy5pc0FmdGVyKGxvY2FsRnJvbSwgdW5pdHMpXG4gICAgICAgICAgICAgICAgOiAhdGhpcy5pc0JlZm9yZShsb2NhbEZyb20sIHVuaXRzKSkgJiZcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVsxXSA9PT0gJyknXG4gICAgICAgICAgICAgICAgPyB0aGlzLmlzQmVmb3JlKGxvY2FsVG8sIHVuaXRzKVxuICAgICAgICAgICAgICAgIDogIXRoaXMuaXNBZnRlcihsb2NhbFRvLCB1bml0cykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lKGlucHV0LCB1bml0cykge1xuICAgICAgICB2YXIgbG9jYWxJbnB1dCA9IGlzTW9tZW50KGlucHV0KSA/IGlucHV0IDogY3JlYXRlTG9jYWwoaW5wdXQpLFxuICAgICAgICAgICAgaW5wdXRNcztcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cykgfHwgJ21pbGxpc2Vjb25kJztcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPT09IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXRNcyA9IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpIDw9IGlucHV0TXMgJiZcbiAgICAgICAgICAgICAgICBpbnB1dE1zIDw9IHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JBZnRlcihpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lKGlucHV0LCB1bml0cykgfHwgdGhpcy5pc0FmdGVyKGlucHV0LCB1bml0cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lT3JCZWZvcmUoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaWZmKGlucHV0LCB1bml0cywgYXNGbG9hdCkge1xuICAgICAgICB2YXIgdGhhdCwgem9uZURlbHRhLCBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KSAvIDEyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KSAvIDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAxZTM7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDBcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDZlNDtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMzZlNTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0IC0gem9uZURlbHRhKSAvIDg2NGU1O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MCAqIDI0LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MCAqIDI0ICogNywgbmVnYXRlIGRzdFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGlzIC0gdGhhdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhc0Zsb2F0ID8gb3V0cHV0IDogYWJzRmxvb3Iob3V0cHV0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aERpZmYoYSwgYikge1xuICAgICAgICBpZiAoYS5kYXRlKCkgPCBiLmRhdGUoKSkge1xuICAgICAgICAgICAgLy8gZW5kLW9mLW1vbnRoIGNhbGN1bGF0aW9ucyB3b3JrIGNvcnJlY3Qgd2hlbiB0aGUgc3RhcnQgbW9udGggaGFzIG1vcmVcbiAgICAgICAgICAgIC8vIGRheXMgdGhhbiB0aGUgZW5kIG1vbnRoLlxuICAgICAgICAgICAgcmV0dXJuIC1tb250aERpZmYoYiwgYSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlmZmVyZW5jZSBpbiBtb250aHNcbiAgICAgICAgdmFyIHdob2xlTW9udGhEaWZmID0gKGIueWVhcigpIC0gYS55ZWFyKCkpICogMTIgKyAoYi5tb250aCgpIC0gYS5tb250aCgpKSxcbiAgICAgICAgICAgIC8vIGIgaXMgaW4gKGFuY2hvciAtIDEgbW9udGgsIGFuY2hvciArIDEgbW9udGgpXG4gICAgICAgICAgICBhbmNob3IgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmLCAnbW9udGhzJyksXG4gICAgICAgICAgICBhbmNob3IyLFxuICAgICAgICAgICAgYWRqdXN0O1xuXG4gICAgICAgIGlmIChiIC0gYW5jaG9yIDwgMCkge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgLSAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvciAtIGFuY2hvcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgKyAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvcjIgLSBhbmNob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBmb3IgbmVnYXRpdmUgemVybywgcmV0dXJuIHplcm8gaWYgbmVnYXRpdmUgemVyb1xuICAgICAgICByZXR1cm4gLSh3aG9sZU1vbnRoRGlmZiArIGFkanVzdCkgfHwgMDtcbiAgICB9XG5cbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0VXRjID0gJ1lZWVktTU0tRERUSEg6bW06c3NbWl0nO1xuXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKCdlbicpLmZvcm1hdCgnZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWlonKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0lTT1N0cmluZyhrZWVwT2Zmc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1dGMgPSBrZWVwT2Zmc2V0ICE9PSB0cnVlLFxuICAgICAgICAgICAgbSA9IHV0YyA/IHRoaXMuY2xvbmUoKS51dGMoKSA6IHRoaXM7XG4gICAgICAgIGlmIChtLnllYXIoKSA8IDAgfHwgbS55ZWFyKCkgPiA5OTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KFxuICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgdXRjXG4gICAgICAgICAgICAgICAgICAgID8gJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXSdcbiAgICAgICAgICAgICAgICAgICAgOiAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpKSB7XG4gICAgICAgICAgICAvLyBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgfjUweCBmYXN0ZXIsIHVzZSBpdCB3aGVuIHdlIGNhblxuICAgICAgICAgICAgaWYgKHV0Yykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSArIHRoaXMudXRjT2Zmc2V0KCkgKiA2MCAqIDEwMDApXG4gICAgICAgICAgICAgICAgICAgIC50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdaJywgZm9ybWF0TW9tZW50KG0sICdaJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXRNb21lbnQoXG4gICAgICAgICAgICBtLFxuICAgICAgICAgICAgdXRjID8gJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nIDogJ1lZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gICAgICogYWxzbyBiZSBldmFsdWF0ZWQgdG8gZ2V0IGEgbmV3IG1vbWVudCB3aGljaCBpcyB0aGUgc2FtZVxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ21vbWVudC5pbnZhbGlkKC8qICcgKyB0aGlzLl9pICsgJyAqLyknO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdW5jID0gJ21vbWVudCcsXG4gICAgICAgICAgICB6b25lID0gJycsXG4gICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICB5ZWFyLFxuICAgICAgICAgICAgZGF0ZXRpbWUsXG4gICAgICAgICAgICBzdWZmaXg7XG4gICAgICAgIGlmICghdGhpcy5pc0xvY2FsKCkpIHtcbiAgICAgICAgICAgIGZ1bmMgPSB0aGlzLnV0Y09mZnNldCgpID09PSAwID8gJ21vbWVudC51dGMnIDogJ21vbWVudC5wYXJzZVpvbmUnO1xuICAgICAgICAgICAgem9uZSA9ICdaJztcbiAgICAgICAgfVxuICAgICAgICBwcmVmaXggPSAnWycgKyBmdW5jICsgJyhcIl0nO1xuICAgICAgICB5ZWFyID0gMCA8PSB0aGlzLnllYXIoKSAmJiB0aGlzLnllYXIoKSA8PSA5OTk5ID8gJ1lZWVknIDogJ1lZWVlZWSc7XG4gICAgICAgIGRhdGV0aW1lID0gJy1NTS1ERFtUXUhIOm1tOnNzLlNTUyc7XG4gICAgICAgIHN1ZmZpeCA9IHpvbmUgKyAnW1wiKV0nO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChwcmVmaXggKyB5ZWFyICsgZGF0ZXRpbWUgKyBzdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdChpbnB1dFN0cmluZykge1xuICAgICAgICBpZiAoIWlucHV0U3RyaW5nKSB7XG4gICAgICAgICAgICBpbnB1dFN0cmluZyA9IHRoaXMuaXNVdGMoKVxuICAgICAgICAgICAgICAgID8gaG9va3MuZGVmYXVsdEZvcm1hdFV0Y1xuICAgICAgICAgICAgICAgIDogaG9va3MuZGVmYXVsdEZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0gZm9ybWF0TW9tZW50KHRoaXMsIGlucHV0U3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQob3V0cHV0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8IGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oeyB0bzogdGhpcywgZnJvbTogdGltZSB9KVxuICAgICAgICAgICAgICAgIC5sb2NhbGUodGhpcy5sb2NhbGUoKSlcbiAgICAgICAgICAgICAgICAuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tTm93KHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbShjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0byh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fCBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHsgZnJvbTogdGhpcywgdG86IHRpbWUgfSlcbiAgICAgICAgICAgICAgICAubG9jYWxlKHRoaXMubG9jYWxlKCkpXG4gICAgICAgICAgICAgICAgLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9Ob3cod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50byhjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBsb2NhbGUoa2V5KSB7XG4gICAgICAgIHZhciBuZXdMb2NhbGVEYXRhO1xuXG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xvY2FsZURhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChuZXdMb2NhbGVEYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSBuZXdMb2NhbGVEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbGFuZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLmxhbmcoKSBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgbW9tZW50KCkubG9jYWxlRGF0YSgpIHRvIGdldCB0aGUgbGFuZ3VhZ2UgY29uZmlndXJhdGlvbi4gVXNlIG1vbWVudCgpLmxvY2FsZSgpIHRvIGNoYW5nZSBsYW5ndWFnZXMuJyxcbiAgICAgICAgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIHZhciBNU19QRVJfU0VDT05EID0gMTAwMCxcbiAgICAgICAgTVNfUEVSX01JTlVURSA9IDYwICogTVNfUEVSX1NFQ09ORCxcbiAgICAgICAgTVNfUEVSX0hPVVIgPSA2MCAqIE1TX1BFUl9NSU5VVEUsXG4gICAgICAgIE1TX1BFUl80MDBfWUVBUlMgPSAoMzY1ICogNDAwICsgOTcpICogMjQgKiBNU19QRVJfSE9VUjtcblxuICAgIC8vIGFjdHVhbCBtb2R1bG8gLSBoYW5kbGVzIG5lZ2F0aXZlIG51bWJlcnMgKGZvciBkYXRlcyBiZWZvcmUgMTk3MCk6XG4gICAgZnVuY3Rpb24gbW9kJDEoZGl2aWRlbmQsIGRpdmlzb3IpIHtcbiAgICAgICAgcmV0dXJuICgoZGl2aWRlbmQgJSBkaXZpc29yKSArIGRpdmlzb3IpICUgZGl2aXNvcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbFN0YXJ0T2ZEYXRlKHksIG0sIGQpIHtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkKSAtIE1TX1BFUl80MDBfWUVBUlM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSwgbSwgZCkudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRjU3RhcnRPZkRhdGUoeSwgbSwgZCkge1xuICAgICAgICAvLyBEYXRlLlVUQyByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgcmV0dXJuIERhdGUuVVRDKHkgKyA0MDAsIG0sIGQpIC0gTVNfUEVSXzQwMF9ZRUFSUztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlLlVUQyh5LCBtLCBkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXJ0T2YodW5pdHMpIHtcbiAgICAgICAgdmFyIHRpbWUsIHN0YXJ0T2ZEYXRlO1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcgfHwgIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0T2ZEYXRlID0gdGhpcy5faXNVVEMgPyB1dGNTdGFydE9mRGF0ZSA6IGxvY2FsU3RhcnRPZkRhdGU7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCAwLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSAtICh0aGlzLm1vbnRoKCkgJSAzKSxcbiAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCksIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUoKSAtIHRoaXMud2Vla2RheSgpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSAodGhpcy5pc29XZWVrZGF5KCkgLSAxKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCksIHRoaXMuZGF0ZSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKFxuICAgICAgICAgICAgICAgICAgICB0aW1lICsgKHRoaXMuX2lzVVRDID8gMCA6IHRoaXMudXRjT2Zmc2V0KCkgKiBNU19QRVJfTUlOVVRFKSxcbiAgICAgICAgICAgICAgICAgICAgTVNfUEVSX0hPVVJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSAtPSBtb2QkMSh0aW1lLCBNU19QRVJfTUlOVVRFKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEodGltZSwgTVNfUEVSX1NFQ09ORCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kLnNldFRpbWUodGltZSk7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5kT2YodW5pdHMpIHtcbiAgICAgICAgdmFyIHRpbWUsIHN0YXJ0T2ZEYXRlO1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcgfHwgIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0T2ZEYXRlID0gdGhpcy5faXNVVEMgPyB1dGNTdGFydE9mRGF0ZSA6IGxvY2FsU3RhcnRPZkRhdGU7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpICsgMSwgMCwgMSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICAgICAgdGltZSA9XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCkgLSAodGhpcy5tb250aCgpICUgMykgKyAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICApIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSArIDEsIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgICAgICAgICBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSB0aGlzLndlZWtkYXkoKSArIDdcbiAgICAgICAgICAgICAgICAgICAgKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpc29XZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gKHRoaXMuaXNvV2Vla2RheSgpIC0gMSkgKyA3XG4gICAgICAgICAgICAgICAgICAgICkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSArIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9XG4gICAgICAgICAgICAgICAgICAgIE1TX1BFUl9IT1VSIC1cbiAgICAgICAgICAgICAgICAgICAgbW9kJDEoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lICsgKHRoaXMuX2lzVVRDID8gMCA6IHRoaXMudXRjT2Zmc2V0KCkgKiBNU19QRVJfTUlOVVRFKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE1TX1BFUl9IT1VSXG4gICAgICAgICAgICAgICAgICAgICkgLVxuICAgICAgICAgICAgICAgICAgICAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSArPSBNU19QRVJfTUlOVVRFIC0gbW9kJDEodGltZSwgTVNfUEVSX01JTlVURSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSArPSBNU19QRVJfU0VDT05EIC0gbW9kJDEodGltZSwgTVNfUEVSX1NFQ09ORCkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZC5zZXRUaW1lKHRpbWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kLnZhbHVlT2YoKSAtICh0aGlzLl9vZmZzZXQgfHwgMCkgKiA2MDAwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bml4KCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvRGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0FycmF5KCkge1xuICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBtLnllYXIoKSxcbiAgICAgICAgICAgIG0ubW9udGgoKSxcbiAgICAgICAgICAgIG0uZGF0ZSgpLFxuICAgICAgICAgICAgbS5ob3VyKCksXG4gICAgICAgICAgICBtLm1pbnV0ZSgpLFxuICAgICAgICAgICAgbS5zZWNvbmQoKSxcbiAgICAgICAgICAgIG0ubWlsbGlzZWNvbmQoKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b09iamVjdCgpIHtcbiAgICAgICAgdmFyIG0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcnM6IG0ueWVhcigpLFxuICAgICAgICAgICAgbW9udGhzOiBtLm1vbnRoKCksXG4gICAgICAgICAgICBkYXRlOiBtLmRhdGUoKSxcbiAgICAgICAgICAgIGhvdXJzOiBtLmhvdXJzKCksXG4gICAgICAgICAgICBtaW51dGVzOiBtLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHNlY29uZHM6IG0uc2Vjb25kcygpLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzOiBtLm1pbGxpc2Vjb25kcygpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICAgICAgLy8gbmV3IERhdGUoTmFOKS50b0pTT04oKSA9PT0gbnVsbFxuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMigpIHtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCBnZXRQYXJzaW5nRmxhZ3ModGhpcykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludmFsaWRBdCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcnNpbmdGbGFncyh0aGlzKS5vdmVyZmxvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGlvbkRhdGEoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbnB1dDogdGhpcy5faSxcbiAgICAgICAgICAgIGZvcm1hdDogdGhpcy5fZixcbiAgICAgICAgICAgIGxvY2FsZTogdGhpcy5fbG9jYWxlLFxuICAgICAgICAgICAgaXNVVEM6IHRoaXMuX2lzVVRDLFxuICAgICAgICAgICAgc3RyaWN0OiB0aGlzLl9zdHJpY3QsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ04nLCAwLCAwLCAnZXJhQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTicsIDAsIDAsICdlcmFBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OTicsIDAsIDAsICdlcmFBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OTk4nLCAwLCAwLCAnZXJhTmFtZScpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdOTk5OTicsIDAsIDAsICdlcmFOYXJyb3cnKTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5JywgMV0sICd5bycsICdlcmFZZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3l5JywgMl0sIDAsICdlcmFZZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3l5eScsIDNdLCAwLCAnZXJhWWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd5JywgWyd5eXl5JywgNF0sIDAsICdlcmFZZWFyJyk7XG5cbiAgICBhZGRSZWdleFRva2VuKCdOJywgbWF0Y2hFcmFBYmJyKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTicsIG1hdGNoRXJhQWJicik7XG4gICAgYWRkUmVnZXhUb2tlbignTk5OJywgbWF0Y2hFcmFBYmJyKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTk5OJywgbWF0Y2hFcmFOYW1lKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTk5OTicsIG1hdGNoRXJhTmFycm93KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oXG4gICAgICAgIFsnTicsICdOTicsICdOTk4nLCAnTk5OTicsICdOTk5OTiddLFxuICAgICAgICBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICB2YXIgZXJhID0gY29uZmlnLl9sb2NhbGUuZXJhc1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgICAgICAgICAgaWYgKGVyYSkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVyYSA9IGVyYTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZEVyYSA9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3knLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5eScsIG1hdGNoVW5zaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3l5eScsIG1hdGNoVW5zaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3l5eXknLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5bycsIG1hdGNoRXJhWWVhck9yZGluYWwpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ3knLCAneXknLCAneXl5JywgJ3l5eXknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ3lvJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIG1hdGNoO1xuICAgICAgICBpZiAoY29uZmlnLl9sb2NhbGUuX2VyYVllYXJPcmRpbmFsUmVnZXgpIHtcbiAgICAgICAgICAgIG1hdGNoID0gaW5wdXQubWF0Y2goY29uZmlnLl9sb2NhbGUuX2VyYVllYXJPcmRpbmFsUmVnZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fbG9jYWxlLmVyYVllYXJPcmRpbmFsUGFyc2UpIHtcbiAgICAgICAgICAgIGFycmF5W1lFQVJdID0gY29uZmlnLl9sb2NhbGUuZXJhWWVhck9yZGluYWxQYXJzZShpbnB1dCwgbWF0Y2gpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlbWUVBUl0gPSBwYXJzZUludChpbnB1dCwgMTApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVFcmFzKG0sIGZvcm1hdCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMuX2VyYXMgfHwgZ2V0TG9jYWxlKCdlbicpLl9lcmFzO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGVyYXNbaV0uc2luY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICAgICAgICAgIGRhdGUgPSBob29rcyhlcmFzW2ldLnNpbmNlKS5zdGFydE9mKCdkYXknKTtcbiAgICAgICAgICAgICAgICAgICAgZXJhc1tpXS5zaW5jZSA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgZXJhc1tpXS51bnRpbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0udW50aWwgPSArSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGhvb2tzKGVyYXNbaV0udW50aWwpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgZXJhc1tpXS51bnRpbCA9IGRhdGUudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJhcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVFcmFzUGFyc2UoZXJhTmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMuZXJhcygpLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGFiYnIsXG4gICAgICAgICAgICBuYXJyb3c7XG4gICAgICAgIGVyYU5hbWUgPSBlcmFOYW1lLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBuYW1lID0gZXJhc1tpXS5uYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBhYmJyID0gZXJhc1tpXS5hYmJyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBuYXJyb3cgPSBlcmFzW2ldLm5hcnJvdy50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk5OJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYmJyID09PSBlcmFOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTk5OJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBlcmFOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTk5OTic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFycm93ID09PSBlcmFOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFtuYW1lLCBhYmJyLCBuYXJyb3ddLmluZGV4T2YoZXJhTmFtZSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlRXJhc0NvbnZlcnRZZWFyKGVyYSwgeWVhcikge1xuICAgICAgICB2YXIgZGlyID0gZXJhLnNpbmNlIDw9IGVyYS51bnRpbCA/ICsxIDogLTE7XG4gICAgICAgIGlmICh5ZWFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBob29rcyhlcmEuc2luY2UpLnllYXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBob29rcyhlcmEuc2luY2UpLnllYXIoKSArICh5ZWFyIC0gZXJhLm9mZnNldCkgKiBkaXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFcmFOYW1lKCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5sb2NhbGVEYXRhKCkuZXJhcygpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnNpbmNlIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS51bnRpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJhc1tpXS51bnRpbCA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0uc2luY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYU5hcnJvdygpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoZXJhc1tpXS5zaW5jZSA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5uYXJyb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJhc1tpXS51bnRpbCA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0uc2luY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5uYXJyb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhQWJicigpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoZXJhc1tpXS5zaW5jZSA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5hYmJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0uYWJicjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFcmFZZWFyKCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBkaXIsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5sb2NhbGVEYXRhKCkuZXJhcygpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIGRpciA9IGVyYXNbaV0uc2luY2UgPD0gZXJhc1tpXS51bnRpbCA/ICsxIDogLTE7XG5cbiAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoZXJhc1tpXS5zaW5jZSA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0udW50aWwpIHx8XG4gICAgICAgICAgICAgICAgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMueWVhcigpIC0gaG9va3MoZXJhc1tpXS5zaW5jZSkueWVhcigpKSAqIGRpciArXG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0ub2Zmc2V0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcmFzTmFtZVJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX2VyYXNOYW1lUmVnZXgnKSkge1xuICAgICAgICAgICAgY29tcHV0ZUVyYXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1N0cmljdCA/IHRoaXMuX2VyYXNOYW1lUmVnZXggOiB0aGlzLl9lcmFzUmVnZXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJhc0FiYnJSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19lcmFzQWJiclJlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVFcmFzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgPyB0aGlzLl9lcmFzQWJiclJlZ2V4IDogdGhpcy5fZXJhc1JlZ2V4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVyYXNOYXJyb3dSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19lcmFzTmFycm93UmVnZXgnKSkge1xuICAgICAgICAgICAgY29tcHV0ZUVyYXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1N0cmljdCA/IHRoaXMuX2VyYXNOYXJyb3dSZWdleCA6IHRoaXMuX2VyYXNSZWdleDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYUFiYnIoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmVyYXNBYmJyUmVnZXgoaXNTdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhTmFtZShpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZXJhc05hbWVSZWdleChpc1N0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hFcmFOYXJyb3coaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmVyYXNOYXJyb3dSZWdleChpc1N0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hFcmFZZWFyT3JkaW5hbChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuX2VyYVllYXJPcmRpbmFsUmVnZXggfHwgbWF0Y2hVbnNpZ25lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlRXJhc1BhcnNlKCkge1xuICAgICAgICB2YXIgYWJiclBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbmFtZVBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbmFycm93UGllY2VzID0gW10sXG4gICAgICAgICAgICBtaXhlZFBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBlcmFzTmFtZSxcbiAgICAgICAgICAgIGVyYXNBYmJyLFxuICAgICAgICAgICAgZXJhc05hcnJvdyxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmVyYXMoKTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIGVyYXNOYW1lID0gcmVnZXhFc2NhcGUoZXJhc1tpXS5uYW1lKTtcbiAgICAgICAgICAgIGVyYXNBYmJyID0gcmVnZXhFc2NhcGUoZXJhc1tpXS5hYmJyKTtcbiAgICAgICAgICAgIGVyYXNOYXJyb3cgPSByZWdleEVzY2FwZShlcmFzW2ldLm5hcnJvdyk7XG5cbiAgICAgICAgICAgIG5hbWVQaWVjZXMucHVzaChlcmFzTmFtZSk7XG4gICAgICAgICAgICBhYmJyUGllY2VzLnB1c2goZXJhc0FiYnIpO1xuICAgICAgICAgICAgbmFycm93UGllY2VzLnB1c2goZXJhc05hcnJvdyk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGVyYXNOYW1lKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2goZXJhc0FiYnIpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChlcmFzTmFycm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VyYXNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fZXJhc05hbWVSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG5hbWVQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9lcmFzQWJiclJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgYWJiclBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX2VyYXNOYXJyb3dSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbmFycm93UGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnZ2cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydHRycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBhZGRXZWVrWWVhckZvcm1hdFRva2VuKHRva2VuLCBnZXR0ZXIpIHtcbiAgICAgICAgYWRkRm9ybWF0VG9rZW4oMCwgW3Rva2VuLCB0b2tlbi5sZW5ndGhdLCAwLCBnZXR0ZXIpO1xuICAgIH1cblxuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2cnLCAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnZycsICd3ZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0cnLCAnaXNvV2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHRycsICdpc29XZWVrWWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignRycsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdnJywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0cnLCBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZycsIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHRycsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnZycsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFxuICAgICAgICBbJ2dnZ2cnLCAnZ2dnZ2cnLCAnR0dHRycsICdHR0dHRyddLFxuICAgICAgICBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDIpXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnJywgJ0dHJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgdGhpcy53ZWVrKCksXG4gICAgICAgICAgICB0aGlzLndlZWtkYXkoKSArIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyxcbiAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyxcbiAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRveVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWtZZWFyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgdGhpcy5pc29XZWVrKCksXG4gICAgICAgICAgICB0aGlzLmlzb1dlZWtkYXkoKSxcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICA0XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIoKSB7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SVNPV2Vla3NJbklTT1dlZWtZZWFyKCkge1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy5pc29XZWVrWWVhcigpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRXZWVrc0luWWVhcigpIHtcbiAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgd2Vla0luZm8uZG93LCB3ZWVrSW5mby5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFdlZWtzSW5XZWVrWWVhcigpIHtcbiAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLndlZWtZZWFyKCksIHdlZWtJbmZvLmRvdywgd2Vla0luZm8uZG95KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrWWVhckhlbHBlcihpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtzVGFyZ2V0O1xuICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIodGhpcywgZG93LCBkb3kpLnllYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3ZWVrc1RhcmdldCA9IHdlZWtzSW5ZZWFyKGlucHV0LCBkb3csIGRveSk7XG4gICAgICAgICAgICBpZiAod2VlayA+IHdlZWtzVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgd2VlayA9IHdlZWtzVGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNldFdlZWtBbGwuY2FsbCh0aGlzLCBpbnB1dCwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0V2Vla0FsbCh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhckRhdGEgPSBkYXlPZlllYXJGcm9tV2Vla3Mod2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSxcbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKGRheU9mWWVhckRhdGEueWVhciwgMCwgZGF5T2ZZZWFyRGF0YS5kYXlPZlllYXIpO1xuXG4gICAgICAgIHRoaXMueWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpO1xuICAgICAgICB0aGlzLm1vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSk7XG4gICAgICAgIHRoaXMuZGF0ZShkYXRlLmdldFVUQ0RhdGUoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdRJywgMCwgJ1FvJywgJ3F1YXJ0ZXInKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1EnLCBtYXRjaDEpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1EnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9ICh0b0ludChpbnB1dCkgLSAxKSAqIDM7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRRdWFydGVyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsXG4gICAgICAgICAgICA/IE1hdGguY2VpbCgodGhpcy5tb250aCgpICsgMSkgLyAzKVxuICAgICAgICAgICAgOiB0aGlzLm1vbnRoKChpbnB1dCAtIDEpICogMyArICh0aGlzLm1vbnRoKCkgJSAzKSk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0QnLCBbJ0REJywgMl0sICdEbycsICdkYXRlJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdERCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdEbycsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBcIm9yZGluYWxQYXJzZVwiIGZhbGxiYWNrIGluIG5leHQgbWFqb3IgcmVsZWFzZS5cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0XG4gICAgICAgICAgICA/IGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZSB8fCBsb2NhbGUuX29yZGluYWxQYXJzZVxuICAgICAgICAgICAgOiBsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50O1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ0QnLCAnREQnXSwgREFURSk7XG4gICAgYWRkUGFyc2VUb2tlbignRG8nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W0RBVEVdID0gdG9JbnQoaW5wdXQubWF0Y2gobWF0Y2gxdG8yKVswXSk7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0RGF5T2ZNb250aCA9IG1ha2VHZXRTZXQoJ0RhdGUnLCB0cnVlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdEREQnLCBbJ0REREQnLCAzXSwgJ0RERG8nLCAnZGF5T2ZZZWFyJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEREQnLCBtYXRjaDF0bzMpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0REREQnLCBtYXRjaDMpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydEREQnLCAnRERERCddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXREYXlPZlllYXIoaW5wdXQpIHtcbiAgICAgICAgdmFyIGRheU9mWWVhciA9XG4gICAgICAgICAgICBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgICh0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykgLSB0aGlzLmNsb25lKCkuc3RhcnRPZigneWVhcicpKSAvIDg2NGU1XG4gICAgICAgICAgICApICsgMTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyBkYXlPZlllYXIgOiB0aGlzLmFkZChpbnB1dCAtIGRheU9mWWVhciwgJ2QnKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignbScsIFsnbW0nLCAyXSwgMCwgJ21pbnV0ZScpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignbScsIG1hdGNoMXRvMiwgbWF0Y2gxdG8ySGFzWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignbW0nLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ20nLCAnbW0nXSwgTUlOVVRFKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRNaW51dGUgPSBtYWtlR2V0U2V0KCdNaW51dGVzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3MnLCBbJ3NzJywgMl0sIDAsICdzZWNvbmQnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3MnLCBtYXRjaDF0bzIsIG1hdGNoMXRvMkhhc1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3NzJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydzJywgJ3NzJ10sIFNFQ09ORCk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0U2Vjb25kID0gbWFrZUdldFNldCgnU2Vjb25kcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdTJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gfn4odGhpcy5taWxsaXNlY29uZCgpIC8gMTAwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1MnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gfn4odGhpcy5taWxsaXNlY29uZCgpIC8gMTApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1MnLCAzXSwgMCwgJ21pbGxpc2Vjb25kJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTJywgNF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1MnLCA1XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTJywgNl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTJywgN10sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTU1MnLCA4XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTU1NTJywgOV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDA7XG4gICAgfSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdTJywgbWF0Y2gxdG8zLCBtYXRjaDEpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTJywgbWF0Y2gxdG8zLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTUycsIG1hdGNoMXRvMywgbWF0Y2gzKTtcblxuICAgIHZhciB0b2tlbiwgZ2V0U2V0TWlsbGlzZWNvbmQ7XG4gICAgZm9yICh0b2tlbiA9ICdTU1NTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgICAgICBhZGRSZWdleFRva2VuKHRva2VuLCBtYXRjaFVuc2lnbmVkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU1zKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNSUxMSVNFQ09ORF0gPSB0b0ludCgoJzAuJyArIGlucHV0KSAqIDEwMDApO1xuICAgIH1cblxuICAgIGZvciAodG9rZW4gPSAnUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgcGFyc2VNcyk7XG4gICAgfVxuXG4gICAgZ2V0U2V0TWlsbGlzZWNvbmQgPSBtYWtlR2V0U2V0KCdNaWxsaXNlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigneicsIDAsIDAsICd6b25lQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd6eicsIDAsIDAsICd6b25lTmFtZScpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZUFiYnIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdVVEMnIDogJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZScgOiAnJztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8gPSBNb21lbnQucHJvdG90eXBlO1xuXG4gICAgcHJvdG8uYWRkID0gYWRkO1xuICAgIHByb3RvLmNhbGVuZGFyID0gY2FsZW5kYXIkMTtcbiAgICBwcm90by5jbG9uZSA9IGNsb25lO1xuICAgIHByb3RvLmRpZmYgPSBkaWZmO1xuICAgIHByb3RvLmVuZE9mID0gZW5kT2Y7XG4gICAgcHJvdG8uZm9ybWF0ID0gZm9ybWF0O1xuICAgIHByb3RvLmZyb20gPSBmcm9tO1xuICAgIHByb3RvLmZyb21Ob3cgPSBmcm9tTm93O1xuICAgIHByb3RvLnRvID0gdG87XG4gICAgcHJvdG8udG9Ob3cgPSB0b05vdztcbiAgICBwcm90by5nZXQgPSBzdHJpbmdHZXQ7XG4gICAgcHJvdG8uaW52YWxpZEF0ID0gaW52YWxpZEF0O1xuICAgIHByb3RvLmlzQWZ0ZXIgPSBpc0FmdGVyO1xuICAgIHByb3RvLmlzQmVmb3JlID0gaXNCZWZvcmU7XG4gICAgcHJvdG8uaXNCZXR3ZWVuID0gaXNCZXR3ZWVuO1xuICAgIHByb3RvLmlzU2FtZSA9IGlzU2FtZTtcbiAgICBwcm90by5pc1NhbWVPckFmdGVyID0gaXNTYW1lT3JBZnRlcjtcbiAgICBwcm90by5pc1NhbWVPckJlZm9yZSA9IGlzU2FtZU9yQmVmb3JlO1xuICAgIHByb3RvLmlzVmFsaWQgPSBpc1ZhbGlkJDI7XG4gICAgcHJvdG8ubGFuZyA9IGxhbmc7XG4gICAgcHJvdG8ubG9jYWxlID0gbG9jYWxlO1xuICAgIHByb3RvLmxvY2FsZURhdGEgPSBsb2NhbGVEYXRhO1xuICAgIHByb3RvLm1heCA9IHByb3RvdHlwZU1heDtcbiAgICBwcm90by5taW4gPSBwcm90b3R5cGVNaW47XG4gICAgcHJvdG8ucGFyc2luZ0ZsYWdzID0gcGFyc2luZ0ZsYWdzO1xuICAgIHByb3RvLnNldCA9IHN0cmluZ1NldDtcbiAgICBwcm90by5zdGFydE9mID0gc3RhcnRPZjtcbiAgICBwcm90by5zdWJ0cmFjdCA9IHN1YnRyYWN0O1xuICAgIHByb3RvLnRvQXJyYXkgPSB0b0FycmF5O1xuICAgIHByb3RvLnRvT2JqZWN0ID0gdG9PYmplY3Q7XG4gICAgcHJvdG8udG9EYXRlID0gdG9EYXRlO1xuICAgIHByb3RvLnRvSVNPU3RyaW5nID0gdG9JU09TdHJpbmc7XG4gICAgcHJvdG8uaW5zcGVjdCA9IGluc3BlY3Q7XG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5mb3IgIT0gbnVsbCkge1xuICAgICAgICBwcm90b1tTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAnTW9tZW50PCcgKyB0aGlzLmZvcm1hdCgpICsgJz4nO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBwcm90by50b0pTT04gPSB0b0pTT047XG4gICAgcHJvdG8udG9TdHJpbmcgPSB0b1N0cmluZztcbiAgICBwcm90by51bml4ID0gdW5peDtcbiAgICBwcm90by52YWx1ZU9mID0gdmFsdWVPZjtcbiAgICBwcm90by5jcmVhdGlvbkRhdGEgPSBjcmVhdGlvbkRhdGE7XG4gICAgcHJvdG8uZXJhTmFtZSA9IGdldEVyYU5hbWU7XG4gICAgcHJvdG8uZXJhTmFycm93ID0gZ2V0RXJhTmFycm93O1xuICAgIHByb3RvLmVyYUFiYnIgPSBnZXRFcmFBYmJyO1xuICAgIHByb3RvLmVyYVllYXIgPSBnZXRFcmFZZWFyO1xuICAgIHByb3RvLnllYXIgPSBnZXRTZXRZZWFyO1xuICAgIHByb3RvLmlzTGVhcFllYXIgPSBnZXRJc0xlYXBZZWFyO1xuICAgIHByb3RvLndlZWtZZWFyID0gZ2V0U2V0V2Vla1llYXI7XG4gICAgcHJvdG8uaXNvV2Vla1llYXIgPSBnZXRTZXRJU09XZWVrWWVhcjtcbiAgICBwcm90by5xdWFydGVyID0gcHJvdG8ucXVhcnRlcnMgPSBnZXRTZXRRdWFydGVyO1xuICAgIHByb3RvLm1vbnRoID0gZ2V0U2V0TW9udGg7XG4gICAgcHJvdG8uZGF5c0luTW9udGggPSBnZXREYXlzSW5Nb250aDtcbiAgICBwcm90by53ZWVrID0gcHJvdG8ud2Vla3MgPSBnZXRTZXRXZWVrO1xuICAgIHByb3RvLmlzb1dlZWsgPSBwcm90by5pc29XZWVrcyA9IGdldFNldElTT1dlZWs7XG4gICAgcHJvdG8ud2Vla3NJblllYXIgPSBnZXRXZWVrc0luWWVhcjtcbiAgICBwcm90by53ZWVrc0luV2Vla1llYXIgPSBnZXRXZWVrc0luV2Vla1llYXI7XG4gICAgcHJvdG8uaXNvV2Vla3NJblllYXIgPSBnZXRJU09XZWVrc0luWWVhcjtcbiAgICBwcm90by5pc29XZWVrc0luSVNPV2Vla1llYXIgPSBnZXRJU09XZWVrc0luSVNPV2Vla1llYXI7XG4gICAgcHJvdG8uZGF0ZSA9IGdldFNldERheU9mTW9udGg7XG4gICAgcHJvdG8uZGF5ID0gcHJvdG8uZGF5cyA9IGdldFNldERheU9mV2VlaztcbiAgICBwcm90by53ZWVrZGF5ID0gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrO1xuICAgIHByb3RvLmlzb1dlZWtkYXkgPSBnZXRTZXRJU09EYXlPZldlZWs7XG4gICAgcHJvdG8uZGF5T2ZZZWFyID0gZ2V0U2V0RGF5T2ZZZWFyO1xuICAgIHByb3RvLmhvdXIgPSBwcm90by5ob3VycyA9IGdldFNldEhvdXI7XG4gICAgcHJvdG8ubWludXRlID0gcHJvdG8ubWludXRlcyA9IGdldFNldE1pbnV0ZTtcbiAgICBwcm90by5zZWNvbmQgPSBwcm90by5zZWNvbmRzID0gZ2V0U2V0U2Vjb25kO1xuICAgIHByb3RvLm1pbGxpc2Vjb25kID0gcHJvdG8ubWlsbGlzZWNvbmRzID0gZ2V0U2V0TWlsbGlzZWNvbmQ7XG4gICAgcHJvdG8udXRjT2Zmc2V0ID0gZ2V0U2V0T2Zmc2V0O1xuICAgIHByb3RvLnV0YyA9IHNldE9mZnNldFRvVVRDO1xuICAgIHByb3RvLmxvY2FsID0gc2V0T2Zmc2V0VG9Mb2NhbDtcbiAgICBwcm90by5wYXJzZVpvbmUgPSBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldDtcbiAgICBwcm90by5oYXNBbGlnbmVkSG91ck9mZnNldCA9IGhhc0FsaWduZWRIb3VyT2Zmc2V0O1xuICAgIHByb3RvLmlzRFNUID0gaXNEYXlsaWdodFNhdmluZ1RpbWU7XG4gICAgcHJvdG8uaXNMb2NhbCA9IGlzTG9jYWw7XG4gICAgcHJvdG8uaXNVdGNPZmZzZXQgPSBpc1V0Y09mZnNldDtcbiAgICBwcm90by5pc1V0YyA9IGlzVXRjO1xuICAgIHByb3RvLmlzVVRDID0gaXNVdGM7XG4gICAgcHJvdG8uem9uZUFiYnIgPSBnZXRab25lQWJicjtcbiAgICBwcm90by56b25lTmFtZSA9IGdldFpvbmVOYW1lO1xuICAgIHByb3RvLmRhdGVzID0gZGVwcmVjYXRlKFxuICAgICAgICAnZGF0ZXMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIGRhdGUgaW5zdGVhZC4nLFxuICAgICAgICBnZXRTZXREYXlPZk1vbnRoXG4gICAgKTtcbiAgICBwcm90by5tb250aHMgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQnLFxuICAgICAgICBnZXRTZXRNb250aFxuICAgICk7XG4gICAgcHJvdG8ueWVhcnMgPSBkZXByZWNhdGUoXG4gICAgICAgICd5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkJyxcbiAgICAgICAgZ2V0U2V0WWVhclxuICAgICk7XG4gICAgcHJvdG8uem9uZSA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLnpvbmUgaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudCgpLnV0Y09mZnNldCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL3pvbmUvJyxcbiAgICAgICAgZ2V0U2V0Wm9uZVxuICAgICk7XG4gICAgcHJvdG8uaXNEU1RTaGlmdGVkID0gZGVwcmVjYXRlKFxuICAgICAgICAnaXNEU1RTaGlmdGVkIGlzIGRlcHJlY2F0ZWQuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RzdC1zaGlmdGVkLyBmb3IgbW9yZSBpbmZvcm1hdGlvbicsXG4gICAgICAgIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVbml4KGlucHV0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCAqIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluWm9uZSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFyc2Vab25lKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlUGFyc2VQb3N0Rm9ybWF0KHN0cmluZykge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH1cblxuICAgIHZhciBwcm90byQxID0gTG9jYWxlLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDEuY2FsZW5kYXIgPSBjYWxlbmRhcjtcbiAgICBwcm90byQxLmxvbmdEYXRlRm9ybWF0ID0gbG9uZ0RhdGVGb3JtYXQ7XG4gICAgcHJvdG8kMS5pbnZhbGlkRGF0ZSA9IGludmFsaWREYXRlO1xuICAgIHByb3RvJDEub3JkaW5hbCA9IG9yZGluYWw7XG4gICAgcHJvdG8kMS5wcmVwYXJzZSA9IHByZVBhcnNlUG9zdEZvcm1hdDtcbiAgICBwcm90byQxLnBvc3Rmb3JtYXQgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5yZWxhdGl2ZVRpbWUgPSByZWxhdGl2ZVRpbWU7XG4gICAgcHJvdG8kMS5wYXN0RnV0dXJlID0gcGFzdEZ1dHVyZTtcbiAgICBwcm90byQxLnNldCA9IHNldDtcbiAgICBwcm90byQxLmVyYXMgPSBsb2NhbGVFcmFzO1xuICAgIHByb3RvJDEuZXJhc1BhcnNlID0gbG9jYWxlRXJhc1BhcnNlO1xuICAgIHByb3RvJDEuZXJhc0NvbnZlcnRZZWFyID0gbG9jYWxlRXJhc0NvbnZlcnRZZWFyO1xuICAgIHByb3RvJDEuZXJhc0FiYnJSZWdleCA9IGVyYXNBYmJyUmVnZXg7XG4gICAgcHJvdG8kMS5lcmFzTmFtZVJlZ2V4ID0gZXJhc05hbWVSZWdleDtcbiAgICBwcm90byQxLmVyYXNOYXJyb3dSZWdleCA9IGVyYXNOYXJyb3dSZWdleDtcblxuICAgIHByb3RvJDEubW9udGhzID0gbG9jYWxlTW9udGhzO1xuICAgIHByb3RvJDEubW9udGhzU2hvcnQgPSBsb2NhbGVNb250aHNTaG9ydDtcbiAgICBwcm90byQxLm1vbnRoc1BhcnNlID0gbG9jYWxlTW9udGhzUGFyc2U7XG4gICAgcHJvdG8kMS5tb250aHNSZWdleCA9IG1vbnRoc1JlZ2V4O1xuICAgIHByb3RvJDEubW9udGhzU2hvcnRSZWdleCA9IG1vbnRoc1Nob3J0UmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrID0gbG9jYWxlV2VlaztcbiAgICBwcm90byQxLmZpcnN0RGF5T2ZZZWFyID0gbG9jYWxlRmlyc3REYXlPZlllYXI7XG4gICAgcHJvdG8kMS5maXJzdERheU9mV2VlayA9IGxvY2FsZUZpcnN0RGF5T2ZXZWVrO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5cyA9IGxvY2FsZVdlZWtkYXlzO1xuICAgIHByb3RvJDEud2Vla2RheXNNaW4gPSBsb2NhbGVXZWVrZGF5c01pbjtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnQgPSBsb2NhbGVXZWVrZGF5c1Nob3J0O1xuICAgIHByb3RvJDEud2Vla2RheXNQYXJzZSA9IGxvY2FsZVdlZWtkYXlzUGFyc2U7XG5cbiAgICBwcm90byQxLndlZWtkYXlzUmVnZXggPSB3ZWVrZGF5c1JlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNTaG9ydFJlZ2V4ID0gd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNNaW5SZWdleCA9IHdlZWtkYXlzTWluUmVnZXg7XG5cbiAgICBwcm90byQxLmlzUE0gPSBsb2NhbGVJc1BNO1xuICAgIHByb3RvJDEubWVyaWRpZW0gPSBsb2NhbGVNZXJpZGllbTtcblxuICAgIGZ1bmN0aW9uIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpLFxuICAgICAgICAgICAgdXRjID0gY3JlYXRlVVRDKCkuc2V0KHNldHRlciwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gbG9jYWxlW2ZpZWxkXSh1dGMsIGZvcm1hdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCBpbmRleCwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgaSwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgLy8gKClcbiAgICAvLyAoNSlcbiAgICAvLyAoZm10LCA1KVxuICAgIC8vIChmbXQpXG4gICAgLy8gKHRydWUpXG4gICAgLy8gKHRydWUsIDUpXG4gICAgLy8gKHRydWUsIGZtdCwgNSlcbiAgICAvLyAodHJ1ZSwgZm10KVxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsZVNvcnRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybWF0ID0gbG9jYWxlU29ydGVkO1xuICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICBsb2NhbGVTb3J0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHNoaWZ0ID0gbG9jYWxlU29ydGVkID8gbG9jYWxlLl93ZWVrLmRvdyA6IDAsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgb3V0ID0gW107XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQkMShmb3JtYXQsIChpbmRleCArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIChpICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHMoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRocycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNTaG9ydChmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXMobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzU2hvcnQobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNNaW4obG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzTWluJyk7XG4gICAgfVxuXG4gICAgZ2V0U2V0R2xvYmFsTG9jYWxlKCdlbicsIHtcbiAgICAgICAgZXJhczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMS0wMS0wMScsXG4gICAgICAgICAgICAgICAgdW50aWw6ICtJbmZpbml0eSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0Fubm8gRG9taW5pJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICdBRCcsXG4gICAgICAgICAgICAgICAgYWJicjogJ0FEJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcwMDAwLTEyLTMxJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogLUluZmluaXR5LFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnQmVmb3JlIENocmlzdCcsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQkMnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdCQycsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB0b0ludCgobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgaG9va3MubGFuZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudC5sYW5nIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlXG4gICAgKTtcbiAgICBob29rcy5sYW5nRGF0YSA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC4nLFxuICAgICAgICBnZXRMb2NhbGVcbiAgICApO1xuXG4gICAgdmFyIG1hdGhBYnMgPSBNYXRoLmFicztcblxuICAgIGZ1bmN0aW9uIGFicygpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhO1xuXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9IG1hdGhBYnModGhpcy5fbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgdGhpcy5fZGF5cyA9IG1hdGhBYnModGhpcy5fZGF5cyk7XG4gICAgICAgIHRoaXMuX21vbnRocyA9IG1hdGhBYnModGhpcy5fbW9udGhzKTtcblxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1hdGhBYnMoZGF0YS5taWxsaXNlY29uZHMpO1xuICAgICAgICBkYXRhLnNlY29uZHMgPSBtYXRoQWJzKGRhdGEuc2Vjb25kcyk7XG4gICAgICAgIGRhdGEubWludXRlcyA9IG1hdGhBYnMoZGF0YS5taW51dGVzKTtcbiAgICAgICAgZGF0YS5ob3VycyA9IG1hdGhBYnMoZGF0YS5ob3Vycyk7XG4gICAgICAgIGRhdGEubW9udGhzID0gbWF0aEFicyhkYXRhLm1vbnRocyk7XG4gICAgICAgIGRhdGEueWVhcnMgPSBtYXRoQWJzKGRhdGEueWVhcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0JDEoZHVyYXRpb24sIGlucHV0LCB2YWx1ZSwgZGlyZWN0aW9uKSB7XG4gICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUR1cmF0aW9uKGlucHV0LCB2YWx1ZSk7XG5cbiAgICAgICAgZHVyYXRpb24uX21pbGxpc2Vjb25kcyArPSBkaXJlY3Rpb24gKiBvdGhlci5fbWlsbGlzZWNvbmRzO1xuICAgICAgICBkdXJhdGlvbi5fZGF5cyArPSBkaXJlY3Rpb24gKiBvdGhlci5fZGF5cztcbiAgICAgICAgZHVyYXRpb24uX21vbnRocyArPSBkaXJlY3Rpb24gKiBvdGhlci5fbW9udGhzO1xuXG4gICAgICAgIHJldHVybiBkdXJhdGlvbi5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgYWRkKDEsICdzJykgb3IgYWRkKGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIGFkZCQxKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIDEpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIHN1YnRyYWN0KDEsICdzJykgb3Igc3VidHJhY3QoZHVyYXRpb24pXG4gICAgZnVuY3Rpb24gc3VidHJhY3QkMShpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAtMSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzQ2VpbChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBidWJibGUoKSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyxcbiAgICAgICAgICAgIG1vbnRocyA9IHRoaXMuX21vbnRocyxcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgc2Vjb25kcyxcbiAgICAgICAgICAgIG1pbnV0ZXMsXG4gICAgICAgICAgICBob3VycyxcbiAgICAgICAgICAgIHllYXJzLFxuICAgICAgICAgICAgbW9udGhzRnJvbURheXM7XG5cbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIG1peCBvZiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgdmFsdWVzLCBidWJibGUgZG93biBmaXJzdFxuICAgICAgICAvLyBjaGVjazogaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzIxNjZcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAobWlsbGlzZWNvbmRzID49IDAgJiYgZGF5cyA+PSAwICYmIG1vbnRocyA+PSAwKSB8fFxuICAgICAgICAgICAgICAgIChtaWxsaXNlY29uZHMgPD0gMCAmJiBkYXlzIDw9IDAgJiYgbW9udGhzIDw9IDApXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgbWlsbGlzZWNvbmRzICs9IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRocykgKyBkYXlzKSAqIDg2NGU1O1xuICAgICAgICAgICAgZGF5cyA9IDA7XG4gICAgICAgICAgICBtb250aHMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGJ1YmJsZXMgdXAgdmFsdWVzLCBzZWUgdGhlIHRlc3RzIGZvclxuICAgICAgICAvLyBleGFtcGxlcyBvZiB3aGF0IHRoYXQgbWVhbnMuXG4gICAgICAgIGRhdGEubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzICUgMTAwMDtcblxuICAgICAgICBzZWNvbmRzID0gYWJzRmxvb3IobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcblxuICAgICAgICBtaW51dGVzID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgZGF0YS5taW51dGVzID0gbWludXRlcyAlIDYwO1xuXG4gICAgICAgIGhvdXJzID0gYWJzRmxvb3IobWludXRlcyAvIDYwKTtcbiAgICAgICAgZGF0YS5ob3VycyA9IGhvdXJzICUgMjQ7XG5cbiAgICAgICAgZGF5cyArPSBhYnNGbG9vcihob3VycyAvIDI0KTtcblxuICAgICAgICAvLyBjb252ZXJ0IGRheXMgdG8gbW9udGhzXG4gICAgICAgIG1vbnRoc0Zyb21EYXlzID0gYWJzRmxvb3IoZGF5c1RvTW9udGhzKGRheXMpKTtcbiAgICAgICAgbW9udGhzICs9IG1vbnRoc0Zyb21EYXlzO1xuICAgICAgICBkYXlzIC09IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRoc0Zyb21EYXlzKSk7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIGRhdGEuZGF5cyA9IGRheXM7XG4gICAgICAgIGRhdGEubW9udGhzID0gbW9udGhzO1xuICAgICAgICBkYXRhLnllYXJzID0geWVhcnM7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c1RvTW9udGhzKGRheXMpIHtcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTQ2MDk3IGRheXMgKHRha2luZyBpbnRvIGFjY291bnQgbGVhcCB5ZWFyIHJ1bGVzKVxuICAgICAgICAvLyA0MDAgeWVhcnMgaGF2ZSAxMiBtb250aHMgPT09IDQ4MDBcbiAgICAgICAgcmV0dXJuIChkYXlzICogNDgwMCkgLyAxNDYwOTc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzVG9EYXlzKG1vbnRocykge1xuICAgICAgICAvLyB0aGUgcmV2ZXJzZSBvZiBkYXlzVG9Nb250aHNcbiAgICAgICAgcmV0dXJuIChtb250aHMgKiAxNDYwOTcpIC8gNDgwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcyh1bml0cykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXlzLFxuICAgICAgICAgICAgbW9udGhzLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21vbnRoJyB8fCB1bml0cyA9PT0gJ3F1YXJ0ZXInIHx8IHVuaXRzID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMgKyBkYXlzVG9Nb250aHMoZGF5cyk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzIC8gMztcbiAgICAgICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocyAvIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaGFuZGxlIG1pbGxpc2Vjb25kcyBzZXBhcmF0ZWx5IGJlY2F1c2Ugb2YgZmxvYXRpbmcgcG9pbnQgbWF0aCBlcnJvcnMgKGlzc3VlICMxODY3KVxuICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMgKyBNYXRoLnJvdW5kKG1vbnRoc1RvRGF5cyh0aGlzLl9tb250aHMpKTtcbiAgICAgICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheXMgLyA3ICsgbWlsbGlzZWNvbmRzIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzICogMjQgKyBtaWxsaXNlY29uZHMgLyAzNmU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzICogMTQ0MCArIG1pbGxpc2Vjb25kcyAvIDZlNDtcbiAgICAgICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDg2NDAwICsgbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICAgICAgICAgICAgICAvLyBNYXRoLmZsb29yIHByZXZlbnRzIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIGhlcmVcbiAgICAgICAgICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKGRheXMgKiA4NjRlNSkgKyBtaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgJyArIHVuaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VBcyhhbGlhcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXMoYWxpYXMpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBhc01pbGxpc2Vjb25kcyA9IG1ha2VBcygnbXMnKSxcbiAgICAgICAgYXNTZWNvbmRzID0gbWFrZUFzKCdzJyksXG4gICAgICAgIGFzTWludXRlcyA9IG1ha2VBcygnbScpLFxuICAgICAgICBhc0hvdXJzID0gbWFrZUFzKCdoJyksXG4gICAgICAgIGFzRGF5cyA9IG1ha2VBcygnZCcpLFxuICAgICAgICBhc1dlZWtzID0gbWFrZUFzKCd3JyksXG4gICAgICAgIGFzTW9udGhzID0gbWFrZUFzKCdNJyksXG4gICAgICAgIGFzUXVhcnRlcnMgPSBtYWtlQXMoJ1EnKSxcbiAgICAgICAgYXNZZWFycyA9IG1ha2VBcygneScpLFxuICAgICAgICB2YWx1ZU9mJDEgPSBhc01pbGxpc2Vjb25kcztcblxuICAgIGZ1bmN0aW9uIGNsb25lJDEoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQkMih1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpc1t1bml0cyArICdzJ10oKSA6IE5hTjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlR2V0dGVyKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2RhdGFbbmFtZV0gOiBOYU47XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG1pbGxpc2Vjb25kcyA9IG1ha2VHZXR0ZXIoJ21pbGxpc2Vjb25kcycpLFxuICAgICAgICBzZWNvbmRzID0gbWFrZUdldHRlcignc2Vjb25kcycpLFxuICAgICAgICBtaW51dGVzID0gbWFrZUdldHRlcignbWludXRlcycpLFxuICAgICAgICBob3VycyA9IG1ha2VHZXR0ZXIoJ2hvdXJzJyksXG4gICAgICAgIGRheXMgPSBtYWtlR2V0dGVyKCdkYXlzJyksXG4gICAgICAgIG1vbnRocyA9IG1ha2VHZXR0ZXIoJ21vbnRocycpLFxuICAgICAgICB5ZWFycyA9IG1ha2VHZXR0ZXIoJ3llYXJzJyk7XG5cbiAgICBmdW5jdGlvbiB3ZWVrcygpIHtcbiAgICAgICAgcmV0dXJuIGFic0Zsb29yKHRoaXMuZGF5cygpIC8gNyk7XG4gICAgfVxuXG4gICAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZCxcbiAgICAgICAgdGhyZXNob2xkcyA9IHtcbiAgICAgICAgICAgIHNzOiA0NCwgLy8gYSBmZXcgc2Vjb25kcyB0byBzZWNvbmRzXG4gICAgICAgICAgICBzOiA0NSwgLy8gc2Vjb25kcyB0byBtaW51dGVcbiAgICAgICAgICAgIG06IDQ1LCAvLyBtaW51dGVzIHRvIGhvdXJcbiAgICAgICAgICAgIGg6IDIyLCAvLyBob3VycyB0byBkYXlcbiAgICAgICAgICAgIGQ6IDI2LCAvLyBkYXlzIHRvIG1vbnRoL3dlZWtcbiAgICAgICAgICAgIHc6IG51bGwsIC8vIHdlZWtzIHRvIG1vbnRoXG4gICAgICAgICAgICBNOiAxMSwgLy8gbW9udGhzIHRvIHllYXJcbiAgICAgICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgbW9tZW50LmZuLmZyb20sIG1vbWVudC5mbi5mcm9tTm93LCBhbmQgbW9tZW50LmR1cmF0aW9uLmZuLmh1bWFuaXplXG4gICAgZnVuY3Rpb24gc3Vic3RpdHV0ZVRpbWVBZ28oc3RyaW5nLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGlzRnV0dXJlLCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5yZWxhdGl2ZVRpbWUobnVtYmVyIHx8IDEsICEhd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lJDEocG9zTmVnRHVyYXRpb24sIHdpdGhvdXRTdWZmaXgsIHRocmVzaG9sZHMsIGxvY2FsZSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBjcmVhdGVEdXJhdGlvbihwb3NOZWdEdXJhdGlvbikuYWJzKCksXG4gICAgICAgICAgICBzZWNvbmRzID0gcm91bmQoZHVyYXRpb24uYXMoJ3MnKSksXG4gICAgICAgICAgICBtaW51dGVzID0gcm91bmQoZHVyYXRpb24uYXMoJ20nKSksXG4gICAgICAgICAgICBob3VycyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdoJykpLFxuICAgICAgICAgICAgZGF5cyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdkJykpLFxuICAgICAgICAgICAgbW9udGhzID0gcm91bmQoZHVyYXRpb24uYXMoJ00nKSksXG4gICAgICAgICAgICB3ZWVrcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCd3JykpLFxuICAgICAgICAgICAgeWVhcnMgPSByb3VuZChkdXJhdGlvbi5hcygneScpKSxcbiAgICAgICAgICAgIGEgPVxuICAgICAgICAgICAgICAgIChzZWNvbmRzIDw9IHRocmVzaG9sZHMuc3MgJiYgWydzJywgc2Vjb25kc10pIHx8XG4gICAgICAgICAgICAgICAgKHNlY29uZHMgPCB0aHJlc2hvbGRzLnMgJiYgWydzcycsIHNlY29uZHNdKSB8fFxuICAgICAgICAgICAgICAgIChtaW51dGVzIDw9IDEgJiYgWydtJ10pIHx8XG4gICAgICAgICAgICAgICAgKG1pbnV0ZXMgPCB0aHJlc2hvbGRzLm0gJiYgWydtbScsIG1pbnV0ZXNdKSB8fFxuICAgICAgICAgICAgICAgIChob3VycyA8PSAxICYmIFsnaCddKSB8fFxuICAgICAgICAgICAgICAgIChob3VycyA8IHRocmVzaG9sZHMuaCAmJiBbJ2hoJywgaG91cnNdKSB8fFxuICAgICAgICAgICAgICAgIChkYXlzIDw9IDEgJiYgWydkJ10pIHx8XG4gICAgICAgICAgICAgICAgKGRheXMgPCB0aHJlc2hvbGRzLmQgJiYgWydkZCcsIGRheXNdKTtcblxuICAgICAgICBpZiAodGhyZXNob2xkcy53ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGEgPVxuICAgICAgICAgICAgICAgIGEgfHxcbiAgICAgICAgICAgICAgICAod2Vla3MgPD0gMSAmJiBbJ3cnXSkgfHxcbiAgICAgICAgICAgICAgICAod2Vla3MgPCB0aHJlc2hvbGRzLncgJiYgWyd3dycsIHdlZWtzXSk7XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGEgfHxcbiAgICAgICAgICAgIChtb250aHMgPD0gMSAmJiBbJ00nXSkgfHxcbiAgICAgICAgICAgIChtb250aHMgPCB0aHJlc2hvbGRzLk0gJiYgWydNTScsIG1vbnRoc10pIHx8XG4gICAgICAgICAgICAoeWVhcnMgPD0gMSAmJiBbJ3knXSkgfHwgWyd5eScsIHllYXJzXTtcblxuICAgICAgICBhWzJdID0gd2l0aG91dFN1ZmZpeDtcbiAgICAgICAgYVszXSA9ICtwb3NOZWdEdXJhdGlvbiA+IDA7XG4gICAgICAgIGFbNF0gPSBsb2NhbGU7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseShudWxsLCBhKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSByb3VuZGluZyBmdW5jdGlvbiBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmcocm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICBpZiAocm91bmRpbmdGdW5jdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByb3VuZGluZ0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByb3VuZCA9IHJvdW5kaW5nRnVuY3Rpb247XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCBhIHRocmVzaG9sZCBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkKHRocmVzaG9sZCwgbGltaXQpIHtcbiAgICAgICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJlc2hvbGRzW3RocmVzaG9sZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgICAgIGlmICh0aHJlc2hvbGQgPT09ICdzJykge1xuICAgICAgICAgICAgdGhyZXNob2xkcy5zcyA9IGxpbWl0IC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBodW1hbml6ZShhcmdXaXRoU3VmZml4LCBhcmdUaHJlc2hvbGRzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdpdGhTdWZmaXggPSBmYWxzZSxcbiAgICAgICAgICAgIHRoID0gdGhyZXNob2xkcyxcbiAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgIG91dHB1dDtcblxuICAgICAgICBpZiAodHlwZW9mIGFyZ1dpdGhTdWZmaXggPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBhcmdUaHJlc2hvbGRzID0gYXJnV2l0aFN1ZmZpeDtcbiAgICAgICAgICAgIGFyZ1dpdGhTdWZmaXggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFyZ1dpdGhTdWZmaXggPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgd2l0aFN1ZmZpeCA9IGFyZ1dpdGhTdWZmaXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdUaHJlc2hvbGRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGggPSBPYmplY3QuYXNzaWduKHt9LCB0aHJlc2hvbGRzLCBhcmdUaHJlc2hvbGRzKTtcbiAgICAgICAgICAgIGlmIChhcmdUaHJlc2hvbGRzLnMgIT0gbnVsbCAmJiBhcmdUaHJlc2hvbGRzLnNzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aC5zcyA9IGFyZ1RocmVzaG9sZHMucyAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbGUgPSB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgb3V0cHV0ID0gcmVsYXRpdmVUaW1lJDEodGhpcywgIXdpdGhTdWZmaXgsIHRoLCBsb2NhbGUpO1xuXG4gICAgICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBsb2NhbGUucGFzdEZ1dHVyZSgrdGhpcywgb3V0cHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbGUucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhYnMkMSA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gc2lnbih4KSB7XG4gICAgICAgIHJldHVybiAoeCA+IDApIC0gKHggPCAwKSB8fCAreDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0lTT1N0cmluZyQxKCkge1xuICAgICAgICAvLyBmb3IgSVNPIHN0cmluZ3Mgd2UgZG8gbm90IHVzZSB0aGUgbm9ybWFsIGJ1YmJsaW5nIHJ1bGVzOlxuICAgICAgICAvLyAgKiBtaWxsaXNlY29uZHMgYnViYmxlIHVwIHVudGlsIHRoZXkgYmVjb21lIGhvdXJzXG4gICAgICAgIC8vICAqIGRheXMgZG8gbm90IGJ1YmJsZSBhdCBhbGxcbiAgICAgICAgLy8gICogbW9udGhzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSB5ZWFyc1xuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgaXMgbm8gY29udGV4dC1mcmVlIGNvbnZlcnNpb24gYmV0d2VlbiBob3VycyBhbmQgZGF5c1xuICAgICAgICAvLyAodGhpbmsgb2YgY2xvY2sgY2hhbmdlcylcbiAgICAgICAgLy8gYW5kIGFsc28gbm90IGJldHdlZW4gZGF5cyBhbmQgbW9udGhzICgyOC0zMSBkYXlzIHBlciBtb250aClcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2Vjb25kcyA9IGFicyQxKHRoaXMuX21pbGxpc2Vjb25kcykgLyAxMDAwLFxuICAgICAgICAgICAgZGF5cyA9IGFicyQxKHRoaXMuX2RheXMpLFxuICAgICAgICAgICAgbW9udGhzID0gYWJzJDEodGhpcy5fbW9udGhzKSxcbiAgICAgICAgICAgIG1pbnV0ZXMsXG4gICAgICAgICAgICBob3VycyxcbiAgICAgICAgICAgIHllYXJzLFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIHRvdGFsID0gdGhpcy5hc1NlY29uZHMoKSxcbiAgICAgICAgICAgIHRvdGFsU2lnbixcbiAgICAgICAgICAgIHltU2lnbixcbiAgICAgICAgICAgIGRheXNTaWduLFxuICAgICAgICAgICAgaG1zU2lnbjtcblxuICAgICAgICBpZiAoIXRvdGFsKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBzYW1lIGFzIEMjJ3MgKE5vZGEpIGFuZCBweXRob24gKGlzb2RhdGUpLi4uXG4gICAgICAgICAgICAvLyBidXQgbm90IG90aGVyIEpTIChnb29nLmRhdGUpXG4gICAgICAgICAgICByZXR1cm4gJ1AwRCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzNjAwIHNlY29uZHMgLT4gNjAgbWludXRlcyAtPiAxIGhvdXJcbiAgICAgICAgbWludXRlcyA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGhvdXJzID0gYWJzRmxvb3IobWludXRlcyAvIDYwKTtcbiAgICAgICAgc2Vjb25kcyAlPSA2MDtcbiAgICAgICAgbWludXRlcyAlPSA2MDtcblxuICAgICAgICAvLyAxMiBtb250aHMgLT4gMSB5ZWFyXG4gICAgICAgIHllYXJzID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cbiAgICAgICAgLy8gaW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2RvcmRpbGxlL21vbWVudC1pc29kdXJhdGlvbi9ibG9iL21hc3Rlci9tb21lbnQuaXNvZHVyYXRpb24uanNcbiAgICAgICAgcyA9IHNlY29uZHMgPyBzZWNvbmRzLnRvRml4ZWQoMykucmVwbGFjZSgvXFwuPzArJC8sICcnKSA6ICcnO1xuXG4gICAgICAgIHRvdGFsU2lnbiA9IHRvdGFsIDwgMCA/ICctJyA6ICcnO1xuICAgICAgICB5bVNpZ24gPSBzaWduKHRoaXMuX21vbnRocykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIGRheXNTaWduID0gc2lnbih0aGlzLl9kYXlzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcbiAgICAgICAgaG1zU2lnbiA9IHNpZ24odGhpcy5fbWlsbGlzZWNvbmRzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdG90YWxTaWduICtcbiAgICAgICAgICAgICdQJyArXG4gICAgICAgICAgICAoeWVhcnMgPyB5bVNpZ24gKyB5ZWFycyArICdZJyA6ICcnKSArXG4gICAgICAgICAgICAobW9udGhzID8geW1TaWduICsgbW9udGhzICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChkYXlzID8gZGF5c1NpZ24gKyBkYXlzICsgJ0QnIDogJycpICtcbiAgICAgICAgICAgIChob3VycyB8fCBtaW51dGVzIHx8IHNlY29uZHMgPyAnVCcgOiAnJykgK1xuICAgICAgICAgICAgKGhvdXJzID8gaG1zU2lnbiArIGhvdXJzICsgJ0gnIDogJycpICtcbiAgICAgICAgICAgIChtaW51dGVzID8gaG1zU2lnbiArIG1pbnV0ZXMgKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKHNlY29uZHMgPyBobXNTaWduICsgcyArICdTJyA6ICcnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBwcm90byQyID0gRHVyYXRpb24ucHJvdG90eXBlO1xuXG4gICAgcHJvdG8kMi5pc1ZhbGlkID0gaXNWYWxpZCQxO1xuICAgIHByb3RvJDIuYWJzID0gYWJzO1xuICAgIHByb3RvJDIuYWRkID0gYWRkJDE7XG4gICAgcHJvdG8kMi5zdWJ0cmFjdCA9IHN1YnRyYWN0JDE7XG4gICAgcHJvdG8kMi5hcyA9IGFzO1xuICAgIHByb3RvJDIuYXNNaWxsaXNlY29uZHMgPSBhc01pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLmFzU2Vjb25kcyA9IGFzU2Vjb25kcztcbiAgICBwcm90byQyLmFzTWludXRlcyA9IGFzTWludXRlcztcbiAgICBwcm90byQyLmFzSG91cnMgPSBhc0hvdXJzO1xuICAgIHByb3RvJDIuYXNEYXlzID0gYXNEYXlzO1xuICAgIHByb3RvJDIuYXNXZWVrcyA9IGFzV2Vla3M7XG4gICAgcHJvdG8kMi5hc01vbnRocyA9IGFzTW9udGhzO1xuICAgIHByb3RvJDIuYXNRdWFydGVycyA9IGFzUXVhcnRlcnM7XG4gICAgcHJvdG8kMi5hc1llYXJzID0gYXNZZWFycztcbiAgICBwcm90byQyLnZhbHVlT2YgPSB2YWx1ZU9mJDE7XG4gICAgcHJvdG8kMi5fYnViYmxlID0gYnViYmxlO1xuICAgIHByb3RvJDIuY2xvbmUgPSBjbG9uZSQxO1xuICAgIHByb3RvJDIuZ2V0ID0gZ2V0JDI7XG4gICAgcHJvdG8kMi5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5zZWNvbmRzID0gc2Vjb25kcztcbiAgICBwcm90byQyLm1pbnV0ZXMgPSBtaW51dGVzO1xuICAgIHByb3RvJDIuaG91cnMgPSBob3VycztcbiAgICBwcm90byQyLmRheXMgPSBkYXlzO1xuICAgIHByb3RvJDIud2Vla3MgPSB3ZWVrcztcbiAgICBwcm90byQyLm1vbnRocyA9IG1vbnRocztcbiAgICBwcm90byQyLnllYXJzID0geWVhcnM7XG4gICAgcHJvdG8kMi5odW1hbml6ZSA9IGh1bWFuaXplO1xuICAgIHByb3RvJDIudG9JU09TdHJpbmcgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9TdHJpbmcgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9KU09OID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLmxvY2FsZSA9IGxvY2FsZTtcbiAgICBwcm90byQyLmxvY2FsZURhdGEgPSBsb2NhbGVEYXRhO1xuXG4gICAgcHJvdG8kMi50b0lzb1N0cmluZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ3RvSXNvU3RyaW5nKCkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0b0lTT1N0cmluZygpIGluc3RlYWQgKG5vdGljZSB0aGUgY2FwaXRhbHMpJyxcbiAgICAgICAgdG9JU09TdHJpbmckMVxuICAgICk7XG4gICAgcHJvdG8kMi5sYW5nID0gbGFuZztcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdYJywgMCwgMCwgJ3VuaXgnKTtcbiAgICBhZGRGb3JtYXRUb2tlbigneCcsIDAsIDAsICd2YWx1ZU9mJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd4JywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1gnLCBtYXRjaFRpbWVzdGFtcCk7XG4gICAgYWRkUGFyc2VUb2tlbignWCcsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShwYXJzZUZsb2F0KGlucHV0KSAqIDEwMDApO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ3gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUodG9JbnQoaW5wdXQpKTtcbiAgICB9KTtcblxuICAgIC8vISBtb21lbnQuanNcblxuICAgIGhvb2tzLnZlcnNpb24gPSAnMi4zMC4xJztcblxuICAgIHNldEhvb2tDYWxsYmFjayhjcmVhdGVMb2NhbCk7XG5cbiAgICBob29rcy5mbiA9IHByb3RvO1xuICAgIGhvb2tzLm1pbiA9IG1pbjtcbiAgICBob29rcy5tYXggPSBtYXg7XG4gICAgaG9va3Mubm93ID0gbm93O1xuICAgIGhvb2tzLnV0YyA9IGNyZWF0ZVVUQztcbiAgICBob29rcy51bml4ID0gY3JlYXRlVW5peDtcbiAgICBob29rcy5tb250aHMgPSBsaXN0TW9udGhzO1xuICAgIGhvb2tzLmlzRGF0ZSA9IGlzRGF0ZTtcbiAgICBob29rcy5sb2NhbGUgPSBnZXRTZXRHbG9iYWxMb2NhbGU7XG4gICAgaG9va3MuaW52YWxpZCA9IGNyZWF0ZUludmFsaWQ7XG4gICAgaG9va3MuZHVyYXRpb24gPSBjcmVhdGVEdXJhdGlvbjtcbiAgICBob29rcy5pc01vbWVudCA9IGlzTW9tZW50O1xuICAgIGhvb2tzLndlZWtkYXlzID0gbGlzdFdlZWtkYXlzO1xuICAgIGhvb2tzLnBhcnNlWm9uZSA9IGNyZWF0ZUluWm9uZTtcbiAgICBob29rcy5sb2NhbGVEYXRhID0gZ2V0TG9jYWxlO1xuICAgIGhvb2tzLmlzRHVyYXRpb24gPSBpc0R1cmF0aW9uO1xuICAgIGhvb2tzLm1vbnRoc1Nob3J0ID0gbGlzdE1vbnRoc1Nob3J0O1xuICAgIGhvb2tzLndlZWtkYXlzTWluID0gbGlzdFdlZWtkYXlzTWluO1xuICAgIGhvb2tzLmRlZmluZUxvY2FsZSA9IGRlZmluZUxvY2FsZTtcbiAgICBob29rcy51cGRhdGVMb2NhbGUgPSB1cGRhdGVMb2NhbGU7XG4gICAgaG9va3MubG9jYWxlcyA9IGxpc3RMb2NhbGVzO1xuICAgIGhvb2tzLndlZWtkYXlzU2hvcnQgPSBsaXN0V2Vla2RheXNTaG9ydDtcbiAgICBob29rcy5ub3JtYWxpemVVbml0cyA9IG5vcm1hbGl6ZVVuaXRzO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVJvdW5kaW5nID0gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmc7XG4gICAgaG9va3MucmVsYXRpdmVUaW1lVGhyZXNob2xkID0gZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkO1xuICAgIGhvb2tzLmNhbGVuZGFyRm9ybWF0ID0gZ2V0Q2FsZW5kYXJGb3JtYXQ7XG4gICAgaG9va3MucHJvdG90eXBlID0gcHJvdG87XG5cbiAgICAvLyBjdXJyZW50bHkgSFRNTDUgaW5wdXQgdHlwZSBvbmx5IHN1cHBvcnRzIDI0LWhvdXIgZm9ybWF0c1xuICAgIGhvb2tzLkhUTUw1X0ZNVCA9IHtcbiAgICAgICAgREFURVRJTUVfTE9DQUw6ICdZWVlZLU1NLUREVEhIOm1tJywgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIC8+XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMX1NFQ09ORFM6ICdZWVlZLU1NLUREVEhIOm1tOnNzJywgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfTVM6ICdZWVlZLU1NLUREVEhIOm1tOnNzLlNTUycsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdGVwPVwiMC4wMDFcIiAvPlxuICAgICAgICBEQVRFOiAnWVlZWS1NTS1ERCcsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIC8+XG4gICAgICAgIFRJTUU6ICdISDptbScsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIC8+XG4gICAgICAgIFRJTUVfU0VDT05EUzogJ0hIOm1tOnNzJywgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICBUSU1FX01TOiAnSEg6bW06c3MuU1NTJywgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgV0VFSzogJ0dHR0ctW1ddV1cnLCAvLyA8aW5wdXQgdHlwZT1cIndlZWtcIiAvPlxuICAgICAgICBNT05USDogJ1lZWVktTU0nLCAvLyA8aW5wdXQgdHlwZT1cIm1vbnRoXCIgLz5cbiAgICB9O1xuXG4gICAgcmV0dXJuIGhvb2tzO1xuXG59KSkpO1xuIiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIi8vIFRvcCBsZXZlbCBmaWxlIGlzIGp1c3QgYSBtaXhpbiBvZiBzdWJtb2R1bGVzICYgY29uc3RhbnRzXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gICAgPSByZXF1aXJlKCcuL2xpYi91dGlscy9jb21tb24nKS5hc3NpZ247XG5cbnZhciBkZWZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9kZWZsYXRlJyk7XG52YXIgaW5mbGF0ZSAgID0gcmVxdWlyZSgnLi9saWIvaW5mbGF0ZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vbGliL3psaWIvY29uc3RhbnRzJyk7XG5cbnZhciBwYWtvID0ge307XG5cbmFzc2lnbihwYWtvLCBkZWZsYXRlLCBpbmZsYXRlLCBjb25zdGFudHMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBha287XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfZGVmbGF0ZSA9IHJlcXVpcmUoJy4vemxpYi9kZWZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gcmVxdWlyZSgnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcblxudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbnZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuXG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cbnZhciBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwO1xuXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qKlxuICogY2xhc3MgRGVmbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2RlZmxhdGVdXSxcbiAqIFtbZGVmbGF0ZVJhd11dIGFuZCBbW2d6aXBdXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIERlZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0RlZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRkZW4uXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5yZXN1bHQgLT4gVWludDhBcnJheXxBcnJheVxuICpcbiAqIENvbXByZXNzZWQgcmVzdWx0LCBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBbW0RlZmxhdGUjb25EYXRhXV1cbiAqIGFuZCBbW0RlZmxhdGUjb25FbmRdXSBoYW5kbGVycy4gRmlsbGVkIGFmdGVyIHlvdSBwdXNoIGxhc3QgY2h1bmtcbiAqIChjYWxsIFtbRGVmbGF0ZSNwdXNoXV0gd2l0aCBgWl9GSU5JU0hgIC8gYHRydWVgIHBhcmFtKSAgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGRlZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBZb3Ugd2lsbCBub3QgbmVlZCBpdCBpbiByZWFsIGxpZmUsIGJlY2F1c2UgZGVmbGF0ZSBlcnJvcnNcbiAqIGFyZSBwb3NzaWJsZSBvbmx5IG9uIHdyb25nIG9wdGlvbnMgb3IgYmFkIGBvbkRhdGFgIC8gYG9uRW5kYFxuICogY3VzdG9tIGhhbmRsZXJzLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUubXNnIC0+IFN0cmluZ1xuICpcbiAqIEVycm9yIG1lc3NhZ2UsIGlmIFtbRGVmbGF0ZS5lcnJdXSAhPSAwXG4gKiovXG5cblxuLyoqXG4gKiBuZXcgRGVmbGF0ZShvcHRpb25zKVxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBDcmVhdGVzIG5ldyBkZWZsYXRvciBpbnN0YW5jZSB3aXRoIHNwZWNpZmllZCBwYXJhbXMuIFRocm93cyBleGNlcHRpb25cbiAqIG9uIGJhZCBwYXJhbXMuIFN1cHBvcnRlZCBvcHRpb25zOlxuICpcbiAqIC0gYGxldmVsYFxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYG1lbUxldmVsYFxuICogLSBgc3RyYXRlZ3lgXG4gKiAtIGBkaWN0aW9uYXJ5YFxuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlLlxuICpcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucywgZm9yIGludGVybmFsIG5lZWRzOlxuICpcbiAqIC0gYGNodW5rU2l6ZWAgLSBzaXplIG9mIGdlbmVyYXRlZCBkYXRhIGNodW5rcyAoMTZLIGJ5IGRlZmF1bHQpXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIGRvIHJhdyBkZWZsYXRlXG4gKiAtIGBnemlwYCAoQm9vbGVhbikgLSBjcmVhdGUgZ3ppcCB3cmFwcGVyXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICogLSBgaGVhZGVyYCAoT2JqZWN0KSAtIGN1c3RvbSBoZWFkZXIgZm9yIGd6aXBcbiAqICAgLSBgdGV4dGAgKEJvb2xlYW4pIC0gdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dFxuICogICAtIGB0aW1lYCAoTnVtYmVyKSAtIG1vZGlmaWNhdGlvbiB0aW1lLCB1bml4IHRpbWVzdGFtcFxuICogICAtIGBvc2AgKE51bWJlcikgLSBvcGVyYXRpb24gc3lzdGVtIGNvZGVcbiAqICAgLSBgZXh0cmFgIChBcnJheSkgLSBhcnJheSBvZiBieXRlcyB3aXRoIGV4dHJhIGRhdGEgKG1heCA2NTUzNilcbiAqICAgLSBgbmFtZWAgKFN0cmluZykgLSBmaWxlIG5hbWUgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGNvbW1lbnRgIChTdHJpbmcpIC0gY29tbWVudCAoYmluYXJ5IHN0cmluZylcbiAqICAgLSBgaGNyY2AgKEJvb2xlYW4pIC0gdHJ1ZSBpZiBoZWFkZXIgY3JjIHNob3VsZCBiZSBhZGRlZFxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgZGVmbGF0ZSA9IG5ldyBwYWtvLkRlZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGRlZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGRlZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGRlZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihkZWZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhkZWZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIERlZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRGVmbGF0ZSkpIHJldHVybiBuZXcgRGVmbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGxldmVsOiBaX0RFRkFVTFRfQ09NUFJFU1NJT04sXG4gICAgbWV0aG9kOiBaX0RFRkxBVEVELFxuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMTUsXG4gICAgbWVtTGV2ZWw6IDgsXG4gICAgc3RyYXRlZ3k6IFpfREVGQVVMVF9TVFJBVEVHWSxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICBpZiAob3B0LnJhdyAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAob3B0Lmd6aXAgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkgJiYgKG9wdC53aW5kb3dCaXRzIDwgMTYpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMTY7XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gPSBuZXcgWlN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LmxldmVsLFxuICAgIG9wdC5tZXRob2QsXG4gICAgb3B0LndpbmRvd0JpdHMsXG4gICAgb3B0Lm1lbUxldmVsLFxuICAgIG9wdC5zdHJhdGVneVxuICApO1xuXG4gIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgaWYgKG9wdC5oZWFkZXIpIHtcbiAgICB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sIG9wdC5oZWFkZXIpO1xuICB9XG5cbiAgaWYgKG9wdC5kaWN0aW9uYXJ5KSB7XG4gICAgdmFyIGRpY3Q7XG4gICAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2Ygb3B0LmRpY3Rpb25hcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgICAgZGljdCA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKG9wdC5kaWN0aW9uYXJ5KSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgICAgZGljdCA9IG5ldyBVaW50OEFycmF5KG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGljdCA9IG9wdC5kaWN0aW9uYXJ5O1xuICAgIH1cblxuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3QpO1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gWl9PSykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kaWN0X3NldCA9IHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YS4gU3RyaW5ncyB3aWxsIGJlXG4gKiAgIGNvbnZlcnRlZCB0byB1dGY4IGJ5dGUgc2VxdWVuY2UuXG4gKiAtIG1vZGUgKE51bWJlcnxCb29sZWFuKTogMC4uNiBmb3IgY29ycmVzcG9uZGluZyBaX05PX0ZMVVNILi5aX1RSRUUgbW9kZXMuXG4gKiAgIFNlZSBjb25zdGFudHMuIFNraXBwZWQgb3IgYGZhbHNlYCBtZWFucyBaX05PX0ZMVVNILCBgdHJ1ZWAgbWVhbnMgWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBkZWZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tEZWZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBjb21wcmVzc2VkIGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbRGVmbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbRGVmbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGFycmF5IGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZShzdHJtLCBfbW9kZSk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgIT09IFpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBaX0ZJTklTSCB8fCBfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMub25EYXRhKHN0cmluZ3MuYnVmMmJpbnN0cmluZyh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQpO1xuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IFpfRklOSVNIKSB7XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChaX09LKTtcbiAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXRwdXQgZGF0YS4gVHlwZSBvZiBhcnJheSBkZXBlbmRzXG4gKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rXG4gKiAgIHdpbGwgYmUgc3RyaW5nLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIERlZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogZGVmbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgb25jZSBhZnRlciB5b3UgdGVsbCBkZWZsYXRlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpc1xuICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKVxuICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBjaHVua3MsXG4gKiBmcmVlIG1lbW9yeSBhbmQgZmlsbCBgcmVzdWx0c2AgLyBgZXJyYCBwcm9wZXJ0aWVzLlxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IFpfT0spIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBkZWZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBDb21wcmVzcyBgZGF0YWAgd2l0aCBkZWZsYXRlIGFsZ29yaXRobSBhbmQgYG9wdGlvbnNgLlxuICpcbiAqIFN1cHBvcnRlZCBvcHRpb25zIGFyZTpcbiAqXG4gKiAtIGxldmVsXG4gKiAtIHdpbmRvd0JpdHNcbiAqIC0gbWVtTGV2ZWxcbiAqIC0gc3RyYXRlZ3lcbiAqIC0gZGljdGlvbmFyeVxuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIFwiYmluYXJ5IHN0cmluZ1wiXG4gKiAgICAoZWFjaCBjaGFyIGNvZGUgWzAuLjI1NV0pXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGRhdGEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBha28uZGVmbGF0ZShkYXRhKSk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGRlZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGRlZmxhdG9yID0gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgZGVmbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGRlZmxhdG9yLmVycikgeyB0aHJvdyBkZWZsYXRvci5tc2cgfHwgbXNnW2RlZmxhdG9yLmVycl07IH1cblxuICByZXR1cm4gZGVmbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogZGVmbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tkZWZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGRlZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGRlZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogZ3ppcChkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tkZWZsYXRlXV0sIGJ1dCBjcmVhdGUgZ3ppcCB3cmFwcGVyIGluc3RlYWQgb2ZcbiAqIGRlZmxhdGUgb25lLlxuICoqL1xuZnVuY3Rpb24gZ3ppcChpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5nemlwID0gdHJ1ZTtcbiAgcmV0dXJuIGRlZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbmV4cG9ydHMuRGVmbGF0ZSA9IERlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGUgPSBkZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlUmF3ID0gZGVmbGF0ZVJhdztcbmV4cG9ydHMuZ3ppcCA9IGd6aXA7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfaW5mbGF0ZSA9IHJlcXVpcmUoJy4vemxpYi9pbmZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gcmVxdWlyZSgnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBjICAgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvY29uc3RhbnRzJyk7XG52YXIgbXNnICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL21lc3NhZ2VzJyk7XG52YXIgWlN0cmVhbSAgICAgID0gcmVxdWlyZSgnLi96bGliL3pzdHJlYW0nKTtcbnZhciBHWmhlYWRlciAgICAgPSByZXF1aXJlKCcuL3psaWIvZ3poZWFkZXInKTtcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBjbGFzcyBJbmZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbaW5mbGF0ZV1dXG4gKiBhbmQgW1tpbmZsYXRlUmF3XV0uXG4gKiovXG5cbi8qIGludGVybmFsXG4gKiBpbmZsYXRlLmNodW5rcyAtPiBBcnJheVxuICpcbiAqIENodW5rcyBvZiBvdXRwdXQgZGF0YSwgaWYgW1tJbmZsYXRlI29uRGF0YV1dIG5vdCBvdmVycmlkZGVuLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKlxuICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tJbmZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGluZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBTaG91bGQgYmUgY2hlY2tlZCBpZiBicm9rZW4gZGF0YSBwb3NzaWJsZS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0luZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IEluZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgaW5mbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgaW5mbGF0ZVxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB3aGVuIG5vIG9wdGlvbnMgc2V0LCBhdXRvZGV0ZWN0IGRlZmxhdGUvZ3ppcCBkYXRhIGZvcm1hdCB2aWFcbiAqIHdyYXBwZXIgaGVhZGVyLlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgaW5mbGF0ZSA9IG5ldyBwYWtvLkluZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGluZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGluZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGluZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihpbmZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhpbmZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIEluZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpIHJldHVybiBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMCxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICAvLyBGb3JjZSB3aW5kb3cgc2l6ZSBmb3IgYHJhd2AgZGF0YSwgaWYgbm90IHNldCBkaXJlY3RseSxcbiAgLy8gYmVjYXVzZSB3ZSBoYXZlIG5vIGhlYWRlciBmb3IgYXV0b2RldGVjdC5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICAgIGlmIChvcHQud2luZG93Qml0cyA9PT0gMCkgeyBvcHQud2luZG93Qml0cyA9IC0xNTsgfVxuICB9XG5cbiAgLy8gSWYgYHdpbmRvd0JpdHNgIG5vdCBkZWZpbmVkIChhbmQgbW9kZSBub3QgcmF3KSAtIHNldCBhdXRvZGV0ZWN0IGZsYWcgZm9yIGd6aXAvZGVmbGF0ZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSAmJlxuICAgICAgIShvcHRpb25zICYmIG9wdGlvbnMud2luZG93Qml0cykpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIC8vIEd6aXAgaGVhZGVyIGhhcyBubyBpbmZvIGFib3V0IHdpbmRvd3Mgc2l6ZSwgd2UgY2FuIGRvIGF1dG9kZXRlY3Qgb25seVxuICAvLyBmb3IgZGVmbGF0ZS4gU28sIGlmIHdpbmRvdyBzaXplIG5vdCBzZXQsIGZvcmNlIGl0IHRvIG1heCB3aGVuIGd6aXAgcG9zc2libGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+IDE1KSAmJiAob3B0LndpbmRvd0JpdHMgPCA0OCkpIHtcbiAgICAvLyBiaXQgMyAoMTYpIC0+IGd6aXBwZWQgZGF0YVxuICAgIC8vIGJpdCA0ICgzMikgLT4gYXV0b2RldGVjdCBnemlwL2RlZmxhdGVcbiAgICBpZiAoKG9wdC53aW5kb3dCaXRzICYgMTUpID09PSAwKSB7XG4gICAgICBvcHQud2luZG93Qml0cyB8PSAxNTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gICA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgID0gemxpYl9pbmZsYXRlLmluZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LndpbmRvd0JpdHNcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTtcblxuICB6bGliX2luZmxhdGUuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sIHRoaXMuaGVhZGVyKTtcblxuICAvLyBTZXR1cCBkaWN0aW9uYXJ5XG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0LmRpY3Rpb25hcnkgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIG9wdC5kaWN0aW9uYXJ5ID0gbmV3IFVpbnQ4QXJyYXkob3B0LmRpY3Rpb25hcnkpO1xuICAgIH1cbiAgICBpZiAob3B0LnJhdykgeyAvL0luIHJhdyBtb2RlIHdlIG5lZWQgdG8gc2V0IHRoZSBkaWN0aW9uYXJ5IGVhcmx5XG4gICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBvcHQuZGljdGlvbmFyeSk7XG4gICAgICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbmZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YVxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zIFpfRklOSVNILlxuICpcbiAqIFNlbmRzIGlucHV0IGRhdGEgdG8gaW5mbGF0ZSBwaXBlLCBnZW5lcmF0aW5nIFtbSW5mbGF0ZSNvbkRhdGFdXSBjYWxscyB3aXRoXG4gKiBuZXcgb3V0cHV0IGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbSW5mbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGRlY29tcHJlc3Npb24gY29udGV4dC5cbiAqXG4gKiBPbiBmYWlsIGNhbGwgW1tJbmZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBgVWludDhBcnJheWAgb24gaW5wdXQgZm9yIGJlc3Qgc3BlZWQgKG91dHB1dFxuICogZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5c1xuICogdXNlIHRoZSBzYW1lIHR5cGUgaW4geW91ciBjb2RlIChib29sZWFuIG9yIG51bWJlcikuIFRoYXQgd2lsbCBpbXByb3ZlIEpTIHNwZWVkLlxuICpcbiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIG1vZGUpIHtcbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICB2YXIgZGljdGlvbmFyeSA9IHRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5O1xuICB2YXIgc3RhdHVzLCBfbW9kZTtcbiAgdmFyIG5leHRfb3V0X3V0ZjgsIHRhaWwsIHV0ZjhzdHI7XG5cbiAgLy8gRmxhZyB0byBwcm9wZXJseSBwcm9jZXNzIFpfQlVGX0VSUk9SIG9uIHRlc3RpbmcgaW5mbGF0ZSBjYWxsXG4gIC8vIHdoZW4gd2UgY2hlY2sgdGhhdCBhbGwgb3V0cHV0IGRhdGEgd2FzIGZsdXNoZWQuXG4gIHZhciBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IGMuWl9GSU5JU0ggOiBjLlpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIE9ubHkgYmluYXJ5IHN0cmluZ3MgY2FuIGJlIGRlY29tcHJlc3NlZCBvbiBwcmFjdGljZVxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLmJpbnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cblxuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHN0cm0sIGMuWl9OT19GTFVTSCk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9ORUVEX0RJQ1QgJiYgZGljdGlvbmFyeSkge1xuICAgICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdGlvbmFyeSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX0JVRl9FUlJPUiAmJiBhbGxvd0J1ZkVycm9yID09PSB0cnVlKSB7XG4gICAgICBzdGF0dXMgPSBjLlpfT0s7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHJtLm5leHRfb3V0KSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IGMuWl9GSU5JU0ggfHwgX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSkpIHtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuXG4gICAgICAgICAgbmV4dF9vdXRfdXRmOCA9IHN0cmluZ3MudXRmOGJvcmRlcihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCk7XG5cbiAgICAgICAgICB0YWlsID0gc3RybS5uZXh0X291dCAtIG5leHRfb3V0X3V0Zjg7XG4gICAgICAgICAgdXRmOHN0ciA9IHN0cmluZ3MuYnVmMnN0cmluZyhzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCk7XG5cbiAgICAgICAgICAvLyBtb3ZlIHRhaWxcbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZSAtIHRhaWw7XG4gICAgICAgICAgaWYgKHRhaWwpIHsgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4LCB0YWlsLCAwKTsgfVxuXG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRmOHN0cik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoZW4gbm8gbW9yZSBpbnB1dCBkYXRhLCB3ZSBzaG91bGQgY2hlY2sgdGhhdCBpbnRlcm5hbCBpbmZsYXRlIGJ1ZmZlcnNcbiAgICAvLyBhcmUgZmx1c2hlZC4gVGhlIG9ubHkgd2F5IHRvIGRvIGl0IHdoZW4gYXZhaWxfb3V0ID0gMCAtIHJ1biBvbmUgbW9yZVxuICAgIC8vIGluZmxhdGUgcGFzcy4gQnV0IGlmIG91dHB1dCBkYXRhIG5vdCBleGlzdHMsIGluZmxhdGUgcmV0dXJuIFpfQlVGX0VSUk9SLlxuICAgIC8vIEhlcmUgd2Ugc2V0IGZsYWcgdG8gcHJvY2VzcyB0aGlzIGVycm9yIHByb3Blcmx5LlxuICAgIC8vXG4gICAgLy8gTk9URS4gRGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkcyBzdWNoXG4gICAgLy8gbG9naWMuXG4gICAgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIGFsbG93QnVmRXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQpO1xuXG4gIGlmIChzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EKSB7XG4gICAgX21vZGUgPSBjLlpfRklOSVNIO1xuICB9XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IGMuWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKGMuWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogSW5mbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3V0cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGluZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIGVpdGhlciBhZnRlciB5b3UgdGVsbCBpbmZsYXRlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpc1xuICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKVxuICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBjaHVua3MsXG4gKiBmcmVlIG1lbW9yeSBhbmQgZmlsbCBgcmVzdWx0c2AgLyBgZXJyYCBwcm9wZXJ0aWVzLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IGMuWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBHbHVlICYgY29udmVydCBoZXJlLCB1bnRpbCB3ZSB0ZWFjaCBwYWtvIHRvIHNlbmRcbiAgICAgIC8vIHV0ZjggYWxpZ25lZCBzdHJpbmdzIHRvIG9uRGF0YVxuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBpbmZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIERlY29tcHJlc3MgYGRhdGFgIHdpdGggaW5mbGF0ZS91bmd6aXAgYW5kIGBvcHRpb25zYC4gQXV0b2RldGVjdFxuICogZm9ybWF0IHZpYSB3cmFwcGVyIGhlYWRlciBieSBkZWZhdWx0LiBUaGF0J3Mgd2h5IHdlIGRvbid0IHByb3ZpZGVcbiAqIHNlcGFyYXRlIGB1bmd6aXBgIG1ldGhvZC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSB3aW5kb3dCaXRzXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGlucHV0ID0gcGFrby5kZWZsYXRlKFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgb3V0cHV0O1xuICpcbiAqIHRyeSB7XG4gKiAgIG91dHB1dCA9IHBha28uaW5mbGF0ZShpbnB1dCk7XG4gKiB9IGNhdGNoIChlcnIpXG4gKiAgIGNvbnNvbGUubG9nKGVycik7XG4gKiB9XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGluZmxhdG9yID0gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgaW5mbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGluZmxhdG9yLmVycikgeyB0aHJvdyBpbmZsYXRvci5tc2cgfHwgbXNnW2luZmxhdG9yLmVycl07IH1cblxuICByZXR1cm4gaW5mbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogaW5mbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2luZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gaW5mbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiB1bmd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogSnVzdCBzaG9ydGN1dCB0byBbW2luZmxhdGVdXSwgYmVjYXVzZSBpdCBhdXRvZGV0ZWN0cyBmb3JtYXRcbiAqIGJ5IGhlYWRlci5jb250ZW50LiBEb25lIGZvciBjb252ZW5pZW5jZS5cbiAqKi9cblxuXG5leHBvcnRzLkluZmxhdGUgPSBJbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZVJhdyA9IGluZmxhdGVSYXc7XG5leHBvcnRzLnVuZ3ppcCAgPSBpbmZsYXRlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBUWVBFRF9PSyA9ICAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgVWludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG5mdW5jdGlvbiBfaGFzKG9iaiwga2V5KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xufVxuXG5leHBvcnRzLmFzc2lnbiA9IGZ1bmN0aW9uIChvYmogLypmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4qLykge1xuICB2YXIgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHdoaWxlIChzb3VyY2VzLmxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG4gICAgaWYgKCFzb3VyY2UpIHsgY29udGludWU7IH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzb3VyY2UgKyAnbXVzdCBiZSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChfaGFzKHNvdXJjZSwgcCkpIHtcbiAgICAgICAgb2JqW3BdID0gc291cmNlW3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG5cbi8vIHJlZHVjZSBidWZmZXIgc2l6ZSwgYXZvaWRpbmcgbWVtIGNvcHlcbmV4cG9ydHMuc2hyaW5rQnVmID0gZnVuY3Rpb24gKGJ1Ziwgc2l6ZSkge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gc2l6ZSkgeyByZXR1cm4gYnVmOyB9XG4gIGlmIChidWYuc3ViYXJyYXkpIHsgcmV0dXJuIGJ1Zi5zdWJhcnJheSgwLCBzaXplKTsgfVxuICBidWYubGVuZ3RoID0gc2l6ZTtcbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxudmFyIGZuVHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBpZiAoc3JjLnN1YmFycmF5ICYmIGRlc3Quc3ViYXJyYXkpIHtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNfb2Zmcywgc3JjX29mZnMgKyBsZW4pLCBkZXN0X29mZnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBvcmRpbmFyeSBhcnJheVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHZhciBpLCBsLCBsZW4sIHBvcywgY2h1bmssIHJlc3VsdDtcblxuICAgIC8vIGNhbGN1bGF0ZSBkYXRhIGxlbmd0aFxuICAgIGxlbiA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGxlbiArPSBjaHVua3NbaV0ubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIGpvaW4gY2h1bmtzXG4gICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBwb3MgPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7XG4gICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBmblVudHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBjaHVua3MpO1xuICB9XG59O1xuXG5cbi8vIEVuYWJsZS9EaXNhYmxlIHR5cGVkIGFycmF5cyB1c2UsIGZvciB0ZXN0aW5nXG4vL1xuZXhwb3J0cy5zZXRUeXBlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24pIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gVWludDhBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gVWludDE2QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEludDMyQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5UeXBlZCk7XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5VbnR5cGVkKTtcbiAgfVxufTtcblxuZXhwb3J0cy5zZXRUeXBlZChUWVBFRF9PSyk7XG4iLCIvLyBTdHJpbmcgZW5jb2RlL2RlY29kZSBoZWxwZXJzXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG4vLyBRdWljayBjaGVjayBpZiB3ZSBjYW4gdXNlIGZhc3QgYXJyYXkgdG8gYmluIHN0cmluZyBjb252ZXJzaW9uXG4vL1xuLy8gLSBhcHBseShBcnJheSkgY2FuIGZhaWwgb24gQW5kcm9pZCAyLjJcbi8vIC0gYXBwbHkoVWludDhBcnJheSkgY2FuIGZhaWwgb24gaU9TIDUuMSBTYWZhcmlcbi8vXG52YXIgU1RSX0FQUExZX09LID0gdHJ1ZTtcbnZhciBTVFJfQVBQTFlfVUlBX09LID0gdHJ1ZTtcblxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBbIDAgXSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9PSyA9IGZhbHNlOyB9XG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX1VJQV9PSyA9IGZhbHNlOyB9XG5cblxuLy8gVGFibGUgd2l0aCB1dGY4IGxlbmd0aHMgKGNhbGN1bGF0ZWQgYnkgZmlyc3QgYnl0ZSBvZiBzZXF1ZW5jZSlcbi8vIE5vdGUsIHRoYXQgNSAmIDYtYnl0ZSB2YWx1ZXMgYW5kIHNvbWUgNC1ieXRlIHZhbHVlcyBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGluIEpTLFxuLy8gYmVjYXVzZSBtYXggcG9zc2libGUgY29kZXBvaW50IGlzIDB4MTBmZmZmXG52YXIgX3V0ZjhsZW4gPSBuZXcgdXRpbHMuQnVmOCgyNTYpO1xuZm9yICh2YXIgcSA9IDA7IHEgPCAyNTY7IHErKykge1xuICBfdXRmOGxlbltxXSA9IChxID49IDI1MiA/IDYgOiBxID49IDI0OCA/IDUgOiBxID49IDI0MCA/IDQgOiBxID49IDIyNCA/IDMgOiBxID49IDE5MiA/IDIgOiAxKTtcbn1cbl91dGY4bGVuWzI1NF0gPSBfdXRmOGxlblsyNTRdID0gMTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG5cbi8vIGNvbnZlcnQgc3RyaW5nIHRvIGFycmF5ICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgLy8gY291bnQgYmluYXJ5IHNpemVcbiAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgYnVmX2xlbiArPSBjIDwgMHg4MCA/IDEgOiBjIDwgMHg4MDAgPyAyIDogYyA8IDB4MTAwMDAgPyAzIDogNDtcbiAgfVxuXG4gIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICBidWYgPSBuZXcgdXRpbHMuQnVmOChidWZfbGVuKTtcblxuICAvLyBjb252ZXJ0XG4gIGZvciAoaSA9IDAsIG1fcG9zID0gMDsgaSA8IGJ1Zl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgIGJ1ZltpKytdID0gYztcbiAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgLyogdHdvIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4QzAgfCAoYyA+Pj4gNik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIC8qIHRocmVlIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4RTAgfCAoYyA+Pj4gMTIpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWY7XG59O1xuXG4vLyBIZWxwZXIgKHVzZWQgaW4gMiBwbGFjZXMpXG5mdW5jdGlvbiBidWYyYmluc3RyaW5nKGJ1ZiwgbGVuKSB7XG4gIC8vIE9uIENocm9tZSwgdGhlIGFyZ3VtZW50cyBpbiBhIGZ1bmN0aW9uIGNhbGwgdGhhdCBhcmUgYWxsb3dlZCBpcyBgNjU1MzRgLlxuICAvLyBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaXMgc21hbGxlciB0aGFuIHRoYXQsIHdlIGNhbiB1c2UgdGhpcyBvcHRpbWl6YXRpb24sXG4gIC8vIG90aGVyd2lzZSB3ZSB3aWxsIHRha2UgYSBzbG93ZXIgcGF0aC5cbiAgaWYgKGxlbiA8IDY1NTM0KSB7XG4gICAgaWYgKChidWYuc3ViYXJyYXkgJiYgU1RSX0FQUExZX1VJQV9PSykgfHwgKCFidWYuc3ViYXJyYXkgJiYgU1RSX0FQUExZX09LKSkge1xuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdXRpbHMuc2hyaW5rQnVmKGJ1ZiwgbGVuKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlc3VsdCA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8vIENvbnZlcnQgYnl0ZSBhcnJheSB0byBiaW5hcnkgc3RyaW5nXG5leHBvcnRzLmJ1ZjJiaW5zdHJpbmcgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIHJldHVybiBidWYyYmluc3RyaW5nKGJ1ZiwgYnVmLmxlbmd0aCk7XG59O1xuXG5cbi8vIENvbnZlcnQgYmluYXJ5IHN0cmluZyAodHlwZWQsIHdoZW4gcG9zc2libGUpXG5leHBvcnRzLmJpbnN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBidWYgPSBuZXcgdXRpbHMuQnVmOChzdHIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGJ1Zi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGJ1ZltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBidWY7XG59O1xuXG5cbi8vIGNvbnZlcnQgYXJyYXkgdG8gc3RyaW5nXG5leHBvcnRzLmJ1ZjJzdHJpbmcgPSBmdW5jdGlvbiAoYnVmLCBtYXgpIHtcbiAgdmFyIGksIG91dCwgYywgY19sZW47XG4gIHZhciBsZW4gPSBtYXggfHwgYnVmLmxlbmd0aDtcblxuICAvLyBSZXNlcnZlIG1heCBwb3NzaWJsZSBsZW5ndGggKDIgd29yZHMgcGVyIGNoYXIpXG4gIC8vIE5COiBieSB1bmtub3duIHJlYXNvbnMsIEFycmF5IGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIGZvclxuICAvLyAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSB0aGFuIFVpbnQxNkFycmF5LlxuICB2YXIgdXRmMTZidWYgPSBuZXcgQXJyYXkobGVuICogMik7XG5cbiAgZm9yIChvdXQgPSAwLCBpID0gMDsgaSA8IGxlbjspIHtcbiAgICBjID0gYnVmW2krK107XG4gICAgLy8gcXVpY2sgcHJvY2VzcyBhc2NpaVxuICAgIGlmIChjIDwgMHg4MCkgeyB1dGYxNmJ1ZltvdXQrK10gPSBjOyBjb250aW51ZTsgfVxuXG4gICAgY19sZW4gPSBfdXRmOGxlbltjXTtcbiAgICAvLyBza2lwIDUgJiA2IGJ5dGUgY29kZXNcbiAgICBpZiAoY19sZW4gPiA0KSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgaSArPSBjX2xlbiAtIDE7IGNvbnRpbnVlOyB9XG5cbiAgICAvLyBhcHBseSBtYXNrIG9uIGZpcnN0IGJ5dGVcbiAgICBjICY9IGNfbGVuID09PSAyID8gMHgxZiA6IGNfbGVuID09PSAzID8gMHgwZiA6IDB4MDc7XG4gICAgLy8gam9pbiB0aGUgcmVzdFxuICAgIHdoaWxlIChjX2xlbiA+IDEgJiYgaSA8IGxlbikge1xuICAgICAgYyA9IChjIDw8IDYpIHwgKGJ1ZltpKytdICYgMHgzZik7XG4gICAgICBjX2xlbi0tO1xuICAgIH1cblxuICAgIC8vIHRlcm1pbmF0ZWQgYnkgZW5kIG9mIHN0cmluZz9cbiAgICBpZiAoY19sZW4gPiAxKSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgY29udGludWU7IH1cblxuICAgIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgdXRmMTZidWZbb3V0KytdID0gYztcbiAgICB9IGVsc2Uge1xuICAgICAgYyAtPSAweDEwMDAwO1xuICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkODAwIHwgKChjID4+IDEwKSAmIDB4M2ZmKTtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZGMwMCB8IChjICYgMHgzZmYpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWYyYmluc3RyaW5nKHV0ZjE2YnVmLCBvdXQpO1xufTtcblxuXG4vLyBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHBvc2l0aW9uIGluIHV0ZjggYnVmZmVyLFxuLy8gdGhhdCB3aWxsIG5vdCBicmVhayBzZXF1ZW5jZS4gSWYgdGhhdCdzIG5vdCBwb3NzaWJsZVxuLy8gLSAodmVyeSBzbWFsbCBsaW1pdHMpIHJldHVybiBtYXggc2l6ZSBhcyBpcy5cbi8vXG4vLyBidWZbXSAtIHV0ZjggYnl0ZXMgYXJyYXlcbi8vIG1heCAgIC0gbGVuZ3RoIGxpbWl0IChtYW5kYXRvcnkpO1xuZXhwb3J0cy51dGY4Ym9yZGVyID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBwb3M7XG5cbiAgbWF4ID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG4gIGlmIChtYXggPiBidWYubGVuZ3RoKSB7IG1heCA9IGJ1Zi5sZW5ndGg7IH1cblxuICAvLyBnbyBiYWNrIGZyb20gbGFzdCBwb3NpdGlvbiwgdW50aWwgc3RhcnQgb2Ygc2VxdWVuY2UgZm91bmRcbiAgcG9zID0gbWF4IC0gMTtcbiAgd2hpbGUgKHBvcyA+PSAwICYmIChidWZbcG9zXSAmIDB4QzApID09PSAweDgwKSB7IHBvcy0tOyB9XG5cbiAgLy8gVmVyeSBzbWFsbCBhbmQgYnJva2VuIHNlcXVlbmNlLFxuICAvLyByZXR1cm4gbWF4LCBiZWNhdXNlIHdlIHNob3VsZCByZXR1cm4gc29tZXRoaW5nIGFueXdheS5cbiAgaWYgKHBvcyA8IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIC8vIElmIHdlIGNhbWUgdG8gc3RhcnQgb2YgYnVmZmVyIC0gdGhhdCBtZWFucyBidWZmZXIgaXMgdG9vIHNtYWxsLFxuICAvLyByZXR1cm4gbWF4IHRvby5cbiAgaWYgKHBvcyA9PT0gMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgcmV0dXJuIChwb3MgKyBfdXRmOGxlbltidWZbcG9zXV0gPiBtYXgpID8gcG9zIDogbWF4O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogYWRsZXIzMiB0YWtlcyAxMiUgZm9yIGxldmVsIDAgYW5kIDIlIGZvciBsZXZlbCA2LlxuLy8gSXQgaXNuJ3Qgd29ydGggaXQgdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gYWRsZXIzMihhZGxlciwgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgczEgPSAoYWRsZXIgJiAweGZmZmYpIHwwLFxuICAgICAgczIgPSAoKGFkbGVyID4+PiAxNikgJiAweGZmZmYpIHwwLFxuICAgICAgbiA9IDA7XG5cbiAgd2hpbGUgKGxlbiAhPT0gMCkge1xuICAgIC8vIFNldCBsaW1pdCB+IHR3aWNlIGxlc3MgdGhhbiA1NTUyLCB0byBrZWVwXG4gICAgLy8gczIgaW4gMzEtYml0cywgYmVjYXVzZSB3ZSBmb3JjZSBzaWduZWQgaW50cy5cbiAgICAvLyBpbiBvdGhlciBjYXNlICU9IHdpbGwgZmFpbC5cbiAgICBuID0gbGVuID4gMjAwMCA/IDIwMDAgOiBsZW47XG4gICAgbGVuIC09IG47XG5cbiAgICBkbyB7XG4gICAgICBzMSA9IChzMSArIGJ1Zltwb3MrK10pIHwwO1xuICAgICAgczIgPSAoczIgKyBzMSkgfDA7XG4gICAgfSB3aGlsZSAoLS1uKTtcblxuICAgIHMxICU9IDY1NTIxO1xuICAgIHMyICU9IDY1NTIxO1xuICB9XG5cbiAgcmV0dXJuIChzMSB8IChzMiA8PCAxNikpIHwwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gYWRsZXIzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICAvKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovXG4gIFpfTk9fRkxVU0g6ICAgICAgICAgMCxcbiAgWl9QQVJUSUFMX0ZMVVNIOiAgICAxLFxuICBaX1NZTkNfRkxVU0g6ICAgICAgIDIsXG4gIFpfRlVMTF9GTFVTSDogICAgICAgMyxcbiAgWl9GSU5JU0g6ICAgICAgICAgICA0LFxuICBaX0JMT0NLOiAgICAgICAgICAgIDUsXG4gIFpfVFJFRVM6ICAgICAgICAgICAgNixcblxuICAvKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICAqL1xuICBaX09LOiAgICAgICAgICAgICAgIDAsXG4gIFpfU1RSRUFNX0VORDogICAgICAgMSxcbiAgWl9ORUVEX0RJQ1Q6ICAgICAgICAyLFxuICBaX0VSUk5POiAgICAgICAgICAgLTEsXG4gIFpfU1RSRUFNX0VSUk9SOiAgICAtMixcbiAgWl9EQVRBX0VSUk9SOiAgICAgIC0zLFxuICAvL1pfTUVNX0VSUk9SOiAgICAgLTQsXG4gIFpfQlVGX0VSUk9SOiAgICAgICAtNSxcbiAgLy9aX1ZFUlNJT05fRVJST1I6IC02LFxuXG4gIC8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuICBaX05PX0NPTVBSRVNTSU9OOiAgICAgICAgIDAsXG4gIFpfQkVTVF9TUEVFRDogICAgICAgICAgICAgMSxcbiAgWl9CRVNUX0NPTVBSRVNTSU9OOiAgICAgICA5LFxuICBaX0RFRkFVTFRfQ09NUFJFU1NJT046ICAgLTEsXG5cblxuICBaX0ZJTFRFUkVEOiAgICAgICAgICAgICAgIDEsXG4gIFpfSFVGRk1BTl9PTkxZOiAgICAgICAgICAgMixcbiAgWl9STEU6ICAgICAgICAgICAgICAgICAgICAzLFxuICBaX0ZJWEVEOiAgICAgICAgICAgICAgICAgIDQsXG4gIFpfREVGQVVMVF9TVFJBVEVHWTogICAgICAgMCxcblxuICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovXG4gIFpfQklOQVJZOiAgICAgICAgICAgICAgICAgMCxcbiAgWl9URVhUOiAgICAgICAgICAgICAgICAgICAxLFxuICAvL1pfQVNDSUk6ICAgICAgICAgICAgICAgIDEsIC8vID0gWl9URVhUIChkZXByZWNhdGVkKVxuICBaX1VOS05PV046ICAgICAgICAgICAgICAgIDIsXG5cbiAgLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG4gIFpfREVGTEFURUQ6ICAgICAgICAgICAgICAgOFxuICAvL1pfTlVMTDogICAgICAgICAgICAgICAgIG51bGwgLy8gVXNlIC0xIG9yIG51bGwgaW5saW5lLCBkZXBlbmRpbmcgb24gdmFyIHR5cGVcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IHdlIGNhbid0IGdldCBzaWduaWZpY2FudCBzcGVlZCBib29zdCBoZXJlLlxuLy8gU28gd3JpdGUgY29kZSB0byBtaW5pbWl6ZSBzaXplIC0gbm8gcHJlZ2VuZXJhdGVkIHRhYmxlc1xuLy8gYW5kIGFycmF5IHRvb2xzIGRlcGVuZGVuY2llcy5cblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vLyBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZVxuZnVuY3Rpb24gbWFrZVRhYmxlKCkge1xuICB2YXIgYywgdGFibGUgPSBbXTtcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDI1NjsgbisrKSB7XG4gICAgYyA9IG47XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCA4OyBrKyspIHtcbiAgICAgIGMgPSAoKGMgJiAxKSA/ICgweEVEQjg4MzIwIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG4gICAgfVxuICAgIHRhYmxlW25dID0gYztcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn1cblxuLy8gQ3JlYXRlIHRhYmxlIG9uIGxvYWQuIEp1c3QgMjU1IHNpZ25lZCBsb25ncy4gTm90IGEgcHJvYmxlbS5cbnZhciBjcmNUYWJsZSA9IG1ha2VUYWJsZSgpO1xuXG5cbmZ1bmN0aW9uIGNyYzMyKGNyYywgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgdCA9IGNyY1RhYmxlLFxuICAgICAgZW5kID0gcG9zICsgbGVuO1xuXG4gIGNyYyBePSAtMTtcblxuICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKyspIHtcbiAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIGJ1ZltpXSkgJiAweEZGXTtcbiAgfVxuXG4gIHJldHVybiAoY3JjIF4gKC0xKSk7IC8vID4+PiAwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gY3JjMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciB0cmVlcyAgID0gcmVxdWlyZSgnLi90cmVlcycpO1xudmFyIGFkbGVyMzIgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIG1zZyAgICAgPSByZXF1aXJlKCcuL21lc3NhZ2VzJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xudmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xuLy92YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG4vL3ZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7XG52YXIgWl9EQVRBX0VSUk9SICAgID0gLTM7XG4vL3ZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG5cbi8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuLy92YXIgWl9OT19DT01QUkVTU0lPTiAgICAgID0gMDtcbi8vdmFyIFpfQkVTVF9TUEVFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0JFU1RfQ09NUFJFU1NJT04gICAgPSA5O1xudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG5cbnZhciBaX0ZJTFRFUkVEICAgICAgICAgICAgPSAxO1xudmFyIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7XG52YXIgWl9STEUgICAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbi8vdmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG4vL3ZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgTUFYX01FTV9MRVZFTCA9IDk7XG4vKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi9cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9NRU1fTEVWRUwgPSA4O1xuXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xudmFyIE1BWF9CSVRTICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBNSU5fTUFUQ0ggPSAzO1xudmFyIE1BWF9NQVRDSCA9IDI1ODtcbnZhciBNSU5fTE9PS0FIRUFEID0gKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpO1xuXG52YXIgUFJFU0VUX0RJQ1QgPSAweDIwO1xuXG52YXIgSU5JVF9TVEFURSA9IDQyO1xudmFyIEVYVFJBX1NUQVRFID0gNjk7XG52YXIgTkFNRV9TVEFURSA9IDczO1xudmFyIENPTU1FTlRfU1RBVEUgPSA5MTtcbnZhciBIQ1JDX1NUQVRFID0gMTAzO1xudmFyIEJVU1lfU1RBVEUgPSAxMTM7XG52YXIgRklOSVNIX1NUQVRFID0gNjY2O1xuXG52YXIgQlNfTkVFRF9NT1JFICAgICAgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi9cbnZhciBCU19CTE9DS19ET05FICAgICA9IDI7IC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqL1xudmFyIEJTX0ZJTklTSF9TVEFSVEVEID0gMzsgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi9cbnZhciBCU19GSU5JU0hfRE9ORSAgICA9IDQ7IC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi9cblxudmFyIE9TX0NPREUgPSAweDAzOyAvLyBVbml4IDopIC4gRG9uJ3QgZGV0ZWN0LCB1c2UgdGhpcyBkZWZhdWx0LlxuXG5mdW5jdGlvbiBlcnIoc3RybSwgZXJyb3JDb2RlKSB7XG4gIHN0cm0ubXNnID0gbXNnW2Vycm9yQ29kZV07XG4gIHJldHVybiBlcnJvckNvZGU7XG59XG5cbmZ1bmN0aW9uIHJhbmsoZikge1xuICByZXR1cm4gKChmKSA8PCAxKSAtICgoZikgPiA0ID8gOSA6IDApO1xufVxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzXG4gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0XG4gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+b3V0cHV0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LlxuICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLlxuICovXG5mdW5jdGlvbiBmbHVzaF9wZW5kaW5nKHN0cm0pIHtcbiAgdmFyIHMgPSBzdHJtLnN0YXRlO1xuXG4gIC8vX3RyX2ZsdXNoX2JpdHMocyk7XG4gIHZhciBsZW4gPSBzLnBlbmRpbmc7XG4gIGlmIChsZW4gPiBzdHJtLmF2YWlsX291dCkge1xuICAgIGxlbiA9IHN0cm0uYXZhaWxfb3V0O1xuICB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbiwgc3RybS5uZXh0X291dCk7XG4gIHN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICBzLnBlbmRpbmdfb3V0ICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAtPSBsZW47XG4gIGlmIChzLnBlbmRpbmcgPT09IDApIHtcbiAgICBzLnBlbmRpbmdfb3V0ID0gMDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkge1xuICB0cmVlcy5fdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIGZsdXNoX3BlbmRpbmcocy5zdHJtKTtcbn1cblxuXG5mdW5jdGlvbiBwdXRfYnl0ZShzLCBiKSB7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci5cbiAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpblxuICogcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIHB1dFNob3J0TVNCKHMsIGIpIHtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKGIgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLCB1cGRhdGUgdGhlIGFkbGVyMzJcbiAqIGFuZCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIEFsbCBkZWZsYXRlKCkgaW5wdXQgZ29lcyB0aHJvdWdoXG4gKiB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZFxuICogYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPmlucHV0IGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LlxuICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRfYnVmKHN0cm0sIGJ1Ziwgc3RhcnQsIHNpemUpIHtcbiAgdmFyIGxlbiA9IHN0cm0uYXZhaWxfaW47XG5cbiAgaWYgKGxlbiA+IHNpemUpIHsgbGVuID0gc2l6ZTsgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybiAwOyB9XG5cbiAgc3RybS5hdmFpbF9pbiAtPSBsZW47XG5cbiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7XG4gIHV0aWxzLmFycmF5U2V0KGJ1Ziwgc3RybS5pbnB1dCwgc3RybS5uZXh0X2luLCBsZW4sIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDIpIHtcbiAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiArPSBsZW47XG4gIHN0cm0udG90YWxfaW4gKz0gbGVuO1xuXG4gIHJldHVybiBsZW47XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmRcbiAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCxcbiAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXNcbiAqIGdhcmJhZ2UuXG4gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50XG4gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLlxuICovXG5mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkge1xuICB2YXIgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAgICAgIC8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqL1xuICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovXG4gIHZhciBtYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi9cbiAgdmFyIGJlc3RfbGVuID0gcy5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqL1xuICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqL1xuICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgICBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwLypOSUwqLztcblxuICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dFxuXG4gIHZhciB3bWFzayA9IHMud19tYXNrO1xuICB2YXIgcHJldiAgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgdmFyIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gIHZhciBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgdmFyIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG5cbiAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuXG4gICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICAvLyBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgXCJDb2RlIHRvbyBjbGV2ZXJcIik7XG5cbiAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi9cbiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7XG4gICAgY2hhaW5fbGVuZ3RoID4+PSAyO1xuICB9XG4gIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuXG4gICAqL1xuICBpZiAobmljZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7IG5pY2VfbWF0Y2ggPSBzLmxvb2thaGVhZDsgfVxuXG4gIC8vIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsIFwibmVlZCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIC8vIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgXCJubyBmdXR1cmVcIik7XG4gICAgbWF0Y2ggPSBjdXJfbWF0Y2g7XG5cbiAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2VcbiAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3dcbiAgICAgKiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IG9jY3VyIG9jY2FzaW9uYWxseSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZFxuICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuXG4gICAgICogSG93ZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBsaW1pdGVkIHRvIHRoZSBsb29rYWhlYWQsIHNvXG4gICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuXG4gICAgICovXG5cbiAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAgICAgIT09IHNjYW5fZW5kICB8fFxuICAgICAgICBfd2luW21hdGNoICsgYmVzdF9sZW4gLSAxXSAhPT0gc2Nhbl9lbmQxIHx8XG4gICAgICAgIF93aW5bbWF0Y2hdICAgICAgICAgICAgICAgICE9PSBfd2luW3NjYW5dIHx8XG4gICAgICAgIF93aW5bKyttYXRjaF0gICAgICAgICAgICAgICE9PSBfd2luW3NjYW4gKyAxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGVcbiAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKVxuICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5XG4gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdFxuICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LlxuICAgICAqL1xuICAgIHNjYW4gKz0gMjtcbiAgICBtYXRjaCsrO1xuICAgIC8vIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsIFwibWF0Y2hbMl0/XCIpO1xuXG4gICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjtcbiAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC5cbiAgICAgKi9cbiAgICBkbyB7XG4gICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG5cbiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG5cbiAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDtcblxuICAgIGlmIChsZW4gPiBiZXN0X2xlbikge1xuICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDtcbiAgICAgIGJlc3RfbGVuID0gbGVuO1xuICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gICAgICBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuICAgIH1cbiAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9PSAwKTtcblxuICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gYmVzdF9sZW47XG4gIH1cbiAgcmV0dXJuIHMubG9va2FoZWFkO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuZnVuY3Rpb24gZmlsbF93aW5kb3cocykge1xuICB2YXIgX3dfc2l6ZSA9IHMud19zaXplO1xuICB2YXIgcCwgbiwgbSwgbW9yZSwgc3RyO1xuXG4gIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsIFwiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDtcblxuICAgIC8vIEpTIGludHMgaGF2ZSAzMiBiaXQsIGJsb2NrIGJlbG93IG5vdCBuZWVkZWRcbiAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqL1xuICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHtcbiAgICAvLyAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHtcbiAgICAvLyAgICAgICAgbW9yZSA9IHdzaXplO1xuICAgIC8vXG4gICAgLy8gIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkge1xuICAgIC8vICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWZcbiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSlcbiAgICAvLyAgICAgICAgICovXG4gICAgLy8gICAgICAgIG1vcmUtLTtcbiAgICAvLyAgICB9XG4gICAgLy99XG5cblxuICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsXG4gICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuXG4gICAgICB1dGlscy5hcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93X3NpemUsIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcblxuICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzXG4gICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDBcbiAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwXG4gICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mXG4gICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLilcbiAgICAgICAqL1xuXG4gICAgICBuID0gcy5oYXNoX3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMuaGVhZFstLXBdO1xuICAgICAgICBzLmhlYWRbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG4gPSBfd19zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLnByZXZbLS1wXTtcbiAgICAgICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0XG4gICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICAgICAqL1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbW9yZSArPSBfd19zaXplO1xuICAgIH1cbiAgICBpZiAocy5zdHJtLmF2YWlsX2luID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzpcbiAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJlxuICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydFxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKVxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMlxuICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLFxuICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmXG4gICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC5cbiAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLlxuICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi5cbiAgICAgKi9cbiAgICAvL0Fzc2VydChtb3JlID49IDIsIFwibW9yZSA8IDJcIik7XG4gICAgbiA9IHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCwgbW9yZSk7XG4gICAgcy5sb29rYWhlYWQgKz0gbjtcblxuICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkge1xuICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgcy5pbnNfaCA9IHMud2luZG93W3N0cl07XG5cbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgMV0pICYgcy5oYXNoX21hc2s7XG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgIENhbGwgdXBkYXRlX2hhc2goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgICBzdHIrKztcbiAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsXG4gICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLlxuICAgICAqL1xuXG4gIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApO1xuXG4gIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuXG4gICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZlxuICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnlcbiAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHRcbiAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuXG4gICAqL1xuLy8gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLndpbmRvd19zaXplKSB7XG4vLyAgICB2YXIgY3VyciA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZDtcbi8vICAgIHZhciBpbml0ID0gMDtcbi8vXG4vLyAgICBpZiAocy5oaWdoX3dhdGVyIDwgY3Vycikge1xuLy8gICAgICAvKiBQcmV2aW91cyBoaWdoIHdhdGVyIG1hcmsgYmVsb3cgY3VycmVudCBkYXRhIC0tIHplcm8gV0lOX0lOSVRcbi8vICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gcy53aW5kb3dfc2l6ZSAtIGN1cnI7XG4vLyAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpXG4vLyAgICAgICAgaW5pdCA9IFdJTl9JTklUO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBjdXJyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDtcbi8vICAgIH1cbi8vICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkge1xuLy8gICAgICAvKiBIaWdoIHdhdGVyIG1hcmsgYXQgb3IgYWJvdmUgY3VycmVudCBkYXRhLCBidXQgYmVsb3cgY3VycmVudCBkYXRhXG4vLyAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwXG4vLyAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpXG4vLyAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgcy0+aGlnaF93YXRlciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7XG4vLyAgICB9XG4vLyAgfVxuLy9cbi8vICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsXG4vLyAgICBcIm5vdCBlbm91Z2ggcm9vbSBmb3Igc2VhcmNoXCIpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IHNpbmNlXG4gKiB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZFxuICogb25seSBmb3IgdGhlIGxldmVsPTAgY29tcHJlc3Npb24gb3B0aW9uLlxuICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGV4dHJhIGNvcHlpbmcgZnJvbVxuICogd2luZG93IHRvIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkge1xuICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZFxuICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjpcbiAgICovXG4gIHZhciBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjtcblxuICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7XG4gICAgbWF4X2Jsb2NrX3NpemUgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSA1O1xuICB9XG5cbiAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IDEpIHtcblxuICAgICAgLy9Bc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHxcbiAgICAgIC8vICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsIFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIGlmICghKHMuc3Ryc3RhcnQgPCBzLndfc2l6ZSArIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHx8XG4vLyAgICAgICAgcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSkpIHtcbi8vICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIH1cblxuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDAgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG4gICAgLy9Bc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsIFwiYmxvY2sgZ29uZVwiKTtcbi8vICAgIGlmIChzLmJsb2NrX3N0YXJ0IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiYmxvY2sgZ29uZVwiKTtcblxuICAgIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gICAgcy5sb29rYWhlYWQgPSAwO1xuXG4gICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovXG4gICAgdmFyIG1heF9zdGFydCA9IHMuYmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTtcblxuICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7XG4gICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqL1xuICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0O1xuICAgICAgcy5zdHJzdGFydCA9IG1heF9zdGFydDtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG5cblxuICAgIH1cbiAgICAvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWVcbiAgICAgKiBuZWdhdGl2ZSBhbmQgdGhlIGRhdGEgd2lsbCBiZSBnb25lOlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cblxuICBzLmluc2VydCA9IDA7XG5cbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG5cbiAgaWYgKHMuc3Ryc3RhcnQgPiBzLmJsb2NrX3N0YXJ0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX05FRURfTU9SRTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50XG4gKiBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0c1xuICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0XG4gKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSFxuICAgICAqL1xuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmICgocy5zdHJzdGFydCAtIGhhc2hfaGVhZCkgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cbiAgICB9XG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy8gY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGgpOyAvLyBmb3IgZGVidWcgb25seVxuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcblxuICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2gvKm1heF9pbnNlcnRfbGVuZ3RoKi8gJiYgcy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmVcbiAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLlxuICAgICAgICAgICAqL1xuICAgICAgICB9IHdoaWxlICgtLXMubWF0Y2hfbGVuZ3RoICE9PSAwKTtcbiAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgfSBlbHNlXG4gICAgICB7XG4gICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAgICAgcy5pbnNfaCA9IHMud2luZG93W3Muc3Ryc3RhcnRdO1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLmluc19oLCBzLndpbmRvd1tzLnN0cnN0YXJ0KzFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90XG4gICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMud2luZG93W3Muc3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gKChzLnN0cnN0YXJ0IDwgKE1JTl9NQVRDSCAtIDEpKSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIHZhciBtYXhfaW5zZXJ0O1xuXG4gIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiZcbiAgICAgICAgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKS8qTUFYX0RJU1QocykqLykge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG5cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSA1ICYmXG4gICAgICAgICAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCAocy5tYXRjaF9sZW5ndGggPT09IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCA+IDQwOTYvKlRPT19GQVIqLykpKSB7XG5cbiAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZVxuICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LlxuICAgICAgICAgKi9cbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnRcbiAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOlxuICAgICAqL1xuICAgIGlmIChzLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLm1hdGNoX2xlbmd0aCA8PSBzLnByZXZfbGVuZ3RoKSB7XG4gICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIO1xuICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovXG5cbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydC0xLCBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGgpO1xuXG4gICAgICAvKioqX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7XG4gICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC5cbiAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3RcbiAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW5cbiAgICAgICAqIHRoZSBoYXNoIHRhYmxlLlxuICAgICAgICovXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTtcbiAgICAgIHMucHJldl9sZW5ndGggLT0gMjtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApO1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICAvKioqL1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGFcbiAgICAgICAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2hcbiAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuXG4gICAgICAgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DS19PTkxZKHMsIDApICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIC8qKiovXG4gICAgICB9XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvclxuICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCBcIm5vIGZsdXNoP1wiKTtcbiAgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICB9XG4gIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9STEUsIHNpbXBseSBsb29rIGZvciBydW5zIG9mIGJ5dGVzLCBnZW5lcmF0ZSBtYXRjaGVzIG9ubHkgb2YgZGlzdGFuY2VcbiAqIG9uZS4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuICAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZlxuICogZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gWl9STEUuKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3JsZShzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuICB2YXIgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovXG4gIHZhciBzY2FuLCBzdHJlbmQ7ICAgICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqL1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7XG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0ID4gMCkge1xuICAgICAgc2NhbiA9IHMuc3Ryc3RhcnQgLSAxO1xuICAgICAgcHJldiA9IF93aW5bc2Nhbl07XG4gICAgICBpZiAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0pIHtcbiAgICAgICAgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgICAgICB9IHdoaWxlIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHtcbiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMubG9va2FoZWFkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChzY2FuIDw9IHMtPndpbmRvdysodUludCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuICAgIH1cblxuICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi9cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMuc3Ryc3RhcnQgLSAxLCBzLm1hdGNoX2xlbmd0aCk7XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3QocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX0hVRkZNQU5fT05MWSwgZG8gbm90IGxvb2sgZm9yIG1hdGNoZXMuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLlxuICogKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YgZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gSHVmZm1hbi4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpdGVyYWwgdG8gd3JpdGUuICovXG4gICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogT3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG4gICAgcy5sb29rYWhlYWQtLTtcbiAgICBzLnN0cnN0YXJ0Kys7XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvblxuICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvXG4gKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmVcbiAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy5cbiAqL1xuZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykge1xuICB0aGlzLmdvb2RfbGVuZ3RoID0gZ29vZF9sZW5ndGg7XG4gIHRoaXMubWF4X2xhenkgPSBtYXhfbGF6eTtcbiAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoO1xuICB0aGlzLm1heF9jaGFpbiA9IG1heF9jaGFpbjtcbiAgdGhpcy5mdW5jID0gZnVuYztcbn1cblxudmFyIGNvbmZpZ3VyYXRpb25fdGFibGU7XG5cbmNvbmZpZ3VyYXRpb25fdGFibGUgPSBbXG4gIC8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi9cbiAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksICAgICAgICAgIC8qIDAgc3RvcmUgb25seSAqL1xuICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAgLyogMSBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgLyogMiAqL1xuICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgLyogMyAqL1xuXG4gIG5ldyBDb25maWcoNCwgNCwgMTYsIDE2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgICAvKiA0IGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAzMiwgMzIsIGRlZmxhdGVfc2xvdyksICAgICAgICAgLyogNSAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNiAqL1xuICBuZXcgQ29uZmlnKDgsIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNyAqL1xuICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgICAgLyogOCAqL1xuICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93KSAgICAgLyogOSBtYXggY29tcHJlc3Npb24gKi9cbl07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSBcImxvbmdlc3QgbWF0Y2hcIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gbG1faW5pdChzKSB7XG4gIHMud2luZG93X3NpemUgPSAyICogcy53X3NpemU7XG5cbiAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICAgKi9cbiAgcy5tYXhfbGF6eV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2xhenk7XG4gIHMuZ29vZF9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZ29vZF9sZW5ndGg7XG4gIHMubmljZV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubmljZV9sZW5ndGg7XG4gIHMubWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2NoYWluO1xuXG4gIHMuc3Ryc3RhcnQgPSAwO1xuICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLmluc2VydCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgcy5pbnNfaCA9IDA7XG59XG5cblxuZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCkge1xuICB0aGlzLnN0cm0gPSBudWxsOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovXG4gIHRoaXMuc3RhdHVzID0gMDsgICAgICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovXG4gIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAgICAgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovXG4gIHRoaXMucGVuZGluZ19idWZfc2l6ZSA9IDA7ICAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovXG4gIHRoaXMucGVuZGluZ19vdXQgPSAwOyAgICAgICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqL1xuICB0aGlzLnBlbmRpbmcgPSAwOyAgICAgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuZ3poZWFkID0gbnVsbDsgICAgICAgICAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqL1xuICB0aGlzLmd6aW5kZXggPSAwOyAgICAgICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi9cbiAgdGhpcy5tZXRob2QgPSBaX0RFRkxBVEVEOyAvKiBjYW4gb25seSBiZSBERUZMQVRFRCAqL1xuICB0aGlzLmxhc3RfZmx1c2ggPSAtMTsgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovXG5cbiAgdGhpcy53X3NpemUgPSAwOyAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovXG4gIHRoaXMud19iaXRzID0gMDsgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqL1xuICB0aGlzLndfbWFzayA9IDA7ICAvKiB3X3NpemUgLSAxICovXG5cbiAgdGhpcy53aW5kb3cgPSBudWxsO1xuICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdyxcbiAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemVcbiAgICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZlxuICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXNcbiAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuXG4gICAqL1xuXG4gIHRoaXMud2luZG93X3NpemUgPSAwO1xuICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlclxuICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LlxuICAgKi9cblxuICB0aGlzLnByZXYgPSBudWxsO1xuICAvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpc1xuICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLlxuICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy5cbiAgICovXG5cbiAgdGhpcy5oZWFkID0gbnVsbDsgICAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqL1xuXG4gIHRoaXMuaW5zX2ggPSAwOyAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqL1xuICB0aGlzLmhhc2hfc2l6ZSA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi9cbiAgdGhpcy5oYXNoX2JpdHMgPSAwOyAgIC8qIGxvZzIoaGFzaF9zaXplKSAqL1xuICB0aGlzLmhhc2hfbWFzayA9IDA7ICAgLyogaGFzaF9zaXplLTEgKi9cblxuICB0aGlzLmhhc2hfc2hpZnQgPSAwO1xuICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dFxuICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3RcbiAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6XG4gICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHNcbiAgICovXG5cbiAgdGhpcy5ibG9ja19zdGFydCA9IDA7XG4gIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0c1xuICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLlxuICAgKi9cblxuICB0aGlzLm1hdGNoX2xlbmd0aCA9IDA7ICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi9cbiAgdGhpcy5wcmV2X21hdGNoID0gMDsgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovXG4gIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovXG4gIHRoaXMuc3Ryc3RhcnQgPSAwOyAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovXG4gIHRoaXMubWF0Y2hfc3RhcnQgPSAwOyAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi9cbiAgdGhpcy5sb29rYWhlYWQgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi9cblxuICB0aGlzLnByZXZfbGVuZ3RoID0gMDtcbiAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLlxuICAgKi9cblxuICB0aGlzLm1heF9jaGFpbl9sZW5ndGggPSAwO1xuICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpc1xuICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlXG4gICAqIHNwZWVkLlxuICAgKi9cblxuICB0aGlzLm1heF9sYXp5X21hdGNoID0gMDtcbiAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseVxuICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvblxuICAgKiBsZXZlbHMgPj0gNC5cbiAgICovXG4gIC8vIFRoYXQncyBhbGlhcyB0byBtYXhfbGF6eV9tYXRjaCwgZG9uJ3QgdXNlIGRpcmVjdGx5XG4gIC8vdGhpcy5tYXhfaW5zZXJ0X2xlbmd0aCA9IDA7XG4gIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90XG4gICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy5cbiAgICovXG5cbiAgdGhpcy5sZXZlbCA9IDA7ICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi9cbiAgdGhpcy5zdHJhdGVneSA9IDA7ICAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovXG5cbiAgdGhpcy5nb29kX21hdGNoID0gMDtcbiAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovXG5cbiAgdGhpcy5uaWNlX21hdGNoID0gMDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqL1xuXG4gICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi9cblxuICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovXG5cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovXG5cbiAgLy8gVXNlIGZsYXQgYXJyYXkgb2YgRE9VQkxFIHNpemUsIHdpdGggaW50ZXJsZWF2ZWQgZmF0YSxcbiAgLy8gYmVjYXVzZSBKUyBkb2VzIG5vdCBzdXBwb3J0IGVmZmVjdGl2ZVxuICB0aGlzLmR5bl9sdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoSEVBUF9TSVpFICogMik7XG4gIHRoaXMuZHluX2R0cmVlICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIERfQ09ERVMgKyAxKSAqIDIpO1xuICB0aGlzLmJsX3RyZWUgICAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBCTF9DT0RFUyArIDEpICogMik7XG4gIHplcm8odGhpcy5keW5fbHRyZWUpO1xuICB6ZXJvKHRoaXMuZHluX2R0cmVlKTtcbiAgemVybyh0aGlzLmJsX3RyZWUpO1xuXG4gIHRoaXMubF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi9cbiAgdGhpcy5kX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi9cbiAgdGhpcy5ibF9kZXNjICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGJpdCBsZW5ndGggdHJlZSAqL1xuXG4gIC8vdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdO1xuICB0aGlzLmJsX2NvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vaW50IGhlYXBbMipMX0NPREVTKzFdOyAgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB6ZXJvKHRoaXMuaGVhcCk7XG5cbiAgdGhpcy5oZWFwX2xlbiA9IDA7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovXG4gIHRoaXMuaGVhcF9tYXggPSAwOyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi9cbiAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy5cbiAgICovXG5cbiAgdGhpcy5kZXB0aCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAvL3VjaCBkZXB0aFsyKkxfQ09ERVMrMV07XG4gIHplcm8odGhpcy5kZXB0aCk7XG4gIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3lcbiAgICovXG5cbiAgdGhpcy5sX2J1ZiA9IDA7ICAgICAgICAgIC8qIGJ1ZmZlciBpbmRleCBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqL1xuXG4gIHRoaXMubGl0X2J1ZnNpemUgPSAwO1xuICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yXG4gICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzpcbiAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVyc1xuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0XG4gICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlblxuICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3JcbiAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKVxuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW5cbiAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS5cbiAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLlxuICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0XG4gICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yXG4gICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnlcbiAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlXG4gICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmdcbiAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS5cbiAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNFxuICAgKi9cblxuICB0aGlzLmxhc3RfbGl0ID0gMDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG5cbiAgdGhpcy5kX2J1ZiA9IDA7XG4gIC8qIEJ1ZmZlciBpbmRleCBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmVcbiAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWdcbiAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LlxuICAgKi9cblxuICB0aGlzLm9wdF9sZW4gPSAwOyAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovXG4gIHRoaXMuc3RhdGljX2xlbiA9IDA7ICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqL1xuICB0aGlzLm1hdGNoZXMgPSAwOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqL1xuICB0aGlzLmluc2VydCA9IDA7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovXG5cblxuICB0aGlzLmJpX2J1ZiA9IDA7XG4gIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0XG4gICAqIHNpZ25pZmljYW50IGJpdHMpLlxuICAgKi9cbiAgdGhpcy5iaV92YWxpZCA9IDA7XG4gIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdFxuICAgKiBhcmUgYWx3YXlzIHplcm8uXG4gICAqL1xuXG4gIC8vIFVzZWQgZm9yIHdpbmRvdyBtZW1vcnkgaW5pdC4gV2Ugc2FmZWx5IGlnbm9yZSBpdCBmb3IgSlMuIFRoYXQgbWFrZXNcbiAgLy8gc2Vuc2Ugb25seSBmb3IgcG9pbnRlcnMgYW5kIG1lbW9yeSBjaGVjayB0b29scy5cbiAgLy90aGlzLmhpZ2hfd2F0ZXIgPSAwO1xuICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmVcbiAgICogdGhpcyBhcmUgc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHdhcm5pbmdzIHdoZW5cbiAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW5cbiAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay5cbiAgICovXG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gMDtcbiAgc3RybS5kYXRhX3R5cGUgPSBaX1VOS05PV047XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHMucGVuZGluZyA9IDA7XG4gIHMucGVuZGluZ19vdXQgPSAwO1xuXG4gIGlmIChzLndyYXAgPCAwKSB7XG4gICAgcy53cmFwID0gLXMud3JhcDtcbiAgICAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqL1xuICB9XG4gIHMuc3RhdHVzID0gKHMud3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFKTtcbiAgc3RybS5hZGxlciA9IChzLndyYXAgPT09IDIpID9cbiAgICAwICAvLyBjcmMzMigwLCBaX05VTEwsIDApXG4gIDpcbiAgICAxOyAvLyBhZGxlcjMyKDAsIFpfTlVMTCwgMClcbiAgcy5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDtcbiAgdHJlZXMuX3RyX2luaXQocyk7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciByZXQgPSBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuICBpZiAocmV0ID09PSBaX09LKSB7XG4gICAgbG1faW5pdChzdHJtLnN0YXRlKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIGlmIChzdHJtLnN0YXRlLndyYXAgIT09IDIpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0cm0uc3RhdGUuZ3poZWFkID0gaGVhZDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkge1xuICBpZiAoIXN0cm0pIHsgLy8gPT09IFpfTlVMTFxuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICB2YXIgd3JhcCA9IDE7XG5cbiAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHtcbiAgICBsZXZlbCA9IDY7XG4gIH1cblxuICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovXG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7XG4gICAgd3JhcCA9IDI7ICAgICAgICAgICAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqL1xuICAgIHdpbmRvd0JpdHMgLT0gMTY7XG4gIH1cblxuXG4gIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCB8fFxuICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8XG4gICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cblxuICBpZiAod2luZG93Qml0cyA9PT0gOCkge1xuICAgIHdpbmRvd0JpdHMgPSA5O1xuICB9XG4gIC8qIHVudGlsIDI1Ni1ieXRlIHdpbmRvdyBidWcgZml4ZWQgKi9cblxuICB2YXIgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTtcblxuICBzdHJtLnN0YXRlID0gcztcbiAgcy5zdHJtID0gc3RybTtcblxuICBzLndyYXAgPSB3cmFwO1xuICBzLmd6aGVhZCA9IG51bGw7XG4gIHMud19iaXRzID0gd2luZG93Qml0cztcbiAgcy53X3NpemUgPSAxIDw8IHMud19iaXRzO1xuICBzLndfbWFzayA9IHMud19zaXplIC0gMTtcblxuICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNztcbiAgcy5oYXNoX3NpemUgPSAxIDw8IHMuaGFzaF9iaXRzO1xuICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTtcbiAgcy5oYXNoX3NoaWZ0ID0gfn4oKHMuaGFzaF9iaXRzICsgTUlOX01BVENIIC0gMSkgLyBNSU5fTUFUQ0gpO1xuXG4gIHMud2luZG93ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUgKiAyKTtcbiAgcy5oZWFkID0gbmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKTtcbiAgcy5wcmV2ID0gbmV3IHV0aWxzLkJ1ZjE2KHMud19zaXplKTtcblxuICAvLyBEb24ndCBuZWVkIG1lbSBpbml0IG1hZ2ljIGZvciBKUy5cbiAgLy9zLmhpZ2hfd2F0ZXIgPSAwOyAgLyogbm90aGluZyB3cml0dGVuIHRvIHMtPndpbmRvdyB5ZXQgKi9cblxuICBzLmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi9cblxuICBzLnBlbmRpbmdfYnVmX3NpemUgPSBzLmxpdF9idWZzaXplICogNDtcblxuICAvL292ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpO1xuICAvL3MtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTtcbiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyB1dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7XG5cbiAgLy8gSXQgaXMgb2Zmc2V0IGZyb20gYHMucGVuZGluZ19idWZgIChzaXplIGlzIGBzLmxpdF9idWZzaXplICogMmApXG4gIC8vcy0+ZF9idWYgPSBvdmVybGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7XG4gIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTtcblxuICAvL3MtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7XG4gIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTtcblxuICBzLmxldmVsID0gbGV2ZWw7XG4gIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgcy5tZXRob2QgPSBtZXRob2Q7XG5cbiAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHtcbiAgcmV0dXJuIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIG9sZF9mbHVzaCwgcztcbiAgdmFyIGJlZywgdmFsOyAvLyBmb3IgZ3ppcCBoZWFkZXIgd3JpdGUgb25seVxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fFxuICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHtcbiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUikgOiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuXG4gIGlmICghc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fFxuICAgICAgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT09IFpfRklOSVNIKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SIDogWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgcy5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovXG4gIG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDtcbiAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7XG5cbiAgLyogV3JpdGUgdGhlIGhlYWRlciAqL1xuICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHtcblxuICAgIGlmIChzLndyYXAgPT09IDIpIHsgLy8gR1pJUCBoZWFkZXJcbiAgICAgIHN0cm0uYWRsZXIgPSAwOyAgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDMxKTtcbiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgICBwdXRfYnl0ZShzLCA4KTtcbiAgICAgIGlmICghcy5nemhlYWQpIHsgLy8gcy0+Z3poZWFkID09IFpfTlVMTFxuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzLmd6aGVhZC5oY3JjID8gMiA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5leHRyYSA/IDAgOiA0KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuY29tbWVudCA/IDAgOiAxNilcbiAgICAgICAgKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQudGltZSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAxNikgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMjQpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQub3MgJiAweGZmKTtcbiAgICAgICAgaWYgKHMuZ3poZWFkLmV4dHJhICYmIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkge1xuICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmYpO1xuICAgICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC5leHRyYS5sZW5ndGggPj4gOCkgJiAweGZmKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcsIDApO1xuICAgICAgICB9XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gRVhUUkFfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgLy8gREVGTEFURSBoZWFkZXJcbiAgICB7XG4gICAgICB2YXIgaGVhZGVyID0gKFpfREVGTEFURUQgKyAoKHMud19iaXRzIC0gOCkgPDwgNCkpIDw8IDg7XG4gICAgICB2YXIgbGV2ZWxfZmxhZ3MgPSAtMTtcblxuICAgICAgaWYgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAwO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsIDwgNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPT09IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAzO1xuICAgICAgfVxuICAgICAgaGVhZGVyIHw9IChsZXZlbF9mbGFncyA8PCA2KTtcbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7IGhlYWRlciB8PSBQUkVTRVRfRElDVDsgfVxuICAgICAgaGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTtcblxuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTtcblxuICAgICAgLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovXG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkge1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IDE7IC8vIGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgfVxuICB9XG5cbi8vI2lmZGVmIEdaSVBcbiAgaWYgKHMuc3RhdHVzID09PSBFWFRSQV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5leHRyYS8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG5cbiAgICAgIHdoaWxlIChzLmd6aW5kZXggPCAocy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZmZmKSkge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhW3MuZ3ppbmRleF0gJiAweGZmKTtcbiAgICAgICAgcy5nemluZGV4Kys7XG4gICAgICB9XG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aW5kZXggPT09IHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IE5BTUVfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQubmFtZS8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLm5hbWUubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQubmFtZS5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gQ09NTUVOVF9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5jb21tZW50LyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQuY29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBIQ1JDX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyID4gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICB9XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA8PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgcHV0X2J5dGUocywgc3RybS5hZGxlciAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICBzdHJtLmFkbGVyID0gMDsgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICB9XG4gIH1cbi8vI2VuZGlmXG5cbiAgLyogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZSAqL1xuICBpZiAocy5wZW5kaW5nICE9PSAwKSB7XG4gICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIC8qIFNpbmNlIGF2YWlsX291dCBpcyAwLCBkZWZsYXRlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGhcbiAgICAgICAqIG1vcmUgb3V0cHV0IHNwYWNlLCBidXQgcG9zc2libHkgd2l0aCBib3RoIHBlbmRpbmcgYW5kXG4gICAgICAgKiBhdmFpbF9pbiBlcXVhbCB0byB6ZXJvLiBUaGVyZSB3b24ndCBiZSBhbnl0aGluZyB0byBkbyxcbiAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBhbiBlcnJvciBzaXR1YXRpb24gc28gbWFrZSBzdXJlIHdlXG4gICAgICAgKiByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgYXQgbmV4dCBjYWxsIG9mIGRlZmxhdGU6XG4gICAgICAgKi9cbiAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgcmV0dXJuIFpfT0s7XG4gICAgfVxuXG4gICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIHNvbWV0aGluZyB0byBkbyBhbmQgYXZvaWQgZHVwbGljYXRlIGNvbnNlY3V0aXZlXG4gICAgICogZmx1c2hlcy4gRm9yIHJlcGVhdGVkIGFuZCB1c2VsZXNzIGNhbGxzIHdpdGggWl9GSU5JU0gsIHdlIGtlZXBcbiAgICAgKiByZXR1cm5pbmcgWl9TVFJFQU1fRU5EIGluc3RlYWQgb2YgWl9CVUZfRVJST1IuXG4gICAgICovXG4gIH0gZWxzZSBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiByYW5rKGZsdXNoKSA8PSByYW5rKG9sZF9mbHVzaCkgJiZcbiAgICBmbHVzaCAhPT0gWl9GSU5JU0gpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfQlVGX0VSUk9SKTtcbiAgfVxuXG4gIC8qIFVzZXIgbXVzdCBub3QgcHJvdmlkZSBtb3JlIGlucHV0IGFmdGVyIHRoZSBmaXJzdCBGSU5JU0g6ICovXG4gIGlmIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfQlVGX0VSUk9SKTtcbiAgfVxuXG4gIC8qIFN0YXJ0IGEgbmV3IGJsb2NrIG9yIGNvbnRpbnVlIHRoZSBjdXJyZW50IG9uZS5cbiAgICovXG4gIGlmIChzdHJtLmF2YWlsX2luICE9PSAwIHx8IHMubG9va2FoZWFkICE9PSAwIHx8XG4gICAgKGZsdXNoICE9PSBaX05PX0ZMVVNIICYmIHMuc3RhdHVzICE9PSBGSU5JU0hfU1RBVEUpKSB7XG4gICAgdmFyIGJzdGF0ZSA9IChzLnN0cmF0ZWd5ID09PSBaX0hVRkZNQU5fT05MWSkgPyBkZWZsYXRlX2h1ZmYocywgZmx1c2gpIDpcbiAgICAgIChzLnN0cmF0ZWd5ID09PSBaX1JMRSA/IGRlZmxhdGVfcmxlKHMsIGZsdXNoKSA6XG4gICAgICAgIGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZnVuYyhzLCBmbHVzaCkpO1xuXG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfRE9ORSkge1xuICAgICAgcy5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7XG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX05FRURfTU9SRSB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEKSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICAgIC8qIGF2b2lkIEJVRl9FUlJPUiBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqL1xuICAgICAgfVxuICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICAvKiBJZiBmbHVzaCAhPSBaX05PX0ZMVVNIICYmIGF2YWlsX291dCA9PSAwLCB0aGUgbmV4dCBjYWxsXG4gICAgICAgKiBvZiBkZWZsYXRlIHNob3VsZCB1c2UgdGhlIHNhbWUgZmx1c2ggcGFyYW1ldGVyIHRvIG1ha2Ugc3VyZVxuICAgICAgICogdGhhdCB0aGUgZmx1c2ggaXMgY29tcGxldGUuIFNvIHdlIGRvbid0IGhhdmUgdG8gb3V0cHV0IGFuXG4gICAgICAgKiBlbXB0eSBibG9jayBoZXJlLCB0aGlzIHdpbGwgYmUgZG9uZSBhdCBuZXh0IGNhbGwuIFRoaXMgYWxzb1xuICAgICAgICogZW5zdXJlcyB0aGF0IGZvciBhIHZlcnkgc21hbGwgb3V0cHV0IGJ1ZmZlciwgd2UgZW1pdCBhdCBtb3N0XG4gICAgICAgKiBvbmUgZW1wdHkgYmxvY2suXG4gICAgICAgKi9cbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfQkxPQ0tfRE9ORSkge1xuICAgICAgaWYgKGZsdXNoID09PSBaX1BBUlRJQUxfRkxVU0gpIHtcbiAgICAgICAgdHJlZXMuX3RyX2FsaWduKHMpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZmx1c2ggIT09IFpfQkxPQ0spIHsgLyogRlVMTF9GTFVTSCBvciBTWU5DX0ZMVVNIICovXG5cbiAgICAgICAgdHJlZXMuX3RyX3N0b3JlZF9ibG9jayhzLCAwLCAwLCBmYWxzZSk7XG4gICAgICAgIC8qIEZvciBhIGZ1bGwgZmx1c2gsIHRoaXMgZW1wdHkgYmxvY2sgd2lsbCBiZSByZWNvZ25pemVkXG4gICAgICAgICAqIGFzIGEgc3BlY2lhbCBtYXJrZXIgYnkgaW5mbGF0ZV9zeW5jKCkuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfRlVMTF9GTFVTSCkge1xuICAgICAgICAgIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqLyAgICAgICAgICAgICAvKiBmb3JnZXQgaGlzdG9yeSAqL1xuICAgICAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICAgICAgcy5zdHJzdGFydCA9IDA7XG4gICAgICAgICAgICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuaW5zZXJ0ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7IC8qIGF2b2lkIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqL1xuICAgICAgICByZXR1cm4gWl9PSztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQoc3RybS0+YXZhaWxfb3V0ID4gMCwgXCJidWcyXCIpO1xuICAvL2lmIChzdHJtLmF2YWlsX291dCA8PSAwKSB7IHRocm93IG5ldyBFcnJvcihcImJ1ZzJcIik7fVxuXG4gIGlmIChmbHVzaCAhPT0gWl9GSU5JU0gpIHsgcmV0dXJuIFpfT0s7IH1cbiAgaWYgKHMud3JhcCA8PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FTkQ7IH1cblxuICAvKiBXcml0ZSB0aGUgdHJhaWxlciAqL1xuICBpZiAocy53cmFwID09PSAyKSB7XG4gICAgcHV0X2J5dGUocywgc3RybS5hZGxlciAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gMTYpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gMjQpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgc3RybS50b3RhbF9pbiAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDgpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gMTYpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gMjQpICYgMHhmZik7XG4gIH1cbiAgZWxzZVxuICB7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpO1xuICB9XG5cbiAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgLyogSWYgYXZhaWxfb3V0IGlzIHplcm8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgZGVmbGF0ZSBhZ2FpblxuICAgKiB0byBmbHVzaCB0aGUgcmVzdC5cbiAgICovXG4gIGlmIChzLndyYXAgPiAwKSB7IHMud3JhcCA9IC1zLndyYXA7IH1cbiAgLyogd3JpdGUgdGhlIHRyYWlsZXIgb25seSBvbmNlISAqL1xuICByZXR1cm4gcy5wZW5kaW5nICE9PSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUVuZChzdHJtKSB7XG4gIHZhciBzdGF0dXM7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0dXMgPSBzdHJtLnN0YXRlLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gSU5JVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRVhUUkFfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IE5BTUVfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IENPTU1FTlRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEhDUkNfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEJVU1lfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEZJTklTSF9TVEFURVxuICApIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKTtcbiAgfVxuXG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuXG4gIHJldHVybiBzdGF0dXMgPT09IEJVU1lfU1RBVEUgPyBlcnIoc3RybSwgWl9EQVRBX0VSUk9SKSA6IFpfT0s7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZVxuICogc2VxdWVuY2Ugd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LlxuICovXG5mdW5jdGlvbiBkZWZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHM7XG4gIHZhciBzdHIsIG47XG4gIHZhciB3cmFwO1xuICB2YXIgYXZhaWw7XG4gIHZhciBuZXh0O1xuICB2YXIgaW5wdXQ7XG4gIHZhciB0bXBEaWN0O1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHdyYXAgPSBzLndyYXA7XG5cbiAgaWYgKHdyYXAgPT09IDIgfHwgKHdyYXAgPT09IDEgJiYgcy5zdGF0dXMgIT09IElOSVRfU1RBVEUpIHx8IHMubG9va2FoZWFkKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogd2hlbiB1c2luZyB6bGliIHdyYXBwZXJzLCBjb21wdXRlIEFkbGVyLTMyIGZvciBwcm92aWRlZCBkaWN0aW9uYXJ5ICovXG4gIGlmICh3cmFwID09PSAxKSB7XG4gICAgLyogYWRsZXIzMihzdHJtLT5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7ICovXG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gIH1cblxuICBzLndyYXAgPSAwOyAgIC8qIGF2b2lkIGNvbXB1dGluZyBBZGxlci0zMiBpbiByZWFkX2J1ZiAqL1xuXG4gIC8qIGlmIGRpY3Rpb25hcnkgd291bGQgZmlsbCB3aW5kb3csIGp1c3QgcmVwbGFjZSB0aGUgaGlzdG9yeSAqL1xuICBpZiAoZGljdExlbmd0aCA+PSBzLndfc2l6ZSkge1xuICAgIGlmICh3cmFwID09PSAwKSB7ICAgICAgICAgICAgLyogYWxyZWFkeSBlbXB0eSBvdGhlcndpc2UgKi9cbiAgICAgIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqL1xuICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuICAgICAgcy5zdHJzdGFydCA9IDA7XG4gICAgICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgICAgIHMuaW5zZXJ0ID0gMDtcbiAgICB9XG4gICAgLyogdXNlIHRoZSB0YWlsICovXG4gICAgLy8gZGljdGlvbmFyeSA9IGRpY3Rpb25hcnkuc2xpY2UoZGljdExlbmd0aCAtIHMud19zaXplKTtcbiAgICB0bXBEaWN0ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUpO1xuICAgIHV0aWxzLmFycmF5U2V0KHRtcERpY3QsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGggLSBzLndfc2l6ZSwgcy53X3NpemUsIDApO1xuICAgIGRpY3Rpb25hcnkgPSB0bXBEaWN0O1xuICAgIGRpY3RMZW5ndGggPSBzLndfc2l6ZTtcbiAgfVxuICAvKiBpbnNlcnQgZGljdGlvbmFyeSBpbnRvIHdpbmRvdyBhbmQgaGFzaCAqL1xuICBhdmFpbCA9IHN0cm0uYXZhaWxfaW47XG4gIG5leHQgPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGRpY3RMZW5ndGg7XG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uaW5wdXQgPSBkaWN0aW9uYXJ5O1xuICBmaWxsX3dpbmRvdyhzKTtcbiAgd2hpbGUgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgIHN0ciA9IHMuc3Ryc3RhcnQ7XG4gICAgbiA9IHMubG9va2FoZWFkIC0gKE1JTl9NQVRDSCAtIDEpO1xuICAgIGRvIHtcbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4gICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuXG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICBzdHIrKztcbiAgICB9IHdoaWxlICgtLW4pO1xuICAgIHMuc3Ryc3RhcnQgPSBzdHI7XG4gICAgcy5sb29rYWhlYWQgPSBNSU5fTUFUQ0ggLSAxO1xuICAgIGZpbGxfd2luZG93KHMpO1xuICB9XG4gIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gIHMuYmxvY2tfc3RhcnQgPSBzLnN0cnN0YXJ0O1xuICBzLmluc2VydCA9IHMubG9va2FoZWFkO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5pbnB1dCA9IGlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gYXZhaWw7XG4gIHMud3JhcCA9IHdyYXA7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmV4cG9ydHMuZGVmbGF0ZUluaXQgPSBkZWZsYXRlSW5pdDtcbmV4cG9ydHMuZGVmbGF0ZUluaXQyID0gZGVmbGF0ZUluaXQyO1xuZXhwb3J0cy5kZWZsYXRlUmVzZXQgPSBkZWZsYXRlUmVzZXQ7XG5leHBvcnRzLmRlZmxhdGVSZXNldEtlZXAgPSBkZWZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5kZWZsYXRlU2V0SGVhZGVyID0gZGVmbGF0ZVNldEhlYWRlcjtcbmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGVFbmQgPSBkZWZsYXRlRW5kO1xuZXhwb3J0cy5kZWZsYXRlU2V0RGljdGlvbmFyeSA9IGRlZmxhdGVTZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5kZWZsYXRlSW5mbyA9ICdwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpJztcblxuLyogTm90IGltcGxlbWVudGVkXG5leHBvcnRzLmRlZmxhdGVCb3VuZCA9IGRlZmxhdGVCb3VuZDtcbmV4cG9ydHMuZGVmbGF0ZUNvcHkgPSBkZWZsYXRlQ29weTtcbmV4cG9ydHMuZGVmbGF0ZVBhcmFtcyA9IGRlZmxhdGVQYXJhbXM7XG5leHBvcnRzLmRlZmxhdGVQZW5kaW5nID0gZGVmbGF0ZVBlbmRpbmc7XG5leHBvcnRzLmRlZmxhdGVQcmltZSA9IGRlZmxhdGVQcmltZTtcbmV4cG9ydHMuZGVmbGF0ZVR1bmUgPSBkZWZsYXRlVHVuZTtcbiovXG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gR1poZWFkZXIoKSB7XG4gIC8qIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHQgKi9cbiAgdGhpcy50ZXh0ICAgICAgID0gMDtcbiAgLyogbW9kaWZpY2F0aW9uIHRpbWUgKi9cbiAgdGhpcy50aW1lICAgICAgID0gMDtcbiAgLyogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi9cbiAgdGhpcy54ZmxhZ3MgICAgID0gMDtcbiAgLyogb3BlcmF0aW5nIHN5c3RlbSAqL1xuICB0aGlzLm9zICAgICAgICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIGV4dHJhIGZpZWxkIG9yIFpfTlVMTCBpZiBub25lICovXG4gIHRoaXMuZXh0cmEgICAgICA9IG51bGw7XG4gIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqL1xuICB0aGlzLmV4dHJhX2xlbiAgPSAwOyAvLyBBY3R1YWxseSwgd2UgZG9uJ3QgbmVlZCBpdCBpbiBKUyxcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGxlYXZlIGZvciBmZXcgY29kZSBtb2RpZmljYXRpb25zXG5cbiAgLy9cbiAgLy8gU2V0dXAgbGltaXRzIGlzIG5vdCBuZWNlc3NhcnkgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeVxuICAvLyBmb3IgaW5mbGF0ZSB1c2UgY29uc3RhbnQgbGltaXQgaW4gNjU1MzYgYnl0ZXNcbiAgLy9cblxuICAvKiBzcGFjZSBhdCBleHRyYSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmV4dHJhX21heCAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBmaWxlIG5hbWUgb3IgWl9OVUxMICovXG4gIHRoaXMubmFtZSAgICAgICA9ICcnO1xuICAvKiBzcGFjZSBhdCBuYW1lIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMubmFtZV9tYXggICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGNvbW1lbnQgb3IgWl9OVUxMICovXG4gIHRoaXMuY29tbWVudCAgICA9ICcnO1xuICAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuY29tbV9tYXggICA9IDA7XG4gIC8qIHRydWUgaWYgdGhlcmUgd2FzIG9yIHdpbGwgYmUgYSBoZWFkZXIgY3JjICovXG4gIHRoaXMuaGNyYyAgICAgICA9IDA7XG4gIC8qIHRydWUgd2hlbiBkb25lIHJlYWRpbmcgZ3ppcCBoZWFkZXIgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi9cbiAgdGhpcy5kb25lICAgICAgID0gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR1poZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuLy8gU2VlIHN0YXRlIGRlZnMgZnJvbSBpbmZsYXRlLmpzXG52YXIgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xuXG4vKlxuICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZ1xuICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzXG4gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvclxuICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZVxuICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuXG5cbiAgIEVudHJ5IGFzc3VtcHRpb25zOlxuXG4gICAgICAgIHN0YXRlLm1vZGUgPT09IExFTlxuICAgICAgICBzdHJtLmF2YWlsX2luID49IDZcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPj0gMjU4XG4gICAgICAgIHN0YXJ0ID49IHN0cm0uYXZhaWxfb3V0XG4gICAgICAgIHN0YXRlLmJpdHMgPCA4XG5cbiAgIE9uIHJldHVybiwgc3RhdGUubW9kZSBpcyBvbmUgb2Y6XG5cbiAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0XG4gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrXG4gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhXG5cbiAgIE5vdGVzOlxuXG4gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGVcbiAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLFxuICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy5cbiAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkXG4gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLlxuXG4gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4XG4gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KClcbiAgICAgIHJlcXVpcmVzIHN0cm0uYXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvclxuICAgICAgb3V0cHV0IHNwYWNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmlucHV0ICovXG4gIHZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBoYXZlIGVub3VnaCBpbnB1dCB3aGlsZSBpbiA8IGxhc3QgKi9cbiAgdmFyIF9vdXQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi9cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIHZhciBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi9cbi8vI2VuZGlmXG4gIHZhciB3c2l6ZTsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdmFyIHdoYXZlOyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdmFyIHduZXh0OyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICAvLyBVc2UgYHNfd2luZG93YCBpbnN0ZWFkIGB3aW5kb3dgLCBhdm9pZCBjb25mbGljdCB3aXRoIGluc3RydW1lbnRhdGlvbiB0b29sc1xuICB2YXIgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmhvbGQgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uYml0cyAqL1xuICB2YXIgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovXG4gIHZhciBkY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmRpc3Rjb2RlICovXG4gIHZhciBsbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi9cbiAgdmFyIGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovXG4gIHZhciBoZXJlOyAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi9cbiAgdmFyIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovXG4gIHZhciBkaXN0OyAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcblxuXG4gIHZhciBpbnB1dCwgb3V0cHV0OyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG5cbiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi9cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICAvL2hlcmUgPSBzdGF0ZS5oZXJlO1xuICBfaW4gPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7XG4gIF9vdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTtcbiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICBkbWF4ID0gc3RhdGUuZG1heDtcbi8vI2VuZGlmXG4gIHdzaXplID0gc3RhdGUud3NpemU7XG4gIHdoYXZlID0gc3RhdGUud2hhdmU7XG4gIHduZXh0ID0gc3RhdGUud25leHQ7XG4gIHNfd2luZG93ID0gc3RhdGUud2luZG93O1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIGxjb2RlID0gc3RhdGUubGVuY29kZTtcbiAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTtcbiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7XG4gIGRtYXNrID0gKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMTtcblxuXG4gIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaFxuICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqL1xuXG4gIHRvcDpcbiAgZG8ge1xuICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgIH1cblxuICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdO1xuXG4gICAgZG9sZW46XG4gICAgZm9yICg7OykgeyAvLyBHb3RvIGVtdWxhdGlvblxuICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICBob2xkID4+Pj0gb3A7XG4gICAgICBiaXRzIC09IG9wO1xuICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuICAgICAgaWYgKG9wID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqL1xuICAgICAgICBsZW4gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICBpZiAob3ApIHtcbiAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBsZW4pKTtcbiAgICAgICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdO1xuXG4gICAgICAgIGRvZGlzdDpcbiAgICAgICAgZm9yICg7OykgeyAvLyBnb3RvIGVtdWxhdGlvblxuICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcblxuICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi9cbiAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBkaXN0KSk7XG4gICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7ICAgICAgICAgICAgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi9cbiAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgICAgICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYXVsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gb3AgLSB3aGF2ZSkge1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgIGxlbiAtPSBvcCAtIHdoYXZlO1xuLy8gICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpO1xuLy8gICAgICAgICAgICAgICAgaWYgKG9wID09PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmcm9tID0gMDsgLy8gd2luZG93IGluZGV4XG4gICAgICAgICAgICAgIGZyb21fc291cmNlID0gc193aW5kb3c7XG4gICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHduZXh0IDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSAwO1xuICAgICAgICAgICAgICAgICAgaWYgKHduZXh0IDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICAgIG9wID0gd25leHQ7XG4gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgICAgIC8qIGNvcHkgZGlyZWN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqL1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTtcbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICAgICAgaGVyZSA9IGRjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgICAgICBjb250aW51ZSBkb2Rpc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgIGNvbnRpbnVlIGRvbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuXG4gICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgIH1cbiAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTtcblxuICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi9cbiAgbGVuID0gYml0cyA+PiAzO1xuICBfaW4gLT0gbGVuO1xuICBiaXRzIC09IGxlbiA8PCAzO1xuICBob2xkICY9ICgxIDw8IGJpdHMpIC0gMTtcblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqL1xuICBzdHJtLm5leHRfaW4gPSBfaW47XG4gIHN0cm0ubmV4dF9vdXQgPSBfb3V0O1xuICBzdHJtLmF2YWlsX2luID0gKF9pbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBfaW4pIDogNSAtIChfaW4gLSBsYXN0KSk7XG4gIHN0cm0uYXZhaWxfb3V0ID0gKF9vdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gX291dCkgOiAyNTcgLSAoX291dCAtIGVuZCkpO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIHJldHVybjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzICAgICAgICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciBhZGxlcjMyICAgICAgID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICAgICAgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBpbmZsYXRlX2Zhc3QgID0gcmVxdWlyZSgnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IHJlcXVpcmUoJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24genN3YXAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA1OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7XG5cbiAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqL1xuICAgIHZpcmdpbiA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDtcbiAgc3RhdGUubGVuYml0cyA9IDk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gZGlzdGZpeDtcbiAgc3RhdGUuZGlzdGJpdHMgPSA1O1xufVxuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHtcbiAgdmFyIGRpc3Q7XG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqL1xuICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7XG4gICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IDA7XG5cbiAgICBzdGF0ZS53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzdGF0ZS53c2l6ZSk7XG4gIH1cblxuICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi9cbiAgaWYgKGNvcHkgPj0gc3RhdGUud3NpemUpIHtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTtcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDtcbiAgICBpZiAoZGlzdCA+IGNvcHkpIHtcbiAgICAgIGRpc3QgPSBjb3B5O1xuICAgIH1cbiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTtcbiAgICAgIHN0YXRlLnduZXh0ID0gY29weTtcbiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsgc3RhdGUud25leHQgPSAwOyB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgdXRpbHMuQnVmOCg0KTsgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgICAgY2FzZSBIRUFEOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCA9PT0gMCkge1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmICgoc3RhdGUud3JhcCAmIDIpICYmIGhvbGQgPT09IDB4OGIxZikgeyAgLyogZ3ppcCBoZWFkZXIgKi9cbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cblxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShzdGF0ZS53cmFwICYgMSkgfHwgICAvKiBjaGVjayBpZiB6bGliIGhlYWRlciBhbGxvd2VkICovXG4gICAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChob2xkICYgMHgwZikvKkJJVFMoNCkqLyAhPT0gWl9ERUZMQVRFRCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgICBiaXRzIC09IDQ7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgbGVuID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgODtcbiAgICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgICAgc3RhdGUud2JpdHMgPSBsZW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmRtYXggPSAxIDw8IGxlbjtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICBzdGF0ZS5tb2RlID0gaG9sZCAmIDB4MjAwID8gRElDVElEIDogVFlQRTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGTEFHUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmZsYWdzID0gaG9sZDtcbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHhlMDAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50ZXh0ID0gKChob2xkID4+IDgpICYgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVElNRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDQsIDApO1xuICAgICAgICAgIC8vPT09XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBPUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRVhMRU47XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhMRU46XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZDtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhUUkE6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmhlYWQuZXh0cmFfbGVuIC0gc3RhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW50IHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbmV3IEFycmF5KHN0YXRlLmhlYWQuZXh0cmFfbGVuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1dGlscy5hcnJheVNldChcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgICAgLy8gZXh0cmEgZmllbGQgaXMgbGltaXRlZCB0byA2NTUzNiBieXRlc1xuICAgICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgICAvKmxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA/IHN0YXRlLmhlYWQuZXh0cmFfbWF4IDogY29weSwqL1xuICAgICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvL3ptZW1jcHkoc3RhdGUuaGVhZC5leHRyYSArIGxlbiwgbmV4dCxcbiAgICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE5BTUU6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGNvcHkgPSAwO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIFRPRE86IDIgb3IgMSBieXRlcz9cbiAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT01NRU5UOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBjb3B5ID0gMDtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8pKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIEhDUkM6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuaGNyYyA9ICgoc3RhdGUuZmxhZ3MgPj4gOSkgJiAxKTtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRElDVElEOlxuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0genN3YXAzMihob2xkKTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJQ1Q6XG4gICAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAgIC8vLS0tXG4gICAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRTpcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIFRZUEVETzpcbiAgICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxhc3QgPSAoaG9sZCAmIDB4MDEpLypCSVRTKDEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAxO1xuICAgICAgICBiaXRzIC09IDE7XG4gICAgICAgIC8vLS0tLy9cblxuICAgICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykge1xuICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGZpeGVkIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTVE9SRUQ6XG4gICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy8gLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqL1xuICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT09ICgoaG9sZCA+Pj4gMTYpIF4gMHhmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZCAmIDB4ZmZmZjtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT1BZXztcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFlfOlxuICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT1BZOlxuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgICAgIGlmIChjb3B5ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgICAgdXRpbHMuYXJyYXlTZXQob3V0cHV0LCBpbnB1dCwgbmV4dCwgY29weSwgcHV0KTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUQUJMRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm5sZW4gPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAyNTc7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg1KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNTtcbiAgICAgICAgYml0cyAtPSA1O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICAgIGlmIChzdGF0ZS5ubGVuID4gMjg2IHx8IHN0YXRlLm5kaXN0ID4gMzApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5MRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAgIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG4gICAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gNztcblxuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT0RFTEVOUzpcbiAgICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBoZXJlX3ZhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaGVyZV92YWwgPT09IDE2KSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgNyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoNykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi9cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgeyBicmVhazsgfVxuXG4gICAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgICBpZiAoc3RhdGUubGVuc1syNTZdID09PSAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUubGVuYml0cyB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgICAgLy8gc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjtcbiAgICAgICAgLy9zdGF0ZS5kaXN0Y29kZS5jb3B5KHN0YXRlLmNvZGVzKTtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjtcbiAgICAgICAgb3B0cyA9IHsgYml0czogc3RhdGUuZGlzdGJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOXzpcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU46XG4gICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgICAvLy0tLVxuICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTtcbiAgICAgICAgICAvLy0tLSBMT0FEKCkgLS0tXG4gICAgICAgICAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gICAgICAgICAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gICAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gICAgICAgICAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gICAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7XG4gICAgICAgICAgLy8tLS1cblxuICAgICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7XG4gICAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmJhY2sgPSAwO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgICAgc3RhdGUubGVuZ3RoID0gaGVyZV92YWw7XG4gICAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkVYVDpcbiAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElTVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESVNUOlxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgICBzdGF0ZS5leHRyYSA9IChoZXJlX29wKSAmIDE1O1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESVNURVhUOlxuICAgICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgICB9XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gc3RhdGUuZG1heCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTUFUQ0g7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTUFUQ0g6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBjb3B5ID0gX291dCAtIGxlZnQ7XG4gICAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5vZmZzZXQgLSBjb3B5O1xuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICBUcmFjZSgoc3RkZXJyLCBcImluZmxhdGUuYyB0b28gZmFyXFxuXCIpKTtcbi8vICAgICAgICAgIGNvcHkgLT0gc3RhdGUud2hhdmU7XG4vLyAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4vLyAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbi8vICAgICAgICAgIGxlZnQgLT0gY29weTtcbi8vICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuLy8gICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICBvdXRwdXRbcHV0KytdID0gMDtcbi8vICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4vLyAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbi8vICAgICAgICAgIGJyZWFrO1xuLy8jZW5kaWZcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgICAgY29weSAtPSBzdGF0ZS53bmV4dDtcbiAgICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuICAgICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0O1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBvdXRwdXRbcHV0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMSVQ6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBvdXRwdXRbcHV0KytdID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBsZWZ0LS07XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDSEVDSzpcbiAgICAgICAgaWYgKHN0YXRlLndyYXApIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAvLyBVc2UgJ3wnIGluc3RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgX291dCAtPSBsZWZ0O1xuICAgICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgICBpZiAoX291dCkge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkpO1xuXG4gICAgICAgICAgfVxuICAgICAgICAgIF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIC8vIE5COiBjcmMzMiBzdG9yZWQgYXMgc2lnbmVkIDMyLWJpdCBpbnQsIHpzd2FwMzIgcmV0dXJucyBzaWduZWQgdG9vXG4gICAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkdUSDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5HVEg6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwICYmIHN0YXRlLmZsYWdzKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLnRvdGFsICYgMHhmZmZmZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRE9ORTpcbiAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIEJBRDpcbiAgICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIE1FTTpcbiAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgICAgY2FzZSBTWU5DOlxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5mX2xlYXZlIDwtIGhlcmUgaXMgcmVhbCBwbGFjZSBmb3IgXCJnb3RvIGluZl9sZWF2ZVwiLCBlbXVsYXRlZCB2aWEgXCJicmVhayBpbmZfbGVhdmVcIlxuXG4gIC8qXG4gICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLlxuICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyXG4gICAgIGVycm9yLiAgQ2FsbCB1cGRhdGV3aW5kb3coKSB0byBjcmVhdGUgYW5kL29yIHVwZGF0ZSB0aGUgd2luZG93IHN0YXRlLlxuICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuXG4gICAqL1xuXG4gIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAvLy0tLVxuXG4gIGlmIChzdGF0ZS53c2l6ZSB8fCAoX291dCAhPT0gc3RybS5hdmFpbF9vdXQgJiYgc3RhdGUubW9kZSA8IEJBRCAmJlxuICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT09IFpfRklOSVNIKSkpIHtcbiAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0LCBfb3V0IC0gc3RybS5hdmFpbF9vdXQpKSB7XG4gICAgICBzdGF0ZS5tb2RlID0gTUVNO1xuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIH1cbiAgfVxuICBfaW4gLT0gc3RybS5hdmFpbF9pbjtcbiAgX291dCAtPSBzdHJtLmF2YWlsX291dDtcbiAgc3RybS50b3RhbF9pbiArPSBfaW47XG4gIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gIGlmIChzdGF0ZS53cmFwICYmIF9vdXQpIHtcbiAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAvKlVQREFURShzdGF0ZS5jaGVjaywgc3RybS5uZXh0X291dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSk7XG4gIH1cbiAgc3RybS5kYXRhX3R5cGUgPSBzdGF0ZS5iaXRzICsgKHN0YXRlLmxhc3QgPyA2NCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IFRZUEUgPyAxMjggOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBMRU5fIHx8IHN0YXRlLm1vZGUgPT09IENPUFlfID8gMjU2IDogMCk7XG4gIGlmICgoKF9pbiA9PT0gMCAmJiBfb3V0ID09PSAwKSB8fCBmbHVzaCA9PT0gWl9GSU5JU0gpICYmIHJldCA9PT0gWl9PSykge1xuICAgIHJldCA9IFpfQlVGX0VSUk9SO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVFbmQoc3RybSkge1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSAvKnx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKHN0YXRlLndpbmRvdykge1xuICAgIHN0YXRlLndpbmRvdyA9IG51bGw7XG4gIH1cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlR2V0SGVhZGVyKHN0cm0sIGhlYWQpIHtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoKHN0YXRlLndyYXAgJiAyKSA9PT0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cblxuICAvKiBzYXZlIGhlYWRlciBzdHJ1Y3R1cmUgKi9cbiAgc3RhdGUuaGVhZCA9IGhlYWQ7XG4gIGhlYWQuZG9uZSA9IGZhbHNlO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzdGF0ZTtcbiAgdmFyIGRpY3RpZDtcbiAgdmFyIHJldDtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gLyogPT0gWl9OVUxMICovIHx8ICFzdHJtLnN0YXRlIC8qID09IFpfTlVMTCAqLykgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIGlmIChzdGF0ZS53cmFwICE9PSAwICYmIHN0YXRlLm1vZGUgIT09IERJQ1QpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiBjaGVjayBmb3IgY29ycmVjdCBkaWN0aW9uYXJ5IGlkZW50aWZpZXIgKi9cbiAgaWYgKHN0YXRlLm1vZGUgPT09IERJQ1QpIHtcbiAgICBkaWN0aWQgPSAxOyAvKiBhZGxlcjMyKDAsIG51bGwsIDApKi9cbiAgICAvKiBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7ICovXG4gICAgZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICAgIGlmIChkaWN0aWQgIT09IHN0YXRlLmNoZWNrKSB7XG4gICAgICByZXR1cm4gWl9EQVRBX0VSUk9SO1xuICAgIH1cbiAgfVxuICAvKiBjb3B5IGRpY3Rpb25hcnkgdG8gd2luZG93IHVzaW5nIHVwZGF0ZXdpbmRvdygpLCB3aGljaCB3aWxsIGFtZW5kIHRoZVxuICAgZXhpc3RpbmcgZGljdGlvbmFyeSBpZiBhcHByb3ByaWF0ZSAqL1xuICByZXQgPSB1cGRhdGV3aW5kb3coc3RybSwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgZGljdExlbmd0aCk7XG4gIGlmIChyZXQpIHtcbiAgICBzdGF0ZS5tb2RlID0gTUVNO1xuICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgfVxuICBzdGF0ZS5oYXZlZGljdCA9IDE7XG4gIC8vIFRyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgZGljdGlvbmFyeSBzZXRcXG5cIikpO1xuICByZXR1cm4gWl9PSztcbn1cblxuZXhwb3J0cy5pbmZsYXRlUmVzZXQgPSBpbmZsYXRlUmVzZXQ7XG5leHBvcnRzLmluZmxhdGVSZXNldDIgPSBpbmZsYXRlUmVzZXQyO1xuZXhwb3J0cy5pbmZsYXRlUmVzZXRLZWVwID0gaW5mbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuaW5mbGF0ZUluaXQgPSBpbmZsYXRlSW5pdDtcbmV4cG9ydHMuaW5mbGF0ZUluaXQyID0gaW5mbGF0ZUluaXQyO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZUVuZCA9IGluZmxhdGVFbmQ7XG5leHBvcnRzLmluZmxhdGVHZXRIZWFkZXIgPSBpbmZsYXRlR2V0SGVhZGVyO1xuZXhwb3J0cy5pbmZsYXRlU2V0RGljdGlvbmFyeSA9IGluZmxhdGVTZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlSW5mbyA9ICdwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpJztcblxuLyogTm90IGltcGxlbWVudGVkXG5leHBvcnRzLmluZmxhdGVDb3B5ID0gaW5mbGF0ZUNvcHk7XG5leHBvcnRzLmluZmxhdGVHZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZUdldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVNYXJrID0gaW5mbGF0ZU1hcms7XG5leHBvcnRzLmluZmxhdGVQcmltZSA9IGluZmxhdGVQcmltZTtcbmV4cG9ydHMuaW5mbGF0ZVN5bmMgPSBpbmZsYXRlU3luYztcbmV4cG9ydHMuaW5mbGF0ZVN5bmNQb2ludCA9IGluZmxhdGVTeW5jUG9pbnQ7XG5leHBvcnRzLmluZmxhdGVVbmRlcm1pbmUgPSBpbmZsYXRlVW5kZXJtaW5lO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxudmFyIE1BWEJJVFMgPSAxNTtcbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbnZhciBsYmFzZSA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGJhc2UgKi9cbiAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSxcbiAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDBcbl07XG5cbnZhciBsZXh0ID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsXG4gIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCA3MiwgNzhcbl07XG5cbnZhciBkYmFzZSA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqL1xuICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsXG4gIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSxcbiAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMCwgMFxuXTtcblxudmFyIGRleHQgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjIsIDIyLFxuICAyMywgMjMsIDI0LCAyNCwgMjUsIDI1LCAyNiwgMjYsIDI3LCAyNyxcbiAgMjgsIDI4LCAyOSwgMjksIDY0LCA2NFxuXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX3RhYmxlKHR5cGUsIGxlbnMsIGxlbnNfaW5kZXgsIGNvZGVzLCB0YWJsZSwgdGFibGVfaW5kZXgsIHdvcmssIG9wdHMpXG57XG4gIHZhciBiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy9oZXJlID0gb3B0cy5oZXJlOyAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi9cblxuICB2YXIgbGVuID0gMDsgICAgICAgICAgICAgICAvKiBhIGNvZGUncyBsZW5ndGggaW4gYml0cyAqL1xuICB2YXIgc3ltID0gMDsgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBjb2RlIHN5bWJvbHMgKi9cbiAgdmFyIG1pbiA9IDAsIG1heCA9IDA7ICAgICAgICAgIC8qIG1pbmltdW0gYW5kIG1heGltdW0gY29kZSBsZW5ndGhzICovXG4gIHZhciByb290ID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciByb290IHRhYmxlICovXG4gIHZhciBjdXJyID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciBjdXJyZW50IHRhYmxlICovXG4gIHZhciBkcm9wID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgYml0cyB0byBkcm9wIGZvciBzdWItdGFibGUgKi9cbiAgdmFyIGxlZnQgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcHJlZml4IGNvZGVzIGF2YWlsYWJsZSAqL1xuICB2YXIgdXNlZCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGVudHJpZXMgaW4gdGFibGUgdXNlZCAqL1xuICB2YXIgaHVmZiA9IDA7ICAgICAgICAgICAgICAvKiBIdWZmbWFuIGNvZGUgKi9cbiAgdmFyIGluY3I7ICAgICAgICAgICAgICAvKiBmb3IgaW5jcmVtZW50aW5nIGNvZGUsIGluZGV4ICovXG4gIHZhciBmaWxsOyAgICAgICAgICAgICAgLyogaW5kZXggZm9yIHJlcGxpY2F0aW5nIGVudHJpZXMgKi9cbiAgdmFyIGxvdzsgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5ICovXG4gIHZhciBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgbG93IHJvb3QgYml0cyAqL1xuICB2YXIgbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gdGFibGUgKi9cbiAgdmFyIGJhc2UgPSBudWxsOyAgICAgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi9cbiAgdmFyIGJhc2VfaW5kZXggPSAwO1xuLy8gIHZhciBzaG9leHRyYTsgICAgLyogZXh0cmEgYml0cyB0YWJsZSB0byB1c2UgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBiYXNlIGFuZCBleHRyYSBmb3Igc3ltYm9sID4gZW5kICovXG4gIHZhciBjb3VudCA9IG5ldyB1dGlscy5CdWYxNihNQVhCSVRTICsgMSk7IC8vW01BWEJJVFMrMV07ICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqL1xuICB2YXIgb2ZmcyA9IG5ldyB1dGlscy5CdWYxNihNQVhCSVRTICsgMSk7IC8vW01BWEJJVFMrMV07ICAgICAvKiBvZmZzZXRzIGluIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqL1xuICB2YXIgZXh0cmEgPSBudWxsO1xuICB2YXIgZXh0cmFfaW5kZXggPSAwO1xuXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsO1xuXG4gIC8qXG4gICBQcm9jZXNzIGEgc2V0IG9mIGNvZGUgbGVuZ3RocyB0byBjcmVhdGUgYSBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLiAgVGhlXG4gICBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBFYWNoIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGVcbiAgIHN5bWJvbHMgMC4uY29kZXMtMS4gIFRoZSBIdWZmbWFuIGNvZGUgaXMgZ2VuZXJhdGVkIGJ5IGZpcnN0IHNvcnRpbmcgdGhlXG4gICBzeW1ib2xzIGJ5IGxlbmd0aCBmcm9tIHNob3J0IHRvIGxvbmcsIGFuZCByZXRhaW5pbmcgdGhlIHN5bWJvbCBvcmRlclxuICAgZm9yIGNvZGVzIHdpdGggZXF1YWwgbGVuZ3Rocy4gIFRoZW4gdGhlIGNvZGUgc3RhcnRzIHdpdGggYWxsIHplcm8gYml0c1xuICAgZm9yIHRoZSBmaXJzdCBjb2RlIG9mIHRoZSBzaG9ydGVzdCBsZW5ndGgsIGFuZCB0aGUgY29kZXMgYXJlIGludGVnZXJcbiAgIGluY3JlbWVudHMgZm9yIHRoZSBzYW1lIGxlbmd0aCwgYW5kIHplcm9zIGFyZSBhcHBlbmRlZCBhcyB0aGUgbGVuZ3RoXG4gICBpbmNyZWFzZXMuICBGb3IgdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVzZSBiaXRzIGFyZSBzdG9yZWQgYmFja3dhcmRzXG4gICBmcm9tIHRoZWlyIG1vcmUgbmF0dXJhbCBpbnRlZ2VyIGluY3JlbWVudCBvcmRlcmluZywgYW5kIHNvIHdoZW4gdGhlXG4gICBkZWNvZGluZyB0YWJsZXMgYXJlIGJ1aWx0IGluIHRoZSBsYXJnZSBsb29wIGJlbG93LCB0aGUgaW50ZWdlciBjb2Rlc1xuICAgYXJlIGluY3JlbWVudGVkIGJhY2t3YXJkcy5cblxuICAgVGhpcyByb3V0aW5lIGFzc3VtZXMsIGJ1dCBkb2VzIG5vdCBjaGVjaywgdGhhdCBhbGwgb2YgdGhlIGVudHJpZXMgaW5cbiAgIGxlbnNbXSBhcmUgaW4gdGhlIHJhbmdlIDAuLk1BWEJJVFMuICBUaGUgY2FsbGVyIG11c3QgYXNzdXJlIHRoaXMuXG4gICAxLi5NQVhCSVRTIGlzIGludGVycHJldGVkIGFzIHRoYXQgY29kZSBsZW5ndGguICB6ZXJvIG1lYW5zIHRoYXQgdGhhdFxuICAgc3ltYm9sIGRvZXMgbm90IG9jY3VyIGluIHRoaXMgY29kZS5cblxuICAgVGhlIGNvZGVzIGFyZSBzb3J0ZWQgYnkgY29tcHV0aW5nIGEgY291bnQgb2YgY29kZXMgZm9yIGVhY2ggbGVuZ3RoLFxuICAgY3JlYXRpbmcgZnJvbSB0aGF0IGEgdGFibGUgb2Ygc3RhcnRpbmcgaW5kaWNlcyBmb3IgZWFjaCBsZW5ndGggaW4gdGhlXG4gICBzb3J0ZWQgdGFibGUsIGFuZCB0aGVuIGVudGVyaW5nIHRoZSBzeW1ib2xzIGluIG9yZGVyIGluIHRoZSBzb3J0ZWRcbiAgIHRhYmxlLiAgVGhlIHNvcnRlZCB0YWJsZSBpcyB3b3JrW10sIHdpdGggdGhhdCBzcGFjZSBiZWluZyBwcm92aWRlZCBieVxuICAgdGhlIGNhbGxlci5cblxuICAgVGhlIGxlbmd0aCBjb3VudHMgYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzIGFzIHdlbGwsIGkuZS4gZmluZGluZ1xuICAgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RoIGNvZGVzLCBkZXRlcm1pbmluZyBpZiB0aGVyZSBhcmUgYW55XG4gICBjb2RlcyBhdCBhbGwsIGNoZWNraW5nIGZvciBhIHZhbGlkIHNldCBvZiBsZW5ndGhzLCBhbmQgbG9va2luZyBhaGVhZFxuICAgYXQgbGVuZ3RoIGNvdW50cyB0byBkZXRlcm1pbmUgc3ViLXRhYmxlIHNpemVzIHdoZW4gYnVpbGRpbmcgdGhlXG4gICBkZWNvZGluZyB0YWJsZXMuXG4gICAqL1xuXG4gIC8qIGFjY3VtdWxhdGUgbGVuZ3RocyBmb3IgY29kZXMgKGFzc3VtZXMgbGVuc1tdIGFsbCBpbiAwLi5NQVhCSVRTKSAqL1xuICBmb3IgKGxlbiA9IDA7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGNvdW50W2xlbl0gPSAwO1xuICB9XG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgY291bnRbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rKztcbiAgfVxuXG4gIC8qIGJvdW5kIGNvZGUgbGVuZ3RocywgZm9yY2Ugcm9vdCB0byBiZSB3aXRoaW4gY29kZSBsZW5ndGhzICovXG4gIHJvb3QgPSBiaXRzO1xuICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkge1xuICAgIGlmIChjb3VudFttYXhdICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPiBtYXgpIHtcbiAgICByb290ID0gbWF4O1xuICB9XG4gIGlmIChtYXggPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAvKiBubyBzeW1ib2xzIHRvIGNvZGUgYXQgYWxsICovXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0OyAgLy9oZXJlLm9wID0gKHZhciBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTsgICAvL2hlcmUuYml0cyA9ICh2YXIgY2hhcikxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwOyAgIC8vaGVyZS52YWwgPSAodmFyIHNob3J0KTA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0O1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuICAgIG9wdHMuYml0cyA9IDE7XG4gICAgcmV0dXJuIDA7ICAgICAvKiBubyBzeW1ib2xzLCBidXQgd2FpdCBmb3IgZGVjb2RpbmcgdG8gcmVwb3J0IGVycm9yICovXG4gIH1cbiAgZm9yIChtaW4gPSAxOyBtaW4gPCBtYXg7IG1pbisrKSB7XG4gICAgaWYgKGNvdW50W21pbl0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA8IG1pbikge1xuICAgIHJvb3QgPSBtaW47XG4gIH1cblxuICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi9cbiAgbGVmdCA9IDE7XG4gIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgbGVmdCA8PD0gMTtcbiAgICBsZWZ0IC09IGNvdW50W2xlbl07XG4gICAgaWYgKGxlZnQgPCAwKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkICovXG4gIH1cbiAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09PSBDT0RFUyB8fCBtYXggIT09IDEpKSB7XG4gICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIHNldCAqL1xuICB9XG5cbiAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi9cbiAgb2Zmc1sxXSA9IDA7XG4gIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspIHtcbiAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgY291bnRbbGVuXTtcbiAgfVxuXG4gIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi9cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBpZiAobGVuc1tsZW5zX2luZGV4ICsgc3ltXSAhPT0gMCkge1xuICAgICAgd29ya1tvZmZzW2xlbnNbbGVuc19pbmRleCArIHN5bV1dKytdID0gc3ltO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBDcmVhdGUgYW5kIGZpbGwgaW4gZGVjb2RpbmcgdGFibGVzLiAgSW4gdGhpcyBsb29wLCB0aGUgdGFibGUgYmVpbmdcbiAgIGZpbGxlZCBpcyBhdCBuZXh0IGFuZCBoYXMgY3VyciBpbmRleCBiaXRzLiAgVGhlIGNvZGUgYmVpbmcgdXNlZCBpcyBodWZmXG4gICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3BcbiAgIGJpdHMgb2ZmIG9mIHRoZSBib3R0b20uICBGb3IgY29kZXMgd2hlcmUgbGVuIGlzIGxlc3MgdGhhbiBkcm9wICsgY3VycixcbiAgIHRob3NlIHRvcCBkcm9wICsgY3VyciAtIGxlbiBiaXRzIGFyZSBpbmNyZW1lbnRlZCB0aHJvdWdoIGFsbCB2YWx1ZXMgdG9cbiAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLlxuXG4gICByb290IGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgdGhlIHJvb3QgdGFibGUuICBXaGVuIGxlbiBleGNlZWRzXG4gICByb290LCBzdWItdGFibGVzIGFyZSBjcmVhdGVkIHBvaW50ZWQgdG8gYnkgdGhlIHJvb3QgZW50cnkgd2l0aCBhbiBpbmRleFxuICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGFcbiAgIG5ldyBzdWItdGFibGUgc2hvdWxkIGJlIHN0YXJ0ZWQuICBkcm9wIGlzIHplcm8gd2hlbiB0aGUgcm9vdCB0YWJsZSBpc1xuICAgYmVpbmcgZmlsbGVkLCBhbmQgZHJvcCBpcyByb290IHdoZW4gc3ViLXRhYmxlcyBhcmUgYmVpbmcgZmlsbGVkLlxuXG4gICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZVxuICAgY29kZSBsZW5ndGhzIHRvIGRldGVybWluZSB3aGF0IHNpemUgc3ViLXRhYmxlIGlzIG5lZWRlZC4gIFRoZSBsZW5ndGhcbiAgIGNvdW50cyBhcmUgdXNlZCBmb3IgdGhpcywgYW5kIHNvIGNvdW50W10gaXMgZGVjcmVtZW50ZWQgYXMgY29kZXMgYXJlXG4gICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuXG5cbiAgIHVzZWQga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdGFibGUgZW50cmllcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlXG4gICBwcm92aWRlZCAqdGFibGUgc3BhY2UuICBJdCBpcyBjaGVja2VkIGZvciBMRU5TIGFuZCBESVNUIHRhYmxlcyBhZ2FpbnN0XG4gICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluXG4gICB0aGUgaW5pdGlhbCByb290IHRhYmxlIHNpemUgY29uc3RhbnRzLiAgU2VlIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlblxuICAgYWxsIGNvZGVzIG9mIGxlbmd0aCBtYXgsIGkuZS4gYWxsIGNvZGVzLCBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhpc1xuICAgcm91dGluZSBwZXJtaXRzIGluY29tcGxldGUgY29kZXMsIHNvIGFub3RoZXIgbG9vcCBhZnRlciB0aGlzIG9uZSBmaWxsc1xuICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLlxuICAgKi9cblxuICAvKiBzZXQgdXAgZm9yIGNvZGUgdHlwZSAqL1xuICAvLyBwb29yIG1hbiBvcHRpbWl6YXRpb24gLSB1c2UgaWYtZWxzZSBpbnN0ZWFkIG9mIHN3aXRjaCxcbiAgLy8gdG8gYXZvaWQgZGVvcHRzIGluIG9sZCB2OFxuICBpZiAodHlwZSA9PT0gQ09ERVMpIHtcbiAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi9cbiAgICBlbmQgPSAxOTtcblxuICB9IGVsc2UgaWYgKHR5cGUgPT09IExFTlMpIHtcbiAgICBiYXNlID0gbGJhc2U7XG4gICAgYmFzZV9pbmRleCAtPSAyNTc7XG4gICAgZXh0cmEgPSBsZXh0O1xuICAgIGV4dHJhX2luZGV4IC09IDI1NztcbiAgICBlbmQgPSAyNTY7XG5cbiAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIERJU1RTICovXG4gICAgYmFzZSA9IGRiYXNlO1xuICAgIGV4dHJhID0gZGV4dDtcbiAgICBlbmQgPSAtMTtcbiAgfVxuXG4gIC8qIGluaXRpYWxpemUgb3B0cyBmb3IgbG9vcCAqL1xuICBodWZmID0gMDsgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSAqL1xuICBzeW0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBzeW1ib2wgKi9cbiAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovXG4gIG5leHQgPSB0YWJsZV9pbmRleDsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqL1xuICBjdXJyID0gcm9vdDsgICAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSBpbmRleCBiaXRzICovXG4gIGRyb3AgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGJpdHMgdG8gZHJvcCBmcm9tIGNvZGUgZm9yIGluZGV4ICovXG4gIGxvdyA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovXG4gIHVzZWQgPSAxIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi9cbiAgbWFzayA9IHVzZWQgLSAxOyAgICAgICAgICAgIC8qIG1hc2sgZm9yIGNvbXBhcmluZyBsb3cgKi9cblxuICAvKiBjaGVjayBhdmFpbGFibGUgdGFibGUgc3BhY2UgKi9cbiAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqL1xuICAgIGhlcmVfYml0cyA9IGxlbiAtIGRyb3A7XG4gICAgaWYgKHdvcmtbc3ltXSA8IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IDA7XG4gICAgICBoZXJlX3ZhbCA9IHdvcmtbc3ltXTtcbiAgICB9XG4gICAgZWxzZSBpZiAod29ya1tzeW1dID4gZW5kKSB7XG4gICAgICBoZXJlX29wID0gZXh0cmFbZXh0cmFfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgICAgaGVyZV92YWwgPSBiYXNlW2Jhc2VfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGhlcmVfb3AgPSAzMiArIDY0OyAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqL1xuICAgICAgaGVyZV92YWwgPSAwO1xuICAgIH1cblxuICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIGRyb3ApO1xuICAgIGZpbGwgPSAxIDw8IGN1cnI7XG4gICAgbWluID0gZmlsbDsgICAgICAgICAgICAgICAgIC8qIHNhdmUgb2Zmc2V0IHRvIG5leHQgdGFibGUgKi9cbiAgICBkbyB7XG4gICAgICBmaWxsIC09IGluY3I7XG4gICAgICB0YWJsZVtuZXh0ICsgKGh1ZmYgPj4gZHJvcCkgKyBmaWxsXSA9IChoZXJlX2JpdHMgPDwgMjQpIHwgKGhlcmVfb3AgPDwgMTYpIHwgaGVyZV92YWwgfDA7XG4gICAgfSB3aGlsZSAoZmlsbCAhPT0gMCk7XG5cbiAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSAxKTtcbiAgICB3aGlsZSAoaHVmZiAmIGluY3IpIHtcbiAgICAgIGluY3IgPj49IDE7XG4gICAgfVxuICAgIGlmIChpbmNyICE9PSAwKSB7XG4gICAgICBodWZmICY9IGluY3IgLSAxO1xuICAgICAgaHVmZiArPSBpbmNyO1xuICAgIH0gZWxzZSB7XG4gICAgICBodWZmID0gMDtcbiAgICB9XG5cbiAgICAvKiBnbyB0byBuZXh0IHN5bWJvbCwgdXBkYXRlIGNvdW50LCBsZW4gKi9cbiAgICBzeW0rKztcbiAgICBpZiAoLS1jb3VudFtsZW5dID09PSAwKSB7XG4gICAgICBpZiAobGVuID09PSBtYXgpIHsgYnJlYWs7IH1cbiAgICAgIGxlbiA9IGxlbnNbbGVuc19pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuXG4gICAgLyogY3JlYXRlIG5ldyBzdWItdGFibGUgaWYgbmVlZGVkICovXG4gICAgaWYgKGxlbiA+IHJvb3QgJiYgKGh1ZmYgJiBtYXNrKSAhPT0gbG93KSB7XG4gICAgICAvKiBpZiBmaXJzdCB0aW1lLCB0cmFuc2l0aW9uIHRvIHN1Yi10YWJsZXMgKi9cbiAgICAgIGlmIChkcm9wID09PSAwKSB7XG4gICAgICAgIGRyb3AgPSByb290O1xuICAgICAgfVxuXG4gICAgICAvKiBpbmNyZW1lbnQgcGFzdCBsYXN0IHRhYmxlICovXG4gICAgICBuZXh0ICs9IG1pbjsgICAgICAgICAgICAvKiBoZXJlIG1pbiBpcyAxIDw8IGN1cnIgKi9cblxuICAgICAgLyogZGV0ZXJtaW5lIGxlbmd0aCBvZiBuZXh0IHRhYmxlICovXG4gICAgICBjdXJyID0gbGVuIC0gZHJvcDtcbiAgICAgIGxlZnQgPSAxIDw8IGN1cnI7XG4gICAgICB3aGlsZSAoY3VyciArIGRyb3AgPCBtYXgpIHtcbiAgICAgICAgbGVmdCAtPSBjb3VudFtjdXJyICsgZHJvcF07XG4gICAgICAgIGlmIChsZWZ0IDw9IDApIHsgYnJlYWs7IH1cbiAgICAgICAgY3VycisrO1xuICAgICAgICBsZWZ0IDw8PSAxO1xuICAgICAgfVxuXG4gICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovXG4gICAgICB1c2VkICs9IDEgPDwgY3VycjtcbiAgICAgIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgLyogcG9pbnQgZW50cnkgaW4gcm9vdCB0YWJsZSB0byBzdWItdGFibGUgKi9cbiAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrO1xuICAgICAgLyp0YWJsZS5vcFtsb3ddID0gY3VycjtcbiAgICAgIHRhYmxlLmJpdHNbbG93XSA9IHJvb3Q7XG4gICAgICB0YWJsZS52YWxbbG93XSA9IG5leHQgLSBvcHRzLnRhYmxlX2luZGV4OyovXG4gICAgICB0YWJsZVtsb3ddID0gKHJvb3QgPDwgMjQpIHwgKGN1cnIgPDwgMTYpIHwgKG5leHQgLSB0YWJsZV9pbmRleCkgfDA7XG4gICAgfVxuICB9XG5cbiAgLyogZmlsbCBpbiByZW1haW5pbmcgdGFibGUgZW50cnkgaWYgY29kZSBpcyBpbmNvbXBsZXRlIChndWFyYW50ZWVkIHRvIGhhdmVcbiAgIGF0IG1vc3Qgb25lIHJlbWFpbmluZyBlbnRyeSwgc2luY2UgaWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSwgdGhlXG4gICBtYXhpbXVtIGNvZGUgbGVuZ3RoIHRoYXQgd2FzIGFsbG93ZWQgdG8gZ2V0IHRoaXMgZmFyIGlzIG9uZSBiaXQpICovXG4gIGlmIChodWZmICE9PSAwKSB7XG4gICAgLy90YWJsZS5vcFtuZXh0ICsgaHVmZl0gPSA2NDsgICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW25leHQgKyBodWZmXSA9IGxlbiAtIGRyb3A7XG4gICAgLy90YWJsZS52YWxbbmV4dCArIGh1ZmZdID0gMDtcbiAgICB0YWJsZVtuZXh0ICsgaHVmZl0gPSAoKGxlbiAtIGRyb3ApIDw8IDI0KSB8ICg2NCA8PCAxNikgfDA7XG4gIH1cblxuICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi9cbiAgLy9vcHRzLnRhYmxlX2luZGV4ICs9IHVzZWQ7XG4gIG9wdHMuYml0cyA9IHJvb3Q7XG4gIHJldHVybiAwO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgMjogICAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovXG4gIDE6ICAgICAgJ3N0cmVhbSBlbmQnLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqL1xuICAwOiAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi9cbiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovXG4gICctMic6ICAgJ3N0cmVhbSBlcnJvcicsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqL1xuICAnLTMnOiAgICdkYXRhIGVycm9yJywgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi9cbiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovXG4gICctNSc6ICAgJ2J1ZmZlciBlcnJvcicsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqL1xuICAnLTYnOiAgICdpbmNvbXBhdGlibGUgdmVyc2lvbicgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi9cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuLyogZXNsaW50LWRpc2FibGUgc3BhY2UtdW5hcnktb3BzICovXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vL3ZhciBaX0ZJTFRFUkVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfSFVGRk1BTl9PTkxZICAgICAgPSAyO1xuLy92YXIgWl9STEUgICAgICAgICAgICAgICA9IDM7XG52YXIgWl9GSVhFRCAgICAgICAgICAgICAgID0gNDtcbi8vdmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgPSAwO1xuXG4vKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovXG52YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbnZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICA9IDE7IC8vID0gWl9URVhUXG52YXIgWl9VTktOT1dOICAgICAgICAgICAgID0gMjtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuLy8gRnJvbSB6dXRpbC5oXG5cbnZhciBTVE9SRURfQkxPQ0sgPSAwO1xudmFyIFNUQVRJQ19UUkVFUyA9IDE7XG52YXIgRFlOX1RSRUVTICAgID0gMjtcbi8qIFRoZSB0aHJlZSBraW5kcyBvZiBibG9jayB0eXBlICovXG5cbnZhciBNSU5fTUFUQ0ggICAgPSAzO1xudmFyIE1BWF9NQVRDSCAgICA9IDI1ODtcbi8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi9cblxuLy8gRnJvbSBkZWZsYXRlLmhcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuXG4gKi9cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xuXG52YXIgTElURVJBTFMgICAgICA9IDI1Njtcbi8qIG51bWJlciBvZiBsaXRlcmFsIGJ5dGVzIDAuLjI1NSAqL1xuXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xuXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG5cbnZhciBCTF9DT0RFUyAgICAgID0gMTk7XG4vKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi9cblxudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xuXG52YXIgTUFYX0JJVFMgICAgICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBCdWZfc2l6ZSAgICAgID0gMTY7XG4vKiBzaXplIG9mIGJpdCBidWZmZXIgaW4gYmlfYnVmICovXG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdGFudHNcbiAqL1xuXG52YXIgTUFYX0JMX0JJVFMgPSA3O1xuLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqL1xuXG52YXIgRU5EX0JMT0NLICAgPSAyNTY7XG4vKiBlbmQgb2YgYmxvY2sgbGl0ZXJhbCBjb2RlICovXG5cbnZhciBSRVBfM182ICAgICA9IDE2O1xuLyogcmVwZWF0IHByZXZpb3VzIGJpdCBsZW5ndGggMy02IHRpbWVzICgyIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG52YXIgUkVQWl8zXzEwICAgPSAxNztcbi8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG52YXIgUkVQWl8xMV8xMzggPSAxODtcbi8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDExLTEzOCB0aW1lcyAgKDcgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbi8qIGVzbGludC1kaXNhYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG52YXIgZXh0cmFfbGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggbGVuZ3RoIGNvZGUgKi9cbiAgWzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF07XG5cbnZhciBleHRyYV9kYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBkaXN0YW5jZSBjb2RlICovXG4gIFswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXTtcblxudmFyIGV4dHJhX2JsYml0cyA9ICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN107XG5cbnZhciBibF9vcmRlciA9XG4gIFsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XTtcbi8qIGVzbGludC1lbmFibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cblxuLyogVGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZ1xuICogcHJvYmFiaWxpdHksIHRvIGF2b2lkIHRyYW5zbWl0dGluZyB0aGUgbGVuZ3RocyBmb3IgdW51c2VkIGJpdCBsZW5ndGggY29kZXMuXG4gKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBMb2NhbCBkYXRhLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgb25seSBvbmNlLlxuICovXG5cbi8vIFdlIHByZS1maWxsIGFycmF5cyB3aXRoIDAgdG8gYXZvaWQgdW5pbml0aWFsaXplZCBnYXBzXG5cbnZhciBESVNUX0NPREVfTEVOID0gNTEyOyAvKiBzZWUgZGVmaW5pdGlvbiBvZiBhcnJheSBkaXN0X2NvZGUgYmVsb3cgKi9cblxuLy8gISEhISBVc2UgZmxhdCBhcnJheSBpbnN0ZWFkIG9mIHN0cnVjdHVyZSwgRnJlcSA9IGkqMiwgTGVuID0gaSoyKzFcbnZhciBzdGF0aWNfbHRyZWUgID0gbmV3IEFycmF5KChMX0NPREVTICsgMikgKiAyKTtcbnplcm8oc3RhdGljX2x0cmVlKTtcbi8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vXG4gKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlclxuICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIF90cl9pbml0XG4gKiBiZWxvdykuXG4gKi9cblxudmFyIHN0YXRpY19kdHJlZSAgPSBuZXcgQXJyYXkoRF9DT0RFUyAqIDIpO1xuemVybyhzdGF0aWNfZHRyZWUpO1xuLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlLiAoQWN0dWFsbHkgYSB0cml2aWFsIHRyZWUgc2luY2UgYWxsIGNvZGVzIHVzZVxuICogNSBiaXRzLilcbiAqL1xuXG52YXIgX2Rpc3RfY29kZSAgICA9IG5ldyBBcnJheShESVNUX0NPREVfTEVOKTtcbnplcm8oX2Rpc3RfY29kZSk7XG4vKiBEaXN0YW5jZSBjb2Rlcy4gVGhlIGZpcnN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgZGlzdGFuY2VzXG4gKiAzIC4uIDI1OCwgdGhlIGxhc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB0b3AgOCBiaXRzIG9mXG4gKiB0aGUgMTUgYml0IGRpc3RhbmNlcy5cbiAqL1xuXG52YXIgX2xlbmd0aF9jb2RlICA9IG5ldyBBcnJheShNQVhfTUFUQ0ggLSBNSU5fTUFUQ0ggKyAxKTtcbnplcm8oX2xlbmd0aF9jb2RlKTtcbi8qIGxlbmd0aCBjb2RlIGZvciBlYWNoIG5vcm1hbGl6ZWQgbWF0Y2ggbGVuZ3RoICgwID09IE1JTl9NQVRDSCkgKi9cblxudmFyIGJhc2VfbGVuZ3RoICAgPSBuZXcgQXJyYXkoTEVOR1RIX0NPREVTKTtcbnplcm8oYmFzZV9sZW5ndGgpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBsZW5ndGggZm9yIGVhY2ggY29kZSAoMCA9IE1JTl9NQVRDSCkgKi9cblxudmFyIGJhc2VfZGlzdCAgICAgPSBuZXcgQXJyYXkoRF9DT0RFUyk7XG56ZXJvKGJhc2VfZGlzdCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqL1xuXG5cbmZ1bmN0aW9uIFN0YXRpY1RyZWVEZXNjKHN0YXRpY190cmVlLCBleHRyYV9iaXRzLCBleHRyYV9iYXNlLCBlbGVtcywgbWF4X2xlbmd0aCkge1xuXG4gIHRoaXMuc3RhdGljX3RyZWUgID0gc3RhdGljX3RyZWU7ICAvKiBzdGF0aWMgdHJlZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYml0cyAgID0gZXh0cmFfYml0czsgICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGNvZGUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2Jhc2UgICA9IGV4dHJhX2Jhc2U7ICAgLyogYmFzZSBpbmRleCBmb3IgZXh0cmFfYml0cyAqL1xuICB0aGlzLmVsZW1zICAgICAgICA9IGVsZW1zOyAgICAgICAgLyogbWF4IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHJlZSAqL1xuICB0aGlzLm1heF9sZW5ndGggICA9IG1heF9sZW5ndGg7ICAgLyogbWF4IGJpdCBsZW5ndGggZm9yIHRoZSBjb2RlcyAqL1xuXG4gIC8vIHNob3cgaWYgYHN0YXRpY190cmVlYCBoYXMgZGF0YSBvciBkdW1teSAtIG5lZWRlZCBmb3IgbW9ub21vcnBoaWMgb2JqZWN0c1xuICB0aGlzLmhhc19zdHJlZSAgICA9IHN0YXRpY190cmVlICYmIHN0YXRpY190cmVlLmxlbmd0aDtcbn1cblxuXG52YXIgc3RhdGljX2xfZGVzYztcbnZhciBzdGF0aWNfZF9kZXNjO1xudmFyIHN0YXRpY19ibF9kZXNjO1xuXG5cbmZ1bmN0aW9uIFRyZWVEZXNjKGR5bl90cmVlLCBzdGF0X2Rlc2MpIHtcbiAgdGhpcy5keW5fdHJlZSA9IGR5bl90cmVlOyAgICAgLyogdGhlIGR5bmFtaWMgdHJlZSAqL1xuICB0aGlzLm1heF9jb2RlID0gMDsgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdGhpcy5zdGF0X2Rlc2MgPSBzdGF0X2Rlc2M7ICAgLyogdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHRyZWUgKi9cbn1cblxuXG5cbmZ1bmN0aW9uIGRfY29kZShkaXN0KSB7XG4gIHJldHVybiBkaXN0IDwgMjU2ID8gX2Rpc3RfY29kZVtkaXN0XSA6IF9kaXN0X2NvZGVbMjU2ICsgKGRpc3QgPj4+IDcpXTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIE91dHB1dCBhIHNob3J0IExTQiBmaXJzdCBvbiB0aGUgc3RyZWFtLlxuICogSU4gYXNzZXJ0aW9uOiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiBwZW5kaW5nQnVmLlxuICovXG5mdW5jdGlvbiBwdXRfc2hvcnQocywgdykge1xuLy8gICAgcHV0X2J5dGUocywgKHVjaCkoKHcpICYgMHhmZikpO1xuLy8gICAgcHV0X2J5dGUocywgKHVjaCkoKHVzaCkodykgPj4gOCkpO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcgPj4+IDgpICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSB2YWx1ZSBvbiBhIGdpdmVuIG51bWJlciBvZiBiaXRzLlxuICogSU4gYXNzZXJ0aW9uOiBsZW5ndGggPD0gMTYgYW5kIHZhbHVlIGZpdHMgaW4gbGVuZ3RoIGJpdHMuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYml0cyhzLCB2YWx1ZSwgbGVuZ3RoKSB7XG4gIGlmIChzLmJpX3ZhbGlkID4gKEJ1Zl9zaXplIC0gbGVuZ3RoKSkge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gdmFsdWUgPj4gKEJ1Zl9zaXplIC0gcy5iaV92YWxpZCk7XG4gICAgcy5iaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTtcbiAgfSBlbHNlIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcy5iaV92YWxpZCArPSBsZW5ndGg7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzZW5kX2NvZGUocywgYywgdHJlZSkge1xuICBzZW5kX2JpdHMocywgdHJlZVtjICogMl0vKi5Db2RlKi8sIHRyZWVbYyAqIDIgKyAxXS8qLkxlbiovKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyXG4gKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpXG4gKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1XG4gKi9cbmZ1bmN0aW9uIGJpX3JldmVyc2UoY29kZSwgbGVuKSB7XG4gIHZhciByZXMgPSAwO1xuICBkbyB7XG4gICAgcmVzIHw9IGNvZGUgJiAxO1xuICAgIGNvZGUgPj4+PSAxO1xuICAgIHJlcyA8PD0gMTtcbiAgfSB3aGlsZSAoLS1sZW4gPiAwKTtcbiAgcmV0dXJuIHJlcyA+Pj4gMTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyLCBrZWVwaW5nIGF0IG1vc3QgNyBiaXRzIGluIGl0LlxuICovXG5mdW5jdGlvbiBiaV9mbHVzaChzKSB7XG4gIGlmIChzLmJpX3ZhbGlkID09PSAxNikge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSAwO1xuICAgIHMuYmlfdmFsaWQgPSAwO1xuXG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+PSA4KSB7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZiAmIDB4ZmY7XG4gICAgcy5iaV9idWYgPj49IDg7XG4gICAgcy5iaV92YWxpZCAtPSA4O1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aFxuICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmRcbiAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlXG4gKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguXG4gKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzXG4gKiAgICAgbm90IG51bGwuXG4gKi9cbmZ1bmN0aW9uIGdlbl9iaXRsZW4ocywgZGVzYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB0cmVlX2Rlc2MgKmRlc2M7ICAgIC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi9cbntcbiAgdmFyIHRyZWUgICAgICAgICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBtYXhfY29kZSAgICAgICAgPSBkZXNjLm1heF9jb2RlO1xuICB2YXIgc3RyZWUgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7XG4gIHZhciBoYXNfc3RyZWUgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7XG4gIHZhciBleHRyYSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iaXRzO1xuICB2YXIgYmFzZSAgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYmFzZTtcbiAgdmFyIG1heF9sZW5ndGggICAgICA9IGRlc2Muc3RhdF9kZXNjLm1heF9sZW5ndGg7XG4gIHZhciBoOyAgICAgICAgICAgICAgLyogaGVhcCBpbmRleCAqL1xuICB2YXIgbiwgbTsgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgICAgICAgIC8qIGJpdCBsZW5ndGggKi9cbiAgdmFyIHhiaXRzOyAgICAgICAgICAvKiBleHRyYSBiaXRzICovXG4gIHZhciBmOyAgICAgICAgICAgICAgLyogZnJlcXVlbmN5ICovXG4gIHZhciBvdmVyZmxvdyA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYml0IGxlbmd0aCB0b28gbGFyZ2UgKi9cblxuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBzLmJsX2NvdW50W2JpdHNdID0gMDtcbiAgfVxuXG4gIC8qIEluIGEgZmlyc3QgcGFzcywgY29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyAod2hpY2ggbWF5XG4gICAqIG92ZXJmbG93IGluIHRoZSBjYXNlIG9mIHRoZSBiaXQgbGVuZ3RoIHRyZWUpLlxuICAgKi9cbiAgdHJlZVtzLmhlYXBbcy5oZWFwX21heF0gKiAyICsgMV0vKi5MZW4qLyA9IDA7IC8qIHJvb3Qgb2YgdGhlIGhlYXAgKi9cblxuICBmb3IgKGggPSBzLmhlYXBfbWF4ICsgMTsgaCA8IEhFQVBfU0laRTsgaCsrKSB7XG4gICAgbiA9IHMuaGVhcFtoXTtcbiAgICBiaXRzID0gdHJlZVt0cmVlW24gKiAyICsgMV0vKi5EYWQqLyAqIDIgKyAxXS8qLkxlbiovICsgMTtcbiAgICBpZiAoYml0cyA+IG1heF9sZW5ndGgpIHtcbiAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoO1xuICAgICAgb3ZlcmZsb3crKztcbiAgICB9XG4gICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgIC8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovXG5cbiAgICBpZiAobiA+IG1heF9jb2RlKSB7IGNvbnRpbnVlOyB9IC8qIG5vdCBhIGxlYWYgbm9kZSAqL1xuXG4gICAgcy5ibF9jb3VudFtiaXRzXSsrO1xuICAgIHhiaXRzID0gMDtcbiAgICBpZiAobiA+PSBiYXNlKSB7XG4gICAgICB4Yml0cyA9IGV4dHJhW24gLSBiYXNlXTtcbiAgICB9XG4gICAgZiA9IHRyZWVbbiAqIDJdLyouRnJlcSovO1xuICAgIHMub3B0X2xlbiArPSBmICogKGJpdHMgKyB4Yml0cyk7XG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuICs9IGYgKiAoc3RyZWVbbiAqIDIgKyAxXS8qLkxlbiovICsgeGJpdHMpO1xuICAgIH1cbiAgfVxuICBpZiAob3ZlcmZsb3cgPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgLy8gVHJhY2UoKHN0ZGVycixcIlxcbmJpdCBsZW5ndGggb3ZlcmZsb3dcXG5cIikpO1xuICAvKiBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgb24gb2JqMiBhbmQgcGljIG9mIHRoZSBDYWxnYXJ5IGNvcnB1cyAqL1xuXG4gIC8qIEZpbmQgdGhlIGZpcnN0IGJpdCBsZW5ndGggd2hpY2ggY291bGQgaW5jcmVhc2U6ICovXG4gIGRvIHtcbiAgICBiaXRzID0gbWF4X2xlbmd0aCAtIDE7XG4gICAgd2hpbGUgKHMuYmxfY291bnRbYml0c10gPT09IDApIHsgYml0cy0tOyB9XG4gICAgcy5ibF9jb3VudFtiaXRzXS0tOyAgICAgIC8qIG1vdmUgb25lIGxlYWYgZG93biB0aGUgdHJlZSAqL1xuICAgIHMuYmxfY291bnRbYml0cyArIDFdICs9IDI7IC8qIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIgKi9cbiAgICBzLmJsX2NvdW50W21heF9sZW5ndGhdLS07XG4gICAgLyogVGhlIGJyb3RoZXIgb2YgdGhlIG92ZXJmbG93IGl0ZW0gYWxzbyBtb3ZlcyBvbmUgc3RlcCB1cCxcbiAgICAgKiBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF1cbiAgICAgKi9cbiAgICBvdmVyZmxvdyAtPSAyO1xuICB9IHdoaWxlIChvdmVyZmxvdyA+IDApO1xuXG4gIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2FubmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAgICogaCBpcyBzdGlsbCBlcXVhbCB0byBIRUFQX1NJWkUuIChJdCBpcyBzaW1wbGVyIHRvIHJlY29uc3RydWN0IGFsbFxuICAgKiBsZW5ndGhzIGluc3RlYWQgb2YgZml4aW5nIG9ubHkgdGhlIHdyb25nIG9uZXMuIFRoaXMgaWRlYSBpcyB0YWtlblxuICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLilcbiAgICovXG4gIGZvciAoYml0cyA9IG1heF9sZW5ndGg7IGJpdHMgIT09IDA7IGJpdHMtLSkge1xuICAgIG4gPSBzLmJsX2NvdW50W2JpdHNdO1xuICAgIHdoaWxlIChuICE9PSAwKSB7XG4gICAgICBtID0gcy5oZWFwWy0taF07XG4gICAgICBpZiAobSA+IG1heF9jb2RlKSB7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAodHJlZVttICogMiArIDFdLyouTGVuKi8gIT09IGJpdHMpIHtcbiAgICAgICAgLy8gVHJhY2UoKHN0ZGVycixcImNvZGUgJWQgYml0cyAlZC0+JWRcXG5cIiwgbSwgdHJlZVttXS5MZW4sIGJpdHMpKTtcbiAgICAgICAgcy5vcHRfbGVuICs9IChiaXRzIC0gdHJlZVttICogMiArIDFdLyouTGVuKi8pICogdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgICAgIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAgIH1cbiAgICAgIG4tLTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEdlbmVyYXRlIHRoZSBjb2RlcyBmb3IgYSBnaXZlbiB0cmVlIGFuZCBiaXQgY291bnRzICh3aGljaCBuZWVkIG5vdCBiZVxuICogb3B0aW1hbCkuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgYml0IGxlbmd0aCBzdGF0aXN0aWNzIGZvclxuICogdGhlIGdpdmVuIHRyZWUgYW5kIHRoZSBmaWVsZCBsZW4gaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb246IHRoZSBmaWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uXG4gKiAgICAgemVybyBjb2RlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBibF9jb3VudClcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAgICAgICAgICAgIC8qIHRoZSB0cmVlIHRvIGRlY29yYXRlICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbi8vICAgIHVzaGYgKmJsX2NvdW50OyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggKi9cbntcbiAgdmFyIG5leHRfY29kZSA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpOyAvKiBuZXh0IGNvZGUgdmFsdWUgZm9yIGVhY2ggYml0IGxlbmd0aCAqL1xuICB2YXIgY29kZSA9IDA7ICAgICAgICAgICAgICAvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgLyogYml0IGluZGV4ICovXG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgaW5kZXggKi9cblxuICAvKiBUaGUgZGlzdHJpYnV0aW9uIGNvdW50cyBhcmUgZmlyc3QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZSB2YWx1ZXNcbiAgICogd2l0aG91dCBiaXQgcmV2ZXJzYWwuXG4gICAqL1xuICBmb3IgKGJpdHMgPSAxOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBuZXh0X2NvZGVbYml0c10gPSBjb2RlID0gKGNvZGUgKyBibF9jb3VudFtiaXRzIC0gMV0pIDw8IDE7XG4gIH1cbiAgLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZVxuICAgKiBtdXN0IGJlIGFsbCBvbmVzLlxuICAgKi9cbiAgLy9Bc3NlcnQgKGNvZGUgKyBibF9jb3VudFtNQVhfQklUU10tMSA9PSAoMTw8TUFYX0JJVFMpLTEsXG4gIC8vICAgICAgICBcImluY29uc2lzdGVudCBiaXQgY291bnRzXCIpO1xuICAvL1RyYWNldigoc3RkZXJyLFwiXFxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCBcIiwgbWF4X2NvZGUpKTtcblxuICBmb3IgKG4gPSAwOyAgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgdmFyIGxlbiA9IHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovO1xuICAgIGlmIChsZW4gPT09IDApIHsgY29udGludWU7IH1cbiAgICAvKiBOb3cgcmV2ZXJzZSB0aGUgYml0cyAqL1xuICAgIHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pO1xuXG4gICAgLy9UcmFjZWN2KHRyZWUgIT0gc3RhdGljX2x0cmVlLCAoc3RkZXJyLFwiXFxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSBcIixcbiAgICAvLyAgICAgbiwgKGlzZ3JhcGgobikgPyBuIDogJyAnKSwgbGVuLCB0cmVlW25dLkNvZGUsIG5leHRfY29kZVtsZW5dLTEpKTtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyAnY29uc3RhbnQnIHRhYmxlcy5cbiAqL1xuZnVuY3Rpb24gdHJfc3RhdGljX2luaXQoKSB7XG4gIHZhciBuOyAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgLyogYml0IGNvdW50ZXIgKi9cbiAgdmFyIGxlbmd0aDsgICAvKiBsZW5ndGggdmFsdWUgKi9cbiAgdmFyIGNvZGU7ICAgICAvKiBjb2RlIHZhbHVlICovXG4gIHZhciBkaXN0OyAgICAgLyogZGlzdGFuY2UgaW5kZXggKi9cbiAgdmFyIGJsX2NvdW50ID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vIGRvIGNoZWNrIGluIF90cl9pbml0KClcbiAgLy9pZiAoc3RhdGljX2luaXRfZG9uZSkgcmV0dXJuO1xuXG4gIC8qIEZvciBzb21lIGVtYmVkZGVkIHRhcmdldHMsIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdCBpbml0aWFsaXplZDogKi9cbi8qI2lmZGVmIE5PX0lOSVRfR0xPQkFMX1BPSU5URVJTXG4gIHN0YXRpY19sX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfbHRyZWU7XG4gIHN0YXRpY19sX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2xiaXRzO1xuICBzdGF0aWNfZF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2R0cmVlO1xuICBzdGF0aWNfZF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9kYml0cztcbiAgc3RhdGljX2JsX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2JsYml0cztcbiNlbmRpZiovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBsZW5ndGggKDAuLjI1NSkgLT4gbGVuZ3RoIGNvZGUgKDAuLjI4KSAqL1xuICBsZW5ndGggPSAwO1xuICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgTEVOR1RIX0NPREVTIC0gMTsgY29kZSsrKSB7XG4gICAgYmFzZV9sZW5ndGhbY29kZV0gPSBsZW5ndGg7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7XG4gICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGxlbmd0aCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IGxlbmd0aCAhPSAyNTZcIik7XG4gIC8qIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIDI1NSAobWF0Y2ggbGVuZ3RoIDI1OCkgY2FuIGJlIHJlcHJlc2VudGVkXG4gICAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlXG4gICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBlbmNvZGluZzpcbiAgICovXG4gIF9sZW5ndGhfY29kZVtsZW5ndGggLSAxXSA9IGNvZGU7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBkaXN0ICgwLi4zMkspIC0+IGRpc3QgY29kZSAoMC4uMjkpICovXG4gIGRpc3QgPSAwO1xuICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgMTY7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2RiaXRzW2NvZGVdKTsgbisrKSB7XG4gICAgICBfZGlzdF9jb2RlW2Rpc3QrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZGlzdCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IGRpc3QgIT0gMjU2XCIpO1xuICBkaXN0ID4+PSA3OyAvKiBmcm9tIG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi9cbiAgZm9yICg7IGNvZGUgPCBEX0NPREVTOyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0IDw8IDc7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IChleHRyYV9kYml0c1tjb2RlXSAtIDcpKTsgbisrKSB7XG4gICAgICBfZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZGlzdCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IDI1NitkaXN0ICE9IDUxMlwiKTtcblxuICAvKiBDb25zdHJ1Y3QgdGhlIGNvZGVzIG9mIHRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlICovXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIGJsX2NvdW50W2JpdHNdID0gMDtcbiAgfVxuXG4gIG4gPSAwO1xuICB3aGlsZSAobiA8PSAxNDMpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gODtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOF0rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyNTUpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gOTtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOV0rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyNzkpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gNztcbiAgICBuKys7XG4gICAgYmxfY291bnRbN10rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyODcpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gODtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOF0rKztcbiAgfVxuICAvKiBDb2RlcyAyODYgYW5kIDI4NyBkbyBub3QgZXhpc3QsIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGVcbiAgICogdHJlZSBjb25zdHJ1Y3Rpb24gdG8gZ2V0IGEgY2Fub25pY2FsIEh1ZmZtYW4gdHJlZSAobG9uZ2VzdCBjb2RlXG4gICAqIGFsbCBvbmVzKVxuICAgKi9cbiAgZ2VuX2NvZGVzKHN0YXRpY19sdHJlZSwgTF9DT0RFUyArIDEsIGJsX2NvdW50KTtcblxuICAvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi9cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7IG4rKykge1xuICAgIHN0YXRpY19kdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA1O1xuICAgIHN0YXRpY19kdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG4sIDUpO1xuICB9XG5cbiAgLy8gTm93IGRhdGEgcmVhZHkgYW5kIHdlIGNhbiBpbml0IHN0YXRpYyB0cmVlc1xuICBzdGF0aWNfbF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19sdHJlZSwgZXh0cmFfbGJpdHMsIExJVEVSQUxTICsgMSwgTF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfZF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsICAgICAgICAgIERfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2JsX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2MobmV3IEFycmF5KDApLCBleHRyYV9ibGJpdHMsIDAsICAgICAgICAgQkxfQ09ERVMsIE1BWF9CTF9CSVRTKTtcblxuICAvL3N0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSBhIG5ldyBibG9jay5cbiAqL1xuZnVuY3Rpb24gaW5pdF9ibG9jayhzKSB7XG4gIHZhciBuOyAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSB0cmVlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8IExfQ09ERVM7ICBuKyspIHsgcy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgeyBzLmR5bl9kdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKSB7IHMuYmxfdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG5cbiAgcy5keW5fbHRyZWVbRU5EX0JMT0NLICogMl0vKi5GcmVxKi8gPSAxO1xuICBzLm9wdF9sZW4gPSBzLnN0YXRpY19sZW4gPSAwO1xuICBzLmxhc3RfbGl0ID0gcy5tYXRjaGVzID0gMDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyIGFuZCBhbGlnbiB0aGUgb3V0cHV0IG9uIGEgYnl0ZSBib3VuZGFyeVxuICovXG5mdW5jdGlvbiBiaV93aW5kdXAocylcbntcbiAgaWYgKHMuYmlfdmFsaWQgPiA4KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID4gMCkge1xuICAgIC8vcHV0X2J5dGUocywgKEJ5dGUpcy0+YmlfYnVmKTtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmO1xuICB9XG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSBhIHN0b3JlZCBibG9jaywgc3RvcmluZyBmaXJzdCB0aGUgbGVuZ3RoIGFuZCBpdHNcbiAqIG9uZSdzIGNvbXBsZW1lbnQgaWYgcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiBjb3B5X2Jsb2NrKHMsIGJ1ZiwgbGVuLCBoZWFkZXIpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgICAgKmJ1ZjsgICAgLyogdGhlIGlucHV0IGRhdGEgKi9cbi8vdW5zaWduZWQgbGVuOyAgICAgLyogaXRzIGxlbmd0aCAqL1xuLy9pbnQgICAgICBoZWFkZXI7ICAvKiB0cnVlIGlmIGJsb2NrIGhlYWRlciBtdXN0IGJlIHdyaXR0ZW4gKi9cbntcbiAgYmlfd2luZHVwKHMpOyAgICAgICAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqL1xuXG4gIGlmIChoZWFkZXIpIHtcbiAgICBwdXRfc2hvcnQocywgbGVuKTtcbiAgICBwdXRfc2hvcnQocywgfmxlbik7XG4gIH1cbi8vICB3aGlsZSAobGVuLS0pIHtcbi8vICAgIHB1dF9ieXRlKHMsICpidWYrKyk7XG4vLyAgfVxuICB1dGlscy5hcnJheVNldChzLnBlbmRpbmdfYnVmLCBzLndpbmRvdywgYnVmLCBsZW4sIHMucGVuZGluZyk7XG4gIHMucGVuZGluZyArPSBsZW47XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW5cbiAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBzbWFsbGVyKHRyZWUsIG4sIG0sIGRlcHRoKSB7XG4gIHZhciBfbjIgPSBuICogMjtcbiAgdmFyIF9tMiA9IG0gKiAyO1xuICByZXR1cm4gKHRyZWVbX24yXS8qLkZyZXEqLyA8IHRyZWVbX20yXS8qLkZyZXEqLyB8fFxuICAgICAgICAgKHRyZWVbX24yXS8qLkZyZXEqLyA9PT0gdHJlZVtfbTJdLyouRnJlcSovICYmIGRlcHRoW25dIDw9IGRlcHRoW21dKSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVzdG9yZSB0aGUgaGVhcCBwcm9wZXJ0eSBieSBtb3ZpbmcgZG93biB0aGUgdHJlZSBzdGFydGluZyBhdCBub2RlIGssXG4gKiBleGNoYW5naW5nIGEgbm9kZSB3aXRoIHRoZSBzbWFsbGVzdCBvZiBpdHMgdHdvIHNvbnMgaWYgbmVjZXNzYXJ5LCBzdG9wcGluZ1xuICogd2hlbiB0aGUgaGVhcCBwcm9wZXJ0eSBpcyByZS1lc3RhYmxpc2hlZCAoZWFjaCBmYXRoZXIgc21hbGxlciB0aGFuIGl0c1xuICogdHdvIHNvbnMpLlxuICovXG5mdW5jdGlvbiBwcWRvd25oZWFwKHMsIHRyZWUsIGspXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgIC8qIHRoZSB0cmVlIHRvIHJlc3RvcmUgKi9cbi8vICAgIGludCBrOyAgICAgICAgICAgICAgIC8qIG5vZGUgdG8gbW92ZSBkb3duICovXG57XG4gIHZhciB2ID0gcy5oZWFwW2tdO1xuICB2YXIgaiA9IGsgPDwgMTsgIC8qIGxlZnQgc29uIG9mIGsgKi9cbiAgd2hpbGUgKGogPD0gcy5oZWFwX2xlbikge1xuICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovXG4gICAgaWYgKGogPCBzLmhlYXBfbGVuICYmXG4gICAgICBzbWFsbGVyKHRyZWUsIHMuaGVhcFtqICsgMV0sIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHtcbiAgICAgIGorKztcbiAgICB9XG4gICAgLyogRXhpdCBpZiB2IGlzIHNtYWxsZXIgdGhhbiBib3RoIHNvbnMgKi9cbiAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7IGJyZWFrOyB9XG5cbiAgICAvKiBFeGNoYW5nZSB2IHdpdGggdGhlIHNtYWxsZXN0IHNvbiAqL1xuICAgIHMuaGVhcFtrXSA9IHMuaGVhcFtqXTtcbiAgICBrID0gajtcblxuICAgIC8qIEFuZCBjb250aW51ZSBkb3duIHRoZSB0cmVlLCBzZXR0aW5nIGogdG8gdGhlIGxlZnQgc29uIG9mIGsgKi9cbiAgICBqIDw8PSAxO1xuICB9XG4gIHMuaGVhcFtrXSA9IHY7XG59XG5cblxuLy8gaW5saW5lZCBtYW51YWxseVxuLy8gdmFyIFNNQUxMRVNUID0gMTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIHRoZSBibG9jayBkYXRhIGNvbXByZXNzZWQgdXNpbmcgdGhlIGdpdmVuIEh1ZmZtYW4gdHJlZXNcbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NfYmxvY2socywgbHRyZWUsIGR0cmVlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGNvbnN0IGN0X2RhdGEgKmx0cmVlOyAvKiBsaXRlcmFsIHRyZWUgKi9cbi8vICAgIGNvbnN0IGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovXG57XG4gIHZhciBkaXN0OyAgICAgICAgICAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxjOyAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkgKi9cbiAgdmFyIGx4ID0gMDsgICAgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG4gIHZhciBjb2RlOyAgICAgICAgICAgLyogdGhlIGNvZGUgdG8gc2VuZCAqL1xuICB2YXIgZXh0cmE7ICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIHNlbmQgKi9cblxuICBpZiAocy5sYXN0X2xpdCAhPT0gMCkge1xuICAgIGRvIHtcbiAgICAgIGRpc3QgPSAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyXSA8PCA4KSB8IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDIgKyAxXSk7XG4gICAgICBsYyA9IHMucGVuZGluZ19idWZbcy5sX2J1ZiArIGx4XTtcbiAgICAgIGx4Kys7XG5cbiAgICAgIGlmIChkaXN0ID09PSAwKSB7XG4gICAgICAgIHNlbmRfY29kZShzLCBsYywgbHRyZWUpOyAvKiBzZW5kIGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAgIC8vVHJhY2Vjdihpc2dyYXBoKGxjKSwgKHN0ZGVycixcIiAnJWMnIFwiLCBsYykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqL1xuICAgICAgICBjb2RlID0gX2xlbmd0aF9jb2RlW2xjXTtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUgKyBMSVRFUkFMUyArIDEsIGx0cmVlKTsgLyogc2VuZCB0aGUgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTtcbiAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7XG4gICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07XG4gICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7ICAgICAgIC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovXG4gICAgICAgIH1cbiAgICAgICAgZGlzdC0tOyAvKiBkaXN0IGlzIG5vdyB0aGUgbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7XG4gICAgICAgIC8vQXNzZXJ0IChjb2RlIDwgRF9DT0RFUywgXCJiYWQgZF9jb2RlXCIpO1xuXG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlLCBkdHJlZSk7ICAgICAgIC8qIHNlbmQgdGhlIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgZXh0cmEgPSBleHRyYV9kYml0c1tjb2RlXTtcbiAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7XG4gICAgICAgICAgZGlzdCAtPSBiYXNlX2Rpc3RbY29kZV07XG4gICAgICAgICAgc2VuZF9iaXRzKHMsIGRpc3QsIGV4dHJhKTsgICAvKiBzZW5kIHRoZSBleHRyYSBkaXN0YW5jZSBiaXRzICovXG4gICAgICAgIH1cbiAgICAgIH0gLyogbGl0ZXJhbCBvciBtYXRjaCBwYWlyID8gKi9cblxuICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgb3ZlcmxheSBiZXR3ZWVuIHBlbmRpbmdfYnVmIGFuZCBkX2J1ZitsX2J1ZiBpcyBvazogKi9cbiAgICAgIC8vQXNzZXJ0KCh1SW50KShzLT5wZW5kaW5nKSA8IHMtPmxpdF9idWZzaXplICsgMipseCxcbiAgICAgIC8vICAgICAgIFwicGVuZGluZ0J1ZiBvdmVyZmxvd1wiKTtcblxuICAgIH0gd2hpbGUgKGx4IDwgcy5sYXN0X2xpdCk7XG4gIH1cblxuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3Qgb25lIEh1ZmZtYW4gdHJlZSBhbmQgYXNzaWducyB0aGUgY29kZSBiaXQgc3RyaW5ncyBhbmQgbGVuZ3Rocy5cbiAqIFVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBmcmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkcyBsZW4gYW5kIGNvZGUgYXJlIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoXG4gKiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgY29kZS4gVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXNcbiAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX3RyZWUocywgZGVzYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB0cmVlX2Rlc2MgKmRlc2M7IC8qIHRoZSB0cmVlIGRlc2NyaXB0b3IgKi9cbntcbiAgdmFyIHRyZWUgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIHN0cmVlICAgID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7XG4gIHZhciBoYXNfc3RyZWUgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7XG4gIHZhciBlbGVtcyAgICA9IGRlc2Muc3RhdF9kZXNjLmVsZW1zO1xuICB2YXIgbiwgbTsgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIGhlYXAgZWxlbWVudHMgKi9cbiAgdmFyIG1heF9jb2RlID0gLTE7IC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB2YXIgbm9kZTsgICAgICAgICAgLyogbmV3IG5vZGUgYmVpbmcgY3JlYXRlZCAqL1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgaW5pdGlhbCBoZWFwLCB3aXRoIGxlYXN0IGZyZXF1ZW50IGVsZW1lbnQgaW5cbiAgICogaGVhcFtTTUFMTEVTVF0uIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uXG4gICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuXG4gICAqL1xuICBzLmhlYXBfbGVuID0gMDtcbiAgcy5oZWFwX21heCA9IEhFQVBfU0laRTtcblxuICBmb3IgKG4gPSAwOyBuIDwgZWxlbXM7IG4rKykge1xuICAgIGlmICh0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkge1xuICAgICAgcy5oZWFwWysrcy5oZWFwX2xlbl0gPSBtYXhfY29kZSA9IG47XG4gICAgICBzLmRlcHRoW25dID0gMDtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cyxcbiAgICogYW5kIHRoYXQgYXQgbGVhc3Qgb25lIGJpdCBzaG91bGQgYmUgc2VudCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lXG4gICAqIHBvc3NpYmxlIGNvZGUuIFNvIHRvIGF2b2lkIHNwZWNpYWwgY2hlY2tzIGxhdGVyIG9uIHdlIGZvcmNlIGF0IGxlYXN0XG4gICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuXG4gICAqL1xuICB3aGlsZSAocy5oZWFwX2xlbiA8IDIpIHtcbiAgICBub2RlID0gcy5oZWFwWysrcy5oZWFwX2xlbl0gPSAobWF4X2NvZGUgPCAyID8gKyttYXhfY29kZSA6IDApO1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gMTtcbiAgICBzLmRlcHRoW25vZGVdID0gMDtcbiAgICBzLm9wdF9sZW4tLTtcblxuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiAtPSBzdHJlZVtub2RlICogMiArIDFdLyouTGVuKi87XG4gICAgfVxuICAgIC8qIG5vZGUgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqL1xuICB9XG4gIGRlc2MubWF4X2NvZGUgPSBtYXhfY29kZTtcblxuICAvKiBUaGUgZWxlbWVudHMgaGVhcFtoZWFwX2xlbi8yKzEgLi4gaGVhcF9sZW5dIGFyZSBsZWF2ZXMgb2YgdGhlIHRyZWUsXG4gICAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOlxuICAgKi9cbiAgZm9yIChuID0gKHMuaGVhcF9sZW4gPj4gMS8qaW50IC8yKi8pOyBuID49IDE7IG4tLSkgeyBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOyB9XG5cbiAgLyogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGxlYXN0IHR3b1xuICAgKiBmcmVxdWVudCBub2Rlcy5cbiAgICovXG4gIG5vZGUgPSBlbGVtczsgICAgICAgICAgICAgIC8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqL1xuICBkbyB7XG4gICAgLy9wcXJlbW92ZShzLCB0cmVlLCBuKTsgIC8qIG4gPSBub2RlIG9mIGxlYXN0IGZyZXF1ZW5jeSAqL1xuICAgIC8qKiogcHFyZW1vdmUgKioqL1xuICAgIG4gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG4gICAgcy5oZWFwWzEvKlNNQUxMRVNUKi9dID0gcy5oZWFwW3MuaGVhcF9sZW4tLV07XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcbiAgICAvKioqL1xuXG4gICAgbSA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTsgLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi9cblxuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqL1xuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbTtcblxuICAgIC8qIENyZWF0ZSBhIG5ldyBub2RlIGZhdGhlciBvZiBuIGFuZCBtICovXG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSB0cmVlW24gKiAyXS8qLkZyZXEqLyArIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAocy5kZXB0aFtuXSA+PSBzLmRlcHRoW21dID8gcy5kZXB0aFtuXSA6IHMuZGVwdGhbbV0pICsgMTtcbiAgICB0cmVlW24gKiAyICsgMV0vKi5EYWQqLyA9IHRyZWVbbSAqIDIgKyAxXS8qLkRhZCovID0gbm9kZTtcblxuICAgIC8qIGFuZCBpbnNlcnQgdGhlIG5ldyBub2RlIGluIHRoZSBoZWFwICovXG4gICAgcy5oZWFwWzEvKlNNQUxMRVNUKi9dID0gbm9kZSsrO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG5cbiAgfSB3aGlsZSAocy5oZWFwX2xlbiA+PSAyKTtcblxuICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcblxuICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LiBXZSBjYW4gbm93XG4gICAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy5cbiAgICovXG4gIGdlbl9iaXRsZW4ocywgZGVzYyk7XG5cbiAgLyogVGhlIGZpZWxkIGxlbiBpcyBub3cgc2V0LCB3ZSBjYW4gZ2VuZXJhdGUgdGhlIGJpdCBjb2RlcyAqL1xuICBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIHMuYmxfY291bnQpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2Rlc1xuICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS5cbiAqL1xuZnVuY3Rpb24gc2Nhbl90cmVlKHMsIHRyZWUsIG1heF9jb2RlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuICB0cmVlWyhtYXhfY29kZSArIDEpICogMiArIDFdLyouTGVuKi8gPSAweGZmZmY7IC8qIGd1YXJkICovXG5cbiAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgY3VybGVuID0gbmV4dGxlbjtcbiAgICBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdLyouTGVuKi87XG5cbiAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkge1xuICAgICAgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovICs9IGNvdW50O1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcblxuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikgeyBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8rKzsgfVxuICAgICAgcy5ibF90cmVlW1JFUF8zXzYgKiAyXS8qLkZyZXEqLysrO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkge1xuICAgICAgcy5ibF90cmVlW1JFUFpfM18xMCAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcy5ibF90cmVlW1JFUFpfMTFfMTM4ICogMl0vKi5GcmVxKi8rKztcbiAgICB9XG5cbiAgICBjb3VudCA9IDA7XG4gICAgcHJldmxlbiA9IGN1cmxlbjtcblxuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSBpbiBjb21wcmVzc2VkIGZvcm0sIHVzaW5nIHRoZSBjb2RlcyBpblxuICogYmxfdHJlZS5cbiAqL1xuZnVuY3Rpb24gc2VuZF90cmVlKHMsIHRyZWUsIG1heF9jb2RlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7IC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0vKi5MZW4qLzsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIC8qIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gLTE7ICovICAvKiBndWFyZCBhbHJlYWR5IHNldCAqL1xuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG5cbiAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgY3VybGVuID0gbmV4dGxlbjtcbiAgICBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdLyouTGVuKi87XG5cbiAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkge1xuICAgICAgZG8geyBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpOyB9IHdoaWxlICgtLWNvdW50ICE9PSAwKTtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7XG4gICAgICAgIHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7XG4gICAgICAgIGNvdW50LS07XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChjb3VudCA+PSAzICYmIGNvdW50IDw9IDYsIFwiIDNfNj9cIik7XG4gICAgICBzZW5kX2NvZGUocywgUkVQXzNfNiwgcy5ibF90cmVlKTtcbiAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDMsIDIpO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfM18xMCwgcy5ibF90cmVlKTtcbiAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDMsIDMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy5ibF90cmVlKTtcbiAgICAgIHNlbmRfYml0cyhzLCBjb3VudCAtIDExLCA3KTtcbiAgICB9XG5cbiAgICBjb3VudCA9IDA7XG4gICAgcHJldmxlbiA9IGN1cmxlbjtcbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgYW5kIHJldHVybiB0aGUgaW5kZXggaW5cbiAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLlxuICovXG5mdW5jdGlvbiBidWlsZF9ibF90cmVlKHMpIHtcbiAgdmFyIG1heF9ibGluZGV4OyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgYml0IGxlbmd0aCBmcmVxdWVuY2llcyBmb3IgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi9cbiAgc2Nhbl90cmVlKHMsIHMuZHluX2x0cmVlLCBzLmxfZGVzYy5tYXhfY29kZSk7XG4gIHNjYW5fdHJlZShzLCBzLmR5bl9kdHJlZSwgcy5kX2Rlc2MubWF4X2NvZGUpO1xuXG4gIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWU6ICovXG4gIGJ1aWxkX3RyZWUocywgcy5ibF9kZXNjKTtcbiAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdFxuICAgKiB0aGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aHMgY29kZXMgYW5kIHRoZSA1KzUrNCBiaXRzIGZvciB0aGUgY291bnRzLlxuICAgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXRcbiAgICogcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCA0IGJpdCBsZW5ndGggY29kZXMgYmUgc2VudC4gKGFwcG5vdGUudHh0IHNheXNcbiAgICogMyBidXQgdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGlzIDQuKVxuICAgKi9cbiAgZm9yIChtYXhfYmxpbmRleCA9IEJMX0NPREVTIC0gMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkge1xuICAgIGlmIChzLmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdICogMiArIDFdLyouTGVuKi8gIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBiaXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqL1xuICBzLm9wdF9sZW4gKz0gMyAqIChtYXhfYmxpbmRleCArIDEpICsgNSArIDUgKyA0O1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGRcIixcbiAgLy8gICAgICAgIHMtPm9wdF9sZW4sIHMtPnN0YXRpY19sZW4pKTtcblxuICByZXR1cm4gbWF4X2JsaW5kZXg7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcgZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGVcbiAqIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMsIHRoZSBsaXRlcmFsIHRyZWUgYW5kIHRoZSBkaXN0YW5jZSB0cmVlLlxuICogSU4gYXNzZXJ0aW9uOiBsY29kZXMgPj0gMjU3LCBkY29kZXMgPj0gMSwgYmxjb2RlcyA+PSA0LlxuICovXG5mdW5jdGlvbiBzZW5kX2FsbF90cmVlcyhzLCBsY29kZXMsIGRjb2RlcywgYmxjb2Rlcylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovXG57XG4gIHZhciByYW5rOyAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW4gYmxfb3JkZXIgKi9cblxuICAvL0Fzc2VydCAobGNvZGVzID49IDI1NyAmJiBkY29kZXMgPj0gMSAmJiBibGNvZGVzID49IDQsIFwibm90IGVub3VnaCBjb2Rlc1wiKTtcbiAgLy9Bc3NlcnQgKGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsXG4gIC8vICAgICAgICBcInRvbyBtYW55IGNvZGVzXCIpO1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvdW50czogXCIpKTtcbiAgc2VuZF9iaXRzKHMsIGxjb2RlcyAtIDI1NywgNSk7IC8qIG5vdCArMjU1IGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBzZW5kX2JpdHMocywgZGNvZGVzIC0gMSwgICA1KTtcbiAgc2VuZF9iaXRzKHMsIGJsY29kZXMgLSA0LCAgNCk7IC8qIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykge1xuICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY29kZSAlMmQgXCIsIGJsX29yZGVyW3JhbmtdKSk7XG4gICAgc2VuZF9iaXRzKHMsIHMuYmxfdHJlZVtibF9vcmRlcltyYW5rXSAqIDIgKyAxXS8qLkxlbiovLCAzKTtcbiAgfVxuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9sdHJlZSwgbGNvZGVzIC0gMSk7IC8qIGxpdGVyYWwgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmxpdCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fZHRyZWUsIGRjb2RlcyAtIDEpOyAvKiBkaXN0YW5jZSB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZGlzdCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENoZWNrIGlmIHRoZSBkYXRhIHR5cGUgaXMgVEVYVCBvciBCSU5BUlksIHVzaW5nIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOlxuICogLSBURVhUIGlmIHRoZSB0d28gY29uZGl0aW9ucyBiZWxvdyBhcmUgc2F0aXNmaWVkOlxuICogICAgYSkgVGhlcmUgYXJlIG5vIG5vbi1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJibGFjayBsaXN0XCIgKDAuLjYsIDE0Li4yNSwgMjguLjMxKS5cbiAqICAgIGIpIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwcmludGFibGUgY2hhcmFjdGVyIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwid2hpdGUgbGlzdFwiICg5IHtUQUJ9LCAxMCB7TEZ9LCAxMyB7Q1J9LCAzMi4uMjU1KS5cbiAqIC0gQklOQVJZIG90aGVyd2lzZS5cbiAqIC0gVGhlIGZvbGxvd2luZyBwYXJ0aWFsbHktcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGZvcm0gYVxuICogICBcImdyYXkgbGlzdFwiIHRoYXQgaXMgaWdub3JlZCBpbiB0aGlzIGRldGVjdGlvbiBhbGdvcml0aG06XG4gKiAgICg3IHtCRUx9LCA4IHtCU30sIDExIHtWVH0sIDEyIHtGRn0sIDI2IHtTVUJ9LCAyNyB7RVNDfSkuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgRnJlcSBvZiBkeW5fbHRyZWUgYXJlIHNldC5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0X2RhdGFfdHlwZShzKSB7XG4gIC8qIGJsYWNrX21hc2sgaXMgdGhlIGJpdCBtYXNrIG9mIGJsYWNrLWxpc3RlZCBieXRlc1xuICAgKiBzZXQgYml0cyAwLi42LCAxNC4uMjUsIGFuZCAyOC4uMzFcbiAgICogMHhmM2ZmYzA3ZiA9IGJpbmFyeSAxMTExMDAxMTExMTExMTExMTEwMDAwMDAwMTExMTExMVxuICAgKi9cbiAgdmFyIGJsYWNrX21hc2sgPSAweGYzZmZjMDdmO1xuICB2YXIgbjtcblxuICAvKiBDaGVjayBmb3Igbm9uLXRleHR1YWwgKFwiYmxhY2stbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDw9IDMxOyBuKyssIGJsYWNrX21hc2sgPj4+PSAxKSB7XG4gICAgaWYgKChibGFja19tYXNrICYgMSkgJiYgKHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkpIHtcbiAgICAgIHJldHVybiBaX0JJTkFSWTtcbiAgICB9XG4gIH1cblxuICAvKiBDaGVjayBmb3IgdGV4dHVhbCAoXCJ3aGl0ZS1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGlmIChzLmR5bl9sdHJlZVs5ICogMl0vKi5GcmVxKi8gIT09IDAgfHwgcy5keW5fbHRyZWVbMTAgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fFxuICAgICAgcy5keW5fbHRyZWVbMTMgKiAyXS8qLkZyZXEqLyAhPT0gMCkge1xuICAgIHJldHVybiBaX1RFWFQ7XG4gIH1cbiAgZm9yIChuID0gMzI7IG4gPCBMSVRFUkFMUzsgbisrKSB7XG4gICAgaWYgKHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyAhPT0gMCkge1xuICAgICAgcmV0dXJuIFpfVEVYVDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGVyZSBhcmUgbm8gXCJibGFjay1saXN0ZWRcIiBvciBcIndoaXRlLWxpc3RlZFwiIGJ5dGVzOlxuICAgKiB0aGlzIHN0cmVhbSBlaXRoZXIgaXMgZW1wdHkgb3IgaGFzIHRvbGVyYXRlZCAoXCJncmF5LWxpc3RlZFwiKSBieXRlcyBvbmx5LlxuICAgKi9cbiAgcmV0dXJuIFpfQklOQVJZO1xufVxuXG5cbnZhciBzdGF0aWNfaW5pdF9kb25lID0gZmFsc2U7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBfdHJfaW5pdChzKVxue1xuXG4gIGlmICghc3RhdGljX2luaXRfZG9uZSkge1xuICAgIHRyX3N0YXRpY19pbml0KCk7XG4gICAgc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG4gIH1cblxuICBzLmxfZGVzYyAgPSBuZXcgVHJlZURlc2Mocy5keW5fbHRyZWUsIHN0YXRpY19sX2Rlc2MpO1xuICBzLmRfZGVzYyAgPSBuZXcgVHJlZURlc2Mocy5keW5fZHRyZWUsIHN0YXRpY19kX2Rlc2MpO1xuICBzLmJsX2Rlc2MgPSBuZXcgVHJlZURlc2Mocy5ibF90cmVlLCBzdGF0aWNfYmxfZGVzYyk7XG5cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcblxuICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi9cbiAgaW5pdF9ibG9jayhzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBzdG9yZWQgYmxvY2tcbiAqL1xuZnVuY3Rpb24gX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2sgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgc2VuZF9iaXRzKHMsIChTVE9SRURfQkxPQ0sgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7ICAgIC8qIHNlbmQgYmxvY2sgdHlwZSAqL1xuICBjb3B5X2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgdHJ1ZSk7IC8qIHdpdGggaGVhZGVyICovXG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIG9uZSBlbXB0eSBzdGF0aWMgYmxvY2sgdG8gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlLlxuICogVGhpcyB0YWtlcyAxMCBiaXRzLCBvZiB3aGljaCA3IG1heSByZW1haW4gaW4gdGhlIGJpdCBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIF90cl9hbGlnbihzKSB7XG4gIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVMgPDwgMSwgMyk7XG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7XG4gIGJpX2ZsdXNoKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nIGZvciB0aGUgY3VycmVudCBibG9jazogZHluYW1pYyB0cmVlcywgc3RhdGljXG4gKiB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwIGZpbGUuXG4gKi9cbmZ1bmN0aW9uIF90cl9mbHVzaF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2ssIG9yIE5VTEwgaWYgdG9vIG9sZCAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICB2YXIgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAgLyogb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBpbiBieXRlcyAqL1xuICB2YXIgbWF4X2JsaW5kZXggPSAwOyAgICAgICAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqL1xuXG4gIC8qIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzIHVubGVzcyBhIHN0b3JlZCBibG9jayBpcyBmb3JjZWQgKi9cbiAgaWYgKHMubGV2ZWwgPiAwKSB7XG5cbiAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBiaW5hcnkgb3IgdGV4dCAqL1xuICAgIGlmIChzLnN0cm0uZGF0YV90eXBlID09PSBaX1VOS05PV04pIHtcbiAgICAgIHMuc3RybS5kYXRhX3R5cGUgPSBkZXRlY3RfZGF0YV90eXBlKHMpO1xuICAgIH1cblxuICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi9cbiAgICBidWlsZF90cmVlKHMsIHMubF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuXG4gICAgYnVpbGRfdHJlZShzLCBzLmRfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG4gICAgLyogQXQgdGhpcyBwb2ludCwgb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mXG4gICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy5cbiAgICAgKi9cblxuICAgIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWUgZm9yIHRoZSBhYm92ZSB0d28gdHJlZXMsIGFuZCBnZXQgdGhlIGluZGV4XG4gICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gICAgICovXG4gICAgbWF4X2JsaW5kZXggPSBidWlsZF9ibF90cmVlKHMpO1xuXG4gICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqL1xuICAgIG9wdF9sZW5iID0gKHMub3B0X2xlbiArIDMgKyA3KSA+Pj4gMztcbiAgICBzdGF0aWNfbGVuYiA9IChzLnN0YXRpY19sZW4gKyAzICsgNykgPj4+IDM7XG5cbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSBcIixcbiAgICAvLyAgICAgICAgb3B0X2xlbmIsIHMtPm9wdF9sZW4sIHN0YXRpY19sZW5iLCBzLT5zdGF0aWNfbGVuLCBzdG9yZWRfbGVuLFxuICAgIC8vICAgICAgICBzLT5sYXN0X2xpdCkpO1xuXG4gICAgaWYgKHN0YXRpY19sZW5iIDw9IG9wdF9sZW5iKSB7IG9wdF9sZW5iID0gc3RhdGljX2xlbmI7IH1cblxuICB9IGVsc2Uge1xuICAgIC8vIEFzc2VydChidWYgIT0gKGNoYXIqKTAsIFwibG9zdCBidWZcIik7XG4gICAgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqL1xuICB9XG5cbiAgaWYgKChzdG9yZWRfbGVuICsgNCA8PSBvcHRfbGVuYikgJiYgKGJ1ZiAhPT0gLTEpKSB7XG4gICAgLyogNDogdHdvIHdvcmRzIGZvciB0aGUgbGVuZ3RocyAqL1xuXG4gICAgLyogVGhlIHRlc3QgYnVmICE9IE5VTEwgaXMgb25seSBuZWNlc3NhcnkgaWYgTElUX0JVRlNJWkUgPiBXU0laRS5cbiAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlXG4gICAgICogdGhlIGxhc3QgYmxvY2sgZmx1c2gsIGJlY2F1c2UgY29tcHJlc3Npb24gd291bGQgaGF2ZSBiZWVuXG4gICAgICogc3VjY2Vzc2Z1bC4gSWYgTElUX0JVRlNJWkUgPD0gV1NJWkUsIGl0IGlzIG5ldmVyIHRvbyBsYXRlIHRvXG4gICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay5cbiAgICAgKi9cbiAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCk7XG5cbiAgfSBlbHNlIGlmIChzLnN0cmF0ZWd5ID09PSBaX0ZJWEVEIHx8IHN0YXRpY19sZW5iID09PSBvcHRfbGVuYikge1xuXG4gICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVMgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7XG4gICAgY29tcHJlc3NfYmxvY2socywgc3RhdGljX2x0cmVlLCBzdGF0aWNfZHRyZWUpO1xuXG4gIH0gZWxzZSB7XG4gICAgc2VuZF9iaXRzKHMsIChEWU5fVFJFRVMgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7XG4gICAgc2VuZF9hbGxfdHJlZXMocywgcy5sX2Rlc2MubWF4X2NvZGUgKyAxLCBzLmRfZGVzYy5tYXhfY29kZSArIDEsIG1heF9ibGluZGV4ICsgMSk7XG4gICAgY29tcHJlc3NfYmxvY2socywgcy5keW5fbHRyZWUsIHMuZHluX2R0cmVlKTtcbiAgfVxuICAvLyBBc3NlcnQgKHMtPmNvbXByZXNzZWRfbGVuID09IHMtPmJpdHNfc2VudCwgXCJiYWQgY29tcHJlc3NlZCBzaXplXCIpO1xuICAvKiBUaGUgYWJvdmUgY2hlY2sgaXMgbWFkZSBtb2QgMl4zMiwgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDUxMiBNQlxuICAgKiBhbmQgdUxvbmcgaW1wbGVtZW50ZWQgb24gMzIgYml0cy5cbiAgICovXG4gIGluaXRfYmxvY2socyk7XG5cbiAgaWYgKGxhc3QpIHtcbiAgICBiaV93aW5kdXAocyk7XG4gIH1cbiAgLy8gVHJhY2V2KChzdGRlcnIsXCJcXG5jb21wcmxlbiAlbHUoJWx1KSBcIiwgcy0+Y29tcHJlc3NlZF9sZW4+PjMsXG4gIC8vICAgICAgIHMtPmNvbXByZXNzZWRfbGVuLTcqbGFzdCkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZlxuICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLlxuICovXG5mdW5jdGlvbiBfdHJfdGFsbHkocywgZGlzdCwgbGMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdW5zaWduZWQgZGlzdDsgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4vLyAgICB1bnNpZ25lZCBsYzsgICAgLyogbWF0Y2ggbGVuZ3RoLU1JTl9NQVRDSCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdD09MCkgKi9cbntcbiAgLy92YXIgb3V0X2xlbmd0aCwgaW5fbGVuZ3RoLCBkY29kZTtcblxuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMl0gICAgID0gKGRpc3QgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDIgKyAxXSA9IGRpc3QgJiAweGZmO1xuXG4gIHMucGVuZGluZ19idWZbcy5sX2J1ZiArIHMubGFzdF9saXRdID0gbGMgJiAweGZmO1xuICBzLmxhc3RfbGl0Kys7XG5cbiAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi9cbiAgICBzLmR5bl9sdHJlZVtsYyAqIDJdLyouRnJlcSovKys7XG4gIH0gZWxzZSB7XG4gICAgcy5tYXRjaGVzKys7XG4gICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqL1xuICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgIC8vQXNzZXJ0KCh1c2gpZGlzdCA8ICh1c2gpTUFYX0RJU1QocykgJiZcbiAgICAvLyAgICAgICAodXNoKWxjIDw9ICh1c2gpKE1BWF9NQVRDSC1NSU5fTUFUQ0gpICYmXG4gICAgLy8gICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICBcIl90cl90YWxseTogYmFkIG1hdGNoXCIpO1xuXG4gICAgcy5keW5fbHRyZWVbKF9sZW5ndGhfY29kZVtsY10gKyBMSVRFUkFMUyArIDEpICogMl0vKi5GcmVxKi8rKztcbiAgICBzLmR5bl9kdHJlZVtkX2NvZGUoZGlzdCkgKiAyXS8qLkZyZXEqLysrO1xuICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYXVsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG5cbi8vI2lmZGVmIFRSVU5DQVRFX0JMT0NLXG4vLyAgLyogVHJ5IHRvIGd1ZXNzIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gc3RvcCB0aGUgY3VycmVudCBibG9jayBoZXJlICovXG4vLyAgaWYgKChzLmxhc3RfbGl0ICYgMHgxZmZmKSA9PT0gMCAmJiBzLmxldmVsID4gMikge1xuLy8gICAgLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoICovXG4vLyAgICBvdXRfbGVuZ3RoID0gcy5sYXN0X2xpdCo4O1xuLy8gICAgaW5fbGVuZ3RoID0gcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQ7XG4vL1xuLy8gICAgZm9yIChkY29kZSA9IDA7IGRjb2RlIDwgRF9DT0RFUzsgZGNvZGUrKykge1xuLy8gICAgICBvdXRfbGVuZ3RoICs9IHMuZHluX2R0cmVlW2Rjb2RlKjJdLyouRnJlcSovICogKDUgKyBleHRyYV9kYml0c1tkY29kZV0pO1xuLy8gICAgfVxuLy8gICAgb3V0X2xlbmd0aCA+Pj49IDM7XG4vLyAgICAvL1RyYWNldigoc3RkZXJyLFwiXFxubGFzdF9saXQgJXUsIGluICVsZCwgb3V0IH4lbGQoJWxkJSUpIFwiLFxuLy8gICAgLy8gICAgICAgcy0+bGFzdF9saXQsIGluX2xlbmd0aCwgb3V0X2xlbmd0aCxcbi8vICAgIC8vICAgICAgIDEwMEwgLSBvdXRfbGVuZ3RoKjEwMEwvaW5fbGVuZ3RoKSk7XG4vLyAgICBpZiAocy5tYXRjaGVzIDwgKHMubGFzdF9saXQ+PjEpLyppbnQgLzIqLyAmJiBvdXRfbGVuZ3RoIDwgKGluX2xlbmd0aD4+MSkvKmludCAvMiovKSB7XG4vLyAgICAgIHJldHVybiB0cnVlO1xuLy8gICAgfVxuLy8gIH1cbi8vI2VuZGlmXG5cbiAgcmV0dXJuIChzLmxhc3RfbGl0ID09PSBzLmxpdF9idWZzaXplIC0gMSk7XG4gIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggbGl0X2J1ZnNpemUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0S1xuICAgKiBvbiAxNiBiaXQgbWFjaGluZXMgYW5kIGJlY2F1c2Ugc3RvcmVkIGJsb2NrcyBhcmUgcmVzdHJpY3RlZCB0b1xuICAgKiA2NEstMSBieXRlcy5cbiAgICovXG59XG5cbmV4cG9ydHMuX3RyX2luaXQgID0gX3RyX2luaXQ7XG5leHBvcnRzLl90cl9zdG9yZWRfYmxvY2sgPSBfdHJfc3RvcmVkX2Jsb2NrO1xuZXhwb3J0cy5fdHJfZmx1c2hfYmxvY2sgID0gX3RyX2ZsdXNoX2Jsb2NrO1xuZXhwb3J0cy5fdHJfdGFsbHkgPSBfdHJfdGFsbHk7XG5leHBvcnRzLl90cl9hbGlnbiA9IF90cl9hbGlnbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5mdW5jdGlvbiBaU3RyZWFtKCkge1xuICAvKiBuZXh0IGlucHV0IGJ5dGUgKi9cbiAgdGhpcy5pbnB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X2luID0gMDtcbiAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBpbnB1dCAqL1xuICB0aGlzLmF2YWlsX2luID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovXG4gIHRoaXMudG90YWxfaW4gPSAwO1xuICAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi9cbiAgdGhpcy5vdXRwdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9vdXQgPSAwO1xuICAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBvdXRwdXQgKi9cbiAgdGhpcy5hdmFpbF9vdXQgPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX291dCA9IDA7XG4gIC8qIGxhc3QgZXJyb3IgbWVzc2FnZSwgTlVMTCBpZiBubyBlcnJvciAqL1xuICB0aGlzLm1zZyA9ICcnLypaX05VTEwqLztcbiAgLyogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICovXG4gIHRoaXMuc3RhdGUgPSBudWxsO1xuICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGJpbmFyeSBvciB0ZXh0ICovXG4gIHRoaXMuZGF0YV90eXBlID0gMi8qWl9VTktOT1dOKi87XG4gIC8qIGFkbGVyMzIgdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovXG4gIHRoaXMuYWRsZXIgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFpTdHJlYW07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvUGFyc2UuanMnKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRyYWNrID0gdHJhY2s7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG4vKipcbiAqIFBhcnNlLkFuYWx5dGljcyBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gUGFyc2UncyBsb2dnaW5nIGFuZCBhbmFseXRpY3NcbiAqIGJhY2tlbmQuXG4gKlxuICogQGNsYXNzIFBhcnNlLkFuYWx5dGljc1xuICogQHN0YXRpY1xuICogQGhpZGVjb25zdHJ1Y3RvclxuICovXG5cbi8qKlxuICogVHJhY2tzIHRoZSBvY2N1cnJlbmNlIG9mIGEgY3VzdG9tIGV2ZW50IHdpdGggYWRkaXRpb25hbCBkaW1lbnNpb25zLlxuICogUGFyc2Ugd2lsbCBzdG9yZSBhIGRhdGEgcG9pbnQgYXQgdGhlIHRpbWUgb2YgaW52b2NhdGlvbiB3aXRoIHRoZSBnaXZlblxuICogZXZlbnQgbmFtZS5cbiAqXG4gKiBEaW1lbnNpb25zIHdpbGwgYWxsb3cgc2VnbWVudGF0aW9uIG9mIHRoZSBvY2N1cnJlbmNlcyBvZiB0aGlzIGN1c3RvbVxuICogZXZlbnQuIEtleXMgYW5kIHZhbHVlcyBzaG91bGQgYmUge0Bjb2RlIFN0cmluZ31zLCBhbmQgd2lsbCB0aHJvd1xuICogb3RoZXJ3aXNlLlxuICpcbiAqIFRvIHRyYWNrIGEgdXNlciBzaWdudXAgYWxvbmcgd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhLCBjb25zaWRlciB0aGVcbiAqIGZvbGxvd2luZzpcbiAqIDxwcmU+XG4gKiB2YXIgZGltZW5zaW9ucyA9IHtcbiAqICBnZW5kZXI6ICdtJyxcbiAqICBzb3VyY2U6ICd3ZWInLFxuICogIGRheVR5cGU6ICd3ZWVrZW5kJ1xuICogfTtcbiAqIFBhcnNlLkFuYWx5dGljcy50cmFjaygnc2lnbnVwJywgZGltZW5zaW9ucyk7XG4gKiA8L3ByZT5cbiAqXG4gKiBUaGVyZSBpcyBhIGRlZmF1bHQgbGltaXQgb2YgOCBkaW1lbnNpb25zIHBlciBldmVudCB0cmFja2VkLlxuICpcbiAqIEBmdW5jdGlvbiB0cmFja1xuICogQG5hbWUgUGFyc2UuQW5hbHl0aWNzLnRyYWNrXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIGV2ZW50IHRvIHJlcG9ydCB0byBQYXJzZSBhc1xuICogaGF2aW5nIGhhcHBlbmVkLlxuICogQHBhcmFtIHtvYmplY3R9IGRpbWVuc2lvbnMgVGhlIGRpY3Rpb25hcnkgb2YgaW5mb3JtYXRpb24gYnkgd2hpY2ggdG9cbiAqIHNlZ21lbnQgdGhpcyBldmVudC5cbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSByb3VuZC10cmlwXG4gKiB0byB0aGUgc2VydmVyIGNvbXBsZXRlcy5cbiAqL1xuZnVuY3Rpb24gdHJhY2sobmFtZSwgZGltZW5zaW9ucykge1xuICBuYW1lID0gbmFtZSB8fCAnJztcbiAgbmFtZSA9IG5hbWUucmVwbGFjZSgvXlxccyovLCAnJyk7XG4gIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1xccyokLywgJycpO1xuICBpZiAobmFtZS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIG5hbWUgZm9yIHRoZSBjdXN0b20gZXZlbnQgbXVzdCBiZSBwcm92aWRlZCcpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIGRpbWVuc2lvbnMpIHtcbiAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIGRpbWVuc2lvbnNba2V5XSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RyYWNrKCkgZGltZW5zaW9ucyBleHBlY3RzIGtleXMgYW5kIHZhbHVlcyBvZiB0eXBlIFwic3RyaW5nXCIuJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBbmFseXRpY3NDb250cm9sbGVyKCkudHJhY2sobmFtZSwgZGltZW5zaW9ucyk7XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgdHJhY2sobmFtZSwgZGltZW5zaW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdldmVudHMvJyArIG5hbWUsIHtcbiAgICAgIGRpbWVuc2lvbnNcbiAgICB9KTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldEFuYWx5dGljc0NvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX1BhcnNlVXNlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VVc2VyXCIpKTtcbnZhciBfdXVpZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXVpZFwiKSk7XG5sZXQgcmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggQW5vbnltb3VzbHkgbG9nZ2VkLWluIHVzZXJzLiA8YnIgLz5cbiAqIEFub255bW91cyB1c2VycyBoYXZlIHNvbWUgdW5pcXVlIGNoYXJhY3RlcmlzdGljczpcbiAqIDx1bD5cbiAqICA8bGk+QW5vbnltb3VzIHVzZXJzIGRvbid0IG5lZWQgYSB1c2VyIG5hbWUgb3IgcGFzc3dvcmQuPC9saT5cbiAqICA8dWw+XG4gKiAgICA8bGk+T25jZSBsb2dnZWQgb3V0LCBhbiBhbm9ueW1vdXMgdXNlciBjYW5ub3QgYmUgcmVjb3ZlcmVkLjwvbGk+XG4gKiAgPC91bD5cbiAqICA8bGk+c2lnblVwIGNvbnZlcnRzIGFuIGFub255bW91cyB1c2VyIHRvIGEgc3RhbmRhcmQgdXNlciB3aXRoIHRoZSBnaXZlbiB1c2VybmFtZSBhbmQgcGFzc3dvcmQuPC9saT5cbiAqICA8dWw+XG4gKiAgICA8bGk+RGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFub255bW91cyB1c2VyIGlzIHJldGFpbmVkLjwvbGk+XG4gKiAgPC91bD5cbiAqICA8bGk+bG9nSW4gc3dpdGNoZXMgdXNlcnMgd2l0aG91dCBjb252ZXJ0aW5nIHRoZSBhbm9ueW1vdXMgdXNlci48L2xpPlxuICogIDx1bD5cbiAqICAgIDxsaT5EYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW5vbnltb3VzIHVzZXIgd2lsbCBiZSBsb3N0LjwvbGk+XG4gKiAgPC91bD5cbiAqICA8bGk+U2VydmljZSBsb2dJbiAoZS5nLiBGYWNlYm9vaywgVHdpdHRlcikgd2lsbCBhdHRlbXB0IHRvIGNvbnZlcnRcbiAqICB0aGUgYW5vbnltb3VzIHVzZXIgaW50byBhIHN0YW5kYXJkIHVzZXIgYnkgbGlua2luZyBpdCB0byB0aGUgc2VydmljZS48L2xpPlxuICogIDx1bD5cbiAqICAgIDxsaT5JZiBhIHVzZXIgYWxyZWFkeSBleGlzdHMgdGhhdCBpcyBsaW5rZWQgdG8gdGhlIHNlcnZpY2UsIGl0IHdpbGwgaW5zdGVhZCBzd2l0Y2ggdG8gdGhlIGV4aXN0aW5nIHVzZXIuPC9saT5cbiAqICA8L3VsPlxuICogIDxsaT5TZXJ2aWNlIGxpbmtpbmcgKGUuZy4gRmFjZWJvb2ssIFR3aXR0ZXIpIHdpbGwgY29udmVydCB0aGUgYW5vbnltb3VzIHVzZXJcbiAqICBpbnRvIGEgc3RhbmRhcmQgdXNlciBieSBsaW5raW5nIGl0IHRvIHRoZSBzZXJ2aWNlLjwvbGk+XG4gKiA8L3VsPlxuICpcbiAqIEBjbGFzcyBQYXJzZS5Bbm9ueW1vdXNVdGlsc1xuICogQHN0YXRpY1xuICovXG5jb25zdCBBbm9ueW1vdXNVdGlscyA9IHtcbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgdXNlciBoYXMgdGhlaXIgYWNjb3VudCBsaW5rZWQgdG8gYW5vbnltb3VzIHVzZXIuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBpc0xpbmtlZFxuICAgKiBAbmFtZSBQYXJzZS5Bbm9ueW1vdXNVdGlscy5pc0xpbmtlZFxuICAgKiBAcGFyYW0ge1BhcnNlLlVzZXJ9IHVzZXIgVXNlciB0byBjaGVjayBmb3IuXG4gICAqICAgICBUaGUgdXNlciBtdXN0IGJlIGxvZ2dlZCBpbiBvbiB0aGlzIGRldmljZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIGhhcyB0aGVpciBhY2NvdW50XG4gICAqICAgICBsaW5rZWQgdG8gYW4gYW5vbnltb3VzIHVzZXIuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGlzTGlua2VkKHVzZXIpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuX2dldEF1dGhQcm92aWRlcigpO1xuICAgIHJldHVybiB1c2VyLl9pc0xpbmtlZChwcm92aWRlci5nZXRBdXRoVHlwZSgpKTtcbiAgfSxcbiAgLyoqXG4gICAqIExvZ3MgaW4gYSB1c2VyIEFub255bW91c2x5LlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbG9nSW5cbiAgICogQG5hbWUgUGFyc2UuQW5vbnltb3VzVXRpbHMubG9nSW5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgTWFzdGVyS2V5IC8gU2Vzc2lvblRva2VuLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gTG9nZ2VkIGluIHVzZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgbG9nSW4ob3B0aW9ucykge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5fZ2V0QXV0aFByb3ZpZGVyKCk7XG4gICAgcmV0dXJuIF9QYXJzZVVzZXIuZGVmYXVsdC5sb2dJbldpdGgocHJvdmlkZXIuZ2V0QXV0aFR5cGUoKSwgcHJvdmlkZXIuZ2V0QXV0aERhdGEoKSwgb3B0aW9ucyk7XG4gIH0sXG4gIC8qKlxuICAgKiBMaW5rcyBBbm9ueW1vdXMgVXNlciB0byBhbiBleGlzdGluZyBQRlVzZXIuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBsaW5rXG4gICAqIEBuYW1lIFBhcnNlLkFub255bW91c1V0aWxzLmxpbmtcbiAgICogQHBhcmFtIHtQYXJzZS5Vc2VyfSB1c2VyIFVzZXIgdG8gbGluay4gVGhpcyBtdXN0IGJlIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE1hc3RlcktleSAvIFNlc3Npb25Ub2tlbi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IExpbmtlZCB3aXRoIFVzZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgbGluayh1c2VyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLl9nZXRBdXRoUHJvdmlkZXIoKTtcbiAgICByZXR1cm4gdXNlci5saW5rV2l0aChwcm92aWRlci5nZXRBdXRoVHlwZSgpLCBwcm92aWRlci5nZXRBdXRoRGF0YSgpLCBvcHRpb25zKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBBdXRoZW50aWNhdGlvbiBQcm92aWRlciBoYXMgYmVlbiByZWdpc3RlcmVkIGZvciB1c2UuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBpc1JlZ2lzdGVyZWRcbiAgICogQG5hbWUgUGFyc2UuQW5vbnltb3VzVXRpbHMuaXNSZWdpc3RlcmVkXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBpc1JlZ2lzdGVyZWQoKSB7XG4gICAgcmV0dXJuIHJlZ2lzdGVyZWQ7XG4gIH0sXG4gIF9nZXRBdXRoUHJvdmlkZXIoKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB7XG4gICAgICByZXN0b3JlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGdldEF1dGhUeXBlKCkge1xuICAgICAgICByZXR1cm4gJ2Fub255bW91cyc7XG4gICAgICB9LFxuICAgICAgZ2V0QXV0aERhdGEoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYXV0aERhdGE6IHtcbiAgICAgICAgICAgIGlkOiAoMCwgX3V1aWQuZGVmYXVsdCkoKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICghcmVnaXN0ZXJlZCkge1xuICAgICAgX1BhcnNlVXNlci5kZWZhdWx0Ll9yZWdpc3RlckF1dGhlbnRpY2F0aW9uUHJvdmlkZXIocHJvdmlkZXIpO1xuICAgICAgcmVnaXN0ZXJlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBwcm92aWRlcjtcbiAgfVxufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEFub255bW91c1V0aWxzOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldEpvYlN0YXR1cyA9IGdldEpvYlN0YXR1cztcbmV4cG9ydHMuZ2V0Sm9ic0RhdGEgPSBnZXRKb2JzRGF0YTtcbmV4cG9ydHMucnVuID0gcnVuO1xuZXhwb3J0cy5zdGFydEpvYiA9IHN0YXJ0Sm9iO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX2VuY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlUXVlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUXVlcnlcIikpO1xuLyoqXG4gKiBDb250YWlucyBmdW5jdGlvbnMgZm9yIGNhbGxpbmcgYW5kIGRlY2xhcmluZ1xuICogPGEgaHJlZj1cIi9kb2NzL2Nsb3VkX2NvZGVfZ3VpZGUjZnVuY3Rpb25zXCI+Y2xvdWQgZnVuY3Rpb25zPC9hPi5cbiAqIDxwPjxzdHJvbmc+PGVtPlxuICogICBTb21lIGZ1bmN0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgZnJvbSBDbG91ZCBDb2RlLlxuICogPC9lbT48L3N0cm9uZz48L3A+XG4gKlxuICogQGNsYXNzIFBhcnNlLkNsb3VkXG4gKiBAc3RhdGljXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKi9cblxuLyoqXG4gKiBNYWtlcyBhIGNhbGwgdG8gYSBjbG91ZCBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gcnVuXG4gKiBAbmFtZSBQYXJzZS5DbG91ZC5ydW5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBmdW5jdGlvbiBuYW1lLlxuICogQHBhcmFtIHtvYmplY3R9IGRhdGEgVGhlIHBhcmFtZXRlcnMgdG8gc2VuZCB0byB0aGUgY2xvdWQgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0XG4gKiBvZiB0aGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHJ1bihuYW1lLCBkYXRhLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2xvdWQgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICB9XG4gIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge307XG4gIGlmIChvcHRpb25zLnVzZU1hc3RlcktleSkge1xuICAgIHJlcXVlc3RPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICB9XG4gIGlmIChvcHRpb25zLnNlc3Npb25Ub2tlbikge1xuICAgIHJlcXVlc3RPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICB9XG4gIGlmIChvcHRpb25zLmluc3RhbGxhdGlvbklkKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPSBvcHRpb25zLmluc3RhbGxhdGlvbklkO1xuICB9XG4gIGlmIChvcHRpb25zLmNvbnRleHQgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICB9XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDbG91ZENvbnRyb2xsZXIoKS5ydW4obmFtZSwgZGF0YSwgcmVxdWVzdE9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEdldHMgZGF0YSBmb3IgdGhlIGN1cnJlbnQgc2V0IG9mIGNsb3VkIGpvYnMuXG4gKlxuICogQGZ1bmN0aW9uIGdldEpvYnNEYXRhXG4gKiBAbmFtZSBQYXJzZS5DbG91ZC5nZXRKb2JzRGF0YVxuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0XG4gKiBvZiB0aGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGdldEpvYnNEYXRhKCkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q2xvdWRDb250cm9sbGVyKCkuZ2V0Sm9ic0RhdGEoe1xuICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBTdGFydHMgYSBnaXZlbiBjbG91ZCBqb2IsIHdoaWNoIHdpbGwgcHJvY2VzcyBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAZnVuY3Rpb24gc3RhcnRKb2JcbiAqIEBuYW1lIFBhcnNlLkNsb3VkLnN0YXJ0Sm9iXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVuY3Rpb24gbmFtZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIFRoZSBwYXJhbWV0ZXJzIHRvIHNlbmQgdG8gdGhlIGNsb3VkIGZ1bmN0aW9uLlxuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgam9iU3RhdHVzSWRcbiAqIG9mIHRoZSBqb2IuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0Sm9iKG5hbWUsIGRhdGEpIHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nsb3VkIGpvYiBuYW1lIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gIH1cbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENsb3VkQ29udHJvbGxlcigpLnN0YXJ0Sm9iKG5hbWUsIGRhdGEsIHtcbiAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0cyBqb2Igc3RhdHVzIGJ5IElkXG4gKlxuICogQGZ1bmN0aW9uIGdldEpvYlN0YXR1c1xuICogQG5hbWUgUGFyc2UuQ2xvdWQuZ2V0Sm9iU3RhdHVzXG4gKiBAcGFyYW0ge3N0cmluZ30gam9iU3RhdHVzSWQgVGhlIElkIG9mIEpvYiBTdGF0dXMuXG4gKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBTdGF0dXMgb2YgSm9iLlxuICovXG5mdW5jdGlvbiBnZXRKb2JTdGF0dXMoam9iU3RhdHVzSWQpIHtcbiAgY29uc3QgcXVlcnkgPSBuZXcgX1BhcnNlUXVlcnkuZGVmYXVsdCgnX0pvYlN0YXR1cycpO1xuICByZXR1cm4gcXVlcnkuZ2V0KGpvYlN0YXR1c0lkLCB7XG4gICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gIH0pO1xufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIHJ1bihuYW1lLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBheWxvYWQgPSAoMCwgX2VuY29kZS5kZWZhdWx0KShkYXRhLCB0cnVlKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdmdW5jdGlvbnMvJyArIG5hbWUsIHBheWxvYWQsIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXF1ZXN0LnRoZW4ocmVzID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcmVzID09PSAnb2JqZWN0JyAmJiAoMCwgX2tleXMuZGVmYXVsdCkocmVzKS5sZW5ndGggPiAwICYmICFyZXMuaGFzT3duUHJvcGVydHkoJ3Jlc3VsdCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9KU09OLCAnVGhlIHNlcnZlciByZXR1cm5lZCBhbiBpbnZhbGlkIHJlc3BvbnNlLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVjb2RlZCA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKHJlcyk7XG4gICAgICBpZiAoZGVjb2RlZCAmJiBkZWNvZGVkLmhhc093blByb3BlcnR5KCdyZXN1bHQnKSkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGRlY29kZWQucmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSxcbiAgZ2V0Sm9ic0RhdGEob3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2Nsb3VkX2NvZGUvam9icy9kYXRhJywgbnVsbCwgb3B0aW9ucyk7XG4gIH0sXG4gIGFzeW5jIHN0YXJ0Sm9iKG5hbWUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGF5bG9hZCA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKGRhdGEsIHRydWUpO1xuICAgIG9wdGlvbnMucmV0dXJuU3RhdHVzID0gdHJ1ZTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnam9icy8nICsgbmFtZSwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLl9oZWFkZXJzPy5bJ1gtUGFyc2UtSm9iLVN0YXR1cy1JZCddO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0Q2xvdWRDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG4vKiogQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LW5hdGl2ZS1hc3luYy1zdG9yYWdlL2FzeW5jLXN0b3JhZ2UvYmxvYi9tYWluL3BhY2thZ2VzL2RlZmF1bHQtc3RvcmFnZS1iYWNrZW5kL3NyYy90eXBlcy50cyAqL1xuXG5jb25zdCBjb25maWcgPSB7XG4gIElTX05PREU6IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAhIXByb2Nlc3MudmVyc2lvbnMgJiYgISFwcm9jZXNzLnZlcnNpb25zLm5vZGUgJiYgIXByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24sXG4gIFJFUVVFU1RfQVRURU1QVF9MSU1JVDogNSxcbiAgUkVRVUVTVF9CQVRDSF9TSVpFOiAyMCxcbiAgUkVRVUVTVF9IRUFERVJTOiB7fSxcbiAgU0VSVkVSX1VSTDogJ2h0dHBzOi8vYXBpLnBhcnNlLmNvbS8xJyxcbiAgU0VSVkVSX0FVVEhfVFlQRTogbnVsbCxcbiAgU0VSVkVSX0FVVEhfVE9LRU46IG51bGwsXG4gIExJVkVRVUVSWV9TRVJWRVJfVVJMOiBudWxsLFxuICBFTkNSWVBURURfS0VZOiBudWxsLFxuICBWRVJTSU9OOiAnanMnICsgXCI1LjMuMFwiLFxuICBBUFBMSUNBVElPTl9JRDogbnVsbCxcbiAgSkFWQVNDUklQVF9LRVk6IG51bGwsXG4gIE1BU1RFUl9LRVk6IG51bGwsXG4gIFVTRV9NQVNURVJfS0VZOiBmYWxzZSxcbiAgUEVSRk9STV9VU0VSX1JFV1JJVEU6IHRydWUsXG4gIEZPUkNFX1JFVk9DQUJMRV9TRVNTSU9OOiBmYWxzZSxcbiAgRU5DUllQVEVEX1VTRVI6IGZhbHNlLFxuICBJREVNUE9URU5DWTogZmFsc2UsXG4gIEFMTE9XX0NVU1RPTV9PQkpFQ1RfSUQ6IGZhbHNlLFxuICBQQVJTRV9FUlJPUlM6IFtdXG59O1xuZnVuY3Rpb24gcmVxdWlyZU1ldGhvZHMobmFtZSwgbWV0aG9kcywgY29udHJvbGxlcikge1xuICAoMCwgX2ZvckVhY2guZGVmYXVsdCkobWV0aG9kcykuY2FsbChtZXRob2RzLCBmdW5jID0+IHtcbiAgICBpZiAodHlwZW9mIGNvbnRyb2xsZXJbZnVuY10gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lfSBtdXN0IGltcGxlbWVudCAke2Z1bmN9KClgKTtcbiAgICB9XG4gIH0pO1xufVxuY29uc3QgQ29yZU1hbmFnZXIgPSB7XG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChjb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGNvbmZpZ1trZXldO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZ3VyYXRpb24ga2V5IG5vdCBmb3VuZDogJyArIGtleSk7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBjb25maWdba2V5XSA9IHZhbHVlO1xuICB9LFxuICBzZXRJZk5lZWRlZDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIWNvbmZpZy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBjb25maWdba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnW2tleV07XG4gIH0sXG4gIC8qIFNwZWNpYWxpemVkIENvbnRyb2xsZXIgU2V0dGVycy9HZXR0ZXJzICovXG5cbiAgc2V0QW5hbHl0aWNzQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0FuYWx5dGljc0NvbnRyb2xsZXInLCBbJ3RyYWNrJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snQW5hbHl0aWNzQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0QW5hbHl0aWNzQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydBbmFseXRpY3NDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldENsb3VkQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0Nsb3VkQ29udHJvbGxlcicsIFsncnVuJywgJ2dldEpvYnNEYXRhJywgJ3N0YXJ0Sm9iJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snQ2xvdWRDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRDbG91ZENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snQ2xvdWRDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldENvbmZpZ0NvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdDb25maWdDb250cm9sbGVyJywgWydjdXJyZW50JywgJ2dldCcsICdzYXZlJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snQ29uZmlnQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0Q29uZmlnQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydDb25maWdDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldENyeXB0b0NvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdDcnlwdG9Db250cm9sbGVyJywgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydDcnlwdG9Db250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRDcnlwdG9Db250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0NyeXB0b0NvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0RXZlbnRFbWl0dGVyKGV2ZW50RW1pdHRlcikge1xuICAgIGNvbmZpZ1snRXZlbnRFbWl0dGVyJ10gPSBldmVudEVtaXR0ZXI7XG4gIH0sXG4gIGdldEV2ZW50RW1pdHRlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydFdmVudEVtaXR0ZXInXTtcbiAgfSxcbiAgc2V0RmlsZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdGaWxlQ29udHJvbGxlcicsIFsnc2F2ZUZpbGUnLCAnc2F2ZUJhc2U2NCddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0ZpbGVDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBzZXRFdmVudHVhbGx5UXVldWUoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdFdmVudHVhbGx5UXVldWUnLCBbJ3BvbGwnLCAnc2F2ZScsICdkZXN0cm95J10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snRXZlbnR1YWxseVF1ZXVlJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRFdmVudHVhbGx5UXVldWUoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snRXZlbnR1YWxseVF1ZXVlJ107XG4gIH0sXG4gIGdldEZpbGVDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0ZpbGVDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdJbnN0YWxsYXRpb25Db250cm9sbGVyJywgWydjdXJyZW50SW5zdGFsbGF0aW9uSWQnLCAnY3VycmVudEluc3RhbGxhdGlvbicsICd1cGRhdGVJbnN0YWxsYXRpb25PbkRpc2snXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydJbnN0YWxsYXRpb25Db250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0luc3RhbGxhdGlvbkNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0TGl2ZVF1ZXJ5KGxpdmVRdWVyeSkge1xuICAgIGNvbmZpZ1snTGl2ZVF1ZXJ5J10gPSBsaXZlUXVlcnk7XG4gIH0sXG4gIGdldExpdmVRdWVyeSgpIHtcbiAgICByZXR1cm4gY29uZmlnWydMaXZlUXVlcnknXTtcbiAgfSxcbiAgc2V0T2JqZWN0Q29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ09iamVjdENvbnRyb2xsZXInLCBbJ3NhdmUnLCAnZmV0Y2gnLCAnZGVzdHJveSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ09iamVjdENvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldE9iamVjdENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snT2JqZWN0Q29udHJvbGxlciddO1xuICB9LFxuICBzZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdPYmplY3RTdGF0ZUNvbnRyb2xsZXInLCBbJ2dldFN0YXRlJywgJ2luaXRpYWxpemVTdGF0ZScsICdyZW1vdmVTdGF0ZScsICdnZXRTZXJ2ZXJEYXRhJywgJ3NldFNlcnZlckRhdGEnLCAnZ2V0UGVuZGluZ09wcycsICdzZXRQZW5kaW5nT3AnLCAncHVzaFBlbmRpbmdTdGF0ZScsICdwb3BQZW5kaW5nU3RhdGUnLCAnbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZScsICdnZXRPYmplY3RDYWNoZScsICdlc3RpbWF0ZUF0dHJpYnV0ZScsICdlc3RpbWF0ZUF0dHJpYnV0ZXMnLCAnY29tbWl0U2VydmVyQ2hhbmdlcycsICdlbnF1ZXVlVGFzaycsICdjbGVhckFsbFN0YXRlJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snT2JqZWN0U3RhdGVDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snT2JqZWN0U3RhdGVDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldFB1c2hDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnUHVzaENvbnRyb2xsZXInLCBbJ3NlbmQnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydQdXNoQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0UHVzaENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUHVzaENvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0UXVlcnlDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnUXVlcnlDb250cm9sbGVyJywgWydmaW5kJywgJ2FnZ3JlZ2F0ZSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ1F1ZXJ5Q29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0UXVlcnlDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1F1ZXJ5Q29udHJvbGxlciddO1xuICB9LFxuICBzZXRSRVNUQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1JFU1RDb250cm9sbGVyJywgWydyZXF1ZXN0JywgJ2FqYXgnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydSRVNUQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0UkVTVENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUkVTVENvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0U2NoZW1hQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1NjaGVtYUNvbnRyb2xsZXInLCBbJ2dldCcsICdjcmVhdGUnLCAndXBkYXRlJywgJ2RlbGV0ZScsICdzZW5kJywgJ3B1cmdlJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snU2NoZW1hQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0U2NoZW1hQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydTY2hlbWFDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldFNlc3Npb25Db250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnU2Vzc2lvbkNvbnRyb2xsZXInLCBbJ2dldFNlc3Npb24nXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydTZXNzaW9uQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0U2Vzc2lvbkNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snU2Vzc2lvbkNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0U3RvcmFnZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jKSB7XG4gICAgICByZXF1aXJlTWV0aG9kcygnQW4gYXN5bmMgU3RvcmFnZUNvbnRyb2xsZXInLCBbJ2dldEl0ZW1Bc3luYycsICdzZXRJdGVtQXN5bmMnLCAncmVtb3ZlSXRlbUFzeW5jJywgJ2dldEFsbEtleXNBc3luYyddLCBjb250cm9sbGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWlyZU1ldGhvZHMoJ0Egc3luY2hyb25vdXMgU3RvcmFnZUNvbnRyb2xsZXInLCBbJ2dldEl0ZW0nLCAnc2V0SXRlbScsICdyZW1vdmVJdGVtJywgJ2dldEFsbEtleXMnXSwgY29udHJvbGxlcik7XG4gICAgfVxuICAgIGNvbmZpZ1snU3RvcmFnZUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIHNldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlcicsIFsncGluV2l0aE5hbWUnLCAnZnJvbVBpbldpdGhOYW1lJywgJ3VuUGluV2l0aE5hbWUnLCAnZ2V0QWxsQ29udGVudHMnLCAnY2xlYXInXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0TG9jYWxEYXRhc3RvcmUoc3RvcmUpIHtcbiAgICBjb25maWdbJ0xvY2FsRGF0YXN0b3JlJ10gPSBzdG9yZTtcbiAgfSxcbiAgZ2V0TG9jYWxEYXRhc3RvcmUoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snTG9jYWxEYXRhc3RvcmUnXTtcbiAgfSxcbiAgZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snU3RvcmFnZUNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0QXN5bmNTdG9yYWdlKHN0b3JhZ2UpIHtcbiAgICBjb25maWdbJ0FzeW5jU3RvcmFnZSddID0gc3RvcmFnZTtcbiAgfSxcbiAgZ2V0QXN5bmNTdG9yYWdlKCkge1xuICAgIHJldHVybiBjb25maWdbJ0FzeW5jU3RvcmFnZSddO1xuICB9LFxuICBzZXRXZWJTb2NrZXRDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICBjb25maWdbJ1dlYlNvY2tldENvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFdlYlNvY2tldENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snV2ViU29ja2V0Q29udHJvbGxlciddO1xuICB9LFxuICBzZXRVc2VyQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ1VzZXJDb250cm9sbGVyJywgWydzZXRDdXJyZW50VXNlcicsICdjdXJyZW50VXNlcicsICdjdXJyZW50VXNlckFzeW5jJywgJ3NpZ25VcCcsICdsb2dJbicsICdiZWNvbWUnLCAnbG9nT3V0JywgJ21lJywgJ3JlcXVlc3RQYXNzd29yZFJlc2V0JywgJ3VwZ3JhZGVUb1Jldm9jYWJsZVNlc3Npb24nLCAncmVxdWVzdEVtYWlsVmVyaWZpY2F0aW9uJywgJ3ZlcmlmeVBhc3N3b3JkJywgJ2xpbmtXaXRoJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snVXNlckNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldFVzZXJDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1VzZXJDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldExpdmVRdWVyeUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdMaXZlUXVlcnlDb250cm9sbGVyJywgWydzZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50JywgJ2dldERlZmF1bHRMaXZlUXVlcnlDbGllbnQnLCAnX2NsZWFyQ2FjaGVkRGVmYXVsdENsaWVudCddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0xpdmVRdWVyeUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldExpdmVRdWVyeUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snTGl2ZVF1ZXJ5Q29udHJvbGxlciddO1xuICB9LFxuICBzZXRIb29rc0NvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdIb29rc0NvbnRyb2xsZXInLCBbJ2NyZWF0ZScsICdnZXQnLCAndXBkYXRlJywgJ3JlbW92ZSddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0hvb2tzQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0SG9va3NDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0hvb2tzQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRQYXJzZU9wKG9wKSB7XG4gICAgY29uZmlnWydQYXJzZU9wJ10gPSBvcDtcbiAgfSxcbiAgZ2V0UGFyc2VPcCgpIHtcbiAgICByZXR1cm4gY29uZmlnWydQYXJzZU9wJ107XG4gIH0sXG4gIHNldFBhcnNlT2JqZWN0KG9iamVjdCkge1xuICAgIGNvbmZpZ1snUGFyc2VPYmplY3QnXSA9IG9iamVjdDtcbiAgfSxcbiAgZ2V0UGFyc2VPYmplY3QoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUGFyc2VPYmplY3QnXTtcbiAgfSxcbiAgc2V0UGFyc2VRdWVyeShxdWVyeSkge1xuICAgIGNvbmZpZ1snUGFyc2VRdWVyeSddID0gcXVlcnk7XG4gIH0sXG4gIGdldFBhcnNlUXVlcnkoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUGFyc2VRdWVyeSddO1xuICB9LFxuICBzZXRQYXJzZVJvbGUocm9sZSkge1xuICAgIGNvbmZpZ1snUGFyc2VSb2xlJ10gPSByb2xlO1xuICB9LFxuICBnZXRQYXJzZVJvbGUoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUGFyc2VSb2xlJ107XG4gIH0sXG4gIHNldFBhcnNlVXNlcih1c2VyKSB7XG4gICAgY29uZmlnWydQYXJzZVVzZXInXSA9IHVzZXI7XG4gIH0sXG4gIGdldFBhcnNlVXNlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydQYXJzZVVzZXInXTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gQ29yZU1hbmFnZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBDb3JlTWFuYWdlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbmxldCBBRVM7XG5sZXQgRU5DO1xuQUVTID0gcmVxdWlyZSgnY3J5cHRvLWpzL2FlcycpO1xuRU5DID0gcmVxdWlyZSgnY3J5cHRvLWpzL2VuYy11dGY4Jyk7XG5jb25zdCBDcnlwdG9Db250cm9sbGVyID0ge1xuICBlbmNyeXB0KG9iaiwgc2VjcmV0S2V5KSB7XG4gICAgY29uc3QgZW5jcnlwdGVkID0gQUVTLmVuY3J5cHQoKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkob2JqKSwgc2VjcmV0S2V5KTtcbiAgICByZXR1cm4gZW5jcnlwdGVkLnRvU3RyaW5nKCk7XG4gIH0sXG4gIGRlY3J5cHQoZW5jcnlwdGVkVGV4dCwgc2VjcmV0S2V5KSB7XG4gICAgY29uc3QgZGVjcnlwdGVkU3RyID0gQUVTLmRlY3J5cHQoZW5jcnlwdGVkVGV4dCwgc2VjcmV0S2V5KS50b1N0cmluZyhFTkMpO1xuICAgIHJldHVybiBkZWNyeXB0ZWRTdHI7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IENyeXB0b0NvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBDcnlwdG9Db250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbi8qKlxuICogVGhpcyBpcyBhIHNpbXBsZSB3cmFwcGVyIHRvIHVuaWZ5IEV2ZW50RW1pdHRlciBpbXBsZW1lbnRhdGlvbnMgYWNyb3NzIHBsYXRmb3Jtcy5cbiAqL1xuXG5sZXQgRXZlbnRFbWl0dGVyO1xudHJ5IHtcbiAgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xufSBjYXRjaCAoXykge1xuICAvLyBFdmVudEVtaXR0ZXIgdW5hdmFpbGFibGVcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gRXZlbnRFbWl0dGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9zcGxpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NwbGljZVwiKSk7XG52YXIgX2ZpbmRJbmRleCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZC1pbmRleFwiKSk7XG52YXIgX3NldEludGVydmFsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvc2V0LWludGVydmFsXCIpKTtcbnZhciBfZmluZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xudmFyIF9QYXJzZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVF1ZXJ5XCIpKTtcbnZhciBfU3RvcmFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZVwiKSk7XG5jb25zdCBRVUVVRV9LRVkgPSAnUGFyc2UvRXZlbnR1YWxseS9RdWV1ZSc7XG5sZXQgcXVldWVDYWNoZSA9IFtdO1xubGV0IGRpcnR5Q2FjaGUgPSB0cnVlO1xubGV0IHBvbGxpbmcgPSB1bmRlZmluZWQ7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgdG8gcXVldWUgb2JqZWN0cyB0aGF0IHdpbGwgYmVcbiAqIHNhdmVkIHRvIHRoZSBzZXJ2ZXIgYXQgYSBsYXRlciBkYXRlLlxuICpcbiAqIEBjbGFzcyBQYXJzZS5FdmVudHVhbGx5UXVldWVcbiAqIEBzdGF0aWNcbiAqL1xuY29uc3QgRXZlbnR1YWxseVF1ZXVlID0ge1xuICAvKipcbiAgICogQWRkIG9iamVjdCB0byBxdWV1ZSB3aXRoIHNhdmUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gc2F2ZVxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuc2F2ZVxuICAgKiBAcGFyYW0ge1BhcnNlT2JqZWN0fSBvYmplY3QgUGFyc2UuT2JqZWN0IHRvIGJlIHNhdmVkIGV2ZW50dWFsbHlcbiAgICogQHBhcmFtIHtvYmplY3R9IFtzZXJ2ZXJPcHRpb25zXSBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuT2JqZWN0Lmh0bWwjc2F2ZSBQYXJzZS5PYmplY3Quc2F2ZX0gb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBpZiBvYmplY3QgaXMgYWRkZWQgdG8gcXVldWUuXG4gICAqIEBzdGF0aWNcbiAgICogQHNlZSBQYXJzZS5PYmplY3Qjc2F2ZUV2ZW50dWFsbHlcbiAgICovXG4gIHNhdmUob2JqZWN0KSB7XG4gICAgbGV0IHNlcnZlck9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHJldHVybiB0aGlzLmVucXVldWUoJ3NhdmUnLCBvYmplY3QsIHNlcnZlck9wdGlvbnMpO1xuICB9LFxuICAvKipcbiAgICogQWRkIG9iamVjdCB0byBxdWV1ZSB3aXRoIHNhdmUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gZGVzdHJveVxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuZGVzdHJveVxuICAgKiBAcGFyYW0ge1BhcnNlT2JqZWN0fSBvYmplY3QgUGFyc2UuT2JqZWN0IHRvIGJlIGRlc3Ryb3llZCBldmVudHVhbGx5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbc2VydmVyT3B0aW9uc10gU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLk9iamVjdC5odG1sI2Rlc3Ryb3kgUGFyc2UuT2JqZWN0LmRlc3Ryb3l9IG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBpZiBvYmplY3QgaXMgYWRkZWQgdG8gcXVldWUuXG4gICAqIEBzdGF0aWNcbiAgICogQHNlZSBQYXJzZS5PYmplY3QjZGVzdHJveUV2ZW50dWFsbHlcbiAgICovXG4gIGRlc3Ryb3kob2JqZWN0KSB7XG4gICAgbGV0IHNlcnZlck9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHJldHVybiB0aGlzLmVucXVldWUoJ2Rlc3Ryb3knLCBvYmplY3QsIHNlcnZlck9wdGlvbnMpO1xuICB9LFxuICAvKipcbiAgICogR2VuZXJhdGUgdW5pcXVlIGlkZW50aWZpZXIgdG8gYXZvaWQgZHVwbGljYXRlcyBhbmQgbWFpbnRhaW4gcHJldmlvdXMgc3RhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gc2F2ZSAvIGRlc3Ryb3lcbiAgICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCBQYXJzZS5PYmplY3QgdG8gYmUgcXVldWVkXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZ2VuZXJhdGVRdWV1ZUlkKGFjdGlvbiwgb2JqZWN0KSB7XG4gICAgb2JqZWN0Ll9nZXRJZCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGlkLFxuICAgICAgX2xvY2FsSWRcbiAgICB9ID0gb2JqZWN0O1xuICAgIGNvbnN0IHVuaXF1ZUlkID0gb2JqZWN0LmdldCgnaGFzaCcpIHx8IF9sb2NhbElkO1xuICAgIHJldHVybiBbYWN0aW9uLCBjbGFzc05hbWUsIGlkLCB1bmlxdWVJZF0uam9pbignXycpO1xuICB9LFxuICAvKipcbiAgICogQnVpbGQgcXVldWUgb2JqZWN0IGFuZCBhZGQgdG8gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gc2F2ZSAvIGRlc3Ryb3lcbiAgICogQHBhcmFtIHtvYmplY3R9IG9iamVjdCBQYXJzZS5PYmplY3QgdG8gYmUgcXVldWVkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbc2VydmVyT3B0aW9uc11cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBpZiBvYmplY3QgaXMgYWRkZWQgdG8gcXVldWUuXG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgYXN5bmMgZW5xdWV1ZShhY3Rpb24sIG9iamVjdCwgc2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHF1ZXVlRGF0YSA9IGF3YWl0IHRoaXMuZ2V0UXVldWUoKTtcbiAgICBjb25zdCBxdWV1ZUlkID0gdGhpcy5nZW5lcmF0ZVF1ZXVlSWQoYWN0aW9uLCBvYmplY3QpO1xuICAgIGxldCBpbmRleCA9IHRoaXMucXVldWVJdGVtRXhpc3RzKHF1ZXVlRGF0YSwgcXVldWVJZCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIC8vIEFkZCBjYWNoZWQgdmFsdWVzIHRvIG5ldyBvYmplY3QgaWYgdGhleSBkb24ndCBleGlzdFxuICAgICAgZm9yIChjb25zdCBwcm9wIGluIHF1ZXVlRGF0YVtpbmRleF0ub2JqZWN0KSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0LmdldChwcm9wKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBvYmplY3Quc2V0KHByb3AsIHF1ZXVlRGF0YVtpbmRleF0ub2JqZWN0W3Byb3BdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCA9IHF1ZXVlRGF0YS5sZW5ndGg7XG4gICAgfVxuICAgIHF1ZXVlRGF0YVtpbmRleF0gPSB7XG4gICAgICBxdWV1ZUlkLFxuICAgICAgYWN0aW9uLFxuICAgICAgb2JqZWN0OiBvYmplY3QudG9KU09OKCksXG4gICAgICBzZXJ2ZXJPcHRpb25zLFxuICAgICAgaWQ6IG9iamVjdC5pZCxcbiAgICAgIGNsYXNzTmFtZTogb2JqZWN0LmNsYXNzTmFtZSxcbiAgICAgIGhhc2g6IG9iamVjdC5nZXQoJ2hhc2gnKSxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2V0UXVldWUocXVldWVEYXRhKTtcbiAgfSxcbiAgc3RvcmUoZGF0YSkge1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhRVUVVRV9LRVksICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKGRhdGEpKTtcbiAgfSxcbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMoUVVFVUVfS0VZKTtcbiAgfSxcbiAgLyoqXG4gICAqIFNldHMgdGhlIGluLW1lbW9yeSBxdWV1ZSBmcm9tIGxvY2FsIHN0b3JhZ2UgYW5kIHJldHVybnMuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBnZXRRdWV1ZVxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuZ2V0UXVldWVcbiAgICogQHJldHVybnMge1Byb21pc2U8UXVldWVPYmplY3RbXT59XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGFzeW5jIGdldFF1ZXVlKCkge1xuICAgIGlmIChkaXJ0eUNhY2hlKSB7XG4gICAgICBxdWV1ZUNhY2hlID0gSlNPTi5wYXJzZSgoYXdhaXQgdGhpcy5sb2FkKCkpIHx8ICdbXScpO1xuICAgICAgZGlydHlDYWNoZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcXVldWVDYWNoZTtcbiAgfSxcbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBxdWV1ZSB0byBsb2NhbCBzdG9yYWdlXG4gICAqXG4gICAqIEBwYXJhbSB7UXVldWV9IHF1ZXVlIFF1ZXVlIGNvbnRhaW5pbmcgUGFyc2UuT2JqZWN0IGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiBxdWV1ZSBpcyBzdG9yZWQuXG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc2V0UXVldWUocXVldWUpIHtcbiAgICBxdWV1ZUNhY2hlID0gcXVldWU7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUocXVldWVDYWNoZSk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmVzIFBhcnNlLk9iamVjdCBkYXRhIGZyb20gcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWV1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBQYXJzZS5PYmplY3QgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHF1ZXVlIGlzIHN0b3JlZC5cbiAgICogQHN0YXRpY1xuICAgKiBAaWdub3JlXG4gICAqL1xuICBhc3luYyByZW1vdmUocXVldWVJZCkge1xuICAgIGNvbnN0IHF1ZXVlRGF0YSA9IGF3YWl0IHRoaXMuZ2V0UXVldWUoKTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucXVldWVJdGVtRXhpc3RzKHF1ZXVlRGF0YSwgcXVldWVJZCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICgwLCBfc3BsaWNlLmRlZmF1bHQpKHF1ZXVlRGF0YSkuY2FsbChxdWV1ZURhdGEsIGluZGV4LCAxKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0UXVldWUocXVldWVEYXRhKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBvYmplY3RzIGZyb20gcXVldWUuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBjbGVhclxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuY2xlYXJcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHF1ZXVlIGlzIGNsZWFyZWQuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGNsZWFyKCkge1xuICAgIHF1ZXVlQ2FjaGUgPSBbXTtcbiAgICByZXR1cm4gdGhpcy5zdG9yZShbXSk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIGEgcXVldWVJZCBpbiB0aGUgcXVldWUuIFJldHVybnMgLTEgaWYgbm90IGZvdW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge1F1ZXVlfSBxdWV1ZSBRdWV1ZSBjb250YWluaW5nIFBhcnNlLk9iamVjdCBkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVldWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgUGFyc2UuT2JqZWN0IGRhdGEuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcXVldWVJdGVtRXhpc3RzKHF1ZXVlLCBxdWV1ZUlkKSB7XG4gICAgcmV0dXJuICgwLCBfZmluZEluZGV4LmRlZmF1bHQpKHF1ZXVlKS5jYWxsKHF1ZXVlLCBkYXRhID0+IGRhdGEucXVldWVJZCA9PT0gcXVldWVJZCk7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBxdWV1ZS5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGxlbmd0aFxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUubGVuZ3RoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGFzeW5jIGxlbmd0aCgpIHtcbiAgICBjb25zdCBxdWV1ZURhdGEgPSBhd2FpdCB0aGlzLmdldFF1ZXVlKCk7XG4gICAgcmV0dXJuIHF1ZXVlRGF0YS5sZW5ndGg7XG4gIH0sXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgcXVldWUgdG8gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQGZ1bmN0aW9uIHNlbmRRdWV1ZVxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuc2VuZFF1ZXVlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBSZXR1cm5zIHRydWUgaWYgcXVldWUgd2FzIHNlbnQgc3VjY2Vzc2Z1bGx5LlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBhc3luYyBzZW5kUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSBhd2FpdCB0aGlzLmdldFF1ZXVlKCk7XG4gICAgY29uc3QgcXVldWVEYXRhID0gWy4uLnF1ZXVlXTtcbiAgICBpZiAocXVldWVEYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlRGF0YS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgcXVldWVPYmplY3QgPSBxdWV1ZURhdGFbaV07XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlkLFxuICAgICAgICBoYXNoLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgIH0gPSBxdWV1ZU9iamVjdDtcbiAgICAgIGNvbnN0IE9iamVjdFR5cGUgPSBfUGFyc2VPYmplY3QuZGVmYXVsdC5leHRlbmQoY2xhc3NOYW1lKTtcbiAgICAgIGlmIChpZCkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3MuYnlJZChPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCk7XG4gICAgICB9IGVsc2UgaWYgKGhhc2gpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzLmJ5SGFzaChPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3MuY3JlYXRlKE9iamVjdFR5cGUsIHF1ZXVlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8qKlxuICAgKiBCdWlsZCBxdWV1ZSBvYmplY3QgYW5kIGFkZCB0byBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZU9iamVjdH0gb2JqZWN0IFBhcnNlLk9iamVjdCB0byBiZSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtRdWV1ZU9iamVjdH0gcXVldWVPYmplY3QgUGFyc2UuT2JqZWN0IGRhdGEgZnJvbSB0aGUgcXVldWVcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuXG4gICAqIEBzdGF0aWNcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgYXN5bmMgc2VuZFF1ZXVlQ2FsbGJhY2sob2JqZWN0LCBxdWV1ZU9iamVjdCkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmUocXVldWVPYmplY3QucXVldWVJZCk7XG4gICAgfVxuICAgIHN3aXRjaCAocXVldWVPYmplY3QuYWN0aW9uKSB7XG4gICAgICBjYXNlICdzYXZlJzpcbiAgICAgICAgLy8gUXVldWVkIHVwZGF0ZSB3YXMgb3ZlcndyaXR0ZW4gYnkgb3RoZXIgcmVxdWVzdC4gRG8gbm90IHNhdmVcbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QudXBkYXRlZEF0ICE9PSAndW5kZWZpbmVkJyAmJiBvYmplY3QudXBkYXRlZEF0ID4gbmV3IERhdGUocXVldWVPYmplY3Qub2JqZWN0LmNyZWF0ZWRBdCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmUocXVldWVPYmplY3QucXVldWVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvYmplY3Quc2F2ZShxdWV1ZU9iamVjdC5vYmplY3QsIHF1ZXVlT2JqZWN0LnNlcnZlck9wdGlvbnMpO1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlKHF1ZXVlT2JqZWN0LnF1ZXVlSWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUuY29kZSAhPT0gX1BhcnNlRXJyb3IuZGVmYXVsdC5DT05ORUNUSU9OX0ZBSUxFRCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUocXVldWVPYmplY3QucXVldWVJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGVzdHJveSc6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb2JqZWN0LmRlc3Ryb3kocXVldWVPYmplY3Quc2VydmVyT3B0aW9ucyk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUocXVldWVPYmplY3QucXVldWVJZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZS5jb2RlICE9PSBfUGFyc2VFcnJvci5kZWZhdWx0LkNPTk5FQ1RJT05fRkFJTEVEKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZShxdWV1ZU9iamVjdC5xdWV1ZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogU3RhcnQgcG9sbGluZyBzZXJ2ZXIgZm9yIG5ldHdvcmsgY29ubmVjdGlvbi5cbiAgICogV2lsbCBzZW5kIHF1ZXVlIGlmIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBwb2xsXG4gICAqIEBuYW1lIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZS5wb2xsXG4gICAqIEBwYXJhbSBbbXNdIE1pbGxpc2Vjb25kcyB0byBwaW5nIHRoZSBzZXJ2ZXIuIERlZmF1bHQgMjAwMG1zXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHBvbGwoKSB7XG4gICAgbGV0IG1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAyMDAwO1xuICAgIGlmIChwb2xsaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBvbGxpbmcgPSAoMCwgX3NldEludGVydmFsMi5kZWZhdWx0KSgoKSA9PiB7XG4gICAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgICBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAnaGVhbHRoJykudGhlbihfcmVmID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBzdGF0dXNcbiAgICAgICAgfSA9IF9yZWY7XG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdvaycpIHtcbiAgICAgICAgICB0aGlzLnN0b3BQb2xsKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKGUgPT4gZSk7XG4gICAgfSwgbXMpO1xuICB9LFxuICAvKipcbiAgICogVHVybnMgb2ZmIHBvbGxpbmcuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBzdG9wUG9sbFxuICAgKiBAbmFtZSBQYXJzZS5FdmVudHVhbGx5UXVldWUuc3RvcFBvbGxcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RvcFBvbGwoKSB7XG4gICAgY2xlYXJJbnRlcnZhbChwb2xsaW5nKTtcbiAgICBwb2xsaW5nID0gdW5kZWZpbmVkO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgcGluZ2luZyB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gaXNQb2xsaW5nXG4gICAqIEBuYW1lIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZS5pc1BvbGxpbmdcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGlzUG9sbGluZygpIHtcbiAgICByZXR1cm4gISFwb2xsaW5nO1xuICB9LFxuICBfc2V0UG9sbGluZyhmbGFnKSB7XG4gICAgcG9sbGluZyA9IGZsYWc7XG4gIH0sXG4gIHByb2Nlc3M6IHtcbiAgICBjcmVhdGUoT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpIHtcbiAgICAgIGNvbnN0IG9iamVjdCA9IG5ldyBPYmplY3RUeXBlKCk7XG4gICAgICByZXR1cm4gRXZlbnR1YWxseVF1ZXVlLnNlbmRRdWV1ZUNhbGxiYWNrKG9iamVjdCwgcXVldWVPYmplY3QpO1xuICAgIH0sXG4gICAgYXN5bmMgYnlJZChPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzZXNzaW9uVG9rZW5cbiAgICAgIH0gPSBxdWV1ZU9iamVjdC5zZXJ2ZXJPcHRpb25zO1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgX1BhcnNlUXVlcnkuZGVmYXVsdChPYmplY3RUeXBlKTtcbiAgICAgIHF1ZXJ5LmVxdWFsVG8oJ29iamVjdElkJywgcXVldWVPYmplY3QuaWQpO1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0ICgwLCBfZmluZC5kZWZhdWx0KShxdWVyeSkuY2FsbChxdWVyeSwge1xuICAgICAgICBzZXNzaW9uVG9rZW5cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIEV2ZW50dWFsbHlRdWV1ZS5zZW5kUXVldWVDYWxsYmFjayhyZXN1bHRzWzBdLCBxdWV1ZU9iamVjdCk7XG4gICAgfSxcbiAgICBhc3luYyBieUhhc2goT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2Vzc2lvblRva2VuXG4gICAgICB9ID0gcXVldWVPYmplY3Quc2VydmVyT3B0aW9ucztcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IF9QYXJzZVF1ZXJ5LmRlZmF1bHQoT2JqZWN0VHlwZSk7XG4gICAgICBxdWVyeS5lcXVhbFRvKCdoYXNoJywgcXVldWVPYmplY3QuaGFzaCk7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgKDAsIF9maW5kLmRlZmF1bHQpKHF1ZXJ5KS5jYWxsKHF1ZXJ5LCB7XG4gICAgICAgIHNlc3Npb25Ub2tlblxuICAgICAgfSk7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBFdmVudHVhbGx5UXVldWUuc2VuZFF1ZXVlQ2FsbGJhY2socmVzdWx0c1swXSwgcXVldWVPYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEV2ZW50dWFsbHlRdWV1ZS5wcm9jZXNzLmNyZWF0ZShPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCk7XG4gICAgfVxuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBFdmVudHVhbGx5UXVldWU7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBFdmVudHVhbGx5UXVldWU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfUGFyc2VVc2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVVzZXJcIikpO1xuLyogZ2xvYmFsIEZCICovXG5cbmxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xubGV0IHJlcXVlc3RlZFBlcm1pc3Npb25zO1xubGV0IGluaXRPcHRpb25zO1xuY29uc3QgcHJvdmlkZXIgPSB7XG4gIGF1dGhlbnRpY2F0ZShvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBGQiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuZXJyb3IodGhpcywgJ0ZhY2Vib29rIFNESyBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIEZCLmxvZ2luKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5hdXRoUmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3VjY2Vzcykge1xuICAgICAgICAgIG9wdGlvbnMuc3VjY2Vzcyh0aGlzLCB7XG4gICAgICAgICAgICBpZDogcmVzcG9uc2UuYXV0aFJlc3BvbnNlLnVzZXJJRCxcbiAgICAgICAgICAgIGFjY2Vzc190b2tlbjogcmVzcG9uc2UuYXV0aFJlc3BvbnNlLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgZXhwaXJhdGlvbl9kYXRlOiBuZXcgRGF0ZShyZXNwb25zZS5hdXRoUmVzcG9uc2UuZXhwaXJlc0luICogMTAwMCArIG5ldyBEYXRlKCkuZ2V0VGltZSgpKS50b0pTT04oKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3B0aW9ucy5lcnJvcikge1xuICAgICAgICAgIG9wdGlvbnMuZXJyb3IodGhpcywgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgc2NvcGU6IHJlcXVlc3RlZFBlcm1pc3Npb25zXG4gICAgfSk7XG4gIH0sXG4gIHJlc3RvcmVBdXRoZW50aWNhdGlvbihhdXRoRGF0YSkge1xuICAgIGlmIChhdXRoRGF0YSkge1xuICAgICAgY29uc3QgbmV3T3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKGluaXRPcHRpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGluaXRPcHRpb25zKSB7XG4gICAgICAgICAgbmV3T3B0aW9uc1trZXldID0gaW5pdE9wdGlvbnNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU3VwcHJlc3MgY2hlY2tzIGZvciBsb2dpbiBzdGF0dXMgZnJvbSB0aGUgYnJvd3Nlci5cbiAgICAgIG5ld09wdGlvbnMuc3RhdHVzID0gZmFsc2U7XG5cbiAgICAgIC8vIElmIHRoZSB1c2VyIGRvZXNuJ3QgbWF0Y2ggdGhlIG9uZSBrbm93biBieSB0aGUgRkIgU0RLLCBsb2cgb3V0LlxuICAgICAgLy8gTW9zdCBvZiB0aGUgdGltZSwgdGhlIHVzZXJzIHdpbGwgbWF0Y2ggLS0gaXQncyBvbmx5IGluIGNhc2VzIHdoZXJlXG4gICAgICAvLyB0aGUgRkIgU0RLIGtub3dzIG9mIGEgZGlmZmVyZW50IHVzZXIgdGhhbiB0aGUgb25lIGJlaW5nIHJlc3RvcmVkXG4gICAgICAvLyBmcm9tIGEgUGFyc2UgVXNlciB0aGF0IGxvZ2dlZCBpbiB3aXRoIHVzZXJuYW1lL3Bhc3N3b3JkLlxuICAgICAgY29uc3QgZXhpc3RpbmdSZXNwb25zZSA9IEZCLmdldEF1dGhSZXNwb25zZSgpO1xuICAgICAgaWYgKGV4aXN0aW5nUmVzcG9uc2UgJiYgZXhpc3RpbmdSZXNwb25zZS51c2VySUQgIT09IGF1dGhEYXRhLmlkKSB7XG4gICAgICAgIEZCLmxvZ291dCgpO1xuICAgICAgfVxuICAgICAgRkIuaW5pdChuZXdPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIGdldEF1dGhUeXBlKCkge1xuICAgIHJldHVybiAnZmFjZWJvb2snO1xuICB9LFxuICBkZWF1dGhlbnRpY2F0ZSgpIHtcbiAgICB0aGlzLnJlc3RvcmVBdXRoZW50aWNhdGlvbihudWxsKTtcbiAgfVxufTtcblxuLyoqXG4gKiBQcm92aWRlcyBhIHNldCBvZiB1dGlsaXRpZXMgZm9yIHVzaW5nIFBhcnNlIHdpdGggRmFjZWJvb2suXG4gKlxuICogQGNsYXNzIFBhcnNlLkZhY2Vib29rVXRpbHNcbiAqIEBzdGF0aWNcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqL1xuY29uc3QgRmFjZWJvb2tVdGlscyA9IHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIFBhcnNlIEZhY2Vib29rIGludGVncmF0aW9uLiAgQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIHlvdVxuICAgKiBoYXZlIGxvYWRlZCB0aGUgRmFjZWJvb2sgSmF2YXNjcmlwdCBTREsgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzXG4gICAqIGFzIHlvdSB3b3VsZCBwYXNzIHRvPGNvZGU+XG4gICAqIDxhIGhyZWY9XG4gICAqIFwiaHR0cHM6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L0ZCLmluaXQvXCI+XG4gICAqIEZCLmluaXQoKTwvYT48L2NvZGU+LiAgUGFyc2UuRmFjZWJvb2tVdGlscyB3aWxsIGludm9rZSBGQi5pbml0KCkgZm9yIHlvdVxuICAgKiB3aXRoIHRoZXNlIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGluaXRcbiAgICogQG5hbWUgUGFyc2UuRmFjZWJvb2tVdGlscy5pbml0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIEZhY2Vib29rIG9wdGlvbnMgYXJndW1lbnQgYXMgZGVzY3JpYmVkIGhlcmU6XG4gICAqICAgPGEgaHJlZj1cbiAgICogICBcImh0dHBzOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9GQi5pbml0L1wiPlxuICAgKiAgIEZCLmluaXQoKTwvYT4uIFRoZSBzdGF0dXMgZmxhZyB3aWxsIGJlIGNvZXJjZWQgdG8gJ2ZhbHNlJyBiZWNhdXNlIGl0XG4gICAqICAgaW50ZXJmZXJlcyB3aXRoIFBhcnNlIEZhY2Vib29rIGludGVncmF0aW9uLiBDYWxsIEZCLmdldExvZ2luU3RhdHVzKClcbiAgICogICBleHBsaWNpdGx5IGlmIHRoaXMgYmVoYXZpb3IgaXMgcmVxdWlyZWQgYnkgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG4gIGluaXQob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgRkIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBGYWNlYm9vayBKYXZhU2NyaXB0IFNESyBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgY2FsbGluZyBpbml0LicpO1xuICAgIH1cbiAgICBpbml0T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgICAgIGluaXRPcHRpb25zW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbml0T3B0aW9ucy5zdGF0dXMgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCB3YXJuID0gY29uc29sZS53YXJuIHx8IGNvbnNvbGUubG9nIHx8IGZ1bmN0aW9uICgpIHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgIHdhcm4uY2FsbChjb25zb2xlLCAnVGhlIFwic3RhdHVzXCIgZmxhZyBwYXNzZWQgaW50bycgKyAnIEZCLmluaXQsIHdoZW4gc2V0IHRvIHRydWUsIGNhbiBpbnRlcmZlcmUgd2l0aCBQYXJzZSBGYWNlYm9vaycgKyAnIGludGVncmF0aW9uLCBzbyBpdCBoYXMgYmVlbiBzdXBwcmVzc2VkLiBQbGVhc2UgY2FsbCcgKyAnIEZCLmdldExvZ2luU3RhdHVzKCkgZXhwbGljaXRseSBpZiB5b3UgcmVxdWlyZSB0aGlzIGJlaGF2aW9yLicpO1xuICAgIH1cbiAgICBpbml0T3B0aW9ucy5zdGF0dXMgPSBmYWxzZTtcbiAgICBGQi5pbml0KGluaXRPcHRpb25zKTtcbiAgICBfUGFyc2VVc2VyLmRlZmF1bHQuX3JlZ2lzdGVyQXV0aGVudGljYXRpb25Qcm92aWRlcihwcm92aWRlcik7XG4gICAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9LFxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSB1c2VyIGhhcyB0aGVpciBhY2NvdW50IGxpbmtlZCB0byBGYWNlYm9vay5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGlzTGlua2VkXG4gICAqIEBuYW1lIFBhcnNlLkZhY2Vib29rVXRpbHMuaXNMaW5rZWRcbiAgICogQHBhcmFtIHtQYXJzZS5Vc2VyfSB1c2VyIFVzZXIgdG8gY2hlY2sgZm9yIGEgZmFjZWJvb2sgbGluay5cbiAgICogICAgIFRoZSB1c2VyIG11c3QgYmUgbG9nZ2VkIGluIG9uIHRoaXMgZGV2aWNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgaGFzIHRoZWlyIGFjY291bnRcbiAgICogICAgIGxpbmtlZCB0byBGYWNlYm9vay5cbiAgICovXG4gIGlzTGlua2VkKHVzZXIpIHtcbiAgICByZXR1cm4gdXNlci5faXNMaW5rZWQoJ2ZhY2Vib29rJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB1c2luZyBGYWNlYm9vay4gVGhpcyBtZXRob2QgZGVsZWdhdGVzIHRvIHRoZSBGYWNlYm9va1xuICAgKiBTREsgdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLCBhbmQgdGhlbiBhdXRvbWF0aWNhbGx5IGxvZ3MgaW4gKG9yXG4gICAqIGNyZWF0ZXMsIGluIHRoZSBjYXNlIHdoZXJlIGl0IGlzIGEgbmV3IHVzZXIpIGEgUGFyc2UuVXNlci5cbiAgICpcbiAgICogU3RhbmRhcmQgQVBJOlxuICAgKlxuICAgKiA8Y29kZT5sb2dJbihwZXJtaXNzaW9uOiBzdHJpbmcsIGF1dGhEYXRhOiBPYmplY3QpOzwvY29kZT5cbiAgICpcbiAgICogQWR2YW5jZWQgQVBJOiBVc2VkIGZvciBoYW5kbGluZyB5b3VyIG93biBvQXV0aCB0b2tlbnNcbiAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9yZXN0L2d1aWRlLyNsaW5raW5nLXVzZXJzfVxuICAgKlxuICAgKiA8Y29kZT5sb2dJbihhdXRoRGF0YTogT2JqZWN0LCBvcHRpb25zPzogT2JqZWN0KTs8L2NvZGU+XG4gICAqXG4gICAqIEBmdW5jdGlvbiBsb2dJblxuICAgKiBAbmFtZSBQYXJzZS5GYWNlYm9va1V0aWxzLmxvZ0luXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IG9iamVjdCl9IHBlcm1pc3Npb25zIFRoZSBwZXJtaXNzaW9ucyByZXF1aXJlZCBmb3IgRmFjZWJvb2tcbiAgICogICAgbG9nIGluLiAgVGhpcyBpcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcgb2YgcGVybWlzc2lvbnMuXG4gICAqICAgIEFsdGVybmF0aXZlbHksIHN1cHBseSBhIEZhY2Vib29rIGF1dGhEYXRhIG9iamVjdCBhcyBkZXNjcmliZWQgaW4gb3VyXG4gICAqICAgIFJFU1QgQVBJIGRvY3MgaWYgeW91IHdhbnQgdG8gaGFuZGxlIGdldHRpbmcgZmFjZWJvb2sgYXV0aCB0b2tlbnNcbiAgICogICAgeW91cnNlbGYuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE1hc3RlcktleSAvIFNlc3Npb25Ub2tlbi4gQWx0ZXJuYXRpdmVseSBjYW4gYmUgdXNlZCBmb3IgYXV0aERhdGEgaWYgcGVybWlzc2lvbnMgaXMgYSBzdHJpbmdcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBsb2dJbihwZXJtaXNzaW9ucywgb3B0aW9ucykge1xuICAgIGlmICghcGVybWlzc2lvbnMgfHwgdHlwZW9mIHBlcm1pc3Npb25zID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IGluaXRpYWxpemUgRmFjZWJvb2tVdGlscyBiZWZvcmUgY2FsbGluZyBsb2dJbi4nKTtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3RlZFBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7XG4gICAgICByZXR1cm4gX1BhcnNlVXNlci5kZWZhdWx0LmxvZ0luV2l0aCgnZmFjZWJvb2snLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIF9QYXJzZVVzZXIuZGVmYXVsdC5sb2dJbldpdGgoJ2ZhY2Vib29rJywge1xuICAgICAgYXV0aERhdGE6IHBlcm1pc3Npb25zXG4gICAgfSwgb3B0aW9ucyk7XG4gIH0sXG4gIC8qKlxuICAgKiBMaW5rcyBGYWNlYm9vayB0byBhbiBleGlzdGluZyBQRlVzZXIuIFRoaXMgbWV0aG9kIGRlbGVnYXRlcyB0byB0aGVcbiAgICogRmFjZWJvb2sgU0RLIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciwgYW5kIHRoZW4gYXV0b21hdGljYWxseSBsaW5rc1xuICAgKiB0aGUgYWNjb3VudCB0byB0aGUgUGFyc2UuVXNlci5cbiAgICpcbiAgICogU3RhbmRhcmQgQVBJOlxuICAgKlxuICAgKiA8Y29kZT5saW5rKHVzZXI6IFBhcnNlLlVzZXIsIHBlcm1pc3Npb246IHN0cmluZywgYXV0aERhdGE/OiBPYmplY3QpOzwvY29kZT5cbiAgICpcbiAgICogQWR2YW5jZWQgQVBJOiBVc2VkIGZvciBoYW5kbGluZyB5b3VyIG93biBvQXV0aCB0b2tlbnNcbiAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9yZXN0L2d1aWRlLyNsaW5raW5nLXVzZXJzfVxuICAgKlxuICAgKiA8Y29kZT5saW5rKHVzZXI6IFBhcnNlLlVzZXIsIGF1dGhEYXRhOiBPYmplY3QsIG9wdGlvbnM/OiBGdWxsT3B0aW9ucyk7PC9jb2RlPlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbGlua1xuICAgKiBAbmFtZSBQYXJzZS5GYWNlYm9va1V0aWxzLmxpbmtcbiAgICogQHBhcmFtIHtQYXJzZS5Vc2VyfSB1c2VyIFVzZXIgdG8gbGluayB0byBGYWNlYm9vay4gVGhpcyBtdXN0IGJlIHRoZVxuICAgKiAgICAgY3VycmVudCB1c2VyLlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBvYmplY3QpfSBwZXJtaXNzaW9ucyBUaGUgcGVybWlzc2lvbnMgcmVxdWlyZWQgZm9yIEZhY2Vib29rXG4gICAqICAgIGxvZyBpbi4gIFRoaXMgaXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIG9mIHBlcm1pc3Npb25zLlxuICAgKiAgICBBbHRlcm5hdGl2ZWx5LCBzdXBwbHkgYSBGYWNlYm9vayBhdXRoRGF0YSBvYmplY3QgYXMgZGVzY3JpYmVkIGluIG91clxuICAgKiAgICBSRVNUIEFQSSBkb2NzIGlmIHlvdSB3YW50IHRvIGhhbmRsZSBnZXR0aW5nIGZhY2Vib29rIGF1dGggdG9rZW5zXG4gICAqICAgIHlvdXJzZWxmLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBNYXN0ZXJLZXkgLyBTZXNzaW9uVG9rZW4uIEFsdGVybmF0aXZlbHkgY2FuIGJlIHVzZWQgZm9yIGF1dGhEYXRhIGlmIHBlcm1pc3Npb25zIGlzIGEgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgbGluayh1c2VyLCBwZXJtaXNzaW9ucywgb3B0aW9ucykge1xuICAgIGlmICghcGVybWlzc2lvbnMgfHwgdHlwZW9mIHBlcm1pc3Npb25zID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IGluaXRpYWxpemUgRmFjZWJvb2tVdGlscyBiZWZvcmUgY2FsbGluZyBsaW5rLicpO1xuICAgICAgfVxuICAgICAgcmVxdWVzdGVkUGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICAgIHJldHVybiB1c2VyLmxpbmtXaXRoKCdmYWNlYm9vaycsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlci5saW5rV2l0aCgnZmFjZWJvb2snLCB7XG4gICAgICBhdXRoRGF0YTogcGVybWlzc2lvbnNcbiAgICB9LCBvcHRpb25zKTtcbiAgfSxcbiAgLyoqXG4gICAqIFVubGlua3MgdGhlIFBhcnNlLlVzZXIgZnJvbSBhIEZhY2Vib29rIGFjY291bnQuXG4gICAqXG4gICAqIEBmdW5jdGlvbiB1bmxpbmtcbiAgICogQG5hbWUgUGFyc2UuRmFjZWJvb2tVdGlscy51bmxpbmtcbiAgICogQHBhcmFtIHtQYXJzZS5Vc2VyfSB1c2VyIFVzZXIgdG8gdW5saW5rIGZyb20gRmFjZWJvb2suIFRoaXMgbXVzdCBiZSB0aGVcbiAgICogICAgIGN1cnJlbnQgdXNlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU3RhbmRhcmQgb3B0aW9ucyBvYmplY3Qgd2l0aCBzdWNjZXNzIGFuZCBlcnJvclxuICAgKiAgICBjYWxsYmFja3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgdW5saW5rOiBmdW5jdGlvbiAodXNlciwgb3B0aW9ucykge1xuICAgIGlmICghaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgaW5pdGlhbGl6ZSBGYWNlYm9va1V0aWxzIGJlZm9yZSBjYWxsaW5nIHVubGluay4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXIuX3VubGlua0Zyb20oJ2ZhY2Vib29rJywgb3B0aW9ucyk7XG4gIH0sXG4gIC8vIFVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgX2dldEF1dGhQcm92aWRlcigpIHtcbiAgICByZXR1cm4gcHJvdmlkZXI7XG4gIH1cbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBGYWNlYm9va1V0aWxzOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2tleXNJbnN0YW5jZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uva2V5c1wiKTtcbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pZGJLZXl2YWwgPSByZXF1aXJlKFwiaWRiLWtleXZhbFwiKTtcbi8qIGdsb2JhbCB3aW5kb3cgKi9cblxubGV0IEluZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyO1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5pbmRleGVkREIpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBQYXJzZVN0b3JlID0gKDAsIF9pZGJLZXl2YWwuY3JlYXRlU3RvcmUpKCdwYXJzZURCJywgJ3BhcnNlU3RvcmUnKTtcbiAgICBJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlciA9IHtcbiAgICAgIGFzeW5jOiAxLFxuICAgICAgZ2V0SXRlbUFzeW5jKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaWRiS2V5dmFsLmdldCkocGF0aCwgUGFyc2VTdG9yZSk7XG4gICAgICB9LFxuICAgICAgc2V0SXRlbUFzeW5jKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAoMCwgX2lkYktleXZhbC5zZXQpKHBhdGgsIHZhbHVlLCBQYXJzZVN0b3JlKTtcbiAgICAgIH0sXG4gICAgICByZW1vdmVJdGVtQXN5bmMocGF0aCkge1xuICAgICAgICByZXR1cm4gKDAsIF9pZGJLZXl2YWwuZGVsKShwYXRoLCBQYXJzZVN0b3JlKTtcbiAgICAgIH0sXG4gICAgICBnZXRBbGxLZXlzQXN5bmMoKSB7XG4gICAgICAgIHJldHVybiAoMCwgX2tleXNJbnN0YW5jZVByb3BlcnR5KF9pZGJLZXl2YWwpKShQYXJzZVN0b3JlKTtcbiAgICAgIH0sXG4gICAgICBjbGVhcigpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaWRiS2V5dmFsLmNsZWFyKShQYXJzZVN0b3JlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9IGNhdGNoIChfKSB7XG4gICAgLy8gSW5kZXhlZERCIG5vdCBhY2Nlc3NpYmxlXG4gICAgSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIgPSB1bmRlZmluZWQ7XG4gIH1cbn0gZWxzZSB7XG4gIC8vIEluZGV4ZWREQiBub3Qgc3VwcG9ydGVkXG4gIEluZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyID0gdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEluZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9TdG9yYWdlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlXCIpKTtcbnZhciBfUGFyc2VJbnN0YWxsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlSW5zdGFsbGF0aW9uXCIpKTtcbnZhciBfdXVpZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXVpZFwiKSk7XG5jb25zdCBDVVJSRU5UX0lOU1RBTExBVElPTl9LRVkgPSAnY3VycmVudEluc3RhbGxhdGlvbic7XG5jb25zdCBDVVJSRU5UX0lOU1RBTExBVElPTl9JRF9LRVkgPSAnY3VycmVudEluc3RhbGxhdGlvbklkJztcbmxldCBpaWRDYWNoZSA9IG51bGw7XG5sZXQgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlID0gbnVsbDtcbmxldCBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGVNYXRjaGVzRGlzayA9IGZhbHNlO1xuY29uc3QgSW5zdGFsbGF0aW9uQ29udHJvbGxlciA9IHtcbiAgYXN5bmMgdXBkYXRlSW5zdGFsbGF0aW9uT25EaXNrKGluc3RhbGxhdGlvbikge1xuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX0lOU1RBTExBVElPTl9LRVkpO1xuICAgIGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuc2V0SXRlbUFzeW5jKHBhdGgsICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKGluc3RhbGxhdGlvbi50b0pTT04oKSkpO1xuICAgIHRoaXMuX3NldEN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZShpbnN0YWxsYXRpb24pO1xuICB9LFxuICBhc3luYyBjdXJyZW50SW5zdGFsbGF0aW9uSWQoKSB7XG4gICAgaWYgKHR5cGVvZiBpaWRDYWNoZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBpaWRDYWNoZTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfSU5TVEFMTEFUSU9OX0lEX0tFWSk7XG4gICAgbGV0IGlpZCA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKHBhdGgpO1xuICAgIGlmICghaWlkKSB7XG4gICAgICBpaWQgPSAoMCwgX3V1aWQuZGVmYXVsdCkoKTtcbiAgICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhwYXRoLCBpaWQpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpaWRDYWNoZSA9IGlpZDtcbiAgICAgICAgcmV0dXJuIGlpZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpaWRDYWNoZSA9IGlpZDtcbiAgICByZXR1cm4gaWlkO1xuICB9LFxuICBhc3luYyBjdXJyZW50SW5zdGFsbGF0aW9uKCkge1xuICAgIGlmIChjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUpIHtcbiAgICAgIHJldHVybiBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGU7XG4gICAgfVxuICAgIGlmIChjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGVNYXRjaGVzRGlzaykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX0lOU1RBTExBVElPTl9LRVkpO1xuICAgIGxldCBpbnN0YWxsYXRpb25EYXRhID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMocGF0aCk7XG4gICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlTWF0Y2hlc0Rpc2sgPSB0cnVlO1xuICAgIGlmIChpbnN0YWxsYXRpb25EYXRhKSB7XG4gICAgICBpbnN0YWxsYXRpb25EYXRhID0gSlNPTi5wYXJzZShpbnN0YWxsYXRpb25EYXRhKTtcbiAgICAgIGluc3RhbGxhdGlvbkRhdGEuY2xhc3NOYW1lID0gJ19JbnN0YWxsYXRpb24nO1xuICAgICAgY29uc3QgY3VycmVudCA9IF9QYXJzZUluc3RhbGxhdGlvbi5kZWZhdWx0LmZyb21KU09OKGluc3RhbGxhdGlvbkRhdGEpO1xuICAgICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlID0gY3VycmVudDtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBjb25zdCBpbnN0YWxsYXRpb25JZCA9IGF3YWl0IHRoaXMuY3VycmVudEluc3RhbGxhdGlvbklkKCk7XG4gICAgY29uc3QgaW5zdGFsbGF0aW9uID0gbmV3IF9QYXJzZUluc3RhbGxhdGlvbi5kZWZhdWx0KCk7XG4gICAgaW5zdGFsbGF0aW9uLnNldCgnZGV2aWNlVHlwZScsIF9QYXJzZUluc3RhbGxhdGlvbi5kZWZhdWx0LkRFVklDRV9UWVBFUy5XRUIpO1xuICAgIGluc3RhbGxhdGlvbi5zZXQoJ2luc3RhbGxhdGlvbklkJywgaW5zdGFsbGF0aW9uSWQpO1xuICAgIGluc3RhbGxhdGlvbi5zZXQoJ3BhcnNlVmVyc2lvbicsIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnVkVSU0lPTicpKTtcbiAgICBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUgPSBpbnN0YWxsYXRpb247XG4gICAgYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMocGF0aCwgKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoaW5zdGFsbGF0aW9uLnRvSlNPTigpKSk7XG4gICAgcmV0dXJuIGluc3RhbGxhdGlvbjtcbiAgfSxcbiAgX2NsZWFyQ2FjaGUoKSB7XG4gICAgaWlkQ2FjaGUgPSBudWxsO1xuICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZSA9IG51bGw7XG4gICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlTWF0Y2hlc0Rpc2sgPSBmYWxzZTtcbiAgfSxcbiAgX3NldEluc3RhbGxhdGlvbklkQ2FjaGUoaWlkKSB7XG4gICAgaWlkQ2FjaGUgPSBpaWQ7XG4gIH0sXG4gIF9zZXRDdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUoaW5zdGFsbGF0aW9uKSB7XG4gICAgbGV0IG1hdGNoZXNEaXNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZSA9IGluc3RhbGxhdGlvbjtcbiAgICBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGVNYXRjaGVzRGlzayA9IG1hdGNoZXNEaXNrO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBJbnN0YWxsYXRpb25Db250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gSW5zdGFsbGF0aW9uQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvbWFwXCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uva2V5c1wiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX3ZhbHVlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvdmFsdWVzXCIpKTtcbnZhciBfc2V0VGltZW91dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC10aW1lb3V0XCIpKTtcbnZhciBfYmluZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvYmluZFwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgX0xpdmVRdWVyeVN1YnNjcmlwdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uXCIpKTtcbnZhciBfcHJvbWlzZVV0aWxzID0gcmVxdWlyZShcIi4vcHJvbWlzZVV0aWxzXCIpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbi8vIFRoZSBMaXZlUXVlcnkgY2xpZW50IGlubmVyIHN0YXRlXG5jb25zdCBDTElFTlRfU1RBVEUgPSB7XG4gIElOSVRJQUxJWkVEOiAnaW5pdGlhbGl6ZWQnLFxuICBDT05ORUNUSU5HOiAnY29ubmVjdGluZycsXG4gIENPTk5FQ1RFRDogJ2Nvbm5lY3RlZCcsXG4gIENMT1NFRDogJ2Nsb3NlZCcsXG4gIFJFQ09OTkVDVElORzogJ3JlY29ubmVjdGluZycsXG4gIERJU0NPTk5FQ1RFRDogJ2Rpc2Nvbm5lY3RlZCdcbn07XG5cbi8vIFRoZSBldmVudCB0eXBlIHRoZSBMaXZlUXVlcnkgY2xpZW50IHNob3VsZCBzZW50IHRvIHNlcnZlclxuY29uc3QgT1BfVFlQRVMgPSB7XG4gIENPTk5FQ1Q6ICdjb25uZWN0JyxcbiAgU1VCU0NSSUJFOiAnc3Vic2NyaWJlJyxcbiAgVU5TVUJTQ1JJQkU6ICd1bnN1YnNjcmliZScsXG4gIEVSUk9SOiAnZXJyb3InXG59O1xuXG4vLyBUaGUgZXZlbnQgd2UgZ2V0IGJhY2sgZnJvbSBMaXZlUXVlcnkgc2VydmVyXG5jb25zdCBPUF9FVkVOVFMgPSB7XG4gIENPTk5FQ1RFRDogJ2Nvbm5lY3RlZCcsXG4gIFNVQlNDUklCRUQ6ICdzdWJzY3JpYmVkJyxcbiAgVU5TVUJTQ1JJQkVEOiAndW5zdWJzY3JpYmVkJyxcbiAgRVJST1I6ICdlcnJvcicsXG4gIENSRUFURTogJ2NyZWF0ZScsXG4gIFVQREFURTogJ3VwZGF0ZScsXG4gIEVOVEVSOiAnZW50ZXInLFxuICBMRUFWRTogJ2xlYXZlJyxcbiAgREVMRVRFOiAnZGVsZXRlJ1xufTtcblxuLy8gVGhlIGV2ZW50IHRoZSBMaXZlUXVlcnkgY2xpZW50IHNob3VsZCBlbWl0XG5jb25zdCBDTElFTlRfRU1NSVRFUl9UWVBFUyA9IHtcbiAgQ0xPU0U6ICdjbG9zZScsXG4gIEVSUk9SOiAnZXJyb3InLFxuICBPUEVOOiAnb3Blbidcbn07XG5cbi8vIFRoZSBldmVudCB0aGUgTGl2ZVF1ZXJ5IHN1YnNjcmlwdGlvbiBzaG91bGQgZW1pdFxuY29uc3QgU1VCU0NSSVBUSU9OX0VNTUlURVJfVFlQRVMgPSB7XG4gIE9QRU46ICdvcGVuJyxcbiAgQ0xPU0U6ICdjbG9zZScsXG4gIEVSUk9SOiAnZXJyb3InLFxuICBDUkVBVEU6ICdjcmVhdGUnLFxuICBVUERBVEU6ICd1cGRhdGUnLFxuICBFTlRFUjogJ2VudGVyJyxcbiAgTEVBVkU6ICdsZWF2ZScsXG4gIERFTEVURTogJ2RlbGV0ZSdcbn07XG5cbi8vIEV4cG9uZW50aWFsbHktZ3Jvd2luZyByYW5kb20gZGVsYXlcbmNvbnN0IGdlbmVyYXRlSW50ZXJ2YWwgPSBrID0+IHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiBNYXRoLm1pbigzMCwgTWF0aC5wb3coMiwgaykgLSAxKSAqIDEwMDA7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgTGl2ZVF1ZXJ5Q2xpZW50LlxuICogPGEgaHJlZj1cImh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZXZlbnRzLmh0bWwjZXZlbnRzX2NsYXNzX2V2ZW50ZW1pdHRlclwiPmNsb3VkIGZ1bmN0aW9uczwvYT4uXG4gKlxuICogQSB3cmFwcGVyIG9mIGEgc3RhbmRhcmQgV2ViU29ja2V0IGNsaWVudC4gV2UgYWRkIHNldmVyYWwgdXNlZnVsIG1ldGhvZHMgdG9cbiAqIGhlbHAgeW91IGNvbm5lY3QvZGlzY29ubmVjdCB0byBMaXZlUXVlcnlTZXJ2ZXIsIHN1YnNjcmliZS91bnN1YnNjcmliZSBhIFBhcnNlUXVlcnkgZWFzaWx5LlxuICpcbiAqIGphdmFzY3JpcHRLZXkgYW5kIG1hc3RlcktleSBhcmUgdXNlZCBmb3IgdmVyaWZ5aW5nIHRoZSBMaXZlUXVlcnlDbGllbnQgd2hlbiBpdCB0cmllc1xuICogdG8gY29ubmVjdCB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlclxuICpcbiAqIFdlIGV4cG9zZSB0aHJlZSBldmVudHMgdG8gaGVscCB5b3UgbW9uaXRvciB0aGUgc3RhdHVzIG9mIHRoZSBMaXZlUXVlcnlDbGllbnQuXG4gKlxuICogPHByZT5cbiAqIGNvbnN0IExpdmVRdWVyeUNsaWVudCA9IFBhcnNlLkxpdmVRdWVyeUNsaWVudDtcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBMaXZlUXVlcnlDbGllbnQoe1xuICogICBhcHBsaWNhdGlvbklkOiAnJyxcbiAqICAgc2VydmVyVVJMOiAnJyxcbiAqICAgamF2YXNjcmlwdEtleTogJycsXG4gKiAgIG1hc3RlcktleTogJydcbiAqICB9KTtcbiAqIDwvcHJlPlxuICpcbiAqIE9wZW4gLSBXaGVuIHdlIGVzdGFibGlzaCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqIDxwcmU+XG4gKiBjbGllbnQub24oJ29wZW4nLCAoKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+XG4gKlxuICogQ2xvc2UgLSBXaGVuIHdlIGxvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuXG4gKiA8cHJlPlxuICogY2xpZW50Lm9uKCdjbG9zZScsICgpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT5cbiAqXG4gKiBFcnJvciAtIFdoZW4gc29tZSBuZXR3b3JrIGVycm9yIG9yIExpdmVRdWVyeSBzZXJ2ZXIgZXJyb3IgaGFwcGVucywgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICogPHByZT5cbiAqIGNsaWVudC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuTGl2ZVF1ZXJ5Q2xpZW50XG4gKi9cbmNsYXNzIExpdmVRdWVyeUNsaWVudCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5hcHBsaWNhdGlvbklkIC0gYXBwbGljYXRpb25JZCBvZiB5b3VyIFBhcnNlIGFwcFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zZXJ2ZXJVUkwgLSA8Yj50aGUgVVJMIG9mIHlvdXIgTGl2ZVF1ZXJ5IHNlcnZlcjwvYj5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuamF2YXNjcmlwdEtleSAob3B0aW9uYWwpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm1hc3RlcktleSAob3B0aW9uYWwpIFlvdXIgUGFyc2UgTWFzdGVyIEtleS4gKE5vZGUuanMgb25seSEpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnNlc3Npb25Ub2tlbiAob3B0aW9uYWwpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmluc3RhbGxhdGlvbklkIChvcHRpb25hbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKF9yZWYpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIGxldCB7XG4gICAgICBhcHBsaWNhdGlvbklkLFxuICAgICAgc2VydmVyVVJMLFxuICAgICAgamF2YXNjcmlwdEtleSxcbiAgICAgIG1hc3RlcktleSxcbiAgICAgIHNlc3Npb25Ub2tlbixcbiAgICAgIGluc3RhbGxhdGlvbklkXG4gICAgfSA9IF9yZWY7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJhdHRlbXB0c1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiaWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlcXVlc3RJZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiYXBwbGljYXRpb25JZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic2VydmVyVVJMXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJqYXZhc2NyaXB0S2V5XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJtYXN0ZXJLZXlcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInNlc3Npb25Ub2tlblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiaW5zdGFsbGF0aW9uSWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJjb25uZWN0UHJvbWlzZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic3Vic2NyaXB0aW9uc1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic29ja2V0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzdGF0ZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVjb25uZWN0SGFuZGxlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJlbWl0dGVyXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiZW1pdFwiLCB2b2lkIDApO1xuICAgIGlmICghc2VydmVyVVJMIHx8ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShzZXJ2ZXJVUkwpLmNhbGwoc2VydmVyVVJMLCAnd3MnKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzZXQgYSBwcm9wZXIgUGFyc2UgTGl2ZVF1ZXJ5IHNlcnZlciB1cmwgYmVmb3JlIHVzaW5nIExpdmVRdWVyeUNsaWVudCcpO1xuICAgIH1cbiAgICB0aGlzLnJlY29ubmVjdEhhbmRsZSA9IG51bGw7XG4gICAgdGhpcy5hdHRlbXB0cyA9IDE7XG4gICAgdGhpcy5pZCA9IDA7XG4gICAgdGhpcy5yZXF1ZXN0SWQgPSAxO1xuICAgIHRoaXMuc2VydmVyVVJMID0gc2VydmVyVVJMO1xuICAgIHRoaXMuYXBwbGljYXRpb25JZCA9IGFwcGxpY2F0aW9uSWQ7XG4gICAgdGhpcy5qYXZhc2NyaXB0S2V5ID0gamF2YXNjcmlwdEtleSB8fCB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXN0ZXJLZXkgPSBtYXN0ZXJLZXkgfHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuc2Vzc2lvblRva2VuID0gc2Vzc2lvblRva2VuIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmluc3RhbGxhdGlvbklkID0gaW5zdGFsbGF0aW9uSWQgfHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuYWRkaXRpb25hbFByb3BlcnRpZXMgPSB0cnVlO1xuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IG5ldyBfbWFwLmRlZmF1bHQoKTtcbiAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLklOSVRJQUxJWkVEO1xuICAgIGNvbnN0IEV2ZW50RW1pdHRlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLm9uID0gKGV2ZW50TmFtZSwgbGlzdGVuZXIpID0+IHRoaXMuZW1pdHRlci5vbihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB0aGlzLmVtaXQgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90aGlzLmVtaXR0ZXIuZW1pdChldmVudE5hbWUsIC4uLmFyZ3MpO1xuICAgIH07XG4gICAgLy8gYWRkaW5nIGxpc3RlbmVyIHNvIHByb2Nlc3MgZG9lcyBub3QgY3Jhc2hcbiAgICAvLyBiZXN0IHByYWN0aWNlIGlzIGZvciBkZXZlbG9wZXIgdG8gcmVnaXN0ZXIgdGhlaXIgb3duIGxpc3RlbmVyXG4gICAgdGhpcy5vbignZXJyb3InLCAoKSA9PiB7fSk7XG4gIH1cbiAgc2hvdWxkT3BlbigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0xJRU5UX1NUQVRFLklOSVRJQUxJWkVEIHx8IHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5ESVNDT05ORUNURUQ7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhIFBhcnNlUXVlcnlcbiAgICpcbiAgICogSWYgeW91IHByb3ZpZGUgdGhlIHNlc3Npb25Ub2tlbiwgd2hlbiB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciBnZXRzIFBhcnNlT2JqZWN0J3NcbiAgICogdXBkYXRlcyBmcm9tIHBhcnNlIHNlcnZlciwgaXQnbGwgdHJ5IHRvIGNoZWNrIHdoZXRoZXIgdGhlIHNlc3Npb25Ub2tlbiBmdWxmaWxsc1xuICAgKiB0aGUgUGFyc2VPYmplY3QncyBBQ0wuIFRoZSBMaXZlUXVlcnkgc2VydmVyIHdpbGwgb25seSBzZW5kIHVwZGF0ZXMgdG8gY2xpZW50cyB3aG9zZVxuICAgKiBzZXNzaW9uVG9rZW4gaXMgZml0IGZvciB0aGUgUGFyc2VPYmplY3QncyBBQ0wuIFlvdSBjYW4gY2hlY2sgdGhlIExpdmVRdWVyeSBwcm90b2NvbFxuICAgKiA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL3BhcnNlLWNvbW11bml0eS9wYXJzZS1zZXJ2ZXIvd2lraS9QYXJzZS1MaXZlUXVlcnktUHJvdG9jb2wtU3BlY2lmaWNhdGlvblwiPmhlcmU8L2E+IGZvciBtb3JlIGRldGFpbHMuIFRoZSBzdWJzY3JpcHRpb24geW91IGdldCBpcyB0aGUgc2FtZSBzdWJzY3JpcHRpb24geW91IGdldFxuICAgKiBmcm9tIG91ciBTdGFuZGFyZCBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2VRdWVyeX0gcXVlcnkgLSB0aGUgUGFyc2VRdWVyeSB5b3Ugd2FudCB0byBzdWJzY3JpYmUgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25Ub2tlbiAob3B0aW9uYWwpXG4gICAqIEByZXR1cm5zIHtMaXZlUXVlcnlTdWJzY3JpcHRpb24gfCB1bmRlZmluZWR9XG4gICAqL1xuICBzdWJzY3JpYmUocXVlcnksIHNlc3Npb25Ub2tlbikge1xuICAgIGlmICghcXVlcnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NOYW1lID0gcXVlcnkuY2xhc3NOYW1lO1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9IHF1ZXJ5LnRvSlNPTigpO1xuICAgIGNvbnN0IHdoZXJlID0gcXVlcnlKU09OLndoZXJlO1xuICAgIGNvbnN0IGtleXMgPSAoMCwgX2tleXMuZGVmYXVsdCkocXVlcnlKU09OKT8uc3BsaXQoJywnKTtcbiAgICBjb25zdCB3YXRjaCA9IHF1ZXJ5SlNPTi53YXRjaD8uc3BsaXQoJywnKTtcbiAgICBjb25zdCBzdWJzY3JpYmVSZXF1ZXN0ID0ge1xuICAgICAgb3A6IE9QX1RZUEVTLlNVQlNDUklCRSxcbiAgICAgIHJlcXVlc3RJZDogdGhpcy5yZXF1ZXN0SWQsXG4gICAgICBxdWVyeToge1xuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHdoZXJlLFxuICAgICAgICBrZXlzLFxuICAgICAgICB3YXRjaFxuICAgICAgfSxcbiAgICAgIHNlc3Npb25Ub2tlbjogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBpZiAoc2Vzc2lvblRva2VuKSB7XG4gICAgICBzdWJzY3JpYmVSZXF1ZXN0LnNlc3Npb25Ub2tlbiA9IHNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IF9MaXZlUXVlcnlTdWJzY3JpcHRpb24uZGVmYXVsdCh0aGlzLnJlcXVlc3RJZCwgcXVlcnksIHNlc3Npb25Ub2tlbik7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnNldCh0aGlzLnJlcXVlc3RJZCwgc3Vic2NyaXB0aW9uKTtcbiAgICB0aGlzLnJlcXVlc3RJZCArPSAxO1xuICAgIHRoaXMuY29ubmVjdFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKCgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHN1YnNjcmliZVJlcXVlc3QpKTtcbiAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24uc3Vic2NyaWJlUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH0pO1xuICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogQWZ0ZXIgY2FsbGluZyB1bnN1YnNjcmliZSB5b3UnbGwgc3RvcCByZWNlaXZpbmcgZXZlbnRzIGZyb20gdGhlIHN1YnNjcmlwdGlvbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdWJzY3JpcHRpb24gLSBzdWJzY3JpcHRpb24geW91IHdvdWxkIGxpa2UgdG8gdW5zdWJzY3JpYmUgZnJvbS5cbiAgICogQHJldHVybnMge1Byb21pc2UgfCB1bmRlZmluZWR9XG4gICAqL1xuICBhc3luYyB1bnN1YnNjcmliZShzdWJzY3JpcHRpb24pIHtcbiAgICBpZiAoIXN1YnNjcmlwdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1bnN1YnNjcmliZVJlcXVlc3QgPSB7XG4gICAgICBvcDogT1BfVFlQRVMuVU5TVUJTQ1JJQkUsXG4gICAgICByZXF1ZXN0SWQ6IHN1YnNjcmlwdGlvbi5pZFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5zb2NrZXQuc2VuZCgoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KSh1bnN1YnNjcmliZVJlcXVlc3QpKTtcbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmVQcm9taXNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFmdGVyIG9wZW4gaXMgY2FsbGVkLCB0aGUgTGl2ZVF1ZXJ5Q2xpZW50IHdpbGwgdHJ5IHRvIHNlbmQgYSBjb25uZWN0IHJlcXVlc3RcbiAgICogdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIuXG4gICAqXG4gICAqL1xuICBvcGVuKCkge1xuICAgIGNvbnN0IFdlYlNvY2tldEltcGxlbWVudGF0aW9uID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0V2ViU29ja2V0Q29udHJvbGxlcigpO1xuICAgIGlmICghV2ViU29ja2V0SW1wbGVtZW50YXRpb24pIHtcbiAgICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5FUlJPUiwgJ0NhbiBub3QgZmluZCBXZWJTb2NrZXQgaW1wbGVtZW50YXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IENMSUVOVF9TVEFURS5SRUNPTk5FQ1RJTkcpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDTElFTlRfU1RBVEUuQ09OTkVDVElORztcbiAgICB9XG4gICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0SW1wbGVtZW50YXRpb24odGhpcy5zZXJ2ZXJVUkwpO1xuICAgIHRoaXMuc29ja2V0LmNsb3NpbmdQcm9taXNlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcblxuICAgIC8vIEJpbmQgV2ViU29ja2V0IGNhbGxiYWNrc1xuICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2hhbmRsZVdlYlNvY2tldE9wZW4oKTtcbiAgICB9O1xuICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuX2hhbmRsZVdlYlNvY2tldE1lc3NhZ2UoZXZlbnQpO1xuICAgIH07XG4gICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuc29ja2V0LmNsb3NpbmdQcm9taXNlPy5yZXNvbHZlKGV2ZW50KTtcbiAgICAgIHRoaXMuX2hhbmRsZVdlYlNvY2tldENsb3NlKCk7XG4gICAgfTtcbiAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgdGhpcy5faGFuZGxlV2ViU29ja2V0RXJyb3IoZXJyb3IpO1xuICAgIH07XG4gIH1cbiAgcmVzdWJzY3JpYmUoKSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dCA9IHRoaXMuc3Vic2NyaXB0aW9ucykuY2FsbChfY29udGV4dCwgKHN1YnNjcmlwdGlvbiwgcmVxdWVzdElkKSA9PiB7XG4gICAgICBjb25zdCBxdWVyeSA9IHN1YnNjcmlwdGlvbi5xdWVyeTtcbiAgICAgIGNvbnN0IHF1ZXJ5SlNPTiA9IHF1ZXJ5LnRvSlNPTigpO1xuICAgICAgY29uc3Qgd2hlcmUgPSBxdWVyeUpTT04ud2hlcmU7XG4gICAgICBjb25zdCBrZXlzID0gKDAsIF9rZXlzLmRlZmF1bHQpKHF1ZXJ5SlNPTik/LnNwbGl0KCcsJyk7XG4gICAgICBjb25zdCB3YXRjaCA9IHF1ZXJ5SlNPTi53YXRjaD8uc3BsaXQoJywnKTtcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICAgIGNvbnN0IHNlc3Npb25Ub2tlbiA9IHN1YnNjcmlwdGlvbi5zZXNzaW9uVG9rZW47XG4gICAgICBjb25zdCBzdWJzY3JpYmVSZXF1ZXN0ID0ge1xuICAgICAgICBvcDogT1BfVFlQRVMuU1VCU0NSSUJFLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgIHdoZXJlLFxuICAgICAgICAgIGtleXMsXG4gICAgICAgICAgd2F0Y2hcbiAgICAgICAgfSxcbiAgICAgICAgc2Vzc2lvblRva2VuOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgICBpZiAoc2Vzc2lvblRva2VuKSB7XG4gICAgICAgIHN1YnNjcmliZVJlcXVlc3Quc2Vzc2lvblRva2VuID0gc2Vzc2lvblRva2VuO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZCgoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShzdWJzY3JpYmVSZXF1ZXN0KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGNsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGlzIExpdmVRdWVyeUNsaWVudCxcbiAgICogY2FuY2VsIHRoZSBhdXRvIHJlY29ubmVjdCBhbmQgdW5zdWJzY3JpYmUgYWxsIHN1YnNjcmlwdGlvbnMgYmFzZWQgb24gaXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlIHwgdW5kZWZpbmVkfSBDbG9zZUV2ZW50IHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0L2Nsb3NlX2V2ZW50fVxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5JTklUSUFMSVpFRCB8fCB0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuRElTQ09OTkVDVEVEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSBDTElFTlRfU1RBVEUuRElTQ09OTkVDVEVEO1xuICAgIHRoaXMuc29ja2V0Py5jbG9zZSgpO1xuICAgIC8vIE5vdGlmeSBlYWNoIHN1YnNjcmlwdGlvbiBhYm91dCB0aGUgY2xvc2VcbiAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiAoMCwgX3ZhbHVlcy5kZWZhdWx0KShfY29udGV4dDIgPSB0aGlzLnN1YnNjcmlwdGlvbnMpLmNhbGwoX2NvbnRleHQyKSkge1xuICAgICAgdmFyIF9jb250ZXh0MjtcbiAgICAgIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICBzdWJzY3JpcHRpb24uZW1pdChTVUJTQ1JJUFRJT05fRU1NSVRFUl9UWVBFUy5DTE9TRSk7XG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZVJlc2V0KCk7XG4gICAgdGhpcy5lbWl0KENMSUVOVF9FTU1JVEVSX1RZUEVTLkNMT1NFKTtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LmNsb3NpbmdQcm9taXNlO1xuICB9XG5cbiAgLy8gZW5zdXJlIHdlIHN0YXJ0IHdpdGggdmFsaWQgc3RhdGUgaWYgY29ubmVjdCBpcyBjYWxsZWQgYWdhaW4gYWZ0ZXIgY2xvc2VcbiAgX2hhbmRsZVJlc2V0KCkge1xuICAgIHRoaXMuYXR0ZW1wdHMgPSAxO1xuICAgIHRoaXMuaWQgPSAwO1xuICAgIHRoaXMucmVxdWVzdElkID0gMTtcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgX21hcC5kZWZhdWx0KCk7XG4gIH1cbiAgX2hhbmRsZVdlYlNvY2tldE9wZW4oKSB7XG4gICAgY29uc3QgY29ubmVjdFJlcXVlc3QgPSB7XG4gICAgICBvcDogT1BfVFlQRVMuQ09OTkVDVCxcbiAgICAgIGFwcGxpY2F0aW9uSWQ6IHRoaXMuYXBwbGljYXRpb25JZCxcbiAgICAgIGphdmFzY3JpcHRLZXk6IHRoaXMuamF2YXNjcmlwdEtleSxcbiAgICAgIG1hc3RlcktleTogdGhpcy5tYXN0ZXJLZXksXG4gICAgICBzZXNzaW9uVG9rZW46IHRoaXMuc2Vzc2lvblRva2VuLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgaWYgKHRoaXMuYWRkaXRpb25hbFByb3BlcnRpZXMpIHtcbiAgICAgIGNvbm5lY3RSZXF1ZXN0Lmluc3RhbGxhdGlvbklkID0gdGhpcy5pbnN0YWxsYXRpb25JZDtcbiAgICB9XG4gICAgdGhpcy5zb2NrZXQuc2VuZCgoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShjb25uZWN0UmVxdWVzdCkpO1xuICB9XG4gIF9oYW5kbGVXZWJTb2NrZXRNZXNzYWdlKGV2ZW50KSB7XG4gICAgbGV0IGRhdGEgPSBldmVudC5kYXRhO1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH1cbiAgICBsZXQgc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICBpZiAoZGF0YS5yZXF1ZXN0SWQpIHtcbiAgICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaXB0aW9ucy5nZXQoZGF0YS5yZXF1ZXN0SWQpIHx8IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgY2xpZW50SWQ6IGRhdGEuY2xpZW50SWQsXG4gICAgICBpbnN0YWxsYXRpb25JZDogZGF0YS5pbnN0YWxsYXRpb25JZFxuICAgIH07XG4gICAgc3dpdGNoIChkYXRhLm9wKSB7XG4gICAgICBjYXNlIE9QX0VWRU5UUy5DT05ORUNURUQ6XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuUkVDT05ORUNUSU5HKSB7XG4gICAgICAgICAgdGhpcy5yZXN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5PUEVOKTtcbiAgICAgICAgdGhpcy5pZCA9IGRhdGEuY2xpZW50SWQ7XG4gICAgICAgIHRoaXMuY29ubmVjdFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLkNPTk5FQ1RFRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9QX0VWRU5UUy5TVUJTQ1JJQkVEOlxuICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgdGhpcy5hdHRlbXB0cyA9IDE7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnN1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAoMCwgX3NldFRpbWVvdXQyLmRlZmF1bHQpKCgpID0+IHN1YnNjcmlwdGlvbi5lbWl0KFNVQlNDUklQVElPTl9FTU1JVEVSX1RZUEVTLk9QRU4sIHJlc3BvbnNlKSwgMjAwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT1BfRVZFTlRTLkVSUk9SOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcGFyc2VFcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KGRhdGEuY29kZSwgZGF0YS5lcnJvcik7XG4gICAgICAgICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3RQcm9taXNlLnJlamVjdChwYXJzZUVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDTElFTlRfU1RBVEUuRElTQ09OTkVDVEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGF0YS5yZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnN1YnNjcmliZVByb21pc2UucmVqZWN0KHBhcnNlRXJyb3IpO1xuICAgICAgICAgICAgICAoMCwgX3NldFRpbWVvdXQyLmRlZmF1bHQpKCgpID0+IHN1YnNjcmlwdGlvbi5lbWl0KFNVQlNDUklQVElPTl9FTU1JVEVSX1RZUEVTLkVSUk9SLCBkYXRhLmVycm9yKSwgMjAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KENMSUVOVF9FTU1JVEVSX1RZUEVTLkVSUk9SLCBkYXRhLmVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRhdGEuZXJyb3IgPT09ICdBZGRpdGlvbmFsIHByb3BlcnRpZXMgbm90IGFsbG93ZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLnJlY29ubmVjdCkge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlUmVjb25uZWN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlIE9QX0VWRU5UUy5VTlNVQlNDUklCRUQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZGVsZXRlKGRhdGEucmVxdWVzdElkKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmVQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBjcmVhdGUsIHVwZGF0ZSwgZW50ZXIsIGxlYXZlLCBkZWxldGUgY2FzZXNcbiAgICAgICAgICBpZiAoIXN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBvdmVycmlkZSA9IGZhbHNlO1xuICAgICAgICAgIGlmIChkYXRhLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICBvdmVycmlkZSA9IHRydWU7XG4gICAgICAgICAgICBkZWxldGUgZGF0YS5vcmlnaW5hbC5fX3R5cGU7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgcmVtb3ZlZCBmaWVsZHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gZGF0YS5vcmlnaW5hbCkge1xuICAgICAgICAgICAgICBpZiAoIShmaWVsZCBpbiBkYXRhLm9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICBkYXRhLm9iamVjdFtmaWVsZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEub3JpZ2luYWwgPSBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTihkYXRhLm9yaWdpbmFsLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBkYXRhLm9iamVjdC5fX3R5cGU7XG4gICAgICAgICAgY29uc3QgcGFyc2VPYmplY3QgPSBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTihkYXRhLm9iamVjdCwgIShzdWJzY3JpcHRpb24ucXVlcnkgJiYgc3Vic2NyaXB0aW9uLnF1ZXJ5Ll9zZWxlY3QpID8gb3ZlcnJpZGUgOiBmYWxzZSk7XG4gICAgICAgICAgaWYgKGRhdGEub3JpZ2luYWwpIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5lbWl0KGRhdGEub3AsIHBhcnNlT2JqZWN0LCBkYXRhLm9yaWdpbmFsLCByZXNwb25zZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5lbWl0KGRhdGEub3AsIHBhcnNlT2JqZWN0LCByZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICAgICAgICBpZiAob3ZlcnJpZGUgJiYgbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICAgICAgICBsb2NhbERhdGFzdG9yZS5fdXBkYXRlT2JqZWN0SWZQaW5uZWQocGFyc2VPYmplY3QpLnRoZW4oKCkgPT4ge30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuICBfaGFuZGxlV2ViU29ja2V0Q2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5ESVNDT05ORUNURUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IENMSUVOVF9TVEFURS5DTE9TRUQ7XG4gICAgdGhpcy5lbWl0KENMSUVOVF9FTU1JVEVSX1RZUEVTLkNMT1NFKTtcbiAgICAvLyBOb3RpZnkgZWFjaCBzdWJzY3JpcHRpb24gYWJvdXQgdGhlIGNsb3NlXG4gICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgKDAsIF92YWx1ZXMuZGVmYXVsdCkoX2NvbnRleHQzID0gdGhpcy5zdWJzY3JpcHRpb25zKS5jYWxsKF9jb250ZXh0MykpIHtcbiAgICAgIHZhciBfY29udGV4dDM7XG4gICAgICBzdWJzY3JpcHRpb24uZW1pdChTVUJTQ1JJUFRJT05fRU1NSVRFUl9UWVBFUy5DTE9TRSk7XG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZVJlY29ubmVjdCgpO1xuICB9XG4gIF9oYW5kbGVXZWJTb2NrZXRFcnJvcihlcnJvcikge1xuICAgIHRoaXMuZW1pdChDTElFTlRfRU1NSVRFUl9UWVBFUy5FUlJPUiwgZXJyb3IpO1xuICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mICgwLCBfdmFsdWVzLmRlZmF1bHQpKF9jb250ZXh0NCA9IHRoaXMuc3Vic2NyaXB0aW9ucykuY2FsbChfY29udGV4dDQpKSB7XG4gICAgICB2YXIgX2NvbnRleHQ0O1xuICAgICAgc3Vic2NyaXB0aW9uLmVtaXQoU1VCU0NSSVBUSU9OX0VNTUlURVJfVFlQRVMuRVJST1IsIGVycm9yKTtcbiAgICB9XG4gICAgdGhpcy5faGFuZGxlUmVjb25uZWN0KCk7XG4gIH1cbiAgX2hhbmRsZVJlY29ubmVjdCgpIHtcbiAgICB2YXIgX2NvbnRleHQ1O1xuICAgIC8vIGlmIGNsb3NlZCBvciBjdXJyZW50bHkgcmVjb25uZWN0aW5nIHdlIHN0b3AgYXR0ZW1wdGluZyB0byByZWNvbm5lY3RcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQ0xJRU5UX1NUQVRFLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLlJFQ09OTkVDVElORztcbiAgICBjb25zdCB0aW1lID0gZ2VuZXJhdGVJbnRlcnZhbCh0aGlzLmF0dGVtcHRzKTtcblxuICAgIC8vIGhhbmRsZSBjYXNlIHdoZW4gYm90aCBjbG9zZS9lcnJvciBvY2N1ciBhdCBmcmVxdWVudCByYXRlcyB3ZSBlbnN1cmUgd2UgZG8gbm90IHJlY29ubmVjdCB1bm5lY2Vzc2FyaWx5LlxuICAgIC8vIHdlJ3JlIHVuYWJsZSB0byBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgYmV0d2VlbiBjbG9zZS9lcnJvciB3aGVuIHdlJ3JlIHVuYWJsZSB0byByZWNvbm5lY3QgdGhlcmVmb3JlXG4gICAgLy8gd2UgdHJ5IHRvIHJlY29ubmVjdCBpbiBib3RoIGNhc2VzXG4gICAgLy8gc2VydmVyIHNpZGUgd3MgYW5kIGJyb3dzZXIgV2ViU29ja2V0IGJlaGF2ZSBkaWZmZXJlbnRseSBpbiB3aGVuIGNsb3NlL2Vycm9yIGdldCB0cmlnZ2VyZWRcbiAgICBpZiAodGhpcy5yZWNvbm5lY3RIYW5kbGUpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdEhhbmRsZSk7XG4gICAgfVxuICAgIHRoaXMucmVjb25uZWN0SGFuZGxlID0gKDAsIF9zZXRUaW1lb3V0Mi5kZWZhdWx0KSgoMCwgX2JpbmQuZGVmYXVsdCkoX2NvbnRleHQ1ID0gKCkgPT4ge1xuICAgICAgdGhpcy5hdHRlbXB0cysrO1xuICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9KS5jYWxsKF9jb250ZXh0NSwgdGhpcyksIHRpbWUpO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBMaXZlUXVlcnlDbGllbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfcHJvbWlzZVV0aWxzID0gcmVxdWlyZShcIi4vcHJvbWlzZVV0aWxzXCIpO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IExpdmVRdWVyeSBTdWJzY3JpcHRpb24uXG4gKiA8YSBocmVmPVwiaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9ldmVudHMuaHRtbCNldmVudHNfY2xhc3NfZXZlbnRlbWl0dGVyXCI+Y2xvdWQgZnVuY3Rpb25zPC9hPi5cbiAqXG4gKiA8cD5SZXNwb25zZSBPYmplY3QgLSBDb250YWlucyBkYXRhIGZyb20gdGhlIGNsaWVudCB0aGF0IG1hZGUgdGhlIHJlcXVlc3RcbiAqIDx1bD5cbiAqIDxsaT5jbGllbnRJZDwvbGk+XG4gKiA8bGk+aW5zdGFsbGF0aW9uSWQgLSByZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgNC4wLjArPC9saT5cbiAqIDwvdWw+XG4gKiA8L3A+XG4gKlxuICogPHA+T3BlbiBFdmVudCAtIFdoZW4geW91IGNhbGwgcXVlcnkuc3Vic2NyaWJlKCksIHdlIHNlbmQgYSBzdWJzY3JpYmUgcmVxdWVzdCB0b1xuICogdGhlIExpdmVRdWVyeSBzZXJ2ZXIsIHdoZW4gd2UgZ2V0IHRoZSBjb25maXJtYXRpb24gZnJvbSB0aGUgTGl2ZVF1ZXJ5IHNlcnZlcixcbiAqIHRoaXMgZXZlbnQgd2lsbCBiZSBlbWl0dGVkLiBXaGVuIHRoZSBjbGllbnQgbG9zZXMgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlXG4gKiBMaXZlUXVlcnkgc2VydmVyLCB3ZSB3aWxsIHRyeSB0byBhdXRvIHJlY29ubmVjdCB0aGUgTGl2ZVF1ZXJ5IHNlcnZlci4gSWYgd2VcbiAqIHJlY29ubmVjdCB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciBhbmQgc3VjY2Vzc2Z1bGx5IHJlc3Vic2NyaWJlIHRoZSBQYXJzZVF1ZXJ5LFxuICogeW91J2xsIGFsc28gZ2V0IHRoaXMgZXZlbnQuXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbignb3BlbicsIChyZXNwb25zZSkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiA8cD5DcmVhdGUgRXZlbnQgLSBXaGVuIGEgbmV3IFBhcnNlT2JqZWN0IGlzIGNyZWF0ZWQgYW5kIGl0IGZ1bGZpbGxzIHRoZSBQYXJzZVF1ZXJ5IHlvdSBzdWJzY3JpYmUsXG4gKiB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuIFRoZSBvYmplY3QgaXMgdGhlIFBhcnNlT2JqZWN0IHdoaWNoIGlzIGNyZWF0ZWQuXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbignY3JlYXRlJywgKG9iamVjdCwgcmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+VXBkYXRlIEV2ZW50IC0gV2hlbiBhbiBleGlzdGluZyBQYXJzZU9iamVjdCAob3JpZ2luYWwpIHdoaWNoIGZ1bGZpbGxzIHRoZSBQYXJzZVF1ZXJ5IHlvdSBzdWJzY3JpYmVcbiAqIGlzIHVwZGF0ZWQgKFRoZSBQYXJzZU9iamVjdCBmdWxmaWxscyB0aGUgUGFyc2VRdWVyeSBiZWZvcmUgYW5kIGFmdGVyIGNoYW5nZXMpLFxuICogeW91J2xsIGdldCB0aGlzIGV2ZW50LiBUaGUgb2JqZWN0IGlzIHRoZSBQYXJzZU9iamVjdCB3aGljaCBpcyB1cGRhdGVkLlxuICogSXRzIGNvbnRlbnQgaXMgdGhlIGxhdGVzdCB2YWx1ZSBvZiB0aGUgUGFyc2VPYmplY3QuXG4gKlxuICogUGFyc2UtU2VydmVyIDMuMS4zKyBSZXF1aXJlZCBmb3Igb3JpZ2luYWwgb2JqZWN0IHBhcmFtZXRlclxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ3VwZGF0ZScsIChvYmplY3QsIG9yaWdpbmFsLCByZXNwb25zZSkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiA8cD5FbnRlciBFdmVudCAtIFdoZW4gYW4gZXhpc3RpbmcgUGFyc2VPYmplY3QncyAob3JpZ2luYWwpIG9sZCB2YWx1ZSBkb2Vzbid0IGZ1bGZpbGwgdGhlIFBhcnNlUXVlcnlcbiAqIGJ1dCBpdHMgbmV3IHZhbHVlIGZ1bGZpbGxzIHRoZSBQYXJzZVF1ZXJ5LCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuIFRoZSBvYmplY3QgaXMgdGhlXG4gKiBQYXJzZU9iamVjdCB3aGljaCBlbnRlcnMgdGhlIFBhcnNlUXVlcnkuIEl0cyBjb250ZW50IGlzIHRoZSBsYXRlc3QgdmFsdWUgb2YgdGhlIFBhcnNlT2JqZWN0LlxuICpcbiAqIFBhcnNlLVNlcnZlciAzLjEuMysgUmVxdWlyZWQgZm9yIG9yaWdpbmFsIG9iamVjdCBwYXJhbWV0ZXJcbiAqXG4gKiA8cHJlPlxuICogc3Vic2NyaXB0aW9uLm9uKCdlbnRlcicsIChvYmplY3QsIG9yaWdpbmFsLCByZXNwb25zZSkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKlxuICogPHA+VXBkYXRlIEV2ZW50IC0gV2hlbiBhbiBleGlzdGluZyBQYXJzZU9iamVjdCdzIG9sZCB2YWx1ZSBmdWxmaWxscyB0aGUgUGFyc2VRdWVyeSBidXQgaXRzIG5ldyB2YWx1ZVxuICogZG9lc24ndCBmdWxmaWxsIHRoZSBQYXJzZVF1ZXJ5LCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuIFRoZSBvYmplY3QgaXMgdGhlIFBhcnNlT2JqZWN0XG4gKiB3aGljaCBsZWF2ZXMgdGhlIFBhcnNlUXVlcnkuIEl0cyBjb250ZW50IGlzIHRoZSBsYXRlc3QgdmFsdWUgb2YgdGhlIFBhcnNlT2JqZWN0LlxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ2xlYXZlJywgKG9iamVjdCwgcmVzcG9uc2UpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICpcbiAqIDxwPkRlbGV0ZSBFdmVudCAtIFdoZW4gYW4gZXhpc3RpbmcgUGFyc2VPYmplY3Qgd2hpY2ggZnVsZmlsbHMgdGhlIFBhcnNlUXVlcnkgaXMgZGVsZXRlZCwgeW91J2xsXG4gKiBnZXQgdGhpcyBldmVudC4gVGhlIG9iamVjdCBpcyB0aGUgUGFyc2VPYmplY3Qgd2hpY2ggaXMgZGVsZXRlZC5cbiAqXG4gKiA8cHJlPlxuICogc3Vic2NyaXB0aW9uLm9uKCdkZWxldGUnLCAob2JqZWN0LCByZXNwb25zZSkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKlxuICogPHA+Q2xvc2UgRXZlbnQgLSBXaGVuIHRoZSBjbGllbnQgbG9zZXMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnlcbiAqIHNlcnZlciBhbmQgd2Ugc3RvcCByZWNlaXZpbmcgZXZlbnRzLCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbignY2xvc2UnLCAoKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICovXG5jbGFzcyBTdWJzY3JpcHRpb24ge1xuICAvKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBzdWJzY3JpcHRpb24gaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IC0gcXVlcnkgdG8gc3Vic2NyaWJlIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uVG9rZW4gLSBvcHRpb25hbCBzZXNzaW9uIHRva2VuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihpZCwgcXVlcnksIHNlc3Npb25Ub2tlbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJpZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicXVlcnlcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInNlc3Npb25Ub2tlblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic3Vic2NyaWJlUHJvbWlzZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwidW5zdWJzY3JpYmVQcm9taXNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzdWJzY3JpYmVkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJlbWl0dGVyXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiZW1pdFwiLCB2b2lkIDApO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XG4gICAgdGhpcy5zZXNzaW9uVG9rZW4gPSBzZXNzaW9uVG9rZW47XG4gICAgdGhpcy5zdWJzY3JpYmVQcm9taXNlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlUHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgY29uc3QgRXZlbnRFbWl0dGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMub24gPSAoZXZlbnROYW1lLCBsaXN0ZW5lcikgPT4gdGhpcy5lbWl0dGVyLm9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gX3RoaXMuZW1pdHRlci5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7XG4gICAgfTtcbiAgICAvLyBhZGRpbmcgbGlzdGVuZXIgc28gcHJvY2VzcyBkb2VzIG5vdCBjcmFzaFxuICAgIC8vIGJlc3QgcHJhY3RpY2UgaXMgZm9yIGRldmVsb3BlciB0byByZWdpc3RlciB0aGVpciBvd24gbGlzdGVuZXJcbiAgICB0aGlzLm9uKCdlcnJvcicsICgpID0+IHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgc3Vic2NyaXB0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgdW5zdWJzY3JpYmUoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExpdmVRdWVyeUNvbnRyb2xsZXIoKS5nZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50KCkudGhlbihsaXZlUXVlcnlDbGllbnQgPT4ge1xuICAgICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICAgICAgcmV0dXJuIGxpdmVRdWVyeUNsaWVudC51bnN1YnNjcmliZSh0aGlzKTtcbiAgICB9KTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gU3Vic2NyaXB0aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9zZXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldFwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfZmlsdGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maWx0ZXJcIikpO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9zdGFydHNXaXRoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zdGFydHMtd2l0aFwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9jb25jYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKSk7XG52YXIgX2Zyb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2Zyb21cIikpO1xudmFyIF9maW5kID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maW5kXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXJcIikpO1xudmFyIF9QYXJzZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVF1ZXJ5XCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVVdGlscyA9IHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlVXRpbHNcIik7XG4vKipcbiAqIFByb3ZpZGVzIGEgbG9jYWwgZGF0YXN0b3JlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LiA8YnIgLz5cbiAqIFRvIGVuYWJsZSB0aGlzIGZ1bmN0aW9uYWxpdHksIGNhbGwgPGNvZGU+UGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKTwvY29kZT4uXG4gKlxuICogUGluIG9iamVjdCB0byBhZGQgdG8gbG9jYWwgZGF0YXN0b3JlXG4gKlxuICogPHByZT5hd2FpdCBvYmplY3QucGluKCk7PC9wcmU+XG4gKiA8cHJlPmF3YWl0IG9iamVjdC5waW5XaXRoTmFtZSgncGluTmFtZScpOzwvcHJlPlxuICpcbiAqIFF1ZXJ5IHBpbm5lZCBvYmplY3RzXG4gKlxuICogPHByZT5xdWVyeS5mcm9tTG9jYWxEYXRhc3RvcmUoKTs8L3ByZT5cbiAqIDxwcmU+cXVlcnkuZnJvbVBpbigpOzwvcHJlPlxuICogPHByZT5xdWVyeS5mcm9tUGluV2l0aE5hbWUoKTs8L3ByZT5cbiAqXG4gKiA8cHJlPmNvbnN0IGxvY2FsT2JqZWN0cyA9IGF3YWl0IHF1ZXJ5LmZpbmQoKTs8L3ByZT5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuTG9jYWxEYXRhc3RvcmVcbiAqIEBzdGF0aWNcbiAqL1xuY29uc3QgTG9jYWxEYXRhc3RvcmUgPSB7XG4gIGlzRW5hYmxlZDogZmFsc2UsXG4gIGlzU3luY2luZzogZmFsc2UsXG4gIGZyb21QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmZyb21QaW5XaXRoTmFtZShuYW1lKTtcbiAgfSxcbiAgYXN5bmMgcGluV2l0aE5hbWUobmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIucGluV2l0aE5hbWUobmFtZSwgdmFsdWUpO1xuICB9LFxuICBhc3luYyB1blBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIudW5QaW5XaXRoTmFtZShuYW1lKTtcbiAgfSxcbiAgX2dldEFsbENvbnRlbnRzKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5nZXRBbGxDb250ZW50cygpO1xuICB9LFxuICAvLyBVc2UgZm9yIHRlc3RpbmdcbiAgYXN5bmMgX2dldFJhd1N0b3JhZ2UoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmdldFJhd1N0b3JhZ2UoKTtcbiAgfSxcbiAgYXN5bmMgX2NsZWFyKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5jbGVhcigpO1xuICB9LFxuICAvLyBQaW4gdGhlIG9iamVjdCBhbmQgY2hpbGRyZW4gcmVjdXJzaXZlbHlcbiAgLy8gU2F2ZXMgdGhlIG9iamVjdCBhbmQgY2hpbGRyZW4ga2V5IHRvIFBpbiBOYW1lXG4gIGFzeW5jIF9oYW5kbGVQaW5BbGxXaXRoTmFtZShuYW1lLCBvYmplY3RzKSB7XG4gICAgY29uc3QgcGluTmFtZSA9IHRoaXMuZ2V0UGluTmFtZShuYW1lKTtcbiAgICBjb25zdCB0b1BpblByb21pc2VzID0gW107XG4gICAgY29uc3Qgb2JqZWN0S2V5cyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG9iamVjdHMpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2hpbGRyZW4ocGFyZW50KTtcbiAgICAgIGNvbnN0IHBhcmVudEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KHBhcmVudCk7XG4gICAgICBjb25zdCBqc29uID0gcGFyZW50Ll90b0Z1bGxKU09OKHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICBpZiAocGFyZW50Ll9sb2NhbElkKSB7XG4gICAgICAgIGpzb24uX2xvY2FsSWQgPSBwYXJlbnQuX2xvY2FsSWQ7XG4gICAgICB9XG4gICAgICBjaGlsZHJlbltwYXJlbnRLZXldID0ganNvbjtcbiAgICAgIGZvciAoY29uc3Qgb2JqZWN0S2V5IGluIGNoaWxkcmVuKSB7XG4gICAgICAgIG9iamVjdEtleXMucHVzaChvYmplY3RLZXkpO1xuICAgICAgICB0b1BpblByb21pc2VzLnB1c2godGhpcy5waW5XaXRoTmFtZShvYmplY3RLZXksIFtjaGlsZHJlbltvYmplY3RLZXldXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBmcm9tUGluUHJvbWlzZSA9IHRoaXMuZnJvbVBpbldpdGhOYW1lKHBpbk5hbWUpO1xuICAgIGNvbnN0IFtwaW5uZWRdID0gYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwoW2Zyb21QaW5Qcm9taXNlLCB0b1BpblByb21pc2VzXSk7XG4gICAgY29uc3QgdG9QaW4gPSBbLi4ubmV3IF9zZXQuZGVmYXVsdChbLi4uKHBpbm5lZCB8fCBbXSksIC4uLm9iamVjdEtleXNdKV07XG4gICAgcmV0dXJuIHRoaXMucGluV2l0aE5hbWUocGluTmFtZSwgdG9QaW4pO1xuICB9LFxuICAvLyBSZW1vdmVzIG9iamVjdCBhbmQgY2hpbGRyZW4ga2V5cyBmcm9tIHBpbiBuYW1lXG4gIC8vIEtlZXBzIHRoZSBvYmplY3QgYW5kIGNoaWxkcmVuIHBpbm5lZFxuICBhc3luYyBfaGFuZGxlVW5QaW5BbGxXaXRoTmFtZShuYW1lLCBvYmplY3RzKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBhd2FpdCB0aGlzLl9nZXRBbGxDb250ZW50cygpO1xuICAgIGNvbnN0IHBpbk5hbWUgPSB0aGlzLmdldFBpbk5hbWUobmFtZSk7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICBsZXQgb2JqZWN0S2V5cyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG9iamVjdHMpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Q2hpbGRyZW4ocGFyZW50KTtcbiAgICAgIGNvbnN0IHBhcmVudEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KHBhcmVudCk7XG4gICAgICBvYmplY3RLZXlzLnB1c2gocGFyZW50S2V5LCAuLi4oMCwgX2tleXMuZGVmYXVsdCkoY2hpbGRyZW4pKTtcbiAgICB9XG4gICAgb2JqZWN0S2V5cyA9IFsuLi5uZXcgX3NldC5kZWZhdWx0KG9iamVjdEtleXMpXTtcbiAgICBsZXQgcGlubmVkID0gbG9jYWxEYXRhc3RvcmVbcGluTmFtZV0gfHwgW107XG4gICAgcGlubmVkID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkocGlubmVkKS5jYWxsKHBpbm5lZCwgaXRlbSA9PiAhKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShvYmplY3RLZXlzKS5jYWxsKG9iamVjdEtleXMsIGl0ZW0pKTtcbiAgICBpZiAocGlubmVkLmxlbmd0aCA9PSAwKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHRoaXMudW5QaW5XaXRoTmFtZShwaW5OYW1lKSk7XG4gICAgICBkZWxldGUgbG9jYWxEYXRhc3RvcmVbcGluTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2VzLnB1c2godGhpcy5waW5XaXRoTmFtZShwaW5OYW1lLCBwaW5uZWQpKTtcbiAgICAgIGxvY2FsRGF0YXN0b3JlW3Bpbk5hbWVdID0gcGlubmVkO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9iamVjdEtleSBvZiBvYmplY3RLZXlzKSB7XG4gICAgICBsZXQgaGFzUmVmZXJlbmNlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbERhdGFzdG9yZSkge1xuICAgICAgICBpZiAoa2V5ID09PSBfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiB8fCAoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuUElOX1BSRUZJWCkpIHtcbiAgICAgICAgICBjb25zdCBwaW5uZWRPYmplY3RzID0gbG9jYWxEYXRhc3RvcmVba2V5XSB8fCBbXTtcbiAgICAgICAgICBpZiAoKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShwaW5uZWRPYmplY3RzKS5jYWxsKHBpbm5lZE9iamVjdHMsIG9iamVjdEtleSkpIHtcbiAgICAgICAgICAgIGhhc1JlZmVyZW5jZSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaGFzUmVmZXJlbmNlKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2godGhpcy51blBpbldpdGhOYW1lKG9iamVjdEtleSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMpO1xuICB9LFxuICAvLyBSZXRyaWV2ZSBhbGwgcG9pbnRlciBmaWVsZHMgZnJvbSBvYmplY3QgcmVjdXJzaXZlbHlcbiAgX2dldENoaWxkcmVuKG9iamVjdCkge1xuICAgIGNvbnN0IGVuY291bnRlcmVkID0ge307XG4gICAgY29uc3QganNvbiA9IG9iamVjdC5fdG9GdWxsSlNPTih1bmRlZmluZWQsIHRydWUpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGpzb24pIHtcbiAgICAgIGlmIChqc29uW2tleV0gJiYganNvbltrZXldLl9fdHlwZSAmJiBqc29uW2tleV0uX190eXBlID09PSAnT2JqZWN0Jykge1xuICAgICAgICB0aGlzLl90cmF2ZXJzZShqc29uW2tleV0sIGVuY291bnRlcmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuY291bnRlcmVkO1xuICB9LFxuICBfdHJhdmVyc2Uob2JqZWN0LCBlbmNvdW50ZXJlZCkge1xuICAgIGlmICghb2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9iamVjdEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdCk7XG4gICAgICBpZiAoZW5jb3VudGVyZWRbb2JqZWN0S2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbmNvdW50ZXJlZFtvYmplY3RLZXldID0gb2JqZWN0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGxldCBqc29uID0gb2JqZWN0W2tleV07XG4gICAgICBpZiAoIW9iamVjdFtrZXldKSB7XG4gICAgICAgIGpzb24gPSBvYmplY3Q7XG4gICAgICB9XG4gICAgICBpZiAoanNvbi5fX3R5cGUgJiYganNvbi5fX3R5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgICAgIHRoaXMuX3RyYXZlcnNlKGpzb24sIGVuY291bnRlcmVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vIFRyYW5zZm9ybSBrZXlzIGluIHBpbiBuYW1lIHRvIG9iamVjdHNcbiAgYXN5bmMgX3NlcmlhbGl6ZU9iamVjdHNGcm9tUGluTmFtZShuYW1lKSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gYXdhaXQgdGhpcy5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICBjb25zdCBhbGxPYmplY3RzID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgIGlmICgoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuT0JKRUNUX1BSRUZJWCkpIHtcbiAgICAgICAgYWxsT2JqZWN0cy5wdXNoKGxvY2FsRGF0YXN0b3JlW2tleV1bMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHJldHVybiBhbGxPYmplY3RzO1xuICAgIH1cbiAgICBjb25zdCBwaW5OYW1lID0gdGhpcy5nZXRQaW5OYW1lKG5hbWUpO1xuICAgIGNvbnN0IHBpbm5lZCA9IGxvY2FsRGF0YXN0b3JlW3Bpbk5hbWVdO1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKHBpbm5lZCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSAoMCwgX21hcC5kZWZhdWx0KShwaW5uZWQpLmNhbGwocGlubmVkLCBvYmplY3RLZXkgPT4gdGhpcy5mcm9tUGluV2l0aE5hbWUob2JqZWN0S2V5KSk7XG4gICAgbGV0IG9iamVjdHMgPSBhd2FpdCBfcHJvbWlzZS5kZWZhdWx0LmFsbChwcm9taXNlcyk7XG4gICAgb2JqZWN0cyA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0ID0gW10pLmNhbGwoX2NvbnRleHQsIC4uLm9iamVjdHMpO1xuICAgIHJldHVybiAoMCwgX2ZpbHRlci5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIG9iamVjdCA9PiBvYmplY3QgIT0gbnVsbCk7XG4gIH0sXG4gIC8vIFJlcGxhY2VzIG9iamVjdCBwb2ludGVycyB3aXRoIHBpbm5lZCBwb2ludGVyc1xuICAvLyBUaGUgb2JqZWN0IHBvaW50ZXJzIG1heSBjb250YWluIG9sZCBkYXRhXG4gIC8vIFVzZXMgQnJlYWR0aCBGaXJzdCBTZWFyY2ggQWxnb3JpdGhtXG4gIGFzeW5jIF9zZXJpYWxpemVPYmplY3Qob2JqZWN0S2V5LCBsb2NhbERhdGFzdG9yZSkge1xuICAgIGxldCBMRFMgPSBsb2NhbERhdGFzdG9yZTtcbiAgICBpZiAoIUxEUykge1xuICAgICAgTERTID0gYXdhaXQgdGhpcy5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICB9XG4gICAgaWYgKCFMRFNbb2JqZWN0S2V5XSB8fCBMRFNbb2JqZWN0S2V5XS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByb290ID0gTERTW29iamVjdEtleV1bMF07XG4gICAgY29uc3QgcXVldWUgPSBbXTtcbiAgICBjb25zdCBtZXRhID0ge307XG4gICAgbGV0IHVuaXF1ZUlkID0gMDtcbiAgICBtZXRhW3VuaXF1ZUlkXSA9IHJvb3Q7XG4gICAgcXVldWUucHVzaCh1bmlxdWVJZCk7XG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3Qgbm9kZUlkID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIGNvbnN0IHN1YlRyZWVSb290ID0gbWV0YVtub2RlSWRdO1xuICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBzdWJUcmVlUm9vdCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHN1YlRyZWVSb290W2ZpZWxkXTtcbiAgICAgICAgaWYgKHZhbHVlLl9fdHlwZSAmJiB2YWx1ZS5fX3R5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXlGb3JPYmplY3QodmFsdWUpO1xuICAgICAgICAgIGlmIChMRFNba2V5XSAmJiBMRFNba2V5XS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludGVyID0gTERTW2tleV1bMF07XG4gICAgICAgICAgICB1bmlxdWVJZCsrO1xuICAgICAgICAgICAgbWV0YVt1bmlxdWVJZF0gPSBwb2ludGVyO1xuICAgICAgICAgICAgc3ViVHJlZVJvb3RbZmllbGRdID0gcG9pbnRlcjtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2godW5pcXVlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfSxcbiAgLy8gQ2FsbGVkIHdoZW4gYW4gb2JqZWN0IGlzIHNhdmUgLyBmZXRjaGVkXG4gIC8vIFVwZGF0ZSBvYmplY3QgcGluIHZhbHVlXG4gIGFzeW5jIF91cGRhdGVPYmplY3RJZlBpbm5lZChvYmplY3QpIHtcbiAgICBpZiAoIXRoaXMuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9iamVjdEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdCk7XG4gICAgY29uc3QgcGlubmVkID0gYXdhaXQgdGhpcy5mcm9tUGluV2l0aE5hbWUob2JqZWN0S2V5KTtcbiAgICBpZiAoIXBpbm5lZCB8fCBwaW5uZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBpbldpdGhOYW1lKG9iamVjdEtleSwgW29iamVjdC5fdG9GdWxsSlNPTigpXSk7XG4gIH0sXG4gIC8vIENhbGxlZCB3aGVuIG9iamVjdCBpcyBkZXN0cm95ZWRcbiAgLy8gVW5waW4gb2JqZWN0IGFuZCByZW1vdmUgYWxsIHJlZmVyZW5jZXMgZnJvbSBwaW4gbmFtZXNcbiAgLy8gVE9ETzogRGVzdHJveSBjaGlsZHJlbj9cbiAgYXN5bmMgX2Rlc3Ryb3lPYmplY3RJZlBpbm5lZChvYmplY3QpIHtcbiAgICBpZiAoIXRoaXMuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gYXdhaXQgdGhpcy5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICBjb25zdCBvYmplY3RLZXkgPSB0aGlzLmdldEtleUZvck9iamVjdChvYmplY3QpO1xuICAgIGNvbnN0IHBpbiA9IGxvY2FsRGF0YXN0b3JlW29iamVjdEtleV07XG4gICAgaWYgKCFwaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbdGhpcy51blBpbldpdGhOYW1lKG9iamVjdEtleSldO1xuICAgIGRlbGV0ZSBsb2NhbERhdGFzdG9yZVtvYmplY3RLZXldO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsRGF0YXN0b3JlKSB7XG4gICAgICBpZiAoa2V5ID09PSBfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiB8fCAoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuUElOX1BSRUZJWCkpIHtcbiAgICAgICAgbGV0IHBpbm5lZCA9IGxvY2FsRGF0YXN0b3JlW2tleV0gfHwgW107XG4gICAgICAgIGlmICgoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKHBpbm5lZCkuY2FsbChwaW5uZWQsIG9iamVjdEtleSkpIHtcbiAgICAgICAgICBwaW5uZWQgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShwaW5uZWQpLmNhbGwocGlubmVkLCBpdGVtID0+IGl0ZW0gIT09IG9iamVjdEtleSk7XG4gICAgICAgICAgaWYgKHBpbm5lZC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnVuUGluV2l0aE5hbWUoa2V5KSk7XG4gICAgICAgICAgICBkZWxldGUgbG9jYWxEYXRhc3RvcmVba2V5XTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnBpbldpdGhOYW1lKGtleSwgcGlubmVkKSk7XG4gICAgICAgICAgICBsb2NhbERhdGFzdG9yZVtrZXldID0gcGlubmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMpO1xuICB9LFxuICAvLyBVcGRhdGUgcGluIGFuZCByZWZlcmVuY2VzIG9mIHRoZSB1bnNhdmVkIG9iamVjdFxuICBhc3luYyBfdXBkYXRlTG9jYWxJZEZvck9iamVjdChsb2NhbElkLCBvYmplY3QpIHtcbiAgICBpZiAoIXRoaXMuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsS2V5ID0gYCR7X0xvY2FsRGF0YXN0b3JlVXRpbHMuT0JKRUNUX1BSRUZJWH0ke29iamVjdC5jbGFzc05hbWV9XyR7bG9jYWxJZH1gO1xuICAgIGNvbnN0IG9iamVjdEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdCk7XG4gICAgY29uc3QgdW5zYXZlZCA9IGF3YWl0IHRoaXMuZnJvbVBpbldpdGhOYW1lKGxvY2FsS2V5KTtcbiAgICBpZiAoIXVuc2F2ZWQgfHwgdW5zYXZlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbdGhpcy51blBpbldpdGhOYW1lKGxvY2FsS2V5KSwgdGhpcy5waW5XaXRoTmFtZShvYmplY3RLZXksIHVuc2F2ZWQpXTtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IGF3YWl0IHRoaXMuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgIGlmIChrZXkgPT09IF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOIHx8ICgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCBfTG9jYWxEYXRhc3RvcmVVdGlscy5QSU5fUFJFRklYKSkge1xuICAgICAgICBsZXQgcGlubmVkID0gbG9jYWxEYXRhc3RvcmVba2V5XSB8fCBbXTtcbiAgICAgICAgaWYgKCgwLCBfaW5jbHVkZXMuZGVmYXVsdCkocGlubmVkKS5jYWxsKHBpbm5lZCwgbG9jYWxLZXkpKSB7XG4gICAgICAgICAgcGlubmVkID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkocGlubmVkKS5jYWxsKHBpbm5lZCwgaXRlbSA9PiBpdGVtICE9PSBsb2NhbEtleSk7XG4gICAgICAgICAgcGlubmVkLnB1c2gob2JqZWN0S2V5KTtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMucGluV2l0aE5hbWUoa2V5LCBwaW5uZWQpKTtcbiAgICAgICAgICBsb2NhbERhdGFzdG9yZVtrZXldID0gcGlubmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LmFsbChwcm9taXNlcyk7XG4gIH0sXG4gIC8qKlxuICAgKiBVcGRhdGVzIExvY2FsIERhdGFzdG9yZSBmcm9tIFNlcnZlclxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5Mb2NhbERhdGFzdG9yZS51cGRhdGVGcm9tU2VydmVyKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAZnVuY3Rpb24gdXBkYXRlRnJvbVNlcnZlclxuICAgKiBAbmFtZSBQYXJzZS5Mb2NhbERhdGFzdG9yZS51cGRhdGVGcm9tU2VydmVyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZUZyb21TZXJ2ZXIoKSB7XG4gICAgdmFyIF9jb250ZXh0MjtcbiAgICBpZiAoIXRoaXMuY2hlY2tJZkVuYWJsZWQoKSB8fCB0aGlzLmlzU3luY2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IGF3YWl0IHRoaXMuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgY29uc3Qga2V5cyA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsRGF0YXN0b3JlKSB7XG4gICAgICBpZiAoKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIF9Mb2NhbERhdGFzdG9yZVV0aWxzLk9CSkVDVF9QUkVGSVgpKSB7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc1N5bmNpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHBvaW50ZXJzSGFzaCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIC8vIElnbm9yZSB0aGUgT0JKRUNUX1BSRUZJWFxuICAgICAgbGV0IFssLCBjbGFzc05hbWUsIG9iamVjdElkXSA9IGtleS5zcGxpdCgnXycpO1xuXG4gICAgICAvLyBVc2VyIGtleSBpcyBzcGxpdCBpbnRvIFsgJ1BhcnNlJywgJ0xEUycsICcnLCAnVXNlcicsICdvYmplY3RJZCcgXVxuICAgICAgaWYgKGtleS5zcGxpdCgnXycpLmxlbmd0aCA9PT0gNSAmJiBrZXkuc3BsaXQoJ18nKVszXSA9PT0gJ1VzZXInKSB7XG4gICAgICAgIGNsYXNzTmFtZSA9ICdfVXNlcic7XG4gICAgICAgIG9iamVjdElkID0ga2V5LnNwbGl0KCdfJylbNF07XG4gICAgICB9XG4gICAgICBpZiAoKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKG9iamVjdElkKS5jYWxsKG9iamVjdElkLCAnbG9jYWwnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKGNsYXNzTmFtZSBpbiBwb2ludGVyc0hhc2gpKSB7XG4gICAgICAgIHBvaW50ZXJzSGFzaFtjbGFzc05hbWVdID0gbmV3IF9zZXQuZGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgcG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0uYWRkKG9iamVjdElkKTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnlQcm9taXNlcyA9ICgwLCBfbWFwLmRlZmF1bHQpKF9jb250ZXh0MiA9ICgwLCBfa2V5cy5kZWZhdWx0KShwb2ludGVyc0hhc2gpKS5jYWxsKF9jb250ZXh0MiwgY2xhc3NOYW1lID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdElkcyA9ICgwLCBfZnJvbS5kZWZhdWx0KShwb2ludGVyc0hhc2hbY2xhc3NOYW1lXSk7XG4gICAgICBjb25zdCBxdWVyeSA9IG5ldyBfUGFyc2VRdWVyeS5kZWZhdWx0KGNsYXNzTmFtZSk7XG4gICAgICBxdWVyeS5saW1pdChvYmplY3RJZHMubGVuZ3RoKTtcbiAgICAgIGlmIChvYmplY3RJZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHF1ZXJ5LmVxdWFsVG8oJ29iamVjdElkJywgb2JqZWN0SWRzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5LmNvbnRhaW5lZEluKCdvYmplY3RJZCcsIG9iamVjdElkcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKDAsIF9maW5kLmRlZmF1bHQpKHF1ZXJ5KS5jYWxsKHF1ZXJ5KTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwocXVlcnlQcm9taXNlcyk7XG4gICAgICBjb25zdCBvYmplY3RzID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoW10pLmFwcGx5KFtdLCByZXNwb25zZXMpO1xuICAgICAgY29uc3QgcGluUHJvbWlzZXMgPSAoMCwgX21hcC5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIG9iamVjdCA9PiB7XG4gICAgICAgIGNvbnN0IG9iamVjdEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbldpdGhOYW1lKG9iamVjdEtleSwgb2JqZWN0Ll90b0Z1bGxKU09OKCkpO1xuICAgICAgfSk7XG4gICAgICBhd2FpdCBfcHJvbWlzZS5kZWZhdWx0LmFsbChwaW5Qcm9taXNlcyk7XG4gICAgICB0aGlzLmlzU3luY2luZyA9IGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzeW5jaW5nIExvY2FsRGF0YXN0b3JlOiAnLCBlcnJvcik7XG4gICAgICB0aGlzLmlzU3luY2luZyA9IGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdCkge1xuICAgIGNvbnN0IG9iamVjdElkID0gb2JqZWN0Lm9iamVjdElkIHx8IG9iamVjdC5fZ2V0SWQoKTtcbiAgICByZXR1cm4gYCR7X0xvY2FsRGF0YXN0b3JlVXRpbHMuT0JKRUNUX1BSRUZJWH0ke29iamVjdC5jbGFzc05hbWV9XyR7b2JqZWN0SWR9YDtcbiAgfSxcbiAgZ2V0UGluTmFtZShwaW5OYW1lKSB7XG4gICAgaWYgKCFwaW5OYW1lIHx8IHBpbk5hbWUgPT09IF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOKSB7XG4gICAgICByZXR1cm4gX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU47XG4gICAgfVxuICAgIHJldHVybiBfTG9jYWxEYXRhc3RvcmVVdGlscy5QSU5fUFJFRklYICsgcGluTmFtZTtcbiAgfSxcbiAgY2hlY2tJZkVuYWJsZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgY29uc29sZS5lcnJvcignUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0VuYWJsZWQ7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IExvY2FsRGF0YXN0b3JlO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gTG9jYWxEYXRhc3RvcmU7XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5kZWZhdWx0KTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldExvY2FsRGF0YXN0b3JlKExvY2FsRGF0YXN0b3JlKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfcmVkdWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9yZWR1Y2VcIikpO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9Mb2NhbERhdGFzdG9yZVV0aWxzID0gcmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVVdGlsc1wiKTtcbnZhciBfU3RvcmFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZVwiKSk7XG5jb25zdCBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jIGZyb21QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgY29uc3QgdmFsdWVzID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMobmFtZSk7XG4gICAgaWYgKCF2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0cyA9IEpTT04ucGFyc2UodmFsdWVzKTtcbiAgICByZXR1cm4gb2JqZWN0cztcbiAgfSxcbiAgcGluV2l0aE5hbWUobmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KSh2YWx1ZSk7XG4gICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQuc2V0SXRlbUFzeW5jKG5hbWUsIHZhbHVlcyk7XG4gIH0sXG4gIHVuUGluV2l0aE5hbWUobmFtZSkge1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnJlbW92ZUl0ZW1Bc3luYyhuYW1lKTtcbiAgfSxcbiAgYXN5bmMgZ2V0QWxsQ29udGVudHMoKSB7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0QWxsS2V5c0FzeW5jKCk7XG4gICAgcmV0dXJuICgwLCBfcmVkdWNlLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywgYXN5bmMgKHByZXZpb3VzUHJvbWlzZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBMRFMgPSBhd2FpdCBwcmV2aW91c1Byb21pc2U7XG4gICAgICBpZiAoKDAsIF9Mb2NhbERhdGFzdG9yZVV0aWxzLmlzTG9jYWxEYXRhc3RvcmVLZXkpKGtleSkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhrZXkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIExEU1trZXldID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0QWxsQ29udGVudHM6ICcsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIExEUztcbiAgICB9LCBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoe30pKTtcbiAgfSxcbiAgLy8gVXNlZCBmb3IgdGVzdGluZ1xuICBhc3luYyBnZXRSYXdTdG9yYWdlKCkge1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIHJldHVybiAoMCwgX3JlZHVjZS5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGFzeW5jIChwcmV2aW91c1Byb21pc2UsIGtleSkgPT4ge1xuICAgICAgY29uc3QgTERTID0gYXdhaXQgcHJldmlvdXNQcm9taXNlO1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhrZXkpO1xuICAgICAgTERTW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiBMRFM7XG4gICAgfSwgX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHt9KSk7XG4gIH0sXG4gIGFzeW5jIGNsZWFyKCkge1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCgwLCBfTG9jYWxEYXRhc3RvcmVVdGlscy5pc0xvY2FsRGF0YXN0b3JlS2V5KShrZXkpKSB7XG4gICAgICAgIHRvUmVtb3ZlLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZXMgPSAoMCwgX21hcC5kZWZhdWx0KSh0b1JlbW92ZSkuY2FsbCh0b1JlbW92ZSwgdGhpcy51blBpbldpdGhOYW1lKTtcbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5hbGwocHJvbWlzZXMpO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlXCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyLmRlZmF1bHRcIikpO1xubGV0IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlciA9IF9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIyLmRlZmF1bHQ7XG5tb2R1bGUuZXhwb3J0cyA9IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlVXRpbHMgPSByZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZVV0aWxzXCIpO1xudmFyIF9TdG9yYWdlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlXCIpKTtcbmNvbnN0IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlciA9IHtcbiAgYXN5bmMgZnJvbVBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5nZXRJdGVtQXN5bmMobmFtZSk7XG4gICAgaWYgKCF2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0cyA9IEpTT04ucGFyc2UodmFsdWVzKTtcbiAgICByZXR1cm4gb2JqZWN0cztcbiAgfSxcbiAgYXN5bmMgcGluV2l0aE5hbWUobmFtZSwgdmFsdWUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWVzID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkodmFsdWUpO1xuICAgICAgYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQuc2V0SXRlbUFzeW5jKG5hbWUsIHZhbHVlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gUXVvdGEgZXhjZWVkZWQsIHBvc3NpYmx5IGR1ZSB0byBTYWZhcmkgUHJpdmF0ZSBCcm93c2luZyBtb2RlXG4gICAgICBjb25zb2xlLmVycm9yKGUubWVzc2FnZSk7XG4gICAgfVxuICB9LFxuICB1blBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQucmVtb3ZlSXRlbUFzeW5jKG5hbWUpO1xuICB9LFxuICBhc3luYyBnZXRBbGxDb250ZW50cygpIHtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQuZ2V0QWxsS2V5c0FzeW5jKCk7XG4gICAgY29uc3QgYmF0Y2ggPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoKDAsIF9Mb2NhbERhdGFzdG9yZVV0aWxzLmlzTG9jYWxEYXRhc3RvcmVLZXkpKGtleSkpIHtcbiAgICAgICAgYmF0Y2gucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBMRFMgPSB7fTtcbiAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHRzID0gYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQubXVsdGlHZXQoYmF0Y2gpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZXRBbGxDb250ZW50czogJywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocmVzdWx0cykuY2FsbChyZXN1bHRzLCBwYWlyID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhaXI7XG4gICAgICB0cnkge1xuICAgICAgICBMRFNba2V5XSA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgTERTW2tleV0gPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBMRFM7XG4gIH0sXG4gIC8vIFVzZWQgZm9yIHRlc3RpbmdcbiAgYXN5bmMgZ2V0UmF3U3RvcmFnZSgpIHtcbiAgICB2YXIgX2NvbnRleHQ7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB7fTtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQubXVsdGlHZXQoa2V5cyk7XG4gICAgKDAsIF9tYXAuZGVmYXVsdCkoX2NvbnRleHQgPSByZXN1bHRzKS5jYWxsKF9jb250ZXh0LCBwYWlyID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhaXI7XG4gICAgICBzdG9yYWdlW2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3RvcmFnZTtcbiAgfSxcbiAgYXN5bmMgY2xlYXIoKSB7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LmdldEFsbEtleXNBc3luYygpO1xuICAgIGNvbnN0IGJhdGNoID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKCgwLCBfTG9jYWxEYXRhc3RvcmVVdGlscy5pc0xvY2FsRGF0YXN0b3JlS2V5KShrZXkpKSB7XG4gICAgICAgIGJhdGNoLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQubXVsdGlSZW1vdmUoYmF0Y2gpLmNhdGNoKGVycm9yID0+IGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNsZWFyaW5nIGxvY2FsIGRhdGFzdG9yZTogJywgZXJyb3IpKTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlBJTl9QUkVGSVggPSBleHBvcnRzLk9CSkVDVF9QUkVGSVggPSBleHBvcnRzLkRFRkFVTFRfUElOID0gdm9pZCAwO1xuZXhwb3J0cy5pc0xvY2FsRGF0YXN0b3JlS2V5ID0gaXNMb2NhbERhdGFzdG9yZUtleTtcbnZhciBfc3RhcnRzV2l0aCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGhcIikpO1xuY29uc3QgREVGQVVMVF9QSU4gPSBleHBvcnRzLkRFRkFVTFRfUElOID0gJ19kZWZhdWx0JztcbmNvbnN0IFBJTl9QUkVGSVggPSBleHBvcnRzLlBJTl9QUkVGSVggPSAncGFyc2VQaW5fJztcbmNvbnN0IE9CSkVDVF9QUkVGSVggPSBleHBvcnRzLk9CSkVDVF9QUkVGSVggPSAnUGFyc2VfTERTXyc7XG5mdW5jdGlvbiBpc0xvY2FsRGF0YXN0b3JlS2V5KGtleSkge1xuICByZXR1cm4gISEoa2V5ICYmIChrZXkgPT09IERFRkFVTFRfUElOIHx8ICgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCBQSU5fUFJFRklYKSB8fCAoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgT0JKRUNUX1BSRUZJWCkpKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jb21taXRTZXJ2ZXJDaGFuZ2VzID0gY29tbWl0U2VydmVyQ2hhbmdlcztcbmV4cG9ydHMuZGVmYXVsdFN0YXRlID0gZGVmYXVsdFN0YXRlO1xuZXhwb3J0cy5lc3RpbWF0ZUF0dHJpYnV0ZSA9IGVzdGltYXRlQXR0cmlidXRlO1xuZXhwb3J0cy5lc3RpbWF0ZUF0dHJpYnV0ZXMgPSBlc3RpbWF0ZUF0dHJpYnV0ZXM7XG5leHBvcnRzLm1lcmdlRmlyc3RQZW5kaW5nU3RhdGUgPSBtZXJnZUZpcnN0UGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5wb3BQZW5kaW5nU3RhdGUgPSBwb3BQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnB1c2hQZW5kaW5nU3RhdGUgPSBwdXNoUGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5zZXRQZW5kaW5nT3AgPSBzZXRQZW5kaW5nT3A7XG5leHBvcnRzLnNldFNlcnZlckRhdGEgPSBzZXRTZXJ2ZXJEYXRhO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9lbmNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG52YXIgX1Rhc2tRdWV1ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVGFza1F1ZXVlXCIpKTtcbnZhciBfUGFyc2VPcCA9IHJlcXVpcmUoXCIuL1BhcnNlT3BcIik7XG5mdW5jdGlvbiBkZWZhdWx0U3RhdGUoKSB7XG4gIHJldHVybiB7XG4gICAgc2VydmVyRGF0YToge30sXG4gICAgcGVuZGluZ09wczogW3t9XSxcbiAgICBvYmplY3RDYWNoZToge30sXG4gICAgdGFza3M6IG5ldyBfVGFza1F1ZXVlLmRlZmF1bHQoKSxcbiAgICBleGlzdGVkOiBmYWxzZVxuICB9O1xufVxuZnVuY3Rpb24gc2V0U2VydmVyRGF0YShzZXJ2ZXJEYXRhLCBhdHRyaWJ1dGVzKSB7XG4gIGZvciAoY29uc3QgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzW2F0dHJdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgc2VydmVyRGF0YVthdHRyXSA9IGF0dHJpYnV0ZXNbYXR0cl07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBzZXJ2ZXJEYXRhW2F0dHJdO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0UGVuZGluZ09wKHBlbmRpbmdPcHMsIGF0dHIsIG9wKSB7XG4gIGNvbnN0IGxhc3QgPSBwZW5kaW5nT3BzLmxlbmd0aCAtIDE7XG4gIGlmIChvcCkge1xuICAgIHBlbmRpbmdPcHNbbGFzdF1bYXR0cl0gPSBvcDtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgcGVuZGluZ09wc1tsYXN0XVthdHRyXTtcbiAgfVxufVxuZnVuY3Rpb24gcHVzaFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKSB7XG4gIHBlbmRpbmdPcHMucHVzaCh7fSk7XG59XG5mdW5jdGlvbiBwb3BQZW5kaW5nU3RhdGUocGVuZGluZ09wcykge1xuICBjb25zdCBmaXJzdCA9IHBlbmRpbmdPcHMuc2hpZnQoKTtcbiAgaWYgKCFwZW5kaW5nT3BzLmxlbmd0aCkge1xuICAgIHBlbmRpbmdPcHNbMF0gPSB7fTtcbiAgfVxuICByZXR1cm4gZmlyc3Q7XG59XG5mdW5jdGlvbiBtZXJnZUZpcnN0UGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpIHtcbiAgY29uc3QgZmlyc3QgPSBwb3BQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG4gIGNvbnN0IG5leHQgPSBwZW5kaW5nT3BzWzBdO1xuICBmb3IgKGNvbnN0IGF0dHIgaW4gZmlyc3QpIHtcbiAgICBpZiAobmV4dFthdHRyXSAmJiBmaXJzdFthdHRyXSkge1xuICAgICAgY29uc3QgbWVyZ2VkID0gbmV4dFthdHRyXS5tZXJnZVdpdGgoZmlyc3RbYXR0cl0pO1xuICAgICAgaWYgKG1lcmdlZCkge1xuICAgICAgICBuZXh0W2F0dHJdID0gbWVyZ2VkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0W2F0dHJdID0gZmlyc3RbYXR0cl07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlc3RpbWF0ZUF0dHJpYnV0ZShzZXJ2ZXJEYXRhLCBwZW5kaW5nT3BzLCBvYmplY3QsIGF0dHIpIHtcbiAgbGV0IHZhbHVlID0gc2VydmVyRGF0YVthdHRyXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwZW5kaW5nT3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHBlbmRpbmdPcHNbaV1bYXR0cl0pIHtcbiAgICAgIGlmIChwZW5kaW5nT3BzW2ldW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlT3AuUmVsYXRpb25PcCkge1xuICAgICAgICBpZiAob2JqZWN0LmlkKSB7XG4gICAgICAgICAgdmFsdWUgPSBwZW5kaW5nT3BzW2ldW2F0dHJdLmFwcGx5VG8odmFsdWUsIG9iamVjdCwgYXR0cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gcGVuZGluZ09wc1tpXVthdHRyXS5hcHBseVRvKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gZXN0aW1hdGVBdHRyaWJ1dGVzKHNlcnZlckRhdGEsIHBlbmRpbmdPcHMsIG9iamVjdCkge1xuICBjb25zdCBkYXRhID0ge307XG4gIGZvciAodmFyIGF0dHIgaW4gc2VydmVyRGF0YSkge1xuICAgIGRhdGFbYXR0cl0gPSBzZXJ2ZXJEYXRhW2F0dHJdO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZ09wcy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAoYXR0ciBpbiBwZW5kaW5nT3BzW2ldKSB7XG4gICAgICBpZiAocGVuZGluZ09wc1tpXVthdHRyXSBpbnN0YW5jZW9mIF9QYXJzZU9wLlJlbGF0aW9uT3ApIHtcbiAgICAgICAgaWYgKG9iamVjdC5pZCkge1xuICAgICAgICAgIGRhdGFbYXR0cl0gPSBwZW5kaW5nT3BzW2ldW2F0dHJdLmFwcGx5VG8oZGF0YVthdHRyXSwgb2JqZWN0LCBhdHRyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCgwLCBfaW5jbHVkZXMuZGVmYXVsdCkoYXR0cikuY2FsbChhdHRyLCAnLicpKSB7XG4gICAgICAgICAgLy8gc2ltaWxhciB0byBuZXN0ZWRTZXQgZnVuY3Rpb25cbiAgICAgICAgICBjb25zdCBmaWVsZHMgPSBhdHRyLnNwbGl0KCcuJyk7XG4gICAgICAgICAgY29uc3QgbGFzdCA9IGZpZWxkc1tmaWVsZHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgbGV0IG9iamVjdCA9IGRhdGE7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBmaWVsZHNbaV07XG4gICAgICAgICAgICBpZiAoIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXh0S2V5ID0gZmllbGRzW2kgKyAxXTtcbiAgICAgICAgICAgICAgaWYgKCFpc05hTihuZXh0S2V5KSkge1xuICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gW107XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IFsuLi5vYmplY3Rba2V5XV07XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAuLi5vYmplY3Rba2V5XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3RbbGFzdF0gPSBwZW5kaW5nT3BzW2ldW2F0dHJdLmFwcGx5VG8ob2JqZWN0W2xhc3RdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhW2F0dHJdID0gcGVuZGluZ09wc1tpXVthdHRyXS5hcHBseVRvKGRhdGFbYXR0cl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEFsbG93cyBzZXR0aW5nIHByb3BlcnRpZXMvdmFyaWFibGVzIGRlZXAgaW4gYW4gb2JqZWN0LlxuICogQ29udmVydHMgYS5iIGludG8geyBhOiB7IGI6IHZhbHVlIH0gfSBmb3IgZG90IG5vdGF0aW9uIG9uIE9iamVjdHNcbiAqIENvbnZlcnRzIGEuMC5iIGludG8geyBhOiBbeyBiOiB2YWx1ZSB9XSB9IGZvciBkb3Qgbm90YXRpb24gb24gQXJyYXlzXG4gKlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGFzc2lnbiB0aGUgdmFsdWUgdG9cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBhc3NpZ24uIElmIGl0J3MgaW4gYSBkZWVwZXIgcGF0aCwgdGhlbiB1c2UgZG90IG5vdGF0aW9uIChgcHJvcDEucHJvcDIucHJvcDNgKVxuICogTm90ZSB0aGF0IGludGVybWVkaWF0ZSBvYmplY3QocykgaW4gdGhlIG5lc3RlZCBwYXRoIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaWYgdGhleSBkb24ndCBleGlzdC5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLiBJZiBpdCdzIGFuIGB1bmRlZmluZWRgIHRoZW4gdGhlIGtleSBpcyBkZWxldGVkLlxuICovXG5mdW5jdGlvbiBuZXN0ZWRTZXQob2JqLCBrZXksIHZhbHVlKSB7XG4gIGNvbnN0IHBhdGhzID0ga2V5LnNwbGl0KCcuJyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgcGF0aCA9IHBhdGhzW2ldO1xuICAgIGlmICghKHBhdGggaW4gb2JqKSkge1xuICAgICAgY29uc3QgbmV4dFBhdGggPSBwYXRoc1tpICsgMV07XG4gICAgICBpZiAoIWlzTmFOKG5leHRQYXRoKSkge1xuICAgICAgICBvYmpbcGF0aF0gPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtwYXRoXSA9IHt9O1xuICAgICAgfVxuICAgIH1cbiAgICBvYmogPSBvYmpbcGF0aF07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkZWxldGUgb2JqW3BhdGhzW3BhdGhzLmxlbmd0aCAtIDFdXTtcbiAgfSBlbHNlIHtcbiAgICBvYmpbcGF0aHNbcGF0aHMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNvbW1pdFNlcnZlckNoYW5nZXMoc2VydmVyRGF0YSwgb2JqZWN0Q2FjaGUsIGNoYW5nZXMpIHtcbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBmb3IgKGNvbnN0IGF0dHIgaW4gY2hhbmdlcykge1xuICAgIGNvbnN0IHZhbCA9IGNoYW5nZXNbYXR0cl07XG4gICAgbmVzdGVkU2V0KHNlcnZlckRhdGEsIGF0dHIsIHZhbCk7XG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhKHZhbCBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSAmJiAhKHZhbCBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCkgJiYgISh2YWwgaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSkge1xuICAgICAgY29uc3QganNvbiA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHZhbCwgZmFsc2UsIHRydWUpO1xuICAgICAgb2JqZWN0Q2FjaGVbYXR0cl0gPSAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShqc29uKTtcbiAgICB9XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfZmlsdGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maWx0ZXJcIikpO1xudmFyIF9zbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc2xpY2VcIikpO1xudmFyIF9pc0ludGVnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL251bWJlci9pcy1pbnRlZ2VyXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfZXF1YWxzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lcXVhbHNcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZVBvbHlnb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUG9seWdvblwiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xuLyoqXG4gKiBjb250YWlucyAtLSBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBjb250YWluZWQgaW4gYSBsaXN0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgUGFyc2UgcG9pbnRlcnMuXG4gKlxuICogQHBhcmFtIGhheXN0YWNrXG4gKiBAcGFyYW0gbmVlZGxlXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zKGhheXN0YWNrLCBuZWVkbGUpIHtcbiAgaWYgKG5lZWRsZSAmJiBuZWVkbGUuX190eXBlICYmIChuZWVkbGUuX190eXBlID09PSAnUG9pbnRlcicgfHwgbmVlZGxlLl9fdHlwZSA9PT0gJ09iamVjdCcpKSB7XG4gICAgZm9yIChjb25zdCBpIGluIGhheXN0YWNrKSB7XG4gICAgICBjb25zdCBwdHIgPSBoYXlzdGFja1tpXTtcbiAgICAgIGlmICh0eXBlb2YgcHRyID09PSAnc3RyaW5nJyAmJiBwdHIgPT09IG5lZWRsZS5vYmplY3RJZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwdHIuY2xhc3NOYW1lID09PSBuZWVkbGUuY2xhc3NOYW1lICYmIHB0ci5vYmplY3RJZCA9PT0gbmVlZGxlLm9iamVjdElkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShuZWVkbGUpKSB7XG4gICAgZm9yIChjb25zdCBuZWVkIG9mIG5lZWRsZSkge1xuICAgICAgaWYgKGNvbnRhaW5zKGhheXN0YWNrLCBuZWVkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuICgwLCBfaW5kZXhPZi5kZWZhdWx0KShoYXlzdGFjaykuY2FsbChoYXlzdGFjaywgbmVlZGxlKSA+IC0xO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtT2JqZWN0KG9iamVjdCkge1xuICBpZiAob2JqZWN0Ll90b0Z1bGxKU09OKSB7XG4gICAgcmV0dXJuIG9iamVjdC5fdG9GdWxsSlNPTigpO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbi8qKlxuICogbWF0Y2hlc1F1ZXJ5IC0tIERldGVybWluZXMgaWYgYW4gb2JqZWN0IHdvdWxkIGJlIHJldHVybmVkIGJ5IGEgUGFyc2UgUXVlcnlcbiAqIEl0J3MgYSBsaWdodHdlaWdodCwgd2hlcmUtY2xhdXNlIG9ubHkgaW1wbGVtZW50YXRpb24gb2YgYSBmdWxsIHF1ZXJ5IGVuZ2luZS5cbiAqIFNpbmNlIHdlIGZpbmQgcXVlcmllcyB0aGF0IG1hdGNoIG9iamVjdHMsIHJhdGhlciB0aGFuIG9iamVjdHMgdGhhdCBtYXRjaFxuICogcXVlcmllcywgd2UgY2FuIGF2b2lkIGJ1aWxkaW5nIGEgZnVsbC1ibG93biBxdWVyeSB0b29sLlxuICpcbiAqIEBwYXJhbSBjbGFzc05hbWVcbiAqIEBwYXJhbSBvYmplY3RcbiAqIEBwYXJhbSBvYmplY3RzXG4gKiBAcGFyYW0gcXVlcnlcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1F1ZXJ5KGNsYXNzTmFtZSwgb2JqZWN0LCBvYmplY3RzLCBxdWVyeSkge1xuICBpZiAob2JqZWN0LmNsYXNzTmFtZSAhPT0gY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGxldCBvYmogPSBvYmplY3Q7XG4gIGxldCBxID0gcXVlcnk7XG4gIGlmIChvYmplY3QudG9KU09OKSB7XG4gICAgb2JqID0gb2JqZWN0LnRvSlNPTigpO1xuICB9XG4gIGlmIChxdWVyeS50b0pTT04pIHtcbiAgICBxID0gcXVlcnkudG9KU09OKCkud2hlcmU7XG4gIH1cbiAgb2JqLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgZm9yIChjb25zdCBmaWVsZCBpbiBxKSB7XG4gICAgaWYgKCFtYXRjaGVzS2V5Q29uc3RyYWludHMoY2xhc3NOYW1lLCBvYmosIG9iamVjdHMsIGZpZWxkLCBxW2ZpZWxkXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBlcXVhbE9iamVjdHNHZW5lcmljKG9iaiwgY29tcGFyZVRvLCBlcWxGbikge1xuICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9iaikpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGVxbEZuKG9ialtpXSwgY29tcGFyZVRvKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBlcWxGbihvYmosIGNvbXBhcmVUbyk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgUmVsYXRpdmVUaW1lVG9EYXRlUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RhdHVzIFRoZSBjb252ZXJzaW9uIHN0YXR1cywgYGVycm9yYCBpZiBjb252ZXJzaW9uIGZhaWxlZCBvclxuICogYHN1Y2Nlc3NgIGlmIGNvbnZlcnNpb24gc3VjY2VlZGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGluZm8gVGhlIGVycm9yIG1lc3NhZ2UgaWYgY29udmVyc2lvbiBmYWlsZWQsIG9yIHRoZSByZWxhdGl2ZVxuICogdGltZSBpbmRpY2F0aW9uIChgcGFzdGAsIGBwcmVzZW50YCwgYGZ1dHVyZWApIGlmIGNvbnZlcnNpb24gc3VjY2VlZGVkLlxuICogQHByb3BlcnR5IHtEYXRlfHVuZGVmaW5lZH0gcmVzdWx0IFRoZSBjb252ZXJ0ZWQgZGF0ZSwgb3IgYHVuZGVmaW5lZGAgaWYgY29udmVyc2lvblxuICogZmFpbGVkLlxuICovXG4vKipcbiAqIENvbnZlcnRzIGh1bWFuIHJlYWRhYmxlIHJlbGF0aXZlIGRhdGUgc3RyaW5nLCBmb3IgZXhhbXBsZSwgJ2luIDEwIGRheXMnIHRvIGEgZGF0ZVxuICogcmVsYXRpdmUgdG8gbm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRoZSB0ZXh0IHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0ge0RhdGV9IFtub3ddIFRoZSBkYXRlIGZyb20gd2hpY2ggYWRkIG9yIHN1YnRyYWN0LiBEZWZhdWx0IGlzIG5vdy5cbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWVUb0RhdGVSZXN1bHR9XG4gKi9cbmZ1bmN0aW9uIHJlbGF0aXZlVGltZVRvRGF0ZSh0ZXh0KSB7XG4gIGxldCBub3cgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG5ldyBEYXRlKCk7XG4gIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGxldCBwYXJ0cyA9IHRleHQuc3BsaXQoJyAnKTtcblxuICAvLyBGaWx0ZXIgb3V0IHdoaXRlc3BhY2VcbiAgcGFydHMgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShwYXJ0cykuY2FsbChwYXJ0cywgcGFydCA9PiBwYXJ0ICE9PSAnJyk7XG4gIGNvbnN0IGZ1dHVyZSA9IHBhcnRzWzBdID09PSAnaW4nO1xuICBjb25zdCBwYXN0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPT09ICdhZ28nO1xuICBpZiAoIWZ1dHVyZSAmJiAhcGFzdCAmJiB0ZXh0ICE9PSAnbm93Jykge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBpbmZvOiBcIlRpbWUgc2hvdWxkIGVpdGhlciBzdGFydCB3aXRoICdpbicgb3IgZW5kIHdpdGggJ2FnbydcIlxuICAgIH07XG4gIH1cbiAgaWYgKGZ1dHVyZSAmJiBwYXN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIGluZm86IFwiVGltZSBjYW5ub3QgaGF2ZSBib3RoICdpbicgYW5kICdhZ28nXCJcbiAgICB9O1xuICB9XG5cbiAgLy8gc3RyaXAgdGhlICdhZ28nIG9yICdpbidcbiAgaWYgKGZ1dHVyZSkge1xuICAgIHBhcnRzID0gKDAsIF9zbGljZS5kZWZhdWx0KShwYXJ0cykuY2FsbChwYXJ0cywgMSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcGFzdFxuICAgIHBhcnRzID0gKDAsIF9zbGljZS5kZWZhdWx0KShwYXJ0cykuY2FsbChwYXJ0cywgMCwgcGFydHMubGVuZ3RoIC0gMSk7XG4gIH1cbiAgaWYgKHBhcnRzLmxlbmd0aCAlIDIgIT09IDAgJiYgdGV4dCAhPT0gJ25vdycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgaW5mbzogJ0ludmFsaWQgdGltZSBzdHJpbmcuIERhbmdsaW5nIHVuaXQgb3IgbnVtYmVyLidcbiAgICB9O1xuICB9XG4gIGNvbnN0IHBhaXJzID0gW107XG4gIHdoaWxlIChwYXJ0cy5sZW5ndGgpIHtcbiAgICBwYWlycy5wdXNoKFtwYXJ0cy5zaGlmdCgpLCBwYXJ0cy5zaGlmdCgpXSk7XG4gIH1cbiAgbGV0IHNlY29uZHMgPSAwO1xuICBmb3IgKGNvbnN0IFtudW0sIGludGVydmFsXSBvZiBwYWlycykge1xuICAgIGNvbnN0IHZhbCA9IE51bWJlcihudW0pO1xuICAgIGlmICghKDAsIF9pc0ludGVnZXIuZGVmYXVsdCkodmFsKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICBpbmZvOiBgJyR7bnVtfScgaXMgbm90IGFuIGludGVnZXIuYFxuICAgICAgfTtcbiAgICB9XG4gICAgc3dpdGNoIChpbnRlcnZhbCkge1xuICAgICAgY2FzZSAneXInOlxuICAgICAgY2FzZSAneXJzJzpcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICBzZWNvbmRzICs9IHZhbCAqIDMxNTM2MDAwOyAvLyAzNjUgKiAyNCAqIDYwICogNjBcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3ayc6XG4gICAgICBjYXNlICd3a3MnOlxuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgIHNlY29uZHMgKz0gdmFsICogNjA0ODAwOyAvLyA3ICogMjQgKiA2MCAqIDYwXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZCc6XG4gICAgICBjYXNlICdkYXknOlxuICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIHNlY29uZHMgKz0gdmFsICogODY0MDA7IC8vIDI0ICogNjAgKiA2MFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ2hycyc6XG4gICAgICBjYXNlICdob3VyJzpcbiAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgc2Vjb25kcyArPSB2YWwgKiAzNjAwOyAvLyA2MCAqIDYwXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWluJzpcbiAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBzZWNvbmRzICs9IHZhbCAqIDYwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlYyc6XG4gICAgICBjYXNlICdzZWNzJzpcbiAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgc2Vjb25kcyArPSB2YWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgaW5mbzogYEludmFsaWQgaW50ZXJ2YWw6ICcke2ludGVydmFsfSdgXG4gICAgICAgIH07XG4gICAgfVxuICB9XG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IHNlY29uZHMgKiAxMDAwO1xuICBpZiAoZnV0dXJlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgaW5mbzogJ2Z1dHVyZScsXG4gICAgICByZXN1bHQ6IG5ldyBEYXRlKG5vdy52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMpXG4gICAgfTtcbiAgfSBlbHNlIGlmIChwYXN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgaW5mbzogJ3Bhc3QnLFxuICAgICAgcmVzdWx0OiBuZXcgRGF0ZShub3cudmFsdWVPZigpIC0gbWlsbGlzZWNvbmRzKVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgaW5mbzogJ3ByZXNlbnQnLFxuICAgICAgcmVzdWx0OiBuZXcgRGF0ZShub3cudmFsdWVPZigpKVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gb2JqZWN0IG1hdGNoZXMgYSBzaW5nbGUga2V5J3MgY29uc3RyYWludHNcbiAqXG4gKiBAcGFyYW0gY2xhc3NOYW1lXG4gKiBAcGFyYW0gb2JqZWN0XG4gKiBAcGFyYW0gb2JqZWN0c1xuICogQHBhcmFtIGtleVxuICogQHBhcmFtIGNvbnN0cmFpbnRzXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNLZXlDb25zdHJhaW50cyhjbGFzc05hbWUsIG9iamVjdCwgb2JqZWN0cywga2V5LCBjb25zdHJhaW50cykge1xuICBpZiAoY29uc3RyYWludHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCAnLicpID49IDApIHtcbiAgICAvLyBLZXkgcmVmZXJlbmNlcyBhIHN1Ym9iamVjdFxuICAgIGNvbnN0IGtleUNvbXBvbmVudHMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICBjb25zdCBzdWJPYmplY3RLZXkgPSBrZXlDb21wb25lbnRzWzBdO1xuICAgIGNvbnN0IGtleVJlbWFpbmRlciA9ICgwLCBfc2xpY2UuZGVmYXVsdCkoa2V5Q29tcG9uZW50cykuY2FsbChrZXlDb21wb25lbnRzLCAxKS5qb2luKCcuJyk7XG4gICAgcmV0dXJuIG1hdGNoZXNLZXlDb25zdHJhaW50cyhjbGFzc05hbWUsIG9iamVjdFtzdWJPYmplY3RLZXldIHx8IHt9LCBvYmplY3RzLCBrZXlSZW1haW5kZXIsIGNvbnN0cmFpbnRzKTtcbiAgfVxuICBsZXQgaTtcbiAgaWYgKGtleSA9PT0gJyRvcicpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChtYXRjaGVzUXVlcnkoY2xhc3NOYW1lLCBvYmplY3QsIG9iamVjdHMsIGNvbnN0cmFpbnRzW2ldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09ICckYW5kJykge1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFtYXRjaGVzUXVlcnkoY2xhc3NOYW1lLCBvYmplY3QsIG9iamVjdHMsIGNvbnN0cmFpbnRzW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChrZXkgPT09ICckbm9yJykge1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG1hdGNoZXNRdWVyeShjbGFzc05hbWUsIG9iamVjdCwgb2JqZWN0cywgY29uc3RyYWludHNbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGtleSA9PT0gJyRyZWxhdGVkVG8nKSB7XG4gICAgLy8gQmFpbCEgV2UgY2FuJ3QgaGFuZGxlIHJlbGF0aW9uYWwgcXVlcmllcyBsb2NhbGx5XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghL15bQS1aYS16XVswLTlBLVphLXpfXSokLy50ZXN0KGtleSkpIHtcbiAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfS0VZX05BTUUsIGBJbnZhbGlkIEtleTogJHtrZXl9YCk7XG4gIH1cbiAgLy8gRXF1YWxpdHkgKG9yIEFycmF5IGNvbnRhaW5zKSBjYXNlc1xuICBpZiAodHlwZW9mIGNvbnN0cmFpbnRzICE9PSAnb2JqZWN0Jykge1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkob2JqZWN0W2tleV0pKSB7XG4gICAgICB2YXIgX2NvbnRleHQ7XG4gICAgICByZXR1cm4gKDAsIF9pbmRleE9mLmRlZmF1bHQpKF9jb250ZXh0ID0gb2JqZWN0W2tleV0pLmNhbGwoX2NvbnRleHQsIGNvbnN0cmFpbnRzKSA+IC0xO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IGNvbnN0cmFpbnRzO1xuICB9XG4gIGxldCBjb21wYXJlVG87XG4gIGlmIChjb25zdHJhaW50cy5fX3R5cGUpIHtcbiAgICBpZiAoY29uc3RyYWludHMuX190eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgIHJldHVybiBlcXVhbE9iamVjdHNHZW5lcmljKG9iamVjdFtrZXldLCBjb25zdHJhaW50cywgZnVuY3Rpb24gKG9iaiwgcHRyKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygb2JqICE9PSAndW5kZWZpbmVkJyAmJiBwdHIuY2xhc3NOYW1lID09PSBvYmouY2xhc3NOYW1lICYmIHB0ci5vYmplY3RJZCA9PT0gb2JqLm9iamVjdElkO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBlcXVhbE9iamVjdHNHZW5lcmljKCgwLCBfZGVjb2RlLmRlZmF1bHQpKG9iamVjdFtrZXldKSwgKDAsIF9kZWNvZGUuZGVmYXVsdCkoY29uc3RyYWludHMpLCBfZXF1YWxzLmRlZmF1bHQpO1xuICB9XG4gIC8vIE1vcmUgY29tcGxleCBjYXNlc1xuICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBpbiBjb25zdHJhaW50cykge1xuICAgIGNvbXBhcmVUbyA9IGNvbnN0cmFpbnRzW2NvbmRpdGlvbl07XG4gICAgaWYgKGNvbXBhcmVUbz8uX190eXBlKSB7XG4gICAgICBjb21wYXJlVG8gPSAoMCwgX2RlY29kZS5kZWZhdWx0KShjb21wYXJlVG8pO1xuICAgIH1cbiAgICAvLyBpcyBpdCBhICRyZWxhdGl2ZVRpbWU/IGNvbnZlcnQgdG8gZGF0ZVxuICAgIGlmIChjb21wYXJlVG8/LlsnJHJlbGF0aXZlVGltZSddKSB7XG4gICAgICBjb25zdCBwYXJzZXJSZXN1bHQgPSByZWxhdGl2ZVRpbWVUb0RhdGUoY29tcGFyZVRvWyckcmVsYXRpdmVUaW1lJ10pO1xuICAgICAgaWYgKHBhcnNlclJlc3VsdC5zdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfSlNPTiwgYGJhZCAkcmVsYXRpdmVUaW1lICgke2tleX0pIHZhbHVlLiAke3BhcnNlclJlc3VsdC5pbmZvfWApO1xuICAgICAgfVxuICAgICAgY29tcGFyZVRvID0gcGFyc2VyUmVzdWx0LnJlc3VsdDtcbiAgICB9XG4gICAgLy8gQ29tcGFyZSBEYXRlIE9iamVjdCBvciBEYXRlIFN0cmluZ1xuICAgIGlmICh0b1N0cmluZy5jYWxsKGNvbXBhcmVUbykgPT09ICdbb2JqZWN0IERhdGVdJyB8fCB0eXBlb2YgY29tcGFyZVRvID09PSAnc3RyaW5nJyAmJlxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBuZXcgRGF0ZShjb21wYXJlVG8pICE9PSAnSW52YWxpZCBEYXRlJyAmJlxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICAhaXNOYU4obmV3IERhdGUoY29tcGFyZVRvKSkpIHtcbiAgICAgIG9iamVjdFtrZXldID0gbmV3IERhdGUob2JqZWN0W2tleV0uaXNvID8gb2JqZWN0W2tleV0uaXNvIDogb2JqZWN0W2tleV0pO1xuICAgIH1cbiAgICBzd2l0Y2ggKGNvbmRpdGlvbikge1xuICAgICAgY2FzZSAnJGx0JzpcbiAgICAgICAgaWYgKG9iamVjdFtrZXldID49IGNvbXBhcmVUbykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRsdGUnOlxuICAgICAgICBpZiAob2JqZWN0W2tleV0gPiBjb21wYXJlVG8pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckZ3QnOlxuICAgICAgICBpZiAob2JqZWN0W2tleV0gPD0gY29tcGFyZVRvKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGd0ZSc6XG4gICAgICAgIGlmIChvYmplY3Rba2V5XSA8IGNvbXBhcmVUbykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRuZSc6XG4gICAgICAgIGlmICgoMCwgX2VxdWFscy5kZWZhdWx0KShvYmplY3Rba2V5XSwgY29tcGFyZVRvKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRpbic6XG4gICAgICAgIGlmICghY29udGFpbnMoY29tcGFyZVRvLCBvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckbmluJzpcbiAgICAgICAgaWYgKGNvbnRhaW5zKGNvbXBhcmVUbywgb2JqZWN0W2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGFsbCc6XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wYXJlVG8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgX2NvbnRleHQyO1xuICAgICAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoX2NvbnRleHQyID0gb2JqZWN0W2tleV0pLmNhbGwoX2NvbnRleHQyLCBjb21wYXJlVG9baV0pIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRleGlzdHMnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlFeGlzdHMgPSB0eXBlb2Ygb2JqZWN0W2tleV0gIT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgIGNvbnN0IGV4aXN0ZW5jZUlzUmVxdWlyZWQgPSBjb25zdHJhaW50c1snJGV4aXN0cyddO1xuICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RyYWludHNbJyRleGlzdHMnXSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAvLyBUaGUgU0RLIHdpbGwgbmV2ZXIgc3VibWl0IGEgbm9uLWJvb2xlYW4gZm9yICRleGlzdHMsIGJ1dCBpZiBzb21lb25lXG4gICAgICAgICAgICAvLyB0cmllcyB0byBzdWJtaXQgYSBub24tYm9vbGVhbiBmb3IgJGV4aXRzIG91dHNpZGUgdGhlIFNES3MsIGp1c3QgaWdub3JlIGl0LlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcHJvcGVydHlFeGlzdHMgJiYgZXhpc3RlbmNlSXNSZXF1aXJlZCB8fCBwcm9wZXJ0eUV4aXN0cyAmJiAhZXhpc3RlbmNlSXNSZXF1aXJlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJHJlZ2V4JzpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29tcGFyZVRvID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVUby50ZXN0KG9iamVjdFtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSlMgZG9lc24ndCBzdXBwb3J0IHBlcmwtc3R5bGUgZXNjYXBpbmdcbiAgICAgICAgICBsZXQgZXhwU3RyaW5nID0gJyc7XG4gICAgICAgICAgbGV0IGVzY2FwZUVuZCA9IC0yO1xuICAgICAgICAgIGxldCBlc2NhcGVTdGFydCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShjb21wYXJlVG8pLmNhbGwoY29tcGFyZVRvLCAnXFxcXFEnKTtcbiAgICAgICAgICB3aGlsZSAoZXNjYXBlU3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSB1bmVzY2FwZWQgcG9ydGlvblxuICAgICAgICAgICAgZXhwU3RyaW5nICs9IGNvbXBhcmVUby5zdWJzdHJpbmcoZXNjYXBlRW5kICsgMiwgZXNjYXBlU3RhcnQpO1xuICAgICAgICAgICAgZXNjYXBlRW5kID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKGNvbXBhcmVUbykuY2FsbChjb21wYXJlVG8sICdcXFxcRScsIGVzY2FwZVN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChlc2NhcGVFbmQgPiAtMSkge1xuICAgICAgICAgICAgICBleHBTdHJpbmcgKz0gY29tcGFyZVRvLnN1YnN0cmluZyhlc2NhcGVTdGFydCArIDIsIGVzY2FwZUVuZCkucmVwbGFjZSgvXFxcXFxcXFxcXFxcXFxcXEUvZywgJ1xcXFxFJykucmVwbGFjZSgvXFxXL2csICdcXFxcJCYnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVzY2FwZVN0YXJ0ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKGNvbXBhcmVUbykuY2FsbChjb21wYXJlVG8sICdcXFxcUScsIGVzY2FwZUVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4cFN0cmluZyArPSBjb21wYXJlVG8uc3Vic3RyaW5nKE1hdGgubWF4KGVzY2FwZVN0YXJ0LCBlc2NhcGVFbmQgKyAyKSk7XG4gICAgICAgICAgbGV0IG1vZGlmaWVycyA9IGNvbnN0cmFpbnRzLiRvcHRpb25zIHx8ICcnO1xuICAgICAgICAgIG1vZGlmaWVycyA9IG1vZGlmaWVycy5yZXBsYWNlKCd4JywgJycpLnJlcGxhY2UoJ3MnLCAnJyk7XG4gICAgICAgICAgLy8gUGFyc2UgU2VydmVyIC8gTW9uZ28gc3VwcG9ydCB4IGFuZCBzIG1vZGlmaWVycyBidXQgSlMgUmVnRXhwIGRvZXNuJ3RcbiAgICAgICAgICBjb25zdCBleHAgPSBuZXcgUmVnRXhwKGV4cFN0cmluZywgbW9kaWZpZXJzKTtcbiAgICAgICAgICBpZiAoIWV4cC50ZXN0KG9iamVjdFtrZXldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJG5lYXJTcGhlcmUnOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCFjb21wYXJlVG8gfHwgIW9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gY29tcGFyZVRvLnJhZGlhbnNUbyhvYmplY3Rba2V5XSk7XG4gICAgICAgICAgY29uc3QgbWF4ID0gY29uc3RyYWludHMuJG1heERpc3RhbmNlIHx8IEluZmluaXR5O1xuICAgICAgICAgIHJldHVybiBkaXN0YW5jZSA8PSBtYXg7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyR3aXRoaW4nOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCFjb21wYXJlVG8gfHwgIW9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNvdXRoV2VzdCA9IGNvbXBhcmVUby4kYm94WzBdO1xuICAgICAgICAgIGNvbnN0IG5vcnRoRWFzdCA9IGNvbXBhcmVUby4kYm94WzFdO1xuICAgICAgICAgIGlmIChzb3V0aFdlc3QubGF0aXR1ZGUgPiBub3J0aEVhc3QubGF0aXR1ZGUgfHwgc291dGhXZXN0LmxvbmdpdHVkZSA+IG5vcnRoRWFzdC5sb25naXR1ZGUpIHtcbiAgICAgICAgICAgIC8vIEludmFsaWQgYm94LCBjcm9zc2VzIHRoZSBkYXRlIGxpbmVcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldLmxhdGl0dWRlID4gc291dGhXZXN0LmxhdGl0dWRlICYmIG9iamVjdFtrZXldLmxhdGl0dWRlIDwgbm9ydGhFYXN0LmxhdGl0dWRlICYmIG9iamVjdFtrZXldLmxvbmdpdHVkZSA+IHNvdXRoV2VzdC5sb25naXR1ZGUgJiYgb2JqZWN0W2tleV0ubG9uZ2l0dWRlIDwgbm9ydGhFYXN0LmxvbmdpdHVkZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJG9wdGlvbnMnOlxuICAgICAgICAvLyBOb3QgYSBxdWVyeSB0eXBlLCBidXQgYSB3YXkgdG8gYWRkIG9wdGlvbnMgdG8gJHJlZ2V4LiBJZ25vcmUgYW5kXG4gICAgICAgIC8vIGF2b2lkIHRoZSBkZWZhdWx0XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJG1heERpc3RhbmNlJzpcbiAgICAgICAgLy8gTm90IGEgcXVlcnkgdHlwZSwgYnV0IGEgd2F5IHRvIGFkZCBhIGNhcCB0byAkbmVhclNwaGVyZS4gSWdub3JlIGFuZFxuICAgICAgICAvLyBhdm9pZCB0aGUgZGVmYXVsdFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRzZWxlY3QnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qgc3ViUXVlcnlPYmplY3RzID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCAob2JqLCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1F1ZXJ5KGNvbXBhcmVUby5xdWVyeS5jbGFzc05hbWUsIG9iaiwgYXJyLCBjb21wYXJlVG8ucXVlcnkud2hlcmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUXVlcnlPYmplY3RzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJPYmplY3QgPSB0cmFuc2Zvcm1PYmplY3Qoc3ViUXVlcnlPYmplY3RzW2ldKTtcbiAgICAgICAgICAgIHJldHVybiAoMCwgX2VxdWFscy5kZWZhdWx0KShvYmplY3Rba2V5XSwgc3ViT2JqZWN0W2NvbXBhcmVUby5rZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICBjYXNlICckZG9udFNlbGVjdCc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBzdWJRdWVyeU9iamVjdHMgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIChvYmosIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzUXVlcnkoY29tcGFyZVRvLnF1ZXJ5LmNsYXNzTmFtZSwgb2JqLCBhcnIsIGNvbXBhcmVUby5xdWVyeS53aGVyZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJRdWVyeU9iamVjdHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Yk9iamVjdCA9IHRyYW5zZm9ybU9iamVjdChzdWJRdWVyeU9iamVjdHNbaV0pO1xuICAgICAgICAgICAgcmV0dXJuICEoMCwgX2VxdWFscy5kZWZhdWx0KShvYmplY3Rba2V5XSwgc3ViT2JqZWN0W2NvbXBhcmVUby5rZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICBjYXNlICckaW5RdWVyeSc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBzdWJRdWVyeU9iamVjdHMgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIChvYmosIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzUXVlcnkoY29tcGFyZVRvLmNsYXNzTmFtZSwgb2JqLCBhcnIsIGNvbXBhcmVUby53aGVyZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJRdWVyeU9iamVjdHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Yk9iamVjdCA9IHRyYW5zZm9ybU9iamVjdChzdWJRdWVyeU9iamVjdHNbaV0pO1xuICAgICAgICAgICAgaWYgKG9iamVjdFtrZXldLmNsYXNzTmFtZSA9PT0gc3ViT2JqZWN0LmNsYXNzTmFtZSAmJiBvYmplY3Rba2V5XS5vYmplY3RJZCA9PT0gc3ViT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRub3RJblF1ZXJ5JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHN1YlF1ZXJ5T2JqZWN0cyA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgKG9iaiwgaW5kZXgsIGFycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNRdWVyeShjb21wYXJlVG8uY2xhc3NOYW1lLCBvYmosIGFyciwgY29tcGFyZVRvLndoZXJlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YlF1ZXJ5T2JqZWN0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViT2JqZWN0ID0gdHJhbnNmb3JtT2JqZWN0KHN1YlF1ZXJ5T2JqZWN0c1tpXSk7XG4gICAgICAgICAgICBpZiAob2JqZWN0W2tleV0uY2xhc3NOYW1lID09PSBzdWJPYmplY3QuY2xhc3NOYW1lICYmIG9iamVjdFtrZXldLm9iamVjdElkID09PSBzdWJPYmplY3Qub2JqZWN0SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJGNvbnRhaW5lZEJ5JzpcbiAgICAgICAge1xuICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqZWN0W2tleV0pIHtcbiAgICAgICAgICAgIGlmICghY29udGFpbnMoY29tcGFyZVRvLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJGdlb1dpdGhpbic6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoY29tcGFyZVRvLiRwb2x5Z29uKSB7XG4gICAgICAgICAgICB2YXIgX2NvbnRleHQzO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRzID0gKDAsIF9tYXAuZGVmYXVsdCkoX2NvbnRleHQzID0gY29tcGFyZVRvLiRwb2x5Z29uKS5jYWxsKF9jb250ZXh0MywgZ2VvUG9pbnQgPT4gW2dlb1BvaW50LmxhdGl0dWRlLCBnZW9Qb2ludC5sb25naXR1ZGVdKTtcbiAgICAgICAgICAgIGNvbnN0IHBvbHlnb24gPSBuZXcgX1BhcnNlUG9seWdvbi5kZWZhdWx0KHBvaW50cyk7XG4gICAgICAgICAgICByZXR1cm4gcG9seWdvbi5jb250YWluc1BvaW50KG9iamVjdFtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbXBhcmVUby4kY2VudGVyU3BoZXJlKSB7XG4gICAgICAgICAgICBjb25zdCBbV0dTODRQb2ludCwgbWF4RGlzdGFuY2VdID0gY29tcGFyZVRvLiRjZW50ZXJTcGhlcmU7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXJQb2ludCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KHtcbiAgICAgICAgICAgICAgbGF0aXR1ZGU6IFdHUzg0UG9pbnRbMV0sXG4gICAgICAgICAgICAgIGxvbmdpdHVkZTogV0dTODRQb2ludFswXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KG9iamVjdFtrZXldKTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gcG9pbnQucmFkaWFuc1RvKGNlbnRlclBvaW50KTtcbiAgICAgICAgICAgIHJldHVybiBkaXN0YW5jZSA8PSBtYXhEaXN0YW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICBjYXNlICckZ2VvSW50ZXJzZWN0cyc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBwb2x5Z29uID0gbmV3IF9QYXJzZVBvbHlnb24uZGVmYXVsdChvYmplY3Rba2V5XS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgY29uc3QgcG9pbnQgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdChjb21wYXJlVG8uJHBvaW50KTtcbiAgICAgICAgICByZXR1cm4gcG9seWdvbi5jb250YWluc1BvaW50KHBvaW50KTtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUXVlcnkocXVlcnkpIHtcbiAgdmFyIF9jb250ZXh0NDtcbiAgbGV0IHEgPSBxdWVyeTtcbiAgaWYgKHF1ZXJ5LnRvSlNPTikge1xuICAgIHEgPSBxdWVyeS50b0pTT04oKS53aGVyZTtcbiAgfVxuICBjb25zdCBzcGVjaWFsUXVlcnlrZXlzID0gWyckYW5kJywgJyRvcicsICckbm9yJywgJ19ycGVybScsICdfd3Blcm0nLCAnX3BlcmlzaGFibGVfdG9rZW4nLCAnX2VtYWlsX3ZlcmlmeV90b2tlbicsICdfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQnLCAnX2FjY291bnRfbG9ja291dF9leHBpcmVzX2F0JywgJ19mYWlsZWRfbG9naW5fY291bnQnXTtcbiAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NCA9ICgwLCBfa2V5cy5kZWZhdWx0KShxKSkuY2FsbChfY29udGV4dDQsIGtleSA9PiB7XG4gICAgaWYgKHEgJiYgcVtrZXldICYmIHFba2V5XS4kcmVnZXgpIHtcbiAgICAgIGlmICh0eXBlb2YgcVtrZXldLiRvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIXFba2V5XS4kb3B0aW9ucy5tYXRjaCgvXltpbXhzXSskLykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfUVVFUlksIGBCYWQgJG9wdGlvbnMgdmFsdWUgZm9yIHF1ZXJ5OiAke3Fba2V5XS4kb3B0aW9uc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHNwZWNpYWxRdWVyeWtleXMpLmNhbGwoc3BlY2lhbFF1ZXJ5a2V5cywga2V5KSA8IDAgJiYgIWtleS5tYXRjaCgvXlthLXpBLVpdW2EtekEtWjAtOV9cXC5dKiQvKSkge1xuICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0tFWV9OQU1FLCBgSW52YWxpZCBrZXkgbmFtZTogJHtrZXl9YCk7XG4gICAgfVxuICB9KTtcbn1cbmNvbnN0IE9mZmxpbmVRdWVyeSA9IHtcbiAgbWF0Y2hlc1F1ZXJ5OiBtYXRjaGVzUXVlcnksXG4gIHZhbGlkYXRlUXVlcnk6IHZhbGlkYXRlUXVlcnlcbn07XG5tb2R1bGUuZXhwb3J0cyA9IE9mZmxpbmVRdWVyeTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IE9mZmxpbmVRdWVyeTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9XZWFrTWFwID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXBcIik7XG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfZGVjb2RlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGVjb2RlXCIpKTtcbnZhciBfZW5jb2RlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfQ3J5cHRvQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ3J5cHRvQ29udHJvbGxlclwiKSk7XG52YXIgX0V2ZW50dWFsbHlRdWV1ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRXZlbnR1YWxseVF1ZXVlXCIpKTtcbnZhciBfSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0luZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyXCIpKTtcbnZhciBfSW5zdGFsbGF0aW9uQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSW5zdGFsbGF0aW9uQ29udHJvbGxlclwiKSk7XG52YXIgUGFyc2VPcCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL1BhcnNlT3BcIikpO1xudmFyIF9SRVNUQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUkVTVENvbnRyb2xsZXJcIikpO1xudmFyIF9QYXJzZUFDTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VBQ0xcIikpO1xudmFyIEFuYWx5dGljcyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL0FuYWx5dGljc1wiKSk7XG52YXIgX0Fub255bW91c1V0aWxzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Bbm9ueW1vdXNVdGlsc1wiKSk7XG52YXIgQ2xvdWQgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9DbG91ZFwiKSk7XG52YXIgX1BhcnNlQ0xQID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUNMUFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX0V2ZW50RW1pdHRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRXZlbnRFbWl0dGVyXCIpKTtcbnZhciBfUGFyc2VDb25maWcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQ29uZmlnXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX0ZhY2Vib29rVXRpbHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0ZhY2Vib29rVXRpbHNcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgSG9va3MgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9QYXJzZUhvb2tzXCIpKTtcbnZhciBfUGFyc2VHZW9Qb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VHZW9Qb2ludFwiKSk7XG52YXIgX1BhcnNlUG9seWdvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VQb2x5Z29uXCIpKTtcbnZhciBfUGFyc2VJbnN0YWxsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlSW5zdGFsbGF0aW9uXCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBQdXNoID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vUHVzaFwiKSk7XG52YXIgX1BhcnNlUXVlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUXVlcnlcIikpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbnZhciBfUGFyc2VSb2xlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJvbGVcIikpO1xudmFyIF9QYXJzZVNjaGVtYSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VTY2hlbWFcIikpO1xudmFyIF9QYXJzZVNlc3Npb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlU2Vzc2lvblwiKSk7XG52YXIgX1N0b3JhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VcIikpO1xudmFyIF9QYXJzZVVzZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlVXNlclwiKSk7XG52YXIgX1BhcnNlTGl2ZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUxpdmVRdWVyeVwiKSk7XG52YXIgX0xpdmVRdWVyeUNsaWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTGl2ZVF1ZXJ5Q2xpZW50XCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXJcIikpO1xudmFyIF9TdG9yYWdlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZUNvbnRyb2xsZXJcIikpO1xudmFyIF9XZWJTb2NrZXRDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9XZWJTb2NrZXRDb250cm9sbGVyXCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIF9XZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgdmFyIHIgPSBuZXcgX1dlYWtNYXAoKSxcbiAgICB0ID0gbmV3IF9XZWFrTWFwKCk7XG4gIHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZSA/IHQgOiByO1xuICB9KShlKTtcbn1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKGUsIHIpIHtcbiAgaWYgKCFyICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgZGVmYXVsdDogZVxuICB9O1xuICB2YXIgdCA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShyKTtcbiAgaWYgKHQgJiYgdC5oYXMoZSkpIHJldHVybiB0LmdldChlKTtcbiAgdmFyIG4gPSB7XG4gICAgX19wcm90b19fOiBudWxsXG4gIH07XG4gIGZvciAodmFyIHUgaW4gZSkgaWYgKFwiZGVmYXVsdFwiICE9PSB1ICYmIHt9Lmhhc093blByb3BlcnR5LmNhbGwoZSwgdSkpIHtcbiAgICB2YXIgaSA9IF9PYmplY3QkZGVmaW5lUHJvcGVydHkgJiYgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPyBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB1KSA6IG51bGw7XG4gICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gX09iamVjdCRkZWZpbmVQcm9wZXJ0eShuLCB1LCBpKSA6IG5bdV0gPSBlW3VdO1xuICB9XG4gIHJldHVybiBuLmRlZmF1bHQgPSBlLCB0ICYmIHQuc2V0KGUsIG4pLCBuO1xufVxuLyoqXG4gKiBDb250YWlucyBhbGwgUGFyc2UgQVBJIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAZ2xvYmFsXG4gKiBAY2xhc3NcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqL1xuXG5jb25zdCBQYXJzZSA9IHtcbiAgQUNMOiBfUGFyc2VBQ0wuZGVmYXVsdCxcbiAgQW5hbHl0aWNzOiBBbmFseXRpY3MsXG4gIEFub255bW91c1V0aWxzOiBfQW5vbnltb3VzVXRpbHMuZGVmYXVsdCxcbiAgQ2xvdWQ6IENsb3VkLFxuICBDTFA6IF9QYXJzZUNMUC5kZWZhdWx0LFxuICBDb3JlTWFuYWdlcjogX0NvcmVNYW5hZ2VyLmRlZmF1bHQsXG4gIENvbmZpZzogX1BhcnNlQ29uZmlnLmRlZmF1bHQsXG4gIEVycm9yOiBfUGFyc2VFcnJvci5kZWZhdWx0LFxuICBGYWNlYm9va1V0aWxzOiBfRmFjZWJvb2tVdGlscy5kZWZhdWx0LFxuICBGaWxlOiBfUGFyc2VGaWxlLmRlZmF1bHQsXG4gIEdlb1BvaW50OiBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0LFxuICBQb2x5Z29uOiBfUGFyc2VQb2x5Z29uLmRlZmF1bHQsXG4gIEluc3RhbGxhdGlvbjogX1BhcnNlSW5zdGFsbGF0aW9uLmRlZmF1bHQsXG4gIExvY2FsRGF0YXN0b3JlOiBfTG9jYWxEYXRhc3RvcmUuZGVmYXVsdCxcbiAgT2JqZWN0OiBfUGFyc2VPYmplY3QuZGVmYXVsdCxcbiAgT3A6IHtcbiAgICBTZXQ6IFBhcnNlT3AuU2V0T3AsXG4gICAgVW5zZXQ6IFBhcnNlT3AuVW5zZXRPcCxcbiAgICBJbmNyZW1lbnQ6IFBhcnNlT3AuSW5jcmVtZW50T3AsXG4gICAgQWRkOiBQYXJzZU9wLkFkZE9wLFxuICAgIFJlbW92ZTogUGFyc2VPcC5SZW1vdmVPcCxcbiAgICBBZGRVbmlxdWU6IFBhcnNlT3AuQWRkVW5pcXVlT3AsXG4gICAgUmVsYXRpb246IFBhcnNlT3AuUmVsYXRpb25PcFxuICB9LFxuICBQdXNoOiBQdXNoLFxuICBRdWVyeTogX1BhcnNlUXVlcnkuZGVmYXVsdCxcbiAgUmVsYXRpb246IF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQsXG4gIFJvbGU6IF9QYXJzZVJvbGUuZGVmYXVsdCxcbiAgU2NoZW1hOiBfUGFyc2VTY2hlbWEuZGVmYXVsdCxcbiAgU2Vzc2lvbjogX1BhcnNlU2Vzc2lvbi5kZWZhdWx0LFxuICBTdG9yYWdlOiBfU3RvcmFnZS5kZWZhdWx0LFxuICBVc2VyOiBfUGFyc2VVc2VyLmRlZmF1bHQsXG4gIExpdmVRdWVyeUNsaWVudDogX0xpdmVRdWVyeUNsaWVudC5kZWZhdWx0LFxuICBJbmRleGVkREI6IHVuZGVmaW5lZCxcbiAgSG9va3M6IHVuZGVmaW5lZCxcbiAgUGFyc2U6IHVuZGVmaW5lZCxcbiAgLyoqXG4gICAqIEBtZW1iZXIge0V2ZW50dWFsbHlRdWV1ZX0gUGFyc2UuRXZlbnR1YWxseVF1ZXVlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBFdmVudHVhbGx5UXVldWUocXVldWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRFdmVudHVhbGx5UXVldWUocXVldWUpO1xuICB9LFxuICBnZXQgRXZlbnR1YWxseVF1ZXVlKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudHVhbGx5UXVldWUoKTtcbiAgfSxcbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgZmlyc3QgdG8gc2V0IHVwIHlvdXIgYXV0aGVudGljYXRpb24gdG9rZW5zIGZvciBQYXJzZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGxpY2F0aW9uSWQgWW91ciBQYXJzZSBBcHBsaWNhdGlvbiBJRC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtqYXZhU2NyaXB0S2V5XSBZb3VyIFBhcnNlIEphdmFTY3JpcHQgS2V5IChOb3QgbmVlZGVkIGZvciBwYXJzZS1zZXJ2ZXIpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWFzdGVyS2V5XSBZb3VyIFBhcnNlIE1hc3RlciBLZXkuIChOb2RlLmpzIG9ubHkhKVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBpbml0aWFsaXplKGFwcGxpY2F0aW9uSWQsIGphdmFTY3JpcHRLZXkpIHtcbiAgICBpZiAoXCJicm93c2VyXCIgPT09ICdicm93c2VyJyAmJiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0lTX05PREUnKSAmJiAhcHJvY2Vzcy5lbnYuU0VSVkVSX1JFTkRFUklORykge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgY29uc29sZS5sb2coXCJJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyB0aGUgYnJvd3NlciB2ZXJzaW9uIG9mIHRoZSBTREsgaW4gYSBcIiArIFwibm9kZS5qcyBlbnZpcm9ubWVudC4gWW91IHNob3VsZCByZXF1aXJlKCdwYXJzZS9ub2RlJykgaW5zdGVhZC5cIik7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgICB9XG4gICAgUGFyc2UuX2luaXRpYWxpemUoYXBwbGljYXRpb25JZCwgamF2YVNjcmlwdEtleSk7XG4gIH0sXG4gIF9pbml0aWFsaXplKGFwcGxpY2F0aW9uSWQsIGphdmFTY3JpcHRLZXksIG1hc3RlcktleSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnQVBQTElDQVRJT05fSUQnLCBhcHBsaWNhdGlvbklkKTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0pBVkFTQ1JJUFRfS0VZJywgamF2YVNjcmlwdEtleSk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdNQVNURVJfS0VZJywgbWFzdGVyS2V5KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ1VTRV9NQVNURVJfS0VZJywgZmFsc2UpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdFdmVudEVtaXR0ZXInLCBfRXZlbnRFbWl0dGVyLmRlZmF1bHQpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdMaXZlUXVlcnknLCBuZXcgX1BhcnNlTGl2ZVF1ZXJ5LmRlZmF1bHQoKSk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ0NyeXB0b0NvbnRyb2xsZXInLCBfQ3J5cHRvQ29udHJvbGxlci5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnRXZlbnR1YWxseVF1ZXVlJywgX0V2ZW50dWFsbHlRdWV1ZS5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnSW5zdGFsbGF0aW9uQ29udHJvbGxlcicsIF9JbnN0YWxsYXRpb25Db250cm9sbGVyLmRlZmF1bHQpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXInLCBfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyLmRlZmF1bHQpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdTdG9yYWdlQ29udHJvbGxlcicsIF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnV2ViU29ja2V0Q29udHJvbGxlcicsIF9XZWJTb2NrZXRDb250cm9sbGVyLmRlZmF1bHQpO1xuICAgIFBhcnNlLkluZGV4ZWREQiA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlcicsIF9JbmRleGVkREJTdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0KTtcbiAgfSxcbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgdG8gc2V0IHlvdXIgQXN5bmNTdG9yYWdlIGVuZ2luZVxuICAgKiBTdGFydGluZyBQYXJzZUAxLjExLCB0aGUgUGFyc2VTREsgZG8gbm90IHByb3ZpZGUgYSBSZWFjdCBBc3luY1N0b3JhZ2UgYXMgdGhlIFJlYWN0TmF0aXZlIG1vZHVsZVxuICAgKiBpcyBub3QgcHJvdmlkZWQgYXQgYSBzdGFibGUgcGF0aCBhbmQgY2hhbmdlcyBvdmVyIHZlcnNpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0FzeW5jU3RvcmFnZX0gc3RvcmFnZSBhIHJlYWN0IG5hdGl2ZSBhc3luYyBzdG9yYWdlLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXRBc3luY1N0b3JhZ2Uoc3RvcmFnZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldEFzeW5jU3RvcmFnZShzdG9yYWdlKTtcbiAgfSxcbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgdG8gc2V0IHlvdXIgTG9jYWxEYXRhc3RvcmVTdG9yYWdlIGVuZ2luZVxuICAgKiBJZiB1c2luZyBSZWFjdC1OYXRpdmUgdXNlIHtAbGluayBQYXJzZS5zZXRBc3luY1N0b3JhZ2UgUGFyc2Uuc2V0QXN5bmNTdG9yYWdlKCl9XG4gICAqXG4gICAqIEBwYXJhbSB7TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyfSBjb250cm9sbGVyIGEgZGF0YSBzdG9yYWdlLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcihjb250cm9sbGVyKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybnMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBjdXJyZW50IHNlcnZlcidzIGhlYWx0aFxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgZ2V0U2VydmVySGVhbHRoKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLnJlcXVlc3QoJ0dFVCcsICdoZWFsdGgnKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge3N0cmluZ30gUGFyc2UuYXBwbGljYXRpb25JZFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgYXBwbGljYXRpb25JZCh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnQVBQTElDQVRJT05fSUQnLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBhcHBsaWNhdGlvbklkKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FQUExJQ0FUSU9OX0lEJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLmphdmFTY3JpcHRLZXlcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IGphdmFTY3JpcHRLZXkodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0pBVkFTQ1JJUFRfS0VZJywgdmFsdWUpO1xuICB9LFxuICBnZXQgamF2YVNjcmlwdEtleSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdKQVZBU0NSSVBUX0tFWScpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5tYXN0ZXJLZXlcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IG1hc3RlcktleSh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnTUFTVEVSX0tFWScsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IG1hc3RlcktleSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdNQVNURVJfS0VZJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLnNlcnZlclVSTFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgc2VydmVyVVJMKHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdTRVJWRVJfVVJMJywgdmFsdWUpO1xuICB9LFxuICBnZXQgc2VydmVyVVJMKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9VUkwnKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge3N0cmluZ30gUGFyc2Uuc2VydmVyQXV0aFRva2VuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBzZXJ2ZXJBdXRoVG9rZW4odmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ1NFUlZFUl9BVVRIX1RPS0VOJywgdmFsdWUpO1xuICB9LFxuICBnZXQgc2VydmVyQXV0aFRva2VuKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RPS0VOJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLnNlcnZlckF1dGhUeXBlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBzZXJ2ZXJBdXRoVHlwZSh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnU0VSVkVSX0FVVEhfVFlQRScsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IHNlcnZlckF1dGhUeXBlKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RZUEUnKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge1BhcnNlTGl2ZVF1ZXJ5fSBQYXJzZS5MaXZlUXVlcnlcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IExpdmVRdWVyeShsaXZlUXVlcnkpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRMaXZlUXVlcnkobGl2ZVF1ZXJ5KTtcbiAgfSxcbiAgZ2V0IExpdmVRdWVyeSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TGl2ZVF1ZXJ5KCk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLmxpdmVRdWVyeVNlcnZlclVSTFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgbGl2ZVF1ZXJ5U2VydmVyVVJMKHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdMSVZFUVVFUllfU0VSVkVSX1VSTCcsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IGxpdmVRdWVyeVNlcnZlclVSTCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdMSVZFUVVFUllfU0VSVkVSX1VSTCcpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7Ym9vbGVhbn0gUGFyc2UuZW5jcnlwdGVkVXNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgZW5jcnlwdGVkVXNlcih2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnRU5DUllQVEVEX1VTRVInLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBlbmNyeXB0ZWRVc2VyKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9VU0VSJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLnNlY3JldFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgc2VjcmV0KHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdFTkNSWVBURURfS0VZJywgdmFsdWUpO1xuICB9LFxuICBnZXQgc2VjcmV0KCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9LRVknKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge2Jvb2xlYW59IFBhcnNlLmlkZW1wb3RlbmN5XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBpZGVtcG90ZW5jeSh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnSURFTVBPVEVOQ1knLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBpZGVtcG90ZW5jeSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJREVNUE9URU5DWScpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7Ym9vbGVhbn0gUGFyc2UuYWxsb3dDdXN0b21PYmplY3RJZFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgYWxsb3dDdXN0b21PYmplY3RJZCh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnQUxMT1dfQ1VTVE9NX09CSkVDVF9JRCcsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IGFsbG93Q3VzdG9tT2JqZWN0SWQoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQUxMT1dfQ1VTVE9NX09CSkVDVF9JRCcpO1xuICB9LFxuICBfcmVxdWVzdCgpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLnJlcXVlc3QuYXBwbHkobnVsbCwgYXJncyk7XG4gIH0sXG4gIF9hamF4KCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5hamF4LmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9LFxuICAvLyBXZSBhdHRlbXB0IHRvIG1hdGNoIHRoZSBzaWduYXR1cmVzIG9mIHRoZSBsZWdhY3kgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kc1xuICBfZGVjb2RlKF8sIHZhbHVlKSB7XG4gICAgcmV0dXJuICgwLCBfZGVjb2RlMi5kZWZhdWx0KSh2YWx1ZSk7XG4gIH0sXG4gIF9lbmNvZGUodmFsdWUsIF8sIGRpc2FsbG93T2JqZWN0cykge1xuICAgIHJldHVybiAoMCwgX2VuY29kZTIuZGVmYXVsdCkodmFsdWUsIGRpc2FsbG93T2JqZWN0cyk7XG4gIH0sXG4gIF9nZXRJbnN0YWxsYXRpb25JZCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcigpLmN1cnJlbnRJbnN0YWxsYXRpb25JZCgpO1xuICB9LFxuICAvKipcbiAgICogRW5hYmxlIHBpbm5pbmcgaW4geW91ciBhcHBsaWNhdGlvbi5cbiAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBgUGFyc2UuaW5pdGlhbGl6ZWAgaW4geW91ciBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIFtwb2xsaW5nXSBBbGxvdyBwaW5naW5nIHRoZSBzZXJ2ZXIgL2hlYWx0aCBlbmRwb2ludC4gRGVmYXVsdCB0cnVlXG4gICAqIEBwYXJhbSBbbXNdIE1pbGxpc2Vjb25kcyB0byBwaW5nIHRoZSBzZXJ2ZXIuIERlZmF1bHQgMjAwMG1zXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGVuYWJsZUxvY2FsRGF0YXN0b3JlKCkge1xuICAgIGxldCBwb2xsaW5nID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICAgIGxldCBtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMjAwMDtcbiAgICBpZiAoIXRoaXMuYXBwbGljYXRpb25JZCkge1xuICAgICAgY29uc29sZS5sb2coXCInZW5hYmxlTG9jYWxEYXRhU3RvcmUnIG11c3QgYmUgY2FsbGVkIGFmdGVyICdpbml0aWFsaXplJ1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLkxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgdGhpcy5Mb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgaWYgKHBvbGxpbmcpIHtcbiAgICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnR1YWxseVF1ZXVlKCkucG9sbChtcyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIExvY2FsIERhdGFzdG9yZSBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNMb2NhbERhdGFzdG9yZUVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuTG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkO1xuICB9LFxuICAvKipcbiAgICogR2V0cyBhbGwgY29udGVudHMgZnJvbSBMb2NhbCBEYXRhc3RvcmVcbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuZHVtcExvY2FsRGF0YXN0b3JlKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICBkdW1wTG9jYWxEYXRhc3RvcmUoKSB7XG4gICAgaWYgKCF0aGlzLkxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgY29uc29sZS5sb2coJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFBhcnNlLkxvY2FsRGF0YXN0b3JlLl9nZXRBbGxDb250ZW50cygpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEVuYWJsZSB0aGUgY3VycmVudCB1c2VyIGVuY3J5cHRpb24uXG4gICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGxvZ2luIGFueSB1c2VyLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBlbmFibGVFbmNyeXB0ZWRVc2VyKCkge1xuICAgIHRoaXMuZW5jcnlwdGVkVXNlciA9IHRydWU7XG4gIH0sXG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgRW5jcnlwdGVkIFVzZXIgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzRW5jcnlwdGVkVXNlckVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5jcnlwdGVkVXNlcjtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFJFU1RDb250cm9sbGVyKF9SRVNUQ29udHJvbGxlci5kZWZhdWx0KTtcbi8vIEZvciBsZWdhY3kgcmVxdWlyZXMsIG9mIHRoZSBmb3JtIGB2YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZScpLlBhcnNlYFxuUGFyc2UuUGFyc2UgPSBQYXJzZTtcbm1vZHVsZS5leHBvcnRzID0gUGFyc2U7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG5jb25zdCBQVUJMSUNfS0VZID0gJyonO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgQUNMLlxuICogSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBBQ0wgaGFzIG5vIHBlcm1pc3Npb25zIGZvciBhbnlvbmUuXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBQYXJzZS5Vc2VyLCB0aGUgQUNMIHdpbGwgaGF2ZSByZWFkIGFuZCB3cml0ZVxuICogICBwZXJtaXNzaW9uIGZvciBvbmx5IHRoYXQgdXNlci5cbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbnkgb3RoZXIgSlNPTiBvYmplY3QsIHRoYXQgb2JqZWN0IHdpbGwgYmUgaW50ZXJwcmV0dGVkXG4gKiAgIGFzIGEgc2VyaWFsaXplZCBBQ0wgY3JlYXRlZCB3aXRoIHRvSlNPTigpLlxuICpcbiAqIDxwPkFuIEFDTCwgb3IgQWNjZXNzIENvbnRyb2wgTGlzdCBjYW4gYmUgYWRkZWQgdG8gYW55XG4gKiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+IHRvIHJlc3RyaWN0IGFjY2VzcyB0byBvbmx5IGEgc3Vic2V0IG9mIHVzZXJzXG4gKiBvZiB5b3VyIGFwcGxpY2F0aW9uLjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuQUNMXG4gKi9cbmNsYXNzIFBhcnNlQUNMIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7KFBhcnNlLlVzZXIgfCBvYmplY3QpfSBhcmcxIFRoZSB1c2VyIHRvIGluaXRpYWxpemUgdGhlIEFDTCBmb3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZzEpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInBlcm1pc3Npb25zQnlJZFwiLCB2b2lkIDApO1xuICAgIHRoaXMucGVybWlzc2lvbnNCeUlkID0ge307XG4gICAgaWYgKGFyZzEgJiYgdHlwZW9mIGFyZzEgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBQYXJzZVVzZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVVzZXIoKTtcbiAgICAgIGlmIChhcmcxIGluc3RhbmNlb2YgUGFyc2VVc2VyKSB7XG4gICAgICAgIHRoaXMuc2V0UmVhZEFjY2VzcyhhcmcxLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRXcml0ZUFjY2VzcyhhcmcxLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgdXNlcklkIGluIGFyZzEpIHtcbiAgICAgICAgICBjb25zdCBhY2Nlc3NMaXN0ID0gYXJnMVt1c2VySWRdO1xuICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF0gPSB7fTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gaW4gYWNjZXNzTGlzdCkge1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IGFjY2Vzc0xpc3RbcGVybWlzc2lvbl07XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbiAhPT0gJ3JlYWQnICYmIHBlcm1pc3Npb24gIT09ICd3cml0ZScpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gY3JlYXRlIGFuIEFDTCB3aXRoIGFuIGludmFsaWQgcGVybWlzc2lvbiB0eXBlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhbGxvd2VkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gY3JlYXRlIGFuIEFDTCB3aXRoIGFuIGludmFsaWQgcGVybWlzc2lvbiB2YWx1ZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF1bcGVybWlzc2lvbl0gPSBhbGxvd2VkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZzEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhcnNlQUNMIGNvbnN0cnVjdGVkIHdpdGggYSBmdW5jdGlvbi4gRGlkIHlvdSBmb3JnZXQgKCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OLWVuY29kZWQgdmVyc2lvbiBvZiB0aGUgQUNMLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0ge307XG4gICAgZm9yIChjb25zdCBwIGluIHRoaXMucGVybWlzc2lvbnNCeUlkKSB7XG4gICAgICBwZXJtaXNzaW9uc1twXSA9IHRoaXMucGVybWlzc2lvbnNCeUlkW3BdO1xuICAgIH1cbiAgICByZXR1cm4gcGVybWlzc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgQUNMIGlzIGVxdWFsIHRvIGFub3RoZXIgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2VBQ0x9IG90aGVyIFRoZSBvdGhlciBvYmplY3QncyBBQ0wgdG8gY29tcGFyZSB0b1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGVxdWFscyhvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgUGFyc2VBQ0wpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJzID0gKDAsIF9rZXlzLmRlZmF1bHQpKHRoaXMucGVybWlzc2lvbnNCeUlkKTtcbiAgICBjb25zdCBvdGhlclVzZXJzID0gKDAsIF9rZXlzLmRlZmF1bHQpKG90aGVyLnBlcm1pc3Npb25zQnlJZCk7XG4gICAgaWYgKHVzZXJzLmxlbmd0aCAhPT0gb3RoZXJVc2Vycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB1IGluIHRoaXMucGVybWlzc2lvbnNCeUlkKSB7XG4gICAgICBpZiAoIW90aGVyLnBlcm1pc3Npb25zQnlJZFt1XSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wZXJtaXNzaW9uc0J5SWRbdV0ucmVhZCAhPT0gb3RoZXIucGVybWlzc2lvbnNCeUlkW3VdLnJlYWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGVybWlzc2lvbnNCeUlkW3VdLndyaXRlICE9PSBvdGhlci5wZXJtaXNzaW9uc0J5SWRbdV0ud3JpdGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBfc2V0QWNjZXNzKGFjY2Vzc1R5cGUsIHVzZXJJZCwgYWxsb3dlZCkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGNvbnN0IFBhcnNlVXNlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlVXNlcigpO1xuICAgIGlmICh1c2VySWQgaW5zdGFuY2VvZiBQYXJzZVVzZXIpIHtcbiAgICAgIHVzZXJJZCA9IHVzZXJJZC5pZDtcbiAgICB9IGVsc2UgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIFBhcnNlUm9sZSkge1xuICAgICAgY29uc3QgbmFtZSA9IHVzZXJJZC5nZXROYW1lKCk7XG4gICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUm9sZSBtdXN0IGhhdmUgYSBuYW1lJyk7XG4gICAgICB9XG4gICAgICB1c2VySWQgPSAncm9sZTonICsgbmFtZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1c2VySWQgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhbGxvd2VkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FsbG93ZWQgbXVzdCBiZSBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4nKTtcbiAgICB9XG4gICAgbGV0IHBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc0J5SWRbdXNlcklkXTtcbiAgICBpZiAoIXBlcm1pc3Npb25zKSB7XG4gICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgLy8gVGhlIHVzZXIgYWxyZWFkeSBkb2Vzbid0IGhhdmUgdGhpcyBwZXJtaXNzaW9uLCBzbyBubyBhY3Rpb24gaXMgbmVlZGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlcm1pc3Npb25zID0ge307XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF0gPSBwZXJtaXNzaW9ucztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbG93ZWQpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF1bYWNjZXNzVHlwZV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgcGVybWlzc2lvbnNbYWNjZXNzVHlwZV07XG4gICAgICBpZiAoKDAsIF9rZXlzLmRlZmF1bHQpKHBlcm1pc3Npb25zKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9nZXRBY2Nlc3MoYWNjZXNzVHlwZSwgdXNlcklkKSB7XG4gICAgY29uc3QgUGFyc2VSb2xlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VSb2xlKCk7XG4gICAgY29uc3QgUGFyc2VVc2VyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VVc2VyKCk7XG4gICAgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIFBhcnNlVXNlcikge1xuICAgICAgdXNlcklkID0gdXNlcklkLmlkO1xuICAgICAgaWYgKCF1c2VySWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGFjY2VzcyBmb3IgYSBQYXJzZVVzZXIgd2l0aG91dCBhbiBJRCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodXNlcklkIGluc3RhbmNlb2YgUGFyc2VSb2xlKSB7XG4gICAgICBjb25zdCBuYW1lID0gdXNlcklkLmdldE5hbWUoKTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSb2xlIG11c3QgaGF2ZSBhIG5hbWUnKTtcbiAgICAgIH1cbiAgICAgIHVzZXJJZCA9ICdyb2xlOicgKyBuYW1lO1xuICAgIH1cbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNCeUlkW3VzZXJJZF07XG4gICAgaWYgKCFwZXJtaXNzaW9ucykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gISFwZXJtaXNzaW9uc1thY2Nlc3NUeXBlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaXMgYWxsb3dlZCB0byByZWFkIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGF0IHVzZXIgc2hvdWxkIGhhdmUgcmVhZCBhY2Nlc3MuXG4gICAqL1xuICBzZXRSZWFkQWNjZXNzKHVzZXJJZCwgYWxsb3dlZCkge1xuICAgIHRoaXMuX3NldEFjY2VzcygncmVhZCcsIHVzZXJJZCwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaWQgaXMgKmV4cGxpY2l0bHkqIGFsbG93ZWQgdG8gcmVhZCB0aGlzIG9iamVjdC5cbiAgICogRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB1c2VyIG1heSBzdGlsbCBiZSBhYmxlIHRvIGFjY2VzcyBpdCBpZlxuICAgKiBnZXRQdWJsaWNSZWFkQWNjZXNzIHJldHVybnMgdHJ1ZSBvciBhIHJvbGUgdGhhdCB0aGUgdXNlciBiZWxvbmdzIHRvIGhhc1xuICAgKiB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRSZWFkQWNjZXNzKHVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3MoJ3JlYWQnLCB1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpZCBpcyBhbGxvd2VkIHRvIHdyaXRlIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGF0IHVzZXIgc2hvdWxkIGhhdmUgd3JpdGUgYWNjZXNzLlxuICAgKi9cbiAgc2V0V3JpdGVBY2Nlc3ModXNlcklkLCBhbGxvd2VkKSB7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCd3cml0ZScsIHVzZXJJZCwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlkIGlzICpleHBsaWNpdGx5KiBhbGxvd2VkIHRvIHdyaXRlIHRoaXMgb2JqZWN0LlxuICAgKiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHVzZXIgbWF5IHN0aWxsIGJlIGFibGUgdG8gd3JpdGUgaXQgaWZcbiAgICogZ2V0UHVibGljV3JpdGVBY2Nlc3MgcmV0dXJucyB0cnVlIG9yIGEgcm9sZSB0aGF0IHRoZSB1c2VyIGJlbG9uZ3MgdG8gaGFzXG4gICAqIHdyaXRlIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZCwgb3IgYSBQYXJzZS5Sb2xlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFdyaXRlQWNjZXNzKHVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3MoJ3dyaXRlJywgdXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZFxuICAgKi9cbiAgc2V0UHVibGljUmVhZEFjY2VzcyhhbGxvd2VkKSB7XG4gICAgdGhpcy5zZXRSZWFkQWNjZXNzKFBVQkxJQ19LRVksIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gcmVhZCB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRQdWJsaWNSZWFkQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFJlYWRBY2Nlc3MoUFVCTElDX0tFWSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkXG4gICAqL1xuICBzZXRQdWJsaWNXcml0ZUFjY2VzcyhhbGxvd2VkKSB7XG4gICAgdGhpcy5zZXRXcml0ZUFjY2VzcyhQVUJMSUNfS0VZLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHdyaXRlIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFB1YmxpY1dyaXRlQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFdyaXRlQWNjZXNzKFBVQkxJQ19LRVkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gcmVhZCB0aGlzIG9iamVjdC4gRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSByb2xlIG1heVxuICAgKiBzdGlsbCBiZSBhYmxlIHRvIHdyaXRlIGl0IGlmIGEgcGFyZW50IHJvbGUgaGFzIHJlYWQgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHJvbGUgaGFzIHJlYWQgYWNjZXNzLiBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBnZXRSb2xlUmVhZEFjY2Vzcyhyb2xlKSB7XG4gICAgY29uc3QgUGFyc2VSb2xlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VSb2xlKCk7XG4gICAgaWYgKHJvbGUgaW5zdGFuY2VvZiBQYXJzZVJvbGUpIHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byB0aGUgU3RyaW5nIG5hbWVcbiAgICAgIHJvbGUgPSByb2xlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByb2xlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm9sZSBtdXN0IGJlIGEgUGFyc2VSb2xlIG9yIGEgU3RyaW5nJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFJlYWRBY2Nlc3MoJ3JvbGU6JyArIHJvbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gd3JpdGUgdGhpcyBvYmplY3QuIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgcm9sZSBtYXlcbiAgICogc3RpbGwgYmUgYWJsZSB0byB3cml0ZSBpdCBpZiBhIHBhcmVudCByb2xlIGhhcyB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgcm9sZSBoYXMgd3JpdGUgYWNjZXNzLiBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBnZXRSb2xlV3JpdGVBY2Nlc3Mocm9sZSkge1xuICAgIGNvbnN0IFBhcnNlUm9sZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUm9sZSgpO1xuICAgIGlmIChyb2xlIGluc3RhbmNlb2YgUGFyc2VSb2xlKSB7XG4gICAgICAvLyBOb3JtYWxpemUgdG8gdGhlIFN0cmluZyBuYW1lXG4gICAgICByb2xlID0gcm9sZS5nZXROYW1lKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygcm9sZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JvbGUgbXVzdCBiZSBhIFBhcnNlUm9sZSBvciBhIFN0cmluZycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRXcml0ZUFjY2Vzcygncm9sZTonICsgcm9sZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byByZWFkIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhlIGdpdmVuIHJvbGUgY2FuIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBzZXRSb2xlUmVhZEFjY2Vzcyhyb2xlLCBhbGxvd2VkKSB7XG4gICAgY29uc3QgUGFyc2VSb2xlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VSb2xlKCk7XG4gICAgaWYgKHJvbGUgaW5zdGFuY2VvZiBQYXJzZVJvbGUpIHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byB0aGUgU3RyaW5nIG5hbWVcbiAgICAgIHJvbGUgPSByb2xlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByb2xlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm9sZSBtdXN0IGJlIGEgUGFyc2VSb2xlIG9yIGEgU3RyaW5nJyk7XG4gICAgfVxuICAgIHRoaXMuc2V0UmVhZEFjY2Vzcygncm9sZTonICsgcm9sZSwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCBXaGV0aGVyIHRoZSBnaXZlbiByb2xlIGNhbiB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIHNldFJvbGVXcml0ZUFjY2Vzcyhyb2xlLCBhbGxvd2VkKSB7XG4gICAgY29uc3QgUGFyc2VSb2xlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VSb2xlKCk7XG4gICAgaWYgKHJvbGUgaW5zdGFuY2VvZiBQYXJzZVJvbGUpIHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byB0aGUgU3RyaW5nIG5hbWVcbiAgICAgIHJvbGUgPSByb2xlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByb2xlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm9sZSBtdXN0IGJlIGEgUGFyc2VSb2xlIG9yIGEgU3RyaW5nJyk7XG4gICAgfVxuICAgIHRoaXMuc2V0V3JpdGVBY2Nlc3MoJ3JvbGU6JyArIHJvbGUsIGFsbG93ZWQpO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZUFDTDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL21hcFwiKSk7XG52YXIgX2VudHJpZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2VudHJpZXNcIikpO1xudmFyIF9hc3NpZ24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9hc3NpZ25cIikpO1xudmFyIF9zbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc2xpY2VcIikpO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9ldmVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZXZlcnlcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfUGFyc2VSb2xlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJvbGVcIikpO1xudmFyIF9QYXJzZVVzZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlVXNlclwiKSk7XG5jb25zdCBQVUJMSUNfS0VZID0gJyonO1xuY29uc3QgVkFMSURfUEVSTUlTU0lPTlMgPSBuZXcgX21hcC5kZWZhdWx0KCk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ2dldCcsIHt9KTtcblZBTElEX1BFUk1JU1NJT05TLnNldCgnZmluZCcsIHt9KTtcblZBTElEX1BFUk1JU1NJT05TLnNldCgnY291bnQnLCB7fSk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ2NyZWF0ZScsIHt9KTtcblZBTElEX1BFUk1JU1NJT05TLnNldCgndXBkYXRlJywge30pO1xuVkFMSURfUEVSTUlTU0lPTlMuc2V0KCdkZWxldGUnLCB7fSk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ2FkZEZpZWxkJywge30pO1xuY29uc3QgVkFMSURfUEVSTUlTU0lPTlNfRVhURU5ERUQgPSBuZXcgX21hcC5kZWZhdWx0KCk7XG5WQUxJRF9QRVJNSVNTSU9OU19FWFRFTkRFRC5zZXQoJ3Byb3RlY3RlZEZpZWxkcycsIHt9KTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IENMUC5cbiAqIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgQ0xQIGhhcyBubyBwZXJtaXNzaW9ucyBmb3IgYW55b25lLlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgUGFyc2UuVXNlciBvciBQYXJzZS5Sb2xlLCB0aGUgQ0xQIHdpbGwgaGF2ZSByZWFkIGFuZCB3cml0ZVxuICogICBwZXJtaXNzaW9uIGZvciBvbmx5IHRoYXQgdXNlciBvciByb2xlLlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGFueSBvdGhlciBKU09OIG9iamVjdCwgdGhhdCBvYmplY3Qgd2lsbCBiZSBpbnRlcnByZXR0ZWRcbiAqICAgYXMgYSBzZXJpYWxpemVkIENMUCBjcmVhdGVkIHdpdGggdG9KU09OKCkuXG4gKlxuICogPHA+QSBDTFAsIG9yIENsYXNzIExldmVsIFBlcm1pc3Npb25zIGNhbiBiZSBhZGRlZCB0byBhbnlcbiAqIDxjb2RlPlBhcnNlLlNjaGVtYTwvY29kZT4gdG8gcmVzdHJpY3QgYWNjZXNzIHRvIG9ubHkgYSBzdWJzZXQgb2YgdXNlcnNcbiAqIG9mIHlvdXIgYXBwbGljYXRpb24uPC9wPlxuICpcbiAqIDxwPlxuICogRm9yIGdldC9jb3VudC9maW5kL2NyZWF0ZS91cGRhdGUvZGVsZXRlL2FkZEZpZWxkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOlxuICpcbiAqIEVudGl0eSBpcyB0eXBlIFBhcnNlLlVzZXIgb3IgUGFyc2UuUm9sZSBvciBzdHJpbmdcbiAqIFJvbGUgaXMgdHlwZSBQYXJzZS5Sb2xlIG9yIE5hbWUgb2YgUGFyc2UuUm9sZVxuICpcbiAqIGdldEdldFJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0R2V0UmVxdWlyZXNBdXRoZW50aWNhdGlvbihhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0R2V0UG9pbnRlckZpZWxkcygpXG4gKiBzZXRHZXRQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0R2V0QWNjZXNzKGVudGl0eTogRW50aXR5KVxuICogc2V0R2V0QWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljR2V0QWNjZXNzKClcbiAqIHNldFB1YmxpY0dldEFjY2VzcyhhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Um9sZUdldEFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZUdldEFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0RmluZFJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0RmluZFJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldEZpbmRQb2ludGVyRmllbGRzKClcbiAqIHNldEZpbmRQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0RmluZEFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldEZpbmRBY2Nlc3MoZW50aXR5OiBFbnRpdHksIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRQdWJsaWNGaW5kQWNjZXNzKClcbiAqIHNldFB1YmxpY0ZpbmRBY2Nlc3MoYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFJvbGVGaW5kQWNjZXNzKHJvbGU6IFJvbGUpXG4gKiBzZXRSb2xlRmluZEFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Q291bnRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldENvdW50UmVxdWlyZXNBdXRoZW50aWNhdGlvbihhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Q291bnRQb2ludGVyRmllbGRzKClcbiAqIHNldENvdW50UG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldENvdW50QWNjZXNzKGVudGl0eTogRW50aXR5KVxuICogc2V0Q291bnRBY2Nlc3MoZW50aXR5OiBFbnRpdHksIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRQdWJsaWNDb3VudEFjY2VzcygpXG4gKiBzZXRQdWJsaWNDb3VudEFjY2VzcyhhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Um9sZUNvdW50QWNjZXNzKHJvbGU6IFJvbGUpXG4gKiBzZXRSb2xlQ291bnRBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldENyZWF0ZVJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0Q3JlYXRlUmVxdWlyZXNBdXRoZW50aWNhdGlvbihhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Q3JlYXRlUG9pbnRlckZpZWxkcygpXG4gKiBzZXRDcmVhdGVQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0Q3JlYXRlQWNjZXNzKGVudGl0eTogRW50aXR5KVxuICogc2V0Q3JlYXRlQWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljQ3JlYXRlQWNjZXNzKClcbiAqIHNldFB1YmxpY0NyZWF0ZUFjY2VzcyhhbGxvd2VkOiBCb29sZWFuKVxuICogZ2V0Um9sZUNyZWF0ZUFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZUNyZWF0ZUFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0VXBkYXRlUmVxdWlyZXNBdXRoZW50aWNhdGlvbigpXG4gKiBzZXRVcGRhdGVSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRVcGRhdGVQb2ludGVyRmllbGRzKClcbiAqIHNldFVwZGF0ZVBvaW50ZXJGaWVsZHMocG9pbnRlckZpZWxkczogc3RyaW5nW10pXG4gKiBnZXRVcGRhdGVBY2Nlc3MoZW50aXR5OiBFbnRpdHkpXG4gKiBzZXRVcGRhdGVBY2Nlc3MoZW50aXR5OiBFbnRpdHksIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRQdWJsaWNVcGRhdGVBY2Nlc3MoKVxuICogc2V0UHVibGljVXBkYXRlQWNjZXNzKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRSb2xlVXBkYXRlQWNjZXNzKHJvbGU6IFJvbGUpXG4gKiBzZXRSb2xlVXBkYXRlQWNjZXNzKHJvbGU6IFJvbGUsIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXREZWxldGVSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldERlbGV0ZVJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldERlbGV0ZVBvaW50ZXJGaWVsZHMoKVxuICogc2V0RGVsZXRlUG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldERlbGV0ZUFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldERlbGV0ZUFjY2VzcyhlbnRpdHk6IEVudGl0eSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFB1YmxpY0RlbGV0ZUFjY2VzcygpXG4gKiBzZXRQdWJsaWNEZWxldGVBY2Nlc3MoYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFJvbGVEZWxldGVBY2Nlc3Mocm9sZTogUm9sZSlcbiAqIHNldFJvbGVEZWxldGVBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldEFkZEZpZWxkUmVxdWlyZXNBdXRoZW50aWNhdGlvbigpXG4gKiBzZXRBZGRGaWVsZFJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldEFkZEZpZWxkUG9pbnRlckZpZWxkcygpXG4gKiBzZXRBZGRGaWVsZFBvaW50ZXJGaWVsZHMocG9pbnRlckZpZWxkczogc3RyaW5nW10pXG4gKiBnZXRBZGRGaWVsZEFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldEFkZEZpZWxkQWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljQWRkRmllbGRBY2Nlc3MoKVxuICogc2V0UHVibGljQWRkRmllbGRBY2Nlc3MoYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFJvbGVBZGRGaWVsZEFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZUFkZEZpZWxkQWNjZXNzKHJvbGU6IFJvbGUsIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiA8L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLkNMUFxuICovXG5jbGFzcyBQYXJzZUNMUCB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyhQYXJzZS5Vc2VyIHwgUGFyc2UuUm9sZSB8IG9iamVjdCl9IHVzZXJJZCBUaGUgdXNlciB0byBpbml0aWFsaXplIHRoZSBDTFAgZm9yXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih1c2VySWQpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInBlcm1pc3Npb25zTWFwXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5wZXJtaXNzaW9uc01hcCA9IHt9O1xuICAgIC8vIEluaXRpYWxpemUgcGVybWlzc2lvbnMgTWFwIHdpdGggZGVmYXVsdCBwZXJtaXNzaW9uc1xuICAgIGZvciAoY29uc3QgW29wZXJhdGlvbiwgZ3JvdXBdIG9mICgwLCBfZW50cmllcy5kZWZhdWx0KShWQUxJRF9QRVJNSVNTSU9OUykuY2FsbChWQUxJRF9QRVJNSVNTSU9OUykpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXSA9ICgwLCBfYXNzaWduLmRlZmF1bHQpKHt9LCBncm91cCk7XG4gICAgICBjb25zdCBhY3Rpb24gPSBvcGVyYXRpb24uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyAoMCwgX3NsaWNlLmRlZmF1bHQpKG9wZXJhdGlvbikuY2FsbChvcGVyYXRpb24sIDEpO1xuICAgICAgdGhpc1tgZ2V0JHthY3Rpb259UmVxdWlyZXNBdXRoZW50aWNhdGlvbmBdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKG9wZXJhdGlvbiwgJ3JlcXVpcmVzQXV0aGVudGljYXRpb24nKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BzZXQke2FjdGlvbn1SZXF1aXJlc0F1dGhlbnRpY2F0aW9uYF0gPSBmdW5jdGlvbiAoYWxsb3dlZCkge1xuICAgICAgICB0aGlzLl9zZXRBY2Nlc3Mob3BlcmF0aW9uLCAncmVxdWlyZXNBdXRoZW50aWNhdGlvbicsIGFsbG93ZWQpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYGdldCR7YWN0aW9ufVBvaW50ZXJGaWVsZHNgXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcyhvcGVyYXRpb24sICdwb2ludGVyRmllbGRzJywgZmFsc2UpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYHNldCR7YWN0aW9ufVBvaW50ZXJGaWVsZHNgXSA9IGZ1bmN0aW9uIChwb2ludGVyRmllbGRzKSB7XG4gICAgICAgIHRoaXMuX3NldEFycmF5QWNjZXNzKG9wZXJhdGlvbiwgJ3BvaW50ZXJGaWVsZHMnLCBwb2ludGVyRmllbGRzKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BnZXQke2FjdGlvbn1BY2Nlc3NgXSA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcyhvcGVyYXRpb24sIGVudGl0eSk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgc2V0JHthY3Rpb259QWNjZXNzYF0gPSBmdW5jdGlvbiAoZW50aXR5LCBhbGxvd2VkKSB7XG4gICAgICAgIHRoaXMuX3NldEFjY2VzcyhvcGVyYXRpb24sIGVudGl0eSwgYWxsb3dlZCk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgZ2V0UHVibGljJHthY3Rpb259QWNjZXNzYF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2BnZXQke2FjdGlvbn1BY2Nlc3NgXShQVUJMSUNfS0VZKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BzZXRQdWJsaWMke2FjdGlvbn1BY2Nlc3NgXSA9IGZ1bmN0aW9uIChhbGxvd2VkKSB7XG4gICAgICAgIHRoaXNbYHNldCR7YWN0aW9ufUFjY2Vzc2BdKFBVQkxJQ19LRVksIGFsbG93ZWQpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYGdldFJvbGUke2FjdGlvbn1BY2Nlc3NgXSA9IGZ1bmN0aW9uIChyb2xlKSB7XG4gICAgICAgIHJldHVybiB0aGlzW2BnZXQke2FjdGlvbn1BY2Nlc3NgXSh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgc2V0Um9sZSR7YWN0aW9ufUFjY2Vzc2BdID0gZnVuY3Rpb24gKHJvbGUsIGFsbG93ZWQpIHtcbiAgICAgICAgdGhpc1tgc2V0JHthY3Rpb259QWNjZXNzYF0odGhpcy5fZ2V0Um9sZU5hbWUocm9sZSksIGFsbG93ZWQpO1xuICAgICAgfTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSBwZXJtaXNzaW9ucyBNYXAgd2l0aCBkZWZhdWx0IGV4dGVuZGVkIHBlcm1pc3Npb25zXG4gICAgZm9yIChjb25zdCBbb3BlcmF0aW9uLCBncm91cF0gb2YgKDAsIF9lbnRyaWVzLmRlZmF1bHQpKFZBTElEX1BFUk1JU1NJT05TX0VYVEVOREVEKS5jYWxsKFZBTElEX1BFUk1JU1NJT05TX0VYVEVOREVEKSkge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtvcGVyYXRpb25dID0gKDAsIF9hc3NpZ24uZGVmYXVsdCkoe30sIGdyb3VwKTtcbiAgICB9XG4gICAgaWYgKHVzZXJJZCAmJiB0eXBlb2YgdXNlcklkID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIF9QYXJzZVVzZXIuZGVmYXVsdCkge1xuICAgICAgICB0aGlzLnNldFJlYWRBY2Nlc3ModXNlcklkLCB0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRXcml0ZUFjY2Vzcyh1c2VySWQsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmICh1c2VySWQgaW5zdGFuY2VvZiBfUGFyc2VSb2xlLmRlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5zZXRSb2xlUmVhZEFjY2Vzcyh1c2VySWQsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFJvbGVXcml0ZUFjY2Vzcyh1c2VySWQsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIGluIHVzZXJJZCkge1xuICAgICAgICAgIHZhciBfY29udGV4dDtcbiAgICAgICAgICBjb25zdCB1c2VycyA9IHVzZXJJZFtwZXJtaXNzaW9uXTtcbiAgICAgICAgICBjb25zdCBpc1ZhbGlkUGVybWlzc2lvbiA9ICEhVkFMSURfUEVSTUlTU0lPTlMuZ2V0KHBlcm1pc3Npb24pO1xuICAgICAgICAgIGNvbnN0IGlzVmFsaWRQZXJtaXNzaW9uRXh0ZW5kZWQgPSAhIVZBTElEX1BFUk1JU1NJT05TX0VYVEVOREVELmdldChwZXJtaXNzaW9uKTtcbiAgICAgICAgICBjb25zdCBpc1ZhbGlkR3JvdXBQZXJtaXNzaW9uID0gKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShfY29udGV4dCA9IFsncmVhZFVzZXJGaWVsZHMnLCAnd3JpdGVVc2VyRmllbGRzJ10pLmNhbGwoX2NvbnRleHQsIHBlcm1pc3Npb24pO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGVybWlzc2lvbiAhPT0gJ3N0cmluZycgfHwgIShpc1ZhbGlkUGVybWlzc2lvbiB8fCBpc1ZhbGlkUGVybWlzc2lvbkV4dGVuZGVkIHx8IGlzVmFsaWRHcm91cFBlcm1pc3Npb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBjcmVhdGUgYW4gQ0xQIHdpdGggYW4gaW52YWxpZCBwZXJtaXNzaW9uIHR5cGUuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1ZhbGlkR3JvdXBQZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAoKDAsIF9ldmVyeS5kZWZhdWx0KSh1c2VycykuY2FsbCh1c2VycywgcG9pbnRlciA9PiB0eXBlb2YgcG9pbnRlciA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl0gPSB1c2VycztcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBjcmVhdGUgYW4gQ0xQIHdpdGggYW4gaW52YWxpZCBwZXJtaXNzaW9uIHZhbHVlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHVzZXIgaW4gdXNlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWQgPSB1c2Vyc1t1c2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWxsb3dlZCAhPT0gJ2Jvb2xlYW4nICYmICFpc1ZhbGlkUGVybWlzc2lvbkV4dGVuZGVkICYmIHVzZXIgIT09ICdwb2ludGVyRmllbGRzJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBjcmVhdGUgYW4gQ0xQIHdpdGggYW4gaW52YWxpZCBwZXJtaXNzaW9uIHZhbHVlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VyXSA9IGFsbG93ZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdXNlcklkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXJzZUNMUCBjb25zdHJ1Y3RlZCB3aXRoIGEgZnVuY3Rpb24uIERpZCB5b3UgZm9yZ2V0ICgpPycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTi1lbmNvZGVkIHZlcnNpb24gb2YgdGhlIENMUC5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5wZXJtaXNzaW9uc01hcFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgQ0xQIGlzIGVxdWFsIHRvIGFub3RoZXIgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUgdG9cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFBhcnNlQ0xQKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9ICgwLCBfa2V5cy5kZWZhdWx0KSh0aGlzLnBlcm1pc3Npb25zTWFwKTtcbiAgICBjb25zdCBvdGhlclBlcm1pc3Npb25zID0gKDAsIF9rZXlzLmRlZmF1bHQpKG90aGVyLnBlcm1pc3Npb25zTWFwKTtcbiAgICBpZiAocGVybWlzc2lvbnMubGVuZ3RoICE9PSBvdGhlclBlcm1pc3Npb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gaW4gdGhpcy5wZXJtaXNzaW9uc01hcCkge1xuICAgICAgaWYgKCFvdGhlci5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB1c2VycyA9ICgwLCBfa2V5cy5kZWZhdWx0KSh0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dKTtcbiAgICAgIGNvbnN0IG90aGVyVXNlcnMgPSAoMCwgX2tleXMuZGVmYXVsdCkob3RoZXIucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl0pO1xuICAgICAgaWYgKHVzZXJzLmxlbmd0aCAhPT0gb3RoZXJVc2Vycy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB1c2VyIGluIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl0pIHtcbiAgICAgICAgaWYgKCFvdGhlci5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VyXSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VyXSAhPT0gb3RoZXIucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcl0pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgX2dldFJvbGVOYW1lKHJvbGUpIHtcbiAgICBsZXQgbmFtZSA9IHJvbGU7XG4gICAgaWYgKHJvbGUgaW5zdGFuY2VvZiBfUGFyc2VSb2xlLmRlZmF1bHQpIHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byB0aGUgU3RyaW5nIG5hbWVcbiAgICAgIG5hbWUgPSByb2xlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm9sZSBtdXN0IGJlIGEgUGFyc2UuUm9sZSBvciBhIFN0cmluZycpO1xuICAgIH1cbiAgICByZXR1cm4gYHJvbGU6JHtuYW1lfWA7XG4gIH1cbiAgX3BhcnNlRW50aXR5KGVudGl0eSkge1xuICAgIGxldCB1c2VySWQgPSBlbnRpdHk7XG4gICAgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIF9QYXJzZVVzZXIuZGVmYXVsdCkge1xuICAgICAgdXNlcklkID0gdXNlcklkLmlkO1xuICAgICAgaWYgKCF1c2VySWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGFjY2VzcyBmb3IgYSBQYXJzZS5Vc2VyIHdpdGhvdXQgYW4gaWQuJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh1c2VySWQgaW5zdGFuY2VvZiBfUGFyc2VSb2xlLmRlZmF1bHQpIHtcbiAgICAgIHVzZXJJZCA9IHRoaXMuX2dldFJvbGVOYW1lKHVzZXJJZCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndXNlcklkIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VySWQ7XG4gIH1cbiAgX3NldEFjY2VzcyhwZXJtaXNzaW9uLCB1c2VySWQsIGFsbG93ZWQpIHtcbiAgICB1c2VySWQgPSB0aGlzLl9wYXJzZUVudGl0eSh1c2VySWQpO1xuICAgIGlmICh0eXBlb2YgYWxsb3dlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhbGxvd2VkIG11c3QgYmUgZWl0aGVyIHRydWUgb3IgZmFsc2UuJyk7XG4gICAgfVxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdO1xuICAgIGlmICghcGVybWlzc2lvbnMpIHtcbiAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICAvLyBUaGUgdXNlciBhbHJlYWR5IGRvZXNuJ3QgaGF2ZSB0aGlzIHBlcm1pc3Npb24sIHNvIG5vIGFjdGlvbiBpcyBuZWVkZWRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdID0ge307XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxvd2VkKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdO1xuICAgIH1cbiAgfVxuICBfZ2V0QWNjZXNzKHBlcm1pc3Npb24sIHVzZXJJZCkge1xuICAgIGxldCByZXR1cm5Cb29sZWFuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICAgIHVzZXJJZCA9IHRoaXMuX3BhcnNlRW50aXR5KHVzZXJJZCk7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF07XG4gICAgaWYgKHJldHVybkJvb2xlYW4pIHtcbiAgICAgIGlmICghcGVybWlzc2lvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuICEhdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdO1xuICAgIH1cbiAgICByZXR1cm4gcGVybWlzc2lvbnM7XG4gIH1cbiAgX3NldEFycmF5QWNjZXNzKHBlcm1pc3Npb24sIHVzZXJJZCwgZmllbGRzKSB7XG4gICAgdXNlcklkID0gdGhpcy5fcGFyc2VFbnRpdHkodXNlcklkKTtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXTtcbiAgICBpZiAoIXBlcm1pc3Npb25zKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF0gPSBbXTtcbiAgICB9XG4gICAgaWYgKCFmaWVsZHMgfHwgKDAsIF9pc0FycmF5LmRlZmF1bHQpKGZpZWxkcykgJiYgZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXTtcbiAgICB9IGVsc2UgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShmaWVsZHMpICYmICgwLCBfZXZlcnkuZGVmYXVsdCkoZmllbGRzKS5jYWxsKGZpZWxkcywgZmllbGQgPT4gdHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJykpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXSA9IGZpZWxkcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmllbGRzIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuICB9XG4gIF9zZXRHcm91cFBvaW50ZXJQZXJtaXNzaW9uKG9wZXJhdGlvbiwgcG9pbnRlckZpZWxkcykge1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXTtcbiAgICBpZiAoIWZpZWxkcykge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtvcGVyYXRpb25dID0gW107XG4gICAgfVxuICAgIGlmICghcG9pbnRlckZpZWxkcyB8fCAoMCwgX2lzQXJyYXkuZGVmYXVsdCkocG9pbnRlckZpZWxkcykgJiYgcG9pbnRlckZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl07XG4gICAgfSBlbHNlIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkocG9pbnRlckZpZWxkcykgJiYgKDAsIF9ldmVyeS5kZWZhdWx0KShwb2ludGVyRmllbGRzKS5jYWxsKHBvaW50ZXJGaWVsZHMsIGZpZWxkID0+IHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl0gPSBwb2ludGVyRmllbGRzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke29wZXJhdGlvbn0ucG9pbnRlckZpZWxkcyBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3Mgb3IgdW5kZWZpbmVkLmApO1xuICAgIH1cbiAgfVxuICBfZ2V0R3JvdXBQb2ludGVyUGVybWlzc2lvbnMob3BlcmF0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVzZXIgcG9pbnRlciBmaWVsZHMgdG8gYWxsb3cgcGVybWlzc2lvbiBmb3IgZ2V0L2NvdW50L2ZpbmQgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcG9pbnRlckZpZWxkcyBVc2VyIHBvaW50ZXIgZmllbGRzXG4gICAqL1xuICBzZXRSZWFkVXNlckZpZWxkcyhwb2ludGVyRmllbGRzKSB7XG4gICAgdGhpcy5fc2V0R3JvdXBQb2ludGVyUGVybWlzc2lvbigncmVhZFVzZXJGaWVsZHMnLCBwb2ludGVyRmllbGRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IFVzZXIgcG9pbnRlciBmaWVsZHNcbiAgICovXG4gIGdldFJlYWRVc2VyRmllbGRzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRHcm91cFBvaW50ZXJQZXJtaXNzaW9ucygncmVhZFVzZXJGaWVsZHMnKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVzZXIgcG9pbnRlciBmaWVsZHMgdG8gYWxsb3cgcGVybWlzc2lvbiBmb3IgY3JlYXRlL2RlbGV0ZS91cGRhdGUvYWRkRmllbGQgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwb2ludGVyRmllbGRzIFVzZXIgcG9pbnRlciBmaWVsZHNcbiAgICovXG4gIHNldFdyaXRlVXNlckZpZWxkcyhwb2ludGVyRmllbGRzKSB7XG4gICAgdGhpcy5fc2V0R3JvdXBQb2ludGVyUGVybWlzc2lvbignd3JpdGVVc2VyRmllbGRzJywgcG9pbnRlckZpZWxkcyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBVc2VyIHBvaW50ZXIgZmllbGRzXG4gICAqL1xuICBnZXRXcml0ZVVzZXJGaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEdyb3VwUG9pbnRlclBlcm1pc3Npb25zKCd3cml0ZVVzZXJGaWVsZHMnKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaXMgYWxsb3dlZCB0byByZXRyaWV2ZSBmaWVsZHMgZnJvbSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBmaWVsZHMgZmllbGRzIHRvIGJlIHByb3RlY3RlZFxuICAgKi9cbiAgc2V0UHJvdGVjdGVkRmllbGRzKHVzZXJJZCwgZmllbGRzKSB7XG4gICAgdGhpcy5fc2V0QXJyYXlBY2Nlc3MoJ3Byb3RlY3RlZEZpZWxkcycsIHVzZXJJZCwgZmllbGRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFycmF5IG9mIGZpZWxkcyBhcmUgYWNjZXNzYWJsZSB0byB0aGlzIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZ2V0UHJvdGVjdGVkRmllbGRzKHVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3MoJ3Byb3RlY3RlZEZpZWxkcycsIHVzZXJJZCwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpcyBhbGxvd2VkIHRvIHJlYWQgZnJvbSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgd2hldGhlciB0aGF0IHVzZXIgc2hvdWxkIGhhdmUgcmVhZCBhY2Nlc3MuXG4gICAqL1xuICBzZXRSZWFkQWNjZXNzKHVzZXJJZCwgYWxsb3dlZCkge1xuICAgIHRoaXMuX3NldEFjY2VzcygnZmluZCcsIHVzZXJJZCwgYWxsb3dlZCk7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCdnZXQnLCB1c2VySWQsIGFsbG93ZWQpO1xuICAgIHRoaXMuX3NldEFjY2VzcygnY291bnQnLCB1c2VySWQsIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlkIGlzICpleHBsaWNpdGx5KiBhbGxvd2VkIHRvIHJlYWQgZnJvbSB0aGlzIGNsYXNzLlxuICAgKiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHVzZXIgbWF5IHN0aWxsIGJlIGFibGUgdG8gYWNjZXNzIGl0IGlmXG4gICAqIGdldFB1YmxpY1JlYWRBY2Nlc3MgcmV0dXJucyB0cnVlIG9yIGEgcm9sZSB0aGF0IHRoZSB1c2VyIGJlbG9uZ3MgdG8gaGFzXG4gICAqIHdyaXRlIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZCwgb3IgYSBQYXJzZS5Sb2xlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFJlYWRBY2Nlc3ModXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcygnZmluZCcsIHVzZXJJZCkgJiYgdGhpcy5fZ2V0QWNjZXNzKCdnZXQnLCB1c2VySWQpICYmIHRoaXMuX2dldEFjY2VzcygnY291bnQnLCB1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpZCBpcyBhbGxvd2VkIHRvIHdyaXRlIHRvIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCBXaGV0aGVyIHRoYXQgdXNlciBzaG91bGQgaGF2ZSB3cml0ZSBhY2Nlc3MuXG4gICAqL1xuICBzZXRXcml0ZUFjY2Vzcyh1c2VySWQsIGFsbG93ZWQpIHtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ2NyZWF0ZScsIHVzZXJJZCwgYWxsb3dlZCk7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCd1cGRhdGUnLCB1c2VySWQsIGFsbG93ZWQpO1xuICAgIHRoaXMuX3NldEFjY2VzcygnZGVsZXRlJywgdXNlcklkLCBhbGxvd2VkKTtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ2FkZEZpZWxkJywgdXNlcklkLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaWQgaXMgKmV4cGxpY2l0bHkqIGFsbG93ZWQgdG8gd3JpdGUgdG8gdGhpcyBjbGFzcy5cbiAgICogRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSB1c2VyIG1heSBzdGlsbCBiZSBhYmxlIHRvIHdyaXRlIGl0IGlmXG4gICAqIGdldFB1YmxpY1dyaXRlQWNjZXNzIHJldHVybnMgdHJ1ZSBvciBhIHJvbGUgdGhhdCB0aGUgdXNlciBiZWxvbmdzIHRvIGhhc1xuICAgKiB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRXcml0ZUFjY2Vzcyh1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKCdjcmVhdGUnLCB1c2VySWQpICYmIHRoaXMuX2dldEFjY2VzcygndXBkYXRlJywgdXNlcklkKSAmJiB0aGlzLl9nZXRBY2Nlc3MoJ2RlbGV0ZScsIHVzZXJJZCkgJiYgdGhpcy5fZ2V0QWNjZXNzKCdhZGRGaWVsZCcsIHVzZXJJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byByZWFkIGZyb20gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkXG4gICAqL1xuICBzZXRQdWJsaWNSZWFkQWNjZXNzKGFsbG93ZWQpIHtcbiAgICB0aGlzLnNldFJlYWRBY2Nlc3MoUFVCTElDX0tFWSwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byByZWFkIGZyb20gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRQdWJsaWNSZWFkQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFJlYWRBY2Nlc3MoUFVCTElDX0tFWSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byB3cml0ZSB0byB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWRcbiAgICovXG4gIHNldFB1YmxpY1dyaXRlQWNjZXNzKGFsbG93ZWQpIHtcbiAgICB0aGlzLnNldFdyaXRlQWNjZXNzKFBVQkxJQ19LRVksIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gd3JpdGUgdG8gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBnZXRQdWJsaWNXcml0ZUFjY2VzcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRXcml0ZUFjY2VzcyhQVUJMSUNfS0VZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHByb3RlY3QgZmllbGRzIGluIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGZpZWxkc1xuICAgKi9cbiAgc2V0UHVibGljUHJvdGVjdGVkRmllbGRzKGZpZWxkcykge1xuICAgIHRoaXMuc2V0UHJvdGVjdGVkRmllbGRzKFBVQkxJQ19LRVksIGZpZWxkcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byByZWFkIGZpZWxkcyBmcm9tIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGdldFB1YmxpY1Byb3RlY3RlZEZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm90ZWN0ZWRGaWVsZHMoUFVCTElDX0tFWSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byByZWFkIGZyb20gdGhpcyBjbGFzcy4gRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSByb2xlIG1heVxuICAgKiBzdGlsbCBiZSBhYmxlIHRvIHdyaXRlIGl0IGlmIGEgcGFyZW50IHJvbGUgaGFzIHJlYWQgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHJvbGUgaGFzIHJlYWQgYWNjZXNzLiBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBnZXRSb2xlUmVhZEFjY2Vzcyhyb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVhZEFjY2Vzcyh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byB3cml0ZSB0byB0aGlzIHVzZXIuIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgcm9sZSBtYXlcbiAgICogc3RpbGwgYmUgYWJsZSB0byB3cml0ZSBpdCBpZiBhIHBhcmVudCByb2xlIGhhcyB3cml0ZSBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgcm9sZSBoYXMgd3JpdGUgYWNjZXNzLiBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBnZXRSb2xlV3JpdGVBY2Nlc3Mocm9sZSkge1xuICAgIHJldHVybiB0aGlzLmdldFdyaXRlQWNjZXNzKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHJlYWQgZnJvbSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhlIGdpdmVuIHJvbGUgY2FuIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBzZXRSb2xlUmVhZEFjY2Vzcyhyb2xlLCBhbGxvd2VkKSB7XG4gICAgdGhpcy5zZXRSZWFkQWNjZXNzKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHdyaXRlIHRvIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGUgZ2l2ZW4gcm9sZSBjYW4gd3JpdGUgdGhpcyBvYmplY3QuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBzZXRSb2xlV3JpdGVBY2Nlc3Mocm9sZSwgYWxsb3dlZCkge1xuICAgIHRoaXMuc2V0V3JpdGVBY2Nlc3ModGhpcy5fZ2V0Um9sZU5hbWUocm9sZSksIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gY291bnQgdG8gdGhpcyB1c2VyLiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvbGUgbWF5XG4gICAqIHN0aWxsIGJlIGFibGUgdG8gY291bnQgaXQgaWYgYSBwYXJlbnQgcm9sZSBoYXMgY291bnQgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgZ2V0Um9sZVByb3RlY3RlZEZpZWxkcyhyb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvdGVjdGVkRmllbGRzKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHNldCBhY2Nlc3MgZmllbGQgaW4gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGZpZWxkcyBGaWVsZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IFJvbGUuXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBzZXRSb2xlUHJvdGVjdGVkRmllbGRzKHJvbGUsIGZpZWxkcykge1xuICAgIHRoaXMuc2V0UHJvdGVjdGVkRmllbGRzKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpLCBmaWVsZHMpO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZUNMUDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2RlY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGVjb2RlXCIpKTtcbnZhciBfZW5jb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lbmNvZGVcIikpO1xudmFyIF9lc2NhcGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VzY2FwZVwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9TdG9yYWdlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlXCIpKTtcbi8qKlxuICogUGFyc2UuQ29uZmlnIGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpb24gb2YgY29uZmlndXJhdGlvbiBkYXRhIHRoYXRcbiAqIGNhbiBiZSBzZXQgZnJvbSB0aGUgUGFyc2UgZGFzaGJvYXJkLlxuICpcbiAqIEBhbGlhcyBQYXJzZS5Db25maWdcbiAqL1xuY2xhc3MgUGFyc2VDb25maWcge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImF0dHJpYnV0ZXNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9lc2NhcGVkQXR0cmlidXRlc1wiLCB2b2lkIDApO1xuICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuICAgIHRoaXMuX2VzY2FwZWRBdHRyaWJ1dGVzID0ge307XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZ2V0KGF0dHIpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2F0dHJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEhUTUwtZXNjYXBlZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGVzY2FwZShhdHRyKSB7XG4gICAgY29uc3QgaHRtbCA9IHRoaXMuX2VzY2FwZWRBdHRyaWJ1dGVzW2F0dHJdO1xuICAgIGlmIChodG1sKSB7XG4gICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gdGhpcy5hdHRyaWJ1dGVzW2F0dHJdO1xuICAgIGxldCBlc2NhcGVkID0gJyc7XG4gICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICBlc2NhcGVkID0gKDAsIF9lc2NhcGUuZGVmYXVsdCkodmFsLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICB0aGlzLl9lc2NhcGVkQXR0cmlidXRlc1thdHRyXSA9IGVzY2FwZWQ7XG4gICAgcmV0dXJuIGVzY2FwZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudGx5LWZldGNoZWQgY29uZmlndXJhdGlvbiBvYmplY3QsIGVpdGhlciBmcm9tXG4gICAqIG1lbW9yeSBvciBmcm9tIGxvY2FsIHN0b3JhZ2UgaWYgbmVjZXNzYXJ5LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5Db25maWd9IFRoZSBtb3N0IHJlY2VudGx5LWZldGNoZWQgUGFyc2UuQ29uZmlnIGlmIGl0XG4gICAqICAgICBleGlzdHMsIGVsc2UgYW4gZW1wdHkgUGFyc2UuQ29uZmlnLlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENvbmZpZ0NvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5jdXJyZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIG5ldyBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGEgbmV3bHktY3JlYXRlZFxuICAgKiAgICAgY29uZmlndXJhdGlvbiBvYmplY3Qgd2hlbiB0aGUgZ2V0IGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBnZXQoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDb25maWdDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0KG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUga2V5cyB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRycyBUaGUgY29uZmlnIHBhcmFtZXRlcnMgYW5kIHZhbHVlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IG1hc3RlcktleU9ubHlGbGFncyBUaGUgZmxhZ3MgdGhhdCBkZWZpbmUgd2hldGhlciBjb25maWcgcGFyYW1ldGVycyBsaXN0ZWRcbiAgICogaW4gYGF0dHJzYCBzaG91bGQgYmUgcmV0cmlldmFibGUgb25seSBieSB1c2luZyB0aGUgbWFzdGVyIGtleS5cbiAgICogRm9yIGV4YW1wbGU6IGBwYXJhbTE6IHRydWVgIG1ha2VzIGBwYXJhbTFgIG9ubHkgcmV0cmlldmFibGUgYnkgdXNpbmcgdGhlIG1hc3RlciBrZXkuXG4gICAqIElmIGEgcGFyYW1ldGVyIGlzIG5vdCBwcm92aWRlZCBvciBzZXQgdG8gYGZhbHNlYCwgaXQgY2FuIGJlIHJldHJpZXZlZCB3aXRob3V0XG4gICAqIHVzaW5nIHRoZSBtYXN0ZXIga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhIG5ld2x5LWNyZWF0ZWRcbiAgICogICAgIGNvbmZpZ3VyYXRpb24gb2JqZWN0IG9yIHdpdGggdGhlIGN1cnJlbnQgd2l0aCB0aGUgdXBkYXRlLlxuICAgKi9cbiAgc3RhdGljIHNhdmUoYXR0cnMsIG1hc3RlcktleU9ubHlGbGFncykge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDb25maWdDb250cm9sbGVyKCk7XG4gICAgLy9UbyBhdm9pZCBhIG1pc21hdGNoIHdpdGggdGhlIGxvY2FsIGFuZCB0aGUgY2xvdWQgY29uZmlnIHdlIGdldCBhIG5ldyB2ZXJzaW9uXG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuc2F2ZShhdHRycywgbWFzdGVyS2V5T25seUZsYWdzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLmdldCh7XG4gICAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGZvciB0ZXN0aW5nXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgX2NsZWFyQ2FjaGUoKSB7XG4gICAgY3VycmVudENvbmZpZyA9IG51bGw7XG4gIH1cbn1cbmxldCBjdXJyZW50Q29uZmlnID0gbnVsbDtcbmNvbnN0IENVUlJFTlRfQ09ORklHX0tFWSA9ICdjdXJyZW50Q29uZmlnJztcbmZ1bmN0aW9uIGRlY29kZVBheWxvYWQoZGF0YSkge1xuICB0cnkge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgIGlmIChqc29uICYmIHR5cGVvZiBqc29uID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuICgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24pO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgY3VycmVudCgpIHtcbiAgICBpZiAoY3VycmVudENvbmZpZykge1xuICAgICAgcmV0dXJuIGN1cnJlbnRDb25maWc7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBQYXJzZUNvbmZpZygpO1xuICAgIGNvbnN0IHN0b3JhZ2VQYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9DT05GSUdfS0VZKTtcbiAgICBpZiAoIV9TdG9yYWdlLmRlZmF1bHQuYXN5bmMoKSkge1xuICAgICAgY29uc3QgY29uZmlnRGF0YSA9IF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbShzdG9yYWdlUGF0aCk7XG4gICAgICBpZiAoY29uZmlnRGF0YSkge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGVjb2RlUGF5bG9hZChjb25maWdEYXRhKTtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBjb25maWcuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgICAgY3VycmVudENvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gICAgLy8gUmV0dXJuIGEgcHJvbWlzZSBmb3IgYXN5bmMgc3RvcmFnZSBjb250cm9sbGVyc1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhzdG9yYWdlUGF0aCkudGhlbihjb25maWdEYXRhID0+IHtcbiAgICAgIGlmIChjb25maWdEYXRhKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkZWNvZGVQYXlsb2FkKGNvbmZpZ0RhdGEpO1xuICAgICAgICBpZiAoYXR0cmlidXRlcykge1xuICAgICAgICAgIGNvbmZpZy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICAgICAgICBjdXJyZW50Q29uZmlnID0gY29uZmlnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0pO1xuICB9LFxuICBnZXQoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2NvbmZpZycsIHt9LCBvcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlLnBhcmFtcykge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9KU09OLCAnQ29uZmlnIEpTT04gcmVzcG9uc2UgaW52YWxpZC4nKTtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBQYXJzZUNvbmZpZygpO1xuICAgICAgY29uZmlnLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgYXR0ciBpbiByZXNwb25zZS5wYXJhbXMpIHtcbiAgICAgICAgY29uZmlnLmF0dHJpYnV0ZXNbYXR0cl0gPSAoMCwgX2RlY29kZS5kZWZhdWx0KShyZXNwb25zZS5wYXJhbXNbYXR0cl0pO1xuICAgICAgfVxuICAgICAgY3VycmVudENvbmZpZyA9IGNvbmZpZztcbiAgICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX0NPTkZJR19LRVkpLCAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShyZXNwb25zZS5wYXJhbXMpKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBzYXZlKGF0dHJzLCBtYXN0ZXJLZXlPbmx5RmxhZ3MpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3QgZW5jb2RlZEF0dHJzID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgIGVuY29kZWRBdHRyc1trZXldID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkoYXR0cnNba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQVVQnLCAnY29uZmlnJywge1xuICAgICAgcGFyYW1zOiBlbmNvZGVkQXR0cnMsXG4gICAgICBtYXN0ZXJLZXlPbmx5OiBtYXN0ZXJLZXlPbmx5RmxhZ3NcbiAgICB9LCB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgJ0Vycm9yIG9jY3VyZWQgdXBkYXRpbmcgQ29uZmlnLicpO1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0Q29uZmlnQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZUNvbmZpZzsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkyID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5MihleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbi8qKlxuICogQ29uc3RydWN0cyBhIG5ldyBQYXJzZS5FcnJvciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gY29kZSBhbmQgbWVzc2FnZS5cbiAqXG4gKiBQYXJzZS5Db3JlTWFuYWdlci5zZXQoJ1BBUlNFX0VSUk9SUycsIFt7IGNvZGUsIG1lc3NhZ2UgfV0pIGNhbiBiZSB1c2UgdG8gb3ZlcnJpZGUgZXJyb3IgbWVzc2FnZXMuXG4gKlxuICogQGFsaWFzIFBhcnNlLkVycm9yXG4gKi9cbmNsYXNzIFBhcnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZSBBbiBlcnJvciBjb2RlIGNvbnN0YW50IGZyb20gPGNvZGU+UGFyc2UuRXJyb3I8L2NvZGU+LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBBIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICB2YXIgX2NvbnRleHQ7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkodGhpcywgXCJjb2RlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkodGhpcywgXCJtZXNzYWdlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkodGhpcywgXCJvYmplY3RcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KSh0aGlzLCBcImVycm9yc1wiLCB2b2lkIDApO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgbGV0IGN1c3RvbU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnUEFSU0VfRVJST1JTJykpLmNhbGwoX2NvbnRleHQsIGVycm9yID0+IHtcbiAgICAgIGlmIChlcnJvci5jb2RlID09PSBjb2RlICYmIGVycm9yLmNvZGUpIHtcbiAgICAgICAgY3VzdG9tTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgJ21lc3NhZ2UnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGN1c3RvbU1lc3NhZ2VcbiAgICB9KTtcbiAgfVxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1BhcnNlRXJyb3I6ICcgKyB0aGlzLmNvZGUgKyAnICcgKyB0aGlzLm1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHNvbWUgZXJyb3Igb3RoZXIgdGhhbiB0aG9zZSBlbnVtZXJhdGVkIGhlcmUuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBPVEhFUl9DQVVTRVxuICAgKiBAc3RhdGljXG4gICAqL1xufVxuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJPVEhFUl9DQVVTRVwiLCAtMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZyB3aXRoIHRoZSBzZXJ2ZXIuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVEVSTkFMX1NFUlZFUl9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVEVSTkFMX1NFUlZFUl9FUlJPUlwiLCAxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBQYXJzZSBzZXJ2ZXJzIGZhaWxlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gQ09OTkVDVElPTl9GQUlMRURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJDT05ORUNUSU9OX0ZBSUxFRFwiLCAxMDApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhlIHNwZWNpZmllZCBvYmplY3QgZG9lc24ndCBleGlzdC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gT0JKRUNUX05PVF9GT1VORFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk9CSkVDVF9OT1RfRk9VTkRcIiwgMTAxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHlvdSB0cmllZCB0byBxdWVyeSB3aXRoIGEgZGF0YXR5cGUgdGhhdCBkb2Vzbid0XG4gKiBzdXBwb3J0IGl0LCBsaWtlIGV4YWN0IG1hdGNoaW5nIGFuIGFycmF5IG9yIG9iamVjdC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9RVUVSWVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfUVVFUllcIiwgMTAyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgbWlzc2luZyBvciBpbnZhbGlkIGNsYXNzbmFtZS4gQ2xhc3NuYW1lcyBhcmVcbiAqIGNhc2Utc2Vuc2l0aXZlLiBUaGV5IG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciwgYW5kIGEtekEtWjAtOV8gYXJlIHRoZVxuICogb25seSB2YWxpZCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0NMQVNTX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0NMQVNTX05BTUVcIiwgMTAzKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIHVuc3BlY2lmaWVkIG9iamVjdCBpZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTUlTU0lOR19PQkpFQ1RfSURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJNSVNTSU5HX09CSkVDVF9JRFwiLCAxMDQpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBrZXkgbmFtZS4gS2V5cyBhcmUgY2FzZS1zZW5zaXRpdmUuIFRoZXlcbiAqIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciwgYW5kIGEtekEtWjAtOV8gYXJlIHRoZSBvbmx5IHZhbGlkIGNoYXJhY3RlcnMuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfS0VZX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0tFWV9OQU1FXCIsIDEwNSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhIG1hbGZvcm1lZCBwb2ludGVyLiBZb3Ugc2hvdWxkIG5vdCBzZWUgdGhpcyB1bmxlc3NcbiAqIHlvdSBoYXZlIGJlZW4gbXVja2luZyBhYm91dCBjaGFuZ2luZyBpbnRlcm5hbCBQYXJzZSBjb2RlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX1BPSU5URVJcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1BPSU5URVJcIiwgMTA2KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYmFkbHkgZm9ybWVkIEpTT04gd2FzIHJlY2VpdmVkIHVwc3RyZWFtLiBUaGlzXG4gKiBlaXRoZXIgaW5kaWNhdGVzIHlvdSBoYXZlIGRvbmUgc29tZXRoaW5nIHVudXN1YWwgd2l0aCBtb2RpZnlpbmcgaG93XG4gKiB0aGluZ3MgZW5jb2RlIHRvIEpTT04sIG9yIHRoZSBuZXR3b3JrIGlzIGZhaWxpbmcgYmFkbHkuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfSlNPTlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfSlNPTlwiLCAxMDcpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgZmVhdHVyZSB5b3UgdHJpZWQgdG8gYWNjZXNzIGlzIG9ubHlcbiAqIGF2YWlsYWJsZSBpbnRlcm5hbGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBDT01NQU5EX1VOQVZBSUxBQkxFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiQ09NTUFORF9VTkFWQUlMQUJMRVwiLCAxMDgpO1xuLyoqXG4gKiBZb3UgbXVzdCBjYWxsIFBhcnNlLmluaXRpYWxpemUgYmVmb3JlIHVzaW5nIHRoZSBQYXJzZSBsaWJyYXJ5LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBOT1RfSU5JVElBTElaRURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJOT1RfSU5JVElBTElaRURcIiwgMTA5KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBmaWVsZCB3YXMgc2V0IHRvIGFuIGluY29uc2lzdGVudCB0eXBlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTkNPUlJFQ1RfVFlQRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOQ09SUkVDVF9UWVBFXCIsIDExMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBpbnZhbGlkIGNoYW5uZWwgbmFtZS4gQSBjaGFubmVsIG5hbWUgaXMgZWl0aGVyXG4gKiBhbiBlbXB0eSBzdHJpbmcgKHRoZSBicm9hZGNhc3QgY2hhbm5lbCkgb3IgY29udGFpbnMgb25seSBhLXpBLVowLTlfXG4gKiBjaGFyYWN0ZXJzIGFuZCBzdGFydHMgd2l0aCBhIGxldHRlci5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9DSEFOTkVMX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0NIQU5ORUxfTkFNRVwiLCAxMTIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBwdXNoIGlzIG1pc2NvbmZpZ3VyZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFBVU0hfTUlTQ09ORklHVVJFRFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlBVU0hfTUlTQ09ORklHVVJFRFwiLCAxMTUpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgb2JqZWN0IGlzIHRvbyBsYXJnZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gT0JKRUNUX1RPT19MQVJHRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk9CSkVDVF9UT09fTEFSR0VcIiwgMTE2KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIG9wZXJhdGlvbiBpc24ndCBhbGxvd2VkIGZvciBjbGllbnRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBPUEVSQVRJT05fRk9SQklEREVOXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiT1BFUkFUSU9OX0ZPUkJJRERFTlwiLCAxMTkpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhlIHJlc3VsdCB3YXMgbm90IGZvdW5kIGluIHRoZSBjYWNoZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gQ0FDSEVfTUlTU1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkNBQ0hFX01JU1NcIiwgMTIwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYW4gaW52YWxpZCBrZXkgd2FzIHVzZWQgaW4gYSBuZXN0ZWRcbiAqIEpTT05PYmplY3QuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfTkVTVEVEX0tFWVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfTkVTVEVEX0tFWVwiLCAxMjEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhbiBpbnZhbGlkIGZpbGVuYW1lIHdhcyB1c2VkIGZvciBQYXJzZUZpbGUuXG4gKiBBIHZhbGlkIGZpbGUgbmFtZSBjb250YWlucyBvbmx5IGEtekEtWjAtOV8uIGNoYXJhY3RlcnMgYW5kIGlzIGJldHdlZW4gMVxuICogYW5kIDEyOCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0ZJTEVfTkFNRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfRklMRV9OQU1FXCIsIDEyMik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBpbnZhbGlkIEFDTCB3YXMgcHJvdmlkZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfQUNMXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9BQ0xcIiwgMTIzKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgdGltZWQgb3V0IG9uIHRoZSBzZXJ2ZXIuIFR5cGljYWxseVxuICogdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdCBpcyB0b28gZXhwZW5zaXZlIHRvIHJ1bi5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gVElNRU9VVFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlRJTUVPVVRcIiwgMTI0KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGVtYWlsIGFkZHJlc3Mgd2FzIGludmFsaWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfRU1BSUxfQUREUkVTU1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfRU1BSUxfQUREUkVTU1wiLCAxMjUpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYSBtaXNzaW5nIGNvbnRlbnQgdHlwZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTUlTU0lOR19DT05URU5UX1RZUEVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJNSVNTSU5HX0NPTlRFTlRfVFlQRVwiLCAxMjYpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYSBtaXNzaW5nIGNvbnRlbnQgbGVuZ3RoLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBNSVNTSU5HX0NPTlRFTlRfTEVOR1RIXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTUlTU0lOR19DT05URU5UX0xFTkdUSFwiLCAxMjcpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBjb250ZW50IGxlbmd0aC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9DT05URU5UX0xFTkdUSFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfQ09OVEVOVF9MRU5HVEhcIiwgMTI4KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgZmlsZSB0aGF0IHdhcyB0b28gbGFyZ2UuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZJTEVfVE9PX0xBUkdFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRklMRV9UT09fTEFSR0VcIiwgMTI5KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGVycm9yIHNhdmluZyBhIGZpbGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZJTEVfU0FWRV9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkZJTEVfU0FWRV9FUlJPUlwiLCAxMzApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHVuaXF1ZSBmaWVsZCB3YXMgZ2l2ZW4gYSB2YWx1ZSB0aGF0IGlzXG4gKiBhbHJlYWR5IHRha2VuLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBEVVBMSUNBVEVfVkFMVUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJEVVBMSUNBVEVfVkFMVUVcIiwgMTM3KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSByb2xlJ3MgbmFtZSBpcyBpbnZhbGlkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX1JPTEVfTkFNRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfUk9MRV9OQU1FXCIsIDEzOSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGFuIGFwcGxpY2F0aW9uIHF1b3RhIHdhcyBleGNlZWRlZC4gIFVwZ3JhZGUgdG9cbiAqIHJlc29sdmUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEVYQ0VFREVEX1FVT1RBXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRVhDRUVERURfUVVPVEFcIiwgMTQwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBDbG91ZCBDb2RlIHNjcmlwdCBmYWlsZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFNDUklQVF9GQUlMRURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJTQ1JJUFRfRkFJTEVEXCIsIDE0MSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgQ2xvdWQgQ29kZSB2YWxpZGF0aW9uIGZhaWxlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gVkFMSURBVElPTl9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlZBTElEQVRJT05fRVJST1JcIiwgMTQyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgaW52YWxpZCBpbWFnZSBkYXRhIHdhcyBwcm92aWRlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9JTUFHRV9EQVRBXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9JTUFHRV9EQVRBXCIsIDE0Myk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiB1bnNhdmVkIGZpbGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFVOU0FWRURfRklMRV9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlVOU0FWRURfRklMRV9FUlJPUlwiLCAxNTEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBwdXNoIHRpbWUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfUFVTSF9USU1FX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9QVVNIX1RJTUVfRVJST1JcIiwgMTUyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGVycm9yIGRlbGV0aW5nIGEgZmlsZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRklMRV9ERUxFVEVfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJGSUxFX0RFTEVURV9FUlJPUlwiLCAxNTMpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gZXJyb3IgZGVsZXRpbmcgYW4gdW5uYW1lZCBmaWxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGSUxFX0RFTEVURV9VTk5BTUVEX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRklMRV9ERUxFVEVfVU5OQU1FRF9FUlJPUlwiLCAxNjEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gaGFzIGV4Y2VlZGVkIGl0cyByZXF1ZXN0XG4gKiBsaW1pdC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gUkVRVUVTVF9MSU1JVF9FWENFRURFRFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlJFUVVFU1RfTElNSVRfRVhDRUVERURcIiwgMTU1KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3Qgd2FzIGEgZHVwbGljYXRlIGFuZCBoYXMgYmVlbiBkaXNjYXJkZWQgZHVlIHRvXG4gKiBpZGVtcG90ZW5jeSBydWxlcy5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRFVQTElDQVRFX1JFUVVFU1RcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJEVVBMSUNBVEVfUkVRVUVTVFwiLCAxNTkpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBldmVudCBuYW1lLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0VWRU5UX05BTUVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0VWRU5UX05BTUVcIiwgMTYwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBmaWVsZCBoYWQgYW4gaW52YWxpZCB2YWx1ZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9WQUxVRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfVkFMVUVcIiwgMTYyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXJuYW1lIGlzIG1pc3Npbmcgb3IgZW1wdHkuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFVTRVJOQU1FX01JU1NJTkdcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJVU0VSTkFNRV9NSVNTSU5HXCIsIDIwMCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBwYXNzd29yZCBpcyBtaXNzaW5nIG9yIGVtcHR5LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBQQVNTV09SRF9NSVNTSU5HXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiUEFTU1dPUkRfTUlTU0lOR1wiLCAyMDEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlcm5hbWUgaGFzIGFscmVhZHkgYmVlbiB0YWtlbi5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gVVNFUk5BTUVfVEFLRU5cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJVU0VSTkFNRV9UQUtFTlwiLCAyMDIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgZW1haWwgaGFzIGFscmVhZHkgYmVlbiB0YWtlbi5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRU1BSUxfVEFLRU5cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJFTUFJTF9UQUtFTlwiLCAyMDMpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgZW1haWwgaXMgbWlzc2luZywgYnV0IG11c3QgYmUgc3BlY2lmaWVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBFTUFJTF9NSVNTSU5HXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRU1BSUxfTUlTU0lOR1wiLCAyMDQpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGVtYWlsIHdhcyBub3QgZm91bmQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEVNQUlMX05PVF9GT1VORFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkVNQUlMX05PVF9GT1VORFwiLCAyMDUpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHVzZXIgb2JqZWN0IHdpdGhvdXQgYSB2YWxpZCBzZXNzaW9uIGNvdWxkXG4gKiBub3QgYmUgYWx0ZXJlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gU0VTU0lPTl9NSVNTSU5HXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiU0VTU0lPTl9NSVNTSU5HXCIsIDIwNik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgdXNlciBjYW4gb25seSBiZSBjcmVhdGVkIHRocm91Z2ggc2lnbnVwLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBNVVNUX0NSRUFURV9VU0VSX1RIUk9VR0hfU0lHTlVQXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTVVTVF9DUkVBVEVfVVNFUl9USFJPVUdIX1NJR05VUFwiLCAyMDcpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhbiBhbiBhY2NvdW50IGJlaW5nIGxpbmtlZCBpcyBhbHJlYWR5IGxpbmtlZFxuICogdG8gYW5vdGhlciB1c2VyLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBBQ0NPVU5UX0FMUkVBRFlfTElOS0VEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiQUNDT1VOVF9BTFJFQURZX0xJTktFRFwiLCAyMDgpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgY3VycmVudCBzZXNzaW9uIHRva2VuIGlzIGludmFsaWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfU0VTU0lPTl9UT0tFTlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfU0VTU0lPTl9UT0tFTlwiLCAyMDkpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gZXJyb3IgZW5hYmxpbmcgb3IgdmVyaWZ5aW5nIE1GQVxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBNRkFfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJNRkFfRVJST1JcIiwgMjEwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB2YWxpZCBNRkEgdG9rZW4gbXVzdCBiZSBwcm92aWRlZFxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBNRkFfVE9LRU5fUkVRVUlSRURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJNRkFfVE9LRU5fUkVRVUlSRURcIiwgMjExKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB1c2VyIGNhbm5vdCBiZSBsaW5rZWQgdG8gYW4gYWNjb3VudCBiZWNhdXNlXG4gKiB0aGF0IGFjY291bnQncyBpZCBjb3VsZCBub3QgYmUgZm91bmQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IExJTktFRF9JRF9NSVNTSU5HXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiTElOS0VEX0lEX01JU1NJTkdcIiwgMjUwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB1c2VyIHdpdGggYSBsaW5rZWQgKGUuZy4gRmFjZWJvb2spIGFjY291bnRcbiAqIGhhcyBhbiBpbnZhbGlkIHNlc3Npb24uXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfTElOS0VEX1NFU1NJT05cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0xJTktFRF9TRVNTSU9OXCIsIDI1MSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgc2VydmljZSBiZWluZyBsaW5rZWQgKGUuZy4gRmFjZWJvb2sgb3JcbiAqIFR3aXR0ZXIpIGlzIHVuc3VwcG9ydGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBVTlNVUFBPUlRFRF9TRVJWSUNFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiVU5TVVBQT1JURURfU0VSVklDRVwiLCAyNTIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gaW52YWxpZCBvcGVyYXRpb24gb2NjdXJlZCBvbiBzY2hlbWFcbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9TQ0hFTUFfT1BFUkFUSU9OXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9TQ0hFTUFfT1BFUkFUSU9OXCIsIDI1NSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZXJlIHdlcmUgbXVsdGlwbGUgZXJyb3JzLiBBZ2dyZWdhdGUgZXJyb3JzXG4gKiBoYXZlIGFuIFwiZXJyb3JzXCIgcHJvcGVydHksIHdoaWNoIGlzIGFuIGFycmF5IG9mIGVycm9yIG9iamVjdHMgd2l0aCBtb3JlXG4gKiBkZXRhaWwgYWJvdXQgZWFjaCBlcnJvciB0aGF0IG9jY3VycmVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBBR0dSRUdBVEVfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJBR0dSRUdBVEVfRVJST1JcIiwgNjAwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSBjbGllbnQgd2FzIHVuYWJsZSB0byByZWFkIGFuIGlucHV0IGZpbGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZJTEVfUkVBRF9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkZJTEVfUkVBRF9FUlJPUlwiLCA2MDEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYSByZWFsIGVycm9yIGNvZGUgaXMgdW5hdmFpbGFibGUgYmVjYXVzZVxuICogd2UgaGFkIHRvIHVzZSBhbiBYRG9tYWluUmVxdWVzdCBvYmplY3QgdG8gYWxsb3cgQ09SUyByZXF1ZXN0cyBpblxuICogSW50ZXJuZXQgRXhwbG9yZXIsIHdoaWNoIHN0cmlwcyB0aGUgYm9keSBmcm9tIEhUVFAgcmVzcG9uc2VzIHRoYXQgaGF2ZVxuICogYSBub24tMlhYIHN0YXR1cyBjb2RlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBYX0RPTUFJTl9SRVFVRVNUXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiWF9ET01BSU5fUkVRVUVTVFwiLCA2MDIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VFcnJvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX3NsaWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zbGljZVwiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfWGhyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9YaHIud2VhcHBcIikpO1xuLyogZ2xvYmFsIFhNTEh0dHBSZXF1ZXN0LCBCbG9iICovXG5cbmxldCBYSFIgPSBudWxsO1xuaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgWEhSID0gWE1MSHR0cFJlcXVlc3Q7XG59XG5mdW5jdGlvbiBiNjREaWdpdChudW1iZXIpIHtcbiAgaWYgKG51bWJlciA8IDI2KSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyBudW1iZXIpO1xuICB9XG4gIGlmIChudW1iZXIgPCA1Mikge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDk3ICsgKG51bWJlciAtIDI2KSk7XG4gIH1cbiAgaWYgKG51bWJlciA8IDYyKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoNDggKyAobnVtYmVyIC0gNTIpKTtcbiAgfVxuICBpZiAobnVtYmVyID09PSA2Mikge1xuICAgIHJldHVybiAnKyc7XG4gIH1cbiAgaWYgKG51bWJlciA9PT0gNjMpIHtcbiAgICByZXR1cm4gJy8nO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIGVuY29kZSBsYXJnZSBkaWdpdCAnICsgbnVtYmVyICsgJyBpbiBiYXNlNjQuJyk7XG59XG5cbi8qKlxuICogQSBQYXJzZS5GaWxlIGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpb24gb2YgYSBmaWxlIHRoYXQgaXMgc2F2ZWQgdG8gdGhlIFBhcnNlXG4gKiBjbG91ZC5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuRmlsZVxuICovXG5jbGFzcyBQYXJzZUZpbGUge1xuICAvKipcbiAgICogQHBhcmFtIG5hbWUge1N0cmluZ30gVGhlIGZpbGUncyBuYW1lLiBUaGlzIHdpbGwgYmUgcHJlZml4ZWQgYnkgYSB1bmlxdWVcbiAgICogICAgIHZhbHVlIG9uY2UgdGhlIGZpbGUgaGFzIGZpbmlzaGVkIHNhdmluZy4gVGhlIGZpbGUgbmFtZSBtdXN0IGJlZ2luIHdpdGhcbiAgICogICAgIGFuIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIsIGFuZCBjb25zaXN0IG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLFxuICAgKiAgICAgcGVyaW9kcywgc3BhY2VzLCB1bmRlcnNjb3Jlcywgb3IgZGFzaGVzLlxuICAgKiBAcGFyYW0gZGF0YSB7QXJyYXl9IFRoZSBkYXRhIGZvciB0aGUgZmlsZSwgYXMgZWl0aGVyOlxuICAgKiAgICAgMS4gYW4gQXJyYXkgb2YgYnl0ZSB2YWx1ZSBOdW1iZXJzLCBvclxuICAgKiAgICAgMi4gYW4gT2JqZWN0IGxpa2UgeyBiYXNlNjQ6IFwiLi4uXCIgfSB3aXRoIGEgYmFzZTY0LWVuY29kZWQgU3RyaW5nLlxuICAgKiAgICAgMy4gYW4gT2JqZWN0IGxpa2UgeyB1cmk6IFwiLi4uXCIgfSB3aXRoIGEgdXJpIFN0cmluZy5cbiAgICogICAgIDQuIGEgRmlsZSBvYmplY3Qgc2VsZWN0ZWQgd2l0aCBhIGZpbGUgdXBsb2FkIGNvbnRyb2wuICgzKSBvbmx5IHdvcmtzXG4gICAqICAgICAgICBpbiBGaXJlZm94IDMuNissIFNhZmFyaSA2LjAuMissIENocm9tZSA3KywgYW5kIElFIDEwKy5cbiAgICogICAgICAgIEZvciBleGFtcGxlOlxuICAgKiA8cHJlPlxuICAgKiB2YXIgZmlsZVVwbG9hZENvbnRyb2wgPSAkKFwiI3Byb2ZpbGVQaG90b0ZpbGVVcGxvYWRcIilbMF07XG4gICAqIGlmIChmaWxlVXBsb2FkQ29udHJvbC5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAqICAgdmFyIGZpbGUgPSBmaWxlVXBsb2FkQ29udHJvbC5maWxlc1swXTtcbiAgICogICB2YXIgbmFtZSA9IFwicGhvdG8uanBnXCI7XG4gICAqICAgdmFyIHBhcnNlRmlsZSA9IG5ldyBQYXJzZS5GaWxlKG5hbWUsIGZpbGUpO1xuICAgKiAgIHBhcnNlRmlsZS5zYXZlKCkudGhlbihmdW5jdGlvbigpIHtcbiAgICogICAgIC8vIFRoZSBmaWxlIGhhcyBiZWVuIHNhdmVkIHRvIFBhcnNlLlxuICAgKiAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAqICAgICAvLyBUaGUgZmlsZSBlaXRoZXIgY291bGQgbm90IGJlIHJlYWQsIG9yIGNvdWxkIG5vdCBiZSBzYXZlZCB0byBQYXJzZS5cbiAgICogICB9KTtcbiAgICogfTwvcHJlPlxuICAgKiBAcGFyYW0gdHlwZSB7U3RyaW5nfSBPcHRpb25hbCBDb250ZW50LVR5cGUgaGVhZGVyIHRvIHVzZSBmb3IgdGhlIGZpbGUuIElmXG4gICAqICAgICB0aGlzIGlzIG9taXR0ZWQsIHRoZSBjb250ZW50IHR5cGUgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSBuYW1lJ3NcbiAgICogICAgIGV4dGVuc2lvbi5cbiAgICogQHBhcmFtIG1ldGFkYXRhIHtvYmplY3R9IE9wdGlvbmFsIGtleSB2YWx1ZSBwYWlycyB0byBiZSBzdG9yZWQgd2l0aCBmaWxlIG9iamVjdFxuICAgKiBAcGFyYW0gdGFncyB7b2JqZWN0fSBPcHRpb25hbCBrZXkgdmFsdWUgcGFpcnMgdG8gYmUgc3RvcmVkIHdpdGggZmlsZSBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRhdGEsIHR5cGUsIG1ldGFkYXRhLCB0YWdzKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfbmFtZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3VybFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3NvdXJjZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3ByZXZpb3VzU2F2ZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2RhdGFcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9yZXF1ZXN0VGFza1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX21ldGFkYXRhXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdGFnc1wiLCB2b2lkIDApO1xuICAgIGNvbnN0IHNwZWNpZmllZFR5cGUgPSB0eXBlIHx8ICcnO1xuICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICAgIHRoaXMuX21ldGFkYXRhID0gbWV0YWRhdGEgfHwge307XG4gICAgdGhpcy5fdGFncyA9IHRhZ3MgfHwge307XG4gICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShkYXRhKSkge1xuICAgICAgICB0aGlzLl9kYXRhID0gUGFyc2VGaWxlLmVuY29kZUJhc2U2NChkYXRhKTtcbiAgICAgICAgdGhpcy5fc291cmNlID0ge1xuICAgICAgICAgIGZvcm1hdDogJ2Jhc2U2NCcsXG4gICAgICAgICAgYmFzZTY0OiB0aGlzLl9kYXRhLFxuICAgICAgICAgIHR5cGU6IHNwZWNpZmllZFR5cGVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHtcbiAgICAgICAgICBmb3JtYXQ6ICdmaWxlJyxcbiAgICAgICAgICBmaWxlOiBkYXRhLFxuICAgICAgICAgIHR5cGU6IHNwZWNpZmllZFR5cGVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YS51cmkgPT09ICdzdHJpbmcnICYmIGRhdGEudXJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fc291cmNlID0ge1xuICAgICAgICAgIGZvcm1hdDogJ3VyaScsXG4gICAgICAgICAgdXJpOiBkYXRhLnVyaSxcbiAgICAgICAgICB0eXBlOiBzcGVjaWZpZWRUeXBlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEuYmFzZTY0ID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgX2NvbnRleHQsIF9jb250ZXh0MiwgX2NvbnRleHQzO1xuICAgICAgICBjb25zdCBiYXNlNjQgPSAoMCwgX3NsaWNlLmRlZmF1bHQpKF9jb250ZXh0ID0gZGF0YS5iYXNlNjQuc3BsaXQoJywnKSkuY2FsbChfY29udGV4dCwgLTEpWzBdO1xuICAgICAgICBjb25zdCBkYXRhVHlwZSA9IHNwZWNpZmllZFR5cGUgfHwgKDAsIF9zbGljZS5kZWZhdWx0KShfY29udGV4dDIgPSAoMCwgX3NsaWNlLmRlZmF1bHQpKF9jb250ZXh0MyA9IGRhdGEuYmFzZTY0LnNwbGl0KCc7JykpLmNhbGwoX2NvbnRleHQzLCAwLCAxKVswXS5zcGxpdCgnOicpKS5jYWxsKF9jb250ZXh0MiwgMSwgMilbMF0gfHwgJ3RleHQvcGxhaW4nO1xuICAgICAgICB0aGlzLl9kYXRhID0gYmFzZTY0O1xuICAgICAgICB0aGlzLl9zb3VyY2UgPSB7XG4gICAgICAgICAgZm9ybWF0OiAnYmFzZTY0JyxcbiAgICAgICAgICBiYXNlNjQsXG4gICAgICAgICAgdHlwZTogZGF0YVR5cGVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBQYXJzZS5GaWxlIHdpdGggdGhhdCBkYXRhLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSBmaWxlLCBkb3dubG9hZGluZyBpdCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LlxuICAgKiBEYXRhIGlzIHByZXNlbnQgaWYgaW5pdGlhbGl6ZWQgd2l0aCBCeXRlIEFycmF5LCBCYXNlNjQgb3IgU2F2ZWQgd2l0aCBVcmkuXG4gICAqIERhdGEgaXMgY2xlYXJlZCBpZiBzYXZlZCB3aXRoIEZpbGUgb2JqZWN0IHNlbGVjdGVkIHdpdGggYSBmaWxlIHVwbG9hZCBjb250cm9sXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZSB3aXRoIGJhc2U2NCBkYXRhXG4gICAqL1xuICBhc3luYyBnZXREYXRhKCkge1xuICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl91cmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJldHJpZXZlIGRhdGEgZm9yIHVuc2F2ZWQgUGFyc2VGaWxlLicpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RmlsZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb250cm9sbGVyLmRvd25sb2FkKHRoaXMuX3VybCwge1xuICAgICAgcmVxdWVzdFRhc2s6IHRhc2sgPT4gdGhpcy5fcmVxdWVzdFRhc2sgPSB0YXNrXG4gICAgfSk7XG4gICAgdGhpcy5fZGF0YSA9IHJlc3VsdC5iYXNlNjQ7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gQmVmb3JlIHNhdmUgaXMgY2FsbGVkLCB0aGlzIGlzIHRoZSBmaWxlbmFtZVxuICAgKiBnaXZlbiBieSB0aGUgdXNlci4gQWZ0ZXIgc2F2ZSBpcyBjYWxsZWQsIHRoYXQgbmFtZSBnZXRzIHByZWZpeGVkIHdpdGggYVxuICAgKiB1bmlxdWUgaWRlbnRpZmllci5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdXJsIG9mIHRoZSBmaWxlLiBJdCBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB5b3Ugc2F2ZSB0aGUgZmlsZSBvclxuICAgKiBhZnRlciB5b3UgZ2V0IHRoZSBmaWxlIGZyb20gYSBQYXJzZS5PYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIEFuIG9iamVjdCB0byBzcGVjaWZ5IHVybCBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZm9yY2VTZWN1cmVdIGZvcmNlIHRoZSB1cmwgdG8gYmUgc2VjdXJlXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqL1xuICB1cmwob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmICghdGhpcy5fdXJsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZvcmNlU2VjdXJlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdXJsLnJlcGxhY2UoL15odHRwOlxcL1xcLy9pLCAnaHR0cHM6Ly8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbWV0YWRhdGEgb2YgdGhlIGZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICBtZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGFncyBvZiB0aGUgZmlsZS5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHRhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ3M7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIGZpbGUgdG8gdGhlIFBhcnNlIGNsb3VkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPnByb2dyZXNzOiBJbiBCcm93c2VyIG9ubHksIGNhbGxiYWNrIGZvciB1cGxvYWQgcHJvZ3Jlc3MuIEZvciBleGFtcGxlOlxuICAgKiA8cHJlPlxuICAgKiBsZXQgcGFyc2VGaWxlID0gbmV3IFBhcnNlLkZpbGUobmFtZSwgZmlsZSk7XG4gICAqIHBhcnNlRmlsZS5zYXZlKHtcbiAgICogICBwcm9ncmVzczogKHByb2dyZXNzVmFsdWUsIGxvYWRlZCwgdG90YWwsIHsgdHlwZSB9KSA9PiB7XG4gICAqICAgICBpZiAodHlwZSA9PT0gXCJ1cGxvYWRcIiAmJiBwcm9ncmVzc1ZhbHVlICE9PSBudWxsKSB7XG4gICAqICAgICAgIC8vIFVwZGF0ZSB0aGUgVUkgdXNpbmcgcHJvZ3Jlc3NWYWx1ZVxuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIDwvcHJlPlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZSB8IHVuZGVmaW5lZH0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIHNhdmUgZmluaXNoZXMuXG4gICAqL1xuICBzYXZlKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLnJlcXVlc3RUYXNrID0gdGFzayA9PiB0aGlzLl9yZXF1ZXN0VGFzayA9IHRhc2s7XG4gICAgb3B0aW9ucy5tZXRhZGF0YSA9IHRoaXMuX21ldGFkYXRhO1xuICAgIG9wdGlvbnMudGFncyA9IHRoaXMuX3RhZ3M7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEZpbGVDb250cm9sbGVyKCk7XG4gICAgaWYgKCF0aGlzLl9wcmV2aW91c1NhdmUpIHtcbiAgICAgIGlmICh0aGlzLl9zb3VyY2UuZm9ybWF0ID09PSAnZmlsZScpIHtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTYXZlID0gY29udHJvbGxlci5zYXZlRmlsZSh0aGlzLl9uYW1lLCB0aGlzLl9zb3VyY2UsIG9wdGlvbnMpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLl9uYW1lID0gcmVzLm5hbWU7XG4gICAgICAgICAgdGhpcy5fdXJsID0gcmVzLnVybDtcbiAgICAgICAgICB0aGlzLl9kYXRhID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2UuZm9ybWF0ID09PSAndXJpJykge1xuICAgICAgICB0aGlzLl9wcmV2aW91c1NhdmUgPSBjb250cm9sbGVyLmRvd25sb2FkKHRoaXMuX3NvdXJjZS51cmksIG9wdGlvbnMpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIShyZXN1bHQgJiYgcmVzdWx0LmJhc2U2NCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbmV3U291cmNlID0ge1xuICAgICAgICAgICAgZm9ybWF0OiAnYmFzZTY0JyxcbiAgICAgICAgICAgIGJhc2U2NDogcmVzdWx0LmJhc2U2NCxcbiAgICAgICAgICAgIHR5cGU6IHJlc3VsdC5jb250ZW50VHlwZVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fZGF0YSA9IHJlc3VsdC5iYXNlNjQ7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgICAgIHJldHVybiBjb250cm9sbGVyLnNhdmVCYXNlNjQodGhpcy5fbmFtZSwgbmV3U291cmNlLCBvcHRpb25zKTtcbiAgICAgICAgfSkudGhlbihyZXMgPT4ge1xuICAgICAgICAgIHRoaXMuX25hbWUgPSByZXMubmFtZTtcbiAgICAgICAgICB0aGlzLl91cmwgPSByZXMudXJsO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9wcmV2aW91c1NhdmUgPSBjb250cm9sbGVyLnNhdmVCYXNlNjQodGhpcy5fbmFtZSwgdGhpcy5fc291cmNlLCBvcHRpb25zKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5fbmFtZSA9IHJlcy5uYW1lO1xuICAgICAgICAgIHRoaXMuX3VybCA9IHJlcy51cmw7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZXZpb3VzU2F2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ByZXZpb3VzU2F2ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIHRoZSByZXF1ZXN0IGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gc2VudC5cbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICBpZiAodGhpcy5fcmVxdWVzdFRhc2sgJiYgdHlwZW9mIHRoaXMuX3JlcXVlc3RUYXNrLmFib3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0VGFzay5fYWJvcnRlZCA9IHRydWU7XG4gICAgICB0aGlzLl9yZXF1ZXN0VGFzay5hYm9ydCgpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0VGFzayA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgZmlsZSBmcm9tIHRoZSBQYXJzZSBjbG91ZC5cbiAgICogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5IHdpdGggTWFzdGVyIEtleS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqIDxwcmU+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgZGVsZXRlIGZpbmlzaGVzLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgaWYgKCF0aGlzLl9uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LkZJTEVfREVMRVRFX1VOTkFNRURfRVJST1IsICdDYW5ub3QgZGVsZXRlIGFuIHVubmFtZWQgZmlsZS4nKTtcbiAgICB9XG4gICAgY29uc3QgZGVzdHJveU9wdGlvbnMgPSB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZGVzdHJveU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gISFvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEZpbGVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZGVsZXRlRmlsZSh0aGlzLl9uYW1lLCBkZXN0cm95T3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9kYXRhID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdGaWxlJyxcbiAgICAgIG5hbWU6IHRoaXMuX25hbWUsXG4gICAgICB1cmw6IHRoaXMuX3VybFxuICAgIH07XG4gIH1cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKHRoaXMgPT09IG90aGVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gVW5zYXZlZCBGaWxlcyBhcmUgbmV2ZXIgZXF1YWwsIHNpbmNlIHRoZXkgd2lsbCBiZSBzYXZlZCB0byBkaWZmZXJlbnQgVVJMc1xuICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFBhcnNlRmlsZSAmJiB0aGlzLm5hbWUoKSA9PT0gb3RoZXIubmFtZSgpICYmIHRoaXMudXJsKCkgPT09IG90aGVyLnVybCgpICYmIHR5cGVvZiB0aGlzLnVybCgpICE9PSAndW5kZWZpbmVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIG1ldGFkYXRhIHRvIGJlIHNhdmVkIHdpdGggZmlsZSBvYmplY3QuIE92ZXJ3cml0ZXMgZXhpc3RpbmcgbWV0YWRhdGFcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG1ldGFkYXRhIEtleSB2YWx1ZSBwYWlycyB0byBiZSBzdG9yZWQgd2l0aCBmaWxlIG9iamVjdFxuICAgKi9cbiAgc2V0TWV0YWRhdGEobWV0YWRhdGEpIHtcbiAgICBpZiAobWV0YWRhdGEgJiYgdHlwZW9mIG1ldGFkYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIF9jb250ZXh0NDtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDQgPSAoMCwgX2tleXMuZGVmYXVsdCkobWV0YWRhdGEpKS5jYWxsKF9jb250ZXh0NCwga2V5ID0+IHtcbiAgICAgICAgdGhpcy5hZGRNZXRhZGF0YShrZXksIG1ldGFkYXRhW2tleV0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbWV0YWRhdGEgdG8gYmUgc2F2ZWQgd2l0aCBmaWxlIG9iamVjdC4gQWRkcyB0byBleGlzdGluZyBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBrZXkgdG8gc3RvcmUgdGhlIG1ldGFkYXRhXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgbWV0YWRhdGFcbiAgICovXG4gIGFkZE1ldGFkYXRhKGtleSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX21ldGFkYXRhW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0YWdzIHRvIGJlIHNhdmVkIHdpdGggZmlsZSBvYmplY3QuIE92ZXJ3cml0ZXMgZXhpc3RpbmcgdGFnc1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gdGFncyBLZXkgdmFsdWUgcGFpcnMgdG8gYmUgc3RvcmVkIHdpdGggZmlsZSBvYmplY3RcbiAgICovXG4gIHNldFRhZ3ModGFncykge1xuICAgIGlmICh0YWdzICYmIHR5cGVvZiB0YWdzID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIF9jb250ZXh0NTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDUgPSAoMCwgX2tleXMuZGVmYXVsdCkodGFncykpLmNhbGwoX2NvbnRleHQ1LCBrZXkgPT4ge1xuICAgICAgICB0aGlzLmFkZFRhZyhrZXksIHRhZ3Nba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0YWdzIHRvIGJlIHNhdmVkIHdpdGggZmlsZSBvYmplY3QuIEFkZHMgdG8gZXhpc3RpbmcgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBrZXkgdG8gc3RvcmUgdGFnc1xuICAgKiBAcGFyYW0geyp9IHZhbHVlIHRhZ1xuICAgKi9cbiAgYWRkVGFnKGtleSwgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3RhZ3Nba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZnJvbUpTT04ob2JqKSB7XG4gICAgaWYgKG9iai5fX3R5cGUgIT09ICdGaWxlJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSlNPTiBvYmplY3QgZG9lcyBub3QgcmVwcmVzZW50IGEgUGFyc2VGaWxlJyk7XG4gICAgfVxuICAgIGNvbnN0IGZpbGUgPSBuZXcgUGFyc2VGaWxlKG9iai5uYW1lKTtcbiAgICBmaWxlLl91cmwgPSBvYmoudXJsO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG4gIHN0YXRpYyBlbmNvZGVCYXNlNjQoYnl0ZXMpIHtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICBjaHVua3MubGVuZ3RoID0gTWF0aC5jZWlsKGJ5dGVzLmxlbmd0aCAvIDMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBiMSA9IGJ5dGVzW2kgKiAzXTtcbiAgICAgIGNvbnN0IGIyID0gYnl0ZXNbaSAqIDMgKyAxXSB8fCAwO1xuICAgICAgY29uc3QgYjMgPSBieXRlc1tpICogMyArIDJdIHx8IDA7XG4gICAgICBjb25zdCBoYXMyID0gaSAqIDMgKyAxIDwgYnl0ZXMubGVuZ3RoO1xuICAgICAgY29uc3QgaGFzMyA9IGkgKiAzICsgMiA8IGJ5dGVzLmxlbmd0aDtcbiAgICAgIGNodW5rc1tpXSA9IFtiNjREaWdpdChiMSA+PiAyICYgMHgzZiksIGI2NERpZ2l0KGIxIDw8IDQgJiAweDMwIHwgYjIgPj4gNCAmIDB4MGYpLCBoYXMyID8gYjY0RGlnaXQoYjIgPDwgMiAmIDB4M2MgfCBiMyA+PiA2ICYgMHgwMykgOiAnPScsIGhhczMgPyBiNjREaWdpdChiMyAmIDB4M2YpIDogJz0nXS5qb2luKCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNodW5rcy5qb2luKCcnKTtcbiAgfVxufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIHNhdmVGaWxlOiBhc3luYyBmdW5jdGlvbiAobmFtZSwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgaWYgKHNvdXJjZS5mb3JtYXQgIT09ICdmaWxlJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzYXZlRmlsZSBjYW4gb25seSBiZSB1c2VkIHdpdGggRmlsZS10eXBlIHNvdXJjZXMuJyk7XG4gICAgfVxuICAgIGNvbnN0IGJhc2U2NERhdGEgPSBhd2FpdCBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzLCByZWopID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXMocmVhZGVyLnJlc3VsdCk7XG4gICAgICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlaihlcnJvcik7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChzb3VyY2UuZmlsZSk7XG4gICAgfSk7XG4gICAgLy8gd2Ugb25seSB3YW50IHRoZSBkYXRhIGFmdGVyIHRoZSBjb21tYVxuICAgIC8vIEZvciBleGFtcGxlOiBcImRhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCxKVkJFUmkweExqUUtKLi4uXCIgd2Ugd291bGQgb25seSB3YW50IFwiSlZCRVJpMHhMalFLSi4uLlwiXG4gICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gYmFzZTY0RGF0YS5zcGxpdCgnLCcpO1xuICAgIC8vIGluIHRoZSBldmVudCB0aGVyZSBpcyBubyAnZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LCcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmFzZTY0IHN0cmluZ1xuICAgIC8vIHVzZSB0aGUgZW50aXJlIHN0cmluZyBpbnN0ZWFkXG4gICAgY29uc3QgZGF0YSA9IHNlY29uZCA/IHNlY29uZCA6IGZpcnN0O1xuICAgIGNvbnN0IG5ld1NvdXJjZSA9IHtcbiAgICAgIGZvcm1hdDogJ2Jhc2U2NCcsXG4gICAgICBiYXNlNjQ6IGRhdGEsXG4gICAgICB0eXBlOiBzb3VyY2UudHlwZSB8fCAoc291cmNlLmZpbGUgPyBzb3VyY2UuZmlsZS50eXBlIDogdW5kZWZpbmVkKVxuICAgIH07XG4gICAgcmV0dXJuIGF3YWl0IERlZmF1bHRDb250cm9sbGVyLnNhdmVCYXNlNjQobmFtZSwgbmV3U291cmNlLCBvcHRpb25zKTtcbiAgfSxcbiAgc2F2ZUJhc2U2NDogZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBpZiAoc291cmNlLmZvcm1hdCAhPT0gJ2Jhc2U2NCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2F2ZUJhc2U2NCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFzZTY0LXR5cGUgc291cmNlcy4nKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGJhc2U2NDogc291cmNlLmJhc2U2NCxcbiAgICAgIGZpbGVEYXRhOiB7XG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgLi4ub3B0aW9ucy5tZXRhZGF0YVxuICAgICAgICB9LFxuICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgLi4ub3B0aW9ucy50YWdzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGRlbGV0ZSBvcHRpb25zLm1ldGFkYXRhO1xuICAgIGRlbGV0ZSBvcHRpb25zLnRhZ3M7XG4gICAgaWYgKHNvdXJjZS50eXBlKSB7XG4gICAgICBkYXRhLl9Db250ZW50VHlwZSA9IHNvdXJjZS50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5yZXF1ZXN0KCdQT1NUJywgJ2ZpbGVzLycgKyBuYW1lLCBkYXRhLCBvcHRpb25zKTtcbiAgfSxcbiAgZG93bmxvYWQ6IGZ1bmN0aW9uICh1cmksIG9wdGlvbnMpIHtcbiAgICBpZiAoWEhSKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb3dubG9hZEFqYXgodXJpLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdDYW5ub3QgbWFrZSBhIHJlcXVlc3Q6IE5vIGRlZmluaXRpb24gb2YgWE1MSHR0cFJlcXVlc3Qgd2FzIGZvdW5kLicpO1xuICAgIH1cbiAgfSxcbiAgZG93bmxvYWRBamF4OiBmdW5jdGlvbiAodXJpLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHhociA9IG5ldyBYSFIoKTtcbiAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmksIHRydWUpO1xuICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH07XG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHhoci5ET05FKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5yZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHRoaXMucmVzcG9uc2UpO1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBiYXNlNjQ6IFBhcnNlRmlsZS5lbmNvZGVCYXNlNjQoYnl0ZXMpLFxuICAgICAgICAgIGNvbnRlbnRUeXBlOiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2NvbnRlbnQtdHlwZScpXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIG9wdGlvbnMucmVxdWVzdFRhc2soeGhyKTtcbiAgICAgIHhoci5zZW5kKCk7XG4gICAgfSk7XG4gIH0sXG4gIGRlbGV0ZUZpbGU6IGZ1bmN0aW9uIChuYW1lLCBvcHRpb25zKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdYLVBhcnNlLUFwcGxpY2F0aW9uLUlEJzogX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBUFBMSUNBVElPTl9JRCcpXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy51c2VNYXN0ZXJLZXkpIHtcbiAgICAgIGhlYWRlcnNbJ1gtUGFyc2UtTWFzdGVyLUtleSddID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdNQVNURVJfS0VZJyk7XG4gICAgfVxuICAgIGxldCB1cmwgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9VUkwnKTtcbiAgICBpZiAodXJsW3VybC5sZW5ndGggLSAxXSAhPT0gJy8nKSB7XG4gICAgICB1cmwgKz0gJy8nO1xuICAgIH1cbiAgICB1cmwgKz0gJ2ZpbGVzLycgKyBuYW1lO1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLmFqYXgoJ0RFTEVURScsIHVybCwgJycsIGhlYWRlcnMpLmNhdGNoKHJlc3BvbnNlID0+IHtcbiAgICAgIC8vIFRPRE86IHJldHVybiBKU09OIG9iamVjdCBpbiBzZXJ2ZXJcbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2UgPT09ICdTeW50YXhFcnJvcjogVW5leHBlY3RlZCBlbmQgb2YgSlNPTiBpbnB1dCcpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkuaGFuZGxlRXJyb3IocmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICBfc2V0WEhSKHhocikge1xuICAgIFhIUiA9IHhocjtcbiAgfSxcbiAgX2dldFhIUigpIHtcbiAgICByZXR1cm4gWEhSO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0RmlsZUNvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VGaWxlO1xuZXhwb3J0cy5iNjREaWdpdCA9IGI2NERpZ2l0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgR2VvUG9pbnQgd2l0aCBhbnkgb2YgdGhlIGZvbGxvd2luZyBmb3Jtczo8YnI+XG4gKiAgIDxwcmU+XG4gKiAgIG5ldyBHZW9Qb2ludChvdGhlckdlb1BvaW50KVxuICogICBuZXcgR2VvUG9pbnQoMzAsIDMwKVxuICogICBuZXcgR2VvUG9pbnQoWzMwLCAzMF0pXG4gKiAgIG5ldyBHZW9Qb2ludCh7bGF0aXR1ZGU6IDMwLCBsb25naXR1ZGU6IDMwfSlcbiAqICAgbmV3IEdlb1BvaW50KCkgIC8vIGRlZmF1bHRzIHRvICgwLCAwKVxuICogICA8L3ByZT5cbiAqIDxwPlJlcHJlc2VudHMgYSBsYXRpdHVkZSAvIGxvbmdpdHVkZSBwb2ludCB0aGF0IG1heSBiZSBhc3NvY2lhdGVkXG4gKiB3aXRoIGEga2V5IGluIGEgUGFyc2VPYmplY3Qgb3IgdXNlZCBhcyBhIHJlZmVyZW5jZSBwb2ludCBmb3IgZ2VvIHF1ZXJpZXMuXG4gKiBUaGlzIGFsbG93cyBwcm94aW1pdHktYmFzZWQgcXVlcmllcyBvbiB0aGUga2V5LjwvcD5cbiAqXG4gKiA8cD5Pbmx5IG9uZSBrZXkgaW4gYSBjbGFzcyBtYXkgY29udGFpbiBhIEdlb1BvaW50LjwvcD5cbiAqXG4gKiA8cD5FeGFtcGxlOjxwcmU+XG4gKiAgIHZhciBwb2ludCA9IG5ldyBQYXJzZS5HZW9Qb2ludCgzMC4wLCAtMjAuMCk7XG4gKiAgIHZhciBvYmplY3QgPSBuZXcgUGFyc2UuT2JqZWN0KFwiUGxhY2VPYmplY3RcIik7XG4gKiAgIG9iamVjdC5zZXQoXCJsb2NhdGlvblwiLCBwb2ludCk7XG4gKiAgIG9iamVjdC5zYXZlKCk7PC9wcmU+PC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5HZW9Qb2ludFxuICovXG4vKiBnbG9iYWwgbmF2aWdhdG9yICovXG5jbGFzcyBQYXJzZUdlb1BvaW50IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7KG51bWJlcltdIHwgb2JqZWN0IHwgbnVtYmVyKX0gYXJnMSBFaXRoZXIgYSBsaXN0IG9mIGNvb3JkaW5hdGUgcGFpcnMsIGFuIG9iamVjdCB3aXRoIGBsYXRpdHVkZWAsIGBsb25naXR1ZGVgLCBvciB0aGUgbGF0aXR1ZGUgb3IgdGhlIHBvaW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJnMiBUaGUgbG9uZ2l0dWRlIG9mIHRoZSBHZW9Qb2ludFxuICAgKi9cbiAgY29uc3RydWN0b3IoYXJnMSwgYXJnMikge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2xhdGl0dWRlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfbG9uZ2l0dWRlXCIsIHZvaWQgMCk7XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShhcmcxKSkge1xuICAgICAgUGFyc2VHZW9Qb2ludC5fdmFsaWRhdGUoYXJnMVswXSwgYXJnMVsxXSk7XG4gICAgICB0aGlzLl9sYXRpdHVkZSA9IGFyZzFbMF07XG4gICAgICB0aGlzLl9sb25naXR1ZGUgPSBhcmcxWzFdO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZzEgPT09ICdvYmplY3QnKSB7XG4gICAgICBQYXJzZUdlb1BvaW50Ll92YWxpZGF0ZShhcmcxLmxhdGl0dWRlLCBhcmcxLmxvbmdpdHVkZSk7XG4gICAgICB0aGlzLl9sYXRpdHVkZSA9IGFyZzEubGF0aXR1ZGU7XG4gICAgICB0aGlzLl9sb25naXR1ZGUgPSBhcmcxLmxvbmdpdHVkZTtcbiAgICB9IGVsc2UgaWYgKGFyZzEgIT09IHVuZGVmaW5lZCAmJiBhcmcyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIFBhcnNlR2VvUG9pbnQuX3ZhbGlkYXRlKGFyZzEsIGFyZzIpO1xuICAgICAgdGhpcy5fbGF0aXR1ZGUgPSBhcmcxO1xuICAgICAgdGhpcy5fbG9uZ2l0dWRlID0gYXJnMjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGF0aXR1ZGUgPSAwO1xuICAgICAgdGhpcy5fbG9uZ2l0dWRlID0gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ydGgtc291dGggcG9ydGlvbiBvZiB0aGUgY29vcmRpbmF0ZSwgaW4gcmFuZ2UgWy05MCwgOTBdLlxuICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHNldCBvdXQgb2YgcmFuZ2UgaW4gYSBtb2Rlcm4gYnJvd3Nlci5cbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGxhdGl0dWRlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbGF0aXR1ZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhdGl0dWRlO1xuICB9XG4gIHNldCBsYXRpdHVkZSh2YWwpIHtcbiAgICBQYXJzZUdlb1BvaW50Ll92YWxpZGF0ZSh2YWwsIHRoaXMubG9uZ2l0dWRlKTtcbiAgICB0aGlzLl9sYXRpdHVkZSA9IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFYXN0LXdlc3QgcG9ydGlvbiBvZiB0aGUgY29vcmRpbmF0ZSwgaW4gcmFuZ2UgWy0xODAsIDE4MF0uXG4gICAqIFRocm93cyBpZiBzZXQgb3V0IG9mIHJhbmdlIGluIGEgbW9kZXJuIGJyb3dzZXIuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb25naXR1ZGVcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldCBsb25naXR1ZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvbmdpdHVkZTtcbiAgfVxuICBzZXQgbG9uZ2l0dWRlKHZhbCkge1xuICAgIFBhcnNlR2VvUG9pbnQuX3ZhbGlkYXRlKHRoaXMubGF0aXR1ZGUsIHZhbCk7XG4gICAgdGhpcy5fbG9uZ2l0dWRlID0gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBHZW9Qb2ludCwgc3VpdGFibGUgZm9yIFBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIFBhcnNlR2VvUG9pbnQuX3ZhbGlkYXRlKHRoaXMuX2xhdGl0dWRlLCB0aGlzLl9sb25naXR1ZGUpO1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdHZW9Qb2ludCcsXG4gICAgICBsYXRpdHVkZTogdGhpcy5fbGF0aXR1ZGUsXG4gICAgICBsb25naXR1ZGU6IHRoaXMuX2xvbmdpdHVkZVxuICAgIH07XG4gIH1cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgUGFyc2VHZW9Qb2ludCAmJiB0aGlzLmxhdGl0dWRlID09PSBvdGhlci5sYXRpdHVkZSAmJiB0aGlzLmxvbmdpdHVkZSA9PT0gb3RoZXIubG9uZ2l0dWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBHZW9Qb2ludCB0byBhbm90aGVyIGluIHJhZGlhbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50IHRoZSBvdGhlciBQYXJzZS5HZW9Qb2ludC5cbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIHJhZGlhbnNUbyhwb2ludCkge1xuICAgIGNvbnN0IGQyciA9IE1hdGguUEkgLyAxODAuMDtcbiAgICBjb25zdCBsYXQxcmFkID0gdGhpcy5sYXRpdHVkZSAqIGQycjtcbiAgICBjb25zdCBsb25nMXJhZCA9IHRoaXMubG9uZ2l0dWRlICogZDJyO1xuICAgIGNvbnN0IGxhdDJyYWQgPSBwb2ludC5sYXRpdHVkZSAqIGQycjtcbiAgICBjb25zdCBsb25nMnJhZCA9IHBvaW50LmxvbmdpdHVkZSAqIGQycjtcbiAgICBjb25zdCBzaW5EZWx0YUxhdERpdjIgPSBNYXRoLnNpbigobGF0MXJhZCAtIGxhdDJyYWQpIC8gMik7XG4gICAgY29uc3Qgc2luRGVsdGFMb25nRGl2MiA9IE1hdGguc2luKChsb25nMXJhZCAtIGxvbmcycmFkKSAvIDIpO1xuICAgIC8vIFNxdWFyZSBvZiBoYWxmIHRoZSBzdHJhaWdodCBsaW5lIGNob3JkIGRpc3RhbmNlIGJldHdlZW4gYm90aCBwb2ludHMuXG4gICAgbGV0IGEgPSBzaW5EZWx0YUxhdERpdjIgKiBzaW5EZWx0YUxhdERpdjIgKyBNYXRoLmNvcyhsYXQxcmFkKSAqIE1hdGguY29zKGxhdDJyYWQpICogc2luRGVsdGFMb25nRGl2MiAqIHNpbkRlbHRhTG9uZ0RpdjI7XG4gICAgYSA9IE1hdGgubWluKDEuMCwgYSk7XG4gICAgcmV0dXJuIDIgKiBNYXRoLmFzaW4oTWF0aC5zcXJ0KGEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgR2VvUG9pbnQgdG8gYW5vdGhlciBpbiBraWxvbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCB0aGUgb3RoZXIgUGFyc2UuR2VvUG9pbnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBraWxvbWV0ZXJzVG8ocG9pbnQpIHtcbiAgICByZXR1cm4gdGhpcy5yYWRpYW5zVG8ocG9pbnQpICogNjM3MS4wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBHZW9Qb2ludCB0byBhbm90aGVyIGluIG1pbGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCB0aGUgb3RoZXIgUGFyc2UuR2VvUG9pbnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBtaWxlc1RvKHBvaW50KSB7XG4gICAgcmV0dXJuIHRoaXMucmFkaWFuc1RvKHBvaW50KSAqIDM5NTguODtcbiAgfVxuXG4gIC8qXG4gICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGdpdmVuIGxhdC1sb25nIGlzIG91dCBvZiBib3VuZHMuXG4gICAqL1xuICBzdGF0aWMgX3ZhbGlkYXRlKGxhdGl0dWRlLCBsb25naXR1ZGUpIHtcbiAgICBpZiAoaXNOYU4obGF0aXR1ZGUpIHx8IGlzTmFOKGxvbmdpdHVkZSkgfHwgdHlwZW9mIGxhdGl0dWRlICE9PSAnbnVtYmVyJyB8fCB0eXBlb2YgbG9uZ2l0dWRlICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VvUG9pbnQgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBtdXN0IGJlIHZhbGlkIG51bWJlcnMnKTtcbiAgICB9XG4gICAgaWYgKGxhdGl0dWRlIDwgLTkwLjApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlb1BvaW50IGxhdGl0dWRlIG91dCBvZiBib3VuZHM6ICcgKyBsYXRpdHVkZSArICcgPCAtOTAuMC4nKTtcbiAgICB9XG4gICAgaWYgKGxhdGl0dWRlID4gOTAuMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VvUG9pbnQgbGF0aXR1ZGUgb3V0IG9mIGJvdW5kczogJyArIGxhdGl0dWRlICsgJyA+IDkwLjAuJyk7XG4gICAgfVxuICAgIGlmIChsb25naXR1ZGUgPCAtMTgwLjApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlb1BvaW50IGxvbmdpdHVkZSBvdXQgb2YgYm91bmRzOiAnICsgbG9uZ2l0dWRlICsgJyA8IC0xODAuMC4nKTtcbiAgICB9XG4gICAgaWYgKGxvbmdpdHVkZSA+IDE4MC4wKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW9Qb2ludCBsb25naXR1ZGUgb3V0IG9mIGJvdW5kczogJyArIGxvbmdpdHVkZSArICcgPiAxODAuMC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEdlb1BvaW50IHdpdGggdGhlIHVzZXIncyBjdXJyZW50IGxvY2F0aW9uLCBpZiBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmVuYWJsZUhpZ2hBY2N1cmFjeV0gQSBib29sZWFuIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoZSBhcHBsaWNhdGlvbiB3b3VsZCBsaWtlIHRvIHJlY2VpdmUgdGhlIGJlc3QgcG9zc2libGUgcmVzdWx0cy5cbiAgICogIElmIHRydWUgYW5kIGlmIHRoZSBkZXZpY2UgaXMgYWJsZSB0byBwcm92aWRlIGEgbW9yZSBhY2N1cmF0ZSBwb3NpdGlvbiwgaXQgd2lsbCBkbyBzby5cbiAgICogIE5vdGUgdGhhdCB0aGlzIGNhbiByZXN1bHQgaW4gc2xvd2VyIHJlc3BvbnNlIHRpbWVzIG9yIGluY3JlYXNlZCBwb3dlciBjb25zdW1wdGlvbiAod2l0aCBhIEdQUyBjaGlwIG9uIGEgbW9iaWxlIGRldmljZSBmb3IgZXhhbXBsZSkuXG4gICAqICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgZmFsc2UsIHRoZSBkZXZpY2UgY2FuIHRha2UgdGhlIGxpYmVydHkgdG8gc2F2ZSByZXNvdXJjZXMgYnkgcmVzcG9uZGluZyBtb3JlIHF1aWNrbHkgYW5kL29yIHVzaW5nIGxlc3MgcG93ZXIuIERlZmF1bHQ6IGZhbHNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGltZW91dF0gQSBwb3NpdGl2ZSBsb25nIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0aGUgZGV2aWNlIGlzIGFsbG93ZWQgdG8gdGFrZSBpbiBvcmRlciB0byByZXR1cm4gYSBwb3NpdGlvbi5cbiAgICogIFRoZSBkZWZhdWx0IHZhbHVlIGlzIEluZmluaXR5LCBtZWFuaW5nIHRoYXQgZ2V0Q3VycmVudFBvc2l0aW9uKCkgd29uJ3QgcmV0dXJuIHVudGlsIHRoZSBwb3NpdGlvbiBpcyBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhpbXVtQWdlXSBBIHBvc2l0aXZlIGxvbmcgdmFsdWUgaW5kaWNhdGluZyB0aGUgbWF4aW11bSBhZ2UgaW4gbWlsbGlzZWNvbmRzIG9mIGEgcG9zc2libGUgY2FjaGVkIHBvc2l0aW9uIHRoYXQgaXMgYWNjZXB0YWJsZSB0byByZXR1cm4uXG4gICAqICBJZiBzZXQgdG8gMCwgaXQgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIGNhbm5vdCB1c2UgYSBjYWNoZWQgcG9zaXRpb24gYW5kIG11c3QgYXR0ZW1wdCB0byByZXRyaWV2ZSB0aGUgcmVhbCBjdXJyZW50IHBvc2l0aW9uLlxuICAgKiAgSWYgc2V0IHRvIEluZmluaXR5IHRoZSBkZXZpY2UgbXVzdCByZXR1cm4gYSBjYWNoZWQgcG9zaXRpb24gcmVnYXJkbGVzcyBvZiBpdHMgYWdlLiBEZWZhdWx0OiAwLlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFBhcnNlLkdlb1BvaW50Pn0gVXNlcidzIGN1cnJlbnQgbG9jYXRpb25cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihsb2NhdGlvbiA9PiB7XG4gICAgICAgIHJlc29sdmUobmV3IFBhcnNlR2VvUG9pbnQobG9jYXRpb24uY29vcmRzLmxhdGl0dWRlLCBsb2NhdGlvbi5jb29yZHMubG9uZ2l0dWRlKSk7XG4gICAgICB9LCByZWplY3QsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZUdlb1BvaW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNyZWF0ZSA9IGNyZWF0ZTtcbmV4cG9ydHMuY3JlYXRlRnVuY3Rpb24gPSBjcmVhdGVGdW5jdGlvbjtcbmV4cG9ydHMuY3JlYXRlVHJpZ2dlciA9IGNyZWF0ZVRyaWdnZXI7XG5leHBvcnRzLmdldEZ1bmN0aW9uID0gZ2V0RnVuY3Rpb247XG5leHBvcnRzLmdldEZ1bmN0aW9ucyA9IGdldEZ1bmN0aW9ucztcbmV4cG9ydHMuZ2V0VHJpZ2dlciA9IGdldFRyaWdnZXI7XG5leHBvcnRzLmdldFRyaWdnZXJzID0gZ2V0VHJpZ2dlcnM7XG5leHBvcnRzLnJlbW92ZSA9IHJlbW92ZTtcbmV4cG9ydHMucmVtb3ZlRnVuY3Rpb24gPSByZW1vdmVGdW5jdGlvbjtcbmV4cG9ydHMucmVtb3ZlVHJpZ2dlciA9IHJlbW92ZVRyaWdnZXI7XG5leHBvcnRzLnVwZGF0ZSA9IHVwZGF0ZTtcbmV4cG9ydHMudXBkYXRlRnVuY3Rpb24gPSB1cGRhdGVGdW5jdGlvbjtcbmV4cG9ydHMudXBkYXRlVHJpZ2dlciA9IHVwZGF0ZVRyaWdnZXI7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xuZnVuY3Rpb24gZ2V0RnVuY3Rpb25zKCkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkuZ2V0KCdmdW5jdGlvbnMnKTtcbn1cbmZ1bmN0aW9uIGdldFRyaWdnZXJzKCkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkuZ2V0KCd0cmlnZ2VycycpO1xufVxuZnVuY3Rpb24gZ2V0RnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkuZ2V0KCdmdW5jdGlvbnMnLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIGdldFRyaWdnZXIoY2xhc3NOYW1lLCB0cmlnZ2VyTmFtZSkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkuZ2V0KCd0cmlnZ2VycycsIGNsYXNzTmFtZSwgdHJpZ2dlck5hbWUpO1xufVxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oZnVuY3Rpb25OYW1lLCB1cmwpIHtcbiAgcmV0dXJuIGNyZWF0ZSh7XG4gICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgdXJsOiB1cmxcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVUcmlnZ2VyKGNsYXNzTmFtZSwgdHJpZ2dlck5hbWUsIHVybCkge1xuICByZXR1cm4gY3JlYXRlKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWUsXG4gICAgdXJsOiB1cmxcbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGUoaG9vaykge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkuY3JlYXRlKGhvb2spO1xufVxuZnVuY3Rpb24gdXBkYXRlRnVuY3Rpb24oZnVuY3Rpb25OYW1lLCB1cmwpIHtcbiAgcmV0dXJuIHVwZGF0ZSh7XG4gICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgdXJsOiB1cmxcbiAgfSk7XG59XG5mdW5jdGlvbiB1cGRhdGVUcmlnZ2VyKGNsYXNzTmFtZSwgdHJpZ2dlck5hbWUsIHVybCkge1xuICByZXR1cm4gdXBkYXRlKHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICB0cmlnZ2VyTmFtZTogdHJpZ2dlck5hbWUsXG4gICAgdXJsOiB1cmxcbiAgfSk7XG59XG5mdW5jdGlvbiB1cGRhdGUoaG9vaykge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SG9va3NDb250cm9sbGVyKCkudXBkYXRlKGhvb2spO1xufVxuZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oZnVuY3Rpb25OYW1lKSB7XG4gIHJldHVybiByZW1vdmUoe1xuICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lXG4gIH0pO1xufVxuZnVuY3Rpb24gcmVtb3ZlVHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJOYW1lKSB7XG4gIHJldHVybiByZW1vdmUoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHRyaWdnZXJOYW1lOiB0cmlnZ2VyTmFtZVxuICB9KTtcbn1cbmZ1bmN0aW9uIHJlbW92ZShob29rKSB7XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRIb29rc0NvbnRyb2xsZXIoKS5yZW1vdmUoaG9vayk7XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgZ2V0KHR5cGUsIGZ1bmN0aW9uTmFtZSwgdHJpZ2dlck5hbWUpIHtcbiAgICBsZXQgdXJsID0gJy9ob29rcy8nICsgdHlwZTtcbiAgICBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgICB1cmwgKz0gJy8nICsgZnVuY3Rpb25OYW1lO1xuICAgICAgaWYgKHRyaWdnZXJOYW1lKSB7XG4gICAgICAgIHVybCArPSAnLycgKyB0cmlnZ2VyTmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3QoJ0dFVCcsIHVybCk7XG4gIH0sXG4gIGNyZWF0ZShob29rKSB7XG4gICAgbGV0IHVybDtcbiAgICBpZiAoaG9vay5mdW5jdGlvbk5hbWUgJiYgaG9vay51cmwpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvZnVuY3Rpb25zJztcbiAgICB9IGVsc2UgaWYgKGhvb2suY2xhc3NOYW1lICYmIGhvb2sudHJpZ2dlck5hbWUgJiYgaG9vay51cmwpIHtcbiAgICAgIHVybCA9ICcvaG9va3MvdHJpZ2dlcnMnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3Qoe1xuICAgICAgICBlcnJvcjogJ2ludmFsaWQgaG9vayBkZWNsYXJhdGlvbicsXG4gICAgICAgIGNvZGU6IDE0M1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0KCdQT1NUJywgdXJsLCBob29rKTtcbiAgfSxcbiAgcmVtb3ZlKGhvb2spIHtcbiAgICBsZXQgdXJsO1xuICAgIGlmIChob29rLmZ1bmN0aW9uTmFtZSkge1xuICAgICAgdXJsID0gJy9ob29rcy9mdW5jdGlvbnMvJyArIGhvb2suZnVuY3Rpb25OYW1lO1xuICAgICAgZGVsZXRlIGhvb2suZnVuY3Rpb25OYW1lO1xuICAgIH0gZWxzZSBpZiAoaG9vay5jbGFzc05hbWUgJiYgaG9vay50cmlnZ2VyTmFtZSkge1xuICAgICAgdXJsID0gJy9ob29rcy90cmlnZ2Vycy8nICsgaG9vay5jbGFzc05hbWUgKyAnLycgKyBob29rLnRyaWdnZXJOYW1lO1xuICAgICAgZGVsZXRlIGhvb2suY2xhc3NOYW1lO1xuICAgICAgZGVsZXRlIGhvb2sudHJpZ2dlck5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCh7XG4gICAgICAgIGVycm9yOiAnaW52YWxpZCBob29rIGRlY2xhcmF0aW9uJyxcbiAgICAgICAgY29kZTogMTQzXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3QoJ1BVVCcsIHVybCwge1xuICAgICAgX19vcDogJ0RlbGV0ZSdcbiAgICB9KTtcbiAgfSxcbiAgdXBkYXRlKGhvb2spIHtcbiAgICBsZXQgdXJsO1xuICAgIGlmIChob29rLmZ1bmN0aW9uTmFtZSAmJiBob29rLnVybCkge1xuICAgICAgdXJsID0gJy9ob29rcy9mdW5jdGlvbnMvJyArIGhvb2suZnVuY3Rpb25OYW1lO1xuICAgICAgZGVsZXRlIGhvb2suZnVuY3Rpb25OYW1lO1xuICAgIH0gZWxzZSBpZiAoaG9vay5jbGFzc05hbWUgJiYgaG9vay50cmlnZ2VyTmFtZSAmJiBob29rLnVybCkge1xuICAgICAgdXJsID0gJy9ob29rcy90cmlnZ2Vycy8nICsgaG9vay5jbGFzc05hbWUgKyAnLycgKyBob29rLnRyaWdnZXJOYW1lO1xuICAgICAgZGVsZXRlIGhvb2suY2xhc3NOYW1lO1xuICAgICAgZGVsZXRlIGhvb2sudHJpZ2dlck5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCh7XG4gICAgICAgIGVycm9yOiAnaW52YWxpZCBob29rIGRlY2xhcmF0aW9uJyxcbiAgICAgICAgY29kZTogMTQzXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3QoJ1BVVCcsIHVybCwgaG9vayk7XG4gIH0sXG4gIHNlbmRSZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5KSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkucmVxdWVzdChtZXRob2QsIHVybCwgYm9keSwge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfSkudGhlbihyZXMgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKHJlcyk7XG4gICAgICBpZiAoZGVjb2RlZCkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGRlY29kZWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9KU09OLCAnVGhlIHNlcnZlciByZXR1cm5lZCBhbiBpbnZhbGlkIHJlc3BvbnNlLicpKTtcbiAgICB9KTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldEhvb2tzQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZW50cmllcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2VudHJpZXNcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbmNvbnN0IERFVklDRV9UWVBFUyA9IHtcbiAgSU9TOiAnaW9zJyxcbiAgTUFDT1M6ICdtYWNvcycsXG4gIFRWT1M6ICd0dm9zJyxcbiAgRkNNOiAnZmNtJyxcbiAgQU5EUk9JRDogJ2FuZHJvaWQnLFxuICBXRUI6ICd3ZWInXG59O1xuXG4vKipcbiAqIFBhcnNlLkluc3RhbGxhdGlvbiBpcyBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIGluc3RhbGxhdGlvbiBkYXRhIHRoYXQgY2FuIGJlIHNhdmVkIGFuZCByZXRyaWV2ZWQgZnJvbSB0aGUgUGFyc2UgY2xvdWQuXG4gKiBUaGlzIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgYSBQYXJzZS5PYmplY3QsIGFuZCByZXRhaW5zIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgb2YgYSBQYXJzZS5PYmplY3QsIGJ1dCBhbHNvIGV4dGVuZHMgaXQgd2l0aCBpbnN0YWxsYXRpb24tc3BlY2lmaWMgZmVhdHVyZXMuXG4gKlxuICogPHA+QSB2YWxpZCBQYXJzZS5JbnN0YWxsYXRpb24gY2FuIG9ubHkgYmUgaW5zdGFudGlhdGVkIHZpYSA8Y29kZT5QYXJzZS5JbnN0YWxsYXRpb24uY3VycmVudEluc3RhbGxhdGlvbigpPC9jb2RlPlxuICpcbiAqIFBhcnNlLkluc3RhbGxhdGlvbiBvYmplY3RzIHdoaWNoIGhhdmUgYSB2YWxpZCA8Y29kZT5kZXZpY2VUb2tlbjwvY29kZT4gYW5kIGFyZSBzYXZlZCB0byB0aGUgUGFyc2UgY2xvdWQgY2FuIGJlIHVzZWQgdG8gdGFyZ2V0IHB1c2ggbm90aWZpY2F0aW9ucy5cbiAqIDwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuSW5zdGFsbGF0aW9uXG4gKi9cbmNsYXNzIFBhcnNlSW5zdGFsbGF0aW9uIGV4dGVuZHMgX1BhcnNlT2JqZWN0LmRlZmF1bHQge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgVGhlIGluaXRpYWwgc2V0IG9mIGRhdGEgdG8gc3RvcmUgaW4gdGhlIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHtcbiAgICBzdXBlcignX0luc3RhbGxhdGlvbicpO1xuICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKCF0aGlzLnNldChhdHRyaWJ1dGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgYW4gaW52YWxpZCBJbnN0YWxsYXRpb25cIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgaW5zdGFsbGF0aW9u4oCZcyBjbGllbnQgYXBwbGljYXRpb24uIEluIGlPUywgdGhpcyBpcyB0aGUgQnVuZGxlIElkZW50aWZpZXIuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZGVudGlmaWVyXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBhcHBJZGVudGlmaWVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnYXBwSWRlbnRpZmllcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHRvIHdoaWNoIHRoaXMgaW5zdGFsbGF0aW9uIGJlbG9uZ3MuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBWZXJzaW9uXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBhcHBWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnYXBwVmVyc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiB0byB3aGljaCB0aGlzIGluc3RhbGxhdGlvbiBiZWxvbmdzLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXBwTmFtZVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgYXBwTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2FwcE5hbWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaWNvbiBiYWRnZSBmb3IgaU9TIGFwcHMuXG4gICAqIENoYW5nZXMgdG8gdGhpcyB2YWx1ZSBvbiB0aGUgc2VydmVyIHdpbGwgYmUgdXNlZFxuICAgKiBmb3IgZnV0dXJlIGJhZGdlLWluY3JlbWVudCBwdXNoIG5vdGlmaWNhdGlvbnMuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBiYWRnZVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgYmFkZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdiYWRnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHRoZSBjaGFubmVscyB0byB3aGljaCBhIGRldmljZSBpcyBjdXJyZW50bHkgc3Vic2NyaWJlZC5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY2hhbm5lbHNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBnZXQgY2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdjaGFubmVscycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRva2VuIHVzZWQgdG8gZGVsaXZlciBwdXNoIG5vdGlmaWNhdGlvbnMgdG8gdGhlIGRldmljZS5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGRldmljZVRva2VuXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBkZXZpY2VUb2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2RldmljZVRva2VuJyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgZGV2aWNlLCDigJxpb3PigJ0sIOKAnGFuZHJvaWTigJ0sIOKAnHdlYuKAnSwgZXRjLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZGV2aWNlVHlwZVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZGV2aWNlVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2RldmljZVR5cGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBHQ00gc2VuZGVyIGlkZW50aWZpZXIgZm9yIHRoaXMgaW5zdGFsbGF0aW9uXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHQ01TZW5kZXJJZFxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgR0NNU2VuZGVySWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdHQ01TZW5kZXJJZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuaXZlcnNhbGx5IFVuaXF1ZSBJZGVudGlmaWVyIChVVUlEKSBmb3IgdGhlIGRldmljZSB1c2VkIGJ5IFBhcnNlLiBJdCBtdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIG9mIGFuIGFwcOKAmXMgaW5zdGFsbGF0aW9ucy5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxhdGlvbklkXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnN0YWxsYXRpb25JZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2luc3RhbGxhdGlvbklkJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbG9jYWwgaWRlbnRpZmllciBmb3IgdGhpcyBpbnN0YWxsYXRpb25cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGxvY2FsZUlkZW50aWZpZXJcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2FsZUlkZW50aWZpZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdsb2NhbGVJZGVudGlmaWVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcGFyc2Ugc2VydmVyIHZlcnNpb24gZm9yIHRoaXMgaW5zdGFsbGF0aW9uXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXJzZVZlcnNpb25cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHBhcnNlVmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3BhcnNlVmVyc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZmllbGQgaXMgcmVzZXJ2ZWQgZm9yIGRpcmVjdGluZyBQYXJzZSB0byB0aGUgcHVzaCBkZWxpdmVyeSBuZXR3b3JrIHRvIGJlIHVzZWQuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwdXNoVHlwZVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcHVzaFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdwdXNoVHlwZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRpbWUgem9uZSBmb3IgdGhpcyBpbnN0YWxsYXRpb25cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVab25lXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCB0aW1lWm9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3RpbWVab25lJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGV2aWNlIHR5cGVzIGZvciB1c2VkIGZvciBQdXNoIE5vdGlmaWNhdGlvbnMuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIFBhcnNlLkluc3RhbGxhdGlvbi5ERVZJQ0VfVFlQRVMuSU9TXG4gICAqIFBhcnNlLkluc3RhbGxhdGlvbi5ERVZJQ0VfVFlQRVMuTUFDT1NcbiAgICogUGFyc2UuSW5zdGFsbGF0aW9uLkRFVklDRV9UWVBFUy5UVk9TXG4gICAqIFBhcnNlLkluc3RhbGxhdGlvbi5ERVZJQ0VfVFlQRVMuRkNNXG4gICAqIFBhcnNlLkluc3RhbGxhdGlvbi5ERVZJQ0VfVFlQRVMuQU5EUk9JRFxuICAgKiBQYXJzZS5JbnN0YWxsYXRpb24uREVWSUNFX1RZUEVTLldFQlxuICAgKiA8L3ByZVxuICAgKlxuICAgKiBAcHJvcGVydHkge29iamVjdH0gREVWSUNFX1RZUEVTXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHN0YXRpYyBnZXQgREVWSUNFX1RZUEVTKCkge1xuICAgIHJldHVybiBERVZJQ0VfVFlQRVM7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZGVmYXVsdCBmZXRjaCBiZWhhdmlvciB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gdXBkYXRlIGxvY2FsIHN0b3JhZ2UuXG4gICAqIElmIHRoZSBpbnN0YWxsYXRpb24gaXMgZGVsZXRlZCBvbiB0aGUgc2VydmVyLCByZXRyeSB0aGUgZmV0Y2ggYXMgYSBzYXZlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBhc3luYyBmZXRjaCgpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdXBlci5mZXRjaC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlICE9PSBfUGFyc2VFcnJvci5kZWZhdWx0Lk9CSkVDVF9OT1RfRk9VTkQpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBpbnN0YWxsYXRpb24gd2FzIGRlbGV0ZWQgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgLy8gV2UgYWx3YXlzIHdhbnQgZmV0Y2ggdG8gc3VjY2VlZC5cbiAgICAgIGRlbGV0ZSB0aGlzLmlkO1xuICAgICAgdGhpcy5fZ2V0SWQoKTsgLy8gR2VuZXJhdGUgbG9jYWxJZFxuICAgICAgdGhpcy5fbWFya0FsbEZpZWxkc0RpcnR5KCk7XG4gICAgICBhd2FpdCBzdXBlci5zYXZlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgICBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCkudXBkYXRlSW5zdGFsbGF0aW9uT25EaXNrKHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGRlZmF1bHQgc2F2ZSBiZWhhdmlvciB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gdXBkYXRlIHRoZSBsb2NhbCBzdG9yYWdlLlxuICAgKiBJZiB0aGUgaW5zdGFsbGF0aW9uIGlzIGRlbGV0ZWQgb24gdGhlIHNlcnZlciwgcmV0cnkgc2F2aW5nIGEgbmV3IGluc3RhbGxhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBhc3luYyBzYXZlKCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3VwZXIuc2F2ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlICE9PSBfUGFyc2VFcnJvci5kZWZhdWx0Lk9CSkVDVF9OT1RfRk9VTkQpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBpbnN0YWxsYXRpb24gd2FzIGRlbGV0ZWQgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgLy8gV2UgYWx3YXlzIHdhbnQgc2F2ZSB0byBzdWNjZWVkLlxuICAgICAgZGVsZXRlIHRoaXMuaWQ7XG4gICAgICB0aGlzLl9nZXRJZCgpOyAvLyBHZW5lcmF0ZSBsb2NhbElkXG4gICAgICB0aGlzLl9tYXJrQWxsRmllbGRzRGlydHkoKTtcbiAgICAgIGF3YWl0IHN1cGVyLnNhdmUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIGF3YWl0IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoKS51cGRhdGVJbnN0YWxsYXRpb25PbkRpc2sodGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgX21hcmtBbGxGaWVsZHNEaXJ0eSgpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAoMCwgX2VudHJpZXMuZGVmYXVsdCkodGhpcy5hdHRyaWJ1dGVzKSkge1xuICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBQYXJzZS5JbnN0YWxsYXRpb24gZnJvbSBkaXNrLiBJZiBkb2Vzbid0IGV4aXN0cywgY3JlYXRlIGFuIG5ldyBpbnN0YWxsYXRpb24uXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGNvbnN0IGluc3RhbGxhdGlvbiA9IGF3YWl0IFBhcnNlLkluc3RhbGxhdGlvbi5jdXJyZW50SW5zdGFsbGF0aW9uKCk7XG4gICAqIGluc3RhbGxhdGlvbi5zZXQoJ2RldmljZVRva2VuJywgJzEyMycpO1xuICAgKiBhd2FpdCBpbnN0YWxsYXRpb24uc2F2ZSgpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBsb2NhbCBpbnN0YWxsYXRpb24gb2JqZWN0LlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnRJbnN0YWxsYXRpb24oKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoKS5jdXJyZW50SW5zdGFsbGF0aW9uKCk7XG4gIH1cbn1cbl9QYXJzZU9iamVjdC5kZWZhdWx0LnJlZ2lzdGVyU3ViY2xhc3MoJ19JbnN0YWxsYXRpb24nLCBQYXJzZUluc3RhbGxhdGlvbik7XG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlSW5zdGFsbGF0aW9uO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VJbnN0YWxsYXRpb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfTGl2ZVF1ZXJ5Q2xpZW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9MaXZlUXVlcnlDbGllbnRcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuZnVuY3Rpb24gZ2V0TGl2ZVF1ZXJ5Q2xpZW50KCkge1xuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TGl2ZVF1ZXJ5Q29udHJvbGxlcigpLmdldERlZmF1bHRMaXZlUXVlcnlDbGllbnQoKTtcbn1cblxuLyoqXG4gKiBXZSBleHBvc2UgdGhyZWUgZXZlbnRzIHRvIGhlbHAgeW91IG1vbml0b3IgdGhlIHN0YXR1cyBvZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb246XG4gKlxuICogPHA+T3BlbiAtIFdoZW4gd2UgZXN0YWJsaXNoIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciwgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICpcbiAqIDxwcmU+XG4gKiBQYXJzZS5MaXZlUXVlcnkub24oJ29wZW4nLCAoKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIDxwPkNsb3NlIC0gV2hlbiB3ZSBsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciwgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICpcbiAqIDxwcmU+XG4gKiBQYXJzZS5MaXZlUXVlcnkub24oJ2Nsb3NlJywgKCkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiA8cD5FcnJvciAtIFdoZW4gc29tZSBuZXR3b3JrIGVycm9yIG9yIExpdmVRdWVyeSBzZXJ2ZXIgZXJyb3IgaGFwcGVucywgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICpcbiAqIDxwcmU+XG4gKiBQYXJzZS5MaXZlUXVlcnkub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIEBjbGFzcyBQYXJzZS5MaXZlUXVlcnlcbiAqIEBzdGF0aWNcbiAqL1xuY2xhc3MgTGl2ZVF1ZXJ5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImVtaXR0ZXJcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJlbWl0XCIsIHZvaWQgMCk7XG4gICAgY29uc3QgRXZlbnRFbWl0dGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMub24gPSAoZXZlbnROYW1lLCBsaXN0ZW5lcikgPT4gdGhpcy5lbWl0dGVyLm9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gX3RoaXMuZW1pdHRlci5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7XG4gICAgfTtcbiAgICAvLyBhZGRpbmcgbGlzdGVuZXIgc28gcHJvY2VzcyBkb2VzIG5vdCBjcmFzaFxuICAgIC8vIGJlc3QgcHJhY3RpY2UgaXMgZm9yIGRldmVsb3BlciB0byByZWdpc3RlciB0aGVpciBvd24gbGlzdGVuZXJcbiAgICB0aGlzLm9uKCdlcnJvcicsICgpID0+IHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZnRlciBvcGVuIGlzIGNhbGxlZCwgdGhlIExpdmVRdWVyeSB3aWxsIHRyeSB0byBzZW5kIGEgY29ubmVjdCByZXF1ZXN0XG4gICAqIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLlxuICAgKi9cbiAgYXN5bmMgb3BlbigpIHtcbiAgICBjb25zdCBsaXZlUXVlcnlDbGllbnQgPSBhd2FpdCBnZXRMaXZlUXVlcnlDbGllbnQoKTtcbiAgICBsaXZlUXVlcnlDbGllbnQub3BlbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4geW91J3JlIGRvbmUgdXNpbmcgTGl2ZVF1ZXJ5LCB5b3UgY2FuIGNhbGwgUGFyc2UuTGl2ZVF1ZXJ5LmNsb3NlKCkuXG4gICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsXG4gICAqIGNhbmNlbCB0aGUgYXV0byByZWNvbm5lY3QsIGFuZCB1bnN1YnNjcmliZSBhbGwgc3Vic2NyaXB0aW9ucyBiYXNlZCBvbiBpdC5cbiAgICogSWYgeW91IGNhbGwgcXVlcnkuc3Vic2NyaWJlKCkgYWZ0ZXIgdGhpcywgd2UnbGwgY3JlYXRlIGEgbmV3IFdlYlNvY2tldFxuICAgKiBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgY29uc3QgbGl2ZVF1ZXJ5Q2xpZW50ID0gYXdhaXQgZ2V0TGl2ZVF1ZXJ5Q2xpZW50KCk7XG4gICAgbGl2ZVF1ZXJ5Q2xpZW50LmNsb3NlKCk7XG4gIH1cbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IExpdmVRdWVyeTtcbmxldCBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50O1xuY29uc3QgRGVmYXVsdExpdmVRdWVyeUNvbnRyb2xsZXIgPSB7XG4gIHNldERlZmF1bHRMaXZlUXVlcnlDbGllbnQobGl2ZVF1ZXJ5Q2xpZW50KSB7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudCA9IGxpdmVRdWVyeUNsaWVudDtcbiAgfSxcbiAgYXN5bmMgZ2V0RGVmYXVsdExpdmVRdWVyeUNsaWVudCgpIHtcbiAgICBpZiAoZGVmYXVsdExpdmVRdWVyeUNsaWVudCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQ7XG4gICAgfVxuICAgIGNvbnN0IFtjdXJyZW50VXNlciwgaW5zdGFsbGF0aW9uSWRdID0gYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5hbGwoW19Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCkuY3VycmVudFVzZXJBc3luYygpLCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCkuY3VycmVudEluc3RhbGxhdGlvbklkKCldKTtcbiAgICBjb25zdCBzZXNzaW9uVG9rZW4gPSBjdXJyZW50VXNlciA/IGN1cnJlbnRVc2VyLmdldFNlc3Npb25Ub2tlbigpIDogdW5kZWZpbmVkO1xuICAgIGxldCBsaXZlUXVlcnlTZXJ2ZXJVUkwgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0xJVkVRVUVSWV9TRVJWRVJfVVJMJyk7XG4gICAgaWYgKGxpdmVRdWVyeVNlcnZlclVSTCAmJiAoMCwgX2luZGV4T2YuZGVmYXVsdCkobGl2ZVF1ZXJ5U2VydmVyVVJMKS5jYWxsKGxpdmVRdWVyeVNlcnZlclVSTCwgJ3dzJykgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gc2V0IGEgcHJvcGVyIFBhcnNlIExpdmVRdWVyeSBzZXJ2ZXIgdXJsIGJlZm9yZSB1c2luZyBMaXZlUXVlcnlDbGllbnQnKTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBjYW4gbm90IGZpbmQgUGFyc2UubGl2ZVF1ZXJ5U2VydmVyVVJMLCB3ZSB0cnkgdG8gZXh0cmFjdCBpdCBmcm9tIFBhcnNlLnNlcnZlclVSTFxuICAgIGlmICghbGl2ZVF1ZXJ5U2VydmVyVVJMKSB7XG4gICAgICBjb25zdCBzZXJ2ZXJVUkwgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9VUkwnKTtcbiAgICAgIGNvbnN0IHByb3RvY29sID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKHNlcnZlclVSTCkuY2FsbChzZXJ2ZXJVUkwsICdodHRwcycpID09PSAwID8gJ3dzczovLycgOiAnd3M6Ly8nO1xuICAgICAgY29uc3QgaG9zdCA9IHNlcnZlclVSTC5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcLy8sICcnKTtcbiAgICAgIGxpdmVRdWVyeVNlcnZlclVSTCA9IHByb3RvY29sICsgaG9zdDtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnTElWRVFVRVJZX1NFUlZFUl9VUkwnLCBsaXZlUXVlcnlTZXJ2ZXJVUkwpO1xuICAgIH1cbiAgICBjb25zdCBhcHBsaWNhdGlvbklkID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBUFBMSUNBVElPTl9JRCcpO1xuICAgIGNvbnN0IGphdmFzY3JpcHRLZXkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0pBVkFTQ1JJUFRfS0VZJyk7XG4gICAgY29uc3QgbWFzdGVyS2V5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdNQVNURVJfS0VZJyk7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudCA9IG5ldyBfTGl2ZVF1ZXJ5Q2xpZW50LmRlZmF1bHQoe1xuICAgICAgYXBwbGljYXRpb25JZCxcbiAgICAgIHNlcnZlclVSTDogbGl2ZVF1ZXJ5U2VydmVyVVJMLFxuICAgICAgamF2YXNjcmlwdEtleSxcbiAgICAgIG1hc3RlcktleSxcbiAgICAgIHNlc3Npb25Ub2tlbixcbiAgICAgIGluc3RhbGxhdGlvbklkXG4gICAgfSk7XG4gICAgY29uc3QgTGl2ZVF1ZXJ5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TGl2ZVF1ZXJ5KCk7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudC5vbignZXJyb3InLCBlcnJvciA9PiB7XG4gICAgICBMaXZlUXVlcnkuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgfSk7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudC5vbignb3BlbicsICgpID0+IHtcbiAgICAgIExpdmVRdWVyeS5lbWl0KCdvcGVuJyk7XG4gICAgfSk7XG4gICAgZGVmYXVsdExpdmVRdWVyeUNsaWVudC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICBMaXZlUXVlcnkuZW1pdCgnY2xvc2UnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGVmYXVsdExpdmVRdWVyeUNsaWVudDtcbiAgfSxcbiAgX2NsZWFyQ2FjaGVkRGVmYXVsdENsaWVudCgpIHtcbiAgICBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50ID0gbnVsbDtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldExpdmVRdWVyeUNvbnRyb2xsZXIoRGVmYXVsdExpdmVRdWVyeUNvbnRyb2xsZXIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX1dlYWtNYXAgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS93ZWFrLW1hcFwiKTtcbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5MiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkyKGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9mcmVlemUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9mcmVlemVcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX2luY2x1ZGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmNsdWRlc1wiKSk7XG52YXIgX2dldFByb3RvdHlwZU9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZlwiKSk7XG52YXIgX2NvbmNhdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfY3JlYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvY3JlYXRlXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpKTtcbnZhciBfZmluZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZFwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfY2FuQmVTZXJpYWxpemVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jYW5CZVNlcmlhbGl6ZWRcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX2VuY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfZXNjYXBlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lc2NhcGVcIikpO1xudmFyIF9QYXJzZUFDTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VBQ0xcIikpO1xudmFyIF9wYXJzZURhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlRGF0ZVwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX3Byb21pc2VVdGlscyA9IHJlcXVpcmUoXCIuL3Byb21pc2VVdGlsc1wiKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVVdGlscyA9IHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlVXRpbHNcIik7XG52YXIgX3V1aWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V1aWRcIikpO1xudmFyIF9QYXJzZU9wID0gcmVxdWlyZShcIi4vUGFyc2VPcFwiKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG52YXIgU2luZ2xlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9TaW5nbGVJbnN0YW5jZVN0YXRlQ29udHJvbGxlclwiKSk7XG52YXIgX3VuaXF1ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdW5pcXVlXCIpKTtcbnZhciBVbmlxdWVJbnN0YW5jZVN0YXRlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL1VuaXF1ZUluc3RhbmNlU3RhdGVDb250cm9sbGVyXCIpKTtcbnZhciBfdW5zYXZlZENoaWxkcmVuID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91bnNhdmVkQ2hpbGRyZW5cIikpO1xuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgX1dlYWtNYXApIHJldHVybiBudWxsO1xuICB2YXIgciA9IG5ldyBfV2Vha01hcCgpLFxuICAgIHQgPSBuZXcgX1dlYWtNYXAoKTtcbiAgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBlID8gdCA6IHI7XG4gIH0pKGUpO1xufVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoZSwgcikge1xuICBpZiAoIXIgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICBkZWZhdWx0OiBlXG4gIH07XG4gIHZhciB0ID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKHIpO1xuICBpZiAodCAmJiB0LmhhcyhlKSkgcmV0dXJuIHQuZ2V0KGUpO1xuICB2YXIgbiA9IHtcbiAgICBfX3Byb3RvX186IG51bGxcbiAgfTtcbiAgZm9yICh2YXIgdSBpbiBlKSBpZiAoXCJkZWZhdWx0XCIgIT09IHUgJiYge30uaGFzT3duUHJvcGVydHkuY2FsbChlLCB1KSkge1xuICAgIHZhciBpID0gX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIgJiYgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPyBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB1KSA6IG51bGw7XG4gICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIobiwgdSwgaSkgOiBuW3VdID0gZVt1XTtcbiAgfVxuICByZXR1cm4gbi5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCBuKSwgbjtcbn1cbi8vIE1hcHBpbmcgb2YgY2xhc3MgbmFtZXMgdG8gY29uc3RydWN0b3JzLCBzbyB3ZSBjYW4gcG9wdWxhdGUgb2JqZWN0cyBmcm9tIHRoZVxuLy8gc2VydmVyIHdpdGggYXBwcm9wcmlhdGUgc3ViY2xhc3NlcyBvZiBQYXJzZU9iamVjdFxuY29uc3QgY2xhc3NNYXAgPSB7fTtcblxuLy8gR2xvYmFsIGNvdW50ZXIgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIElkcyBmb3Igbm9uLXNpbmdsZS1pbnN0YW5jZSBvYmplY3RzXG5sZXQgb2JqZWN0Q291bnQgPSAwO1xuLy8gT24gd2ViIGNsaWVudHMsIG9iamVjdHMgYXJlIHNpbmdsZS1pbnN0YW5jZTogYW55IHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWUgSWRcbi8vIHdpbGwgaGF2ZSB0aGUgc2FtZSBhdHRyaWJ1dGVzLiBIb3dldmVyLCB0aGlzIG1heSBiZSBkYW5nZXJvdXMgZGVmYXVsdFxuLy8gYmVoYXZpb3IgaW4gYSBzZXJ2ZXIgc2NlbmFyaW9cbmxldCBzaW5nbGVJbnN0YW5jZSA9ICFfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0lTX05PREUnKTtcbmlmIChzaW5nbGVJbnN0YW5jZSkge1xuICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoU2luZ2xlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIpO1xufSBlbHNlIHtcbiAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKFVuaXF1ZUluc3RhbmNlU3RhdGVDb250cm9sbGVyKTtcbn1cbmZ1bmN0aW9uIGdldFNlcnZlclVybFBhdGgoKSB7XG4gIGxldCBzZXJ2ZXJVcmwgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9VUkwnKTtcbiAgaWYgKHNlcnZlclVybFtzZXJ2ZXJVcmwubGVuZ3RoIC0gMV0gIT09ICcvJykge1xuICAgIHNlcnZlclVybCArPSAnLyc7XG4gIH1cbiAgY29uc3QgdXJsID0gc2VydmVyVXJsLnJlcGxhY2UoL2h0dHBzPzpcXC9cXC8vLCAnJyk7XG4gIHJldHVybiB1cmwuc3Vic3RyKCgwLCBfaW5kZXhPZi5kZWZhdWx0KSh1cmwpLmNhbGwodXJsLCAnLycpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1vZGVsIHdpdGggZGVmaW5lZCBhdHRyaWJ1dGVzLlxuICpcbiAqIDxwPllvdSB3b24ndCBub3JtYWxseSBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdFxuICogeW91IHVzZSBhIHN1YmNsYXNzIG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4gaW5zdGVhZCwgY3JlYXRlZCBieSBjYWxsaW5nXG4gKiA8Y29kZT5leHRlbmQ8L2NvZGU+LjwvcD5cbiAqXG4gKiA8cD5Ib3dldmVyLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgYSBzdWJjbGFzcywgb3IgYXJlbid0IHN1cmUgd2hpY2hcbiAqIHN1YmNsYXNzIGlzIGFwcHJvcHJpYXRlLCB5b3UgY2FuIHVzZSB0aGlzIGZvcm06PHByZT5cbiAqICAgICB2YXIgb2JqZWN0ID0gbmV3IFBhcnNlLk9iamVjdChcIkNsYXNzTmFtZVwiKTtcbiAqIDwvcHJlPlxuICogVGhhdCBpcyBiYXNpY2FsbHkgZXF1aXZhbGVudCB0bzo8cHJlPlxuICogICAgIHZhciBNeUNsYXNzID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIkNsYXNzTmFtZVwiKTtcbiAqICAgICB2YXIgb2JqZWN0ID0gbmV3IE15Q2xhc3MoKTtcbiAqIDwvcHJlPjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuT2JqZWN0XG4gKi9cbmNsYXNzIFBhcnNlT2JqZWN0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgVGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBvYmplY3RcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgVGhlIGluaXRpYWwgc2V0IG9mIGRhdGEgdG8gc3RvcmUgaW4gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoaXMgb2JqZWN0IGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmlnbm9yZVZhbGlkYXRpb25dIFNldCB0byBgdHJ1ZWAgaWdub3JlIGFueSBhdHRyaWJ1dGUgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGFzc05hbWUsIGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhpcyBvYmplY3QsIHVuaXF1ZSB3aXRoaW4gaXRzIGNsYXNzLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGlkXG4gICAgICovXG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJpZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2xvY2FsSWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9vYmpDb3VudFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiY2xhc3NOYW1lXCIsIHZvaWQgMCk7XG4gICAgLy8gRW5hYmxlIGxlZ2FjeSBpbml0aWFsaXplcnNcbiAgICBpZiAodHlwZW9mIHRoaXMuaW5pdGlhbGl6ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIGxldCB0b1NldCA9IG51bGw7XG4gICAgdGhpcy5fb2JqQ291bnQgPSBvYmplY3RDb3VudCsrO1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdG9TZXQgPSBhdHRyaWJ1dGVzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lICYmIHR5cGVvZiBjbGFzc05hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZS5jbGFzc05hbWU7XG4gICAgICB0b1NldCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBhdHRyIGluIGNsYXNzTmFtZSkge1xuICAgICAgICBpZiAoYXR0ciAhPT0gJ2NsYXNzTmFtZScpIHtcbiAgICAgICAgICB0b1NldFthdHRyXSA9IGNsYXNzTmFtZVthdHRyXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGF0dHJpYnV0ZXMgJiYgdHlwZW9mIGF0dHJpYnV0ZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdGlvbnMgPSBhdHRyaWJ1dGVzO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodG9TZXQgJiYgIXRoaXMuc2V0KHRvU2V0LCBvcHRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIGFuIGludmFsaWQgUGFyc2UgT2JqZWN0XCIpO1xuICAgIH1cbiAgfVxuICAvKiBQcm90b3R5cGUgZ2V0dGVycyAvIHNldHRlcnMgKi9cblxuICBnZXQgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gKDAsIF9mcmVlemUuZGVmYXVsdCkoc3RhdGVDb250cm9sbGVyLmVzdGltYXRlQXR0cmlidXRlcyh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmaXJzdCB0aW1lIHRoaXMgb2JqZWN0IHdhcyBzYXZlZCBvbiB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcHJvcGVydHkge0RhdGV9IGNyZWF0ZWRBdFxuICAgKiBAcmV0dXJucyB7RGF0ZX1cbiAgICovXG4gIGdldCBjcmVhdGVkQXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldFNlcnZlckRhdGEoKS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxhc3QgdGltZSB0aGlzIG9iamVjdCB3YXMgdXBkYXRlZCBvbiB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcHJvcGVydHkge0RhdGV9IHVwZGF0ZWRBdFxuICAgKiBAcmV0dXJucyB7RGF0ZX1cbiAgICovXG4gIGdldCB1cGRhdGVkQXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldFNlcnZlckRhdGEoKS51cGRhdGVkQXQ7XG4gIH1cblxuICAvKiBQcml2YXRlIG1ldGhvZHMgKi9cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxvY2FsIG9yIHNlcnZlciBJZCB1c2VkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBfZ2V0SWQoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmlkID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5fbG9jYWxJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sb2NhbElkO1xuICAgIH1cbiAgICBjb25zdCBsb2NhbElkID0gJ2xvY2FsJyArICgwLCBfdXVpZC5kZWZhdWx0KSgpO1xuICAgIHRoaXMuX2xvY2FsSWQgPSBsb2NhbElkO1xuICAgIHJldHVybiBsb2NhbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciB1c2VkIHRvIHB1bGwgZGF0YSBmcm9tIHRoZSBTdGF0ZSBDb250cm9sbGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fG9iamVjdH1cbiAgICovXG4gIF9nZXRTdGF0ZUlkZW50aWZpZXIoKSB7XG4gICAgaWYgKHNpbmdsZUluc3RhbmNlKSB7XG4gICAgICBsZXQgaWQgPSB0aGlzLmlkO1xuICAgICAgaWYgKCFpZCkge1xuICAgICAgICBpZCA9IHRoaXMuX2dldElkKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfVxuICBfZ2V0U2VydmVyRGF0YSgpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gc3RhdGVDb250cm9sbGVyLmdldFNlcnZlckRhdGEodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICB9XG4gIF9jbGVhclNlcnZlckRhdGEoKSB7XG4gICAgY29uc3Qgc2VydmVyRGF0YSA9IHRoaXMuX2dldFNlcnZlckRhdGEoKTtcbiAgICBjb25zdCB1bnNldCA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBzZXJ2ZXJEYXRhKSB7XG4gICAgICB1bnNldFthdHRyXSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgc3RhdGVDb250cm9sbGVyLnNldFNlcnZlckRhdGEodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIHVuc2V0KTtcbiAgfVxuICBfZ2V0UGVuZGluZ09wcygpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gc3RhdGVDb250cm9sbGVyLmdldFBlbmRpbmdPcHModGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW2tleXNUb0NsZWFyXSAtIGlmIHNwZWNpZmllZCwgb25seSBvcHMgbWF0Y2hpbmdcbiAgICogdGhlc2UgZmllbGRzIHdpbGwgYmUgY2xlYXJlZFxuICAgKi9cbiAgX2NsZWFyUGVuZGluZ09wcyhrZXlzVG9DbGVhcikge1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgY29uc3QgbGF0ZXN0ID0gcGVuZGluZ1twZW5kaW5nLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGtleXMgPSBrZXlzVG9DbGVhciB8fCAoMCwgX2tleXMuZGVmYXVsdCkobGF0ZXN0KTtcbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkgPT4ge1xuICAgICAgZGVsZXRlIGxhdGVzdFtrZXldO1xuICAgIH0pO1xuICB9XG4gIF9nZXREaXJ0eU9iamVjdEF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBvYmplY3RDYWNoZSA9IHN0YXRlQ29udHJvbGxlci5nZXRPYmplY3RDYWNoZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgY29uc3QgZGlydHkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgICAgY29uc3QgdmFsID0gYXR0cmlidXRlc1thdHRyXTtcbiAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgISh2YWwgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkgJiYgISh2YWwgaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQpICYmICEodmFsIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkpIHtcbiAgICAgICAgLy8gRHVlIHRvIHRoZSB3YXkgYnJvd3NlcnMgY29uc3RydWN0IG1hcHMsIHRoZSBrZXkgb3JkZXIgd2lsbCBub3QgY2hhbmdlXG4gICAgICAgIC8vIHVubGVzcyB0aGUgb2JqZWN0IGlzIGNoYW5nZWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBqc29uID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkodmFsLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShqc29uKTtcbiAgICAgICAgICBpZiAob2JqZWN0Q2FjaGVbYXR0cl0gIT09IHN0cmluZ2lmaWVkKSB7XG4gICAgICAgICAgICBkaXJ0eVthdHRyXSA9IHZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCwgcG9zc2libHkgYnkgYSBuZXN0ZWQgdW5zYXZlZCBwb2ludGVyIGluIGEgbXV0YWJsZSBjb250YWluZXJcbiAgICAgICAgICAvLyBObyBtYXR0ZXIgaG93IGl0IGhhcHBlbmVkLCBpdCBpbmRpY2F0ZXMgYSBjaGFuZ2UgaW4gdGhlIGF0dHJpYnV0ZVxuICAgICAgICAgIGRpcnR5W2F0dHJdID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXJ0eTtcbiAgfVxuICBfdG9GdWxsSlNPTihzZWVuLCBvZmZsaW5lKSB7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKHNlZW4sIG9mZmxpbmUpO1xuICAgIGpzb24uX190eXBlID0gJ09iamVjdCc7XG4gICAganNvbi5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBfZ2V0U2F2ZUpTT04oKSB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMuX2dldFBlbmRpbmdPcHMoKTtcbiAgICBjb25zdCBkaXJ0eU9iamVjdHMgPSB0aGlzLl9nZXREaXJ0eU9iamVjdEF0dHJpYnV0ZXMoKTtcbiAgICBjb25zdCBqc29uID0ge307XG4gICAgZm9yICh2YXIgYXR0ciBpbiBkaXJ0eU9iamVjdHMpIHtcbiAgICAgIGxldCBpc0RvdE5vdGF0aW9uID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmcubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBwZW5kaW5nW2ldKSB7XG4gICAgICAgICAgLy8gRG90IG5vdGF0aW9uIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgbGF0ZXJcbiAgICAgICAgICBpZiAoKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShmaWVsZCkuY2FsbChmaWVsZCwgJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGROYW1lID0gZmllbGQuc3BsaXQoJy4nKVswXTtcbiAgICAgICAgICAgIGlmIChmaWVsZE5hbWUgPT09IGF0dHIpIHtcbiAgICAgICAgICAgICAgaXNEb3ROb3RhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc0RvdE5vdGF0aW9uKSB7XG4gICAgICAgIGpzb25bYXR0cl0gPSBuZXcgX1BhcnNlT3AuU2V0T3AoZGlydHlPYmplY3RzW2F0dHJdKS50b0pTT04oKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChhdHRyIGluIHBlbmRpbmdbMF0pIHtcbiAgICAgIGpzb25bYXR0cl0gPSBwZW5kaW5nWzBdW2F0dHJdLnRvSlNPTigpO1xuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBfZ2V0U2F2ZVBhcmFtcygpIHtcbiAgICBsZXQgbWV0aG9kID0gdGhpcy5pZCA/ICdQVVQnIDogJ1BPU1QnO1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLl9nZXRTYXZlSlNPTigpO1xuICAgIGxldCBwYXRoID0gJ2NsYXNzZXMvJyArIHRoaXMuY2xhc3NOYW1lO1xuICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FMTE9XX0NVU1RPTV9PQkpFQ1RfSUQnKSkge1xuICAgICAgaWYgKCF0aGlzLmNyZWF0ZWRBdCkge1xuICAgICAgICBtZXRob2QgPSAnUE9TVCc7XG4gICAgICAgIGJvZHkub2JqZWN0SWQgPSB0aGlzLmlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0aG9kID0gJ1BVVCc7XG4gICAgICAgIHBhdGggKz0gJy8nICsgdGhpcy5pZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaWQpIHtcbiAgICAgIHBhdGggKz0gJy8nICsgdGhpcy5pZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInKSB7XG4gICAgICBwYXRoID0gJ3VzZXJzJztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIGJvZHksXG4gICAgICBwYXRoXG4gICAgfTtcbiAgfVxuICBfZmluaXNoRmV0Y2goc2VydmVyRGF0YSkge1xuICAgIGlmICghdGhpcy5pZCAmJiBzZXJ2ZXJEYXRhLm9iamVjdElkKSB7XG4gICAgICB0aGlzLmlkID0gc2VydmVyRGF0YS5vYmplY3RJZDtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgc3RhdGVDb250cm9sbGVyLmluaXRpYWxpemVTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgY29uc3QgZGVjb2RlZCA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBzZXJ2ZXJEYXRhKSB7XG4gICAgICBpZiAoYXR0ciA9PT0gJ0FDTCcpIHtcbiAgICAgICAgZGVjb2RlZFthdHRyXSA9IG5ldyBfUGFyc2VBQ0wuZGVmYXVsdChzZXJ2ZXJEYXRhW2F0dHJdKTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0ciAhPT0gJ29iamVjdElkJykge1xuICAgICAgICBkZWNvZGVkW2F0dHJdID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkoc2VydmVyRGF0YVthdHRyXSk7XG4gICAgICAgIGlmIChkZWNvZGVkW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkge1xuICAgICAgICAgIGRlY29kZWRbYXR0cl0uX2Vuc3VyZVBhcmVudEFuZEtleSh0aGlzLCBhdHRyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVjb2RlZC5jcmVhdGVkQXQgJiYgdHlwZW9mIGRlY29kZWQuY3JlYXRlZEF0ID09PSAnc3RyaW5nJykge1xuICAgICAgZGVjb2RlZC5jcmVhdGVkQXQgPSAoMCwgX3BhcnNlRGF0ZS5kZWZhdWx0KShkZWNvZGVkLmNyZWF0ZWRBdCk7XG4gICAgfVxuICAgIGlmIChkZWNvZGVkLnVwZGF0ZWRBdCAmJiB0eXBlb2YgZGVjb2RlZC51cGRhdGVkQXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkZWNvZGVkLnVwZGF0ZWRBdCA9ICgwLCBfcGFyc2VEYXRlLmRlZmF1bHQpKGRlY29kZWQudXBkYXRlZEF0KTtcbiAgICB9XG4gICAgaWYgKCFkZWNvZGVkLnVwZGF0ZWRBdCAmJiBkZWNvZGVkLmNyZWF0ZWRBdCkge1xuICAgICAgZGVjb2RlZC51cGRhdGVkQXQgPSBkZWNvZGVkLmNyZWF0ZWRBdDtcbiAgICB9XG4gICAgc3RhdGVDb250cm9sbGVyLmNvbW1pdFNlcnZlckNoYW5nZXModGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIGRlY29kZWQpO1xuICB9XG4gIF9zZXRFeGlzdGVkKGV4aXN0ZWQpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHN0YXRlQ29udHJvbGxlci5nZXRTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgaWYgKHN0YXRlKSB7XG4gICAgICBzdGF0ZS5leGlzdGVkID0gZXhpc3RlZDtcbiAgICB9XG4gIH1cbiAgX21pZ3JhdGVJZChzZXJ2ZXJJZCkge1xuICAgIGlmICh0aGlzLl9sb2NhbElkICYmIHNlcnZlcklkKSB7XG4gICAgICBpZiAoc2luZ2xlSW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgICAgIGNvbnN0IG9sZFN0YXRlID0gc3RhdGVDb250cm9sbGVyLnJlbW92ZVN0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICAgICAgdGhpcy5pZCA9IHNlcnZlcklkO1xuICAgICAgICBkZWxldGUgdGhpcy5fbG9jYWxJZDtcbiAgICAgICAgaWYgKG9sZFN0YXRlKSB7XG4gICAgICAgICAgc3RhdGVDb250cm9sbGVyLmluaXRpYWxpemVTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgb2xkU3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlkID0gc2VydmVySWQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sb2NhbElkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfaGFuZGxlU2F2ZVJlc3BvbnNlKHJlc3BvbnNlLCBzdGF0dXMpIHtcbiAgICBjb25zdCBjaGFuZ2VzID0ge307XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGVuZGluZyA9IHN0YXRlQ29udHJvbGxlci5wb3BQZW5kaW5nU3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgIGZvciAodmFyIGF0dHIgaW4gcGVuZGluZykge1xuICAgICAgaWYgKHBlbmRpbmdbYXR0cl0gaW5zdGFuY2VvZiBfUGFyc2VPcC5SZWxhdGlvbk9wKSB7XG4gICAgICAgIGNoYW5nZXNbYXR0cl0gPSBwZW5kaW5nW2F0dHJdLmFwcGx5VG8odW5kZWZpbmVkLCB0aGlzLCBhdHRyKTtcbiAgICAgIH0gZWxzZSBpZiAoIShhdHRyIGluIHJlc3BvbnNlKSkge1xuICAgICAgICAvLyBPbmx5IFNldE9wcyBhbmQgVW5zZXRPcHMgc2hvdWxkIG5vdCBjb21lIGJhY2sgd2l0aCByZXN1bHRzXG4gICAgICAgIGNoYW5nZXNbYXR0cl0gPSBwZW5kaW5nW2F0dHJdLmFwcGx5VG8odW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChhdHRyIGluIHJlc3BvbnNlKSB7XG4gICAgICBpZiAoKGF0dHIgPT09ICdjcmVhdGVkQXQnIHx8IGF0dHIgPT09ICd1cGRhdGVkQXQnKSAmJiB0eXBlb2YgcmVzcG9uc2VbYXR0cl0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNoYW5nZXNbYXR0cl0gPSAoMCwgX3BhcnNlRGF0ZS5kZWZhdWx0KShyZXNwb25zZVthdHRyXSk7XG4gICAgICB9IGVsc2UgaWYgKGF0dHIgPT09ICdBQ0wnKSB7XG4gICAgICAgIGNoYW5nZXNbYXR0cl0gPSBuZXcgX1BhcnNlQUNMLmRlZmF1bHQocmVzcG9uc2VbYXR0cl0pO1xuICAgICAgfSBlbHNlIGlmIChhdHRyICE9PSAnb2JqZWN0SWQnKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKHJlc3BvbnNlW2F0dHJdKTtcbiAgICAgICAgaWYgKHZhbCAmJiAoMCwgX2dldFByb3RvdHlwZU9mLmRlZmF1bHQpKHZhbCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgICBjaGFuZ2VzW2F0dHJdID0ge1xuICAgICAgICAgICAgLi4udGhpcy5hdHRyaWJ1dGVzW2F0dHJdLFxuICAgICAgICAgICAgLi4udmFsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGFuZ2VzW2F0dHJdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlT3AuVW5zZXRPcCkge1xuICAgICAgICAgIGNoYW5nZXNbYXR0cl0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuY3JlYXRlZEF0ICYmICFjaGFuZ2VzLnVwZGF0ZWRBdCkge1xuICAgICAgY2hhbmdlcy51cGRhdGVkQXQgPSBjaGFuZ2VzLmNyZWF0ZWRBdDtcbiAgICB9XG4gICAgdGhpcy5fbWlncmF0ZUlkKHJlc3BvbnNlLm9iamVjdElkKTtcbiAgICBpZiAoc3RhdHVzICE9PSAyMDEpIHtcbiAgICAgIHRoaXMuX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgfVxuICAgIHN0YXRlQ29udHJvbGxlci5jb21taXRTZXJ2ZXJDaGFuZ2VzKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpLCBjaGFuZ2VzKTtcbiAgfVxuICBfaGFuZGxlU2F2ZUVycm9yKCkge1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIHN0YXRlQ29udHJvbGxlci5tZXJnZUZpcnN0UGVuZGluZ1N0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgfVxuICBzdGF0aWMgX2dldENsYXNzTWFwKCkge1xuICAgIHJldHVybiBjbGFzc01hcDtcbiAgfVxuXG4gIC8qIFB1YmxpYyBtZXRob2RzICovXG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICAvLyBOT09QXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04gdmVyc2lvbiBvZiB0aGUgb2JqZWN0IHN1aXRhYmxlIGZvciBzYXZpbmcgdG8gUGFyc2UuXG4gICAqXG4gICAqIEBwYXJhbSBzZWVuXG4gICAqIEBwYXJhbSBvZmZsaW5lXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICB0b0pTT04oc2Vlbiwgb2ZmbGluZSkge1xuICAgIGNvbnN0IHNlZW5FbnRyeSA9IHRoaXMuaWQgPyB0aGlzLmNsYXNzTmFtZSArICc6JyArIHRoaXMuaWQgOiB0aGlzO1xuICAgIHNlZW4gPSBzZWVuIHx8IFtzZWVuRW50cnldO1xuICAgIGNvbnN0IGpzb24gPSB7fTtcbiAgICBjb25zdCBhdHRycyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cnMpIHtcbiAgICAgIGlmICgoYXR0ciA9PT0gJ2NyZWF0ZWRBdCcgfHwgYXR0ciA9PT0gJ3VwZGF0ZWRBdCcpICYmIGF0dHJzW2F0dHJdLnRvSlNPTikge1xuICAgICAgICBqc29uW2F0dHJdID0gYXR0cnNbYXR0cl0udG9KU09OKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uW2F0dHJdID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkoYXR0cnNbYXR0cl0sIGZhbHNlLCBmYWxzZSwgc2Vlbiwgb2ZmbGluZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgZm9yIChjb25zdCBhdHRyIGluIHBlbmRpbmdbMF0pIHtcbiAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoYXR0cikuY2FsbChhdHRyLCAnLicpIDwgMCkge1xuICAgICAgICBqc29uW2F0dHJdID0gcGVuZGluZ1swXVthdHRyXS50b0pTT04ob2ZmbGluZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlkKSB7XG4gICAgICBqc29uLm9iamVjdElkID0gdGhpcy5pZDtcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgUGFyc2VPYmplY3QgaXMgZXF1YWwgdG8gYW5vdGhlciBQYXJzZU9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3RoZXIgLSBBbiBvdGhlciBvYmplY3Qgb3QgY29tcGFyZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGVxdWFscyhvdGhlcikge1xuICAgIGlmICh0aGlzID09PSBvdGhlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0ICYmIHRoaXMuY2xhc3NOYW1lID09PSBvdGhlci5jbGFzc05hbWUgJiYgdGhpcy5pZCA9PT0gb3RoZXIuaWQgJiYgdHlwZW9mIHRoaXMuaWQgIT09ICd1bmRlZmluZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSBpdHMgbGFzdFxuICAgKiBzYXZlL3JlZnJlc2guICBJZiBhbiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCBpdCByZXR1cm5zIHRydWUgb25seSBpZiB0aGF0XG4gICAqIHBhcnRpY3VsYXIgYXR0cmlidXRlIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IHNhdmUvcmVmcmVzaC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgQW4gYXR0cmlidXRlIG5hbWUgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBkaXJ0eShhdHRyKSB7XG4gICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGVuZGluZ09wcyA9IHRoaXMuX2dldFBlbmRpbmdPcHMoKTtcbiAgICBjb25zdCBkaXJ0eU9iamVjdHMgPSB0aGlzLl9nZXREaXJ0eU9iamVjdEF0dHJpYnV0ZXMoKTtcbiAgICBpZiAoYXR0cikge1xuICAgICAgaWYgKGRpcnR5T2JqZWN0cy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZ09wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGVuZGluZ09wc1tpXS5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICgoMCwgX2tleXMuZGVmYXVsdCkocGVuZGluZ09wc1swXSkubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCgwLCBfa2V5cy5kZWZhdWx0KShkaXJ0eU9iamVjdHMpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGtleXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgbGFzdCBzYXZlL3JlZnJlc2hcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZGlydHlLZXlzKCkge1xuICAgIGNvbnN0IHBlbmRpbmdPcHMgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgY29uc3Qga2V5cyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZ09wcy5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChjb25zdCBhdHRyIGluIHBlbmRpbmdPcHNbaV0pIHtcbiAgICAgICAga2V5c1thdHRyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRpcnR5T2JqZWN0cyA9IHRoaXMuX2dldERpcnR5T2JqZWN0QXR0cmlidXRlcygpO1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBkaXJ0eU9iamVjdHMpIHtcbiAgICAgIGtleXNbYXR0cl0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIF9rZXlzLmRlZmF1bHQpKGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIGZldGNoZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNEYXRhQXZhaWxhYmxlKCkge1xuICAgIGNvbnN0IHNlcnZlckRhdGEgPSB0aGlzLl9nZXRTZXJ2ZXJEYXRhKCk7XG4gICAgcmV0dXJuICEhKDAsIF9rZXlzLmRlZmF1bHQpKHNlcnZlckRhdGEpLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgUG9pbnRlciByZWZlcmVuY2luZyB0aGlzIE9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge1BvaW50ZXJ9XG4gICAqL1xuICB0b1BvaW50ZXIoKSB7XG4gICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBwb2ludGVyIHRvIGFuIHVuc2F2ZWQgUGFyc2VPYmplY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIG9iamVjdElkOiB0aGlzLmlkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgUG9pbnRlciByZWZlcmVuY2luZyB0aGlzIE9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge1BvaW50ZXJ9XG4gICAqL1xuICB0b09mZmxpbmVQb2ludGVyKCkge1xuICAgIGlmICghdGhpcy5fbG9jYWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGEgb2ZmbGluZSBwb2ludGVyIHRvIGEgc2F2ZWQgUGFyc2VPYmplY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ09iamVjdCcsXG4gICAgICBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLFxuICAgICAgX2xvY2FsSWQ6IHRoaXMuX2xvY2FsSWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIHN0cmluZyBuYW1lIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBnZXQoYXR0cikge1xuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbYXR0cl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlbGF0aW9uIG9uIHRoZSBnaXZlbiBjbGFzcyBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIGF0dHJpYnV0ZSB0byBnZXQgdGhlIHJlbGF0aW9uIGZvci5cbiAgICogQHJldHVybnMge1BhcnNlLlJlbGF0aW9ufVxuICAgKi9cbiAgcmVsYXRpb24oYXR0cikge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoYXR0cik7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FsbGVkIHJlbGF0aW9uKCkgb24gbm9uLXJlbGF0aW9uIGZpZWxkICcgKyBhdHRyKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlLl9lbnN1cmVQYXJlbnRBbmRLZXkodGhpcywgYXR0cik7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCh0aGlzLCBhdHRyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBIVE1MLWVzY2FwZWQgdmFsdWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgc3RyaW5nIG5hbWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZXNjYXBlKGF0dHIpIHtcbiAgICBsZXQgdmFsID0gdGhpcy5hdHRyaWJ1dGVzW2F0dHJdO1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsLnRvU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHZhbCA9IHZhbC50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIF9lc2NhcGUuZGVmYXVsdCkodmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgY29udGFpbnMgYSB2YWx1ZSB0aGF0IGlzIG5vdFxuICAgKiBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIHN0cmluZyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaGFzKGF0dHIpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgIGlmIChhdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlc1thdHRyXSAhPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIGhhc2ggb2YgbW9kZWwgYXR0cmlidXRlcyBvbiB0aGUgb2JqZWN0LlxuICAgKlxuICAgKiA8cD5Zb3UgY2FuIGNhbGwgaXQgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyBrZXlzIGFuZCB2YWx1ZXMsIHdpdGggb25lXG4gICAqIGtleSBhbmQgdmFsdWUsIG9yIGRvdCBub3RhdGlvbi4gIEZvciBleGFtcGxlOjxwcmU+XG4gICAqICAgZ2FtZVR1cm4uc2V0KHtcbiAgICogICAgIHBsYXllcjogcGxheWVyMSxcbiAgICogICAgIGRpY2VSb2xsOiAyXG4gICAqICAgfSwge1xuICAgKiAgICAgZXJyb3I6IGZ1bmN0aW9uKGdhbWVUdXJuQWdhaW4sIGVycm9yKSB7XG4gICAqICAgICAgIC8vIFRoZSBzZXQgZmFpbGVkIHZhbGlkYXRpb24uXG4gICAqICAgICB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqICAgZ2FtZS5zZXQoXCJjdXJyZW50UGxheWVyXCIsIHBsYXllcjIsIHtcbiAgICogICAgIGVycm9yOiBmdW5jdGlvbihnYW1lVHVybkFnYWluLCBlcnJvcikge1xuICAgKiAgICAgICAvLyBUaGUgc2V0IGZhaWxlZCB2YWxpZGF0aW9uLlxuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIGdhbWUuc2V0KFwiZmluaXNoZWRcIiwgdHJ1ZSk7PC9wcmU+PC9wPlxuICAgKlxuICAgKiAgIGdhbWUuc2V0KFwicGxheWVyLnNjb3JlXCIsIDEwKTs8L3ByZT48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSBrZXkgVGhlIGtleSB0byBzZXQuXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZ2l2ZSBpdC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgQSBzZXQgb2Ygb3B0aW9ucyBmb3IgdGhlIHNldC5cbiAgICogICAgIFRoZSBvbmx5IHN1cHBvcnRlZCBvcHRpb24gaXMgPGNvZGU+ZXJyb3I8L2NvZGU+LlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0fGJvb2xlYW4pfSB0cnVlIGlmIHRoZSBzZXQgc3VjY2VlZGVkLlxuICAgKi9cbiAgc2V0KGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBsZXQgY2hhbmdlcyA9IHt9O1xuICAgIGNvbnN0IG5ld09wcyA9IHt9O1xuICAgIGlmIChrZXkgJiYgdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNoYW5nZXMgPSBrZXk7XG4gICAgICBvcHRpb25zID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgY2hhbmdlc1trZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBsZXQgcmVhZG9ubHkgPSBbXTtcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uc3RydWN0b3IucmVhZE9ubHlBdHRyaWJ1dGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZWFkb25seSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHJlYWRvbmx5KS5jYWxsKHJlYWRvbmx5LCB0aGlzLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlcygpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrIGluIGNoYW5nZXMpIHtcbiAgICAgIGlmIChrID09PSAnY3JlYXRlZEF0JyB8fCBrID09PSAndXBkYXRlZEF0Jykge1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IGlzIHJlYWQtb25seSwgYnV0IGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzaWxlbnRseVxuICAgICAgICAvLyBpZ25vcmUgaXRcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHJlYWRvbmx5KS5jYWxsKHJlYWRvbmx5LCBrKSA+IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1vZGlmeSByZWFkb25seSBhdHRyaWJ1dGU6ICcgKyBrKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnVuc2V0KSB7XG4gICAgICAgIG5ld09wc1trXSA9IG5ldyBfUGFyc2VPcC5VbnNldE9wKCk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXNba10gaW5zdGFuY2VvZiBfUGFyc2VPcC5PcCkge1xuICAgICAgICBuZXdPcHNba10gPSBjaGFuZ2VzW2tdO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzW2tdICYmIHR5cGVvZiBjaGFuZ2VzW2tdID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY2hhbmdlc1trXS5fX29wID09PSAnc3RyaW5nJykge1xuICAgICAgICBuZXdPcHNba10gPSAoMCwgX1BhcnNlT3Aub3BGcm9tSlNPTikoY2hhbmdlc1trXSk7XG4gICAgICB9IGVsc2UgaWYgKGsgPT09ICdvYmplY3RJZCcgfHwgayA9PT0gJ2lkJykge1xuICAgICAgICBpZiAodHlwZW9mIGNoYW5nZXNba10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5pZCA9IGNoYW5nZXNba107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoayA9PT0gJ0FDTCcgJiYgdHlwZW9mIGNoYW5nZXNba10gPT09ICdvYmplY3QnICYmICEoY2hhbmdlc1trXSBpbnN0YW5jZW9mIF9QYXJzZUFDTC5kZWZhdWx0KSkge1xuICAgICAgICBuZXdPcHNba10gPSBuZXcgX1BhcnNlT3AuU2V0T3AobmV3IF9QYXJzZUFDTC5kZWZhdWx0KGNoYW5nZXNba10pKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlc1trXSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpb24gPSBuZXcgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCh0aGlzLCBrKTtcbiAgICAgICAgcmVsYXRpb24udGFyZ2V0Q2xhc3NOYW1lID0gY2hhbmdlc1trXS50YXJnZXRDbGFzc05hbWU7XG4gICAgICAgIG5ld09wc1trXSA9IG5ldyBfUGFyc2VPcC5TZXRPcChyZWxhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdPcHNba10gPSBuZXcgX1BhcnNlT3AuU2V0T3AoY2hhbmdlc1trXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRBdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyB2YWx1ZXNcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gbmV3T3BzKSB7XG4gICAgICBpZiAobmV3T3BzW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlT3AuUmVsYXRpb25PcCkge1xuICAgICAgICBuZXdWYWx1ZXNbYXR0cl0gPSBuZXdPcHNbYXR0cl0uYXBwbHlUbyhjdXJyZW50QXR0cmlidXRlc1thdHRyXSwgdGhpcywgYXR0cik7XG4gICAgICB9IGVsc2UgaWYgKCEobmV3T3BzW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlT3AuVW5zZXRPcCkpIHtcbiAgICAgICAgbmV3VmFsdWVzW2F0dHJdID0gbmV3T3BzW2F0dHJdLmFwcGx5VG8oY3VycmVudEF0dHJpYnV0ZXNbYXR0cl0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5nZXNcbiAgICBpZiAoIW9wdGlvbnMuaWdub3JlVmFsaWRhdGlvbikge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMudmFsaWRhdGUobmV3VmFsdWVzKTtcbiAgICAgIGlmICh2YWxpZGF0aW9uKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9wdGlvbnMuZXJyb3IodGhpcywgdmFsaWRhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnNvbGlkYXRlIE9wc1xuICAgIGNvbnN0IHBlbmRpbmdPcHMgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgY29uc3QgbGFzdCA9IHBlbmRpbmdPcHMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gbmV3T3BzKSB7XG4gICAgICBjb25zdCBuZXh0T3AgPSBuZXdPcHNbYXR0cl0ubWVyZ2VXaXRoKHBlbmRpbmdPcHNbbGFzdF1bYXR0cl0pO1xuICAgICAgc3RhdGVDb250cm9sbGVyLnNldFBlbmRpbmdPcCh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgYXR0ciwgbmV4dE9wKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBtb2RlbC4gVGhpcyBpcyBhIG5vb3AgaWYgdGhlIGF0dHJpYnV0ZSBkb2Vzbid0XG4gICAqIGV4aXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgc3RyaW5nIG5hbWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICB1bnNldChhdHRyLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy51bnNldCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG51bGwsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZSB0aGUgbmV4dCB0aW1lIHRoZVxuICAgKiBvYmplY3QgaXMgc2F2ZWQuIElmIG5vIGFtb3VudCBpcyBzcGVjaWZpZWQsIDEgaXMgdXNlZCBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gYW1vdW50IHtOdW1iZXJ9IFRoZSBhbW91bnQgdG8gaW5jcmVtZW50IGJ5IChvcHRpb25hbCkuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3R8Ym9vbGVhbil9XG4gICAqL1xuICBpbmNyZW1lbnQoYXR0ciwgYW1vdW50KSB7XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBhbW91bnQgPSAxO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGluY3JlbWVudCBieSBhIG5vbi1udW1lcmljIGFtb3VudC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5JbmNyZW1lbnRPcChhbW91bnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdGhlIG5leHQgdGltZSB0aGVcbiAgICogb2JqZWN0IGlzIHNhdmVkLiBJZiBubyBhbW91bnQgaXMgc3BlY2lmaWVkLCAxIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGFtb3VudCB7TnVtYmVyfSBUaGUgYW1vdW50IHRvIGRlY3JlbWVudCBieSAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICBkZWNyZW1lbnQoYXR0ciwgYW1vdW50KSB7XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBhbW91bnQgPSAxO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGRlY3JlbWVudCBieSBhIG5vbi1udW1lcmljIGFtb3VudC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5JbmNyZW1lbnRPcChhbW91bnQgKiAtMSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgYWRkIGFuIG9iamVjdCB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICAgKiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBpdGVtIHt9IFRoZSBpdGVtIHRvIGFkZC5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgYWRkKGF0dHIsIGl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbmV3IF9QYXJzZU9wLkFkZE9wKFtpdGVtXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgYWRkIHRoZSBvYmplY3RzIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuXG4gICAqIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGl0ZW1zIHtPYmplY3RbXX0gVGhlIGl0ZW1zIHRvIGFkZC5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgYWRkQWxsKGF0dHIsIGl0ZW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5BZGRPcChpdGVtcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgYWRkIGFuIG9iamVjdCB0byB0aGUgYXJyYXkgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5LCBvbmx5XG4gICAqIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGFycmF5LiBUaGUgcG9zaXRpb24gb2YgdGhlIGluc2VydCBpc1xuICAgKiBub3QgZ3VhcmFudGVlZC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGl0ZW0ge30gVGhlIG9iamVjdCB0byBhZGQuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIGFkZFVuaXF1ZShhdHRyLCBpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5BZGRVbmlxdWVPcChbaXRlbV0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IGFkZCB0aGUgb2JqZWN0cyB0byB0aGUgYXJyYXkgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5LCBvbmx5XG4gICAqIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGFycmF5LiBUaGUgcG9zaXRpb24gb2YgdGhlIGluc2VydCBpc1xuICAgKiBub3QgZ3VhcmFudGVlZC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGl0ZW1zIHtPYmplY3RbXX0gVGhlIG9iamVjdHMgdG8gYWRkLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICBhZGRBbGxVbmlxdWUoYXR0ciwgaXRlbXMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbmV3IF9QYXJzZU9wLkFkZFVuaXF1ZU9wKGl0ZW1zKSk7XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSByZW1vdmUgYWxsIGluc3RhbmNlcyBvZiBhbiBvYmplY3QgZnJvbSB0aGUgYXJyYXkgYXNzb2NpYXRlZFxuICAgKiB3aXRoIGEgZ2l2ZW4ga2V5LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gaXRlbSB7fSBUaGUgb2JqZWN0IHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgcmVtb3ZlKGF0dHIsIGl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbmV3IF9QYXJzZU9wLlJlbW92ZU9wKFtpdGVtXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgcmVtb3ZlIGFsbCBpbnN0YW5jZXMgb2YgdGhlIG9iamVjdHMgZnJvbSB0aGUgYXJyYXkgYXNzb2NpYXRlZFxuICAgKiB3aXRoIGEgZ2l2ZW4ga2V5LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gaXRlbXMge09iamVjdFtdfSBUaGUgb2JqZWN0IHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgcmVtb3ZlQWxsKGF0dHIsIGl0ZW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHIsIG5ldyBfUGFyc2VPcC5SZW1vdmVPcChpdGVtcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBQYXJzZS5PcCBkZXNjcmliaW5nIHdoYXQga2luZCBvZlxuICAgKiBtb2RpZmljYXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkIG9uIHRoaXMgZmllbGQgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXNcbiAgICogc2F2ZWQuIEZvciBleGFtcGxlLCBhZnRlciBjYWxsaW5nIG9iamVjdC5pbmNyZW1lbnQoXCJ4XCIpLCBjYWxsaW5nXG4gICAqIG9iamVjdC5vcChcInhcIikgd291bGQgcmV0dXJuIGFuIGluc3RhbmNlIG9mIFBhcnNlLk9wLkluY3JlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHJldHVybnMge1BhcnNlLk9wIHwgdW5kZWZpbmVkfSBUaGUgb3BlcmF0aW9uLCBvciB1bmRlZmluZWQgaWYgbm9uZS5cbiAgICovXG4gIG9wKGF0dHIpIHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGZvciAobGV0IGkgPSBwZW5kaW5nLmxlbmd0aDsgaS0tOykge1xuICAgICAgaWYgKHBlbmRpbmdbaV1bYXR0cl0pIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdbaV1bYXR0cl07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbW9kZWwgd2l0aCBpZGVudGljYWwgYXR0cmlidXRlcyB0byB0aGlzIG9uZS5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH1cbiAgICovXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IGNsb25lID0gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5jbGFzc05hbWUpO1xuICAgIGxldCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgIGlmICh0eXBlb2YgdGhpcy5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHJlYWRvbmx5ID0gdGhpcy5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMoKSB8fCBbXTtcbiAgICAgIC8vIEF0dHJpYnV0ZXMgYXJlIGZyb3plbiwgc28gd2UgaGF2ZSB0byByZWJ1aWxkIGFuIG9iamVjdCxcbiAgICAgIC8vIHJhdGhlciB0aGFuIGRlbGV0ZSByZWFkb25seSBrZXlzXG4gICAgICBjb25zdCBjb3B5ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGEgaW4gYXR0cmlidXRlcykge1xuICAgICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHJlYWRvbmx5KS5jYWxsKHJlYWRvbmx5LCBhKSA8IDApIHtcbiAgICAgICAgICBjb3B5W2FdID0gYXR0cmlidXRlc1thXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXR0cmlidXRlcyA9IGNvcHk7XG4gICAgfVxuICAgIGlmIChjbG9uZS5zZXQpIHtcbiAgICAgIGNsb25lLnNldChhdHRyaWJ1dGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBvYmplY3QuIE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGNsb25lKClcbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH1cbiAgICovXG4gIG5ld0luc3RhbmNlKCkge1xuICAgIGNvbnN0IGNsb25lID0gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5jbGFzc05hbWUpO1xuICAgIGNsb25lLmlkID0gdGhpcy5pZDtcbiAgICBpZiAoc2luZ2xlSW5zdGFuY2UpIHtcbiAgICAgIC8vIEp1c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIHRoZSByaWdodCBpZFxuICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoc3RhdGVDb250cm9sbGVyKSB7XG4gICAgICBzdGF0ZUNvbnRyb2xsZXIuZHVwbGljYXRlU3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIGNsb25lLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvYmplY3QgaGFzIG5ldmVyIGJlZW4gc2F2ZWQgdG8gUGFyc2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNOZXcoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9iamVjdCB3YXMgY3JlYXRlZCBieSB0aGUgUGFyc2Ugc2VydmVyIHdoZW4gdGhlXG4gICAqIG9iamVjdCBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiB0aGVyZSAoZS5nLiBpbiB0aGUgY2FzZSBvZiBhIEZhY2Vib29rXG4gICAqIGxvZ2luKVxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGV4aXN0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHN0YXRlID0gc3RhdGVDb250cm9sbGVyLmdldFN0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5leGlzdGVkO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgb2JqZWN0IGV4aXN0cyBvbiB0aGUgU2VydmVyXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBib29sZWFuIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgaWYgb2JqZWN0IGV4aXN0cy5cbiAgICovXG4gIGFzeW5jIGV4aXN0cyhvcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBQYXJzZVF1ZXJ5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VRdWVyeSgpO1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeSh0aGlzLmNsYXNzTmFtZSk7XG4gICAgICBhd2FpdCBxdWVyeS5nZXQodGhpcy5pZCwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlID09PSBfUGFyc2VFcnJvci5kZWZhdWx0Lk9CSkVDVF9OT1RfRk9VTkQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBtb2RlbCBpcyBjdXJyZW50bHkgaW4gYSB2YWxpZCBzdGF0ZS5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc1ZhbGlkKCkge1xuICAgIHJldHVybiAhdGhpcy52YWxpZGF0ZSh0aGlzLmF0dHJpYnV0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBzaG91bGQgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSB1bmxlc3MgeW91IHN1YmNsYXNzXG4gICAqIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4sIGluIHdoaWNoIGNhc2UgeW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZFxuICAgKiB0byBwcm92aWRlIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBvbiA8Y29kZT5zZXQ8L2NvZGU+IGFuZFxuICAgKiA8Y29kZT5zYXZlPC9jb2RlPi4gIFlvdXIgaW1wbGVtZW50YXRpb24gc2hvdWxkIHJldHVyblxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cnMgVGhlIGN1cnJlbnQgZGF0YSB0byB2YWxpZGF0ZS5cbiAgICogQHJldHVybnMge1BhcnNlLkVycm9yfGJvb2xlYW59IEZhbHNlIGlmIHRoZSBkYXRhIGlzIHZhbGlkLiAgQW4gZXJyb3Igb2JqZWN0IG90aGVyd2lzZS5cbiAgICogQHNlZSBQYXJzZS5PYmplY3Qjc2V0XG4gICAqL1xuICB2YWxpZGF0ZShhdHRycykge1xuICAgIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eSgnQUNMJykgJiYgIShhdHRycy5BQ0wgaW5zdGFuY2VvZiBfUGFyc2VBQ0wuZGVmYXVsdCkpIHtcbiAgICAgIHJldHVybiBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnQUNMIG11c3QgYmUgYSBQYXJzZSBBQ0wuJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgICBpZiAoIS9eW0EtWmEtel1bMC05QS1aYS16Xy5dKiQvLnRlc3Qoa2V5KSkge1xuICAgICAgICByZXR1cm4gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0tFWV9OQU1FKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIEFDTCBmb3IgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5BQ0x8bnVsbH0gQW4gaW5zdGFuY2Ugb2YgUGFyc2UuQUNMLlxuICAgKiBAc2VlIFBhcnNlLk9iamVjdCNnZXRcbiAgICovXG4gIGdldEFDTCgpIHtcbiAgICBjb25zdCBhY2wgPSB0aGlzLmdldCgnQUNMJyk7XG4gICAgaWYgKGFjbCBpbnN0YW5jZW9mIF9QYXJzZUFDTC5kZWZhdWx0KSB7XG4gICAgICByZXR1cm4gYWNsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBBQ0wgdG8gYmUgdXNlZCBmb3IgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2UuQUNMfSBhY2wgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuQUNMLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9IFdoZXRoZXIgdGhlIHNldCBwYXNzZWQgdmFsaWRhdGlvbi5cbiAgICogQHNlZSBQYXJzZS5PYmplY3Qjc2V0XG4gICAqL1xuICBzZXRBQ0woYWNsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0KCdBQ0wnLCBhY2wsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbnkgKG9yIHNwZWNpZmljKSBjaGFuZ2VzIHRvIHRoaXMgb2JqZWN0IG1hZGUgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBzYXZlKClcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXlzXSAtIHNwZWNpZnkgd2hpY2ggZmllbGRzIHRvIHJldmVydFxuICAgKi9cbiAgcmV2ZXJ0KCkge1xuICAgIGxldCBrZXlzVG9SZXZlcnQ7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBrZXlzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBpZiAoa2V5cy5sZW5ndGgpIHtcbiAgICAgIGtleXNUb1JldmVydCA9IFtdO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBrZXlzVG9SZXZlcnQucHVzaChrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyc2UuT2JqZWN0I3JldmVydCBleHBlY3RzIGVpdGhlciBubywgb3IgYSBsaXN0IG9mIHN0cmluZywgYXJndW1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2NsZWFyUGVuZGluZ09wcyhrZXlzVG9SZXZlcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgYXR0cmlidXRlcyBvbiBhIG1vZGVsXG4gICAqXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgY29uc3QgZXJhc2FibGUgPSB7fTtcbiAgICBsZXQgcmVhZG9ubHkgPSBbJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnXTtcbiAgICBpZiAodHlwZW9mIHRoaXMuY29uc3RydWN0b3IucmVhZE9ubHlBdHRyaWJ1dGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZWFkb25seSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHJlYWRvbmx5KS5jYWxsKHJlYWRvbmx5LCB0aGlzLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlcygpKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkocmVhZG9ubHkpLmNhbGwocmVhZG9ubHksIGF0dHIpIDwgMCkge1xuICAgICAgICBlcmFzYWJsZVthdHRyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNldChlcmFzYWJsZSwge1xuICAgICAgdW5zZXQ6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgbW9kZWwgZnJvbSB0aGUgc2VydmVyLiBJZiB0aGUgc2VydmVyJ3MgcmVwcmVzZW50YXRpb24gb2YgdGhlXG4gICAqIG1vZGVsIGRpZmZlcnMgZnJvbSBpdHMgY3VycmVudCBhdHRyaWJ1dGVzLCB0aGV5IHdpbGwgYmUgb3ZlcnJpZGVuLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+aW5jbHVkZTogVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBpbmNsdWRlLiBDYW4gYmUgYSBzdHJpbmcsIGFuIGFycmF5IG9mIHN0cmluZ3MsXG4gICAqICAgICAgIG9yIGFuIGFycmF5IG9mIGFycmF5IG9mIHN0cmluZ3MuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRmluZGAgdHJpZ2dlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBmZXRjaFxuICAgKiAgICAgY29tcGxldGVzLlxuICAgKi9cbiAgZmV0Y2gob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZmV0Y2hPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGZldGNoT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZmV0Y2hPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdpbmNsdWRlJykpIHtcbiAgICAgIGZldGNoT3B0aW9ucy5pbmNsdWRlID0gW107XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9wdGlvbnMuaW5jbHVkZSkpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0O1xuICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQgPSBvcHRpb25zLmluY2x1ZGUpLmNhbGwoX2NvbnRleHQsIGtleSA9PiB7XG4gICAgICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgICAgICB2YXIgX2NvbnRleHQyO1xuICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmluY2x1ZGUgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDIgPSBmZXRjaE9wdGlvbnMuaW5jbHVkZSkuY2FsbChfY29udGV4dDIsIGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZldGNoT3B0aW9ucy5pbmNsdWRlLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmV0Y2hPcHRpb25zLmluY2x1ZGUucHVzaChvcHRpb25zLmluY2x1ZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmZldGNoKHRoaXMsIHRydWUsIGZldGNoT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIG1vZGVsIGZyb20gdGhlIHNlcnZlci4gSWYgdGhlIHNlcnZlcidzIHJlcHJlc2VudGF0aW9uIG9mIHRoZVxuICAgKiBtb2RlbCBkaWZmZXJzIGZyb20gaXRzIGN1cnJlbnQgYXR0cmlidXRlcywgdGhleSB3aWxsIGJlIG92ZXJyaWRlbi5cbiAgICpcbiAgICogSW5jbHVkZXMgbmVzdGVkIFBhcnNlLk9iamVjdHMgZm9yIHRoZSBwcm92aWRlZCBrZXkuIFlvdSBjYW4gdXNlIGRvdFxuICAgKiBub3RhdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkcyBpbiB0aGUgaW5jbHVkZWQgb2JqZWN0IGFyZSBhbHNvIGZldGNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgQXJyYXk8c3RyaW5nPj59IGtleXMgVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBmZXRjaFxuICAgKiAgICAgY29tcGxldGVzLlxuICAgKi9cbiAgZmV0Y2hXaXRoSW5jbHVkZShrZXlzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5pbmNsdWRlID0ga2V5cztcbiAgICByZXR1cm4gdGhpcy5mZXRjaChvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGlzIG9iamVjdCB0byB0aGUgc2VydmVyIGF0IHNvbWUgdW5zcGVjaWZpZWQgdGltZSBpbiB0aGUgZnV0dXJlLFxuICAgKiBldmVuIGlmIFBhcnNlIGlzIGN1cnJlbnRseSBpbmFjY2Vzc2libGUuXG4gICAqXG4gICAqIFVzZSB0aGlzIHdoZW4geW91IG1heSBub3QgaGF2ZSBhIHNvbGlkIG5ldHdvcmsgY29ubmVjdGlvbiwgYW5kIGRvbid0IG5lZWQgdG8ga25vdyB3aGVuIHRoZSBzYXZlIGNvbXBsZXRlcy5cbiAgICogSWYgdGhlcmUgaXMgc29tZSBwcm9ibGVtIHdpdGggdGhlIG9iamVjdCBzdWNoIHRoYXQgaXQgY2FuJ3QgYmUgc2F2ZWQsIGl0IHdpbGwgYmUgc2lsZW50bHkgZGlzY2FyZGVkLlxuICAgKlxuICAgKiBPYmplY3RzIHNhdmVkIHdpdGggdGhpcyBtZXRob2Qgd2lsbCBiZSBzdG9yZWQgbG9jYWxseSBpbiBhbiBvbi1kaXNrIGNhY2hlIHVudGlsIHRoZXkgY2FuIGJlIGRlbGl2ZXJlZCB0byBQYXJzZS5cbiAgICogVGhleSB3aWxsIGJlIHNlbnQgaW1tZWRpYXRlbHkgaWYgcG9zc2libGUuIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIHNlbnQgdGhlIG5leHQgdGltZSBhIG5ldHdvcmsgY29ubmVjdGlvbiBpc1xuICAgKiBhdmFpbGFibGUuIE9iamVjdHMgc2F2ZWQgdGhpcyB3YXkgd2lsbCBwZXJzaXN0IGV2ZW4gYWZ0ZXIgdGhlIGFwcCBpcyBjbG9zZWQsIGluIHdoaWNoIGNhc2UgdGhleSB3aWxsIGJlIHNlbnQgdGhlXG4gICAqIG5leHQgdGltZSB0aGUgYXBwIGlzIG9wZW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBVc2VkIHRvIHBhc3Mgb3B0aW9uIHBhcmFtZXRlcnMgdG8gbWV0aG9kIGlmIGFyZzEgYW5kIGFyZzIgd2VyZSBib3RoIHBhc3NlZCBhcyBzdHJpbmdzLlxuICAgKiBWYWxpZCBvcHRpb25zIGFyZTpcbiAgICogPHVsPlxuICAgKiA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPGxpPmNhc2NhZGVTYXZlOiBJZiBgZmFsc2VgLCBuZXN0ZWQgb2JqZWN0cyB3aWxsIG5vdCBiZSBzYXZlZCAoZGVmYXVsdCBpcyBgdHJ1ZWApLlxuICAgKiA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVTYXZlYCBhbmQgYGFmdGVyU2F2ZWAgdHJpZ2dlcnMuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgc2F2ZVxuICAgKiBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBzYXZlRXZlbnR1YWxseShvcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZShudWxsLCBvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlID09PSBfUGFyc2VFcnJvci5kZWZhdWx0LkNPTk5FQ1RJT05fRkFJTEVEKSB7XG4gICAgICAgIGF3YWl0IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50dWFsbHlRdWV1ZSgpLnNhdmUodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50dWFsbHlRdWV1ZSgpLnBvbGwoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgaGFzaCBvZiBtb2RlbCBhdHRyaWJ1dGVzLCBhbmQgc2F2ZSB0aGUgbW9kZWwgdG8gdGhlIHNlcnZlci5cbiAgICogdXBkYXRlZEF0IHdpbGwgYmUgdXBkYXRlZCB3aGVuIHRoZSByZXF1ZXN0IHJldHVybnMuXG4gICAqIFlvdSBjYW4gZWl0aGVyIGNhbGwgaXQgYXM6PHByZT5cbiAgICogb2JqZWN0LnNhdmUoKTs8L3ByZT5cbiAgICogb3I8cHJlPlxuICAgKiBvYmplY3Quc2F2ZShhdHRycyk7PC9wcmU+XG4gICAqIG9yPHByZT5cbiAgICogb2JqZWN0LnNhdmUobnVsbCwgb3B0aW9ucyk7PC9wcmU+XG4gICAqIG9yPHByZT5cbiAgICogb2JqZWN0LnNhdmUoYXR0cnMsIG9wdGlvbnMpOzwvcHJlPlxuICAgKiBvcjxwcmU+XG4gICAqIG9iamVjdC5zYXZlKGtleSwgdmFsdWUpOzwvcHJlPlxuICAgKiBvcjxwcmU+XG4gICAqIG9iamVjdC5zYXZlKGtleSwgdmFsdWUsIG9wdGlvbnMpOzwvcHJlPlxuICAgKlxuICAgKiBFeGFtcGxlIDE6IDxwcmU+XG4gICAqIGdhbWVUdXJuLnNhdmUoe1xuICAgKiBwbGF5ZXI6IFwiSmFrZSBDdXR0ZXJcIixcbiAgICogZGljZVJvbGw6IDJcbiAgICogfSkudGhlbihmdW5jdGlvbihnYW1lVHVybkFnYWluKSB7XG4gICAqIC8vIFRoZSBzYXZlIHdhcyBzdWNjZXNzZnVsLlxuICAgKiB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgKiAvLyBUaGUgc2F2ZSBmYWlsZWQuICBFcnJvciBpcyBhbiBpbnN0YW5jZSBvZiBQYXJzZS5FcnJvci5cbiAgICogfSk7PC9wcmU+XG4gICAqXG4gICAqIEV4YW1wbGUgMjogPHByZT5cbiAgICogZ2FtZVR1cm4uc2F2ZShcInBsYXllclwiLCBcIkpha2UgQ3V0dGVyXCIpOzwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG9iamVjdCB8IG51bGx9IFthcmcxXVxuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqIDxsaT5gT2JqZWN0YCAtIEtleS92YWx1ZSBwYWlycyB0byB1cGRhdGUgb24gdGhlIG9iamVjdC48L2xpPlxuICAgKiA8bGk+YFN0cmluZ2AgS2V5IC0gS2V5IG9mIGF0dHJpYnV0ZSB0byB1cGRhdGUgKHJlcXVpcmVzIGFyZzIgdG8gYWxzbyBiZSBzdHJpbmcpPC9saT5cbiAgICogPGxpPmBudWxsYCAtIFBhc3NpbmcgbnVsbCBmb3IgYXJnMSBhbGxvd3MgeW91IHRvIHNhdmUgdGhlIG9iamVjdCB3aXRoIG9wdGlvbnMgcGFzc2VkIGluIGFyZzIuPC9saT5cbiAgICogPC91bD5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBvYmplY3R9IFthcmcyXVxuICAgKiA8dWw+XG4gICAqIDxsaT5gU3RyaW5nYCBWYWx1ZSAtIElmIGFyZzEgd2FzIHBhc3NlZCBhcyBhIGtleSwgYXJnMiBpcyB0aGUgdmFsdWUgdGhhdCBzaG91bGQgYmUgc2V0IG9uIHRoYXQga2V5LjwvbGk+XG4gICAqIDxsaT5gT2JqZWN0YCBPcHRpb25zIC0gVmFsaWQgb3B0aW9ucyBhcmU6XG4gICAqIDx1bD5cbiAgICogPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPGxpPmNhc2NhZGVTYXZlOiBJZiBgZmFsc2VgLCBuZXN0ZWQgb2JqZWN0cyB3aWxsIG5vdCBiZSBzYXZlZCAoZGVmYXVsdCBpcyBgdHJ1ZWApLlxuICAgKiA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVTYXZlYCBhbmQgYGFmdGVyU2F2ZWAgdHJpZ2dlcnMuXG4gICAqIDwvdWw+XG4gICAqIDwvbGk+XG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnM11cbiAgICogVXNlZCB0byBwYXNzIG9wdGlvbiBwYXJhbWV0ZXJzIHRvIG1ldGhvZCBpZiBhcmcxIGFuZCBhcmcyIHdlcmUgYm90aCBwYXNzZWQgYXMgc3RyaW5ncy5cbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6XG4gICAqIDx1bD5cbiAgICogPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPGxpPmNhc2NhZGVTYXZlOiBJZiBgZmFsc2VgLCBuZXN0ZWQgb2JqZWN0cyB3aWxsIG5vdCBiZSBzYXZlZCAoZGVmYXVsdCBpcyBgdHJ1ZWApLlxuICAgKiA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVTYXZlYCBhbmQgYGFmdGVyU2F2ZWAgdHJpZ2dlcnMuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgc2F2ZVxuICAgKiBjb21wbGV0ZXMuXG4gICAqL1xuICBzYXZlKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBsZXQgYXR0cnM7XG4gICAgbGV0IG9wdGlvbnM7XG4gICAgaWYgKHR5cGVvZiBhcmcxID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgYXJnMSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGF0dHJzID0gYXJnMTtcbiAgICAgIGlmICh0eXBlb2YgYXJnMiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IGFyZzI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dHJzID0ge307XG4gICAgICBhdHRyc1thcmcxXSA9IGFyZzI7XG4gICAgICBvcHRpb25zID0gYXJnMztcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKGF0dHJzKSB7XG4gICAgICBsZXQgdmFsaWRhdGlvbkVycm9yO1xuICAgICAgb3B0aW9ucy5lcnJvciA9IChfLCB2YWxpZGF0aW9uKSA9PiB7XG4gICAgICAgIHZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRpb247XG4gICAgICB9O1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuc2V0KGF0dHJzLCBvcHRpb25zKTtcbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QodmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2F2ZU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHNhdmVPcHRpb25zLnVzZU1hc3RlcktleSA9ICEhb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSAmJiB0eXBlb2Ygb3B0aW9ucy5zZXNzaW9uVG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICBzYXZlT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2luc3RhbGxhdGlvbklkJykgJiYgdHlwZW9mIG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzYXZlT3B0aW9ucy5pbnN0YWxsYXRpb25JZCA9IG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHNhdmVPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdW5zYXZlZCA9IG9wdGlvbnMuY2FzY2FkZVNhdmUgIT09IGZhbHNlID8gKDAsIF91bnNhdmVkQ2hpbGRyZW4uZGVmYXVsdCkodGhpcykgOiBudWxsO1xuICAgIHJldHVybiBjb250cm9sbGVyLnNhdmUodW5zYXZlZCwgc2F2ZU9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuc2F2ZSh0aGlzLCBzYXZlT3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGlzIG9iamVjdCBmcm9tIHRoZSBzZXJ2ZXIgYXQgc29tZSB1bnNwZWNpZmllZCB0aW1lIGluIHRoZSBmdXR1cmUsXG4gICAqIGV2ZW4gaWYgUGFyc2UgaXMgY3VycmVudGx5IGluYWNjZXNzaWJsZS5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB5b3UgbWF5IG5vdCBoYXZlIGEgc29saWQgbmV0d29yayBjb25uZWN0aW9uLFxuICAgKiBhbmQgZG9uJ3QgbmVlZCB0byBrbm93IHdoZW4gdGhlIGRlbGV0ZSBjb21wbGV0ZXMuIElmIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSB3aXRoIHRoZSBvYmplY3RcbiAgICogc3VjaCB0aGF0IGl0IGNhbid0IGJlIGRlbGV0ZWQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgc2lsZW50bHkgZGlzY2FyZGVkLlxuICAgKlxuICAgKiBEZWxldGUgaW5zdHJ1Y3Rpb25zIG1hZGUgd2l0aCB0aGlzIG1ldGhvZCB3aWxsIGJlIHN0b3JlZCBsb2NhbGx5IGluIGFuIG9uLWRpc2sgY2FjaGUgdW50aWwgdGhleSBjYW4gYmUgdHJhbnNtaXR0ZWRcbiAgICogdG8gUGFyc2UuIFRoZXkgd2lsbCBiZSBzZW50IGltbWVkaWF0ZWx5IGlmIHBvc3NpYmxlLiBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSBzZW50IHRoZSBuZXh0IHRpbWUgYSBuZXR3b3JrIGNvbm5lY3Rpb25cbiAgICogaXMgYXZhaWxhYmxlLiBEZWxldGUgcmVxdWVzdHMgd2lsbCBwZXJzaXN0IGV2ZW4gYWZ0ZXIgdGhlIGFwcCBpcyBjbG9zZWQsIGluIHdoaWNoIGNhc2UgdGhleSB3aWxsIGJlIHNlbnQgdGhlXG4gICAqIG5leHQgdGltZSB0aGUgYXBwIGlzIG9wZW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRGVsZXRlYCBhbmQgYGFmdGVyRGVsZXRlYCB0cmlnZ2Vycy5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBkZXN0cm95XG4gICAqICAgICBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBkZXN0cm95RXZlbnR1YWxseShvcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveShvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5jb2RlID09PSBfUGFyc2VFcnJvci5kZWZhdWx0LkNPTk5FQ1RJT05fRkFJTEVEKSB7XG4gICAgICAgIGF3YWl0IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50dWFsbHlRdWV1ZSgpLmRlc3Ryb3kodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50dWFsbHlRdWV1ZSgpLnBvbGwoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSB0aGlzIG1vZGVsIG9uIHRoZSBzZXJ2ZXIgaWYgaXQgd2FzIGFscmVhZHkgcGVyc2lzdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVEZWxldGVgIGFuZCBgYWZ0ZXJEZWxldGVgIHRyaWdnZXJzLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIGRlc3Ryb3lcbiAgICogICAgIGNvbXBsZXRlcy5cbiAgICovXG4gIGRlc3Ryb3kob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGRlc3Ryb3lPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBkZXN0cm95T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBkZXN0cm95T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZGVzdHJveU9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKCk7XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCkuZGVzdHJveSh0aGlzLCBkZXN0cm95T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgc3RvcmVzIHRoZSBvYmplY3QgYW5kIGV2ZXJ5IG9iamVjdCBpdCBwb2ludHMgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSxcbiAgICogcmVjdXJzaXZlbHksIHVzaW5nIGEgZGVmYXVsdCBwaW4gbmFtZTogX2RlZmF1bHQuXG4gICAqXG4gICAqIElmIHRob3NlIG90aGVyIG9iamVjdHMgaGF2ZSBub3QgYmVlbiBmZXRjaGVkIGZyb20gUGFyc2UsIHRoZXkgd2lsbCBub3QgYmUgc3RvcmVkLlxuICAgKiBIb3dldmVyLCBpZiB0aGV5IGhhdmUgY2hhbmdlZCBkYXRhLCBhbGwgdGhlIGNoYW5nZXMgd2lsbCBiZSByZXRhaW5lZC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgb2JqZWN0LnBpbigpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogVG8gcmV0cmlldmUgb2JqZWN0OlxuICAgKiA8Y29kZT5xdWVyeS5mcm9tTG9jYWxEYXRhc3RvcmUoKTwvY29kZT4gb3IgPGNvZGU+cXVlcnkuZnJvbVBpbigpPC9jb2RlPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHBpbiBjb21wbGV0ZXMuXG4gICAqL1xuICBwaW4oKSB7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LnBpbkFsbFdpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOLCBbdGhpc10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgdGhlIG9iamVjdCBhbmQgZXZlcnkgb2JqZWN0IGl0IHBvaW50cyB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLFxuICAgKiByZWN1cnNpdmVseSwgdXNpbmcgYSBkZWZhdWx0IHBpbiBuYW1lOiBfZGVmYXVsdC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgb2JqZWN0LnVuUGluKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVuUGluIGNvbXBsZXRlcy5cbiAgICovXG4gIHVuUGluKCkge1xuICAgIHJldHVybiBQYXJzZU9iamVjdC51blBpbkFsbFdpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOLCBbdGhpc10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJldHVybnMgaWYgdGhlIG9iamVjdCBpcyBwaW5uZWRcbiAgICpcbiAgICogPHByZT5cbiAgICogY29uc3QgaXNQaW5uZWQgPSBhd2FpdCBvYmplY3QuaXNQaW5uZWQoKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIGJvb2xlYW4gcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBpZiBvYmplY3QgaXMgcGlubmVkLlxuICAgKi9cbiAgYXN5bmMgaXNQaW5uZWQoKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gbG9jYWxEYXRhc3RvcmUuZ2V0S2V5Rm9yT2JqZWN0KHRoaXMpO1xuICAgIGNvbnN0IHBpbiA9IGF3YWl0IGxvY2FsRGF0YXN0b3JlLmZyb21QaW5XaXRoTmFtZShvYmplY3RLZXkpO1xuICAgIHJldHVybiBwaW4ubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSBzdG9yZXMgdGhlIG9iamVjdHMgYW5kIGV2ZXJ5IG9iamVjdCB0aGV5IHBvaW50IHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsIHJlY3Vyc2l2ZWx5LlxuICAgKlxuICAgKiBJZiB0aG9zZSBvdGhlciBvYmplY3RzIGhhdmUgbm90IGJlZW4gZmV0Y2hlZCBmcm9tIFBhcnNlLCB0aGV5IHdpbGwgbm90IGJlIHN0b3JlZC5cbiAgICogSG93ZXZlciwgaWYgdGhleSBoYXZlIGNoYW5nZWQgZGF0YSwgYWxsIHRoZSBjaGFuZ2VzIHdpbGwgYmUgcmV0YWluZWQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IG9iamVjdC5waW5XaXRoTmFtZShuYW1lKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIFRvIHJldHJpZXZlIG9iamVjdDpcbiAgICogPGNvZGU+cXVlcnkuZnJvbUxvY2FsRGF0YXN0b3JlKCk8L2NvZGU+IG9yIDxjb2RlPnF1ZXJ5LmZyb21QaW5XaXRoTmFtZShuYW1lKTwvY29kZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBQaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgcGluIGNvbXBsZXRlcy5cbiAgICovXG4gIHBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gUGFyc2VPYmplY3QucGluQWxsV2l0aE5hbWUobmFtZSwgW3RoaXNdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZW1vdmVzIHRoZSBvYmplY3QgYW5kIGV2ZXJ5IG9iamVjdCBpdCBwb2ludHMgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSwgcmVjdXJzaXZlbHkuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IG9iamVjdC51blBpbldpdGhOYW1lKG5hbWUpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBQaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgdW5QaW4gY29tcGxldGVzLlxuICAgKi9cbiAgdW5QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LnVuUGluQWxsV2l0aE5hbWUobmFtZSwgW3RoaXNdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSBsb2FkcyBkYXRhIGZyb20gdGhlIGxvY2FsIGRhdGFzdG9yZSBpbnRvIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBvYmplY3QuZmV0Y2hGcm9tTG9jYWxEYXRhc3RvcmUoKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIFlvdSBjYW4gY3JlYXRlIGFuIHVuZmV0Y2hlZCBwb2ludGVyIHdpdGggPGNvZGU+UGFyc2UuT2JqZWN0LmNyZWF0ZVdpdGhvdXREYXRhKCk8L2NvZGU+XG4gICAqIGFuZCB0aGVuIGNhbGwgPGNvZGU+ZmV0Y2hGcm9tTG9jYWxEYXRhc3RvcmUoKTwvY29kZT4gb24gaXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgZmV0Y2ggY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgZmV0Y2hGcm9tTG9jYWxEYXRhc3RvcmUoKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gbG9jYWxEYXRhc3RvcmUuZ2V0S2V5Rm9yT2JqZWN0KHRoaXMpO1xuICAgIGNvbnN0IHBpbm5lZCA9IGF3YWl0IGxvY2FsRGF0YXN0b3JlLl9zZXJpYWxpemVPYmplY3Qob2JqZWN0S2V5KTtcbiAgICBpZiAoIXBpbm5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmV0Y2ggYW4gdW5zYXZlZCBQYXJzZU9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBQYXJzZU9iamVjdC5mcm9tSlNPTihwaW5uZWQpO1xuICAgIHRoaXMuX2ZpbmlzaEZldGNoKHJlc3VsdC50b0pTT04oKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiBTdGF0aWMgbWV0aG9kcyAqL1xuXG4gIHN0YXRpYyBfY2xlYXJBbGxTdGF0ZSgpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBzdGF0ZUNvbnRyb2xsZXIuY2xlYXJBbGxTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGdpdmVuIGxpc3Qgb2YgUGFyc2UuT2JqZWN0LlxuICAgKiBJZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWQsIHN0b3BzIGFuZCBjYWxscyB0aGUgZXJyb3IgaGFuZGxlci5cbiAgICpcbiAgICogPHByZT5cbiAgICogICBQYXJzZS5PYmplY3QuZmV0Y2hBbGwoW29iamVjdDEsIG9iamVjdDIsIC4uLl0pXG4gICAqICAgIC50aGVuKChsaXN0KSA9PiB7XG4gICAqICAgICAgLy8gQWxsIHRoZSBvYmplY3RzIHdlcmUgZmV0Y2hlZC5cbiAgICogICAgfSwgKGVycm9yKSA9PiB7XG4gICAqICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZmV0Y2hpbmcgb25lIG9mIHRoZSBvYmplY3RzLlxuICAgKiAgICB9KTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5pbmNsdWRlOiBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGluY2x1ZGUuIENhbiBiZSBhIHN0cmluZywgYW4gYXJyYXkgb2Ygc3RyaW5ncyxcbiAgICogICAgICAgb3IgYW4gYXJyYXkgb2YgYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICogPC91bD5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0W119XG4gICAqL1xuICBzdGF0aWMgZmV0Y2hBbGwobGlzdCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjb25zdCBxdWVyeU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHF1ZXJ5T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBxdWVyeU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdpbmNsdWRlJykpIHtcbiAgICAgIHF1ZXJ5T3B0aW9ucy5pbmNsdWRlID0gUGFyc2VPYmplY3QuaGFuZGxlSW5jbHVkZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCkuZmV0Y2gobGlzdCwgdHJ1ZSwgcXVlcnlPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIFBhcnNlLk9iamVjdC5cbiAgICpcbiAgICogSW5jbHVkZXMgbmVzdGVkIFBhcnNlLk9iamVjdHMgZm9yIHRoZSBwcm92aWRlZCBrZXkuIFlvdSBjYW4gdXNlIGRvdFxuICAgKiBub3RhdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkcyBpbiB0aGUgaW5jbHVkZWQgb2JqZWN0IGFyZSBhbHNvIGZldGNoZWQuXG4gICAqXG4gICAqIElmIGFueSBlcnJvciBpcyBlbmNvdW50ZXJlZCwgc3RvcHMgYW5kIGNhbGxzIHRoZSBlcnJvciBoYW5kbGVyLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiAgIFBhcnNlLk9iamVjdC5mZXRjaEFsbFdpdGhJbmNsdWRlKFtvYmplY3QxLCBvYmplY3QyLCAuLi5dLCBbcG9pbnRlcjEsIHBvaW50ZXIyLCAuLi5dKVxuICAgKiAgICAudGhlbigobGlzdCkgPT4ge1xuICAgKiAgICAgIC8vIEFsbCB0aGUgb2JqZWN0cyB3ZXJlIGZldGNoZWQuXG4gICAqICAgIH0sIChlcnJvcikgPT4ge1xuICAgKiAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGZldGNoaW5nIG9uZSBvZiB0aGUgb2JqZWN0cy5cbiAgICogICAgfSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBsaXN0IEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IEFycmF5PHN0cmluZz4+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdFtdfVxuICAgKi9cbiAgc3RhdGljIGZldGNoQWxsV2l0aEluY2x1ZGUobGlzdCwga2V5cywgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuaW5jbHVkZSA9IGtleXM7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LmZldGNoQWxsKGxpc3QsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGdpdmVuIGxpc3Qgb2YgUGFyc2UuT2JqZWN0IGlmIG5lZWRlZC5cbiAgICogSWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkLCBzdG9wcyBhbmQgY2FsbHMgdGhlIGVycm9yIGhhbmRsZXIuXG4gICAqXG4gICAqIEluY2x1ZGVzIG5lc3RlZCBQYXJzZS5PYmplY3RzIGZvciB0aGUgcHJvdmlkZWQga2V5LiBZb3UgY2FuIHVzZSBkb3RcbiAgICogbm90YXRpb24gdG8gc3BlY2lmeSB3aGljaCBmaWVsZHMgaW4gdGhlIGluY2x1ZGVkIG9iamVjdCBhcmUgYWxzbyBmZXRjaGVkLlxuICAgKlxuICAgKiBJZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWQsIHN0b3BzIGFuZCBjYWxscyB0aGUgZXJyb3IgaGFuZGxlci5cbiAgICpcbiAgICogPHByZT5cbiAgICogICBQYXJzZS5PYmplY3QuZmV0Y2hBbGxJZk5lZWRlZFdpdGhJbmNsdWRlKFtvYmplY3QxLCBvYmplY3QyLCAuLi5dLCBbcG9pbnRlcjEsIHBvaW50ZXIyLCAuLi5dKVxuICAgKiAgICAudGhlbigobGlzdCkgPT4ge1xuICAgKiAgICAgIC8vIEFsbCB0aGUgb2JqZWN0cyB3ZXJlIGZldGNoZWQuXG4gICAqICAgIH0sIChlcnJvcikgPT4ge1xuICAgKiAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGZldGNoaW5nIG9uZSBvZiB0aGUgb2JqZWN0cy5cbiAgICogICAgfSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBsaXN0IEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IEFycmF5PHN0cmluZz4+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdFtdfVxuICAgKi9cbiAgc3RhdGljIGZldGNoQWxsSWZOZWVkZWRXaXRoSW5jbHVkZShsaXN0LCBrZXlzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5pbmNsdWRlID0ga2V5cztcbiAgICByZXR1cm4gUGFyc2VPYmplY3QuZmV0Y2hBbGxJZk5lZWRlZChsaXN0LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBnaXZlbiBsaXN0IG9mIFBhcnNlLk9iamVjdCBpZiBuZWVkZWQuXG4gICAqIElmIGFueSBlcnJvciBpcyBlbmNvdW50ZXJlZCwgc3RvcHMgYW5kIGNhbGxzIHRoZSBlcnJvciBoYW5kbGVyLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiAgIFBhcnNlLk9iamVjdC5mZXRjaEFsbElmTmVlZGVkKFtvYmplY3QxLCAuLi5dKVxuICAgKiAgICAudGhlbigobGlzdCkgPT4ge1xuICAgKiAgICAgIC8vIE9iamVjdHMgd2VyZSBmZXRjaGVkIGFuZCB1cGRhdGVkLlxuICAgKiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICogICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBmZXRjaGluZyBvbmUgb2YgdGhlIG9iamVjdHMuXG4gICAqICAgIH0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gbGlzdCBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0W119XG4gICAqL1xuICBzdGF0aWMgZmV0Y2hBbGxJZk5lZWRlZChsaXN0LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcXVlcnlPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBxdWVyeU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgcXVlcnlPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaW5jbHVkZScpKSB7XG4gICAgICBxdWVyeU9wdGlvbnMuaW5jbHVkZSA9IFBhcnNlT2JqZWN0LmhhbmRsZUluY2x1ZGVPcHRpb25zKG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpLmZldGNoKGxpc3QsIGZhbHNlLCBxdWVyeU9wdGlvbnMpO1xuICB9XG4gIHN0YXRpYyBoYW5kbGVJbmNsdWRlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgbGV0IGluY2x1ZGUgPSBbXTtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9wdGlvbnMuaW5jbHVkZSkpIHtcbiAgICAgIHZhciBfY29udGV4dDM7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQzID0gb3B0aW9ucy5pbmNsdWRlKS5jYWxsKF9jb250ZXh0Mywga2V5ID0+IHtcbiAgICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgICAgaW5jbHVkZSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKGluY2x1ZGUpLmNhbGwoaW5jbHVkZSwga2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmNsdWRlLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluY2x1ZGUucHVzaChvcHRpb25zLmluY2x1ZGUpO1xuICAgIH1cbiAgICByZXR1cm4gaW5jbHVkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IHRoZSBnaXZlbiBsaXN0IG9mIG1vZGVscyBvbiB0aGUgc2VydmVyIGlmIGl0IHdhcyBhbHJlYWR5IHBlcnNpc3RlZC5cbiAgICpcbiAgICogPHA+VW5saWtlIHNhdmVBbGwsIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBkZWxldGluZyBhbiBpbmRpdmlkdWFsIG1vZGVsLFxuICAgKiB0aGlzIG1ldGhvZCB3aWxsIGNvbnRpbnVlIHRyeWluZyB0byBkZWxldGUgdGhlIHJlc3Qgb2YgdGhlIG1vZGVscyBpZlxuICAgKiBwb3NzaWJsZSwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIGEgZmF0YWwgZXJyb3IgbGlrZSBhIGNvbm5lY3Rpb24gZXJyb3IuXG4gICAqXG4gICAqIDxwPkluIHBhcnRpY3VsYXIsIHRoZSBQYXJzZS5FcnJvciBvYmplY3QgcmV0dXJuZWQgaW4gdGhlIGNhc2Ugb2YgZXJyb3IgbWF5XG4gICAqIGJlIG9uZSBvZiB0d28gdHlwZXM6XG4gICAqXG4gICAqIDx1bD5cbiAgICogPGxpPkEgUGFyc2UuRXJyb3IuQUdHUkVHQVRFX0VSUk9SLiBUaGlzIG9iamVjdCdzIFwiZXJyb3JzXCIgcHJvcGVydHkgaXMgYW5cbiAgICogYXJyYXkgb2Ygb3RoZXIgUGFyc2UuRXJyb3Igb2JqZWN0cy4gRWFjaCBlcnJvciBvYmplY3QgaW4gdGhpcyBhcnJheVxuICAgKiBoYXMgYW4gXCJvYmplY3RcIiBwcm9wZXJ0eSB0aGF0IHJlZmVyZW5jZXMgdGhlIG9iamVjdCB0aGF0IGNvdWxkIG5vdCBiZVxuICAgKiBkZWxldGVkIChmb3IgaW5zdGFuY2UsIGJlY2F1c2UgdGhhdCBvYmplY3QgY291bGQgbm90IGJlIGZvdW5kKS48L2xpPlxuICAgKiA8bGk+QSBub24tYWdncmVnYXRlIFBhcnNlLkVycm9yLiBUaGlzIGluZGljYXRlcyBhIHNlcmlvdXMgZXJyb3IgdGhhdFxuICAgKiBjYXVzZWQgdGhlIGRlbGV0ZSBvcGVyYXRpb24gdG8gYmUgYWJvcnRlZCBwYXJ0d2F5IHRocm91Z2ggKGZvclxuICAgKiBpbnN0YW5jZSwgYSBjb25uZWN0aW9uIGZhaWx1cmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZGVsZXRlKS48L2xpPlxuICAgKiA8L3VsPlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBQYXJzZS5PYmplY3QuZGVzdHJveUFsbChbb2JqZWN0MSwgb2JqZWN0MiwgLi4uXSlcbiAgICogLnRoZW4oKGxpc3QpID0+IHtcbiAgICogLy8gQWxsIHRoZSBvYmplY3RzIHdlcmUgZGVsZXRlZC5cbiAgICogfSwgKGVycm9yKSA9PiB7XG4gICAqIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGRlbGV0aW5nIG9uZSBvciBtb3JlIG9mIHRoZSBvYmplY3RzLlxuICAgKiAvLyBJZiB0aGlzIGlzIGFuIGFnZ3JlZ2F0ZSBlcnJvciwgdGhlbiB3ZSBjYW4gaW5zcGVjdCBlYWNoIGVycm9yXG4gICAqIC8vIG9iamVjdCBpbmRpdmlkdWFsbHkgdG8gZGV0ZXJtaW5lIHRoZSByZWFzb24gd2h5IGEgcGFydGljdWxhclxuICAgKiAvLyBvYmplY3Qgd2FzIG5vdCBkZWxldGVkLlxuICAgKiBpZiAoZXJyb3IuY29kZSA9PT0gUGFyc2UuRXJyb3IuQUdHUkVHQVRFX0VSUk9SKSB7XG4gICAqIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3IuZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAqIGNvbnNvbGUubG9nKFwiQ291bGRuJ3QgZGVsZXRlIFwiICsgZXJyb3IuZXJyb3JzW2ldLm9iamVjdC5pZCArXG4gICAqIFwiZHVlIHRvIFwiICsgZXJyb3IuZXJyb3JzW2ldLm1lc3NhZ2UpO1xuICAgKiB9XG4gICAqIH0gZWxzZSB7XG4gICAqIGNvbnNvbGUubG9nKFwiRGVsZXRlIGFib3J0ZWQgYmVjYXVzZSBvZiBcIiArIGVycm9yLm1lc3NhZ2UpO1xuICAgKiB9XG4gICAqIH0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gbGlzdCBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIGRlc3Ryb3lBbGxcbiAgICogY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGRlc3Ryb3lBbGwobGlzdCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjb25zdCBkZXN0cm95T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZGVzdHJveU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZGVzdHJveU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdiYXRjaFNpemUnKSAmJiB0eXBlb2Ygb3B0aW9ucy5iYXRjaFNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICBkZXN0cm95T3B0aW9ucy5iYXRjaFNpemUgPSBvcHRpb25zLmJhdGNoU2l6ZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZGVzdHJveU9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdENvbnRyb2xsZXIoKS5kZXN0cm95KGxpc3QsIGRlc3Ryb3lPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgZ2l2ZW4gbGlzdCBvZiBQYXJzZS5PYmplY3QuXG4gICAqIElmIGFueSBlcnJvciBpcyBlbmNvdW50ZXJlZCwgc3RvcHMgYW5kIGNhbGxzIHRoZSBlcnJvciBoYW5kbGVyLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBQYXJzZS5PYmplY3Quc2F2ZUFsbChbb2JqZWN0MSwgb2JqZWN0MiwgLi4uXSlcbiAgICogLnRoZW4oKGxpc3QpID0+IHtcbiAgICogLy8gQWxsIHRoZSBvYmplY3RzIHdlcmUgc2F2ZWQuXG4gICAqIH0sIChlcnJvcikgPT4ge1xuICAgKiAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgb25lIG9mIHRoZSBvYmplY3RzLlxuICAgKiB9KTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdFtdfVxuICAgKi9cbiAgc3RhdGljIHNhdmVBbGwobGlzdCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjb25zdCBzYXZlT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgc2F2ZU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgc2F2ZU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdiYXRjaFNpemUnKSAmJiB0eXBlb2Ygb3B0aW9ucy5iYXRjaFNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICBzYXZlT3B0aW9ucy5iYXRjaFNpemUgPSBvcHRpb25zLmJhdGNoU2l6ZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgc2F2ZU9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdENvbnRyb2xsZXIoKS5zYXZlKGxpc3QsIHNhdmVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcmVmZXJlbmNlIHRvIGEgc3ViY2xhc3Mgb2YgUGFyc2UuT2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkLiBUaGlzXG4gICAqIGRvZXMgbm90IGV4aXN0IG9uIFBhcnNlLk9iamVjdCwgb25seSBvbiBzdWJjbGFzc2VzLlxuICAgKlxuICAgKiA8cD5BIHNob3J0Y3V0IGZvcjogPHByZT5cbiAgICogIHZhciBGb28gPSBQYXJzZS5PYmplY3QuZXh0ZW5kKFwiRm9vXCIpO1xuICAgKiAgdmFyIHBvaW50ZXJUb0ZvbyA9IG5ldyBGb28oKTtcbiAgICogIHBvaW50ZXJUb0Zvby5pZCA9IFwibXlPYmplY3RJZFwiO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgb2JqZWN0IHRvIGNyZWF0ZSBhIHJlZmVyZW5jZSB0by5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBBIFBhcnNlLk9iamVjdCByZWZlcmVuY2UuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlV2l0aG91dERhdGEoaWQpIHtcbiAgICBjb25zdCBvYmogPSBuZXcgdGhpcygpO1xuICAgIG9iai5pZCA9IGlkO1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIFBhcnNlIE9iamVjdCBmcm9tIGEgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb24gVGhlIEpTT04gbWFwIG9mIHRoZSBPYmplY3QncyBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3ZlcnJpZGUgSW4gc2luZ2xlIGluc3RhbmNlIG1vZGUsIGFsbCBvbGQgc2VydmVyIGRhdGFcbiAgICogICBpcyBvdmVyd3JpdHRlbiBpZiB0aGlzIGlzIHNldCB0byB0cnVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlydHkgV2hldGhlciB0aGUgUGFyc2UuT2JqZWN0IHNob3VsZCBzZXQgSlNPTiBrZXlzIHRvIGRpcnR5XG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLk9iamVjdH0gQSBQYXJzZS5PYmplY3QgcmVmZXJlbmNlXG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oanNvbiwgb3ZlcnJpZGUsIGRpcnR5KSB7XG4gICAgaWYgKCFqc29uLmNsYXNzTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGFuIG9iamVjdCB3aXRob3V0IGEgY2xhc3NOYW1lJyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gY2xhc3NNYXBbanNvbi5jbGFzc05hbWVdO1xuICAgIGNvbnN0IG8gPSBjb25zdHJ1Y3RvciA/IG5ldyBjb25zdHJ1Y3Rvcihqc29uLmNsYXNzTmFtZSkgOiBuZXcgUGFyc2VPYmplY3QoanNvbi5jbGFzc05hbWUpO1xuICAgIGNvbnN0IG90aGVyQXR0cmlidXRlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBqc29uKSB7XG4gICAgICBpZiAoYXR0ciAhPT0gJ2NsYXNzTmFtZScgJiYgYXR0ciAhPT0gJ19fdHlwZScpIHtcbiAgICAgICAgb3RoZXJBdHRyaWJ1dGVzW2F0dHJdID0ganNvblthdHRyXTtcbiAgICAgICAgaWYgKGRpcnR5KSB7XG4gICAgICAgICAgby5zZXQoYXR0ciwganNvblthdHRyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG92ZXJyaWRlKSB7XG4gICAgICAvLyBpZCBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIGNsZWFyU2VydmVyRGF0YSBjYW4gd29ya1xuICAgICAgaWYgKG90aGVyQXR0cmlidXRlcy5vYmplY3RJZCkge1xuICAgICAgICBvLmlkID0gb3RoZXJBdHRyaWJ1dGVzLm9iamVjdElkO1xuICAgICAgfVxuICAgICAgbGV0IHByZXNlcnZlZCA9IG51bGw7XG4gICAgICBpZiAodHlwZW9mIG8uX3ByZXNlcnZlRmllbGRzT25GZXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcmVzZXJ2ZWQgPSBvLl9wcmVzZXJ2ZUZpZWxkc09uRmV0Y2goKTtcbiAgICAgIH1cbiAgICAgIG8uX2NsZWFyU2VydmVyRGF0YSgpO1xuICAgICAgaWYgKHByZXNlcnZlZCkge1xuICAgICAgICBvLl9maW5pc2hGZXRjaChwcmVzZXJ2ZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBvLl9maW5pc2hGZXRjaChvdGhlckF0dHJpYnV0ZXMpO1xuICAgIGlmIChqc29uLm9iamVjdElkKSB7XG4gICAgICBvLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBzdWJjbGFzcyBvZiBQYXJzZS5PYmplY3Qgd2l0aCBhIHNwZWNpZmljIGNsYXNzIG5hbWUuXG4gICAqIFdoZW4gb2JqZWN0cyBvZiB0aGF0IGNsYXNzIGFyZSByZXRyaWV2ZWQgZnJvbSBhIHF1ZXJ5LCB0aGV5IHdpbGwgYmVcbiAgICogaW5zdGFudGlhdGVkIHdpdGggdGhpcyBzdWJjbGFzcy5cbiAgICogVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIHVzaW5nIEVTNiBzdWJjbGFzc2luZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgc3ViY2xhc3NcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgVGhlIHN1YmNsYXNzXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJTdWJjbGFzcyhjbGFzc05hbWUsIGNvbnN0cnVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHZhbGlkIGNsYXNzIG5hbWUuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBzdXBwbHkgYSBzdWJjbGFzcyBjb25zdHJ1Y3Rvci4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcmVnaXN0ZXIgdGhlIHN1YmNsYXNzIGNvbnN0cnVjdG9yLiAnICsgJ0RpZCB5b3UgYXR0ZW1wdCB0byByZWdpc3RlciBhbiBpbnN0YW5jZSBvZiB0aGUgc3ViY2xhc3M/Jyk7XG4gICAgfVxuICAgIGNsYXNzTWFwW2NsYXNzTmFtZV0gPSBjb25zdHJ1Y3RvcjtcbiAgICBpZiAoIWNvbnN0cnVjdG9yLmNsYXNzTmFtZSkge1xuICAgICAgY29uc3RydWN0b3IuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmVnaXN0ZXJzIGEgc3ViY2xhc3Mgb2YgUGFyc2UuT2JqZWN0IHdpdGggYSBzcGVjaWZpYyBjbGFzcyBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzdWJjbGFzc1xuICAgKi9cbiAgc3RhdGljIHVucmVnaXN0ZXJTdWJjbGFzcyhjbGFzc05hbWUpIHtcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgdmFsaWQgY2xhc3MgbmFtZS4nKTtcbiAgICB9XG4gICAgZGVsZXRlIGNsYXNzTWFwW2NsYXNzTmFtZV07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBzdWJjbGFzcyBvZiBQYXJzZS5PYmplY3QgZm9yIHRoZSBnaXZlbiBQYXJzZSBjbGFzcyBuYW1lLlxuICAgKlxuICAgKiA8cD5FdmVyeSBleHRlbnNpb24gb2YgYSBQYXJzZSBjbGFzcyB3aWxsIGluaGVyaXQgZnJvbSB0aGUgbW9zdCByZWNlbnRcbiAgICogcHJldmlvdXMgZXh0ZW5zaW9uIG9mIHRoYXQgY2xhc3MuIFdoZW4gYSBQYXJzZS5PYmplY3QgaXMgYXV0b21hdGljYWxseVxuICAgKiBjcmVhdGVkIGJ5IHBhcnNpbmcgSlNPTiwgaXQgd2lsbCB1c2UgdGhlIG1vc3QgcmVjZW50IGV4dGVuc2lvbiBvZiB0aGF0XG4gICAqIGNsYXNzLjwvcD5cbiAgICpcbiAgICogPHA+WW91IHNob3VsZCBjYWxsIGVpdGhlcjo8cHJlPlxuICAgKiAgICAgdmFyIE15Q2xhc3MgPSBQYXJzZS5PYmplY3QuZXh0ZW5kKFwiTXlDbGFzc1wiLCB7XG4gICAqICAgICAgICAgPGk+SW5zdGFuY2UgbWV0aG9kczwvaT4sXG4gICAqICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXR0cnMsIG9wdGlvbnMpIHtcbiAgICogICAgICAgICAgICAgdGhpcy5zb21lSW5zdGFuY2VQcm9wZXJ0eSA9IFtdLFxuICAgKiAgICAgICAgICAgICA8aT5PdGhlciBpbnN0YW5jZSBwcm9wZXJ0aWVzPC9pPlxuICAgKiAgICAgICAgIH1cbiAgICogICAgIH0sIHtcbiAgICogICAgICAgICA8aT5DbGFzcyBwcm9wZXJ0aWVzPC9pPlxuICAgKiAgICAgfSk7PC9wcmU+XG4gICAqIG9yLCBmb3IgQmFja2JvbmUgY29tcGF0aWJpbGl0eTo8cHJlPlxuICAgKiAgICAgdmFyIE15Q2xhc3MgPSBQYXJzZS5PYmplY3QuZXh0ZW5kKHtcbiAgICogICAgICAgICBjbGFzc05hbWU6IFwiTXlDbGFzc1wiLFxuICAgKiAgICAgICAgIDxpPkluc3RhbmNlIG1ldGhvZHM8L2k+LFxuICAgKiAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGF0dHJzLCBvcHRpb25zKSB7XG4gICAqICAgICAgICAgICAgIHRoaXMuc29tZUluc3RhbmNlUHJvcGVydHkgPSBbXSxcbiAgICogICAgICAgICAgICAgPGk+T3RoZXIgaW5zdGFuY2UgcHJvcGVydGllczwvaT5cbiAgICogICAgICAgICB9XG4gICAqICAgICB9LCB7XG4gICAqICAgICAgICAgPGk+Q2xhc3MgcHJvcGVydGllczwvaT5cbiAgICogICAgIH0pOzwvcHJlPjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgUGFyc2UgY2xhc3MgYmFja2luZyB0aGlzIG1vZGVsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW3Byb3RvUHJvcHNdIEluc3RhbmNlIHByb3BlcnRpZXMgdG8gYWRkIHRvIGluc3RhbmNlcyBvZiB0aGVcbiAgICogICAgIGNsYXNzIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY2xhc3NQcm9wc10gQ2xhc3MgcHJvcGVydGllcyB0byBhZGQgdGhlIGNsYXNzIHJldHVybmVkIGZyb21cbiAgICogICAgIHRoaXMgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBBIG5ldyBzdWJjbGFzcyBvZiBQYXJzZS5PYmplY3QuXG4gICAqL1xuICBzdGF0aWMgZXh0ZW5kKGNsYXNzTmFtZSwgcHJvdG9Qcm9wcywgY2xhc3NQcm9wcykge1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNsYXNzTmFtZSAmJiB0eXBlb2YgY2xhc3NOYW1lLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFBhcnNlT2JqZWN0LmV4dGVuZChjbGFzc05hbWUuY2xhc3NOYW1lLCBjbGFzc05hbWUsIHByb3RvUHJvcHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFyc2UuT2JqZWN0LmV4dGVuZCdzIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgY2xhc3NOYW1lLlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGFkanVzdGVkQ2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIGlmIChhZGp1c3RlZENsYXNzTmFtZSA9PT0gJ1VzZXInICYmIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnUEVSRk9STV9VU0VSX1JFV1JJVEUnKSkge1xuICAgICAgYWRqdXN0ZWRDbGFzc05hbWUgPSAnX1VzZXInO1xuICAgIH1cbiAgICBsZXQgcGFyZW50UHJvdG8gPSBQYXJzZU9iamVjdC5wcm90b3R5cGU7XG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ19fc3VwZXJfXycpICYmIHRoaXMuX19zdXBlcl9fKSB7XG4gICAgICBwYXJlbnRQcm90byA9IHRoaXMucHJvdG90eXBlO1xuICAgIH1cbiAgICBsZXQgUGFyc2VPYmplY3RTdWJjbGFzcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9IGFkanVzdGVkQ2xhc3NOYW1lO1xuICAgICAgdGhpcy5fb2JqQ291bnQgPSBvYmplY3RDb3VudCsrO1xuICAgICAgLy8gRW5hYmxlIGxlZ2FjeSBpbml0aWFsaXplcnNcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5pbml0aWFsaXplID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGluaXRpYWxpemVyIG9mIHRoaXMuX2luaXRpYWxpemVycykge1xuICAgICAgICAgIGluaXRpYWxpemVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoIXRoaXMuc2V0KGF0dHJpYnV0ZXMgfHwge30sIG9wdGlvbnMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIGFuIGludmFsaWQgUGFyc2UgT2JqZWN0XCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoY2xhc3NNYXBbYWRqdXN0ZWRDbGFzc05hbWVdKSB7XG4gICAgICBQYXJzZU9iamVjdFN1YmNsYXNzID0gY2xhc3NNYXBbYWRqdXN0ZWRDbGFzc05hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBQYXJzZU9iamVjdFN1YmNsYXNzLmV4dGVuZCA9IGZ1bmN0aW9uIChuYW1lLCBwcm90b1Byb3BzLCBjbGFzc1Byb3BzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gUGFyc2VPYmplY3QuZXh0ZW5kLmNhbGwoUGFyc2VPYmplY3RTdWJjbGFzcywgbmFtZSwgcHJvdG9Qcm9wcywgY2xhc3NQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhcnNlT2JqZWN0LmV4dGVuZC5jYWxsKFBhcnNlT2JqZWN0U3ViY2xhc3MsIGFkanVzdGVkQ2xhc3NOYW1lLCBuYW1lLCBwcm90b1Byb3BzKTtcbiAgICAgIH07XG4gICAgICBQYXJzZU9iamVjdFN1YmNsYXNzLmNyZWF0ZVdpdGhvdXREYXRhID0gUGFyc2VPYmplY3QuY3JlYXRlV2l0aG91dERhdGE7XG4gICAgICBQYXJzZU9iamVjdFN1YmNsYXNzLmNsYXNzTmFtZSA9IGFkanVzdGVkQ2xhc3NOYW1lO1xuICAgICAgUGFyc2VPYmplY3RTdWJjbGFzcy5fX3N1cGVyX18gPSBwYXJlbnRQcm90bztcbiAgICAgIFBhcnNlT2JqZWN0U3ViY2xhc3MucHJvdG90eXBlID0gKDAsIF9jcmVhdGUuZGVmYXVsdCkocGFyZW50UHJvdG8sIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogUGFyc2VPYmplY3RTdWJjbGFzcyxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChwcm90b1Byb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcHJvdG9Qcm9wcykge1xuICAgICAgICBpZiAocHJvcCA9PT0gJ2luaXRpYWxpemUnKSB7XG4gICAgICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VPYmplY3RTdWJjbGFzcy5wcm90b3R5cGUsICdfaW5pdGlhbGl6ZXJzJywge1xuICAgICAgICAgICAgdmFsdWU6IFsuLi4oUGFyc2VPYmplY3RTdWJjbGFzcy5wcm90b3R5cGUuX2luaXRpYWxpemVycyB8fCBbXSksIHByb3RvUHJvcHNbcHJvcF1dLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wICE9PSAnY2xhc3NOYW1lJykge1xuICAgICAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlT2JqZWN0U3ViY2xhc3MucHJvdG90eXBlLCBwcm9wLCB7XG4gICAgICAgICAgICB2YWx1ZTogcHJvdG9Qcm9wc1twcm9wXSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2xhc3NQcm9wcykge1xuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGNsYXNzUHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjbGFzc05hbWUnKSB7XG4gICAgICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VPYmplY3RTdWJjbGFzcywgcHJvcCwge1xuICAgICAgICAgICAgdmFsdWU6IGNsYXNzUHJvcHNbcHJvcF0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY2xhc3NNYXBbYWRqdXN0ZWRDbGFzc05hbWVdID0gUGFyc2VPYmplY3RTdWJjbGFzcztcbiAgICByZXR1cm4gUGFyc2VPYmplY3RTdWJjbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgc2luZ2xlIGluc3RhbmNlIG9iamVjdHMsIHdoZXJlIGFueSBsb2NhbCBvYmplY3RzIHdpdGggdGhlIHNhbWUgSWRcbiAgICogc2hhcmUgdGhlIHNhbWUgYXR0cmlidXRlcywgYW5kIHN0YXkgc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlci5cbiAgICogVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGluIHNlcnZlciBlbnZpcm9ubWVudHMsIHNpbmNlIGl0IGNhbiBsZWFkIHRvXG4gICAqIHNlY3VyaXR5IGlzc3Vlcy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGVuYWJsZVNpbmdsZUluc3RhbmNlKCkge1xuICAgIHNpbmdsZUluc3RhbmNlID0gdHJ1ZTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoU2luZ2xlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgc2luZ2xlIGluc3RhbmNlIG9iamVjdHMsIHdoZXJlIGFueSBsb2NhbCBvYmplY3RzIHdpdGggdGhlIHNhbWUgSWRcbiAgICogc2hhcmUgdGhlIHNhbWUgYXR0cmlidXRlcywgYW5kIHN0YXkgc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlci5cbiAgICogV2hlbiBkaXNhYmxlZCwgeW91IGNhbiBoYXZlIHR3byBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgb2JqZWN0IGluIG1lbW9yeVxuICAgKiB3aXRob3V0IHRoZW0gc2hhcmluZyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZGlzYWJsZVNpbmdsZUluc3RhbmNlKCkge1xuICAgIHNpbmdsZUluc3RhbmNlID0gZmFsc2U7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKFVuaXF1ZUluc3RhbmNlU3RhdGVDb250cm9sbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSBzdG9yZXMgdGhlIG9iamVjdHMgYW5kIGV2ZXJ5IG9iamVjdCB0aGV5IHBvaW50IHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsXG4gICAqIHJlY3Vyc2l2ZWx5LCB1c2luZyBhIGRlZmF1bHQgcGluIG5hbWU6IF9kZWZhdWx0LlxuICAgKlxuICAgKiBJZiB0aG9zZSBvdGhlciBvYmplY3RzIGhhdmUgbm90IGJlZW4gZmV0Y2hlZCBmcm9tIFBhcnNlLCB0aGV5IHdpbGwgbm90IGJlIHN0b3JlZC5cbiAgICogSG93ZXZlciwgaWYgdGhleSBoYXZlIGNoYW5nZWQgZGF0YSwgYWxsIHRoZSBjaGFuZ2VzIHdpbGwgYmUgcmV0YWluZWQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLk9iamVjdC5waW5BbGwoWy4uLl0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogVG8gcmV0cmlldmUgb2JqZWN0OlxuICAgKiA8Y29kZT5xdWVyeS5mcm9tTG9jYWxEYXRhc3RvcmUoKTwvY29kZT4gb3IgPGNvZGU+cXVlcnkuZnJvbVBpbigpPC9jb2RlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBvYmplY3RzIEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHBpbiBjb21wbGV0ZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBwaW5BbGwob2JqZWN0cykge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBQYXJzZU9iamVjdC5waW5BbGxXaXRoTmFtZShfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiwgb2JqZWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgc3RvcmVzIHRoZSBvYmplY3RzIGFuZCBldmVyeSBvYmplY3QgdGhleSBwb2ludCB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLCByZWN1cnNpdmVseS5cbiAgICpcbiAgICogSWYgdGhvc2Ugb3RoZXIgb2JqZWN0cyBoYXZlIG5vdCBiZWVuIGZldGNoZWQgZnJvbSBQYXJzZSwgdGhleSB3aWxsIG5vdCBiZSBzdG9yZWQuXG4gICAqIEhvd2V2ZXIsIGlmIHRoZXkgaGF2ZSBjaGFuZ2VkIGRhdGEsIGFsbCB0aGUgY2hhbmdlcyB3aWxsIGJlIHJldGFpbmVkLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5PYmplY3QucGluQWxsV2l0aE5hbWUobmFtZSwgW29iajEsIG9iajIsIC4uLl0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogVG8gcmV0cmlldmUgb2JqZWN0OlxuICAgKiA8Y29kZT5xdWVyeS5mcm9tTG9jYWxEYXRhc3RvcmUoKTwvY29kZT4gb3IgPGNvZGU+cXVlcnkuZnJvbVBpbldpdGhOYW1lKG5hbWUpPC9jb2RlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIFBpbi5cbiAgICogQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBwaW4gY29tcGxldGVzLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cykge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbERhdGFzdG9yZS5faGFuZGxlUGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgcmVtb3ZlcyB0aGUgb2JqZWN0cyBhbmQgZXZlcnkgb2JqZWN0IHRoZXkgcG9pbnQgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSxcbiAgICogcmVjdXJzaXZlbHksIHVzaW5nIGEgZGVmYXVsdCBwaW4gbmFtZTogX2RlZmF1bHQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLk9iamVjdC51blBpbkFsbChbLi4uXSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBvYmplY3RzIEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVuUGluIGNvbXBsZXRlcy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHVuUGluQWxsKG9iamVjdHMpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gUGFyc2VPYmplY3QudW5QaW5BbGxXaXRoTmFtZShfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTiwgb2JqZWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgcmVtb3ZlcyB0aGUgb2JqZWN0cyBhbmQgZXZlcnkgb2JqZWN0IHRoZXkgcG9pbnQgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSwgcmVjdXJzaXZlbHkuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLk9iamVjdC51blBpbkFsbFdpdGhOYW1lKG5hbWUsIFtvYmoxLCBvYmoyLCAuLi5dKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgUGluLlxuICAgKiBAcGFyYW0ge0FycmF5fSBvYmplY3RzIEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVuUGluIGNvbXBsZXRlcy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHVuUGluQWxsV2l0aE5hbWUobmFtZSwgb2JqZWN0cykge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbERhdGFzdG9yZS5faGFuZGxlVW5QaW5BbGxXaXRoTmFtZShuYW1lLCBvYmplY3RzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZW1vdmVzIGFsbCBvYmplY3RzIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUgdXNpbmcgYSBkZWZhdWx0IHBpbiBuYW1lOiBfZGVmYXVsdC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuT2JqZWN0LnVuUGluQWxsT2JqZWN0cygpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1blBpbiBjb21wbGV0ZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyB1blBpbkFsbE9iamVjdHMoKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsRGF0YXN0b3JlLnVuUGluV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgYWxsIG9iamVjdHMgd2l0aCB0aGUgc3BlY2lmaWVkIHBpbiBuYW1lLlxuICAgKiBEZWxldGVzIHRoZSBwaW4gbmFtZSBhbHNvLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5PYmplY3QudW5QaW5BbGxPYmplY3RzV2l0aE5hbWUobmFtZSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIFBpbi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1blBpbiBjb21wbGV0ZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyB1blBpbkFsbE9iamVjdHNXaXRoTmFtZShuYW1lKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsRGF0YXN0b3JlLnVuUGluV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuUElOX1BSRUZJWCArIG5hbWUpO1xuICB9XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgZmV0Y2godGFyZ2V0LCBmb3JjZUZldGNoLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodGFyZ2V0KSkge1xuICAgICAgaWYgKHRhcmdldC5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoW10pO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2JqcyA9IFtdO1xuICAgICAgY29uc3QgaWRzID0gW107XG4gICAgICBsZXQgY2xhc3NOYW1lID0gbnVsbDtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkodGFyZ2V0KS5jYWxsKHRhcmdldCwgZWwgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgICAgICBjbGFzc05hbWUgPSBlbC5jbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsYXNzTmFtZSAhPT0gZWwuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfQ0xBU1NfTkFNRSwgJ0FsbCBvYmplY3RzIHNob3VsZCBiZSBvZiB0aGUgc2FtZSBjbGFzcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZWwuaWQpIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuTUlTU0lOR19PQkpFQ1RfSUQsICdBbGwgb2JqZWN0cyBtdXN0IGhhdmUgYW4gSUQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9yY2VGZXRjaCB8fCAhZWwuaXNEYXRhQXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICBpZHMucHVzaChlbC5pZCk7XG4gICAgICAgICAgb2Jqcy5wdXNoKGVsKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRzLnB1c2goZWwpO1xuICAgICAgfSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IFBhcnNlUXVlcnkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVF1ZXJ5KCk7XG4gICAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KGNsYXNzTmFtZSk7XG4gICAgICBxdWVyeS5jb250YWluZWRJbignb2JqZWN0SWQnLCBpZHMpO1xuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNsdWRlKSB7XG4gICAgICAgIHF1ZXJ5LmluY2x1ZGUob3B0aW9ucy5pbmNsdWRlKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5Ll9saW1pdCA9IGlkcy5sZW5ndGg7XG4gICAgICByZXR1cm4gKDAsIF9maW5kLmRlZmF1bHQpKHF1ZXJ5KS5jYWxsKHF1ZXJ5LCBvcHRpb25zKS50aGVuKGFzeW5jIG9iamVjdHMgPT4ge1xuICAgICAgICBjb25zdCBpZE1hcCA9IHt9O1xuICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCBvID0+IHtcbiAgICAgICAgICBpZE1hcFtvLmlkXSA9IG87XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvYmogPSBvYmpzW2ldO1xuICAgICAgICAgIGlmICghb2JqIHx8ICFvYmouaWQgfHwgIWlkTWFwW29iai5pZF0pIHtcbiAgICAgICAgICAgIGlmIChmb3JjZUZldGNoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9CSkVDVF9OT1RfRk9VTkQsICdBbGwgb2JqZWN0cyBtdXN0IGV4aXN0IG9uIHRoZSBzZXJ2ZXIuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNpbmdsZUluc3RhbmNlKSB7XG4gICAgICAgICAgLy8gSWYgc2luZ2xlIGluc3RhbmNlIG9iamVjdHMgYXJlIGRpc2FibGVkLCB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhlXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBvYmogPSByZXN1bHRzW2ldO1xuICAgICAgICAgICAgaWYgKG9iaiAmJiBvYmouaWQgJiYgaWRNYXBbb2JqLmlkXSkge1xuICAgICAgICAgICAgICBjb25zdCBpZCA9IG9iai5pZDtcbiAgICAgICAgICAgICAgb2JqLl9maW5pc2hGZXRjaChpZE1hcFtpZF0udG9KU09OKCkpO1xuICAgICAgICAgICAgICByZXN1bHRzW2ldID0gaWRNYXBbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgYXdhaXQgbG9jYWxEYXRhc3RvcmUuX3VwZGF0ZU9iamVjdElmUGlubmVkKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShyZXN1bHRzKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgIGlmICghdGFyZ2V0LmlkKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk1JU1NJTkdfT0JKRUNUX0lELCAnT2JqZWN0IGRvZXMgbm90IGhhdmUgYW4gSUQnKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7fTtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZSkge1xuICAgICAgICBwYXJhbXMuaW5jbHVkZSA9IG9wdGlvbnMuaW5jbHVkZS5qb2luKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2NsYXNzZXMvJyArIHRhcmdldC5jbGFzc05hbWUgKyAnLycgKyB0YXJnZXQuX2dldElkKCksIHBhcmFtcywgb3B0aW9ucykudGhlbihhc3luYyByZXNwb25zZSA9PiB7XG4gICAgICAgIHRhcmdldC5fY2xlYXJQZW5kaW5nT3BzKCk7XG4gICAgICAgIHRhcmdldC5fY2xlYXJTZXJ2ZXJEYXRhKCk7XG4gICAgICAgIHRhcmdldC5fZmluaXNoRmV0Y2gocmVzcG9uc2UpO1xuICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fdXBkYXRlT2JqZWN0SWZQaW5uZWQodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH0sXG4gIGFzeW5jIGRlc3Ryb3kodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gb3B0aW9ucyAmJiBvcHRpb25zLmJhdGNoU2l6ZSA/IG9wdGlvbnMuYmF0Y2hTaXplIDogX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdSRVFVRVNUX0JBVENIX1NJWkUnKTtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodGFyZ2V0KSkge1xuICAgICAgaWYgKHRhcmdldC5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoW10pO1xuICAgICAgfVxuICAgICAgY29uc3QgYmF0Y2hlcyA9IFtbXV07XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkodGFyZ2V0KS5jYWxsKHRhcmdldCwgb2JqID0+IHtcbiAgICAgICAgaWYgKCFvYmouaWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYmF0Y2hlc1tiYXRjaGVzLmxlbmd0aCAtIDFdLnB1c2gob2JqKTtcbiAgICAgICAgaWYgKGJhdGNoZXNbYmF0Y2hlcy5sZW5ndGggLSAxXS5sZW5ndGggPj0gYmF0Y2hTaXplKSB7XG4gICAgICAgICAgYmF0Y2hlcy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoYmF0Y2hlc1tiYXRjaGVzLmxlbmd0aCAtIDFdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBJZiB0aGUgbGFzdCBiYXRjaCBpcyBlbXB0eSwgcmVtb3ZlIGl0XG4gICAgICAgIGJhdGNoZXMucG9wKCk7XG4gICAgICB9XG4gICAgICBsZXQgZGVsZXRlQ29tcGxldGVkID0gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKCk7XG4gICAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShiYXRjaGVzKS5jYWxsKGJhdGNoZXMsIGJhdGNoID0+IHtcbiAgICAgICAgZGVsZXRlQ29tcGxldGVkID0gZGVsZXRlQ29tcGxldGVkLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2JhdGNoJywge1xuICAgICAgICAgICAgcmVxdWVzdHM6ICgwLCBfbWFwLmRlZmF1bHQpKGJhdGNoKS5jYWxsKGJhdGNoLCBvYmogPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgICAgICAgICAgcGF0aDogZ2V0U2VydmVyVXJsUGF0aCgpICsgJ2NsYXNzZXMvJyArIG9iai5jbGFzc05hbWUgKyAnLycgKyBvYmouX2dldElkKCksXG4gICAgICAgICAgICAgICAgYm9keToge31cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSwgb3B0aW9ucykudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAocmVzdWx0c1tpXSAmJiByZXN1bHRzW2ldLmhhc093blByb3BlcnR5KCdlcnJvcicpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQocmVzdWx0c1tpXS5lcnJvci5jb2RlLCByZXN1bHRzW2ldLmVycm9yLmVycm9yKTtcbiAgICAgICAgICAgICAgICBlcnIub2JqZWN0ID0gYmF0Y2hbaV07XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRlbGV0ZUNvbXBsZXRlZC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBhZ2dyZWdhdGUgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LkFHR1JFR0FURV9FUlJPUik7XG4gICAgICAgICAgYWdncmVnYXRlLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoYWdncmVnYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiB0YXJnZXQpIHtcbiAgICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fZGVzdHJveU9iamVjdElmUGlubmVkKG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh0YXJnZXQpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0RFTEVURScsICdjbGFzc2VzLycgKyB0YXJnZXQuY2xhc3NOYW1lICsgJy8nICsgdGFyZ2V0Ll9nZXRJZCgpLCB7fSwgb3B0aW9ucykudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl9kZXN0cm95T2JqZWN0SWZQaW5uZWQodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh0YXJnZXQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodGFyZ2V0KTtcbiAgfSxcbiAgc2F2ZSh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBvcHRpb25zICYmIG9wdGlvbnMuYmF0Y2hTaXplID8gb3B0aW9ucy5iYXRjaFNpemUgOiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1JFUVVFU1RfQkFUQ0hfU0laRScpO1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBjb25zdCBtYXBJZEZvclBpbiA9IHt9O1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBhbGxvd0N1c3RvbU9iamVjdElkID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBTExPV19DVVNUT01fT0JKRUNUX0lEJyk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5yZXR1cm5TdGF0dXMgPSBvcHRpb25zLnJldHVyblN0YXR1cyB8fCB0cnVlO1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodGFyZ2V0KSkge1xuICAgICAgaWYgKHRhcmdldC5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoW10pO1xuICAgICAgfVxuICAgICAgbGV0IHVuc2F2ZWQgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KSh0YXJnZXQpLmNhbGwodGFyZ2V0KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldF9pID0gdGFyZ2V0W2ldO1xuICAgICAgICBpZiAodGFyZ2V0X2kgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgICAgIHVuc2F2ZWQgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KSh1bnNhdmVkKS5jYWxsKHVuc2F2ZWQsICgwLCBfdW5zYXZlZENoaWxkcmVuLmRlZmF1bHQpKHRhcmdldF9pLCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHVuc2F2ZWQgPSAoMCwgX3VuaXF1ZS5kZWZhdWx0KSh1bnNhdmVkKTtcbiAgICAgIGNvbnN0IGZpbGVzU2F2ZWQgPSBbXTtcbiAgICAgIGxldCBwZW5kaW5nID0gW107XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkodW5zYXZlZCkuY2FsbCh1bnNhdmVkLCBlbCA9PiB7XG4gICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCkge1xuICAgICAgICAgIGZpbGVzU2F2ZWQucHVzaChlbC5zYXZlKG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbCBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICAgICAgcGVuZGluZy5wdXNoKGVsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5hbGwoZmlsZXNTYXZlZCkudGhlbigoKSA9PiB7XG4gICAgICAgIGxldCBvYmplY3RFcnJvciA9IG51bGw7XG4gICAgICAgIHJldHVybiAoMCwgX3Byb21pc2VVdGlscy5jb250aW51ZVdoaWxlKSgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHBlbmRpbmcubGVuZ3RoID4gMDtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJhdGNoID0gW107XG4gICAgICAgICAgY29uc3QgbmV4dFBlbmRpbmcgPSBbXTtcbiAgICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocGVuZGluZykuY2FsbChwZW5kaW5nLCBlbCA9PiB7XG4gICAgICAgICAgICBpZiAoYWxsb3dDdXN0b21PYmplY3RJZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZWwsICdpZCcpICYmICFlbC5pZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk1JU1NJTkdfT0JKRUNUX0lELCAnb2JqZWN0SWQgbXVzdCBub3QgYmUgZW1wdHkgb3IgbnVsbCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhdGNoLmxlbmd0aCA8IGJhdGNoU2l6ZSAmJiAoMCwgX2NhbkJlU2VyaWFsaXplZC5kZWZhdWx0KShlbCkpIHtcbiAgICAgICAgICAgICAgYmF0Y2gucHVzaChlbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBuZXh0UGVuZGluZy5wdXNoKGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwZW5kaW5nID0gbmV4dFBlbmRpbmc7XG4gICAgICAgICAgaWYgKGJhdGNoLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnVHJpZWQgdG8gc2F2ZSBhIGJhdGNoIHdpdGggYSBjeWNsZS4nKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUXVldWUgdXAgdGFza3MgZm9yIGVhY2ggb2JqZWN0IGluIHRoZSBiYXRjaC5cbiAgICAgICAgICAvLyBXaGVuIGV2ZXJ5IHRhc2sgaXMgcmVhZHksIHRoZSBBUEkgcmVxdWVzdCB3aWxsIGV4ZWN1dGVcbiAgICAgICAgICBjb25zdCBiYXRjaFJldHVybmVkID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICAgICAgICBjb25zdCBiYXRjaFJlYWR5ID0gW107XG4gICAgICAgICAgY29uc3QgYmF0Y2hUYXNrcyA9IFtdO1xuICAgICAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShiYXRjaCkuY2FsbChiYXRjaCwgKG9iaiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWR5ID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICAgICAgICAgIGJhdGNoUmVhZHkucHVzaChyZWFkeSk7XG4gICAgICAgICAgICBzdGF0ZUNvbnRyb2xsZXIucHVzaFBlbmRpbmdTdGF0ZShvYmouX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICAgICAgICAgIGJhdGNoVGFza3MucHVzaChzdGF0ZUNvbnRyb2xsZXIuZW5xdWV1ZVRhc2sob2JqLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZWFkeS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIHJldHVybiBiYXRjaFJldHVybmVkLnRoZW4ocmVzcG9uc2VzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VzW2luZGV4XS5oYXNPd25Qcm9wZXJ0eSgnc3VjY2VzcycpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBvYmplY3RJZCA9IHJlc3BvbnNlc1tpbmRleF0uc3VjY2Vzcy5vYmplY3RJZDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlc1tpbmRleF0uX3N0YXR1cztcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNwb25zZXNbaW5kZXhdLl9zdGF0dXM7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2VzW2luZGV4XS5faGVhZGVycztcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNwb25zZXNbaW5kZXhdLl94aHI7XG4gICAgICAgICAgICAgICAgICBtYXBJZEZvclBpbltvYmplY3RJZF0gPSBvYmouX2xvY2FsSWQ7XG4gICAgICAgICAgICAgICAgICBvYmouX2hhbmRsZVNhdmVSZXNwb25zZShyZXNwb25zZXNbaW5kZXhdLnN1Y2Nlc3MsIHN0YXR1cyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlmICghb2JqZWN0RXJyb3IgJiYgcmVzcG9uc2VzW2luZGV4XS5oYXNPd25Qcm9wZXJ0eSgnZXJyb3InKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2ZXJFcnJvciA9IHJlc3BvbnNlc1tpbmRleF0uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoc2VydmVyRXJyb3IuY29kZSwgc2VydmVyRXJyb3IuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAvLyBDYW5jZWwgdGhlIHJlc3Qgb2YgdGhlIHNhdmVcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IFtdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgb2JqLl9oYW5kbGVTYXZlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgICgwLCBfcHJvbWlzZVV0aWxzLndoZW4pKGJhdGNoUmVhZHkpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gS2ljayBvZmYgdGhlIGJhdGNoIHJlcXVlc3RcbiAgICAgICAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2JhdGNoJywge1xuICAgICAgICAgICAgICByZXF1ZXN0czogKDAsIF9tYXAuZGVmYXVsdCkoYmF0Y2gpLmNhbGwoYmF0Y2gsIG9iaiA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gb2JqLl9nZXRTYXZlUGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgcGFyYW1zLnBhdGggPSBnZXRTZXJ2ZXJVcmxQYXRoKCkgKyBwYXJhbXMucGF0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgICAgICAgfSkudGhlbihiYXRjaFJldHVybmVkLnJlc29sdmUsIGVycm9yID0+IHtcbiAgICAgICAgICAgIGJhdGNoUmV0dXJuZWQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5DT1JSRUNUX1RZUEUsIGVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gKDAsIF9wcm9taXNlVXRpbHMud2hlbikoYmF0Y2hUYXNrcyk7XG4gICAgICAgIH0pLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmIChvYmplY3RFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG9iamVjdEVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBvYmplY3Qgb2YgdGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBpdCBpcyBhIFBhcnNlT2JqZWN0IGJlZm9yZSB1cGRhdGluZyBpdCBpbnRvIHRoZSBsb2NhbERhdGFTdG9yZVxuICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl91cGRhdGVMb2NhbElkRm9yT2JqZWN0KG1hcElkRm9yUGluW29iamVjdC5pZF0sIG9iamVjdCk7XG4gICAgICAgICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl91cGRhdGVPYmplY3RJZlBpbm5lZChvYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHRhcmdldCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgaWYgKGFsbG93Q3VzdG9tT2JqZWN0SWQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgJ2lkJykgJiYgIXRhcmdldC5pZCkge1xuICAgICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk1JU1NJTkdfT0JKRUNUX0lELCAnb2JqZWN0SWQgbXVzdCBub3QgYmUgZW1wdHkgb3IgbnVsbCcpO1xuICAgICAgfVxuICAgICAgLy8gZ2VuZXJhdGUgX2xvY2FsSWQgaW4gY2FzZSBpZiBjYXNjYWRlU2F2ZT1mYWxzZVxuICAgICAgdGFyZ2V0Ll9nZXRJZCgpO1xuICAgICAgY29uc3QgbG9jYWxJZCA9IHRhcmdldC5fbG9jYWxJZDtcbiAgICAgIC8vIGNvcHlpbmcgdGFyZ2V0IGxldHMgZ3VhcmFudGVlIHRoZSBwb2ludGVyIGlzbid0IG1vZGlmaWVkIGVsc2V3aGVyZVxuICAgICAgY29uc3QgdGFyZ2V0Q29weSA9IHRhcmdldDtcbiAgICAgIGNvbnN0IHRhc2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHRhcmdldENvcHkuX2dldFNhdmVQYXJhbXMoKTtcbiAgICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QocGFyYW1zLm1ldGhvZCwgcGFyYW1zLnBhdGgsIHBhcmFtcy5ib2R5LCBvcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5fc3RhdHVzO1xuICAgICAgICAgIGRlbGV0ZSByZXNwb25zZS5fc3RhdHVzO1xuICAgICAgICAgIGRlbGV0ZSByZXNwb25zZS5faGVhZGVycztcbiAgICAgICAgICBkZWxldGUgcmVzcG9uc2UuX3hocjtcbiAgICAgICAgICB0YXJnZXRDb3B5Ll9oYW5kbGVTYXZlUmVzcG9uc2UocmVzcG9uc2UsIHN0YXR1cyk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICB0YXJnZXRDb3B5Ll9oYW5kbGVTYXZlRXJyb3IoKTtcbiAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBzdGF0ZUNvbnRyb2xsZXIucHVzaFBlbmRpbmdTdGF0ZSh0YXJnZXQuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICAgIHJldHVybiBzdGF0ZUNvbnRyb2xsZXIuZW5xdWV1ZVRhc2sodGFyZ2V0Ll9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgdGFzaykudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl91cGRhdGVMb2NhbElkRm9yT2JqZWN0KGxvY2FsSWQsIHRhcmdldCk7XG4gICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl91cGRhdGVPYmplY3RJZlBpbm5lZCh0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFBhcnNlT2JqZWN0KFBhcnNlT2JqZWN0KTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldE9iamVjdENvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VPYmplY3Q7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuVW5zZXRPcCA9IGV4cG9ydHMuU2V0T3AgPSBleHBvcnRzLlJlbW92ZU9wID0gZXhwb3J0cy5SZWxhdGlvbk9wID0gZXhwb3J0cy5PcCA9IGV4cG9ydHMuSW5jcmVtZW50T3AgPSBleHBvcnRzLkFkZFVuaXF1ZU9wID0gZXhwb3J0cy5BZGRPcCA9IHZvaWQgMDtcbmV4cG9ydHMub3BGcm9tSlNPTiA9IG9wRnJvbUpTT047XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfY29uY2F0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXRcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfc3BsaWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zcGxpY2VcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX2FycmF5Q29udGFpbnNPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2FycmF5Q29udGFpbnNPYmplY3RcIikpO1xudmFyIF9kZWNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZVwiKSk7XG52YXIgX2VuY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG52YXIgX3VuaXF1ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdW5pcXVlXCIpKTtcbmZ1bmN0aW9uIG9wRnJvbUpTT04oanNvbikge1xuICBpZiAoIWpzb24gfHwgIWpzb24uX19vcCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHN3aXRjaCAoanNvbi5fX29wKSB7XG4gICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgIHJldHVybiBuZXcgVW5zZXRPcCgpO1xuICAgIGNhc2UgJ0luY3JlbWVudCc6XG4gICAgICByZXR1cm4gbmV3IEluY3JlbWVudE9wKGpzb24uYW1vdW50KTtcbiAgICBjYXNlICdBZGQnOlxuICAgICAgcmV0dXJuIG5ldyBBZGRPcCgoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9iamVjdHMpKTtcbiAgICBjYXNlICdBZGRVbmlxdWUnOlxuICAgICAgcmV0dXJuIG5ldyBBZGRVbmlxdWVPcCgoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9iamVjdHMpKTtcbiAgICBjYXNlICdSZW1vdmUnOlxuICAgICAgcmV0dXJuIG5ldyBSZW1vdmVPcCgoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9iamVjdHMpKTtcbiAgICBjYXNlICdBZGRSZWxhdGlvbic6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IHRvQWRkID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbi5vYmplY3RzKTtcbiAgICAgICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkodG9BZGQpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbk9wKFtdLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbk9wKHRvQWRkLCBbXSk7XG4gICAgICB9XG4gICAgY2FzZSAnUmVtb3ZlUmVsYXRpb24nOlxuICAgICAge1xuICAgICAgICBjb25zdCB0b1JlbW92ZSA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24ub2JqZWN0cyk7XG4gICAgICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKHRvUmVtb3ZlKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25PcChbXSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25PcChbXSwgdG9SZW1vdmUpO1xuICAgICAgfVxuICAgIGNhc2UgJ0JhdGNoJzpcbiAgICAgIHtcbiAgICAgICAgbGV0IHRvQWRkID0gW107XG4gICAgICAgIGxldCB0b1JlbW92ZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb24ub3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGpzb24ub3BzW2ldLl9fb3AgPT09ICdBZGRSZWxhdGlvbicpIHtcbiAgICAgICAgICAgIHRvQWRkID0gKDAsIF9jb25jYXQuZGVmYXVsdCkodG9BZGQpLmNhbGwodG9BZGQsICgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24ub3BzW2ldLm9iamVjdHMpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGpzb24ub3BzW2ldLl9fb3AgPT09ICdSZW1vdmVSZWxhdGlvbicpIHtcbiAgICAgICAgICAgIHRvUmVtb3ZlID0gKDAsIF9jb25jYXQuZGVmYXVsdCkodG9SZW1vdmUpLmNhbGwodG9SZW1vdmUsICgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24ub3BzW2ldLm9iamVjdHMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbk9wKHRvQWRkLCB0b1JlbW92ZSk7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5jbGFzcyBPcCB7XG4gIC8vIEVtcHR5IHBhcmVudCBjbGFzc1xuICBhcHBseVRvKCkge30gLyogZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbiAgbWVyZ2VXaXRoKCkge30gLyogZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbiAgdG9KU09OKCkge30gLyogZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbn1cbmV4cG9ydHMuT3AgPSBPcDtcbmNsYXNzIFNldE9wIGV4dGVuZHMgT3Age1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHN1cGVyKCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdmFsdWVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG4gIGFwcGx5VG8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIG1lcmdlV2l0aCgpIHtcbiAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuX3ZhbHVlKTtcbiAgfVxuICB0b0pTT04ob2ZmbGluZSkge1xuICAgIHJldHVybiAoMCwgX2VuY29kZS5kZWZhdWx0KSh0aGlzLl92YWx1ZSwgZmFsc2UsIHRydWUsIHVuZGVmaW5lZCwgb2ZmbGluZSk7XG4gIH1cbn1cbmV4cG9ydHMuU2V0T3AgPSBTZXRPcDtcbmNsYXNzIFVuc2V0T3AgZXh0ZW5kcyBPcCB7XG4gIGFwcGx5VG8oKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBtZXJnZVdpdGgoKSB7XG4gICAgcmV0dXJuIG5ldyBVbnNldE9wKCk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX29wOiAnRGVsZXRlJ1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydHMuVW5zZXRPcCA9IFVuc2V0T3A7XG5jbGFzcyBJbmNyZW1lbnRPcCBleHRlbmRzIE9wIHtcbiAgY29uc3RydWN0b3IoYW1vdW50KSB7XG4gICAgc3VwZXIoKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9hbW91bnRcIiwgdm9pZCAwKTtcbiAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0luY3JlbWVudCBPcCBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYSBudW1lcmljIGFtb3VudC4nKTtcbiAgICB9XG4gICAgdGhpcy5fYW1vdW50ID0gYW1vdW50O1xuICB9XG4gIGFwcGx5VG8odmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2Ftb3VudDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBpbmNyZW1lbnQgYSBub24tbnVtZXJpYyB2YWx1ZS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Ftb3VudCArIHZhbHVlO1xuICB9XG4gIG1lcmdlV2l0aChwcmV2aW91cykge1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBTZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLmFwcGx5VG8ocHJldmlvdXMuX3ZhbHVlKSk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFVuc2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5fYW1vdW50KTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgSW5jcmVtZW50T3ApIHtcbiAgICAgIHJldHVybiBuZXcgSW5jcmVtZW50T3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl9hbW91bnQpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbWVyZ2UgSW5jcmVtZW50IE9wIHdpdGggdGhlIHByZXZpb3VzIE9wJyk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX29wOiAnSW5jcmVtZW50JyxcbiAgICAgIGFtb3VudDogdGhpcy5fYW1vdW50XG4gICAgfTtcbiAgfVxufVxuZXhwb3J0cy5JbmNyZW1lbnRPcCA9IEluY3JlbWVudE9wO1xuY2xhc3MgQWRkT3AgZXh0ZW5kcyBPcCB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgc3VwZXIoKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl92YWx1ZVwiLCB2b2lkIDApO1xuICAgIHRoaXMuX3ZhbHVlID0gKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgfVxuICBhcHBseVRvKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAoMCwgX2NvbmNhdC5kZWZhdWx0KSh2YWx1ZSkuY2FsbCh2YWx1ZSwgdGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgZWxlbWVudHMgdG8gYSBub24tYXJyYXkgdmFsdWUnKTtcbiAgfVxuICBtZXJnZVdpdGgocHJldmlvdXMpIHtcbiAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgU2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl92YWx1ZSkpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBVbnNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgQWRkT3ApIHtcbiAgICAgIHJldHVybiBuZXcgQWRkT3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl92YWx1ZSkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtZXJnZSBBZGQgT3Agd2l0aCB0aGUgcHJldmlvdXMgT3AnKTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fb3A6ICdBZGQnLFxuICAgICAgb2JqZWN0czogKDAsIF9lbmNvZGUuZGVmYXVsdCkodGhpcy5fdmFsdWUsIGZhbHNlLCB0cnVlKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydHMuQWRkT3AgPSBBZGRPcDtcbmNsYXNzIEFkZFVuaXF1ZU9wIGV4dGVuZHMgT3Age1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHN1cGVyKCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdmFsdWVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLl92YWx1ZSA9ICgwLCBfdW5pcXVlLmRlZmF1bHQpKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuICB9XG4gIGFwcGx5VG8odmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlIHx8IFtdO1xuICAgIH1cbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSkge1xuICAgICAgdmFyIF9jb250ZXh0O1xuICAgICAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICAgICAgY29uc3QgdG9BZGQgPSBbXTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dCA9IHRoaXMuX3ZhbHVlKS5jYWxsKF9jb250ZXh0LCB2ID0+IHtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgICAgIGlmICghKDAsIF9hcnJheUNvbnRhaW5zT2JqZWN0LmRlZmF1bHQpKHZhbHVlLCB2KSkge1xuICAgICAgICAgICAgdG9BZGQucHVzaCh2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KSh2YWx1ZSkuY2FsbCh2YWx1ZSwgdikgPCAwKSB7XG4gICAgICAgICAgICB0b0FkZC5wdXNoKHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gKDAsIF9jb25jYXQuZGVmYXVsdCkodmFsdWUpLmNhbGwodmFsdWUsIHRvQWRkKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIGEgbm9uLWFycmF5IHZhbHVlJyk7XG4gIH1cbiAgbWVyZ2VXaXRoKHByZXZpb3VzKSB7XG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fdmFsdWUpKTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgVW5zZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIEFkZFVuaXF1ZU9wKSB7XG4gICAgICByZXR1cm4gbmV3IEFkZFVuaXF1ZU9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fdmFsdWUpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbWVyZ2UgQWRkVW5pcXVlIE9wIHdpdGggdGhlIHByZXZpb3VzIE9wJyk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX29wOiAnQWRkVW5pcXVlJyxcbiAgICAgIG9iamVjdHM6ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHRoaXMuX3ZhbHVlLCBmYWxzZSwgdHJ1ZSlcbiAgICB9O1xuICB9XG59XG5leHBvcnRzLkFkZFVuaXF1ZU9wID0gQWRkVW5pcXVlT3A7XG5jbGFzcyBSZW1vdmVPcCBleHRlbmRzIE9wIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICBzdXBlcigpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3ZhbHVlXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5fdmFsdWUgPSAoMCwgX3VuaXF1ZS5kZWZhdWx0KSgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcbiAgfVxuICBhcHBseVRvKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgICAgIC8vIHZhciBpID0gdmFsdWUuaW5kZXhPZih0aGlzLl92YWx1ZSk7XG4gICAgICBjb25zdCByZW1vdmVkID0gKDAsIF9jb25jYXQuZGVmYXVsdCkodmFsdWUpLmNhbGwodmFsdWUsIFtdKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGluZGV4ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKHJlbW92ZWQpLmNhbGwocmVtb3ZlZCwgdGhpcy5fdmFsdWVbaV0pO1xuICAgICAgICB3aGlsZSAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICgwLCBfc3BsaWNlLmRlZmF1bHQpKHJlbW92ZWQpLmNhbGwocmVtb3ZlZCwgaW5kZXgsIDEpO1xuICAgICAgICAgIGluZGV4ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKHJlbW92ZWQpLmNhbGwocmVtb3ZlZCwgdGhpcy5fdmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl92YWx1ZVtpXSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0ICYmIHRoaXMuX3ZhbHVlW2ldLmlkKSB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZW1vdmVkLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZFtqXSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0ICYmIHRoaXMuX3ZhbHVlW2ldLmlkID09PSByZW1vdmVkW2pdLmlkKSB7XG4gICAgICAgICAgICAgICgwLCBfc3BsaWNlLmRlZmF1bHQpKHJlbW92ZWQpLmNhbGwocmVtb3ZlZCwgaiwgMSk7XG4gICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZW1vdmVkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZW1vdmUgZWxlbWVudHMgZnJvbSBhIG5vbi1hcnJheSB2YWx1ZScpO1xuICB9XG4gIG1lcmdlV2l0aChwcmV2aW91cykge1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBTZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLmFwcGx5VG8ocHJldmlvdXMuX3ZhbHVlKSk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFVuc2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgVW5zZXRPcCgpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBSZW1vdmVPcCkge1xuICAgICAgdmFyIF9jb250ZXh0MjtcbiAgICAgIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgICAgIGNvbnN0IHVuaXF1ZXMgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDIgPSBwcmV2aW91cy5fdmFsdWUpLmNhbGwoX2NvbnRleHQyLCBbXSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLl92YWx1ZVtpXSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICAgICAgaWYgKCEoMCwgX2FycmF5Q29udGFpbnNPYmplY3QuZGVmYXVsdCkodW5pcXVlcywgdGhpcy5fdmFsdWVbaV0pKSB7XG4gICAgICAgICAgICB1bmlxdWVzLnB1c2godGhpcy5fdmFsdWVbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHVuaXF1ZXMpLmNhbGwodW5pcXVlcywgdGhpcy5fdmFsdWVbaV0pIDwgMCkge1xuICAgICAgICAgICAgdW5pcXVlcy5wdXNoKHRoaXMuX3ZhbHVlW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmVtb3ZlT3AodW5pcXVlcyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1lcmdlIFJlbW92ZSBPcCB3aXRoIHRoZSBwcmV2aW91cyBPcCcpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19vcDogJ1JlbW92ZScsXG4gICAgICBvYmplY3RzOiAoMCwgX2VuY29kZS5kZWZhdWx0KSh0aGlzLl92YWx1ZSwgZmFsc2UsIHRydWUpXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0cy5SZW1vdmVPcCA9IFJlbW92ZU9wO1xuY2xhc3MgUmVsYXRpb25PcCBleHRlbmRzIE9wIHtcbiAgY29uc3RydWN0b3IoYWRkcywgcmVtb3Zlcykge1xuICAgIHN1cGVyKCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdGFyZ2V0Q2xhc3NOYW1lXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZWxhdGlvbnNUb0FkZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVsYXRpb25zVG9SZW1vdmVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLl90YXJnZXRDbGFzc05hbWUgPSBudWxsO1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoYWRkcykpIHtcbiAgICAgIHRoaXMucmVsYXRpb25zVG9BZGQgPSAoMCwgX3VuaXF1ZS5kZWZhdWx0KSgoMCwgX21hcC5kZWZhdWx0KShhZGRzKS5jYWxsKGFkZHMsIHRoaXMuX2V4dHJhY3RJZCwgdGhpcykpO1xuICAgIH1cbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHJlbW92ZXMpKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uc1RvUmVtb3ZlID0gKDAsIF91bmlxdWUuZGVmYXVsdCkoKDAsIF9tYXAuZGVmYXVsdCkocmVtb3ZlcykuY2FsbChyZW1vdmVzLCB0aGlzLl9leHRyYWN0SWQsIHRoaXMpKTtcbiAgICB9XG4gIH1cbiAgX2V4dHJhY3RJZChvYmopIHtcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIGlmICghb2JqLmlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3QgYWRkIG9yIHJlbW92ZSBhbiB1bnNhdmVkIFBhcnNlIE9iamVjdCBmcm9tIGEgcmVsYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl90YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgIHRoaXMuX3RhcmdldENsYXNzTmFtZSA9IG9iai5jbGFzc05hbWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YXJnZXRDbGFzc05hbWUgIT09IG9iai5jbGFzc05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gY3JlYXRlIGEgUmVsYXRpb24gd2l0aCAyIGRpZmZlcmVudCBvYmplY3QgdHlwZXM6ICcgKyB0aGlzLl90YXJnZXRDbGFzc05hbWUgKyAnIGFuZCAnICsgb2JqLmNsYXNzTmFtZSArICcuJyk7XG4gICAgfVxuICAgIHJldHVybiBvYmouaWQ7XG4gIH1cbiAgYXBwbHlUbyh2YWx1ZSwgcGFyZW50LCBrZXkpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBpZiAoIXBhcmVudCB8fCAha2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFwcGx5IGEgUmVsYXRpb25PcCB3aXRob3V0IGVpdGhlciBhIHByZXZpb3VzIHZhbHVlLCBvciBhbiBvYmplY3QgYW5kIGEga2V5Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxhdGlvbiA9IG5ldyBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KHBhcmVudCwga2V5KTtcbiAgICAgIHJlbGF0aW9uLnRhcmdldENsYXNzTmFtZSA9IHRoaXMuX3RhcmdldENsYXNzTmFtZTtcbiAgICAgIHJldHVybiByZWxhdGlvbjtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkge1xuICAgICAgaWYgKHRoaXMuX3RhcmdldENsYXNzTmFtZSkge1xuICAgICAgICBpZiAodmFsdWUudGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3RhcmdldENsYXNzTmFtZSAhPT0gdmFsdWUudGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbGF0ZWQgb2JqZWN0IG11c3QgYmUgYSAnICsgdmFsdWUudGFyZ2V0Q2xhc3NOYW1lICsgJywgYnV0IGEgJyArIHRoaXMuX3RhcmdldENsYXNzTmFtZSArICcgd2FzIHBhc3NlZCBpbi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUudGFyZ2V0Q2xhc3NOYW1lID0gdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVsYXRpb24gY2Fubm90IGJlIGFwcGxpZWQgdG8gYSBub24tcmVsYXRpb24gZmllbGQnKTtcbiAgICB9XG4gIH1cbiAgbWVyZ2VXaXRoKHByZXZpb3VzKSB7XG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFVuc2V0T3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBtb2RpZnkgYSByZWxhdGlvbiBhZnRlciBkZWxldGluZyBpdC4nKTtcbiAgICB9IGVsc2UgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgU2V0T3AgJiYgcHJldmlvdXMuX3ZhbHVlIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFJlbGF0aW9uT3ApIHtcbiAgICAgIHZhciBfY29udGV4dDMsIF9jb250ZXh0NCwgX2NvbnRleHQ1LCBfY29udGV4dDYsIF9jb250ZXh0NywgX2NvbnRleHQ4O1xuICAgICAgaWYgKHByZXZpb3VzLl90YXJnZXRDbGFzc05hbWUgJiYgcHJldmlvdXMuX3RhcmdldENsYXNzTmFtZSAhPT0gdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVsYXRlZCBvYmplY3QgbXVzdCBiZSBvZiBjbGFzcyAnICsgcHJldmlvdXMuX3RhcmdldENsYXNzTmFtZSArICcsIGJ1dCAnICsgKHRoaXMuX3RhcmdldENsYXNzTmFtZSB8fCAnbnVsbCcpICsgJyB3YXMgcGFzc2VkIGluLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3QWRkID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQzID0gcHJldmlvdXMucmVsYXRpb25zVG9BZGQpLmNhbGwoX2NvbnRleHQzLCBbXSk7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ0ID0gdGhpcy5yZWxhdGlvbnNUb1JlbW92ZSkuY2FsbChfY29udGV4dDQsIHIgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShuZXdBZGQpLmNhbGwobmV3QWRkLCByKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAoMCwgX3NwbGljZS5kZWZhdWx0KShuZXdBZGQpLmNhbGwobmV3QWRkLCBpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NSA9IHRoaXMucmVsYXRpb25zVG9BZGQpLmNhbGwoX2NvbnRleHQ1LCByID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkobmV3QWRkKS5jYWxsKG5ld0FkZCwgcik7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICBuZXdBZGQucHVzaChyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXdSZW1vdmUgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDYgPSBwcmV2aW91cy5yZWxhdGlvbnNUb1JlbW92ZSkuY2FsbChfY29udGV4dDYsIFtdKTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDcgPSB0aGlzLnJlbGF0aW9uc1RvQWRkKS5jYWxsKF9jb250ZXh0NywgciA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKG5ld1JlbW92ZSkuY2FsbChuZXdSZW1vdmUsIHIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICgwLCBfc3BsaWNlLmRlZmF1bHQpKG5ld1JlbW92ZSkuY2FsbChuZXdSZW1vdmUsIGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ4ID0gdGhpcy5yZWxhdGlvbnNUb1JlbW92ZSkuY2FsbChfY29udGV4dDgsIHIgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShuZXdSZW1vdmUpLmNhbGwobmV3UmVtb3ZlLCByKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgIG5ld1JlbW92ZS5wdXNoKHIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG5ld1JlbGF0aW9uID0gbmV3IFJlbGF0aW9uT3AobmV3QWRkLCBuZXdSZW1vdmUpO1xuICAgICAgbmV3UmVsYXRpb24uX3RhcmdldENsYXNzTmFtZSA9IHRoaXMuX3RhcmdldENsYXNzTmFtZTtcbiAgICAgIHJldHVybiBuZXdSZWxhdGlvbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbWVyZ2UgUmVsYXRpb24gT3Agd2l0aCB0aGUgcHJldmlvdXMgT3AnKTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgY29uc3QgaWRUb1BvaW50ZXIgPSBpZCA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgICAgY2xhc3NOYW1lOiB0aGlzLl90YXJnZXRDbGFzc05hbWUsXG4gICAgICAgIG9iamVjdElkOiBpZFxuICAgICAgfTtcbiAgICB9O1xuICAgIGxldCBwb2ludGVycyA9IG51bGw7XG4gICAgbGV0IGFkZHMgPSBudWxsO1xuICAgIGxldCByZW1vdmVzID0gbnVsbDtcbiAgICBpZiAodGhpcy5yZWxhdGlvbnNUb0FkZC5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgX2NvbnRleHQ5O1xuICAgICAgcG9pbnRlcnMgPSAoMCwgX21hcC5kZWZhdWx0KShfY29udGV4dDkgPSB0aGlzLnJlbGF0aW9uc1RvQWRkKS5jYWxsKF9jb250ZXh0OSwgaWRUb1BvaW50ZXIpO1xuICAgICAgYWRkcyA9IHtcbiAgICAgICAgX19vcDogJ0FkZFJlbGF0aW9uJyxcbiAgICAgICAgb2JqZWN0czogcG9pbnRlcnNcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLnJlbGF0aW9uc1RvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBfY29udGV4dDEwO1xuICAgICAgcG9pbnRlcnMgPSAoMCwgX21hcC5kZWZhdWx0KShfY29udGV4dDEwID0gdGhpcy5yZWxhdGlvbnNUb1JlbW92ZSkuY2FsbChfY29udGV4dDEwLCBpZFRvUG9pbnRlcik7XG4gICAgICByZW1vdmVzID0ge1xuICAgICAgICBfX29wOiAnUmVtb3ZlUmVsYXRpb24nLFxuICAgICAgICBvYmplY3RzOiBwb2ludGVyc1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGFkZHMgJiYgcmVtb3Zlcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19vcDogJ0JhdGNoJyxcbiAgICAgICAgb3BzOiBbYWRkcywgcmVtb3Zlc11cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBhZGRzIHx8IHJlbW92ZXMgfHwge307XG4gIH1cbn1cbmV4cG9ydHMuUmVsYXRpb25PcCA9IFJlbGF0aW9uT3A7XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQYXJzZU9wKHtcbiAgT3AsXG4gIG9wRnJvbUpTT04sXG4gIFNldE9wLFxuICBVbnNldE9wLFxuICBJbmNyZW1lbnRPcCxcbiAgQWRkT3AsXG4gIFJlbGF0aW9uT3AsXG4gIFJlbW92ZU9wLFxuICBBZGRVbmlxdWVPcFxufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9QYXJzZUdlb1BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUdlb1BvaW50XCIpKTtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBQb2x5Z29uIHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6PGJyPlxuICogICA8cHJlPlxuICogICBuZXcgUG9seWdvbihbWzAsMF0sWzAsMV0sWzEsMV0sWzEsMF1dKVxuICogICBuZXcgUG9seWdvbihbR2VvUG9pbnQsIEdlb1BvaW50LCBHZW9Qb2ludF0pXG4gKiAgIDwvcHJlPlxuICpcbiAqIDxwPlJlcHJlc2VudHMgYSBjb29yZGluYXRlcyB0aGF0IG1heSBiZSBhc3NvY2lhdGVkXG4gKiB3aXRoIGEga2V5IGluIGEgUGFyc2VPYmplY3Qgb3IgdXNlZCBhcyBhIHJlZmVyZW5jZSBwb2ludCBmb3IgZ2VvIHF1ZXJpZXMuXG4gKiBUaGlzIGFsbG93cyBwcm94aW1pdHktYmFzZWQgcXVlcmllcyBvbiB0aGUga2V5LjwvcD5cbiAqXG4gKiA8cD5FeGFtcGxlOjxwcmU+XG4gKiAgIHZhciBwb2x5Z29uID0gbmV3IFBhcnNlLlBvbHlnb24oW1swLDBdLFswLDFdLFsxLDFdLFsxLDBdXSk7XG4gKiAgIHZhciBvYmplY3QgPSBuZXcgUGFyc2UuT2JqZWN0KFwiUGxhY2VPYmplY3RcIik7XG4gKiAgIG9iamVjdC5zZXQoXCJhcmVhXCIsIHBvbHlnb24pO1xuICogICBvYmplY3Quc2F2ZSgpOzwvcHJlPjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuUG9seWdvblxuICovXG5jbGFzcyBQYXJzZVBvbHlnb24ge1xuICAvKipcbiAgICogQHBhcmFtIHsoQ29vcmRpbmF0ZXMgfCBQYXJzZS5HZW9Qb2ludFtdKX0gY29vcmRpbmF0ZXMgQW4gQXJyYXkgb2YgY29vcmRpbmF0ZSBwYWlyc1xuICAgKi9cbiAgY29uc3RydWN0b3IoY29vcmRpbmF0ZXMpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9jb29yZGluYXRlc1wiLCB2b2lkIDApO1xuICAgIHRoaXMuX2Nvb3JkaW5hdGVzID0gUGFyc2VQb2x5Z29uLl92YWxpZGF0ZShjb29yZGluYXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29vcmRpbmF0ZXMgdmFsdWUgZm9yIHRoaXMgUG9seWdvbi5cbiAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBub3QgdmFsaWQgdHlwZS5cbiAgICpcbiAgICogQHByb3BlcnR5IHsoQ29vcmRpbmF0ZXMgfCBQYXJzZS5HZW9Qb2ludFtdKX0gY29vcmRpbmF0ZXMgbGlzdCBvZiBjb29yZGluYXRlc1xuICAgKiBAcmV0dXJucyB7Q29vcmRpbmF0ZXN9XG4gICAqL1xuICBnZXQgY29vcmRpbmF0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzO1xuICB9XG4gIHNldCBjb29yZGluYXRlcyhjb29yZHMpIHtcbiAgICB0aGlzLl9jb29yZGluYXRlcyA9IFBhcnNlUG9seWdvbi5fdmFsaWRhdGUoY29vcmRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgUG9seWdvbiwgc3VpdGFibGUgZm9yIFBhcnNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIFBhcnNlUG9seWdvbi5fdmFsaWRhdGUodGhpcy5fY29vcmRpbmF0ZXMpO1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiB0aGlzLl9jb29yZGluYXRlc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHR3byBwb2x5Z29ucyBhcmUgZXF1YWxcbiAgICpcbiAgICogQHBhcmFtIHsoUGFyc2UuUG9seWdvbiB8IG9iamVjdCl9IG90aGVyXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBQYXJzZVBvbHlnb24pIHx8IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoICE9PSBvdGhlci5jb29yZGluYXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IGlzRXF1YWwgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICh0aGlzLl9jb29yZGluYXRlc1tpXVswXSAhPSBvdGhlci5jb29yZGluYXRlc1tpXVswXSB8fCB0aGlzLl9jb29yZGluYXRlc1tpXVsxXSAhPSBvdGhlci5jb29yZGluYXRlc1tpXVsxXSkge1xuICAgICAgICBpc0VxdWFsID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNFcXVhbDtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBpZiB0aGUgcG9pbnQgaXMgY29udGFpbmVkIGluIHRoZSBwb2x5Z29uXG4gICAqL1xuICBjb250YWluc1BvaW50KHBvaW50KSB7XG4gICAgbGV0IG1pblggPSB0aGlzLl9jb29yZGluYXRlc1swXVswXTtcbiAgICBsZXQgbWF4WCA9IHRoaXMuX2Nvb3JkaW5hdGVzWzBdWzBdO1xuICAgIGxldCBtaW5ZID0gdGhpcy5fY29vcmRpbmF0ZXNbMF1bMV07XG4gICAgbGV0IG1heFkgPSB0aGlzLl9jb29yZGluYXRlc1swXVsxXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBwID0gdGhpcy5fY29vcmRpbmF0ZXNbaV07XG4gICAgICBtaW5YID0gTWF0aC5taW4ocFswXSwgbWluWCk7XG4gICAgICBtYXhYID0gTWF0aC5tYXgocFswXSwgbWF4WCk7XG4gICAgICBtaW5ZID0gTWF0aC5taW4ocFsxXSwgbWluWSk7XG4gICAgICBtYXhZID0gTWF0aC5tYXgocFsxXSwgbWF4WSk7XG4gICAgfVxuICAgIGNvbnN0IG91dHNpZGUgPSBwb2ludC5sYXRpdHVkZSA8IG1pblggfHwgcG9pbnQubGF0aXR1ZGUgPiBtYXhYIHx8IHBvaW50LmxvbmdpdHVkZSA8IG1pblkgfHwgcG9pbnQubG9uZ2l0dWRlID4gbWF4WTtcbiAgICBpZiAob3V0c2lkZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgaW5zaWRlID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGggLSAxOyBpIDwgdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoOyBqID0gaSsrKSB7XG4gICAgICBjb25zdCBzdGFydFggPSB0aGlzLl9jb29yZGluYXRlc1tpXVswXTtcbiAgICAgIGNvbnN0IHN0YXJ0WSA9IHRoaXMuX2Nvb3JkaW5hdGVzW2ldWzFdO1xuICAgICAgY29uc3QgZW5kWCA9IHRoaXMuX2Nvb3JkaW5hdGVzW2pdWzBdO1xuICAgICAgY29uc3QgZW5kWSA9IHRoaXMuX2Nvb3JkaW5hdGVzW2pdWzFdO1xuICAgICAgY29uc3QgaW50ZXJzZWN0ID0gc3RhcnRZID4gcG9pbnQubG9uZ2l0dWRlICE9IGVuZFkgPiBwb2ludC5sb25naXR1ZGUgJiYgcG9pbnQubGF0aXR1ZGUgPCAoZW5kWCAtIHN0YXJ0WCkgKiAocG9pbnQubG9uZ2l0dWRlIC0gc3RhcnRZKSAvIChlbmRZIC0gc3RhcnRZKSArIHN0YXJ0WDtcbiAgICAgIGlmIChpbnRlcnNlY3QpIHtcbiAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluc2lkZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgbGlzdCBvZiBjb29yZGluYXRlcyBjYW4gZm9ybSBhIHZhbGlkIHBvbHlnb25cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gY29vcmRzIHRoZSBsaXN0IG9mIGNvb3JkaW5hdGVzIHRvIHZhbGlkYXRlIGFzIGEgcG9seWdvblxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9XG4gICAqIEByZXR1cm5zIHtudW1iZXJbXVtdfSBBcnJheSBvZiBjb29yZGluYXRlcyBpZiB2YWxpZGF0ZWQuXG4gICAqL1xuICBzdGF0aWMgX3ZhbGlkYXRlKGNvb3Jkcykge1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKGNvb3JkcykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nvb3JkaW5hdGVzIG11c3QgYmUgYW4gQXJyYXknKTtcbiAgICB9XG4gICAgaWYgKGNvb3Jkcy5sZW5ndGggPCAzKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQb2x5Z29uIG11c3QgaGF2ZSBhdCBsZWFzdCAzIEdlb1BvaW50cyBvciBQb2ludHMnKTtcbiAgICB9XG4gICAgY29uc3QgcG9pbnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuICAgICAgbGV0IGdlb1BvaW50O1xuICAgICAgaWYgKGNvb3JkIGluc3RhbmNlb2YgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCkge1xuICAgICAgICBnZW9Qb2ludCA9IGNvb3JkO1xuICAgICAgfSBlbHNlIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoY29vcmQpICYmIGNvb3JkLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBnZW9Qb2ludCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KGNvb3JkWzBdLCBjb29yZFsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5IG9mIEdlb1BvaW50cyBvciBQb2ludHMnKTtcbiAgICAgIH1cbiAgICAgIHBvaW50cy5wdXNoKFtnZW9Qb2ludC5sYXRpdHVkZSwgZ2VvUG9pbnQubG9uZ2l0dWRlXSk7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHM7XG4gIH1cbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlUG9seWdvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9zbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc2xpY2VcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX2ZpbHRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmlsdGVyXCIpKTtcbnZhciBfa2V5czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2tleXNcIikpO1xudmFyIF9jb25jYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKSk7XG52YXIgX2luY2x1ZGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmNsdWRlc1wiKSk7XG52YXIgX3NvcnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NvcnRcIikpO1xudmFyIF9zcGxpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NwbGljZVwiKSk7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9maW5kID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maW5kXCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9lbnRyaWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZW50cmllc1wiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2VuY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfcHJvbWlzZVV0aWxzID0gcmVxdWlyZShcIi4vcHJvbWlzZVV0aWxzXCIpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VHZW9Qb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VHZW9Qb2ludFwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgX09mZmxpbmVRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vT2ZmbGluZVF1ZXJ5XCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVVdGlscyA9IHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlVXRpbHNcIik7XG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSByZWdleCB0aGF0IG1hdGNoZXMgaXQuXG4gKiBTdXJyb3VuZGluZyB3aXRoIFxcUSAuLiBcXEUgZG9lcyB0aGlzLCB3ZSBqdXN0IG5lZWQgdG8gZXNjYXBlIGFueSBcXEUncyBpblxuICogdGhlIHRleHQgc2VwYXJhdGVseS5cbiAqXG4gKiBAcGFyYW0gc1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHF1b3RlKHMpIHtcbiAgcmV0dXJuICdcXFxcUScgKyBzLnJlcGxhY2UoJ1xcXFxFJywgJ1xcXFxFXFxcXFxcXFxFXFxcXFEnKSArICdcXFxcRSc7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGNsYXNzIG5hbWUgZnJvbSBxdWVyaWVzLiBJZiBub3QgYWxsIHF1ZXJpZXMgaGF2ZSB0aGUgc2FtZVxuICogY2xhc3MgbmFtZSBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAqXG4gKiBAcGFyYW0gcXVlcmllc1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9nZXRDbGFzc05hbWVGcm9tUXVlcmllcyhxdWVyaWVzKSB7XG4gIGxldCBjbGFzc05hbWUgPSBudWxsO1xuICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocXVlcmllcykuY2FsbChxdWVyaWVzLCBxID0+IHtcbiAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lID0gcS5jbGFzc05hbWU7XG4gICAgfVxuICAgIGlmIChjbGFzc05hbWUgIT09IHEuY2xhc3NOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsbCBxdWVyaWVzIG11c3QgYmUgZm9yIHRoZSBzYW1lIGNsYXNzLicpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBjbGFzc05hbWU7XG59XG5cbi8qXG4gKiBIYW5kbGVzIHByZS1wb3B1bGF0aW5nIHRoZSByZXN1bHQgZGF0YSBvZiBhIHF1ZXJ5IHdpdGggc2VsZWN0IGZpZWxkcyxcbiAqIG1ha2luZyBzdXJlIHRoYXQgdGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5zIGtleXMgZm9yIGFsbCBvYmplY3RzIHRoYXQgaGF2ZVxuICogYmVlbiByZXF1ZXN0ZWQgd2l0aCBhIHNlbGVjdCwgc28gdGhhdCBvdXIgY2FjaGVkIHN0YXRlIHVwZGF0ZXMgY29ycmVjdGx5LlxuICovXG5mdW5jdGlvbiBoYW5kbGVTZWxlY3RSZXN1bHQoZGF0YSwgc2VsZWN0KSB7XG4gIGNvbnN0IHNlcnZlckRhdGFNYXNrID0ge307XG4gICgwLCBfZm9yRWFjaC5kZWZhdWx0KShzZWxlY3QpLmNhbGwoc2VsZWN0LCBmaWVsZCA9PiB7XG4gICAgY29uc3QgaGFzU3ViT2JqZWN0U2VsZWN0ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKGZpZWxkKS5jYWxsKGZpZWxkLCAnLicpICE9PSAtMTtcbiAgICBpZiAoIWhhc1N1Yk9iamVjdFNlbGVjdCAmJiAhZGF0YS5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHtcbiAgICAgIC8vIHRoaXMgZmllbGQgd2FzIHNlbGVjdGVkLCBidXQgaXMgbWlzc2luZyBmcm9tIHRoZSByZXRyaWV2ZWQgZGF0YVxuICAgICAgZGF0YVtmaWVsZF0gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChoYXNTdWJPYmplY3RTZWxlY3QpIHtcbiAgICAgIC8vIHRoaXMgZmllbGQgcmVmZXJlbmNlcyBhIHN1Yi1vYmplY3QsXG4gICAgICAvLyBzbyB3ZSBuZWVkIHRvIHdhbGsgZG93biB0aGUgcGF0aCBjb21wb25lbnRzXG4gICAgICBjb25zdCBwYXRoQ29tcG9uZW50cyA9IGZpZWxkLnNwbGl0KCcuJyk7XG4gICAgICBsZXQgb2JqID0gZGF0YTtcbiAgICAgIGxldCBzZXJ2ZXJNYXNrID0gc2VydmVyRGF0YU1hc2s7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkocGF0aENvbXBvbmVudHMpLmNhbGwocGF0aENvbXBvbmVudHMsIChjb21wb25lbnQsIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgLy8gYWRkIGtleXMgaWYgdGhlIGV4cGVjdGVkIGRhdGEgaXMgbWlzc2luZ1xuICAgICAgICBpZiAob2JqICYmICFvYmouaGFzT3duUHJvcGVydHkoY29tcG9uZW50KSkge1xuICAgICAgICAgIG9ialtjb21wb25lbnRdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBvYmogPSBvYmpbY29tcG9uZW50XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vYWRkIHRoaXMgcGF0aCBjb21wb25lbnQgdG8gdGhlIHNlcnZlciBtYXNrIHNvIHdlIGNhbiBmaWxsIGl0IGluIGxhdGVyIGlmIG5lZWRlZFxuICAgICAgICBpZiAoaW5kZXggPCBhcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGlmICghc2VydmVyTWFza1tjb21wb25lbnRdKSB7XG4gICAgICAgICAgICBzZXJ2ZXJNYXNrW2NvbXBvbmVudF0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VydmVyTWFzayA9IHNlcnZlck1hc2tbY29tcG9uZW50XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKCgwLCBfa2V5cy5kZWZhdWx0KShzZXJ2ZXJEYXRhTWFzaykubGVuZ3RoID4gMCkge1xuICAgIC8vIFdoZW4gc2VsZWN0aW5nIGZyb20gc3ViLW9iamVjdHMsIHdlIGRvbid0IHdhbnQgdG8gYmxvdyBhd2F5IHRoZSBtaXNzaW5nXG4gICAgLy8gaW5mb3JtYXRpb24gdGhhdCB3ZSBtYXkgaGF2ZSByZXRyaWV2ZWQgYmVmb3JlLiBXZSd2ZSBhbHJlYWR5IGFkZGVkIGFueVxuICAgIC8vIG1pc3Npbmcgc2VsZWN0ZWQga2V5cyB0byBzdWItb2JqZWN0cywgYnV0IHdlIHN0aWxsIG5lZWQgdG8gYWRkIGluIHRoZVxuICAgIC8vIGRhdGEgZm9yIGFueSBwcmV2aW91c2x5IHJldHJpZXZlZCBzdWItb2JqZWN0cyB0aGF0IHdlcmUgbm90IHNlbGVjdGVkLlxuXG4gICAgY29uc3Qgc2VydmVyRGF0YSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpLmdldFNlcnZlckRhdGEoe1xuICAgICAgaWQ6IGRhdGEub2JqZWN0SWQsXG4gICAgICBjbGFzc05hbWU6IGRhdGEuY2xhc3NOYW1lXG4gICAgfSk7XG4gICAgY29weU1pc3NpbmdEYXRhV2l0aE1hc2soc2VydmVyRGF0YSwgZGF0YSwgc2VydmVyRGF0YU1hc2ssIGZhbHNlKTtcbiAgfVxufVxuZnVuY3Rpb24gY29weU1pc3NpbmdEYXRhV2l0aE1hc2soc3JjLCBkZXN0LCBtYXNrLCBjb3B5VGhpc0xldmVsKSB7XG4gIC8vY29weSBtaXNzaW5nIGVsZW1lbnRzIGF0IHRoaXMgbGV2ZWxcbiAgaWYgKGNvcHlUaGlzTGV2ZWwpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzcmMpIHtcbiAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhZGVzdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGRlc3Rba2V5XSA9IHNyY1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBtYXNrKSB7XG4gICAgaWYgKGRlc3Rba2V5XSAhPT0gdW5kZWZpbmVkICYmIGRlc3Rba2V5XSAhPT0gbnVsbCAmJiBzcmMgIT09IHVuZGVmaW5lZCAmJiBzcmMgIT09IG51bGwpIHtcbiAgICAgIC8vdHJhdmVyc2UgaW50byBvYmplY3RzIGFzIG5lZWRlZFxuICAgICAgY29weU1pc3NpbmdEYXRhV2l0aE1hc2soc3JjW2tleV0sIGRlc3Rba2V5XSwgbWFza1trZXldLCB0cnVlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZU9mZmxpbmVTb3J0KGEsIGIsIHNvcnRzKSB7XG4gIGxldCBvcmRlciA9IHNvcnRzWzBdO1xuICBjb25zdCBvcGVyYXRvciA9ICgwLCBfc2xpY2UuZGVmYXVsdCkob3JkZXIpLmNhbGwob3JkZXIsIDAsIDEpO1xuICBjb25zdCBpc0Rlc2NlbmRpbmcgPSBvcGVyYXRvciA9PT0gJy0nO1xuICBpZiAoaXNEZXNjZW5kaW5nKSB7XG4gICAgb3JkZXIgPSBvcmRlci5zdWJzdHJpbmcoMSk7XG4gIH1cbiAgaWYgKG9yZGVyID09PSAnX2NyZWF0ZWRfYXQnKSB7XG4gICAgb3JkZXIgPSAnY3JlYXRlZEF0JztcbiAgfVxuICBpZiAob3JkZXIgPT09ICdfdXBkYXRlZF9hdCcpIHtcbiAgICBvcmRlciA9ICd1cGRhdGVkQXQnO1xuICB9XG4gIGlmICghL15bQS1aYS16XVswLTlBLVphLXpfXSokLy50ZXN0KG9yZGVyKSB8fCBvcmRlciA9PT0gJ3Bhc3N3b3JkJykge1xuICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9LRVlfTkFNRSwgYEludmFsaWQgS2V5OiAke29yZGVyfWApO1xuICB9XG4gIGNvbnN0IGZpZWxkMSA9IGEuZ2V0KG9yZGVyKTtcbiAgY29uc3QgZmllbGQyID0gYi5nZXQob3JkZXIpO1xuICBpZiAoZmllbGQxIDwgZmllbGQyKSB7XG4gICAgcmV0dXJuIGlzRGVzY2VuZGluZyA/IDEgOiAtMTtcbiAgfVxuICBpZiAoZmllbGQxID4gZmllbGQyKSB7XG4gICAgcmV0dXJuIGlzRGVzY2VuZGluZyA/IC0xIDogMTtcbiAgfVxuICBpZiAoc29ydHMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IHJlbWFpbmluZ1NvcnRzID0gKDAsIF9zbGljZS5kZWZhdWx0KShzb3J0cykuY2FsbChzb3J0cywgMSk7XG4gICAgcmV0dXJuIGhhbmRsZU9mZmxpbmVTb3J0KGEsIGIsIHJlbWFpbmluZ1NvcnRzKTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBwYXJzZSBQYXJzZS5RdWVyeSBmb3IgdGhlIGdpdmVuIFBhcnNlLk9iamVjdCBzdWJjbGFzcy5cbiAqXG4gKiA8cD5QYXJzZS5RdWVyeSBkZWZpbmVzIGEgcXVlcnkgdGhhdCBpcyB1c2VkIHRvIGZldGNoIFBhcnNlLk9iamVjdHMuIFRoZVxuICogbW9zdCBjb21tb24gdXNlIGNhc2UgaXMgZmluZGluZyBhbGwgb2JqZWN0cyB0aGF0IG1hdGNoIGEgcXVlcnkgdGhyb3VnaCB0aGVcbiAqIDxjb2RlPmZpbmQ8L2NvZGU+IG1ldGhvZC4gZm9yIGV4YW1wbGUsIHRoaXMgc2FtcGxlIGNvZGUgZmV0Y2hlcyBhbGwgb2JqZWN0c1xuICogb2YgY2xhc3MgPGNvZGU+bXljbGFzczwvY29kZT4uIGl0IGNhbGxzIGEgZGlmZmVyZW50IGZ1bmN0aW9uIGRlcGVuZGluZyBvblxuICogd2hldGhlciB0aGUgZmV0Y2ggc3VjY2VlZGVkIG9yIG5vdC5cbiAqXG4gKiA8cHJlPlxuICogdmFyIHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KG15Y2xhc3MpO1xuICogcXVlcnkuZmluZCgpLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAqICAgLy8gcmVzdWx0cyBpcyBhbiBhcnJheSBvZiBwYXJzZS5vYmplY3QuXG4gKiB9KS5jYXRjaCgoZXJyb3IpID0+ICB7XG4gKiAgLy8gZXJyb3IgaXMgYW4gaW5zdGFuY2Ugb2YgcGFyc2UuZXJyb3IuXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+YSBQYXJzZS5RdWVyeSBjYW4gYWxzbyBiZSB1c2VkIHRvIHJldHJpZXZlIGEgc2luZ2xlIG9iamVjdCB3aG9zZSBpZCBpc1xuICoga25vd24sIHRocm91Z2ggdGhlIGdldCBtZXRob2QuIGZvciBleGFtcGxlLCB0aGlzIHNhbXBsZSBjb2RlIGZldGNoZXMgYW5cbiAqIG9iamVjdCBvZiBjbGFzcyA8Y29kZT5teWNsYXNzPC9jb2RlPiBhbmQgaWQgPGNvZGU+bXlpZDwvY29kZT4uIGl0IGNhbGxzIGFcbiAqIGRpZmZlcmVudCBmdW5jdGlvbiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZmV0Y2ggc3VjY2VlZGVkIG9yIG5vdC5cbiAqXG4gKiA8cHJlPlxuICogdmFyIHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KG15Y2xhc3MpO1xuICogcXVlcnkuZ2V0KG15aWQpLnRoZW4oKG9iamVjdCkgPT4ge1xuICogICAgIC8vIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBwYXJzZS5vYmplY3QuXG4gKiB9KS5jYXRjaCgoZXJyb3IpID0+ICB7XG4gKiAgLy8gZXJyb3IgaXMgYW4gaW5zdGFuY2Ugb2YgcGFyc2UuZXJyb3IuXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+YSBQYXJzZS5RdWVyeSBjYW4gYWxzbyBiZSB1c2VkIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IG1hdGNoXG4gKiB0aGUgcXVlcnkgd2l0aG91dCByZXRyaWV2aW5nIGFsbCBvZiB0aG9zZSBvYmplY3RzLiBmb3IgZXhhbXBsZSwgdGhpc1xuICogc2FtcGxlIGNvZGUgY291bnRzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBvZiB0aGUgY2xhc3MgPGNvZGU+bXljbGFzczwvY29kZT5cbiAqIDxwcmU+XG4gKiB2YXIgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkobXljbGFzcyk7XG4gKiBxdWVyeS5jb3VudCgpLnRoZW4oKG51bWJlcikgPT4ge1xuICogICAgIC8vIHRoZXJlIGFyZSBudW1iZXIgaW5zdGFuY2VzIG9mIG15Y2xhc3MuXG4gKiB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAqICAgICAvLyBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiBQYXJzZS5FcnJvci5cbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuUXVlcnlcbiAqL1xuY2xhc3MgUGFyc2VRdWVyeSB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBQYXJzZS5PYmplY3QpfSBvYmplY3RDbGFzcyBBbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIFBhcnNlLk9iamVjdCwgb3IgYSBQYXJzZSBjbGFzc05hbWUgc3RyaW5nLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqZWN0Q2xhc3MpIHtcbiAgICAvKipcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gY2xhc3NOYW1lXG4gICAgICovXG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJjbGFzc05hbWVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl93aGVyZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3dhdGNoXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfaW5jbHVkZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2V4Y2x1ZGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9zZWxlY3RcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9saW1pdFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3NraXBcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9jb3VudFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX29yZGVyXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfcmVhZFByZWZlcmVuY2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9pbmNsdWRlUmVhZFByZWZlcmVuY2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfcXVlcmllc0xvY2FsRGF0YXN0b3JlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfbG9jYWxEYXRhc3RvcmVQaW5OYW1lXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfZXh0cmFPcHRpb25zXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfaGludFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2V4cGxhaW5cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl94aHJSZXF1ZXN0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfY29tbWVudFwiLCB2b2lkIDApO1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0Q2xhc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAob2JqZWN0Q2xhc3MgPT09ICdVc2VyJyAmJiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1BFUkZPUk1fVVNFUl9SRVdSSVRFJykpIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAnX1VzZXInO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBvYmplY3RDbGFzcztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9iamVjdENsYXNzIGluc3RhbmNlb2YgX1BhcnNlT2JqZWN0LmRlZmF1bHQpIHtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gb2JqZWN0Q2xhc3MuY2xhc3NOYW1lO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iamVjdENsYXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBvYmpDbGFzcyA9IG9iamVjdENsYXNzO1xuICAgICAgaWYgKHR5cGVvZiBvYmpDbGFzcy5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gb2JqQ2xhc3MuY2xhc3NOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb2JqID0gbmV3IG9iakNsYXNzKCk7XG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gb2JqLmNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBQYXJzZVF1ZXJ5IG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCBhIFBhcnNlT2JqZWN0IG9yIGNsYXNzIG5hbWUuJyk7XG4gICAgfVxuICAgIHRoaXMuX3doZXJlID0ge307XG4gICAgdGhpcy5fd2F0Y2ggPSBbXTtcbiAgICB0aGlzLl9pbmNsdWRlID0gW107XG4gICAgdGhpcy5fZXhjbHVkZSA9IFtdO1xuICAgIHRoaXMuX2NvdW50ID0gZmFsc2U7XG4gICAgdGhpcy5fbGltaXQgPSAtMTsgLy8gbmVnYXRpdmUgbGltaXQgaXMgbm90IHNlbnQgaW4gdGhlIHNlcnZlciByZXF1ZXN0XG4gICAgdGhpcy5fc2tpcCA9IDA7XG4gICAgdGhpcy5fcmVhZFByZWZlcmVuY2UgPSBudWxsO1xuICAgIHRoaXMuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IG51bGw7XG4gICAgdGhpcy5fc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IG51bGw7XG4gICAgdGhpcy5fcXVlcmllc0xvY2FsRGF0YXN0b3JlID0gZmFsc2U7XG4gICAgdGhpcy5fbG9jYWxEYXRhc3RvcmVQaW5OYW1lID0gbnVsbDtcbiAgICB0aGlzLl9leHRyYU9wdGlvbnMgPSB7fTtcbiAgICB0aGlzLl94aHJSZXF1ZXN0ID0ge1xuICAgICAgdGFzazogbnVsbCxcbiAgICAgIG9uY2hhbmdlOiAoKSA9PiB7fVxuICAgIH07XG4gICAgdGhpcy5fY29tbWVudCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjb25zdHJhaW50IHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcyBtYXRjaGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBxdWVyaWVzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgX29yUXVlcnkocXVlcmllcykge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9ICgwLCBfbWFwLmRlZmF1bHQpKHF1ZXJpZXMpLmNhbGwocXVlcmllcywgcSA9PiB7XG4gICAgICByZXR1cm4gcS50b0pTT04oKS53aGVyZTtcbiAgICB9KTtcbiAgICB0aGlzLl93aGVyZS4kb3IgPSBxdWVyeUpTT047XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjb25zdHJhaW50IHRoYXQgYWxsIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcyBtYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gcXVlcmllc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIF9hbmRRdWVyeShxdWVyaWVzKSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gKDAsIF9tYXAuZGVmYXVsdCkocXVlcmllcykuY2FsbChxdWVyaWVzLCBxID0+IHtcbiAgICAgIHJldHVybiBxLnRvSlNPTigpLndoZXJlO1xuICAgIH0pO1xuICAgIHRoaXMuX3doZXJlLiRhbmQgPSBxdWVyeUpTT047XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjb25zdHJhaW50IHRoYXQgbm9uZSBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMgbWF0Y2guXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHF1ZXJpZXNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBfbm9yUXVlcnkocXVlcmllcykge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9ICgwLCBfbWFwLmRlZmF1bHQpKHF1ZXJpZXMpLmNhbGwocXVlcmllcywgcSA9PiB7XG4gICAgICByZXR1cm4gcS50b0pTT04oKS53aGVyZTtcbiAgICB9KTtcbiAgICB0aGlzLl93aGVyZS4kbm9yID0gcXVlcnlKU09OO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmb3IgY29uZGl0aW9uIHF1ZXJpZXNcbiAgICpcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcGFyYW0gY29uZGl0aW9uXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9XG4gICAqL1xuICBfYWRkQ29uZGl0aW9uKGtleSwgY29uZGl0aW9uLCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy5fd2hlcmVba2V5XSB8fCB0eXBlb2YgdGhpcy5fd2hlcmVba2V5XSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3doZXJlW2tleV0gPSB7fTtcbiAgICB9XG4gICAgdGhpcy5fd2hlcmVba2V5XVtjb25kaXRpb25dID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkodmFsdWUsIGZhbHNlLCB0cnVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBzdHJpbmcgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBhdCB0aGUgYmVnaW5uaW5nXG4gICAqXG4gICAqIEBwYXJhbSBzdHJpbmdcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIF9yZWdleFN0YXJ0V2l0aChzdHJpbmcpIHtcbiAgICByZXR1cm4gJ14nICsgcXVvdGUoc3RyaW5nKTtcbiAgfVxuICBhc3luYyBfaGFuZGxlT2ZmbGluZVF1ZXJ5KHBhcmFtcykge1xuICAgIHZhciBfY29udGV4dDtcbiAgICBfT2ZmbGluZVF1ZXJ5LmRlZmF1bHQudmFsaWRhdGVRdWVyeSh0aGlzKTtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgY29uc3Qgb2JqZWN0cyA9IGF3YWl0IGxvY2FsRGF0YXN0b3JlLl9zZXJpYWxpemVPYmplY3RzRnJvbVBpbk5hbWUodGhpcy5fbG9jYWxEYXRhc3RvcmVQaW5OYW1lKTtcbiAgICBsZXQgcmVzdWx0cyA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKF9jb250ZXh0ID0gKDAsIF9tYXAuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCAoanNvbiwgaW5kZXgsIGFycikgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0ID0gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04oanNvbiwgZmFsc2UpO1xuICAgICAgaWYgKGpzb24uX2xvY2FsSWQgJiYgIWpzb24ub2JqZWN0SWQpIHtcbiAgICAgICAgb2JqZWN0Ll9sb2NhbElkID0ganNvbi5fbG9jYWxJZDtcbiAgICAgIH1cbiAgICAgIGlmICghX09mZmxpbmVRdWVyeS5kZWZhdWx0Lm1hdGNoZXNRdWVyeSh0aGlzLmNsYXNzTmFtZSwgb2JqZWN0LCBhcnIsIHRoaXMpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KSkuY2FsbChfY29udGV4dCwgb2JqZWN0ID0+IG9iamVjdCAhPT0gbnVsbCk7XG4gICAgaWYgKCgwLCBfa2V5czIuZGVmYXVsdCkocGFyYW1zKSkge1xuICAgICAgbGV0IGtleXMgPSAoMCwgX2tleXMyLmRlZmF1bHQpKHBhcmFtcykuc3BsaXQoJywnKTtcbiAgICAgIGtleXMgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIFsnY2xhc3NOYW1lJywgJ29iamVjdElkJywgJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnLCAnQUNMJ10pO1xuICAgICAgcmVzdWx0cyA9ICgwLCBfbWFwLmRlZmF1bHQpKHJlc3VsdHMpLmNhbGwocmVzdWx0cywgb2JqZWN0ID0+IHtcbiAgICAgICAgdmFyIF9jb250ZXh0MjtcbiAgICAgICAgY29uc3QganNvbiA9IG9iamVjdC5fdG9GdWxsSlNPTigpO1xuICAgICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQyID0gKDAsIF9rZXlzLmRlZmF1bHQpKGpzb24pKS5jYWxsKF9jb250ZXh0Miwga2V5ID0+IHtcbiAgICAgICAgICBpZiAoISgwLCBfaW5jbHVkZXMuZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkpKSB7XG4gICAgICAgICAgICBkZWxldGUganNvbltrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTihqc29uLCBmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5vcmRlcikge1xuICAgICAgY29uc3Qgc29ydHMgPSBwYXJhbXMub3JkZXIuc3BsaXQoJywnKTtcbiAgICAgICgwLCBfc29ydC5kZWZhdWx0KShyZXN1bHRzKS5jYWxsKHJlc3VsdHMsIChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiBoYW5kbGVPZmZsaW5lU29ydChhLCBiLCBzb3J0cyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgbGV0IGNvdW50OyAvLyBjb3VudCB0b3RhbCBiZWZvcmUgYXBwbHlpbmcgbGltaXQvc2tpcFxuICAgIGlmIChwYXJhbXMuY291bnQpIHtcbiAgICAgIGNvdW50ID0gcmVzdWx0cy5sZW5ndGg7IC8vIHRvdGFsIGNvdW50IGZyb20gcmVzcG9uc2VcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5za2lwKSB7XG4gICAgICBpZiAocGFyYW1zLnNraXAgPj0gcmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0cyA9ICgwLCBfc3BsaWNlLmRlZmF1bHQpKHJlc3VsdHMpLmNhbGwocmVzdWx0cywgcGFyYW1zLnNraXAsIHJlc3VsdHMubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGxpbWl0ID0gcmVzdWx0cy5sZW5ndGg7XG4gICAgaWYgKHBhcmFtcy5saW1pdCAhPT0gMCAmJiBwYXJhbXMubGltaXQgPCByZXN1bHRzLmxlbmd0aCkge1xuICAgICAgbGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuICAgIHJlc3VsdHMgPSAoMCwgX3NwbGljZS5kZWZhdWx0KShyZXN1bHRzKS5jYWxsKHJlc3VsdHMsIDAsIGxpbWl0KTtcbiAgICBpZiAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0cyxcbiAgICAgICAgY291bnRcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBxdWVyeS5cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICB3aGVyZTogdGhpcy5fd2hlcmVcbiAgICB9O1xuICAgIGlmICh0aGlzLl93YXRjaC5sZW5ndGgpIHtcbiAgICAgIHBhcmFtcy53YXRjaCA9IHRoaXMuX3dhdGNoLmpvaW4oJywnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGUubGVuZ3RoKSB7XG4gICAgICBwYXJhbXMuaW5jbHVkZSA9IHRoaXMuX2luY2x1ZGUuam9pbignLCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXhjbHVkZS5sZW5ndGgpIHtcbiAgICAgIHBhcmFtcy5leGNsdWRlS2V5cyA9IHRoaXMuX2V4Y2x1ZGUuam9pbignLCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2VsZWN0KSB7XG4gICAgICBwYXJhbXMua2V5cyA9IHRoaXMuX3NlbGVjdC5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb3VudCkge1xuICAgICAgcGFyYW1zLmNvdW50ID0gMTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbWl0ID49IDApIHtcbiAgICAgIHBhcmFtcy5saW1pdCA9IHRoaXMuX2xpbWl0O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2tpcCA+IDApIHtcbiAgICAgIHBhcmFtcy5za2lwID0gdGhpcy5fc2tpcDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29yZGVyKSB7XG4gICAgICBwYXJhbXMub3JkZXIgPSB0aGlzLl9vcmRlci5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZWFkUHJlZmVyZW5jZSkge1xuICAgICAgcGFyYW1zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5fcmVhZFByZWZlcmVuY2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pbmNsdWRlUmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHBhcmFtcy5pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSB0aGlzLl9pbmNsdWRlUmVhZFByZWZlcmVuY2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgICBwYXJhbXMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IHRoaXMuX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9oaW50KSB7XG4gICAgICBwYXJhbXMuaGludCA9IHRoaXMuX2hpbnQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9leHBsYWluKSB7XG4gICAgICBwYXJhbXMuZXhwbGFpbiA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb21tZW50KSB7XG4gICAgICBwYXJhbXMuY29tbWVudCA9IHRoaXMuX2NvbW1lbnQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX2V4dHJhT3B0aW9ucykge1xuICAgICAgcGFyYW1zW2tleV0gPSB0aGlzLl9leHRyYU9wdGlvbnNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBxdWVyeSB3aXRoIGNvbmRpdGlvbnMgZnJvbSBqc29uLCBjYW4gYmUgdXNlZnVsIHRvIHNlbmQgcXVlcnkgZnJvbSBzZXJ2ZXIgc2lkZSB0byBjbGllbnRcbiAgICogTm90IHN0YXRpYywgYWxsIHF1ZXJ5IGNvbmRpdGlvbnMgd2FzIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGJlIGRlbGV0ZWQuXG4gICAqIEZvciBleGFtcGxlIG9uIHRoZSBzZXJ2ZXIgc2lkZSB3ZSBoYXZlXG4gICAqIHZhciBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShcImNsYXNzTmFtZVwiKTtcbiAgICogcXVlcnkuZXF1YWxUbyhrZXk6IHZhbHVlKTtcbiAgICogcXVlcnkubGltaXQoMTAwKTtcbiAgICogLi4uIChvdGhlcnMgcXVlcmllcylcbiAgICogQ3JlYXRlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgUXVlcnkgT2JqZWN0XG4gICAqIHZhciBqc29uRnJvbVNlcnZlciA9IHF1ZXJ5LmZyb21KU09OKCk7XG4gICAqXG4gICAqIE9uIGNsaWVudCBzaWRlIGdldHRpbmcgcXVlcnk6XG4gICAqIHZhciBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShcImNsYXNzTmFtZVwiKTtcbiAgICogcXVlcnkuZnJvbUpTT04oanNvbkZyb21TZXJ2ZXIpO1xuICAgKlxuICAgKiBhbmQgY29udGludWUgdG8gcXVlcnkuLi5cbiAgICogcXVlcnkuc2tpcCgxMDApLmZpbmQoKS50aGVuKC4uLik7XG4gICAqXG4gICAqIEBwYXJhbSB7UXVlcnlKU09OfSBqc29uIGZyb20gUGFyc2UuUXVlcnkudG9KU09OKCkgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aEpTT04oanNvbikge1xuICAgIGlmIChqc29uLndoZXJlKSB7XG4gICAgICB0aGlzLl93aGVyZSA9IGpzb24ud2hlcmU7XG4gICAgfVxuICAgIGlmIChqc29uLndhdGNoKSB7XG4gICAgICB0aGlzLl93YXRjaCA9IGpzb24ud2F0Y2guc3BsaXQoJywnKTtcbiAgICB9XG4gICAgaWYgKGpzb24uaW5jbHVkZSkge1xuICAgICAgdGhpcy5faW5jbHVkZSA9IGpzb24uaW5jbHVkZS5zcGxpdCgnLCcpO1xuICAgIH1cbiAgICBpZiAoKDAsIF9rZXlzMi5kZWZhdWx0KShqc29uKSkge1xuICAgICAgdGhpcy5fc2VsZWN0ID0gKDAsIF9rZXlzMi5kZWZhdWx0KShqc29uKS5zcGxpdCgnLCcpO1xuICAgIH1cbiAgICBpZiAoanNvbi5leGNsdWRlS2V5cykge1xuICAgICAgdGhpcy5fZXhjbHVkZSA9IGpzb24uZXhjbHVkZUtleXMuc3BsaXQoJywnKTtcbiAgICB9XG4gICAgaWYgKGpzb24uY291bnQpIHtcbiAgICAgIHRoaXMuX2NvdW50ID0ganNvbi5jb3VudCA9PT0gMTtcbiAgICB9XG4gICAgaWYgKGpzb24ubGltaXQpIHtcbiAgICAgIHRoaXMuX2xpbWl0ID0ganNvbi5saW1pdDtcbiAgICB9XG4gICAgaWYgKGpzb24uc2tpcCkge1xuICAgICAgdGhpcy5fc2tpcCA9IGpzb24uc2tpcDtcbiAgICB9XG4gICAgaWYgKGpzb24ub3JkZXIpIHtcbiAgICAgIHRoaXMuX29yZGVyID0ganNvbi5vcmRlci5zcGxpdCgnLCcpO1xuICAgIH1cbiAgICBpZiAoanNvbi5yZWFkUHJlZmVyZW5jZSkge1xuICAgICAgdGhpcy5fcmVhZFByZWZlcmVuY2UgPSBqc29uLnJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAoanNvbi5pbmNsdWRlUmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHRoaXMuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IGpzb24uaW5jbHVkZVJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAoanNvbi5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgICB0aGlzLl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0ganNvbi5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAoanNvbi5oaW50KSB7XG4gICAgICB0aGlzLl9oaW50ID0ganNvbi5oaW50O1xuICAgIH1cbiAgICBpZiAoanNvbi5leHBsYWluKSB7XG4gICAgICB0aGlzLl9leHBsYWluID0gISFqc29uLmV4cGxhaW47XG4gICAgfVxuICAgIGlmIChqc29uLmNvbW1lbnQpIHtcbiAgICAgIHRoaXMuX2NvbW1lbnQgPSBqc29uLmNvbW1lbnQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGpzb24pIHtcbiAgICAgIGlmIChqc29uLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0MztcbiAgICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShfY29udGV4dDMgPSBbJ3doZXJlJywgJ2luY2x1ZGUnLCAna2V5cycsICdjb3VudCcsICdsaW1pdCcsICdza2lwJywgJ29yZGVyJywgJ3JlYWRQcmVmZXJlbmNlJywgJ2luY2x1ZGVSZWFkUHJlZmVyZW5jZScsICdzdWJxdWVyeVJlYWRQcmVmZXJlbmNlJywgJ2hpbnQnLCAnZXhwbGFpbicsICdjb21tZW50J10pLmNhbGwoX2NvbnRleHQzLCBrZXkpID09PSAtMSkge1xuICAgICAgICAgIHRoaXMuX2V4dHJhT3B0aW9uc1trZXldID0ganNvbltrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2QgdG8gcmVzdG9yZSBQYXJzZS5RdWVyeSBieSBqc29uIHJlcHJlc2VudGF0aW9uXG4gICAqIEludGVybmFsbHkgY2FsbGluZyBQYXJzZS5RdWVyeS53aXRoSlNPTlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG4gICAqIEBwYXJhbSB7UXVlcnlKU09OfSBqc29uIGZyb20gUGFyc2UuUXVlcnkudG9KU09OKCkgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gbmV3IGNyZWF0ZWQgcXVlcnlcbiAgICovXG4gIHN0YXRpYyBmcm9tSlNPTihjbGFzc05hbWUsIGpzb24pIHtcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIHF1ZXJ5LndpdGhKU09OKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBQYXJzZS5PYmplY3Qgd2hvc2UgaWQgaXMgYWxyZWFkeSBrbm93biBieSBmZXRjaGluZyBkYXRhIGZyb21cbiAgICogdGhlIHNlcnZlci4gVW5saWtlIHRoZSA8Y29kZT5maXJzdDwvY29kZT4gbWV0aG9kLCBpdCBuZXZlciByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdElkIFRoZSBpZCBvZiB0aGUgb2JqZWN0IHRvIGJlIGZldGNoZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZUZpbmRgIHRyaWdnZXIuXG4gICAqICAgPGxpPmpzb246IFJldHVybiByYXcganNvbiB3aXRob3V0IGNvbnZlcnRpbmcgdG8gUGFyc2UuT2JqZWN0XG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgZ2V0KG9iamVjdElkLCBvcHRpb25zKSB7XG4gICAgdGhpcy5lcXVhbFRvKCdvYmplY3RJZCcsIG9iamVjdElkKTtcbiAgICBjb25zdCBmaXJzdE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZmlyc3RPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZmlyc3RPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZpcnN0T3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KCdqc29uJykpIHtcbiAgICAgIGZpcnN0T3B0aW9ucy5qc29uID0gb3B0aW9ucy5qc29uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maXJzdChmaXJzdE9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yT2JqZWN0ID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PQkpFQ1RfTk9UX0ZPVU5ELCAnT2JqZWN0IG5vdCBmb3VuZC4nKTtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvck9iamVjdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBQYXJzZU9iamVjdHMgdGhhdCBzYXRpc2Z5IHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnNcbiAgICogYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZUZpbmRgIHRyaWdnZXIuXG4gICAqICAgPGxpPmpzb246IFJldHVybiByYXcganNvbiB3aXRob3V0IGNvbnZlcnRpbmcgdG8gUGFyc2UuT2JqZWN0XG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHRzIHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGZpbmQob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGZpbmRPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBmaW5kT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBmaW5kT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZmluZE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgdGhpcy5fc2V0UmVxdWVzdFRhc2soZmluZE9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRRdWVyeUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzZWxlY3QgPSB0aGlzLl9zZWxlY3Q7XG4gICAgaWYgKHRoaXMuX3F1ZXJpZXNMb2NhbERhdGFzdG9yZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZU9mZmxpbmVRdWVyeSh0aGlzLnRvSlNPTigpKTtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBfZmluZC5kZWZhdWx0KShjb250cm9sbGVyKS5jYWxsKGNvbnRyb2xsZXIsIHRoaXMuY2xhc3NOYW1lLCB0aGlzLnRvSlNPTigpLCBmaW5kT3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAvLyBSZXR1cm4gZ2VuZXJpYyBvYmplY3Qgd2hlbiBleHBsYWluIGlzIHVzZWRcbiAgICAgIGlmICh0aGlzLl9leHBsYWluKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHRzO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0cyA9IHJlc3BvbnNlLnJlc3VsdHM/Lm1hcChkYXRhID0+IHtcbiAgICAgICAgLy8gSW4gY2FzZXMgb2YgcmVsYXRpb25zLCB0aGUgc2VydmVyIG1heSBzZW5kIGJhY2sgYSBjbGFzc05hbWVcbiAgICAgICAgLy8gb24gdGhlIHRvcCBsZXZlbCBvZiB0aGUgcGF5bG9hZFxuICAgICAgICBjb25zdCBvdmVycmlkZSA9IHJlc3BvbnNlLmNsYXNzTmFtZSB8fCB0aGlzLmNsYXNzTmFtZTtcbiAgICAgICAgaWYgKCFkYXRhLmNsYXNzTmFtZSkge1xuICAgICAgICAgIGRhdGEuY2xhc3NOYW1lID0gb3ZlcnJpZGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5zIGtleXMgZm9yIGFsbCBvYmplY3RzIHRoYXRcbiAgICAgICAgLy8gaGF2ZSBiZWVuIHJlcXVlc3RlZCB3aXRoIGEgc2VsZWN0LCBzbyB0aGF0IG91ciBjYWNoZWQgc3RhdGVcbiAgICAgICAgLy8gdXBkYXRlcyBjb3JyZWN0bHkuXG4gICAgICAgIGlmIChzZWxlY3QpIHtcbiAgICAgICAgICBoYW5kbGVTZWxlY3RSZXN1bHQoZGF0YSwgc2VsZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKGRhdGEsICFzZWxlY3QpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNvdW50ID0gcmVzcG9uc2UuY291bnQ7XG4gICAgICBpZiAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc3VsdHMsXG4gICAgICAgICAgY291bnRcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIGNvbXBsZXRlIGxpc3Qgb2YgUGFyc2VPYmplY3RzIHRoYXQgc2F0aXNmeSB0aGlzIHF1ZXJ5LlxuICAgKiBVc2luZyBgZWFjaEJhdGNoYCB1bmRlciB0aGUgaG9vZCB0byBmZXRjaCBhbGwgdGhlIHZhbGlkIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+YmF0Y2hTaXplOiBIb3cgbWFueSBvYmplY3RzIHRvIHlpZWxkIGluIGVhY2ggYmF0Y2ggKGRlZmF1bHQ6IDEwMClcbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0cyB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBmaW5kQWxsKG9wdGlvbnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgYXdhaXQgdGhpcy5lYWNoQmF0Y2gob2JqZWN0cyA9PiB7XG4gICAgICByZXN1bHQgPSBbLi4ucmVzdWx0LCAuLi5vYmplY3RzXTtcbiAgICB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgdGhhdCBtYXRjaCB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnVzZU1hc3RlcktleV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNlc3Npb25Ub2tlbl1cbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSBjb3VudCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBjb3VudChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZmluZE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRSZXF1ZXN0VGFzayhmaW5kT3B0aW9ucyk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFF1ZXJ5Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMudG9KU09OKCk7XG4gICAgcGFyYW1zLmxpbWl0ID0gMDtcbiAgICBwYXJhbXMuY291bnQgPSAxO1xuICAgIHJldHVybiAoMCwgX2ZpbmQuZGVmYXVsdCkoY29udHJvbGxlcikuY2FsbChjb250cm9sbGVyLCB0aGlzLmNsYXNzTmFtZSwgcGFyYW1zLCBmaW5kT3B0aW9ucykudGhlbihyZXN1bHQgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VsdC5jb3VudDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGRpc3RpbmN0IHF1ZXJ5IGFuZCByZXR1cm5zIHVuaXF1ZSB2YWx1ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBBIGZpZWxkIHRvIGZpbmQgZGlzdGluY3QgdmFsdWVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zZXNzaW9uVG9rZW5dIEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvbiBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgZGlzdGluY3Qoa2V5LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZGlzdGluY3RPcHRpb25zID0ge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGRpc3RpbmN0T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgdGhpcy5fc2V0UmVxdWVzdFRhc2soZGlzdGluY3RPcHRpb25zKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UXVlcnlDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgZGlzdGluY3Q6IGtleSxcbiAgICAgIHdoZXJlOiB0aGlzLl93aGVyZSxcbiAgICAgIGhpbnQ6IHRoaXMuX2hpbnRcbiAgICB9O1xuICAgIHJldHVybiBjb250cm9sbGVyLmFnZ3JlZ2F0ZSh0aGlzLmNsYXNzTmFtZSwgcGFyYW1zLCBkaXN0aW5jdE9wdGlvbnMpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFuIGFnZ3JlZ2F0ZSBxdWVyeSBhbmQgcmV0dXJucyBhZ2dyZWdhdGUgcmVzdWx0c1xuICAgKlxuICAgKiBAcGFyYW0geyhBcnJheXxvYmplY3QpfSBwaXBlbGluZSBBcnJheSBvciBPYmplY3Qgb2Ygc3RhZ2VzIHRvIHByb2Nlc3MgcXVlcnlcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNlc3Npb25Ub2tlbl0gQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBhZ2dyZWdhdGUocGlwZWxpbmUsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBhZ2dyZWdhdGVPcHRpb25zID0ge1xuICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGFnZ3JlZ2F0ZU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIHRoaXMuX3NldFJlcXVlc3RUYXNrKGFnZ3JlZ2F0ZU9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRRdWVyeUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KShwaXBlbGluZSkgJiYgdHlwZW9mIHBpcGVsaW5lICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBpcGVsaW5lIG11c3QgYmUgQXJyYXkgb3IgT2JqZWN0Jyk7XG4gICAgfVxuICAgIGlmICgoMCwgX2tleXMuZGVmYXVsdCkodGhpcy5fd2hlcmUgfHwge30pLmxlbmd0aCkge1xuICAgICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkocGlwZWxpbmUpKSB7XG4gICAgICAgIHBpcGVsaW5lID0gW3BpcGVsaW5lXTtcbiAgICAgIH1cbiAgICAgIHBpcGVsaW5lLnVuc2hpZnQoe1xuICAgICAgICAkbWF0Y2g6IHRoaXMuX3doZXJlXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgcGlwZWxpbmUsXG4gICAgICBoaW50OiB0aGlzLl9oaW50LFxuICAgICAgZXhwbGFpbjogdGhpcy5fZXhwbGFpbixcbiAgICAgIHJlYWRQcmVmZXJlbmNlOiB0aGlzLl9yZWFkUHJlZmVyZW5jZVxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuYWdncmVnYXRlKHRoaXMuY2xhc3NOYW1lLCBwYXJhbXMsIGFnZ3JlZ2F0ZU9wdGlvbnMpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhdCBtb3N0IG9uZSBQYXJzZS5PYmplY3QgdGhhdCBzYXRpc2ZpZXMgdGhpcyBxdWVyeS5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgb2JqZWN0IGlmIHRoZXJlIGlzIG9uZSwgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRmluZGAgdHJpZ2dlci5cbiAgICogICA8bGk+anNvbjogUmV0dXJuIHJhdyBqc29uIHdpdGhvdXQgY29udmVydGluZyB0byBQYXJzZS5PYmplY3RcbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIG9iamVjdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBmaXJzdCgpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY29uc3QgZmluZE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBmaW5kT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICB0aGlzLl9zZXRSZXF1ZXN0VGFzayhmaW5kT3B0aW9ucyk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFF1ZXJ5Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMudG9KU09OKCk7XG4gICAgcGFyYW1zLmxpbWl0ID0gMTtcbiAgICBjb25zdCBzZWxlY3QgPSB0aGlzLl9zZWxlY3Q7XG4gICAgaWYgKHRoaXMuX3F1ZXJpZXNMb2NhbERhdGFzdG9yZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZU9mZmxpbmVRdWVyeShwYXJhbXMpLnRoZW4ob2JqZWN0cyA9PiB7XG4gICAgICAgIGlmICghb2JqZWN0c1swXSkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdHNbMF07XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBfZmluZC5kZWZhdWx0KShjb250cm9sbGVyKS5jYWxsKGNvbnRyb2xsZXIsIHRoaXMuY2xhc3NOYW1lLCBwYXJhbXMsIGZpbmRPcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdHMgPSByZXNwb25zZS5yZXN1bHRzO1xuICAgICAgaWYgKCFvYmplY3RzWzBdKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoIW9iamVjdHNbMF0uY2xhc3NOYW1lKSB7XG4gICAgICAgIG9iamVjdHNbMF0uY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGF0YSBvYmplY3QgY29udGFpbnMga2V5cyBmb3IgYWxsIG9iamVjdHMgdGhhdFxuICAgICAgLy8gaGF2ZSBiZWVuIHJlcXVlc3RlZCB3aXRoIGEgc2VsZWN0LCBzbyB0aGF0IG91ciBjYWNoZWQgc3RhdGVcbiAgICAgIC8vIHVwZGF0ZXMgY29ycmVjdGx5LlxuICAgICAgaWYgKHNlbGVjdCkge1xuICAgICAgICBoYW5kbGVTZWxlY3RSZXN1bHQob2JqZWN0c1swXSwgc2VsZWN0KTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdHNbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04ob2JqZWN0c1swXSwgIXNlbGVjdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciBvYmplY3RzIG1hdGNoaW5nIGEgcXVlcnksIGNhbGxpbmcgYSBjYWxsYmFjayBmb3IgZWFjaCBiYXRjaC5cbiAgICogSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSBwcm9taXNlLCB0aGUgaXRlcmF0aW9uIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsXG4gICAqIHRoYXQgcHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcmVqZWN0ZWRcbiAgICogcHJvbWlzZSwgdGhlbiBpdGVyYXRpb24gd2lsbCBzdG9wIHdpdGggdGhhdCBlcnJvci4gVGhlIGl0ZW1zIGFyZSBwcm9jZXNzZWRcbiAgICogaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIuIFRoZSBxdWVyeSBtYXkgbm90IGhhdmUgYW55IHNvcnQgb3JkZXIsIGFuZCBtYXlcbiAgICogbm90IHVzZSBsaW1pdCBvciBza2lwLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggZWFjaCByZXN1bHRcbiAgICogICAgIG9mIHRoZSBxdWVyeS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT5iYXRjaFNpemU6IEhvdyBtYW55IG9iamVjdHMgdG8geWllbGQgaW4gZWFjaCBiYXRjaCAoZGVmYXVsdDogMTAwKVxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRmluZGAgdHJpZ2dlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlXG4gICAqICAgICBpdGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIGVhY2hCYXRjaChjYWxsYmFjaywgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmICh0aGlzLl9vcmRlciB8fCB0aGlzLl9za2lwIHx8IHRoaXMuX2xpbWl0ID49IDApIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnQ2Fubm90IGl0ZXJhdGUgb24gYSBxdWVyeSB3aXRoIHNvcnQsIHNraXAsIG9yIGxpbWl0LicpO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KHRoaXMuY2xhc3NOYW1lKTtcbiAgICBxdWVyeS5fbGltaXQgPSBvcHRpb25zLmJhdGNoU2l6ZSB8fCAxMDA7XG4gICAgcXVlcnkuX2luY2x1ZGUgPSBbLi4udGhpcy5faW5jbHVkZV07XG4gICAgcXVlcnkuX2V4Y2x1ZGUgPSBbLi4udGhpcy5fZXhjbHVkZV07XG4gICAgaWYgKHRoaXMuX3NlbGVjdCkge1xuICAgICAgcXVlcnkuX3NlbGVjdCA9IFsuLi50aGlzLl9zZWxlY3RdO1xuICAgIH1cbiAgICBxdWVyeS5faGludCA9IHRoaXMuX2hpbnQ7XG4gICAgcXVlcnkuX3doZXJlID0ge307XG4gICAgZm9yIChjb25zdCBhdHRyIGluIHRoaXMuX3doZXJlKSB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLl93aGVyZVthdHRyXTtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsKSkge1xuICAgICAgICBxdWVyeS5fd2hlcmVbYXR0cl0gPSAoMCwgX21hcC5kZWZhdWx0KSh2YWwpLmNhbGwodmFsLCB2ID0+IHtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBjb25kaXRpb25NYXAgPSB7fTtcbiAgICAgICAgcXVlcnkuX3doZXJlW2F0dHJdID0gY29uZGl0aW9uTWFwO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmQgaW4gdmFsKSB7XG4gICAgICAgICAgY29uZGl0aW9uTWFwW2NvbmRdID0gdmFsW2NvbmRdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS5fd2hlcmVbYXR0cl0gPSB2YWw7XG4gICAgICB9XG4gICAgfVxuICAgIHF1ZXJ5LmFzY2VuZGluZygnb2JqZWN0SWQnKTtcbiAgICBjb25zdCBmaW5kT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZmluZE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZmluZE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZpbmRPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdqc29uJykpIHtcbiAgICAgIGZpbmRPcHRpb25zLmpzb24gPSBvcHRpb25zLmpzb247XG4gICAgfVxuICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICAgIGxldCBwcmV2aW91c1Jlc3VsdHMgPSBbXTtcbiAgICByZXR1cm4gKDAsIF9wcm9taXNlVXRpbHMuY29udGludWVXaGlsZSkoKCkgPT4ge1xuICAgICAgcmV0dXJuICFmaW5pc2hlZDtcbiAgICB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBbcmVzdWx0c10gPSBhd2FpdCBfcHJvbWlzZS5kZWZhdWx0LmFsbChbKDAsIF9maW5kLmRlZmF1bHQpKHF1ZXJ5KS5jYWxsKHF1ZXJ5LCBmaW5kT3B0aW9ucyksIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShwcmV2aW91c1Jlc3VsdHMubGVuZ3RoID4gMCAmJiBjYWxsYmFjayhwcmV2aW91c1Jlc3VsdHMpKV0pO1xuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID49IHF1ZXJ5Ll9saW1pdCkge1xuICAgICAgICBxdWVyeS5ncmVhdGVyVGhhbignb2JqZWN0SWQnLCByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uaWQpO1xuICAgICAgICBwcmV2aW91c1Jlc3VsdHMgPSByZXN1bHRzO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNhbGxiYWNrKHJlc3VsdHMpKTtcbiAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgZWFjaCByZXN1bHQgb2YgYSBxdWVyeSwgY2FsbGluZyBhIGNhbGxiYWNrIGZvciBlYWNoIG9uZS4gSWZcbiAgICogdGhlIGNhbGxiYWNrIHJldHVybnMgYSBwcm9taXNlLCB0aGUgaXRlcmF0aW9uIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsXG4gICAqIHRoYXQgcHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcmVqZWN0ZWRcbiAgICogcHJvbWlzZSwgdGhlbiBpdGVyYXRpb24gd2lsbCBzdG9wIHdpdGggdGhhdCBlcnJvci4gVGhlIGl0ZW1zIGFyZVxuICAgKiBwcm9jZXNzZWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIuIFRoZSBxdWVyeSBtYXkgbm90IGhhdmUgYW55IHNvcnQgb3JkZXIsXG4gICAqIGFuZCBtYXkgbm90IHVzZSBsaW1pdCBvciBza2lwLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggZWFjaCByZXN1bHRcbiAgICogICAgIG9mIHRoZSBxdWVyeS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmpzb246IFJldHVybiByYXcganNvbiB3aXRob3V0IGNvbnZlcnRpbmcgdG8gUGFyc2UuT2JqZWN0XG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZVxuICAgKiAgICAgaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBlYWNoKGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaEJhdGNoKHJlc3VsdHMgPT4ge1xuICAgICAgbGV0IGNhbGxiYWNrc0RvbmUgPSBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShyZXN1bHRzKS5jYWxsKHJlc3VsdHMsIHJlc3VsdCA9PiB7XG4gICAgICAgIGNhbGxiYWNrc0RvbmUgPSBjYWxsYmFja3NEb25lLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrc0RvbmU7XG4gICAgfSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGhpbnQgdG8gZm9yY2UgaW5kZXggc2VsZWN0aW9uLiAoaHR0cHM6Ly9kb2NzLm1vbmdvZGIuY29tL21hbnVhbC9yZWZlcmVuY2Uvb3BlcmF0b3IvbWV0YS9oaW50LylcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdCl9IHZhbHVlIFN0cmluZyBvciBPYmplY3Qgb2YgaW5kZXggdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIGV4ZWN1dGluZyBxdWVyeVxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGhpbnQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgZGVsZXRlIHRoaXMuX2hpbnQ7XG4gICAgfVxuICAgIHRoaXMuX2hpbnQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZlc3RpZ2F0ZXMgdGhlIHF1ZXJ5IGV4ZWN1dGlvbiBwbGFuLiBVc2VmdWwgZm9yIG9wdGltaXppbmcgcXVlcmllcy4gKGh0dHBzOi8vZG9jcy5tb25nb2RiLmNvbS9tYW51YWwvcmVmZXJlbmNlL29wZXJhdG9yL21ldGEvZXhwbGFpbi8pXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXhwbGFpbiBVc2VkIHRvIHRvZ2dsZSB0aGUgaW5mb3JtYXRpb24gb24gdGhlIHF1ZXJ5IHBsYW4uXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZXhwbGFpbigpIHtcbiAgICBsZXQgZXhwbGFpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGV4cGxhaW4gIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2FuIG9ubHkgc2V0IGV4cGxhaW4gdG8gYSBib29sZWFuIHZhbHVlJyk7XG4gICAgfVxuICAgIHRoaXMuX2V4cGxhaW4gPSBleHBsYWluO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgZWFjaCByZXN1bHQgb2YgYSBxdWVyeSwgY2FsbGluZyBhIGNhbGxiYWNrIGZvciBlYWNoIG9uZS4gSWZcbiAgICogdGhlIGNhbGxiYWNrIHJldHVybnMgYSBwcm9taXNlLCB0aGUgaXRlcmF0aW9uIHdpbGwgbm90IGNvbnRpbnVlIHVudGlsXG4gICAqIHRoYXQgcHJvbWlzZSBoYXMgYmVlbiBmdWxmaWxsZWQuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcmVqZWN0ZWRcbiAgICogcHJvbWlzZSwgdGhlbiBpdGVyYXRpb24gd2lsbCBzdG9wIHdpdGggdGhhdCBlcnJvci4gVGhlIGl0ZW1zIGFyZVxuICAgKiBwcm9jZXNzZWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIuIFRoZSBxdWVyeSBtYXkgbm90IGhhdmUgYW55IHNvcnQgb3JkZXIsXG4gICAqIGFuZCBtYXkgbm90IHVzZSBsaW1pdCBvciBza2lwLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayA8dWw+XG4gICAqICAgPGxpPmN1cnJlbnRPYmplY3Q6IFRoZSBjdXJyZW50IFBhcnNlLk9iamVjdCBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIGFycmF5LjwvbGk+XG4gICAqICAgPGxpPmluZGV4OiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgUGFyc2UuT2JqZWN0IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgYXJyYXkuPC9saT5cbiAgICogICA8bGk+cXVlcnk6IFRoZSBxdWVyeSBtYXAgd2FzIGNhbGxlZCB1cG9uLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgb25jZSB0aGVcbiAgICogICAgIGl0ZXJhdGlvbiBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgYXN5bmMgbWFwKGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGF3YWl0IHRoaXMuZWFjaChvYmplY3QgPT4ge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjYWxsYmFjayhvYmplY3QsIGluZGV4LCB0aGlzKSkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBhcnJheS5wdXNoKHJlc3VsdCk7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9KTtcbiAgICB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciBlYWNoIHJlc3VsdCBvZiBhIHF1ZXJ5LCBjYWxsaW5nIGEgY2FsbGJhY2sgZm9yIGVhY2ggb25lLiBJZlxuICAgKiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHByb21pc2UsIHRoZSBpdGVyYXRpb24gd2lsbCBub3QgY29udGludWUgdW50aWxcbiAgICogdGhhdCBwcm9taXNlIGhhcyBiZWVuIGZ1bGZpbGxlZC4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSByZWplY3RlZFxuICAgKiBwcm9taXNlLCB0aGVuIGl0ZXJhdGlvbiB3aWxsIHN0b3Agd2l0aCB0aGF0IGVycm9yLiBUaGUgaXRlbXMgYXJlXG4gICAqIHByb2Nlc3NlZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlci4gVGhlIHF1ZXJ5IG1heSBub3QgaGF2ZSBhbnkgc29ydCBvcmRlcixcbiAgICogYW5kIG1heSBub3QgdXNlIGxpbWl0IG9yIHNraXAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIDx1bD5cbiAgICogICA8bGk+YWNjdW11bGF0b3I6IFRoZSBhY2N1bXVsYXRvciBhY2N1bXVsYXRlcyB0aGUgY2FsbGJhY2sncyByZXR1cm4gdmFsdWVzLiBJdCBpcyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUgcHJldmlvdXNseSByZXR1cm5lZCBpbiB0aGUgbGFzdCBpbnZvY2F0aW9uIG9mIHRoZSBjYWxsYmFjay48L2xpPlxuICAgKiAgIDxsaT5jdXJyZW50T2JqZWN0OiBUaGUgY3VycmVudCBQYXJzZS5PYmplY3QgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBhcnJheS48L2xpPlxuICAgKiAgIDxsaT5pbmRleDogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IFBhcnNlLk9iamVjdCBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIGFycmF5LjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7Kn0gaW5pdGlhbFZhbHVlIEEgdmFsdWUgdG8gdXNlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZmlyc3QgY2FsbCBvZiB0aGUgY2FsbGJhY2suIElmIG5vIGluaXRpYWxWYWx1ZSBpcyBzdXBwbGllZCwgdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgcXVlcnkgd2lsbCBiZSB1c2VkIGFuZCBza2lwcGVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlXG4gICAqICAgICBpdGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIGFzeW5jIHJlZHVjZShjYWxsYmFjaywgaW5pdGlhbFZhbHVlLCBvcHRpb25zKSB7XG4gICAgbGV0IGFjY3VtdWxhdG9yID0gaW5pdGlhbFZhbHVlO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgYXdhaXQgdGhpcy5lYWNoKG9iamVjdCA9PiB7XG4gICAgICAvLyBJZiBubyBpbml0aWFsIHZhbHVlIHdhcyBnaXZlbiwgd2UgdGFrZSB0aGUgZmlyc3Qgb2JqZWN0IGZyb20gdGhlIHF1ZXJ5XG4gICAgICAvLyBhcyB0aGUgaW5pdGlhbCB2YWx1ZSBhbmQgZG9uJ3QgY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBpdC5cbiAgICAgIGlmIChpbmRleCA9PT0gMCAmJiBpbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2N1bXVsYXRvciA9IG9iamVjdDtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjYWxsYmFjayhhY2N1bXVsYXRvciwgb2JqZWN0LCBpbmRleCkpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgYWNjdW11bGF0b3IgPSByZXN1bHQ7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9KTtcbiAgICB9LCBvcHRpb25zKTtcbiAgICBpZiAoaW5kZXggPT09IDAgJiYgaW5pdGlhbFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE1hdGNoIEFycmF5LnJlZHVjZSBiZWhhdmlvcjogXCJDYWxsaW5nIHJlZHVjZSgpIG9uIGFuIGVtcHR5IGFycmF5XG4gICAgICAvLyB3aXRob3V0IGFuIGluaXRpYWxWYWx1ZSB3aWxsIHRocm93IGEgVHlwZUVycm9yXCIuXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWR1Y2luZyBlbXB0eSBxdWVyeSByZXN1bHQgc2V0IHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciBlYWNoIHJlc3VsdCBvZiBhIHF1ZXJ5LCBjYWxsaW5nIGEgY2FsbGJhY2sgZm9yIGVhY2ggb25lLiBJZlxuICAgKiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHByb21pc2UsIHRoZSBpdGVyYXRpb24gd2lsbCBub3QgY29udGludWUgdW50aWxcbiAgICogdGhhdCBwcm9taXNlIGhhcyBiZWVuIGZ1bGZpbGxlZC4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSByZWplY3RlZFxuICAgKiBwcm9taXNlLCB0aGVuIGl0ZXJhdGlvbiB3aWxsIHN0b3Agd2l0aCB0aGF0IGVycm9yLiBUaGUgaXRlbXMgYXJlXG4gICAqIHByb2Nlc3NlZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlci4gVGhlIHF1ZXJ5IG1heSBub3QgaGF2ZSBhbnkgc29ydCBvcmRlcixcbiAgICogYW5kIG1heSBub3QgdXNlIGxpbWl0IG9yIHNraXAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIDx1bD5cbiAgICogICA8bGk+Y3VycmVudE9iamVjdDogVGhlIGN1cnJlbnQgUGFyc2UuT2JqZWN0IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgYXJyYXkuPC9saT5cbiAgICogICA8bGk+aW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBQYXJzZS5PYmplY3QgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBhcnJheS48L2xpPlxuICAgKiAgIDxsaT5xdWVyeTogVGhlIHF1ZXJ5IGZpbHRlciB3YXMgY2FsbGVkIHVwb24uPC9saT5cbiAgICogPC91bD5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZVxuICAgKiAgICAgaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBhc3luYyBmaWx0ZXIoY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBjb25zdCBhcnJheSA9IFtdO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgYXdhaXQgdGhpcy5lYWNoKG9iamVjdCA9PiB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNhbGxiYWNrKG9iamVjdCwgaW5kZXgsIHRoaXMpKS50aGVuKGZsYWcgPT4ge1xuICAgICAgICBpZiAoZmxhZykge1xuICAgICAgICAgIGFycmF5LnB1c2gob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfSk7XG4gICAgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyogUXVlcnkgQ29uZGl0aW9ucyAqL1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCB0aGUgUGFyc2UuT2JqZWN0IG11c3QgY29udGFpbi5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBlcXVhbFRvKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5ICYmIHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX2NvbnRleHQ0O1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NCA9ICgwLCBfZW50cmllcy5kZWZhdWx0KShrZXkpKS5jYWxsKF9jb250ZXh0NCwgX3JlZiA9PiB7XG4gICAgICAgIGxldCBbaywgdmFsXSA9IF9yZWY7XG4gICAgICAgIHJldHVybiB0aGlzLmVxdWFsVG8oaywgdmFsKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb2VzTm90RXhpc3Qoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5fd2hlcmVba2V5XSA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHZhbHVlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIG5vdCBlcXVhbCB0byB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IG11c3Qgbm90IGJlIGVxdWFsbGVkLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIG5vdEVxdWFsVG8oa2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgJiYgdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBfY29udGV4dDU7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ1ID0gKDAsIF9lbnRyaWVzLmRlZmF1bHQpKGtleSkpLmNhbGwoX2NvbnRleHQ1LCBfcmVmMiA9PiB7XG4gICAgICAgIGxldCBbaywgdmFsXSA9IF9yZWYyO1xuICAgICAgICByZXR1cm4gdGhpcy5ub3RFcXVhbFRvKGssIHZhbCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRuZScsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgbGVzcyB0aGFuIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgcHJvdmlkZXMgYW4gdXBwZXIgYm91bmQuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbGVzc1RoYW4oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGx0JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBncmVhdGVyIHRoYW4gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCBwcm92aWRlcyBhbiBsb3dlciBib3VuZC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBncmVhdGVyVGhhbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZ3QnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHByb3ZpZGVzIGFuIHVwcGVyIGJvdW5kLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGxlc3NUaGFuT3JFcXVhbFRvKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRsdGUnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCBwcm92aWRlcyBhbiBsb3dlciBib3VuZC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBncmVhdGVyVGhhbk9yRXF1YWxUbyhrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZ3RlJywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBjb250YWluZWQgaW4gdGhlIHByb3ZpZGVkIGxpc3Qgb2YgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB7QXJyYXk8Kj59IHZhbHVlIFRoZSB2YWx1ZXMgdGhhdCB3aWxsIG1hdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNvbnRhaW5lZEluKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRpbicsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogbm90IGJlIGNvbnRhaW5lZCBpbiB0aGUgcHJvdmlkZWQgbGlzdCBvZiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHtBcnJheTwqPn0gdmFsdWUgVGhlIHZhbHVlcyB0aGF0IHdpbGwgbm90IG1hdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIG5vdENvbnRhaW5lZEluKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRuaW4nLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGNvbnRhaW5lZCBieSB0aGUgcHJvdmlkZWQgbGlzdCBvZiB2YWx1ZXMuIEdldCBvYmplY3RzIHdoZXJlIGFsbCBhcnJheSBlbGVtZW50cyBtYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0aGF0IHdpbGwgbWF0Y2guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgY29udGFpbmVkQnkoa2V5LCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRjb250YWluZWRCeScsIHZhbHVlcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGNvbnRhaW4gZWFjaCBvbmUgb2YgdGhlIHByb3ZpZGVkIGxpc3Qgb2YgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suICBUaGlzIGtleSdzIHZhbHVlIG11c3QgYmUgYW4gYXJyYXkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRoYXQgd2lsbCBtYXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjb250YWluc0FsbChrZXksIHZhbHVlcykge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGFsbCcsIHZhbHVlcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGNvbnRhaW4gZWFjaCBvbmUgb2YgdGhlIHByb3ZpZGVkIGxpc3Qgb2YgdmFsdWVzIHN0YXJ0aW5nIHdpdGggZ2l2ZW4gc3RyaW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLiAgVGhpcyBrZXkncyB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5LlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHZhbHVlcyBUaGUgc3RyaW5nIHZhbHVlcyB0aGF0IHdpbGwgbWF0Y2ggYXMgc3RhcnRpbmcgc3RyaW5nLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNvbnRhaW5zQWxsU3RhcnRpbmdXaXRoKGtleSwgdmFsdWVzKSB7XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWVzKSkge1xuICAgICAgdmFsdWVzID0gW3ZhbHVlc107XG4gICAgfVxuICAgIGNvbnN0IHJlZ2V4T2JqZWN0ID0gKDAsIF9tYXAuZGVmYXVsdCkodmFsdWVzKS5jYWxsKHZhbHVlcywgdmFsdWUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJHJlZ2V4OiB0aGlzLl9yZWdleFN0YXJ0V2l0aCh2YWx1ZSlcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbnNBbGwoa2V5LCByZWdleE9iamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgb2JqZWN0cyB0aGF0IGNvbnRhaW4gdGhlIGdpdmVuIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgc2hvdWxkIGV4aXN0LlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGV4aXN0cyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRleGlzdHMnLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCBmb3IgZmluZGluZyBvYmplY3RzIHRoYXQgZG8gbm90IGNvbnRhaW4gYSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHNob3VsZCBub3QgZXhpc3RcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBkb2VzTm90RXhpc3Qoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZXhpc3RzJywgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZWd1bGFyIGV4cHJlc3Npb24gY29uc3RyYWludCBmb3IgZmluZGluZyBzdHJpbmcgdmFsdWVzIHRoYXQgbWF0Y2hcbiAgICogdGhlIHByb3ZpZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICogVGhpcyBtYXkgYmUgc2xvdyBmb3IgbGFyZ2UgZGF0YXNldHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge1JlZ0V4cCB8IHN0cmluZ30gcmVnZXggVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kaWZpZXJzIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbW9kZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBtYXRjaGVzKGtleSwgcmVnZXgsIG1vZGlmaWVycykge1xuICAgIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckcmVnZXgnLCByZWdleCk7XG4gICAgaWYgKCFtb2RpZmllcnMpIHtcbiAgICAgIG1vZGlmaWVycyA9ICcnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZ2V4ICE9PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHJlZ2V4Lmlnbm9yZUNhc2UpIHtcbiAgICAgICAgbW9kaWZpZXJzICs9ICdpJztcbiAgICAgIH1cbiAgICAgIGlmIChyZWdleC5tdWx0aWxpbmUpIHtcbiAgICAgICAgbW9kaWZpZXJzICs9ICdtJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vZGlmaWVycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckb3B0aW9ucycsIG1vZGlmaWVycyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRoYXQgcmVxdWlyZXMgdGhhdCBhIGtleSdzIHZhbHVlIG1hdGNoZXMgYSBQYXJzZS5RdWVyeVxuICAgKiBjb25zdHJhaW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgY29udGFpbnMgdGhlIG9iamVjdCB0byBtYXRjaCB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICBxdWVyeS5cbiAgICogQHBhcmFtIHtQYXJzZS5RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IHRoYXQgc2hvdWxkIG1hdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIG1hdGNoZXNRdWVyeShrZXksIHF1ZXJ5KSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gcXVlcnkudG9KU09OKCk7XG4gICAgcXVlcnlKU09OLmNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRpblF1ZXJ5JywgcXVlcnlKU09OKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0aGF0IHJlcXVpcmVzIHRoYXQgYSBrZXkncyB2YWx1ZSBub3QgbWF0Y2hlcyBhXG4gICAqIFBhcnNlLlF1ZXJ5IGNvbnN0cmFpbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBjb250YWlucyB0aGUgb2JqZWN0IHRvIG1hdGNoIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge1BhcnNlLlF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgdGhhdCBzaG91bGQgbm90IG1hdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGRvZXNOb3RNYXRjaFF1ZXJ5KGtleSwgcXVlcnkpIHtcbiAgICBjb25zdCBxdWVyeUpTT04gPSBxdWVyeS50b0pTT04oKTtcbiAgICBxdWVyeUpTT04uY2xhc3NOYW1lID0gcXVlcnkuY2xhc3NOYW1lO1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJG5vdEluUXVlcnknLCBxdWVyeUpTT04pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRoYXQgcmVxdWlyZXMgdGhhdCBhIGtleSdzIHZhbHVlIG1hdGNoZXMgYSB2YWx1ZSBpblxuICAgKiBhbiBvYmplY3QgcmV0dXJuZWQgYnkgYSBkaWZmZXJlbnQgUGFyc2UuUXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZSB0aGF0IGlzIGJlaW5nXG4gICAqICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5S2V5IFRoZSBrZXkgaW4gdGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5IHRvXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0ge1BhcnNlLlF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgdG8gcnVuLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIG1hdGNoZXNLZXlJblF1ZXJ5KGtleSwgcXVlcnlLZXksIHF1ZXJ5KSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gcXVlcnkudG9KU09OKCk7XG4gICAgcXVlcnlKU09OLmNsYXNzTmFtZSA9IHF1ZXJ5LmNsYXNzTmFtZTtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRzZWxlY3QnLCB7XG4gICAgICBrZXk6IHF1ZXJ5S2V5LFxuICAgICAgcXVlcnk6IHF1ZXJ5SlNPTlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRoYXQgcmVxdWlyZXMgdGhhdCBhIGtleSdzIHZhbHVlIG5vdCBtYXRjaCBhIHZhbHVlIGluXG4gICAqIGFuIG9iamVjdCByZXR1cm5lZCBieSBhIGRpZmZlcmVudCBQYXJzZS5RdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIHRoYXQgaXMgYmVpbmdcbiAgICogICAgICAgICAgICAgICAgICAgICBleGNsdWRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5S2V5IFRoZSBrZXkgaW4gdGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIHF1ZXJ5IHRvXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBhZ2FpbnN0LlxuICAgKiBAcGFyYW0ge1BhcnNlLlF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgdG8gcnVuLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGRvZXNOb3RNYXRjaEtleUluUXVlcnkoa2V5LCBxdWVyeUtleSwgcXVlcnkpIHtcbiAgICBjb25zdCBxdWVyeUpTT04gPSBxdWVyeS50b0pTT04oKTtcbiAgICBxdWVyeUpTT04uY2xhc3NOYW1lID0gcXVlcnkuY2xhc3NOYW1lO1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGRvbnRTZWxlY3QnLCB7XG4gICAgICBrZXk6IHF1ZXJ5S2V5LFxuICAgICAgcXVlcnk6IHF1ZXJ5SlNPTlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IGZvciBmaW5kaW5nIHN0cmluZyB2YWx1ZXMgdGhhdCBjb250YWluIGEgcHJvdmlkZWRcbiAgICogc3RyaW5nLiAgVGhpcyBtYXkgYmUgc2xvdyBmb3IgbGFyZ2UgZGF0YXNldHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3Vic3RyaW5nIFRoZSBzdWJzdHJpbmcgdGhhdCB0aGUgdmFsdWUgbXVzdCBjb250YWluLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNvbnRhaW5zKGtleSwgc3Vic3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBzdWJzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB2YWx1ZSBiZWluZyBzZWFyY2hlZCBmb3IgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckcmVnZXgnLCBxdW90ZShzdWJzdHJpbmcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCBmb3IgZmluZGluZyBzdHJpbmcgdmFsdWVzIHRoYXQgY29udGFpbiBhIHByb3ZpZGVkXG4gICAqIHN0cmluZy4gVGhpcyBtYXkgYmUgc2xvdyBmb3IgbGFyZ2UgZGF0YXNldHMuIFJlcXVpcmVzIFBhcnNlLVNlcnZlciA+IDIuNS4wXG4gICAqXG4gICAqIEluIG9yZGVyIHRvIHNvcnQgeW91IG11c3QgdXNlIHNlbGVjdCBhbmQgYXNjZW5kaW5nICgkc2NvcmUgaXMgcmVxdWlyZWQpXG4gICAqICA8cHJlPlxuICAgKiAgIHF1ZXJ5LmZ1bGxUZXh0KCdmaWVsZCcsICd0ZXJtJyk7XG4gICAqICAgcXVlcnkuYXNjZW5kaW5nKCckc2NvcmUnKTtcbiAgICogICBxdWVyeS5zZWxlY3QoJyRzY29yZScpO1xuICAgKiAgPC9wcmU+XG4gICAqXG4gICAqIFRvIHJldHJpZXZlIHRoZSB3ZWlnaHQgLyByYW5rXG4gICAqICA8cHJlPlxuICAgKiAgIG9iamVjdC0+Z2V0KCdzY29yZScpO1xuICAgKiAgPC9wcmU+XG4gICAqXG4gICAqIFlvdSBjYW4gZGVmaW5lIG9wdGlvbmFscyBieSBwcm92aWRpbmcgYW4gb2JqZWN0IGFzIGEgdGhpcmQgcGFyYW1ldGVyXG4gICAqICA8cHJlPlxuICAgKiAgIHF1ZXJ5LmZ1bGxUZXh0KCdmaWVsZCcsICd0ZXJtJywgeyBsYW5ndWFnZTogJ2VzJywgZGlhY3JpdGljU2Vuc2l0aXZlOiB0cnVlIH0pO1xuICAgKiAgPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBzdHJpbmcgdG8gbWF0Y2ggaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVGhlIHN0cmluZyB0byBzZWFyY2hcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgKE9wdGlvbmFsKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5sYW5ndWFnZSBUaGUgbGFuZ3VhZ2UgdGhhdCBkZXRlcm1pbmVzIHRoZSBsaXN0IG9mIHN0b3Agd29yZHMgZm9yIHRoZSBzZWFyY2ggYW5kIHRoZSBydWxlcyBmb3IgdGhlIHN0ZW1tZXIgYW5kIHRva2VuaXplci5cbiAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmNhc2VTZW5zaXRpdmUgQSBib29sZWFuIGZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgY2FzZSBzZW5zaXRpdmUgc2VhcmNoLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuZGlhY3JpdGljU2Vuc2l0aXZlIEEgYm9vbGVhbiBmbGFnIHRvIGVuYWJsZSBvciBkaXNhYmxlIGRpYWNyaXRpYyBzZW5zaXRpdmUgc2VhcmNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGZ1bGxUZXh0KGtleSwgdmFsdWUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBrZXkgaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzZWFyY2ggdGVybSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgYmVpbmcgc2VhcmNoZWQgZm9yIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIGNvbnN0IGZ1bGxPcHRpb25zID0ge307XG4gICAgZnVsbE9wdGlvbnMuJHRlcm0gPSB2YWx1ZTtcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBpbiBvcHRpb25zKSB7XG4gICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICBjYXNlICdsYW5ndWFnZSc6XG4gICAgICAgICAgZnVsbE9wdGlvbnMuJGxhbmd1YWdlID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjYXNlU2Vuc2l0aXZlJzpcbiAgICAgICAgICBmdWxsT3B0aW9ucy4kY2FzZVNlbnNpdGl2ZSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGlhY3JpdGljU2Vuc2l0aXZlJzpcbiAgICAgICAgICBmdWxsT3B0aW9ucy4kZGlhY3JpdGljU2Vuc2l0aXZlID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyR0ZXh0Jywge1xuICAgICAgJHNlYXJjaDogZnVsbE9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gc29ydCB0aGUgZnVsbCB0ZXh0IHNlYXJjaCBieSB0ZXh0IHNjb3JlXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgc29ydEJ5VGV4dFNjb3JlKCkge1xuICAgIHRoaXMuYXNjZW5kaW5nKCckc2NvcmUnKTtcbiAgICB0aGlzLnNlbGVjdChbJyRzY29yZSddKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCBmb3IgZmluZGluZyBzdHJpbmcgdmFsdWVzIHRoYXQgc3RhcnQgd2l0aCBhIHByb3ZpZGVkXG4gICAqIHN0cmluZy4gIFRoaXMgcXVlcnkgd2lsbCB1c2UgdGhlIGJhY2tlbmQgaW5kZXgsIHNvIGl0IHdpbGwgYmUgZmFzdCBldmVuXG4gICAqIGZvciBsYXJnZSBkYXRhc2V0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIHN0cmluZyB0byBtYXRjaCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggVGhlIHN1YnN0cmluZyB0aGF0IHRoZSB2YWx1ZSBtdXN0IHN0YXJ0IHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RpZmllcnMgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtb2RlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHN0YXJ0c1dpdGgoa2V5LCBwcmVmaXgsIG1vZGlmaWVycykge1xuICAgIGlmICh0eXBlb2YgcHJlZml4ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdmFsdWUgYmVpbmcgc2VhcmNoZWQgZm9yIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hdGNoZXMoa2V5LCB0aGlzLl9yZWdleFN0YXJ0V2l0aChwcmVmaXgpLCBtb2RpZmllcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IGZvciBmaW5kaW5nIHN0cmluZyB2YWx1ZXMgdGhhdCBlbmQgd2l0aCBhIHByb3ZpZGVkXG4gICAqIHN0cmluZy4gIFRoaXMgd2lsbCBiZSBzbG93IGZvciBsYXJnZSBkYXRhc2V0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIHN0cmluZyB0byBtYXRjaCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXggVGhlIHN1YnN0cmluZyB0aGF0IHRoZSB2YWx1ZSBtdXN0IGVuZCB3aXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kaWZpZXJzIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gbW9kZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBlbmRzV2l0aChrZXksIHN1ZmZpeCwgbW9kaWZpZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBzdWZmaXggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB2YWx1ZSBiZWluZyBzZWFyY2hlZCBmb3IgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhrZXksIHF1b3RlKHN1ZmZpeCkgKyAnJCcsIG1vZGlmaWVycyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHByb3hpbWl0eSBiYXNlZCBjb25zdHJhaW50IGZvciBmaW5kaW5nIG9iamVjdHMgd2l0aCBrZXkgcG9pbnRcbiAgICogdmFsdWVzIG5lYXIgdGhlIHBvaW50IGdpdmVuLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgUGFyc2UuR2VvUG9pbnQgaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCBUaGUgcmVmZXJlbmNlIFBhcnNlLkdlb1BvaW50IHRoYXQgaXMgdXNlZC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBuZWFyKGtleSwgcG9pbnQpIHtcbiAgICBpZiAoIShwb2ludCBpbnN0YW5jZW9mIF9QYXJzZUdlb1BvaW50LmRlZmF1bHQpKSB7XG4gICAgICAvLyBUcnkgdG8gY2FzdCBpdCBhcyBhIEdlb1BvaW50XG4gICAgICBwb2ludCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KHBvaW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckbmVhclNwaGVyZScsIHBvaW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcHJveGltaXR5IGJhc2VkIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgb2JqZWN0cyB3aXRoIGtleSBwb2ludFxuICAgKiB2YWx1ZXMgbmVhciB0aGUgcG9pbnQgZ2l2ZW4gYW5kIHdpdGhpbiB0aGUgbWF4aW11bSBkaXN0YW5jZSBnaXZlbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIFBhcnNlLkdlb1BvaW50IGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgVGhlIHJlZmVyZW5jZSBQYXJzZS5HZW9Qb2ludCB0aGF0IGlzIHVzZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhEaXN0YW5jZSBNYXhpbXVtIGRpc3RhbmNlIChpbiByYWRpYW5zKSBvZiByZXN1bHRzIHRvIHJldHVybi5cbiAgICogQHBhcmFtIHtib29sZWFufSBzb3J0ZWQgQSBCb29sIHZhbHVlIHRoYXQgaXMgdHJ1ZSBpZiByZXN1bHRzIHNob3VsZCBiZVxuICAgKiBzb3J0ZWQgYnkgZGlzdGFuY2UgYXNjZW5kaW5nLCBmYWxzZSBpcyBubyBzb3J0aW5nIGlzIHJlcXVpcmVkLFxuICAgKiBkZWZhdWx0cyB0byB0cnVlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhpblJhZGlhbnMoa2V5LCBwb2ludCwgbWF4RGlzdGFuY2UsIHNvcnRlZCkge1xuICAgIGlmIChzb3J0ZWQgfHwgc29ydGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubmVhcihrZXksIHBvaW50KTtcbiAgICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJG1heERpc3RhbmNlJywgbWF4RGlzdGFuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRnZW9XaXRoaW4nLCB7XG4gICAgICAgICRjZW50ZXJTcGhlcmU6IFtbcG9pbnQubG9uZ2l0dWRlLCBwb2ludC5sYXRpdHVkZV0sIG1heERpc3RhbmNlXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwcm94aW1pdHkgYmFzZWQgY29uc3RyYWludCBmb3IgZmluZGluZyBvYmplY3RzIHdpdGgga2V5IHBvaW50XG4gICAqIHZhbHVlcyBuZWFyIHRoZSBwb2ludCBnaXZlbiBhbmQgd2l0aGluIHRoZSBtYXhpbXVtIGRpc3RhbmNlIGdpdmVuLlxuICAgKiBSYWRpdXMgb2YgZWFydGggdXNlZCBpcyAzOTU4LjggbWlsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBQYXJzZS5HZW9Qb2ludCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50IFRoZSByZWZlcmVuY2UgUGFyc2UuR2VvUG9pbnQgdGhhdCBpcyB1c2VkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4RGlzdGFuY2UgTWF4aW11bSBkaXN0YW5jZSAoaW4gbWlsZXMpIG9mIHJlc3VsdHMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNvcnRlZCBBIEJvb2wgdmFsdWUgdGhhdCBpcyB0cnVlIGlmIHJlc3VsdHMgc2hvdWxkIGJlXG4gICAqIHNvcnRlZCBieSBkaXN0YW5jZSBhc2NlbmRpbmcsIGZhbHNlIGlzIG5vIHNvcnRpbmcgaXMgcmVxdWlyZWQsXG4gICAqIGRlZmF1bHRzIHRvIHRydWUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aGluTWlsZXMoa2V5LCBwb2ludCwgbWF4RGlzdGFuY2UsIHNvcnRlZCkge1xuICAgIHJldHVybiB0aGlzLndpdGhpblJhZGlhbnMoa2V5LCBwb2ludCwgbWF4RGlzdGFuY2UgLyAzOTU4LjgsIHNvcnRlZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHByb3hpbWl0eSBiYXNlZCBjb25zdHJhaW50IGZvciBmaW5kaW5nIG9iamVjdHMgd2l0aCBrZXkgcG9pbnRcbiAgICogdmFsdWVzIG5lYXIgdGhlIHBvaW50IGdpdmVuIGFuZCB3aXRoaW4gdGhlIG1heGltdW0gZGlzdGFuY2UgZ2l2ZW4uXG4gICAqIFJhZGl1cyBvZiBlYXJ0aCB1c2VkIGlzIDYzNzEuMCBraWxvbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgUGFyc2UuR2VvUG9pbnQgaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCBUaGUgcmVmZXJlbmNlIFBhcnNlLkdlb1BvaW50IHRoYXQgaXMgdXNlZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heERpc3RhbmNlIE1heGltdW0gZGlzdGFuY2UgKGluIGtpbG9tZXRlcnMpIG9mIHJlc3VsdHMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNvcnRlZCBBIEJvb2wgdmFsdWUgdGhhdCBpcyB0cnVlIGlmIHJlc3VsdHMgc2hvdWxkIGJlXG4gICAqIHNvcnRlZCBieSBkaXN0YW5jZSBhc2NlbmRpbmcsIGZhbHNlIGlzIG5vIHNvcnRpbmcgaXMgcmVxdWlyZWQsXG4gICAqIGRlZmF1bHRzIHRvIHRydWUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aGluS2lsb21ldGVycyhrZXksIHBvaW50LCBtYXhEaXN0YW5jZSwgc29ydGVkKSB7XG4gICAgcmV0dXJuIHRoaXMud2l0aGluUmFkaWFucyhrZXksIHBvaW50LCBtYXhEaXN0YW5jZSAvIDYzNzEuMCwgc29ydGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3NcbiAgICogY29vcmRpbmF0ZXMgYmUgY29udGFpbmVkIHdpdGhpbiBhIGdpdmVuIHJlY3Rhbmd1bGFyIGdlb2dyYXBoaWMgYm91bmRpbmdcbiAgICogYm94LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gYmUgY29uc3RyYWluZWQuXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHNvdXRod2VzdFxuICAgKiAgICAgVGhlIGxvd2VyLWxlZnQgaW5jbHVzaXZlIGNvcm5lciBvZiB0aGUgYm94LlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBub3J0aGVhc3RcbiAgICogICAgIFRoZSB1cHBlci1yaWdodCBpbmNsdXNpdmUgY29ybmVyIG9mIHRoZSBib3guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aGluR2VvQm94KGtleSwgc291dGh3ZXN0LCBub3J0aGVhc3QpIHtcbiAgICBpZiAoIShzb3V0aHdlc3QgaW5zdGFuY2VvZiBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KSkge1xuICAgICAgc291dGh3ZXN0ID0gbmV3IF9QYXJzZUdlb1BvaW50LmRlZmF1bHQoc291dGh3ZXN0KTtcbiAgICB9XG4gICAgaWYgKCEobm9ydGhlYXN0IGluc3RhbmNlb2YgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCkpIHtcbiAgICAgIG5vcnRoZWFzdCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KG5vcnRoZWFzdCk7XG4gICAgfVxuICAgIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckd2l0aGluJywge1xuICAgICAgJGJveDogW3NvdXRod2VzdCwgbm9ydGhlYXN0XVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXknc1xuICAgKiBjb29yZGluYXRlcyBiZSBjb250YWluZWQgd2l0aGluIGFuZCBvbiB0aGUgYm91bmRzIG9mIGEgZ2l2ZW4gcG9seWdvbi5cbiAgICogU3VwcG9ydHMgY2xvc2VkIGFuZCBvcGVuIChsYXN0IHBvaW50IGlzIGNvbm5lY3RlZCB0byBmaXJzdCkgcGF0aHNcbiAgICpcbiAgICogUG9seWdvbiBtdXN0IGhhdmUgYXQgbGVhc3QgMyBwb2ludHNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGJlIGNvbnN0cmFpbmVkLlxuICAgKiBAcGFyYW0ge0FycmF5fSBwb2ludHMgQXJyYXkgb2YgQ29vcmRpbmF0ZXMgLyBHZW9Qb2ludHNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3aXRoaW5Qb2x5Z29uKGtleSwgcG9pbnRzKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZ2VvV2l0aGluJywge1xuICAgICAgJHBvbHlnb246IHBvaW50c1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzXG4gICAqIGNvb3JkaW5hdGVzIHRoYXQgY29udGFpbnMgYSBQYXJzZUdlb1BvaW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBiZSBjb25zdHJhaW5lZC5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnRcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBwb2x5Z29uQ29udGFpbnMoa2V5LCBwb2ludCkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGdlb0ludGVyc2VjdHMnLCB7XG4gICAgICAkcG9pbnQ6IHBvaW50XG4gICAgfSk7XG4gIH1cblxuICAvKiBRdWVyeSBPcmRlcmluZ3MgKi9cblxuICAvKipcbiAgICogU29ydHMgdGhlIHJlc3VsdHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IGtleXMgVGhlIGtleSB0byBvcmRlciBieSwgd2hpY2ggaXMgYVxuICAgKiBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcywgb3IgYW4gQXJyYXkgb2Yga2V5cywgb3IgbXVsdGlwbGUga2V5cy5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhc2NlbmRpbmcoKSB7XG4gICAgdGhpcy5fb3JkZXIgPSBbXTtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGtleXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFkZEFzY2VuZGluZy5hcHBseSh0aGlzLCBrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgcmVzdWx0cyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGdpdmVuIGtleSxcbiAgICogYnV0IGNhbiBhbHNvIGFkZCBzZWNvbmRhcnkgc29ydCBkZXNjcmlwdG9ycyB3aXRob3V0IG92ZXJ3cml0aW5nIF9vcmRlci5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0ga2V5cyBUaGUga2V5IHRvIG9yZGVyIGJ5LCB3aGljaCBpcyBhXG4gICAqIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzLCBvciBhbiBBcnJheSBvZiBrZXlzLCBvciBtdWx0aXBsZSBrZXlzLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZEFzY2VuZGluZygpIHtcbiAgICBpZiAoIXRoaXMuX29yZGVyKSB7XG4gICAgICB0aGlzLl9vcmRlciA9IFtdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGtleXNbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIHZhciBfY29udGV4dDY7XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAga2V5ID0ga2V5LmpvaW4oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX29yZGVyID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQ2ID0gdGhpcy5fb3JkZXIpLmNhbGwoX2NvbnRleHQ2LCBrZXkucmVwbGFjZSgvXFxzL2csICcnKS5zcGxpdCgnLCcpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgcmVzdWx0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IGtleXMgVGhlIGtleSB0byBvcmRlciBieSwgd2hpY2ggaXMgYVxuICAgKiBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcywgb3IgYW4gQXJyYXkgb2Yga2V5cywgb3IgbXVsdGlwbGUga2V5cy5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBkZXNjZW5kaW5nKCkge1xuICAgIHRoaXMuX29yZGVyID0gW107XG4gICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICBrZXlzW19rZXkzXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFkZERlc2NlbmRpbmcuYXBwbHkodGhpcywga2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgZ2l2ZW4ga2V5LFxuICAgKiBidXQgY2FuIGFsc28gYWRkIHNlY29uZGFyeSBzb3J0IGRlc2NyaXB0b3JzIHdpdGhvdXQgb3ZlcndyaXRpbmcgX29yZGVyLlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBrZXlzIFRoZSBrZXkgdG8gb3JkZXIgYnksIHdoaWNoIGlzIGFcbiAgICogc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMsIG9yIGFuIEFycmF5IG9mIGtleXMsIG9yIG11bHRpcGxlIGtleXMuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkRGVzY2VuZGluZygpIHtcbiAgICBpZiAoIXRoaXMuX29yZGVyKSB7XG4gICAgICB0aGlzLl9vcmRlciA9IFtdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgIGtleXNbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIHZhciBfY29udGV4dDcsIF9jb250ZXh0ODtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICBrZXkgPSBrZXkuam9pbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5fb3JkZXIgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDcgPSB0aGlzLl9vcmRlcikuY2FsbChfY29udGV4dDcsICgwLCBfbWFwLmRlZmF1bHQpKF9jb250ZXh0OCA9IGtleS5yZXBsYWNlKC9cXHMvZywgJycpLnNwbGl0KCcsJykpLmNhbGwoX2NvbnRleHQ4LCBrID0+IHtcbiAgICAgICAgcmV0dXJuICctJyArIGs7XG4gICAgICB9KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiBRdWVyeSBPcHRpb25zICovXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG51bWJlciBvZiByZXN1bHRzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyBhbnkgcmVzdWx0cy5cbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIHBhZ2luYXRpb24uXG4gICAqIERlZmF1bHQgaXMgdG8gc2tpcCB6ZXJvIHJlc3VsdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIHRoZSBudW1iZXIgb2YgcmVzdWx0cyB0byBza2lwLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHNraXAobikge1xuICAgIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbiBvbmx5IHNraXAgYnkgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgICB9XG4gICAgdGhpcy5fc2tpcCA9IG47XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbGltaXQgb2YgdGhlIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybi4gVGhlIGRlZmF1bHQgbGltaXQgaXMgMTAwLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbiB0aGUgbnVtYmVyIG9mIHJlc3VsdHMgdG8gbGltaXQgdG8uXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbGltaXQobikge1xuICAgIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbiBvbmx5IHNldCB0aGUgbGltaXQgdG8gYSBudW1lcmljIHZhbHVlJyk7XG4gICAgfVxuICAgIHRoaXMuX2xpbWl0ID0gbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBmbGFnIHRvIGluY2x1ZGUgd2l0aCByZXNwb25zZSB0aGUgdG90YWwgbnVtYmVyIG9mIG9iamVjdHMgc2F0aXNmeWluZyB0aGlzIHF1ZXJ5LFxuICAgKiBkZXNwaXRlIGxpbWl0cy9za2lwLiBNaWdodCBiZSB1c2VmdWwgZm9yIHBhZ2luYXRpb24uXG4gICAqIE5vdGUgdGhhdCByZXN1bHQgb2YgdGhpcyBxdWVyeSB3aWxsIGJlIHdyYXBwZWQgYXMgYW4gb2JqZWN0IHdpdGhcbiAgICogYHJlc3VsdHNgOiBob2xkaW5nIHtQYXJzZU9iamVjdH0gYXJyYXkgYW5kIGBjb3VudGA6IGludGVnZXIgaG9sZGluZyB0b3RhbCBudW1iZXJcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQ291bnQgZmFsc2UgLSBkaXNhYmxlLCB0cnVlIC0gZW5hYmxlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhDb3VudCgpIHtcbiAgICBsZXQgaW5jbHVkZUNvdW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICAgIGlmICh0eXBlb2YgaW5jbHVkZUNvdW50ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbiBvbmx5IHNldCB3aXRoQ291bnQgdG8gYSBib29sZWFuIHZhbHVlJyk7XG4gICAgfVxuICAgIHRoaXMuX2NvdW50ID0gaW5jbHVkZUNvdW50O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBJbmNsdWRlcyBuZXN0ZWQgUGFyc2UuT2JqZWN0cyBmb3IgdGhlIHByb3ZpZGVkIGtleS4gIFlvdSBjYW4gdXNlIGRvdFxuICAgKiBub3RhdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkcyBpbiB0aGUgaW5jbHVkZWQgb2JqZWN0IGFyZSBhbHNvIGZldGNoZWQuXG4gICAqXG4gICAqIFlvdSBjYW4gaW5jbHVkZSBhbGwgbmVzdGVkIFBhcnNlLk9iamVjdHMgYnkgcGFzc2luZyBpbiAnKicuXG4gICAqIFJlcXVpcmVzIFBhcnNlIFNlcnZlciAzLjAuMCtcbiAgICogPHByZT5xdWVyeS5pbmNsdWRlKCcqJyk7PC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7Li4uc3RyaW5nfEFycmF5PHN0cmluZz59IGtleXMgVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBpbmNsdWRlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGluY2x1ZGUoKSB7XG4gICAgZm9yICh2YXIgX2xlbjUgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW41KSwgX2tleTUgPSAwOyBfa2V5NSA8IF9sZW41OyBfa2V5NSsrKSB7XG4gICAgICBrZXlzW19rZXk1XSA9IGFyZ3VtZW50c1tfa2V5NV07XG4gICAgfVxuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSA9PiB7XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0OTtcbiAgICAgICAgdGhpcy5faW5jbHVkZSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0OSA9IHRoaXMuX2luY2x1ZGUpLmNhbGwoX2NvbnRleHQ5LCBrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5jbHVkZS5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5jbHVkZXMgYWxsIG5lc3RlZCBQYXJzZS5PYmplY3RzIG9uZSBsZXZlbCBkZWVwLlxuICAgKlxuICAgKiBSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgMy4wLjArXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgaW5jbHVkZUFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmNsdWRlKCcqJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdHJpY3RzIHRoZSBmaWVsZHMgb2YgdGhlIHJldHVybmVkIFBhcnNlLk9iamVjdHMgdG8gaW5jbHVkZSBvbmx5IHRoZVxuICAgKiBwcm92aWRlZCBrZXlzLiAgSWYgdGhpcyBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIHRoZW4gYWxsIG9mIHRoZSBrZXlzXG4gICAqIHNwZWNpZmllZCBpbiBlYWNoIG9mIHRoZSBjYWxscyB3aWxsIGJlIGluY2x1ZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLnN0cmluZ3xBcnJheTxzdHJpbmc+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBzZWxlY3QoKSB7XG4gICAgaWYgKCF0aGlzLl9zZWxlY3QpIHtcbiAgICAgIHRoaXMuX3NlbGVjdCA9IFtdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfbGVuNiA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjYpLCBfa2V5NiA9IDA7IF9rZXk2IDwgX2xlbjY7IF9rZXk2KyspIHtcbiAgICAgIGtleXNbX2tleTZdID0gYXJndW1lbnRzW19rZXk2XTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICB2YXIgX2NvbnRleHQxMDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQxMCA9IHRoaXMuX3NlbGVjdCkuY2FsbChfY29udGV4dDEwLCBrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0LnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0cmljdHMgdGhlIGZpZWxkcyBvZiB0aGUgcmV0dXJuZWQgUGFyc2UuT2JqZWN0cyB0byBhbGwga2V5cyBleGNlcHQgdGhlXG4gICAqIHByb3ZpZGVkIGtleXMuIEV4Y2x1ZGUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHNlbGVjdCBhbmQgaW5jbHVkZS5cbiAgICpcbiAgICogUmVxdWlyZXMgUGFyc2UgU2VydmVyIDMuNi4wK1xuICAgKlxuICAgKiBAcGFyYW0gey4uLnN0cmluZ3xBcnJheTxzdHJpbmc+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gZXhjbHVkZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBleGNsdWRlKCkge1xuICAgIGZvciAodmFyIF9sZW43ID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuNyksIF9rZXk3ID0gMDsgX2tleTcgPCBfbGVuNzsgX2tleTcrKykge1xuICAgICAga2V5c1tfa2V5N10gPSBhcmd1bWVudHNbX2tleTddO1xuICAgIH1cbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkgPT4ge1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgIHZhciBfY29udGV4dDExO1xuICAgICAgICB0aGlzLl9leGNsdWRlID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQxMSA9IHRoaXMuX2V4Y2x1ZGUpLmNhbGwoX2NvbnRleHQxMSwga2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2V4Y2x1ZGUucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyaWN0cyBsaXZlIHF1ZXJ5IHRvIHRyaWdnZXIgb25seSBmb3Igd2F0Y2hlZCBmaWVsZHMuXG4gICAqXG4gICAqIFJlcXVpcmVzIFBhcnNlIFNlcnZlciA2LjAuMCtcbiAgICpcbiAgICogQHBhcmFtIHsuLi5zdHJpbmd8QXJyYXk8c3RyaW5nPn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIHdhdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdhdGNoKCkge1xuICAgIGZvciAodmFyIF9sZW44ID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuOCksIF9rZXk4ID0gMDsgX2tleTggPCBfbGVuODsgX2tleTgrKykge1xuICAgICAga2V5c1tfa2V5OF0gPSBhcmd1bWVudHNbX2tleThdO1xuICAgIH1cbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkgPT4ge1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgIHZhciBfY29udGV4dDEyO1xuICAgICAgICB0aGlzLl93YXRjaCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0MTIgPSB0aGlzLl93YXRjaCkuY2FsbChfY29udGV4dDEyLCBrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fd2F0Y2gucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHJlYWQgcHJlZmVyZW5jZSB0aGF0IHRoZSBiYWNrZW5kIHdpbGwgdXNlIHdoZW4gcGVyZm9ybWluZyB0aGUgcXVlcnkgdG8gdGhlIGRhdGFiYXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhZFByZWZlcmVuY2UgVGhlIHJlYWQgcHJlZmVyZW5jZSBmb3IgdGhlIG1haW4gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbmNsdWRlUmVhZFByZWZlcmVuY2UgVGhlIHJlYWQgcHJlZmVyZW5jZSBmb3IgdGhlIHF1ZXJpZXMgdG8gaW5jbHVkZSBwb2ludGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgVGhlIHJlYWQgcHJlZmVyZW5jZSBmb3IgdGhlIHN1YiBxdWVyaWVzLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHJlYWRQcmVmZXJlbmNlKHJlYWRQcmVmZXJlbmNlLCBpbmNsdWRlUmVhZFByZWZlcmVuY2UsIHN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UpIHtcbiAgICB0aGlzLl9yZWFkUHJlZmVyZW5jZSA9IHJlYWRQcmVmZXJlbmNlO1xuICAgIHRoaXMuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IGluY2x1ZGVSZWFkUHJlZmVyZW5jZSB8fCBudWxsO1xuICAgIHRoaXMuX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlIHx8IG51bGw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRoaXMgcXVlcnkgdG8gZ2V0IGxpdmVRdWVyeSB1cGRhdGVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uVG9rZW4gKG9wdGlvbmFsKSBEZWZhdWx0cyB0byB0aGUgY3VycmVudFVzZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8TGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uPn0gUmV0dXJucyB0aGUgbGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uLCBpdCdzIGFuIGV2ZW50IGVtaXR0ZXJcbiAgICogd2hpY2ggY2FuIGJlIHVzZWQgdG8gZ2V0IGxpdmVRdWVyeSB1cGRhdGVzLlxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlKHNlc3Npb25Ub2tlbikge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gYXdhaXQgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKS5jdXJyZW50VXNlckFzeW5jKCk7XG4gICAgaWYgKCFzZXNzaW9uVG9rZW4pIHtcbiAgICAgIHNlc3Npb25Ub2tlbiA9IGN1cnJlbnRVc2VyID8gY3VycmVudFVzZXIuZ2V0U2Vzc2lvblRva2VuKCkgfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBsaXZlUXVlcnlDbGllbnQgPSBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMaXZlUXVlcnlDb250cm9sbGVyKCkuZ2V0RGVmYXVsdExpdmVRdWVyeUNsaWVudCgpO1xuICAgIGlmIChsaXZlUXVlcnlDbGllbnQuc2hvdWxkT3BlbigpKSB7XG4gICAgICBsaXZlUXVlcnlDbGllbnQub3BlbigpO1xuICAgIH1cbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBsaXZlUXVlcnlDbGllbnQuc3Vic2NyaWJlKHRoaXMsIHNlc3Npb25Ub2tlbik7XG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUGFyc2UuUXVlcnkgdGhhdCBpcyB0aGUgT1Igb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzLiAgRm9yXG4gICAqIGV4YW1wbGU6XG4gICAqIDxwcmU+dmFyIGNvbXBvdW5kUXVlcnkgPSBQYXJzZS5RdWVyeS5vcihxdWVyeTEsIHF1ZXJ5MiwgcXVlcnkzKTs8L3ByZT5cbiAgICpcbiAgICogd2lsbCBjcmVhdGUgYSBjb21wb3VuZFF1ZXJ5IHRoYXQgaXMgYW4gb3Igb2YgdGhlIHF1ZXJ5MSwgcXVlcnkyLCBhbmRcbiAgICogcXVlcnkzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLlBhcnNlLlF1ZXJ5fSBxdWVyaWVzIFRoZSBsaXN0IG9mIHF1ZXJpZXMgdG8gT1IuXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBUaGUgcXVlcnkgdGhhdCBpcyB0aGUgT1Igb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzLlxuICAgKi9cbiAgc3RhdGljIG9yKCkge1xuICAgIGZvciAodmFyIF9sZW45ID0gYXJndW1lbnRzLmxlbmd0aCwgcXVlcmllcyA9IG5ldyBBcnJheShfbGVuOSksIF9rZXk5ID0gMDsgX2tleTkgPCBfbGVuOTsgX2tleTkrKykge1xuICAgICAgcXVlcmllc1tfa2V5OV0gPSBhcmd1bWVudHNbX2tleTldO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBfZ2V0Q2xhc3NOYW1lRnJvbVF1ZXJpZXMocXVlcmllcyk7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShjbGFzc05hbWUpO1xuICAgIHF1ZXJ5Ll9vclF1ZXJ5KHF1ZXJpZXMpO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUGFyc2UuUXVlcnkgdGhhdCBpcyB0aGUgQU5EIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcy4gIEZvclxuICAgKiBleGFtcGxlOlxuICAgKiA8cHJlPnZhciBjb21wb3VuZFF1ZXJ5ID0gUGFyc2UuUXVlcnkuYW5kKHF1ZXJ5MSwgcXVlcnkyLCBxdWVyeTMpOzwvcHJlPlxuICAgKlxuICAgKiB3aWxsIGNyZWF0ZSBhIGNvbXBvdW5kUXVlcnkgdGhhdCBpcyBhbiBhbmQgb2YgdGhlIHF1ZXJ5MSwgcXVlcnkyLCBhbmRcbiAgICogcXVlcnkzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLlBhcnNlLlF1ZXJ5fSBxdWVyaWVzIFRoZSBsaXN0IG9mIHF1ZXJpZXMgdG8gQU5ELlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gVGhlIHF1ZXJ5IHRoYXQgaXMgdGhlIEFORCBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMuXG4gICAqL1xuICBzdGF0aWMgYW5kKCkge1xuICAgIGZvciAodmFyIF9sZW4xMCA9IGFyZ3VtZW50cy5sZW5ndGgsIHF1ZXJpZXMgPSBuZXcgQXJyYXkoX2xlbjEwKSwgX2tleTEwID0gMDsgX2tleTEwIDwgX2xlbjEwOyBfa2V5MTArKykge1xuICAgICAgcXVlcmllc1tfa2V5MTBdID0gYXJndW1lbnRzW19rZXkxMF07XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IF9nZXRDbGFzc05hbWVGcm9tUXVlcmllcyhxdWVyaWVzKTtcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KGNsYXNzTmFtZSk7XG4gICAgcXVlcnkuX2FuZFF1ZXJ5KHF1ZXJpZXMpO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUGFyc2UuUXVlcnkgdGhhdCBpcyB0aGUgTk9SIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcy4gIEZvclxuICAgKiBleGFtcGxlOlxuICAgKiA8cHJlPmNvbnN0IGNvbXBvdW5kUXVlcnkgPSBQYXJzZS5RdWVyeS5ub3IocXVlcnkxLCBxdWVyeTIsIHF1ZXJ5Myk7PC9wcmU+XG4gICAqXG4gICAqIHdpbGwgY3JlYXRlIGEgY29tcG91bmRRdWVyeSB0aGF0IGlzIGEgbm9yIG9mIHRoZSBxdWVyeTEsIHF1ZXJ5MiwgYW5kXG4gICAqIHF1ZXJ5My5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5QYXJzZS5RdWVyeX0gcXVlcmllcyBUaGUgbGlzdCBvZiBxdWVyaWVzIHRvIE5PUi5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFRoZSBxdWVyeSB0aGF0IGlzIHRoZSBOT1Igb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzLlxuICAgKi9cbiAgc3RhdGljIG5vcigpIHtcbiAgICBmb3IgKHZhciBfbGVuMTEgPSBhcmd1bWVudHMubGVuZ3RoLCBxdWVyaWVzID0gbmV3IEFycmF5KF9sZW4xMSksIF9rZXkxMSA9IDA7IF9rZXkxMSA8IF9sZW4xMTsgX2tleTExKyspIHtcbiAgICAgIHF1ZXJpZXNbX2tleTExXSA9IGFyZ3VtZW50c1tfa2V5MTFdO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBfZ2V0Q2xhc3NOYW1lRnJvbVF1ZXJpZXMocXVlcmllcyk7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShjbGFzc05hbWUpO1xuICAgIHF1ZXJ5Ll9ub3JRdWVyeShxdWVyaWVzKTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBzb3VyY2Ugb2YgdGhpcyBxdWVyeSB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGZyb21OZXR3b3JrKCkge1xuICAgIHRoaXMuX3F1ZXJpZXNMb2NhbERhdGFzdG9yZSA9IGZhbHNlO1xuICAgIHRoaXMuX2xvY2FsRGF0YXN0b3JlUGluTmFtZSA9IG51bGw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgc291cmNlIG9mIHRoaXMgcXVlcnkgdG8gYWxsIHBpbm5lZCBvYmplY3RzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGZyb21Mb2NhbERhdGFzdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tUGluV2l0aE5hbWUobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgc291cmNlIG9mIHRoaXMgcXVlcnkgdG8gdGhlIGRlZmF1bHQgZ3JvdXAgb2YgcGlubmVkIG9iamVjdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZnJvbVBpbigpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tUGluV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHNvdXJjZSBvZiB0aGlzIHF1ZXJ5IHRvIGEgc3BlY2lmaWMgZ3JvdXAgb2YgcGlubmVkIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHF1ZXJ5IHNvdXJjZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBmcm9tUGluV2l0aE5hbWUobmFtZSkge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAobG9jYWxEYXRhc3RvcmUuY2hlY2tJZkVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5fcXVlcmllc0xvY2FsRGF0YXN0b3JlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2xvY2FsRGF0YXN0b3JlUGluTmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgdGhlIGN1cnJlbnQgbmV0d29yayByZXF1ZXN0IChpZiBhbnkgaXMgcnVubmluZykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLl94aHJSZXF1ZXN0LnRhc2sgJiYgdHlwZW9mIHRoaXMuX3hoclJlcXVlc3QudGFzay5hYm9ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5feGhyUmVxdWVzdC50YXNrLl9hYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3hoclJlcXVlc3QudGFzay5hYm9ydCgpO1xuICAgICAgdGhpcy5feGhyUmVxdWVzdC50YXNrID0gbnVsbDtcbiAgICAgIHRoaXMuX3hoclJlcXVlc3Qub25jaGFuZ2UgPSAoKSA9PiB7fTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl94aHJSZXF1ZXN0Lm9uY2hhbmdlID0gKCkgPT4gdGhpcy5jYW5jZWwoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBfc2V0UmVxdWVzdFRhc2sob3B0aW9ucykge1xuICAgIG9wdGlvbnMucmVxdWVzdFRhc2sgPSB0YXNrID0+IHtcbiAgICAgIHRoaXMuX3hoclJlcXVlc3QudGFzayA9IHRhc2s7XG4gICAgICB0aGlzLl94aHJSZXF1ZXN0Lm9uY2hhbmdlKCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgY29tbWVudCB0byB0aGUgcXVlcnkgc28gdGhhdCB0aGUgcXVlcnlcbiAgICogY2FuIGJlIGlkZW50aWZpZWQgd2hlbiB1c2luZyBhIHRoZSBwcm9maWxlciBmb3IgTW9uZ29EQi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIGEgY29tbWVudCBjYW4gbWFrZSB5b3VyIHByb2ZpbGUgZGF0YSBlYXNpZXIgdG8gaW50ZXJwcmV0IGFuZCB0cmFjZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjb21tZW50KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9jb21tZW50O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB2YWx1ZSBvZiBhIGNvbW1lbnQgdG8gYmUgc2VudCB3aXRoIHRoaXMgcXVlcnkgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgdGhpcy5fY29tbWVudCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgZmluZChjbGFzc05hbWUsIHBhcmFtcywgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ2NsYXNzZXMvJyArIGNsYXNzTmFtZSwgcGFyYW1zLCBvcHRpb25zKTtcbiAgfSxcbiAgYWdncmVnYXRlKGNsYXNzTmFtZSwgcGFyYW1zLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAnYWdncmVnYXRlLycgKyBjbGFzc05hbWUsIHBhcmFtcywgb3B0aW9ucyk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQYXJzZVF1ZXJ5KFBhcnNlUXVlcnkpO1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UXVlcnlDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlUXVlcnk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFJlbGF0aW9uIGZvciB0aGUgZ2l2ZW4gcGFyZW50IG9iamVjdCBhbmQga2V5LiBUaGlzXG4gKiBjb25zdHJ1Y3RvciBzaG91bGQgcmFyZWx5IGJlIHVzZWQgZGlyZWN0bHksIGJ1dCByYXRoZXIgY3JlYXRlZCBieVxuICogUGFyc2UuT2JqZWN0LnJlbGF0aW9uLlxuICpcbiAqIDxwPlxuICogQSBjbGFzcyB0aGF0IGlzIHVzZWQgdG8gYWNjZXNzIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgYSBtYW55LXRvLW1hbnlcbiAqIHJlbGF0aW9uc2hpcC4gIEVhY2ggaW5zdGFuY2Ugb2YgUGFyc2UuUmVsYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGFcbiAqIHBhcnRpY3VsYXIgcGFyZW50IG9iamVjdCBhbmQga2V5LlxuICogPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5SZWxhdGlvblxuICovXG5jbGFzcyBQYXJzZVJlbGF0aW9uIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyc2UuT2JqZWN0fSBwYXJlbnQgVGhlIHBhcmVudCBvZiB0aGlzIHJlbGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgZm9yIHRoaXMgcmVsYXRpb24gb24gdGhlIHBhcmVudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudCwga2V5KSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJwYXJlbnRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImtleVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwidGFyZ2V0Q2xhc3NOYW1lXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgdGhpcy50YXJnZXRDbGFzc05hbWUgPSBudWxsO1xuICB9XG5cbiAgLypcbiAgICogTWFrZXMgc3VyZSB0aGF0IHRoaXMgcmVsYXRpb24gaGFzIHRoZSByaWdodCBwYXJlbnQgYW5kIGtleS5cbiAgICovXG4gIF9lbnN1cmVQYXJlbnRBbmRLZXkocGFyZW50LCBrZXkpIHtcbiAgICB0aGlzLmtleSA9IHRoaXMua2V5IHx8IGtleTtcbiAgICBpZiAodGhpcy5rZXkgIT09IGtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBFcnJvci4gUmVsYXRpb24gcmV0cmlldmVkIGZyb20gdHdvIGRpZmZlcmVudCBrZXlzLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudC5jbGFzc05hbWUgIT09IHBhcmVudC5jbGFzc05hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBFcnJvci4gUmVsYXRpb24gcmV0cmlldmVkIGZyb20gdHdvIGRpZmZlcmVudCBPYmplY3RzLicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGFyZW50LmlkKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudC5pZCAhPT0gcGFyZW50LmlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBFcnJvci4gUmVsYXRpb24gcmV0cmlldmVkIGZyb20gdHdvIGRpZmZlcmVudCBPYmplY3RzLicpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcmVudC5pZCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBQYXJzZS5PYmplY3Qgb3IgYW4gYXJyYXkgb2YgUGFyc2UuT2JqZWN0cyB0byB0aGUgcmVsYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7KFBhcnNlLk9iamVjdHxBcnJheSl9IG9iamVjdHMgVGhlIGl0ZW0gb3IgaXRlbXMgdG8gYWRkLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBUaGUgcGFyZW50IG9mIHRoZSByZWxhdGlvbi5cbiAgICovXG4gIGFkZChvYmplY3RzKSB7XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkob2JqZWN0cykpIHtcbiAgICAgIG9iamVjdHMgPSBbb2JqZWN0c107XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIFJlbGF0aW9uT3BcbiAgICB9ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPcCgpO1xuICAgIGNvbnN0IGNoYW5nZSA9IG5ldyBSZWxhdGlvbk9wKG9iamVjdHMsIFtdKTtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIHRvIGEgUmVsYXRpb24gd2l0aG91dCBhIHBhcmVudCcpO1xuICAgIH1cbiAgICBpZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudC5zZXQodGhpcy5rZXksIGNoYW5nZSk7XG4gICAgdGhpcy50YXJnZXRDbGFzc05hbWUgPSBjaGFuZ2UuX3RhcmdldENsYXNzTmFtZTtcbiAgICByZXR1cm4gcGFyZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBQYXJzZS5PYmplY3Qgb3IgYW4gYXJyYXkgb2YgUGFyc2UuT2JqZWN0cyBmcm9tIHRoaXMgcmVsYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7KFBhcnNlLk9iamVjdHxBcnJheSl9IG9iamVjdHMgVGhlIGl0ZW0gb3IgaXRlbXMgdG8gcmVtb3ZlLlxuICAgKi9cbiAgcmVtb3ZlKG9iamVjdHMpIHtcbiAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KShvYmplY3RzKSkge1xuICAgICAgb2JqZWN0cyA9IFtvYmplY3RzXTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgUmVsYXRpb25PcFxuICAgIH0gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9wKCk7XG4gICAgY29uc3QgY2hhbmdlID0gbmV3IFJlbGF0aW9uT3AoW10sIG9iamVjdHMpO1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlbW92ZSBmcm9tIGEgUmVsYXRpb24gd2l0aG91dCBhIHBhcmVudCcpO1xuICAgIH1cbiAgICBpZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQuc2V0KHRoaXMua2V5LCBjaGFuZ2UpO1xuICAgIHRoaXMudGFyZ2V0Q2xhc3NOYW1lID0gY2hhbmdlLl90YXJnZXRDbGFzc05hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04gdmVyc2lvbiBvZiB0aGUgb2JqZWN0IHN1aXRhYmxlIGZvciBzYXZpbmcgdG8gZGlzay5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH0gSlNPTiByZXByZXNlbnRhdGlvbiBvZiBSZWxhdGlvblxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdSZWxhdGlvbicsXG4gICAgICBjbGFzc05hbWU6IHRoaXMudGFyZ2V0Q2xhc3NOYW1lXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgUGFyc2UuUXVlcnkgdGhhdCBpcyBsaW1pdGVkIHRvIG9iamVjdHMgaW4gdGhpc1xuICAgKiByZWxhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZWxhdGlvbiBRdWVyeVxuICAgKi9cbiAgcXVlcnkoKSB7XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb25zdHJ1Y3QgYSBxdWVyeSBmb3IgYSBSZWxhdGlvbiB3aXRob3V0IGEgcGFyZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IFBhcnNlUXVlcnkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVF1ZXJ5KCk7XG4gICAgaWYgKCF0aGlzLnRhcmdldENsYXNzTmFtZSkge1xuICAgICAgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeShwYXJlbnQuY2xhc3NOYW1lKTtcbiAgICAgIHF1ZXJ5Ll9leHRyYU9wdGlvbnMucmVkaXJlY3RDbGFzc05hbWVGb3JLZXkgPSB0aGlzLmtleTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBuZXcgUGFyc2VRdWVyeSh0aGlzLnRhcmdldENsYXNzTmFtZSk7XG4gICAgfVxuICAgIHF1ZXJ5Ll9hZGRDb25kaXRpb24oJyRyZWxhdGVkVG8nLCAnb2JqZWN0Jywge1xuICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICBjbGFzc05hbWU6IHBhcmVudC5jbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogcGFyZW50LmlkXG4gICAgfSk7XG4gICAgcXVlcnkuX2FkZENvbmRpdGlvbignJHJlbGF0ZWRUbycsICdrZXknLCB0aGlzLmtleSk7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZVJlbGF0aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlQUNMID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUFDTFwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgUm9sZSBvbiB0aGUgUGFyc2Ugc2VydmVyLiBSb2xlcyByZXByZXNlbnQgZ3JvdXBpbmdzIG9mXG4gKiBVc2VycyBmb3IgdGhlIHB1cnBvc2VzIG9mIGdyYW50aW5nIHBlcm1pc3Npb25zIChlLmcuIHNwZWNpZnlpbmcgYW4gQUNMXG4gKiBmb3IgYW4gT2JqZWN0KS4gUm9sZXMgYXJlIHNwZWNpZmllZCBieSB0aGVpciBzZXRzIG9mIGNoaWxkIHVzZXJzIGFuZFxuICogY2hpbGQgcm9sZXMsIGFsbCBvZiB3aGljaCBhcmUgZ3JhbnRlZCBhbnkgcGVybWlzc2lvbnMgdGhhdCB0aGUgcGFyZW50XG4gKiByb2xlIGhhcy5cbiAqXG4gKiA8cD5Sb2xlcyBtdXN0IGhhdmUgYSBuYW1lICh3aGljaCBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjcmVhdGlvbiBvZiB0aGVcbiAqIHJvbGUpLCBhbmQgbXVzdCBzcGVjaWZ5IGFuIEFDTC48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLlJvbGVcbiAqIEBhdWdtZW50cyBQYXJzZS5PYmplY3RcbiAqL1xuY2xhc3MgUGFyc2VSb2xlIGV4dGVuZHMgX1BhcnNlT2JqZWN0LmRlZmF1bHQge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIFJvbGUgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0ge1BhcnNlLkFDTH0gYWNsIFRoZSBBQ0wgZm9yIHRoaXMgcm9sZS4gUm9sZXMgbXVzdCBoYXZlIGFuIEFDTC5cbiAgICogQSBQYXJzZS5Sb2xlIGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpb24gb2YgYSByb2xlIHBlcnNpc3RlZCB0byB0aGUgUGFyc2VcbiAgICogY2xvdWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBhY2wpIHtcbiAgICBzdXBlcignX1JvbGUnKTtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIGFjbCBpbnN0YW5jZW9mIF9QYXJzZUFDTC5kZWZhdWx0KSB7XG4gICAgICB0aGlzLnNldE5hbWUobmFtZSk7XG4gICAgICB0aGlzLnNldEFDTChhY2wpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSByb2xlLiAgWW91IGNhbiBhbHRlcm5hdGl2ZWx5IGNhbGwgcm9sZS5nZXQoXCJuYW1lXCIpXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBuYW1lIG9mIHRoZSByb2xlLlxuICAgKi9cbiAgZ2V0TmFtZSgpIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXQoJ25hbWUnKTtcbiAgICBpZiAobmFtZSA9PSBudWxsIHx8IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBuYW1lIGZvciBhIHJvbGUuIFRoaXMgdmFsdWUgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSByb2xlIGhhc1xuICAgKiBiZWVuIHNhdmVkIHRvIHRoZSBzZXJ2ZXIsIGFuZCBjYW5ub3QgYmUgc2V0IG9uY2UgdGhlIHJvbGUgaGFzIGJlZW5cbiAgICogc2F2ZWQuXG4gICAqXG4gICAqIDxwPlxuICAgKiAgIEEgcm9sZSdzIG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgXywgLSwgYW5kXG4gICAqICAgc3BhY2VzLlxuICAgKiA8L3A+XG4gICAqXG4gICAqIDxwPlRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIHJvbGUuc2V0KFwibmFtZVwiLCBuYW1lKTwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHJvbGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFN0YW5kYXJkIG9wdGlvbnMgb2JqZWN0IHdpdGggc3VjY2VzcyBhbmQgZXJyb3JcbiAgICogICAgIGNhbGxiYWNrcy5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdHxib29sZWFuKX0gdHJ1ZSBpZiB0aGUgc2V0IHN1Y2NlZWRlZC5cbiAgICovXG4gIHNldE5hbWUobmFtZSwgb3B0aW9ucykge1xuICAgIHRoaXMuX3ZhbGlkYXRlTmFtZShuYW1lKTtcbiAgICByZXR1cm4gdGhpcy5zZXQoJ25hbWUnLCBuYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBQYXJzZS5SZWxhdGlvbiBmb3IgdGhlIFBhcnNlLlVzZXJzIHRoYXQgYXJlIGRpcmVjdFxuICAgKiBjaGlsZHJlbiBvZiB0aGlzIHJvbGUuIFRoZXNlIHVzZXJzIGFyZSBncmFudGVkIGFueSBwcml2aWxlZ2VzIHRoYXQgdGhpc1xuICAgKiByb2xlIGhhcyBiZWVuIGdyYW50ZWQgKGUuZy4gcmVhZCBvciB3cml0ZSBhY2Nlc3MgdGhyb3VnaCBBQ0xzKS4gWW91IGNhblxuICAgKiBhZGQgb3IgcmVtb3ZlIHVzZXJzIGZyb20gdGhlIHJvbGUgdGhyb3VnaCB0aGlzIHJlbGF0aW9uLlxuICAgKlxuICAgKiA8cD5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyByb2xlLnJlbGF0aW9uKFwidXNlcnNcIik8L3A+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5SZWxhdGlvbn0gdGhlIHJlbGF0aW9uIGZvciB0aGUgdXNlcnMgYmVsb25naW5nIHRvIHRoaXNcbiAgICogICAgIHJvbGUuXG4gICAqL1xuICBnZXRVc2VycygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGlvbigndXNlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBQYXJzZS5SZWxhdGlvbiBmb3IgdGhlIFBhcnNlLlJvbGVzIHRoYXQgYXJlIGRpcmVjdFxuICAgKiBjaGlsZHJlbiBvZiB0aGlzIHJvbGUuIFRoZXNlIHJvbGVzJyB1c2VycyBhcmUgZ3JhbnRlZCBhbnkgcHJpdmlsZWdlcyB0aGF0XG4gICAqIHRoaXMgcm9sZSBoYXMgYmVlbiBncmFudGVkIChlLmcuIHJlYWQgb3Igd3JpdGUgYWNjZXNzIHRocm91Z2ggQUNMcykuIFlvdVxuICAgKiBjYW4gYWRkIG9yIHJlbW92ZSBjaGlsZCByb2xlcyBmcm9tIHRoaXMgcm9sZSB0aHJvdWdoIHRoaXMgcmVsYXRpb24uXG4gICAqXG4gICAqIDxwPlRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIHJvbGUucmVsYXRpb24oXCJyb2xlc1wiKTwvcD5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlJlbGF0aW9ufSB0aGUgcmVsYXRpb24gZm9yIHRoZSByb2xlcyBiZWxvbmdpbmcgdG8gdGhpc1xuICAgKiAgICAgcm9sZS5cbiAgICovXG4gIGdldFJvbGVzKCkge1xuICAgIHJldHVybiB0aGlzLnJlbGF0aW9uKCdyb2xlcycpO1xuICB9XG4gIF92YWxpZGF0ZU5hbWUobmV3TmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmV3TmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsIFwiQSByb2xlJ3MgbmFtZSBtdXN0IGJlIGEgU3RyaW5nLlwiKTtcbiAgICB9XG4gICAgaWYgKCEvXlswLTlhLXpBLVpcXC1fIF0rJC8udGVzdChuZXdOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgXCJBIHJvbGUncyBuYW1lIGNhbiBiZSBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIF8sIFwiICsgJy0sIGFuZCBzcGFjZXMuJyk7XG4gICAgfVxuICB9XG4gIHZhbGlkYXRlKGF0dHJzLCBvcHRpb25zKSB7XG4gICAgY29uc3QgaXNJbnZhbGlkID0gc3VwZXIudmFsaWRhdGUoYXR0cnMsIG9wdGlvbnMpO1xuICAgIGlmIChpc0ludmFsaWQpIHtcbiAgICAgIHJldHVybiBpc0ludmFsaWQ7XG4gICAgfVxuICAgIGlmICgnbmFtZScgaW4gYXR0cnMgJiYgYXR0cnMubmFtZSAhPT0gdGhpcy5nZXROYW1lKCkpIHtcbiAgICAgIGNvbnN0IG5ld05hbWUgPSBhdHRycy5uYW1lO1xuICAgICAgaWYgKHRoaXMuaWQgJiYgdGhpcy5pZCAhPT0gYXR0cnMub2JqZWN0SWQpIHtcbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBvYmplY3RJZCBiZWluZyBzZXQgbWF0Y2hlcyB0aGlzLmlkXG4gICAgICAgIC8vIFRoaXMgaGFwcGVucyBkdXJpbmcgYSBmZXRjaCAtLSB0aGUgaWQgaXMgc2V0IGJlZm9yZSBjYWxsaW5nIGZldGNoXG4gICAgICAgIC8vIExldCB0aGUgbmFtZSBiZSBzZXQgaW4gdGhpcyBjYXNlXG4gICAgICAgIHJldHVybiBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCBcIkEgcm9sZSdzIG5hbWUgY2FuIG9ubHkgYmUgc2V0IGJlZm9yZSBpdCBoYXMgYmVlbiBzYXZlZC5cIik7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZU5hbWUobmV3TmFtZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFBhcnNlUm9sZShQYXJzZVJvbGUpO1xuX1BhcnNlT2JqZWN0LmRlZmF1bHQucmVnaXN0ZXJTdWJjbGFzcygnX1JvbGUnLCBQYXJzZVJvbGUpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VSb2xlOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBfUGFyc2VDTFAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQ0xQXCIpKTtcbmNvbnN0IEZJRUxEX1RZUEVTID0gWydTdHJpbmcnLCAnTnVtYmVyJywgJ0Jvb2xlYW4nLCAnQnl0ZXMnLCAnRGF0ZScsICdGaWxlJywgJ0dlb1BvaW50JywgJ1BvbHlnb24nLCAnQXJyYXknLCAnT2JqZWN0JywgJ1BvaW50ZXInLCAnUmVsYXRpb24nXTtcbi8qKlxuICogQSBQYXJzZS5TY2hlbWEgb2JqZWN0IGlzIGZvciBoYW5kbGluZyBzY2hlbWEgZGF0YSBmcm9tIFBhcnNlLlxuICogPHA+QWxsIHRoZSBzY2hlbWFzIG1ldGhvZHMgcmVxdWlyZSBNYXN0ZXJLZXkuXG4gKlxuICogV2hlbiBhZGRpbmcgZmllbGRzLCB5b3UgbWF5IHNldCByZXF1aXJlZCBhbmQgZGVmYXVsdCB2YWx1ZXMuIChSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgMy43LjArKVxuICpcbiAqIDxwcmU+XG4gKiBjb25zdCBvcHRpb25zID0geyByZXF1aXJlZDogdHJ1ZSwgZGVmYXVsdFZhbHVlOiAnaGVsbG8gd29ybGQnIH07XG4gKiBjb25zdCBzY2hlbWEgPSBuZXcgUGFyc2UuU2NoZW1hKCdNeUNsYXNzJyk7XG4gKiBzY2hlbWEuYWRkU3RyaW5nKCdmaWVsZCcsIG9wdGlvbnMpO1xuICogc2NoZW1hLmFkZEluZGV4KCdpbmRleF9uYW1lJywgeyAnZmllbGQnOiAxIH0pO1xuICogc2NoZW1hLnNhdmUoKTtcbiAqIDwvcHJlPlxuICogPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5TY2hlbWFcbiAqL1xuY2xhc3MgUGFyc2VTY2hlbWEge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBQYXJzZSBDbGFzcyBzdHJpbmcuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGFzc05hbWUpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImNsYXNzTmFtZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2ZpZWxkc1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2luZGV4ZXNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9jbHBcIiwgdm9pZCAwKTtcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChjbGFzc05hbWUgPT09ICdVc2VyJyAmJiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1BFUkZPUk1fVVNFUl9SRVdSSVRFJykpIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAnX1VzZXInO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2ZpZWxkcyA9IHt9O1xuICAgIHRoaXMuX2luZGV4ZXMgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kIHRvIGdldCBhbGwgc2NoZW1hc1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBhbGwoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNjaGVtYUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5nZXQoJycpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2NoZW1hIG5vdCBmb3VuZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHRzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgU2NoZW1hIGZyb20gUGFyc2VcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBnZXQoKSB7XG4gICAgdGhpcy5hc3NlcnRDbGFzc05hbWUoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U2NoZW1hQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmdldCh0aGlzLmNsYXNzTmFtZSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2NoZW1hIG5vdCBmb3VuZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgU2NoZW1hIG9uIFBhcnNlXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgc2F2ZSgpIHtcbiAgICB0aGlzLmFzc2VydENsYXNzTmFtZSgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTY2hlbWFDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIGZpZWxkczogdGhpcy5fZmllbGRzLFxuICAgICAgaW5kZXhlczogdGhpcy5faW5kZXhlcyxcbiAgICAgIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogdGhpcy5fY2xwXG4gICAgfTtcbiAgICByZXR1cm4gY29udHJvbGxlci5jcmVhdGUodGhpcy5jbGFzc05hbWUsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgU2NoZW1hIG9uIFBhcnNlXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgdXBkYXRlKCkge1xuICAgIHRoaXMuYXNzZXJ0Q2xhc3NOYW1lKCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNjaGVtYUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLFxuICAgICAgZmllbGRzOiB0aGlzLl9maWVsZHMsXG4gICAgICBpbmRleGVzOiB0aGlzLl9pbmRleGVzLFxuICAgICAgY2xhc3NMZXZlbFBlcm1pc3Npb25zOiB0aGlzLl9jbHBcbiAgICB9O1xuICAgIHRoaXMuX2ZpZWxkcyA9IHt9O1xuICAgIHRoaXMuX2luZGV4ZXMgPSB7fTtcbiAgICByZXR1cm4gY29udHJvbGxlci51cGRhdGUodGhpcy5jbGFzc05hbWUsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZpbmcgYSBTY2hlbWEgZnJvbSBQYXJzZVxuICAgKiBDYW4gb25seSBiZSB1c2VkIG9uIFNjaGVtYSB3aXRob3V0IG9iamVjdHNcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBkZWxldGUoKSB7XG4gICAgdGhpcy5hc3NlcnRDbGFzc05hbWUoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U2NoZW1hQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmRlbGV0ZSh0aGlzLmNsYXNzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgb2JqZWN0cyBmcm9tIGEgU2NoZW1hIChjbGFzcykgaW4gUGFyc2UuXG4gICAqIEVYRVJDSVNFIENBVVRJT04sIHJ1bm5pbmcgdGhpcyB3aWxsIGRlbGV0ZSBhbGwgb2JqZWN0cyBmb3IgdGhpcyBzY2hlbWEgYW5kIGNhbm5vdCBiZSByZXZlcnNlZFxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIHB1cmdlKCkge1xuICAgIHRoaXMuYXNzZXJ0Q2xhc3NOYW1lKCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNjaGVtYUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5wdXJnZSh0aGlzLmNsYXNzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZXJ0IGlmIENsYXNzTmFtZSBoYXMgYmVlbiBmaWxsZWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFzc2VydENsYXNzTmFtZSgpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHNldCBhIENsYXNzIE5hbWUgYmVmb3JlIG1ha2luZyBhbnkgcmVxdWVzdC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBDbGFzcyBMZXZlbCBQZXJtaXNzaW9ucyB3aGVuIGNyZWF0aW5nIC8gdXBkYXRpbmcgYSBTY2hlbWEuXG4gICAqIEVYRVJDSVNFIENBVVRJT04sIHJ1bm5pbmcgdGhpcyBtYXkgb3ZlcnJpZGUgQ0xQIGZvciB0aGlzIHNjaGVtYSBhbmQgY2Fubm90IGJlIHJldmVyc2VkXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgUGFyc2UuQ0xQfSBjbHAgQ2xhc3MgTGV2ZWwgUGVybWlzc2lvbnNcbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHNldENMUChjbHApIHtcbiAgICBpZiAoY2xwIGluc3RhbmNlb2YgX1BhcnNlQ0xQLmRlZmF1bHQpIHtcbiAgICAgIHRoaXMuX2NscCA9IGNscC50b0pTT04oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2xwID0gY2xwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgYSBGaWVsZCB0byBDcmVhdGUgLyBVcGRhdGUgYSBTY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgQ2FuIGJlIGEgKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxEYXRlfFBhcnNlLkZpbGV8UGFyc2UuR2VvUG9pbnR8QXJyYXl8T2JqZWN0fFBvaW50ZXJ8UGFyc2UuUmVsYXRpb24pXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+cmVxdWlyZWQ6IElmIGZpZWxkIGlzIG5vdCBzZXQsIHNhdmUgb3BlcmF0aW9uIGZhaWxzIChSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgMy43LjArKVxuICAgKiAgIDxsaT5kZWZhdWx0VmFsdWU6IElmIGZpZWxkIGlzIG5vdCBzZXQsIGEgZGVmYXVsdCB2YWx1ZSBpcyBzZWxlY3RlZCAoUmVxdWlyZXMgUGFyc2UgU2VydmVyIDMuNy4wKylcbiAgICogICA8bGk+dGFyZ2V0Q2xhc3M6IFJlcXVpcmVkIGlmIHR5cGUgaXMgUG9pbnRlciBvciBQYXJzZS5SZWxhdGlvblxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkRmllbGQobmFtZSwgdHlwZSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICB0eXBlID0gdHlwZSB8fCAnU3RyaW5nJztcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmllbGQgbmFtZSBtYXkgbm90IGJlIG51bGwuJyk7XG4gICAgfVxuICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoRklFTERfVFlQRVMpLmNhbGwoRklFTERfVFlQRVMsIHR5cGUpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3R5cGV9IGlzIG5vdCBhIHZhbGlkIHR5cGUuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZFBvaW50ZXIobmFtZSwgb3B0aW9ucy50YXJnZXRDbGFzcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnUmVsYXRpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRSZWxhdGlvbihuYW1lLCBvcHRpb25zLnRhcmdldENsYXNzKTtcbiAgICB9XG4gICAgY29uc3QgZmllbGRPcHRpb25zID0ge1xuICAgICAgdHlwZVxuICAgIH07XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlcXVpcmVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGZpZWxkT3B0aW9ucy5yZXF1aXJlZCA9IG9wdGlvbnMucmVxdWlyZWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWVsZE9wdGlvbnMuZGVmYXVsdFZhbHVlID0gb3B0aW9ucy5kZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnRGF0ZScpIHtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGZpZWxkT3B0aW9ucy5kZWZhdWx0VmFsdWUgPSB7XG4gICAgICAgICAgX190eXBlOiAnRGF0ZScsXG4gICAgICAgICAgaXNvOiBuZXcgRGF0ZShvcHRpb25zLmRlZmF1bHRWYWx1ZSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdCeXRlcycpIHtcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGZpZWxkT3B0aW9ucy5kZWZhdWx0VmFsdWUgPSB7XG4gICAgICAgICAgX190eXBlOiAnQnl0ZXMnLFxuICAgICAgICAgIGJhc2U2NDogb3B0aW9ucy5kZWZhdWx0VmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZmllbGRzW25hbWVdID0gZmllbGRPcHRpb25zO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBhbiBJbmRleCB0byBDcmVhdGUgLyBVcGRhdGUgYSBTY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgaW5kZXhcbiAgICogQHBhcmFtIHtvYmplY3R9IGluZGV4IHsgZmllbGQ6IHZhbHVlIH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICpcbiAgICogPHByZT5cbiAgICogc2NoZW1hLmFkZEluZGV4KCdpbmRleF9uYW1lJywgeyAnZmllbGQnOiAxIH0pO1xuICAgKiA8L3ByZT5cbiAgICovXG4gIGFkZEluZGV4KG5hbWUsIGluZGV4KSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luZGV4IG5hbWUgbWF5IG5vdCBiZSBudWxsLicpO1xuICAgIH1cbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luZGV4IG1heSBub3QgYmUgbnVsbC4nKTtcbiAgICB9XG4gICAgdGhpcy5faW5kZXhlc1tuYW1lXSA9IGluZGV4O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBTdHJpbmcgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkU3RyaW5nKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnU3RyaW5nJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIE51bWJlciBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGROdW1iZXIobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdOdW1iZXInLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgQm9vbGVhbiBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRCb29sZWFuKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnQm9vbGVhbicsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBCeXRlcyBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRCeXRlcyhuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ0J5dGVzJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIERhdGUgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkRGF0ZShuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ0RhdGUnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgRmlsZSBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRGaWxlKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnRmlsZScsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBHZW9Qb2ludCBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRHZW9Qb2ludChuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ0dlb1BvaW50Jywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIFBvbHlnb24gRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkUG9seWdvbihuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ1BvbHlnb24nLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgQXJyYXkgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkQXJyYXkobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdBcnJheScsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBPYmplY3QgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkT2JqZWN0KG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnT2JqZWN0Jywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIFBvaW50ZXIgRmllbGRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gUGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldENsYXNzIE5hbWUgb2YgdGhlIHRhcmdldCBQb2ludGVyIENsYXNzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZFBvaW50ZXIobmFtZSwgdGFyZ2V0Q2xhc3MpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpZWxkIG5hbWUgbWF5IG5vdCBiZSBudWxsLicpO1xuICAgIH1cbiAgICBpZiAoIXRhcmdldENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHNldCB0aGUgdGFyZ2V0Q2xhc3Mgb2YgdGhlIFBvaW50ZXIuJyk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkT3B0aW9ucyA9IHtcbiAgICAgIHR5cGU6ICdQb2ludGVyJyxcbiAgICAgIHRhcmdldENsYXNzXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVxdWlyZWQgPT09ICdib29sZWFuJykge1xuICAgICAgZmllbGRPcHRpb25zLnJlcXVpcmVkID0gb3B0aW9ucy5yZXF1aXJlZDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpZWxkT3B0aW9ucy5kZWZhdWx0VmFsdWUgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChvcHRpb25zLmRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIF9QYXJzZU9iamVjdC5kZWZhdWx0KSB7XG4gICAgICAgIGZpZWxkT3B0aW9ucy5kZWZhdWx0VmFsdWUgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZS50b1BvaW50ZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZmllbGRzW25hbWVdID0gZmllbGRPcHRpb25zO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBSZWxhdGlvbiBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0Q2xhc3MgTmFtZSBvZiB0aGUgdGFyZ2V0IFBvaW50ZXIgQ2xhc3NcbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZFJlbGF0aW9uKG5hbWUsIHRhcmdldENsYXNzKSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpZWxkIG5hbWUgbWF5IG5vdCBiZSBudWxsLicpO1xuICAgIH1cbiAgICBpZiAoIXRhcmdldENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHNldCB0aGUgdGFyZ2V0Q2xhc3Mgb2YgdGhlIFJlbGF0aW9uLicpO1xuICAgIH1cbiAgICB0aGlzLl9maWVsZHNbbmFtZV0gPSB7XG4gICAgICB0eXBlOiAnUmVsYXRpb24nLFxuICAgICAgdGFyZ2V0Q2xhc3NcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0aW5nIGEgRmllbGQgdG8gVXBkYXRlIG9uIGEgU2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkXG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBkZWxldGVGaWVsZChuYW1lKSB7XG4gICAgdGhpcy5fZmllbGRzW25hbWVdID0ge1xuICAgICAgX19vcDogJ0RlbGV0ZSdcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0aW5nIGFuIEluZGV4IHRvIFVwZGF0ZSBvbiBhIFNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZFxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZGVsZXRlSW5kZXgobmFtZSkge1xuICAgIHRoaXMuX2luZGV4ZXNbbmFtZV0gPSB7XG4gICAgICBfX29wOiAnRGVsZXRlJ1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBzZW5kKGNsYXNzTmFtZSwgbWV0aG9kKSB7XG4gICAgbGV0IHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KG1ldGhvZCwgYHNjaGVtYXMvJHtjbGFzc05hbWV9YCwgcGFyYW1zLCB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9KTtcbiAgfSxcbiAgZ2V0KGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLnNlbmQoY2xhc3NOYW1lLCAnR0VUJyk7XG4gIH0sXG4gIGNyZWF0ZShjbGFzc05hbWUsIHBhcmFtcykge1xuICAgIHJldHVybiB0aGlzLnNlbmQoY2xhc3NOYW1lLCAnUE9TVCcsIHBhcmFtcyk7XG4gIH0sXG4gIHVwZGF0ZShjbGFzc05hbWUsIHBhcmFtcykge1xuICAgIHJldHVybiB0aGlzLnNlbmQoY2xhc3NOYW1lLCAnUFVUJywgcGFyYW1zKTtcbiAgfSxcbiAgZGVsZXRlKGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLnNlbmQoY2xhc3NOYW1lLCAnREVMRVRFJyk7XG4gIH0sXG4gIHB1cmdlKGNsYXNzTmFtZSkge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnREVMRVRFJywgYHB1cmdlLyR7Y2xhc3NOYW1lfWAsIHt9LCB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9KTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFNjaGVtYUNvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VTY2hlbWE7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2lzUmV2b2NhYmxlU2Vzc2lvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaXNSZXZvY2FibGVTZXNzaW9uXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBfUGFyc2VVc2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVVzZXJcIikpO1xuLyoqXG4gKiA8cD5BIFBhcnNlLlNlc3Npb24gb2JqZWN0IGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpb24gb2YgYSByZXZvY2FibGUgc2Vzc2lvbi5cbiAqIFRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiBhIFBhcnNlLk9iamVjdCwgYW5kIHJldGFpbnMgdGhlIHNhbWVcbiAqIGZ1bmN0aW9uYWxpdHkgb2YgYSBQYXJzZS5PYmplY3QuPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5TZXNzaW9uXG4gKiBAYXVnbWVudHMgUGFyc2UuT2JqZWN0XG4gKi9cbmNsYXNzIFBhcnNlU2Vzc2lvbiBleHRlbmRzIF9QYXJzZU9iamVjdC5kZWZhdWx0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIFRoZSBpbml0aWFsIHNldCBvZiBkYXRhIHRvIHN0b3JlIGluIHRoZSB1c2VyLlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykge1xuICAgIHN1cGVyKCdfU2Vzc2lvbicpO1xuICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKCF0aGlzLnNldChhdHRyaWJ1dGVzIHx8IHt9KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgYW4gaW52YWxpZCBTZXNzaW9uXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIHRva2VuIHN0cmluZy5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFNlc3Npb25Ub2tlbigpIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0KCdzZXNzaW9uVG9rZW4nKTtcbiAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgc3RhdGljIHJlYWRPbmx5QXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydjcmVhdGVkV2l0aCcsICdleHBpcmVzQXQnLCAnaW5zdGFsbGF0aW9uSWQnLCAncmVzdHJpY3RlZCcsICdzZXNzaW9uVG9rZW4nLCAndXNlciddO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgU2Vzc2lvbiBvYmplY3QgZm9yIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIHVzZU1hc3RlcktleVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSBQYXJzZS5TZXNzaW9uXG4gICAqIG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBmZXRjaGVkLiBJZiB0aGVyZSBpcyBubyBjdXJyZW50IHVzZXIsIHRoZVxuICAgKiBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNlc3Npb25Db250cm9sbGVyKCk7XG4gICAgY29uc3Qgc2Vzc2lvbk9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHNlc3Npb25PcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICByZXR1cm4gX1BhcnNlVXNlci5kZWZhdWx0LmN1cnJlbnRBc3luYygpLnRoZW4odXNlciA9PiB7XG4gICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdUaGVyZSBpcyBubyBjdXJyZW50IHVzZXIuJyk7XG4gICAgICB9XG4gICAgICBzZXNzaW9uT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSB1c2VyLmdldFNlc3Npb25Ub2tlbigpO1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0U2Vzc2lvbihzZXNzaW9uT3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNlc3Npb24gdG9rZW4gaXMgcmV2b2NhYmxlLlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIG1pZ3JhdGluZyBFeHByZXNzLmpzIG9yIE5vZGUuanMgd2ViIGFwcHMgdG9cbiAgICogdXNlIHJldm9jYWJsZSBzZXNzaW9ucy4gSWYgeW91IGFyZSBtaWdyYXRpbmcgYW4gYXBwIHRoYXQgdXNlcyB0aGUgUGFyc2VcbiAgICogU0RLIGluIHRoZSBicm93c2VyIG9ubHksIHBsZWFzZSB1c2UgUGFyc2UuVXNlci5lbmFibGVSZXZvY2FibGVTZXNzaW9uKClcbiAgICogaW5zdGVhZCwgc28gdGhhdCBzZXNzaW9ucyBjYW4gYmUgYXV0b21hdGljYWxseSB1cGdyYWRlZC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0N1cnJlbnRTZXNzaW9uUmV2b2NhYmxlKCkge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gX1BhcnNlVXNlci5kZWZhdWx0LmN1cnJlbnQoKTtcbiAgICBpZiAoY3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiAoMCwgX2lzUmV2b2NhYmxlU2Vzc2lvbi5kZWZhdWx0KShjdXJyZW50VXNlci5nZXRTZXNzaW9uVG9rZW4oKSB8fCAnJyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuX1BhcnNlT2JqZWN0LmRlZmF1bHQucmVnaXN0ZXJTdWJjbGFzcygnX1Nlc3Npb24nLCBQYXJzZVNlc3Npb24pO1xuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIGdldFNlc3Npb24ob3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gbmV3IFBhcnNlU2Vzc2lvbigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAnc2Vzc2lvbnMvbWUnLCB7fSwgb3B0aW9ucykudGhlbihzZXNzaW9uRGF0YSA9PiB7XG4gICAgICBzZXNzaW9uLl9maW5pc2hGZXRjaChzZXNzaW9uRGF0YSk7XG4gICAgICBzZXNzaW9uLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgICAgcmV0dXJuIHNlc3Npb247XG4gICAgfSk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRTZXNzaW9uQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZVNlc3Npb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5MiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIikpO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfaXNSZXZvY2FibGVTZXNzaW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9pc1Jldm9jYWJsZVNlc3Npb25cIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBfU3RvcmFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZVwiKSk7XG5jb25zdCBDVVJSRU5UX1VTRVJfS0VZID0gJ2N1cnJlbnRVc2VyJztcbmxldCBjYW5Vc2VDdXJyZW50VXNlciA9ICFfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0lTX05PREUnKTtcbmxldCBjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2sgPSBmYWxzZTtcbmxldCBjdXJyZW50VXNlckNhY2hlID0gbnVsbDtcbmNvbnN0IGF1dGhQcm92aWRlcnMgPSB7fTtcblxuLyoqXG4gKiA8cD5BIFBhcnNlLlVzZXIgb2JqZWN0IGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpb24gb2YgYSB1c2VyIHBlcnNpc3RlZCB0byB0aGVcbiAqIFBhcnNlIGNsb3VkLiBUaGlzIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgYSBQYXJzZS5PYmplY3QsIGFuZCByZXRhaW5zIHRoZVxuICogc2FtZSBmdW5jdGlvbmFsaXR5IG9mIGEgUGFyc2UuT2JqZWN0LCBidXQgYWxzbyBleHRlbmRzIGl0IHdpdGggdmFyaW91c1xuICogdXNlciBzcGVjaWZpYyBtZXRob2RzLCBsaWtlIGF1dGhlbnRpY2F0aW9uLCBzaWduaW5nIHVwLCBhbmQgdmFsaWRhdGlvbiBvZlxuICogdW5pcXVlbmVzcy48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLlVzZXJcbiAqIEBhdWdtZW50cyBQYXJzZS5PYmplY3RcbiAqL1xuY2xhc3MgUGFyc2VVc2VyIGV4dGVuZHMgX1BhcnNlT2JqZWN0LmRlZmF1bHQge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgVGhlIGluaXRpYWwgc2V0IG9mIGRhdGEgdG8gc3RvcmUgaW4gdGhlIHVzZXIuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7XG4gICAgc3VwZXIoJ19Vc2VyJyk7XG4gICAgaWYgKGF0dHJpYnV0ZXMgJiYgdHlwZW9mIGF0dHJpYnV0ZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoIXRoaXMuc2V0KGF0dHJpYnV0ZXMgfHwge30pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSBhbiBpbnZhbGlkIFBhcnNlIFVzZXJcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYSByZXZvY2FibGUgc2Vzc2lvbiB0b2tlbiB0byByZXBsYWNlIHRoZSBvbGRlciBzdHlsZSBvZiB0b2tlbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIHJlcGxhY2VtZW50XG4gICAqICAgdG9rZW4gaGFzIGJlZW4gZmV0Y2hlZC5cbiAgICovXG4gIF91cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCB1cGdyYWRlT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgdXBncmFkZU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnVwZ3JhZGVUb1Jldm9jYWJsZVNlc3Npb24odGhpcywgdXBncmFkZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFsbG93cyB5b3UgdG8gbGluayB5b3VyIHVzZXJzIHdpdGgge0BsaW5rIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9wYXJzZS1zZXJ2ZXIvZ3VpZGUvI29hdXRoLWFuZC0zcmQtcGFydHktYXV0aGVudGljYXRpb24gM3JkIHBhcnR5IGF1dGhlbnRpY2F0aW9ufSwgZW5hYmxpbmdcbiAgICogeW91ciB1c2VycyB0byBzaWduIHVwIG9yIGxvZyBpbnRvIHlvdXIgYXBwbGljYXRpb24gdXNpbmcgdGhlaXIgZXhpc3RpbmcgaWRlbnRpdGllcy5cbiAgICogU2luY2UgMi45LjBcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL2pzL2d1aWRlLyNsaW5raW5nLXVzZXJzIExpbmtpbmcgVXNlcnN9XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXV0aFByb3ZpZGVyfSBwcm92aWRlciBOYW1lIG9mIGF1dGggcHJvdmlkZXIgb3Ige0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvQXV0aFByb3ZpZGVyLmh0bWwgQXV0aFByb3ZpZGVyfVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuYXV0aERhdGFdIEF1dGhEYXRhIHRvIGxpbmsgd2l0aFxuICAgKiA8dWw+XG4gICAqICAgPGxpPklmIHByb3ZpZGVyIGlzIHN0cmluZywgb3B0aW9ucyBpcyB7QGxpbmsgaHR0cDovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvcGFyc2Utc2VydmVyL2d1aWRlLyNzdXBwb3J0ZWQtM3JkLXBhcnR5LWF1dGhlbnRpY2F0aW9ucyBhdXRoRGF0YX1cbiAgICogICA8bGk+SWYgcHJvdmlkZXIgaXMgQXV0aFByb3ZpZGVyLCBvcHRpb25zIGlzIHNhdmVPcHRzXG4gICAqIDwvdWw+XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzYXZlT3B0cyB1c2VNYXN0ZXJLZXkgLyBzZXNzaW9uVG9rZW5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIGlzIGxpbmtlZFxuICAgKi9cbiAgbGlua1dpdGgocHJvdmlkZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgc2F2ZU9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHNhdmVPcHRzLnNlc3Npb25Ub2tlbiA9IHNhdmVPcHRzLnNlc3Npb25Ub2tlbiB8fCB0aGlzLmdldFNlc3Npb25Ub2tlbigpIHx8ICcnO1xuICAgIGxldCBhdXRoVHlwZTtcbiAgICBpZiAodHlwZW9mIHByb3ZpZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgYXV0aFR5cGUgPSBwcm92aWRlcjtcbiAgICAgIGlmIChhdXRoUHJvdmlkZXJzW3Byb3ZpZGVyXSkge1xuICAgICAgICBwcm92aWRlciA9IGF1dGhQcm92aWRlcnNbcHJvdmlkZXJdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYXV0aFByb3ZpZGVyID0ge1xuICAgICAgICAgIHJlc3RvcmVBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0QXV0aFR5cGUoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXV0aFR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhdXRoUHJvdmlkZXJzW2F1dGhQcm92aWRlci5nZXRBdXRoVHlwZSgpXSA9IGF1dGhQcm92aWRlcjtcbiAgICAgICAgcHJvdmlkZXIgPSBhdXRoUHJvdmlkZXI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF1dGhUeXBlID0gcHJvdmlkZXIuZ2V0QXV0aFR5cGUoKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYXV0aERhdGEnKSkge1xuICAgICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKSB8fCB7fTtcbiAgICAgIGlmICh0eXBlb2YgYXV0aERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0eXBlOiBhdXRoRGF0YSBmaWVsZCBzaG91bGQgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICBhdXRoRGF0YVthdXRoVHlwZV0gPSBvcHRpb25zLmF1dGhEYXRhO1xuICAgICAgY29uc3Qgb2xkQW5vbnltb3VzRGF0YSA9IGF1dGhEYXRhLmFub255bW91cztcbiAgICAgIHRoaXMuc3RyaXBBbm9ueW1pdHkoKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIubGlua1dpdGgodGhpcywgYXV0aERhdGEsIHNhdmVPcHRzKS5jYXRjaChlID0+IHtcbiAgICAgICAgZGVsZXRlIGF1dGhEYXRhW2F1dGhUeXBlXTtcbiAgICAgICAgdGhpcy5yZXN0b3JlQW5vbmltaXR5KG9sZEFub255bW91c0RhdGEpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHByb3ZpZGVyLmF1dGhlbnRpY2F0ZSh7XG4gICAgICAgICAgc3VjY2VzczogKHByb3ZpZGVyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSB7fTtcbiAgICAgICAgICAgIG9wdHMuYXV0aERhdGEgPSByZXN1bHQ7XG4gICAgICAgICAgICB0aGlzLmxpbmtXaXRoKHByb3ZpZGVyLCBvcHRzLCBzYXZlT3B0cykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAocHJvdmlkZXIsIGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHByb3ZpZGVyXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy5hdXRoRGF0YV1cbiAgICogQHBhcmFtIHNhdmVPcHRzXG4gICAqIEBkZXByZWNhdGVkIHNpbmNlIDIuOS4wIHNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5Vc2VyLmh0bWwjbGlua1dpdGggbGlua1dpdGh9XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgX2xpbmtXaXRoKHByb3ZpZGVyLCBvcHRpb25zKSB7XG4gICAgbGV0IHNhdmVPcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICByZXR1cm4gdGhpcy5saW5rV2l0aChwcm92aWRlciwgb3B0aW9ucywgc2F2ZU9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXplcyBhdXRoIGRhdGEgZm9yIGEgcHJvdmlkZXIgKGUuZy4gcHV0cyB0aGUgYWNjZXNzIHRva2VuIGluIHRoZVxuICAgKiByaWdodCBwbGFjZSB0byBiZSB1c2VkIGJ5IHRoZSBGYWNlYm9vayBTREspLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJcbiAgICovXG4gIF9zeW5jaHJvbml6ZUF1dGhEYXRhKHByb3ZpZGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzQ3VycmVudCgpIHx8ICFwcm92aWRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgYXV0aFR5cGU7XG4gICAgaWYgKHR5cGVvZiBwcm92aWRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGF1dGhUeXBlID0gcHJvdmlkZXI7XG4gICAgICBwcm92aWRlciA9IGF1dGhQcm92aWRlcnNbYXV0aFR5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdXRoVHlwZSA9IHByb3ZpZGVyLmdldEF1dGhUeXBlKCk7XG4gICAgfVxuICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJyk7XG4gICAgaWYgKCFwcm92aWRlciB8fCAhYXV0aERhdGEgfHwgdHlwZW9mIGF1dGhEYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdWNjZXNzID0gcHJvdmlkZXIucmVzdG9yZUF1dGhlbnRpY2F0aW9uKGF1dGhEYXRhW2F1dGhUeXBlXSk7XG4gICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICB0aGlzLl91bmxpbmtGcm9tKHByb3ZpZGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25pemVzIGF1dGhEYXRhIGZvciBhbGwgcHJvdmlkZXJzLlxuICAgKi9cbiAgX3N5bmNocm9uaXplQWxsQXV0aERhdGEoKSB7XG4gICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKTtcbiAgICBpZiAodHlwZW9mIGF1dGhEYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdXRoRGF0YSkge1xuICAgICAgdGhpcy5fc3luY2hyb25pemVBdXRoRGF0YShrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIG51bGwgdmFsdWVzIGZyb20gYXV0aERhdGEgKHdoaWNoIGV4aXN0IHRlbXBvcmFyaWx5IGZvciB1bmxpbmtpbmcpXG4gICAqL1xuICBfY2xlYW51cEF1dGhEYXRhKCkge1xuICAgIGlmICghdGhpcy5pc0N1cnJlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpO1xuICAgIGlmICh0eXBlb2YgYXV0aERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGF1dGhEYXRhKSB7XG4gICAgICBpZiAoIWF1dGhEYXRhW2tleV0pIHtcbiAgICAgICAgZGVsZXRlIGF1dGhEYXRhW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVubGlua3MgYSB1c2VyIGZyb20gYSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEF1dGhQcm92aWRlcn0gcHJvdmlkZXIgTmFtZSBvZiBhdXRoIHByb3ZpZGVyIG9yIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL0F1dGhQcm92aWRlci5odG1sIEF1dGhQcm92aWRlcn1cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgTWFzdGVyS2V5IC8gU2Vzc2lvblRva2VuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgdW5saW5raW5nXG4gICAqICAgICBmaW5pc2hlcy5cbiAgICovXG4gIF91bmxpbmtGcm9tKHByb3ZpZGVyLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubGlua1dpdGgocHJvdmlkZXIsIHtcbiAgICAgIGF1dGhEYXRhOiBudWxsXG4gICAgfSwgb3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9zeW5jaHJvbml6ZUF1dGhEYXRhKHByb3ZpZGVyKTtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodGhpcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSB1c2VyIGlzIGxpbmtlZCB0byBhIHNlcnZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwcm92aWRlciBzZXJ2aWNlIHRvIGxpbmsgdG9cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgbGluayB3YXMgc3VjY2Vzc2Z1bFxuICAgKi9cbiAgX2lzTGlua2VkKHByb3ZpZGVyKSB7XG4gICAgbGV0IGF1dGhUeXBlO1xuICAgIGlmICh0eXBlb2YgcHJvdmlkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBhdXRoVHlwZSA9IHByb3ZpZGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdXRoVHlwZSA9IHByb3ZpZGVyLmdldEF1dGhUeXBlKCk7XG4gICAgfVxuICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJykgfHwge307XG4gICAgaWYgKHR5cGVvZiBhdXRoRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhYXV0aERhdGFbYXV0aFR5cGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlYXV0aGVudGljYXRlcyBhbGwgcHJvdmlkZXJzLlxuICAgKi9cbiAgX2xvZ091dFdpdGhBbGwoKSB7XG4gICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKTtcbiAgICBpZiAodHlwZW9mIGF1dGhEYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdXRoRGF0YSkge1xuICAgICAgdGhpcy5fbG9nT3V0V2l0aChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWF1dGhlbnRpY2F0ZXMgYSBzaW5nbGUgcHJvdmlkZXIgKGUuZy4gcmVtb3ZpbmcgYWNjZXNzIHRva2VucyBmcm9tIHRoZVxuICAgKiBGYWNlYm9vayBTREspLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvdmlkZXIgc2VydmljZSB0byBsb2dvdXQgb2ZcbiAgICovXG4gIF9sb2dPdXRXaXRoKHByb3ZpZGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzQ3VycmVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvdmlkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcm92aWRlciA9IGF1dGhQcm92aWRlcnNbcHJvdmlkZXJdO1xuICAgIH1cbiAgICBpZiAocHJvdmlkZXIgJiYgcHJvdmlkZXIuZGVhdXRoZW50aWNhdGUpIHtcbiAgICAgIHByb3ZpZGVyLmRlYXV0aGVudGljYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsYXNzIGluc3RhbmNlIG1ldGhvZCB1c2VkIHRvIG1haW50YWluIHNwZWNpZmljIGtleXMgd2hlbiBhIGZldGNoIG9jY3Vycy5cbiAgICogVXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgc2Vzc2lvbiB0b2tlbiBpcyBub3QgbG9zdC5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH0gc2Vzc2lvblRva2VuXG4gICAqL1xuICBfcHJlc2VydmVGaWVsZHNPbkZldGNoKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXNzaW9uVG9rZW46IHRoaXMuZ2V0KCdzZXNzaW9uVG9rZW4nKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIDxjb2RlPmN1cnJlbnQ8L2NvZGU+IHdvdWxkIHJldHVybiB0aGlzIHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHVzZXIgaXMgY2FjaGVkIG9uIGRpc2tcbiAgICovXG4gIGlzQ3VycmVudCgpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gUGFyc2VVc2VyLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gISFjdXJyZW50ICYmIGN1cnJlbnQuaWQgPT09IHRoaXMuaWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIDxjb2RlPmN1cnJlbnQ8L2NvZGU+IHdvdWxkIHJldHVybiB0aGlzIHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSB0cnVlIGlmIHVzZXIgaXMgY2FjaGVkIG9uIGRpc2tcbiAgICovXG4gIGFzeW5jIGlzQ3VycmVudEFzeW5jKCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBQYXJzZVVzZXIuY3VycmVudEFzeW5jKCk7XG4gICAgcmV0dXJuICEhY3VycmVudCAmJiBjdXJyZW50LmlkID09PSB0aGlzLmlkO1xuICB9XG4gIHN0cmlwQW5vbnltaXR5KCkge1xuICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJyk7XG4gICAgaWYgKGF1dGhEYXRhICYmIHR5cGVvZiBhdXRoRGF0YSA9PT0gJ29iamVjdCcgJiYgYXV0aERhdGEuaGFzT3duUHJvcGVydHkoJ2Fub255bW91cycpKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHNldCBhbm9ueW1vdXMgdG8gbnVsbCBpbnN0ZWFkIG9mIGRlbGV0aW5nIGl0IGluIG9yZGVyIHRvIHJlbW92ZSBpdCBmcm9tIFBhcnNlLlxuICAgICAgYXV0aERhdGEuYW5vbnltb3VzID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmVzdG9yZUFub25pbWl0eShhbm9ueW1vdXNEYXRhKSB7XG4gICAgaWYgKGFub255bW91c0RhdGEpIHtcbiAgICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJyk7XG4gICAgICBhdXRoRGF0YS5hbm9ueW1vdXMgPSBhbm9ueW1vdXNEYXRhO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGdldChcInVzZXJuYW1lXCIpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0VXNlcm5hbWUoKSB7XG4gICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLmdldCgndXNlcm5hbWUnKTtcbiAgICBpZiAodXNlcm5hbWUgPT0gbnVsbCB8fCB0eXBlb2YgdXNlcm5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdXNlcm5hbWU7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBzZXQoXCJ1c2VybmFtZVwiLCB1c2VybmFtZSwgb3B0aW9ucykgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJuYW1lXG4gICAqL1xuICBzZXRVc2VybmFtZSh1c2VybmFtZSkge1xuICAgIHRoaXMuc3RyaXBBbm9ueW1pdHkoKTtcbiAgICB0aGlzLnNldCgndXNlcm5hbWUnLCB1c2VybmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgc2V0KFwicGFzc3dvcmRcIiwgcGFzc3dvcmQsIG9wdGlvbnMpIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBVc2VyJ3MgUGFzc3dvcmRcbiAgICovXG4gIHNldFBhc3N3b3JkKHBhc3N3b3JkKSB7XG4gICAgdGhpcy5zZXQoJ3Bhc3N3b3JkJywgcGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ2V0KFwiZW1haWxcIikuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFVzZXIncyBFbWFpbFxuICAgKi9cbiAgZ2V0RW1haWwoKSB7XG4gICAgY29uc3QgZW1haWwgPSB0aGlzLmdldCgnZW1haWwnKTtcbiAgICBpZiAoZW1haWwgPT0gbnVsbCB8fCB0eXBlb2YgZW1haWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZW1haWw7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBzZXQoXCJlbWFpbFwiLCBlbWFpbCkgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2V0RW1haWwoZW1haWwpIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoJ2VtYWlsJywgZW1haWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNlc3Npb24gdG9rZW4gZm9yIHRoaXMgdXNlciwgaWYgdGhlIHVzZXIgaGFzIGJlZW4gbG9nZ2VkIGluLFxuICAgKiBvciBpZiBpdCBpcyB0aGUgcmVzdWx0IG9mIGEgcXVlcnkgd2l0aCB0aGUgbWFzdGVyIGtleS4gT3RoZXJ3aXNlLCByZXR1cm5zXG4gICAqIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHNlc3Npb24gdG9rZW4sIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0U2Vzc2lvblRva2VuKCkge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXQoJ3Nlc3Npb25Ub2tlbicpO1xuICAgIGlmICh0b2tlbiA9PSBudWxsIHx8IHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgdXNlciBpcyB0aGUgY3VycmVudCB1c2VyIGFuZCBoYXMgYmVlbiBhdXRoZW50aWNhdGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGlzIHVzZXIgaXMgdGhlIGN1cnJlbnQgdXNlciBhbmQgaXMgbG9nZ2VkIGluLlxuICAgKi9cbiAgYXV0aGVudGljYXRlZCgpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gUGFyc2VVc2VyLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gISF0aGlzLmdldCgnc2Vzc2lvblRva2VuJykgJiYgISFjdXJyZW50ICYmIGN1cnJlbnQuaWQgPT09IHRoaXMuaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdXAgYSBuZXcgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgaW5zdGVhZCBvZiBzYXZlIGZvclxuICAgKiBuZXcgUGFyc2UuVXNlcnMuIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgUGFyc2UuVXNlciBvbiB0aGUgc2VydmVyLCBhbmRcbiAgICogYWxzbyBwZXJzaXN0IHRoZSBzZXNzaW9uIG9uIGRpc2sgc28gdGhhdCB5b3UgY2FuIGFjY2VzcyB0aGUgdXNlciB1c2luZ1xuICAgKiA8Y29kZT5jdXJyZW50PC9jb2RlPi5cbiAgICpcbiAgICogPHA+QSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgc2lnblVwLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJzIEV4dHJhIGZpZWxkcyB0byBzZXQgb24gdGhlIG5ldyB1c2VyLCBvciBudWxsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHNpZ251cFxuICAgKiAgICAgZmluaXNoZXMuXG4gICAqL1xuICBzaWduVXAoYXR0cnMsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBzaWdudXBPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBzaWdudXBPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaW5zdGFsbGF0aW9uSWQnKSkge1xuICAgICAgc2lnbnVwT3B0aW9ucy5pbnN0YWxsYXRpb25JZCA9IG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9wdGlvbnMuY29udGV4dCkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICBzaWdudXBPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnNpZ25VcCh0aGlzLCBhdHRycywgc2lnbnVwT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBpbiBhIFBhcnNlLlVzZXIuIE9uIHN1Y2Nlc3MsIHRoaXMgc2F2ZXMgdGhlIHNlc3Npb24gdG8gZGlzayxcbiAgICogc28geW91IGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIHVzaW5nXG4gICAqIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LlxuICAgKlxuICAgKiA8cD5BIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyBsb2dJbi48L3A+XG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgbG9naW4gaXMgY29tcGxldGUuXG4gICAqL1xuICBsb2dJbigpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgbG9naW5PcHRpb25zID0ge1xuICAgICAgdXNlUG9zdDogdHJ1ZVxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBsb2dpbk9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdpbnN0YWxsYXRpb25JZCcpKSB7XG4gICAgICBsb2dpbk9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgPSBvcHRpb25zLmluc3RhbGxhdGlvbklkO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlUG9zdCcpKSB7XG4gICAgICBsb2dpbk9wdGlvbnMudXNlUG9zdCA9IG9wdGlvbnMudXNlUG9zdDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob3B0aW9ucy5jb250ZXh0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIGxvZ2luT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5sb2dJbih0aGlzLCBsb2dpbk9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGRlZmF1bHQgc2F2ZSBiZWhhdmlvciB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gc2F2ZSB0byBsb2NhbFxuICAgKiBzdG9yYWdlIGlmIHRoaXMgaXMgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBhd2FpdCBzdXBlci5zYXZlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmlzQ3VycmVudEFzeW5jKCk7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpLnVwZGF0ZVVzZXJPbkRpc2sodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGRlZmF1bHQgZGVzdHJveSBiZWhhdmlvciB3aXRoIGZ1bmN0aW9uYWxpdHkgdGhhdCBsb2dzIG91dFxuICAgKiB0aGUgY3VycmVudCB1c2VyIHdoZW4gaXQgaXMgZGVzdHJveWVkXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5Vc2VyfVxuICAgKi9cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuZGVzdHJveS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5pc0N1cnJlbnRBc3luYygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKS5yZW1vdmVVc2VyRnJvbURpc2soKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZGVmYXVsdCBmZXRjaCBiZWhhdmlvciB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gc2F2ZSB0byBsb2NhbFxuICAgKiBzdG9yYWdlIGlmIHRoaXMgaXMgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuVXNlcn1cbiAgICovXG4gIGFzeW5jIGZldGNoKCkge1xuICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgYXJnc1tfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgIH1cbiAgICBhd2FpdCBzdXBlci5mZXRjaC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdGhpcy5pc0N1cnJlbnRBc3luYygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKS51cGRhdGVVc2VyT25EaXNrKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBkZWZhdWx0IGZldGNoV2l0aEluY2x1ZGUgYmVoYXZpb3Igd2l0aCBmdW5jdGlvbmFsaXR5IHRvIHNhdmUgdG8gbG9jYWxcbiAgICogc3RvcmFnZSBpZiB0aGlzIGlzIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1BhcnNlLlVzZXJ9XG4gICAqL1xuICBhc3luYyBmZXRjaFdpdGhJbmNsdWRlKCkge1xuICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuICAgIH1cbiAgICBhd2FpdCBzdXBlci5mZXRjaFdpdGhJbmNsdWRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmlzQ3VycmVudEFzeW5jKCk7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpLnVwZGF0ZVVzZXJPbkRpc2sodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB3aGV0aGVyIGEgZ2l2ZW4gcGFzc3dvcmQgaXMgdGhlIHBhc3N3b3JkIG9mIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gYmUgdmVyaWZpZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmlnbm9yZUVtYWlsVmVyaWZpY2F0aW9uXSBTZXQgdG8gYHRydWVgIHRvIGJ5cGFzcyBlbWFpbCB2ZXJpZmljYXRpb24gYW5kIHZlcmlmeVxuICAgKiB0aGUgcGFzc3dvcmQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBlbWFpbCBoYXMgYmVlbiB2ZXJpZmllZC4gVGhpcyByZXF1aXJlcyB0aGUgbWFzdGVyIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGEgdXNlciB3aGVuIHRoZSBwYXNzd29yZCBpcyBjb3JyZWN0LlxuICAgKi9cbiAgdmVyaWZ5UGFzc3dvcmQocGFzc3dvcmQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZ2V0VXNlcm5hbWUoKSB8fCAnJztcbiAgICByZXR1cm4gUGFyc2VVc2VyLnZlcmlmeVBhc3N3b3JkKHVzZXJuYW1lLCBwYXNzd29yZCwgb3B0aW9ucyk7XG4gIH1cbiAgc3RhdGljIHJlYWRPbmx5QXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydzZXNzaW9uVG9rZW4nXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIGV4aXN0aW5nIFBhcnNlLlVzZXIgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwcm90b1Byb3BzIEEgc2V0IG9mIHByb3BlcnRpZXMgdG8gYWRkIHRvIHRoZSBwcm90b3R5cGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNsYXNzUHJvcHMgQSBzZXQgb2Ygc3RhdGljIHByb3BlcnRpZXMgdG8gYWRkIHRvIHRoZSBjbGFzc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5Vc2VyfSBUaGUgbmV3bHkgZXh0ZW5kZWQgUGFyc2UuVXNlciBjbGFzc1xuICAgKi9cbiAgc3RhdGljIGV4dGVuZChwcm90b1Byb3BzLCBjbGFzc1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwcm90b1Byb3BzKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY2xhc3NOYW1lJykge1xuICAgICAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkuZGVmYXVsdCkoUGFyc2VVc2VyLnByb3RvdHlwZSwgcHJvcCwge1xuICAgICAgICAgICAgdmFsdWU6IHByb3RvUHJvcHNbcHJvcF0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNsYXNzUHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBjbGFzc1Byb3BzKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY2xhc3NOYW1lJykge1xuICAgICAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkuZGVmYXVsdCkoUGFyc2VVc2VyLCBwcm9wLCB7XG4gICAgICAgICAgICB2YWx1ZTogY2xhc3NQcm9wc1twcm9wXSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUGFyc2VVc2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiBQYXJzZVVzZXIgd2l0aCBhIHZhbGlkIHNlc3Npb24sXG4gICAqIGVpdGhlciBmcm9tIG1lbW9yeSBvciBsb2NhbFN0b3JhZ2UsIGlmIG5lY2Vzc2FyeS5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBUaGUgY3VycmVudGx5IGxvZ2dlZCBpbiBQYXJzZS5Vc2VyLlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgaWYgKCFjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmN1cnJlbnRVc2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIFBhcnNlVXNlciBmcm9tIGFzeW5jaHJvbm91cyBTdG9yYWdlLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSBjdXJyZW50bHlcbiAgICogICBsb2dnZWQgaW4gUGFyc2UgVXNlclxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnRBc3luYygpIHtcbiAgICBpZiAoIWNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5jdXJyZW50VXNlckFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdXAgYSBuZXcgdXNlciB3aXRoIGEgdXNlcm5hbWUgKG9yIGVtYWlsKSBhbmQgcGFzc3dvcmQuXG4gICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgUGFyc2UuVXNlciBvbiB0aGUgc2VydmVyLCBhbmQgYWxzbyBwZXJzaXN0IHRoZVxuICAgKiBzZXNzaW9uIGluIGxvY2FsU3RvcmFnZSBzbyB0aGF0IHlvdSBjYW4gYWNjZXNzIHRoZSB1c2VyIHVzaW5nXG4gICAqIHtAbGluayAjY3VycmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgKG9yIGVtYWlsKSB0byBzaWduIHVwIHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gc2lnbiB1cCB3aXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cnMgRXh0cmEgZmllbGRzIHRvIHNldCBvbiB0aGUgbmV3IHVzZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIHdoZW5cbiAgICogICAgIHRoZSBzaWdudXAgY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIHNpZ25VcCh1c2VybmFtZSwgcGFzc3dvcmQsIGF0dHJzLCBvcHRpb25zKSB7XG4gICAgYXR0cnMgPSBhdHRycyB8fCB7fTtcbiAgICBhdHRycy51c2VybmFtZSA9IHVzZXJuYW1lO1xuICAgIGF0dHJzLnBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKGF0dHJzKTtcbiAgICByZXR1cm4gdXNlci5zaWduVXAoe30sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW4gYSB1c2VyIHdpdGggYSB1c2VybmFtZSAob3IgZW1haWwpIGFuZCBwYXNzd29yZC4gT24gc3VjY2VzcywgdGhpc1xuICAgKiBzYXZlcyB0aGUgc2Vzc2lvbiB0byBkaXNrLCBzbyB5b3UgY2FuIHJldHJpZXZlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluXG4gICAqIHVzZXIgdXNpbmcgPGNvZGU+Y3VycmVudDwvY29kZT4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgKG9yIGVtYWlsKSB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBsb2cgaW4gd2l0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIGxvZ2luIGNvbXBsZXRlcy5cbiAgICovXG4gIHN0YXRpYyBsb2dJbih1c2VybmFtZSwgcGFzc3dvcmQsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdVc2VybmFtZSBtdXN0IGJlIGEgc3RyaW5nLicpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnUGFzc3dvcmQgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHVzZXIuX2ZpbmlzaEZldGNoKHtcbiAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcbiAgICAgIHBhc3N3b3JkOiBwYXNzd29yZFxuICAgIH0pO1xuICAgIHJldHVybiB1c2VyLmxvZ0luKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW4gYSB1c2VyIHdpdGggYSB1c2VybmFtZSAob3IgZW1haWwpIGFuZCBwYXNzd29yZCwgYW5kIGF1dGhEYXRhLiBPbiBzdWNjZXNzLCB0aGlzXG4gICAqIHNhdmVzIHRoZSBzZXNzaW9uIHRvIGRpc2ssIHNvIHlvdSBjYW4gcmV0cmlldmUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW5cbiAgICogdXNlciB1c2luZyA8Y29kZT5jdXJyZW50PC9jb2RlPi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJuYW1lIFRoZSB1c2VybmFtZSAob3IgZW1haWwpIHRvIGxvZyBpbiB3aXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGxvZyBpbiB3aXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXV0aERhdGEgVGhlIGF1dGhEYXRhIHRvIGxvZyBpbiB3aXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgbG9naW4gY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGxvZ0luV2l0aEFkZGl0aW9uYWxBdXRoKHVzZXJuYW1lLCBwYXNzd29yZCwgYXV0aERhdGEsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdVc2VybmFtZSBtdXN0IGJlIGEgc3RyaW5nLicpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnUGFzc3dvcmQgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXV0aERhdGEpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdBdXRoIG11c3QgYmUgYW4gb2JqZWN0LicpKTtcbiAgICB9XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgdXNlci5fZmluaXNoRmV0Y2goe1xuICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgYXV0aERhdGFcbiAgICB9KTtcbiAgICByZXR1cm4gdXNlci5sb2dJbihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB3aXRoIGFuIG9iamVjdElkLiBPbiBzdWNjZXNzLCB0aGlzIHNhdmVzIHRoZSBzZXNzaW9uXG4gICAqIHRvIGRpc2ssIHNvIHlvdSBjYW4gcmV0cmlldmUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlciB1c2luZ1xuICAgKiA8Y29kZT5jdXJyZW50PC9jb2RlPi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJZCBUaGUgb2JqZWN0SWQgZm9yIHRoZSB1c2VyLlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgbG9naW4gY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGxvZ2luQXModXNlcklkKSB7XG4gICAgaWYgKCF1c2VySWQpIHtcbiAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuVVNFUk5BTUVfTUlTU0lORywgJ0Nhbm5vdCBsb2cgaW4gYXMgdXNlciB3aXRoIGFuIGVtcHR5IHVzZXIgaWQnKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIubG9naW5Bcyh1c2VyLCB1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW4gYSB1c2VyIHdpdGggYSBzZXNzaW9uIHRva2VuLiBPbiBzdWNjZXNzLCB0aGlzIHNhdmVzIHRoZSBzZXNzaW9uXG4gICAqIHRvIGRpc2ssIHNvIHlvdSBjYW4gcmV0cmlldmUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlciB1c2luZ1xuICAgKiA8Y29kZT5jdXJyZW50PC9jb2RlPi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25Ub2tlbiBUaGUgc2Vzc2lvblRva2VuIHRvIGxvZyBpbiB3aXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgbG9naW4gY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGJlY29tZShzZXNzaW9uVG9rZW4sIG9wdGlvbnMpIHtcbiAgICBpZiAoIWNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0l0IGlzIG5vdCBtZW1vcnktc2FmZSB0byBiZWNvbWUgYSB1c2VyIGluIGEgc2VydmVyIGVudmlyb25tZW50Jyk7XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGJlY29tZU9wdGlvbnMgPSB7XG4gICAgICBzZXNzaW9uVG9rZW46IHNlc3Npb25Ub2tlblxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBiZWNvbWVPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5iZWNvbWUodXNlciwgYmVjb21lT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgdXNlciB3aXRoIGEgc2Vzc2lvbiB0b2tlbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25Ub2tlbiBUaGUgc2Vzc2lvblRva2VuIHRvIGdldCB1c2VyIHdpdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIGlzIGZldGNoZWQuXG4gICAqL1xuICBzdGF0aWMgbWUoc2Vzc2lvblRva2VuKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IG1lT3B0aW9ucyA9IHtcbiAgICAgIHNlc3Npb25Ub2tlbjogc2Vzc2lvblRva2VuXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy51c2VNYXN0ZXJLZXkpIHtcbiAgICAgIG1lT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIubWUodXNlciwgbWVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgdXNlciB3aXRoIGEgc2Vzc2lvbiB0b2tlbi4gT24gc3VjY2VzcywgdGhpcyBzYXZlcyB0aGUgc2Vzc2lvblxuICAgKiB0byBkaXNrLCBzbyB5b3UgY2FuIHJldHJpZXZlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgdXNpbmdcbiAgICogPGNvZGU+Y3VycmVudDwvY29kZT4uIElmIHRoZXJlIGlzIG5vIHNlc3Npb24gdG9rZW4gdGhlIHVzZXIgd2lsbCBub3QgbG9nZ2VkIGluLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gdXNlckpTT04gVGhlIEpTT04gbWFwIG9mIHRoZSBVc2VyJ3MgZGF0YVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgbG9naW4gY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGh5ZHJhdGUodXNlckpTT04pIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5oeWRyYXRlKHVzZXIsIHVzZXJKU09OKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgdmVyc2lvbiBvZiB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5Vc2VyLmh0bWwjbGlua1dpdGggbGlua1dpdGh9XG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlclxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuYXV0aERhdGFdXG4gICAqIEBwYXJhbSBzYXZlT3B0c1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgc3RhdGljIGxvZ0luV2l0aChwcm92aWRlciwgb3B0aW9ucywgc2F2ZU9wdHMpIHtcbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICByZXR1cm4gdXNlci5saW5rV2l0aChwcm92aWRlciwgb3B0aW9ucywgc2F2ZU9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3Mgb3V0IHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgc2Vzc2lvbi4gVGhpcyB3aWxsIHJlbW92ZSB0aGVcbiAgICogc2Vzc2lvbiBmcm9tIGRpc2ssIGxvZyBvdXQgb2YgbGlua2VkIHNlcnZpY2VzLCBhbmQgZnV0dXJlIGNhbGxzIHRvXG4gICAqIDxjb2RlPmN1cnJlbnQ8L2NvZGU+IHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBzZXNzaW9uIGlzXG4gICAqICAgZGVzdHJveWVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBzdGF0aWMgbG9nT3V0KCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5sb2dPdXQob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYSBwYXNzd29yZCByZXNldCBlbWFpbCB0byBiZSBzZW50IHRvIHRoZSBzcGVjaWZpZWQgZW1haWwgYWRkcmVzc1xuICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgYWNjb3VudC4gVGhpcyBlbWFpbCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VjdXJlbHlcbiAgICogcmVzZXQgdGhlaXIgcGFzc3dvcmQgb24gdGhlIFBhcnNlIHNpdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbCBUaGUgZW1haWwgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdGhhdFxuICAgKiAgICAgZm9yZ290IHRoZWlyIHBhc3N3b3JkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgc3RhdGljIHJlcXVlc3RQYXNzd29yZFJlc2V0KGVtYWlsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5yZXF1ZXN0UGFzc3dvcmRSZXNldChlbWFpbCwgcmVxdWVzdE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYW4gZW1haWwgdmVyaWZpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW1haWwgVGhlIGVtYWlsIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRoYXRcbiAgICogICAgIG5lZWRzIHRvIHZlcmlmeSB0aGVpciBlbWFpbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIHN0YXRpYyByZXF1ZXN0RW1haWxWZXJpZmljYXRpb24oZW1haWwsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgcmVxdWVzdE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnJlcXVlc3RFbWFpbFZlcmlmaWNhdGlvbihlbWFpbCwgcmVxdWVzdE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB3aGV0aGVyIGEgZ2l2ZW4gcGFzc3dvcmQgaXMgdGhlIHBhc3N3b3JkIG9mIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqIEBzdGF0aWNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJuYW1lICBUaGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgd2hvc2UgcGFzc3dvcmQgc2hvdWxkIGJlIHZlcmlmaWVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGJlIHZlcmlmaWVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pZ25vcmVFbWFpbFZlcmlmaWNhdGlvbl0gU2V0IHRvIGB0cnVlYCB0byBieXBhc3MgZW1haWwgdmVyaWZpY2F0aW9uIGFuZCB2ZXJpZnlcbiAgICogdGhlIHBhc3N3b3JkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgZW1haWwgaGFzIGJlZW4gdmVyaWZpZWQuIFRoaXMgcmVxdWlyZXMgdGhlIG1hc3RlciBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhIHVzZXIgd2hlbiB0aGUgcGFzc3dvcmQgaXMgY29ycmVjdC5cbiAgICovXG4gIHN0YXRpYyB2ZXJpZnlQYXNzd29yZCh1c2VybmFtZSwgcGFzc3dvcmQsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdVc2VybmFtZSBtdXN0IGJlIGEgc3RyaW5nLicpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnUGFzc3dvcmQgbXVzdCBiZSBhIHN0cmluZy4nKSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnZlcmlmeVBhc3N3b3JkKHVzZXJuYW1lLCBwYXNzd29yZCwgb3B0aW9ucyB8fCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgc29tZW9uZSB0byBkZWZpbmUgYSBjdXN0b20gVXNlciBjbGFzcyB3aXRob3V0IGNsYXNzTmFtZVxuICAgKiBiZWluZyByZXdyaXR0ZW4gdG8gX1VzZXIuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJld3JpdGVcbiAgICogVXNlciB0byBfVXNlciBmb3IgbGVnYWN5IHJlYXNvbnMuIFRoaXMgYWxsb3dzIGRldmVsb3BlcnMgdG9cbiAgICogb3ZlcnJpZGUgdGhhdCBiZWhhdmlvci5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBpc0FsbG93ZWQgV2hldGhlciBvciBub3QgdG8gYWxsb3cgY3VzdG9tIFVzZXIgY2xhc3NcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGFsbG93Q3VzdG9tVXNlckNsYXNzKGlzQWxsb3dlZCkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnUEVSRk9STV9VU0VSX1JFV1JJVEUnLCAhaXNBbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYSBsZWdhY3kgYXBwbGljYXRpb24gdG8gc3RhcnQgdXNpbmcgcmV2b2NhYmxlIHNlc3Npb25zLiBJZiB0aGVcbiAgICogY3VycmVudCBzZXNzaW9uIHRva2VuIGlzIG5vdCByZXZvY2FibGUsIGEgcmVxdWVzdCB3aWxsIGJlIG1hZGUgZm9yIGEgbmV3LFxuICAgKiByZXZvY2FibGUgc2Vzc2lvbi5cbiAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIHRoaXMgbWV0aG9kIGZyb20gY2xvdWQgY29kZSB1bmxlc3MgeW91IGFyZVxuICAgKiBoYW5kbGluZyB1c2VyIHNpZ251cCBvciBsb2dpbiBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gSW4gYSBjbG91ZCBjb2RlIGNhbGwsXG4gICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYXR0ZW1wdCB0byB1cGdyYWRlIHRoZSBjdXJyZW50IHRva2VuLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBwcm9jZXNzIGhhc1xuICAgKiAgIGNvbXBsZXRlZC4gSWYgYSByZXBsYWNlbWVudCBzZXNzaW9uIHRva2VuIGlzIHJlcXVlc3RlZCwgdGhlIHByb21pc2VcbiAgICogICB3aWxsIGJlIHJlc29sdmVkIGFmdGVyIGEgbmV3IHRva2VuIGhhcyBiZWVuIGZldGNoZWQuXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlUmV2b2NhYmxlU2Vzc2lvbihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdGT1JDRV9SRVZPQ0FCTEVfU0VTU0lPTicsIHRydWUpO1xuICAgIGlmIChjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgY29uc3QgY3VycmVudCA9IFBhcnNlVXNlci5jdXJyZW50KCk7XG4gICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudC5fdXBncmFkZVRvUmV2b2NhYmxlU2Vzc2lvbihvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIHVzZSBvZiBiZWNvbWUgb3IgdGhlIGN1cnJlbnQgdXNlciBpbiBhIHNlcnZlclxuICAgKiBlbnZpcm9ubWVudC4gVGhlc2UgZmVhdHVyZXMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQsIHNpbmNlIHRoZXkgZGVwZW5kIG9uXG4gICAqIGdsb2JhbCBvYmplY3RzIHRoYXQgYXJlIG5vdCBtZW1vcnktc2FmZSBmb3IgbW9zdCBzZXJ2ZXJzLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlVW5zYWZlQ3VycmVudFVzZXIoKSB7XG4gICAgY2FuVXNlQ3VycmVudFVzZXIgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIHRoZSB1c2Ugb2YgYmVjb21lIG9yIHRoZSBjdXJyZW50IHVzZXIgaW4gYW55IGVudmlyb25tZW50LlxuICAgKiBUaGVzZSBmZWF0dXJlcyBhcmUgZGlzYWJsZWQgb24gc2VydmVycyBieSBkZWZhdWx0LCBzaW5jZSB0aGV5IGRlcGVuZCBvblxuICAgKiBnbG9iYWwgb2JqZWN0cyB0aGF0IGFyZSBub3QgbWVtb3J5LXNhZmUgZm9yIG1vc3Qgc2VydmVycy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGRpc2FibGVVbnNhZmVDdXJyZW50VXNlcigpIHtcbiAgICBjYW5Vc2VDdXJyZW50VXNlciA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gcmVnaXN0ZXJpbmcgdXNlcnMgd2l0aCB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5Vc2VyLmh0bWwjbGlua1dpdGggbGlua1dpdGh9IGEgYmFzaWMgYXV0aCBwcm92aWRlclxuICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9yIHlvdS5cbiAgICpcbiAgICogRm9yIGFkdmFuY2VkIGF1dGhlbnRpY2F0aW9uLCB5b3UgY2FuIHJlZ2lzdGVyIGFuIEF1dGggcHJvdmlkZXIgdG9cbiAgICogaW1wbGVtZW50IGN1c3RvbSBhdXRoZW50aWNhdGlvbiwgZGVhdXRoZW50aWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvQXV0aFByb3ZpZGVyLmh0bWwgQXV0aFByb3ZpZGVyfVxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvanMvZ3VpZGUvI2N1c3RvbS1hdXRoZW50aWNhdGlvbi1tb2R1bGUgQ3VzdG9tIEF1dGhlbnRpY2F0aW9uIE1vZHVsZX1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIF9yZWdpc3RlckF1dGhlbnRpY2F0aW9uUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICBhdXRoUHJvdmlkZXJzW3Byb3ZpZGVyLmdldEF1dGhUeXBlKCldID0gcHJvdmlkZXI7XG4gICAgLy8gU3luY2hyb25pemUgdGhlIGN1cnJlbnQgdXNlciB3aXRoIHRoZSBhdXRoIHByb3ZpZGVyLlxuICAgIFBhcnNlVXNlci5jdXJyZW50QXN5bmMoKS50aGVuKGN1cnJlbnQgPT4ge1xuICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgY3VycmVudC5fc3luY2hyb25pemVBdXRoRGF0YShwcm92aWRlci5nZXRBdXRoVHlwZSgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLmF1dGhEYXRhXVxuICAgKiBAcGFyYW0gc2F2ZU9wdHNcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgMi45LjAgc2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlVzZXIuaHRtbCNsb2dJbldpdGggbG9nSW5XaXRofVxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgc3RhdGljIF9sb2dJbldpdGgocHJvdmlkZXIsIG9wdGlvbnMsIHNhdmVPcHRzKSB7XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgcmV0dXJuIHVzZXIubGlua1dpdGgocHJvdmlkZXIsIG9wdGlvbnMsIHNhdmVPcHRzKTtcbiAgfVxuICBzdGF0aWMgX2NsZWFyQ2FjaGUoKSB7XG4gICAgY3VycmVudFVzZXJDYWNoZSA9IG51bGw7XG4gICAgY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrID0gZmFsc2U7XG4gIH1cbiAgc3RhdGljIF9zZXRDdXJyZW50VXNlckNhY2hlKHVzZXIpIHtcbiAgICBjdXJyZW50VXNlckNhY2hlID0gdXNlcjtcbiAgfVxufVxuX1BhcnNlT2JqZWN0LmRlZmF1bHQucmVnaXN0ZXJTdWJjbGFzcygnX1VzZXInLCBQYXJzZVVzZXIpO1xuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIHVwZGF0ZVVzZXJPbkRpc2sodXNlcikge1xuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX1VTRVJfS0VZKTtcbiAgICBjb25zdCBqc29uID0gdXNlci50b0pTT04oKTtcbiAgICBkZWxldGUganNvbi5wYXNzd29yZDtcbiAgICBqc29uLmNsYXNzTmFtZSA9ICdfVXNlcic7XG4gICAgbGV0IHVzZXJEYXRhID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoanNvbik7XG4gICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRU5DUllQVEVEX1VTRVInKSkge1xuICAgICAgY29uc3QgY3J5cHRvID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q3J5cHRvQ29udHJvbGxlcigpO1xuICAgICAgdXNlckRhdGEgPSBjcnlwdG8uZW5jcnlwdChqc29uLCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9LRVknKSk7XG4gICAgfVxuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhwYXRoLCB1c2VyRGF0YSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9KTtcbiAgfSxcbiAgcmVtb3ZlVXNlckZyb21EaXNrKCkge1xuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX1VTRVJfS0VZKTtcbiAgICBjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2sgPSB0cnVlO1xuICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSBudWxsO1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LnJlbW92ZUl0ZW1Bc3luYyhwYXRoKTtcbiAgfSxcbiAgc2V0Q3VycmVudFVzZXIodXNlcikge1xuICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSB1c2VyO1xuICAgIHVzZXIuX2NsZWFudXBBdXRoRGF0YSgpO1xuICAgIHVzZXIuX3N5bmNocm9uaXplQWxsQXV0aERhdGEoKTtcbiAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIudXBkYXRlVXNlck9uRGlzayh1c2VyKTtcbiAgfSxcbiAgY3VycmVudFVzZXIoKSB7XG4gICAgaWYgKGN1cnJlbnRVc2VyQ2FjaGUpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VXNlckNhY2hlO1xuICAgIH1cbiAgICBpZiAoY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKF9TdG9yYWdlLmRlZmF1bHQuYXN5bmMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBjdXJyZW50VXNlcigpIHdoZW4gdXNpbmcgYSBwbGF0Zm9ybSB3aXRoIGFuIGFzeW5jICcgKyAnc3RvcmFnZSBzeXN0ZW0uIENhbGwgY3VycmVudFVzZXJBc3luYygpIGluc3RlYWQuJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX1VTRVJfS0VZKTtcbiAgICBsZXQgdXNlckRhdGEgPSBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW0ocGF0aCk7XG4gICAgY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrID0gdHJ1ZTtcbiAgICBpZiAoIXVzZXJEYXRhKSB7XG4gICAgICBjdXJyZW50VXNlckNhY2hlID0gbnVsbDtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfVVNFUicpKSB7XG4gICAgICBjb25zdCBjcnlwdG8gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDcnlwdG9Db250cm9sbGVyKCk7XG4gICAgICB1c2VyRGF0YSA9IGNyeXB0by5kZWNyeXB0KHVzZXJEYXRhLCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9LRVknKSk7XG4gICAgfVxuICAgIHVzZXJEYXRhID0gSlNPTi5wYXJzZSh1c2VyRGF0YSk7XG4gICAgaWYgKCF1c2VyRGF0YS5jbGFzc05hbWUpIHtcbiAgICAgIHVzZXJEYXRhLmNsYXNzTmFtZSA9ICdfVXNlcic7XG4gICAgfVxuICAgIGlmICh1c2VyRGF0YS5faWQpIHtcbiAgICAgIGlmICh1c2VyRGF0YS5vYmplY3RJZCAhPT0gdXNlckRhdGEuX2lkKSB7XG4gICAgICAgIHVzZXJEYXRhLm9iamVjdElkID0gdXNlckRhdGEuX2lkO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHVzZXJEYXRhLl9pZDtcbiAgICB9XG4gICAgaWYgKHVzZXJEYXRhLl9zZXNzaW9uVG9rZW4pIHtcbiAgICAgIHVzZXJEYXRhLnNlc3Npb25Ub2tlbiA9IHVzZXJEYXRhLl9zZXNzaW9uVG9rZW47XG4gICAgICBkZWxldGUgdXNlckRhdGEuX3Nlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudCA9IF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKHVzZXJEYXRhKTtcbiAgICBjdXJyZW50VXNlckNhY2hlID0gY3VycmVudDtcbiAgICBjdXJyZW50Ll9zeW5jaHJvbml6ZUFsbEF1dGhEYXRhKCk7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH0sXG4gIGN1cnJlbnRVc2VyQXN5bmMoKSB7XG4gICAgaWYgKGN1cnJlbnRVc2VyQ2FjaGUpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY3VycmVudFVzZXJDYWNoZSk7XG4gICAgfVxuICAgIGlmIChjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2spIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUobnVsbCk7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX1VTRVJfS0VZKTtcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMocGF0aCkudGhlbih1c2VyRGF0YSA9PiB7XG4gICAgICBjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2sgPSB0cnVlO1xuICAgICAgaWYgKCF1c2VyRGF0YSkge1xuICAgICAgICBjdXJyZW50VXNlckNhY2hlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9VU0VSJykpIHtcbiAgICAgICAgY29uc3QgY3J5cHRvID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q3J5cHRvQ29udHJvbGxlcigpO1xuICAgICAgICB1c2VyRGF0YSA9IGNyeXB0by5kZWNyeXB0KHVzZXJEYXRhLnRvU3RyaW5nKCksIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRU5DUllQVEVEX0tFWScpKTtcbiAgICAgIH1cbiAgICAgIHVzZXJEYXRhID0gSlNPTi5wYXJzZSh1c2VyRGF0YSk7XG4gICAgICBpZiAoIXVzZXJEYXRhLmNsYXNzTmFtZSkge1xuICAgICAgICB1c2VyRGF0YS5jbGFzc05hbWUgPSAnX1VzZXInO1xuICAgICAgfVxuICAgICAgaWYgKHVzZXJEYXRhLl9pZCkge1xuICAgICAgICBpZiAodXNlckRhdGEub2JqZWN0SWQgIT09IHVzZXJEYXRhLl9pZCkge1xuICAgICAgICAgIHVzZXJEYXRhLm9iamVjdElkID0gdXNlckRhdGEuX2lkO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB1c2VyRGF0YS5faWQ7XG4gICAgICB9XG4gICAgICBpZiAodXNlckRhdGEuX3Nlc3Npb25Ub2tlbikge1xuICAgICAgICB1c2VyRGF0YS5zZXNzaW9uVG9rZW4gPSB1c2VyRGF0YS5fc2Vzc2lvblRva2VuO1xuICAgICAgICBkZWxldGUgdXNlckRhdGEuX3Nlc3Npb25Ub2tlbjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTih1c2VyRGF0YSk7XG4gICAgICBjdXJyZW50VXNlckNhY2hlID0gY3VycmVudDtcbiAgICAgIGN1cnJlbnQuX3N5bmNocm9uaXplQWxsQXV0aERhdGEoKTtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY3VycmVudCk7XG4gICAgfSk7XG4gIH0sXG4gIHNpZ25VcCh1c2VyLCBhdHRycywgb3B0aW9ucykge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gYXR0cnMgJiYgYXR0cnMudXNlcm5hbWUgfHwgdXNlci5nZXQoJ3VzZXJuYW1lJyk7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBhdHRycyAmJiBhdHRycy5wYXNzd29yZCB8fCB1c2VyLmdldCgncGFzc3dvcmQnKTtcbiAgICBpZiAoIXVzZXJuYW1lIHx8ICF1c2VybmFtZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnQ2Fubm90IHNpZ24gdXAgdXNlciB3aXRoIGFuIGVtcHR5IHVzZXJuYW1lLicpKTtcbiAgICB9XG4gICAgaWYgKCFwYXNzd29yZCB8fCAhcGFzc3dvcmQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ0Nhbm5vdCBzaWduIHVwIHVzZXIgd2l0aCBhbiBlbXB0eSBwYXNzd29yZC4nKSk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyLnNhdmUoYXR0cnMsIG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gQ2xlYXIgdGhlIHBhc3N3b3JkIGZpZWxkXG4gICAgICB1c2VyLl9maW5pc2hGZXRjaCh7XG4gICAgICAgIHBhc3N3b3JkOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKGNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH0pO1xuICB9LFxuICBsb2dJbih1c2VyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IGF1dGggPSB7XG4gICAgICB1c2VybmFtZTogdXNlci5nZXQoJ3VzZXJuYW1lJyksXG4gICAgICBwYXNzd29yZDogdXNlci5nZXQoJ3Bhc3N3b3JkJyksXG4gICAgICBhdXRoRGF0YTogdXNlci5nZXQoJ2F1dGhEYXRhJylcbiAgICB9O1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KG9wdGlvbnMudXNlUG9zdCA/ICdQT1NUJyA6ICdHRVQnLCAnbG9naW4nLCBhdXRoLCBvcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIHVzZXIuX21pZ3JhdGVJZChyZXNwb25zZS5vYmplY3RJZCk7XG4gICAgICB1c2VyLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgICAgc3RhdGVDb250cm9sbGVyLnNldFBlbmRpbmdPcCh1c2VyLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgJ3VzZXJuYW1lJywgdW5kZWZpbmVkKTtcbiAgICAgIHN0YXRlQ29udHJvbGxlci5zZXRQZW5kaW5nT3AodXNlci5fZ2V0U3RhdGVJZGVudGlmaWVyKCksICdwYXNzd29yZCcsIHVuZGVmaW5lZCk7XG4gICAgICByZXNwb25zZS5wYXNzd29yZCA9IHVuZGVmaW5lZDtcbiAgICAgIHVzZXIuX2ZpbmlzaEZldGNoKHJlc3BvbnNlKTtcbiAgICAgIGlmICghY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgICAgLy8gV2UgY2FuJ3Qgc2V0IHRoZSBjdXJyZW50IHVzZXIsIHNvIGp1c3QgcmV0dXJuIHRoZSBvbmUgd2UgbG9nZ2VkIGluXG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodXNlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgfSk7XG4gIH0sXG4gIGxvZ2luQXModXNlciwgdXNlcklkKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2xvZ2luQXMnLCB7XG4gICAgICB1c2VySWRcbiAgICB9LCB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIHVzZXIuX2ZpbmlzaEZldGNoKHJlc3BvbnNlKTtcbiAgICAgIHVzZXIuX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgICBpZiAoIWNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodXNlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgfSk7XG4gIH0sXG4gIGJlY29tZSh1c2VyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAndXNlcnMvbWUnLCB7fSwgb3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICB1c2VyLl9maW5pc2hGZXRjaChyZXNwb25zZSk7XG4gICAgICB1c2VyLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH0pO1xuICB9LFxuICBoeWRyYXRlKHVzZXIsIHVzZXJKU09OKSB7XG4gICAgdXNlci5fZmluaXNoRmV0Y2godXNlckpTT04pO1xuICAgIHVzZXIuX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgaWYgKHVzZXJKU09OLnNlc3Npb25Ub2tlbiAmJiBjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHVzZXIpO1xuICAgIH1cbiAgfSxcbiAgbWUodXNlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ3VzZXJzL21lJywge30sIG9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgdXNlci5fZmluaXNoRmV0Y2gocmVzcG9uc2UpO1xuICAgICAgdXNlci5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH0pO1xuICB9LFxuICBsb2dPdXQob3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBpZiAob3B0aW9ucy5zZXNzaW9uVG9rZW4pIHtcbiAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2xvZ291dCcsIHt9LCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLmN1cnJlbnRVc2VyQXN5bmMoKS50aGVuKGN1cnJlbnRVc2VyID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX1VTRVJfS0VZKTtcbiAgICAgIGxldCBwcm9taXNlID0gX1N0b3JhZ2UuZGVmYXVsdC5yZW1vdmVJdGVtQXN5bmMocGF0aCk7XG4gICAgICBpZiAoY3VycmVudFVzZXIgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFNlc3Npb24gPSBjdXJyZW50VXNlci5nZXRTZXNzaW9uVG9rZW4oKTtcbiAgICAgICAgaWYgKGN1cnJlbnRTZXNzaW9uICYmICgwLCBfaXNSZXZvY2FibGVTZXNzaW9uLmRlZmF1bHQpKGN1cnJlbnRTZXNzaW9uKSkge1xuICAgICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnbG9nb3V0Jywge30sIHtcbiAgICAgICAgICAgICAgc2Vzc2lvblRva2VuOiBjdXJyZW50U2Vzc2lvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFVzZXIuX2xvZ091dFdpdGhBbGwoKTtcbiAgICAgICAgY3VycmVudFVzZXIuX2ZpbmlzaEZldGNoKHtcbiAgICAgICAgICBzZXNzaW9uVG9rZW46IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzayA9IHRydWU7XG4gICAgICBjdXJyZW50VXNlckNhY2hlID0gbnVsbDtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH0pO1xuICB9LFxuICByZXF1ZXN0UGFzc3dvcmRSZXNldChlbWFpbCwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdyZXF1ZXN0UGFzc3dvcmRSZXNldCcsIHtcbiAgICAgIGVtYWlsOiBlbWFpbFxuICAgIH0sIG9wdGlvbnMpO1xuICB9LFxuICBhc3luYyB1cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uKHVzZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB0b2tlbiA9IHVzZXIuZ2V0U2Vzc2lvblRva2VuKCk7XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuU0VTU0lPTl9NSVNTSU5HLCAnQ2Fubm90IHVwZ3JhZGUgYSB1c2VyIHdpdGggbm8gc2Vzc2lvbiB0b2tlbicpKTtcbiAgICB9XG4gICAgb3B0aW9ucy5zZXNzaW9uVG9rZW4gPSB0b2tlbjtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICd1cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uJywge30sIG9wdGlvbnMpO1xuICAgIHVzZXIuX2ZpbmlzaEZldGNoKHtcbiAgICAgIHNlc3Npb25Ub2tlbjogcmVzdWx0Py5zZXNzaW9uVG9rZW4gfHwgJydcbiAgICB9KTtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgdXNlci5pc0N1cnJlbnRBc3luYygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodXNlcik7XG4gIH0sXG4gIGxpbmtXaXRoKHVzZXIsIGF1dGhEYXRhLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHVzZXIuc2F2ZSh7XG4gICAgICBhdXRoRGF0YVxuICAgIH0sIG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKGNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH0pO1xuICB9LFxuICB2ZXJpZnlQYXNzd29yZCh1c2VybmFtZSwgcGFzc3dvcmQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIHVzZXJuYW1lLFxuICAgICAgcGFzc3dvcmQsXG4gICAgICAuLi4ob3B0aW9ucy5pZ25vcmVFbWFpbFZlcmlmaWNhdGlvbiAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgaWdub3JlRW1haWxWZXJpZmljYXRpb246IG9wdGlvbnMuaWdub3JlRW1haWxWZXJpZmljYXRpb25cbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnR0VUJywgJ3ZlcmlmeVBhc3N3b3JkJywgZGF0YSwgb3B0aW9ucyk7XG4gIH0sXG4gIHJlcXVlc3RFbWFpbFZlcmlmaWNhdGlvbihlbWFpbCwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICd2ZXJpZmljYXRpb25FbWFpbFJlcXVlc3QnLCB7XG4gICAgICBlbWFpbDogZW1haWxcbiAgICB9LCBvcHRpb25zKTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFBhcnNlVXNlcihQYXJzZVVzZXIpO1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0VXNlckNvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VVc2VyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldFB1c2hTdGF0dXMgPSBnZXRQdXNoU3RhdHVzO1xuZXhwb3J0cy5zZW5kID0gc2VuZDtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VRdWVyeVwiKSk7XG4vKipcbiAqIENvbnRhaW5zIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggUHVzaCBpbiBQYXJzZS5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuUHVzaFxuICogQHN0YXRpY1xuICogQGhpZGVjb25zdHJ1Y3RvclxuICovXG5cbi8qKlxuICogU2VuZHMgYSBwdXNoIG5vdGlmaWNhdGlvbi5cbiAqICoqQXZhaWxhYmxlIGluIENsb3VkIENvZGUgb25seS4qKlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL2pzL2d1aWRlLyNwdXNoLW5vdGlmaWNhdGlvbnMgUHVzaCBOb3RpZmljYXRpb24gR3VpZGV9XG4gKlxuICogQGZ1bmN0aW9uIHNlbmRcbiAqIEBuYW1lIFBhcnNlLlB1c2guc2VuZFxuICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSAgVGhlIGRhdGEgb2YgdGhlIHB1c2ggbm90aWZpY2F0aW9uLiBWYWxpZCBmaWVsZHNcbiAqIGFyZTpcbiAqICAgPG9sPlxuICogICAgIDxsaT5jaGFubmVscyAtIEFuIEFycmF5IG9mIGNoYW5uZWxzIHRvIHB1c2ggdG8uPC9saT5cbiAqICAgICA8bGk+cHVzaF90aW1lIC0gQSBEYXRlIG9iamVjdCBmb3Igd2hlbiB0byBzZW5kIHRoZSBwdXNoLjwvbGk+XG4gKiAgICAgPGxpPmV4cGlyYXRpb25fdGltZSAtICBBIERhdGUgb2JqZWN0IGZvciB3aGVuIHRvIGV4cGlyZVxuICogICAgICAgICB0aGUgcHVzaC48L2xpPlxuICogICAgIDxsaT5leHBpcmF0aW9uX2ludGVydmFsIC0gVGhlIHNlY29uZHMgZnJvbSBub3cgdG8gZXhwaXJlIHRoZSBwdXNoLjwvbGk+XG4gKiAgICAgPGxpPndoZXJlIC0gQSBQYXJzZS5RdWVyeSBvdmVyIFBhcnNlLkluc3RhbGxhdGlvbiB0aGF0IGlzIHVzZWQgdG8gbWF0Y2hcbiAqICAgICAgICAgYSBzZXQgb2YgaW5zdGFsbGF0aW9ucyB0byBwdXNoIHRvLjwvbGk+XG4gKiAgICAgPGxpPmRhdGEgLSBUaGUgZGF0YSB0byBzZW5kIGFzIHBhcnQgb2YgdGhlIHB1c2guPC9saT5cbiAqICAgPG9sPlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9uc1xuICogYXJlOjx1bD5cbiAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gKiA8L3VsPlxuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBwdXNoIHJlcXVlc3RcbiAqICAgICBjb21wbGV0ZXMgYW5kIHJldHVybnMgYHB1c2hTdGF0dXNJZGAuXG4gKi9cbmZ1bmN0aW9uIHNlbmQoZGF0YSkge1xuICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIGlmIChkYXRhLndoZXJlICYmIGRhdGEud2hlcmUgaW5zdGFuY2VvZiBfUGFyc2VRdWVyeS5kZWZhdWx0KSB7XG4gICAgZGF0YS53aGVyZSA9IGRhdGEud2hlcmUudG9KU09OKCkud2hlcmU7XG4gIH1cbiAgaWYgKGRhdGEucHVzaF90aW1lICYmIHR5cGVvZiBkYXRhLnB1c2hfdGltZSA9PT0gJ29iamVjdCcpIHtcbiAgICBkYXRhLnB1c2hfdGltZSA9IGRhdGEucHVzaF90aW1lLnRvSlNPTigpO1xuICB9XG4gIGlmIChkYXRhLmV4cGlyYXRpb25fdGltZSAmJiB0eXBlb2YgZGF0YS5leHBpcmF0aW9uX3RpbWUgPT09ICdvYmplY3QnKSB7XG4gICAgZGF0YS5leHBpcmF0aW9uX3RpbWUgPSBkYXRhLmV4cGlyYXRpb25fdGltZS50b0pTT04oKTtcbiAgfVxuICBpZiAoZGF0YS5leHBpcmF0aW9uX3RpbWUgJiYgZGF0YS5leHBpcmF0aW9uX2ludGVydmFsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBpcmF0aW9uX3RpbWUgYW5kIGV4cGlyYXRpb25faW50ZXJ2YWwgY2Fubm90IGJvdGggYmUgc2V0LicpO1xuICB9XG4gIGNvbnN0IHB1c2hPcHRpb25zID0ge1xuICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICB9O1xuICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICBwdXNoT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgfVxuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UHVzaENvbnRyb2xsZXIoKS5zZW5kKGRhdGEsIHB1c2hPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBHZXRzIHB1c2ggc3RhdHVzIGJ5IElkXG4gKlxuICogQGZ1bmN0aW9uIGdldFB1c2hTdGF0dXNcbiAqIEBuYW1lIFBhcnNlLlB1c2guZ2V0UHVzaFN0YXR1c1xuICogQHBhcmFtIHtzdHJpbmd9IHB1c2hTdGF0dXNJZCBUaGUgSWQgb2YgUHVzaCBTdGF0dXMuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zXG4gKiBhcmU6PHVsPlxuICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAqIDwvdWw+XG4gKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBTdGF0dXMgb2YgUHVzaC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHVzaFN0YXR1cyhwdXNoU3RhdHVzSWQpIHtcbiAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICBjb25zdCBwdXNoT3B0aW9ucyA9IHtcbiAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgfTtcbiAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgcHVzaE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gIH1cbiAgY29uc3QgcXVlcnkgPSBuZXcgX1BhcnNlUXVlcnkuZGVmYXVsdCgnX1B1c2hTdGF0dXMnKTtcbiAgcmV0dXJuIHF1ZXJ5LmdldChwdXNoU3RhdHVzSWQsIHB1c2hPcHRpb25zKTtcbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBhc3luYyBzZW5kKGRhdGEsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnJldHVyblN0YXR1cyA9IHRydWU7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLnJlcXVlc3QoJ1BPU1QnLCAncHVzaCcsIGRhdGEsIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXNwb25zZS5faGVhZGVycz8uWydYLVBhcnNlLVB1c2gtU3RhdHVzLUlkJ107XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRQdXNoQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9pbmNsdWRlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfc2V0VGltZW91dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3NldC10aW1lb3V0XCIpKTtcbnZhciBfdXVpZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXVpZFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9wcm9taXNlVXRpbHMgPSByZXF1aXJlKFwiLi9wcm9taXNlVXRpbHNcIik7XG52YXIgX1hociA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vWGhyLndlYXBwXCIpKTtcbi8qIGdsb2JhbCBYTUxIdHRwUmVxdWVzdCwgWERvbWFpblJlcXVlc3QgKi9cblxubGV0IFhIUiA9IG51bGw7XG5pZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICBYSFIgPSBYTUxIdHRwUmVxdWVzdDtcbn1cbmxldCB1c2VYRG9tYWluUmVxdWVzdCA9IGZhbHNlO1xuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBYRG9tYWluUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgISgnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKSkpIHtcbiAgdXNlWERvbWFpblJlcXVlc3QgPSB0cnVlO1xufVxuZnVuY3Rpb24gYWpheElFOShtZXRob2QsIHVybCwgZGF0YSwgaGVhZGVycywgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB4ZHIgPSBuZXcgWERvbWFpblJlcXVlc3QoKTtcbiAgICB4ZHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhkci5yZXNwb25zZVRleHQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB4ZHIub25lcnJvciA9IHhkci5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBMZXQncyBmYWtlIGEgcmVhbCBlcnJvciBtZXNzYWdlLlxuICAgICAgY29uc3QgZmFrZVJlc3BvbnNlID0ge1xuICAgICAgICByZXNwb25zZVRleHQ6ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHtcbiAgICAgICAgICBjb2RlOiBfUGFyc2VFcnJvci5kZWZhdWx0LlhfRE9NQUlOX1JFUVVFU1QsXG4gICAgICAgICAgZXJyb3I6IFwiSUUncyBYRG9tYWluUmVxdWVzdCBkb2VzIG5vdCBzdXBwbHkgZXJyb3IgaW5mby5cIlxuICAgICAgICB9KVxuICAgICAgfTtcbiAgICAgIHJlamVjdChmYWtlUmVzcG9uc2UpO1xuICAgIH07XG4gICAgeGRyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5wcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvcHRpb25zLnByb2dyZXNzKHhkci5yZXNwb25zZVRleHQpO1xuICAgICAgfVxuICAgIH07XG4gICAgeGRyLm9wZW4obWV0aG9kLCB1cmwpO1xuICAgIHhkci5zZW5kKGRhdGEpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZXF1ZXN0VGFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucy5yZXF1ZXN0VGFzayh4ZHIpO1xuICAgIH1cbiAgfSk7XG59XG5jb25zdCBSRVNUQ29udHJvbGxlciA9IHtcbiAgYWpheChtZXRob2QsIHVybCwgZGF0YSwgaGVhZGVycywgb3B0aW9ucykge1xuICAgIHZhciBfY29udGV4dDtcbiAgICBpZiAodXNlWERvbWFpblJlcXVlc3QpIHtcbiAgICAgIHJldHVybiBhamF4SUU5KG1ldGhvZCwgdXJsLCBkYXRhLCBoZWFkZXJzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgY29uc3QgaXNJZGVtcG90ZW50ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdJREVNUE9URU5DWScpICYmICgwLCBfaW5jbHVkZXMuZGVmYXVsdCkoX2NvbnRleHQgPSBbJ1BPU1QnLCAnUFVUJ10pLmNhbGwoX2NvbnRleHQsIG1ldGhvZCk7XG4gICAgY29uc3QgcmVxdWVzdElkID0gaXNJZGVtcG90ZW50ID8gKDAsIF91dWlkLmRlZmF1bHQpKCkgOiAnJztcbiAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgIGNvbnN0IGRpc3BhdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKFhIUiA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1ha2UgYSByZXF1ZXN0OiBObyBkZWZpbml0aW9uIG9mIFhNTEh0dHBSZXF1ZXN0IHdhcyBmb3VuZC4nKTtcbiAgICAgIH1cbiAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCB4aHIgPSBuZXcgWEhSKCk7XG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IDQgfHwgaGFuZGxlZCB8fCB4aHIuX2Fib3J0ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVIZWFkZXJzID0gdHlwZW9mIHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMgPT09ICdmdW5jdGlvbicgPyB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgOiAnJztcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgeGhyLmdldFJlc3BvbnNlSGVhZGVyID09PSAnZnVuY3Rpb24nICYmIGF2YWlsYWJsZUhlYWRlcnM/LmluZGV4T2YoJ2FjY2Vzcy1jb250cm9sLWV4cG9zZS1oZWFkZXJzJykgPj0gMCkge1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2FjY2Vzcy1jb250cm9sLWV4cG9zZS1oZWFkZXJzJykuc3BsaXQoJywgJyk7XG4gICAgICAgICAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShyZXNwb25zZUhlYWRlcnMpLmNhbGwocmVzcG9uc2VIZWFkZXJzLCBoZWFkZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoYXZhaWxhYmxlSGVhZGVycykuY2FsbChhdmFpbGFibGVIZWFkZXJzLCBoZWFkZXIudG9Mb3dlckNhc2UoKSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgaGVhZGVyc1toZWFkZXJdID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlci50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KGUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgICAgICAgICAgeGhyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoeGhyLnN0YXR1cyA+PSA1MDAgfHwgeGhyLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgIC8vIHJldHJ5IG9uIDVYWCBvciBub2RlLXhtbGh0dHByZXF1ZXN0IGVycm9yXG4gICAgICAgICAgaWYgKCsrYXR0ZW1wdHMgPCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1JFUVVFU1RfQVRURU1QVF9MSU1JVCcpKSB7XG4gICAgICAgICAgICAvLyBFeHBvbmVudGlhbGx5LWdyb3dpbmcgcmFuZG9tIGRlbGF5XG4gICAgICAgICAgICBjb25zdCBkZWxheSA9IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDEyNSAqIE1hdGgucG93KDIsIGF0dGVtcHRzKSk7XG4gICAgICAgICAgICAoMCwgX3NldFRpbWVvdXQyLmRlZmF1bHQpKGRpc3BhdGNoLCBkZWxheSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdCgnVW5hYmxlIHRvIGNvbm5lY3QgdG8gdGhlIFBhcnNlIEFQSScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBZnRlciB0aGUgcmV0cnkgbGltaXQgaXMgcmVhY2hlZCwgZmFpbFxuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoeGhyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvbWlzZS5yZWplY3QoeGhyKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzIHx8IHt9O1xuICAgICAgaWYgKHR5cGVvZiBoZWFkZXJzWydDb250ZW50LVR5cGUnXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAndGV4dC9wbGFpbic7IC8vIEF2b2lkIHByZS1mbGlnaHRcbiAgICAgIH1cbiAgICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0lTX05PREUnKSkge1xuICAgICAgICBoZWFkZXJzWydVc2VyLUFnZW50J10gPSAnUGFyc2UvJyArIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnVkVSU0lPTicpICsgJyAoTm9kZUpTICcgKyBwcm9jZXNzLnZlcnNpb25zLm5vZGUgKyAnKSc7XG4gICAgICB9XG4gICAgICBpZiAoaXNJZGVtcG90ZW50KSB7XG4gICAgICAgIGhlYWRlcnNbJ1gtUGFyc2UtUmVxdWVzdC1JZCddID0gcmVxdWVzdElkO1xuICAgICAgfVxuICAgICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX0FVVEhfVFlQRScpICYmIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX0FVVEhfVE9LRU4nKSkge1xuICAgICAgICBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9BVVRIX1RZUEUnKSArICcgJyArIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX0FVVEhfVE9LRU4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1c3RvbUhlYWRlcnMgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1JFUVVFU1RfSEVBREVSUycpO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3VzdG9tSGVhZGVycykge1xuICAgICAgICBoZWFkZXJzW2tleV0gPSBjdXN0b21IZWFkZXJzW2tleV07XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5wcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBoYW5kbGVQcm9ncmVzcyA9IGZ1bmN0aW9uICh0eXBlLCBldmVudCkge1xuICAgICAgICAgIGlmIChldmVudC5sZW5ndGhDb21wdXRhYmxlKSB7XG4gICAgICAgICAgICBvcHRpb25zLnByb2dyZXNzKGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsLCBldmVudC5sb2FkZWQsIGV2ZW50LnRvdGFsLCB7XG4gICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLnByb2dyZXNzKG51bGwsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB4aHIub25wcm9ncmVzcyA9IGV2ZW50ID0+IHtcbiAgICAgICAgICBoYW5kbGVQcm9ncmVzcygnZG93bmxvYWQnLCBldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh4aHIudXBsb2FkKSB7XG4gICAgICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gZXZlbnQgPT4ge1xuICAgICAgICAgICAgaGFuZGxlUHJvZ3Jlc3MoJ3VwbG9hZCcsIGV2ZW50KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB4aHIub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgICBmb3IgKGNvbnN0IGggaW4gaGVhZGVycykge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoLCBoZWFkZXJzW2hdKTtcbiAgICAgIH1cbiAgICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBwcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICByZXN1bHRzOiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICAgIHhoclxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB4aHIuc2VuZChkYXRhKTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlcXVlc3RUYXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgb3B0aW9ucy5yZXF1ZXN0VGFzayh4aHIpO1xuICAgICAgfVxuICAgIH07XG4gICAgZGlzcGF0Y2goKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfSxcbiAgcmVxdWVzdChtZXRob2QsIHBhdGgsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBsZXQgdXJsID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfVVJMJyk7XG4gICAgaWYgKHVybFt1cmwubGVuZ3RoIC0gMV0gIT09ICcvJykge1xuICAgICAgdXJsICs9ICcvJztcbiAgICB9XG4gICAgdXJsICs9IHBhdGg7XG4gICAgY29uc3QgcGF5bG9hZCA9IHt9O1xuICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCBrIGluIGRhdGEpIHtcbiAgICAgICAgcGF5bG9hZFtrXSA9IGRhdGFba107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGNvbnRleHRcbiAgICBjb25zdCBjb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIGlmIChjb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBheWxvYWQuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgIH1cbiAgICBpZiAobWV0aG9kICE9PSAnUE9TVCcpIHtcbiAgICAgIHBheWxvYWQuX21ldGhvZCA9IG1ldGhvZDtcbiAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICB9XG4gICAgcGF5bG9hZC5fQXBwbGljYXRpb25JZCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQVBQTElDQVRJT05fSUQnKTtcbiAgICBjb25zdCBqc0tleSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSkFWQVNDUklQVF9LRVknKTtcbiAgICBpZiAoanNLZXkpIHtcbiAgICAgIHBheWxvYWQuX0phdmFTY3JpcHRLZXkgPSBqc0tleTtcbiAgICB9XG4gICAgcGF5bG9hZC5fQ2xpZW50VmVyc2lvbiA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnVkVSU0lPTicpO1xuICAgIGxldCB1c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICBpZiAodHlwZW9mIHVzZU1hc3RlcktleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHVzZU1hc3RlcktleSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnVVNFX01BU1RFUl9LRVknKTtcbiAgICB9XG4gICAgaWYgKHVzZU1hc3RlcktleSkge1xuICAgICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTUFTVEVSX0tFWScpKSB7XG4gICAgICAgIGRlbGV0ZSBwYXlsb2FkLl9KYXZhU2NyaXB0S2V5O1xuICAgICAgICBwYXlsb2FkLl9NYXN0ZXJLZXkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ01BU1RFUl9LRVknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSB0aGUgTWFzdGVyIEtleSwgaXQgaGFzIG5vdCBiZWVuIHByb3ZpZGVkLicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdGT1JDRV9SRVZPQ0FCTEVfU0VTU0lPTicpKSB7XG4gICAgICBwYXlsb2FkLl9SZXZvY2FibGVTZXNzaW9uID0gJzEnO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YWxsYXRpb25JZCA9IG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQ7XG4gICAgbGV0IGluc3RhbGxhdGlvbklkUHJvbWlzZTtcbiAgICBpZiAoaW5zdGFsbGF0aW9uSWQgJiYgdHlwZW9mIGluc3RhbGxhdGlvbklkID09PSAnc3RyaW5nJykge1xuICAgICAgaW5zdGFsbGF0aW9uSWRQcm9taXNlID0gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGluc3RhbGxhdGlvbklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5zdGFsbGF0aW9uQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoKTtcbiAgICAgIGluc3RhbGxhdGlvbklkUHJvbWlzZSA9IGluc3RhbGxhdGlvbkNvbnRyb2xsZXIuY3VycmVudEluc3RhbGxhdGlvbklkKCk7XG4gICAgfVxuICAgIHJldHVybiBpbnN0YWxsYXRpb25JZFByb21pc2UudGhlbihpaWQgPT4ge1xuICAgICAgcGF5bG9hZC5fSW5zdGFsbGF0aW9uSWQgPSBpaWQ7XG4gICAgICBjb25zdCB1c2VyQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5zZXNzaW9uVG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUob3B0aW9ucy5zZXNzaW9uVG9rZW4pO1xuICAgICAgfSBlbHNlIGlmICh1c2VyQ29udHJvbGxlcikge1xuICAgICAgICByZXR1cm4gdXNlckNvbnRyb2xsZXIuY3VycmVudFVzZXJBc3luYygpLnRoZW4odXNlciA9PiB7XG4gICAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodXNlci5nZXRTZXNzaW9uVG9rZW4oKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShudWxsKTtcbiAgICB9KS50aGVuKHRva2VuID0+IHtcbiAgICAgIGlmICh0b2tlbikge1xuICAgICAgICBwYXlsb2FkLl9TZXNzaW9uVG9rZW4gPSB0b2tlbjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBheWxvYWRTdHJpbmcgPSAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShwYXlsb2FkKTtcbiAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5hamF4KG1ldGhvZCwgdXJsLCBwYXlsb2FkU3RyaW5nLCB7fSwgb3B0aW9ucykudGhlbihfcmVmID0+IHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICB4aHJcbiAgICAgICAgfSA9IF9yZWY7XG4gICAgICAgIGlmIChvcHRpb25zLnJldHVyblN0YXR1cykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5yZXNwb25zZSxcbiAgICAgICAgICAgIF9zdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICAgIF9oZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgX3hocjogeGhyXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLmNhdGNoKFJFU1RDb250cm9sbGVyLmhhbmRsZUVycm9yKTtcbiAgfSxcbiAgaGFuZGxlRXJyb3IocmVzcG9uc2UpIHtcbiAgICAvLyBUcmFuc2Zvcm0gdGhlIGVycm9yIGludG8gYW4gaW5zdGFuY2Ugb2YgUGFyc2VFcnJvciBieSB0cnlpbmcgdG8gcGFyc2VcbiAgICAvLyB0aGUgZXJyb3Igc3RyaW5nIGFzIEpTT05cbiAgICBsZXQgZXJyb3I7XG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3BvbnNlVGV4dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXJyb3JKU09OID0gSlNPTi5wYXJzZShyZXNwb25zZS5yZXNwb25zZVRleHQpO1xuICAgICAgICBlcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KGVycm9ySlNPTi5jb2RlLCBlcnJvckpTT04uZXJyb3IpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiB3ZSBmYWlsIHRvIHBhcnNlIHRoZSBlcnJvciB0ZXh0LCB0aGF0J3Mgb2theS5cbiAgICAgICAgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfSlNPTiwgJ1JlY2VpdmVkIGFuIGVycm9yIHdpdGggaW52YWxpZCBKU09OIGZyb20gUGFyc2U6ICcgKyByZXNwb25zZS5yZXNwb25zZVRleHQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZSA/IHJlc3BvbnNlLm1lc3NhZ2UgOiByZXNwb25zZTtcbiAgICAgIGVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5DT05ORUNUSU9OX0ZBSUxFRCwgJ1hNTEh0dHBSZXF1ZXN0IGZhaWxlZDogJyArICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yKTtcbiAgfSxcbiAgX3NldFhIUih4aHIpIHtcbiAgICBYSFIgPSB4aHI7XG4gIH0sXG4gIF9nZXRYSFIoKSB7XG4gICAgcmV0dXJuIFhIUjtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gUkVTVENvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBSRVNUQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9XZWFrTWFwID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXBcIik7XG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNsZWFyQWxsU3RhdGUgPSBjbGVhckFsbFN0YXRlO1xuZXhwb3J0cy5jb21taXRTZXJ2ZXJDaGFuZ2VzID0gY29tbWl0U2VydmVyQ2hhbmdlcztcbmV4cG9ydHMuZHVwbGljYXRlU3RhdGUgPSBkdXBsaWNhdGVTdGF0ZTtcbmV4cG9ydHMuZW5xdWV1ZVRhc2sgPSBlbnF1ZXVlVGFzaztcbmV4cG9ydHMuZXN0aW1hdGVBdHRyaWJ1dGUgPSBlc3RpbWF0ZUF0dHJpYnV0ZTtcbmV4cG9ydHMuZXN0aW1hdGVBdHRyaWJ1dGVzID0gZXN0aW1hdGVBdHRyaWJ1dGVzO1xuZXhwb3J0cy5nZXRPYmplY3RDYWNoZSA9IGdldE9iamVjdENhY2hlO1xuZXhwb3J0cy5nZXRQZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcztcbmV4cG9ydHMuZ2V0U2VydmVyRGF0YSA9IGdldFNlcnZlckRhdGE7XG5leHBvcnRzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG5leHBvcnRzLmluaXRpYWxpemVTdGF0ZSA9IGluaXRpYWxpemVTdGF0ZTtcbmV4cG9ydHMubWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZSA9IG1lcmdlRmlyc3RQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnBvcFBlbmRpbmdTdGF0ZSA9IHBvcFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucHVzaFBlbmRpbmdTdGF0ZSA9IHB1c2hQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnJlbW92ZVN0YXRlID0gcmVtb3ZlU3RhdGU7XG5leHBvcnRzLnNldFBlbmRpbmdPcCA9IHNldFBlbmRpbmdPcDtcbmV4cG9ydHMuc2V0U2VydmVyRGF0YSA9IHNldFNlcnZlckRhdGE7XG52YXIgT2JqZWN0U3RhdGVNdXRhdGlvbnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9PYmplY3RTdGF0ZU11dGF0aW9uc1wiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoZSkge1xuICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBfV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gIHZhciByID0gbmV3IF9XZWFrTWFwKCksXG4gICAgdCA9IG5ldyBfV2Vha01hcCgpO1xuICByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGUgPyB0IDogcjtcbiAgfSkoZSk7XG59XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChlLCByKSB7XG4gIGlmICghciAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgIGRlZmF1bHQ6IGVcbiAgfTtcbiAgdmFyIHQgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUocik7XG4gIGlmICh0ICYmIHQuaGFzKGUpKSByZXR1cm4gdC5nZXQoZSk7XG4gIHZhciBuID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbFxuICB9O1xuICBmb3IgKHZhciB1IGluIGUpIGlmIChcImRlZmF1bHRcIiAhPT0gdSAmJiB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHUpKSB7XG4gICAgdmFyIGkgPSBfT2JqZWN0JGRlZmluZVByb3BlcnR5ICYmIF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID8gX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdSkgOiBudWxsO1xuICAgIGkgJiYgKGkuZ2V0IHx8IGkuc2V0KSA/IF9PYmplY3QkZGVmaW5lUHJvcGVydHkobiwgdSwgaSkgOiBuW3VdID0gZVt1XTtcbiAgfVxuICByZXR1cm4gbi5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCBuKSwgbjtcbn1cbmxldCBvYmplY3RTdGF0ZSA9IHt9O1xuZnVuY3Rpb24gZ2V0U3RhdGUob2JqKSB7XG4gIGNvbnN0IGNsYXNzRGF0YSA9IG9iamVjdFN0YXRlW29iai5jbGFzc05hbWVdO1xuICBpZiAoY2xhc3NEYXRhKSB7XG4gICAgcmV0dXJuIGNsYXNzRGF0YVtvYmouaWRdIHx8IG51bGw7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBpbml0aWFsaXplU3RhdGUob2JqLCBpbml0aWFsKSB7XG4gIGxldCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAoIW9iamVjdFN0YXRlW29iai5jbGFzc05hbWVdKSB7XG4gICAgb2JqZWN0U3RhdGVbb2JqLmNsYXNzTmFtZV0gPSB7fTtcbiAgfVxuICBpZiAoIWluaXRpYWwpIHtcbiAgICBpbml0aWFsID0gT2JqZWN0U3RhdGVNdXRhdGlvbnMuZGVmYXVsdFN0YXRlKCk7XG4gIH1cbiAgc3RhdGUgPSBvYmplY3RTdGF0ZVtvYmouY2xhc3NOYW1lXVtvYmouaWRdID0gaW5pdGlhbDtcbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3RhdGUob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZGVsZXRlIG9iamVjdFN0YXRlW29iai5jbGFzc05hbWVdW29iai5pZF07XG4gIHJldHVybiBzdGF0ZTtcbn1cbmZ1bmN0aW9uIGdldFNlcnZlckRhdGEob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLnNlcnZlckRhdGE7XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuZnVuY3Rpb24gc2V0U2VydmVyRGF0YShvYmosIGF0dHJpYnV0ZXMpIHtcbiAgY29uc3Qgc2VydmVyRGF0YSA9IGluaXRpYWxpemVTdGF0ZShvYmopLnNlcnZlckRhdGE7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLnNldFNlcnZlckRhdGEoc2VydmVyRGF0YSwgYXR0cmlidXRlcyk7XG59XG5mdW5jdGlvbiBnZXRQZW5kaW5nT3BzKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5wZW5kaW5nT3BzO1xuICB9XG4gIHJldHVybiBbe31dO1xufVxuZnVuY3Rpb24gc2V0UGVuZGluZ09wKG9iaiwgYXR0ciwgb3ApIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGluaXRpYWxpemVTdGF0ZShvYmopLnBlbmRpbmdPcHM7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLnNldFBlbmRpbmdPcChwZW5kaW5nT3BzLCBhdHRyLCBvcCk7XG59XG5mdW5jdGlvbiBwdXNoUGVuZGluZ1N0YXRlKG9iaikge1xuICBjb25zdCBwZW5kaW5nT3BzID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikucGVuZGluZ09wcztcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMucHVzaFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKTtcbn1cbmZ1bmN0aW9uIHBvcFBlbmRpbmdTdGF0ZShvYmopIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGluaXRpYWxpemVTdGF0ZShvYmopLnBlbmRpbmdPcHM7XG4gIHJldHVybiBPYmplY3RTdGF0ZU11dGF0aW9ucy5wb3BQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG59XG5mdW5jdGlvbiBtZXJnZUZpcnN0UGVuZGluZ1N0YXRlKG9iaikge1xuICBjb25zdCBwZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcyhvYmopO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5tZXJnZUZpcnN0UGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xufVxuZnVuY3Rpb24gZ2V0T2JqZWN0Q2FjaGUob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLm9iamVjdENhY2hlO1xuICB9XG4gIHJldHVybiB7fTtcbn1cbmZ1bmN0aW9uIGVzdGltYXRlQXR0cmlidXRlKG9iaiwgYXR0cikge1xuICBjb25zdCBzZXJ2ZXJEYXRhID0gZ2V0U2VydmVyRGF0YShvYmopO1xuICBjb25zdCBwZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcyhvYmopO1xuICByZXR1cm4gT2JqZWN0U3RhdGVNdXRhdGlvbnMuZXN0aW1hdGVBdHRyaWJ1dGUoc2VydmVyRGF0YSwgcGVuZGluZ09wcywgb2JqLCBhdHRyKTtcbn1cbmZ1bmN0aW9uIGVzdGltYXRlQXR0cmlidXRlcyhvYmopIHtcbiAgY29uc3Qgc2VydmVyRGF0YSA9IGdldFNlcnZlckRhdGEob2JqKTtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHMob2JqKTtcbiAgcmV0dXJuIE9iamVjdFN0YXRlTXV0YXRpb25zLmVzdGltYXRlQXR0cmlidXRlcyhzZXJ2ZXJEYXRhLCBwZW5kaW5nT3BzLCBvYmopO1xufVxuZnVuY3Rpb24gY29tbWl0U2VydmVyQ2hhbmdlcyhvYmosIGNoYW5nZXMpIHtcbiAgY29uc3Qgc3RhdGUgPSBpbml0aWFsaXplU3RhdGUob2JqKTtcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMuY29tbWl0U2VydmVyQ2hhbmdlcyhzdGF0ZS5zZXJ2ZXJEYXRhLCBzdGF0ZS5vYmplY3RDYWNoZSwgY2hhbmdlcyk7XG59XG5mdW5jdGlvbiBlbnF1ZXVlVGFzayhvYmosIHRhc2spIHtcbiAgY29uc3Qgc3RhdGUgPSBpbml0aWFsaXplU3RhdGUob2JqKTtcbiAgcmV0dXJuIHN0YXRlLnRhc2tzLmVucXVldWUodGFzayk7XG59XG5mdW5jdGlvbiBjbGVhckFsbFN0YXRlKCkge1xuICBvYmplY3RTdGF0ZSA9IHt9O1xufVxuZnVuY3Rpb24gZHVwbGljYXRlU3RhdGUoc291cmNlLCBkZXN0KSB7XG4gIGRlc3QuaWQgPSBzb3VyY2UuaWQ7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbmNsYXNzIFNvY2tldFdlYXBwIHtcbiAgY29uc3RydWN0b3Ioc2VydmVyVVJMKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbm9wZW5cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9ubWVzc2FnZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25jbG9zZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25lcnJvclwiLCB2b2lkIDApO1xuICAgIHRoaXMub25vcGVuID0gKCkgPT4ge307XG4gICAgdGhpcy5vbm1lc3NhZ2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLm9uY2xvc2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLm9uZXJyb3IgPSAoKSA9PiB7fTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5vblNvY2tldE9wZW4oKCkgPT4ge1xuICAgICAgdGhpcy5vbm9wZW4oKTtcbiAgICB9KTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5vblNvY2tldE1lc3NhZ2UobXNnID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMub25tZXNzYWdlKG1zZyk7XG4gICAgfSk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3gub25Tb2NrZXRDbG9zZShldmVudCA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm9uY2xvc2UoZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4Lm9uU29ja2V0RXJyb3IoZXJyb3IgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5vbmVycm9yKGVycm9yKTtcbiAgICB9KTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5jb25uZWN0U29ja2V0KHtcbiAgICAgIHVybDogc2VydmVyVVJMXG4gICAgfSk7XG4gIH1cbiAgc2VuZChkYXRhKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4LnNlbmRTb2NrZXRNZXNzYWdlKHtcbiAgICAgIGRhdGFcbiAgICB9KTtcbiAgfVxuICBjbG9zZSgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3guY2xvc2VTb2NrZXQoKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBTb2NrZXRXZWFwcDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFNvY2tldFdlYXBwOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuY29uc3QgU3RvcmFnZSA9IHtcbiAgYXN5bmMoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuICEhY29udHJvbGxlci5hc3luYztcbiAgfSxcbiAgZ2V0SXRlbShwYXRoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3luY2hyb25vdXMgc3RvcmFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHN0b3JhZ2UgY29udHJvbGxlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5nZXRJdGVtKHBhdGgpO1xuICB9LFxuICBnZXRJdGVtQXN5bmMocGF0aCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5nZXRJdGVtQXN5bmMocGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY29udHJvbGxlci5nZXRJdGVtKHBhdGgpKTtcbiAgfSxcbiAgc2V0SXRlbShwYXRoLCB2YWx1ZSkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIHN0b3JhZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBzdG9yYWdlIGNvbnRyb2xsZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuc2V0SXRlbShwYXRoLCB2YWx1ZSk7XG4gIH0sXG4gIHNldEl0ZW1Bc3luYyhwYXRoLCB2YWx1ZSkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5zZXRJdGVtQXN5bmMocGF0aCwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNvbnRyb2xsZXIuc2V0SXRlbShwYXRoLCB2YWx1ZSkpO1xuICB9LFxuICByZW1vdmVJdGVtKHBhdGgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTeW5jaHJvbm91cyBzdG9yYWdlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgc3RvcmFnZSBjb250cm9sbGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLnJlbW92ZUl0ZW0ocGF0aCk7XG4gIH0sXG4gIHJlbW92ZUl0ZW1Bc3luYyhwYXRoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLnJlbW92ZUl0ZW1Bc3luYyhwYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjb250cm9sbGVyLnJlbW92ZUl0ZW0ocGF0aCkpO1xuICB9LFxuICBnZXRBbGxLZXlzKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIHN0b3JhZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBzdG9yYWdlIGNvbnRyb2xsZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0QWxsS2V5cygpO1xuICB9LFxuICBnZXRBbGxLZXlzQXN5bmMoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLmdldEFsbEtleXNBc3luYygpO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNvbnRyb2xsZXIuZ2V0QWxsS2V5cygpKTtcbiAgfSxcbiAgZ2VuZXJhdGVQYXRoKHBhdGgpIHtcbiAgICBpZiAoIV9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQVBQTElDQVRJT05fSUQnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBjYWxsIFBhcnNlLmluaXRpYWxpemUgYmVmb3JlIHVzaW5nIFBhcnNlLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIGdldCBhIFN0b3JhZ2UgcGF0aCB0aGF0IHdhcyBub3QgYSBTdHJpbmcuJyk7XG4gICAgfVxuICAgIGlmIChwYXRoWzBdID09PSAnLycpIHtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigxKTtcbiAgICB9XG4gICAgcmV0dXJuICdQYXJzZS8nICsgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBUFBMSUNBVElPTl9JRCcpICsgJy8nICsgcGF0aDtcbiAgfSxcbiAgX2NsZWFyKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmhhc093blByb3BlcnR5KCdjbGVhcicpKSB7XG4gICAgICBjb250cm9sbGVyLmNsZWFyKCk7XG4gICAgfVxuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gU3RvcmFnZTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vKiBnbG9iYWwgbG9jYWxTdG9yYWdlICovXG5cbmNvbnN0IFN0b3JhZ2VDb250cm9sbGVyID0ge1xuICBhc3luYzogMCxcbiAgZ2V0SXRlbShwYXRoKSB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHBhdGgpO1xuICB9LFxuICBzZXRJdGVtKHBhdGgsIHZhbHVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHBhdGgsIHZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBRdW90YSBleGNlZWRlZCwgcG9zc2libHkgZHVlIHRvIFNhZmFyaSBQcml2YXRlIEJyb3dzaW5nIG1vZGVcbiAgICAgIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7XG4gICAgfVxuICB9LFxuICByZW1vdmVJdGVtKHBhdGgpIHtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShwYXRoKTtcbiAgfSxcbiAgZ2V0QWxsS2V5cygpIHtcbiAgICBjb25zdCBrZXlzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGtleXMucHVzaChsb2NhbFN0b3JhZ2Uua2V5KGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG4gIH0sXG4gIGNsZWFyKCkge1xuICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN0b3JhZ2VDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbi8vIFdoZW4gdGhlcmUgaXMgbm8gbmF0aXZlIHN0b3JhZ2UgaW50ZXJmYWNlLCB3ZSBkZWZhdWx0IHRvIGFuIGluLW1lbW9yeSBtYXBcbmNvbnN0IG1lbU1hcCA9IHt9O1xuY29uc3QgU3RvcmFnZUNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jOiAwLFxuICBnZXRJdGVtKHBhdGgpIHtcbiAgICBpZiAobWVtTWFwLmhhc093blByb3BlcnR5KHBhdGgpKSB7XG4gICAgICByZXR1cm4gbWVtTWFwW3BhdGhdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgc2V0SXRlbShwYXRoLCB2YWx1ZSkge1xuICAgIG1lbU1hcFtwYXRoXSA9IFN0cmluZyh2YWx1ZSk7XG4gIH0sXG4gIHJlbW92ZUl0ZW0ocGF0aCkge1xuICAgIGRlbGV0ZSBtZW1NYXBbcGF0aF07XG4gIH0sXG4gIGdldEFsbEtleXMoKSB7XG4gICAgcmV0dXJuICgwLCBfa2V5cy5kZWZhdWx0KShtZW1NYXApO1xuICB9LFxuICBjbGVhcigpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBtZW1NYXApIHtcbiAgICAgIGlmIChtZW1NYXAuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBkZWxldGUgbWVtTWFwW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN0b3JhZ2VDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX1N0b3JhZ2VDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlQ29udHJvbGxlci5yZWFjdC1uYXRpdmVcIikpO1xudmFyIF9TdG9yYWdlQ29udHJvbGxlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VDb250cm9sbGVyLmJyb3dzZXJcIikpO1xudmFyIF9TdG9yYWdlQ29udHJvbGxlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VDb250cm9sbGVyLndlYXBwXCIpKTtcbnZhciBfU3RvcmFnZUNvbnRyb2xsZXI0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0XCIpKTtcbmxldCBTdG9yYWdlQ29udHJvbGxlciA9IF9TdG9yYWdlQ29udHJvbGxlcjQuZGVmYXVsdDtcblN0b3JhZ2VDb250cm9sbGVyID0gX1N0b3JhZ2VDb250cm9sbGVyMi5kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN0b3JhZ2VDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuY29uc3QgU3RvcmFnZUNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jOiAxLFxuICBnZXRJdGVtQXN5bmMocGF0aCkge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBc3luY1N0b3JhZ2UoKS5nZXRJdGVtKHBhdGgsIChlcnIsIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgc2V0SXRlbUFzeW5jKHBhdGgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLnNldEl0ZW0ocGF0aCwgdmFsdWUsIGVyciA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICByZW1vdmVJdGVtQXN5bmMocGF0aCkge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBc3luY1N0b3JhZ2UoKS5yZW1vdmVJdGVtKHBhdGgsIGVyciA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBnZXRBbGxLZXlzQXN5bmMoKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLmdldEFsbEtleXMoKGVyciwga2V5cykgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShrZXlzIHx8IFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIG11bHRpR2V0KGtleXMpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkubXVsdGlHZXQoa2V5cywgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIG11bHRpUmVtb3ZlKGtleXMpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkubXVsdGlSZW1vdmUoa2V5cywgZXJyID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoa2V5cyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBjbGVhcigpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkuY2xlYXIoKTtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gU3RvcmFnZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdG9yYWdlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9rZXlzXCIpKTtcbmNvbnN0IFN0b3JhZ2VDb250cm9sbGVyID0ge1xuICBhc3luYzogMCxcbiAgZ2V0SXRlbShwYXRoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiB3eC5nZXRTdG9yYWdlU3luYyhwYXRoKTtcbiAgfSxcbiAgc2V0SXRlbShwYXRoLCB2YWx1ZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB3eC5zZXRTdG9yYWdlU3luYyhwYXRoLCB2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gUXVvdGEgZXhjZWVkZWRcbiAgICB9XG4gIH0sXG4gIHJlbW92ZUl0ZW0ocGF0aCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5yZW1vdmVTdG9yYWdlU3luYyhwYXRoKTtcbiAgfSxcbiAgZ2V0QWxsS2V5cygpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgcmVzID0gd3guZ2V0U3RvcmFnZUluZm9TeW5jKCk7XG4gICAgcmV0dXJuICgwLCBfa2V5cy5kZWZhdWx0KShyZXMpO1xuICB9LFxuICBjbGVhcigpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3guY2xlYXJTdG9yYWdlU3luYygpO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN0b3JhZ2VDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX3Byb21pc2VVdGlscyA9IHJlcXVpcmUoXCIuL3Byb21pc2VVdGlsc1wiKTtcbmNsYXNzIFRhc2tRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicXVldWVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLnF1ZXVlID0gW107XG4gIH1cbiAgZW5xdWV1ZSh0YXNrKSB7XG4gICAgY29uc3QgdGFza0NvbXBsZXRlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICB0aGlzLnF1ZXVlLnB1c2goe1xuICAgICAgdGFzazogdGFzayxcbiAgICAgIF9jb21wbGV0aW9uOiB0YXNrQ29tcGxldGVcbiAgICB9KTtcbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRhc2soKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZGVxdWV1ZSgpO1xuICAgICAgICB0YXNrQ29tcGxldGUucmVzb2x2ZSgpO1xuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLl9kZXF1ZXVlKCk7XG4gICAgICAgIHRhc2tDb21wbGV0ZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXNrQ29tcGxldGU7XG4gIH1cbiAgX2RlcXVldWUoKSB7XG4gICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCkge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMucXVldWVbMF07XG4gICAgICBuZXh0LnRhc2soKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZGVxdWV1ZSgpO1xuICAgICAgICBuZXh0Ll9jb21wbGV0aW9uLnJlc29sdmUoKTtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5fZGVxdWV1ZSgpO1xuICAgICAgICBuZXh0Ll9jb21wbGV0aW9uLnJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gVGFza1F1ZXVlO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gVGFza1F1ZXVlOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX1dlYWtNYXAyID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvd2Vhay1tYXBcIik7XG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jbGVhckFsbFN0YXRlID0gY2xlYXJBbGxTdGF0ZTtcbmV4cG9ydHMuY29tbWl0U2VydmVyQ2hhbmdlcyA9IGNvbW1pdFNlcnZlckNoYW5nZXM7XG5leHBvcnRzLmR1cGxpY2F0ZVN0YXRlID0gZHVwbGljYXRlU3RhdGU7XG5leHBvcnRzLmVucXVldWVUYXNrID0gZW5xdWV1ZVRhc2s7XG5leHBvcnRzLmVzdGltYXRlQXR0cmlidXRlID0gZXN0aW1hdGVBdHRyaWJ1dGU7XG5leHBvcnRzLmVzdGltYXRlQXR0cmlidXRlcyA9IGVzdGltYXRlQXR0cmlidXRlcztcbmV4cG9ydHMuZ2V0T2JqZWN0Q2FjaGUgPSBnZXRPYmplY3RDYWNoZTtcbmV4cG9ydHMuZ2V0UGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHM7XG5leHBvcnRzLmdldFNlcnZlckRhdGEgPSBnZXRTZXJ2ZXJEYXRhO1xuZXhwb3J0cy5nZXRTdGF0ZSA9IGdldFN0YXRlO1xuZXhwb3J0cy5pbml0aWFsaXplU3RhdGUgPSBpbml0aWFsaXplU3RhdGU7XG5leHBvcnRzLm1lcmdlRmlyc3RQZW5kaW5nU3RhdGUgPSBtZXJnZUZpcnN0UGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5wb3BQZW5kaW5nU3RhdGUgPSBwb3BQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnB1c2hQZW5kaW5nU3RhdGUgPSBwdXNoUGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5yZW1vdmVTdGF0ZSA9IHJlbW92ZVN0YXRlO1xuZXhwb3J0cy5zZXRQZW5kaW5nT3AgPSBzZXRQZW5kaW5nT3A7XG5leHBvcnRzLnNldFNlcnZlckRhdGEgPSBzZXRTZXJ2ZXJEYXRhO1xudmFyIF93ZWFrTWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS93ZWFrLW1hcFwiKSk7XG52YXIgT2JqZWN0U3RhdGVNdXRhdGlvbnMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9PYmplY3RTdGF0ZU11dGF0aW9uc1wiKSk7XG52YXIgX1Rhc2tRdWV1ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vVGFza1F1ZXVlXCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIF9XZWFrTWFwMikgcmV0dXJuIG51bGw7XG4gIHZhciByID0gbmV3IF9XZWFrTWFwMigpLFxuICAgIHQgPSBuZXcgX1dlYWtNYXAyKCk7XG4gIHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZSA/IHQgOiByO1xuICB9KShlKTtcbn1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKGUsIHIpIHtcbiAgaWYgKCFyICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgZGVmYXVsdDogZVxuICB9O1xuICB2YXIgdCA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShyKTtcbiAgaWYgKHQgJiYgdC5oYXMoZSkpIHJldHVybiB0LmdldChlKTtcbiAgdmFyIG4gPSB7XG4gICAgX19wcm90b19fOiBudWxsXG4gIH07XG4gIGZvciAodmFyIHUgaW4gZSkgaWYgKFwiZGVmYXVsdFwiICE9PSB1ICYmIHt9Lmhhc093blByb3BlcnR5LmNhbGwoZSwgdSkpIHtcbiAgICB2YXIgaSA9IF9PYmplY3QkZGVmaW5lUHJvcGVydHkgJiYgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPyBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB1KSA6IG51bGw7XG4gICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gX09iamVjdCRkZWZpbmVQcm9wZXJ0eShuLCB1LCBpKSA6IG5bdV0gPSBlW3VdO1xuICB9XG4gIHJldHVybiBuLmRlZmF1bHQgPSBlLCB0ICYmIHQuc2V0KGUsIG4pLCBuO1xufVxubGV0IG9iamVjdFN0YXRlID0gbmV3IF93ZWFrTWFwLmRlZmF1bHQoKTtcbmZ1bmN0aW9uIGdldFN0YXRlKG9iaikge1xuICBjb25zdCBjbGFzc0RhdGEgPSBvYmplY3RTdGF0ZS5nZXQob2JqKTtcbiAgcmV0dXJuIGNsYXNzRGF0YSB8fCBudWxsO1xufVxuZnVuY3Rpb24gaW5pdGlhbGl6ZVN0YXRlKG9iaiwgaW5pdGlhbCkge1xuICBsZXQgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKCFpbml0aWFsKSB7XG4gICAgaW5pdGlhbCA9IHtcbiAgICAgIHNlcnZlckRhdGE6IHt9LFxuICAgICAgcGVuZGluZ09wczogW3t9XSxcbiAgICAgIG9iamVjdENhY2hlOiB7fSxcbiAgICAgIHRhc2tzOiBuZXcgX1Rhc2tRdWV1ZS5kZWZhdWx0KCksXG4gICAgICBleGlzdGVkOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgc3RhdGUgPSBpbml0aWFsO1xuICBvYmplY3RTdGF0ZS5zZXQob2JqLCBzdGF0ZSk7XG4gIHJldHVybiBzdGF0ZTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0YXRlKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIG9iamVjdFN0YXRlLmRlbGV0ZShvYmopO1xuICByZXR1cm4gc3RhdGU7XG59XG5mdW5jdGlvbiBnZXRTZXJ2ZXJEYXRhKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5zZXJ2ZXJEYXRhO1xuICB9XG4gIHJldHVybiB7fTtcbn1cbmZ1bmN0aW9uIHNldFNlcnZlckRhdGEob2JqLCBhdHRyaWJ1dGVzKSB7XG4gIGNvbnN0IHNlcnZlckRhdGEgPSBpbml0aWFsaXplU3RhdGUob2JqKS5zZXJ2ZXJEYXRhO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5zZXRTZXJ2ZXJEYXRhKHNlcnZlckRhdGEsIGF0dHJpYnV0ZXMpO1xufVxuZnVuY3Rpb24gZ2V0UGVuZGluZ09wcyhvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUucGVuZGluZ09wcztcbiAgfVxuICByZXR1cm4gW3t9XTtcbn1cbmZ1bmN0aW9uIHNldFBlbmRpbmdPcChvYmosIGF0dHIsIG9wKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBpbml0aWFsaXplU3RhdGUob2JqKS5wZW5kaW5nT3BzO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5zZXRQZW5kaW5nT3AocGVuZGluZ09wcywgYXR0ciwgb3ApO1xufVxuZnVuY3Rpb24gcHVzaFBlbmRpbmdTdGF0ZShvYmopIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGluaXRpYWxpemVTdGF0ZShvYmopLnBlbmRpbmdPcHM7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLnB1c2hQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG59XG5mdW5jdGlvbiBwb3BQZW5kaW5nU3RhdGUob2JqKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBpbml0aWFsaXplU3RhdGUob2JqKS5wZW5kaW5nT3BzO1xuICByZXR1cm4gT2JqZWN0U3RhdGVNdXRhdGlvbnMucG9wUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xufVxuZnVuY3Rpb24gbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZShvYmopIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHMob2JqKTtcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMubWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKTtcbn1cbmZ1bmN0aW9uIGdldE9iamVjdENhY2hlKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5vYmplY3RDYWNoZTtcbiAgfVxuICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBlc3RpbWF0ZUF0dHJpYnV0ZShvYmosIGF0dHIpIHtcbiAgY29uc3Qgc2VydmVyRGF0YSA9IGdldFNlcnZlckRhdGEob2JqKTtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHMob2JqKTtcbiAgcmV0dXJuIE9iamVjdFN0YXRlTXV0YXRpb25zLmVzdGltYXRlQXR0cmlidXRlKHNlcnZlckRhdGEsIHBlbmRpbmdPcHMsIG9iaiwgYXR0cik7XG59XG5mdW5jdGlvbiBlc3RpbWF0ZUF0dHJpYnV0ZXMob2JqKSB7XG4gIGNvbnN0IHNlcnZlckRhdGEgPSBnZXRTZXJ2ZXJEYXRhKG9iaik7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzKG9iaik7XG4gIHJldHVybiBPYmplY3RTdGF0ZU11dGF0aW9ucy5lc3RpbWF0ZUF0dHJpYnV0ZXMoc2VydmVyRGF0YSwgcGVuZGluZ09wcywgb2JqKTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFNlcnZlckNoYW5nZXMob2JqLCBjaGFuZ2VzKSB7XG4gIGNvbnN0IHN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKG9iaik7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLmNvbW1pdFNlcnZlckNoYW5nZXMoc3RhdGUuc2VydmVyRGF0YSwgc3RhdGUub2JqZWN0Q2FjaGUsIGNoYW5nZXMpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVRhc2sob2JqLCB0YXNrKSB7XG4gIGNvbnN0IHN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKG9iaik7XG4gIHJldHVybiBzdGF0ZS50YXNrcy5lbnF1ZXVlKHRhc2spO1xufVxuZnVuY3Rpb24gZHVwbGljYXRlU3RhdGUoc291cmNlLCBkZXN0KSB7XG4gIGNvbnN0IG9sZFN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKHNvdXJjZSk7XG4gIGNvbnN0IG5ld1N0YXRlID0gaW5pdGlhbGl6ZVN0YXRlKGRlc3QpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBvbGRTdGF0ZS5zZXJ2ZXJEYXRhKSB7XG4gICAgbmV3U3RhdGUuc2VydmVyRGF0YVtrZXldID0gb2xkU3RhdGUuc2VydmVyRGF0YVtrZXldO1xuICB9XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvbGRTdGF0ZS5wZW5kaW5nT3BzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9sZFN0YXRlLnBlbmRpbmdPcHNbaW5kZXhdKSB7XG4gICAgICBuZXdTdGF0ZS5wZW5kaW5nT3BzW2luZGV4XVtrZXldID0gb2xkU3RhdGUucGVuZGluZ09wc1tpbmRleF1ba2V5XTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gb2xkU3RhdGUub2JqZWN0Q2FjaGUpIHtcbiAgICBuZXdTdGF0ZS5vYmplY3RDYWNoZVtrZXldID0gb2xkU3RhdGUub2JqZWN0Q2FjaGVba2V5XTtcbiAgfVxuICBuZXdTdGF0ZS5leGlzdGVkID0gb2xkU3RhdGUuZXhpc3RlZDtcbn1cbmZ1bmN0aW9uIGNsZWFyQWxsU3RhdGUoKSB7XG4gIG9iamVjdFN0YXRlID0gbmV3IF93ZWFrTWFwLmRlZmF1bHQoKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF93cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIndzXCIpKTtcbnZhciBfU29ja2V0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Tb2NrZXQud2VhcHBcIikpO1xuLyogZ2xvYmFsIFdlYlNvY2tldCAqL1xuXG5sZXQgV2ViU29ja2V0Q29udHJvbGxlcjtcbnRyeSB7XG4gIFdlYlNvY2tldENvbnRyb2xsZXIgPSB0eXBlb2YgV2ViU29ja2V0ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBXZWJTb2NrZXQgPT09ICdvYmplY3QnID8gV2ViU29ja2V0IDogbnVsbDtcbn0gY2F0Y2ggKF8pIHtcbiAgLy8gV2ViU29ja2V0IHVuYXZhaWxhYmxlXG59XG5tb2R1bGUuZXhwb3J0cyA9IFdlYlNvY2tldENvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBXZWJTb2NrZXRDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuY2xhc3MgWGhyV2VhcHAge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIlVOU0VOVFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiT1BFTkVEXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJIRUFERVJTX1JFQ0VJVkVEXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJMT0FESU5HXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJET05FXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJoZWFkZXJcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlYWR5U3RhdGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInN0YXR1c1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVzcG9uc2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlc3BvbnNlVHlwZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVzcG9uc2VUZXh0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZXNwb25zZUhlYWRlclwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwibWV0aG9kXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJ1cmxcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uYWJvcnRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9ucHJvZ3Jlc3NcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uZXJyb3JcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVxdWVzdFRhc2tcIiwgdm9pZCAwKTtcbiAgICB0aGlzLlVOU0VOVCA9IDA7XG4gICAgdGhpcy5PUEVORUQgPSAxO1xuICAgIHRoaXMuSEVBREVSU19SRUNFSVZFRCA9IDI7XG4gICAgdGhpcy5MT0FESU5HID0gMztcbiAgICB0aGlzLkRPTkUgPSA0O1xuICAgIHRoaXMuaGVhZGVyID0ge307XG4gICAgdGhpcy5yZWFkeVN0YXRlID0gdGhpcy5ET05FO1xuICAgIHRoaXMuc3RhdHVzID0gMDtcbiAgICB0aGlzLnJlc3BvbnNlID0gJyc7XG4gICAgdGhpcy5yZXNwb25zZVR5cGUgPSAnJztcbiAgICB0aGlzLnJlc3BvbnNlVGV4dCA9ICcnO1xuICAgIHRoaXMucmVzcG9uc2VIZWFkZXIgPSB7fTtcbiAgICB0aGlzLm1ldGhvZCA9ICcnO1xuICAgIHRoaXMudXJsID0gJyc7XG4gICAgdGhpcy5vbmFib3J0ID0gKCkgPT4ge307XG4gICAgdGhpcy5vbnByb2dyZXNzID0gKCkgPT4ge307XG4gICAgdGhpcy5vbmVycm9yID0gKCkgPT4ge307XG4gICAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLnJlcXVlc3RUYXNrID0gbnVsbDtcbiAgfVxuICBnZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB7XG4gICAgbGV0IGhlYWRlciA9ICcnO1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMucmVzcG9uc2VIZWFkZXIpIHtcbiAgICAgIGhlYWRlciArPSBrZXkgKyAnOicgKyB0aGlzLmdldFJlc3BvbnNlSGVhZGVyKGtleSkgKyAnXFxyXFxuJztcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcjtcbiAgfVxuICBnZXRSZXNwb25zZUhlYWRlcihrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZUhlYWRlcltrZXldO1xuICB9XG4gIHNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWx1ZSkge1xuICAgIHRoaXMuaGVhZGVyW2tleV0gPSB2YWx1ZTtcbiAgfVxuICBvcGVuKG1ldGhvZCwgdXJsKSB7XG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gIH1cbiAgYWJvcnQoKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3RUYXNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVxdWVzdFRhc2suYWJvcnQoKTtcbiAgICB0aGlzLnN0YXR1cyA9IDA7XG4gICAgdGhpcy5yZXNwb25zZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9uYWJvcnQoKTtcbiAgICB0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZSgpO1xuICB9XG4gIHNlbmQoZGF0YSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnJlcXVlc3RUYXNrID0gd3gucmVxdWVzdCh7XG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBoZWFkZXI6IHRoaXMuaGVhZGVyLFxuICAgICAgcmVzcG9uc2VUeXBlOiB0aGlzLnJlc3BvbnNlVHlwZSxcbiAgICAgIHN1Y2Nlc3M6IHJlcyA9PiB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gcmVzLnN0YXR1c0NvZGU7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXMuZGF0YTtcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlciA9IHJlcy5oZWFkZXI7XG4gICAgICAgIHRoaXMucmVzcG9uc2VUZXh0ID0gKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkocmVzLmRhdGEpO1xuICAgICAgICB0aGlzLnJlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbnJlYWR5c3RhdGVjaGFuZ2UoKTtcbiAgICAgIH0sXG4gICAgICBmYWlsOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLnJlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLm9uZXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlcXVlc3RUYXNrLm9uUHJvZ3Jlc3NVcGRhdGUocmVzID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiByZXMudG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZSAhPT0gMCxcbiAgICAgICAgbG9hZGVkOiByZXMudG90YWxCeXRlc1dyaXR0ZW4sXG4gICAgICAgIHRvdGFsOiByZXMudG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZVxuICAgICAgfTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMub25wcm9ncmVzcyhldmVudCk7XG4gICAgfSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gWGhyV2VhcHA7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBYaHJXZWFwcDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gYXJyYXlDb250YWluc09iamVjdDtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuZnVuY3Rpb24gYXJyYXlDb250YWluc09iamVjdChhcnJheSwgb2JqZWN0KSB7XG4gIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoYXJyYXkpLmNhbGwoYXJyYXksIG9iamVjdCkgPiAtMSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhcnJheVtpXSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0ICYmIGFycmF5W2ldLmNsYXNzTmFtZSA9PT0gb2JqZWN0LmNsYXNzTmFtZSAmJiBhcnJheVtpXS5fZ2V0SWQoKSA9PT0gb2JqZWN0Ll9nZXRJZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjYW5CZVNlcmlhbGl6ZWQ7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbmZ1bmN0aW9uIGNhbkJlU2VyaWFsaXplZChvYmopIHtcbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBpZiAoIShvYmogaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBhdHRyaWJ1dGVzID0gb2JqLmF0dHJpYnV0ZXM7XG4gIGZvciAoY29uc3QgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgY29uc3QgdmFsID0gYXR0cmlidXRlc1thdHRyXTtcbiAgICBpZiAoIWNhbkJlU2VyaWFsaXplZEhlbHBlcih2YWwpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY2FuQmVTZXJpYWxpemVkSGVscGVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICByZXR1cm4gISF2YWx1ZS5pZDtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQpIHtcbiAgICBpZiAodmFsdWUudXJsKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWNhbkJlU2VyaWFsaXplZEhlbHBlcih2YWx1ZVtpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3IgKGNvbnN0IGsgaW4gdmFsdWUpIHtcbiAgICBpZiAoIWNhbkJlU2VyaWFsaXplZEhlbHBlcih2YWx1ZVtrXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGRlY29kZTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBfUGFyc2VHZW9Qb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VHZW9Qb2ludFwiKSk7XG52YXIgX1BhcnNlUG9seWdvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VQb2x5Z29uXCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG5mdW5jdGlvbiBkZWNvZGUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgY29uc3QgZHVwID0gW107XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHZhbHVlKS5jYWxsKHZhbHVlLCAodiwgaSkgPT4ge1xuICAgICAgZHVwW2ldID0gZGVjb2RlKHYpO1xuICAgIH0pO1xuICAgIHJldHVybiBkdXA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZS5fX29wID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHtcbiAgICAgIG9wRnJvbUpTT05cbiAgICB9ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPcCgpO1xuICAgIHJldHVybiBvcEZyb21KU09OKHZhbHVlKTtcbiAgfVxuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdQb2ludGVyJyAmJiB2YWx1ZS5jbGFzc05hbWUpIHtcbiAgICByZXR1cm4gUGFyc2VPYmplY3QuZnJvbUpTT04odmFsdWUpO1xuICB9XG4gIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdPYmplY3QnICYmIHZhbHVlLmNsYXNzTmFtZSkge1xuICAgIHJldHVybiBQYXJzZU9iamVjdC5mcm9tSlNPTih2YWx1ZSk7XG4gIH1cbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ1JlbGF0aW9uJykge1xuICAgIC8vIFRoZSBwYXJlbnQgYW5kIGtleSBmaWVsZHMgd2lsbCBiZSBwb3B1bGF0ZWQgYnkgdGhlIHBhcmVudFxuICAgIGNvbnN0IHJlbGF0aW9uID0gbmV3IF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQobnVsbCwgbnVsbCk7XG4gICAgcmVsYXRpb24udGFyZ2V0Q2xhc3NOYW1lID0gdmFsdWUuY2xhc3NOYW1lO1xuICAgIHJldHVybiByZWxhdGlvbjtcbiAgfVxuICBpZiAodmFsdWUuX190eXBlID09PSAnRGF0ZScpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUuaXNvKTtcbiAgfVxuICBpZiAodmFsdWUuX190eXBlID09PSAnRmlsZScpIHtcbiAgICByZXR1cm4gX1BhcnNlRmlsZS5kZWZhdWx0LmZyb21KU09OKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWUuX190eXBlID09PSAnR2VvUG9pbnQnKSB7XG4gICAgcmV0dXJuIG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KHtcbiAgICAgIGxhdGl0dWRlOiB2YWx1ZS5sYXRpdHVkZSxcbiAgICAgIGxvbmdpdHVkZTogdmFsdWUubG9uZ2l0dWRlXG4gICAgfSk7XG4gIH1cbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgcmV0dXJuIG5ldyBfUGFyc2VQb2x5Z29uLmRlZmF1bHQodmFsdWUuY29vcmRpbmF0ZXMpO1xuICB9XG4gIGNvbnN0IGNvcHkgPSB7fTtcbiAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XG4gICAgY29weVtrXSA9IGRlY29kZSh2YWx1ZVtrXSk7XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfc3RhcnRzV2l0aCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGhcIikpO1xudmFyIF9jb25jYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUFDTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VBQ0xcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xudmFyIF9QYXJzZVBvbHlnb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUG9seWdvblwiKSk7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xuZnVuY3Rpb24gZW5jb2RlKHZhbHVlLCBkaXNhbGxvd09iamVjdHMsIGZvcmNlUG9pbnRlcnMsIHNlZW4sIG9mZmxpbmUpIHtcbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgIGlmIChkaXNhbGxvd09iamVjdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFyc2UgT2JqZWN0cyBub3QgYWxsb3dlZCBoZXJlJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlZW5FbnRyeSA9IHZhbHVlLmlkID8gdmFsdWUuY2xhc3NOYW1lICsgJzonICsgdmFsdWUuaWQgOiB2YWx1ZTtcbiAgICBpZiAoZm9yY2VQb2ludGVycyB8fCAhc2VlbiB8fCAoMCwgX2luZGV4T2YuZGVmYXVsdCkoc2VlbikuY2FsbChzZWVuLCBzZWVuRW50cnkpID4gLTEgfHwgdmFsdWUuZGlydHkoKSB8fCAoMCwgX2tleXMuZGVmYXVsdCkodmFsdWUuX2dldFNlcnZlckRhdGEoKSkubGVuZ3RoIDwgMSkge1xuICAgICAgdmFyIF9jb250ZXh0O1xuICAgICAgaWYgKG9mZmxpbmUgJiYgKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKF9jb250ZXh0ID0gdmFsdWUuX2dldElkKCkpLmNhbGwoX2NvbnRleHQsICdsb2NhbCcpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b09mZmxpbmVQb2ludGVyKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUudG9Qb2ludGVyKCk7XG4gICAgfVxuICAgIHNlZW4gPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShzZWVuKS5jYWxsKHNlZW4sIHNlZW5FbnRyeSk7XG4gICAgcmV0dXJuIHZhbHVlLl90b0Z1bGxKU09OKHNlZW4sIG9mZmxpbmUpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBPcFxuICB9ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPcCgpO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZUFDTC5kZWZhdWx0IHx8IHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVBvbHlnb24uZGVmYXVsdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICByZXR1cm4gdmFsdWUudG9KU09OKCk7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlRmlsZS5kZWZhdWx0KSB7XG4gICAgaWYgKCF2YWx1ZS51cmwoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byBlbmNvZGUgYW4gdW5zYXZlZCBmaWxlLicpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUudG9KU09OKCk7XG4gIH1cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gZW5jb2RlIGFuIGludmFsaWQgZGF0ZS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ0RhdGUnLFxuICAgICAgaXNvOiB2YWx1ZS50b0pTT04oKVxuICAgIH07XG4gIH1cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmIHR5cGVvZiB2YWx1ZS5zb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNvdXJjZTtcbiAgfVxuICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSkge1xuICAgIHJldHVybiAoMCwgX21hcC5kZWZhdWx0KSh2YWx1ZSkuY2FsbCh2YWx1ZSwgdiA9PiB7XG4gICAgICByZXR1cm4gZW5jb2RlKHYsIGRpc2FsbG93T2JqZWN0cywgZm9yY2VQb2ludGVycywgc2Vlbiwgb2ZmbGluZSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gdmFsdWUpIHtcbiAgICAgIG91dHB1dFtrXSA9IGVuY29kZSh2YWx1ZVtrXSwgZGlzYWxsb3dPYmplY3RzLCBmb3JjZVBvaW50ZXJzLCBzZWVuLCBvZmZsaW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBfZGVmYXVsdCh2YWx1ZSwgZGlzYWxsb3dPYmplY3RzLCBmb3JjZVBvaW50ZXJzLCBzZWVuLCBvZmZsaW5lKSB7XG4gIHJldHVybiBlbmNvZGUodmFsdWUsICEhZGlzYWxsb3dPYmplY3RzLCAhIWZvcmNlUG9pbnRlcnMsIHNlZW4gfHwgW10sIG9mZmxpbmUpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBlcXVhbHM7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUFDTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VBQ0xcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xuZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICBpZiAodG9TdHJpbmcuY2FsbChhKSA9PT0gJ1tvYmplY3QgRGF0ZV0nIHx8IHRvU3RyaW5nLmNhbGwoYikgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIGNvbnN0IGRhdGVBID0gbmV3IERhdGUoYSk7XG4gICAgY29uc3QgZGF0ZUIgPSBuZXcgRGF0ZShiKTtcbiAgICByZXR1cm4gK2RhdGVBID09PSArZGF0ZUI7XG4gIH1cbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIWEgfHwgdHlwZW9mIGEgIT09ICdvYmplY3QnKSB7XG4gICAgLy8gYSBpcyBhIHByaW1pdGl2ZVxuICAgIHJldHVybiBhID09PSBiO1xuICB9XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoYSkgfHwgKDAsIF9pc0FycmF5LmRlZmF1bHQpKGIpKSB7XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkoYSkgfHwgISgwLCBfaXNBcnJheS5kZWZhdWx0KShiKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBhLmxlbmd0aDsgaS0tOykge1xuICAgICAgaWYgKCFlcXVhbHMoYVtpXSwgYltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGlmIChhIGluc3RhbmNlb2YgX1BhcnNlQUNMLmRlZmF1bHQgfHwgYSBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCB8fCBhIGluc3RhbmNlb2YgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCB8fCBhIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICByZXR1cm4gYS5lcXVhbHMoYik7XG4gIH1cbiAgaWYgKGIgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgIGlmIChhLl9fdHlwZSA9PT0gJ09iamVjdCcgfHwgYS5fX3R5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgcmV0dXJuIGEub2JqZWN0SWQgPT09IGIuaWQgJiYgYS5jbGFzc05hbWUgPT09IGIuY2xhc3NOYW1lO1xuICAgIH1cbiAgfVxuICBpZiAoKDAsIF9rZXlzLmRlZmF1bHQpKGEpLmxlbmd0aCAhPT0gKDAsIF9rZXlzLmRlZmF1bHQpKGIpLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IGsgaW4gYSkge1xuICAgIGlmICghZXF1YWxzKGFba10sIGJba10pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGVzY2FwZTtcbmNvbnN0IGVuY29kZWQgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnLyc6ICcmI3gyRjsnLFxuICBcIidcIjogJyYjeDI3OycsXG4gICdcIic6ICcmcXVvdDsnXG59O1xuZnVuY3Rpb24gZXNjYXBlKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1smPD5cXC8nXCJdL2csIGZ1bmN0aW9uIChjaGFyKSB7XG4gICAgcmV0dXJuIGVuY29kZWRbY2hhcl07XG4gIH0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBpc1Jldm9jYWJsZVNlc3Npb247XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbmZ1bmN0aW9uIGlzUmV2b2NhYmxlU2Vzc2lvbih0b2tlbikge1xuICByZXR1cm4gKDAsIF9pbmRleE9mLmRlZmF1bHQpKHRva2VuKS5jYWxsKHRva2VuLCAncjonKSA+IC0xO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBwYXJzZURhdGU7XG52YXIgX3BhcnNlSW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcGFyc2UtaW50XCIpKTtcbmZ1bmN0aW9uIHBhcnNlRGF0ZShpc284NjAxKSB7XG4gIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoJ14oWzAtOV17MSw0fSktKFswLTldezEsMn0pLShbMC05XXsxLDJ9KScgKyAnVCcgKyAnKFswLTldezEsMn0pOihbMC05XXsxLDJ9KTooWzAtOV17MSwyfSknICsgJyguKFswLTldKykpPycgKyAnWiQnKTtcbiAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhpc284NjAxKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHllYXIgPSAoMCwgX3BhcnNlSW50Mi5kZWZhdWx0KShtYXRjaFsxXSkgfHwgMDtcbiAgY29uc3QgbW9udGggPSAoKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbMl0pIHx8IDEpIC0gMTtcbiAgY29uc3QgZGF5ID0gKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbM10pIHx8IDA7XG4gIGNvbnN0IGhvdXIgPSAoMCwgX3BhcnNlSW50Mi5kZWZhdWx0KShtYXRjaFs0XSkgfHwgMDtcbiAgY29uc3QgbWludXRlID0gKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbNV0pIHx8IDA7XG4gIGNvbnN0IHNlY29uZCA9ICgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzZdKSB8fCAwO1xuICBjb25zdCBtaWxsaSA9ICgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzhdKSB8fCAwO1xuICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpKSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY29udGludWVXaGlsZSA9IGNvbnRpbnVlV2hpbGU7XG5leHBvcnRzLnJlc29sdmluZ1Byb21pc2UgPSByZXNvbHZpbmdQcm9taXNlO1xuZXhwb3J0cy53aGVuID0gd2hlbjtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbi8vIENyZWF0ZSBEZWZlcnJlZCBQcm9taXNlXG5mdW5jdGlvbiByZXNvbHZpbmdQcm9taXNlKCkge1xuICBsZXQgcmVzO1xuICBsZXQgcmVqO1xuICBjb25zdCBwcm9taXNlID0gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlcyA9IHJlc29sdmU7XG4gICAgcmVqID0gcmVqZWN0O1xuICB9KTtcbiAgY29uc3QgZGVmZXIgPSBwcm9taXNlO1xuICBkZWZlci5yZXNvbHZlID0gcmVzO1xuICBkZWZlci5yZWplY3QgPSByZWo7XG4gIHJldHVybiBkZWZlcjtcbn1cbmZ1bmN0aW9uIHdoZW4ocHJvbWlzZXMpIHtcbiAgbGV0IG9iamVjdHM7XG4gIGNvbnN0IGFycmF5QXJndW1lbnQgPSAoMCwgX2lzQXJyYXkuZGVmYXVsdCkocHJvbWlzZXMpO1xuICBpZiAoYXJyYXlBcmd1bWVudCkge1xuICAgIG9iamVjdHMgPSBwcm9taXNlcztcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RzID0gYXJndW1lbnRzO1xuICB9XG4gIGxldCB0b3RhbCA9IG9iamVjdHMubGVuZ3RoO1xuICBsZXQgaGFkRXJyb3IgPSBmYWxzZTtcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICBjb25zdCByZXR1cm5WYWx1ZSA9IGFycmF5QXJndW1lbnQgPyBbcmVzdWx0c10gOiByZXN1bHRzO1xuICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgcmVzdWx0cy5sZW5ndGggPSBvYmplY3RzLmxlbmd0aDtcbiAgZXJyb3JzLmxlbmd0aCA9IG9iamVjdHMubGVuZ3RoO1xuICBpZiAodG90YWwgPT09IDApIHtcbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgfVxuICBjb25zdCBwcm9taXNlID0gcmVzb2x2aW5nUHJvbWlzZSgpO1xuICBjb25zdCByZXNvbHZlT25lID0gZnVuY3Rpb24gKCkge1xuICAgIHRvdGFsLS07XG4gICAgaWYgKHRvdGFsIDw9IDApIHtcbiAgICAgIGlmIChoYWRFcnJvcikge1xuICAgICAgICBwcm9taXNlLnJlamVjdChlcnJvcnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGNoYWluID0gZnVuY3Rpb24gKG9iamVjdCwgaW5kZXgpIHtcbiAgICBpZiAob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb2JqZWN0LnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICByZXN1bHRzW2luZGV4XSA9IHJlc3VsdDtcbiAgICAgICAgcmVzb2x2ZU9uZSgpO1xuICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGVycm9yc1tpbmRleF0gPSBlcnJvcjtcbiAgICAgICAgaGFkRXJyb3IgPSB0cnVlO1xuICAgICAgICByZXNvbHZlT25lKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0c1tpbmRleF0gPSBvYmplY3Q7XG4gICAgICByZXNvbHZlT25lKCk7XG4gICAgfVxuICB9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjaGFpbihvYmplY3RzW2ldLCBpKTtcbiAgfVxuICByZXR1cm4gcHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGNvbnRpbnVlV2hpbGUodGVzdCwgZW1pdHRlcikge1xuICBpZiAodGVzdCgpKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIoKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBjb250aW51ZVdoaWxlKHRlc3QsIGVtaXR0ZXIpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdW5pcXVlO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfYXJyYXlDb250YWluc09iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vYXJyYXlDb250YWluc09iamVjdFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG5mdW5jdGlvbiB1bmlxdWUoYXJyKSB7XG4gIGNvbnN0IHVuaXF1ZXMgPSBbXTtcbiAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGFycikuY2FsbChhcnIsIHZhbHVlID0+IHtcbiAgICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgIGlmICghKDAsIF9hcnJheUNvbnRhaW5zT2JqZWN0LmRlZmF1bHQpKHVuaXF1ZXMsIHZhbHVlKSkge1xuICAgICAgICB1bmlxdWVzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHVuaXF1ZXMpLmNhbGwodW5pcXVlcywgdmFsdWUpIDwgMCkge1xuICAgICAgICB1bmlxdWVzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB1bmlxdWVzO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1bnNhdmVkQ2hpbGRyZW47XG52YXIgX2NvbmNhdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbi8qKlxuICogUmV0dXJuIGFuIGFycmF5IG9mIHVuc2F2ZWQgY2hpbGRyZW4sIHdoaWNoIGFyZSBlaXRoZXIgUGFyc2UgT2JqZWN0cyBvciBGaWxlcy5cbiAqIElmIGl0IGVuY291bnRlcnMgYW55IGRpcnR5IE9iamVjdHMgd2l0aG91dCBJZHMsIGl0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFyc2UuT2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dEZWVwVW5zYXZlZFxuICogQHJldHVybnMge0FycmF5fVxuICovXG5mdW5jdGlvbiB1bnNhdmVkQ2hpbGRyZW4ob2JqLCBhbGxvd0RlZXBVbnNhdmVkKSB7XG4gIGNvbnN0IGVuY291bnRlcmVkID0ge1xuICAgIG9iamVjdHM6IHt9LFxuICAgIGZpbGVzOiBbXVxuICB9O1xuICBjb25zdCBpZGVudGlmaWVyID0gb2JqLmNsYXNzTmFtZSArICc6JyArIG9iai5fZ2V0SWQoKTtcbiAgZW5jb3VudGVyZWQub2JqZWN0c1tpZGVudGlmaWVyXSA9IG9iai5kaXJ0eSgpID8gb2JqIDogdHJ1ZTtcbiAgY29uc3QgYXR0cmlidXRlcyA9IG9iai5hdHRyaWJ1dGVzO1xuICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlc1thdHRyXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRyYXZlcnNlKGF0dHJpYnV0ZXNbYXR0cl0sIGVuY291bnRlcmVkLCBmYWxzZSwgISFhbGxvd0RlZXBVbnNhdmVkKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdW5zYXZlZCA9IFtdO1xuICBmb3IgKGNvbnN0IGlkIGluIGVuY291bnRlcmVkLm9iamVjdHMpIHtcbiAgICBpZiAoaWQgIT09IGlkZW50aWZpZXIgJiYgZW5jb3VudGVyZWQub2JqZWN0c1tpZF0gIT09IHRydWUpIHtcbiAgICAgIHVuc2F2ZWQucHVzaChlbmNvdW50ZXJlZC5vYmplY3RzW2lkXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiAoMCwgX2NvbmNhdC5kZWZhdWx0KSh1bnNhdmVkKS5jYWxsKHVuc2F2ZWQsIGVuY291bnRlcmVkLmZpbGVzKTtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlKG9iaiwgZW5jb3VudGVyZWQsIHNob3VsZFRocm93LCBhbGxvd0RlZXBVbnNhdmVkKSB7XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgaWYgKCFvYmouaWQgJiYgc2hvdWxkVGhyb3cpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBhIHBvaW50ZXIgdG8gYW4gdW5zYXZlZCBPYmplY3QuJyk7XG4gICAgfVxuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBvYmouY2xhc3NOYW1lICsgJzonICsgb2JqLl9nZXRJZCgpO1xuICAgIGlmICghZW5jb3VudGVyZWQub2JqZWN0c1tpZGVudGlmaWVyXSkge1xuICAgICAgZW5jb3VudGVyZWQub2JqZWN0c1tpZGVudGlmaWVyXSA9IG9iai5kaXJ0eSgpID8gb2JqIDogdHJ1ZTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBvYmouYXR0cmlidXRlcztcbiAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlc1thdHRyXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0cmF2ZXJzZShhdHRyaWJ1dGVzW2F0dHJdLCBlbmNvdW50ZXJlZCwgIWFsbG93RGVlcFVuc2F2ZWQsIGFsbG93RGVlcFVuc2F2ZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBpZiAob2JqIGluc3RhbmNlb2YgX1BhcnNlRmlsZS5kZWZhdWx0KSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgIGlmICghb2JqLnVybCgpICYmICgwLCBfaW5kZXhPZi5kZWZhdWx0KShfY29udGV4dCA9IGVuY291bnRlcmVkLmZpbGVzKS5jYWxsKF9jb250ZXh0LCBvYmopIDwgMCkge1xuICAgICAgZW5jb3VudGVyZWQuZmlsZXMucHVzaChvYmopO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG9iaiBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShvYmopKSB7XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKG9iaikuY2FsbChvYmosIGVsID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRyYXZlcnNlKGVsLCBlbmNvdW50ZXJlZCwgc2hvdWxkVGhyb3csIGFsbG93RGVlcFVuc2F2ZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZvciAoY29uc3QgayBpbiBvYmopIHtcbiAgICBpZiAodHlwZW9mIG9ialtrXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRyYXZlcnNlKG9ialtrXSwgZW5jb3VudGVyZWQsIHNob3VsZFRocm93LCBhbGxvd0RlZXBVbnNhdmVkKTtcbiAgICB9XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3V1aWQgPSByZXF1aXJlKFwidXVpZFwiKTtcbmxldCB1dWlkID0gX3V1aWQudjQ7XG5tb2R1bGUuZXhwb3J0cyA9IHV1aWQ7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB1dWlkOyIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IsIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgRW5jcnlwdGVkUERGRXJyb3IsIEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IsIEZvcmVpZ25QYWdlRXJyb3IsIFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yLCB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IFBERkVtYmVkZGVkUGFnZSBmcm9tIFwiLi9QREZFbWJlZGRlZFBhZ2VcIjtcbmltcG9ydCBQREZGb250IGZyb20gXCIuL1BERkZvbnRcIjtcbmltcG9ydCBQREZJbWFnZSBmcm9tIFwiLi9QREZJbWFnZVwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4vUERGUGFnZVwiO1xuaW1wb3J0IFBERkZvcm0gZnJvbSBcIi4vZm9ybS9QREZGb3JtXCI7XG5pbXBvcnQgeyBQYWdlU2l6ZXMgfSBmcm9tIFwiLi9zaXplc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRm9udEVtYmVkZGVyLCBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIsIEpwZWdFbWJlZGRlciwgUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3IsIFBERkNhdGFsb2csIFBERkNvbnRleHQsIFBERkRpY3QsIFBERkhleFN0cmluZywgUERGTmFtZSwgUERGT2JqZWN0Q29waWVyLCBQREZQYWdlRW1iZWRkZXIsIFBERlBhZ2VMZWFmLCBQREZQYWdlVHJlZSwgUERGUGFyc2VyLCBQREZTdHJlYW1Xcml0ZXIsIFBERlN0cmluZywgUERGV3JpdGVyLCBQbmdFbWJlZGRlciwgU3RhbmRhcmRGb250RW1iZWRkZXIsIFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IsIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IFBhcnNlU3BlZWRzLCB9IGZyb20gXCIuL1BERkRvY3VtZW50T3B0aW9uc1wiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZCwgYXNzZXJ0T3JVbmRlZmluZWQsIGFzc2VydFJhbmdlLCBDYWNoZSwgY2FuQmVDb252ZXJ0ZWRUb1VpbnQ4QXJyYXksIGVuY29kZVRvQmFzZTY0LCBpc1N0YW5kYXJkRm9udCwgcGx1Y2tJbmRpY2VzLCByYW5nZSwgdG9VaW50OEFycmF5LCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IEZpbGVFbWJlZGRlciwgeyBBRlJlbGF0aW9uc2hpcCB9IGZyb20gXCIuLi9jb3JlL2VtYmVkZGVycy9GaWxlRW1iZWRkZXJcIjtcbmltcG9ydCBQREZFbWJlZGRlZEZpbGUgZnJvbSBcIi4vUERGRW1iZWRkZWRGaWxlXCI7XG5pbXBvcnQgUERGSmF2YVNjcmlwdCBmcm9tIFwiLi9QREZKYXZhU2NyaXB0XCI7XG5pbXBvcnQgSmF2YVNjcmlwdEVtYmVkZGVyIGZyb20gXCIuLi9jb3JlL2VtYmVkZGVycy9KYXZhU2NyaXB0RW1iZWRkZXJcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIFBERiBkb2N1bWVudC5cbiAqL1xudmFyIFBERkRvY3VtZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkRvY3VtZW50KGNvbnRleHQsIGlnbm9yZUVuY3J5cHRpb24sIHVwZGF0ZU1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8qKiBUaGUgZGVmYXVsdCB3b3JkIGJyZWFrcyB1c2VkIGluIFBERlBhZ2UuZHJhd1RleHQgKi9cbiAgICAgICAgdGhpcy5kZWZhdWx0V29yZEJyZWFrcyA9IFsnICddO1xuICAgICAgICB0aGlzLmNvbXB1dGVQYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYWdlcyA9IFtdO1xuICAgICAgICAgICAgX3RoaXMuY2F0YWxvZy5QYWdlcygpLnRyYXZlcnNlKGZ1bmN0aW9uIChub2RlLCByZWYpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFBERlBhZ2VMZWFmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYWdlID0gX3RoaXMucGFnZU1hcC5nZXQobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSA9IFBERlBhZ2Uub2Yobm9kZSwgcmVmLCBfdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5wYWdlTWFwLnNldChub2RlLCBwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYWdlcy5wdXNoKHBhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhZ2VzO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdldE9yQ3JlYXRlRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhY3JvRm9ybSA9IF90aGlzLmNhdGFsb2cuZ2V0T3JDcmVhdGVBY3JvRm9ybSgpO1xuICAgICAgICAgICAgcmV0dXJuIFBERkZvcm0ub2YoYWNyb0Zvcm0sIF90aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0SXMoY29udGV4dCwgJ2NvbnRleHQnLCBbW1BERkNvbnRleHQsICdQREZDb250ZXh0J11dKTtcbiAgICAgICAgYXNzZXJ0SXMoaWdub3JlRW5jcnlwdGlvbiwgJ2lnbm9yZUVuY3J5cHRpb24nLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY2F0YWxvZyA9IGNvbnRleHQubG9va3VwKGNvbnRleHQudHJhaWxlckluZm8uUm9vdCk7XG4gICAgICAgIHRoaXMuaXNFbmNyeXB0ZWQgPSAhIWNvbnRleHQubG9va3VwKGNvbnRleHQudHJhaWxlckluZm8uRW5jcnlwdCk7XG4gICAgICAgIHRoaXMucGFnZUNhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkodGhpcy5jb21wdXRlUGFnZXMpO1xuICAgICAgICB0aGlzLnBhZ2VNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZm9ybUNhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkodGhpcy5nZXRPckNyZWF0ZUZvcm0pO1xuICAgICAgICB0aGlzLmZvbnRzID0gW107XG4gICAgICAgIHRoaXMuaW1hZ2VzID0gW107XG4gICAgICAgIHRoaXMuZW1iZWRkZWRQYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLmVtYmVkZGVkRmlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5qYXZhU2NyaXB0cyA9IFtdO1xuICAgICAgICBpZiAoIWlnbm9yZUVuY3J5cHRpb24gJiYgdGhpcy5pc0VuY3J5cHRlZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFbmNyeXB0ZWRQREZFcnJvcigpO1xuICAgICAgICBpZiAodXBkYXRlTWV0YWRhdGEpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUluZm9EaWN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWQgYW4gZXhpc3RpbmcgW1tQREZEb2N1bWVudF1dLiBUaGUgaW5wdXQgZGF0YSBjYW4gYmUgcHJvdmlkZWQgaW5cbiAgICAgKiBtdWx0aXBsZSBmb3JtYXRzOlxuICAgICAqXG4gICAgICogfCBUeXBlICAgICAgICAgIHwgQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgICAqIHwgYHN0cmluZ2AgICAgICB8IEEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIChvciBkYXRhIFVSSSkgY29udGFpbmluZyBhIFBERiB8XG4gICAgICogfCBgVWludDhBcnJheWAgIHwgVGhlIHJhdyBieXRlcyBvZiBhIFBERiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBBcnJheUJ1ZmZlcmAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgUERGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiAvLyBwZGY9c3RyaW5nXG4gICAgICogY29uc3QgYmFzZTY0ID1cbiAgICAgKiAgJ0pWQkVSaTB4TGpjS0pZR0JnWUVLQ2pVZ01DQnZZbW9LUER3S0wwWnBiSFJsY2lBdlJteGhkR1ZFWldOdlpHVUtMMHhsYm0nICtcbiAgICAgKiAgJ2QwYUNBeE1EUUtQajRLYzNSeVpXRnRDbmljY3dyaE1sQUF3YUowTG4yUDFKeXkxSkxNNUVSZGMwTWpDd1VqRTRXUU5DNFEnICtcbiAgICAgKiAgJzZjTmxDRlprcUdDcVlHU3FFSkxMWldOdVlHWmlabWJrWXVac1ptbG1aR1JnWm1sdURDUU56YzNOVE0yTnpkek1YTXhNalEnICtcbiAgICAgKiAgJ3p0RkVLeXVFSzB1RnhEdUFBT0VSZFZDbVZ1WkhOMGNtVmhiUXBsYm1Sdlltb0tDallnTUNCdlltb0tQRHdLTDBacGJIUmwnICtcbiAgICAgKiAgJ2NpQXZSbXhoZEdWRVpXTnZaR1VLTDFSNWNHVWdMMDlpYWxOMGJRb3ZUaUEwQ2k5R2FYSnpkQ0F5TUFvdlRHVnVaM1JvSUQnICtcbiAgICAgKiAgJ0l4TlFvK1BncHpkSEpsWVcwS2VKeFZqOUdxd2pBTWh1L3pGSGtCelRvM25DQ0NpaUtJSFBFSUN1SkYzY0tvU0N1MkU4L2InICtcbiAgICAgKiAgJzIwd1BJcjFwOHY5LzhrVmhnaWxtR2Zhd1gyQ0dhVnJnY0FpMC9ic3kwbHJYN0lHV3B2SjRpSllFTjNnRW1yckdCbFF3R3MnICtcbiAgICAgKiAgJ0hITzlWQlgxd05yeEFxTVg4N1JCRDV4cEp1ZGRxd2Q4MnRqQUh4elYxVTVMUGd5NTJES1hXbnIxTGhlZytqL2MvcHpHVnInICtcbiAgICAgKiAgJ2lxVjBWbHdaUFhHUENKakVsdy95Ymt3VW1lb1dneGVzRFhHaEhKQy9EL2lpa3AxQXY4MHB0S1UwRmRCRWUyNXBQaWhBTTEnICtcbiAgICAgKiAgJ3U2eXRnYWFXZnMySHJ6MzVDSlQxK0VXbUFLWlc1a2MzUnlaV0Z0Q21WdVpHOWlhZ29LTnlBd0lHOWlhZ284UEFvdlUybDYnICtcbiAgICAgKiAgJ1pTQTRDaTlTYjI5MElESWdNQ0JTQ2k5R2FXeDBaWElnTDBac1lYUmxSR1ZqYjJSbENpOVVlWEJsSUM5WVVtVm1DaTlNWlcnICtcbiAgICAgKiAgJzVuZEdnZ016Z0tMMWNnV3lBeElESWdNaUJkQ2k5SmJtUmxlQ0JiSURBZ09DQmRDajQrQ25OMGNtVmhiUXA0bkJYRXdSRUEnICtcbiAgICAgKiAgJ0VCQUVzQ3d6M3ZydlJtT095eU9vR2haZHV0SE4yTVQ1NWZJQVZvY0QrQXBsYm1SemRISmxZVzBLWlc1a2IySnFDZ3B6ZEcnICtcbiAgICAgKiAgJ0Z5ZEhoeVpXWUtOVEV3Q2lVbFJVOUcnXG4gICAgICpcbiAgICAgKiBjb25zdCBkYXRhVXJpID0gJ2RhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCwnICsgYmFzZTY0XG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MxID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZChiYXNlNjQpXG4gICAgICogY29uc3QgcGRmRG9jMiA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoZGF0YVVyaSlcbiAgICAgKlxuICAgICAqIC8vIHBkZj1VaW50OEFycmF5XG4gICAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgICAqIGNvbnN0IHVpbnQ4QXJyYXkgPSBmcy5yZWFkRmlsZVN5bmMoJ3dpdGhfdXBkYXRlX3NlY3Rpb25zLnBkZicpXG4gICAgICogY29uc3QgcGRmRG9jMyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQodWludDhBcnJheSlcbiAgICAgKlxuICAgICAqIC8vIHBkZj1BcnJheUJ1ZmZlclxuICAgICAqIGNvbnN0IHVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy93aXRoX3VwZGF0ZV9zZWN0aW9ucy5wZGYnXG4gICAgICogY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4ocmVzID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGNvbnN0IHBkZkRvYzQgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKGFycmF5QnVmZmVyKVxuICAgICAqXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGRmIFRoZSBpbnB1dCBkYXRhIGNvbnRhaW5pbmcgYSBQREYgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGxvYWRpbmcgdGhlIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggYSBkb2N1bWVudCBsb2FkZWQgZnJvbSB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQubG9hZCA9IGZ1bmN0aW9uIChwZGYsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBpZ25vcmVFbmNyeXB0aW9uLCBfYiwgcGFyc2VTcGVlZCwgX2MsIHRocm93T25JbnZhbGlkT2JqZWN0LCBfZCwgdXBkYXRlTWV0YWRhdGEsIF9lLCBjYXBOdW1iZXJzLCBieXRlcywgY29udGV4dDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2YpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9mLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gb3B0aW9ucy5pZ25vcmVFbmNyeXB0aW9uLCBpZ25vcmVFbmNyeXB0aW9uID0gX2EgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EsIF9iID0gb3B0aW9ucy5wYXJzZVNwZWVkLCBwYXJzZVNwZWVkID0gX2IgPT09IHZvaWQgMCA/IFBhcnNlU3BlZWRzLlNsb3cgOiBfYiwgX2MgPSBvcHRpb25zLnRocm93T25JbnZhbGlkT2JqZWN0LCB0aHJvd09uSW52YWxpZE9iamVjdCA9IF9jID09PSB2b2lkIDAgPyBmYWxzZSA6IF9jLCBfZCA9IG9wdGlvbnMudXBkYXRlTWV0YWRhdGEsIHVwZGF0ZU1ldGFkYXRhID0gX2QgPT09IHZvaWQgMCA/IHRydWUgOiBfZCwgX2UgPSBvcHRpb25zLmNhcE51bWJlcnMsIGNhcE51bWJlcnMgPSBfZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHBkZiwgJ3BkZicsIFsnc3RyaW5nJywgVWludDhBcnJheSwgQXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGlnbm9yZUVuY3J5cHRpb24sICdpZ25vcmVFbmNyeXB0aW9uJywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMocGFyc2VTcGVlZCwgJ3BhcnNlU3BlZWQnLCBbJ251bWJlciddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHRocm93T25JbnZhbGlkT2JqZWN0LCAndGhyb3dPbkludmFsaWRPYmplY3QnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IHRvVWludDhBcnJheShwZGYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUERGUGFyc2VyLmZvckJ5dGVzV2l0aE9wdGlvbnMoYnl0ZXMsIHBhcnNlU3BlZWQsIHRocm93T25JbnZhbGlkT2JqZWN0LCBjYXBOdW1iZXJzKS5wYXJzZURvY3VtZW50KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gX2Yuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQREZEb2N1bWVudChjb250ZXh0LCBpZ25vcmVFbmNyeXB0aW9uLCB1cGRhdGVNZXRhZGF0YSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBbW1BERkRvY3VtZW50XV0uXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5jcmVhdGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHVwZGF0ZU1ldGFkYXRhLCBjb250ZXh0LCBwYWdlVHJlZSwgcGFnZVRyZWVSZWYsIGNhdGFsb2c7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgX2EgPSBvcHRpb25zLnVwZGF0ZU1ldGFkYXRhLCB1cGRhdGVNZXRhZGF0YSA9IF9hID09PSB2b2lkIDAgPyB0cnVlIDogX2E7XG4gICAgICAgICAgICAgICAgY29udGV4dCA9IFBERkNvbnRleHQuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgcGFnZVRyZWUgPSBQREZQYWdlVHJlZS53aXRoQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBwYWdlVHJlZVJlZiA9IGNvbnRleHQucmVnaXN0ZXIocGFnZVRyZWUpO1xuICAgICAgICAgICAgICAgIGNhdGFsb2cgPSBQREZDYXRhbG9nLndpdGhDb250ZXh0QW5kUGFnZXMoY29udGV4dCwgcGFnZVRyZWVSZWYpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQudHJhaWxlckluZm8uUm9vdCA9IGNvbnRleHQucmVnaXN0ZXIoY2F0YWxvZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQREZEb2N1bWVudChjb250ZXh0LCBmYWxzZSwgdXBkYXRlTWV0YWRhdGEpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgZm9udGtpdCBpbnN0YW5jZS4gVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIGN1c3RvbSBmb250cyBjYW5cbiAgICAgKiBiZSBlbWJlZGRlZC4gU2VlIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vSG9wZGluZy9wZGYtbGliL3RyZWUvbWFzdGVyI2ZvbnRraXQtaW5zdGFsbGF0aW9uKVxuICAgICAqIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGluc3RhbGwgYW5kIHJlZ2lzdGVyIGEgZm9udGtpdCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqID4gWW91IGRvICoqbm90KiogbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIHRvIGVtYmVkIHN0YW5kYXJkIGZvbnRzLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCB9IGZyb20gJ3BkZi1saWInXG4gICAgICogaW1wb3J0IGZvbnRraXQgZnJvbSAnQHBkZi1saWIvZm9udGtpdCdcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogcGRmRG9jLnJlZ2lzdGVyRm9udGtpdChmb250a2l0KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGZvbnRraXQgVGhlIGZvbnRraXQgaW5zdGFuY2UgdG8gYmUgcmVnaXN0ZXJlZC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUucmVnaXN0ZXJGb250a2l0ID0gZnVuY3Rpb24gKGZvbnRraXQpIHtcbiAgICAgICAgdGhpcy5mb250a2l0ID0gZm9udGtpdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgW1tQREZGb3JtXV0gY29udGFpbmluZyBhbGwgaW50ZXJhY3RpdmUgZmllbGRzIGZvciB0aGlzIGRvY3VtZW50LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZHMgPSBmb3JtLmdldEZpZWxkcygpXG4gICAgICogZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAqICAgY29uc3QgdHlwZSA9IGZpZWxkLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgKiAgIGNvbnN0IG5hbWUgPSBmaWVsZC5nZXROYW1lKClcbiAgICAgKiAgIGNvbnNvbGUubG9nKGAke3R5cGV9OiAke25hbWV9YClcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBmb3JtIGZvciB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRGb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZm9ybSA9IHRoaXMuZm9ybUNhY2hlLmFjY2VzcygpO1xuICAgICAgICBpZiAoZm9ybS5oYXNYRkEoKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZW1vdmluZyBYRkEgZm9ybSBkYXRhIGFzIHBkZi1saWIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIG9yIHdyaXRpbmcgWEZBJyk7XG4gICAgICAgICAgICBmb3JtLmRlbGV0ZVhGQSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyB0aXRsZSBtZXRhZGF0YS4gVGhlIHRpdGxlIGFwcGVhcnMgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRpdGxlID0gcGRmRG9jLmdldFRpdGxlKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSB0aXRsZSBvZiB0aGlzIGRvY3VtZW50LCBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLlRpdGxlKTtcbiAgICAgICAgaWYgKCF0aXRsZSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKHRpdGxlKTtcbiAgICAgICAgcmV0dXJuIHRpdGxlLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3MgYXV0aG9yIG1ldGFkYXRhLiBUaGUgYXV0aG9yIGFwcGVhcnMgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGF1dGhvciA9IHBkZkRvYy5nZXRBdXRob3IoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGF1dGhvciBvZiB0aGlzIGRvY3VtZW50LCBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRBdXRob3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhdXRob3IgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuQXV0aG9yKTtcbiAgICAgICAgaWYgKCFhdXRob3IpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhhdXRob3IpO1xuICAgICAgICByZXR1cm4gYXV0aG9yLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3Mgc3ViamVjdCBtZXRhZGF0YS4gVGhlIHN1YmplY3QgYXBwZWFycyBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgc3ViamVjdCA9IHBkZkRvYy5nZXRTdWJqZWN0KClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBjb250YWluaW5nIHRoZSBzdWJqZWN0IG9mIHRoaXMgZG9jdW1lbnQsIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldFN1YmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdWJqZWN0ID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLlN1YmplY3QpO1xuICAgICAgICBpZiAoIXN1YmplY3QpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhzdWJqZWN0KTtcbiAgICAgICAgcmV0dXJuIHN1YmplY3QuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBrZXl3b3JkcyBtZXRhZGF0YS4gVGhlIGtleXdvcmRzIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qga2V5d29yZHMgPSBwZGZEb2MuZ2V0S2V5d29yZHMoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGtleXdvcmRzIG9mIHRoaXMgZG9jdW1lbnQsIGlmIGl0IGhhcyBhbnkuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldEtleXdvcmRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIga2V5d29yZHMgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuS2V5d29yZHMpO1xuICAgICAgICBpZiAoIWtleXdvcmRzKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcoa2V5d29yZHMpO1xuICAgICAgICByZXR1cm4ga2V5d29yZHMuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBjcmVhdG9yIG1ldGFkYXRhLiBUaGUgY3JlYXRvciBhcHBlYXJzIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjcmVhdG9yID0gcGRmRG9jLmdldENyZWF0b3IoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNyZWF0b3Igb2YgdGhpcyBkb2N1bWVudCwgaWYgaXQgaGFzIG9uZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0Q3JlYXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNyZWF0b3IgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuQ3JlYXRvcik7XG4gICAgICAgIGlmICghY3JlYXRvcilcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKGNyZWF0b3IpO1xuICAgICAgICByZXR1cm4gY3JlYXRvci5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBkb2N1bWVudCdzIHByb2R1Y2VyIG1ldGFkYXRhLiBUaGUgcHJvZHVjZXIgYXBwZWFycyBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcHJvZHVjZXIgPSBwZGZEb2MuZ2V0UHJvZHVjZXIoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHByb2R1Y2VyIG9mIHRoaXMgZG9jdW1lbnQsIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldFByb2R1Y2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvZHVjZXIgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuUHJvZHVjZXIpO1xuICAgICAgICBpZiAoIXByb2R1Y2VyKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcocHJvZHVjZXIpO1xuICAgICAgICByZXR1cm4gcHJvZHVjZXIuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBjcmVhdGlvbiBkYXRlIG1ldGFkYXRhLiBUaGUgY3JlYXRpb24gZGF0ZSBhcHBlYXJzIGluXG4gICAgICogdGhlIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjcmVhdGlvbkRhdGUgPSBwZGZEb2MuZ2V0Q3JlYXRpb25EYXRlKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBIERhdGUgY29udGFpbmluZyB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGlzIGRvY3VtZW50LFxuICAgICAqICAgICAgICAgIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldENyZWF0aW9uRGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNyZWF0aW9uRGF0ZSA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5DcmVhdGlvbkRhdGUpO1xuICAgICAgICBpZiAoIWNyZWF0aW9uRGF0ZSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKGNyZWF0aW9uRGF0ZSk7XG4gICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGUuZGVjb2RlRGF0ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBtb2RpZmljYXRpb24gZGF0ZSBtZXRhZGF0YS4gVGhlIG1vZGlmaWNhdGlvbiBkYXRlXG4gICAgICogYXBwZWFycyBpbiB0aGUgXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgbW9kaWZpY2F0aW9uID0gcGRmRG9jLmdldE1vZGlmaWNhdGlvbkRhdGUoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgRGF0ZSBjb250YWluaW5nIHRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGRvY3VtZW50LFxuICAgICAqICAgICAgICAgIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldE1vZGlmaWNhdGlvbkRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtb2RpZmljYXRpb25EYXRlID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLk1vZERhdGUpO1xuICAgICAgICBpZiAoIW1vZGlmaWNhdGlvbkRhdGUpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhtb2RpZmljYXRpb25EYXRlKTtcbiAgICAgICAgcmV0dXJuIG1vZGlmaWNhdGlvbkRhdGUuZGVjb2RlRGF0ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyB0aXRsZSBtZXRhZGF0YS4gVGhlIHRpdGxlIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0VGl0bGUoJ/CfpZogVGhlIExpZmUgb2YgYW4gRWdnIPCfjbMnKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVG8gZGlzcGxheSB0aGUgdGl0bGUgaW4gdGhlIHdpbmRvdydzIHRpdGxlIGJhciwgc2V0IHRoZVxuICAgICAqIGBzaG93SW5XaW5kb3dUaXRsZUJhcmAgb3B0aW9uIHRvIGB0cnVlYCAod29ya3MgZm9yIF9tb3N0XyBQREYgcmVhZGVycykuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0VGl0bGUoJ/CfpZogVGhlIExpZmUgb2YgYW4gRWdnIPCfjbMnLCB7IHNob3dJbldpbmRvd1RpdGxlQmFyOiB0cnVlIH0pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIHRpdGxlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRUaXRsZSA9IGZ1bmN0aW9uICh0aXRsZSwgb3B0aW9ucykge1xuICAgICAgICBhc3NlcnRJcyh0aXRsZSwgJ3RpdGxlJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdUaXRsZScpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KHRpdGxlKSk7XG4gICAgICAgIC8vIEluZGljYXRlIHRoYXQgcmVhZGVycyBzaG91bGQgZGlzcGxheSB0aGUgdGl0bGUgcmF0aGVyIHRoYW4gdGhlIGZpbGVuYW1lXG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc2hvd0luV2luZG93VGl0bGVCYXIpIHtcbiAgICAgICAgICAgIHZhciBwcmVmcyA9IHRoaXMuY2F0YWxvZy5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzKCk7XG4gICAgICAgICAgICBwcmVmcy5zZXREaXNwbGF5RG9jVGl0bGUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgYXV0aG9yIG1ldGFkYXRhLiBUaGUgYXV0aG9yIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0QXV0aG9yKCdIdW1wdHkgRHVtcHR5JylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gYXV0aG9yIFRoZSBhdXRob3Igb2YgdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0QXV0aG9yID0gZnVuY3Rpb24gKGF1dGhvcikge1xuICAgICAgICBhc3NlcnRJcyhhdXRob3IsICdhdXRob3InLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ0F1dGhvcicpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KGF1dGhvcikpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBzdWJqZWN0IG1ldGFkYXRhLiBUaGUgc3ViamVjdCB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldFN1YmplY3QoJ/Cfk5ggQW4gRXBpYyBUYWxlIG9mIFdvZSDwn5OWJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gc3ViamVjdCBUaGUgc3ViamVjdCBvZiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRTdWJqZWN0ID0gZnVuY3Rpb24gKHN1YmplY3QpIHtcbiAgICAgICAgYXNzZXJ0SXMoc3ViamVjdCwgJ2F1dGhvcicsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignU3ViamVjdCcpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KHN1YmplY3QpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3Mga2V5d29yZCBtZXRhZGF0YS4gVGhlc2Uga2V5d29yZHMgd2lsbCBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRLZXl3b3JkcyhbJ2VnZ3MnLCAnd2FsbCcsICdmYWxsJywgJ2tpbmcnLCAnaG9yc2VzJywgJ21lbiddKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBrZXl3b3JkcyBBbiBhcnJheSBvZiBrZXl3b3JkcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0S2V5d29yZHMgPSBmdW5jdGlvbiAoa2V5d29yZHMpIHtcbiAgICAgICAgYXNzZXJ0SXMoa2V5d29yZHMsICdrZXl3b3JkcycsIFtBcnJheV0pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignS2V5d29yZHMnKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERkhleFN0cmluZy5mcm9tVGV4dChrZXl3b3Jkcy5qb2luKCcgJykpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgY3JlYXRvciBtZXRhZGF0YS4gVGhlIGNyZWF0b3Igd2lsbCBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRDcmVhdG9yKCdQREYgQXBwIDkwMDAg8J+klicpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNyZWF0b3IgVGhlIGNyZWF0b3Igb2YgdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0Q3JlYXRvciA9IGZ1bmN0aW9uIChjcmVhdG9yKSB7XG4gICAgICAgIGFzc2VydElzKGNyZWF0b3IsICdjcmVhdG9yJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdDcmVhdG9yJyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZIZXhTdHJpbmcuZnJvbVRleHQoY3JlYXRvcikpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBwcm9kdWNlciBtZXRhZGF0YS4gVGhlIHByb2R1Y2VyIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0UHJvZHVjZXIoJ1BERiBBcHAgOTAwMCDwn6SWJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcHJvZHVjZXIgVGhlIHByb2R1Y2VyIG9mIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldFByb2R1Y2VyID0gZnVuY3Rpb24gKHByb2R1Y2VyKSB7XG4gICAgICAgIGFzc2VydElzKHByb2R1Y2VyLCAnY3JlYXRvcicsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignUHJvZHVjZXInKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERkhleFN0cmluZy5mcm9tVGV4dChwcm9kdWNlcikpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBsYW5ndWFnZSBtZXRhZGF0YS4gVGhlIGxhbmd1YWdlIHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2Ygc29tZSBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0TGFuZ3VhZ2UoJ2VuLXVzJylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSBBbiBSRkMgMzA2NiBfTGFuZ3VhZ2UtVGFnXyBkZW5vdGluZyB0aGUgbGFuZ3VhZ2Ugb2YgdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICBkb2N1bWVudCwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBsYW5ndWFnZSBpcyB1bmtub3duLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRMYW5ndWFnZSA9IGZ1bmN0aW9uIChsYW5ndWFnZSkge1xuICAgICAgICBhc3NlcnRJcyhsYW5ndWFnZSwgJ2xhbmd1YWdlJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdMYW5nJyk7XG4gICAgICAgIHRoaXMuY2F0YWxvZy5zZXQoa2V5LCBQREZTdHJpbmcub2YobGFuZ3VhZ2UpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgY3JlYXRpb24gZGF0ZSBtZXRhZGF0YS4gVGhlIGNyZWF0aW9uIGRhdGUgd2lsbCBhcHBlYXJcbiAgICAgKiBpbiB0aGUgXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRDcmVhdGlvbkRhdGUobmV3IERhdGUoKSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY3JlYXRpb25EYXRlIFRoZSBkYXRlIHRoaXMgZG9jdW1lbnQgd2FzIGNyZWF0ZWQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldENyZWF0aW9uRGF0ZSA9IGZ1bmN0aW9uIChjcmVhdGlvbkRhdGUpIHtcbiAgICAgICAgYXNzZXJ0SXMoY3JlYXRpb25EYXRlLCAnY3JlYXRpb25EYXRlJywgW1tEYXRlLCAnRGF0ZSddXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdDcmVhdGlvbkRhdGUnKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERlN0cmluZy5mcm9tRGF0ZShjcmVhdGlvbkRhdGUpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGRvY3VtZW50J3MgbW9kaWZpY2F0aW9uIGRhdGUgbWV0YWRhdGEuIFRoZSBtb2RpZmljYXRpb24gZGF0ZSB3aWxsXG4gICAgICogYXBwZWFyIGluIHRoZSBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvclxuICAgICAqIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0TW9kaWZpY2F0aW9uRGF0ZShuZXcgRGF0ZSgpKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBtb2RpZmljYXRpb25EYXRlIFRoZSBkYXRlIHRoaXMgZG9jdW1lbnQgd2FzIGxhc3QgbW9kaWZpZWQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldE1vZGlmaWNhdGlvbkRhdGUgPSBmdW5jdGlvbiAobW9kaWZpY2F0aW9uRGF0ZSkge1xuICAgICAgICBhc3NlcnRJcyhtb2RpZmljYXRpb25EYXRlLCAnbW9kaWZpY2F0aW9uRGF0ZScsIFtbRGF0ZSwgJ0RhdGUnXV0pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignTW9kRGF0ZScpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGU3RyaW5nLmZyb21EYXRlKG1vZGlmaWNhdGlvbkRhdGUpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHBhZ2VzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRvdGFsUGFnZXMgPSBwZGZEb2MuZ2V0UGFnZUNvdW50KClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIHBhZ2VzIGluIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldFBhZ2VDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFnZUNvdW50ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLnBhZ2VDb3VudCA9IHRoaXMuZ2V0UGFnZXMoKS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2VDb3VudDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhbiBhcnJheSBvZiBhbGwgdGhlIHBhZ2VzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50LiBUaGUgcGFnZXMgYXJlXG4gICAgICogc3RvcmVkIGluIHRoZSBhcnJheSBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJlbmRlcmVkIGluIHRoZVxuICAgICAqIGRvY3VtZW50LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBhZ2VzID0gcGRmRG9jLmdldFBhZ2VzKClcbiAgICAgKiBwYWdlc1swXSAgIC8vIFRoZSBmaXJzdCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBhZ2VzWzJdICAgLy8gVGhlIHRoaXJkIHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogcGFnZXNbMTk3XSAvLyBUaGUgMTk4dGggcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgdGhlIHBhZ2VzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRQYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZUNhY2hlLmFjY2VzcygpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwYWdlIHJlbmRlcmVkIGF0IGEgcGFydGljdWxhciBgaW5kZXhgIG9mIHRoZSBkb2N1bWVudC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2MuZ2V0UGFnZSgwKSAgIC8vIFRoZSBmaXJzdCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBkZkRvYy5nZXRQYWdlKDIpICAgLy8gVGhlIHRoaXJkIHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogcGRmRG9jLmdldFBhZ2UoMTk3KSAvLyBUaGUgMTk4dGggcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgW1tQREZQYWdlXV0gcmVuZGVyZWQgYXQgdGhlIGdpdmVuIGBpbmRleGAgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRQYWdlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBwYWdlcyA9IHRoaXMuZ2V0UGFnZXMoKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2UoaW5kZXgsICdpbmRleCcsIDAsIHBhZ2VzLmxlbmd0aCAtIDEpO1xuICAgICAgICByZXR1cm4gcGFnZXNbaW5kZXhdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IGFuIGFycmF5IG9mIGluZGljZXMgZm9yIGFsbCB0aGUgcGFnZXMgY29udGFpbmVkIGluIHRoaXMgZG9jdW1lbnQuIFRoZVxuICAgICAqIGFycmF5IHdpbGwgY29udGFpbiBhIHJhbmdlIG9mIGludGVnZXJzIGZyb21cbiAgICAgKiBgMC4ucGRmRG9jLmdldFBhZ2VDb3VudCgpIC0gMWAuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICogcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqIHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGluZGljZXMgPSBwZGZEb2MuZ2V0UGFnZUluZGljZXMoKVxuICAgICAqIGluZGljZXMgLy8gPT4gWzAsIDEsIDJdXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgaW5kaWNlcyBmb3IgYWxsIHBhZ2VzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRQYWdlSW5kaWNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlKDAsIHRoaXMuZ2V0UGFnZUNvdW50KCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBwYWdlIGF0IGEgZ2l2ZW4gaW5kZXggZnJvbSB0aGlzIGRvY3VtZW50LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5yZW1vdmVQYWdlKDApICAgLy8gUmVtb3ZlIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBkZkRvYy5yZW1vdmVQYWdlKDIpICAgLy8gUmVtb3ZlIHRoZSB0aGlyZCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIHBkZkRvYy5yZW1vdmVQYWdlKDE5NykgLy8gUmVtb3ZlIHRoZSAxOTh0aCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIGBgYFxuICAgICAqIE9uY2UgYSBwYWdlIGhhcyBiZWVuIHJlbW92ZWQsIGl0IHdpbGwgbm8gbG9uZ2VyIGJlIHJlbmRlcmVkIGF0IHRoYXQgaW5kZXhcbiAgICAgKiBpbiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcGFnZSB0byBiZSByZW1vdmVkLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5yZW1vdmVQYWdlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBwYWdlQ291bnQgPSB0aGlzLmdldFBhZ2VDb3VudCgpO1xuICAgICAgICBpZiAodGhpcy5wYWdlQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3IoKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2UoaW5kZXgsICdpbmRleCcsIDAsIHBhZ2VDb3VudCAtIDEpO1xuICAgICAgICB0aGlzLmNhdGFsb2cucmVtb3ZlTGVhZk5vZGUoaW5kZXgpO1xuICAgICAgICB0aGlzLnBhZ2VDb3VudCA9IHBhZ2VDb3VudCAtIDE7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgYSBwYWdlIHRvIHRoZSBlbmQgb2YgdGhpcyBkb2N1bWVudC4gVGhpcyBtZXRob2QgYWNjZXB0cyB0aHJlZVxuICAgICAqIGRpZmZlcmVudCB2YWx1ZSB0eXBlcyBmb3IgdGhlIGBwYWdlYCBwYXJhbWV0ZXI6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgICAgICB8IEJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGB1bmRlZmluZWRgICAgICAgICB8IENyZWF0ZSBhIG5ldyBwYWdlIGFuZCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGlzIGRvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBbbnVtYmVyLCBudW1iZXJdYCB8IENyZWF0ZSBhIG5ldyBwYWdlIHdpdGggdGhlIGdpdmVuIGRpbWVuc2lvbnMgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQgIHxcbiAgICAgKiB8IGBQREZQYWdlYCAgICAgICAgICB8IEFkZCB0aGUgZXhpc3RpbmcgcGFnZSB0byB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcGFnZT11bmRlZmluZWRcbiAgICAgKiBjb25zdCBuZXdQYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogLy8gcGFnZT1bbnVtYmVyLCBudW1iZXJdXG4gICAgICogaW1wb3J0IHsgUGFnZVNpemVzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKiBjb25zdCBuZXdQYWdlMSA9IHBkZkRvYy5hZGRQYWdlKFBhZ2VTaXplcy5BNylcbiAgICAgKiBjb25zdCBuZXdQYWdlMiA9IHBkZkRvYy5hZGRQYWdlKFBhZ2VTaXplcy5MZXR0ZXIpXG4gICAgICogY29uc3QgbmV3UGFnZTMgPSBwZGZEb2MuYWRkUGFnZShbNTAwLCA3NTBdKVxuICAgICAqXG4gICAgICogLy8gcGFnZT1QREZQYWdlXG4gICAgICogY29uc3QgcGRmRG9jMSA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3QgcGRmRG9jMiA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoLi4uKVxuICAgICAqIGNvbnN0IFtleGlzdGluZ1BhZ2VdID0gYXdhaXQgcGRmRG9jMS5jb3B5UGFnZXMocGRmRG9jMiwgWzBdKVxuICAgICAqIHBkZkRvYzEuYWRkUGFnZShleGlzdGluZ1BhZ2UpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZSBPcHRpb25hbGx5LCB0aGUgZGVzaXJlZCBkaW1lbnNpb25zIG9yIGV4aXN0aW5nIHBhZ2UuXG4gICAgICogQHJldHVybnMgVGhlIG5ld2x5IGNyZWF0ZWQgKG9yIGV4aXN0aW5nKSBwYWdlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5hZGRQYWdlID0gZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbJ3VuZGVmaW5lZCcsIFtQREZQYWdlLCAnUERGUGFnZSddLCBBcnJheV0pO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRQYWdlKHRoaXMuZ2V0UGFnZUNvdW50KCksIHBhZ2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGEgcGFnZSBhdCBhIGdpdmVuIGluZGV4IHdpdGhpbiB0aGlzIGRvY3VtZW50LiBUaGlzIG1ldGhvZCBhY2NlcHRzXG4gICAgICogdGhyZWUgZGlmZmVyZW50IHZhbHVlIHR5cGVzIGZvciB0aGUgYHBhZ2VgIHBhcmFtZXRlcjpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICAgICAgIHwgQmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgdW5kZWZpbmVkYCAgICAgICAgfCBDcmVhdGUgYSBuZXcgcGFnZSBhbmQgaW5zZXJ0IGl0IGludG8gdGhpcyBkb2N1bWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYFtudW1iZXIsIG51bWJlcl1gIHwgQ3JlYXRlIGEgbmV3IHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gZGltZW5zaW9ucyBhbmQgaW5zZXJ0IGl0IGludG8gdGhpcyBkb2N1bWVudCAgIHxcbiAgICAgKiB8IGBQREZQYWdlYCAgICAgICAgICB8IEluc2VydCB0aGUgZXhpc3RpbmcgcGFnZSBpbnRvIHRoaXMgZG9jdW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIHBhZ2U9dW5kZWZpbmVkXG4gICAgICogY29uc3QgbmV3UGFnZSA9IHBkZkRvYy5pbnNlcnRQYWdlKDIpXG4gICAgICpcbiAgICAgKiAvLyBwYWdlPVtudW1iZXIsIG51bWJlcl1cbiAgICAgKiBpbXBvcnQgeyBQYWdlU2l6ZXMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqIGNvbnN0IG5ld1BhZ2UxID0gcGRmRG9jLmluc2VydFBhZ2UoMiwgUGFnZVNpemVzLkE3KVxuICAgICAqIGNvbnN0IG5ld1BhZ2UyID0gcGRmRG9jLmluc2VydFBhZ2UoMCwgUGFnZVNpemVzLkxldHRlcilcbiAgICAgKiBjb25zdCBuZXdQYWdlMyA9IHBkZkRvYy5pbnNlcnRQYWdlKDE5OCwgWzUwMCwgNzUwXSlcbiAgICAgKlxuICAgICAqIC8vIHBhZ2U9UERGUGFnZVxuICAgICAqIGNvbnN0IHBkZkRvYzEgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHBkZkRvYzIgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKC4uLilcbiAgICAgKiBjb25zdCBbZXhpc3RpbmdQYWdlXSA9IGF3YWl0IHBkZkRvYzEuY29weVBhZ2VzKHBkZkRvYzIsIFswXSlcbiAgICAgKiBwZGZEb2MxLmluc2VydFBhZ2UoMCwgZXhpc3RpbmdQYWdlKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgcGFnZSBzaG91bGQgYmUgaW5zZXJ0ZWQgKHplcm8tYmFzZWQpLlxuICAgICAqIEBwYXJhbSBwYWdlIE9wdGlvbmFsbHksIHRoZSBkZXNpcmVkIGRpbWVuc2lvbnMgb3IgZXhpc3RpbmcgcGFnZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCAob3IgZXhpc3RpbmcpIHBhZ2UuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmluc2VydFBhZ2UgPSBmdW5jdGlvbiAoaW5kZXgsIHBhZ2UpIHtcbiAgICAgICAgdmFyIHBhZ2VDb3VudCA9IHRoaXMuZ2V0UGFnZUNvdW50KCk7XG4gICAgICAgIGFzc2VydFJhbmdlKGluZGV4LCAnaW5kZXgnLCAwLCBwYWdlQ291bnQpO1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFsndW5kZWZpbmVkJywgW1BERlBhZ2UsICdQREZQYWdlJ10sIEFycmF5XSk7XG4gICAgICAgIGlmICghcGFnZSB8fCBBcnJheS5pc0FycmF5KHBhZ2UpKSB7XG4gICAgICAgICAgICB2YXIgZGltcyA9IEFycmF5LmlzQXJyYXkocGFnZSkgPyBwYWdlIDogUGFnZVNpemVzLkE0O1xuICAgICAgICAgICAgcGFnZSA9IFBERlBhZ2UuY3JlYXRlKHRoaXMpO1xuICAgICAgICAgICAgcGFnZS5zZXRTaXplLmFwcGx5KHBhZ2UsIGRpbXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhZ2UuZG9jICE9PSB0aGlzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9yZWlnblBhZ2VFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRSZWYgPSB0aGlzLmNhdGFsb2cuaW5zZXJ0TGVhZk5vZGUocGFnZS5yZWYsIGluZGV4KTtcbiAgICAgICAgcGFnZS5ub2RlLnNldFBhcmVudChwYXJlbnRSZWYpO1xuICAgICAgICB0aGlzLnBhZ2VNYXAuc2V0KHBhZ2Uubm9kZSwgcGFnZSk7XG4gICAgICAgIHRoaXMucGFnZUNhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5wYWdlQ291bnQgPSBwYWdlQ291bnQgKyAxO1xuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvcHkgcGFnZXMgZnJvbSBhIHNvdXJjZSBkb2N1bWVudCBpbnRvIHRoaXMgZG9jdW1lbnQuIEFsbG93cyBwYWdlcyB0byBiZVxuICAgICAqIGNvcGllZCBiZXR3ZWVuIGRpZmZlcmVudCBbW1BERkRvY3VtZW50XV0gaW5zdGFuY2VzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3Qgc3JjRG9jID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZCguLi4pXG4gICAgICpcbiAgICAgKiBjb25zdCBjb3BpZWRQYWdlcyA9IGF3YWl0IHBkZkRvYy5jb3B5UGFnZXMoc3JjRG9jLCBbMCwgMywgODldKVxuICAgICAqIGNvbnN0IFtmaXJzdFBhZ2UsIGZvdXJ0aFBhZ2UsIG5pbmV0aWV0aFBhZ2VdID0gY29waWVkUGFnZXM7XG4gICAgICpcbiAgICAgKiBwZGZEb2MuYWRkUGFnZShmb3VydGhQYWdlKVxuICAgICAqIHBkZkRvYy5pbnNlcnRQYWdlKDAsIG5pbmV0aWV0aFBhZ2UpXG4gICAgICogcGRmRG9jLmFkZFBhZ2UoZmlyc3RQYWdlKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBzcmNEb2MgVGhlIGRvY3VtZW50IGZyb20gd2hpY2ggcGFnZXMgc2hvdWxkIGJlIGNvcGllZC5cbiAgICAgKiBAcGFyYW0gaW5kaWNlcyBUaGUgaW5kaWNlcyBvZiB0aGUgcGFnZXMgdGhhdCBzaG91bGQgYmUgY29waWVkLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgcGFnZXMgY29waWVkIGludG8gdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuY29weVBhZ2VzID0gZnVuY3Rpb24gKHNyY0RvYywgaW5kaWNlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY29waWVyLCBzcmNQYWdlcywgY29waWVkUGFnZXMsIGlkeCwgbGVuLCBzcmNQYWdlLCBjb3BpZWRQYWdlLCByZWY7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhzcmNEb2MsICdzcmNEb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoaW5kaWNlcywgJ2luZGljZXMnLCBbQXJyYXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHNyY0RvYy5mbHVzaCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29waWVyID0gUERGT2JqZWN0Q29waWVyLmZvcihzcmNEb2MuY29udGV4dCwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhZ2VzID0gc3JjRG9jLmdldFBhZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRQYWdlcyA9IG5ldyBBcnJheShpbmRpY2VzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDAsIGxlbiA9IGluZGljZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGFnZSA9IHNyY1BhZ2VzW2luZGljZXNbaWR4XV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkUGFnZSA9IGNvcGllci5jb3B5KHNyY1BhZ2Uubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gdGhpcy5jb250ZXh0LnJlZ2lzdGVyKGNvcGllZFBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFBhZ2VzW2lkeF0gPSBQREZQYWdlLm9mKGNvcGllZFBhZ2UsIHJlZiwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29waWVkUGFnZXNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhIGNvcHkgb2YgdGhpcyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgc3JjRG9jID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZCguLi4pXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgc3JjRG9jLmNvcHkoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPiAqKk5PVEU6KiogIFRoaXMgbWV0aG9kIHdvbid0IGNvcHkgYWxsIGluZm9ybWF0aW9uIG92ZXIgdG8gdGhlIG5ld1xuICAgICAqID4gZG9jdW1lbnQgKGFjcm9mb3Jtcywgb3V0bGluZXMsIGV0Yy4uLikuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIGEgY29weSB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcGRmQ29weSwgY29udGVudFBhZ2VzLCBpZHgsIGxlbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUERGRG9jdW1lbnQuY3JlYXRlKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcGRmQ29weS5jb3B5UGFnZXModGhpcywgdGhpcy5nZXRQYWdlSW5kaWNlcygpKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQYWdlcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWR4ID0gMCwgbGVuID0gY29udGVudFBhZ2VzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuYWRkUGFnZShjb250ZW50UGFnZXNbaWR4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRBdXRob3IoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5zZXRBdXRob3IodGhpcy5nZXRBdXRob3IoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRDcmVhdGlvbkRhdGUoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5zZXRDcmVhdGlvbkRhdGUodGhpcy5nZXRDcmVhdGlvbkRhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRDcmVhdG9yKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0Q3JlYXRvcih0aGlzLmdldENyZWF0b3IoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRNb2RpZmljYXRpb25EYXRlKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0TW9kaWZpY2F0aW9uRGF0ZSh0aGlzLmdldE1vZGlmaWNhdGlvbkRhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRQcm9kdWNlcigpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldFByb2R1Y2VyKHRoaXMuZ2V0UHJvZHVjZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTdWJqZWN0KCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0U3ViamVjdCh0aGlzLmdldFN1YmplY3QoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRUaXRsZSgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldFRpdGxlKHRoaXMuZ2V0VGl0bGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LmRlZmF1bHRXb3JkQnJlYWtzID0gdGhpcy5kZWZhdWx0V29yZEJyZWFrcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBwZGZDb3B5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgSmF2YVNjcmlwdCB0byB0aGlzIGRvY3VtZW50LiBUaGUgc3VwcGxpZWQgYHNjcmlwdGAgaXMgZXhlY3V0ZWQgd2hlbiB0aGVcbiAgICAgKiBkb2N1bWVudCBpcyBvcGVuZWQuIFRoZSBgc2NyaXB0YCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHNvbWUgb3BlcmF0aW9uXG4gICAgICogd2hlbiB0aGUgZG9jdW1lbnQgaXMgb3BlbmVkIChlLmcuIGxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUpLCBvciBpdCBjYW4gYmVcbiAgICAgKiB1c2VkIHRvIGRlZmluZSBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgbGF0ZXIgaW4gYSBKYXZhU2NyaXB0XG4gICAgICogYWN0aW9uLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIFNob3cgXCJIZWxsbyBXb3JsZCFcIiBpbiB0aGUgY29uc29sZSB3aGVuIHRoZSBQREYgaXMgb3BlbmVkXG4gICAgICogcGRmRG9jLmFkZEphdmFTY3JpcHQoXG4gICAgICogICAnbWFpbicsXG4gICAgICogICAnY29uc29sZS5zaG93KCk7IGNvbnNvbGUucHJpbnRsbihcIkhlbGxvIFdvcmxkIVwiKTsnXG4gICAgICogKTtcbiAgICAgKlxuICAgICAqIC8vIERlZmluZSBhIGZ1bmN0aW9uIG5hbWVkIFwiZm9vXCIgdGhhdCBjYW4gYmUgY2FsbGVkIGluIEphdmFTY3JpcHQgQWN0aW9uc1xuICAgICAqIHBkZkRvYy5hZGRKYXZhU2NyaXB0KFxuICAgICAqICAgJ2ZvbycsXG4gICAgICogICAnZnVuY3Rpb24gZm9vKCkgeyByZXR1cm4gXCJmb29cIjsgfSdcbiAgICAgKiApO1xuICAgICAqIGBgYFxuICAgICAqIFNlZSB0aGUgW0phdmFTY3JpcHQgZm9yIEFjcm9iYXQgQVBJIFJlZmVyZW5jZV0oaHR0cHM6Ly93d3cuYWRvYmUuY29tL2NvbnRlbnQvZGFtL2Fjb20vZW4vZGV2bmV0L2Fjcm9iYXQvcGRmcy9qc19hcGlfcmVmZXJlbmNlLnBkZilcbiAgICAgKiBmb3IgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc2NyaXB0LiBNdXN0IGJlIHVuaXF1ZSBwZXIgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIHNjcmlwdCBUaGUgSmF2YVNjcmlwdCB0byBleGVjdXRlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5hZGRKYXZhU2NyaXB0ID0gZnVuY3Rpb24gKG5hbWUsIHNjcmlwdCkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICBhc3NlcnRJcyhzY3JpcHQsICdzY3JpcHQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGVtYmVkZGVyID0gSmF2YVNjcmlwdEVtYmVkZGVyLmZvcihzY3JpcHQsIG5hbWUpO1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgdmFyIGphdmFTY3JpcHQgPSBQREZKYXZhU2NyaXB0Lm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICB0aGlzLmphdmFTY3JpcHRzLnB1c2goamF2YVNjcmlwdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGQgYW4gYXR0YWNobWVudCB0byB0aGlzIGRvY3VtZW50LiBBdHRhY2htZW50cyBhcmUgdmlzaWJsZSBpbiB0aGVcbiAgICAgKiBcIkF0dGFjaG1lbnRzXCIgcGFuZWwgb2YgQWRvYmUgQWNyb2JhdCBhbmQgc29tZSBvdGhlciBQREYgcmVhZGVycy4gQW55XG4gICAgICogdHlwZSBvZiBmaWxlIGNhbiBiZSBhZGRlZCBhcyBhbiBhdHRhY2htZW50LiBUaGlzIGluY2x1ZGVzLCBidXQgaXMgbm90XG4gICAgICogbGltaXRlZCB0bywgYC5wbmdgLCBgLmpwZ2AsIGAucGRmYCwgYC5jc3ZgLCBgLmRvY3hgLCBhbmQgYC54bHN4YCBmaWxlcy5cbiAgICAgKlxuICAgICAqIFRoZSBpbnB1dCBkYXRhIGNhbiBiZSBwcm92aWRlZCBpbiBtdWx0aXBsZSBmb3JtYXRzOlxuICAgICAqXG4gICAgICogfCBUeXBlICAgICAgICAgIHwgQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGBzdHJpbmdgICAgICAgfCBBIGJhc2U2NCBlbmNvZGVkIHN0cmluZyAob3IgZGF0YSBVUkkpIGNvbnRhaW5pbmcgYW4gYXR0YWNobWVudCB8XG4gICAgICogfCBgVWludDhBcnJheWAgIHwgVGhlIHJhdyBieXRlcyBvZiBhbiBhdHRhY2htZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYEFycmF5QnVmZmVyYCB8IFRoZSByYXcgYnl0ZXMgb2YgYW4gYXR0YWNobWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gYXR0YWNobWVudD1zdHJpbmdcbiAgICAgKiBhd2FpdCBwZGZEb2MuYXR0YWNoKCcvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvMndCRC4uLicsICdjYXRfcmlkaW5nX3VuaWNvcm4uanBnJywge1xuICAgICAqICAgbWltZVR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICAgKiAgIGRlc2NyaXB0aW9uOiAnQ29vbCBjYXQgcmlkaW5nIGEgdW5pY29ybiEg8J+mhPCfkIjwn5W277iPJyxcbiAgICAgKiAgIGNyZWF0aW9uRGF0ZTogbmV3IERhdGUoJzIwMTkvMTIvMDEnKSxcbiAgICAgKiAgIG1vZGlmaWNhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDIwLzA0LzE5JyksXG4gICAgICogfSlcbiAgICAgKiBhd2FpdCBwZGZEb2MuYXR0YWNoKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRLi4uJywgJ2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnLCB7XG4gICAgICogICBtaW1lVHlwZTogJ2ltYWdlL2pwZWcnLFxuICAgICAqICAgZGVzY3JpcHRpb246ICdDb29sIGNhdCByaWRpbmcgYSB1bmljb3JuISDwn6aE8J+QiPCflbbvuI8nLFxuICAgICAqICAgY3JlYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAxOS8xMi8wMScpLFxuICAgICAqICAgbW9kaWZpY2F0aW9uRGF0ZTogbmV3IERhdGUoJzIwMjAvMDQvMTknKSxcbiAgICAgKiB9KVxuICAgICAqXG4gICAgICogLy8gYXR0YWNobWVudD1VaW50OEFycmF5XG4gICAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgICAqIGNvbnN0IHVpbnQ4QXJyYXkgPSBmcy5yZWFkRmlsZVN5bmMoJ2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnKVxuICAgICAqIGF3YWl0IHBkZkRvYy5hdHRhY2godWludDhBcnJheSwgJ2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnLCB7XG4gICAgICogICBtaW1lVHlwZTogJ2ltYWdlL2pwZWcnLFxuICAgICAqICAgZGVzY3JpcHRpb246ICdDb29sIGNhdCByaWRpbmcgYSB1bmljb3JuISDwn6aE8J+QiPCflbbvuI8nLFxuICAgICAqICAgY3JlYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAxOS8xMi8wMScpLFxuICAgICAqICAgbW9kaWZpY2F0aW9uRGF0ZTogbmV3IERhdGUoJzIwMjAvMDQvMTknKSxcbiAgICAgKiB9KVxuICAgICAqXG4gICAgICogLy8gYXR0YWNobWVudD1BcnJheUJ1ZmZlclxuICAgICAqIGNvbnN0IHVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy9jYXRfcmlkaW5nX3VuaWNvcm4uanBnJ1xuICAgICAqIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKHJlcyA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBhd2FpdCBwZGZEb2MuYXR0YWNoKGFycmF5QnVmZmVyLCAnY2F0X3JpZGluZ191bmljb3JuLmpwZycsIHtcbiAgICAgKiAgIG1pbWVUeXBlOiAnaW1hZ2UvanBlZycsXG4gICAgICogICBkZXNjcmlwdGlvbjogJ0Nvb2wgY2F0IHJpZGluZyBhIHVuaWNvcm4hIPCfpoTwn5CI8J+Vtu+4jycsXG4gICAgICogICBjcmVhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDE5LzEyLzAxJyksXG4gICAgICogICBtb2RpZmljYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAyMC8wNC8xOScpLFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCBUaGUgaW5wdXQgZGF0YSBjb250YWluaW5nIHRoZSBmaWxlIHRvIGJlIGF0dGFjaGVkLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGF0dGFjaGVkLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gdGhlIGF0dGFjaG1lbnQgaXMgY29tcGxldGUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmF0dGFjaCA9IGZ1bmN0aW9uIChhdHRhY2htZW50LCBuYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBieXRlcywgZW1iZWRkZXIsIHJlZiwgZW1iZWRkZWRGaWxlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGFzc2VydElzKGF0dGFjaG1lbnQsICdhdHRhY2htZW50JywgWydzdHJpbmcnLCBVaW50OEFycmF5LCBBcnJheUJ1ZmZlcl0pO1xuICAgICAgICAgICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5taW1lVHlwZSwgJ21pbWVUeXBlJywgWydzdHJpbmcnXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5kZXNjcmlwdGlvbiwgJ2Rlc2NyaXB0aW9uJywgWydzdHJpbmcnXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jcmVhdGlvbkRhdGUsICdvcHRpb25zLmNyZWF0aW9uRGF0ZScsIFtEYXRlXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5tb2RpZmljYXRpb25EYXRlLCAnb3B0aW9ucy5tb2RpZmljYXRpb25EYXRlJywgW1xuICAgICAgICAgICAgICAgICAgICBEYXRlLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmFmUmVsYXRpb25zaGlwLCAnb3B0aW9ucy5hZlJlbGF0aW9uc2hpcCcsIEFGUmVsYXRpb25zaGlwKTtcbiAgICAgICAgICAgICAgICBieXRlcyA9IHRvVWludDhBcnJheShhdHRhY2htZW50KTtcbiAgICAgICAgICAgICAgICBlbWJlZGRlciA9IEZpbGVFbWJlZGRlci5mb3IoYnl0ZXMsIG5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWRGaWxlID0gUERGRW1iZWRkZWRGaWxlLm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRkZWRGaWxlcy5wdXNoKGVtYmVkZGVkRmlsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgYSBmb250IGludG8gdGhpcyBkb2N1bWVudC4gVGhlIGlucHV0IGRhdGEgY2FuIGJlIHByb3ZpZGVkIGluIG11bHRpcGxlXG4gICAgICogZm9ybWF0czpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICAgIHwgQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGBTdGFuZGFyZEZvbnRzYCB8IE9uZSBvZiB0aGUgc3RhbmRhcmQgMTQgZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYHN0cmluZ2AgICAgICAgIHwgQSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgKG9yIGRhdGEgVVJJKSBjb250YWluaW5nIGEgZm9udCB8XG4gICAgICogfCBgVWludDhBcnJheWAgICAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgZm9udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBBcnJheUJ1ZmZlcmAgICB8IFRoZSByYXcgYnl0ZXMgb2YgYSBmb250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBmb250PVN0YW5kYXJkRm9udHNcbiAgICAgKiBpbXBvcnQgeyBTdGFuZGFyZEZvbnRzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKiBjb25zdCBmb250MSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICpcbiAgICAgKiAvLyBmb250PXN0cmluZ1xuICAgICAqIGNvbnN0IGZvbnQyID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udCgnQUFFQUFBQVZBUUFBQkFCUVJGTkpSeC91cGUuLi4nKVxuICAgICAqIGNvbnN0IGZvbnQzID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udCgnZGF0YTpmb250L29wZW50eXBlO2Jhc2U2NCxBQUVBQUEuLi4nKVxuICAgICAqXG4gICAgICogLy8gZm9udD1VaW50OEFycmF5XG4gICAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgICAqIGNvbnN0IGZvbnQ0ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChmcy5yZWFkRmlsZVN5bmMoJ1VidW50dS1SLnR0ZicpKVxuICAgICAqXG4gICAgICogLy8gZm9udD1BcnJheUJ1ZmZlclxuICAgICAqIGNvbnN0IHVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy91YnVudHUvVWJ1bnR1LVIudHRmJ1xuICAgICAqIGNvbnN0IHVidW50dUJ5dGVzID0gYXdhaXQgZmV0Y2godXJsKS50aGVuKHJlcyA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBjb25zdCBmb250NSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQodWJ1bnR1Qnl0ZXMpXG4gICAgICogYGBgXG4gICAgICogU2VlIGFsc286IFtbcmVnaXN0ZXJGb250a2l0XV1cbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgaW5wdXQgZGF0YSBmb3IgYSBmb250LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBlbWJlZGRpbmcgdGhlIGZvbnQuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCB0aGUgZW1iZWRkZWQgZm9udC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRGb250ID0gZnVuY3Rpb24gKGZvbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBzdWJzZXQsIGN1c3RvbU5hbWUsIGZlYXR1cmVzLCBlbWJlZGRlciwgYnl0ZXMsIGZvbnRraXQsIF9iLCByZWYsIHBkZkZvbnQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9wdGlvbnMuc3Vic2V0LCBzdWJzZXQgPSBfYSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSwgY3VzdG9tTmFtZSA9IG9wdGlvbnMuY3VzdG9tTmFtZSwgZmVhdHVyZXMgPSBvcHRpb25zLmZlYXR1cmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbJ3N0cmluZycsIFVpbnQ4QXJyYXksIEFycmF5QnVmZmVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhzdWJzZXQsICdzdWJzZXQnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU3RhbmRhcmRGb250KGZvbnQpKSByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVyID0gU3RhbmRhcmRGb250RW1iZWRkZXIuZm9yKGZvbnQsIGN1c3RvbU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FuQmVDb252ZXJ0ZWRUb1VpbnQ4QXJyYXkoZm9udCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSB0b1VpbnQ4QXJyYXkoZm9udCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250a2l0ID0gdGhpcy5hc3NlcnRGb250a2l0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNldCkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIuZm9yKGZvbnRraXQsIGJ5dGVzLCBjdXN0b21OYW1lLCBmZWF0dXJlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbNCAvKnlpZWxkKi8sIEN1c3RvbUZvbnRFbWJlZGRlci5mb3IoZm9udGtpdCwgYnl0ZXMsIGN1c3RvbU5hbWUsIGZlYXR1cmVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlciA9IF9iO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgN107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjogdGhyb3cgbmV3IFR5cGVFcnJvcignYGZvbnRgIG11c3QgYmUgb25lIG9mIGBTdGFuZGFyZEZvbnRzIHwgc3RyaW5nIHwgVWludDhBcnJheSB8IEFycmF5QnVmZmVyYCcpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSB0aGlzLmNvbnRleHQubmV4dFJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGRmRm9udCA9IFBERkZvbnQub2YocmVmLCB0aGlzLCBlbWJlZGRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvbnRzLnB1c2gocGRmRm9udCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcGRmRm9udF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgYSBzdGFuZGFyZCBmb250IGludG8gdGhpcyBkb2N1bWVudC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFN0YW5kYXJkRm9udHMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqIGNvbnN0IGhlbHZldGljYUZvbnQgPSBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBzdGFuZGFyZCBmb250IHRvIGJlIGVtYmVkZGVkLlxuICAgICAqIEBwYXJhbSBjdXN0b21OYW1lIFRoZSBuYW1lIHRvIGJlIHVzZWQgd2hlbiBlbWJlZGRpbmcgdGhlIGZvbnQuXG4gICAgICogQHJldHVybnMgVGhlIGVtYmVkZGVkIGZvbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkU3RhbmRhcmRGb250ID0gZnVuY3Rpb24gKGZvbnQsIGN1c3RvbU5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgaWYgKCFpc1N0YW5kYXJkRm9udChmb250KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGZvbnRgIG11c3QgYmUgb25lIG9mIHR5cGUgYFN0YW5kYXJkRm9udHNgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVtYmVkZGVyID0gU3RhbmRhcmRGb250RW1iZWRkZXIuZm9yKGZvbnQsIGN1c3RvbU5hbWUpO1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgdmFyIHBkZkZvbnQgPSBQREZGb250Lm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICB0aGlzLmZvbnRzLnB1c2gocGRmRm9udCk7XG4gICAgICAgIHJldHVybiBwZGZGb250O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgYSBKUEVHIGltYWdlIGludG8gdGhpcyBkb2N1bWVudC4gVGhlIGlucHV0IGRhdGEgY2FuIGJlIHByb3ZpZGVkIGluXG4gICAgICogbXVsdGlwbGUgZm9ybWF0czpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICB8IENvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgICAqIHwgYHN0cmluZ2AgICAgICB8IEEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIChvciBkYXRhIFVSSSkgY29udGFpbmluZyBhIEpQRUcgaW1hZ2UgfFxuICAgICAqIHwgYFVpbnQ4QXJyYXlgICB8IFRoZSByYXcgYnl0ZXMgb2YgYSBKUEVHIGltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYEFycmF5QnVmZmVyYCB8IFRoZSByYXcgYnl0ZXMgb2YgYSBKUEVHIGltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBqcGc9c3RyaW5nXG4gICAgICogY29uc3QgaW1hZ2UxID0gYXdhaXQgcGRmRG9jLmVtYmVkSnBnKCcvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvMndCRC4uLicpXG4gICAgICogY29uc3QgaW1hZ2UyID0gYXdhaXQgcGRmRG9jLmVtYmVkSnBnKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRLi4uJylcbiAgICAgKlxuICAgICAqIC8vIGpwZz1VaW50OEFycmF5XG4gICAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgICAqIGNvbnN0IHVpbnQ4QXJyYXkgPSBmcy5yZWFkRmlsZVN5bmMoJ2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnKVxuICAgICAqIGNvbnN0IGltYWdlMyA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZyh1aW50OEFycmF5KVxuICAgICAqXG4gICAgICogLy8ganBnPUFycmF5QnVmZmVyXG4gICAgICogY29uc3QgdXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnXG4gICAgICogY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4ocmVzID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGNvbnN0IGltYWdlNCA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZyhhcnJheUJ1ZmZlcilcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBqcGcgVGhlIGlucHV0IGRhdGEgZm9yIGEgSlBFRyBpbWFnZS5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIHRoZSBlbWJlZGRlZCBpbWFnZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRKcGcgPSBmdW5jdGlvbiAoanBnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBieXRlcywgZW1iZWRkZXIsIHJlZiwgcGRmSW1hZ2U7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhqcGcsICdqcGcnLCBbJ3N0cmluZycsIFVpbnQ4QXJyYXksIEFycmF5QnVmZmVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IHRvVWludDhBcnJheShqcGcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgSnBlZ0VtYmVkZGVyLmZvcihieXRlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlciA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZGZJbWFnZSA9IFBERkltYWdlLm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWFnZXMucHVzaChwZGZJbWFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcGRmSW1hZ2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIGEgUE5HIGltYWdlIGludG8gdGhpcyBkb2N1bWVudC4gVGhlIGlucHV0IGRhdGEgY2FuIGJlIHByb3ZpZGVkIGluXG4gICAgICogbXVsdGlwbGUgZm9ybWF0czpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICB8IENvbnRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGBzdHJpbmdgICAgICAgfCBBIGJhc2U2NCBlbmNvZGVkIHN0cmluZyAob3IgZGF0YSBVUkkpIGNvbnRhaW5pbmcgYSBQTkcgaW1hZ2UgfFxuICAgICAqIHwgYFVpbnQ4QXJyYXlgICB8IFRoZSByYXcgYnl0ZXMgb2YgYSBQTkcgaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgQXJyYXlCdWZmZXJgIHwgVGhlIHJhdyBieXRlcyBvZiBhIFBORyBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcG5nPXN0cmluZ1xuICAgICAqIGNvbnN0IGltYWdlMSA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZygnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWxnQUFBRjMuLi4nKVxuICAgICAqIGNvbnN0IGltYWdlMiA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZygnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2cuLi4nKVxuICAgICAqXG4gICAgICogLy8gcG5nPVVpbnQ4QXJyYXlcbiAgICAgKiBpbXBvcnQgZnMgZnJvbSAnZnMnXG4gICAgICogY29uc3QgdWludDhBcnJheSA9IGZzLnJlYWRGaWxlU3luYygnc21hbGxfbWFyaW8ucG5nJylcbiAgICAgKiBjb25zdCBpbWFnZTMgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcodWludDhBcnJheSlcbiAgICAgKlxuICAgICAqIC8vIHBuZz1BcnJheUJ1ZmZlclxuICAgICAqIGNvbnN0IHVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy9zbWFsbF9tYXJpby5wbmcnXG4gICAgICogY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4ocmVzID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGNvbnN0IGltYWdlNCA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZyhhcnJheUJ1ZmZlcilcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbmcgVGhlIGlucHV0IGRhdGEgZm9yIGEgUE5HIGltYWdlLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggdGhlIGVtYmVkZGVkIGltYWdlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZFBuZyA9IGZ1bmN0aW9uIChwbmcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGJ5dGVzLCBlbWJlZGRlciwgcmVmLCBwZGZJbWFnZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHBuZywgJ3BuZycsIFsnc3RyaW5nJywgVWludDhBcnJheSwgQXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gdG9VaW50OEFycmF5KHBuZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQbmdFbWJlZGRlci5mb3IoYnl0ZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZXIgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSB0aGlzLmNvbnRleHQubmV4dFJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGRmSW1hZ2UgPSBQREZJbWFnZS5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VzLnB1c2gocGRmSW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHBkZkltYWdlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbWJlZCBvbmUgb3IgbW9yZSBQREYgcGFnZXMgaW50byB0aGlzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqXG4gICAgICogY29uc3Qgc291cmNlUGRmVXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL3dpdGhfbGFyZ2VfcGFnZV9jb3VudC5wZGYnXG4gICAgICogY29uc3Qgc291cmNlUGRmID0gYXdhaXQgZmV0Y2goc291cmNlUGRmVXJsKS50aGVuKChyZXMpID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqXG4gICAgICogLy8gRW1iZWQgcGFnZSA3NCBvZiBgc291cmNlUGRmYCBpbnRvIGBwZGZEb2NgXG4gICAgICogY29uc3QgW2VtYmVkZGVkUGFnZV0gPSBhd2FpdCBwZGZEb2MuZW1iZWRQZGYoc291cmNlUGRmLCBbNzNdKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2VlIFtbUERGRG9jdW1lbnQubG9hZF1dIGZvciBleGFtcGxlcyBvZiB0aGUgYWxsb3dlZCBpbnB1dCBkYXRhIGZvcm1hdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGRmIFRoZSBpbnB1dCBkYXRhIGNvbnRhaW5pbmcgYSBQREYgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgb2YgdGhlIHBhZ2VzIHRoYXQgc2hvdWxkIGJlIGVtYmVkZGVkLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIGVtYmVkZGVkIHBhZ2VzLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZFBkZiA9IGZ1bmN0aW9uIChwZGYsIGluZGljZXMpIHtcbiAgICAgICAgaWYgKGluZGljZXMgPT09IHZvaWQgMCkgeyBpbmRpY2VzID0gWzBdOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzcmNEb2MsIF9hLCBzcmNQYWdlcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHBkZiwgJ3BkZicsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5QnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J10sXG4gICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGluZGljZXMsICdpbmRpY2VzJywgW0FycmF5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwZGYgaW5zdGFuY2VvZiBQREZEb2N1bWVudCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBwZGY7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWzQgLyp5aWVsZCovLCBQREZEb2N1bWVudC5sb2FkKHBkZildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3JjRG9jID0gX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmNQYWdlcyA9IHBsdWNrSW5kaWNlcyhzcmNEb2MuZ2V0UGFnZXMoKSwgaW5kaWNlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5lbWJlZFBhZ2VzKHNyY1BhZ2VzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgYSBzaW5nbGUgUERGIHBhZ2UgaW50byB0aGlzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqXG4gICAgICogY29uc3Qgc291cmNlUGRmVXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL3dpdGhfbGFyZ2VfcGFnZV9jb3VudC5wZGYnXG4gICAgICogY29uc3Qgc291cmNlQnVmZmVyID0gYXdhaXQgZmV0Y2goc291cmNlUGRmVXJsKS50aGVuKChyZXMpID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGNvbnN0IHNvdXJjZVBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoc291cmNlQnVmZmVyKVxuICAgICAqIGNvbnN0IHNvdXJjZVBkZlBhZ2UgPSBzb3VyY2VQZGZEb2MuZ2V0UGFnZXMoKVs3M11cbiAgICAgKlxuICAgICAqIGNvbnN0IGVtYmVkZGVkUGFnZSA9IGF3YWl0IHBkZkRvYy5lbWJlZFBhZ2UoXG4gICAgICogICBzb3VyY2VQZGZQYWdlLFxuICAgICAqXG4gICAgICogICAvLyBDbGlwIGEgc2VjdGlvbiBvZiB0aGUgc291cmNlIHBhZ2Ugc28gdGhhdCB3ZSBvbmx5IGVtYmVkIHBhcnQgb2YgaXRcbiAgICAgKiAgIHsgbGVmdDogMTAwLCByaWdodDogNDUwLCBib3R0b206IDMzMCwgdG9wOiA1NzAgfSxcbiAgICAgKlxuICAgICAqICAgLy8gVHJhbnNsYXRlIGFsbCBkcmF3aW5ncyBvZiB0aGUgZW1iZWRkZWQgcGFnZSBieSAoMTAsIDIwMCkgdW5pdHNcbiAgICAgKiAgIFsxLCAwLCAwLCAxLCAxMCwgMjAwXSxcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byBiZSBlbWJlZGRlZC5cbiAgICAgKiBAcGFyYW0gYm91bmRpbmdCb3hcbiAgICAgKiBPcHRpb25hbGx5LCBhbiBhcmVhIG9mIHRoZSBzb3VyY2UgcGFnZSB0aGF0IHNob3VsZCBiZSBlbWJlZGRlZFxuICAgICAqIChkZWZhdWx0cyB0byBlbnRpcmUgcGFnZSkuXG4gICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uTWF0cml4XG4gICAgICogT3B0aW9uYWxseSwgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdGhhdCBpcyBhbHdheXMgYXBwbGllZCB0byB0aGUgZW1iZWRkZWRcbiAgICAgKiBwYWdlIGFueXdoZXJlIGl0IGlzIGRyYXduLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggdGhlIGVtYmVkZGVkIHBkZiBwYWdlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZFBhZ2UgPSBmdW5jdGlvbiAocGFnZSwgYm91bmRpbmdCb3gsIHRyYW5zZm9ybWF0aW9uTWF0cml4KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlbWJlZGRlZFBhZ2U7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZFBhZ2VzKFtwYWdlXSwgW2JvdW5kaW5nQm94XSwgW3RyYW5zZm9ybWF0aW9uTWF0cml4XSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZFBhZ2UgPSAoX2Euc2VudCgpKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBlbWJlZGRlZFBhZ2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIG9uZSBvciBtb3JlIFBERiBwYWdlcyBpbnRvIHRoaXMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBzb3VyY2VQZGZVcmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvd2l0aF9sYXJnZV9wYWdlX2NvdW50LnBkZidcbiAgICAgKiBjb25zdCBzb3VyY2VCdWZmZXIgPSBhd2FpdCBmZXRjaChzb3VyY2VQZGZVcmwpLnRoZW4oKHJlcykgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICogY29uc3Qgc291cmNlUGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZChzb3VyY2VCdWZmZXIpXG4gICAgICpcbiAgICAgKiBjb25zdCBwYWdlMSA9IHNvdXJjZVBkZkRvYy5nZXRQYWdlcygpWzBdXG4gICAgICogY29uc3QgcGFnZTIgPSBzb3VyY2VQZGZEb2MuZ2V0UGFnZXMoKVs1Ml1cbiAgICAgKiBjb25zdCBwYWdlMyA9IHNvdXJjZVBkZkRvYy5nZXRQYWdlcygpWzczXVxuICAgICAqXG4gICAgICogY29uc3QgZW1iZWRkZWRQYWdlcyA9IGF3YWl0IHBkZkRvYy5lbWJlZFBhZ2VzKFtwYWdlMSwgcGFnZTIsIHBhZ2UzXSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWdlXG4gICAgICogVGhlIHBhZ2VzIHRvIGJlIGVtYmVkZGVkICh0aGV5IG11c3QgYWxsIHNoYXJlIHRoZSBzYW1lIGNvbnRleHQpLlxuICAgICAqIEBwYXJhbSBib3VuZGluZ0JveGVzXG4gICAgICogT3B0aW9uYWxseSwgYW4gYXJyYXkgb2YgY2xpcHBpbmcgYm91bmRhcmllcyAtIG9uZSBmb3IgZWFjaCBwYWdlXG4gICAgICogKGRlZmF1bHRzIHRvIGVudGlyZXR5IG9mIGVhY2ggcGFnZSkuXG4gICAgICogQHBhcmFtIHRyYW5zZm9ybWF0aW9uTWF0cmljZXNcbiAgICAgKiBPcHRpb25hbGx5LCBhbiBhcnJheSBvZiB0cmFuc2Zvcm1hdGlvbiBtYXRyaWNlcyAtIG9uZSBmb3IgZWFjaCBwYWdlXG4gICAgICogKGVhY2ggcGFnZSdzIHRyYW5zZm9ybWF0aW9uIHdpbGwgYXBwbHkgYW55d2hlcmUgaXQgaXMgZHJhd24pLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIGVtYmVkZGVkIHBkZiBwYWdlcy5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRQYWdlcyA9IGZ1bmN0aW9uIChwYWdlcywgYm91bmRpbmdCb3hlcywgdHJhbnNmb3JtYXRpb25NYXRyaWNlcykge1xuICAgICAgICBpZiAoYm91bmRpbmdCb3hlcyA9PT0gdm9pZCAwKSB7IGJvdW5kaW5nQm94ZXMgPSBbXTsgfVxuICAgICAgICBpZiAodHJhbnNmb3JtYXRpb25NYXRyaWNlcyA9PT0gdm9pZCAwKSB7IHRyYW5zZm9ybWF0aW9uTWF0cmljZXMgPSBbXTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaWR4LCBsZW4sIGN1cnJQYWdlLCBuZXh0UGFnZSwgY29udGV4dCwgbWF5YmVDb3B5UGFnZSwgZW1iZWRkZWRQYWdlcywgaWR4LCBsZW4sIHBhZ2UsIGJveCwgbWF0cml4LCBlbWJlZGRlciwgcmVmO1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgW11dO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzZXJ0IGFsbCBwYWdlcyBoYXZlIHRoZSBzYW1lIGNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWR4ID0gMCwgbGVuID0gcGFnZXMubGVuZ3RoIC0gMTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJQYWdlID0gcGFnZXNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UGFnZSA9IHBhZ2VzW2lkeCArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyUGFnZS5ub2RlLmNvbnRleHQgIT09IG5leHRQYWdlLm5vZGUuY29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gcGFnZXNbMF0ubm9kZS5jb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVDb3B5UGFnZSA9IGNvbnRleHQgPT09IHRoaXMuY29udGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKHApIHsgcmV0dXJuIHA7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBERk9iamVjdENvcGllci5mb3IoY29udGV4dCwgdGhpcy5jb250ZXh0KS5jb3B5O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZWRQYWdlcyA9IG5ldyBBcnJheShwYWdlcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gMCwgbGVuID0gcGFnZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpZHggPCBsZW4pKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBtYXliZUNvcHlQYWdlKHBhZ2VzW2lkeF0ubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3ggPSBib3VuZGluZ0JveGVzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXggPSB0cmFuc2Zvcm1hdGlvbk1hdHJpY2VzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQREZQYWdlRW1iZWRkZXIuZm9yKHBhZ2UsIGJveCwgbWF0cml4KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVyID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkUGFnZXNbaWR4XSA9IFBERkVtYmVkZGVkUGFnZS5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgKF9hID0gdGhpcy5lbWJlZGRlZFBhZ2VzKS5wdXNoLmFwcGx5KF9hLCBlbWJlZGRlZFBhZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBlbWJlZGRlZFBhZ2VzXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3Ugc2hvdWxkbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlIFtbc2F2ZV1dXG4gICAgICogPiBhbmQgW1tzYXZlQXNCYXNlNjRdXSBtZXRob2RzIHdpbGwgYXV0b21hdGljYWxseSBlbnN1cmUgdGhhdCBhbGwgZW1iZWRkZWRcbiAgICAgKiA+IGFzc2V0cyBhcmUgZmx1c2hlZCBiZWZvcmUgc2VyaWFsaXppbmcgdGhlIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogRmx1c2ggYWxsIGVtYmVkZGVkIGZvbnRzLCBQREYgcGFnZXMsIGFuZCBpbWFnZXMgdG8gdGhpcyBkb2N1bWVudCdzXG4gICAgICogW1tjb250ZXh0XV0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aGVuIHRoZSBmbHVzaCBpcyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEFsbCh0aGlzLmZvbnRzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRBbGwodGhpcy5pbWFnZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEFsbCh0aGlzLmVtYmVkZGVkUGFnZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEFsbCh0aGlzLmVtYmVkZGVkRmlsZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEFsbCh0aGlzLmphdmFTY3JpcHRzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgdGhpcyBkb2N1bWVudCB0byBhbiBhcnJheSBvZiBieXRlcyBtYWtpbmcgdXAgYSBQREYgZmlsZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBkZkJ5dGVzID0gYXdhaXQgcGRmRG9jLnNhdmUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB5b3UgY2FuIGRvIHdpdGggdGhlIHNlcmlhbGl6ZWQgZG9jdW1lbnQsXG4gICAgICogZGVwZW5kaW5nIG9uIHRoZSBKYXZhU2NyaXB0IGVudmlyb25tZW50IHlvdSdyZSBydW5uaW5nIGluOlxuICAgICAqICogV3JpdGUgaXQgdG8gYSBmaWxlIGluIE5vZGUgb3IgUmVhY3QgTmF0aXZlXG4gICAgICogKiBEb3dubG9hZCBpdCBhcyBhIEJsb2IgaW4gdGhlIGJyb3dzZXJcbiAgICAgKiAqIFJlbmRlciBpdCBpbiBhbiBgaWZyYW1lYFxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIHNhdmluZyB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCB0aGUgYnl0ZXMgb2YgdGhlIHNlcmlhbGl6ZWQgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHVzZU9iamVjdFN0cmVhbXMsIF9iLCBhZGREZWZhdWx0UGFnZSwgX2MsIG9iamVjdHNQZXJUaWNrLCBfZCwgdXBkYXRlRmllbGRBcHBlYXJhbmNlcywgZm9ybSwgV3JpdGVyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2UubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBvcHRpb25zLnVzZU9iamVjdFN0cmVhbXMsIHVzZU9iamVjdFN0cmVhbXMgPSBfYSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hLCBfYiA9IG9wdGlvbnMuYWRkRGVmYXVsdFBhZ2UsIGFkZERlZmF1bHRQYWdlID0gX2IgPT09IHZvaWQgMCA/IHRydWUgOiBfYiwgX2MgPSBvcHRpb25zLm9iamVjdHNQZXJUaWNrLCBvYmplY3RzUGVyVGljayA9IF9jID09PSB2b2lkIDAgPyA1MCA6IF9jLCBfZCA9IG9wdGlvbnMudXBkYXRlRmllbGRBcHBlYXJhbmNlcywgdXBkYXRlRmllbGRBcHBlYXJhbmNlcyA9IF9kID09PSB2b2lkIDAgPyB0cnVlIDogX2Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyh1c2VPYmplY3RTdHJlYW1zLCAndXNlT2JqZWN0U3RyZWFtcycsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGFkZERlZmF1bHRQYWdlLCAnYWRkRGVmYXVsdFBhZ2UnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhvYmplY3RzUGVyVGljaywgJ29iamVjdHNQZXJUaWNrJywgWydudW1iZXInXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyh1cGRhdGVGaWVsZEFwcGVhcmFuY2VzLCAndXBkYXRlRmllbGRBcHBlYXJhbmNlcycsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGREZWZhdWx0UGFnZSAmJiB0aGlzLmdldFBhZ2VDb3VudCgpID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtID0gdGhpcy5mb3JtQ2FjaGUuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmZsdXNoKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBXcml0ZXIgPSB1c2VPYmplY3RTdHJlYW1zID8gUERGU3RyZWFtV3JpdGVyIDogUERGV3JpdGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFdyaXRlci5mb3JDb250ZXh0KHRoaXMuY29udGV4dCwgb2JqZWN0c1BlclRpY2spLnNlcmlhbGl6ZVRvQnVmZmVyKCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSB0aGlzIGRvY3VtZW50IHRvIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIG9yIGRhdGEgVVJJIG1ha2luZyB1cCBhXG4gICAgICogUERGIGZpbGUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYmFzZTY0U3RyaW5nID0gYXdhaXQgcGRmRG9jLnNhdmVBc0Jhc2U2NCgpXG4gICAgICogYmFzZTY0U3RyaW5nIC8vID0+ICdKVkJFUmkweExqY0tKWUdCZ1lFS0MuLi4nXG4gICAgICpcbiAgICAgKiBjb25zdCBiYXNlNjREYXRhVXJpID0gYXdhaXQgcGRmRG9jLnNhdmVBc0Jhc2U2NCh7IGRhdGFVcmk6IHRydWUgfSlcbiAgICAgKiBiYXNlNjREYXRhVXJpIC8vID0+ICdkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsSlZCRVJpMHhMamNLSllHQmdZRUtDLi4uJ1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIHNhdmluZyB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBvciBkYXRhIFVSSSBvZiB0aGVcbiAgICAgKiAgICAgICAgICBzZXJpYWxpemVkIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zYXZlQXNCYXNlNjQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIGRhdGFVcmksIG90aGVyT3B0aW9ucywgYnl0ZXMsIGJhc2U2NDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gb3B0aW9ucy5kYXRhVXJpLCBkYXRhVXJpID0gX2EgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EsIG90aGVyT3B0aW9ucyA9IF9fcmVzdChvcHRpb25zLCBbXCJkYXRhVXJpXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGRhdGFVcmksICdkYXRhVXJpJywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5zYXZlKG90aGVyT3B0aW9ucyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NCA9IGVuY29kZVRvQmFzZTY0KGJ5dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBkYXRhVXJpID8gXCJkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsXCIgKyBiYXNlNjQgOiBiYXNlNjRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5maW5kUGFnZUZvckFubm90YXRpb25SZWYgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHZhciBwYWdlcyA9IHRoaXMuZ2V0UGFnZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gcGFnZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgcGFnZSA9IHBhZ2VzW2lkeF07XG4gICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSBwYWdlLm5vZGUuQW5ub3RzKCk7XG4gICAgICAgICAgICBpZiAoKGFubm90YXRpb25zID09PSBudWxsIHx8IGFubm90YXRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhbm5vdGF0aW9ucy5pbmRleE9mKHJlZikpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkQWxsID0gZnVuY3Rpb24gKGVtYmVkZGFibGVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpZHgsIGxlbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IGVtYmVkZGFibGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBlbWJlZGRhYmxlc1tpZHhdLmVtYmVkKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS51cGRhdGVJbmZvRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBkZkxpYiA9IFwicGRmLWxpYiAoaHR0cHM6Ly9naXRodWIuY29tL0hvcGRpbmcvcGRmLWxpYilcIjtcbiAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBpbmZvID0gdGhpcy5nZXRJbmZvRGljdCgpO1xuICAgICAgICB0aGlzLnNldFByb2R1Y2VyKHBkZkxpYik7XG4gICAgICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShub3cpO1xuICAgICAgICBpZiAoIWluZm8uZ2V0KFBERk5hbWUub2YoJ0NyZWF0b3InKSkpXG4gICAgICAgICAgICB0aGlzLnNldENyZWF0b3IocGRmTGliKTtcbiAgICAgICAgaWYgKCFpbmZvLmdldChQREZOYW1lLm9mKCdDcmVhdGlvbkRhdGUnKSkpXG4gICAgICAgICAgICB0aGlzLnNldENyZWF0aW9uRGF0ZShub3cpO1xuICAgIH07XG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldEluZm9EaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZXhpc3RpbmdJbmZvID0gdGhpcy5jb250ZXh0Lmxvb2t1cCh0aGlzLmNvbnRleHQudHJhaWxlckluZm8uSW5mbyk7XG4gICAgICAgIGlmIChleGlzdGluZ0luZm8gaW5zdGFuY2VvZiBQREZEaWN0KVxuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5mbztcbiAgICAgICAgdmFyIG5ld0luZm8gPSB0aGlzLmNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLkluZm8gPSB0aGlzLmNvbnRleHQucmVnaXN0ZXIobmV3SW5mbyk7XG4gICAgICAgIHJldHVybiBuZXdJbmZvO1xuICAgIH07XG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmFzc2VydEZvbnRraXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5mb250a2l0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9udGtpdDtcbiAgICB9O1xuICAgIHJldHVybiBQREZEb2N1bWVudDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZEb2N1bWVudDtcbi8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBvbmx5LWFycm93LWZ1bmN0aW9ucyAqL1xuZnVuY3Rpb24gYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcocGRmT2JqZWN0KSB7XG4gICAgaWYgKCEocGRmT2JqZWN0IGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSAmJlxuICAgICAgICAhKHBkZk9iamVjdCBpbnN0YW5jZW9mIFBERlN0cmluZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IoW1BERkhleFN0cmluZywgUERGU3RyaW5nXSwgcGRmT2JqZWN0KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZEb2N1bWVudC5qcy5tYXAiLCJleHBvcnQgdmFyIFBhcnNlU3BlZWRzO1xuKGZ1bmN0aW9uIChQYXJzZVNwZWVkcykge1xuICAgIFBhcnNlU3BlZWRzW1BhcnNlU3BlZWRzW1wiRmFzdGVzdFwiXSA9IEluZmluaXR5XSA9IFwiRmFzdGVzdFwiO1xuICAgIFBhcnNlU3BlZWRzW1BhcnNlU3BlZWRzW1wiRmFzdFwiXSA9IDE1MDBdID0gXCJGYXN0XCI7XG4gICAgUGFyc2VTcGVlZHNbUGFyc2VTcGVlZHNbXCJNZWRpdW1cIl0gPSA1MDBdID0gXCJNZWRpdW1cIjtcbiAgICBQYXJzZVNwZWVkc1tQYXJzZVNwZWVkc1tcIlNsb3dcIl0gPSAxMDBdID0gXCJTbG93XCI7XG59KShQYXJzZVNwZWVkcyB8fCAoUGFyc2VTcGVlZHMgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRG9jdW1lbnRPcHRpb25zLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFBERk5hbWUsIFBERkFycmF5LCBQREZEaWN0LCBQREZIZXhTdHJpbmcgfSBmcm9tIFwiLi4vY29yZVwiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgZmlsZSB0aGF0IGhhcyBiZWVuIGVtYmVkZGVkIGluIGEgW1tQREZEb2N1bWVudF1dLlxuICovXG52YXIgUERGRW1iZWRkZWRGaWxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkVtYmVkZGVkRmlsZShyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgdGhpcy5hbHJlYWR5RW1iZWRkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmVtYmVkZGVyID0gZW1iZWRkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZVxuICAgICAqID4gW1tQREZEb2N1bWVudC5zYXZlXV0gYW5kIFtbUERGRG9jdW1lbnQuc2F2ZUFzQmFzZTY0XV0gbWV0aG9kcyB3aWxsXG4gICAgICogPiBhdXRvbWF0aWNhbGx5IGVuc3VyZSBhbGwgZW1iZWRkYWJsZSBmaWxlcyBnZXQgZW1iZWRkZWQuXG4gICAgICpcbiAgICAgKiBFbWJlZCB0aGlzIGVtYmVkZGFibGUgZmlsZSBpbiBpdHMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aGVuIHRoZSBlbWJlZGRpbmcgaXMgY29tcGxldGUuXG4gICAgICovXG4gICAgUERGRW1iZWRkZWRGaWxlLnByb3RvdHlwZS5lbWJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlZiwgTmFtZXMsIEVtYmVkZGVkRmlsZXMsIEVGTmFtZXMsIEFGO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5hbHJlYWR5RW1iZWRkZWQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZGRlci5lbWJlZEludG9Db250ZXh0KHRoaXMuZG9jLmNvbnRleHQsIHRoaXMucmVmKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb2MuY2F0YWxvZy5oYXMoUERGTmFtZS5vZignTmFtZXMnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvYy5jYXRhbG9nLnNldChQREZOYW1lLm9mKCdOYW1lcycpLCB0aGlzLmRvYy5jb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXMgPSB0aGlzLmRvYy5jYXRhbG9nLmxvb2t1cChQREZOYW1lLm9mKCdOYW1lcycpLCBQREZEaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTmFtZXMuaGFzKFBERk5hbWUub2YoJ0VtYmVkZGVkRmlsZXMnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lcy5zZXQoUERGTmFtZS5vZignRW1iZWRkZWRGaWxlcycpLCB0aGlzLmRvYy5jb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRkZWRGaWxlcyA9IE5hbWVzLmxvb2t1cChQREZOYW1lLm9mKCdFbWJlZGRlZEZpbGVzJyksIFBERkRpY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFFbWJlZGRlZEZpbGVzLmhhcyhQREZOYW1lLm9mKCdOYW1lcycpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkZGVkRmlsZXMuc2V0KFBERk5hbWUub2YoJ05hbWVzJyksIHRoaXMuZG9jLmNvbnRleHQub2JqKFtdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBFRk5hbWVzID0gRW1iZWRkZWRGaWxlcy5sb29rdXAoUERGTmFtZS5vZignTmFtZXMnKSwgUERGQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRUZOYW1lcy5wdXNoKFBERkhleFN0cmluZy5mcm9tVGV4dCh0aGlzLmVtYmVkZGVyLmZpbGVOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFRk5hbWVzLnB1c2gocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogVGhlIEFGLVRhZyBpcyBuZWVkZWQgdG8gYWNoaWV2ZSBQREYtQTMgY29tcGxpYW5jZSBmb3IgZW1iZWRkZWQgZmlsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGRvY3VtZW50IG91dGxpbmVzIHRoZSB1c2VzIGNhc2VzIG9mIHRoZSBhc3NvY2lhdGVkIGZpbGVzIChBRikgdGFnLlxuICAgICAgICAgICAgICAgICAgICAgICAgICogU2VlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICogaHR0cHM6Ly93d3cucGRmYS5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMTgvMTAvUERGMjBfQU4wMDItQUYucGRmXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb2MuY2F0YWxvZy5oYXMoUERGTmFtZS5vZignQUYnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvYy5jYXRhbG9nLnNldChQREZOYW1lLm9mKCdBRicpLCB0aGlzLmRvYy5jb250ZXh0Lm9iaihbXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQUYgPSB0aGlzLmRvYy5jYXRhbG9nLmxvb2t1cChQREZOYW1lLm9mKCdBRicpLCBQREZBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBBRi5wdXNoKHJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFscmVhZHlFbWJlZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5hdHRhY2hdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlXG4gICAgICogaW5zdGFuY2VzIG9mIFtbUERGRW1iZWRkZWRGaWxlXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkVtYmVkZGVkRmlsZV1dIGZyb20gYW4gZXhpc3RpbmcgcmVmIGFuZCBlbWJlZGRlclxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBmaWxlLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBmaWxlIHdpbGwgYmVsb25nLlxuICAgICAqIEBwYXJhbSBlbWJlZGRlciBUaGUgZW1iZWRkZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZW1iZWQgdGhlIGZpbGUuXG4gICAgICovXG4gICAgUERGRW1iZWRkZWRGaWxlLm9mID0gZnVuY3Rpb24gKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkVtYmVkZGVkRmlsZShyZWYsIGRvYywgZW1iZWRkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkVtYmVkZGVkRmlsZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZFbWJlZGRlZEZpbGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZFbWJlZGRlZEZpbGUuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuL1BERkRvY3VtZW50XCI7XG5pbXBvcnQgeyBQREZQYWdlRW1iZWRkZXIsIFBERlJlZiB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcyB9IGZyb20gXCIuLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgUERGIHBhZ2UgdGhhdCBoYXMgYmVlbiBlbWJlZGRlZCBpbiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqL1xudmFyIFBERkVtYmVkZGVkUGFnZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZFbWJlZGRlZFBhZ2UocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHRoaXMuYWxyZWFkeUVtYmVkZGVkID0gZmFsc2U7XG4gICAgICAgIGFzc2VydElzKHJlZiwgJ3JlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZW1iZWRkZXIsICdlbWJlZGRlcicsIFtbUERGUGFnZUVtYmVkZGVyLCAnUERGUGFnZUVtYmVkZGVyJ11dKTtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLndpZHRoID0gZW1iZWRkZXIud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gZW1iZWRkZXIuaGVpZ2h0O1xuICAgICAgICB0aGlzLmVtYmVkZGVyID0gZW1iZWRkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbXB1dGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhpcyBwYWdlIGFmdGVyIGJlaW5nIHNjYWxlZCBieSB0aGVcbiAgICAgKiBnaXZlbiBgZmFjdG9yYC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBlbWJlZGRlZFBhZ2Uud2lkdGggIC8vID0+IDUwMFxuICAgICAqIGVtYmVkZGVkUGFnZS5oZWlnaHQgLy8gPT4gMjUwXG4gICAgICpcbiAgICAgKiBjb25zdCBzY2FsZWQgPSBlbWJlZGRlZFBhZ2Uuc2NhbGUoMC41KVxuICAgICAqIHNjYWxlZC53aWR0aCAgLy8gPT4gMjUwXG4gICAgICogc2NhbGVkLmhlaWdodCAvLyA9PiAxMjVcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBvZnRlbiB1c2VmdWwgYmVmb3JlIGRyYXdpbmcgYSBwYWdlIHdpdGhcbiAgICAgKiBbW1BERlBhZ2UuZHJhd1BhZ2VdXSB0byBjb21wdXRlIHRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSBmYWN0b3IgVGhlIGZhY3RvciBieSB3aGljaCB0aGlzIHBhZ2Ugc2hvdWxkIGJlIHNjYWxlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFnZSBhZnRlciBiZWluZyBzY2FsZWQuXG4gICAgICovXG4gICAgUERGRW1iZWRkZWRQYWdlLnByb3RvdHlwZS5zY2FsZSA9IGZ1bmN0aW9uIChmYWN0b3IpIHtcbiAgICAgICAgYXNzZXJ0SXMoZmFjdG9yLCAnZmFjdG9yJywgWydudW1iZXInXSk7XG4gICAgICAgIHJldHVybiB7IHdpZHRoOiB0aGlzLndpZHRoICogZmFjdG9yLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0ICogZmFjdG9yIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZW1iZWRkZWRQYWdlLnNpemUoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkUGFnZS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGUoMSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBUaGVcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuc2F2ZV1dIGFuZCBbW1BERkRvY3VtZW50LnNhdmVBc0Jhc2U2NF1dIG1ldGhvZHMgd2lsbFxuICAgICAqID4gYXV0b21hdGljYWxseSBlbnN1cmUgYWxsIGVtYmVkZGFibGUgcGFnZXMgZ2V0IGVtYmVkZGVkLlxuICAgICAqXG4gICAgICogRW1iZWQgdGhpcyBlbWJlZGRhYmxlIHBhZ2UgaW4gaXRzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZW1iZWRkaW5nIGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkVtYmVkZGVkUGFnZS5wcm90b3R5cGUuZW1iZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMuYWxyZWFkeUVtYmVkZGVkKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRkZXIuZW1iZWRJbnRvQ29udGV4dCh0aGlzLmRvYy5jb250ZXh0LCB0aGlzLnJlZildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFscmVhZHlFbWJlZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5lbWJlZFBkZl1dIGFuZFxuICAgICAqID4gW1tQREZEb2N1bWVudC5lbWJlZFBhZ2VdXSBtZXRob2RzLCB3aGljaCB3aWxsIGNyZWF0ZSBpbnN0YW5jZXMgb2ZcbiAgICAgKiA+IFtbUERGRW1iZWRkZWRQYWdlXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkVtYmVkZGVkUGFnZV1dIGZyb20gYW4gZXhpc3RpbmcgcmVmIGFuZCBlbWJlZGRlclxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBlbWJlZGRlZCBwYWdlLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBlbWJlZGRlZCBwYWdlIHdpbGwgYmVsb25nLlxuICAgICAqIEBwYXJhbSBlbWJlZGRlciBUaGUgZW1iZWRkZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZW1iZWQgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGRW1iZWRkZWRQYWdlLm9mID0gZnVuY3Rpb24gKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkVtYmVkZGVkUGFnZShyZWYsIGRvYywgZW1iZWRkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkVtYmVkZGVkUGFnZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZFbWJlZGRlZFBhZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZFbWJlZGRlZFBhZ2UuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuL1BERkRvY3VtZW50XCI7XG5pbXBvcnQgeyBDdXN0b21Gb250RW1iZWRkZXIsIFBERlJlZiwgU3RhbmRhcmRGb250RW1iZWRkZXIsIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRPclVuZGVmaW5lZCB9IGZyb20gXCIuLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgZm9udCB0aGF0IGhhcyBiZWVuIGVtYmVkZGVkIGluIGEgW1tQREZEb2N1bWVudF1dLlxuICovXG52YXIgUERGRm9udCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZGb250KHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICB0aGlzLm1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgYXNzZXJ0SXMocmVmLCAncmVmJywgW1tQREZSZWYsICdQREZSZWYnXV0pO1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICBhc3NlcnRJcyhlbWJlZGRlciwgJ2VtYmVkZGVyJywgW1xuICAgICAgICAgICAgW0N1c3RvbUZvbnRFbWJlZGRlciwgJ0N1c3RvbUZvbnRFbWJlZGRlciddLFxuICAgICAgICAgICAgW1N0YW5kYXJkRm9udEVtYmVkZGVyLCAnU3RhbmRhcmRGb250RW1iZWRkZXInXSxcbiAgICAgICAgXSk7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5uYW1lID0gZW1iZWRkZXIuZm9udE5hbWU7XG4gICAgICAgIHRoaXMuZW1iZWRkZXIgPSBlbWJlZGRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlXG4gICAgICogPiBbW1BERlBhZ2UuZHJhd1RleHRdXSBtZXRob2Qgd2lsbCBhdXRvbWF0aWNhbGx5IGVuY29kZSB0aGUgdGV4dCBpdCBpc1xuICAgICAqID4gZ2l2ZW4uXG4gICAgICpcbiAgICAgKiBFbmNvZGVzIGEgc3RyaW5nIG9mIHRleHQgaW4gdGhpcyBmb250LlxuICAgICAqXG4gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgZW5jb2RlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgZW5jb2RlZCB0ZXh0IGFzIGEgaGV4IHN0cmluZy5cbiAgICAgKi9cbiAgICBQREZGb250LnByb3RvdHlwZS5lbmNvZGVUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgYXNzZXJ0SXModGV4dCwgJ3RleHQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdGhpcy5tb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVyLmVuY29kZVRleHQodGV4dCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNZWFzdXJlIHRoZSB3aWR0aCBvZiBhIHN0cmluZyBvZiB0ZXh0IGRyYXduIGluIHRoaXMgZm9udCBhdCBhIGdpdmVuIHNpemUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB3aWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUoJ0ZvbyBCYXIgUXV4IEJheicsIDM2KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBzdHJpbmcgb2YgdGV4dCB0byBiZSBtZWFzdXJlZC5cbiAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgZm9udCBzaXplIHRvIGJlIHVzZWQgZm9yIHRoaXMgbWVhc3VyZW1lbnQuXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIG9mIHRoZSBzdHJpbmcgb2YgdGV4dCB3aGVuIGRyYXduIGluIHRoaXMgZm9udCBhdCB0aGVcbiAgICAgKiAgICAgICAgICBnaXZlbiBzaXplLlxuICAgICAqL1xuICAgIFBERkZvbnQucHJvdG90eXBlLndpZHRoT2ZUZXh0QXRTaXplID0gZnVuY3Rpb24gKHRleHQsIHNpemUpIHtcbiAgICAgICAgYXNzZXJ0SXModGV4dCwgJ3RleHQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgYXNzZXJ0SXMoc2l6ZSwgJ3NpemUnLCBbJ251bWJlciddKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZXIud2lkdGhPZlRleHRBdFNpemUodGV4dCwgc2l6ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNZWFzdXJlIHRoZSBoZWlnaHQgb2YgdGhpcyBmb250IGF0IGEgZ2l2ZW4gc2l6ZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZSgyNClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBgb3B0aW9ucy5kZXNjZW5kZXJgIHZhbHVlIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBmb250J3NcbiAgICAgKiBkZXNjZW5kZXIgaXMgaW5jbHVkZWQgaW4gdGhlIGhlaWdodCBjYWxjdWxhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaXplIFRoZSBmb250IHNpemUgdG8gYmUgdXNlZCBmb3IgdGhpcyBtZWFzdXJlbWVudC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gY29tcHV0aW5nIHRoaXMgbWVhc3VyZW1lbnQuXG4gICAgICogQHJldHVybnMgVGhlIGhlaWdodCBvZiB0aGlzIGZvbnQgYXQgdGhlIGdpdmVuIHNpemUuXG4gICAgICovXG4gICAgUERGRm9udC5wcm90b3R5cGUuaGVpZ2h0QXRTaXplID0gZnVuY3Rpb24gKHNpemUsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBhc3NlcnRJcyhzaXplLCAnc2l6ZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVzY2VuZGVyLCAnb3B0aW9ucy5kZXNjZW5kZXInLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVyLmhlaWdodE9mRm9udEF0U2l6ZShzaXplLCB7XG4gICAgICAgICAgICBkZXNjZW5kZXI6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZXNjZW5kZXIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgZm9udCBzaXplIGF0IHdoaWNoIHRoaXMgZm9udCBpcyBhIGdpdmVuIGhlaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb250U2l6ZSA9IGZvbnQuc2l6ZUF0SGVpZ2h0KDEyKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCB0byBiZSB1c2VkIGZvciB0aGlzIGNhbGN1bGF0aW9uLlxuICAgICAqIEByZXR1cm5zIFRoZSBmb250IHNpemUgYXQgd2hpY2ggdGhpcyBmb250IGlzIHRoZSBnaXZlbiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGRm9udC5wcm90b3R5cGUuc2l6ZUF0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZXIuc2l6ZU9mRm9udEF0SGVpZ2h0KGhlaWdodCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNldCBvZiB1bmljb2RlIGNvZGUgcG9pbnRzIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9udC5cbiAgICAgKiBAcmV0dXJucyBUaGUgc2V0IG9mIHVuaWNvZGUgY29kZSBwb2ludHMgc3VwcG9ydGVkIGJ5IHRoaXMgZm9udC5cbiAgICAgKi9cbiAgICBQREZGb250LnByb3RvdHlwZS5nZXRDaGFyYWN0ZXJTZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmVtYmVkZGVyIGluc3RhbmNlb2YgU3RhbmRhcmRGb250RW1iZWRkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVyLmVuY29kaW5nLnN1cHBvcnRlZENvZGVQb2ludHM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlci5mb250LmNoYXJhY3RlclNldDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlXG4gICAgICogPiBbW1BERkRvY3VtZW50LnNhdmVdXSBhbmQgW1tQREZEb2N1bWVudC5zYXZlQXNCYXNlNjRdXSBtZXRob2RzIHdpbGxcbiAgICAgKiA+IGF1dG9tYXRpY2FsbHkgZW5zdXJlIGFsbCBmb250cyBnZXQgZW1iZWRkZWQuXG4gICAgICpcbiAgICAgKiBFbWJlZCB0aGlzIGZvbnQgaW4gaXRzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZW1iZWRkaW5nIGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkZvbnQucHJvdG90eXBlLmVtYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubW9kaWZpZWQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZGRlci5lbWJlZEludG9Db250ZXh0KHRoaXMuZG9jLmNvbnRleHQsIHRoaXMucmVmKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkRvY3VtZW50LmVtYmVkRm9udF1dIGFuZFxuICAgICAqID4gW1tQREZEb2N1bWVudC5lbWJlZFN0YW5kYXJkRm9udF1dIG1ldGhvZHMsIHdoaWNoIHdpbGwgY3JlYXRlIGluc3RhbmNlc1xuICAgICAqID4gb2YgW1tQREZGb250XV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkZvbnRdXSBmcm9tIGFuIGV4aXN0aW5nIHJlZiBhbmQgZW1iZWRkZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgZm9udC5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgZm9udCB3aWxsIGJlbG9uZy5cbiAgICAgKiBAcGFyYW0gZW1iZWRkZXIgVGhlIGVtYmVkZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVtYmVkIHRoZSBmb250LlxuICAgICAqL1xuICAgIFBERkZvbnQub2YgPSBmdW5jdGlvbiAocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRm9udChyZWYsIGRvYywgZW1iZWRkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkZvbnQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRm9udDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkZvbnQuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuL1BERkRvY3VtZW50XCI7XG5pbXBvcnQgeyBKcGVnRW1iZWRkZXIsIFBERlJlZiwgUG5nRW1iZWRkZXIgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbWFnZSB0aGF0IGhhcyBiZWVuIGVtYmVkZGVkIGluIGEgW1tQREZEb2N1bWVudF1dLlxuICovXG52YXIgUERGSW1hZ2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGSW1hZ2UocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIGFzc2VydElzKHJlZiwgJ3JlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZW1iZWRkZXIsICdlbWJlZGRlcicsIFtcbiAgICAgICAgICAgIFtKcGVnRW1iZWRkZXIsICdKcGVnRW1iZWRkZXInXSxcbiAgICAgICAgICAgIFtQbmdFbWJlZGRlciwgJ1BuZ0VtYmVkZGVyJ10sXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMud2lkdGggPSBlbWJlZGRlci53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBlbWJlZGRlci5oZWlnaHQ7XG4gICAgICAgIHRoaXMuZW1iZWRkZXIgPSBlbWJlZGRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGlzIGltYWdlIGFmdGVyIGJlaW5nIHNjYWxlZCBieSB0aGVcbiAgICAgKiBnaXZlbiBgZmFjdG9yYC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbWFnZS53aWR0aCAgLy8gPT4gNTAwXG4gICAgICogaW1hZ2UuaGVpZ2h0IC8vID0+IDI1MFxuICAgICAqXG4gICAgICogY29uc3Qgc2NhbGVkID0gaW1hZ2Uuc2NhbGUoMC41KVxuICAgICAqIHNjYWxlZC53aWR0aCAgLy8gPT4gMjUwXG4gICAgICogc2NhbGVkLmhlaWdodCAvLyA9PiAxMjVcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBvZnRlbiB1c2VmdWwgYmVmb3JlIGRyYXdpbmcgYW4gaW1hZ2Ugd2l0aFxuICAgICAqIFtbUERGUGFnZS5kcmF3SW1hZ2VdXSB0byBjb21wdXRlIHRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSBmYWN0b3IgVGhlIGZhY3RvciBieSB3aGljaCB0aGlzIGltYWdlIHNob3VsZCBiZSBzY2FsZWQuXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGltYWdlIGFmdGVyIGJlaW5nIHNjYWxlZC5cbiAgICAgKi9cbiAgICBQREZJbWFnZS5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAoZmFjdG9yKSB7XG4gICAgICAgIGFzc2VydElzKGZhY3RvciwgJ2ZhY3RvcicsIFsnbnVtYmVyJ10pO1xuICAgICAgICByZXR1cm4geyB3aWR0aDogdGhpcy53aWR0aCAqIGZhY3RvciwgaGVpZ2h0OiB0aGlzLmhlaWdodCAqIGZhY3RvciB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoaXMgaW1hZ2UgYWZ0ZXIgc2NhbGluZyBpdCBhcyBsYXJnZSBhc1xuICAgICAqIHBvc3NpYmxlIHdoaWxlIG1haW50YWluaW5nIGl0cyBhc3BlY3QgcmF0aW8gYW5kIG5vdCBleGNlZWRpbmcgdGhlXG4gICAgICogc3BlY2lmaWVkIGB3aWR0aGAgYW5kIGBoZWlnaHRgLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBcbiAgICAgKiBpbWFnZS53aWR0aCAgLy8gPT4gNTAwXG4gICAgICogaW1hZ2UuaGVpZ2h0IC8vID0+IDI1MFxuICAgICAqXG4gICAgICogY29uc3Qgc2NhbGVkID0gaW1hZ2Uuc2NhbGVUb0ZpdCg3NTAsIDEwMDApXG4gICAgICogc2NhbGVkLndpZHRoICAvLyA9PiA3NTBcbiAgICAgKiBzY2FsZWQuaGVpZ2h0IC8vID0+IDM3NVxuICAgICAqIGBgYFxuICAgICAqIFRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBwYXJhbWV0ZXJzIGNhbiBhbHNvIGJlIHRob3VnaHQgb2YgYXMgdGhlIHdpZHRoXG4gICAgICogYW5kIGhlaWdodCBvZiBhIGJveCB0aGF0IHRoZSBzY2FsZWQgaW1hZ2UgbXVzdCBmaXQgd2l0aGluLlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgYm91bmRpbmcgYm94J3Mgd2lkdGguXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgYm91bmRpbmcgYm94J3MgaGVpZ2h0LlxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbWFnZSBhZnRlciBiZWluZyBzY2FsZWQuXG4gICAgICovXG4gICAgUERGSW1hZ2UucHJvdG90eXBlLnNjYWxlVG9GaXQgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgaW1nV2lkdGhTY2FsZSA9IHdpZHRoIC8gdGhpcy53aWR0aDtcbiAgICAgICAgdmFyIGltZ0hlaWdodFNjYWxlID0gaGVpZ2h0IC8gdGhpcy5oZWlnaHQ7XG4gICAgICAgIHZhciBzY2FsZSA9IE1hdGgubWluKGltZ1dpZHRoU2NhbGUsIGltZ0hlaWdodFNjYWxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGUoc2NhbGUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoaXMgaW1hZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBpbWFnZS5zaXplKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgUERGSW1hZ2UucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlKDEpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlXG4gICAgICogPiBbW1BERkRvY3VtZW50LnNhdmVdXSBhbmQgW1tQREZEb2N1bWVudC5zYXZlQXNCYXNlNjRdXSBtZXRob2RzIHdpbGxcbiAgICAgKiA+IGF1dG9tYXRpY2FsbHkgZW5zdXJlIGFsbCBpbWFnZXMgZ2V0IGVtYmVkZGVkLlxuICAgICAqXG4gICAgICogRW1iZWQgdGhpcyBpbWFnZSBpbiBpdHMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aGVuIHRoZSBlbWJlZGRpbmcgaXMgY29tcGxldGUuXG4gICAgICovXG4gICAgUERGSW1hZ2UucHJvdG90eXBlLmVtYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIGRvYywgcmVmO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVtYmVkZGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbWFnZSBzaG91bGQgb25seSBiZSBlbWJlZGRlZCBvbmNlLiBJZiB0aGVyZSdzIGEgcGVuZGluZyBlbWJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0aW9uIHRoZW4gd2FpdCBvbiBpdC4gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gc3RhcnQgdGhlIGVtYmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVtYmVkVGFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGhpcywgZG9jID0gX2EuZG9jLCByZWYgPSBfYS5yZWY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWJlZFRhc2sgPSB0aGlzLmVtYmVkZGVyLmVtYmVkSW50b0NvbnRleHQoZG9jLmNvbnRleHQsIHJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkVGFza107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNsZWFyIGB0aGlzLmVtYmVkZGVyYCBzbyB0aGF0IHRoZSBpbmRpcmVjdGx5IHJlZmVyZW5jZWQgaW1hZ2UgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLCB0aHVzIGF2b2lkaW5nIGEgbWVtb3J5IGxlYWsuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0hvcGRpbmcvcGRmLWxpYi9wdWxsLzEwMzIvZmlsZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYmVkZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5lbWJlZFBuZ11dIGFuZCBbW1BERkRvY3VtZW50LmVtYmVkSnBnXV1cbiAgICAgKiA+IG1ldGhvZHMsIHdoaWNoIHdpbGwgY3JlYXRlIGluc3RhbmNlcyBvZiBbW1BERkltYWdlXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkltYWdlXV0gZnJvbSBhbiBleGlzdGluZyByZWYgYW5kIGVtYmVkZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIGltYWdlLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBpbWFnZSB3aWxsIGJlbG9uZy5cbiAgICAgKiBAcGFyYW0gZW1iZWRkZXIgVGhlIGVtYmVkZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVtYmVkIHRoZSBpbWFnZS5cbiAgICAgKi9cbiAgICBQREZJbWFnZS5vZiA9IGZ1bmN0aW9uIChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZJbWFnZShyZWYsIGRvYywgZW1iZWRkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkltYWdlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkltYWdlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGSW1hZ2UuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUERGTmFtZSwgUERGQXJyYXksIFBERkRpY3QsIFBERkhleFN0cmluZyB9IGZyb20gXCIuLi9jb3JlXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgSmF2YVNjcmlwdCB0aGF0IGhhcyBiZWVuIGVtYmVkZGVkIGluIGEgW1tQREZEb2N1bWVudF1dLlxuICovXG52YXIgUERGSmF2YVNjcmlwdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZKYXZhU2NyaXB0KHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICB0aGlzLmFscmVhZHlFbWJlZGRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuZW1iZWRkZXIgPSBlbWJlZGRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlXG4gICAgICogPiBbW1BERkRvY3VtZW50LnNhdmVdXSBhbmQgW1tQREZEb2N1bWVudC5zYXZlQXNCYXNlNjRdXSBtZXRob2RzIHdpbGxcbiAgICAgKiA+IGF1dG9tYXRpY2FsbHkgZW5zdXJlIGFsbCBKYXZhU2NyaXB0cyBnZXQgZW1iZWRkZWQuXG4gICAgICpcbiAgICAgKiBFbWJlZCB0aGlzIEphdmFTY3JpcHQgaW4gaXRzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgZW1iZWRkaW5nIGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkphdmFTY3JpcHQucHJvdG90eXBlLmVtYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIGNhdGFsb2csIGNvbnRleHQsIHJlZiwgTmFtZXMsIEphdmFzY3JpcHQsIEpTTmFtZXM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLmFscmVhZHlFbWJlZGRlZCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMuZG9jLCBjYXRhbG9nID0gX2EuY2F0YWxvZywgY29udGV4dCA9IF9hLmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkZGVyLmVtYmVkSW50b0NvbnRleHQodGhpcy5kb2MuY29udGV4dCwgdGhpcy5yZWYpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXRhbG9nLmhhcyhQREZOYW1lLm9mKCdOYW1lcycpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cuc2V0KFBERk5hbWUub2YoJ05hbWVzJyksIGNvbnRleHQub2JqKHt9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBOYW1lcyA9IGNhdGFsb2cubG9va3VwKFBERk5hbWUub2YoJ05hbWVzJyksIFBERkRpY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFOYW1lcy5oYXMoUERGTmFtZS5vZignSmF2YVNjcmlwdCcpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzLnNldChQREZOYW1lLm9mKCdKYXZhU2NyaXB0JyksIGNvbnRleHQub2JqKHt9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBKYXZhc2NyaXB0ID0gTmFtZXMubG9va3VwKFBERk5hbWUub2YoJ0phdmFTY3JpcHQnKSwgUERGRGljdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUphdmFzY3JpcHQuaGFzKFBERk5hbWUub2YoJ05hbWVzJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YXNjcmlwdC5zZXQoUERGTmFtZS5vZignTmFtZXMnKSwgY29udGV4dC5vYmooW10pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEpTTmFtZXMgPSBKYXZhc2NyaXB0Lmxvb2t1cChQREZOYW1lLm9mKCdOYW1lcycpLCBQREZBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBKU05hbWVzLnB1c2goUERGSGV4U3RyaW5nLmZyb21UZXh0KHRoaXMuZW1iZWRkZXIuc2NyaXB0TmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSlNOYW1lcy5wdXNoKHJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFscmVhZHlFbWJlZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5hZGRKYXZhU2NyaXB0XV0gbWV0aG9kLCB3aGljaCB3aWxsXG4gICAgICogY3JlYXRlIGluc3RhbmNlcyBvZiBbW1BERkphdmFTY3JpcHRdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGSmF2YVNjcmlwdF1dIGZyb20gYW4gZXhpc3RpbmcgcmVmIGFuZCBzY3JpcHRcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgc2NyaXB0LlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBzY3JpcHQgd2lsbCBiZWxvbmcuXG4gICAgICogQHBhcmFtIGVtYmVkZGVyIFRoZSBlbWJlZGRlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBlbWJlZCB0aGUgc2NyaXB0LlxuICAgICAqL1xuICAgIFBERkphdmFTY3JpcHQub2YgPSBmdW5jdGlvbiAocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGSmF2YVNjcmlwdChyZWYsIGRvYywgZW1iZWRkZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkphdmFTY3JpcHQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGSmF2YVNjcmlwdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkphdmFTY3JpcHQuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuL2NvbG9yc1wiO1xuaW1wb3J0IHsgZHJhd0ltYWdlLCBkcmF3TGluZSwgZHJhd0xpbmVzT2ZUZXh0LCBkcmF3UGFnZSwgZHJhd1JlY3RhbmdsZSwgZHJhd1N2Z1BhdGgsIGRyYXdFbGxpcHNlLCB9IGZyb20gXCIuL29wZXJhdGlvbnNcIjtcbmltcG9ydCB7IHBvcEdyYXBoaWNzU3RhdGUsIHB1c2hHcmFwaGljc1N0YXRlLCB0cmFuc2xhdGUsIExpbmVDYXBTdHlsZSwgc2NhbGUsIH0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgUERGRG9jdW1lbnQgZnJvbSBcIi4vUERGRG9jdW1lbnRcIjtcbmltcG9ydCBQREZFbWJlZGRlZFBhZ2UgZnJvbSBcIi4vUERGRW1iZWRkZWRQYWdlXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi9QREZGb250XCI7XG5pbXBvcnQgUERGSW1hZ2UgZnJvbSBcIi4vUERGSW1hZ2VcIjtcbmltcG9ydCB7IEJsZW5kTW9kZSwgfSBmcm9tIFwiLi9QREZQYWdlT3B0aW9uc1wiO1xuaW1wb3J0IHsgZGVncmVlcywgdG9EZWdyZWVzIH0gZnJvbSBcIi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEZvbnRzIH0gZnJvbSBcIi4vU3RhbmRhcmRGb250c1wiO1xuaW1wb3J0IHsgUERGQ29udGVudFN0cmVhbSwgUERGTmFtZSwgUERGT3BlcmF0b3IsIFBERlBhZ2VMZWFmLCBQREZSZWYsIFBERkRpY3QsIFBERkFycmF5LCB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRFYWNoSXMsIGFzc2VydElzLCBhc3NlcnRNdWx0aXBsZSwgYXNzZXJ0T3JVbmRlZmluZWQsIGJyZWFrVGV4dEludG9MaW5lcywgY2xlYW5UZXh0LCByZWN0YW5nbGVzQXJlRXF1YWwsIGxpbmVTcGxpdCwgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZCwgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkLCB9IGZyb20gXCIuLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2luZ2xlIHBhZ2Ugb2YgYSBbW1BERkRvY3VtZW50XV0uXG4gKi9cbnZhciBQREZQYWdlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERlBhZ2UobGVhZk5vZGUsIHJlZiwgZG9jKSB7XG4gICAgICAgIHRoaXMuZm9udFNpemUgPSAyNDtcbiAgICAgICAgdGhpcy5mb250Q29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIHRoaXMubGluZUhlaWdodCA9IDI0O1xuICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICB0aGlzLnkgPSAwO1xuICAgICAgICBhc3NlcnRJcyhsZWFmTm9kZSwgJ2xlYWZOb2RlJywgW1tQREZQYWdlTGVhZiwgJ1BERlBhZ2VMZWFmJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMocmVmLCAncmVmJywgW1tQREZSZWYsICdQREZSZWYnXV0pO1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICB0aGlzLm5vZGUgPSBsZWFmTm9kZTtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb3RhdGUgdGhpcyBwYWdlIGJ5IGEgbXVsdGlwbGUgb2YgOTAgZGVncmVlcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Um90YXRpb24oZGVncmVlcygtOTApKVxuICAgICAqIHBhZ2Uuc2V0Um90YXRpb24oZGVncmVlcygwKSlcbiAgICAgKiBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMoOTApKVxuICAgICAqIHBhZ2Uuc2V0Um90YXRpb24oZGVncmVlcygxODApKVxuICAgICAqIHBhZ2Uuc2V0Um90YXRpb24oZGVncmVlcygyNzApKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBhbmdsZSBUaGUgYW5nbGUgdG8gcm90YXRlIHRoaXMgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRSb3RhdGlvbiA9IGZ1bmN0aW9uIChhbmdsZSkge1xuICAgICAgICB2YXIgZGVncmVlc0FuZ2xlID0gdG9EZWdyZWVzKGFuZ2xlKTtcbiAgICAgICAgYXNzZXJ0TXVsdGlwbGUoZGVncmVlc0FuZ2xlLCAnZGVncmVlc0FuZ2xlJywgOTApO1xuICAgICAgICB0aGlzLm5vZGUuc2V0KFBERk5hbWUub2YoJ1JvdGF0ZScpLCB0aGlzLmRvYy5jb250ZXh0Lm9iaihkZWdyZWVzQW5nbGUpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIHBhZ2UncyByb3RhdGlvbiBhbmdsZSBpbiBkZWdyZWVzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJvdGF0aW9uQW5nbGUgPSBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGU7XG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSBwYWdlIGluIGRlZ3JlZXMgKGFsd2F5cyBhIG11bHRpcGxlIG9mXG4gICAgICogICAgICAgICAgOTAgZGVncmVlcykuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0Um90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBSb3RhdGUgPSB0aGlzLm5vZGUuUm90YXRlKCk7XG4gICAgICAgIHJldHVybiBkZWdyZWVzKFJvdGF0ZSA/IFJvdGF0ZS5hc051bWJlcigpIDogMCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhpcyBwYWdlIGJ5IGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyBpdHMgd2lkdGggYW5kIGhlaWdodC4gRm9yXG4gICAgICogZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2Uuc2V0U2l6ZSgyNTAsIDUwMClcbiAgICAgKiBwYWdlLnNldFNpemUocGFnZS5nZXRXaWR0aCgpICsgNTAsIHBhZ2UuZ2V0SGVpZ2h0KCkgKyAxMDApXG4gICAgICogcGFnZS5zZXRTaXplKHBhZ2UuZ2V0V2lkdGgoKSAtIDUwLCBwYWdlLmdldEhlaWdodCgpIC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBQREYgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBhbGxvdyBmb3IgcGFnZXMgdG8gaGF2ZSBleHBsaWNpdFxuICAgICAqIHdpZHRocyBhbmQgaGVpZ2h0cy4gSW5zdGVhZCBpdCBkZWZpbmVzIHRoZSBcInNpemVcIiBvZiBhIHBhZ2UgaW4gdGVybXMgb2ZcbiAgICAgKiBmaXZlIHJlY3RhbmdsZXM6IHRoZSBNZWRpYUJveCwgQ3JvcEJveCwgQmxlZWRCb3gsIFRyaW1Cb3gsIGFuZCBBcnRCb3guIEFzIGFcbiAgICAgKiByZXN1bHQsIHRoaXMgbWV0aG9kIGNhbm5vdCBkaXJlY3RseSBjaGFuZ2UgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgYSBwYWdlLlxuICAgICAqIEluc3RlYWQsIGl0IHdvcmtzIGJ5IGFkanVzdGluZyB0aGVzZSBmaXZlIGJveGVzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgICAgKiAgIDEuIFNldCB3aWR0aCAmIGhlaWdodCBvZiBNZWRpYUJveC5cbiAgICAgKiAgIDIuIFNldCB3aWR0aCAmIGhlaWdodCBvZiBDcm9wQm94LCBpZiBpdCBoYXMgc2FtZSBkaW1lbnNpb25zIGFzIE1lZGlhQm94LlxuICAgICAqICAgMy4gU2V0IHdpZHRoICYgaGVpZ2h0IG9mIEJsZWVkQm94LCBpZiBpdCBoYXMgc2FtZSBkaW1lbnNpb25zIGFzIE1lZGlhQm94LlxuICAgICAqICAgNC4gU2V0IHdpZHRoICYgaGVpZ2h0IG9mIFRyaW1Cb3gsIGlmIGl0IGhhcyBzYW1lIGRpbWVuc2lvbnMgYXMgTWVkaWFCb3guXG4gICAgICogICA1LiBTZXQgd2lkdGggJiBoZWlnaHQgb2YgQXJ0Qm94LCBpZiBpdCBoYXMgc2FtZSBkaW1lbnNpb25zIGFzIE1lZGlhQm94LlxuICAgICAqXG4gICAgICogVGhpcyBhcHByb2FjaCB3b3JrcyB3ZWxsIGZvciBtb3N0IFBERiBkb2N1bWVudHMgYXMgYWxsIFBERiBwYWdlcyBtdXN0XG4gICAgICogaGF2ZSBhIE1lZGlhQm94LCBidXQgcmVsYXRpdmVseSBmZXcgaGF2ZSBhIENyb3BCb3gsIEJsZWVkQm94LCBUcmltQm94LCBvclxuICAgICAqIEFydEJveC4gQW5kIHdoZW4gdGhleSBkbyBoYXZlIHRoZXNlIGFkZGl0aW9uYWwgYm94ZXMsIHRoZXkgb2Z0ZW4gaGF2ZSB0aGVcbiAgICAgKiBzYW1lIGRpbWVuc2lvbnMgYXMgdGhlIE1lZGlhQm94LiBIb3dldmVyLCBpZiB5b3UgZmluZCB0aGlzIG1ldGhvZCBkb2VzIG5vdFxuICAgICAqIHdvcmsgZm9yIHlvdXIgZG9jdW1lbnQsIGNvbnNpZGVyIHNldHRpbmcgdGhlIGJveGVzIGRpcmVjdGx5OlxuICAgICAqICAgKiBbW1BERlBhZ2Uuc2V0TWVkaWFCb3hdXVxuICAgICAqICAgKiBbW1BERlBhZ2Uuc2V0Q3JvcEJveF1dXG4gICAgICogICAqIFtbUERGUGFnZS5zZXRCbGVlZEJveF1dXG4gICAgICogICAqIFtbUERGUGFnZS5zZXRUcmltQm94XV1cbiAgICAgKiAgICogW1tQREZQYWdlLnNldEFydEJveF1dXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIG5ldyB3aWR0aCBvZiB0aGUgcGFnZS5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBuZXcgaGVpZ2h0IG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldFNpemUgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgbWVkaWFCb3ggPSB0aGlzLmdldE1lZGlhQm94KCk7XG4gICAgICAgIHRoaXMuc2V0TWVkaWFCb3gobWVkaWFCb3gueCwgbWVkaWFCb3gueSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHZhciBjcm9wQm94ID0gdGhpcy5nZXRDcm9wQm94KCk7XG4gICAgICAgIHZhciBibGVlZEJveCA9IHRoaXMuZ2V0QmxlZWRCb3goKTtcbiAgICAgICAgdmFyIHRyaW1Cb3ggPSB0aGlzLmdldFRyaW1Cb3goKTtcbiAgICAgICAgdmFyIGFydEJveCA9IHRoaXMuZ2V0QXJ0Qm94KCk7XG4gICAgICAgIHZhciBoYXNDcm9wQm94ID0gdGhpcy5ub2RlLkNyb3BCb3goKTtcbiAgICAgICAgdmFyIGhhc0JsZWVkQm94ID0gdGhpcy5ub2RlLkJsZWVkQm94KCk7XG4gICAgICAgIHZhciBoYXNUcmltQm94ID0gdGhpcy5ub2RlLlRyaW1Cb3goKTtcbiAgICAgICAgdmFyIGhhc0FydEJveCA9IHRoaXMubm9kZS5BcnRCb3goKTtcbiAgICAgICAgaWYgKGhhc0Nyb3BCb3ggJiYgcmVjdGFuZ2xlc0FyZUVxdWFsKGNyb3BCb3gsIG1lZGlhQm94KSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDcm9wQm94KG1lZGlhQm94LngsIG1lZGlhQm94LnksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNCbGVlZEJveCAmJiByZWN0YW5nbGVzQXJlRXF1YWwoYmxlZWRCb3gsIG1lZGlhQm94KSkge1xuICAgICAgICAgICAgdGhpcy5zZXRCbGVlZEJveChtZWRpYUJveC54LCBtZWRpYUJveC55LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzVHJpbUJveCAmJiByZWN0YW5nbGVzQXJlRXF1YWwodHJpbUJveCwgbWVkaWFCb3gpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFRyaW1Cb3gobWVkaWFCb3gueCwgbWVkaWFCb3gueSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0FydEJveCAmJiByZWN0YW5nbGVzQXJlRXF1YWwoYXJ0Qm94LCBtZWRpYUJveCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QXJ0Qm94KG1lZGlhQm94LngsIG1lZGlhQm94LnksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhpcyBwYWdlIGJ5IGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyBpdHMgd2lkdGguIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5zZXRXaWR0aCgyNTApXG4gICAgICogcGFnZS5zZXRXaWR0aChwYWdlLmdldFdpZHRoKCkgKyA1MClcbiAgICAgKiBwYWdlLnNldFdpZHRoKHBhZ2UuZ2V0V2lkdGgoKSAtIDUwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgdXNlcyBbW1BERlBhZ2Uuc2V0U2l6ZV1dIHRvIHNldCB0aGUgcGFnZSdzIHdpZHRoLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSBuZXcgd2lkdGggb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbiAod2lkdGgpIHtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIHRoaXMuZ2V0U2l6ZSgpLmhlaWdodCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhpcyBwYWdlIGJ5IGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyBpdHMgaGVpZ2h0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2Uuc2V0SGVpZ2h0KDUwMClcbiAgICAgKiBwYWdlLnNldEhlaWdodChwYWdlLmdldFdpZHRoKCkgKyAxMDApXG4gICAgICogcGFnZS5zZXRIZWlnaHQocGFnZS5nZXRXaWR0aCgpIC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgdXNlcyBbW1BERlBhZ2Uuc2V0U2l6ZV1dIHRvIHNldCB0aGUgcGFnZSdzIGhlaWdodC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIG5ldyBoZWlnaHQgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5zZXRTaXplKHRoaXMuZ2V0U2l6ZSgpLndpZHRoLCBoZWlnaHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBNZWRpYUJveCBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgbWVkaWFCb3ggPSBwYWdlLmdldE1lZGlhQm94KClcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0TWVkaWFCb3goMCwgMCwgMjUwLCA1MDApXG4gICAgICogcGFnZS5zZXRNZWRpYUJveChtZWRpYUJveC54LCBtZWRpYUJveC55LCA1MCwgMTAwKVxuICAgICAqIHBhZ2Uuc2V0TWVkaWFCb3goMTUsIDUsIG1lZGlhQm94LndpZHRoIC0gNTAsIG1lZGlhQm94LmhlaWdodCAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBbW1BERlBhZ2UuZ2V0TWVkaWFCb3hdXSBmb3IgZGV0YWlscyBhYm91dCB3aGF0IHRoZSBNZWRpYUJveCByZXByZXNlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBNZWRpYUJveC5cbiAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IE1lZGlhQm94LlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG5ldyBNZWRpYUJveC5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIG5ldyBNZWRpYUJveC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRNZWRpYUJveCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBtZWRpYUJveCA9IHRoaXMuZG9jLmNvbnRleHQub2JqKFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdKTtcbiAgICAgICAgdGhpcy5ub2RlLnNldChQREZOYW1lLk1lZGlhQm94LCBtZWRpYUJveCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIENyb3BCb3ggb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNyb3BCb3ggPSBwYWdlLmdldENyb3BCb3goKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRDcm9wQm94KDAsIDAsIDI1MCwgNTAwKVxuICAgICAqIHBhZ2Uuc2V0Q3JvcEJveChjcm9wQm94LngsIGNyb3BCb3gueSwgNTAsIDEwMClcbiAgICAgKiBwYWdlLnNldENyb3BCb3goMTUsIDUsIGNyb3BCb3gud2lkdGggLSA1MCwgY3JvcEJveC5oZWlnaHQgLSAxMDApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTZWUgW1tQREZQYWdlLmdldENyb3BCb3hdXSBmb3IgZGV0YWlscyBhYm91dCB3aGF0IHRoZSBDcm9wQm94IHJlcHJlc2VudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IENyb3BCb3guXG4gICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBDcm9wQm94LlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG5ldyBDcm9wQm94LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbmV3IENyb3BCb3guXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0Q3JvcEJveCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBjcm9wQm94ID0gdGhpcy5kb2MuY29udGV4dC5vYmooW3gsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodF0pO1xuICAgICAgICB0aGlzLm5vZGUuc2V0KFBERk5hbWUuQ3JvcEJveCwgY3JvcEJveCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIEJsZWVkQm94IG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBibGVlZEJveCA9IHBhZ2UuZ2V0QmxlZWRCb3goKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRCbGVlZEJveCgwLCAwLCAyNTAsIDUwMClcbiAgICAgKiBwYWdlLnNldEJsZWVkQm94KGJsZWVkQm94LngsIGJsZWVkQm94LnksIDUwLCAxMDApXG4gICAgICogcGFnZS5zZXRCbGVlZEJveCgxNSwgNSwgYmxlZWRCb3gud2lkdGggLSA1MCwgYmxlZWRCb3guaGVpZ2h0IC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2VlIFtbUERGUGFnZS5nZXRCbGVlZEJveF1dIGZvciBkZXRhaWxzIGFib3V0IHdoYXQgdGhlIEJsZWVkQm94IHJlcHJlc2VudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IEJsZWVkQm94LlxuICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgQmxlZWRCb3guXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgbmV3IEJsZWVkQm94LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbmV3IEJsZWVkQm94LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEJsZWVkQm94ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIGJsZWVkQm94ID0gdGhpcy5kb2MuY29udGV4dC5vYmooW3gsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodF0pO1xuICAgICAgICB0aGlzLm5vZGUuc2V0KFBERk5hbWUuQmxlZWRCb3gsIGJsZWVkQm94KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgVHJpbUJveCBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdHJpbUJveCA9IHBhZ2UuZ2V0VHJpbUJveCgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldFRyaW1Cb3goMCwgMCwgMjUwLCA1MDApXG4gICAgICogcGFnZS5zZXRUcmltQm94KHRyaW1Cb3gueCwgdHJpbUJveC55LCA1MCwgMTAwKVxuICAgICAqIHBhZ2Uuc2V0VHJpbUJveCgxNSwgNSwgdHJpbUJveC53aWR0aCAtIDUwLCB0cmltQm94LmhlaWdodCAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBbW1BERlBhZ2UuZ2V0VHJpbUJveF1dIGZvciBkZXRhaWxzIGFib3V0IHdoYXQgdGhlIFRyaW1Cb3ggcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgVHJpbUJveC5cbiAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IFRyaW1Cb3guXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgbmV3IFRyaW1Cb3guXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBuZXcgVHJpbUJveC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRUcmltQm94ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIHRyaW1Cb3ggPSB0aGlzLmRvYy5jb250ZXh0Lm9iaihbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSk7XG4gICAgICAgIHRoaXMubm9kZS5zZXQoUERGTmFtZS5UcmltQm94LCB0cmltQm94KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgQXJ0Qm94IG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBhcnRCb3ggPSBwYWdlLmdldEFydEJveCgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEFydEJveCgwLCAwLCAyNTAsIDUwMClcbiAgICAgKiBwYWdlLnNldEFydEJveChhcnRCb3gueCwgYXJ0Qm94LnksIDUwLCAxMDApXG4gICAgICogcGFnZS5zZXRBcnRCb3goMTUsIDUsIGFydEJveC53aWR0aCAtIDUwLCBhcnRCb3guaGVpZ2h0IC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2VlIFtbUERGUGFnZS5nZXRBcnRCb3hdXSBmb3IgZGV0YWlscyBhYm91dCB3aGF0IHRoZSBBcnRCb3ggcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgQXJ0Qm94LlxuICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgQXJ0Qm94LlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG5ldyBBcnRCb3guXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBuZXcgQXJ0Qm94LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEFydEJveCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBhcnRCb3ggPSB0aGlzLmRvYy5jb250ZXh0Lm9iaihbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSk7XG4gICAgICAgIHRoaXMubm9kZS5zZXQoUERGTmFtZS5BcnRCb3gsIGFydEJveCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBwYWdlJ3Mgd2lkdGggYW5kIGhlaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHBhZ2UuZ2V0U2l6ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIFtbUERGUGFnZS5nZXRNZWRpYUJveF1dIHRvIG9idGFpbiB0aGUgcGFnZSdzXG4gICAgICogd2lkdGggYW5kIGhlaWdodC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0TWVkaWFCb3goKSwgd2lkdGggPSBfYS53aWR0aCwgaGVpZ2h0ID0gX2EuaGVpZ2h0O1xuICAgICAgICByZXR1cm4geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBwYWdlJ3Mgd2lkdGguIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgd2lkdGggPSBwYWdlLmdldFdpZHRoKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgW1tQREZQYWdlLmdldFNpemVdXSB0byBvYnRhaW4gdGhlIHBhZ2UncyBzaXplLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTaXplKCkud2lkdGg7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBwYWdlJ3MgaGVpZ2h0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlaWdodCA9IHBhZ2UuZ2V0SGVpZ2h0KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgW1tQREZQYWdlLmdldFNpemVdXSB0byBvYnRhaW4gdGhlIHBhZ2UncyBzaXplLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGhlaWdodCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNpemUoKS5oZWlnaHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlY3RhbmdsZSBkZWZpbmluZyB0aGlzIHBhZ2UncyBNZWRpYUJveC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHBhZ2UuZ2V0TWVkaWFCb3goKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIE1lZGlhQm94IG9mIGEgcGFnZSBkZWZpbmVzIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBwaHlzaWNhbCBtZWRpdW0gb25cbiAgICAgKiB3aGljaCB0aGUgcGFnZSBpcyB0byBiZSBkaXNwbGF5ZWQvcHJpbnRlZC4gSXQgbWF5IGluY2x1ZGUgZXh0ZW5kZWQgYXJlYVxuICAgICAqIHN1cnJvdW5kaW5nIHRoZSBwYWdlIGNvbnRlbnQgZm9yIGJsZWVkIG1hcmtzLCBwcmludGluZyBtYXJrcywgZXRjLi4uXG4gICAgICogSXQgbWF5IGFsc28gaW5jbHVkZSBhcmVhcyBjbG9zZSB0byB0aGUgZWRnZXMgb2YgdGhlIG1lZGl1bSB0aGF0IGNhbm5vdCBiZVxuICAgICAqIG1hcmtlZCBiZWNhdXNlIG9mIHBoeXNpY2FsIGxpbWl0YXRpb25zIG9mIHRoZSBvdXRwdXQgZGV2aWNlLiBDb250ZW50XG4gICAgICogZmFsbGluZyBvdXRzaWRlIHRoaXMgYm91bmRhcnkgbWF5IHNhZmVseSBiZSBkaXNjYXJkZWQgd2l0aG91dCBhZmZlY3RpbmdcbiAgICAgKiB0aGUgbWVhbmluZyBvZiB0aGUgUERGIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBNZWRpYUJveCBhbmQgaXRzXG4gICAgICogICAgICAgICAgd2lkdGggJiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0TWVkaWFCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtZWRpYUJveCA9IHRoaXMubm9kZS5NZWRpYUJveCgpO1xuICAgICAgICByZXR1cm4gbWVkaWFCb3guYXNSZWN0YW5nbGUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmVjdGFuZ2xlIGRlZmluaW5nIHRoaXMgcGFnZSdzIENyb3BCb3guIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldENyb3BCb3goKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIENyb3BCb3ggb2YgYSBwYWdlIGRlZmluZXMgdGhlIHJlZ2lvbiB0byB3aGljaCB0aGUgY29udGVudHMgb2YgdGhlIHBhZ2VcbiAgICAgKiBzaGFsbCBiZSBjbGlwcGVkIHdoZW4gZGlzcGxheWVkIG9yIHByaW50ZWQuIFVubGlrZSB0aGUgb3RoZXIgYm94ZXMsIHRoZVxuICAgICAqIENyb3BCb3ggZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVwcmVzZW50IHRoZSBwaHlzaWNhbCBwYWdlIGdlb21ldHJ5LiBJdFxuICAgICAqIG1lcmVseSBpbXBvc2VzIGNsaXBwaW5nIG9uIHRoZSBwYWdlIGNvbnRlbnRzLlxuICAgICAqXG4gICAgICogVGhlIENyb3BCb3gncyBkZWZhdWx0IHZhbHVlIGlzIHRoZSBwYWdlJ3MgTWVkaWFCb3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBDcm9wQm94IGFuZCBpdHNcbiAgICAgKiAgICAgICAgICB3aWR0aCAmIGhlaWdodC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRDcm9wQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBjcm9wQm94ID0gdGhpcy5ub2RlLkNyb3BCb3goKTtcbiAgICAgICAgcmV0dXJuIChfYSA9IGNyb3BCb3ggPT09IG51bGwgfHwgY3JvcEJveCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3JvcEJveC5hc1JlY3RhbmdsZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmdldE1lZGlhQm94KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJlY3RhbmdsZSBkZWZpbmluZyB0aGlzIHBhZ2UncyBCbGVlZEJveC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHBhZ2UuZ2V0QmxlZWRCb3goKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIEJsZWVkQm94IG9mIGEgcGFnZSBkZWZpbmVzIHRoZSByZWdpb24gdG8gd2hpY2ggdGhlIGNvbnRlbnRzIG9mIHRoZVxuICAgICAqIHBhZ2Ugc2hhbGwgYmUgY2xpcHBlZCB3aGVuIG91dHB1dCBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuIFRoaXMgbWF5XG4gICAgICogaW5jbHVkZSBhbnkgZXh0cmEgYmxlZWQgYXJlYSBuZWVkZWQgdG8gYWNjb21tb2RhdGUgdGhlIHBoeXNpY2FsXG4gICAgICogbGltaXRhdGlvbnMgb2YgY3V0dGluZywgZm9sZGluZywgYW5kIHRyaW1taW5nIGVxdWlwbWVudC4gVGhlIGFjdHVhbFxuICAgICAqIHByaW50ZWQgcGFnZSBtYXkgaW5jbHVkZSBwcmludGluZyBtYXJrcyB0aGF0IGZhbGwgb3V0c2lkZSB0aGUgQmxlZWRCb3guXG4gICAgICpcbiAgICAgKiBUaGUgQmxlZWRCb3gncyBkZWZhdWx0IHZhbHVlIGlzIHRoZSBwYWdlJ3MgQ3JvcEJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBkZWZpbmluZyB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIEJsZWVkQm94IGFuZCBpdHNcbiAgICAgKiAgICAgICAgICB3aWR0aCAmIGhlaWdodC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRCbGVlZEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYmxlZWRCb3ggPSB0aGlzLm5vZGUuQmxlZWRCb3goKTtcbiAgICAgICAgcmV0dXJuIChfYSA9IGJsZWVkQm94ID09PSBudWxsIHx8IGJsZWVkQm94ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBibGVlZEJveC5hc1JlY3RhbmdsZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmdldENyb3BCb3goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmVjdGFuZ2xlIGRlZmluaW5nIHRoaXMgcGFnZSdzIFRyaW1Cb3guIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBwYWdlLmdldFRyaW1Cb3goKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIFRyaW1Cb3ggb2YgYSBwYWdlIGRlZmluZXMgdGhlIGludGVuZGVkIGRpbWVuc2lvbnMgb2YgdGhlIGZpbmlzaGVkXG4gICAgICogcGFnZSBhZnRlciB0cmltbWluZy4gSXQgbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgTWVkaWFCb3ggdG8gYWxsb3cgZm9yXG4gICAgICogcHJvZHVjdGlvbi1yZWxhdGVkIGNvbnRlbnQsIHN1Y2ggYXMgcHJpbnRpbmcgaW5zdHJ1Y3Rpb25zLCBjdXQgbWFya3MsIG9yXG4gICAgICogY29sb3IgYmFycy5cbiAgICAgKlxuICAgICAqIFRoZSBUcmltQm94J3MgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgcGFnZSdzIENyb3BCb3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBvYmplY3QgZGVmaW5pbmcgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBUcmltQm94IGFuZCBpdHNcbiAgICAgKiAgICAgICAgICB3aWR0aCAmIGhlaWdodC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRUcmltQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0cmltQm94ID0gdGhpcy5ub2RlLlRyaW1Cb3goKTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRyaW1Cb3ggPT09IG51bGwgfHwgdHJpbUJveCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdHJpbUJveC5hc1JlY3RhbmdsZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmdldENyb3BCb3goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmVjdGFuZ2xlIGRlZmluaW5nIHRoaXMgcGFnZSdzIEFydEJveC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHBhZ2UuZ2V0QXJ0Qm94KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBBcnRCb3ggb2YgYSBwYWdlIGRlZmluZXMgdGhlIGV4dGVudCBvZiB0aGUgcGFnZSdzIG1lYW5pbmdmdWwgY29udGVudFxuICAgICAqIChpbmNsdWRpbmcgcG90ZW50aWFsIHdoaXRlIHNwYWNlKS5cbiAgICAgKlxuICAgICAqIFRoZSBBcnRCb3gncyBkZWZhdWx0IHZhbHVlIGlzIHRoZSBwYWdlJ3MgQ3JvcEJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBkZWZpbmluZyB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIEFydEJveCBhbmQgaXRzXG4gICAgICogICAgICAgICAgd2lkdGggJiBoZWlnaHQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0QXJ0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBhcnRCb3ggPSB0aGlzLm5vZGUuQXJ0Qm94KCk7XG4gICAgICAgIHJldHVybiAoX2EgPSBhcnRCb3ggPT09IG51bGwgfHwgYXJ0Qm94ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcnRCb3guYXNSZWN0YW5nbGUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5nZXRDcm9wQm94KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUcmFuc2xhdGUgdGhpcyBwYWdlJ3MgY29udGVudCB0byBhIG5ldyBsb2NhdGlvbiBvbiB0aGUgcGFnZS4gVGhpcyBvcGVyYXRpb25cbiAgICAgKiBpcyBvZnRlbiB1c2VmdWwgYWZ0ZXIgcmVzaXppbmcgdGhlIHBhZ2Ugd2l0aCBbW3NldFNpemVdXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBBZGQgNTAgdW5pdHMgb2Ygd2hpdGVzcGFjZSB0byB0aGUgdG9wIGFuZCByaWdodCBvZiB0aGUgcGFnZVxuICAgICAqIHBhZ2Uuc2V0U2l6ZShwYWdlLmdldFdpZHRoKCkgKyA1MCwgcGFnZS5nZXRIZWlnaHQoKSArIDUwKVxuICAgICAqXG4gICAgICogLy8gTW92ZSB0aGUgcGFnZSdzIGNvbnRlbnQgZnJvbSB0aGUgbG93ZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBhZ2VcbiAgICAgKiAvLyB0byB0aGUgdG9wLXJpZ2h0IGNvcm5lci5cbiAgICAgKiBwYWdlLnRyYW5zbGF0ZUNvbnRlbnQoNTAsIDUwKVxuICAgICAqXG4gICAgICogLy8gTm93IHRoZXJlIGFyZSA1MCB1bml0cyBvZiB3aGl0ZXNwYWNlIHRvIHRoZSBsZWZ0IGFuZCBib3R0b20gb2YgdGhlIHBhZ2VcbiAgICAgKiBgYGBcbiAgICAgKiBTZWUgYWxzbzogW1tyZXNldFBvc2l0aW9uXV1cbiAgICAgKiBAcGFyYW0geCBUaGUgbmV3IHBvc2l0aW9uIG9uIHRoZSB4LWF4aXMgZm9yIHRoaXMgcGFnZSdzIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIHkgVGhlIG5ldyBwb3NpdGlvbiBvbiB0aGUgeS1heGlzIGZvciB0aGlzIHBhZ2UncyBjb250ZW50LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnRyYW5zbGF0ZUNvbnRlbnQgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLm5vZGUubm9ybWFsaXplKCk7XG4gICAgICAgIHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmNyZWF0ZUNvbnRlbnRTdHJlYW0ocHVzaEdyYXBoaWNzU3RhdGUoKSwgdHJhbnNsYXRlKHgsIHkpKTtcbiAgICAgICAgdmFyIHN0YXJ0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3RlcihzdGFydCk7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLmNyZWF0ZUNvbnRlbnRTdHJlYW0ocG9wR3JhcGhpY3NTdGF0ZSgpKTtcbiAgICAgICAgdmFyIGVuZFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIoZW5kKTtcbiAgICAgICAgdGhpcy5ub2RlLndyYXBDb250ZW50U3RyZWFtcyhzdGFydFJlZiwgZW5kUmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBzaXplLCBjb250ZW50LCBhbmQgYW5ub3RhdGlvbnMgb2YgYSBwYWdlLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLnNjYWxlKDAuNSwgMC41KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhlIHdpZHRoIGZvciB0aGUgcGFnZSBzaG91bGQgYmUgc2NhbGVkXG4gICAgICogICAgICAgICAgKGUuZy4gYDAuNWAgaXMgNTAlKS5cbiAgICAgKiBAcGFyYW0geSBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoZSBoZWlnaHQgZm9yIHRoZSBwYWdlIHNob3VsZCBiZSBzY2FsZWRcbiAgICAgKiAgICAgICAgICAoZS5nLiBgMi4wYCBpcyAyMDAlKS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zY2FsZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMuc2V0U2l6ZSh0aGlzLmdldFdpZHRoKCkgKiB4LCB0aGlzLmdldEhlaWdodCgpICogeSk7XG4gICAgICAgIHRoaXMuc2NhbGVDb250ZW50KHgsIHkpO1xuICAgICAgICB0aGlzLnNjYWxlQW5ub3RhdGlvbnMoeCwgeSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTY2FsZSB0aGUgY29udGVudCBvZiBhIHBhZ2UuIFRoaXMgaXMgdXNlZnVsIGFmdGVyIHJlc2l6aW5nIGFuIGV4aXN0aW5nXG4gICAgICogcGFnZS4gVGhpcyBzY2FsZXMgb25seSB0aGUgY29udGVudCwgbm90IHRoZSBhbm5vdGF0aW9ucy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gQmlzZWN0IHRoZSBzaXplIG9mIHRoZSBwYWdlXG4gICAgICogcGFnZS5zZXRTaXplKHBhZ2UuZ2V0V2lkdGgoKSAvIDIsIHBhZ2UuZ2V0SGVpZ2h0KCkgLyAyKTtcbiAgICAgKlxuICAgICAqIC8vIFNjYWxlIHRoZSBjb250ZW50IG9mIHRoZSBwYWdlIGRvd24gYnkgNTAlIGluIHggYW5kIHlcbiAgICAgKiBwYWdlLnNjYWxlQ29udGVudCgwLjUsIDAuNSk7XG4gICAgICogYGBgXG4gICAgICogU2VlIGFsc286IFtbc2NhbGVBbm5vdGF0aW9uc11dXG4gICAgICogQHBhcmFtIHggVGhlIGZhY3RvciBieSB3aGljaCB0aGUgeC1heGlzIGZvciB0aGUgY29udGVudCBzaG91bGQgYmUgc2NhbGVkXG4gICAgICogICAgICAgICAgKGUuZy4gYDAuNWAgaXMgNTAlKS5cbiAgICAgKiBAcGFyYW0geSBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoZSB5LWF4aXMgZm9yIHRoZSBjb250ZW50IHNob3VsZCBiZSBzY2FsZWRcbiAgICAgKiAgICAgICAgICAoZS5nLiBgMi4wYCBpcyAyMDAlKS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zY2FsZUNvbnRlbnQgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLm5vZGUubm9ybWFsaXplKCk7XG4gICAgICAgIHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmNyZWF0ZUNvbnRlbnRTdHJlYW0ocHVzaEdyYXBoaWNzU3RhdGUoKSwgc2NhbGUoeCwgeSkpO1xuICAgICAgICB2YXIgc3RhcnRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHN0YXJ0KTtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMuY3JlYXRlQ29udGVudFN0cmVhbShwb3BHcmFwaGljc1N0YXRlKCkpO1xuICAgICAgICB2YXIgZW5kUmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3RlcihlbmQpO1xuICAgICAgICB0aGlzLm5vZGUud3JhcENvbnRlbnRTdHJlYW1zKHN0YXJ0UmVmLCBlbmRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIGFubm90YXRpb25zIG9mIGEgcGFnZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gc2NhbGUgYVxuICAgICAqIHBhZ2Ugd2l0aCBjb21tZW50cyBvciBvdGhlciBhbm5vdGF0aW9ucy5cbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIFNjYWxlIHRoZSBjb250ZW50IG9mIHRoZSBwYWdlIGRvd24gYnkgNTAlIGluIHggYW5kIHlcbiAgICAgKiBwYWdlLnNjYWxlQ29udGVudCgwLjUsIDAuNSk7XG4gICAgICpcbiAgICAgKiAvLyBTY2FsZSB0aGUgY29udGVudCBvZiB0aGUgcGFnZSBkb3duIGJ5IDUwJSBpbiB4IGFuZCB5XG4gICAgICogcGFnZS5zY2FsZUFubm90YXRpb25zKDAuNSwgMC41KTtcbiAgICAgKiBgYGBcbiAgICAgKiBTZWUgYWxzbzogW1tzY2FsZUNvbnRlbnRdXVxuICAgICAqIEBwYXJhbSB4IFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhlIHgtYXhpcyBmb3IgdGhlIGFubm90YXRpb25zIHNob3VsZCBiZVxuICAgICAqICAgICAgICAgIHNjYWxlZCAoZS5nLiBgMC41YCBpcyA1MCUpLlxuICAgICAqIEBwYXJhbSB5IFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhlIHktYXhpcyBmb3IgdGhlIGFubm90YXRpb25zIHNob3VsZCBiZVxuICAgICAqICAgICAgICAgIHNjYWxlZCAoZS5nLiBgMi4wYCBpcyAyMDAlKS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zY2FsZUFubm90YXRpb25zID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIGFubm90cyA9IHRoaXMubm9kZS5Bbm5vdHMoKTtcbiAgICAgICAgaWYgKCFhbm5vdHMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGFubm90cy5zaXplKCk7IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgYW5ub3QgPSBhbm5vdHMubG9va3VwKGlkeCk7XG4gICAgICAgICAgICBpZiAoYW5ub3QgaW5zdGFuY2VvZiBQREZEaWN0KVxuICAgICAgICAgICAgICAgIHRoaXMuc2NhbGVBbm5vdChhbm5vdCwgeCwgeSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIG9mIHRoaXMgcGFnZSB0byBgKDAsIDApYC4gVGhpcyBvcGVyYXRpb24gaXNcbiAgICAgKiBvZnRlbiB1c2VmdWwgYWZ0ZXIgY2FsbGluZyBbW3RyYW5zbGF0ZUNvbnRlbnRdXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBTaGlmdCB0aGUgcGFnZSdzIGNvbnRlbnRzIHVwIGFuZCB0byB0aGUgcmlnaHQgYnkgNTAgdW5pdHNcbiAgICAgKiBwYWdlLnRyYW5zbGF0ZUNvbnRlbnQoNTAsIDUwKVxuICAgICAqXG4gICAgICogLy8gVGhpcyB0ZXh0IHdpbGwgc2hpZnRlZCAtIGl0IHdpbGwgYmUgZHJhd24gYXQgKDUwLCA1MClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIGFtIHNoaWZ0ZWQnKVxuICAgICAqXG4gICAgICogLy8gTW92ZSBiYWNrIHRvICgwLCAwKVxuICAgICAqIHBhZ2UucmVzZXRQb3NpdGlvbigpXG4gICAgICpcbiAgICAgKiAvLyBUaGlzIHRleHQgd2lsbCBub3QgYmUgc2hpZnRlZCAtIGl0IHdpbGwgYmUgZHJhd24gYXQgKDAsIDApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSBhbSBub3Qgc2hpZnRlZCcpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUucmVzZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5nZXRDb250ZW50U3RyZWFtKGZhbHNlKTtcbiAgICAgICAgdGhpcy54ID0gMDtcbiAgICAgICAgdGhpcy55ID0gMDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSBhIGRlZmF1bHQgZm9udCBmb3IgdGhpcyBwYWdlLiBUaGUgZGVmYXVsdCBmb250IHdpbGwgYmUgdXNlZCB3aGVuZXZlclxuICAgICAqIHRleHQgaXMgZHJhd24gb24gdGhpcyBwYWdlIGFuZCBubyBmb250IGlzIHNwZWNpZmllZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBTdGFuZGFyZEZvbnRzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHRpbWVzUm9tYW5Gb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLlRpbWVzUm9tYW4pXG4gICAgICogY29uc3QgaGVsdmV0aWNhRm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgY291cmllckZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuQ291cmllcilcbiAgICAgKlxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEZvbnQoaGVsdmV0aWNhRm9udClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gSGVsdmV0aWNhJylcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Rm9udCh0aW1lc1JvbWFuRm9udClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gQ291cmllcicsIHsgZm9udDogY291cmllckZvbnQgfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZGVmYXVsdCBmb250IHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRleHQgb24gdGhpcyBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEZvbnQgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICAvLyBUT0RPOiBSZXVzZSBpbWFnZSBGb250IG5hbWUgaWYgd2UndmUgYWxyZWFkeSBhZGRlZCB0aGlzIGltYWdlIHRvIFJlc291cmNlcy5Gb250c1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICB0aGlzLmZvbnQgPSBmb250O1xuICAgICAgICB0aGlzLmZvbnRLZXkgPSB0aGlzLm5vZGUubmV3Rm9udERpY3Rpb25hcnkodGhpcy5mb250Lm5hbWUsIHRoaXMuZm9udC5yZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIGEgZGVmYXVsdCBmb250IHNpemUgZm9yIHRoaXMgcGFnZS4gVGhlIGRlZmF1bHQgZm9udCBzaXplIHdpbGwgYmVcbiAgICAgKiB1c2VkIHdoZW5ldmVyIHRleHQgaXMgZHJhd24gb24gdGhpcyBwYWdlIGFuZCBubyBmb250IHNpemUgaXMgc3BlY2lmaWVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5zZXRGb250U2l6ZSgxMilcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gaW4gc2l6ZSAxMicpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEZvbnRTaXplKDM2KVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBpbiBzaXplIDI0JywgeyBmb250U2l6ZTogMjQgfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udFNpemUgVGhlIGRlZmF1bHQgZm9udCBzaXplIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRleHQgb24gdGhpc1xuICAgICAqICAgICAgICAgICAgICAgICBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEZvbnRTaXplID0gZnVuY3Rpb24gKGZvbnRTaXplKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnRTaXplLCAnZm9udFNpemUnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IGZvbnRTaXplO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIGEgZGVmYXVsdCBmb250IGNvbG9yIGZvciB0aGlzIHBhZ2UuIFRoZSBkZWZhdWx0IGZvbnQgY29sb3Igd2lsbCBiZVxuICAgICAqIHVzZWQgd2hlbmV2ZXIgdGV4dCBpcyBkcmF3biBvbiB0aGlzIHBhZ2UgYW5kIG5vIGZvbnQgY29sb3IgaXMgc3BlY2lmaWVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgcmdiLCBjbXlrLCBncmF5c2NhbGUgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogcGFnZS5zZXRGb250Q29sb3IocmdiKDAuOTcsIDAuMDIsIDAuOTcpKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBpbiBwaW5rJylcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Rm9udENvbG9yKGNteWsoMC40LCAwLjcsIDAuMzksIDAuMTUpKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBpbiBncmF5JywgeyBjb2xvcjogZ3JheXNjYWxlKDAuNSkgfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udENvbG9yIFRoZSBkZWZhdWx0IGZvbnQgY29sb3IgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGV4dCBvblxuICAgICAqICAgICAgICAgICAgICAgICAgdGhpcyBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldEZvbnRDb2xvciA9IGZ1bmN0aW9uIChmb250Q29sb3IpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udENvbG9yLCAnZm9udENvbG9yJywgW1tPYmplY3QsICdDb2xvciddXSk7XG4gICAgICAgIHRoaXMuZm9udENvbG9yID0gZm9udENvbG9yO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIGEgZGVmYXVsdCBsaW5lIGhlaWdodCBmb3IgdGhpcyBwYWdlLiBUaGUgZGVmYXVsdCBsaW5lIGhlaWdodCB3aWxsIGJlXG4gICAgICogdXNlZCB3aGVuZXZlciB0ZXh0IGlzIGRyYXduIG9uIHRoaXMgcGFnZSBhbmQgbm8gbGluZSBoZWlnaHQgaXMgc3BlY2lmaWVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5zZXRMaW5lSGVpZ2h0KDEyKTtcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdUaGVzZSBsaW5lcyB3aWxsIGJlIHZlcnRpY2FsbHkgXFxuIHNlcGFyYXRlZCBieSAxMiB1bml0cycpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldExpbmVIZWlnaHQoMzYpO1xuICAgICAqIHBhZ2UuZHJhd1RleHQoJ1RoZXNlIGxpbmVzIHdpbGwgYmUgdmVydGljYWxseSBcXG4gc2VwYXJhdGVkIGJ5IDI0IHVuaXRzJywge1xuICAgICAqICAgbGluZUhlaWdodDogMjRcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBsaW5lSGVpZ2h0IFRoZSBkZWZhdWx0IGxpbmUgaGVpZ2h0IHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRleHQgb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICB0aGlzIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0TGluZUhlaWdodCA9IGZ1bmN0aW9uIChsaW5lSGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKGxpbmVIZWlnaHQsICdsaW5lSGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMubGluZUhlaWdodCA9IGxpbmVIZWlnaHQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgeCwgeSB9ID0gcGFnZS5nZXRQb3NpdGlvbigpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7IHg6IHRoaXMueCwgeTogdGhpcy55IH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgeCBjb29yZGluYXRlIG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB4ID0gcGFnZS5nZXRYKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCB4IGNvb3JkaW5hdGUgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGVmYXVsdCB5IGNvb3JkaW5hdGUgb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHkgPSBwYWdlLmdldFkoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IHkgY29vcmRpbmF0ZSBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy55O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLm1vdmVUbygwLCAwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCB0aGUgb3JpZ2luJylcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZVRvKDAsIDI1KVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biAyNSB1bml0cyB1cCcpXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVUbygyNSwgMjUpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIDI1IHVuaXRzIHVwIGFuZCAyNSB1bml0cyB0byB0aGUgcmlnaHQnKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB4IFRoZSBuZXcgZGVmYXVsdCBwb3NpdGlvbiBvbiB0aGUgeC1heGlzIGZvciB0aGlzIHBhZ2UuXG4gICAgICogQHBhcmFtIHkgVGhlIG5ldyBkZWZhdWx0IHBvc2l0aW9uIG9uIHRoZSB5LWF4aXMgZm9yIHRoaXMgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoaXMgcGFnZSB0byBiZSBmdXJ0aGVyIGRvd24gdGhlIHktYXhpcy5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2UubW92ZVRvKDUwLCA1MClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDUwLCA1MCknKVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlRG93bigxMClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDUwLCA0MCknKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB5RGVjcmVhc2UgVGhlIGFtb3VudCBieSB3aGljaCB0aGUgcGFnZSdzIGRlZmF1bHQgcG9zaXRpb24gYWxvbmcgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICB5LWF4aXMgc2hvdWxkIGJlIGRlY3JlYXNlZC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5tb3ZlRG93biA9IGZ1bmN0aW9uICh5RGVjcmVhc2UpIHtcbiAgICAgICAgYXNzZXJ0SXMoeURlY3JlYXNlLCAneURlY3JlYXNlJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMueSAtPSB5RGVjcmVhc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhpcyBwYWdlIHRvIGJlIGZ1cnRoZXIgdXAgdGhlIHktYXhpcy5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2UubW92ZVRvKDUwLCA1MClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDUwLCA1MCknKVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlVXAoMTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNjApJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0geUluY3JlYXNlIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHBhZ2UncyBkZWZhdWx0IHBvc2l0aW9uIGFsb25nIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgeS1heGlzIHNob3VsZCBiZSBpbmNyZWFzZWQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUubW92ZVVwID0gZnVuY3Rpb24gKHlJbmNyZWFzZSkge1xuICAgICAgICBhc3NlcnRJcyh5SW5jcmVhc2UsICd5SW5jcmVhc2UnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy55ICs9IHlJbmNyZWFzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgZGVmYXVsdCBwb3NpdGlvbiBvZiB0aGlzIHBhZ2UgdG8gYmUgZnVydGhlciBsZWZ0IG9uIHRoZSB4LWF4aXMuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLm1vdmVUbyg1MCwgNTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNTApJylcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZUxlZnQoMTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg0MCwgNTApJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0geERlY3JlYXNlIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHBhZ2UncyBkZWZhdWx0IHBvc2l0aW9uIGFsb25nIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgeC1heGlzIHNob3VsZCBiZSBkZWNyZWFzZWQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUubW92ZUxlZnQgPSBmdW5jdGlvbiAoeERlY3JlYXNlKSB7XG4gICAgICAgIGFzc2VydElzKHhEZWNyZWFzZSwgJ3hEZWNyZWFzZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnggLT0geERlY3JlYXNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoaXMgcGFnZSB0byBiZSBmdXJ0aGVyIHJpZ2h0IG9uIHRoZSB5LWF4aXMuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLm1vdmVUbyg1MCwgNTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg1MCwgNTApJylcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZVJpZ2h0KDEwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNjAsIDUwKScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHhJbmNyZWFzZSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBwYWdlJ3MgZGVmYXVsdCBwb3NpdGlvbiBhbG9uZyB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgIHgtYXhpcyBzaG91bGQgYmUgaW5jcmVhc2VkLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLm1vdmVSaWdodCA9IGZ1bmN0aW9uICh4SW5jcmVhc2UpIHtcbiAgICAgICAgYXNzZXJ0SXMoeEluY3JlYXNlLCAneEluY3JlYXNlJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMueCArPSB4SW5jcmVhc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQdXNoIG9uZSBvciBtb3JlIG9wZXJhdG9ycyB0byB0aGUgZW5kIG9mIHRoaXMgcGFnZSdzIGN1cnJlbnQgY29udGVudFxuICAgICAqIHN0cmVhbS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQge1xuICAgICAqICAgcHVzaEdyYXBoaWNzU3RhdGUsXG4gICAgICogICBtb3ZlVG8sXG4gICAgICogICBsaW5lVG8sXG4gICAgICogICBjbG9zZVBhdGgsXG4gICAgICogICBzZXRGaWxsaW5nQ29sb3IsXG4gICAgICogICByZ2IsXG4gICAgICogICBmaWxsLFxuICAgICAqICAgcG9wR3JhcGhpY3NTdGF0ZSxcbiAgICAgKiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiAvLyBEcmF3IGEgZ3JlZW4gdHJpYW5nbGUgaW4gdGhlIGxvd2VyLWxlZnQgY29ybmVyIG9mIHRoZSBwYWdlXG4gICAgICogcGFnZS5wdXNoT3BlcmF0b3JzKFxuICAgICAqICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgKiAgIG1vdmVUbygwLCAwKSxcbiAgICAgKiAgIGxpbmVUbygxMDAsIDApLFxuICAgICAqICAgbGluZVRvKDUwLCAxMDApLFxuICAgICAqICAgY2xvc2VQYXRoKCksXG4gICAgICogICBzZXRGaWxsaW5nQ29sb3IocmdiKDAuMCwgMS4wLCAwLjApKSxcbiAgICAgKiAgIGZpbGwoKSxcbiAgICAgKiAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wZXJhdG9yIFRoZSBvcGVyYXRvcnMgdG8gYmUgcHVzaGVkLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnB1c2hPcGVyYXRvcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvcGVyYXRvciA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgb3BlcmF0b3JbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnRFYWNoSXMob3BlcmF0b3IsICdvcGVyYXRvcicsIFtbUERGT3BlcmF0b3IsICdQREZPcGVyYXRvciddXSk7XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIGNvbnRlbnRTdHJlYW0ucHVzaC5hcHBseShjb250ZW50U3RyZWFtLCBvcGVyYXRvcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IG9uZSBvciBtb3JlIGxpbmVzIG9mIHRleHQgb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFN0YW5kYXJkRm9udHMsIHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2FGb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCB0aW1lc1JvbWFuRm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5UaW1lc1JvbWFuKVxuICAgICAqXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Rm9udChoZWx2ZXRpY2FGb250KVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlVG8oNSwgMjAwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ1RoZSBMaWZlIG9mIGFuIEVnZycsIHsgc2l6ZTogMzYgfSlcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZURvd24oMzYpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnQW4gRXBpYyBUYWxlIG9mIFdvZScsIHsgc2l6ZTogMzAgfSlcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd1RleHQoXG4gICAgICogICBgSHVtcHR5IER1bXB0eSBzYXQgb24gYSB3YWxsIFxcbmAgK1xuICAgICAqICAgYEh1bXB0eSBEdW1wdHkgaGFkIGEgZ3JlYXQgZmFsbDsgXFxuYCArXG4gICAgICogICBgQWxsIHRoZSBraW5nJ3MgaG9yc2VzIGFuZCBhbGwgdGhlIGtpbmcncyBtZW4gXFxuYCArXG4gICAgICogICBgQ291bGRuJ3QgcHV0IEh1bXB0eSB0b2dldGhlciBhZ2Fpbi4gXFxuYCxcbiAgICAgKiAgIHtcbiAgICAgKiAgICAgeDogMjUsXG4gICAgICogICAgIHk6IDEwMCxcbiAgICAgKiAgICAgZm9udDogdGltZXNSb21hbkZvbnQsXG4gICAgICogICAgIHNpemU6IDI0LFxuICAgICAqICAgICBjb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgICBsaW5lSGVpZ2h0OiAyNCxcbiAgICAgKiAgICAgb3BhY2l0eTogMC43NSxcbiAgICAgKiAgIH0sXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIGRyYXduLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSB0ZXh0LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdUZXh0ID0gZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBhc3NlcnRJcyh0ZXh0LCAndGV4dCcsIFsnc3RyaW5nJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmNvbG9yLCAnb3B0aW9ucy5jb2xvcicsIFtbT2JqZWN0LCAnQ29sb3InXV0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmZvbnQsICdvcHRpb25zLmZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5zaXplLCAnb3B0aW9ucy5zaXplJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2tldywgJ29wdGlvbnMueFNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55U2tldywgJ29wdGlvbnMueVNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueSwgJ29wdGlvbnMueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmxpbmVIZWlnaHQsICdvcHRpb25zLmxpbmVIZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5tYXhXaWR0aCwgJ29wdGlvbnMubWF4V2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy53b3JkQnJlYWtzLCAnb3B0aW9ucy53b3JkQnJlYWtzJywgW0FycmF5XSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIF9oID0gdGhpcy5zZXRPckVtYmVkRm9udChvcHRpb25zLmZvbnQpLCBvbGRGb250ID0gX2gub2xkRm9udCwgbmV3Rm9udCA9IF9oLm5ld0ZvbnQsIG5ld0ZvbnRLZXkgPSBfaC5uZXdGb250S2V5O1xuICAgICAgICB2YXIgZm9udFNpemUgPSBvcHRpb25zLnNpemUgfHwgdGhpcy5mb250U2l6ZTtcbiAgICAgICAgdmFyIHdvcmRCcmVha3MgPSBvcHRpb25zLndvcmRCcmVha3MgfHwgdGhpcy5kb2MuZGVmYXVsdFdvcmRCcmVha3M7XG4gICAgICAgIHZhciB0ZXh0V2lkdGggPSBmdW5jdGlvbiAodCkgeyByZXR1cm4gbmV3Rm9udC53aWR0aE9mVGV4dEF0U2l6ZSh0LCBmb250U2l6ZSk7IH07XG4gICAgICAgIHZhciBsaW5lcyA9IG9wdGlvbnMubWF4V2lkdGggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBsaW5lU3BsaXQoY2xlYW5UZXh0KHRleHQpKVxuICAgICAgICAgICAgOiBicmVha1RleHRJbnRvTGluZXModGV4dCwgd29yZEJyZWFrcywgb3B0aW9ucy5tYXhXaWR0aCwgdGV4dFdpZHRoKTtcbiAgICAgICAgdmFyIGVuY29kZWRMaW5lcyA9IG5ldyBBcnJheShsaW5lcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGVuY29kZWRMaW5lc1tpZHhdID0gbmV3Rm9udC5lbmNvZGVUZXh0KGxpbmVzW2lkeF0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdMaW5lc09mVGV4dChlbmNvZGVkTGluZXMsIHtcbiAgICAgICAgICAgIGNvbG9yOiAoX2EgPSBvcHRpb25zLmNvbG9yKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmZvbnRDb2xvcixcbiAgICAgICAgICAgIGZvbnQ6IG5ld0ZvbnRLZXksXG4gICAgICAgICAgICBzaXplOiBmb250U2l6ZSxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9iID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB4U2tldzogKF9jID0gb3B0aW9ucy54U2tldykgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHlTa2V3OiAoX2QgPSBvcHRpb25zLnlTa2V3KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeDogKF9lID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2YgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IHRoaXMueSxcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IChfZyA9IG9wdGlvbnMubGluZUhlaWdodCkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdGhpcy5saW5lSGVpZ2h0LFxuICAgICAgICAgICAgZ3JhcGhpY3NTdGF0ZTogZ3JhcGhpY3NTdGF0ZUtleSxcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAob3B0aW9ucy5mb250KSB7XG4gICAgICAgICAgICBpZiAob2xkRm9udClcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvbnQob2xkRm9udCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvbnQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBhbiBpbWFnZSBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBqcGdVcmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvY2F0X3JpZGluZ191bmljb3JuLmpwZydcbiAgICAgKiBjb25zdCBqcGdJbWFnZUJ5dGVzID0gYXdhaXQgZmV0Y2goanBnVXJsKS50aGVuKChyZXMpID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqXG4gICAgICogY29uc3QganBnSW1hZ2UgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcoanBnSW1hZ2VCeXRlcylcbiAgICAgKiBjb25zdCBqcGdEaW1zID0ganBnSW1hZ2Uuc2NhbGUoMC41KVxuICAgICAqXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd0ltYWdlKGpwZ0ltYWdlLCB7XG4gICAgICogICB4OiAyNSxcbiAgICAgKiAgIHk6IDI1LFxuICAgICAqICAgd2lkdGg6IGpwZ0RpbXMud2lkdGgsXG4gICAgICogICBoZWlnaHQ6IGpwZ0RpbXMuaGVpZ2h0LFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDMwKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRvIGJlIGRyYXduLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBpbWFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3SW1hZ2UgPSBmdW5jdGlvbiAoaW1hZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICAvLyBUT0RPOiBSZXVzZSBpbWFnZSBYT2JqZWN0IG5hbWUgaWYgd2UndmUgYWxyZWFkeSBhZGRlZCB0aGlzIGltYWdlIHRvIFJlc291cmNlcy5YT2JqZWN0c1xuICAgICAgICBhc3NlcnRJcyhpbWFnZSwgJ2ltYWdlJywgW1tQREZJbWFnZSwgJ1BERkltYWdlJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueSwgJ29wdGlvbnMueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLndpZHRoLCAnb3B0aW9ucy53aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmhlaWdodCwgJ29wdGlvbnMuaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2tldywgJ29wdGlvbnMueFNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55U2tldywgJ29wdGlvbnMueVNrZXcnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLm9wYWNpdHksICdvcGFjaXR5Lm9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYmxlbmRNb2RlLCAnb3B0aW9ucy5ibGVuZE1vZGUnLCBCbGVuZE1vZGUpO1xuICAgICAgICB2YXIgeE9iamVjdEtleSA9IHRoaXMubm9kZS5uZXdYT2JqZWN0KCdJbWFnZScsIGltYWdlLnJlZik7XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIGRyYXdJbWFnZSh4T2JqZWN0S2V5LCB7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMueCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdGhpcy55LFxuICAgICAgICAgICAgd2lkdGg6IChfYyA9IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGltYWdlLnNpemUoKS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGltYWdlLnNpemUoKS5oZWlnaHQsXG4gICAgICAgICAgICByb3RhdGU6IChfZSA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeFNrZXc6IChfZiA9IG9wdGlvbnMueFNrZXcpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB5U2tldzogKF9nID0gb3B0aW9ucy55U2tldykgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYW4gZW1iZWRkZWQgUERGIHBhZ2Ugb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3Qgc291cmNlUGRmVXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL3dpdGhfbGFyZ2VfcGFnZV9jb3VudC5wZGYnXG4gICAgICogY29uc3Qgc291cmNlUGRmID0gYXdhaXQgZmV0Y2goc291cmNlUGRmVXJsKS50aGVuKChyZXMpID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqXG4gICAgICogLy8gRW1iZWQgcGFnZSA3NCBmcm9tIHRoZSBQREZcbiAgICAgKiBjb25zdCBbZW1iZWRkZWRQYWdlXSA9IGF3YWl0IHBkZkRvYy5lbWJlZFBkZihzb3VyY2VQZGYsIDczKVxuICAgICAqXG4gICAgICogcGFnZS5kcmF3UGFnZShlbWJlZGRlZFBhZ2UsIHtcbiAgICAgKiAgIHg6IDI1MCxcbiAgICAgKiAgIHk6IDIwMCxcbiAgICAgKiAgIHhTY2FsZTogMC41LFxuICAgICAqICAgeVNjYWxlOiAwLjUsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoMzApLFxuICAgICAqICAgb3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGBvcHRpb25zYCBhcmd1bWVudCBhY2NlcHRzIGJvdGggYHdpZHRoYC9gaGVpZ2h0YCBhbmQgYHhTY2FsZWAvYHlTY2FsZWBcbiAgICAgKiBhcyBvcHRpb25zLiBTaW5jZSBlYWNoIG9mIHRoZXNlIG9wdGlvbnMgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgZHJhd24gcGFnZSxcbiAgICAgKiBpZiBib3RoIG9wdGlvbnMgYXJlIGdpdmVuLCBgd2lkdGhgIGFuZCBgaGVpZ2h0YCB0YWtlIHByZWNlZGVuY2UgYW5kIHRoZVxuICAgICAqIGNvcnJlc3BvbmRpbmcgc2NhbGUgdmFyaWFudHMgYXJlIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW1iZWRkZWRQYWdlIFRoZSBlbWJlZGRlZCBwYWdlIHRvIGJlIGRyYXduLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBlbWJlZGRlZCBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdQYWdlID0gZnVuY3Rpb24gKGVtYmVkZGVkUGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICAvLyBUT0RPOiBSZXVzZSBlbWJlZGRlZFBhZ2UgWE9iamVjdCBuYW1lIGlmIHdlJ3ZlIGFscmVhZHkgYWRkZWQgdGhpcyBlbWJlZGRlZFBhZ2UgdG8gUmVzb3VyY2VzLlhPYmplY3RzXG4gICAgICAgIGFzc2VydElzKGVtYmVkZGVkUGFnZSwgJ2VtYmVkZGVkUGFnZScsIFtcbiAgICAgICAgICAgIFtQREZFbWJlZGRlZFBhZ2UsICdQREZFbWJlZGRlZFBhZ2UnXSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54U2NhbGUsICdvcHRpb25zLnhTY2FsZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnlTY2FsZSwgJ29wdGlvbnMueVNjYWxlJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMud2lkdGgsICdvcHRpb25zLndpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuaGVpZ2h0LCAnb3B0aW9ucy5oZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5yb3RhdGUsICdvcHRpb25zLnJvdGF0ZScsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnhTa2V3LCAnb3B0aW9ucy54U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnlTa2V3LCAnb3B0aW9ucy55U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciB4T2JqZWN0S2V5ID0gdGhpcy5ub2RlLm5ld1hPYmplY3QoJ0VtYmVkZGVkUGRmUGFnZScsIGVtYmVkZGVkUGFnZS5yZWYpO1xuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZUtleSA9IHRoaXMubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogb3B0aW9ucy5vcGFjaXR5LFxuICAgICAgICAgICAgYmxlbmRNb2RlOiBvcHRpb25zLmJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB2YXIgeFNjYWxlID0gKG9wdGlvbnMud2lkdGggIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMud2lkdGggLyBlbWJlZGRlZFBhZ2Uud2lkdGhcbiAgICAgICAgICAgIDogb3B0aW9ucy54U2NhbGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMueFNjYWxlXG4gICAgICAgICAgICAgICAgOiAxKTtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHZhciB5U2NhbGUgPSAob3B0aW9ucy5oZWlnaHQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuaGVpZ2h0IC8gZW1iZWRkZWRQYWdlLmhlaWdodFxuICAgICAgICAgICAgOiBvcHRpb25zLnlTY2FsZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy55U2NhbGVcbiAgICAgICAgICAgICAgICA6IDEpO1xuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd1BhZ2UoeE9iamVjdEtleSwge1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMueSxcbiAgICAgICAgICAgIHhTY2FsZTogeFNjYWxlLFxuICAgICAgICAgICAgeVNjYWxlOiB5U2NhbGUsXG4gICAgICAgICAgICByb3RhdGU6IChfYyA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeFNrZXc6IChfZCA9IG9wdGlvbnMueFNrZXcpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB5U2tldzogKF9lID0gb3B0aW9ucy55U2tldykgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYW4gU1ZHIHBhdGggb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBzdmdQYXRoID0gJ00gMCwyMCBMIDEwMCwxNjAgUSAxMzAsMjAwIDE1MCwxMjAgQyAxOTAsLTQwIDIwMCwyMDAgMzAwLDE1MCBMIDQwMCw5MCdcbiAgICAgKlxuICAgICAqIC8vIERyYXcgcGF0aCBhcyBibGFjayBsaW5lXG4gICAgICogcGFnZS5kcmF3U3ZnUGF0aChzdmdQYXRoLCB7IHg6IDI1LCB5OiA3NSB9KVxuICAgICAqXG4gICAgICogLy8gQ2hhbmdlIGJvcmRlciBzdHlsZSBhbmQgb3BhY2l0eVxuICAgICAqIHBhZ2UuZHJhd1N2Z1BhdGgoc3ZnUGF0aCwge1xuICAgICAqICAgeDogMjUsXG4gICAgICogICB5OiAyNzUsXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAuNSwgMC41LCAwLjUpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICBib3JkZXJPcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICpcbiAgICAgKiAvLyBTZXQgZmlsbCBjb2xvciBhbmQgb3BhY2l0eVxuICAgICAqIHBhZ2UuZHJhd1N2Z1BhdGgoc3ZnUGF0aCwge1xuICAgICAqICAgeDogMjUsXG4gICAgICogICB5OiA0NzUsXG4gICAgICogICBjb2xvcjogcmdiKDEuMCwgMCwgMCksXG4gICAgICogICBvcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICpcbiAgICAgKiAvLyBEcmF3IDUwJSBvZiBvcmlnaW5hbCBzaXplXG4gICAgICogcGFnZS5kcmF3U3ZnUGF0aChzdmdQYXRoLCB7XG4gICAgICogICB4OiAyNSxcbiAgICAgKiAgIHk6IDY3NSxcbiAgICAgKiAgIHNjYWxlOiAwLjUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcGF0aCBUaGUgU1ZHIHBhdGggdG8gYmUgZHJhd24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIFNWRyBwYXRoLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdTdmdQYXRoID0gZnVuY3Rpb24gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2o7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIGFzc2VydElzKHBhdGgsICdwYXRoJywgWydzdHJpbmcnXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5zY2FsZSwgJ29wdGlvbnMuc2NhbGUnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5yb3RhdGUsICdvcHRpb25zLnJvdGF0ZScsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlcldpZHRoLCAnb3B0aW9ucy5ib3JkZXJXaWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmNvbG9yLCAnb3B0aW9ucy5jb2xvcicsIFtbT2JqZWN0LCAnQ29sb3InXV0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckNvbG9yLCAnb3B0aW9ucy5ib3JkZXJDb2xvcicsIFtcbiAgICAgICAgICAgIFtPYmplY3QsICdDb2xvciddLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoQXJyYXksICdvcHRpb25zLmJvcmRlckRhc2hBcnJheScsIFtcbiAgICAgICAgICAgIEFycmF5LFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UsICdvcHRpb25zLmJvcmRlckRhc2hQaGFzZScsIFtcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyTGluZUNhcCwgJ29wdGlvbnMuYm9yZGVyTGluZUNhcCcsIExpbmVDYXBTdHlsZSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJPcGFjaXR5LCAnb3B0aW9ucy5ib3JkZXJPcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGVLZXkgPSB0aGlzLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgIGJvcmRlck9wYWNpdHk6IG9wdGlvbnMuYm9yZGVyT3BhY2l0eSxcbiAgICAgICAgICAgIGJsZW5kTW9kZTogb3B0aW9ucy5ibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoISgnY29sb3InIGluIG9wdGlvbnMpICYmICEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd1N2Z1BhdGgocGF0aCwge1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMueSxcbiAgICAgICAgICAgIHNjYWxlOiBvcHRpb25zLnNjYWxlLFxuICAgICAgICAgICAgcm90YXRlOiAoX2MgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGNvbG9yOiAoX2QgPSBvcHRpb25zLmNvbG9yKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogKF9lID0gb3B0aW9ucy5ib3JkZXJDb2xvcikgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfZiA9IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDAsXG4gICAgICAgICAgICBib3JkZXJEYXNoQXJyYXk6IChfZyA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJEYXNoUGhhc2U6IChfaCA9IG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJMaW5lQ2FwOiAoX2ogPSBvcHRpb25zLmJvcmRlckxpbmVDYXApICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYSBsaW5lIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyByZ2IgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogcGFnZS5kcmF3TGluZSh7XG4gICAgICogICBzdGFydDogeyB4OiAyNSwgeTogNzUgfSxcbiAgICAgKiAgIGVuZDogeyB4OiAxMjUsIHk6IDE3NSB9LFxuICAgICAqICAgdGhpY2tuZXNzOiAyLFxuICAgICAqICAgY29sb3I6IHJnYigwLjc1LCAwLjIsIDAuMiksXG4gICAgICogICBvcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIGxpbmUuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd0xpbmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLnN0YXJ0LCAnb3B0aW9ucy5zdGFydCcsIFtcbiAgICAgICAgICAgIFtPYmplY3QsICd7IHg6IG51bWJlciwgeTogbnVtYmVyIH0nXSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMuZW5kLCAnb3B0aW9ucy5lbmQnLCBbXG4gICAgICAgICAgICBbT2JqZWN0LCAneyB4OiBudW1iZXIsIHk6IG51bWJlciB9J10sXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLnN0YXJ0LngsICdvcHRpb25zLnN0YXJ0LngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucy5zdGFydC55LCAnb3B0aW9ucy5zdGFydC55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMuZW5kLngsICdvcHRpb25zLmVuZC54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMuZW5kLnksICdvcHRpb25zLmVuZC55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMudGhpY2tuZXNzLCAnb3B0aW9ucy50aGlja25lc3MnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5jb2xvciwgJ29wdGlvbnMuY29sb3InLCBbW09iamVjdCwgJ0NvbG9yJ11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5kYXNoQXJyYXksICdvcHRpb25zLmRhc2hBcnJheScsIFtBcnJheV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmRhc2hQaGFzZSwgJ29wdGlvbnMuZGFzaFBoYXNlJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmxpbmVDYXAsICdvcHRpb25zLmxpbmVDYXAnLCBMaW5lQ2FwU3R5bGUpO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBib3JkZXJPcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCEoJ2NvbG9yJyBpbiBvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd0xpbmUoe1xuICAgICAgICAgICAgc3RhcnQ6IG9wdGlvbnMuc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IG9wdGlvbnMuZW5kLFxuICAgICAgICAgICAgdGhpY2tuZXNzOiAoX2EgPSBvcHRpb25zLnRoaWNrbmVzcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMSxcbiAgICAgICAgICAgIGNvbG9yOiAoX2IgPSBvcHRpb25zLmNvbG9yKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkYXNoQXJyYXk6IChfYyA9IG9wdGlvbnMuZGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkYXNoUGhhc2U6IChfZCA9IG9wdGlvbnMuZGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBsaW5lQ2FwOiAoX2UgPSBvcHRpb25zLmxpbmVDYXApICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYSByZWN0YW5nbGUgb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGRlZ3JlZXMsIGdyYXlzY2FsZSwgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd1JlY3RhbmdsZSh7XG4gICAgICogICB4OiAyNSxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgd2lkdGg6IDI1MCxcbiAgICAgKiAgIGhlaWdodDogNzUsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoLTE1KSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiA1LFxuICAgICAqICAgYm9yZGVyQ29sb3I6IGdyYXlzY2FsZSgwLjUpLFxuICAgICAqICAgY29sb3I6IHJnYigwLjc1LCAwLjIsIDAuMiksXG4gICAgICogICBvcGFjaXR5OiAwLjUsXG4gICAgICogICBib3JkZXJPcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIHJlY3RhbmdsZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3UmVjdGFuZ2xlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX20sIF9vO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLngsICdvcHRpb25zLngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55LCAnb3B0aW9ucy55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMud2lkdGgsICdvcHRpb25zLndpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuaGVpZ2h0LCAnb3B0aW9ucy5oZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5yb3RhdGUsICdvcHRpb25zLnJvdGF0ZScsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnhTa2V3LCAnb3B0aW9ucy54U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnlTa2V3LCAnb3B0aW9ucy55U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlcldpZHRoLCAnb3B0aW9ucy5ib3JkZXJXaWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmNvbG9yLCAnb3B0aW9ucy5jb2xvcicsIFtbT2JqZWN0LCAnQ29sb3InXV0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckNvbG9yLCAnb3B0aW9ucy5ib3JkZXJDb2xvcicsIFtcbiAgICAgICAgICAgIFtPYmplY3QsICdDb2xvciddLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoQXJyYXksICdvcHRpb25zLmJvcmRlckRhc2hBcnJheScsIFtcbiAgICAgICAgICAgIEFycmF5LFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UsICdvcHRpb25zLmJvcmRlckRhc2hQaGFzZScsIFtcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyTGluZUNhcCwgJ29wdGlvbnMuYm9yZGVyTGluZUNhcCcsIExpbmVDYXBTdHlsZSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJPcGFjaXR5LCAnb3B0aW9ucy5ib3JkZXJPcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGVLZXkgPSB0aGlzLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgIGJvcmRlck9wYWNpdHk6IG9wdGlvbnMuYm9yZGVyT3BhY2l0eSxcbiAgICAgICAgICAgIGJsZW5kTW9kZTogb3B0aW9ucy5ibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoISgnY29sb3InIGluIG9wdGlvbnMpICYmICEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd1JlY3RhbmdsZSh7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMueCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdGhpcy55LFxuICAgICAgICAgICAgd2lkdGg6IChfYyA9IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDE1MCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDEwMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9lID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB4U2tldzogKF9mID0gb3B0aW9ucy54U2tldykgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHlTa2V3OiAoX2cgPSBvcHRpb25zLnlTa2V3KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfaCA9IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDAsXG4gICAgICAgICAgICBjb2xvcjogKF9qID0gb3B0aW9ucy5jb2xvcikgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IChfayA9IG9wdGlvbnMuYm9yZGVyQ29sb3IpICE9PSBudWxsICYmIF9rICE9PSB2b2lkIDAgPyBfayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckRhc2hBcnJheTogKF9sID0gb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXkpICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckRhc2hQaGFzZTogKF9tID0gb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UpICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgICAgICBib3JkZXJMaW5lQ2FwOiAoX28gPSBvcHRpb25zLmJvcmRlckxpbmVDYXApICE9PSBudWxsICYmIF9vICE9PSB2b2lkIDAgPyBfbyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBhIHNxdWFyZSBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgZGVncmVlcywgZ3JheXNjYWxlLCByZ2IgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogcGFnZS5kcmF3U3F1YXJlKHtcbiAgICAgKiAgIHg6IDI1LFxuICAgICAqICAgeTogNzUsXG4gICAgICogICBzaXplOiAxMDAsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoLTE1KSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiA1LFxuICAgICAqICAgYm9yZGVyQ29sb3I6IGdyYXlzY2FsZSgwLjUpLFxuICAgICAqICAgY29sb3I6IHJnYigwLjc1LCAwLjIsIDAuMiksXG4gICAgICogICBvcGFjaXR5OiAwLjUsXG4gICAgICogICBib3JkZXJPcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIHNxdWFyZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3U3F1YXJlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIHNpemUgPSBvcHRpb25zLnNpemU7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHNpemUsICdzaXplJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMuZHJhd1JlY3RhbmdsZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgd2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZSB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGFuIGVsbGlwc2Ugb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGdyYXlzY2FsZSwgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd0VsbGlwc2Uoe1xuICAgICAqICAgeDogMjAwLFxuICAgICAqICAgeTogNzUsXG4gICAgICogICB4U2NhbGU6IDEwMCxcbiAgICAgKiAgIHlTY2FsZTogNTAsXG4gICAgICogICBib3JkZXJXaWR0aDogNSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiBncmF5c2NhbGUoMC41KSxcbiAgICAgKiAgIGNvbG9yOiByZ2IoMC43NSwgMC4yLCAwLjIpLFxuICAgICAqICAgb3BhY2l0eTogMC41LFxuICAgICAqICAgYm9yZGVyT3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBlbGxpcHNlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdFbGxpcHNlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbDtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueSwgJ29wdGlvbnMueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnhTY2FsZSwgJ29wdGlvbnMueFNjYWxlJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueVNjYWxlLCAnb3B0aW9ucy55U2NhbGUnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5yb3RhdGUsICdvcHRpb25zLnJvdGF0ZScsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmNvbG9yLCAnb3B0aW9ucy5jb2xvcicsIFtbT2JqZWN0LCAnQ29sb3InXV0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckNvbG9yLCAnb3B0aW9ucy5ib3JkZXJDb2xvcicsIFtcbiAgICAgICAgICAgIFtPYmplY3QsICdDb2xvciddLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlck9wYWNpdHksICdvcHRpb25zLmJvcmRlck9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJXaWR0aCwgJ29wdGlvbnMuYm9yZGVyV2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoQXJyYXksICdvcHRpb25zLmJvcmRlckRhc2hBcnJheScsIFtcbiAgICAgICAgICAgIEFycmF5LFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UsICdvcHRpb25zLmJvcmRlckRhc2hQaGFzZScsIFtcbiAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyTGluZUNhcCwgJ29wdGlvbnMuYm9yZGVyTGluZUNhcCcsIExpbmVDYXBTdHlsZSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGVLZXkgPSB0aGlzLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgIGJvcmRlck9wYWNpdHk6IG9wdGlvbnMuYm9yZGVyT3BhY2l0eSxcbiAgICAgICAgICAgIGJsZW5kTW9kZTogb3B0aW9ucy5ibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoISgnY29sb3InIGluIG9wdGlvbnMpICYmICEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5jb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd0VsbGlwc2Uoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLngsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMueSxcbiAgICAgICAgICAgIHhTY2FsZTogKF9jID0gb3B0aW9ucy54U2NhbGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDEwMCxcbiAgICAgICAgICAgIHlTY2FsZTogKF9kID0gb3B0aW9ucy55U2NhbGUpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDEwMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9lID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbG9yOiAoX2YgPSBvcHRpb25zLmNvbG9yKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogKF9nID0gb3B0aW9ucy5ib3JkZXJDb2xvcikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfaCA9IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDAsXG4gICAgICAgICAgICBib3JkZXJEYXNoQXJyYXk6IChfaiA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJEYXNoUGhhc2U6IChfayA9IG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJMaW5lQ2FwOiAoX2wgPSBvcHRpb25zLmJvcmRlckxpbmVDYXApICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGdyYXBoaWNzU3RhdGU6IGdyYXBoaWNzU3RhdGVLZXksXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYSBjaXJjbGUgb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGdyYXlzY2FsZSwgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIHBhZ2UuZHJhd0NpcmNsZSh7XG4gICAgICogICB4OiAyMDAsXG4gICAgICogICB5OiAxNTAsXG4gICAgICogICBzaXplOiAxMDAsXG4gICAgICogICBib3JkZXJXaWR0aDogNSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiBncmF5c2NhbGUoMC41KSxcbiAgICAgKiAgIGNvbG9yOiByZ2IoMC43NSwgMC4yLCAwLjIpLFxuICAgICAqICAgb3BhY2l0eTogMC41LFxuICAgICAqICAgYm9yZGVyT3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBkcmF3aW5nIHRoZSBlbGxpcHNlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdDaXJjbGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgX2EgPSBvcHRpb25zLnNpemUsIHNpemUgPSBfYSA9PT0gdm9pZCAwID8gMTAwIDogX2E7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHNpemUsICdzaXplJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMuZHJhd0VsbGlwc2UoX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHhTY2FsZTogc2l6ZSwgeVNjYWxlOiBzaXplIH0pKTtcbiAgICB9O1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldE9yRW1iZWRGb250ID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgdmFyIG9sZEZvbnQgPSB0aGlzLmZvbnQ7XG4gICAgICAgIHZhciBvbGRGb250S2V5ID0gdGhpcy5mb250S2V5O1xuICAgICAgICBpZiAoZm9udClcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9udChmb250KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5nZXRGb250KCk7XG4gICAgICAgIHZhciBuZXdGb250ID0gdGhpcy5mb250O1xuICAgICAgICB2YXIgbmV3Rm9udEtleSA9IHRoaXMuZm9udEtleTtcbiAgICAgICAgcmV0dXJuIHsgb2xkRm9udDogb2xkRm9udCwgb2xkRm9udEtleTogb2xkRm9udEtleSwgbmV3Rm9udDogbmV3Rm9udCwgbmV3Rm9udEtleTogbmV3Rm9udEtleSB9O1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0Rm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvbnQgfHwgIXRoaXMuZm9udEtleSkge1xuICAgICAgICAgICAgdmFyIGZvbnQgPSB0aGlzLmRvYy5lbWJlZFN0YW5kYXJkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSk7XG4gICAgICAgICAgICB0aGlzLnNldEZvbnQoZm9udCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0aGlzLmZvbnQsIHRoaXMuZm9udEtleV07XG4gICAgfTtcbiAgICBQREZQYWdlLnByb3RvdHlwZS5yZXNldEZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZm9udCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5mb250S2V5ID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0Q29udGVudFN0cmVhbSA9IGZ1bmN0aW9uICh1c2VFeGlzdGluZykge1xuICAgICAgICBpZiAodXNlRXhpc3RpbmcgPT09IHZvaWQgMCkgeyB1c2VFeGlzdGluZyA9IHRydWU7IH1cbiAgICAgICAgaWYgKHVzZUV4aXN0aW5nICYmIHRoaXMuY29udGVudFN0cmVhbSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRTdHJlYW07XG4gICAgICAgIHRoaXMuY29udGVudFN0cmVhbSA9IHRoaXMuY3JlYXRlQ29udGVudFN0cmVhbSgpO1xuICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW1SZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHRoaXMuY29udGVudFN0cmVhbSk7XG4gICAgICAgIHRoaXMubm9kZS5hZGRDb250ZW50U3RyZWFtKHRoaXMuY29udGVudFN0cmVhbVJlZik7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRTdHJlYW07XG4gICAgfTtcbiAgICBQREZQYWdlLnByb3RvdHlwZS5jcmVhdGVDb250ZW50U3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb3BlcmF0b3JzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBvcGVyYXRvcnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGljdCA9IHRoaXMuZG9jLmNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSBQREZDb250ZW50U3RyZWFtLm9mKGRpY3QsIG9wZXJhdG9ycyk7XG4gICAgICAgIHJldHVybiBjb250ZW50U3RyZWFtO1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgb3BhY2l0eSA9IG9wdGlvbnMub3BhY2l0eSwgYm9yZGVyT3BhY2l0eSA9IG9wdGlvbnMuYm9yZGVyT3BhY2l0eSwgYmxlbmRNb2RlID0gb3B0aW9ucy5ibGVuZE1vZGU7XG4gICAgICAgIGlmIChvcGFjaXR5ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGJvcmRlck9wYWNpdHkgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgYmxlbmRNb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGUgPSB0aGlzLmRvYy5jb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBUeXBlOiAnRXh0R1N0YXRlJyxcbiAgICAgICAgICAgIGNhOiBvcGFjaXR5LFxuICAgICAgICAgICAgQ0E6IGJvcmRlck9wYWNpdHksXG4gICAgICAgICAgICBCTTogYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGtleSA9IHRoaXMubm9kZS5uZXdFeHRHU3RhdGUoJ0dTJywgZ3JhcGhpY3NTdGF0ZSk7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfTtcbiAgICBQREZQYWdlLnByb3RvdHlwZS5zY2FsZUFubm90ID0gZnVuY3Rpb24gKGFubm90LCB4LCB5KSB7XG4gICAgICAgIHZhciBzZWxlY3RvcnMgPSBbJ1JEJywgJ0NMJywgJ1ZlcnRpY2VzJywgJ1F1YWRQb2ludHMnLCAnTCcsICdSZWN0J107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHNlbGVjdG9ycy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBsaXN0ID0gYW5ub3QubG9va3VwKFBERk5hbWUub2Yoc2VsZWN0b3JzW2lkeF0pKTtcbiAgICAgICAgICAgIGlmIChsaXN0IGluc3RhbmNlb2YgUERGQXJyYXkpXG4gICAgICAgICAgICAgICAgbGlzdC5zY2FsZVBERk51bWJlcnMoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlua0xpc3RzID0gYW5ub3QubG9va3VwKFBERk5hbWUub2YoJ0lua0xpc3QnKSk7XG4gICAgICAgIGlmIChpbmtMaXN0cyBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBpbmtMaXN0cy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyID0gaW5rTGlzdHMubG9va3VwKGlkeCk7XG4gICAgICAgICAgICAgICAgaWYgKGFyciBpbnN0YW5jZW9mIFBERkFycmF5KVxuICAgICAgICAgICAgICAgICAgICBhcnIuc2NhbGVQREZOdW1iZXJzKHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuYWRkUGFnZV1dIGFuZCBbW1BERkRvY3VtZW50Lmluc2VydFBhZ2VdXVxuICAgICAqID4gbWV0aG9kcywgd2hpY2ggY2FuIGNyZWF0ZSBpbnN0YW5jZXMgb2YgW1tQREZQYWdlXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERlBhZ2VdXSBmcm9tIGFuIGV4aXN0aW5nIGxlYWYgbm9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZWFmTm9kZSBUaGUgbGVhZiBub2RlIHRvIGJlIHdyYXBwZWQuXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhlIHBhZ2UuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhlIHBhZ2Ugd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGUGFnZS5vZiA9IGZ1bmN0aW9uIChsZWFmTm9kZSwgcmVmLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZQYWdlKGxlYWZOb2RlLCByZWYsIGRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuYWRkUGFnZV1dIGFuZCBbW1BERkRvY3VtZW50Lmluc2VydFBhZ2VdXVxuICAgICAqID4gbWV0aG9kcywgd2hpY2ggY2FuIGNyZWF0ZSBpbnN0YW5jZXMgb2YgW1tQREZQYWdlXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERlBhZ2VdXS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBwYWdlIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERlBhZ2UuY3JlYXRlID0gZnVuY3Rpb24gKGRvYykge1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICB2YXIgZHVtbXlSZWYgPSBQREZSZWYub2YoLTEpO1xuICAgICAgICB2YXIgcGFnZUxlYWYgPSBQREZQYWdlTGVhZi53aXRoQ29udGV4dEFuZFBhcmVudChkb2MuY29udGV4dCwgZHVtbXlSZWYpO1xuICAgICAgICB2YXIgcGFnZVJlZiA9IGRvYy5jb250ZXh0LnJlZ2lzdGVyKHBhZ2VMZWFmKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZQYWdlKHBhZ2VMZWFmLCBwYWdlUmVmLCBkb2MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlBhZ2U7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUGFnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlBhZ2UuanMubWFwIiwiZXhwb3J0IHZhciBCbGVuZE1vZGU7XG4oZnVuY3Rpb24gKEJsZW5kTW9kZSkge1xuICAgIEJsZW5kTW9kZVtcIk5vcm1hbFwiXSA9IFwiTm9ybWFsXCI7XG4gICAgQmxlbmRNb2RlW1wiTXVsdGlwbHlcIl0gPSBcIk11bHRpcGx5XCI7XG4gICAgQmxlbmRNb2RlW1wiU2NyZWVuXCJdID0gXCJTY3JlZW5cIjtcbiAgICBCbGVuZE1vZGVbXCJPdmVybGF5XCJdID0gXCJPdmVybGF5XCI7XG4gICAgQmxlbmRNb2RlW1wiRGFya2VuXCJdID0gXCJEYXJrZW5cIjtcbiAgICBCbGVuZE1vZGVbXCJMaWdodGVuXCJdID0gXCJMaWdodGVuXCI7XG4gICAgQmxlbmRNb2RlW1wiQ29sb3JEb2RnZVwiXSA9IFwiQ29sb3JEb2RnZVwiO1xuICAgIEJsZW5kTW9kZVtcIkNvbG9yQnVyblwiXSA9IFwiQ29sb3JCdXJuXCI7XG4gICAgQmxlbmRNb2RlW1wiSGFyZExpZ2h0XCJdID0gXCJIYXJkTGlnaHRcIjtcbiAgICBCbGVuZE1vZGVbXCJTb2Z0TGlnaHRcIl0gPSBcIlNvZnRMaWdodFwiO1xuICAgIEJsZW5kTW9kZVtcIkRpZmZlcmVuY2VcIl0gPSBcIkRpZmZlcmVuY2VcIjtcbiAgICBCbGVuZE1vZGVbXCJFeGNsdXNpb25cIl0gPSBcIkV4Y2x1c2lvblwiO1xufSkoQmxlbmRNb2RlIHx8IChCbGVuZE1vZGUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUGFnZU9wdGlvbnMuanMubWFwIiwiZXhwb3J0IHZhciBTdGFuZGFyZEZvbnRzO1xuKGZ1bmN0aW9uIChTdGFuZGFyZEZvbnRzKSB7XG4gICAgU3RhbmRhcmRGb250c1tcIkNvdXJpZXJcIl0gPSBcIkNvdXJpZXJcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiQ291cmllckJvbGRcIl0gPSBcIkNvdXJpZXItQm9sZFwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJDb3VyaWVyT2JsaXF1ZVwiXSA9IFwiQ291cmllci1PYmxpcXVlXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIkNvdXJpZXJCb2xkT2JsaXF1ZVwiXSA9IFwiQ291cmllci1Cb2xkT2JsaXF1ZVwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJIZWx2ZXRpY2FcIl0gPSBcIkhlbHZldGljYVwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJIZWx2ZXRpY2FCb2xkXCJdID0gXCJIZWx2ZXRpY2EtQm9sZFwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJIZWx2ZXRpY2FPYmxpcXVlXCJdID0gXCJIZWx2ZXRpY2EtT2JsaXF1ZVwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJIZWx2ZXRpY2FCb2xkT2JsaXF1ZVwiXSA9IFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIlRpbWVzUm9tYW5cIl0gPSBcIlRpbWVzLVJvbWFuXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIlRpbWVzUm9tYW5Cb2xkXCJdID0gXCJUaW1lcy1Cb2xkXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIlRpbWVzUm9tYW5JdGFsaWNcIl0gPSBcIlRpbWVzLUl0YWxpY1wiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJUaW1lc1JvbWFuQm9sZEl0YWxpY1wiXSA9IFwiVGltZXMtQm9sZEl0YWxpY1wiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJTeW1ib2xcIl0gPSBcIlN5bWJvbFwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJaYXBmRGluZ2JhdHNcIl0gPSBcIlphcGZEaW5nYmF0c1wiO1xufSkoU3RhbmRhcmRGb250cyB8fCAoU3RhbmRhcmRGb250cyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGFuZGFyZEZvbnRzLmpzLm1hcCIsImltcG9ydCB7IHNldEZpbGxpbmdDbXlrQ29sb3IsIHNldEZpbGxpbmdHcmF5c2NhbGVDb2xvciwgc2V0RmlsbGluZ1JnYkNvbG9yLCBzZXRTdHJva2luZ0NteWtDb2xvciwgc2V0U3Ryb2tpbmdHcmF5c2NhbGVDb2xvciwgc2V0U3Ryb2tpbmdSZ2JDb2xvciwgfSBmcm9tIFwiLi9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IGFzc2VydFJhbmdlLCBlcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuZXhwb3J0IHZhciBDb2xvclR5cGVzO1xuKGZ1bmN0aW9uIChDb2xvclR5cGVzKSB7XG4gICAgQ29sb3JUeXBlc1tcIkdyYXlzY2FsZVwiXSA9IFwiR3JheXNjYWxlXCI7XG4gICAgQ29sb3JUeXBlc1tcIlJHQlwiXSA9IFwiUkdCXCI7XG4gICAgQ29sb3JUeXBlc1tcIkNNWUtcIl0gPSBcIkNNWUtcIjtcbn0pKENvbG9yVHlwZXMgfHwgKENvbG9yVHlwZXMgPSB7fSkpO1xuZXhwb3J0IHZhciBncmF5c2NhbGUgPSBmdW5jdGlvbiAoZ3JheSkge1xuICAgIGFzc2VydFJhbmdlKGdyYXksICdncmF5JywgMC4wLCAxLjApO1xuICAgIHJldHVybiB7IHR5cGU6IENvbG9yVHlwZXMuR3JheXNjYWxlLCBncmF5OiBncmF5IH07XG59O1xuZXhwb3J0IHZhciByZ2IgPSBmdW5jdGlvbiAocmVkLCBncmVlbiwgYmx1ZSkge1xuICAgIGFzc2VydFJhbmdlKHJlZCwgJ3JlZCcsIDAsIDEpO1xuICAgIGFzc2VydFJhbmdlKGdyZWVuLCAnZ3JlZW4nLCAwLCAxKTtcbiAgICBhc3NlcnRSYW5nZShibHVlLCAnYmx1ZScsIDAsIDEpO1xuICAgIHJldHVybiB7IHR5cGU6IENvbG9yVHlwZXMuUkdCLCByZWQ6IHJlZCwgZ3JlZW46IGdyZWVuLCBibHVlOiBibHVlIH07XG59O1xuZXhwb3J0IHZhciBjbXlrID0gZnVuY3Rpb24gKGN5YW4sIG1hZ2VudGEsIHllbGxvdywga2V5KSB7XG4gICAgYXNzZXJ0UmFuZ2UoY3lhbiwgJ2N5YW4nLCAwLCAxKTtcbiAgICBhc3NlcnRSYW5nZShtYWdlbnRhLCAnbWFnZW50YScsIDAsIDEpO1xuICAgIGFzc2VydFJhbmdlKHllbGxvdywgJ3llbGxvdycsIDAsIDEpO1xuICAgIGFzc2VydFJhbmdlKGtleSwgJ2tleScsIDAsIDEpO1xuICAgIHJldHVybiB7IHR5cGU6IENvbG9yVHlwZXMuQ01ZSywgY3lhbjogY3lhbiwgbWFnZW50YTogbWFnZW50YSwgeWVsbG93OiB5ZWxsb3csIGtleToga2V5IH07XG59O1xudmFyIEdyYXlzY2FsZSA9IENvbG9yVHlwZXMuR3JheXNjYWxlLCBSR0IgPSBDb2xvclR5cGVzLlJHQiwgQ01ZSyA9IENvbG9yVHlwZXMuQ01ZSztcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciBzZXRGaWxsaW5nQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICByZXR1cm4gY29sb3IudHlwZSA9PT0gR3JheXNjYWxlID8gc2V0RmlsbGluZ0dyYXlzY2FsZUNvbG9yKGNvbG9yLmdyYXkpXG4gICAgICAgIDogY29sb3IudHlwZSA9PT0gUkdCID8gc2V0RmlsbGluZ1JnYkNvbG9yKGNvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpXG4gICAgICAgICAgICA6IGNvbG9yLnR5cGUgPT09IENNWUsgPyBzZXRGaWxsaW5nQ215a0NvbG9yKGNvbG9yLmN5YW4sIGNvbG9yLm1hZ2VudGEsIGNvbG9yLnllbGxvdywgY29sb3Iua2V5KVxuICAgICAgICAgICAgICAgIDogZXJyb3IoXCJJbnZhbGlkIGNvbG9yOiBcIiArIEpTT04uc3RyaW5naWZ5KGNvbG9yKSk7XG59O1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdmFyIHNldFN0cm9raW5nQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICByZXR1cm4gY29sb3IudHlwZSA9PT0gR3JheXNjYWxlID8gc2V0U3Ryb2tpbmdHcmF5c2NhbGVDb2xvcihjb2xvci5ncmF5KVxuICAgICAgICA6IGNvbG9yLnR5cGUgPT09IFJHQiA/IHNldFN0cm9raW5nUmdiQ29sb3IoY29sb3IucmVkLCBjb2xvci5ncmVlbiwgY29sb3IuYmx1ZSlcbiAgICAgICAgICAgIDogY29sb3IudHlwZSA9PT0gQ01ZSyA/IHNldFN0cm9raW5nQ215a0NvbG9yKGNvbG9yLmN5YW4sIGNvbG9yLm1hZ2VudGEsIGNvbG9yLnllbGxvdywgY29sb3Iua2V5KVxuICAgICAgICAgICAgICAgIDogZXJyb3IoXCJJbnZhbGlkIGNvbG9yOiBcIiArIEpTT04uc3RyaW5naWZ5KGNvbG9yKSk7XG59O1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdmFyIGNvbXBvbmVudHNUb0NvbG9yID0gZnVuY3Rpb24gKGNvbXBzLCBzY2FsZSkge1xuICAgIGlmIChzY2FsZSA9PT0gdm9pZCAwKSB7IHNjYWxlID0gMTsgfVxuICAgIHJldHVybiAoKGNvbXBzID09PSBudWxsIHx8IGNvbXBzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wcy5sZW5ndGgpID09PSAxID8gZ3JheXNjYWxlKGNvbXBzWzBdICogc2NhbGUpXG4gICAgICAgIDogKGNvbXBzID09PSBudWxsIHx8IGNvbXBzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wcy5sZW5ndGgpID09PSAzID8gcmdiKGNvbXBzWzBdICogc2NhbGUsIGNvbXBzWzFdICogc2NhbGUsIGNvbXBzWzJdICogc2NhbGUpXG4gICAgICAgICAgICA6IChjb21wcyA9PT0gbnVsbCB8fCBjb21wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tcHMubGVuZ3RoKSA9PT0gNCA/IGNteWsoY29tcHNbMF0gKiBzY2FsZSwgY29tcHNbMV0gKiBzY2FsZSwgY29tcHNbMl0gKiBzY2FsZSwgY29tcHNbM10gKiBzY2FsZSlcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCk7XG59O1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdmFyIGNvbG9yVG9Db21wb25lbnRzID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgcmV0dXJuIGNvbG9yLnR5cGUgPT09IEdyYXlzY2FsZSA/IFtjb2xvci5ncmF5XVxuICAgICAgICA6IGNvbG9yLnR5cGUgPT09IFJHQiA/IFtjb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlXVxuICAgICAgICAgICAgOiBjb2xvci50eXBlID09PSBDTVlLID8gW2NvbG9yLmN5YW4sIGNvbG9yLm1hZ2VudGEsIGNvbG9yLnllbGxvdywgY29sb3Iua2V5XVxuICAgICAgICAgICAgICAgIDogZXJyb3IoXCJJbnZhbGlkIGNvbG9yOiBcIiArIEpTT04uc3RyaW5naWZ5KGNvbG9yKSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29sb3JzLmpzLm1hcCIsIi8vIHRzbGludDpkaXNhYmxlOiBtYXgtY2xhc3Nlcy1wZXItZmlsZVxuaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG4vLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gZG9jdW1lbnRhdGlvbiB3aXRoIGV4YW1wbGVcbnZhciBFbmNyeXB0ZWRQREZFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRW5jcnlwdGVkUERGRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRW5jcnlwdGVkUERGRXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSAnSW5wdXQgZG9jdW1lbnQgdG8gYFBERkRvY3VtZW50LmxvYWRgIGlzIGVuY3J5cHRlZC4gWW91IGNhbiB1c2UgYFBERkRvY3VtZW50LmxvYWQoLi4uLCB7IGlnbm9yZUVuY3J5cHRpb246IHRydWUgfSlgIGlmIHlvdSB3aXNoIHRvIGxvYWQgdGhlIGRvY3VtZW50IGFueXdheXMuJztcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEVuY3J5cHRlZFBERkVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgRW5jcnlwdGVkUERGRXJyb3IgfTtcbi8vIFRPRE86IEluY2x1ZGUgbGluayB0byBkb2N1bWVudGF0aW9uIHdpdGggZXhhbXBsZVxudmFyIEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRm9udGtpdE5vdFJlZ2lzdGVyZWRFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9ICdJbnB1dCB0byBgUERGRG9jdW1lbnQuZW1iZWRGb250YCB3YXMgYSBjdXN0b20gZm9udCwgYnV0IG5vIGBmb250a2l0YCBpbnN0YW5jZSB3YXMgZm91bmQuIFlvdSBtdXN0IHJlZ2lzdGVyIGEgYGZvbnRraXRgIGluc3RhbmNlIHdpdGggYFBERkRvY3VtZW50LnJlZ2lzdGVyRm9udGtpdCguLi4pYCBiZWZvcmUgZW1iZWRkaW5nIGN1c3RvbSBmb250cy4nO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRm9udGtpdE5vdFJlZ2lzdGVyZWRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEZvbnRraXROb3RSZWdpc3RlcmVkRXJyb3IgfTtcbi8vIFRPRE86IEluY2x1ZGUgbGluayB0byBkb2N1bWVudGF0aW9uIHdpdGggZXhhbXBsZVxudmFyIEZvcmVpZ25QYWdlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZvcmVpZ25QYWdlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRm9yZWlnblBhZ2VFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9ICdBIGBwYWdlYCBwYXNzZWQgdG8gYFBERkRvY3VtZW50LmFkZFBhZ2VgIG9yIGBQREZEb2N1bWVudC5pbnNlcnRQYWdlYCB3YXMgZnJvbSBhIGRpZmZlcmVudCAoZm9yZWlnbikgUERGIGRvY3VtZW50LiBJZiB5b3Ugd2FudCB0byBjb3B5IHBhZ2VzIGZyb20gb25lIFBERkRvY3VtZW50IHRvIGFub3RoZXIsIHlvdSBtdXN0IHVzZSBgUERGRG9jdW1lbnQuY29weVBhZ2VzKC4uLilgIHRvIGNvcHkgdGhlIHBhZ2VzIGJlZm9yZSBhZGRpbmcgb3IgaW5zZXJ0aW5nIHRoZW0uJztcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEZvcmVpZ25QYWdlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBGb3JlaWduUGFnZUVycm9yIH07XG4vLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gZG9jdW1lbnRhdGlvbiB3aXRoIGV4YW1wbGVcbnZhciBSZW1vdmVQYWdlRnJvbUVtcHR5RG9jdW1lbnRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSAnUERGRG9jdW1lbnQgaGFzIG5vIHBhZ2VzIHNvIGBQREZEb2N1bWVudC5yZW1vdmVQYWdlYCBjYW5ub3QgYmUgY2FsbGVkJztcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3IgfTtcbnZhciBOb1N1Y2hGaWVsZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb1N1Y2hGaWVsZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5vU3VjaEZpZWxkRXJyb3IobmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJQREZEb2N1bWVudCBoYXMgbm8gZm9ybSBmaWVsZCB3aXRoIHRoZSBuYW1lIFxcXCJcIiArIG5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE5vU3VjaEZpZWxkRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBOb1N1Y2hGaWVsZEVycm9yIH07XG52YXIgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIGV4cGVjdGVkLCBhY3R1YWwpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGV4cGVjdGVkVHlwZSA9IGV4cGVjdGVkID09PSBudWxsIHx8IGV4cGVjdGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleHBlY3RlZC5uYW1lO1xuICAgICAgICB2YXIgYWN0dWFsVHlwZSA9IChfYiA9IChfYSA9IGFjdHVhbCA9PT0gbnVsbCB8fCBhY3R1YWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjdHVhbC5jb25zdHJ1Y3RvcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGFjdHVhbDtcbiAgICAgICAgdmFyIG1zZyA9IFwiRXhwZWN0ZWQgZmllbGQgXFxcIlwiICsgbmFtZSArIFwiXFxcIiB0byBiZSBvZiB0eXBlIFwiICsgZXhwZWN0ZWRUeXBlICsgXCIsIFwiICtcbiAgICAgICAgICAgIChcImJ1dCBpdCBpcyBhY3R1YWxseSBvZiB0eXBlIFwiICsgYWN0dWFsVHlwZSk7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IgfTtcbnZhciBNaXNzaW5nT25WYWx1ZUNoZWNrRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdPblZhbHVlQ2hlY2tFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nT25WYWx1ZUNoZWNrRXJyb3Iob25WYWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gc2VsZWN0IGNoZWNrIGJveCBkdWUgdG8gbWlzc2luZyBvblZhbHVlOiBcXFwiXCIgKyBvblZhbHVlICsgXCJcXFwiXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nT25WYWx1ZUNoZWNrRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nT25WYWx1ZUNoZWNrRXJyb3IgfTtcbnZhciBGaWVsZEFscmVhZHlFeGlzdHNFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IobmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lOiBcXFwiXCIgKyBuYW1lICsgXCJcXFwiXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBGaWVsZEFscmVhZHlFeGlzdHNFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yIH07XG52YXIgSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnZhbGlkRmllbGROYW1lUGFydEVycm9yKG5hbWVQYXJ0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZpZWxkIG5hbWUgY29udGFpbnMgaW52YWxpZCBjb21wb25lbnQ6IFxcXCJcIiArIG5hbWVQYXJ0ICsgXCJcXFwiXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbnZhbGlkRmllbGROYW1lUGFydEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvciB9O1xudmFyIEZpZWxkRXhpc3RzQXNOb25UZXJtaW5hbEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGaWVsZEV4aXN0c0FzTm9uVGVybWluYWxFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGaWVsZEV4aXN0c0FzTm9uVGVybWluYWxFcnJvcihuYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkEgbm9uLXRlcm1pbmFsIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lOiBcXFwiXCIgKyBuYW1lICsgXCJcXFwiXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBGaWVsZEV4aXN0c0FzTm9uVGVybWluYWxFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEZpZWxkRXhpc3RzQXNOb25UZXJtaW5hbEVycm9yIH07XG52YXIgUmljaFRleHRGaWVsZFJlYWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmljaFRleHRGaWVsZFJlYWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSaWNoVGV4dEZpZWxkUmVhZEVycm9yKGZpZWxkTmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJSZWFkaW5nIHJpY2ggdGV4dCBmaWVsZHMgaXMgbm90IHN1cHBvcnRlZDogQXR0ZW1wdGVkIHRvIHJlYWQgcmljaCB0ZXh0IGZpZWxkOiBcIiArIGZpZWxkTmFtZTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFJpY2hUZXh0RmllbGRSZWFkRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBSaWNoVGV4dEZpZWxkUmVhZEVycm9yIH07XG52YXIgQ29tYmVkVGV4dExheW91dEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb21iZWRUZXh0TGF5b3V0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29tYmVkVGV4dExheW91dEVycm9yKGxpbmVMZW5ndGgsIGNlbGxDb3VudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gbGF5b3V0IGNvbWJlZCB0ZXh0IGFzIGxpbmVMZW5ndGg9XCIgKyBsaW5lTGVuZ3RoICsgXCIgaXMgZ3JlYXRlciB0aGFuIGNlbGxDb3VudD1cIiArIGNlbGxDb3VudDtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIENvbWJlZFRleHRMYXlvdXRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IENvbWJlZFRleHRMYXlvdXRFcnJvciB9O1xudmFyIEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRXhjZWVkZWRNYXhMZW5ndGhFcnJvcih0ZXh0TGVuZ3RoLCBtYXhMZW5ndGgsIG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQXR0ZW1wdGVkIHRvIHNldCB0ZXh0IHdpdGggbGVuZ3RoPVwiICsgdGV4dExlbmd0aCArIFwiIGZvciBUZXh0RmllbGQgd2l0aCBtYXhMZW5ndGg9XCIgKyBtYXhMZW5ndGggKyBcIiBhbmQgbmFtZT1cIiArIG5hbWU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBFeGNlZWRlZE1heExlbmd0aEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgRXhjZWVkZWRNYXhMZW5ndGhFcnJvciB9O1xudmFyIEludmFsaWRNYXhMZW5ndGhFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52YWxpZE1heExlbmd0aEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEludmFsaWRNYXhMZW5ndGhFcnJvcih0ZXh0TGVuZ3RoLCBtYXhMZW5ndGgsIG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQXR0ZW1wdGVkIHRvIHNldCBtYXhMZW5ndGg9XCIgKyBtYXhMZW5ndGggKyBcIiwgd2hpY2ggaXMgbGVzcyB0aGFuIFwiICsgdGV4dExlbmd0aCArIFwiLCB0aGUgbGVuZ3RoIG9mIHRoaXMgZmllbGQncyBjdXJyZW50IHZhbHVlIChuYW1lPVwiICsgbmFtZSArIFwiKVwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSW52YWxpZE1heExlbmd0aEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgSW52YWxpZE1heExlbmd0aEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGUGFnZSBmcm9tIFwiLi4vUERGUGFnZVwiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4uL1BERkZvbnRcIjtcbmltcG9ydCB7IEltYWdlQWxpZ25tZW50IH0gZnJvbSBcIi4uL2ltYWdlL2FsaWdubWVudFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQXBwZWFyYW5jZSwgZGVmYXVsdEJ1dHRvbkFwcGVhcmFuY2VQcm92aWRlciwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuaW1wb3J0IFBERkZpZWxkLCB7IGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMsIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBQREZTdHJlYW0sIFBERkFjcm9QdXNoQnV0dG9uLCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0T3JVbmRlZmluZWQsIGFzc2VydFBvc2l0aXZlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBidXR0b24gZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERkJ1dHRvbl1dIGZpZWxkcyBhcmUgaW50ZXJhY3RpdmUgY29udHJvbHMgdGhhdCB1c2VycyBjYW4gY2xpY2sgd2l0aCB0aGVpclxuICogbW91c2UuIFRoaXMgdHlwZSBvZiBbW1BERkZpZWxkXV0gaXMgbm90IHN0YXRlZnVsLiBUaGUgcHVycG9zZSBvZiBhIGJ1dHRvblxuICogaXMgdG8gcGVyZm9ybSBhbiBhY3Rpb24gd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gaXQsIHN1Y2ggYXMgb3BlbmluZyBhIHByaW50XG4gKiBtb2RhbCBvciByZXNldHRpbmcgdGhlIGZvcm0uIEJ1dHRvbnMgYXJlIHR5cGljYWxseSByZWN0YW5ndWxhciBpbiBzaGFwZSBhbmRcbiAqIGhhdmUgYSB0ZXh0IGxhYmVsIGRlc2NyaWJpbmcgdGhlIGFjdGlvbiB0aGF0IHRoZXkgcGVyZm9ybSB3aGVuIGNsaWNrZWQuXG4gKi9cbnZhciBQREZCdXR0b24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkJ1dHRvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZCdXR0b24oYWNyb1B1c2hCdXR0b24sIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9QdXNoQnV0dG9uLCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb1B1c2hCdXR0b24sICdhY3JvQnV0dG9uJywgW1xuICAgICAgICAgICAgW1BERkFjcm9QdXNoQnV0dG9uLCAnUERGQWNyb1B1c2hCdXR0b24nXSxcbiAgICAgICAgXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9QdXNoQnV0dG9uO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc3BsYXkgYW4gaW1hZ2UgaW5zaWRlIHRoZSBib3VuZHMgb2YgdGhpcyBidXR0b24ncyB3aWRnZXRzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBuZ0ltYWdlID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKC4uLilcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmdldEJ1dHRvbignc29tZS5idXR0b24uZmllbGQnKVxuICAgICAqIGJ1dHRvbi5zZXRJbWFnZShwbmdJbWFnZSwgSW1hZ2VBbGlnbm1lbnQuQ2VudGVyKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGFwcGVhcmFuY2VzIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBidXR0b24ncyB3aWRnZXRzLlxuICAgICAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgICAqIEBwYXJhbSBhbGlnbm1lbnQgVGhlIGFsaWdubWVudCBvZiB0aGUgaW1hZ2UuXG4gICAgICovXG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS5zZXRJbWFnZSA9IGZ1bmN0aW9uIChpbWFnZSwgYWxpZ25tZW50KSB7XG4gICAgICAgIGlmIChhbGlnbm1lbnQgPT09IHZvaWQgMCkgeyBhbGlnbm1lbnQgPSBJbWFnZUFsaWdubWVudC5DZW50ZXI7IH1cbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN0cmVhbVJlZiA9IHRoaXMuY3JlYXRlSW1hZ2VBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgaW1hZ2UsIGFsaWdubWVudCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VzKHdpZGdldCwgeyBub3JtYWw6IHN0cmVhbVJlZiB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZvbnQgc2l6ZSBmb3IgdGhpcyBmaWVsZC4gTGFyZ2VyIGZvbnQgc2l6ZXMgd2lsbCByZXN1bHQgaW4gbGFyZ2VyXG4gICAgICogdGV4dCBiZWluZyBkaXNwbGF5ZWQgd2hlbiBQREYgcmVhZGVycyByZW5kZXIgdGhpcyBidXR0b24uIEZvbnQgc2l6ZXMgbWF5XG4gICAgICogYmUgaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBTdXBwbHlpbmcgYSBuZWdhdGl2ZSBmb250IHNpemUgd2lsbFxuICAgICAqIGNhdXNlIHRoaXMgbWV0aG9kIHRvIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmdldEJ1dHRvbignc29tZS5idXR0b24uZmllbGQnKVxuICAgICAqIGJ1dHRvbi5zZXRGb250U2l6ZSg0KVxuICAgICAqIGJ1dHRvbi5zZXRGb250U2l6ZSgxNS43KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPiBUaGlzIG1ldGhvZCBkZXBlbmRzIHVwb24gdGhlIGV4aXN0ZW5jZSBvZiBhIGRlZmF1bHQgYXBwZWFyYW5jZVxuICAgICAqID4gKGAvREFgKSBzdHJpbmcuIElmIHRoaXMgZmllbGQgZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgYXBwZWFyYW5jZSBzdHJpbmcsXG4gICAgICogPiBvciB0aGF0IHN0cmluZyBkb2VzIG5vdCBjb250YWluIGEgZm9udCBzaXplICh2aWEgdGhlIGBUZmAgb3BlcmF0b3IpLFxuICAgICAqID4gdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvbnRTaXplIFRoZSBmb250IHNpemUgdG8gYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0ZXh0IGluIHRoaXMgZmllbGQuXG4gICAgICovXG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICBhc3NlcnRQb3NpdGl2ZShmb250U2l6ZSwgJ2ZvbnRTaXplJyk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGlzIGJ1dHRvbiBvbiB0aGUgc3BlY2lmaWVkIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gdGV4dC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB1YnVudHVGb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udCh1YnVudHVGb250Qnl0ZXMpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5jcmVhdGVCdXR0b24oJ3NvbWUuYnV0dG9uLmZpZWxkJylcbiAgICAgKlxuICAgICAqIGJ1dHRvbi5hZGRUb1BhZ2UoJ0RvIFN0dWZmJywgcGFnZSwge1xuICAgICAqICAgeDogNTAsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHdpZHRoOiAyMDAsXG4gICAgICogICBoZWlnaHQ6IDEwMCxcbiAgICAgKiAgIHRleHRDb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgYmFja2dyb3VuZENvbG9yOiByZ2IoMCwgMSwgMCksXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAsIDAsIDEpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoOTApLFxuICAgICAqICAgZm9udDogdWJ1bnR1Rm9udCxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgd2lkZ2V0IGZvciB0aGlzIGJ1dHRvbiBmaWVsZC5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBiZSBkaXNwbGF5ZWQgZm9yIHRoaXMgYnV0dG9uIHdpZGdldC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGlzIGJ1dHRvbiB3aWRnZXQgc2hvdWxkIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhpcyBidXR0b24gd2lkZ2V0LlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUuYWRkVG9QYWdlID0gZnVuY3Rpb24gKFxuICAgIC8vIFRPRE86IFRoaXMgbmVlZHMgdG8gYmUgb3B0aW9uYWwsIGUuZy4gZm9yIGltYWdlIGJ1dHRvbnNcbiAgICB0ZXh0LCBwYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2w7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHRleHQsICd0ZXh0JywgWydzdHJpbmcnXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHBhZ2UsICdwYWdlJywgW1tQREZQYWdlLCAnUERGUGFnZSddXSk7XG4gICAgICAgIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyBidXR0b25cbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0KHtcbiAgICAgICAgICAgIHg6ICgoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCkgLSAoKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwKSAvIDIsXG4gICAgICAgICAgICB5OiAoKF9jID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDApIC0gKChfZCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMCkgLyAyLFxuICAgICAgICAgICAgd2lkdGg6IChfZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMTAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2YgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiA1MCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogKF9nID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnRleHRDb2xvcikgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogcmdiKDAsIDAsIDApLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAoX2ggPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiByZ2IoMC43NSwgMC43NSwgMC43NSksXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfaiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9rID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGNhcHRpb246IHRleHQsXG4gICAgICAgICAgICBoaWRkZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oaWRkZW4sXG4gICAgICAgICAgICBwYWdlOiBwYWdlLnJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGlzIGZpZWxkXG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLmFkZFdpZGdldCh3aWRnZXRSZWYpO1xuICAgICAgICAvLyBTZXQgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciB3aWRnZXRcbiAgICAgICAgdmFyIGZvbnQgPSAoX2wgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZm9udCkgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogdGhpcy5kb2MuZ2V0Rm9ybSgpLmdldERlZmF1bHRGb250KCk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoZSBnaXZlbiBwYWdlXG4gICAgICAgIHBhZ2Uubm9kZS5hZGRBbm5vdCh3aWRnZXRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBidXR0b24gaGFzIGJlZW4gbWFya2VkIGFzIGRpcnR5LCBvciBpZiBhbnkgb2YgdGhpc1xuICAgICAqIGJ1dHRvbidzIHdpZGdldHMgZG8gbm90IGhhdmUgYW4gYXBwZWFyYW5jZSBzdHJlYW0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5nZXRCdXR0b24oJ3NvbWUuYnV0dG9uLmZpZWxkJylcbiAgICAgKiBpZiAoYnV0dG9uLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUoKSkgY29uc29sZS5sb2coJ05lZWRzIHVwZGF0ZScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBidXR0b24gbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLmlzRGlydHkoKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgaGFzQXBwZWFyYW5jZXMgPSAoKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWwpIGluc3RhbmNlb2YgUERGU3RyZWFtO1xuICAgICAgICAgICAgaWYgKCFoYXNBcHBlYXJhbmNlcylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGJ1dHRvbidzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBidXR0b25zLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5nZXRCdXR0b24oJ3NvbWUuYnV0dG9uLmZpZWxkJylcbiAgICAgKiBidXR0b24uZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERkJ1dHRvbi5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgdGhpcy51cGRhdGVBcHBlYXJhbmNlcyhmb250KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgYnV0dG9uJ3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBnaXZlbiBhcHBlYXJhbmNlIHByb3ZpZGVyLiBJZiBubyBgcHJvdmlkZXJgIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHRcbiAgICAgKiBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBidXR0b25zIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uZ2V0QnV0dG9uKCdzb21lLmJ1dHRvbi5maWVsZCcpXG4gICAgICogYnV0dG9uLnVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSwgKGZpZWxkLCB3aWRnZXQsIGZvbnQpID0+IHtcbiAgICAgKiAgIC4uLlxuICAgICAqICAgcmV0dXJuIHtcbiAgICAgKiAgICAgbm9ybWFsOiBkcmF3QnV0dG9uKC4uLiksXG4gICAgICogICAgIGRvd246IGRyYXdCdXR0b24oLi4uKSxcbiAgICAgKiAgIH1cbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIE9wdGlvbmFsbHksIHRoZSBhcHBlYXJhbmNlIHByb3ZpZGVyIHRvIGJlIHVzZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS51cGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250LCBwcm92aWRlcikge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwcm92aWRlciwgJ3Byb3ZpZGVyJywgW0Z1bmN0aW9uXSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIGFwUHJvdmlkZXIgPSBwcm92aWRlciAhPT0gbnVsbCAmJiBwcm92aWRlciAhPT0gdm9pZCAwID8gcHJvdmlkZXIgOiBkZWZhdWx0QnV0dG9uQXBwZWFyYW5jZVByb3ZpZGVyO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZXMgPSBub3JtYWxpemVBcHBlYXJhbmNlKGFwUHJvdmlkZXIodGhpcywgd2lkZ2V0LCBmb250KSk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZVdpdGhGb250KHdpZGdldCwgZm9udCwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0QnV0dG9uXV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZCdXR0b25dXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGQnV0dG9uXV0gZnJvbSBhbiBleGlzdGluZyBhY3JvUHVzaEJ1dHRvbiBhbmQgcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb1B1c2hCdXR0b24gVGhlIHVuZGVybHlpbmcgYFBERkFjcm9QdXNoQnV0dG9uYCBmb3IgdGhpcyBidXR0b24uXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBidXR0b24uXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhpcyBidXR0b24gd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGQnV0dG9uLm9mID0gZnVuY3Rpb24gKGFjcm9QdXNoQnV0dG9uLCByZWYsIGRvYykgeyByZXR1cm4gbmV3IFBERkJ1dHRvbihhY3JvUHVzaEJ1dHRvbiwgcmVmLCBkb2MpOyB9O1xuICAgIHJldHVybiBQREZCdXR0b247XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZCdXR0b247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZCdXR0b24uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGUGFnZSBmcm9tIFwiLi4vUERGUGFnZVwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQXBwZWFyYW5jZSwgZGVmYXVsdENoZWNrQm94QXBwZWFyYW5jZVByb3ZpZGVyLCB9IGZyb20gXCIuL2FwcGVhcmFuY2VzXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IFBERkZpZWxkLCB7IGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMsIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IFBERk5hbWUsIFBERkRpY3QsIFBERkFjcm9DaGVja0JveCwgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydE9yVW5kZWZpbmVkIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBjaGVjayBib3ggZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERkNoZWNrQm94XV0gZmllbGRzIGFyZSBpbnRlcmFjdGl2ZSBib3hlcyB0aGF0IHVzZXJzIGNhbiBjbGljayB3aXRoIHRoZWlyXG4gKiBtb3VzZS4gVGhpcyB0eXBlIG9mIFtbUERGRmllbGRdXSBoYXMgdHdvIHN0YXRlczogYG9uYCBhbmQgYG9mZmAuIFRoZSBwdXJwb3NlXG4gKiBvZiBhIGNoZWNrIGJveCBpcyB0byBlbmFibGUgdXNlcnMgdG8gc2VsZWN0IGZyb20gb25lIG9yIG1vcmUgb3B0aW9ucywgd2hlcmVcbiAqIGVhY2ggb3B0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIGNoZWNrIGJveC4gQ2hlY2sgYm94ZXMgYXJlIHR5cGljYWxseVxuICogc3F1YXJlIGluIHNoYXBlIGFuZCBkaXNwbGF5IGEgY2hlY2sgbWFyayB3aGVuIHRoZXkgYXJlIGluIHRoZSBgb25gIHN0YXRlLlxuICovXG52YXIgUERGQ2hlY2tCb3ggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkNoZWNrQm94LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkNoZWNrQm94KGFjcm9DaGVja0JveCwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb0NoZWNrQm94LCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb0NoZWNrQm94LCAnYWNyb0NoZWNrQm94JywgW1xuICAgICAgICAgICAgW1BERkFjcm9DaGVja0JveCwgJ1BERkFjcm9DaGVja0JveCddLFxuICAgICAgICBdKTtcbiAgICAgICAgX3RoaXMuYWNyb0ZpZWxkID0gYWNyb0NoZWNrQm94O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhpcyBjaGVjayBib3guIFRoaXMgb3BlcmF0aW9uIGlzIGFuYWxvZ291cyB0byBhIGh1bWFuIHVzZXIgY2xpY2tpbmdcbiAgICAgKiBhIGNoZWNrIGJveCB0byBmaWxsIGl0IGluIGEgUERGIHJlYWRlci4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlXG4gICAgICogdW5kZXJseWluZyBzdGF0ZSBvZiB0aGUgY2hlY2sgYm94IGZpZWxkIHRvIGluZGljYXRlIGl0IGhhcyBiZWVuIHNlbGVjdGVkLlxuICAgICAqIFBERiBsaWJyYXJpZXMgYW5kIHJlYWRlcnMgd2lsbCBiZSBhYmxlIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSBmcm9tIHRoZVxuICAgICAqIHNhdmVkIGRvY3VtZW50IGFuZCBkZXRlcm1pbmUgdGhhdCBpdCB3YXMgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5nZXRDaGVja0JveCgnc29tZS5jaGVja0JveC5maWVsZCcpXG4gICAgICogY2hlY2tCb3guY2hlY2soKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgY2hlY2sgYm94IGFzIGRpcnR5LCBjYXVzaW5nIGl0cyBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB0byBiZSB1cGRhdGVkIHdoZW4gZWl0aGVyIFtbUERGRG9jdW1lbnQuc2F2ZV1dIG9yXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBpcyBjYWxsZWQuIFRoZSB1cGRhdGVkIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHdpbGwgZGlzcGxheSBhIGNoZWNrIG1hcmsgaW5zaWRlIHRoZSB3aWRnZXRzIG9mIHRoaXMgY2hlY2sgYm94XG4gICAgICogZmllbGQuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBvblZhbHVlID0gKF9hID0gdGhpcy5hY3JvRmllbGQuZ2V0T25WYWx1ZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBQREZOYW1lLm9mKCdZZXMnKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZShvblZhbHVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGlzIGNoZWNrIGJveC4gVGhpcyBvcGVyYXRpb24gaXMgYW5hbG9nb3VzIHRvIGEgaHVtYW4gdXNlciBjbGlja2luZ1xuICAgICAqIGEgY2hlY2sgYm94IHRvIHVubWFyayBpdCBpbiBhIFBERiByZWFkZXIuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZVxuICAgICAqIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlIGNoZWNrIGJveCBmaWVsZCB0byBpbmRpY2F0ZSBpdCBoYXMgYmVlbiBkZXNlbGVjdGVkLlxuICAgICAqIFBERiBsaWJyYXJpZXMgYW5kIHJlYWRlcnMgd2lsbCBiZSBhYmxlIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSBmcm9tIHRoZVxuICAgICAqIHNhdmVkIGRvY3VtZW50IGFuZCBkZXRlcm1pbmUgdGhhdCBpdCB3YXMgbm90IHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ3NvbWUuY2hlY2tCb3guZmllbGQnKVxuICAgICAqIGNoZWNrQm94LnVuY2hlY2soKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgY2hlY2sgYm94IGFzIGRpcnR5LiBTZWUgW1tQREZDaGVja0JveC5jaGVja11dXG4gICAgICogZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLnVuY2hlY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWUoUERGTmFtZS5vZignT2ZmJykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBjaGVjayBib3ggaXMgc2VsZWN0ZWQgKGVpdGhlciBieSBhIGh1bWFuIHVzZXIgdmlhXG4gICAgICogYSBQREYgcmVhZGVyLCBvciBlbHNlIHByb2dyYW1tYXRpY2FsbHkgdmlhIHNvZnR3YXJlKS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ3NvbWUuY2hlY2tCb3guZmllbGQnKVxuICAgICAqIGlmIChjaGVja0JveC5pc0NoZWNrZWQoKSkgY29uc29sZS5sb2coJ2NoZWNrIGJveCBpcyBzZWxlY3RlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBjaGVjayBib3ggaXMgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLmlzQ2hlY2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9uVmFsdWUgPSB0aGlzLmFjcm9GaWVsZC5nZXRPblZhbHVlKCk7XG4gICAgICAgIHJldHVybiAhIW9uVmFsdWUgJiYgb25WYWx1ZSA9PT0gdGhpcy5hY3JvRmllbGQuZ2V0VmFsdWUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNob3cgdGhpcyBjaGVjayBib3ggb24gdGhlIHNwZWNpZmllZCBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmNyZWF0ZUNoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKlxuICAgICAqIGNoZWNrQm94LmFkZFRvUGFnZShwYWdlLCB7XG4gICAgICogICB4OiA1MCxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgd2lkdGg6IDI1LFxuICAgICAqICAgaGVpZ2h0OiAyNSxcbiAgICAgKiAgIHRleHRDb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgYmFja2dyb3VuZENvbG9yOiByZ2IoMCwgMSwgMCksXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAsIDAsIDEpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoOTApLFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB3aWRnZXQgZm9yIHRoaXMgY2hlY2sgYm94IGZpZWxkLlxuICAgICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIHdoaWNoIHRoaXMgY2hlY2sgYm94IHdpZGdldCBzaG91bGQgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGFkZGluZyB0aGlzIGNoZWNrIGJveCB3aWRnZXQuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLmFkZFRvUGFnZSA9IGZ1bmN0aW9uIChwYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIGlmICghKCd0ZXh0Q29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy50ZXh0Q29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdiYWNrZ3JvdW5kQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgPSByZ2IoMSwgMSwgMSk7XG4gICAgICAgIGlmICghKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYm9yZGVyV2lkdGgnIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDE7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyBjaGVjayBib3hcbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0KHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiA1MCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDUwLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2UgPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwLFxuICAgICAgICAgICAgcm90YXRlOiAoX2YgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGhpZGRlbjogb3B0aW9ucy5oaWRkZW4sXG4gICAgICAgICAgICBwYWdlOiBwYWdlLnJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGlzIGZpZWxkXG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLmFkZFdpZGdldCh3aWRnZXRSZWYpO1xuICAgICAgICAvLyBTZXQgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciB3aWRnZXRcbiAgICAgICAgd2lkZ2V0LnNldEFwcGVhcmFuY2VTdGF0ZShQREZOYW1lLm9mKCdPZmYnKSk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIFBERk5hbWUub2YoJ1llcycpKTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGUgZ2l2ZW4gcGFnZVxuICAgICAgICBwYWdlLm5vZGUuYWRkQW5ub3Qod2lkZ2V0UmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIGFueSBvZiB0aGlzIGNoZWNrIGJveCdzIHdpZGdldHMgZG8gbm90IGhhdmUgYW5cbiAgICAgKiBhcHBlYXJhbmNlIHN0cmVhbSBmb3IgaXRzIGN1cnJlbnQgc3RhdGUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKiBpZiAoY2hlY2tCb3gubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSBjb25zb2xlLmxvZygnTmVlZHMgdXBkYXRlJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGNoZWNrIGJveCBuZWVkcyBhbiBhcHBlYXJhbmNlIHVwZGF0ZS5cbiAgICAgKi9cbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZVN0YXRlKCk7XG4gICAgICAgICAgICB2YXIgbm9ybWFsID0gKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWw7XG4gICAgICAgICAgICBpZiAoIShub3JtYWwgaW5zdGFuY2VvZiBQREZEaWN0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSAmJiAhbm9ybWFsLmhhcyhzdGF0ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBjaGVjayBib3gncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgY2hlY2sgYm94ZXMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKiBjaGVja0JveC5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgY2hlY2sgYm94J3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBnaXZlbiBhcHBlYXJhbmNlIHByb3ZpZGVyLiBJZiBubyBgcHJvdmlkZXJgIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHRcbiAgICAgKiBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBjaGVjayBib3hzIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ3NvbWUuY2hlY2tCb3guZmllbGQnKVxuICAgICAqIGNoZWNrQm94LnVwZGF0ZUFwcGVhcmFuY2VzKChmaWVsZCwgd2lkZ2V0KSA9PiB7XG4gICAgICogICAuLi5cbiAgICAgKiAgIHJldHVybiB7XG4gICAgICogICAgIG5vcm1hbDogeyBvbjogZHJhd0NoZWNrQm94KC4uLiksIG9mZjogZHJhd0NoZWNrQm94KC4uLikgfSxcbiAgICAgKiAgICAgZG93bjogeyBvbjogZHJhd0NoZWNrQm94KC4uLiksIG9mZjogZHJhd0NoZWNrQm94KC4uLikgfSxcbiAgICAgKiAgIH1cbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBwcm92aWRlciBPcHRpb25hbGx5LCB0aGUgYXBwZWFyYW5jZSBwcm92aWRlciB0byBiZSB1c2VkIGZvclxuICAgICAqICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS51cGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHByb3ZpZGVyLCAncHJvdmlkZXInLCBbRnVuY3Rpb25dKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIG9uVmFsdWUgPSAoX2EgPSB3aWRnZXQuZ2V0T25WYWx1ZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBQREZOYW1lLm9mKCdZZXMnKTtcbiAgICAgICAgICAgIGlmICghb25WYWx1ZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIG9uVmFsdWUsIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICh3aWRnZXQsIG9uVmFsdWUsIHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciBhcFByb3ZpZGVyID0gcHJvdmlkZXIgIT09IG51bGwgJiYgcHJvdmlkZXIgIT09IHZvaWQgMCA/IHByb3ZpZGVyIDogZGVmYXVsdENoZWNrQm94QXBwZWFyYW5jZVByb3ZpZGVyO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZXMgPSBub3JtYWxpemVBcHBlYXJhbmNlKGFwUHJvdmlkZXIodGhpcywgd2lkZ2V0KSk7XG4gICAgICAgIHRoaXMudXBkYXRlT25PZmZXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgb25WYWx1ZSwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0Q2hlY2tCb3hdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlIGFuXG4gICAgICogPiBpbnN0YW5jZSBvZiBbW1BERkNoZWNrQm94XV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkNoZWNrQm94XV0gZnJvbSBhbiBleGlzdGluZyBhY3JvQ2hlY2tCb3ggYW5kIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9DaGVja0JveCBUaGUgdW5kZXJseWluZyBgUERGQWNyb0NoZWNrQm94YCBmb3IgdGhpcyBjaGVjayBib3guXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBjaGVjayBib3guXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhpcyBjaGVjayBib3ggd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gub2YgPSBmdW5jdGlvbiAoYWNyb0NoZWNrQm94LCByZWYsIGRvYykge1xuICAgICAgICByZXR1cm4gbmV3IFBERkNoZWNrQm94KGFjcm9DaGVja0JveCwgcmVmLCBkb2MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkNoZWNrQm94O1xufShQREZGaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQ2hlY2tCb3g7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZDaGVja0JveC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuLi9QREZQYWdlXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi4vUERGRm9udFwiO1xuaW1wb3J0IFBERkZpZWxkLCB7IGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMsIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUFwcGVhcmFuY2UsIGRlZmF1bHREcm9wZG93bkFwcGVhcmFuY2VQcm92aWRlciwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuaW1wb3J0IHsgcmdiIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFBERkhleFN0cmluZywgUERGU3RyZWFtLCBQREZBY3JvQ29tYm9Cb3gsIEFjcm9DaG9pY2VGbGFncywgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydE9yVW5kZWZpbmVkLCBhc3NlcnRQb3NpdGl2ZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgZHJvcGRvd24gZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERkRyb3Bkb3duXV0gZmllbGRzIGFyZSBpbnRlcmFjdGl2ZSB0ZXh0IGJveGVzIHRoYXQgZGlzcGxheSBhIHNpbmdsZVxuICogZWxlbWVudCAodGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWx1ZSkuIFRoZSBwdXJwb3NlIG9mIGEgZHJvcGRvd24gaXMgdG9cbiAqIGVuYWJsZSB1c2VycyB0byBzZWxlY3QgYSBzaW5nbGUgb3B0aW9uIGZyb20gYSBzZXQgb2YgcG9zc2libGUgb3B0aW9ucy4gVXNlcnNcbiAqIGNhbiBjbGljayBvbiBhIGRyb3Bkb3duIHRvIHZpZXcgdGhlIGZ1bGwgbGlzdCBvZiBvcHRpb25zIGl0IHByb3ZpZGVzLlxuICogQ2xpY2tpbmcgb24gYW4gb3B0aW9uIGluIHRoZSBsaXN0IHdpbGwgY2F1c2UgaXQgdG8gYmUgc2VsZWN0ZWQgYW5kIGRpc3BsYXllZFxuICogaW4gdGhlIGRyb3Bkb3duJ3MgdGV4dCBib3guIFNvbWUgZHJvcGRvd25zIGFsbG93IHVzZXJzIHRvIGVudGVyIHRleHRcbiAqIGRpcmVjdGx5IGludG8gdGhlIGJveCBmcm9tIHRoZWlyIGtleWJvYXJkLCByYXRoZXIgdGhhbiBvbmx5IGJlaW5nIGFsbG93ZWQgdG9cbiAqIGNob29zZSBhbiBvcHRpb24gZnJvbSB0aGUgbGlzdCAoc2VlIFtbUERGRHJvcGRvd24uaXNFZGl0YWJsZV1dKS5cbiAqL1xudmFyIFBERkRyb3Bkb3duID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZEcm9wZG93biwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZEcm9wZG93bihhY3JvQ29tYm9Cb3gsIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9Db21ib0JveCwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9Db21ib0JveCwgJ2Fjcm9Db21ib0JveCcsIFtcbiAgICAgICAgICAgIFtQREZBY3JvQ29tYm9Cb3gsICdQREZBY3JvQ29tYm9Cb3gnXSxcbiAgICAgICAgXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9Db21ib0JveDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMgZm9yIHRoaXMgZHJvcGRvd24uIFRoZXNlIG9wdGlvbnMgd2lsbCBiZVxuICAgICAqIGRpc3BsYXllZCB0byB1c2VycyB3aG8gY2xpY2sgb24gdGhpcyBkcm9wZG93biBpbiBhIFBERiByZWFkZXIuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSBkcm9wZG93bi5nZXRPcHRpb25zKClcbiAgICAgKiBjb25zb2xlLmxvZygnRHJvcGRvd24gb3B0aW9uczonLCBvcHRpb25zKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpb25zIGZvciB0aGlzIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmF3T3B0aW9ucyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBuZXcgQXJyYXkocmF3T3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gcmF3T3B0aW9uc1tpZHhdLCBkaXNwbGF5ID0gX2EuZGlzcGxheSwgdmFsdWUgPSBfYS52YWx1ZTtcbiAgICAgICAgICAgIG9wdGlvbnNbaWR4XSA9IChkaXNwbGF5ICE9PSBudWxsICYmIGRpc3BsYXkgIT09IHZvaWQgMCA/IGRpc3BsYXkgOiB2YWx1ZSkuZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZWxlY3RlZCBvcHRpb25zIGZvciB0aGlzIGRyb3Bkb3duLiBUaGVzZSBhcmUgdGhlIHZhbHVlcyB0aGF0IHdlcmVcbiAgICAgKiBzZWxlY3RlZCBieSBhIGh1bWFuIHVzZXIgdmlhIGEgUERGIHJlYWRlciwgb3IgcHJvZ3JhbWF0aWNhbGx5IHZpYVxuICAgICAqIHNvZnR3YXJlLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBjb25zdCBzZWxlY3Rpb25zID0gZHJvcGRvd24uZ2V0U2VsZWN0ZWQoKVxuICAgICAqIGNvbnNvbGUubG9nKCdEcm9wZG93biBzZWxlY3Rpb25zOicsIHNlbGVjdGlvbnMpXG4gICAgICogYGBgXG4gICAgICogPiAqKk5PVEU6KiogTm90ZSB0aGF0IFBERiByZWFkZXJzIG9ubHkgZGlzcGxheSBvbmUgc2VsZWN0ZWQgb3B0aW9uIHdoZW5cbiAgICAgKiA+IHJlbmRlcmluZyBkcm9wZG93bnMuIEhvd2V2ZXIsIHRoZSBQREYgc3BlY2lmaWNhdGlvbiBkb2VzIGFsbG93IGZvclxuICAgICAqID4gbXVsdGlwbGUgdmFsdWVzIHRvIGJlIHNlbGVjdGVkIGluIGEgZHJvcGRvd24uIEFzIHN1Y2gsIHRoZSBgcGRmLWxpYmBcbiAgICAgKiA+IEFQSSBzdXBwb3J0cyB0aGlzLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIHRoZSBhcnJheSByZXR1cm5lZCBieSB0aGlzXG4gICAgICogPiBtZXRob2Qgd2lsbCBjb250YWluIG9ubHkgYSBzaW5nbGUgZWxlbWVudCAob3Igbm8gZWxlbWVudHMpLlxuICAgICAqIEByZXR1cm5zIFRoZSBzZWxlY3RlZCBvcHRpb25zIGluIHRoaXMgZHJvcGRvd24uXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmdldFNlbGVjdGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0VmFsdWVzKCk7XG4gICAgICAgIHZhciBzZWxlY3RlZCA9IG5ldyBBcnJheSh2YWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgc2VsZWN0ZWRbaWR4XSA9IHZhbHVlc1tpZHhdLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgZHJvcGRvd24uIFRoZXNlIGFyZVxuICAgICAqIHRoZSB2YWx1ZXMgdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgdG8gc2VsZWN0IHdoZW4gdGhleSB2aWV3IHRoaXNcbiAgICAgKiBkcm9wZG93biBpbiBhIFBERiByZWFkZXIuIE5vdGUgdGhhdCBwcmVleGlzdGluZyBvcHRpb25zIGZvciB0aGlzIGRyb3Bkb3duXG4gICAgICogd2lsbCBiZSByZW1vdmVkLiBPbmx5IHRoZSB2YWx1ZXMgcGFzc2VkIGFzIGBvcHRpb25zYCB3aWxsIGJlIGF2YWlsYWJsZSB0b1xuICAgICAqIHNlbGVjdC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bigncGxhbmV0cy5kcm9wZG93bicpXG4gICAgICogZHJvcGRvd24uc2V0T3B0aW9ucyhbJ0VhcnRoJywgJ01hcnMnLCAnUGx1dG8nLCAnVmVudXMnXSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhpcyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMsICdvcHRpb25zJywgW0FycmF5XSk7XG4gICAgICAgIHZhciBvcHRpb25PYmplY3RzID0gbmV3IEFycmF5KG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG9wdGlvbk9iamVjdHNbaWR4XSA9IHsgdmFsdWU6IFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb25zW2lkeF0pIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0T3B0aW9ucyhvcHRpb25PYmplY3RzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCB0byB0aGUgbGlzdCBvZiBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBkcm9wZG93bi4gVXNlcnNcbiAgICAgKiB3aWxsIGJlIGFibGUgdG8gc2VsZWN0IHRoZXNlIHZhbHVlcyBpbiBhIFBERiByZWFkZXIuIEluIGFkZGl0aW9uIHRvIHRoZVxuICAgICAqIHZhbHVlcyBwYXNzZWQgYXMgYG9wdGlvbnNgLCBhbnkgcHJlZXhpc3Rpbmcgb3B0aW9ucyBmb3IgdGhpcyBkcm9wZG93biB3aWxsXG4gICAgICogc3RpbGwgYmUgYXZhaWxhYmxlIGZvciB1c2VycyB0byBzZWxlY3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3JvY2tldHMuZHJvcGRvd24nKVxuICAgICAqIGRyb3Bkb3duLmFkZE9wdGlvbnMoWydTYXR1cm4gSVYnLCAnRmFsY29uIEhlYXZ5J10pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTmV3IG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoaXMgZHJvcGRvd24uXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmFkZE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLCAnb3B0aW9ucycsIFsnc3RyaW5nJywgQXJyYXldKTtcbiAgICAgICAgdmFyIG9wdGlvbnNBcnIgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IFtvcHRpb25zXTtcbiAgICAgICAgdmFyIGV4aXN0aW5nT3B0aW9ucyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIG5ld09wdGlvbnMgPSBuZXcgQXJyYXkob3B0aW9uc0Fyci5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zQXJyLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgbmV3T3B0aW9uc1tpZHhdID0geyB2YWx1ZTogUERGSGV4U3RyaW5nLmZyb21UZXh0KG9wdGlvbnNBcnJbaWR4XSkgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRPcHRpb25zKGV4aXN0aW5nT3B0aW9ucy5jb25jYXQobmV3T3B0aW9ucykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2VsZWN0IG9uZSBvciBtb3JlIHZhbHVlcyBmb3IgdGhpcyBkcm9wZG93bi4gVGhpcyBvcGVyYXRpb24gaXMgYW5hbG9nb3VzXG4gICAgICogdG8gYSBodW1hbiB1c2VyIG9wZW5pbmcgdGhlIGRyb3Bkb3duIGluIGEgUERGIHJlYWRlciBhbmQgY2xpY2tpbmcgb24gYVxuICAgICAqIHZhbHVlIHRvIHNlbGVjdCBpdC4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlXG4gICAgICogZHJvcGRvd24gdG8gaW5kaWNhdGUgd2hpY2ggdmFsdWVzIGhhdmUgYmVlbiBzZWxlY3RlZC4gUERGIGxpYnJhcmllcyBhbmRcbiAgICAgKiByZWFkZXJzIHdpbGwgYmUgYWJsZSB0byBleHRyYWN0IHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBzYXZlZCBkb2N1bWVudCBhbmRcbiAgICAgKiBkZXRlcm1pbmUgd2hpY2ggdmFsdWVzIHdlcmUgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignYmVzdC5zdXBlcmhlcm8uZHJvcGRvd24nKVxuICAgICAqIGRyb3Bkb3duLnNlbGVjdCgnT25lIFB1bmNoIE1hbicpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyBkcm9wZG93biBhcyBkaXJ0eSwgY2F1c2luZyBpdHMgYXBwZWFyYW5jZVxuICAgICAqIHN0cmVhbXMgdG8gYmUgdXBkYXRlZCB3aGVuIGVpdGhlciBbW1BERkRvY3VtZW50LnNhdmVdXSBvclxuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gaXMgY2FsbGVkLiBUaGUgdXBkYXRlZCBzdHJlYW1zIHdpbGxcbiAgICAgKiBkaXNwbGF5IHRoZSBzZWxlY3RlZCBvcHRpb24gaW5zaWRlIHRoZSB3aWRnZXRzIG9mIHRoaXMgZHJvcGRvd24uXG4gICAgICpcbiAgICAgKiAqKklNUE9SVEFOVDoqKiBUaGUgZGVmYXVsdCBmb250IHVzZWQgdG8gdXBkYXRlIGFwcGVhcmFuY2Ugc3RyZWFtcyBpc1xuICAgICAqIFtbU3RhbmRhcmRGb250cy5IZWx2ZXRpY2FdXS4gTm90ZSB0aGF0IHRoaXMgaXMgYSBXaW5BbnNpIGZvbnQuIFRoaXMgbWVhbnNcbiAgICAgKiB0aGF0IGVuY29kaW5nIGVycm9ycyB3aWxsIGJlIHRocm93biBpZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGZvciB0aGlzIGZpZWxkXG4gICAgICogY29udGFpbnMgY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBXaW5BbnNpIGNoYXJhY3RlciBzZXQgKHRoZSBsYXRpbiBhbHBoYWJldCkuXG4gICAgICpcbiAgICAgKiBFbWJlZGRpbmcgYSBjdXN0b20gZm9udCBhbmQgcGFzc2luZyBpdCB0b1xuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gb3IgW1tQREZEcm9wZG93bi51cGRhdGVBcHBlYXJhbmNlc11dXG4gICAgICogYWxsb3dzIHlvdSB0byBnZW5lcmF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgd2l0aCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlXG4gICAgICogbGF0aW4gYWxwaGFiZXQgKGFzc3VtaW5nIHRoZSBjdXN0b20gZm9udCBzdXBwb3J0cyB0aGVtKS5cbiAgICAgKlxuICAgICAqIFNlbGVjdGluZyBhbiBvcHRpb24gdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGRyb3Bkb3duJ3Mgb3B0aW9uIGxpc3RcbiAgICAgKiAoc2VlIFtbUERGRHJvcGRvd24uZ2V0T3B0aW9uc11dKSB3aWxsIGVuYWJsZSBlZGl0aW5nIG9uIHRoaXMgZHJvcGRvd25cbiAgICAgKiAoc2VlIFtbUERGRHJvcGRvd24uZW5hYmxlRWRpdGluZ11dKS5cbiAgICAgKlxuICAgICAqID4gKipOT1RFOioqIFBERiByZWFkZXJzIG9ubHkgZGlzcGxheSBvbmUgc2VsZWN0ZWQgb3B0aW9uIHdoZW4gcmVuZGVyaW5nXG4gICAgICogPiBkcm9wZG93bnMuIEhvd2V2ZXIsIHRoZSBQREYgc3BlY2lmaWNhdGlvbiBkb2VzIGFsbG93IGZvciBtdWx0aXBsZSB2YWx1ZXNcbiAgICAgKiA+IHRvIGJlIHNlbGVjdGVkIGluIGEgZHJvcGRvd24uIEFzIHN1Y2gsIHRoZSBgcGRmLWxpYmAgQVBJIHN1cHBvcnRzIHRoaXMuXG4gICAgICogPiBIb3dldmVyLCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gc2VsZWN0IG1vcmUgdGhhbiBvbmUgdmFsdWUgd2l0aCB0aGlzXG4gICAgICogPiBtZXRob2QsIGFzIG9ubHkgb25lIHdpbGwgYmUgdmlzaWJsZS4gW1tQREZPcHRpb25MaXN0XV0gZmllbGRzIGFyZSBiZXR0ZXJcbiAgICAgKiA+IHN1aXRlZCBmb3IgZGlzcGxheWluZyBtdWx0aXBsZSBzZWxlY3RlZCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSBzZWxlY3RlZC5cbiAgICAgKiBAcGFyYW0gbWVyZ2UgV2hldGhlciBvciBub3QgZXhpc3Rpbmcgc2VsZWN0aW9ucyBzaG91bGQgYmUgcHJlc2VydmVkLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbiAob3B0aW9ucywgbWVyZ2UpIHtcbiAgICAgICAgaWYgKG1lcmdlID09PSB2b2lkIDApIHsgbWVyZ2UgPSBmYWxzZTsgfVxuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLCAnb3B0aW9ucycsIFsnc3RyaW5nJywgQXJyYXldKTtcbiAgICAgICAgYXNzZXJ0SXMobWVyZ2UsICdtZXJnZScsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgdmFyIG9wdGlvbnNBcnIgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IFtvcHRpb25zXTtcbiAgICAgICAgdmFyIHZhbGlkT3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICB2YXIgaGFzQ3VzdG9tT3B0aW9uID0gb3B0aW9uc0Fyci5maW5kKGZ1bmN0aW9uIChvcHRpb24pIHsgcmV0dXJuICF2YWxpZE9wdGlvbnMuaW5jbHVkZXMob3B0aW9uKTsgfSk7XG4gICAgICAgIGlmIChoYXNDdXN0b21PcHRpb24pXG4gICAgICAgICAgICB0aGlzLmVuYWJsZUVkaXRpbmcoKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICBpZiAob3B0aW9uc0Fyci5sZW5ndGggPiAxIHx8IChvcHRpb25zQXJyLmxlbmd0aCA9PT0gMSAmJiBtZXJnZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlTXVsdGlzZWxlY3QoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVzID0gbmV3IEFycmF5KG9wdGlvbnNBcnIubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9uc0Fyci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhbHVlc1tpZHhdID0gUERGSGV4U3RyaW5nLmZyb21UZXh0KG9wdGlvbnNBcnJbaWR4XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlcyhleGlzdGluZ1ZhbHVlcy5jb25jYXQodmFsdWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZXModmFsdWVzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHNlbGVjdGVkIHZhbHVlcyBmb3IgdGhpcyBkcm9wZG93bi4gVGhpcyBvcGVyYXRpb24gaXMgZXF1aXZhbGVudFxuICAgICAqIHRvIHNlbGVjdGluZyBhbiBlbXB0eSBsaXN0LiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBzdGF0ZVxuICAgICAqIG9mIHRoZSBkcm9wZG93biB0byBpbmRpY2F0ZSB0aGF0IG5vIHZhbHVlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmNsZWFyKClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWUgW1tQREZEcm9wZG93bi5zZWxlY3RdXVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZXMoW10pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmb250IHNpemUgZm9yIHRoaXMgZmllbGQuIExhcmdlciBmb250IHNpemVzIHdpbGwgcmVzdWx0IGluIGxhcmdlclxuICAgICAqIHRleHQgYmVpbmcgZGlzcGxheWVkIHdoZW4gUERGIHJlYWRlcnMgcmVuZGVyIHRoaXMgZHJvcGRvd24uIEZvbnQgc2l6ZXMgbWF5XG4gICAgICogYmUgaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBTdXBwbHlpbmcgYSBuZWdhdGl2ZSBmb250IHNpemUgd2lsbFxuICAgICAqIGNhdXNlIHRoaXMgbWV0aG9kIHRvIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLnNldEZvbnRTaXplKDQpXG4gICAgICogZHJvcGRvd24uc2V0Rm9udFNpemUoMTUuNylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqID4gVGhpcyBtZXRob2QgZGVwZW5kcyB1cG9uIHRoZSBleGlzdGVuY2Ugb2YgYSBkZWZhdWx0IGFwcGVhcmFuY2VcbiAgICAgKiA+IChgL0RBYCkgc3RyaW5nLiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGFwcGVhcmFuY2Ugc3RyaW5nLFxuICAgICAqID4gb3IgdGhhdCBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhIGZvbnQgc2l6ZSAodmlhIHRoZSBgVGZgIG9wZXJhdG9yKSxcbiAgICAgKiA+IHRoZW4gdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb250U2l6ZSBUaGUgZm9udCBzaXplIHRvIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGV4dCBpbiB0aGlzIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICBhc3NlcnRQb3NpdGl2ZShmb250U2l6ZSwgJ2ZvbnRTaXplJyk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdXNlcnMgYXJlIGFsbG93ZWQgdG8gZWRpdCB0aGUgc2VsZWN0ZWQgdmFsdWUgb2YgdGhpc1xuICAgICAqIGRyb3Bkb3duIGRpcmVjdGx5IGFuZCBhcmUgbm90IGNvbnN0cmFpbmVkIGJ5IHRoZSBsaXN0IG9mIGF2YWlsYWJsZVxuICAgICAqIG9wdGlvbnMuIFNlZSBbW1BERkRyb3Bkb3duLmVuYWJsZUVkaXRpbmddXSBhbmRcbiAgICAgKiBbW1BERkRyb3Bkb3duLmRpc2FibGVFZGl0aW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBpZiAoZHJvcGRvd24uaXNFZGl0YWJsZSgpKSBjb25zb2xlLmxvZygnRWRpdGluZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGRyb3Bkb3duIGlzIGVkaXRhYmxlLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5pc0VkaXRhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuRWRpdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2VycyB0byBlZGl0IHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGlzIGRyb3Bkb3duIGluIFBERiByZWFkZXJzXG4gICAgICogd2l0aCB0aGVpciBrZXlib2FyZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGlzIGRyb3Bkb3duXG4gICAgICogd2lsbCBub3QgYmUgY29uc3RyYWluZWQgYnkgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMuIEhvd2V2ZXIsIGlmIHRoaXNcbiAgICAgKiBkcm9wZG93biBoYXMgYW55IGF2YWlsYWJsZSBvcHRpb25zLCB1c2VycyB3aWxsIHN0aWxsIGJlIGFsbG93ZWQgdG8gc2VsZWN0XG4gICAgICogZnJvbSB0aGF0IGxpc3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmVuYWJsZUVkaXRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5lbmFibGVFZGl0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkVkaXQsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IHVzZXJzIHRvIGVkaXQgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoaXMgZHJvcGRvd24gaW4gUERGXG4gICAgICogcmVhZGVycyB3aXRoIHRoZWlyIGtleWJvYXJkLiBUaGlzIHdpbGwgY29uc3RyYWluIHRoZSBzZWxlY3RlZCB2YWx1ZSBvZlxuICAgICAqIHRoaXMgZHJvcGRvd24gdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMuIFVzZXJzIHdpbGwgb25seSBiZSBhYmxlXG4gICAgICogdG8gc2VsZWN0IGFuIG9wdGlvbiBmcm9tIHRoYXQgbGlzdC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZGlzYWJsZUVkaXRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5kaXNhYmxlRWRpdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5FZGl0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb3B0aW9uIGxpc3Qgb2YgdGhpcyBkcm9wZG93biBpcyBhbHdheXMgZGlzcGxheWVkXG4gICAgICogaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBpcnJlc3BlY3RpdmUgb2YgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBvcHRpb25zXG4gICAgICogd2VyZSBhZGRlZCB0byB0aGUgZHJvcGRvd24uIFNlZSBbW1BERkRyb3Bkb3duLmVuYWJsZVNvcnRpbmddXSBhbmRcbiAgICAgKiBbW1BERkRyb3Bkb3duLmRpc2FibGVTb3J0aW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBpZiAoZHJvcGRvd24uaXNTb3J0ZWQoKSkgY29uc29sZS5sb2coJ1NvcnRpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBkcm9wZG93bidzIG9wdGlvbnMgYXJlIHNvcnRlZC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuaXNTb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5Tb3J0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsd2F5cyBkaXNwbGF5IHRoZSBvcHRpb24gbGlzdCBvZiB0aGlzIGRyb3Bkb3duIGluIGFscGhhYmV0aWNhbCBvcmRlcixcbiAgICAgKiBpcnJlc3BlY3RpdmUgb2YgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBvcHRpb25zIHdlcmUgYWRkZWQgdG8gdGhpcyBkcm9wZG93bi5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZW5hYmxlU29ydGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmVuYWJsZVNvcnRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgYWx3YXlzIGRpc3BsYXkgdGhlIG9wdGlvbiBsaXN0IG9mIHRoaXMgZHJvcGRvd24gaW4gYWxwaGFiZXRpY2FsXG4gICAgICogb3JkZXIuIEluc3RlYWQsIGRpc3BsYXkgdGhlIG9wdGlvbnMgaW4gd2hpY2hldmVyIG9yZGVyIHRoZXkgd2VyZSBhZGRlZFxuICAgICAqIHRvIHRoZSBsaXN0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZGlzYWJsZVNvcnRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5kaXNhYmxlU29ydGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Tb3J0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBtdWx0aXBsZSBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZCBmcm9tIHRoaXMgZHJvcGRvd24nc1xuICAgICAqIG9wdGlvbiBsaXN0LiBTZWUgW1tQREZEcm9wZG93bi5lbmFibGVNdWx0aXNlbGVjdF1dIGFuZFxuICAgICAqIFtbUERGRHJvcGRvd24uZGlzYWJsZU11bHRpc2VsZWN0XV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBpZiAoZHJvcGRvd24uaXNNdWx0aXNlbGVjdCgpKSBjb25zb2xlLmxvZygnTXVsdGlzZWxlY3QgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmlzTXVsdGlzZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5NdWx0aVNlbGVjdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2VycyB0byBzZWxlY3QgbW9yZSB0aGFuIG9uZSBvcHRpb24gZnJvbSB0aGlzIGRyb3Bkb3duJ3Mgb3B0aW9uXG4gICAgICogbGlzdC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmVuYWJsZU11bHRpc2VsZWN0KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZW5hYmxlTXVsdGlzZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IHVzZXJzIHRvIHNlbGVjdCBtb3JlIHRoYW4gb25lIG9wdGlvbiBmcm9tIHRoaXMgZHJvcGRvd24nc1xuICAgICAqIG9wdGlvbiBsaXN0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZGlzYWJsZU11bHRpc2VsZWN0KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZGlzYWJsZU11bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHNob3VsZCBiZSBzcGVsbCBjaGVja2VkIGJ5IFBERlxuICAgICAqIHJlYWRlcnMuIFNwZWxsIGNoZWNraW5nIHdpbGwgb25seSBiZSBwZXJmb3JtZWQgaWYgdGhpcyBkcm9wZG93biBhbGxvd3NcbiAgICAgKiBlZGl0aW5nIChzZWUgW1tQREZEcm9wZG93bi5pc0VkaXRhYmxlXV0pLiBTZWVcbiAgICAgKiBbW1BERkRyb3Bkb3duLmVuYWJsZVNwZWxsQ2hlY2tpbmddXSBhbmRcbiAgICAgKiBbW1BERkRyb3Bkb3duLmRpc2FibGVTcGVsbENoZWNraW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBpZiAoZHJvcGRvd24uaXNTcGVsbENoZWNrZWQoKSkgY29uc29sZS5sb2coJ1NwZWxsIGNoZWNraW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZHJvcGRvd24gY2FuIGJlIHNwZWxsIGNoZWNrZWQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmlzU3BlbGxDaGVja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLkRvTm90U3BlbGxDaGVjayk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBQREYgcmVhZGVycyB0byBzcGVsbCBjaGVjayB0aGUgc2VsZWN0ZWQgb3B0aW9uIG9mIHRoaXMgZHJvcGRvd24uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmVuYWJsZVNwZWxsQ2hlY2tpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5lbmFibGVTcGVsbENoZWNraW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkRvTm90U3BlbGxDaGVjaywgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IFBERiByZWFkZXJzIHRvIHNwZWxsIGNoZWNrIHRoZSBzZWxlY3RlZCBvcHRpb24gb2YgdGhpc1xuICAgICAqIGRyb3Bkb3duLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZGlzYWJsZVNwZWxsQ2hlY2tpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5kaXNhYmxlU3BlbGxDaGVja2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Eb05vdFNwZWxsQ2hlY2ssIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9wdGlvbiBzZWxlY3RlZCBieSBhIHVzZXIgaXMgc3RvcmVkLCBvciBcImNvbW1pdHRlZFwiLFxuICAgICAqIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBvcHRpb24uIFRoZSBhbHRlcm5hdGl2ZSBpcyB0aGF0IHRoZSB1c2VyJ3NcbiAgICAgKiBzZWxlY3Rpb24gaXMgc3RvcmVkIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoaXMgZHJvcGRvd24gZmllbGQgKGJ5IGNsaWNraW5nXG4gICAgICogb3V0c2lkZSBvZiBpdCAtIG9uIGFub3RoZXIgZmllbGQsIGZvciBleGFtcGxlKS4gU2VlXG4gICAgICogW1tQREZEcm9wZG93bi5lbmFibGVTZWxlY3RPbkNsaWNrXV0gYW5kXG4gICAgICogW1tQREZEcm9wZG93bi5kaXNhYmxlU2VsZWN0T25DbGlja11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogaWYgKGRyb3Bkb3duLmlzU2VsZWN0T25DbGljaygpKSBjb25zb2xlLmxvZygnU2VsZWN0IG9uIGNsaWNrIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IG9wdGlvbnMgYXJlIHNlbGVjdGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZXkgYXJlXG4gICAgICogICAgICAgICAgY2xpY2tlZC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuaXNTZWxlY3RPbkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuQ29tbWl0T25TZWxDaGFuZ2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3RvcmUgdGhlIG9wdGlvbiBzZWxlY3RlZCBieSBhIHVzZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZXIgY2xpY2tzIHRoZVxuICAgICAqIG9wdGlvbi4gRG8gbm90IHdhaXQgZm9yIHRoZSB1c2VyIHRvIGxlYXZlIHRoaXMgZHJvcGRvd24gZmllbGQgKGJ5IGNsaWNraW5nXG4gICAgICogb3V0c2lkZSBvZiBpdCAtIG9uIGFub3RoZXIgZmllbGQsIGZvciBleGFtcGxlKS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmVuYWJsZVNlbGVjdE9uQ2xpY2soKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5lbmFibGVTZWxlY3RPbkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkNvbW1pdE9uU2VsQ2hhbmdlLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdhaXQgdG8gc3RvcmUgdGhlIG9wdGlvbiBzZWxlY3RlZCBieSBhIHVzZXIgdW50aWwgdGhleSBsZWF2ZSB0aGlzIGRyb3Bkb3duXG4gICAgICogZmllbGQgKGJ5IGNsaWNraW5nIG91dHNpZGUgb2YgaXQgLSBvbiBhbm90aGVyIGZpZWxkLCBmb3IgZXhhbXBsZSkuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmRpc2FibGVTZWxlY3RPbkNsaWNrKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZGlzYWJsZVNlbGVjdE9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuQ29tbWl0T25TZWxDaGFuZ2UsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNob3cgdGhpcyBkcm9wZG93biBvbiB0aGUgc3BlY2lmaWVkIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdWJ1bnR1Rm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQodWJ1bnR1Rm9udEJ5dGVzKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5jcmVhdGVEcm9wZG93bignYmVzdC5ndW5kYW0nKVxuICAgICAqIGRyb3Bkb3duLnNldE9wdGlvbnMoWydFeGlhJywgJ0R5bmFtZXMnXSlcbiAgICAgKiBkcm9wZG93bi5zZWxlY3QoJ0V4aWEnKVxuICAgICAqXG4gICAgICogZHJvcGRvd24uYWRkVG9QYWdlKHBhZ2UsIHtcbiAgICAgKiAgIHg6IDUwLFxuICAgICAqICAgeTogNzUsXG4gICAgICogICB3aWR0aDogMjAwLFxuICAgICAqICAgaGVpZ2h0OiAxMDAsXG4gICAgICogICB0ZXh0Q29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgIGJhY2tncm91bmRDb2xvcjogcmdiKDAsIDEsIDApLFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLCAwLCAxKSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDkwKSxcbiAgICAgKiAgIGZvbnQ6IHVidW50dUZvbnQsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHdpZGdldCBmb3IgdGhpcyBkcm9wZG93biBmaWVsZC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGlzIGRyb3Bkb3duIHdpZGdldCBzaG91bGQgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGFkZGluZyB0aGlzIGRyb3Bkb3duIHdpZGdldC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuYWRkVG9QYWdlID0gZnVuY3Rpb24gKHBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIGlmICghKCd0ZXh0Q29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy50ZXh0Q29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdiYWNrZ3JvdW5kQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgPSByZ2IoMSwgMSwgMSk7XG4gICAgICAgIGlmICghKCdib3JkZXJDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYm9yZGVyV2lkdGgnIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDE7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyBkcm9wZG93blxuICAgICAgICB2YXIgd2lkZ2V0ID0gdGhpcy5jcmVhdGVXaWRnZXQoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwLFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwLFxuICAgICAgICAgICAgd2lkdGg6IChfYyA9IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDIwMCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDUwLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2UgPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwLFxuICAgICAgICAgICAgcm90YXRlOiAoX2YgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGhpZGRlbjogb3B0aW9ucy5oaWRkZW4sXG4gICAgICAgICAgICBwYWdlOiBwYWdlLnJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGlzIGZpZWxkXG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLmFkZFdpZGdldCh3aWRnZXRSZWYpO1xuICAgICAgICAvLyBTZXQgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciB3aWRnZXRcbiAgICAgICAgdmFyIGZvbnQgPSAoX2cgPSBvcHRpb25zLmZvbnQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHRoaXMuZG9jLmdldEZvcm0oKS5nZXREZWZhdWx0Rm9udCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGUgZ2l2ZW4gcGFnZVxuICAgICAgICBwYWdlLm5vZGUuYWRkQW5ub3Qod2lkZ2V0UmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgZHJvcGRvd24gaGFzIGJlZW4gbWFya2VkIGFzIGRpcnR5LCBvciBpZiBhbnkgb2ZcbiAgICAgKiB0aGlzIGRyb3Bkb3duJ3Mgd2lkZ2V0cyBkbyBub3QgaGF2ZSBhbiBhcHBlYXJhbmNlIHN0cmVhbS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGlmIChkcm9wZG93bi5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIGNvbnNvbGUubG9nKCdOZWVkcyB1cGRhdGUnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZHJvcGRvd24gbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSgpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBoYXNBcHBlYXJhbmNlcyA9ICgoX2EgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZXMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vcm1hbCkgaW5zdGFuY2VvZiBQREZTdHJlYW07XG4gICAgICAgICAgICBpZiAoIWhhc0FwcGVhcmFuY2VzKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgZHJvcGRvd24ncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgZHJvcGRvd25zLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIHRoaXMudXBkYXRlQXBwZWFyYW5jZXMoZm9udCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGRyb3Bkb3duJ3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBnaXZlbiBhcHBlYXJhbmNlIHByb3ZpZGVyLiBJZiBubyBgcHJvdmlkZXJgIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHRcbiAgICAgKiBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBkcm9wZG93bnMgd2lsbCBiZSB1c2VkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi51cGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EsIChmaWVsZCwgd2lkZ2V0LCBmb250KSA9PiB7XG4gICAgICogICAuLi5cbiAgICAgKiAgIHJldHVybiBkcmF3VGV4dEZpZWxkKC4uLilcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIE9wdGlvbmFsbHksIHRoZSBhcHBlYXJhbmNlIHByb3ZpZGVyIHRvIGJlIHVzZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLnVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHByb3ZpZGVyLCAncHJvdmlkZXInLCBbRnVuY3Rpb25dKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzQ2xlYW4oKTtcbiAgICB9O1xuICAgIC8vIGdldE9wdGlvbihpbmRleDogbnVtYmVyKTogc3RyaW5nIHt9XG4gICAgLy8gZ2V0U2VsZWN0ZWRJbmRpY2VzKCk6IG51bWJlcltdIHt9XG4gICAgLy8gcmVtb3ZlT3B0aW9ucyhvcHRpb246IHN0cmluZyB8IHN0cmluZ1tdKSB7fVxuICAgIC8vIHJlbW92ZUluZGljZXMob3B0aW9uOiBudW1iZXJbXSkge31cbiAgICAvLyBkZXNlbGVjdChvcHRpb25zOiBzdHJpbmcgfCBzdHJpbmdbXSkge31cbiAgICAvLyBkZXNlbGVjdEluZGljZXMob3B0aW9uSW5kaWNlczogbnVtYmVyW10pIHt9XG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBmb250LCBwcm92aWRlcikge1xuICAgICAgICB2YXIgYXBQcm92aWRlciA9IHByb3ZpZGVyICE9PSBudWxsICYmIHByb3ZpZGVyICE9PSB2b2lkIDAgPyBwcm92aWRlciA6IGRlZmF1bHREcm9wZG93bkFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCwgZm9udCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VXaXRoRm9udCh3aWRnZXQsIGZvbnQsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldERyb3Bkb3duXV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZEcm9wZG93bl1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZEcm9wZG93bl1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb0NvbWJvQm94IGFuZCByZWZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvQ29tYm9Cb3ggVGhlIHVuZGVybHlpbmcgYFBERkFjcm9Db21ib0JveGAgZm9yIHRoaXMgZHJvcGRvd24uXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBkcm9wZG93bi5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGlzIGRyb3Bkb3duIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLm9mID0gZnVuY3Rpb24gKGFjcm9Db21ib0JveCwgcmVmLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZEcm9wZG93bihhY3JvQ29tYm9Cb3gsIHJlZiwgZG9jKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZEcm9wZG93bjtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkRyb3Bkb3duO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRHJvcGRvd24uanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRG9jdW1lbnQgZnJvbSBcIi4uL1BERkRvY3VtZW50XCI7XG5pbXBvcnQgeyBjb2xvclRvQ29tcG9uZW50cywgc2V0RmlsbGluZ0NvbG9yIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgdG9EZWdyZWVzLCByb3RhdGVSZWN0YW5nbGUsIHJlZHVjZVJvdGF0aW9uLCBhZGp1c3REaW1zRm9yUm90YXRpb24sIGRlZ3JlZXMsIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgUERGUmVmLCBQREZXaWRnZXRBbm5vdGF0aW9uLCBQREZOYW1lLCBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yLCBBY3JvRmllbGRGbGFncywgUERGQWNyb1Rlcm1pbmFsLCBBbm5vdGF0aW9uRmxhZ3MsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRNdWx0aXBsZSwgYXNzZXJ0T3JVbmRlZmluZWQgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IEltYWdlQWxpZ25tZW50IH0gZnJvbSAnLi4vaW1hZ2UnO1xuaW1wb3J0IHsgZHJhd0ltYWdlLCByb3RhdGVJblBsYWNlIH0gZnJvbSAnLi4vb3BlcmF0aW9ucyc7XG5leHBvcnQgdmFyIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2lkdGgsICdvcHRpb25zLndpZHRoJywgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhlaWdodCwgJ29wdGlvbnMuaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnRleHRDb2xvciwgJ29wdGlvbnMudGV4dENvbG9yJywgW1xuICAgICAgICBbT2JqZWN0LCAnQ29sb3InXSxcbiAgICBdKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLCAnb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3InLCBbXG4gICAgICAgIFtPYmplY3QsICdDb2xvciddLFxuICAgIF0pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJDb2xvciwgJ29wdGlvbnMuYm9yZGVyQ29sb3InLCBbXG4gICAgICAgIFtPYmplY3QsICdDb2xvciddLFxuICAgIF0pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5ib3JkZXJXaWR0aCwgJ29wdGlvbnMuYm9yZGVyV2lkdGgnLCBbJ251bWJlciddKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucm90YXRlLCAnb3B0aW9ucy5yb3RhdGUnLCBbW09iamVjdCwgJ1JvdGF0aW9uJ11dKTtcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgYSBmaWVsZCBvZiBhIFtbUERGRm9ybV1dLlxuICpcbiAqIFRoaXMgY2xhc3MgaXMgZWZmZWN0aXZlbHkgYWJzdHJhY3QuIEFsbCBmaWVsZHMgaW4gYSBbW1BERkZvcm1dXSB3aWxsXG4gKiBhY3R1YWxseSBiZSBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIHRoaXMgY2xhc3MuXG4gKlxuICogTm90ZSB0aGF0IGVhY2ggZmllbGQgaW4gYSBQREYgaXMgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZmllbGQgb2JqZWN0LlxuICogSG93ZXZlciwgYSBnaXZlbiBmaWVsZCBvYmplY3QgbWF5IGJlIHJlbmRlcmVkIGF0IG11bHRpcGxlIGxvY2F0aW9ucyB3aXRoaW5cbiAqIHRoZSBkb2N1bWVudCAoYWNyb3NzIG9uZSBvciBtb3JlIHBhZ2VzKS4gVGhlIHJlbmRlcmluZyBvZiBhIGZpZWxkIGlzXG4gKiBjb250cm9sbGVkIGJ5IGl0cyB3aWRnZXRzLiBFYWNoIHdpZGdldCBjYXVzZXMgaXRzIGZpZWxkIHRvIGJlIGRpc3BsYXllZCBhdCBhXG4gKiBwYXJ0aWN1bGFyIGxvY2F0aW9uIGluIHRoZSBkb2N1bWVudC5cbiAqXG4gKiBNb3N0IG9mIHRoZSB0aW1lIGVhY2ggZmllbGQgaW4gYSBQREYgaGFzIG9ubHkgYSBzaW5nbGUgd2lkZ2V0LCBhbmQgdGh1cyBpc1xuICogb25seSByZW5kZXJlZCBvbmNlLiBIb3dldmVyLCBpZiBhIGZpZWxkIGlzIHJlbmRlcmVkIG11bHRpcGxlIHRpbWVzLCBpdCB3aWxsXG4gKiBoYXZlIG11bHRpcGxlIHdpZGdldHMgLSBvbmUgZm9yIGVhY2ggbG9jYXRpb24gaXQgaXMgcmVuZGVyZWQuXG4gKlxuICogVGhpcyBhYnN0cmFjdGlvbiBvZiBmaWVsZCBvYmplY3RzIGFuZCB3aWRnZXRzIGlzIGRlZmluZWQgaW4gdGhlIFBERlxuICogc3BlY2lmaWNhdGlvbiBhbmQgZGljdGF0ZXMgaG93IFBERiBmaWxlcyBzdG9yZSBmaWVsZHMgYW5kIHdoZXJlIHRoZXkgYXJlXG4gKiB0byBiZSByZW5kZXJlZC5cbiAqL1xudmFyIFBERkZpZWxkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkZpZWxkKGFjcm9GaWVsZCwgcmVmLCBkb2MpIHtcbiAgICAgICAgYXNzZXJ0SXMoYWNyb0ZpZWxkLCAnYWNyb0ZpZWxkJywgW1tQREZBY3JvVGVybWluYWwsICdQREZBY3JvVGVybWluYWwnXV0pO1xuICAgICAgICBhc3NlcnRJcyhyZWYsICdyZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIGFzc2VydElzKGRvYywgJ2RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkID0gYWNyb0ZpZWxkO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBmaWVsZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZHMgPSBmb3JtLmdldEZpZWxkcygpXG4gICAgICogZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAqICAgY29uc3QgbmFtZSA9IGZpZWxkLmdldE5hbWUoKVxuICAgICAqICAgY29uc29sZS5sb2coJ0ZpZWxkIG5hbWU6JywgbmFtZSlcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCBQREYgZmllbGRzIGFyZSBzdHJ1Y3R1cmVkIGFzIGEgdHJlZS4gRWFjaCBmaWVsZCBpcyB0aGVcbiAgICAgKiBkZXNjZW5kZW50IG9mIGEgc2VyaWVzIG9mIGFuY2VzdG9yIG5vZGVzIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSBmb3JtIG5vZGUsXG4gICAgICogd2hpY2ggaXMgYWx3YXlzIHRoZSByb290IG9mIHRoZSB0cmVlLiBFYWNoIG5vZGUgaW4gdGhlIHRyZWUgKGV4Y2VwdCBmb3JcbiAgICAgKiB0aGUgZm9ybSBub2RlKSBoYXMgYSBwYXJ0aWFsIG5hbWUuIFBhcnRpYWwgbmFtZXMgY2FuIGJlIGNvbXBvc2VkIG9mIGFueVxuICAgICAqIHVuaWNvZGUgY2hhcmFjdGVycyBleGNlcHQgYSBwZXJpb2QgKGAuYCkuIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhXG4gICAgICogZmllbGQgaXMgY29tcG9zZWQgb2YgdGhlIHBhcnRpYWwgbmFtZXMgb2YgYWxsIGl0cyBhbmNlc3RvcnMgam9pbmVkXG4gICAgICogd2l0aCBwZXJpb2RzLiBUaGlzIG1lYW5zIHRoYXQgc3BsaXR0aW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvblxuICAgICAqIHBlcmlvZHMgYW5kIHRha2luZyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSByZXN1bHRpbmcgYXJyYXkgd2lsbCBnaXZlIHlvdVxuICAgICAqIHRoZSBwYXJ0aWFsIG5hbWUgb2YgYSBzcGVjaWZpYyBmaWVsZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5hY3JvRmllbGQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBmaWVsZCBpcyByZWFkIG9ubHkuIFRoaXMgbWVhbnMgdGhhdCBQREYgcmVhZGVyc1xuICAgICAqIHdpbGwgbm90IGFsbG93IHVzZXJzIHRvIGludGVyYWN0IHdpdGggdGhlIGZpZWxkIG9yIGNoYW5nZSBpdHMgdmFsdWUuIFNlZVxuICAgICAqIFtbUERGRmllbGQuZW5hYmxlUmVhZE9ubHldXSBhbmQgW1tQREZGaWVsZC5kaXNhYmxlUmVhZE9ubHldXS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogaWYgKGZpZWxkLmlzUmVhZE9ubHkoKSkgY29uc29sZS5sb2coJ1JlYWQgb25seSBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGlzIGEgcmVhZCBvbmx5IGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5pc1JlYWRPbmx5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvRmllbGRGbGFncy5SZWFkT25seSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IFBERiByZWFkZXJzIGZyb20gYWxsb3dpbmcgdXNlcnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGlzIGZpZWxkIG9yXG4gICAgICogY2hhbmdlIGl0cyB2YWx1ZS4gVGhlIGZpZWxkIHdpbGwgbm90IHJlc3BvbmQgdG8gbW91c2Ugb3Iga2V5Ym9hcmQgaW5wdXQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGZpZWxkLmVuYWJsZVJlYWRPbmx5KClcbiAgICAgKiBgYGBcbiAgICAgKiBVc2VmdWwgZm9yIGZpZWxkcyB3aG9zZSB2YWx1ZXMgYXJlIGNvbXB1dGVkLCBpbXBvcnRlZCBmcm9tIGEgZGF0YWJhc2UsIG9yXG4gICAgICogcHJlZmlsbGVkIGJ5IHNvZnR3YXJlIGJlZm9yZSBiZWluZyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmVuYWJsZVJlYWRPbmx5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0ZpZWxkRmxhZ3MuUmVhZE9ubHksIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgdXNlcnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGlzIGZpZWxkIGFuZCBjaGFuZ2UgaXRzIHZhbHVlIGluIFBERlxuICAgICAqIHJlYWRlcnMgdmlhIG1vdXNlIGFuZCBrZXlib2FyZCBpbnB1dC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGZpZWxkLmRpc2FibGVSZWFkT25seSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmRpc2FibGVSZWFkT25seSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9GaWVsZEZsYWdzLlJlYWRPbmx5LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGZpZWxkIG11c3QgaGF2ZSBhIHZhbHVlIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLlxuICAgICAqIFNlZSBbW1BERkZpZWxkLmVuYWJsZVJlcXVpcmVkXV0gYW5kIFtbUERGRmllbGQuZGlzYWJsZVJlcXVpcmVkXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGlmIChmaWVsZC5pc1JlcXVpcmVkKCkpIGNvbnNvbGUubG9nKCdGaWVsZCBpcyByZXF1aXJlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBmaWVsZCBpcyByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuaXNSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0ZpZWxkRmxhZ3MuUmVxdWlyZWQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVxdWlyZSB0aGlzIGZpZWxkIHRvIGhhdmUgYSB2YWx1ZSB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogZmllbGQuZW5hYmxlUmVxdWlyZWQoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5lbmFibGVSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9GaWVsZEZsYWdzLlJlcXVpcmVkLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCByZXF1aXJlIHRoaXMgZmllbGQgdG8gaGF2ZSBhIHZhbHVlIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBmaWVsZC5kaXNhYmxlUmVxdWlyZWQoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5kaXNhYmxlUmVxdWlyZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvRmllbGRGbGFncy5SZXF1aXJlZCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBmaWVsZCdzIHZhbHVlIHNob3VsZCBiZSBleHBvcnRlZCB3aGVuIHRoZSBmb3JtIGlzXG4gICAgICogc3VibWl0dGVkLiBTZWUgW1tQREZGaWVsZC5lbmFibGVFeHBvcnRpbmddXSBhbmRcbiAgICAgKiBbW1BERkZpZWxkLmRpc2FibGVFeHBvcnRpbmddXS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogaWYgKGZpZWxkLmlzRXhwb3J0ZWQoKSkgY29uc29sZS5sb2coJ0V4cG9ydGluZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZpZWxkJ3MgdmFsdWUgc2hvdWxkIGJlIGV4cG9ydGVkLlxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5pc0V4cG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0ZpZWxkRmxhZ3MuTm9FeHBvcnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIGZpZWxkJ3MgdmFsdWUgc2hvdWxkIGJlIGV4cG9ydGVkIHdoZW4gdGhlIGZvcm0gaXNcbiAgICAgKiBzdWJtaXR0ZWQgaW4gYSBQREYgcmVhZGVyLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogZmllbGQuZW5hYmxlRXhwb3J0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZW5hYmxlRXhwb3J0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0ZpZWxkRmxhZ3MuTm9FeHBvcnQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBmaWVsZCdzIHZhbHVlIHNob3VsZCAqKm5vdCoqIGJlIGV4cG9ydGVkIHdoZW4gdGhlIGZvcm1cbiAgICAgKiBpcyBzdWJtaXR0ZWQgaW4gYSBQREYgcmVhZGVyLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogZmllbGQuZGlzYWJsZUV4cG9ydGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmRpc2FibGVFeHBvcnRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvRmllbGRGbGFncy5Ob0V4cG9ydCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICduZWVkc0FwcGVhcmFuY2VzVXBkYXRlJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoX2ZvbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzJyk7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUubWFya0FzRGlydHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZG9jLmdldEZvcm0oKS5tYXJrRmllbGRBc0RpcnR5KHRoaXMucmVmKTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5tYXJrQXNDbGVhbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kb2MuZ2V0Rm9ybSgpLm1hcmtGaWVsZEFzQ2xlYW4odGhpcy5yZWYpO1xuICAgIH07XG4gICAgUERGRmllbGQucHJvdG90eXBlLmlzRGlydHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXRGb3JtKCkuZmllbGRJc0RpcnR5KHRoaXMucmVmKTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5jcmVhdGVXaWRnZXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0ZXh0Q29sb3IgPSBvcHRpb25zLnRleHRDb2xvcjtcbiAgICAgICAgdmFyIGJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICB2YXIgYm9yZGVyQ29sb3IgPSBvcHRpb25zLmJvcmRlckNvbG9yO1xuICAgICAgICB2YXIgYm9yZGVyV2lkdGggPSBvcHRpb25zLmJvcmRlcldpZHRoO1xuICAgICAgICB2YXIgZGVncmVlc0FuZ2xlID0gdG9EZWdyZWVzKG9wdGlvbnMucm90YXRlKTtcbiAgICAgICAgdmFyIGNhcHRpb24gPSBvcHRpb25zLmNhcHRpb247XG4gICAgICAgIHZhciB4ID0gb3B0aW9ucy54O1xuICAgICAgICB2YXIgeSA9IG9wdGlvbnMueTtcbiAgICAgICAgdmFyIHdpZHRoID0gb3B0aW9ucy53aWR0aCArIGJvcmRlcldpZHRoO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgKyBib3JkZXJXaWR0aDtcbiAgICAgICAgdmFyIGhpZGRlbiA9IEJvb2xlYW4ob3B0aW9ucy5oaWRkZW4pO1xuICAgICAgICB2YXIgcGFnZVJlZiA9IG9wdGlvbnMucGFnZTtcbiAgICAgICAgYXNzZXJ0TXVsdGlwbGUoZGVncmVlc0FuZ2xlLCAnZGVncmVlc0FuZ2xlJywgOTApO1xuICAgICAgICAvLyBDcmVhdGUgYSB3aWRnZXQgZm9yIHRoaXMgZmllbGRcbiAgICAgICAgdmFyIHdpZGdldCA9IFBERldpZGdldEFubm90YXRpb24uY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQsIHRoaXMucmVmKTtcbiAgICAgICAgLy8gU2V0IHdpZGdldCBwcm9wZXJ0aWVzXG4gICAgICAgIHZhciByZWN0ID0gcm90YXRlUmVjdGFuZ2xlKHsgeDogeCwgeTogeSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9LCBib3JkZXJXaWR0aCwgZGVncmVlc0FuZ2xlKTtcbiAgICAgICAgd2lkZ2V0LnNldFJlY3RhbmdsZShyZWN0KTtcbiAgICAgICAgaWYgKHBhZ2VSZWYpXG4gICAgICAgICAgICB3aWRnZXQuc2V0UChwYWdlUmVmKTtcbiAgICAgICAgdmFyIGFjID0gd2lkZ2V0LmdldE9yQ3JlYXRlQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgICAgICBhYy5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3JUb0NvbXBvbmVudHMoYmFja2dyb3VuZENvbG9yKSk7XG4gICAgICAgIH1cbiAgICAgICAgYWMuc2V0Um90YXRpb24oZGVncmVlc0FuZ2xlKTtcbiAgICAgICAgaWYgKGNhcHRpb24pXG4gICAgICAgICAgICBhYy5zZXRDYXB0aW9ucyh7IG5vcm1hbDogY2FwdGlvbiB9KTtcbiAgICAgICAgaWYgKGJvcmRlckNvbG9yKVxuICAgICAgICAgICAgYWMuc2V0Qm9yZGVyQ29sb3IoY29sb3JUb0NvbXBvbmVudHMoYm9yZGVyQ29sb3IpKTtcbiAgICAgICAgdmFyIGJzID0gd2lkZ2V0LmdldE9yQ3JlYXRlQm9yZGVyU3R5bGUoKTtcbiAgICAgICAgaWYgKGJvcmRlcldpZHRoICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBicy5zZXRXaWR0aChib3JkZXJXaWR0aCk7XG4gICAgICAgIHdpZGdldC5zZXRGbGFnVG8oQW5ub3RhdGlvbkZsYWdzLlByaW50LCB0cnVlKTtcbiAgICAgICAgd2lkZ2V0LnNldEZsYWdUbyhBbm5vdGF0aW9uRmxhZ3MuSGlkZGVuLCBoaWRkZW4pO1xuICAgICAgICB3aWRnZXQuc2V0RmxhZ1RvKEFubm90YXRpb25GbGFncy5JbnZpc2libGUsIGZhbHNlKTtcbiAgICAgICAgLy8gU2V0IGFjcm9maWVsZCBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICh0ZXh0Q29sb3IpIHtcbiAgICAgICAgICAgIHZhciBkYSA9IChfYSA9IHRoaXMuYWNyb0ZpZWxkLmdldERlZmF1bHRBcHBlYXJhbmNlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgICAgICAgICAgdmFyIG5ld0RhID0gZGEgKyAnXFxuJyArIHNldEZpbGxpbmdDb2xvcih0ZXh0Q29sb3IpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXREZWZhdWx0QXBwZWFyYW5jZShuZXdEYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdpZGdldDtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlV2l0aEZvbnQgPSBmdW5jdGlvbiAod2lkZ2V0LCBmb250LCBfYSkge1xuICAgICAgICB2YXIgbm9ybWFsID0gX2Eubm9ybWFsLCByb2xsb3ZlciA9IF9hLnJvbGxvdmVyLCBkb3duID0gX2EuZG93bjtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlcyh3aWRnZXQsIHtcbiAgICAgICAgICAgIG5vcm1hbDogdGhpcy5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgbm9ybWFsLCBmb250KSxcbiAgICAgICAgICAgIHJvbGxvdmVyOiByb2xsb3ZlciAmJiB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0od2lkZ2V0LCByb2xsb3ZlciwgZm9udCksXG4gICAgICAgICAgICBkb3duOiBkb3duICYmIHRoaXMuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIGRvd24sIGZvbnQpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS51cGRhdGVPbk9mZldpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBvblZhbHVlLCBfYSkge1xuICAgICAgICB2YXIgbm9ybWFsID0gX2Eubm9ybWFsLCByb2xsb3ZlciA9IF9hLnJvbGxvdmVyLCBkb3duID0gX2EuZG93bjtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlcyh3aWRnZXQsIHtcbiAgICAgICAgICAgIG5vcm1hbDogdGhpcy5jcmVhdGVBcHBlYXJhbmNlRGljdCh3aWRnZXQsIG5vcm1hbCwgb25WYWx1ZSksXG4gICAgICAgICAgICByb2xsb3Zlcjogcm9sbG92ZXIgJiYgdGhpcy5jcmVhdGVBcHBlYXJhbmNlRGljdCh3aWRnZXQsIHJvbGxvdmVyLCBvblZhbHVlKSxcbiAgICAgICAgICAgIGRvd246IGRvd24gJiYgdGhpcy5jcmVhdGVBcHBlYXJhbmNlRGljdCh3aWRnZXQsIGRvd24sIG9uVmFsdWUpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uICh3aWRnZXQsIF9hKSB7XG4gICAgICAgIHZhciBub3JtYWwgPSBfYS5ub3JtYWwsIHJvbGxvdmVyID0gX2Eucm9sbG92ZXIsIGRvd24gPSBfYS5kb3duO1xuICAgICAgICB3aWRnZXQuc2V0Tm9ybWFsQXBwZWFyYW5jZShub3JtYWwpO1xuICAgICAgICBpZiAocm9sbG92ZXIpIHtcbiAgICAgICAgICAgIHdpZGdldC5zZXRSb2xsb3ZlckFwcGVhcmFuY2Uocm9sbG92ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2lkZ2V0LnJlbW92ZVJvbGxvdmVyQXBwZWFyYW5jZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb3duKSB7XG4gICAgICAgICAgICB3aWRnZXQuc2V0RG93bkFwcGVhcmFuY2UoZG93bik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWRnZXQucmVtb3ZlRG93bkFwcGVhcmFuY2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gLy8gVE9ETzogRG8gd2UgbmVlZCB0byBkbyB0aGlzLi4uP1xuICAgIC8vIHByaXZhdGUgZm9vKGZvbnQ6IFBERkZvbnQsIGRpY3Q6IFBERkRpY3QpIHtcbiAgICAvLyAgIGlmICghZGljdC5sb29rdXAoUERGTmFtZS5vZignRFInKSkpIHtcbiAgICAvLyAgICAgZGljdC5zZXQoUERGTmFtZS5vZignRFInKSwgZGljdC5jb250ZXh0Lm9iaih7fSkpO1xuICAgIC8vICAgfVxuICAgIC8vICAgY29uc3QgRFIgPSBkaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdEUicpLCBQREZEaWN0KTtcbiAgICAvLyAgIGlmICghRFIubG9va3VwKFBERk5hbWUub2YoJ0ZvbnQnKSkpIHtcbiAgICAvLyAgICAgRFIuc2V0KFBERk5hbWUub2YoJ0ZvbnQnKSwgZGljdC5jb250ZXh0Lm9iaih7fSkpO1xuICAgIC8vICAgfVxuICAgIC8vICAgY29uc3QgRm9udCA9IERSLmxvb2t1cChQREZOYW1lLm9mKCdGb250JyksIFBERkRpY3QpO1xuICAgIC8vICAgRm9udC5zZXQoUERGTmFtZS5vZihmb250Lm5hbWUpLCBmb250LnJlZik7XG4gICAgLy8gfVxuICAgIFBERkZpZWxkLnByb3RvdHlwZS5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtID0gZnVuY3Rpb24gKHdpZGdldCwgYXBwZWFyYW5jZSwgZm9udCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5hY3JvRmllbGQuZGljdC5jb250ZXh0O1xuICAgICAgICB2YXIgX2IgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCksIHdpZHRoID0gX2Iud2lkdGgsIGhlaWdodCA9IF9iLmhlaWdodDtcbiAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBkbyB0aGlzLi4uP1xuICAgICAgICAvLyBpZiAoZm9udCkge1xuICAgICAgICAvLyAgIHRoaXMuZm9vKGZvbnQsIHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gICB0aGlzLmZvbyhmb250LCB0aGlzLmRvYy5nZXRGb3JtKCkuYWNyb0Zvcm0uZGljdCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gRU5EIFRPRE9cbiAgICAgICAgdmFyIFJlc291cmNlcyA9IGZvbnQgJiYgeyBGb250OiAoX2EgPSB7fSwgX2FbZm9udC5uYW1lXSA9IGZvbnQucmVmLCBfYSkgfTtcbiAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRleHQuZm9ybVhPYmplY3QoYXBwZWFyYW5jZSwge1xuICAgICAgICAgICAgUmVzb3VyY2VzOiBSZXNvdXJjZXMsXG4gICAgICAgICAgICBCQm94OiBjb250ZXh0Lm9iaihbMCwgMCwgd2lkdGgsIGhlaWdodF0pLFxuICAgICAgICAgICAgTWF0cml4OiBjb250ZXh0Lm9iaihbMSwgMCwgMCwgMSwgMCwgMF0pLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHN0cmVhbVJlZiA9IGNvbnRleHQucmVnaXN0ZXIoc3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIHN0cmVhbVJlZjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIEZvcm1YT2JqZWN0IG9mIHRoZSBzdXBwbGllZCBpbWFnZSBhbmQgYWRkIGl0IHRvIGNvbnRleHQuXG4gICAgICogVGhlIEZvcm1YT2JqZWN0IHNpemUgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgd2lkZ2V0IChpbmNsdWRpbmdcbiAgICAgKiB0aGUgYWxpZ25tZW50KS5cbiAgICAgKiBAcGFyYW0gd2lkZ2V0IFRoZSB3aWRnZXQgdGhhdCBzaG91bGQgZGlzcGxheSB0aGUgaW1hZ2UuXG4gICAgICogQHBhcmFtIGFsaWdubWVudCBUaGUgYWxpZ25tZW50IG9mIHRoZSBpbWFnZS5cbiAgICAgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVmIGZvciB0aGUgRm9ybVhPYmplY3QgdGhhdCB3YXMgYWRkZWQgdG8gdGhlIGNvbnRleHQuXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmNyZWF0ZUltYWdlQXBwZWFyYW5jZVN0cmVhbSA9IGZ1bmN0aW9uICh3aWRnZXQsIGltYWdlLCBhbGlnbm1lbnQpIHtcbiAgICAgICAgLy8gTk9URTogVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGhhbmRsZSBpbWFnZSBib3JkZXJzLlxuICAgICAgICAvLyBOT1RFOiBBY3JvYmF0IHNlZW1zIHRvIHJlc2l6ZSB0aGUgaW1hZ2UgKG1heWJlIGV2ZW4gc2tld2luZyBpdHMgYXNwZWN0XG4gICAgICAgIC8vICAgICAgIHJhdGlvKSB0byBmaXQgcGVyZmVjdGx5IHdpdGhpbiB0aGUgd2lkZ2V0J3MgcmVjdGFuZ2xlLiBUaGlzIG1ldGhvZFxuICAgICAgICAvLyAgICAgICBkb2VzIG5vdCBjdXJyZW50bHkgZG8gdGhhdC4gU2hvdWxkIHRoZXJlIGJlIGFuIG9wdGlvbiBmb3IgdGhhdD9cbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgX2I7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5hY3JvRmllbGQuZGljdC5jb250ZXh0O1xuICAgICAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgICAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgICAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICAgICAgdmFyIGJvcmRlcldpZHRoID0gKF9iID0gYnMgPT09IG51bGwgfHwgYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJzLmdldFdpZHRoKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRSb3RhdGlvbigpKTtcbiAgICAgICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICAgICAgdmFyIGFkaiA9IGFkanVzdERpbXNGb3JSb3RhdGlvbihyZWN0YW5nbGUsIHJvdGF0aW9uKTtcbiAgICAgICAgdmFyIGltYWdlRGltcyA9IGltYWdlLnNjYWxlVG9GaXQoYWRqLndpZHRoIC0gYm9yZGVyV2lkdGggKiAyLCBhZGouaGVpZ2h0IC0gYm9yZGVyV2lkdGggKiAyKTtcbiAgICAgICAgLy8gU3VwcG9ydCBib3JkZXJzIG9uIGltYWdlcyBhbmQgbWF5YmUgb3RoZXIgcHJvcGVydGllc1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHg6IGJvcmRlcldpZHRoLFxuICAgICAgICAgICAgeTogYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICB3aWR0aDogaW1hZ2VEaW1zLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZURpbXMuaGVpZ2h0LFxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIH07XG4gICAgICAgIGlmIChhbGlnbm1lbnQgPT09IEltYWdlQWxpZ25tZW50LkNlbnRlcikge1xuICAgICAgICAgICAgb3B0aW9ucy54ICs9IChhZGoud2lkdGggLSBib3JkZXJXaWR0aCAqIDIpIC8gMiAtIGltYWdlRGltcy53aWR0aCAvIDI7XG4gICAgICAgICAgICBvcHRpb25zLnkgKz0gKGFkai5oZWlnaHQgLSBib3JkZXJXaWR0aCAqIDIpIC8gMiAtIGltYWdlRGltcy5oZWlnaHQgLyAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFsaWdubWVudCA9PT0gSW1hZ2VBbGlnbm1lbnQuUmlnaHQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMueCA9IGFkai53aWR0aCAtIGJvcmRlcldpZHRoIC0gaW1hZ2VEaW1zLndpZHRoO1xuICAgICAgICAgICAgb3B0aW9ucy55ID0gYWRqLmhlaWdodCAtIGJvcmRlcldpZHRoIC0gaW1hZ2VEaW1zLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW1hZ2VOYW1lID0gdGhpcy5kb2MuY29udGV4dC5hZGRSYW5kb21TdWZmaXgoJ0ltYWdlJywgMTApO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZSA9IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd0ltYWdlKGltYWdlTmFtZSwgb3B0aW9ucykpO1xuICAgICAgICAvLy8vLy8vLy8vLy9cbiAgICAgICAgdmFyIFJlc291cmNlcyA9IHsgWE9iamVjdDogKF9hID0ge30sIF9hW2ltYWdlTmFtZV0gPSBpbWFnZS5yZWYsIF9hKSB9O1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udGV4dC5mb3JtWE9iamVjdChhcHBlYXJhbmNlLCB7XG4gICAgICAgICAgICBSZXNvdXJjZXM6IFJlc291cmNlcyxcbiAgICAgICAgICAgIEJCb3g6IGNvbnRleHQub2JqKFswLCAwLCByZWN0YW5nbGUud2lkdGgsIHJlY3RhbmdsZS5oZWlnaHRdKSxcbiAgICAgICAgICAgIE1hdHJpeDogY29udGV4dC5vYmooWzEsIDAsIDAsIDEsIDAsIDBdKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0LnJlZ2lzdGVyKHN0cmVhbSk7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUuY3JlYXRlQXBwZWFyYW5jZURpY3QgPSBmdW5jdGlvbiAod2lkZ2V0LCBhcHBlYXJhbmNlLCBvblZhbHVlKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5hY3JvRmllbGQuZGljdC5jb250ZXh0O1xuICAgICAgICB2YXIgb25TdHJlYW1SZWYgPSB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0od2lkZ2V0LCBhcHBlYXJhbmNlLm9uKTtcbiAgICAgICAgdmFyIG9mZlN0cmVhbVJlZiA9IHRoaXMuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIGFwcGVhcmFuY2Uub2ZmKTtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VEaWN0ID0gY29udGV4dC5vYmooe30pO1xuICAgICAgICBhcHBlYXJhbmNlRGljdC5zZXQob25WYWx1ZSwgb25TdHJlYW1SZWYpO1xuICAgICAgICBhcHBlYXJhbmNlRGljdC5zZXQoUERGTmFtZS5vZignT2ZmJyksIG9mZlN0cmVhbVJlZik7XG4gICAgICAgIHJldHVybiBhcHBlYXJhbmNlRGljdDtcbiAgICB9O1xuICAgIHJldHVybiBQREZGaWVsZDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZGaWVsZDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkZpZWxkLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduLCBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRvY3VtZW50IGZyb20gXCIuLi9QREZEb2N1bWVudFwiO1xuaW1wb3J0IFBERkJ1dHRvbiBmcm9tIFwiLi9QREZCdXR0b25cIjtcbmltcG9ydCBQREZDaGVja0JveCBmcm9tIFwiLi9QREZDaGVja0JveFwiO1xuaW1wb3J0IFBERkRyb3Bkb3duIGZyb20gXCIuL1BERkRyb3Bkb3duXCI7XG5pbXBvcnQgUERGT3B0aW9uTGlzdCBmcm9tIFwiLi9QREZPcHRpb25MaXN0XCI7XG5pbXBvcnQgUERGUmFkaW9Hcm91cCBmcm9tIFwiLi9QREZSYWRpb0dyb3VwXCI7XG5pbXBvcnQgUERGU2lnbmF0dXJlIGZyb20gXCIuL1BERlNpZ25hdHVyZVwiO1xuaW1wb3J0IFBERlRleHRGaWVsZCBmcm9tIFwiLi9QREZUZXh0RmllbGRcIjtcbmltcG9ydCB7IE5vU3VjaEZpZWxkRXJyb3IsIFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvciwgRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IsIEludmFsaWRGaWVsZE5hbWVQYXJ0RXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4uL1BERkZvbnRcIjtcbmltcG9ydCB7IFN0YW5kYXJkRm9udHMgfSBmcm9tIFwiLi4vU3RhbmRhcmRGb250c1wiO1xuaW1wb3J0IHsgcm90YXRlSW5QbGFjZSB9IGZyb20gXCIuLi9vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyBkcmF3T2JqZWN0LCBwb3BHcmFwaGljc1N0YXRlLCBwdXNoR3JhcGhpY3NTdGF0ZSwgdHJhbnNsYXRlLCB9IGZyb20gXCIuLi9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IFBERkFjcm9Gb3JtLCBQREZBY3JvQ2hlY2tCb3gsIFBERkFjcm9Db21ib0JveCwgUERGQWNyb0xpc3RCb3gsIFBERkFjcm9SYWRpb0J1dHRvbiwgUERGQWNyb1NpZ25hdHVyZSwgUERGQWNyb1RleHQsIFBERkFjcm9QdXNoQnV0dG9uLCBQREZBY3JvTm9uVGVybWluYWwsIFBERkRpY3QsIFBERlJlZiwgY3JlYXRlUERGQWNyb0ZpZWxkcywgUERGTmFtZSwgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIENhY2hlLCBhc3NlcnRPclVuZGVmaW5lZCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBpbnRlcmFjdGl2ZSBmb3JtIG9mIGEgW1tQREZEb2N1bWVudF1dLlxuICpcbiAqIEludGVyYWN0aXZlIGZvcm1zIChzb21ldGltZXMgY2FsbGVkIF9BY3JvRm9ybXNfKSBhcmUgY29sbGVjdGlvbnMgb2YgZmllbGRzXG4gKiBkZXNpZ25lZCB0byBnYXRoZXIgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXIuIEEgUERGIGRvY3VtZW50IG1heSBjb250YWlucyBhbnlcbiAqIG51bWJlciBvZiBmaWVsZHMgdGhhdCBhcHBlYXIgb24gdmFyaW91cyBwYWdlcywgYWxsIG9mIHdoaWNoIG1ha2UgdXAgYSBzaW5nbGUsXG4gKiBnbG9iYWwgaW50ZXJhY3RpdmUgZm9ybSBzcGFubmluZyB0aGUgZW50aXJlIGRvY3VtZW50LiBUaGlzIG1lYW5zIHRoYXRcbiAqIGluc3RhbmNlcyBvZiBbW1BERkRvY3VtZW50XV0gc2hhbGwgY29udGFpbiBhdCBtb3N0IG9uZSBbW1BERkZvcm1dXS5cbiAqXG4gKiBUaGUgZmllbGRzIG9mIGFuIGludGVyYWN0aXZlIGZvcm0gYXJlIHJlcHJlc2VudGVkIGJ5IFtbUERGRmllbGRdXSBpbnN0YW5jZXMuXG4gKi9cbnZhciBQREZGb3JtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkZvcm0oYWNyb0Zvcm0sIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmVtYmVkRGVmYXVsdEZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuZG9jLmVtYmVkU3RhbmRhcmRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0SXMoYWNyb0Zvcm0sICdhY3JvRm9ybScsIFtbUERGQWNyb0Zvcm0sICdQREZBY3JvRm9ybSddXSk7XG4gICAgICAgIGFzc2VydElzKGRvYywgJ2RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgIHRoaXMuYWNyb0Zvcm0gPSBhY3JvRm9ybTtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuZGlydHlGaWVsZHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuZGVmYXVsdEZvbnRDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KHRoaXMuZW1iZWREZWZhdWx0Rm9udCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgW1tQREZGb3JtXV0gaGFzIFhGQSBkYXRhLiBNb3N0IFBERnMgd2l0aCBmb3JtXG4gICAgICogZmllbGRzIGRvIG5vdCB1c2UgWEZBIGFzIGl0IGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIGJ5IFBERiByZWFkZXJzLlxuICAgICAqXG4gICAgICogPiBgcGRmLWxpYmAgZG9lcyBub3Qgc3VwcG9ydCBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uLCBvciByZWFkaW5nIG9mIFhGQVxuICAgICAqID4gZmllbGRzLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGlmIChmb3JtLmhhc1hGQSgpKSBjb25zb2xlLmxvZygnUERGIGhhcyBYRkEgZGF0YScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBmb3JtIGhhcyBYRkEgZGF0YS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5oYXNYRkEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9Gb3JtLmRpY3QuaGFzKFBERk5hbWUub2YoJ1hGQScpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3QgdGhlIFhGQSBkYXRhIGZyb20gdGhpcyBbW1BERkZvcm1dXSAoaWYgYW55IGV4aXN0cykuIFRoaXMgd2lsbFxuICAgICAqIGZvcmNlIHJlYWRlcnMgdG8gZmFsbGJhY2sgdG8gc3RhbmRhcmQgZmllbGRzIGlmIHRoZSBbW1BERkRvY3VtZW50XV1cbiAgICAgKiBjb250YWlucyBhbnkuIEZvciBleGFtcGxlOlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGZvcm0uZGVsZXRlWEZBKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5kZWxldGVYRkEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0Zvcm0uZGljdC5kZWxldGUoUERGTmFtZS5vZignWEZBJykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBmaWVsZHMgY29udGFpbmVkIGluIHRoaXMgW1tQREZGb3JtXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZHMgPSBmb3JtLmdldEZpZWxkcygpXG4gICAgICogZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAqICAgY29uc3QgdHlwZSA9IGZpZWxkLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgKiAgIGNvbnN0IG5hbWUgPSBmaWVsZC5nZXROYW1lKClcbiAgICAgKiAgIGNvbnNvbGUubG9nKGAke3R5cGV9OiAke25hbWV9YClcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFsbCBmaWVsZHMgaW4gdGhpcyBmb3JtLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldEZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFsbEZpZWxkcyA9IHRoaXMuYWNyb0Zvcm0uZ2V0QWxsRmllbGRzKCk7XG4gICAgICAgIHZhciBmaWVsZHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYWxsRmllbGRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gYWxsRmllbGRzW2lkeF0sIGFjcm9GaWVsZCA9IF9hWzBdLCByZWYgPSBfYVsxXTtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IGNvbnZlcnRUb1BERkZpZWxkKGFjcm9GaWVsZCwgcmVmLCB0aGlzLmRvYyk7XG4gICAgICAgICAgICBpZiAoZmllbGQpXG4gICAgICAgICAgICAgICAgZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZE1heWJlKCdQYWdlMS5Gb28uQmFyWzBdJylcbiAgICAgKiBpZiAoZmllbGQpIGNvbnNvbGUubG9nKCdGaWVsZCBleGlzdHMhJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBmaWVsZCBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBmaWVsZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgaWYgb25lIGV4aXN0cy5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRGaWVsZE1heWJlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGZpZWxkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpZHhdO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmdldE5hbWUoKSA9PT0gbmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdQYWdlMS5Gb28uQmFyWzBdJylcbiAgICAgKiBgYGBcbiAgICAgKiBJZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgZmllbGQgbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0RmllbGQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkTWF5YmUobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZClcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEZpZWxkRXJyb3IobmFtZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGJ1dHRvbiBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmdldEJ1dHRvbignUGFnZTEuRm9vLkJ1dHRvblswXScpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUsIG9yIGlmXG4gICAgICogdGhlIGZpZWxkIGV4aXN0cyBidXQgaXMgbm90IGEgYnV0dG9uLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIGJ1dHRvbiBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBidXR0b24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0QnV0dG9uID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQnV0dG9uKVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERkJ1dHRvbiwgZmllbGQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjaGVjayBib3ggZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ1BhZ2UxLkZvby5DaGVja0JveFswXScpXG4gICAgICogY2hlY2tCb3guY2hlY2soKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIGNoZWNrIGJveC5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBjaGVjayBib3ggbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2hlY2sgYm94IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldENoZWNrQm94ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQ2hlY2tCb3gpXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGQ2hlY2tCb3gsIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZHJvcGRvd24gZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ1BhZ2UxLkZvby5Ecm9wZG93blswXScpXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IGRyb3Bkb3duLmdldE9wdGlvbnMoKVxuICAgICAqIGRyb3Bkb3duLnNlbGVjdChvcHRpb25zWzBdKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIGRyb3Bkb3duLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIGRyb3Bkb3duIG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIGRyb3Bkb3duIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldERyb3Bkb3duID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGRHJvcGRvd24pXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGRHJvcGRvd24sIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgb3B0aW9uIGxpc3QgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdQYWdlMS5Gb28uT3B0aW9uTGlzdFswXScpXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IG9wdGlvbkxpc3QuZ2V0T3B0aW9ucygpXG4gICAgICogb3B0aW9uTGlzdC5zZWxlY3Qob3B0aW9uc1swXSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYW4gb3B0aW9uIGxpc3QuXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgb3B0aW9uIGxpc3QgbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW9uIGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0T3B0aW9uTGlzdCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERk9wdGlvbkxpc3QpXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGT3B0aW9uTGlzdCwgZmllbGQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByYWRpbyBncm91cCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ1BhZ2UxLkZvby5SYWRpb0dyb3VwWzBdJylcbiAgICAgKiBjb25zdCBvcHRpb25zID0gcmFkaW9Hcm91cC5nZXRPcHRpb25zKClcbiAgICAgKiByYWRpb0dyb3VwLnNlbGVjdChvcHRpb25zWzBdKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIHJhZGlvIGdyb3VwLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIHJhZGlvIGdyb3VwIG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIHJhZGlvIGdyb3VwIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldFJhZGlvR3JvdXAgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZSYWRpb0dyb3VwKVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERlJhZGlvR3JvdXAsIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2lnbmF0dXJlIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3Qgc2lnbmF0dXJlID0gZm9ybS5nZXRTaWduYXR1cmUoJ1BhZ2UxLkZvby5TaWduYXR1cmVbMF0nKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBzaWduYXR1cmUgbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgc2lnbmF0dXJlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldFNpZ25hdHVyZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERlNpZ25hdHVyZSlcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBQREZTaWduYXR1cmUsIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGV4dCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdQYWdlMS5Gb28uVGV4dEZpZWxkWzBdJylcbiAgICAgKiB0ZXh0RmllbGQuc2V0VGV4dCgnQXJlIHlvdSBkZXNpZ25lZCB0byBhY3Qgb3IgdG8gYmUgYWN0ZWQgdXBvbj8nKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhIHRleHQgZmllbGQuXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgdGV4dCBmaWVsZCBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSB0ZXh0IGZpZWxkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldFRleHRGaWVsZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERlRleHRGaWVsZClcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBQREZUZXh0RmllbGQsIGZpZWxkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBidXR0b24gZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5jcmVhdGVCdXR0b24oJ2Nvb2wubmV3LmJ1dHRvbicpXG4gICAgICpcbiAgICAgKiBidXR0b24uYWRkVG9QYWdlKCdEbyBTdHVmZicsIGZvbnQsIHBhZ2UpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyBidXR0b24uXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBidXR0b24gZmllbGQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuY3JlYXRlQnV0dG9uID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IHNwbGl0RmllbGROYW1lKG5hbWUpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMobmFtZVBhcnRzLm5vblRlcm1pbmFsKTtcbiAgICAgICAgdmFyIGJ1dHRvbiA9IFBERkFjcm9QdXNoQnV0dG9uLmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgYnV0dG9uLnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIGFkZEZpZWxkVG9QYXJlbnQocGFyZW50LCBbYnV0dG9uLCBidXR0b24ucmVmXSwgbmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgcmV0dXJuIFBERkJ1dHRvbi5vZihidXR0b24sIGJ1dHRvbi5yZWYsIHRoaXMuZG9jKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBjaGVjayBib3ggZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmNyZWF0ZUNoZWNrQm94KCdjb29sLm5ldy5jaGVja0JveCcpXG4gICAgICpcbiAgICAgKiBjaGVja0JveC5hZGRUb1BhZ2UocGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBhIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciB0aGUgbmV3IGNoZWNrIGJveC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IGNoZWNrIGJveCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5jcmVhdGVDaGVja0JveCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBuYW1lUGFydHMgPSBzcGxpdEZpZWxkTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZmluZE9yQ3JlYXRlTm9uVGVybWluYWxzKG5hbWVQYXJ0cy5ub25UZXJtaW5hbCk7XG4gICAgICAgIHZhciBjaGVja0JveCA9IFBERkFjcm9DaGVja0JveC5jcmVhdGUodGhpcy5kb2MuY29udGV4dCk7XG4gICAgICAgIGNoZWNrQm94LnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIGFkZEZpZWxkVG9QYXJlbnQocGFyZW50LCBbY2hlY2tCb3gsIGNoZWNrQm94LnJlZl0sIG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIHJldHVybiBQREZDaGVja0JveC5vZihjaGVja0JveCwgY2hlY2tCb3gucmVmLCB0aGlzLmRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgZHJvcGRvd24gZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmNyZWF0ZURyb3Bkb3duKCdjb29sLm5ldy5kcm9wZG93bicpXG4gICAgICpcbiAgICAgKiBkcm9wZG93bi5hZGRUb1BhZ2UoZm9udCwgcGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBhIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciB0aGUgbmV3IGRyb3Bkb3duLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgZHJvcGRvd24gZmllbGQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuY3JlYXRlRHJvcGRvd24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgbmFtZVBhcnRzID0gc3BsaXRGaWVsZE5hbWUobmFtZSk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyhuYW1lUGFydHMubm9uVGVybWluYWwpO1xuICAgICAgICB2YXIgY29tYm9Cb3ggPSBQREZBY3JvQ29tYm9Cb3guY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICBjb21ib0JveC5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICBhZGRGaWVsZFRvUGFyZW50KHBhcmVudCwgW2NvbWJvQm94LCBjb21ib0JveC5yZWZdLCBuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICByZXR1cm4gUERGRHJvcGRvd24ub2YoY29tYm9Cb3gsIGNvbWJvQm94LnJlZiwgdGhpcy5kb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IG9wdGlvbiBsaXN0IGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmNyZWF0ZU9wdGlvbkxpc3QoJ2Nvb2wubmV3Lm9wdGlvbkxpc3QnKVxuICAgICAqXG4gICAgICogb3B0aW9uTGlzdC5hZGRUb1BhZ2UoZm9udCwgcGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBhIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciB0aGUgbmV3IG9wdGlvbiBsaXN0LlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgb3B0aW9uIGxpc3QgZmllbGQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuY3JlYXRlT3B0aW9uTGlzdCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBuYW1lUGFydHMgPSBzcGxpdEZpZWxkTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZmluZE9yQ3JlYXRlTm9uVGVybWluYWxzKG5hbWVQYXJ0cy5ub25UZXJtaW5hbCk7XG4gICAgICAgIHZhciBsaXN0Qm94ID0gUERGQWNyb0xpc3RCb3guY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICBsaXN0Qm94LnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIGFkZEZpZWxkVG9QYXJlbnQocGFyZW50LCBbbGlzdEJveCwgbGlzdEJveC5yZWZdLCBuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICByZXR1cm4gUERGT3B0aW9uTGlzdC5vZihsaXN0Qm94LCBsaXN0Qm94LnJlZiwgdGhpcy5kb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHJhZGlvIGdyb3VwIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmNyZWF0ZVJhZGlvR3JvdXAoJ2Nvb2wubmV3LnJhZGlvR3JvdXAnKVxuICAgICAqXG4gICAgICogcmFkaW9Hcm91cC5hZGRPcHRpb25Ub1BhZ2UoJ2lzLWRvZycsIHBhZ2UsIHsgeTogMCB9KVxuICAgICAqIHJhZGlvR3JvdXAuYWRkT3B0aW9uVG9QYWdlKCdpcy1jYXQnLCBwYWdlLCB7IHk6IDc1IH0pXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBmaWVsZCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIG5ldyByYWRpbyBncm91cC5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IHJhZGlvIGdyb3VwIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmNyZWF0ZVJhZGlvR3JvdXAgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgbmFtZVBhcnRzID0gc3BsaXRGaWVsZE5hbWUobmFtZSk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyhuYW1lUGFydHMubm9uVGVybWluYWwpO1xuICAgICAgICB2YXIgcmFkaW9CdXR0b24gPSBQREZBY3JvUmFkaW9CdXR0b24uY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICByYWRpb0J1dHRvbi5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICBhZGRGaWVsZFRvUGFyZW50KHBhcmVudCwgW3JhZGlvQnV0dG9uLCByYWRpb0J1dHRvbi5yZWZdLCBuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICByZXR1cm4gUERGUmFkaW9Hcm91cC5vZihyYWRpb0J1dHRvbiwgcmFkaW9CdXR0b24ucmVmLCB0aGlzLmRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgdGV4dCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmNyZWF0ZVRleHRGaWVsZCgnY29vbC5uZXcudGV4dEZpZWxkJylcbiAgICAgKlxuICAgICAqIHRleHRGaWVsZC5hZGRUb1BhZ2UoZm9udCwgcGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBhIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciB0aGUgbmV3IHJhZGlvIGdyb3VwLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgcmFkaW8gZ3JvdXAgZmllbGQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuY3JlYXRlVGV4dEZpZWxkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IHNwbGl0RmllbGROYW1lKG5hbWUpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMobmFtZVBhcnRzLm5vblRlcm1pbmFsKTtcbiAgICAgICAgdmFyIHRleHQgPSBQREZBY3JvVGV4dC5jcmVhdGUodGhpcy5kb2MuY29udGV4dCk7XG4gICAgICAgIHRleHQuc2V0UGFydGlhbE5hbWUobmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgYWRkRmllbGRUb1BhcmVudChwYXJlbnQsIFt0ZXh0LCB0ZXh0LnJlZl0sIG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIHJldHVybiBQREZUZXh0RmllbGQub2YodGV4dCwgdGV4dC5yZWYsIHRoaXMuZG9jKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZsYXR0ZW4gYWxsIGZpZWxkcyBpbiB0aGlzIFtbUERGRm9ybV1dLlxuICAgICAqXG4gICAgICogRmxhdHRlbmluZyBhIGZvcm0gZmllbGQgd2lsbCB0YWtlIHRoZSBjdXJyZW50IGFwcGVhcmFuY2UgZm9yIGVhY2ggb2YgdGhhdFxuICAgICAqIGZpZWxkJ3Mgd2lkZ2V0cyBhbmQgbWFrZSB0aGVtIHBhcnQgb2YgdGhlaXIgcGFnZSdzIGNvbnRlbnQgc3RyZWFtLiBBbGwgZm9ybVxuICAgICAqIGZpZWxkcyBhbmQgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCBhcmUgdGhlbiByZW1vdmVkLiBOb3RlIHRoYXQgb25jZSBhIGZvcm1cbiAgICAgKiBoYXMgYmVlbiBmbGF0dGVuZWQgaXRzIGZpZWxkcyBjYW4gbm8gbG9uZ2VyIGJlIGFjY2Vzc2VkIG9yIGVkaXRlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgb3BlcmF0aW9uIGlzIG9mdGVuIHVzZWQgYWZ0ZXIgZmlsbGluZyBmb3JtIGZpZWxkcyB0byBlbnN1cmUgYVxuICAgICAqIGNvbnNpc3RlbnQgYXBwZWFyYW5jZSBhY3Jvc3MgZGlmZmVyZW50IFBERiByZWFkZXJzIGFuZC9vciBwcmludGVycy5cbiAgICAgKiBBbm90aGVyIGNvbW1vbiB1c2UgY2FzZSBpcyB0byBjb3B5IGEgdGVtcGxhdGUgZG9jdW1lbnQgd2l0aCBmb3JtIGZpZWxkc1xuICAgICAqIGludG8gYW5vdGhlciBkb2N1bWVudC4gSW4gdGhpcyBzY2VuYXJpbyB5b3Ugd291bGQgbG9hZCB0aGUgdGVtcGxhdGVcbiAgICAgKiBkb2N1bWVudCwgZmlsbCBpdHMgZmllbGRzLCBmbGF0dGVuIGl0LCBhbmQgdGhlbiBjb3B5IGl0cyBwYWdlcyBpbnRvIHRoZVxuICAgICAqIHJlY2lwaWVudCBkb2N1bWVudCAtIHRoZSBmaWxsZWQgZmllbGRzIHdpbGwgYmUgY29waWVkIG92ZXIuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpO1xuICAgICAqIGZvcm0uZmxhdHRlbigpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmZsYXR0ZW4gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7IHVwZGF0ZUZpZWxkQXBwZWFyYW5jZXM6IHRydWUgfTsgfVxuICAgICAgICBpZiAob3B0aW9ucy51cGRhdGVGaWVsZEFwcGVhcmFuY2VzKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmllbGRzID0gdGhpcy5nZXRGaWVsZHMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbkZpZWxkcyA9IGZpZWxkcy5sZW5ndGg7IGkgPCBsZW5GaWVsZHM7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgdmFyIHdpZGdldHMgPSBmaWVsZC5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGxlbldpZGdldHMgPSB3aWRnZXRzLmxlbmd0aDsgaiA8IGxlbldpZGdldHM7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2pdO1xuICAgICAgICAgICAgICAgIHZhciBwYWdlID0gdGhpcy5maW5kV2lkZ2V0UGFnZSh3aWRnZXQpO1xuICAgICAgICAgICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmZpbmRXaWRnZXRBcHBlYXJhbmNlUmVmKGZpZWxkLCB3aWRnZXQpO1xuICAgICAgICAgICAgICAgIHZhciB4T2JqZWN0S2V5ID0gcGFnZS5ub2RlLm5ld1hPYmplY3QoJ0ZsYXRXaWRnZXQnLCB3aWRnZXRSZWYpO1xuICAgICAgICAgICAgICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgICAgICAgICAgICAgdmFyIG9wZXJhdG9ycyA9IF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgICAgICAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlKHJlY3RhbmdsZS54LCByZWN0YW5nbGUueSlcbiAgICAgICAgICAgICAgICBdLCByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiAwIH0pKSwgW1xuICAgICAgICAgICAgICAgICAgICBkcmF3T2JqZWN0KHhPYmplY3RLZXkpLFxuICAgICAgICAgICAgICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgICAgICAgICAgICAgXSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICAgICAgICAgIHBhZ2UucHVzaE9wZXJhdG9ycy5hcHBseShwYWdlLCBvcGVyYXRvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWVsZChmaWVsZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGZpZWxkIGZyb20gdGhpcyBbW1BERkZvcm1dXS5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKCk7XG4gICAgICogY29uc3QgYWdlRmllbGQgPSBmb3JtLmdldEZpZWxkcygpLmZpbmQoeCA9PiB4LmdldE5hbWUoKSA9PT0gJ0FnZScpO1xuICAgICAqIGZvcm0ucmVtb3ZlRmllbGQoYWdlRmllbGQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLnJlbW92ZUZpZWxkID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIHZhciB3aWRnZXRzID0gZmllbGQuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgdmFyIHBhZ2VzID0gbmV3IFNldCgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaV07XG4gICAgICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5maW5kV2lkZ2V0QXBwZWFyYW5jZVJlZihmaWVsZCwgd2lkZ2V0KTtcbiAgICAgICAgICAgIHZhciBwYWdlID0gdGhpcy5maW5kV2lkZ2V0UGFnZSh3aWRnZXQpO1xuICAgICAgICAgICAgcGFnZXMuYWRkKHBhZ2UpO1xuICAgICAgICAgICAgcGFnZS5ub2RlLnJlbW92ZUFubm90KHdpZGdldFJlZik7XG4gICAgICAgIH1cbiAgICAgICAgcGFnZXMuZm9yRWFjaChmdW5jdGlvbiAocGFnZSkgeyByZXR1cm4gcGFnZS5ub2RlLnJlbW92ZUFubm90KGZpZWxkLnJlZik7IH0pO1xuICAgICAgICB0aGlzLmFjcm9Gb3JtLnJlbW92ZUZpZWxkKGZpZWxkLmFjcm9GaWVsZCk7XG4gICAgICAgIHZhciBmaWVsZEtpZHMgPSBmaWVsZC5hY3JvRmllbGQubm9ybWFsaXplZEVudHJpZXMoKS5LaWRzO1xuICAgICAgICB2YXIga2lkc0NvdW50ID0gZmllbGRLaWRzLnNpemUoKTtcbiAgICAgICAgZm9yICh2YXIgY2hpbGRJbmRleCA9IDA7IGNoaWxkSW5kZXggPCBraWRzQ291bnQ7IGNoaWxkSW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gZmllbGRLaWRzLmdldChjaGlsZEluZGV4KTtcbiAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFBERlJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9jLmNvbnRleHQuZGVsZXRlKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvYy5jb250ZXh0LmRlbGV0ZShmaWVsZC5yZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGFsbCB3aWRnZXRzIG9mIGFsbCBmaWVsZHMgaW4gdGhpc1xuICAgICAqIFtbUERGRm9ybV1dLiBBcHBlYXJhbmNlIHN0cmVhbXMgd2lsbCBvbmx5IGJlIGNyZWF0ZWQgZm9yIGEgd2lkZ2V0IGlmIGl0XG4gICAgICogZG9lcyBub3QgaGF2ZSBhbnkgZXhpc3RpbmcgYXBwZWFyYW5jZSBzdHJlYW1zLCBvciB0aGUgZmllbGQncyB2YWx1ZSBoYXNcbiAgICAgKiBjaGFuZ2VkIChlLmcuIGJ5IGNhbGxpbmcgW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dIG9yXG4gICAgICogW1tQREZEcm9wZG93bi5zZWxlY3RdXSkuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvdXJpZXIgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuQ291cmllcilcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlcyhjb3VyaWVyKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogKipJTVBPUlRBTlQ6KiogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBgZm9udGAgcGFyYW1ldGVyIGlzXG4gICAgICogW1tTdGFuZGFyZEZvbnRzLkhlbHZldGljYV1dLiBOb3RlIHRoYXQgdGhpcyBpcyBhIFdpbkFuc2kgZm9udC4gVGhpcyBtZWFuc1xuICAgICAqIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHdpbGwgYmUgdGhyb3duIGlmIGFueSBmaWVsZHMgY29udGFpbiB0ZXh0IHdpdGhcbiAgICAgKiBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIFdpbkFuc2kgY2hhcmFjdGVyIHNldCAodGhlIGxhdGluIGFscGhhYmV0KS5cbiAgICAgKlxuICAgICAqIEVtYmVkZGluZyBhIGN1c3RvbSBmb250IGFuZCBwYXNzaW5nIHRoYXQgYXMgdGhlIGBmb250YFxuICAgICAqIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIGdlbmVyYXRlIGFwcGVhcmFuY2Ugc3RyZWFtcyB3aXRoIG5vbiBXaW5BbnNpXG4gICAgICogY2hhcmFjdGVycyAoYXNzdW1pbmcgeW91ciBjdXN0b20gZm9udCBzdXBwb3J0cyB0aGVtKS5cbiAgICAgKlxuICAgICAqID4gKipOT1RFOioqIFRoZSBbW1BERkRvY3VtZW50LnNhdmVdXSBtZXRob2Qgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvXG4gICAgICogPiB1cGRhdGUgYXBwZWFyYW5jZXMgYXV0b21hdGljYWxseSBpZiBhIGZvcm0gd2FzIGFjY2Vzc2VkIHZpYSB0aGVcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuZ2V0Rm9ybV1dIG1ldGhvZCBwcmlvciB0byBzYXZpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9udCBPcHRpb25hbGx5LCB0aGUgZm9udCB0byB1c2Ugd2hlbiBjcmVhdGluZyBuZXcgYXBwZWFyYW5jZXMuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUudXBkYXRlRmllbGRBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIGZvbnQgPSBmb250ICE9PSBudWxsICYmIGZvbnQgIT09IHZvaWQgMCA/IGZvbnQgOiB0aGlzLmdldERlZmF1bHRGb250KCk7XG4gICAgICAgIHZhciBmaWVsZHMgPSB0aGlzLmdldEZpZWxkcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBmaWVsZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaWR4XTtcbiAgICAgICAgICAgIGlmIChmaWVsZC5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoZm9udCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1hcmsgYSBmaWVsZCBhcyBkaXJ0eS4gVGhpcyB3aWxsIGNhdXNlIGl0cyBhcHBlYXJhbmNlIHN0cmVhbXMgdG8gYmVcbiAgICAgKiB1cGRhdGVkIGJ5IFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0uXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnZm9vLmJhcicpXG4gICAgICogZm9ybS5tYXJrRmllbGRBc0RpcnR5KGZpZWxkLnJlZilcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZmllbGRSZWYgVGhlIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgdGhhdCBzaG91bGQgYmUgbWFya2VkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLm1hcmtGaWVsZEFzRGlydHkgPSBmdW5jdGlvbiAoZmllbGRSZWYpIHtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQoZmllbGRSZWYsICdmaWVsZFJlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgdGhpcy5kaXJ0eUZpZWxkcy5hZGQoZmllbGRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTWFyayBhIGZpZWxkIGFzIGRpcnR5LiBUaGlzIHdpbGwgY2F1c2UgaXRzIGFwcGVhcmFuY2Ugc3RyZWFtcyB0byBub3QgYmVcbiAgICAgKiB1cGRhdGVkIGJ5IFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0uXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnZm9vLmJhcicpXG4gICAgICogZm9ybS5tYXJrRmllbGRBc0NsZWFuKGZpZWxkLnJlZilcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZmllbGRSZWYgVGhlIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgdGhhdCBzaG91bGQgYmUgbWFya2VkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLm1hcmtGaWVsZEFzQ2xlYW4gPSBmdW5jdGlvbiAoZmllbGRSZWYpIHtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQoZmllbGRSZWYsICdmaWVsZFJlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgdGhpcy5kaXJ0eUZpZWxkcy5kZWxldGUoZmllbGRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaXMgdGhlIHNwZWNpZmllZCBmaWVsZCBoYXMgYmVlbiBtYXJrZWQgYXMgZGlydHkuXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnZm9vLmJhcicpXG4gICAgICogaWYgKGZvcm0uZmllbGRJc0RpcnR5KGZpZWxkLnJlZikpIGNvbnNvbGUubG9nKCdGaWVsZCBpcyBkaXJ0eScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZpZWxkUmVmIFRoZSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBmaWVsZCBpcyBkaXJ0eS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5maWVsZElzRGlydHkgPSBmdW5jdGlvbiAoZmllbGRSZWYpIHtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQoZmllbGRSZWYsICdmaWVsZFJlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlydHlGaWVsZHMuaGFzKGZpZWxkUmVmKTtcbiAgICB9O1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldERlZmF1bHRGb250ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0Rm9udENhY2hlLmFjY2VzcygpO1xuICAgIH07XG4gICAgUERGRm9ybS5wcm90b3R5cGUuZmluZFdpZGdldFBhZ2UgPSBmdW5jdGlvbiAod2lkZ2V0KSB7XG4gICAgICAgIHZhciBwYWdlUmVmID0gd2lkZ2V0LlAoKTtcbiAgICAgICAgdmFyIHBhZ2UgPSB0aGlzLmRvYy5nZXRQYWdlcygpLmZpbmQoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHgucmVmID09PSBwYWdlUmVmOyB9KTtcbiAgICAgICAgaWYgKHBhZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZG9jLmNvbnRleHQuZ2V0T2JqZWN0UmVmKHdpZGdldC5kaWN0KTtcbiAgICAgICAgICAgIGlmICh3aWRnZXRSZWYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgUERGUmVmIGZvciBQREZPYmplY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhZ2UgPSB0aGlzLmRvYy5maW5kUGFnZUZvckFubm90YXRpb25SZWYod2lkZ2V0UmVmKTtcbiAgICAgICAgICAgIGlmIChwYWdlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZmluZCBwYWdlIGZvciBQREZSZWYgXCIgKyB3aWRnZXRSZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgIH07XG4gICAgUERGRm9ybS5wcm90b3R5cGUuZmluZFdpZGdldEFwcGVhcmFuY2VSZWYgPSBmdW5jdGlvbiAoZmllbGQsIHdpZGdldCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciByZWZPckRpY3QgPSB3aWRnZXQuZ2V0Tm9ybWFsQXBwZWFyYW5jZSgpO1xuICAgICAgICBpZiAocmVmT3JEaWN0IGluc3RhbmNlb2YgUERGRGljdCAmJlxuICAgICAgICAgICAgKGZpZWxkIGluc3RhbmNlb2YgUERGQ2hlY2tCb3ggfHwgZmllbGQgaW5zdGFuY2VvZiBQREZSYWRpb0dyb3VwKSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gZmllbGQuYWNyb0ZpZWxkLmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YXIgcmVmID0gKF9hID0gcmVmT3JEaWN0LmdldCh2YWx1ZSkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHJlZk9yRGljdC5nZXQoUERGTmFtZS5vZignT2ZmJykpO1xuICAgICAgICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIFBERlJlZikge1xuICAgICAgICAgICAgICAgIHJlZk9yRGljdCA9IHJlZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIShyZWZPckRpY3QgaW5zdGFuY2VvZiBQREZSZWYpKSB7XG4gICAgICAgICAgICB2YXIgbmFtZV8xID0gZmllbGQuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGV4dHJhY3QgYXBwZWFyYW5jZSByZWYgZm9yOiBcIiArIG5hbWVfMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZk9yRGljdDtcbiAgICB9O1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyA9IGZ1bmN0aW9uIChwYXJ0aWFsTmFtZXMpIHtcbiAgICAgICAgdmFyIG5vblRlcm1pbmFsID0gW1xuICAgICAgICAgICAgdGhpcy5hY3JvRm9ybSxcbiAgICAgICAgXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gcGFydGlhbE5hbWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIG5hbWVQYXJ0ID0gcGFydGlhbE5hbWVzW2lkeF07XG4gICAgICAgICAgICBpZiAoIW5hbWVQYXJ0KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRmllbGROYW1lUGFydEVycm9yKG5hbWVQYXJ0KTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IG5vblRlcm1pbmFsWzBdLCBwYXJlbnRSZWYgPSBub25UZXJtaW5hbFsxXTtcbiAgICAgICAgICAgIHZhciByZXMgPSB0aGlzLmZpbmROb25UZXJtaW5hbChuYW1lUGFydCwgcGFyZW50XzEpO1xuICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIG5vblRlcm1pbmFsID0gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBQREZBY3JvTm9uVGVybWluYWwuY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgIG5vZGUuc2V0UGFydGlhbE5hbWUobmFtZVBhcnQpO1xuICAgICAgICAgICAgICAgIG5vZGUuc2V0UGFyZW50KHBhcmVudFJlZik7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGVSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKG5vZGUuZGljdCk7XG4gICAgICAgICAgICAgICAgcGFyZW50XzEuYWRkRmllbGQobm9kZVJlZik7XG4gICAgICAgICAgICAgICAgbm9uVGVybWluYWwgPSBbbm9kZSwgbm9kZVJlZl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vblRlcm1pbmFsO1xuICAgIH07XG4gICAgUERGRm9ybS5wcm90b3R5cGUuZmluZE5vblRlcm1pbmFsID0gZnVuY3Rpb24gKHBhcnRpYWxOYW1lLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHBhcmVudCBpbnN0YW5jZW9mIFBERkFjcm9Gb3JtXG4gICAgICAgICAgICA/IHRoaXMuYWNyb0Zvcm0uZ2V0RmllbGRzKClcbiAgICAgICAgICAgIDogY3JlYXRlUERGQWNyb0ZpZWxkcyhwYXJlbnQuS2lkcygpKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZmllbGRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZmllbGRzW2lkeF0sIGZpZWxkID0gX2FbMF0sIHJlZiA9IF9hWzFdO1xuICAgICAgICAgICAgaWYgKGZpZWxkLmdldFBhcnRpYWxOYW1lKCkgPT09IHBhcnRpYWxOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb05vblRlcm1pbmFsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2ZpZWxkLCByZWZdO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWVsZEFscmVhZHlFeGlzdHNFcnJvcihwYXJ0aWFsTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5nZXRGb3JtXV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZGb3JtXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkZvcm1dXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9Gb3JtIGFuZCBlbWJlZGRlclxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9Gb3JtIFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvRm9ybWAgZm9yIHRoaXMgZm9ybS5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgZm9ybSB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZGb3JtLm9mID0gZnVuY3Rpb24gKGFjcm9Gb3JtLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZGb3JtKGFjcm9Gb3JtLCBkb2MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkZvcm07XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRm9ybTtcbnZhciBjb252ZXJ0VG9QREZGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCwgcmVmLCBkb2MpIHtcbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvUHVzaEJ1dHRvbilcbiAgICAgICAgcmV0dXJuIFBERkJ1dHRvbi5vZihmaWVsZCwgcmVmLCBkb2MpO1xuICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9DaGVja0JveClcbiAgICAgICAgcmV0dXJuIFBERkNoZWNrQm94Lm9mKGZpZWxkLCByZWYsIGRvYyk7XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb0NvbWJvQm94KVxuICAgICAgICByZXR1cm4gUERGRHJvcGRvd24ub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvTGlzdEJveClcbiAgICAgICAgcmV0dXJuIFBERk9wdGlvbkxpc3Qub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvVGV4dClcbiAgICAgICAgcmV0dXJuIFBERlRleHRGaWVsZC5vZihmaWVsZCwgcmVmLCBkb2MpO1xuICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9SYWRpb0J1dHRvbikge1xuICAgICAgICByZXR1cm4gUERGUmFkaW9Hcm91cC5vZihmaWVsZCwgcmVmLCBkb2MpO1xuICAgIH1cbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvU2lnbmF0dXJlKSB7XG4gICAgICAgIHJldHVybiBQREZTaWduYXR1cmUub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG52YXIgc3BsaXRGaWVsZE5hbWUgPSBmdW5jdGlvbiAoZnVsbHlRdWFsaWZpZWROYW1lKSB7XG4gICAgaWYgKGZ1bGx5UXVhbGlmaWVkTmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQREYgZmllbGQgbmFtZXMgbXVzdCBub3QgYmUgZW1wdHkgc3RyaW5ncycpO1xuICAgIH1cbiAgICB2YXIgcGFydHMgPSBmdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoJy4nKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBwYXJ0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgaWYgKHBhcnRzW2lkeF0gPT09ICcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQZXJpb2RzIGluIFBERiBmaWVsZCBuYW1lcyBtdXN0IGJlIHNlcGFyYXRlZCBieSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyOiBcXFwiXCIgKyBmdWxseVF1YWxpZmllZE5hbWUgKyBcIlxcXCJcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgcmV0dXJuIHsgbm9uVGVybWluYWw6IFtdLCB0ZXJtaW5hbDogcGFydHNbMF0gfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBub25UZXJtaW5hbDogcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSksXG4gICAgICAgIHRlcm1pbmFsOiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSxcbiAgICB9O1xufTtcbnZhciBhZGRGaWVsZFRvUGFyZW50ID0gZnVuY3Rpb24gKF9hLCBfYiwgcGFydGlhbE5hbWUpIHtcbiAgICB2YXIgcGFyZW50ID0gX2FbMF0sIHBhcmVudFJlZiA9IF9hWzFdO1xuICAgIHZhciBmaWVsZCA9IF9iWzBdLCBmaWVsZFJlZiA9IF9iWzFdO1xuICAgIHZhciBlbnRyaWVzID0gcGFyZW50Lm5vcm1hbGl6ZWRFbnRyaWVzKCk7XG4gICAgdmFyIGZpZWxkcyA9IGNyZWF0ZVBERkFjcm9GaWVsZHMoJ0tpZHMnIGluIGVudHJpZXMgPyBlbnRyaWVzLktpZHMgOiBlbnRyaWVzLkZpZWxkcyk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZmllbGRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBpZiAoZmllbGRzW2lkeF1bMF0uZ2V0UGFydGlhbE5hbWUoKSA9PT0gcGFydGlhbE5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGaWVsZEFscmVhZHlFeGlzdHNFcnJvcihwYXJ0aWFsTmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyZW50LmFkZEZpZWxkKGZpZWxkUmVmKTtcbiAgICBmaWVsZC5zZXRQYXJlbnQocGFyZW50UmVmKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZGb3JtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4uL1BERlBhZ2VcIjtcbmltcG9ydCBQREZGb250IGZyb20gXCIuLi9QREZGb250XCI7XG5pbXBvcnQgUERGRmllbGQsIHsgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucywgfSBmcm9tIFwiLi9QREZGaWVsZFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQXBwZWFyYW5jZSwgZGVmYXVsdE9wdGlvbkxpc3RBcHBlYXJhbmNlUHJvdmlkZXIsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBQREZIZXhTdHJpbmcsIFBERlN0cmVhbSwgUERGQWNyb0xpc3RCb3gsIEFjcm9DaG9pY2VGbGFncywgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydElzU3Vic2V0LCBhc3NlcnRPclVuZGVmaW5lZCwgYXNzZXJ0UG9zaXRpdmUsIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gb3B0aW9uIGxpc3QgZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERk9wdGlvbkxpc3RdXSBmaWVsZHMgYXJlIGludGVyYWN0aXZlIGxpc3RzIG9mIG9wdGlvbnMuIFRoZSBwdXJwb3NlIG9mIGFuXG4gKiBvcHRpb24gbGlzdCBpcyB0byBlbmFibGUgdXNlcnMgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG9wdGlvbnMgZnJvbSBhIHNldCBvZlxuICogcG9zc2libGUgb3B0aW9ucy4gVXNlcnMgYXJlIGFibGUgdG8gc2VlIHRoZSBmdWxsIHNldCBvZiBvcHRpb25zIHdpdGhvdXRcbiAqIGZpcnN0IGhhdmluZyB0byBjbGljayBvbiB0aGUgZmllbGQgKHRob3VnaCBzY3JvbGxpbmcgbWF5IGJlIG5lY2Vzc2FyeSkuXG4gKiBDbGlja2luZyBhbiBvcHRpb24gaW4gdGhlIGxpc3Qgd2lsbCBjYXVzZSBpdCB0byBiZSBzZWxlY3RlZCBhbmQgZGlzcGxheWVkXG4gKiB3aXRoIGEgaGlnaGxpZ2h0ZWQgYmFja2dyb3VuZC4gU29tZSBvcHRpb24gbGlzdHMgYWxsb3cgdXNlcnMgdG8gc2VsZWN0XG4gKiBtb3JlIHRoYW4gb25lIG9wdGlvbiAoc2VlIFtbUERGT3B0aW9uTGlzdC5pc011bHRpc2VsZWN0XV0pLlxuICovXG52YXIgUERGT3B0aW9uTGlzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGT3B0aW9uTGlzdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZPcHRpb25MaXN0KGFjcm9MaXN0Qm94LCByZWYsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBhY3JvTGlzdEJveCwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9MaXN0Qm94LCAnYWNyb0xpc3RCb3gnLCBbW1BERkFjcm9MaXN0Qm94LCAnUERGQWNyb0xpc3RCb3gnXV0pO1xuICAgICAgICBfdGhpcy5hY3JvRmllbGQgPSBhY3JvTGlzdEJveDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbnMgZm9yIHRoaXMgb3B0aW9uIGxpc3QuIFRoZXNlIG9wdGlvbnMgd2lsbFxuICAgICAqIGJlIGRpc3BsYXllZCB0byB1c2VycyB3aG8gdmlldyB0aGlzIG9wdGlvbiBsaXN0IGluIGEgUERGIHJlYWRlci5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IG9wdGlvbkxpc3QuZ2V0T3B0aW9ucygpXG4gICAgICogY29uc29sZS5sb2coJ09wdGlvbiBMaXN0IG9wdGlvbnM6Jywgb3B0aW9ucylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW9ucyBmb3IgdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmF3T3B0aW9ucyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBuZXcgQXJyYXkocmF3T3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gcmF3T3B0aW9uc1tpZHhdLCBkaXNwbGF5ID0gX2EuZGlzcGxheSwgdmFsdWUgPSBfYS52YWx1ZTtcbiAgICAgICAgICAgIG9wdGlvbnNbaWR4XSA9IChkaXNwbGF5ICE9PSBudWxsICYmIGRpc3BsYXkgIT09IHZvaWQgMCA/IGRpc3BsYXkgOiB2YWx1ZSkuZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzZWxlY3RlZCBvcHRpb25zIGZvciB0aGlzIG9wdGlvbiBsaXN0LiBUaGVzZSBhcmUgdGhlIHZhbHVlcyB0aGF0XG4gICAgICogd2VyZSBzZWxlY3RlZCBieSBhIGh1bWFuIHVzZXIgdmlhIGEgUERGIHJlYWRlciwgb3IgcHJvZ3JhbWF0aWNhbGx5IHZpYVxuICAgICAqIHNvZnR3YXJlLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBjb25zdCBzZWxlY3Rpb25zID0gb3B0aW9uTGlzdC5nZXRTZWxlY3RlZCgpXG4gICAgICogY29uc29sZS5sb2coJ09wdGlvbiBMaXN0IHNlbGVjdGlvbnM6Jywgc2VsZWN0aW9ucylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgc2VsZWN0ZWQgb3B0aW9ucyBmb3IgdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5nZXRTZWxlY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlcygpO1xuICAgICAgICB2YXIgc2VsZWN0ZWQgPSBuZXcgQXJyYXkodmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHNlbGVjdGVkW2lkeF0gPSB2YWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsaXN0IG9mIG9wdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbiBsaXN0LiBUaGVzZSBhcmVcbiAgICAgKiB0aGUgdmFsdWVzIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHVzZXJzIHRvIHNlbGVjdCB3aGVuIHRoZXkgdmlldyB0aGlzXG4gICAgICogb3B0aW9uIGxpc3QgaW4gYSBQREYgcmVhZGVyLiBOb3RlIHRoYXQgcHJlZXhpc3Rpbmcgb3B0aW9ucyBmb3IgdGhpc1xuICAgICAqIG9wdGlvbiBsaXN0IHdpbGwgYmUgcmVtb3ZlZC4gT25seSB0aGUgdmFsdWVzIHBhc3NlZCBhcyBgb3B0aW9uc2Agd2lsbCBiZVxuICAgICAqIGF2YWlsYWJsZSB0byBzZWxlY3QuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3BsYW5ldHMub3B0aW9uTGlzdCcpXG4gICAgICogb3B0aW9uTGlzdC5zZXRPcHRpb25zKFsnRWFydGgnLCAnTWFycycsICdQbHV0bycsICdWZW51cyddKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgb3B0aW9uIGxpc3QgYXMgZGlydHksIGNhdXNpbmcgaXRzIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHRvIGJlIHVwZGF0ZWQgd2hlbiBlaXRoZXIgW1tQREZEb2N1bWVudC5zYXZlXV0gb3JcbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIGlzIGNhbGxlZC4gVGhlIHVwZGF0ZWQgc3RyZWFtcyB3aWxsXG4gICAgICogZGlzcGxheSB0aGUgb3B0aW9ucyB0aGlzIGZpZWxkIGNvbnRhaW5zIGluc2lkZSB0aGUgd2lkZ2V0cyBvZiB0aGlzIHRleHRcbiAgICAgKiBmaWVsZCAod2l0aCBzZWxlY3RlZCBvcHRpb25zIGhpZ2hsaWdodGVkKS5cbiAgICAgKlxuICAgICAqICoqSU1QT1JUQU5UOioqIFRoZSBkZWZhdWx0IGZvbnQgdXNlZCB0byB1cGRhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIGlzXG4gICAgICogW1tTdGFuZGFyZEZvbnRzLkhlbHZldGljYV1dLiBOb3RlIHRoYXQgdGhpcyBpcyBhIFdpbkFuc2kgZm9udC4gVGhpcyBtZWFuc1xuICAgICAqIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHdpbGwgYmUgdGhyb3duIGlmIHRoaXMgZmllbGQgY29udGFpbnMgYW55IG9wdGlvbnNcbiAgICAgKiB3aXRoIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgV2luQW5zaSBjaGFyYWN0ZXIgc2V0ICh0aGUgbGF0aW4gYWxwaGFiZXQpLlxuICAgICAqXG4gICAgICogRW1iZWRkaW5nIGEgY3VzdG9tIGZvbnQgYW5kIHBhc3NpbmcgaXQgdG9cbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIG9yIFtbUERGT3B0aW9uTGlzdC51cGRhdGVBcHBlYXJhbmNlc11dXG4gICAgICogYWxsb3dzIHlvdSB0byBnZW5lcmF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgd2l0aCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlXG4gICAgICogbGF0aW4gYWxwaGFiZXQgKGFzc3VtaW5nIHRoZSBjdXN0b20gZm9udCBzdXBwb3J0cyB0aGVtKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLCAnb3B0aW9ucycsIFtBcnJheV0pO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHZhciBvcHRpb25PYmplY3RzID0gbmV3IEFycmF5KG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG9wdGlvbk9iamVjdHNbaWR4XSA9IHsgdmFsdWU6IFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb25zW2lkeF0pIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0T3B0aW9ucyhvcHRpb25PYmplY3RzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCB0byB0aGUgbGlzdCBvZiBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24gbGlzdC4gVXNlcnNcbiAgICAgKiB3aWxsIGJlIGFibGUgdG8gc2VsZWN0IHRoZXNlIHZhbHVlcyBpbiBhIFBERiByZWFkZXIuIEluIGFkZGl0aW9uIHRvIHRoZVxuICAgICAqIHZhbHVlcyBwYXNzZWQgYXMgYG9wdGlvbnNgLCBhbnkgcHJlZXhpc3Rpbmcgb3B0aW9ucyBmb3IgdGhpcyBvcHRpb24gbGlzdFxuICAgICAqIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlIGZvciB1c2VycyB0byBzZWxlY3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdyb2NrZXRzLm9wdGlvbkxpc3QnKVxuICAgICAqIG9wdGlvbkxpc3QuYWRkT3B0aW9ucyhbJ1NhdHVybiBJVicsICdGYWxjb24gSGVhdnknXSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyBvcHRpb24gbGlzdCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZPcHRpb25MaXN0LnNldE9wdGlvbnNdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBOZXcgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5hZGRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucywgJ29wdGlvbnMnLCBbJ3N0cmluZycsIEFycmF5XSk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdmFyIG9wdGlvbnNBcnIgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMpID8gb3B0aW9ucyA6IFtvcHRpb25zXTtcbiAgICAgICAgdmFyIGV4aXN0aW5nT3B0aW9ucyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIG5ld09wdGlvbnMgPSBuZXcgQXJyYXkob3B0aW9uc0Fyci5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zQXJyLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgbmV3T3B0aW9uc1tpZHhdID0geyB2YWx1ZTogUERGSGV4U3RyaW5nLmZyb21UZXh0KG9wdGlvbnNBcnJbaWR4XSkgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRPcHRpb25zKGV4aXN0aW5nT3B0aW9ucy5jb25jYXQobmV3T3B0aW9ucykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2VsZWN0IG9uZSBvciBtb3JlIHZhbHVlcyBmb3IgdGhpcyBvcHRpb24gbGlzdC4gVGhpcyBvcGVyYXRpb24gaXMgYW5hbG9nb3VzXG4gICAgICogdG8gYSBodW1hbiB1c2VyIG9wZW5pbmcgdGhlIG9wdGlvbiBsaXN0IGluIGEgUERGIHJlYWRlciBhbmQgY2xpY2tpbmcgb24gb25lXG4gICAgICogb3IgbW9yZSB2YWx1ZXMgdG8gc2VsZWN0IHRoZW0uIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHN0YXRlXG4gICAgICogb2YgdGhlIG9wdGlvbiBsaXN0IHRvIGluZGljYXRlIHdoaWNoIHZhbHVlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuIFBERlxuICAgICAqIGxpYnJhcmllcyBhbmQgcmVhZGVycyB3aWxsIGJlIGFibGUgdG8gZXh0cmFjdCB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgc2F2ZWRcbiAgICAgKiBkb2N1bWVudCBhbmQgZGV0ZXJtaW5lIHdoaWNoIHZhbHVlcyB3ZXJlIHNlbGVjdGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnYmVzdC5zdXBlcmhlcm9lcy5vcHRpb25MaXN0JylcbiAgICAgKiBvcHRpb25MaXN0LnNlbGVjdChbJ09uZSBQdW5jaCBNYW4nLCAnSXJvbiBNYW4nXSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyBvcHRpb24gbGlzdCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZPcHRpb25MaXN0LnNldE9wdGlvbnNdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSBzZWxlY3RlZC5cbiAgICAgKiBAcGFyYW0gbWVyZ2UgV2hldGhlciBvciBub3QgZXhpc3Rpbmcgc2VsZWN0aW9ucyBzaG91bGQgYmUgcHJlc2VydmVkLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChvcHRpb25zLCBtZXJnZSkge1xuICAgICAgICBpZiAobWVyZ2UgPT09IHZvaWQgMCkgeyBtZXJnZSA9IGZhbHNlOyB9XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMsICdvcHRpb25zJywgWydzdHJpbmcnLCBBcnJheV0pO1xuICAgICAgICBhc3NlcnRJcyhtZXJnZSwgJ21lcmdlJywgWydib29sZWFuJ10pO1xuICAgICAgICB2YXIgb3B0aW9uc0FyciA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogW29wdGlvbnNdO1xuICAgICAgICB2YXIgdmFsaWRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICAgIGFzc2VydElzU3Vic2V0KG9wdGlvbnNBcnIsICdvcHRpb24nLCB2YWxpZE9wdGlvbnMpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIGlmIChvcHRpb25zQXJyLmxlbmd0aCA+IDEgfHwgKG9wdGlvbnNBcnIubGVuZ3RoID09PSAxICYmIG1lcmdlKSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVNdWx0aXNlbGVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkob3B0aW9uc0Fyci5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zQXJyLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFsdWVzW2lkeF0gPSBQREZIZXhTdHJpbmcuZnJvbVRleHQob3B0aW9uc0FycltpZHhdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgICAgIHZhciBleGlzdGluZ1ZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlcygpO1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWVzKGV4aXN0aW5nVmFsdWVzLmNvbmNhdCh2YWx1ZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlcyh2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhciBhbGwgc2VsZWN0ZWQgdmFsdWVzIGZvciB0aGlzIG9wdGlvbiBsaXN0LiBUaGlzIG9wZXJhdGlvbiBpc1xuICAgICAqIGVxdWl2YWxlbnQgdG8gc2VsZWN0aW5nIGFuIGVtcHR5IGxpc3QuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZVxuICAgICAqIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlIG9wdGlvbiBsaXN0IHRvIGluZGljYXRlIHRoYXQgbm8gdmFsdWVzIGhhdmUgYmVlblxuICAgICAqIHNlbGVjdGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmNsZWFyKClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyBvcHRpb24gbGlzdCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZPcHRpb25MaXN0LnNldE9wdGlvbnNdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZXMoW10pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmb250IHNpemUgZm9yIHRoZSB0ZXh0IGluIHRoaXMgZmllbGQuIFRoZXJlIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBkZWZhdWx0IGFwcGVhcmFuY2Ugc3RyaW5nIChEQSkgc2V0IHdpdGggYSBmb250IHZhbHVlIHNwZWNpZmllZFxuICAgICAqIGZvciB0aGlzIHRvIHdvcmsuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LnNldEZvbnRTaXplKDQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250U2l6ZSBUaGUgZm9udCBzaXplIHRvIHNldCB0aGUgZm9udCB0by5cbiAgICAgKi9cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZvbnQgc2l6ZSBmb3IgdGhpcyBmaWVsZC4gTGFyZ2VyIGZvbnQgc2l6ZXMgd2lsbCByZXN1bHQgaW4gbGFyZ2VyXG4gICAgICogdGV4dCBiZWluZyBkaXNwbGF5ZWQgd2hlbiBQREYgcmVhZGVycyByZW5kZXIgdGhpcyBvcHRpb24gbGlzdC4gRm9udCBzaXplc1xuICAgICAqIG1heSBiZSBpbnRlZ2VyIG9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIFN1cHBseWluZyBhIG5lZ2F0aXZlIGZvbnQgc2l6ZVxuICAgICAqIHdpbGwgY2F1c2UgdGhpcyBtZXRob2QgdG8gdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5zZXRGb250U2l6ZSg0KVxuICAgICAqIG9wdGlvbkxpc3Quc2V0Rm9udFNpemUoMTUuNylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqID4gVGhpcyBtZXRob2QgZGVwZW5kcyB1cG9uIHRoZSBleGlzdGVuY2Ugb2YgYSBkZWZhdWx0IGFwcGVhcmFuY2VcbiAgICAgKiA+IChgL0RBYCkgc3RyaW5nLiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGFwcGVhcmFuY2Ugc3RyaW5nLFxuICAgICAqID4gb3IgdGhhdCBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhIGZvbnQgc2l6ZSAodmlhIHRoZSBgVGZgIG9wZXJhdG9yKSxcbiAgICAgKiA+IHRoZW4gdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb250U2l6ZSBUaGUgZm9udCBzaXplIHRvIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGV4dCBpbiB0aGlzIGZpZWxkLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLnNldEZvbnRTaXplID0gZnVuY3Rpb24gKGZvbnRTaXplKSB7XG4gICAgICAgIGFzc2VydFBvc2l0aXZlKGZvbnRTaXplLCAnZm9udFNpemUnKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb3B0aW9ucyBvZiB0aGlzIG9wdGlvbiBsaXN0IGFyZSBhbHdheXMgZGlzcGxheWVkXG4gICAgICogaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBpcnJlc3BlY3RpdmUgb2YgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBvcHRpb25zXG4gICAgICogd2VyZSBhZGRlZCB0byB0aGUgb3B0aW9uIGxpc3QuIFNlZSBbW1BERk9wdGlvbkxpc3QuZW5hYmxlU29ydGluZ11dIGFuZFxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5kaXNhYmxlU29ydGluZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogaWYgKG9wdGlvbkxpc3QuaXNTb3J0ZWQoKSkgY29uc29sZS5sb2coJ1NvcnRpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBvcHRpb24gbGlzdCBpcyBzb3J0ZWQuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuaXNTb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5Tb3J0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsd2F5cyBkaXNwbGF5IHRoZSBvcHRpb25zIG9mIHRoaXMgb3B0aW9uIGxpc3QgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLFxuICAgICAqIGlycmVzcGVjdGl2ZSBvZiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIG9wdGlvbnMgd2VyZSBhZGRlZCB0byB0aGlzIG9wdGlvblxuICAgICAqIGxpc3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZW5hYmxlU29ydGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZW5hYmxlU29ydGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Tb3J0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbHdheXMgZGlzcGxheSB0aGUgb3B0aW9ucyBvZiB0aGlzIG9wdGlvbiBsaXN0IGluIGFscGhhYmV0aWNhbFxuICAgICAqIG9yZGVyLiBJbnN0ZWFkLCBkaXNwbGF5IHRoZSBvcHRpb25zIGluIHdoaWNoZXZlciBvcmRlciB0aGV5IHdlcmUgYWRkZWRcbiAgICAgKiB0byB0aGlzIG9wdGlvbiBsaXN0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5kaXNhYmxlU29ydGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZGlzYWJsZVNvcnRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuU29ydCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgZnJvbSB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqIFNlZSBbW1BERk9wdGlvbkxpc3QuZW5hYmxlTXVsdGlzZWxlY3RdXSBhbmRcbiAgICAgKiBbW1BERk9wdGlvbkxpc3QuZGlzYWJsZU11bHRpc2VsZWN0XV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBpZiAob3B0aW9uTGlzdC5pc011bHRpc2VsZWN0KCkpIGNvbnNvbGUubG9nKCdNdWx0aXNlbGVjdCBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBtdWx0aXBsZSBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5pc011bHRpc2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgdXNlcnMgdG8gc2VsZWN0IG1vcmUgdGhhbiBvbmUgb3B0aW9uIGZyb20gdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5lbmFibGVNdWx0aXNlbGVjdCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZW5hYmxlTXVsdGlzZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IHVzZXJzIHRvIHNlbGVjdCBtb3JlIHRoYW4gb25lIG9wdGlvbiBmcm9tIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZGlzYWJsZU11bHRpc2VsZWN0KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5kaXNhYmxlTXVsdGlzZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIGlzIHN0b3JlZCwgb3IgXCJjb21taXR0ZWRcIixcbiAgICAgKiB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgb3B0aW9uLiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhhdCB0aGUgdXNlcidzXG4gICAgICogc2VsZWN0aW9uIGlzIHN0b3JlZCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGlzIG9wdGlvbiBsaXN0IGZpZWxkIChieVxuICAgICAqIGNsaWNraW5nIG91dHNpZGUgb2YgaXQgLSBvbiBhbm90aGVyIGZpZWxkLCBmb3IgZXhhbXBsZSkuIFNlZVxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5lbmFibGVTZWxlY3RPbkNsaWNrXV0gYW5kXG4gICAgICogW1tQREZPcHRpb25MaXN0LmRpc2FibGVTZWxlY3RPbkNsaWNrXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBpZiAob3B0aW9uTGlzdC5pc1NlbGVjdE9uQ2xpY2soKSkgY29uc29sZS5sb2coJ1NlbGVjdCBvbiBjbGljayBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBvcHRpb25zIGFyZSBzZWxlY3RlZCBpbW1lZGlhdGVseSBhZnRlciB0aGV5IGFyZVxuICAgICAqICAgICAgICAgIGNsaWNrZWQuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuaXNTZWxlY3RPbkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuQ29tbWl0T25TZWxDaGFuZ2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3RvcmUgdGhlIG9wdGlvbiBzZWxlY3RlZCBieSBhIHVzZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZXIgY2xpY2tzIHRoZVxuICAgICAqIG9wdGlvbi4gRG8gbm90IHdhaXQgZm9yIHRoZSB1c2VyIHRvIGxlYXZlIHRoaXMgb3B0aW9uIGxpc3QgZmllbGQgKGJ5XG4gICAgICogY2xpY2tpbmcgb3V0c2lkZSBvZiBpdCAtIG9uIGFub3RoZXIgZmllbGQsIGZvciBleGFtcGxlKS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZW5hYmxlU2VsZWN0T25DbGljaygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZW5hYmxlU2VsZWN0T25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Db21taXRPblNlbENoYW5nZSwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXYWl0IHRvIHN0b3JlIHRoZSBvcHRpb24gc2VsZWN0ZWQgYnkgYSB1c2VyIHVudGlsIHRoZXkgbGVhdmUgdGhpcyBvcHRpb25cbiAgICAgKiBsaXN0IGZpZWxkIChieSBjbGlja2luZyBvdXRzaWRlIG9mIGl0IC0gb24gYW5vdGhlciBmaWVsZCwgZm9yIGV4YW1wbGUpLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmRpc2FibGVTZWxlY3RPbkNsaWNrKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5kaXNhYmxlU2VsZWN0T25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Db21taXRPblNlbENoYW5nZSwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGlzIG9wdGlvbiBsaXN0IG9uIHRoZSBzcGVjaWZpZWQgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB1YnVudHVGb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udCh1YnVudHVGb250Qnl0ZXMpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uY3JlYXRlT3B0aW9uTGlzdCgnYmVzdC5ndW5kYW1zJylcbiAgICAgKiBvcHRpb25MaXN0LnNldE9wdGlvbnMoWydFeGlhJywgJ0R5bmFtZXMnLCAnS3lyaW9zJywgJ1ZpcnR1ZSddKVxuICAgICAqIG9wdGlvbkxpc3Quc2VsZWN0KFsnRXhpYScsICdWaXJ0dWUnXSlcbiAgICAgKlxuICAgICAqIG9wdGlvbkxpc3QuYWRkVG9QYWdlKHBhZ2UsIHtcbiAgICAgKiAgIHg6IDUwLFxuICAgICAqICAgeTogNzUsXG4gICAgICogICB3aWR0aDogMjAwLFxuICAgICAqICAgaGVpZ2h0OiAxMDAsXG4gICAgICogICB0ZXh0Q29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgIGJhY2tncm91bmRDb2xvcjogcmdiKDAsIDEsIDApLFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLCAwLCAxKSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDkwKSxcbiAgICAgKiAgIGZvbnQ6IHVidW50dUZvbnQsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHdpZGdldCBmb3IgdGhpcyBvcHRpb24gbGlzdCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGlzIG9wdGlvbiBsaXN0IHdpZGdldCBzaG91bGQgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGFkZGluZyB0aGlzIG9wdGlvbiBsaXN0IHdpZGdldC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5hZGRUb1BhZ2UgPSBmdW5jdGlvbiAocGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgW1tQREZQYWdlLCAnUERGUGFnZSddXSk7XG4gICAgICAgIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKCEoJ3RleHRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLnRleHRDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JhY2tncm91bmRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJhY2tncm91bmRDb2xvciA9IHJnYigxLCAxLCAxKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdib3JkZXJXaWR0aCcgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlcldpZHRoID0gMTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGZvciB0aGlzIG9wdGlvbiBsaXN0XG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmNyZWF0ZVdpZGdldCh7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDAsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDAsXG4gICAgICAgICAgICB3aWR0aDogKF9jID0gb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMTAwLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2UgPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwLFxuICAgICAgICAgICAgcm90YXRlOiAoX2YgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGhpZGRlbjogb3B0aW9ucy5oaWRkZW4sXG4gICAgICAgICAgICBwYWdlOiBwYWdlLnJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGlzIGZpZWxkXG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLmFkZFdpZGdldCh3aWRnZXRSZWYpO1xuICAgICAgICAvLyBTZXQgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciB3aWRnZXRcbiAgICAgICAgdmFyIGZvbnQgPSAoX2cgPSBvcHRpb25zLmZvbnQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHRoaXMuZG9jLmdldEZvcm0oKS5nZXREZWZhdWx0Rm9udCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGUgZ2l2ZW4gcGFnZVxuICAgICAgICBwYWdlLm5vZGUuYWRkQW5ub3Qod2lkZ2V0UmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgb3B0aW9uIGxpc3QgaGFzIGJlZW4gbWFya2VkIGFzIGRpcnR5LCBvciBpZiBhbnkgb2ZcbiAgICAgKiB0aGlzIG9wdGlvbiBsaXN0J3Mgd2lkZ2V0cyBkbyBub3QgaGF2ZSBhbiBhcHBlYXJhbmNlIHN0cmVhbS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIGlmIChvcHRpb25MaXN0Lm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUoKSkgY29uc29sZS5sb2coJ05lZWRzIHVwZGF0ZScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBvcHRpb24gbGlzdCBuZWVkcyBhbiBhcHBlYXJhbmNlIHVwZGF0ZS5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLmlzRGlydHkoKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgaGFzQXBwZWFyYW5jZXMgPSAoKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWwpIGluc3RhbmNlb2YgUERGU3RyZWFtO1xuICAgICAgICAgICAgaWYgKCFoYXNBcHBlYXJhbmNlcylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIG9wdGlvbiBsaXN0J3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIG9wdGlvbiBsaXN0cy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgdGhpcy51cGRhdGVBcHBlYXJhbmNlcyhmb250KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgb3B0aW9uIGxpc3QncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGdpdmVuIGFwcGVhcmFuY2UgcHJvdmlkZXIuIElmIG5vIGBwcm92aWRlcmAgaXMgcGFzc2VkLCB0aGUgZGVmYXVsdFxuICAgICAqIGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIG9wdGlvbiBsaXN0cyB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QudXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhLCAoZmllbGQsIHdpZGdldCwgZm9udCkgPT4ge1xuICAgICAqICAgLi4uXG4gICAgICogICByZXR1cm4gZHJhd09wdGlvbkxpc3QoLi4uKVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgT3B0aW9uYWxseSwgdGhlIGFwcGVhcmFuY2UgcHJvdmlkZXIgdG8gYmUgdXNlZCBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS51cGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChmb250LCBwcm92aWRlcikge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwcm92aWRlciwgJ3Byb3ZpZGVyJywgW0Z1bmN0aW9uXSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICAvLyBnZXRPcHRpb24oaW5kZXg6IG51bWJlcik6IHN0cmluZyB7fVxuICAgIC8vIGdldFNlbGVjdGVkSW5kaWNlcygpOiBudW1iZXJbXSB7fVxuICAgIC8vIHJlbW92ZU9wdGlvbnMob3B0aW9uOiBzdHJpbmcgfCBzdHJpbmdbXSkge31cbiAgICAvLyByZW1vdmVJbmRpY2VzKG9wdGlvbjogbnVtYmVyW10pIHt9XG4gICAgLy8gZGVzZWxlY3Qob3B0aW9uczogc3RyaW5nIHwgc3RyaW5nW10pIHt9XG4gICAgLy8gZGVzZWxlY3RJbmRpY2VzKG9wdGlvbkluZGljZXM6IG51bWJlcltdKSB7fVxuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBmb250LCBwcm92aWRlcikge1xuICAgICAgICB2YXIgYXBQcm92aWRlciA9IHByb3ZpZGVyICE9PSBudWxsICYmIHByb3ZpZGVyICE9PSB2b2lkIDAgPyBwcm92aWRlciA6IGRlZmF1bHRPcHRpb25MaXN0QXBwZWFyYW5jZVByb3ZpZGVyO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZXMgPSBub3JtYWxpemVBcHBlYXJhbmNlKGFwUHJvdmlkZXIodGhpcywgd2lkZ2V0LCBmb250KSk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZVdpdGhGb250KHdpZGdldCwgZm9udCwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0T3B0aW9uTGlzdF1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGVcbiAgICAgKiA+IGFuIGluc3RhbmNlIG9mIFtbUERGT3B0aW9uTGlzdF1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZPcHRpb25MaXN0XV0gZnJvbSBhbiBleGlzdGluZyBhY3JvTGlzdEJveCBhbmRcbiAgICAgKiByZWZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvQ29tYm9Cb3ggVGhlIHVuZGVybHlpbmcgYFBERkFjcm9MaXN0Qm94YCBmb3IgdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgb3B0aW9uIGxpc3Qgd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5vZiA9IGZ1bmN0aW9uIChhY3JvTGlzdEJveCwgcmVmLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZPcHRpb25MaXN0KGFjcm9MaXN0Qm94LCByZWYsIGRvYyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGT3B0aW9uTGlzdDtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9wdGlvbkxpc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPcHRpb25MaXN0LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4uL1BERlBhZ2VcIjtcbmltcG9ydCBQREZGaWVsZCwgeyBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zLCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyBub3JtYWxpemVBcHBlYXJhbmNlLCBkZWZhdWx0UmFkaW9Hcm91cEFwcGVhcmFuY2VQcm92aWRlciwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuaW1wb3J0IHsgcmdiIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFBERk5hbWUsIFBERkhleFN0cmluZywgUERGRGljdCwgUERGQWNyb1JhZGlvQnV0dG9uLCBBY3JvQnV0dG9uRmxhZ3MsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRPclVuZGVmaW5lZCwgYXNzZXJ0SXNPbmVPZiB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmFkaW8gZ3JvdXAgZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERlJhZGlvR3JvdXBdXSBmaWVsZHMgYXJlIGNvbGxlY3Rpb25zIG9mIHJhZGlvIGJ1dHRvbnMuIFRoZSBwdXJwb3NlIG9mIGFcbiAqIHJhZGlvIGdyb3VwIGlzIHRvIGVuYWJsZSB1c2VycyB0byBzZWxlY3Qgb25lIG9wdGlvbiBmcm9tIGEgc2V0IG9mIG11dHVhbGx5XG4gKiBleGNsdXNpdmUgY2hvaWNlcy4gRWFjaCBjaG9pY2UgaW4gYSByYWRpbyBncm91cCBpcyByZXByZXNlbnRlZCBieSBhIHJhZGlvXG4gKiBidXR0b24uIFJhZGlvIGJ1dHRvbnMgZWFjaCBoYXZlIHR3byBzdGF0ZXM6IGBvbmAgYW5kIGBvZmZgLiBBdCBtb3N0IG9uZVxuICogcmFkaW8gYnV0dG9uIGluIGEgZ3JvdXAgbWF5IGJlIGluIHRoZSBgb25gIHN0YXRlIGF0IGFueSB0aW1lLiBVc2VycyBjYW5cbiAqIGNsaWNrIG9uIGEgcmFkaW8gYnV0dG9uIHRvIHNlbGVjdCBpdCAoYW5kIHRoZXJlYnkgYXV0b21hdGljYWxseSBkZXNlbGVjdCBhbnlcbiAqIG90aGVyIHJhZGlvIGJ1dHRvbiB0aGF0IG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIHNlbGVjdGVkKS4gU29tZSByYWRpb1xuICogZ3JvdXBzIGFsbG93IHVzZXJzIHRvIHRvZ2dsZSBhIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBgb2ZmYCBieSBjbGlja2luZyBvblxuICogaXQgKHNlZSBbW1BERlJhZGlvR3JvdXAuaXNPZmZUb2dnbGVhYmxlXV0pLlxuICpcbiAqIE5vdGUgdGhhdCBzb21lIHJhZGlvIGdyb3VwcyBhbGxvdyBtdWx0aXBsZSByYWRpbyBidXR0b25zIHRvIGJlIGluIHRoZSBgb25gXG4gKiBzdGF0ZSBhdCB0aGUgc2FtZSB0eXBlICoqaWYqKiB0aGV5IHJlcHJlc2VudCB0aGUgc2FtZSB1bmRlcmx5aW5nIHZhbHVlIChzZWVcbiAqIFtbUERGUmFkaW9Hcm91cC5pc011dHVhbGx5RXhjbHVzaXZlXV0pLlxuICovXG52YXIgUERGUmFkaW9Hcm91cCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUmFkaW9Hcm91cCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZSYWRpb0dyb3VwKGFjcm9SYWRpb0J1dHRvbiwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb1JhZGlvQnV0dG9uLCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb1JhZGlvQnV0dG9uLCAnYWNyb1JhZGlvQnV0dG9uJywgW1xuICAgICAgICAgICAgW1BERkFjcm9SYWRpb0J1dHRvbiwgJ1BERkFjcm9SYWRpb0J1dHRvbiddLFxuICAgICAgICBdKTtcbiAgICAgICAgX3RoaXMuYWNyb0ZpZWxkID0gYWNyb1JhZGlvQnV0dG9uO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgb3B0aW9ucyBmb3IgdGhpcyByYWRpbyBncm91cC4gRWFjaCBvcHRpb24gaXNcbiAgICAgKiByZXByZXNlbnRlZCBieSBhIHJhZGlvIGJ1dHRvbi4gVGhlc2UgcmFkaW8gYnV0dG9ucyBhcmUgZGlzcGxheWVkIGF0XG4gICAgICogdmFyaW91cyBsb2NhdGlvbnMgaW4gdGhlIGRvY3VtZW50LCBwb3RlbnRpYWxseSBvbiBkaWZmZXJlbnQgcGFnZXMgKHRob3VnaFxuICAgICAqIHR5cGljYWxseSB0aGV5IGFyZSBzdGFja2VkIGhvcml6b250YWxseSBvciB2ZXJ0aWNhbGx5IG9uIHRoZSBzYW1lIHBhZ2UpLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiBjb25zdCBvcHRpb25zID0gcmFkaW9Hcm91cC5nZXRPcHRpb25zKClcbiAgICAgKiBjb25zb2xlLmxvZygnUmFkaW8gR3JvdXAgb3B0aW9uczonLCBvcHRpb25zKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpb25zIGZvciB0aGlzIHJhZGlvIGdyb3VwLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBleHBvcnRWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRFeHBvcnRWYWx1ZXMoKTtcbiAgICAgICAgaWYgKGV4cG9ydFZhbHVlcykge1xuICAgICAgICAgICAgdmFyIGV4cG9ydE9wdGlvbnMgPSBuZXcgQXJyYXkoZXhwb3J0VmFsdWVzLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBleHBvcnRWYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgZXhwb3J0T3B0aW9uc1tpZHhdID0gZXhwb3J0VmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV4cG9ydE9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9uVmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0T25WYWx1ZXMoKTtcbiAgICAgICAgdmFyIG9uT3B0aW9ucyA9IG5ldyBBcnJheShvblZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvbk9wdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBvbk9wdGlvbnNbaWR4XSA9IG9uVmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvbk9wdGlvbnM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIG9wdGlvbiBmb3IgdGhpcyByYWRpbyBncm91cC4gVGhlIHNlbGVjdGVkIG9wdGlvbiBpc1xuICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoZSByYWRpbyBidXR0b24gaW4gdGhpcyBncm91cCB0aGF0IGlzIHR1cm5lZCBvbi4gQXQgbW9zdFxuICAgICAqIG9uZSByYWRpbyBidXR0b24gaW4gYSBncm91cCBjYW4gYmUgc2VsZWN0ZWQuIElmIG5vIGJ1dHRvbnMgaW4gdGhpcyBncm91cFxuICAgICAqIGFyZSBzZWxlY3RlZCwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIGNvbnN0IHNlbGVjdGVkID0gcmFkaW9Hcm91cC5nZXRTZWxlY3RlZCgpXG4gICAgICogY29uc29sZS5sb2coJ1NlbGVjdGVkIHJhZGlvIGJ1dHRvbjonLCBzZWxlY3RlZClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgc2VsZWN0ZWQgb3B0aW9uIGZvciB0aGlzIHJhZGlvIGdyb3VwLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmdldFNlbGVjdGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09IFBERk5hbWUub2YoJ09mZicpKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGV4cG9ydFZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldEV4cG9ydFZhbHVlcygpO1xuICAgICAgICBpZiAoZXhwb3J0VmFsdWVzKSB7XG4gICAgICAgICAgICB2YXIgb25WYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPblZhbHVlcygpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb25WYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9uVmFsdWVzW2lkeF0gPT09IHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0VmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZS5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvLyAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSB0aGlzIHNlZW1zIHRvIGNyYXNoIEFjcm9iYXQuIE1heWJlIGl0J3MgYmVjYXVzZSB3ZVxuICAgIC8vIC8vICAgICAgIGFyZW4ndCByZW1vdmluZyB0aGUgd2lkZ2V0IHJlZmVyZW5jZSBmcm9tIHRoZSBwYWdlJ3MgQW5ub3RzP1xuICAgIC8vIHJlbW92ZU9wdGlvbihvcHRpb246IHN0cmluZykge1xuICAgIC8vICAgYXNzZXJ0SXMob3B0aW9uLCAnb3B0aW9uJywgWydzdHJpbmcnXSk7XG4gICAgLy8gICAvLyBUT0RPOiBBc3NlcnQgaXMgdmFsaWQgYG9wdGlvbmAhXG4gICAgLy8gICBjb25zdCBvblZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9uVmFsdWVzKCk7XG4gICAgLy8gICBjb25zdCBleHBvcnRWYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRFeHBvcnRWYWx1ZXMoKTtcbiAgICAvLyAgIGlmIChleHBvcnRWYWx1ZXMpIHtcbiAgICAvLyAgICAgZm9yIChsZXQgaWR4ID0gMCwgbGVuID0gZXhwb3J0VmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgIC8vICAgICAgIGlmIChleHBvcnRWYWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCkgPT09IG9wdGlvbikge1xuICAgIC8vICAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlV2lkZ2V0KGlkeCk7XG4gICAgLy8gICAgICAgICB0aGlzLmFjcm9GaWVsZC5yZW1vdmVFeHBvcnRWYWx1ZShpZHgpO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgZm9yIChsZXQgaWR4ID0gMCwgbGVuID0gb25WYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgLy8gICAgICAgY29uc3QgdmFsdWUgPSBvblZhbHVlc1tpZHhdO1xuICAgIC8vICAgICAgIGlmICh2YWx1ZS5kZWNvZGVUZXh0KCkgPT09IG9wdGlvbikge1xuICAgIC8vICAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlV2lkZ2V0KGlkeCk7XG4gICAgLy8gICAgICAgICB0aGlzLmFjcm9GaWVsZC5yZW1vdmVFeHBvcnRWYWx1ZShpZHgpO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgfVxuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICAvKipcbiAgICAgKiBTZWxlY3QgYW4gb3B0aW9uIGZvciB0aGlzIHJhZGlvIGdyb3VwLiBUaGlzIG9wZXJhdGlvbiBpcyBhbmFsb2dvdXMgdG8gYVxuICAgICAqIGh1bWFuIHVzZXIgY2xpY2tpbmcgb25lIG9mIHRoZSByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgdmlhIGEgUERGXG4gICAgICogcmVhZGVyIHRvIHRvZ2dsZSBpdCBvbi4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgc3RhdGUgb2ZcbiAgICAgKiB0aGUgcmFkaW8gZ3JvdXAgdG8gaW5kaWNhdGUgd2hpY2ggb3B0aW9uIGhhcyBiZWVuIHNlbGVjdGVkLiBQREYgbGlicmFyaWVzXG4gICAgICogYW5kIHJlYWRlcnMgd2lsbCBiZSBhYmxlIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSBmcm9tIHRoZSBzYXZlZCBkb2N1bWVudCBhbmRcbiAgICAgKiBkZXRlcm1pbmUgd2hpY2ggb3B0aW9uIHdhcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnYmVzdC5zdXBlcmhlcm8ucmFkaW9Hcm91cCcpXG4gICAgICogcmFkaW9Hcm91cC5zZWxlY3QoJ09uZSBQdW5jaCBNYW4nKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgcmFkaW8gZ3JvdXAgYXMgZGlydHksIGNhdXNpbmcgaXRzIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHRvIGJlIHVwZGF0ZWQgd2hlbiBlaXRoZXIgW1tQREZEb2N1bWVudC5zYXZlXV0gb3JcbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIGlzIGNhbGxlZC4gVGhlIHVwZGF0ZWQgYXBwZWFyYW5jZVxuICAgICAqIHN0cmVhbXMgd2lsbCBkaXNwbGF5IGEgZG90IGluc2lkZSB0aGUgd2lkZ2V0IG9mIHRoaXMgY2hlY2sgYm94IGZpZWxkXG4gICAgICogdGhhdCByZXByZXNlbnRzIHRoZSBzZWxlY3RlZCBvcHRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgICBhc3NlcnRJcyhvcHRpb24sICdvcHRpb24nLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIHZhbGlkT3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICBhc3NlcnRJc09uZU9mKG9wdGlvbiwgJ29wdGlvbicsIHZhbGlkT3B0aW9ucyk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdmFyIG9uVmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0T25WYWx1ZXMoKTtcbiAgICAgICAgdmFyIGV4cG9ydFZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldEV4cG9ydFZhbHVlcygpO1xuICAgICAgICBpZiAoZXhwb3J0VmFsdWVzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBleHBvcnRWYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cG9ydFZhbHVlc1tpZHhdLmRlY29kZVRleHQoKSA9PT0gb3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlKG9uVmFsdWVzW2lkeF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9uVmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9uVmFsdWVzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmRlY29kZVRleHQoKSA9PT0gb3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsZWFyIGFueSBzZWxlY3RlZCBvcHRpb24gZm9yIHRoaXMgZHJvcGRvd24uIFRoaXMgd2lsbCByZXN1bHQgaW4gYWxsXG4gICAgICogcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIGJlaW5nIHRvZ2dsZWQgb2ZmLiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZVxuICAgICAqIHRoZSB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZSBkcm9wZG93biB0byBpbmRpY2F0ZSB0aGF0IG5vIHJhZGlvIGJ1dHRvbnNcbiAgICAgKiBoYXZlIGJlZW4gc2VsZWN0ZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAuY2xlYXIoKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHJhZGlvIGdyb3VwIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlJhZGlvR3JvdXAuc2VsZWN0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWUoUERGTmFtZS5vZignT2ZmJykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdXNlcnMgY2FuIGNsaWNrIG9uIHJhZGlvIGJ1dHRvbnMgaW4gdGhpcyBncm91cCB0byB0b2dnbGVcbiAgICAgKiB0aGVtIG9mZi4gVGhlIGFsdGVybmF0aXZlIGlzIHRoYXQgb25jZSBhIHVzZXIgY2xpY2tzIG9uIGEgcmFkaW8gYnV0dG9uXG4gICAgICogdG8gc2VsZWN0IGl0LCB0aGUgb25seSB3YXkgdG8gZGVzZWxlY3QgaXQgaXMgYnkgc2VsZWN0aW5nIG9uIGFub3RoZXIgcmFkaW9cbiAgICAgKiBidXR0b24gaW4gdGhlIGdyb3VwLiBTZWUgW1tQREZSYWRpb0dyb3VwLmVuYWJsZU9mZlRvZ2dsaW5nXV0gYW5kXG4gICAgICogW1tQREZSYWRpb0dyb3VwLmRpc2FibGVPZmZUb2dnbGluZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogaWYgKHJhZGlvR3JvdXAuaXNPZmZUb2dnbGVhYmxlKCkpIGNvbnNvbGUubG9nKCdPZmYgdG9nZ2xpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuaXNPZmZUb2dnbGVhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0J1dHRvbkZsYWdzLk5vVG9nZ2xlVG9PZmYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgdXNlcnMgdG8gY2xpY2sgb24gc2VsZWN0ZWQgcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIHRvIHRvZ2dsZVxuICAgICAqIHRoZW0gb2ZmLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC5lbmFibGVPZmZUb2dnbGluZygpXG4gICAgICogYGBgXG4gICAgICogPiAqKk5PVEU6KiogVGhpcyBmZWF0dXJlIGlzIGRvY3VtZW50ZWQgaW4gdGhlIFBERiBzcGVjaWZpY2F0aW9uXG4gICAgICogPiAoVGFibGUgMjI2KS4gSG93ZXZlciwgbW9zdCBQREYgcmVhZGVycyBkbyBub3QgcmVzcGVjdCB0aGlzIG9wdGlvbiBhbmRcbiAgICAgKiA+IHByZXZlbnQgdXNlcnMgZnJvbSB0b2dnbGluZyByYWRpbyBidXR0b25zIG9mZiBldmVuIHdoZW4gaXQgaXMgZW5hYmxlZC5cbiAgICAgKiA+IEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZyAoOS82LzIwMjApIE1hYydzIFByZXZpZXcgc29mdHdhcmUgZGlkXG4gICAgICogPiByZXNwZWN0IHRoZSBvcHRpb24uIEFkb2JlIEFjcm9iYXQsIEZveGl0IFJlYWRlciwgYW5kIEdvb2dsZSBDaHJvbWUgZGlkXG4gICAgICogPiBub3QuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuZW5hYmxlT2ZmVG9nZ2xpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQnV0dG9uRmxhZ3MuTm9Ub2dnbGVUb09mZiwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJldmVudCB1c2VycyBmcm9tIGNsaWNraW5nIG9uIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbnMgaW4gdGhpcyBncm91cCB0b1xuICAgICAqIHRvZ2dsZSB0aGVtIG9mZi4gQ2xpY2tpbmcgb24gYSBzZWxlY3RlZCByYWRpbyBidXR0b24gd2lsbCBoYXZlIG5vIGVmZmVjdC5cbiAgICAgKiBUaGUgb25seSB3YXkgdG8gZGVzZWxlY3QgYSBzZWxlY3RlZCByYWRpbyBidXR0b24gaXMgdG8gY2xpY2sgb24gYVxuICAgICAqIGRpZmZlcmVudCByYWRpbyBidXR0b24gaW4gdGhlIGdyb3VwLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC5kaXNhYmxlT2ZmVG9nZ2xpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmRpc2FibGVPZmZUb2dnbGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9CdXR0b25GbGFncy5Ob1RvZ2dsZVRvT2ZmLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS5cbiAgICAgKiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgcmFkaW8gYnV0dG9uLCBvbmx5IHRoYXQgc3BlY2lmaWNcbiAgICAgKiBidXR0b24gd2lsbCBiZSB0dXJuZWQgb24uIEV2ZW4gaWYgb3RoZXIgcmFkaW8gYnV0dG9ucyBpbiB0aGUgZ3JvdXBcbiAgICAgKiByZXByZXNlbnQgdGhlIHNhbWUgdmFsdWUsIHRoZXkgd2lsbCBub3QgYmUgZW5hYmxlZC4gVGhlIGFsdGVybmF0aXZlIHRvXG4gICAgICogdGhpcyBpcyB0aGF0IGNsaWNraW5nIGEgcmFkaW8gYnV0dG9uIHdpbGwgc2VsZWN0IHRoYXQgYnV0dG9uIGFsb25nIHdpdGhcbiAgICAgKiBhbnkgb3RoZXIgcmFkaW8gYnV0dG9ucyBpbiB0aGUgZ3JvdXAgdGhhdCBzaGFyZSB0aGUgc2FtZSB2YWx1ZS4gU2VlXG4gICAgICogW1tQREZSYWRpb0dyb3VwLmVuYWJsZU11dHVhbEV4Y2x1c2lvbl1dIGFuZFxuICAgICAqIFtbUERGUmFkaW9Hcm91cC5kaXNhYmxlTXV0dWFsRXhjbHVzaW9uXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIGlmIChyYWRpb0dyb3VwLmlzTXV0dWFsbHlFeGNsdXNpdmUoKSkgY29uc29sZS5sb2coJ011dHVhbCBleGNsdXNpb24gaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuaXNNdXR1YWxseUV4Y2x1c2l2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9CdXR0b25GbGFncy5SYWRpb3NJblVuaXNvbik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSB1c2VyIGNsaWNrcyBhIHJhZGlvIGJ1dHRvbiBpbiB0aGlzIGdyb3VwIGl0IHdpbGwgYmUgc2VsZWN0ZWQuIEluXG4gICAgICogYWRkaXRpb24sIGFueSBvdGhlciByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgdGhhdCBzaGFyZSB0aGUgc2FtZVxuICAgICAqIHVuZGVybHlpbmcgdmFsdWUgd2lsbCBhbHNvIGJlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC5lbmFibGVNdXR1YWxFeGNsdXNpb24oKVxuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBtdXN0IGJlIGVuYWJsZWQgcHJpb3IgdG8gYWRkaW5nIG9wdGlvbnMgdG8gdGhlXG4gICAgICogcmFkaW8gZ3JvdXAuIEl0IGRvZXMgbm90IGN1cnJlbnRseSBhcHBseSByZXRyb2FjdGl2ZWx5IHRvIGV4aXN0aW5nXG4gICAgICogcmFkaW8gYnV0dG9ucyBpbiB0aGUgZ3JvdXAuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuZW5hYmxlTXV0dWFsRXhjbHVzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0J1dHRvbkZsYWdzLlJhZGlvc0luVW5pc29uLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSB1c2VyIGNsaWNrcyBhIHJhZGlvIGJ1dHRvbiBpbiB0aGlzIGdyb3VwIG9ubHkgaXQgd2lsbCBiZSBzZWxlY3RlZC5cbiAgICAgKiBObyBvdGhlciByYWRpbyBidXR0b25zIGluIHRoZSBncm91cCB3aWxsIGJlIHNlbGVjdGVkLCBldmVuIGlmIHRoZXkgc2hhcmVcbiAgICAgKiB0aGUgc2FtZSB1bmRlcmx5aW5nIHZhbHVlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC5kaXNhYmxlTXV0dWFsRXhjbHVzaW9uKClcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gbXVzdCBiZSBkaXNhYmxlZCBwcmlvciB0byBhZGRpbmcgb3B0aW9ucyB0byB0aGVcbiAgICAgKiByYWRpbyBncm91cC4gSXQgZG9lcyBub3QgY3VycmVudGx5IGFwcGx5IHJldHJvYWN0aXZlbHkgdG8gZXhpc3RpbmdcbiAgICAgKiByYWRpbyBidXR0b25zIGluIHRoZSBncm91cC5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5kaXNhYmxlTXV0dWFsRXhjbHVzaW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0J1dHRvbkZsYWdzLlJhZGlvc0luVW5pc29uLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCBhIG5ldyByYWRpbyBidXR0b24gdG8gdGhpcyBncm91cCBvbiB0aGUgc3BlY2lmaWVkIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uY3JlYXRlUmFkaW9Hcm91cCgnYmVzdC5ndW5kYW0nKVxuICAgICAqXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgKiAgIHg6IDUwLFxuICAgICAqICAgd2lkdGg6IDI1LFxuICAgICAqICAgaGVpZ2h0OiAyNSxcbiAgICAgKiAgIHRleHRDb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgYmFja2dyb3VuZENvbG9yOiByZ2IoMCwgMSwgMCksXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAsIDAsIDEpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoOTApLFxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHJhZGlvR3JvdXAuYWRkT3B0aW9uVG9QYWdlKCdFeGlhJywgcGFnZSwgeyAuLi5vcHRpb25zLCB5OiA1MCB9KVxuICAgICAqIHJhZGlvR3JvdXAuYWRkT3B0aW9uVG9QYWdlKCdEeW5hbWVzJywgcGFnZSwgeyAuLi5vcHRpb25zLCB5OiAxMTAgfSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHJhZGlvIGJ1dHRvbiB3aWRnZXQgZm9yIHRoaXMgcmFkaW8gZ3JvdXAgZmllbGQuXG4gICAgICogQHBhcmFtIG9wdGlvbiBUaGUgb3B0aW9uIHRoYXQgdGhlIHJhZGlvIGJ1dHRvbiB3aWRnZXQgcmVwcmVzZW50cy5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGUgcmFkaW8gYnV0dG9uIHdpZGdldCBzaG91bGQgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGFkZGluZyB0aGUgcmFkaW8gYnV0dG9uIHdpZGdldC5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5hZGRPcHRpb25Ub1BhZ2UgPSBmdW5jdGlvbiAob3B0aW9uLCBwYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb24sICdvcHRpb24nLCBbJ3N0cmluZyddKTtcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbW1BERlBhZ2UsICdQREZQYWdlJ11dKTtcbiAgICAgICAgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGZvciB0aGlzIHJhZGlvIGJ1dHRvblxuICAgICAgICB2YXIgd2lkZ2V0ID0gdGhpcy5jcmVhdGVXaWRnZXQoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDAsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDUwLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiA1MCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogKF9lID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnRleHRDb2xvcikgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogcmdiKDAsIDAsIDApLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAoX2YgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiByZ2IoMSwgMSwgMSksXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogKF9nID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlckNvbG9yKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiByZ2IoMCwgMCwgMCksXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9oID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAxLFxuICAgICAgICAgICAgcm90YXRlOiAoX2ogPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgaGlkZGVuOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB2YXIgYXBTdGF0ZVZhbHVlID0gdGhpcy5hY3JvRmllbGQuYWRkV2lkZ2V0V2l0aE9wdCh3aWRnZXRSZWYsIFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb24pLCAhdGhpcy5pc011dHVhbGx5RXhjbHVzaXZlKCkpO1xuICAgICAgICAvLyBTZXQgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciB3aWRnZXRcbiAgICAgICAgd2lkZ2V0LnNldEFwcGVhcmFuY2VTdGF0ZShQREZOYW1lLm9mKCdPZmYnKSk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGFwU3RhdGVWYWx1ZSk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIGdpdmVuIHBhZ2VcbiAgICAgICAgcGFnZS5ub2RlLmFkZEFubm90KHdpZGdldFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgb2YgdGhpcyBncm91cCdzIHJhZGlvIGJ1dHRvbiB3aWRnZXRzIGRvIG5vdCBoYXZlIGFuXG4gICAgICogYXBwZWFyYW5jZSBzdHJlYW0gZm9yIHRoZWlyIGN1cnJlbnQgc3RhdGUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiBpZiAocmFkaW9Hcm91cC5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIGNvbnNvbGUubG9nKCdOZWVkcyB1cGRhdGUnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgcmFkaW8gZ3JvdXAgbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZVN0YXRlKCk7XG4gICAgICAgICAgICB2YXIgbm9ybWFsID0gKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWw7XG4gICAgICAgICAgICBpZiAoIShub3JtYWwgaW5zdGFuY2VvZiBQREZEaWN0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZSAmJiAhbm9ybWFsLmhhcyhzdGF0ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBncm91cCdzIHJhZGlvIGJ1dHRvbiB3aWRnZXRzXG4gICAgICogdXNpbmcgdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgcmFkaW8gZ3JvdXBzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVBcHBlYXJhbmNlcygpO1xuICAgIH07XG4gICAgLy8gcmcudXBkYXRlQXBwZWFyYW5jZXMoKGZpZWxkOiBhbnksIHdpZGdldDogYW55KSA9PiB7XG4gICAgLy8gICBhc3NlcnQoZmllbGQgPT09IHJnKTtcbiAgICAvLyAgIGFzc2VydCh3aWRnZXQgaW5zdGFuY2VvZiBQREZXaWRnZXRBbm5vdGF0aW9uKTtcbiAgICAvLyAgIHJldHVybiB7IG9uOiBbLi4ucmVjdGFuZ2xlLCAuLi5jaXJjbGVdLCBvZmY6IFsuLi5yZWN0YW5nbGUsIC4uLmNpcmNsZV0gfTtcbiAgICAvLyB9KTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGdyb3VwJ3MgcmFkaW8gYnV0dG9uIHdpZGdldHNcbiAgICAgKiB1c2luZyB0aGUgZ2l2ZW4gYXBwZWFyYW5jZSBwcm92aWRlci4gSWYgbm8gYHByb3ZpZGVyYCBpcyBwYXNzZWQsIHRoZVxuICAgICAqIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgcmFkaW8gZ3JvdXBzIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIHJhZGlvR3JvdXAudXBkYXRlQXBwZWFyYW5jZXMoKGZpZWxkLCB3aWRnZXQpID0+IHtcbiAgICAgKiAgIC4uLlxuICAgICAqICAgcmV0dXJuIHtcbiAgICAgKiAgICAgbm9ybWFsOiB7IG9uOiBkcmF3UmFkaW9CdXR0b24oLi4uKSwgb2ZmOiBkcmF3UmFkaW9CdXR0b24oLi4uKSB9LFxuICAgICAqICAgICBkb3duOiB7IG9uOiBkcmF3UmFkaW9CdXR0b24oLi4uKSwgb2ZmOiBkcmF3UmFkaW9CdXR0b24oLi4uKSB9LFxuICAgICAqICAgfVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIE9wdGlvbmFsbHksIHRoZSBhcHBlYXJhbmNlIHByb3ZpZGVyIHRvIGJlIHVzZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUudXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQocHJvdmlkZXIsICdwcm92aWRlcicsIFtGdW5jdGlvbl0pO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgb25WYWx1ZSA9IHdpZGdldC5nZXRPblZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoIW9uVmFsdWUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBvblZhbHVlLCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBvblZhbHVlLCBwcm92aWRlcikge1xuICAgICAgICB2YXIgYXBQcm92aWRlciA9IHByb3ZpZGVyICE9PSBudWxsICYmIHByb3ZpZGVyICE9PSB2b2lkIDAgPyBwcm92aWRlciA6IGRlZmF1bHRSYWRpb0dyb3VwQXBwZWFyYW5jZVByb3ZpZGVyO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZXMgPSBub3JtYWxpemVBcHBlYXJhbmNlKGFwUHJvdmlkZXIodGhpcywgd2lkZ2V0KSk7XG4gICAgICAgIHRoaXMudXBkYXRlT25PZmZXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgb25WYWx1ZSwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0T3B0aW9uTGlzdF1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGT3B0aW9uTGlzdF1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZPcHRpb25MaXN0XV0gZnJvbSBhbiBleGlzdGluZyBhY3JvUmFkaW9CdXR0b25cbiAgICAgKiBhbmQgcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb1JhZGlvQnV0dG9uIFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvUmFkaW9CdXR0b25gIGZvciB0aGlzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICByYWRpbyBncm91cC5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIHJhZGlvIGdyb3VwLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgcmFkaW8gZ3JvdXAgd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5vZiA9IGZ1bmN0aW9uIChhY3JvUmFkaW9CdXR0b24sIHJlZiwgZG9jKSB7IHJldHVybiBuZXcgUERGUmFkaW9Hcm91cChhY3JvUmFkaW9CdXR0b24sIHJlZiwgZG9jKTsgfTtcbiAgICByZXR1cm4gUERGUmFkaW9Hcm91cDtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlJhZGlvR3JvdXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZSYWRpb0dyb3VwLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkZpZWxkIGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyBQREZBY3JvU2lnbmF0dXJlIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBzaWduYXR1cmUgZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERlNpZ25hdHVyZV1dIGZpZWxkcyBhcmUgZGlnaXRhbCBzaWduYXR1cmVzLiBgcGRmLWxpYmAgZG9lcyBub3RcbiAqIGN1cnJlbnRseSBwcm92aWRlIGFueSBzcGVjaWFsaXplZCBBUElzIGZvciBjcmVhdGluZyBkaWdpdGFsIHNpZ25hdHVyZXMgb3JcbiAqIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9mIGV4aXN0aW5nIGRpZ2l0YWwgc2lnbmF0dXJlcy5cbiAqL1xudmFyIFBERlNpZ25hdHVyZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGU2lnbmF0dXJlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlNpZ25hdHVyZShhY3JvU2lnbmF0dXJlLCByZWYsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBhY3JvU2lnbmF0dXJlLCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb1NpZ25hdHVyZSwgJ2Fjcm9TaWduYXR1cmUnLCBbXG4gICAgICAgICAgICBbUERGQWNyb1NpZ25hdHVyZSwgJ1BERkFjcm9TaWduYXR1cmUnXSxcbiAgICAgICAgXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9TaWduYXR1cmU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGU2lnbmF0dXJlLnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRm9ybS5nZXRTaWduYXR1cmVdXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlIGFuXG4gICAgICogPiBpbnN0YW5jZSBvZiBbW1BERlNpZ25hdHVyZV1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZTaWduYXR1cmVdXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9TaWduYXR1cmUgYW5kXG4gICAgICogcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb1NpZ25hdHVyZSBUaGUgdW5kZXJseWluZyBgUERGQWNyb1NpZ25hdHVyZWAgZm9yIHRoaXMgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgc2lnbmF0dXJlIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERlNpZ25hdHVyZS5vZiA9IGZ1bmN0aW9uIChhY3JvU2lnbmF0dXJlLCByZWYsIGRvYykgeyByZXR1cm4gbmV3IFBERlNpZ25hdHVyZShhY3JvU2lnbmF0dXJlLCByZWYsIGRvYyk7IH07XG4gICAgcmV0dXJuIFBERlNpZ25hdHVyZTtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlNpZ25hdHVyZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlNpZ25hdHVyZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuLi9QREZQYWdlXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi4vUERGRm9udFwiO1xuaW1wb3J0IFBERkZpZWxkLCB7IGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMsIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUFwcGVhcmFuY2UsIGRlZmF1bHRUZXh0RmllbGRBcHBlYXJhbmNlUHJvdmlkZXIsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBSaWNoVGV4dEZpZWxkUmVhZEVycm9yLCBFeGNlZWRlZE1heExlbmd0aEVycm9yLCBJbnZhbGlkTWF4TGVuZ3RoRXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgSW1hZ2VBbGlnbm1lbnQgfSBmcm9tIFwiLi4vaW1hZ2UvYWxpZ25tZW50XCI7XG5pbXBvcnQgeyBUZXh0QWxpZ25tZW50IH0gZnJvbSBcIi4uL3RleHQvYWxpZ25tZW50XCI7XG5pbXBvcnQgeyBQREZIZXhTdHJpbmcsIFBERlN0cmVhbSwgUERGQWNyb1RleHQsIEFjcm9UZXh0RmxhZ3MsIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRJc09uZU9mLCBhc3NlcnRPclVuZGVmaW5lZCwgYXNzZXJ0UG9zaXRpdmUsIGFzc2VydFJhbmdlT3JVbmRlZmluZWQsIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSB0ZXh0IGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogW1tQREZUZXh0RmllbGRdXSBmaWVsZHMgYXJlIGJveGVzIHRoYXQgZGlzcGxheSB0ZXh0IGVudGVyZWQgYnkgdGhlIHVzZXIuIFRoZVxuICogcHVycG9zZSBvZiBhIHRleHQgZmllbGQgaXMgdG8gZW5hYmxlIHVzZXJzIHRvIGVudGVyIHRleHQgb3IgdmlldyB0ZXh0IHZhbHVlc1xuICogaW4gdGhlIGRvY3VtZW50IHByZWZpbGxlZCBieSBzb2Z0d2FyZS4gVXNlcnMgY2FuIGNsaWNrIG9uIGEgdGV4dCBmaWVsZCBhbmRcbiAqIGlucHV0IHRleHQgdmlhIHRoZWlyIGtleWJvYXJkLiBTb21lIHRleHQgZmllbGRzIGFsbG93IG11bHRpcGxlIGxpbmVzIG9mIHRleHRcbiAqIHRvIGJlIGVudGVyZWQgKHNlZSBbW1BERlRleHRGaWVsZC5pc011bHRpbGluZV1dKS5cbiAqL1xudmFyIFBERlRleHRGaWVsZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGVGV4dEZpZWxkLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlRleHRGaWVsZChhY3JvVGV4dCwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb1RleHQsIHJlZiwgZG9jKSB8fCB0aGlzO1xuICAgICAgICBhc3NlcnRJcyhhY3JvVGV4dCwgJ2Fjcm9UZXh0JywgW1tQREZBY3JvVGV4dCwgJ1BERkFjcm9UZXh0J11dKTtcbiAgICAgICAgX3RoaXMuYWNyb0ZpZWxkID0gYWNyb1RleHQ7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB0ZXh0IHRoYXQgdGhpcyBmaWVsZCBjb250YWlucy4gVGhpcyB0ZXh0IGlzIHZpc2libGUgdG8gdXNlcnMgd2hvXG4gICAgICogdmlldyB0aGlzIGZpZWxkIGluIGEgUERGIHJlYWRlci5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogY29uc3QgdGV4dCA9IHRleHRGaWVsZC5nZXRUZXh0KClcbiAgICAgKiBjb25zb2xlLmxvZygnVGV4dCBmaWVsZCBjb250ZW50czonLCB0ZXh0KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IGlmIHRoaXMgdGV4dCBmaWVsZCBjb250YWlucyBubyB1bmRlcmx5aW5nIHZhbHVlLCBgdW5kZWZpbmVkYFxuICAgICAqIHdpbGwgYmUgcmV0dXJuZWQuIFRleHQgZmllbGRzIG1heSBhbHNvIGNvbnRhaW4gYW4gdW5kZXJseWluZyB2YWx1ZSB0aGF0XG4gICAgICogaXMgc2ltcGx5IGFuIGVtcHR5IHN0cmluZyAoYCcnYCkuIFRoaXMgZGV0YWlsIGlzIGxhcmdlbHkgaXJyZWxldmFudCBmb3JcbiAgICAgKiBtb3N0IGFwcGxpY2F0aW9ucy4gSW4gZ2VuZXJhbCwgeW91J2xsIHdhbnQgdG8gdHJlYXQgYm90aCBjYXNlcyB0aGUgc2FtZVxuICAgICAqIHdheSBhbmQgc2ltcGx5IGNvbnNpZGVyIHRoZSB0ZXh0IGZpZWxkIHRvIGJlIGVtcHR5LiBJbiBlaXRoZXIgY2FzZSwgdGhlXG4gICAgICogdGV4dCBmaWVsZCB3aWxsIGFwcGVhciBlbXB0eSB0byB1c2VycyB3aGVuIHZpZXdlZCBpbiBhIFBERiByZWFkZXIuXG4gICAgICpcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiB0aGlzIGlzIGEgcmljaCB0ZXh0IGZpZWxkLiBgcGRmLWxpYmAgZG9lcyBub3RcbiAgICAgKiBzdXBwb3J0IHJlYWRpbmcgcmljaCB0ZXh0IGZpZWxkcy4gTm9yIGRvIG1vc3QgUERGIHJlYWRlcnMgYW5kIHdyaXRlcnMuXG4gICAgICogUmljaCB0ZXh0IGZpZWxkcyBhcmUgYmFzZWQgb24gWEZBIChYTUwgRm9ybXMgQXJjaGl0ZWN0dXJlKS4gUmVsYXRpdmVseSBmZXdcbiAgICAgKiBQREZzIHVzZSByaWNoIHRleHQgZmllbGRzIG9yIFhGQS4gVW5saWtlIFBERiBpdHNlbGYsIFhGQSBpcyBub3QgYW4gSVNPXG4gICAgICogc3RhbmRhcmQuIFhGQSBoYXMgYmVlbiBkZXByZWNhdGVkIGluIFBERiAyLjA6XG4gICAgICogKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9YRkFcbiAgICAgKiAqIGh0dHA6Ly9ibG9nLnBkZnNoYXJlZm9ybXMuY29tL3BkZi0yLTAtcmVsZWFzZS1iaWQtZmFyZXdlbGwteGZhLWZvcm1zL1xuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHRleHQgY29udGFpbmVkIGluIHRoaXMgdGV4dCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmdldFRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlKCk7XG4gICAgICAgIGlmICghdmFsdWUgJiYgdGhpcy5pc1JpY2hGb3JtYXR0ZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJpY2hUZXh0RmllbGRSZWFkRXJyb3IodGhpcy5nZXROYW1lKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmFsdWUuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB0ZXh0IGZvciB0aGlzIGZpZWxkLiBUaGlzIG9wZXJhdGlvbiBpcyBhbmFsb2dvdXMgdG8gYSBodW1hbiB1c2VyXG4gICAgICogY2xpY2tpbmcgb24gdGhlIHRleHQgZmllbGQgaW4gYSBQREYgcmVhZGVyIGFuZCB0eXBpbmcgaW4gdGV4dCB2aWEgdGhlaXJcbiAgICAgKiBrZXlib2FyZC4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlIHRleHQgZmllbGRcbiAgICAgKiB0byBpbmRpY2F0ZSB3aGF0IHRleHQgaGFzIGJlZW4gc2V0LiBQREYgbGlicmFyaWVzIGFuZCByZWFkZXJzIHdpbGwgYmUgYWJsZVxuICAgICAqIHRvIGV4dHJhY3QgdGhlc2UgdmFsdWVzIGZyb20gdGhlIHNhdmVkIGRvY3VtZW50IGFuZCBkZXRlcm1pbmUgd2hhdCB0ZXh0XG4gICAgICogd2FzIHNldC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ2Jlc3Quc3VwZXJoZXJvLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5zZXRUZXh0KCdPbmUgUHVuY2ggTWFuJylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHksIGNhdXNpbmcgaXRzIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHRvIGJlIHVwZGF0ZWQgd2hlbiBlaXRoZXIgW1tQREZEb2N1bWVudC5zYXZlXV0gb3JcbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIGlzIGNhbGxlZC4gVGhlIHVwZGF0ZWQgc3RyZWFtcyB3aWxsXG4gICAgICogZGlzcGxheSB0aGUgdGV4dCB0aGlzIGZpZWxkIGNvbnRhaW5zIGluc2lkZSB0aGUgd2lkZ2V0cyBvZiB0aGlzIHRleHRcbiAgICAgKiBmaWVsZC5cbiAgICAgKlxuICAgICAqICoqSU1QT1JUQU5UOioqIFRoZSBkZWZhdWx0IGZvbnQgdXNlZCB0byB1cGRhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIGlzXG4gICAgICogW1tTdGFuZGFyZEZvbnRzLkhlbHZldGljYV1dLiBOb3RlIHRoYXQgdGhpcyBpcyBhIFdpbkFuc2kgZm9udC4gVGhpcyBtZWFuc1xuICAgICAqIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHdpbGwgYmUgdGhyb3duIGlmIHRoaXMgZmllbGQgY29udGFpbnMgdGV4dCBvdXRzaWRlXG4gICAgICogdGhlIFdpbkFuc2kgY2hhcmFjdGVyIHNldCAodGhlIGxhdGluIGFscGhhYmV0KS5cbiAgICAgKlxuICAgICAqIEVtYmVkZGluZyBhIGN1c3RvbSBmb250IGFuZCBwYXNzaW5nIGl0IHRvXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBvciBbW1BERlRleHRGaWVsZC51cGRhdGVBcHBlYXJhbmNlc11dXG4gICAgICogYWxsb3dzIHlvdSB0byBnZW5lcmF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgd2l0aCBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlXG4gICAgICogbGF0aW4gYWxwaGFiZXQgKGFzc3VtaW5nIHRoZSBjdXN0b20gZm9udCBzdXBwb3J0cyB0aGVtKS5cbiAgICAgKlxuICAgICAqIElmIHRoaXMgaXMgYSByaWNoIHRleHQgZmllbGQsIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3RhbmRhcmQgdGV4dFxuICAgICAqIGZpZWxkIGluIG9yZGVyIHRvIHNldCB0aGUgdGV4dC4gYHBkZi1saWJgIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyByaWNoXG4gICAgICogdGV4dCBzdHJpbmdzLiBOb3IgZG8gbW9zdCBQREYgcmVhZGVycyBhbmQgd3JpdGVycy4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuZ2V0VGV4dF1dIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHJpY2ggdGV4dCBmaWVsZHMgYW5kXG4gICAgICogdGhlaXIgZGVwcmVjYXRpb24gaW4gUERGIDIuMC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRoaXMgZmllbGQgc2hvdWxkIGNvbnRhaW4uXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5zZXRUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQodGV4dCwgJ3RleHQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG1heExlbmd0aCA9IHRoaXMuZ2V0TWF4TGVuZ3RoKCk7XG4gICAgICAgIGlmIChtYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJiB0ZXh0ICYmIHRleHQubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZWVkZWRNYXhMZW5ndGhFcnJvcih0ZXh0Lmxlbmd0aCwgbWF4TGVuZ3RoLCB0aGlzLmdldE5hbWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmRpc2FibGVSaWNoRm9ybWF0dGluZygpO1xuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWUoUERGSGV4U3RyaW5nLmZyb21UZXh0KHRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZVZhbHVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYWxpZ25tZW50IGZvciB0aGlzIHRleHQgZmllbGQuIFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGVcbiAgICAgKiBqdXN0aWZpY2F0aW9uIG9mIHRoZSB0ZXh0IHdoZW4gaXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGluIFBERiByZWFkZXJzLlxuICAgICAqIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBhbGlnbm1lbnRzOiBsZWZ0LCBjZW50ZXIsIGFuZCByaWdodC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBjb25zdCBhbGlnbm1lbnQgPSB0ZXh0RmllbGQuZ2V0QWxpZ25tZW50KClcbiAgICAgKiBpZiAoYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LkxlZnQpIGNvbnNvbGUubG9nKCdUZXh0IGlzIGxlZnQganVzdGlmaWVkJylcbiAgICAgKiBpZiAoYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LkNlbnRlcikgY29uc29sZS5sb2coJ1RleHQgaXMgY2VudGVyZWQnKVxuICAgICAqIGlmIChhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuUmlnaHQpIGNvbnNvbGUubG9nKCdUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIGFsaWdubWVudCBvZiB0aGlzIHRleHQgZmllbGQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5nZXRBbGlnbm1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBxdWFkZGluZyA9IHRoaXMuYWNyb0ZpZWxkLmdldFF1YWRkaW5nKCk7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICByZXR1cm4gKHF1YWRkaW5nID09PSAwID8gVGV4dEFsaWdubWVudC5MZWZ0XG4gICAgICAgICAgICA6IHF1YWRkaW5nID09PSAxID8gVGV4dEFsaWdubWVudC5DZW50ZXJcbiAgICAgICAgICAgICAgICA6IHF1YWRkaW5nID09PSAyID8gVGV4dEFsaWdubWVudC5SaWdodFxuICAgICAgICAgICAgICAgICAgICA6IFRleHRBbGlnbm1lbnQuTGVmdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGFsaWdubWVudCBmb3IgdGhpcyB0ZXh0IGZpZWxkLiBUaGlzIHdpbGwgZGV0ZXJtaW5lIHRoZVxuICAgICAqIGp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQgd2hlbiBpdCBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgaW4gUERGIHJlYWRlcnMuXG4gICAgICogVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGFsaWdubWVudHM6IGxlZnQsIGNlbnRlciwgYW5kIHJpZ2h0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqXG4gICAgICogLy8gVGV4dCB3aWxsIGJlIGxlZnQganVzdGlmaWVkIHdoZW4gZGlzcGxheWVkXG4gICAgICogdGV4dEZpZWxkLnNldEFsaWdubWVudChUZXh0QWxpZ25tZW50LkxlZnQpXG4gICAgICpcbiAgICAgKiAvLyBUZXh0IHdpbGwgYmUgY2VudGVyZWQgd2hlbiBkaXNwbGF5ZWRcbiAgICAgKiB0ZXh0RmllbGQuc2V0QWxpZ25tZW50KFRleHRBbGlnbm1lbnQuQ2VudGVyKVxuICAgICAqXG4gICAgICogLy8gVGV4dCB3aWxsIGJlIHJpZ2h0IGp1c3RpZmllZCB3aGVuIGRpc3BsYXllZFxuICAgICAqIHRleHRGaWVsZC5zZXRBbGlnbm1lbnQoVGV4dEFsaWdubWVudC5SaWdodClcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICogQHBhcmFtIGFsaWdubWVudCBUaGUgYWxpZ25tZW50IGZvciB0aGlzIHRleHQgZmllbGQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5zZXRBbGlnbm1lbnQgPSBmdW5jdGlvbiAoYWxpZ25tZW50KSB7XG4gICAgICAgIGFzc2VydElzT25lT2YoYWxpZ25tZW50LCAnYWxpZ25tZW50JywgVGV4dEFsaWdubWVudCk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0UXVhZGRpbmcoYWxpZ25tZW50KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZC4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZSBtYXhpbXVtXG4gICAgICogbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgdHlwZWQgaW50byB0aGlzIGZpZWxkIGJ5IHRoZSB1c2VyLiBJZlxuICAgICAqIHRoaXMgZmllbGQgZG9lcyBub3QgaGF2ZSBhIG1heGltdW0gbGVuZ3RoLCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGNvbnN0IG1heExlbmd0aCA9IHRleHRGaWVsZC5nZXRNYXhMZW5ndGgoKVxuICAgICAqIGlmIChtYXhMZW5ndGggPT09IHVuZGVmaW5lZCkgY29uc29sZS5sb2coJ05vIG1heCBsZW5ndGgnKVxuICAgICAqIGVsc2UgY29uc29sZS5sb2coYE1heCBsZW5ndGggaXMgJHttYXhMZW5ndGh9YClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbGxvd2VkIGluIHRoaXMgZmllbGQsIG9yXG4gICAgICogICAgICAgICAgYHVuZGVmaW5lZGAgaWYgbm8gbGltaXQgZXhpc3RzLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZ2V0TWF4TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuZ2V0TWF4TGVuZ3RoKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoaXMgZmllbGQuIFRoaXMgbGltaXRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVyc1xuICAgICAqIHRoYXQgY2FuIGJlIHR5cGVkIGludG8gdGhpcyBmaWVsZCBieSB0aGUgdXNlci4gVGhpcyBhbHNvIGxpbWl0cyB0aGUgbGVuZ3RoXG4gICAgICogb2YgdGhlIHN0cmluZyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dLiBUaGlzIGxpbWl0XG4gICAgICogY2FuIGJlIHJlbW92ZWQgYnkgcGFzc2luZyBgdW5kZWZpbmVkYCBhcyBgbWF4TGVuZ3RoYC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKlxuICAgICAqIC8vIEFsbG93IGJldHdlZW4gMCBhbmQgNSBjaGFyYWN0ZXJzIHRvIGJlIGVudGVyZWRcbiAgICAgKiB0ZXh0RmllbGQuc2V0TWF4TGVuZ3RoKDUpXG4gICAgICpcbiAgICAgKiAvLyBBbGxvdyBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgZW50ZXJlZFxuICAgICAqIHRleHRGaWVsZC5zZXRNYXhMZW5ndGgodW5kZWZpbmVkKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKiBAcGFyYW0gbWF4TGVuZ3RoIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhpcyBmaWVsZCwgb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgIGB1bmRlZmluZWRgIHRvIHJlbW92ZSB0aGUgbGltaXQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5zZXRNYXhMZW5ndGggPSBmdW5jdGlvbiAobWF4TGVuZ3RoKSB7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQobWF4TGVuZ3RoLCAnbWF4TGVuZ3RoJywgMCwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIGlmIChtYXhMZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlTWF4TGVuZ3RoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGV4dCA9IHRoaXMuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE1heExlbmd0aEVycm9yKHRleHQubGVuZ3RoLCBtYXhMZW5ndGgsIHRoaXMuZ2V0TmFtZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldE1heExlbmd0aChtYXhMZW5ndGgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIG1heGltdW0gbGVuZ3RoIGZvciB0aGlzIHRleHQgZmllbGQuIFRoaXMgYWxsb3dzIGFueSBudW1iZXIgb2ZcbiAgICAgKiBjaGFyYWN0ZXJzIHRvIGJlIHR5cGVkIGludG8gdGhpcyBmaWVsZCBieSB0aGUgdXNlci4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQucmVtb3ZlTWF4TGVuZ3RoKClcbiAgICAgKiBgYGBcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBgdW5kZWZpbmVkYCB0b1xuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldE1heExlbmd0aF1dLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUucmVtb3ZlTWF4TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZU1heExlbmd0aCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzcGxheSBhbiBpbWFnZSBpbnNpZGUgdGhlIGJvdW5kcyBvZiB0aGlzIHRleHQgZmllbGQncyB3aWRnZXRzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBuZ0ltYWdlID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKC4uLilcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuc2V0SW1hZ2UocG5nSW1hZ2UpXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIHVwZGF0ZSB0aGUgYXBwZWFyYW5jZXMgc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIHRleHQgZmllbGQncyB3aWRnZXRzLlxuICAgICAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuc2V0SW1hZ2UgPSBmdW5jdGlvbiAoaW1hZ2UpIHtcbiAgICAgICAgdmFyIGZpZWxkQWxpZ25tZW50ID0gdGhpcy5nZXRBbGlnbm1lbnQoKTtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHZhciBhbGlnbm1lbnQgPSBmaWVsZEFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5DZW50ZXIgPyBJbWFnZUFsaWdubWVudC5DZW50ZXJcbiAgICAgICAgICAgIDogZmllbGRBbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuUmlnaHQgPyBJbWFnZUFsaWdubWVudC5SaWdodFxuICAgICAgICAgICAgICAgIDogSW1hZ2VBbGlnbm1lbnQuTGVmdDtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN0cmVhbVJlZiA9IHRoaXMuY3JlYXRlSW1hZ2VBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgaW1hZ2UsIGFsaWdubWVudCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VzKHdpZGdldCwgeyBub3JtYWw6IHN0cmVhbVJlZiB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0NsZWFuKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZvbnQgc2l6ZSBmb3IgdGhpcyBmaWVsZC4gTGFyZ2VyIGZvbnQgc2l6ZXMgd2lsbCByZXN1bHQgaW4gbGFyZ2VyXG4gICAgICogdGV4dCBiZWluZyBkaXNwbGF5ZWQgd2hlbiBQREYgcmVhZGVycyByZW5kZXIgdGhpcyB0ZXh0IGZpZWxkLiBGb250IHNpemVzXG4gICAgICogbWF5IGJlIGludGVnZXIgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gU3VwcGx5aW5nIGEgbmVnYXRpdmUgZm9udCBzaXplXG4gICAgICogd2lsbCBjYXVzZSB0aGlzIG1ldGhvZCB0byB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLnNldEZvbnRTaXplKDQpXG4gICAgICogdGV4dEZpZWxkLnNldEZvbnRTaXplKDE1LjcpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA+IFRoaXMgbWV0aG9kIGRlcGVuZHMgdXBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBhcHBlYXJhbmNlXG4gICAgICogPiAoYC9EQWApIHN0cmluZy4gSWYgdGhpcyBmaWVsZCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBhcHBlYXJhbmNlIHN0cmluZyxcbiAgICAgKiA+IG9yIHRoYXQgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYSBmb250IHNpemUgKHZpYSB0aGUgYFRmYCBvcGVyYXRvciksXG4gICAgICogPiB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9udFNpemUgVGhlIGZvbnQgc2l6ZSB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRleHQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnNldEZvbnRTaXplID0gZnVuY3Rpb24gKGZvbnRTaXplKSB7XG4gICAgICAgIGFzc2VydFBvc2l0aXZlKGZvbnRTaXplLCAnZm9udFNpemUnKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBlYWNoIGxpbmUgb2YgdGV4dCBpcyBzaG93biBvbiBhIG5ldyBsaW5lIHdoZW4gdGhpc1xuICAgICAqIGZpZWxkIGlzIGRpc3BsYXllZCBpbiBhIFBERiByZWFkZXIuIFRoZSBhbHRlcm5hdGl2ZSBpcyB0aGF0IGFsbCBsaW5lcyBvZlxuICAgICAqIHRleHQgYXJlIG1lcmdlZCBvbnRvIGEgc2luZ2xlIGxpbmUgd2hlbiBkaXNwbGF5ZWQuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLmVuYWJsZU11bHRpbGluZV1dIGFuZCBbW1BERlRleHRGaWVsZC5kaXNhYmxlTXVsdGlsaW5lXV0uXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzTXVsdGlsaW5lKCkpIGNvbnNvbGUubG9nKCdNdWx0aWxpbmUgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBpcyBhIG11bHRpbGluZSB0ZXh0IGZpZWxkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNNdWx0aWxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9UZXh0RmxhZ3MuTXVsdGlsaW5lKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc3BsYXkgZWFjaCBsaW5lIG9mIHRleHQgb24gYSBuZXcgbGluZSB3aGVuIHRoaXMgZmllbGQgaXMgZGlzcGxheWVkIGluIGFcbiAgICAgKiBQREYgcmVhZGVyLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5lbmFibGVNdWx0aWxpbmUoKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZU11bHRpbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5NdWx0aWxpbmUsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzcGxheSBlYWNoIGxpbmUgb2YgdGV4dCBvbiB0aGUgc2FtZSBsaW5lIHdoZW4gdGhpcyBmaWVsZCBpcyBkaXNwbGF5ZWRcbiAgICAgKiBpbiBhIFBERiByZWFkZXIuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVNdWx0aWxpbmUoKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVNdWx0aWxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuTXVsdGlsaW5lLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIGEgcGFzc3dvcmQgdGV4dCBmaWVsZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBmaWVsZFxuICAgICAqIGlzIGludGVuZGVkIGZvciBzdG9yaW5nIGEgc2VjdXJlIHBhc3N3b3JkLiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5lbmFibGVQYXNzd29yZF1dIGFuZCBbW1BERlRleHRGaWVsZC5kaXNhYmxlUGFzc3dvcmRdXS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQuaXNQYXNzd29yZCgpKSBjb25zb2xlLmxvZygnUGFzc3dvcmQgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBpcyBhIHBhc3N3b3JkIHRleHQgZmllbGQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc1Bhc3N3b3JkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLlBhc3N3b3JkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyB0ZXh0IGZpZWxkIGlzIGludGVuZGVkIGZvciBzdG9yaW5nIGEgc2VjdXJlIHBhc3N3b3JkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZVBhc3N3b3JkKClcbiAgICAgKiBgYGBcbiAgICAgKiBWYWx1ZXMgZW50ZXJlZCBpbnRvIHBhc3N3b3JkIHRleHQgZmllbGRzIHNob3VsZCBub3QgYmUgZGlzcGxheWVkIG9uIHRoZVxuICAgICAqIHNjcmVlbiBieSBQREYgcmVhZGVycy4gTW9zdCBQREYgcmVhZGVycyB3aWxsIGRpc3BsYXkgdGhlIHZhbHVlIGFzXG4gICAgICogYXN0ZXJpc2tzIG9yIGJ1bGxldHMuIFBERiByZWFkZXJzIHNob3VsZCBuZXZlciBzdG9yZSB2YWx1ZXMgZW50ZXJlZCBieSB0aGVcbiAgICAgKiB1c2VyIGludG8gcGFzc3dvcmQgdGV4dCBmaWVsZHMuIFNpbWlsYXJseSwgYXBwbGljYXRpb25zIHNob3VsZCBub3RcbiAgICAgKiB3cml0ZSBkYXRhIHRvIGEgcGFzc3dvcmQgdGV4dCBmaWVsZC5cbiAgICAgKlxuICAgICAqICoqUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBjYXVzZSBlbnRlcmVkIHZhbHVlcyB0byBiZVxuICAgICAqIGVuY3J5cHRlZCBvciBzZWN1cmVkIGluIGFueSB3YXkhIEl0IHNpbXBseSBzZXRzIGEgZmxhZyB0aGF0IFBERiBzb2Z0d2FyZVxuICAgICAqIGFuZCByZWFkZXJzIGNhbiBhY2Nlc3MgdG8gZGV0ZXJtaW5lIHRoZSBfcHVycG9zZV8gb2YgdGhpcyBmaWVsZC4qKlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZW5hYmxlUGFzc3dvcmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLlBhc3N3b3JkLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyB0ZXh0IGZpZWxkIGlzICoqbm90KiogaW50ZW5kZWQgZm9yIHN0b3JpbmcgYSBzZWN1cmVcbiAgICAgKiBwYXNzd29yZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGlzYWJsZVBhc3N3b3JkKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVQYXNzd29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuUGFzc3dvcmQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIHRleHQgZmllbGQgcmVwcmVzZW50IGEgZmlsZSBwYXRoLlxuICAgICAqIFNlZSBbW1BERlRleHRGaWVsZC5lbmFibGVGaWxlU2VsZWN0aW9uXV0gYW5kXG4gICAgICogW1tQREZUZXh0RmllbGQuZGlzYWJsZUZpbGVTZWxlY3Rpb25dXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzRmlsZVNlbGVjdG9yKCkpIGNvbnNvbGUubG9nKCdJcyBhIGZpbGUgc2VsZWN0b3InKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgc2hvdWxkIGNvbnRhaW4gZmlsZSBwYXRocy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmlzRmlsZVNlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLkZpbGVTZWxlY3QpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIHRleHQgZmllbGQgaXMgaW50ZW5kZWQgdG8gc3RvcmUgYSBmaWxlIHBhdGguIFRoZVxuICAgICAqIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHN0b3JlZCBhdCB0aGF0IHBhdGggc2hvdWxkIGJlIHN1Ym1pdHRlZCBhcyB0aGUgdmFsdWVcbiAgICAgKiBvZiB0aGUgZmllbGQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZUZpbGVTZWxlY3Rpb24oKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZW5hYmxlRmlsZVNlbGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuRmlsZVNlbGVjdCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgdGV4dCBmaWVsZCBpcyAqKm5vdCoqIGludGVuZGVkIHRvIHN0b3JlIGEgZmlsZSBwYXRoLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVGaWxlU2VsZWN0aW9uKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVGaWxlU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5GaWxlU2VsZWN0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdGV4dCBlbnRlcmVkIGluIHRoaXMgZmllbGQgc2hvdWxkIGJlIHNwZWxsIGNoZWNrZWRcbiAgICAgKiBieSBQREYgcmVhZGVycy4gU2VlIFtbUERGVGV4dEZpZWxkLmVuYWJsZVNwZWxsQ2hlY2tpbmddXSBhbmRcbiAgICAgKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlU3BlbGxDaGVja2luZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQuaXNTcGVsbENoZWNrZWQoKSkgY29uc29sZS5sb2coJ1NwZWxsIGNoZWNraW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgc2hvdWxkIGJlIHNwZWxsIGNoZWNrZWQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc1NwZWxsQ2hlY2tlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9UZXh0RmxhZ3MuRG9Ob3RTcGVsbENoZWNrKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IFBERiByZWFkZXJzIHRvIHNwZWxsIGNoZWNrIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5lbmFibGVTcGVsbENoZWNraW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZVNwZWxsQ2hlY2tpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkRvTm90U3BlbGxDaGVjaywgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsbG93IFBERiByZWFkZXJzIHRvIHNwZWxsIGNoZWNrIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlU3BlbGxDaGVja2luZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlU3BlbGxDaGVja2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuRG9Ob3RTcGVsbENoZWNrLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCBhbGxvdyB0aGUgdXNlciB0byBzY3JvbGwgdGhlIHRleHRcbiAgICAgKiBmaWVsZCB3aGVuIGl0cyBjb250ZW50cyBkbyBub3QgZml0IHdpdGhpbiB0aGUgZmllbGQncyB2aWV3IGJvdW5kcy4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuZW5hYmxlU2Nyb2xsaW5nXV0gYW5kIFtbUERGVGV4dEZpZWxkLmRpc2FibGVTY3JvbGxpbmddXS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQuaXNTY3JvbGxhYmxlKCkpIGNvbnNvbGUubG9nKCdTY3JvbGxpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGZpZWxkIGlzIHNjcm9sbGFibGUgaW4gUERGIHJlYWRlcnMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc1Njcm9sbGFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLkRvTm90U2Nyb2xsKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IFBERiByZWFkZXJzIHRvIHByZXNlbnQgYSBzY3JvbGwgYmFyIHRvIHRoZSB1c2VyIHdoZW4gdGhlIGNvbnRlbnRzXG4gICAgICogb2YgdGhpcyB0ZXh0IGZpZWxkIGRvIG5vdCBmaXQgd2l0aGluIGl0cyB2aWV3IGJvdW5kcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlU2Nyb2xsaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKiBBIGhvcml6b250YWwgc2Nyb2xsIGJhciBzaG91bGQgYmUgc2hvd24gZm9yIHNpbmdsZWxpbmUgZmllbGRzLiBBIHZlcnRpY2FsXG4gICAgICogc2Nyb2xsIGJhciBzaG91bGQgYmUgc2hvd24gZm9yIG11bHRpbGluZSBmaWVsZHMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVTY3JvbGxpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkRvTm90U2Nyb2xsLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgYWxsb3cgUERGIHJlYWRlcnMgdG8gcHJlc2VudCBhIHNjcm9sbCBiYXIgdG8gdGhlIHVzZXIgd2hlbiB0aGVcbiAgICAgKiBjb250ZW50cyBvZiB0aGlzIHRleHQgZmllbGQgZG8gbm90IGZpdCB3aXRoaW4gaXRzIHZpZXcgYm91bmRzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlU2Nyb2xsaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVTY3JvbGxpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkRvTm90U2Nyb2xsLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgaXMgYSBjb21iZWQgdGV4dCBmaWVsZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBmaWVsZFxuICAgICAqIGlzIHNwbGl0IGludG8gYG5gIGVxdWFsIHNpemUgY2VsbHMgd2l0aCBvbmUgY2hhcmFjdGVyIGluIGVhY2ggKHdoZXJlIGBuYFxuICAgICAqIGlzIGVxdWFsIHRvIHRoZSBtYXggbGVuZ3RoIG9mIHRoZSB0ZXh0IGZpZWxkKS4gVGhlIHJlc3VsdCBpcyB0aGF0IGFsbFxuICAgICAqIGNoYXJhY3RlcnMgaW4gdGhpcyBmaWVsZCBhcmUgZGlzcGxheWVkIGFuIGVxdWFsIGRpc3RhbmNlIGFwYXJ0IGZyb20gb25lXG4gICAgICogYW5vdGhlci4gU2VlIFtbUERGVGV4dEZpZWxkLmVuYWJsZUNvbWJpbmddXSBhbmRcbiAgICAgKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlQ29tYmluZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQuaXNDb21iZWQoKSkgY29uc29sZS5sb2coJ0NvbWJpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogTm90ZSB0aGF0IGluIG9yZGVyIGZvciBhIHRleHQgZmllbGQgdG8gYmUgY29tYmVkLCB0aGUgZm9sbG93aW5nIG11c3QgYmVcbiAgICAgKiB0cnVlIChpbiBhZGRpdGlvbiB0byBlbmFibGluZyBjb21iaW5nKTpcbiAgICAgKiAqIEl0IG11c3Qgbm90IGJlIGEgbXVsdGlsaW5lIGZpZWxkIChzZWUgW1tQREZUZXh0RmllbGQuaXNNdWx0aWxpbmVdXSlcbiAgICAgKiAqIEl0IG11c3Qgbm90IGJlIGEgcGFzc3dvcmQgZmllbGQgKHNlZSBbW1BERlRleHRGaWVsZC5pc1Bhc3N3b3JkXV0pXG4gICAgICogKiBJdCBtdXN0IG5vdCBiZSBhIGZpbGUgc2VsZWN0b3IgZmllbGQgKHNlZSBbW1BERlRleHRGaWVsZC5pc0ZpbGVTZWxlY3Rvcl1dKVxuICAgICAqICogSXQgbXVzdCBoYXZlIGEgbWF4IGxlbmd0aCBkZWZpbmVkIChzZWUgW1tQREZUZXh0RmllbGQuc2V0TWF4TGVuZ3RoXV0pXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBmaWVsZCBpcyBjb21iZWQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc0NvbWJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9UZXh0RmxhZ3MuQ29tYikgJiZcbiAgICAgICAgICAgICF0aGlzLmlzTXVsdGlsaW5lKCkgJiZcbiAgICAgICAgICAgICF0aGlzLmlzUGFzc3dvcmQoKSAmJlxuICAgICAgICAgICAgIXRoaXMuaXNGaWxlU2VsZWN0b3IoKSAmJlxuICAgICAgICAgICAgdGhpcy5nZXRNYXhMZW5ndGgoKSAhPT0gdW5kZWZpbmVkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNwbGl0IHRoaXMgZmllbGQgaW50byBgbmAgZXF1YWwgc2l6ZSBjZWxscyB3aXRoIG9uZSBjaGFyYWN0ZXIgaW4gZWFjaFxuICAgICAqICh3aGVyZSBgbmAgaXMgZXF1YWwgdG8gdGhlIG1heCBsZW5ndGggb2YgdGhlIHRleHQgZmllbGQpLiBUaGlzIHdpbGwgY2F1c2VcbiAgICAgKiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgZmllbGQgdG8gYmUgZGlzcGxheWVkIGFuIGVxdWFsIGRpc3RhbmNlIGFwYXJ0IGZyb21cbiAgICAgKiBvbmUgYW5vdGhlci4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlQ29tYmluZygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiBhZGRpdGlvbiB0byBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0ZXh0IGZpZWxkcyBtdXN0IGhhdmUgYSBtYXggbGVuZ3RoXG4gICAgICogZGVmaW5lZCBpbiBvcmRlciB0byBiZSBjb21iZWQgKHNlZSBbW1BERlRleHRGaWVsZC5zZXRNYXhMZW5ndGhdXSkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gY2FsbCB0aGUgZm9sbG93aW5nIHRocmVlIG1ldGhvZHMgaW50ZXJuYWxseTpcbiAgICAgKiAqIFtbUERGVGV4dEZpZWxkLmRpc2FibGVNdWx0aWxpbmVdXVxuICAgICAqICogW1tQREZUZXh0RmllbGQuZGlzYWJsZVBhc3N3b3JkXV1cbiAgICAgKiAqIFtbUERGVGV4dEZpZWxkLmRpc2FibGVGaWxlU2VsZWN0aW9uXV1cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZUNvbWJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmdldE1heExlbmd0aCgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBtc2cgPSBcIlBERlRleHRGaWVsZHMgbXVzdCBoYXZlIGEgbWF4IGxlbmd0aCBpbiBvcmRlciB0byBiZSBjb21iZWRcIjtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlsaW5lKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVBhc3N3b3JkKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZUZpbGVTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuQ29tYiwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUdXJuIG9mZiBjb21iaW5nIGZvciB0aGlzIHRleHQgZmllbGQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVDb21iaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKiBTZWUgW1tQREZUZXh0RmllbGQuaXNDb21iZWRdXSBhbmQgW1tQREZUZXh0RmllbGQuZW5hYmxlQ29tYmluZ11dIGZvciBtb3JlXG4gICAgICogaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBjb21iaW5nIGlzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgdGV4dCBmaWVsZCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGlzYWJsZUNvbWJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuQ29tYiwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyB0ZXh0IGZpZWxkIGNvbnRhaW5zIHJpY2ggdGV4dC4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuZW5hYmxlUmljaEZvcm1hdHRpbmddXSBhbmRcbiAgICAgKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlUmljaEZvcm1hdHRpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBpZiAodGV4dEZpZWxkLmlzUmljaEZvcm1hdHRlZCgpKSBjb25zb2xlLmxvZygnUmljaCBmb3JtYXR0aW5nIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQgY29udGFpbnMgcmljaCB0ZXh0LlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNSaWNoRm9ybWF0dGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvVGV4dEZsYWdzLlJpY2hUZXh0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBmaWVsZCBjb250YWlucyBYRkEgZGF0YSAtIG9yIHJpY2ggdGV4dC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlUmljaEZvcm1hdHRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCBgcGRmLWxpYmAgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIG9yIHdyaXRpbmcgcmljaCB0ZXh0IGZpZWxkcy5cbiAgICAgKiBOb3IgZG8gbW9zdCBQREYgcmVhZGVycyBhbmQgd3JpdGVycy4gUmljaCB0ZXh0IGZpZWxkcyBhcmUgYmFzZWQgb24gWEZBXG4gICAgICogKFhNTCBGb3JtcyBBcmNoaXRlY3R1cmUpLiBSZWxhdGl2ZWx5IGZldyBQREZzIHVzZSByaWNoIHRleHQgZmllbGRzIG9yIFhGQS5cbiAgICAgKiBVbmxpa2UgUERGIGl0c2VsZiwgWEZBIGlzIG5vdCBhbiBJU08gc3RhbmRhcmQuIFhGQSBoYXMgYmVlbiBkZXByZWNhdGVkIGluXG4gICAgICogUERGIDIuMDpcbiAgICAgKiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1hGQVxuICAgICAqICogaHR0cDovL2Jsb2cucGRmc2hhcmVmb3Jtcy5jb20vcGRmLTItMC1yZWxlYXNlLWJpZC1mYXJld2VsbC14ZmEtZm9ybXMvXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVSaWNoRm9ybWF0dGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuUmljaFRleHQsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIGlzIGEgc3RhbmRhcmQgdGV4dCBmaWVsZCB0aGF0IGRvZXMgbm90IFhGQSBkYXRhIChyaWNoXG4gICAgICogdGV4dCkuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVSaWNoRm9ybWF0dGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlUmljaEZvcm1hdHRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLlJpY2hUZXh0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93IHRoaXMgdGV4dCBmaWVsZCBvbiB0aGUgc3BlY2lmaWVkIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdWJ1bnR1Rm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQodWJ1bnR1Rm9udEJ5dGVzKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uY3JlYXRlVGV4dEZpZWxkKCdiZXN0Lmd1bmRhbScpXG4gICAgICogdGV4dEZpZWxkLnNldFRleHQoJ0V4aWEnKVxuICAgICAqXG4gICAgICogdGV4dEZpZWxkLmFkZFRvUGFnZShwYWdlLCB7XG4gICAgICogICB4OiA1MCxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgd2lkdGg6IDIwMCxcbiAgICAgKiAgIGhlaWdodDogMTAwLFxuICAgICAqICAgdGV4dENvbG9yOiByZ2IoMSwgMCwgMCksXG4gICAgICogICBiYWNrZ3JvdW5kQ29sb3I6IHJnYigwLCAxLCAwKSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiByZ2IoMCwgMCwgMSksXG4gICAgICogICBib3JkZXJXaWR0aDogMixcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcyg5MCksXG4gICAgICogICBmb250OiB1YnVudHVGb250LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB3aWRnZXQgZm9yIHRoaXMgdGV4dCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSB0byB3aGljaCB0aGlzIHRleHQgZmllbGQgd2lkZ2V0IHNob3VsZCBiZSBhZGRlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gYWRkaW5nIHRoaXMgdGV4dCBmaWVsZCB3aWRnZXQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5hZGRUb1BhZ2UgPSBmdW5jdGlvbiAocGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgW1tQREZQYWdlLCAnUERGUGFnZSddXSk7XG4gICAgICAgIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKCEoJ3RleHRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLnRleHRDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JhY2tncm91bmRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJhY2tncm91bmRDb2xvciA9IHJnYigxLCAxLCAxKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdib3JkZXJXaWR0aCcgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlcldpZHRoID0gMTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGZvciB0aGlzIHRleHQgZmllbGRcbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0KHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAyMDAsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiA1MCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9lID0gb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogMCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9mID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBoaWRkZW46IG9wdGlvbnMuaGlkZGVuLFxuICAgICAgICAgICAgcGFnZTogcGFnZS5yZWYsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3Rlcih3aWRnZXQuZGljdCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhpcyBmaWVsZFxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5hZGRXaWRnZXQod2lkZ2V0UmVmKTtcbiAgICAgICAgLy8gU2V0IGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3Igd2lkZ2V0XG4gICAgICAgIHZhciBmb250ID0gKF9nID0gb3B0aW9ucy5mb250KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB0aGlzLmRvYy5nZXRGb3JtKCkuZ2V0RGVmYXVsdEZvbnQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIGdpdmVuIHBhZ2VcbiAgICAgICAgcGFnZS5ub2RlLmFkZEFubm90KHdpZGdldFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHRleHQgZmllbGQgaGFzIGJlZW4gbWFya2VkIGFzIGRpcnR5LCBvciBpZiBhbnkgb2ZcbiAgICAgKiB0aGlzIHRleHQgZmllbGQncyB3aWRnZXRzIGRvIG5vdCBoYXZlIGFuIGFwcGVhcmFuY2Ugc3RyZWFtLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSBjb25zb2xlLmxvZygnTmVlZHMgdXBkYXRlJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIHRleHQgZmllbGQgbmVlZHMgYW4gYXBwZWFyYW5jZSB1cGRhdGUuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLmlzRGlydHkoKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgaGFzQXBwZWFyYW5jZXMgPSAoKF9hID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub3JtYWwpIGluc3RhbmNlb2YgUERGU3RyZWFtO1xuICAgICAgICAgICAgaWYgKCFoYXNBcHBlYXJhbmNlcylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIHRleHQgZmllbGQncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgdGV4dCBmaWVsZHMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgdGhpcy51cGRhdGVBcHBlYXJhbmNlcyhmb250KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgdGV4dCBmaWVsZCdzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZ2l2ZW4gYXBwZWFyYW5jZSBwcm92aWRlci4gSWYgbm8gYHByb3ZpZGVyYCBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0XG4gICAgICogYXBwZWFyYW5jZSBwcm92aWRlciBmb3IgdGV4dCBmaWVsZHMgd2lsbCBiZSB1c2VkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLnVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSwgKGZpZWxkLCB3aWRnZXQsIGZvbnQpID0+IHtcbiAgICAgKiAgIC4uLlxuICAgICAqICAgcmV0dXJuIGRyYXdUZXh0RmllbGQoLi4uKVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgT3B0aW9uYWxseSwgdGhlIGFwcGVhcmFuY2UgcHJvdmlkZXIgdG8gYmUgdXNlZCBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHByb3ZpZGVyLCAncHJvdmlkZXInLCBbRnVuY3Rpb25dKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzQ2xlYW4oKTtcbiAgICB9O1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciBhcFByb3ZpZGVyID0gcHJvdmlkZXIgIT09IG51bGwgJiYgcHJvdmlkZXIgIT09IHZvaWQgMCA/IHByb3ZpZGVyIDogZGVmYXVsdFRleHRGaWVsZEFwcGVhcmFuY2VQcm92aWRlcjtcbiAgICAgICAgdmFyIGFwcGVhcmFuY2VzID0gbm9ybWFsaXplQXBwZWFyYW5jZShhcFByb3ZpZGVyKHRoaXMsIHdpZGdldCwgZm9udCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VXaXRoRm9udCh3aWRnZXQsIGZvbnQsIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldFRleHRGaWVsZF1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGVGV4dEZpZWxkXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERlRleHRGaWVsZF1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb1RleHQgYW5kIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9UZXh0IFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvVGV4dGAgZm9yIHRoaXMgdGV4dCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIHRleHQgZmllbGQuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhpcyB0ZXh0IGZpZWxkIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5vZiA9IGZ1bmN0aW9uIChhY3JvVGV4dCwgcmVmLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZUZXh0RmllbGQoYWNyb1RleHQsIHJlZiwgZG9jKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZUZXh0RmllbGQ7XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZUZXh0RmllbGQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZUZXh0RmllbGQuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBkcmF3Q2hlY2tCb3gsIHJvdGF0ZUluUGxhY2UsIGRyYXdSYWRpb0J1dHRvbiwgZHJhd0J1dHRvbiwgZHJhd1RleHRGaWVsZCwgZHJhd09wdGlvbkxpc3QsIH0gZnJvbSBcIi4uL29wZXJhdGlvbnNcIjtcbmltcG9ydCB7IHJnYiwgY29tcG9uZW50c1RvQ29sb3IsIHNldEZpbGxpbmdDb2xvciwgZ3JheXNjYWxlLCBjbXlrLCB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IHJlZHVjZVJvdGF0aW9uLCBhZGp1c3REaW1zRm9yUm90YXRpb24gfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBsYXlvdXRNdWx0aWxpbmVUZXh0LCBsYXlvdXRDb21iZWRUZXh0LCBsYXlvdXRTaW5nbGVsaW5lVGV4dCwgfSBmcm9tIFwiLi4vdGV4dC9sYXlvdXRcIjtcbmltcG9ydCB7IFRleHRBbGlnbm1lbnQgfSBmcm9tIFwiLi4vdGV4dC9hbGlnbm1lbnRcIjtcbmltcG9ydCB7IHNldEZvbnRBbmRTaXplIH0gZnJvbSBcIi4uL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgZmluZExhc3RNYXRjaCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqKioqKioqKioqKioqKioqKioqKiBBcHBlYXJhbmNlIFByb3ZpZGVyIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbmV4cG9ydCB2YXIgbm9ybWFsaXplQXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgaWYgKCdub3JtYWwnIGluIGFwcGVhcmFuY2UpXG4gICAgICAgIHJldHVybiBhcHBlYXJhbmNlO1xuICAgIHJldHVybiB7IG5vcm1hbDogYXBwZWFyYW5jZSB9O1xufTtcbi8vIEV4YW1wbGVzOlxuLy8gICBgL0hlbHYgMTIgVGZgIC0+IFsnL0hlbHYgMTIgVGYnLCAnSGVsdicsICcxMiddXG4vLyAgIGAvSGVCbyA4LjAwIFRmYCAtPiBbJy9IZUJvIDggVGYnLCAnSGVCbycsICc4LjAwJ11cbnZhciB0ZlJlZ2V4ID0gL1xcLyhbXlxcMFxcdFxcblxcZlxcclxcIF0rKVtcXDBcXHRcXG5cXGZcXHJcXCBdKyhcXGQqXFwuXFxkK3xcXGQrKVtcXDBcXHRcXG5cXGZcXHJcXCBdK1RmLztcbnZhciBnZXREZWZhdWx0Rm9udFNpemUgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHZhciBkYSA9IChfYSA9IGZpZWxkLmdldERlZmF1bHRBcHBlYXJhbmNlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIHZhciBkYU1hdGNoID0gKF9iID0gZmluZExhc3RNYXRjaChkYSwgdGZSZWdleCkubWF0Y2gpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdO1xuICAgIHZhciBkZWZhdWx0Rm9udFNpemUgPSBOdW1iZXIoZGFNYXRjaFsyXSk7XG4gICAgcmV0dXJuIGlzRmluaXRlKGRlZmF1bHRGb250U2l6ZSkgPyBkZWZhdWx0Rm9udFNpemUgOiB1bmRlZmluZWQ7XG59O1xuLy8gRXhhbXBsZXM6XG4vLyAgIGAwLjMgZ2AgLT4gWycwLjMnLCAnZyddXG4vLyAgIGAwLjMgMSAuMyByZ2AgLT4gWycwLjMnLCAnMScsICcuMycsICdyZyddXG4vLyAgIGAwLjMgMSAuMyAwIGtgIC0+IFsnMC4zJywgJzEnLCAnLjMnLCAnMCcsICdrJ11cbnZhciBjb2xvclJlZ2V4ID0gLyhcXGQqXFwuXFxkK3xcXGQrKVtcXDBcXHRcXG5cXGZcXHJcXCBdKihcXGQqXFwuXFxkK3xcXGQrKT9bXFwwXFx0XFxuXFxmXFxyXFwgXSooXFxkKlxcLlxcZCt8XFxkKyk/W1xcMFxcdFxcblxcZlxcclxcIF0qKFxcZCpcXC5cXGQrfFxcZCspP1tcXDBcXHRcXG5cXGZcXHJcXCBdKyhnfHJnfGspLztcbnZhciBnZXREZWZhdWx0Q29sb3IgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGRhID0gKF9hID0gZmllbGQuZ2V0RGVmYXVsdEFwcGVhcmFuY2UoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgdmFyIGRhTWF0Y2ggPSBmaW5kTGFzdE1hdGNoKGRhLCBjb2xvclJlZ2V4KS5tYXRjaDtcbiAgICB2YXIgX2IgPSBkYU1hdGNoICE9PSBudWxsICYmIGRhTWF0Y2ggIT09IHZvaWQgMCA/IGRhTWF0Y2ggOiBbXSwgYzEgPSBfYlsxXSwgYzIgPSBfYlsyXSwgYzMgPSBfYlszXSwgYzQgPSBfYls0XSwgY29sb3JTcGFjZSA9IF9iWzVdO1xuICAgIGlmIChjb2xvclNwYWNlID09PSAnZycgJiYgYzEpIHtcbiAgICAgICAgcmV0dXJuIGdyYXlzY2FsZShOdW1iZXIoYzEpKTtcbiAgICB9XG4gICAgaWYgKGNvbG9yU3BhY2UgPT09ICdyZycgJiYgYzEgJiYgYzIgJiYgYzMpIHtcbiAgICAgICAgcmV0dXJuIHJnYihOdW1iZXIoYzEpLCBOdW1iZXIoYzIpLCBOdW1iZXIoYzMpKTtcbiAgICB9XG4gICAgaWYgKGNvbG9yU3BhY2UgPT09ICdrJyAmJiBjMSAmJiBjMiAmJiBjMyAmJiBjNCkge1xuICAgICAgICByZXR1cm4gY215ayhOdW1iZXIoYzEpLCBOdW1iZXIoYzIpLCBOdW1iZXIoYzMpLCBOdW1iZXIoYzQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG52YXIgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoZmllbGQsIGNvbG9yLCBmb250LCBmb250U2l6ZSkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoZm9udFNpemUgPT09IHZvaWQgMCkgeyBmb250U2l6ZSA9IDA7IH1cbiAgICB2YXIgZGEgPSBbXG4gICAgICAgIHNldEZpbGxpbmdDb2xvcihjb2xvcikudG9TdHJpbmcoKSxcbiAgICAgICAgc2V0Rm9udEFuZFNpemUoKF9hID0gZm9udCA9PT0gbnVsbCB8fCBmb250ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmb250Lm5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdkdW1teV9fbm9vcCcsIGZvbnRTaXplKS50b1N0cmluZygpLFxuICAgIF0uam9pbignXFxuJyk7XG4gICAgZmllbGQuc2V0RGVmYXVsdEFwcGVhcmFuY2UoZGEpO1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdENoZWNrQm94QXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKGNoZWNrQm94LCB3aWRnZXQpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAvLyBUaGUgYC9EQWAgZW50cnkgY2FuIGJlIGF0IHRoZSB3aWRnZXQgb3IgZmllbGQgbGV2ZWwgLSBzbyB3ZSBoYW5kbGUgYm90aFxuICAgIHZhciB3aWRnZXRDb2xvciA9IGdldERlZmF1bHRDb2xvcih3aWRnZXQpO1xuICAgIHZhciBmaWVsZENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKGNoZWNrQm94LmFjcm9GaWVsZCk7XG4gICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IChfYSA9IGJzID09PSBudWxsIHx8IGJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBicy5nZXRXaWR0aCgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRSb3RhdGlvbigpKTtcbiAgICB2YXIgX2QgPSBhZGp1c3REaW1zRm9yUm90YXRpb24ocmVjdGFuZ2xlLCByb3RhdGlvbiksIHdpZHRoID0gX2Qud2lkdGgsIGhlaWdodCA9IF9kLmhlaWdodDtcbiAgICB2YXIgcm90YXRlID0gcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogcm90YXRpb24gfSkpO1xuICAgIHZhciBibGFjayA9IHJnYigwLCAwLCAwKTtcbiAgICB2YXIgYm9yZGVyQ29sb3IgPSAoX2IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Qm9yZGVyQ29sb3IoKSkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGJsYWNrO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciBkb3duQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpLCAwLjgpO1xuICAgIC8vIFVwZGF0ZSBjb2xvclxuICAgIHZhciB0ZXh0Q29sb3IgPSAoX2MgPSB3aWRnZXRDb2xvciAhPT0gbnVsbCAmJiB3aWRnZXRDb2xvciAhPT0gdm9pZCAwID8gd2lkZ2V0Q29sb3IgOiBmaWVsZENvbG9yKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBibGFjaztcbiAgICBpZiAod2lkZ2V0Q29sb3IpIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uod2lkZ2V0LCB0ZXh0Q29sb3IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2UoY2hlY2tCb3guYWNyb0ZpZWxkLCB0ZXh0Q29sb3IpO1xuICAgIH1cbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgeDogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgeTogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIHRoaWNrbmVzczogMS41LFxuICAgICAgICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgbWFya0NvbG9yOiB0ZXh0Q29sb3IsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBub3JtYWw6IHtcbiAgICAgICAgICAgIG9uOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdDaGVja0JveChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvciwgZmlsbGVkOiB0cnVlIH0pKSksXG4gICAgICAgICAgICBvZmY6IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd0NoZWNrQm94KF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IGZhbHNlIH0pKSksXG4gICAgICAgIH0sXG4gICAgICAgIGRvd246IHtcbiAgICAgICAgICAgIG9uOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdDaGVja0JveChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IGRvd25CYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogdHJ1ZSB9KSkpLFxuICAgICAgICAgICAgb2ZmOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdDaGVja0JveChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IGRvd25CYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogZmFsc2UgfSkpKSxcbiAgICAgICAgfSxcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdFJhZGlvR3JvdXBBcHBlYXJhbmNlUHJvdmlkZXIgPSBmdW5jdGlvbiAocmFkaW9Hcm91cCwgd2lkZ2V0KSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcihyYWRpb0dyb3VwLmFjcm9GaWVsZCk7XG4gICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IChfYSA9IGJzID09PSBudWxsIHx8IGJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBicy5nZXRXaWR0aCgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRSb3RhdGlvbigpKTtcbiAgICB2YXIgX2QgPSBhZGp1c3REaW1zRm9yUm90YXRpb24ocmVjdGFuZ2xlLCByb3RhdGlvbiksIHdpZHRoID0gX2Qud2lkdGgsIGhlaWdodCA9IF9kLmhlaWdodDtcbiAgICB2YXIgcm90YXRlID0gcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogcm90YXRpb24gfSkpO1xuICAgIHZhciBibGFjayA9IHJnYigwLCAwLCAwKTtcbiAgICB2YXIgYm9yZGVyQ29sb3IgPSAoX2IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Qm9yZGVyQ29sb3IoKSkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGJsYWNrO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciBkb3duQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpLCAwLjgpO1xuICAgIC8vIFVwZGF0ZSBjb2xvclxuICAgIHZhciB0ZXh0Q29sb3IgPSAoX2MgPSB3aWRnZXRDb2xvciAhPT0gbnVsbCAmJiB3aWRnZXRDb2xvciAhPT0gdm9pZCAwID8gd2lkZ2V0Q29sb3IgOiBmaWVsZENvbG9yKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBibGFjaztcbiAgICBpZiAod2lkZ2V0Q29sb3IpIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uod2lkZ2V0LCB0ZXh0Q29sb3IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2UocmFkaW9Hcm91cC5hY3JvRmllbGQsIHRleHRDb2xvcik7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICB4OiB3aWR0aCAvIDIsXG4gICAgICAgIHk6IGhlaWdodCAvIDIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgZG90Q29sb3I6IHRleHRDb2xvcixcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vcm1hbDoge1xuICAgICAgICAgICAgb246IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd1JhZGlvQnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IHRydWUgfSkpKSxcbiAgICAgICAgICAgIG9mZjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3UmFkaW9CdXR0b24oX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogZmFsc2UgfSkpKSxcbiAgICAgICAgfSxcbiAgICAgICAgZG93bjoge1xuICAgICAgICAgICAgb246IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd1JhZGlvQnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogZG93bkJhY2tncm91bmRDb2xvciwgZmlsbGVkOiB0cnVlIH0pKSksXG4gICAgICAgICAgICBvZmY6IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd1JhZGlvQnV0dG9uKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogZG93bkJhY2tncm91bmRDb2xvciwgZmlsbGVkOiBmYWxzZSB9KSkpLFxuICAgICAgICB9LFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBkZWZhdWx0QnV0dG9uQXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKGJ1dHRvbiwgd2lkZ2V0LCBmb250KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAvLyBUaGUgYC9EQWAgZW50cnkgY2FuIGJlIGF0IHRoZSB3aWRnZXQgb3IgZmllbGQgbGV2ZWwgLSBzbyB3ZSBoYW5kbGUgYm90aFxuICAgIHZhciB3aWRnZXRDb2xvciA9IGdldERlZmF1bHRDb2xvcih3aWRnZXQpO1xuICAgIHZhciBmaWVsZENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKGJ1dHRvbi5hY3JvRmllbGQpO1xuICAgIHZhciB3aWRnZXRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZSh3aWRnZXQpO1xuICAgIHZhciBmaWVsZEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKGJ1dHRvbi5hY3JvRmllbGQpO1xuICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICB2YXIgY2FwdGlvbnMgPSBhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Q2FwdGlvbnMoKTtcbiAgICB2YXIgbm9ybWFsVGV4dCA9IChfYSA9IGNhcHRpb25zID09PSBudWxsIHx8IGNhcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYXB0aW9ucy5ub3JtYWwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIHZhciBkb3duVGV4dCA9IChfYyA9IChfYiA9IGNhcHRpb25zID09PSBudWxsIHx8IGNhcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYXB0aW9ucy5kb3duKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBub3JtYWxUZXh0KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAnJztcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2QgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9mID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9mLndpZHRoLCBoZWlnaHQgPSBfZi5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciBkb3duQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpLCAwLjgpO1xuICAgIHZhciBib3VuZHMgPSB7XG4gICAgICAgIHg6IGJvcmRlcldpZHRoLFxuICAgICAgICB5OiBib3JkZXJXaWR0aCxcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGggKiAyLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoICogMixcbiAgICB9O1xuICAgIHZhciBub3JtYWxMYXlvdXQgPSBsYXlvdXRTaW5nbGVsaW5lVGV4dChub3JtYWxUZXh0LCB7XG4gICAgICAgIGFsaWdubWVudDogVGV4dEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICBmb250OiBmb250LFxuICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICB9KTtcbiAgICB2YXIgZG93bkxheW91dCA9IGxheW91dFNpbmdsZWxpbmVUZXh0KGRvd25UZXh0LCB7XG4gICAgICAgIGFsaWdubWVudDogVGV4dEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICBmb250OiBmb250LFxuICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICB9KTtcbiAgICAvLyBVcGRhdGUgZm9udCBzaXplIGFuZCBjb2xvclxuICAgIHZhciBmb250U2l6ZSA9IE1hdGgubWluKG5vcm1hbExheW91dC5mb250U2l6ZSwgZG93bkxheW91dC5mb250U2l6ZSk7XG4gICAgdmFyIHRleHRDb2xvciA9IChfZSA9IHdpZGdldENvbG9yICE9PSBudWxsICYmIHdpZGdldENvbG9yICE9PSB2b2lkIDAgPyB3aWRnZXRDb2xvciA6IGZpZWxkQ29sb3IpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IGJsYWNrO1xuICAgIGlmICh3aWRnZXRDb2xvciB8fCB3aWRnZXRGb250U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHdpZGdldCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZShidXR0b24uYWNyb0ZpZWxkLCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHg6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHk6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgdGV4dENvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IGZvbnQubmFtZSxcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbm9ybWFsOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdCdXR0b24oX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsIHRleHRMaW5lczogW25vcm1hbExheW91dC5saW5lXSB9KSkpLFxuICAgICAgICBkb3duOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdCdXR0b24oX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBkb3duQmFja2dyb3VuZENvbG9yLCB0ZXh0TGluZXM6IFtkb3duTGF5b3V0LmxpbmVdIH0pKSksXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIGRlZmF1bHRUZXh0RmllbGRBcHBlYXJhbmNlUHJvdmlkZXIgPSBmdW5jdGlvbiAodGV4dEZpZWxkLCB3aWRnZXQsIGZvbnQpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgLy8gVGhlIGAvREFgIGVudHJ5IGNhbiBiZSBhdCB0aGUgd2lkZ2V0IG9yIGZpZWxkIGxldmVsIC0gc28gd2UgaGFuZGxlIGJvdGhcbiAgICB2YXIgd2lkZ2V0Q29sb3IgPSBnZXREZWZhdWx0Q29sb3Iod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRDb2xvciA9IGdldERlZmF1bHRDb2xvcih0ZXh0RmllbGQuYWNyb0ZpZWxkKTtcbiAgICB2YXIgd2lkZ2V0Rm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZSh0ZXh0RmllbGQuYWNyb0ZpZWxkKTtcbiAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgIHZhciBhcCA9IHdpZGdldC5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgdmFyIGJzID0gd2lkZ2V0LmdldEJvcmRlclN0eWxlKCk7XG4gICAgdmFyIHRleHQgPSAoX2EgPSB0ZXh0RmllbGQuZ2V0VGV4dCgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2IgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9lID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9lLndpZHRoLCBoZWlnaHQgPSBfZS5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciB0ZXh0TGluZXM7XG4gICAgdmFyIGZvbnRTaXplO1xuICAgIHZhciBwYWRkaW5nID0gdGV4dEZpZWxkLmlzQ29tYmVkKCkgPyAwIDogMTtcbiAgICB2YXIgYm91bmRzID0ge1xuICAgICAgICB4OiBib3JkZXJXaWR0aCArIHBhZGRpbmcsXG4gICAgICAgIHk6IGJvcmRlcldpZHRoICsgcGFkZGluZyxcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gKGJvcmRlcldpZHRoICsgcGFkZGluZykgKiAyLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIChib3JkZXJXaWR0aCArIHBhZGRpbmcpICogMixcbiAgICB9O1xuICAgIGlmICh0ZXh0RmllbGQuaXNNdWx0aWxpbmUoKSkge1xuICAgICAgICB2YXIgbGF5b3V0ID0gbGF5b3V0TXVsdGlsaW5lVGV4dCh0ZXh0LCB7XG4gICAgICAgICAgICBhbGlnbm1lbnQ6IHRleHRGaWVsZC5nZXRBbGlnbm1lbnQoKSxcbiAgICAgICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgICAgIGJvdW5kczogYm91bmRzLFxuICAgICAgICB9KTtcbiAgICAgICAgdGV4dExpbmVzID0gbGF5b3V0LmxpbmVzO1xuICAgICAgICBmb250U2l6ZSA9IGxheW91dC5mb250U2l6ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGV4dEZpZWxkLmlzQ29tYmVkKCkpIHtcbiAgICAgICAgdmFyIGxheW91dCA9IGxheW91dENvbWJlZFRleHQodGV4dCwge1xuICAgICAgICAgICAgZm9udFNpemU6IHdpZGdldEZvbnRTaXplICE9PSBudWxsICYmIHdpZGdldEZvbnRTaXplICE9PSB2b2lkIDAgPyB3aWRnZXRGb250U2l6ZSA6IGZpZWxkRm9udFNpemUsXG4gICAgICAgICAgICBmb250OiBmb250LFxuICAgICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgICAgICBjZWxsQ291bnQ6IChfYyA9IHRleHRGaWVsZC5nZXRNYXhMZW5ndGgoKSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRleHRMaW5lcyA9IGxheW91dC5jZWxscztcbiAgICAgICAgZm9udFNpemUgPSBsYXlvdXQuZm9udFNpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgbGF5b3V0ID0gbGF5b3V0U2luZ2xlbGluZVRleHQodGV4dCwge1xuICAgICAgICAgICAgYWxpZ25tZW50OiB0ZXh0RmllbGQuZ2V0QWxpZ25tZW50KCksXG4gICAgICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnQ6IGZvbnQsXG4gICAgICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRleHRMaW5lcyA9IFtsYXlvdXQubGluZV07XG4gICAgICAgIGZvbnRTaXplID0gbGF5b3V0LmZvbnRTaXplO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgZm9udCBzaXplIGFuZCBjb2xvclxuICAgIHZhciB0ZXh0Q29sb3IgPSAoX2QgPSB3aWRnZXRDb2xvciAhPT0gbnVsbCAmJiB3aWRnZXRDb2xvciAhPT0gdm9pZCAwID8gd2lkZ2V0Q29sb3IgOiBmaWVsZENvbG9yKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBibGFjaztcbiAgICBpZiAod2lkZ2V0Q29sb3IgfHwgd2lkZ2V0Rm9udFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZSh3aWRnZXQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2UodGV4dEZpZWxkLmFjcm9GaWVsZCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICB4OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB5OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoICE9PSBudWxsICYmIGJvcmRlcldpZHRoICE9PSB2b2lkIDAgPyBib3JkZXJXaWR0aCA6IDAsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgdGV4dENvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IGZvbnQubmFtZSxcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLFxuICAgICAgICB0ZXh0TGluZXM6IHRleHRMaW5lcyxcbiAgICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICB9O1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdUZXh0RmllbGQob3B0aW9ucykpO1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdERyb3Bkb3duQXBwZWFyYW5jZVByb3ZpZGVyID0gZnVuY3Rpb24gKGRyb3Bkb3duLCB3aWRnZXQsIGZvbnQpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAvLyBUaGUgYC9EQWAgZW50cnkgY2FuIGJlIGF0IHRoZSB3aWRnZXQgb3IgZmllbGQgbGV2ZWwgLSBzbyB3ZSBoYW5kbGUgYm90aFxuICAgIHZhciB3aWRnZXRDb2xvciA9IGdldERlZmF1bHRDb2xvcih3aWRnZXQpO1xuICAgIHZhciBmaWVsZENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKGRyb3Bkb3duLmFjcm9GaWVsZCk7XG4gICAgdmFyIHdpZGdldEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkRm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUoZHJvcGRvd24uYWNyb0ZpZWxkKTtcbiAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgIHZhciBhcCA9IHdpZGdldC5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgdmFyIGJzID0gd2lkZ2V0LmdldEJvcmRlclN0eWxlKCk7XG4gICAgdmFyIHRleHQgPSAoX2EgPSBkcm9wZG93bi5nZXRTZWxlY3RlZCgpWzBdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2IgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Um90YXRpb24oKSk7XG4gICAgdmFyIF9kID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pLCB3aWR0aCA9IF9kLndpZHRoLCBoZWlnaHQgPSBfZC5oZWlnaHQ7XG4gICAgdmFyIHJvdGF0ZSA9IHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IHJvdGF0aW9uIH0pKTtcbiAgICB2YXIgYmxhY2sgPSByZ2IoMCwgMCwgMCk7XG4gICAgdmFyIGJvcmRlckNvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJvcmRlckNvbG9yKCkpO1xuICAgIHZhciBub3JtYWxCYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCkpO1xuICAgIHZhciBwYWRkaW5nID0gMTtcbiAgICB2YXIgYm91bmRzID0ge1xuICAgICAgICB4OiBib3JkZXJXaWR0aCArIHBhZGRpbmcsXG4gICAgICAgIHk6IGJvcmRlcldpZHRoICsgcGFkZGluZyxcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gKGJvcmRlcldpZHRoICsgcGFkZGluZykgKiAyLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIChib3JkZXJXaWR0aCArIHBhZGRpbmcpICogMixcbiAgICB9O1xuICAgIHZhciBfZSA9IGxheW91dFNpbmdsZWxpbmVUZXh0KHRleHQsIHtcbiAgICAgICAgYWxpZ25tZW50OiBUZXh0QWxpZ25tZW50LkxlZnQsXG4gICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICBmb250OiBmb250LFxuICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICB9KSwgbGluZSA9IF9lLmxpbmUsIGZvbnRTaXplID0gX2UuZm9udFNpemU7XG4gICAgLy8gVXBkYXRlIGZvbnQgc2l6ZSBhbmQgY29sb3JcbiAgICB2YXIgdGV4dENvbG9yID0gKF9jID0gd2lkZ2V0Q29sb3IgIT09IG51bGwgJiYgd2lkZ2V0Q29sb3IgIT09IHZvaWQgMCA/IHdpZGdldENvbG9yIDogZmllbGRDb2xvcikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogYmxhY2s7XG4gICAgaWYgKHdpZGdldENvbG9yIHx8IHdpZGdldEZvbnRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uod2lkZ2V0LCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKGRyb3Bkb3duLmFjcm9GaWVsZCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICB4OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB5OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IGJvcmRlcldpZHRoICE9PSBudWxsICYmIGJvcmRlcldpZHRoICE9PSB2b2lkIDAgPyBib3JkZXJXaWR0aCA6IDAsXG4gICAgICAgIGJvcmRlckNvbG9yOiBib3JkZXJDb2xvcixcbiAgICAgICAgdGV4dENvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IGZvbnQubmFtZSxcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLFxuICAgICAgICB0ZXh0TGluZXM6IFtsaW5lXSxcbiAgICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICB9O1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdUZXh0RmllbGQob3B0aW9ucykpO1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdE9wdGlvbkxpc3RBcHBlYXJhbmNlUHJvdmlkZXIgPSBmdW5jdGlvbiAob3B0aW9uTGlzdCwgd2lkZ2V0LCBmb250KSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICAvLyBUaGUgYC9EQWAgZW50cnkgY2FuIGJlIGF0IHRoZSB3aWRnZXQgb3IgZmllbGQgbGV2ZWwgLSBzbyB3ZSBoYW5kbGUgYm90aFxuICAgIHZhciB3aWRnZXRDb2xvciA9IGdldERlZmF1bHRDb2xvcih3aWRnZXQpO1xuICAgIHZhciBmaWVsZENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKG9wdGlvbkxpc3QuYWNyb0ZpZWxkKTtcbiAgICB2YXIgd2lkZ2V0Rm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZShvcHRpb25MaXN0LmFjcm9GaWVsZCk7XG4gICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IChfYSA9IGJzID09PSBudWxsIHx8IGJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBicy5nZXRXaWR0aCgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRSb3RhdGlvbigpKTtcbiAgICB2YXIgX2MgPSBhZGp1c3REaW1zRm9yUm90YXRpb24ocmVjdGFuZ2xlLCByb3RhdGlvbiksIHdpZHRoID0gX2Mud2lkdGgsIGhlaWdodCA9IF9jLmhlaWdodDtcbiAgICB2YXIgcm90YXRlID0gcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogcm90YXRpb24gfSkpO1xuICAgIHZhciBibGFjayA9IHJnYigwLCAwLCAwKTtcbiAgICB2YXIgYm9yZGVyQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Qm9yZGVyQ29sb3IoKSk7XG4gICAgdmFyIG5vcm1hbEJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7XG4gICAgdmFyIG9wdGlvbnMgPSBvcHRpb25MaXN0LmdldE9wdGlvbnMoKTtcbiAgICB2YXIgc2VsZWN0ZWQgPSBvcHRpb25MaXN0LmdldFNlbGVjdGVkKCk7XG4gICAgaWYgKG9wdGlvbkxpc3QuaXNTb3J0ZWQoKSlcbiAgICAgICAgb3B0aW9ucy5zb3J0KCk7XG4gICAgdmFyIHRleHQgPSAnJztcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB0ZXh0ICs9IG9wdGlvbnNbaWR4XTtcbiAgICAgICAgaWYgKGlkeCA8IGxlbiAtIDEpXG4gICAgICAgICAgICB0ZXh0ICs9ICdcXG4nO1xuICAgIH1cbiAgICB2YXIgcGFkZGluZyA9IDE7XG4gICAgdmFyIGJvdW5kcyA9IHtcbiAgICAgICAgeDogYm9yZGVyV2lkdGggKyBwYWRkaW5nLFxuICAgICAgICB5OiBib3JkZXJXaWR0aCArIHBhZGRpbmcsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIChib3JkZXJXaWR0aCArIHBhZGRpbmcpICogMixcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSAoYm9yZGVyV2lkdGggKyBwYWRkaW5nKSAqIDIsXG4gICAgfTtcbiAgICB2YXIgX2QgPSBsYXlvdXRNdWx0aWxpbmVUZXh0KHRleHQsIHtcbiAgICAgICAgYWxpZ25tZW50OiBUZXh0QWxpZ25tZW50LkxlZnQsXG4gICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICBmb250OiBmb250LFxuICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICB9KSwgbGluZXMgPSBfZC5saW5lcywgZm9udFNpemUgPSBfZC5mb250U2l6ZSwgbGluZUhlaWdodCA9IF9kLmxpbmVIZWlnaHQ7XG4gICAgdmFyIHNlbGVjdGVkTGluZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBsaW5lc1tpZHhdO1xuICAgICAgICBpZiAoc2VsZWN0ZWQuaW5jbHVkZXMobGluZS50ZXh0KSlcbiAgICAgICAgICAgIHNlbGVjdGVkTGluZXMucHVzaChpZHgpO1xuICAgIH1cbiAgICB2YXIgYmx1ZSA9IHJnYigxNTMgLyAyNTUsIDE5MyAvIDI1NSwgMjE4IC8gMjU1KTtcbiAgICAvLyBVcGRhdGUgZm9udCBzaXplIGFuZCBjb2xvclxuICAgIHZhciB0ZXh0Q29sb3IgPSAoX2IgPSB3aWRnZXRDb2xvciAhPT0gbnVsbCAmJiB3aWRnZXRDb2xvciAhPT0gdm9pZCAwID8gd2lkZ2V0Q29sb3IgOiBmaWVsZENvbG9yKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBibGFjaztcbiAgICBpZiAod2lkZ2V0Q29sb3IgfHwgd2lkZ2V0Rm9udFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZSh3aWRnZXQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uob3B0aW9uTGlzdC5hY3JvRmllbGQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3T3B0aW9uTGlzdCh7XG4gICAgICAgIHg6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHk6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGggIT09IG51bGwgJiYgYm9yZGVyV2lkdGggIT09IHZvaWQgMCA/IGJvcmRlcldpZHRoIDogMCxcbiAgICAgICAgYm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yLFxuICAgICAgICB0ZXh0Q29sb3I6IHRleHRDb2xvcixcbiAgICAgICAgZm9udDogZm9udC5uYW1lLFxuICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgIGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIHRleHRMaW5lczogbGluZXMsXG4gICAgICAgIGxpbmVIZWlnaHQ6IGxpbmVIZWlnaHQsXG4gICAgICAgIHNlbGVjdGVkQ29sb3I6IGJsdWUsXG4gICAgICAgIHNlbGVjdGVkTGluZXM6IHNlbGVjdGVkTGluZXMsXG4gICAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgfSkpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwcGVhcmFuY2VzLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2FwcGVhcmFuY2VzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkJ1dHRvbiB9IGZyb20gXCIuL1BERkJ1dHRvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZDaGVja0JveCB9IGZyb20gXCIuL1BERkNoZWNrQm94XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkRyb3Bkb3duIH0gZnJvbSBcIi4vUERGRHJvcGRvd25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRmllbGQgfSBmcm9tIFwiLi9QREZGaWVsZFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZGb3JtIH0gZnJvbSBcIi4vUERGRm9ybVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPcHRpb25MaXN0IH0gZnJvbSBcIi4vUERGT3B0aW9uTGlzdFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZSYWRpb0dyb3VwIH0gZnJvbSBcIi4vUERGUmFkaW9Hcm91cFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZTaWduYXR1cmUgfSBmcm9tIFwiLi9QREZTaWduYXR1cmVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGVGV4dEZpZWxkIH0gZnJvbSBcIi4vUERGVGV4dEZpZWxkXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgdmFyIEltYWdlQWxpZ25tZW50O1xuKGZ1bmN0aW9uIChJbWFnZUFsaWdubWVudCkge1xuICAgIEltYWdlQWxpZ25tZW50W0ltYWdlQWxpZ25tZW50W1wiTGVmdFwiXSA9IDBdID0gXCJMZWZ0XCI7XG4gICAgSW1hZ2VBbGlnbm1lbnRbSW1hZ2VBbGlnbm1lbnRbXCJDZW50ZXJcIl0gPSAxXSA9IFwiQ2VudGVyXCI7XG4gICAgSW1hZ2VBbGlnbm1lbnRbSW1hZ2VBbGlnbm1lbnRbXCJSaWdodFwiXSA9IDJdID0gXCJSaWdodFwiO1xufSkoSW1hZ2VBbGlnbm1lbnQgfHwgKEltYWdlQWxpZ25tZW50ID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFsaWdubWVudC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9hbGlnbm1lbnRcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2Zvcm1cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbWFnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb2JqZWN0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3BlcmF0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yb3RhdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NpemVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9QREZQYWdlT3B0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUERGRG9jdW1lbnRPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdGFuZGFyZEZvbnRzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkRvY3VtZW50IH0gZnJvbSBcIi4vUERGRG9jdW1lbnRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRm9udCB9IGZyb20gXCIuL1BERkZvbnRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGSW1hZ2UgfSBmcm9tIFwiLi9QREZJbWFnZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZQYWdlIH0gZnJvbSBcIi4vUERGUGFnZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZFbWJlZGRlZFBhZ2UgfSBmcm9tIFwiLi9QREZFbWJlZGRlZFBhZ2VcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGSmF2YVNjcmlwdCB9IGZyb20gXCIuL1BERkphdmFTY3JpcHRcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IFBERk5hbWUsIFBERk51bWJlciB9IGZyb20gXCIuLi9jb3JlXCI7XG5leHBvcnQgdmFyIGFzUERGTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWUgaW5zdGFuY2VvZiBQREZOYW1lID8gbmFtZSA6IFBERk5hbWUub2YobmFtZSk7XG59O1xuZXhwb3J0IHZhciBhc1BERk51bWJlciA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICByZXR1cm4gbnVtIGluc3RhbmNlb2YgUERGTnVtYmVyID8gbnVtIDogUERGTnVtYmVyLm9mKG51bSk7XG59O1xuZXhwb3J0IHZhciBhc051bWJlciA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICByZXR1cm4gbnVtIGluc3RhbmNlb2YgUERGTnVtYmVyID8gbnVtLmFzTnVtYmVyKCkgOiBudW07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JqZWN0cy5qcy5tYXAiLCJpbXBvcnQgeyBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgc2V0RmlsbGluZ0NvbG9yLCBzZXRTdHJva2luZ0NvbG9yIH0gZnJvbSBcIi4vY29sb3JzXCI7XG5pbXBvcnQgeyBiZWdpblRleHQsIGNsb3NlUGF0aCwgZHJhd09iamVjdCwgZW5kVGV4dCwgZmlsbCwgZmlsbEFuZFN0cm9rZSwgbGluZVRvLCBtb3ZlVG8sIG5leHRMaW5lLCBwb3BHcmFwaGljc1N0YXRlLCBwdXNoR3JhcGhpY3NTdGF0ZSwgcm90YXRlQW5kU2tld1RleHRSYWRpYW5zQW5kVHJhbnNsYXRlLCByb3RhdGVSYWRpYW5zLCBzY2FsZSwgc2V0Rm9udEFuZFNpemUsIHNldExpbmVIZWlnaHQsIHNldExpbmVXaWR0aCwgc2hvd1RleHQsIHNrZXdSYWRpYW5zLCBzdHJva2UsIHRyYW5zbGF0ZSwgc2V0TGluZUNhcCwgcm90YXRlRGVncmVlcywgc2V0R3JhcGhpY3NTdGF0ZSwgc2V0RGFzaFBhdHRlcm4sIGJlZ2luTWFya2VkQ29udGVudCwgZW5kTWFya2VkQ29udGVudCwgY2xpcCwgZW5kUGF0aCwgYXBwZW5kQmV6aWVyQ3VydmUsIH0gZnJvbSBcIi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzLCB0b1JhZGlhbnMgfSBmcm9tIFwiLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IHN2Z1BhdGhUb09wZXJhdG9ycyB9IGZyb20gXCIuL3N2Z1BhdGhcIjtcbmltcG9ydCB7IGFzTnVtYmVyIH0gZnJvbSBcIi4vb2JqZWN0c1wiO1xuZXhwb3J0IHZhciBkcmF3VGV4dCA9IGZ1bmN0aW9uIChsaW5lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgYmVnaW5UZXh0KCksXG4gICAgICAgIHNldEZpbGxpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgc2V0Rm9udEFuZFNpemUob3B0aW9ucy5mb250LCBvcHRpb25zLnNpemUpLFxuICAgICAgICByb3RhdGVBbmRTa2V3VGV4dFJhZGlhbnNBbmRUcmFuc2xhdGUodG9SYWRpYW5zKG9wdGlvbnMucm90YXRlKSwgdG9SYWRpYW5zKG9wdGlvbnMueFNrZXcpLCB0b1JhZGlhbnMob3B0aW9ucy55U2tldyksIG9wdGlvbnMueCwgb3B0aW9ucy55KSxcbiAgICAgICAgc2hvd1RleHQobGluZSksXG4gICAgICAgIGVuZFRleHQoKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd0xpbmVzT2ZUZXh0ID0gZnVuY3Rpb24gKGxpbmVzLCBvcHRpb25zKSB7XG4gICAgdmFyIG9wZXJhdG9ycyA9IFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgYmVnaW5UZXh0KCksXG4gICAgICAgIHNldEZpbGxpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgc2V0Rm9udEFuZFNpemUob3B0aW9ucy5mb250LCBvcHRpb25zLnNpemUpLFxuICAgICAgICBzZXRMaW5lSGVpZ2h0KG9wdGlvbnMubGluZUhlaWdodCksXG4gICAgICAgIHJvdGF0ZUFuZFNrZXdUZXh0UmFkaWFuc0FuZFRyYW5zbGF0ZSh0b1JhZGlhbnMob3B0aW9ucy5yb3RhdGUpLCB0b1JhZGlhbnMob3B0aW9ucy54U2tldyksIHRvUmFkaWFucyhvcHRpb25zLnlTa2V3KSwgb3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBvcGVyYXRvcnMucHVzaChzaG93VGV4dChsaW5lc1tpZHhdKSwgbmV4dExpbmUoKSk7XG4gICAgfVxuICAgIG9wZXJhdG9ycy5wdXNoKGVuZFRleHQoKSwgcG9wR3JhcGhpY3NTdGF0ZSgpKTtcbiAgICByZXR1cm4gb3BlcmF0b3JzO1xufTtcbmV4cG9ydCB2YXIgZHJhd0ltYWdlID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgICAgICByb3RhdGVSYWRpYW5zKHRvUmFkaWFucyhvcHRpb25zLnJvdGF0ZSkpLFxuICAgICAgICBzY2FsZShvcHRpb25zLndpZHRoLCBvcHRpb25zLmhlaWdodCksXG4gICAgICAgIHNrZXdSYWRpYW5zKHRvUmFkaWFucyhvcHRpb25zLnhTa2V3KSwgdG9SYWRpYW5zKG9wdGlvbnMueVNrZXcpKSxcbiAgICAgICAgZHJhd09iamVjdChuYW1lKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd1BhZ2UgPSBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIHRyYW5zbGF0ZShvcHRpb25zLngsIG9wdGlvbnMueSksXG4gICAgICAgIHJvdGF0ZVJhZGlhbnModG9SYWRpYW5zKG9wdGlvbnMucm90YXRlKSksXG4gICAgICAgIHNjYWxlKG9wdGlvbnMueFNjYWxlLCBvcHRpb25zLnlTY2FsZSksXG4gICAgICAgIHNrZXdSYWRpYW5zKHRvUmFkaWFucyhvcHRpb25zLnhTa2V3KSwgdG9SYWRpYW5zKG9wdGlvbnMueVNrZXcpKSxcbiAgICAgICAgZHJhd09iamVjdChuYW1lKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd0xpbmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBzZXRTdHJva2luZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBzZXRMaW5lV2lkdGgob3B0aW9ucy50aGlja25lc3MpLFxuICAgICAgICBzZXREYXNoUGF0dGVybigoX2EgPSBvcHRpb25zLmRhc2hBcnJheSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10sIChfYiA9IG9wdGlvbnMuZGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwKSxcbiAgICAgICAgbW92ZVRvKG9wdGlvbnMuc3RhcnQueCwgb3B0aW9ucy5zdGFydC55KSxcbiAgICAgICAgb3B0aW9ucy5saW5lQ2FwICYmIHNldExpbmVDYXAob3B0aW9ucy5saW5lQ2FwKSxcbiAgICAgICAgbW92ZVRvKG9wdGlvbnMuc3RhcnQueCwgb3B0aW9ucy5zdGFydC55KSxcbiAgICAgICAgbGluZVRvKG9wdGlvbnMuZW5kLngsIG9wdGlvbnMuZW5kLnkpLFxuICAgICAgICBzdHJva2UoKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd1JlY3RhbmdsZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIHNldEZpbGxpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciAmJiBzZXRTdHJva2luZ0NvbG9yKG9wdGlvbnMuYm9yZGVyQ29sb3IpLFxuICAgICAgICBzZXRMaW5lV2lkdGgob3B0aW9ucy5ib3JkZXJXaWR0aCksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyTGluZUNhcCAmJiBzZXRMaW5lQ2FwKG9wdGlvbnMuYm9yZGVyTGluZUNhcCksXG4gICAgICAgIHNldERhc2hQYXR0ZXJuKChfYSA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXSwgKF9iID0gb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDApLFxuICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgICAgICByb3RhdGVSYWRpYW5zKHRvUmFkaWFucyhvcHRpb25zLnJvdGF0ZSkpLFxuICAgICAgICBza2V3UmFkaWFucyh0b1JhZGlhbnMob3B0aW9ucy54U2tldyksIHRvUmFkaWFucyhvcHRpb25zLnlTa2V3KSksXG4gICAgICAgIG1vdmVUbygwLCAwKSxcbiAgICAgICAgbGluZVRvKDAsIG9wdGlvbnMuaGVpZ2h0KSxcbiAgICAgICAgbGluZVRvKG9wdGlvbnMud2lkdGgsIG9wdGlvbnMuaGVpZ2h0KSxcbiAgICAgICAgbGluZVRvKG9wdGlvbnMud2lkdGgsIDApLFxuICAgICAgICBjbG9zZVBhdGgoKSxcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgb3B0aW9ucy5ib3JkZXJXaWR0aCA/IGZpbGxBbmRTdHJva2UoKVxuICAgICAgICAgICAgOiBvcHRpb25zLmNvbG9yID8gZmlsbCgpXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zLmJvcmRlckNvbG9yID8gc3Ryb2tlKClcbiAgICAgICAgICAgICAgICAgICAgOiBjbG9zZVBhdGgoKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xufTtcbnZhciBLQVBQQSA9IDQuMCAqICgoTWF0aC5zcXJ0KDIpIC0gMS4wKSAvIDMuMCk7XG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCB2YXIgZHJhd0VsbGlwc2VQYXRoID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIHZhciB4ID0gYXNOdW1iZXIoY29uZmlnLngpO1xuICAgIHZhciB5ID0gYXNOdW1iZXIoY29uZmlnLnkpO1xuICAgIHZhciB4U2NhbGUgPSBhc051bWJlcihjb25maWcueFNjYWxlKTtcbiAgICB2YXIgeVNjYWxlID0gYXNOdW1iZXIoY29uZmlnLnlTY2FsZSk7XG4gICAgeCAtPSB4U2NhbGU7XG4gICAgeSAtPSB5U2NhbGU7XG4gICAgdmFyIG94ID0geFNjYWxlICogS0FQUEE7XG4gICAgdmFyIG95ID0geVNjYWxlICogS0FQUEE7XG4gICAgdmFyIHhlID0geCArIHhTY2FsZSAqIDI7XG4gICAgdmFyIHllID0geSArIHlTY2FsZSAqIDI7XG4gICAgdmFyIHhtID0geCArIHhTY2FsZTtcbiAgICB2YXIgeW0gPSB5ICsgeVNjYWxlO1xuICAgIHJldHVybiBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG1vdmVUbyh4LCB5bSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHgsIHltIC0gb3ksIHhtIC0gb3gsIHksIHhtLCB5KSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeG0gKyBveCwgeSwgeGUsIHltIC0gb3ksIHhlLCB5bSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhlLCB5bSArIG95LCB4bSArIG94LCB5ZSwgeG0sIHllKSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeG0gLSBveCwgeWUsIHgsIHltICsgb3ksIHgsIHltKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF07XG59O1xudmFyIGRyYXdFbGxpcHNlQ3VydmVzID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIHZhciBjZW50ZXJYID0gYXNOdW1iZXIoY29uZmlnLngpO1xuICAgIHZhciBjZW50ZXJZID0gYXNOdW1iZXIoY29uZmlnLnkpO1xuICAgIHZhciB4U2NhbGUgPSBhc051bWJlcihjb25maWcueFNjYWxlKTtcbiAgICB2YXIgeVNjYWxlID0gYXNOdW1iZXIoY29uZmlnLnlTY2FsZSk7XG4gICAgdmFyIHggPSAteFNjYWxlO1xuICAgIHZhciB5ID0gLXlTY2FsZTtcbiAgICB2YXIgb3ggPSB4U2NhbGUgKiBLQVBQQTtcbiAgICB2YXIgb3kgPSB5U2NhbGUgKiBLQVBQQTtcbiAgICB2YXIgeGUgPSB4ICsgeFNjYWxlICogMjtcbiAgICB2YXIgeWUgPSB5ICsgeVNjYWxlICogMjtcbiAgICB2YXIgeG0gPSB4ICsgeFNjYWxlO1xuICAgIHZhciB5bSA9IHkgKyB5U2NhbGU7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgdHJhbnNsYXRlKGNlbnRlclgsIGNlbnRlclkpLFxuICAgICAgICByb3RhdGVSYWRpYW5zKHRvUmFkaWFucyhjb25maWcucm90YXRlKSksXG4gICAgICAgIG1vdmVUbyh4LCB5bSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHgsIHltIC0gb3ksIHhtIC0gb3gsIHksIHhtLCB5KSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeG0gKyBveCwgeSwgeGUsIHltIC0gb3ksIHhlLCB5bSksXG4gICAgICAgIGFwcGVuZEJlemllckN1cnZlKHhlLCB5bSArIG95LCB4bSArIG94LCB5ZSwgeG0sIHllKSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeG0gLSBveCwgeWUsIHgsIHltICsgb3ksIHgsIHltKSxcbiAgICBdO1xufTtcbmV4cG9ydCB2YXIgZHJhd0VsbGlwc2UgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgc2V0RmlsbGluZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yICYmIHNldFN0cm9raW5nQ29sb3Iob3B0aW9ucy5ib3JkZXJDb2xvciksXG4gICAgICAgIHNldExpbmVXaWR0aChvcHRpb25zLmJvcmRlcldpZHRoKSxcbiAgICAgICAgb3B0aW9ucy5ib3JkZXJMaW5lQ2FwICYmIHNldExpbmVDYXAob3B0aW9ucy5ib3JkZXJMaW5lQ2FwKSxcbiAgICAgICAgc2V0RGFzaFBhdHRlcm4oKF9hID0gb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdLCAoX2IgPSBvcHRpb25zLmJvcmRlckRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMClcbiAgICBdLCAob3B0aW9ucy5yb3RhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGRyYXdFbGxpcHNlUGF0aCh7XG4gICAgICAgICAgICB4OiBvcHRpb25zLngsXG4gICAgICAgICAgICB5OiBvcHRpb25zLnksXG4gICAgICAgICAgICB4U2NhbGU6IG9wdGlvbnMueFNjYWxlLFxuICAgICAgICAgICAgeVNjYWxlOiBvcHRpb25zLnlTY2FsZSxcbiAgICAgICAgfSlcbiAgICAgICAgOiBkcmF3RWxsaXBzZUN1cnZlcyh7XG4gICAgICAgICAgICB4OiBvcHRpb25zLngsXG4gICAgICAgICAgICB5OiBvcHRpb25zLnksXG4gICAgICAgICAgICB4U2NhbGU6IG9wdGlvbnMueFNjYWxlLFxuICAgICAgICAgICAgeVNjYWxlOiBvcHRpb25zLnlTY2FsZSxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9jID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGRlZ3JlZXMoMCksXG4gICAgICAgIH0pKSwgW1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBvcHRpb25zLmJvcmRlcldpZHRoID8gZmlsbEFuZFN0cm9rZSgpXG4gICAgICAgICAgICA6IG9wdGlvbnMuY29sb3IgPyBmaWxsKClcbiAgICAgICAgICAgICAgICA6IG9wdGlvbnMuYm9yZGVyQ29sb3IgPyBzdHJva2UoKVxuICAgICAgICAgICAgICAgICAgICA6IGNsb3NlUGF0aCgpLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXSkuZmlsdGVyKEJvb2xlYW4pO1xufTtcbmV4cG9ydCB2YXIgZHJhd1N2Z1BhdGggPSBmdW5jdGlvbiAocGF0aCwgb3B0aW9ucykge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIHRyYW5zbGF0ZShvcHRpb25zLngsIG9wdGlvbnMueSksXG4gICAgICAgIHJvdGF0ZVJhZGlhbnModG9SYWRpYW5zKChfYSA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBkZWdyZWVzKDApKSksXG4gICAgICAgIC8vIFNWRyBwYXRoIFkgYXhpcyBpcyBvcHBvc2l0ZSBwZGYtbGliJ3NcbiAgICAgICAgb3B0aW9ucy5zY2FsZSA/IHNjYWxlKG9wdGlvbnMuc2NhbGUsIC1vcHRpb25zLnNjYWxlKSA6IHNjYWxlKDEsIC0xKSxcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBzZXRGaWxsaW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgJiYgc2V0U3Ryb2tpbmdDb2xvcihvcHRpb25zLmJvcmRlckNvbG9yKSxcbiAgICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCAmJiBzZXRMaW5lV2lkdGgob3B0aW9ucy5ib3JkZXJXaWR0aCksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyTGluZUNhcCAmJiBzZXRMaW5lQ2FwKG9wdGlvbnMuYm9yZGVyTGluZUNhcCksXG4gICAgICAgIHNldERhc2hQYXR0ZXJuKChfYiA9IG9wdGlvbnMuYm9yZGVyRGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXSwgKF9jID0gb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDApXG4gICAgXSwgc3ZnUGF0aFRvT3BlcmF0b3JzKHBhdGgpLCBbXG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIG9wdGlvbnMuYm9yZGVyV2lkdGggPyBmaWxsQW5kU3Ryb2tlKClcbiAgICAgICAgICAgIDogb3B0aW9ucy5jb2xvciA/IGZpbGwoKVxuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5ib3JkZXJDb2xvciA/IHN0cm9rZSgpXG4gICAgICAgICAgICAgICAgICAgIDogY2xvc2VQYXRoKCksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdKS5maWx0ZXIoQm9vbGVhbik7XG59O1xuZXhwb3J0IHZhciBkcmF3Q2hlY2tNYXJrID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgc2l6ZSA9IGFzTnVtYmVyKG9wdGlvbnMuc2l6ZSk7XG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqIERlZmluZSBDaGVjayBNYXJrIFBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgLy8gQSBjaGVjayBtYXJrIGlzIGRlZmluZWQgYnkgdGhyZWUgcG9pbnRzIGluIHNvbWUgY29vcmRpbmF0ZSBzcGFjZS4gSGVyZSwgd2VcbiAgICAvLyBkZWZpbmUgdGhlc2UgcG9pbnRzIGluIGEgdW5pdCBjb29yZGluYXRlIHN5c3RlbSwgd2hlcmUgdGhlIHJhbmdlIG9mIHRoZSB4XG4gICAgLy8gYW5kIHkgYXhpcyBhcmUgYm90aCBbLTEsIDFdLlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IHdlIGRvIG5vdCBoYXJkIGNvZGUgYHAxeWAgaW4gY2FzZSB3ZSB3aXNoIHRvIGNoYW5nZSB0aGVcbiAgICAvLyBzaXplL3NoYXBlIG9mIHRoZSBjaGVjayBtYXJrIGluIHRoZSBmdXR1cmUuIFdlIHdhbnQgdGhlIGNoZWNrIG1hcmsgdG9cbiAgICAvLyBhbHdheXMgZm9ybSBhIHJpZ2h0IGFuZ2xlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGRvdCBwcm9kdWN0IGJldHdlZW4gKHAxLXAyKVxuICAgIC8vIGFuZCAocDMtcDIpIHNob3VsZCBiZSB6ZXJvOlxuICAgIC8vXG4gICAgLy8gICAocDF4LXAyeCkgKiAocDN4LXAyeCkgKyAocDF5LXAyeSkgKiAocDN5LXAyeSkgPSAwXG4gICAgLy9cbiAgICAvLyBXZSBjYW4gbm93IHJlamlnZ2VyIHRoaXMgZXF1YXRpb24gdG8gc29sdmUgZm9yIGBwMXlgOlxuICAgIC8vXG4gICAgLy8gICAocDF5LXAyeSkgKiAocDN5LXAyeSkgPSAtKChwMXgtcDJ4KSAqIChwM3gtcDJ4KSlcbiAgICAvLyAgIChwMXktcDJ5KSA9IC0oKHAxeC1wMngpICogKHAzeC1wMngpKSAvIChwM3ktcDJ5KVxuICAgIC8vICAgcDF5ID0gLSgocDF4LXAyeCkgKiAocDN4LXAyeCkpIC8gKHAzeS1wMnkpICsgcDJ5XG4gICAgLy9cbiAgICAvLyBUaGFua3MgdG8gbXkgZnJpZW5kIEpvZWwgV2Fsa2VyIChodHRwczovL2dpdGh1Yi5jb20vSldhbGtlcjE5OTUpIGZvclxuICAgIC8vIGRldmlzaW5nIHRoZSBhYm92ZSBlcXVhdGlvbiBhbmQgdW5pdCBjb29yZGluYXRlIHN5c3RlbSBhcHByb2FjaCFcbiAgICAvLyAoeCwgeSkgY29vcmRzIG9mIHRoZSBjaGVjayBtYXJrJ3MgYm90dG9tbW9zdCBwb2ludFxuICAgIHZhciBwMnggPSAtMSArIDAuNzU7XG4gICAgdmFyIHAyeSA9IC0xICsgMC41MTtcbiAgICAvLyAoeCwgeSkgY29vcmRzIG9mIHRoZSBjaGVjayBtYXJrJ3MgdG9wbW9zdCBwb2ludFxuICAgIHZhciBwM3kgPSAxIC0gMC41MjU7XG4gICAgdmFyIHAzeCA9IDEgLSAwLjMxO1xuICAgIC8vICh4LCB5KSBjb29yZHMgb2YgdGhlIGNoZWNrIG1hcmsncyBjZW50ZXIgKHZlcnRpY2FsbHkpIHBvaW50XG4gICAgdmFyIHAxeCA9IC0xICsgMC4zMjU7XG4gICAgdmFyIHAxeSA9IC0oKHAxeCAtIHAyeCkgKiAocDN4IC0gcDJ4KSkgLyAocDN5IC0gcDJ5KSArIHAyeTtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIHNldFN0cm9raW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIHNldExpbmVXaWR0aChvcHRpb25zLnRoaWNrbmVzcyksXG4gICAgICAgIHRyYW5zbGF0ZShvcHRpb25zLngsIG9wdGlvbnMueSksXG4gICAgICAgIG1vdmVUbyhwMXggKiBzaXplLCBwMXkgKiBzaXplKSxcbiAgICAgICAgbGluZVRvKHAyeCAqIHNpemUsIHAyeSAqIHNpemUpLFxuICAgICAgICBsaW5lVG8ocDN4ICogc2l6ZSwgcDN5ICogc2l6ZSksXG4gICAgICAgIHN0cm9rZSgpLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XG59O1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdmFyIHJvdGF0ZUluUGxhY2UgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zLnJvdGF0aW9uID09PSAwID8gW1xuICAgICAgICB0cmFuc2xhdGUoMCwgMCksXG4gICAgICAgIHJvdGF0ZURlZ3JlZXMoMClcbiAgICBdXG4gICAgICAgIDogb3B0aW9ucy5yb3RhdGlvbiA9PT0gOTAgPyBbXG4gICAgICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy53aWR0aCwgMCksXG4gICAgICAgICAgICByb3RhdGVEZWdyZWVzKDkwKVxuICAgICAgICBdXG4gICAgICAgICAgICA6IG9wdGlvbnMucm90YXRpb24gPT09IDE4MCA/IFtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGUob3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQpLFxuICAgICAgICAgICAgICAgIHJvdGF0ZURlZ3JlZXMoMTgwKVxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5yb3RhdGlvbiA9PT0gMjcwID8gW1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUoMCwgb3B0aW9ucy5oZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICByb3RhdGVEZWdyZWVzKDI3MClcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIDogW107XG59OyAvLyBJbnZhbGlkIHJvdGF0aW9uIC0gbm9vcFxuZXhwb3J0IHZhciBkcmF3Q2hlY2tCb3ggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBvdXRsaW5lID0gZHJhd1JlY3RhbmdsZSh7XG4gICAgICAgIHg6IG9wdGlvbnMueCxcbiAgICAgICAgeTogb3B0aW9ucy55LFxuICAgICAgICB3aWR0aDogb3B0aW9ucy53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBvcHRpb25zLmhlaWdodCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IG9wdGlvbnMuYm9yZGVyV2lkdGgsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLmNvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgaWYgKCFvcHRpb25zLmZpbGxlZClcbiAgICAgICAgcmV0dXJuIG91dGxpbmU7XG4gICAgdmFyIHdpZHRoID0gYXNOdW1iZXIob3B0aW9ucy53aWR0aCk7XG4gICAgdmFyIGhlaWdodCA9IGFzTnVtYmVyKG9wdGlvbnMuaGVpZ2h0KTtcbiAgICB2YXIgY2hlY2tNYXJrU2l6ZSA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gMjtcbiAgICB2YXIgY2hlY2tNYXJrID0gZHJhd0NoZWNrTWFyayh7XG4gICAgICAgIHg6IHdpZHRoIC8gMixcbiAgICAgICAgeTogaGVpZ2h0IC8gMixcbiAgICAgICAgc2l6ZTogY2hlY2tNYXJrU2l6ZSxcbiAgICAgICAgdGhpY2tuZXNzOiBvcHRpb25zLnRoaWNrbmVzcyxcbiAgICAgICAgY29sb3I6IG9wdGlvbnMubWFya0NvbG9yLFxuICAgIH0pO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbcHVzaEdyYXBoaWNzU3RhdGUoKV0sIG91dGxpbmUsIGNoZWNrTWFyaywgW3BvcEdyYXBoaWNzU3RhdGUoKV0pO1xufTtcbmV4cG9ydCB2YXIgZHJhd1JhZGlvQnV0dG9uID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgd2lkdGggPSBhc051bWJlcihvcHRpb25zLndpZHRoKTtcbiAgICB2YXIgaGVpZ2h0ID0gYXNOdW1iZXIob3B0aW9ucy5oZWlnaHQpO1xuICAgIHZhciBvdXRsaW5lU2NhbGUgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDI7XG4gICAgdmFyIG91dGxpbmUgPSBkcmF3RWxsaXBzZSh7XG4gICAgICAgIHg6IG9wdGlvbnMueCxcbiAgICAgICAgeTogb3B0aW9ucy55LFxuICAgICAgICB4U2NhbGU6IG91dGxpbmVTY2FsZSxcbiAgICAgICAgeVNjYWxlOiBvdXRsaW5lU2NhbGUsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLmNvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgYm9yZGVyV2lkdGg6IG9wdGlvbnMuYm9yZGVyV2lkdGgsXG4gICAgfSk7XG4gICAgaWYgKCFvcHRpb25zLmZpbGxlZClcbiAgICAgICAgcmV0dXJuIG91dGxpbmU7XG4gICAgdmFyIGRvdCA9IGRyYXdFbGxpcHNlKHtcbiAgICAgICAgeDogb3B0aW9ucy54LFxuICAgICAgICB5OiBvcHRpb25zLnksXG4gICAgICAgIHhTY2FsZTogb3V0bGluZVNjYWxlICogMC40NSxcbiAgICAgICAgeVNjYWxlOiBvdXRsaW5lU2NhbGUgKiAwLjQ1LFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5kb3RDb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IDAsXG4gICAgfSk7XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFtwdXNoR3JhcGhpY3NTdGF0ZSgpXSwgb3V0bGluZSwgZG90LCBbcG9wR3JhcGhpY3NTdGF0ZSgpXSk7XG59O1xuZXhwb3J0IHZhciBkcmF3QnV0dG9uID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgeCA9IGFzTnVtYmVyKG9wdGlvbnMueCk7XG4gICAgdmFyIHkgPSBhc051bWJlcihvcHRpb25zLnkpO1xuICAgIHZhciB3aWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSBhc051bWJlcihvcHRpb25zLmhlaWdodCk7XG4gICAgdmFyIGJhY2tncm91bmQgPSBkcmF3UmVjdGFuZ2xlKHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeSxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IG9wdGlvbnMuYm9yZGVyV2lkdGgsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLmNvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgdmFyIGxpbmVzID0gZHJhd1RleHRMaW5lcyhvcHRpb25zLnRleHRMaW5lcywge1xuICAgICAgICBjb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IG9wdGlvbnMuZm9udCxcbiAgICAgICAgc2l6ZTogb3B0aW9ucy5mb250U2l6ZSxcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFtwdXNoR3JhcGhpY3NTdGF0ZSgpXSwgYmFja2dyb3VuZCwgbGluZXMsIFtwb3BHcmFwaGljc1N0YXRlKCldKTtcbn07XG5leHBvcnQgdmFyIGRyYXdUZXh0TGluZXMgPSBmdW5jdGlvbiAobGluZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3BlcmF0b3JzID0gW1xuICAgICAgICBiZWdpblRleHQoKSxcbiAgICAgICAgc2V0RmlsbGluZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBzZXRGb250QW5kU2l6ZShvcHRpb25zLmZvbnQsIG9wdGlvbnMuc2l6ZSksXG4gICAgXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIF9hID0gbGluZXNbaWR4XSwgZW5jb2RlZCA9IF9hLmVuY29kZWQsIHggPSBfYS54LCB5ID0gX2EueTtcbiAgICAgICAgb3BlcmF0b3JzLnB1c2gocm90YXRlQW5kU2tld1RleHRSYWRpYW5zQW5kVHJhbnNsYXRlKHRvUmFkaWFucyhvcHRpb25zLnJvdGF0ZSksIHRvUmFkaWFucyhvcHRpb25zLnhTa2V3KSwgdG9SYWRpYW5zKG9wdGlvbnMueVNrZXcpLCB4LCB5KSwgc2hvd1RleHQoZW5jb2RlZCkpO1xuICAgIH1cbiAgICBvcGVyYXRvcnMucHVzaChlbmRUZXh0KCkpO1xuICAgIHJldHVybiBvcGVyYXRvcnM7XG59O1xuZXhwb3J0IHZhciBkcmF3VGV4dEZpZWxkID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgeCA9IGFzTnVtYmVyKG9wdGlvbnMueCk7XG4gICAgdmFyIHkgPSBhc051bWJlcihvcHRpb25zLnkpO1xuICAgIHZhciB3aWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSBhc051bWJlcihvcHRpb25zLmhlaWdodCk7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gYXNOdW1iZXIob3B0aW9ucy5ib3JkZXJXaWR0aCk7XG4gICAgdmFyIHBhZGRpbmcgPSBhc051bWJlcihvcHRpb25zLnBhZGRpbmcpO1xuICAgIHZhciBjbGlwWCA9IHggKyBib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBjbGlwWSA9IHkgKyBib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBjbGlwV2lkdGggPSB3aWR0aCAtIChib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nKSAqIDI7XG4gICAgdmFyIGNsaXBIZWlnaHQgPSBoZWlnaHQgLSAoYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZykgKiAyO1xuICAgIHZhciBjbGlwcGluZ0FyZWEgPSBbXG4gICAgICAgIG1vdmVUbyhjbGlwWCwgY2xpcFkpLFxuICAgICAgICBsaW5lVG8oY2xpcFgsIGNsaXBZICsgY2xpcEhlaWdodCksXG4gICAgICAgIGxpbmVUbyhjbGlwWCArIGNsaXBXaWR0aCwgY2xpcFkgKyBjbGlwSGVpZ2h0KSxcbiAgICAgICAgbGluZVRvKGNsaXBYICsgY2xpcFdpZHRoLCBjbGlwWSksXG4gICAgICAgIGNsb3NlUGF0aCgpLFxuICAgICAgICBjbGlwKCksXG4gICAgICAgIGVuZFBhdGgoKSxcbiAgICBdO1xuICAgIHZhciBiYWNrZ3JvdW5kID0gZHJhd1JlY3RhbmdsZSh7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIHZhciBsaW5lcyA9IGRyYXdUZXh0TGluZXMob3B0aW9ucy50ZXh0TGluZXMsIHtcbiAgICAgICAgY29sb3I6IG9wdGlvbnMudGV4dENvbG9yLFxuICAgICAgICBmb250OiBvcHRpb25zLmZvbnQsXG4gICAgICAgIHNpemU6IG9wdGlvbnMuZm9udFNpemUsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIHZhciBtYXJrZWRDb250ZW50ID0gX19zcHJlYWRBcnJheXMoW1xuICAgICAgICBiZWdpbk1hcmtlZENvbnRlbnQoJ1R4JyksXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKClcbiAgICBdLCBsaW5lcywgW1xuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIGVuZE1hcmtlZENvbnRlbnQoKSxcbiAgICBdKTtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpXG4gICAgXSwgYmFja2dyb3VuZCwgY2xpcHBpbmdBcmVhLCBtYXJrZWRDb250ZW50LCBbXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIGRyYXdPcHRpb25MaXN0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgeCA9IGFzTnVtYmVyKG9wdGlvbnMueCk7XG4gICAgdmFyIHkgPSBhc051bWJlcihvcHRpb25zLnkpO1xuICAgIHZhciB3aWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSBhc051bWJlcihvcHRpb25zLmhlaWdodCk7XG4gICAgdmFyIGxpbmVIZWlnaHQgPSBhc051bWJlcihvcHRpb25zLmxpbmVIZWlnaHQpO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMuYm9yZGVyV2lkdGgpO1xuICAgIHZhciBwYWRkaW5nID0gYXNOdW1iZXIob3B0aW9ucy5wYWRkaW5nKTtcbiAgICB2YXIgY2xpcFggPSB4ICsgYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZztcbiAgICB2YXIgY2xpcFkgPSB5ICsgYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZztcbiAgICB2YXIgY2xpcFdpZHRoID0gd2lkdGggLSAoYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZykgKiAyO1xuICAgIHZhciBjbGlwSGVpZ2h0ID0gaGVpZ2h0IC0gKGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmcpICogMjtcbiAgICB2YXIgY2xpcHBpbmdBcmVhID0gW1xuICAgICAgICBtb3ZlVG8oY2xpcFgsIGNsaXBZKSxcbiAgICAgICAgbGluZVRvKGNsaXBYLCBjbGlwWSArIGNsaXBIZWlnaHQpLFxuICAgICAgICBsaW5lVG8oY2xpcFggKyBjbGlwV2lkdGgsIGNsaXBZICsgY2xpcEhlaWdodCksXG4gICAgICAgIGxpbmVUbyhjbGlwWCArIGNsaXBXaWR0aCwgY2xpcFkpLFxuICAgICAgICBjbG9zZVBhdGgoKSxcbiAgICAgICAgY2xpcCgpLFxuICAgICAgICBlbmRQYXRoKCksXG4gICAgXTtcbiAgICB2YXIgYmFja2dyb3VuZCA9IGRyYXdSZWN0YW5nbGUoe1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcbiAgICAgICAgY29sb3I6IG9wdGlvbnMuY29sb3IsXG4gICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICB9KTtcbiAgICB2YXIgaGlnaGxpZ2h0cyA9IFtdO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMuc2VsZWN0ZWRMaW5lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBvcHRpb25zLnRleHRMaW5lc1tvcHRpb25zLnNlbGVjdGVkTGluZXNbaWR4XV07XG4gICAgICAgIGhpZ2hsaWdodHMucHVzaC5hcHBseShoaWdobGlnaHRzLCBkcmF3UmVjdGFuZ2xlKHtcbiAgICAgICAgICAgIHg6IGxpbmUueCAtIHBhZGRpbmcsXG4gICAgICAgICAgICB5OiBsaW5lLnkgLSAobGluZUhlaWdodCAtIGxpbmUuaGVpZ2h0KSAvIDIsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogbGluZS5oZWlnaHQgKyAobGluZUhlaWdodCAtIGxpbmUuaGVpZ2h0KSAvIDIsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogMCxcbiAgICAgICAgICAgIGNvbG9yOiBvcHRpb25zLnNlbGVjdGVkQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICB2YXIgbGluZXMgPSBkcmF3VGV4dExpbmVzKG9wdGlvbnMudGV4dExpbmVzLCB7XG4gICAgICAgIGNvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgZm9udDogb3B0aW9ucy5mb250LFxuICAgICAgICBzaXplOiBvcHRpb25zLmZvbnRTaXplLFxuICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICB9KTtcbiAgICB2YXIgbWFya2VkQ29udGVudCA9IF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgYmVnaW5NYXJrZWRDb250ZW50KCdUeCcpLFxuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpXG4gICAgXSwgbGluZXMsIFtcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBlbmRNYXJrZWRDb250ZW50KCksXG4gICAgXSk7XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKVxuICAgIF0sIGJhY2tncm91bmQsIGhpZ2hsaWdodHMsIGNsaXBwaW5nQXJlYSwgbWFya2VkQ29udGVudCwgW1xuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3BlcmF0aW9ucy5qcy5tYXAiLCJpbXBvcnQgeyBhc051bWJlciwgYXNQREZOYW1lLCBhc1BERk51bWJlciB9IGZyb20gXCIuL29iamVjdHNcIjtcbmltcG9ydCB7IGRlZ3JlZXNUb1JhZGlhbnMgfSBmcm9tIFwiLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFBERk9wZXJhdG9yLCBQREZPcGVyYXRvck5hbWVzIGFzIE9wcywgfSBmcm9tIFwiLi4vY29yZVwiO1xuLyogPT09PT09PT09PT09PT09PT09PT0gQ2xpcHBpbmcgUGF0aCBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgY2xpcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5DbGlwTm9uWmVybyk7IH07XG5leHBvcnQgdmFyIGNsaXBFdmVuT2RkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkNsaXBFdmVuT2RkKTsgfTtcbi8qID09PT09PT09PT09PT09PT09PT09IEdyYXBoaWNzIFN0YXRlIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xudmFyIGNvcyA9IE1hdGguY29zLCBzaW4gPSBNYXRoLnNpbiwgdGFuID0gTWF0aC50YW47XG5leHBvcnQgdmFyIGNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4LCBbXG4gICAgICAgIGFzUERGTnVtYmVyKGEpLFxuICAgICAgICBhc1BERk51bWJlcihiKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYyksXG4gICAgICAgIGFzUERGTnVtYmVyKGQpLFxuICAgICAgICBhc1BERk51bWJlcihlKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZiksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciB0cmFuc2xhdGUgPSBmdW5jdGlvbiAoeFBvcywgeVBvcykge1xuICAgIHJldHVybiBjb25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeCgxLCAwLCAwLCAxLCB4UG9zLCB5UG9zKTtcbn07XG5leHBvcnQgdmFyIHNjYWxlID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MpIHtcbiAgICByZXR1cm4gY29uY2F0VHJhbnNmb3JtYXRpb25NYXRyaXgoeFBvcywgMCwgMCwgeVBvcywgMCwgMCk7XG59O1xuZXhwb3J0IHZhciByb3RhdGVSYWRpYW5zID0gZnVuY3Rpb24gKGFuZ2xlKSB7XG4gICAgcmV0dXJuIGNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4KGNvcyhhc051bWJlcihhbmdsZSkpLCBzaW4oYXNOdW1iZXIoYW5nbGUpKSwgLXNpbihhc051bWJlcihhbmdsZSkpLCBjb3MoYXNOdW1iZXIoYW5nbGUpKSwgMCwgMCk7XG59O1xuZXhwb3J0IHZhciByb3RhdGVEZWdyZWVzID0gZnVuY3Rpb24gKGFuZ2xlKSB7XG4gICAgcmV0dXJuIHJvdGF0ZVJhZGlhbnMoZGVncmVlc1RvUmFkaWFucyhhc051bWJlcihhbmdsZSkpKTtcbn07XG5leHBvcnQgdmFyIHNrZXdSYWRpYW5zID0gZnVuY3Rpb24gKHhTa2V3QW5nbGUsIHlTa2V3QW5nbGUpIHtcbiAgICByZXR1cm4gY29uY2F0VHJhbnNmb3JtYXRpb25NYXRyaXgoMSwgdGFuKGFzTnVtYmVyKHhTa2V3QW5nbGUpKSwgdGFuKGFzTnVtYmVyKHlTa2V3QW5nbGUpKSwgMSwgMCwgMCk7XG59O1xuZXhwb3J0IHZhciBza2V3RGVncmVlcyA9IGZ1bmN0aW9uICh4U2tld0FuZ2xlLCB5U2tld0FuZ2xlKSB7XG4gICAgcmV0dXJuIHNrZXdSYWRpYW5zKGRlZ3JlZXNUb1JhZGlhbnMoYXNOdW1iZXIoeFNrZXdBbmdsZSkpLCBkZWdyZWVzVG9SYWRpYW5zKGFzTnVtYmVyKHlTa2V3QW5nbGUpKSk7XG59O1xuZXhwb3J0IHZhciBzZXREYXNoUGF0dGVybiA9IGZ1bmN0aW9uIChkYXNoQXJyYXksIGRhc2hQaGFzZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0TGluZURhc2hQYXR0ZXJuLCBbXG4gICAgICAgIFwiW1wiICsgZGFzaEFycmF5Lm1hcChhc1BERk51bWJlcikuam9pbignICcpICsgXCJdXCIsXG4gICAgICAgIGFzUERGTnVtYmVyKGRhc2hQaGFzZSksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciByZXN0b3JlRGFzaFBhdHRlcm4gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBzZXREYXNoUGF0dGVybihbXSwgMCk7IH07XG5leHBvcnQgdmFyIExpbmVDYXBTdHlsZTtcbihmdW5jdGlvbiAoTGluZUNhcFN0eWxlKSB7XG4gICAgTGluZUNhcFN0eWxlW0xpbmVDYXBTdHlsZVtcIkJ1dHRcIl0gPSAwXSA9IFwiQnV0dFwiO1xuICAgIExpbmVDYXBTdHlsZVtMaW5lQ2FwU3R5bGVbXCJSb3VuZFwiXSA9IDFdID0gXCJSb3VuZFwiO1xuICAgIExpbmVDYXBTdHlsZVtMaW5lQ2FwU3R5bGVbXCJQcm9qZWN0aW5nXCJdID0gMl0gPSBcIlByb2plY3RpbmdcIjtcbn0pKExpbmVDYXBTdHlsZSB8fCAoTGluZUNhcFN0eWxlID0ge30pKTtcbmV4cG9ydCB2YXIgc2V0TGluZUNhcCA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0TGluZUNhcFN0eWxlLCBbYXNQREZOdW1iZXIoc3R5bGUpXSk7XG59O1xuZXhwb3J0IHZhciBMaW5lSm9pblN0eWxlO1xuKGZ1bmN0aW9uIChMaW5lSm9pblN0eWxlKSB7XG4gICAgTGluZUpvaW5TdHlsZVtMaW5lSm9pblN0eWxlW1wiTWl0ZXJcIl0gPSAwXSA9IFwiTWl0ZXJcIjtcbiAgICBMaW5lSm9pblN0eWxlW0xpbmVKb2luU3R5bGVbXCJSb3VuZFwiXSA9IDFdID0gXCJSb3VuZFwiO1xuICAgIExpbmVKb2luU3R5bGVbTGluZUpvaW5TdHlsZVtcIkJldmVsXCJdID0gMl0gPSBcIkJldmVsXCI7XG59KShMaW5lSm9pblN0eWxlIHx8IChMaW5lSm9pblN0eWxlID0ge30pKTtcbmV4cG9ydCB2YXIgc2V0TGluZUpvaW4gPSBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldExpbmVKb2luU3R5bGUsIFthc1BERk51bWJlcihzdHlsZSldKTtcbn07XG5leHBvcnQgdmFyIHNldEdyYXBoaWNzU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldEdyYXBoaWNzU3RhdGVQYXJhbXMsIFthc1BERk5hbWUoc3RhdGUpXSk7XG59O1xuZXhwb3J0IHZhciBwdXNoR3JhcGhpY3NTdGF0ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5QdXNoR3JhcGhpY3NTdGF0ZSk7IH07XG5leHBvcnQgdmFyIHBvcEdyYXBoaWNzU3RhdGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuUG9wR3JhcGhpY3NTdGF0ZSk7IH07XG5leHBvcnQgdmFyIHNldExpbmVXaWR0aCA9IGZ1bmN0aW9uICh3aWR0aCkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0TGluZVdpZHRoLCBbYXNQREZOdW1iZXIod2lkdGgpXSk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT0gUGF0aCBDb25zdHJ1Y3Rpb24gT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIGFwcGVuZEJlemllckN1cnZlID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkFwcGVuZEJlemllckN1cnZlLCBbXG4gICAgICAgIGFzUERGTnVtYmVyKHgxKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeTEpLFxuICAgICAgICBhc1BERk51bWJlcih4MiksXG4gICAgICAgIGFzUERGTnVtYmVyKHkyKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeDMpLFxuICAgICAgICBhc1BERk51bWJlcih5MyksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBhcHBlbmRRdWFkcmF0aWNDdXJ2ZSA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5Mikge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQ3VydmVUb1JlcGxpY2F0ZUluaXRpYWxQb2ludCwgW1xuICAgICAgICBhc1BERk51bWJlcih4MSksXG4gICAgICAgIGFzUERGTnVtYmVyKHkxKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeDIpLFxuICAgICAgICBhc1BERk51bWJlcih5MiksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBjbG9zZVBhdGggPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQ2xvc2VQYXRoKTsgfTtcbmV4cG9ydCB2YXIgbW92ZVRvID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLk1vdmVUbywgW2FzUERGTnVtYmVyKHhQb3MpLCBhc1BERk51bWJlcih5UG9zKV0pO1xufTtcbmV4cG9ydCB2YXIgbGluZVRvID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkxpbmVUbywgW2FzUERGTnVtYmVyKHhQb3MpLCBhc1BERk51bWJlcih5UG9zKV0pO1xufTtcbi8qKlxuICogQHBhcmFtIHhQb3MgeCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZVxuICogQHBhcmFtIHlQb3MgeSBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZVxuICogQHBhcmFtIHdpZHRoIHdpZHRoIG9mIHRoZSByZWN0YW5nbGVcbiAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGVcbiAqL1xuZXhwb3J0IHZhciByZWN0YW5nbGUgPSBmdW5jdGlvbiAoeFBvcywgeVBvcywgd2lkdGgsIGhlaWdodCkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQXBwZW5kUmVjdGFuZ2xlLCBbXG4gICAgICAgIGFzUERGTnVtYmVyKHhQb3MpLFxuICAgICAgICBhc1BERk51bWJlcih5UG9zKSxcbiAgICAgICAgYXNQREZOdW1iZXIod2lkdGgpLFxuICAgICAgICBhc1BERk51bWJlcihoZWlnaHQpLFxuICAgIF0pO1xufTtcbi8qKlxuICogQHBhcmFtIHhQb3MgeCBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNxdWFyZVxuICogQHBhcmFtIHlQb3MgeSBjb29yZGluYXRlIGZvciB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNxdWFyZVxuICogQHBhcmFtIHNpemUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgc3F1YXJlXG4gKi9cbmV4cG9ydCB2YXIgc3F1YXJlID0gZnVuY3Rpb24gKHhQb3MsIHlQb3MsIHNpemUpIHtcbiAgICByZXR1cm4gcmVjdGFuZ2xlKHhQb3MsIHlQb3MsIHNpemUsIHNpemUpO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IFBhdGggUGFpbnRpbmcgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIHN0cm9rZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TdHJva2VQYXRoKTsgfTtcbmV4cG9ydCB2YXIgZmlsbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5GaWxsTm9uWmVybyk7IH07XG5leHBvcnQgdmFyIGZpbGxBbmRTdHJva2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuRmlsbE5vblplcm9BbmRTdHJva2UpOyB9O1xuZXhwb3J0IHZhciBlbmRQYXRoID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkVuZFBhdGgpOyB9O1xuLyogPT09PT09PT09PT09PT09PT09PT0gVGV4dCBQb3NpdGlvbmluZyBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgbmV4dExpbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuTmV4dExpbmUpOyB9O1xuZXhwb3J0IHZhciBtb3ZlVGV4dCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Nb3ZlVGV4dCwgW2FzUERGTnVtYmVyKHgpLCBhc1BERk51bWJlcih5KV0pO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IFRleHQgU2hvd2luZyBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgc2hvd1RleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2hvd1RleHQsIFt0ZXh0XSk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT0gVGV4dCBTdGF0ZSBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgYmVnaW5UZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkJlZ2luVGV4dCk7IH07XG5leHBvcnQgdmFyIGVuZFRleHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuRW5kVGV4dCk7IH07XG5leHBvcnQgdmFyIHNldEZvbnRBbmRTaXplID0gZnVuY3Rpb24gKG5hbWUsIHNpemUpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRGb250QW5kU2l6ZSwgW2FzUERGTmFtZShuYW1lKSwgYXNQREZOdW1iZXIoc2l6ZSldKTsgfTtcbmV4cG9ydCB2YXIgc2V0Q2hhcmFjdGVyU3BhY2luZyA9IGZ1bmN0aW9uIChzcGFjaW5nKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRDaGFyYWN0ZXJTcGFjaW5nLCBbYXNQREZOdW1iZXIoc3BhY2luZyldKTtcbn07XG5leHBvcnQgdmFyIHNldFdvcmRTcGFjaW5nID0gZnVuY3Rpb24gKHNwYWNpbmcpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldFdvcmRTcGFjaW5nLCBbYXNQREZOdW1iZXIoc3BhY2luZyldKTtcbn07XG4vKiogQHBhcmFtIHNxdWVlemUgaG9yaXpvbnRhbCBjaGFyYWN0ZXIgc3BhY2luZyAqL1xuZXhwb3J0IHZhciBzZXRDaGFyYWN0ZXJTcXVlZXplID0gZnVuY3Rpb24gKHNxdWVlemUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldFRleHRIb3Jpem9udGFsU2NhbGluZywgW2FzUERGTnVtYmVyKHNxdWVlemUpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRMaW5lSGVpZ2h0ID0gZnVuY3Rpb24gKGxpbmVIZWlnaHQpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldFRleHRMaW5lSGVpZ2h0LCBbYXNQREZOdW1iZXIobGluZUhlaWdodCldKTtcbn07XG5leHBvcnQgdmFyIHNldFRleHRSaXNlID0gZnVuY3Rpb24gKHJpc2UpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldFRleHRSaXNlLCBbYXNQREZOdW1iZXIocmlzZSldKTtcbn07XG5leHBvcnQgdmFyIFRleHRSZW5kZXJpbmdNb2RlO1xuKGZ1bmN0aW9uIChUZXh0UmVuZGVyaW5nTW9kZSkge1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiRmlsbFwiXSA9IDBdID0gXCJGaWxsXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJPdXRsaW5lXCJdID0gMV0gPSBcIk91dGxpbmVcIjtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIkZpbGxBbmRPdXRsaW5lXCJdID0gMl0gPSBcIkZpbGxBbmRPdXRsaW5lXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJJbnZpc2libGVcIl0gPSAzXSA9IFwiSW52aXNpYmxlXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJGaWxsQW5kQ2xpcFwiXSA9IDRdID0gXCJGaWxsQW5kQ2xpcFwiO1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiT3V0bGluZUFuZENsaXBcIl0gPSA1XSA9IFwiT3V0bGluZUFuZENsaXBcIjtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIkZpbGxBbmRPdXRsaW5lQW5kQ2xpcFwiXSA9IDZdID0gXCJGaWxsQW5kT3V0bGluZUFuZENsaXBcIjtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIkNsaXBcIl0gPSA3XSA9IFwiQ2xpcFwiO1xufSkoVGV4dFJlbmRlcmluZ01vZGUgfHwgKFRleHRSZW5kZXJpbmdNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgc2V0VGV4dFJlbmRlcmluZ01vZGUgPSBmdW5jdGlvbiAobW9kZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0VGV4dFJlbmRlcmluZ01vZGUsIFthc1BERk51bWJlcihtb2RlKV0pO1xufTtcbmV4cG9ydCB2YXIgc2V0VGV4dE1hdHJpeCA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRUZXh0TWF0cml4LCBbXG4gICAgICAgIGFzUERGTnVtYmVyKGEpLFxuICAgICAgICBhc1BERk51bWJlcihiKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYyksXG4gICAgICAgIGFzUERGTnVtYmVyKGQpLFxuICAgICAgICBhc1BERk51bWJlcihlKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZiksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciByb3RhdGVBbmRTa2V3VGV4dFJhZGlhbnNBbmRUcmFuc2xhdGUgPSBmdW5jdGlvbiAocm90YXRpb25BbmdsZSwgeFNrZXdBbmdsZSwgeVNrZXdBbmdsZSwgeCwgeSkge1xuICAgIHJldHVybiBzZXRUZXh0TWF0cml4KGNvcyhhc051bWJlcihyb3RhdGlvbkFuZ2xlKSksIHNpbihhc051bWJlcihyb3RhdGlvbkFuZ2xlKSkgKyB0YW4oYXNOdW1iZXIoeFNrZXdBbmdsZSkpLCAtc2luKGFzTnVtYmVyKHJvdGF0aW9uQW5nbGUpKSArIHRhbihhc051bWJlcih5U2tld0FuZ2xlKSksIGNvcyhhc051bWJlcihyb3RhdGlvbkFuZ2xlKSksIHgsIHkpO1xufTtcbmV4cG9ydCB2YXIgcm90YXRlQW5kU2tld1RleHREZWdyZWVzQW5kVHJhbnNsYXRlID0gZnVuY3Rpb24gKHJvdGF0aW9uQW5nbGUsIHhTa2V3QW5nbGUsIHlTa2V3QW5nbGUsIHgsIHkpIHtcbiAgICByZXR1cm4gcm90YXRlQW5kU2tld1RleHRSYWRpYW5zQW5kVHJhbnNsYXRlKGRlZ3JlZXNUb1JhZGlhbnMoYXNOdW1iZXIocm90YXRpb25BbmdsZSkpLCBkZWdyZWVzVG9SYWRpYW5zKGFzTnVtYmVyKHhTa2V3QW5nbGUpKSwgZGVncmVlc1RvUmFkaWFucyhhc051bWJlcih5U2tld0FuZ2xlKSksIHgsIHkpO1xufTtcbi8qID09PT09PT09PT09PT09PT09PT09IFhPYmplY3QgT3BlcmF0b3IgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgZHJhd09iamVjdCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5EcmF3T2JqZWN0LCBbYXNQREZOYW1lKG5hbWUpXSk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT0gQ29sb3IgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIHNldEZpbGxpbmdHcmF5c2NhbGVDb2xvciA9IGZ1bmN0aW9uIChncmF5KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Ob25TdHJva2luZ0NvbG9yR3JheSwgW2FzUERGTnVtYmVyKGdyYXkpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRTdHJva2luZ0dyYXlzY2FsZUNvbG9yID0gZnVuY3Rpb24gKGdyYXkpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlN0cm9raW5nQ29sb3JHcmF5LCBbYXNQREZOdW1iZXIoZ3JheSldKTtcbn07XG5leHBvcnQgdmFyIHNldEZpbGxpbmdSZ2JDb2xvciA9IGZ1bmN0aW9uIChyZWQsIGdyZWVuLCBibHVlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Ob25TdHJva2luZ0NvbG9yUmdiLCBbXG4gICAgICAgIGFzUERGTnVtYmVyKHJlZCksXG4gICAgICAgIGFzUERGTnVtYmVyKGdyZWVuKSxcbiAgICAgICAgYXNQREZOdW1iZXIoYmx1ZSksXG4gICAgXSk7XG59O1xuZXhwb3J0IHZhciBzZXRTdHJva2luZ1JnYkNvbG9yID0gZnVuY3Rpb24gKHJlZCwgZ3JlZW4sIGJsdWUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlN0cm9raW5nQ29sb3JSZ2IsIFtcbiAgICAgICAgYXNQREZOdW1iZXIocmVkKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZ3JlZW4pLFxuICAgICAgICBhc1BERk51bWJlcihibHVlKSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIHNldEZpbGxpbmdDbXlrQ29sb3IgPSBmdW5jdGlvbiAoY3lhbiwgbWFnZW50YSwgeWVsbG93LCBrZXkpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLk5vblN0cm9raW5nQ29sb3JDbXlrLCBbXG4gICAgICAgIGFzUERGTnVtYmVyKGN5YW4pLFxuICAgICAgICBhc1BERk51bWJlcihtYWdlbnRhKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeWVsbG93KSxcbiAgICAgICAgYXNQREZOdW1iZXIoa2V5KSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIHNldFN0cm9raW5nQ215a0NvbG9yID0gZnVuY3Rpb24gKGN5YW4sIG1hZ2VudGEsIHllbGxvdywga2V5KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TdHJva2luZ0NvbG9yQ215aywgW1xuICAgICAgICBhc1BERk51bWJlcihjeWFuKSxcbiAgICAgICAgYXNQREZOdW1iZXIobWFnZW50YSksXG4gICAgICAgIGFzUERGTnVtYmVyKHllbGxvdyksXG4gICAgICAgIGFzUERGTnVtYmVyKGtleSksXG4gICAgXSk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT0gTWFya2VkIENvbnRlbnQgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG5leHBvcnQgdmFyIGJlZ2luTWFya2VkQ29udGVudCA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkJlZ2luTWFya2VkQ29udGVudCwgW2FzUERGTmFtZSh0YWcpXSk7XG59O1xuZXhwb3J0IHZhciBlbmRNYXJrZWRDb250ZW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkVuZE1hcmtlZENvbnRlbnQpOyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3BlcmF0b3JzLmpzLm1hcCIsImltcG9ydCB7IGFzc2VydElzLCBlcnJvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuZXhwb3J0IHZhciBSb3RhdGlvblR5cGVzO1xuKGZ1bmN0aW9uIChSb3RhdGlvblR5cGVzKSB7XG4gICAgUm90YXRpb25UeXBlc1tcIkRlZ3JlZXNcIl0gPSBcImRlZ3JlZXNcIjtcbiAgICBSb3RhdGlvblR5cGVzW1wiUmFkaWFuc1wiXSA9IFwicmFkaWFuc1wiO1xufSkoUm90YXRpb25UeXBlcyB8fCAoUm90YXRpb25UeXBlcyA9IHt9KSk7XG5leHBvcnQgdmFyIHJhZGlhbnMgPSBmdW5jdGlvbiAocmFkaWFuQW5nbGUpIHtcbiAgICBhc3NlcnRJcyhyYWRpYW5BbmdsZSwgJ3JhZGlhbkFuZ2xlJywgWydudW1iZXInXSk7XG4gICAgcmV0dXJuIHsgdHlwZTogUm90YXRpb25UeXBlcy5SYWRpYW5zLCBhbmdsZTogcmFkaWFuQW5nbGUgfTtcbn07XG5leHBvcnQgdmFyIGRlZ3JlZXMgPSBmdW5jdGlvbiAoZGVncmVlQW5nbGUpIHtcbiAgICBhc3NlcnRJcyhkZWdyZWVBbmdsZSwgJ2RlZ3JlZUFuZ2xlJywgWydudW1iZXInXSk7XG4gICAgcmV0dXJuIHsgdHlwZTogUm90YXRpb25UeXBlcy5EZWdyZWVzLCBhbmdsZTogZGVncmVlQW5nbGUgfTtcbn07XG52YXIgUmFkaWFucyA9IFJvdGF0aW9uVHlwZXMuUmFkaWFucywgRGVncmVlcyA9IFJvdGF0aW9uVHlwZXMuRGVncmVlcztcbmV4cG9ydCB2YXIgZGVncmVlc1RvUmFkaWFucyA9IGZ1bmN0aW9uIChkZWdyZWUpIHsgcmV0dXJuIChkZWdyZWUgKiBNYXRoLlBJKSAvIDE4MDsgfTtcbmV4cG9ydCB2YXIgcmFkaWFuc1RvRGVncmVlcyA9IGZ1bmN0aW9uIChyYWRpYW4pIHsgcmV0dXJuIChyYWRpYW4gKiAxODApIC8gTWF0aC5QSTsgfTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciB0b1JhZGlhbnMgPSBmdW5jdGlvbiAocm90YXRpb24pIHtcbiAgICByZXR1cm4gcm90YXRpb24udHlwZSA9PT0gUmFkaWFucyA/IHJvdGF0aW9uLmFuZ2xlXG4gICAgICAgIDogcm90YXRpb24udHlwZSA9PT0gRGVncmVlcyA/IGRlZ3JlZXNUb1JhZGlhbnMocm90YXRpb24uYW5nbGUpXG4gICAgICAgICAgICA6IGVycm9yKFwiSW52YWxpZCByb3RhdGlvbjogXCIgKyBKU09OLnN0cmluZ2lmeShyb3RhdGlvbikpO1xufTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0IHZhciB0b0RlZ3JlZXMgPSBmdW5jdGlvbiAocm90YXRpb24pIHtcbiAgICByZXR1cm4gcm90YXRpb24udHlwZSA9PT0gUmFkaWFucyA/IHJhZGlhbnNUb0RlZ3JlZXMocm90YXRpb24uYW5nbGUpXG4gICAgICAgIDogcm90YXRpb24udHlwZSA9PT0gRGVncmVlcyA/IHJvdGF0aW9uLmFuZ2xlXG4gICAgICAgICAgICA6IGVycm9yKFwiSW52YWxpZCByb3RhdGlvbjogXCIgKyBKU09OLnN0cmluZ2lmeShyb3RhdGlvbikpO1xufTtcbmV4cG9ydCB2YXIgcmVkdWNlUm90YXRpb24gPSBmdW5jdGlvbiAoZGVncmVlQW5nbGUpIHtcbiAgICBpZiAoZGVncmVlQW5nbGUgPT09IHZvaWQgMCkgeyBkZWdyZWVBbmdsZSA9IDA7IH1cbiAgICB2YXIgcXVhZHJhbnRzID0gKGRlZ3JlZUFuZ2xlIC8gOTApICUgNDtcbiAgICBpZiAocXVhZHJhbnRzID09PSAwKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBpZiAocXVhZHJhbnRzID09PSAxKVxuICAgICAgICByZXR1cm4gOTA7XG4gICAgaWYgKHF1YWRyYW50cyA9PT0gMilcbiAgICAgICAgcmV0dXJuIDE4MDtcbiAgICBpZiAocXVhZHJhbnRzID09PSAzKVxuICAgICAgICByZXR1cm4gMjcwO1xuICAgIHJldHVybiAwOyAvLyBgZGVncmVlQW5nbGVgIGlzIG5vdCBhIG11bHRpcGxlIG9mIDkwXG59O1xuZXhwb3J0IHZhciBhZGp1c3REaW1zRm9yUm90YXRpb24gPSBmdW5jdGlvbiAoZGltcywgZGVncmVlQW5nbGUpIHtcbiAgICBpZiAoZGVncmVlQW5nbGUgPT09IHZvaWQgMCkgeyBkZWdyZWVBbmdsZSA9IDA7IH1cbiAgICB2YXIgcm90YXRpb24gPSByZWR1Y2VSb3RhdGlvbihkZWdyZWVBbmdsZSk7XG4gICAgcmV0dXJuIHJvdGF0aW9uID09PSA5MCB8fCByb3RhdGlvbiA9PT0gMjcwXG4gICAgICAgID8geyB3aWR0aDogZGltcy5oZWlnaHQsIGhlaWdodDogZGltcy53aWR0aCB9XG4gICAgICAgIDogeyB3aWR0aDogZGltcy53aWR0aCwgaGVpZ2h0OiBkaW1zLmhlaWdodCB9O1xufTtcbmV4cG9ydCB2YXIgcm90YXRlUmVjdGFuZ2xlID0gZnVuY3Rpb24gKHJlY3RhbmdsZSwgYm9yZGVyV2lkdGgsIGRlZ3JlZUFuZ2xlKSB7XG4gICAgaWYgKGJvcmRlcldpZHRoID09PSB2b2lkIDApIHsgYm9yZGVyV2lkdGggPSAwOyB9XG4gICAgaWYgKGRlZ3JlZUFuZ2xlID09PSB2b2lkIDApIHsgZGVncmVlQW5nbGUgPSAwOyB9XG4gICAgdmFyIHggPSByZWN0YW5nbGUueCwgeSA9IHJlY3RhbmdsZS55LCB3ID0gcmVjdGFuZ2xlLndpZHRoLCBoID0gcmVjdGFuZ2xlLmhlaWdodDtcbiAgICB2YXIgciA9IHJlZHVjZVJvdGF0aW9uKGRlZ3JlZUFuZ2xlKTtcbiAgICB2YXIgYiA9IGJvcmRlcldpZHRoIC8gMjtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBpZiAociA9PT0gMClcbiAgICAgICAgcmV0dXJuIHsgeDogeCAtIGIsIHk6IHkgLSBiLCB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG4gICAgZWxzZSBpZiAociA9PT0gOTApXG4gICAgICAgIHJldHVybiB7IHg6IHggLSBoICsgYiwgeTogeSAtIGIsIHdpZHRoOiBoLCBoZWlnaHQ6IHcgfTtcbiAgICBlbHNlIGlmIChyID09PSAxODApXG4gICAgICAgIHJldHVybiB7IHg6IHggLSB3ICsgYiwgeTogeSAtIGggKyBiLCB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG4gICAgZWxzZSBpZiAociA9PT0gMjcwKVxuICAgICAgICByZXR1cm4geyB4OiB4IC0gYiwgeTogeSAtIHcgKyBiLCB3aWR0aDogaCwgaGVpZ2h0OiB3IH07XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4geyB4OiB4IC0gYiwgeTogeSAtIGIsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yb3RhdGlvbnMuanMubWFwIiwiZXhwb3J0IHZhciBQYWdlU2l6ZXMgPSB7XG4gICAgJzRBMCc6IFs0NzY3Ljg3LCA2NzQwLjc5XSxcbiAgICAnMkEwJzogWzMzNzAuMzksIDQ3NjcuODddLFxuICAgIEEwOiBbMjM4My45NCwgMzM3MC4zOV0sXG4gICAgQTE6IFsxNjgzLjc4LCAyMzgzLjk0XSxcbiAgICBBMjogWzExOTAuNTUsIDE2ODMuNzhdLFxuICAgIEEzOiBbODQxLjg5LCAxMTkwLjU1XSxcbiAgICBBNDogWzU5NS4yOCwgODQxLjg5XSxcbiAgICBBNTogWzQxOS41MywgNTk1LjI4XSxcbiAgICBBNjogWzI5Ny42NCwgNDE5LjUzXSxcbiAgICBBNzogWzIwOS43NiwgMjk3LjY0XSxcbiAgICBBODogWzE0Ny40LCAyMDkuNzZdLFxuICAgIEE5OiBbMTA0Ljg4LCAxNDcuNF0sXG4gICAgQTEwOiBbNzMuNywgMTA0Ljg4XSxcbiAgICBCMDogWzI4MzQuNjUsIDQwMDguMTldLFxuICAgIEIxOiBbMjAwNC4wOSwgMjgzNC42NV0sXG4gICAgQjI6IFsxNDE3LjMyLCAyMDA0LjA5XSxcbiAgICBCMzogWzEwMDAuNjMsIDE0MTcuMzJdLFxuICAgIEI0OiBbNzA4LjY2LCAxMDAwLjYzXSxcbiAgICBCNTogWzQ5OC45LCA3MDguNjZdLFxuICAgIEI2OiBbMzU0LjMzLCA0OTguOV0sXG4gICAgQjc6IFsyNDkuNDUsIDM1NC4zM10sXG4gICAgQjg6IFsxNzUuNzUsIDI0OS40NV0sXG4gICAgQjk6IFsxMjQuNzIsIDE3NS43NV0sXG4gICAgQjEwOiBbODcuODcsIDEyNC43Ml0sXG4gICAgQzA6IFsyNTk5LjM3LCAzNjc2LjU0XSxcbiAgICBDMTogWzE4MzYuODUsIDI1OTkuMzddLFxuICAgIEMyOiBbMTI5OC4yNywgMTgzNi44NV0sXG4gICAgQzM6IFs5MTguNDMsIDEyOTguMjddLFxuICAgIEM0OiBbNjQ5LjEzLCA5MTguNDNdLFxuICAgIEM1OiBbNDU5LjIxLCA2NDkuMTNdLFxuICAgIEM2OiBbMzIzLjE1LCA0NTkuMjFdLFxuICAgIEM3OiBbMjI5LjYxLCAzMjMuMTVdLFxuICAgIEM4OiBbMTYxLjU3LCAyMjkuNjFdLFxuICAgIEM5OiBbMTEzLjM5LCAxNjEuNTddLFxuICAgIEMxMDogWzc5LjM3LCAxMTMuMzldLFxuICAgIFJBMDogWzI0MzcuOCwgMzQ1OC4yN10sXG4gICAgUkExOiBbMTcyOS4xMywgMjQzNy44XSxcbiAgICBSQTI6IFsxMjE4LjksIDE3MjkuMTNdLFxuICAgIFJBMzogWzg2NC41NywgMTIxOC45XSxcbiAgICBSQTQ6IFs2MDkuNDUsIDg2NC41N10sXG4gICAgU1JBMDogWzI1NTEuMTgsIDM2MjguMzVdLFxuICAgIFNSQTE6IFsxODE0LjE3LCAyNTUxLjE4XSxcbiAgICBTUkEyOiBbMTI3NS41OSwgMTgxNC4xN10sXG4gICAgU1JBMzogWzkwNy4wOSwgMTI3NS41OV0sXG4gICAgU1JBNDogWzYzNy44LCA5MDcuMDldLFxuICAgIEV4ZWN1dGl2ZTogWzUyMS44NiwgNzU2LjBdLFxuICAgIEZvbGlvOiBbNjEyLjAsIDkzNi4wXSxcbiAgICBMZWdhbDogWzYxMi4wLCAxMDA4LjBdLFxuICAgIExldHRlcjogWzYxMi4wLCA3OTIuMF0sXG4gICAgVGFibG9pZDogWzc5Mi4wLCAxMjI0LjBdLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpemVzLmpzLm1hcCIsIi8vIE9yaWdpbmF0ZWQgZnJvbSBwZGZraXQgQ29weXJpZ2h0IChjKSAyMDE0IERldm9uIEdvdmV0dFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0L2Jsb2IvMWU2MmU2ZmZlMjRiMzc4ZWI4OTBkZjUwN2E0NzYxMGY0YzRhN2IyNC9saWIvcGF0aC5qc1xuLy8gTUlUIExJQ0VOU0Vcbi8vIFVwZGF0ZWQgZm9yIHBkZi1saWIgJiBUeXBlU2NyaXB0IGJ5IEplcmVteSBNZXNzZW5nZXJcbmltcG9ydCB7IGFwcGVuZEJlemllckN1cnZlLCBhcHBlbmRRdWFkcmF0aWNDdXJ2ZSwgY2xvc2VQYXRoLCBsaW5lVG8sIG1vdmVUbywgfSBmcm9tIFwiLi9vcGVyYXRvcnNcIjtcbnZhciBjeCA9IDA7XG52YXIgY3kgPSAwO1xudmFyIHB4ID0gMDtcbnZhciBweSA9IDA7XG52YXIgc3ggPSAwO1xudmFyIHN5ID0gMDtcbnZhciBwYXJhbWV0ZXJzID0gbmV3IE1hcChbXG4gICAgWydBJywgN10sXG4gICAgWydhJywgN10sXG4gICAgWydDJywgNl0sXG4gICAgWydjJywgNl0sXG4gICAgWydIJywgMV0sXG4gICAgWydoJywgMV0sXG4gICAgWydMJywgMl0sXG4gICAgWydsJywgMl0sXG4gICAgWydNJywgMl0sXG4gICAgWydtJywgMl0sXG4gICAgWydRJywgNF0sXG4gICAgWydxJywgNF0sXG4gICAgWydTJywgNF0sXG4gICAgWydzJywgNF0sXG4gICAgWydUJywgMl0sXG4gICAgWyd0JywgMl0sXG4gICAgWydWJywgMV0sXG4gICAgWyd2JywgMV0sXG4gICAgWydaJywgMF0sXG4gICAgWyd6JywgMF0sXG5dKTtcbnZhciBwYXJzZSA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgdmFyIGNtZDtcbiAgICB2YXIgcmV0ID0gW107XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgY3VyQXJnID0gJyc7XG4gICAgdmFyIGZvdW5kRGVjaW1hbCA9IGZhbHNlO1xuICAgIHZhciBwYXJhbXMgPSAwO1xuICAgIGZvciAodmFyIF9pID0gMCwgcGF0aF8xID0gcGF0aDsgX2kgPCBwYXRoXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBjID0gcGF0aF8xW19pXTtcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuaGFzKGMpKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBwYXJhbWV0ZXJzLmdldChjKTtcbiAgICAgICAgICAgIGlmIChjbWQpIHtcbiAgICAgICAgICAgICAgICAvLyBzYXZlIGV4aXN0aW5nIGNvbW1hbmRcbiAgICAgICAgICAgICAgICBpZiAoY3VyQXJnLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aF0gPSArY3VyQXJnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXRbcmV0Lmxlbmd0aF0gPSB7IGNtZDogY21kLCBhcmdzOiBhcmdzIH07XG4gICAgICAgICAgICAgICAgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIGN1ckFyZyA9ICcnO1xuICAgICAgICAgICAgICAgIGZvdW5kRGVjaW1hbCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY21kID0gYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChbJyAnLCAnLCddLmluY2x1ZGVzKGMpIHx8XG4gICAgICAgICAgICAoYyA9PT0gJy0nICYmIGN1ckFyZy5sZW5ndGggPiAwICYmIGN1ckFyZ1tjdXJBcmcubGVuZ3RoIC0gMV0gIT09ICdlJykgfHxcbiAgICAgICAgICAgIChjID09PSAnLicgJiYgZm91bmREZWNpbWFsKSkge1xuICAgICAgICAgICAgaWYgKGN1ckFyZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gcGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIHJldXNlZCBjb21tYW5kc1xuICAgICAgICAgICAgICAgIHJldFtyZXQubGVuZ3RoXSA9IHsgY21kOiBjbWQsIGFyZ3M6IGFyZ3MgfTtcbiAgICAgICAgICAgICAgICBhcmdzID0gWytjdXJBcmddO1xuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhc3N1bWVkIGNvbW1hbmRzXG4gICAgICAgICAgICAgICAgaWYgKGNtZCA9PT0gJ00nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCA9ICdMJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNtZCA9PT0gJ20nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCA9ICdsJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcmdzW2FyZ3MubGVuZ3RoXSA9ICtjdXJBcmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3VuZERlY2ltYWwgPSBjID09PSAnLic7XG4gICAgICAgICAgICAvLyBmaXggZm9yIG5lZ2F0aXZlIG51bWJlcnMgb3IgcmVwZWF0ZWQgZGVjaW1hbHMgd2l0aCBubyBkZWxpbWV0ZXIgYmV0d2VlbiBjb21tYW5kc1xuICAgICAgICAgICAgY3VyQXJnID0gWyctJywgJy4nXS5pbmNsdWRlcyhjKSA/IGMgOiAnJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1ckFyZyArPSBjO1xuICAgICAgICAgICAgaWYgKGMgPT09ICcuJykge1xuICAgICAgICAgICAgICAgIGZvdW5kRGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYWRkIHRoZSBsYXN0IGNvbW1hbmRcbiAgICBpZiAoY3VyQXJnLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSBwYXJhbXMpIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSByZXVzZWQgY29tbWFuZHNcbiAgICAgICAgICAgIHJldFtyZXQubGVuZ3RoXSA9IHsgY21kOiBjbWQsIGFyZ3M6IGFyZ3MgfTtcbiAgICAgICAgICAgIGFyZ3MgPSBbK2N1ckFyZ107XG4gICAgICAgICAgICAvLyBoYW5kbGUgYXNzdW1lZCBjb21tYW5kc1xuICAgICAgICAgICAgaWYgKGNtZCA9PT0gJ00nKSB7XG4gICAgICAgICAgICAgICAgY21kID0gJ0wnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNtZCA9PT0gJ20nKSB7XG4gICAgICAgICAgICAgICAgY21kID0gJ2wnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aF0gPSArY3VyQXJnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldFtyZXQubGVuZ3RoXSA9IHsgY21kOiBjbWQsIGFyZ3M6IGFyZ3MgfTtcbiAgICByZXR1cm4gcmV0O1xufTtcbnZhciBhcHBseSA9IGZ1bmN0aW9uIChjb21tYW5kcykge1xuICAgIC8vIGN1cnJlbnQgcG9pbnQsIGNvbnRyb2wgcG9pbnQsIGFuZCBzdWJwYXRoIHN0YXJ0aW5nIHBvaW50XG4gICAgY3ggPSBjeSA9IHB4ID0gcHkgPSBzeCA9IHN5ID0gMDtcbiAgICAvLyBydW4gdGhlIGNvbW1hbmRzXG4gICAgdmFyIGNtZHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjID0gY29tbWFuZHNbaV07XG4gICAgICAgIGlmIChjLmNtZCAmJiB0eXBlb2YgcnVubmVyc1tjLmNtZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBjbWQgPSBydW5uZXJzW2MuY21kXShjLmFyZ3MpO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY21kKSkge1xuICAgICAgICAgICAgICAgIGNtZHMgPSBjbWRzLmNvbmNhdChjbWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY21kcy5wdXNoKGNtZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNtZHM7XG59O1xudmFyIHJ1bm5lcnMgPSB7XG4gICAgTTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggPSBhWzBdO1xuICAgICAgICBjeSA9IGFbMV07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICBzeCA9IGN4O1xuICAgICAgICBzeSA9IGN5O1xuICAgICAgICByZXR1cm4gbW92ZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBtOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCArPSBhWzBdO1xuICAgICAgICBjeSArPSBhWzFdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgc3ggPSBjeDtcbiAgICAgICAgc3kgPSBjeTtcbiAgICAgICAgcmV0dXJuIG1vdmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgQzogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggPSBhWzRdO1xuICAgICAgICBjeSA9IGFbNV07XG4gICAgICAgIHB4ID0gYVsyXTtcbiAgICAgICAgcHkgPSBhWzNdO1xuICAgICAgICByZXR1cm4gYXBwZW5kQmV6aWVyQ3VydmUoYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XSk7XG4gICAgfSxcbiAgICBjOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgY21kID0gYXBwZW5kQmV6aWVyQ3VydmUoYVswXSArIGN4LCBhWzFdICsgY3ksIGFbMl0gKyBjeCwgYVszXSArIGN5LCBhWzRdICsgY3gsIGFbNV0gKyBjeSk7XG4gICAgICAgIHB4ID0gY3ggKyBhWzJdO1xuICAgICAgICBweSA9IGN5ICsgYVszXTtcbiAgICAgICAgY3ggKz0gYVs0XTtcbiAgICAgICAgY3kgKz0gYVs1XTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIFM6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGlmIChweCA9PT0gbnVsbCB8fCBweSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHggPSBjeDtcbiAgICAgICAgICAgIHB5ID0gY3k7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNtZCA9IGFwcGVuZEJlemllckN1cnZlKGN4IC0gKHB4IC0gY3gpLCBjeSAtIChweSAtIGN5KSwgYVswXSwgYVsxXSwgYVsyXSwgYVszXSk7XG4gICAgICAgIHB4ID0gYVswXTtcbiAgICAgICAgcHkgPSBhWzFdO1xuICAgICAgICBjeCA9IGFbMl07XG4gICAgICAgIGN5ID0gYVszXTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIHM6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGlmIChweCA9PT0gbnVsbCB8fCBweSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHggPSBjeDtcbiAgICAgICAgICAgIHB5ID0gY3k7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNtZCA9IGFwcGVuZEJlemllckN1cnZlKGN4IC0gKHB4IC0gY3gpLCBjeSAtIChweSAtIGN5KSwgY3ggKyBhWzBdLCBjeSArIGFbMV0sIGN4ICsgYVsyXSwgY3kgKyBhWzNdKTtcbiAgICAgICAgcHggPSBjeCArIGFbMF07XG4gICAgICAgIHB5ID0gY3kgKyBhWzFdO1xuICAgICAgICBjeCArPSBhWzJdO1xuICAgICAgICBjeSArPSBhWzNdO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG4gICAgUTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcHggPSBhWzBdO1xuICAgICAgICBweSA9IGFbMV07XG4gICAgICAgIGN4ID0gYVsyXTtcbiAgICAgICAgY3kgPSBhWzNdO1xuICAgICAgICByZXR1cm4gYXBwZW5kUXVhZHJhdGljQ3VydmUoYVswXSwgYVsxXSwgY3gsIGN5KTtcbiAgICB9LFxuICAgIHE6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciBjbWQgPSBhcHBlbmRRdWFkcmF0aWNDdXJ2ZShhWzBdICsgY3gsIGFbMV0gKyBjeSwgYVsyXSArIGN4LCBhWzNdICsgY3kpO1xuICAgICAgICBweCA9IGN4ICsgYVswXTtcbiAgICAgICAgcHkgPSBjeSArIGFbMV07XG4gICAgICAgIGN4ICs9IGFbMl07XG4gICAgICAgIGN5ICs9IGFbM107XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbiAgICBUOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBpZiAocHggPT09IG51bGwgfHwgcHkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHB4ID0gY3g7XG4gICAgICAgICAgICBweSA9IGN5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHggPSBjeCAtIChweCAtIGN4KTtcbiAgICAgICAgICAgIHB5ID0gY3kgLSAocHkgLSBjeSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNtZCA9IGFwcGVuZFF1YWRyYXRpY0N1cnZlKHB4LCBweSwgYVswXSwgYVsxXSk7XG4gICAgICAgIHB4ID0gY3ggLSAocHggLSBjeCk7XG4gICAgICAgIHB5ID0gY3kgLSAocHkgLSBjeSk7XG4gICAgICAgIGN4ID0gYVswXTtcbiAgICAgICAgY3kgPSBhWzFdO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG4gICAgdDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgaWYgKHB4ID09PSBudWxsIHx8IHB5ID09PSBudWxsKSB7XG4gICAgICAgICAgICBweCA9IGN4O1xuICAgICAgICAgICAgcHkgPSBjeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHB4ID0gY3ggLSAocHggLSBjeCk7XG4gICAgICAgICAgICBweSA9IGN5IC0gKHB5IC0gY3kpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbWQgPSBhcHBlbmRRdWFkcmF0aWNDdXJ2ZShweCwgcHksIGN4ICsgYVswXSwgY3kgKyBhWzFdKTtcbiAgICAgICAgY3ggKz0gYVswXTtcbiAgICAgICAgY3kgKz0gYVsxXTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIEE6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciBjbWRzID0gc29sdmVBcmMoY3gsIGN5LCBhKTtcbiAgICAgICAgY3ggPSBhWzVdO1xuICAgICAgICBjeSA9IGFbNl07XG4gICAgICAgIHJldHVybiBjbWRzO1xuICAgIH0sXG4gICAgYTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgYVs1XSArPSBjeDtcbiAgICAgICAgYVs2XSArPSBjeTtcbiAgICAgICAgdmFyIGNtZHMgPSBzb2x2ZUFyYyhjeCwgY3ksIGEpO1xuICAgICAgICBjeCA9IGFbNV07XG4gICAgICAgIGN5ID0gYVs2XTtcbiAgICAgICAgcmV0dXJuIGNtZHM7XG4gICAgfSxcbiAgICBMOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCA9IGFbMF07XG4gICAgICAgIGN5ID0gYVsxXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHJldHVybiBsaW5lVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIGw6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN4ICs9IGFbMF07XG4gICAgICAgIGN5ICs9IGFbMV07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICByZXR1cm4gbGluZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBIOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCA9IGFbMF07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICByZXR1cm4gbGluZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBoOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCArPSBhWzBdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxpbmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgVjogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3kgPSBhWzBdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxpbmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgdjogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3kgKz0gYVswXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHJldHVybiBsaW5lVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIFo6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNtZCA9IGNsb3NlUGF0aCgpO1xuICAgICAgICBjeCA9IHN4O1xuICAgICAgICBjeSA9IHN5O1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG4gICAgejogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY21kID0gY2xvc2VQYXRoKCk7XG4gICAgICAgIGN4ID0gc3g7XG4gICAgICAgIGN5ID0gc3k7XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbn07XG52YXIgc29sdmVBcmMgPSBmdW5jdGlvbiAoeCwgeSwgY29vcmRzKSB7XG4gICAgdmFyIHJ4ID0gY29vcmRzWzBdLCByeSA9IGNvb3Jkc1sxXSwgcm90ID0gY29vcmRzWzJdLCBsYXJnZSA9IGNvb3Jkc1szXSwgc3dlZXAgPSBjb29yZHNbNF0sIGV4ID0gY29vcmRzWzVdLCBleSA9IGNvb3Jkc1s2XTtcbiAgICB2YXIgc2VncyA9IGFyY1RvU2VnbWVudHMoZXgsIGV5LCByeCwgcnksIGxhcmdlLCBzd2VlcCwgcm90LCB4LCB5KTtcbiAgICB2YXIgY21kcyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMCwgc2Vnc18xID0gc2VnczsgX2kgPCBzZWdzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBzZWcgPSBzZWdzXzFbX2ldO1xuICAgICAgICB2YXIgYmV6ID0gc2VnbWVudFRvQmV6aWVyLmFwcGx5KHZvaWQgMCwgc2VnKTtcbiAgICAgICAgY21kcy5wdXNoKGFwcGVuZEJlemllckN1cnZlLmFwcGx5KHZvaWQgMCwgYmV6KSk7XG4gICAgfVxuICAgIHJldHVybiBjbWRzO1xufTtcbi8vIGZyb20gSW5rc2NhcGUgc3ZndG9wZGYsIHRoYW5rcyFcbnZhciBhcmNUb1NlZ21lbnRzID0gZnVuY3Rpb24gKHgsIHksIHJ4LCByeSwgbGFyZ2UsIHN3ZWVwLCByb3RhdGVYLCBveCwgb3kpIHtcbiAgICB2YXIgdGggPSByb3RhdGVYICogKE1hdGguUEkgLyAxODApO1xuICAgIHZhciBzaW5UaCA9IE1hdGguc2luKHRoKTtcbiAgICB2YXIgY29zVGggPSBNYXRoLmNvcyh0aCk7XG4gICAgcnggPSBNYXRoLmFicyhyeCk7XG4gICAgcnkgPSBNYXRoLmFicyhyeSk7XG4gICAgcHggPSBjb3NUaCAqIChveCAtIHgpICogMC41ICsgc2luVGggKiAob3kgLSB5KSAqIDAuNTtcbiAgICBweSA9IGNvc1RoICogKG95IC0geSkgKiAwLjUgLSBzaW5UaCAqIChveCAtIHgpICogMC41O1xuICAgIHZhciBwbCA9IChweCAqIHB4KSAvIChyeCAqIHJ4KSArIChweSAqIHB5KSAvIChyeSAqIHJ5KTtcbiAgICBpZiAocGwgPiAxKSB7XG4gICAgICAgIHBsID0gTWF0aC5zcXJ0KHBsKTtcbiAgICAgICAgcnggKj0gcGw7XG4gICAgICAgIHJ5ICo9IHBsO1xuICAgIH1cbiAgICB2YXIgYTAwID0gY29zVGggLyByeDtcbiAgICB2YXIgYTAxID0gc2luVGggLyByeDtcbiAgICB2YXIgYTEwID0gLXNpblRoIC8gcnk7XG4gICAgdmFyIGExMSA9IGNvc1RoIC8gcnk7XG4gICAgdmFyIHgwID0gYTAwICogb3ggKyBhMDEgKiBveTtcbiAgICB2YXIgeTAgPSBhMTAgKiBveCArIGExMSAqIG95O1xuICAgIHZhciB4MSA9IGEwMCAqIHggKyBhMDEgKiB5O1xuICAgIHZhciB5MSA9IGExMCAqIHggKyBhMTEgKiB5O1xuICAgIHZhciBkID0gKHgxIC0geDApICogKHgxIC0geDApICsgKHkxIC0geTApICogKHkxIC0geTApO1xuICAgIHZhciBzZmFjdG9yU3EgPSAxIC8gZCAtIDAuMjU7XG4gICAgaWYgKHNmYWN0b3JTcSA8IDApIHtcbiAgICAgICAgc2ZhY3RvclNxID0gMDtcbiAgICB9XG4gICAgdmFyIHNmYWN0b3IgPSBNYXRoLnNxcnQoc2ZhY3RvclNxKTtcbiAgICBpZiAoc3dlZXAgPT09IGxhcmdlKSB7XG4gICAgICAgIHNmYWN0b3IgPSAtc2ZhY3RvcjtcbiAgICB9XG4gICAgdmFyIHhjID0gMC41ICogKHgwICsgeDEpIC0gc2ZhY3RvciAqICh5MSAtIHkwKTtcbiAgICB2YXIgeWMgPSAwLjUgKiAoeTAgKyB5MSkgKyBzZmFjdG9yICogKHgxIC0geDApO1xuICAgIHZhciB0aDAgPSBNYXRoLmF0YW4yKHkwIC0geWMsIHgwIC0geGMpO1xuICAgIHZhciB0aDEgPSBNYXRoLmF0YW4yKHkxIC0geWMsIHgxIC0geGMpO1xuICAgIHZhciB0aEFyYyA9IHRoMSAtIHRoMDtcbiAgICBpZiAodGhBcmMgPCAwICYmIHN3ZWVwID09PSAxKSB7XG4gICAgICAgIHRoQXJjICs9IDIgKiBNYXRoLlBJO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aEFyYyA+IDAgJiYgc3dlZXAgPT09IDApIHtcbiAgICAgICAgdGhBcmMgLT0gMiAqIE1hdGguUEk7XG4gICAgfVxuICAgIHZhciBzZWdtZW50cyA9IE1hdGguY2VpbChNYXRoLmFicyh0aEFyYyAvIChNYXRoLlBJICogMC41ICsgMC4wMDEpKSk7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudHM7IGkrKykge1xuICAgICAgICB2YXIgdGgyID0gdGgwICsgKGkgKiB0aEFyYykgLyBzZWdtZW50cztcbiAgICAgICAgdmFyIHRoMyA9IHRoMCArICgoaSArIDEpICogdGhBcmMpIC8gc2VnbWVudHM7XG4gICAgICAgIHJlc3VsdFtpXSA9IFt4YywgeWMsIHRoMiwgdGgzLCByeCwgcnksIHNpblRoLCBjb3NUaF07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIHNlZ21lbnRUb0JlemllciA9IGZ1bmN0aW9uIChjeDEsIGN5MSwgdGgwLCB0aDEsIHJ4LCByeSwgc2luVGgsIGNvc1RoKSB7XG4gICAgdmFyIGEwMCA9IGNvc1RoICogcng7XG4gICAgdmFyIGEwMSA9IC1zaW5UaCAqIHJ5O1xuICAgIHZhciBhMTAgPSBzaW5UaCAqIHJ4O1xuICAgIHZhciBhMTEgPSBjb3NUaCAqIHJ5O1xuICAgIHZhciB0aEhhbGYgPSAwLjUgKiAodGgxIC0gdGgwKTtcbiAgICB2YXIgdCA9ICgoOCAvIDMpICogTWF0aC5zaW4odGhIYWxmICogMC41KSAqIE1hdGguc2luKHRoSGFsZiAqIDAuNSkpIC9cbiAgICAgICAgTWF0aC5zaW4odGhIYWxmKTtcbiAgICB2YXIgeDEgPSBjeDEgKyBNYXRoLmNvcyh0aDApIC0gdCAqIE1hdGguc2luKHRoMCk7XG4gICAgdmFyIHkxID0gY3kxICsgTWF0aC5zaW4odGgwKSArIHQgKiBNYXRoLmNvcyh0aDApO1xuICAgIHZhciB4MyA9IGN4MSArIE1hdGguY29zKHRoMSk7XG4gICAgdmFyIHkzID0gY3kxICsgTWF0aC5zaW4odGgxKTtcbiAgICB2YXIgeDIgPSB4MyArIHQgKiBNYXRoLnNpbih0aDEpO1xuICAgIHZhciB5MiA9IHkzIC0gdCAqIE1hdGguY29zKHRoMSk7XG4gICAgdmFyIHJlc3VsdCA9IFtcbiAgICAgICAgYTAwICogeDEgKyBhMDEgKiB5MSxcbiAgICAgICAgYTEwICogeDEgKyBhMTEgKiB5MSxcbiAgICAgICAgYTAwICogeDIgKyBhMDEgKiB5MixcbiAgICAgICAgYTEwICogeDIgKyBhMTEgKiB5MixcbiAgICAgICAgYTAwICogeDMgKyBhMDEgKiB5MyxcbiAgICAgICAgYTEwICogeDMgKyBhMTEgKiB5MyxcbiAgICBdO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IHZhciBzdmdQYXRoVG9PcGVyYXRvcnMgPSBmdW5jdGlvbiAocGF0aCkgeyByZXR1cm4gYXBwbHkocGFyc2UocGF0aCkpOyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3ZnUGF0aC5qcy5tYXAiLCJleHBvcnQgdmFyIFRleHRBbGlnbm1lbnQ7XG4oZnVuY3Rpb24gKFRleHRBbGlnbm1lbnQpIHtcbiAgICBUZXh0QWxpZ25tZW50W1RleHRBbGlnbm1lbnRbXCJMZWZ0XCJdID0gMF0gPSBcIkxlZnRcIjtcbiAgICBUZXh0QWxpZ25tZW50W1RleHRBbGlnbm1lbnRbXCJDZW50ZXJcIl0gPSAxXSA9IFwiQ2VudGVyXCI7XG4gICAgVGV4dEFsaWdubWVudFtUZXh0QWxpZ25tZW50W1wiUmlnaHRcIl0gPSAyXSA9IFwiUmlnaHRcIjtcbn0pKFRleHRBbGlnbm1lbnQgfHwgKFRleHRBbGlnbm1lbnQgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxpZ25tZW50LmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2FsaWdubWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGF5b3V0XCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBDb21iZWRUZXh0TGF5b3V0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBUZXh0QWxpZ25tZW50IH0gZnJvbSBcIi4vYWxpZ25tZW50XCI7XG5pbXBvcnQgeyBjbGVhblRleHQsIGxpbmVTcGxpdCwgbWVyZ2VMaW5lcywgY2hhckF0SW5kZXgsIGNoYXJTcGxpdCwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBNSU5fRk9OVF9TSVpFID0gNDtcbnZhciBNQVhfRk9OVF9TSVpFID0gNTAwO1xudmFyIGNvbXB1dGVGb250U2l6ZSA9IGZ1bmN0aW9uIChsaW5lcywgZm9udCwgYm91bmRzLCBtdWx0aWxpbmUpIHtcbiAgICBpZiAobXVsdGlsaW5lID09PSB2b2lkIDApIHsgbXVsdGlsaW5lID0gZmFsc2U7IH1cbiAgICB2YXIgZm9udFNpemUgPSBNSU5fRk9OVF9TSVpFO1xuICAgIHdoaWxlIChmb250U2l6ZSA8IE1BWF9GT05UX1NJWkUpIHtcbiAgICAgICAgdmFyIGxpbmVzVXNlZCA9IDA7XG4gICAgICAgIGZvciAodmFyIGxpbmVJZHggPSAwLCBsaW5lTGVuID0gbGluZXMubGVuZ3RoOyBsaW5lSWR4IDwgbGluZUxlbjsgbGluZUlkeCsrKSB7XG4gICAgICAgICAgICBsaW5lc1VzZWQgKz0gMTtcbiAgICAgICAgICAgIHZhciBsaW5lID0gbGluZXNbbGluZUlkeF07XG4gICAgICAgICAgICB2YXIgd29yZHMgPSBsaW5lLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICAvLyBMYXlvdXQgdGhlIHdvcmRzIHVzaW5nIHRoZSBjdXJyZW50IGBmb250U2l6ZWAsIGxpbmUgd3JhcHBpbmdcbiAgICAgICAgICAgIC8vIHdoZW5ldmVyIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZS5cbiAgICAgICAgICAgIHZhciBzcGFjZUluTGluZVJlbWFpbmluZyA9IGJvdW5kcy53aWR0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdvcmRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBpc0xhc3RXb3JkID0gaWR4ID09PSBsZW4gLSAxO1xuICAgICAgICAgICAgICAgIHZhciB3b3JkID0gaXNMYXN0V29yZCA/IHdvcmRzW2lkeF0gOiB3b3Jkc1tpZHhdICsgJyAnO1xuICAgICAgICAgICAgICAgIHZhciB3aWR0aE9mV29yZCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUod29yZCwgZm9udFNpemUpO1xuICAgICAgICAgICAgICAgIHNwYWNlSW5MaW5lUmVtYWluaW5nIC09IHdpZHRoT2ZXb3JkO1xuICAgICAgICAgICAgICAgIGlmIChzcGFjZUluTGluZVJlbWFpbmluZyA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVzVXNlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBzcGFjZUluTGluZVJlbWFpbmluZyA9IGJvdW5kcy53aWR0aCAtIHdpZHRoT2ZXb3JkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZXR1cm4gaWYgd2UgZXhjZWVkZWQgdGhlIGFsbG93ZWQgd2lkdGhcbiAgICAgICAgaWYgKCFtdWx0aWxpbmUgJiYgbGluZXNVc2VkID4gbGluZXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZvbnRTaXplIC0gMTtcbiAgICAgICAgdmFyIGhlaWdodCA9IGZvbnQuaGVpZ2h0QXRTaXplKGZvbnRTaXplKTtcbiAgICAgICAgdmFyIGxpbmVIZWlnaHQgPSBoZWlnaHQgKyBoZWlnaHQgKiAwLjI7XG4gICAgICAgIHZhciB0b3RhbEhlaWdodCA9IGxpbmVIZWlnaHQgKiBsaW5lc1VzZWQ7XG4gICAgICAgIC8vIFJldHVybiBpZiB3ZSBleGNlZWRlZCB0aGUgYWxsb3dlZCBoZWlnaHRcbiAgICAgICAgaWYgKHRvdGFsSGVpZ2h0ID4gTWF0aC5hYnMoYm91bmRzLmhlaWdodCkpXG4gICAgICAgICAgICByZXR1cm4gZm9udFNpemUgLSAxO1xuICAgICAgICBmb250U2l6ZSArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gZm9udFNpemU7XG59O1xudmFyIGNvbXB1dGVDb21iZWRGb250U2l6ZSA9IGZ1bmN0aW9uIChsaW5lLCBmb250LCBib3VuZHMsIGNlbGxDb3VudCkge1xuICAgIHZhciBjZWxsV2lkdGggPSBib3VuZHMud2lkdGggLyBjZWxsQ291bnQ7XG4gICAgdmFyIGNlbGxIZWlnaHQgPSBib3VuZHMuaGVpZ2h0O1xuICAgIHZhciBmb250U2l6ZSA9IE1JTl9GT05UX1NJWkU7XG4gICAgdmFyIGNoYXJzID0gY2hhclNwbGl0KGxpbmUpO1xuICAgIHdoaWxlIChmb250U2l6ZSA8IE1BWF9GT05UX1NJWkUpIHtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gY2hhcnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgYyA9IGNoYXJzW2lkeF07XG4gICAgICAgICAgICB2YXIgdG9vTG9uZyA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUoYywgZm9udFNpemUpID4gY2VsbFdpZHRoICogMC43NTtcbiAgICAgICAgICAgIGlmICh0b29Mb25nKVxuICAgICAgICAgICAgICAgIHJldHVybiBmb250U2l6ZSAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhlaWdodCA9IGZvbnQuaGVpZ2h0QXRTaXplKGZvbnRTaXplLCB7IGRlc2NlbmRlcjogZmFsc2UgfSk7XG4gICAgICAgIGlmIChoZWlnaHQgPiBjZWxsSGVpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuIGZvbnRTaXplIC0gMTtcbiAgICAgICAgZm9udFNpemUgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGZvbnRTaXplO1xufTtcbnZhciBsYXN0SW5kZXhPZldoaXRlc3BhY2UgPSBmdW5jdGlvbiAobGluZSkge1xuICAgIGZvciAodmFyIGlkeCA9IGxpbmUubGVuZ3RoOyBpZHggPiAwOyBpZHgtLSkge1xuICAgICAgICBpZiAoL1xccy8udGVzdChsaW5lW2lkeF0pKVxuICAgICAgICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG52YXIgc3BsaXRPdXRMaW5lcyA9IGZ1bmN0aW9uIChpbnB1dCwgbWF4V2lkdGgsIGZvbnQsIGZvbnRTaXplKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBsYXN0V2hpdGVzcGFjZUlkeCA9IGlucHV0Lmxlbmd0aDtcbiAgICB3aGlsZSAobGFzdFdoaXRlc3BhY2VJZHggPiAwKSB7XG4gICAgICAgIHZhciBsaW5lID0gaW5wdXQuc3Vic3RyaW5nKDAsIGxhc3RXaGl0ZXNwYWNlSWR4KTtcbiAgICAgICAgdmFyIGVuY29kZWQgPSBmb250LmVuY29kZVRleHQobGluZSk7XG4gICAgICAgIHZhciB3aWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUobGluZSwgZm9udFNpemUpO1xuICAgICAgICBpZiAod2lkdGggPCBtYXhXaWR0aCkge1xuICAgICAgICAgICAgdmFyIHJlbWFpbmRlciA9IGlucHV0LnN1YnN0cmluZyhsYXN0V2hpdGVzcGFjZUlkeCkgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIHsgbGluZTogbGluZSwgZW5jb2RlZDogZW5jb2RlZCwgd2lkdGg6IHdpZHRoLCByZW1haW5kZXI6IHJlbWFpbmRlciB9O1xuICAgICAgICB9XG4gICAgICAgIGxhc3RXaGl0ZXNwYWNlSWR4ID0gKF9hID0gbGFzdEluZGV4T2ZXaGl0ZXNwYWNlKGxpbmUpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIH1cbiAgICAvLyBXZSB3ZXJlIHVuYWJsZSB0byBzcGxpdCB0aGUgaW5wdXQgZW5vdWdoIHRvIGdldCBhIGNodW5rIHRoYXQgd291bGQgZml0XG4gICAgLy8gd2l0aGluIHRoZSBzcGVjaWZpZWQgYG1heFdpZHRoYCBzbyB3ZSdsbCBqdXN0IHJldHVybiBldmVyeXRoaW5nXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGluZTogaW5wdXQsXG4gICAgICAgIGVuY29kZWQ6IGZvbnQuZW5jb2RlVGV4dChpbnB1dCksXG4gICAgICAgIHdpZHRoOiBmb250LndpZHRoT2ZUZXh0QXRTaXplKGlucHV0LCBmb250U2l6ZSksXG4gICAgICAgIHJlbWFpbmRlcjogdW5kZWZpbmVkLFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBsYXlvdXRNdWx0aWxpbmVUZXh0ID0gZnVuY3Rpb24gKHRleHQsIF9hKSB7XG4gICAgdmFyIGFsaWdubWVudCA9IF9hLmFsaWdubWVudCwgZm9udFNpemUgPSBfYS5mb250U2l6ZSwgZm9udCA9IF9hLmZvbnQsIGJvdW5kcyA9IF9hLmJvdW5kcztcbiAgICB2YXIgbGluZXMgPSBsaW5lU3BsaXQoY2xlYW5UZXh0KHRleHQpKTtcbiAgICBpZiAoZm9udFNpemUgPT09IHVuZGVmaW5lZCB8fCBmb250U2l6ZSA9PT0gMCkge1xuICAgICAgICBmb250U2l6ZSA9IGNvbXB1dGVGb250U2l6ZShsaW5lcywgZm9udCwgYm91bmRzLCB0cnVlKTtcbiAgICB9XG4gICAgdmFyIGhlaWdodCA9IGZvbnQuaGVpZ2h0QXRTaXplKGZvbnRTaXplKTtcbiAgICB2YXIgbGluZUhlaWdodCA9IGhlaWdodCArIGhlaWdodCAqIDAuMjtcbiAgICB2YXIgdGV4dExpbmVzID0gW107XG4gICAgdmFyIG1pblggPSBib3VuZHMueDtcbiAgICB2YXIgbWluWSA9IGJvdW5kcy55O1xuICAgIHZhciBtYXhYID0gYm91bmRzLnggKyBib3VuZHMud2lkdGg7XG4gICAgdmFyIG1heFkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQ7XG4gICAgdmFyIHkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQ7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBwcmV2UmVtYWluZGVyID0gbGluZXNbaWR4XTtcbiAgICAgICAgd2hpbGUgKHByZXZSZW1haW5kZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIF9iID0gc3BsaXRPdXRMaW5lcyhwcmV2UmVtYWluZGVyLCBib3VuZHMud2lkdGgsIGZvbnQsIGZvbnRTaXplKSwgbGluZSA9IF9iLmxpbmUsIGVuY29kZWQgPSBfYi5lbmNvZGVkLCB3aWR0aCA9IF9iLndpZHRoLCByZW1haW5kZXIgPSBfYi5yZW1haW5kZXI7XG4gICAgICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgIHZhciB4ID0gKGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5MZWZ0ID8gYm91bmRzLnhcbiAgICAgICAgICAgICAgICA6IGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5DZW50ZXIgPyBib3VuZHMueCArIChib3VuZHMud2lkdGggLyAyKSAtICh3aWR0aCAvIDIpXG4gICAgICAgICAgICAgICAgICAgIDogYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LlJpZ2h0ID8gYm91bmRzLnggKyBib3VuZHMud2lkdGggLSB3aWR0aFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBib3VuZHMueCk7XG4gICAgICAgICAgICB5IC09IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpXG4gICAgICAgICAgICAgICAgbWluWCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IG1pblkpXG4gICAgICAgICAgICAgICAgbWluWSA9IHk7XG4gICAgICAgICAgICBpZiAoeCArIHdpZHRoID4gbWF4WClcbiAgICAgICAgICAgICAgICBtYXhYID0geCArIHdpZHRoO1xuICAgICAgICAgICAgaWYgKHkgKyBoZWlnaHQgPiBtYXhZKVxuICAgICAgICAgICAgICAgIG1heFkgPSB5ICsgaGVpZ2h0O1xuICAgICAgICAgICAgdGV4dExpbmVzLnB1c2goeyB0ZXh0OiBsaW5lLCBlbmNvZGVkOiBlbmNvZGVkLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LCB4OiB4LCB5OiB5IH0pO1xuICAgICAgICAgICAgLy8gT25seSB0cmltIGxpbmVzIHRoYXQgd2UgaGFkIHRvIHNwbGl0IG91cnNlbHZlcy4gU28gd2Ugd29uJ3QgdHJpbSBsaW5lc1xuICAgICAgICAgICAgLy8gdGhhdCB0aGUgdXNlciBwcm92aWRlZCB0aGVtc2VsdmVzIHdpdGggd2hpdGVzcGFjZS5cbiAgICAgICAgICAgIHByZXZSZW1haW5kZXIgPSByZW1haW5kZXIgPT09IG51bGwgfHwgcmVtYWluZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZW1haW5kZXIudHJpbSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgbGluZUhlaWdodDogbGluZUhlaWdodCxcbiAgICAgICAgbGluZXM6IHRleHRMaW5lcyxcbiAgICAgICAgYm91bmRzOiB7XG4gICAgICAgICAgICB4OiBtaW5YLFxuICAgICAgICAgICAgeTogbWluWSxcbiAgICAgICAgICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcbiAgICAgICAgICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIGxheW91dENvbWJlZFRleHQgPSBmdW5jdGlvbiAodGV4dCwgX2EpIHtcbiAgICB2YXIgZm9udFNpemUgPSBfYS5mb250U2l6ZSwgZm9udCA9IF9hLmZvbnQsIGJvdW5kcyA9IF9hLmJvdW5kcywgY2VsbENvdW50ID0gX2EuY2VsbENvdW50O1xuICAgIHZhciBsaW5lID0gbWVyZ2VMaW5lcyhjbGVhblRleHQodGV4dCkpO1xuICAgIGlmIChsaW5lLmxlbmd0aCA+IGNlbGxDb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tYmVkVGV4dExheW91dEVycm9yKGxpbmUubGVuZ3RoLCBjZWxsQ291bnQpO1xuICAgIH1cbiAgICBpZiAoZm9udFNpemUgPT09IHVuZGVmaW5lZCB8fCBmb250U2l6ZSA9PT0gMCkge1xuICAgICAgICBmb250U2l6ZSA9IGNvbXB1dGVDb21iZWRGb250U2l6ZShsaW5lLCBmb250LCBib3VuZHMsIGNlbGxDb3VudCk7XG4gICAgfVxuICAgIHZhciBjZWxsV2lkdGggPSBib3VuZHMud2lkdGggLyBjZWxsQ291bnQ7XG4gICAgdmFyIGhlaWdodCA9IGZvbnQuaGVpZ2h0QXRTaXplKGZvbnRTaXplLCB7IGRlc2NlbmRlcjogZmFsc2UgfSk7XG4gICAgdmFyIHkgPSBib3VuZHMueSArIChib3VuZHMuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDIpO1xuICAgIHZhciBjZWxscyA9IFtdO1xuICAgIHZhciBtaW5YID0gYm91bmRzLng7XG4gICAgdmFyIG1pblkgPSBib3VuZHMueTtcbiAgICB2YXIgbWF4WCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoO1xuICAgIHZhciBtYXhZID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0O1xuICAgIHZhciBjZWxsT2Zmc2V0ID0gMDtcbiAgICB2YXIgY2hhck9mZnNldCA9IDA7XG4gICAgd2hpbGUgKGNlbGxPZmZzZXQgPCBjZWxsQ291bnQpIHtcbiAgICAgICAgdmFyIF9iID0gY2hhckF0SW5kZXgobGluZSwgY2hhck9mZnNldCksIGNoYXIgPSBfYlswXSwgY2hhckxlbmd0aCA9IF9iWzFdO1xuICAgICAgICB2YXIgZW5jb2RlZCA9IGZvbnQuZW5jb2RlVGV4dChjaGFyKTtcbiAgICAgICAgdmFyIHdpZHRoID0gZm9udC53aWR0aE9mVGV4dEF0U2l6ZShjaGFyLCBmb250U2l6ZSk7XG4gICAgICAgIHZhciBjZWxsQ2VudGVyID0gYm91bmRzLnggKyAoY2VsbFdpZHRoICogY2VsbE9mZnNldCArIGNlbGxXaWR0aCAvIDIpO1xuICAgICAgICB2YXIgeCA9IGNlbGxDZW50ZXIgLSB3aWR0aCAvIDI7XG4gICAgICAgIGlmICh4IDwgbWluWClcbiAgICAgICAgICAgIG1pblggPSB4O1xuICAgICAgICBpZiAoeSA8IG1pblkpXG4gICAgICAgICAgICBtaW5ZID0geTtcbiAgICAgICAgaWYgKHggKyB3aWR0aCA+IG1heFgpXG4gICAgICAgICAgICBtYXhYID0geCArIHdpZHRoO1xuICAgICAgICBpZiAoeSArIGhlaWdodCA+IG1heFkpXG4gICAgICAgICAgICBtYXhZID0geSArIGhlaWdodDtcbiAgICAgICAgY2VsbHMucHVzaCh7IHRleHQ6IGxpbmUsIGVuY29kZWQ6IGVuY29kZWQsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsIHg6IHgsIHk6IHkgfSk7XG4gICAgICAgIGNlbGxPZmZzZXQgKz0gMTtcbiAgICAgICAgY2hhck9mZnNldCArPSBjaGFyTGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgIGNlbGxzOiBjZWxscyxcbiAgICAgICAgYm91bmRzOiB7XG4gICAgICAgICAgICB4OiBtaW5YLFxuICAgICAgICAgICAgeTogbWluWSxcbiAgICAgICAgICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcbiAgICAgICAgICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIGxheW91dFNpbmdsZWxpbmVUZXh0ID0gZnVuY3Rpb24gKHRleHQsIF9hKSB7XG4gICAgdmFyIGFsaWdubWVudCA9IF9hLmFsaWdubWVudCwgZm9udFNpemUgPSBfYS5mb250U2l6ZSwgZm9udCA9IF9hLmZvbnQsIGJvdW5kcyA9IF9hLmJvdW5kcztcbiAgICB2YXIgbGluZSA9IG1lcmdlTGluZXMoY2xlYW5UZXh0KHRleHQpKTtcbiAgICBpZiAoZm9udFNpemUgPT09IHVuZGVmaW5lZCB8fCBmb250U2l6ZSA9PT0gMCkge1xuICAgICAgICBmb250U2l6ZSA9IGNvbXB1dGVGb250U2l6ZShbbGluZV0sIGZvbnQsIGJvdW5kcyk7XG4gICAgfVxuICAgIHZhciBlbmNvZGVkID0gZm9udC5lbmNvZGVUZXh0KGxpbmUpO1xuICAgIHZhciB3aWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUobGluZSwgZm9udFNpemUpO1xuICAgIHZhciBoZWlnaHQgPSBmb250LmhlaWdodEF0U2l6ZShmb250U2l6ZSwgeyBkZXNjZW5kZXI6IGZhbHNlIH0pO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHZhciB4ID0gKGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5MZWZ0ID8gYm91bmRzLnhcbiAgICAgICAgOiBhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuQ2VudGVyID8gYm91bmRzLnggKyAoYm91bmRzLndpZHRoIC8gMikgLSAod2lkdGggLyAyKVxuICAgICAgICAgICAgOiBhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuUmlnaHQgPyBib3VuZHMueCArIGJvdW5kcy53aWR0aCAtIHdpZHRoXG4gICAgICAgICAgICAgICAgOiBib3VuZHMueCk7XG4gICAgdmFyIHkgPSBib3VuZHMueSArIChib3VuZHMuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgbGluZTogeyB0ZXh0OiBsaW5lLCBlbmNvZGVkOiBlbmNvZGVkLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LCB4OiB4LCB5OiB5IH0sXG4gICAgICAgIGJvdW5kczogeyB4OiB4LCB5OiB5LCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH0sXG4gICAgfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYXlvdXQuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBwYWtvIGZyb20gJ3Bha28nO1xuaW1wb3J0IFBERkhlYWRlciBmcm9tIFwiLi9kb2N1bWVudC9QREZIZWFkZXJcIjtcbmltcG9ydCB7IFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGQm9vbCBmcm9tIFwiLi9vYmplY3RzL1BERkJvb2xcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVsbCBmcm9tIFwiLi9vYmplY3RzL1BERk51bGxcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vb2JqZWN0cy9QREZPYmplY3RcIjtcbmltcG9ydCBQREZSYXdTdHJlYW0gZnJvbSBcIi4vb2JqZWN0cy9QREZSYXdTdHJlYW1cIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZPcGVyYXRvciBmcm9tIFwiLi9vcGVyYXRvcnMvUERGT3BlcmF0b3JcIjtcbmltcG9ydCBPcHMgZnJvbSBcIi4vb3BlcmF0b3JzL1BERk9wZXJhdG9yTmFtZXNcIjtcbmltcG9ydCBQREZDb250ZW50U3RyZWFtIGZyb20gXCIuL3N0cnVjdHVyZXMvUERGQ29udGVudFN0cmVhbVwiO1xuaW1wb3J0IHsgdHlwZWRBcnJheUZvciB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgU2ltcGxlUk5HIH0gZnJvbSBcIi4uL3V0aWxzL3JuZ1wiO1xudmFyIGJ5QXNjZW5kaW5nT2JqZWN0TnVtYmVyID0gZnVuY3Rpb24gKF9hLCBfYikge1xuICAgIHZhciBhID0gX2FbMF07XG4gICAgdmFyIGIgPSBfYlswXTtcbiAgICByZXR1cm4gYS5vYmplY3ROdW1iZXIgLSBiLm9iamVjdE51bWJlcjtcbn07XG52YXIgUERGQ29udGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZDb250ZXh0KCkge1xuICAgICAgICB0aGlzLmxhcmdlc3RPYmplY3ROdW1iZXIgPSAwO1xuICAgICAgICB0aGlzLmhlYWRlciA9IFBERkhlYWRlci5mb3JWZXJzaW9uKDEsIDcpO1xuICAgICAgICB0aGlzLnRyYWlsZXJJbmZvID0ge307XG4gICAgICAgIHRoaXMuaW5kaXJlY3RPYmplY3RzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnJuZyA9IFNpbXBsZVJORy53aXRoU2VlZCgxKTtcbiAgICB9XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuYXNzaWduID0gZnVuY3Rpb24gKHJlZiwgb2JqZWN0KSB7XG4gICAgICAgIHRoaXMuaW5kaXJlY3RPYmplY3RzLnNldChyZWYsIG9iamVjdCk7XG4gICAgICAgIGlmIChyZWYub2JqZWN0TnVtYmVyID4gdGhpcy5sYXJnZXN0T2JqZWN0TnVtYmVyKSB7XG4gICAgICAgICAgICB0aGlzLmxhcmdlc3RPYmplY3ROdW1iZXIgPSByZWYub2JqZWN0TnVtYmVyO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5uZXh0UmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmxhcmdlc3RPYmplY3ROdW1iZXIgKz0gMTtcbiAgICAgICAgcmV0dXJuIFBERlJlZi5vZih0aGlzLmxhcmdlc3RPYmplY3ROdW1iZXIpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIHZhciByZWYgPSB0aGlzLm5leHRSZWYoKTtcbiAgICAgICAgdGhpcy5hc3NpZ24ocmVmLCBvYmplY3QpO1xuICAgICAgICByZXR1cm4gcmVmO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRpcmVjdE9iamVjdHMuZGVsZXRlKHJlZik7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5sb29rdXBNYXliZSA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0eXBlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBgcHJlc2VydmVQREZOdWxsYCBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNob3VsZCBiZVxuICAgICAgICAvLyByZW1vdmVkIGluIG5leHQgYnJlYWtpbmcgQVBJIGNoYW5nZS5cbiAgICAgICAgdmFyIHByZXNlcnZlUERGTnVsbCA9IHR5cGVzLmluY2x1ZGVzKFBERk51bGwpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVmIGluc3RhbmNlb2YgUERGUmVmID8gdGhpcy5pbmRpcmVjdE9iamVjdHMuZ2V0KHJlZikgOiByZWY7XG4gICAgICAgIGlmICghcmVzdWx0IHx8IChyZXN1bHQgPT09IFBERk51bGwgJiYgIXByZXNlcnZlUERGTnVsbCkpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0eXBlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gdHlwZXNbaWR4XTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBQREZOdWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gUERGTnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiB0eXBlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yKHR5cGVzLCByZXN1bHQpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHR5cGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSByZWYgaW5zdGFuY2VvZiBQREZSZWYgPyB0aGlzLmluZGlyZWN0T2JqZWN0cy5nZXQocmVmKSA6IHJlZjtcbiAgICAgICAgaWYgKHR5cGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHR5cGVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlc1tpZHhdO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFBERk51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBQREZOdWxsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIHR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IodHlwZXMsIHJlc3VsdCk7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5nZXRPYmplY3RSZWYgPSBmdW5jdGlvbiAocGRmT2JqZWN0KSB7XG4gICAgICAgIHZhciBlbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmluZGlyZWN0T2JqZWN0cy5lbnRyaWVzKCkpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCByZWYgPSBfYVswXSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgICAgICBpZiAob2JqZWN0ID09PSBwZGZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5lbnVtZXJhdGVJbmRpcmVjdE9iamVjdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuaW5kaXJlY3RPYmplY3RzLmVudHJpZXMoKSkuc29ydChieUFzY2VuZGluZ09iamVjdE51bWJlcik7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5vYmogPSBmdW5jdGlvbiAobGl0ZXJhbCkge1xuICAgICAgICBpZiAobGl0ZXJhbCBpbnN0YW5jZW9mIFBERk9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGxpdGVyYWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGl0ZXJhbCA9PT0gbnVsbCB8fCBsaXRlcmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQREZOdWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsaXRlcmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFBERk5hbWUub2YobGl0ZXJhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxpdGVyYWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gUERGTnVtYmVyLm9mKGxpdGVyYWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsaXRlcmFsID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiBsaXRlcmFsID8gUERGQm9vbC5UcnVlIDogUERGQm9vbC5GYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGxpdGVyYWwpKSB7XG4gICAgICAgICAgICB2YXIgYXJyYXkgPSBQREZBcnJheS53aXRoQ29udGV4dCh0aGlzKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxpdGVyYWwubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgYXJyYXkucHVzaCh0aGlzLm9iaihsaXRlcmFsW2lkeF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBkaWN0ID0gUERGRGljdC53aXRoQ29udGV4dCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMobGl0ZXJhbCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBrZXlzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2lkeF07XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gbGl0ZXJhbFtrZXldO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKGtleSksIHRoaXMub2JqKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGljdDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuc3RyZWFtID0gZnVuY3Rpb24gKGNvbnRlbnRzLCBkaWN0KSB7XG4gICAgICAgIGlmIChkaWN0ID09PSB2b2lkIDApIHsgZGljdCA9IHt9OyB9XG4gICAgICAgIHJldHVybiBQREZSYXdTdHJlYW0ub2YodGhpcy5vYmooZGljdCksIHR5cGVkQXJyYXlGb3IoY29udGVudHMpKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmZsYXRlU3RyZWFtID0gZnVuY3Rpb24gKGNvbnRlbnRzLCBkaWN0KSB7XG4gICAgICAgIGlmIChkaWN0ID09PSB2b2lkIDApIHsgZGljdCA9IHt9OyB9XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbShwYWtvLmRlZmxhdGUodHlwZWRBcnJheUZvcihjb250ZW50cykpLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGljdCksIHsgRmlsdGVyOiAnRmxhdGVEZWNvZGUnIH0pKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmNvbnRlbnRTdHJlYW0gPSBmdW5jdGlvbiAob3BlcmF0b3JzLCBkaWN0KSB7XG4gICAgICAgIGlmIChkaWN0ID09PSB2b2lkIDApIHsgZGljdCA9IHt9OyB9XG4gICAgICAgIHJldHVybiBQREZDb250ZW50U3RyZWFtLm9mKHRoaXMub2JqKGRpY3QpLCBvcGVyYXRvcnMpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZm9ybVhPYmplY3QgPSBmdW5jdGlvbiAob3BlcmF0b3JzLCBkaWN0KSB7XG4gICAgICAgIGlmIChkaWN0ID09PSB2b2lkIDApIHsgZGljdCA9IHt9OyB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRTdHJlYW0ob3BlcmF0b3JzLCBfX2Fzc2lnbihfX2Fzc2lnbih7IEJCb3g6IHRoaXMub2JqKFswLCAwLCAwLCAwXSksIE1hdHJpeDogdGhpcy5vYmooWzEsIDAsIDAsIDEsIDAsIDBdKSB9LCBkaWN0KSwgeyBUeXBlOiAnWE9iamVjdCcsIFN1YnR5cGU6ICdGb3JtJyB9KSk7XG4gICAgfTtcbiAgICAvKlxuICAgICAqIFJlZmVyZW5jZSB0byBQREZDb250ZW50U3RyZWFtIHRoYXQgY29udGFpbnMgYSBzaW5nbGUgUERGT3BlcmF0b3I6IGBxYC5cbiAgICAgKiBVc2VkIGJ5IFtbUERGUGFnZUxlYWZdXSBpbnN0YW5jZXMgdG8gZW5zdXJlIHRoYXQgd2hlbiBjb250ZW50IHN0cmVhbXMgYXJlXG4gICAgICogYWRkZWQgdG8gYSBtb2RpZmllZCBQREYsIHRoZXkgc3RhcnQgaW4gdGhlIGRlZmF1bHQsIHVuY2hhbmdlZCBncmFwaGljc1xuICAgICAqIHN0YXRlLlxuICAgICAqL1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmdldFB1c2hHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucHVzaEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wdXNoR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWY7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLm9iaih7fSk7XG4gICAgICAgIHZhciBvcCA9IFBERk9wZXJhdG9yLm9mKE9wcy5QdXNoR3JhcGhpY3NTdGF0ZSk7XG4gICAgICAgIHZhciBzdHJlYW0gPSBQREZDb250ZW50U3RyZWFtLm9mKGRpY3QsIFtvcF0pO1xuICAgICAgICB0aGlzLnB1c2hHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZiA9IHRoaXMucmVnaXN0ZXIoc3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVzaEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmO1xuICAgIH07XG4gICAgLypcbiAgICAgKiBSZWZlcmVuY2UgdG8gUERGQ29udGVudFN0cmVhbSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIFBERk9wZXJhdG9yOiBgUWAuXG4gICAgICogVXNlZCBieSBbW1BERlBhZ2VMZWFmXV0gaW5zdGFuY2VzIHRvIGVuc3VyZSB0aGF0IHdoZW4gY29udGVudCBzdHJlYW1zIGFyZVxuICAgICAqIGFkZGVkIHRvIGEgbW9kaWZpZWQgUERGLCB0aGV5IHN0YXJ0IGluIHRoZSBkZWZhdWx0LCB1bmNoYW5nZWQgZ3JhcGhpY3NcbiAgICAgKiBzdGF0ZS5cbiAgICAgKi9cbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5nZXRQb3BHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucG9wR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWYpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvcEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5vYmooe30pO1xuICAgICAgICB2YXIgb3AgPSBQREZPcGVyYXRvci5vZihPcHMuUG9wR3JhcGhpY3NTdGF0ZSk7XG4gICAgICAgIHZhciBzdHJlYW0gPSBQREZDb250ZW50U3RyZWFtLm9mKGRpY3QsIFtvcF0pO1xuICAgICAgICB0aGlzLnBvcEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmID0gdGhpcy5yZWdpc3RlcihzdHJlYW0pO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3BHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZjtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmFkZFJhbmRvbVN1ZmZpeCA9IGZ1bmN0aW9uIChwcmVmaXgsIHN1ZmZpeExlbmd0aCkge1xuICAgICAgICBpZiAoc3VmZml4TGVuZ3RoID09PSB2b2lkIDApIHsgc3VmZml4TGVuZ3RoID0gNDsgfVxuICAgICAgICByZXR1cm4gcHJlZml4ICsgXCItXCIgKyBNYXRoLmZsb29yKHRoaXMucm5nLm5leHRJbnQoKSAqIE1hdGgucG93KDEwLCBzdWZmaXhMZW5ndGgpKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQuY3JlYXRlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBERkNvbnRleHQoKTsgfTtcbiAgICByZXR1cm4gUERGQ29udGV4dDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZDb250ZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQ29udGV4dC5qcy5tYXAiLCJpbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4vb2JqZWN0cy9QREZTdHJlYW1cIjtcbmltcG9ydCBQREZQYWdlTGVhZiBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERlBhZ2VMZWFmXCI7XG4vKipcbiAqIFBERk9iamVjdENvcGllciBjb3BpZXMgUERGT2JqZWN0cyBmcm9tIGEgc3JjIGNvbnRleHQgdG8gYSBkZXN0IGNvbnRleHQuXG4gKiBUaGUgcHJpbWFyeSB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byBjb3B5IHBhZ2VzIGJldHdlZW4gUERGcy5cbiAqXG4gKiBfQ29weWluZ18gYW4gb2JqZWN0IHdpdGggYSBQREZPYmplY3RDb3BpZXIgaXMgZGlmZmVyZW50IGZyb20gX2Nsb25pbmdfIGFuXG4gKiBvYmplY3Qgd2l0aCBpdHMgW1tQREZPYmplY3QuY2xvbmVdXSBtZXRob2Q6XG4gKlxuICogYGBgXG4gKiAgIGNvbnN0IHNyYzogUERGQ29udGV4dCA9IC4uLlxuICogICBjb25zdCBkZXN0OiBQREZDb250ZXh0ID0gLi4uXG4gKiAgIGNvbnN0IG9yaWdpbmFsT2JqZWN0OiBQREZPYmplY3QgPSAuLi5cbiAqICAgY29uc3QgY29waWVkT2JqZWN0ID0gUERGT2JqZWN0Q29waWVyLmZvcihzcmMsIGRlc3QpLmNvcHkob3JpZ2luYWxPYmplY3QpO1xuICogICBjb25zdCBjbG9uZWRPYmplY3QgPSBvcmlnaW5hbE9iamVjdC5jbG9uZSgpO1xuICogYGBgXG4gKlxuICogQ29weWluZyBhbiBvYmplY3QgaXMgZXF1aXZhbGVudCB0byBjbG9uaW5nIGl0IGFuZCB0aGVuIGNvcHlpbmcgb3ZlciBhbnkgb3RoZXJcbiAqIG9iamVjdHMgdGhhdCBpdCByZWZlcmVuY2VzLiBOb3RlIHRoYXQgb25seSBkaWN0aW9uYXJpZXMsIGFycmF5cywgYW5kIHN0cmVhbXNcbiAqIChvciBzdHJ1Y3R1cmVzIGJ1aWxkIGZyb20gdGhlbSkgY2FuIGNvbnRhaW4gaW5kaXJlY3QgcmVmZXJlbmNlcyB0byBvdGhlclxuICogb2JqZWN0cy4gQ29weWluZyBhIFBERk9iamVjdCB0aGF0IGlzIG5vdCBhIGRpY3Rpb25hcnksIGFycmF5LCBvciBzdHJlYW0gaXNcbiAqIHN1cHBvcnRlZCwgYnV0IGlzIGVxdWl2YWxlbnQgdG8gY2xvbmluZyBpdC5cbiAqL1xudmFyIFBERk9iamVjdENvcGllciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZPYmplY3RDb3BpZXIoc3JjLCBkZXN0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMudHJhdmVyc2VkT2JqZWN0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHRoaXMuY29weSA9IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBQREZQYWdlTGVhZiA/IF90aGlzLmNvcHlQREZQYWdlKG9iamVjdClcbiAgICAgICAgICAgIDogb2JqZWN0IGluc3RhbmNlb2YgUERGRGljdCA/IF90aGlzLmNvcHlQREZEaWN0KG9iamVjdClcbiAgICAgICAgICAgICAgICA6IG9iamVjdCBpbnN0YW5jZW9mIFBERkFycmF5ID8gX3RoaXMuY29weVBERkFycmF5KG9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgOiBvYmplY3QgaW5zdGFuY2VvZiBQREZTdHJlYW0gPyBfdGhpcy5jb3B5UERGU3RyZWFtKG9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogb2JqZWN0IGluc3RhbmNlb2YgUERGUmVmID8gX3RoaXMuY29weVBERkluZGlyZWN0T2JqZWN0KG9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9iamVjdC5jbG9uZSgpKTsgfTtcbiAgICAgICAgdGhpcy5jb3B5UERGUGFnZSA9IGZ1bmN0aW9uIChvcmlnaW5hbFBhZ2UpIHtcbiAgICAgICAgICAgIHZhciBjbG9uZWRQYWdlID0gb3JpZ2luYWxQYWdlLmNsb25lKCk7XG4gICAgICAgICAgICAvLyBNb3ZlIGFueSBlbnRyaWVzIHRoYXQgdGhlIG9yaWdpbmFsUGFnZSBpcyBpbmhlcml0aW5nIGZyb20gaXRzIHBhcmVudFxuICAgICAgICAgICAgLy8gdHJlZSBub2RlcyBkaXJlY3RseSBpbnRvIG9yaWdpbmFsUGFnZSBzbyB0aGV5IGFyZSBwcmVzZXJ2ZWQgZHVyaW5nXG4gICAgICAgICAgICAvLyB0aGUgY29weS5cbiAgICAgICAgICAgIHZhciBJbmhlcml0YWJsZUVudHJpZXMgPSBQREZQYWdlTGVhZi5Jbmhlcml0YWJsZUVudHJpZXM7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBJbmhlcml0YWJsZUVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoSW5oZXJpdGFibGVFbnRyaWVzW2lkeF0pO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNsb25lZFBhZ2UuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsb25lZFBhZ2UuZ2V0KGtleSkgJiYgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIGNsb25lZFBhZ2Uuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBwYXJlbnQgcmVmZXJlbmNlIHRvIHByZXZlbnQgdGhlIHdob2xlIGRvbm9yIGRvY3VtZW50J3MgcGFnZVxuICAgICAgICAgICAgLy8gdHJlZSBmcm9tIGJlaW5nIGNvcGllZCB3aGVuIHdlIG9ubHkgbmVlZCBhIHNpbmdsZSBwYWdlLlxuICAgICAgICAgICAgY2xvbmVkUGFnZS5kZWxldGUoUERGTmFtZS5vZignUGFyZW50JykpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNvcHlQREZEaWN0KGNsb25lZFBhZ2UpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvcHlQREZEaWN0ID0gZnVuY3Rpb24gKG9yaWdpbmFsRGljdCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLnRyYXZlcnNlZE9iamVjdHMuaGFzKG9yaWdpbmFsRGljdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5nZXQob3JpZ2luYWxEaWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjbG9uZWREaWN0ID0gb3JpZ2luYWxEaWN0LmNsb25lKF90aGlzLmRlc3QpO1xuICAgICAgICAgICAgX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5zZXQob3JpZ2luYWxEaWN0LCBjbG9uZWREaWN0KTtcbiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gb3JpZ2luYWxEaWN0LmVudHJpZXMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICBjbG9uZWREaWN0LnNldChrZXksIF90aGlzLmNvcHkodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbG9uZWREaWN0O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvcHlQREZBcnJheSA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5KSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5oYXMob3JpZ2luYWxBcnJheSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5nZXQob3JpZ2luYWxBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2xvbmVkQXJyYXkgPSBvcmlnaW5hbEFycmF5LmNsb25lKF90aGlzLmRlc3QpO1xuICAgICAgICAgICAgX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5zZXQob3JpZ2luYWxBcnJheSwgY2xvbmVkQXJyYXkpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3JpZ2luYWxBcnJheS5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBvcmlnaW5hbEFycmF5LmdldChpZHgpO1xuICAgICAgICAgICAgICAgIGNsb25lZEFycmF5LnNldChpZHgsIF90aGlzLmNvcHkodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbG9uZWRBcnJheTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb3B5UERGU3RyZWFtID0gZnVuY3Rpb24gKG9yaWdpbmFsU3RyZWFtKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5oYXMob3JpZ2luYWxTdHJlYW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuZ2V0KG9yaWdpbmFsU3RyZWFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjbG9uZWRTdHJlYW0gPSBvcmlnaW5hbFN0cmVhbS5jbG9uZShfdGhpcy5kZXN0KTtcbiAgICAgICAgICAgIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuc2V0KG9yaWdpbmFsU3RyZWFtLCBjbG9uZWRTdHJlYW0pO1xuICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBvcmlnaW5hbFN0cmVhbS5kaWN0LmVudHJpZXMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICBjbG9uZWRTdHJlYW0uZGljdC5zZXQoa2V5LCBfdGhpcy5jb3B5KHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xvbmVkU3RyZWFtO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvcHlQREZJbmRpcmVjdE9iamVjdCA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgIHZhciBhbHJlYWR5TWFwcGVkID0gX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5oYXMocmVmKTtcbiAgICAgICAgICAgIGlmICghYWxyZWFkeU1hcHBlZCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdSZWYgPSBfdGhpcy5kZXN0Lm5leHRSZWYoKTtcbiAgICAgICAgICAgICAgICBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLnNldChyZWYsIG5ld1JlZik7XG4gICAgICAgICAgICAgICAgdmFyIGRlcmVmZXJlbmNlZFZhbHVlID0gX3RoaXMuc3JjLmxvb2t1cChyZWYpO1xuICAgICAgICAgICAgICAgIGlmIChkZXJlZmVyZW5jZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmVkID0gX3RoaXMuY29weShkZXJlZmVyZW5jZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmRlc3QuYXNzaWduKG5ld1JlZiwgY2xvbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5nZXQocmVmKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zcmMgPSBzcmM7XG4gICAgICAgIHRoaXMuZGVzdCA9IGRlc3Q7XG4gICAgfVxuICAgIFBERk9iamVjdENvcGllci5mb3IgPSBmdW5jdGlvbiAoc3JjLCBkZXN0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGT2JqZWN0Q29waWVyKHNyYywgZGVzdCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGT2JqZWN0Q29waWVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9iamVjdENvcGllcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9iamVjdENvcGllci5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQWNyb1Rlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9UZXJtaW5hbFwiO1xuaW1wb3J0IHsgSW5kZXhPdXRPZkJvdW5kc0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkFjcm9CdXR0b24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9CdXR0b24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb0J1dHRvbigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5PcHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwTWF5YmUoUERGTmFtZS5vZignT3B0JyksIFBERlN0cmluZywgUERGSGV4U3RyaW5nLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5zZXRPcHQgPSBmdW5jdGlvbiAob3B0KSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignT3B0JyksIHRoaXMuZGljdC5jb250ZXh0Lm9iaihvcHQpKTtcbiAgICB9O1xuICAgIFBERkFjcm9CdXR0b24ucHJvdG90eXBlLmdldEV4cG9ydFZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9wdCA9IHRoaXMuT3B0KCk7XG4gICAgICAgIGlmICghb3B0KVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG9wdCBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBvcHQgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBbb3B0XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdC5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9wdC5sb29rdXAoaWR4KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH07XG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUucmVtb3ZlRXhwb3J0VmFsdWUgPSBmdW5jdGlvbiAoaWR4KSB7XG4gICAgICAgIHZhciBvcHQgPSB0aGlzLk9wdCgpO1xuICAgICAgICBpZiAoIW9wdClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKG9wdCBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBvcHQgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgIGlmIChpZHggIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFcnJvcihpZHgsIDAsIDApO1xuICAgICAgICAgICAgdGhpcy5zZXRPcHQoW10pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID4gb3B0LnNpemUoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXJyb3IoaWR4LCAwLCBvcHQuc2l6ZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdC5yZW1vdmUoaWR4KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gRW5mb3JjZSB1c2UgdXNlIG9mIC9PcHQgZXZlbiBpZiBpdCBpc24ndCBzdHJpY3RseSBuZWNlc3NhcnlcbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5ub3JtYWxpemVFeHBvcnRWYWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgdmFyIGV4cG9ydFZhbHVlcyA9IChfYSA9IHRoaXMuZ2V0RXhwb3J0VmFsdWVzKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICB2YXIgT3B0ID0gW107XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIGV4cG9ydFZhbCA9IChfYiA9IGV4cG9ydFZhbHVlc1tpZHhdKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBQREZIZXhTdHJpbmcuZnJvbVRleHQoKF9kID0gKF9jID0gd2lkZ2V0LmdldE9uVmFsdWUoKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRlY29kZVRleHQoKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJycpO1xuICAgICAgICAgICAgT3B0LnB1c2goZXhwb3J0VmFsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldE9wdChPcHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV1c2VzIGV4aXN0aW5nIG9wdCBpZiBvbmUgZXhpc3RzIHdpdGggdGhlIHNhbWUgdmFsdWUgKGFzc3VtaW5nXG4gICAgICogYHVzZUV4aXN0aW5nSWR4YCBpcyBgdHJ1ZWApLiBSZXR1cm5zIGluZGV4IG9mIGV4aXN0aW5nIChvciBuZXcpIG9wdC5cbiAgICAgKi9cbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5hZGRPcHQgPSBmdW5jdGlvbiAob3B0LCB1c2VFeGlzdGluZ09wdElkeCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMubm9ybWFsaXplRXhwb3J0VmFsdWVzKCk7XG4gICAgICAgIHZhciBvcHRUZXh0ID0gb3B0LmRlY29kZVRleHQoKTtcbiAgICAgICAgdmFyIGV4aXN0aW5nSWR4O1xuICAgICAgICBpZiAodXNlRXhpc3RpbmdPcHRJZHgpIHtcbiAgICAgICAgICAgIHZhciBleHBvcnRWYWx1ZXMgPSAoX2EgPSB0aGlzLmdldEV4cG9ydFZhbHVlcygpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGV4cG9ydFZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZXhwb3J0VmFsID0gZXhwb3J0VmFsdWVzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKGV4cG9ydFZhbC5kZWNvZGVUZXh0KCkgPT09IG9wdFRleHQpXG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nSWR4ID0gaWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBPcHQgPSB0aGlzLk9wdCgpO1xuICAgICAgICBPcHQucHVzaChvcHQpO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdJZHggIT09IG51bGwgJiYgZXhpc3RpbmdJZHggIT09IHZvaWQgMCA/IGV4aXN0aW5nSWR4IDogT3B0LnNpemUoKSAtIDE7XG4gICAgfTtcbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5hZGRXaWRnZXRXaXRoT3B0ID0gZnVuY3Rpb24gKHdpZGdldCwgb3B0LCB1c2VFeGlzdGluZ09wdElkeCkge1xuICAgICAgICB2YXIgb3B0SWR4ID0gdGhpcy5hZGRPcHQob3B0LCB1c2VFeGlzdGluZ09wdElkeCk7XG4gICAgICAgIHZhciBhcFN0YXRlVmFsdWUgPSBQREZOYW1lLm9mKFN0cmluZyhvcHRJZHgpKTtcbiAgICAgICAgdGhpcy5hZGRXaWRnZXQod2lkZ2V0KTtcbiAgICAgICAgcmV0dXJuIGFwU3RhdGVWYWx1ZTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvQnV0dG9uO1xufShQREZBY3JvVGVybWluYWwpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9CdXR0b247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvQnV0dG9uLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9CdXR0b24gZnJvbSBcIi4vUERGQWNyb0J1dHRvblwiO1xuaW1wb3J0IHsgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGQWNyb0NoZWNrQm94ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvQ2hlY2tCb3gsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb0NoZWNrQm94KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9DaGVja0JveC5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgb25WYWx1ZSA9IChfYSA9IHRoaXMuZ2V0T25WYWx1ZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBQREZOYW1lLm9mKCdZZXMnKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBvblZhbHVlICYmIHZhbHVlICE9PSBQREZOYW1lLm9mKCdPZmYnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdWJyksIHZhbHVlKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB3aWRnZXQuZ2V0T25WYWx1ZSgpID09PSB2YWx1ZSA/IHZhbHVlIDogUERGTmFtZS5vZignT2ZmJyk7XG4gICAgICAgICAgICB3aWRnZXQuc2V0QXBwZWFyYW5jZVN0YXRlKHN0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQWNyb0NoZWNrQm94LnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHYgPSB0aGlzLlYoKTtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQREZOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIHJldHVybiBQREZOYW1lLm9mKCdPZmYnKTtcbiAgICB9O1xuICAgIFBERkFjcm9DaGVja0JveC5wcm90b3R5cGUuZ2V0T25WYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuZ2V0V2lkZ2V0cygpWzBdO1xuICAgICAgICByZXR1cm4gd2lkZ2V0ID09PSBudWxsIHx8IHdpZGdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2lkZ2V0LmdldE9uVmFsdWUoKTtcbiAgICB9O1xuICAgIFBERkFjcm9DaGVja0JveC5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvQ2hlY2tCb3goZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9DaGVja0JveC5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnQnRuJyxcbiAgICAgICAgICAgIEtpZHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0NoZWNrQm94KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0NoZWNrQm94O1xufShQREZBY3JvQnV0dG9uKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvQ2hlY2tCb3g7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvQ2hlY2tCb3guanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQWNyb1Rlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9UZXJtaW5hbFwiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCB7IEFjcm9DaG9pY2VGbGFncyB9IGZyb20gXCIuL2ZsYWdzXCI7XG5pbXBvcnQgeyBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvciwgTXVsdGlTZWxlY3RWYWx1ZUVycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZBY3JvQ2hvaWNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvQ2hvaWNlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9DaG9pY2UoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUuc2V0VmFsdWVzID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICBpZiAodGhpcy5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5Db21ibykgJiZcbiAgICAgICAgICAgICF0aGlzLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLkVkaXQpICYmXG4gICAgICAgICAgICAhdGhpcy52YWx1ZXNBcmVWYWxpZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdWJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1YnKSwgdmFsdWVzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5NdWx0aVNlbGVjdCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTXVsdGlTZWxlY3RWYWx1ZUVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1YnKSwgdGhpcy5kaWN0LmNvbnRleHQub2JqKHZhbHVlcykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRJbmRpY2VzKHZhbHVlcyk7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hvaWNlLnByb3RvdHlwZS52YWx1ZXNBcmVWYWxpZCA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoaWR4LCBsZW4pIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSB2YWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuZmluZChmdW5jdGlvbiAobykgeyByZXR1cm4gdmFsID09PSAoby5kaXNwbGF5IHx8IG8udmFsdWUpLmRlY29kZVRleHQoKTsgfSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHN0YXRlXzEgPSBfbG9vcF8xKGlkeCwgbGVuKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RhdGVfMSA9PT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGVfMS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIFBERkFjcm9DaG9pY2UucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGVkSW5kaWNlcyA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgaW5kaWNlcyA9IG5ldyBBcnJheSh2YWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICAgICAgICB2YXIgX2xvb3BfMiA9IGZ1bmN0aW9uIChpZHgsIGxlbikge1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSB2YWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCk7XG4gICAgICAgICAgICAgICAgaW5kaWNlc1tpZHhdID0gb3B0aW9ucy5maW5kSW5kZXgoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHZhbCA9PT0gKG8uZGlzcGxheSB8fCBvLnZhbHVlKS5kZWNvZGVUZXh0KCk7IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICBfbG9vcF8yKGlkeCwgbGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignSScpLCB0aGlzLmRpY3QuY29udGV4dC5vYmooaW5kaWNlcy5zb3J0KCkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignSScpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdiA9IHRoaXMuVigpO1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCB2IGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIFt2XTtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdi5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2Lmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcbiAgICBQREZBY3JvQ2hvaWNlLnByb3RvdHlwZS5PcHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwTWF5YmUoUERGTmFtZS5vZignT3B0JyksIFBERlN0cmluZywgUERGSGV4U3RyaW5nLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hvaWNlLnByb3RvdHlwZS5zZXRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG5ld09wdCA9IG5ldyBBcnJheShvcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBvcHRpb25zW2lkeF0sIHZhbHVlID0gX2EudmFsdWUsIGRpc3BsYXkgPSBfYS5kaXNwbGF5O1xuICAgICAgICAgICAgbmV3T3B0W2lkeF0gPSB0aGlzLmRpY3QuY29udGV4dC5vYmooW3ZhbHVlLCBkaXNwbGF5IHx8IHZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdPcHQnKSwgdGhpcy5kaWN0LmNvbnRleHQub2JqKG5ld09wdCkpO1xuICAgIH07XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIE9wdCA9IHRoaXMuT3B0KCk7XG4gICAgICAgIC8vIE5vdCBzdXBwb3NlZCB0byBoYXBwZW4gLSBPcHQgX3Nob3VsZF8gYWx3YXlzIGJlIGBQREZBcnJheSB8IHVuZGVmaW5lZGBcbiAgICAgICAgaWYgKE9wdCBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBPcHQgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBbeyB2YWx1ZTogT3B0LCBkaXNwbGF5OiBPcHQgfV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9wdCBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBPcHQuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBPcHQubG9va3VwKGlkeCk7XG4gICAgICAgICAgICAgICAgLy8gSWYgYGl0ZW1gIGlzIGEgc3RyaW5nLCB1c2UgdGhhdCBhcyBib3RoIHRoZSBleHBvcnQgYW5kIHRleHQgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBpdGVtIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKHsgdmFsdWU6IGl0ZW0sIGRpc3BsYXk6IGl0ZW0gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIGBpdGVtYCBpcyBhbiBhcnJheSBvZiBvbmUsIHRyZWF0IGl0IHRoZSBzYW1lIGFzIGp1c3QgYSBzdHJpbmcsXG4gICAgICAgICAgICAgICAgLy8gaWYgaXQncyBhbiBhcnJheSBvZiB0d28gdGhlbiBgaXRlbVswXWAgaXMgdGhlIGV4cG9ydCB2YWx1ZSBhbmRcbiAgICAgICAgICAgICAgICAvLyBgaXRlbVsxXWAgaXMgdGhlIHRleHQgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnNpemUoKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IGl0ZW0ubG9va3VwKDAsIFBERlN0cmluZywgUERGSGV4U3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWNvbmQgPSBpdGVtLmxvb2t1cE1heWJlKDEsIFBERlN0cmluZywgUERGSGV4U3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKHsgdmFsdWU6IGZpcnN0LCBkaXNwbGF5OiBzZWNvbmQgfHwgZmlyc3QgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvQ2hvaWNlO1xufShQREZBY3JvVGVybWluYWwpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9DaG9pY2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvQ2hvaWNlLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkFjcm9DaG9pY2UgZnJvbSBcIi4vUERGQWNyb0Nob2ljZVwiO1xuaW1wb3J0IHsgQWNyb0Nob2ljZUZsYWdzIH0gZnJvbSBcIi4vZmxhZ3NcIjtcbnZhciBQREZBY3JvQ29tYm9Cb3ggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9Db21ib0JveCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvQ29tYm9Cb3goKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb0NvbWJvQm94LmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9Db21ib0JveChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgUERGQWNyb0NvbWJvQm94LmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgRlQ6ICdDaCcsXG4gICAgICAgICAgICBGZjogQWNyb0Nob2ljZUZsYWdzLkNvbWJvLFxuICAgICAgICAgICAgS2lkczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvQ29tYm9Cb3goZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvQ29tYm9Cb3g7XG59KFBERkFjcm9DaG9pY2UpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9Db21ib0JveDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9Db21ib0JveC5qcy5tYXAiLCJpbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgeyBmaW5kTGFzdE1hdGNoIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBNaXNzaW5nREFFbnRyeUVycm9yLCBNaXNzaW5nVGZPcGVyYXRvckVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuLy8gRXhhbXBsZXM6XG4vLyAgIGAvSGVsdiAxMiBUZmAgLT4gWydIZWx2JywgJzEyJ11cbi8vICAgYC9IZUJvIDguMDAgVGZgIC0+IFsnSGVCbycsICc4LjAwJ11cbi8vICAgYC9IZUJvIFRmYCAtPiBbJ0hlQm8nLCB1bmRlZmluZWRdXG52YXIgdGZSZWdleCA9IC9cXC8oW15cXDBcXHRcXG5cXGZcXHJcXCBdKylbXFwwXFx0XFxuXFxmXFxyXFwgXSooXFxkKlxcLlxcZCt8XFxkKyk/W1xcMFxcdFxcblxcZlxcclxcIF0rVGYvO1xudmFyIFBERkFjcm9GaWVsZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZBY3JvRmllbGQoZGljdCwgcmVmKSB7XG4gICAgICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgIH1cbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLlQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwTWF5YmUoUERGTmFtZS5vZignVCcpLCBQREZTdHJpbmcsIFBERkhleFN0cmluZyk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLkZmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbnVtYmVyT3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUub2YoJ0ZmJykpO1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmNvbnRleHQubG9va3VwTWF5YmUobnVtYmVyT3JSZWYsIFBERk51bWJlcik7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLlYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZU9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLm9mKCdWJykpO1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmNvbnRleHQubG9va3VwKHZhbHVlT3JSZWYpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5LaWRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ0tpZHMnKSwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgLy8gUGFyZW50KCk6IFBERkRpY3QgfCB1bmRlZmluZWQge1xuICAgIC8vICAgcmV0dXJuIHRoaXMuZGljdC5sb29rdXBNYXliZShQREZOYW1lLm9mKCdQYXJlbnQnKSwgUERGRGljdCk7XG4gICAgLy8gfVxuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuREEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignREEnKSk7XG4gICAgICAgIGlmIChkYSBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBkYSBpbnN0YW5jZW9mIFBERkhleFN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBkYTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0S2lkcyA9IGZ1bmN0aW9uIChraWRzKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignS2lkcycpLCB0aGlzLmRpY3QuY29udGV4dC5vYmooa2lkcykpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5nZXRQYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGNvbnN0IHBhcmVudCA9IHRoaXMuUGFyZW50KCk7XG4gICAgICAgIC8vIGlmICghcGFyZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAvLyByZXR1cm4gbmV3IFBERkFjcm9GaWVsZChwYXJlbnQpO1xuICAgICAgICB2YXIgcGFyZW50UmVmID0gdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdQYXJlbnQnKSk7XG4gICAgICAgIGlmIChwYXJlbnRSZWYgaW5zdGFuY2VvZiBQREZSZWYpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignUGFyZW50JyksIFBERkRpY3QpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvRmllbGQocGFyZW50XzEsIHBhcmVudFJlZik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0UGFyZW50ID0gZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignUGFyZW50JykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1BhcmVudCcpLCBwYXJlbnQpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFBhcnRpYWxOYW1lKCk7XG4gICAgICAgIHJldHVybiBwYXJlbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgKyBcIi5cIiArIHRoaXMuZ2V0UGFydGlhbE5hbWUoKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuZ2V0UGFydGlhbE5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuVCgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXRQYXJ0aWFsTmFtZSA9IGZ1bmN0aW9uIChwYXJ0aWFsTmFtZSkge1xuICAgICAgICBpZiAoIXBhcnRpYWxOYW1lKVxuICAgICAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdUJykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1QnKSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KHBhcnRpYWxOYW1lKSk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldERlZmF1bHRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdEQScpLCBQREZTdHJpbmcub2YoYXBwZWFyYW5jZSkpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5nZXREZWZhdWx0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIERBID0gdGhpcy5EQSgpO1xuICAgICAgICBpZiAoREEgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBEQS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERBID09PSBudWxsIHx8IERBID09PSB2b2lkIDAgPyB2b2lkIDAgOiBEQS5hc1N0cmluZygpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uIChmb250U2l6ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBuYW1lID0gKF9hID0gdGhpcy5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgICAgIHZhciBkYSA9IHRoaXMuZ2V0RGVmYXVsdEFwcGVhcmFuY2UoKTtcbiAgICAgICAgaWYgKCFkYSlcbiAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nREFFbnRyeUVycm9yKG5hbWUpO1xuICAgICAgICB2YXIgZGFNYXRjaCA9IGZpbmRMYXN0TWF0Y2goZGEsIHRmUmVnZXgpO1xuICAgICAgICBpZiAoIWRhTWF0Y2gubWF0Y2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1RmT3BlcmF0b3JFcnJvcihuYW1lKTtcbiAgICAgICAgdmFyIGRhU3RhcnQgPSBkYS5zbGljZSgwLCBkYU1hdGNoLnBvcyAtIGRhTWF0Y2gubWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgdmFyIGRhRW5kID0gZGFNYXRjaC5wb3MgPD0gZGEubGVuZ3RoID8gZGEuc2xpY2UoZGFNYXRjaC5wb3MpIDogJyc7XG4gICAgICAgIHZhciBmb250TmFtZSA9IGRhTWF0Y2gubWF0Y2hbMV07XG4gICAgICAgIHZhciBtb2RpZmllZERhID0gZGFTdGFydCArIFwiIC9cIiArIGZvbnROYW1lICsgXCIgXCIgKyBmb250U2l6ZSArIFwiIFRmIFwiICsgZGFFbmQ7XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdEFwcGVhcmFuY2UobW9kaWZpZWREYSk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmdldEZsYWdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5GZigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0RmxhZ3MgPSBmdW5jdGlvbiAoZmxhZ3MpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdGZicpLCBQREZOdW1iZXIub2YoZmxhZ3MpKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuaGFzRmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBmbGFncyA9IHRoaXMuZ2V0RmxhZ3MoKTtcbiAgICAgICAgcmV0dXJuIChmbGFncyAmIGZsYWcpICE9PSAwO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXRGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5nZXRGbGFncygpO1xuICAgICAgICB0aGlzLnNldEZsYWdzKGZsYWdzIHwgZmxhZyk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmNsZWFyRmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBmbGFncyA9IHRoaXMuZ2V0RmxhZ3MoKTtcbiAgICAgICAgdGhpcy5zZXRGbGFncyhmbGFncyAmIH5mbGFnKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0RmxhZ1RvID0gZnVuY3Rpb24gKGZsYWcsIGVuYWJsZSkge1xuICAgICAgICBpZiAoZW5hYmxlKVxuICAgICAgICAgICAgdGhpcy5zZXRGbGFnKGZsYWcpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmNsZWFyRmxhZyhmbGFnKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgYXR0cmlidXRlO1xuICAgICAgICB0aGlzLmFzY2VuZChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUpXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlID0gbm9kZS5kaWN0LmdldChuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGU7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmFzY2VuZCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgICAgIHZpc2l0b3IodGhpcyk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICBpZiAocGFyZW50KVxuICAgICAgICAgICAgcGFyZW50LmFzY2VuZCh2aXNpdG9yKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvRmllbGQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb0ZpZWxkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0ZpZWxkLmpzLm1hcCIsImltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9Ob25UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvTm9uVGVybWluYWxcIjtcbmltcG9ydCB7IGNyZWF0ZVBERkFjcm9GaWVsZCwgY3JlYXRlUERGQWNyb0ZpZWxkcywgfSBmcm9tIFwiLi91dGlsc1wiO1xudmFyIFBERkFjcm9Gb3JtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkFjcm9Gb3JtKGRpY3QpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB9XG4gICAgUERGQWNyb0Zvcm0ucHJvdG90eXBlLkZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignRmllbGRzJykpO1xuICAgICAgICBpZiAoZmllbGRzIGluc3RhbmNlb2YgUERGQXJyYXkpXG4gICAgICAgICAgICByZXR1cm4gZmllbGRzO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQWNyb0Zvcm0ucHJvdG90eXBlLmdldEZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEZpZWxkcyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5GaWVsZHM7XG4gICAgICAgIHZhciBmaWVsZHMgPSBuZXcgQXJyYXkoRmllbGRzLnNpemUoKSk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEZpZWxkcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciByZWYgPSBGaWVsZHMuZ2V0KGlkeCk7XG4gICAgICAgICAgICB2YXIgZGljdCA9IEZpZWxkcy5sb29rdXAoaWR4LCBQREZEaWN0KTtcbiAgICAgICAgICAgIGZpZWxkc1tpZHhdID0gW2NyZWF0ZVBERkFjcm9GaWVsZChkaWN0LCByZWYpLCByZWZdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfTtcbiAgICBQREZBY3JvRm9ybS5wcm90b3R5cGUuZ2V0QWxsRmllbGRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYWxsRmllbGRzID0gW107XG4gICAgICAgIHZhciBwdXNoRmllbGRzID0gZnVuY3Rpb24gKGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKCFmaWVsZHMpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZmllbGRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpZHhdO1xuICAgICAgICAgICAgICAgIGFsbEZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRNb2RlbCA9IGZpZWxkWzBdO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZE1vZGVsIGluc3RhbmNlb2YgUERGQWNyb05vblRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hGaWVsZHMoY3JlYXRlUERGQWNyb0ZpZWxkcyhmaWVsZE1vZGVsLktpZHMoKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcHVzaEZpZWxkcyh0aGlzLmdldEZpZWxkcygpKTtcbiAgICAgICAgcmV0dXJuIGFsbEZpZWxkcztcbiAgICB9O1xuICAgIFBERkFjcm9Gb3JtLnByb3RvdHlwZS5hZGRGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICB2YXIgRmllbGRzID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkZpZWxkcztcbiAgICAgICAgRmllbGRzID09PSBudWxsIHx8IEZpZWxkcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogRmllbGRzLnB1c2goZmllbGQpO1xuICAgIH07XG4gICAgUERGQWNyb0Zvcm0ucHJvdG90eXBlLnJlbW92ZUZpZWxkID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBmaWVsZC5nZXRQYXJlbnQoKTtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHBhcmVudCA9PT0gdW5kZWZpbmVkID8gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkZpZWxkcyA6IHBhcmVudC5LaWRzKCk7XG4gICAgICAgIHZhciBpbmRleCA9IGZpZWxkcyA9PT0gbnVsbCB8fCBmaWVsZHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZpZWxkcy5pbmRleE9mKGZpZWxkLnJlZik7XG4gICAgICAgIGlmIChmaWVsZHMgPT09IHVuZGVmaW5lZCB8fCBpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmllZCB0byByZW1vdmUgaW5leGlzdGVudCBmaWVsZCBcIiArIGZpZWxkLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZHMucmVtb3ZlKGluZGV4KTtcbiAgICAgICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkICYmIGZpZWxkcy5zaXplKCkgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRmllbGQocGFyZW50KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQWNyb0Zvcm0ucHJvdG90eXBlLm5vcm1hbGl6ZWRFbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgRmllbGRzID0gdGhpcy5GaWVsZHMoKTtcbiAgICAgICAgaWYgKCFGaWVsZHMpIHtcbiAgICAgICAgICAgIEZpZWxkcyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihbXSk7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0ZpZWxkcycpLCBGaWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IEZpZWxkczogRmllbGRzIH07XG4gICAgfTtcbiAgICBQREZBY3JvRm9ybS5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0KSB7IHJldHVybiBuZXcgUERGQWNyb0Zvcm0oZGljdCk7IH07XG4gICAgUERGQWNyb0Zvcm0uY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7IEZpZWxkczogW10gfSk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0Zvcm0oZGljdCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0Zvcm07XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb0Zvcm07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvRm9ybS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBY3JvQ2hvaWNlIGZyb20gXCIuL1BERkFjcm9DaG9pY2VcIjtcbnZhciBQREZBY3JvTGlzdEJveCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb0xpc3RCb3gsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb0xpc3RCb3goKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb0xpc3RCb3guZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0xpc3RCb3goZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9MaXN0Qm94LmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgRlQ6ICdDaCcsXG4gICAgICAgICAgICBLaWRzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGRpY3QpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9MaXN0Qm94KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb0xpc3RCb3g7XG59KFBERkFjcm9DaG9pY2UpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9MaXN0Qm94O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0xpc3RCb3guanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQWNyb0ZpZWxkIGZyb20gXCIuL1BERkFjcm9GaWVsZFwiO1xudmFyIFBERkFjcm9Ob25UZXJtaW5hbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb05vblRlcm1pbmFsLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9Ob25UZXJtaW5hbCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvTm9uVGVybWluYWwucHJvdG90eXBlLmFkZEZpZWxkID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLktpZHM7XG4gICAgICAgIEtpZHMgPT09IG51bGwgfHwgS2lkcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogS2lkcy5wdXNoKGZpZWxkKTtcbiAgICB9O1xuICAgIFBERkFjcm9Ob25UZXJtaW5hbC5wcm90b3R5cGUubm9ybWFsaXplZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIGlmICghS2lkcykge1xuICAgICAgICAgICAgS2lkcyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihbXSk7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0tpZHMnKSwgS2lkcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgS2lkczogS2lkcyB9O1xuICAgIH07XG4gICAgUERGQWNyb05vblRlcm1pbmFsLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9Ob25UZXJtaW5hbChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgUERGQWNyb05vblRlcm1pbmFsLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe30pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvTm9uVGVybWluYWwoZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvTm9uVGVybWluYWw7XG59KFBERkFjcm9GaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb05vblRlcm1pbmFsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb05vblRlcm1pbmFsLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkFjcm9CdXR0b24gZnJvbSBcIi4vUERGQWNyb0J1dHRvblwiO1xuaW1wb3J0IHsgQWNyb0J1dHRvbkZsYWdzIH0gZnJvbSBcIi4vZmxhZ3NcIjtcbnZhciBQREZBY3JvUHVzaEJ1dHRvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb1B1c2hCdXR0b24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb1B1c2hCdXR0b24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb1B1c2hCdXR0b24uZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1B1c2hCdXR0b24oZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9QdXNoQnV0dG9uLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgRlQ6ICdCdG4nLFxuICAgICAgICAgICAgRmY6IEFjcm9CdXR0b25GbGFncy5QdXNoQnV0dG9uLFxuICAgICAgICAgICAgS2lkczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvUHVzaEJ1dHRvbihkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9QdXNoQnV0dG9uO1xufShQREZBY3JvQnV0dG9uKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvUHVzaEJ1dHRvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9QdXNoQnV0dG9uLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9CdXR0b24gZnJvbSBcIi4vUERGQWNyb0J1dHRvblwiO1xuaW1wb3J0IHsgQWNyb0J1dHRvbkZsYWdzIH0gZnJvbSBcIi4vZmxhZ3NcIjtcbmltcG9ydCB7IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkFjcm9SYWRpb0J1dHRvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb1JhZGlvQnV0dG9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9SYWRpb0J1dHRvbigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvUmFkaW9CdXR0b24ucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBvblZhbHVlcyA9IHRoaXMuZ2V0T25WYWx1ZXMoKTtcbiAgICAgICAgaWYgKCFvblZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkgJiYgdmFsdWUgIT09IFBERk5hbWUub2YoJ09mZicpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1YnKSwgdmFsdWUpO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHdpZGdldC5nZXRPblZhbHVlKCkgPT09IHZhbHVlID8gdmFsdWUgOiBQREZOYW1lLm9mKCdPZmYnKTtcbiAgICAgICAgICAgIHdpZGdldC5zZXRBcHBlYXJhbmNlU3RhdGUoc3RhdGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZBY3JvUmFkaW9CdXR0b24ucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdiA9IHRoaXMuVigpO1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIFBERk5hbWUpXG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgcmV0dXJuIFBERk5hbWUub2YoJ09mZicpO1xuICAgIH07XG4gICAgUERGQWNyb1JhZGlvQnV0dG9uLnByb3RvdHlwZS5nZXRPblZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmdldFdpZGdldHMoKTtcbiAgICAgICAgdmFyIG9uVmFsdWVzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgb25WYWx1ZSA9IHdpZGdldHNbaWR4XS5nZXRPblZhbHVlKCk7XG4gICAgICAgICAgICBpZiAob25WYWx1ZSlcbiAgICAgICAgICAgICAgICBvblZhbHVlcy5wdXNoKG9uVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvblZhbHVlcztcbiAgICB9O1xuICAgIFBERkFjcm9SYWRpb0J1dHRvbi5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvUmFkaW9CdXR0b24oZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9SYWRpb0J1dHRvbi5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnQnRuJyxcbiAgICAgICAgICAgIEZmOiBBY3JvQnV0dG9uRmxhZ3MuUmFkaW8sXG4gICAgICAgICAgICBLaWRzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGRpY3QpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9SYWRpb0J1dHRvbihkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9SYWRpb0J1dHRvbjtcbn0oUERGQWNyb0J1dHRvbikpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb1JhZGlvQnV0dG9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb1JhZGlvQnV0dG9uLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkFjcm9UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvVGVybWluYWxcIjtcbnZhciBQREZBY3JvU2lnbmF0dXJlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvU2lnbmF0dXJlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9TaWduYXR1cmUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb1NpZ25hdHVyZS5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvU2lnbmF0dXJlKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb1NpZ25hdHVyZTtcbn0oUERGQWNyb1Rlcm1pbmFsKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvU2lnbmF0dXJlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb1NpZ25hdHVyZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBY3JvRmllbGQgZnJvbSBcIi4vUERGQWNyb0ZpZWxkXCI7XG5pbXBvcnQgUERGV2lkZ2V0QW5ub3RhdGlvbiBmcm9tIFwiLi4vYW5ub3RhdGlvbi9QREZXaWRnZXRBbm5vdGF0aW9uXCI7XG5pbXBvcnQgeyBJbmRleE91dE9mQm91bmRzRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGQWNyb1Rlcm1pbmFsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvVGVybWluYWwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb1Rlcm1pbmFsKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9UZXJtaW5hbC5wcm90b3R5cGUuRlQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBuYW1lT3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUub2YoJ0ZUJykpO1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmNvbnRleHQubG9va3VwKG5hbWVPclJlZiwgUERGTmFtZSk7XG4gICAgfTtcbiAgICBQREZBY3JvVGVybWluYWwucHJvdG90eXBlLmdldFdpZGdldHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBraWREaWN0cyA9IHRoaXMuS2lkcygpO1xuICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGl0c2VsZiBhIHdpZGdldFxuICAgICAgICBpZiAoIWtpZERpY3RzKVxuICAgICAgICAgICAgcmV0dXJuIFtQREZXaWRnZXRBbm5vdGF0aW9uLmZyb21EaWN0KHRoaXMuZGljdCldO1xuICAgICAgICAvLyBUaGlzIGZpZWxkJ3Mga2lkcyBhcmUgaXRzIHdpZGdldHNcbiAgICAgICAgdmFyIHdpZGdldHMgPSBuZXcgQXJyYXkoa2lkRGljdHMuc2l6ZSgpKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0ga2lkRGljdHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZGljdCA9IGtpZERpY3RzLmxvb2t1cChpZHgsIFBERkRpY3QpO1xuICAgICAgICAgICAgd2lkZ2V0c1tpZHhdID0gUERGV2lkZ2V0QW5ub3RhdGlvbi5mcm9tRGljdChkaWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkZ2V0cztcbiAgICB9O1xuICAgIFBERkFjcm9UZXJtaW5hbC5wcm90b3R5cGUuYWRkV2lkZ2V0ID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5LaWRzO1xuICAgICAgICBLaWRzLnB1c2gocmVmKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXJtaW5hbC5wcm90b3R5cGUucmVtb3ZlV2lkZ2V0ID0gZnVuY3Rpb24gKGlkeCkge1xuICAgICAgICB2YXIga2lkRGljdHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgaWYgKCFraWREaWN0cykge1xuICAgICAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyBpdHNlbGYgYSB3aWRnZXRcbiAgICAgICAgICAgIGlmIChpZHggIT09IDApXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFcnJvcihpZHgsIDAsIDApO1xuICAgICAgICAgICAgdGhpcy5zZXRLaWRzKFtdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoaXMgZmllbGQncyBraWRzIGFyZSBpdHMgd2lkZ2V0c1xuICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID4ga2lkRGljdHMuc2l6ZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFcnJvcihpZHgsIDAsIGtpZERpY3RzLnNpemUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBraWREaWN0cy5yZW1vdmUoaWR4KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQWNyb1Rlcm1pbmFsLnByb3RvdHlwZS5ub3JtYWxpemVkRW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgLy8gSWYgdGhpcyBmaWVsZCBpcyBpdHNlbGYgYSB3aWRnZXQgKGJlY2F1c2UgaXQgd2FzIG9ubHkgcmVuZGVyZWQgb25jZSBpblxuICAgICAgICAvLyB0aGUgZG9jdW1lbnQsIHNvIHRoZSBmaWVsZCBhbmQgd2lkZ2V0IHByb3BlcnRpZXMgd2VyZSBtZXJnZWQpIHRoZW4gd2VcbiAgICAgICAgLy8gYWRkIGl0c2VsZiB0byB0aGUgYEtpZHNgIGFycmF5LiBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gdHJ5XG4gICAgICAgIC8vIHNwbGl0dGluZyBhcGFydCB0aGUgd2lkZ2V0IHByb3BlcnRpZXMgYW5kIGNyZWF0aW5nIGEgc2VwYXJhdGUgb2JqZWN0XG4gICAgICAgIC8vIGZvciB0aGVtLlxuICAgICAgICBpZiAoIUtpZHMpIHtcbiAgICAgICAgICAgIEtpZHMgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooW3RoaXMucmVmXSk7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0tpZHMnKSwgS2lkcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgS2lkczogS2lkcyB9O1xuICAgIH07XG4gICAgUERGQWNyb1Rlcm1pbmFsLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9UZXJtaW5hbChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9UZXJtaW5hbDtcbn0oUERGQWNyb0ZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvVGVybWluYWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvVGVybWluYWwuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQWNyb1Rlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9UZXJtaW5hbFwiO1xudmFyIFBERkFjcm9UZXh0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvVGV4dCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuTWF4TGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWF4TGVuID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdNYXhMZW4nKSk7XG4gICAgICAgIGlmIChtYXhMZW4gaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gbWF4TGVuO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLlEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBxID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdRJykpO1xuICAgICAgICBpZiAocSBpbnN0YW5jZW9mIFBERk51bWJlcilcbiAgICAgICAgICAgIHJldHVybiBxO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLnNldE1heExlbmd0aCA9IGZ1bmN0aW9uIChtYXhMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdNYXhMZW4nKSwgUERGTnVtYmVyLm9mKG1heExlbmd0aCkpO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLnJlbW92ZU1heExlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdNYXhMZW4nKSk7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuZ2V0TWF4TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLk1heExlbigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5zZXRRdWFkZGluZyA9IGZ1bmN0aW9uIChxdWFkZGluZykge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1EnKSwgUERGTnVtYmVyLm9mKHF1YWRkaW5nKSk7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuZ2V0UXVhZGRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuUSgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1YnKSwgdmFsdWUpO1xuICAgICAgICAvLyBjb25zdCB3aWRnZXRzID0gdGhpcy5nZXRXaWRnZXRzKCk7XG4gICAgICAgIC8vIGZvciAobGV0IGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIC8vICAgY29uc3Qgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAvLyAgIGNvbnN0IHN0YXRlID0gd2lkZ2V0LmdldE9uVmFsdWUoKSA9PT0gdmFsdWUgPyB2YWx1ZSA6IFBERk5hbWUub2YoJ09mZicpO1xuICAgICAgICAvLyAgIHdpZGdldC5zZXRBcHBlYXJhbmNlU3RhdGUoc3RhdGUpO1xuICAgICAgICAvLyB9XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUucmVtb3ZlVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignVicpKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHYgPSB0aGlzLlYoKTtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBQREZTdHJpbmcgfHwgdiBpbnN0YW5jZW9mIFBERkhleFN0cmluZylcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQuZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7IHJldHVybiBuZXcgUERGQWNyb1RleHQoZGljdCwgcmVmKTsgfTtcbiAgICBQREZBY3JvVGV4dC5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIEZUOiAnVHgnLFxuICAgICAgICAgICAgS2lkczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvVGV4dChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9UZXh0O1xufShQREZBY3JvVGVybWluYWwpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9UZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb1RleHQuanMubWFwIiwidmFyIGZsYWcgPSBmdW5jdGlvbiAoYml0SW5kZXgpIHsgcmV0dXJuIDEgPDwgYml0SW5kZXg7IH07XG4vKiogRnJvbSBQREYgc3BlYyB0YWJsZSAyMjEgKi9cbmV4cG9ydCB2YXIgQWNyb0ZpZWxkRmxhZ3M7XG4oZnVuY3Rpb24gKEFjcm9GaWVsZEZsYWdzKSB7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgdXNlciBtYXkgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLiBBbnkgYXNzb2NpYXRlZFxuICAgICAqIHdpZGdldCBhbm5vdGF0aW9ucyB3aWxsIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyOyB0aGF0IGlzLCB0aGV5IHdpbGwgbm90XG4gICAgICogcmVzcG9uZCB0byBtb3VzZSBjbGlja3Mgb3IgY2hhbmdlIHRoZWlyIGFwcGVhcmFuY2UgaW4gcmVzcG9uc2UgdG8gbW91c2VcbiAgICAgKiBtb3Rpb25zLiBUaGlzIGZsYWcgaXMgdXNlZnVsIGZvciBmaWVsZHMgd2hvc2UgdmFsdWVzIGFyZSBjb21wdXRlZCBvclxuICAgICAqIGltcG9ydGVkIGZyb20gYSBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBBY3JvRmllbGRGbGFnc1tBY3JvRmllbGRGbGFnc1tcIlJlYWRPbmx5XCJdID0gZmxhZygxIC0gMSldID0gXCJSZWFkT25seVwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIGhhdmUgYSB2YWx1ZSBhdCB0aGUgdGltZSBpdCBpcyBleHBvcnRlZCBieSBhXG4gICAgICogc3VibWl0LWZvcm0gYWN0aW9uIChzZWUgMTIuNy41LjIsIFwiU3VibWl0LUZvcm0gQWN0aW9uXCIpLlxuICAgICAqL1xuICAgIEFjcm9GaWVsZEZsYWdzW0Fjcm9GaWVsZEZsYWdzW1wiUmVxdWlyZWRcIl0gPSBmbGFnKDIgLSAxKV0gPSBcIlJlcXVpcmVkXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgbm90IGJlIGV4cG9ydGVkIGJ5IGEgc3VibWl0LWZvcm0gYWN0aW9uXG4gICAgICogKHNlZSAxMi43LjUuMiwgXCJTdWJtaXQtRm9ybSBBY3Rpb25cIikuXG4gICAgICovXG4gICAgQWNyb0ZpZWxkRmxhZ3NbQWNyb0ZpZWxkRmxhZ3NbXCJOb0V4cG9ydFwiXSA9IGZsYWcoMyAtIDEpXSA9IFwiTm9FeHBvcnRcIjtcbn0pKEFjcm9GaWVsZEZsYWdzIHx8IChBY3JvRmllbGRGbGFncyA9IHt9KSk7XG4vKiogRnJvbSBQREYgc3BlYyB0YWJsZSAyMjYgKi9cbmV4cG9ydCB2YXIgQWNyb0J1dHRvbkZsYWdzO1xuKGZ1bmN0aW9uIChBY3JvQnV0dG9uRmxhZ3MpIHtcbiAgICAvKipcbiAgICAgKiAoUmFkaW8gYnV0dG9ucyBvbmx5KSBJZiBzZXQsIGV4YWN0bHkgb25lIHJhZGlvIGJ1dHRvbiBzaGFsbCBiZSBzZWxlY3RlZCBhdFxuICAgICAqIGFsbCB0aW1lczsgc2VsZWN0aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnV0dG9uIGhhcyBubyBlZmZlY3QuIElmIGNsZWFyLFxuICAgICAqIGNsaWNraW5nIHRoZSBzZWxlY3RlZCBidXR0b24gZGVzZWxlY3RzIGl0LCBsZWF2aW5nIG5vIGJ1dHRvbiBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBBY3JvQnV0dG9uRmxhZ3NbQWNyb0J1dHRvbkZsYWdzW1wiTm9Ub2dnbGVUb09mZlwiXSA9IGZsYWcoMTUgLSAxKV0gPSBcIk5vVG9nZ2xlVG9PZmZcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHNldCBvZiByYWRpbyBidXR0b25zOyBpZiBjbGVhciwgdGhlIGZpZWxkIGlzIGEgY2hlY2tcbiAgICAgKiBib3guIFRoaXMgZmxhZyBtYXkgYmUgc2V0IG9ubHkgaWYgdGhlIFB1c2hidXR0b24gZmxhZyBpcyBjbGVhci5cbiAgICAgKi9cbiAgICBBY3JvQnV0dG9uRmxhZ3NbQWNyb0J1dHRvbkZsYWdzW1wiUmFkaW9cIl0gPSBmbGFnKDE2IC0gMSldID0gXCJSYWRpb1wiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgcHVzaGJ1dHRvbiB0aGF0IGRvZXMgbm90IHJldGFpbiBhIHBlcm1hbmVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBBY3JvQnV0dG9uRmxhZ3NbQWNyb0J1dHRvbkZsYWdzW1wiUHVzaEJ1dHRvblwiXSA9IGZsYWcoMTcgLSAxKV0gPSBcIlB1c2hCdXR0b25cIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGEgZ3JvdXAgb2YgcmFkaW8gYnV0dG9ucyB3aXRoaW4gYSByYWRpbyBidXR0b24gZmllbGQgdGhhdCB1c2UgdGhlXG4gICAgICogc2FtZSB2YWx1ZSBmb3IgdGhlIG9uIHN0YXRlIHdpbGwgdHVybiBvbiBhbmQgb2ZmIGluIHVuaXNvbjsgdGhhdCBpcyBpZiBvbmVcbiAgICAgKiBpcyBjaGVja2VkLCB0aGV5IGFyZSBhbGwgY2hlY2tlZC4gSWYgY2xlYXIsIHRoZSBidXR0b25zIGFyZSBtdXR1YWxseVxuICAgICAqIGV4Y2x1c2l2ZSAodGhlIHNhbWUgYmVoYXZpb3IgYXMgSFRNTCByYWRpbyBidXR0b25zKS5cbiAgICAgKi9cbiAgICBBY3JvQnV0dG9uRmxhZ3NbQWNyb0J1dHRvbkZsYWdzW1wiUmFkaW9zSW5Vbmlzb25cIl0gPSBmbGFnKDI2IC0gMSldID0gXCJSYWRpb3NJblVuaXNvblwiO1xufSkoQWNyb0J1dHRvbkZsYWdzIHx8IChBY3JvQnV0dG9uRmxhZ3MgPSB7fSkpO1xuLyoqIEZyb20gUERGIHNwZWMgdGFibGUgMjI4ICovXG5leHBvcnQgdmFyIEFjcm9UZXh0RmxhZ3M7XG4oZnVuY3Rpb24gKEFjcm9UZXh0RmxhZ3MpIHtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBtYXkgY29udGFpbiBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0OyBpZiBjbGVhciwgdGhlIGZpZWxkJ3NcbiAgICAgKiB0ZXh0IHNoYWxsIGJlIHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUgbGluZS5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJNdWx0aWxpbmVcIl0gPSBmbGFnKDEzIC0gMSldID0gXCJNdWx0aWxpbmVcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgZW50ZXJpbmcgYSBzZWN1cmUgcGFzc3dvcmQgdGhhdCBzaG91bGRcbiAgICAgKiBub3QgYmUgZWNob2VkIHZpc2libHkgdG8gdGhlIHNjcmVlbi4gQ2hhcmFjdGVycyB0eXBlZCBmcm9tIHRoZSBrZXlib2FyZFxuICAgICAqIHNoYWxsIGluc3RlYWQgYmUgZWNob2VkIGluIHNvbWUgdW5yZWFkYWJsZSBmb3JtLCBzdWNoIGFzIGFzdGVyaXNrcyBvclxuICAgICAqIGJ1bGxldCBjaGFyYWN0ZXJzLlxuICAgICAqID4gTk9URSAgIFRvIHByb3RlY3QgcGFzc3dvcmQgY29uZmlkZW50aWFsaXR5LCByZWFkZXJzIHNob3VsZCBuZXZlciBzdG9yZVxuICAgICAqID4gICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBmaWVsZCBpbiB0aGUgUERGIGZpbGUgaWYgdGhpcyBmbGFnIGlzIHNldC5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJQYXNzd29yZFwiXSA9IGZsYWcoMTQgLSAxKV0gPSBcIlBhc3N3b3JkXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCByZXByZXNlbnRzIHRoZSBwYXRobmFtZSBvZiBhIGZpbGVcbiAgICAgKiB3aG9zZSBjb250ZW50cyBzaGFsbCBiZSBzdWJtaXR0ZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJGaWxlU2VsZWN0XCJdID0gZmxhZygyMSAtIDEpXSA9IFwiRmlsZVNlbGVjdFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGwtY2hlY2tlZC5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJEb05vdFNwZWxsQ2hlY2tcIl0gPSBmbGFnKDIzIC0gMSldID0gXCJEb05vdFNwZWxsQ2hlY2tcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBub3Qgc2Nyb2xsIChob3Jpem9udGFsbHkgZm9yIHNpbmdsZS1saW5lIGZpZWxkcyxcbiAgICAgKiB2ZXJ0aWNhbGx5IGZvciBtdWx0aXBsZS1saW5lIGZpZWxkcykgdG8gYWNjb21tb2RhdGUgbW9yZSB0ZXh0IHRoYW4gZml0c1xuICAgICAqIHdpdGhpbiBpdHMgYW5ub3RhdGlvbiByZWN0YW5nbGUuIE9uY2UgdGhlIGZpZWxkIGlzIGZ1bGwsIG5vIGZ1cnRoZXIgdGV4dFxuICAgICAqIHNoYWxsIGJlIGFjY2VwdGVkIGZvciBpbnRlcmFjdGl2ZSBmb3JtIGZpbGxpbmc7IGZvciBub24taW50ZXJhY3RpdmUgZm9ybVxuICAgICAqIGZpbGxpbmcsIHRoZSBmaWxsZXIgc2hvdWxkIHRha2UgY2FyZSBub3QgdG8gYWRkIG1vcmUgY2hhcmFjdGVyIHRoYW4gd2lsbFxuICAgICAqIHZpc2libHkgZml0IGluIHRoZSBkZWZpbmVkIGFyZWEuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiRG9Ob3RTY3JvbGxcIl0gPSBmbGFnKDI0IC0gMSldID0gXCJEb05vdFNjcm9sbFwiO1xuICAgIC8qKlxuICAgICAqIE1heSBiZSBzZXQgb25seSBpZiB0aGUgTWF4TGVuIGVudHJ5IGlzIHByZXNlbnQgaW4gdGhlIHRleHQgZmllbGQgZGljdGlvbmFyeVxuICAgICAqIChzZWUgVGFibGUgMjI5KSBhbmQgaWYgdGhlIE11bHRpbGluZSwgUGFzc3dvcmQsIGFuZCBGaWxlU2VsZWN0IGZsYWdzIGFyZVxuICAgICAqIGNsZWFyLiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBiZSBhdXRvbWF0aWNhbGx5IGRpdmlkZWQgaW50byBhcyBtYW55XG4gICAgICogZXF1YWxseSBzcGFjZWQgcG9zaXRpb25zLCBvciBjb21icywgYXMgdGhlIHZhbHVlIG9mIE1heExlbiwgYW5kIHRoZSB0ZXh0XG4gICAgICogaXMgbGFpZCBvdXQgaW50byB0aG9zZSBjb21icy5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJDb21iXCJdID0gZmxhZygyNSAtIDEpXSA9IFwiQ29tYlwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgc2hhbGwgYmUgYSByaWNoIHRleHQgc3RyaW5nXG4gICAgICogKHNlZSAxMi43LjMuNCwgXCJSaWNoIFRleHQgU3RyaW5nc1wiKS4gSWYgdGhlIGZpZWxkIGhhcyBhIHZhbHVlLCB0aGUgUlZcbiAgICAgKiBlbnRyeSBvZiB0aGUgZmllbGQgZGljdGlvbmFyeSAoVGFibGUgMjIyKSBzaGFsbCBzcGVjaWZ5IHRoZSByaWNoIHRleHRcbiAgICAgKiBzdHJpbmcuXG4gICAgICovXG4gICAgQWNyb1RleHRGbGFnc1tBY3JvVGV4dEZsYWdzW1wiUmljaFRleHRcIl0gPSBmbGFnKDI2IC0gMSldID0gXCJSaWNoVGV4dFwiO1xufSkoQWNyb1RleHRGbGFncyB8fCAoQWNyb1RleHRGbGFncyA9IHt9KSk7XG4vKiogRnJvbSBQREYgc3BlYyB0YWJsZSAyMzAgKi9cbmV4cG9ydCB2YXIgQWNyb0Nob2ljZUZsYWdzO1xuKGZ1bmN0aW9uIChBY3JvQ2hvaWNlRmxhZ3MpIHtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIGNvbWJvIGJveDsgaWYgY2xlYXIsIHRoZSBmaWVsZCBpcyBhIGxpc3QgYm94LlxuICAgICAqL1xuICAgIEFjcm9DaG9pY2VGbGFnc1tBY3JvQ2hvaWNlRmxhZ3NbXCJDb21ib1wiXSA9IGZsYWcoMTggLSAxKV0gPSBcIkNvbWJvXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgY29tYm8gYm94IHNoYWxsIGluY2x1ZGUgYW4gZWRpdGFibGUgdGV4dCBib3ggYXMgd2VsbCBhcyBhXG4gICAgICogZHJvcC1kb3duIGxpc3Q7IGlmIGNsZWFyLCBpdCBzaGFsbCBpbmNsdWRlIG9ubHkgYSBkcm9wLWRvd24gbGlzdC4gVGhpc1xuICAgICAqIGZsYWcgc2hhbGwgYmUgdXNlZCBvbmx5IGlmIHRoZSBDb21ibyBmbGFnIGlzIHNldC5cbiAgICAgKi9cbiAgICBBY3JvQ2hvaWNlRmxhZ3NbQWNyb0Nob2ljZUZsYWdzW1wiRWRpdFwiXSA9IGZsYWcoMTkgLSAxKV0gPSBcIkVkaXRcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCdzIG9wdGlvbiBpdGVtcyBzaGFsbCBiZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuIFRoaXMgZmxhZ1xuICAgICAqIGlzIGludGVuZGVkIGZvciB1c2UgYnkgd3JpdGVycywgbm90IGJ5IHJlYWRlcnMuIENvbmZvcm1pbmcgcmVhZGVycyBzaGFsbFxuICAgICAqIGRpc3BsYXkgdGhlIG9wdGlvbnMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgb2NjdXIgaW4gdGhlIE9wdCBhcnJheVxuICAgICAqIChzZWUgVGFibGUgMjMxKS5cbiAgICAgKi9cbiAgICBBY3JvQ2hvaWNlRmxhZ3NbQWNyb0Nob2ljZUZsYWdzW1wiU29ydFwiXSA9IGZsYWcoMjAgLSAxKV0gPSBcIlNvcnRcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIG1vcmUgdGhhbiBvbmUgb2YgdGhlIGZpZWxkJ3Mgb3B0aW9uIGl0ZW1zIG1heSBiZSBzZWxlY3RlZFxuICAgICAqIHNpbXVsdGFuZW91c2x5OyBpZiBjbGVhciwgYXQgbW9zdCBvbmUgaXRlbSBzaGFsbCBiZSBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBBY3JvQ2hvaWNlRmxhZ3NbQWNyb0Nob2ljZUZsYWdzW1wiTXVsdGlTZWxlY3RcIl0gPSBmbGFnKDIyIC0gMSldID0gXCJNdWx0aVNlbGVjdFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgc3BlbGwtY2hlY2tlZC4gVGhpcyBmbGFnXG4gICAgICogc2hhbGwgbm90IGJlIHVzZWQgdW5sZXNzIHRoZSBDb21ibyBhbmQgRWRpdCBmbGFncyBhcmUgYm90aCBzZXQuXG4gICAgICovXG4gICAgQWNyb0Nob2ljZUZsYWdzW0Fjcm9DaG9pY2VGbGFnc1tcIkRvTm90U3BlbGxDaGVja1wiXSA9IGZsYWcoMjMgLSAxKV0gPSBcIkRvTm90U3BlbGxDaGVja1wiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIG5ldyB2YWx1ZSBzaGFsbCBiZSBjb21taXR0ZWQgYXMgc29vbiBhcyBhIHNlbGVjdGlvbiBpcyBtYWRlXG4gICAgICogKGNvbW1vbmx5IHdpdGggdGhlIHBvaW50aW5nIGRldmljZSkuIEluIHRoaXMgY2FzZSwgc3VwcGx5aW5nIGEgdmFsdWUgZm9yXG4gICAgICogYSBmaWVsZCBpbnZvbHZlcyB0aHJlZSBhY3Rpb25zOiBzZWxlY3RpbmcgdGhlIGZpZWxkIGZvciBmaWxsLWluLFxuICAgICAqIHNlbGVjdGluZyBhIGNob2ljZSBmb3IgdGhlIGZpbGwtaW4gdmFsdWUsIGFuZCBsZWF2aW5nIHRoYXQgZmllbGQsIHdoaWNoXG4gICAgICogZmluYWxpemVzIG9yIFwiY29tbWl0c1wiIHRoZSBkYXRhIGNob2ljZSBhbmQgdHJpZ2dlcnMgYW55IGFjdGlvbnMgYXNzb2NpYXRlZFxuICAgICAqIHdpdGggdGhlIGVudHJ5IG9yIGNoYW5naW5nIG9mIHRoaXMgZGF0YS4gSWYgdGhpcyBmbGFnIGlzIG9uLCB0aGVuXG4gICAgICogcHJvY2Vzc2luZyBkb2VzIG5vdCB3YWl0IGZvciBsZWF2aW5nIHRoZSBmaWVsZCBhY3Rpb24gdG8gb2NjdXIsIGJ1dFxuICAgICAqIGltbWVkaWF0ZWx5IHByb2NlZWRzIHRvIHRoZSB0aGlyZCBzdGVwLlxuICAgICAqXG4gICAgICogVGhpcyBvcHRpb24gZW5hYmxlcyBhcHBsaWNhdGlvbnMgdG8gcGVyZm9ybSBhbiBhY3Rpb24gb25jZSBhIHNlbGVjdGlvbiBpc1xuICAgICAqIG1hZGUsIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIGV4aXQgdGhlIGZpZWxkLiBJZiBjbGVhciwgdGhlIG5ld1xuICAgICAqIHZhbHVlIGlzIG5vdCBjb21taXR0ZWQgdW50aWwgdGhlIHVzZXIgZXhpdHMgdGhlIGZpZWxkLlxuICAgICAqL1xuICAgIEFjcm9DaG9pY2VGbGFnc1tBY3JvQ2hvaWNlRmxhZ3NbXCJDb21taXRPblNlbENoYW5nZVwiXSA9IGZsYWcoMjcgLSAxKV0gPSBcIkNvbW1pdE9uU2VsQ2hhbmdlXCI7XG59KShBY3JvQ2hvaWNlRmxhZ3MgfHwgKEFjcm9DaG9pY2VGbGFncyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbGFncy5qcy5tYXAiLCJleHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9CdXR0b24gfSBmcm9tIFwiLi9QREZBY3JvQnV0dG9uXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9DaGVja0JveCB9IGZyb20gXCIuL1BERkFjcm9DaGVja0JveFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvQ2hvaWNlIH0gZnJvbSBcIi4vUERGQWNyb0Nob2ljZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvQ29tYm9Cb3ggfSBmcm9tIFwiLi9QREZBY3JvQ29tYm9Cb3hcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb0ZpZWxkIH0gZnJvbSBcIi4vUERGQWNyb0ZpZWxkXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9Gb3JtIH0gZnJvbSBcIi4vUERGQWNyb0Zvcm1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb0xpc3RCb3ggfSBmcm9tIFwiLi9QREZBY3JvTGlzdEJveFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvTm9uVGVybWluYWwgfSBmcm9tIFwiLi9QREZBY3JvTm9uVGVybWluYWxcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb1B1c2hCdXR0b24gfSBmcm9tIFwiLi9QREZBY3JvUHVzaEJ1dHRvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvUmFkaW9CdXR0b24gfSBmcm9tIFwiLi9QREZBY3JvUmFkaW9CdXR0b25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb1NpZ25hdHVyZSB9IGZyb20gXCIuL1BERkFjcm9TaWduYXR1cmVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb1Rlcm1pbmFsIH0gZnJvbSBcIi4vUERGQWNyb1Rlcm1pbmFsXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9UZXh0IH0gZnJvbSBcIi4vUERGQWNyb1RleHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZsYWdzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZBY3JvVGVybWluYWwgZnJvbSBcIi4vUERGQWNyb1Rlcm1pbmFsXCI7XG5pbXBvcnQgUERGQWNyb05vblRlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9Ob25UZXJtaW5hbFwiO1xuaW1wb3J0IFBERkFjcm9TaWduYXR1cmUgZnJvbSBcIi4vUERGQWNyb1NpZ25hdHVyZVwiO1xuaW1wb3J0IFBERkFjcm9UZXh0IGZyb20gXCIuL1BERkFjcm9UZXh0XCI7XG5pbXBvcnQgUERGQWNyb1B1c2hCdXR0b24gZnJvbSBcIi4vUERGQWNyb1B1c2hCdXR0b25cIjtcbmltcG9ydCBQREZBY3JvUmFkaW9CdXR0b24gZnJvbSBcIi4vUERGQWNyb1JhZGlvQnV0dG9uXCI7XG5pbXBvcnQgUERGQWNyb0NoZWNrQm94IGZyb20gXCIuL1BERkFjcm9DaGVja0JveFwiO1xuaW1wb3J0IFBERkFjcm9Db21ib0JveCBmcm9tIFwiLi9QREZBY3JvQ29tYm9Cb3hcIjtcbmltcG9ydCBQREZBY3JvTGlzdEJveCBmcm9tIFwiLi9QREZBY3JvTGlzdEJveFwiO1xuaW1wb3J0IHsgQWNyb0J1dHRvbkZsYWdzLCBBY3JvQ2hvaWNlRmxhZ3MgfSBmcm9tIFwiLi9mbGFnc1wiO1xuZXhwb3J0IHZhciBjcmVhdGVQREZBY3JvRmllbGRzID0gZnVuY3Rpb24gKGtpZERpY3RzKSB7XG4gICAgaWYgKCFraWREaWN0cylcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIHZhciBraWRzID0gW107XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0ga2lkRGljdHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciByZWYgPSBraWREaWN0cy5nZXQoaWR4KTtcbiAgICAgICAgdmFyIGRpY3QgPSBraWREaWN0cy5sb29rdXAoaWR4KTtcbiAgICAgICAgLy8gaWYgKGRpY3QgaW5zdGFuY2VvZiBQREZEaWN0KSBraWRzLnB1c2goUERGQWNyb0ZpZWxkLmZyb21EaWN0KGRpY3QpKTtcbiAgICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIFBERlJlZiAmJiBkaWN0IGluc3RhbmNlb2YgUERGRGljdCkge1xuICAgICAgICAgICAga2lkcy5wdXNoKFtjcmVhdGVQREZBY3JvRmllbGQoZGljdCwgcmVmKSwgcmVmXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtpZHM7XG59O1xuZXhwb3J0IHZhciBjcmVhdGVQREZBY3JvRmllbGQgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgdmFyIGlzTm9uVGVybWluYWwgPSBpc05vblRlcm1pbmFsQWNyb0ZpZWxkKGRpY3QpO1xuICAgIGlmIChpc05vblRlcm1pbmFsKVxuICAgICAgICByZXR1cm4gUERGQWNyb05vblRlcm1pbmFsLmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgcmV0dXJuIGNyZWF0ZVBERkFjcm9UZXJtaW5hbChkaWN0LCByZWYpO1xufTtcbi8vIFRPRE86IE1heWJlIGp1c3QgY2hlY2sgaWYgdGhlIGRpY3QgaXMgKm5vdCogYSB3aWRnZXQ/IFRoYXQgbWlnaHQgYmUgYmV0dGVyLlxuLy8gQWNjb3JkaW5nIHRvIHRoZSBQREYgc3BlYzpcbi8vXG4vLyAgID4gQSBmaWVsZCdzIGNoaWxkcmVuIGluIHRoZSBoaWVyYXJjaHkgbWF5IGFsc28gaW5jbHVkZSB3aWRnZXQgYW5ub3RhdGlvbnNcbi8vICAgPiB0aGF0IGRlZmluZSBpdHMgYXBwZWFyYW5jZSBvbiB0aGUgcGFnZS4gQSBmaWVsZCB0aGF0IGhhcyBjaGlsZHJlbiB0aGF0XG4vLyAgID4gYXJlIGZpZWxkcyBpcyBjYWxsZWQgYSBub24tdGVybWluYWwgZmllbGQuIEEgZmllbGQgdGhhdCBkb2VzIG5vdCBoYXZlXG4vLyAgID4gY2hpbGRyZW4gdGhhdCBhcmUgZmllbGRzIGlzIGNhbGxlZCBhIHRlcm1pbmFsIGZpZWxkLlxuLy9cbi8vIFRoZSBzcGVjIGlzIG5vdCBlbnRpcmVseSBjbGVhciBhYm91dCBob3cgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlblxuLy8gZGljdGlvbmFyeSByZXByZXNlbnRzIGFuIGFjcm9maWVsZCBvciBhIHdpZGdldCBhbm5vdGF0aW9uLiBTbyB3ZSB3aWxsIGFzc3VtZVxuLy8gdGhhdCBhIGRpY3Rpb25hcnkgaXMgYW4gYWNyb2ZpZWxkIGlmIGl0IGlzIGEgbWVtYmVyIG9mIHRoZSBgL0tpZHNgIGFycmF5XG4vLyBhbmQgaXQgY29udGFpbnMgYSBgL1RgIGVudHJ5ICh3aWRnZXRzIGRvIG5vdCBoYXZlIGAvVGAgZW50cmllcykuIFRoaXMgaXNuJ3Rcbi8vIGEgYnVsbGV0IHByb29mIHNvbHV0aW9uLCBiZWNhdXNlIHRoZSBgL1RgIGVudHJ5IGlzIHRlY2huaWNhbGx5IGRlZmluZWQgYXNcbi8vIG9wdGlvbmFsIGZvciBhY3JvZmllbGRzIGJ5IHRoZSBQREYgc3BlYy4gQnV0IGluIHByYWN0aWNlIGFsbCBhY3JvZmllbGRzIHNlZW1cbi8vIHRvIGhhdmUgYSBgL1RgIGVudHJ5IGRlZmluZWQuXG52YXIgaXNOb25UZXJtaW5hbEFjcm9GaWVsZCA9IGZ1bmN0aW9uIChkaWN0KSB7XG4gICAgdmFyIGtpZHMgPSBkaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdLaWRzJykpO1xuICAgIGlmIChraWRzIGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0ga2lkcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBraWQgPSBraWRzLmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgdmFyIGtpZElzRmllbGQgPSBraWQgaW5zdGFuY2VvZiBQREZEaWN0ICYmIGtpZC5oYXMoUERGTmFtZS5vZignVCcpKTtcbiAgICAgICAgICAgIGlmIChraWRJc0ZpZWxkKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG52YXIgY3JlYXRlUERGQWNyb1Rlcm1pbmFsID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgIHZhciBmdE5hbWVPclJlZiA9IGdldEluaGVyaXRhYmxlQXR0cmlidXRlKGRpY3QsIFBERk5hbWUub2YoJ0ZUJykpO1xuICAgIHZhciB0eXBlID0gZGljdC5jb250ZXh0Lmxvb2t1cChmdE5hbWVPclJlZiwgUERGTmFtZSk7XG4gICAgaWYgKHR5cGUgPT09IFBERk5hbWUub2YoJ0J0bicpKVxuICAgICAgICByZXR1cm4gY3JlYXRlUERGQWNyb0J1dHRvbihkaWN0LCByZWYpO1xuICAgIGlmICh0eXBlID09PSBQREZOYW1lLm9mKCdDaCcpKVxuICAgICAgICByZXR1cm4gY3JlYXRlUERGQWNyb0Nob2ljZShkaWN0LCByZWYpO1xuICAgIGlmICh0eXBlID09PSBQREZOYW1lLm9mKCdUeCcpKVxuICAgICAgICByZXR1cm4gUERGQWNyb1RleHQuZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICBpZiAodHlwZSA9PT0gUERGTmFtZS5vZignU2lnJykpXG4gICAgICAgIHJldHVybiBQREZBY3JvU2lnbmF0dXJlLmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgLy8gV2Ugc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgbGluZS4gQnV0IHRoZXJlIGFyZSBhIGxvdCBvZiB3ZWlyZCBQREZzIG91dFxuICAgIC8vIHRoZXJlLiBTbywganVzdCB0byBiZSBzYWZlLCB3ZSdsbCB0cnkgdG8gaGFuZGxlIHRoaW5ncyBncmFjZWZ1bGx5IGluc3RlYWRcbiAgICAvLyBvZiB0aHJvd2luZyBhbiBlcnJvci5cbiAgICByZXR1cm4gUERGQWNyb1Rlcm1pbmFsLmZyb21EaWN0KGRpY3QsIHJlZik7XG59O1xudmFyIGNyZWF0ZVBERkFjcm9CdXR0b24gPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBmZk51bWJlck9yUmVmID0gZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoZGljdCwgUERGTmFtZS5vZignRmYnKSk7XG4gICAgdmFyIGZmTnVtYmVyID0gZGljdC5jb250ZXh0Lmxvb2t1cE1heWJlKGZmTnVtYmVyT3JSZWYsIFBERk51bWJlcik7XG4gICAgdmFyIGZsYWdzID0gKF9hID0gZmZOdW1iZXIgPT09IG51bGwgfHwgZmZOdW1iZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZmTnVtYmVyLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgaWYgKGZsYWdJc1NldChmbGFncywgQWNyb0J1dHRvbkZsYWdzLlB1c2hCdXR0b24pKSB7XG4gICAgICAgIHJldHVybiBQREZBY3JvUHVzaEJ1dHRvbi5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIH1cbiAgICBlbHNlIGlmIChmbGFnSXNTZXQoZmxhZ3MsIEFjcm9CdXR0b25GbGFncy5SYWRpbykpIHtcbiAgICAgICAgcmV0dXJuIFBERkFjcm9SYWRpb0J1dHRvbi5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFBERkFjcm9DaGVja0JveC5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIH1cbn07XG52YXIgY3JlYXRlUERGQWNyb0Nob2ljZSA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGZmTnVtYmVyT3JSZWYgPSBnZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShkaWN0LCBQREZOYW1lLm9mKCdGZicpKTtcbiAgICB2YXIgZmZOdW1iZXIgPSBkaWN0LmNvbnRleHQubG9va3VwTWF5YmUoZmZOdW1iZXJPclJlZiwgUERGTnVtYmVyKTtcbiAgICB2YXIgZmxhZ3MgPSAoX2EgPSBmZk51bWJlciA9PT0gbnVsbCB8fCBmZk51bWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmZOdW1iZXIuYXNOdW1iZXIoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICBpZiAoZmxhZ0lzU2V0KGZsYWdzLCBBY3JvQ2hvaWNlRmxhZ3MuQ29tYm8pKSB7XG4gICAgICAgIHJldHVybiBQREZBY3JvQ29tYm9Cb3guZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBQREZBY3JvTGlzdEJveC5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIH1cbn07XG52YXIgZmxhZ0lzU2V0ID0gZnVuY3Rpb24gKGZsYWdzLCBmbGFnKSB7XG4gICAgcmV0dXJuIChmbGFncyAmIGZsYWcpICE9PSAwO1xufTtcbnZhciBnZXRJbmhlcml0YWJsZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChzdGFydE5vZGUsIG5hbWUpIHtcbiAgICB2YXIgYXR0cmlidXRlO1xuICAgIGFzY2VuZChzdGFydE5vZGUsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmICghYXR0cmlidXRlKVxuICAgICAgICAgICAgYXR0cmlidXRlID0gbm9kZS5nZXQobmFtZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZTtcbn07XG52YXIgYXNjZW5kID0gZnVuY3Rpb24gKHN0YXJ0Tm9kZSwgdmlzaXRvcikge1xuICAgIHZpc2l0b3Ioc3RhcnROb2RlKTtcbiAgICB2YXIgUGFyZW50ID0gc3RhcnROb2RlLmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ1BhcmVudCcpLCBQREZEaWN0KTtcbiAgICBpZiAoUGFyZW50KVxuICAgICAgICBhc2NlbmQoUGFyZW50LCB2aXNpdG9yKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCJpbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbnZhciBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoZGljdCkge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIH1cbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5SID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgUiA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignUicpKTtcbiAgICAgICAgaWYgKFIgaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gUjtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLkJDID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQkMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0JDJykpO1xuICAgICAgICBpZiAoQkMgaW5zdGFuY2VvZiBQREZBcnJheSlcbiAgICAgICAgICAgIHJldHVybiBCQztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLkJHID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQkcgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0JHJykpO1xuICAgICAgICBpZiAoQkcgaW5zdGFuY2VvZiBQREZBcnJheSlcbiAgICAgICAgICAgIHJldHVybiBCRztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLkNBID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQ0EgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0NBJykpO1xuICAgICAgICBpZiAoQ0EgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcgfHwgQ0EgaW5zdGFuY2VvZiBQREZTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gQ0E7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5SQyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFJDID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdSQycpKTtcbiAgICAgICAgaWYgKFJDIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nIHx8IFJDIGluc3RhbmNlb2YgUERGU3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIFJDO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuQUMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBBQyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignQUMnKSk7XG4gICAgICAgIGlmIChBQyBpbnN0YW5jZW9mIFBERkhleFN0cmluZyB8fCBBQyBpbnN0YW5jZW9mIFBERlN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBBQztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLmdldFJvdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLlIoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCk7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5nZXRCb3JkZXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJDID0gdGhpcy5CQygpO1xuICAgICAgICBpZiAoIUJDKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gQkMgPT09IG51bGwgfHwgQkMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEJDLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IEJDLmdldChpZHgpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFBERk51bWJlcilcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50LmFzTnVtYmVyKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuZ2V0QmFja2dyb3VuZENvbG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQkcgPSB0aGlzLkJHKCk7XG4gICAgICAgIGlmICghQkcpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBCRyA9PT0gbnVsbCB8fCBCRyA9PT0gdm9pZCAwID8gdm9pZCAwIDogQkcuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gQkcuZ2V0KGlkeCk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQuYXNOdW1iZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5nZXRDYXB0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIENBID0gdGhpcy5DQSgpO1xuICAgICAgICB2YXIgUkMgPSB0aGlzLlJDKCk7XG4gICAgICAgIHZhciBBQyA9IHRoaXMuQUMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vcm1hbDogQ0EgPT09IG51bGwgfHwgQ0EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IENBLmRlY29kZVRleHQoKSxcbiAgICAgICAgICAgIHJvbGxvdmVyOiBSQyA9PT0gbnVsbCB8fCBSQyA9PT0gdm9pZCAwID8gdm9pZCAwIDogUkMuZGVjb2RlVGV4dCgpLFxuICAgICAgICAgICAgZG93bjogQUMgPT09IG51bGwgfHwgQUMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEFDLmRlY29kZVRleHQoKSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLnNldFJvdGF0aW9uID0gZnVuY3Rpb24gKHJvdGF0aW9uKSB7XG4gICAgICAgIHZhciBSID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKHJvdGF0aW9uKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdSJyksIFIpO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuc2V0Qm9yZGVyQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgdmFyIEJDID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGNvbG9yKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdCQycpLCBCQyk7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5zZXRCYWNrZ3JvdW5kQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgdmFyIEJHID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGNvbG9yKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdCRycpLCBCRyk7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5zZXRDYXB0aW9ucyA9IGZ1bmN0aW9uIChjYXB0aW9ucykge1xuICAgICAgICB2YXIgQ0EgPSBQREZIZXhTdHJpbmcuZnJvbVRleHQoY2FwdGlvbnMubm9ybWFsKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdDQScpLCBDQSk7XG4gICAgICAgIGlmIChjYXB0aW9ucy5yb2xsb3Zlcikge1xuICAgICAgICAgICAgdmFyIFJDID0gUERGSGV4U3RyaW5nLmZyb21UZXh0KGNhcHRpb25zLnJvbGxvdmVyKTtcbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUkMnKSwgUkMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdSQycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FwdGlvbnMuZG93bikge1xuICAgICAgICAgICAgdmFyIEFDID0gUERGSGV4U3RyaW5nLmZyb21UZXh0KGNhcHRpb25zLmRvd24pO1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdBQycpLCBBQyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ0FDJykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKGRpY3QpO1xuICAgIH07XG4gICAgcmV0dXJuIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3M7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MuanMubWFwIiwiaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbi8vIFRPRE86IEFsc28gaGFuZGxlIHRoZSBgL1NgIGFuZCBgL0RgIGVudHJpZXNcbnZhciBCb3JkZXJTdHlsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCb3JkZXJTdHlsZShkaWN0KSB7XG4gICAgICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgfVxuICAgIEJvcmRlclN0eWxlLnByb3RvdHlwZS5XID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgVyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignVycpKTtcbiAgICAgICAgaWYgKFcgaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gVztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEJvcmRlclN0eWxlLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuVygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMTtcbiAgICB9O1xuICAgIEJvcmRlclN0eWxlLnByb3RvdHlwZS5zZXRXaWR0aCA9IGZ1bmN0aW9uICh3aWR0aCkge1xuICAgICAgICB2YXIgVyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaih3aWR0aCk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVycpLCBXKTtcbiAgICB9O1xuICAgIEJvcmRlclN0eWxlLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QpIHsgcmV0dXJuIG5ldyBCb3JkZXJTdHlsZShkaWN0KTsgfTtcbiAgICByZXR1cm4gQm9yZGVyU3R5bGU7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQm9yZGVyU3R5bGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Cb3JkZXJTdHlsZS5qcy5tYXAiLCJpbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmVhbVwiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbnZhciBQREZBbm5vdGF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkFubm90YXRpb24oZGljdCkge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIH1cbiAgICAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IHJlcXVpcmVkIGJ5IHRoZSBQREYgc3BlY1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLlJlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1JlY3QnKSwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuQVAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwTWF5YmUoUERGTmFtZS5vZignQVAnKSwgUERGRGljdCk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5GID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbnVtYmVyT3JSZWYgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0YnKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QuY29udGV4dC5sb29rdXBNYXliZShudW1iZXJPclJlZiwgUERGTnVtYmVyKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmdldFJlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgUmVjdCA9IHRoaXMuUmVjdCgpO1xuICAgICAgICByZXR1cm4gKF9hID0gUmVjdCA9PT0gbnVsbCB8fCBSZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBSZWN0LmFzUmVjdGFuZ2xlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0UmVjdGFuZ2xlID0gZnVuY3Rpb24gKHJlY3QpIHtcbiAgICAgICAgdmFyIHggPSByZWN0LngsIHkgPSByZWN0LnksIHdpZHRoID0gcmVjdC53aWR0aCwgaGVpZ2h0ID0gcmVjdC5oZWlnaHQ7XG4gICAgICAgIHZhciBSZWN0ID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdSZWN0JyksIFJlY3QpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0QXBwZWFyYW5jZVN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQVMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0FTJykpO1xuICAgICAgICBpZiAoQVMgaW5zdGFuY2VvZiBQREZOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIEFTO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0QXBwZWFyYW5jZVN0YXRlID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQVMnKSwgc3RhdGUpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0QXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZXMpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdBUCcpLCBhcHBlYXJhbmNlcyk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5lbnN1cmVBUCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5BUCgpO1xuICAgICAgICBpZiAoIUFQKSB7XG4gICAgICAgICAgICBBUCA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaih7fSk7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0FQJyksIEFQKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQVA7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXROb3JtYWxBcHBlYXJhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLmVuc3VyZUFQKCk7XG4gICAgICAgIHZhciBOID0gQVAuZ2V0KFBERk5hbWUub2YoJ04nKSk7XG4gICAgICAgIGlmIChOIGluc3RhbmNlb2YgUERGUmVmIHx8IE4gaW5zdGFuY2VvZiBQREZEaWN0KVxuICAgICAgICAgICAgcmV0dXJuIE47XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgTiB0eXBlOiBcIiArIChOID09PSBudWxsIHx8IE4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IE4uY29uc3RydWN0b3IubmFtZSkpO1xuICAgIH07XG4gICAgLyoqIEBwYXJhbSBhcHBlYXJhbmNlIEEgUERGRGljdCBvciBQREZTdHJlYW0gKGRpcmVjdCBvciByZWYpICovXG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0Tm9ybWFsQXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIHZhciBBUCA9IHRoaXMuZW5zdXJlQVAoKTtcbiAgICAgICAgQVAuc2V0KFBERk5hbWUub2YoJ04nKSwgYXBwZWFyYW5jZSk7XG4gICAgfTtcbiAgICAvKiogQHBhcmFtIGFwcGVhcmFuY2UgQSBQREZEaWN0IG9yIFBERlN0cmVhbSAoZGlyZWN0IG9yIHJlZikgKi9cbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRSb2xsb3ZlckFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLmVuc3VyZUFQKCk7XG4gICAgICAgIEFQLnNldChQREZOYW1lLm9mKCdSJyksIGFwcGVhcmFuY2UpO1xuICAgIH07XG4gICAgLyoqIEBwYXJhbSBhcHBlYXJhbmNlIEEgUERGRGljdCBvciBQREZTdHJlYW0gKGRpcmVjdCBvciByZWYpICovXG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0RG93bkFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLmVuc3VyZUFQKCk7XG4gICAgICAgIEFQLnNldChQREZOYW1lLm9mKCdEJyksIGFwcGVhcmFuY2UpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUucmVtb3ZlUm9sbG92ZXJBcHBlYXJhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLkFQKCk7XG4gICAgICAgIEFQID09PSBudWxsIHx8IEFQID09PSB2b2lkIDAgPyB2b2lkIDAgOiBBUC5kZWxldGUoUERGTmFtZS5vZignUicpKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnJlbW92ZURvd25BcHBlYXJhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLkFQKCk7XG4gICAgICAgIEFQID09PSBudWxsIHx8IEFQID09PSB2b2lkIDAgPyB2b2lkIDAgOiBBUC5kZWxldGUoUERGTmFtZS5vZignRCcpKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmdldEFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLkFQKCk7XG4gICAgICAgIGlmICghQVApXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgTiA9IEFQLmxvb2t1cChQREZOYW1lLm9mKCdOJyksIFBERkRpY3QsIFBERlN0cmVhbSk7XG4gICAgICAgIHZhciBSID0gQVAubG9va3VwTWF5YmUoUERGTmFtZS5vZignUicpLCBQREZEaWN0LCBQREZTdHJlYW0pO1xuICAgICAgICB2YXIgRCA9IEFQLmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ0QnKSwgUERGRGljdCwgUERGU3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIHsgbm9ybWFsOiBOLCByb2xsb3ZlcjogUiwgZG93bjogRCB9O1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0RmxhZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkYoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzTnVtYmVyKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDA7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRGbGFncyA9IGZ1bmN0aW9uIChmbGFncykge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0YnKSwgUERGTnVtYmVyLm9mKGZsYWdzKSk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5oYXNGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5nZXRGbGFncygpO1xuICAgICAgICByZXR1cm4gKGZsYWdzICYgZmxhZykgIT09IDA7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5nZXRGbGFncygpO1xuICAgICAgICB0aGlzLnNldEZsYWdzKGZsYWdzIHwgZmxhZyk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5jbGVhckZsYWcgPSBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICB2YXIgZmxhZ3MgPSB0aGlzLmdldEZsYWdzKCk7XG4gICAgICAgIHRoaXMuc2V0RmxhZ3MoZmxhZ3MgJiB+ZmxhZyk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRGbGFnVG8gPSBmdW5jdGlvbiAoZmxhZywgZW5hYmxlKSB7XG4gICAgICAgIGlmIChlbmFibGUpXG4gICAgICAgICAgICB0aGlzLnNldEZsYWcoZmxhZyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGbGFnKGZsYWcpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0KSB7IHJldHVybiBuZXcgUERGQW5ub3RhdGlvbihkaWN0KTsgfTtcbiAgICByZXR1cm4gUERGQW5ub3RhdGlvbjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBbm5vdGF0aW9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQW5ub3RhdGlvbi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBCb3JkZXJTdHlsZSBmcm9tIFwiLi9Cb3JkZXJTdHlsZVwiO1xuaW1wb3J0IFBERkFubm90YXRpb24gZnJvbSBcIi4vUERGQW5ub3RhdGlvblwiO1xuaW1wb3J0IEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MgZnJvbSBcIi4vQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljc1wiO1xudmFyIFBERldpZGdldEFubm90YXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERldpZGdldEFubm90YXRpb24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGV2lkZ2V0QW5ub3RhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5NSyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIE1LID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdNSycpKTtcbiAgICAgICAgaWYgKE1LIGluc3RhbmNlb2YgUERGRGljdClcbiAgICAgICAgICAgIHJldHVybiBNSztcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLkJTID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQlMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0JTJykpO1xuICAgICAgICBpZiAoQlMgaW5zdGFuY2VvZiBQREZEaWN0KVxuICAgICAgICAgICAgcmV0dXJuIEJTO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuREEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignREEnKSk7XG4gICAgICAgIGlmIChkYSBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCBkYSBpbnN0YW5jZW9mIFBERkhleFN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBkYTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLlAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBQID0gdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdQJykpO1xuICAgICAgICBpZiAoUCBpbnN0YW5jZW9mIFBERlJlZilcbiAgICAgICAgICAgIHJldHVybiBQO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0UCA9IGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUCcpLCBwYWdlKTtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLnNldERlZmF1bHRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdEQScpLCBQREZTdHJpbmcub2YoYXBwZWFyYW5jZSkpO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0RGVmYXVsdEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBEQSA9IHRoaXMuREEoKTtcbiAgICAgICAgaWYgKERBIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gREEuZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEQSA9PT0gbnVsbCB8fCBEQSA9PT0gdm9pZCAwID8gdm9pZCAwIDogREEuYXNTdHJpbmcoKTtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBNSyA9IHRoaXMuTUsoKTtcbiAgICAgICAgaWYgKE1LKVxuICAgICAgICAgICAgcmV0dXJuIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MuZnJvbURpY3QoTUspO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0T3JDcmVhdGVBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgTUsgPSB0aGlzLk1LKCk7XG4gICAgICAgIGlmIChNSylcbiAgICAgICAgICAgIHJldHVybiBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmZyb21EaWN0KE1LKTtcbiAgICAgICAgdmFyIGFjID0gQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5mcm9tRGljdCh0aGlzLmRpY3QuY29udGV4dC5vYmooe30pKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdNSycpLCBhYy5kaWN0KTtcbiAgICAgICAgcmV0dXJuIGFjO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0Qm9yZGVyU3R5bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCUyA9IHRoaXMuQlMoKTtcbiAgICAgICAgaWYgKEJTKVxuICAgICAgICAgICAgcmV0dXJuIEJvcmRlclN0eWxlLmZyb21EaWN0KEJTKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldE9yQ3JlYXRlQm9yZGVyU3R5bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCUyA9IHRoaXMuQlMoKTtcbiAgICAgICAgaWYgKEJTKVxuICAgICAgICAgICAgcmV0dXJuIEJvcmRlclN0eWxlLmZyb21EaWN0KEJTKTtcbiAgICAgICAgdmFyIGJzID0gQm9yZGVyU3R5bGUuZnJvbURpY3QodGhpcy5kaWN0LmNvbnRleHQub2JqKHt9KSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQlMnKSwgYnMuZGljdCk7XG4gICAgICAgIHJldHVybiBicztcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLmdldE9uVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIG5vcm1hbCA9IChfYSA9IHRoaXMuZ2V0QXBwZWFyYW5jZXMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vcm1hbDtcbiAgICAgICAgaWYgKG5vcm1hbCBpbnN0YW5jZW9mIFBERkRpY3QpIHtcbiAgICAgICAgICAgIHZhciBrZXlzID0gbm9ybWFsLmtleXMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGtleXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSBQREZOYW1lLm9mKCdPZmYnKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGV2lkZ2V0QW5ub3RhdGlvbihkaWN0KTtcbiAgICB9O1xuICAgIFBERldpZGdldEFubm90YXRpb24uY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQsIHBhcmVudCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIFR5cGU6ICdBbm5vdCcsXG4gICAgICAgICAgICBTdWJ0eXBlOiAnV2lkZ2V0JyxcbiAgICAgICAgICAgIFJlY3Q6IFswLCAwLCAwLCAwXSxcbiAgICAgICAgICAgIFBhcmVudDogcGFyZW50LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZXaWRnZXRBbm5vdGF0aW9uKGRpY3QpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERldpZGdldEFubm90YXRpb247XG59KFBERkFubm90YXRpb24pKTtcbmV4cG9ydCBkZWZhdWx0IFBERldpZGdldEFubm90YXRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZXaWRnZXRBbm5vdGF0aW9uLmpzLm1hcCIsInZhciBmbGFnID0gZnVuY3Rpb24gKGJpdEluZGV4KSB7IHJldHVybiAxIDw8IGJpdEluZGV4OyB9O1xuLyoqIEZyb20gUERGIHNwZWMgdGFibGUgMTY1ICovXG5leHBvcnQgdmFyIEFubm90YXRpb25GbGFncztcbihmdW5jdGlvbiAoQW5ub3RhdGlvbkZsYWdzKSB7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3QgZGlzcGxheSB0aGUgYW5ub3RhdGlvbiBpZiBpdCBkb2VzIG5vdCBiZWxvbmcgdG8gb25lIG9mIHRoZVxuICAgICAqIHN0YW5kYXJkIGFubm90YXRpb24gdHlwZXMgYW5kIG5vIGFubm90YXRpb24gaGFuZGxlciBpcyBhdmFpbGFibGUuIElmIGNsZWFyLFxuICAgICAqIGRpc3BsYXkgc3VjaCBhbiB1bmtub3duIGFubm90YXRpb24gdXNpbmcgYW4gYXBwZWFyYW5jZSBzdHJlYW0gc3BlY2lmaWVkIGJ5XG4gICAgICogaXRzIGFwcGVhcmFuY2UgZGljdGlvbmFyeSwgaWYgYW55LlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJJbnZpc2libGVcIl0gPSBmbGFnKDEgLSAxKV0gPSBcIkludmlzaWJsZVwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IGRpc3BsYXkgb3IgcHJpbnQgdGhlIGFubm90YXRpb24gb3IgYWxsb3cgaXQgdG8gaW50ZXJhY3Qgd2l0aFxuICAgICAqIHRoZSB1c2VyLCByZWdhcmRsZXNzIG9mIGl0cyBhbm5vdGF0aW9uIHR5cGUgb3Igd2hldGhlciBhbiBhbm5vdGF0aW9uXG4gICAgICogaGFuZGxlciBpcyBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBJbiBjYXNlcyB3aGVyZSBzY3JlZW4gc3BhY2UgaXMgbGltaXRlZCwgdGhlIGFiaWxpdHkgdG8gaGlkZSBhbmQgc2hvd1xuICAgICAqIGFubm90YXRpb25zIHNlbGVjdGl2ZWx5IGNhbiBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggYXBwZWFyYW5jZSBzdHJlYW1zXG4gICAgICogdG8gZGlzcGxheSBhdXhpbGlhcnkgcG9wLXVwIGluZm9ybWF0aW9uIHNpbWlsYXIgaW4gZnVuY3Rpb24gdG8gb25saW5lIGhlbHBcbiAgICAgKiBzeXN0ZW1zLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJIaWRkZW5cIl0gPSBmbGFnKDIgLSAxKV0gPSBcIkhpZGRlblwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgcHJpbnQgdGhlIGFubm90YXRpb24gd2hlbiB0aGUgcGFnZSBpcyBwcmludGVkLiBJZiBjbGVhciwgbmV2ZXJcbiAgICAgKiBwcmludCB0aGUgYW5ub3RhdGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBhbm5vdGF0aW9ucyByZXByZXNlbnRpbmcgaW50ZXJhY3RpdmUgcHVzaGJ1dHRvbnMsXG4gICAgICogd2hpY2ggd291bGQgc2VydmUgbm8gbWVhbmluZ2Z1bCBwdXJwb3NlIG9uIHRoZSBwcmludGVkIHBhZ2UuXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIlByaW50XCJdID0gZmxhZygzIC0gMSldID0gXCJQcmludFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IHNjYWxlIHRoZSBhbm5vdGF0aW9u4oCZcyBhcHBlYXJhbmNlIHRvIG1hdGNoIHRoZSBtYWduaWZpY2F0aW9uXG4gICAgICogb2YgdGhlIHBhZ2UuIFRoZSBsb2NhdGlvbiBvZiB0aGUgYW5ub3RhdGlvbiBvbiB0aGUgcGFnZSAoZGVmaW5lZCBieSB0aGVcbiAgICAgKiB1cHBlci1sZWZ0IGNvcm5lciBvZiBpdHMgYW5ub3RhdGlvbiByZWN0YW5nbGUpIHNoYWxsIHJlbWFpbiBmaXhlZCxcbiAgICAgKiByZWdhcmRsZXNzIG9mIHRoZSBwYWdlIG1hZ25pZmljYXRpb24uXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIk5vWm9vbVwiXSA9IGZsYWcoNCAtIDEpXSA9IFwiTm9ab29tXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3Qgcm90YXRlIHRoZSBhbm5vdGF0aW9u4oCZcyBhcHBlYXJhbmNlIHRvIG1hdGNoIHRoZSByb3RhdGlvbiBvZlxuICAgICAqIHRoZSBwYWdlLiBUaGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGFubm90YXRpb24gcmVjdGFuZ2xlIHNoYWxsIHJlbWFpbiBpblxuICAgICAqIGEgZml4ZWQgbG9jYXRpb24gb24gdGhlIHBhZ2UsIHJlZ2FyZGxlc3Mgb2YgdGhlIHBhZ2Ugcm90YXRpb24uXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIk5vUm90YXRlXCJdID0gZmxhZyg1IC0gMSldID0gXCJOb1JvdGF0ZVwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IGRpc3BsYXkgdGhlIGFubm90YXRpb24gb24gdGhlIHNjcmVlbiBvciBhbGxvdyBpdCB0byBpbnRlcmFjdFxuICAgICAqIHdpdGggdGhlIHVzZXIuIFRoZSBhbm5vdGF0aW9uIG1heSBiZSBwcmludGVkIChkZXBlbmRpbmcgb24gdGhlIHNldHRpbmcgb2ZcbiAgICAgKiB0aGUgUHJpbnQgZmxhZykgYnV0IHNob3VsZCBiZSBjb25zaWRlcmVkIGhpZGRlbiBmb3IgcHVycG9zZXMgb2Ygb24tc2NyZWVuXG4gICAgICogZGlzcGxheSBhbmQgdXNlciBpbnRlcmFjdGlvbi5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiTm9WaWV3XCJdID0gZmxhZyg2IC0gMSldID0gXCJOb1ZpZXdcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBhbGxvdyB0aGUgYW5ub3RhdGlvbiB0byBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyLiBUaGVcbiAgICAgKiBhbm5vdGF0aW9uIG1heSBiZSBkaXNwbGF5ZWQgb3IgcHJpbnRlZCAoZGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5ncyBvZiB0aGVcbiAgICAgKiBOb1ZpZXcgYW5kIFByaW50IGZsYWdzKSBidXQgc2hvdWxkIG5vdCByZXNwb25kIHRvIG1vdXNlIGNsaWNrcyBvciBjaGFuZ2VcbiAgICAgKiBpdHMgYXBwZWFyYW5jZSBpbiByZXNwb25zZSB0byBtb3VzZSBtb3Rpb25zLlxuICAgICAqXG4gICAgICogVGhpcyBmbGFnIHNoYWxsIGJlIGlnbm9yZWQgZm9yIHdpZGdldCBhbm5vdGF0aW9uczsgaXRzIGZ1bmN0aW9uIGlzXG4gICAgICogc3Vic3VtZWQgYnkgdGhlIFJlYWRPbmx5IGZsYWcgb2YgdGhlIGFzc29jaWF0ZWQgZm9ybSBmaWVsZC5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiUmVhZE9ubHlcIl0gPSBmbGFnKDcgLSAxKV0gPSBcIlJlYWRPbmx5XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3QgYWxsb3cgdGhlIGFubm90YXRpb24gdG8gYmUgZGVsZXRlZCBvciBpdHMgcHJvcGVydGllc1xuICAgICAqIChpbmNsdWRpbmcgcG9zaXRpb24gYW5kIHNpemUpIHRvIGJlIG1vZGlmaWVkIGJ5IHRoZSB1c2VyLiBIb3dldmVyLCB0aGlzXG4gICAgICogZmxhZyBkb2VzIG5vdCByZXN0cmljdCBjaGFuZ2VzIHRvIHRoZSBhbm5vdGF0aW9u4oCZcyBjb250ZW50cywgc3VjaCBhcyB0aGVcbiAgICAgKiB2YWx1ZSBvZiBhIGZvcm0gZmllbGQuXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIkxvY2tlZFwiXSA9IGZsYWcoOCAtIDEpXSA9IFwiTG9ja2VkXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBpbnZlcnQgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBOb1ZpZXcgZmxhZyBmb3IgY2VydGFpbiBldmVudHMuXG4gICAgICpcbiAgICAgKiBBIHR5cGljYWwgdXNlIGlzIHRvIGhhdmUgYW4gYW5ub3RhdGlvbiB0aGF0IGFwcGVhcnMgb25seSB3aGVuIGEgbW91c2VcbiAgICAgKiBjdXJzb3IgaXMgaGVsZCBvdmVyIGl0LlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJUb2dnbGVOb1ZpZXdcIl0gPSBmbGFnKDkgLSAxKV0gPSBcIlRvZ2dsZU5vVmlld1wiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IGFsbG93IHRoZSBjb250ZW50cyBvZiB0aGUgYW5ub3RhdGlvbiB0byBiZSBtb2RpZmllZCBieSB0aGVcbiAgICAgKiB1c2VyLiBUaGlzIGZsYWcgZG9lcyBub3QgcmVzdHJpY3QgZGVsZXRpb24gb2YgdGhlIGFubm90YXRpb24gb3IgY2hhbmdlcyB0b1xuICAgICAqIG90aGVyIGFubm90YXRpb24gcHJvcGVydGllcywgc3VjaCBhcyBwb3NpdGlvbiBhbmQgc2l6ZS5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiTG9ja2VkQ29udGVudHNcIl0gPSBmbGFnKDEwIC0gMSldID0gXCJMb2NrZWRDb250ZW50c1wiO1xufSkoQW5ub3RhdGlvbkZsYWdzIHx8IChBbm5vdGF0aW9uRmxhZ3MgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmxhZ3MuanMubWFwIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBbm5vdGF0aW9uIH0gZnJvbSBcIi4vUERGQW5ub3RhdGlvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZXaWRnZXRBbm5vdGF0aW9uIH0gZnJvbSBcIi4vUERGV2lkZ2V0QW5ub3RhdGlvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzIH0gZnJvbSBcIi4vQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmxhZ3NcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciwgcGFkU3RhcnQgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogRW50cmllcyBzaG91bGQgYmUgYWRkZWQgdXNpbmcgdGhlIFtbYWRkRW50cnldXSBhbmQgW1thZGREZWxldGVkRW50cnldXVxuICogbWV0aG9kcyAqKmluIG9yZGVyIG9mIGFzY2VuZGluZyBvYmplY3QgbnVtYmVyKiouXG4gKi9cbnZhciBQREZDcm9zc1JlZlNlY3Rpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGQ3Jvc3NSZWZTZWN0aW9uKGZpcnN0RW50cnkpIHtcbiAgICAgICAgdGhpcy5zdWJzZWN0aW9ucyA9IGZpcnN0RW50cnkgPyBbW2ZpcnN0RW50cnldXSA6IFtdO1xuICAgICAgICB0aGlzLmNodW5rSWR4ID0gMDtcbiAgICAgICAgdGhpcy5jaHVua0xlbmd0aCA9IGZpcnN0RW50cnkgPyAxIDogMDtcbiAgICB9XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5hZGRFbnRyeSA9IGZ1bmN0aW9uIChyZWYsIG9mZnNldCkge1xuICAgICAgICB0aGlzLmFwcGVuZCh7IHJlZjogcmVmLCBvZmZzZXQ6IG9mZnNldCwgZGVsZXRlZDogZmFsc2UgfSk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLmFkZERlbGV0ZWRFbnRyeSA9IGZ1bmN0aW9uIChyZWYsIG5leHRGcmVlT2JqZWN0TnVtYmVyKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKHsgcmVmOiByZWYsIG9mZnNldDogbmV4dEZyZWVPYmplY3ROdW1iZXIsIGRlbGV0ZWQ6IHRydWUgfSk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2VjdGlvbiA9IFwieHJlZlxcblwiO1xuICAgICAgICBmb3IgKHZhciByYW5nZUlkeCA9IDAsIHJhbmdlTGVuID0gdGhpcy5zdWJzZWN0aW9ucy5sZW5ndGg7IHJhbmdlSWR4IDwgcmFuZ2VMZW47IHJhbmdlSWR4KyspIHtcbiAgICAgICAgICAgIHZhciByYW5nZSA9IHRoaXMuc3Vic2VjdGlvbnNbcmFuZ2VJZHhdO1xuICAgICAgICAgICAgc2VjdGlvbiArPSByYW5nZVswXS5yZWYub2JqZWN0TnVtYmVyICsgXCIgXCIgKyByYW5nZS5sZW5ndGggKyBcIlxcblwiO1xuICAgICAgICAgICAgZm9yICh2YXIgZW50cnlJZHggPSAwLCBlbnRyeUxlbiA9IHJhbmdlLmxlbmd0aDsgZW50cnlJZHggPCBlbnRyeUxlbjsgZW50cnlJZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHJhbmdlW2VudHJ5SWR4XTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9IHBhZFN0YXJ0KFN0cmluZyhlbnRyeS5vZmZzZXQpLCAxMCwgJzAnKTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9ICcgJztcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9IHBhZFN0YXJ0KFN0cmluZyhlbnRyeS5yZWYuZ2VuZXJhdGlvbk51bWJlciksIDUsICcwJyk7XG4gICAgICAgICAgICAgICAgc2VjdGlvbiArPSAnICc7XG4gICAgICAgICAgICAgICAgc2VjdGlvbiArPSBlbnRyeS5kZWxldGVkID8gJ2YnIDogJ24nO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gJyBcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWN0aW9uO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNpemUgPSA1O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnN1YnNlY3Rpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHN1YnNlY3Rpb24gPSB0aGlzLnN1YnNlY3Rpb25zW2lkeF07XG4gICAgICAgICAgICB2YXIgc3Vic2VjdGlvbkxlbmd0aCA9IHN1YnNlY3Rpb24ubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGZpcnN0RW50cnkgPSBzdWJzZWN0aW9uWzBdO1xuICAgICAgICAgICAgc2l6ZSArPSAyO1xuICAgICAgICAgICAgc2l6ZSArPSBTdHJpbmcoZmlyc3RFbnRyeS5yZWYub2JqZWN0TnVtYmVyKS5sZW5ndGg7XG4gICAgICAgICAgICBzaXplICs9IFN0cmluZyhzdWJzZWN0aW9uTGVuZ3RoKS5sZW5ndGg7XG4gICAgICAgICAgICBzaXplICs9IDIwICogc3Vic2VjdGlvbkxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy54O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5mO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIG9mZnNldCArPSB0aGlzLmNvcHlTdWJzZWN0aW9uc0ludG9CdWZmZXIodGhpcy5zdWJzZWN0aW9ucywgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuY29weVN1YnNlY3Rpb25zSW50b0J1ZmZlciA9IGZ1bmN0aW9uIChzdWJzZWN0aW9ucywgYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHZhciBsZW5ndGggPSBzdWJzZWN0aW9ucy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBzdWJzZWN0aW9uID0gdGhpcy5zdWJzZWN0aW9uc1tpZHhdO1xuICAgICAgICAgICAgdmFyIGZpcnN0T2JqZWN0TnVtYmVyID0gU3RyaW5nKHN1YnNlY3Rpb25bMF0ucmVmLm9iamVjdE51bWJlcik7XG4gICAgICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIoZmlyc3RPYmplY3ROdW1iZXIsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICB2YXIgcmFuZ2VMZW5ndGggPSBTdHJpbmcoc3Vic2VjdGlvbi5sZW5ndGgpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHJhbmdlTGVuZ3RoLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdGhpcy5jb3B5RW50cmllc0ludG9CdWZmZXIoc3Vic2VjdGlvbiwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5jb3B5RW50cmllc0ludG9CdWZmZXIgPSBmdW5jdGlvbiAoZW50cmllcywgYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGVudHJpZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2lkeF07XG4gICAgICAgICAgICB2YXIgZW50cnlPZmZzZXQgPSBwYWRTdGFydChTdHJpbmcoZW50cnkub2Zmc2V0KSwgMTAsICcwJyk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIoZW50cnlPZmZzZXQsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICB2YXIgZW50cnlHZW4gPSBwYWRTdGFydChTdHJpbmcoZW50cnkucmVmLmdlbmVyYXRpb25OdW1iZXIpLCA1LCAnMCcpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKGVudHJ5R2VuLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGVudHJ5LmRlbGV0ZWQgPyBDaGFyQ29kZXMuZiA6IENoYXJDb2Rlcy5uO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMjAgKiBsZW5ndGg7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIChjdXJyRW50cnkpIHtcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2VjdGlvbnMucHVzaChbY3VyckVudHJ5XSk7XG4gICAgICAgICAgICB0aGlzLmNodW5rSWR4ID0gMDtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtMZW5ndGggPSAxO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaHVuayA9IHRoaXMuc3Vic2VjdGlvbnNbdGhpcy5jaHVua0lkeF07XG4gICAgICAgIHZhciBwcmV2RW50cnkgPSBjaHVua1t0aGlzLmNodW5rTGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjdXJyRW50cnkucmVmLm9iamVjdE51bWJlciAtIHByZXZFbnRyeS5yZWYub2JqZWN0TnVtYmVyID4gMSkge1xuICAgICAgICAgICAgdGhpcy5zdWJzZWN0aW9ucy5wdXNoKFtjdXJyRW50cnldKTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtJZHggKz0gMTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtMZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2h1bmsucHVzaChjdXJyRW50cnkpO1xuICAgICAgICAgICAgdGhpcy5jaHVua0xlbmd0aCArPSAxO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24uY3JlYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFBERkNyb3NzUmVmU2VjdGlvbih7XG4gICAgICAgICAgICByZWY6IFBERlJlZi5vZigwLCA2NTUzNSksXG4gICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICBkZWxldGVkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5jcmVhdGVFbXB0eSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBQREZDcm9zc1JlZlNlY3Rpb24oKTsgfTtcbiAgICByZXR1cm4gUERGQ3Jvc3NSZWZTZWN0aW9uO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkNyb3NzUmVmU2VjdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkNyb3NzUmVmU2VjdGlvbi5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjaGFyRnJvbUNvZGUsIGNvcHlTdHJpbmdJbnRvQnVmZmVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGSGVhZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkhlYWRlcihtYWpvciwgbWlub3IpIHtcbiAgICAgICAgdGhpcy5tYWpvciA9IFN0cmluZyhtYWpvcik7XG4gICAgICAgIHRoaXMubWlub3IgPSBTdHJpbmcobWlub3IpO1xuICAgIH1cbiAgICBQREZIZWFkZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYmMgPSBjaGFyRnJvbUNvZGUoMTI5KTtcbiAgICAgICAgcmV0dXJuIFwiJVBERi1cIiArIHRoaXMubWFqb3IgKyBcIi5cIiArIHRoaXMubWlub3IgKyBcIlxcbiVcIiArIGJjICsgYmMgKyBiYyArIGJjO1xuICAgIH07XG4gICAgUERGSGVhZGVyLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDEyICsgdGhpcy5tYWpvci5sZW5ndGggKyB0aGlzLm1pbm9yLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERkhlYWRlci5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5QZXJjZW50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlA7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuRDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5GO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkRhc2g7XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLm1ham9yLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUGVyaW9kO1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5taW5vciwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUGVyY2VudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IDEyOTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IDEyOTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IDEyOTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IDEyOTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZIZWFkZXIuZm9yVmVyc2lvbiA9IGZ1bmN0aW9uIChtYWpvciwgbWlub3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZIZWFkZXIobWFqb3IsIG1pbm9yKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZIZWFkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGSGVhZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGSGVhZGVyLmpzLm1hcCIsImltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGVHJhaWxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZUcmFpbGVyKGxhc3RYUmVmT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMubGFzdFhSZWZPZmZzZXQgPSBTdHJpbmcobGFzdFhSZWZPZmZzZXQpO1xuICAgIH1cbiAgICBQREZUcmFpbGVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwic3RhcnR4cmVmXFxuXCIgKyB0aGlzLmxhc3RYUmVmT2Zmc2V0ICsgXCJcXG4lJUVPRlwiO1xuICAgIH07XG4gICAgUERGVHJhaWxlci5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAxNiArIHRoaXMubGFzdFhSZWZPZmZzZXQubGVuZ3RoO1xuICAgIH07XG4gICAgUERGVHJhaWxlci5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5zO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuYTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMueDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5sYXN0WFJlZk9mZnNldCwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUGVyY2VudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5QZXJjZW50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTztcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5GO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERlRyYWlsZXIuZm9yTGFzdENyb3NzUmVmU2VjdGlvbk9mZnNldCA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZUcmFpbGVyKG9mZnNldCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGVHJhaWxlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZUcmFpbGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGVHJhaWxlci5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgUERGVHJhaWxlckRpY3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGVHJhaWxlckRpY3QoZGljdCkge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIH1cbiAgICBQREZUcmFpbGVyRGljdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcInRyYWlsZXJcXG5cIiArIHRoaXMuZGljdC50b1N0cmluZygpO1xuICAgIH07XG4gICAgUERGVHJhaWxlckRpY3QucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gOCArIHRoaXMuZGljdC5zaXplSW5CeXRlcygpO1xuICAgIH07XG4gICAgUERGVHJhaWxlckRpY3QucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmE7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuaTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5sO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBvZmZzZXQgKz0gdGhpcy5kaWN0LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERlRyYWlsZXJEaWN0Lm9mID0gZnVuY3Rpb24gKGRpY3QpIHsgcmV0dXJuIG5ldyBQREZUcmFpbGVyRGljdChkaWN0KTsgfTtcbiAgICByZXR1cm4gUERGVHJhaWxlckRpY3Q7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGVHJhaWxlckRpY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZUcmFpbGVyRGljdC5qcy5tYXAiLCJpbXBvcnQgeyB0b0hleFN0cmluZywgdG9IZXhTdHJpbmdPZk1pbkxlbmd0aCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgaGFzU3Vycm9nYXRlcywgaGlnaFN1cnJvZ2F0ZSwgaXNXaXRoaW5CTVAsIGxvd1N1cnJvZ2F0ZSwgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdW5pY29kZVwiO1xuLyoqIGBnbHlwaHNgIHNob3VsZCBiZSBhbiBhcnJheSBvZiB1bmlxdWUgZ2x5cGhzICovXG5leHBvcnQgdmFyIGNyZWF0ZUNtYXAgPSBmdW5jdGlvbiAoZ2x5cGhzLCBnbHlwaElkKSB7XG4gICAgdmFyIGJmQ2hhcnMgPSBuZXcgQXJyYXkoZ2x5cGhzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaWR4XTtcbiAgICAgICAgdmFyIGlkID0gY21hcEhleEZvcm1hdChjbWFwSGV4U3RyaW5nKGdseXBoSWQoZ2x5cGgpKSk7XG4gICAgICAgIHZhciB1bmljb2RlID0gY21hcEhleEZvcm1hdC5hcHBseSh2b2lkIDAsIGdseXBoLmNvZGVQb2ludHMubWFwKGNtYXBDb2RlUG9pbnRGb3JtYXQpKTtcbiAgICAgICAgYmZDaGFyc1tpZHhdID0gW2lkLCB1bmljb2RlXTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGxDbWFwVGVtcGxhdGUoYmZDaGFycyk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBUZW1wbGF0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbnZhciBmaWxsQ21hcFRlbXBsYXRlID0gZnVuY3Rpb24gKGJmQ2hhcnMpIHsgcmV0dXJuIFwiL0NJREluaXQgL1Byb2NTZXQgZmluZHJlc291cmNlIGJlZ2luXFxuMTIgZGljdCBiZWdpblxcbmJlZ2luY21hcFxcbi9DSURTeXN0ZW1JbmZvIDw8XFxuICAvUmVnaXN0cnkgKEFkb2JlKVxcbiAgL09yZGVyaW5nIChVQ1MpXFxuICAvU3VwcGxlbWVudCAwXFxuPj4gZGVmXFxuL0NNYXBOYW1lIC9BZG9iZS1JZGVudGl0eS1VQ1MgZGVmXFxuL0NNYXBUeXBlIDIgZGVmXFxuMSBiZWdpbmNvZGVzcGFjZXJhbmdlXFxuPDAwMDA+PGZmZmY+XFxuZW5kY29kZXNwYWNlcmFuZ2VcXG5cIiArIGJmQ2hhcnMubGVuZ3RoICsgXCIgYmVnaW5iZmNoYXJcXG5cIiArIGJmQ2hhcnMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBnbHlwaElkID0gX2FbMF0sIGNvZGVQb2ludCA9IF9hWzFdO1xuICAgIHJldHVybiBnbHlwaElkICsgXCIgXCIgKyBjb2RlUG9pbnQ7XG59KS5qb2luKCdcXG4nKSArIFwiXFxuZW5kYmZjaGFyXFxuZW5kY21hcFxcbkNNYXBOYW1lIGN1cnJlbnRkaWN0IC9DTWFwIGRlZmluZXJlc291cmNlIHBvcFxcbmVuZFxcbmVuZFwiOyB9O1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBVdGlsaXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbnZhciBjbWFwSGV4Rm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YWx1ZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgcmV0dXJuIFwiPFwiICsgdmFsdWVzLmpvaW4oJycpICsgXCI+XCI7XG59O1xudmFyIGNtYXBIZXhTdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgodmFsdWUsIDQpOyB9O1xudmFyIGNtYXBDb2RlUG9pbnRGb3JtYXQgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgaWYgKGlzV2l0aGluQk1QKGNvZGVQb2ludCkpXG4gICAgICAgIHJldHVybiBjbWFwSGV4U3RyaW5nKGNvZGVQb2ludCk7XG4gICAgaWYgKGhhc1N1cnJvZ2F0ZXMoY29kZVBvaW50KSkge1xuICAgICAgICB2YXIgaHMgPSBoaWdoU3Vycm9nYXRlKGNvZGVQb2ludCk7XG4gICAgICAgIHZhciBscyA9IGxvd1N1cnJvZ2F0ZShjb2RlUG9pbnQpO1xuICAgICAgICByZXR1cm4gXCJcIiArIGNtYXBIZXhTdHJpbmcoaHMpICsgY21hcEhleFN0cmluZyhscyk7XG4gICAgfVxuICAgIHZhciBoZXggPSB0b0hleFN0cmluZyhjb2RlUG9pbnQpO1xuICAgIHZhciBtc2cgPSBcIjB4XCIgKyBoZXggKyBcIiBpcyBub3QgYSB2YWxpZCBVVEYtOCBvciBVVEYtMTYgY29kZXBvaW50LlwiO1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNNYXAuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgY3JlYXRlQ21hcCB9IGZyb20gXCIuL0NNYXBcIjtcbmltcG9ydCB7IGRlcml2ZUZvbnRGbGFncyB9IGZyb20gXCIuL0ZvbnRGbGFnc1wiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgeyBieUFzY2VuZGluZ0lkLCBDYWNoZSwgc29ydGVkVW5pcSwgdG9IZXhTdHJpbmdPZk1pbkxlbmd0aCwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogQSBub3RlIG9mIHRoYW5rcyB0byB0aGUgZGV2ZWxvcGVycyBvZiBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQsIGFzXG4gKiB0aGlzIGNsYXNzIGJvcnJvd3MgZnJvbTpcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL2Rldm9uZ292ZXR0L3BkZmtpdC9ibG9iL2U3MWVkYWIwZGQ0NjU3YjVhNzY3ODA0YmE4NmM5NGM1OGQwMWZiY2EvbGliL2ltYWdlL2pwZWcuY29mZmVlXG4gKi9cbnZhciBDdXN0b21Gb250RW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ3VzdG9tRm9udEVtYmVkZGVyKGZvbnQsIGZvbnREYXRhLCBjdXN0b21OYW1lLCBmb250RmVhdHVyZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5hbGxHbHlwaHNJbkZvbnRTb3J0ZWRCeUlkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGdseXBocyA9IG5ldyBBcnJheShfdGhpcy5mb250LmNoYXJhY3RlclNldC5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBfdGhpcy5mb250LmNoYXJhY3RlclNldFtpZHhdO1xuICAgICAgICAgICAgICAgIGdseXBoc1tpZHhdID0gX3RoaXMuZm9udC5nbHlwaEZvckNvZGVQb2ludChjb2RlUG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNvcnRlZFVuaXEoZ2x5cGhzLnNvcnQoYnlBc2NlbmRpbmdJZCksIGZ1bmN0aW9uIChnKSB7IHJldHVybiBnLmlkOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mb250ID0gZm9udDtcbiAgICAgICAgdGhpcy5zY2FsZSA9IDEwMDAgLyB0aGlzLmZvbnQudW5pdHNQZXJFbTtcbiAgICAgICAgdGhpcy5mb250RGF0YSA9IGZvbnREYXRhO1xuICAgICAgICB0aGlzLmZvbnROYW1lID0gdGhpcy5mb250LnBvc3RzY3JpcHROYW1lIHx8ICdGb250JztcbiAgICAgICAgdGhpcy5jdXN0b21OYW1lID0gY3VzdG9tTmFtZTtcbiAgICAgICAgdGhpcy5mb250RmVhdHVyZXMgPSBmb250RmVhdHVyZXM7XG4gICAgICAgIHRoaXMuYmFzZUZvbnROYW1lID0gJyc7XG4gICAgICAgIHRoaXMuZ2x5cGhDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KHRoaXMuYWxsR2x5cGhzSW5Gb250U29ydGVkQnlJZCk7XG4gICAgfVxuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoZm9udGtpdCwgZm9udERhdGEsIGN1c3RvbU5hbWUsIGZvbnRGZWF0dXJlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZm9udDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgZm9udGtpdC5jcmVhdGUoZm9udERhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgQ3VzdG9tRm9udEVtYmVkZGVyKGZvbnQsIGZvbnREYXRhLCBjdXN0b21OYW1lLCBmb250RmVhdHVyZXMpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbmNvZGUgdGhlIEphdmFTY3JpcHQgc3RyaW5nIGludG8gdGhpcyBmb250LiAoSmF2YVNjcmlwdCBlbmNvZGVzIHN0cmluZ3MgaW5cbiAgICAgKiBVbmljb2RlLCBidXQgZW1iZWRkZWQgZm9udHMgdXNlIHRoZWlyIG93biBjdXN0b20gZW5jb2RpbmdzKVxuICAgICAqL1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW5jb2RlVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHZhciBnbHlwaHMgPSB0aGlzLmZvbnQubGF5b3V0KHRleHQsIHRoaXMuZm9udEZlYXR1cmVzKS5nbHlwaHM7XG4gICAgICAgIHZhciBoZXhDb2RlcyA9IG5ldyBBcnJheShnbHlwaHMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgaGV4Q29kZXNbaWR4XSA9IHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgoZ2x5cGhzW2lkeF0uaWQsIDQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQREZIZXhTdHJpbmcub2YoaGV4Q29kZXMuam9pbignJykpO1xuICAgIH07XG4gICAgLy8gVGhlIGFkdmFuY2VXaWR0aCB0YWtlcyBpbnRvIGFjY291bnQga2VybmluZyBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBkb24ndFxuICAgIC8vIGhhdmUgdG8gZG8gdGhhdCBtYW51YWxseSBsaWtlIHdlIGRvIGZvciB0aGUgc3RhbmRhcmQgZm9udHMuXG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS53aWR0aE9mVGV4dEF0U2l6ZSA9IGZ1bmN0aW9uICh0ZXh0LCBzaXplKSB7XG4gICAgICAgIHZhciBnbHlwaHMgPSB0aGlzLmZvbnQubGF5b3V0KHRleHQsIHRoaXMuZm9udEZlYXR1cmVzKS5nbHlwaHM7XG4gICAgICAgIHZhciB0b3RhbFdpZHRoID0gMDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdG90YWxXaWR0aCArPSBnbHlwaHNbaWR4XS5hZHZhbmNlV2lkdGggKiB0aGlzLnNjYWxlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzY2FsZSA9IHNpemUgLyAxMDAwO1xuICAgICAgICByZXR1cm4gdG90YWxXaWR0aCAqIHNjYWxlO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5oZWlnaHRPZkZvbnRBdFNpemUgPSBmdW5jdGlvbiAoc2l6ZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgX2EgPSBvcHRpb25zLmRlc2NlbmRlciwgZGVzY2VuZGVyID0gX2EgPT09IHZvaWQgMCA/IHRydWUgOiBfYTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5mb250LCBhc2NlbnQgPSBfYi5hc2NlbnQsIGRlc2NlbnQgPSBfYi5kZXNjZW50LCBiYm94ID0gX2IuYmJveDtcbiAgICAgICAgdmFyIHlUb3AgPSAoYXNjZW50IHx8IGJib3gubWF4WSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICB2YXIgeUJvdHRvbSA9IChkZXNjZW50IHx8IGJib3gubWluWSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICB2YXIgaGVpZ2h0ID0geVRvcCAtIHlCb3R0b207XG4gICAgICAgIGlmICghZGVzY2VuZGVyKVxuICAgICAgICAgICAgaGVpZ2h0IC09IE1hdGguYWJzKGRlc2NlbnQpIHx8IDA7XG4gICAgICAgIHJldHVybiAoaGVpZ2h0IC8gMTAwMCkgKiBzaXplO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5zaXplT2ZGb250QXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZm9udCwgYXNjZW50ID0gX2EuYXNjZW50LCBkZXNjZW50ID0gX2EuZGVzY2VudCwgYmJveCA9IF9hLmJib3g7XG4gICAgICAgIHZhciB5VG9wID0gKGFzY2VudCB8fCBiYm94Lm1heFkpICogdGhpcy5zY2FsZTtcbiAgICAgICAgdmFyIHlCb3R0b20gPSAoZGVzY2VudCB8fCBiYm94Lm1pblkpICogdGhpcy5zY2FsZTtcbiAgICAgICAgcmV0dXJuICgxMDAwICogaGVpZ2h0KSAvICh5VG9wIC0geUJvdHRvbSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHRoaXMuYmFzZUZvbnROYW1lID1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9tTmFtZSB8fCBjb250ZXh0LmFkZFJhbmRvbVN1ZmZpeCh0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRGb250RGljdChjb250ZXh0LCByZWYpO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEZvbnREaWN0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY2lkRm9udERpY3RSZWYsIHVuaWNvZGVDTWFwUmVmLCBmb250RGljdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZENJREZvbnREaWN0KGNvbnRleHQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2lkRm9udERpY3RSZWYgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlQ01hcFJlZiA9IHRoaXMuZW1iZWRVbmljb2RlQ21hcChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnREaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6ICdGb250JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlOiAnVHlwZTAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VGb250OiB0aGlzLmJhc2VGb250TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZzogJ0lkZW50aXR5LUgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NlbmRhbnRGb250czogW2NpZEZvbnREaWN0UmVmXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb1VuaWNvZGU6IHVuaWNvZGVDTWFwUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCBmb250RGljdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcihmb250RGljdCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuaXNDRkYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvbnQuY2ZmO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZENJREZvbnREaWN0ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZvbnREZXNjcmlwdG9yUmVmLCBjaWRGb250RGljdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEZvbnREZXNjcmlwdG9yKGNvbnRleHQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0b3JSZWYgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaWRGb250RGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnRm9udCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogdGhpcy5pc0NGRigpID8gJ0NJREZvbnRUeXBlMCcgOiAnQ0lERm9udFR5cGUyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSURUb0dJRE1hcDogJ0lkZW50aXR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlRm9udDogdGhpcy5iYXNlRm9udE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lEU3lzdGVtSW5mbzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RyeTogUERGU3RyaW5nLm9mKCdBZG9iZScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmRlcmluZzogUERGU3RyaW5nLm9mKCdJZGVudGl0eScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBwbGVtZW50OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9udERlc2NyaXB0b3I6IGZvbnREZXNjcmlwdG9yUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFc6IHRoaXMuY29tcHV0ZVdpZHRocygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3RlcihjaWRGb250RGljdCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRGb250RGVzY3JpcHRvciA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmb250U3RyZWFtUmVmLCBzY2FsZSwgX2EsIGl0YWxpY0FuZ2xlLCBhc2NlbnQsIGRlc2NlbnQsIGNhcEhlaWdodCwgeEhlaWdodCwgX2IsIG1pblgsIG1pblksIG1heFgsIG1heFksIGZvbnREZXNjcmlwdG9yO1xuICAgICAgICAgICAgdmFyIF9jO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2QubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkRm9udFN0cmVhbShjb250ZXh0KV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTdHJlYW1SZWYgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHRoaXMuc2NhbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHRoaXMuZm9udCwgaXRhbGljQW5nbGUgPSBfYS5pdGFsaWNBbmdsZSwgYXNjZW50ID0gX2EuYXNjZW50LCBkZXNjZW50ID0gX2EuZGVzY2VudCwgY2FwSGVpZ2h0ID0gX2EuY2FwSGVpZ2h0LCB4SGVpZ2h0ID0gX2EueEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gdGhpcy5mb250LmJib3gsIG1pblggPSBfYi5taW5YLCBtaW5ZID0gX2IubWluWSwgbWF4WCA9IF9iLm1heFgsIG1heFkgPSBfYi5tYXhZO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udERlc2NyaXB0b3IgPSBjb250ZXh0Lm9iaigoX2MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6ICdGb250RGVzY3JpcHRvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnROYW1lOiB0aGlzLmJhc2VGb250TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3M6IGRlcml2ZUZvbnRGbGFncyh0aGlzLmZvbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb250QkJveDogW21pblggKiBzY2FsZSwgbWluWSAqIHNjYWxlLCBtYXhYICogc2NhbGUsIG1heFkgKiBzY2FsZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0YWxpY0FuZ2xlOiBpdGFsaWNBbmdsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNjZW50OiBhc2NlbnQgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY2VudDogZGVzY2VudCAqIHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXBIZWlnaHQ6IChjYXBIZWlnaHQgfHwgYXNjZW50KSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYSGVpZ2h0OiAoeEhlaWdodCB8fCAwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3Qgc3VyZSBob3cgdG8gY29tcHV0ZS9maW5kIHRoaXMsIG5vciBpcyBhbnlib2R5IGVsc2UgcmVhbGx5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTQ4NTE3OS9zdGVtdi12YWx1ZS1vZi10aGUtdHJ1ZXR5cGUtZm9udFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGVtVjogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NbdGhpcy5pc0NGRigpID8gJ0ZvbnRGaWxlMycgOiAnRm9udEZpbGUyJ10gPSBmb250U3RyZWFtUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcihmb250RGVzY3JpcHRvcildO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuc2VyaWFsaXplRm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmZvbnREYXRhXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRGb250U3RyZWFtID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZvbnRTdHJlYW0sIF9hLCBfYjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gKF9hID0gY29udGV4dCkuZmxhdGVTdHJlYW07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNlcmlhbGl6ZUZvbnQoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTdHJlYW0gPSBfYi5hcHBseShfYSwgW19jLnNlbnQoKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlOiB0aGlzLmlzQ0ZGKCkgPyAnQ0lERm9udFR5cGUwQycgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoZm9udFN0cmVhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRVbmljb2RlQ21hcCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBjbWFwID0gY3JlYXRlQ21hcCh0aGlzLmdseXBoQ2FjaGUuYWNjZXNzKCksIHRoaXMuZ2x5cGhJZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdmFyIGNtYXBTdHJlYW0gPSBjb250ZXh0LmZsYXRlU3RyZWFtKGNtYXApO1xuICAgICAgICByZXR1cm4gY29udGV4dC5yZWdpc3RlcihjbWFwU3RyZWFtKTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZ2x5cGhJZCA9IGZ1bmN0aW9uIChnbHlwaCkge1xuICAgICAgICByZXR1cm4gZ2x5cGggPyBnbHlwaC5pZCA6IC0xO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5jb21wdXRlV2lkdGhzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5nbHlwaENhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgd2lkdGhzID0gW107XG4gICAgICAgIHZhciBjdXJyU2VjdGlvbiA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnbHlwaHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgY3VyckdseXBoID0gZ2x5cGhzW2lkeF07XG4gICAgICAgICAgICB2YXIgcHJldkdseXBoID0gZ2x5cGhzW2lkeCAtIDFdO1xuICAgICAgICAgICAgdmFyIGN1cnJHbHlwaElkID0gdGhpcy5nbHlwaElkKGN1cnJHbHlwaCk7XG4gICAgICAgICAgICB2YXIgcHJldkdseXBoSWQgPSB0aGlzLmdseXBoSWQocHJldkdseXBoKTtcbiAgICAgICAgICAgIGlmIChpZHggPT09IDApIHtcbiAgICAgICAgICAgICAgICB3aWR0aHMucHVzaChjdXJyR2x5cGhJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyR2x5cGhJZCAtIHByZXZHbHlwaElkICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgd2lkdGhzLnB1c2goY3VyclNlY3Rpb24pO1xuICAgICAgICAgICAgICAgIHdpZHRocy5wdXNoKGN1cnJHbHlwaElkKTtcbiAgICAgICAgICAgICAgICBjdXJyU2VjdGlvbiA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyclNlY3Rpb24ucHVzaChjdXJyR2x5cGguYWR2YW5jZVdpZHRoICogdGhpcy5zY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgd2lkdGhzLnB1c2goY3VyclNlY3Rpb24pO1xuICAgICAgICByZXR1cm4gd2lkdGhzO1xuICAgIH07XG4gICAgcmV0dXJuIEN1c3RvbUZvbnRFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBDdXN0b21Gb250RW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdXN0b21Gb250RW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgQ3VzdG9tRm9udEVtYmVkZGVyIGZyb20gXCIuL0N1c3RvbUZvbnRFbWJlZGRlclwiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCB7IENhY2hlLCBtZXJnZVVpbnQ4QXJyYXlzLCB0b0hleFN0cmluZ09mTWluTGVuZ3RoIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIEEgbm90ZSBvZiB0aGFua3MgdG8gdGhlIGRldmVsb3BlcnMgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0LCBhc1xuICogdGhpcyBjbGFzcyBib3Jyb3dzIGZyb206XG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZvbmdvdmV0dC9wZGZraXQvYmxvYi9lNzFlZGFiMGRkNDY1N2I1YTc2NzgwNGJhODZjOTRjNThkMDFmYmNhL2xpYi9pbWFnZS9qcGVnLmNvZmZlZVxuICovXG52YXIgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyKGZvbnQsIGZvbnREYXRhLCBjdXN0b21Gb250TmFtZSwgZm9udEZlYXR1cmVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGZvbnQsIGZvbnREYXRhLCBjdXN0b21Gb250TmFtZSwgZm9udEZlYXR1cmVzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdWJzZXQgPSBfdGhpcy5mb250LmNyZWF0ZVN1YnNldCgpO1xuICAgICAgICBfdGhpcy5nbHlwaHMgPSBbXTtcbiAgICAgICAgX3RoaXMuZ2x5cGhDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLmdseXBoczsgfSk7XG4gICAgICAgIF90aGlzLmdseXBoSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChmb250a2l0LCBmb250RGF0YSwgY3VzdG9tRm9udE5hbWUsIGZvbnRGZWF0dXJlcykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZm9udDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgZm9udGtpdC5jcmVhdGUoZm9udERhdGEpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyKGZvbnQsIGZvbnREYXRhLCBjdXN0b21Gb250TmFtZSwgZm9udEZlYXR1cmVzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLnByb3RvdHlwZS5lbmNvZGVUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgdmFyIGdseXBocyA9IHRoaXMuZm9udC5sYXlvdXQodGV4dCwgdGhpcy5mb250RmVhdHVyZXMpLmdseXBocztcbiAgICAgICAgdmFyIGhleENvZGVzID0gbmV3IEFycmF5KGdseXBocy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnbHlwaHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdWJzZXRHbHlwaElkID0gdGhpcy5zdWJzZXQuaW5jbHVkZUdseXBoKGdseXBoKTtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhzW3N1YnNldEdseXBoSWQgLSAxXSA9IGdseXBoO1xuICAgICAgICAgICAgdGhpcy5nbHlwaElkTWFwLnNldChnbHlwaC5pZCwgc3Vic2V0R2x5cGhJZCk7XG4gICAgICAgICAgICBoZXhDb2Rlc1tpZHhdID0gdG9IZXhTdHJpbmdPZk1pbkxlbmd0aChzdWJzZXRHbHlwaElkLCA0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdseXBoQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICByZXR1cm4gUERGSGV4U3RyaW5nLm9mKGhleENvZGVzLmpvaW4oJycpKTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5wcm90b3R5cGUuaXNDRkYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YnNldC5jZmY7XG4gICAgfTtcbiAgICBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIucHJvdG90eXBlLmdseXBoSWQgPSBmdW5jdGlvbiAoZ2x5cGgpIHtcbiAgICAgICAgcmV0dXJuIGdseXBoID8gdGhpcy5nbHlwaElkTWFwLmdldChnbHlwaC5pZCkgOiAtMTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5wcm90b3R5cGUuc2VyaWFsaXplRm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgICAgICAgICAgX3RoaXMuc3Vic2V0XG4gICAgICAgICAgICAgICAgLmVuY29kZVN0cmVhbSgpXG4gICAgICAgICAgICAgICAgLm9uKCdkYXRhJywgZnVuY3Rpb24gKGJ5dGVzKSB7IHJldHVybiBwYXJ0cy5wdXNoKGJ5dGVzKTsgfSlcbiAgICAgICAgICAgICAgICAub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc29sdmUobWVyZ2VVaW50OEFycmF5cyhwYXJ0cykpOyB9KVxuICAgICAgICAgICAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiByZWplY3QoZXJyKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlcjtcbn0oQ3VzdG9tRm9udEVtYmVkZGVyKSk7XG5leHBvcnQgZGVmYXVsdCBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdXN0b21Gb250U3Vic2V0RW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG4vKipcbiAqIEZyb20gdGhlIFBERi1BMyBzcGVjaWZpY2F0aW9uLCBzZWN0aW9uICoqMy4xLiBSZXF1aXJlbWVudHMgLSBHZW5lcmFsKiouXG4gKiBTZWU6XG4gKiAqIGh0dHBzOi8vd3d3LnBkZmEub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE4LzEwL1BERjIwX0FOMDAyLUFGLnBkZlxuICovXG5leHBvcnQgdmFyIEFGUmVsYXRpb25zaGlwO1xuKGZ1bmN0aW9uIChBRlJlbGF0aW9uc2hpcCkge1xuICAgIEFGUmVsYXRpb25zaGlwW1wiU291cmNlXCJdID0gXCJTb3VyY2VcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIkRhdGFcIl0gPSBcIkRhdGFcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIkFsdGVybmF0aXZlXCJdID0gXCJBbHRlcm5hdGl2ZVwiO1xuICAgIEFGUmVsYXRpb25zaGlwW1wiU3VwcGxlbWVudFwiXSA9IFwiU3VwcGxlbWVudFwiO1xuICAgIEFGUmVsYXRpb25zaGlwW1wiRW5jcnlwdGVkUGF5bG9hZFwiXSA9IFwiRW5jcnlwdGVkUGF5bG9hZFwiO1xuICAgIEFGUmVsYXRpb25zaGlwW1wiRm9ybURhdGFcIl0gPSBcIkVuY3J5cHRlZFBheWxvYWRcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIlNjaGVtYVwiXSA9IFwiU2NoZW1hXCI7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJVbnNwZWNpZmllZFwiXSA9IFwiVW5zcGVjaWZpZWRcIjtcbn0pKEFGUmVsYXRpb25zaGlwIHx8IChBRlJlbGF0aW9uc2hpcCA9IHt9KSk7XG52YXIgRmlsZUVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZpbGVFbWJlZGRlcihmaWxlRGF0YSwgZmlsZU5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdGhpcy5maWxlRGF0YSA9IGZpbGVEYXRhO1xuICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIEZpbGVFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoYnl0ZXMsIGZpbGVOYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBuZXcgRmlsZUVtYmVkZGVyKGJ5dGVzLCBmaWxlTmFtZSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBGaWxlRW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgbWltZVR5cGUsIGRlc2NyaXB0aW9uLCBjcmVhdGlvbkRhdGUsIG1vZGlmaWNhdGlvbkRhdGUsIGFmUmVsYXRpb25zaGlwLCBlbWJlZGRlZEZpbGVTdHJlYW0sIGVtYmVkZGVkRmlsZVN0cmVhbVJlZiwgZmlsZVNwZWNEaWN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIF9hID0gdGhpcy5vcHRpb25zLCBtaW1lVHlwZSA9IF9hLm1pbWVUeXBlLCBkZXNjcmlwdGlvbiA9IF9hLmRlc2NyaXB0aW9uLCBjcmVhdGlvbkRhdGUgPSBfYS5jcmVhdGlvbkRhdGUsIG1vZGlmaWNhdGlvbkRhdGUgPSBfYS5tb2RpZmljYXRpb25EYXRlLCBhZlJlbGF0aW9uc2hpcCA9IF9hLmFmUmVsYXRpb25zaGlwO1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkRmlsZVN0cmVhbSA9IGNvbnRleHQuZmxhdGVTdHJlYW0odGhpcy5maWxlRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnRW1iZWRkZWRGaWxlJyxcbiAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogbWltZVR5cGUgIT09IG51bGwgJiYgbWltZVR5cGUgIT09IHZvaWQgMCA/IG1pbWVUeXBlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFNpemU6IHRoaXMuZmlsZURhdGEubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25EYXRlOiBjcmVhdGlvbkRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFBERlN0cmluZy5mcm9tRGF0ZShjcmVhdGlvbkRhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBNb2REYXRlOiBtb2RpZmljYXRpb25EYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQREZTdHJpbmcuZnJvbURhdGUobW9kaWZpY2F0aW9uRGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZEZpbGVTdHJlYW1SZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGVtYmVkZGVkRmlsZVN0cmVhbSk7XG4gICAgICAgICAgICAgICAgZmlsZVNwZWNEaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnRmlsZXNwZWMnLFxuICAgICAgICAgICAgICAgICAgICBGOiBQREZTdHJpbmcub2YodGhpcy5maWxlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIFVGOiBQREZIZXhTdHJpbmcuZnJvbVRleHQodGhpcy5maWxlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIEVGOiB7IEY6IGVtYmVkZGVkRmlsZVN0cmVhbVJlZiB9LFxuICAgICAgICAgICAgICAgICAgICBEZXNjOiBkZXNjcmlwdGlvbiA/IFBERkhleFN0cmluZy5mcm9tVGV4dChkZXNjcmlwdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIEFGUmVsYXRpb25zaGlwOiBhZlJlbGF0aW9uc2hpcCAhPT0gbnVsbCAmJiBhZlJlbGF0aW9uc2hpcCAhPT0gdm9pZCAwID8gYWZSZWxhdGlvbnNoaXAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmFzc2lnbihyZWYsIGZpbGVTcGVjRGljdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoZmlsZVNwZWNEaWN0KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBGaWxlRW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgRmlsZUVtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZUVtYmVkZGVyLmpzLm1hcCIsIi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIG1ha2VGb250RmxhZ3MgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBmbGFncyA9IDA7XG4gICAgdmFyIGZsaXBCaXQgPSBmdW5jdGlvbiAoYml0KSB7IGZsYWdzIHw9ICgxIDw8IChiaXQgLSAxKSk7IH07XG4gICAgaWYgKG9wdGlvbnMuZml4ZWRQaXRjaClcbiAgICAgICAgZmxpcEJpdCgxKTtcbiAgICBpZiAob3B0aW9ucy5zZXJpZilcbiAgICAgICAgZmxpcEJpdCgyKTtcbiAgICBpZiAob3B0aW9ucy5zeW1ib2xpYylcbiAgICAgICAgZmxpcEJpdCgzKTtcbiAgICBpZiAob3B0aW9ucy5zY3JpcHQpXG4gICAgICAgIGZsaXBCaXQoNCk7XG4gICAgaWYgKG9wdGlvbnMubm9uc3ltYm9saWMpXG4gICAgICAgIGZsaXBCaXQoNik7XG4gICAgaWYgKG9wdGlvbnMuaXRhbGljKVxuICAgICAgICBmbGlwQml0KDcpO1xuICAgIGlmIChvcHRpb25zLmFsbENhcClcbiAgICAgICAgZmxpcEJpdCgxNyk7XG4gICAgaWYgKG9wdGlvbnMuc21hbGxDYXApXG4gICAgICAgIGZsaXBCaXQoMTgpO1xuICAgIGlmIChvcHRpb25zLmZvcmNlQm9sZClcbiAgICAgICAgZmxpcEJpdCgxOSk7XG4gICAgcmV0dXJuIGZsYWdzO1xufTtcbi8vIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdC9ibG9iLzgzZjVmNzI0MzE3MmEwMTdhZGNmNmE3ZmFhNTU0N2M1NTk4MmM1N2IvbGliL2ZvbnQvZW1iZWRkZWQuanMjTDEyMy1MMTI5XG5leHBvcnQgdmFyIGRlcml2ZUZvbnRGbGFncyA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgdmFyIGZhbWlseUNsYXNzID0gZm9udFsnT1MvMiddID8gZm9udFsnT1MvMiddLnNGYW1pbHlDbGFzcyA6IDA7XG4gICAgdmFyIGZsYWdzID0gbWFrZUZvbnRGbGFncyh7XG4gICAgICAgIGZpeGVkUGl0Y2g6IGZvbnQucG9zdC5pc0ZpeGVkUGl0Y2gsXG4gICAgICAgIHNlcmlmOiAxIDw9IGZhbWlseUNsYXNzICYmIGZhbWlseUNsYXNzIDw9IDcsXG4gICAgICAgIHN5bWJvbGljOiB0cnVlLFxuICAgICAgICBzY3JpcHQ6IGZhbWlseUNsYXNzID09PSAxMCxcbiAgICAgICAgaXRhbGljOiBmb250LmhlYWQubWFjU3R5bGUuaXRhbGljLFxuICAgIH0pO1xuICAgIHJldHVybiBmbGFncztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Gb250RmxhZ3MuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbnZhciBKYXZhU2NyaXB0RW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSmF2YVNjcmlwdEVtYmVkZGVyKHNjcmlwdCwgc2NyaXB0TmFtZSkge1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdDtcbiAgICAgICAgdGhpcy5zY3JpcHROYW1lID0gc2NyaXB0TmFtZTtcbiAgICB9XG4gICAgSmF2YVNjcmlwdEVtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChzY3JpcHQsIHNjcmlwdE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKYXZhU2NyaXB0RW1iZWRkZXIoc2NyaXB0LCBzY3JpcHROYW1lKTtcbiAgICB9O1xuICAgIEphdmFTY3JpcHRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRJbnRvQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGpzQWN0aW9uRGljdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBqc0FjdGlvbkRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdBY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICBTOiAnSmF2YVNjcmlwdCcsXG4gICAgICAgICAgICAgICAgICAgIEpTOiBQREZIZXhTdHJpbmcuZnJvbVRleHQodGhpcy5zY3JpcHQpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCBqc0FjdGlvbkRpY3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKGpzQWN0aW9uRGljdCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gSmF2YVNjcmlwdEVtYmVkZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEphdmFTY3JpcHRFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUphdmFTY3JpcHRFbWJlZGRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBNQVJLRVJTID0gW1xuICAgIDB4ZmZjMCwgMHhmZmMxLCAweGZmYzIsXG4gICAgMHhmZmMzLCAweGZmYzUsIDB4ZmZjNixcbiAgICAweGZmYzcsIDB4ZmZjOCwgMHhmZmM5LFxuICAgIDB4ZmZjYSwgMHhmZmNiLCAweGZmY2MsXG4gICAgMHhmZmNkLCAweGZmY2UsIDB4ZmZjZixcbl07XG52YXIgQ29sb3JTcGFjZTtcbihmdW5jdGlvbiAoQ29sb3JTcGFjZSkge1xuICAgIENvbG9yU3BhY2VbXCJEZXZpY2VHcmF5XCJdID0gXCJEZXZpY2VHcmF5XCI7XG4gICAgQ29sb3JTcGFjZVtcIkRldmljZVJHQlwiXSA9IFwiRGV2aWNlUkdCXCI7XG4gICAgQ29sb3JTcGFjZVtcIkRldmljZUNNWUtcIl0gPSBcIkRldmljZUNNWUtcIjtcbn0pKENvbG9yU3BhY2UgfHwgKENvbG9yU3BhY2UgPSB7fSkpO1xudmFyIENoYW5uZWxUb0NvbG9yU3BhY2UgPSB7XG4gICAgMTogQ29sb3JTcGFjZS5EZXZpY2VHcmF5LFxuICAgIDM6IENvbG9yU3BhY2UuRGV2aWNlUkdCLFxuICAgIDQ6IENvbG9yU3BhY2UuRGV2aWNlQ01ZSyxcbn07XG4vKipcbiAqIEEgbm90ZSBvZiB0aGFua3MgdG8gdGhlIGRldmVsb3BlcnMgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0LCBhc1xuICogdGhpcyBjbGFzcyBib3Jyb3dzIGZyb206XG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdC9ibG9iL2E2YWY3NjQ2N2NlMDZiZDZhMmFmNGFhNzI3MWNjYWM5ZmYxNTJhN2QvbGliL2ltYWdlL2pwZWcuanNcbiAqL1xudmFyIEpwZWdFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBKcGVnRW1iZWRkZXIoaW1hZ2VEYXRhLCBiaXRzUGVyQ29tcG9uZW50LCB3aWR0aCwgaGVpZ2h0LCBjb2xvclNwYWNlKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgICAgICB0aGlzLmJpdHNQZXJDb21wb25lbnQgPSBiaXRzUGVyQ29tcG9uZW50O1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbG9yU3BhY2UgPSBjb2xvclNwYWNlO1xuICAgIH1cbiAgICBKcGVnRW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKGltYWdlRGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGF0YVZpZXcsIHNvaSwgcG9zLCBtYXJrZXIsIGJpdHNQZXJDb21wb25lbnQsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxCeXRlLCBjaGFubmVsTmFtZSwgY29sb3JTcGFjZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhpbWFnZURhdGEuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBzb2kgPSBkYXRhVmlldy5nZXRVaW50MTYoMCk7XG4gICAgICAgICAgICAgICAgaWYgKHNvaSAhPT0gMHhmZmQ4KVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NPSSBub3QgZm91bmQgaW4gSlBFRycpO1xuICAgICAgICAgICAgICAgIHBvcyA9IDI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gZGF0YVZpZXcuZ2V0VWludDE2KHBvcyk7XG4gICAgICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTUFSS0VSUy5pbmNsdWRlcyhtYXJrZXIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHBvcyArPSBkYXRhVmlldy5nZXRVaW50MTYocG9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFNQVJLRVJTLmluY2x1ZGVzKG1hcmtlcikpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBKUEVHJyk7XG4gICAgICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgICAgICAgICAgYml0c1BlckNvbXBvbmVudCA9IGRhdGFWaWV3LmdldFVpbnQ4KHBvcysrKTtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBkYXRhVmlldy5nZXRVaW50MTYocG9zKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgICAgICAgICB3aWR0aCA9IGRhdGFWaWV3LmdldFVpbnQxNihwb3MpO1xuICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICAgICAgICAgIGNoYW5uZWxCeXRlID0gZGF0YVZpZXcuZ2V0VWludDgocG9zKyspO1xuICAgICAgICAgICAgICAgIGNoYW5uZWxOYW1lID0gQ2hhbm5lbFRvQ29sb3JTcGFjZVtjaGFubmVsQnl0ZV07XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIEpQRUcgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgICAgICBjb2xvclNwYWNlID0gY2hhbm5lbE5hbWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBKcGVnRW1iZWRkZXIoaW1hZ2VEYXRhLCBiaXRzUGVyQ29tcG9uZW50LCB3aWR0aCwgaGVpZ2h0LCBjb2xvclNwYWNlKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBKcGVnRW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB4T2JqZWN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHhPYmplY3QgPSBjb250ZXh0LnN0cmVhbSh0aGlzLmltYWdlRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnWE9iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6ICdJbWFnZScsXG4gICAgICAgICAgICAgICAgICAgIEJpdHNQZXJDb21wb25lbnQ6IHRoaXMuYml0c1BlckNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgV2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIEhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2U6IHRoaXMuY29sb3JTcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgRmlsdGVyOiAnRENURGVjb2RlJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gQ01ZSyBKUEVHIHN0cmVhbXMgaW4gUERGIGFyZSB0eXBpY2FsbHkgc3RvcmVkIGNvbXBsZW1lbnRlZCxcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCAxIGFzICdvZmYnIGFuZCAwIGFzICdvbicgKFBERiAzMjAwMC0xOjIwMDgsIDguNi40LjQpLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGFuZGFsb25lIENNWUsgSlBFRyAodXN1YWxseSBleHBvcnRlZCBieSBQaG90b3Nob3ApIGFyZVxuICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZWQgaW52ZXJzZSwgd2l0aCAwIGFzICdvZmYnIGFuZCAxIGFzICdvbicsIGxpa2UgUkdCLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBBcHBseWluZyBhIHN3YXAgaGVyZSBhcyBhIGhlZGdlIHRoYXQgbW9zdCBieXRlcyBwYXNzaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhpcyBtZXRob2Qgd2lsbCBiZW5lZml0IGZyb20gaXQuXG4gICAgICAgICAgICAgICAgICAgIERlY29kZTogdGhpcy5jb2xvclNwYWNlID09PSBDb2xvclNwYWNlLkRldmljZUNNWUtcbiAgICAgICAgICAgICAgICAgICAgICAgID8gWzEsIDAsIDEsIDAsIDEsIDAsIDEsIDBdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYXNzaWduKHJlZiwgeE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoeE9iamVjdCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gSnBlZ0VtYmVkZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEpwZWdFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpwZWdFbWJlZGRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3IsIFVucmVjb2duaXplZFN0cmVhbVR5cGVFcnJvciwgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlJhd1N0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZSYXdTdHJlYW1cIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGU3RyZWFtXCI7XG5pbXBvcnQgeyBkZWNvZGVQREZSYXdTdHJlYW0gfSBmcm9tIFwiLi4vc3RyZWFtcy9kZWNvZGVcIjtcbmltcG9ydCBQREZDb250ZW50U3RyZWFtIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERkNvbnRlbnRTdHJlYW1cIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IG1lcmdlSW50b1R5cGVkQXJyYXkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBmdWxsUGFnZUJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICB2YXIgbWVkaWFCb3ggPSBwYWdlLk1lZGlhQm94KCk7XG4gICAgdmFyIHdpZHRoID0gbWVkaWFCb3gubG9va3VwKDIsIFBERk51bWJlcikuYXNOdW1iZXIoKSAtXG4gICAgICAgIG1lZGlhQm94Lmxvb2t1cCgwLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgdmFyIGhlaWdodCA9IG1lZGlhQm94Lmxvb2t1cCgzLCBQREZOdW1iZXIpLmFzTnVtYmVyKCkgLVxuICAgICAgICBtZWRpYUJveC5sb29rdXAoMSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgIHJldHVybiB7IGxlZnQ6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IHdpZHRoLCB0b3A6IGhlaWdodCB9O1xufTtcbi8vIFJldHVybnMgdGhlIGlkZW50aXR5IG1hdHJpeCwgbW9kaWZpZWQgdG8gcG9zaXRpb24gdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuXG4vLyBib3VuZGluZyBib3ggYXQgKDAsIDApLlxudmFyIGJvdW5kaW5nQm94QWRqdXN0ZWRNYXRyaXggPSBmdW5jdGlvbiAoYmIpIHsgcmV0dXJuIFsxLCAwLCAwLCAxLCAtYmIubGVmdCwgLWJiLmJvdHRvbV07IH07XG52YXIgUERGUGFnZUVtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERlBhZ2VFbWJlZGRlcihwYWdlLCBib3VuZGluZ0JveCwgdHJhbnNmb3JtYXRpb25NYXRyaXgpIHtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICAgICAgdmFyIGJiID0gYm91bmRpbmdCb3ggIT09IG51bGwgJiYgYm91bmRpbmdCb3ggIT09IHZvaWQgMCA/IGJvdW5kaW5nQm94IDogZnVsbFBhZ2VCb3VuZGluZ0JveChwYWdlKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IGJiLnJpZ2h0IC0gYmIubGVmdDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBiYi50b3AgLSBiYi5ib3R0b207XG4gICAgICAgIHRoaXMuYm91bmRpbmdCb3ggPSBiYjtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IHRyYW5zZm9ybWF0aW9uTWF0cml4ICE9PSBudWxsICYmIHRyYW5zZm9ybWF0aW9uTWF0cml4ICE9PSB2b2lkIDAgPyB0cmFuc2Zvcm1hdGlvbk1hdHJpeCA6IGJvdW5kaW5nQm94QWRqdXN0ZWRNYXRyaXgoYmIpO1xuICAgIH1cbiAgICBQREZQYWdlRW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKHBhZ2UsIGJvdW5kaW5nQm94LCB0cmFuc2Zvcm1hdGlvbk1hdHJpeCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBQREZQYWdlRW1iZWRkZXIocGFnZSwgYm91bmRpbmdCb3gsIHRyYW5zZm9ybWF0aW9uTWF0cml4KV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZQYWdlRW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgQ29udGVudHMsIFJlc291cmNlcywgZGVjb2RlZENvbnRlbnRzLCBfYiwgbGVmdCwgYm90dG9tLCByaWdodCwgdG9wLCB4T2JqZWN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIF9hID0gdGhpcy5wYWdlLm5vcm1hbGl6ZWRFbnRyaWVzKCksIENvbnRlbnRzID0gX2EuQ29udGVudHMsIFJlc291cmNlcyA9IF9hLlJlc291cmNlcztcbiAgICAgICAgICAgICAgICBpZiAoIUNvbnRlbnRzKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgZGVjb2RlZENvbnRlbnRzID0gdGhpcy5kZWNvZGVDb250ZW50cyhDb250ZW50cyk7XG4gICAgICAgICAgICAgICAgX2IgPSB0aGlzLmJvdW5kaW5nQm94LCBsZWZ0ID0gX2IubGVmdCwgYm90dG9tID0gX2IuYm90dG9tLCByaWdodCA9IF9iLnJpZ2h0LCB0b3AgPSBfYi50b3A7XG4gICAgICAgICAgICAgICAgeE9iamVjdCA9IGNvbnRleHQuZmxhdGVTdHJlYW0oZGVjb2RlZENvbnRlbnRzLCB7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdYT2JqZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogJ0Zvcm0nLFxuICAgICAgICAgICAgICAgICAgICBGb3JtVHlwZTogMSxcbiAgICAgICAgICAgICAgICAgICAgQkJveDogW2xlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcF0sXG4gICAgICAgICAgICAgICAgICAgIE1hdHJpeDogdGhpcy50cmFuc2Zvcm1hdGlvbk1hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzOiBSZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmFzc2lnbihyZWYsIHhPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKHhPYmplY3QpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gYGNvbnRlbnRzYCBpcyBhbiBhcnJheSBvZiBzdHJlYW1zIHdoaWNoIGFyZSBtZXJnZWQgdG8gaW5jbHVkZSB0aGVtIGluIHRoZSBYT2JqZWN0LlxuICAgIC8vIFRoaXMgbWV0aG9kcyBleHRyYWN0cyBlYWNoIHN0cmVhbSBhbmQgam9pbnMgdGhlbSB3aXRoIGEgbmV3bGluZSBjaGFyYWN0ZXIuXG4gICAgUERGUGFnZUVtYmVkZGVyLnByb3RvdHlwZS5kZWNvZGVDb250ZW50cyA9IGZ1bmN0aW9uIChjb250ZW50cykge1xuICAgICAgICB2YXIgbmV3bGluZSA9IFVpbnQ4QXJyYXkub2YoQ2hhckNvZGVzLk5ld2xpbmUpO1xuICAgICAgICB2YXIgZGVjb2RlZENvbnRlbnRzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGNvbnRlbnRzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHN0cmVhbSA9IGNvbnRlbnRzLmxvb2t1cChpZHgsIFBERlN0cmVhbSk7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBQREZSYXdTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gZGVjb2RlUERGUmF3U3RyZWFtKHN0cmVhbSkuZGVjb2RlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBQREZDb250ZW50U3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IHN0cmVhbS5nZXRVbmVuY29kZWRDb250ZW50cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVjb2duaXplZFN0cmVhbVR5cGVFcnJvcihzdHJlYW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVjb2RlZENvbnRlbnRzLnB1c2goY29udGVudCwgbmV3bGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lcmdlSW50b1R5cGVkQXJyYXkuYXBwbHkodm9pZCAwLCBkZWNvZGVkQ29udGVudHMpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlBhZ2VFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZQYWdlRW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZQYWdlRW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUE5HIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3BuZ1wiO1xuLyoqXG4gKiBBIG5vdGUgb2YgdGhhbmtzIHRvIHRoZSBkZXZlbG9wZXJzIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdCwgYXNcbiAqIHRoaXMgY2xhc3MgYm9ycm93cyBmcm9tOlxuICogICBodHRwczovL2dpdGh1Yi5jb20vZGV2b25nb3ZldHQvcGRma2l0L2Jsb2IvZTcxZWRhYjBkZDQ2NTdiNWE3Njc4MDRiYTg2Yzk0YzU4ZDAxZmJjYS9saWIvaW1hZ2UvcG5nLmNvZmZlZVxuICovXG52YXIgUG5nRW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUG5nRW1iZWRkZXIocG5nKSB7XG4gICAgICAgIHRoaXMuaW1hZ2UgPSBwbmc7XG4gICAgICAgIHRoaXMuYml0c1BlckNvbXBvbmVudCA9IHBuZy5iaXRzUGVyQ29tcG9uZW50O1xuICAgICAgICB0aGlzLndpZHRoID0gcG5nLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHBuZy5oZWlnaHQ7XG4gICAgICAgIHRoaXMuY29sb3JTcGFjZSA9ICdEZXZpY2VSR0InO1xuICAgIH1cbiAgICBQbmdFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoaW1hZ2VEYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwbmc7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcG5nID0gUE5HLmxvYWQoaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFBuZ0VtYmVkZGVyKHBuZyldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUG5nRW1iZWRkZXIucHJvdG90eXBlLmVtYmVkSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBTTWFzaywgeE9iamVjdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBTTWFzayA9IHRoaXMuZW1iZWRBbHBoYUNoYW5uZWwoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgeE9iamVjdCA9IGNvbnRleHQuZmxhdGVTdHJlYW0odGhpcy5pbWFnZS5yZ2JDaGFubmVsLCB7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdYT2JqZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogJ0ltYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgQml0c1BlckNvbXBvbmVudDogdGhpcy5pbWFnZS5iaXRzUGVyQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBXaWR0aDogdGhpcy5pbWFnZS53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgSGVpZ2h0OiB0aGlzLmltYWdlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZTogdGhpcy5jb2xvclNwYWNlLFxuICAgICAgICAgICAgICAgICAgICBTTWFzazogU01hc2ssXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmFzc2lnbihyZWYsIHhPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKHhPYmplY3QpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUG5nRW1iZWRkZXIucHJvdG90eXBlLmVtYmVkQWxwaGFDaGFubmVsID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlLmFscGhhQ2hhbm5lbClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciB4T2JqZWN0ID0gY29udGV4dC5mbGF0ZVN0cmVhbSh0aGlzLmltYWdlLmFscGhhQ2hhbm5lbCwge1xuICAgICAgICAgICAgVHlwZTogJ1hPYmplY3QnLFxuICAgICAgICAgICAgU3VidHlwZTogJ0ltYWdlJyxcbiAgICAgICAgICAgIEhlaWdodDogdGhpcy5pbWFnZS5oZWlnaHQsXG4gICAgICAgICAgICBXaWR0aDogdGhpcy5pbWFnZS53aWR0aCxcbiAgICAgICAgICAgIEJpdHNQZXJDb21wb25lbnQ6IHRoaXMuaW1hZ2UuYml0c1BlckNvbXBvbmVudCxcbiAgICAgICAgICAgIENvbG9yU3BhY2U6ICdEZXZpY2VHcmF5JyxcbiAgICAgICAgICAgIERlY29kZTogWzAsIDFdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVnaXN0ZXIoeE9iamVjdCk7XG4gICAgfTtcbiAgICByZXR1cm4gUG5nRW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUG5nRW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QbmdFbWJlZGRlci5qcy5tYXAiLCJpbXBvcnQgeyBFbmNvZGluZ3MsIEZvbnQsIEZvbnROYW1lcywgfSBmcm9tICdAcGRmLWxpYi9zdGFuZGFyZC1mb250cyc7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IHsgdG9Db2RlUG9pbnQsIHRvSGV4U3RyaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIEEgbm90ZSBvZiB0aGFua3MgdG8gdGhlIGRldmVsb3BlcnMgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0LCBhc1xuICogdGhpcyBjbGFzcyBib3Jyb3dzIGZyb206XG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdC9ibG9iL2Y5MWJkZDYxYzE2NGE3MmVhMDZiZTFhNDNkYzBhNDEyYWZjMzkyNWYvbGliL2ZvbnQvYWZtLmNvZmZlZVxuICovXG52YXIgU3RhbmRhcmRGb250RW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3RhbmRhcmRGb250RW1iZWRkZXIoZm9udE5hbWUsIGN1c3RvbU5hbWUpIHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSAoZm9udE5hbWUgPT09IEZvbnROYW1lcy5aYXBmRGluZ2JhdHMgPyBFbmNvZGluZ3MuWmFwZkRpbmdiYXRzXG4gICAgICAgICAgICA6IGZvbnROYW1lID09PSBGb250TmFtZXMuU3ltYm9sID8gRW5jb2RpbmdzLlN5bWJvbFxuICAgICAgICAgICAgICAgIDogRW5jb2RpbmdzLldpbkFuc2kpO1xuICAgICAgICB0aGlzLmZvbnQgPSBGb250LmxvYWQoZm9udE5hbWUpO1xuICAgICAgICB0aGlzLmZvbnROYW1lID0gdGhpcy5mb250LkZvbnROYW1lO1xuICAgICAgICB0aGlzLmN1c3RvbU5hbWUgPSBjdXN0b21OYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgdGhlIEphdmFTY3JpcHQgc3RyaW5nIGludG8gdGhpcyBmb250LiAoSmF2YVNjcmlwdCBlbmNvZGVzIHN0cmluZ3MgaW5cbiAgICAgKiBVbmljb2RlLCBidXQgc3RhbmRhcmQgZm9udHMgdXNlIGVpdGhlciBXaW5BbnNpLCBaYXBmRGluZ2JhdHMsIG9yIFN5bWJvbFxuICAgICAqIGVuY29kaW5ncylcbiAgICAgKi9cbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW5jb2RlVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHZhciBnbHlwaHMgPSB0aGlzLmVuY29kZVRleHRBc0dseXBocyh0ZXh0KTtcbiAgICAgICAgdmFyIGhleENvZGVzID0gbmV3IEFycmF5KGdseXBocy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnbHlwaHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBoZXhDb2Rlc1tpZHhdID0gdG9IZXhTdHJpbmcoZ2x5cGhzW2lkeF0uY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBERkhleFN0cmluZy5vZihoZXhDb2Rlcy5qb2luKCcnKSk7XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUud2lkdGhPZlRleHRBdFNpemUgPSBmdW5jdGlvbiAodGV4dCwgc2l6ZSkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5lbmNvZGVUZXh0QXNHbHlwaHModGV4dCk7XG4gICAgICAgIHZhciB0b3RhbFdpZHRoID0gMDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2x5cGhzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGxlZnQgPSBnbHlwaHNbaWR4XS5uYW1lO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gKGdseXBoc1tpZHggKyAxXSB8fCB7fSkubmFtZTtcbiAgICAgICAgICAgIHZhciBrZXJuQW1vdW50ID0gdGhpcy5mb250LmdldFhBeGlzS2VybmluZ0ZvclBhaXIobGVmdCwgcmlnaHQpIHx8IDA7XG4gICAgICAgICAgICB0b3RhbFdpZHRoICs9IHRoaXMud2lkdGhPZkdseXBoKGxlZnQpICsga2VybkFtb3VudDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2NhbGUgPSBzaXplIC8gMTAwMDtcbiAgICAgICAgcmV0dXJuIHRvdGFsV2lkdGggKiBzY2FsZTtcbiAgICB9O1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLnByb3RvdHlwZS5oZWlnaHRPZkZvbnRBdFNpemUgPSBmdW5jdGlvbiAoc2l6ZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgX2EgPSBvcHRpb25zLmRlc2NlbmRlciwgZGVzY2VuZGVyID0gX2EgPT09IHZvaWQgMCA/IHRydWUgOiBfYTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5mb250LCBBc2NlbmRlciA9IF9iLkFzY2VuZGVyLCBEZXNjZW5kZXIgPSBfYi5EZXNjZW5kZXIsIEZvbnRCQm94ID0gX2IuRm9udEJCb3g7XG4gICAgICAgIHZhciB5VG9wID0gQXNjZW5kZXIgfHwgRm9udEJCb3hbM107XG4gICAgICAgIHZhciB5Qm90dG9tID0gRGVzY2VuZGVyIHx8IEZvbnRCQm94WzFdO1xuICAgICAgICB2YXIgaGVpZ2h0ID0geVRvcCAtIHlCb3R0b207XG4gICAgICAgIGlmICghZGVzY2VuZGVyKVxuICAgICAgICAgICAgaGVpZ2h0ICs9IERlc2NlbmRlciB8fCAwO1xuICAgICAgICByZXR1cm4gKGhlaWdodCAvIDEwMDApICogc2l6ZTtcbiAgICB9O1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLnByb3RvdHlwZS5zaXplT2ZGb250QXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZm9udCwgQXNjZW5kZXIgPSBfYS5Bc2NlbmRlciwgRGVzY2VuZGVyID0gX2EuRGVzY2VuZGVyLCBGb250QkJveCA9IF9hLkZvbnRCQm94O1xuICAgICAgICB2YXIgeVRvcCA9IEFzY2VuZGVyIHx8IEZvbnRCQm94WzNdO1xuICAgICAgICB2YXIgeUJvdHRvbSA9IERlc2NlbmRlciB8fCBGb250QkJveFsxXTtcbiAgICAgICAgcmV0dXJuICgxMDAwICogaGVpZ2h0KSAvICh5VG9wIC0geUJvdHRvbSk7XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRJbnRvQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWYpIHtcbiAgICAgICAgdmFyIGZvbnREaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgVHlwZTogJ0ZvbnQnLFxuICAgICAgICAgICAgU3VidHlwZTogJ1R5cGUxJyxcbiAgICAgICAgICAgIEJhc2VGb250OiB0aGlzLmN1c3RvbU5hbWUgfHwgdGhpcy5mb250TmFtZSxcbiAgICAgICAgICAgIEVuY29kaW5nOiB0aGlzLmVuY29kaW5nID09PSBFbmNvZGluZ3MuV2luQW5zaSA/ICdXaW5BbnNpRW5jb2RpbmcnIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCBmb250RGljdCk7XG4gICAgICAgICAgICByZXR1cm4gcmVmO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucmVnaXN0ZXIoZm9udERpY3QpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUud2lkdGhPZkdseXBoID0gZnVuY3Rpb24gKGdseXBoTmFtZSkge1xuICAgICAgICAvLyBEZWZhdWx0IHRvIDI1MCBpZiBmb250IGRvZXNuJ3Qgc3BlY2lmeSBhIHdpZHRoXG4gICAgICAgIHJldHVybiB0aGlzLmZvbnQuZ2V0V2lkdGhPZkdseXBoKGdseXBoTmFtZSkgfHwgMjUwO1xuICAgIH07XG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLmVuY29kZVRleHRBc0dseXBocyA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHZhciBjb2RlUG9pbnRzID0gQXJyYXkuZnJvbSh0ZXh0KTtcbiAgICAgICAgdmFyIGdseXBocyA9IG5ldyBBcnJheShjb2RlUG9pbnRzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgY29kZVBvaW50ID0gdG9Db2RlUG9pbnQoY29kZVBvaW50c1tpZHhdKTtcbiAgICAgICAgICAgIGdseXBoc1tpZHhdID0gdGhpcy5lbmNvZGluZy5lbmNvZGVVbmljb2RlQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdseXBocztcbiAgICB9O1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChmb250TmFtZSwgY3VzdG9tTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFN0YW5kYXJkRm9udEVtYmVkZGVyKGZvbnROYW1lLCBjdXN0b21OYW1lKTtcbiAgICB9O1xuICAgIHJldHVybiBTdGFuZGFyZEZvbnRFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBTdGFuZGFyZEZvbnRFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0YW5kYXJkRm9udEVtYmVkZGVyLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYXJyYXlBc1N0cmluZyB9IGZyb20gXCIuLi91dGlsc1wiO1xudmFyIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcihjbGFzc05hbWUsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiTWV0aG9kIFwiICsgY2xhc3NOYW1lICsgXCIuXCIgKyBtZXRob2ROYW1lICsgXCIoKSBub3QgaW1wbGVtZW50ZWRcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIH07XG52YXIgUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFByaXZhdGVDb25zdHJ1Y3RvckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFByaXZhdGVDb25zdHJ1Y3RvckVycm9yKGNsYXNzTmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJDYW5ub3QgY29uc3RydWN0IFwiICsgY2xhc3NOYW1lICsgXCIgLSBpdCBoYXMgYSBwcml2YXRlIGNvbnN0cnVjdG9yXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQcml2YXRlQ29uc3RydWN0b3JFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yIH07XG52YXIgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yKGV4cGVjdGVkLCBhY3R1YWwpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG5hbWUgPSBmdW5jdGlvbiAodCkgeyB2YXIgX2EsIF9iOyByZXR1cm4gKF9hID0gdCA9PT0gbnVsbCB8fCB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0Lm5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChfYiA9IHQgPT09IG51bGwgfHwgdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdC5jb25zdHJ1Y3RvcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLm5hbWU7IH07XG4gICAgICAgIHZhciBleHBlY3RlZFR5cGVzID0gQXJyYXkuaXNBcnJheShleHBlY3RlZClcbiAgICAgICAgICAgID8gZXhwZWN0ZWQubWFwKG5hbWUpXG4gICAgICAgICAgICA6IFtuYW1lKGV4cGVjdGVkKV07XG4gICAgICAgIHZhciBtc2cgPSBcIkV4cGVjdGVkIGluc3RhbmNlIG9mIFwiICsgZXhwZWN0ZWRUeXBlcy5qb2luKCcgb3IgJykgKyBcIiwgXCIgK1xuICAgICAgICAgICAgKFwiYnV0IGdvdCBpbnN0YW5jZSBvZiBcIiArIChhY3R1YWwgPyBuYW1lKGFjdHVhbCkgOiBhY3R1YWwpKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yIH07XG52YXIgVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVbnN1cHBvcnRlZEVuY29kaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yKGVuY29kaW5nKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBlbmNvZGluZyArIFwiIHN0cmVhbSBlbmNvZGluZyBub3Qgc3VwcG9ydGVkXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBVbnN1cHBvcnRlZEVuY29kaW5nRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBVbnN1cHBvcnRlZEVuY29kaW5nRXJyb3IgfTtcbnZhciBSZXBhcnNlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlcGFyc2VFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZXBhcnNlRXJyb3IoY2xhc3NOYW1lLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkNhbm5vdCBjYWxsIFwiICsgY2xhc3NOYW1lICsgXCIuXCIgKyBtZXRob2ROYW1lICsgXCIoKSBtb3JlIHRoYW4gb25jZVwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUmVwYXJzZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUmVwYXJzZUVycm9yIH07XG52YXIgTWlzc2luZ0NhdGFsb2dFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0NhdGFsb2dFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nQ2F0YWxvZ0Vycm9yKHJlZikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJNaXNzaW5nIGNhdGFsb2cgKHJlZj1cIiArIHJlZiArIFwiKVwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ0NhdGFsb2dFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdDYXRhbG9nRXJyb3IgfTtcbnZhciBNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdQYWdlQ29udGVudHNFbWJlZGRpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkNhbid0IGVtYmVkIHBhZ2Ugd2l0aCBtaXNzaW5nIENvbnRlbnRzXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3IgfTtcbnZhciBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVucmVjb2duaXplZFN0cmVhbVR5cGVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3Ioc3RyZWFtKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgc3RyZWFtVHlwZSA9IChfYyA9IChfYiA9IChfYSA9IHN0cmVhbSA9PT0gbnVsbCB8fCBzdHJlYW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0cmVhbS5jb250cnVjdG9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmFtZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogc3RyZWFtID09PSBudWxsIHx8IHN0cmVhbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RyZWFtLm5hbWUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHN0cmVhbTtcbiAgICAgICAgdmFyIG1zZyA9IFwiVW5yZWNvZ25pemVkIHN0cmVhbSB0eXBlOiBcIiArIHN0cmVhbVR5cGU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBVbnJlY29nbml6ZWRTdHJlYW1UeXBlRXJyb3IgfTtcbnZhciBQYWdlRW1iZWRkaW5nTWlzbWF0Y2hlZENvbnRleHRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZvdW5kIG1pc21hdGNoZWQgY29udGV4dHMgd2hpbGUgZW1iZWRkaW5nIHBhZ2VzLiBBbGwgcGFnZXMgaW4gdGhlIGFycmF5IHBhc3NlZCB0byBgUERGRG9jdW1lbnQuZW1iZWRQYWdlcygpYCBtdXN0IGJlIGZyb20gdGhlIHNhbWUgZG9jdW1lbnQuXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQYWdlRW1iZWRkaW5nTWlzbWF0Y2hlZENvbnRleHRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yIH07XG52YXIgUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBcnJheUlzTm90UmVjdGFuZ2xlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yKHNpemUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQXR0ZW1wdGVkIHRvIGNvbnZlcnQgUERGQXJyYXkgd2l0aCBcIiArIHNpemUgKyBcIiBlbGVtZW50cyB0byByZWN0YW5nbGUsIGJ1dCBtdXN0IGhhdmUgZXhhY3RseSA0IGVsZW1lbnRzLlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yIH07XG52YXIgSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkF0dGVtcHRlZCB0byBjb252ZXJ0IFxcXCJcIiArIHZhbHVlICsgXCJcXFwiIHRvIGEgZGF0ZSwgYnV0IGl0IGRvZXMgbm90IG1hdGNoIHRoZSBQREYgZGF0ZSBzdHJpbmcgZm9ybWF0LlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IgfTtcbnZhciBJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52YWxpZFRhcmdldEluZGV4RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW52YWxpZFRhcmdldEluZGV4RXJyb3IodGFyZ2V0SW5kZXgsIENvdW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkludmFsaWQgdGFyZ2V0SW5kZXggc3BlY2lmaWVkOiB0YXJnZXRJbmRleD1cIiArIHRhcmdldEluZGV4ICsgXCIgbXVzdCBiZSBsZXNzIHRoYW4gQ291bnQ9XCIgKyBDb3VudDtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEludmFsaWRUYXJnZXRJbmRleEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgSW52YWxpZFRhcmdldEluZGV4RXJyb3IgfTtcbnZhciBDb3JydXB0UGFnZVRyZWVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29ycnVwdFBhZ2VUcmVlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29ycnVwdFBhZ2VUcmVlRXJyb3IodGFyZ2V0SW5kZXgsIG9wZXJhdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gXCIgKyBvcGVyYXRpb24gKyBcIiBhdCB0YXJnZXRJbmRleD1cIiArIHRhcmdldEluZGV4ICsgXCIgZHVlIHRvIGNvcnJ1cHQgcGFnZSB0cmVlOiBJdCBpcyBsaWtlbHkgdGhhdCBvbmUgb3IgbW9yZSAnQ291bnQnIGVudHJpZXMgYXJlIGludmFsaWRcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIENvcnJ1cHRQYWdlVHJlZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgQ29ycnVwdFBhZ2VUcmVlRXJyb3IgfTtcbnZhciBJbmRleE91dE9mQm91bmRzRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEluZGV4T3V0T2ZCb3VuZHNFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbmRleE91dE9mQm91bmRzRXJyb3IoaW5kZXgsIG1pbiwgbWF4KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcImluZGV4IHNob3VsZCBiZSBhdCBsZWFzdCBcIiArIG1pbiArIFwiIGFuZCBhdCBtb3N0IFwiICsgbWF4ICsgXCIsIGJ1dCB3YXMgYWN0dWFsbHkgXCIgKyBpbmRleDtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEluZGV4T3V0T2ZCb3VuZHNFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEluZGV4T3V0T2ZCb3VuZHNFcnJvciB9O1xudmFyIEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQXR0ZW1wdGVkIHRvIHNldCBpbnZhbGlkIGZpZWxkIHZhbHVlXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yIH07XG52YXIgTXVsdGlTZWxlY3RWYWx1ZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNdWx0aVNlbGVjdFZhbHVlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTXVsdGlTZWxlY3RWYWx1ZUVycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBdHRlbXB0ZWQgdG8gc2VsZWN0IG11bHRpcGxlIHZhbHVlcyBmb3Igc2luZ2xlLXNlbGVjdCBmaWVsZFwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTXVsdGlTZWxlY3RWYWx1ZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTXVsdGlTZWxlY3RWYWx1ZUVycm9yIH07XG52YXIgTWlzc2luZ0RBRW50cnlFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ0RBRW50cnlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nREFFbnRyeUVycm9yKGZpZWxkTmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJObyAvREEgKGRlZmF1bHQgYXBwZWFyYW5jZSkgZW50cnkgZm91bmQgZm9yIGZpZWxkOiBcIiArIGZpZWxkTmFtZTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdEQUVudHJ5RXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nREFFbnRyeUVycm9yIH07XG52YXIgTWlzc2luZ1RmT3BlcmF0b3JFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ1RmT3BlcmF0b3JFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nVGZPcGVyYXRvckVycm9yKGZpZWxkTmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJObyBUZiBvcGVyYXRvciBmb3VuZCBmb3IgREEgb2YgZmllbGQ6IFwiICsgZmllbGROYW1lO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ1RmT3BlcmF0b3JFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdUZk9wZXJhdG9yRXJyb3IgfTtcbnZhciBOdW1iZXJQYXJzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE51bWJlclBhcnNpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOdW1iZXJQYXJzaW5nRXJyb3IocG9zLCB2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgbnVtYmVyIFwiICtcbiAgICAgICAgICAgIChcIihsaW5lOlwiICsgcG9zLmxpbmUgKyBcIiBjb2w6XCIgKyBwb3MuY29sdW1uICsgXCIgb2Zmc2V0PVwiICsgcG9zLm9mZnNldCArIFwiKTogXFxcIlwiICsgdmFsdWUgKyBcIlxcXCJcIik7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBOdW1iZXJQYXJzaW5nRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBOdW1iZXJQYXJzaW5nRXJyb3IgfTtcbnZhciBQREZQYXJzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlBhcnNpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZQYXJzaW5nRXJyb3IocG9zLCBkZXRhaWxzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBwYXJzZSBQREYgZG9jdW1lbnQgXCIgK1xuICAgICAgICAgICAgKFwiKGxpbmU6XCIgKyBwb3MubGluZSArIFwiIGNvbDpcIiArIHBvcy5jb2x1bW4gKyBcIiBvZmZzZXQ9XCIgKyBwb3Mub2Zmc2V0ICsgXCIpOiBcIiArIGRldGFpbHMpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUERGUGFyc2luZ0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUERGUGFyc2luZ0Vycm9yIH07XG52YXIgTmV4dEJ5dGVBc3NlcnRpb25FcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmV4dEJ5dGVBc3NlcnRpb25FcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOZXh0Qnl0ZUFzc2VydGlvbkVycm9yKHBvcywgZXhwZWN0ZWRCeXRlLCBhY3R1YWxCeXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkV4cGVjdGVkIG5leHQgYnl0ZSB0byBiZSBcIiArIGV4cGVjdGVkQnl0ZSArIFwiIGJ1dCBpdCB3YXMgYWN0dWFsbHkgXCIgKyBhY3R1YWxCeXRlO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBOZXh0Qnl0ZUFzc2VydGlvbkVycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IE5leHRCeXRlQXNzZXJ0aW9uRXJyb3IgfTtcbnZhciBQREZPYmplY3RQYXJzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk9iamVjdFBhcnNpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZPYmplY3RQYXJzaW5nRXJyb3IocG9zLCBieXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBwYXJzZSBQREYgb2JqZWN0IHN0YXJ0aW5nIHdpdGggdGhlIGZvbGxvd2luZyBieXRlOiBcIiArIGJ5dGU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBERk9iamVjdFBhcnNpbmdFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBQREZPYmplY3RQYXJzaW5nRXJyb3IgfTtcbnZhciBQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkludmFsaWRPYmplY3RQYXJzaW5nRXJyb3IocG9zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBwYXJzZSBpbnZhbGlkIFBERiBvYmplY3RcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yIH07XG52YXIgUERGU3RyZWFtUGFyc2luZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZTdHJlYW1QYXJzaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGU3RyZWFtUGFyc2luZ0Vycm9yKHBvcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgUERGIHN0cmVhbVwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQREZTdHJlYW1QYXJzaW5nRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgUERGU3RyZWFtUGFyc2luZ0Vycm9yIH07XG52YXIgVW5iYWxhbmNlZFBhcmVudGhlc2lzRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yKHBvcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcGFyc2UgUERGIGxpdGVyYWwgc3RyaW5nIGR1ZSB0byB1bmJhbGFuY2VkIHBhcmVudGhlc2lzXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yIH07XG52YXIgU3RhbGxlZFBhcnNlckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTdGFsbGVkUGFyc2VyRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU3RhbGxlZFBhcnNlckVycm9yKHBvcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJQYXJzZXIgc3RhbGxlZFwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBTdGFsbGVkUGFyc2VyRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgU3RhbGxlZFBhcnNlckVycm9yIH07XG52YXIgTWlzc2luZ1BERkhlYWRlckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nUERGSGVhZGVyRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ1BERkhlYWRlckVycm9yKHBvcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJObyBQREYgaGVhZGVyIGZvdW5kXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdQREZIZWFkZXJFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nUERGSGVhZGVyRXJyb3IgfTtcbnZhciBNaXNzaW5nS2V5d29yZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nS2V5d29yZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdLZXl3b3JkRXJyb3IocG9zLCBrZXl3b3JkKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkRpZCBub3QgZmluZCBleHBlY3RlZCBrZXl3b3JkICdcIiArIGFycmF5QXNTdHJpbmcoa2V5d29yZCkgKyBcIidcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ0tleXdvcmRFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBNaXNzaW5nS2V5d29yZEVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIiwiZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENoYXJDb2RlcyB9IGZyb20gXCIuL3N5bnRheC9DaGFyQ29kZXNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQ29udGV4dCB9IGZyb20gXCIuL1BERkNvbnRleHRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT2JqZWN0Q29waWVyIH0gZnJvbSBcIi4vUERGT2JqZWN0Q29waWVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERldyaXRlciB9IGZyb20gXCIuL3dyaXRlcnMvUERGV3JpdGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlN0cmVhbVdyaXRlciB9IGZyb20gXCIuL3dyaXRlcnMvUERGU3RyZWFtV3JpdGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkhlYWRlciB9IGZyb20gXCIuL2RvY3VtZW50L1BERkhlYWRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZUcmFpbGVyIH0gZnJvbSBcIi4vZG9jdW1lbnQvUERGVHJhaWxlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZUcmFpbGVyRGljdCB9IGZyb20gXCIuL2RvY3VtZW50L1BERlRyYWlsZXJEaWN0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkNyb3NzUmVmU2VjdGlvbiB9IGZyb20gXCIuL2RvY3VtZW50L1BERkNyb3NzUmVmU2VjdGlvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdGFuZGFyZEZvbnRFbWJlZGRlciB9IGZyb20gXCIuL2VtYmVkZGVycy9TdGFuZGFyZEZvbnRFbWJlZGRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDdXN0b21Gb250RW1iZWRkZXIgfSBmcm9tIFwiLi9lbWJlZGRlcnMvQ3VzdG9tRm9udEVtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlciB9IGZyb20gXCIuL2VtYmVkZGVycy9DdXN0b21Gb250U3Vic2V0RW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRmlsZUVtYmVkZGVyLCBBRlJlbGF0aW9uc2hpcCwgfSBmcm9tIFwiLi9lbWJlZGRlcnMvRmlsZUVtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEpwZWdFbWJlZGRlciB9IGZyb20gXCIuL2VtYmVkZGVycy9KcGVnRW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUG5nRW1iZWRkZXIgfSBmcm9tIFwiLi9lbWJlZGRlcnMvUG5nRW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUGFnZUVtYmVkZGVyLCB9IGZyb20gXCIuL2VtYmVkZGVycy9QREZQYWdlRW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVmlld2VyUHJlZmVyZW5jZXMsIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSwgUmVhZGluZ0RpcmVjdGlvbiwgUHJpbnRTY2FsaW5nLCBEdXBsZXgsIH0gZnJvbSBcIi4vaW50ZXJhY3RpdmUvVmlld2VyUHJlZmVyZW5jZXNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT2JqZWN0IH0gZnJvbSBcIi4vb2JqZWN0cy9QREZPYmplY3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQm9vbCB9IGZyb20gXCIuL29iamVjdHMvUERGQm9vbFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZOdW1iZXIgfSBmcm9tIFwiLi9vYmplY3RzL1BERk51bWJlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZTdHJpbmcgfSBmcm9tIFwiLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZIZXhTdHJpbmcgfSBmcm9tIFwiLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZOYW1lIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZOYW1lXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk51bGwgfSBmcm9tIFwiLi9vYmplY3RzL1BERk51bGxcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQXJyYXkgfSBmcm9tIFwiLi9vYmplY3RzL1BERkFycmF5XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkRpY3QgfSBmcm9tIFwiLi9vYmplY3RzL1BERkRpY3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUmVmIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZSZWZcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGSW52YWxpZE9iamVjdCB9IGZyb20gXCIuL29iamVjdHMvUERGSW52YWxpZE9iamVjdFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZTdHJlYW0gfSBmcm9tIFwiLi9vYmplY3RzL1BERlN0cmVhbVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZSYXdTdHJlYW0gfSBmcm9tIFwiLi9vYmplY3RzL1BERlJhd1N0cmVhbVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZDYXRhbG9nIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZDYXRhbG9nXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkNvbnRlbnRTdHJlYW0gfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERkNvbnRlbnRTdHJlYW1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQ3Jvc3NSZWZTdHJlYW0gfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERkNyb3NzUmVmU3RyZWFtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9iamVjdFN0cmVhbSB9IGZyb20gXCIuL3N0cnVjdHVyZXMvUERGT2JqZWN0U3RyZWFtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlBhZ2VUcmVlIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZQYWdlVHJlZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZQYWdlTGVhZiB9IGZyb20gXCIuL3N0cnVjdHVyZXMvUERGUGFnZUxlYWZcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRmxhdGVTdHJlYW0gfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERkZsYXRlU3RyZWFtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9wZXJhdG9yIH0gZnJvbSBcIi4vb3BlcmF0b3JzL1BERk9wZXJhdG9yXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9wZXJhdG9yTmFtZXMgfSBmcm9tIFwiLi9vcGVyYXRvcnMvUERGT3BlcmF0b3JOYW1lc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPYmplY3RQYXJzZXIgfSBmcm9tIFwiLi9wYXJzZXIvUERGT2JqZWN0UGFyc2VyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9iamVjdFN0cmVhbVBhcnNlciB9IGZyb20gXCIuL3BhcnNlci9QREZPYmplY3RTdHJlYW1QYXJzZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUGFyc2VyIH0gZnJvbSBcIi4vcGFyc2VyL1BERlBhcnNlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZYUmVmU3RyZWFtUGFyc2VyIH0gZnJvbSBcIi4vcGFyc2VyL1BERlhSZWZTdHJlYW1QYXJzZXJcIjtcbmV4cG9ydCB7IGRlY29kZVBERlJhd1N0cmVhbSB9IGZyb20gXCIuL3N0cmVhbXMvZGVjb2RlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hbm5vdGF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hY3JvZm9ybVwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGQm9vbCBmcm9tIFwiLi4vb2JqZWN0cy9QREZCb29sXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IHsgYXNzZXJ0RWFjaElzLCBhc3NlcnRJbnRlZ2VyLCBhc3NlcnRJc09uZU9mLCBhc3NlcnRSYW5nZSwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBhc0VudW0gPSBmdW5jdGlvbiAocmF3VmFsdWUsIGVudW1UeXBlKSB7XG4gICAgaWYgKHJhd1ZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGVudW1UeXBlW3Jhd1ZhbHVlXTtcbn07XG5leHBvcnQgdmFyIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZTtcbihmdW5jdGlvbiAoTm9uRnVsbFNjcmVlblBhZ2VNb2RlKSB7XG4gICAgLyoqXG4gICAgICogQWZ0ZXIgZXhpdGluZyBGdWxsU2NyZWVuIG1vZGUsIG5laXRoZXIgdGhlIGRvY3VtZW50IG91dGxpbmUgbm9yIHRodW1ibmFpbFxuICAgICAqIGltYWdlcyBzaG91bGQgYmUgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBOb25GdWxsU2NyZWVuUGFnZU1vZGVbXCJVc2VOb25lXCJdID0gXCJVc2VOb25lXCI7XG4gICAgLyoqIEFmdGVyIGV4aXRpbmcgRnVsbFNjcmVlbiBtb2RlLCB0aGUgZG9jdW1lbnQgb3V0bGluZSBzaG91bGQgYmUgdmlzaWJsZS4gKi9cbiAgICBOb25GdWxsU2NyZWVuUGFnZU1vZGVbXCJVc2VPdXRsaW5lc1wiXSA9IFwiVXNlT3V0bGluZXNcIjtcbiAgICAvKiogQWZ0ZXIgZXhpdGluZyBGdWxsU2NyZWVuIG1vZGUsIHRodW1ibmFpbCBpbWFnZXMgc2hvdWxkIGJlIHZpc2libGUuICovXG4gICAgTm9uRnVsbFNjcmVlblBhZ2VNb2RlW1wiVXNlVGh1bWJzXCJdID0gXCJVc2VUaHVtYnNcIjtcbiAgICAvKipcbiAgICAgKiBBZnRlciBleGl0aW5nIEZ1bGxTY3JlZW4gbW9kZSwgdGhlIG9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgcGFuZWwgc2hvdWxkIGJlXG4gICAgICogdmlzaWJsZS5cbiAgICAgKi9cbiAgICBOb25GdWxsU2NyZWVuUGFnZU1vZGVbXCJVc2VPQ1wiXSA9IFwiVXNlT0NcIjtcbn0pKE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSB8fCAoTm9uRnVsbFNjcmVlblBhZ2VNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgUmVhZGluZ0RpcmVjdGlvbjtcbihmdW5jdGlvbiAoUmVhZGluZ0RpcmVjdGlvbikge1xuICAgIC8qKiBUaGUgcHJlZG9taW5hbnQgcmVhZGluZyBvcmRlciBpcyBMZWZ0IHRvIFJpZ2h0LiAqL1xuICAgIFJlYWRpbmdEaXJlY3Rpb25bXCJMMlJcIl0gPSBcIkwyUlwiO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmVkb21pbmFudCByZWFkaW5nIG9yZGVyIGlzIFJpZ2h0IHRvIGxlZnQgKGluY2x1ZGluZyB2ZXJ0aWNhbCB3cml0aW5nXG4gICAgICogc3lzdGVtcywgc3VjaCBhcyBDaGluZXNlLCBKYXBhbmVzZSBhbmQgS29yZWFuKS5cbiAgICAgKi9cbiAgICBSZWFkaW5nRGlyZWN0aW9uW1wiUjJMXCJdID0gXCJSMkxcIjtcbn0pKFJlYWRpbmdEaXJlY3Rpb24gfHwgKFJlYWRpbmdEaXJlY3Rpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBQcmludFNjYWxpbmc7XG4oZnVuY3Rpb24gKFByaW50U2NhbGluZykge1xuICAgIC8qKiBObyBwYWdlIHNjYWxpbmcuICovXG4gICAgUHJpbnRTY2FsaW5nW1wiTm9uZVwiXSA9IFwiTm9uZVwiO1xuICAgIC8qIFVzZSB0aGUgUERGIHJlYWRlcidzIGRlZmF1bHQgcHJpbnQgc2NhbGluZy4gKi9cbiAgICBQcmludFNjYWxpbmdbXCJBcHBEZWZhdWx0XCJdID0gXCJBcHBEZWZhdWx0XCI7XG59KShQcmludFNjYWxpbmcgfHwgKFByaW50U2NhbGluZyA9IHt9KSk7XG5leHBvcnQgdmFyIER1cGxleDtcbihmdW5jdGlvbiAoRHVwbGV4KSB7XG4gICAgLyoqIFRoZSBQREYgcmVhZGVyIHNob3VsZCBwcmludCBzaW5nbGUtc2lkZWQuICovXG4gICAgRHVwbGV4W1wiU2ltcGxleFwiXSA9IFwiU2ltcGxleFwiO1xuICAgIC8qKlxuICAgICAqIFRoZSBQREYgcmVhZGVyIHNob3VsZCBwcmludCBkb3VibGUgc2lkZWQgYW5kIGZsaXAgb24gdGhlIHNob3J0IGVkZ2Ugb2YgdGhlXG4gICAgICogc2hlZXQuXG4gICAgICovXG4gICAgRHVwbGV4W1wiRHVwbGV4RmxpcFNob3J0RWRnZVwiXSA9IFwiRHVwbGV4RmxpcFNob3J0RWRnZVwiO1xuICAgIC8qKlxuICAgICAqIFRoZSBQREYgcmVhZGVyIHNob3VsZCBwcmludCBkb3VibGUgc2lkZWQgYW5kIGZsaXAgb24gdGhlIGxvbmcgZWRnZSBvZiB0aGVcbiAgICAgKiBzaGVldC5cbiAgICAgKi9cbiAgICBEdXBsZXhbXCJEdXBsZXhGbGlwTG9uZ0VkZ2VcIl0gPSBcIkR1cGxleEZsaXBMb25nRWRnZVwiO1xufSkoRHVwbGV4IHx8IChEdXBsZXggPSB7fSkpO1xudmFyIFZpZXdlclByZWZlcmVuY2VzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgZnVuY3Rpb24gVmlld2VyUHJlZmVyZW5jZXMoZGljdCkge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIH1cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUubG9va3VwQm9vbCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHJldHVybk9iaiA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZihrZXkpKTtcbiAgICAgICAgaWYgKHJldHVybk9iaiBpbnN0YW5jZW9mIFBERkJvb2wpXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuT2JqO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmxvb2t1cE5hbWUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciByZXR1cm5PYmogPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2Yoa2V5KSk7XG4gICAgICAgIGlmIChyZXR1cm5PYmogaW5zdGFuY2VvZiBQREZOYW1lKVxuICAgICAgICAgICAgcmV0dXJuIHJldHVybk9iajtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkhpZGVUb29sYmFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdIaWRlVG9vbGJhcicpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuSGlkZU1lbnViYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJvb2woJ0hpZGVNZW51YmFyJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5IaWRlV2luZG93VUkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJvb2woJ0hpZGVXaW5kb3dVSScpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuRml0V2luZG93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdGaXRXaW5kb3cnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkNlbnRlcldpbmRvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQm9vbCgnQ2VudGVyV2luZG93Jyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5EaXNwbGF5RG9jVGl0bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJvb2woJ0Rpc3BsYXlEb2NUaXRsZScpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuTm9uRnVsbFNjcmVlblBhZ2VNb2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBOYW1lKCdOb25GdWxsU2NyZWVuUGFnZU1vZGUnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkRpcmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTmFtZSgnRGlyZWN0aW9uJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5QcmludFNjYWxpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE5hbWUoJ1ByaW50U2NhbGluZycpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuRHVwbGV4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBOYW1lKCdEdXBsZXgnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLlBpY2tUcmF5QnlQREZTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdQaWNrVHJheUJ5UERGU2l6ZScpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuUHJpbnRQYWdlUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBQcmludFBhZ2VSYW5nZSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignUHJpbnRQYWdlUmFuZ2UnKSk7XG4gICAgICAgIGlmIChQcmludFBhZ2VSYW5nZSBpbnN0YW5jZW9mIFBERkFycmF5KVxuICAgICAgICAgICAgcmV0dXJuIFByaW50UGFnZVJhbmdlO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuTnVtQ29waWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgTnVtQ29waWVzID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdOdW1Db3BpZXMnKSk7XG4gICAgICAgIGlmIChOdW1Db3BpZXMgaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICByZXR1cm4gTnVtQ29waWVzO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgUERGIHJlYWRlcnMgc2hvdWxkIGhpZGUgdGhlIHRvb2xiYXIgbWVudXMgd2hlbiBkaXNwbGF5aW5nXG4gICAgICogdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0b29sYmFycyBzaG91bGQgYmUgaGlkZGVuLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRIaWRlVG9vbGJhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuSGlkZVRvb2xiYXIoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCBoaWRlIHRoZSBtZW51IGJhciB3aGVuIGRpc3BsYXlpbmcgdGhpc1xuICAgICAqIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBtZW51IGJhciBzaG91bGQgYmUgaGlkZGVuLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRIaWRlTWVudWJhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuSGlkZU1lbnViYXIoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIFBERiByZWFkZXJzIHNob3VsZCBoaWRlIHRoZSB1c2VyIGludGVyZmFjZSBlbGVtZW50cyBpblxuICAgICAqIHRoZSBkb2N1bWVudCdzIHdpbmRvdyAoc3VjaCBhcyBzY3JvbGwgYmFycyBhbmQgbmF2aWdhdGlvbiBjb250cm9scyksXG4gICAgICogbGVhdmluZyBvbmx5IHRoZSBkb2N1bWVudCdzIGNvbnRlbnRzIGRpc3BsYXllZC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB1c2VyIGludGVyZmFjZSBlbGVtZW50cyBzaG91bGQgYmUgaGlkZGVuLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRIaWRlV2luZG93VUkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkhpZGVXaW5kb3dVSSgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNCb29sZWFuKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgUERGIHJlYWRlcnMgc2hvdWxkIHJlc2l6ZSB0aGUgZG9jdW1lbnQncyB3aW5kb3cgdG8gZml0XG4gICAgICogdGhlIHNpemUgb2YgdGhlIGZpcnN0IGRpc3BsYXllZCBwYWdlLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSB3aW5kb3cgc2hvdWxkIGJlIHJlc2l6ZWQgdG8gZml0LlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRGaXRXaW5kb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkZpdFdpbmRvdygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNCb29sZWFuKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgUERGIHJlYWRlcnMgc2hvdWxkIHBvc2l0aW9uIHRoZSBkb2N1bWVudCdzIHdpbmRvdyBpbiB0aGVcbiAgICAgKiBjZW50ZXIgb2YgdGhlIHNjcmVlbi5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0byBjZW50ZXIgdGhlIGRvY3VtZW50IHdpbmRvdy5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0Q2VudGVyV2luZG93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5DZW50ZXJXaW5kb3coKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSB3aW5kb3cncyB0aXRsZSBiYXIgc2hvdWxkIGRpc3BsYXkgdGhlIGRvY3VtZW50XG4gICAgICogYFRpdGxlYCwgdGFrZW4gZnJvbSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEgKHNlZSBbW1BERkRvY3VtZW50LmdldFRpdGxlXV0pLlxuICAgICAqIFJldHVybnMgYGZhbHNlYCBpZiB0aGUgdGl0bGUgYmFyIHNob3VsZCBpbnN0ZWFkIGRpc3BsYXkgdGhlIGZpbGVuYW1lIG9mIHRoZVxuICAgICAqIFBERiBmaWxlLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgZG9jdW1lbnQgdGl0bGUuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldERpc3BsYXlEb2NUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuRGlzcGxheURvY1RpdGxlKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc0Jvb2xlYW4oKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwYWdlIG1vZGUsIHdoaWNoIHRlbGxzIHRoZSBQREYgcmVhZGVyIGhvdyB0byBkaXNwbGF5IHRoZVxuICAgICAqIGRvY3VtZW50IGFmdGVyIGV4aXRpbmcgZnVsbC1zY3JlZW4gbW9kZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcGFnZSBtb2RlIGFmdGVyIGV4aXRpbmcgZnVsbC1zY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0Tm9uRnVsbFNjcmVlblBhZ2VNb2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB2YXIgbW9kZSA9IChfYSA9IHRoaXMuTm9uRnVsbFNjcmVlblBhZ2VNb2RlKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIHJldHVybiAoX2IgPSBhc0VudW0obW9kZSwgTm9uRnVsbFNjcmVlblBhZ2VNb2RlKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogTm9uRnVsbFNjcmVlblBhZ2VNb2RlLlVzZU5vbmU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcmVkb21pbmFudCByZWFkaW5nIG9yZGVyIGZvciB0ZXh0LlxuICAgICAqIEByZXR1cm5zIFRoZSB0ZXh0IHJlYWRpbmcgb3JkZXIuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldFJlYWRpbmdEaXJlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSAoX2EgPSB0aGlzLkRpcmVjdGlvbigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjb2RlVGV4dCgpO1xuICAgICAgICByZXR1cm4gKF9iID0gYXNFbnVtKGRpcmVjdGlvbiwgUmVhZGluZ0RpcmVjdGlvbikpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFJlYWRpbmdEaXJlY3Rpb24uTDJSO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGFnZSBzY2FsaW5nIG9wdGlvbiB0aGF0IHRoZSBQREYgcmVhZGVyIHNob3VsZCBzZWxlY3Qgd2hlbiB0aGVcbiAgICAgKiBwcmludCBkaWFsb2cgaXMgZGlzcGxheWVkLlxuICAgICAqIEByZXR1cm5zIFRoZSBwYWdlIHNjYWxpbmcgb3B0aW9uLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRQcmludFNjYWxpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBzY2FsaW5nID0gKF9hID0gdGhpcy5QcmludFNjYWxpbmcoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29kZVRleHQoKTtcbiAgICAgICAgcmV0dXJuIChfYiA9IGFzRW51bShzY2FsaW5nLCBQcmludFNjYWxpbmcpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBQcmludFNjYWxpbmcuQXBwRGVmYXVsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBhcGVyIGhhbmRsaW5nIG9wdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcHJpbnRpbmcgdGhlXG4gICAgICogZmlsZSBmcm9tIHRoZSBwcmludCBkaWFsb2cuXG4gICAgICogQHJldHVybnMgVGhlIHBhcGVyIGhhbmRsaW5nIG9wdGlvbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0RHVwbGV4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBkdXBsZXggPSAoX2EgPSB0aGlzLkR1cGxleCgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjb2RlVGV4dCgpO1xuICAgICAgICByZXR1cm4gYXNFbnVtKGR1cGxleCwgRHVwbGV4KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBQREYgcGFnZSBzaXplIHNob3VsZCBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgaW5wdXRcbiAgICAgKiBwYXBlciB0cmF5LlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBQREYgcGFnZSBzaXplIHNob3VsZCBiZSB1c2VkIHRvIHNlbGVjdCB0aGVcbiAgICAgKiAgICAgICAgICBpbnB1dCBwYXBlciB0cmF5LlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRQaWNrVHJheUJ5UERGU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5QaWNrVHJheUJ5UERGU2l6ZSgpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNCb29sZWFuKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBhZ2UgbnVtYmVyIHJhbmdlcywgd2hpY2ggYXJlIHRoZSB2YWx1ZXMgdXNlZCB0b1xuICAgICAqIGluaXRpYWxpemUgdGhlIHByaW50IGRpYWxvZyBib3ggd2hlbiB0aGUgZmlsZSBpcyBwcmludGVkLiBFYWNoIHJhbmdlXG4gICAgICogc3BlY2lmaWVzIHRoZSBmaXJzdCAoYHN0YXJ0YCkgYW5kIGxhc3QgKGBlbmRgKSBwYWdlcyBpbiBhIHN1Yi1yYW5nZSBvZlxuICAgICAqIHBhZ2VzIHRvIGJlIHByaW50ZWQuIFRoZSBmaXJzdCBwYWdlIG9mIHRoZSBQREYgZmlsZSBpcyBkZW5vdGVkIGJ5IDAuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB2aWV3ZXJQcmVmcyA9IHBkZkRvYy5jYXRhbG9nLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMoKVxuICAgICAqIGNvbnN0IGluY2x1ZGVzUGFnZTMgPSB2aWV3ZXJQcmVmc1xuICAgICAqICAgLmdldFByaW50UmFuZ2VzKClcbiAgICAgKiAgIC5zb21lKHByID0+IHByLnN0YXJ0ID08IDIgJiYgcHIuZW5kID49IDIpXG4gICAgICogaWYgKGluY2x1ZGVzUGFnZTMpIGNvbnNvbGUubG9nKCdwcmludFJhbmdlIGluY2x1ZGVzIHBhZ2UgMycpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2Ygb2JqZWN0cywgZWFjaCB3aXRoIHRoZSBwcm9wZXJ0aWVzIGBzdGFydGAgYW5kIGBlbmRgLFxuICAgICAqICAgICAgICAgIGRlbm90aW5nIHBhZ2UgaW5kaWNlcy4gSWYgbm90LCBzcGVjaWZpZWQgYW4gZW1wdHkgYXJyYXkgaXNcbiAgICAgKiAgICAgICAgICByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0UHJpbnRQYWdlUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBybmcgPSB0aGlzLlByaW50UGFnZVJhbmdlKCk7XG4gICAgICAgIGlmICghcm5nKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB2YXIgcGFnZVJhbmdlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJuZy5zaXplKCk7IGkgKz0gMikge1xuICAgICAgICAgICAgLy8gRGVzcGl0ZSB0aGUgc3BlYyBjbGVhcmx5IHN0YXRpbmcgdGhhdCBcIlRoZSBmaXJzdCBwYWdlIG9mIHRoZSBQREYgZmlsZVxuICAgICAgICAgICAgLy8gc2hhbGwgYmUgZG9ub3RlZCBieSAxXCIsIHNldmVyYWwgdGVzdCBQREZzIChzcGVjIDEuNykgY3JlYXRlZCBpblxuICAgICAgICAgICAgLy8gQWNyb2JhdCBYSSAxMS4wIGFuZCBhbHNvIHJlYWQgd2l0aCBSZWFkZXIgREMgMjAyMC4wMTMgaW5kaWNhdGUgdGhpcyBpc1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgYSAwIGJhc2VkIGluZGV4LlxuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcm5nLmxvb2t1cChpLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICB2YXIgZW5kID0gcm5nLmxvb2t1cChpICsgMSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICAgICAgcGFnZVJhbmdlcy5wdXNoKHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZVJhbmdlcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb3BpZXMgdG8gYmUgcHJpbnRlZCB3aGVuIHRoZSBwcmludCBkaWFsb2cgaXMgb3BlbmVkXG4gICAgICogZm9yIHRoaXMgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvcGllcyB0byBiZSBwcmludGVkLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXROdW1Db3BpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLk51bUNvcGllcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB3aGV0aGVyIHRoZSBQREYgcmVhZGVyJ3MgdG9vbGJhcnMgc2hvdWxkIGJlIGhpZGRlbiB3aGlsZSB0aGVcbiAgICAgKiBkb2N1bWVudCBpcyBhY3RpdmUuXG4gICAgICogQHBhcmFtIGhpZGVUb29sYmFyIGB0cnVlYCBpZiB0aGUgdG9vbGJhciBzaG91bGQgYmUgaGlkZGVuLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRIaWRlVG9vbGJhciA9IGZ1bmN0aW9uIChoaWRlVG9vbGJhcikge1xuICAgICAgICB2YXIgSGlkZVRvb2xiYXIgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooaGlkZVRvb2xiYXIpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0hpZGVUb29sYmFyJyksIEhpZGVUb29sYmFyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB3aGV0aGVyIHRoZSBQREYgcmVhZGVyJ3MgbWVudSBiYXIgc2hvdWxkIGJlIGhpZGRlbiB3aGlsZSB0aGVcbiAgICAgKiBkb2N1bWVudCBpcyBhY3RpdmUuXG4gICAgICogQHBhcmFtIGhpZGVNZW51YmFyIGB0cnVlYCBpZiB0aGUgbWVudSBiYXIgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0SGlkZU1lbnViYXIgPSBmdW5jdGlvbiAoaGlkZU1lbnViYXIpIHtcbiAgICAgICAgdmFyIEhpZGVNZW51YmFyID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGhpZGVNZW51YmFyKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdIaWRlTWVudWJhcicpLCBIaWRlTWVudWJhcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIHJlYWRlciBzaG91bGQgaGlkZSB1c2VyIGludGVyZmFjZSBlbGVtZW50cyBpbiB0aGVcbiAgICAgKiBkb2N1bWVudCdzIHdpbmRvdyAoc3VjaCBhcyBzY3JvbGwgYmFycyBhbmQgbmF2aWdhdGlvbiBjb250cm9scyksIGxlYXZpbmdcbiAgICAgKiBvbmx5IHRoZSBkb2N1bWVudCdzIGNvbnRlbnRzIGRpc3BsYXllZC5cbiAgICAgKiBAcGFyYW0gaGlkZVdpbmRvd1VJIGB0cnVlYCBpZiB0aGUgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0SGlkZVdpbmRvd1VJID0gZnVuY3Rpb24gKGhpZGVXaW5kb3dVSSkge1xuICAgICAgICB2YXIgSGlkZVdpbmRvd1VJID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGhpZGVXaW5kb3dVSSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignSGlkZVdpbmRvd1VJJyksIEhpZGVXaW5kb3dVSSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIHJlYWRlciBzaG91bGQgcmVzaXplIHRoZSBkb2N1bWVudCdzIHdpbmRvdyB0byBmaXRcbiAgICAgKiB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgZGlzcGxheWVkIHBhZ2UuXG4gICAgICogQHBhcmFtIGZpdFdpbmRvdyBgdHJ1ZWAgaWYgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXplZC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0Rml0V2luZG93ID0gZnVuY3Rpb24gKGZpdFdpbmRvdykge1xuICAgICAgICB2YXIgRml0V2luZG93ID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGZpdFdpbmRvdyk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRml0V2luZG93JyksIEZpdFdpbmRvdyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIHJlYWRlciBzaG91bGQgcG9zaXRpb24gdGhlIGRvY3VtZW50J3Mgd2luZG93IGluIHRoZVxuICAgICAqIGNlbnRlciBvZiB0aGUgc2NyZWVuLlxuICAgICAqIEBwYXJhbSBjZW50ZXJXaW5kb3cgYHRydWVgIGlmIHRoZSB3aW5kb3cgc2hvdWxkIGJlIGNlbnRlcmVkLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRDZW50ZXJXaW5kb3cgPSBmdW5jdGlvbiAoY2VudGVyV2luZG93KSB7XG4gICAgICAgIHZhciBDZW50ZXJXaW5kb3cgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooY2VudGVyV2luZG93KTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdDZW50ZXJXaW5kb3cnKSwgQ2VudGVyV2luZG93KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB3aGV0aGVyIHRoZSB3aW5kb3cncyB0aXRsZSBiYXIgc2hvdWxkIGRpc3BsYXkgdGhlIGRvY3VtZW50IGBUaXRsZWBcbiAgICAgKiB0YWtlbiBmcm9tIHRoZSBkb2N1bWVudCBtZXRhZGF0YSAoc2VlIFtbUERGRG9jdW1lbnQuc2V0VGl0bGVdXSkuIElmXG4gICAgICogYGZhbHNlYCwgdGhlIHRpdGxlIGJhciBzaG91bGQgaW5zdGVhZCBkaXNwbGF5IHRoZSBQREYgZmlsZW5hbWUuXG4gICAgICogQHBhcmFtIGRpc3BsYXlUaXRsZSBgdHJ1ZWAgaWYgdGhlIGRvY3VtZW50IHRpdGxlIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldERpc3BsYXlEb2NUaXRsZSA9IGZ1bmN0aW9uIChkaXNwbGF5VGl0bGUpIHtcbiAgICAgICAgdmFyIERpc3BsYXlEb2NUaXRsZSA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihkaXNwbGF5VGl0bGUpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0Rpc3BsYXlEb2NUaXRsZScpLCBEaXNwbGF5RG9jVGl0bGUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIGhvdyB0aGUgUERGIHJlYWRlciBzaG91bGQgZGlzcGxheSB0aGUgZG9jdW1lbnQgdXBvbiBleGl0aW5nXG4gICAgICogZnVsbC1zY3JlZW4gbW9kZS4gVGhpcyBlbnRyeSBpcyBtZWFuaW5nZnVsIG9ubHkgaWYgdGhlIHZhbHVlIG9mIHRoZVxuICAgICAqIGBQYWdlTW9kZWAgZW50cnkgaW4gdGhlIGRvY3VtZW50J3MgW1tQREZDYXRhbG9nXV0gaXMgYEZ1bGxTY3JlZW5gLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCwgTm9uRnVsbFNjcmVlblBhZ2VNb2RlLCBQREZOYW1lIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICpcbiAgICAgKiAvLyBTZXQgdGhlIFBhZ2VNb2RlXG4gICAgICogcGRmRG9jLmNhdGFsb2cuc2V0KFBERk5hbWUub2YoJ1BhZ2VNb2RlJyksUERGTmFtZS5vZignRnVsbFNjcmVlbicpKVxuICAgICAqXG4gICAgICogLy8gU2V0IHdoYXQgaGFwcGVucyB3aGVuIGZ1bGwtc2NyZWVuIGlzIGNsb3NlZFxuICAgICAqIGNvbnN0IHZpZXdlclByZWZzID0gcGRmRG9jLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpXG4gICAgICogdmlld2VyUHJlZnMuc2V0Tm9uRnVsbFNjcmVlblBhZ2VNb2RlKE5vbkZ1bGxTY3JlZW5QYWdlTW9kZS5Vc2VPdXRsaW5lcylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBub25GdWxsU2NyZWVuUGFnZU1vZGUgSG93IHRoZSBkb2N1bWVudCBzaG91bGQgYmUgZGlzcGxheWVkIHVwb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRpbmcgZnVsbCBzY3JlZW4gbW9kZS5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0Tm9uRnVsbFNjcmVlblBhZ2VNb2RlID0gZnVuY3Rpb24gKG5vbkZ1bGxTY3JlZW5QYWdlTW9kZSkge1xuICAgICAgICBhc3NlcnRJc09uZU9mKG5vbkZ1bGxTY3JlZW5QYWdlTW9kZSwgJ25vbkZ1bGxTY3JlZW5QYWdlTW9kZScsIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZSk7XG4gICAgICAgIHZhciBtb2RlID0gUERGTmFtZS5vZihub25GdWxsU2NyZWVuUGFnZU1vZGUpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ05vbkZ1bGxTY3JlZW5QYWdlTW9kZScpLCBtb2RlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB0aGUgcHJlZG9taW5hbnQgcmVhZGluZyBvcmRlciBmb3IgdGV4dC5cbiAgICAgKlxuICAgICAqIFRoaXMgZW50cnkgaGFzIG5vIGRpcmVjdCBlZmZlY3Qgb24gdGhlIGRvY3VtZW50J3MgY29udGVudHMgb3IgcGFnZVxuICAgICAqIG51bWJlcmluZywgYnV0IG1heSBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgcGFnZXNcbiAgICAgKiB3aGVuIGRpc3BsYXllZCBzaWRlIGJ5IHNpZGUgb3IgcHJpbnRlZCBuLXVwLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCwgUmVhZGluZ0RpcmVjdGlvbiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHZpZXdlclByZWZzID0gcGRmRG9jLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpXG4gICAgICogdmlld2VyUHJlZnMuc2V0UmVhZGluZ0RpcmVjdGlvbihSZWFkaW5nRGlyZWN0aW9uLlIyTClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFkaW5nRGlyZWN0aW9uIFRoZSByZWFkaW5nIG9yZGVyIGZvciB0ZXh0LlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRSZWFkaW5nRGlyZWN0aW9uID0gZnVuY3Rpb24gKHJlYWRpbmdEaXJlY3Rpb24pIHtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZihyZWFkaW5nRGlyZWN0aW9uLCAncmVhZGluZ0RpcmVjdGlvbicsIFJlYWRpbmdEaXJlY3Rpb24pO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gUERGTmFtZS5vZihyZWFkaW5nRGlyZWN0aW9uKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdEaXJlY3Rpb24nKSwgZGlyZWN0aW9uKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB0aGUgcGFnZSBzY2FsaW5nIG9wdGlvbiB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGEgcHJpbnQgZGlhbG9nXG4gICAgICogaXMgZGlzcGxheWVkIGZvciB0aGlzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCwgUHJpbnRTY2FsaW5nIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3Qgdmlld2VyUHJlZnMgPSBwZGZEb2MuY2F0YWxvZy5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzKClcbiAgICAgKiB2aWV3ZXJQcmVmcy5zZXRQcmludFNjYWxpbmcoUHJpbnRTY2FsaW5nLk5vbmUpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJpbnRTY2FsaW5nIFRoZSBwcmludCBzY2FsaW5nIG9wdGlvbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0UHJpbnRTY2FsaW5nID0gZnVuY3Rpb24gKHByaW50U2NhbGluZykge1xuICAgICAgICBhc3NlcnRJc09uZU9mKHByaW50U2NhbGluZywgJ3ByaW50U2NhbGluZycsIFByaW50U2NhbGluZyk7XG4gICAgICAgIHZhciBzY2FsaW5nID0gUERGTmFtZS5vZihwcmludFNjYWxpbmcpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1ByaW50U2NhbGluZycpLCBzY2FsaW5nKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB0aGUgcGFwZXIgaGFuZGxpbmcgb3B0aW9uIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgaW4gdGhlXG4gICAgICogcHJpbnQgZGlhbG9nLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCwgRHVwbGV4IH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3Qgdmlld2VyUHJlZnMgPSBwZGZEb2MuY2F0YWxvZy5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzKClcbiAgICAgKiB2aWV3ZXJQcmVmcy5zZXREdXBsZXgoRHVwbGV4LkR1cGxleEZsaXBTaG9ydEVkZ2UpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZHVwbGV4IFRoZSBkb3VibGUgb3Igc2luZ2xlIHNpZGVkIHByaW50aW5nIG9wdGlvbi5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0RHVwbGV4ID0gZnVuY3Rpb24gKGR1cGxleCkge1xuICAgICAgICBhc3NlcnRJc09uZU9mKGR1cGxleCwgJ2R1cGxleCcsIER1cGxleCk7XG4gICAgICAgIHZhciBkdXAgPSBQREZOYW1lLm9mKGR1cGxleCk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRHVwbGV4JyksIGR1cCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2Ugd2hldGhlciB0aGUgUERGIGRvY3VtZW50J3MgcGFnZSBzaXplIHNob3VsZCBiZSB1c2VkIHRvIHNlbGVjdCB0aGVcbiAgICAgKiBpbnB1dCBwYXBlciB0cmF5IHdoZW4gcHJpbnRpbmcuIFRoaXMgc2V0dGluZyBpbmZsdWVuY2VzIG9ubHkgdGhlIHByZXNldFxuICAgICAqIHZhbHVlcyB1c2VkIHRvIHBvcHVsYXRlIHRoZSBwcmludCBkaWFsb2cgcHJlc2VudGVkIGJ5IGEgUERGIHJlYWRlci5cbiAgICAgKlxuICAgICAqIElmIFBpY2tUcmF5QnlQREZTaXplIGlzIHRydWUsIHRoZSBjaGVjayBib3ggaW4gdGhlIHByaW50IGRpYWxvZyBhc3NvY2lhdGVkXG4gICAgICogd2l0aCBpbnB1dCBwYXBlciB0cmF5IHNob3VsZCBiZSBjaGVja2VkLiBUaGlzIHNldHRpbmcgaGFzIG5vIGVmZmVjdCBvblxuICAgICAqIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gcGljayB0aGUgaW5wdXQgdHJheVxuICAgICAqIGJ5IHNpemUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGlja1RyYXlCeVBERlNpemUgYHRydWVgIGlmIHRoZSBkb2N1bWVudCdzIHBhZ2Ugc2l6ZSBzaG91bGQgYmUgdXNlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZWxlY3QgdGhlIGlucHV0IHBhcGVyIHRyYXkuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldFBpY2tUcmF5QnlQREZTaXplID0gZnVuY3Rpb24gKHBpY2tUcmF5QnlQREZTaXplKSB7XG4gICAgICAgIHZhciBQaWNrVHJheUJ5UERGU2l6ZSA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihwaWNrVHJheUJ5UERGU2l6ZSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUGlja1RyYXlCeVBERlNpemUnKSwgUGlja1RyYXlCeVBERlNpemUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHRoZSBwYWdlIG51bWJlcnMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwcmludCBkaWFsb2cgYm94IHdoZW4gdGhlXG4gICAgICogZmlsZSBpcyBwcmludGVkLiBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgUERGIGZpbGUgaXMgZGVub3RlZCBieSAwLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBQREZEb2N1bWVudCB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHZpZXdlclByZWZzID0gcGRmRG9jLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpXG4gICAgICpcbiAgICAgKiAvLyBXZSBjYW4gc2V0IHRoZSBkZWZhdWx0IHByaW50IHJhbmdlIHRvIG9ubHkgdGhlIGZpcnN0IHBhZ2VcbiAgICAgKiB2aWV3ZXJQcmVmcy5zZXRQcmludFBhZ2VSYW5nZSh7IHN0YXJ0OiAwLCBlbmQ6IDAgfSlcbiAgICAgKlxuICAgICAqIC8vIE9yIHdlIGNhbiBzdXBwbHkgbm9uY29udGlndW91cyByYW5nZXMgKGUuZy4gcGFnZXMgMSwgMywgYW5kIDUtNylcbiAgICAgKiB2aWV3ZXJQcmVmcy5zZXRQcmludFBhZ2VSYW5nZShbXG4gICAgICogICB7IHN0YXJ0OiAwLCBlbmQ6IDAgfSxcbiAgICAgKiAgIHsgc3RhcnQ6IDIsIGVuZDogMiB9LFxuICAgICAqICAgeyBzdGFydDogNCwgZW5kOiA2IH0sXG4gICAgICogXSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcmludFBhZ2VSYW5nZSBBbiBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cywgZWFjaCB3aXRoIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIGBzdGFydGAgYW5kIGBlbmRgLCBkZW5vdGluZyBhIHJhbmdlIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgaW5kaWNlcy5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0UHJpbnRQYWdlUmFuZ2UgPSBmdW5jdGlvbiAocHJpbnRQYWdlUmFuZ2UpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByaW50UGFnZVJhbmdlKSlcbiAgICAgICAgICAgIHByaW50UGFnZVJhbmdlID0gW3ByaW50UGFnZVJhbmdlXTtcbiAgICAgICAgdmFyIGZsYXRSYW5nZSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBwcmludFBhZ2VSYW5nZS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGZsYXRSYW5nZS5wdXNoKHByaW50UGFnZVJhbmdlW2lkeF0uc3RhcnQpO1xuICAgICAgICAgICAgZmxhdFJhbmdlLnB1c2gocHJpbnRQYWdlUmFuZ2VbaWR4XS5lbmQpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydEVhY2hJcyhmbGF0UmFuZ2UsICdwcmludFBhZ2VSYW5nZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgcGFnZVJhbmdlcyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihmbGF0UmFuZ2UpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1ByaW50UGFnZVJhbmdlJyksIHBhZ2VSYW5nZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHRoZSBkZWZhdWx0IG51bWJlciBvZiBjb3BpZXMgdG8gYmUgcHJpbnRlZCB3aGVuIHRoZSBwcmludCBkaWFsb2cgaXNcbiAgICAgKiBvcGVuZWQgZm9yIHRoaXMgZmlsZS5cbiAgICAgKiBAcGFyYW0gbnVtQ29waWVzIFRoZSBkZWZhdWx0IG51bWJlciBvZiBjb3BpZXMuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldE51bUNvcGllcyA9IGZ1bmN0aW9uIChudW1Db3BpZXMpIHtcbiAgICAgICAgYXNzZXJ0UmFuZ2UobnVtQ29waWVzLCAnbnVtQ29waWVzJywgMSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIGFzc2VydEludGVnZXIobnVtQ29waWVzLCAnbnVtQ29waWVzJyk7XG4gICAgICAgIHZhciBOdW1Db3BpZXMgPSB0aGlzLmRpY3QuY29udGV4dC5vYmoobnVtQ29waWVzKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdOdW1Db3BpZXMnKSwgTnVtQ29waWVzKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMuZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCkge1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdlclByZWZlcmVuY2VzKGRpY3QpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3ZXJQcmVmZXJlbmNlcyhkaWN0KTtcbiAgICB9O1xuICAgIHJldHVybiBWaWV3ZXJQcmVmZXJlbmNlcztcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBWaWV3ZXJQcmVmZXJlbmNlcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZXdlclByZWZlcmVuY2VzLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcywgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4vUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkFycmF5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBcnJheSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBcnJheShjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmFycmF5ID0gW107XG4gICAgICAgIF90aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkFycmF5LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJheS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgdGhpcy5hcnJheS5wdXNoKG9iamVjdCk7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKGluZGV4LCBvYmplY3QpIHtcbiAgICAgICAgdGhpcy5hcnJheS5zcGxpY2UoaW5kZXgsIDAsIG9iamVjdCk7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5hcnJheS5pbmRleE9mKG9iamVjdCk7XG4gICAgICAgIHJldHVybiBpbmRleCA9PT0gLTEgPyB1bmRlZmluZWQgOiBpbmRleDtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5hcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChpZHgsIG9iamVjdCkge1xuICAgICAgICB0aGlzLmFycmF5W2lkeF0gPSBvYmplY3Q7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFycmF5W2luZGV4XTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5sb29rdXBNYXliZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0eXBlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdHlwZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuY29udGV4dCkubG9va3VwTWF5YmUuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXlzKFt0aGlzLmdldChpbmRleCldLCB0eXBlcykpO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmxvb2t1cCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0eXBlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdHlwZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuY29udGV4dCkubG9va3VwLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5cyhbdGhpcy5nZXQoaW5kZXgpXSwgdHlwZXMpKTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5hc1JlY3RhbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSgpICE9PSA0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvcih0aGlzLnNpemUoKSk7XG4gICAgICAgIHZhciBsb3dlckxlZnRYID0gdGhpcy5sb29rdXAoMCwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICB2YXIgbG93ZXJMZWZ0WSA9IHRoaXMubG9va3VwKDEsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgdmFyIHVwcGVyUmlnaHRYID0gdGhpcy5sb29rdXAoMiwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICB2YXIgdXBwZXJSaWdodFkgPSB0aGlzLmxvb2t1cCgzLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIHZhciB4ID0gbG93ZXJMZWZ0WDtcbiAgICAgICAgdmFyIHkgPSBsb3dlckxlZnRZO1xuICAgICAgICB2YXIgd2lkdGggPSB1cHBlclJpZ2h0WCAtIGxvd2VyTGVmdFg7XG4gICAgICAgIHZhciBoZWlnaHQgPSB1cHBlclJpZ2h0WSAtIGxvd2VyTGVmdFk7XG4gICAgICAgIHJldHVybiB7IHg6IHgsIHk6IHksIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5hc0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJheS5zbGljZSgpO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNsb25lID0gUERGQXJyYXkud2l0aENvbnRleHQoY29udGV4dCB8fCB0aGlzLmNvbnRleHQpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgY2xvbmUucHVzaCh0aGlzLmFycmF5W2lkeF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5U3RyaW5nID0gJ1sgJztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGFycmF5U3RyaW5nICs9IHRoaXMuZ2V0KGlkeCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGFycmF5U3RyaW5nICs9ICcgJztcbiAgICAgICAgfVxuICAgICAgICBhcnJheVN0cmluZyArPSAnXSc7XG4gICAgICAgIHJldHVybiBhcnJheVN0cmluZztcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNpemUgPSAzO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgc2l6ZSArPSB0aGlzLmdldChpZHgpLnNpemVJbkJ5dGVzKCkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTGVmdFNxdWFyZUJyYWNrZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdGhpcy5nZXQoaWR4KS5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5SaWdodFNxdWFyZUJyYWNrZXQ7XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLnNjYWxlUERGTnVtYmVycyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgUERGTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZhY3RvciA9IGlkeCAlIDIgPT09IDAgPyB4IDogeTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChpZHgsIFBERk51bWJlci5vZihlbC5hc051bWJlcigpICogZmFjdG9yKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkFycmF5LndpdGhDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQpIHsgcmV0dXJuIG5ldyBQREZBcnJheShjb250ZXh0KTsgfTtcbiAgICByZXR1cm4gUERGQXJyYXk7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQXJyYXk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBcnJheS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbnZhciBFTkZPUkNFUiA9IHt9O1xudmFyIFBERkJvb2wgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkJvb2wsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQm9vbChlbmZvcmNlciwgdmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKGVuZm9yY2VyICE9PSBFTkZPUkNFUilcbiAgICAgICAgICAgIHRocm93IG5ldyBQcml2YXRlQ29uc3RydWN0b3JFcnJvcignUERGQm9vbCcpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGQm9vbC5wcm90b3R5cGUuYXNCb29sZWFuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFBERkJvb2wucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFBERkJvb2wucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgUERGQm9vbC5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlID8gNCA6IDU7XG4gICAgfTtcbiAgICBQREZCb29sLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnQ7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnU7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZjtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuYTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubDtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucztcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgICAgIHJldHVybiA1O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZCb29sLlRydWUgPSBuZXcgUERGQm9vbChFTkZPUkNFUiwgdHJ1ZSk7XG4gICAgUERGQm9vbC5GYWxzZSA9IG5ldyBQREZCb29sKEVORk9SQ0VSLCBmYWxzZSk7XG4gICAgcmV0dXJuIFBERkJvb2w7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQm9vbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkJvb2wuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzLCBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4vUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bGwgZnJvbSBcIi4vUERGTnVsbFwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbnZhciBQREZEaWN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZEaWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkRpY3QobWFwLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmRpY3QgPSBtYXA7XG4gICAgICAgIF90aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkRpY3QucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZGljdC5rZXlzKCkpO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmRpY3QudmFsdWVzKCkpO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5kaWN0LmVudHJpZXMoKSk7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KGtleSwgdmFsdWUpO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSwgXG4gICAgLy8gVE9ETzogYHByZXNlcnZlUERGTnVsbGAgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBTaG91bGQgYmVcbiAgICAvLyByZW1vdmVkIGluIG5leHQgYnJlYWtpbmcgQVBJIGNoYW5nZS5cbiAgICBwcmVzZXJ2ZVBERk51bGwpIHtcbiAgICAgICAgaWYgKHByZXNlcnZlUERGTnVsbCA9PT0gdm9pZCAwKSB7IHByZXNlcnZlUERGTnVsbCA9IGZhbHNlOyB9XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZGljdC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBQREZOdWxsICYmICFwcmVzZXJ2ZVBERk51bGwpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZGljdC5nZXQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IFBERk51bGw7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5sb29rdXBNYXliZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHR5cGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IGBwcmVzZXJ2ZVBERk51bGxgIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gU2hvdWxkIGJlXG4gICAgICAgIC8vIHJlbW92ZWQgaW4gbmV4dCBicmVha2luZyBBUEkgY2hhbmdlLlxuICAgICAgICB2YXIgcHJlc2VydmVQREZOdWxsID0gdHlwZXMuaW5jbHVkZXMoUERGTnVsbCk7XG4gICAgICAgIHZhciB2YWx1ZSA9IChfYSA9IHRoaXMuY29udGV4dCkubG9va3VwTWF5YmUuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXlzKFt0aGlzLmdldChrZXksIHByZXNlcnZlUERGTnVsbCldLCB0eXBlcykpO1xuICAgICAgICBpZiAodmFsdWUgPT09IFBERk51bGwgJiYgIXByZXNlcnZlUERGTnVsbClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmxvb2t1cCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHR5cGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IGBwcmVzZXJ2ZVBERk51bGxgIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gU2hvdWxkIGJlXG4gICAgICAgIC8vIHJlbW92ZWQgaW4gbmV4dCBicmVha2luZyBBUEkgY2hhbmdlLlxuICAgICAgICB2YXIgcHJlc2VydmVQREZOdWxsID0gdHlwZXMuaW5jbHVkZXMoUERGTnVsbCk7XG4gICAgICAgIHZhciB2YWx1ZSA9IChfYSA9IHRoaXMuY29udGV4dCkubG9va3VwLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5cyhbdGhpcy5nZXQoa2V5LCBwcmVzZXJ2ZVBERk51bGwpXSwgdHlwZXMpKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBQREZOdWxsICYmICFwcmVzZXJ2ZVBERk51bGwpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QuZGVsZXRlKGtleSk7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5hc01hcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAodGhpcy5kaWN0KTtcbiAgICB9O1xuICAgIC8qKiBHZW5lcmF0ZSBhIHJhbmRvbSBrZXkgdGhhdCBkb2Vzbid0IGV4aXN0IGluIGN1cnJlbnQga2V5IHNldCAqL1xuICAgIFBERkRpY3QucHJvdG90eXBlLnVuaXF1ZUtleSA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgaWYgKHRhZyA9PT0gdm9pZCAwKSB7IHRhZyA9ICcnOyB9XG4gICAgICAgIHZhciBleGlzdGluZ0tleXMgPSB0aGlzLmtleXMoKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YodGhpcy5jb250ZXh0LmFkZFJhbmRvbVN1ZmZpeCh0YWcsIDEwKSk7XG4gICAgICAgIHdoaWxlIChleGlzdGluZ0tleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAga2V5ID0gUERGTmFtZS5vZih0aGlzLmNvbnRleHQuYWRkUmFuZG9tU3VmZml4KHRhZywgMTApKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgY2xvbmUgPSBQREZEaWN0LndpdGhDb250ZXh0KGNvbnRleHQgfHwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBjbG9uZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaWN0U3RyaW5nID0gJzw8XFxuJztcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBkaWN0U3RyaW5nICs9IGtleS50b1N0cmluZygpICsgJyAnICsgdmFsdWUudG9TdHJpbmcoKSArICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGRpY3RTdHJpbmcgKz0gJz4+JztcbiAgICAgICAgcmV0dXJuIGRpY3RTdHJpbmc7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNpemUgPSA1O1xuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgIHNpemUgKz0ga2V5LnNpemVJbkJ5dGVzKCkgKyB2YWx1ZS5zaXplSW5CeXRlcygpICsgMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTGVzc1RoYW47XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTGVzc1RoYW47XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBvZmZzZXQgKz0ga2V5LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgICAgIG9mZnNldCArPSB2YWx1ZS5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkdyZWF0ZXJUaGFuO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkdyZWF0ZXJUaGFuO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERkRpY3Qud2l0aENvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCkgeyByZXR1cm4gbmV3IFBERkRpY3QobmV3IE1hcCgpLCBjb250ZXh0KTsgfTtcbiAgICBQREZEaWN0LmZyb21NYXBXaXRoQ29udGV4dCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZEaWN0KG1hcCwgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRGljdDtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZEaWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRGljdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciwgdG9IZXhTdHJpbmdPZk1pbkxlbmd0aCwgdXRmMTZEZWNvZGUsIHV0ZjE2RW5jb2RlLCBwZGZEb2NFbmNvZGluZ0RlY29kZSwgcGFyc2VEYXRlLCBoYXNVdGYxNkJPTSwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGSGV4U3RyaW5nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZIZXhTdHJpbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGSGV4U3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5hc0J5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBBcHBlbmQgYSB6ZXJvIGlmIHRoZSBudW1iZXIgb2YgZGlnaXRzIGlzIG9kZC4gU2VlIFBERiBzcGVjIDcuMy40LjNcbiAgICAgICAgdmFyIGhleCA9IHRoaXMudmFsdWUgKyAodGhpcy52YWx1ZS5sZW5ndGggJSAyID09PSAxID8gJzAnIDogJycpO1xuICAgICAgICB2YXIgaGV4TGVuZ3RoID0gaGV4Lmxlbmd0aDtcbiAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoaGV4Lmxlbmd0aCAvIDIpO1xuICAgICAgICB2YXIgaGV4T2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIGJ5dGVzT2Zmc2V0ID0gMDtcbiAgICAgICAgLy8gSW50ZXJwcmV0IGVhY2ggcGFpciBvZiBoZXggZGlnaXRzIGFzIGEgc2luZ2xlIGJ5dGVcbiAgICAgICAgd2hpbGUgKGhleE9mZnNldCA8IGhleExlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKGhleE9mZnNldCwgaGV4T2Zmc2V0ICsgMiksIDE2KTtcbiAgICAgICAgICAgIGJ5dGVzW2J5dGVzT2Zmc2V0XSA9IGJ5dGU7XG4gICAgICAgICAgICBoZXhPZmZzZXQgKz0gMjtcbiAgICAgICAgICAgIGJ5dGVzT2Zmc2V0ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5kZWNvZGVUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmFzQnl0ZXMoKTtcbiAgICAgICAgaWYgKGhhc1V0ZjE2Qk9NKGJ5dGVzKSlcbiAgICAgICAgICAgIHJldHVybiB1dGYxNkRlY29kZShieXRlcyk7XG4gICAgICAgIHJldHVybiBwZGZEb2NFbmNvZGluZ0RlY29kZShieXRlcyk7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLmRlY29kZURhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ZXh0ID0gdGhpcy5kZWNvZGVUZXh0KCk7XG4gICAgICAgIHZhciBkYXRlID0gcGFyc2VEYXRlKHRleHQpO1xuICAgICAgICBpZiAoIWRhdGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvcih0ZXh0KTtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLmFzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQREZIZXhTdHJpbmcub2YodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCI8XCIgKyB0aGlzLnZhbHVlICsgXCI+XCI7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGggKyAyO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTGVzc1RoYW47XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLnZhbHVlLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuR3JlYXRlclRoYW47XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmxlbmd0aCArIDI7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcub2YgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIG5ldyBQREZIZXhTdHJpbmcodmFsdWUpOyB9O1xuICAgIFBERkhleFN0cmluZy5mcm9tVGV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgZW5jb2RlZCA9IHV0ZjE2RW5jb2RlKHZhbHVlKTtcbiAgICAgICAgdmFyIGhleCA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbmNvZGVkLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgaGV4ICs9IHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGgoZW5jb2RlZFtpZHhdLCA0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFBERkhleFN0cmluZyhoZXgpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkhleFN0cmluZztcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZIZXhTdHJpbmc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZIZXhTdHJpbmcuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xudmFyIFBERkludmFsaWRPYmplY3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkludmFsaWRPYmplY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGSW52YWxpZE9iamVjdChkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkludmFsaWRPYmplY3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUERGSW52YWxpZE9iamVjdC5vZih0aGlzLmRhdGEuc2xpY2UoKSk7XG4gICAgfTtcbiAgICBQREZJbnZhbGlkT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiUERGSW52YWxpZE9iamVjdChcIiArIHRoaXMuZGF0YS5sZW5ndGggKyBcIiBieXRlcylcIjtcbiAgICB9O1xuICAgIFBERkludmFsaWRPYmplY3QucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERkludmFsaWRPYmplY3QucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSB0aGlzLmRhdGFbaWR4XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH07XG4gICAgUERGSW52YWxpZE9iamVjdC5vZiA9IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBuZXcgUERGSW52YWxpZE9iamVjdChkYXRhKTsgfTtcbiAgICByZXR1cm4gUERGSW52YWxpZE9iamVjdDtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZJbnZhbGlkT2JqZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGSW52YWxpZE9iamVjdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IElzSXJyZWd1bGFyIH0gZnJvbSBcIi4uL3N5bnRheC9JcnJlZ3VsYXJcIjtcbmltcG9ydCB7IGNoYXJGcm9tSGV4Q29kZSwgY29weVN0cmluZ0ludG9CdWZmZXIsIHRvQ2hhckNvZGUsIHRvSGV4U3RyaW5nLCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIGRlY29kZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoLyMoW1xcZEFCQ0RFRl17Mn0pL2csIGZ1bmN0aW9uIChfLCBoZXgpIHsgcmV0dXJuIGNoYXJGcm9tSGV4Q29kZShoZXgpOyB9KTtcbn07XG52YXIgaXNSZWd1bGFyQ2hhciA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICAgIHJldHVybiBjaGFyQ29kZSA+PSBDaGFyQ29kZXMuRXhjbGFtYXRpb25Qb2ludCAmJlxuICAgICAgICBjaGFyQ29kZSA8PSBDaGFyQ29kZXMuVGlsZGUgJiZcbiAgICAgICAgIUlzSXJyZWd1bGFyW2NoYXJDb2RlXTtcbn07XG52YXIgRU5GT1JDRVIgPSB7fTtcbnZhciBwb29sID0gbmV3IE1hcCgpO1xudmFyIFBERk5hbWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk5hbWUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGTmFtZShlbmZvcmNlciwgbmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZW5mb3JjZXIgIT09IEVORk9SQ0VSKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yKCdQREZOYW1lJyk7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgdmFyIGVuY29kZWROYW1lID0gJy8nO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBuYW1lLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNoYXJhY3RlciA9IG5hbWVbaWR4XTtcbiAgICAgICAgICAgIHZhciBjb2RlID0gdG9DaGFyQ29kZShjaGFyYWN0ZXIpO1xuICAgICAgICAgICAgZW5jb2RlZE5hbWUgKz0gaXNSZWd1bGFyQ2hhcihjb2RlKSA/IGNoYXJhY3RlciA6IFwiI1wiICsgdG9IZXhTdHJpbmcoY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMuZW5jb2RlZE5hbWUgPSBlbmNvZGVkTmFtZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZOYW1lLnByb3RvdHlwZS5hc0J5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZXMgPSBbXTtcbiAgICAgICAgdmFyIGhleCA9ICcnO1xuICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgcHVzaEJ5dGUgPSBmdW5jdGlvbiAoYnl0ZSkge1xuICAgICAgICAgICAgaWYgKGJ5dGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBieXRlcy5wdXNoKGJ5dGUpO1xuICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAxLCBsZW4gPSB0aGlzLmVuY29kZWROYW1lLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGNoYXIgPSB0aGlzLmVuY29kZWROYW1lW2lkeF07XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRvQ2hhckNvZGUoY2hhcik7XG4gICAgICAgICAgICB2YXIgbmV4dENoYXIgPSB0aGlzLmVuY29kZWROYW1lW2lkeCArIDFdO1xuICAgICAgICAgICAgaWYgKCFlc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5IYXNoKVxuICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKGJ5dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKChieXRlID49IENoYXJDb2Rlcy5aZXJvICYmIGJ5dGUgPD0gQ2hhckNvZGVzLk5pbmUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChieXRlID49IENoYXJDb2Rlcy5hICYmIGJ5dGUgPD0gQ2hhckNvZGVzLmYpIHx8XG4gICAgICAgICAgICAgICAgICAgIChieXRlID49IENoYXJDb2Rlcy5BICYmIGJ5dGUgPD0gQ2hhckNvZGVzLkYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhleCArPSBjaGFyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgISgobmV4dENoYXIgPj0gJzAnICYmIG5leHRDaGFyIDw9ICc5JykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dENoYXIgPj0gJ2EnICYmIG5leHRDaGFyIDw9ICdmJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dENoYXIgPj0gJ0EnICYmIG5leHRDaGFyIDw9ICdGJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShwYXJzZUludChoZXgsIDE2KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZXggPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoYnl0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShieXRlcyk7XG4gICAgfTtcbiAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgYHV0ZjhEZWNvZGUoKWBcbiAgICAvLyBUT0RPOiBQb2x5ZmlsbCBBcnJheS5mcm9tP1xuICAgIFBERk5hbWUucHJvdG90eXBlLmRlY29kZVRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBieXRlcyA9IHRoaXMuYXNCeXRlcygpO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIEFycmF5LmZyb20oYnl0ZXMpKTtcbiAgICB9O1xuICAgIFBERk5hbWUucHJvdG90eXBlLmFzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVkTmFtZTtcbiAgICB9O1xuICAgIC8qKiBAZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBbW1BERk5hbWUuYXNTdHJpbmddXSAqL1xuICAgIFBERk5hbWUucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVkTmFtZTtcbiAgICB9O1xuICAgIFBERk5hbWUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFBERk5hbWUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVkTmFtZTtcbiAgICB9O1xuICAgIFBERk5hbWUucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVkTmFtZS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZOYW1lLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLmVuY29kZWROYW1lLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLmVuY29kZWROYW1lLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERk5hbWUub2YgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgZGVjb2RlZFZhbHVlID0gZGVjb2RlTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gcG9vbC5nZXQoZGVjb2RlZFZhbHVlKTtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgUERGTmFtZShFTkZPUkNFUiwgZGVjb2RlZFZhbHVlKTtcbiAgICAgICAgICAgIHBvb2wuc2V0KGRlY29kZWRWYWx1ZSwgaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICAgIC8qIHRzbGludDpkaXNhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuICAgIFBERk5hbWUuTGVuZ3RoID0gUERGTmFtZS5vZignTGVuZ3RoJyk7XG4gICAgUERGTmFtZS5GbGF0ZURlY29kZSA9IFBERk5hbWUub2YoJ0ZsYXRlRGVjb2RlJyk7XG4gICAgUERGTmFtZS5SZXNvdXJjZXMgPSBQREZOYW1lLm9mKCdSZXNvdXJjZXMnKTtcbiAgICBQREZOYW1lLkZvbnQgPSBQREZOYW1lLm9mKCdGb250Jyk7XG4gICAgUERGTmFtZS5YT2JqZWN0ID0gUERGTmFtZS5vZignWE9iamVjdCcpO1xuICAgIFBERk5hbWUuRXh0R1N0YXRlID0gUERGTmFtZS5vZignRXh0R1N0YXRlJyk7XG4gICAgUERGTmFtZS5Db250ZW50cyA9IFBERk5hbWUub2YoJ0NvbnRlbnRzJyk7XG4gICAgUERGTmFtZS5UeXBlID0gUERGTmFtZS5vZignVHlwZScpO1xuICAgIFBERk5hbWUuUGFyZW50ID0gUERGTmFtZS5vZignUGFyZW50Jyk7XG4gICAgUERGTmFtZS5NZWRpYUJveCA9IFBERk5hbWUub2YoJ01lZGlhQm94Jyk7XG4gICAgUERGTmFtZS5QYWdlID0gUERGTmFtZS5vZignUGFnZScpO1xuICAgIFBERk5hbWUuQW5ub3RzID0gUERGTmFtZS5vZignQW5ub3RzJyk7XG4gICAgUERGTmFtZS5UcmltQm94ID0gUERGTmFtZS5vZignVHJpbUJveCcpO1xuICAgIFBERk5hbWUuQXJ0Qm94ID0gUERGTmFtZS5vZignQXJ0Qm94Jyk7XG4gICAgUERGTmFtZS5CbGVlZEJveCA9IFBERk5hbWUub2YoJ0JsZWVkQm94Jyk7XG4gICAgUERGTmFtZS5Dcm9wQm94ID0gUERGTmFtZS5vZignQ3JvcEJveCcpO1xuICAgIFBERk5hbWUuUm90YXRlID0gUERGTmFtZS5vZignUm90YXRlJyk7XG4gICAgUERGTmFtZS5UaXRsZSA9IFBERk5hbWUub2YoJ1RpdGxlJyk7XG4gICAgUERGTmFtZS5BdXRob3IgPSBQREZOYW1lLm9mKCdBdXRob3InKTtcbiAgICBQREZOYW1lLlN1YmplY3QgPSBQREZOYW1lLm9mKCdTdWJqZWN0Jyk7XG4gICAgUERGTmFtZS5DcmVhdG9yID0gUERGTmFtZS5vZignQ3JlYXRvcicpO1xuICAgIFBERk5hbWUuS2V5d29yZHMgPSBQREZOYW1lLm9mKCdLZXl3b3JkcycpO1xuICAgIFBERk5hbWUuUHJvZHVjZXIgPSBQREZOYW1lLm9mKCdQcm9kdWNlcicpO1xuICAgIFBERk5hbWUuQ3JlYXRpb25EYXRlID0gUERGTmFtZS5vZignQ3JlYXRpb25EYXRlJyk7XG4gICAgUERGTmFtZS5Nb2REYXRlID0gUERGTmFtZS5vZignTW9kRGF0ZScpO1xuICAgIHJldHVybiBQREZOYW1lO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk5hbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZOYW1lLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbnZhciBQREZOdWxsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZOdWxsLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk51bGwoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGTnVsbC5wcm90b3R5cGUuYXNOdWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFBERk51bGwucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFBERk51bGwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgIH07XG4gICAgUERGTnVsbC5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiA0O1xuICAgIH07XG4gICAgUERGTnVsbC5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm47XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMudTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5sO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmw7XG4gICAgICAgIHJldHVybiA0O1xuICAgIH07XG4gICAgcmV0dXJuIFBERk51bGw7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgbmV3IFBERk51bGwoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk51bGwuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciwgbnVtYmVyVG9TdHJpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvaW5kZXhcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG52YXIgUERGTnVtYmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZOdW1iZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGTnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm51bWJlclZhbHVlID0gdmFsdWU7XG4gICAgICAgIF90aGlzLnN0cmluZ1ZhbHVlID0gbnVtYmVyVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERk51bWJlci5wcm90b3R5cGUuYXNOdW1iZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlclZhbHVlO1xuICAgIH07XG4gICAgLyoqIEBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFtbUERGTnVtYmVyLmFzTnVtYmVyXV0gKi9cbiAgICBQREZOdW1iZXIucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5udW1iZXJWYWx1ZTtcbiAgICB9O1xuICAgIFBERk51bWJlci5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQREZOdW1iZXIub2YodGhpcy5udW1iZXJWYWx1ZSk7XG4gICAgfTtcbiAgICBQREZOdW1iZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdWYWx1ZTtcbiAgICB9O1xuICAgIFBERk51bWJlci5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ1ZhbHVlLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERk51bWJlci5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5zdHJpbmdWYWx1ZSwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdWYWx1ZS5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZOdW1iZXIub2YgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIG5ldyBQREZOdW1iZXIodmFsdWUpOyB9O1xuICAgIHJldHVybiBQREZOdW1iZXI7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGTnVtYmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGTnVtYmVyLmpzLm1hcCIsImltcG9ydCB7IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGT2JqZWN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERk9iamVjdCgpIHtcbiAgICB9XG4gICAgUERGT2JqZWN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChfY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdjbG9uZScpO1xuICAgIH07XG4gICAgUERGT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAndG9TdHJpbmcnKTtcbiAgICB9O1xuICAgIFBERk9iamVjdC5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ3NpemVJbkJ5dGVzJyk7XG4gICAgfTtcbiAgICBQREZPYmplY3QucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoX2J1ZmZlciwgX29mZnNldCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdjb3B5Qnl0ZXNJbnRvJyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGT2JqZWN0O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9iamVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9iamVjdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4vUERGU3RyZWFtXCI7XG5pbXBvcnQgeyBhcnJheUFzU3RyaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGUmF3U3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZSYXdTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUmF3U3RyZWFtKGRpY3QsIGNvbnRlbnRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRpY3QpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNvbnRlbnRzID0gY29udGVudHM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGUmF3U3RyZWFtLnByb3RvdHlwZS5hc1VpbnQ4QXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzLnNsaWNlKCk7XG4gICAgfTtcbiAgICBQREZSYXdTdHJlYW0ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIFBERlJhd1N0cmVhbS5vZih0aGlzLmRpY3QuY2xvbmUoY29udGV4dCksIHRoaXMuY29udGVudHMuc2xpY2UoKSk7XG4gICAgfTtcbiAgICBQREZSYXdTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJyYXlBc1N0cmluZyh0aGlzLmNvbnRlbnRzKTtcbiAgICB9O1xuICAgIFBERlJhd1N0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzO1xuICAgIH07XG4gICAgUERGUmF3U3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERlJhd1N0cmVhbS5vZiA9IGZ1bmN0aW9uIChkaWN0LCBjb250ZW50cykge1xuICAgICAgICByZXR1cm4gbmV3IFBERlJhd1N0cmVhbShkaWN0LCBjb250ZW50cyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGUmF3U3RyZWFtO1xufShQREZTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IFBERlJhd1N0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlJhd1N0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgRU5GT1JDRVIgPSB7fTtcbnZhciBwb29sID0gbmV3IE1hcCgpO1xudmFyIFBERlJlZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUmVmLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlJlZihlbmZvcmNlciwgb2JqZWN0TnVtYmVyLCBnZW5lcmF0aW9uTnVtYmVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbmZvcmNlciAhPT0gRU5GT1JDRVIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IoJ1BERlJlZicpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9iamVjdE51bWJlciA9IG9iamVjdE51bWJlcjtcbiAgICAgICAgX3RoaXMuZ2VuZXJhdGlvbk51bWJlciA9IGdlbmVyYXRpb25OdW1iZXI7XG4gICAgICAgIF90aGlzLnRhZyA9IG9iamVjdE51bWJlciArIFwiIFwiICsgZ2VuZXJhdGlvbk51bWJlciArIFwiIFJcIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZSZWYucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFBERlJlZi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZztcbiAgICB9O1xuICAgIFBERlJlZi5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZy5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZSZWYucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMudGFnLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZy5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZSZWYub2YgPSBmdW5jdGlvbiAob2JqZWN0TnVtYmVyLCBnZW5lcmF0aW9uTnVtYmVyKSB7XG4gICAgICAgIGlmIChnZW5lcmF0aW9uTnVtYmVyID09PSB2b2lkIDApIHsgZ2VuZXJhdGlvbk51bWJlciA9IDA7IH1cbiAgICAgICAgdmFyIHRhZyA9IG9iamVjdE51bWJlciArIFwiIFwiICsgZ2VuZXJhdGlvbk51bWJlciArIFwiIFJcIjtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gcG9vbC5nZXQodGFnKTtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgUERGUmVmKEVORk9SQ0VSLCBvYmplY3ROdW1iZXIsIGdlbmVyYXRpb25OdW1iZXIpO1xuICAgICAgICAgICAgcG9vbC5zZXQodGFnLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlJlZjtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZSZWY7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZSZWYuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4vUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG52YXIgUERGU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGU3RyZWFtKGRpY3QpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZGljdCA9IGRpY3Q7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChfY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdjbG9uZScpO1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnZ2V0Q29udGVudHNTdHJpbmcnKTtcbiAgICB9O1xuICAgIFBERlN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2dldENvbnRlbnRzJyk7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnZ2V0Q29udGVudHNTaXplJyk7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLnVwZGF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb250ZW50c1NpemUgPSB0aGlzLmdldENvbnRlbnRzU2l6ZSgpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUuTGVuZ3RoLCBQREZOdW1iZXIub2YoY29udGVudHNTaXplKSk7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZURpY3QoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5zaXplSW5CeXRlcygpICsgdGhpcy5nZXRDb250ZW50c1NpemUoKSArIDE4O1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEaWN0KCk7XG4gICAgICAgIHZhciBzdHJlYW1TdHJpbmcgPSB0aGlzLmRpY3QudG9TdHJpbmcoKTtcbiAgICAgICAgc3RyZWFtU3RyaW5nICs9ICdcXG5zdHJlYW1cXG4nO1xuICAgICAgICBzdHJlYW1TdHJpbmcgKz0gdGhpcy5nZXRDb250ZW50c1N0cmluZygpO1xuICAgICAgICBzdHJlYW1TdHJpbmcgKz0gJ1xcbmVuZHN0cmVhbSc7XG4gICAgICAgIHJldHVybiBzdHJlYW1TdHJpbmc7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEaWN0KCk7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBvZmZzZXQgKz0gdGhpcy5kaWN0LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucztcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5hO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm07XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgdmFyIGNvbnRlbnRzID0gdGhpcy5nZXRDb250ZW50cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBjb250ZW50cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBjb250ZW50c1tpZHhdO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm47XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5zO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmE7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICByZXR1cm4gUERGU3RyZWFtO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciwgcGFkU3RhcnQsIHV0ZjE2RGVjb2RlLCBwZGZEb2NFbmNvZGluZ0RlY29kZSwgdG9DaGFyQ29kZSwgcGFyc2VEYXRlLCBoYXNVdGYxNkJPTSwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGU3RyaW5nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZTdHJpbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5hc0J5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZXMgPSBbXTtcbiAgICAgICAgdmFyIG9jdGFsID0gJyc7XG4gICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgIHZhciBwdXNoQnl0ZSA9IGZ1bmN0aW9uIChieXRlKSB7XG4gICAgICAgICAgICBpZiAoYnl0ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGJ5dGVzLnB1c2goYnl0ZSk7XG4gICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMudmFsdWUubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgY2hhciA9IHRoaXMudmFsdWVbaWR4XTtcbiAgICAgICAgICAgIHZhciBieXRlID0gdG9DaGFyQ29kZShjaGFyKTtcbiAgICAgICAgICAgIHZhciBuZXh0Q2hhciA9IHRoaXMudmFsdWVbaWR4ICsgMV07XG4gICAgICAgICAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkJhY2tTbGFzaClcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShieXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTmV3bGluZSlcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMuQ2FycmlhZ2VSZXR1cm4pXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLm4pXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5OZXdsaW5lKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMucilcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLkNhcnJpYWdlUmV0dXJuKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMudClcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLlRhYik7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLmIpXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5CYWNrc3BhY2UpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5mKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuRm9ybUZlZWQpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5MZWZ0UGFyZW4pXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5MZWZ0UGFyZW4pO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5SaWdodFBhcmVuKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuUmlnaHRQYXJlbik7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkJhY2tzcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLkJhY2tTbGFzaCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA+PSBDaGFyQ29kZXMuWmVybyAmJiBieXRlIDw9IENoYXJDb2Rlcy5TZXZlbikge1xuICAgICAgICAgICAgICAgICAgICBvY3RhbCArPSBjaGFyO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2N0YWwubGVuZ3RoID09PSAzIHx8ICEobmV4dENoYXIgPj0gJzAnICYmIG5leHRDaGFyIDw9ICc3JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKHBhcnNlSW50KG9jdGFsLCA4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvY3RhbCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShieXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUuZGVjb2RlVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5hc0J5dGVzKCk7XG4gICAgICAgIGlmIChoYXNVdGYxNkJPTShieXRlcykpXG4gICAgICAgICAgICByZXR1cm4gdXRmMTZEZWNvZGUoYnl0ZXMpO1xuICAgICAgICByZXR1cm4gcGRmRG9jRW5jb2RpbmdEZWNvZGUoYnl0ZXMpO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5kZWNvZGVEYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGV4dCA9IHRoaXMuZGVjb2RlVGV4dCgpO1xuICAgICAgICB2YXIgZGF0ZSA9IHBhcnNlRGF0ZSh0ZXh0KTtcbiAgICAgICAgaWYgKCFkYXRlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IodGV4dCk7XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5hc1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBQREZTdHJpbmcucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUERGU3RyaW5nLm9mKHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiKFwiICsgdGhpcy52YWx1ZSArIFwiKVwiO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUubGVuZ3RoICsgMjtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkxlZnRQYXJlbjtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMudmFsdWUsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5SaWdodFBhcmVuO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGggKyAyO1xuICAgIH07XG4gICAgLy8gVGhlIFBERiBzcGVjIGFsbG93cyBuZXdsaW5lcyBhbmQgcGFyZW5zIHRvIGFwcGVhciBkaXJlY3RseSB3aXRoaW4gYSBsaXRlcmFsXG4gICAgLy8gc3RyaW5nLiBUaGVzZSBjaGFyYWN0ZXIgX21heV8gYmUgZXNjYXBlZC4gQnV0IHRoZXkgZG8gbm90IF9oYXZlXyB0byBiZS4gU29cbiAgICAvLyBmb3Igc2ltcGxpY2l0eSwgd2Ugd2lsbCBub3QgYm90aGVyIGVzY2FwaW5nIHRoZW0uXG4gICAgUERGU3RyaW5nLm9mID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBuZXcgUERGU3RyaW5nKHZhbHVlKTsgfTtcbiAgICBQREZTdHJpbmcuZnJvbURhdGUgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICB2YXIgeWVhciA9IHBhZFN0YXJ0KFN0cmluZyhkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpLCA0LCAnMCcpO1xuICAgICAgICB2YXIgbW9udGggPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENNb250aCgpICsgMSksIDIsICcwJyk7XG4gICAgICAgIHZhciBkYXkgPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENEYXRlKCkpLCAyLCAnMCcpO1xuICAgICAgICB2YXIgaG91cnMgPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENIb3VycygpKSwgMiwgJzAnKTtcbiAgICAgICAgdmFyIG1pbnMgPSBwYWRTdGFydChTdHJpbmcoZGF0ZS5nZXRVVENNaW51dGVzKCkpLCAyLCAnMCcpO1xuICAgICAgICB2YXIgc2VjcyA9IHBhZFN0YXJ0KFN0cmluZyhkYXRlLmdldFVUQ1NlY29uZHMoKSksIDIsICcwJyk7XG4gICAgICAgIHJldHVybiBuZXcgUERGU3RyaW5nKFwiRDpcIiArIHllYXIgKyBtb250aCArIGRheSArIGhvdXJzICsgbWlucyArIHNlY3MgKyBcIlpcIik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGU3RyaW5nO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlN0cmluZztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlN0cmluZy5qcy5tYXAiLCJpbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuLi9vYmplY3RzL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZPcGVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZPcGVyYXRvcihuYW1lLCBhcmdzKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3MgfHwgW107XG4gICAgfVxuICAgIFBERk9wZXJhdG9yLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KHRoaXMuYXJncy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGFyZyA9IHRoaXMuYXJnc1tpZHhdO1xuICAgICAgICAgICAgYXJnc1tpZHhdID0gYXJnIGluc3RhbmNlb2YgUERGT2JqZWN0ID8gYXJnLmNsb25lKGNvbnRleHQpIDogYXJnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQREZPcGVyYXRvci5vZih0aGlzLm5hbWUsIGFyZ3MpO1xuICAgIH07XG4gICAgUERGT3BlcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5hcmdzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFsdWUgKz0gU3RyaW5nKHRoaXMuYXJnc1tpZHhdKSArICcgJztcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSArPSB0aGlzLm5hbWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERk9wZXJhdG9yLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNpemUgPSAwO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLmFyZ3MubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgYXJnID0gdGhpcy5hcmdzW2lkeF07XG4gICAgICAgICAgICBzaXplICs9IChhcmcgaW5zdGFuY2VvZiBQREZPYmplY3QgPyBhcmcuc2l6ZUluQnl0ZXMoKSA6IGFyZy5sZW5ndGgpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBzaXplICs9IHRoaXMubmFtZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH07XG4gICAgUERGT3BlcmF0b3IucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuYXJncy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBhcmcgPSB0aGlzLmFyZ3NbaWR4XTtcbiAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBQREZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYXJnLmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKGFyZywgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgfVxuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5uYW1lLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGT3BlcmF0b3Iub2YgPSBmdW5jdGlvbiAobmFtZSwgYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFBERk9wZXJhdG9yKG5hbWUsIGFyZ3MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9wZXJhdG9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT3BlcmF0b3IuanMubWFwIiwidmFyIFBERk9wZXJhdG9yTmFtZXM7XG4oZnVuY3Rpb24gKFBERk9wZXJhdG9yTmFtZXMpIHtcbiAgICAvLyBOb24gU3Ryb2tpbmcgQ29sb3IgT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JcIl0gPSBcInNjXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5vblN0cm9raW5nQ29sb3JOXCJdID0gXCJzY25cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTm9uU3Ryb2tpbmdDb2xvclJnYlwiXSA9IFwicmdcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTm9uU3Ryb2tpbmdDb2xvckdyYXlcIl0gPSBcImdcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTm9uU3Ryb2tpbmdDb2xvckNteWtcIl0gPSBcImtcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTm9uU3Ryb2tpbmdDb2xvcnNwYWNlXCJdID0gXCJjc1wiO1xuICAgIC8vIFN0cm9raW5nIENvbG9yIE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yXCJdID0gXCJTQ1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTdHJva2luZ0NvbG9yTlwiXSA9IFwiU0NOXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9raW5nQ29sb3JSZ2JcIl0gPSBcIlJHXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9raW5nQ29sb3JHcmF5XCJdID0gXCJHXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9raW5nQ29sb3JDbXlrXCJdID0gXCJLXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9raW5nQ29sb3JzcGFjZVwiXSA9IFwiQ1NcIjtcbiAgICAvLyBNYXJrZWQgQ29udGVudCBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQmVnaW5NYXJrZWRDb250ZW50U2VxdWVuY2VcIl0gPSBcIkJEQ1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJCZWdpbk1hcmtlZENvbnRlbnRcIl0gPSBcIkJNQ1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJFbmRNYXJrZWRDb250ZW50XCJdID0gXCJFTUNcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTWFya2VkQ29udGVudFBvaW50V2l0aFByb3BzXCJdID0gXCJEUFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJNYXJrZWRDb250ZW50UG9pbnRcIl0gPSBcIk1QXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkRyYXdPYmplY3RcIl0gPSBcIkRvXCI7XG4gICAgLy8gR3JhcGhpY3MgU3RhdGUgT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4XCJdID0gXCJjbVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJQb3BHcmFwaGljc1N0YXRlXCJdID0gXCJRXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlB1c2hHcmFwaGljc1N0YXRlXCJdID0gXCJxXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldEZsYXRuZXNzXCJdID0gXCJpXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldEdyYXBoaWNzU3RhdGVQYXJhbXNcIl0gPSBcImdzXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldExpbmVDYXBTdHlsZVwiXSA9IFwiSlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRMaW5lRGFzaFBhdHRlcm5cIl0gPSBcImRcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0TGluZUpvaW5TdHlsZVwiXSA9IFwialwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRMaW5lTWl0ZXJMaW1pdFwiXSA9IFwiTVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRMaW5lV2lkdGhcIl0gPSBcIndcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0VGV4dE1hdHJpeFwiXSA9IFwiVG1cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0UmVuZGVyaW5nSW50ZW50XCJdID0gXCJyaVwiO1xuICAgIC8vIEdyYXBoaWNzIE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJBcHBlbmRSZWN0YW5nbGVcIl0gPSBcInJlXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkJlZ2luSW5saW5lSW1hZ2VcIl0gPSBcIkJJXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkJlZ2luSW5saW5lSW1hZ2VEYXRhXCJdID0gXCJJRFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJFbmRJbmxpbmVJbWFnZVwiXSA9IFwiRUlcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQ2xpcEV2ZW5PZGRcIl0gPSBcIlcqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsaXBOb25aZXJvXCJdID0gXCJXXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsb3NlQW5kU3Ryb2tlXCJdID0gXCJzXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsb3NlRmlsbEV2ZW5PZGRBbmRTdHJva2VcIl0gPSBcImIqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkNsb3NlRmlsbE5vblplcm9BbmRTdHJva2VcIl0gPSBcImJcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQ2xvc2VQYXRoXCJdID0gXCJoXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkFwcGVuZEJlemllckN1cnZlXCJdID0gXCJjXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkN1cnZlVG9SZXBsaWNhdGVGaW5hbFBvaW50XCJdID0gXCJ5XCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkN1cnZlVG9SZXBsaWNhdGVJbml0aWFsUG9pbnRcIl0gPSBcInZcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRW5kUGF0aFwiXSA9IFwiblwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJGaWxsRXZlbk9kZEFuZFN0cm9rZVwiXSA9IFwiQipcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRmlsbEV2ZW5PZGRcIl0gPSBcImYqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkZpbGxOb25aZXJvQW5kU3Ryb2tlXCJdID0gXCJCXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkZpbGxOb25aZXJvXCJdID0gXCJmXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkxlZ2FjeUZpbGxOb25aZXJvXCJdID0gXCJGXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkxpbmVUb1wiXSA9IFwibFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJNb3ZlVG9cIl0gPSBcIm1cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2hhZGluZ0ZpbGxcIl0gPSBcInNoXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9rZVBhdGhcIl0gPSBcIlNcIjtcbiAgICAvLyBUZXh0IE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJCZWdpblRleHRcIl0gPSBcIkJUXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkVuZFRleHRcIl0gPSBcIkVUXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk1vdmVUZXh0XCJdID0gXCJUZFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJNb3ZlVGV4dFNldExlYWRpbmdcIl0gPSBcIlREXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk5leHRMaW5lXCJdID0gXCJUKlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRDaGFyYWN0ZXJTcGFjaW5nXCJdID0gXCJUY1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRGb250QW5kU2l6ZVwiXSA9IFwiVGZcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0VGV4dEhvcml6b250YWxTY2FsaW5nXCJdID0gXCJUelwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRUZXh0TGluZUhlaWdodFwiXSA9IFwiVExcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0VGV4dFJlbmRlcmluZ01vZGVcIl0gPSBcIlRyXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFRleHRSaXNlXCJdID0gXCJUc1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRXb3JkU3BhY2luZ1wiXSA9IFwiVHdcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2hvd1RleHRcIl0gPSBcIlRqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNob3dUZXh0QWRqdXN0ZWRcIl0gPSBcIlRKXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNob3dUZXh0TGluZVwiXSA9IFwiJ1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTaG93VGV4dExpbmVBbmRTcGFjZVwiXSA9IFwiXFxcIlwiO1xuICAgIC8vIFR5cGUzIEZvbnQgT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlR5cGUzRDBcIl0gPSBcImQwXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlR5cGUzRDFcIl0gPSBcImQxXCI7XG4gICAgLy8gQ29tcGF0aWJpbGl0eSBTZWN0aW9uIE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJCZWdpbkNvbXBhdGliaWxpdHlTZWN0aW9uXCJdID0gXCJCWFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJFbmRDb21wYXRpYmlsaXR5U2VjdGlvblwiXSA9IFwiRVhcIjtcbn0pKFBERk9wZXJhdG9yTmFtZXMgfHwgKFBERk9wZXJhdG9yTmFtZXMgPSB7fSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGT3BlcmF0b3JOYW1lcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9wZXJhdG9yTmFtZXMuanMubWFwIiwiaW1wb3J0IHsgTnVtYmVyUGFyc2luZ0Vycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgSXNEaWdpdCwgSXNOdW1lcmljIH0gZnJvbSBcIi4uL3N5bnRheC9OdW1lcmljXCI7XG5pbXBvcnQgeyBJc1doaXRlc3BhY2UgfSBmcm9tIFwiLi4vc3ludGF4L1doaXRlc3BhY2VcIjtcbmltcG9ydCB7IGNoYXJGcm9tQ29kZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIE5ld2xpbmUgPSBDaGFyQ29kZXMuTmV3bGluZSwgQ2FycmlhZ2VSZXR1cm4gPSBDaGFyQ29kZXMuQ2FycmlhZ2VSZXR1cm47XG4vLyBUT0RPOiBUaHJvdyBlcnJvciBpZiBlb2YgaXMgcmVhY2hlZCBiZWZvcmUgZmluaXNoaW5nIG9iamVjdCBwYXJzZS4uLlxudmFyIEJhc2VQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmFzZVBhcnNlcihieXRlcywgY2FwTnVtYmVycykge1xuICAgICAgICBpZiAoY2FwTnVtYmVycyA9PT0gdm9pZCAwKSB7IGNhcE51bWJlcnMgPSBmYWxzZTsgfVxuICAgICAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7XG4gICAgICAgIHRoaXMuY2FwTnVtYmVycyA9IGNhcE51bWJlcnM7XG4gICAgfVxuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLnBhcnNlUmF3SW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIGlmICghSXNEaWdpdFtieXRlXSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHZhbHVlICs9IGNoYXJGcm9tQ29kZSh0aGlzLmJ5dGVzLm5leHQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG51bWJlclZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCAhaXNGaW5pdGUobnVtYmVyVmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyUGFyc2luZ0Vycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1iZXJWYWx1ZTtcbiAgICB9O1xuICAgIC8vIFRPRE86IE1heWJlIGhhbmRsZSBleHBvbmVudGlhbCBmb3JtYXQ/XG4gICAgLy8gVE9ETzogQ29tcGFyZSBwZXJmb3JtYW5jZSBvZiBzdHJpbmcgY29uY2F0ZW5hdGlvbiB0byBjaGFyRnJvbUNvZGUoLi4uYnl0ZXMpXG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUucGFyc2VSYXdOdW1iZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICAvLyBQYXJzZSBpbnRlZ2VyLXBhcnQsIHRoZSBsZWFkaW5nICgrIHwgLSB8IC4gfCAwLTkpXG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoIUlzTnVtZXJpY1tieXRlXSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHZhbHVlICs9IGNoYXJGcm9tQ29kZSh0aGlzLmJ5dGVzLm5leHQoKSk7XG4gICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLlBlcmlvZClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXJzZSBkZWNpbWFsLXBhcnQsIHRoZSB0cmFpbGluZyAoMC05KVxuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKCFJc0RpZ2l0W2J5dGVdKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdmFsdWUgKz0gY2hhckZyb21Db2RlKHRoaXMuYnl0ZXMubmV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbnVtYmVyVmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICBpZiAoIXZhbHVlIHx8ICFpc0Zpbml0ZShudW1iZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJQYXJzaW5nRXJyb3IodGhpcy5ieXRlcy5wb3NpdGlvbigpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bWJlclZhbHVlID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhcE51bWJlcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0gXCJQYXJzZWQgbnVtYmVyIHRoYXQgaXMgdG9vIGxhcmdlIGZvciBzb21lIFBERiByZWFkZXJzOiBcIiArIHZhbHVlICsgXCIsIHVzaW5nIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIGluc3RlYWQuXCI7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG1zZyA9IFwiUGFyc2VkIG51bWJlciB0aGF0IGlzIHRvbyBsYXJnZSBmb3Igc29tZSBQREYgcmVhZGVyczogXCIgKyB2YWx1ZSArIFwiLCBub3QgY2FwcGluZy5cIjtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVtYmVyVmFsdWU7XG4gICAgfTtcbiAgICBCYXNlUGFyc2VyLnByb3RvdHlwZS5za2lwV2hpdGVzcGFjZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSAmJiBJc1doaXRlc3BhY2VbdGhpcy5ieXRlcy5wZWVrKCldKSB7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUuc2tpcExpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoYnl0ZSA9PT0gTmV3bGluZSB8fCBieXRlID09PSBDYXJyaWFnZVJldHVybilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUuc2tpcENvbW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmJ5dGVzLnBlZWsoKSAhPT0gQ2hhckNvZGVzLlBlcmNlbnQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoYnl0ZSA9PT0gTmV3bGluZSB8fCBieXRlID09PSBDYXJyaWFnZVJldHVybilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZSgpO1xuICAgICAgICB3aGlsZSAodGhpcy5za2lwQ29tbWVudCgpKVxuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZSgpO1xuICAgIH07XG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUubWF0Y2hLZXl3b3JkID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBrZXl3b3JkLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYnl0ZXMuZG9uZSgpIHx8IHRoaXMuYnl0ZXMubmV4dCgpICE9PSBrZXl3b3JkW2lkeF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhpbml0aWFsT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZVBhcnNlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBCYXNlUGFyc2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmFzZVBhcnNlci5qcy5tYXAiLCJpbXBvcnQgeyBOZXh0Qnl0ZUFzc2VydGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgZGVjb2RlUERGUmF3U3RyZWFtIH0gZnJvbSBcIi4uL3N0cmVhbXMvZGVjb2RlXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG4vLyBUT0RPOiBTZWUgaG93IGxpbmUvY29sIHRyYWNraW5nIGFmZmVjdHMgcGVyZm9ybWFuY2VcbnZhciBCeXRlU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJ5dGVTdHJlYW0oYnl0ZXMpIHtcbiAgICAgICAgdGhpcy5pZHggPSAwO1xuICAgICAgICB0aGlzLmxpbmUgPSAwO1xuICAgICAgICB0aGlzLmNvbHVtbiA9IDA7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBieXRlcztcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLmJ5dGVzLmxlbmd0aDtcbiAgICB9XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUubW92ZVRvID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgICB0aGlzLmlkeCA9IG9mZnNldDtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlc1t0aGlzLmlkeCsrXTtcbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5OZXdsaW5lKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmUgKz0gMTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1uICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ5dGU7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5hc3NlcnROZXh0ID0gZnVuY3Rpb24gKGV4cGVjdGVkKSB7XG4gICAgICAgIGlmICh0aGlzLnBlZWsoKSAhPT0gZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOZXh0Qnl0ZUFzc2VydGlvbkVycm9yKHRoaXMucG9zaXRpb24oKSwgZXhwZWN0ZWQsIHRoaXMucGVlaygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KCk7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ieXRlc1t0aGlzLmlkeF07XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5wZWVrQWhlYWQgPSBmdW5jdGlvbiAoc3RlcHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5pZHggKyBzdGVwc107XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5wZWVrQXQgPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzW29mZnNldF07XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5kb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZHggPj0gdGhpcy5sZW5ndGg7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkeDtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXMuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5wb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHsgbGluZTogdGhpcy5saW5lLCBjb2x1bW46IHRoaXMuY29sdW1uLCBvZmZzZXQ6IHRoaXMuaWR4IH07XG4gICAgfTtcbiAgICBCeXRlU3RyZWFtLm9mID0gZnVuY3Rpb24gKGJ5dGVzKSB7IHJldHVybiBuZXcgQnl0ZVN0cmVhbShieXRlcyk7IH07XG4gICAgQnl0ZVN0cmVhbS5mcm9tUERGUmF3U3RyZWFtID0gZnVuY3Rpb24gKHJhd1N0cmVhbSkge1xuICAgICAgICByZXR1cm4gQnl0ZVN0cmVhbS5vZihkZWNvZGVQREZSYXdTdHJlYW0ocmF3U3RyZWFtKS5kZWNvZGUoKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQnl0ZVN0cmVhbTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBCeXRlU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Qnl0ZVN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFBERk9iamVjdFBhcnNpbmdFcnJvciwgUERGU3RyZWFtUGFyc2luZ0Vycm9yLCBVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvciwgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZCb29sIGZyb20gXCIuLi9vYmplY3RzL1BERkJvb2xcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVsbCBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdWxsXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlJhd1N0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZSYXdTdHJlYW1cIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IEJhc2VQYXJzZXIgZnJvbSBcIi4vQmFzZVBhcnNlclwiO1xuaW1wb3J0IEJ5dGVTdHJlYW0gZnJvbSBcIi4vQnl0ZVN0cmVhbVwiO1xuaW1wb3J0IFBERkNhdGFsb2cgZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGQ2F0YWxvZ1wiO1xuaW1wb3J0IFBERlBhZ2VMZWFmIGZyb20gXCIuLi9zdHJ1Y3R1cmVzL1BERlBhZ2VMZWFmXCI7XG5pbXBvcnQgUERGUGFnZVRyZWUgZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGUGFnZVRyZWVcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IElzRGVsaW1pdGVyIH0gZnJvbSBcIi4uL3N5bnRheC9EZWxpbWl0ZXJzXCI7XG5pbXBvcnQgeyBLZXl3b3JkcyB9IGZyb20gXCIuLi9zeW50YXgvS2V5d29yZHNcIjtcbmltcG9ydCB7IElzRGlnaXQsIElzTnVtZXJpYyB9IGZyb20gXCIuLi9zeW50YXgvTnVtZXJpY1wiO1xuaW1wb3J0IHsgSXNXaGl0ZXNwYWNlIH0gZnJvbSBcIi4uL3N5bnRheC9XaGl0ZXNwYWNlXCI7XG5pbXBvcnQgeyBjaGFyRnJvbUNvZGUgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8vIFRPRE86IFRocm93IGVycm9yIGlmIGVvZiBpcyByZWFjaGVkIGJlZm9yZSBmaW5pc2hpbmcgb2JqZWN0IHBhcnNlLi4uXG52YXIgUERGT2JqZWN0UGFyc2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZPYmplY3RQYXJzZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGT2JqZWN0UGFyc2VyKGJ5dGVTdHJlYW0sIGNvbnRleHQsIGNhcE51bWJlcnMpIHtcbiAgICAgICAgaWYgKGNhcE51bWJlcnMgPT09IHZvaWQgMCkgeyBjYXBOdW1iZXJzID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYnl0ZVN0cmVhbSwgY2FwTnVtYmVycykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gVE9ETzogSXMgaXQgcG9zc2libGUgdG8gcmVkdWNlIGR1cGxpY2F0ZSBwYXJzaW5nIGZvciByZWYgbG9va2FoZWFkcz9cbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnRydWUpKVxuICAgICAgICAgICAgcmV0dXJuIFBERkJvb2wuVHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmZhbHNlKSlcbiAgICAgICAgICAgIHJldHVybiBQREZCb29sLkZhbHNlO1xuICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMubnVsbCkpXG4gICAgICAgICAgICByZXR1cm4gUERGTnVsbDtcbiAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5MZXNzVGhhbiAmJlxuICAgICAgICAgICAgdGhpcy5ieXRlcy5wZWVrQWhlYWQoMSkgPT09IENoYXJDb2Rlcy5MZXNzVGhhbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEaWN0T3JTdHJlYW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkxlc3NUaGFuKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VIZXhTdHJpbmcoKTtcbiAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5MZWZ0UGFyZW4pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVN0cmluZygpO1xuICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkZvcndhcmRTbGFzaClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlTmFtZSgpO1xuICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkxlZnRTcXVhcmVCcmFja2V0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VBcnJheSgpO1xuICAgICAgICBpZiAoSXNOdW1lcmljW2J5dGVdKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VOdW1iZXJPclJlZigpO1xuICAgICAgICB0aHJvdyBuZXcgUERGT2JqZWN0UGFyc2luZ0Vycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSwgYnl0ZSk7XG4gICAgfTtcbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlTnVtYmVyT3JSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmaXJzdE51bSA9IHRoaXMucGFyc2VSYXdOdW1iZXIoKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBsb29rYWhlYWRTdGFydCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgIGlmIChJc0RpZ2l0W3RoaXMuYnl0ZXMucGVlaygpXSkge1xuICAgICAgICAgICAgdmFyIHNlY29uZE51bSA9IHRoaXMucGFyc2VSYXdOdW1iZXIoKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnl0ZXMucGVlaygpID09PSBDaGFyQ29kZXMuUikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuUik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBERlJlZi5vZihmaXJzdE51bSwgc2Vjb25kTnVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhsb29rYWhlYWRTdGFydCk7XG4gICAgICAgIHJldHVybiBQREZOdW1iZXIub2YoZmlyc3ROdW0pO1xuICAgIH07XG4gICAgLy8gVE9ETzogTWF5YmUgdXBkYXRlIFBERkhleFN0cmluZy5vZigpIGxvZ2ljIHRvIHJlbW92ZSB3aGl0ZXNwYWNlIGFuZCB2YWxpZGF0ZSBpbnB1dD9cbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlSGV4U3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5MZXNzVGhhbik7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkgJiYgdGhpcy5ieXRlcy5wZWVrKCkgIT09IENoYXJDb2Rlcy5HcmVhdGVyVGhhbikge1xuICAgICAgICAgICAgdmFsdWUgKz0gY2hhckZyb21Db2RlKHRoaXMuYnl0ZXMubmV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkdyZWF0ZXJUaGFuKTtcbiAgICAgICAgcmV0dXJuIFBERkhleFN0cmluZy5vZih2YWx1ZSk7XG4gICAgfTtcbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbmVzdGluZ0x2bCA9IDA7XG4gICAgICAgIHZhciBpc0VzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgICAgICB2YWx1ZSArPSBjaGFyRnJvbUNvZGUoYnl0ZSk7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgdW5lc2NhcGVkIHBhcmVudGhlc2lzXG4gICAgICAgICAgICBpZiAoIWlzRXNjYXBlZCkge1xuICAgICAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTGVmdFBhcmVuKVxuICAgICAgICAgICAgICAgICAgICBuZXN0aW5nTHZsICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5SaWdodFBhcmVuKVxuICAgICAgICAgICAgICAgICAgICBuZXN0aW5nTHZsIC09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcmFjayB3aGV0aGVyIGN1cnJlbnQgY2hhcmFjdGVyIGlzIGJlaW5nIGVzY2FwZWQgb3Igbm90XG4gICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkJhY2tTbGFzaCkge1xuICAgICAgICAgICAgICAgIGlzRXNjYXBlZCA9ICFpc0VzY2FwZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0VzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICBpc0VzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE9uY2UgKGlmKSB0aGUgdW5lc2NhcGVkIHBhcmVudGhlc2lzIGJhbGFuY2Ugb3V0LCByZXR1cm4gdGhlaXIgY29udGVudHNcbiAgICAgICAgICAgIGlmIChuZXN0aW5nTHZsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBvdXRlciBwYXJlbnMgc28gdGhleSBhcmVuJ3QgcGFydCBvZiB0aGUgY29udGVudHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUERGU3RyaW5nLm9mKHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSk7XG4gICAgfTtcbiAgICAvLyBUT0RPOiBDb21wYXJlIHBlcmZvcm1hbmNlIG9mIHN0cmluZyBjb25jYXRlbmF0aW9uIHRvIGNoYXJGcm9tQ29kZSguLi5ieXRlcylcbiAgICAvLyBUT0RPOiBNYXliZSBwcmVhbGxvY2F0ZSBzbWFsbCBVaW50OEFycmF5IGlmIGNhbiB1c2UgY2hhckZyb21Db2RlP1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VOYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkZvcndhcmRTbGFzaCk7XG4gICAgICAgIHZhciBuYW1lID0gJyc7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoSXNXaGl0ZXNwYWNlW2J5dGVdIHx8IElzRGVsaW1pdGVyW2J5dGVdKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbmFtZSArPSBjaGFyRnJvbUNvZGUoYnl0ZSk7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUERGTmFtZS5vZihuYW1lKTtcbiAgICB9O1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5MZWZ0U3F1YXJlQnJhY2tldCk7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgcGRmQXJyYXkgPSBQREZBcnJheS53aXRoQ29udGV4dCh0aGlzLmNvbnRleHQpO1xuICAgICAgICB3aGlsZSAodGhpcy5ieXRlcy5wZWVrKCkgIT09IENoYXJDb2Rlcy5SaWdodFNxdWFyZUJyYWNrZXQpIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5wYXJzZU9iamVjdCgpO1xuICAgICAgICAgICAgcGRmQXJyYXkucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuUmlnaHRTcXVhcmVCcmFja2V0KTtcbiAgICAgICAgcmV0dXJuIHBkZkFycmF5O1xuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuTGVzc1RoYW4pO1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkxlc3NUaGFuKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBkaWN0ID0gbmV3IE1hcCgpO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpICYmXG4gICAgICAgICAgICB0aGlzLmJ5dGVzLnBlZWsoKSAhPT0gQ2hhckNvZGVzLkdyZWF0ZXJUaGFuICYmXG4gICAgICAgICAgICB0aGlzLmJ5dGVzLnBlZWtBaGVhZCgxKSAhPT0gQ2hhckNvZGVzLkdyZWF0ZXJUaGFuKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5wYXJzZU5hbWUoKTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMucGFyc2VPYmplY3QoKTtcbiAgICAgICAgICAgIGRpY3Quc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuR3JlYXRlclRoYW4pO1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkdyZWF0ZXJUaGFuKTtcbiAgICAgICAgdmFyIFR5cGUgPSBkaWN0LmdldChQREZOYW1lLm9mKCdUeXBlJykpO1xuICAgICAgICBpZiAoVHlwZSA9PT0gUERGTmFtZS5vZignQ2F0YWxvZycpKSB7XG4gICAgICAgICAgICByZXR1cm4gUERGQ2F0YWxvZy5mcm9tTWFwV2l0aENvbnRleHQoZGljdCwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChUeXBlID09PSBQREZOYW1lLm9mKCdQYWdlcycpKSB7XG4gICAgICAgICAgICByZXR1cm4gUERGUGFnZVRyZWUuZnJvbU1hcFdpdGhDb250ZXh0KGRpY3QsIHRoaXMuY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoVHlwZSA9PT0gUERGTmFtZS5vZignUGFnZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gUERGUGFnZUxlYWYuZnJvbU1hcFdpdGhDb250ZXh0KGRpY3QsIHRoaXMuY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUERGRGljdC5mcm9tTWFwV2l0aENvbnRleHQoZGljdCwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZURpY3RPclN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5ieXRlcy5wb3NpdGlvbigpO1xuICAgICAgICB2YXIgZGljdCA9IHRoaXMucGFyc2VEaWN0KCk7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0cmVhbUVPRjEpICYmXG4gICAgICAgICAgICAhdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RyZWFtRU9GMikgJiZcbiAgICAgICAgICAgICF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdHJlYW1FT0YzKSAmJlxuICAgICAgICAgICAgIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0cmVhbUVPRjQpICYmXG4gICAgICAgICAgICAhdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RyZWFtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRpY3Q7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgdmFyIGVuZDtcbiAgICAgICAgdmFyIExlbmd0aCA9IGRpY3QuZ2V0KFBERk5hbWUub2YoJ0xlbmd0aCcpKTtcbiAgICAgICAgaWYgKExlbmd0aCBpbnN0YW5jZW9mIFBERk51bWJlcikge1xuICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBMZW5ndGguYXNOdW1iZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKGVuZCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZW5kc3RyZWFtKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmZpbmRFbmRPZlN0cmVhbUZhbGxiYWNrKHN0YXJ0UG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuZCA9IHRoaXMuZmluZEVuZE9mU3RyZWFtRmFsbGJhY2soc3RhcnRQb3MpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250ZW50cyA9IHRoaXMuYnl0ZXMuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgIHJldHVybiBQREZSYXdTdHJlYW0ub2YoZGljdCwgY29udGVudHMpO1xuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5maW5kRW5kT2ZTdHJlYW1GYWxsYmFjayA9IGZ1bmN0aW9uIChzdGFydFBvcykge1xuICAgICAgICAvLyBNb3ZlIHRvIGVuZCBvZiBzdHJlYW0sIHdoaWxlIGhhbmRsaW5nIG5lc3RlZCBzdHJlYW1zXG4gICAgICAgIHZhciBuZXN0aW5nTHZsID0gMTtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIGVuZCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RyZWFtKSkge1xuICAgICAgICAgICAgICAgIG5lc3RpbmdMdmwgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLkVPRjFlbmRzdHJlYW0pIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuRU9GMmVuZHN0cmVhbSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5FT0YzZW5kc3RyZWFtKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVuZHN0cmVhbSkpIHtcbiAgICAgICAgICAgICAgICBuZXN0aW5nTHZsIC09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXN0aW5nTHZsID09PSAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXN0aW5nTHZsICE9PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFBERlN0cmVhbVBhcnNpbmdFcnJvcihzdGFydFBvcyk7XG4gICAgICAgIHJldHVybiBlbmQ7XG4gICAgfTtcbiAgICBQREZPYmplY3RQYXJzZXIuZm9yQnl0ZXMgPSBmdW5jdGlvbiAoYnl0ZXMsIGNvbnRleHQsIGNhcE51bWJlcnMpIHsgcmV0dXJuIG5ldyBQREZPYmplY3RQYXJzZXIoQnl0ZVN0cmVhbS5vZihieXRlcyksIGNvbnRleHQsIGNhcE51bWJlcnMpOyB9O1xuICAgIFBERk9iamVjdFBhcnNlci5mb3JCeXRlU3RyZWFtID0gZnVuY3Rpb24gKGJ5dGVTdHJlYW0sIGNvbnRleHQsIGNhcE51bWJlcnMpIHtcbiAgICAgICAgaWYgKGNhcE51bWJlcnMgPT09IHZvaWQgMCkgeyBjYXBOdW1iZXJzID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZPYmplY3RQYXJzZXIoYnl0ZVN0cmVhbSwgY29udGV4dCwgY2FwTnVtYmVycyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGT2JqZWN0UGFyc2VyO1xufShCYXNlUGFyc2VyKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPYmplY3RQYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPYmplY3RQYXJzZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBSZXBhcnNlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBCeXRlU3RyZWFtIGZyb20gXCIuL0J5dGVTdHJlYW1cIjtcbmltcG9ydCBQREZPYmplY3RQYXJzZXIgZnJvbSBcIi4vUERGT2JqZWN0UGFyc2VyXCI7XG5pbXBvcnQgeyB3YWl0Rm9yVGljayB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERk9iamVjdFN0cmVhbVBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGT2JqZWN0U3RyZWFtUGFyc2VyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk9iamVjdFN0cmVhbVBhcnNlcihyYXdTdHJlYW0sIHNob3VsZFdhaXRGb3JUaWNrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIEJ5dGVTdHJlYW0uZnJvbVBERlJhd1N0cmVhbShyYXdTdHJlYW0pLCByYXdTdHJlYW0uZGljdC5jb250ZXh0KSB8fCB0aGlzO1xuICAgICAgICB2YXIgZGljdCA9IHJhd1N0cmVhbS5kaWN0O1xuICAgICAgICBfdGhpcy5hbHJlYWR5UGFyc2VkID0gZmFsc2U7XG4gICAgICAgIF90aGlzLnNob3VsZFdhaXRGb3JUaWNrID0gc2hvdWxkV2FpdEZvclRpY2sgfHwgKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9KTtcbiAgICAgICAgX3RoaXMuZmlyc3RPZmZzZXQgPSBkaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdGaXJzdCcpLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIF90aGlzLm9iamVjdENvdW50ID0gZGljdC5sb29rdXAoUERGTmFtZS5vZignTicpLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGT2JqZWN0U3RyZWFtUGFyc2VyLnByb3RvdHlwZS5wYXJzZUludG9Db250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0c0FuZE9iamVjdE51bWJlcnMsIGlkeCwgbGVuLCBfYSwgb2JqZWN0TnVtYmVyLCBvZmZzZXQsIG9iamVjdCwgcmVmO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWxyZWFkeVBhcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXBhcnNlRXJyb3IoJ1BERk9iamVjdFN0cmVhbVBhcnNlcicsICdwYXJzZUludG9Db250ZXh0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFscmVhZHlQYXJzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0c0FuZE9iamVjdE51bWJlcnMgPSB0aGlzLnBhcnNlT2Zmc2V0c0FuZE9iamVjdE51bWJlcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IG9mZnNldHNBbmRPYmplY3ROdW1iZXJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9mZnNldHNBbmRPYmplY3ROdW1iZXJzW2lkeF0sIG9iamVjdE51bWJlciA9IF9hLm9iamVjdE51bWJlciwgb2Zmc2V0ID0gX2Eub2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8odGhpcy5maXJzdE9mZnNldCArIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSBQREZSZWYub2Yob2JqZWN0TnVtYmVyLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hc3NpZ24ocmVmLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFdhaXRGb3JUaWNrKCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2FpdEZvclRpY2soKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtUGFyc2VyLnByb3RvdHlwZS5wYXJzZU9mZnNldHNBbmRPYmplY3ROdW1iZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb2Zmc2V0c0FuZE9iamVjdE51bWJlcnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vYmplY3RDb3VudDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICB2YXIgb2JqZWN0TnVtYmVyID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICAgICAgb2Zmc2V0c0FuZE9iamVjdE51bWJlcnMucHVzaCh7IG9iamVjdE51bWJlcjogb2JqZWN0TnVtYmVyLCBvZmZzZXQ6IG9mZnNldCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0c0FuZE9iamVjdE51bWJlcnM7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW1QYXJzZXIuZm9yU3RyZWFtID0gZnVuY3Rpb24gKHJhd1N0cmVhbSwgc2hvdWxkV2FpdEZvclRpY2spIHsgcmV0dXJuIG5ldyBQREZPYmplY3RTdHJlYW1QYXJzZXIocmF3U3RyZWFtLCBzaG91bGRXYWl0Rm9yVGljayk7IH07XG4gICAgcmV0dXJuIFBERk9iamVjdFN0cmVhbVBhcnNlcjtcbn0oUERGT2JqZWN0UGFyc2VyKSk7XG5leHBvcnQgZGVmYXVsdCBQREZPYmplY3RTdHJlYW1QYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPYmplY3RTdHJlYW1QYXJzZXIuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQ3Jvc3NSZWZTZWN0aW9uIGZyb20gXCIuLi9kb2N1bWVudC9QREZDcm9zc1JlZlNlY3Rpb25cIjtcbmltcG9ydCBQREZIZWFkZXIgZnJvbSBcIi4uL2RvY3VtZW50L1BERkhlYWRlclwiO1xuaW1wb3J0IFBERlRyYWlsZXIgZnJvbSBcIi4uL2RvY3VtZW50L1BERlRyYWlsZXJcIjtcbmltcG9ydCB7IE1pc3NpbmdLZXl3b3JkRXJyb3IsIE1pc3NpbmdQREZIZWFkZXJFcnJvciwgUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvciwgUmVwYXJzZUVycm9yLCBTdGFsbGVkUGFyc2VyRXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERkludmFsaWRPYmplY3QgZnJvbSBcIi4uL29iamVjdHMvUERGSW52YWxpZE9iamVjdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERlJhd1N0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZSYXdTdHJlYW1cIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgQnl0ZVN0cmVhbSBmcm9tIFwiLi9CeXRlU3RyZWFtXCI7XG5pbXBvcnQgUERGT2JqZWN0UGFyc2VyIGZyb20gXCIuL1BERk9iamVjdFBhcnNlclwiO1xuaW1wb3J0IFBERk9iamVjdFN0cmVhbVBhcnNlciBmcm9tIFwiLi9QREZPYmplY3RTdHJlYW1QYXJzZXJcIjtcbmltcG9ydCBQREZYUmVmU3RyZWFtUGFyc2VyIGZyb20gXCIuL1BERlhSZWZTdHJlYW1QYXJzZXJcIjtcbmltcG9ydCBQREZDb250ZXh0IGZyb20gXCIuLi9QREZDb250ZXh0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBLZXl3b3JkcyB9IGZyb20gXCIuLi9zeW50YXgvS2V5d29yZHNcIjtcbmltcG9ydCB7IElzRGlnaXQgfSBmcm9tIFwiLi4vc3ludGF4L051bWVyaWNcIjtcbmltcG9ydCB7IHdhaXRGb3JUaWNrIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGUGFyc2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZQYXJzZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUGFyc2VyKHBkZkJ5dGVzLCBvYmplY3RzUGVyVGljaywgdGhyb3dPbkludmFsaWRPYmplY3QsIGNhcE51bWJlcnMpIHtcbiAgICAgICAgaWYgKG9iamVjdHNQZXJUaWNrID09PSB2b2lkIDApIHsgb2JqZWN0c1BlclRpY2sgPSBJbmZpbml0eTsgfVxuICAgICAgICBpZiAodGhyb3dPbkludmFsaWRPYmplY3QgPT09IHZvaWQgMCkgeyB0aHJvd09uSW52YWxpZE9iamVjdCA9IGZhbHNlOyB9XG4gICAgICAgIGlmIChjYXBOdW1iZXJzID09PSB2b2lkIDApIHsgY2FwTnVtYmVycyA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIEJ5dGVTdHJlYW0ub2YocGRmQnl0ZXMpLCBQREZDb250ZXh0LmNyZWF0ZSgpLCBjYXBOdW1iZXJzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5hbHJlYWR5UGFyc2VkID0gZmFsc2U7XG4gICAgICAgIF90aGlzLnBhcnNlZE9iamVjdHMgPSAwO1xuICAgICAgICBfdGhpcy5zaG91bGRXYWl0Rm9yVGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnBhcnNlZE9iamVjdHMgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5wYXJzZWRPYmplY3RzICUgX3RoaXMub2JqZWN0c1BlclRpY2sgPT09IDA7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLm9iamVjdHNQZXJUaWNrID0gb2JqZWN0c1BlclRpY2s7XG4gICAgICAgIF90aGlzLnRocm93T25JbnZhbGlkT2JqZWN0ID0gdGhyb3dPbkludmFsaWRPYmplY3Q7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5wYXJzZURvY3VtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcHJldk9mZnNldCwgb2Zmc2V0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWxyZWFkeVBhcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXBhcnNlRXJyb3IoJ1BERlBhcnNlcicsICdwYXJzZURvY3VtZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFscmVhZHlQYXJzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmhlYWRlciA9IHRoaXMucGFyc2VIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5ieXRlcy5kb25lKCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5wYXJzZURvY3VtZW50U2VjdGlvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IHByZXZPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3RhbGxlZFBhcnNlckVycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2T2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF5YmVSZWNvdmVyUm9vdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5sb29rdXAoUERGUmVmLm9mKDApKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUmVtb3ZpbmcgcGFyc2VkIG9iamVjdDogMCAwIFInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZGVsZXRlKFBERlJlZi5vZigwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgdGhpcy5jb250ZXh0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLm1heWJlUmVjb3ZlclJvb3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpc1ZhbGlkQ2F0YWxvZyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBQREZEaWN0ICYmXG4gICAgICAgICAgICAgICAgb2JqLmxvb2t1cChQREZOYW1lLm9mKCdUeXBlJykpID09PSBQREZOYW1lLm9mKCdDYXRhbG9nJyk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBjYXRhbG9nID0gdGhpcy5jb250ZXh0Lmxvb2t1cCh0aGlzLmNvbnRleHQudHJhaWxlckluZm8uUm9vdCk7XG4gICAgICAgIGlmICghaXNWYWxpZENhdGFsb2coY2F0YWxvZykpIHtcbiAgICAgICAgICAgIHZhciBpbmRpcmVjdE9iamVjdHMgPSB0aGlzLmNvbnRleHQuZW51bWVyYXRlSW5kaXJlY3RPYmplY3RzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBpbmRpcmVjdE9iamVjdHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gaW5kaXJlY3RPYmplY3RzW2lkeF0sIHJlZiA9IF9hWzBdLCBvYmplY3QgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZENhdGFsb2cob2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uUm9vdCA9IHJlZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUucGFyc2VIZWFkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5oZWFkZXIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ham9yID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuUGVyaW9kKTtcbiAgICAgICAgICAgICAgICB2YXIgbWlub3IgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgICAgICAgICAgdmFyIGhlYWRlciA9IFBERkhlYWRlci5mb3JWZXJzaW9uKG1ham9yLCBtaW5vcik7XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwQmluYXJ5SGVhZGVyQ29tbWVudCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1BERkhlYWRlckVycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSk7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnBhcnNlSW5kaXJlY3RPYmplY3RIZWFkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgb2JqZWN0TnVtYmVyID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIGdlbmVyYXRpb25OdW1iZXIgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLm9iaikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nS2V5d29yZEVycm9yKHRoaXMuYnl0ZXMucG9zaXRpb24oKSwgS2V5d29yZHMub2JqKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUERGUmVmLm9mKG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbk51bWJlcik7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLm1hdGNoSW5kaXJlY3RPYmplY3RIZWFkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VJbmRpcmVjdE9iamVjdEhlYWRlcigpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKGluaXRpYWxPZmZzZXQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnBhcnNlSW5kaXJlY3RPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZWYsIG9iamVjdDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMucGFyc2VJbmRpcmVjdE9iamVjdEhlYWRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICghdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZW5kb2JqKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgbmV3IE1pc3NpbmdLZXl3b3JkRXJyb3IodGhpcy5ieXRlcy5wb3NpdGlvbigpLCBLZXl3b3Jkcy5lbmRvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogTG9nIGEgd2FybmluZyBpZiB0aGlzIGZhaWxzLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lbmRvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgUERGUmF3U3RyZWFtICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1R5cGUnKSkgPT09IFBERk5hbWUub2YoJ09ialN0bScpKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQREZPYmplY3RTdHJlYW1QYXJzZXIuZm9yU3RyZWFtKG9iamVjdCwgdGhpcy5zaG91bGRXYWl0Rm9yVGljaykucGFyc2VJbnRvQ29udGV4dCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQREZSYXdTdHJlYW0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZGljdC5sb29rdXAoUERGTmFtZS5vZignVHlwZScpKSA9PT0gUERGTmFtZS5vZignWFJlZicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGWFJlZlN0cmVhbVBhcnNlci5mb3JTdHJlYW0ob2JqZWN0KS5wYXJzZUludG9Db250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYXNzaWduKHJlZiwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBUT0RPOiBJbXByb3ZlIGFuZCBjbGVhbiB0aGlzIHVwXG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS50cnlUb1BhcnNlSW52YWxpZEluZGlyZWN0T2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLmJ5dGVzLnBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBtc2cgPSBcIlRyeWluZyB0byBwYXJzZSBpbnZhbGlkIG9iamVjdDogXCIgKyBKU09OLnN0cmluZ2lmeShzdGFydFBvcykgKyBcIilcIjtcbiAgICAgICAgaWYgKHRoaXMudGhyb3dPbkludmFsaWRPYmplY3QpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICAgIHZhciByZWYgPSB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3RIZWFkZXIoKTtcbiAgICAgICAgY29uc29sZS53YXJuKFwiSW52YWxpZCBvYmplY3QgcmVmOiBcIiArIHJlZik7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICB2YXIgZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVuZG9iaikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZmFpbGVkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhaWxlZClcbiAgICAgICAgICAgIHRocm93IG5ldyBQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yKHN0YXJ0UG9zKTtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCkgLSBLZXl3b3Jkcy5lbmRvYmoubGVuZ3RoO1xuICAgICAgICB2YXIgb2JqZWN0ID0gUERGSW52YWxpZE9iamVjdC5vZih0aGlzLmJ5dGVzLnNsaWNlKHN0YXJ0LCBlbmQpKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmFzc2lnbihyZWYsIG9iamVjdCk7XG4gICAgICAgIHJldHVybiByZWY7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnBhcnNlSW5kaXJlY3RPYmplY3RzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCwgZV8xO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKCF0aGlzLmJ5dGVzLmRvbmUoKSAmJiBJc0RpZ2l0W3RoaXMuYnl0ZXMucGVlaygpXSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbE9mZnNldCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMiwgNCwgLCA1XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3QoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBlXzEgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBZGQgdHJhY2luZy9sb2dnaW5nIG1lY2hhbmlzbSB0byB0cmFjayB3aGVuIHRoaXMgaGFwcGVucyFcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKGluaXRpYWxPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlUb1BhcnNlSW52YWxpZEluZGlyZWN0T2JqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDYW4gdGhpcyBiZSBkb25lIG9ubHkgd2hlbiBuZWVkZWQsIHRvIGF2b2lkIGhhcm1pbmcgcGVyZm9ybWFuY2U/XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBKaWJiZXJpc2goKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRXYWl0Rm9yVGljaygpKSByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUubWF5YmVQYXJzZUNyb3NzUmVmU2VjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMueHJlZikpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgb2JqZWN0TnVtYmVyID0gLTE7XG4gICAgICAgIHZhciB4cmVmID0gUERGQ3Jvc3NSZWZTZWN0aW9uLmNyZWF0ZUVtcHR5KCk7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkgJiYgSXNEaWdpdFt0aGlzLmJ5dGVzLnBlZWsoKV0pIHtcbiAgICAgICAgICAgIHZhciBmaXJzdEludCA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgdmFyIHNlY29uZEludCA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMubiB8fCBieXRlID09PSBDaGFyQ29kZXMuZikge1xuICAgICAgICAgICAgICAgIHZhciByZWYgPSBQREZSZWYub2Yob2JqZWN0TnVtYmVyLCBzZWNvbmRJbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ5dGVzLm5leHQoKSA9PT0gQ2hhckNvZGVzLm4pIHtcbiAgICAgICAgICAgICAgICAgICAgeHJlZi5hZGRFbnRyeShyZWYsIGZpcnN0SW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuY29udGV4dC5kZWxldGUocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgeHJlZi5hZGREZWxldGVkRW50cnkocmVmLCBmaXJzdEludCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9iamVjdE51bWJlciArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TnVtYmVyID0gZmlyc3RJbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geHJlZjtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUubWF5YmVQYXJzZVRyYWlsZXJEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy50cmFpbGVyKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5wYXJzZURpY3QoKTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnRleHQudHJhaWxlckluZm8gPSB7XG4gICAgICAgICAgICBSb290OiBkaWN0LmdldChQREZOYW1lLm9mKCdSb290JykpIHx8IGNvbnRleHQudHJhaWxlckluZm8uUm9vdCxcbiAgICAgICAgICAgIEVuY3J5cHQ6IGRpY3QuZ2V0KFBERk5hbWUub2YoJ0VuY3J5cHQnKSkgfHwgY29udGV4dC50cmFpbGVySW5mby5FbmNyeXB0LFxuICAgICAgICAgICAgSW5mbzogZGljdC5nZXQoUERGTmFtZS5vZignSW5mbycpKSB8fCBjb250ZXh0LnRyYWlsZXJJbmZvLkluZm8sXG4gICAgICAgICAgICBJRDogZGljdC5nZXQoUERGTmFtZS5vZignSUQnKSkgfHwgY29udGV4dC50cmFpbGVySW5mby5JRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUubWF5YmVQYXJzZVRyYWlsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0YXJ0eHJlZikpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlKCk7XG4gICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVvZik7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lb2YpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgcmV0dXJuIFBERlRyYWlsZXIuZm9yTGFzdENyb3NzUmVmU2VjdGlvbk9mZnNldChvZmZzZXQpO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5wYXJzZURvY3VtZW50U2VjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3RzKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heWJlUGFyc2VDcm9zc1JlZlNlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF5YmVQYXJzZVRyYWlsZXJEaWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heWJlUGFyc2VUcmFpbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBDYW4gdGhpcyBiZSBkb25lIG9ubHkgd2hlbiBuZWVkZWQsIHRvIGF2b2lkIGhhcm1pbmcgcGVyZm9ybWFuY2U/XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBKaWJiZXJpc2goKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgbmVjZXNzYXJ5IGZvciB2YWxpZCBQREYgZmlsZXMuIEJ1dCBzb21lIGludmFsaWQgUERGc1xuICAgICAqIGNvbnRhaW4gamliYmVyaXNoIGluIGJldHdlZW4gaW5kaXJlY3Qgb2JqZWN0cy4gVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG9cbiAgICAgKiBza2lwIHBhc3QgdGhhdCBqaWJiZXJpc2gsIHNob3VsZCBpdCBleGlzdCwgdW50aWwgaXQgcmVhY2hlcyB0aGUgbmV4dFxuICAgICAqIGluZGlyZWN0IG9iamVjdCBoZWFkZXIsIGFuIHhyZWYgdGFibGUgc2VjdGlvbiwgb3IgdGhlIGZpbGUgdHJhaWxlci5cbiAgICAgKi9cbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnNraXBKaWJiZXJpc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgdmFyIGlzQWxwaGFOdW1lcmljID0gYnl0ZSA+PSBDaGFyQ29kZXMuU3BhY2UgJiYgYnl0ZSA8PSBDaGFyQ29kZXMuVGlsZGU7XG4gICAgICAgICAgICBpZiAoaXNBbHBoYU51bWVyaWMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMueHJlZikgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMudHJhaWxlcikgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RhcnR4cmVmKSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoSW5kaXJlY3RPYmplY3RIZWFkZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyhpbml0aWFsT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNraXBzIHRoZSBiaW5hcnkgY29tbWVudCBmb2xsb3dpbmcgYSBQREYgaGVhZGVyLiBUaGUgc3BlY2lmaWNhdGlvblxuICAgICAqIGRlZmluZXMgdGhpcyBiaW5hcnkgY29tbWVudCAoc2VjdGlvbiA3LjUuMiBGaWxlIEhlYWRlcikgYXMgYSBzZXF1ZW5jZSBvZiA0XG4gICAgICogb3IgbW9yZSBieXRlcyB0aGF0IGFyZSAxMjggb3IgZ3JlYXRlciwgYW5kIHdoaWNoIGFyZSBwcmVjZWRlZCBieSBhIFwiJVwiLlxuICAgICAqXG4gICAgICogVGhpcyB3b3VsZCBpbXBseSB0aGF0IHRvIHN0cmlwIG91dCB0aGlzIGJpbmFyeSBjb21tZW50LCB3ZSBjb3VsZCBjaGVjayBmb3JcbiAgICAgKiBhIHNlcXVlbmNlIG9mIGJ5dGVzIHN0YXJ0aW5nIHdpdGggXCIlXCIsIGFuZCByZW1vdmUgYWxsIHN1YnNlcXVlbnQgYnl0ZXMgdGhhdFxuICAgICAqIGFyZSAxMjggb3IgZ3JlYXRlci4gVGhpcyB3b3JrcyBmb3IgbWFueSBkb2N1bWVudHMgdGhhdCBwcm9wZXJseSBjb21wbHkgd2l0aFxuICAgICAqIHRoZSBzcGVjLiBCdXQgaW4gdGhlIHdpbGQsIHRoZXJlIGFyZSBQREZzIHRoYXQgb21pdCB0aGUgbGVhZGluZyBcIiVcIiwgYW5kXG4gICAgICogaW5jbHVkZSBieXRlcyB0aGF0IGFyZSBsZXNzIHRoYW4gMTI4IChlLmcuIDAgb3IgMSkuIFNvIGluIG9yZGVyIHRvIHBhcnNlXG4gICAgICogdGhlc2UgaGVhZGVycyBjb3JyZWN0bHksIHdlIGp1c3QgdGhyb3cgb3V0IGFsbCBieXRlcyBsZWFkaW5nIHVwIHRvIHRoZVxuICAgICAqIGZpcnN0IGluZGlyZWN0IG9iamVjdCBoZWFkZXIuXG4gICAgICovXG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5za2lwQmluYXJ5SGVhZGVyQ29tbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgICAgICB0aGlzLnBhcnNlSW5kaXJlY3RPYmplY3RIZWFkZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKGluaXRpYWxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZQYXJzZXIuZm9yQnl0ZXNXaXRoT3B0aW9ucyA9IGZ1bmN0aW9uIChwZGZCeXRlcywgb2JqZWN0c1BlclRpY2ssIHRocm93T25JbnZhbGlkT2JqZWN0LCBjYXBOdW1iZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFyc2VyKHBkZkJ5dGVzLCBvYmplY3RzUGVyVGljaywgdGhyb3dPbkludmFsaWRPYmplY3QsIGNhcE51bWJlcnMpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlBhcnNlcjtcbn0oUERGT2JqZWN0UGFyc2VyKSk7XG5leHBvcnQgZGVmYXVsdCBQREZQYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZQYXJzZXIuanMubWFwIiwiaW1wb3J0IHsgUmVwYXJzZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBCeXRlU3RyZWFtIGZyb20gXCIuL0J5dGVTdHJlYW1cIjtcbnZhciBQREZYUmVmU3RyZWFtUGFyc2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERlhSZWZTdHJlYW1QYXJzZXIocmF3U3RyZWFtKSB7XG4gICAgICAgIHRoaXMuYWxyZWFkeVBhcnNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRpY3QgPSByYXdTdHJlYW0uZGljdDtcbiAgICAgICAgdGhpcy5ieXRlcyA9IEJ5dGVTdHJlYW0uZnJvbVBERlJhd1N0cmVhbShyYXdTdHJlYW0pO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmRpY3QuY29udGV4dDtcbiAgICAgICAgdmFyIFNpemUgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1NpemUnKSwgUERGTnVtYmVyKTtcbiAgICAgICAgdmFyIEluZGV4ID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdJbmRleCcpKTtcbiAgICAgICAgaWYgKEluZGV4IGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2VjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEluZGV4LnNpemUoKTsgaWR4IDwgbGVuOyBpZHggKz0gMikge1xuICAgICAgICAgICAgICAgIHZhciBmaXJzdE9iamVjdE51bWJlciA9IEluZGV4Lmxvb2t1cChpZHggKyAwLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgdmFyIGxlbmd0aF8xID0gSW5kZXgubG9va3VwKGlkeCArIDEsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNlY3Rpb25zLnB1c2goeyBmaXJzdE9iamVjdE51bWJlcjogZmlyc3RPYmplY3ROdW1iZXIsIGxlbmd0aDogbGVuZ3RoXzEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNlY3Rpb25zID0gW3sgZmlyc3RPYmplY3ROdW1iZXI6IDAsIGxlbmd0aDogU2l6ZS5hc051bWJlcigpIH1dO1xuICAgICAgICB9XG4gICAgICAgIHZhciBXID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdXJyksIFBERkFycmF5KTtcbiAgICAgICAgdGhpcy5ieXRlV2lkdGhzID0gWy0xLCAtMSwgLTFdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBXLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdGhpcy5ieXRlV2lkdGhzW2lkeF0gPSBXLmxvb2t1cChpZHgsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBQREZYUmVmU3RyZWFtUGFyc2VyLnByb3RvdHlwZS5wYXJzZUludG9Db250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5hbHJlYWR5UGFyc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVwYXJzZUVycm9yKCdQREZYUmVmU3RyZWFtUGFyc2VyJywgJ3BhcnNlSW50b0NvbnRleHQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFscmVhZHlQYXJzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRleHQudHJhaWxlckluZm8gPSB7XG4gICAgICAgICAgICBSb290OiB0aGlzLmRpY3QuZ2V0KFBERk5hbWUub2YoJ1Jvb3QnKSksXG4gICAgICAgICAgICBFbmNyeXB0OiB0aGlzLmRpY3QuZ2V0KFBERk5hbWUub2YoJ0VuY3J5cHQnKSksXG4gICAgICAgICAgICBJbmZvOiB0aGlzLmRpY3QuZ2V0KFBERk5hbWUub2YoJ0luZm8nKSksXG4gICAgICAgICAgICBJRDogdGhpcy5kaWN0LmdldChQREZOYW1lLm9mKCdJRCcpKSxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLnBhcnNlRW50cmllcygpO1xuICAgICAgICAvLyBmb3IgKGxldCBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAvLyBjb25zdCBlbnRyeSA9IGVudHJpZXNbaWR4XTtcbiAgICAgICAgLy8gaWYgKGVudHJ5LmRlbGV0ZWQpIHRoaXMuY29udGV4dC5kZWxldGUoZW50cnkucmVmKTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gZW50cmllcztcbiAgICB9O1xuICAgIFBERlhSZWZTdHJlYW1QYXJzZXIucHJvdG90eXBlLnBhcnNlRW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5ieXRlV2lkdGhzLCB0eXBlRmllbGRXaWR0aCA9IF9hWzBdLCBvZmZzZXRGaWVsZFdpZHRoID0gX2FbMV0sIGdlbkZpZWxkV2lkdGggPSBfYVsyXTtcbiAgICAgICAgZm9yICh2YXIgc3Vic2VjdGlvbklkeCA9IDAsIHN1YnNlY3Rpb25MZW4gPSB0aGlzLnN1YnNlY3Rpb25zLmxlbmd0aDsgc3Vic2VjdGlvbklkeCA8IHN1YnNlY3Rpb25MZW47IHN1YnNlY3Rpb25JZHgrKykge1xuICAgICAgICAgICAgdmFyIF9iID0gdGhpcy5zdWJzZWN0aW9uc1tzdWJzZWN0aW9uSWR4XSwgZmlyc3RPYmplY3ROdW1iZXIgPSBfYi5maXJzdE9iamVjdE51bWJlciwgbGVuZ3RoXzIgPSBfYi5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBvYmpJZHggPSAwOyBvYmpJZHggPCBsZW5ndGhfMjsgb2JqSWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdHlwZUZpZWxkV2lkdGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICh0eXBlIDw8IDgpIHwgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9mZnNldEZpZWxkV2lkdGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA8PCA4KSB8IHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZ2VuZXJhdGlvbk51bWJlciA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZ2VuRmllbGRXaWR0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uTnVtYmVyID0gKGdlbmVyYXRpb25OdW1iZXIgPDwgOCkgfCB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgYHR5cGVgIGZpZWxkIGlzIGFic2VudCwgaXQgZGVmYXVsdHMgdG8gMVxuICAgICAgICAgICAgICAgIGlmICh0eXBlRmllbGRXaWR0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDE7XG4gICAgICAgICAgICAgICAgdmFyIG9iamVjdE51bWJlciA9IGZpcnN0T2JqZWN0TnVtYmVyICsgb2JqSWR4O1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmVmOiBQREZSZWYub2Yob2JqZWN0TnVtYmVyLCBnZW5lcmF0aW9uTnVtYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZWQ6IHR5cGUgPT09IDAsXG4gICAgICAgICAgICAgICAgICAgIGluT2JqZWN0U3RyZWFtOiB0eXBlID09PSAyLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cmllcztcbiAgICB9O1xuICAgIFBERlhSZWZTdHJlYW1QYXJzZXIuZm9yU3RyZWFtID0gZnVuY3Rpb24gKHJhd1N0cmVhbSkge1xuICAgICAgICByZXR1cm4gbmV3IFBERlhSZWZTdHJlYW1QYXJzZXIocmF3U3RyZWFtKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZYUmVmU3RyZWFtUGFyc2VyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlhSZWZTdHJlYW1QYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZYUmVmU3RyZWFtUGFyc2VyLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBUaGUgQXNjaWk4NVN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBBc2NpaTg1U3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IERlY29kZVN0cmVhbSBmcm9tIFwiLi9EZWNvZGVTdHJlYW1cIjtcbnZhciBpc1NwYWNlID0gZnVuY3Rpb24gKGNoKSB7XG4gICAgcmV0dXJuIGNoID09PSAweDIwIHx8IGNoID09PSAweDA5IHx8IGNoID09PSAweDBkIHx8IGNoID09PSAweDBhO1xufTtcbnZhciBBc2NpaTg1U3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhBc2NpaTg1U3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFzY2lpODVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtYXliZUxlbmd0aCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBfdGhpcy5pbnB1dCA9IG5ldyBVaW50OEFycmF5KDUpO1xuICAgICAgICAvLyBNb3N0IHN0cmVhbXMgaW5jcmVhc2UgaW4gc2l6ZSB3aGVuIGRlY29kZWQsIGJ1dCBBc2NpaTg1IHN0cmVhbXNcbiAgICAgICAgLy8gdHlwaWNhbGx5IHNocmluayBieSB+MjAlLlxuICAgICAgICBpZiAobWF5YmVMZW5ndGgpIHtcbiAgICAgICAgICAgIG1heWJlTGVuZ3RoID0gMC44ICogbWF5YmVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBBc2NpaTg1U3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBUSUxEQV9DSEFSID0gMHg3ZTsgLy8gJ34nXG4gICAgICAgIHZhciBaX0xPV0VSX0NIQVIgPSAweDdhOyAvLyAneidcbiAgICAgICAgdmFyIEVPRiA9IC0xO1xuICAgICAgICB2YXIgc3RyZWFtID0gdGhpcy5zdHJlYW07XG4gICAgICAgIHZhciBjID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgd2hpbGUgKGlzU3BhY2UoYykpIHtcbiAgICAgICAgICAgIGMgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjID09PSBFT0YgfHwgYyA9PT0gVElMREFfQ0hBUikge1xuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgdmFyIGJ1ZmZlcjtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIC8vIHNwZWNpYWwgY29kZSBmb3IgelxuICAgICAgICBpZiAoYyA9PT0gWl9MT1dFUl9DSEFSKSB7XG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyA0KTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gNDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IHRoaXMuaW5wdXQ7XG4gICAgICAgICAgICBpbnB1dFswXSA9IGM7XG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgKytpKSB7XG4gICAgICAgICAgICAgICAgYyA9IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGlzU3BhY2UoYykpIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlucHV0W2ldID0gYztcbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgaSAtIDEpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gaSAtIDE7XG4gICAgICAgICAgICAvLyBwYXJ0aWFsIGVuZGluZztcbiAgICAgICAgICAgIGlmIChpIDwgNSkge1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgNTsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0W2ldID0gMHgyMSArIDg0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdCA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7XG4gICAgICAgICAgICAgICAgdCA9IHQgKiA4NSArIChpbnB1dFtpXSAtIDB4MjEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMzsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSB0ICYgMHhmZjtcbiAgICAgICAgICAgICAgICB0ID4+PSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQXNjaWk4NVN0cmVhbTtcbn0oRGVjb2RlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBBc2NpaTg1U3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNjaWk4NVN0cmVhbS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIEFzY2lpSGV4U3RyZWFtIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBUeXBlU2NyaXB0IHBvcnQgb2YgdGhlXG4gKiBKYXZhU2NyaXB0IEFzY2lpSGV4U3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IERlY29kZVN0cmVhbSBmcm9tIFwiLi9EZWNvZGVTdHJlYW1cIjtcbnZhciBBc2NpaUhleFN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXNjaWlIZXhTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQXNjaWlIZXhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtYXliZUxlbmd0aCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBfdGhpcy5maXJzdERpZ2l0ID0gLTE7XG4gICAgICAgIC8vIE1vc3Qgc3RyZWFtcyBpbmNyZWFzZSBpbiBzaXplIHdoZW4gZGVjb2RlZCwgYnV0IEFzY2lpSGV4IHN0cmVhbXMgc2hyaW5rXG4gICAgICAgIC8vIGJ5IDUwJS5cbiAgICAgICAgaWYgKG1heWJlTGVuZ3RoKSB7XG4gICAgICAgICAgICBtYXliZUxlbmd0aCA9IDAuNSAqIG1heWJlTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQXNjaWlIZXhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFVQU1RSRUFNX0JMT0NLX1NJWkUgPSA4MDAwO1xuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLnN0cmVhbS5nZXRCeXRlcyhVUFNUUkVBTV9CTE9DS19TSVpFKTtcbiAgICAgICAgaWYgKCFieXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWF4RGVjb2RlTGVuZ3RoID0gKGJ5dGVzLmxlbmd0aCArIDEpID4+IDE7XG4gICAgICAgIHZhciBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIG1heERlY29kZUxlbmd0aCk7XG4gICAgICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgdmFyIGZpcnN0RGlnaXQgPSB0aGlzLmZpcnN0RGlnaXQ7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGJ5dGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaCA9IGJ5dGVzW2ldO1xuICAgICAgICAgICAgdmFyIGRpZ2l0ID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSkge1xuICAgICAgICAgICAgICAgIC8vICcwJy0nOSdcbiAgICAgICAgICAgICAgICBkaWdpdCA9IGNoICYgMHgwZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChjaCA+PSAweDQxICYmIGNoIDw9IDB4NDYpIHx8IChjaCA+PSAweDYxICYmIGNoIDw9IDB4NjYpKSB7XG4gICAgICAgICAgICAgICAgLy8gJ0EnLSdaJywgJ2EnLSd6J1xuICAgICAgICAgICAgICAgIGRpZ2l0ID0gKGNoICYgMHgwZikgKyA5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT09IDB4M2UpIHtcbiAgICAgICAgICAgICAgICAvLyAnPidcbiAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yaW5nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3REaWdpdCA8IDApIHtcbiAgICAgICAgICAgICAgICBmaXJzdERpZ2l0ID0gZGlnaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gKGZpcnN0RGlnaXQgPDwgNCkgfCBkaWdpdDtcbiAgICAgICAgICAgICAgICBmaXJzdERpZ2l0ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpcnN0RGlnaXQgPj0gMCAmJiB0aGlzLmVvZikge1xuICAgICAgICAgICAgLy8gaW5jb21wbGV0ZSBieXRlXG4gICAgICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gZmlyc3REaWdpdCA8PCA0O1xuICAgICAgICAgICAgZmlyc3REaWdpdCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyc3REaWdpdCA9IGZpcnN0RGlnaXQ7XG4gICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoO1xuICAgIH07XG4gICAgcmV0dXJuIEFzY2lpSGV4U3RyZWFtO1xufShEZWNvZGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IEFzY2lpSGV4U3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNjaWlIZXhTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBTdHJlYW0gZnJvbSBcIi4vU3RyZWFtXCI7XG4vKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIERlY29kZVN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBEZWNvZGVTdHJlYW0gY2xhc3MgaW4gTW96aWxsYSdzIHBkZi5qcyBwcm9qZWN0LCBtYWRlIGF2YWlsYWJsZVxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2UgbGljZW5zZS5cbiAqL1xuLy8gTG90cyBvZiBEZWNvZGVTdHJlYW1zIGFyZSBjcmVhdGVkIHdob3NlIGJ1ZmZlcnMgYXJlIG5ldmVyIHVzZWQuICBGb3IgdGhlc2Vcbi8vIHdlIHNoYXJlIGEgc2luZ2xlIGVtcHR5IGJ1ZmZlci4gVGhpcyBpcyAoYSkgc3BhY2UtZWZmaWNpZW50IGFuZCAoYikgYXZvaWRzXG4vLyBoYXZpbmcgc3BlY2lhbCBjYXNlcyB0aGF0IHdvdWxkIGJlIHJlcXVpcmVkIGlmIHdlIHVzZWQgfG51bGx8IGZvciBhbiBlbXB0eVxuLy8gYnVmZmVyLlxudmFyIGVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG4vKipcbiAqIFN1cGVyIGNsYXNzIGZvciB0aGUgZGVjb2Rpbmcgc3RyZWFtc1xuICovXG52YXIgRGVjb2RlU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlY29kZVN0cmVhbShtYXliZU1pbkJ1ZmZlckxlbmd0aCkge1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5lb2YgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBlbXB0eUJ1ZmZlcjtcbiAgICAgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggPSA1MTI7XG4gICAgICAgIGlmIChtYXliZU1pbkJ1ZmZlckxlbmd0aCkge1xuICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZmlyc3QgcG93ZXIgb2YgdHdvIHRoYXQgaXMgYXMgYmlnIGFzIG1heWJlTWluQnVmZmVyTGVuZ3RoLlxuICAgICAgICAgICAgd2hpbGUgKHRoaXMubWluQnVmZmVyTGVuZ3RoIDwgbWF5YmVNaW5CdWZmZXJMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbkJ1ZmZlckxlbmd0aCAqPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWNvZGVTdHJlYW0ucHJvdG90eXBlLCBcImlzRW1wdHlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHdoaWxlICghdGhpcy5lb2YgJiYgdGhpcy5idWZmZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyTGVuZ3RoID09PSAwO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5nZXRCeXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICh0aGlzLmJ1ZmZlckxlbmd0aCA8PSBwb3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVvZikge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zKytdO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5nZXRVaW50MTYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgaWYgKGIwID09PSAtMSB8fCBiMSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLmdldEludDMyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMiA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjMgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLmdldEJ5dGVzID0gZnVuY3Rpb24gKGxlbmd0aCwgZm9yY2VDbGFtcGVkKSB7XG4gICAgICAgIGlmIChmb3JjZUNsYW1wZWQgPT09IHZvaWQgMCkgeyBmb3JjZUNsYW1wZWQgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgZW5kO1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIGxlbmd0aCk7XG4gICAgICAgICAgICBlbmQgPSBwb3MgKyBsZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoIXRoaXMuZW9mICYmIHRoaXMuYnVmZmVyTGVuZ3RoIDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBidWZFbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPiBidWZFbmQpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBidWZFbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuZCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICB2YXIgc3ViYXJyYXkgPSB0aGlzLmJ1ZmZlci5zdWJhcnJheShwb3MsIGVuZCk7XG4gICAgICAgIC8vIGB0aGlzLmJ1ZmZlcmAgaXMgZWl0aGVyIGEgYFVpbnQ4QXJyYXlgIG9yIGBVaW50OENsYW1wZWRBcnJheWAgaGVyZS5cbiAgICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCAmJiAhKHN1YmFycmF5IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpXG4gICAgICAgICAgICA/IG5ldyBVaW50OENsYW1wZWRBcnJheShzdWJhcnJheSlcbiAgICAgICAgICAgIDogc3ViYXJyYXk7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnBlZWtCeXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGVla2VkQnl0ZSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB0aGlzLnBvcy0tO1xuICAgICAgICByZXR1cm4gcGVla2VkQnl0ZTtcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUucGVla0J5dGVzID0gZnVuY3Rpb24gKGxlbmd0aCwgZm9yY2VDbGFtcGVkKSB7XG4gICAgICAgIGlmIChmb3JjZUNsYW1wZWQgPT09IHZvaWQgMCkgeyBmb3JjZUNsYW1wZWQgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkKTtcbiAgICAgICAgdGhpcy5wb3MgLT0gYnl0ZXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiAobikge1xuICAgICAgICBpZiAoIW4pIHtcbiAgICAgICAgICAgIG4gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zICs9IG47XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLm1ha2VTdWJTdHJlYW0gPSBmdW5jdGlvbiAoc3RhcnQsIGxlbmd0aCAvKiBkaWN0ICovKSB7XG4gICAgICAgIHZhciBlbmQgPSBzdGFydCArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyTGVuZ3RoIDw9IGVuZCAmJiAhdGhpcy5lb2YpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5idWZmZXIsIHN0YXJ0LCBsZW5ndGggLyogZGljdCAqLyk7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmVvZilcbiAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLCB0aGlzLmJ1ZmZlckxlbmd0aCk7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAncmVhZEJsb2NrJyk7XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLmVuc3VyZUJ1ZmZlciA9IGZ1bmN0aW9uIChyZXF1ZXN0ZWQpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgICBpZiAocmVxdWVzdGVkIDw9IGJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzaXplID0gdGhpcy5taW5CdWZmZXJMZW5ndGg7XG4gICAgICAgIHdoaWxlIChzaXplIDwgcmVxdWVzdGVkKSB7XG4gICAgICAgICAgICBzaXplICo9IDI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJ1ZmZlcjIgPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICAgICAgYnVmZmVyMi5zZXQoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuICh0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjIpO1xuICAgIH07XG4gICAgcmV0dXJuIERlY29kZVN0cmVhbTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBEZWNvZGVTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZWNvZGVTdHJlYW0uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAxOTk2LTIwMDMgR2x5cGggJiBDb2csIExMQ1xuICpcbiAqIFRoZSBmbGF0ZSBzdHJlYW0gaW1wbGVtZW50YXRpb24gY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIEphdmFTY3JpcHQgcG9ydFxuICogb2YgWFBERidzIGltcGxlbWVudGF0aW9uLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZVxuICogbGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG4vKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIEZsYXRlU3RyZWFtIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBUeXBlU2NyaXB0IHBvcnQgb2YgdGhlXG4gKiBKYXZhU2NyaXB0IEZsYXRlU3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbi8qIHRzbGludDpkaXNhYmxlICBuby1jb25kaXRpb25hbC1hc3NpZ25tZW50ICovXG5pbXBvcnQgRGVjb2RlU3RyZWFtIGZyb20gXCIuL0RlY29kZVN0cmVhbVwiO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgY29kZUxlbkNvZGVNYXAgPSBuZXcgSW50MzJBcnJheShbXG4gICAgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNVxuXSk7XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBsZW5ndGhEZWNvZGUgPSBuZXcgSW50MzJBcnJheShbXG4gICAgMHgwMDAwMywgMHgwMDAwNCwgMHgwMDAwNSwgMHgwMDAwNiwgMHgwMDAwNywgMHgwMDAwOCwgMHgwMDAwOSwgMHgwMDAwYSxcbiAgICAweDEwMDBiLCAweDEwMDBkLCAweDEwMDBmLCAweDEwMDExLCAweDIwMDEzLCAweDIwMDE3LCAweDIwMDFiLCAweDIwMDFmLFxuICAgIDB4MzAwMjMsIDB4MzAwMmIsIDB4MzAwMzMsIDB4MzAwM2IsIDB4NDAwNDMsIDB4NDAwNTMsIDB4NDAwNjMsIDB4NDAwNzMsXG4gICAgMHg1MDA4MywgMHg1MDBhMywgMHg1MDBjMywgMHg1MDBlMywgMHgwMDEwMiwgMHgwMDEwMiwgMHgwMDEwMlxuXSk7XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBkaXN0RGVjb2RlID0gbmV3IEludDMyQXJyYXkoW1xuICAgIDB4MDAwMDEsIDB4MDAwMDIsIDB4MDAwMDMsIDB4MDAwMDQsIDB4MTAwMDUsIDB4MTAwMDcsIDB4MjAwMDksIDB4MjAwMGQsXG4gICAgMHgzMDAxMSwgMHgzMDAxOSwgMHg0MDAyMSwgMHg0MDAzMSwgMHg1MDA0MSwgMHg1MDA2MSwgMHg2MDA4MSwgMHg2MDBjMSxcbiAgICAweDcwMTAxLCAweDcwMTgxLCAweDgwMjAxLCAweDgwMzAxLCAweDkwNDAxLCAweDkwNjAxLCAweGEwODAxLCAweGEwYzAxLFxuICAgIDB4YjEwMDEsIDB4YjE4MDEsIDB4YzIwMDEsIDB4YzMwMDEsIDB4ZDQwMDEsIDB4ZDYwMDFcbl0pO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgZml4ZWRMaXRDb2RlVGFiID0gW25ldyBJbnQzMkFycmF5KFtcbiAgICAgICAgMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMCxcbiAgICAgICAgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMCwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMCxcbiAgICAgICAgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MCwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMCxcbiAgICAgICAgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMCwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMCxcbiAgICAgICAgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOCxcbiAgICAgICAgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOCwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOCxcbiAgICAgICAgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OCwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOCxcbiAgICAgICAgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOCwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOCxcbiAgICAgICAgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNCxcbiAgICAgICAgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNCwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNCxcbiAgICAgICAgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NCwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNCxcbiAgICAgICAgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNCwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNCxcbiAgICAgICAgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjYyxcbiAgICAgICAgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhYywgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlYyxcbiAgICAgICAgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5YywgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkYyxcbiAgICAgICAgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiYywgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmYyxcbiAgICAgICAgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMixcbiAgICAgICAgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMiwgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMixcbiAgICAgICAgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MiwgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMixcbiAgICAgICAgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMiwgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMixcbiAgICAgICAgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYSxcbiAgICAgICAgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYSwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYSxcbiAgICAgICAgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YSwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYSxcbiAgICAgICAgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYSwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYSxcbiAgICAgICAgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNixcbiAgICAgICAgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNiwgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNixcbiAgICAgICAgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NiwgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNixcbiAgICAgICAgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNiwgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNixcbiAgICAgICAgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZSxcbiAgICAgICAgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZSwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZSxcbiAgICAgICAgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZSwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZSxcbiAgICAgICAgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZSwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZSxcbiAgICAgICAgMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMSxcbiAgICAgICAgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMSwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMSxcbiAgICAgICAgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MSwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMSxcbiAgICAgICAgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMSwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMSxcbiAgICAgICAgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOSxcbiAgICAgICAgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOSwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOSxcbiAgICAgICAgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OSwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOSxcbiAgICAgICAgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOSwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOSxcbiAgICAgICAgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNSxcbiAgICAgICAgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNSwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNSxcbiAgICAgICAgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NSwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNSxcbiAgICAgICAgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNSwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNSxcbiAgICAgICAgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjZCxcbiAgICAgICAgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhZCwgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlZCxcbiAgICAgICAgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5ZCwgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkZCxcbiAgICAgICAgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiZCwgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmZCxcbiAgICAgICAgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMyxcbiAgICAgICAgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMywgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMyxcbiAgICAgICAgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MywgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMyxcbiAgICAgICAgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMywgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMyxcbiAgICAgICAgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYixcbiAgICAgICAgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYiwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYixcbiAgICAgICAgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YiwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYixcbiAgICAgICAgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYiwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYixcbiAgICAgICAgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNyxcbiAgICAgICAgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNywgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNyxcbiAgICAgICAgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NywgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNyxcbiAgICAgICAgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNywgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNyxcbiAgICAgICAgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZixcbiAgICAgICAgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZiwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZixcbiAgICAgICAgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZiwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZixcbiAgICAgICAgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZiwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZlxuICAgIF0pLCA5XTtcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGZpeGVkRGlzdENvZGVUYWIgPSBbbmV3IEludDMyQXJyYXkoW1xuICAgICAgICAweDUwMDAwLCAweDUwMDEwLCAweDUwMDA4LCAweDUwMDE4LCAweDUwMDA0LCAweDUwMDE0LCAweDUwMDBjLCAweDUwMDFjLFxuICAgICAgICAweDUwMDAyLCAweDUwMDEyLCAweDUwMDBhLCAweDUwMDFhLCAweDUwMDA2LCAweDUwMDE2LCAweDUwMDBlLCAweDAwMDAwLFxuICAgICAgICAweDUwMDAxLCAweDUwMDExLCAweDUwMDA5LCAweDUwMDE5LCAweDUwMDA1LCAweDUwMDE1LCAweDUwMDBkLCAweDUwMDFkLFxuICAgICAgICAweDUwMDAzLCAweDUwMDEzLCAweDUwMDBiLCAweDUwMDFiLCAweDUwMDA3LCAweDUwMDE3LCAweDUwMDBmLCAweDAwMDAwXG4gICAgXSksIDVdO1xudmFyIEZsYXRlU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGbGF0ZVN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGbGF0ZVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIHZhciBjbWYgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgZmxnID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgaWYgKGNtZiA9PT0gLTEgfHwgZmxnID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtOiBcIiArIGNtZiArIFwiLCBcIiArIGZsZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChjbWYgJiAweDBmKSAhPT0gMHgwOCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiBcIiArIGNtZiArIFwiLCBcIiArIGZsZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCgoY21mIDw8IDgpICsgZmxnKSAlIDMxICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgRkNIRUNLIGluIGZsYXRlIHN0cmVhbTogXCIgKyBjbWYgKyBcIiwgXCIgKyBmbGcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmbGcgJiAweDIwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGRElDVCBiaXQgc2V0IGluIGZsYXRlIHN0cmVhbTogXCIgKyBjbWYgKyBcIiwgXCIgKyBmbGcpO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmNvZGVTaXplID0gMDtcbiAgICAgICAgX3RoaXMuY29kZUJ1ZiA9IDA7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ1ZmZlcjtcbiAgICAgICAgdmFyIGxlbjtcbiAgICAgICAgdmFyIHN0ciA9IHRoaXMuc3RyZWFtO1xuICAgICAgICAvLyByZWFkIGJsb2NrIGhlYWRlclxuICAgICAgICB2YXIgaGRyID0gdGhpcy5nZXRCaXRzKDMpO1xuICAgICAgICBpZiAoaGRyICYgMSkge1xuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGhkciA+Pj0gMTtcbiAgICAgICAgaWYgKGhkciA9PT0gMCkge1xuICAgICAgICAgICAgLy8gdW5jb21wcmVzc2VkIGJsb2NrXG4gICAgICAgICAgICB2YXIgYiA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBibG9ja0xlbiA9IGI7XG4gICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBibG9ja0xlbiB8PSBiIDw8IDg7XG4gICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2hlY2sgPSBiO1xuICAgICAgICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2sgfD0gYiA8PCA4O1xuICAgICAgICAgICAgaWYgKGNoZWNrICE9PSAofmJsb2NrTGVuICYgMHhmZmZmKSAmJiAoYmxvY2tMZW4gIT09IDAgfHwgY2hlY2sgIT09IDApKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JpbmcgZXJyb3IgZm9yIGJhZCBcImVtcHR5XCIgYmxvY2sgKHNlZSBpc3N1ZSAxMjc3KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIHVuY29tcHJlc3NlZCBibG9jayBsZW5ndGggaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvZGVCdWYgPSAwO1xuICAgICAgICAgICAgdGhpcy5jb2RlU2l6ZSA9IDA7XG4gICAgICAgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBibG9ja0xlbik7XG4gICAgICAgICAgICB2YXIgZW5kID0gYnVmZmVyTGVuZ3RoICsgYmxvY2tMZW47XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGVuZDtcbiAgICAgICAgICAgIGlmIChibG9ja0xlbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChzdHIucGVla0J5dGUoKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBidWZmZXJMZW5ndGg7IG4gPCBlbmQ7ICsrbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltuXSA9IGI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsaXRDb2RlVGFibGU7XG4gICAgICAgIHZhciBkaXN0Q29kZVRhYmxlO1xuICAgICAgICBpZiAoaGRyID09PSAxKSB7XG4gICAgICAgICAgICAvLyBjb21wcmVzc2VkIGJsb2NrLCBmaXhlZCBjb2Rlc1xuICAgICAgICAgICAgbGl0Q29kZVRhYmxlID0gZml4ZWRMaXRDb2RlVGFiO1xuICAgICAgICAgICAgZGlzdENvZGVUYWJsZSA9IGZpeGVkRGlzdENvZGVUYWI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGRyID09PSAyKSB7XG4gICAgICAgICAgICAvLyBjb21wcmVzc2VkIGJsb2NrLCBkeW5hbWljIGNvZGVzXG4gICAgICAgICAgICB2YXIgbnVtTGl0Q29kZXMgPSB0aGlzLmdldEJpdHMoNSkgKyAyNTc7XG4gICAgICAgICAgICB2YXIgbnVtRGlzdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMTtcbiAgICAgICAgICAgIHZhciBudW1Db2RlTGVuQ29kZXMgPSB0aGlzLmdldEJpdHMoNCkgKyA0O1xuICAgICAgICAgICAgLy8gYnVpbGQgdGhlIGNvZGUgbGVuZ3RocyBjb2RlIHRhYmxlXG4gICAgICAgICAgICB2YXIgY29kZUxlbkNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbkNvZGVNYXAubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBpID0gdm9pZCAwO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNvZGVMZW5Db2RlczsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29kZUxlbkNvZGVMZW5ndGhzW2NvZGVMZW5Db2RlTWFwW2ldXSA9IHRoaXMuZ2V0Qml0cygzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjb2RlTGVuQ29kZVRhYiA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbkNvZGVMZW5ndGhzKTtcbiAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSBjb2RlIHRhYmxlc1xuICAgICAgICAgICAgbGVuID0gMDtcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgdmFyIGNvZGVzID0gbnVtTGl0Q29kZXMgKyBudW1EaXN0Q29kZXM7XG4gICAgICAgICAgICB2YXIgY29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheShjb2Rlcyk7XG4gICAgICAgICAgICB2YXIgYml0c0xlbmd0aCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciBiaXRzT2Zmc2V0ID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIHdoYXQgPSB2b2lkIDA7XG4gICAgICAgICAgICB3aGlsZSAoaSA8IGNvZGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGUgPSB0aGlzLmdldENvZGUoY29kZUxlbkNvZGVUYWIpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSAxNikge1xuICAgICAgICAgICAgICAgICAgICBiaXRzTGVuZ3RoID0gMjtcbiAgICAgICAgICAgICAgICAgICAgYml0c09mZnNldCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIHdoYXQgPSBsZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPT09IDE3KSB7XG4gICAgICAgICAgICAgICAgICAgIGJpdHNMZW5ndGggPSAzO1xuICAgICAgICAgICAgICAgICAgICBiaXRzT2Zmc2V0ID0gMztcbiAgICAgICAgICAgICAgICAgICAgd2hhdCA9IGxlbiA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPT09IDE4KSB7XG4gICAgICAgICAgICAgICAgICAgIGJpdHNMZW5ndGggPSA3O1xuICAgICAgICAgICAgICAgICAgICBiaXRzT2Zmc2V0ID0gMTE7XG4gICAgICAgICAgICAgICAgICAgIHdoYXQgPSBsZW4gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbmd0aHNbaSsrXSA9IGxlbiA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmVwZWF0TGVuZ3RoID0gdGhpcy5nZXRCaXRzKGJpdHNMZW5ndGgpICsgYml0c09mZnNldDtcbiAgICAgICAgICAgICAgICB3aGlsZSAocmVwZWF0TGVuZ3RoLS0gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSB3aGF0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpdENvZGVUYWJsZSA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMuc3ViYXJyYXkoMCwgbnVtTGl0Q29kZXMpKTtcbiAgICAgICAgICAgIGRpc3RDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KG51bUxpdENvZGVzLCBjb2RlcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGJsb2NrIHR5cGUgaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyID0gdGhpcy5idWZmZXI7XG4gICAgICAgIHZhciBsaW1pdCA9IGJ1ZmZlciA/IGJ1ZmZlci5sZW5ndGggOiAwO1xuICAgICAgICB2YXIgcG9zID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB2YXIgY29kZTEgPSB0aGlzLmdldENvZGUobGl0Q29kZVRhYmxlKTtcbiAgICAgICAgICAgIGlmIChjb2RlMSA8IDI1Nikge1xuICAgICAgICAgICAgICAgIGlmIChwb3MgKyAxID49IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIDEpO1xuICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3MrK10gPSBjb2RlMTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2RlMSA9PT0gMjU2KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBwb3M7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZTEgLT0gMjU3O1xuICAgICAgICAgICAgY29kZTEgPSBsZW5ndGhEZWNvZGVbY29kZTFdO1xuICAgICAgICAgICAgdmFyIGNvZGUyID0gY29kZTEgPj4gMTY7XG4gICAgICAgICAgICBpZiAoY29kZTIgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29kZTIgPSB0aGlzLmdldEJpdHMoY29kZTIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVuID0gKGNvZGUxICYgMHhmZmZmKSArIGNvZGUyO1xuICAgICAgICAgICAgY29kZTEgPSB0aGlzLmdldENvZGUoZGlzdENvZGVUYWJsZSk7XG4gICAgICAgICAgICBjb2RlMSA9IGRpc3REZWNvZGVbY29kZTFdO1xuICAgICAgICAgICAgY29kZTIgPSBjb2RlMSA+PiAxNjtcbiAgICAgICAgICAgIGlmIChjb2RlMiA+IDApIHtcbiAgICAgICAgICAgICAgICBjb2RlMiA9IHRoaXMuZ2V0Qml0cyhjb2RlMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZGlzdCA9IChjb2RlMSAmIDB4ZmZmZikgKyBjb2RlMjtcbiAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gPj0gbGltaXQpIHtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyBsZW4pO1xuICAgICAgICAgICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbGVuOyArK2ssICsrcG9zKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW3Bvc10gPSBidWZmZXJbcG9zIC0gZGlzdF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRCaXRzID0gZnVuY3Rpb24gKGJpdHMpIHtcbiAgICAgICAgdmFyIHN0ciA9IHRoaXMuc3RyZWFtO1xuICAgICAgICB2YXIgY29kZVNpemUgPSB0aGlzLmNvZGVTaXplO1xuICAgICAgICB2YXIgY29kZUJ1ZiA9IHRoaXMuY29kZUJ1ZjtcbiAgICAgICAgdmFyIGI7XG4gICAgICAgIHdoaWxlIChjb2RlU2l6ZSA8IGJpdHMpIHtcbiAgICAgICAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZUJ1ZiB8PSBiIDw8IGNvZGVTaXplO1xuICAgICAgICAgICAgY29kZVNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBiID0gY29kZUJ1ZiAmICgoMSA8PCBiaXRzKSAtIDEpO1xuICAgICAgICB0aGlzLmNvZGVCdWYgPSBjb2RlQnVmID4+IGJpdHM7XG4gICAgICAgIHRoaXMuY29kZVNpemUgPSBjb2RlU2l6ZSAtPSBiaXRzO1xuICAgICAgICByZXR1cm4gYjtcbiAgICB9O1xuICAgIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRDb2RlID0gZnVuY3Rpb24gKHRhYmxlKSB7XG4gICAgICAgIHZhciBzdHIgPSB0aGlzLnN0cmVhbTtcbiAgICAgICAgdmFyIGNvZGVzID0gdGFibGVbMF07XG4gICAgICAgIHZhciBtYXhMZW4gPSB0YWJsZVsxXTtcbiAgICAgICAgdmFyIGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTtcbiAgICAgICAgdmFyIGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7XG4gICAgICAgIHZhciBiO1xuICAgICAgICB3aGlsZSAoY29kZVNpemUgPCBtYXhMZW4pIHtcbiAgICAgICAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIHByZW1hdHVyZSBlbmQgb2Ygc3RyZWFtLiBjb2RlIG1pZ2h0IGhvd2V2ZXIgc3RpbGwgYmUgdmFsaWQuXG4gICAgICAgICAgICAgICAgLy8gY29kZVNpemUgPCBjb2RlTGVuIGNoZWNrIGJlbG93IGd1YXJkcyBhZ2FpbnN0IGluY29tcGxldGUgY29kZVZhbC5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTtcbiAgICAgICAgICAgIGNvZGVTaXplICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGUgPSBjb2Rlc1tjb2RlQnVmICYgKCgxIDw8IG1heExlbikgLSAxKV07XG4gICAgICAgIGlmICh0eXBlb2YgY29kZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRkxBVEU6JywgY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGVMZW4gPSBjb2RlID4+IDE2O1xuICAgICAgICB2YXIgY29kZVZhbCA9IGNvZGUgJiAweGZmZmY7XG4gICAgICAgIGlmIChjb2RlTGVuIDwgMSB8fCBjb2RlU2l6ZSA8IGNvZGVMZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29kZUJ1ZiA9IGNvZGVCdWYgPj4gY29kZUxlbjtcbiAgICAgICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC0gY29kZUxlbjtcbiAgICAgICAgcmV0dXJuIGNvZGVWYWw7XG4gICAgfTtcbiAgICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2VuZXJhdGVIdWZmbWFuVGFibGUgPSBmdW5jdGlvbiAobGVuZ3Rocykge1xuICAgICAgICB2YXIgbiA9IGxlbmd0aHMubGVuZ3RoO1xuICAgICAgICAvLyBmaW5kIG1heCBjb2RlIGxlbmd0aFxuICAgICAgICB2YXIgbWF4TGVuID0gMDtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChsZW5ndGhzW2ldID4gbWF4TGVuKSB7XG4gICAgICAgICAgICAgICAgbWF4TGVuID0gbGVuZ3Roc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBidWlsZCB0aGUgdGFibGVcbiAgICAgICAgdmFyIHNpemUgPSAxIDw8IG1heExlbjtcbiAgICAgICAgdmFyIGNvZGVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gICAgICAgIGZvciAodmFyIGxlbiA9IDEsIGNvZGUgPSAwLCBza2lwID0gMjsgbGVuIDw9IG1heExlbjsgKytsZW4sIGNvZGUgPDw9IDEsIHNraXAgPDw9IDEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHZhbCA9IDA7IHZhbCA8IG47ICsrdmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aHNbdmFsXSA9PT0gbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJpdC1yZXZlcnNlIHRoZSBjb2RlXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2RlMiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ID0gY29kZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlMiA9IChjb2RlMiA8PCAxKSB8ICh0ICYgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ID4+PSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgdGhlIHRhYmxlIGVudHJpZXNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gY29kZTI7IGkgPCBzaXplOyBpICs9IHNraXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzW2ldID0gKGxlbiA8PCAxNikgfCB2YWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKytjb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvZGVzLCBtYXhMZW5dO1xuICAgIH07XG4gICAgcmV0dXJuIEZsYXRlU3RyZWFtO1xufShEZWNvZGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IEZsYXRlU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmxhdGVTdHJlYW0uanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBMWldTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgTFpXU3RyZWFtIGNsYXNzIGluIE1vemlsbGEncyBwZGYuanMgcHJvamVjdCwgbWFkZSBhdmFpbGFibGVcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IERlY29kZVN0cmVhbSBmcm9tIFwiLi9EZWNvZGVTdHJlYW1cIjtcbnZhciBMWldTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKExaV1N0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBMWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgX3RoaXMuY2FjaGVkRGF0YSA9IDA7XG4gICAgICAgIF90aGlzLmJpdHNDYWNoZWQgPSAwO1xuICAgICAgICB2YXIgbWF4THp3RGljdGlvbmFyeVNpemUgPSA0MDk2O1xuICAgICAgICB2YXIgbHp3U3RhdGUgPSB7XG4gICAgICAgICAgICBlYXJseUNoYW5nZTogZWFybHlDaGFuZ2UsXG4gICAgICAgICAgICBjb2RlTGVuZ3RoOiA5LFxuICAgICAgICAgICAgbmV4dENvZGU6IDI1OCxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlWYWx1ZXM6IG5ldyBVaW50OEFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlMZW5ndGhzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLFxuICAgICAgICAgICAgZGljdGlvbmFyeVByZXZDb2RlczogbmV3IFVpbnQxNkFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSxcbiAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZTogbmV3IFVpbnQ4QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLFxuICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoOiAwLFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gICAgICAgICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5VmFsdWVzW2ldID0gaTtcbiAgICAgICAgICAgIGx6d1N0YXRlLmRpY3Rpb25hcnlMZW5ndGhzW2ldID0gMTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5sendTdGF0ZSA9IGx6d1N0YXRlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIExaV1N0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYmxvY2tTaXplID0gNTEyO1xuICAgICAgICB2YXIgZXN0aW1hdGVkRGVjb2RlZFNpemUgPSBibG9ja1NpemUgKiAyO1xuICAgICAgICB2YXIgZGVjb2RlZFNpemVEZWx0YSA9IGJsb2NrU2l6ZTtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciBqO1xuICAgICAgICB2YXIgcTtcbiAgICAgICAgdmFyIGx6d1N0YXRlID0gdGhpcy5sendTdGF0ZTtcbiAgICAgICAgaWYgKCFsendTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBlb2Ygd2FzIGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVhcmx5Q2hhbmdlID0gbHp3U3RhdGUuZWFybHlDaGFuZ2U7XG4gICAgICAgIHZhciBuZXh0Q29kZSA9IGx6d1N0YXRlLm5leHRDb2RlO1xuICAgICAgICB2YXIgZGljdGlvbmFyeVZhbHVlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlWYWx1ZXM7XG4gICAgICAgIHZhciBkaWN0aW9uYXJ5TGVuZ3RocyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlMZW5ndGhzO1xuICAgICAgICB2YXIgZGljdGlvbmFyeVByZXZDb2RlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlQcmV2Q29kZXM7XG4gICAgICAgIHZhciBjb2RlTGVuZ3RoID0gbHp3U3RhdGUuY29kZUxlbmd0aDtcbiAgICAgICAgdmFyIHByZXZDb2RlID0gbHp3U3RhdGUucHJldkNvZGU7XG4gICAgICAgIHZhciBjdXJyZW50U2VxdWVuY2UgPSBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2U7XG4gICAgICAgIHZhciBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGg7XG4gICAgICAgIHZhciBkZWNvZGVkTGVuZ3RoID0gMDtcbiAgICAgICAgdmFyIGN1cnJlbnRCdWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tTaXplOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjb2RlID0gdGhpcy5yZWFkQml0cyhjb2RlTGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBoYXNQcmV2ID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoID4gMDtcbiAgICAgICAgICAgIGlmICghY29kZSB8fCBjb2RlIDwgMjU2KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlWzBdID0gY29kZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29kZSA+PSAyNTgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA8IG5leHRDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IGRpY3Rpb25hcnlMZW5ndGhzW2NvZGVdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBjdXJyZW50U2VxdWVuY2VMZW5ndGggLSAxLCBxID0gY29kZTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVtqXSA9IGRpY3Rpb25hcnlWYWx1ZXNbcV07XG4gICAgICAgICAgICAgICAgICAgICAgICBxID0gZGljdGlvbmFyeVByZXZDb2Rlc1txXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlW2N1cnJlbnRTZXF1ZW5jZUxlbmd0aCsrXSA9IGN1cnJlbnRTZXF1ZW5jZVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2RlID09PSAyNTYpIHtcbiAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoID0gOTtcbiAgICAgICAgICAgICAgICBuZXh0Q29kZSA9IDI1ODtcbiAgICAgICAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmx6d1N0YXRlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc1ByZXYpIHtcbiAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzW25leHRDb2RlXSA9IHByZXZDb2RlO1xuICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlMZW5ndGhzW25leHRDb2RlXSA9IGRpY3Rpb25hcnlMZW5ndGhzW3ByZXZDb2RlXSArIDE7XG4gICAgICAgICAgICAgICAgZGljdGlvbmFyeVZhbHVlc1tuZXh0Q29kZV0gPSBjdXJyZW50U2VxdWVuY2VbMF07XG4gICAgICAgICAgICAgICAgbmV4dENvZGUrKztcbiAgICAgICAgICAgICAgICBjb2RlTGVuZ3RoID1cbiAgICAgICAgICAgICAgICAgICAgKG5leHRDb2RlICsgZWFybHlDaGFuZ2UpICYgKG5leHRDb2RlICsgZWFybHlDaGFuZ2UgLSAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjb2RlTGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWluKE1hdGgubG9nKG5leHRDb2RlICsgZWFybHlDaGFuZ2UpIC8gMC42OTMxNDcxODA1NTk5NDUzICsgMSwgMTIpIHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZDb2RlID0gY29kZTtcbiAgICAgICAgICAgIGRlY29kZWRMZW5ndGggKz0gY3VycmVudFNlcXVlbmNlTGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVzdGltYXRlZERlY29kZWRTaXplIDwgZGVjb2RlZExlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkRGVjb2RlZFNpemUgKz0gZGVjb2RlZFNpemVEZWx0YTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChlc3RpbWF0ZWREZWNvZGVkU2l6ZSA8IGRlY29kZWRMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2N1cnJlbnRCdWZmZXJMZW5ndGgrK10gPSBjdXJyZW50U2VxdWVuY2Vbal07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbHp3U3RhdGUubmV4dENvZGUgPSBuZXh0Q29kZTtcbiAgICAgICAgbHp3U3RhdGUuY29kZUxlbmd0aCA9IGNvZGVMZW5ndGg7XG4gICAgICAgIGx6d1N0YXRlLnByZXZDb2RlID0gcHJldkNvZGU7XG4gICAgICAgIGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDtcbiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBjdXJyZW50QnVmZmVyTGVuZ3RoO1xuICAgIH07XG4gICAgTFpXU3RyZWFtLnByb3RvdHlwZS5yZWFkQml0cyA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHZhciBiaXRzQ2FjaGVkID0gdGhpcy5iaXRzQ2FjaGVkO1xuICAgICAgICB2YXIgY2FjaGVkRGF0YSA9IHRoaXMuY2FjaGVkRGF0YTtcbiAgICAgICAgd2hpbGUgKGJpdHNDYWNoZWQgPCBuKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgICAgIGlmIChjID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhY2hlZERhdGEgPSAoY2FjaGVkRGF0YSA8PCA4KSB8IGM7XG4gICAgICAgICAgICBiaXRzQ2FjaGVkICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaXRzQ2FjaGVkID0gYml0c0NhY2hlZCAtPSBuO1xuICAgICAgICB0aGlzLmNhY2hlZERhdGEgPSBjYWNoZWREYXRhO1xuICAgICAgICByZXR1cm4gKGNhY2hlZERhdGEgPj4+IGJpdHNDYWNoZWQpICYgKCgxIDw8IG4pIC0gMSk7XG4gICAgfTtcbiAgICByZXR1cm4gTFpXU3RyZWFtO1xufShEZWNvZGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IExaV1N0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxaV1N0cmVhbS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIFJ1bkxlbmd0aFN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBSdW5MZW5ndGhTdHJlYW0gY2xhc3MgaW4gTW96aWxsYSdzIHBkZi5qcyBwcm9qZWN0LCBtYWRlIGF2YWlsYWJsZVxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2UgbGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgRGVjb2RlU3RyZWFtIGZyb20gXCIuL0RlY29kZVN0cmVhbVwiO1xudmFyIFJ1bkxlbmd0aFN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUnVuTGVuZ3RoU3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJ1bkxlbmd0aFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUnVuTGVuZ3RoU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFRoZSByZXBlYXRIZWFkZXIgaGFzIGZvbGxvd2luZyBmb3JtYXQuIFRoZSBmaXJzdCBieXRlIGRlZmluZXMgdHlwZSBvZiBydW5cbiAgICAgICAgLy8gYW5kIGFtb3VudCBvZiBieXRlcyB0byByZXBlYXQvY29weTogbiA9IDAgdGhyb3VnaCAxMjcgLSBjb3B5IG5leHQgbiBieXRlc1xuICAgICAgICAvLyAoaW4gYWRkaXRpb24gdG8gdGhlIHNlY29uZCBieXRlIGZyb20gdGhlIGhlYWRlciksIG4gPSAxMjkgdGhyb3VnaCAyNTUgLVxuICAgICAgICAvLyBkdXBsaWNhdGUgdGhlIHNlY29uZCBieXRlIGZyb20gdGhlIGhlYWRlciAoMjU3IC0gbikgdGltZXMsIG4gPSAxMjggLSBlbmQuXG4gICAgICAgIHZhciByZXBlYXRIZWFkZXIgPSB0aGlzLnN0cmVhbS5nZXRCeXRlcygyKTtcbiAgICAgICAgaWYgKCFyZXBlYXRIZWFkZXIgfHwgcmVwZWF0SGVhZGVyLmxlbmd0aCA8IDIgfHwgcmVwZWF0SGVhZGVyWzBdID09PSAxMjgpIHtcbiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYnVmZmVyO1xuICAgICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgIHZhciBuID0gcmVwZWF0SGVhZGVyWzBdO1xuICAgICAgICBpZiAobiA8IDEyOCkge1xuICAgICAgICAgICAgLy8gY29weSBuIGJ5dGVzXG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuICsgMSk7XG4gICAgICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gcmVwZWF0SGVhZGVyWzFdO1xuICAgICAgICAgICAgaWYgKG4gPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuc3RyZWFtLmdldEJ5dGVzKG4pO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXQoc291cmNlLCBidWZmZXJMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlckxlbmd0aCArPSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbiA9IDI1NyAtIG47XG4gICAgICAgICAgICB2YXIgYiA9IHJlcGVhdEhlYWRlclsxXTtcbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIG4gKyAxKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IGI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7XG4gICAgfTtcbiAgICByZXR1cm4gUnVuTGVuZ3RoU3RyZWFtO1xufShEZWNvZGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IFJ1bkxlbmd0aFN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJ1bkxlbmd0aFN0cmVhbS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIFN0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBTdHJlYW0gY2xhc3MgaW4gTW96aWxsYSdzIHBkZi5qcyBwcm9qZWN0LCBtYWRlIGF2YWlsYWJsZVxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2UgbGljZW5zZS5cbiAqL1xudmFyIFN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdHJlYW0oYnVmZmVyLCBzdGFydCwgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBidWZmZXI7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydCB8fCAwO1xuICAgICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIHRoaXMuZW5kID0gISFzdGFydCAmJiAhIWxlbmd0aCA/IHN0YXJ0ICsgbGVuZ3RoIDogdGhpcy5ieXRlcy5sZW5ndGg7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJlYW0ucHJvdG90eXBlLCBcImxlbmd0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5kIC0gdGhpcy5zdGFydDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJlYW0ucHJvdG90eXBlLCBcImlzRW1wdHlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFN0cmVhbS5wcm90b3R5cGUuZ2V0Qnl0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMuZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK107XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLmdldFVpbnQxNiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYjAgPDwgOCkgKyBiMTtcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUuZ2V0SW50MzIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIyID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMyA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMztcbiAgICB9O1xuICAgIC8vIFJldHVybnMgc3ViYXJyYXkgb2Ygb3JpZ2luYWwgYnVmZmVyLCBzaG91bGQgb25seSBiZSByZWFkLlxuICAgIFN0cmVhbS5wcm90b3R5cGUuZ2V0Qnl0ZXMgPSBmdW5jdGlvbiAobGVuZ3RoLCBmb3JjZUNsYW1wZWQpIHtcbiAgICAgICAgaWYgKGZvcmNlQ2xhbXBlZCA9PT0gdm9pZCAwKSB7IGZvcmNlQ2xhbXBlZCA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBieXRlcyA9IHRoaXMuYnl0ZXM7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgdmFyIHN0ckVuZCA9IHRoaXMuZW5kO1xuICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHN1YmFycmF5ID0gYnl0ZXMuc3ViYXJyYXkocG9zLCBzdHJFbmQpO1xuICAgICAgICAgICAgLy8gYHRoaXMuYnl0ZXNgIGlzIGFsd2F5cyBhIGBVaW50OEFycmF5YCBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIGZvcmNlQ2xhbXBlZCA/IG5ldyBVaW50OENsYW1wZWRBcnJheShzdWJhcnJheSkgOiBzdWJhcnJheTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBlbmQgPSBwb3MgKyBsZW5ndGg7XG4gICAgICAgICAgICBpZiAoZW5kID4gc3RyRW5kKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gc3RyRW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgICAgICB2YXIgc3ViYXJyYXkgPSBieXRlcy5zdWJhcnJheShwb3MsIGVuZCk7XG4gICAgICAgICAgICAvLyBgdGhpcy5ieXRlc2AgaXMgYWx3YXlzIGEgYFVpbnQ4QXJyYXlgIGhlcmUuXG4gICAgICAgICAgICByZXR1cm4gZm9yY2VDbGFtcGVkID8gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN1YmFycmF5KSA6IHN1YmFycmF5O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLnBlZWtCeXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGVla2VkQnl0ZSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB0aGlzLnBvcy0tO1xuICAgICAgICByZXR1cm4gcGVla2VkQnl0ZTtcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUucGVla0J5dGVzID0gZnVuY3Rpb24gKGxlbmd0aCwgZm9yY2VDbGFtcGVkKSB7XG4gICAgICAgIGlmIChmb3JjZUNsYW1wZWQgPT09IHZvaWQgMCkgeyBmb3JjZUNsYW1wZWQgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZm9yY2VDbGFtcGVkKTtcbiAgICAgICAgdGhpcy5wb3MgLT0gYnl0ZXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiAobikge1xuICAgICAgICBpZiAoIW4pIHtcbiAgICAgICAgICAgIG4gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zICs9IG47XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLm1vdmVTdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdGFydCA9IHRoaXMucG9zO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5tYWtlU3ViU3RyZWFtID0gZnVuY3Rpb24gKHN0YXJ0LCBsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5ieXRlcywgc3RhcnQsIGxlbmd0aCk7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXM7XG4gICAgfTtcbiAgICByZXR1cm4gU3RyZWFtO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yLCBVbnN1cHBvcnRlZEVuY29kaW5nRXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IEFzY2lpODVTdHJlYW0gZnJvbSBcIi4vQXNjaWk4NVN0cmVhbVwiO1xuaW1wb3J0IEFzY2lpSGV4U3RyZWFtIGZyb20gXCIuL0FzY2lpSGV4U3RyZWFtXCI7XG5pbXBvcnQgRmxhdGVTdHJlYW0gZnJvbSBcIi4vRmxhdGVTdHJlYW1cIjtcbmltcG9ydCBMWldTdHJlYW0gZnJvbSBcIi4vTFpXU3RyZWFtXCI7XG5pbXBvcnQgUnVuTGVuZ3RoU3RyZWFtIGZyb20gXCIuL1J1bkxlbmd0aFN0cmVhbVwiO1xuaW1wb3J0IFN0cmVhbSBmcm9tIFwiLi9TdHJlYW1cIjtcbnZhciBkZWNvZGVTdHJlYW0gPSBmdW5jdGlvbiAoc3RyZWFtLCBlbmNvZGluZywgcGFyYW1zKSB7XG4gICAgaWYgKGVuY29kaW5nID09PSBQREZOYW1lLm9mKCdGbGF0ZURlY29kZScpKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmxhdGVTdHJlYW0oc3RyZWFtKTtcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nID09PSBQREZOYW1lLm9mKCdMWldEZWNvZGUnKSkge1xuICAgICAgICB2YXIgZWFybHlDaGFuZ2UgPSAxO1xuICAgICAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgUERGRGljdCkge1xuICAgICAgICAgICAgdmFyIEVhcmx5Q2hhbmdlID0gcGFyYW1zLmxvb2t1cChQREZOYW1lLm9mKCdFYXJseUNoYW5nZScpKTtcbiAgICAgICAgICAgIGlmIChFYXJseUNoYW5nZSBpbnN0YW5jZW9mIFBERk51bWJlcikge1xuICAgICAgICAgICAgICAgIGVhcmx5Q2hhbmdlID0gRWFybHlDaGFuZ2UuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IExaV1N0cmVhbShzdHJlYW0sIHVuZGVmaW5lZCwgZWFybHlDaGFuZ2UpO1xuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgPT09IFBERk5hbWUub2YoJ0FTQ0lJODVEZWNvZGUnKSkge1xuICAgICAgICByZXR1cm4gbmV3IEFzY2lpODVTdHJlYW0oc3RyZWFtKTtcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nID09PSBQREZOYW1lLm9mKCdBU0NJSUhleERlY29kZScpKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXNjaWlIZXhTdHJlYW0oc3RyZWFtKTtcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nID09PSBQREZOYW1lLm9mKCdSdW5MZW5ndGhEZWNvZGUnKSkge1xuICAgICAgICByZXR1cm4gbmV3IFJ1bkxlbmd0aFN0cmVhbShzdHJlYW0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFbmNvZGluZ0Vycm9yKGVuY29kaW5nLmFzU3RyaW5nKCkpO1xufTtcbmV4cG9ydCB2YXIgZGVjb2RlUERGUmF3U3RyZWFtID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGRpY3QgPSBfYS5kaWN0LCBjb250ZW50cyA9IF9hLmNvbnRlbnRzO1xuICAgIHZhciBzdHJlYW0gPSBuZXcgU3RyZWFtKGNvbnRlbnRzKTtcbiAgICB2YXIgRmlsdGVyID0gZGljdC5sb29rdXAoUERGTmFtZS5vZignRmlsdGVyJykpO1xuICAgIHZhciBEZWNvZGVQYXJtcyA9IGRpY3QubG9va3VwKFBERk5hbWUub2YoJ0RlY29kZVBhcm1zJykpO1xuICAgIGlmIChGaWx0ZXIgaW5zdGFuY2VvZiBQREZOYW1lKSB7XG4gICAgICAgIHN0cmVhbSA9IGRlY29kZVN0cmVhbShzdHJlYW0sIEZpbHRlciwgRGVjb2RlUGFybXMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChGaWx0ZXIgaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBGaWx0ZXIuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBzdHJlYW0gPSBkZWNvZGVTdHJlYW0oc3RyZWFtLCBGaWx0ZXIubG9va3VwKGlkeCwgUERGTmFtZSksIERlY29kZVBhcm1zICYmIERlY29kZVBhcm1zLmxvb2t1cE1heWJlKGlkeCwgUERGRGljdCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKCEhRmlsdGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yKFtQREZOYW1lLCBQREZBcnJheV0sIEZpbHRlcik7XG4gICAgfVxuICAgIHJldHVybiBzdHJlYW07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVjb2RlLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IHsgUERGQWNyb0Zvcm0gfSBmcm9tIFwiLi4vYWNyb2Zvcm1cIjtcbmltcG9ydCBWaWV3ZXJQcmVmZXJlbmNlcyBmcm9tICcuLi9pbnRlcmFjdGl2ZS9WaWV3ZXJQcmVmZXJlbmNlcyc7XG52YXIgUERGQ2F0YWxvZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQ2F0YWxvZywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZDYXRhbG9nKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLlBhZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXAoUERGTmFtZS5vZignUGFnZXMnKSwgUERGRGljdCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5BY3JvRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5vZignQWNyb0Zvcm0nKSwgUERGRGljdCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5nZXRBY3JvRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLkFjcm9Gb3JtKCk7XG4gICAgICAgIGlmICghZGljdClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBQREZBY3JvRm9ybS5mcm9tRGljdChkaWN0KTtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLmdldE9yQ3JlYXRlQWNyb0Zvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhY3JvRm9ybSA9IHRoaXMuZ2V0QWNyb0Zvcm0oKTtcbiAgICAgICAgaWYgKCFhY3JvRm9ybSkge1xuICAgICAgICAgICAgYWNyb0Zvcm0gPSBQREZBY3JvRm9ybS5jcmVhdGUodGhpcy5jb250ZXh0KTtcbiAgICAgICAgICAgIHZhciBhY3JvRm9ybVJlZiA9IHRoaXMuY29udGV4dC5yZWdpc3RlcihhY3JvRm9ybS5kaWN0KTtcbiAgICAgICAgICAgIHRoaXMuc2V0KFBERk5hbWUub2YoJ0Fjcm9Gb3JtJyksIGFjcm9Gb3JtUmVmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNyb0Zvcm07XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5WaWV3ZXJQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5vZignVmlld2VyUHJlZmVyZW5jZXMnKSwgUERGRGljdCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5nZXRWaWV3ZXJQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLlZpZXdlclByZWZlcmVuY2VzKCk7XG4gICAgICAgIGlmICghZGljdClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBWaWV3ZXJQcmVmZXJlbmNlcy5mcm9tRGljdChkaWN0KTtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2aWV3ZXJQcmVmcyA9IHRoaXMuZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKTtcbiAgICAgICAgaWYgKCF2aWV3ZXJQcmVmcykge1xuICAgICAgICAgICAgdmlld2VyUHJlZnMgPSBWaWV3ZXJQcmVmZXJlbmNlcy5jcmVhdGUodGhpcy5jb250ZXh0KTtcbiAgICAgICAgICAgIHZhciB2aWV3ZXJQcmVmc1JlZiA9IHRoaXMuY29udGV4dC5yZWdpc3Rlcih2aWV3ZXJQcmVmcy5kaWN0KTtcbiAgICAgICAgICAgIHRoaXMuc2V0KFBERk5hbWUub2YoJ1ZpZXdlclByZWZlcmVuY2VzJyksIHZpZXdlclByZWZzUmVmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlld2VyUHJlZnM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSBnaXZlbiByZWYgYXMgYSBsZWFmIG5vZGUgb2YgdGhpcyBjYXRhbG9nJ3MgcGFnZSB0cmVlIGF0IHRoZVxuICAgICAqIHNwZWNpZmllZCBpbmRleCAoemVyby1iYXNlZCkuIEFsc28gaW5jcmVtZW50cyB0aGUgYENvdW50YCBvZiBlYWNoIG5vZGUgaW5cbiAgICAgKiB0aGUgcGFnZSB0cmVlIGhpZXJhcmNoeSB0byBhY2NvbW9kYXRlIHRoZSBuZXcgcGFnZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdGhlIHJlZiBvZiB0aGUgUERGUGFnZVRyZWUgbm9kZSBpbnRvIHdoaWNoIGBsZWFmUmVmYCB3YXMgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuaW5zZXJ0TGVhZk5vZGUgPSBmdW5jdGlvbiAobGVhZlJlZiwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHBhZ2VzUmVmID0gdGhpcy5nZXQoUERGTmFtZS5vZignUGFnZXMnKSk7XG4gICAgICAgIHZhciBtYXliZVBhcmVudFJlZiA9IHRoaXMuUGFnZXMoKS5pbnNlcnRMZWFmTm9kZShsZWFmUmVmLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBtYXliZVBhcmVudFJlZiB8fCBwYWdlc1JlZjtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLnJlbW92ZUxlYWZOb2RlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHRoaXMuUGFnZXMoKS5yZW1vdmVMZWFmTm9kZShpbmRleCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLndpdGhDb250ZXh0QW5kUGFnZXMgPSBmdW5jdGlvbiAoY29udGV4dCwgcGFnZXMpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBuZXcgTWFwKCk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ1R5cGUnKSwgUERGTmFtZS5vZignQ2F0YWxvZycpKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignUGFnZXMnKSwgcGFnZXMpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkNhdGFsb2coZGljdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBQREZDYXRhbG9nLmZyb21NYXBXaXRoQ29udGV4dCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZDYXRhbG9nKG1hcCwgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQ2F0YWxvZztcbn0oUERGRGljdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQ2F0YWxvZztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkNhdGFsb2cuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRmxhdGVTdHJlYW0gZnJvbSBcIi4vUERGRmxhdGVTdHJlYW1cIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbnZhciBQREZDb250ZW50U3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZDb250ZW50U3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkNvbnRlbnRTdHJlYW0oZGljdCwgb3BlcmF0b3JzLCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGljdCwgZW5jb2RlKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vcGVyYXRvcnMgPSBvcGVyYXRvcnM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGQ29udGVudFN0cmVhbS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgb3BlcmF0b3JzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBvcGVyYXRvcnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLm9wZXJhdG9ycykucHVzaC5hcHBseShfYSwgb3BlcmF0b3JzKTtcbiAgICB9O1xuICAgIFBERkNvbnRlbnRTdHJlYW0ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIG9wZXJhdG9ycyA9IG5ldyBBcnJheSh0aGlzLm9wZXJhdG9ycy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG9wZXJhdG9yc1tpZHhdID0gdGhpcy5vcGVyYXRvcnNbaWR4XS5jbG9uZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2EgPSB0aGlzLCBkaWN0ID0gX2EuZGljdCwgZW5jb2RlID0gX2EuZW5jb2RlO1xuICAgICAgICByZXR1cm4gUERGQ29udGVudFN0cmVhbS5vZihkaWN0LmNsb25lKGNvbnRleHQpLCBvcGVyYXRvcnMsIGVuY29kZSk7XG4gICAgfTtcbiAgICBQREZDb250ZW50U3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy5vcGVyYXRvcnNbaWR4XSArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGQ29udGVudFN0cmVhbS5wcm90b3R5cGUuZ2V0VW5lbmNvZGVkQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0aGlzLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSgpKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRoaXMub3BlcmF0b3JzW2lkeF0uY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9O1xuICAgIFBERkNvbnRlbnRTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNpemUgPSAwO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHNpemUgKz0gdGhpcy5vcGVyYXRvcnNbaWR4XS5zaXplSW5CeXRlcygpICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9O1xuICAgIFBERkNvbnRlbnRTdHJlYW0ub2YgPSBmdW5jdGlvbiAoZGljdCwgb3BlcmF0b3JzLCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZDb250ZW50U3RyZWFtKGRpY3QsIG9wZXJhdG9ycywgZW5jb2RlKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZDb250ZW50U3RyZWFtO1xufShQREZGbGF0ZVN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQ29udGVudFN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkNvbnRlbnRTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERkZsYXRlU3RyZWFtIGZyb20gXCIuL1BERkZsYXRlU3RyZWFtXCI7XG5pbXBvcnQgeyBieXRlc0ZvciwgQ2FjaGUsIHJldmVyc2VBcnJheSwgc2l6ZUluQnl0ZXMsIHN1bSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuZXhwb3J0IHZhciBFbnRyeVR5cGU7XG4oZnVuY3Rpb24gKEVudHJ5VHlwZSkge1xuICAgIEVudHJ5VHlwZVtFbnRyeVR5cGVbXCJEZWxldGVkXCJdID0gMF0gPSBcIkRlbGV0ZWRcIjtcbiAgICBFbnRyeVR5cGVbRW50cnlUeXBlW1wiVW5jb21wcmVzc2VkXCJdID0gMV0gPSBcIlVuY29tcHJlc3NlZFwiO1xuICAgIEVudHJ5VHlwZVtFbnRyeVR5cGVbXCJDb21wcmVzc2VkXCJdID0gMl0gPSBcIkNvbXByZXNzZWRcIjtcbn0pKEVudHJ5VHlwZSB8fCAoRW50cnlUeXBlID0ge30pKTtcbi8qKlxuICogRW50cmllcyBzaG91bGQgYmUgYWRkZWQgdXNpbmcgdGhlIFtbYWRkRGVsZXRlZEVudHJ5XV0sXG4gKiBbW2FkZFVuY29tcHJlc3NlZEVudHJ5XV0sIGFuZCBbW2FkZENvbXByZXNzZWRFbnRyeV1dIG1ldGhvZHNcbiAqICoqaW4gb3JkZXIgb2YgYXNjZW5kaW5nIG9iamVjdCBudW1iZXIqKi5cbiAqL1xudmFyIFBERkNyb3NzUmVmU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZDcm9zc1JlZlN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZDcm9zc1JlZlN0cmVhbShkaWN0LCBlbnRyaWVzLCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGljdCwgZW5jb2RlKSB8fCB0aGlzO1xuICAgICAgICAvLyBSZXR1cm5zIGFuIGFycmF5IG9mIGludGVnZXIgcGFpcnMgZm9yIGVhY2ggc3Vic2VjdGlvbiBvZiB0aGUgY3Jvc3MgcmVmXG4gICAgICAgIC8vIHNlY3Rpb24sIHdoZXJlIGVhY2ggaW50ZWdlciBwYWlyIHJlcHJlc2VudHM6XG4gICAgICAgIC8vICAgZmlyc3RPYmplY3ROdW1iZXIoT2ZTZWN0aW9uKSwgbGVuZ3RoKE9mU2VjdGlvbilcbiAgICAgICAgX3RoaXMuY29tcHV0ZUluZGV4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHN1YnNlY3Rpb25zID0gW107XG4gICAgICAgICAgICB2YXIgc3Vic2VjdGlvbkxlbmd0aCA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBfdGhpcy5lbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBjdXJyRW50cnkgPSBfdGhpcy5lbnRyaWVzW2lkeF07XG4gICAgICAgICAgICAgICAgdmFyIHByZXZFbnRyeSA9IF90aGlzLmVudHJpZXNbaWR4IC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzdWJzZWN0aW9ucy5wdXNoKGN1cnJFbnRyeS5yZWYub2JqZWN0TnVtYmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyckVudHJ5LnJlZi5vYmplY3ROdW1iZXIgLSBwcmV2RW50cnkucmVmLm9iamVjdE51bWJlciA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2VjdGlvbnMucHVzaChzdWJzZWN0aW9uTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2VjdGlvbnMucHVzaChjdXJyRW50cnkucmVmLm9iamVjdE51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNlY3Rpb25MZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdWJzZWN0aW9uTGVuZ3RoICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJzZWN0aW9ucy5wdXNoKHN1YnNlY3Rpb25MZW5ndGgpO1xuICAgICAgICAgICAgcmV0dXJuIHN1YnNlY3Rpb25zO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5jb21wdXRlRW50cnlUdXBsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZW50cnlUdXBsZXMgPSBuZXcgQXJyYXkoX3RoaXMuZW50cmllcy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gX3RoaXMuZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBfdGhpcy5lbnRyaWVzW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09IEVudHJ5VHlwZS5EZWxldGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gZW50cnkudHlwZSwgbmV4dEZyZWVPYmplY3ROdW1iZXIgPSBlbnRyeS5uZXh0RnJlZU9iamVjdE51bWJlciwgcmVmID0gZW50cnkucmVmO1xuICAgICAgICAgICAgICAgICAgICBlbnRyeVR1cGxlc1tpZHhdID0gW3R5cGUsIG5leHRGcmVlT2JqZWN0TnVtYmVyLCByZWYuZ2VuZXJhdGlvbk51bWJlcl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbnRyeS50eXBlID09PSBFbnRyeVR5cGUuVW5jb21wcmVzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gZW50cnkudHlwZSwgb2Zmc2V0ID0gZW50cnkub2Zmc2V0LCByZWYgPSBlbnRyeS5yZWY7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5VHVwbGVzW2lkeF0gPSBbdHlwZSwgb2Zmc2V0LCByZWYuZ2VuZXJhdGlvbk51bWJlcl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbnRyeS50eXBlID09PSBFbnRyeVR5cGUuQ29tcHJlc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGVudHJ5LnR5cGUsIG9iamVjdFN0cmVhbVJlZiA9IGVudHJ5Lm9iamVjdFN0cmVhbVJlZiwgaW5kZXggPSBlbnRyeS5pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgZW50cnlUdXBsZXNbaWR4XSA9IFt0eXBlLCBvYmplY3RTdHJlYW1SZWYub2JqZWN0TnVtYmVyLCBpbmRleF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5VHVwbGVzO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5jb21wdXRlTWF4RW50cnlCeXRlV2lkdGhzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGVudHJ5VHVwbGVzID0gX3RoaXMuZW50cnlUdXBsZXNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgICAgIHZhciB3aWR0aHMgPSBbMCwgMCwgMF07XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyeVR1cGxlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBlbnRyeVR1cGxlc1tpZHhdLCBmaXJzdCA9IF9hWzBdLCBzZWNvbmQgPSBfYVsxXSwgdGhpcmQgPSBfYVsyXTtcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3RTaXplID0gc2l6ZUluQnl0ZXMoZmlyc3QpO1xuICAgICAgICAgICAgICAgIHZhciBzZWNvbmRTaXplID0gc2l6ZUluQnl0ZXMoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcmRTaXplID0gc2l6ZUluQnl0ZXModGhpcmQpO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdFNpemUgPiB3aWR0aHNbMF0pXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoc1swXSA9IGZpcnN0U2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAoc2Vjb25kU2l6ZSA+IHdpZHRoc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhzWzFdID0gc2Vjb25kU2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcmRTaXplID4gd2lkdGhzWzJdKVxuICAgICAgICAgICAgICAgICAgICB3aWR0aHNbMl0gPSB0aGlyZFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd2lkdGhzO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5lbnRyaWVzID0gZW50cmllcyB8fCBbXTtcbiAgICAgICAgX3RoaXMuZW50cnlUdXBsZXNDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KF90aGlzLmNvbXB1dGVFbnRyeVR1cGxlcyk7XG4gICAgICAgIF90aGlzLm1heEJ5dGVXaWR0aHNDYWNoZSA9IENhY2hlLnBvcHVsYXRlZEJ5KF90aGlzLmNvbXB1dGVNYXhFbnRyeUJ5dGVXaWR0aHMpO1xuICAgICAgICBfdGhpcy5pbmRleENhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkoX3RoaXMuY29tcHV0ZUluZGV4KTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignVHlwZScpLCBQREZOYW1lLm9mKCdYUmVmJykpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS5hZGREZWxldGVkRW50cnkgPSBmdW5jdGlvbiAocmVmLCBuZXh0RnJlZU9iamVjdE51bWJlcikge1xuICAgICAgICB2YXIgdHlwZSA9IEVudHJ5VHlwZS5EZWxldGVkO1xuICAgICAgICB0aGlzLmVudHJpZXMucHVzaCh7IHR5cGU6IHR5cGUsIHJlZjogcmVmLCBuZXh0RnJlZU9iamVjdE51bWJlcjogbmV4dEZyZWVPYmplY3ROdW1iZXIgfSk7XG4gICAgICAgIHRoaXMuZW50cnlUdXBsZXNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5pbmRleENhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5jb250ZW50c0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS5hZGRVbmNvbXByZXNzZWRFbnRyeSA9IGZ1bmN0aW9uIChyZWYsIG9mZnNldCkge1xuICAgICAgICB2YXIgdHlwZSA9IEVudHJ5VHlwZS5VbmNvbXByZXNzZWQ7XG4gICAgICAgIHRoaXMuZW50cmllcy5wdXNoKHsgdHlwZTogdHlwZSwgcmVmOiByZWYsIG9mZnNldDogb2Zmc2V0IH0pO1xuICAgICAgICB0aGlzLmVudHJ5VHVwbGVzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuaW5kZXhDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuY29udGVudHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuYWRkQ29tcHJlc3NlZEVudHJ5ID0gZnVuY3Rpb24gKHJlZiwgb2JqZWN0U3RyZWFtUmVmLCBpbmRleCkge1xuICAgICAgICB2YXIgdHlwZSA9IEVudHJ5VHlwZS5Db21wcmVzc2VkO1xuICAgICAgICB0aGlzLmVudHJpZXMucHVzaCh7IHR5cGU6IHR5cGUsIHJlZjogcmVmLCBvYmplY3RTdHJlYW1SZWY6IG9iamVjdFN0cmVhbVJlZiwgaW5kZXg6IGluZGV4IH0pO1xuICAgICAgICB0aGlzLmVudHJ5VHVwbGVzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuaW5kZXhDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMuY29udGVudHNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBkaWN0ID0gX2EuZGljdCwgZW50cmllcyA9IF9hLmVudHJpZXMsIGVuY29kZSA9IF9hLmVuY29kZTtcbiAgICAgICAgcmV0dXJuIFBERkNyb3NzUmVmU3RyZWFtLm9mKGRpY3QuY2xvbmUoY29udGV4dCksIGVudHJpZXMuc2xpY2UoKSwgZW5jb2RlKTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVudHJ5VHVwbGVzID0gdGhpcy5lbnRyeVR1cGxlc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgYnl0ZVdpZHRocyA9IHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgZm9yICh2YXIgZW50cnlJZHggPSAwLCBlbnRyaWVzTGVuID0gZW50cnlUdXBsZXMubGVuZ3RoOyBlbnRyeUlkeCA8IGVudHJpZXNMZW47IGVudHJ5SWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJ5VHVwbGVzW2VudHJ5SWR4XSwgZmlyc3QgPSBfYVswXSwgc2Vjb25kID0gX2FbMV0sIHRoaXJkID0gX2FbMl07XG4gICAgICAgICAgICB2YXIgZmlyc3RCeXRlcyA9IHJldmVyc2VBcnJheShieXRlc0ZvcihmaXJzdCkpO1xuICAgICAgICAgICAgdmFyIHNlY29uZEJ5dGVzID0gcmV2ZXJzZUFycmF5KGJ5dGVzRm9yKHNlY29uZCkpO1xuICAgICAgICAgICAgdmFyIHRoaXJkQnl0ZXMgPSByZXZlcnNlQXJyYXkoYnl0ZXNGb3IodGhpcmQpKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IGJ5dGVXaWR0aHNbMF0gLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAoZmlyc3RCeXRlc1tpZHhdIHx8IDApLnRvU3RyaW5nKDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gYnl0ZVdpZHRoc1sxXSAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IChzZWNvbmRCeXRlc1tpZHhdIHx8IDApLnRvU3RyaW5nKDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gYnl0ZVdpZHRoc1syXSAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICAgICAgICAgIHZhbHVlICs9ICh0aGlyZEJ5dGVzW2lkeF0gfHwgMCkudG9TdHJpbmcoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZW50cnlUdXBsZXMgPSB0aGlzLmVudHJ5VHVwbGVzQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIHZhciBieXRlV2lkdGhzID0gdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0aGlzLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSgpKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAodmFyIGVudHJ5SWR4ID0gMCwgZW50cmllc0xlbiA9IGVudHJ5VHVwbGVzLmxlbmd0aDsgZW50cnlJZHggPCBlbnRyaWVzTGVuOyBlbnRyeUlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyeVR1cGxlc1tlbnRyeUlkeF0sIGZpcnN0ID0gX2FbMF0sIHNlY29uZCA9IF9hWzFdLCB0aGlyZCA9IF9hWzJdO1xuICAgICAgICAgICAgdmFyIGZpcnN0Qnl0ZXMgPSByZXZlcnNlQXJyYXkoYnl0ZXNGb3IoZmlyc3QpKTtcbiAgICAgICAgICAgIHZhciBzZWNvbmRCeXRlcyA9IHJldmVyc2VBcnJheShieXRlc0ZvcihzZWNvbmQpKTtcbiAgICAgICAgICAgIHZhciB0aGlyZEJ5dGVzID0gcmV2ZXJzZUFycmF5KGJ5dGVzRm9yKHRoaXJkKSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSBieXRlV2lkdGhzWzBdIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGZpcnN0Qnl0ZXNbaWR4XSB8fCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gYnl0ZVdpZHRoc1sxXSAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBzZWNvbmRCeXRlc1tpZHhdIHx8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSBieXRlV2lkdGhzWzJdIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IHRoaXJkQnl0ZXNbaWR4XSB8fCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuZ2V0VW5lbmNvZGVkQ29udGVudHNTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZVdpZHRocyA9IHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgZW50cnlXaWR0aCA9IHN1bShieXRlV2lkdGhzKTtcbiAgICAgICAgcmV0dXJuIGVudHJ5V2lkdGggKiB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLnVwZGF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUudXBkYXRlRGljdC5jYWxsKHRoaXMpO1xuICAgICAgICB2YXIgYnl0ZVdpZHRocyA9IHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4Q2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5kaWN0LmNvbnRleHQ7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVycpLCBjb250ZXh0Lm9iaihieXRlV2lkdGhzKSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignSW5kZXgnKSwgY29udGV4dC5vYmooaW5kZXgpKTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLmNyZWF0ZSA9IGZ1bmN0aW9uIChkaWN0LCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBQREZDcm9zc1JlZlN0cmVhbShkaWN0LCBbXSwgZW5jb2RlKTtcbiAgICAgICAgc3RyZWFtLmFkZERlbGV0ZWRFbnRyeShQREZSZWYub2YoMCwgNjU1MzUpLCAwKTtcbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLm9mID0gZnVuY3Rpb24gKGRpY3QsIGVudHJpZXMsIGVuY29kZSkge1xuICAgICAgICBpZiAoZW5jb2RlID09PSB2b2lkIDApIHsgZW5jb2RlID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gbmV3IFBERkNyb3NzUmVmU3RyZWFtKGRpY3QsIGVudHJpZXMsIGVuY29kZSk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQ3Jvc3NSZWZTdHJlYW07XG59KFBERkZsYXRlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBQREZDcm9zc1JlZlN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkNyb3NzUmVmU3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHBha28gZnJvbSAncGFrbyc7XG5pbXBvcnQgeyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERlN0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJlYW1cIjtcbmltcG9ydCB7IENhY2hlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGRmxhdGVTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkZsYXRlU3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkZsYXRlU3RyZWFtKGRpY3QsIGVuY29kZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkaWN0KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb21wdXRlQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdW5lbmNvZGVkQ29udGVudHMgPSBfdGhpcy5nZXRVbmVuY29kZWRDb250ZW50cygpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVuY29kZSA/IHBha28uZGVmbGF0ZSh1bmVuY29kZWRDb250ZW50cykgOiB1bmVuY29kZWRDb250ZW50cztcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuZW5jb2RlID0gZW5jb2RlO1xuICAgICAgICBpZiAoZW5jb2RlKVxuICAgICAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignRmlsdGVyJyksIFBERk5hbWUub2YoJ0ZsYXRlRGVjb2RlJykpO1xuICAgICAgICBfdGhpcy5jb250ZW50c0NhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkoX3RoaXMuY29tcHV0ZUNvbnRlbnRzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzQ2FjaGUuYWNjZXNzKCk7XG4gICAgfTtcbiAgICBQREZGbGF0ZVN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50c0NhY2hlLmFjY2VzcygpLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERkZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnZ2V0VW5lbmNvZGVkQ29udGVudHMnKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZGbGF0ZVN0cmVhbTtcbn0oUERGU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBQREZGbGF0ZVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkZsYXRlU3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZGbGF0ZVN0cmVhbSBmcm9tIFwiLi9QREZGbGF0ZVN0cmVhbVwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIsIGxhc3QgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZPYmplY3RTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk9iamVjdFN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZPYmplY3RTdHJlYW0oY29udGV4dCwgb2JqZWN0cywgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNvbnRleHQub2JqKHt9KSwgZW5jb2RlKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vYmplY3RzID0gb2JqZWN0cztcbiAgICAgICAgX3RoaXMub2Zmc2V0cyA9IF90aGlzLmNvbXB1dGVPYmplY3RPZmZzZXRzKCk7XG4gICAgICAgIF90aGlzLm9mZnNldHNTdHJpbmcgPSBfdGhpcy5jb21wdXRlT2Zmc2V0c1N0cmluZygpO1xuICAgICAgICBfdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdUeXBlJyksIFBERk5hbWUub2YoJ09ialN0bScpKTtcbiAgICAgICAgX3RoaXMuZGljdC5zZXQoUERGTmFtZS5vZignTicpLCBQREZOdW1iZXIub2YoX3RoaXMub2JqZWN0cy5sZW5ndGgpKTtcbiAgICAgICAgX3RoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRmlyc3QnKSwgUERGTnVtYmVyLm9mKF90aGlzLm9mZnNldHNTdHJpbmcubGVuZ3RoKSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5nZXRPYmplY3RzQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9iamVjdHMubGVuZ3RoO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBQREZPYmplY3RTdHJlYW0ud2l0aENvbnRleHRBbmRPYmplY3RzKGNvbnRleHQgfHwgdGhpcy5kaWN0LmNvbnRleHQsIHRoaXMub2JqZWN0cy5zbGljZSgpLCB0aGlzLmVuY29kZSk7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLm9mZnNldHNTdHJpbmc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub2JqZWN0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMub2JqZWN0c1tpZHhdLCBvYmplY3QgPSBfYVsxXTtcbiAgICAgICAgICAgIHZhbHVlICs9IG9iamVjdCArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuZ2V0VW5lbmNvZGVkQ29udGVudHNTaXplKCkpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy5vZmZzZXRzU3RyaW5nLCBidWZmZXIsIDApO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9iamVjdHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLm9iamVjdHNbaWR4XSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgICAgICBvZmZzZXQgKz0gb2JqZWN0LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLm9mZnNldHNTdHJpbmcubGVuZ3RoICtcbiAgICAgICAgICAgIGxhc3QodGhpcy5vZmZzZXRzKVsxXSArXG4gICAgICAgICAgICBsYXN0KHRoaXMub2JqZWN0cylbMV0uc2l6ZUluQnl0ZXMoKSArXG4gICAgICAgICAgICAxKTtcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbS5wcm90b3R5cGUuY29tcHV0ZU9mZnNldHNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvZmZzZXRzU3RyaW5nID0gJyc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub2Zmc2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMub2Zmc2V0c1tpZHhdLCBvYmplY3ROdW1iZXIgPSBfYVswXSwgb2Zmc2V0ID0gX2FbMV07XG4gICAgICAgICAgICBvZmZzZXRzU3RyaW5nICs9IG9iamVjdE51bWJlciArIFwiIFwiICsgb2Zmc2V0ICsgXCIgXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldHNTdHJpbmc7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ucHJvdG90eXBlLmNvbXB1dGVPYmplY3RPZmZzZXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIG9mZnNldHMgPSBuZXcgQXJyYXkodGhpcy5vYmplY3RzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub2JqZWN0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMub2JqZWN0c1tpZHhdLCByZWYgPSBfYVswXSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgICAgICBvZmZzZXRzW2lkeF0gPSBbcmVmLm9iamVjdE51bWJlciwgb2Zmc2V0XTtcbiAgICAgICAgICAgIG9mZnNldCArPSBvYmplY3Quc2l6ZUluQnl0ZXMoKSArIDE7IC8vICdcXG4nXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldHM7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ud2l0aENvbnRleHRBbmRPYmplY3RzID0gZnVuY3Rpb24gKGNvbnRleHQsIG9iamVjdHMsIGVuY29kZSkge1xuICAgICAgICBpZiAoZW5jb2RlID09PSB2b2lkIDApIHsgZW5jb2RlID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gbmV3IFBERk9iamVjdFN0cmVhbShjb250ZXh0LCBvYmplY3RzLCBlbmNvZGUpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERk9iamVjdFN0cmVhbTtcbn0oUERGRmxhdGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9iamVjdFN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9iamVjdFN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGU3RyZWFtXCI7XG52YXIgUERGUGFnZUxlYWYgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlBhZ2VMZWFmLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlBhZ2VMZWFmKG1hcCwgY29udGV4dCwgYXV0b05vcm1hbGl6ZUNUTSkge1xuICAgICAgICBpZiAoYXV0b05vcm1hbGl6ZUNUTSA9PT0gdm9pZCAwKSB7IGF1dG9Ob3JtYWxpemVDVE0gPSB0cnVlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1hcCwgY29udGV4dCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubm9ybWFsaXplZCA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5hdXRvTm9ybWFsaXplQ1RNID0gYXV0b05vcm1hbGl6ZUNUTTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgY2xvbmUgPSBQREZQYWdlTGVhZi5mcm9tTWFwV2l0aENvbnRleHQobmV3IE1hcCgpLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCwgdGhpcy5hdXRvTm9ybWFsaXplQ1RNKTtcbiAgICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJpZXNbaWR4XSwga2V5ID0gX2FbMF0sIHZhbHVlID0gX2FbMV07XG4gICAgICAgICAgICBjbG9uZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLlBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5QYXJlbnQsIFBERkRpY3QpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLkNvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXAoUERGTmFtZS5vZignQ29udGVudHMnKSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuQW5ub3RzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBNYXliZShQREZOYW1lLkFubm90cywgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLkJsZWVkQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBNYXliZShQREZOYW1lLkJsZWVkQm94LCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuVHJpbUJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTWF5YmUoUERGTmFtZS5UcmltQm94LCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuQXJ0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBNYXliZShQREZOYW1lLkFydEJveCwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLlJlc291cmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpY3RPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5SZXNvdXJjZXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0Lmxvb2t1cE1heWJlKGRpY3RPclJlZiwgUERGRGljdCk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuTWVkaWFCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheU9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLk1lZGlhQm94KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5sb29rdXAoYXJyYXlPclJlZiwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLkNyb3BCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheU9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLkNyb3BCb3gpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0Lmxvb2t1cE1heWJlKGFycmF5T3JSZWYsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5Sb3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBudW1iZXJPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5Sb3RhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0Lmxvb2t1cE1heWJlKG51bWJlck9yUmVmLCBQREZOdW1iZXIpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLmdldEluaGVyaXRhYmxlQXR0cmlidXRlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZTtcbiAgICAgICAgdGhpcy5hc2NlbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGlmICghYXR0cmlidXRlKVxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IG5vZGUuZ2V0KG5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5zZXRQYXJlbnQgPSBmdW5jdGlvbiAocGFyZW50UmVmKSB7XG4gICAgICAgIHRoaXMuc2V0KFBERk5hbWUuUGFyZW50LCBwYXJlbnRSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLmFkZENvbnRlbnRTdHJlYW0gPSBmdW5jdGlvbiAoY29udGVudFN0cmVhbVJlZikge1xuICAgICAgICB2YXIgQ29udGVudHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuQ29udGVudHMgfHwgdGhpcy5jb250ZXh0Lm9iaihbXSk7XG4gICAgICAgIHRoaXMuc2V0KFBERk5hbWUuQ29udGVudHMsIENvbnRlbnRzKTtcbiAgICAgICAgQ29udGVudHMucHVzaChjb250ZW50U3RyZWFtUmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS53cmFwQ29udGVudFN0cmVhbXMgPSBmdW5jdGlvbiAoc3RhcnRTdHJlYW0sIGVuZFN0cmVhbSkge1xuICAgICAgICB2YXIgQ29udGVudHMgPSB0aGlzLkNvbnRlbnRzKCk7XG4gICAgICAgIGlmIChDb250ZW50cyBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgICAgICBDb250ZW50cy5pbnNlcnQoMCwgc3RhcnRTdHJlYW0pO1xuICAgICAgICAgICAgQ29udGVudHMucHVzaChlbmRTdHJlYW0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLmFkZEFubm90ID0gZnVuY3Rpb24gKGFubm90UmVmKSB7XG4gICAgICAgIHZhciBBbm5vdHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuQW5ub3RzO1xuICAgICAgICBBbm5vdHMucHVzaChhbm5vdFJlZik7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUucmVtb3ZlQW5ub3QgPSBmdW5jdGlvbiAoYW5ub3RSZWYpIHtcbiAgICAgICAgdmFyIEFubm90cyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5Bbm5vdHM7XG4gICAgICAgIHZhciBpbmRleCA9IEFubm90cy5pbmRleE9mKGFubm90UmVmKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIEFubm90cy5yZW1vdmUoaW5kZXgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuc2V0Rm9udERpY3Rpb25hcnkgPSBmdW5jdGlvbiAobmFtZSwgZm9udERpY3RSZWYpIHtcbiAgICAgICAgdmFyIEZvbnQgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuRm9udDtcbiAgICAgICAgRm9udC5zZXQobmFtZSwgZm9udERpY3RSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5ld0ZvbnREaWN0aW9uYXJ5S2V5ID0gZnVuY3Rpb24gKHRhZykge1xuICAgICAgICB2YXIgRm9udCA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5Gb250O1xuICAgICAgICByZXR1cm4gRm9udC51bmlxdWVLZXkodGFnKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5uZXdGb250RGljdGlvbmFyeSA9IGZ1bmN0aW9uICh0YWcsIGZvbnREaWN0UmVmKSB7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLm5ld0ZvbnREaWN0aW9uYXJ5S2V5KHRhZyk7XG4gICAgICAgIHRoaXMuc2V0Rm9udERpY3Rpb25hcnkoa2V5LCBmb250RGljdFJlZik7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuc2V0WE9iamVjdCA9IGZ1bmN0aW9uIChuYW1lLCB4T2JqZWN0UmVmKSB7XG4gICAgICAgIHZhciBYT2JqZWN0ID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLlhPYmplY3Q7XG4gICAgICAgIFhPYmplY3Quc2V0KG5hbWUsIHhPYmplY3RSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5ld1hPYmplY3RLZXkgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHZhciBYT2JqZWN0ID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLlhPYmplY3Q7XG4gICAgICAgIHJldHVybiBYT2JqZWN0LnVuaXF1ZUtleSh0YWcpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5ld1hPYmplY3QgPSBmdW5jdGlvbiAodGFnLCB4T2JqZWN0UmVmKSB7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLm5ld1hPYmplY3RLZXkodGFnKTtcbiAgICAgICAgdGhpcy5zZXRYT2JqZWN0KGtleSwgeE9iamVjdFJlZik7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuc2V0RXh0R1N0YXRlID0gZnVuY3Rpb24gKG5hbWUsIGV4dEdTdGF0ZVJlZikge1xuICAgICAgICB2YXIgRXh0R1N0YXRlID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkV4dEdTdGF0ZTtcbiAgICAgICAgRXh0R1N0YXRlLnNldChuYW1lLCBleHRHU3RhdGVSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5ld0V4dEdTdGF0ZUtleSA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgdmFyIEV4dEdTdGF0ZSA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5FeHRHU3RhdGU7XG4gICAgICAgIHJldHVybiBFeHRHU3RhdGUudW5pcXVlS2V5KHRhZyk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUubmV3RXh0R1N0YXRlID0gZnVuY3Rpb24gKHRhZywgZXh0R1N0YXRlUmVmKSB7XG4gICAgICAgIHZhciBrZXkgPSB0aGlzLm5ld0V4dEdTdGF0ZUtleSh0YWcpO1xuICAgICAgICB0aGlzLnNldEV4dEdTdGF0ZShrZXksIGV4dEdTdGF0ZVJlZik7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuYXNjZW5kID0gZnVuY3Rpb24gKHZpc2l0b3IpIHtcbiAgICAgICAgdmlzaXRvcih0aGlzKTtcbiAgICAgICAgdmFyIFBhcmVudCA9IHRoaXMuUGFyZW50KCk7XG4gICAgICAgIGlmIChQYXJlbnQpXG4gICAgICAgICAgICBQYXJlbnQuYXNjZW5kKHZpc2l0b3IpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubm9ybWFsaXplZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIHZhciBjb250ZW50c1JlZiA9IHRoaXMuZ2V0KFBERk5hbWUuQ29udGVudHMpO1xuICAgICAgICB2YXIgY29udGVudHMgPSB0aGlzLmNvbnRleHQubG9va3VwKGNvbnRlbnRzUmVmKTtcbiAgICAgICAgaWYgKGNvbnRlbnRzIGluc3RhbmNlb2YgUERGU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLnNldChQREZOYW1lLkNvbnRlbnRzLCBjb250ZXh0Lm9iaihbY29udGVudHNSZWZdKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXV0b05vcm1hbGl6ZUNUTSkge1xuICAgICAgICAgICAgdGhpcy53cmFwQ29udGVudFN0cmVhbXModGhpcy5jb250ZXh0LmdldFB1c2hHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbSgpLCB0aGlzLmNvbnRleHQuZ2V0UG9wR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogQ2xvbmUgYFJlc291cmNlc2AgaWYgaXQgaXMgaW5oZXJpdGVkXG4gICAgICAgIHZhciBkaWN0T3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUuUmVzb3VyY2VzKTtcbiAgICAgICAgdmFyIFJlc291cmNlcyA9IGNvbnRleHQubG9va3VwTWF5YmUoZGljdE9yUmVmLCBQREZEaWN0KSB8fCBjb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIHRoaXMuc2V0KFBERk5hbWUuUmVzb3VyY2VzLCBSZXNvdXJjZXMpO1xuICAgICAgICAvLyBUT0RPOiBDbG9uZSBgRm9udGAgaWYgaXQgaXMgaW5oZXJpdGVkXG4gICAgICAgIHZhciBGb250ID0gUmVzb3VyY2VzLmxvb2t1cE1heWJlKFBERk5hbWUuRm9udCwgUERGRGljdCkgfHwgY29udGV4dC5vYmooe30pO1xuICAgICAgICBSZXNvdXJjZXMuc2V0KFBERk5hbWUuRm9udCwgRm9udCk7XG4gICAgICAgIC8vIFRPRE86IENsb25lIGBYT2JqZWN0YCBpZiBpdCBpcyBpbmhlcml0ZWRcbiAgICAgICAgdmFyIFhPYmplY3QgPSBSZXNvdXJjZXMubG9va3VwTWF5YmUoUERGTmFtZS5YT2JqZWN0LCBQREZEaWN0KSB8fCBjb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIFJlc291cmNlcy5zZXQoUERGTmFtZS5YT2JqZWN0LCBYT2JqZWN0KTtcbiAgICAgICAgLy8gVE9ETzogQ2xvbmUgYEV4dEdTdGF0ZWAgaWYgaXQgaXMgaW5oZXJpdGVkXG4gICAgICAgIHZhciBFeHRHU3RhdGUgPSBSZXNvdXJjZXMubG9va3VwTWF5YmUoUERGTmFtZS5FeHRHU3RhdGUsIFBERkRpY3QpIHx8IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgUmVzb3VyY2VzLnNldChQREZOYW1lLkV4dEdTdGF0ZSwgRXh0R1N0YXRlKTtcbiAgICAgICAgdmFyIEFubm90cyA9IHRoaXMuQW5ub3RzKCkgfHwgY29udGV4dC5vYmooW10pO1xuICAgICAgICB0aGlzLnNldChQREZOYW1lLkFubm90cywgQW5ub3RzKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5ub3JtYWxpemVkRW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ub3JtYWxpemUoKTtcbiAgICAgICAgdmFyIEFubm90cyA9IHRoaXMuQW5ub3RzKCk7XG4gICAgICAgIHZhciBSZXNvdXJjZXMgPSB0aGlzLlJlc291cmNlcygpO1xuICAgICAgICB2YXIgQ29udGVudHMgPSB0aGlzLkNvbnRlbnRzKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBBbm5vdHM6IEFubm90cyxcbiAgICAgICAgICAgIFJlc291cmNlczogUmVzb3VyY2VzLFxuICAgICAgICAgICAgQ29udGVudHM6IENvbnRlbnRzLFxuICAgICAgICAgICAgRm9udDogUmVzb3VyY2VzLmxvb2t1cChQREZOYW1lLkZvbnQsIFBERkRpY3QpLFxuICAgICAgICAgICAgWE9iamVjdDogUmVzb3VyY2VzLmxvb2t1cChQREZOYW1lLlhPYmplY3QsIFBERkRpY3QpLFxuICAgICAgICAgICAgRXh0R1N0YXRlOiBSZXNvdXJjZXMubG9va3VwKFBERk5hbWUuRXh0R1N0YXRlLCBQREZEaWN0KSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLkluaGVyaXRhYmxlRW50cmllcyA9IFtcbiAgICAgICAgJ1Jlc291cmNlcycsXG4gICAgICAgICdNZWRpYUJveCcsXG4gICAgICAgICdDcm9wQm94JyxcbiAgICAgICAgJ1JvdGF0ZScsXG4gICAgXTtcbiAgICBQREZQYWdlTGVhZi53aXRoQ29udGV4dEFuZFBhcmVudCA9IGZ1bmN0aW9uIChjb250ZXh0LCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBuZXcgTWFwKCk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUuVHlwZSwgUERGTmFtZS5QYWdlKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5QYXJlbnQsIHBhcmVudCk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUuUmVzb3VyY2VzLCBjb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLk1lZGlhQm94LCBjb250ZXh0Lm9iaihbMCwgMCwgNjEyLCA3OTJdKSk7XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZUxlYWYoZGljdCwgY29udGV4dCwgZmFsc2UpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYuZnJvbU1hcFdpdGhDb250ZXh0ID0gZnVuY3Rpb24gKG1hcCwgY29udGV4dCwgYXV0b05vcm1hbGl6ZUNUTSkge1xuICAgICAgICBpZiAoYXV0b05vcm1hbGl6ZUNUTSA9PT0gdm9pZCAwKSB7IGF1dG9Ob3JtYWxpemVDVE0gPSB0cnVlOyB9XG4gICAgICAgIHJldHVybiBuZXcgUERGUGFnZUxlYWYobWFwLCBjb250ZXh0LCBhdXRvTm9ybWFsaXplQ1RNKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZQYWdlTGVhZjtcbn0oUERGRGljdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUGFnZUxlYWY7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZQYWdlTGVhZi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZQYWdlTGVhZiBmcm9tIFwiLi9QREZQYWdlTGVhZlwiO1xuaW1wb3J0IHsgSW52YWxpZFRhcmdldEluZGV4RXJyb3IsIENvcnJ1cHRQYWdlVHJlZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERlBhZ2VUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZQYWdlVHJlZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZQYWdlVHJlZSgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUuUGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXAoUERGTmFtZS5vZignUGFyZW50JykpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLktpZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cChQREZOYW1lLm9mKCdLaWRzJyksIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5Db3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwKFBERk5hbWUub2YoJ0NvdW50JyksIFBERk51bWJlcik7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUucHVzaFRyZWVOb2RlID0gZnVuY3Rpb24gKHRyZWVSZWYpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgS2lkcy5wdXNoKHRyZWVSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLnB1c2hMZWFmTm9kZSA9IGZ1bmN0aW9uIChsZWFmUmVmKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIHRoaXMuaW5zZXJ0TGVhZktpZChLaWRzLnNpemUoKSwgbGVhZlJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSBnaXZlbiByZWYgYXMgYSBsZWFmIG5vZGUgb2YgdGhpcyBwYWdlIHRyZWUgYXQgdGhlIHNwZWNpZmllZFxuICAgICAqIGluZGV4ICh6ZXJvLWJhc2VkKS4gQWxzbyBpbmNyZW1lbnRzIHRoZSBgQ291bnRgIG9mIGVhY2ggcGFnZSB0cmVlIGluIHRoZVxuICAgICAqIGhpZXJhcmNoeSB0byBhY2NvbW9kYXRlIHRoZSBuZXcgcGFnZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdGhlIHJlZiBvZiB0aGUgUERGUGFnZVRyZWUgbm9kZSBpbnRvIHdoaWNoIGBsZWFmUmVmYCB3YXMgaW5zZXJ0ZWQsXG4gICAgICogb3IgYHVuZGVmaW5lZGAgaWYgaXQgd2FzIGluc2VydGVkIGludG8gdGhlIHJvb3Qgbm9kZSAodGhlIFBERlBhZ2VUcmVlIHVwb25cbiAgICAgKiB3aGljaCB0aGUgbWV0aG9kIHdhcyBmaXJzdCBjYWxsZWQpLlxuICAgICAqL1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5pbnNlcnRMZWFmTm9kZSA9IGZ1bmN0aW9uIChsZWFmUmVmLCB0YXJnZXRJbmRleCkge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICB2YXIgQ291bnQgPSB0aGlzLkNvdW50KCkuYXNOdW1iZXIoKTtcbiAgICAgICAgaWYgKHRhcmdldEluZGV4ID4gQ291bnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvcih0YXJnZXRJbmRleCwgQ291bnQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0ID0gdGFyZ2V0SW5kZXg7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEtpZHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBpZiAobGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIEluc2VydCBwYWdlIGFuZCByZXR1cm5cbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExlYWZLaWQoaWR4LCBsZWFmUmVmKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGtpZFJlZiA9IEtpZHMuZ2V0KGlkeCk7XG4gICAgICAgICAgICB2YXIga2lkID0gdGhpcy5jb250ZXh0Lmxvb2t1cChraWRSZWYpO1xuICAgICAgICAgICAgaWYgKGtpZCBpbnN0YW5jZW9mIFBERlBhZ2VUcmVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtpZC5Db3VudCgpLmFzTnVtYmVyKCkgPiBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERpZyBpblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGtpZC5pbnNlcnRMZWFmTm9kZShsZWFmUmVmLCBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0KSB8fCBraWRSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvblxuICAgICAgICAgICAgICAgICAgICBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0IC09IGtpZC5Db3VudCgpLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtpZCBpbnN0YW5jZW9mIFBERlBhZ2VMZWFmKSB7XG4gICAgICAgICAgICAgICAgLy8gTW92ZSBvblxuICAgICAgICAgICAgICAgIGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgLT0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gSW5zZXJ0IHBhZ2UgYXQgdGhlIGVuZCBhbmQgcmV0dXJuXG4gICAgICAgICAgICB0aGlzLmluc2VydExlYWZLaWQoS2lkcy5zaXplKCksIGxlYWZSZWYpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgaWYgYHRhcmdldEluZGV4YCBpcyB2YWxpZFxuICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFBhZ2VUcmVlRXJyb3IodGFyZ2V0SW5kZXgsICdpbnNlcnRMZWFmTm9kZScpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGVhZiBub2RlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggKHplcm8tYmFzZWQpIGZyb20gdGhpcyBwYWdlXG4gICAgICogdHJlZS4gQWxzbyBkZWNyZW1lbnRzIHRoZSBgQ291bnRgIG9mIGVhY2ggcGFnZSB0cmVlIGluIHRoZSBoaWVyYXJjaHkgdG9cbiAgICAgKiBhY2NvdW50IGZvciB0aGUgcmVtb3ZlZCBwYWdlLlxuICAgICAqXG4gICAgICogSWYgYHBydW5lYCBpcyB0cnVlLCB0aGVuIGludGVybWVkaWF0ZSB0cmVlIG5vZGVzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZVxuICAgICAqIHRyZWUgaWYgdGhleSBjb250YWluIDAgY2hpbGRyZW4gYWZ0ZXIgdGhlIGxlYWYgbm9kZSBpcyByZW1vdmVkLlxuICAgICAqL1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5yZW1vdmVMZWFmTm9kZSA9IGZ1bmN0aW9uICh0YXJnZXRJbmRleCwgcHJ1bmUpIHtcbiAgICAgICAgaWYgKHBydW5lID09PSB2b2lkIDApIHsgcHJ1bmUgPSB0cnVlOyB9XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIHZhciBDb3VudCA9IHRoaXMuQ291bnQoKS5hc051bWJlcigpO1xuICAgICAgICBpZiAodGFyZ2V0SW5kZXggPj0gQ291bnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvcih0YXJnZXRJbmRleCwgQ291bnQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0ID0gdGFyZ2V0SW5kZXg7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEtpZHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIga2lkUmVmID0gS2lkcy5nZXQoaWR4KTtcbiAgICAgICAgICAgIHZhciBraWQgPSB0aGlzLmNvbnRleHQubG9va3VwKGtpZFJlZik7XG4gICAgICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUERGUGFnZVRyZWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2lkLkNvdW50KCkuYXNOdW1iZXIoKSA+IGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlnIGluXG4gICAgICAgICAgICAgICAgICAgIGtpZC5yZW1vdmVMZWFmTm9kZShsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0LCBwcnVuZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcnVuZSAmJiBraWQuS2lkcygpLnNpemUoKSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIEtpZHMucmVtb3ZlKGlkeCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb25cbiAgICAgICAgICAgICAgICAgICAgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCAtPSBraWQuQ291bnQoKS5hc051bWJlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChraWQgaW5zdGFuY2VvZiBQREZQYWdlTGVhZikge1xuICAgICAgICAgICAgICAgIGlmIChsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBwYWdlIGFuZCByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVLaWQoaWR4KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvblxuICAgICAgICAgICAgICAgICAgICBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0IC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciBnZXQgaGVyZSBpZiBgdGFyZ2V0SW5kZXhgIGlzIHZhbGlkXG4gICAgICAgIHRocm93IG5ldyBDb3JydXB0UGFnZVRyZWVFcnJvcih0YXJnZXRJbmRleCwgJ3JlbW92ZUxlYWZOb2RlJyk7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUuYXNjZW5kID0gZnVuY3Rpb24gKHZpc2l0b3IpIHtcbiAgICAgICAgdmlzaXRvcih0aGlzKTtcbiAgICAgICAgdmFyIFBhcmVudCA9IHRoaXMuUGFyZW50KCk7XG4gICAgICAgIGlmIChQYXJlbnQpXG4gICAgICAgICAgICBQYXJlbnQuYXNjZW5kKHZpc2l0b3IpO1xuICAgIH07XG4gICAgLyoqIFBlcmZvcm1zIGEgUG9zdC1PcmRlciB0cmF2ZXJzYWwgb2YgdGhpcyBwYWdlIHRyZWUgKi9cbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUudHJhdmVyc2UgPSBmdW5jdGlvbiAodmlzaXRvcikge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBLaWRzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGtpZFJlZiA9IEtpZHMuZ2V0KGlkeCk7XG4gICAgICAgICAgICB2YXIga2lkID0gdGhpcy5jb250ZXh0Lmxvb2t1cChraWRSZWYpO1xuICAgICAgICAgICAgaWYgKGtpZCBpbnN0YW5jZW9mIFBERlBhZ2VUcmVlKVxuICAgICAgICAgICAgICAgIGtpZC50cmF2ZXJzZSh2aXNpdG9yKTtcbiAgICAgICAgICAgIHZpc2l0b3Ioa2lkLCBraWRSZWYpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUuaW5zZXJ0TGVhZktpZCA9IGZ1bmN0aW9uIChraWRJZHgsIGxlYWZSZWYpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgdGhpcy5hc2NlbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHZhciBuZXdDb3VudCA9IG5vZGUuQ291bnQoKS5hc051bWJlcigpICsgMTtcbiAgICAgICAgICAgIG5vZGUuc2V0KFBERk5hbWUub2YoJ0NvdW50JyksIFBERk51bWJlci5vZihuZXdDb3VudCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgS2lkcy5pbnNlcnQoa2lkSWR4LCBsZWFmUmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5yZW1vdmVLaWQgPSBmdW5jdGlvbiAoa2lkSWR4KSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIHZhciBraWQgPSBLaWRzLmxvb2t1cChraWRJZHgpO1xuICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUERGUGFnZUxlYWYpIHtcbiAgICAgICAgICAgIHRoaXMuYXNjZW5kKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld0NvdW50ID0gbm9kZS5Db3VudCgpLmFzTnVtYmVyKCkgLSAxO1xuICAgICAgICAgICAgICAgIG5vZGUuc2V0KFBERk5hbWUub2YoJ0NvdW50JyksIFBERk51bWJlci5vZihuZXdDb3VudCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgS2lkcy5yZW1vdmUoa2lkSWR4KTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLndpdGhDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHBhcmVudCkge1xuICAgICAgICB2YXIgZGljdCA9IG5ldyBNYXAoKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignVHlwZScpLCBQREZOYW1lLm9mKCdQYWdlcycpKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignS2lkcycpLCBjb250ZXh0Lm9iaihbXSkpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdDb3VudCcpLCBjb250ZXh0Lm9iaigwKSk7XG4gICAgICAgIGlmIChwYXJlbnQpXG4gICAgICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdQYXJlbnQnKSwgcGFyZW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZQYWdlVHJlZShkaWN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLmZyb21NYXBXaXRoQ29udGV4dCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZQYWdlVHJlZShtYXAsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlBhZ2VUcmVlO1xufShQREZEaWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZQYWdlVHJlZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlBhZ2VUcmVlLmpzLm1hcCIsInZhciBDaGFyQ29kZXM7XG4oZnVuY3Rpb24gKENoYXJDb2Rlcykge1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJOdWxsXCJdID0gMF0gPSBcIk51bGxcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiQmFja3NwYWNlXCJdID0gOF0gPSBcIkJhY2tzcGFjZVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJUYWJcIl0gPSA5XSA9IFwiVGFiXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIk5ld2xpbmVcIl0gPSAxMF0gPSBcIk5ld2xpbmVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRm9ybUZlZWRcIl0gPSAxMl0gPSBcIkZvcm1GZWVkXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkNhcnJpYWdlUmV0dXJuXCJdID0gMTNdID0gXCJDYXJyaWFnZVJldHVyblwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJTcGFjZVwiXSA9IDMyXSA9IFwiU3BhY2VcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRXhjbGFtYXRpb25Qb2ludFwiXSA9IDMzXSA9IFwiRXhjbGFtYXRpb25Qb2ludFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJIYXNoXCJdID0gMzVdID0gXCJIYXNoXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlBlcmNlbnRcIl0gPSAzN10gPSBcIlBlcmNlbnRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTGVmdFBhcmVuXCJdID0gNDBdID0gXCJMZWZ0UGFyZW5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUmlnaHRQYXJlblwiXSA9IDQxXSA9IFwiUmlnaHRQYXJlblwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJQbHVzXCJdID0gNDNdID0gXCJQbHVzXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIk1pbnVzXCJdID0gNDVdID0gXCJNaW51c1wiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJEYXNoXCJdID0gNDVdID0gXCJEYXNoXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlBlcmlvZFwiXSA9IDQ2XSA9IFwiUGVyaW9kXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkZvcndhcmRTbGFzaFwiXSA9IDQ3XSA9IFwiRm9yd2FyZFNsYXNoXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlplcm9cIl0gPSA0OF0gPSBcIlplcm9cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiT25lXCJdID0gNDldID0gXCJPbmVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiVHdvXCJdID0gNTBdID0gXCJUd29cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiVGhyZWVcIl0gPSA1MV0gPSBcIlRocmVlXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkZvdXJcIl0gPSA1Ml0gPSBcIkZvdXJcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRml2ZVwiXSA9IDUzXSA9IFwiRml2ZVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJTaXhcIl0gPSA1NF0gPSBcIlNpeFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJTZXZlblwiXSA9IDU1XSA9IFwiU2V2ZW5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRWlnaHRcIl0gPSA1Nl0gPSBcIkVpZ2h0XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIk5pbmVcIl0gPSA1N10gPSBcIk5pbmVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTGVzc1RoYW5cIl0gPSA2MF0gPSBcIkxlc3NUaGFuXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkdyZWF0ZXJUaGFuXCJdID0gNjJdID0gXCJHcmVhdGVyVGhhblwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJBXCJdID0gNjVdID0gXCJBXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkRcIl0gPSA2OF0gPSBcIkRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRVwiXSA9IDY5XSA9IFwiRVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJGXCJdID0gNzBdID0gXCJGXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIk9cIl0gPSA3OV0gPSBcIk9cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUFwiXSA9IDgwXSA9IFwiUFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJSXCJdID0gODJdID0gXCJSXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxlZnRTcXVhcmVCcmFja2V0XCJdID0gOTFdID0gXCJMZWZ0U3F1YXJlQnJhY2tldFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJCYWNrU2xhc2hcIl0gPSA5Ml0gPSBcIkJhY2tTbGFzaFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJSaWdodFNxdWFyZUJyYWNrZXRcIl0gPSA5M10gPSBcIlJpZ2h0U3F1YXJlQnJhY2tldFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJhXCJdID0gOTddID0gXCJhXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImJcIl0gPSA5OF0gPSBcImJcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiZFwiXSA9IDEwMF0gPSBcImRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiZVwiXSA9IDEwMV0gPSBcImVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiZlwiXSA9IDEwMl0gPSBcImZcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiaVwiXSA9IDEwNV0gPSBcImlcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wialwiXSA9IDEwNl0gPSBcImpcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wibFwiXSA9IDEwOF0gPSBcImxcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wibVwiXSA9IDEwOV0gPSBcIm1cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiblwiXSA9IDExMF0gPSBcIm5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wib1wiXSA9IDExMV0gPSBcIm9cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiclwiXSA9IDExNF0gPSBcInJcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wic1wiXSA9IDExNV0gPSBcInNcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1widFwiXSA9IDExNl0gPSBcInRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1widVwiXSA9IDExN10gPSBcInVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wieFwiXSA9IDEyMF0gPSBcInhcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTGVmdEN1cmx5XCJdID0gMTIzXSA9IFwiTGVmdEN1cmx5XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlJpZ2h0Q3VybHlcIl0gPSAxMjVdID0gXCJSaWdodEN1cmx5XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlRpbGRlXCJdID0gMTI2XSA9IFwiVGlsZGVcIjtcbn0pKENoYXJDb2RlcyB8fCAoQ2hhckNvZGVzID0ge30pKTtcbmV4cG9ydCBkZWZhdWx0IENoYXJDb2Rlcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJDb2Rlcy5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuL0NoYXJDb2Rlc1wiO1xuZXhwb3J0IHZhciBJc0RlbGltaXRlciA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuTGVmdFBhcmVuXSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuUmlnaHRQYXJlbl0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLkxlc3NUaGFuXSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuR3JlYXRlclRoYW5dID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5MZWZ0U3F1YXJlQnJhY2tldF0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLlJpZ2h0U3F1YXJlQnJhY2tldF0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLkxlZnRDdXJseV0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLlJpZ2h0Q3VybHldID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5Gb3J3YXJkU2xhc2hdID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5QZXJjZW50XSA9IDE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EZWxpbWl0ZXJzLmpzLm1hcCIsImltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4vQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBJc0RlbGltaXRlciB9IGZyb20gXCIuL0RlbGltaXRlcnNcIjtcbmltcG9ydCB7IElzV2hpdGVzcGFjZSB9IGZyb20gXCIuL1doaXRlc3BhY2VcIjtcbmV4cG9ydCB2YXIgSXNJcnJlZ3VsYXIgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gMjU2OyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgSXNJcnJlZ3VsYXJbaWR4XSA9IElzV2hpdGVzcGFjZVtpZHhdIHx8IElzRGVsaW1pdGVyW2lkeF0gPyAxIDogMDtcbn1cbklzSXJyZWd1bGFyW0NoYXJDb2Rlcy5IYXNoXSA9IDE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JcnJlZ3VsYXIuanMubWFwIiwiaW1wb3J0IHsgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4vQ2hhckNvZGVzXCI7XG52YXIgU3BhY2UgPSBDaGFyQ29kZXMuU3BhY2UsIENhcnJpYWdlUmV0dXJuID0gQ2hhckNvZGVzLkNhcnJpYWdlUmV0dXJuLCBOZXdsaW5lID0gQ2hhckNvZGVzLk5ld2xpbmU7XG52YXIgc3RyZWFtID0gW1xuICAgIENoYXJDb2Rlcy5zLFxuICAgIENoYXJDb2Rlcy50LFxuICAgIENoYXJDb2Rlcy5yLFxuICAgIENoYXJDb2Rlcy5lLFxuICAgIENoYXJDb2Rlcy5hLFxuICAgIENoYXJDb2Rlcy5tLFxuXTtcbnZhciBlbmRzdHJlYW0gPSBbXG4gICAgQ2hhckNvZGVzLmUsXG4gICAgQ2hhckNvZGVzLm4sXG4gICAgQ2hhckNvZGVzLmQsXG4gICAgQ2hhckNvZGVzLnMsXG4gICAgQ2hhckNvZGVzLnQsXG4gICAgQ2hhckNvZGVzLnIsXG4gICAgQ2hhckNvZGVzLmUsXG4gICAgQ2hhckNvZGVzLmEsXG4gICAgQ2hhckNvZGVzLm0sXG5dO1xuZXhwb3J0IHZhciBLZXl3b3JkcyA9IHtcbiAgICBoZWFkZXI6IFtcbiAgICAgICAgQ2hhckNvZGVzLlBlcmNlbnQsXG4gICAgICAgIENoYXJDb2Rlcy5QLFxuICAgICAgICBDaGFyQ29kZXMuRCxcbiAgICAgICAgQ2hhckNvZGVzLkYsXG4gICAgICAgIENoYXJDb2Rlcy5EYXNoLFxuICAgIF0sXG4gICAgZW9mOiBbXG4gICAgICAgIENoYXJDb2Rlcy5QZXJjZW50LFxuICAgICAgICBDaGFyQ29kZXMuUGVyY2VudCxcbiAgICAgICAgQ2hhckNvZGVzLkUsXG4gICAgICAgIENoYXJDb2Rlcy5PLFxuICAgICAgICBDaGFyQ29kZXMuRixcbiAgICBdLFxuICAgIG9iajogW0NoYXJDb2Rlcy5vLCBDaGFyQ29kZXMuYiwgQ2hhckNvZGVzLmpdLFxuICAgIGVuZG9iajogW1xuICAgICAgICBDaGFyQ29kZXMuZSxcbiAgICAgICAgQ2hhckNvZGVzLm4sXG4gICAgICAgIENoYXJDb2Rlcy5kLFxuICAgICAgICBDaGFyQ29kZXMubyxcbiAgICAgICAgQ2hhckNvZGVzLmIsXG4gICAgICAgIENoYXJDb2Rlcy5qLFxuICAgIF0sXG4gICAgeHJlZjogW0NoYXJDb2Rlcy54LCBDaGFyQ29kZXMuciwgQ2hhckNvZGVzLmUsIENoYXJDb2Rlcy5mXSxcbiAgICB0cmFpbGVyOiBbXG4gICAgICAgIENoYXJDb2Rlcy50LFxuICAgICAgICBDaGFyQ29kZXMucixcbiAgICAgICAgQ2hhckNvZGVzLmEsXG4gICAgICAgIENoYXJDb2Rlcy5pLFxuICAgICAgICBDaGFyQ29kZXMubCxcbiAgICAgICAgQ2hhckNvZGVzLmUsXG4gICAgICAgIENoYXJDb2Rlcy5yLFxuICAgIF0sXG4gICAgc3RhcnR4cmVmOiBbXG4gICAgICAgIENoYXJDb2Rlcy5zLFxuICAgICAgICBDaGFyQ29kZXMudCxcbiAgICAgICAgQ2hhckNvZGVzLmEsXG4gICAgICAgIENoYXJDb2Rlcy5yLFxuICAgICAgICBDaGFyQ29kZXMudCxcbiAgICAgICAgQ2hhckNvZGVzLngsXG4gICAgICAgIENoYXJDb2Rlcy5yLFxuICAgICAgICBDaGFyQ29kZXMuZSxcbiAgICAgICAgQ2hhckNvZGVzLmYsXG4gICAgXSxcbiAgICB0cnVlOiBbQ2hhckNvZGVzLnQsIENoYXJDb2Rlcy5yLCBDaGFyQ29kZXMudSwgQ2hhckNvZGVzLmVdLFxuICAgIGZhbHNlOiBbQ2hhckNvZGVzLmYsIENoYXJDb2Rlcy5hLCBDaGFyQ29kZXMubCwgQ2hhckNvZGVzLnMsIENoYXJDb2Rlcy5lXSxcbiAgICBudWxsOiBbQ2hhckNvZGVzLm4sIENoYXJDb2Rlcy51LCBDaGFyQ29kZXMubCwgQ2hhckNvZGVzLmxdLFxuICAgIHN0cmVhbTogc3RyZWFtLFxuICAgIHN0cmVhbUVPRjE6IF9fc3ByZWFkQXJyYXlzKHN0cmVhbSwgW1NwYWNlLCBDYXJyaWFnZVJldHVybiwgTmV3bGluZV0pLFxuICAgIHN0cmVhbUVPRjI6IF9fc3ByZWFkQXJyYXlzKHN0cmVhbSwgW0NhcnJpYWdlUmV0dXJuLCBOZXdsaW5lXSksXG4gICAgc3RyZWFtRU9GMzogX19zcHJlYWRBcnJheXMoc3RyZWFtLCBbQ2FycmlhZ2VSZXR1cm5dKSxcbiAgICBzdHJlYW1FT0Y0OiBfX3NwcmVhZEFycmF5cyhzdHJlYW0sIFtOZXdsaW5lXSksXG4gICAgZW5kc3RyZWFtOiBlbmRzdHJlYW0sXG4gICAgRU9GMWVuZHN0cmVhbTogX19zcHJlYWRBcnJheXMoW0NhcnJpYWdlUmV0dXJuLCBOZXdsaW5lXSwgZW5kc3RyZWFtKSxcbiAgICBFT0YyZW5kc3RyZWFtOiBfX3NwcmVhZEFycmF5cyhbQ2FycmlhZ2VSZXR1cm5dLCBlbmRzdHJlYW0pLFxuICAgIEVPRjNlbmRzdHJlYW06IF9fc3ByZWFkQXJyYXlzKFtOZXdsaW5lXSwgZW5kc3RyZWFtKSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1LZXl3b3Jkcy5qcy5tYXAiLCJpbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuL0NoYXJDb2Rlc1wiO1xuZXhwb3J0IHZhciBJc0RpZ2l0ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbklzRGlnaXRbQ2hhckNvZGVzLlplcm9dID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLk9uZV0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuVHdvXSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5UaHJlZV0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuRm91cl0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuRml2ZV0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuU2l4XSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5TZXZlbl0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuRWlnaHRdID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLk5pbmVdID0gMTtcbmV4cG9ydCB2YXIgSXNOdW1lcmljUHJlZml4ID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbklzTnVtZXJpY1ByZWZpeFtDaGFyQ29kZXMuUGVyaW9kXSA9IDE7XG5Jc051bWVyaWNQcmVmaXhbQ2hhckNvZGVzLlBsdXNdID0gMTtcbklzTnVtZXJpY1ByZWZpeFtDaGFyQ29kZXMuTWludXNdID0gMTtcbmV4cG9ydCB2YXIgSXNOdW1lcmljID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmZvciAodmFyIGlkeCA9IDAsIGxlbiA9IDI1NjsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgIElzTnVtZXJpY1tpZHhdID0gSXNEaWdpdFtpZHhdIHx8IElzTnVtZXJpY1ByZWZpeFtpZHhdID8gMSA6IDA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OdW1lcmljLmpzLm1hcCIsImltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4vQ2hhckNvZGVzXCI7XG5leHBvcnQgdmFyIElzV2hpdGVzcGFjZSA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLk51bGxdID0gMTtcbklzV2hpdGVzcGFjZVtDaGFyQ29kZXMuVGFiXSA9IDE7XG5Jc1doaXRlc3BhY2VbQ2hhckNvZGVzLk5ld2xpbmVdID0gMTtcbklzV2hpdGVzcGFjZVtDaGFyQ29kZXMuRm9ybUZlZWRdID0gMTtcbklzV2hpdGVzcGFjZVtDaGFyQ29kZXMuQ2FycmlhZ2VSZXR1cm5dID0gMTtcbklzV2hpdGVzcGFjZVtDaGFyQ29kZXMuU3BhY2VdID0gMTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdoaXRlc3BhY2UuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGSGVhZGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZIZWFkZXJcIjtcbmltcG9ydCBQREZUcmFpbGVyIGZyb20gXCIuLi9kb2N1bWVudC9QREZUcmFpbGVyXCI7XG5pbXBvcnQgUERGSW52YWxpZE9iamVjdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZJbnZhbGlkT2JqZWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGU3RyZWFtXCI7XG5pbXBvcnQgUERGQ3Jvc3NSZWZTdHJlYW0gZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGQ3Jvc3NSZWZTdHJlYW1cIjtcbmltcG9ydCBQREZPYmplY3RTdHJlYW0gZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGT2JqZWN0U3RyZWFtXCI7XG5pbXBvcnQgUERGV3JpdGVyIGZyb20gXCIuL1BERldyaXRlclwiO1xuaW1wb3J0IHsgbGFzdCwgd2FpdEZvclRpY2sgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZTdHJlYW1Xcml0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlN0cmVhbVdyaXRlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZTdHJlYW1Xcml0ZXIoY29udGV4dCwgb2JqZWN0c1BlclRpY2ssIGVuY29kZVN0cmVhbXMsIG9iamVjdHNQZXJTdHJlYW0pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29udGV4dCwgb2JqZWN0c1BlclRpY2spIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmVuY29kZVN0cmVhbXMgPSBlbmNvZGVTdHJlYW1zO1xuICAgICAgICBfdGhpcy5vYmplY3RzUGVyU3RyZWFtID0gb2JqZWN0c1BlclN0cmVhbTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZTdHJlYW1Xcml0ZXIucHJvdG90eXBlLmNvbXB1dGVCdWZmZXJTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0TnVtYmVyLCBoZWFkZXIsIHNpemUsIHhyZWZTdHJlYW0sIHVuY29tcHJlc3NlZE9iamVjdHMsIGNvbXByZXNzZWRPYmplY3RzLCBvYmplY3RTdHJlYW1SZWZzLCBpbmRpcmVjdE9iamVjdHMsIGlkeCwgbGVuLCBpbmRpcmVjdE9iamVjdCwgcmVmLCBvYmplY3QsIHNob3VsZE5vdENvbXByZXNzLCBjaHVuaywgb2JqZWN0U3RyZWFtUmVmLCBpZHgsIGxlbiwgY2h1bmssIHJlZiwgb2JqZWN0U3RyZWFtLCB4cmVmU3RyZWFtUmVmLCB4cmVmT2Zmc2V0LCB0cmFpbGVyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TnVtYmVyID0gdGhpcy5jb250ZXh0Lmxhcmdlc3RPYmplY3ROdW1iZXIgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gUERGSGVhZGVyLmZvclZlcnNpb24oMSwgNyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gaGVhZGVyLnNpemVJbkJ5dGVzKCkgKyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZlN0cmVhbSA9IFBERkNyb3NzUmVmU3RyZWFtLmNyZWF0ZSh0aGlzLmNyZWF0ZVRyYWlsZXJEaWN0KCksIHRoaXMuZW5jb2RlU3RyZWFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRPYmplY3RzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkT2JqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0U3RyZWFtUmVmcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3RPYmplY3RzID0gdGhpcy5jb250ZXh0LmVudW1lcmF0ZUluZGlyZWN0T2JqZWN0cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gMCwgbGVuID0gaW5kaXJlY3RPYmplY3RzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpcmVjdE9iamVjdCA9IGluZGlyZWN0T2JqZWN0c1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gaW5kaXJlY3RPYmplY3RbMF0sIG9iamVjdCA9IGluZGlyZWN0T2JqZWN0WzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkTm90Q29tcHJlc3MgPSByZWYgPT09IHRoaXMuY29udGV4dC50cmFpbGVySW5mby5FbmNyeXB0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgUERGU3RyZWFtIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgUERGSW52YWxpZE9iamVjdCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5nZW5lcmF0aW9uTnVtYmVyICE9PSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGROb3RDb21wcmVzcykgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRPYmplY3RzLnB1c2goaW5kaXJlY3RPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZlN0cmVhbS5hZGRVbmNvbXByZXNzZWRFbnRyeShyZWYsIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0aGlzLmNvbXB1dGVJbmRpcmVjdE9iamVjdFNpemUoaW5kaXJlY3RPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFdhaXRGb3JUaWNrKDEpKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHdhaXRGb3JUaWNrKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rID0gbGFzdChjb21wcmVzc2VkT2JqZWN0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RTdHJlYW1SZWYgPSBsYXN0KG9iamVjdFN0cmVhbVJlZnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaHVuayB8fCBjaHVuay5sZW5ndGggJSB0aGlzLm9iamVjdHNQZXJTdHJlYW0gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuayA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRPYmplY3RzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFN0cmVhbVJlZiA9IFBERlJlZi5vZihvYmplY3ROdW1iZXIrKyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0U3RyZWFtUmVmcy5wdXNoKG9iamVjdFN0cmVhbVJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmU3RyZWFtLmFkZENvbXByZXNzZWRFbnRyeShyZWYsIG9iamVjdFN0cmVhbVJlZiwgY2h1bmsubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLnB1c2goaW5kaXJlY3RPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAwLCBsZW4gPSBjb21wcmVzc2VkT2JqZWN0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDEwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rID0gY29tcHJlc3NlZE9iamVjdHNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IG9iamVjdFN0cmVhbVJlZnNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFN0cmVhbSA9IFBERk9iamVjdFN0cmVhbS53aXRoQ29udGV4dEFuZE9iamVjdHModGhpcy5jb250ZXh0LCBjaHVuaywgdGhpcy5lbmNvZGVTdHJlYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW0uYWRkVW5jb21wcmVzc2VkRW50cnkocmVmLCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jb21wdXRlSW5kaXJlY3RPYmplY3RTaXplKFtyZWYsIG9iamVjdFN0cmVhbV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkT2JqZWN0cy5wdXNoKFtyZWYsIG9iamVjdFN0cmVhbV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFdhaXRGb3JUaWNrKGNodW5rLmxlbmd0aCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2FpdEZvclRpY2soKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gOTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW1SZWYgPSBQREZSZWYub2Yob2JqZWN0TnVtYmVyKyspO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZlN0cmVhbS5kaWN0LnNldChQREZOYW1lLm9mKCdTaXplJyksIFBERk51bWJlci5vZihvYmplY3ROdW1iZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW0uYWRkVW5jb21wcmVzc2VkRW50cnkoeHJlZlN0cmVhbVJlZiwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmT2Zmc2V0ID0gc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jb21wdXRlSW5kaXJlY3RPYmplY3RTaXplKFt4cmVmU3RyZWFtUmVmLCB4cmVmU3RyZWFtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRPYmplY3RzLnB1c2goW3hyZWZTdHJlYW1SZWYsIHhyZWZTdHJlYW1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsZXIgPSBQREZUcmFpbGVyLmZvckxhc3RDcm9zc1JlZlNlY3Rpb25PZmZzZXQoeHJlZk9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRyYWlsZXIuc2l6ZUluQnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7IHNpemU6IHNpemUsIGhlYWRlcjogaGVhZGVyLCBpbmRpcmVjdE9iamVjdHM6IHVuY29tcHJlc3NlZE9iamVjdHMsIHRyYWlsZXI6IHRyYWlsZXIgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGU3RyZWFtV3JpdGVyLmZvckNvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgb2JqZWN0c1BlclRpY2ssIGVuY29kZVN0cmVhbXMsIG9iamVjdHNQZXJTdHJlYW0pIHtcbiAgICAgICAgaWYgKGVuY29kZVN0cmVhbXMgPT09IHZvaWQgMCkgeyBlbmNvZGVTdHJlYW1zID0gdHJ1ZTsgfVxuICAgICAgICBpZiAob2JqZWN0c1BlclN0cmVhbSA9PT0gdm9pZCAwKSB7IG9iamVjdHNQZXJTdHJlYW0gPSA1MDsgfVxuICAgICAgICByZXR1cm4gbmV3IFBERlN0cmVhbVdyaXRlcihjb250ZXh0LCBvYmplY3RzUGVyVGljaywgZW5jb2RlU3RyZWFtcywgb2JqZWN0c1BlclN0cmVhbSk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGU3RyZWFtV3JpdGVyO1xufShQREZXcml0ZXIpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlN0cmVhbVdyaXRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlN0cmVhbVdyaXRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQ3Jvc3NSZWZTZWN0aW9uIGZyb20gXCIuLi9kb2N1bWVudC9QREZDcm9zc1JlZlNlY3Rpb25cIjtcbmltcG9ydCBQREZIZWFkZXIgZnJvbSBcIi4uL2RvY3VtZW50L1BERkhlYWRlclwiO1xuaW1wb3J0IFBERlRyYWlsZXIgZnJvbSBcIi4uL2RvY3VtZW50L1BERlRyYWlsZXJcIjtcbmltcG9ydCBQREZUcmFpbGVyRGljdCBmcm9tIFwiLi4vZG9jdW1lbnQvUERGVHJhaWxlckRpY3RcIjtcbmltcG9ydCBQREZPYmplY3RTdHJlYW0gZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGT2JqZWN0U3RyZWFtXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciwgd2FpdEZvclRpY2sgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZXcml0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGV3JpdGVyKGNvbnRleHQsIG9iamVjdHNQZXJUaWNrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMucGFyc2VkT2JqZWN0cyA9IDA7XG4gICAgICAgIHRoaXMuc2hvdWxkV2FpdEZvclRpY2sgPSBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgX3RoaXMucGFyc2VkT2JqZWN0cyArPSBuO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnBhcnNlZE9iamVjdHMgJSBfdGhpcy5vYmplY3RzUGVyVGljayA9PT0gMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5vYmplY3RzUGVyVGljayA9IG9iamVjdHNQZXJUaWNrO1xuICAgIH1cbiAgICBQREZXcml0ZXIucHJvdG90eXBlLnNlcmlhbGl6ZVRvQnVmZmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHNpemUsIGhlYWRlciwgaW5kaXJlY3RPYmplY3RzLCB4cmVmLCB0cmFpbGVyRGljdCwgdHJhaWxlciwgb2Zmc2V0LCBidWZmZXIsIGlkeCwgbGVuLCBfYiwgcmVmLCBvYmplY3QsIG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbk51bWJlciwgbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5jb21wdXRlQnVmZmVyU2l6ZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBfYy5zZW50KCksIHNpemUgPSBfYS5zaXplLCBoZWFkZXIgPSBfYS5oZWFkZXIsIGluZGlyZWN0T2JqZWN0cyA9IF9hLmluZGlyZWN0T2JqZWN0cywgeHJlZiA9IF9hLnhyZWYsIHRyYWlsZXJEaWN0ID0gX2EudHJhaWxlckRpY3QsIHRyYWlsZXIgPSBfYS50cmFpbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGhlYWRlci5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IGluZGlyZWN0T2JqZWN0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBpbmRpcmVjdE9iamVjdHNbaWR4XSwgcmVmID0gX2JbMF0sIG9iamVjdCA9IF9iWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TnVtYmVyID0gU3RyaW5nKHJlZi5vYmplY3ROdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKG9iamVjdE51bWJlciwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25OdW1iZXIgPSBTdHJpbmcocmVmLmdlbmVyYXRpb25OdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKGdlbmVyYXRpb25OdW1iZXIsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm87XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmI7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmo7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gb2JqZWN0LmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5uO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5vO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5iO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5qO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG9iamVjdCBpbnN0YW5jZW9mIFBERk9iamVjdFN0cmVhbSA/IG9iamVjdC5nZXRPYmplY3RzQ291bnQoKSA6IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEZvclRpY2sobikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2FpdEZvclRpY2soKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gNDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0geHJlZi5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhaWxlckRpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdHJhaWxlckRpY3QuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB0cmFpbGVyLmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGJ1ZmZlcl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGV3JpdGVyLnByb3RvdHlwZS5jb21wdXRlSW5kaXJlY3RPYmplY3RTaXplID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciByZWYgPSBfYVswXSwgb2JqZWN0ID0gX2FbMV07XG4gICAgICAgIHZhciByZWZTaXplID0gcmVmLnNpemVJbkJ5dGVzKCkgKyAzOyAvLyAnUicgLT4gJ29ialxcbidcbiAgICAgICAgdmFyIG9iamVjdFNpemUgPSBvYmplY3Quc2l6ZUluQnl0ZXMoKSArIDk7IC8vICdcXG5lbmRvYmpcXG5cXG4nXG4gICAgICAgIHJldHVybiByZWZTaXplICsgb2JqZWN0U2l6ZTtcbiAgICB9O1xuICAgIFBERldyaXRlci5wcm90b3R5cGUuY3JlYXRlVHJhaWxlckRpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIFNpemU6IHRoaXMuY29udGV4dC5sYXJnZXN0T2JqZWN0TnVtYmVyICsgMSxcbiAgICAgICAgICAgIFJvb3Q6IHRoaXMuY29udGV4dC50cmFpbGVySW5mby5Sb290LFxuICAgICAgICAgICAgRW5jcnlwdDogdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLkVuY3J5cHQsXG4gICAgICAgICAgICBJbmZvOiB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uSW5mbyxcbiAgICAgICAgICAgIElEOiB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uSUQsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGV3JpdGVyLnByb3RvdHlwZS5jb21wdXRlQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGhlYWRlciwgc2l6ZSwgeHJlZiwgaW5kaXJlY3RPYmplY3RzLCBpZHgsIGxlbiwgaW5kaXJlY3RPYmplY3QsIHJlZiwgeHJlZk9mZnNldCwgdHJhaWxlckRpY3QsIHRyYWlsZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBQREZIZWFkZXIuZm9yVmVyc2lvbigxLCA3KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBoZWFkZXIuc2l6ZUluQnl0ZXMoKSArIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmID0gUERGQ3Jvc3NSZWZTZWN0aW9uLmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3RPYmplY3RzID0gdGhpcy5jb250ZXh0LmVudW1lcmF0ZUluZGlyZWN0T2JqZWN0cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gMCwgbGVuID0gaW5kaXJlY3RPYmplY3RzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpcmVjdE9iamVjdCA9IGluZGlyZWN0T2JqZWN0c1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gaW5kaXJlY3RPYmplY3RbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmLmFkZEVudHJ5KHJlZiwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRoaXMuY29tcHV0ZUluZGlyZWN0T2JqZWN0U2l6ZShpbmRpcmVjdE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEZvclRpY2soMSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2FpdEZvclRpY2soKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZk9mZnNldCA9IHNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHhyZWYuc2l6ZUluQnl0ZXMoKSArIDE7IC8vICdcXG4nXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGVyRGljdCA9IFBERlRyYWlsZXJEaWN0Lm9mKHRoaXMuY3JlYXRlVHJhaWxlckRpY3QoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRyYWlsZXJEaWN0LnNpemVJbkJ5dGVzKCkgKyAyOyAvLyAnXFxuXFxuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxlciA9IFBERlRyYWlsZXIuZm9yTGFzdENyb3NzUmVmU2VjdGlvbk9mZnNldCh4cmVmT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdHJhaWxlci5zaXplSW5CeXRlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgc2l6ZTogc2l6ZSwgaGVhZGVyOiBoZWFkZXIsIGluZGlyZWN0T2JqZWN0czogaW5kaXJlY3RPYmplY3RzLCB4cmVmOiB4cmVmLCB0cmFpbGVyRGljdDogdHJhaWxlckRpY3QsIHRyYWlsZXI6IHRyYWlsZXIgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGV3JpdGVyLmZvckNvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgb2JqZWN0c1BlclRpY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZXcml0ZXIoY29udGV4dCwgb2JqZWN0c1BlclRpY2spO1xuICAgIH07XG4gICAgcmV0dXJuIFBERldyaXRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZXcml0ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZXcml0ZXIuanMubWFwIiwiZXhwb3J0ICogZnJvbSBcIi4vYXBpL2luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3JlL2luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy9pbmRleFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsInZhciBDYWNoZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYWNoZShwb3B1bGF0ZSkge1xuICAgICAgICB0aGlzLnBvcHVsYXRlID0gcG9wdWxhdGU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIENhY2hlLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBDYWNoZS5wcm90b3R5cGUuYWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsdWUpXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5wb3B1bGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIENhY2hlLnByb3RvdHlwZS5pbnZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQ2FjaGUucG9wdWxhdGVkQnkgPSBmdW5jdGlvbiAocG9wdWxhdGUpIHsgcmV0dXJuIG5ldyBDYWNoZShwb3B1bGF0ZSk7IH07XG4gICAgcmV0dXJuIENhY2hlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IENhY2hlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2FjaGUuanMubWFwIiwiaW1wb3J0IHsgZGVjb2RlRnJvbUJhc2U2NERhdGFVcmkgfSBmcm9tIFwiLi9iYXNlNjRcIjtcbmltcG9ydCB7IGNoYXJGcm9tQ29kZSB9IGZyb20gXCIuL3N0cmluZ3NcIjtcbmV4cG9ydCB2YXIgbGFzdCA9IGZ1bmN0aW9uIChhcnJheSkgeyByZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV07IH07XG4vLyBleHBvcnQgY29uc3QgZHJvcExhc3QgPSA8VD4oYXJyYXk6IFRbXSk6IFRbXSA9PlxuLy8gYXJyYXkuc2xpY2UoMCwgYXJyYXkubGVuZ3RoIC0gMSk7XG5leHBvcnQgdmFyIHR5cGVkQXJyYXlGb3IgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgdHlwZWRBcnJheSA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgICB0eXBlZEFycmF5W2lkeF0gPSB2YWx1ZS5jaGFyQ29kZUF0KGlkeCk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlZEFycmF5O1xufTtcbmV4cG9ydCB2YXIgbWVyZ2VJbnRvVHlwZWRBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJyYXlzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJyYXlzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBhcnJheUNvdW50ID0gYXJyYXlzLmxlbmd0aDtcbiAgICB2YXIgdHlwZWRBcnJheXMgPSBbXTtcbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBhcnJheUNvdW50OyBpZHgrKykge1xuICAgICAgICB2YXIgZWxlbWVudCA9IGFycmF5c1tpZHhdO1xuICAgICAgICB0eXBlZEFycmF5c1tpZHhdID1cbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gZWxlbWVudCA6IHR5cGVkQXJyYXlGb3IoZWxlbWVudCk7XG4gICAgfVxuICAgIHZhciB0b3RhbFNpemUgPSAwO1xuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGFycmF5Q291bnQ7IGlkeCsrKSB7XG4gICAgICAgIHRvdGFsU2l6ZSArPSBhcnJheXNbaWR4XS5sZW5ndGg7XG4gICAgfVxuICAgIHZhciBtZXJnZWQgPSBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpO1xuICAgIHZhciBvZmZzZXQgPSAwO1xuICAgIGZvciAodmFyIGFycklkeCA9IDA7IGFycklkeCA8IGFycmF5Q291bnQ7IGFycklkeCsrKSB7XG4gICAgICAgIHZhciBhcnIgPSB0eXBlZEFycmF5c1thcnJJZHhdO1xuICAgICAgICBmb3IgKHZhciBieXRlSWR4ID0gMCwgYXJyTGVuID0gYXJyLmxlbmd0aDsgYnl0ZUlkeCA8IGFyckxlbjsgYnl0ZUlkeCsrKSB7XG4gICAgICAgICAgICBtZXJnZWRbb2Zmc2V0KytdID0gYXJyW2J5dGVJZHhdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWQ7XG59O1xuZXhwb3J0IHZhciBtZXJnZVVpbnQ4QXJyYXlzID0gZnVuY3Rpb24gKGFycmF5cykge1xuICAgIHZhciB0b3RhbFNpemUgPSAwO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdG90YWxTaXplICs9IGFycmF5c1tpZHhdLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIG1lcmdlZEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRvdGFsU2l6ZSk7XG4gICAgdmFyIG9mZnNldCA9IDA7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXlzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaWR4XTtcbiAgICAgICAgbWVyZ2VkQnVmZmVyLnNldChhcnJheSwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IGFycmF5Lmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZEJ1ZmZlcjtcbn07XG5leHBvcnQgdmFyIGFycmF5QXNTdHJpbmcgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHN0ciArPSBjaGFyRnJvbUNvZGUoYXJyYXlbaWR4XSk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59O1xuZXhwb3J0IHZhciBieUFzY2VuZGluZ0lkID0gZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9O1xuZXhwb3J0IHZhciBzb3J0ZWRVbmlxID0gZnVuY3Rpb24gKGFycmF5LCBpbmRleGVyKSB7XG4gICAgdmFyIHVuaXEgPSBbXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGN1cnIgPSBhcnJheVtpZHhdO1xuICAgICAgICB2YXIgcHJldiA9IGFycmF5W2lkeCAtIDFdO1xuICAgICAgICBpZiAoaWR4ID09PSAwIHx8IGluZGV4ZXIoY3VycikgIT09IGluZGV4ZXIocHJldikpIHtcbiAgICAgICAgICAgIHVuaXEucHVzaChjdXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5pcTtcbn07XG4vLyBBcnJheXMgYW5kIFR5cGVkQXJyYXlzIGluIEpTIGJvdGggaGF2ZSAucmV2ZXJzZSgpIG1ldGhvZHMsIHdoaWNoIHdvdWxkIHNlZW1cbi8vIHRvIG5lZ2F0ZSB0aGUgbmVlZCBmb3IgdGhpcyBmdW5jdGlvbi4gSG93ZXZlciwgbm90IGFsbCBydW50aW1lcyBzdXBwb3J0IHRoaXNcbi8vIG1ldGhvZCAoZS5nLiBSZWFjdCBOYXRpdmUpLiBUaGlzIGZ1bmN0aW9uIGNvbXBlbnNhdGVzIGZvciB0aGF0IGZhY3QuXG5leHBvcnQgdmFyIHJldmVyc2VBcnJheSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgIHZhciBhcnJheUxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBNYXRoLmZsb29yKGFycmF5TGVuIC8gMik7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIGxlZnRJZHggPSBpZHg7XG4gICAgICAgIHZhciByaWdodElkeCA9IGFycmF5TGVuIC0gaWR4IC0gMTtcbiAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpZHhdO1xuICAgICAgICBhcnJheVtsZWZ0SWR4XSA9IGFycmF5W3JpZ2h0SWR4XTtcbiAgICAgICAgYXJyYXlbcmlnaHRJZHhdID0gdGVtcDtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufTtcbmV4cG9ydCB2YXIgc3VtID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgdmFyIHRvdGFsID0gMDtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdG90YWwgKz0gYXJyYXlbaWR4XTtcbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsO1xufTtcbmV4cG9ydCB2YXIgcmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZW5kIC0gc3RhcnQpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgYXJyW2lkeF0gPSBzdGFydCArIGlkeDtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbn07XG5leHBvcnQgdmFyIHBsdWNrSW5kaWNlcyA9IGZ1bmN0aW9uIChhcnIsIGluZGljZXMpIHtcbiAgICB2YXIgcGx1Y2tlZCA9IG5ldyBBcnJheShpbmRpY2VzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gaW5kaWNlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgcGx1Y2tlZFtpZHhdID0gYXJyW2luZGljZXNbaWR4XV07XG4gICAgfVxuICAgIHJldHVybiBwbHVja2VkO1xufTtcbmV4cG9ydCB2YXIgY2FuQmVDb252ZXJ0ZWRUb1VpbnQ4QXJyYXkgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJztcbn07XG5leHBvcnQgdmFyIHRvVWludDhBcnJheSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVGcm9tQmFzZTY0RGF0YVVyaShpbnB1dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BpbnB1dGAgbXVzdCBiZSBvbmUgb2YgYHN0cmluZyB8IEFycmF5QnVmZmVyIHwgVWludDhBcnJheWAnKTtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXlzLmpzLm1hcCIsIi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBhdCBsZWFzdCBvbmUgdGljayBvZiB0aGVcbiAqIE1hY3JvIFRhc2sgUXVldWUgb2NjdXJzLlxuICovXG5leHBvcnQgdmFyIHdhaXRGb3JUaWNrID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc29sdmUoKTsgfSwgMCk7XG4gICAgfSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXN5bmMuanMubWFwIiwiLypcbiAqIFRoZSBgY2hhcnNgLCBgbG9va3VwYCwgYGVuY29kZWAsIGFuZCBgZGVjb2RlYCBtZW1iZXJzIG9mIHRoaXMgZmlsZSBhcmVcbiAqIGxpY2Vuc2VkIHVuZGVyIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICAgIGJhc2U2NC1hcnJheWJ1ZmZlclxuICogICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uaWtsYXN2aC9iYXNlNjQtYXJyYXlidWZmZXJcbiAqXG4gKiAgICAgQ29weXJpZ2h0IChjKSAyMDEyIE5pa2xhcyB2b24gSGVydHplblxuICogICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqXG4gKi9cbnZhciBjaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcbi8vIFVzZSBhIGxvb2t1cCB0YWJsZSB0byBmaW5kIHRoZSBpbmRleC5cbnZhciBsb29rdXAgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG59XG5leHBvcnQgdmFyIGVuY29kZVRvQmFzZTY0ID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgdmFyIGJhc2U2NCA9ICcnO1xuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107XG4gICAgfVxuICAgIGlmIChsZW4gJSAzID09PSAyKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nO1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JztcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U2NDtcbn07XG5leHBvcnQgdmFyIGRlY29kZUZyb21CYXNlNjQgPSBmdW5jdGlvbiAoYmFzZTY0KSB7XG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGJhc2U2NC5sZW5ndGggKiAwLjc1O1xuICAgIHZhciBsZW4gPSBiYXNlNjQubGVuZ3RoO1xuICAgIHZhciBpO1xuICAgIHZhciBwID0gMDtcbiAgICB2YXIgZW5jb2RlZDE7XG4gICAgdmFyIGVuY29kZWQyO1xuICAgIHZhciBlbmNvZGVkMztcbiAgICB2YXIgZW5jb2RlZDQ7XG4gICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMV0gPT09ICc9Jykge1xuICAgICAgICBidWZmZXJMZW5ndGgtLTtcbiAgICAgICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMl0gPT09ICc9Jykge1xuICAgICAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyTGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICAgICAgZW5jb2RlZDEgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBlbmNvZGVkMiA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMSldO1xuICAgICAgICBlbmNvZGVkMyA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMildO1xuICAgICAgICBlbmNvZGVkNCA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMyldO1xuICAgICAgICBieXRlc1twKytdID0gKGVuY29kZWQxIDw8IDIpIHwgKGVuY29kZWQyID4+IDQpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMiAmIDE1KSA8PCA0KSB8IChlbmNvZGVkMyA+PiAyKTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9ICgoZW5jb2RlZDMgJiAzKSA8PCA2KSB8IChlbmNvZGVkNCAmIDYzKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufTtcbi8vIFRoaXMgcmVnZXggaXMgZGVzaWduZWQgdG8gYmUgYXMgZmxleGlibGUgYXMgcG9zc2libGUuIEl0IHdpbGwgcGFyc2UgY2VydGFpblxuLy8gaW52YWxpZCBkYXRhIFVSSXMuXG52YXIgREFUQV9VUklfUFJFRklYX1JFR0VYID0gL14oZGF0YSk/Oj8oW1xcd1xcL1xcK10rKT87PyhjaGFyc2V0PVtcXHctXSt8YmFzZTY0KT8uKiwvaTtcbi8qKlxuICogSWYgdGhlIGBkYXRhVXJpYCBpbnB1dCBpcyBhIGRhdGEgVVJJLCB0aGVuIHRoZSBkYXRhIFVSSSBwcmVmaXggbXVzdCBub3QgYmVcbiAqIGxvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzLCBvciB0aGlzIGZ1bmN0aW9uIHdpbGwgZmFpbCB0byBkZWNvZGUgaXQuXG4gKlxuICogQHBhcmFtIGRhdGFVcmkgYSBiYXNlNjQgZGF0YSBVUkkgb3IgcGxhaW4gYmFzZTY0IHN0cmluZ1xuICogQHJldHVybnMgYSBVaW50OEFycmF5IGNvbnRhaW5pbmcgdGhlIGRlY29kZWQgaW5wdXRcbiAqL1xuZXhwb3J0IHZhciBkZWNvZGVGcm9tQmFzZTY0RGF0YVVyaSA9IGZ1bmN0aW9uIChkYXRhVXJpKSB7XG4gICAgdmFyIHRyaW1tZWRVcmkgPSBkYXRhVXJpLnRyaW0oKTtcbiAgICB2YXIgcHJlZml4ID0gdHJpbW1lZFVyaS5zdWJzdHJpbmcoMCwgMTAwKTtcbiAgICB2YXIgcmVzID0gcHJlZml4Lm1hdGNoKERBVEFfVVJJX1BSRUZJWF9SRUdFWCk7XG4gICAgLy8gQXNzdW1lIGl0J3Mgbm90IGEgZGF0YSBVUkkgLSBqdXN0IGEgcGxhaW4gYmFzZTY0IHN0cmluZ1xuICAgIGlmICghcmVzKVxuICAgICAgICByZXR1cm4gZGVjb2RlRnJvbUJhc2U2NCh0cmltbWVkVXJpKTtcbiAgICAvLyBSZW1vdmUgdGhlIGRhdGEgVVJJIHByZWZpeCBhbmQgcGFyc2UgdGhlIHJlbWFpbmRlciBhcyBhIGJhc2U2NCBzdHJpbmdcbiAgICB2YXIgZnVsbE1hdGNoID0gcmVzWzBdO1xuICAgIHZhciBkYXRhID0gdHJpbW1lZFVyaS5zdWJzdHJpbmcoZnVsbE1hdGNoLmxlbmd0aCk7XG4gICAgcmV0dXJuIGRlY29kZUZyb21CYXNlNjQoZGF0YSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZTY0LmpzLm1hcCIsImV4cG9ydCB2YXIgZXJyb3IgPSBmdW5jdGlvbiAobXNnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2FycmF5c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXN5bmNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmluZ3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3VuaWNvZGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL251bWJlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vYmFzZTY0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vYmplY3RzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92YWxpZGF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wZGZEb2NFbmNvZGluZ1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDYWNoZSB9IGZyb20gXCIuL0NhY2hlXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyB0c2xpbnQ6ZGlzYWJsZSByYWRpeFxuLyoqXG4gKiBDb252ZXJ0cyBhIG51bWJlciB0byBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGluIGRlY2ltYWwuIFRoaXMgZnVuY3Rpb25cbiAqIGRpZmZlcnMgZnJvbSBzaW1wbHkgY29udmVydGluZyBhIG51bWJlciB0byBhIHN0cmluZyB3aXRoIGAudG9TdHJpbmcoKWBcbiAqIGJlY2F1c2UgdGhpcyBmdW5jdGlvbidzIG91dHB1dCBzdHJpbmcgd2lsbCAqKm5vdCoqIGNvbnRhaW4gZXhwb25lbnRpYWxcbiAqIG5vdGF0aW9uLlxuICpcbiAqIENyZWRpdDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2NTQ1NTE5XG4gKi9cbmV4cG9ydCB2YXIgbnVtYmVyVG9TdHJpbmcgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgdmFyIG51bVN0ciA9IFN0cmluZyhudW0pO1xuICAgIGlmIChNYXRoLmFicyhudW0pIDwgMS4wKSB7XG4gICAgICAgIHZhciBlID0gcGFyc2VJbnQobnVtLnRvU3RyaW5nKCkuc3BsaXQoJ2UtJylbMV0pO1xuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgdmFyIG5lZ2F0aXZlID0gbnVtIDwgMDtcbiAgICAgICAgICAgIGlmIChuZWdhdGl2ZSlcbiAgICAgICAgICAgICAgICBudW0gKj0gLTE7XG4gICAgICAgICAgICBudW0gKj0gTWF0aC5wb3coMTAsIGUgLSAxKTtcbiAgICAgICAgICAgIG51bVN0ciA9ICcwLicgKyBuZXcgQXJyYXkoZSkuam9pbignMCcpICsgbnVtLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpO1xuICAgICAgICAgICAgaWYgKG5lZ2F0aXZlKVxuICAgICAgICAgICAgICAgIG51bVN0ciA9ICctJyArIG51bVN0cjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGUgPSBwYXJzZUludChudW0udG9TdHJpbmcoKS5zcGxpdCgnKycpWzFdKTtcbiAgICAgICAgaWYgKGUgPiAyMCkge1xuICAgICAgICAgICAgZSAtPSAyMDtcbiAgICAgICAgICAgIG51bSAvPSBNYXRoLnBvdygxMCwgZSk7XG4gICAgICAgICAgICBudW1TdHIgPSBudW0udG9TdHJpbmcoKSArIG5ldyBBcnJheShlICsgMSkuam9pbignMCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudW1TdHI7XG59O1xuZXhwb3J0IHZhciBzaXplSW5CeXRlcyA9IGZ1bmN0aW9uIChuKSB7IHJldHVybiBNYXRoLmNlaWwobi50b1N0cmluZygyKS5sZW5ndGggLyA4KTsgfTtcbi8qKlxuICogQ29udmVydHMgYSBudW1iZXIgaW50byBpdHMgY29uc3RpdHVlbnQgYnl0ZXMgYW5kIHJldHVybnMgdGhlbSBhc1xuICogYSBudW1iZXJbXS5cbiAqXG4gKiBSZXR1cm5zIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBhcyBmaXJzdCBlbGVtZW50IGluIGFycmF5LiBJdCBtYXkgYmUgbmVjZXNzYXJ5XG4gKiB0byBjYWxsIC5yZXZlcnNlKCkgdG8gZ2V0IHRoZSBiaXRzIGluIHRoZSBkZXNpcmVkIG9yZGVyLlxuICpcbiAqIEV4YW1wbGU6XG4gKiAgIGJ5dGVzRm9yKDB4MDJBNDFFKSA9PiBbIDBiMTAsIDBiMTAxMDAxMDAsIDBiMTExMTAgXVxuICpcbiAqIENyZWRpdCBmb3IgYWxnb3JpdGhtOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTkzNjg2NVxuICovXG5leHBvcnQgdmFyIGJ5dGVzRm9yID0gZnVuY3Rpb24gKG4pIHtcbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShzaXplSW5CeXRlcyhuKSk7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYnl0ZXNbaSAtIDFdID0gbiA+PiAoKGJ5dGVzLmxlbmd0aCAtIGkpICogOCk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1udW1iZXJzLmpzLm1hcCIsImltcG9ydCB7IEZvbnROYW1lcyB9IGZyb20gJ0BwZGYtbGliL3N0YW5kYXJkLWZvbnRzJztcbmV4cG9ydCB2YXIgdmFsdWVzID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGspIHsgcmV0dXJuIG9ialtrXTsgfSk7IH07XG5leHBvcnQgdmFyIFN0YW5kYXJkRm9udFZhbHVlcyA9IHZhbHVlcyhGb250TmFtZXMpO1xuZXhwb3J0IHZhciBpc1N0YW5kYXJkRm9udCA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHJldHVybiBTdGFuZGFyZEZvbnRWYWx1ZXMuaW5jbHVkZXMoaW5wdXQpO1xufTtcbmV4cG9ydCB2YXIgcmVjdGFuZ2xlc0FyZUVxdWFsID0gZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEueCA9PT0gYi54ICYmIGEueSA9PT0gYi55ICYmIGEud2lkdGggPT09IGIud2lkdGggJiYgYS5oZWlnaHQgPT09IGIuaGVpZ2h0OyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JqZWN0cy5qcy5tYXAiLCJpbXBvcnQgeyB0b0NoYXJDb2RlIH0gZnJvbSBcIi4vc3RyaW5nc1wiO1xuLy8gTWFwcGluZyBmcm9tIFBERkRvY0VuY29kaW5nIHRvIFVuaWNvZGUgY29kZSBwb2ludFxudmFyIHBkZkRvY0VuY29kaW5nVG9Vbmljb2RlID0gbmV3IFVpbnQxNkFycmF5KDI1Nik7XG4vLyBJbml0aWFsaXplIHRoZSBjb2RlIHBvaW50cyB3aGljaCBhcmUgdGhlIHNhbWVcbmZvciAodmFyIGlkeCA9IDA7IGlkeCA8IDI1NjsgaWR4KyspIHtcbiAgICBwZGZEb2NFbmNvZGluZ1RvVW5pY29kZVtpZHhdID0gaWR4O1xufVxuLy8gU2V0IGRpZmZlcmVuY2VzIChzZWUgXCJUYWJsZSBELjIg4oCTIFBERkRvY0VuY29kaW5nIENoYXJhY3RlciBTZXRcIiBvZiB0aGUgUERGIHNwZWMpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDE2XSA9IHRvQ2hhckNvZGUoJ1xcdTAwMTcnKTsgLy8gU1lOQ1JPTk9VUyBJRExFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDE4XSA9IHRvQ2hhckNvZGUoJ1xcdTAyRDgnKTsgLy8gQlJFVkVcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MTldID0gdG9DaGFyQ29kZSgnXFx1MDJDNycpOyAvLyBDQVJPTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxYV0gPSB0b0NoYXJDb2RlKCdcXHUwMkM2Jyk7IC8vIE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVFxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxYl0gPSB0b0NoYXJDb2RlKCdcXHUwMkQ5Jyk7IC8vIERPVCBBQk9WRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxY10gPSB0b0NoYXJDb2RlKCdcXHUwMkREJyk7IC8vIERPVUJMRSBBQ1VURSBBQ0NFTlRcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MWRdID0gdG9DaGFyQ29kZSgnXFx1MDJEQicpOyAvLyBPR09ORUtcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MWVdID0gdG9DaGFyQ29kZSgnXFx1MDJEQScpOyAvLyBSSU5HIEFCT1ZFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDFmXSA9IHRvQ2hhckNvZGUoJ1xcdTAyREMnKTsgLy8gU01BTEwgVElMREVcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4N2ZdID0gdG9DaGFyQ29kZSgnXFx1RkZGRCcpOyAvLyBSRVBMQUNFTUVOVCBDSEFSQUNURVIgKGJveCB3aXRoIHF1ZXN0aW9ubWFyaylcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODBdID0gdG9DaGFyQ29kZSgnXFx1MjAyMicpOyAvLyBCVUxMRVRcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODFdID0gdG9DaGFyQ29kZSgnXFx1MjAyMCcpOyAvLyBEQUdHRVJcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODJdID0gdG9DaGFyQ29kZSgnXFx1MjAyMScpOyAvLyBET1VCTEUgREFHR0VSXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDgzXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMjYnKTsgLy8gSE9SSVpPTlRBTCBFTExJUFNJU1xucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4NF0gPSB0b0NoYXJDb2RlKCdcXHUyMDE0Jyk7IC8vIEVNIERBU0hcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODVdID0gdG9DaGFyQ29kZSgnXFx1MjAxMycpOyAvLyBFTiBEQVNIXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDg2XSA9IHRvQ2hhckNvZGUoJ1xcdTAxOTInKTsgLy8gTEFUSU4gU01BTEwgTEVUVEVSIFNDUklQVCBGXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDg3XSA9IHRvQ2hhckNvZGUoJ1xcdTIwNDQnKTsgLy8gRlJBQ1RJT04gU0xBU0ggKHNvbGlkdXMpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDg4XSA9IHRvQ2hhckNvZGUoJ1xcdTIwMzknKTsgLy8gU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUktcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODldID0gdG9DaGFyQ29kZSgnXFx1MjAzQScpOyAvLyBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUktcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OGFdID0gdG9DaGFyQ29kZSgnXFx1MjIxMicpOyAvLyBNSU5VUyBTSUdOXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDhiXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMzAnKTsgLy8gUEVSIE1JTExFIFNJR05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OGNdID0gdG9DaGFyQ29kZSgnXFx1MjAxRScpOyAvLyBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKHF1b3RlZGJsYmFzZSlcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OGRdID0gdG9DaGFyQ29kZSgnXFx1MjAxQycpOyAvLyBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAocXVvdGVkYmxsZWZ0KVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4ZV0gPSB0b0NoYXJDb2RlKCdcXHUyMDFEJyk7IC8vIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSyAocXVvdGVkYmxyaWdodClcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OGZdID0gdG9DaGFyQ29kZSgnXFx1MjAxOCcpOyAvLyBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAocXVvdGVsZWZ0KVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5MF0gPSB0b0NoYXJDb2RlKCdcXHUyMDE5Jyk7IC8vIFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSyAocXVvdGVyaWdodClcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTFdID0gdG9DaGFyQ29kZSgnXFx1MjAxQScpOyAvLyBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksgKHF1b3Rlc2luZ2xiYXNlKVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5Ml0gPSB0b0NoYXJDb2RlKCdcXHUyMTIyJyk7IC8vIFRSQURFIE1BUksgU0lHTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5M10gPSB0b0NoYXJDb2RlKCdcXHVGQjAxJyk7IC8vIExBVElOIFNNQUxMIExJR0FUVVJFIEZJXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDk0XSA9IHRvQ2hhckNvZGUoJ1xcdUZCMDInKTsgLy8gTEFUSU4gU01BTEwgTElHQVRVUkUgRkxcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTVdID0gdG9DaGFyQ29kZSgnXFx1MDE0MScpOyAvLyBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDk2XSA9IHRvQ2hhckNvZGUoJ1xcdTAxNTInKTsgLy8gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5N10gPSB0b0NoYXJDb2RlKCdcXHUwMTYwJyk7IC8vIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5OF0gPSB0b0NoYXJDb2RlKCdcXHUwMTc4Jyk7IC8vIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVNcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTldID0gdG9DaGFyQ29kZSgnXFx1MDE3RCcpOyAvLyBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OWFdID0gdG9DaGFyQ29kZSgnXFx1MDEzMScpOyAvLyBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDliXSA9IHRvQ2hhckNvZGUoJ1xcdTAxNDInKTsgLy8gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0VcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OWNdID0gdG9DaGFyQ29kZSgnXFx1MDE1MycpOyAvLyBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5ZF0gPSB0b0NoYXJDb2RlKCdcXHUwMTYxJyk7IC8vIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OWVdID0gdG9DaGFyQ29kZSgnXFx1MDE3RScpOyAvLyBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDlmXSA9IHRvQ2hhckNvZGUoJ1xcdUZGRkQnKTsgLy8gUkVQTEFDRU1FTlQgQ0hBUkFDVEVSIChib3ggd2l0aCBxdWVzdGlvbm1hcmspXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweGEwXSA9IHRvQ2hhckNvZGUoJ1xcdTIwQUMnKTsgLy8gRVVSTyBTSUdOXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweGFkXSA9IHRvQ2hhckNvZGUoJ1xcdUZGRkQnKTsgLy8gUkVQTEFDRU1FTlQgQ0hBUkFDVEVSIChib3ggd2l0aCBxdWVzdGlvbm1hcmspXG4vKipcbiAqIERlY29kZSBhIGJ5dGUgYXJyYXkgaW50byBhIHN0cmluZyB1c2luZyBQREZEb2NFbmNvZGluZy5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgYSBieXRlIGFycmF5IChkZWNpbWFsIHJlcHJlc2VudGF0aW9uKSBjb250YWluaW5nIGEgc3RyaW5nXG4gKiAgICAgICAgICAgICAgZW5jb2RlZCB3aXRoIFBERkRvY0VuY29kaW5nLlxuICovXG5leHBvcnQgdmFyIHBkZkRvY0VuY29kaW5nRGVjb2RlID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgdmFyIGNvZGVQb2ludHMgPSBuZXcgQXJyYXkoYnl0ZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBieXRlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgY29kZVBvaW50c1tpZHhdID0gcGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbYnl0ZXNbaWR4XV07XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBkZkRvY0VuY29kaW5nLmpzLm1hcCIsImltcG9ydCBVUE5HIGZyb20gJ0BwZGYtbGliL3VwbmcnO1xudmFyIGdldEltYWdlVHlwZSA9IGZ1bmN0aW9uIChjdHlwZSkge1xuICAgIGlmIChjdHlwZSA9PT0gMClcbiAgICAgICAgcmV0dXJuIFBuZ1R5cGUuR3JleXNjYWxlO1xuICAgIGlmIChjdHlwZSA9PT0gMilcbiAgICAgICAgcmV0dXJuIFBuZ1R5cGUuVHJ1ZWNvbG91cjtcbiAgICBpZiAoY3R5cGUgPT09IDMpXG4gICAgICAgIHJldHVybiBQbmdUeXBlLkluZGV4ZWRDb2xvdXI7XG4gICAgaWYgKGN0eXBlID09PSA0KVxuICAgICAgICByZXR1cm4gUG5nVHlwZS5HcmV5c2NhbGVXaXRoQWxwaGE7XG4gICAgaWYgKGN0eXBlID09PSA2KVxuICAgICAgICByZXR1cm4gUG5nVHlwZS5UcnVlY29sb3VyV2l0aEFscGhhO1xuICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY29sb3IgdHlwZTogXCIgKyBjdHlwZSk7XG59O1xudmFyIHNwbGl0QWxwaGFDaGFubmVsID0gZnVuY3Rpb24gKHJnYmFDaGFubmVsKSB7XG4gICAgdmFyIHBpeGVsQ291bnQgPSBNYXRoLmZsb29yKHJnYmFDaGFubmVsLmxlbmd0aCAvIDQpO1xuICAgIHZhciByZ2JDaGFubmVsID0gbmV3IFVpbnQ4QXJyYXkocGl4ZWxDb3VudCAqIDMpO1xuICAgIHZhciBhbHBoYUNoYW5uZWwgPSBuZXcgVWludDhBcnJheShwaXhlbENvdW50ICogMSk7XG4gICAgdmFyIHJnYmFPZmZzZXQgPSAwO1xuICAgIHZhciByZ2JPZmZzZXQgPSAwO1xuICAgIHZhciBhbHBoYU9mZnNldCA9IDA7XG4gICAgd2hpbGUgKHJnYmFPZmZzZXQgPCByZ2JhQ2hhbm5lbC5sZW5ndGgpIHtcbiAgICAgICAgcmdiQ2hhbm5lbFtyZ2JPZmZzZXQrK10gPSByZ2JhQ2hhbm5lbFtyZ2JhT2Zmc2V0KytdO1xuICAgICAgICByZ2JDaGFubmVsW3JnYk9mZnNldCsrXSA9IHJnYmFDaGFubmVsW3JnYmFPZmZzZXQrK107XG4gICAgICAgIHJnYkNoYW5uZWxbcmdiT2Zmc2V0KytdID0gcmdiYUNoYW5uZWxbcmdiYU9mZnNldCsrXTtcbiAgICAgICAgYWxwaGFDaGFubmVsW2FscGhhT2Zmc2V0KytdID0gcmdiYUNoYW5uZWxbcmdiYU9mZnNldCsrXTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmdiQ2hhbm5lbDogcmdiQ2hhbm5lbCwgYWxwaGFDaGFubmVsOiBhbHBoYUNoYW5uZWwgfTtcbn07XG5leHBvcnQgdmFyIFBuZ1R5cGU7XG4oZnVuY3Rpb24gKFBuZ1R5cGUpIHtcbiAgICBQbmdUeXBlW1wiR3JleXNjYWxlXCJdID0gXCJHcmV5c2NhbGVcIjtcbiAgICBQbmdUeXBlW1wiVHJ1ZWNvbG91clwiXSA9IFwiVHJ1ZWNvbG91clwiO1xuICAgIFBuZ1R5cGVbXCJJbmRleGVkQ29sb3VyXCJdID0gXCJJbmRleGVkQ29sb3VyXCI7XG4gICAgUG5nVHlwZVtcIkdyZXlzY2FsZVdpdGhBbHBoYVwiXSA9IFwiR3JleXNjYWxlV2l0aEFscGhhXCI7XG4gICAgUG5nVHlwZVtcIlRydWVjb2xvdXJXaXRoQWxwaGFcIl0gPSBcIlRydWVjb2xvdXJXaXRoQWxwaGFcIjtcbn0pKFBuZ1R5cGUgfHwgKFBuZ1R5cGUgPSB7fSkpO1xudmFyIFBORyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQTkcocG5nRGF0YSkge1xuICAgICAgICB2YXIgdXBuZyA9IFVQTkcuZGVjb2RlKHBuZ0RhdGEpO1xuICAgICAgICB2YXIgZnJhbWVzID0gVVBORy50b1JHQkE4KHVwbmcpO1xuICAgICAgICBpZiAoZnJhbWVzLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbmltYXRlZCBQTkdzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICB2YXIgZnJhbWUgPSBuZXcgVWludDhBcnJheShmcmFtZXNbMF0pO1xuICAgICAgICB2YXIgX2EgPSBzcGxpdEFscGhhQ2hhbm5lbChmcmFtZSksIHJnYkNoYW5uZWwgPSBfYS5yZ2JDaGFubmVsLCBhbHBoYUNoYW5uZWwgPSBfYS5hbHBoYUNoYW5uZWw7XG4gICAgICAgIHRoaXMucmdiQ2hhbm5lbCA9IHJnYkNoYW5uZWw7XG4gICAgICAgIHZhciBoYXNBbHBoYVZhbHVlcyA9IGFscGhhQ2hhbm5lbC5zb21lKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhIDwgMjU1OyB9KTtcbiAgICAgICAgaWYgKGhhc0FscGhhVmFsdWVzKVxuICAgICAgICAgICAgdGhpcy5hbHBoYUNoYW5uZWwgPSBhbHBoYUNoYW5uZWw7XG4gICAgICAgIHRoaXMudHlwZSA9IGdldEltYWdlVHlwZSh1cG5nLmN0eXBlKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IHVwbmcud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdXBuZy5oZWlnaHQ7XG4gICAgICAgIHRoaXMuYml0c1BlckNvbXBvbmVudCA9IDg7XG4gICAgfVxuICAgIFBORy5sb2FkID0gZnVuY3Rpb24gKHBuZ0RhdGEpIHsgcmV0dXJuIG5ldyBQTkcocG5nRGF0YSk7IH07XG4gICAgcmV0dXJuIFBORztcbn0oKSk7XG5leHBvcnQgeyBQTkcgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBuZy5qcy5tYXAiLCIvKipcbiAqIEdlbmVyYXRlcyBhIHBzZXVkbyByYW5kb20gbnVtYmVyLiBBbHRob3VnaCBpdCBpcyBub3QgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlXG4gKiBhbmQgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkLCBpdCBpcyBub3QgYSBjb25jZXJuIGZvciB0aGUgaW50ZW5kZWQgdXNlLWNhc2UsXG4gKiB3aGljaCBpcyB0byBnZW5lcmF0ZSBkaXN0aW5jdCBudW1iZXJzLlxuICpcbiAqIENyZWRpdDogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5MzAzNzI1LzEwMjU0MDQ5XG4gKi9cbnZhciBTaW1wbGVSTkcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2ltcGxlUk5HKHNlZWQpIHtcbiAgICAgICAgdGhpcy5zZWVkID0gc2VlZDtcbiAgICB9XG4gICAgU2ltcGxlUk5HLnByb3RvdHlwZS5uZXh0SW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgeCA9IE1hdGguc2luKHRoaXMuc2VlZCsrKSAqIDEwMDAwO1xuICAgICAgICByZXR1cm4geCAtIE1hdGguZmxvb3IoeCk7XG4gICAgfTtcbiAgICBTaW1wbGVSTkcud2l0aFNlZWQgPSBmdW5jdGlvbiAoc2VlZCkgeyByZXR1cm4gbmV3IFNpbXBsZVJORyhzZWVkKTsgfTtcbiAgICByZXR1cm4gU2ltcGxlUk5HO1xufSgpKTtcbmV4cG9ydCB7IFNpbXBsZVJORyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cm5nLmpzLm1hcCIsImV4cG9ydCB2YXIgdG9DaGFyQ29kZSA9IGZ1bmN0aW9uIChjaGFyYWN0ZXIpIHsgcmV0dXJuIGNoYXJhY3Rlci5jaGFyQ29kZUF0KDApOyB9O1xuZXhwb3J0IHZhciB0b0NvZGVQb2ludCA9IGZ1bmN0aW9uIChjaGFyYWN0ZXIpIHsgcmV0dXJuIGNoYXJhY3Rlci5jb2RlUG9pbnRBdCgwKTsgfTtcbmV4cG9ydCB2YXIgdG9IZXhTdHJpbmdPZk1pbkxlbmd0aCA9IGZ1bmN0aW9uIChudW0sIG1pbkxlbmd0aCkge1xuICAgIHJldHVybiBwYWRTdGFydChudW0udG9TdHJpbmcoMTYpLCBtaW5MZW5ndGgsICcwJykudG9VcHBlckNhc2UoKTtcbn07XG5leHBvcnQgdmFyIHRvSGV4U3RyaW5nID0gZnVuY3Rpb24gKG51bSkgeyByZXR1cm4gdG9IZXhTdHJpbmdPZk1pbkxlbmd0aChudW0sIDIpOyB9O1xuZXhwb3J0IHZhciBjaGFyRnJvbUNvZGUgPSBmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsgfTtcbmV4cG9ydCB2YXIgY2hhckZyb21IZXhDb2RlID0gZnVuY3Rpb24gKGhleCkgeyByZXR1cm4gY2hhckZyb21Db2RlKHBhcnNlSW50KGhleCwgMTYpKTsgfTtcbmV4cG9ydCB2YXIgcGFkU3RhcnQgPSBmdW5jdGlvbiAodmFsdWUsIGxlbmd0aCwgcGFkQ2hhcikge1xuICAgIHZhciBwYWRkaW5nID0gJyc7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGVuZ3RoIC0gdmFsdWUubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHBhZGRpbmcgKz0gcGFkQ2hhcjtcbiAgICB9XG4gICAgcmV0dXJuIHBhZGRpbmcgKyB2YWx1ZTtcbn07XG5leHBvcnQgdmFyIGNvcHlTdHJpbmdJbnRvQnVmZmVyID0gZnVuY3Rpb24gKHN0ciwgYnVmZmVyLCBvZmZzZXQpIHtcbiAgICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBzdHIuY2hhckNvZGVBdChpZHgpO1xuICAgIH1cbiAgICByZXR1cm4gbGVuZ3RoO1xufTtcbmV4cG9ydCB2YXIgYWRkUmFuZG9tU3VmZml4ID0gZnVuY3Rpb24gKHByZWZpeCwgc3VmZml4TGVuZ3RoKSB7XG4gICAgaWYgKHN1ZmZpeExlbmd0aCA9PT0gdm9pZCAwKSB7IHN1ZmZpeExlbmd0aCA9IDQ7IH1cbiAgICByZXR1cm4gcHJlZml4ICsgXCItXCIgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBNYXRoLnBvdygxMCwgc3VmZml4TGVuZ3RoKSk7XG59O1xuZXhwb3J0IHZhciBlc2NhcGVSZWdFeHAgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xufTtcbmV4cG9ydCB2YXIgY2xlYW5UZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHR8XFx1MDA4NXxcXHUyMDI4fFxcdTIwMjkvZywgJyAgICAnKS5yZXBsYWNlKC9bXFxiXFx2XS9nLCAnJyk7XG59O1xuZXhwb3J0IHZhciBlc2NhcGVkTmV3bGluZUNoYXJzID0gWydcXFxcbicsICdcXFxcZicsICdcXFxccicsICdcXFxcdTAwMEInXTtcbmV4cG9ydCB2YXIgbmV3bGluZUNoYXJzID0gWydcXG4nLCAnXFxmJywgJ1xccicsICdcXHUwMDBCJ107XG5leHBvcnQgdmFyIGlzTmV3bGluZUNoYXIgPSBmdW5jdGlvbiAodGV4dCkgeyByZXR1cm4gL15bXFxuXFxmXFxyXFx1MDAwQl0kLy50ZXN0KHRleHQpOyB9O1xuZXhwb3J0IHZhciBsaW5lU3BsaXQgPSBmdW5jdGlvbiAodGV4dCkgeyByZXR1cm4gdGV4dC5zcGxpdCgvW1xcblxcZlxcclxcdTAwMEJdLyk7IH07XG5leHBvcnQgdmFyIG1lcmdlTGluZXMgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1tcXG5cXGZcXHJcXHUwMDBCXS9nLCAnICcpO1xufTtcbi8vIEphdmFTY3JpcHQncyBTdHJpbmcuY2hhckF0KCkgbWV0aG9kIGRvZXNuIHdvcmsgb24gc3RyaW5ncyBjb250YWluaW5nIFVURi0xNlxuLy8gY2hhcmFjdGVycyAod2l0aCBoaWdoIGFuZCBsb3cgc3Vycm9nYXRlIHBhaXJzKSwgc3VjaCBhcyDwn5KpIChwb28gZW1vamkpLiBUaGlzXG4vLyBgY2hhckF0SW5kZXgoKWAgZnVuY3Rpb24gZG9lcy5cbi8vXG4vLyBDcmVkaXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXQvYmxvYi9tYXN0ZXIvYXQuanMjTDE0LUw0OFxuZXhwb3J0IHZhciBjaGFyQXRJbmRleCA9IGZ1bmN0aW9uICh0ZXh0LCBpbmRleCkge1xuICAgIC8vIEdldCB0aGUgZmlyc3QgY29kZSB1bml0IGFuZCBjb2RlIHVuaXQgdmFsdWVcbiAgICB2YXIgY3VGaXJzdCA9IHRleHQuY2hhckNvZGVBdChpbmRleCk7XG4gICAgdmFyIGN1U2Vjb25kO1xuICAgIHZhciBuZXh0SW5kZXggPSBpbmRleCArIDE7XG4gICAgdmFyIGxlbmd0aCA9IDE7XG4gICAgaWYgKFxuICAgIC8vIENoZWNrIGlmIGl0J3MgdGhlIHN0YXJ0IG9mIGEgc3Vycm9nYXRlIHBhaXIuXG4gICAgY3VGaXJzdCA+PSAweGQ4MDAgJiZcbiAgICAgICAgY3VGaXJzdCA8PSAweGRiZmYgJiYgLy8gaGlnaCBzdXJyb2dhdGVcbiAgICAgICAgdGV4dC5sZW5ndGggPiBuZXh0SW5kZXggLy8gdGhlcmUgaXMgYSBuZXh0IGNvZGUgdW5pdFxuICAgICkge1xuICAgICAgICBjdVNlY29uZCA9IHRleHQuY2hhckNvZGVBdChuZXh0SW5kZXgpO1xuICAgICAgICBpZiAoY3VTZWNvbmQgPj0gMHhkYzAwICYmIGN1U2Vjb25kIDw9IDB4ZGZmZilcbiAgICAgICAgICAgIGxlbmd0aCA9IDI7IC8vIGxvdyBzdXJyb2dhdGVcbiAgICB9XG4gICAgcmV0dXJuIFt0ZXh0LnNsaWNlKGluZGV4LCBpbmRleCArIGxlbmd0aCksIGxlbmd0aF07XG59O1xuZXhwb3J0IHZhciBjaGFyU3BsaXQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgIHZhciBjaGFycyA9IFtdO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRleHQubGVuZ3RoOyBpZHggPCBsZW47KSB7XG4gICAgICAgIHZhciBfYSA9IGNoYXJBdEluZGV4KHRleHQsIGlkeCksIGMgPSBfYVswXSwgY0xlbiA9IF9hWzFdO1xuICAgICAgICBjaGFycy5wdXNoKGMpO1xuICAgICAgICBpZHggKz0gY0xlbjtcbiAgICB9XG4gICAgcmV0dXJuIGNoYXJzO1xufTtcbnZhciBidWlsZFdvcmRCcmVha1JlZ2V4ID0gZnVuY3Rpb24gKHdvcmRCcmVha3MpIHtcbiAgICB2YXIgbmV3bGluZUNoYXJVbmlvbiA9IGVzY2FwZWROZXdsaW5lQ2hhcnMuam9pbignfCcpO1xuICAgIHZhciBlc2NhcGVkUnVsZXMgPSBbJyQnXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3b3JkQnJlYWtzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgd29yZEJyZWFrID0gd29yZEJyZWFrc1tpZHhdO1xuICAgICAgICBpZiAoaXNOZXdsaW5lQ2hhcih3b3JkQnJlYWspKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYHdvcmRCcmVha2AgbXVzdCBub3QgaW5jbHVkZSBcIiArIG5ld2xpbmVDaGFyVW5pb24pO1xuICAgICAgICB9XG4gICAgICAgIGVzY2FwZWRSdWxlcy5wdXNoKHdvcmRCcmVhayA9PT0gJycgPyAnLicgOiBlc2NhcGVSZWdFeHAod29yZEJyZWFrKSk7XG4gICAgfVxuICAgIHZhciBicmVha1J1bGVzID0gZXNjYXBlZFJ1bGVzLmpvaW4oJ3wnKTtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcIihcIiArIG5ld2xpbmVDaGFyVW5pb24gKyBcIil8KCguKj8pKFwiICsgYnJlYWtSdWxlcyArIFwiKSlcIiwgJ2dtJyk7XG59O1xuZXhwb3J0IHZhciBicmVha1RleHRJbnRvTGluZXMgPSBmdW5jdGlvbiAodGV4dCwgd29yZEJyZWFrcywgbWF4V2lkdGgsIGNvbXB1dGVXaWR0aE9mVGV4dCkge1xuICAgIHZhciByZWdleCA9IGJ1aWxkV29yZEJyZWFrUmVnZXgod29yZEJyZWFrcyk7XG4gICAgdmFyIHdvcmRzID0gY2xlYW5UZXh0KHRleHQpLm1hdGNoKHJlZ2V4KTtcbiAgICB2YXIgY3VyckxpbmUgPSAnJztcbiAgICB2YXIgY3VycldpZHRoID0gMDtcbiAgICB2YXIgbGluZXMgPSBbXTtcbiAgICB2YXIgcHVzaEN1cnJMaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY3VyckxpbmUgIT09ICcnKVxuICAgICAgICAgICAgbGluZXMucHVzaChjdXJyTGluZSk7XG4gICAgICAgIGN1cnJMaW5lID0gJyc7XG4gICAgICAgIGN1cnJXaWR0aCA9IDA7XG4gICAgfTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3b3Jkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIHdvcmQgPSB3b3Jkc1tpZHhdO1xuICAgICAgICBpZiAoaXNOZXdsaW5lQ2hhcih3b3JkKSkge1xuICAgICAgICAgICAgcHVzaEN1cnJMaW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSBjb21wdXRlV2lkdGhPZlRleHQod29yZCk7XG4gICAgICAgICAgICBpZiAoY3VycldpZHRoICsgd2lkdGggPiBtYXhXaWR0aClcbiAgICAgICAgICAgICAgICBwdXNoQ3VyckxpbmUoKTtcbiAgICAgICAgICAgIGN1cnJMaW5lICs9IHdvcmQ7XG4gICAgICAgICAgICBjdXJyV2lkdGggKz0gd2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVzaEN1cnJMaW5lKCk7XG4gICAgcmV0dXJuIGxpbmVzO1xufTtcbi8vIFNlZSBzZWN0aW9uIFwiNy45LjQgRGF0ZXNcIiBvZiB0aGUgUERGIHNwZWNpZmljYXRpb25cbnZhciBkYXRlUmVnZXggPSAvXkQ6KFxcZFxcZFxcZFxcZCkoXFxkXFxkKT8oXFxkXFxkKT8oXFxkXFxkKT8oXFxkXFxkKT8oXFxkXFxkKT8oWytcXC1aXSk/KFxcZFxcZCk/Jz8oXFxkXFxkKT8nPyQvO1xuZXhwb3J0IHZhciBwYXJzZURhdGUgPSBmdW5jdGlvbiAoZGF0ZVN0cikge1xuICAgIHZhciBtYXRjaCA9IGRhdGVTdHIubWF0Y2goZGF0ZVJlZ2V4KTtcbiAgICBpZiAoIW1hdGNoKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZhciB5ZWFyID0gbWF0Y2hbMV0sIF9hID0gbWF0Y2hbMl0sIG1vbnRoID0gX2EgPT09IHZvaWQgMCA/ICcwMScgOiBfYSwgX2IgPSBtYXRjaFszXSwgZGF5ID0gX2IgPT09IHZvaWQgMCA/ICcwMScgOiBfYiwgX2MgPSBtYXRjaFs0XSwgaG91cnMgPSBfYyA9PT0gdm9pZCAwID8gJzAwJyA6IF9jLCBfZCA9IG1hdGNoWzVdLCBtaW5zID0gX2QgPT09IHZvaWQgMCA/ICcwMCcgOiBfZCwgX2UgPSBtYXRjaFs2XSwgc2VjcyA9IF9lID09PSB2b2lkIDAgPyAnMDAnIDogX2UsIF9mID0gbWF0Y2hbN10sIG9mZnNldFNpZ24gPSBfZiA9PT0gdm9pZCAwID8gJ1onIDogX2YsIF9nID0gbWF0Y2hbOF0sIG9mZnNldEhvdXJzID0gX2cgPT09IHZvaWQgMCA/ICcwMCcgOiBfZywgX2ggPSBtYXRjaFs5XSwgb2Zmc2V0TWlucyA9IF9oID09PSB2b2lkIDAgPyAnMDAnIDogX2g7XG4gICAgLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzUuMS8jc2VjLTE1LjkuMS4xNVxuICAgIHZhciB0ek9mZnNldCA9IG9mZnNldFNpZ24gPT09ICdaJyA/ICdaJyA6IFwiXCIgKyBvZmZzZXRTaWduICsgb2Zmc2V0SG91cnMgKyBcIjpcIiArIG9mZnNldE1pbnM7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh5ZWFyICsgXCItXCIgKyBtb250aCArIFwiLVwiICsgZGF5ICsgXCJUXCIgKyBob3VycyArIFwiOlwiICsgbWlucyArIFwiOlwiICsgc2VjcyArIHR6T2Zmc2V0KTtcbiAgICByZXR1cm4gZGF0ZTtcbn07XG5leHBvcnQgdmFyIGZpbmRMYXN0TWF0Y2ggPSBmdW5jdGlvbiAodmFsdWUsIHJlZ2V4KSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBwb3NpdGlvbiA9IDA7XG4gICAgdmFyIGxhc3RNYXRjaDtcbiAgICB3aGlsZSAocG9zaXRpb24gPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gdmFsdWUuc3Vic3RyaW5nKHBvc2l0aW9uKS5tYXRjaChyZWdleCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICByZXR1cm4geyBtYXRjaDogbGFzdE1hdGNoLCBwb3M6IHBvc2l0aW9uIH07XG4gICAgICAgIGxhc3RNYXRjaCA9IG1hdGNoO1xuICAgICAgICBwb3NpdGlvbiArPSAoKF9hID0gbWF0Y2guaW5kZXgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDApICsgbWF0Y2hbMF0ubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4geyBtYXRjaDogbGFzdE1hdGNoLCBwb3M6IHBvc2l0aW9uIH07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5ncy5qcy5tYXAiLCJpbXBvcnQgeyB0b0hleFN0cmluZyB9IGZyb20gXCIuL3N0cmluZ3NcIjtcbi8qKlxuICogRW5jb2RlcyBhIHN0cmluZyB0byBVVEYtOC5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgVGhlIHN0cmluZyB0byBiZSBlbmNvZGVkLlxuICogQHBhcmFtIGJ5dGVPcmRlck1hcmsgV2hldGhlciBvciBub3QgYSBieXRlIG9yZGVyIG1hcmtlciAoQk9NKSBzaG91bGQgYmUgYWRkZWRcbiAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBzdGFydCBvZiB0aGUgZW5jb2RpbmcuIChkZWZhdWx0IGB0cnVlYClcbiAqIEByZXR1cm5zIEEgVWludDhBcnJheSBjb250YWluaW5nIHRoZSBVVEYtOCBlbmNvZGluZyBvZiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSmF2YVNjcmlwdCBzdHJpbmdzIGFyZSBjb21wb3NlZCBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLiBDb2RlIHBvaW50cyBhcmVcbiAqIGludGVnZXJzIGluIHRoZSByYW5nZSAwIHRvIDEsMTE0LDExMSAoMHgxMEZGRkYpLiBXaGVuIHNlcmlhbGl6aW5nIGEgc3RyaW5nLFxuICogaXQgbXVzdCBiZSBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2Ygd29yZHMuIEEgd29yZCBpcyB0eXBpY2FsbHkgOCwgMTYsIG9yIDMyXG4gKiBieXRlcyBpbiBzaXplLiBBcyBzdWNoLCBVbmljb2RlIGRlZmluZXMgdGhyZWUgZW5jb2RpbmcgZm9ybXM6IFVURi04LCBVVEYtMTYsXG4gKiBhbmQgVVRGLTMyLiBUaGVzZSBlbmNvZGluZyBmb3JtcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBVbmljb2RlIHN0YW5kYXJkIFsxXS5cbiAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgVVRGLTggZW5jb2RpbmcgZm9ybS5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIEluIFVURi04LCBlYWNoIGNvZGUgcG9pbnQgaXMgbWFwcGVkIHRvIGEgc2VxdWVuY2Ugb2YgMSwgMiwgMywgb3IgNCBieXRlcy5cbiAqIE5vdGUgdGhhdCB0aGUgbG9naWMgd2hpY2ggZGVmaW5lcyB0aGlzIG1hcHBpbmcgaXMgc2xpZ2h0bHkgY29udm9sdXRlZCwgYW5kXG4gKiBub3QgYXMgc3RyYWlnaHRmb3J3YXJkIGFzIHRoZSBtYXBwaW5nIGxvZ2ljIGZvciBVVEYtMTYgb3IgVVRGLTMyLiBUaGUgVVRGLThcbiAqIG1hcHBpbmcgbG9naWMgaXMgYXMgZm9sbG93cyBbMl06XG4gKlxuICog4oCiIElmIGEgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVSswMDAwLi5VKzAwN0YsIHRoZW4gdmlldyBpdCBhcyBhIDctYml0XG4gKiAgIGludGVnZXI6IDBieHh4eHh4eC4gTWFwIHRoZSBjb2RlIHBvaW50IHRvIDEgYnl0ZSB3aXRoIHRoZSBmaXJzdCBoaWdoIG9yZGVyXG4gKiAgIGJpdCBzZXQgdG8gMDpcbiAqXG4gKiAgICAgICBiMT0wYjB4eHh4eHh4XG4gKlxuICog4oCiIElmIGEgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVSswMDgwLi5VKzA3RkYsIHRoZW4gdmlldyBpdCBhcyBhbiAxMS1iaXRcbiAqICAgaW50ZWdlcjogMGJ5eXl5eXh4eHh4eC4gTWFwIHRoZSBjb2RlIHBvaW50IHRvIDIgYnl0ZXMgd2l0aCB0aGUgZmlyc3QgNSBiaXRzXG4gKiAgIG9mIHRoZSBjb2RlIHBvaW50IHN0b3JlZCBpbiB0aGUgZmlyc3QgYnl0ZSwgYW5kIHRoZSBsYXN0IDYgYml0cyBzdG9yZWQgaW5cbiAqICAgdGhlIHNlY29uZCBieXRlOlxuICpcbiAqICAgICAgIGIxPTBiMTEweXl5eXkgICAgYjI9MGIxMHh4eHh4eFxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMDgwMC4uVStGRkZGLCB0aGVuIHZpZXcgaXQgYXMgYSAxNi1iaXRcbiAqICAgaW50ZWdlciwgMGJ6enp6eXl5eXl5eHh4eHh4LiBNYXAgdGhlIGNvZGUgcG9pbnQgdG8gMyBieXRlcyB3aXRoIHRoZSBmaXJzdFxuICogICA0IGJpdHMgc3RvcmVkIGluIHRoZSBmaXJzdCBieXRlLCB0aGUgbmV4dCA2IGJpdHMgc3RvcmVkIGluIHRoZSBzZWNvbmQgYnl0ZSxcbiAqICAgYW5kIHRoZSBsYXN0IDYgYml0cyBpbiB0aGUgdGhpcmQgYnl0ZTpcbiAqXG4gKiAgICAgICBiMT0wYjExMTB6enp6ICAgIGIyPTBiMTB5eXl5eXkgICAgYjM9MGIxMHh4eHh4eFxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMTAwMDAuLi5VKzEwRkZGRiwgdGhlbiB2aWV3IGl0IGFzIGFcbiAqICAgMjEtYml0IGludGVnZXIsIDBidnZ2enp6enp6eXl5eXl5eHh4eHh4LiBNYXAgdGhlIGNvZGUgcG9pbnQgdG8gNCBieXRlcyB3aXRoXG4gKiAgIHRoZSBmaXJzdCAzIGJpdHMgc3RvcmVkIGluIHRoZSBmaXJzdCBieXRlLCB0aGUgbmV4dCA2IGJpdHMgc3RvcmVkIGluIHRoZVxuICogICBzZWNvbmQgYnl0ZSwgdGhlIG5leHQgNiBiaXRzIHN0b3JlZCBpbiB0aGUgdGhpcmQgYnl0ZSwgYW5kIHRoZSBsYXN0IDYgYml0c1xuICogICBzdG9yZWQgaW4gdGhlIGZvdXJ0aCBieXRlOlxuICpcbiAqICAgICAgIGIxPTBiMTExMTB4eHggICAgYjI9MGIxMHp6enp6eiAgICBiMz0wYjEweXl5eXl5ICAgIGI0PTBiMTB4eHh4eHhcbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIEl0IGlzIGltcG9ydGFudCB0byBub3RlLCB3aGVuIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBjb2RlIHBvaW50cyBvZiBhIHN0cmluZ1xuICogaW4gSmF2YVNjcmlwdCwgdGhhdCBpZiBhIGNoYXJhY3RlciBpcyBlbmNvZGVkIGFzIGEgc3Vycm9nYXRlIHBhaXIgaXQgd2lsbFxuICogaW5jcmVhc2UgdGhlIHN0cmluZydzIGxlbmd0aCBieSAyIGluc3RlYWQgb2YgMSBbNF0uIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYFxuICogPiAnYScubGVuZ3RoXG4gKiAxXG4gKiA+ICfwn5KpJy5sZW5ndGhcbiAqIDJcbiAqID4gJ+iqnicubGVuZ3RoXG4gKiAxXG4gKiA+ICdh8J+SqeiqnicubGVuZ3RoXG4gKiA0XG4gKiBgYGBcbiAqXG4gKiBUaGUgcmVzdWx0cyBvZiB0aGUgYWJvdmUgZXhhbXBsZSBhcmUgZXhwbGFpbmVkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlXG4gKiBjaGFyYWN0ZXJzICdhJyBhbmQgJ+iqnicgYXJlIG5vdCByZXByZXNlbnRlZCBieSBzdXJyb2dhdGUgcGFpcnMsIGJ1dCAn8J+SqScgaXMuXG4gKlxuICogQmVjYXVzZSBvZiB0aGlzIGlkaW9zeW5jcmFzeSBpbiBKYXZhU2NyaXB0J3Mgc3RyaW5nIGltcGxlbWVudGF0aW9uIGFuZCBBUElzLFxuICogd2UgbXVzdCBcImp1bXBcIiBhbiBleHRyYSBpbmRleCBhZnRlciBlbmNvZGluZyBhIGNoYXJhY3RlciBhcyBhIHN1cnJvZ2F0ZVxuICogcGFpci4gSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgd2UgbXVzdCBpbmNyZW1lbnQgdGhlIGluZGV4IG9mIG91ciBmb3IgbG9vcCBieVxuICogMiBpZiB3ZSBlbmNvZGUgYSBzdXJyb2dhdGUgcGFpciwgYW5kIDEgaW4gYWxsIG90aGVyIGNhc2VzLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogUmVmZXJlbmNlczpcbiAqICAgLSBbMV0gaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTEyLjAuMC9Vbmljb2RlU3RhbmRhcmQtMTIuMC5wZGZcbiAqICAgICAgICAgMy45ICBVbmljb2RlIEVuY29kaW5nIEZvcm1zIC0gVVRGLThcbiAqICAgLSBbMl0gaHR0cDovL3d3dy5oZXJvbmd5YW5nLmNvbS9Vbmljb2RlL1VURi04LVVURi04LUVuY29kaW5nLmh0bWxcbiAqICAgLSBbM10gaHR0cDovL3d3dy5oZXJvbmd5YW5nLmNvbS9Vbmljb2RlL1VURi04LVVURi04LUVuY29kaW5nLUFsZ29yaXRobS5odG1sXG4gKiAgIC0gWzRdIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9sZW5ndGgjRGVzY3JpcHRpb25cbiAqXG4gKi9cbmV4cG9ydCB2YXIgdXRmOEVuY29kZSA9IGZ1bmN0aW9uIChpbnB1dCwgYnl0ZU9yZGVyTWFyaykge1xuICAgIGlmIChieXRlT3JkZXJNYXJrID09PSB2b2lkIDApIHsgYnl0ZU9yZGVyTWFyayA9IHRydWU7IH1cbiAgICB2YXIgZW5jb2RlZCA9IFtdO1xuICAgIGlmIChieXRlT3JkZXJNYXJrKVxuICAgICAgICBlbmNvZGVkLnB1c2goMHhlZiwgMHhiYiwgMHhiZik7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gaW5wdXQubGVuZ3RoOyBpZHggPCBsZW47KSB7XG4gICAgICAgIHZhciBjb2RlUG9pbnQgPSBpbnB1dC5jb2RlUG9pbnRBdChpZHgpO1xuICAgICAgICAvLyBPbmUgYnl0ZSBlbmNvZGluZ1xuICAgICAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgICAgICAgdmFyIGJ5dGUxID0gY29kZVBvaW50ICYgMHg3ZjtcbiAgICAgICAgICAgIGVuY29kZWQucHVzaChieXRlMSk7XG4gICAgICAgICAgICBpZHggKz0gMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUd28gYnl0ZSBlbmNvZGluZ1xuICAgICAgICBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDA4MDApIHtcbiAgICAgICAgICAgIHZhciBieXRlMSA9ICgoY29kZVBvaW50ID4+IDYpICYgMHgxZikgfCAweGMwO1xuICAgICAgICAgICAgdmFyIGJ5dGUyID0gKGNvZGVQb2ludCAmIDB4M2YpIHwgMHg4MDtcbiAgICAgICAgICAgIGVuY29kZWQucHVzaChieXRlMSwgYnl0ZTIpO1xuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhyZWUgYnl0ZSBlbmNvZGluZ1xuICAgICAgICBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDAxMDAwMCkge1xuICAgICAgICAgICAgdmFyIGJ5dGUxID0gKChjb2RlUG9pbnQgPj4gMTIpICYgMHgwZikgfCAweGUwO1xuICAgICAgICAgICAgdmFyIGJ5dGUyID0gKChjb2RlUG9pbnQgPj4gNikgJiAweDNmKSB8IDB4ODA7XG4gICAgICAgICAgICB2YXIgYnl0ZTMgPSAoY29kZVBvaW50ICYgMHgzZikgfCAweDgwO1xuICAgICAgICAgICAgZW5jb2RlZC5wdXNoKGJ5dGUxLCBieXRlMiwgYnl0ZTMpO1xuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm91ciBieXRlIGVuY29kaW5nIChzdXJyb2dhdGUgcGFpcilcbiAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgIHZhciBieXRlMSA9ICgoY29kZVBvaW50ID4+IDE4KSAmIDB4MDcpIHwgMHhmMDtcbiAgICAgICAgICAgIHZhciBieXRlMiA9ICgoY29kZVBvaW50ID4+IDEyKSAmIDB4M2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHZhciBieXRlMyA9ICgoY29kZVBvaW50ID4+IDYpICYgMHgzZikgfCAweDgwO1xuICAgICAgICAgICAgdmFyIGJ5dGU0ID0gKChjb2RlUG9pbnQgPj4gMCkgJiAweDNmKSB8IDB4ODA7XG4gICAgICAgICAgICBlbmNvZGVkLnB1c2goYnl0ZTEsIGJ5dGUyLCBieXRlMywgYnl0ZTQpO1xuICAgICAgICAgICAgaWR4ICs9IDI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgY2FzZVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvZGUgcG9pbnQ6IDB4XCIgKyB0b0hleFN0cmluZyhjb2RlUG9pbnQpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGVuY29kZWQpO1xufTtcbi8qKlxuICogRW5jb2RlcyBhIHN0cmluZyB0byBVVEYtMTYuXG4gKlxuICogQHBhcmFtIGlucHV0IFRoZSBzdHJpbmcgdG8gYmUgZW5jb2RlZC5cbiAqIEBwYXJhbSBieXRlT3JkZXJNYXJrIFdoZXRoZXIgb3Igbm90IGEgYnl0ZSBvcmRlciBtYXJrZXIgKEJPTSkgc2hvdWxkIGJlIGFkZGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgc3RhcnQgb2YgdGhlIGVuY29kaW5nLiAoZGVmYXVsdCBgdHJ1ZWApXG4gKiBAcmV0dXJucyBBIFVpbnQxNkFycmF5IGNvbnRhaW5pbmcgdGhlIFVURi0xNiBlbmNvZGluZyBvZiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSmF2YVNjcmlwdCBzdHJpbmdzIGFyZSBjb21wb3NlZCBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLiBDb2RlIHBvaW50cyBhcmVcbiAqIGludGVnZXJzIGluIHRoZSByYW5nZSAwIHRvIDEsMTE0LDExMSAoMHgxMEZGRkYpLiBXaGVuIHNlcmlhbGl6aW5nIGEgc3RyaW5nLFxuICogaXQgbXVzdCBiZSBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2Ygd29yZHMuIEEgd29yZCBpcyB0eXBpY2FsbHkgOCwgMTYsIG9yIDMyXG4gKiBieXRlcyBpbiBzaXplLiBBcyBzdWNoLCBVbmljb2RlIGRlZmluZXMgdGhyZWUgZW5jb2RpbmcgZm9ybXM6IFVURi04LCBVVEYtMTYsXG4gKiBhbmQgVVRGLTMyLiBUaGVzZSBlbmNvZGluZyBmb3JtcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBVbmljb2RlIHN0YW5kYXJkIFsxXS5cbiAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgVVRGLTE2IGVuY29kaW5nIGZvcm0uXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBJbiBVVEYtMTYsIGVhY2ggY29kZSBwb2ludCBpcyBtYXBwZWQgdG8gb25lIG9yIHR3byAxNi1iaXQgaW50ZWdlcnMuIFRoZVxuICogVVRGLTE2IG1hcHBpbmcgbG9naWMgaXMgYXMgZm9sbG93cyBbMl06XG4gKlxuICog4oCiIElmIGEgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVSswMDAwLi5VK0ZGRkYsIHRoZW4gbWFwIHRoZSBjb2RlIHBvaW50IHRvXG4gKiAgIGEgMTYtYml0IGludGVnZXIgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0LlxuICpcbiAqIOKAoiBJZiBhIGNvZGUgcG9pbnQgaXMgaW4gdGhlIHJhbmdlIFUrMTAwMDAuLlUrMTAwMDAsIHRoZW4gbWFwIHRoZSBjb2RlIHBvaW50XG4gKiAgIHRvIHR3byAxNi1iaXQgaW50ZWdlcnMuIFRoZSBmaXJzdCBpbnRlZ2VyIHNob3VsZCBjb250YWluIHRoZSBoaWdoIHN1cnJvZ2F0ZVxuICogICBhbmQgdGhlIHNlY29uZCBpbnRlZ2VyIHNob3VsZCBjb250YWluIHRoZSBsb3cgc3Vycm9nYXRlLiBCb3RoIHN1cnJvZ2F0ZXNcbiAqICAgc2hvdWxkIGJlIHdyaXR0ZW4gd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0LlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUsIHdoZW4gaXRlcmF0aW5nIHRocm91Z2ggdGhlIGNvZGUgcG9pbnRzIG9mIGEgc3RyaW5nXG4gKiBpbiBKYXZhU2NyaXB0LCB0aGF0IGlmIGEgY2hhcmFjdGVyIGlzIGVuY29kZWQgYXMgYSBzdXJyb2dhdGUgcGFpciBpdCB3aWxsXG4gKiBpbmNyZWFzZSB0aGUgc3RyaW5nJ3MgbGVuZ3RoIGJ5IDIgaW5zdGVhZCBvZiAxIFs0XS4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiA+ICdhJy5sZW5ndGhcbiAqIDFcbiAqID4gJ/CfkqknLmxlbmd0aFxuICogMlxuICogPiAn6KqeJy5sZW5ndGhcbiAqIDFcbiAqID4gJ2Hwn5Kp6KqeJy5sZW5ndGhcbiAqIDRcbiAqIGBgYFxuICpcbiAqIFRoZSByZXN1bHRzIG9mIHRoZSBhYm92ZSBleGFtcGxlIGFyZSBleHBsYWluZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGVcbiAqIGNoYXJhY3RlcnMgJ2EnIGFuZCAn6KqeJyBhcmUgbm90IHJlcHJlc2VudGVkIGJ5IHN1cnJvZ2F0ZSBwYWlycywgYnV0ICfwn5KpJyBpcy5cbiAqXG4gKiBCZWNhdXNlIG9mIHRoaXMgaWRpb3N5bmNyYXN5IGluIEphdmFTY3JpcHQncyBzdHJpbmcgaW1wbGVtZW50YXRpb24gYW5kIEFQSXMsXG4gKiB3ZSBtdXN0IFwianVtcFwiIGFuIGV4dHJhIGluZGV4IGFmdGVyIGVuY29kaW5nIGEgY2hhcmFjdGVyIGFzIGEgc3Vycm9nYXRlXG4gKiBwYWlyLiBJbiBwcmFjdGljZSwgdGhpcyBtZWFucyB3ZSBtdXN0IGluY3JlbWVudCB0aGUgaW5kZXggb2Ygb3VyIGZvciBsb29wIGJ5XG4gKiAyIGlmIHdlIGVuY29kZSBhIHN1cnJvZ2F0ZSBwYWlyLCBhbmQgMSBpbiBhbGwgb3RoZXIgY2FzZXMuXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogICAtIFsxXSBodHRwczovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlMTIuMC4wL1VuaWNvZGVTdGFuZGFyZC0xMi4wLnBkZlxuICogICAgICAgICAzLjkgIFVuaWNvZGUgRW5jb2RpbmcgRm9ybXMgLSBVVEYtOFxuICogICAtIFsyXSBodHRwOi8vd3d3Lmhlcm9uZ3lhbmcuY29tL1VuaWNvZGUvVVRGLTE2LVVURi0xNi1FbmNvZGluZy5odG1sXG4gKiAgIC0gWzNdIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9sZW5ndGgjRGVzY3JpcHRpb25cbiAqXG4gKi9cbmV4cG9ydCB2YXIgdXRmMTZFbmNvZGUgPSBmdW5jdGlvbiAoaW5wdXQsIGJ5dGVPcmRlck1hcmspIHtcbiAgICBpZiAoYnl0ZU9yZGVyTWFyayA9PT0gdm9pZCAwKSB7IGJ5dGVPcmRlck1hcmsgPSB0cnVlOyB9XG4gICAgdmFyIGVuY29kZWQgPSBbXTtcbiAgICBpZiAoYnl0ZU9yZGVyTWFyaylcbiAgICAgICAgZW5jb2RlZC5wdXNoKDB4ZmVmZik7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gaW5wdXQubGVuZ3RoOyBpZHggPCBsZW47KSB7XG4gICAgICAgIHZhciBjb2RlUG9pbnQgPSBpbnB1dC5jb2RlUG9pbnRBdChpZHgpO1xuICAgICAgICAvLyBUd28gYnl0ZSBlbmNvZGluZ1xuICAgICAgICBpZiAoY29kZVBvaW50IDwgMHgwMTAwMDApIHtcbiAgICAgICAgICAgIGVuY29kZWQucHVzaChjb2RlUG9pbnQpO1xuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm91ciBieXRlIGVuY29kaW5nIChzdXJyb2dhdGUgcGFpcilcbiAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgIGVuY29kZWQucHVzaChoaWdoU3Vycm9nYXRlKGNvZGVQb2ludCksIGxvd1N1cnJvZ2F0ZShjb2RlUG9pbnQpKTtcbiAgICAgICAgICAgIGlkeCArPSAyO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciByZWFjaCB0aGlzIGNhc2VcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjb2RlIHBvaW50OiAweFwiICsgdG9IZXhTdHJpbmcoY29kZVBvaW50KSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDE2QXJyYXkoZW5jb2RlZCk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYGNvZGVQb2ludGAgaXMgd2l0aGluIHRoZVxuICogQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChCTVApLiBDb2RlIHBvaW50cyBpbnNpZGUgdGhlIEJNUCBhcmUgbm90IGVuY29kZWRcbiAqIHdpdGggc3Vycm9nYXRlIHBhaXJzLlxuICogQHBhcmFtIGNvZGVQb2ludCBUaGUgY29kZSBwb2ludCB0byBiZSBldmFsdWF0ZWQuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjRGVzY3JpcHRpb25cbiAqL1xuZXhwb3J0IHZhciBpc1dpdGhpbkJNUCA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gY29kZVBvaW50ID49IDAgJiYgY29kZVBvaW50IDw9IDB4ZmZmZjtcbn07XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBgY29kZVBvaW50YCBpcyB2YWxpZCBhbmQgbXVzdCBiZSByZXByZXNlbnRlZFxuICogd2l0aCBhIHN1cnJvZ2F0ZSBwYWlyIHdoZW4gZW5jb2RlZC5cbiAqIEBwYXJhbSBjb2RlUG9pbnQgVGhlIGNvZGUgcG9pbnQgdG8gYmUgZXZhbHVhdGVkLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0Rlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCB2YXIgaGFzU3Vycm9nYXRlcyA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gY29kZVBvaW50ID49IDB4MDEwMDAwICYmIGNvZGVQb2ludCA8PSAweDEwZmZmZjtcbn07XG4vLyBGcm9tIFVuaWNvZGUgMy4wIHNwZWMsIHNlY3Rpb24gMy43OlxuLy8gICBodHRwOi8vdW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTMuMC4wL2NoMDMucGRmXG5leHBvcnQgdmFyIGhpZ2hTdXJyb2dhdGUgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoKGNvZGVQb2ludCAtIDB4MTAwMDApIC8gMHg0MDApICsgMHhkODAwO1xufTtcbi8vIEZyb20gVW5pY29kZSAzLjAgc3BlYywgc2VjdGlvbiAzLjc6XG4vLyAgIGh0dHA6Ly91bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlMy4wLjAvY2gwMy5wZGZcbmV4cG9ydCB2YXIgbG93U3Vycm9nYXRlID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgIHJldHVybiAoKGNvZGVQb2ludCAtIDB4MTAwMDApICUgMHg0MDApICsgMHhkYzAwO1xufTtcbnZhciBCeXRlT3JkZXI7XG4oZnVuY3Rpb24gKEJ5dGVPcmRlcikge1xuICAgIEJ5dGVPcmRlcltcIkJpZ0VuZGlhblwiXSA9IFwiQmlnRW5kaWFuXCI7XG4gICAgQnl0ZU9yZGVyW1wiTGl0dGxlRW5kaWFuXCJdID0gXCJMaXR0bGVFbmRpYW5cIjtcbn0pKEJ5dGVPcmRlciB8fCAoQnl0ZU9yZGVyID0ge30pKTtcbnZhciBSRVBMQUNFTUVOVCA9ICfvv70nLmNvZGVQb2ludEF0KDApO1xuLyoqXG4gKiBEZWNvZGVzIGEgVWludDhBcnJheSBvZiBkYXRhIHRvIGEgc3RyaW5nIHVzaW5nIFVURi0xNi5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byByZWNvdmVyIGZyb20gZXJyb25vdXMgaW5wdXQgYnlcbiAqIGluc2VydGluZyB0aGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyICjvv70pIHRvIG1hcmsgaW52YWxpZCBjb2RlIHBvaW50c1xuICogYW5kIHN1cnJvZ2F0ZSBwYWlycy5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgQSBVaW50OEFycmF5IGNvbnRhaW5pbmcgVVRGLTE2IGVuY29kZWQgZGF0YVxuICogQHBhcmFtIGJ5dGVPcmRlck1hcmsgV2hldGhlciBvciBub3QgYSBieXRlIG9yZGVyIG1hcmtlciAoQk9NKSBzaG91bGQgYmUgcmVhZFxuICogICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIHN0YXJ0IG9mIHRoZSBlbmNvZGluZy4gKGRlZmF1bHQgYHRydWVgKVxuICogQHJldHVybnMgVGhlIGRlY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnQgdmFyIHV0ZjE2RGVjb2RlID0gZnVuY3Rpb24gKGlucHV0LCBieXRlT3JkZXJNYXJrKSB7XG4gICAgaWYgKGJ5dGVPcmRlck1hcmsgPT09IHZvaWQgMCkgeyBieXRlT3JkZXJNYXJrID0gdHJ1ZTsgfVxuICAgIC8vIE5lZWQgYXQgbGVhc3QgMiBieXRlcyBvZiBkYXRhIGluIFVURi0xNiBlbmNvZGluZ3NcbiAgICBpZiAoaW5wdXQubGVuZ3RoIDw9IDEpXG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChSRVBMQUNFTUVOVCk7XG4gICAgdmFyIGJ5dGVPcmRlciA9IGJ5dGVPcmRlck1hcmsgPyByZWFkQk9NKGlucHV0KSA6IEJ5dGVPcmRlci5CaWdFbmRpYW47XG4gICAgLy8gU2tpcCBieXRlIG9yZGVyIG1hcmsgaWYgbmVlZGVkXG4gICAgdmFyIGlkeCA9IGJ5dGVPcmRlck1hcmsgPyAyIDogMDtcbiAgICB2YXIgY29kZVBvaW50cyA9IFtdO1xuICAgIHdoaWxlIChpbnB1dC5sZW5ndGggLSBpZHggPj0gMikge1xuICAgICAgICB2YXIgZmlyc3QgPSBkZWNvZGVWYWx1ZXMoaW5wdXRbaWR4KytdLCBpbnB1dFtpZHgrK10sIGJ5dGVPcmRlcik7XG4gICAgICAgIGlmIChpc0hpZ2hTdXJyb2dhdGUoZmlyc3QpKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoIC0gaWR4IDwgMikge1xuICAgICAgICAgICAgICAgIC8vIE5lZWQgYXQgbGVhc3QgMiBieXRlcyBsZWZ0IGZvciB0aGUgbG93IHN1cnJvZ2F0ZSB0aGF0IGlzIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgY29kZVBvaW50cy5wdXNoKFJFUExBQ0VNRU5UKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBzZWNvbmQgPSBkZWNvZGVWYWx1ZXMoaW5wdXRbaWR4KytdLCBpbnB1dFtpZHgrK10sIGJ5dGVPcmRlcik7XG4gICAgICAgICAgICAgICAgaWYgKGlzTG93U3Vycm9nYXRlKHNlY29uZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZVBvaW50cy5wdXNoKGZpcnN0LCBzZWNvbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTG93IHN1cnJvZ2F0ZXMgc2hvdWxkIGFsd2F5cyBmb2xsb3cgaGlnaCBzdXJyb2dhdGVzXG4gICAgICAgICAgICAgICAgICAgIGNvZGVQb2ludHMucHVzaChSRVBMQUNFTUVOVCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTG93U3Vycm9nYXRlKGZpcnN0KSkge1xuICAgICAgICAgICAgLy8gSGlnaCBzdXJyb2dhdGVzIHNob3VsZCBhbHdheXMgY29tZSBmaXJzdCBzaW5jZSBgZGVjb2RlVmFsdWVzKClgXG4gICAgICAgICAgICAvLyBhY2NvdW50cyBmb3IgdGhlIGJ5dGUgb3JkZXJpbmdcbiAgICAgICAgICAgIGlkeCArPSAyO1xuICAgICAgICAgICAgY29kZVBvaW50cy5wdXNoKFJFUExBQ0VNRU5UKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvZGVQb2ludHMucHVzaChmaXJzdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGhlcmUgc2hvdWxkbid0IGJlIGV4dHJhIGJ5dGUocykgbGVmdCBvdmVyXG4gICAgaWYgKGlkeCA8IGlucHV0Lmxlbmd0aClcbiAgICAgICAgY29kZVBvaW50cy5wdXNoKFJFUExBQ0VNRU5UKTtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKTtcbn07XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBnaXZlbiBgY29kZVBvaW50YCBpcyBhIGhpZ2ggc3Vycm9nYXRlLlxuICogQHBhcmFtIGNvZGVQb2ludCBUaGUgY29kZSBwb2ludCB0byBiZSBldmFsdWF0ZWQuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjRGVzY3JpcHRpb25cbiAqL1xudmFyIGlzSGlnaFN1cnJvZ2F0ZSA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gY29kZVBvaW50ID49IDB4ZDgwMCAmJiBjb2RlUG9pbnQgPD0gMHhkYmZmO1xufTtcbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGBjb2RlUG9pbnRgIGlzIGEgbG93IHN1cnJvZ2F0ZS5cbiAqIEBwYXJhbSBjb2RlUG9pbnQgVGhlIGNvZGUgcG9pbnQgdG8gYmUgZXZhbHVhdGVkLlxuICpcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0Rlc2NyaXB0aW9uXG4gKi9cbnZhciBpc0xvd1N1cnJvZ2F0ZSA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gY29kZVBvaW50ID49IDB4ZGMwMCAmJiBjb2RlUG9pbnQgPD0gMHhkZmZmO1xufTtcbi8qKlxuICogRGVjb2RlcyB0aGUgZ2l2ZW4gdXRmLTE2IHZhbHVlcyBmaXJzdCBhbmQgc2Vjb25kIHVzaW5nIHRoZSBzcGVjaWZpZWRcbiAqIGJ5dGUgb3JkZXIuXG4gKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGVuY29kaW5nLlxuICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIGJ5dGUgb2YgdGhlIGVuY29kaW5nLlxuICogQHBhcmFtIGJ5dGVPcmRlciBUaGUgYnl0ZSBvcmRlciBvZiB0aGUgZW5jb2RpbmcuXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNFeGFtcGxlc1xuICovXG52YXIgZGVjb2RlVmFsdWVzID0gZnVuY3Rpb24gKGZpcnN0LCBzZWNvbmQsIGJ5dGVPcmRlcikge1xuICAgIC8vIEFwcGVuZCB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcmVjZWRpbmcgYnl0ZSBieSBzaGlmdGluZyB0aGVcbiAgICAvLyBmaXJzdCBvbmUgOCB0byB0aGUgbGVmdCBhbmQgdGhhbiBhcHBseWluZyBhIGJpdHdpc2Ugb3Itb3BlcmF0b3IgdG8gYXBwZW5kXG4gICAgLy8gdGhlIHNlY29uZCBvbmUuXG4gICAgaWYgKGJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkxpdHRsZUVuZGlhbilcbiAgICAgICAgcmV0dXJuIChzZWNvbmQgPDwgOCkgfCBmaXJzdDtcbiAgICBpZiAoYnl0ZU9yZGVyID09PSBCeXRlT3JkZXIuQmlnRW5kaWFuKVxuICAgICAgICByZXR1cm4gKGZpcnN0IDw8IDgpIHwgc2Vjb25kO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYnl0ZU9yZGVyOiBcIiArIGJ5dGVPcmRlcik7XG59O1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGFycmF5IGNvbnRhaW5zIGEgYnl0ZSBvcmRlciBtYXJrIGZvciB0aGVcbiAqIFVURi0xNkJFIG9yIFVURi0xNkxFIGVuY29kaW5nLiBJZiBpdCBoYXMgbmVpdGhlciwgQmlnRW5kaWFuIGlzIGFzc3VtZWQuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CeXRlX29yZGVyX21hcmsjVVRGLTE2XG4gKlxuICogQHBhcmFtIGJ5dGVzIFRoZSBieXRlIGFycmF5IHRvIGJlIGV2YWx1YXRlZC5cbiAqL1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgcmVhZEJPTSA9IGZ1bmN0aW9uIChieXRlcykgeyByZXR1cm4gKGhhc1V0ZjE2QmlnRW5kaWFuQk9NKGJ5dGVzKSA/IEJ5dGVPcmRlci5CaWdFbmRpYW5cbiAgICA6IGhhc1V0ZjE2TGl0dGxlRW5kaWFuQk9NKGJ5dGVzKSA/IEJ5dGVPcmRlci5MaXR0bGVFbmRpYW5cbiAgICAgICAgOiBCeXRlT3JkZXIuQmlnRW5kaWFuKTsgfTtcbnZhciBoYXNVdGYxNkJpZ0VuZGlhbkJPTSA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgIHJldHVybiBieXRlc1swXSA9PT0gMHhmZSAmJiBieXRlc1sxXSA9PT0gMHhmZjtcbn07XG52YXIgaGFzVXRmMTZMaXR0bGVFbmRpYW5CT00gPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICByZXR1cm4gYnl0ZXNbMF0gPT09IDB4ZmYgJiYgYnl0ZXNbMV0gPT09IDB4ZmU7XG59O1xuZXhwb3J0IHZhciBoYXNVdGYxNkJPTSA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgIHJldHVybiBoYXNVdGYxNkJpZ0VuZGlhbkJPTShieXRlcykgfHwgaGFzVXRmMTZMaXR0bGVFbmRpYW5CT00oYnl0ZXMpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaWNvZGUuanMubWFwIiwiLyogdHNsaW50OmRpc2FibGU6YmFuLXR5cGVzICovXG5pbXBvcnQgeyB2YWx1ZXMgYXMgb2JqZWN0VmFsdWVzIH0gZnJvbSBcIi4vb2JqZWN0c1wiO1xuZXhwb3J0IHZhciBiYWNrdGljayA9IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIFwiYFwiICsgdmFsICsgXCJgXCI7IH07XG5leHBvcnQgdmFyIHNpbmdsZVF1b3RlID0gZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gXCInXCIgKyB2YWwgKyBcIidcIjsgfTtcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGZvcm1hdFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gc2luZ2xlUXVvdGUodmFsdWUpO1xuICAgIGVsc2UgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm4gYmFja3RpY2sodmFsdWUpO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xufTtcbmV4cG9ydCB2YXIgY3JlYXRlVmFsdWVFcnJvck1zZyA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCB2YWx1ZXMpIHtcbiAgICB2YXIgYWxsb3dlZFZhbHVlcyA9IG5ldyBBcnJheSh2YWx1ZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciB2ID0gdmFsdWVzW2lkeF07XG4gICAgICAgIGFsbG93ZWRWYWx1ZXNbaWR4XSA9IGZvcm1hdFZhbHVlKHYpO1xuICAgIH1cbiAgICB2YXIgam9pbmVkVmFsdWVzID0gYWxsb3dlZFZhbHVlcy5qb2luKCcgb3IgJyk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgcmV0dXJuIGJhY2t0aWNrKHZhbHVlTmFtZSkgKyBcIiBtdXN0IGJlIG9uZSBvZiBcIiArIGpvaW5lZFZhbHVlcyArIFwiLCBidXQgd2FzIGFjdHVhbGx5IFwiICsgZm9ybWF0VmFsdWUodmFsdWUpO1xufTtcbmV4cG9ydCB2YXIgYXNzZXJ0SXNPbmVPZiA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCBhbGxvd2VkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFsbG93ZWRWYWx1ZXMpKSB7XG4gICAgICAgIGFsbG93ZWRWYWx1ZXMgPSBvYmplY3RWYWx1ZXMoYWxsb3dlZFZhbHVlcyk7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFsbG93ZWRWYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gYWxsb3dlZFZhbHVlc1tpZHhdKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGNyZWF0ZVZhbHVlRXJyb3JNc2codmFsdWUsIHZhbHVlTmFtZSwgYWxsb3dlZFZhbHVlcykpO1xufTtcbmV4cG9ydCB2YXIgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIGFsbG93ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWxsb3dlZFZhbHVlcykpIHtcbiAgICAgICAgYWxsb3dlZFZhbHVlcyA9IG9iamVjdFZhbHVlcyhhbGxvd2VkVmFsdWVzKTtcbiAgICB9XG4gICAgYXNzZXJ0SXNPbmVPZih2YWx1ZSwgdmFsdWVOYW1lLCBhbGxvd2VkVmFsdWVzLmNvbmNhdCh1bmRlZmluZWQpKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydElzU3Vic2V0ID0gZnVuY3Rpb24gKHZhbHVlcywgdmFsdWVOYW1lLCBhbGxvd2VkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFsbG93ZWRWYWx1ZXMpKSB7XG4gICAgICAgIGFsbG93ZWRWYWx1ZXMgPSBvYmplY3RWYWx1ZXMoYWxsb3dlZFZhbHVlcyk7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZih2YWx1ZXNbaWR4XSwgdmFsdWVOYW1lLCBhbGxvd2VkVmFsdWVzKTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciBnZXRUeXBlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmICh2YWwgPT09IG51bGwpXG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgaWYgKGlzTmFOKHZhbCkpXG4gICAgICAgIHJldHVybiAnTmFOJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3ltYm9sJylcbiAgICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnYmlnaW50JylcbiAgICAgICAgcmV0dXJuICdiaWdpbnQnO1xuICAgIGlmICh2YWwuY29uc3RydWN0b3IgJiYgdmFsLmNvbnN0cnVjdG9yLm5hbWUpXG4gICAgICAgIHJldHVybiB2YWwuY29uc3RydWN0b3IubmFtZTtcbiAgICBpZiAodmFsLm5hbWUpXG4gICAgICAgIHJldHVybiB2YWwubmFtZTtcbiAgICBpZiAodmFsLmNvbnN0cnVjdG9yKVxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbC5jb25zdHJ1Y3Rvcik7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpO1xufTtcbmV4cG9ydCB2YXIgaXNUeXBlID0gZnVuY3Rpb24gKHZhbHVlLCB0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudWxsJylcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xuICAgIGlmICh0eXBlID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSk7XG4gICAgaWYgKHR5cGUgPT09ICdib29sZWFuJylcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICAgIGlmICh0eXBlID09PSAnc3ltYm9sJylcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCc7XG4gICAgaWYgKHR5cGUgPT09ICdiaWdpbnQnKVxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JztcbiAgICBpZiAodHlwZSA9PT0gRGF0ZSlcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZTtcbiAgICBpZiAodHlwZSA9PT0gQXJyYXkpXG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5O1xuICAgIGlmICh0eXBlID09PSBVaW50OEFycmF5KVxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5O1xuICAgIGlmICh0eXBlID09PSBBcnJheUJ1ZmZlcilcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG4gICAgaWYgKHR5cGUgPT09IEZ1bmN0aW9uKVxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbjtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiB0eXBlWzBdO1xufTtcbmV4cG9ydCB2YXIgY3JlYXRlVHlwZUVycm9yTXNnID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIHR5cGVzKSB7XG4gICAgdmFyIGFsbG93ZWRUeXBlcyA9IG5ldyBBcnJheSh0eXBlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHR5cGVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2lkeF07XG4gICAgICAgIGlmICh0eXBlID09PSAnbnVsbCcpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdudWxsJyk7XG4gICAgICAgIGlmICh0eXBlID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ3VuZGVmaW5lZCcpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdzdHJpbmcnKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdudW1iZXInKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnYm9vbGVhbicpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnc3ltYm9sJylcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ3N5bWJvbCcpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYmlnaW50JylcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ2JpZ2ludCcpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBBcnJheSlcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ0FycmF5Jyk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFVpbnQ4QXJyYXkpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdVaW50OEFycmF5Jyk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IEFycmF5QnVmZmVyKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnQXJyYXlCdWZmZXInKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljayh0eXBlWzFdKTtcbiAgICB9XG4gICAgdmFyIGpvaW5lZFR5cGVzID0gYWxsb3dlZFR5cGVzLmpvaW4oJyBvciAnKTtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICByZXR1cm4gYmFja3RpY2sodmFsdWVOYW1lKSArIFwiIG11c3QgYmUgb2YgdHlwZSBcIiArIGpvaW5lZFR5cGVzICsgXCIsIGJ1dCB3YXMgYWN0dWFsbHkgb2YgdHlwZSBcIiArIGJhY2t0aWNrKGdldFR5cGUodmFsdWUpKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydElzID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIHR5cGVzKSB7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdHlwZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGlmIChpc1R5cGUodmFsdWUsIHR5cGVzW2lkeF0pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGNyZWF0ZVR5cGVFcnJvck1zZyh2YWx1ZSwgdmFsdWVOYW1lLCB0eXBlcykpO1xufTtcbmV4cG9ydCB2YXIgYXNzZXJ0T3JVbmRlZmluZWQgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgdHlwZXMpIHtcbiAgICBhc3NlcnRJcyh2YWx1ZSwgdmFsdWVOYW1lLCB0eXBlcy5jb25jYXQoJ3VuZGVmaW5lZCcpKTtcbn07XG5leHBvcnQgdmFyIGFzc2VydEVhY2hJcyA9IGZ1bmN0aW9uICh2YWx1ZXMsIHZhbHVlTmFtZSwgdHlwZXMpIHtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGFzc2VydElzKHZhbHVlc1tpZHhdLCB2YWx1ZU5hbWUsIHR5cGVzKTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciBhc3NlcnRSYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCBtaW4sIG1heCkge1xuICAgIGFzc2VydElzKHZhbHVlLCB2YWx1ZU5hbWUsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydElzKG1pbiwgJ21pbicsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydElzKG1heCwgJ21heCcsIFsnbnVtYmVyJ10pO1xuICAgIG1heCA9IE1hdGgubWF4KG1pbiwgbWF4KTtcbiAgICBpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpIHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihiYWNrdGljayh2YWx1ZU5hbWUpICsgXCIgbXVzdCBiZSBhdCBsZWFzdCBcIiArIG1pbiArIFwiIGFuZCBhdCBtb3N0IFwiICsgbWF4ICsgXCIsIGJ1dCB3YXMgYWN0dWFsbHkgXCIgKyB2YWx1ZSk7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCBtaW4sIG1heCkge1xuICAgIGFzc2VydElzKHZhbHVlLCB2YWx1ZU5hbWUsIFsnbnVtYmVyJywgJ3VuZGVmaW5lZCddKTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJylcbiAgICAgICAgYXNzZXJ0UmFuZ2UodmFsdWUsIHZhbHVlTmFtZSwgbWluLCBtYXgpO1xufTtcbmV4cG9ydCB2YXIgYXNzZXJ0TXVsdGlwbGUgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgbXVsdGlwbGllcikge1xuICAgIGFzc2VydElzKHZhbHVlLCB2YWx1ZU5hbWUsIFsnbnVtYmVyJ10pO1xuICAgIGlmICh2YWx1ZSAlIG11bHRpcGxpZXIgIT09IDApIHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihiYWNrdGljayh2YWx1ZU5hbWUpICsgXCIgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFwiICsgbXVsdGlwbGllciArIFwiLCBidXQgd2FzIGFjdHVhbGx5IFwiICsgdmFsdWUpO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIGFzc2VydEludGVnZXIgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSkge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJhY2t0aWNrKHZhbHVlTmFtZSkgKyBcIiBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCB3YXMgYWN0dWFsbHkgXCIgKyB2YWx1ZSk7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgYXNzZXJ0UG9zaXRpdmUgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSkge1xuICAgIGlmICghWzEsIDBdLmluY2x1ZGVzKE1hdGguc2lnbih2YWx1ZSkpKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYmFja3RpY2sodmFsdWVOYW1lKSArIFwiIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIgb3IgMCwgYnV0IHdhcyBhY3R1YWxseSBcIiArIHZhbHVlKTtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmFsaWRhdG9ycy5qcy5tYXAiLCIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jcmVhdGVCaW5kaW5nKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7XHJcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7XHJcbiAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcclxuICAgIHJldHVybiB2YWx1ZTtcclxufVxyXG4iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJwcmludEpTXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInByaW50SlNcIl0gPSBmYWN0b3J5KCk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4vKioqKioqLyBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vKioqKioqLyBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4vKioqKioqLyBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuLyoqKioqKi8gXHRcdHJldHVybiBucztcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovICh7XG5cbi8qKiovIFwiLi9zcmMvaW5kZXguanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvaW5kZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2Fzc19pbmRleF9zY3NzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3Nhc3MvaW5kZXguc2NzcyAqLyBcIi4vc3JjL3Nhc3MvaW5kZXguc2Nzc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfc2Fzc19pbmRleF9zY3NzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX3Nhc3NfaW5kZXhfc2Nzc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfanNfaW5pdF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9qcy9pbml0ICovIFwiLi9zcmMvanMvaW5pdC5qc1wiKTtcblxuXG52YXIgcHJpbnRKUyA9IF9qc19pbml0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLmluaXQ7XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICB3aW5kb3cucHJpbnRKUyA9IHByaW50SlM7XG59XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAocHJpbnRKUyk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL2Jyb3dzZXIuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9icm93c2VyLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbnZhciBCcm93c2VyID0ge1xuICAvLyBGaXJlZm94IDEuMCtcbiAgaXNGaXJlZm94OiBmdW5jdGlvbiBpc0ZpcmVmb3goKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBJbnN0YWxsVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCc7XG4gIH0sXG4gIC8vIEludGVybmV0IEV4cGxvcmVyIDYtMTFcbiAgaXNJRTogZnVuY3Rpb24gaXNJRSgpIHtcbiAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgIT09IC0xIHx8ICEhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuICB9LFxuICAvLyBFZGdlIDIwK1xuICBpc0VkZ2U6IGZ1bmN0aW9uIGlzRWRnZSgpIHtcbiAgICByZXR1cm4gIUJyb3dzZXIuaXNJRSgpICYmICEhd2luZG93LlN0eWxlTWVkaWE7XG4gIH0sXG4gIC8vIENocm9tZSAxK1xuICBpc0Nocm9tZTogZnVuY3Rpb24gaXNDaHJvbWUoKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHdpbmRvdztcbiAgICByZXR1cm4gISFjb250ZXh0LmNocm9tZTtcbiAgfSxcbiAgLy8gQXQgbGVhc3QgU2FmYXJpIDMrOiBcIltvYmplY3QgSFRNTEVsZW1lbnRDb25zdHJ1Y3Rvcl1cIlxuICBpc1NhZmFyaTogZnVuY3Rpb24gaXNTYWZhcmkoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cuSFRNTEVsZW1lbnQpLmluZGV4T2YoJ0NvbnN0cnVjdG9yJykgPiAwIHx8IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdzYWZhcmknKSAhPT0gLTE7XG4gIH0sXG4gIC8vIElPUyBDaHJvbWVcbiAgaXNJT1NDaHJvbWU6IGZ1bmN0aW9uIGlzSU9TQ2hyb21lKCkge1xuICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY3Jpb3MnKSAhPT0gLTE7XG4gIH1cbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKEJyb3dzZXIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9mdW5jdGlvbnMuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL2Z1bmN0aW9ucy5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogYWRkV3JhcHBlciwgY2FwaXRhbGl6ZVByaW50LCBjb2xsZWN0U3R5bGVzLCBhZGRIZWFkZXIsIGNsZWFuVXAsIGlzUmF3SFRNTCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRXcmFwcGVyXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gYWRkV3JhcHBlcjsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiY2FwaXRhbGl6ZVByaW50XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gY2FwaXRhbGl6ZVByaW50OyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJjb2xsZWN0U3R5bGVzXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gY29sbGVjdFN0eWxlczsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiYWRkSGVhZGVyXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gYWRkSGVhZGVyOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJjbGVhblVwXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gY2xlYW5VcDsgfSk7XG4vKiBoYXJtb255IGV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNSYXdIVE1MXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gaXNSYXdIVE1MOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfbW9kYWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vbW9kYWwgKi8gXCIuL3NyYy9qcy9tb2RhbC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9icm93c2VyICovIFwiLi9zcmMvanMvYnJvd3Nlci5qc1wiKTtcbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuXG5cbmZ1bmN0aW9uIGFkZFdyYXBwZXIoaHRtbERhdGEsIHBhcmFtcykge1xuICB2YXIgYm9keVN0eWxlID0gJ2ZvbnQtZmFtaWx5OicgKyBwYXJhbXMuZm9udCArICcgIWltcG9ydGFudDsgZm9udC1zaXplOiAnICsgcGFyYW1zLmZvbnRfc2l6ZSArICcgIWltcG9ydGFudDsgd2lkdGg6MTAwJTsnO1xuICByZXR1cm4gJzxkaXYgc3R5bGU9XCInICsgYm9keVN0eWxlICsgJ1wiPicgKyBodG1sRGF0YSArICc8L2Rpdj4nO1xufVxuZnVuY3Rpb24gY2FwaXRhbGl6ZVByaW50KG9iaikge1xuICByZXR1cm4gb2JqLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgb2JqLnNsaWNlKDEpO1xufVxuZnVuY3Rpb24gY29sbGVjdFN0eWxlcyhlbGVtZW50LCBwYXJhbXMpIHtcbiAgdmFyIHdpbiA9IGRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgLy8gU3RyaW5nIHZhcmlhYmxlIHRvIGhvbGQgc3R5bGluZyBmb3IgZWFjaCBlbGVtZW50XG5cbiAgdmFyIGVsZW1lbnRTdHlsZSA9ICcnOyAvLyBMb29wIG92ZXIgY29tcHV0ZWQgc3R5bGVzXG5cbiAgdmFyIHN0eWxlcyA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsICcnKTtcblxuICBmb3IgKHZhciBrZXkgPSAwOyBrZXkgPCBzdHlsZXMubGVuZ3RoOyBrZXkrKykge1xuICAgIC8vIENoZWNrIGlmIHN0eWxlIHNob3VsZCBiZSBwcm9jZXNzZWRcbiAgICBpZiAocGFyYW1zLnRhcmdldFN0eWxlcy5pbmRleE9mKCcqJykgIT09IC0xIHx8IHBhcmFtcy50YXJnZXRTdHlsZS5pbmRleE9mKHN0eWxlc1trZXldKSAhPT0gLTEgfHwgdGFyZ2V0U3R5bGVzTWF0Y2gocGFyYW1zLnRhcmdldFN0eWxlcywgc3R5bGVzW2tleV0pKSB7XG4gICAgICBpZiAoc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGVzW2tleV0pKSBlbGVtZW50U3R5bGUgKz0gc3R5bGVzW2tleV0gKyAnOicgKyBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZXNba2V5XSkgKyAnOyc7XG4gICAgfVxuICB9IC8vIFByaW50IGZyaWVuZGx5IGRlZmF1bHRzIChkZXByZWNhdGVkKVxuXG5cbiAgZWxlbWVudFN0eWxlICs9ICdtYXgtd2lkdGg6ICcgKyBwYXJhbXMubWF4V2lkdGggKyAncHggIWltcG9ydGFudDsgZm9udC1zaXplOiAnICsgcGFyYW1zLmZvbnRfc2l6ZSArICcgIWltcG9ydGFudDsnO1xuICByZXR1cm4gZWxlbWVudFN0eWxlO1xufVxuXG5mdW5jdGlvbiB0YXJnZXRTdHlsZXNNYXRjaChzdHlsZXMsIHZhbHVlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKF90eXBlb2YodmFsdWUpID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5pbmRleE9mKHN0eWxlc1tpXSkgIT09IC0xKSByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYWRkSGVhZGVyKHByaW50RWxlbWVudCwgcGFyYW1zKSB7XG4gIC8vIENyZWF0ZSB0aGUgaGVhZGVyIGNvbnRhaW5lciBkaXZcbiAgdmFyIGhlYWRlckNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBDaGVjayBpZiB0aGUgaGVhZGVyIGlzIHRleHQgb3IgcmF3IGh0bWxcblxuICBpZiAoaXNSYXdIVE1MKHBhcmFtcy5oZWFkZXIpKSB7XG4gICAgaGVhZGVyQ29udGFpbmVyLmlubmVySFRNTCA9IHBhcmFtcy5oZWFkZXI7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ3JlYXRlIGhlYWRlciBlbGVtZW50XG4gICAgdmFyIGhlYWRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMScpOyAvLyBDcmVhdGUgaGVhZGVyIHRleHQgbm9kZVxuXG4gICAgdmFyIGhlYWRlck5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXJhbXMuaGVhZGVyKTsgLy8gQnVpbGQgYW5kIHN0eWxlXG5cbiAgICBoZWFkZXJFbGVtZW50LmFwcGVuZENoaWxkKGhlYWRlck5vZGUpO1xuICAgIGhlYWRlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsIHBhcmFtcy5oZWFkZXJTdHlsZSk7XG4gICAgaGVhZGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKGhlYWRlckVsZW1lbnQpO1xuICB9XG5cbiAgcHJpbnRFbGVtZW50Lmluc2VydEJlZm9yZShoZWFkZXJDb250YWluZXIsIHByaW50RWxlbWVudC5jaGlsZE5vZGVzWzBdKTtcbn1cbmZ1bmN0aW9uIGNsZWFuVXAocGFyYW1zKSB7XG4gIC8vIElmIHdlIGFyZSBzaG93aW5nIGEgZmVlZGJhY2sgbWVzc2FnZSB0byB1c2VyLCByZW1vdmUgaXRcbiAgaWYgKHBhcmFtcy5zaG93TW9kYWwpIF9tb2RhbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5jbG9zZSgpOyAvLyBDaGVjayBmb3IgYSBmaW5pc2hlZCBsb2FkaW5nIGhvb2sgZnVuY3Rpb25cblxuICBpZiAocGFyYW1zLm9uTG9hZGluZ0VuZCkgcGFyYW1zLm9uTG9hZGluZ0VuZCgpOyAvLyBJZiBwcmVsb2FkaW5nIHBkZiBmaWxlcywgY2xlYW4gYmxvYiB1cmxcblxuICBpZiAocGFyYW1zLnNob3dNb2RhbCB8fCBwYXJhbXMub25Mb2FkaW5nU3RhcnQpIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHBhcmFtcy5wcmludGFibGUpOyAvLyBSdW4gb25QcmludERpYWxvZ0Nsb3NlIGNhbGxiYWNrXG5cbiAgdmFyIGV2ZW50ID0gJ21vdXNlb3Zlcic7XG5cbiAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLmlzQ2hyb21lKCkgfHwgX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uaXNGaXJlZm94KCkpIHtcbiAgICAvLyBQcy46IEZpcmVmb3ggd2lsbCByZXF1aXJlIGFuIGV4dHJhIGNsaWNrIGluIHRoZSBkb2N1bWVudCB0byBmaXJlIHRoZSBmb2N1cyBldmVudC5cbiAgICBldmVudCA9ICdmb2N1cyc7XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBldmVudCBvbmx5IGhhcHBlbnMgb25jZS5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgcGFyYW1zLm9uUHJpbnREaWFsb2dDbG9zZSgpOyAvLyBSZW1vdmUgaWZyYW1lIGZyb20gdGhlIERPTVxuXG4gICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtcy5mcmFtZUlkKTtcblxuICAgIGlmIChpZnJhbWUpIHtcbiAgICAgIGlmcmFtZS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xufVxuZnVuY3Rpb24gaXNSYXdIVE1MKHJhdykge1xuICB2YXIgcmVnZXhIdG1sID0gbmV3IFJlZ0V4cCgnPChbQS1aYS16XVtBLVphLXowLTldKilcXFxcYltePl0qPiguKj8pPC9cXFxcMT4nKTtcbiAgcmV0dXJuIHJlZ2V4SHRtbC50ZXN0KHJhdyk7XG59XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL2h0bWwuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9odG1sLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Z1bmN0aW9ucyAqLyBcIi4vc3JjL2pzL2Z1bmN0aW9ucy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJpbnQgKi8gXCIuL3NyYy9qcy9wcmludC5qc1wiKTtcbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoe1xuICBwcmludDogZnVuY3Rpb24gcHJpbnQocGFyYW1zLCBwcmludEZyYW1lKSB7XG4gICAgLy8gR2V0IHRoZSBET00gcHJpbnRhYmxlIGVsZW1lbnRcbiAgICB2YXIgcHJpbnRFbGVtZW50ID0gaXNIdG1sRWxlbWVudChwYXJhbXMucHJpbnRhYmxlKSA/IHBhcmFtcy5wcmludGFibGUgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJhbXMucHJpbnRhYmxlKTsgLy8gQ2hlY2sgaWYgdGhlIGVsZW1lbnQgZXhpc3RzXG5cbiAgICBpZiAoIXByaW50RWxlbWVudCkge1xuICAgICAgd2luZG93LmNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgSFRNTCBlbGVtZW50IGlkOiAnICsgcGFyYW1zLnByaW50YWJsZSk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBDbG9uZSB0aGUgdGFyZ2V0IGVsZW1lbnQgaW5jbHVkaW5nIGl0cyBjaGlsZHJlbiAoaWYgYXZhaWxhYmxlKVxuXG5cbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudCA9IGNsb25lRWxlbWVudChwcmludEVsZW1lbnQsIHBhcmFtcyk7IC8vIEFkZCBoZWFkZXJcblxuICAgIGlmIChwYXJhbXMuaGVhZGVyKSB7XG4gICAgICBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiYWRkSGVhZGVyXCJdKShwYXJhbXMucHJpbnRhYmxlRWxlbWVudCwgcGFyYW1zKTtcbiAgICB9IC8vIFByaW50IGh0bWwgZWxlbWVudCBjb250ZW50c1xuXG5cbiAgICBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uc2VuZChwYXJhbXMsIHByaW50RnJhbWUpO1xuICB9XG59KTtcblxuZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHBhcmFtcykge1xuICAvLyBDbG9uZSB0aGUgbWFpbiBub2RlIChpZiBub3QgYWxyZWFkeSBpbnNpZGUgdGhlIHJlY3Vyc2lvbiBwcm9jZXNzKVxuICB2YXIgY2xvbmUgPSBlbGVtZW50LmNsb25lTm9kZSgpOyAvLyBMb29wIG92ZXIgYW5kIHByb2Nlc3MgdGhlIGNoaWxkcmVuIGVsZW1lbnRzIC8gbm9kZXMgKGluY2x1ZGluZyB0ZXh0IG5vZGVzKVxuXG4gIHZhciBjaGlsZE5vZGVzQXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlbGVtZW50LmNoaWxkTm9kZXMpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHNraXBwaW5nIHRoZSBjdXJyZW50IGVsZW1lbnRcbiAgICBpZiAocGFyYW1zLmlnbm9yZUVsZW1lbnRzLmluZGV4T2YoY2hpbGROb2Rlc0FycmF5W2ldLmlkKSAhPT0gLTEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gQ2xvbmUgdGhlIGNoaWxkIGVsZW1lbnRcblxuXG4gICAgdmFyIGNsb25lZENoaWxkID0gY2xvbmVFbGVtZW50KGNoaWxkTm9kZXNBcnJheVtpXSwgcGFyYW1zKTsgLy8gQXR0YWNoIHRoZSBjbG9uZWQgY2hpbGQgdG8gdGhlIGNsb25lZCBwYXJlbnQgbm9kZVxuXG4gICAgY2xvbmUuYXBwZW5kQ2hpbGQoY2xvbmVkQ2hpbGQpO1xuICB9IC8vIEdldCBhbGwgc3R5bGluZyBmb3IgcHJpbnQgZWxlbWVudCAoZm9yIG5vZGVzIG9mIHR5cGUgZWxlbWVudCBvbmx5KVxuXG5cbiAgaWYgKHBhcmFtcy5zY2FuU3R5bGVzICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImNvbGxlY3RTdHlsZXNcIl0pKGVsZW1lbnQsIHBhcmFtcykpO1xuICB9IC8vIENoZWNrIGlmIHRoZSBlbGVtZW50IG5lZWRzIGFueSBzdGF0ZSBwcm9jZXNzaW5nIChjb3B5IHVzZXIgaW5wdXQgZGF0YSlcblxuXG4gIHN3aXRjaCAoZWxlbWVudC50YWdOYW1lKSB7XG4gICAgY2FzZSAnU0VMRUNUJzpcbiAgICAgIC8vIENvcHkgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHZhbHVlIHRvIGl0cyBjbG9uZVxuICAgICAgY2xvbmUudmFsdWUgPSBlbGVtZW50LnZhbHVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdDQU5WQVMnOlxuICAgICAgLy8gQ29weSB0aGUgY2FudmFzIGNvbnRlbnQgdG8gaXRzIGNsb25lXG4gICAgICBjbG9uZS5nZXRDb250ZXh0KCcyZCcpLmRyYXdJbWFnZShlbGVtZW50LCAwLCAwKTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGNsb25lO1xufVxuXG5mdW5jdGlvbiBpc0h0bWxFbGVtZW50KHByaW50YWJsZSkge1xuICAvLyBDaGVjayBpZiBlbGVtZW50IGlzIGluc3RhbmNlIG9mIEhUTUxFbGVtZW50IG9yIGhhcyBub2RlVHlwZSA9PT0gMSAoZm9yIGVsZW1lbnRzIGluIGlmcmFtZSlcbiAgcmV0dXJuIF90eXBlb2YocHJpbnRhYmxlKSA9PT0gJ29iamVjdCcgJiYgcHJpbnRhYmxlICYmIChwcmludGFibGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBwcmludGFibGUubm9kZVR5cGUgPT09IDEpO1xufVxuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9pbWFnZS5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9pbWFnZS5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZnVuY3Rpb25zICovIFwiLi9zcmMvanMvZnVuY3Rpb25zLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9wcmludCAqLyBcIi4vc3JjL2pzL3ByaW50LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Jyb3dzZXIgKi8gXCIuL3NyYy9qcy9icm93c2VyLmpzXCIpO1xuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9ICh7XG4gIHByaW50OiBmdW5jdGlvbiBwcmludChwYXJhbXMsIHByaW50RnJhbWUpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhcmUgcHJpbnRpbmcgb25lIGltYWdlIG9yIG11bHRpcGxlIGltYWdlc1xuICAgIGlmIChwYXJhbXMucHJpbnRhYmxlLmNvbnN0cnVjdG9yICE9PSBBcnJheSkge1xuICAgICAgLy8gQ3JlYXRlIGFycmF5IHdpdGggb25lIGltYWdlXG4gICAgICBwYXJhbXMucHJpbnRhYmxlID0gW3BhcmFtcy5wcmludGFibGVdO1xuICAgIH0gLy8gQ3JlYXRlIHByaW50YWJsZSBlbGVtZW50IChjb250YWluZXIpXG5cblxuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IC8vIENyZWF0ZSBhbGwgaW1hZ2UgZWxlbWVudHMgYW5kIGFwcGVuZCB0aGVtIHRvIHRoZSBwcmludGFibGUgY29udGFpbmVyXG5cbiAgICBwYXJhbXMucHJpbnRhYmxlLmZvckVhY2goZnVuY3Rpb24gKHNyYykge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBpbWFnZSBlbGVtZW50XG4gICAgICB2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICBpbWcuc2V0QXR0cmlidXRlKCdzdHlsZScsIHBhcmFtcy5pbWFnZVN0eWxlKTsgLy8gU2V0IGltYWdlIHNyYyB3aXRoIHRoZSBmaWxlIHVybFxuXG4gICAgICBpbWcuc3JjID0gc3JjOyAvLyBUaGUgZm9sbG93aW5nIGJsb2NrIGlzIGZvciBGaXJlZm94LCB3aGljaCBmb3Igc29tZSByZWFzb24gcmVxdWlyZXMgdGhlIGltYWdlJ3Mgc3JjIHRvIGJlIGZ1bGx5IHF1YWxpZmllZCBpblxuICAgICAgLy8gb3JkZXIgdG8gcHJpbnQgaXRcblxuICAgICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bXCJkZWZhdWx0XCJdLmlzRmlyZWZveCgpKSB7XG4gICAgICAgIHZhciBmdWxseVF1YWxpZmllZFNyYyA9IGltZy5zcmM7XG4gICAgICAgIGltZy5zcmMgPSBmdWxseVF1YWxpZmllZFNyYztcbiAgICAgIH0gLy8gQ3JlYXRlIHRoZSBpbWFnZSB3cmFwcGVyXG5cblxuICAgICAgdmFyIGltYWdlV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBBcHBlbmQgaW1hZ2UgdG8gdGhlIHdyYXBwZXIgZWxlbWVudFxuXG4gICAgICBpbWFnZVdyYXBwZXIuYXBwZW5kQ2hpbGQoaW1nKTsgLy8gQXBwZW5kIHdyYXBwZXIgdG8gdGhlIHByaW50YWJsZSBlbGVtZW50XG5cbiAgICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50LmFwcGVuZENoaWxkKGltYWdlV3JhcHBlcik7XG4gICAgfSk7IC8vIENoZWNrIGlmIHdlIGFyZSBhZGRpbmcgYSBwcmludCBoZWFkZXJcblxuICAgIGlmIChwYXJhbXMuaGVhZGVyKSBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiYWRkSGVhZGVyXCJdKShwYXJhbXMucHJpbnRhYmxlRWxlbWVudCwgcGFyYW1zKTsgLy8gUHJpbnQgaW1hZ2VcblxuICAgIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5zZW5kKHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gIH1cbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9pbml0LmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvaW5pdC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYnJvd3NlciAqLyBcIi4vc3JjL2pzL2Jyb3dzZXIuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX21vZGFsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL21vZGFsICovIFwiLi9zcmMvanMvbW9kYWwuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3BkZl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9wZGYgKi8gXCIuL3NyYy9qcy9wZGYuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2h0bWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vaHRtbCAqLyBcIi4vc3JjL2pzL2h0bWwuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3Jhd19odG1sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3Jhdy1odG1sICovIFwiLi9zcmMvanMvcmF3LWh0bWwuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2ltYWdlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2ltYWdlICovIFwiLi9zcmMvanMvaW1hZ2UuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2pzb25fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vanNvbiAqLyBcIi4vc3JjL2pzL2pzb24uanNcIik7XG5cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5cblxuXG5cblxuXG5cbnZhciBwcmludFR5cGVzID0gWydwZGYnLCAnaHRtbCcsICdpbWFnZScsICdqc29uJywgJ3Jhdy1odG1sJ107XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHtcbiAgaW5pdDogZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgcHJpbnRhYmxlOiBudWxsLFxuICAgICAgZmFsbGJhY2tQcmludGFibGU6IG51bGwsXG4gICAgICB0eXBlOiAncGRmJyxcbiAgICAgIGhlYWRlcjogbnVsbCxcbiAgICAgIGhlYWRlclN0eWxlOiAnZm9udC13ZWlnaHQ6IDMwMDsnLFxuICAgICAgbWF4V2lkdGg6IDgwMCxcbiAgICAgIHByb3BlcnRpZXM6IG51bGwsXG4gICAgICBncmlkSGVhZGVyU3R5bGU6ICdmb250LXdlaWdodDogYm9sZDsgcGFkZGluZzogNXB4OyBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOycsXG4gICAgICBncmlkU3R5bGU6ICdib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7IG1hcmdpbi1ib3R0b206IC0xcHg7JyxcbiAgICAgIHNob3dNb2RhbDogZmFsc2UsXG4gICAgICBvbkVycm9yOiBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSxcbiAgICAgIG9uTG9hZGluZ1N0YXJ0OiBudWxsLFxuICAgICAgb25Mb2FkaW5nRW5kOiBudWxsLFxuICAgICAgb25QcmludERpYWxvZ0Nsb3NlOiBmdW5jdGlvbiBvblByaW50RGlhbG9nQ2xvc2UoKSB7fSxcbiAgICAgIG9uSW5jb21wYXRpYmxlQnJvd3NlcjogZnVuY3Rpb24gb25JbmNvbXBhdGlibGVCcm93c2VyKCkge30sXG4gICAgICBtb2RhbE1lc3NhZ2U6ICdSZXRyaWV2aW5nIERvY3VtZW50Li4uJyxcbiAgICAgIGZyYW1lSWQ6ICdwcmludEpTJyxcbiAgICAgIHByaW50YWJsZUVsZW1lbnQ6IG51bGwsXG4gICAgICBkb2N1bWVudFRpdGxlOiAnRG9jdW1lbnQnLFxuICAgICAgdGFyZ2V0U3R5bGU6IFsnY2xlYXInLCAnZGlzcGxheScsICd3aWR0aCcsICdtaW4td2lkdGgnLCAnaGVpZ2h0JywgJ21pbi1oZWlnaHQnLCAnbWF4LWhlaWdodCddLFxuICAgICAgdGFyZ2V0U3R5bGVzOiBbJ2JvcmRlcicsICdib3gnLCAnYnJlYWsnLCAndGV4dC1kZWNvcmF0aW9uJ10sXG4gICAgICBpZ25vcmVFbGVtZW50czogW10sXG4gICAgICByZXBlYXRUYWJsZUhlYWRlcjogdHJ1ZSxcbiAgICAgIGNzczogbnVsbCxcbiAgICAgIHN0eWxlOiBudWxsLFxuICAgICAgc2NhblN0eWxlczogdHJ1ZSxcbiAgICAgIGJhc2U2NDogZmFsc2UsXG4gICAgICAvLyBEZXByZWNhdGVkXG4gICAgICBvblBkZk9wZW46IG51bGwsXG4gICAgICBmb250OiAnVGltZXNOZXdSb21hbicsXG4gICAgICBmb250X3NpemU6ICcxMnB0JyxcbiAgICAgIGhvbm9yTWFyZ2luUGFkZGluZzogdHJ1ZSxcbiAgICAgIGhvbm9yQ29sb3I6IGZhbHNlLFxuICAgICAgaW1hZ2VTdHlsZTogJ21heC13aWR0aDogMTAwJTsnXG4gICAgfTsgLy8gQ2hlY2sgaWYgYSBwcmludGFibGUgZG9jdW1lbnQgb3Igb2JqZWN0IHdhcyBzdXBwbGllZFxuXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHNbMF07XG5cbiAgICBpZiAoYXJncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaW50SlMgZXhwZWN0cyBhdCBsZWFzdCAxIGF0dHJpYnV0ZS4nKTtcbiAgICB9IC8vIFByb2Nlc3MgcGFyYW1ldGVyc1xuXG5cbiAgICBzd2l0Y2ggKF90eXBlb2YoYXJncykpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHBhcmFtcy5wcmludGFibGUgPSBlbmNvZGVVUkkoYXJncyk7XG4gICAgICAgIHBhcmFtcy5mYWxsYmFja1ByaW50YWJsZSA9IHBhcmFtcy5wcmludGFibGU7XG4gICAgICAgIHBhcmFtcy50eXBlID0gYXJndW1lbnRzWzFdIHx8IHBhcmFtcy50eXBlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcGFyYW1zLnByaW50YWJsZSA9IGFyZ3MucHJpbnRhYmxlO1xuICAgICAgICBwYXJhbXMuZmFsbGJhY2tQcmludGFibGUgPSB0eXBlb2YgYXJncy5mYWxsYmFja1ByaW50YWJsZSAhPT0gJ3VuZGVmaW5lZCcgPyBhcmdzLmZhbGxiYWNrUHJpbnRhYmxlIDogcGFyYW1zLnByaW50YWJsZTtcbiAgICAgICAgcGFyYW1zLmZhbGxiYWNrUHJpbnRhYmxlID0gcGFyYW1zLmJhc2U2NCA/IFwiZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LFwiLmNvbmNhdChwYXJhbXMuZmFsbGJhY2tQcmludGFibGUpIDogcGFyYW1zLmZhbGxiYWNrUHJpbnRhYmxlO1xuXG4gICAgICAgIGZvciAodmFyIGsgaW4gcGFyYW1zKSB7XG4gICAgICAgICAgaWYgKGsgPT09ICdwcmludGFibGUnIHx8IGsgPT09ICdmYWxsYmFja1ByaW50YWJsZScpIGNvbnRpbnVlO1xuICAgICAgICAgIHBhcmFtc1trXSA9IHR5cGVvZiBhcmdzW2tdICE9PSAndW5kZWZpbmVkJyA/IGFyZ3Nba10gOiBwYXJhbXNba107XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGFyZ3VtZW50IHR5cGUhIEV4cGVjdGVkIFwic3RyaW5nXCIgb3IgXCJvYmplY3RcIiwgZ290ICcgKyBfdHlwZW9mKGFyZ3MpKTtcbiAgICB9IC8vIFZhbGlkYXRlIHByaW50YWJsZVxuXG5cbiAgICBpZiAoIXBhcmFtcy5wcmludGFibGUpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcmludGFibGUgaW5mb3JtYXRpb24uJyk7IC8vIFZhbGlkYXRlIHR5cGVcblxuICAgIGlmICghcGFyYW1zLnR5cGUgfHwgdHlwZW9mIHBhcmFtcy50eXBlICE9PSAnc3RyaW5nJyB8fCBwcmludFR5cGVzLmluZGV4T2YocGFyYW1zLnR5cGUudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHJpbnQgdHlwZS4gQXZhaWxhYmxlIHR5cGVzIGFyZTogcGRmLCBodG1sLCBpbWFnZSBhbmQganNvbi4nKTtcbiAgICB9IC8vIENoZWNrIGlmIHdlIGFyZSBzaG93aW5nIGEgZmVlZGJhY2sgbWVzc2FnZSB0byB0aGUgdXNlciAodXNlZnVsIGZvciBsYXJnZSBmaWxlcylcblxuXG4gICAgaWYgKHBhcmFtcy5zaG93TW9kYWwpIF9tb2RhbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5zaG93KHBhcmFtcyk7IC8vIENoZWNrIGZvciBhIHByaW50IHN0YXJ0IGhvb2sgZnVuY3Rpb25cblxuICAgIGlmIChwYXJhbXMub25Mb2FkaW5nU3RhcnQpIHBhcmFtcy5vbkxvYWRpbmdTdGFydCgpOyAvLyBUbyBwcmV2ZW50IGR1cGxpY2F0aW9uIGFuZCBpc3N1ZXMsIHJlbW92ZSBhbnkgdXNlZCBwcmludEZyYW1lIGZyb20gdGhlIERPTVxuXG4gICAgdmFyIHVzZWRGcmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtcy5mcmFtZUlkKTtcbiAgICBpZiAodXNlZEZyYW1lKSB1c2VkRnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh1c2VkRnJhbWUpOyAvLyBDcmVhdGUgYSBuZXcgaWZyYW1lIGZvciB0aGUgcHJpbnQgam9iXG5cbiAgICB2YXIgcHJpbnRGcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuXG4gICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzRmlyZWZveCgpKSB7XG4gICAgICAvLyBTZXQgdGhlIGlmcmFtZSB0byBiZSBpcyB2aXNpYmxlIG9uIHRoZSBwYWdlIChndWFyYW50ZWVkIGJ5IGZpeGVkIHBvc2l0aW9uKSBidXQgaGlkZGVuIHVzaW5nIG9wYWNpdHkgMCwgYmVjYXVzZVxuICAgICAgLy8gdGhpcyB3b3JrcyBpbiBGaXJlZm94LiBUaGUgaGVpZ2h0IG5lZWRzIHRvIGJlIHN1ZmZpY2llbnQgZm9yIHNvbWUgcGFydCBvZiB0aGUgZG9jdW1lbnQgb3RoZXIgdGhhbiB0aGUgUERGXG4gICAgICAvLyB2aWV3ZXIncyB0b29sYmFyIHRvIGJlIHZpc2libGUgaW4gdGhlIHBhZ2VcbiAgICAgIHByaW50RnJhbWUuc2V0QXR0cmlidXRlKCdzdHlsZScsICd3aWR0aDogMXB4OyBoZWlnaHQ6IDEwMHB4OyBwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IDA7IHRvcDogMDsgb3BhY2l0eTogMDsgYm9yZGVyLXdpZHRoOiAwOyBtYXJnaW46IDA7IHBhZGRpbmc6IDAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGlkZSB0aGUgaWZyYW1lIGluIG90aGVyIGJyb3dzZXJzXG4gICAgICBwcmludEZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAndmlzaWJpbGl0eTogaGlkZGVuOyBoZWlnaHQ6IDA7IHdpZHRoOiAwOyBwb3NpdGlvbjogYWJzb2x1dGU7IGJvcmRlcjogMCcpO1xuICAgIH0gLy8gU2V0IGlmcmFtZSBlbGVtZW50IGlkXG5cblxuICAgIHByaW50RnJhbWUuc2V0QXR0cmlidXRlKCdpZCcsIHBhcmFtcy5mcmFtZUlkKTsgLy8gRm9yIG5vbiBwZGYgcHJpbnRpbmcsIHBhc3MgYW4gaHRtbCBkb2N1bWVudCBzdHJpbmcgdG8gc3JjZG9jIChmb3JjZSBvbmxvYWQgY2FsbGJhY2spXG5cbiAgICBpZiAocGFyYW1zLnR5cGUgIT09ICdwZGYnKSB7XG4gICAgICBwcmludEZyYW1lLnNyY2RvYyA9ICc8aHRtbD48aGVhZD48dGl0bGU+JyArIHBhcmFtcy5kb2N1bWVudFRpdGxlICsgJzwvdGl0bGU+JzsgLy8gQXR0YWNoIGNzcyBmaWxlc1xuXG4gICAgICBpZiAocGFyYW1zLmNzcykge1xuICAgICAgICAvLyBBZGQgc3VwcG9ydCBmb3Igc2luZ2xlIGZpbGVcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5jc3MpKSBwYXJhbXMuY3NzID0gW3BhcmFtcy5jc3NdOyAvLyBDcmVhdGUgbGluayB0YWdzIGZvciBlYWNoIGNzcyBmaWxlXG5cbiAgICAgICAgcGFyYW1zLmNzcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgcHJpbnRGcmFtZS5zcmNkb2MgKz0gJzxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiJyArIGZpbGUgKyAnXCI+JztcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHByaW50RnJhbWUuc3JjZG9jICs9ICc8L2hlYWQ+PGJvZHk+PC9ib2R5PjwvaHRtbD4nO1xuICAgIH0gLy8gQ2hlY2sgcHJpbnRhYmxlIHR5cGVcblxuXG4gICAgc3dpdGNoIChwYXJhbXMudHlwZSkge1xuICAgICAgY2FzZSAncGRmJzpcbiAgICAgICAgLy8gQ2hlY2sgYnJvd3NlciBzdXBwb3J0IGZvciBwZGYgYW5kIGlmIG5vdCBzdXBwb3J0ZWQgd2Ugd2lsbCBqdXN0IG9wZW4gdGhlIHBkZiBmaWxlIGluc3RlYWRcbiAgICAgICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzSUUoKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oJ1ByaW50LmpzIGRvZXNuXFwndCBzdXBwb3J0IFBERiBwcmludGluZyBpbiBJbnRlcm5ldCBFeHBsb3Jlci4nKTtcbiAgICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3cub3BlbihwYXJhbXMuZmFsbGJhY2tQcmludGFibGUsICdfYmxhbmsnKTtcbiAgICAgICAgICAgIHdpbi5mb2N1cygpO1xuICAgICAgICAgICAgcGFyYW1zLm9uSW5jb21wYXRpYmxlQnJvd3NlcigpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBwYXJhbXMub25FcnJvcihlcnJvcik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBsb2FkaW5nIG1vZGFsIG9wZW5lZFxuICAgICAgICAgICAgaWYgKHBhcmFtcy5zaG93TW9kYWwpIF9tb2RhbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5jbG9zZSgpO1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5vbkxvYWRpbmdFbmQpIHBhcmFtcy5vbkxvYWRpbmdFbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3BkZl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fW1wiZGVmYXVsdFwiXS5wcmludChwYXJhbXMsIHByaW50RnJhbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgX2ltYWdlX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X19bXCJkZWZhdWx0XCJdLnByaW50KHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgX2h0bWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX1tcImRlZmF1bHRcIl0ucHJpbnQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3Jhdy1odG1sJzpcbiAgICAgICAgX3Jhd19odG1sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X19bXCJkZWZhdWx0XCJdLnByaW50KHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgX2pzb25fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfX1tcImRlZmF1bHRcIl0ucHJpbnQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvanNvbi5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL2pzb24uanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZnVuY3Rpb25zICovIFwiLi9zcmMvanMvZnVuY3Rpb25zLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9wcmludCAqLyBcIi4vc3JjL2pzL3ByaW50LmpzXCIpO1xuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9ICh7XG4gIHByaW50OiBmdW5jdGlvbiBwcmludChwYXJhbXMsIHByaW50RnJhbWUpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSByZWNlaXZlZCBwcm9wZXIgZGF0YVxuICAgIGlmIChfdHlwZW9mKHBhcmFtcy5wcmludGFibGUpICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGphdmFzY3JpcHQgZGF0YSBvYmplY3QgKEpTT04pLicpO1xuICAgIH0gLy8gVmFsaWRhdGUgcmVwZWF0VGFibGVIZWFkZXJcblxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucmVwZWF0VGFibGVIZWFkZXIgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciByZXBlYXRUYWJsZUhlYWRlciBhdHRyaWJ1dGUgKEpTT04pLicpO1xuICAgIH0gLy8gVmFsaWRhdGUgcHJvcGVydGllc1xuXG5cbiAgICBpZiAoIXBhcmFtcy5wcm9wZXJ0aWVzIHx8ICFBcnJheS5pc0FycmF5KHBhcmFtcy5wcm9wZXJ0aWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByb3BlcnRpZXMgYXJyYXkgZm9yIHlvdXIgSlNPTiBkYXRhLicpO1xuICAgIH0gLy8gV2Ugd2lsbCBmb3JtYXQgdGhlIHByb3BlcnR5IG9iamVjdHMgdG8ga2VlcCB0aGUgSlNPTiBhcGkgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHJlbGVhc2VzXG5cblxuICAgIHBhcmFtcy5wcm9wZXJ0aWVzID0gcGFyYW1zLnByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmllbGQ6IF90eXBlb2YocHJvcGVydHkpID09PSAnb2JqZWN0JyA/IHByb3BlcnR5LmZpZWxkIDogcHJvcGVydHksXG4gICAgICAgIGRpc3BsYXlOYW1lOiBfdHlwZW9mKHByb3BlcnR5KSA9PT0gJ29iamVjdCcgPyBwcm9wZXJ0eS5kaXNwbGF5TmFtZSA6IHByb3BlcnR5LFxuICAgICAgICBjb2x1bW5TaXplOiBfdHlwZW9mKHByb3BlcnR5KSA9PT0gJ29iamVjdCcgJiYgcHJvcGVydHkuY29sdW1uU2l6ZSA/IHByb3BlcnR5LmNvbHVtblNpemUgKyAnOycgOiAxMDAgLyBwYXJhbXMucHJvcGVydGllcy5sZW5ndGggKyAnJTsnXG4gICAgICB9O1xuICAgIH0pOyAvLyBDcmVhdGUgYSBwcmludCBjb250YWluZXIgZWxlbWVudFxuXG4gICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgLy8gQ2hlY2sgaWYgd2UgYXJlIGFkZGluZyBhIHByaW50IGhlYWRlclxuXG4gICAgaWYgKHBhcmFtcy5oZWFkZXIpIHtcbiAgICAgIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJhZGRIZWFkZXJcIl0pKHBhcmFtcy5wcmludGFibGVFbGVtZW50LCBwYXJhbXMpO1xuICAgIH0gLy8gQnVpbGQgdGhlIHByaW50YWJsZSBodG1sIGRhdGFcblxuXG4gICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQuaW5uZXJIVE1MICs9IGpzb25Ub0hUTUwocGFyYW1zKTsgLy8gUHJpbnQgdGhlIGpzb24gZGF0YVxuXG4gICAgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLnNlbmQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGpzb25Ub0hUTUwocGFyYW1zKSB7XG4gIC8vIEdldCB0aGUgcm93IGFuZCBjb2x1bW4gZGF0YVxuICB2YXIgZGF0YSA9IHBhcmFtcy5wcmludGFibGU7XG4gIHZhciBwcm9wZXJ0aWVzID0gcGFyYW1zLnByb3BlcnRpZXM7IC8vIENyZWF0ZSBhIGh0bWwgdGFibGVcblxuICB2YXIgaHRtbERhdGEgPSAnPHRhYmxlIHN0eWxlPVwiYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgd2lkdGg6IDEwMCU7XCI+JzsgLy8gQ2hlY2sgaWYgdGhlIGhlYWRlciBzaG91bGQgYmUgcmVwZWF0ZWRcblxuICBpZiAocGFyYW1zLnJlcGVhdFRhYmxlSGVhZGVyKSB7XG4gICAgaHRtbERhdGEgKz0gJzx0aGVhZD4nO1xuICB9IC8vIEFkZCB0aGUgdGFibGUgaGVhZGVyIHJvd1xuXG5cbiAgaHRtbERhdGEgKz0gJzx0cj4nOyAvLyBBZGQgdGhlIHRhYmxlIGhlYWRlciBjb2x1bW5zXG5cbiAgZm9yICh2YXIgYSA9IDA7IGEgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgYSsrKSB7XG4gICAgaHRtbERhdGEgKz0gJzx0aCBzdHlsZT1cIndpZHRoOicgKyBwcm9wZXJ0aWVzW2FdLmNvbHVtblNpemUgKyAnOycgKyBwYXJhbXMuZ3JpZEhlYWRlclN0eWxlICsgJ1wiPicgKyBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiY2FwaXRhbGl6ZVByaW50XCJdKShwcm9wZXJ0aWVzW2FdLmRpc3BsYXlOYW1lKSArICc8L3RoPic7XG4gIH0gLy8gQWRkIHRoZSBjbG9zaW5nIHRhZyBmb3IgdGhlIHRhYmxlIGhlYWRlciByb3dcblxuXG4gIGh0bWxEYXRhICs9ICc8L3RyPic7IC8vIElmIHRoZSB0YWJsZSBoZWFkZXIgaXMgbWFya2VkIGFzIHJlcGVhdGVkLCBhZGQgdGhlIGNsb3NpbmcgdGFnXG5cbiAgaWYgKHBhcmFtcy5yZXBlYXRUYWJsZUhlYWRlcikge1xuICAgIGh0bWxEYXRhICs9ICc8L3RoZWFkPic7XG4gIH0gLy8gQ3JlYXRlIHRoZSB0YWJsZSBib2R5XG5cblxuICBodG1sRGF0YSArPSAnPHRib2R5Pic7IC8vIEFkZCB0aGUgdGFibGUgZGF0YSByb3dzXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gQWRkIHRoZSByb3cgc3RhcnRpbmcgdGFnXG4gICAgaHRtbERhdGEgKz0gJzx0cj4nOyAvLyBQcmludCBzZWxlY3RlZCBwcm9wZXJ0aWVzIG9ubHlcblxuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgcHJvcGVydGllcy5sZW5ndGg7IG4rKykge1xuICAgICAgdmFyIHN0cmluZ0RhdGEgPSBkYXRhW2ldOyAvLyBTdXBwb3J0IG5lc3RlZCBvYmplY3RzXG5cbiAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbbl0uZmllbGQuc3BsaXQoJy4nKTtcblxuICAgICAgaWYgKHByb3BlcnR5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBwcm9wZXJ0eS5sZW5ndGg7IHArKykge1xuICAgICAgICAgIHN0cmluZ0RhdGEgPSBzdHJpbmdEYXRhW3Byb3BlcnR5W3BdXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyaW5nRGF0YSA9IHN0cmluZ0RhdGFbcHJvcGVydGllc1tuXS5maWVsZF07XG4gICAgICB9IC8vIEFkZCB0aGUgcm93IGNvbnRlbnRzIGFuZCBzdHlsZXNcblxuXG4gICAgICBodG1sRGF0YSArPSAnPHRkIHN0eWxlPVwid2lkdGg6JyArIHByb3BlcnRpZXNbbl0uY29sdW1uU2l6ZSArIHBhcmFtcy5ncmlkU3R5bGUgKyAnXCI+JyArIHN0cmluZ0RhdGEgKyAnPC90ZD4nO1xuICAgIH0gLy8gQWRkIHRoZSByb3cgY2xvc2luZyB0YWdcblxuXG4gICAgaHRtbERhdGEgKz0gJzwvdHI+JztcbiAgfSAvLyBBZGQgdGhlIHRhYmxlIGFuZCBib2R5IGNsb3NpbmcgdGFnc1xuXG5cbiAgaHRtbERhdGEgKz0gJzwvdGJvZHk+PC90YWJsZT4nO1xuICByZXR1cm4gaHRtbERhdGE7XG59XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL21vZGFsLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL21vZGFsLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG52YXIgTW9kYWwgPSB7XG4gIHNob3c6IGZ1bmN0aW9uIHNob3cocGFyYW1zKSB7XG4gICAgLy8gQnVpbGQgbW9kYWxcbiAgICB2YXIgbW9kYWxTdHlsZSA9ICdmb250LWZhbWlseTpzYW5zLXNlcmlmOyAnICsgJ2Rpc3BsYXk6dGFibGU7ICcgKyAndGV4dC1hbGlnbjpjZW50ZXI7ICcgKyAnZm9udC13ZWlnaHQ6MzAwOyAnICsgJ2ZvbnQtc2l6ZTozMHB4OyAnICsgJ2xlZnQ6MDsgdG9wOjA7JyArICdwb3NpdGlvbjpmaXhlZDsgJyArICd6LWluZGV4OiA5OTkwOycgKyAnY29sb3I6ICMwNDYwQjU7ICcgKyAnd2lkdGg6IDEwMCU7ICcgKyAnaGVpZ2h0OiAxMDAlOyAnICsgJ2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSk7JyArICd0cmFuc2l0aW9uOiBvcGFjaXR5IC4zcyBlYXNlOyc7IC8vIENyZWF0ZSB3cmFwcGVyXG5cbiAgICB2YXIgcHJpbnRNb2RhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHByaW50TW9kYWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIG1vZGFsU3R5bGUpO1xuICAgIHByaW50TW9kYWwuc2V0QXR0cmlidXRlKCdpZCcsICdwcmludEpTLU1vZGFsJyk7IC8vIENyZWF0ZSBjb250ZW50IGRpdlxuXG4gICAgdmFyIGNvbnRlbnREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50RGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTp0YWJsZS1jZWxsOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IHBhZGRpbmctYm90dG9tOjEwMHB4OycpOyAvLyBBZGQgY2xvc2UgYnV0dG9uIChyZXF1aXJlcyBwcmludC5jc3MpXG5cbiAgICB2YXIgY2xvc2VCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjbG9zZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3ByaW50Q2xvc2UnKTtcbiAgICBjbG9zZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3ByaW50Q2xvc2UnKTtcbiAgICBjb250ZW50RGl2LmFwcGVuZENoaWxkKGNsb3NlQnV0dG9uKTsgLy8gQWRkIHNwaW5uZXIgKHJlcXVpcmVzIHByaW50LmNzcylcblxuICAgIHZhciBzcGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHNwaW5uZXIuc2V0QXR0cmlidXRlKCdjbGFzcycsICdwcmludFNwaW5uZXInKTtcbiAgICBjb250ZW50RGl2LmFwcGVuZENoaWxkKHNwaW5uZXIpOyAvLyBBZGQgbWVzc2FnZVxuXG4gICAgdmFyIG1lc3NhZ2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFyYW1zLm1vZGFsTWVzc2FnZSk7XG4gICAgY29udGVudERpdi5hcHBlbmRDaGlsZChtZXNzYWdlTm9kZSk7IC8vIEFkZCBjb250ZW50RGl2IHRvIHByaW50TW9kYWxcblxuICAgIHByaW50TW9kYWwuYXBwZW5kQ2hpbGQoY29udGVudERpdik7IC8vIEFwcGVuZCBwcmludCBtb2RhbCBlbGVtZW50IHRvIGRvY3VtZW50IGJvZHlcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0uYXBwZW5kQ2hpbGQocHJpbnRNb2RhbCk7IC8vIEFkZCBldmVudCBsaXN0ZW5lciB0byBjbG9zZSBidXR0b25cblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmludENsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICBNb2RhbC5jbG9zZSgpO1xuICAgIH0pO1xuICB9LFxuICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgdmFyIHByaW50TW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpbnRKUy1Nb2RhbCcpO1xuXG4gICAgaWYgKHByaW50TW9kYWwpIHtcbiAgICAgIHByaW50TW9kYWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwcmludE1vZGFsKTtcbiAgICB9XG4gIH1cbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKE1vZGFsKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvcGRmLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9wZGYuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3ByaW50ICovIFwiLi9zcmMvanMvcHJpbnQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9mdW5jdGlvbnMgKi8gXCIuL3NyYy9qcy9mdW5jdGlvbnMuanNcIik7XG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9ICh7XG4gIHByaW50OiBmdW5jdGlvbiBwcmludChwYXJhbXMsIHByaW50RnJhbWUpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGJhc2U2NCBkYXRhXG4gICAgaWYgKHBhcmFtcy5iYXNlNjQpIHtcbiAgICAgIHZhciBieXRlc0FycmF5ID0gVWludDhBcnJheS5mcm9tKGF0b2IocGFyYW1zLnByaW50YWJsZSksIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjLmNoYXJDb2RlQXQoMCk7XG4gICAgICB9KTtcbiAgICAgIGNyZWF0ZUJsb2JBbmRQcmludChwYXJhbXMsIHByaW50RnJhbWUsIGJ5dGVzQXJyYXkpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRm9ybWF0IHBkZiB1cmxcblxuXG4gICAgcGFyYW1zLnByaW50YWJsZSA9IC9eKGJsb2J8aHR0cHxcXC9cXC8pL2kudGVzdChwYXJhbXMucHJpbnRhYmxlKSA/IHBhcmFtcy5wcmludGFibGUgOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgKHBhcmFtcy5wcmludGFibGUuY2hhckF0KDApICE9PSAnLycgPyAnLycgKyBwYXJhbXMucHJpbnRhYmxlIDogcGFyYW1zLnByaW50YWJsZSk7IC8vIEdldCB0aGUgZmlsZSB0aHJvdWdoIGEgaHR0cCByZXF1ZXN0IChQcmVsb2FkKVxuXG4gICAgdmFyIHJlcSA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcbiAgICByZXEucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICByZXEuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiY2xlYW5VcFwiXSkocGFyYW1zKTtcbiAgICAgIHBhcmFtcy5vbkVycm9yKHJlcS5zdGF0dXNUZXh0LCByZXEpOyAvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGEgcGRmIGRvY3VtZW50IGF2YWlsYWJsZSwgd2Ugd2lsbCBzdG9wIHRoZSBwcmludCBqb2JcbiAgICB9KTtcbiAgICByZXEuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIENoZWNrIGZvciBlcnJvcnNcbiAgICAgIGlmIChbMjAwLCAyMDFdLmluZGV4T2YocmVxLnN0YXR1cykgPT09IC0xKSB7XG4gICAgICAgIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJjbGVhblVwXCJdKShwYXJhbXMpO1xuICAgICAgICBwYXJhbXMub25FcnJvcihyZXEuc3RhdHVzVGV4dCwgcmVxKTsgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHBkZiBkb2N1bWVudCBhdmFpbGFibGUsIHdlIHdpbGwgc3RvcCB0aGUgcHJpbnQgam9iXG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBQcmludCByZXF1ZXN0ZWQgZG9jdW1lbnRcblxuXG4gICAgICBjcmVhdGVCbG9iQW5kUHJpbnQocGFyYW1zLCBwcmludEZyYW1lLCByZXEucmVzcG9uc2UpO1xuICAgIH0pO1xuICAgIHJlcS5vcGVuKCdHRVQnLCBwYXJhbXMucHJpbnRhYmxlLCB0cnVlKTtcbiAgICByZXEuc2VuZCgpO1xuICB9XG59KTtcblxuZnVuY3Rpb24gY3JlYXRlQmxvYkFuZFByaW50KHBhcmFtcywgcHJpbnRGcmFtZSwgZGF0YSkge1xuICAvLyBQYXNzIHJlc3BvbnNlIG9yIGJhc2U2NCBkYXRhIHRvIGEgYmxvYiBhbmQgY3JlYXRlIGEgbG9jYWwgb2JqZWN0IHVybFxuICB2YXIgbG9jYWxQZGYgPSBuZXcgd2luZG93LkJsb2IoW2RhdGFdLCB7XG4gICAgdHlwZTogJ2FwcGxpY2F0aW9uL3BkZidcbiAgfSk7XG4gIGxvY2FsUGRmID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobG9jYWxQZGYpOyAvLyBTZXQgaWZyYW1lIHNyYyB3aXRoIHBkZiBkb2N1bWVudCB1cmxcblxuICBwcmludEZyYW1lLnNldEF0dHJpYnV0ZSgnc3JjJywgbG9jYWxQZGYpO1xuICBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uc2VuZChwYXJhbXMsIHByaW50RnJhbWUpO1xufVxuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9wcmludC5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9wcmludC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Jyb3dzZXIgKi8gXCIuL3NyYy9qcy9icm93c2VyLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZnVuY3Rpb25zICovIFwiLi9zcmMvanMvZnVuY3Rpb25zLmpzXCIpO1xuXG5cbnZhciBQcmludCA9IHtcbiAgc2VuZDogZnVuY3Rpb24gc2VuZChwYXJhbXMsIHByaW50RnJhbWUpIHtcbiAgICAvLyBBcHBlbmQgaWZyYW1lIGVsZW1lbnQgdG8gZG9jdW1lbnQgYm9keVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0uYXBwZW5kQ2hpbGQocHJpbnRGcmFtZSk7IC8vIEdldCBpZnJhbWUgZWxlbWVudFxuXG4gICAgdmFyIGlmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJhbXMuZnJhbWVJZCk7IC8vIFdhaXQgZm9yIGlmcmFtZSB0byBsb2FkIGFsbCBjb250ZW50XG5cbiAgICBpZnJhbWVFbGVtZW50Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ3BkZicpIHtcbiAgICAgICAgLy8gQWRkIGEgZGVsYXkgZm9yIEZpcmVmb3guIEluIG15IHRlc3RzLCAxMDAwbXMgd2FzIHN1ZmZpY2llbnQgYnV0IDEwMG1zIHdhcyBub3RcbiAgICAgICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzRmlyZWZveCgpKSB7XG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcGVyZm9ybVByaW50KGlmcmFtZUVsZW1lbnQsIHBhcmFtcyk7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVyZm9ybVByaW50KGlmcmFtZUVsZW1lbnQsIHBhcmFtcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIEdldCBpZnJhbWUgZWxlbWVudCBkb2N1bWVudFxuXG5cbiAgICAgIHZhciBwcmludERvY3VtZW50ID0gaWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93IHx8IGlmcmFtZUVsZW1lbnQuY29udGVudERvY3VtZW50O1xuICAgICAgaWYgKHByaW50RG9jdW1lbnQuZG9jdW1lbnQpIHByaW50RG9jdW1lbnQgPSBwcmludERvY3VtZW50LmRvY3VtZW50OyAvLyBBcHBlbmQgcHJpbnRhYmxlIGVsZW1lbnQgdG8gdGhlIGlmcmFtZSBib2R5XG5cbiAgICAgIHByaW50RG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwYXJhbXMucHJpbnRhYmxlRWxlbWVudCk7IC8vIEFkZCBjdXN0b20gc3R5bGVcblxuICAgICAgaWYgKHBhcmFtcy50eXBlICE9PSAncGRmJyAmJiBwYXJhbXMuc3R5bGUpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHN0eWxlIGVsZW1lbnRcbiAgICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gcGFyYW1zLnN0eWxlOyAvLyBBcHBlbmQgc3R5bGUgZWxlbWVudCB0byBpZnJhbWUncyBoZWFkXG5cbiAgICAgICAgcHJpbnREb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgIH0gLy8gSWYgcHJpbnRpbmcgaW1hZ2VzLCB3YWl0IGZvciB0aGVtIHRvIGxvYWQgaW5zaWRlIHRoZSBpZnJhbWVcblxuXG4gICAgICB2YXIgaW1hZ2VzID0gcHJpbnREb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XG5cbiAgICAgIGlmIChpbWFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2FkSWZyYW1lSW1hZ2VzKEFycmF5LmZyb20oaW1hZ2VzKSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcmZvcm1QcmludChpZnJhbWVFbGVtZW50LCBwYXJhbXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlcmZvcm1QcmludChpZnJhbWVFbGVtZW50LCBwYXJhbXMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHBlcmZvcm1QcmludChpZnJhbWVFbGVtZW50LCBwYXJhbXMpIHtcbiAgdHJ5IHtcbiAgICBpZnJhbWVFbGVtZW50LmZvY3VzKCk7IC8vIElmIEVkZ2Ugb3IgSUUsIHRyeSBjYXRjaCB3aXRoIGV4ZWNDb21tYW5kXG5cbiAgICBpZiAoX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uaXNFZGdlKCkgfHwgX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uaXNJRSgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ3ByaW50JywgZmFsc2UsIG51bGwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cucHJpbnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXIgYnJvd3NlcnNcbiAgICAgIGlmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5wcmludCgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwYXJhbXMub25FcnJvcihlcnJvcik7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmlzRmlyZWZveCgpKSB7XG4gICAgICAvLyBNb3ZlIHRoZSBpZnJhbWUgZWxlbWVudCBvZmYtc2NyZWVuIGFuZCBtYWtlIGl0IGludmlzaWJsZVxuICAgICAgaWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICBpZnJhbWVFbGVtZW50LnN0eWxlLmxlZnQgPSAnLTFweCc7XG4gICAgfVxuXG4gICAgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImNsZWFuVXBcIl0pKHBhcmFtcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9hZElmcmFtZUltYWdlcyhpbWFnZXMpIHtcbiAgdmFyIHByb21pc2VzID0gaW1hZ2VzLm1hcChmdW5jdGlvbiAoaW1hZ2UpIHtcbiAgICBpZiAoaW1hZ2Uuc3JjICYmIGltYWdlLnNyYyAhPT0gd2luZG93LmxvY2F0aW9uLmhyZWYpIHtcbiAgICAgIHJldHVybiBsb2FkSWZyYW1lSW1hZ2UoaW1hZ2UpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59XG5cbmZ1bmN0aW9uIGxvYWRJZnJhbWVJbWFnZShpbWFnZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICB2YXIgcG9sbEltYWdlID0gZnVuY3Rpb24gcG9sbEltYWdlKCkge1xuICAgICAgIWltYWdlIHx8IHR5cGVvZiBpbWFnZS5uYXR1cmFsV2lkdGggPT09ICd1bmRlZmluZWQnIHx8IGltYWdlLm5hdHVyYWxXaWR0aCA9PT0gMCB8fCAhaW1hZ2UuY29tcGxldGUgPyBzZXRUaW1lb3V0KHBvbGxJbWFnZSwgNTAwKSA6IHJlc29sdmUoKTtcbiAgICB9O1xuXG4gICAgcG9sbEltYWdlKCk7XG4gIH0pO1xufVxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKFByaW50KTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvcmF3LWh0bWwuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvcmF3LWh0bWwuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJpbnQgKi8gXCIuL3NyYy9qcy9wcmludC5qc1wiKTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9ICh7XG4gIHByaW50OiBmdW5jdGlvbiBwcmludChwYXJhbXMsIHByaW50RnJhbWUpIHtcbiAgICAvLyBDcmVhdGUgcHJpbnRhYmxlIGVsZW1lbnQgKGNvbnRhaW5lcilcbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6MTAwJScpOyAvLyBTZXQgb3VyIHJhdyBodG1sIGFzIHRoZSBwcmludGFibGUgZWxlbWVudCBpbm5lciBodG1sIGNvbnRlbnRcblxuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50LmlubmVySFRNTCA9IHBhcmFtcy5wcmludGFibGU7IC8vIFByaW50IGh0bWwgY29udGVudHNcblxuICAgIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5zZW5kKHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gIH1cbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9zYXNzL2luZGV4LnNjc3NcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL3Nhc3MvaW5kZXguc2NzcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5cbi8qKiovIH0pLFxuXG4vKioqLyAwOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiBtdWx0aSAuL3NyYy9pbmRleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vc3JjL2luZGV4LmpzICovXCIuL3NyYy9pbmRleC5qc1wiKTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyB9KVtcImRlZmF1bHRcIl07XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByaW50Lm1hcCIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB2YXIgaGFzID0gcmVxdWlyZSgnLi9saWIvaGFzJyk7XG5cbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHsgLyoqLyB9XG4gIH07XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGdldFN0YWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKFxuICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgICAgICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICtcbiAgICAgICAgICAgICAgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciAmJiAhKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJyArXG4gICAgICAgICAgICBsb2NhdGlvbiArICcgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICcgKyB0eXBlb2YgZXJyb3IgKyAnLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgKHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldHMgd2FybmluZyBjYWNoZSB3aGVuIHRlc3RpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUHJvcFR5cGVzO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9saWIvaGFzJyk7XG52YXIgY2hlY2tQcm9wVHlwZXMgPSByZXF1aXJlKCcuL2NoZWNrUHJvcFR5cGVzJyk7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfTtcbn1cblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgLyogZ2xvYmFsIFN5bWJvbCAqL1xuICB2YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG4gIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuXG4gICAqXG4gICAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBhcyBjb250ZXh0OlxuICAgKlxuICAgKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICAgKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpO1xuICAgKiAgICAgICAuLi5cbiAgICogICAgIH1cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gICAqIEByZXR1cm4gez9mdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gbWF5YmVJdGVyYWJsZSAmJiAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBtZXRob2RzIHRoYXQgYWxsb3cgZGVjbGFyYXRpb24gYW5kIHZhbGlkYXRpb24gb2YgcHJvcHMgdGhhdCBhcmVcbiAgICogc3VwcGxpZWQgdG8gUmVhY3QgY29tcG9uZW50cy4gRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICB2YXIgUHJvcHMgPSByZXF1aXJlKCdSZWFjdFByb3BUeXBlcycpO1xuICAgKiAgIHZhciBNeUFydGljbGUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIHByb3AgbmFtZWQgXCJkZXNjcmlwdGlvblwiLlxuICAgKiAgICAgICBkZXNjcmlwdGlvbjogUHJvcHMuc3RyaW5nLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHJlcXVpcmVkIGVudW0gcHJvcCBuYW1lZCBcImNhdGVnb3J5XCIuXG4gICAqICAgICAgIGNhdGVnb3J5OiBQcm9wcy5vbmVPZihbJ05ld3MnLCdQaG90b3MnXSkuaXNSZXF1aXJlZCxcbiAgICpcbiAgICogICAgICAgLy8gQSBwcm9wIG5hbWVkIFwiZGlhbG9nXCIgdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBEaWFsb2cuXG4gICAqICAgICAgIGRpYWxvZzogUHJvcHMuaW5zdGFuY2VPZihEaWFsb2cpLmlzUmVxdWlyZWRcbiAgICogICAgIH0sXG4gICAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkgeyAuLi4gfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBBIG1vcmUgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZXNlIG1ldGhvZHMgYXJlIHVzZWQ6XG4gICAqXG4gICAqICAgdHlwZSA6PSBhcnJheXxib29sfGZ1bmN8b2JqZWN0fG51bWJlcnxzdHJpbmd8b25lT2YoWy4uLl0pfGluc3RhbmNlT2YoLi4uKVxuICAgKiAgIGRlY2wgOj0gUmVhY3RQcm9wVHlwZXMue3R5cGV9KC5pc1JlcXVpcmVkKT9cbiAgICpcbiAgICogRWFjaCBhbmQgZXZlcnkgZGVjbGFyYXRpb24gcHJvZHVjZXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gVGhpc1xuICAgKiBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICB2YXIgTXlMaW5rID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgb3IgVVJJIHByb3AgbmFtZWQgXCJocmVmXCIuXG4gICAqICAgICAgaHJlZjogZnVuY3Rpb24ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAqICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgKiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmXG4gICAqICAgICAgICAgICAgIShwcm9wVmFsdWUgaW5zdGFuY2VvZiBVUkkpKSB7XG4gICAqICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFuIFVSSSBmb3IgJyArIHByb3BOYW1lICsgJyBpbiAnICtcbiAgICogICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAqICAgICAgICAgICk7XG4gICAqICAgICAgICB9XG4gICAqICAgICAgfVxuICAgKiAgICB9LFxuICAgKiAgICByZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn1cbiAgICogIH0pO1xuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cbiAgdmFyIEFOT05ZTU9VUyA9ICc8PGFub255bW91cz4+JztcblxuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSxcbiAgICBiaWdpbnQ6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdiaWdpbnQnKSxcbiAgICBib29sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYm9vbGVhbicpLFxuICAgIGZ1bmM6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdmdW5jdGlvbicpLFxuICAgIG51bWJlcjogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLFxuICAgIG9iamVjdDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ29iamVjdCcpLFxuICAgIHN0cmluZzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N0cmluZycpLFxuICAgIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5bWJvbCcpLFxuXG4gICAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLFxuICAgIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcixcbiAgICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSxcbiAgICBlbGVtZW50VHlwZTogY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpLFxuICAgIGluc3RhbmNlT2Y6IGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIsXG4gICAgbm9kZTogY3JlYXRlTm9kZUNoZWNrZXIoKSxcbiAgICBvYmplY3RPZjogY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcixcbiAgICBvbmVPZjogY3JlYXRlRW51bVR5cGVDaGVja2VyLFxuICAgIG9uZU9mVHlwZTogY3JlYXRlVW5pb25UeXBlQ2hlY2tlcixcbiAgICBzaGFwZTogY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcixcbiAgICBleGFjdDogY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcixcbiAgfTtcblxuICAvKipcbiAgICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAgICovXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi9cbiAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgICB9XG4gIH1cbiAgLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovXG5cbiAgLyoqXG4gICAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGxcbiAgICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZlciwgd2UgZG9uJ3QgdXNlIHJlYWxcbiAgICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbVxuICAgKiBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSBpZiB0aGV5IGFyZSBjcmVhdGVkIHRvbyBvZnRlbiwgc3VjaCBhcyB3aGF0XG4gICAqIGhhcHBlbnMgaW4gb25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC5cbiAgICovXG4gIGZ1bmN0aW9uIFByb3BUeXBlRXJyb3IobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5kYXRhID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhOiB7fTtcbiAgICB0aGlzLnN0YWNrID0gJyc7XG4gIH1cbiAgLy8gTWFrZSBgaW5zdGFuY2VvZiBFcnJvcmAgc3RpbGwgd29yayBmb3IgcmV0dXJuZWQgZXJyb3JzLlxuICBQcm9wVHlwZUVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZTtcblxuICBmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUgPSB7fTtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA9IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgcHJvcEZ1bGxOYW1lID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgICBpZiAoc2VjcmV0ICE9PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgICBpZiAodGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAgICAgICAgIC8vIE5ldyBiZWhhdmlvciBvbmx5IGZvciB1c2VycyBvZiBgcHJvcC10eXBlc2AgcGFja2FnZVxuICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAnVXNlIGBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKWAgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gT2xkIGJlaGF2aW9yIGZvciBwZW9wbGUgdXNpbmcgUmVhY3QuUHJvcFR5cGVzXG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gY29tcG9uZW50TmFtZSArICc6JyArIHByb3BOYW1lO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gJiZcbiAgICAgICAgICAgIC8vIEF2b2lkIHNwYW1taW5nIHRoZSBjb25zb2xlIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gbm90IGFjdGlvbmFibGUgZXhjZXB0IGZvciBsaWIgYXV0aG9yc1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPCAzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAgICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMgdmFsaWRhdGlvbiAnICtcbiAgICAgICAgICAgICAgJ2Z1bmN0aW9uIGZvciB0aGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBwcm9wIG9uIGAnICsgY29tcG9uZW50TmFtZSArICdgLiBUaGlzIGlzIGRlcHJlY2F0ZWQgJyArXG4gICAgICAgICAgICAgICdhbmQgd2lsbCB0aHJvdyBpbiB0aGUgc3RhbmRhbG9uZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAgICdZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIGEgdGhpcmQtcGFydHkgUHJvcFR5cGVzICcgK1xuICAgICAgICAgICAgICAnbGlicmFyeS4gU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1kb250LWNhbGwtcHJvcHR5cGVzICcgKyAnZm9yIGRldGFpbHMuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSA9IHRydWU7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAnICsgKCdpbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgbnVsbGAuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICAgIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRydWUpO1xuXG4gICAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICAvLyBgcHJvcFZhbHVlYCBiZWluZyBpbnN0YW5jZSBvZiwgc2F5LCBkYXRlL3JlZ2V4cCwgcGFzcyB0aGUgJ29iamVjdCdcbiAgICAgICAgLy8gY2hlY2ssIGJ1dCB3ZSBjYW4gb2ZmZXIgYSBtb3JlIHByZWNpc2UgZXJyb3IgbWVzc2FnZSBoZXJlIHJhdGhlciB0aGFuXG4gICAgICAgIC8vICdvZiB0eXBlIGBvYmplY3RgJy5cbiAgICAgICAgdmFyIHByZWNpc2VUeXBlID0gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcmVjaXNlVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnYCcgKyBleHBlY3RlZFR5cGUgKyAnYC4nKSxcbiAgICAgICAgICB7ZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGV9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGFycmF5LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwgaSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICdbJyArIGkgKyAnXScsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghUmVhY3RJcy5pc1ZhbGlkRWxlbWVudFR5cGUocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQgdHlwZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gYXJyYXksIGdvdCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLiAnICtcbiAgICAgICAgICAgICdBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHdyaXRlIG9uZU9mKHgsIHksIHopIGluc3RlYWQgb2Ygb25lT2YoW3gsIHksIHpdKS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpcyhwcm9wVmFsdWUsIGV4cGVjdGVkVmFsdWVzW2ldKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZFZhbHVlcywgZnVuY3Rpb24gcmVwbGFjZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgU3RyaW5nKHByb3BWYWx1ZSkgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgICAgaWYgKGhhcyhwcm9wVmFsdWUsIGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZS4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgY2hlY2sgZnVuY3Rpb25zLCBidXQgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkICcgKyBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcoY2hlY2tlcikgKyAnIGF0IGluZGV4ICcgKyBpICsgJy4nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICAgIHZhciBjaGVja2VyUmVzdWx0ID0gY2hlY2tlcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGNoZWNrZXJSZXN1bHQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja2VyUmVzdWx0LmRhdGEgJiYgaGFzKGNoZWNrZXJSZXN1bHQuZGF0YSwgJ2V4cGVjdGVkVHlwZScpKSB7XG4gICAgICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGNoZWNrZXJSZXN1bHQuZGF0YS5leHBlY3RlZFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgZXhwZWN0ZWRUeXBlc01lc3NhZ2UgPSAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPiAwKSA/ICcsIGV4cGVjdGVkIG9uZSBvZiB0eXBlIFsnICsgZXhwZWN0ZWRUeXBlcy5qb2luKCcsICcpICsgJ10nOiAnJztcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AnICsgZXhwZWN0ZWRUeXBlc01lc3NhZ2UgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludmFsaWRWYWxpZGF0b3JFcnJvcihjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBrZXksIHR5cGUpIHtcbiAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHByb3BGdWxsTmFtZSArICcuJyArIGtleSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZSArICdgLidcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBpbnZhbGlkVmFsaWRhdG9yRXJyb3IoY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwga2V5LCBnZXRQcmVjaXNlVHlwZShjaGVja2VyKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBhbGwga2V5cyBpbiBjYXNlIHNvbWUgYXJlIHJlcXVpcmVkIGJ1dCBtaXNzaW5nIGZyb20gcHJvcHMuXG4gICAgICB2YXIgYWxsS2V5cyA9IGFzc2lnbih7fSwgcHJvcHNbcHJvcE5hbWVdLCBzaGFwZVR5cGVzKTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhbGxLZXlzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoaGFzKHNoYXBlVHlwZXMsIGtleSkgJiYgdHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFZhbGlkYXRvckVycm9yKGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIGtleSwgZ2V0UHJlY2lzZVR5cGUoY2hlY2tlcikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBrZXkgYCcgKyBrZXkgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nICtcbiAgICAgICAgICAgICdcXG5CYWQgb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkocHJvcHNbcHJvcE5hbWVdLCBudWxsLCAnICAnKSArXG4gICAgICAgICAgICAnXFxuVmFsaWQga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHNoYXBlVHlwZXMpLCBudWxsLCAnICAnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAhcHJvcFZhbHVlO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8IGlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuICAgICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50cnlbMV0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpIHtcbiAgICAvLyBOYXRpdmUgU3ltYm9sLlxuICAgIGlmIChwcm9wVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGZhbHN5IHZhbHVlIGNhbid0IGJlIGEgU3ltYm9sXG4gICAgaWYgKCFwcm9wVmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJ1xuICAgIGlmIChwcm9wVmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBub24tc3BlYyBjb21wbGlhbnQgU3ltYm9scyB3aGljaCBhcmUgcG9seWZpbGxlZC5cbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEVxdWl2YWxlbnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJlZ2V4cC5cbiAgZnVuY3Rpb24gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKSB7XG4gICAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9XG4gICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgLy8gT2xkIHdlYmtpdHMgKGF0IGxlYXN0IHVudGlsIEFuZHJvaWQgNC4wKSByZXR1cm4gJ2Z1bmN0aW9uJyByYXRoZXIgdGhhblxuICAgICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgICAvLyBwYXNzZXMgUHJvcFR5cGVzLm9iamVjdC5cbiAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgLy8gU2VlIGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuXG4gIGZ1bmN0aW9uIGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyB8fCBwcm9wVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJyArIHByb3BWYWx1ZTtcbiAgICB9XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgfSBlbHNlIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuICdyZWdleHAnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcG9zdGZpeGVkIHRvIGEgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIHR5cGUuXG4gIC8vIEZvciBleGFtcGxlLCBcInVuZGVmaW5lZFwiIG9yIFwib2YgdHlwZSBhcnJheVwiXG4gIGZ1bmN0aW9uIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcmV0dXJuICdhbiAnICsgdHlwZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICdyZWdleHAnOlxuICAgICAgICByZXR1cm4gJ2EgJyArIHR5cGU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCwgaWYgYW55LlxuICBmdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7XG4gICAgaWYgKCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICByZXR1cm4gQU5PTllNT1VTO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGNoZWNrUHJvcFR5cGVzO1xuICBSZWFjdFByb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGNoZWNrUHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlO1xuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGZsdXNoU3luYyB9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBSZXNpemVyIH0gZnJvbSAnLi9yZXNpemVyJztcbnZhciBERUZBVUxUX1NJWkUgPSB7XG4gICAgd2lkdGg6ICdhdXRvJyxcbiAgICBoZWlnaHQ6ICdhdXRvJyxcbn07XG52YXIgY2xhbXAgPSBmdW5jdGlvbiAobiwgbWluLCBtYXgpIHsgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKG4sIG1heCksIG1pbik7IH07XG52YXIgc25hcCA9IGZ1bmN0aW9uIChuLCBzaXplKSB7IHJldHVybiBNYXRoLnJvdW5kKG4gLyBzaXplKSAqIHNpemU7IH07XG52YXIgaGFzRGlyZWN0aW9uID0gZnVuY3Rpb24gKGRpciwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoZGlyLCAnaScpLnRlc3QodGFyZ2V0KTtcbn07XG4vLyBJTkZPOiBJbiBjYXNlIG9mIHdpbmRvdyBpcyBhIFByb3h5IGFuZCBkb2VzIG5vdCBwb3J4eSBFdmVudHMgY29ycmVjdGx5LCB1c2UgaXNUb3VjaEV2ZW50ICYgaXNNb3VzZUV2ZW50IHRvIGRpc3Rpbmd1aXNoIGV2ZW50IHR5cGUgaW5zdGVhZCBvZiBgaW5zdGFuY2VvZmAuXG52YXIgaXNUb3VjaEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCk7XG59O1xudmFyIGlzTW91c2VFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBCb29sZWFuKChldmVudC5jbGllbnRYIHx8IGV2ZW50LmNsaWVudFggPT09IDApICYmXG4gICAgICAgIChldmVudC5jbGllbnRZIHx8IGV2ZW50LmNsaWVudFkgPT09IDApKTtcbn07XG52YXIgZmluZENsb3Nlc3RTbmFwID0gZnVuY3Rpb24gKG4sIHNuYXBBcnJheSwgc25hcEdhcCkge1xuICAgIGlmIChzbmFwR2FwID09PSB2b2lkIDApIHsgc25hcEdhcCA9IDA7IH1cbiAgICB2YXIgY2xvc2VzdEdhcEluZGV4ID0gc25hcEFycmF5LnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyciwgaW5kZXgpIHsgcmV0dXJuIChNYXRoLmFicyhjdXJyIC0gbikgPCBNYXRoLmFicyhzbmFwQXJyYXlbcHJldl0gLSBuKSA/IGluZGV4IDogcHJldik7IH0sIDApO1xuICAgIHZhciBnYXAgPSBNYXRoLmFicyhzbmFwQXJyYXlbY2xvc2VzdEdhcEluZGV4XSAtIG4pO1xuICAgIHJldHVybiBzbmFwR2FwID09PSAwIHx8IGdhcCA8IHNuYXBHYXAgPyBzbmFwQXJyYXlbY2xvc2VzdEdhcEluZGV4XSA6IG47XG59O1xudmFyIGdldFN0cmluZ1NpemUgPSBmdW5jdGlvbiAobikge1xuICAgIG4gPSBuLnRvU3RyaW5nKCk7XG4gICAgaWYgKG4gPT09ICdhdXRvJykge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgaWYgKG4uZW5kc1dpdGgoJ3B4JykpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChuLmVuZHNXaXRoKCclJykpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChuLmVuZHNXaXRoKCd2aCcpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAobi5lbmRzV2l0aCgndncnKSkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgaWYgKG4uZW5kc1dpdGgoJ3ZtYXgnKSkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgaWYgKG4uZW5kc1dpdGgoJ3ZtaW4nKSkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgcmV0dXJuIG4gKyBcInB4XCI7XG59O1xudmFyIGdldFBpeGVsU2l6ZSA9IGZ1bmN0aW9uIChzaXplLCBwYXJlbnRTaXplLCBpbm5lcldpZHRoLCBpbm5lckhlaWdodCkge1xuICAgIGlmIChzaXplICYmIHR5cGVvZiBzaXplID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoc2l6ZS5lbmRzV2l0aCgncHgnKSkge1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlcihzaXplLnJlcGxhY2UoJ3B4JywgJycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2l6ZS5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAgICAgICB2YXIgcmF0aW8gPSBOdW1iZXIoc2l6ZS5yZXBsYWNlKCclJywgJycpKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRTaXplICogcmF0aW87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUuZW5kc1dpdGgoJ3Z3JykpIHtcbiAgICAgICAgICAgIHZhciByYXRpbyA9IE51bWJlcihzaXplLnJlcGxhY2UoJ3Z3JywgJycpKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBpbm5lcldpZHRoICogcmF0aW87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUuZW5kc1dpdGgoJ3ZoJykpIHtcbiAgICAgICAgICAgIHZhciByYXRpbyA9IE51bWJlcihzaXplLnJlcGxhY2UoJ3ZoJywgJycpKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBpbm5lckhlaWdodCAqIHJhdGlvO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaXplO1xufTtcbnZhciBjYWxjdWxhdGVOZXdNYXggPSBmdW5jdGlvbiAocGFyZW50U2l6ZSwgaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQsIG1pbldpZHRoLCBtaW5IZWlnaHQpIHtcbiAgICBtYXhXaWR0aCA9IGdldFBpeGVsU2l6ZShtYXhXaWR0aCwgcGFyZW50U2l6ZS53aWR0aCwgaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQpO1xuICAgIG1heEhlaWdodCA9IGdldFBpeGVsU2l6ZShtYXhIZWlnaHQsIHBhcmVudFNpemUuaGVpZ2h0LCBpbm5lcldpZHRoLCBpbm5lckhlaWdodCk7XG4gICAgbWluV2lkdGggPSBnZXRQaXhlbFNpemUobWluV2lkdGgsIHBhcmVudFNpemUud2lkdGgsIGlubmVyV2lkdGgsIGlubmVySGVpZ2h0KTtcbiAgICBtaW5IZWlnaHQgPSBnZXRQaXhlbFNpemUobWluSGVpZ2h0LCBwYXJlbnRTaXplLmhlaWdodCwgaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG1heFdpZHRoOiB0eXBlb2YgbWF4V2lkdGggPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogTnVtYmVyKG1heFdpZHRoKSxcbiAgICAgICAgbWF4SGVpZ2h0OiB0eXBlb2YgbWF4SGVpZ2h0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE51bWJlcihtYXhIZWlnaHQpLFxuICAgICAgICBtaW5XaWR0aDogdHlwZW9mIG1pbldpZHRoID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE51bWJlcihtaW5XaWR0aCksXG4gICAgICAgIG1pbkhlaWdodDogdHlwZW9mIG1pbkhlaWdodCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBOdW1iZXIobWluSGVpZ2h0KSxcbiAgICB9O1xufTtcbi8qKlxuICogdHJhbnNmb3JtIFQgfCBbVCwgVF0gdG8gW1QsIFRdXG4gKiBAcGFyYW0gdmFsXG4gKiBAcmV0dXJuc1xuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbnZhciBub3JtYWxpemVUb1BhaXIgPSBmdW5jdGlvbiAodmFsKSB7IHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbCwgdmFsXSk7IH07XG52YXIgZGVmaW5lZFByb3BzID0gW1xuICAgICdhcycsXG4gICAgJ3JlZicsXG4gICAgJ3N0eWxlJyxcbiAgICAnY2xhc3NOYW1lJyxcbiAgICAnZ3JpZCcsXG4gICAgJ3NuYXAnLFxuICAgICdib3VuZHMnLFxuICAgICdib3VuZHNCeURpcmVjdGlvbicsXG4gICAgJ3NpemUnLFxuICAgICdkZWZhdWx0U2l6ZScsXG4gICAgJ21pbldpZHRoJyxcbiAgICAnbWluSGVpZ2h0JyxcbiAgICAnbWF4V2lkdGgnLFxuICAgICdtYXhIZWlnaHQnLFxuICAgICdsb2NrQXNwZWN0UmF0aW8nLFxuICAgICdsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoJyxcbiAgICAnbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQnLFxuICAgICdlbmFibGUnLFxuICAgICdoYW5kbGVTdHlsZXMnLFxuICAgICdoYW5kbGVDbGFzc2VzJyxcbiAgICAnaGFuZGxlV3JhcHBlclN0eWxlJyxcbiAgICAnaGFuZGxlV3JhcHBlckNsYXNzJyxcbiAgICAnY2hpbGRyZW4nLFxuICAgICdvblJlc2l6ZVN0YXJ0JyxcbiAgICAnb25SZXNpemUnLFxuICAgICdvblJlc2l6ZVN0b3AnLFxuICAgICdoYW5kbGVDb21wb25lbnQnLFxuICAgICdzY2FsZScsXG4gICAgJ3Jlc2l6ZVJhdGlvJyxcbiAgICAnc25hcEdhcCcsXG5dO1xuLy8gSEFDSzogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNhbGN1bGF0ZSAlIHNpemUuXG52YXIgYmFzZUNsYXNzTmFtZSA9ICdfX3Jlc2l6YWJsZV9iYXNlX18nO1xudmFyIFJlc2l6YWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVzaXphYmxlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlc2l6YWJsZShwcm9wcykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5yYXRpbyA9IDE7XG4gICAgICAgIF90aGlzLnJlc2l6YWJsZSA9IG51bGw7XG4gICAgICAgIC8vIEZvciBwYXJlbnQgYm91bmRhcnlcbiAgICAgICAgX3RoaXMucGFyZW50TGVmdCA9IDA7XG4gICAgICAgIF90aGlzLnBhcmVudFRvcCA9IDA7XG4gICAgICAgIC8vIEZvciBib3VuZGFyeVxuICAgICAgICBfdGhpcy5yZXNpemFibGVMZWZ0ID0gMDtcbiAgICAgICAgX3RoaXMucmVzaXphYmxlUmlnaHQgPSAwO1xuICAgICAgICBfdGhpcy5yZXNpemFibGVUb3AgPSAwO1xuICAgICAgICBfdGhpcy5yZXNpemFibGVCb3R0b20gPSAwO1xuICAgICAgICAvLyBGb3IgdGFyZ2V0IGJvdW5kYXJ5XG4gICAgICAgIF90aGlzLnRhcmdldExlZnQgPSAwO1xuICAgICAgICBfdGhpcy50YXJnZXRUb3AgPSAwO1xuICAgICAgICBfdGhpcy5hcHBlbmRCYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5yZXNpemFibGUgfHwgIV90aGlzLndpbmRvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHBhcmVudCA9IF90aGlzLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBfdGhpcy53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gJ3NjYWxlKDAsIDApJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZmxleCA9ICcwIDAgMTAwJSc7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoYmFzZUNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSArPSBiYXNlQ2xhc3NOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLnJlbW92ZUJhc2UgPSBmdW5jdGlvbiAoYmFzZSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IF90aGlzLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChiYXNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIHdpZHRoOiAoX2IgPSAoX2EgPSBfdGhpcy5wcm9wc1NpemUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS53aWR0aCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJ2F1dG8nLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSAoX2MgPSBfdGhpcy5wcm9wc1NpemUpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICdhdXRvJyxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJ3JpZ2h0JyxcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiYWNrZ3JvdW5kU3R5bGU6IHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwwLDAsMCknLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAgICAgekluZGV4OiA5OTk5LFxuICAgICAgICAgICAgICAgIHRvcDogJzAnLFxuICAgICAgICAgICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgICAgICAgICBib3R0b206ICcwJyxcbiAgICAgICAgICAgICAgICByaWdodDogJzAnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZsZXhCYXNpczogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5vblJlc2l6ZVN0YXJ0ID0gX3RoaXMub25SZXNpemVTdGFydC5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25Nb3VzZU1vdmUgPSBfdGhpcy5vbk1vdXNlTW92ZS5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25Nb3VzZVVwID0gX3RoaXMub25Nb3VzZVVwLmJpbmQoX3RoaXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNpemFibGUucHJvdG90eXBlLCBcInBhcmVudE5vZGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2l6YWJsZS5wYXJlbnROb2RlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlc2l6YWJsZS5wcm90b3R5cGUsIFwid2luZG93XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlLm93bmVyRG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2l6YWJsZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlc2l6YWJsZS5wcm90b3R5cGUsIFwicHJvcHNTaXplXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zaXplIHx8IHRoaXMucHJvcHMuZGVmYXVsdFNpemUgfHwgREVGQVVMVF9TSVpFO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlc2l6YWJsZS5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gMDtcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSAwO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzaXphYmxlICYmIHRoaXMud2luZG93KSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yZ1dpZHRoID0gdGhpcy5yZXNpemFibGUub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICAgICAgdmFyIG9yZ0hlaWdodCA9IHRoaXMucmVzaXphYmxlLm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICAvLyBIQUNLOiBTZXQgcG9zaXRpb24gYHJlbGF0aXZlYCB0byBnZXQgcGFyZW50IHNpemUuXG4gICAgICAgICAgICAgICAgLy8gICAgICAgVGhpcyBpcyBiZWNhdXNlIHdoZW4gcmUtcmVzaXphYmxlIHNldCBgYWJzb2x1dGVgLCBJIGNhbiBub3QgZ2V0IGJhc2Ugd2lkdGggY29ycmVjdGx5LlxuICAgICAgICAgICAgICAgIHZhciBvcmdQb3NpdGlvbiA9IHRoaXMucmVzaXphYmxlLnN0eWxlLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChvcmdQb3NpdGlvbiAhPT0gJ3JlbGF0aXZlJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6YWJsZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElORk86IFVzZSBvcmlnaW5hbCB3aWR0aCBvciBoZWlnaHQgaWYgc2V0IGF1dG8uXG4gICAgICAgICAgICAgICAgd2lkdGggPSB0aGlzLnJlc2l6YWJsZS5zdHlsZS53aWR0aCAhPT0gJ2F1dG8nID8gdGhpcy5yZXNpemFibGUub2Zmc2V0V2lkdGggOiBvcmdXaWR0aDtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSB0aGlzLnJlc2l6YWJsZS5zdHlsZS5oZWlnaHQgIT09ICdhdXRvJyA/IHRoaXMucmVzaXphYmxlLm9mZnNldEhlaWdodCA6IG9yZ0hlaWdodDtcbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemFibGUuc3R5bGUucG9zaXRpb24gPSBvcmdQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNpemFibGUucHJvdG90eXBlLCBcInNpemVTdHlsZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5wcm9wcy5zaXplO1xuICAgICAgICAgICAgdmFyIGdldFNpemUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgX3RoaXMuc3RhdGVba2V5XSA9PT0gJ3VuZGVmaW5lZCcgfHwgX3RoaXMuc3RhdGVba2V5XSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnYXV0byc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5wcm9wc1NpemUgJiYgX3RoaXMucHJvcHNTaXplW2tleV0gJiYgKChfYSA9IF90aGlzLnByb3BzU2l6ZVtrZXldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudG9TdHJpbmcoKS5lbmRzV2l0aCgnJScpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuc3RhdGVba2V5XS50b1N0cmluZygpLmVuZHNXaXRoKCclJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5zdGF0ZVtrZXldLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFNpemUgPSBfdGhpcy5nZXRQYXJlbnRTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IE51bWJlcihfdGhpcy5zdGF0ZVtrZXldLnRvU3RyaW5nKCkucmVwbGFjZSgncHgnLCAnJykpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGVyY2VudCA9ICh2YWx1ZSAvIHBhcmVudFNpemVba2V5XSkgKiAxMDA7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwZXJjZW50ICsgXCIlXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRTdHJpbmdTaXplKF90aGlzLnN0YXRlW2tleV0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHNpemUgJiYgdHlwZW9mIHNpemUud2lkdGggIT09ICd1bmRlZmluZWQnICYmICF0aGlzLnN0YXRlLmlzUmVzaXppbmdcbiAgICAgICAgICAgICAgICA/IGdldFN0cmluZ1NpemUoc2l6ZS53aWR0aClcbiAgICAgICAgICAgICAgICA6IGdldFNpemUoJ3dpZHRoJyk7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gc2l6ZSAmJiB0eXBlb2Ygc2l6ZS5oZWlnaHQgIT09ICd1bmRlZmluZWQnICYmICF0aGlzLnN0YXRlLmlzUmVzaXppbmdcbiAgICAgICAgICAgICAgICA/IGdldFN0cmluZ1NpemUoc2l6ZS5oZWlnaHQpXG4gICAgICAgICAgICAgICAgOiBnZXRTaXplKCdoZWlnaHQnKTtcbiAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuZ2V0UGFyZW50U2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyB3aWR0aDogdGhpcy53aW5kb3cuaW5uZXJXaWR0aCwgaGVpZ2h0OiB0aGlzLndpbmRvdy5pbm5lckhlaWdodCB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBiYXNlID0gdGhpcy5hcHBlbmRCYXNlKCk7XG4gICAgICAgIGlmICghYmFzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIElORk86IFRvIGNhbGN1bGF0ZSBwYXJlbnQgd2lkdGggd2l0aCBmbGV4IGxheW91dFxuICAgICAgICB2YXIgd3JhcENoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHdyYXAgPSB0aGlzLnBhcmVudE5vZGUuc3R5bGUuZmxleFdyYXA7XG4gICAgICAgIGlmICh3cmFwICE9PSAnd3JhcCcpIHtcbiAgICAgICAgICAgIHdyYXBDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5zdHlsZS5mbGV4V3JhcCA9ICd3cmFwJztcbiAgICAgICAgICAgIC8vIEhBQ0s6IFVzZSByZWxhdGl2ZSB0byBnZXQgcGFyZW50IHBhZGRpbmcgc2l6ZVxuICAgICAgICB9XG4gICAgICAgIGJhc2Uuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICBiYXNlLnN0eWxlLm1pbldpZHRoID0gJzEwMCUnO1xuICAgICAgICBiYXNlLnN0eWxlLm1pbkhlaWdodCA9ICcxMDAlJztcbiAgICAgICAgdmFyIHNpemUgPSB7XG4gICAgICAgICAgICB3aWR0aDogYmFzZS5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogYmFzZS5vZmZzZXRIZWlnaHQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh3cmFwQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlLnN0eWxlLmZsZXhXcmFwID0gd3JhcDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUJhc2UoYmFzZSk7XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5iaW5kRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlLCB7XG4gICAgICAgICAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUudW5iaW5kRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlIHx8ICF0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gdGhpcy53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnJlc2l6YWJsZSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMuc3RhdGUud2lkdGggfHwgdGhpcy5zaXplLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnN0YXRlLmhlaWdodCB8fCB0aGlzLnNpemUuaGVpZ2h0LFxuICAgICAgICAgICAgZmxleEJhc2lzOiBjb21wdXRlZFN0eWxlLmZsZXhCYXNpcyAhPT0gJ2F1dG8nID8gY29tcHV0ZWRTdHlsZS5mbGV4QmFzaXMgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMud2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmNyZWF0ZVNpemVGb3JDc3NQcm9wZXJ0eSA9IGZ1bmN0aW9uIChuZXdTaXplLCBraW5kKSB7XG4gICAgICAgIHZhciBwcm9wc1NpemUgPSB0aGlzLnByb3BzU2l6ZSAmJiB0aGlzLnByb3BzU2l6ZVtraW5kXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVba2luZF0gPT09ICdhdXRvJyAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5vcmlnaW5hbFtraW5kXSA9PT0gbmV3U2l6ZSAmJlxuICAgICAgICAgICAgKHR5cGVvZiBwcm9wc1NpemUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BzU2l6ZSA9PT0gJ2F1dG8nKVxuICAgICAgICAgICAgPyAnYXV0bydcbiAgICAgICAgICAgIDogbmV3U2l6ZTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuY2FsY3VsYXRlTmV3TWF4RnJvbUJvdW5kYXJ5ID0gZnVuY3Rpb24gKG1heFdpZHRoLCBtYXhIZWlnaHQpIHtcbiAgICAgICAgdmFyIGJvdW5kc0J5RGlyZWN0aW9uID0gdGhpcy5wcm9wcy5ib3VuZHNCeURpcmVjdGlvbjtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IHRoaXMuc3RhdGUuZGlyZWN0aW9uO1xuICAgICAgICB2YXIgd2lkdGhCeURpcmVjdGlvbiA9IGJvdW5kc0J5RGlyZWN0aW9uICYmIGhhc0RpcmVjdGlvbignbGVmdCcsIGRpcmVjdGlvbik7XG4gICAgICAgIHZhciBoZWlnaHRCeURpcmVjdGlvbiA9IGJvdW5kc0J5RGlyZWN0aW9uICYmIGhhc0RpcmVjdGlvbigndG9wJywgZGlyZWN0aW9uKTtcbiAgICAgICAgdmFyIGJvdW5kV2lkdGg7XG4gICAgICAgIHZhciBib3VuZEhlaWdodDtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSAncGFyZW50Jykge1xuICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gdGhpcy5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmVudF8xKSB7XG4gICAgICAgICAgICAgICAgYm91bmRXaWR0aCA9IHdpZHRoQnlEaXJlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnJlc2l6YWJsZVJpZ2h0IC0gdGhpcy5wYXJlbnRMZWZ0XG4gICAgICAgICAgICAgICAgICAgIDogcGFyZW50XzEub2Zmc2V0V2lkdGggKyAodGhpcy5wYXJlbnRMZWZ0IC0gdGhpcy5yZXNpemFibGVMZWZ0KTtcbiAgICAgICAgICAgICAgICBib3VuZEhlaWdodCA9IGhlaWdodEJ5RGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZXNpemFibGVCb3R0b20gLSB0aGlzLnBhcmVudFRvcFxuICAgICAgICAgICAgICAgICAgICA6IHBhcmVudF8xLm9mZnNldEhlaWdodCArICh0aGlzLnBhcmVudFRvcCAtIHRoaXMucmVzaXphYmxlVG9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgICAgIGJvdW5kV2lkdGggPSB3aWR0aEJ5RGlyZWN0aW9uID8gdGhpcy5yZXNpemFibGVSaWdodCA6IHRoaXMud2luZG93LmlubmVyV2lkdGggLSB0aGlzLnJlc2l6YWJsZUxlZnQ7XG4gICAgICAgICAgICAgICAgYm91bmRIZWlnaHQgPSBoZWlnaHRCeURpcmVjdGlvbiA/IHRoaXMucmVzaXphYmxlQm90dG9tIDogdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLnJlc2l6YWJsZVRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcykge1xuICAgICAgICAgICAgYm91bmRXaWR0aCA9IHdpZHRoQnlEaXJlY3Rpb25cbiAgICAgICAgICAgICAgICA/IHRoaXMucmVzaXphYmxlUmlnaHQgLSB0aGlzLnRhcmdldExlZnRcbiAgICAgICAgICAgICAgICA6IHRoaXMucHJvcHMuYm91bmRzLm9mZnNldFdpZHRoICsgKHRoaXMudGFyZ2V0TGVmdCAtIHRoaXMucmVzaXphYmxlTGVmdCk7XG4gICAgICAgICAgICBib3VuZEhlaWdodCA9IGhlaWdodEJ5RGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgPyB0aGlzLnJlc2l6YWJsZUJvdHRvbSAtIHRoaXMudGFyZ2V0VG9wXG4gICAgICAgICAgICAgICAgOiB0aGlzLnByb3BzLmJvdW5kcy5vZmZzZXRIZWlnaHQgKyAodGhpcy50YXJnZXRUb3AgLSB0aGlzLnJlc2l6YWJsZVRvcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJvdW5kV2lkdGggJiYgTnVtYmVyLmlzRmluaXRlKGJvdW5kV2lkdGgpKSB7XG4gICAgICAgICAgICBtYXhXaWR0aCA9IG1heFdpZHRoICYmIG1heFdpZHRoIDwgYm91bmRXaWR0aCA/IG1heFdpZHRoIDogYm91bmRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYm91bmRIZWlnaHQgJiYgTnVtYmVyLmlzRmluaXRlKGJvdW5kSGVpZ2h0KSkge1xuICAgICAgICAgICAgbWF4SGVpZ2h0ID0gbWF4SGVpZ2h0ICYmIG1heEhlaWdodCA8IGJvdW5kSGVpZ2h0ID8gbWF4SGVpZ2h0IDogYm91bmRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWF4V2lkdGg6IG1heFdpZHRoLCBtYXhIZWlnaHQ6IG1heEhlaWdodCB9O1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5jYWxjdWxhdGVOZXdTaXplRnJvbURpcmVjdGlvbiA9IGZ1bmN0aW9uIChjbGllbnRYLCBjbGllbnRZKSB7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMucHJvcHMuc2NhbGUgfHwgMTtcbiAgICAgICAgdmFyIF9hID0gbm9ybWFsaXplVG9QYWlyKHRoaXMucHJvcHMucmVzaXplUmF0aW8gfHwgMSksIHJlc2l6ZVJhdGlvWCA9IF9hWzBdLCByZXNpemVSYXRpb1kgPSBfYVsxXTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5zdGF0ZSwgZGlyZWN0aW9uID0gX2IuZGlyZWN0aW9uLCBvcmlnaW5hbCA9IF9iLm9yaWdpbmFsO1xuICAgICAgICB2YXIgX2MgPSB0aGlzLnByb3BzLCBsb2NrQXNwZWN0UmF0aW8gPSBfYy5sb2NrQXNwZWN0UmF0aW8sIGxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0ID0gX2MubG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQsIGxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGggPSBfYy5sb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoO1xuICAgICAgICB2YXIgbmV3V2lkdGggPSBvcmlnaW5hbC53aWR0aDtcbiAgICAgICAgdmFyIG5ld0hlaWdodCA9IG9yaWdpbmFsLmhlaWdodDtcbiAgICAgICAgdmFyIGV4dHJhSGVpZ2h0ID0gbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQgfHwgMDtcbiAgICAgICAgdmFyIGV4dHJhV2lkdGggPSBsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoIHx8IDA7XG4gICAgICAgIGlmIChoYXNEaXJlY3Rpb24oJ3JpZ2h0JywgZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgbmV3V2lkdGggPSBvcmlnaW5hbC53aWR0aCArICgoY2xpZW50WCAtIG9yaWdpbmFsLngpICogcmVzaXplUmF0aW9YKSAvIHNjYWxlO1xuICAgICAgICAgICAgaWYgKGxvY2tBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IChuZXdXaWR0aCAtIGV4dHJhV2lkdGgpIC8gdGhpcy5yYXRpbyArIGV4dHJhSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNEaXJlY3Rpb24oJ2xlZnQnLCBkaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IG9yaWdpbmFsLndpZHRoIC0gKChjbGllbnRYIC0gb3JpZ2luYWwueCkgKiByZXNpemVSYXRpb1gpIC8gc2NhbGU7XG4gICAgICAgICAgICBpZiAobG9ja0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gKG5ld1dpZHRoIC0gZXh0cmFXaWR0aCkgLyB0aGlzLnJhdGlvICsgZXh0cmFIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0RpcmVjdGlvbignYm90dG9tJywgZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gb3JpZ2luYWwuaGVpZ2h0ICsgKChjbGllbnRZIC0gb3JpZ2luYWwueSkgKiByZXNpemVSYXRpb1kpIC8gc2NhbGU7XG4gICAgICAgICAgICBpZiAobG9ja0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSAobmV3SGVpZ2h0IC0gZXh0cmFIZWlnaHQpICogdGhpcy5yYXRpbyArIGV4dHJhV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0RpcmVjdGlvbigndG9wJywgZGlyZWN0aW9uKSkge1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gb3JpZ2luYWwuaGVpZ2h0IC0gKChjbGllbnRZIC0gb3JpZ2luYWwueSkgKiByZXNpemVSYXRpb1kpIC8gc2NhbGU7XG4gICAgICAgICAgICBpZiAobG9ja0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSAobmV3SGVpZ2h0IC0gZXh0cmFIZWlnaHQpICogdGhpcy5yYXRpbyArIGV4dHJhV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmV3V2lkdGg6IG5ld1dpZHRoLCBuZXdIZWlnaHQ6IG5ld0hlaWdodCB9O1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5jYWxjdWxhdGVOZXdTaXplRnJvbUFzcGVjdFJhdGlvID0gZnVuY3Rpb24gKG5ld1dpZHRoLCBuZXdIZWlnaHQsIG1heCwgbWluKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIGxvY2tBc3BlY3RSYXRpbyA9IF9hLmxvY2tBc3BlY3RSYXRpbywgbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQgPSBfYS5sb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodCwgbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aCA9IF9hLmxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGg7XG4gICAgICAgIHZhciBjb21wdXRlZE1pbldpZHRoID0gdHlwZW9mIG1pbi53aWR0aCA9PT0gJ3VuZGVmaW5lZCcgPyAxMCA6IG1pbi53aWR0aDtcbiAgICAgICAgdmFyIGNvbXB1dGVkTWF4V2lkdGggPSB0eXBlb2YgbWF4LndpZHRoID09PSAndW5kZWZpbmVkJyB8fCBtYXgud2lkdGggPCAwID8gbmV3V2lkdGggOiBtYXgud2lkdGg7XG4gICAgICAgIHZhciBjb21wdXRlZE1pbkhlaWdodCA9IHR5cGVvZiBtaW4uaGVpZ2h0ID09PSAndW5kZWZpbmVkJyA/IDEwIDogbWluLmhlaWdodDtcbiAgICAgICAgdmFyIGNvbXB1dGVkTWF4SGVpZ2h0ID0gdHlwZW9mIG1heC5oZWlnaHQgPT09ICd1bmRlZmluZWQnIHx8IG1heC5oZWlnaHQgPCAwID8gbmV3SGVpZ2h0IDogbWF4LmhlaWdodDtcbiAgICAgICAgdmFyIGV4dHJhSGVpZ2h0ID0gbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQgfHwgMDtcbiAgICAgICAgdmFyIGV4dHJhV2lkdGggPSBsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoIHx8IDA7XG4gICAgICAgIGlmIChsb2NrQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgIHZhciBleHRyYU1pbldpZHRoID0gKGNvbXB1dGVkTWluSGVpZ2h0IC0gZXh0cmFIZWlnaHQpICogdGhpcy5yYXRpbyArIGV4dHJhV2lkdGg7XG4gICAgICAgICAgICB2YXIgZXh0cmFNYXhXaWR0aCA9IChjb21wdXRlZE1heEhlaWdodCAtIGV4dHJhSGVpZ2h0KSAqIHRoaXMucmF0aW8gKyBleHRyYVdpZHRoO1xuICAgICAgICAgICAgdmFyIGV4dHJhTWluSGVpZ2h0ID0gKGNvbXB1dGVkTWluV2lkdGggLSBleHRyYVdpZHRoKSAvIHRoaXMucmF0aW8gKyBleHRyYUhlaWdodDtcbiAgICAgICAgICAgIHZhciBleHRyYU1heEhlaWdodCA9IChjb21wdXRlZE1heFdpZHRoIC0gZXh0cmFXaWR0aCkgLyB0aGlzLnJhdGlvICsgZXh0cmFIZWlnaHQ7XG4gICAgICAgICAgICB2YXIgbG9ja2VkTWluV2lkdGggPSBNYXRoLm1heChjb21wdXRlZE1pbldpZHRoLCBleHRyYU1pbldpZHRoKTtcbiAgICAgICAgICAgIHZhciBsb2NrZWRNYXhXaWR0aCA9IE1hdGgubWluKGNvbXB1dGVkTWF4V2lkdGgsIGV4dHJhTWF4V2lkdGgpO1xuICAgICAgICAgICAgdmFyIGxvY2tlZE1pbkhlaWdodCA9IE1hdGgubWF4KGNvbXB1dGVkTWluSGVpZ2h0LCBleHRyYU1pbkhlaWdodCk7XG4gICAgICAgICAgICB2YXIgbG9ja2VkTWF4SGVpZ2h0ID0gTWF0aC5taW4oY29tcHV0ZWRNYXhIZWlnaHQsIGV4dHJhTWF4SGVpZ2h0KTtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gY2xhbXAobmV3V2lkdGgsIGxvY2tlZE1pbldpZHRoLCBsb2NrZWRNYXhXaWR0aCk7XG4gICAgICAgICAgICBuZXdIZWlnaHQgPSBjbGFtcChuZXdIZWlnaHQsIGxvY2tlZE1pbkhlaWdodCwgbG9ja2VkTWF4SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gY2xhbXAobmV3V2lkdGgsIGNvbXB1dGVkTWluV2lkdGgsIGNvbXB1dGVkTWF4V2lkdGgpO1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gY2xhbXAobmV3SGVpZ2h0LCBjb21wdXRlZE1pbkhlaWdodCwgY29tcHV0ZWRNYXhIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5ld1dpZHRoOiBuZXdXaWR0aCwgbmV3SGVpZ2h0OiBuZXdIZWlnaHQgfTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuc2V0Qm91bmRpbmdDbGllbnRSZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBGb3IgcGFyZW50IGJvdW5kYXJ5XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gJ3BhcmVudCcpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMiA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRfMikge1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnRSZWN0ID0gcGFyZW50XzIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRMZWZ0ID0gcGFyZW50UmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50VG9wID0gcGFyZW50UmVjdC50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIHRhcmdldChodG1sIGVsZW1lbnQpIGJvdW5kYXJ5XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcyAmJiB0eXBlb2YgdGhpcy5wcm9wcy5ib3VuZHMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0UmVjdCA9IHRoaXMucHJvcHMuYm91bmRzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdGhpcy50YXJnZXRMZWZ0ID0gdGFyZ2V0UmVjdC5sZWZ0O1xuICAgICAgICAgICAgdGhpcy50YXJnZXRUb3AgPSB0YXJnZXRSZWN0LnRvcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgYm91bmRhcnlcbiAgICAgICAgaWYgKHRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLnJlc2l6YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgbGVmdCA9IF9hLmxlZnQsIHRvcF8xID0gX2EudG9wLCByaWdodCA9IF9hLnJpZ2h0LCBib3R0b20gPSBfYS5ib3R0b207XG4gICAgICAgICAgICB0aGlzLnJlc2l6YWJsZUxlZnQgPSBsZWZ0O1xuICAgICAgICAgICAgdGhpcy5yZXNpemFibGVSaWdodCA9IHJpZ2h0O1xuICAgICAgICAgICAgdGhpcy5yZXNpemFibGVUb3AgPSB0b3BfMTtcbiAgICAgICAgICAgIHRoaXMucmVzaXphYmxlQm90dG9tID0gYm90dG9tO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLm9uUmVzaXplU3RhcnQgPSBmdW5jdGlvbiAoZXZlbnQsIGRpcmVjdGlvbikge1xuICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlIHx8ICF0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbGllbnRYID0gMDtcbiAgICAgICAgdmFyIGNsaWVudFkgPSAwO1xuICAgICAgICBpZiAoZXZlbnQubmF0aXZlRXZlbnQgJiYgaXNNb3VzZUV2ZW50KGV2ZW50Lm5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAgICAgY2xpZW50WCA9IGV2ZW50Lm5hdGl2ZUV2ZW50LmNsaWVudFg7XG4gICAgICAgICAgICBjbGllbnRZID0gZXZlbnQubmF0aXZlRXZlbnQuY2xpZW50WTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldmVudC5uYXRpdmVFdmVudCAmJiBpc1RvdWNoRXZlbnQoZXZlbnQubmF0aXZlRXZlbnQpKSB7XG4gICAgICAgICAgICBjbGllbnRYID0gZXZlbnQubmF0aXZlRXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgICAgICAgY2xpZW50WSA9IGV2ZW50Lm5hdGl2ZUV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblJlc2l6ZVN0YXJ0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRSZXNpemUgPSB0aGlzLnByb3BzLm9uUmVzaXplU3RhcnQoZXZlbnQsIGRpcmVjdGlvbiwgdGhpcy5yZXNpemFibGUpO1xuICAgICAgICAgICAgICAgIGlmIChzdGFydFJlc2l6ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGaXggIzE2OFxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaXplKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuc2l6ZS5oZWlnaHQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucHJvcHMuc2l6ZS5oZWlnaHQgIT09IHRoaXMuc3RhdGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGhlaWdodDogdGhpcy5wcm9wcy5zaXplLmhlaWdodCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zaXplLndpZHRoICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnByb3BzLnNpemUud2lkdGggIT09IHRoaXMuc3RhdGUud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgd2lkdGg6IHRoaXMucHJvcHMuc2l6ZS53aWR0aCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgbG9ja0FzcGVjdFJhdGlvIGNhc2VcbiAgICAgICAgdGhpcy5yYXRpbyA9XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW8gPT09ICdudW1iZXInID8gdGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW8gOiB0aGlzLnNpemUud2lkdGggLyB0aGlzLnNpemUuaGVpZ2h0O1xuICAgICAgICB2YXIgZmxleEJhc2lzO1xuICAgICAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IHRoaXMud2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5yZXNpemFibGUpO1xuICAgICAgICBpZiAoY29tcHV0ZWRTdHlsZS5mbGV4QmFzaXMgIT09ICdhdXRvJykge1xuICAgICAgICAgICAgdmFyIHBhcmVudF8zID0gdGhpcy5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmVudF8zKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRpciA9IHRoaXMud2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50XzMpLmZsZXhEaXJlY3Rpb247XG4gICAgICAgICAgICAgICAgdGhpcy5mbGV4RGlyID0gZGlyLnN0YXJ0c1dpdGgoJ3JvdycpID8gJ3JvdycgOiAnY29sdW1uJztcbiAgICAgICAgICAgICAgICBmbGV4QmFzaXMgPSBjb21wdXRlZFN0eWxlLmZsZXhCYXNpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgYm91bmRhcnlcbiAgICAgICAgdGhpcy5zZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgICAgeDogY2xpZW50WCxcbiAgICAgICAgICAgICAgICB5OiBjbGllbnRZLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLnNpemUud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnNpemUuaGVpZ2h0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzUmVzaXppbmc6IHRydWUsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kU3R5bGU6IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLnN0YXRlLmJhY2tncm91bmRTdHlsZSksIHsgY3Vyc29yOiB0aGlzLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGV2ZW50LnRhcmdldCkuY3Vyc29yIHx8ICdhdXRvJyB9KSxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgICAgICAgZmxleEJhc2lzOiBmbGV4QmFzaXMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoc3RhdGUpO1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5vbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuaXNSZXNpemluZyB8fCAhdGhpcy5yZXNpemFibGUgfHwgIXRoaXMud2luZG93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMud2luZG93LlRvdWNoRXZlbnQgJiYgaXNUb3VjaEV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgb24gZmFpbFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIG1heFdpZHRoID0gX2EubWF4V2lkdGgsIG1heEhlaWdodCA9IF9hLm1heEhlaWdodCwgbWluV2lkdGggPSBfYS5taW5XaWR0aCwgbWluSGVpZ2h0ID0gX2EubWluSGVpZ2h0O1xuICAgICAgICB2YXIgY2xpZW50WCA9IGlzVG91Y2hFdmVudChldmVudCkgPyBldmVudC50b3VjaGVzWzBdLmNsaWVudFggOiBldmVudC5jbGllbnRYO1xuICAgICAgICB2YXIgY2xpZW50WSA9IGlzVG91Y2hFdmVudChldmVudCkgPyBldmVudC50b3VjaGVzWzBdLmNsaWVudFkgOiBldmVudC5jbGllbnRZO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLnN0YXRlLCBkaXJlY3Rpb24gPSBfYi5kaXJlY3Rpb24sIG9yaWdpbmFsID0gX2Iub3JpZ2luYWwsIHdpZHRoID0gX2Iud2lkdGgsIGhlaWdodCA9IF9iLmhlaWdodDtcbiAgICAgICAgdmFyIHBhcmVudFNpemUgPSB0aGlzLmdldFBhcmVudFNpemUoKTtcbiAgICAgICAgdmFyIG1heCA9IGNhbGN1bGF0ZU5ld01heChwYXJlbnRTaXplLCB0aGlzLndpbmRvdy5pbm5lcldpZHRoLCB0aGlzLndpbmRvdy5pbm5lckhlaWdodCwgbWF4V2lkdGgsIG1heEhlaWdodCwgbWluV2lkdGgsIG1pbkhlaWdodCk7XG4gICAgICAgIG1heFdpZHRoID0gbWF4Lm1heFdpZHRoO1xuICAgICAgICBtYXhIZWlnaHQgPSBtYXgubWF4SGVpZ2h0O1xuICAgICAgICBtaW5XaWR0aCA9IG1heC5taW5XaWR0aDtcbiAgICAgICAgbWluSGVpZ2h0ID0gbWF4Lm1pbkhlaWdodDtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzaXplXG4gICAgICAgIHZhciBfYyA9IHRoaXMuY2FsY3VsYXRlTmV3U2l6ZUZyb21EaXJlY3Rpb24oY2xpZW50WCwgY2xpZW50WSksIG5ld0hlaWdodCA9IF9jLm5ld0hlaWdodCwgbmV3V2lkdGggPSBfYy5uZXdXaWR0aDtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG1heCBzaXplIGZyb20gYm91bmRhcnkgc2V0dGluZ3NcbiAgICAgICAgdmFyIGJvdW5kYXJ5TWF4ID0gdGhpcy5jYWxjdWxhdGVOZXdNYXhGcm9tQm91bmRhcnkobWF4V2lkdGgsIG1heEhlaWdodCk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNuYXAgJiYgdGhpcy5wcm9wcy5zbmFwLngpIHtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gZmluZENsb3Nlc3RTbmFwKG5ld1dpZHRoLCB0aGlzLnByb3BzLnNuYXAueCwgdGhpcy5wcm9wcy5zbmFwR2FwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zbmFwICYmIHRoaXMucHJvcHMuc25hcC55KSB7XG4gICAgICAgICAgICBuZXdIZWlnaHQgPSBmaW5kQ2xvc2VzdFNuYXAobmV3SGVpZ2h0LCB0aGlzLnByb3BzLnNuYXAueSwgdGhpcy5wcm9wcy5zbmFwR2FwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYWxjdWxhdGUgbmV3IHNpemUgZnJvbSBhc3BlY3QgcmF0aW9cbiAgICAgICAgdmFyIG5ld1NpemUgPSB0aGlzLmNhbGN1bGF0ZU5ld1NpemVGcm9tQXNwZWN0UmF0aW8obmV3V2lkdGgsIG5ld0hlaWdodCwgeyB3aWR0aDogYm91bmRhcnlNYXgubWF4V2lkdGgsIGhlaWdodDogYm91bmRhcnlNYXgubWF4SGVpZ2h0IH0sIHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9KTtcbiAgICAgICAgbmV3V2lkdGggPSBuZXdTaXplLm5ld1dpZHRoO1xuICAgICAgICBuZXdIZWlnaHQgPSBuZXdTaXplLm5ld0hlaWdodDtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZ3JpZCkge1xuICAgICAgICAgICAgdmFyIG5ld0dyaWRXaWR0aCA9IHNuYXAobmV3V2lkdGgsIHRoaXMucHJvcHMuZ3JpZFswXSk7XG4gICAgICAgICAgICB2YXIgbmV3R3JpZEhlaWdodCA9IHNuYXAobmV3SGVpZ2h0LCB0aGlzLnByb3BzLmdyaWRbMV0pO1xuICAgICAgICAgICAgdmFyIGdhcCA9IHRoaXMucHJvcHMuc25hcEdhcCB8fCAwO1xuICAgICAgICAgICAgdmFyIHcgPSBnYXAgPT09IDAgfHwgTWF0aC5hYnMobmV3R3JpZFdpZHRoIC0gbmV3V2lkdGgpIDw9IGdhcCA/IG5ld0dyaWRXaWR0aCA6IG5ld1dpZHRoO1xuICAgICAgICAgICAgdmFyIGggPSBnYXAgPT09IDAgfHwgTWF0aC5hYnMobmV3R3JpZEhlaWdodCAtIG5ld0hlaWdodCkgPD0gZ2FwID8gbmV3R3JpZEhlaWdodCA6IG5ld0hlaWdodDtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gdztcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IGg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlbHRhID0ge1xuICAgICAgICAgICAgd2lkdGg6IG5ld1dpZHRoIC0gb3JpZ2luYWwud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IG5ld0hlaWdodCAtIG9yaWdpbmFsLmhlaWdodCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHdpZHRoICYmIHR5cGVvZiB3aWR0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh3aWR0aC5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSAobmV3V2lkdGggLyBwYXJlbnRTaXplLndpZHRoKSAqIDEwMDtcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHBlcmNlbnQgKyBcIiVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdpZHRoLmVuZHNXaXRoKCd2dycpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZ3ID0gKG5ld1dpZHRoIC8gdGhpcy53aW5kb3cuaW5uZXJXaWR0aCkgKiAxMDA7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSB2dyArIFwidndcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdpZHRoLmVuZHNXaXRoKCd2aCcpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZoID0gKG5ld1dpZHRoIC8gdGhpcy53aW5kb3cuaW5uZXJIZWlnaHQpICogMTAwO1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gdmggKyBcInZoXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlaWdodCAmJiB0eXBlb2YgaGVpZ2h0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGhlaWdodC5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSAobmV3SGVpZ2h0IC8gcGFyZW50U2l6ZS5oZWlnaHQpICogMTAwO1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IHBlcmNlbnQgKyBcIiVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhlaWdodC5lbmRzV2l0aCgndncnKSkge1xuICAgICAgICAgICAgICAgIHZhciB2dyA9IChuZXdIZWlnaHQgLyB0aGlzLndpbmRvdy5pbm5lcldpZHRoKSAqIDEwMDtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSB2dyArIFwidndcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhlaWdodC5lbmRzV2l0aCgndmgnKSkge1xuICAgICAgICAgICAgICAgIHZhciB2aCA9IChuZXdIZWlnaHQgLyB0aGlzLndpbmRvdy5pbm5lckhlaWdodCkgKiAxMDA7XG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gdmggKyBcInZoXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMuY3JlYXRlU2l6ZUZvckNzc1Byb3BlcnR5KG5ld1dpZHRoLCAnd2lkdGgnKSxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5jcmVhdGVTaXplRm9yQ3NzUHJvcGVydHkobmV3SGVpZ2h0LCAnaGVpZ2h0JyksXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmZsZXhEaXIgPT09ICdyb3cnKSB7XG4gICAgICAgICAgICBuZXdTdGF0ZS5mbGV4QmFzaXMgPSBuZXdTdGF0ZS53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZsZXhEaXIgPT09ICdjb2x1bW4nKSB7XG4gICAgICAgICAgICBuZXdTdGF0ZS5mbGV4QmFzaXMgPSBuZXdTdGF0ZS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdpZHRoQ2hhbmdlZCA9IHRoaXMuc3RhdGUud2lkdGggIT09IG5ld1N0YXRlLndpZHRoO1xuICAgICAgICB2YXIgaGVpZ2h0Q2hhbmdlZCA9IHRoaXMuc3RhdGUuaGVpZ2h0ICE9PSBuZXdTdGF0ZS5oZWlnaHQ7XG4gICAgICAgIHZhciBmbGV4QmFzZUNoYW5nZWQgPSB0aGlzLnN0YXRlLmZsZXhCYXNpcyAhPT0gbmV3U3RhdGUuZmxleEJhc2lzO1xuICAgICAgICB2YXIgY2hhbmdlZCA9IHdpZHRoQ2hhbmdlZCB8fCBoZWlnaHRDaGFuZ2VkIHx8IGZsZXhCYXNlQ2hhbmdlZDtcbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIC8vIEZvciB2MTgsIHVwZGF0ZSBzdGF0ZSBzeW5jXG4gICAgICAgICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uUmVzaXplKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25SZXNpemUoZXZlbnQsIGRpcmVjdGlvbiwgdGhpcy5yZXNpemFibGUsIGRlbHRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5vbk1vdXNlVXAgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdmFyIF9jID0gdGhpcy5zdGF0ZSwgaXNSZXNpemluZyA9IF9jLmlzUmVzaXppbmcsIGRpcmVjdGlvbiA9IF9jLmRpcmVjdGlvbiwgb3JpZ2luYWwgPSBfYy5vcmlnaW5hbDtcbiAgICAgICAgaWYgKCFpc1Jlc2l6aW5nIHx8ICF0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZWx0YSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnNpemUud2lkdGggLSBvcmlnaW5hbC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5zaXplLmhlaWdodCAtIG9yaWdpbmFsLmhlaWdodCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25SZXNpemVTdG9wKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uUmVzaXplU3RvcChldmVudCwgZGlyZWN0aW9uLCB0aGlzLnJlc2l6YWJsZSwgZGVsdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB3aWR0aDogKF9hID0gdGhpcy5wcm9wcy5zaXplLndpZHRoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnYXV0bycsIGhlaWdodDogKF9iID0gdGhpcy5wcm9wcy5zaXplLmhlaWdodCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJ2F1dG8nIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudW5iaW5kRXZlbnRzKCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kU3R5bGU6IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLnN0YXRlLmJhY2tncm91bmRTdHlsZSksIHsgY3Vyc29yOiAnYXV0bycgfSksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS51cGRhdGVTaXplID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHdpZHRoOiAoX2EgPSBzaXplLndpZHRoKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnYXV0bycsIGhlaWdodDogKF9iID0gc2l6ZS5oZWlnaHQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICdhdXRvJyB9KTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUucmVuZGVyUmVzaXplciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgZW5hYmxlID0gX2EuZW5hYmxlLCBoYW5kbGVTdHlsZXMgPSBfYS5oYW5kbGVTdHlsZXMsIGhhbmRsZUNsYXNzZXMgPSBfYS5oYW5kbGVDbGFzc2VzLCBoYW5kbGVXcmFwcGVyU3R5bGUgPSBfYS5oYW5kbGVXcmFwcGVyU3R5bGUsIGhhbmRsZVdyYXBwZXJDbGFzcyA9IF9hLmhhbmRsZVdyYXBwZXJDbGFzcywgaGFuZGxlQ29tcG9uZW50ID0gX2EuaGFuZGxlQ29tcG9uZW50O1xuICAgICAgICBpZiAoIWVuYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc2l6ZXJzID0gT2JqZWN0LmtleXMoZW5hYmxlKS5tYXAoZnVuY3Rpb24gKGRpcikge1xuICAgICAgICAgICAgaWYgKGVuYWJsZVtkaXJdICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVyLCB7IGtleTogZGlyLCBkaXJlY3Rpb246IGRpciwgb25SZXNpemVTdGFydDogX3RoaXMub25SZXNpemVTdGFydCwgcmVwbGFjZVN0eWxlczogaGFuZGxlU3R5bGVzICYmIGhhbmRsZVN0eWxlc1tkaXJdLCBjbGFzc05hbWU6IGhhbmRsZUNsYXNzZXMgJiYgaGFuZGxlQ2xhc3Nlc1tkaXJdIH0sIGhhbmRsZUNvbXBvbmVudCAmJiBoYW5kbGVDb21wb25lbnRbZGlyXSA/IGhhbmRsZUNvbXBvbmVudFtkaXJdIDogbnVsbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyAjOTMgV3JhcCB0aGUgcmVzaXplIGJveCBpbiBzcGFuICh3aWxsIG5vdCBicmVhayAxMDAlIHdpZHRoL2hlaWdodClcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBoYW5kbGVXcmFwcGVyQ2xhc3MsIHN0eWxlOiBoYW5kbGVXcmFwcGVyU3R5bGUgfSwgcmVzaXplcnMpKTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZXh0ZW5kc1Byb3BzID0gT2JqZWN0LmtleXModGhpcy5wcm9wcykucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICAgICAgaWYgKGRlZmluZWRQcm9wcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjY1trZXldID0gX3RoaXMucHJvcHNba2V5XTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgdmFyIHN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oeyBwb3NpdGlvbjogJ3JlbGF0aXZlJywgdXNlclNlbGVjdDogdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nID8gJ25vbmUnIDogJ2F1dG8nIH0sIHRoaXMucHJvcHMuc3R5bGUpLCB0aGlzLnNpemVTdHlsZSksIHsgbWF4V2lkdGg6IHRoaXMucHJvcHMubWF4V2lkdGgsIG1heEhlaWdodDogdGhpcy5wcm9wcy5tYXhIZWlnaHQsIG1pbldpZHRoOiB0aGlzLnByb3BzLm1pbldpZHRoLCBtaW5IZWlnaHQ6IHRoaXMucHJvcHMubWluSGVpZ2h0LCBib3hTaXppbmc6ICdib3JkZXItYm94JywgZmxleFNocmluazogMCB9KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZmxleEJhc2lzKSB7XG4gICAgICAgICAgICBzdHlsZS5mbGV4QmFzaXMgPSB0aGlzLnN0YXRlLmZsZXhCYXNpcztcbiAgICAgICAgfVxuICAgICAgICB2YXIgV3JhcHBlciA9IHRoaXMucHJvcHMuYXMgfHwgJ2Rpdic7XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChXcmFwcGVyLCBfX2Fzc2lnbih7IHN0eWxlOiBzdHlsZSwgY2xhc3NOYW1lOiB0aGlzLnByb3BzLmNsYXNzTmFtZSB9LCBleHRlbmRzUHJvcHMsIHsgXG4gICAgICAgICAgICAvLyBgcmVmYCBpcyBhZnRlciBgZXh0ZW5kc1Byb3BzYCB0byBlbnN1cmUgdGhpcyBvbmUgd2lucyBvdmVyIGEgdmVyc2lvblxuICAgICAgICAgICAgLy8gcGFzc2VkIGluXG4gICAgICAgICAgICByZWY6IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVzaXphYmxlID0gYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IH0pLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBzdHlsZTogdGhpcy5zdGF0ZS5iYWNrZ3JvdW5kU3R5bGUgfSksXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJSZXNpemVyKCkpKTtcbiAgICB9O1xuICAgIFJlc2l6YWJsZS5kZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGFzOiAnZGl2JyxcbiAgICAgICAgb25SZXNpemVTdGFydDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvblJlc2l6ZTogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvblJlc2l6ZVN0b3A6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgZW5hYmxlOiB7XG4gICAgICAgICAgICB0b3A6IHRydWUsXG4gICAgICAgICAgICByaWdodDogdHJ1ZSxcbiAgICAgICAgICAgIGJvdHRvbTogdHJ1ZSxcbiAgICAgICAgICAgIGxlZnQ6IHRydWUsXG4gICAgICAgICAgICB0b3BSaWdodDogdHJ1ZSxcbiAgICAgICAgICAgIGJvdHRvbVJpZ2h0OiB0cnVlLFxuICAgICAgICAgICAgYm90dG9tTGVmdDogdHJ1ZSxcbiAgICAgICAgICAgIHRvcExlZnQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHN0eWxlOiB7fSxcbiAgICAgICAgZ3JpZDogWzEsIDFdLFxuICAgICAgICBsb2NrQXNwZWN0UmF0aW86IGZhbHNlLFxuICAgICAgICBsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoOiAwLFxuICAgICAgICBsb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodDogMCxcbiAgICAgICAgc2NhbGU6IDEsXG4gICAgICAgIHJlc2l6ZVJhdGlvOiAxLFxuICAgICAgICBzbmFwR2FwOiAwLFxuICAgIH07XG4gICAgcmV0dXJuIFJlc2l6YWJsZTtcbn0oUmVhY3QuUHVyZUNvbXBvbmVudCkpO1xuZXhwb3J0IHsgUmVzaXphYmxlIH07XG4iLCJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICAgIH07XG59KSgpO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciByb3dTaXplQmFzZSA9IHtcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIGhlaWdodDogJzEwcHgnLFxuICAgIHRvcDogJzBweCcsXG4gICAgbGVmdDogJzBweCcsXG4gICAgY3Vyc29yOiAncm93LXJlc2l6ZScsXG59O1xudmFyIGNvbFNpemVCYXNlID0ge1xuICAgIHdpZHRoOiAnMTBweCcsXG4gICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgdG9wOiAnMHB4JyxcbiAgICBsZWZ0OiAnMHB4JyxcbiAgICBjdXJzb3I6ICdjb2wtcmVzaXplJyxcbn07XG52YXIgZWRnZUJhc2UgPSB7XG4gICAgd2lkdGg6ICcyMHB4JyxcbiAgICBoZWlnaHQ6ICcyMHB4JyxcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbn07XG52YXIgc3R5bGVzID0ge1xuICAgIHRvcDogX19hc3NpZ24oX19hc3NpZ24oe30sIHJvd1NpemVCYXNlKSwgeyB0b3A6ICctNXB4JyB9KSxcbiAgICByaWdodDogX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbFNpemVCYXNlKSwgeyBsZWZ0OiB1bmRlZmluZWQsIHJpZ2h0OiAnLTVweCcgfSksXG4gICAgYm90dG9tOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcm93U2l6ZUJhc2UpLCB7IHRvcDogdW5kZWZpbmVkLCBib3R0b206ICctNXB4JyB9KSxcbiAgICBsZWZ0OiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29sU2l6ZUJhc2UpLCB7IGxlZnQ6ICctNXB4JyB9KSxcbiAgICB0b3BSaWdodDogX19hc3NpZ24oX19hc3NpZ24oe30sIGVkZ2VCYXNlKSwgeyByaWdodDogJy0xMHB4JywgdG9wOiAnLTEwcHgnLCBjdXJzb3I6ICduZS1yZXNpemUnIH0pLFxuICAgIGJvdHRvbVJpZ2h0OiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZWRnZUJhc2UpLCB7IHJpZ2h0OiAnLTEwcHgnLCBib3R0b206ICctMTBweCcsIGN1cnNvcjogJ3NlLXJlc2l6ZScgfSksXG4gICAgYm90dG9tTGVmdDogX19hc3NpZ24oX19hc3NpZ24oe30sIGVkZ2VCYXNlKSwgeyBsZWZ0OiAnLTEwcHgnLCBib3R0b206ICctMTBweCcsIGN1cnNvcjogJ3N3LXJlc2l6ZScgfSksXG4gICAgdG9wTGVmdDogX19hc3NpZ24oX19hc3NpZ24oe30sIGVkZ2VCYXNlKSwgeyBsZWZ0OiAnLTEwcHgnLCB0b3A6ICctMTBweCcsIGN1cnNvcjogJ253LXJlc2l6ZScgfSksXG59O1xudmFyIFJlc2l6ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlc2l6ZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVzaXplcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9uTW91c2VEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uUmVzaXplU3RhcnQoZSwgX3RoaXMucHJvcHMuZGlyZWN0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMub25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uUmVzaXplU3RhcnQoZSwgX3RoaXMucHJvcHMuZGlyZWN0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSZXNpemVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogdGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgJycsIHN0eWxlOiBfX2Fzc2lnbihfX2Fzc2lnbih7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB1c2VyU2VsZWN0OiAnbm9uZScgfSwgc3R5bGVzW3RoaXMucHJvcHMuZGlyZWN0aW9uXSksICh0aGlzLnByb3BzLnJlcGxhY2VTdHlsZXMgfHwge30pKSwgb25Nb3VzZURvd246IHRoaXMub25Nb3VzZURvd24sIG9uVG91Y2hTdGFydDogdGhpcy5vblRvdWNoU3RhcnQgfSwgdGhpcy5wcm9wcy5jaGlsZHJlbikpO1xuICAgIH07XG4gICAgcmV0dXJuIFJlc2l6ZXI7XG59KFJlYWN0LlB1cmVDb21wb25lbnQpKTtcbmV4cG9ydCB7IFJlc2l6ZXIgfTtcbiIsImltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlJztcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHknO1xuaW1wb3J0IFJlYWN0LCB7IFB1cmVDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIHdpdGhTaWRlRWZmZWN0KHJlZHVjZVByb3BzVG9TdGF0ZSwgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKHR5cGVvZiByZWR1Y2VQcm9wc1RvU3RhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVkdWNlUHJvcHNUb1N0YXRlIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmICh0eXBlb2YgV3JhcHBlZENvbXBvbmVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIFdyYXBwZWRDb21wb25lbnQgdG8gYmUgYSBSZWFjdCBjb21wb25lbnQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1vdW50ZWRJbnN0YW5jZXMgPSBbXTtcbiAgICB2YXIgc3RhdGU7XG5cbiAgICBmdW5jdGlvbiBlbWl0Q2hhbmdlKCkge1xuICAgICAgc3RhdGUgPSByZWR1Y2VQcm9wc1RvU3RhdGUobW91bnRlZEluc3RhbmNlcy5tYXAoZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5wcm9wcztcbiAgICAgIH0pKTtcbiAgICAgIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQoc3RhdGUpO1xuICAgIH1cblxuICAgIHZhciBTaWRlRWZmZWN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUHVyZUNvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzTG9vc2UoU2lkZUVmZmVjdCwgX1B1cmVDb21wb25lbnQpO1xuXG4gICAgICBmdW5jdGlvbiBTaWRlRWZmZWN0KCkge1xuICAgICAgICByZXR1cm4gX1B1cmVDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgfVxuXG4gICAgICAvLyBUcnkgdG8gdXNlIGRpc3BsYXlOYW1lIG9mIHdyYXBwZWQgY29tcG9uZW50XG4gICAgICBTaWRlRWZmZWN0LnBlZWsgPSBmdW5jdGlvbiBwZWVrKCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9O1xuXG4gICAgICB2YXIgX3Byb3RvID0gU2lkZUVmZmVjdC5wcm90b3R5cGU7XG5cbiAgICAgIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzLnB1c2godGhpcyk7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB2YXIgaW5kZXggPSBtb3VudGVkSW5zdGFuY2VzLmluZGV4T2YodGhpcyk7XG4gICAgICAgIG1vdW50ZWRJbnN0YW5jZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgZW1pdENoYW5nZSgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIHRoaXMucHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFNpZGVFZmZlY3Q7XG4gICAgfShQdXJlQ29tcG9uZW50KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShTaWRlRWZmZWN0LCBcImRpc3BsYXlOYW1lXCIsIFwiU2lkZUVmZmVjdChcIiArIGdldERpc3BsYXlOYW1lKFdyYXBwZWRDb21wb25lbnQpICsgXCIpXCIpO1xuXG4gICAgcmV0dXJuIFNpZGVFZmZlY3Q7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTaWRlRWZmZWN0O1xuIiwiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKFwicmVhY3RcIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wicmVhY3RcIl0sZSk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5SZWFjdENvbmZldHRpPWUocmVxdWlyZShcInJlYWN0XCIpKTp0LlJlYWN0Q29uZmV0dGk9ZSh0LlJlYWN0KX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihyKXtpZihlW3JdKXJldHVybiBlW3JdLmV4cG9ydHM7dmFyIGk9ZVtyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5sPSEwLGkuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciByPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOnR9KSwyJmUmJlwic3RyaW5nXCIhPXR5cGVvZiB0KWZvcih2YXIgaSBpbiB0KW4uZChyLGksZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxpKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsXCJhXCIsZSksZX0sbi5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxuLnA9XCJcIixuKG4ucz0yKX0oW2Z1bmN0aW9uKGUsbil7ZS5leHBvcnRzPXR9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj17bGluZWFyOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKnQvcitlfSxlYXNlSW5RdWFkOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKih0Lz1yKSp0K2V9LGVhc2VPdXRRdWFkOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybi0obi1lKSoodC89cikqKHQtMikrZX0sZWFzZUluT3V0UXVhZDpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuKHQvPXIvMik8MT9pLzIqdCp0K2U6LWkvMiooLS10Kih0LTIpLTEpK2V9LGVhc2VJbkN1YmljOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKih0Lz1yKSp0KnQrZX0sZWFzZU91dEN1YmljOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKigodD10L3ItMSkqdCp0KzEpK2V9LGVhc2VJbk91dEN1YmljOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4odC89ci8yKTwxP2kvMip0KnQqdCtlOmkvMiooKHQtPTIpKnQqdCsyKStlfSxlYXNlSW5RdWFydDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSoodC89cikqdCp0KnQrZX0sZWFzZU91dFF1YXJ0OmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybi0obi1lKSooKHQ9dC9yLTEpKnQqdCp0LTEpK2V9LGVhc2VJbk91dFF1YXJ0OmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4odC89ci8yKTwxP2kvMip0KnQqdCp0K2U6LWkvMiooKHQtPTIpKnQqdCp0LTIpK2V9LGVhc2VJblF1aW50OmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKih0Lz1yKSp0KnQqdCp0K2V9LGVhc2VPdXRRdWludDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSooKHQ9dC9yLTEpKnQqdCp0KnQrMSkrZX0sZWFzZUluT3V0UXVpbnQ6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybih0Lz1yLzIpPDE/aS8yKnQqdCp0KnQqdCtlOmkvMiooKHQtPTIpKnQqdCp0KnQrMikrZX0sZWFzZUluU2luZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuLWkqTWF0aC5jb3ModC9yKihNYXRoLlBJLzIpKStpK2V9LGVhc2VPdXRTaW5lOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKk1hdGguc2luKHQvciooTWF0aC5QSS8yKSkrZX0sZWFzZUluT3V0U2luZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4tKG4tZSkvMiooTWF0aC5jb3MoTWF0aC5QSSp0L3IpLTEpK2V9LGVhc2VJbkV4cG86ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIDA9PXQ/ZToobi1lKSpNYXRoLnBvdygyLDEwKih0L3ItMSkpK2V9LGVhc2VPdXRFeHBvOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4gdD09cj9lK2k6aSooMS1NYXRoLnBvdygyLC0xMCp0L3IpKStlfSxlYXNlSW5PdXRFeHBvOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4gMD09PXQ/ZTp0PT09cj9lK2k6KHQvPXIvMik8MT9pLzIqTWF0aC5wb3coMiwxMCoodC0xKSkrZTppLzIqKDItTWF0aC5wb3coMiwtMTAqLS10KSkrZX0sZWFzZUluQ2lyYzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4tKG4tZSkqKE1hdGguc3FydCgxLSh0Lz1yKSp0KS0xKStlfSxlYXNlT3V0Q2lyYzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4obi1lKSpNYXRoLnNxcnQoMS0odD10L3ItMSkqdCkrZX0sZWFzZUluT3V0Q2lyYzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuKHQvPXIvMik8MT8taS8yKihNYXRoLnNxcnQoMS10KnQpLTEpK2U6aS8yKihNYXRoLnNxcnQoMS0odC09MikqdCkrMSkrZX0sZWFzZUluRWxhc3RpYzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLGEsYz1uLWU7cmV0dXJuIGE9MS43MDE1OCwwPT09dD9lOjE9PSh0Lz1yKT9lK2M6KChvPTApfHwobz0uMypyKSwoaT1jKTxNYXRoLmFicyhjKT8oaT1jLGE9by80KTphPW8vKDIqTWF0aC5QSSkqTWF0aC5hc2luKGMvaSksLWkqTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0KnItYSkqKDIqTWF0aC5QSSkvbykrZSl9LGVhc2VPdXRFbGFzdGljOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG8sYSxjPW4tZTtyZXR1cm4gYT0xLjcwMTU4LDA9PT10P2U6MT09KHQvPXIpP2UrYzooKG89MCl8fChvPS4zKnIpLChpPWMpPE1hdGguYWJzKGMpPyhpPWMsYT1vLzQpOmE9by8oMipNYXRoLlBJKSpNYXRoLmFzaW4oYy9pKSxpKk1hdGgucG93KDIsLTEwKnQpKk1hdGguc2luKCh0KnItYSkqKDIqTWF0aC5QSSkvbykrYytlKX0sZWFzZUluT3V0RWxhc3RpYzpmdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLGEsYz1uLWU7cmV0dXJuIGE9MS43MDE1OCwwPT09dD9lOjI9PSh0Lz1yLzIpP2UrYzooKG89MCl8fChvPXIqKC4zKjEuNSkpLChpPWMpPE1hdGguYWJzKGMpPyhpPWMsYT1vLzQpOmE9by8oMipNYXRoLlBJKSpNYXRoLmFzaW4oYy9pKSx0PDE/aSpNYXRoLnBvdygyLDEwKih0LT0xKSkqTWF0aC5zaW4oKHQqci1hKSooMipNYXRoLlBJKS9vKSotLjUrZTppKk1hdGgucG93KDIsLTEwKih0LT0xKSkqTWF0aC5zaW4oKHQqci1hKSooMipNYXRoLlBJKS9vKSouNStjK2UpfSxlYXNlSW5CYWNrOmZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIHZvaWQgMD09PWkmJihpPTEuNzAxNTgpLChuLWUpKih0Lz1yKSp0KigoaSsxKSp0LWkpK2V9LGVhc2VPdXRCYWNrOmZ1bmN0aW9uKHQsZSxuLHIsaSl7cmV0dXJuIHZvaWQgMD09PWkmJihpPTEuNzAxNTgpLChuLWUpKigodD10L3ItMSkqdCooKGkrMSkqdCtpKSsxKStlfSxlYXNlSW5PdXRCYWNrOmZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89bi1lO3JldHVybiB2b2lkIDA9PT1pJiYoaT0xLjcwMTU4KSwodC89ci8yKTwxP28vMioodCp0KigoMSsoaSo9MS41MjUpKSp0LWkpKStlOm8vMiooKHQtPTIpKnQqKCgxKyhpKj0xLjUyNSkpKnQraSkrMikrZX0sZWFzZUluQm91bmNlOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvPW4tZTtyZXR1cm4gby1yLmVhc2VPdXRCb3VuY2UoaS10LDAsbyxpKStlfSxlYXNlT3V0Qm91bmNlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4odC89cik8MS8yLjc1P2kqKDcuNTYyNSp0KnQpK2U6dDwyLzIuNzU/aSooNy41NjI1Kih0LT0xLjUvMi43NSkqdCsuNzUpK2U6dDwyLjUvMi43NT9pKig3LjU2MjUqKHQtPTIuMjUvMi43NSkqdCsuOTM3NSkrZTppKig3LjU2MjUqKHQtPTIuNjI1LzIuNzUpKnQrLjk4NDM3NSkrZX0sZWFzZUluT3V0Qm91bmNlOmZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvPW4tZTtyZXR1cm4gdDxpLzI/LjUqci5lYXNlSW5Cb3VuY2UoMip0LDAsbyxpKStlOi41KnIuZWFzZU91dEJvdW5jZSgyKnQtaSwwLG8saSkrLjUqbytlfX07dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigzKX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKSxuLmQoZSxcIlJlYWN0Q29uZmV0dGlcIiwoZnVuY3Rpb24oKXtyZXR1cm4gUX0pKTt2YXIgcixpLG89bigwKSxhPW4ubihvKSxjPW4oMSkscz1uLm4oYyk7ZnVuY3Rpb24gdSh0LGUpe3JldHVybiB0K01hdGgucmFuZG9tKCkqKGUtdCl9ZnVuY3Rpb24gZih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gaCh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9IWZ1bmN0aW9uKHQpe3RbdC5DaXJjbGU9MF09XCJDaXJjbGVcIix0W3QuU3F1YXJlPTFdPVwiU3F1YXJlXCIsdFt0LlN0cmlwPTJdPVwiU3RyaXBcIn0ocnx8KHI9e30pKSxmdW5jdGlvbih0KXt0W3QuUG9zaXRpdmU9MV09XCJQb3NpdGl2ZVwiLHRbdC5OZWdhdGl2ZT0tMV09XCJOZWdhdGl2ZVwifShpfHwoaT17fSkpO3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4scixvKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLHQpLGgodGhpcyxcImNvbnRleHRcIix2b2lkIDApLGgodGhpcyxcInJhZGl1c1wiLHZvaWQgMCksaCh0aGlzLFwieFwiLHZvaWQgMCksaCh0aGlzLFwieVwiLHZvaWQgMCksaCh0aGlzLFwid1wiLHZvaWQgMCksaCh0aGlzLFwiaFwiLHZvaWQgMCksaCh0aGlzLFwidnhcIix2b2lkIDApLGgodGhpcyxcInZ5XCIsdm9pZCAwKSxoKHRoaXMsXCJzaGFwZVwiLHZvaWQgMCksaCh0aGlzLFwiYW5nbGVcIix2b2lkIDApLGgodGhpcyxcImFuZ3VsYXJTcGluXCIsdm9pZCAwKSxoKHRoaXMsXCJjb2xvclwiLHZvaWQgMCksaCh0aGlzLFwicm90YXRlWVwiLHZvaWQgMCksaCh0aGlzLFwicm90YXRpb25EaXJlY3Rpb25cIix2b2lkIDApLGgodGhpcyxcImdldE9wdGlvbnNcIix2b2lkIDApLHRoaXMuZ2V0T3B0aW9ucz1uO3ZhciBhLGMscz10aGlzLmdldE9wdGlvbnMoKSxmPXMuY29sb3JzLGw9cy5pbml0aWFsVmVsb2NpdHlYLHA9cy5pbml0aWFsVmVsb2NpdHlZO3RoaXMuY29udGV4dD1lLHRoaXMueD1yLHRoaXMueT1vLHRoaXMudz11KDUsMjApLHRoaXMuaD11KDUsMjApLHRoaXMucmFkaXVzPXUoNSwxMCksdGhpcy52eD1cIm51bWJlclwiPT10eXBlb2YgbD91KC1sLGwpOnUobC5taW4sbC5tYXgpLHRoaXMudnk9XCJudW1iZXJcIj09dHlwZW9mIHA/dSgtcCwwKTp1KHAubWluLHAubWF4KSx0aGlzLnNoYXBlPShhPTAsYz0yLE1hdGguZmxvb3IoYStNYXRoLnJhbmRvbSgpKihjLWErMSkpKSx0aGlzLmFuZ2xlPXUoMCwzNjApKk1hdGguUEkvMTgwLHRoaXMuYW5ndWxhclNwaW49dSgtLjIsLjIpLHRoaXMuY29sb3I9ZltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZi5sZW5ndGgpXSx0aGlzLnJvdGF0ZVk9dSgwLDEpLHRoaXMucm90YXRpb25EaXJlY3Rpb249dSgwLDEpP2kuUG9zaXRpdmU6aS5OZWdhdGl2ZX12YXIgZSxuLG87cmV0dXJuIGU9dCwobj1be2tleTpcInVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRPcHRpb25zKCksZT10LmdyYXZpdHksbj10LndpbmQsbz10LmZyaWN0aW9uLGE9dC5vcGFjaXR5LGM9dC5kcmF3U2hhcGU7dGhpcy54Kz10aGlzLnZ4LHRoaXMueSs9dGhpcy52eSx0aGlzLnZ5Kz1lLHRoaXMudngrPW4sdGhpcy52eCo9byx0aGlzLnZ5Kj1vLHRoaXMucm90YXRlWT49MSYmdGhpcy5yb3RhdGlvbkRpcmVjdGlvbj09PWkuUG9zaXRpdmU/dGhpcy5yb3RhdGlvbkRpcmVjdGlvbj1pLk5lZ2F0aXZlOnRoaXMucm90YXRlWTw9LTEmJnRoaXMucm90YXRpb25EaXJlY3Rpb249PT1pLk5lZ2F0aXZlJiYodGhpcy5yb3RhdGlvbkRpcmVjdGlvbj1pLlBvc2l0aXZlKTt2YXIgcz0uMSp0aGlzLnJvdGF0aW9uRGlyZWN0aW9uO2lmKHRoaXMucm90YXRlWSs9cyx0aGlzLmFuZ2xlKz10aGlzLmFuZ3VsYXJTcGluLHRoaXMuY29udGV4dC5zYXZlKCksdGhpcy5jb250ZXh0LnRyYW5zbGF0ZSh0aGlzLngsdGhpcy55KSx0aGlzLmNvbnRleHQucm90YXRlKHRoaXMuYW5nbGUpLHRoaXMuY29udGV4dC5zY2FsZSgxLHRoaXMucm90YXRlWSksdGhpcy5jb250ZXh0LnJvdGF0ZSh0aGlzLmFuZ2xlKSx0aGlzLmNvbnRleHQuYmVnaW5QYXRoKCksdGhpcy5jb250ZXh0LmZpbGxTdHlsZT10aGlzLmNvbG9yLHRoaXMuY29udGV4dC5zdHJva2VTdHlsZT10aGlzLmNvbG9yLHRoaXMuY29udGV4dC5nbG9iYWxBbHBoYT1hLHRoaXMuY29udGV4dC5saW5lQ2FwPVwicm91bmRcIix0aGlzLmNvbnRleHQubGluZVdpZHRoPTIsYyYmXCJmdW5jdGlvblwiPT10eXBlb2YgYyljLmNhbGwodGhpcyx0aGlzLmNvbnRleHQpO2Vsc2Ugc3dpdGNoKHRoaXMuc2hhcGUpe2Nhc2Ugci5DaXJjbGU6dGhpcy5jb250ZXh0LmJlZ2luUGF0aCgpLHRoaXMuY29udGV4dC5hcmMoMCwwLHRoaXMucmFkaXVzLDAsMipNYXRoLlBJKSx0aGlzLmNvbnRleHQuZmlsbCgpO2JyZWFrO2Nhc2Ugci5TcXVhcmU6dGhpcy5jb250ZXh0LmZpbGxSZWN0KC10aGlzLncvMiwtdGhpcy5oLzIsdGhpcy53LHRoaXMuaCk7YnJlYWs7Y2FzZSByLlN0cmlwOnRoaXMuY29udGV4dC5maWxsUmVjdCgtdGhpcy53LzYsLXRoaXMuaC8yLHRoaXMudy8zLHRoaXMuaCl9dGhpcy5jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuY29udGV4dC5yZXN0b3JlKCl9fV0pJiZmKGUucHJvdG90eXBlLG4pLG8mJmYoZSxvKSx0fSgpO2Z1bmN0aW9uIHAodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fXZhciB2PWZ1bmN0aW9uIHQoZSxuKXt2YXIgcj10aGlzOyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsdCkscCh0aGlzLFwiY2FudmFzXCIsdm9pZCAwKSxwKHRoaXMsXCJjb250ZXh0XCIsdm9pZCAwKSxwKHRoaXMsXCJnZXRPcHRpb25zXCIsdm9pZCAwKSxwKHRoaXMsXCJ4XCIsMCkscCh0aGlzLFwieVwiLDApLHAodGhpcyxcIndcIiwwKSxwKHRoaXMsXCJoXCIsMCkscCh0aGlzLFwibGFzdE51bWJlck9mUGllY2VzXCIsMCkscCh0aGlzLFwidHdlZW5Jbml0VGltZVwiLERhdGUubm93KCkpLHAodGhpcyxcInBhcnRpY2xlc1wiLFtdKSxwKHRoaXMsXCJwYXJ0aWNsZXNHZW5lcmF0ZWRcIiwwKSxwKHRoaXMsXCJyZW1vdmVQYXJ0aWNsZUF0XCIsKGZ1bmN0aW9uKHQpe3IucGFydGljbGVzLnNwbGljZSh0LDEpfSkpLHAodGhpcyxcImdldFBhcnRpY2xlXCIsKGZ1bmN0aW9uKCl7dmFyIHQ9dShyLngsci53K3IueCksZT11KHIueSxyLmgrci55KTtyZXR1cm4gbmV3IGwoci5jb250ZXh0LHIuZ2V0T3B0aW9ucyx0LGUpfSkpLHAodGhpcyxcImFuaW1hdGVcIiwoZnVuY3Rpb24oKXt2YXIgdD1yLmNhbnZhcyxlPXIuY29udGV4dCxuPXIucGFydGljbGVzR2VuZXJhdGVkLGk9ci5sYXN0TnVtYmVyT2ZQaWVjZXMsbz1yLmdldE9wdGlvbnMoKSxhPW8ucnVuLGM9by5yZWN5Y2xlLHM9by5udW1iZXJPZlBpZWNlcyx1PW8uZGVidWcsZj1vLnR3ZWVuRnVuY3Rpb24saD1vLnR3ZWVuRHVyYXRpb247aWYoIWEpcmV0dXJuITE7dmFyIGw9ci5wYXJ0aWNsZXMubGVuZ3RoLHA9Yz9sOm4sdj1EYXRlLm5vdygpO2lmKHA8cyl7aSE9PXMmJihyLnR3ZWVuSW5pdFRpbWU9dixyLmxhc3ROdW1iZXJPZlBpZWNlcz1zKTtmb3IodmFyIHk9ci50d2VlbkluaXRUaW1lLGQ9Zih2LXk+aD9oOk1hdGgubWF4KDAsdi15KSxwLHMsaCksYj1NYXRoLnJvdW5kKGQtcCksZz0wO2c8YjtnKyspci5wYXJ0aWNsZXMucHVzaChyLmdldFBhcnRpY2xlKCkpO3IucGFydGljbGVzR2VuZXJhdGVkKz1ifXJldHVybiB1JiYoZS5mb250PVwiMTJweCBzYW5zLXNlcmlmXCIsZS5maWxsU3R5bGU9XCIjMzMzXCIsZS50ZXh0QWxpZ249XCJyaWdodFwiLGUuZmlsbFRleHQoXCJQYXJ0aWNsZXM6IFwiLmNvbmNhdChsKSx0LndpZHRoLTEwLHQuaGVpZ2h0LTIwKSksci5wYXJ0aWNsZXMuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXtlLnVwZGF0ZSgpLChlLnk+dC5oZWlnaHR8fGUueTwtMTAwfHxlLng+dC53aWR0aCsxMDB8fGUueDwtMTAwKSYmKGMmJnA8PXM/ci5wYXJ0aWNsZXNbbl09ci5nZXRQYXJ0aWNsZSgpOnIucmVtb3ZlUGFydGljbGVBdChuKSl9KSksbD4wfHxwPHN9KSksdGhpcy5jYW52YXM9ZTt2YXIgaT10aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7aWYoIWkpdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGdldCBjYW52YXMgY29udGV4dFwiKTt0aGlzLmNvbnRleHQ9aSx0aGlzLmdldE9wdGlvbnM9bn07ZnVuY3Rpb24geSh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gZCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj95KE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Zyh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6eShPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBiKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBnKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH12YXIgTz17d2lkdGg6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3cuaW5uZXJXaWR0aDozMDAsaGVpZ2h0OlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93LmlubmVySGVpZ2h0OjIwMCxudW1iZXJPZlBpZWNlczoyMDAsZnJpY3Rpb246Ljk5LHdpbmQ6MCxncmF2aXR5Oi4xLGluaXRpYWxWZWxvY2l0eVg6NCxpbml0aWFsVmVsb2NpdHlZOjEwLGNvbG9yczpbXCIjZjQ0MzM2XCIsXCIjZTkxZTYzXCIsXCIjOWMyN2IwXCIsXCIjNjczYWI3XCIsXCIjM2Y1MWI1XCIsXCIjMjE5NmYzXCIsXCIjMDNhOWY0XCIsXCIjMDBiY2Q0XCIsXCIjMDA5Njg4XCIsXCIjNENBRjUwXCIsXCIjOEJDMzRBXCIsXCIjQ0REQzM5XCIsXCIjRkZFQjNCXCIsXCIjRkZDMTA3XCIsXCIjRkY5ODAwXCIsXCIjRkY1NzIyXCIsXCIjNzk1NTQ4XCJdLG9wYWNpdHk6MSxkZWJ1ZzohMSx0d2VlbkZ1bmN0aW9uOnMuYS5lYXNlSW5PdXRRdWFkLHR3ZWVuRHVyYXRpb246NWUzLHJlY3ljbGU6ITAscnVuOiEwfSx3PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe3ZhciByPXRoaXM7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0odGhpcyx0KSxnKHRoaXMsXCJjYW52YXNcIix2b2lkIDApLGcodGhpcyxcImNvbnRleHRcIix2b2lkIDApLGcodGhpcyxcIl9vcHRpb25zXCIsdm9pZCAwKSxnKHRoaXMsXCJnZW5lcmF0b3JcIix2b2lkIDApLGcodGhpcyxcInJhZklkXCIsdm9pZCAwKSxnKHRoaXMsXCJzZXRPcHRpb25zV2l0aERlZmF1bHRzXCIsKGZ1bmN0aW9uKHQpe3ZhciBlPXtjb25mZXR0aVNvdXJjZTp7eDowLHk6MCx3OnIuY2FudmFzLndpZHRoLGg6MH19O3IuX29wdGlvbnM9ZChkKGQoe30sZSksTyksdCksT2JqZWN0LmFzc2lnbihyLHQuY29uZmV0dGlTb3VyY2UpfSkpLGcodGhpcyxcInVwZGF0ZVwiLChmdW5jdGlvbigpe3ZhciB0PXIub3B0aW9ucyxlPXQucnVuLG49dC5vbkNvbmZldHRpQ29tcGxldGUsaT1yLmNhbnZhcyxvPXIuY29udGV4dDtlJiYoby5maWxsU3R5bGU9XCJ3aGl0ZVwiLG8uY2xlYXJSZWN0KDAsMCxpLndpZHRoLGkuaGVpZ2h0KSksci5nZW5lcmF0b3IuYW5pbWF0ZSgpP3IucmFmSWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIudXBkYXRlKToobiYmXCJmdW5jdGlvblwiPT10eXBlb2YgbiYmci5nZW5lcmF0b3IucGFydGljbGVzR2VuZXJhdGVkPjAmJm4uY2FsbChyLHIpLHIuX29wdGlvbnMucnVuPSExKX0pKSxnKHRoaXMsXCJyZXNldFwiLChmdW5jdGlvbigpe3IuZ2VuZXJhdG9yJiZyLmdlbmVyYXRvci5wYXJ0aWNsZXNHZW5lcmF0ZWQ+MCYmKHIuZ2VuZXJhdG9yLnBhcnRpY2xlc0dlbmVyYXRlZD0wLHIuZ2VuZXJhdG9yLnBhcnRpY2xlcz1bXSxyLmdlbmVyYXRvci5sYXN0TnVtYmVyT2ZQaWVjZXM9MCl9KSksZyh0aGlzLFwic3RvcFwiLChmdW5jdGlvbigpe3Iub3B0aW9ucz17cnVuOiExfSxyLnJhZklkJiYoY2FuY2VsQW5pbWF0aW9uRnJhbWUoci5yYWZJZCksci5yYWZJZD12b2lkIDApfSkpLHRoaXMuY2FudmFzPWU7dmFyIGk9dGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO2lmKCFpKXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBnZXQgY2FudmFzIGNvbnRleHRcIik7dGhpcy5jb250ZXh0PWksdGhpcy5nZW5lcmF0b3I9bmV3IHYodGhpcy5jYW52YXMsKGZ1bmN0aW9uKCl7cmV0dXJuIHIub3B0aW9uc30pKSx0aGlzLm9wdGlvbnM9bix0aGlzLnVwZGF0ZSgpfXZhciBlLG4scjtyZXR1cm4gZT10LChuPVt7a2V5Olwib3B0aW9uc1wiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcHRpb25zfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5ydW4sbj10aGlzLl9vcHRpb25zJiZ0aGlzLl9vcHRpb25zLnJlY3ljbGU7dGhpcy5zZXRPcHRpb25zV2l0aERlZmF1bHRzKHQpLHRoaXMuZ2VuZXJhdG9yJiYoT2JqZWN0LmFzc2lnbih0aGlzLmdlbmVyYXRvcix0aGlzLm9wdGlvbnMuY29uZmV0dGlTb3VyY2UpLFwiYm9vbGVhblwiPT10eXBlb2YgdC5yZWN5Y2xlJiZ0LnJlY3ljbGUmJiExPT09biYmKHRoaXMuZ2VuZXJhdG9yLmxhc3ROdW1iZXJPZlBpZWNlcz10aGlzLmdlbmVyYXRvci5wYXJ0aWNsZXMubGVuZ3RoKSksXCJib29sZWFuXCI9PXR5cGVvZiB0LnJ1biYmdC5ydW4mJiExPT09ZSYmdGhpcy51cGRhdGUoKX19XSkmJmIoZS5wcm90b3R5cGUsbiksciYmYihlLHIpLHR9KCk7ZnVuY3Rpb24gbSh0KXtyZXR1cm4gZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gQyh0KX0odCl8fGZ1bmN0aW9uKHQpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpcmV0dXJuIEFycmF5LmZyb20odCl9KHQpfHxTKHQpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfSgpfWZ1bmN0aW9uIHgodCl7cmV0dXJuKHg9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIFAoKXtyZXR1cm4oUD1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGoodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIE0odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/aihPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe1QodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOmooT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gSSh0LGUpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fSh0KXx8ZnVuY3Rpb24odCxlKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpKXJldHVybjt2YXIgbj1bXSxyPSEwLGk9ITEsbz12b2lkIDA7dHJ5e2Zvcih2YXIgYSxjPXRbU3ltYm9sLml0ZXJhdG9yXSgpOyEocj0oYT1jLm5leHQoKSkuZG9uZSkmJihuLnB1c2goYS52YWx1ZSksIWV8fG4ubGVuZ3RoIT09ZSk7cj0hMCk7fWNhdGNoKHQpe2k9ITAsbz10fWZpbmFsbHl7dHJ5e3J8fG51bGw9PWMucmV0dXJufHxjLnJldHVybigpfWZpbmFsbHl7aWYoaSl0aHJvdyBvfX1yZXR1cm4gbn0odCxlKXx8Uyh0LGUpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gUyh0LGUpe2lmKHQpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXJldHVybiBDKHQsZSk7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO3JldHVyblwiT2JqZWN0XCI9PT1uJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLFwiTWFwXCI9PT1ufHxcIlNldFwiPT09bj9BcnJheS5mcm9tKHQpOlwiQXJndW1lbnRzXCI9PT1ufHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKT9DKHQsZSk6dm9pZCAwfX1mdW5jdGlvbiBDKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gRCh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gRSh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLmtleSxyKX19ZnVuY3Rpb24gXyh0LGUpe3JldHVybihfPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSkodCxlKX1mdW5jdGlvbiBSKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Rih0KTtpZihlKXt2YXIgaT1GKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBrKHRoaXMsbil9fWZ1bmN0aW9uIGsodCxlKXtyZXR1cm4hZXx8XCJvYmplY3RcIiE9PXgoZSkmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/QSh0KTplfWZ1bmN0aW9uIEEodCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9ZnVuY3Rpb24gRih0KXtyZXR1cm4oRj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gVCh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9dmFyIEI9YS5hLmNyZWF0ZVJlZigpLE49ZnVuY3Rpb24odCl7IWZ1bmN0aW9uKHQsZSl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZfKHQsZSl9KG8sdCk7dmFyIGUsbixyLGk9UihvKTtmdW5jdGlvbiBvKHQpe3ZhciBlO0QodGhpcyxvKTtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGM9MTtjPG47YysrKXJbYy0xXT1hcmd1bWVudHNbY107cmV0dXJuIFQoQShlPWkuY2FsbC5hcHBseShpLFt0aGlzLHRdLmNvbmNhdChyKSkpLFwiY2FudmFzXCIsYS5hLmNyZWF0ZVJlZigpKSxUKEEoZSksXCJjb25mZXR0aVwiLHZvaWQgMCksZS5jYW52YXM9dC5jYW52YXNSZWZ8fEIsZX1yZXR1cm4gZT1vLChuPVt7a2V5OlwiY29tcG9uZW50RGlkTW91bnRcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHRoaXMuY2FudmFzLmN1cnJlbnQpe3ZhciB0PXEodGhpcy5wcm9wcylbMF07dGhpcy5jb25mZXR0aT1uZXcgdyh0aGlzLmNhbnZhcy5jdXJyZW50LHQpfX19LHtrZXk6XCJjb21wb25lbnREaWRVcGRhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXEodGhpcy5wcm9wcylbMF07dGhpcy5jb25mZXR0aSYmKHRoaXMuY29uZmV0dGkub3B0aW9ucz10KX19LHtrZXk6XCJjb21wb25lbnRXaWxsVW5tb3VudFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jb25mZXR0aSYmdGhpcy5jb25mZXR0aS5zdG9wKCksdGhpcy5jb25mZXR0aT12b2lkIDB9fSx7a2V5OlwicmVuZGVyXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1JKHEodGhpcy5wcm9wcyksMiksZT10WzBdLG49dFsxXSxyPU0oe3pJbmRleDoyLHBvc2l0aW9uOlwiYWJzb2x1dGVcIixwb2ludGVyRXZlbnRzOlwibm9uZVwiLHRvcDowLGxlZnQ6MCxib3R0b206MCxyaWdodDowfSxuLnN0eWxlKTtyZXR1cm4gYS5hLmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIixQKHt3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodCxyZWY6dGhpcy5jYW52YXN9LG4se3N0eWxlOnJ9KSl9fV0pJiZFKGUucHJvdG90eXBlLG4pLHImJkUoZSxyKSxvfShvLkNvbXBvbmVudCk7ZnVuY3Rpb24gcSh0KXt2YXIgZT17fSxuPXt9LHI9W10uY29uY2F0KG0oT2JqZWN0LmtleXMoTykpLFtcImNvbmZldHRpU291cmNlXCIsXCJkcmF3U2hhcGVcIixcIm9uQ29uZmV0dGlDb21wbGV0ZVwiXSksaT1bXCJjYW52YXNSZWZcIl07Zm9yKHZhciBvIGluIHQpe3ZhciBhPXRbb107ci5pbmNsdWRlcyhvKT9lW29dPWE6aS5pbmNsdWRlcyhvKT9pW29dPWE6bltvXT1hfXJldHVybltlLG4se31dfVQoTixcImRlZmF1bHRQcm9wc1wiLE0oe30sTykpLFQoTixcImRpc3BsYXlOYW1lXCIsXCJSZWFjdENvbmZldHRpXCIpO3ZhciBRPWEuYS5mb3J3YXJkUmVmKChmdW5jdGlvbih0LGUpe3JldHVybiBhLmEuY3JlYXRlRWxlbWVudChOLFAoe2NhbnZhc1JlZjplfSx0KSl9KSk7ZS5kZWZhdWx0PVF9XSkuZGVmYXVsdH0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWN0LWNvbmZldHRpLm1pbi5qcy5tYXAiLCIvKiFcbiAgcmVhY3QtZGF0ZXBpY2tlciB2Ny4zLjBcbiAgaHR0cHM6Ly9naXRodWIuY29tL0hhY2tlcjB4MDEvcmVhY3QtZGF0ZXBpY2tlclxuICBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4qL1xuIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/dChleHBvcnRzLHJlcXVpcmUoXCJjbHN4XCIpLHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwicmVhY3Qtb25jbGlja291dHNpZGVcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZERheXNcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZEhvdXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRNaW51dGVzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRNb250aHNcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZFF1YXJ0ZXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRTZWNvbmRzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRXZWVrc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkWWVhcnNcIikscmVxdWlyZShcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNcIikscmVxdWlyZShcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnNcIikscmVxdWlyZShcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnNcIikscmVxdWlyZShcImRhdGUtZm5zL2VuZE9mRGF5XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9lbmRPZk1vbnRoXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9lbmRPZldlZWtcIikscmVxdWlyZShcImRhdGUtZm5zL2VuZE9mWWVhclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZm9ybWF0XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXREYXRlXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXREYXlcIikscmVxdWlyZShcImRhdGUtZm5zL2dldEhvdXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRJU09XZWVrXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRNaW51dGVzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRNb250aFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0UXVhcnRlclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0U2Vjb25kc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0VGltZVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0WWVhclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNBZnRlclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNCZWZvcmVcIikscmVxdWlyZShcImRhdGUtZm5zL2lzRGF0ZVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNFcXVhbFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNTYW1lRGF5XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc1NhbWVNb250aFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNTYW1lUXVhcnRlclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNTYW1lWWVhclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNWYWxpZFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNXaXRoaW5JbnRlcnZhbFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvbWF4XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9taW5cIikscmVxdWlyZShcImRhdGUtZm5zL3BhcnNlXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9wYXJzZUlTT1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc2V0XCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zZXRIb3Vyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc2V0TWludXRlc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc2V0TW9udGhcIikscmVxdWlyZShcImRhdGUtZm5zL3NldFF1YXJ0ZXJcIikscmVxdWlyZShcImRhdGUtZm5zL3NldFNlY29uZHNcIikscmVxdWlyZShcImRhdGUtZm5zL3NldFllYXJcIikscmVxdWlyZShcImRhdGUtZm5zL3N0YXJ0T2ZEYXlcIikscmVxdWlyZShcImRhdGUtZm5zL3N0YXJ0T2ZNb250aFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3RhcnRPZlF1YXJ0ZXJcIikscmVxdWlyZShcImRhdGUtZm5zL3N0YXJ0T2ZXZWVrXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdGFydE9mWWVhclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3ViRGF5c1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3ViTW9udGhzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdWJRdWFydGVyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3ViV2Vla3NcIikscmVxdWlyZShcImRhdGUtZm5zL3N1YlllYXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy90b0RhdGVcIikscmVxdWlyZShcIkBmbG9hdGluZy11aS9yZWFjdFwiKSxyZXF1aXJlKFwicmVhY3QtZG9tXCIpKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImV4cG9ydHNcIixcImNsc3hcIixcInJlYWN0XCIsXCJyZWFjdC1vbmNsaWNrb3V0c2lkZVwiLFwiZGF0ZS1mbnMvYWRkRGF5c1wiLFwiZGF0ZS1mbnMvYWRkSG91cnNcIixcImRhdGUtZm5zL2FkZE1pbnV0ZXNcIixcImRhdGUtZm5zL2FkZE1vbnRoc1wiLFwiZGF0ZS1mbnMvYWRkUXVhcnRlcnNcIixcImRhdGUtZm5zL2FkZFNlY29uZHNcIixcImRhdGUtZm5zL2FkZFdlZWtzXCIsXCJkYXRlLWZucy9hZGRZZWFyc1wiLFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzXCIsXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoc1wiLFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyc1wiLFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFyc1wiLFwiZGF0ZS1mbnMvZW5kT2ZEYXlcIixcImRhdGUtZm5zL2VuZE9mTW9udGhcIixcImRhdGUtZm5zL2VuZE9mV2Vla1wiLFwiZGF0ZS1mbnMvZW5kT2ZZZWFyXCIsXCJkYXRlLWZucy9mb3JtYXRcIixcImRhdGUtZm5zL2dldERhdGVcIixcImRhdGUtZm5zL2dldERheVwiLFwiZGF0ZS1mbnMvZ2V0SG91cnNcIixcImRhdGUtZm5zL2dldElTT1dlZWtcIixcImRhdGUtZm5zL2dldE1pbnV0ZXNcIixcImRhdGUtZm5zL2dldE1vbnRoXCIsXCJkYXRlLWZucy9nZXRRdWFydGVyXCIsXCJkYXRlLWZucy9nZXRTZWNvbmRzXCIsXCJkYXRlLWZucy9nZXRUaW1lXCIsXCJkYXRlLWZucy9nZXRZZWFyXCIsXCJkYXRlLWZucy9pc0FmdGVyXCIsXCJkYXRlLWZucy9pc0JlZm9yZVwiLFwiZGF0ZS1mbnMvaXNEYXRlXCIsXCJkYXRlLWZucy9pc0VxdWFsXCIsXCJkYXRlLWZucy9pc1NhbWVEYXlcIixcImRhdGUtZm5zL2lzU2FtZU1vbnRoXCIsXCJkYXRlLWZucy9pc1NhbWVRdWFydGVyXCIsXCJkYXRlLWZucy9pc1NhbWVZZWFyXCIsXCJkYXRlLWZucy9pc1ZhbGlkXCIsXCJkYXRlLWZucy9pc1dpdGhpbkludGVydmFsXCIsXCJkYXRlLWZucy9tYXhcIixcImRhdGUtZm5zL21pblwiLFwiZGF0ZS1mbnMvcGFyc2VcIixcImRhdGUtZm5zL3BhcnNlSVNPXCIsXCJkYXRlLWZucy9zZXRcIixcImRhdGUtZm5zL3NldEhvdXJzXCIsXCJkYXRlLWZucy9zZXRNaW51dGVzXCIsXCJkYXRlLWZucy9zZXRNb250aFwiLFwiZGF0ZS1mbnMvc2V0UXVhcnRlclwiLFwiZGF0ZS1mbnMvc2V0U2Vjb25kc1wiLFwiZGF0ZS1mbnMvc2V0WWVhclwiLFwiZGF0ZS1mbnMvc3RhcnRPZkRheVwiLFwiZGF0ZS1mbnMvc3RhcnRPZk1vbnRoXCIsXCJkYXRlLWZucy9zdGFydE9mUXVhcnRlclwiLFwiZGF0ZS1mbnMvc3RhcnRPZldlZWtcIixcImRhdGUtZm5zL3N0YXJ0T2ZZZWFyXCIsXCJkYXRlLWZucy9zdWJEYXlzXCIsXCJkYXRlLWZucy9zdWJNb250aHNcIixcImRhdGUtZm5zL3N1YlF1YXJ0ZXJzXCIsXCJkYXRlLWZucy9zdWJXZWVrc1wiLFwiZGF0ZS1mbnMvc3ViWWVhcnNcIixcImRhdGUtZm5zL3RvRGF0ZVwiLFwiQGZsb2F0aW5nLXVpL3JlYWN0XCIsXCJyZWFjdC1kb21cIl0sdCk6dCgoZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOmV8fHNlbGYpLkRhdGVQaWNrZXI9e30sZS5jbHN4LGUuUmVhY3QsZS5vbkNsaWNrT3V0c2lkZSxlLmFkZERheXMsZS5hZGRIb3VycyxlLmFkZE1pbnV0ZXMsZS5hZGRNb250aHMsZS5hZGRRdWFydGVycyxlLmFkZFNlY29uZHMsZS5hZGRXZWVrcyxlLmFkZFllYXJzLGUuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLGUuZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMsZS5kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzLGUuZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyxlLmVuZE9mRGF5LGUuZW5kT2ZNb250aCxlLmVuZE9mV2VlayxlLmVuZE9mWWVhcixlLmZvcm1hdCxlLmdldERhdGUsZS5nZXREYXksZS5nZXRIb3VycyxlLmdldElTT1dlZWssZS5nZXRNaW51dGVzLGUuZ2V0TW9udGgsZS5nZXRRdWFydGVyLGUuZ2V0U2Vjb25kcyxlLmdldFRpbWUsZS5nZXRZZWFyLGUuaXNBZnRlcixlLmlzQmVmb3JlLGUuaXNEYXRlLGUuaXNFcXVhbCQxLGUuaXNTYW1lRGF5JDEsZS5pc1NhbWVNb250aCQxLGUuaXNTYW1lUXVhcnRlciQxLGUuaXNTYW1lWWVhciQxLGUuaXNWYWxpZCQxLGUuaXNXaXRoaW5JbnRlcnZhbCxlLm1heCxlLm1pbixlLnBhcnNlLGUucGFyc2VJU08sZS5zZXQsZS5zZXRIb3VycyxlLnNldE1pbnV0ZXMsZS5zZXRNb250aCxlLnNldFF1YXJ0ZXIsZS5zZXRTZWNvbmRzLGUuc2V0WWVhcixlLnN0YXJ0T2ZEYXksZS5zdGFydE9mTW9udGgsZS5zdGFydE9mUXVhcnRlcixlLnN0YXJ0T2ZXZWVrLGUuc3RhcnRPZlllYXIsZS5zdWJEYXlzLGUuc3ViTW9udGhzLGUuc3ViUXVhcnRlcnMsZS5zdWJXZWVrcyxlLnN1YlllYXJzLGUudG9EYXRlLGUucmVhY3QsZS5SZWFjdERPTSl9KHRoaXMsKGZ1bmN0aW9uKGUsdCxyLG4sYSxvLHMsaSxsLGMscCxkLHUsZixoLG0sdixnLEQseSxrLHcsUyxiLE0sQyxfLEUsUCxZLHgsTixPLEksVCxSLEwsQSxGLEgsVyxRLHEsSyxCLFYsaixVLCQseixYLEcsSixaLGVlLHRlLHJlLG5lLGFlLG9lLHNlLGllLGxlLGNlLHBlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkZShlKXtyZXR1cm4gZSYmXCJvYmplY3RcIj09dHlwZW9mIGUmJlwiZGVmYXVsdFwiaW4gZT9lOntkZWZhdWx0OmV9fXZhciB1ZT1kZShyKSxmZT1kZShuKSxoZT1kZShwZSksbWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbWU9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJihlW3JdPXRbcl0pfSxtZShlLHQpfTtmdW5jdGlvbiB2ZShlLHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiK1N0cmluZyh0KStcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO2Z1bmN0aW9uIHIoKXt0aGlzLmNvbnN0cnVjdG9yPWV9bWUoZSx0KSxlLnByb3RvdHlwZT1udWxsPT09dD9PYmplY3QuY3JlYXRlKHQpOihyLnByb3RvdHlwZT10LnByb3RvdHlwZSxuZXcgcil9dmFyIGdlPWZ1bmN0aW9uKCl7cmV0dXJuIGdlPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPTEsbj1hcmd1bWVudHMubGVuZ3RoO3I8bjtyKyspZm9yKHZhciBhIGluIHQ9YXJndW1lbnRzW3JdKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGEpJiYoZVthXT10W2FdKTtyZXR1cm4gZX0sZ2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtmdW5jdGlvbiBEZShlLHQscil7aWYocnx8Mj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBuLGE9MCxvPXQubGVuZ3RoO2E8bzthKyspIW4mJmEgaW4gdHx8KG58fChuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQsMCxhKSksblthXT10W2FdKTtyZXR1cm4gZS5jb25jYXQobnx8QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCkpfVwiZnVuY3Rpb25cIj09dHlwZW9mIFN1cHByZXNzZWRFcnJvciYmU3VwcHJlc3NlZEVycm9yO3ZhciB5ZSxrZT1mdW5jdGlvbihlKXt2YXIgdD1lLnNob3dUaW1lU2VsZWN0T25seSxyPXZvaWQgMCE9PXQmJnQsbj1lLnNob3dUaW1lLGE9dm9pZCAwIT09biYmbixvPWUuY2xhc3NOYW1lLHM9ZS5jaGlsZHJlbixpPXI/XCJDaG9vc2UgVGltZVwiOlwiQ2hvb3NlIERhdGVcIi5jb25jYXQoYT9cIiBhbmQgVGltZVwiOlwiXCIpO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOm8scm9sZTpcImRpYWxvZ1wiLFwiYXJpYS1sYWJlbFwiOmksXCJhcmlhLW1vZGFsXCI6XCJ0cnVlXCJ9LHMpfTtmdW5jdGlvbiB3ZSgpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Omdsb2JhbFRoaXN9IWZ1bmN0aW9uKGUpe2UuQXJyb3dVcD1cIkFycm93VXBcIixlLkFycm93RG93bj1cIkFycm93RG93blwiLGUuQXJyb3dMZWZ0PVwiQXJyb3dMZWZ0XCIsZS5BcnJvd1JpZ2h0PVwiQXJyb3dSaWdodFwiLGUuUGFnZVVwPVwiUGFnZVVwXCIsZS5QYWdlRG93bj1cIlBhZ2VEb3duXCIsZS5Ib21lPVwiSG9tZVwiLGUuRW5kPVwiRW5kXCIsZS5FbnRlcj1cIkVudGVyXCIsZS5TcGFjZT1cIiBcIixlLlRhYj1cIlRhYlwiLGUuRXNjYXBlPVwiRXNjYXBlXCIsZS5CYWNrc3BhY2U9XCJCYWNrc3BhY2VcIixlLlg9XCJ4XCJ9KHllfHwoeWU9e30pKTt2YXIgU2U9MTIsYmU9L1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7ZnVuY3Rpb24gTWUoZSl7aWYobnVsbD09ZSlyZXR1cm4gbmV3IERhdGU7dmFyIHQ9XCJzdHJpbmdcIj09dHlwZW9mIGU/Qi5wYXJzZUlTTyhlKTpsZS50b0RhdGUoZSk7cmV0dXJuIENlKHQpP3Q6bmV3IERhdGV9ZnVuY3Rpb24gQ2UoZSx0KXtyZXR1cm4gSC5pc1ZhbGlkKGUpJiYhTy5pc0JlZm9yZShlLG51bGwhPXQ/dDpuZXcgRGF0ZShcIjEvMS8xODAwXCIpKX1mdW5jdGlvbiBfZShlLHQscil7aWYoXCJlblwiPT09cilyZXR1cm4gay5mb3JtYXQoZSx0LHt1c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnM6ITAsdXNlQWRkaXRpb25hbERheU9mWWVhclRva2VuczohMH0pO3ZhciBuPXI/S2Uocik6dm9pZCAwO3JldHVybiByJiYhbiYmY29uc29sZS53YXJuKCdBIGxvY2FsZSBvYmplY3Qgd2FzIG5vdCBmb3VuZCBmb3IgdGhlIHByb3ZpZGVkIHN0cmluZyBbXCInLmNvbmNhdChyLCdcIl0uJykpLCFuJiZxZSgpJiZLZShxZSgpKSYmKG49S2UocWUoKSkpLGsuZm9ybWF0KGUsdCx7bG9jYWxlOm4sdXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zOiEwLHVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnM6ITB9KX1mdW5jdGlvbiBFZShlLHQpe3ZhciByPXQuZGF0ZUZvcm1hdCxuPXQubG9jYWxlLGE9QXJyYXkuaXNBcnJheShyKSYmci5sZW5ndGg+MD9yWzBdOnI7cmV0dXJuIGUmJl9lKGUsYSxuKXx8XCJcIn1mdW5jdGlvbiBQZShlLHQpe3ZhciByPXQuaG91cixuPXZvaWQgMD09PXI/MDpyLGE9dC5taW51dGUsbz12b2lkIDA9PT1hPzA6YSxzPXQuc2Vjb25kLGk9dm9pZCAwPT09cz8wOnM7cmV0dXJuIGouc2V0SG91cnMoVS5zZXRNaW51dGVzKFguc2V0U2Vjb25kcyhlLGkpLG8pLG4pfWZ1bmN0aW9uIFllKGUpe3JldHVybiBKLnN0YXJ0T2ZEYXkoZSl9ZnVuY3Rpb24geGUoZSx0LHIpe3ZhciBuPUtlKHR8fHFlKCkpO3JldHVybiB0ZS5zdGFydE9mV2VlayhlLHtsb2NhbGU6bix3ZWVrU3RhcnRzT246cn0pfWZ1bmN0aW9uIE5lKGUpe3JldHVybiBaLnN0YXJ0T2ZNb250aChlKX1mdW5jdGlvbiBPZShlKXtyZXR1cm4gcmUuc3RhcnRPZlllYXIoZSl9ZnVuY3Rpb24gSWUoZSl7cmV0dXJuIGVlLnN0YXJ0T2ZRdWFydGVyKGUpfWZ1bmN0aW9uIFRlKCl7cmV0dXJuIEouc3RhcnRPZkRheShNZSgpKX1mdW5jdGlvbiBSZShlKXtyZXR1cm4gdi5lbmRPZkRheShlKX1mdW5jdGlvbiBMZShlLHQpe3JldHVybiBlJiZ0P0YuaXNTYW1lWWVhcihlLHQpOiFlJiYhdH1mdW5jdGlvbiBBZShlLHQpe3JldHVybiBlJiZ0P0wuaXNTYW1lTW9udGgoZSx0KTohZSYmIXR9ZnVuY3Rpb24gRmUoZSx0KXtyZXR1cm4gZSYmdD9BLmlzU2FtZVF1YXJ0ZXIoZSx0KTohZSYmIXR9ZnVuY3Rpb24gSGUoZSx0KXtyZXR1cm4gZSYmdD9SLmlzU2FtZURheShlLHQpOiFlJiYhdH1mdW5jdGlvbiBXZShlLHQpe3JldHVybiBlJiZ0P1QuaXNFcXVhbChlLHQpOiFlJiYhdH1mdW5jdGlvbiBRZShlLHQscil7dmFyIG4sYT1KLnN0YXJ0T2ZEYXkodCksbz12LmVuZE9mRGF5KHIpO3RyeXtuPVcuaXNXaXRoaW5JbnRlcnZhbChlLHtzdGFydDphLGVuZDpvfSl9Y2F0Y2goZSl7bj0hMX1yZXR1cm4gbn1mdW5jdGlvbiBxZSgpe3JldHVybiB3ZSgpLl9fbG9jYWxlSWRfX31mdW5jdGlvbiBLZShlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSl7dmFyIHQ9d2UoKTtyZXR1cm4gdC5fX2xvY2FsZURhdGFfXz90Ll9fbG9jYWxlRGF0YV9fW2VdOnZvaWQgMH1yZXR1cm4gZX1mdW5jdGlvbiBCZShlLHQpe3JldHVybiBfZSgkLnNldE1vbnRoKE1lKCksZSksXCJMTExMXCIsdCl9ZnVuY3Rpb24gVmUoZSx0KXtyZXR1cm4gX2UoJC5zZXRNb250aChNZSgpLGUpLFwiTExMXCIsdCl9ZnVuY3Rpb24gamUoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLm1heERhdGUsbz1yLmV4Y2x1ZGVEYXRlcyxzPXIuZXhjbHVkZURhdGVJbnRlcnZhbHMsaT1yLmluY2x1ZGVEYXRlcyxsPXIuaW5jbHVkZURhdGVJbnRlcnZhbHMsYz1yLmZpbHRlckRhdGU7cmV0dXJuIHR0KGUse21pbkRhdGU6bixtYXhEYXRlOmF9KXx8byYmby5zb21lKChmdW5jdGlvbih0KXt2YXIgcjtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGU/SGUoZSx0KTpIZShlLG51bGwhPT0ocj10LmRhdGUpJiZ2b2lkIDAhPT1yP3I6bmV3IERhdGUpfSkpfHxzJiZzLnNvbWUoKGZ1bmN0aW9uKHQpe3ZhciByPXQuc3RhcnQsbj10LmVuZDtyZXR1cm4gVy5pc1dpdGhpbkludGVydmFsKGUse3N0YXJ0OnIsZW5kOm59KX0pKXx8aSYmIWkuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEhlKGUsdCl9KSl8fGwmJiFsLnNvbWUoKGZ1bmN0aW9uKHQpe3ZhciByPXQuc3RhcnQsbj10LmVuZDtyZXR1cm4gVy5pc1dpdGhpbkludGVydmFsKGUse3N0YXJ0OnIsZW5kOm59KX0pKXx8YyYmIWMoTWUoZSkpfHwhMX1mdW5jdGlvbiBVZShlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIuZXhjbHVkZURhdGVzLGE9ci5leGNsdWRlRGF0ZUludGVydmFscztyZXR1cm4gYSYmYS5sZW5ndGg+MD9hLnNvbWUoKGZ1bmN0aW9uKHQpe3ZhciByPXQuc3RhcnQsbj10LmVuZDtyZXR1cm4gVy5pc1dpdGhpbkludGVydmFsKGUse3N0YXJ0OnIsZW5kOm59KX0pKTpuJiZuLnNvbWUoKGZ1bmN0aW9uKHQpe3ZhciByO3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT9IZShlLHQpOkhlKGUsbnVsbCE9PShyPXQuZGF0ZSkmJnZvaWQgMCE9PXI/cjpuZXcgRGF0ZSl9KSl8fCExfWZ1bmN0aW9uICRlKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5tYXhEYXRlLG89ci5leGNsdWRlRGF0ZXMscz1yLmluY2x1ZGVEYXRlcyxpPXIuZmlsdGVyRGF0ZTtyZXR1cm4gdHQoZSx7bWluRGF0ZTpuP1ouc3RhcnRPZk1vbnRoKG4pOnZvaWQgMCxtYXhEYXRlOmE/Zy5lbmRPZk1vbnRoKGEpOnZvaWQgMH0pfHwobnVsbD09bz92b2lkIDA6by5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gQWUoZSx0IGluc3RhbmNlb2YgRGF0ZT90OnQuZGF0ZSl9KSkpfHxzJiYhcy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gQWUoZSx0KX0pKXx8aSYmIWkoTWUoZSkpfHwhMX1mdW5jdGlvbiB6ZShlLHQscixuKXt2YXIgYT14LmdldFllYXIoZSksbz1fLmdldE1vbnRoKGUpLHM9eC5nZXRZZWFyKHQpLGk9Xy5nZXRNb250aCh0KSxsPXguZ2V0WWVhcihuKTtyZXR1cm4gYT09PXMmJmE9PT1sP288PXImJnI8PWk6YTxzJiYobD09PWEmJm88PXJ8fGw9PT1zJiZpPj1yfHxsPHMmJmw+YSl9ZnVuY3Rpb24gWGUoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLm1heERhdGUsbz1yLmV4Y2x1ZGVEYXRlcyxzPXIuaW5jbHVkZURhdGVzO3JldHVybiB0dChlLHttaW5EYXRlOm4sbWF4RGF0ZTphfSl8fG8mJm8uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEFlKHQgaW5zdGFuY2VvZiBEYXRlP3Q6dC5kYXRlLGUpfSkpfHxzJiYhcy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gQWUodCxlKX0pKXx8ITF9ZnVuY3Rpb24gR2UoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLm1heERhdGUsbz1yLmV4Y2x1ZGVEYXRlcyxzPXIuaW5jbHVkZURhdGVzLGk9ci5maWx0ZXJEYXRlO3JldHVybiB0dChlLHttaW5EYXRlOm4sbWF4RGF0ZTphfSl8fChudWxsPT1vP3ZvaWQgMDpvLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBGZShlLHQgaW5zdGFuY2VvZiBEYXRlP3Q6dC5kYXRlKX0pKSl8fHMmJiFzLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBGZShlLHQpfSkpfHxpJiYhaShNZShlKSl8fCExfWZ1bmN0aW9uIEplKGUsdCxyKXtpZighdHx8IXIpcmV0dXJuITE7aWYoIUguaXNWYWxpZCh0KXx8IUguaXNWYWxpZChyKSlyZXR1cm4hMTt2YXIgbj14LmdldFllYXIodCksYT14LmdldFllYXIocik7cmV0dXJuIG48PWUmJmE+PWV9ZnVuY3Rpb24gWmUoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLm1heERhdGUsbz1yLmV4Y2x1ZGVEYXRlcyxzPXIuaW5jbHVkZURhdGVzLGk9ci5maWx0ZXJEYXRlLGw9bmV3IERhdGUoZSwwLDEpO3JldHVybiB0dChsLHttaW5EYXRlOm4/cmUuc3RhcnRPZlllYXIobik6dm9pZCAwLG1heERhdGU6YT95LmVuZE9mWWVhcihhKTp2b2lkIDB9KXx8KG51bGw9PW8/dm9pZCAwOm8uc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIExlKGwsZSBpbnN0YW5jZW9mIERhdGU/ZTplLmRhdGUpfSkpKXx8cyYmIXMuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIExlKGwsZSl9KSl8fGkmJiFpKE1lKGwpKXx8ITF9ZnVuY3Rpb24gZXQoZSx0LHIsbil7dmFyIGE9eC5nZXRZZWFyKGUpLG89RS5nZXRRdWFydGVyKGUpLHM9eC5nZXRZZWFyKHQpLGk9RS5nZXRRdWFydGVyKHQpLGw9eC5nZXRZZWFyKG4pO3JldHVybiBhPT09cyYmYT09PWw/bzw9ciYmcjw9aTphPHMmJihsPT09YSYmbzw9cnx8bD09PXMmJmk+PXJ8fGw8cyYmbD5hKX1mdW5jdGlvbiB0dChlLHQpe3ZhciByLG49dm9pZCAwPT09dD97fTp0LGE9bi5taW5EYXRlLG89bi5tYXhEYXRlO3JldHVybiBudWxsIT09KHI9YSYmdS5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSxhKTwwfHxvJiZ1LmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLG8pPjApJiZ2b2lkIDAhPT1yJiZyfWZ1bmN0aW9uIHJ0KGUsdCl7cmV0dXJuIHQuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGIuZ2V0SG91cnModCk9PT1iLmdldEhvdXJzKGUpJiZDLmdldE1pbnV0ZXModCk9PT1DLmdldE1pbnV0ZXMoZSkmJlAuZ2V0U2Vjb25kcyh0KT09PVAuZ2V0U2Vjb25kcyhlKX0pKX1mdW5jdGlvbiBudChlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIuZXhjbHVkZVRpbWVzLGE9ci5pbmNsdWRlVGltZXMsbz1yLmZpbHRlclRpbWU7cmV0dXJuIG4mJnJ0KGUsbil8fGEmJiFydChlLGEpfHxvJiYhbyhlKXx8ITF9ZnVuY3Rpb24gYXQoZSx0KXt2YXIgcj10Lm1pblRpbWUsbj10Lm1heFRpbWU7aWYoIXJ8fCFuKXRocm93IG5ldyBFcnJvcihcIkJvdGggbWluVGltZSBhbmQgbWF4VGltZSBwcm9wcyByZXF1aXJlZFwiKTt2YXIgYT1NZSgpO2E9ai5zZXRIb3VycyhhLGIuZ2V0SG91cnMoZSkpLGE9VS5zZXRNaW51dGVzKGEsQy5nZXRNaW51dGVzKGUpKSxhPVguc2V0U2Vjb25kcyhhLFAuZ2V0U2Vjb25kcyhlKSk7dmFyIG89TWUoKTtvPWouc2V0SG91cnMobyxiLmdldEhvdXJzKHIpKSxvPVUuc2V0TWludXRlcyhvLEMuZ2V0TWludXRlcyhyKSksbz1YLnNldFNlY29uZHMobyxQLmdldFNlY29uZHMocikpO3ZhciBzLGk9TWUoKTtpPWouc2V0SG91cnMoaSxiLmdldEhvdXJzKG4pKSxpPVUuc2V0TWludXRlcyhpLEMuZ2V0TWludXRlcyhuKSksaT1YLnNldFNlY29uZHMoaSxQLmdldFNlY29uZHMobikpO3RyeXtzPSFXLmlzV2l0aGluSW50ZXJ2YWwoYSx7c3RhcnQ6byxlbmQ6aX0pfWNhdGNoKGUpe3M9ITF9cmV0dXJuIHN9ZnVuY3Rpb24gb3QoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLmluY2x1ZGVEYXRlcyxvPWFlLnN1Yk1vbnRocyhlLDEpO3JldHVybiBuJiZmLmRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKG4sbyk+MHx8YSYmYS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIGYuZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoZSxvKT4wfSkpfHwhMX1mdW5jdGlvbiBzdChlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWF4RGF0ZSxhPXIuaW5jbHVkZURhdGVzLG89aS5hZGRNb250aHMoZSwxKTtyZXR1cm4gbiYmZi5kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhvLG4pPjB8fGEmJmEuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBmLmRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKG8sZSk+MH0pKXx8ITF9ZnVuY3Rpb24gaXQoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLmluY2x1ZGVEYXRlcyxvPWllLnN1YlllYXJzKGUsMSk7cmV0dXJuIG4mJm0uZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhuLG8pPjB8fGEmJmEuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBtLmRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMoZSxvKT4wfSkpfHwhMX1mdW5jdGlvbiBsdChlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWF4RGF0ZSxhPXIuaW5jbHVkZURhdGVzLG89ZC5hZGRZZWFycyhlLDEpO3JldHVybiBuJiZtLmRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobyxuKT4wfHxhJiZhLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gbS5kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKG8sZSk+MH0pKXx8ITF9ZnVuY3Rpb24gY3QoZSl7dmFyIHQ9ZS5taW5EYXRlLHI9ZS5pbmNsdWRlRGF0ZXM7aWYociYmdCl7dmFyIG49ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiB1LmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLHQpPj0wfSkpO3JldHVybiBxLm1pbihuKX1yZXR1cm4gcj9xLm1pbihyKTp0fWZ1bmN0aW9uIHB0KGUpe3ZhciB0PWUubWF4RGF0ZSxyPWUuaW5jbHVkZURhdGVzO2lmKHImJnQpe3ZhciBuPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gdS5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZSx0KTw9MH0pKTtyZXR1cm4gUS5tYXgobil9cmV0dXJuIHI/US5tYXgocik6dH1mdW5jdGlvbiBkdChlLHQpe3ZhciByO3ZvaWQgMD09PWUmJihlPVtdKSx2b2lkIDA9PT10JiYodD1cInJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWRcIik7Zm9yKHZhciBuPW5ldyBNYXAsYT0wLG89ZS5sZW5ndGg7YTxvO2ErKyl7dmFyIHM9ZVthXTtpZihJLmlzRGF0ZShzKSl7dmFyIGk9X2UocyxcIk1NLmRkLnl5eXlcIik7KGY9bi5nZXQoaSl8fFtdKS5pbmNsdWRlcyh0KXx8KGYucHVzaCh0KSxuLnNldChpLGYpKX1lbHNlIGlmKFwib2JqZWN0XCI9PXR5cGVvZiBzKXt2YXIgbD1udWxsIT09KHI9T2JqZWN0LmtleXMocylbMF0pJiZ2b2lkIDAhPT1yP3I6XCJcIixjPXNbbF07aWYoXCJzdHJpbmdcIj09dHlwZW9mIGwmJkFycmF5LmlzQXJyYXkoYykpZm9yKHZhciBwPTAsZD1jLmxlbmd0aDtwPGQ7cCsrKXt2YXIgdT1jW3BdO2lmKHUpe3ZhciBmO2k9X2UodSxcIk1NLmRkLnl5eXlcIik7KGY9bi5nZXQoaSl8fFtdKS5pbmNsdWRlcyhsKXx8KGYucHVzaChsKSxuLnNldChpLGYpKX19fX1yZXR1cm4gbn1mdW5jdGlvbiB1dChlLHQpe3ZvaWQgMD09PWUmJihlPVtdKSx2b2lkIDA9PT10JiYodD1cInJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXNcIik7dmFyIHI9bmV3IE1hcDtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLmRhdGUsYT1lLmhvbGlkYXlOYW1lO2lmKEkuaXNEYXRlKG4pKXt2YXIgbz1fZShuLFwiTU0uZGQueXl5eVwiKSxzPXIuZ2V0KG8pfHx7Y2xhc3NOYW1lOlwiXCIsaG9saWRheU5hbWVzOltdfTtpZighKFwiY2xhc3NOYW1lXCJpbiBzKXx8cy5jbGFzc05hbWUhPT10fHwoaT1zLmhvbGlkYXlOYW1lcyxsPVthXSxpLmxlbmd0aCE9PWwubGVuZ3RofHwhaS5ldmVyeSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PWxbdF19KSkpKXt2YXIgaSxsO3MuY2xhc3NOYW1lPXQ7dmFyIGM9cy5ob2xpZGF5TmFtZXM7cy5ob2xpZGF5TmFtZXM9Yz9EZShEZShbXSxjLCEwKSxbYV0sITEpOlthXSxyLnNldChvLHMpfX19KSkscn1mdW5jdGlvbiBmdChlLHQscixuLGEpe2Zvcih2YXIgaT1hLmxlbmd0aCxsPVtdLHA9MDtwPGk7cCsrKXt2YXIgZD1lLHU9YVtwXTt1JiYoZD1vLmFkZEhvdXJzKGQsYi5nZXRIb3Vycyh1KSksZD1zLmFkZE1pbnV0ZXMoZCxDLmdldE1pbnV0ZXModSkpLGQ9Yy5hZGRTZWNvbmRzKGQsUC5nZXRTZWNvbmRzKHUpKSk7dmFyIGY9cy5hZGRNaW51dGVzKGUsKHIrMSkqbik7Ti5pc0FmdGVyKGQsdCkmJk8uaXNCZWZvcmUoZCxmKSYmbnVsbCE9dSYmbC5wdXNoKHUpfXJldHVybiBsfWZ1bmN0aW9uIGh0KGUpe3JldHVybiBlPDEwP1wiMFwiLmNvbmNhdChlKTpcIlwiLmNvbmNhdChlKX1mdW5jdGlvbiBtdChlLHQpe3ZvaWQgMD09PXQmJih0PVNlKTt2YXIgcj1NYXRoLmNlaWwoeC5nZXRZZWFyKGUpL3QpKnQ7cmV0dXJue3N0YXJ0UGVyaW9kOnItKHQtMSksZW5kUGVyaW9kOnJ9fWZ1bmN0aW9uIHZ0KGUpe3ZhciB0PWUuZ2V0U2Vjb25kcygpLHI9ZS5nZXRNaWxsaXNlY29uZHMoKTtyZXR1cm4gbGUudG9EYXRlKGUuZ2V0VGltZSgpLTFlMyp0LXIpfWZ1bmN0aW9uIGd0KGUpe2lmKCFJLmlzRGF0ZShlKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRhdGVcIik7dmFyIHQ9bmV3IERhdGUoZSk7cmV0dXJuIHQuc2V0SG91cnMoMCwwLDAsMCksdH1mdW5jdGlvbiBEdChlLHQpe2lmKCFJLmlzRGF0ZShlKXx8IUkuaXNEYXRlKHQpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGF0ZSByZWNlaXZlZFwiKTt2YXIgcj1ndChlKSxuPWd0KHQpO3JldHVybiBPLmlzQmVmb3JlKHIsbil9ZnVuY3Rpb24geXQoZSl7cmV0dXJuIGUua2V5PT09eWUuU3BhY2V9dmFyIGt0LHd0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIG4ub25UaW1lQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0LHI7bi5zZXRTdGF0ZSh7dGltZTplfSk7dmFyIGE9bi5wcm9wcy5kYXRlLG89YSBpbnN0YW5jZW9mIERhdGUmJiFpc05hTigrYSk/YTpuZXcgRGF0ZTtpZihudWxsPT1lP3ZvaWQgMDplLmluY2x1ZGVzKFwiOlwiKSl7dmFyIHM9ZS5zcGxpdChcIjpcIiksaT1zWzBdLGw9c1sxXTtvLnNldEhvdXJzKE51bWJlcihpKSksby5zZXRNaW51dGVzKE51bWJlcihsKSl9bnVsbD09PShyPSh0PW4ucHJvcHMpLm9uQ2hhbmdlKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsbyl9LG4ucmVuZGVyVGltZUlucHV0PWZ1bmN0aW9uKCl7dmFyIGU9bi5zdGF0ZS50aW1lLHQ9bi5wcm9wcyxhPXQuZGF0ZSxvPXQudGltZVN0cmluZyxzPXQuY3VzdG9tVGltZUlucHV0O3JldHVybiBzP3IuY2xvbmVFbGVtZW50KHMse2RhdGU6YSx2YWx1ZTplLG9uQ2hhbmdlOm4ub25UaW1lQ2hhbmdlfSk6dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIix7dHlwZTpcInRpbWVcIixjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0XCIscGxhY2Vob2xkZXI6XCJUaW1lXCIsbmFtZTpcInRpbWUtaW5wdXRcIixyZXF1aXJlZDohMCx2YWx1ZTplLG9uQ2hhbmdlOmZ1bmN0aW9uKGUpe24ub25UaW1lQ2hhbmdlKGUudGFyZ2V0LnZhbHVlfHxvKX19KX0sbi5zdGF0ZT17dGltZTpuLnByb3BzLnRpbWVTdHJpbmd9LG59cmV0dXJuIHZlKHQsZSksdC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50aW1lU3RyaW5nIT09dC50aW1lP3t0aW1lOmUudGltZVN0cmluZ306bnVsbH0sdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lclwifSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlci10aW1lX19jYXB0aW9uXCJ9LHRoaXMucHJvcHMudGltZUlucHV0TGFiZWwpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lclwifSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dFwifSx0aGlzLnJlbmRlclRpbWVJbnB1dCgpKSkpfSx0fShyLkNvbXBvbmVudCksU3Q9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe3ZhciBuPW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi5kYXlFbD1yLmNyZWF0ZVJlZigpLG4uaGFuZGxlQ2xpY2s9ZnVuY3Rpb24oZSl7IW4uaXNEaXNhYmxlZCgpJiZuLnByb3BzLm9uQ2xpY2smJm4ucHJvcHMub25DbGljayhlKX0sbi5oYW5kbGVNb3VzZUVudGVyPWZ1bmN0aW9uKGUpeyFuLmlzRGlzYWJsZWQoKSYmbi5wcm9wcy5vbk1vdXNlRW50ZXImJm4ucHJvcHMub25Nb3VzZUVudGVyKGUpfSxuLmhhbmRsZU9uS2V5RG93bj1mdW5jdGlvbihlKXt2YXIgdCxyO2Uua2V5PT09eWUuU3BhY2UmJihlLnByZXZlbnREZWZhdWx0KCksZS5rZXk9eWUuRW50ZXIpLG51bGw9PT0ocj0odD1uLnByb3BzKS5oYW5kbGVPbktleURvd24pfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKX0sbi5pc1NhbWVEYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIEhlKG4ucHJvcHMuZGF5LGUpfSxuLmlzS2V5Ym9hcmRTZWxlY3RlZD1mdW5jdGlvbigpe3ZhciBlO2lmKG4ucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24pcmV0dXJuITE7dmFyIHQ9bi5wcm9wcy5zZWxlY3RzTXVsdGlwbGU/bnVsbD09PShlPW4ucHJvcHMuc2VsZWN0ZWREYXRlcyl8fHZvaWQgMD09PWU/dm9pZCAwOmUuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIG4uaXNTYW1lRGF5T3JXZWVrKGUpfSkpOm4uaXNTYW1lRGF5T3JXZWVrKG4ucHJvcHMuc2VsZWN0ZWQpLHI9bi5wcm9wcy5wcmVTZWxlY3Rpb24mJm4uaXNEaXNhYmxlZChuLnByb3BzLnByZVNlbGVjdGlvbik7cmV0dXJuIXQmJm4uaXNTYW1lRGF5T3JXZWVrKG4ucHJvcHMucHJlU2VsZWN0aW9uKSYmIXJ9LG4uaXNEaXNhYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bi5wcm9wcy5kYXkpLGplKGUse21pbkRhdGU6bi5wcm9wcy5taW5EYXRlLG1heERhdGU6bi5wcm9wcy5tYXhEYXRlLGV4Y2x1ZGVEYXRlczpuLnByb3BzLmV4Y2x1ZGVEYXRlcyxleGNsdWRlRGF0ZUludGVydmFsczpuLnByb3BzLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzLGluY2x1ZGVEYXRlSW50ZXJ2YWxzOm4ucHJvcHMuaW5jbHVkZURhdGVJbnRlcnZhbHMsaW5jbHVkZURhdGVzOm4ucHJvcHMuaW5jbHVkZURhdGVzLGZpbHRlckRhdGU6bi5wcm9wcy5maWx0ZXJEYXRlfSl9LG4uaXNFeGNsdWRlZD1mdW5jdGlvbigpe3JldHVybiBVZShuLnByb3BzLmRheSx7ZXhjbHVkZURhdGVzOm4ucHJvcHMuZXhjbHVkZURhdGVzLGV4Y2x1ZGVEYXRlSW50ZXJ2YWxzOm4ucHJvcHMuZXhjbHVkZURhdGVJbnRlcnZhbHN9KX0sbi5pc1N0YXJ0T2ZXZWVrPWZ1bmN0aW9uKCl7cmV0dXJuIEhlKG4ucHJvcHMuZGF5LHhlKG4ucHJvcHMuZGF5LG4ucHJvcHMubG9jYWxlLG4ucHJvcHMuY2FsZW5kYXJTdGFydERheSkpfSxuLmlzU2FtZVdlZWs9ZnVuY3Rpb24oZSl7cmV0dXJuIG4ucHJvcHMuc2hvd1dlZWtQaWNrZXImJkhlKGUseGUobi5wcm9wcy5kYXksbi5wcm9wcy5sb2NhbGUsbi5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KSl9LG4uaXNTYW1lRGF5T3JXZWVrPWZ1bmN0aW9uKGUpe3JldHVybiBuLmlzU2FtZURheShlKXx8bi5pc1NhbWVXZWVrKGUpfSxuLmdldEhpZ2hMaWdodGVkQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLmhpZ2hsaWdodERhdGVzO2lmKCFyKXJldHVybiExO3ZhciBhPV9lKHQsXCJNTS5kZC55eXl5XCIpO3JldHVybiByLmdldChhKX0sbi5nZXRIb2xpZGF5c0NsYXNzPWZ1bmN0aW9uKCl7dmFyIGUsdD1uLnByb3BzLHI9dC5kYXksYT10LmhvbGlkYXlzO2lmKCFhKXJldHVyblt2b2lkIDBdO3ZhciBvPV9lKHIsXCJNTS5kZC55eXl5XCIpO3JldHVybiBhLmhhcyhvKT9bbnVsbD09PShlPWEuZ2V0KG8pKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jbGFzc05hbWVdOlt2b2lkIDBdfSxuLmlzSW5SYW5nZT1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMsdD1lLmRheSxyPWUuc3RhcnREYXRlLGE9ZS5lbmREYXRlO3JldHVybiEoIXJ8fCFhKSYmUWUodCxyLGEpfSxuLmlzSW5TZWxlY3RpbmdSYW5nZT1mdW5jdGlvbigpe3ZhciBlLHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5zZWxlY3RzU3RhcnQsbz10LnNlbGVjdHNFbmQscz10LnNlbGVjdHNSYW5nZSxpPXQuc2VsZWN0c0Rpc2FibGVkRGF5c0luUmFuZ2UsbD10LnN0YXJ0RGF0ZSxjPXQuZW5kRGF0ZSxwPW51bGwhPT0oZT1uLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT1lP2U6bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuISghKGF8fG98fHMpfHwhcHx8IWkmJm4uaXNEaXNhYmxlZCgpKSYmKGEmJmMmJihPLmlzQmVmb3JlKHAsYyl8fFdlKHAsYykpP1FlKHIscCxjKToobyYmbCYmKE4uaXNBZnRlcihwLGwpfHxXZShwLGwpKXx8ISghc3x8IWx8fGN8fCFOLmlzQWZ0ZXIocCxsKSYmIVdlKHAsbCkpKSYmUWUocixsLHApKX0sbi5pc1NlbGVjdGluZ1JhbmdlU3RhcnQ9ZnVuY3Rpb24oKXt2YXIgZTtpZighbi5pc0luU2VsZWN0aW5nUmFuZ2UoKSlyZXR1cm4hMTt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LnN0YXJ0RGF0ZSxvPXQuc2VsZWN0c1N0YXJ0LHM9bnVsbCE9PShlPW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PWU/ZTpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4gSGUocixvP3M6YSl9LG4uaXNTZWxlY3RpbmdSYW5nZUVuZD1mdW5jdGlvbigpe3ZhciBlO2lmKCFuLmlzSW5TZWxlY3RpbmdSYW5nZSgpKXJldHVybiExO3ZhciB0PW4ucHJvcHMscj10LmRheSxhPXQuZW5kRGF0ZSxvPXQuc2VsZWN0c0VuZCxzPXQuc2VsZWN0c1JhbmdlLGk9bnVsbCE9PShlPW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PWU/ZTpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4gSGUocixvfHxzP2k6YSl9LG4uaXNSYW5nZVN0YXJ0PWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5zdGFydERhdGUsYT1lLmVuZERhdGU7cmV0dXJuISghcnx8IWEpJiZIZShyLHQpfSxuLmlzUmFuZ2VFbmQ9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLnN0YXJ0RGF0ZSxhPWUuZW5kRGF0ZTtyZXR1cm4hKCFyfHwhYSkmJkhlKGEsdCl9LG4uaXNXZWVrZW5kPWZ1bmN0aW9uKCl7dmFyIGU9Uy5nZXREYXkobi5wcm9wcy5kYXkpO3JldHVybiAwPT09ZXx8Nj09PWV9LG4uaXNBZnRlck1vbnRoPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PW4ucHJvcHMubW9udGgmJihuLnByb3BzLm1vbnRoKzEpJTEyPT09Xy5nZXRNb250aChuLnByb3BzLmRheSl9LG4uaXNCZWZvcmVNb250aD1mdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT1uLnByb3BzLm1vbnRoJiYoXy5nZXRNb250aChuLnByb3BzLmRheSkrMSklMTI9PT1uLnByb3BzLm1vbnRofSxuLmlzQ3VycmVudERheT1mdW5jdGlvbigpe3JldHVybiBuLmlzU2FtZURheShNZSgpKX0sbi5pc1NlbGVjdGVkPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIG4ucHJvcHMuc2VsZWN0c011bHRpcGxlP251bGw9PT0oZT1uLnByb3BzLnNlbGVjdGVkRGF0ZXMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBuLmlzU2FtZURheU9yV2VlayhlKX0pKTpuLmlzU2FtZURheU9yV2VlayhuLnByb3BzLnNlbGVjdGVkKX0sbi5nZXRDbGFzc05hbWVzPWZ1bmN0aW9uKGUpe3ZhciByLGE9bi5wcm9wcy5kYXlDbGFzc05hbWU/bi5wcm9wcy5kYXlDbGFzc05hbWUoZSk6dm9pZCAwO3JldHVybiB0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19kYXlcIixhLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1cIitfZShuLnByb3BzLmRheSxcImRkZFwiLHIpLHtcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWRcIjpuLmlzRGlzYWJsZWQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZXhjbHVkZWRcIjpuLmlzRXhjbHVkZWQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tc2VsZWN0ZWRcIjpuLmlzU2VsZWN0ZWQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0ta2V5Ym9hcmQtc2VsZWN0ZWRcIjpuLmlzS2V5Ym9hcmRTZWxlY3RlZCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1yYW5nZS1zdGFydFwiOm4uaXNSYW5nZVN0YXJ0KCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXJhbmdlLWVuZFwiOm4uaXNSYW5nZUVuZCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZVwiOm4uaXNJblJhbmdlKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZVwiOm4uaXNJblNlbGVjdGluZ1JhbmdlKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGluZy1yYW5nZS1zdGFydFwiOm4uaXNTZWxlY3RpbmdSYW5nZVN0YXJ0KCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGluZy1yYW5nZS1lbmRcIjpuLmlzU2VsZWN0aW5nUmFuZ2VFbmQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tdG9kYXlcIjpuLmlzQ3VycmVudERheSgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS13ZWVrZW5kXCI6bi5pc1dlZWtlbmQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tb3V0c2lkZS1tb250aFwiOm4uaXNBZnRlck1vbnRoKCl8fG4uaXNCZWZvcmVNb250aCgpfSxuLmdldEhpZ2hMaWdodGVkQ2xhc3MoKSxuLmdldEhvbGlkYXlzQ2xhc3MoKSl9LG4uZ2V0QXJpYUxhYmVsPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5hcmlhTGFiZWxQcmVmaXhXaGVuRW5hYmxlZCxhPXZvaWQgMD09PXI/XCJDaG9vc2VcIjpyLG89ZS5hcmlhTGFiZWxQcmVmaXhXaGVuRGlzYWJsZWQscz12b2lkIDA9PT1vP1wiTm90IGF2YWlsYWJsZVwiOm8saT1uLmlzRGlzYWJsZWQoKXx8bi5pc0V4Y2x1ZGVkKCk/czphO3JldHVyblwiXCIuY29uY2F0KGksXCIgXCIpLmNvbmNhdChfZSh0LFwiUFBQUFwiLG4ucHJvcHMubG9jYWxlKSl9LG4uZ2V0VGl0bGU9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLmhvbGlkYXlzLGE9dm9pZCAwPT09cj9uZXcgTWFwOnIsbz1lLmV4Y2x1ZGVEYXRlcyxzPV9lKHQsXCJNTS5kZC55eXl5XCIpLGk9W107cmV0dXJuIGEuaGFzKHMpJiZpLnB1c2guYXBwbHkoaSxhLmdldChzKS5ob2xpZGF5TmFtZXMpLG4uaXNFeGNsdWRlZCgpJiZpLnB1c2gobnVsbD09bz92b2lkIDA6by5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZT9IZShlLHQpOkhlKG51bGw9PWU/dm9pZCAwOmUuZGF0ZSx0KX0pKS5tYXAoKGZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIERhdGUpKXJldHVybiBudWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2V9KSkpLGkuam9pbihcIiwgXCIpfSxuLmdldFRhYkluZGV4PWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcy5zZWxlY3RlZCx0PW4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybighbi5wcm9wcy5zaG93V2Vla1BpY2tlcnx8IW4ucHJvcHMuc2hvd1dlZWtOdW1iZXImJm4uaXNTdGFydE9mV2VlaygpKSYmKG4uaXNLZXlib2FyZFNlbGVjdGVkKCl8fG4uaXNTYW1lRGF5KGUpJiZIZSh0LGUpKT8wOi0xfSxuLmhhbmRsZUZvY3VzRGF5PWZ1bmN0aW9uKCl7dmFyIGU7bi5zaG91bGRGb2N1c0RheSgpJiYobnVsbD09PShlPW4uZGF5RWwuY3VycmVudCl8fHZvaWQgMD09PWV8fGUuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSl9LG4ucmVuZGVyRGF5Q29udGVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gbi5wcm9wcy5tb250aFNob3dzRHVwbGljYXRlRGF5c0VuZCYmbi5pc0FmdGVyTW9udGgoKXx8bi5wcm9wcy5tb250aFNob3dzRHVwbGljYXRlRGF5c1N0YXJ0JiZuLmlzQmVmb3JlTW9udGgoKT9udWxsOm4ucHJvcHMucmVuZGVyRGF5Q29udGVudHM/bi5wcm9wcy5yZW5kZXJEYXlDb250ZW50cyh3LmdldERhdGUobi5wcm9wcy5kYXkpLG4ucHJvcHMuZGF5KTp3LmdldERhdGUobi5wcm9wcy5kYXkpfSxuLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOm4uZGF5RWwsY2xhc3NOYW1lOm4uZ2V0Q2xhc3NOYW1lcyhuLnByb3BzLmRheSksb25LZXlEb3duOm4uaGFuZGxlT25LZXlEb3duLG9uQ2xpY2s6bi5oYW5kbGVDbGljayxvbk1vdXNlRW50ZXI6bi5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOm4uaGFuZGxlTW91c2VFbnRlcixvblBvaW50ZXJFbnRlcjpuLnByb3BzLnVzZVBvaW50ZXJFdmVudD9uLmhhbmRsZU1vdXNlRW50ZXI6dm9pZCAwLHRhYkluZGV4Om4uZ2V0VGFiSW5kZXgoKSxcImFyaWEtbGFiZWxcIjpuLmdldEFyaWFMYWJlbCgpLHJvbGU6XCJvcHRpb25cIix0aXRsZTpuLmdldFRpdGxlKCksXCJhcmlhLWRpc2FibGVkXCI6bi5pc0Rpc2FibGVkKCksXCJhcmlhLWN1cnJlbnRcIjpuLmlzQ3VycmVudERheSgpP1wiZGF0ZVwiOnZvaWQgMCxcImFyaWEtc2VsZWN0ZWRcIjpuLmlzU2VsZWN0ZWQoKXx8bi5pc0luUmFuZ2UoKX0sbi5yZW5kZXJEYXlDb250ZW50cygpLFwiXCIhPT1uLmdldFRpdGxlKCkmJnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwib3ZlcmxheVwifSxuLmdldFRpdGxlKCkpKX0sbn1yZXR1cm4gdmUobixlKSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMuaGFuZGxlRm9jdXNEYXkoKX0sbi5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVGb2N1c0RheSgpfSxuLnByb3RvdHlwZS5zaG91bGRGb2N1c0RheT1mdW5jdGlvbigpe3ZhciBlPSExO3JldHVybiAwPT09dGhpcy5nZXRUYWJJbmRleCgpJiZ0aGlzLmlzU2FtZURheSh0aGlzLnByb3BzLnByZVNlbGVjdGlvbikmJihkb2N1bWVudC5hY3RpdmVFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZG9jdW1lbnQuYm9keXx8KGU9ITApLHRoaXMucHJvcHMuaW5saW5lJiYhdGhpcy5wcm9wcy5zaG91bGRGb2N1c0RheUlubGluZSYmKGU9ITEpLHRoaXMuaXNEYXlBY3RpdmVFbGVtZW50KCkmJihlPSEwKSx0aGlzLmlzRHVwbGljYXRlRGF5KCkmJihlPSExKSksZX0sbi5wcm90b3R5cGUuaXNEYXlBY3RpdmVFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIGUsdCxyO3JldHVybihudWxsPT09KHQ9bnVsbD09PShlPXRoaXMucHJvcHMuY29udGFpbmVyUmVmKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jdXJyZW50KXx8dm9pZCAwPT09dD92b2lkIDA6dC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkmJihudWxsPT09KHI9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl8fHZvaWQgMD09PXI/dm9pZCAwOnIuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5XCIpKX0sbi5wcm90b3R5cGUuaXNEdXBsaWNhdGVEYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wcy5tb250aFNob3dzRHVwbGljYXRlRGF5c0VuZCYmdGhpcy5pc0FmdGVyTW9udGgoKXx8dGhpcy5wcm9wcy5tb250aFNob3dzRHVwbGljYXRlRGF5c1N0YXJ0JiZ0aGlzLmlzQmVmb3JlTW9udGgoKX0sbn0oci5Db21wb25lbnQpLGJ0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQud2Vla051bWJlckVsPXIuY3JlYXRlUmVmKCksdC5oYW5kbGVDbGljaz1mdW5jdGlvbihlKXt0LnByb3BzLm9uQ2xpY2smJnQucHJvcHMub25DbGljayhlKX0sdC5oYW5kbGVPbktleURvd249ZnVuY3Rpb24oZSl7dmFyIHIsbjtlLmtleT09PXllLlNwYWNlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUua2V5PXllLkVudGVyKSxudWxsPT09KG49KHI9dC5wcm9wcykuaGFuZGxlT25LZXlEb3duKXx8dm9pZCAwPT09bnx8bi5jYWxsKHIsZSl9LHQuaXNLZXlib2FyZFNlbGVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIXQucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24mJiFIZSh0LnByb3BzLmRhdGUsdC5wcm9wcy5zZWxlY3RlZCkmJkhlKHQucHJvcHMuZGF0ZSx0LnByb3BzLnByZVNlbGVjdGlvbil9LHQuZ2V0VGFiSW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm9wcy5zaG93V2Vla1BpY2tlciYmdC5wcm9wcy5zaG93V2Vla051bWJlciYmKHQuaXNLZXlib2FyZFNlbGVjdGVkKCl8fEhlKHQucHJvcHMuZGF0ZSx0LnByb3BzLnNlbGVjdGVkKSYmSGUodC5wcm9wcy5wcmVTZWxlY3Rpb24sdC5wcm9wcy5zZWxlY3RlZCkpPzA6LTF9LHQuaGFuZGxlRm9jdXNXZWVrTnVtYmVyPWZ1bmN0aW9uKGUpe3ZhciByPSExOzA9PT10LmdldFRhYkluZGV4KCkmJiEobnVsbD09ZT92b2lkIDA6ZS5pc0lucHV0Rm9jdXNlZCkmJkhlKHQucHJvcHMuZGF0ZSx0LnByb3BzLnByZVNlbGVjdGlvbikmJihkb2N1bWVudC5hY3RpdmVFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZG9jdW1lbnQuYm9keXx8KHI9ITApLHQucHJvcHMuaW5saW5lJiYhdC5wcm9wcy5zaG91bGRGb2N1c0RheUlubGluZSYmKHI9ITEpLHQucHJvcHMuY29udGFpbmVyUmVmJiZ0LnByb3BzLmNvbnRhaW5lclJlZi5jdXJyZW50JiZ0LnByb3BzLmNvbnRhaW5lclJlZi5jdXJyZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyXCIpJiYocj0hMCkpLHImJnQud2Vla051bWJlckVsLmN1cnJlbnQmJnQud2Vla051bWJlckVsLmN1cnJlbnQuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KX0sdH1yZXR1cm4gdmUobixlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobixcImRlZmF1bHRQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57YXJpYUxhYmVsUHJlZml4Olwid2VlayBcIn19LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZUZvY3VzV2Vla051bWJlcigpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy5oYW5kbGVGb2N1c1dlZWtOdW1iZXIoZSl9LG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMscj1lLndlZWtOdW1iZXIsYT1lLmFyaWFMYWJlbFByZWZpeCxvPXZvaWQgMD09PWE/bi5kZWZhdWx0UHJvcHMuYXJpYUxhYmVsUHJlZml4OmEscz1lLm9uQ2xpY2ssaT17XCJyZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlclwiOiEwLFwicmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWNsaWNrYWJsZVwiOiEhcyxcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZFwiOiEhcyYmSGUodGhpcy5wcm9wcy5kYXRlLHRoaXMucHJvcHMuc2VsZWN0ZWQpLFwicmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkXCI6dGhpcy5pc0tleWJvYXJkU2VsZWN0ZWQoKX07cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtyZWY6dGhpcy53ZWVrTnVtYmVyRWwsY2xhc3NOYW1lOnQuY2xzeChpKSxcImFyaWEtbGFiZWxcIjpcIlwiLmNvbmNhdChvLFwiIFwiKS5jb25jYXQodGhpcy5wcm9wcy53ZWVrTnVtYmVyKSxvbkNsaWNrOnRoaXMuaGFuZGxlQ2xpY2ssb25LZXlEb3duOnRoaXMuaGFuZGxlT25LZXlEb3duLHRhYkluZGV4OnRoaXMuZ2V0VGFiSW5kZXgoKX0scil9LG59KHIuQ29tcG9uZW50KSxNdD1mdW5jdGlvbihlKXtmdW5jdGlvbiByKCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0LmlzRGlzYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGplKGUse21pbkRhdGU6dC5wcm9wcy5taW5EYXRlLG1heERhdGU6dC5wcm9wcy5tYXhEYXRlLGV4Y2x1ZGVEYXRlczp0LnByb3BzLmV4Y2x1ZGVEYXRlcyxleGNsdWRlRGF0ZUludGVydmFsczp0LnByb3BzLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzLGluY2x1ZGVEYXRlSW50ZXJ2YWxzOnQucHJvcHMuaW5jbHVkZURhdGVJbnRlcnZhbHMsaW5jbHVkZURhdGVzOnQucHJvcHMuaW5jbHVkZURhdGVzLGZpbHRlckRhdGU6dC5wcm9wcy5maWx0ZXJEYXRlfSl9LHQuaGFuZGxlRGF5Q2xpY2s9ZnVuY3Rpb24oZSxyKXt0LnByb3BzLm9uRGF5Q2xpY2smJnQucHJvcHMub25EYXlDbGljayhlLHIpfSx0LmhhbmRsZURheU1vdXNlRW50ZXI9ZnVuY3Rpb24oZSl7dC5wcm9wcy5vbkRheU1vdXNlRW50ZXImJnQucHJvcHMub25EYXlNb3VzZUVudGVyKGUpfSx0LmhhbmRsZVdlZWtDbGljaz1mdW5jdGlvbihlLG4sYSl7Zm9yKHZhciBvLHMsaSxsPW5ldyBEYXRlKGUpLGM9MDtjPDc7YysrKXt2YXIgcD1uZXcgRGF0ZShlKTtpZihwLnNldERhdGUocC5nZXREYXRlKCkrYyksIXQuaXNEaXNhYmxlZChwKSl7bD1wO2JyZWFrfX1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnByb3BzLm9uV2Vla1NlbGVjdCYmdC5wcm9wcy5vbldlZWtTZWxlY3QobCxuLGEpLHQucHJvcHMuc2hvd1dlZWtQaWNrZXImJnQuaGFuZGxlRGF5Q2xpY2sobCxhKSwobnVsbCE9PShvPXQucHJvcHMuc2hvdWxkQ2xvc2VPblNlbGVjdCkmJnZvaWQgMCE9PW8/bzpyLmRlZmF1bHRQcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0KSYmKG51bGw9PT0oaT0ocz10LnByb3BzKS5zZXRPcGVuKXx8dm9pZCAwPT09aXx8aS5jYWxsKHMsITEpKX0sdC5mb3JtYXRXZWVrTnVtYmVyPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3BzLmZvcm1hdFdlZWtOdW1iZXI/dC5wcm9wcy5mb3JtYXRXZWVrTnVtYmVyKGUpOmZ1bmN0aW9uKGUpe3JldHVybiBNLmdldElTT1dlZWsoZSl9KGUpfSx0LnJlbmRlckRheXM9ZnVuY3Rpb24oKXt2YXIgZT10LnN0YXJ0T2ZXZWVrKCksbj1bXSxvPXQuZm9ybWF0V2Vla051bWJlcihlKTtpZih0LnByb3BzLnNob3dXZWVrTnVtYmVyKXt2YXIgcz10LnByb3BzLm9uV2Vla1NlbGVjdHx8dC5wcm9wcy5zaG93V2Vla1BpY2tlcj90LmhhbmRsZVdlZWtDbGljay5iaW5kKHQsZSxvKTp2b2lkIDA7bi5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChidCxnZSh7a2V5OlwiV1wifSxyLmRlZmF1bHRQcm9wcyx0LnByb3BzLHt3ZWVrTnVtYmVyOm8sZGF0ZTplLG9uQ2xpY2s6c30pKSl9cmV0dXJuIG4uY29uY2F0KFswLDEsMiwzLDQsNSw2XS5tYXAoKGZ1bmN0aW9uKG4pe3ZhciBvPWEuYWRkRGF5cyhlLG4pO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoU3QsZ2Uoe30sci5kZWZhdWx0UHJvcHMsdC5wcm9wcyx7YXJpYUxhYmVsUHJlZml4V2hlbkVuYWJsZWQ6dC5wcm9wcy5jaG9vc2VEYXlBcmlhTGFiZWxQcmVmaXgsYXJpYUxhYmVsUHJlZml4V2hlbkRpc2FibGVkOnQucHJvcHMuZGlzYWJsZWREYXlBcmlhTGFiZWxQcmVmaXgsa2V5Om8udmFsdWVPZigpLGRheTpvLG9uQ2xpY2s6dC5oYW5kbGVEYXlDbGljay5iaW5kKHQsbyksb25Nb3VzZUVudGVyOnQuaGFuZGxlRGF5TW91c2VFbnRlci5iaW5kKHQsbyl9KSl9KSkpfSx0LnN0YXJ0T2ZXZWVrPWZ1bmN0aW9uKCl7cmV0dXJuIHhlKHQucHJvcHMuZGF5LHQucHJvcHMubG9jYWxlLHQucHJvcHMuY2FsZW5kYXJTdGFydERheSl9LHQuaXNLZXlib2FyZFNlbGVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIXQucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24mJiFIZSh0LnN0YXJ0T2ZXZWVrKCksdC5wcm9wcy5zZWxlY3RlZCkmJkhlKHQuc3RhcnRPZldlZWsoKSx0LnByb3BzLnByZVNlbGVjdGlvbil9LHR9cmV0dXJuIHZlKHIsZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue3Nob3VsZENsb3NlT25TZWxlY3Q6ITB9fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLHIucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXtcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWtcIjohMCxcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstLXNlbGVjdGVkXCI6SGUodGhpcy5zdGFydE9mV2VlaygpLHRoaXMucHJvcHMuc2VsZWN0ZWQpLFwicmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay0ta2V5Ym9hcmQtc2VsZWN0ZWRcIjp0aGlzLmlzS2V5Ym9hcmRTZWxlY3RlZCgpfTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTp0LmNsc3goZSl9LHRoaXMucmVuZGVyRGF5cygpKX0scn0oci5Db21wb25lbnQpLEN0PVwidHdvX2NvbHVtbnNcIixfdD1cInRocmVlX2NvbHVtbnNcIixFdD1cImZvdXJfY29sdW1uc1wiLFB0PSgoa3Q9e30pW0N0XT17Z3JpZDpbWzAsMV0sWzIsM10sWzQsNV0sWzYsN10sWzgsOV0sWzEwLDExXV0sdmVydGljYWxOYXZpZ2F0aW9uT2Zmc2V0OjJ9LGt0W190XT17Z3JpZDpbWzAsMSwyXSxbMyw0LDVdLFs2LDcsOF0sWzksMTAsMTFdXSx2ZXJ0aWNhbE5hdmlnYXRpb25PZmZzZXQ6M30sa3RbRXRdPXtncmlkOltbMCwxLDIsM10sWzQsNSw2LDddLFs4LDksMTAsMTFdXSx2ZXJ0aWNhbE5hdmlnYXRpb25PZmZzZXQ6NH0sa3QpO2Z1bmN0aW9uIFl0KGUsdCl7cmV0dXJuIGU/RXQ6dD9DdDpfdH12YXIgeHQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe3ZhciBuPW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gbi5NT05USF9SRUZTPURlKFtdLEFycmF5KDEyKSwhMCkubWFwKChmdW5jdGlvbigpe3JldHVybiByLmNyZWF0ZVJlZigpfSkpLG4uUVVBUlRFUl9SRUZTPURlKFtdLEFycmF5KDQpLCEwKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIHIuY3JlYXRlUmVmKCl9KSksbi5pc0Rpc2FibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBqZShlLHttaW5EYXRlOm4ucHJvcHMubWluRGF0ZSxtYXhEYXRlOm4ucHJvcHMubWF4RGF0ZSxleGNsdWRlRGF0ZXM6bi5wcm9wcy5leGNsdWRlRGF0ZXMsZXhjbHVkZURhdGVJbnRlcnZhbHM6bi5wcm9wcy5leGNsdWRlRGF0ZUludGVydmFscyxpbmNsdWRlRGF0ZUludGVydmFsczpuLnByb3BzLmluY2x1ZGVEYXRlSW50ZXJ2YWxzLGluY2x1ZGVEYXRlczpuLnByb3BzLmluY2x1ZGVEYXRlcyxmaWx0ZXJEYXRlOm4ucHJvcHMuZmlsdGVyRGF0ZX0pfSxuLmlzRXhjbHVkZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIFVlKGUse2V4Y2x1ZGVEYXRlczpuLnByb3BzLmV4Y2x1ZGVEYXRlcyxleGNsdWRlRGF0ZUludGVydmFsczpuLnByb3BzLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzfSl9LG4uaGFuZGxlRGF5Q2xpY2s9ZnVuY3Rpb24oZSx0KXt2YXIgcixhO251bGw9PT0oYT0ocj1uLnByb3BzKS5vbkRheUNsaWNrKXx8dm9pZCAwPT09YXx8YS5jYWxsKHIsZSx0LG4ucHJvcHMub3JkZXJJbkRpc3BsYXkpfSxuLmhhbmRsZURheU1vdXNlRW50ZXI9ZnVuY3Rpb24oZSl7dmFyIHQscjtudWxsPT09KHI9KHQ9bi5wcm9wcykub25EYXlNb3VzZUVudGVyKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSl9LG4uaGFuZGxlTW91c2VMZWF2ZT1mdW5jdGlvbigpe3ZhciBlLHQ7bnVsbD09PSh0PShlPW4ucHJvcHMpLm9uTW91c2VMZWF2ZSl8fHZvaWQgMD09PXR8fHQuY2FsbChlKX0sbi5pc1JhbmdlU3RhcnRNb250aD1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLHI9dC5kYXksYT10LnN0YXJ0RGF0ZSxvPXQuZW5kRGF0ZTtyZXR1cm4hKCFhfHwhbykmJkFlKCQuc2V0TW9udGgocixlKSxhKX0sbi5pc1JhbmdlU3RhcnRRdWFydGVyPWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMscj10LmRheSxhPXQuc3RhcnREYXRlLG89dC5lbmREYXRlO3JldHVybiEoIWF8fCFvKSYmRmUoei5zZXRRdWFydGVyKHIsZSksYSl9LG4uaXNSYW5nZUVuZE1vbnRoPWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMscj10LmRheSxhPXQuc3RhcnREYXRlLG89dC5lbmREYXRlO3JldHVybiEoIWF8fCFvKSYmQWUoJC5zZXRNb250aChyLGUpLG8pfSxuLmlzUmFuZ2VFbmRRdWFydGVyPWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMscj10LmRheSxhPXQuc3RhcnREYXRlLG89dC5lbmREYXRlO3JldHVybiEoIWF8fCFvKSYmRmUoei5zZXRRdWFydGVyKHIsZSksbyl9LG4uaXNJblNlbGVjdGluZ1JhbmdlTW9udGg9ZnVuY3Rpb24oZSl7dmFyIHQscj1uLnByb3BzLGE9ci5kYXksbz1yLnNlbGVjdHNTdGFydCxzPXIuc2VsZWN0c0VuZCxpPXIuc2VsZWN0c1JhbmdlLGw9ci5zdGFydERhdGUsYz1yLmVuZERhdGUscD1udWxsIT09KHQ9bi5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09dD90Om4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybiEoIShvfHxzfHxpKXx8IXApJiYobyYmYz96ZShwLGMsZSxhKToocyYmbHx8ISghaXx8IWx8fGMpKSYmemUobCxwLGUsYSkpfSxuLmlzU2VsZWN0aW5nTW9udGhSYW5nZVN0YXJ0PWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFuLmlzSW5TZWxlY3RpbmdSYW5nZU1vbnRoKGUpKXJldHVybiExO3ZhciByPW4ucHJvcHMsYT1yLmRheSxvPXIuc3RhcnREYXRlLHM9ci5zZWxlY3RzU3RhcnQsaT0kLnNldE1vbnRoKGEsZSksbD1udWxsIT09KHQ9bi5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09dD90Om4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybiBBZShpLHM/bDpvKX0sbi5pc1NlbGVjdGluZ01vbnRoUmFuZ2VFbmQ9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIW4uaXNJblNlbGVjdGluZ1JhbmdlTW9udGgoZSkpcmV0dXJuITE7dmFyIHI9bi5wcm9wcyxhPXIuZGF5LG89ci5lbmREYXRlLHM9ci5zZWxlY3RzRW5kLGk9ci5zZWxlY3RzUmFuZ2UsbD0kLnNldE1vbnRoKGEsZSksYz1udWxsIT09KHQ9bi5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09dD90Om4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybiBBZShsLHN8fGk/YzpvKX0sbi5pc0luU2VsZWN0aW5nUmFuZ2VRdWFydGVyPWZ1bmN0aW9uKGUpe3ZhciB0LHI9bi5wcm9wcyxhPXIuZGF5LG89ci5zZWxlY3RzU3RhcnQscz1yLnNlbGVjdHNFbmQsaT1yLnNlbGVjdHNSYW5nZSxsPXIuc3RhcnREYXRlLGM9ci5lbmREYXRlLHA9bnVsbCE9PSh0PW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PXQ/dDpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4hKCEob3x8c3x8aSl8fCFwKSYmKG8mJmM/ZXQocCxjLGUsYSk6KHMmJmx8fCEoIWl8fCFsfHxjKSkmJmV0KGwscCxlLGEpKX0sbi5pc1dlZWtJbk1vbnRoPWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMuZGF5LHI9YS5hZGREYXlzKGUsNik7cmV0dXJuIEFlKGUsdCl8fEFlKHIsdCl9LG4uaXNDdXJyZW50TW9udGg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5nZXRZZWFyKGUpPT09eC5nZXRZZWFyKE1lKCkpJiZ0PT09Xy5nZXRNb250aChNZSgpKX0sbi5pc0N1cnJlbnRRdWFydGVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguZ2V0WWVhcihlKT09PXguZ2V0WWVhcihNZSgpKSYmdD09PUUuZ2V0UXVhcnRlcihNZSgpKX0sbi5pc1NlbGVjdGVkTW9udGg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBfLmdldE1vbnRoKHIpPT09dCYmeC5nZXRZZWFyKGUpPT09eC5nZXRZZWFyKHIpfSxuLmlzU2VsZWN0TW9udGhJbkxpc3Q9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiByLnNvbWUoKGZ1bmN0aW9uKHIpe3JldHVybiBuLmlzU2VsZWN0ZWRNb250aChlLHQscil9KSl9LG4uaXNTZWxlY3RlZFF1YXJ0ZXI9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBFLmdldFF1YXJ0ZXIoZSk9PT10JiZ4LmdldFllYXIoZSk9PT14LmdldFllYXIocil9LG4ucmVuZGVyV2Vla3M9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1uLnByb3BzLmZpeGVkSGVpZ2h0LHI9MCxhPSExLG89eGUoTmUobi5wcm9wcy5kYXkpLG4ucHJvcHMubG9jYWxlLG4ucHJvcHMuY2FsZW5kYXJTdGFydERheSkscz1uLnByb3BzLnNlbGVjdGVkP2Z1bmN0aW9uKGUpe3JldHVybiBuLnByb3BzLnNob3dXZWVrUGlja2VyP3hlKGUsbi5wcm9wcy5sb2NhbGUsbi5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KTpuLnByb3BzLnNlbGVjdGVkfShuLnByb3BzLnNlbGVjdGVkKTp2b2lkIDAsaT1uLnByb3BzLnByZVNlbGVjdGlvbj9mdW5jdGlvbihlKXtyZXR1cm4gbi5wcm9wcy5zaG93V2Vla1BpY2tlcj94ZShlLG4ucHJvcHMubG9jYWxlLG4ucHJvcHMuY2FsZW5kYXJTdGFydERheSk6bi5wcm9wcy5wcmVTZWxlY3Rpb259KG4ucHJvcHMucHJlU2VsZWN0aW9uKTp2b2lkIDA7ZS5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChNdCxnZSh7fSxuLnByb3BzLHthcmlhTGFiZWxQcmVmaXg6bi5wcm9wcy53ZWVrQXJpYUxhYmVsUHJlZml4LGtleTpyLGRheTpvLG1vbnRoOl8uZ2V0TW9udGgobi5wcm9wcy5kYXkpLG9uRGF5Q2xpY2s6bi5oYW5kbGVEYXlDbGljayxvbkRheU1vdXNlRW50ZXI6bi5oYW5kbGVEYXlNb3VzZUVudGVyLHNlbGVjdGVkOnMscHJlU2VsZWN0aW9uOmksc2hvd1dlZWtOdW1iZXI6bi5wcm9wcy5zaG93V2Vla051bWJlcnN9KSkpLCFhOyl7cisrLG89cC5hZGRXZWVrcyhvLDEpO3ZhciBsPXQmJnI+PTYsYz0hdCYmIW4uaXNXZWVrSW5Nb250aChvKTtpZihsfHxjKXtpZighbi5wcm9wcy5wZWVrTmV4dE1vbnRoKWJyZWFrO2E9ITB9fXJldHVybiBlfSxuLm9uTW9udGhDbGljaz1mdW5jdGlvbihlLHQpe3ZhciByPW4uaXNNb250aERpc2FibGVkRm9yTGFiZWxEYXRlKHQpLGE9ci5pc0Rpc2FibGVkLG89ci5sYWJlbERhdGU7YXx8bi5oYW5kbGVEYXlDbGljayhOZShvKSxlKX0sbi5vbk1vbnRoTW91c2VFbnRlcj1mdW5jdGlvbihlKXt2YXIgdD1uLmlzTW9udGhEaXNhYmxlZEZvckxhYmVsRGF0ZShlKSxyPXQuaXNEaXNhYmxlZCxhPXQubGFiZWxEYXRlO3J8fG4uaGFuZGxlRGF5TW91c2VFbnRlcihOZShhKSl9LG4uaGFuZGxlTW9udGhOYXZpZ2F0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIHIsYSxvLHM7bnVsbD09PShhPShyPW4ucHJvcHMpLnNldFByZVNlbGVjdGlvbil8fHZvaWQgMD09PWF8fGEuY2FsbChyLHQpLG51bGw9PT0ocz1udWxsPT09KG89bi5NT05USF9SRUZTW2VdKXx8dm9pZCAwPT09bz92b2lkIDA6by5jdXJyZW50KXx8dm9pZCAwPT09c3x8cy5mb2N1cygpfSxuLmhhbmRsZUtleWJvYXJkTmF2aWdhdGlvbj1mdW5jdGlvbihlLHQscil7dmFyIGEsbz1uLnByb3BzLHM9by5zZWxlY3RlZCxsPW8ucHJlU2VsZWN0aW9uLGM9by5zZXRQcmVTZWxlY3Rpb24scD1vLm1pbkRhdGUsZD1vLm1heERhdGUsdT1vLnNob3dGb3VyQ29sdW1uTW9udGhZZWFyUGlja2VyLGY9by5zaG93VHdvQ29sdW1uTW9udGhZZWFyUGlja2VyO2lmKGwpe3ZhciBoPVl0KHUsZiksbT1uLmdldFZlcnRpY2FsT2Zmc2V0KGgpLHY9bnVsbD09PShhPVB0W2hdKXx8dm9pZCAwPT09YT92b2lkIDA6YS5ncmlkLGc9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGEsbz10LHM9cjtzd2l0Y2goZSl7Y2FzZSB5ZS5BcnJvd1JpZ2h0Om89aS5hZGRNb250aHModCwxKSxzPTExPT09cj8wOnIrMTticmVhaztjYXNlIHllLkFycm93TGVmdDpvPWFlLnN1Yk1vbnRocyh0LDEpLHM9MD09PXI/MTE6ci0xO2JyZWFrO2Nhc2UgeWUuQXJyb3dVcDpvPWFlLnN1Yk1vbnRocyh0LG0pLHM9KG51bGw9PT0obj1udWxsPT12P3ZvaWQgMDp2WzBdKXx8dm9pZCAwPT09bj92b2lkIDA6bi5pbmNsdWRlcyhyKSk/cisxMi1tOnItbTticmVhaztjYXNlIHllLkFycm93RG93bjpvPWkuYWRkTW9udGhzKHQsbSkscz0obnVsbD09PShhPW51bGw9PXY/dm9pZCAwOnZbdi5sZW5ndGgtMV0pfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmluY2x1ZGVzKHIpKT9yLTEyK206cittfXJldHVybntuZXdDYWxjdWxhdGVkRGF0ZTpvLG5ld0NhbGN1bGF0ZWRNb250aDpzfX07aWYodCE9PXllLkVudGVyKXt2YXIgRD1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBhPWUsbz0hMSxzPTAsaT1nKGEsdCxyKSxsPWkubmV3Q2FsY3VsYXRlZERhdGUsYz1pLm5ld0NhbGN1bGF0ZWRNb250aDshbzspe2lmKHM+PTQwKXtsPXQsYz1yO2JyZWFrfXZhciB1O2lmKHAmJmw8cClhPXllLkFycm93UmlnaHQsbD0odT1nKGEsbCxjKSkubmV3Q2FsY3VsYXRlZERhdGUsYz11Lm5ld0NhbGN1bGF0ZWRNb250aDtpZihkJiZsPmQpYT15ZS5BcnJvd0xlZnQsbD0odT1nKGEsbCxjKSkubmV3Q2FsY3VsYXRlZERhdGUsYz11Lm5ld0NhbGN1bGF0ZWRNb250aDtpZihYZShsLG4ucHJvcHMpKWw9KHU9ZyhhLGwsYykpLm5ld0NhbGN1bGF0ZWREYXRlLGM9dS5uZXdDYWxjdWxhdGVkTW9udGg7ZWxzZSBvPSEwO3MrK31yZXR1cm57bmV3Q2FsY3VsYXRlZERhdGU6bCxuZXdDYWxjdWxhdGVkTW9udGg6Y319KHQsbCxyKSx5PUQubmV3Q2FsY3VsYXRlZERhdGUsaz1ELm5ld0NhbGN1bGF0ZWRNb250aDtzd2l0Y2godCl7Y2FzZSB5ZS5BcnJvd1JpZ2h0OmNhc2UgeWUuQXJyb3dMZWZ0OmNhc2UgeWUuQXJyb3dVcDpjYXNlIHllLkFycm93RG93bjpuLmhhbmRsZU1vbnRoTmF2aWdhdGlvbihrLHkpfX1lbHNlIG4uaXNNb250aERpc2FibGVkKHIpfHwobi5vbk1vbnRoQ2xpY2soZSxyKSxudWxsPT1jfHxjKHMpKX19LG4uZ2V0VmVydGljYWxPZmZzZXQ9ZnVuY3Rpb24oZSl7dmFyIHQscjtyZXR1cm4gbnVsbCE9PShyPW51bGw9PT0odD1QdFtlXSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQudmVydGljYWxOYXZpZ2F0aW9uT2Zmc2V0KSYmdm9pZCAwIT09cj9yOjB9LG4ub25Nb250aEtleURvd249ZnVuY3Rpb24oZSx0KXt2YXIgcj1uLnByb3BzLGE9ci5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbixvPXIuaGFuZGxlT25Nb250aEtleURvd24scz1lLmtleTtzIT09eWUuVGFiJiZlLnByZXZlbnREZWZhdWx0KCksYXx8bi5oYW5kbGVLZXlib2FyZE5hdmlnYXRpb24oZSxzLHQpLG8mJm8oZSl9LG4ub25RdWFydGVyQ2xpY2s9ZnVuY3Rpb24oZSx0KXt2YXIgcj16LnNldFF1YXJ0ZXIobi5wcm9wcy5kYXksdCk7R2UocixuLnByb3BzKXx8bi5oYW5kbGVEYXlDbGljayhJZShyKSxlKX0sbi5vblF1YXJ0ZXJNb3VzZUVudGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXouc2V0UXVhcnRlcihuLnByb3BzLmRheSxlKTtHZSh0LG4ucHJvcHMpfHxuLmhhbmRsZURheU1vdXNlRW50ZXIoSWUodCkpfSxuLmhhbmRsZVF1YXJ0ZXJOYXZpZ2F0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIHIsYSxvLHM7bi5pc0Rpc2FibGVkKHQpfHxuLmlzRXhjbHVkZWQodCl8fChudWxsPT09KGE9KHI9bi5wcm9wcykuc2V0UHJlU2VsZWN0aW9uKXx8dm9pZCAwPT09YXx8YS5jYWxsKHIsdCksbnVsbD09PShzPW51bGw9PT0obz1uLlFVQVJURVJfUkVGU1tlLTFdKXx8dm9pZCAwPT09bz92b2lkIDA6by5jdXJyZW50KXx8dm9pZCAwPT09c3x8cy5mb2N1cygpKX0sbi5vblF1YXJ0ZXJLZXlEb3duPWZ1bmN0aW9uKGUsdCl7dmFyIHIsYSxvPWUua2V5O2lmKCFuLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uKXN3aXRjaChvKXtjYXNlIHllLkVudGVyOm4ub25RdWFydGVyQ2xpY2soZSx0KSxudWxsPT09KGE9KHI9bi5wcm9wcykuc2V0UHJlU2VsZWN0aW9uKXx8dm9pZCAwPT09YXx8YS5jYWxsKHIsbi5wcm9wcy5zZWxlY3RlZCk7YnJlYWs7Y2FzZSB5ZS5BcnJvd1JpZ2h0OmlmKCFuLnByb3BzLnByZVNlbGVjdGlvbilicmVhaztuLmhhbmRsZVF1YXJ0ZXJOYXZpZ2F0aW9uKDQ9PT10PzE6dCsxLGwuYWRkUXVhcnRlcnMobi5wcm9wcy5wcmVTZWxlY3Rpb24sMSkpO2JyZWFrO2Nhc2UgeWUuQXJyb3dMZWZ0OmlmKCFuLnByb3BzLnByZVNlbGVjdGlvbilicmVhaztuLmhhbmRsZVF1YXJ0ZXJOYXZpZ2F0aW9uKDE9PT10PzQ6dC0xLG9lLnN1YlF1YXJ0ZXJzKG4ucHJvcHMucHJlU2VsZWN0aW9uLDEpKX19LG4uaXNNb250aERpc2FibGVkRm9yTGFiZWxEYXRlPWZ1bmN0aW9uKGUpe3ZhciB0LHI9bi5wcm9wcyxhPXIuZGF5LG89ci5taW5EYXRlLHM9ci5tYXhEYXRlLGk9ci5leGNsdWRlRGF0ZXMsbD1yLmluY2x1ZGVEYXRlcyxjPSQuc2V0TW9udGgoYSxlKTtyZXR1cm57aXNEaXNhYmxlZDpudWxsIT09KHQ9KG98fHN8fGl8fGwpJiYkZShjLG4ucHJvcHMpKSYmdm9pZCAwIT09dCYmdCxsYWJlbERhdGU6Y319LG4uaXNNb250aERpc2FibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBuLmlzTW9udGhEaXNhYmxlZEZvckxhYmVsRGF0ZShlKS5pc0Rpc2FibGVkfSxuLmdldE1vbnRoQ2xhc3NOYW1lcz1mdW5jdGlvbihlKXt2YXIgcj1uLnByb3BzLGE9ci5kYXksbz1yLnN0YXJ0RGF0ZSxzPXIuZW5kRGF0ZSxpPXIucHJlU2VsZWN0aW9uLGw9ci5tb250aENsYXNzTmFtZSxjPWw/bCgkLnNldE1vbnRoKGEsZSkpOnZvaWQgMCxwPW4uZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIHQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHRcIixcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLVwiLmNvbmNhdChlKSxjLHtcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkXCI6bi5pc01vbnRoRGlzYWJsZWQoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RlZFwiOnA/bi5pc1NlbGVjdE1vbnRoSW5MaXN0KGEsZSxwKTp2b2lkIDAsXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZFwiOiFuLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uJiZpJiZuLmlzU2VsZWN0ZWRNb250aChhLGUsaSkmJiFuLmlzTW9udGhEaXNhYmxlZChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZVwiOm4uaXNJblNlbGVjdGluZ1JhbmdlTW9udGgoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZVwiOm8mJnM/emUobyxzLGUsYSk6dm9pZCAwLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tcmFuZ2Utc3RhcnRcIjpuLmlzUmFuZ2VTdGFydE1vbnRoKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tcmFuZ2UtZW5kXCI6bi5pc1JhbmdlRW5kTW9udGgoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RpbmctcmFuZ2Utc3RhcnRcIjpuLmlzU2VsZWN0aW5nTW9udGhSYW5nZVN0YXJ0KGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tc2VsZWN0aW5nLXJhbmdlLWVuZFwiOm4uaXNTZWxlY3RpbmdNb250aFJhbmdlRW5kKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tdG9kYXlcIjpuLmlzQ3VycmVudE1vbnRoKGEsZSl9KX0sbi5nZXRUYWJJbmRleD1mdW5jdGlvbihlKXtpZihudWxsPT1uLnByb3BzLnByZVNlbGVjdGlvbilyZXR1cm5cIi0xXCI7dmFyIHQ9Xy5nZXRNb250aChuLnByb3BzLnByZVNlbGVjdGlvbik7cmV0dXJuIG4ucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb258fGUhPT10P1wiLTFcIjpcIjBcIn0sbi5nZXRRdWFydGVyVGFiSW5kZXg9ZnVuY3Rpb24oZSl7aWYobnVsbD09bi5wcm9wcy5wcmVTZWxlY3Rpb24pcmV0dXJuXCItMVwiO3ZhciB0PUUuZ2V0UXVhcnRlcihuLnByb3BzLnByZVNlbGVjdGlvbik7cmV0dXJuIG4ucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb258fGUhPT10P1wiLTFcIjpcIjBcIn0sbi5nZXRBcmlhTGFiZWw9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5wcm9wcyxyPXQuY2hvb3NlRGF5QXJpYUxhYmVsUHJlZml4LGE9dm9pZCAwPT09cj9cIkNob29zZVwiOnIsbz10LmRpc2FibGVkRGF5QXJpYUxhYmVsUHJlZml4LHM9dm9pZCAwPT09bz9cIk5vdCBhdmFpbGFibGVcIjpvLGk9dC5kYXksbD10LmxvY2FsZSxjPSQuc2V0TW9udGgoaSxlKSxwPW4uaXNEaXNhYmxlZChjKXx8bi5pc0V4Y2x1ZGVkKGMpP3M6YTtyZXR1cm5cIlwiLmNvbmNhdChwLFwiIFwiKS5jb25jYXQoX2UoYyxcIk1NTU0geXl5eVwiLGwpKX0sbi5nZXRRdWFydGVyQ2xhc3NOYW1lcz1mdW5jdGlvbihlKXt2YXIgcj1uLnByb3BzLGE9ci5kYXksbz1yLnN0YXJ0RGF0ZSxzPXIuZW5kRGF0ZSxpPXIuc2VsZWN0ZWQsbD1yLm1pbkRhdGUsYz1yLm1heERhdGUscD1yLmV4Y2x1ZGVEYXRlcyxkPXIuaW5jbHVkZURhdGVzLHU9ci5maWx0ZXJEYXRlLGY9ci5wcmVTZWxlY3Rpb24saD1yLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uLG09KGx8fGN8fHB8fGR8fHUpJiZHZSh6LnNldFF1YXJ0ZXIoYSxlKSxuLnByb3BzKTtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0XCIsXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLVwiLmNvbmNhdChlKSx7XCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkXCI6bSxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tc2VsZWN0ZWRcIjppP24uaXNTZWxlY3RlZFF1YXJ0ZXIoYSxlLGkpOnZvaWQgMCxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWRcIjohaCYmZiYmbi5pc1NlbGVjdGVkUXVhcnRlcihhLGUsZikmJiFtLFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2VcIjpuLmlzSW5TZWxlY3RpbmdSYW5nZVF1YXJ0ZXIoZSksXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlXCI6byYmcz9ldChvLHMsZSxhKTp2b2lkIDAsXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXJhbmdlLXN0YXJ0XCI6bi5pc1JhbmdlU3RhcnRRdWFydGVyKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1yYW5nZS1lbmRcIjpuLmlzUmFuZ2VFbmRRdWFydGVyKGUpfSl9LG4uZ2V0TW9udGhDb250ZW50PWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMscj10LnNob3dGdWxsTW9udGhZZWFyUGlja2VyLGE9dC5yZW5kZXJNb250aENvbnRlbnQsbz10LmxvY2FsZSxzPXQuZGF5LGk9VmUoZSxvKSxsPUJlKGUsbyk7cmV0dXJuIGE/YShlLGksbCxzKTpyP2w6aX0sbi5nZXRRdWFydGVyQ29udGVudD1mdW5jdGlvbihlKXt2YXIgdCxyPW4ucHJvcHMsYT1yLnJlbmRlclF1YXJ0ZXJDb250ZW50LG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gX2Uoei5zZXRRdWFydGVyKE1lKCksZSksXCJRUVFcIix0KX0oZSxyLmxvY2FsZSk7cmV0dXJuIG51bGwhPT0odD1udWxsPT1hP3ZvaWQgMDphKGUsbykpJiZ2b2lkIDAhPT10P3Q6b30sbi5yZW5kZXJNb250aHM9ZnVuY3Rpb24oKXt2YXIgZSx0PW4ucHJvcHMscj10LnNob3dUd29Db2x1bW5Nb250aFllYXJQaWNrZXIsYT10LnNob3dGb3VyQ29sdW1uTW9udGhZZWFyUGlja2VyLG89dC5kYXkscz10LnNlbGVjdGVkLGk9bnVsbD09PShlPVB0W1l0KGEscildKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5ncmlkO3JldHVybiBudWxsPT1pP3ZvaWQgMDppLm1hcCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXdyYXBwZXJcIixrZXk6dH0sZS5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtyZWY6bi5NT05USF9SRUZTW2VdLGtleTp0LG9uQ2xpY2s6ZnVuY3Rpb24odCl7bi5vbk1vbnRoQ2xpY2sodCxlKX0sb25LZXlEb3duOmZ1bmN0aW9uKHQpe3l0KHQpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQua2V5PXllLkVudGVyKSxuLm9uTW9udGhLZXlEb3duKHQsZSl9LG9uTW91c2VFbnRlcjpuLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5vbk1vbnRoTW91c2VFbnRlcihlKX0sb25Qb2ludGVyRW50ZXI6bi5wcm9wcy51c2VQb2ludGVyRXZlbnQ/ZnVuY3Rpb24oKXtyZXR1cm4gbi5vbk1vbnRoTW91c2VFbnRlcihlKX06dm9pZCAwLHRhYkluZGV4Ok51bWJlcihuLmdldFRhYkluZGV4KGUpKSxjbGFzc05hbWU6bi5nZXRNb250aENsYXNzTmFtZXMoZSksXCJhcmlhLWRpc2FibGVkXCI6bi5pc01vbnRoRGlzYWJsZWQoZSkscm9sZTpcIm9wdGlvblwiLFwiYXJpYS1sYWJlbFwiOm4uZ2V0QXJpYUxhYmVsKGUpLFwiYXJpYS1jdXJyZW50XCI6bi5pc0N1cnJlbnRNb250aChvLGUpP1wiZGF0ZVwiOnZvaWQgMCxcImFyaWEtc2VsZWN0ZWRcIjpzP24uaXNTZWxlY3RlZE1vbnRoKG8sZSxzKTp2b2lkIDB9LG4uZ2V0TW9udGhDb250ZW50KGUpKX0pKSl9KSl9LG4ucmVuZGVyUXVhcnRlcnM9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLnNlbGVjdGVkO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci13cmFwcGVyXCJ9LFsxLDIsMyw0XS5tYXAoKGZ1bmN0aW9uKGUsYSl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6YSxyZWY6bi5RVUFSVEVSX1JFRlNbYV0scm9sZTpcIm9wdGlvblwiLG9uQ2xpY2s6ZnVuY3Rpb24odCl7bi5vblF1YXJ0ZXJDbGljayh0LGUpfSxvbktleURvd246ZnVuY3Rpb24odCl7bi5vblF1YXJ0ZXJLZXlEb3duKHQsZSl9LG9uTW91c2VFbnRlcjpuLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5vblF1YXJ0ZXJNb3VzZUVudGVyKGUpfSxvblBvaW50ZXJFbnRlcjpuLnByb3BzLnVzZVBvaW50ZXJFdmVudD9mdW5jdGlvbigpe3JldHVybiBuLm9uUXVhcnRlck1vdXNlRW50ZXIoZSl9OnZvaWQgMCxjbGFzc05hbWU6bi5nZXRRdWFydGVyQ2xhc3NOYW1lcyhlKSxcImFyaWEtc2VsZWN0ZWRcIjpyP24uaXNTZWxlY3RlZFF1YXJ0ZXIodCxlLHIpOnZvaWQgMCx0YWJJbmRleDpOdW1iZXIobi5nZXRRdWFydGVyVGFiSW5kZXgoZSkpLFwiYXJpYS1jdXJyZW50XCI6bi5pc0N1cnJlbnRRdWFydGVyKHQsZSk/XCJkYXRlXCI6dm9pZCAwfSxuLmdldFF1YXJ0ZXJDb250ZW50KGUpKX0pKSl9LG4uZ2V0Q2xhc3NOYW1lcz1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMscj1lLnNlbGVjdGluZ0RhdGUsYT1lLnNlbGVjdHNTdGFydCxvPWUuc2VsZWN0c0VuZCxzPWUuc2hvd01vbnRoWWVhclBpY2tlcixpPWUuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyLGw9ZS5zaG93V2Vla1BpY2tlcjtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGhcIix7XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlXCI6ciYmKGF8fG8pfSx7XCJyZWFjdC1kYXRlcGlja2VyX19tb250aFBpY2tlclwiOnN9LHtcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXJQaWNrZXJcIjppfSx7XCJyZWFjdC1kYXRlcGlja2VyX193ZWVrUGlja2VyXCI6bH0pfSxufXJldHVybiB2ZShuLGUpLG4ucHJvdG90eXBlLmdldFNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLnNlbGVjdGVkLHI9ZS5zZWxlY3RlZERhdGVzO3JldHVybiBlLnNlbGVjdHNNdWx0aXBsZT9yOnQ/W3RdOnZvaWQgMH0sbi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuc2hvd01vbnRoWWVhclBpY2tlcixyPWUuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyLG49ZS5kYXksYT1lLmFyaWFMYWJlbFByZWZpeCxvPXZvaWQgMD09PWE/XCJNb250aCBcIjphLHM9bz9vLnRyaW0oKStcIiBcIjpcIlwiO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOnRoaXMuZ2V0Q2xhc3NOYW1lcygpLG9uTW91c2VMZWF2ZTp0aGlzLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6dGhpcy5oYW5kbGVNb3VzZUxlYXZlLG9uUG9pbnRlckxlYXZlOnRoaXMucHJvcHMudXNlUG9pbnRlckV2ZW50P3RoaXMuaGFuZGxlTW91c2VMZWF2ZTp2b2lkIDAsXCJhcmlhLWxhYmVsXCI6XCJcIi5jb25jYXQocykuY29uY2F0KF9lKG4sXCJNTU1NLCB5eXl5XCIsdGhpcy5wcm9wcy5sb2NhbGUpKSxyb2xlOlwibGlzdGJveFwifSx0P3RoaXMucmVuZGVyTW9udGhzKCk6cj90aGlzLnJlbmRlclF1YXJ0ZXJzKCk6dGhpcy5yZW5kZXJXZWVrcygpKX0sbn0oci5Db21wb25lbnQpLE50PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuaXNTZWxlY3RlZE1vbnRoPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3BzLm1vbnRoPT09ZX0sdC5yZW5kZXJPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvcHMubW9udGhOYW1lcy5tYXAoKGZ1bmN0aW9uKGUscil7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6dC5pc1NlbGVjdGVkTW9udGgocik/XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24gcmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLS1zZWxlY3RlZF9tb250aFwiOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uXCIsa2V5OmUsb25DbGljazp0Lm9uQ2hhbmdlLmJpbmQodCxyKSxcImFyaWEtc2VsZWN0ZWRcIjp0LmlzU2VsZWN0ZWRNb250aChyKT9cInRydWVcIjp2b2lkIDB9LHQuaXNTZWxlY3RlZE1vbnRoKHIpP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLS1zZWxlY3RlZFwifSxcIuKck1wiKTpcIlwiLGUpfSkpfSx0Lm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3BzLm9uQ2hhbmdlKGUpfSx0LmhhbmRsZUNsaWNrT3V0c2lkZT1mdW5jdGlvbigpe3JldHVybiB0LnByb3BzLm9uQ2FuY2VsKCl9LHR9cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93blwifSx0aGlzLnJlbmRlck9wdGlvbnMoKSl9LHR9KHIuQ29tcG9uZW50KSxPdD1mZS5kZWZhdWx0KE50KSxJdD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIHQ9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiB0LnN0YXRlPXtkcm9wZG93blZpc2libGU6ITF9LHQucmVuZGVyU2VsZWN0T3B0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLHtrZXk6ZSx2YWx1ZTp0fSxlKX0pKX0sdC5yZW5kZXJTZWxlY3RNb2RlPWZ1bmN0aW9uKGUpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIix7dmFsdWU6dC5wcm9wcy5tb250aCxjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1zZWxlY3RcIixvbkNoYW5nZTpmdW5jdGlvbihlKXtyZXR1cm4gdC5vbkNoYW5nZShwYXJzZUludChlLnRhcmdldC52YWx1ZSkpfX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zKGUpKX0sdC5yZW5kZXJSZWFkVmlldz1mdW5jdGlvbihlLHIpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7a2V5OlwicmVhZFwiLHN0eWxlOnt2aXNpYmlsaXR5OmU/XCJ2aXNpYmxlXCI6XCJoaWRkZW5cIn0sY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3XCIsb25DbGljazp0LnRvZ2dsZURyb3Bkb3dufSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvd1wifSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLXNlbGVjdGVkLW1vbnRoXCJ9LHJbdC5wcm9wcy5tb250aF0pKX0sdC5yZW5kZXJEcm9wZG93bj1mdW5jdGlvbihlKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE90LGdlKHtrZXk6XCJkcm9wZG93blwifSx0LnByb3BzLHttb250aE5hbWVzOmUsb25DaGFuZ2U6dC5vbkNoYW5nZSxvbkNhbmNlbDp0LnRvZ2dsZURyb3Bkb3dufSkpfSx0LnJlbmRlclNjcm9sbE1vZGU9ZnVuY3Rpb24oZSl7dmFyIHI9dC5zdGF0ZS5kcm9wZG93blZpc2libGUsbj1bdC5yZW5kZXJSZWFkVmlldyghcixlKV07cmV0dXJuIHImJm4udW5zaGlmdCh0LnJlbmRlckRyb3Bkb3duKGUpKSxufSx0Lm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3QudG9nZ2xlRHJvcGRvd24oKSxlIT09dC5wcm9wcy5tb250aCYmdC5wcm9wcy5vbkNoYW5nZShlKX0sdC50b2dnbGVEcm9wZG93bj1mdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHtkcm9wZG93blZpc2libGU6IXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlfSl9LHR9cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLHI9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTFdLm1hcCh0aGlzLnByb3BzLnVzZVNob3J0TW9udGhJbkRyb3Bkb3duP2Z1bmN0aW9uKGUpe3JldHVybiBWZShlLHQucHJvcHMubG9jYWxlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIEJlKGUsdC5wcm9wcy5sb2NhbGUpfSk7c3dpdGNoKHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKXtjYXNlXCJzY3JvbGxcIjplPXRoaXMucmVuZGVyU2Nyb2xsTW9kZShyKTticmVhaztjYXNlXCJzZWxlY3RcIjplPXRoaXMucmVuZGVyU2VsZWN0TW9kZShyKX1yZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLWNvbnRhaW5lciByZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi1jb250YWluZXItLVwiLmNvbmNhdCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl9LGUpfSx0fShyLkNvbXBvbmVudCk7ZnVuY3Rpb24gVHQoZSx0KXtmb3IodmFyIHI9W10sbj1OZShlKSxhPU5lKHQpOyFOLmlzQWZ0ZXIobixhKTspci5wdXNoKE1lKG4pKSxuPWkuYWRkTW9udGhzKG4sMSk7cmV0dXJuIHJ9dmFyIFJ0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIodCl7dmFyIHI9ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIHIucmVuZGVyT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiByLnN0YXRlLm1vbnRoWWVhcnNMaXN0Lm1hcCgoZnVuY3Rpb24oZSl7dmFyIHQ9WS5nZXRUaW1lKGUpLG49TGUoci5wcm9wcy5kYXRlLGUpJiZBZShyLnByb3BzLmRhdGUsZSk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6bj9cInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uLS1zZWxlY3RlZF9tb250aC15ZWFyXCI6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvblwiLGtleTp0LG9uQ2xpY2s6ci5vbkNoYW5nZS5iaW5kKHIsdCksXCJhcmlhLXNlbGVjdGVkXCI6bj9cInRydWVcIjp2b2lkIDB9LG4/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbi0tc2VsZWN0ZWRcIn0sXCLinJNcIik6XCJcIixfZShlLHIucHJvcHMuZGF0ZUZvcm1hdCxyLnByb3BzLmxvY2FsZSkpfSkpfSxyLm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiByLnByb3BzLm9uQ2hhbmdlKGUpfSxyLmhhbmRsZUNsaWNrT3V0c2lkZT1mdW5jdGlvbigpe3IucHJvcHMub25DYW5jZWwoKX0sci5zdGF0ZT17bW9udGhZZWFyc0xpc3Q6VHQoci5wcm9wcy5taW5EYXRlLHIucHJvcHMubWF4RGF0ZSl9LHJ9cmV0dXJuIHZlKHIsZSksci5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dC5jbHN4KHtcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd25cIjohMCxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tLXNjcm9sbGFibGVcIjp0aGlzLnByb3BzLnNjcm9sbGFibGVNb250aFllYXJEcm9wZG93bn0pO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOmV9LHRoaXMucmVuZGVyT3B0aW9ucygpKX0scn0oci5Db21wb25lbnQpLEx0PWZlLmRlZmF1bHQoUnQpLEF0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuc3RhdGU9e2Ryb3Bkb3duVmlzaWJsZTohMX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPU5lKHQucHJvcHMubWluRGF0ZSkscj1OZSh0LnByb3BzLm1heERhdGUpLG49W107IU4uaXNBZnRlcihlLHIpOyl7dmFyIGE9WS5nZXRUaW1lKGUpO24ucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIix7a2V5OmEsdmFsdWU6YX0sX2UoZSx0LnByb3BzLmRhdGVGb3JtYXQsdC5wcm9wcy5sb2NhbGUpKSksZT1pLmFkZE1vbnRocyhlLDEpfXJldHVybiBufSx0Lm9uU2VsZWN0Q2hhbmdlPWZ1bmN0aW9uKGUpe3Qub25DaGFuZ2UocGFyc2VJbnQoZS50YXJnZXQudmFsdWUpKX0sdC5yZW5kZXJTZWxlY3RNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiLHt2YWx1ZTpZLmdldFRpbWUoTmUodC5wcm9wcy5kYXRlKSksY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1zZWxlY3RcIixvbkNoYW5nZTp0Lm9uU2VsZWN0Q2hhbmdlfSx0LnJlbmRlclNlbGVjdE9wdGlvbnMoKSl9LHQucmVuZGVyUmVhZFZpZXc9ZnVuY3Rpb24oZSl7dmFyIHI9X2UodC5wcm9wcy5kYXRlLHQucHJvcHMuZGF0ZUZvcm1hdCx0LnByb3BzLmxvY2FsZSk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6XCJyZWFkXCIsc3R5bGU6e3Zpc2liaWxpdHk6ZT9cInZpc2libGVcIjpcImhpZGRlblwifSxjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlld1wiLG9uQ2xpY2s6dC50b2dnbGVEcm9wZG93bn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvd1wifSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tc2VsZWN0ZWQtbW9udGgteWVhclwifSxyKSl9LHQucmVuZGVyRHJvcGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEx0LGdlKHtrZXk6XCJkcm9wZG93blwifSx0LnByb3BzLHtvbkNoYW5nZTp0Lm9uQ2hhbmdlLG9uQ2FuY2VsOnQudG9nZ2xlRHJvcGRvd259KSl9LHQucmVuZGVyU2Nyb2xsTW9kZT1mdW5jdGlvbigpe3ZhciBlPXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlLHI9W3QucmVuZGVyUmVhZFZpZXcoIWUpXTtyZXR1cm4gZSYmci51bnNoaWZ0KHQucmVuZGVyRHJvcGRvd24oKSkscn0sdC5vbkNoYW5nZT1mdW5jdGlvbihlKXt0LnRvZ2dsZURyb3Bkb3duKCk7dmFyIHI9TWUoZSk7TGUodC5wcm9wcy5kYXRlLHIpJiZBZSh0LnByb3BzLmRhdGUscil8fHQucHJvcHMub25DaGFuZ2Uocil9LHQudG9nZ2xlRHJvcGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdC5zZXRTdGF0ZSh7ZHJvcGRvd25WaXNpYmxlOiF0LnN0YXRlLmRyb3Bkb3duVmlzaWJsZX0pfSx0fXJldHVybiB2ZSh0LGUpLHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlO3N3aXRjaCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl7Y2FzZVwic2Nyb2xsXCI6ZT10aGlzLnJlbmRlclNjcm9sbE1vZGUoKTticmVhaztjYXNlXCJzZWxlY3RcIjplPXRoaXMucmVuZGVyU2VsZWN0TW9kZSgpfXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXIgcmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXItLVwiLmNvbmNhdCh0aGlzLnByb3BzLmRyb3Bkb3duTW9kZSl9LGUpfSx0fShyLkNvbXBvbmVudCksRnQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciByPW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gci5zdGF0ZT17aGVpZ2h0Om51bGx9LHIuc2Nyb2xsVG9UaGVTZWxlY3RlZFRpbWU9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dmFyIGUsbixhO3IubGlzdCYmKHIubGlzdC5zY3JvbGxUb3A9bnVsbCE9PShhPXIuY2VudGVyTGkmJnQuY2FsY0NlbnRlclBvc2l0aW9uKHIucHJvcHMubW9udGhSZWY/ci5wcm9wcy5tb250aFJlZi5jbGllbnRIZWlnaHQtKG51bGwhPT0obj1udWxsPT09KGU9ci5oZWFkZXIpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNsaWVudEhlaWdodCkmJnZvaWQgMCE9PW4/bjowKTpyLmxpc3QuY2xpZW50SGVpZ2h0LHIuY2VudGVyTGkpKSYmdm9pZCAwIT09YT9hOjApfSkpfSxyLmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGUpe3ZhciB0LG47KHIucHJvcHMubWluVGltZXx8ci5wcm9wcy5tYXhUaW1lKSYmYXQoZSxyLnByb3BzKXx8KHIucHJvcHMuZXhjbHVkZVRpbWVzfHxyLnByb3BzLmluY2x1ZGVUaW1lc3x8ci5wcm9wcy5maWx0ZXJUaW1lKSYmbnQoZSxyLnByb3BzKXx8bnVsbD09PShuPSh0PXIucHJvcHMpLm9uQ2hhbmdlKXx8dm9pZCAwPT09bnx8bi5jYWxsKHQsZSl9LHIuaXNTZWxlY3RlZFRpbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHIucHJvcHMuc2VsZWN0ZWQmJih0PXIucHJvcHMuc2VsZWN0ZWQsbj1lLHZ0KHQpLmdldFRpbWUoKT09PXZ0KG4pLmdldFRpbWUoKSk7dmFyIHQsbn0sci5pc0Rpc2FibGVkVGltZT1mdW5jdGlvbihlKXtyZXR1cm4oci5wcm9wcy5taW5UaW1lfHxyLnByb3BzLm1heFRpbWUpJiZhdChlLHIucHJvcHMpfHwoci5wcm9wcy5leGNsdWRlVGltZXN8fHIucHJvcHMuaW5jbHVkZVRpbWVzfHxyLnByb3BzLmZpbHRlclRpbWUpJiZudChlLHIucHJvcHMpfSxyLmxpQ2xhc3Nlcz1mdW5jdGlvbihlKXt2YXIgbixhPVtcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtXCIsci5wcm9wcy50aW1lQ2xhc3NOYW1lP3IucHJvcHMudGltZUNsYXNzTmFtZShlKTp2b2lkIDBdO3JldHVybiByLmlzU2VsZWN0ZWRUaW1lKGUpJiZhLnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tc2VsZWN0ZWRcIiksci5pc0Rpc2FibGVkVGltZShlKSYmYS5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLWRpc2FibGVkXCIpLHIucHJvcHMuaW5qZWN0VGltZXMmJigzNjAwKmIuZ2V0SG91cnMoZSkrNjAqQy5nZXRNaW51dGVzKGUpK1AuZ2V0U2Vjb25kcyhlKSklKDYwKihudWxsIT09KG49ci5wcm9wcy5pbnRlcnZhbHMpJiZ2b2lkIDAhPT1uP246dC5kZWZhdWx0UHJvcHMuaW50ZXJ2YWxzKSkhPTAmJmEucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1pbmplY3RlZFwiKSxhLmpvaW4oXCIgXCIpfSxyLmhhbmRsZU9uS2V5RG93bj1mdW5jdGlvbihlLHQpe3ZhciBuLGE7ZS5rZXk9PT15ZS5TcGFjZSYmKGUucHJldmVudERlZmF1bHQoKSxlLmtleT15ZS5FbnRlciksKGUua2V5PT09eWUuQXJyb3dVcHx8ZS5rZXk9PT15ZS5BcnJvd0xlZnQpJiZlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZlLnRhcmdldC5wcmV2aW91c1NpYmxpbmcmJihlLnByZXZlbnREZWZhdWx0KCksZS50YXJnZXQucHJldmlvdXNTaWJsaW5nIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmUudGFyZ2V0LnByZXZpb3VzU2libGluZy5mb2N1cygpKSwoZS5rZXk9PT15ZS5BcnJvd0Rvd258fGUua2V5PT09eWUuQXJyb3dSaWdodCkmJmUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmUudGFyZ2V0Lm5leHRTaWJsaW5nJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUudGFyZ2V0Lm5leHRTaWJsaW5nIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmUudGFyZ2V0Lm5leHRTaWJsaW5nLmZvY3VzKCkpLGUua2V5PT09eWUuRW50ZXImJnIuaGFuZGxlQ2xpY2sodCksbnVsbD09PShhPShuPXIucHJvcHMpLmhhbmRsZU9uS2V5RG93bil8fHZvaWQgMD09PWF8fGEuY2FsbChuLGUpfSxyLnJlbmRlclRpbWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLG49W10sYT1yLnByb3BzLmZvcm1hdD9yLnByb3BzLmZvcm1hdDpcInBcIixvPW51bGwhPT0oZT1yLnByb3BzLmludGVydmFscykmJnZvaWQgMCE9PWU/ZTp0LmRlZmF1bHRQcm9wcy5pbnRlcnZhbHMsaT1yLnByb3BzLnNlbGVjdGVkfHxyLnByb3BzLm9wZW5Ub0RhdGV8fE1lKCksbD1ZZShpKSxjPXIucHJvcHMuaW5qZWN0VGltZXMmJnIucHJvcHMuaW5qZWN0VGltZXMuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5nZXRUaW1lKCktdC5nZXRUaW1lKCl9KSkscD02MCpmdW5jdGlvbihlKXt2YXIgdD1uZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLGUuZ2V0RGF0ZSgpKSxyPW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSxlLmdldE1vbnRoKCksZS5nZXREYXRlKCksMjQpO3JldHVybiBNYXRoLnJvdW5kKCgrci0rdCkvMzZlNSl9KGkpLGQ9cC9vLHU9MDt1PGQ7dSsrKXt2YXIgZj1zLmFkZE1pbnV0ZXMobCx1Km8pO2lmKG4ucHVzaChmKSxjKXt2YXIgaD1mdChsLGYsdSxvLGMpO249bi5jb25jYXQoaCl9fXZhciBtPW4ucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiB0LmdldFRpbWUoKTw9aS5nZXRUaW1lKCk/dDplfSksblswXSk7cmV0dXJuIG4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwibGlcIix7a2V5OmUudmFsdWVPZigpLG9uQ2xpY2s6ci5oYW5kbGVDbGljay5iaW5kKHIsZSksY2xhc3NOYW1lOnIubGlDbGFzc2VzKGUpLHJlZjpmdW5jdGlvbih0KXtlPT09bSYmKHIuY2VudGVyTGk9dCl9LG9uS2V5RG93bjpmdW5jdGlvbih0KXtyLmhhbmRsZU9uS2V5RG93bih0LGUpfSx0YWJJbmRleDplPT09bT8wOi0xLHJvbGU6XCJvcHRpb25cIixcImFyaWEtc2VsZWN0ZWRcIjpyLmlzU2VsZWN0ZWRUaW1lKGUpP1widHJ1ZVwiOnZvaWQgMCxcImFyaWEtZGlzYWJsZWRcIjpyLmlzRGlzYWJsZWRUaW1lKGUpP1widHJ1ZVwiOnZvaWQgMH0sX2UoZSxhLHIucHJvcHMubG9jYWxlKSl9KSl9LHJ9cmV0dXJuIHZlKHQsZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2ludGVydmFsczozMCx0b2RheUJ1dHRvbjpudWxsLHRpbWVDYXB0aW9uOlwiVGltZVwifX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSx0LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMuc2Nyb2xsVG9UaGVTZWxlY3RlZFRpbWUoKSx0aGlzLnByb3BzLm1vbnRoUmVmJiZ0aGlzLmhlYWRlciYmdGhpcy5zZXRTdGF0ZSh7aGVpZ2h0OnRoaXMucHJvcHMubW9udGhSZWYuY2xpZW50SGVpZ2h0LXRoaXMuaGVhZGVyLmNsaWVudEhlaWdodH0pfSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZSxyPXRoaXMsbj10aGlzLnN0YXRlLmhlaWdodDtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIFwiLmNvbmNhdCgobnVsbCE9PShlPXRoaXMucHJvcHMudG9kYXlCdXR0b24pJiZ2b2lkIDAhPT1lP2U6dC5kZWZhdWx0UHJvcHMudG9kYXlCdXR0b24pP1wicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXItLXdpdGgtdG9kYXktYnV0dG9uXCI6XCJcIil9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXIgcmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lIFwiLmNvbmNhdCh0aGlzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seT9cInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZS0tb25seVwiOlwiXCIpLHJlZjpmdW5jdGlvbihlKXtyLmhlYWRlcj1lfX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyXCJ9LHRoaXMucHJvcHMudGltZUNhcHRpb24pKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZVwifSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3hcIn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwidWxcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0XCIscmVmOmZ1bmN0aW9uKGUpe3IubGlzdD1lfSxzdHlsZTpuP3toZWlnaHQ6bn06e30scm9sZTpcImxpc3Rib3hcIixcImFyaWEtbGFiZWxcIjp0aGlzLnByb3BzLnRpbWVDYXB0aW9ufSx0aGlzLnJlbmRlclRpbWVzKCkpKSkpfSx0LmNhbGNDZW50ZXJQb3NpdGlvbj1mdW5jdGlvbihlLHQpe3JldHVybiB0Lm9mZnNldFRvcC0oZS8yLXQuY2xpZW50SGVpZ2h0LzIpfSx0fShyLkNvbXBvbmVudCksSHQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihuKXt2YXIgYT1lLmNhbGwodGhpcyxuKXx8dGhpcztyZXR1cm4gYS5ZRUFSX1JFRlM9RGUoW10sQXJyYXkoYS5wcm9wcy55ZWFySXRlbU51bWJlciksITApLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gci5jcmVhdGVSZWYoKX0pKSxhLmlzRGlzYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGplKGUse21pbkRhdGU6YS5wcm9wcy5taW5EYXRlLG1heERhdGU6YS5wcm9wcy5tYXhEYXRlLGV4Y2x1ZGVEYXRlczphLnByb3BzLmV4Y2x1ZGVEYXRlcyxpbmNsdWRlRGF0ZXM6YS5wcm9wcy5pbmNsdWRlRGF0ZXMsZmlsdGVyRGF0ZTphLnByb3BzLmZpbHRlckRhdGV9KX0sYS5pc0V4Y2x1ZGVkPWZ1bmN0aW9uKGUpe3JldHVybiBVZShlLHtleGNsdWRlRGF0ZXM6YS5wcm9wcy5leGNsdWRlRGF0ZXN9KX0sYS5zZWxlY3RpbmdEYXRlPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIG51bGwhPT0oZT1hLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT1lP2U6YS5wcm9wcy5wcmVTZWxlY3Rpb259LGEudXBkYXRlRm9jdXNPblBhZ2luYXRlPWZ1bmN0aW9uKGUpe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dmFyIHQscjtudWxsPT09KHI9bnVsbD09PSh0PWEuWUVBUl9SRUZTW2VdKXx8dm9pZCAwPT09dD92b2lkIDA6dC5jdXJyZW50KXx8dm9pZCAwPT09cnx8ci5mb2N1cygpfSkpfSxhLmhhbmRsZVllYXJDbGljaz1mdW5jdGlvbihlLHQpe2EucHJvcHMub25EYXlDbGljayYmYS5wcm9wcy5vbkRheUNsaWNrKGUsdCl9LGEuaGFuZGxlWWVhck5hdmlnYXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcixuLG8scyxpPWEucHJvcHMsbD1pLmRhdGUsYz1pLnllYXJJdGVtTnVtYmVyO2lmKHZvaWQgMCE9PWwmJnZvaWQgMCE9PWMpe3ZhciBwPW10KGwsYykuc3RhcnRQZXJpb2Q7YS5pc0Rpc2FibGVkKHQpfHxhLmlzRXhjbHVkZWQodCl8fChudWxsPT09KG49KHI9YS5wcm9wcykuc2V0UHJlU2VsZWN0aW9uKXx8dm9pZCAwPT09bnx8bi5jYWxsKHIsdCksZS1wPDA/YS51cGRhdGVGb2N1c09uUGFnaW5hdGUoYy0ocC1lKSk6ZS1wPj1jP2EudXBkYXRlRm9jdXNPblBhZ2luYXRlKE1hdGguYWJzKGMtKGUtcCkpKTpudWxsPT09KHM9bnVsbD09PShvPWEuWUVBUl9SRUZTW2UtcF0pfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmN1cnJlbnQpfHx2b2lkIDA9PT1zfHxzLmZvY3VzKCkpfX0sYS5pc1NhbWVEYXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSGUoZSx0KX0sYS5pc0N1cnJlbnRZZWFyPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09eC5nZXRZZWFyKE1lKCkpfSxhLmlzUmFuZ2VTdGFydD1mdW5jdGlvbihlKXtyZXR1cm4gYS5wcm9wcy5zdGFydERhdGUmJmEucHJvcHMuZW5kRGF0ZSYmTGUoRy5zZXRZZWFyKE1lKCksZSksYS5wcm9wcy5zdGFydERhdGUpfSxhLmlzUmFuZ2VFbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGEucHJvcHMuc3RhcnREYXRlJiZhLnByb3BzLmVuZERhdGUmJkxlKEcuc2V0WWVhcihNZSgpLGUpLGEucHJvcHMuZW5kRGF0ZSl9LGEuaXNJblJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBKZShlLGEucHJvcHMuc3RhcnREYXRlLGEucHJvcHMuZW5kRGF0ZSl9LGEuaXNJblNlbGVjdGluZ1JhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWEucHJvcHMscj10LnNlbGVjdHNTdGFydCxuPXQuc2VsZWN0c0VuZCxvPXQuc2VsZWN0c1JhbmdlLHM9dC5zdGFydERhdGUsaT10LmVuZERhdGU7cmV0dXJuISghKHJ8fG58fG8pfHwhYS5zZWxlY3RpbmdEYXRlKCkpJiYociYmaT9KZShlLGEuc2VsZWN0aW5nRGF0ZSgpLGkpOihuJiZzfHwhKCFvfHwhc3x8aSkpJiZKZShlLHMsYS5zZWxlY3RpbmdEYXRlKCkpKX0sYS5pc1NlbGVjdGluZ1JhbmdlU3RhcnQ9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIWEuaXNJblNlbGVjdGluZ1JhbmdlKGUpKXJldHVybiExO3ZhciByPWEucHJvcHMsbj1yLnN0YXJ0RGF0ZSxvPXIuc2VsZWN0c1N0YXJ0LHM9Ry5zZXRZZWFyKE1lKCksZSk7cmV0dXJuIExlKHMsbz9udWxsIT09KHQ9YS5zZWxlY3RpbmdEYXRlKCkpJiZ2b2lkIDAhPT10P3Q6bnVsbDpudWxsIT1uP246bnVsbCl9LGEuaXNTZWxlY3RpbmdSYW5nZUVuZD1mdW5jdGlvbihlKXt2YXIgdDtpZighYS5pc0luU2VsZWN0aW5nUmFuZ2UoZSkpcmV0dXJuITE7dmFyIHI9YS5wcm9wcyxuPXIuZW5kRGF0ZSxvPXIuc2VsZWN0c0VuZCxzPXIuc2VsZWN0c1JhbmdlLGk9Ry5zZXRZZWFyKE1lKCksZSk7cmV0dXJuIExlKGksb3x8cz9udWxsIT09KHQ9YS5zZWxlY3RpbmdEYXRlKCkpJiZ2b2lkIDAhPT10P3Q6bnVsbDpudWxsIT1uP246bnVsbCl9LGEuaXNLZXlib2FyZFNlbGVjdGVkPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PWEucHJvcHMuZGF0ZSYmbnVsbCE9YS5wcm9wcy5zZWxlY3RlZCYmbnVsbCE9YS5wcm9wcy5wcmVTZWxlY3Rpb24pe3ZhciB0PWEucHJvcHMscj10Lm1pbkRhdGUsbj10Lm1heERhdGUsbz10LmV4Y2x1ZGVEYXRlcyxzPXQuaW5jbHVkZURhdGVzLGk9dC5maWx0ZXJEYXRlLGw9T2UoRy5zZXRZZWFyKGEucHJvcHMuZGF0ZSxlKSksYz0ocnx8bnx8b3x8c3x8aSkmJlplKGUsYS5wcm9wcyk7cmV0dXJuIWEucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24mJiFhLnByb3BzLmlubGluZSYmIUhlKGwsT2UoYS5wcm9wcy5zZWxlY3RlZCkpJiZIZShsLE9lKGEucHJvcHMucHJlU2VsZWN0aW9uKSkmJiFjfX0sYS5vblllYXJDbGljaz1mdW5jdGlvbihlLHQpe3ZhciByPWEucHJvcHMuZGF0ZTt2b2lkIDAhPT1yJiZhLmhhbmRsZVllYXJDbGljayhPZShHLnNldFllYXIocix0KSksZSl9LGEub25ZZWFyS2V5RG93bj1mdW5jdGlvbihlLHQpe3ZhciByLG4sbz1lLmtleSxzPWEucHJvcHMsaT1zLmRhdGUsbD1zLnllYXJJdGVtTnVtYmVyLGM9cy5oYW5kbGVPbktleURvd247aWYobyE9PXllLlRhYiYmZS5wcmV2ZW50RGVmYXVsdCgpLCFhLnByb3BzLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uKXN3aXRjaChvKXtjYXNlIHllLkVudGVyOmlmKG51bGw9PWEucHJvcHMuc2VsZWN0ZWQpYnJlYWs7YS5vblllYXJDbGljayhlLHQpLG51bGw9PT0obj0ocj1hLnByb3BzKS5zZXRQcmVTZWxlY3Rpb24pfHx2b2lkIDA9PT1ufHxuLmNhbGwocixhLnByb3BzLnNlbGVjdGVkKTticmVhaztjYXNlIHllLkFycm93UmlnaHQ6aWYobnVsbD09YS5wcm9wcy5wcmVTZWxlY3Rpb24pYnJlYWs7YS5oYW5kbGVZZWFyTmF2aWdhdGlvbih0KzEsZC5hZGRZZWFycyhhLnByb3BzLnByZVNlbGVjdGlvbiwxKSk7YnJlYWs7Y2FzZSB5ZS5BcnJvd0xlZnQ6aWYobnVsbD09YS5wcm9wcy5wcmVTZWxlY3Rpb24pYnJlYWs7YS5oYW5kbGVZZWFyTmF2aWdhdGlvbih0LTEsaWUuc3ViWWVhcnMoYS5wcm9wcy5wcmVTZWxlY3Rpb24sMSkpO2JyZWFrO2Nhc2UgeWUuQXJyb3dVcDppZih2b2lkIDA9PT1pfHx2b2lkIDA9PT1sfHxudWxsPT1hLnByb3BzLnByZVNlbGVjdGlvbilicmVhazt2YXIgcD1tdChpLGwpLnN0YXJ0UGVyaW9kO2lmKChoPXQtKGY9MykpPHApe3ZhciB1PWwlZjt0Pj1wJiZ0PHArdT9mPXU6Zis9dSxoPXQtZn1hLmhhbmRsZVllYXJOYXZpZ2F0aW9uKGgsaWUuc3ViWWVhcnMoYS5wcm9wcy5wcmVTZWxlY3Rpb24sZikpO2JyZWFrO2Nhc2UgeWUuQXJyb3dEb3duOmlmKHZvaWQgMD09PWl8fHZvaWQgMD09PWx8fG51bGw9PWEucHJvcHMucHJlU2VsZWN0aW9uKWJyZWFrO3ZhciBmLGgsbT1tdChpLGwpLmVuZFBlcmlvZDtpZigoaD10KyhmPTMpKT5tKXt1PWwlZjt0PD1tJiZ0Pm0tdT9mPXU6Zis9dSxoPXQrZn1hLmhhbmRsZVllYXJOYXZpZ2F0aW9uKGgsZC5hZGRZZWFycyhhLnByb3BzLnByZVNlbGVjdGlvbixmKSl9YyYmYyhlKX0sYS5nZXRZZWFyQ2xhc3NOYW1lcz1mdW5jdGlvbihlKXt2YXIgcj1hLnByb3BzLG49ci5kYXRlLG89ci5taW5EYXRlLHM9ci5tYXhEYXRlLGk9ci5zZWxlY3RlZCxsPXIuZXhjbHVkZURhdGVzLGM9ci5pbmNsdWRlRGF0ZXMscD1yLmZpbHRlckRhdGUsZD1yLnllYXJDbGFzc05hbWU7cmV0dXJuIHQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dFwiLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1cIi5jb25jYXQoZSksbj9udWxsPT1kP3ZvaWQgMDpkKEcuc2V0WWVhcihuLGUpKTp2b2lkIDAse1wicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RlZFwiOmk/ZT09PXguZ2V0WWVhcihpKTp2b2lkIDAsXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkXCI6KG98fHN8fGx8fGN8fHApJiZaZShlLGEucHJvcHMpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZFwiOmEuaXNLZXlib2FyZFNlbGVjdGVkKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1yYW5nZS1zdGFydFwiOmEuaXNSYW5nZVN0YXJ0KGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1yYW5nZS1lbmRcIjphLmlzUmFuZ2VFbmQoZSksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlXCI6YS5pc0luUmFuZ2UoZSksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZVwiOmEuaXNJblNlbGVjdGluZ1JhbmdlKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RpbmctcmFuZ2Utc3RhcnRcIjphLmlzU2VsZWN0aW5nUmFuZ2VTdGFydChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0aW5nLXJhbmdlLWVuZFwiOmEuaXNTZWxlY3RpbmdSYW5nZUVuZChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tdG9kYXlcIjphLmlzQ3VycmVudFllYXIoZSl9KX0sYS5nZXRZZWFyVGFiSW5kZXg9ZnVuY3Rpb24oZSl7cmV0dXJuIGEucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb258fG51bGw9PWEucHJvcHMucHJlU2VsZWN0aW9uP1wiLTFcIjplPT09eC5nZXRZZWFyKGEucHJvcHMucHJlU2VsZWN0aW9uKT9cIjBcIjpcIi0xXCJ9LGEuZ2V0WWVhckNvbnRhaW5lckNsYXNzTmFtZXM9ZnVuY3Rpb24oKXt2YXIgZT1hLnByb3BzLHI9ZS5zZWxlY3RpbmdEYXRlLG49ZS5zZWxlY3RzU3RhcnQsbz1lLnNlbGVjdHNFbmQscz1lLnNlbGVjdHNSYW5nZTtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhclwiLHtcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZVwiOnImJihufHxvfHxzKX0pfSxhLmdldFllYXJDb250ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhLnByb3BzLnJlbmRlclllYXJDb250ZW50P2EucHJvcHMucmVuZGVyWWVhckNvbnRlbnQoZSk6ZX0sYX1yZXR1cm4gdmUobixlKSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9W10scj10aGlzLnByb3BzLG49ci5kYXRlLGE9ci55ZWFySXRlbU51bWJlcixvPXIub25ZZWFyTW91c2VFbnRlcixzPXIub25ZZWFyTW91c2VMZWF2ZTtpZih2b2lkIDA9PT1uKXJldHVybiBudWxsO2Zvcih2YXIgaT1tdChuLGEpLGw9aS5zdGFydFBlcmlvZCxjPWkuZW5kUGVyaW9kLHA9ZnVuY3Rpb24ocil7dC5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtyZWY6ZC5ZRUFSX1JFRlNbci1sXSxvbkNsaWNrOmZ1bmN0aW9uKHQpe2Uub25ZZWFyQ2xpY2sodCxyKX0sb25LZXlEb3duOmZ1bmN0aW9uKHQpe3l0KHQpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQua2V5PXllLkVudGVyKSxlLm9uWWVhcktleURvd24odCxyKX0sdGFiSW5kZXg6TnVtYmVyKGQuZ2V0WWVhclRhYkluZGV4KHIpKSxjbGFzc05hbWU6ZC5nZXRZZWFyQ2xhc3NOYW1lcyhyKSxvbk1vdXNlRW50ZXI6ZC5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOmZ1bmN0aW9uKGUpe3JldHVybiBvKGUscil9LG9uUG9pbnRlckVudGVyOmQucHJvcHMudXNlUG9pbnRlckV2ZW50P2Z1bmN0aW9uKGUpe3JldHVybiBvKGUscil9OnZvaWQgMCxvbk1vdXNlTGVhdmU6ZC5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dm9pZCAwOmZ1bmN0aW9uKGUpe3JldHVybiBzKGUscil9LG9uUG9pbnRlckxlYXZlOmQucHJvcHMudXNlUG9pbnRlckV2ZW50P2Z1bmN0aW9uKGUpe3JldHVybiBzKGUscil9OnZvaWQgMCxrZXk6cixcImFyaWEtY3VycmVudFwiOmQuaXNDdXJyZW50WWVhcihyKT9cImRhdGVcIjp2b2lkIDB9LGQuZ2V0WWVhckNvbnRlbnQocikpKX0sZD10aGlzLHU9bDt1PD1jO3UrKylwKHUpO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOnRoaXMuZ2V0WWVhckNvbnRhaW5lckNsYXNzTmFtZXMoKX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItd3JhcHBlclwiLG9uTW91c2VMZWF2ZTp0aGlzLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6dGhpcy5wcm9wcy5jbGVhclNlbGVjdGluZ0RhdGUsb25Qb2ludGVyTGVhdmU6dGhpcy5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dGhpcy5wcm9wcy5jbGVhclNlbGVjdGluZ0RhdGU6dm9pZCAwfSx0KSl9LG59KHIuQ29tcG9uZW50KTtmdW5jdGlvbiBXdChlLHQscixuKXtmb3IodmFyIGE9W10sbz0wO288Mip0KzE7bysrKXt2YXIgcz1lK3QtbyxpPSEwO3ImJihpPXguZ2V0WWVhcihyKTw9cyksbiYmaSYmKGk9eC5nZXRZZWFyKG4pPj1zKSxpJiZhLnB1c2gocyl9cmV0dXJuIGF9dmFyIFF0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7bi5yZW5kZXJPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcy55ZWFyLHQ9bi5zdGF0ZS55ZWFyc0xpc3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTplPT09dD9cInJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uIHJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLS1zZWxlY3RlZF95ZWFyXCI6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvblwiLGtleTp0LG9uQ2xpY2s6bi5vbkNoYW5nZS5iaW5kKG4sdCksXCJhcmlhLXNlbGVjdGVkXCI6ZT09PXQ/XCJ0cnVlXCI6dm9pZCAwfSxlPT09dD91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLS1zZWxlY3RlZFwifSxcIuKck1wiKTpcIlwiLHQpfSkpLHI9bi5wcm9wcy5taW5EYXRlP3guZ2V0WWVhcihuLnByb3BzLm1pbkRhdGUpOm51bGwsYT1uLnByb3BzLm1heERhdGU/eC5nZXRZZWFyKG4ucHJvcHMubWF4RGF0ZSk6bnVsbDtyZXR1cm4gYSYmbi5zdGF0ZS55ZWFyc0xpc3QuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1hfSkpfHx0LnVuc2hpZnQodWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uXCIsa2V5OlwidXBjb21pbmdcIixvbkNsaWNrOm4uaW5jcmVtZW50WWVhcnN9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImFcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbiByZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycyByZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZ1wifSkpKSxyJiZuLnN0YXRlLnllYXJzTGlzdC5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXJ9KSl8fHQucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb25cIixrZXk6XCJwcmV2aW91c1wiLG9uQ2xpY2s6bi5kZWNyZW1lbnRZZWFyc30sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYVwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uIHJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzIHJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzXCJ9KSkpLHR9LG4ub25DaGFuZ2U9ZnVuY3Rpb24oZSl7bi5wcm9wcy5vbkNoYW5nZShlKX0sbi5oYW5kbGVDbGlja091dHNpZGU9ZnVuY3Rpb24oKXtuLnByb3BzLm9uQ2FuY2VsKCl9LG4uc2hpZnRZZWFycz1mdW5jdGlvbihlKXt2YXIgdD1uLnN0YXRlLnllYXJzTGlzdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0K2V9KSk7bi5zZXRTdGF0ZSh7eWVhcnNMaXN0OnR9KX0sbi5pbmNyZW1lbnRZZWFycz1mdW5jdGlvbigpe3JldHVybiBuLnNoaWZ0WWVhcnMoMSl9LG4uZGVjcmVtZW50WWVhcnM9ZnVuY3Rpb24oKXtyZXR1cm4gbi5zaGlmdFllYXJzKC0xKX07dmFyIGE9dC55ZWFyRHJvcGRvd25JdGVtTnVtYmVyLG89dC5zY3JvbGxhYmxlWWVhckRyb3Bkb3duLHM9YXx8KG8/MTA6NSk7cmV0dXJuIG4uc3RhdGU9e3llYXJzTGlzdDpXdChuLnByb3BzLnllYXIscyxuLnByb3BzLm1pbkRhdGUsbi5wcm9wcy5tYXhEYXRlKX0sbi5kcm9wZG93blJlZj1yLmNyZWF0ZVJlZigpLG59cmV0dXJuIHZlKG4sZSksbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRyb3Bkb3duUmVmLmN1cnJlbnQ7aWYoZSl7dmFyIHQ9ZS5jaGlsZHJlbj9BcnJheS5mcm9tKGUuY2hpbGRyZW4pOm51bGwscj10P3QuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXJpYVNlbGVjdGVkfSkpOm51bGw7ZS5zY3JvbGxUb3A9ciYmciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50P3Iub2Zmc2V0VG9wKyhyLmNsaWVudEhlaWdodC1lLmNsaWVudEhlaWdodCkvMjooZS5zY3JvbGxIZWlnaHQtZS5jbGllbnRIZWlnaHQpLzJ9fSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmNsc3goe1wicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93blwiOiEwLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi0tc2Nyb2xsYWJsZVwiOnRoaXMucHJvcHMuc2Nyb2xsYWJsZVllYXJEcm9wZG93bn0pO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOmUscmVmOnRoaXMuZHJvcGRvd25SZWZ9LHRoaXMucmVuZGVyT3B0aW9ucygpKX0sbn0oci5Db21wb25lbnQpLHF0PWZlLmRlZmF1bHQoUXQpLEt0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuc3RhdGU9e2Ryb3Bkb3duVmlzaWJsZTohMX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXQucHJvcHMubWluRGF0ZT94LmdldFllYXIodC5wcm9wcy5taW5EYXRlKToxOTAwLHI9dC5wcm9wcy5tYXhEYXRlP3guZ2V0WWVhcih0LnByb3BzLm1heERhdGUpOjIxMDAsbj1bXSxhPWU7YTw9cjthKyspbi5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLHtrZXk6YSx2YWx1ZTphfSxhKSk7cmV0dXJuIG59LHQub25TZWxlY3RDaGFuZ2U9ZnVuY3Rpb24oZSl7dC5vbkNoYW5nZShwYXJzZUludChlLnRhcmdldC52YWx1ZSkpfSx0LnJlbmRlclNlbGVjdE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIse3ZhbHVlOnQucHJvcHMueWVhcixjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXNlbGVjdFwiLG9uQ2hhbmdlOnQub25TZWxlY3RDaGFuZ2V9LHQucmVuZGVyU2VsZWN0T3B0aW9ucygpKX0sdC5yZW5kZXJSZWFkVmlldz1mdW5jdGlvbihlKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTpcInJlYWRcIixzdHlsZTp7dmlzaWJpbGl0eTplP1widmlzaWJsZVwiOlwiaGlkZGVuXCJ9LGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3XCIsb25DbGljazpmdW5jdGlvbihlKXtyZXR1cm4gdC50b2dnbGVEcm9wZG93bihlKX19LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3dcIn0pLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLXNlbGVjdGVkLXllYXJcIn0sdC5wcm9wcy55ZWFyKSl9LHQucmVuZGVyRHJvcGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHF0LGdlKHtrZXk6XCJkcm9wZG93blwifSx0LnByb3BzLHtvbkNoYW5nZTp0Lm9uQ2hhbmdlLG9uQ2FuY2VsOnQudG9nZ2xlRHJvcGRvd259KSl9LHQucmVuZGVyU2Nyb2xsTW9kZT1mdW5jdGlvbigpe3ZhciBlPXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlLHI9W3QucmVuZGVyUmVhZFZpZXcoIWUpXTtyZXR1cm4gZSYmci51bnNoaWZ0KHQucmVuZGVyRHJvcGRvd24oKSkscn0sdC5vbkNoYW5nZT1mdW5jdGlvbihlKXt0LnRvZ2dsZURyb3Bkb3duKCksZSE9PXQucHJvcHMueWVhciYmdC5wcm9wcy5vbkNoYW5nZShlKX0sdC50b2dnbGVEcm9wZG93bj1mdW5jdGlvbihlKXt0LnNldFN0YXRlKHtkcm9wZG93blZpc2libGU6IXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlfSwoZnVuY3Rpb24oKXt0LnByb3BzLmFkanVzdERhdGVPbkNoYW5nZSYmdC5oYW5kbGVZZWFyQ2hhbmdlKHQucHJvcHMuZGF0ZSxlKX0pKX0sdC5oYW5kbGVZZWFyQ2hhbmdlPWZ1bmN0aW9uKGUscil7dC5vblNlbGVjdChlLHIpLHQuc2V0T3BlbigpfSx0Lm9uU2VsZWN0PWZ1bmN0aW9uKGUscil7dC5wcm9wcy5vblNlbGVjdCYmdC5wcm9wcy5vblNlbGVjdChlLHIpfSx0LnNldE9wZW49ZnVuY3Rpb24oKXt0LnByb3BzLnNldE9wZW4mJnQucHJvcHMuc2V0T3BlbighMCl9LHR9cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU7c3dpdGNoKHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKXtjYXNlXCJzY3JvbGxcIjplPXRoaXMucmVuZGVyU2Nyb2xsTW9kZSgpO2JyZWFrO2Nhc2VcInNlbGVjdFwiOmU9dGhpcy5yZW5kZXJTZWxlY3RNb2RlKCl9cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lciByZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tXCIuY29uY2F0KHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKX0sZSl9LHR9KHIuQ29tcG9uZW50KSxCdD1bXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXNlbGVjdFwiLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtc2VsZWN0XCIsXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXNlbGVjdFwiXSxWdD1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKG8pe3ZhciBzPWUuY2FsbCh0aGlzLG8pfHx0aGlzO3JldHVybiBzLm1vbnRoQ29udGFpbmVyPXZvaWQgMCxzLmhhbmRsZUNsaWNrT3V0c2lkZT1mdW5jdGlvbihlKXtzLnByb3BzLm9uQ2xpY2tPdXRzaWRlKGUpfSxzLnNldENsaWNrT3V0c2lkZVJlZj1mdW5jdGlvbigpe3JldHVybiBzLmNvbnRhaW5lclJlZi5jdXJyZW50fSxzLmhhbmRsZURyb3Bkb3duRm9jdXM9ZnVuY3Rpb24oZSl7dmFyIHQscixuLGE7bj1lLnRhcmdldCxhPShuLmNsYXNzTmFtZXx8XCJcIikuc3BsaXQoL1xccysvKSxCdC5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gYS5pbmRleE9mKGUpPj0wfSkpJiYobnVsbD09PShyPSh0PXMucHJvcHMpLm9uRHJvcGRvd25Gb2N1cyl8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpKX0scy5nZXREYXRlSW5WaWV3PWZ1bmN0aW9uKCl7dmFyIGU9cy5wcm9wcyx0PWUucHJlU2VsZWN0aW9uLHI9ZS5zZWxlY3RlZCxuPWUub3BlblRvRGF0ZSxhPWN0KHMucHJvcHMpLG89cHQocy5wcm9wcyksaT1NZSgpLGw9bnx8cnx8dDtyZXR1cm4gbHx8KGEmJk8uaXNCZWZvcmUoaSxhKT9hOm8mJk4uaXNBZnRlcihpLG8pP286aSl9LHMuaW5jcmVhc2VNb250aD1mdW5jdGlvbigpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0ZTtyZXR1cm57ZGF0ZTppLmFkZE1vbnRocyh0LDEpfX0pLChmdW5jdGlvbigpe3JldHVybiBzLmhhbmRsZU1vbnRoQ2hhbmdlKHMuc3RhdGUuZGF0ZSl9KSl9LHMuZGVjcmVhc2VNb250aD1mdW5jdGlvbigpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0ZTtyZXR1cm57ZGF0ZTphZS5zdWJNb250aHModCwxKX19KSwoZnVuY3Rpb24oKXtyZXR1cm4gcy5oYW5kbGVNb250aENoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmhhbmRsZURheUNsaWNrPWZ1bmN0aW9uKGUsdCxyKXtzLnByb3BzLm9uU2VsZWN0KGUsdCxyKSxzLnByb3BzLnNldFByZVNlbGVjdGlvbiYmcy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24oZSl9LHMuaGFuZGxlRGF5TW91c2VFbnRlcj1mdW5jdGlvbihlKXtzLnNldFN0YXRlKHtzZWxlY3RpbmdEYXRlOmV9KSxzLnByb3BzLm9uRGF5TW91c2VFbnRlciYmcy5wcm9wcy5vbkRheU1vdXNlRW50ZXIoZSl9LHMuaGFuZGxlTW9udGhNb3VzZUxlYXZlPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZSh7c2VsZWN0aW5nRGF0ZTp2b2lkIDB9KSxzLnByb3BzLm9uTW9udGhNb3VzZUxlYXZlJiZzLnByb3BzLm9uTW9udGhNb3VzZUxlYXZlKCl9LHMuaGFuZGxlWWVhck1vdXNlRW50ZXI9ZnVuY3Rpb24oZSx0KXtzLnNldFN0YXRlKHtzZWxlY3RpbmdEYXRlOkcuc2V0WWVhcihNZSgpLHQpfSkscy5wcm9wcy5vblllYXJNb3VzZUVudGVyJiZzLnByb3BzLm9uWWVhck1vdXNlRW50ZXIoZSx0KX0scy5oYW5kbGVZZWFyTW91c2VMZWF2ZT1mdW5jdGlvbihlLHQpe3MucHJvcHMub25ZZWFyTW91c2VMZWF2ZSYmcy5wcm9wcy5vblllYXJNb3VzZUxlYXZlKGUsdCl9LHMuaGFuZGxlWWVhckNoYW5nZT1mdW5jdGlvbihlKXtzLnByb3BzLm9uWWVhckNoYW5nZSYmKHMucHJvcHMub25ZZWFyQ2hhbmdlKGUpLHMuc2V0U3RhdGUoe2lzUmVuZGVyQXJpYUxpdmVNZXNzYWdlOiEwfSkpLHMucHJvcHMuYWRqdXN0RGF0ZU9uQ2hhbmdlJiYocy5wcm9wcy5vblNlbGVjdCYmcy5wcm9wcy5vblNlbGVjdChlKSxzLnByb3BzLnNldE9wZW4mJnMucHJvcHMuc2V0T3BlbighMCkpLHMucHJvcHMuc2V0UHJlU2VsZWN0aW9uJiZzLnByb3BzLnNldFByZVNlbGVjdGlvbihlKX0scy5oYW5kbGVNb250aENoYW5nZT1mdW5jdGlvbihlKXtzLmhhbmRsZUN1c3RvbU1vbnRoQ2hhbmdlKGUpLHMucHJvcHMuYWRqdXN0RGF0ZU9uQ2hhbmdlJiYocy5wcm9wcy5vblNlbGVjdCYmcy5wcm9wcy5vblNlbGVjdChlKSxzLnByb3BzLnNldE9wZW4mJnMucHJvcHMuc2V0T3BlbighMCkpLHMucHJvcHMuc2V0UHJlU2VsZWN0aW9uJiZzLnByb3BzLnNldFByZVNlbGVjdGlvbihlKX0scy5oYW5kbGVDdXN0b21Nb250aENoYW5nZT1mdW5jdGlvbihlKXtzLnByb3BzLm9uTW9udGhDaGFuZ2UmJihzLnByb3BzLm9uTW9udGhDaGFuZ2UoZSkscy5zZXRTdGF0ZSh7aXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITB9KSl9LHMuaGFuZGxlTW9udGhZZWFyQ2hhbmdlPWZ1bmN0aW9uKGUpe3MuaGFuZGxlWWVhckNoYW5nZShlKSxzLmhhbmRsZU1vbnRoQ2hhbmdlKGUpfSxzLmNoYW5nZVllYXI9ZnVuY3Rpb24oZSl7cy5zZXRTdGF0ZSgoZnVuY3Rpb24odCl7dmFyIHI9dC5kYXRlO3JldHVybntkYXRlOkcuc2V0WWVhcihyLE51bWJlcihlKSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmNoYW5nZU1vbnRoPWZ1bmN0aW9uKGUpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKHQpe3ZhciByPXQuZGF0ZTtyZXR1cm57ZGF0ZTokLnNldE1vbnRoKHIsTnVtYmVyKGUpKX19KSwoZnVuY3Rpb24oKXtyZXR1cm4gcy5oYW5kbGVNb250aENoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmNoYW5nZU1vbnRoWWVhcj1mdW5jdGlvbihlKXtzLnNldFN0YXRlKChmdW5jdGlvbih0KXt2YXIgcj10LmRhdGU7cmV0dXJue2RhdGU6Ry5zZXRZZWFyKCQuc2V0TW9udGgocixfLmdldE1vbnRoKGUpKSx4LmdldFllYXIoZSkpfX0pLChmdW5jdGlvbigpe3JldHVybiBzLmhhbmRsZU1vbnRoWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmhlYWRlcj1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT1zLnN0YXRlLmRhdGUpO3ZhciByPXhlKGUscy5wcm9wcy5sb2NhbGUscy5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KSxuPVtdO3JldHVybiBzLnByb3BzLnNob3dXZWVrTnVtYmVycyYmbi5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6XCJXXCIsY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWVcIn0scy5wcm9wcy53ZWVrTGFiZWx8fFwiI1wiKSksbi5jb25jYXQoWzAsMSwyLDMsNCw1LDZdLm1hcCgoZnVuY3Rpb24oZSl7dmFyIG49YS5hZGREYXlzKHIsZSksbz1zLmZvcm1hdFdlZWtkYXkobixzLnByb3BzLmxvY2FsZSksaT1zLnByb3BzLndlZWtEYXlDbGFzc05hbWU/cy5wcm9wcy53ZWVrRGF5Q2xhc3NOYW1lKG4pOnZvaWQgMDtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTplLFwiYXJpYS1sYWJlbFwiOl9lKG4sXCJFRUVFXCIscy5wcm9wcy5sb2NhbGUpLGNsYXNzTmFtZTp0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZVwiLGkpfSxvKX0pKSl9LHMuZm9ybWF0V2Vla2RheT1mdW5jdGlvbihlLHQpe3JldHVybiBzLnByb3BzLmZvcm1hdFdlZWtEYXk/ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB0KF9lKGUsXCJFRUVFXCIscikpfShlLHMucHJvcHMuZm9ybWF0V2Vla0RheSx0KTpzLnByb3BzLnVzZVdlZWtkYXlzU2hvcnQ/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gX2UoZSxcIkVFRVwiLHQpfShlLHQpOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9lKGUsXCJFRUVFRUVcIix0KX0oZSx0KX0scy5kZWNyZWFzZVllYXI9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKChmdW5jdGlvbihlKXt2YXIgdCxyPWUuZGF0ZTtyZXR1cm57ZGF0ZTppZS5zdWJZZWFycyhyLHMucHJvcHMuc2hvd1llYXJQaWNrZXI/bnVsbCE9PSh0PXMucHJvcHMueWVhckl0ZW1OdW1iZXIpJiZ2b2lkIDAhPT10P3Q6bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXI6MSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLmNsZWFyU2VsZWN0aW5nRGF0ZT1mdW5jdGlvbigpe3Muc2V0U3RhdGUoe3NlbGVjdGluZ0RhdGU6dm9pZCAwfSl9LHMucmVuZGVyUHJldmlvdXNCdXR0b249ZnVuY3Rpb24oKXt2YXIgZTtpZighcy5wcm9wcy5yZW5kZXJDdXN0b21IZWFkZXIpe3ZhciB0O3N3aXRjaCghMCl7Y2FzZSBzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXI6dD1pdChzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dZZWFyUGlja2VyOnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLnllYXJJdGVtTnVtYmVyLG89dm9pZCAwPT09YT9TZTphLHM9bXQoT2UoaWUuc3ViWWVhcnMoZSxvKSksbykuZW5kUGVyaW9kLGk9biYmeC5nZXRZZWFyKG4pO3JldHVybiBpJiZpPnN8fCExfShzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcjp0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5taW5EYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz1yZS5zdGFydE9mWWVhcihlKSxzPW9lLnN1YlF1YXJ0ZXJzKG8sMSk7cmV0dXJuIG4mJmguZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhuLHMpPjB8fGEmJmEuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBoLmRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMoZSxzKT4wfSkpfHwhMX0ocy5zdGF0ZS5kYXRlLHMucHJvcHMpO2JyZWFrO2RlZmF1bHQ6dD1vdChzLnN0YXRlLmRhdGUscy5wcm9wcyl9aWYoKChudWxsIT09KGU9cy5wcm9wcy5mb3JjZVNob3dNb250aE5hdmlnYXRpb24pJiZ2b2lkIDAhPT1lP2U6bi5kZWZhdWx0UHJvcHMuZm9yY2VTaG93TW9udGhOYXZpZ2F0aW9uKXx8cy5wcm9wcy5zaG93RGlzYWJsZWRNb250aE5hdmlnYXRpb258fCF0KSYmIXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5KXt2YXIgcj1bXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uXCIsXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1wcmV2aW91c1wiXSxhPXMuZGVjcmVhc2VNb250aDsocy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93WWVhclBpY2tlcikmJihhPXMuZGVjcmVhc2VZZWFyKSx0JiZzLnByb3BzLnNob3dEaXNhYmxlZE1vbnRoTmF2aWdhdGlvbiYmKHIucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXByZXZpb3VzLS1kaXNhYmxlZFwiKSxhPXZvaWQgMCk7dmFyIG89cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93WWVhclBpY2tlcixpPXMucHJvcHMsbD1pLnByZXZpb3VzTW9udGhCdXR0b25MYWJlbCxjPXZvaWQgMD09PWw/bi5kZWZhdWx0UHJvcHMucHJldmlvdXNNb250aEJ1dHRvbkxhYmVsOmwscD1pLnByZXZpb3VzWWVhckJ1dHRvbkxhYmVsLGQ9dm9pZCAwPT09cD9uLmRlZmF1bHRQcm9wcy5wcmV2aW91c1llYXJCdXR0b25MYWJlbDpwLHU9cy5wcm9wcyxmPXUucHJldmlvdXNNb250aEFyaWFMYWJlbCxtPXZvaWQgMD09PWY/XCJzdHJpbmdcIj09dHlwZW9mIGM/YzpcIlByZXZpb3VzIE1vbnRoXCI6Zix2PXUucHJldmlvdXNZZWFyQXJpYUxhYmVsLGc9dm9pZCAwPT09dj9cInN0cmluZ1wiPT10eXBlb2YgZD9kOlwiUHJldmlvdXMgWWVhclwiOnY7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLHt0eXBlOlwiYnV0dG9uXCIsY2xhc3NOYW1lOnIuam9pbihcIiBcIiksb25DbGljazphLG9uS2V5RG93bjpzLnByb3BzLmhhbmRsZU9uS2V5RG93bixcImFyaWEtbGFiZWxcIjpvP2c6bX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6W1wicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uXCIsXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLXByZXZpb3VzXCJdLmpvaW4oXCIgXCIpfSxvP2Q6YykpfX19LHMuaW5jcmVhc2VZZWFyPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZSgoZnVuY3Rpb24oZSl7dmFyIHQscj1lLmRhdGU7cmV0dXJue2RhdGU6ZC5hZGRZZWFycyhyLHMucHJvcHMuc2hvd1llYXJQaWNrZXI/bnVsbCE9PSh0PXMucHJvcHMueWVhckl0ZW1OdW1iZXIpJiZ2b2lkIDAhPT10P3Q6bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXI6MSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlWWVhckNoYW5nZShzLnN0YXRlLmRhdGUpfSkpfSxzLnJlbmRlck5leHRCdXR0b249ZnVuY3Rpb24oKXt2YXIgZTtpZighcy5wcm9wcy5yZW5kZXJDdXN0b21IZWFkZXIpe3ZhciB0O3N3aXRjaCghMCl7Y2FzZSBzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXI6dD1sdChzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dZZWFyUGlja2VyOnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1heERhdGUsYT1yLnllYXJJdGVtTnVtYmVyLG89dm9pZCAwPT09YT9TZTphLHM9bXQoZC5hZGRZZWFycyhlLG8pLG8pLnN0YXJ0UGVyaW9kLGk9biYmeC5nZXRZZWFyKG4pO3JldHVybiBpJiZpPHN8fCExfShzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7Y2FzZSBzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcjp0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5tYXhEYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz15LmVuZE9mWWVhcihlKSxzPWwuYWRkUXVhcnRlcnMobywxKTtyZXR1cm4gbiYmaC5kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzKHMsbik+MHx8YSYmYS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIGguZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhzLGUpPjB9KSl8fCExfShzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7ZGVmYXVsdDp0PXN0KHMuc3RhdGUuZGF0ZSxzLnByb3BzKX1pZigoKG51bGwhPT0oZT1zLnByb3BzLmZvcmNlU2hvd01vbnRoTmF2aWdhdGlvbikmJnZvaWQgMCE9PWU/ZTpuLmRlZmF1bHRQcm9wcy5mb3JjZVNob3dNb250aE5hdmlnYXRpb24pfHxzLnByb3BzLnNob3dEaXNhYmxlZE1vbnRoTmF2aWdhdGlvbnx8IXQpJiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpe3ZhciByPVtcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb25cIixcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHRcIl07cy5wcm9wcy5zaG93VGltZVNlbGVjdCYmci5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10aW1lXCIpLHMucHJvcHMudG9kYXlCdXR0b24mJnIucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLXdpdGgtdG9kYXktYnV0dG9uXCIpO3ZhciBhPXMuaW5jcmVhc2VNb250aDsocy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93WWVhclBpY2tlcikmJihhPXMuaW5jcmVhc2VZZWFyKSx0JiZzLnByb3BzLnNob3dEaXNhYmxlZE1vbnRoTmF2aWdhdGlvbiYmKHIucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLWRpc2FibGVkXCIpLGE9dm9pZCAwKTt2YXIgbz1zLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyfHxzLnByb3BzLnNob3dZZWFyUGlja2VyLGk9cy5wcm9wcyxjPWkubmV4dE1vbnRoQnV0dG9uTGFiZWwscD12b2lkIDA9PT1jP24uZGVmYXVsdFByb3BzLm5leHRNb250aEJ1dHRvbkxhYmVsOmMsdT1pLm5leHRZZWFyQnV0dG9uTGFiZWwsZj12b2lkIDA9PT11P24uZGVmYXVsdFByb3BzLm5leHRZZWFyQnV0dG9uTGFiZWw6dSxtPXMucHJvcHMsdj1tLm5leHRNb250aEFyaWFMYWJlbCxnPXZvaWQgMD09PXY/XCJzdHJpbmdcIj09dHlwZW9mIHA/cDpcIk5leHQgTW9udGhcIjp2LEQ9bS5uZXh0WWVhckFyaWFMYWJlbCxrPXZvaWQgMD09PUQ/XCJzdHJpbmdcIj09dHlwZW9mIGY/ZjpcIk5leHQgWWVhclwiOkQ7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLHt0eXBlOlwiYnV0dG9uXCIsY2xhc3NOYW1lOnIuam9pbihcIiBcIiksb25DbGljazphLG9uS2V5RG93bjpzLnByb3BzLmhhbmRsZU9uS2V5RG93bixcImFyaWEtbGFiZWxcIjpvP2s6Z30sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6W1wicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uXCIsXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLW5leHRcIl0uam9pbihcIiBcIil9LG8/ZjpwKSl9fX0scy5yZW5kZXJDdXJyZW50TW9udGg9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9cy5zdGF0ZS5kYXRlKTt2YXIgdD1bXCJyZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoXCJdO3JldHVybiBzLnByb3BzLnNob3dZZWFyRHJvcGRvd24mJnQucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgtLWhhc1llYXJEcm9wZG93blwiKSxzLnByb3BzLnNob3dNb250aERyb3Bkb3duJiZ0LnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLS1oYXNNb250aERyb3Bkb3duXCIpLHMucHJvcHMuc2hvd01vbnRoWWVhckRyb3Bkb3duJiZ0LnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLS1oYXNNb250aFllYXJEcm9wZG93blwiKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLHtjbGFzc05hbWU6dC5qb2luKFwiIFwiKX0sX2UoZSxzLnByb3BzLmRhdGVGb3JtYXQscy5wcm9wcy5sb2NhbGUpKX0scy5yZW5kZXJZZWFyRHJvcGRvd249ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSYmKGU9ITEpLHMucHJvcHMuc2hvd1llYXJEcm9wZG93biYmIWUpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChLdCxnZSh7fSxuLmRlZmF1bHRQcm9wcyxzLnByb3BzLHtkYXRlOnMuc3RhdGUuZGF0ZSxvbkNoYW5nZTpzLmNoYW5nZVllYXIseWVhcjp4LmdldFllYXIocy5zdGF0ZS5kYXRlKX0pKX0scy5yZW5kZXJNb250aERyb3Bkb3duPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPSExKSxzLnByb3BzLnNob3dNb250aERyb3Bkb3duJiYhZSlyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEl0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse21vbnRoOl8uZ2V0TW9udGgocy5zdGF0ZS5kYXRlKSxvbkNoYW5nZTpzLmNoYW5nZU1vbnRofSkpfSxzLnJlbmRlck1vbnRoWWVhckRyb3Bkb3duPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPSExKSxzLnByb3BzLnNob3dNb250aFllYXJEcm9wZG93biYmIWUpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChBdCxnZSh7fSxuLmRlZmF1bHRQcm9wcyxzLnByb3BzLHtkYXRlOnMuc3RhdGUuZGF0ZSxvbkNoYW5nZTpzLmNoYW5nZU1vbnRoWWVhcn0pKX0scy5oYW5kbGVUb2RheUJ1dHRvbkNsaWNrPWZ1bmN0aW9uKGUpe3MucHJvcHMub25TZWxlY3QoVGUoKSxlKSxzLnByb3BzLnNldFByZVNlbGVjdGlvbiYmcy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24oVGUoKSl9LHMucmVuZGVyVG9kYXlCdXR0b249ZnVuY3Rpb24oKXtpZihzLnByb3BzLnRvZGF5QnV0dG9uJiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190b2RheS1idXR0b25cIixvbkNsaWNrOnMuaGFuZGxlVG9kYXlCdXR0b25DbGlja30scy5wcm9wcy50b2RheUJ1dHRvbil9LHMucmVuZGVyRGVmYXVsdEhlYWRlcj1mdW5jdGlvbihlKXt2YXIgdD1lLm1vbnRoRGF0ZSxyPWUuaTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlciBcIi5jb25jYXQocy5wcm9wcy5zaG93VGltZVNlbGVjdD9cInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0taGFzLXRpbWUtc2VsZWN0XCI6XCJcIil9LHMucmVuZGVyQ3VycmVudE1vbnRoKHQpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXJfX2Ryb3Bkb3duIHJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlcl9fZHJvcGRvd24tLVwiLmNvbmNhdChzLnByb3BzLmRyb3Bkb3duTW9kZSksb25Gb2N1czpzLmhhbmRsZURyb3Bkb3duRm9jdXN9LHMucmVuZGVyTW9udGhEcm9wZG93bigwIT09cikscy5yZW5kZXJNb250aFllYXJEcm9wZG93bigwIT09cikscy5yZW5kZXJZZWFyRHJvcGRvd24oMCE9PXIpKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWVzXCJ9LHMuaGVhZGVyKHQpKSl9LHMucmVuZGVyQ3VzdG9tSGVhZGVyPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbj1lLm1vbnRoRGF0ZSxhPWUuaTtpZihzLnByb3BzLnNob3dUaW1lU2VsZWN0JiYhcy5zdGF0ZS5tb250aENvbnRhaW5lcnx8cy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpcmV0dXJuIG51bGw7dmFyIG89b3Qocy5zdGF0ZS5kYXRlLHMucHJvcHMpLGk9c3Qocy5zdGF0ZS5kYXRlLHMucHJvcHMpLGw9aXQocy5zdGF0ZS5kYXRlLHMucHJvcHMpLGM9bHQocy5zdGF0ZS5kYXRlLHMucHJvcHMpLHA9IXMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlciYmIXMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyJiYhcy5wcm9wcy5zaG93WWVhclBpY2tlcjtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlciByZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLWN1c3RvbVwiLG9uRm9jdXM6cy5wcm9wcy5vbkRyb3Bkb3duRm9jdXN9LG51bGw9PT0ocj0odD1zLnByb3BzKS5yZW5kZXJDdXN0b21IZWFkZXIpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmNhbGwodCxnZShnZSh7fSxzLnN0YXRlKSx7Y3VzdG9tSGVhZGVyQ291bnQ6YSxtb250aERhdGU6bixjaGFuZ2VNb250aDpzLmNoYW5nZU1vbnRoLGNoYW5nZVllYXI6cy5jaGFuZ2VZZWFyLGRlY3JlYXNlTW9udGg6cy5kZWNyZWFzZU1vbnRoLGluY3JlYXNlTW9udGg6cy5pbmNyZWFzZU1vbnRoLGRlY3JlYXNlWWVhcjpzLmRlY3JlYXNlWWVhcixpbmNyZWFzZVllYXI6cy5pbmNyZWFzZVllYXIscHJldk1vbnRoQnV0dG9uRGlzYWJsZWQ6byxuZXh0TW9udGhCdXR0b25EaXNhYmxlZDppLHByZXZZZWFyQnV0dG9uRGlzYWJsZWQ6bCxuZXh0WWVhckJ1dHRvbkRpc2FibGVkOmN9KSkscCYmdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lc1wifSxzLmhlYWRlcihuKSkpfSxzLnJlbmRlclllYXJIZWFkZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tb250aERhdGUscj1zLnByb3BzLGE9ci5zaG93WWVhclBpY2tlcixvPXIueWVhckl0ZW1OdW1iZXIsaT1tdCh0LHZvaWQgMD09PW8/bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXI6byksbD1pLnN0YXJ0UGVyaW9kLGM9aS5lbmRQZXJpb2Q7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19oZWFkZXIgcmVhY3QtZGF0ZXBpY2tlci15ZWFyLWhlYWRlclwifSxhP1wiXCIuY29uY2F0KGwsXCIgLSBcIikuY29uY2F0KGMpOnguZ2V0WWVhcih0KSl9LHMucmVuZGVySGVhZGVyPWZ1bmN0aW9uKGUpe3ZhciB0PWUubW9udGhEYXRlLHI9ZS5pLG49e21vbnRoRGF0ZTp0LGk6dm9pZCAwPT09cj8wOnJ9O3N3aXRjaCghMCl7Y2FzZSB2b2lkIDAhPT1zLnByb3BzLnJlbmRlckN1c3RvbUhlYWRlcjpyZXR1cm4gcy5yZW5kZXJDdXN0b21IZWFkZXIobik7Y2FzZSBzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyfHxzLnByb3BzLnNob3dZZWFyUGlja2VyOnJldHVybiBzLnJlbmRlclllYXJIZWFkZXIobik7ZGVmYXVsdDpyZXR1cm4gcy5yZW5kZXJEZWZhdWx0SGVhZGVyKG4pfX0scy5yZW5kZXJNb250aHM9ZnVuY3Rpb24oKXt2YXIgZSx0O2lmKCFzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSYmIXMucHJvcHMuc2hvd1llYXJQaWNrZXIpe2Zvcih2YXIgcj1bXSxhPW51bGwhPT0oZT1zLnByb3BzLm1vbnRoc1Nob3duKSYmdm9pZCAwIT09ZT9lOm4uZGVmYXVsdFByb3BzLm1vbnRoc1Nob3duLG89cy5wcm9wcy5zaG93UHJldmlvdXNNb250aHM/YS0xOjAsbD1zLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyP2QuYWRkWWVhcnMocy5zdGF0ZS5kYXRlLG8pOmFlLnN1Yk1vbnRocyhzLnN0YXRlLmRhdGUsbyksYz1udWxsIT09KHQ9cy5wcm9wcy5tb250aFNlbGVjdGVkSW4pJiZ2b2lkIDAhPT10P3Q6byxwPTA7cDxhOysrcCl7dmFyIHU9cC1jK28sZj1zLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyP2QuYWRkWWVhcnMobCx1KTppLmFkZE1vbnRocyhsLHUpLGg9XCJtb250aC1cIi5jb25jYXQocCksbT1wPGEtMSx2PXA+MDtyLnB1c2godWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTpoLHJlZjpmdW5jdGlvbihlKXtzLm1vbnRoQ29udGFpbmVyPW51bGwhPWU/ZTp2b2lkIDB9LGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWNvbnRhaW5lclwifSxzLnJlbmRlckhlYWRlcih7bW9udGhEYXRlOmYsaTpwfSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHh0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse2FyaWFMYWJlbFByZWZpeDpzLnByb3BzLm1vbnRoQXJpYUxhYmVsUHJlZml4LGRheTpmLG9uRGF5Q2xpY2s6cy5oYW5kbGVEYXlDbGljayxoYW5kbGVPbktleURvd246cy5wcm9wcy5oYW5kbGVPbkRheUtleURvd24saGFuZGxlT25Nb250aEtleURvd246cy5wcm9wcy5oYW5kbGVPbktleURvd24sb25EYXlNb3VzZUVudGVyOnMuaGFuZGxlRGF5TW91c2VFbnRlcixvbk1vdXNlTGVhdmU6cy5oYW5kbGVNb250aE1vdXNlTGVhdmUsb3JkZXJJbkRpc3BsYXk6cCxzZWxlY3RpbmdEYXRlOnMuc3RhdGUuc2VsZWN0aW5nRGF0ZSxtb250aFNob3dzRHVwbGljYXRlRGF5c0VuZDptLG1vbnRoU2hvd3NEdXBsaWNhdGVEYXlzU3RhcnQ6dn0pKSkpfXJldHVybiByfX0scy5yZW5kZXJZZWFycz1mdW5jdGlvbigpe2lmKCFzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSlyZXR1cm4gcy5wcm9wcy5zaG93WWVhclBpY2tlcj91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tY29udGFpbmVyXCJ9LHMucmVuZGVySGVhZGVyKHttb250aERhdGU6cy5zdGF0ZS5kYXRlfSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEh0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse3NlbGVjdGluZ0RhdGU6cy5zdGF0ZS5zZWxlY3RpbmdEYXRlLGRhdGU6cy5zdGF0ZS5kYXRlLG9uRGF5Q2xpY2s6cy5oYW5kbGVEYXlDbGljayxjbGVhclNlbGVjdGluZ0RhdGU6cy5jbGVhclNlbGVjdGluZ0RhdGUsb25ZZWFyTW91c2VFbnRlcjpzLmhhbmRsZVllYXJNb3VzZUVudGVyLG9uWWVhck1vdXNlTGVhdmU6cy5oYW5kbGVZZWFyTW91c2VMZWF2ZX0pKSk6dm9pZCAwfSxzLnJlbmRlclRpbWVTZWN0aW9uPWZ1bmN0aW9uKCl7aWYocy5wcm9wcy5zaG93VGltZVNlbGVjdCYmKHMuc3RhdGUubW9udGhDb250YWluZXJ8fHMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5KSlyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEZ0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse29uQ2hhbmdlOnMucHJvcHMub25UaW1lQ2hhbmdlLGZvcm1hdDpzLnByb3BzLnRpbWVGb3JtYXQsaW50ZXJ2YWxzOnMucHJvcHMudGltZUludGVydmFscyxtb250aFJlZjpzLnN0YXRlLm1vbnRoQ29udGFpbmVyfSkpfSxzLnJlbmRlcklucHV0VGltZVNlY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT1zLnByb3BzLnNlbGVjdGVkP25ldyBEYXRlKHMucHJvcHMuc2VsZWN0ZWQpOnZvaWQgMCx0PWUmJkNlKGUpJiZCb29sZWFuKHMucHJvcHMuc2VsZWN0ZWQpP1wiXCIuY29uY2F0KGh0KGUuZ2V0SG91cnMoKSksXCI6XCIpLmNvbmNhdChodChlLmdldE1pbnV0ZXMoKSkpOlwiXCI7aWYocy5wcm9wcy5zaG93VGltZUlucHV0KXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQod3QsZ2Uoe30sbi5kZWZhdWx0UHJvcHMscy5wcm9wcyx7ZGF0ZTplLHRpbWVTdHJpbmc6dCxvbkNoYW5nZTpzLnByb3BzLm9uVGltZUNoYW5nZX0pKX0scy5yZW5kZXJBcmlhTGl2ZVJlZ2lvbj1mdW5jdGlvbigpe3ZhciBlLHQscj1tdChzLnN0YXRlLmRhdGUsbnVsbCE9PShlPXMucHJvcHMueWVhckl0ZW1OdW1iZXIpJiZ2b2lkIDAhPT1lP2U6bi5kZWZhdWx0UHJvcHMueWVhckl0ZW1OdW1iZXIpLGE9ci5zdGFydFBlcmlvZCxvPXIuZW5kUGVyaW9kO3JldHVybiB0PXMucHJvcHMuc2hvd1llYXJQaWNrZXI/XCJcIi5jb25jYXQoYSxcIiAtIFwiKS5jb25jYXQobyk6cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcj94LmdldFllYXIocy5zdGF0ZS5kYXRlKTpcIlwiLmNvbmNhdChCZShfLmdldE1vbnRoKHMuc3RhdGUuZGF0ZSkscy5wcm9wcy5sb2NhbGUpLFwiIFwiKS5jb25jYXQoeC5nZXRZZWFyKHMuc3RhdGUuZGF0ZSkpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7cm9sZTpcImFsZXJ0XCIsXCJhcmlhLWxpdmVcIjpcInBvbGl0ZVwiLGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2FyaWEtbGl2ZVwifSxzLnN0YXRlLmlzUmVuZGVyQXJpYUxpdmVNZXNzYWdlJiZ0KX0scy5yZW5kZXJDaGlsZHJlbj1mdW5jdGlvbigpe2lmKHMucHJvcHMuY2hpbGRyZW4pcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19jaGlsZHJlbi1jb250YWluZXJcIn0scy5wcm9wcy5jaGlsZHJlbil9LHMuY29udGFpbmVyUmVmPXIuY3JlYXRlUmVmKCkscy5zdGF0ZT17ZGF0ZTpzLmdldERhdGVJblZpZXcoKSxzZWxlY3RpbmdEYXRlOnZvaWQgMCxtb250aENvbnRhaW5lcjp2b2lkIDAsaXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITF9LHN9cmV0dXJuIHZlKG4sZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue21vbnRoc1Nob3duOjEsZm9yY2VTaG93TW9udGhOYXZpZ2F0aW9uOiExLHRpbWVDYXB0aW9uOlwiVGltZVwiLHByZXZpb3VzWWVhckJ1dHRvbkxhYmVsOlwiUHJldmlvdXMgWWVhclwiLG5leHRZZWFyQnV0dG9uTGFiZWw6XCJOZXh0IFllYXJcIixwcmV2aW91c01vbnRoQnV0dG9uTGFiZWw6XCJQcmV2aW91cyBNb250aFwiLG5leHRNb250aEJ1dHRvbkxhYmVsOlwiTmV4dCBNb250aFwiLHllYXJJdGVtTnVtYmVyOlNlfX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5wcm9wcy5zaG93VGltZVNlbGVjdCYmKHRoaXMuYXNzaWduTW9udGhDb250YWluZXI9dm9pZCBlLnNldFN0YXRlKHttb250aENvbnRhaW5lcjplLm1vbnRoQ29udGFpbmVyfSkpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZighdGhpcy5wcm9wcy5wcmVTZWxlY3Rpb258fEhlKHRoaXMucHJvcHMucHJlU2VsZWN0aW9uLGUucHJlU2VsZWN0aW9uKSYmdGhpcy5wcm9wcy5tb250aFNlbGVjdGVkSW49PT1lLm1vbnRoU2VsZWN0ZWRJbil0aGlzLnByb3BzLm9wZW5Ub0RhdGUmJiFIZSh0aGlzLnByb3BzLm9wZW5Ub0RhdGUsZS5vcGVuVG9EYXRlKSYmdGhpcy5zZXRTdGF0ZSh7ZGF0ZTp0aGlzLnByb3BzLm9wZW5Ub0RhdGV9KTtlbHNle3ZhciByPSFBZSh0aGlzLnN0YXRlLmRhdGUsdGhpcy5wcm9wcy5wcmVTZWxlY3Rpb24pO3RoaXMuc2V0U3RhdGUoe2RhdGU6dGhpcy5wcm9wcy5wcmVTZWxlY3Rpb259LChmdW5jdGlvbigpe3JldHVybiByJiZ0LmhhbmRsZUN1c3RvbU1vbnRoQ2hhbmdlKHQuc3RhdGUuZGF0ZSl9KSl9fSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmNvbnRhaW5lcnx8a2U7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtzdHlsZTp7ZGlzcGxheTpcImNvbnRlbnRzXCJ9LHJlZjp0aGlzLmNvbnRhaW5lclJlZn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGUse2NsYXNzTmFtZTp0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyXCIsdGhpcy5wcm9wcy5jbGFzc05hbWUse1wicmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5XCI6dGhpcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHl9KSxzaG93VGltZTp0aGlzLnByb3BzLnNob3dUaW1lU2VsZWN0fHx0aGlzLnByb3BzLnNob3dUaW1lSW5wdXQsc2hvd1RpbWVTZWxlY3RPbmx5OnRoaXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5fSx0aGlzLnJlbmRlckFyaWFMaXZlUmVnaW9uKCksdGhpcy5yZW5kZXJQcmV2aW91c0J1dHRvbigpLHRoaXMucmVuZGVyTmV4dEJ1dHRvbigpLHRoaXMucmVuZGVyTW9udGhzKCksdGhpcy5yZW5kZXJZZWFycygpLHRoaXMucmVuZGVyVG9kYXlCdXR0b24oKSx0aGlzLnJlbmRlclRpbWVTZWN0aW9uKCksdGhpcy5yZW5kZXJJbnB1dFRpbWVTZWN0aW9uKCksdGhpcy5yZW5kZXJDaGlsZHJlbigpKSl9LG59KHIuQ29tcG9uZW50KSxqdD1mdW5jdGlvbihlKXt2YXIgdD1lLmljb24scj1lLmNsYXNzTmFtZSxuPXZvaWQgMD09PXI/XCJcIjpyLGE9ZS5vbkNsaWNrLG89XCJyZWFjdC1kYXRlcGlja2VyX19jYWxlbmRhci1pY29uXCI7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQ/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiaVwiLHtjbGFzc05hbWU6XCJcIi5jb25jYXQobyxcIiBcIikuY29uY2F0KHQsXCIgXCIpLmNvbmNhdChuKSxcImFyaWEtaGlkZGVuXCI6XCJ0cnVlXCIsb25DbGljazphfSk6dWUuZGVmYXVsdC5pc1ZhbGlkRWxlbWVudCh0KT91ZS5kZWZhdWx0LmNsb25lRWxlbWVudCh0LHtjbGFzc05hbWU6XCJcIi5jb25jYXQodC5wcm9wcy5jbGFzc05hbWV8fFwiXCIsXCIgXCIpLmNvbmNhdChvLFwiIFwiKS5jb25jYXQobiksb25DbGljazpmdW5jdGlvbihlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnByb3BzLm9uQ2xpY2smJnQucHJvcHMub25DbGljayhlKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBhJiZhKGUpfX0pOnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInN2Z1wiLHtjbGFzc05hbWU6XCJcIi5jb25jYXQobyxcIiBcIikuY29uY2F0KG4pLHhtbG5zOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIix2aWV3Qm94OlwiMCAwIDQ0OCA1MTJcIixvbkNsaWNrOmF9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInBhdGhcIix7ZDpcIk05NiAzMlY2NEg0OEMyMS41IDY0IDAgODUuNSAwIDExMnY0OEg0NDhWMTEyYzAtMjYuNS0yMS41LTQ4LTQ4LTQ4SDM1MlYzMmMwLTE3LjctMTQuMy0zMi0zMi0zMnMtMzIgMTQuMy0zMiAzMlY2NEgxNjBWMzJjMC0xNy43LTE0LjMtMzItMzItMzJTOTYgMTQuMyA5NiAzMnpNNDQ4IDE5MkgwVjQ2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OEg0MDBjMjYuNSAwIDQ4LTIxLjUgNDgtNDhWMTkyelwifSkpfSxVdD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciByPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiByLnBvcnRhbFJvb3Q9bnVsbCxyLmVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikscn1yZXR1cm4gdmUodCxlKSx0LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMucG9ydGFsUm9vdD0odGhpcy5wcm9wcy5wb3J0YWxIb3N0fHxkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQodGhpcy5wcm9wcy5wb3J0YWxJZCksdGhpcy5wb3J0YWxSb290fHwodGhpcy5wb3J0YWxSb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5wb3J0YWxSb290LnNldEF0dHJpYnV0ZShcImlkXCIsdGhpcy5wcm9wcy5wb3J0YWxJZCksKHRoaXMucHJvcHMucG9ydGFsSG9zdHx8ZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcy5wb3J0YWxSb290KSksdGhpcy5wb3J0YWxSb290LmFwcGVuZENoaWxkKHRoaXMuZWwpfSx0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMucG9ydGFsUm9vdCYmdGhpcy5wb3J0YWxSb290LnJlbW92ZUNoaWxkKHRoaXMuZWwpfSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaGUuZGVmYXVsdC5jcmVhdGVQb3J0YWwodGhpcy5wcm9wcy5jaGlsZHJlbix0aGlzLmVsKX0sdH0oci5Db21wb25lbnQpLCR0PWZ1bmN0aW9uKGUpe3JldHVybihlIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnR8fCFlLmRpc2FibGVkKSYmLTEhPT1lLnRhYkluZGV4fSx6dD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLmdldFRhYkNoaWxkcmVuPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG51bGw9PT0oZT1uLnRhYkxvb3BSZWYuY3VycmVudCl8fHZvaWQgMD09PWU/dm9pZCAwOmUucXVlcnlTZWxlY3RvckFsbChcIlt0YWJpbmRleF0sIGEsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWFcIiksMSwtMSkuZmlsdGVyKCR0KX0sbi5oYW5kbGVGb2N1c1N0YXJ0PWZ1bmN0aW9uKCl7dmFyIGU9bi5nZXRUYWJDaGlsZHJlbigpO2UmJmUubGVuZ3RoPjEmJmVbZS5sZW5ndGgtMV0uZm9jdXMoKX0sbi5oYW5kbGVGb2N1c0VuZD1mdW5jdGlvbigpe3ZhciBlPW4uZ2V0VGFiQ2hpbGRyZW4oKTtlJiZlLmxlbmd0aD4xJiZlWzBdLmZvY3VzKCl9LG4udGFiTG9vcFJlZj1yLmNyZWF0ZVJlZigpLG59cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuKG51bGwhPT0oZT10aGlzLnByb3BzLmVuYWJsZVRhYkxvb3ApJiZ2b2lkIDAhPT1lP2U6dC5kZWZhdWx0UHJvcHMuZW5hYmxlVGFiTG9vcCk/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RhYi1sb29wXCIscmVmOnRoaXMudGFiTG9vcFJlZn0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RhYi1sb29wX19zdGFydFwiLHRhYkluZGV4OjAsb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzU3RhcnR9KSx0aGlzLnByb3BzLmNoaWxkcmVuLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190YWItbG9vcF9fZW5kXCIsdGFiSW5kZXg6MCxvbkZvY3VzOnRoaXMuaGFuZGxlRm9jdXNFbmR9KSk6dGhpcy5wcm9wcy5jaGlsZHJlbn0sdC5kZWZhdWx0UHJvcHM9e2VuYWJsZVRhYkxvb3A6ITB9LHR9KHIuQ29tcG9uZW50KTt2YXIgWHQsR3Q9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe3JldHVybiBudWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHZlKG4sZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2hpZGVQb3BwZXI6ITB9fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsYT1lLmNsYXNzTmFtZSxvPWUud3JhcHBlckNsYXNzTmFtZSxzPWUuaGlkZVBvcHBlcixpPXZvaWQgMD09PXM/bi5kZWZhdWx0UHJvcHMuaGlkZVBvcHBlcjpzLGw9ZS5wb3BwZXJDb21wb25lbnQsYz1lLnRhcmdldENvbXBvbmVudCxwPWUuZW5hYmxlVGFiTG9vcCxkPWUucG9wcGVyT25LZXlEb3duLHU9ZS5wb3J0YWxJZCxmPWUucG9ydGFsSG9zdCxoPWUucG9wcGVyUHJvcHMsbT1lLnNob3dBcnJvdyx2PXZvaWQgMDtpZighaSl7dmFyIGc9dC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlci1wb3BwZXJcIixhKTt2PXVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh6dCx7ZW5hYmxlVGFiTG9vcDpwfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOmgucmVmcy5zZXRGbG9hdGluZyxzdHlsZTpoLmZsb2F0aW5nU3R5bGVzLGNsYXNzTmFtZTpnLFwiZGF0YS1wbGFjZW1lbnRcIjpoLnBsYWNlbWVudCxvbktleURvd246ZH0sbCxtJiZ1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoY2UuRmxvYXRpbmdBcnJvdyx7cmVmOmguYXJyb3dSZWYsY29udGV4dDpoLmNvbnRleHQsZmlsbDpcImN1cnJlbnRDb2xvclwiLHN0cm9rZVdpZHRoOjEsaGVpZ2h0Ojgsd2lkdGg6MTYsc3R5bGU6e3RyYW5zZm9ybTpcInRyYW5zbGF0ZVkoLTFweClcIn0sY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGVcIn0pKSl9dGhpcy5wcm9wcy5wb3BwZXJDb250YWluZXImJih2PXIuY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLnBvcHBlckNvbnRhaW5lcix7fSx2KSksdSYmIWkmJih2PXVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChVdCx7cG9ydGFsSWQ6dSxwb3J0YWxIb3N0OmZ9LHYpKTt2YXIgRD10LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyLXdyYXBwZXJcIixvKTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHVlLmRlZmF1bHQuRnJhZ21lbnQsbnVsbCx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7cmVmOmgucmVmcy5zZXRSZWZlcmVuY2UsY2xhc3NOYW1lOkR9LGMpLHYpfSxufShyLkNvbXBvbmVudCksSnQ9KFh0PUd0LGZ1bmN0aW9uKGUpe3ZhciB0LG49XCJib29sZWFuXCIhPXR5cGVvZiBlLmhpZGVQb3BwZXJ8fGUuaGlkZVBvcHBlcixhPXIudXNlUmVmKG51bGwpLG89Y2UudXNlRmxvYXRpbmcoZ2Uoe29wZW46IW4sd2hpbGVFbGVtZW50c01vdW50ZWQ6Y2UuYXV0b1VwZGF0ZSxwbGFjZW1lbnQ6ZS5wb3BwZXJQbGFjZW1lbnQsbWlkZGxld2FyZTpEZShbY2UuZmxpcCh7cGFkZGluZzoxNX0pLGNlLm9mZnNldCgxMCksY2UuYXJyb3coe2VsZW1lbnQ6YX0pXSxudWxsIT09KHQ9ZS5wb3BwZXJNb2RpZmllcnMpJiZ2b2lkIDAhPT10P3Q6W10sITApfSxlLnBvcHBlclByb3BzKSkscz1nZShnZSh7fSxlKSx7aGlkZVBvcHBlcjpuLHBvcHBlclByb3BzOmdlKGdlKHt9LG8pLHthcnJvd1JlZjphfSl9KTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFh0LGdlKHt9LHMpKX0pLFp0PVwicmVhY3QtZGF0ZXBpY2tlci1pZ25vcmUtb25jbGlja291dHNpZGVcIixlcj1mZS5kZWZhdWx0KFZ0KTt2YXIgdHI9XCJEYXRlIGlucHV0IG5vdCB2YWxpZC5cIixycj1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKG8pe3ZhciBzPWUuY2FsbCh0aGlzLG8pfHx0aGlzO3JldHVybiBzLmNhbGVuZGFyPW51bGwscy5pbnB1dD1udWxsLHMuZ2V0UHJlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHMucHJvcHMub3BlblRvRGF0ZT9zLnByb3BzLm9wZW5Ub0RhdGU6cy5wcm9wcy5zZWxlY3RzRW5kJiZzLnByb3BzLnN0YXJ0RGF0ZT9zLnByb3BzLnN0YXJ0RGF0ZTpzLnByb3BzLnNlbGVjdHNTdGFydCYmcy5wcm9wcy5lbmREYXRlP3MucHJvcHMuZW5kRGF0ZTpNZSgpfSxzLm1vZGlmeUhvbGlkYXlzPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIG51bGw9PT0oZT1zLnByb3BzLmhvbGlkYXlzKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7dmFyIHI9bmV3IERhdGUodC5kYXRlKTtyZXR1cm4gQ2Uocik/RGUoRGUoW10sZSwhMCksW2dlKGdlKHt9LHQpLHtkYXRlOnJ9KV0sITEpOmV9KSxbXSl9LHMuY2FsY0luaXRpYWxTdGF0ZT1mdW5jdGlvbigpe3ZhciBlLHQ9cy5nZXRQcmVTZWxlY3Rpb24oKSxyPWN0KHMucHJvcHMpLG49cHQocy5wcm9wcyksYT1yJiZPLmlzQmVmb3JlKHQsWWUocikpP3I6biYmTi5pc0FmdGVyKHQsUmUobikpP246dDtyZXR1cm57b3BlbjpzLnByb3BzLnN0YXJ0T3Blbnx8ITEscHJldmVudEZvY3VzOiExLGlucHV0VmFsdWU6bnVsbCxwcmVTZWxlY3Rpb246bnVsbCE9PShlPXMucHJvcHMuc2VsZWN0c1JhbmdlP3MucHJvcHMuc3RhcnREYXRlOnMucHJvcHMuc2VsZWN0ZWQpJiZ2b2lkIDAhPT1lP2U6YSxoaWdobGlnaHREYXRlczpkdChzLnByb3BzLmhpZ2hsaWdodERhdGVzKSxmb2N1c2VkOiExLHNob3VsZEZvY3VzRGF5SW5saW5lOiExLGlzUmVuZGVyQXJpYUxpdmVNZXNzYWdlOiExLHdhc0hpZGRlbjohMX19LHMucmVzZXRIaWRkZW5TdGF0dXM9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKGdlKGdlKHt9LHMuc3RhdGUpLHt3YXNIaWRkZW46ITF9KSl9LHMuc2V0SGlkZGVuU3RhdHVzPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZShnZShnZSh7fSxzLnN0YXRlKSx7d2FzSGlkZGVuOiEwfSkpfSxzLnNldEhpZGRlblN0YXRlT25WaXNpYmlsaXR5SGlkZGVuPWZ1bmN0aW9uKCl7XCJoaWRkZW5cIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmcy5zZXRIaWRkZW5TdGF0dXMoKX0scy5jbGVhclByZXZlbnRGb2N1c1RpbWVvdXQ9ZnVuY3Rpb24oKXtzLnByZXZlbnRGb2N1c1RpbWVvdXQmJmNsZWFyVGltZW91dChzLnByZXZlbnRGb2N1c1RpbWVvdXQpfSxzLnNldEZvY3VzPWZ1bmN0aW9uKCl7cy5pbnB1dCYmcy5pbnB1dC5mb2N1cyYmcy5pbnB1dC5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pfSxzLnNldEJsdXI9ZnVuY3Rpb24oKXtzLmlucHV0JiZzLmlucHV0LmJsdXImJnMuaW5wdXQuYmx1cigpLHMuY2FuY2VsRm9jdXNJbnB1dCgpfSxzLnNldE9wZW49ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD0hMSkscy5zZXRTdGF0ZSh7b3BlbjplLHByZVNlbGVjdGlvbjplJiZzLnN0YXRlLm9wZW4/cy5zdGF0ZS5wcmVTZWxlY3Rpb246cy5jYWxjSW5pdGlhbFN0YXRlKCkucHJlU2VsZWN0aW9uLGxhc3RQcmVTZWxlY3RDaGFuZ2U6YXJ9LChmdW5jdGlvbigpe2V8fHMuc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3JldHVybntmb2N1c2VkOiEhdCYmZS5mb2N1c2VkfX0pLChmdW5jdGlvbigpeyF0JiZzLnNldEJsdXIoKSxzLnNldFN0YXRlKHtpbnB1dFZhbHVlOm51bGx9KX0pKX0pKX0scy5pbnB1dE9rPWZ1bmN0aW9uKCl7cmV0dXJuIEkuaXNEYXRlKHMuc3RhdGUucHJlU2VsZWN0aW9uKX0scy5pc0NhbGVuZGFyT3Blbj1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1zLnByb3BzLm9wZW4/cy5zdGF0ZS5vcGVuJiYhcy5wcm9wcy5kaXNhYmxlZCYmIXMucHJvcHMucmVhZE9ubHk6cy5wcm9wcy5vcGVufSxzLmhhbmRsZUZvY3VzPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbj1zLnN0YXRlLndhc0hpZGRlbixhPSFufHxzLnN0YXRlLm9wZW47biYmcy5yZXNldEhpZGRlblN0YXR1cygpLCFzLnN0YXRlLnByZXZlbnRGb2N1cyYmYSYmKG51bGw9PT0ocj0odD1zLnByb3BzKS5vbkZvY3VzKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSkscy5wcm9wcy5wcmV2ZW50T3Blbk9uRm9jdXN8fHMucHJvcHMucmVhZE9ubHl8fHMuc2V0T3BlbighMCkpLHMuc2V0U3RhdGUoe2ZvY3VzZWQ6ITB9KX0scy5zZW5kRm9jdXNCYWNrVG9JbnB1dD1mdW5jdGlvbigpe3MucHJldmVudEZvY3VzVGltZW91dCYmcy5jbGVhclByZXZlbnRGb2N1c1RpbWVvdXQoKSxzLnNldFN0YXRlKHtwcmV2ZW50Rm9jdXM6ITB9LChmdW5jdGlvbigpe3MucHJldmVudEZvY3VzVGltZW91dD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Muc2V0Rm9jdXMoKSxzLnNldFN0YXRlKHtwcmV2ZW50Rm9jdXM6ITF9KX0pKX0pKX0scy5jYW5jZWxGb2N1c0lucHV0PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHMuaW5wdXRGb2N1c1RpbWVvdXQpLHMuaW5wdXRGb2N1c1RpbWVvdXQ9dm9pZCAwfSxzLmRlZmVyRm9jdXNJbnB1dD1mdW5jdGlvbigpe3MuY2FuY2VsRm9jdXNJbnB1dCgpLHMuaW5wdXRGb2N1c1RpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gcy5zZXRGb2N1cygpfSksMSl9LHMuaGFuZGxlRHJvcGRvd25Gb2N1cz1mdW5jdGlvbigpe3MuY2FuY2VsRm9jdXNJbnB1dCgpfSxzLmhhbmRsZUJsdXI9ZnVuY3Rpb24oZSl7dmFyIHQscjsoIXMuc3RhdGUub3Blbnx8cy5wcm9wcy53aXRoUG9ydGFsfHxzLnByb3BzLnNob3dUaW1lSW5wdXQpJiYobnVsbD09PShyPSh0PXMucHJvcHMpLm9uQmx1cil8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpKSxzLnNldFN0YXRlKHtmb2N1c2VkOiExfSl9LHMuaGFuZGxlQ2FsZW5kYXJDbGlja091dHNpZGU9ZnVuY3Rpb24oZSl7dmFyIHQscjtzLnByb3BzLmlubGluZXx8cy5zZXRPcGVuKCExKSxudWxsPT09KHI9KHQ9cy5wcm9wcykub25DbGlja091dHNpZGUpfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKSxzLnByb3BzLndpdGhQb3J0YWwmJmUucHJldmVudERlZmF1bHQoKX0scy5oYW5kbGVDaGFuZ2U9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07dmFyIHI9ZVswXTtpZighcy5wcm9wcy5vbkNoYW5nZVJhd3x8KHMucHJvcHMub25DaGFuZ2VSYXcuYXBwbHkocyxlKSxyJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiByLmlzRGVmYXVsdFByZXZlbnRlZCYmIXIuaXNEZWZhdWx0UHJldmVudGVkKCkpKXtzLnNldFN0YXRlKHtpbnB1dFZhbHVlOihudWxsPT1yP3ZvaWQgMDpyLnRhcmdldClpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQ/ci50YXJnZXQudmFsdWU6bnVsbCxsYXN0UHJlU2VsZWN0Q2hhbmdlOm5yfSk7dmFyIGE9cy5wcm9wcyxvPWEuZGF0ZUZvcm1hdCxpPXZvaWQgMD09PW8/bi5kZWZhdWx0UHJvcHMuZGF0ZUZvcm1hdDpvLGw9YS5zdHJpY3RQYXJzaW5nLGM9dm9pZCAwPT09bD9uLmRlZmF1bHRQcm9wcy5zdHJpY3RQYXJzaW5nOmwscD1mdW5jdGlvbihlLHQscixuLGEpe3ZhciBvLHM9bnVsbCxpPUtlKHIpfHxLZShxZSgpKSxsPSEwO2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG89Sy5wYXJzZShlLHQsbmV3IERhdGUse2xvY2FsZTppLHVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VuczohMCx1c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zOiEwfSk7biYmKGw9Q2UobyxhKSYmZT09PV9lKG8sdCxyKSksQ2UobyxhKSYmbCYmKHM9byl9KSkscztpZihzPUsucGFyc2UoZSx0LG5ldyBEYXRlLHtsb2NhbGU6aSx1c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnM6ITAsdXNlQWRkaXRpb25hbERheU9mWWVhclRva2VuczohMH0pLG4pbD1DZShzKSYmZT09PV9lKHMsdCxyKTtlbHNlIGlmKCFDZShzKSl7dmFyIGM9KG51bGwhPT0obz10Lm1hdGNoKGJlKSkmJnZvaWQgMCE9PW8/bzpbXSkubWFwKChmdW5jdGlvbihlKXt2YXIgdD1lWzBdO2lmKFwicFwiPT09dHx8XCJQXCI9PT10KXt2YXIgcj1rLmxvbmdGb3JtYXR0ZXJzW3RdO3JldHVybiBpP3IoZSxpLmZvcm1hdExvbmcpOnR9cmV0dXJuIGV9KSkuam9pbihcIlwiKTtlLmxlbmd0aD4wJiYocz1LLnBhcnNlKGUsYy5zbGljZSgwLGUubGVuZ3RoKSxuZXcgRGF0ZSx7dXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zOiEwLHVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnM6ITB9KSksQ2Uocyl8fChzPW5ldyBEYXRlKGUpKX1yZXR1cm4gQ2UocykmJmw/czpudWxsfSgobnVsbD09cj92b2lkIDA6ci50YXJnZXQpaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50P3IudGFyZ2V0LnZhbHVlOlwiXCIsaSxzLnByb3BzLmxvY2FsZSxjLHMucHJvcHMubWluRGF0ZSk7cy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkmJnMucHJvcHMuc2VsZWN0ZWQmJnAmJiFIZShwLHMucHJvcHMuc2VsZWN0ZWQpJiYocD1WLnNldChzLnByb3BzLnNlbGVjdGVkLHtob3VyczpiLmdldEhvdXJzKHApLG1pbnV0ZXM6Qy5nZXRNaW51dGVzKHApLHNlY29uZHM6UC5nZXRTZWNvbmRzKHApfSkpLCFwJiYobnVsbD09cj92b2lkIDA6ci50YXJnZXQpaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50JiYobnVsbD09cj92b2lkIDA6ci50YXJnZXQudmFsdWUpfHxzLnNldFNlbGVjdGVkKHAsciwhMCl9fSxzLmhhbmRsZVNlbGVjdD1mdW5jdGlvbihlLHQscil7aWYocy5wcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0JiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdCYmcy5zZW5kRm9jdXNCYWNrVG9JbnB1dCgpLHMucHJvcHMub25DaGFuZ2VSYXcmJnMucHJvcHMub25DaGFuZ2VSYXcodCkscy5zZXRTZWxlY3RlZChlLHQsITEscikscy5wcm9wcy5zaG93RGF0ZVNlbGVjdCYmcy5zZXRTdGF0ZSh7aXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITB9KSwhcy5wcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0fHxzLnByb3BzLnNob3dUaW1lU2VsZWN0KXMuc2V0UHJlU2VsZWN0aW9uKGUpO2Vsc2UgaWYoIXMucHJvcHMuaW5saW5lKXtzLnByb3BzLnNlbGVjdHNSYW5nZXx8cy5zZXRPcGVuKCExKTt2YXIgbj1zLnByb3BzLGE9bi5zdGFydERhdGUsbz1uLmVuZERhdGU7IWF8fG98fCFzLnByb3BzLnN3YXBSYW5nZSYmRHQoZSxhKXx8cy5zZXRPcGVuKCExKX19LHMuc2V0U2VsZWN0ZWQ9ZnVuY3Rpb24oZSx0LHIsYSl7dmFyIG8saT1lO2lmKHMucHJvcHMuc2hvd1llYXJQaWNrZXIpe2lmKG51bGwhPT1pJiZaZSh4LmdldFllYXIoaSkscy5wcm9wcykpcmV0dXJufWVsc2UgaWYocy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyKXtpZihudWxsIT09aSYmJGUoaSxzLnByb3BzKSlyZXR1cm59ZWxzZSBpZihudWxsIT09aSYmamUoaSxzLnByb3BzKSlyZXR1cm47dmFyIGw9cy5wcm9wcyxjPWwub25DaGFuZ2UscD1sLnNlbGVjdHNSYW5nZSxkPWwuc3RhcnREYXRlLHU9bC5lbmREYXRlLGY9bC5zZWxlY3RzTXVsdGlwbGUsaD1sLnNlbGVjdGVkRGF0ZXMsbT1sLm1pblRpbWUsdj1sLnN3YXBSYW5nZTtpZighV2Uocy5wcm9wcy5zZWxlY3RlZCxpKXx8cy5wcm9wcy5hbGxvd1NhbWVEYXl8fHB8fGYpaWYobnVsbCE9PWkmJighcy5wcm9wcy5zZWxlY3RlZHx8ciYmKHMucHJvcHMuc2hvd1RpbWVTZWxlY3R8fHMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5fHxzLnByb3BzLnNob3dUaW1lSW5wdXQpfHwoaT1QZShpLHtob3VyOmIuZ2V0SG91cnMocy5wcm9wcy5zZWxlY3RlZCksbWludXRlOkMuZ2V0TWludXRlcyhzLnByb3BzLnNlbGVjdGVkKSxzZWNvbmQ6UC5nZXRTZWNvbmRzKHMucHJvcHMuc2VsZWN0ZWQpfSkpLHJ8fCFzLnByb3BzLnNob3dUaW1lU2VsZWN0JiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHl8fG0mJihpPVBlKGkse2hvdXI6bS5nZXRIb3VycygpLG1pbnV0ZTptLmdldE1pbnV0ZXMoKSxzZWNvbmQ6bS5nZXRTZWNvbmRzKCl9KSkscy5wcm9wcy5pbmxpbmV8fHMuc2V0U3RhdGUoe3ByZVNlbGVjdGlvbjppfSkscy5wcm9wcy5mb2N1c1NlbGVjdGVkTW9udGh8fHMuc2V0U3RhdGUoe21vbnRoU2VsZWN0ZWRJbjphfSkpLHApe3ZhciBnPWQmJiF1LEQ9ZCYmdTshZCYmIXU/Yz9jKFtpLG51bGxdLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlOmcmJihudWxsPT09aT9jP2MoW251bGwsbnVsbF0sdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2U6RHQoaSxkKT92P2M/YyhbaSxkXSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZTpjP2MoW2ksbnVsbF0sdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2U6Yz9jKFtkLGldLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlKSxEJiYoYz9jKFtpLG51bGxdLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlKX1lbHNlIGlmKGYpe2lmKG51bGwhPT1pKWlmKG51bGw9PWg/dm9pZCAwOmgubGVuZ3RoKWlmKGguc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIEhlKGUsaSl9KSkpe3ZhciB5PWguZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hSGUoZSxpKX0pKTtjP2MoeSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZX1lbHNlIGM/YyhEZShEZShbXSxoLCEwKSxbaV0sITEpLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlO2Vsc2UgYz9jKFtpXSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZX1lbHNlIGM/YyhpLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlO3J8fCgobnVsbCE9PShvPXMucHJvcHMub25TZWxlY3QpJiZ2b2lkIDAhPT1vP286bi5kZWZhdWx0UHJvcHMub25TZWxlY3QpKGksdCkscy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZTpudWxsfSkpfSxzLnNldFByZVNlbGVjdGlvbj1mdW5jdGlvbihlKXt2YXIgdD1JLmlzRGF0ZShzLnByb3BzLm1pbkRhdGUpLHI9SS5pc0RhdGUocy5wcm9wcy5tYXhEYXRlKSxuPSEwO2lmKGUpe3ZhciBhPVllKGUpO2lmKHQmJnIpbj1RZShlLHMucHJvcHMubWluRGF0ZSxzLnByb3BzLm1heERhdGUpO2Vsc2UgaWYodCl7dmFyIG89WWUocy5wcm9wcy5taW5EYXRlKTtuPU4uaXNBZnRlcihlLG8pfHxXZShhLG8pfWVsc2UgaWYocil7dmFyIGk9UmUocy5wcm9wcy5tYXhEYXRlKTtuPU8uaXNCZWZvcmUoZSxpKXx8V2UoYSxpKX19biYmcy5zZXRTdGF0ZSh7cHJlU2VsZWN0aW9uOmV9KX0scy50b2dnbGVDYWxlbmRhcj1mdW5jdGlvbigpe3Muc2V0T3Blbighcy5zdGF0ZS5vcGVuKX0scy5oYW5kbGVUaW1lQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFzLnByb3BzLnNlbGVjdHNSYW5nZSYmIXMucHJvcHMuc2VsZWN0c011bHRpcGxlKXt2YXIgcj1zLnByb3BzLnNlbGVjdGVkP3MucHJvcHMuc2VsZWN0ZWQ6cy5nZXRQcmVTZWxlY3Rpb24oKSxhPXMucHJvcHMuc2VsZWN0ZWQ/ZTpQZShyLHtob3VyOmIuZ2V0SG91cnMoZSksbWludXRlOkMuZ2V0TWludXRlcyhlKX0pO3Muc2V0U3RhdGUoe3ByZVNlbGVjdGlvbjphfSksKG51bGwhPT0odD1zLnByb3BzLm9uQ2hhbmdlKSYmdm9pZCAwIT09dD90Om4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlKShhKSxzLnByb3BzLnNob3VsZENsb3NlT25TZWxlY3QmJiFzLnByb3BzLnNob3dUaW1lSW5wdXQmJihzLnNlbmRGb2N1c0JhY2tUb0lucHV0KCkscy5zZXRPcGVuKCExKSkscy5wcm9wcy5zaG93VGltZUlucHV0JiZzLnNldE9wZW4oITApLChzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seXx8cy5wcm9wcy5zaG93VGltZVNlbGVjdCkmJnMuc2V0U3RhdGUoe2lzUmVuZGVyQXJpYUxpdmVNZXNzYWdlOiEwfSkscy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZTpudWxsfSl9fSxzLm9uSW5wdXRDbGljaz1mdW5jdGlvbigpe3ZhciBlLHQ7cy5wcm9wcy5kaXNhYmxlZHx8cy5wcm9wcy5yZWFkT25seXx8cy5zZXRPcGVuKCEwKSxudWxsPT09KHQ9KGU9cy5wcm9wcykub25JbnB1dENsaWNrKXx8dm9pZCAwPT09dHx8dC5jYWxsKGUpfSxzLm9uSW5wdXRLZXlEb3duPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhLG87bnVsbD09PShyPSh0PXMucHJvcHMpLm9uS2V5RG93bil8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpO3ZhciBpPWUua2V5O2lmKHMuc3RhdGUub3Blbnx8cy5wcm9wcy5pbmxpbmV8fHMucHJvcHMucHJldmVudE9wZW5PbkZvY3VzKXtpZihzLnN0YXRlLm9wZW4pe2lmKGk9PT15ZS5BcnJvd0Rvd258fGk9PT15ZS5BcnJvd1VwKXtlLnByZXZlbnREZWZhdWx0KCk7dmFyIGw9cy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHk/XCIucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW1bdGFiaW5kZXg9JzAnXVwiOnMucHJvcHMuc2hvd1dlZWtQaWNrZXImJnMucHJvcHMuc2hvd1dlZWtOdW1iZXJzPycucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXJbdGFiaW5kZXg9XCIwXCJdJzpzLnByb3BzLnNob3dGdWxsTW9udGhZZWFyUGlja2VyfHxzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXI/Jy5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0W3RhYmluZGV4PVwiMFwiXSc6Jy5yZWFjdC1kYXRlcGlja2VyX19kYXlbdGFiaW5kZXg9XCIwXCJdJyxjPShudWxsPT09KG49cy5jYWxlbmRhcil8fHZvaWQgMD09PW4/dm9pZCAwOm4uY29tcG9uZW50Tm9kZSlpbnN0YW5jZW9mIEVsZW1lbnQmJnMuY2FsZW5kYXIuY29tcG9uZW50Tm9kZS5xdWVyeVNlbGVjdG9yKGwpO3JldHVybiB2b2lkKGMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmYy5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pKX12YXIgcD1NZShzLnN0YXRlLnByZVNlbGVjdGlvbik7aT09PXllLkVudGVyPyhlLnByZXZlbnREZWZhdWx0KCkscy5pbnB1dE9rKCkmJnMuc3RhdGUubGFzdFByZVNlbGVjdENoYW5nZT09PWFyPyhzLmhhbmRsZVNlbGVjdChwLGUpLCFzLnByb3BzLnNob3VsZENsb3NlT25TZWxlY3QmJnMuc2V0UHJlU2VsZWN0aW9uKHApKTpzLnNldE9wZW4oITEpKTppPT09eWUuRXNjYXBlPyhlLnByZXZlbnREZWZhdWx0KCkscy5zZW5kRm9jdXNCYWNrVG9JbnB1dCgpLHMuc2V0T3BlbighMSkpOmk9PT15ZS5UYWImJnMuc2V0T3BlbighMSkscy5pbnB1dE9rKCl8fG51bGw9PT0obz0oYT1zLnByb3BzKS5vbklucHV0RXJyb3IpfHx2b2lkIDA9PT1vfHxvLmNhbGwoYSx7Y29kZToxLG1zZzp0cn0pfX1lbHNlIGkhPT15ZS5BcnJvd0Rvd24mJmkhPT15ZS5BcnJvd1VwJiZpIT09eWUuRW50ZXJ8fHMub25JbnB1dENsaWNrKCl9LHMub25Qb3J0YWxLZXlEb3duPWZ1bmN0aW9uKGUpe2Uua2V5PT09eWUuRXNjYXBlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLHMuc2V0U3RhdGUoe3ByZXZlbnRGb2N1czohMH0sKGZ1bmN0aW9uKCl7cy5zZXRPcGVuKCExKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Muc2V0Rm9jdXMoKSxzLnNldFN0YXRlKHtwcmV2ZW50Rm9jdXM6ITF9KX0pKX0pKSl9LHMub25EYXlLZXlEb3duPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbixvLGw9cy5wcm9wcyxjPWwubWluRGF0ZSx1PWwubWF4RGF0ZSxmPWwuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24saD1sLnNob3dXZWVrUGlja2VyLG09bC5zaG91bGRDbG9zZU9uU2VsZWN0LHY9bC5sb2NhbGUsZz1sLmNhbGVuZGFyU3RhcnREYXkseT1sLmFkanVzdERhdGVPbkNoYW5nZSxrPWwuaW5saW5lO2lmKG51bGw9PT0ocj0odD1zLnByb3BzKS5vbktleURvd24pfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKSwhZil7dmFyIHc9ZS5rZXksUz1lLnNoaWZ0S2V5LGI9TWUocy5zdGF0ZS5wcmVTZWxlY3Rpb24pLE09ZnVuY3Rpb24oZSx0KXt2YXIgcj10O3N3aXRjaChlKXtjYXNlIHllLkFycm93UmlnaHQ6cj1oP3AuYWRkV2Vla3ModCwxKTphLmFkZERheXModCwxKTticmVhaztjYXNlIHllLkFycm93TGVmdDpyPWg/c2Uuc3ViV2Vla3ModCwxKTpuZS5zdWJEYXlzKHQsMSk7YnJlYWs7Y2FzZSB5ZS5BcnJvd1VwOnI9c2Uuc3ViV2Vla3ModCwxKTticmVhaztjYXNlIHllLkFycm93RG93bjpyPXAuYWRkV2Vla3ModCwxKTticmVhaztjYXNlIHllLlBhZ2VVcDpyPVM/aWUuc3ViWWVhcnModCwxKTphZS5zdWJNb250aHModCwxKTticmVhaztjYXNlIHllLlBhZ2VEb3duOnI9Uz9kLmFkZFllYXJzKHQsMSk6aS5hZGRNb250aHModCwxKTticmVhaztjYXNlIHllLkhvbWU6cj14ZSh0LHYsZyk7YnJlYWs7Y2FzZSB5ZS5FbmQ6cj1mdW5jdGlvbihlKXtyZXR1cm4gRC5lbmRPZldlZWsoZSl9KHQpfXJldHVybiByfTtpZih3PT09eWUuRW50ZXIpcmV0dXJuIGUucHJldmVudERlZmF1bHQoKSxzLmhhbmRsZVNlbGVjdChiLGUpLHZvaWQoIW0mJnMuc2V0UHJlU2VsZWN0aW9uKGIpKTtpZih3PT09eWUuRXNjYXBlKXJldHVybiBlLnByZXZlbnREZWZhdWx0KCkscy5zZXRPcGVuKCExKSx2b2lkKHMuaW5wdXRPaygpfHxudWxsPT09KG89KG49cy5wcm9wcykub25JbnB1dEVycm9yKXx8dm9pZCAwPT09b3x8by5jYWxsKG4se2NvZGU6MSxtc2c6dHJ9KSk7dmFyIEM9bnVsbDtzd2l0Y2godyl7Y2FzZSB5ZS5BcnJvd0xlZnQ6Y2FzZSB5ZS5BcnJvd1JpZ2h0OmNhc2UgeWUuQXJyb3dVcDpjYXNlIHllLkFycm93RG93bjpjYXNlIHllLlBhZ2VVcDpjYXNlIHllLlBhZ2VEb3duOmNhc2UgeWUuSG9tZTpjYXNlIHllLkVuZDpDPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPWUsbj0hMSxhPTAsbz1NKGUsdCk7IW47KXtpZihhPj00MCl7bz10O2JyZWFrfWMmJm88YyYmKHI9eWUuQXJyb3dSaWdodCxvPWplKGMscy5wcm9wcyk/TShyLG8pOmMpLHUmJm8+dSYmKHI9eWUuQXJyb3dMZWZ0LG89amUodSxzLnByb3BzKT9NKHIsbyk6dSksamUobyxzLnByb3BzKT8ociE9PXllLlBhZ2VVcCYmciE9PXllLkhvbWV8fChyPXllLkFycm93UmlnaHQpLHIhPT15ZS5QYWdlRG93biYmciE9PXllLkVuZHx8KHI9eWUuQXJyb3dMZWZ0KSxvPU0ocixvKSk6bj0hMCxhKyt9cmV0dXJuIG99KHcsYil9aWYoQyl7aWYoZS5wcmV2ZW50RGVmYXVsdCgpLHMuc2V0U3RhdGUoe2xhc3RQcmVTZWxlY3RDaGFuZ2U6YXJ9KSx5JiZzLnNldFNlbGVjdGVkKEMpLHMuc2V0UHJlU2VsZWN0aW9uKEMpLGspe3ZhciBFPV8uZ2V0TW9udGgoYiksUD1fLmdldE1vbnRoKEMpLFk9eC5nZXRZZWFyKGIpLE49eC5nZXRZZWFyKEMpO0UhPT1QfHxZIT09Tj9zLnNldFN0YXRlKHtzaG91bGRGb2N1c0RheUlubGluZTohMH0pOnMuc2V0U3RhdGUoe3Nob3VsZEZvY3VzRGF5SW5saW5lOiExfSl9fWVsc2Ugcy5wcm9wcy5vbklucHV0RXJyb3ImJnMucHJvcHMub25JbnB1dEVycm9yKHtjb2RlOjEsbXNnOnRyfSl9fSxzLm9uUG9wcGVyS2V5RG93bj1mdW5jdGlvbihlKXtlLmtleT09PXllLkVzY2FwZSYmKGUucHJldmVudERlZmF1bHQoKSxzLnNlbmRGb2N1c0JhY2tUb0lucHV0KCkpfSxzLm9uQ2xlYXJDbGljaz1mdW5jdGlvbihlKXtlJiZlLnByZXZlbnREZWZhdWx0JiZlLnByZXZlbnREZWZhdWx0KCkscy5zZW5kRm9jdXNCYWNrVG9JbnB1dCgpO3ZhciB0PXMucHJvcHMscj10LnNlbGVjdHNSYW5nZSxhPXQub25DaGFuZ2U7cj9hP2EoW251bGwsbnVsbF0sZSk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2UoKTphP2EobnVsbCxlKTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZSgpLHMuc2V0U3RhdGUoe2lucHV0VmFsdWU6bnVsbH0pfSxzLmNsZWFyPWZ1bmN0aW9uKCl7cy5vbkNsZWFyQ2xpY2soKX0scy5vblNjcm9sbD1mdW5jdGlvbihlKXtcImJvb2xlYW5cIj09dHlwZW9mIHMucHJvcHMuY2xvc2VPblNjcm9sbCYmcy5wcm9wcy5jbG9zZU9uU2Nyb2xsP2UudGFyZ2V0IT09ZG9jdW1lbnQmJmUudGFyZ2V0IT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZlLnRhcmdldCE9PWRvY3VtZW50LmJvZHl8fHMuc2V0T3BlbighMSk6XCJmdW5jdGlvblwiPT10eXBlb2Ygcy5wcm9wcy5jbG9zZU9uU2Nyb2xsJiZzLnByb3BzLmNsb3NlT25TY3JvbGwoZSkmJnMuc2V0T3BlbighMSl9LHMucmVuZGVyQ2FsZW5kYXI9ZnVuY3Rpb24oKXt2YXIgZSx0O3JldHVybiBzLnByb3BzLmlubGluZXx8cy5pc0NhbGVuZGFyT3BlbigpP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChlcixnZSh7cmVmOmZ1bmN0aW9uKGUpe3MuY2FsZW5kYXI9ZX19LHMucHJvcHMscy5zdGF0ZSx7c2V0T3BlbjpzLnNldE9wZW4sZGF0ZUZvcm1hdDpudWxsIT09KGU9cy5wcm9wcy5kYXRlRm9ybWF0Q2FsZW5kYXIpJiZ2b2lkIDAhPT1lP2U6bi5kZWZhdWx0UHJvcHMuZGF0ZUZvcm1hdENhbGVuZGFyLG9uU2VsZWN0OnMuaGFuZGxlU2VsZWN0LG9uQ2xpY2tPdXRzaWRlOnMuaGFuZGxlQ2FsZW5kYXJDbGlja091dHNpZGUsaG9saWRheXM6dXQocy5tb2RpZnlIb2xpZGF5cygpKSxvdXRzaWRlQ2xpY2tJZ25vcmVDbGFzczpadCxvbkRyb3Bkb3duRm9jdXM6cy5oYW5kbGVEcm9wZG93bkZvY3VzLG9uVGltZUNoYW5nZTpzLmhhbmRsZVRpbWVDaGFuZ2UsY2xhc3NOYW1lOnMucHJvcHMuY2FsZW5kYXJDbGFzc05hbWUsY29udGFpbmVyOnMucHJvcHMuY2FsZW5kYXJDb250YWluZXIsaGFuZGxlT25LZXlEb3duOnMucHJvcHMub25LZXlEb3duLGhhbmRsZU9uRGF5S2V5RG93bjpzLm9uRGF5S2V5RG93bixzZXRQcmVTZWxlY3Rpb246cy5zZXRQcmVTZWxlY3Rpb24sZHJvcGRvd25Nb2RlOm51bGwhPT0odD1zLnByb3BzLmRyb3Bkb3duTW9kZSkmJnZvaWQgMCE9PXQ/dDpuLmRlZmF1bHRQcm9wcy5kcm9wZG93bk1vZGV9KSxzLnByb3BzLmNoaWxkcmVuKTpudWxsfSxzLnJlbmRlckFyaWFMaXZlUmVnaW9uPWZ1bmN0aW9uKCl7dmFyIGUsdD1zLnByb3BzLHI9dC5kYXRlRm9ybWF0LGE9dm9pZCAwPT09cj9uLmRlZmF1bHRQcm9wcy5kYXRlRm9ybWF0OnIsbz10LmxvY2FsZSxpPXMucHJvcHMuc2hvd1RpbWVJbnB1dHx8cy5wcm9wcy5zaG93VGltZVNlbGVjdD9cIlBQUFBwXCI6XCJQUFBQXCI7cmV0dXJuIGU9cy5wcm9wcy5zZWxlY3RzUmFuZ2U/XCJTZWxlY3RlZCBzdGFydCBkYXRlOiBcIi5jb25jYXQoRWUocy5wcm9wcy5zdGFydERhdGUse2RhdGVGb3JtYXQ6aSxsb2NhbGU6b30pLFwiLiBcIikuY29uY2F0KHMucHJvcHMuZW5kRGF0ZT9cIkVuZCBkYXRlOiBcIitFZShzLnByb3BzLmVuZERhdGUse2RhdGVGb3JtYXQ6aSxsb2NhbGU6b30pOlwiXCIpOnMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5P1wiU2VsZWN0ZWQgdGltZTogXCIuY29uY2F0KEVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6YSxsb2NhbGU6b30pKTpzLnByb3BzLnNob3dZZWFyUGlja2VyP1wiU2VsZWN0ZWQgeWVhcjogXCIuY29uY2F0KEVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6XCJ5eXl5XCIsbG9jYWxlOm99KSk6cy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyP1wiU2VsZWN0ZWQgbW9udGg6IFwiLmNvbmNhdChFZShzLnByb3BzLnNlbGVjdGVkLHtkYXRlRm9ybWF0OlwiTU1NTSB5eXl5XCIsbG9jYWxlOm99KSk6cy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXI/XCJTZWxlY3RlZCBxdWFydGVyOiBcIi5jb25jYXQoRWUocy5wcm9wcy5zZWxlY3RlZCx7ZGF0ZUZvcm1hdDpcInl5eXksIFFRUVwiLGxvY2FsZTpvfSkpOlwiU2VsZWN0ZWQgZGF0ZTogXCIuY29uY2F0KEVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6aSxsb2NhbGU6b30pKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse3JvbGU6XCJhbGVydFwiLFwiYXJpYS1saXZlXCI6XCJwb2xpdGVcIixjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19hcmlhLWxpdmVcIn0sZSl9LHMucmVuZGVyRGF0ZUlucHV0PWZ1bmN0aW9uKCl7dmFyIGUsYSxvLGk9dC5jbHN4KHMucHJvcHMuY2xhc3NOYW1lLCgoZT17fSlbWnRdPXMuc3RhdGUub3BlbixlKSksbD1zLnByb3BzLmN1c3RvbUlucHV0fHx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLHt0eXBlOlwidGV4dFwifSksYz1zLnByb3BzLmN1c3RvbUlucHV0UmVmfHxcInJlZlwiLHA9cy5wcm9wcyxkPXAuZGF0ZUZvcm1hdCx1PXZvaWQgMD09PWQ/bi5kZWZhdWx0UHJvcHMuZGF0ZUZvcm1hdDpkLGY9cC5sb2NhbGUsaD1cInN0cmluZ1wiPT10eXBlb2Ygcy5wcm9wcy52YWx1ZT9zLnByb3BzLnZhbHVlOlwic3RyaW5nXCI9PXR5cGVvZiBzLnN0YXRlLmlucHV0VmFsdWU/cy5zdGF0ZS5pbnB1dFZhbHVlOnMucHJvcHMuc2VsZWN0c1JhbmdlP2Z1bmN0aW9uKGUsdCxyKXtpZighZSlyZXR1cm5cIlwiO3ZhciBuPUVlKGUsciksYT10P0VlKHQscik6XCJcIjtyZXR1cm5cIlwiLmNvbmNhdChuLFwiIC0gXCIpLmNvbmNhdChhKX0ocy5wcm9wcy5zdGFydERhdGUscy5wcm9wcy5lbmREYXRlLHtkYXRlRm9ybWF0OnUsbG9jYWxlOmZ9KTpzLnByb3BzLnNlbGVjdHNNdWx0aXBsZT9mdW5jdGlvbihlLHQpe2lmKCEobnVsbD09ZT92b2lkIDA6ZS5sZW5ndGgpKXJldHVyblwiXCI7dmFyIHI9ZVswXT9FZShlWzBdLHQpOlwiXCI7aWYoMT09PWUubGVuZ3RoKXJldHVybiByO2lmKDI9PT1lLmxlbmd0aCYmZVsxXSl7dmFyIG49RWUoZVsxXSx0KTtyZXR1cm5cIlwiLmNvbmNhdChyLFwiLCBcIikuY29uY2F0KG4pfXZhciBhPWUubGVuZ3RoLTE7cmV0dXJuXCJcIi5jb25jYXQocixcIiAoK1wiKS5jb25jYXQoYSxcIilcIil9KG51bGwhPT0obz1zLnByb3BzLnNlbGVjdGVkRGF0ZXMpJiZ2b2lkIDAhPT1vP286W10se2RhdGVGb3JtYXQ6dSxsb2NhbGU6Zn0pOkVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6dSxsb2NhbGU6Zn0pO3JldHVybiByLmNsb25lRWxlbWVudChsLCgoYT17fSlbY109ZnVuY3Rpb24oZSl7cy5pbnB1dD1lfSxhLnZhbHVlPWgsYS5vbkJsdXI9cy5oYW5kbGVCbHVyLGEub25DaGFuZ2U9cy5oYW5kbGVDaGFuZ2UsYS5vbkNsaWNrPXMub25JbnB1dENsaWNrLGEub25Gb2N1cz1zLmhhbmRsZUZvY3VzLGEub25LZXlEb3duPXMub25JbnB1dEtleURvd24sYS5pZD1zLnByb3BzLmlkLGEubmFtZT1zLnByb3BzLm5hbWUsYS5mb3JtPXMucHJvcHMuZm9ybSxhLmF1dG9Gb2N1cz1zLnByb3BzLmF1dG9Gb2N1cyxhLnBsYWNlaG9sZGVyPXMucHJvcHMucGxhY2Vob2xkZXJUZXh0LGEuZGlzYWJsZWQ9cy5wcm9wcy5kaXNhYmxlZCxhLmF1dG9Db21wbGV0ZT1zLnByb3BzLmF1dG9Db21wbGV0ZSxhLmNsYXNzTmFtZT10LmNsc3gobC5wcm9wcy5jbGFzc05hbWUsaSksYS50aXRsZT1zLnByb3BzLnRpdGxlLGEucmVhZE9ubHk9cy5wcm9wcy5yZWFkT25seSxhLnJlcXVpcmVkPXMucHJvcHMucmVxdWlyZWQsYS50YWJJbmRleD1zLnByb3BzLnRhYkluZGV4LGFbXCJhcmlhLWRlc2NyaWJlZGJ5XCJdPXMucHJvcHMuYXJpYURlc2NyaWJlZEJ5LGFbXCJhcmlhLWludmFsaWRcIl09cy5wcm9wcy5hcmlhSW52YWxpZCxhW1wiYXJpYS1sYWJlbGxlZGJ5XCJdPXMucHJvcHMuYXJpYUxhYmVsbGVkQnksYVtcImFyaWEtcmVxdWlyZWRcIl09cy5wcm9wcy5hcmlhUmVxdWlyZWQsYSkpfSxzLnJlbmRlckNsZWFyQnV0dG9uPWZ1bmN0aW9uKCl7dmFyIGU9cy5wcm9wcyxyPWUuaXNDbGVhcmFibGUsbj1lLmRpc2FibGVkLGE9ZS5zZWxlY3RlZCxvPWUuc3RhcnREYXRlLGk9ZS5lbmREYXRlLGw9ZS5jbGVhckJ1dHRvblRpdGxlLGM9ZS5jbGVhckJ1dHRvbkNsYXNzTmFtZSxwPXZvaWQgMD09PWM/XCJcIjpjLGQ9ZS5hcmlhTGFiZWxDbG9zZSx1PXZvaWQgMD09PWQ/XCJDbG9zZVwiOmQsZj1lLnNlbGVjdGVkRGF0ZXM7cmV0dXJuIHImJihudWxsIT1hfHxudWxsIT1vfHxudWxsIT1pfHwobnVsbD09Zj92b2lkIDA6Zi5sZW5ndGgpKT91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIix7dHlwZTpcImJ1dHRvblwiLGNsYXNzTmFtZTp0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uXCIscCx7XCJyZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uLS1kaXNhYmxlZFwiOm59KSxkaXNhYmxlZDpuLFwiYXJpYS1sYWJlbFwiOnUsb25DbGljazpzLm9uQ2xlYXJDbGljayx0aXRsZTpsLHRhYkluZGV4Oi0xfSk6bnVsbH0scy5zdGF0ZT1zLmNhbGNJbml0aWFsU3RhdGUoKSxzLnByZXZlbnRGb2N1c1RpbWVvdXQ9dm9pZCAwLHN9cmV0dXJuIHZlKG4sZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue2FsbG93U2FtZURheTohMSxkYXRlRm9ybWF0OlwiTU0vZGQveXl5eVwiLGRhdGVGb3JtYXRDYWxlbmRhcjpcIkxMTEwgeXl5eVwiLG9uQ2hhbmdlOmZ1bmN0aW9uKCl7fSxkaXNhYmxlZDohMSxkaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbjohMSxkcm9wZG93bk1vZGU6XCJzY3JvbGxcIixvbkZvY3VzOmZ1bmN0aW9uKCl7fSxvbkJsdXI6ZnVuY3Rpb24oKXt9LG9uS2V5RG93bjpmdW5jdGlvbigpe30sb25JbnB1dENsaWNrOmZ1bmN0aW9uKCl7fSxvblNlbGVjdDpmdW5jdGlvbigpe30sb25DbGlja091dHNpZGU6ZnVuY3Rpb24oKXt9LG9uTW9udGhDaGFuZ2U6ZnVuY3Rpb24oKXt9LG9uQ2FsZW5kYXJPcGVuOmZ1bmN0aW9uKCl7fSxvbkNhbGVuZGFyQ2xvc2U6ZnVuY3Rpb24oKXt9LHByZXZlbnRPcGVuT25Gb2N1czohMSxvblllYXJDaGFuZ2U6ZnVuY3Rpb24oKXt9LG9uSW5wdXRFcnJvcjpmdW5jdGlvbigpe30sbW9udGhzU2hvd246MSxyZWFkT25seTohMSx3aXRoUG9ydGFsOiExLHNlbGVjdHNEaXNhYmxlZERheXNJblJhbmdlOiExLHNob3VsZENsb3NlT25TZWxlY3Q6ITAsc2hvd1RpbWVTZWxlY3Q6ITEsc2hvd1RpbWVJbnB1dDohMSxzaG93UHJldmlvdXNNb250aHM6ITEsc2hvd01vbnRoWWVhclBpY2tlcjohMSxzaG93RnVsbE1vbnRoWWVhclBpY2tlcjohMSxzaG93VHdvQ29sdW1uTW9udGhZZWFyUGlja2VyOiExLHNob3dGb3VyQ29sdW1uTW9udGhZZWFyUGlja2VyOiExLHNob3dZZWFyUGlja2VyOiExLHNob3dRdWFydGVyWWVhclBpY2tlcjohMSxzaG93V2Vla1BpY2tlcjohMSxzdHJpY3RQYXJzaW5nOiExLHN3YXBSYW5nZTohMSx0aW1lSW50ZXJ2YWxzOjMwLHRpbWVDYXB0aW9uOlwiVGltZVwiLHByZXZpb3VzTW9udGhBcmlhTGFiZWw6XCJQcmV2aW91cyBNb250aFwiLHByZXZpb3VzTW9udGhCdXR0b25MYWJlbDpcIlByZXZpb3VzIE1vbnRoXCIsbmV4dE1vbnRoQXJpYUxhYmVsOlwiTmV4dCBNb250aFwiLG5leHRNb250aEJ1dHRvbkxhYmVsOlwiTmV4dCBNb250aFwiLHByZXZpb3VzWWVhckFyaWFMYWJlbDpcIlByZXZpb3VzIFllYXJcIixwcmV2aW91c1llYXJCdXR0b25MYWJlbDpcIlByZXZpb3VzIFllYXJcIixuZXh0WWVhckFyaWFMYWJlbDpcIk5leHQgWWVhclwiLG5leHRZZWFyQnV0dG9uTGFiZWw6XCJOZXh0IFllYXJcIix0aW1lSW5wdXRMYWJlbDpcIlRpbWVcIixlbmFibGVUYWJMb29wOiEwLHllYXJJdGVtTnVtYmVyOlNlLGZvY3VzU2VsZWN0ZWRNb250aDohMSxzaG93UG9wcGVyQXJyb3c6ITAsZXhjbHVkZVNjcm9sbGJhcjohMCxjdXN0b21UaW1lSW5wdXQ6bnVsbCxjYWxlbmRhclN0YXJ0RGF5OnZvaWQgMCx0b2dnbGVDYWxlbmRhck9uSWNvbkNsaWNrOiExLHVzZVBvaW50ZXJFdmVudDohMX19LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksbi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLHRoaXMub25TY3JvbGwsITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsdGhpcy5zZXRIaWRkZW5TdGF0ZU9uVmlzaWJpbGl0eUhpZGRlbil9LG4ucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihlLHQpe3ZhciByLG4sYSxvLHMsaTtlLmlubGluZSYmKHM9ZS5zZWxlY3RlZCxpPXRoaXMucHJvcHMuc2VsZWN0ZWQscyYmaT9fLmdldE1vbnRoKHMpIT09Xy5nZXRNb250aChpKXx8eC5nZXRZZWFyKHMpIT09eC5nZXRZZWFyKGkpOnMhPT1pKSYmdGhpcy5zZXRQcmVTZWxlY3Rpb24odGhpcy5wcm9wcy5zZWxlY3RlZCksdm9pZCAwIT09dGhpcy5zdGF0ZS5tb250aFNlbGVjdGVkSW4mJmUubW9udGhzU2hvd24hPT10aGlzLnByb3BzLm1vbnRoc1Nob3duJiZ0aGlzLnNldFN0YXRlKHttb250aFNlbGVjdGVkSW46MH0pLGUuaGlnaGxpZ2h0RGF0ZXMhPT10aGlzLnByb3BzLmhpZ2hsaWdodERhdGVzJiZ0aGlzLnNldFN0YXRlKHtoaWdobGlnaHREYXRlczpkdCh0aGlzLnByb3BzLmhpZ2hsaWdodERhdGVzKX0pLHQuZm9jdXNlZHx8V2UoZS5zZWxlY3RlZCx0aGlzLnByb3BzLnNlbGVjdGVkKXx8dGhpcy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZTpudWxsfSksdC5vcGVuIT09dGhpcy5zdGF0ZS5vcGVuJiYoITE9PT10Lm9wZW4mJiEwPT09dGhpcy5zdGF0ZS5vcGVuJiYobnVsbD09PShuPShyPXRoaXMucHJvcHMpLm9uQ2FsZW5kYXJPcGVuKXx8dm9pZCAwPT09bnx8bi5jYWxsKHIpKSwhMD09PXQub3BlbiYmITE9PT10aGlzLnN0YXRlLm9wZW4mJihudWxsPT09KG89KGE9dGhpcy5wcm9wcykub25DYWxlbmRhckNsb3NlKXx8dm9pZCAwPT09b3x8by5jYWxsKGEpKSl9LG4ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5jbGVhclByZXZlbnRGb2N1c1RpbWVvdXQoKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLHRoaXMub25TY3JvbGwsITApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsdGhpcy5zZXRIaWRkZW5TdGF0ZU9uVmlzaWJpbGl0eUhpZGRlbil9LG4ucHJvdG90eXBlLnJlbmRlcklucHV0Q29udGFpbmVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyxyPWUuc2hvd0ljb24sbj1lLmljb24sYT1lLmNhbGVuZGFySWNvbkNsYXNzbmFtZSxvPWUuY2FsZW5kYXJJY29uQ2xhc3NOYW1lLHM9ZS50b2dnbGVDYWxlbmRhck9uSWNvbkNsaWNrLGk9dGhpcy5zdGF0ZS5vcGVuO3JldHVybiBhJiZjb25zb2xlLndhcm4oXCJjYWxlbmRhckljb25DbGFzc25hbWUgcHJvcHMgaXMgZGVwcmVjYXRlZC4gc2hvdWxkIHVzZSBjYWxlbmRhckljb25DbGFzc05hbWUgcHJvcHMuXCIpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXJcIi5jb25jYXQocj9cIiByZWFjdC1kYXRlcGlja2VyX192aWV3LWNhbGVuZGFyLWljb25cIjpcIlwiKX0sciYmdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGp0LGdlKHtpY29uOm4sY2xhc3NOYW1lOnQuY2xzeChvLCFvJiZhLGkmJlwicmVhY3QtZGF0ZXBpY2tlci1pZ25vcmUtb25jbGlja291dHNpZGVcIil9LHM/e29uQ2xpY2s6dGhpcy50b2dnbGVDYWxlbmRhcn06bnVsbCkpLHRoaXMuc3RhdGUuaXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2UmJnRoaXMucmVuZGVyQXJpYUxpdmVSZWdpb24oKSx0aGlzLnJlbmRlckRhdGVJbnB1dCgpLHRoaXMucmVuZGVyQ2xlYXJCdXR0b24oKSl9LG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmVuZGVyQ2FsZW5kYXIoKTtpZih0aGlzLnByb3BzLmlubGluZSlyZXR1cm4gZTtpZih0aGlzLnByb3BzLndpdGhQb3J0YWwpe3ZhciB0PXRoaXMuc3RhdGUub3Blbj91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoenQse2VuYWJsZVRhYkxvb3A6dGhpcy5wcm9wcy5lbmFibGVUYWJMb29wfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsXCIsdGFiSW5kZXg6LTEsb25LZXlEb3duOnRoaXMub25Qb3J0YWxLZXlEb3dufSxlKSk6bnVsbDtyZXR1cm4gdGhpcy5zdGF0ZS5vcGVuJiZ0aGlzLnByb3BzLnBvcnRhbElkJiYodD11ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoVXQsZ2Uoe3BvcnRhbElkOnRoaXMucHJvcHMucG9ydGFsSWR9LHRoaXMucHJvcHMpLHQpKSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixudWxsLHRoaXMucmVuZGVySW5wdXRDb250YWluZXIoKSx0KX1yZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEp0LGdlKHt9LHRoaXMucHJvcHMse2NsYXNzTmFtZTp0aGlzLnByb3BzLnBvcHBlckNsYXNzTmFtZSxoaWRlUG9wcGVyOiF0aGlzLmlzQ2FsZW5kYXJPcGVuKCksdGFyZ2V0Q29tcG9uZW50OnRoaXMucmVuZGVySW5wdXRDb250YWluZXIoKSxwb3BwZXJDb21wb25lbnQ6ZSxwb3BwZXJPbktleURvd246dGhpcy5vblBvcHBlcktleURvd24sc2hvd0Fycm93OnRoaXMucHJvcHMuc2hvd1BvcHBlckFycm93fSkpfSxufShyLkNvbXBvbmVudCksbnI9XCJpbnB1dFwiLGFyPVwibmF2aWdhdGVcIjtlLkNhbGVuZGFyQ29udGFpbmVyPWtlLGUuZGVmYXVsdD1ycixlLmdldERlZmF1bHRMb2NhbGU9cWUsZS5yZWdpc3RlckxvY2FsZT1mdW5jdGlvbihlLHQpe3ZhciByPXdlKCk7ci5fX2xvY2FsZURhdGFfX3x8KHIuX19sb2NhbGVEYXRhX189e30pLHIuX19sb2NhbGVEYXRhX19bZV09dH0sZS5zZXREZWZhdWx0TG9jYWxlPWZ1bmN0aW9uKGUpe3dlKCkuX19sb2NhbGVJZF9fPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZExlYWRpbmdaZXJvcyA9IGFkZExlYWRpbmdaZXJvcztcbmZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvcyhudW1iZXIsIHRhcmdldExlbmd0aCkge1xuICBjb25zdCBzaWduID0gbnVtYmVyIDwgMCA/IFwiLVwiIDogXCJcIjtcbiAgY29uc3Qgb3V0cHV0ID0gTWF0aC5hYnMobnVtYmVyKS50b1N0cmluZygpLnBhZFN0YXJ0KHRhcmdldExlbmd0aCwgXCIwXCIpO1xuICByZXR1cm4gc2lnbiArIG91dHB1dDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVmYXVsdExvY2FsZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfaW5kZXguZW5VUztcbiAgfSxcbn0pO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi9sb2NhbGUvZW4tVVMuanNcIik7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0RGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucztcbmV4cG9ydHMuc2V0RGVmYXVsdE9wdGlvbnMgPSBzZXREZWZhdWx0T3B0aW9ucztcblxubGV0IGRlZmF1bHRPcHRpb25zID0ge307XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkge1xuICByZXR1cm4gZGVmYXVsdE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHNldERlZmF1bHRPcHRpb25zKG5ld09wdGlvbnMpIHtcbiAgZGVmYXVsdE9wdGlvbnMgPSBuZXdPcHRpb25zO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmZvcm1hdHRlcnMgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uL2dldERheU9mWWVhci5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uL2dldElTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuLi8uLi9nZXRJU09XZWVrWWVhci5qc1wiKTtcbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4uLy4uL2dldFdlZWsuanNcIik7XG52YXIgX2luZGV4NSA9IHJlcXVpcmUoXCIuLi8uLi9nZXRXZWVrWWVhci5qc1wiKTtcblxudmFyIF9pbmRleDYgPSByZXF1aXJlKFwiLi4vYWRkTGVhZGluZ1plcm9zLmpzXCIpO1xudmFyIF9pbmRleDcgPSByZXF1aXJlKFwiLi9saWdodEZvcm1hdHRlcnMuanNcIik7XG5cbmNvbnN0IGRheVBlcmlvZEVudW0gPSB7XG4gIGFtOiBcImFtXCIsXG4gIHBtOiBcInBtXCIsXG4gIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gIG5vb246IFwibm9vblwiLFxuICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgYWZ0ZXJub29uOiBcImFmdGVybm9vblwiLFxuICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgbmlnaHQ6IFwibmlnaHRcIixcbn07XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8IE1pbGxpc2Vjb25kcyBpbiBkYXkgICAgICAgICAgICB8XG4gKiB8ICBiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICB8ICBCICB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICB8XG4gKiB8ICBjICB8IFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrICB8ICBDKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBlICB8IExvY2FsIGRheSBvZiB3ZWVrICAgICAgICAgICAgICB8ICBFICB8IERheSBvZiB3ZWVrICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBmICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBGKiB8IERheSBvZiB3ZWVrIGluIG1vbnRoICAgICAgICAgICB8XG4gKiB8ICBnKiB8IE1vZGlmaWVkIEp1bGlhbiBkYXkgICAgICAgICAgICB8ICBHICB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBpISB8IElTTyBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgICB8ICBJISB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICB8XG4gKiB8ICBqKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8ICBKKiB8IExvY2FsaXplZCBob3VyIHcvbyBkYXkgcGVyaW9kICB8XG4gKiB8ICBrICB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICB8ICBLICB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBsKiB8IChkZXByZWNhdGVkKSAgICAgICAgICAgICAgICAgICB8ICBMICB8IFN0YW5kLWFsb25lIG1vbnRoICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBuICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBOICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBvISB8IE9yZGluYWwgbnVtYmVyIG1vZGlmaWVyICAgICAgICB8ICBPICB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICB8XG4gKiB8ICBwISB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICB8ICBQISB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICB8XG4gKiB8ICBxICB8IFN0YW5kLWFsb25lIHF1YXJ0ZXIgICAgICAgICAgICB8ICBRICB8IFF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICByKiB8IFJlbGF0ZWQgR3JlZ29yaWFuIHllYXIgICAgICAgICB8ICBSISB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB0ISB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICB8ICBUISB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICB8XG4gKiB8ICB1ICB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICB8ICBVKiB8IEN5Y2xpYyB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICB2KiB8IFRpbWV6b25lIChnZW5lcmljIG5vbi1sb2NhdC4pICB8ICBWKiB8IFRpbWV6b25lIChsb2NhdGlvbikgICAgICAgICAgICB8XG4gKiB8ICB3ICB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICB8ICBXKiB8IFdlZWsgb2YgbW9udGggICAgICAgICAgICAgICAgICB8XG4gKiB8ICB4ICB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICB8ICBYICB8IFRpbWV6b25lIChJU08tODYwMSkgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICB8XG4gKiB8ICB6ICB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSB8ICBaKiB8IFRpbWV6b25lIChhbGlhc2VzKSAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICEgYXJlIG5vbi1zdGFuZGFyZCwgYnV0IGltcGxlbWVudGVkIGJ5IGRhdGUtZm5zOlxuICogLSBgb2AgbW9kaWZpZXMgdGhlIHByZXZpb3VzIHRva2VuIHRvIHR1cm4gaXQgaW50byBhbiBvcmRpbmFsIChzZWUgYGZvcm1hdGAgZG9jcylcbiAqIC0gYGlgIGlzIElTTyBkYXkgb2Ygd2Vlay4gRm9yIGBpYCBhbmQgYGlpYCBpcyByZXR1cm5zIG51bWVyaWMgSVNPIHdlZWsgZGF5cyxcbiAqICAgaS5lLiA3IGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICogLSBgSWAgaXMgSVNPIHdlZWsgb2YgeWVhciwgYXMgb3Bwb3NlZCB0byBgd2Agd2hpY2ggaXMgbG9jYWwgd2VlayBvZiB5ZWFyLlxuICogLSBgUmAgaXMgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIsIGFzIG9wcG9zZWQgdG8gYFlgIHdoaWNoIGlzIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiAgIGBSYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYElgIGFuZCBgaWBcbiAqICAgZm9yIHVuaXZlcnNhbCBJU08gd2Vlay1udW1iZXJpbmcgZGF0ZSwgd2hlcmVhc1xuICogICBgWWAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB3YCBhbmQgYGVgXG4gKiAgIGZvciB3ZWVrLW51bWJlcmluZyBkYXRlIHNwZWNpZmljIHRvIHRoZSBsb2NhbGUuXG4gKiAtIGBQYCBpcyBsb25nIGxvY2FsaXplZCBkYXRlIGZvcm1hdFxuICogLSBgcGAgaXMgbG9uZyBsb2NhbGl6ZWQgdGltZSBmb3JtYXRcbiAqL1xuXG5jb25zdCBmb3JtYXR0ZXJzID0gKGV4cG9ydHMuZm9ybWF0dGVycyA9IHtcbiAgLy8gRXJhXG4gIEc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBlcmEgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPiAwID8gMSA6IDA7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gQUQsIEJDXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICBjYXNlIFwiR0dHXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcImFiYnJldmlhdGVkXCIgfSk7XG4gICAgICAvLyBBLCBCXG4gICAgICBjYXNlIFwiR0dHR0dcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwibmFycm93XCIgfSk7XG4gICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdFxuICAgICAgY2FzZSBcIkdHR0dcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcIndpZGVcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gWWVhclxuICB5OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgLy8gT3JkaW5hbCBudW1iZXJcbiAgICBpZiAodG9rZW4gPT09IFwieW9cIikge1xuICAgICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgICBjb25zdCB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6IFwieWVhclwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy55KGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gIFk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzaWduZWRXZWVrWWVhciA9ICgwLCBfaW5kZXg1LmdldFdlZWtZZWFyKShkYXRlLCBvcHRpb25zKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHdlZWtZZWFyID0gc2lnbmVkV2Vla1llYXIgPiAwID8gc2lnbmVkV2Vla1llYXIgOiAxIC0gc2lnbmVkV2Vla1llYXI7XG5cbiAgICAvLyBUd28gZGlnaXQgeWVhclxuICAgIGlmICh0b2tlbiA9PT0gXCJZWVwiKSB7XG4gICAgICBjb25zdCB0d29EaWdpdFllYXIgPSB3ZWVrWWVhciAlIDEwMDtcbiAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHR3b0RpZ2l0WWVhciwgMik7XG4gICAgfVxuXG4gICAgLy8gT3JkaW5hbCBudW1iZXJcbiAgICBpZiAodG9rZW4gPT09IFwiWW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIod2Vla1llYXIsIHsgdW5pdDogXCJ5ZWFyXCIgfSk7XG4gICAgfVxuXG4gICAgLy8gUGFkZGluZ1xuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHdlZWtZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gIFI6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IGlzb1dlZWtZZWFyID0gKDAsIF9pbmRleDMuZ2V0SVNPV2Vla1llYXIpKGRhdGUpO1xuXG4gICAgLy8gUGFkZGluZ1xuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGlzb1dlZWtZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEV4dGVuZGVkIHllYXIuIFRoaXMgaXMgYSBzaW5nbGUgbnVtYmVyIGRlc2lnbmF0aW5nIHRoZSB5ZWFyIG9mIHRoaXMgY2FsZW5kYXIgc3lzdGVtLlxuICAvLyBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gYHlgIGFuZCBgdWAgbG9jYWxpemVycyBhcmUgQi5DLiB5ZWFyczpcbiAgLy8gfCBZZWFyIHwgYHlgIHwgYHVgIHxcbiAgLy8gfC0tLS0tLXwtLS0tLXwtLS0tLXxcbiAgLy8gfCBBQyAxIHwgICAxIHwgICAxIHxcbiAgLy8gfCBCQyAxIHwgICAxIHwgICAwIHxcbiAgLy8gfCBCQyAyIHwgICAyIHwgIC0xIHxcbiAgLy8gQWxzbyBgeXlgIGFsd2F5cyByZXR1cm5zIHRoZSBsYXN0IHR3byBkaWdpdHMgb2YgYSB5ZWFyLFxuICAvLyB3aGlsZSBgdXVgIHBhZHMgc2luZ2xlIGRpZ2l0IHllYXJzIHRvIDIgY2hhcmFjdGVycyBhbmQgcmV0dXJucyBvdGhlciB5ZWFycyB1bmNoYW5nZWQuXG4gIHU6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoeWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBRdWFydGVyXG4gIFE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJRXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSBcIlFRXCI6XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwiUW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwiUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcIlFRUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcIlFRUVFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyXG4gIHE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwicW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwicXFxXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcInFxcXFxXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcInFxcXFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBNb250aFxuICBNOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgIGNhc2UgXCJNTVwiOlxuICAgICAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMuTShkYXRlLCB0b2tlbik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIG1vbnRoXG4gIEw6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShtb250aCArIDEsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aFxuICAgICAgY2FzZSBcIkxvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKG1vbnRoICsgMSwgeyB1bml0OiBcIm1vbnRoXCIgfSk7XG4gICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWNcbiAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKLCBGLCAuLi4sIERcbiAgICAgIGNhc2UgXCJMTExMTFwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlclxuICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBMb2NhbCB3ZWVrIG9mIHllYXJcbiAgdzogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHdlZWsgPSAoMCwgX2luZGV4NC5nZXRXZWVrKShkYXRlLCBvcHRpb25zKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJ3b1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrLCB7IHVuaXQ6IFwid2Vla1wiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHdlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSVNPIHdlZWsgb2YgeWVhclxuICBJOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaXNvV2VlayA9ICgwLCBfaW5kZXgyLmdldElTT1dlZWspKGRhdGUpO1xuXG4gICAgaWYgKHRva2VuID09PSBcIklvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGlzb1dlZWssIHsgdW5pdDogXCJ3ZWVrXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoaXNvV2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwiZG9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXREYXRlKCksIHsgdW5pdDogXCJkYXRlXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLmQoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIERheSBvZiB5ZWFyXG4gIEQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBkYXlPZlllYXIgPSAoMCwgX2luZGV4LmdldERheU9mWWVhcikoZGF0ZSk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwiRG9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF5T2ZZZWFyLCB7IHVuaXQ6IFwiZGF5T2ZZZWFyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoZGF5T2ZZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIERheSBvZiB3ZWVrXG4gIEU6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJFRVwiOlxuICAgICAgY2FzZSBcIkVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcIkVFRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJFRUVFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJFRUVFXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIExvY2FsIGRheSBvZiB3ZWVrXG4gIGU6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChOdGggZGF5IG9mIHdlZWsgd2l0aCBjdXJyZW50IGxvY2FsZSBvciB3ZWVrU3RhcnRzT24pXG4gICAgICBjYXNlIFwiZVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGxvY2FsRGF5T2ZXZWVrKTtcbiAgICAgIC8vIFBhZGRlZCBudW1lcmljYWwgdmFsdWVcbiAgICAgIGNhc2UgXCJlZVwiOlxuICAgICAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShsb2NhbERheU9mV2VlaywgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJlb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImVlZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJlZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJlZWVlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrXG4gIGM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChzYW1lIGFzIGluIGBlYClcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuICAgICAgY2FzZSBcImNjXCI6XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGxvY2FsRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgN3RoXG4gICAgICBjYXNlIFwiY29cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobG9jYWxEYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJjY2NjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiY2NjY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBJU08gZGF5IG9mIHdlZWtcbiAgaTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7XG4gICAgY29uc3QgaXNvRGF5T2ZXZWVrID0gZGF5T2ZXZWVrID09PSAwID8gNyA6IGRheU9mV2VlaztcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAyXG4gICAgICBjYXNlIFwiaVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGlzb0RheU9mV2Vlayk7XG4gICAgICAvLyAwMlxuICAgICAgY2FzZSBcImlpXCI6XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGlzb0RheU9mV2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgICAgIC8vIDJuZFxuICAgICAgY2FzZSBcImlvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGlzb0RheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImlpaWlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImlpaWlcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQU0gb3IgUE1cbiAgYTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGNvbnN0IGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICBjYXNlIFwiYWFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplXG4gICAgICAgICAgLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY2FzZSBcImFhYWFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcImFhYWFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQU0sIFBNLCBtaWRuaWdodCwgbm9vblxuICBiOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgbGV0IGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICBpZiAoaG91cnMgPT09IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA9PT0gMCkge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5taWRuaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gaG91cnMgLyAxMiA+PSAxID8gXCJwbVwiIDogXCJhbVwiO1xuICAgIH1cblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJiXCI6XG4gICAgICBjYXNlIFwiYmJcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplXG4gICAgICAgICAgLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY2FzZSBcImJiYmJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcImJiYmJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gaW4gdGhlIG1vcm5pbmcsIGluIHRoZSBhZnRlcm5vb24sIGluIHRoZSBldmVuaW5nLCBhdCBuaWdodFxuICBCOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgbGV0IGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICBpZiAoaG91cnMgPj0gMTcpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0uZXZlbmluZztcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmFmdGVybm9vbjtcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDQpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubW9ybmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5uaWdodDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiQlwiOlxuICAgICAgY2FzZSBcIkJCXCI6XG4gICAgICBjYXNlIFwiQkJCXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiQkJCQkJcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiQkJCQlwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBIb3VyIFsxLTEyXVxuICBoOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcImhvXCIpIHtcbiAgICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyO1xuICAgICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDEyO1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLmgoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIEhvdXIgWzAtMjNdXG4gIEg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwiSG9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRIb3VycygpLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5IKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTExXVxuICBLOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJLb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShob3VycywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBIb3VyIFsxLTI0XVxuICBrOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgbGV0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAyNDtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJrb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShob3VycywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaW51dGVcbiAgbTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJtb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldE1pbnV0ZXMoKSwgeyB1bml0OiBcIm1pbnV0ZVwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5tKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBTZWNvbmRcbiAgczogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJzb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldFNlY29uZHMoKSwgeyB1bml0OiBcInNlY29uZFwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLlMoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBhbHdheXMgYCdaJ2ApXG4gIFg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBpZiAodGltZXpvbmVPZmZzZXQgPT09IDApIHtcbiAgICAgIHJldHVybiBcIlpcIjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlc1xuICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYYFxuICAgICAgY2FzZSBcIlhYWFhcIjpcbiAgICAgIGNhc2UgXCJYWFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTtcblxuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgWFhYYFxuICAgICAgY2FzZSBcIlhYWFhYXCI6XG4gICAgICBjYXNlIFwiWFhYXCI6IC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBgJyswMDowMCdgIG9yIGVxdWl2YWxlbnQpXG4gIHg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlc1xuICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4YFxuICAgICAgY2FzZSBcInh4eHhcIjpcbiAgICAgIGNhc2UgXCJ4eFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTtcblxuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHh4YFxuICAgICAgY2FzZSBcInh4eHh4XCI6XG4gICAgICBjYXNlIFwieHh4XCI6IC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRpbWV6b25lIChHTVQpXG4gIE86IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBTaG9ydFxuICAgICAgY2FzZSBcIk9cIjpcbiAgICAgIGNhc2UgXCJPT1wiOlxuICAgICAgY2FzZSBcIk9PT1wiOlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lU2hvcnQodGltZXpvbmVPZmZzZXQsIFwiOlwiKTtcbiAgICAgIC8vIExvbmdcbiAgICAgIGNhc2UgXCJPT09PXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXRpb24pXG4gIHo6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBTaG9ydFxuICAgICAgY2FzZSBcInpcIjpcbiAgICAgIGNhc2UgXCJ6elwiOlxuICAgICAgY2FzZSBcInp6elwiOlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lU2hvcnQodGltZXpvbmVPZmZzZXQsIFwiOlwiKTtcbiAgICAgIC8vIExvbmdcbiAgICAgIGNhc2UgXCJ6enp6XCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJHTVRcIiArIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgfVxuICB9LFxuXG4gIC8vIFNlY29uZHMgdGltZXN0YW1wXG4gIHQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gTWF0aC50cnVuYyhkYXRlLmdldFRpbWUoKSAvIDEwMDApO1xuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gIFQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gZGF0ZS5nZXRUaW1lKCk7XG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykodGltZXN0YW1wLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxufSk7XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSBcIlwiKSB7XG4gIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTtcbiAgY29uc3QgbWludXRlcyA9IGFic09mZnNldCAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHNpZ24gKyBTdHJpbmcoaG91cnMpICsgZGVsaW1pdGVyICsgKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShtaW51dGVzLCAyKVxuICApO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXMob2Zmc2V0LCBkZWxpbWl0ZXIpIHtcbiAgaWYgKG9mZnNldCAlIDYwID09PSAwKSB7XG4gICAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICAgIHJldHVybiBzaWduICsgKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShNYXRoLmFicyhvZmZzZXQpIC8gNjAsIDIpO1xuICB9XG4gIHJldHVybiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRlbGltaXRlcik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGVsaW1pdGVyID0gXCJcIikge1xuICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gIGNvbnN0IGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7XG4gIGNvbnN0IGhvdXJzID0gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKSwgMik7XG4gIGNvbnN0IG1pbnV0ZXMgPSAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGFic09mZnNldCAlIDYwLCAyKTtcbiAgcmV0dXJuIHNpZ24gKyBob3VycyArIGRlbGltaXRlciArIG1pbnV0ZXM7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMubGlnaHRGb3JtYXR0ZXJzID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi9hZGRMZWFkaW5nWmVyb3MuanNcIik7XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICovXG5cbmNvbnN0IGxpZ2h0Rm9ybWF0dGVycyA9IChleHBvcnRzLmxpZ2h0Rm9ybWF0dGVycyA9IHtcbiAgLy8gWWVhclxuICB5KGRhdGUsIHRva2VuKSB7XG4gICAgLy8gRnJvbSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LTMxL3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0Zvcm1hdF90b2tlbnNcbiAgICAvLyB8IFllYXIgICAgIHwgICAgIHkgfCB5eSB8ICAgeXl5IHwgIHl5eXkgfCB5eXl5eSB8XG4gICAgLy8gfC0tLS0tLS0tLS18LS0tLS0tLXwtLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfFxuICAgIC8vIHwgQUQgMSAgICAgfCAgICAgMSB8IDAxIHwgICAwMDEgfCAgMDAwMSB8IDAwMDAxIHxcbiAgICAvLyB8IEFEIDEyICAgIHwgICAgMTIgfCAxMiB8ICAgMDEyIHwgIDAwMTIgfCAwMDAxMiB8XG4gICAgLy8gfCBBRCAxMjMgICB8ICAgMTIzIHwgMjMgfCAgIDEyMyB8ICAwMTIzIHwgMDAxMjMgfFxuICAgIC8vIHwgQUQgMTIzNCAgfCAgMTIzNCB8IDM0IHwgIDEyMzQgfCAgMTIzNCB8IDAxMjM0IHxcbiAgICAvLyB8IEFEIDEyMzQ1IHwgMTIzNDUgfCA0NSB8IDEyMzQ1IHwgMTIzNDUgfCAxMjM0NSB8XG5cbiAgICBjb25zdCBzaWduZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgY29uc3QgeWVhciA9IHNpZ25lZFllYXIgPiAwID8gc2lnbmVkWWVhciA6IDEgLSBzaWduZWRZZWFyO1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoXG4gICAgICB0b2tlbiA9PT0gXCJ5eVwiID8geWVhciAlIDEwMCA6IHllYXIsXG4gICAgICB0b2tlbi5sZW5ndGgsXG4gICAgKTtcbiAgfSxcblxuICAvLyBNb250aFxuICBNKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgcmV0dXJuIHRva2VuID09PSBcIk1cIlxuICAgICAgPyBTdHJpbmcobW9udGggKyAxKVxuICAgICAgOiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykobW9udGggKyAxLCAyKTtcbiAgfSxcblxuICAvLyBEYXkgb2YgdGhlIG1vbnRoXG4gIGQoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKGRhdGUuZ2V0RGF0ZSgpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGEoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXRlLmdldEhvdXJzKCkgLyAxMiA+PSAxID8gXCJwbVwiIDogXCJhbVwiO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImFcIjpcbiAgICAgIGNhc2UgXCJhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgICBjYXNlIFwiYWFhYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZVswXTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlID09PSBcImFtXCIgPyBcImEubS5cIiA6IFwicC5tLlwiO1xuICAgIH1cbiAgfSxcblxuICAvLyBIb3VyIFsxLTEyXVxuICBoKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShcbiAgICAgIGRhdGUuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLFxuICAgICAgdG9rZW4ubGVuZ3RoLFxuICAgICk7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoZGF0ZS5nZXRIb3VycygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1pbnV0ZVxuICBtKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShkYXRlLmdldE1pbnV0ZXMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBTZWNvbmRcbiAgcyhkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoZGF0ZS5nZXRTZWNvbmRzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFMoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBudW1iZXJPZkRpZ2l0cyA9IHRva2VuLmxlbmd0aDtcbiAgICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYyhcbiAgICAgIG1pbGxpc2Vjb25kcyAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpLFxuICAgICk7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShmcmFjdGlvbmFsU2Vjb25kcywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmxvbmdGb3JtYXR0ZXJzID0gdm9pZCAwO1xuXG5jb25zdCBkYXRlTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgXCJQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICBjYXNlIFwiUFBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICBjYXNlIFwiUFBQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgIGNhc2UgXCJQUFBQXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gIH1cbn07XG5cbmNvbnN0IHRpbWVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcpID0+IHtcbiAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgY2FzZSBcInBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJzaG9ydFwiIH0pO1xuICAgIGNhc2UgXCJwcFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgIGNhc2UgXCJwcHBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJsb25nXCIgfSk7XG4gICAgY2FzZSBcInBwcHBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcImZ1bGxcIiB9KTtcbiAgfVxufTtcblxuY29uc3QgZGF0ZVRpbWVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcpID0+IHtcbiAgY29uc3QgbWF0Y2hSZXN1bHQgPSBwYXR0ZXJuLm1hdGNoKC8oUCspKHArKT8vKSB8fCBbXTtcbiAgY29uc3QgZGF0ZVBhdHRlcm4gPSBtYXRjaFJlc3VsdFsxXTtcbiAgY29uc3QgdGltZVBhdHRlcm4gPSBtYXRjaFJlc3VsdFsyXTtcblxuICBpZiAoIXRpbWVQYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGVMb25nRm9ybWF0dGVyKHBhdHRlcm4sIGZvcm1hdExvbmcpO1xuICB9XG5cbiAgbGV0IGRhdGVUaW1lRm9ybWF0O1xuXG4gIHN3aXRjaCAoZGF0ZVBhdHRlcm4pIHtcbiAgICBjYXNlIFwiUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBQXCI6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJsb25nXCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBQUFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBkYXRlVGltZUZvcm1hdFxuICAgIC5yZXBsYWNlKFwie3tkYXRlfX1cIiwgZGF0ZUxvbmdGb3JtYXR0ZXIoZGF0ZVBhdHRlcm4sIGZvcm1hdExvbmcpKVxuICAgIC5yZXBsYWNlKFwie3t0aW1lfX1cIiwgdGltZUxvbmdGb3JtYXR0ZXIodGltZVBhdHRlcm4sIGZvcm1hdExvbmcpKTtcbn07XG5cbmNvbnN0IGxvbmdGb3JtYXR0ZXJzID0gKGV4cG9ydHMubG9uZ0Zvcm1hdHRlcnMgPSB7XG4gIHA6IHRpbWVMb25nRm9ybWF0dGVyLFxuICBQOiBkYXRlVGltZUxvbmdGb3JtYXR0ZXIsXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzID0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEdvb2dsZSBDaHJvbWUgYXMgb2YgNjcuMC4zMzk2Ljg3IGludHJvZHVjZWQgdGltZXpvbmVzIHdpdGggb2Zmc2V0IHRoYXQgaW5jbHVkZXMgc2Vjb25kcy5cbiAqIFRoZXkgdXN1YWxseSBhcHBlYXIgZm9yIGRhdGVzIHRoYXQgZGVub3RlIHRpbWUgYmVmb3JlIHRoZSB0aW1lem9uZXMgd2VyZSBpbnRyb2R1Y2VkXG4gKiAoZS5nLiBmb3IgJ0V1cm9wZS9QcmFndWUnIHRpbWV6b25lIHRoZSBvZmZzZXQgaXMgR01UKzAwOjU3OjQ0IGJlZm9yZSAxIE9jdG9iZXIgMTg5MVxuICogYW5kIEdNVCswMTowMDowMCBhZnRlciB0aGF0IGRhdGUpXG4gKlxuICogRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIHRoZSBvZmZzZXQgaW4gbWludXRlcyBhbmQgd291bGQgcmV0dXJuIDU3IGZvciB0aGUgZXhhbXBsZSBhYm92ZSxcbiAqIHdoaWNoIHdvdWxkIGxlYWQgdG8gaW5jb3JyZWN0IGNhbGN1bGF0aW9ucy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRpbWV6b25lIG9mZnNldCBpbiBtaWxsaXNlY29uZHMgdGhhdCB0YWtlcyBzZWNvbmRzIGluIGFjY291bnQuXG4gKi9cbmZ1bmN0aW9uIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgdXRjRGF0ZSA9IG5ldyBEYXRlKFxuICAgIERhdGUuVVRDKFxuICAgICAgX2RhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIF9kYXRlLmdldE1vbnRoKCksXG4gICAgICBfZGF0ZS5nZXREYXRlKCksXG4gICAgICBfZGF0ZS5nZXRIb3VycygpLFxuICAgICAgX2RhdGUuZ2V0TWludXRlcygpLFxuICAgICAgX2RhdGUuZ2V0U2Vjb25kcygpLFxuICAgICAgX2RhdGUuZ2V0TWlsbGlzZWNvbmRzKCksXG4gICAgKSxcbiAgKTtcbiAgdXRjRGF0ZS5zZXRVVENGdWxsWWVhcihfZGF0ZS5nZXRGdWxsWWVhcigpKTtcbiAgcmV0dXJuICtkYXRlIC0gK3V0Y0RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbiA9IGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW47XG5leHBvcnRzLmlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbiA9IGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbjtcbmV4cG9ydHMud2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvciA9IHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3I7XG5jb25zdCBkYXlPZlllYXJUb2tlblJFID0gL15EKyQvO1xuY29uc3Qgd2Vla1llYXJUb2tlblJFID0gL15ZKyQvO1xuXG5jb25zdCB0aHJvd1Rva2VucyA9IFtcIkRcIiwgXCJERFwiLCBcIllZXCIsIFwiWVlZWVwiXTtcblxuZnVuY3Rpb24gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gZGF5T2ZZZWFyVG9rZW5SRS50ZXN0KHRva2VuKTtcbn1cblxuZnVuY3Rpb24gaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKHRva2VuKSB7XG4gIHJldHVybiB3ZWVrWWVhclRva2VuUkUudGVzdCh0b2tlbik7XG59XG5cbmZ1bmN0aW9uIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdCwgaW5wdXQpIHtcbiAgY29uc3QgX21lc3NhZ2UgPSBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KTtcbiAgY29uc29sZS53YXJuKF9tZXNzYWdlKTtcbiAgaWYgKHRocm93VG9rZW5zLmluY2x1ZGVzKHRva2VuKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoX21lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGNvbnN0IHN1YmplY3QgPSB0b2tlblswXSA9PT0gXCJZXCIgPyBcInllYXJzXCIgOiBcImRheXMgb2YgdGhlIG1vbnRoXCI7XG4gIHJldHVybiBgVXNlIFxcYCR7dG9rZW4udG9Mb3dlckNhc2UoKX1cXGAgaW5zdGVhZCBvZiBcXGAke3Rva2VufVxcYCAoaW4gXFxgJHtmb3JtYXR9XFxgKSBmb3IgZm9ybWF0dGluZyAke3N1YmplY3R9IHRvIHRoZSBpbnB1dCBcXGAke2lucHV0fVxcYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kYDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGREYXlzID0gYWRkRGF5cztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkRGF5c1xuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgZGF5cyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5cyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMTAgZGF5cyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkRGF5cyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMTApXG4gKiAvLz0+IFRodSBTZXAgMTEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBhZGREYXlzKGRhdGUsIGFtb3VudCkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgaWYgKGlzTmFOKGFtb3VudCkpIHJldHVybiAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCBOYU4pO1xuICBpZiAoIWFtb3VudCkge1xuICAgIC8vIElmIDAgZGF5cywgbm8tb3AgdG8gYXZvaWQgY2hhbmdpbmcgdGltZXMgaW4gdGhlIGhvdXIgYmVmb3JlIGVuZCBvZiBEU1RcbiAgICByZXR1cm4gX2RhdGU7XG4gIH1cbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBhbW91bnQpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkSG91cnMgPSBhZGRIb3VycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRNaWxsaXNlY29uZHMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRIb3Vyc1xuICogQGNhdGVnb3J5IEhvdXIgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgaG91cnMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGhvdXJzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAyIGhvdXJzIHRvIDEwIEp1bHkgMjAxNCAyMzowMDowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZEhvdXJzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAyMywgMCksIDIpXG4gKiAvLz0+IEZyaSBKdWwgMTEgMjAxNCAwMTowMDowMFxuICovXG5mdW5jdGlvbiBhZGRIb3VycyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkTWlsbGlzZWNvbmRzKShkYXRlLCBhbW91bnQgKiBfaW5kZXgyLm1pbGxpc2Vjb25kc0luSG91cik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkTWlsbGlzZWNvbmRzID0gYWRkTWlsbGlzZWNvbmRzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRNaWxsaXNlY29uZHNcbiAqIEBjYXRlZ29yeSBNaWxsaXNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbWlsbGlzZWNvbmRzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA3NTAgbWlsbGlzZWNvbmRzIHRvIDEwIEp1bHkgMjAxNCAxMjo0NTozMC4wMDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRNaWxsaXNlY29uZHMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCA0NSwgMzAsIDApLCA3NTApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjo0NTozMC43NTBcbiAqL1xuZnVuY3Rpb24gYWRkTWlsbGlzZWNvbmRzKGRhdGUsIGFtb3VudCkge1xuICBjb25zdCB0aW1lc3RhbXAgPSArKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICByZXR1cm4gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgdGltZXN0YW1wICsgYW1vdW50KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRNaW51dGVzID0gYWRkTWludXRlcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRNaWxsaXNlY29uZHMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRNaW51dGVzXG4gKiBAY2F0ZWdvcnkgTWludXRlIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaW51dGVzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbnV0ZXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBtaW51dGVzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaW51dGVzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAzMCBtaW51dGVzIHRvIDEwIEp1bHkgMjAxNCAxMjowMDowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1pbnV0ZXMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCAwKSwgMzApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjozMDowMFxuICovXG5mdW5jdGlvbiBhZGRNaW51dGVzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRNaWxsaXNlY29uZHMpKFxuICAgIGRhdGUsXG4gICAgYW1vdW50ICogX2luZGV4Mi5taWxsaXNlY29uZHNJbk1pbnV0ZSxcbiAgKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRNb250aHMgPSBhZGRNb250aHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZE1vbnRoc1xuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtb250aHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbW9udGhzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgbW9udGhzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtb250aHMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDUgbW9udGhzIHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRNb250aHMobmV3IERhdGUoMjAxNCwgOCwgMSksIDUpXG4gKiAvLz0+IFN1biBGZWIgMDEgMjAxNSAwMDowMDowMFxuICpcbiAqIC8vIEFkZCBvbmUgbW9udGggdG8gMzAgSmFudWFyeSAyMDIzOlxuICogY29uc3QgcmVzdWx0ID0gYWRkTW9udGhzKG5ldyBEYXRlKDIwMjMsIDAsIDMwKSwgMSlcbiAqIC8vPT4gVHVlIEZlYiAyOCAyMDIzIDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIGFkZE1vbnRocyhkYXRlLCBhbW91bnQpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGlmIChpc05hTihhbW91bnQpKSByZXR1cm4gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgTmFOKTtcbiAgaWYgKCFhbW91bnQpIHtcbiAgICAvLyBJZiAwIG1vbnRocywgbm8tb3AgdG8gYXZvaWQgY2hhbmdpbmcgdGltZXMgaW4gdGhlIGhvdXIgYmVmb3JlIGVuZCBvZiBEU1RcbiAgICByZXR1cm4gX2RhdGU7XG4gIH1cbiAgY29uc3QgZGF5T2ZNb250aCA9IF9kYXRlLmdldERhdGUoKTtcblxuICAvLyBUaGUgSlMgRGF0ZSBvYmplY3Qgc3VwcG9ydHMgZGF0ZSBtYXRoIGJ5IGFjY2VwdGluZyBvdXQtb2YtYm91bmRzIHZhbHVlcyBmb3JcbiAgLy8gbW9udGgsIGRheSwgZXRjLiBGb3IgZXhhbXBsZSwgbmV3IERhdGUoMjAyMCwgMCwgMCkgcmV0dXJucyAzMSBEZWMgMjAxOSBhbmRcbiAgLy8gbmV3IERhdGUoMjAyMCwgMTMsIDEpIHJldHVybnMgMSBGZWIgMjAyMS4gIFRoaXMgaXMgKmFsbW9zdCogdGhlIGJlaGF2aW9yIHdlXG4gIC8vIHdhbnQgZXhjZXB0IHRoYXQgZGF0ZXMgd2lsbCB3cmFwIGFyb3VuZCB0aGUgZW5kIG9mIGEgbW9udGgsIG1lYW5pbmcgdGhhdFxuICAvLyBuZXcgRGF0ZSgyMDIwLCAxMywgMzEpIHdpbGwgcmV0dXJuIDMgTWFyIDIwMjEgbm90IDI4IEZlYiAyMDIxIGFzIGRlc2lyZWQuIFNvXG4gIC8vIHdlJ2xsIGRlZmF1bHQgdG8gdGhlIGVuZCBvZiB0aGUgZGVzaXJlZCBtb250aCBieSBhZGRpbmcgMSB0byB0aGUgZGVzaXJlZFxuICAvLyBtb250aCBhbmQgdXNpbmcgYSBkYXRlIG9mIDAgdG8gYmFjayB1cCBvbmUgZGF5IHRvIHRoZSBlbmQgb2YgdGhlIGRlc2lyZWRcbiAgLy8gbW9udGguXG4gIGNvbnN0IGVuZE9mRGVzaXJlZE1vbnRoID0gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgX2RhdGUuZ2V0VGltZSgpKTtcbiAgZW5kT2ZEZXNpcmVkTW9udGguc2V0TW9udGgoX2RhdGUuZ2V0TW9udGgoKSArIGFtb3VudCArIDEsIDApO1xuICBjb25zdCBkYXlzSW5Nb250aCA9IGVuZE9mRGVzaXJlZE1vbnRoLmdldERhdGUoKTtcbiAgaWYgKGRheU9mTW9udGggPj0gZGF5c0luTW9udGgpIHtcbiAgICAvLyBJZiB3ZSdyZSBhbHJlYWR5IGF0IHRoZSBlbmQgb2YgdGhlIG1vbnRoLCB0aGVuIHRoaXMgaXMgdGhlIGNvcnJlY3QgZGF0ZVxuICAgIC8vIGFuZCB3ZSdyZSBkb25lLlxuICAgIHJldHVybiBlbmRPZkRlc2lyZWRNb250aDtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIHdlIG5vdyBrbm93IHRoYXQgc2V0dGluZyB0aGUgb3JpZ2luYWwgZGF5LW9mLW1vbnRoIHZhbHVlIHdvbid0XG4gICAgLy8gY2F1c2UgYW4gb3ZlcmZsb3csIHNvIHNldCB0aGUgZGVzaXJlZCBkYXktb2YtbW9udGguIE5vdGUgdGhhdCB3ZSBjYW4ndFxuICAgIC8vIGp1c3Qgc2V0IHRoZSBkYXRlIG9mIGBlbmRPZkRlc2lyZWRNb250aGAgYmVjYXVzZSB0aGF0IG9iamVjdCBtYXkgaGF2ZSBoYWRcbiAgICAvLyBpdHMgdGltZSBjaGFuZ2VkIGluIHRoZSB1bnVzdWFsIGNhc2Ugd2hlcmUgd2hlcmUgYSBEU1QgdHJhbnNpdGlvbiB3YXMgb25cbiAgICAvLyB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoIGFuZCBpdHMgbG9jYWwgdGltZSB3YXMgaW4gdGhlIGhvdXIgc2tpcHBlZCBvclxuICAgIC8vIHJlcGVhdGVkIG5leHQgdG8gYSBEU1QgdHJhbnNpdGlvbi4gIFNvIHdlIHVzZSBgZGF0ZWAgaW5zdGVhZCB3aGljaCBpc1xuICAgIC8vIGd1YXJhbnRlZWQgdG8gc3RpbGwgaGF2ZSB0aGUgb3JpZ2luYWwgdGltZS5cbiAgICBfZGF0ZS5zZXRGdWxsWWVhcihcbiAgICAgIGVuZE9mRGVzaXJlZE1vbnRoLmdldEZ1bGxZZWFyKCksXG4gICAgICBlbmRPZkRlc2lyZWRNb250aC5nZXRNb250aCgpLFxuICAgICAgZGF5T2ZNb250aCxcbiAgICApO1xuICAgIHJldHVybiBfZGF0ZTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZFF1YXJ0ZXJzID0gYWRkUXVhcnRlcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTW9udGhzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZFF1YXJ0ZXJzXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhciBxdWFydGVycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFyIHF1YXJ0ZXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgcXVhcnRlcnMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHF1YXJ0ZXJzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAxIHF1YXJ0ZXIgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFF1YXJ0ZXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAxKVxuICogLy89PiBNb24gRGVjIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkUXVhcnRlcnMoZGF0ZSwgYW1vdW50KSB7XG4gIGNvbnN0IG1vbnRocyA9IGFtb3VudCAqIDM7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZE1vbnRocykoZGF0ZSwgbW9udGhzKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRTZWNvbmRzID0gYWRkU2Vjb25kcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRNaWxsaXNlY29uZHMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkU2Vjb25kc1xuICogQGNhdGVnb3J5IFNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2Ygc2Vjb25kcyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgc2Vjb25kcyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMzAgc2Vjb25kcyB0byAxMCBKdWx5IDIwMTQgMTI6NDU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRTZWNvbmRzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAxMiwgNDUsIDApLCAzMClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjMwXG4gKi9cbmZ1bmN0aW9uIGFkZFNlY29uZHMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZE1pbGxpc2Vjb25kcykoZGF0ZSwgYW1vdW50ICogMTAwMCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkV2Vla3MgPSBhZGRXZWVrcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGREYXlzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZFdlZWtzXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2Vla3MgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHdlZWtzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSB3ZWVrcyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgNCB3ZWVrcyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkV2Vla3MobmV3IERhdGUoMjAxNCwgOCwgMSksIDQpXG4gKiAvLz0+IE1vbiBTZXAgMjkgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBhZGRXZWVrcyhkYXRlLCBhbW91bnQpIHtcbiAgY29uc3QgZGF5cyA9IGFtb3VudCAqIDc7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZERheXMpKGRhdGUsIGRheXMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZFllYXJzID0gYWRkWWVhcnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTW9udGhzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZFllYXJzXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhcnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhcnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiB5ZWFycyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgeWVhcnMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDUgeWVhcnMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFllYXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA1KVxuICogLy89PiBTdW4gU2VwIDAxIDIwMTkgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkWWVhcnMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZE1vbnRocykoZGF0ZSwgYW1vdW50ICogMTIpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNlY29uZHNJblllYXIgPVxuICBleHBvcnRzLnNlY29uZHNJbldlZWsgPVxuICBleHBvcnRzLnNlY29uZHNJblF1YXJ0ZXIgPVxuICBleHBvcnRzLnNlY29uZHNJbk1vbnRoID1cbiAgZXhwb3J0cy5zZWNvbmRzSW5NaW51dGUgPVxuICBleHBvcnRzLnNlY29uZHNJbkhvdXIgPVxuICBleHBvcnRzLnNlY29uZHNJbkRheSA9XG4gIGV4cG9ydHMucXVhcnRlcnNJblllYXIgPVxuICBleHBvcnRzLm1vbnRoc0luWWVhciA9XG4gIGV4cG9ydHMubW9udGhzSW5RdWFydGVyID1cbiAgZXhwb3J0cy5taW51dGVzSW5ZZWFyID1cbiAgZXhwb3J0cy5taW51dGVzSW5Nb250aCA9XG4gIGV4cG9ydHMubWludXRlc0luSG91ciA9XG4gIGV4cG9ydHMubWludXRlc0luRGF5ID1cbiAgZXhwb3J0cy5taW5UaW1lID1cbiAgZXhwb3J0cy5taWxsaXNlY29uZHNJbldlZWsgPVxuICBleHBvcnRzLm1pbGxpc2Vjb25kc0luU2Vjb25kID1cbiAgZXhwb3J0cy5taWxsaXNlY29uZHNJbk1pbnV0ZSA9XG4gIGV4cG9ydHMubWlsbGlzZWNvbmRzSW5Ib3VyID1cbiAgZXhwb3J0cy5taWxsaXNlY29uZHNJbkRheSA9XG4gIGV4cG9ydHMubWF4VGltZSA9XG4gIGV4cG9ydHMuZGF5c0luWWVhciA9XG4gIGV4cG9ydHMuZGF5c0luV2VlayA9XG4gICAgdm9pZCAwOyAvKipcbiAqIEBtb2R1bGUgY29uc3RhbnRzXG4gKiBAc3VtbWFyeSBVc2VmdWwgY29uc3RhbnRzXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbGxlY3Rpb24gb2YgdXNlZnVsIGRhdGUgY29uc3RhbnRzLlxuICpcbiAqIFRoZSBjb25zdGFudHMgY291bGQgYmUgaW1wb3J0ZWQgZnJvbSBgZGF0ZS1mbnMvY29uc3RhbnRzYDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgbWF4VGltZSwgbWluVGltZSB9IGZyb20gXCJkYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBmdW5jdGlvbiBpc0FsbG93ZWRUaW1lKHRpbWUpIHtcbiAqICAgcmV0dXJuIHRpbWUgPD0gbWF4VGltZSAmJiB0aW1lID49IG1pblRpbWU7XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgZGF5c0luV2Vla1xuICogQHN1bW1hcnkgRGF5cyBpbiAxIHdlZWsuXG4gKi9cbmNvbnN0IGRheXNJbldlZWsgPSAoZXhwb3J0cy5kYXlzSW5XZWVrID0gNyk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBkYXlzSW5ZZWFyXG4gKiBAc3VtbWFyeSBEYXlzIGluIDEgeWVhci5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEhvdyBtYW55IGRheXMgaW4gYSB5ZWFyLlxuICpcbiAqIE9uZSB5ZWFycyBlcXVhbHMgMzY1LjI0MjUgZGF5cyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6XG4gKlxuICogPiBMZWFwIHllYXIgb2NjdXJlcyBldmVyeSA0IHllYXJzLCBleGNlcHQgZm9yIHllYXJzIHRoYXQgYXJlIGRpdmlzYWJsZSBieSAxMDAgYW5kIG5vdCBkaXZpc2FibGUgYnkgNDAwLlxuICogPiAxIG1lYW4geWVhciA9ICgzNjUrMS80LTEvMTAwKzEvNDAwKSBkYXlzID0gMzY1LjI0MjUgZGF5c1xuICovXG5jb25zdCBkYXlzSW5ZZWFyID0gKGV4cG9ydHMuZGF5c0luWWVhciA9IDM2NS4yNDI1KTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1heFRpbWVcbiAqIEBzdW1tYXJ5IE1heGltdW0gYWxsb3dlZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBtYXhUaW1lIH0gZnJvbSBcImRhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGNvbnN0IGlzVmFsaWQgPSA4NjQwMDAwMDAwMDAwMDAxIDw9IG1heFRpbWU7XG4gKiAvLz0+IGZhbHNlXG4gKlxuICogbmV3IERhdGUoODY0MDAwMDAwMDAwMDAwMSk7XG4gKiAvLz0+IEludmFsaWQgRGF0ZVxuICovXG5jb25zdCBtYXhUaW1lID0gKGV4cG9ydHMubWF4VGltZSA9IE1hdGgucG93KDEwLCA4KSAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWluVGltZVxuICogQHN1bW1hcnkgTWluaW11bSBhbGxvd2VkIHRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IG1pblRpbWUgfSBmcm9tIFwiZGF0ZS1mbnMvY29uc3RhbnRzXCI7XG4gKlxuICogY29uc3QgaXNWYWxpZCA9IC04NjQwMDAwMDAwMDAwMDAxID49IG1pblRpbWU7XG4gKiAvLz0+IGZhbHNlXG4gKlxuICogbmV3IERhdGUoLTg2NDAwMDAwMDAwMDAwMDEpXG4gKiAvLz0+IEludmFsaWQgRGF0ZVxuICovXG5jb25zdCBtaW5UaW1lID0gKGV4cG9ydHMubWluVGltZSA9IC1tYXhUaW1lKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luV2Vla1xuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgd2Vlay5cbiAqL1xuY29uc3QgbWlsbGlzZWNvbmRzSW5XZWVrID0gKGV4cG9ydHMubWlsbGlzZWNvbmRzSW5XZWVrID0gNjA0ODAwMDAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luRGF5XG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBkYXkuXG4gKi9cbmNvbnN0IG1pbGxpc2Vjb25kc0luRGF5ID0gKGV4cG9ydHMubWlsbGlzZWNvbmRzSW5EYXkgPSA4NjQwMDAwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbk1pbnV0ZVxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgbWludXRlXG4gKi9cbmNvbnN0IG1pbGxpc2Vjb25kc0luTWludXRlID0gKGV4cG9ydHMubWlsbGlzZWNvbmRzSW5NaW51dGUgPSA2MDAwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbkhvdXJcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIGhvdXJcbiAqL1xuY29uc3QgbWlsbGlzZWNvbmRzSW5Ib3VyID0gKGV4cG9ydHMubWlsbGlzZWNvbmRzSW5Ib3VyID0gMzYwMDAwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJblNlY29uZFxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgc2Vjb25kXG4gKi9cbmNvbnN0IG1pbGxpc2Vjb25kc0luU2Vjb25kID0gKGV4cG9ydHMubWlsbGlzZWNvbmRzSW5TZWNvbmQgPSAxMDAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJblllYXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSB5ZWFyLlxuICovXG5jb25zdCBtaW51dGVzSW5ZZWFyID0gKGV4cG9ydHMubWludXRlc0luWWVhciA9IDUyNTYwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5Nb250aFxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIG1vbnRoLlxuICovXG5jb25zdCBtaW51dGVzSW5Nb250aCA9IChleHBvcnRzLm1pbnV0ZXNJbk1vbnRoID0gNDMyMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luRGF5XG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgZGF5LlxuICovXG5jb25zdCBtaW51dGVzSW5EYXkgPSAoZXhwb3J0cy5taW51dGVzSW5EYXkgPSAxNDQwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbkhvdXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSBob3VyLlxuICovXG5jb25zdCBtaW51dGVzSW5Ib3VyID0gKGV4cG9ydHMubWludXRlc0luSG91ciA9IDYwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1vbnRoc0luUXVhcnRlclxuICogQHN1bW1hcnkgTW9udGhzIGluIDEgcXVhcnRlci5cbiAqL1xuY29uc3QgbW9udGhzSW5RdWFydGVyID0gKGV4cG9ydHMubW9udGhzSW5RdWFydGVyID0gMyk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtb250aHNJblllYXJcbiAqIEBzdW1tYXJ5IE1vbnRocyBpbiAxIHllYXIuXG4gKi9cbmNvbnN0IG1vbnRoc0luWWVhciA9IChleHBvcnRzLm1vbnRoc0luWWVhciA9IDEyKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHF1YXJ0ZXJzSW5ZZWFyXG4gKiBAc3VtbWFyeSBRdWFydGVycyBpbiAxIHllYXJcbiAqL1xuY29uc3QgcXVhcnRlcnNJblllYXIgPSAoZXhwb3J0cy5xdWFydGVyc0luWWVhciA9IDQpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luSG91clxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIGhvdXIuXG4gKi9cbmNvbnN0IHNlY29uZHNJbkhvdXIgPSAoZXhwb3J0cy5zZWNvbmRzSW5Ib3VyID0gMzYwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5NaW51dGVcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBtaW51dGUuXG4gKi9cbmNvbnN0IHNlY29uZHNJbk1pbnV0ZSA9IChleHBvcnRzLnNlY29uZHNJbk1pbnV0ZSA9IDYwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbkRheVxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIGRheS5cbiAqL1xuY29uc3Qgc2Vjb25kc0luRGF5ID0gKGV4cG9ydHMuc2Vjb25kc0luRGF5ID0gc2Vjb25kc0luSG91ciAqIDI0KTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbldlZWtcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSB3ZWVrLlxuICovXG5jb25zdCBzZWNvbmRzSW5XZWVrID0gKGV4cG9ydHMuc2Vjb25kc0luV2VlayA9IHNlY29uZHNJbkRheSAqIDcpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luWWVhclxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIHllYXIuXG4gKi9cbmNvbnN0IHNlY29uZHNJblllYXIgPSAoZXhwb3J0cy5zZWNvbmRzSW5ZZWFyID0gc2Vjb25kc0luRGF5ICogZGF5c0luWWVhcik7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5Nb250aFxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIG1vbnRoXG4gKi9cbmNvbnN0IHNlY29uZHNJbk1vbnRoID0gKGV4cG9ydHMuc2Vjb25kc0luTW9udGggPSBzZWNvbmRzSW5ZZWFyIC8gMTIpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luUXVhcnRlclxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIHF1YXJ0ZXIuXG4gKi9cbmNvbnN0IHNlY29uZHNJblF1YXJ0ZXIgPSAoZXhwb3J0cy5zZWNvbmRzSW5RdWFydGVyID0gc2Vjb25kc0luTW9udGggKiAzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5jb25zdHJ1Y3RGcm9tID0gY29uc3RydWN0RnJvbTtcblxuLyoqXG4gKiBAbmFtZSBjb25zdHJ1Y3RGcm9tXG4gKiBAY2F0ZWdvcnkgR2VuZXJpYyBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZGF0ZSB1c2luZyB0aGUgcmVmZXJlbmNlIGRhdGUgYW5kIHRoZSB2YWx1ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGZ1bmN0aW9uIGNvbnN0cnVjdHMgYSBuZXcgZGF0ZSB1c2luZyB0aGUgY29uc3RydWN0b3IgZnJvbSB0aGUgcmVmZXJlbmNlXG4gKiBkYXRlIGFuZCB0aGUgZ2l2ZW4gdmFsdWUuIEl0IGhlbHBzIHRvIGJ1aWxkIGdlbmVyaWMgZnVuY3Rpb25zIHRoYXQgYWNjZXB0XG4gKiBkYXRlIGV4dGVuc2lvbnMuXG4gKlxuICogSXQgZGVmYXVsdHMgdG8gYERhdGVgIGlmIHRoZSBwYXNzZWQgcmVmZXJlbmNlIGRhdGUgaXMgYSBudW1iZXIgb3IgYSBzdHJpbmcuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgcmVmZXJlbmNlIGRhdGUgdG8gdGFrZSBjb25zdHJ1Y3RvciBmcm9tXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY3JlYXRlIHRoZSBkYXRlXG4gKlxuICogQHJldHVybnMgRGF0ZSBpbml0aWFsaXplZCB1c2luZyB0aGUgZ2l2ZW4gZGF0ZSBhbmQgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gJ2RhdGUtZm5zJ1xuICpcbiAqIC8vIEEgZnVuY3Rpb24gdGhhdCBjbG9uZXMgYSBkYXRlIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIHR5cGVcbiAqIGZ1bmN0aW9uIGNsb25lRGF0ZTxEYXRlVHlwZSBleHRlbmRzIERhdGUoZGF0ZTogRGF0ZVR5cGUpOiBEYXRlVHlwZSB7XG4gKiAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKFxuICogICAgIGRhdGUsIC8vIFVzZSBjb250cnVzdG9yIGZyb20gdGhlIGdpdmVuIGRhdGVcbiAqICAgICBkYXRlLmdldFRpbWUoKSAvLyBVc2UgdGhlIGRhdGUgdmFsdWUgdG8gY3JlYXRlIGEgbmV3IGRhdGVcbiAqICAgKVxuICogfVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlKSB7XG4gIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBuZXcgZGF0ZS5jb25zdHJ1Y3Rvcih2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZEYXkuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdGltZXMgYXJlIHJlbW92ZWRcbiAqIGZyb20gdGhlIGRhdGVzIGFuZCB0aGVuIHRoZSBkaWZmZXJlbmNlIGluIGRheXMgaXMgY2FsY3VsYXRlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6MDA6MDAgYW5kIDIgSnVseSAyMDEyIDAwOjAwOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKFxuICogICBuZXcgRGF0ZSgyMDEyLCA2LCAyLCAwLCAwKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDApXG4gKiApXG4gKiAvLz0+IDM2NlxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6NTk6MDAgYW5kIDMgSnVseSAyMDExIDAwOjAxOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAzLCAwLCAxKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDU5KVxuICogKVxuICogLy89PiAxXG4gKi9cbmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IHN0YXJ0T2ZEYXlMZWZ0ID0gKDAsIF9pbmRleDIuc3RhcnRPZkRheSkoZGF0ZUxlZnQpO1xuICBjb25zdCBzdGFydE9mRGF5UmlnaHQgPSAoMCwgX2luZGV4Mi5zdGFydE9mRGF5KShkYXRlUmlnaHQpO1xuXG4gIGNvbnN0IHRpbWVzdGFtcExlZnQgPVxuICAgICtzdGFydE9mRGF5TGVmdCAtXG4gICAgKDAsIF9pbmRleDMuZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcykoc3RhcnRPZkRheUxlZnQpO1xuICBjb25zdCB0aW1lc3RhbXBSaWdodCA9XG4gICAgK3N0YXJ0T2ZEYXlSaWdodCAtXG4gICAgKDAsIF9pbmRleDMuZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcykoc3RhcnRPZkRheVJpZ2h0KTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIGRheXMgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBiZWNhdXNlIHRoZSBudW1iZXIgb2ZcbiAgLy8gbWlsbGlzZWNvbmRzIGluIGEgZGF5IGlzIG5vdCBjb25zdGFudCAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZlxuICAvLyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpLlxuICByZXR1cm4gTWF0aC5yb3VuZChcbiAgICAodGltZXN0YW1wTGVmdCAtIHRpbWVzdGFtcFJpZ2h0KSAvIF9pbmRleC5taWxsaXNlY29uZHNJbkRheSxcbiAgKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoc1xuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRocyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRocyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRoc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciBtb250aHMgYXJlIGJldHdlZW4gMzEgSmFudWFyeSAyMDE0IGFuZCAxIFNlcHRlbWJlciAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDgsIDEpLFxuICogICBuZXcgRGF0ZSgyMDE0LCAwLCAzMSlcbiAqIClcbiAqIC8vPT4gOFxuICovXG5mdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlTGVmdCk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVJpZ2h0KTtcblxuICBjb25zdCB5ZWFyRGlmZiA9IF9kYXRlTGVmdC5nZXRGdWxsWWVhcigpIC0gX2RhdGVSaWdodC5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtb250aERpZmYgPSBfZGF0ZUxlZnQuZ2V0TW9udGgoKSAtIF9kYXRlUmlnaHQuZ2V0TW9udGgoKTtcblxuICByZXR1cm4geWVhckRpZmYgKiAxMiArIG1vbnRoRGlmZjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9nZXRRdWFydGVyLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyc1xuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgcXVhcnRlcnMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBxdWFydGVycyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBlYXJsaWVyIGRhdGVcblxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciBxdWFydGVyc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciBxdWFydGVycyBhcmUgYmV0d2VlbiAzMSBEZWNlbWJlciAyMDEzIGFuZCAyIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIpLFxuICogICBuZXcgRGF0ZSgyMDEzLCAxMSwgMzEpXG4gKiApXG4gKiAvLz0+IDNcbiAqL1xuZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZUxlZnQpO1xuICBjb25zdCBfZGF0ZVJpZ2h0ID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlUmlnaHQpO1xuXG4gIGNvbnN0IHllYXJEaWZmID0gX2RhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgLSBfZGF0ZVJpZ2h0LmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IHF1YXJ0ZXJEaWZmID1cbiAgICAoMCwgX2luZGV4LmdldFF1YXJ0ZXIpKF9kYXRlTGVmdCkgLSAoMCwgX2luZGV4LmdldFF1YXJ0ZXIpKF9kYXRlUmlnaHQpO1xuXG4gIHJldHVybiB5ZWFyRGlmZiAqIDQgKyBxdWFydGVyRGlmZjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFyc1xuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgeWVhcnMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciB5ZWFycyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBlYXJsaWVyIGRhdGVcblxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciB5ZWFyc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciB5ZWFycyBhcmUgYmV0d2VlbiAzMSBEZWNlbWJlciAyMDEzIGFuZCAxMSBGZWJydWFyeSAyMDE1P1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhcbiAqICAgbmV3IERhdGUoMjAxNSwgMSwgMTEpLFxuICogICBuZXcgRGF0ZSgyMDEzLCAxMSwgMzEpXG4gKiApXG4gKiAvLz0+IDJcbiAqL1xuZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlTGVmdCk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVJpZ2h0KTtcblxuICByZXR1cm4gX2RhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgLSBfZGF0ZVJpZ2h0LmdldEZ1bGxZZWFyKCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZW5kT2ZEYXkgPSBlbmRPZkRheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZW5kT2ZEYXlcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBlbmQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGVuZCBvZiBhIGRheVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgZGF5IGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5mdW5jdGlvbiBlbmRPZkRheShkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBfZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZW5kT2ZNb250aCA9IGVuZE9mTW9udGg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGVuZCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGVuZCBvZiBhIG1vbnRoXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBlbmQgb2YgYSBtb250aCBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAzMCAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5mdW5jdGlvbiBlbmRPZk1vbnRoKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IG1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTtcbiAgX2RhdGUuc2V0RnVsbFllYXIoX2RhdGUuZ2V0RnVsbFllYXIoKSwgbW9udGggKyAxLCAwKTtcbiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmVuZE9mV2VlayA9IGVuZE9mV2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGVuZE9mV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mV2Vla1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBlbmQgb2YgYSB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBlbmQgb2YgYSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFNhdCBTZXAgMDYgMjAxNCAyMzo1OTo1OS45OTlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdGhlIHdlZWsgc3RhcnRzIG9uIE1vbmRheSwgdGhlIGVuZCBvZiB0aGUgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBTdW4gU2VwIDA3IDIwMTQgMjM6NTk6NTkuOTk5XG4gKi9cbmZ1bmN0aW9uIGVuZE9mV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDIuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpO1xuICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IC03IDogMCkgKyA2IC0gKGRheSAtIHdlZWtTdGFydHNPbik7XG5cbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgKyBkaWZmKTtcbiAgX2RhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmVuZE9mWWVhciA9IGVuZE9mWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZW5kT2ZZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGVuZCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBlbmQgb2YgYSB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBlbmQgb2YgYSB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBlbmQgb2YgYSB5ZWFyIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMDApKVxuICogLy89PiBXZWQgRGVjIDMxIDIwMTQgMjM6NTk6NTkuOTk5XG4gKi9cbmZ1bmN0aW9uIGVuZE9mWWVhcihkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgX2RhdGUuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDApO1xuICBfZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZm9ybWF0ID0gZXhwb3J0cy5mb3JtYXREYXRlID0gZm9ybWF0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZm9ybWF0dGVyc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfaW5kZXgzLmZvcm1hdHRlcnM7XG4gIH0sXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxvbmdGb3JtYXR0ZXJzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9pbmRleDQubG9uZ0Zvcm1hdHRlcnM7XG4gIH0sXG59KTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRMb2NhbGUuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL19saWIvZm9ybWF0L2Zvcm1hdHRlcnMuanNcIik7XG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzLmpzXCIpO1xudmFyIF9pbmRleDUgPSByZXF1aXJlKFwiLi9fbGliL3Byb3RlY3RlZFRva2Vucy5qc1wiKTtcblxudmFyIF9pbmRleDYgPSByZXF1aXJlKFwiLi9pc1ZhbGlkLmpzXCIpO1xudmFyIF9pbmRleDcgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8vIFJleHBvcnRzIG9mIGludGVybmFsIGZvciBsaWJyYXJpZXMgdG8gdXNlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM2MzgjaXNzdWVjb21tZW50LTE4NzcwODI4NzRcblxuLy8gVGhpcyBSZWdFeHAgY29uc2lzdHMgb2YgdGhyZWUgcGFydHMgc2VwYXJhdGVkIGJ5IGB8YDpcbi8vIC0gW3lZUXFNTHdJZERlY2loSEtrbXNdbyBtYXRjaGVzIGFueSBhdmFpbGFibGUgb3JkaW5hbCBudW1iZXIgdG9rZW5cbi8vICAgKG9uZSBvZiB0aGUgY2VydGFpbiBsZXR0ZXJzIGZvbGxvd2VkIGJ5IGBvYClcbi8vIC0gKFxcdylcXDEqIG1hdGNoZXMgYW55IHNlcXVlbmNlcyBvZiB0aGUgc2FtZSBsZXR0ZXJcbi8vIC0gJycgbWF0Y2hlcyB0d28gcXVvdGUgY2hhcmFjdGVycyBpbiBhIHJvd1xuLy8gLSAnKCcnfFteJ10pKygnfCQpIG1hdGNoZXMgYW55dGhpbmcgc3Vycm91bmRlZCBieSB0d28gcXVvdGUgY2hhcmFjdGVycyAoJyksXG4vLyAgIGV4Y2VwdCBhIHNpbmdsZSBxdW90ZSBzeW1ib2wsIHdoaWNoIGVuZHMgdGhlIHNlcXVlbmNlLlxuLy8gICBUd28gcXVvdGUgY2hhcmFjdGVycyBkbyBub3QgZW5kIHRoZSBzZXF1ZW5jZS5cbi8vICAgSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc2luZ2xlIHF1b3RlXG4vLyAgIHRoZW4gdGhlIHNlcXVlbmNlIHdpbGwgY29udGludWUgdW50aWwgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLlxuLy8gLSAuIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIgdW5tYXRjaGVkIGJ5IHByZXZpb3VzIHBhcnRzIG9mIHRoZSBSZWdFeHBzXG5jb25zdCBmb3JtYXR0aW5nVG9rZW5zUmVnRXhwID1cbiAgL1t5WVFxTUx3SWREZWNpaEhLa21zXW98KFxcdylcXDEqfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nO1xuXG4vLyBUaGlzIFJlZ0V4cCBjYXRjaGVzIHN5bWJvbHMgZXNjYXBlZCBieSBxdW90ZXMsIGFuZCBhbHNvXG4vLyBzZXF1ZW5jZXMgb2Ygc3ltYm9scyBQLCBwLCBhbmQgdGhlIGNvbWJpbmF0aW9ucyBsaWtlIGBQUFBQUFBQcHBwcHBgXG5jb25zdCBsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9IC9QK3ArfFArfHArfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nO1xuXG5jb25zdCBlc2NhcGVkU3RyaW5nUmVnRXhwID0gL14nKFteXSo/KSc/JC87XG5jb25zdCBkb3VibGVRdW90ZVJlZ0V4cCA9IC8nJy9nO1xuY29uc3QgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAgPSAvW2EtekEtWl0vO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZm9ybWF0fSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZm9ybWF0XG4gKiBAYWxpYXMgZm9ybWF0RGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBGb3JtYXQgdGhlIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZyBpbiB0aGUgZ2l2ZW4gZm9ybWF0LiBUaGUgcmVzdWx0IG1heSB2YXJ5IGJ5IGxvY2FsZS5cbiAqXG4gKiA+IOKaoO+4jyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBgZm9ybWF0YCB0b2tlbnMgZGlmZmVyIGZyb20gTW9tZW50LmpzIGFuZCBvdGhlciBsaWJyYXJpZXMuXG4gKiA+IFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIFRoZSBjaGFyYWN0ZXJzIHdyYXBwZWQgYmV0d2VlbiB0d28gc2luZ2xlIHF1b3RlcyBjaGFyYWN0ZXJzICgnKSBhcmUgZXNjYXBlZC5cbiAqIFR3byBzaW5nbGUgcXVvdGVzIGluIGEgcm93LCB3aGV0aGVyIGluc2lkZSBvciBvdXRzaWRlIGEgcXVvdGVkIHNlcXVlbmNlLCByZXByZXNlbnQgYSAncmVhbCcgc2luZ2xlIHF1b3RlLlxuICogKHNlZSB0aGUgbGFzdCBleGFtcGxlKVxuICpcbiAqIEZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzIGJhc2VkIG9uIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9GaWVsZF9TeW1ib2xfVGFibGVcbiAqIHdpdGggYSBmZXcgYWRkaXRpb25zIChzZWUgbm90ZSA3IGJlbG93IHRoZSB0YWJsZSkuXG4gKlxuICogQWNjZXB0ZWQgcGF0dGVybnM6XG4gKiB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQYXR0ZXJuIHwgUmVzdWx0IGV4YW1wbGVzICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLXxcbiAqIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEcuLkdHRyAgfCBBRCwgQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHICAgIHwgQW5ubyBEb21pbmksIEJlZm9yZSBDaHJpc3QgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR0dHR0cgICB8IEEsIEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQ2FsZW5kYXIgeWVhciAgICAgICAgICAgICAgICAgICB8IHkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5byAgICAgIHwgNDR0aCwgMXN0LCAwdGgsIDE3dGggICAgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eSAgICAgfCAwNDQsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5ICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5eXkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICB8IFkgICAgICAgfCA0NCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZbyAgICAgIHwgNDR0aCwgMXN0LCAxOTAwdGgsIDIwMTd0aCAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVkgICAgICB8IDQ0LCAwMSwgMDAsIDE3ICAgICAgICAgICAgICAgICAgICB8IDUsOCAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWSAgICAgfCAwNDQsIDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZICAgIHwgMDA0NCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZWVkgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgICB8IFIgICAgICAgfCAtNDMsIDAsIDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUiAgICAgIHwgLTQzLCAwMCwgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSICAgICB8IC0wNDMsIDAwMCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlIgICAgfCAtMDA0MywgMDAwMCwgMDAwMSwgMTkwMCwgMjAxNyAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlJSUiAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1LDcgfFxuICogfCBFeHRlbmRlZCB5ZWFyICAgICAgICAgICAgICAgICAgIHwgdSAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1ICAgICAgfCAtNDMsIDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXUgICAgIHwgLTA0MywgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dSAgICB8IC0wMDQzLCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dXV1ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUgICB8XG4gKiB8IFF1YXJ0ZXIgKGZvcm1hdHRpbmcpICAgICAgICAgICAgfCBRICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUVFRICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8IFF1YXJ0ZXIgKHN0YW5kLWFsb25lKSAgICAgICAgICAgfCBxICAgICAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcW8gICAgICB8IDFzdCwgMm5kLCAzcmQsIDR0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxICAgICAgfCAwMSwgMDIsIDAzLCAwNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXEgICAgIHwgUTEsIFEyLCBRMywgUTQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcSAgICB8IDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcXFxICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8IE1vbnRoIChmb3JtYXR0aW5nKSAgICAgICAgICAgICAgfCBNICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU0gICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTSAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTU1NICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IE1vbnRoIChzdGFuZC1hbG9uZSkgICAgICAgICAgICAgfCBMICAgICAgIHwgMSwgMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDEydGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMICAgICAgfCAwMSwgMDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTEwgICAgIHwgSmFuLCBGZWIsIC4uLiwgRGVjICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTCAgICB8IEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTExMICAgfCBKLCBGLCAuLi4sIEQgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgfCB3ICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd28gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHd3ICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICAgfCBJICAgICAgIHwgMSwgMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDUzdGggICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElJICAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICAgfCBkICAgICAgIHwgMSwgMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDMxc3QgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRkICAgICAgfCAwMSwgMDIsIC4uLiwgMzEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICAgfCBEICAgICAgIHwgMSwgMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICAgIHwgOSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRG8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDM2NXRoLCAzNjZ0aCAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEREICAgICAgfCAwMSwgMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREQgICAgIHwgMDAxLCAwMDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRERERCAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgRGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICAgICAgICB8IEUuLkVFRSAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUUgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUVFRSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IElTTyBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgfCBpICAgICAgIHwgMSwgMiwgMywgLi4uLCA3ICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW8gICAgICB8IDFzdCwgMm5kLCAuLi4sIDd0aCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpICAgICAgfCAwMSwgMDIsIC4uLiwgMDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWkgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpaWkgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgNyAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgIHwgZSAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZSAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZWVlICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgZGF5IG9mIHdlZWsgKHN0YW5kLWFsb25lKSB8IGMgICAgICAgfCAyLCAzLCA0LCAuLi4sIDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjbyAgICAgIHwgMm5kLCAzcmQsIC4uLiwgMXN0ICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2MgICAgICB8IDAyLCAwMywgLi4uLCAwMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjYyAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2MgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2NjYyAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhLi5hYSAgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhICAgICB8IGFtLCBwbSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWEgICAgfCBhLm0uLCBwLm0uICAgICAgICAgICAgICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWFhYSAgIHwgYSwgcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgIHwgYi4uYmIgICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYiAgICAgfCBhbSwgcG0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiICAgIHwgYS5tLiwgcC5tLiwgbm9vbiwgbWlkbmlnaHQgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiYmIgICB8IGEsIHAsIG4sIG1pICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgICB8IEIuLkJCQiAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCICAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQkJCQkIgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgICB8IGggICAgICAgfCAxLCAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBobyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMTJ0aCAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGggICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgICB8IEggICAgICAgfCAwLCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIbyAgICAgIHwgMHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSEggICAgICB8IDAwLCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgICB8IEsgICAgICAgfCAxLCAyLCAuLi4sIDExLCAwICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMHRoICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgS0sgICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgICB8IGsgICAgICAgfCAyNCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrbyAgICAgIHwgMjR0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2sgICAgICB8IDI0LCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgICB8IG0gICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbW0gICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgICB8IHMgICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3MgICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgICB8IFMgICAgICAgfCAwLCAxLCAuLi4sIDkgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTUyAgICAgIHwgMDAsIDAxLCAuLi4sIDk5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTICAgICB8IDAwMCwgMDAxLCAuLi4sIDk5OSAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTU1MgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzICAgICB8XG4gKiB8IFRpbWV6b25lIChJU08tODYwMSB3LyBaKSAgICAgICAgfCBYICAgICAgIHwgLTA4LCArMDUzMCwgWiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFggICAgICB8IC0wODAwLCArMDUzMCwgWiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWCAgICAgfCAtMDg6MDAsICswNTozMCwgWiAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYICAgIHwgLTA4MDAsICswNTMwLCBaLCArMTIzNDU2ICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYWFggICB8IC0wODowMCwgKzA1OjMwLCBaLCArMTI6MzQ6NTYgICAgICB8ICAgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvbyBaKSAgICAgICB8IHggICAgICAgfCAtMDgsICswNTMwLCArMDAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eCAgICAgIHwgLTA4MDAsICswNTMwLCArMDAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4ICAgICB8IC0wODowMCwgKzA1OjMwLCArMDA6MDAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHggICAgfCAtMDgwMCwgKzA1MzAsICswMDAwLCArMTIzNDU2ICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHh4eCAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCwgKzEyOjM0OjU2IHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoR01UKSAgICAgICAgICAgICAgICAgIHwgTy4uLk9PTyB8IEdNVC04LCBHTVQrNTozMCwgR01UKzAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE9PT08gICAgfCBHTVQtMDg6MDAsIEdNVCswNTozMCwgR01UKzAwOjAwICAgfCAyICAgICB8XG4gKiB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSAgfCB6Li4uenp6IHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgNiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgenp6eiAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIsNiAgIHxcbiAqIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgICB8IHQgICAgICAgfCA1MTI5Njk1MjAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0dCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw3ICAgfFxuICogfCBNaWxsaXNlY29uZHMgdGltZXN0YW1wICAgICAgICAgIHwgVCAgICAgICB8IDUxMjk2OTUyMDkwMCAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICAgfCBQICAgICAgIHwgMDQvMjkvMTQ1MyAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFAgICAgICB8IEFwciAyOSwgMTQ1MyAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUCAgICAgfCBBcHJpbCAyOXRoLCAxNDUzICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBQICAgIHwgRnJpZGF5LCBBcHJpbCAyOXRoLCAxNDUzICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBMb25nIGxvY2FsaXplZCB0aW1lICAgICAgICAgICAgIHwgcCAgICAgICB8IDEyOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwICAgICAgfCAxMjowMDowMCBBTSAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHAgICAgIHwgMTI6MDA6MDAgQU0gR01UKzIgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHBwcCAgICB8IDEyOjAwOjAwIEFNIEdNVCswMjowMCAgICAgICAgICAgICB8IDIsNyAgIHxcbiAqIHwgQ29tYmluYXRpb24gb2YgZGF0ZSBhbmQgdGltZSAgICB8IFBwICAgICAgfCAwNC8yOS8xNDUzLCAxMjowMCBBTSAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUHBwICAgIHwgQXByIDI5LCAxNDUzLCAxMjowMDowMCBBTSAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQcHBwICB8IEFwcmlsIDI5dGgsIDE0NTMgYXQgLi4uICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFBwcHBwfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgYXQgLi4uICAgfCAyLDcgICB8XG4gKiBOb3RlczpcbiAqIDEuIFwiRm9ybWF0dGluZ1wiIHVuaXRzIChlLmcuIGZvcm1hdHRpbmcgcXVhcnRlcikgaW4gdGhlIGRlZmF1bHQgZW4tVVMgbG9jYWxlXG4gKiAgICBhcmUgdGhlIHNhbWUgYXMgXCJzdGFuZC1hbG9uZVwiIHVuaXRzLCBidXQgYXJlIGRpZmZlcmVudCBpbiBzb21lIGxhbmd1YWdlcy5cbiAqICAgIFwiRm9ybWF0dGluZ1wiIHVuaXRzIGFyZSBkZWNsaW5lZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIHRoZSBsYW5ndWFnZVxuICogICAgaW4gdGhlIGNvbnRleHQgb2YgYSBkYXRlLiBcIlN0YW5kLWFsb25lXCIgdW5pdHMgYXJlIGFsd2F5cyBub21pbmF0aXZlIHNpbmd1bGFyOlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTExMTCcsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWQnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnZG8gTU1NTScsIHtsb2NhbGU6IGNzfSkgLy89PiAnNi4gbGlzdG9wYWR1J2BcbiAqXG4gKiAyLiBBbnkgc2VxdWVuY2Ugb2YgdGhlIGlkZW50aWNhbCBsZXR0ZXJzIGlzIGEgcGF0dGVybiwgdW5sZXNzIGl0IGlzIGVzY2FwZWQgYnlcbiAqICAgIHRoZSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycyAoc2VlIGJlbG93KS5cbiAqICAgIElmIHRoZSBzZXF1ZW5jZSBpcyBsb25nZXIgdGhhbiBsaXN0ZWQgaW4gdGFibGUgKGUuZy4gYEVFRUVFRUVFRUVFYClcbiAqICAgIHRoZSBvdXRwdXQgd2lsbCBiZSB0aGUgc2FtZSBhcyBkZWZhdWx0IHBhdHRlcm4gZm9yIHRoaXMgdW5pdCwgdXN1YWxseVxuICogICAgdGhlIGxvbmdlc3Qgb25lIChpbiBjYXNlIG9mIElTTyB3ZWVrZGF5cywgYEVFRUVgKS4gRGVmYXVsdCBwYXR0ZXJucyBmb3IgdW5pdHNcbiAqICAgIGFyZSBtYXJrZWQgd2l0aCBcIjJcIiBpbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIHRhYmxlLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NJykgLy89PiAnTm92J2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTScpIC8vPT4gJ04nYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAzLiBTb21lIHBhdHRlcm5zIGNvdWxkIGJlIHVubGltaXRlZCBsZW5ndGggKHN1Y2ggYXMgYHl5eXl5eXl5YCkuXG4gKiAgICBUaGUgb3V0cHV0IHdpbGwgYmUgcGFkZGVkIHdpdGggemVyb3MgdG8gbWF0Y2ggdGhlIGxlbmd0aCBvZiB0aGUgcGF0dGVybi5cbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ3l5eXl5eXl5JykgLy89PiAnMDAwMDIwMTcnYFxuICpcbiAqIDQuIGBRUVFRUWAgYW5kIGBxcXFxcWAgY291bGQgYmUgbm90IHN0cmljdGx5IG51bWVyaWNhbCBpbiBzb21lIGxvY2FsZXMuXG4gKiAgICBUaGVzZSB0b2tlbnMgcmVwcmVzZW50IHRoZSBzaG9ydGVzdCBmb3JtIG9mIHRoZSBxdWFydGVyLlxuICpcbiAqIDUuIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBwYXR0ZXJucyBhcmUgQi5DLiB5ZWFyczpcbiAqXG4gKiAgICB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICogICAgfC0tLS0tLXwtLS0tLXwtLS0tLXxcbiAqICAgIHwgQUMgMSB8ICAgMSB8ICAgMSB8XG4gKiAgICB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICogICAgfCBCQyAyIHwgICAyIHwgIC0xIHxcbiAqXG4gKiAgICBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gKiAgICB3aGlsZSBgdXVgIHBhZHMgc2luZ2xlIGRpZ2l0IHllYXJzIHRvIDIgY2hhcmFjdGVycyBhbmQgcmV0dXJucyBvdGhlciB5ZWFycyB1bmNoYW5nZWQ6XG4gKlxuICogICAgfCBZZWFyIHwgYHl5YCB8IGB1dWAgfFxuICogICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfFxuICogICAgfCAxICAgIHwgICAwMSB8ICAgMDEgfFxuICogICAgfCAxNCAgIHwgICAxNCB8ICAgMTQgfFxuICogICAgfCAzNzYgIHwgICA3NiB8ICAzNzYgfFxuICogICAgfCAxNDUzIHwgICA1MyB8IDE0NTMgfFxuICpcbiAqICAgIFRoZSBzYW1lIGRpZmZlcmVuY2UgaXMgdHJ1ZSBmb3IgbG9jYWwgYW5kIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFycyAoYFlgIGFuZCBgUmApLFxuICogICAgZXhjZXB0IGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJzIGFyZSBkZXBlbmRlbnQgb24gYG9wdGlvbnMud2Vla1N0YXJ0c09uYFxuICogICAgYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKGNvbXBhcmUgW2dldElTT1dlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldElTT1dlZWtZZWFyKVxuICogICAgYW5kIFtnZXRXZWVrWWVhcl0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9nZXRXZWVrWWVhcikpLlxuICpcbiAqIDYuIFNwZWNpZmljIG5vbi1sb2NhdGlvbiB0aW1lem9uZXMgYXJlIGN1cnJlbnRseSB1bmF2YWlsYWJsZSBpbiBgZGF0ZS1mbnNgLFxuICogICAgc28gcmlnaHQgbm93IHRoZXNlIHRva2VucyBmYWxsIGJhY2sgdG8gR01UIHRpbWV6b25lcy5cbiAqXG4gKiA3LiBUaGVzZSBwYXR0ZXJucyBhcmUgbm90IGluIHRoZSBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzU6XG4gKiAgICAtIGBpYDogSVNPIGRheSBvZiB3ZWVrXG4gKiAgICAtIGBJYDogSVNPIHdlZWsgb2YgeWVhclxuICogICAgLSBgUmA6IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKiAgICAtIGB0YDogc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYFRgOiBtaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gKiAgICAtIGBvYDogb3JkaW5hbCBudW1iZXIgbW9kaWZpZXJcbiAqICAgIC0gYFBgOiBsb25nIGxvY2FsaXplZCBkYXRlXG4gKiAgICAtIGBwYDogbG9uZyBsb2NhbGl6ZWQgdGltZVxuICpcbiAqIDguIGBZWWAgYW5kIGBZWVlZYCB0b2tlbnMgcmVwcmVzZW50IHdlZWstbnVtYmVyaW5nIHllYXJzIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIHllYXJzLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zYCB0byB1c2UgdGhlbS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogOS4gYERgIGFuZCBgRERgIHRva2VucyByZXByZXNlbnQgZGF5cyBvZiB0aGUgeWVhciBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCBkYXlzIG9mIHRoZSBtb250aC5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gZm9ybWF0IC0gVGhlIHN0cmluZyBvZiB0b2tlbnNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmdcbiAqXG4gKiBAdGhyb3dzIGBkYXRlYCBtdXN0IG5vdCBiZSBJbnZhbGlkIERhdGVcbiAqIEB0aHJvd3MgYG9wdGlvbnMubG9jYWxlYCBtdXN0IGNvbnRhaW4gYGxvY2FsaXplYCBwcm9wZXJ0eVxuICogQHRocm93cyBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgZm9ybWF0TG9uZ2AgcHJvcGVydHlcbiAqIEB0aHJvd3MgdXNlIGB5eXl5YCBpbnN0ZWFkIG9mIGBZWVlZYCBmb3IgZm9ybWF0dGluZyB5ZWFycyB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgeXlgIGluc3RlYWQgb2YgYFlZYCBmb3IgZm9ybWF0dGluZyB5ZWFycyB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGAgaW5zdGVhZCBvZiBgRGAgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYGRkYCBpbnN0ZWFkIG9mIGBERGAgZm9yIGZvcm1hdHRpbmcgZGF5cyBvZiB0aGUgbW9udGggdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyBmb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVwcmVzZW50IDExIEZlYnJ1YXJ5IDIwMTQgaW4gbWlkZGxlLWVuZGlhbiBmb3JtYXQ6XG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXQobmV3IERhdGUoMjAxNCwgMSwgMTEpLCAnTU0vZGQveXl5eScpXG4gKiAvLz0+ICcwMi8xMS8yMDE0J1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMiBKdWx5IDIwMTQgaW4gRXNwZXJhbnRvOlxuICogaW1wb3J0IHsgZW9Mb2NhbGUgfSBmcm9tICdkYXRlLWZucy9sb2NhbGUvZW8nXG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXQobmV3IERhdGUoMjAxNCwgNiwgMiksIFwiZG8gJ2RlJyBNTU1NIHl5eXlcIiwge1xuICogICBsb2NhbGU6IGVvTG9jYWxlXG4gKiB9KVxuICogLy89PiAnMi1hIGRlIGp1bGlvIDIwMTQnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEVzY2FwZSBzdHJpbmcgYnkgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnM6XG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXQobmV3IERhdGUoMjAxNCwgNiwgMiwgMTUpLCBcImggJ28nJ2Nsb2NrJ1wiKVxuICogLy89PiBcIjMgbydjbG9ja1wiXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdChkYXRlLCBmb3JtYXRTdHIsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4Mi5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgY29uc3QgbG9jYWxlID1cbiAgICBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMubG9jYWxlID8/IF9pbmRleC5kZWZhdWx0TG9jYWxlO1xuXG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3Qgd2Vla1N0YXJ0c09uID1cbiAgICBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgMDtcblxuICBjb25zdCBvcmlnaW5hbERhdGUgPSAoMCwgX2luZGV4Ny50b0RhdGUpKGRhdGUpO1xuXG4gIGlmICghKDAsIF9pbmRleDYuaXNWYWxpZCkob3JpZ2luYWxEYXRlKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB0aW1lIHZhbHVlXCIpO1xuICB9XG5cbiAgbGV0IHBhcnRzID0gZm9ybWF0U3RyXG4gICAgLm1hdGNoKGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwKVxuICAgIC5tYXAoKHN1YnN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwicFwiIHx8IGZpcnN0Q2hhcmFjdGVyID09PSBcIlBcIikge1xuICAgICAgICBjb25zdCBsb25nRm9ybWF0dGVyID0gX2luZGV4NC5sb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07XG4gICAgICAgIHJldHVybiBsb25nRm9ybWF0dGVyKHN1YnN0cmluZywgbG9jYWxlLmZvcm1hdExvbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1YnN0cmluZztcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpXG4gICAgLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnNSZWdFeHApXG4gICAgLm1hcCgoc3Vic3RyaW5nKSA9PiB7XG4gICAgICAvLyBSZXBsYWNlIHR3byBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycyB3aXRoIG9uZSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyXG4gICAgICBpZiAoc3Vic3RyaW5nID09PSBcIicnXCIpIHtcbiAgICAgICAgcmV0dXJuIHsgaXNUb2tlbjogZmFsc2UsIHZhbHVlOiBcIidcIiB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHN1YnN0cmluZ1swXTtcbiAgICAgIGlmIChmaXJzdENoYXJhY3RlciA9PT0gXCInXCIpIHtcbiAgICAgICAgcmV0dXJuIHsgaXNUb2tlbjogZmFsc2UsIHZhbHVlOiBjbGVhbkVzY2FwZWRTdHJpbmcoc3Vic3RyaW5nKSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoX2luZGV4My5mb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXSkge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiB0cnVlLCB2YWx1ZTogc3Vic3RyaW5nIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgXCJGb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXIgYFwiICtcbiAgICAgICAgICAgIGZpcnN0Q2hhcmFjdGVyICtcbiAgICAgICAgICAgIFwiYFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IHN1YnN0cmluZyB9O1xuICAgIH0pO1xuXG4gIC8vIGludm9rZSBsb2NhbGl6ZSBwcmVwcm9jZXNzb3IgKG9ubHkgZm9yIGZyZW5jaCBsb2NhbGVzIGF0IHRoZSBtb21lbnQpXG4gIGlmIChsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKSB7XG4gICAgcGFydHMgPSBsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKG9yaWdpbmFsRGF0ZSwgcGFydHMpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgd2Vla1N0YXJ0c09uLFxuICAgIGxvY2FsZSxcbiAgfTtcblxuICByZXR1cm4gcGFydHNcbiAgICAubWFwKChwYXJ0KSA9PiB7XG4gICAgICBpZiAoIXBhcnQuaXNUb2tlbikgcmV0dXJuIHBhcnQudmFsdWU7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gcGFydC52YWx1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICAoIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJlxuICAgICAgICAgICgwLCBfaW5kZXg1LmlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbikodG9rZW4pKSB8fFxuICAgICAgICAoIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnMgJiZcbiAgICAgICAgICAoMCwgX2luZGV4NS5pc1Byb3RlY3RlZERheU9mWWVhclRva2VuKSh0b2tlbikpXG4gICAgICApIHtcbiAgICAgICAgKDAsIF9pbmRleDUud2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcikodG9rZW4sIGZvcm1hdFN0ciwgU3RyaW5nKGRhdGUpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0dGVyID0gX2luZGV4My5mb3JtYXR0ZXJzW3Rva2VuWzBdXTtcbiAgICAgIHJldHVybiBmb3JtYXR0ZXIob3JpZ2luYWxEYXRlLCB0b2tlbiwgbG9jYWxlLmxvY2FsaXplLCBmb3JtYXR0ZXJPcHRpb25zKTtcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpO1xufVxuXG5mdW5jdGlvbiBjbGVhbkVzY2FwZWRTdHJpbmcoaW5wdXQpIHtcbiAgY29uc3QgbWF0Y2hlZCA9IGlucHV0Lm1hdGNoKGVzY2FwZWRTdHJpbmdSZWdFeHApO1xuXG4gIGlmICghbWF0Y2hlZCkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVkWzFdLnJlcGxhY2UoZG91YmxlUXVvdGVSZWdFeHAsIFwiJ1wiKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXREYXRlID0gZ2V0RGF0ZTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0RGF0ZVxuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGRheSBvZiB0aGUgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGRheSBvZiB0aGUgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2YgbW9udGhcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggZGF5IG9mIHRoZSBtb250aCBpcyAyOSBGZWJydWFyeSAyMDEyP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0RGF0ZShuZXcgRGF0ZSgyMDEyLCAxLCAyOSkpXG4gKiAvLz0+IDI5XG4gKi9cbmZ1bmN0aW9uIGdldERhdGUoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGF5T2ZNb250aCA9IF9kYXRlLmdldERhdGUoKTtcbiAgcmV0dXJuIGRheU9mTW9udGg7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0RGF5ID0gZ2V0RGF5O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXREYXlcbiAqIEBjYXRlZ29yeSBXZWVrZGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2Ygd2VlaywgMCByZXByZXNlbnRzIFN1bmRheVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBkYXkgb2YgdGhlIHdlZWsgaXMgMjkgRmVicnVhcnkgMjAxMj9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldERheShuZXcgRGF0ZSgyMDEyLCAxLCAyOSkpXG4gKiAvLz0+IDNcbiAqL1xuZnVuY3Rpb24gZ2V0RGF5KGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpO1xuICByZXR1cm4gZGF5O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldERheU9mWWVhciA9IGdldERheU9mWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZZZWFyLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0RGF5T2ZZZWFyXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgZGF5IG9mIHRoZSB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2YgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBkYXkgb2YgdGhlIHllYXIgaXMgMiBKdWx5IDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBnZXREYXlPZlllYXIobmV3IERhdGUoMjAxNCwgNiwgMikpXG4gKiAvLz0+IDE4M1xuICovXG5mdW5jdGlvbiBnZXREYXlPZlllYXIoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgzLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRpZmYgPSAoMCwgX2luZGV4LmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cykoXG4gICAgX2RhdGUsXG4gICAgKDAsIF9pbmRleDIuc3RhcnRPZlllYXIpKF9kYXRlKSxcbiAgKTtcbiAgY29uc3QgZGF5T2ZZZWFyID0gZGlmZiArIDE7XG4gIHJldHVybiBkYXlPZlllYXI7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0RGF5c0luTW9udGggPSBnZXREYXlzSW5Nb250aDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0RGF5c0luTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIG1vbnRoXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGRheXMgYXJlIGluIEZlYnJ1YXJ5IDIwMDA/XG4gKiBjb25zdCByZXN1bHQgPSBnZXREYXlzSW5Nb250aChuZXcgRGF0ZSgyMDAwLCAxKSlcbiAqIC8vPT4gMjlcbiAqL1xuZnVuY3Rpb24gZ2V0RGF5c0luTW9udGgoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG1vbnRoSW5kZXggPSBfZGF0ZS5nZXRNb250aCgpO1xuICBjb25zdCBsYXN0RGF5T2ZNb250aCA9ICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBsYXN0RGF5T2ZNb250aC5zZXRGdWxsWWVhcih5ZWFyLCBtb250aEluZGV4ICsgMSwgMCk7XG4gIGxhc3REYXlPZk1vbnRoLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gbGFzdERheU9mTW9udGguZ2V0RGF0ZSgpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldERlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnM7XG5cbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldERlZmF1bHRPcHRpb25zXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCBkZWZhdWx0IG9wdGlvbnMuXG4gKiBAcHVyZSBmYWxzZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBkZWZhdWx0cyBmb3JcbiAqIGBvcHRpb25zLmxvY2FsZWAsIGBvcHRpb25zLndlZWtTdGFydHNPbmAgYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWBcbiAqIGFyZ3VtZW50cyBmb3IgYWxsIGZ1bmN0aW9ucy5cbiAqXG4gKiBZb3UgY2FuIGNoYW5nZSB0aGVzZSB3aXRoIFtzZXREZWZhdWx0T3B0aW9uc10oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9zZXREZWZhdWx0T3B0aW9ucykuXG4gKlxuICogQHJldHVybnMgVGhlIGRlZmF1bHQgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByZXN1bHQgPSBnZXREZWZhdWx0T3B0aW9ucygpXG4gKiAvLz0+IHt9XG4gKlxuICogQGV4YW1wbGVcbiAqIHNldERlZmF1bHRPcHRpb25zKHsgd2Vla1N0YXJzT246IDEsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCB9KVxuICogY29uc3QgcmVzdWx0ID0gZ2V0RGVmYXVsdE9wdGlvbnMoKVxuICogLy89PiB7IHdlZWtTdGFyc09uOiAxLCBmaXJzdFdlZWtDb250YWluc0RhdGU6IDQgfVxuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sICgwLCBfaW5kZXguZ2V0RGVmYXVsdE9wdGlvbnMpKCkpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldEhvdXJzID0gZ2V0SG91cnM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldEhvdXJzXG4gKiBAY2F0ZWdvcnkgSG91ciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGhvdXJzIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBob3VycyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGhvdXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEdldCB0aGUgaG91cnMgb2YgMjkgRmVicnVhcnkgMjAxMiAxMTo0NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGdldEhvdXJzKG5ldyBEYXRlKDIwMTIsIDEsIDI5LCAxMSwgNDUpKVxuICogLy89PiAxMVxuICovXG5mdW5jdGlvbiBnZXRIb3VycyhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBob3VycyA9IF9kYXRlLmdldEhvdXJzKCk7XG4gIHJldHVybiBob3Vycztcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRJU09EYXkgPSBnZXRJU09EYXk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldElTT0RheVxuICogQGNhdGVnb3J5IFdlZWtkYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLFxuICogd2hpY2ggaXMgNyBmb3IgU3VuZGF5LCAxIGZvciBNb25kYXkgZXRjLlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGRheSBvZiBJU08gd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBkYXkgb2YgdGhlIElTTyB3ZWVrIGlzIDI2IEZlYnJ1YXJ5IDIwMTI/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09EYXkobmV3IERhdGUoMjAxMiwgMSwgMjYpKVxuICogLy89PiA3XG4gKi9cbmZ1bmN0aW9uIGdldElTT0RheShkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBsZXQgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7XG5cbiAgaWYgKGRheSA9PT0gMCkge1xuICAgIGRheSA9IDc7XG4gIH1cblxuICByZXR1cm4gZGF5O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldElTT1dlZWsgPSBnZXRJU09XZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZklTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZJU09XZWVrWWVhci5qc1wiKTtcbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldElTT1dlZWtcbiAqIEBjYXRlZ29yeSBJU08gV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIElTTyB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBJU08gd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG9mIHRoZSBJU08td2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldElTT1dlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDUzXG4gKi9cbmZ1bmN0aW9uIGdldElTT1dlZWsoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXg0LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGRpZmYgPVxuICAgICsoMCwgX2luZGV4Mi5zdGFydE9mSVNPV2VlaykoX2RhdGUpIC1cbiAgICArKDAsIF9pbmRleDMuc3RhcnRPZklTT1dlZWtZZWFyKShfZGF0ZSk7XG5cbiAgLy8gUm91bmQgdGhlIG51bWJlciBvZiB3ZWVrcyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGJlY2F1c2UgdGhlIG51bWJlciBvZlxuICAvLyBtaWxsaXNlY29uZHMgaW4gYSB3ZWVrIGlzIG5vdCBjb25zdGFudCAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZlxuICAvLyB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpLlxuICByZXR1cm4gTWF0aC5yb3VuZChkaWZmIC8gX2luZGV4Lm1pbGxpc2Vjb25kc0luV2VlaykgKyAxO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldElTT1dlZWtZZWFyID0gZ2V0SVNPV2Vla1llYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZklTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLFxuICogd2hpY2ggYWx3YXlzIHN0YXJ0cyAzIGRheXMgYmVmb3JlIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXkuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCAwLCAyKSlcbiAqIC8vPT4gMjAwNFxuICovXG5mdW5jdGlvbiBnZXRJU09XZWVrWWVhcihkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDMudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgeWVhciA9IF9kYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhciA9ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mTmV4dFllYXIgPSAoMCwgX2luZGV4Mi5zdGFydE9mSVNPV2VlaykoXG4gICAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhcixcbiAgKTtcblxuICBjb25zdCBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyID0gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZlRoaXNZZWFyID0gKDAsIF9pbmRleDIuc3RhcnRPZklTT1dlZWspKFxuICAgIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIsXG4gICk7XG5cbiAgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mTmV4dFllYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0TWludXRlcyA9IGdldE1pbnV0ZXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldE1pbnV0ZXNcbiAqIEBjYXRlZ29yeSBNaW51dGUgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBtaW51dGVzIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBtaW51dGVzIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbWludXRlc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZXQgdGhlIG1pbnV0ZXMgb2YgMjkgRmVicnVhcnkgMjAxMiAxMTo0NTowNTpcbiAqIGNvbnN0IHJlc3VsdCA9IGdldE1pbnV0ZXMobmV3IERhdGUoMjAxMiwgMSwgMjksIDExLCA0NSwgNSkpXG4gKiAvLz0+IDQ1XG4gKi9cbmZ1bmN0aW9uIGdldE1pbnV0ZXMoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgbWludXRlcyA9IF9kYXRlLmdldE1pbnV0ZXMoKTtcbiAgcmV0dXJuIG1pbnV0ZXM7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0TW9udGggPSBnZXRNb250aDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0TW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBtb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG1vbnRoIGluZGV4ICgwLTExKVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBtb250aCBpcyAyOSBGZWJydWFyeSAyMDEyP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0TW9udGgobmV3IERhdGUoMjAxMiwgMSwgMjkpKVxuICogLy89PiAxXG4gKi9cbmZ1bmN0aW9uIGdldE1vbnRoKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IG1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTtcbiAgcmV0dXJuIG1vbnRoO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFF1YXJ0ZXIgPSBnZXRRdWFydGVyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRRdWFydGVyXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHllYXIgcXVhcnRlciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgeWVhciBxdWFydGVyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgcXVhcnRlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBxdWFydGVyIGlzIDIgSnVseSAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0UXVhcnRlcihuZXcgRGF0ZSgyMDE0LCA2LCAyKSlcbiAqIC8vPT4gM1xuICovXG5mdW5jdGlvbiBnZXRRdWFydGVyKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLnRydW5jKF9kYXRlLmdldE1vbnRoKCkgLyAzKSArIDE7XG4gIHJldHVybiBxdWFydGVyO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFNlY29uZHMgPSBnZXRTZWNvbmRzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRTZWNvbmRzXG4gKiBAY2F0ZWdvcnkgU2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgc2Vjb25kcyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgc2Vjb25kcyBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHNlY29uZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2V0IHRoZSBzZWNvbmRzIG9mIDI5IEZlYnJ1YXJ5IDIwMTIgMTE6NDU6MDUuMTIzOlxuICogY29uc3QgcmVzdWx0ID0gZ2V0U2Vjb25kcyhuZXcgRGF0ZSgyMDEyLCAxLCAyOSwgMTEsIDQ1LCA1LCAxMjMpKVxuICogLy89PiA1XG4gKi9cbmZ1bmN0aW9uIGdldFNlY29uZHMoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3Qgc2Vjb25kcyA9IF9kYXRlLmdldFNlY29uZHMoKTtcbiAgcmV0dXJuIHNlY29uZHM7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0VGltZSA9IGdldFRpbWU7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldFRpbWVcbiAqIEBjYXRlZ29yeSBUaW1lc3RhbXAgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBtaWxsaXNlY29uZHMgdGltZXN0YW1wIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBtaWxsaXNlY29uZHMgdGltZXN0YW1wIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgdGltZXN0YW1wXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEdldCB0aGUgdGltZXN0YW1wIG9mIDI5IEZlYnJ1YXJ5IDIwMTIgMTE6NDU6MDUuMTIzOlxuICogY29uc3QgcmVzdWx0ID0gZ2V0VGltZShuZXcgRGF0ZSgyMDEyLCAxLCAyOSwgMTEsIDQ1LCA1LCAxMjMpKVxuICogLy89PiAxMzMwNTE1OTA1MTIzXG4gKi9cbmZ1bmN0aW9uIGdldFRpbWUoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgdGltZXN0YW1wID0gX2RhdGUuZ2V0VGltZSgpO1xuICByZXR1cm4gdGltZXN0YW1wO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFdlZWsgPSBnZXRXZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZldlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZXZWVrWWVhci5qc1wiKTtcbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0V2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGdldFdlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbG9jYWwgd2VlayBpbmRleCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbG9jYWwgd2VlayBpbmRleCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG9mIHRoZSBsb2NhbCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1IHdpdGggZGVmYXVsdCBvcHRpb25zP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2VlayhuZXcgRGF0ZSgyMDA1LCAwLCAyKSlcbiAqIC8vPT4gMlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG9mIHRoZSBsb2NhbCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1LFxuICogLy8gaWYgTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWssXG4gKiAvLyBhbmQgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIgYWx3YXlzIGNvbnRhaW5zIDQgSmFudWFyeT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMiksIHtcbiAqICAgd2Vla1N0YXJ0c09uOiAxLFxuICogICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDRcbiAqIH0pXG4gKiAvLz0+IDUzXG4gKi9cblxuZnVuY3Rpb24gZ2V0V2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDQudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGlmZiA9XG4gICAgKygwLCBfaW5kZXgyLnN0YXJ0T2ZXZWVrKShfZGF0ZSwgb3B0aW9ucykgLVxuICAgICsoMCwgX2luZGV4My5zdGFydE9mV2Vla1llYXIpKF9kYXRlLCBvcHRpb25zKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBfaW5kZXgubWlsbGlzZWNvbmRzSW5XZWVrKSArIDE7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0V2Vla1llYXIgPSBnZXRXZWVrWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zdGFydE9mV2Vlay5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIik7XG5cbi8qKlxuICogVGhlIHtAbGluayBnZXRXZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGdldFdlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIFRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla1llYXIobmV3IERhdGUoMjAwNCwgMTEsIDI2KSlcbiAqIC8vPT4gMjAwNVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB3ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDI2IERlY2VtYmVyIDIwMDQgaWYgd2VlayBzdGFydHMgb24gU2F0dXJkYXk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpLCB7IHdlZWtTdGFydHNPbjogNiB9KVxuICogLy89PiAyMDA0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB0aGUgZmlyc3Qgd2VlayBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpLCB7IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCB9KVxuICogLy89PiAyMDA0XG4gKi9cbmZ1bmN0aW9uIGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4My50b0RhdGUpKGRhdGUpO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcblxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9ICgwLCBfaW5kZXg0LmdldERlZmF1bHRPcHRpb25zKSgpO1xuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IGZpcnN0V2Vla09mTmV4dFllYXIgPSAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEZ1bGxZZWFyKHllYXIgKyAxLCAwLCBmaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICBmaXJzdFdlZWtPZk5leHRZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mTmV4dFllYXIgPSAoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoXG4gICAgZmlyc3RXZWVrT2ZOZXh0WWVhcixcbiAgICBvcHRpb25zLFxuICApO1xuXG4gIGNvbnN0IGZpcnN0V2Vla09mVGhpc1llYXIgPSAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZUaGlzWWVhciA9ICgwLCBfaW5kZXgyLnN0YXJ0T2ZXZWVrKShcbiAgICBmaXJzdFdlZWtPZlRoaXNZZWFyLFxuICAgIG9wdGlvbnMsXG4gICk7XG5cbiAgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mTmV4dFllYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0WWVhciA9IGdldFllYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldFllYXJcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggeWVhciBpcyAyIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFllYXIobmV3IERhdGUoMjAxNCwgNiwgMikpXG4gKiAvLz0+IDIwMTRcbiAqL1xuZnVuY3Rpb24gZ2V0WWVhcihkYXRlKSB7XG4gIHJldHVybiAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSkuZ2V0RnVsbFllYXIoKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc0FmdGVyID0gaXNBZnRlcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNBZnRlclxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZmlyc3QgZGF0ZSBhZnRlciB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIElzIHRoZSBmaXJzdCBkYXRlIGFmdGVyIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdGhhdCBzaG91bGQgYmUgYWZ0ZXIgdGhlIG90aGVyIG9uZSB0byByZXR1cm4gdHJ1ZVxuICogQHBhcmFtIGRhdGVUb0NvbXBhcmUgLSBUaGUgZGF0ZSB0byBjb21wYXJlIHdpdGhcbiAqXG4gKiBAcmV0dXJucyBUaGUgZmlyc3QgZGF0ZSBpcyBhZnRlciB0aGUgc2Vjb25kIGRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSXMgMTAgSnVseSAxOTg5IGFmdGVyIDExIEZlYnJ1YXJ5IDE5ODc/XG4gKiBjb25zdCByZXN1bHQgPSBpc0FmdGVyKG5ldyBEYXRlKDE5ODksIDYsIDEwKSwgbmV3IERhdGUoMTk4NywgMSwgMTEpKVxuICogLy89PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzQWZ0ZXIoZGF0ZSwgZGF0ZVRvQ29tcGFyZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgX2RhdGVUb0NvbXBhcmUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVRvQ29tcGFyZSk7XG4gIHJldHVybiBfZGF0ZS5nZXRUaW1lKCkgPiBfZGF0ZVRvQ29tcGFyZS5nZXRUaW1lKCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNCZWZvcmUgPSBpc0JlZm9yZTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNCZWZvcmVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGZpcnN0IGRhdGUgYmVmb3JlIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSXMgdGhlIGZpcnN0IGRhdGUgYmVmb3JlIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdGhhdCBzaG91bGQgYmUgYmVmb3JlIHRoZSBvdGhlciBvbmUgdG8gcmV0dXJuIHRydWVcbiAqIEBwYXJhbSBkYXRlVG9Db21wYXJlIC0gVGhlIGRhdGUgdG8gY29tcGFyZSB3aXRoXG4gKlxuICogQHJldHVybnMgVGhlIGZpcnN0IGRhdGUgaXMgYmVmb3JlIHRoZSBzZWNvbmQgZGF0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJcyAxMCBKdWx5IDE5ODkgYmVmb3JlIDExIEZlYnJ1YXJ5IDE5ODc/XG4gKiBjb25zdCByZXN1bHQgPSBpc0JlZm9yZShuZXcgRGF0ZSgxOTg5LCA2LCAxMCksIG5ldyBEYXRlKDE5ODcsIDEsIDExKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCZWZvcmUoZGF0ZSwgZGF0ZVRvQ29tcGFyZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgX2RhdGVUb0NvbXBhcmUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVRvQ29tcGFyZSk7XG4gIHJldHVybiArX2RhdGUgPCArX2RhdGVUb0NvbXBhcmU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlOyAvKipcbiAqIEBuYW1lIGlzRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSBkYXRlP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLiBUaGUgZnVuY3Rpb24gd29ya3MgZm9yIGRhdGVzIHRyYW5zZmVycmVkIGFjcm9zcyBpZnJhbWVzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgZGF0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgYSB2YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNEYXRlKG5ldyBEYXRlKCkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGFuIGludmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZShOYU4pKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBzb21lIHZhbHVlOlxuICogY29uc3QgcmVzdWx0ID0gaXNEYXRlKCcyMDE0LTAyLTMxJylcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGFuIG9iamVjdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSh7fSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gXCJbb2JqZWN0IERhdGVdXCIpXG4gICk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNFcXVhbCA9IGlzRXF1YWw7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzRXF1YWxcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBlcXVhbD9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgZXF1YWw/XG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGZpcnN0IGRhdGUgdG8gY29tcGFyZVxuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBzZWNvbmQgZGF0ZSB0byBjb21wYXJlXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGVzIGFyZSBlcXVhbFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMiBKdWx5IDIwMTQgMDY6MzA6NDUuMDAwIGFuZCAyIEp1bHkgMjAxNCAwNjozMDo0NS41MDAgZXF1YWw/XG4gKiBjb25zdCByZXN1bHQgPSBpc0VxdWFsKFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCAyLCA2LCAzMCwgNDUsIDApLFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCAyLCA2LCAzMCwgNDUsIDUwMClcbiAqIClcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNFcXVhbChsZWZ0RGF0ZSwgcmlnaHREYXRlKSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgudG9EYXRlKShsZWZ0RGF0ZSk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSAoMCwgX2luZGV4LnRvRGF0ZSkocmlnaHREYXRlKTtcbiAgcmV0dXJuICtfZGF0ZUxlZnQgPT09ICtfZGF0ZVJpZ2h0O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzU2FtZURheSA9IGlzU2FtZURheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9zdGFydE9mRGF5LmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzU2FtZURheVxuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIGRheSAoYW5kIHllYXIgYW5kIG1vbnRoKT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgZGF5IChhbmQgeWVhciBhbmQgbW9udGgpP1xuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIHNlY29uZCBkYXRlIHRvIGNoZWNrXG5cbiAqIEByZXR1cm5zIFRoZSBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgZGF5IChhbmQgeWVhciBhbmQgbW9udGgpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSA0IFNlcHRlbWJlciAwNjowMDowMCBhbmQgNCBTZXB0ZW1iZXIgMTg6MDA6MDAgaW4gdGhlIHNhbWUgZGF5P1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDQsIDYsIDApLCBuZXcgRGF0ZSgyMDE0LCA4LCA0LCAxOCwgMCkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDQgU2VwdGVtYmVyIGFuZCA0IE9jdG9iZXIgaW4gdGhlIHNhbWUgZGF5P1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lRGF5KG5ldyBEYXRlKDIwMTQsIDgsIDQpLCBuZXcgRGF0ZSgyMDE0LCA5LCA0KSlcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDQgU2VwdGVtYmVyLCAyMDE0IGFuZCA0IFNlcHRlbWJlciwgMjAxNSBpbiB0aGUgc2FtZSBkYXk/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVEYXkobmV3IERhdGUoMjAxNCwgOCwgNCksIG5ldyBEYXRlKDIwMTUsIDgsIDQpKVxuICogLy89PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1NhbWVEYXkoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBkYXRlTGVmdFN0YXJ0T2ZEYXkgPSAoMCwgX2luZGV4LnN0YXJ0T2ZEYXkpKGRhdGVMZWZ0KTtcbiAgY29uc3QgZGF0ZVJpZ2h0U3RhcnRPZkRheSA9ICgwLCBfaW5kZXguc3RhcnRPZkRheSkoZGF0ZVJpZ2h0KTtcblxuICByZXR1cm4gK2RhdGVMZWZ0U3RhcnRPZkRheSA9PT0gK2RhdGVSaWdodFN0YXJ0T2ZEYXk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNTYW1lTW9udGggPSBpc1NhbWVNb250aDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNTYW1lTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIG1vbnRoIChhbmQgeWVhcik/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIG1vbnRoIChhbmQgeWVhcik/XG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgc2Vjb25kIGRhdGUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF0ZXMgYXJlIGluIHRoZSBzYW1lIG1vbnRoIChhbmQgeWVhcilcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDIgU2VwdGVtYmVyIDIwMTQgYW5kIDI1IFNlcHRlbWJlciAyMDE0IGluIHRoZSBzYW1lIG1vbnRoP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiksIG5ldyBEYXRlKDIwMTQsIDgsIDI1KSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMiBTZXB0ZW1iZXIgMjAxNCBhbmQgMjUgU2VwdGVtYmVyIDIwMTUgaW4gdGhlIHNhbWUgbW9udGg/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAyKSwgbmV3IERhdGUoMjAxNSwgOCwgMjUpKVxuICogLy89PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1NhbWVNb250aChkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlTGVmdCk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVJpZ2h0KTtcbiAgcmV0dXJuIChcbiAgICBfZGF0ZUxlZnQuZ2V0RnVsbFllYXIoKSA9PT0gX2RhdGVSaWdodC5nZXRGdWxsWWVhcigpICYmXG4gICAgX2RhdGVMZWZ0LmdldE1vbnRoKCkgPT09IF9kYXRlUmlnaHQuZ2V0TW9udGgoKVxuICApO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzU2FtZVF1YXJ0ZXIgPSBpc1NhbWVRdWFydGVyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZRdWFydGVyLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzU2FtZVF1YXJ0ZXJcbiAqIEBjYXRlZ29yeSBRdWFydGVyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgcXVhcnRlciAoYW5kIHllYXIpP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBxdWFydGVyIChhbmQgeWVhcik/XG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgc2Vjb25kIGRhdGUgdG8gY2hlY2tcblxuICogQHJldHVybnMgVGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSBxdWFydGVyIChhbmQgeWVhcilcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDEgSmFudWFyeSAyMDE0IGFuZCA4IE1hcmNoIDIwMTQgaW4gdGhlIHNhbWUgcXVhcnRlcj9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZVF1YXJ0ZXIobmV3IERhdGUoMjAxNCwgMCwgMSksIG5ldyBEYXRlKDIwMTQsIDIsIDgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAxIEphbnVhcnkgMjAxNCBhbmQgMSBKYW51YXJ5IDIwMTUgaW4gdGhlIHNhbWUgcXVhcnRlcj9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZVF1YXJ0ZXIobmV3IERhdGUoMjAxNCwgMCwgMSksIG5ldyBEYXRlKDIwMTUsIDAsIDEpKVxuICogLy89PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1NhbWVRdWFydGVyKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgZGF0ZUxlZnRTdGFydE9mUXVhcnRlciA9ICgwLCBfaW5kZXguc3RhcnRPZlF1YXJ0ZXIpKGRhdGVMZWZ0KTtcbiAgY29uc3QgZGF0ZVJpZ2h0U3RhcnRPZlF1YXJ0ZXIgPSAoMCwgX2luZGV4LnN0YXJ0T2ZRdWFydGVyKShkYXRlUmlnaHQpO1xuXG4gIHJldHVybiArZGF0ZUxlZnRTdGFydE9mUXVhcnRlciA9PT0gK2RhdGVSaWdodFN0YXJ0T2ZRdWFydGVyO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzU2FtZVllYXIgPSBpc1NhbWVZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc1NhbWVZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIHllYXI/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIHllYXI/XG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgc2Vjb25kIGRhdGUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF0ZXMgYXJlIGluIHRoZSBzYW1lIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDIgU2VwdGVtYmVyIDIwMTQgYW5kIDI1IFNlcHRlbWJlciAyMDE0IGluIHRoZSBzYW1lIHllYXI/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDIpLCBuZXcgRGF0ZSgyMDE0LCA4LCAyNSkpXG4gKiAvLz0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNTYW1lWWVhcihkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IF9kYXRlTGVmdCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlTGVmdCk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZVJpZ2h0KTtcbiAgcmV0dXJuIF9kYXRlTGVmdC5nZXRGdWxsWWVhcigpID09PSBfZGF0ZVJpZ2h0LmdldEZ1bGxZZWFyKCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNWYWxpZCA9IGlzVmFsaWQ7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vaXNEYXRlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNWYWxpZFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gZGF0ZSB2YWxpZD9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgZmFsc2UgaWYgYXJndW1lbnQgaXMgSW52YWxpZCBEYXRlIGFuZCB0cnVlIG90aGVyd2lzZS5cbiAqIEFyZ3VtZW50IGlzIGNvbnZlcnRlZCB0byBEYXRlIHVzaW5nIGB0b0RhdGVgLiBTZWUgW3RvRGF0ZV0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy90b0RhdGUpXG4gKiBJbnZhbGlkIERhdGUgaXMgYSBEYXRlLCB3aG9zZSB0aW1lIHZhbHVlIGlzIE5hTi5cbiAqXG4gKiBUaW1lIHZhbHVlIG9mIERhdGU6IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuOS4xLjFcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGUgaXMgdmFsaWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZChuZXcgRGF0ZSgyMDE0LCAxLCAzMSkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWx1ZSwgY29udmVydGFibGUgaW50byBhIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKDEzOTM4MDQ4MDAwMDApXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKG5ldyBEYXRlKCcnKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZChkYXRlKSB7XG4gIGlmICghKDAsIF9pbmRleC5pc0RhdGUpKGRhdGUpICYmIHR5cGVvZiBkYXRlICE9PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlKTtcbiAgcmV0dXJuICFpc05hTihOdW1iZXIoX2RhdGUpKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc1dpdGhpbkludGVydmFsID0gaXNXaXRoaW5JbnRlcnZhbDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNXaXRoaW5JbnRlcnZhbFxuICogQGNhdGVnb3J5IEludGVydmFsIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBnaXZlbiBkYXRlIHdpdGhpbiB0aGUgaW50ZXJ2YWw/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJcyB0aGUgZ2l2ZW4gZGF0ZSB3aXRoaW4gdGhlIGludGVydmFsPyAoSW5jbHVkaW5nIHN0YXJ0IGFuZCBlbmQuKVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSBpbnRlcnZhbCAtIFRoZSBpbnRlcnZhbCB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIFRoZSBkYXRlIGlzIHdpdGhpbiB0aGUgaW50ZXJ2YWxcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSBkYXRlIHdpdGhpbiB0aGUgaW50ZXJ2YWw6XG4gKiBpc1dpdGhpbkludGVydmFsKG5ldyBEYXRlKDIwMTQsIDAsIDMpLCB7XG4gKiAgIHN0YXJ0OiBuZXcgRGF0ZSgyMDE0LCAwLCAxKSxcbiAqICAgZW5kOiBuZXcgRGF0ZSgyMDE0LCAwLCA3KVxuICogfSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIGRhdGUgb3V0c2lkZSBvZiB0aGUgaW50ZXJ2YWw6XG4gKiBpc1dpdGhpbkludGVydmFsKG5ldyBEYXRlKDIwMTQsIDAsIDEwKSwge1xuICogICBzdGFydDogbmV3IERhdGUoMjAxNCwgMCwgMSksXG4gKiAgIGVuZDogbmV3IERhdGUoMjAxNCwgMCwgNylcbiAqIH0pXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBkYXRlIGVxdWFsIHRvIGludGVydmFsIHN0YXJ0OlxuICogaXNXaXRoaW5JbnRlcnZhbChkYXRlLCB7IHN0YXJ0LCBlbmQ6IGRhdGUgfSlcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGRhdGUgZXF1YWwgdG8gaW50ZXJ2YWwgZW5kOlxuICogaXNXaXRoaW5JbnRlcnZhbChkYXRlLCB7IHN0YXJ0OiBkYXRlLCBlbmQgfSlcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNXaXRoaW5JbnRlcnZhbChkYXRlLCBpbnRlcnZhbCkge1xuICBjb25zdCB0aW1lID0gKygwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgW3N0YXJ0VGltZSwgZW5kVGltZV0gPSBbXG4gICAgKygwLCBfaW5kZXgudG9EYXRlKShpbnRlcnZhbC5zdGFydCksXG4gICAgKygwLCBfaW5kZXgudG9EYXRlKShpbnRlcnZhbC5lbmQpLFxuICBdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcblxuICByZXR1cm4gdGltZSA+PSBzdGFydFRpbWUgJiYgdGltZSA8PSBlbmRUaW1lO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmJ1aWxkRm9ybWF0TG9uZ0ZuID0gYnVpbGRGb3JtYXRMb25nRm47XG5cbmZ1bmN0aW9uIGJ1aWxkRm9ybWF0TG9uZ0ZuKGFyZ3MpIHtcbiAgcmV0dXJuIChvcHRpb25zID0ge30pID0+IHtcbiAgICAvLyBUT0RPOiBSZW1vdmUgU3RyaW5nKClcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICBjb25zdCBmb3JtYXQgPSBhcmdzLmZvcm1hdHNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0c1thcmdzLmRlZmF1bHRXaWR0aF07XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5idWlsZExvY2FsaXplRm4gPSBidWlsZExvY2FsaXplRm47IC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cbi8qKlxuICogVGhlIGxvY2FsaXplIGZ1bmN0aW9uIGFyZ3VtZW50IGNhbGxiYWNrIHdoaWNoIGFsbG93cyB0byBjb252ZXJ0IHJhdyB2YWx1ZSB0b1xuICogdGhlIGFjdHVhbCB0eXBlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gKlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCB2YWx1ZVxuICovXG5cbi8qKlxuICogVGhlIG1hcCBvZiBsb2NhbGl6ZWQgdmFsdWVzIGZvciBlYWNoIHdpZHRoLlxuICovXG5cbi8qKlxuICogVGhlIGluZGV4IHR5cGUgb2YgdGhlIGxvY2FsZSB1bml0IHZhbHVlLiBJdCB0eXBlcyBjb252ZXJzaW9uIG9mIHVuaXRzIG9mXG4gKiB2YWx1ZXMgdGhhdCBkb24ndCBzdGFydCBhdCAwIChpLmUuIHF1YXJ0ZXJzKS5cbiAqL1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSB1bml0IHZhbHVlIHRvIHRoZSB0dXBsZSBvZiB2YWx1ZXMuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIGVyYSB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgQkMsXG4gKiB0aGUgc2Vjb25kIGVsZW1lbnQgcmVwcmVzZW50cyBBRC5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgcXVhcnRlciB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgUTEuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIGRheSB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgU3VuZGF5LlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBtb250aCB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgSmFudWFyeS5cbiAqL1xuXG5mdW5jdGlvbiBidWlsZExvY2FsaXplRm4oYXJncykge1xuICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPyBTdHJpbmcob3B0aW9ucy5jb250ZXh0KSA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgbGV0IHZhbHVlc0FycmF5O1xuICAgIGlmIChjb250ZXh0ID09PSBcImZvcm1hdHRpbmdcIiAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdEZvcm1hdHRpbmdXaWR0aCB8fCBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBkZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID1cbiAgICAgICAgYXJncy5mb3JtYXR0aW5nVmFsdWVzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbZGVmYXVsdFdpZHRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID0gYXJncy52YWx1ZXNbd2lkdGhdIHx8IGFyZ3MudmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEZvciBzb21lIHJlYXNvbiBUeXBlU2NyaXB0IGp1c3QgZG9uJ3Qgd2FudCB0byBtYXRjaCBpdCwgbm8gbWF0dGVyIGhvdyBoYXJkIHdlIHRyeS4gSSBjaGFsbGVuZ2UgeW91IHRvIHRyeSB0byByZW1vdmUgaXQhXG4gICAgcmV0dXJuIHZhbHVlc0FycmF5W2luZGV4XTtcbiAgfTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5idWlsZE1hdGNoRm4gPSBidWlsZE1hdGNoRm47XG5cbmZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGg7XG5cbiAgICBjb25zdCBtYXRjaFBhdHRlcm4gPVxuICAgICAgKHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0pIHx8XG4gICAgICBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2gobWF0Y2hQYXR0ZXJuKTtcblxuICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVBhdHRlcm5zID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLnBhcnNlUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuXG4gICAgY29uc3Qga2V5ID0gQXJyYXkuaXNBcnJheShwYXJzZVBhdHRlcm5zKVxuICAgICAgPyBmaW5kSW5kZXgocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSlcbiAgICAgIDogLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gSSBjaGFsbGFuZ2UgeW91IHRvIGZpeCB0aGUgdHlwZVxuICAgICAgICBmaW5kS2V5KHBhcnNlUGF0dGVybnMsIChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QobWF0Y2hlZFN0cmluZykpO1xuXG4gICAgbGV0IHZhbHVlO1xuXG4gICAgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2sgPyBhcmdzLnZhbHVlQ2FsbGJhY2soa2V5KSA6IGtleTtcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFja1xuICAgICAgPyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBJIGNoYWxsYW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgICAgIG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSlcbiAgICAgIDogdmFsdWU7XG5cbiAgICBjb25zdCByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcblxuICAgIHJldHVybiB7IHZhbHVlLCByZXN0IH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKFxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJlxuICAgICAgcHJlZGljYXRlKG9iamVjdFtrZXldKVxuICAgICkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgZm9yIChsZXQga2V5ID0gMDsga2V5IDwgYXJyYXkubGVuZ3RoOyBrZXkrKykge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlba2V5XSkpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYnVpbGRNYXRjaFBhdHRlcm5GbiA9IGJ1aWxkTWF0Y2hQYXR0ZXJuRm47XG5cbmZ1bmN0aW9uIGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oYXJncykge1xuICByZXR1cm4gKHN0cmluZywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5tYXRjaFBhdHRlcm4pO1xuICAgIGlmICghbWF0Y2hSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcblxuICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MucGFyc2VQYXR0ZXJuKTtcbiAgICBpZiAoIXBhcnNlUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBsZXQgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gYXJncy52YWx1ZUNhbGxiYWNrKHBhcnNlUmVzdWx0WzBdKVxuICAgICAgOiBwYXJzZVJlc3VsdFswXTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIEkgY2hhbGxhbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5lblVTID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2VuLVVTL19saWIvZm9ybWF0RGlzdGFuY2UuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2VuLVVTL19saWIvZm9ybWF0TG9uZy5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vZW4tVVMvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qc1wiKTtcbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vZW4tVVMvX2xpYi9sb2NhbGl6ZS5qc1wiKTtcbnZhciBfaW5kZXg1ID0gcmVxdWlyZShcIi4vZW4tVVMvX2xpYi9tYXRjaC5qc1wiKTtcblxuLyoqXG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgRW5nbGlzaCBsb2NhbGUgKFVuaXRlZCBTdGF0ZXMpLlxuICogQGxhbmd1YWdlIEVuZ2xpc2hcbiAqIEBpc28tNjM5LTIgZW5nXG4gKiBAYXV0aG9yIFNhc2hhIEtvc3MgW0Brb3Nzbm9jb3JwXShodHRwczovL2dpdGh1Yi5jb20va29zc25vY29ycClcbiAqIEBhdXRob3IgTGVzaGEgS29zcyBbQGxlc2hha29zc10oaHR0cHM6Ly9naXRodWIuY29tL2xlc2hha29zcylcbiAqL1xuY29uc3QgZW5VUyA9IChleHBvcnRzLmVuVVMgPSB7XG4gIGNvZGU6IFwiZW4tVVNcIixcbiAgZm9ybWF0RGlzdGFuY2U6IF9pbmRleC5mb3JtYXREaXN0YW5jZSxcbiAgZm9ybWF0TG9uZzogX2luZGV4Mi5mb3JtYXRMb25nLFxuICBmb3JtYXRSZWxhdGl2ZTogX2luZGV4My5mb3JtYXRSZWxhdGl2ZSxcbiAgbG9jYWxpemU6IF9pbmRleDQubG9jYWxpemUsXG4gIG1hdGNoOiBfaW5kZXg1Lm1hdGNoLFxuICBvcHRpb25zOiB7XG4gICAgd2Vla1N0YXJ0c09uOiAwIC8qIFN1bmRheSAqLyxcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGU6IDEsXG4gIH0sXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5mb3JtYXREaXN0YW5jZSA9IHZvaWQgMDtcblxuY29uc3QgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6IFwibGVzcyB0aGFuIGEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwibGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzXCIsXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBvbmU6IFwiMSBzZWNvbmRcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIGhhbGZBTWludXRlOiBcImhhbGYgYSBtaW51dGVcIixcblxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlc1wiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIjEgbWludXRlXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCJhYm91dCAxIGhvdXJcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gaG91cnNcIixcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBvbmU6IFwiMSBob3VyXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeERheXM6IHtcbiAgICBvbmU6IFwiMSBkYXlcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gZGF5c1wiLFxuICB9LFxuXG4gIGFib3V0WFdlZWtzOiB7XG4gICAgb25lOiBcImFib3V0IDEgd2Vla1wiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB3ZWVrc1wiLFxuICB9LFxuXG4gIHhXZWVrczoge1xuICAgIG9uZTogXCIxIHdlZWtcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICBhYm91dFhNb250aHM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBtb250aFwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSBtb250aHNcIixcbiAgfSxcblxuICB4TW9udGhzOiB7XG4gICAgb25lOiBcIjEgbW9udGhcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgeFllYXJzOiB7XG4gICAgb25lOiBcIjEgeWVhclwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIG92ZXJYWWVhcnM6IHtcbiAgICBvbmU6IFwib3ZlciAxIHllYXJcIixcbiAgICBvdGhlcjogXCJvdmVyIHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogXCJhbG1vc3QgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWxtb3N0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxufTtcblxuY29uc3QgZm9ybWF0RGlzdGFuY2UgPSAodG9rZW4sIGNvdW50LCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQ7XG5cbiAgY29uc3QgdG9rZW5WYWx1ZSA9IGZvcm1hdERpc3RhbmNlTG9jYWxlW3Rva2VuXTtcbiAgaWYgKHR5cGVvZiB0b2tlblZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZTtcbiAgfSBlbHNlIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub25lO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub3RoZXIucmVwbGFjZShcInt7Y291bnR9fVwiLCBjb3VudC50b1N0cmluZygpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5hZGRTdWZmaXgpIHtcbiAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHtcbiAgICAgIHJldHVybiBcImluIFwiICsgcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgXCIgYWdvXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnRzLmZvcm1hdERpc3RhbmNlID0gZm9ybWF0RGlzdGFuY2U7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZm9ybWF0TG9uZyA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vX2xpYi9idWlsZEZvcm1hdExvbmdGbi5qc1wiKTtcblxuY29uc3QgZGF0ZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiRUVFRSwgTU1NTSBkbywgeVwiLFxuICBsb25nOiBcIk1NTU0gZG8sIHlcIixcbiAgbWVkaXVtOiBcIk1NTSBkLCB5XCIsXG4gIHNob3J0OiBcIk1NL2RkL3l5eXlcIixcbn07XG5cbmNvbnN0IHRpbWVGb3JtYXRzID0ge1xuICBmdWxsOiBcImg6bW06c3MgYSB6enp6XCIsXG4gIGxvbmc6IFwiaDptbTpzcyBhIHpcIixcbiAgbWVkaXVtOiBcImg6bW06c3MgYVwiLFxuICBzaG9ydDogXCJoOm1tIGFcIixcbn07XG5cbmNvbnN0IGRhdGVUaW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJ7e2RhdGV9fSAnYXQnIHt7dGltZX19XCIsXG4gIGxvbmc6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBtZWRpdW06IFwie3tkYXRlfX0sIHt7dGltZX19XCIsXG4gIHNob3J0OiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxufTtcblxuY29uc3QgZm9ybWF0TG9uZyA9IChleHBvcnRzLmZvcm1hdExvbmcgPSB7XG4gIGRhdGU6ICgwLCBfaW5kZXguYnVpbGRGb3JtYXRMb25nRm4pKHtcbiAgICBmb3JtYXRzOiBkYXRlRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcblxuICB0aW1lOiAoMCwgX2luZGV4LmJ1aWxkRm9ybWF0TG9uZ0ZuKSh7XG4gICAgZm9ybWF0czogdGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgZGF0ZVRpbWU6ICgwLCBfaW5kZXguYnVpbGRGb3JtYXRMb25nRm4pKHtcbiAgICBmb3JtYXRzOiBkYXRlVGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5mb3JtYXRSZWxhdGl2ZSA9IHZvaWQgMDtcblxuY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcIidsYXN0JyBlZWVlICdhdCcgcFwiLFxuICB5ZXN0ZXJkYXk6IFwiJ3llc3RlcmRheSBhdCcgcFwiLFxuICB0b2RheTogXCIndG9kYXkgYXQnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ3RvbW9ycm93IGF0JyBwXCIsXG4gIG5leHRXZWVrOiBcImVlZWUgJ2F0JyBwXCIsXG4gIG90aGVyOiBcIlBcIixcbn07XG5cbmNvbnN0IGZvcm1hdFJlbGF0aXZlID0gKHRva2VuLCBfZGF0ZSwgX2Jhc2VEYXRlLCBfb3B0aW9ucykgPT5cbiAgZm9ybWF0UmVsYXRpdmVMb2NhbGVbdG9rZW5dO1xuZXhwb3J0cy5mb3JtYXRSZWxhdGl2ZSA9IGZvcm1hdFJlbGF0aXZlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmxvY2FsaXplID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi9fbGliL2J1aWxkTG9jYWxpemVGbi5qc1wiKTtcblxuY29uc3QgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkJcIiwgXCJBXCJdLFxuICBhYmJyZXZpYXRlZDogW1wiQkNcIiwgXCJBRFwiXSxcbiAgd2lkZTogW1wiQmVmb3JlIENocmlzdFwiLCBcIkFubm8gRG9taW5pXCJdLFxufTtcblxuY29uc3QgcXVhcnRlclZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCJdLFxuICBhYmJyZXZpYXRlZDogW1wiUTFcIiwgXCJRMlwiLCBcIlEzXCIsIFwiUTRcIl0sXG4gIHdpZGU6IFtcIjFzdCBxdWFydGVyXCIsIFwiMm5kIHF1YXJ0ZXJcIiwgXCIzcmQgcXVhcnRlclwiLCBcIjR0aCBxdWFydGVyXCJdLFxufTtcblxuLy8gTm90ZTogaW4gRW5nbGlzaCwgdGhlIG5hbWVzIG9mIGRheXMgb2YgdGhlIHdlZWsgYW5kIG1vbnRocyBhcmUgY2FwaXRhbGl6ZWQuXG4vLyBJZiB5b3UgYXJlIG1ha2luZyBhIG5ldyBsb2NhbGUgYmFzZWQgb24gdGhpcyBvbmUsIGNoZWNrIGlmIHRoZSBzYW1lIGlzIHRydWUgZm9yIHRoZSBsYW5ndWFnZSB5b3UncmUgd29ya2luZyBvbi5cbi8vIEdlbmVyYWxseSwgZm9ybWF0dGVkIGRhdGVzIHNob3VsZCBsb29rIGxpa2UgdGhleSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbnRlbmNlLFxuLy8gZS5nLiBpbiBTcGFuaXNoIGxhbmd1YWdlIHRoZSB3ZWVrZGF5cyBhbmQgbW9udGhzIHNob3VsZCBiZSBpbiB0aGUgbG93ZXJjYXNlLlxuY29uc3QgbW9udGhWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiSlwiLCBcIkZcIiwgXCJNXCIsIFwiQVwiLCBcIk1cIiwgXCJKXCIsIFwiSlwiLCBcIkFcIiwgXCJTXCIsIFwiT1wiLCBcIk5cIiwgXCJEXCJdLFxuICBhYmJyZXZpYXRlZDogW1xuICAgIFwiSmFuXCIsXG4gICAgXCJGZWJcIixcbiAgICBcIk1hclwiLFxuICAgIFwiQXByXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1blwiLFxuICAgIFwiSnVsXCIsXG4gICAgXCJBdWdcIixcbiAgICBcIlNlcFwiLFxuICAgIFwiT2N0XCIsXG4gICAgXCJOb3ZcIixcbiAgICBcIkRlY1wiLFxuICBdLFxuXG4gIHdpZGU6IFtcbiAgICBcIkphbnVhcnlcIixcbiAgICBcIkZlYnJ1YXJ5XCIsXG4gICAgXCJNYXJjaFwiLFxuICAgIFwiQXByaWxcIixcbiAgICBcIk1heVwiLFxuICAgIFwiSnVuZVwiLFxuICAgIFwiSnVseVwiLFxuICAgIFwiQXVndXN0XCIsXG4gICAgXCJTZXB0ZW1iZXJcIixcbiAgICBcIk9jdG9iZXJcIixcbiAgICBcIk5vdmVtYmVyXCIsXG4gICAgXCJEZWNlbWJlclwiLFxuICBdLFxufTtcblxuY29uc3QgZGF5VmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIlNcIiwgXCJNXCIsIFwiVFwiLCBcIldcIiwgXCJUXCIsIFwiRlwiLCBcIlNcIl0sXG4gIHNob3J0OiBbXCJTdVwiLCBcIk1vXCIsIFwiVHVcIiwgXCJXZVwiLCBcIlRoXCIsIFwiRnJcIiwgXCJTYVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXSxcbiAgd2lkZTogW1xuICAgIFwiU3VuZGF5XCIsXG4gICAgXCJNb25kYXlcIixcbiAgICBcIlR1ZXNkYXlcIixcbiAgICBcIldlZG5lc2RheVwiLFxuICAgIFwiVGh1cnNkYXlcIixcbiAgICBcIkZyaWRheVwiLFxuICAgIFwiU2F0dXJkYXlcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwiYVwiLFxuICAgIHBtOiBcInBcIixcbiAgICBtaWRuaWdodDogXCJtaVwiLFxuICAgIG5vb246IFwiblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIkFNXCIsXG4gICAgcG06IFwiUE1cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwiYS5tLlwiLFxuICAgIHBtOiBcInAubS5cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxufTtcblxuY29uc3QgZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwiYVwiLFxuICAgIHBtOiBcInBcIixcbiAgICBtaWRuaWdodDogXCJtaVwiLFxuICAgIG5vb246IFwiblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIkFNXCIsXG4gICAgcG06IFwiUE1cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwiYS5tLlwiLFxuICAgIHBtOiBcInAubS5cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxufTtcblxuY29uc3Qgb3JkaW5hbE51bWJlciA9IChkaXJ0eU51bWJlciwgX29wdGlvbnMpID0+IHtcbiAgY29uc3QgbnVtYmVyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTtcblxuICAvLyBJZiBvcmRpbmFsIG51bWJlcnMgZGVwZW5kIG9uIGNvbnRleHQsIGZvciBleGFtcGxlLFxuICAvLyBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBncmFtbWF0aWNhbCBnZW5kZXJzLFxuICAvLyB1c2UgYG9wdGlvbnMudW5pdGAuXG4gIC8vXG4gIC8vIGB1bml0YCBjYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RhdGUnLCAnZGF5T2ZZZWFyJyxcbiAgLy8gJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLlxuXG4gIGNvbnN0IHJlbTEwMCA9IG51bWJlciAlIDEwMDtcbiAgaWYgKHJlbTEwMCA+IDIwIHx8IHJlbTEwMCA8IDEwKSB7XG4gICAgc3dpdGNoIChyZW0xMDAgJSAxMCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJzdFwiO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJuZFwiO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJyZFwiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVtYmVyICsgXCJ0aFwiO1xufTtcblxuY29uc3QgbG9jYWxpemUgPSAoZXhwb3J0cy5sb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcixcblxuICBlcmE6ICgwLCBfaW5kZXguYnVpbGRMb2NhbGl6ZUZuKSh7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogKDAsIF9pbmRleC5idWlsZExvY2FsaXplRm4pKHtcbiAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBhcmd1bWVudENhbGxiYWNrOiAocXVhcnRlcikgPT4gcXVhcnRlciAtIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiAoMCwgX2luZGV4LmJ1aWxkTG9jYWxpemVGbikoe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5OiAoMCwgX2luZGV4LmJ1aWxkTG9jYWxpemVGbikoe1xuICAgIHZhbHVlczogZGF5VmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogKDAsIF9pbmRleC5idWlsZExvY2FsaXplRm4pKHtcbiAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGZvcm1hdHRpbmdWYWx1ZXM6IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMubWF0Y2ggPSB2b2lkIDA7XG5cbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoRm4uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanNcIik7XG5cbmNvbnN0IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXihcXGQrKSh0aHxzdHxuZHxyZCk/L2k7XG5jb25zdCBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL1xcZCsvaTtcblxuY29uc3QgbWF0Y2hFcmFQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihifGEpL2ksXG4gIGFiYnJldmlhdGVkOiAvXihiXFwuP1xccz9jXFwuP3xiXFwuP1xccz9jXFwuP1xccz9lXFwuP3xhXFwuP1xccz9kXFwuP3xjXFwuP1xccz9lXFwuPykvaSxcbiAgd2lkZTogL14oYmVmb3JlIGNocmlzdHxiZWZvcmUgY29tbW9uIGVyYXxhbm5vIGRvbWluaXxjb21tb24gZXJhKS9pLFxufTtcbmNvbnN0IHBhcnNlRXJhUGF0dGVybnMgPSB7XG4gIGFueTogWy9eYi9pLCAvXihhfGMpL2ldLFxufTtcblxuY29uc3QgbWF0Y2hRdWFydGVyUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bMTIzNF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9ecVsxMjM0XS9pLFxuICB3aWRlOiAvXlsxMjM0XSh0aHxzdHxuZHxyZCk/IHF1YXJ0ZXIvaSxcbn07XG5jb25zdCBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgYW55OiBbLzEvaSwgLzIvaSwgLzMvaSwgLzQvaV0sXG59O1xuXG5jb25zdCBtYXRjaE1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bamZtYXNvbmRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXihqYW58ZmVifG1hcnxhcHJ8bWF5fGp1bnxqdWx8YXVnfHNlcHxvY3R8bm92fGRlYykvaSxcbiAgd2lkZTogL14oamFudWFyeXxmZWJydWFyeXxtYXJjaHxhcHJpbHxtYXl8anVuZXxqdWx5fGF1Z3VzdHxzZXB0ZW1iZXJ8b2N0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcikvaSxcbn07XG5jb25zdCBwYXJzZU1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogW1xuICAgIC9eai9pLFxuICAgIC9eZi9pLFxuICAgIC9ebS9pLFxuICAgIC9eYS9pLFxuICAgIC9ebS9pLFxuICAgIC9eai9pLFxuICAgIC9eai9pLFxuICAgIC9eYS9pLFxuICAgIC9ecy9pLFxuICAgIC9eby9pLFxuICAgIC9ebi9pLFxuICAgIC9eZC9pLFxuICBdLFxuXG4gIGFueTogW1xuICAgIC9eamEvaSxcbiAgICAvXmYvaSxcbiAgICAvXm1hci9pLFxuICAgIC9eYXAvaSxcbiAgICAvXm1heS9pLFxuICAgIC9eanVuL2ksXG4gICAgL15qdWwvaSxcbiAgICAvXmF1L2ksXG4gICAgL15zL2ksXG4gICAgL15vL2ksXG4gICAgL15uL2ksXG4gICAgL15kL2ksXG4gIF0sXG59O1xuXG5jb25zdCBtYXRjaERheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eW3NtdHdmXS9pLFxuICBzaG9ydDogL14oc3V8bW98dHV8d2V8dGh8ZnJ8c2EpL2ksXG4gIGFiYnJldmlhdGVkOiAvXihzdW58bW9ufHR1ZXx3ZWR8dGh1fGZyaXxzYXQpL2ksXG4gIHdpZGU6IC9eKHN1bmRheXxtb25kYXl8dHVlc2RheXx3ZWRuZXNkYXl8dGh1cnNkYXl8ZnJpZGF5fHNhdHVyZGF5KS9pLFxufTtcbmNvbnN0IHBhcnNlRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogWy9ecy9pLCAvXm0vaSwgL150L2ksIC9edy9pLCAvXnQvaSwgL15mL2ksIC9ecy9pXSxcbiAgYW55OiBbL15zdS9pLCAvXm0vaSwgL150dS9pLCAvXncvaSwgL150aC9pLCAvXmYvaSwgL15zYS9pXSxcbn07XG5cbmNvbnN0IG1hdGNoRGF5UGVyaW9kUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oYXxwfG1pfG58KGluIHRoZXxhdCkgKG1vcm5pbmd8YWZ0ZXJub29ufGV2ZW5pbmd8bmlnaHQpKS9pLFxuICBhbnk6IC9eKFthcF1cXC4/XFxzP21cXC4/fG1pZG5pZ2h0fG5vb258KGluIHRoZXxhdCkgKG1vcm5pbmd8YWZ0ZXJub29ufGV2ZW5pbmd8bmlnaHQpKS9pLFxufTtcbmNvbnN0IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMgPSB7XG4gIGFueToge1xuICAgIGFtOiAvXmEvaSxcbiAgICBwbTogL15wL2ksXG4gICAgbWlkbmlnaHQ6IC9ebWkvaSxcbiAgICBub29uOiAvXm5vL2ksXG4gICAgbW9ybmluZzogL21vcm5pbmcvaSxcbiAgICBhZnRlcm5vb246IC9hZnRlcm5vb24vaSxcbiAgICBldmVuaW5nOiAvZXZlbmluZy9pLFxuICAgIG5pZ2h0OiAvbmlnaHQvaSxcbiAgfSxcbn07XG5cbmNvbnN0IG1hdGNoID0gKGV4cG9ydHMubWF0Y2ggPSB7XG4gIG9yZGluYWxOdW1iZXI6ICgwLCBfaW5kZXgyLmJ1aWxkTWF0Y2hQYXR0ZXJuRm4pKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZSkgPT4gcGFyc2VJbnQodmFsdWUsIDEwKSxcbiAgfSksXG5cbiAgZXJhOiAoMCwgX2luZGV4LmJ1aWxkTWF0Y2hGbikoe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6ICgwLCBfaW5kZXguYnVpbGRNYXRjaEZuKSh7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleCkgPT4gaW5kZXggKyAxLFxuICB9KSxcblxuICBtb250aDogKDAsIF9pbmRleC5idWlsZE1hdGNoRm4pKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaE1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5OiAoMCwgX2luZGV4LmJ1aWxkTWF0Y2hGbikoe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogKDAsIF9pbmRleC5idWlsZE1hdGNoRm4pKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcImFueVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMubWF4ID0gbWF4O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBtYXhcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBsYXRlc3Qgb2YgdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBsYXRlc3Qgb2YgdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlcyAtIFRoZSBkYXRlcyB0byBjb21wYXJlXG4gKlxuICogQHJldHVybnMgVGhlIGxhdGVzdCBvZiB0aGUgZGF0ZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggb2YgdGhlc2UgZGF0ZXMgaXMgdGhlIGxhdGVzdD9cbiAqIGNvbnN0IHJlc3VsdCA9IG1heChbXG4gKiAgIG5ldyBEYXRlKDE5ODksIDYsIDEwKSxcbiAqICAgbmV3IERhdGUoMTk4NywgMSwgMTEpLFxuICogICBuZXcgRGF0ZSgxOTk1LCA2LCAyKSxcbiAqICAgbmV3IERhdGUoMTk5MCwgMCwgMSlcbiAqIF0pXG4gKiAvLz0+IFN1biBKdWwgMDIgMTk5NSAwMDowMDowMFxuICovXG5mdW5jdGlvbiBtYXgoZGF0ZXMpIHtcbiAgbGV0IHJlc3VsdDtcbiAgZGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlydHlEYXRlKSB7XG4gICAgY29uc3QgY3VycmVudERhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGlydHlEYXRlKTtcblxuICAgIGlmIChcbiAgICAgIHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICByZXN1bHQgPCBjdXJyZW50RGF0ZSB8fFxuICAgICAgaXNOYU4oTnVtYmVyKGN1cnJlbnREYXRlKSlcbiAgICApIHtcbiAgICAgIHJlc3VsdCA9IGN1cnJlbnREYXRlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdCB8fCBuZXcgRGF0ZShOYU4pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLm1pbiA9IG1pbjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgbWluXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGVhcmxpZXN0IG9mIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgdGhlIGVhcmxpZXN0IG9mIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZXMgLSBUaGUgZGF0ZXMgdG8gY29tcGFyZVxuICpcbiAqIEByZXR1cm5zIFRoZSBlYXJsaWVzdCBvZiB0aGUgZGF0ZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggb2YgdGhlc2UgZGF0ZXMgaXMgdGhlIGVhcmxpZXN0P1xuICogY29uc3QgcmVzdWx0ID0gbWluKFtcbiAqICAgbmV3IERhdGUoMTk4OSwgNiwgMTApLFxuICogICBuZXcgRGF0ZSgxOTg3LCAxLCAxMSksXG4gKiAgIG5ldyBEYXRlKDE5OTUsIDYsIDIpLFxuICogICBuZXcgRGF0ZSgxOTkwLCAwLCAxKVxuICogXSlcbiAqIC8vPT4gV2VkIEZlYiAxMSAxOTg3IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIG1pbihkYXRlcykge1xuICBsZXQgcmVzdWx0O1xuXG4gIGRhdGVzLmZvckVhY2goKGRpcnR5RGF0ZSkgPT4ge1xuICAgIGNvbnN0IGRhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGlydHlEYXRlKTtcbiAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQgPiBkYXRlIHx8IGlzTmFOKCtkYXRlKSkge1xuICAgICAgcmVzdWx0ID0gZGF0ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQgfHwgbmV3IERhdGUoTmFOKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibG9uZ0Zvcm1hdHRlcnNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2luZGV4NS5sb25nRm9ybWF0dGVycztcbiAgfSxcbn0pO1xuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicGFyc2Vyc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfaW5kZXg3LnBhcnNlcnM7XG4gIH0sXG59KTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9nZXREZWZhdWx0T3B0aW9ucy5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0TG9jYWxlLmpzXCIpO1xudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbnZhciBfaW5kZXg1ID0gcmVxdWlyZShcIi4vX2xpYi9mb3JtYXQvbG9uZ0Zvcm1hdHRlcnMuanNcIik7XG52YXIgX2luZGV4NiA9IHJlcXVpcmUoXCIuL19saWIvcHJvdGVjdGVkVG9rZW5zLmpzXCIpO1xuXG52YXIgX2luZGV4NyA9IHJlcXVpcmUoXCIuL3BhcnNlL19saWIvcGFyc2Vycy5qc1wiKTtcblxudmFyIF9TZXR0ZXIgPSByZXF1aXJlKFwiLi9wYXJzZS9fbGliL1NldHRlci5qc1wiKTtcblxuLy8gUmV4cG9ydHMgb2YgaW50ZXJuYWwgZm9yIGxpYnJhcmllcyB0byB1c2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzYzOCNpc3N1ZWNvbW1lbnQtMTg3NzA4Mjg3NFxuXG4vKipcbiAqIFRoZSB7QGxpbmsgcGFyc2V9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLy8gVGhpcyBSZWdFeHAgY29uc2lzdHMgb2YgdGhyZWUgcGFydHMgc2VwYXJhdGVkIGJ5IGB8YDpcbi8vIC0gW3lZUXFNTHdJZERlY2loSEtrbXNdbyBtYXRjaGVzIGFueSBhdmFpbGFibGUgb3JkaW5hbCBudW1iZXIgdG9rZW5cbi8vICAgKG9uZSBvZiB0aGUgY2VydGFpbiBsZXR0ZXJzIGZvbGxvd2VkIGJ5IGBvYClcbi8vIC0gKFxcdylcXDEqIG1hdGNoZXMgYW55IHNlcXVlbmNlcyBvZiB0aGUgc2FtZSBsZXR0ZXJcbi8vIC0gJycgbWF0Y2hlcyB0d28gcXVvdGUgY2hhcmFjdGVycyBpbiBhIHJvd1xuLy8gLSAnKCcnfFteJ10pKygnfCQpIG1hdGNoZXMgYW55dGhpbmcgc3Vycm91bmRlZCBieSB0d28gcXVvdGUgY2hhcmFjdGVycyAoJyksXG4vLyAgIGV4Y2VwdCBhIHNpbmdsZSBxdW90ZSBzeW1ib2wsIHdoaWNoIGVuZHMgdGhlIHNlcXVlbmNlLlxuLy8gICBUd28gcXVvdGUgY2hhcmFjdGVycyBkbyBub3QgZW5kIHRoZSBzZXF1ZW5jZS5cbi8vICAgSWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc2luZ2xlIHF1b3RlXG4vLyAgIHRoZW4gdGhlIHNlcXVlbmNlIHdpbGwgY29udGludWUgdW50aWwgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLlxuLy8gLSAuIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIgdW5tYXRjaGVkIGJ5IHByZXZpb3VzIHBhcnRzIG9mIHRoZSBSZWdFeHBzXG5jb25zdCBmb3JtYXR0aW5nVG9rZW5zUmVnRXhwID1cbiAgL1t5WVFxTUx3SWREZWNpaEhLa21zXW98KFxcdylcXDEqfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nO1xuXG4vLyBUaGlzIFJlZ0V4cCBjYXRjaGVzIHN5bWJvbHMgZXNjYXBlZCBieSBxdW90ZXMsIGFuZCBhbHNvXG4vLyBzZXF1ZW5jZXMgb2Ygc3ltYm9scyBQLCBwLCBhbmQgdGhlIGNvbWJpbmF0aW9ucyBsaWtlIGBQUFBQUFBQcHBwcHBgXG5jb25zdCBsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCA9IC9QK3ArfFArfHArfCcnfCcoJyd8W14nXSkrKCd8JCl8Li9nO1xuXG5jb25zdCBlc2NhcGVkU3RyaW5nUmVnRXhwID0gL14nKFteXSo/KSc/JC87XG5jb25zdCBkb3VibGVRdW90ZVJlZ0V4cCA9IC8nJy9nO1xuXG5jb25zdCBub3RXaGl0ZXNwYWNlUmVnRXhwID0gL1xcUy87XG5jb25zdCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCA9IC9bYS16QS1aXS87XG5cbi8qKlxuICogQG5hbWUgcGFyc2VcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgUGFyc2UgdGhlIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGRhdGUgcGFyc2VkIGZyb20gc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBmb3JtYXQgc3RyaW5nLlxuICpcbiAqID4g4pqg77iPIFBsZWFzZSBub3RlIHRoYXQgdGhlIGBmb3JtYXRgIHRva2VucyBkaWZmZXIgZnJvbSBNb21lbnQuanMgYW5kIG90aGVyIGxpYnJhcmllcy5cbiAqID4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogVGhlIGNoYXJhY3RlcnMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgd3JhcHBlZCBiZXR3ZWVuIHR3byBzaW5nbGUgcXVvdGVzIGNoYXJhY3RlcnMgKCcpIGFyZSBlc2NhcGVkLlxuICogVHdvIHNpbmdsZSBxdW90ZXMgaW4gYSByb3csIHdoZXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgYSBxdW90ZWQgc2VxdWVuY2UsIHJlcHJlc2VudCBhICdyZWFsJyBzaW5nbGUgcXVvdGUuXG4gKlxuICogRm9ybWF0IG9mIHRoZSBmb3JtYXQgc3RyaW5nIGlzIGJhc2VkIG9uIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9GaWVsZF9TeW1ib2xfVGFibGVcbiAqIHdpdGggYSBmZXcgYWRkaXRpb25zIChzZWUgbm90ZSA1IGJlbG93IHRoZSB0YWJsZSkuXG4gKlxuICogTm90IGFsbCB0b2tlbnMgYXJlIGNvbXBhdGlibGUuIENvbWJpbmF0aW9ucyB0aGF0IGRvbid0IG1ha2Ugc2Vuc2Ugb3IgY291bGQgbGVhZCB0byBidWdzIGFyZSBwcm9oaWJpdGVkXG4gKiBhbmQgd2lsbCB0aHJvdyBgUmFuZ2VFcnJvcmAuIEZvciBleGFtcGxlIHVzYWdlIG9mIDI0LWhvdXIgZm9ybWF0IHRva2VuIHdpdGggQU0vUE0gdG9rZW4gd2lsbCB0aHJvdyBhbiBleGNlcHRpb246XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcGFyc2UoJzIzIEFNJywgJ0hIIGEnLCBuZXcgRGF0ZSgpKVxuICogLy89PiBSYW5nZUVycm9yOiBUaGUgZm9ybWF0IHN0cmluZyBtdXN0bid0IGNvbnRhaW4gYEhIYCBhbmQgYGFgIGF0IHRoZSBzYW1lIHRpbWVcbiAqIGBgYFxuICpcbiAqIFNlZSB0aGUgY29tcGF0aWJpbGl0eSB0YWJsZTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvZS8yUEFDWC0xdlFPUFUzeFVocGxsbDZkeW9NbVZVWEhLbF84Q1JEczZfdWVMbWV4M1NvcXdodW9sa3VOM08wNWw0cnF4NWgxZEtYOGViNDZVbC1DQ1NycS9wdWJodG1sP2dpZD0wJnNpbmdsZT10cnVlXG4gKlxuICogQWNjZXB0ZWQgZm9ybWF0IHN0cmluZyBwYXR0ZXJuczpcbiAqIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8UHJpb3J8IFBhdHRlcm4gfCBSZXN1bHQgZXhhbXBsZXMgICAgICAgICAgICAgICAgICAgfCBOb3RlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfFxuICogfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQwIHwgRy4uR0dHICB8IEFELCBCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEdHR0cgICAgfCBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBHR0dHRyAgIHwgQSwgQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDYWxlbmRhciB5ZWFyICAgICAgICAgICAgICAgICAgIHwgMTMwIHwgeSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3LCA5OTk5ICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgOTk5OTk5OXRoICAgICAgfCA0LDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB5eSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeXl5ICAgICB8IDA0NCwgMDAxLCAxMjMsIDk5OSAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHl5eXkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB5eXl5eSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiw0ICAgfFxuICogfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgIHwgMTMwIHwgWSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3LCA5MDAwICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgOTk5OTk5OXRoICAgICAgfCA0LDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBZWSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNCw2ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWVlZICAgICB8IDA0NCwgMDAxLCAxMjMsIDk5OSAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFlZWVkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA0LDYgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBZWVlZWSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiw0ICAgfFxuICogfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgIHwgMTMwIHwgUiAgICAgICB8IC00MywgMSwgMTkwMCwgMjAxNywgOTk5OSwgLTk5OTkgICB8IDQsNSAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFJSICAgICAgfCAtNDMsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgfCA0LDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBSUlIgICAgIHwgLTA0MywgMDAxLCAxMjMsIDk5OSwgLTk5OSAgICAgICAgIHwgNCw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUlJSUiAgICB8IC0wMDQzLCAwMDAxLCAyMDE3LCA5OTk5LCAtOTk5OSAgICB8IDQsNSAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFJSUlJSICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyLDQsNSB8XG4gKiB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICAgfCAxMzAgfCB1ICAgICAgIHwgLTQzLCAxLCAxOTAwLCAyMDE3LCA5OTk5LCAtOTk5ICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgdXUgICAgICB8IC00MywgMDEsIDk5LCAtOTkgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHV1dSAgICAgfCAtMDQzLCAwMDEsIDEyMywgOTk5LCAtOTk5ICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB1dXV1ICAgIHwgLTAwNDMsIDAwMDEsIDIwMTcsIDk5OTksIC05OTk5ICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgdXV1dXUgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIsNCAgIHxcbiAqIHwgUXVhcnRlciAoZm9ybWF0dGluZykgICAgICAgICAgICB8IDEyMCB8IFEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBRbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUVEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFFRUSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBRUVFRICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUVFRUVEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgUXVhcnRlciAoc3RhbmQtYWxvbmUpICAgICAgICAgICB8IDEyMCB8IHEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBxbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgcXEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHFxcSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBxcXFxICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgcXFxcXEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgTW9udGggKGZvcm1hdHRpbmcpICAgICAgICAgICAgICB8IDExMCB8IE0gICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBNbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTU0gICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IE1NTSAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBNTU1NICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTU1NTU0gICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTW9udGggKHN0YW5kLWFsb25lKSAgICAgICAgICAgICB8IDExMCB8IEwgICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBMbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTEwgICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IExMTCAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBMTExMICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTExMTEwgICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgICB8IDEwMCB8IHcgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB3byAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgd3cgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgICB8IDEwMCB8IEkgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBJbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgSUkgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgICB8ICA5MCB8IGQgICAgICAgfCAxLCAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBkbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzFzdCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZGQgICAgICB8IDAxLCAwMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgICB8ICA5MCB8IEQgICAgICAgfCAxLCAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBEbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzY1dGgsIDM2NnRoICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgREQgICAgICB8IDAxLCAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IERERCAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBEREREICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCBEYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgICAgIHwgIDkwIHwgRS4uRUVFICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEVFRUUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBFRUVFRSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgRUVFRUVFICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICB8ICA5MCB8IGkgICAgICAgfCAxLCAyLCAzLCAuLi4sIDcgICAgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBpbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgN3RoICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaWkgICAgICB8IDAxLCAwMiwgLi4uLCAwNyAgICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGlpaSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBpaWlpICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaWlpaWkgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGlpaWlpaSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCA1ICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgfCAgOTAgfCBlICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZW8gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGVlICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBlZWUgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZWVlZSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGVlZWVlICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBlZWVlZWUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoc3RhbmQtYWxvbmUpIHwgIDkwIHwgYyAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGNvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBjYyAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgY2NjICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGNjY2MgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBjY2NjYyAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgY2NjY2NjICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA4MCB8IGEuLmFhYSAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBhYWFhICAgIHwgYS5tLiwgcC5tLiAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgYWFhYWEgICB8IGEsIHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICB8ICA4MCB8IGIuLmJiYiAgfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBiYmJiICAgIHwgYS5tLiwgcC5tLiwgbm9vbiwgbWlkbmlnaHQgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgYmJiYmIgICB8IGEsIHAsIG4sIG1pICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgICB8ICA4MCB8IEIuLkJCQiAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBCQkJCICAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgQkJCQkIgICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgICB8ICA3MCB8IGggICAgICAgfCAxLCAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBobyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMTJ0aCAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaGggICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMTIgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgICB8ICA3MCB8IEggICAgICAgfCAwLCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBIbyAgICAgIHwgMHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgSEggICAgICB8IDAwLCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgICB8ICA3MCB8IEsgICAgICAgfCAxLCAyLCAuLi4sIDExLCAwICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBLbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTF0aCwgMHRoICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgS0sgICAgICB8IDAxLCAwMiwgLi4uLCAxMSwgMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgICB8ICA3MCB8IGsgICAgICAgfCAyNCwgMSwgMiwgLi4uLCAyMyAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBrbyAgICAgIHwgMjR0aCwgMXN0LCAybmQsIC4uLiwgMjNyZCAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwga2sgICAgICB8IDI0LCAwMSwgMDIsIC4uLiwgMjMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2MCB8IG0gICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBtbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgbW0gICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1MCB8IHMgICAgICAgfCAwLCAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBzbyAgICAgIHwgMHRoLCAxc3QsIC4uLiwgNTl0aCAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgc3MgICAgICB8IDAwLCAwMSwgLi4uLCA1OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgICB8ICA0MCB8IHQgICAgICAgfCA1MTI5Njk1MjAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB0dCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgIHwgIDMwIHwgUyAgICAgICB8IDAsIDEsIC4uLiwgOSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFNTICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBTU1MgICAgIHwgMDAwLCAwMDEsIC4uLiwgOTk5ICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgU1NTUyAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICB8ICAyMCB8IFQgICAgICAgfCA1MTI5Njk1MjA5MDAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBUVCAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy8gWikgICAgICAgIHwgIDEwIHwgWCAgICAgICB8IC0wOCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFhYICAgICAgfCAtMDgwMCwgKzA1MzAsIFogICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBYWFggICAgIHwgLTA4OjAwLCArMDU6MzAsIFogICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWFhYWCAgICB8IC0wODAwLCArMDUzMCwgWiwgKzEyMzQ1NiAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFhYWFhYICAgfCAtMDg6MDAsICswNTozMCwgWiwgKzEyOjM0OjU2ICAgICAgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICAgfCAgMTAgfCB4ICAgICAgIHwgLTA4LCArMDUzMCwgKzAwICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeHggICAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHh4eCAgICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB4eHh4ICAgIHwgLTA4MDAsICswNTMwLCArMDAwMCwgKzEyMzQ1NiAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeHh4eHggICB8IC0wODowMCwgKzA1OjMwLCArMDA6MDAsICsxMjozNDo1NiB8ICAgICAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgICB8ICBOQSB8IFAgICAgICAgfCAwNS8yOS8xNDUzICAgICAgICAgICAgICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBQUCAgICAgIHwgTWF5IDI5LCAxNDUzICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUFBQICAgICB8IE1heSAyOXRoLCAxNDUzICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFBQUFAgICAgfCBTdW5kYXksIE1heSAyOXRoLCAxNDUzICAgICAgICAgICAgfCAyLDUsOCB8XG4gKiB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICAgfCAgTkEgfCBwICAgICAgIHwgMTI6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgcHAgICAgICB8IDEyOjAwOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgQ29tYmluYXRpb24gb2YgZGF0ZSBhbmQgdGltZSAgICB8ICBOQSB8IFBwICAgICAgfCAwNS8yOS8xNDUzLCAxMjowMCBBTSAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBQUHBwICAgIHwgTWF5IDI5LCAxNDUzLCAxMjowMDowMCBBTSAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUFBQcHAgICB8IE1heSAyOXRoLCAxNDUzIGF0IC4uLiAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFBQUFBwcCAgfCBTdW5kYXksIE1heSAyOXRoLCAxNDUzIGF0IC4uLiAgICAgfCAyLDUsOCB8XG4gKiBOb3RlczpcbiAqIDEuIFwiRm9ybWF0dGluZ1wiIHVuaXRzIChlLmcuIGZvcm1hdHRpbmcgcXVhcnRlcikgaW4gdGhlIGRlZmF1bHQgZW4tVVMgbG9jYWxlXG4gKiAgICBhcmUgdGhlIHNhbWUgYXMgXCJzdGFuZC1hbG9uZVwiIHVuaXRzLCBidXQgYXJlIGRpZmZlcmVudCBpbiBzb21lIGxhbmd1YWdlcy5cbiAqICAgIFwiRm9ybWF0dGluZ1wiIHVuaXRzIGFyZSBkZWNsaW5lZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIHRoZSBsYW5ndWFnZVxuICogICAgaW4gdGhlIGNvbnRleHQgb2YgYSBkYXRlLiBcIlN0YW5kLWFsb25lXCIgdW5pdHMgYXJlIGFsd2F5cyBub21pbmF0aXZlIHNpbmd1bGFyLlxuICogICAgSW4gYGZvcm1hdGAgZnVuY3Rpb24sIHRoZXkgd2lsbCBwcm9kdWNlIGRpZmZlcmVudCByZXN1bHQ6XG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBMTExMJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZCdgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBNTU1NJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZHUnYFxuICpcbiAqICAgIGBwYXJzZWAgd2lsbCB0cnkgdG8gbWF0Y2ggYm90aCBmb3JtYXR0aW5nIGFuZCBzdGFuZC1hbG9uZSB1bml0cyBpbnRlcmNoYW5nYWJseS5cbiAqXG4gKiAyLiBBbnkgc2VxdWVuY2Ugb2YgdGhlIGlkZW50aWNhbCBsZXR0ZXJzIGlzIGEgcGF0dGVybiwgdW5sZXNzIGl0IGlzIGVzY2FwZWQgYnlcbiAqICAgIHRoZSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycyAoc2VlIGJlbG93KS5cbiAqICAgIElmIHRoZSBzZXF1ZW5jZSBpcyBsb25nZXIgdGhhbiBsaXN0ZWQgaW4gdGFibGU6XG4gKiAgICAtIGZvciBudW1lcmljYWwgdW5pdHMgKGB5eXl5eXl5eWApIGBwYXJzZWAgd2lsbCB0cnkgdG8gbWF0Y2ggYSBudW1iZXJcbiAqICAgICAgYXMgd2lkZSBhcyB0aGUgc2VxdWVuY2VcbiAqICAgIC0gZm9yIHRleHQgdW5pdHMgKGBNTU1NTU1NTWApIGBwYXJzZWAgd2lsbCB0cnkgdG8gbWF0Y2ggdGhlIHdpZGVzdCB2YXJpYXRpb24gb2YgdGhlIHVuaXQuXG4gKiAgICAgIFRoZXNlIHZhcmlhdGlvbnMgYXJlIG1hcmtlZCB3aXRoIFwiMlwiIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgdGFibGUuXG4gKlxuICogMy4gYFFRUVFRYCBhbmQgYHFxcXFxYCBjb3VsZCBiZSBub3Qgc3RyaWN0bHkgbnVtZXJpY2FsIGluIHNvbWUgbG9jYWxlcy5cbiAqICAgIFRoZXNlIHRva2VucyByZXByZXNlbnQgdGhlIHNob3J0ZXN0IGZvcm0gb2YgdGhlIHF1YXJ0ZXIuXG4gKlxuICogNC4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIHBhdHRlcm5zIGFyZSBCLkMuIHllYXJzOlxuICpcbiAqICAgIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICogICAgfCBBQyAxIHwgICAxIHwgICAxIHxcbiAqICAgIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gKiAgICB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICpcbiAqICAgIEFsc28gYHl5YCB3aWxsIHRyeSB0byBndWVzcyB0aGUgY2VudHVyeSBvZiB0d28gZGlnaXQgeWVhciBieSBwcm94aW1pdHkgd2l0aCBgcmVmZXJlbmNlRGF0ZWA6XG4gKlxuICogICAgYHBhcnNlKCc1MCcsICd5eScsIG5ldyBEYXRlKDIwMTgsIDAsIDEpKSAvLz0+IFNhdCBKYW4gMDEgMjA1MCAwMDowMDowMGBcbiAqXG4gKiAgICBgcGFyc2UoJzc1JywgJ3l5JywgbmV3IERhdGUoMjAxOCwgMCwgMSkpIC8vPT4gV2VkIEphbiAwMSAxOTc1IDAwOjAwOjAwYFxuICpcbiAqICAgIHdoaWxlIGB1dWAgd2lsbCBqdXN0IGFzc2lnbiB0aGUgeWVhciBhcyBpczpcbiAqXG4gKiAgICBgcGFyc2UoJzUwJywgJ3V1JywgbmV3IERhdGUoMjAxOCwgMCwgMSkpIC8vPT4gU2F0IEphbiAwMSAwMDUwIDAwOjAwOjAwYFxuICpcbiAqICAgIGBwYXJzZSgnNzUnLCAndXUnLCBuZXcgRGF0ZSgyMDE4LCAwLCAxKSkgLy89PiBUdWUgSmFuIDAxIDAwNzUgMDA6MDA6MDBgXG4gKlxuICogICAgVGhlIHNhbWUgZGlmZmVyZW5jZSBpcyB0cnVlIGZvciBsb2NhbCBhbmQgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJzIChgWWAgYW5kIGBSYCksXG4gKiAgICBleGNlcHQgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcnMgYXJlIGRlcGVuZGVudCBvbiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gXG4gKiAgICBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAoY29tcGFyZSBbc2V0SVNPV2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3Mvc2V0SVNPV2Vla1llYXIpXG4gKiAgICBhbmQgW3NldFdlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL3NldFdlZWtZZWFyKSkuXG4gKlxuICogNS4gVGhlc2UgcGF0dGVybnMgYXJlIG5vdCBpbiB0aGUgVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogICAgLSBgaWA6IElTTyBkYXkgb2Ygd2Vla1xuICogICAgLSBgSWA6IElTTyB3ZWVrIG9mIHllYXJcbiAqICAgIC0gYFJgOiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICogICAgLSBgb2A6IG9yZGluYWwgbnVtYmVyIG1vZGlmaWVyXG4gKiAgICAtIGBQYDogbG9uZyBsb2NhbGl6ZWQgZGF0ZVxuICogICAgLSBgcGA6IGxvbmcgbG9jYWxpemVkIHRpbWVcbiAqXG4gKiA2LiBgWVlgIGFuZCBgWVlZWWAgdG9rZW5zIHJlcHJlc2VudCB3ZWVrLW51bWJlcmluZyB5ZWFycyBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCB5ZWFycy5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIDcuIGBEYCBhbmQgYEREYCB0b2tlbnMgcmVwcmVzZW50IGRheXMgb2YgdGhlIHllYXIgYnV0IHRoZXkgYXJlIG9mdGhlbiBjb25mdXNlZCB3aXRoIGRheXMgb2YgdGhlIG1vbnRoLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbERheU9mWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIDguIGBQK2AgdG9rZW5zIGRvIG5vdCBoYXZlIGEgZGVmaW5lZCBwcmlvcml0eSBzaW5jZSB0aGV5IGFyZSBtZXJlbHkgYWxpYXNlcyB0byBvdGhlciB0b2tlbnMgYmFzZWRcbiAqICAgIG9uIHRoZSBnaXZlbiBsb2NhbGUuXG4gKlxuICogICAgdXNpbmcgYGVuLVVTYCBsb2NhbGU6IGBQYCA9PiBgTU0vZGQveXl5eWBcbiAqICAgIHVzaW5nIGBlbi1VU2AgbG9jYWxlOiBgcGAgPT4gYGhoOm1tIGFgXG4gKiAgICB1c2luZyBgcHQtQlJgIGxvY2FsZTogYFBgID0+IGBkZC9NTS95eXl5YFxuICogICAgdXNpbmcgYHB0LUJSYCBsb2NhbGU6IGBwYCA9PiBgSEg6bW1gXG4gKlxuICogVmFsdWVzIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGRhdGUgaW4gdGhlIGRlc2NlbmRpbmcgb3JkZXIgb2YgaXRzIHVuaXQncyBwcmlvcml0eS5cbiAqIFVuaXRzIG9mIGFuIGVxdWFsIHByaW9yaXR5IG92ZXJ3cml0ZSBlYWNoIG90aGVyIGluIHRoZSBvcmRlciBvZiBhcHBlYXJhbmNlLlxuICpcbiAqIElmIG5vIHZhbHVlcyBvZiBoaWdoZXIgcHJpb3JpdHkgYXJlIHBhcnNlZCAoZS5nLiB3aGVuIHBhcnNpbmcgc3RyaW5nICdKYW51YXJ5IDFzdCcgd2l0aG91dCBhIHllYXIpLFxuICogdGhlIHZhbHVlcyB3aWxsIGJlIHRha2VuIGZyb20gM3JkIGFyZ3VtZW50IGByZWZlcmVuY2VEYXRlYCB3aGljaCB3b3JrcyBhcyBhIGNvbnRleHQgb2YgcGFyc2luZy5cbiAqXG4gKiBgcmVmZXJlbmNlRGF0ZWAgbXVzdCBiZSBwYXNzZWQgZm9yIGNvcnJlY3Qgd29yayBvZiB0aGUgZnVuY3Rpb24uXG4gKiBJZiB5b3UncmUgbm90IHN1cmUgd2hpY2ggYHJlZmVyZW5jZURhdGVgIHRvIHN1cHBseSwgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIERhdGU6XG4gKiBgcGFyc2UoJzAyLzExLzIwMTQnLCAnTU0vZGQveXl5eScsIG5ldyBEYXRlKCkpYFxuICogSW4gdGhpcyBjYXNlIHBhcnNpbmcgd2lsbCBiZSBkb25lIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGRhdGUuXG4gKiBJZiBgcmVmZXJlbmNlRGF0ZWAgaXMgYEludmFsaWQgRGF0ZWAgb3IgYSB2YWx1ZSBub3QgY29udmVydGlibGUgdG8gdmFsaWQgYERhdGVgLFxuICogdGhlbiBgSW52YWxpZCBEYXRlYCB3aWxsIGJlIHJldHVybmVkLlxuICpcbiAqIFRoZSByZXN1bHQgbWF5IHZhcnkgYnkgbG9jYWxlLlxuICpcbiAqIElmIGBmb3JtYXRTdHJpbmdgIG1hdGNoZXMgd2l0aCBgZGF0ZVN0cmluZ2AgYnV0IGRvZXMgbm90IHByb3ZpZGVzIHRva2VucywgYHJlZmVyZW5jZURhdGVgIHdpbGwgYmUgcmV0dXJuZWQuXG4gKlxuICogSWYgcGFyc2luZyBmYWlsZWQsIGBJbnZhbGlkIERhdGVgIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBJbnZhbGlkIERhdGUgaXMgYSBEYXRlLCB3aG9zZSB0aW1lIHZhbHVlIGlzIE5hTi5cbiAqIFRpbWUgdmFsdWUgb2YgRGF0ZTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS45LjEuMVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlU3RyIC0gVGhlIHN0cmluZyB0byBwYXJzZVxuICogQHBhcmFtIGZvcm1hdFN0ciAtIFRoZSBzdHJpbmcgb2YgdG9rZW5zXG4gKiBAcGFyYW0gcmVmZXJlbmNlRGF0ZSAtIGRlZmluZXMgdmFsdWVzIG1pc3NpbmcgZnJvbSB0aGUgcGFyc2VkIGRhdGVTdHJpbmdcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqICAgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiAgIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZVxuICpcbiAqIEB0aHJvd3MgYG9wdGlvbnMubG9jYWxlYCBtdXN0IGNvbnRhaW4gYG1hdGNoYCBwcm9wZXJ0eVxuICogQHRocm93cyB1c2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGRgIGluc3RlYWQgb2YgYEREYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQYXJzZSAxMSBGZWJydWFyeSAyMDE0IGZyb20gbWlkZGxlLWVuZGlhbiBmb3JtYXQ6XG4gKiB2YXIgcmVzdWx0ID0gcGFyc2UoJzAyLzExLzIwMTQnLCAnTU0vZGQveXl5eScsIG5ldyBEYXRlKCkpXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQYXJzZSAyOHRoIG9mIEZlYnJ1YXJ5IGluIEVzcGVyYW50byBsb2NhbGUgaW4gdGhlIGNvbnRleHQgb2YgMjAxMCB5ZWFyOlxuICogaW1wb3J0IGVvIGZyb20gJ2RhdGUtZm5zL2xvY2FsZS9lbydcbiAqIHZhciByZXN1bHQgPSBwYXJzZSgnMjgtYSBkZSBmZWJydWFybycsIFwiZG8gJ2RlJyBNTU1NXCIsIG5ldyBEYXRlKDIwMTAsIDAsIDEpLCB7XG4gKiAgIGxvY2FsZTogZW9cbiAqIH0pXG4gKiAvLz0+IFN1biBGZWIgMjggMjAxMCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBwYXJzZShkYXRlU3RyLCBmb3JtYXRTdHIsIHJlZmVyZW5jZURhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4Mi5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgY29uc3QgbG9jYWxlID1cbiAgICBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMubG9jYWxlID8/IF9pbmRleDMuZGVmYXVsdExvY2FsZTtcblxuICBjb25zdCBmaXJzdFdlZWtDb250YWluc0RhdGUgPVxuICAgIG9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICAxO1xuXG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgaWYgKGZvcm1hdFN0ciA9PT0gXCJcIikge1xuICAgIGlmIChkYXRlU3RyID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gKDAsIF9pbmRleDQudG9EYXRlKShyZWZlcmVuY2VEYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgTmFOKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdWJGbk9wdGlvbnMgPSB7XG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlLFxuICAgIHdlZWtTdGFydHNPbixcbiAgICBsb2NhbGUsXG4gIH07XG5cbiAgLy8gSWYgdGltZXpvbmUgaXNuJ3Qgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHNldCB0byB0aGUgc3lzdGVtIHRpbWV6b25lXG4gIGNvbnN0IHNldHRlcnMgPSBbbmV3IF9TZXR0ZXIuRGF0ZVRvU3lzdGVtVGltZXpvbmVTZXR0ZXIoKV07XG5cbiAgY29uc3QgdG9rZW5zID0gZm9ybWF0U3RyXG4gICAgLm1hdGNoKGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwKVxuICAgIC5tYXAoKHN1YnN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgaW4gX2luZGV4NS5sb25nRm9ybWF0dGVycykge1xuICAgICAgICBjb25zdCBsb25nRm9ybWF0dGVyID0gX2luZGV4NS5sb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07XG4gICAgICAgIHJldHVybiBsb25nRm9ybWF0dGVyKHN1YnN0cmluZywgbG9jYWxlLmZvcm1hdExvbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1YnN0cmluZztcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpXG4gICAgLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnNSZWdFeHApO1xuXG4gIGNvbnN0IHVzZWRUb2tlbnMgPSBbXTtcblxuICBmb3IgKGxldCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICBpZiAoXG4gICAgICAhb3B0aW9ucz8udXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zICYmXG4gICAgICAoMCwgX2luZGV4Ni5pc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4pKHRva2VuKVxuICAgICkge1xuICAgICAgKDAsIF9pbmRleDYud2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcikodG9rZW4sIGZvcm1hdFN0ciwgZGF0ZVN0cik7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFvcHRpb25zPy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zICYmXG4gICAgICAoMCwgX2luZGV4Ni5pc1Byb3RlY3RlZERheU9mWWVhclRva2VuKSh0b2tlbilcbiAgICApIHtcbiAgICAgICgwLCBfaW5kZXg2Lndhcm5PclRocm93UHJvdGVjdGVkRXJyb3IpKHRva2VuLCBmb3JtYXRTdHIsIGRhdGVTdHIpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gdG9rZW5bMF07XG4gICAgY29uc3QgcGFyc2VyID0gX2luZGV4Ny5wYXJzZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICBpZiAocGFyc2VyKSB7XG4gICAgICBjb25zdCB7IGluY29tcGF0aWJsZVRva2VucyB9ID0gcGFyc2VyO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5jb21wYXRpYmxlVG9rZW5zKSkge1xuICAgICAgICBjb25zdCBpbmNvbXBhdGlibGVUb2tlbiA9IHVzZWRUb2tlbnMuZmluZChcbiAgICAgICAgICAodXNlZFRva2VuKSA9PlxuICAgICAgICAgICAgaW5jb21wYXRpYmxlVG9rZW5zLmluY2x1ZGVzKHVzZWRUb2tlbi50b2tlbikgfHxcbiAgICAgICAgICAgIHVzZWRUb2tlbi50b2tlbiA9PT0gZmlyc3RDaGFyYWN0ZXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbmNvbXBhdGlibGVUb2tlbikge1xuICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgICAgYFRoZSBmb3JtYXQgc3RyaW5nIG11c3RuJ3QgY29udGFpbiBcXGAke2luY29tcGF0aWJsZVRva2VuLmZ1bGxUb2tlbn1cXGAgYW5kIFxcYCR7dG9rZW59XFxgIGF0IHRoZSBzYW1lIHRpbWVgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VyLmluY29tcGF0aWJsZVRva2VucyA9PT0gXCIqXCIgJiYgdXNlZFRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgIGBUaGUgZm9ybWF0IHN0cmluZyBtdXN0bid0IGNvbnRhaW4gXFxgJHt0b2tlbn1cXGAgYW5kIGFueSBvdGhlciB0b2tlbiBhdCB0aGUgc2FtZSB0aW1lYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdXNlZFRva2Vucy5wdXNoKHsgdG9rZW46IGZpcnN0Q2hhcmFjdGVyLCBmdWxsVG9rZW46IHRva2VuIH0pO1xuXG4gICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IHBhcnNlci5ydW4oXG4gICAgICAgIGRhdGVTdHIsXG4gICAgICAgIHRva2VuLFxuICAgICAgICBsb2NhbGUubWF0Y2gsXG4gICAgICAgIHN1YkZuT3B0aW9ucyxcbiAgICAgICk7XG5cbiAgICAgIGlmICghcGFyc2VSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgTmFOKTtcbiAgICAgIH1cblxuICAgICAgc2V0dGVycy5wdXNoKHBhcnNlUmVzdWx0LnNldHRlcik7XG5cbiAgICAgIGRhdGVTdHIgPSBwYXJzZVJlc3VsdC5yZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZmlyc3RDaGFyYWN0ZXIubWF0Y2godW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHApKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgIFwiRm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyIGBcIiArXG4gICAgICAgICAgICBmaXJzdENoYXJhY3RlciArXG4gICAgICAgICAgICBcImBcIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVwbGFjZSB0d28gc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMgd2l0aCBvbmUgc2luZ2xlIHF1b3RlIGNoYXJhY3RlclxuICAgICAgaWYgKHRva2VuID09PSBcIicnXCIpIHtcbiAgICAgICAgdG9rZW4gPSBcIidcIjtcbiAgICAgIH0gZWxzZSBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIHRva2VuID0gY2xlYW5Fc2NhcGVkU3RyaW5nKHRva2VuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3V0IHRva2VuIGZyb20gc3RyaW5nLCBvciwgaWYgc3RyaW5nIGRvZXNuJ3QgbWF0Y2ggdGhlIHRva2VuLCByZXR1cm4gSW52YWxpZCBEYXRlXG4gICAgICBpZiAoZGF0ZVN0ci5pbmRleE9mKHRva2VuKSA9PT0gMCkge1xuICAgICAgICBkYXRlU3RyID0gZGF0ZVN0ci5zbGljZSh0b2tlbi5sZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgTmFOKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgcmVtYWluaW5nIGlucHV0IGNvbnRhaW5zIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoaXRlc3BhY2VcbiAgaWYgKGRhdGVTdHIubGVuZ3RoID4gMCAmJiBub3RXaGl0ZXNwYWNlUmVnRXhwLnRlc3QoZGF0ZVN0cikpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShyZWZlcmVuY2VEYXRlLCBOYU4pO1xuICB9XG5cbiAgY29uc3QgdW5pcXVlUHJpb3JpdHlTZXR0ZXJzID0gc2V0dGVyc1xuICAgIC5tYXAoKHNldHRlcikgPT4gc2V0dGVyLnByaW9yaXR5KVxuICAgIC5zb3J0KChhLCBiKSA9PiBiIC0gYSlcbiAgICAuZmlsdGVyKChwcmlvcml0eSwgaW5kZXgsIGFycmF5KSA9PiBhcnJheS5pbmRleE9mKHByaW9yaXR5KSA9PT0gaW5kZXgpXG4gICAgLm1hcCgocHJpb3JpdHkpID0+XG4gICAgICBzZXR0ZXJzXG4gICAgICAgIC5maWx0ZXIoKHNldHRlcikgPT4gc2V0dGVyLnByaW9yaXR5ID09PSBwcmlvcml0eSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIuc3ViUHJpb3JpdHkgLSBhLnN1YlByaW9yaXR5KSxcbiAgICApXG4gICAgLm1hcCgoc2V0dGVyQXJyYXkpID0+IHNldHRlckFycmF5WzBdKTtcblxuICBsZXQgZGF0ZSA9ICgwLCBfaW5kZXg0LnRvRGF0ZSkocmVmZXJlbmNlRGF0ZSk7XG5cbiAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIE5hTik7XG4gIH1cblxuICBjb25zdCBmbGFncyA9IHt9O1xuICBmb3IgKGNvbnN0IHNldHRlciBvZiB1bmlxdWVQcmlvcml0eVNldHRlcnMpIHtcbiAgICBpZiAoIXNldHRlci52YWxpZGF0ZShkYXRlLCBzdWJGbk9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShyZWZlcmVuY2VEYXRlLCBOYU4pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHNldHRlci5zZXQoZGF0ZSwgZmxhZ3MsIHN1YkZuT3B0aW9ucyk7XG4gICAgLy8gUmVzdWx0IGlzIHR1cGxlIChkYXRlLCBmbGFncylcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBkYXRlID0gcmVzdWx0WzBdO1xuICAgICAgT2JqZWN0LmFzc2lnbihmbGFncywgcmVzdWx0WzFdKTtcbiAgICAgIC8vIFJlc3VsdCBpcyBkYXRlXG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGUgPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZyhpbnB1dCkge1xuICByZXR1cm4gaW5wdXQubWF0Y2goZXNjYXBlZFN0cmluZ1JlZ0V4cClbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cCwgXCInXCIpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnBhcnNlSVNPID0gcGFyc2VJU087XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RhbnRzLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgcGFyc2VJU099IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBwYXJzZUlTT1xuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBQYXJzZSBJU08gc3RyaW5nXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCBhbmQgcmV0dXJuIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogRnVuY3Rpb24gYWNjZXB0cyBjb21wbGV0ZSBJU08gODYwMSBmb3JtYXRzIGFzIHdlbGwgYXMgcGFydGlhbCBpbXBsZW1lbnRhdGlvbnMuXG4gKiBJU08gODYwMTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMVxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpc24ndCBhIHN0cmluZywgdGhlIGZ1bmN0aW9uIGNhbm5vdCBwYXJzZSB0aGUgc3RyaW5nIG9yXG4gKiB0aGUgdmFsdWVzIGFyZSBpbnZhbGlkLCBpdCByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBzdHJpbmcgJzIwMTQtMDItMTFUMTE6MzA6MzAnIHRvIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBwYXJzZUlTTygnMjAxNC0wMi0xMVQxMTozMDozMCcpXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IHN0cmluZyAnKzAyMDE0MTAxJyB0byBkYXRlLFxuICogLy8gaWYgdGhlIGFkZGl0aW9uYWwgbnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgZXh0ZW5kZWQgeWVhciBmb3JtYXQgaXMgMTpcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlSVNPKCcrMDIwMTQxMDEnLCB7IGFkZGl0aW9uYWxEaWdpdHM6IDEgfSlcbiAqIC8vPT4gRnJpIEFwciAxMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSVNPKGFyZ3VtZW50LCBvcHRpb25zKSB7XG4gIGNvbnN0IGFkZGl0aW9uYWxEaWdpdHMgPSBvcHRpb25zPy5hZGRpdGlvbmFsRGlnaXRzID8/IDI7XG4gIGNvbnN0IGRhdGVTdHJpbmdzID0gc3BsaXREYXRlU3RyaW5nKGFyZ3VtZW50KTtcblxuICBsZXQgZGF0ZTtcbiAgaWYgKGRhdGVTdHJpbmdzLmRhdGUpIHtcbiAgICBjb25zdCBwYXJzZVllYXJSZXN1bHQgPSBwYXJzZVllYXIoZGF0ZVN0cmluZ3MuZGF0ZSwgYWRkaXRpb25hbERpZ2l0cyk7XG4gICAgZGF0ZSA9IHBhcnNlRGF0ZShwYXJzZVllYXJSZXN1bHQucmVzdERhdGVTdHJpbmcsIHBhcnNlWWVhclJlc3VsdC55ZWFyKTtcbiAgfVxuXG4gIGlmICghZGF0ZSB8fCBpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgfVxuXG4gIGNvbnN0IHRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICBsZXQgdGltZSA9IDA7XG4gIGxldCBvZmZzZXQ7XG5cbiAgaWYgKGRhdGVTdHJpbmdzLnRpbWUpIHtcbiAgICB0aW1lID0gcGFyc2VUaW1lKGRhdGVTdHJpbmdzLnRpbWUpO1xuICAgIGlmIChpc05hTih0aW1lKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRhdGVTdHJpbmdzLnRpbWV6b25lKSB7XG4gICAgb2Zmc2V0ID0gcGFyc2VUaW1lem9uZShkYXRlU3RyaW5ncy50aW1lem9uZSk7XG4gICAgaWYgKGlzTmFOKG9mZnNldCkpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkaXJ0eURhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXAgKyB0aW1lKTtcbiAgICAvLyBKUyBwYXJzZWQgc3RyaW5nIGFzc3VtaW5nIGl0J3MgaW4gVVRDIHRpbWV6b25lXG4gICAgLy8gYnV0IHdlIG5lZWQgaXQgdG8gYmUgcGFyc2VkIGluIG91ciB0aW1lem9uZVxuICAgIC8vIHNvIHdlIHVzZSB1dGMgdmFsdWVzIHRvIGJ1aWxkIGRhdGUgaW4gb3VyIHRpbWV6b25lLlxuICAgIC8vIFllYXIgdmFsdWVzIGZyb20gMCB0byA5OSBtYXAgdG8gdGhlIHllYXJzIDE5MDAgdG8gMTk5OVxuICAgIC8vIHNvIHNldCB5ZWFyIGV4cGxpY2l0bHkgd2l0aCBzZXRGdWxsWWVhci5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRGF0ZSgwKTtcbiAgICByZXN1bHQuc2V0RnVsbFllYXIoXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENNb250aCgpLFxuICAgICAgZGlydHlEYXRlLmdldFVUQ0RhdGUoKSxcbiAgICApO1xuICAgIHJlc3VsdC5zZXRIb3VycyhcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENIb3VycygpLFxuICAgICAgZGlydHlEYXRlLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENTZWNvbmRzKCksXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBEYXRlKHRpbWVzdGFtcCArIHRpbWUgKyBvZmZzZXQpO1xufVxuXG5jb25zdCBwYXR0ZXJucyA9IHtcbiAgZGF0ZVRpbWVEZWxpbWl0ZXI6IC9bVCBdLyxcbiAgdGltZVpvbmVEZWxpbWl0ZXI6IC9bWiBdL2ksXG4gIHRpbWV6b25lOiAvKFtaKy1dLiopJC8sXG59O1xuXG5jb25zdCBkYXRlUmVnZXggPVxuICAvXi0/KD86KFxcZHszfSl8KFxcZHsyfSkoPzotPyhcXGR7Mn0pKT98VyhcXGR7Mn0pKD86LT8oXFxkezF9KSk/fCkkLztcbmNvbnN0IHRpbWVSZWdleCA9XG4gIC9eKFxcZHsyfSg/OlsuLF1cXGQqKT8pKD86Oj8oXFxkezJ9KD86Wy4sXVxcZCopPykpPyg/Ojo/KFxcZHsyfSg/OlsuLF1cXGQqKT8pKT8kLztcbmNvbnN0IHRpbWV6b25lUmVnZXggPSAvXihbKy1dKShcXGR7Mn0pKD86Oj8oXFxkezJ9KSk/JC87XG5cbmZ1bmN0aW9uIHNwbGl0RGF0ZVN0cmluZyhkYXRlU3RyaW5nKSB7XG4gIGNvbnN0IGRhdGVTdHJpbmdzID0ge307XG4gIGNvbnN0IGFycmF5ID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy5kYXRlVGltZURlbGltaXRlcik7XG4gIGxldCB0aW1lU3RyaW5nO1xuXG4gIC8vIFRoZSByZWdleCBtYXRjaCBzaG91bGQgb25seSByZXR1cm4gYXQgbWF4aW11bSB0d28gYXJyYXkgZWxlbWVudHMuXG4gIC8vIFtkYXRlXSwgW3RpbWVdLCBvciBbZGF0ZSwgdGltZV0uXG4gIGlmIChhcnJheS5sZW5ndGggPiAyKSB7XG4gICAgcmV0dXJuIGRhdGVTdHJpbmdzO1xuICB9XG5cbiAgaWYgKC86Ly50ZXN0KGFycmF5WzBdKSkge1xuICAgIHRpbWVTdHJpbmcgPSBhcnJheVswXTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlU3RyaW5ncy5kYXRlID0gYXJyYXlbMF07XG4gICAgdGltZVN0cmluZyA9IGFycmF5WzFdO1xuICAgIGlmIChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlci50ZXN0KGRhdGVTdHJpbmdzLmRhdGUpKSB7XG4gICAgICBkYXRlU3RyaW5ncy5kYXRlID0gZGF0ZVN0cmluZy5zcGxpdChwYXR0ZXJucy50aW1lWm9uZURlbGltaXRlcilbMF07XG4gICAgICB0aW1lU3RyaW5nID0gZGF0ZVN0cmluZy5zdWJzdHIoXG4gICAgICAgIGRhdGVTdHJpbmdzLmRhdGUubGVuZ3RoLFxuICAgICAgICBkYXRlU3RyaW5nLmxlbmd0aCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRpbWVTdHJpbmcpIHtcbiAgICBjb25zdCB0b2tlbiA9IHBhdHRlcm5zLnRpbWV6b25lLmV4ZWModGltZVN0cmluZyk7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBkYXRlU3RyaW5ncy50aW1lID0gdGltZVN0cmluZy5yZXBsYWNlKHRva2VuWzFdLCBcIlwiKTtcbiAgICAgIGRhdGVTdHJpbmdzLnRpbWV6b25lID0gdG9rZW5bMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGVTdHJpbmdzLnRpbWUgPSB0aW1lU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRlU3RyaW5ncztcbn1cblxuZnVuY3Rpb24gcGFyc2VZZWFyKGRhdGVTdHJpbmcsIGFkZGl0aW9uYWxEaWdpdHMpIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIFwiXig/OihcXFxcZHs0fXxbKy1dXFxcXGR7XCIgK1xuICAgICAgKDQgKyBhZGRpdGlvbmFsRGlnaXRzKSArXG4gICAgICBcIn0pfChcXFxcZHsyfXxbKy1dXFxcXGR7XCIgK1xuICAgICAgKDIgKyBhZGRpdGlvbmFsRGlnaXRzKSArXG4gICAgICBcIn0pJClcIixcbiAgKTtcblxuICBjb25zdCBjYXB0dXJlcyA9IGRhdGVTdHJpbmcubWF0Y2gocmVnZXgpO1xuICAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgeWVhclxuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4geyB5ZWFyOiBOYU4sIHJlc3REYXRlU3RyaW5nOiBcIlwiIH07XG5cbiAgY29uc3QgeWVhciA9IGNhcHR1cmVzWzFdID8gcGFyc2VJbnQoY2FwdHVyZXNbMV0pIDogbnVsbDtcbiAgY29uc3QgY2VudHVyeSA9IGNhcHR1cmVzWzJdID8gcGFyc2VJbnQoY2FwdHVyZXNbMl0pIDogbnVsbDtcblxuICAvLyBlaXRoZXIgeWVhciBvciBjZW50dXJ5IGlzIG51bGwsIG5vdCBib3RoXG4gIHJldHVybiB7XG4gICAgeWVhcjogY2VudHVyeSA9PT0gbnVsbCA/IHllYXIgOiBjZW50dXJ5ICogMTAwLFxuICAgIHJlc3REYXRlU3RyaW5nOiBkYXRlU3RyaW5nLnNsaWNlKChjYXB0dXJlc1sxXSB8fCBjYXB0dXJlc1syXSkubGVuZ3RoKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEYXRlKGRhdGVTdHJpbmcsIHllYXIpIHtcbiAgLy8gSW52YWxpZCBJU08tZm9ybWF0dGVkIHllYXJcbiAgaWYgKHllYXIgPT09IG51bGwpIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuXG4gIGNvbnN0IGNhcHR1cmVzID0gZGF0ZVN0cmluZy5tYXRjaChkYXRlUmVnZXgpO1xuICAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgc3RyaW5nXG4gIGlmICghY2FwdHVyZXMpIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuXG4gIGNvbnN0IGlzV2Vla0RhdGUgPSAhIWNhcHR1cmVzWzRdO1xuICBjb25zdCBkYXlPZlllYXIgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzFdKTtcbiAgY29uc3QgbW9udGggPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzJdKSAtIDE7XG4gIGNvbnN0IGRheSA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbM10pO1xuICBjb25zdCB3ZWVrID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1s0XSk7XG4gIGNvbnN0IGRheU9mV2VlayA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbNV0pIC0gMTtcblxuICBpZiAoaXNXZWVrRGF0ZSkge1xuICAgIGlmICghdmFsaWRhdGVXZWVrRGF0ZSh5ZWFyLCB3ZWVrLCBkYXlPZldlZWspKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gICAgcmV0dXJuIGRheU9mSVNPV2Vla1llYXIoeWVhciwgd2VlaywgZGF5T2ZXZWVrKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gICAgaWYgKFxuICAgICAgIXZhbGlkYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSB8fFxuICAgICAgIXZhbGlkYXRlRGF5T2ZZZWFyRGF0ZSh5ZWFyLCBkYXlPZlllYXIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5ZWFyLCBtb250aCwgTWF0aC5tYXgoZGF5T2ZZZWFyLCBkYXkpKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZURhdGVVbml0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IHBhcnNlSW50KHZhbHVlKSA6IDE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZSh0aW1lU3RyaW5nKSB7XG4gIGNvbnN0IGNhcHR1cmVzID0gdGltZVN0cmluZy5tYXRjaCh0aW1lUmVnZXgpO1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gTmFOOyAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgdGltZVxuXG4gIGNvbnN0IGhvdXJzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1sxXSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzJdKTtcbiAgY29uc3Qgc2Vjb25kcyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbM10pO1xuXG4gIGlmICghdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGhvdXJzICogX2luZGV4Lm1pbGxpc2Vjb25kc0luSG91ciArXG4gICAgbWludXRlcyAqIF9pbmRleC5taWxsaXNlY29uZHNJbk1pbnV0ZSArXG4gICAgc2Vjb25kcyAqIDEwMDBcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lVW5pdCh2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHBhcnNlRmxvYXQodmFsdWUucmVwbGFjZShcIixcIiwgXCIuXCIpKSkgfHwgMDtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lem9uZSh0aW1lem9uZVN0cmluZykge1xuICBpZiAodGltZXpvbmVTdHJpbmcgPT09IFwiWlwiKSByZXR1cm4gMDtcblxuICBjb25zdCBjYXB0dXJlcyA9IHRpbWV6b25lU3RyaW5nLm1hdGNoKHRpbWV6b25lUmVnZXgpO1xuICBpZiAoIWNhcHR1cmVzKSByZXR1cm4gMDtcblxuICBjb25zdCBzaWduID0gY2FwdHVyZXNbMV0gPT09IFwiK1wiID8gLTEgOiAxO1xuICBjb25zdCBob3VycyA9IHBhcnNlSW50KGNhcHR1cmVzWzJdKTtcbiAgY29uc3QgbWludXRlcyA9IChjYXB0dXJlc1szXSAmJiBwYXJzZUludChjYXB0dXJlc1szXSkpIHx8IDA7XG5cbiAgaWYgKCF2YWxpZGF0ZVRpbWV6b25lKGhvdXJzLCBtaW51dGVzKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHNpZ24gKlxuICAgIChob3VycyAqIF9pbmRleC5taWxsaXNlY29uZHNJbkhvdXIgKyBtaW51dGVzICogX2luZGV4Lm1pbGxpc2Vjb25kc0luTWludXRlKVxuICApO1xufVxuXG5mdW5jdGlvbiBkYXlPZklTT1dlZWtZZWFyKGlzb1dlZWtZZWFyLCB3ZWVrLCBkYXkpIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDApO1xuICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGlzb1dlZWtZZWFyLCAwLCA0KTtcbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5RGF5ID0gZGF0ZS5nZXRVVENEYXkoKSB8fCA3O1xuICBjb25zdCBkaWZmID0gKHdlZWsgLSAxKSAqIDcgKyBkYXkgKyAxIC0gZm91cnRoT2ZKYW51YXJ5RGF5O1xuICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBkaWZmKTtcbiAgcmV0dXJuIGRhdGU7XG59XG5cbi8vIFZhbGlkYXRpb24gZnVuY3Rpb25zXG5cbi8vIEZlYnJ1YXJ5IGlzIG51bGwgdG8gaGFuZGxlIHRoZSBsZWFwIHllYXIgKHVzaW5nIHx8KVxuY29uc3QgZGF5c0luTW9udGhzID0gWzMxLCBudWxsLCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07XG5cbmZ1bmN0aW9uIGlzTGVhcFllYXJJbmRleCh5ZWFyKSB7XG4gIHJldHVybiB5ZWFyICUgNDAwID09PSAwIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXRlKSB7XG4gIHJldHVybiAoXG4gICAgbW9udGggPj0gMCAmJlxuICAgIG1vbnRoIDw9IDExICYmXG4gICAgZGF0ZSA+PSAxICYmXG4gICAgZGF0ZSA8PSAoZGF5c0luTW9udGhzW21vbnRoXSB8fCAoaXNMZWFwWWVhckluZGV4KHllYXIpID8gMjkgOiAyOCkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGF5T2ZZZWFyRGF0ZSh5ZWFyLCBkYXlPZlllYXIpIHtcbiAgcmV0dXJuIGRheU9mWWVhciA+PSAxICYmIGRheU9mWWVhciA8PSAoaXNMZWFwWWVhckluZGV4KHllYXIpID8gMzY2IDogMzY1KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVXZWVrRGF0ZShfeWVhciwgd2VlaywgZGF5KSB7XG4gIHJldHVybiB3ZWVrID49IDEgJiYgd2VlayA8PSA1MyAmJiBkYXkgPj0gMCAmJiBkYXkgPD0gNjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSB7XG4gIGlmIChob3VycyA9PT0gMjQpIHtcbiAgICByZXR1cm4gbWludXRlcyA9PT0gMCAmJiBzZWNvbmRzID09PSAwO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBzZWNvbmRzID49IDAgJiZcbiAgICBzZWNvbmRzIDwgNjAgJiZcbiAgICBtaW51dGVzID49IDAgJiZcbiAgICBtaW51dGVzIDwgNjAgJiZcbiAgICBob3VycyA+PSAwICYmXG4gICAgaG91cnMgPCAyNVxuICApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRpbWV6b25lKF9ob3VycywgbWludXRlcykge1xuICByZXR1cm4gbWludXRlcyA+PSAwICYmIG1pbnV0ZXMgPD0gNTk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuUGFyc2VyID0gdm9pZCAwO1xudmFyIF9TZXR0ZXIgPSByZXF1aXJlKFwiLi9TZXR0ZXIuanNcIik7XG5cbmNsYXNzIFBhcnNlciB7XG4gIHJ1bihkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gsIG9wdGlvbnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCwgb3B0aW9ucyk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXR0ZXI6IG5ldyBfU2V0dGVyLlZhbHVlU2V0dGVyKFxuICAgICAgICByZXN1bHQudmFsdWUsXG4gICAgICAgIHRoaXMudmFsaWRhdGUsXG4gICAgICAgIHRoaXMuc2V0LFxuICAgICAgICB0aGlzLnByaW9yaXR5LFxuICAgICAgICB0aGlzLnN1YlByaW9yaXR5LFxuICAgICAgKSxcbiAgICAgIHJlc3Q6IHJlc3VsdC5yZXN0LFxuICAgIH07XG4gIH1cblxuICB2YWxpZGF0ZShfdXRjRGF0ZSwgX3ZhbHVlLCBfb3B0aW9ucykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5leHBvcnRzLlBhcnNlciA9IFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5WYWx1ZVNldHRlciA9XG4gIGV4cG9ydHMuU2V0dGVyID1cbiAgZXhwb3J0cy5EYXRlVG9TeXN0ZW1UaW1lem9uZVNldHRlciA9XG4gICAgdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi90cmFuc3Bvc2UuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG5jb25zdCBUSU1FWk9ORV9VTklUX1BSSU9SSVRZID0gMTA7XG5cbmNsYXNzIFNldHRlciB7XG4gIHN1YlByaW9yaXR5ID0gMDtcblxuICB2YWxpZGF0ZShfdXRjRGF0ZSwgX29wdGlvbnMpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuZXhwb3J0cy5TZXR0ZXIgPSBTZXR0ZXI7XG5cbmNsYXNzIFZhbHVlU2V0dGVyIGV4dGVuZHMgU2V0dGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgdmFsdWUsXG5cbiAgICB2YWxpZGF0ZVZhbHVlLFxuXG4gICAgc2V0VmFsdWUsXG5cbiAgICBwcmlvcml0eSxcbiAgICBzdWJQcmlvcml0eSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlID0gdmFsaWRhdGVWYWx1ZTtcbiAgICB0aGlzLnNldFZhbHVlID0gc2V0VmFsdWU7XG4gICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5O1xuICAgIGlmIChzdWJQcmlvcml0eSkge1xuICAgICAgdGhpcy5zdWJQcmlvcml0eSA9IHN1YlByaW9yaXR5O1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKGRhdGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVZhbHVlKGRhdGUsIHRoaXMudmFsdWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWUoZGF0ZSwgZmxhZ3MsIHRoaXMudmFsdWUsIG9wdGlvbnMpO1xuICB9XG59XG5leHBvcnRzLlZhbHVlU2V0dGVyID0gVmFsdWVTZXR0ZXI7XG5cbmNsYXNzIERhdGVUb1N5c3RlbVRpbWV6b25lU2V0dGVyIGV4dGVuZHMgU2V0dGVyIHtcbiAgcHJpb3JpdHkgPSBUSU1FWk9ORV9VTklUX1BSSU9SSVRZO1xuICBzdWJQcmlvcml0eSA9IC0xO1xuICBzZXQoZGF0ZSwgZmxhZ3MpIHtcbiAgICBpZiAoZmxhZ3MudGltZXN0YW1wSXNTZXQpIHJldHVybiBkYXRlO1xuICAgIHJldHVybiAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCAoMCwgX2luZGV4LnRyYW5zcG9zZSkoZGF0ZSwgRGF0ZSkpO1xuICB9XG59XG5leHBvcnRzLkRhdGVUb1N5c3RlbVRpbWV6b25lU2V0dGVyID0gRGF0ZVRvU3lzdGVtVGltZXpvbmVTZXR0ZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMudGltZXpvbmVQYXR0ZXJucyA9IGV4cG9ydHMubnVtZXJpY1BhdHRlcm5zID0gdm9pZCAwO1xuY29uc3QgbnVtZXJpY1BhdHRlcm5zID0gKGV4cG9ydHMubnVtZXJpY1BhdHRlcm5zID0ge1xuICBtb250aDogL14oMVswLTJdfDA/XFxkKS8sIC8vIDAgdG8gMTJcbiAgZGF0ZTogL14oM1swLTFdfFswLTJdP1xcZCkvLCAvLyAwIHRvIDMxXG4gIGRheU9mWWVhcjogL14oMzZbMC02XXwzWzAtNV1cXGR8WzAtMl0/XFxkP1xcZCkvLCAvLyAwIHRvIDM2NlxuICB3ZWVrOiAvXig1WzAtM118WzAtNF0/XFxkKS8sIC8vIDAgdG8gNTNcbiAgaG91cjIzaDogL14oMlswLTNdfFswLTFdP1xcZCkvLCAvLyAwIHRvIDIzXG4gIGhvdXIyNGg6IC9eKDJbMC00XXxbMC0xXT9cXGQpLywgLy8gMCB0byAyNFxuICBob3VyMTFoOiAvXigxWzAtMV18MD9cXGQpLywgLy8gMCB0byAxMVxuICBob3VyMTJoOiAvXigxWzAtMl18MD9cXGQpLywgLy8gMCB0byAxMlxuICBtaW51dGU6IC9eWzAtNV0/XFxkLywgLy8gMCB0byA1OVxuICBzZWNvbmQ6IC9eWzAtNV0/XFxkLywgLy8gMCB0byA1OVxuXG4gIHNpbmdsZURpZ2l0OiAvXlxcZC8sIC8vIDAgdG8gOVxuICB0d29EaWdpdHM6IC9eXFxkezEsMn0vLCAvLyAwIHRvIDk5XG4gIHRocmVlRGlnaXRzOiAvXlxcZHsxLDN9LywgLy8gMCB0byA5OTlcbiAgZm91ckRpZ2l0czogL15cXGR7MSw0fS8sIC8vIDAgdG8gOTk5OVxuXG4gIGFueURpZ2l0c1NpZ25lZDogL14tP1xcZCsvLFxuICBzaW5nbGVEaWdpdFNpZ25lZDogL14tP1xcZC8sIC8vIDAgdG8gOSwgLTAgdG8gLTlcbiAgdHdvRGlnaXRzU2lnbmVkOiAvXi0/XFxkezEsMn0vLCAvLyAwIHRvIDk5LCAtMCB0byAtOTlcbiAgdGhyZWVEaWdpdHNTaWduZWQ6IC9eLT9cXGR7MSwzfS8sIC8vIDAgdG8gOTk5LCAtMCB0byAtOTk5XG4gIGZvdXJEaWdpdHNTaWduZWQ6IC9eLT9cXGR7MSw0fS8sIC8vIDAgdG8gOTk5OSwgLTAgdG8gLTk5OTlcbn0pO1xuXG5jb25zdCB0aW1lem9uZVBhdHRlcm5zID0gKGV4cG9ydHMudGltZXpvbmVQYXR0ZXJucyA9IHtcbiAgYmFzaWNPcHRpb25hbE1pbnV0ZXM6IC9eKFsrLV0pKFxcZHsyfSkoXFxkezJ9KT98Wi8sXG4gIGJhc2ljOiAvXihbKy1dKShcXGR7Mn0pKFxcZHsyfSl8Wi8sXG4gIGJhc2ljT3B0aW9uYWxTZWNvbmRzOiAvXihbKy1dKShcXGR7Mn0pKFxcZHsyfSkoKFxcZHsyfSkpP3xaLyxcbiAgZXh0ZW5kZWQ6IC9eKFsrLV0pKFxcZHsyfSk6KFxcZHsyfSl8Wi8sXG4gIGV4dGVuZGVkT3B0aW9uYWxTZWNvbmRzOiAvXihbKy1dKShcXGR7Mn0pOihcXGR7Mn0pKDooXFxkezJ9KSk/fFovLFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMucGFyc2VycyA9IHZvaWQgMDtcbnZhciBfRXJhUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9FcmFQYXJzZXIuanNcIik7XG52YXIgX1llYXJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1llYXJQYXJzZXIuanNcIik7XG52YXIgX0xvY2FsV2Vla1llYXJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0xvY2FsV2Vla1llYXJQYXJzZXIuanNcIik7XG52YXIgX0lTT1dlZWtZZWFyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9JU09XZWVrWWVhclBhcnNlci5qc1wiKTtcbnZhciBfRXh0ZW5kZWRZZWFyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9FeHRlbmRlZFllYXJQYXJzZXIuanNcIik7XG52YXIgX1F1YXJ0ZXJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1F1YXJ0ZXJQYXJzZXIuanNcIik7XG52YXIgX1N0YW5kQWxvbmVRdWFydGVyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9TdGFuZEFsb25lUXVhcnRlclBhcnNlci5qc1wiKTtcbnZhciBfTW9udGhQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL01vbnRoUGFyc2VyLmpzXCIpO1xudmFyIF9TdGFuZEFsb25lTW9udGhQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1N0YW5kQWxvbmVNb250aFBhcnNlci5qc1wiKTtcbnZhciBfTG9jYWxXZWVrUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Mb2NhbFdlZWtQYXJzZXIuanNcIik7XG52YXIgX0lTT1dlZWtQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0lTT1dlZWtQYXJzZXIuanNcIik7XG52YXIgX0RhdGVQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0RhdGVQYXJzZXIuanNcIik7XG52YXIgX0RheU9mWWVhclBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvRGF5T2ZZZWFyUGFyc2VyLmpzXCIpO1xudmFyIF9EYXlQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0RheVBhcnNlci5qc1wiKTtcbnZhciBfTG9jYWxEYXlQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0xvY2FsRGF5UGFyc2VyLmpzXCIpO1xudmFyIF9TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1N0YW5kQWxvbmVMb2NhbERheVBhcnNlci5qc1wiKTtcbnZhciBfSVNPRGF5UGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9JU09EYXlQYXJzZXIuanNcIik7XG52YXIgX0FNUE1QYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0FNUE1QYXJzZXIuanNcIik7XG52YXIgX0FNUE1NaWRuaWdodFBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvQU1QTU1pZG5pZ2h0UGFyc2VyLmpzXCIpO1xudmFyIF9EYXlQZXJpb2RQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0RheVBlcmlvZFBhcnNlci5qc1wiKTtcbnZhciBfSG91cjF0bzEyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Ib3VyMXRvMTJQYXJzZXIuanNcIik7XG52YXIgX0hvdXIwdG8yM1BhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSG91cjB0bzIzUGFyc2VyLmpzXCIpO1xudmFyIF9Ib3VyMFRvMTFQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0hvdXIwVG8xMVBhcnNlci5qc1wiKTtcbnZhciBfSG91cjFUbzI0UGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Ib3VyMVRvMjRQYXJzZXIuanNcIik7XG52YXIgX01pbnV0ZVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvTWludXRlUGFyc2VyLmpzXCIpO1xudmFyIF9TZWNvbmRQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1NlY29uZFBhcnNlci5qc1wiKTtcbnZhciBfRnJhY3Rpb25PZlNlY29uZFBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvRnJhY3Rpb25PZlNlY29uZFBhcnNlci5qc1wiKTtcbnZhciBfSVNPVGltZXpvbmVXaXRoWlBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSVNPVGltZXpvbmVXaXRoWlBhcnNlci5qc1wiKTtcbnZhciBfSVNPVGltZXpvbmVQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0lTT1RpbWV6b25lUGFyc2VyLmpzXCIpO1xudmFyIF9UaW1lc3RhbXBTZWNvbmRzUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9UaW1lc3RhbXBTZWNvbmRzUGFyc2VyLmpzXCIpO1xudmFyIF9UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5qc1wiKTtcblxuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgTWlsbGlzZWNvbmRzIGluIGRheSAgICAgICAgICAgIHxcbiAqIHwgIGIgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgIHwgIEIgIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgIHxcbiAqIHwgIGMgIHwgU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWsgIHwgIEMqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGUgIHwgTG9jYWwgZGF5IG9mIHdlZWsgICAgICAgICAgICAgIHwgIEUgIHwgRGF5IG9mIHdlZWsgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGYgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEYqIHwgRGF5IG9mIHdlZWsgaW4gbW9udGggICAgICAgICAgIHxcbiAqIHwgIGcqIHwgTW9kaWZpZWQgSnVsaWFuIGRheSAgICAgICAgICAgIHwgIEcgIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGkhIHwgSVNPIGRheSBvZiB3ZWVrICAgICAgICAgICAgICAgIHwgIEkhIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgIHxcbiAqIHwgIGoqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHwgIEoqIHwgTG9jYWxpemVkIGhvdXIgdy9vIGRheSBwZXJpb2QgIHxcbiAqIHwgIGsgIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgIHwgIEsgIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGwqIHwgKGRlcHJlY2F0ZWQpICAgICAgICAgICAgICAgICAgIHwgIEwgIHwgU3RhbmQtYWxvbmUgbW9udGggICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG8hIHwgT3JkaW5hbCBudW1iZXIgbW9kaWZpZXIgICAgICAgIHwgIE8qIHwgVGltZXpvbmUgKEdNVCkgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHEgIHwgU3RhbmQtYWxvbmUgcXVhcnRlciAgICAgICAgICAgIHwgIFEgIHwgUXVhcnRlciAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHIqIHwgUmVsYXRlZCBHcmVnb3JpYW4geWVhciAgICAgICAgIHwgIFIhIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHQhIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgIHwgIFQhIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgIHxcbiAqIHwgIHUgIHwgRXh0ZW5kZWQgeWVhciAgICAgICAgICAgICAgICAgIHwgIFUqIHwgQ3ljbGljIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHYqIHwgVGltZXpvbmUgKGdlbmVyaWMgbm9uLWxvY2F0LikgIHwgIFYqIHwgVGltZXpvbmUgKGxvY2F0aW9uKSAgICAgICAgICAgIHxcbiAqIHwgIHcgIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgIHwgIFcqIHwgV2VlayBvZiBtb250aCAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHggIHwgVGltZXpvbmUgKElTTy04NjAxIHcvbyBaKSAgICAgIHwgIFggIHwgVGltZXpvbmUgKElTTy04NjAxKSAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgIHxcbiAqIHwgIHoqIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pIHwgIFoqIHwgVGltZXpvbmUgKGFsaWFzZXMpICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgISBhcmUgbm9uLXN0YW5kYXJkLCBidXQgaW1wbGVtZW50ZWQgYnkgZGF0ZS1mbnM6XG4gKiAtIGBvYCBtb2RpZmllcyB0aGUgcHJldmlvdXMgdG9rZW4gdG8gdHVybiBpdCBpbnRvIGFuIG9yZGluYWwgKHNlZSBgcGFyc2VgIGRvY3MpXG4gKiAtIGBpYCBpcyBJU08gZGF5IG9mIHdlZWsuIEZvciBgaWAgYW5kIGBpaWAgaXMgcmV0dXJucyBudW1lcmljIElTTyB3ZWVrIGRheXMsXG4gKiAgIGkuZS4gNyBmb3IgU3VuZGF5LCAxIGZvciBNb25kYXksIGV0Yy5cbiAqIC0gYElgIGlzIElTTyB3ZWVrIG9mIHllYXIsIGFzIG9wcG9zZWQgdG8gYHdgIHdoaWNoIGlzIGxvY2FsIHdlZWsgb2YgeWVhci5cbiAqIC0gYFJgIGlzIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyLCBhcyBvcHBvc2VkIHRvIGBZYCB3aGljaCBpcyBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogICBgUmAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGBJYCBhbmQgYGlgXG4gKiAgIGZvciB1bml2ZXJzYWwgSVNPIHdlZWstbnVtYmVyaW5nIGRhdGUsIHdoZXJlYXNcbiAqICAgYFlgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgd2AgYW5kIGBlYFxuICogICBmb3Igd2Vlay1udW1iZXJpbmcgZGF0ZSBzcGVjaWZpYyB0byB0aGUgbG9jYWxlLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBJdCdzIG9rLCB3ZSB3YW50IGFueSBoZXJlXG5jb25zdCBwYXJzZXJzID0gKGV4cG9ydHMucGFyc2VycyA9IHtcbiAgRzogbmV3IF9FcmFQYXJzZXIuRXJhUGFyc2VyKCksXG4gIHk6IG5ldyBfWWVhclBhcnNlci5ZZWFyUGFyc2VyKCksXG4gIFk6IG5ldyBfTG9jYWxXZWVrWWVhclBhcnNlci5Mb2NhbFdlZWtZZWFyUGFyc2VyKCksXG4gIFI6IG5ldyBfSVNPV2Vla1llYXJQYXJzZXIuSVNPV2Vla1llYXJQYXJzZXIoKSxcbiAgdTogbmV3IF9FeHRlbmRlZFllYXJQYXJzZXIuRXh0ZW5kZWRZZWFyUGFyc2VyKCksXG4gIFE6IG5ldyBfUXVhcnRlclBhcnNlci5RdWFydGVyUGFyc2VyKCksXG4gIHE6IG5ldyBfU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIuU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIoKSxcbiAgTTogbmV3IF9Nb250aFBhcnNlci5Nb250aFBhcnNlcigpLFxuICBMOiBuZXcgX1N0YW5kQWxvbmVNb250aFBhcnNlci5TdGFuZEFsb25lTW9udGhQYXJzZXIoKSxcbiAgdzogbmV3IF9Mb2NhbFdlZWtQYXJzZXIuTG9jYWxXZWVrUGFyc2VyKCksXG4gIEk6IG5ldyBfSVNPV2Vla1BhcnNlci5JU09XZWVrUGFyc2VyKCksXG4gIGQ6IG5ldyBfRGF0ZVBhcnNlci5EYXRlUGFyc2VyKCksXG4gIEQ6IG5ldyBfRGF5T2ZZZWFyUGFyc2VyLkRheU9mWWVhclBhcnNlcigpLFxuICBFOiBuZXcgX0RheVBhcnNlci5EYXlQYXJzZXIoKSxcbiAgZTogbmV3IF9Mb2NhbERheVBhcnNlci5Mb2NhbERheVBhcnNlcigpLFxuICBjOiBuZXcgX1N0YW5kQWxvbmVMb2NhbERheVBhcnNlci5TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIoKSxcbiAgaTogbmV3IF9JU09EYXlQYXJzZXIuSVNPRGF5UGFyc2VyKCksXG4gIGE6IG5ldyBfQU1QTVBhcnNlci5BTVBNUGFyc2VyKCksXG4gIGI6IG5ldyBfQU1QTU1pZG5pZ2h0UGFyc2VyLkFNUE1NaWRuaWdodFBhcnNlcigpLFxuICBCOiBuZXcgX0RheVBlcmlvZFBhcnNlci5EYXlQZXJpb2RQYXJzZXIoKSxcbiAgaDogbmV3IF9Ib3VyMXRvMTJQYXJzZXIuSG91cjF0bzEyUGFyc2VyKCksXG4gIEg6IG5ldyBfSG91cjB0bzIzUGFyc2VyLkhvdXIwdG8yM1BhcnNlcigpLFxuICBLOiBuZXcgX0hvdXIwVG8xMVBhcnNlci5Ib3VyMFRvMTFQYXJzZXIoKSxcbiAgazogbmV3IF9Ib3VyMVRvMjRQYXJzZXIuSG91cjFUbzI0UGFyc2VyKCksXG4gIG06IG5ldyBfTWludXRlUGFyc2VyLk1pbnV0ZVBhcnNlcigpLFxuICBzOiBuZXcgX1NlY29uZFBhcnNlci5TZWNvbmRQYXJzZXIoKSxcbiAgUzogbmV3IF9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyLkZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIoKSxcbiAgWDogbmV3IF9JU09UaW1lem9uZVdpdGhaUGFyc2VyLklTT1RpbWV6b25lV2l0aFpQYXJzZXIoKSxcbiAgeDogbmV3IF9JU09UaW1lem9uZVBhcnNlci5JU09UaW1lem9uZVBhcnNlcigpLFxuICB0OiBuZXcgX1RpbWVzdGFtcFNlY29uZHNQYXJzZXIuVGltZXN0YW1wU2Vjb25kc1BhcnNlcigpLFxuICBUOiBuZXcgX1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlci5UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIoKSxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkFNUE1NaWRuaWdodFBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgQU1QTU1pZG5pZ2h0UGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDgwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJiXCI6XG4gICAgICBjYXNlIFwiYmJcIjpcbiAgICAgIGNhc2UgXCJiYmJcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSBcImJiYmJiXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJiXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRIb3VycygoMCwgX3V0aWxzLmRheVBlcmlvZEVudW1Ub0hvdXJzKSh2YWx1ZSksIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiYVwiLCBcIkJcIiwgXCJIXCIsIFwia1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5BTVBNTWlkbmlnaHRQYXJzZXIgPSBBTVBNTWlkbmlnaHRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuQU1QTVBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgQU1QTVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA4MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgY2FzZSBcImFhXCI6XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgXCJhYWFhYVwiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYWFhYVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0SG91cnMoKDAsIF91dGlscy5kYXlQZXJpb2RFbnVtVG9Ib3VycykodmFsdWUpLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcImJcIiwgXCJCXCIsIFwiSFwiLCBcImtcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuQU1QTVBhcnNlciA9IEFNUE1QYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRGF0ZVBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY29uc3QgREFZU19JTl9NT05USCA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcbmNvbnN0IERBWVNfSU5fTU9OVEhfTEVBUF9ZRUFSID0gW1xuICAzMSwgMjksIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxLFxuXTtcblxuLy8gRGF5IG9mIHRoZSBtb250aFxuY2xhc3MgRGF0ZVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcbiAgc3ViUHJpb3JpdHkgPSAxO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmRhdGUsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJkb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKGRhdGUsIHZhbHVlKSB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBpc0xlYXBZZWFyID0gKDAsIF91dGlscy5pc0xlYXBZZWFySW5kZXgpKHllYXIpO1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIGlmIChpc0xlYXBZZWFyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSBEQVlTX0lOX01PTlRIX0xFQVBfWUVBUlttb250aF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IERBWVNfSU5fTU9OVEhbbW9udGhdO1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXREYXRlKHZhbHVlKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiWVwiLFxuICAgIFwiUlwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwid1wiLFxuICAgIFwiSVwiLFxuICAgIFwiRFwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5EYXRlUGFyc2VyID0gRGF0ZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5EYXlPZlllYXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIERheU9mWWVhclBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcblxuICBzdWJwcmlvcml0eSA9IDE7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkRcIjpcbiAgICAgIGNhc2UgXCJERFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5kYXlPZlllYXIsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJEb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKGRhdGUsIHZhbHVlKSB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBpc0xlYXBZZWFyID0gKDAsIF91dGlscy5pc0xlYXBZZWFySW5kZXgpKHllYXIpO1xuICAgIGlmIChpc0xlYXBZZWFyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAzNjY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDM2NTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TW9udGgoMCwgdmFsdWUpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJZXCIsXG4gICAgXCJSXCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJFXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLkRheU9mWWVhclBhcnNlciA9IERheU9mWWVhclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5EYXlQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3NldERheS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxuLy8gRGF5IG9mIHdlZWtcbmNsYXNzIERheVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiRUVcIjpcbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gVFxuICAgICAgY2FzZSBcIkVFRUVFXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiRUVFRUVFXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcIkVFRUVcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDY7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIGRhdGUgPSAoMCwgX2luZGV4LnNldERheSkoZGF0ZSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJEXCIsIFwiaVwiLCBcImVcIiwgXCJjXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkRheVBhcnNlciA9IERheVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5EYXlQZXJpb2RQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbmNsYXNzIERheVBlcmlvZFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA4MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiQlwiOlxuICAgICAgY2FzZSBcIkJCXCI6XG4gICAgICBjYXNlIFwiQkJCXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgXCJCQkJCQlwiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiQkJCQlwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0SG91cnMoKDAsIF91dGlscy5kYXlQZXJpb2RFbnVtVG9Ib3VycykodmFsdWUpLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcImFcIiwgXCJiXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkRheVBlcmlvZFBhcnNlciA9IERheVBlcmlvZFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5FcmFQYXJzZXIgPSB2b2lkIDA7XG5cbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxuY2xhc3MgRXJhUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDE0MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBBRCwgQkNcbiAgICAgIGNhc2UgXCJHXCI6XG4gICAgICBjYXNlIFwiR0dcIjpcbiAgICAgIGNhc2UgXCJHR0dcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJhYmJyZXZpYXRlZFwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gQSwgQlxuICAgICAgY2FzZSBcIkdHR0dHXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiB9KTtcbiAgICAgIC8vIEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0XG4gICAgICBjYXNlIFwiR0dHR1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJ3aWRlXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJhYmJyZXZpYXRlZFwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZXJhKGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlKSB7XG4gICAgZmxhZ3MuZXJhID0gdmFsdWU7XG4gICAgZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZSwgMCwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcIlJcIiwgXCJ1XCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkVyYVBhcnNlciA9IEVyYVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5FeHRlbmRlZFllYXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEV4dGVuZGVkWWVhclBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHtcbiAgICBpZiAodG9rZW4gPT09IFwidVwiKSB7XG4gICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHNTaWduZWQpKDQsIGRhdGVTdHJpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0c1NpZ25lZCkodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRGdWxsWWVhcih2YWx1ZSwgMCwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcIkdcIiwgXCJ5XCIsIFwiWVwiLCBcIlJcIiwgXCJ3XCIsIFwiSVwiLCBcImlcIiwgXCJlXCIsIFwiY1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5FeHRlbmRlZFllYXJQYXJzZXIgPSBFeHRlbmRlZFllYXJQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuRnJhY3Rpb25PZlNlY29uZFBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgRnJhY3Rpb25PZlNlY29uZFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAzMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUpID0+XG4gICAgICBNYXRoLnRydW5jKHZhbHVlICogTWF0aC5wb3coMTAsIC10b2tlbi5sZW5ndGggKyAzKSk7XG4gICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksXG4gICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TWlsbGlzZWNvbmRzKHZhbHVlKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5GcmFjdGlvbk9mU2Vjb25kUGFyc2VyID0gRnJhY3Rpb25PZlNlY29uZFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Ib3VyMFRvMTFQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEhvdXIwVG8xMVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA3MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiS1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5ob3VyMTFoLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiS29cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxMTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgY29uc3QgaXNQTSA9IGRhdGUuZ2V0SG91cnMoKSA+PSAxMjtcbiAgICBpZiAoaXNQTSAmJiB2YWx1ZSA8IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKHZhbHVlICsgMTIsIDAsIDAsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlLnNldEhvdXJzKHZhbHVlLCAwLCAwLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJoXCIsIFwiSFwiLCBcImtcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuSG91cjBUbzExUGFyc2VyID0gSG91cjBUbzExUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkhvdXIwdG8yM1BhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgSG91cjB0bzIzUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDcwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmhvdXIyM2gsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJIb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDIzO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldEhvdXJzKHZhbHVlLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcImFcIiwgXCJiXCIsIFwiaFwiLCBcIktcIiwgXCJrXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkhvdXIwdG8yM1BhcnNlciA9IEhvdXIwdG8yM1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Ib3VyMVRvMjRQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEhvdXIxVG8yNFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA3MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwia1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5ob3VyMjRoLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwia29cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAyNDtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgY29uc3QgaG91cnMgPSB2YWx1ZSA8PSAyNCA/IHZhbHVlICUgMjQgOiB2YWx1ZTtcbiAgICBkYXRlLnNldEhvdXJzKGhvdXJzLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcImFcIiwgXCJiXCIsIFwiaFwiLCBcIkhcIiwgXCJLXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkhvdXIxVG8yNFBhcnNlciA9IEhvdXIxVG8yNFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Ib3VyMXRvMTJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIEhvdXIxdG8xMlBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA3MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiaFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5ob3VyMTJoLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiaG9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAxMjtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgY29uc3QgaXNQTSA9IGRhdGUuZ2V0SG91cnMoKSA+PSAxMjtcbiAgICBpZiAoaXNQTSAmJiB2YWx1ZSA8IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKHZhbHVlICsgMTIsIDAsIDAsIDApO1xuICAgIH0gZWxzZSBpZiAoIWlzUE0gJiYgdmFsdWUgPT09IDEyKSB7XG4gICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlLnNldEhvdXJzKHZhbHVlLCAwLCAwLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJIXCIsIFwiS1wiLCBcImtcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuSG91cjF0bzEyUGFyc2VyID0gSG91cjF0bzEyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLklTT0RheVBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vc2V0SVNPRGF5LmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBJU08gZGF5IG9mIHdlZWtcbmNsYXNzIElTT0RheVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDc7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDJcbiAgICAgIGNhc2UgXCJpXCI6XG4gICAgICBjYXNlIFwiaWlcIjogLy8gMDJcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgICAgLy8gMm5kXG4gICAgICBjYXNlIFwiaW9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiaWlpXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImlpaWlpXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJpaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiaWlpaVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSA3O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlID0gKDAsIF9pbmRleC5zZXRJU09EYXkpKGRhdGUsIHZhbHVlKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwieVwiLFxuICAgIFwiWVwiLFxuICAgIFwidVwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiRVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5JU09EYXlQYXJzZXIgPSBJU09EYXlQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSVNPVGltZXpvbmVQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanNcIik7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIFRpbWV6b25lIChJU08tODYwMSlcbmNsYXNzIElTT1RpbWV6b25lUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5iYXNpY09wdGlvbmFsTWludXRlcyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInh4XCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJ4eHh4XCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbFNlY29uZHMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJ4eHh4eFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkT3B0aW9uYWxTZWNvbmRzLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwieHh4XCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZSkge1xuICAgIGlmIChmbGFncy50aW1lc3RhbXBJc1NldCkgcmV0dXJuIGRhdGU7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoXG4gICAgICBkYXRlLFxuICAgICAgZGF0ZS5nZXRUaW1lKCkgLVxuICAgICAgICAoMCwgX2luZGV4Mi5nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKShkYXRlKSAtXG4gICAgICAgIHZhbHVlLFxuICAgICk7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJ0XCIsIFwiVFwiLCBcIlhcIl07XG59XG5leHBvcnRzLklTT1RpbWV6b25lUGFyc2VyID0gSVNPVGltZXpvbmVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSVNPVGltZXpvbmVXaXRoWlBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uLy4uL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy5qc1wiKTtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gVGltZXpvbmUgKElTTy04NjAxLiArMDA6MDAgaXMgYCdaJ2ApXG5jbGFzcyBJU09UaW1lem9uZVdpdGhaUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5iYXNpY09wdGlvbmFsTWludXRlcyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIlhYXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJYWFhYXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuYmFzaWNPcHRpb25hbFNlY29uZHMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJYWFhYWFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkT3B0aW9uYWxTZWNvbmRzLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiWFhYXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmV4dGVuZGVkLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZSkge1xuICAgIGlmIChmbGFncy50aW1lc3RhbXBJc1NldCkgcmV0dXJuIGRhdGU7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoXG4gICAgICBkYXRlLFxuICAgICAgZGF0ZS5nZXRUaW1lKCkgLVxuICAgICAgICAoMCwgX2luZGV4Mi5nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKShkYXRlKSAtXG4gICAgICAgIHZhbHVlLFxuICAgICk7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJ0XCIsIFwiVFwiLCBcInhcIl07XG59XG5leHBvcnRzLklTT1RpbWV6b25lV2l0aFpQYXJzZXIgPSBJU09UaW1lem9uZVdpdGhaUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLklTT1dlZWtQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3NldElTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zdGFydE9mSVNPV2Vlay5qc1wiKTtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gSVNPIHdlZWsgb2YgeWVhclxuY2xhc3MgSVNPV2Vla1BhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMDA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIklcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMud2VlayxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIklvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJ3ZWVrXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gNTM7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIHJldHVybiAoMCwgX2luZGV4Mi5zdGFydE9mSVNPV2VlaykoKDAsIF9pbmRleC5zZXRJU09XZWVrKShkYXRlLCB2YWx1ZSkpO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwieVwiLFxuICAgIFwiWVwiLFxuICAgIFwidVwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5JU09XZWVrUGFyc2VyID0gSVNPV2Vla1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5JU09XZWVrWWVhclBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vc3RhcnRPZklTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuY2xhc3MgSVNPV2Vla1llYXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTMwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7XG4gICAgaWYgKHRva2VuID09PSBcIlJcIikge1xuICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzU2lnbmVkKSg0LCBkYXRlU3RyaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHNTaWduZWQpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGNvbnN0IGZpcnN0V2Vla09mWWVhciA9ICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICAgIGZpcnN0V2Vla09mWWVhci5zZXRGdWxsWWVhcih2YWx1ZSwgMCwgNCk7XG4gICAgZmlyc3RXZWVrT2ZZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiAoMCwgX2luZGV4LnN0YXJ0T2ZJU09XZWVrKShmaXJzdFdlZWtPZlllYXIpO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiR1wiLFxuICAgIFwieVwiLFxuICAgIFwiWVwiLFxuICAgIFwidVwiLFxuICAgIFwiUVwiLFxuICAgIFwicVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5JU09XZWVrWWVhclBhcnNlciA9IElTT1dlZWtZZWFyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkxvY2FsRGF5UGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zZXREYXkuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIExvY2FsIGRheSBvZiB3ZWVrXG5jbGFzcyBMb2NhbERheVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gV2Ugd2FudCBoZXJlIGZsb29yIGluc3RlYWQgb2YgdHJ1bmMsIHNvIHdlIGdldCAtNyBmb3IgdmFsdWUgMCBpbnN0ZWFkIG9mIDBcbiAgICAgIGNvbnN0IHdob2xlV2Vla0RheXMgPSBNYXRoLmZsb29yKCh2YWx1ZSAtIDEpIC8gNykgKiA3O1xuICAgICAgcmV0dXJuICgodmFsdWUgKyBvcHRpb25zLndlZWtTdGFydHNPbiArIDYpICUgNykgKyB3aG9sZVdlZWtEYXlzO1xuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAzXG4gICAgICBjYXNlIFwiZVwiOlxuICAgICAgY2FzZSBcImVlXCI6IC8vIDAzXG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gM3JkXG4gICAgICBjYXNlIFwiZW9cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgdW5pdDogXCJkYXlcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiZWVlXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJlZWVlZVwiOlxuICAgICAgICByZXR1cm4gbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImVlZWVlZVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJlZWVlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA2O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBkYXRlID0gKDAsIF9pbmRleC5zZXREYXkpKGRhdGUsIHZhbHVlLCBvcHRpb25zKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwieVwiLFxuICAgIFwiUlwiLFxuICAgIFwidVwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiRVwiLFxuICAgIFwiaVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5Mb2NhbERheVBhcnNlciA9IExvY2FsRGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkxvY2FsV2Vla1BhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vc2V0V2Vlay5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uLy4uL3N0YXJ0T2ZXZWVrLmpzXCIpO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBMb2NhbCB3ZWVrIG9mIHllYXJcbmNsYXNzIExvY2FsV2Vla1BhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMDA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIndcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMud2VlayxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIndvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJ3ZWVrXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gNTM7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIHJldHVybiAoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoXG4gICAgICAoMCwgX2luZGV4LnNldFdlZWspKGRhdGUsIHZhbHVlLCBvcHRpb25zKSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcInlcIixcbiAgICBcIlJcIixcbiAgICBcInVcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIklcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuTG9jYWxXZWVrUGFyc2VyID0gTG9jYWxXZWVrUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkxvY2FsV2Vla1llYXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL2dldFdlZWtZZWFyLmpzXCIpO1xuXG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zdGFydE9mV2Vlay5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuY2xhc3MgTG9jYWxXZWVrWWVhclBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh5ZWFyKSA9PiAoe1xuICAgICAgeWVhcixcbiAgICAgIGlzVHdvRGlnaXRZZWFyOiB0b2tlbiA9PT0gXCJZWVwiLFxuICAgIH0pO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIllcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSg0LCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIllvXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHVuaXQ6IFwieWVhclwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUuaXNUd29EaWdpdFllYXIgfHwgdmFsdWUueWVhciA+IDA7XG4gIH1cblxuICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSAoMCwgX2luZGV4LmdldFdlZWtZZWFyKShkYXRlLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZS5pc1R3b0RpZ2l0WWVhcikge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR3b0RpZ2l0WWVhciA9ICgwLCBfdXRpbHMubm9ybWFsaXplVHdvRGlnaXRZZWFyKShcbiAgICAgICAgdmFsdWUueWVhcixcbiAgICAgICAgY3VycmVudFllYXIsXG4gICAgICApO1xuICAgICAgZGF0ZS5zZXRGdWxsWWVhcihcbiAgICAgICAgbm9ybWFsaXplZFR3b0RpZ2l0WWVhcixcbiAgICAgICAgMCxcbiAgICAgICAgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgICApO1xuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIHJldHVybiAoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoZGF0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgeWVhciA9XG4gICAgICAhKFwiZXJhXCIgaW4gZmxhZ3MpIHx8IGZsYWdzLmVyYSA9PT0gMSA/IHZhbHVlLnllYXIgOiAxIC0gdmFsdWUueWVhcjtcbiAgICBkYXRlLnNldEZ1bGxZZWFyKHllYXIsIDAsIG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiAoMCwgX2luZGV4Mi5zdGFydE9mV2VlaykoZGF0ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJ5XCIsXG4gICAgXCJSXCIsXG4gICAgXCJ1XCIsXG4gICAgXCJRXCIsXG4gICAgXCJxXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLkxvY2FsV2Vla1llYXJQYXJzZXIgPSBMb2NhbFdlZWtZZWFyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLk1pbnV0ZVBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgTWludXRlUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDYwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLm1pbnV0ZSxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIm1vXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJtaW51dGVcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSA1OTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRNaW51dGVzKHZhbHVlLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5NaW51dGVQYXJzZXIgPSBNaW51dGVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuTW9udGhQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIE1vbnRoUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJZXCIsXG4gICAgXCJSXCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJMXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJJXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG5cbiAgcHJpb3JpdHkgPSAxMTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZSkgPT4gdmFsdWUgLSAxO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5tb250aCxcbiAgICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICAgKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gMDEsIDAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSgyLCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aFxuICAgICAgY2FzZSBcIk1vXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHVuaXQ6IFwibW9udGhcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG4gICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gSiwgRiwgLi4uLCBEXG4gICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlclxuICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxMTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRNb250aCh2YWx1ZSwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxufVxuZXhwb3J0cy5Nb250aFBhcnNlciA9IE1vbnRoUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlF1YXJ0ZXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIFF1YXJ0ZXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTIwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJRXCI6XG4gICAgICBjYXNlIFwiUVFcIjogLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwiUW9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwiUVFRXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwiUVFRUVFcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwiUVFRUVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSA0O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldE1vbnRoKCh2YWx1ZSAtIDEpICogMywgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIllcIixcbiAgICBcIlJcIixcbiAgICBcInFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcIklcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuUXVhcnRlclBhcnNlciA9IFF1YXJ0ZXJQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuU2Vjb25kUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBTZWNvbmRQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuc2Vjb25kLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwic29cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcInNlY29uZFwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDU5O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldFNlY29uZHModmFsdWUsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1widFwiLCBcIlRcIl07XG59XG5leHBvcnRzLlNlY29uZFBhcnNlciA9IFNlY29uZFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5TdGFuZEFsb25lTG9jYWxEYXlQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3NldERheS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWtcbmNsYXNzIFN0YW5kQWxvbmVMb2NhbERheVBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA5MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlKSA9PiB7XG4gICAgICAvLyBXZSB3YW50IGhlcmUgZmxvb3IgaW5zdGVhZCBvZiB0cnVuYywgc28gd2UgZ2V0IC03IGZvciB2YWx1ZSAwIGluc3RlYWQgb2YgMFxuICAgICAgY29uc3Qgd2hvbGVXZWVrRGF5cyA9IE1hdGguZmxvb3IoKHZhbHVlIC0gMSkgLyA3KSAqIDc7XG4gICAgICByZXR1cm4gKCh2YWx1ZSArIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgNikgJSA3KSArIHdob2xlV2Vla0RheXM7XG4gICAgfTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDNcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICBjYXNlIFwiY2NcIjogLy8gMDNcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyAzcmRcbiAgICAgIGNhc2UgXCJjb1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB1bml0OiBcImRheVwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJjY2NcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImNjY2NjXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiY2NjY2NjXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImNjY2NcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDY7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIGRhdGUgPSAoMCwgX2luZGV4LnNldERheSkoZGF0ZSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJ5XCIsXG4gICAgXCJSXCIsXG4gICAgXCJ1XCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJFXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLlN0YW5kQWxvbmVMb2NhbERheVBhcnNlciA9IFN0YW5kQWxvbmVMb2NhbERheVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5TdGFuZEFsb25lTW9udGhQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIFN0YW5kQWxvbmVNb250aFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZSkgPT4gdmFsdWUgLSAxO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5tb250aCxcbiAgICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICAgKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gMDEsIDAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSgyLCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gMXN0LCAybmQsIC4uLiwgMTJ0aFxuICAgICAgY2FzZSBcIkxvXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHVuaXQ6IFwibW9udGhcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG4gICAgICBjYXNlIFwiTExMXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gSiwgRiwgLi4uLCBEXG4gICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm1vbnRoKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlclxuICAgICAgY2FzZSBcIkxMTExcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gubW9udGgoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxMTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRNb250aCh2YWx1ZSwgMSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIllcIixcbiAgICBcIlJcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIndcIixcbiAgICBcIklcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuU3RhbmRBbG9uZU1vbnRoUGFyc2VyID0gU3RhbmRBbG9uZU1vbnRoUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlN0YW5kQWxvbmVRdWFydGVyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBTdGFuZEFsb25lUXVhcnRlclBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMjA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgMywgNFxuICAgICAgY2FzZSBcInFcIjpcbiAgICAgIGNhc2UgXCJxcVwiOiAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJxb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJxcXFcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcbiAgICAgIGNhc2UgXCJxcXFxcVwiOlxuICAgICAgICByZXR1cm4gbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi5cbiAgICAgIGNhc2UgXCJxcXFxXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDQ7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TW9udGgoKHZhbHVlIC0gMSkgKiAzLCAxKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiWVwiLFxuICAgIFwiUlwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5TdGFuZEFsb25lUXVhcnRlclBhcnNlciA9IFN0YW5kQWxvbmVRdWFydGVyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlRpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDIwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcpIHtcbiAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZUFueURpZ2l0c1NpZ25lZCkoZGF0ZVN0cmluZyk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIHJldHVybiBbKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCB2YWx1ZSksIHsgdGltZXN0YW1wSXNTZXQ6IHRydWUgfV07XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBcIipcIjtcbn1cbmV4cG9ydHMuVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyID0gVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlRpbWVzdGFtcFNlY29uZHNQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIFRpbWVzdGFtcFNlY29uZHNQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNDA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZykge1xuICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlQW55RGlnaXRzU2lnbmVkKShkYXRlU3RyaW5nKTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgdmFsdWUgKiAxMDAwKSxcbiAgICAgIHsgdGltZXN0YW1wSXNTZXQ6IHRydWUgfSxcbiAgICBdO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gXCIqXCI7XG59XG5leHBvcnRzLlRpbWVzdGFtcFNlY29uZHNQYXJzZXIgPSBUaW1lc3RhbXBTZWNvbmRzUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlllYXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIEZyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS0zMS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9Gb3JtYXRfUGF0dGVybnNcbi8vIHwgWWVhciAgICAgfCAgICAgeSB8IHl5IHwgICB5eXkgfCAgeXl5eSB8IHl5eXl5IHxcbi8vIHwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXxcbi8vIHwgQUQgMSAgICAgfCAgICAgMSB8IDAxIHwgICAwMDEgfCAgMDAwMSB8IDAwMDAxIHxcbi8vIHwgQUQgMTIgICAgfCAgICAxMiB8IDEyIHwgICAwMTIgfCAgMDAxMiB8IDAwMDEyIHxcbi8vIHwgQUQgMTIzICAgfCAgIDEyMyB8IDIzIHwgICAxMjMgfCAgMDEyMyB8IDAwMTIzIHxcbi8vIHwgQUQgMTIzNCAgfCAgMTIzNCB8IDM0IHwgIDEyMzQgfCAgMTIzNCB8IDAxMjM0IHxcbi8vIHwgQUQgMTIzNDUgfCAxMjM0NSB8IDQ1IHwgMTIzNDUgfCAxMjM0NSB8IDEyMzQ1IHxcbmNsYXNzIFllYXJQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTMwO1xuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJZXCIsIFwiUlwiLCBcInVcIiwgXCJ3XCIsIFwiSVwiLCBcImlcIiwgXCJlXCIsIFwiY1wiLCBcInRcIiwgXCJUXCJdO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAoeWVhcikgPT4gKHtcbiAgICAgIHllYXIsXG4gICAgICBpc1R3b0RpZ2l0WWVhcjogdG9rZW4gPT09IFwieXlcIixcbiAgICB9KTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykoNCwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJ5b1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB1bml0OiBcInllYXJcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmlzVHdvRGlnaXRZZWFyIHx8IHZhbHVlLnllYXIgPiAwO1xuICB9XG5cbiAgc2V0KGRhdGUsIGZsYWdzLCB2YWx1ZSkge1xuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gICAgaWYgKHZhbHVlLmlzVHdvRGlnaXRZZWFyKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkVHdvRGlnaXRZZWFyID0gKDAsIF91dGlscy5ub3JtYWxpemVUd29EaWdpdFllYXIpKFxuICAgICAgICB2YWx1ZS55ZWFyLFxuICAgICAgICBjdXJyZW50WWVhcixcbiAgICAgICk7XG4gICAgICBkYXRlLnNldEZ1bGxZZWFyKG5vcm1hbGl6ZWRUd29EaWdpdFllYXIsIDAsIDEpO1xuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIGNvbnN0IHllYXIgPVxuICAgICAgIShcImVyYVwiIGluIGZsYWdzKSB8fCBmbGFncy5lcmEgPT09IDEgPyB2YWx1ZS55ZWFyIDogMSAtIHZhbHVlLnllYXI7XG4gICAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyLCAwLCAxKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG59XG5leHBvcnRzLlllYXJQYXJzZXIgPSBZZWFyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmRheVBlcmlvZEVudW1Ub0hvdXJzID0gZGF5UGVyaW9kRW51bVRvSG91cnM7XG5leHBvcnRzLmlzTGVhcFllYXJJbmRleCA9IGlzTGVhcFllYXJJbmRleDtcbmV4cG9ydHMubWFwVmFsdWUgPSBtYXBWYWx1ZTtcbmV4cG9ydHMubm9ybWFsaXplVHdvRGlnaXRZZWFyID0gbm9ybWFsaXplVHdvRGlnaXRZZWFyO1xuZXhwb3J0cy5wYXJzZUFueURpZ2l0c1NpZ25lZCA9IHBhcnNlQW55RGlnaXRzU2lnbmVkO1xuZXhwb3J0cy5wYXJzZU5EaWdpdHMgPSBwYXJzZU5EaWdpdHM7XG5leHBvcnRzLnBhcnNlTkRpZ2l0c1NpZ25lZCA9IHBhcnNlTkRpZ2l0c1NpZ25lZDtcbmV4cG9ydHMucGFyc2VOdW1lcmljUGF0dGVybiA9IHBhcnNlTnVtZXJpY1BhdHRlcm47XG5leHBvcnRzLnBhcnNlVGltZXpvbmVQYXR0ZXJuID0gcGFyc2VUaW1lem9uZVBhdHRlcm47XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uL2NvbnN0YW50cy5qc1wiKTtcblxudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG5cbmZ1bmN0aW9uIG1hcFZhbHVlKHBhcnNlRm5SZXN1bHQsIG1hcEZuKSB7XG4gIGlmICghcGFyc2VGblJlc3VsdCkge1xuICAgIHJldHVybiBwYXJzZUZuUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogbWFwRm4ocGFyc2VGblJlc3VsdC52YWx1ZSksXG4gICAgcmVzdDogcGFyc2VGblJlc3VsdC5yZXN0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZU51bWVyaWNQYXR0ZXJuKHBhdHRlcm4sIGRhdGVTdHJpbmcpIHtcbiAgY29uc3QgbWF0Y2hSZXN1bHQgPSBkYXRlU3RyaW5nLm1hdGNoKHBhdHRlcm4pO1xuXG4gIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHBhcnNlSW50KG1hdGNoUmVzdWx0WzBdLCAxMCksXG4gICAgcmVzdDogZGF0ZVN0cmluZy5zbGljZShtYXRjaFJlc3VsdFswXS5sZW5ndGgpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVRpbWV6b25lUGF0dGVybihwYXR0ZXJuLCBkYXRlU3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoUmVzdWx0ID0gZGF0ZVN0cmluZy5tYXRjaChwYXR0ZXJuKTtcblxuICBpZiAoIW1hdGNoUmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBJbnB1dCBpcyAnWidcbiAgaWYgKG1hdGNoUmVzdWx0WzBdID09PSBcIlpcIikge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogMCxcbiAgICAgIHJlc3Q6IGRhdGVTdHJpbmcuc2xpY2UoMSksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHNpZ24gPSBtYXRjaFJlc3VsdFsxXSA9PT0gXCIrXCIgPyAxIDogLTE7XG4gIGNvbnN0IGhvdXJzID0gbWF0Y2hSZXN1bHRbMl0gPyBwYXJzZUludChtYXRjaFJlc3VsdFsyXSwgMTApIDogMDtcbiAgY29uc3QgbWludXRlcyA9IG1hdGNoUmVzdWx0WzNdID8gcGFyc2VJbnQobWF0Y2hSZXN1bHRbM10sIDEwKSA6IDA7XG4gIGNvbnN0IHNlY29uZHMgPSBtYXRjaFJlc3VsdFs1XSA/IHBhcnNlSW50KG1hdGNoUmVzdWx0WzVdLCAxMCkgOiAwO1xuXG4gIHJldHVybiB7XG4gICAgdmFsdWU6XG4gICAgICBzaWduICpcbiAgICAgIChob3VycyAqIF9pbmRleC5taWxsaXNlY29uZHNJbkhvdXIgK1xuICAgICAgICBtaW51dGVzICogX2luZGV4Lm1pbGxpc2Vjb25kc0luTWludXRlICtcbiAgICAgICAgc2Vjb25kcyAqIF9pbmRleC5taWxsaXNlY29uZHNJblNlY29uZCksXG4gICAgcmVzdDogZGF0ZVN0cmluZy5zbGljZShtYXRjaFJlc3VsdFswXS5sZW5ndGgpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZUFueURpZ2l0c1NpZ25lZChkYXRlU3RyaW5nKSB7XG4gIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmFueURpZ2l0c1NpZ25lZCxcbiAgICBkYXRlU3RyaW5nLFxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJzZU5EaWdpdHMobiwgZGF0ZVN0cmluZykge1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuc2luZ2xlRGlnaXQsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy50d29EaWdpdHMsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy50aHJlZURpZ2l0cyxcbiAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICk7XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmZvdXJEaWdpdHMsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihuZXcgUmVnRXhwKFwiXlxcXFxkezEsXCIgKyBuICsgXCJ9XCIpLCBkYXRlU3RyaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZU5EaWdpdHNTaWduZWQobiwgZGF0ZVN0cmluZykge1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuc2luZ2xlRGlnaXRTaWduZWQsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy50d29EaWdpdHNTaWduZWQsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy50aHJlZURpZ2l0c1NpZ25lZCxcbiAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICk7XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmZvdXJEaWdpdHNTaWduZWQsXG4gICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICApO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihuZXcgUmVnRXhwKFwiXi0/XFxcXGR7MSxcIiArIG4gKyBcIn1cIiksIGRhdGVTdHJpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRheVBlcmlvZEVudW1Ub0hvdXJzKGRheVBlcmlvZCkge1xuICBzd2l0Y2ggKGRheVBlcmlvZCkge1xuICAgIGNhc2UgXCJtb3JuaW5nXCI6XG4gICAgICByZXR1cm4gNDtcbiAgICBjYXNlIFwiZXZlbmluZ1wiOlxuICAgICAgcmV0dXJuIDE3O1xuICAgIGNhc2UgXCJwbVwiOlxuICAgIGNhc2UgXCJub29uXCI6XG4gICAgY2FzZSBcImFmdGVybm9vblwiOlxuICAgICAgcmV0dXJuIDEyO1xuICAgIGNhc2UgXCJhbVwiOlxuICAgIGNhc2UgXCJtaWRuaWdodFwiOlxuICAgIGNhc2UgXCJuaWdodFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVUd29EaWdpdFllYXIodHdvRGlnaXRZZWFyLCBjdXJyZW50WWVhcikge1xuICBjb25zdCBpc0NvbW1vbkVyYSA9IGN1cnJlbnRZZWFyID4gMDtcbiAgLy8gQWJzb2x1dGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHllYXI6XG4gIC8vIDEgLT4gMSBBQ1xuICAvLyAwIC0+IDEgQkNcbiAgLy8gLTEgLT4gMiBCQ1xuICBjb25zdCBhYnNDdXJyZW50WWVhciA9IGlzQ29tbW9uRXJhID8gY3VycmVudFllYXIgOiAxIC0gY3VycmVudFllYXI7XG5cbiAgbGV0IHJlc3VsdDtcbiAgaWYgKGFic0N1cnJlbnRZZWFyIDw9IDUwKSB7XG4gICAgcmVzdWx0ID0gdHdvRGlnaXRZZWFyIHx8IDEwMDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCByYW5nZUVuZCA9IGFic0N1cnJlbnRZZWFyICsgNTA7XG4gICAgY29uc3QgcmFuZ2VFbmRDZW50dXJ5ID0gTWF0aC50cnVuYyhyYW5nZUVuZCAvIDEwMCkgKiAxMDA7XG4gICAgY29uc3QgaXNQcmV2aW91c0NlbnR1cnkgPSB0d29EaWdpdFllYXIgPj0gcmFuZ2VFbmQgJSAxMDA7XG4gICAgcmVzdWx0ID0gdHdvRGlnaXRZZWFyICsgcmFuZ2VFbmRDZW50dXJ5IC0gKGlzUHJldmlvdXNDZW50dXJ5ID8gMTAwIDogMCk7XG4gIH1cblxuICByZXR1cm4gaXNDb21tb25FcmEgPyByZXN1bHQgOiAxIC0gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc0xlYXBZZWFySW5kZXgoeWVhcikge1xuICByZXR1cm4geWVhciAlIDQwMCA9PT0gMCB8fCAoeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0ID0gc2V0O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3NldE1vbnRoLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0XG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCBkYXRlIHZhbHVlcyB0byBhIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgZGF0ZSB2YWx1ZXMgdG8gYSBnaXZlbiBkYXRlLlxuICpcbiAqIFNldHMgdGltZSB2YWx1ZXMgdG8gZGF0ZSBmcm9tIG9iamVjdCBgdmFsdWVzYC5cbiAqIEEgdmFsdWUgaXMgbm90IHNldCBpZiBpdCBpcyB1bmRlZmluZWQgb3IgbnVsbCBvciBkb2Vzbid0IGV4aXN0IGluIGB2YWx1ZXNgLlxuICpcbiAqIE5vdGUgYWJvdXQgYnVuZGxlIHNpemU6IGBzZXRgIGRvZXMgbm90IGludGVybmFsbHkgdXNlIGBzZXRYYCBmdW5jdGlvbnMgZnJvbSBkYXRlLWZucyBidXQgaW5zdGVhZCBvcHRzXG4gKiB0byB1c2UgbmF0aXZlIGBEYXRlI3NldFhgIG1ldGhvZHMuIElmIHlvdSB1c2UgdGhpcyBmdW5jdGlvbiwgeW91IG1heSBub3Qgd2FudCB0byBpbmNsdWRlIHRoZVxuICogb3RoZXIgYHNldFhgIGZ1bmN0aW9ucyB0aGF0IGRhdGUtZm5zIHByb3ZpZGVzIGlmIHlvdSBhcmUgY29uY2VybmVkIGFib3V0IHRoZSBidW5kbGUgc2l6ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgZGF0ZSB2YWx1ZXMgdG8gYmUgc2V0XG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggb3B0aW9ucyBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVHJhbnNmb3JtIDEgU2VwdGVtYmVyIDIwMTQgaW50byAyMCBPY3RvYmVyIDIwMTUgaW4gYSBzaW5nbGUgbGluZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldChuZXcgRGF0ZSgyMDE0LCA4LCAyMCksIHsgeWVhcjogMjAxNSwgbW9udGg6IDksIGRhdGU6IDIwIH0pXG4gKiAvLz0+IFR1ZSBPY3QgMjAgMjAxNSAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgMTIgUE0gdG8gMSBTZXB0ZW1iZXIgMjAxNCAwMToyMzo0NSB0byAxIFNlcHRlbWJlciAyMDE0IDEyOjAwOjAwOlxuICogY29uc3QgcmVzdWx0ID0gc2V0KG5ldyBEYXRlKDIwMTQsIDgsIDEsIDEsIDIzLCA0NSksIHsgaG91cnM6IDEyIH0pXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAxMjoyMzo0NVxuICovXG5cbmZ1bmN0aW9uIHNldChkYXRlLCB2YWx1ZXMpIHtcbiAgbGV0IF9kYXRlID0gKDAsIF9pbmRleDMudG9EYXRlKShkYXRlKTtcblxuICAvLyBDaGVjayBpZiBkYXRlIGlzIEludmFsaWQgRGF0ZSBiZWNhdXNlIERhdGUucHJvdG90eXBlLnNldEZ1bGxZZWFyIGlnbm9yZXMgdGhlIHZhbHVlIG9mIEludmFsaWQgRGF0ZVxuICBpZiAoaXNOYU4oK19kYXRlKSkge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIE5hTik7XG4gIH1cblxuICBpZiAodmFsdWVzLnllYXIgIT0gbnVsbCkge1xuICAgIF9kYXRlLnNldEZ1bGxZZWFyKHZhbHVlcy55ZWFyKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMubW9udGggIT0gbnVsbCkge1xuICAgIF9kYXRlID0gKDAsIF9pbmRleDIuc2V0TW9udGgpKF9kYXRlLCB2YWx1ZXMubW9udGgpO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5kYXRlICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXREYXRlKHZhbHVlcy5kYXRlKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMuaG91cnMgIT0gbnVsbCkge1xuICAgIF9kYXRlLnNldEhvdXJzKHZhbHVlcy5ob3Vycyk7XG4gIH1cblxuICBpZiAodmFsdWVzLm1pbnV0ZXMgIT0gbnVsbCkge1xuICAgIF9kYXRlLnNldE1pbnV0ZXModmFsdWVzLm1pbnV0ZXMpO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5zZWNvbmRzICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXRTZWNvbmRzKHZhbHVlcy5zZWNvbmRzKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMubWlsbGlzZWNvbmRzICE9IG51bGwpIHtcbiAgICBfZGF0ZS5zZXRNaWxsaXNlY29uZHModmFsdWVzLm1pbGxpc2Vjb25kcyk7XG4gIH1cblxuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0RGF5ID0gc2V0RGF5O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZERheXMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc2V0RGF5fSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc2V0RGF5XG4gKiBAY2F0ZWdvcnkgV2Vla2RheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIGRheSBvZiB0aGUgd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgZGF5IG9mIHRoZSB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGRheSAtIFRoZSBkYXkgb2YgdGhlIHdlZWsgb2YgdGhlIG5ldyBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheSBvZiB0aGUgd2VlayBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHdlZWsgZGF5IHRvIFN1bmRheSwgd2l0aCB0aGUgZGVmYXVsdCB3ZWVrU3RhcnRzT24gb2YgU3VuZGF5OlxuICogY29uc3QgcmVzdWx0ID0gc2V0RGF5KG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAwKVxuICogLy89PiBTdW4gQXVnIDMxIDIwMTQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHdlZWsgZGF5IHRvIFN1bmRheSwgd2l0aCBhIHdlZWtTdGFydHNPbiBvZiBNb25kYXk6XG4gKiBjb25zdCByZXN1bHQgPSBzZXREYXkobmV3IERhdGUoMjAxNCwgOCwgMSksIDAsIHsgd2Vla1N0YXJ0c09uOiAxIH0pXG4gKiAvLz0+IFN1biBTZXAgMDcgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzZXREYXkoZGF0ZSwgZGF5LCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDMuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBjdXJyZW50RGF5ID0gX2RhdGUuZ2V0RGF5KCk7XG5cbiAgY29uc3QgcmVtYWluZGVyID0gZGF5ICUgNztcbiAgY29uc3QgZGF5SW5kZXggPSAocmVtYWluZGVyICsgNykgJSA3O1xuXG4gIGNvbnN0IGRlbHRhID0gNyAtIHdlZWtTdGFydHNPbjtcbiAgY29uc3QgZGlmZiA9XG4gICAgZGF5IDwgMCB8fCBkYXkgPiA2XG4gICAgICA/IGRheSAtICgoY3VycmVudERheSArIGRlbHRhKSAlIDcpXG4gICAgICA6ICgoZGF5SW5kZXggKyBkZWx0YSkgJSA3KSAtICgoY3VycmVudERheSArIGRlbHRhKSAlIDcpO1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGREYXlzKShfZGF0ZSwgZGlmZik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0SG91cnMgPSBzZXRIb3VycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0SG91cnNcbiAqIEBjYXRlZ29yeSBIb3VyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgaG91cnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIGhvdXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGhvdXJzIC0gVGhlIGhvdXJzIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBob3VycyBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IDQgaG91cnMgdG8gMSBTZXB0ZW1iZXIgMjAxNCAxMTozMDowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldEhvdXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEsIDExLCAzMCksIDQpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwNDozMDowMFxuICovXG5mdW5jdGlvbiBzZXRIb3VycyhkYXRlLCBob3Vycykge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgX2RhdGUuc2V0SG91cnMoaG91cnMpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0SVNPRGF5ID0gc2V0SVNPRGF5O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZERheXMuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2dldElTT0RheS5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldElTT0RheVxuICogQGNhdGVnb3J5IFdlZWtkYXkgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICogSVNPIHdlZWsgc3RhcnRzIHdpdGggTW9uZGF5LlxuICogNyBpcyB0aGUgaW5kZXggb2YgU3VuZGF5LCAxIGlzIHRoZSBpbmRleCBvZiBNb25kYXkgZXRjLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGRheSAtIFRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBkYXkgb2YgdGhlIElTTyB3ZWVrIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgU3VuZGF5IHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRJU09EYXkobmV3IERhdGUoMjAxNCwgOCwgMSksIDcpXG4gKiAvLz0+IFN1biBTZXAgMDcgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzZXRJU09EYXkoZGF0ZSwgZGF5KSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDMudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgY3VycmVudERheSA9ICgwLCBfaW5kZXgyLmdldElTT0RheSkoX2RhdGUpO1xuICBjb25zdCBkaWZmID0gZGF5IC0gY3VycmVudERheTtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkRGF5cykoX2RhdGUsIGRpZmYpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldElTT1dlZWsgPSBzZXRJU09XZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2dldElTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBJU08gd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgSVNPIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUsIHNhdmluZyB0aGUgd2Vla2RheSBudW1iZXIuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHdlZWsgLSBUaGUgSVNPIHdlZWsgb2YgdGhlIG5ldyBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIElTTyB3ZWVrIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgdGhlIDUzcmQgSVNPIHdlZWsgdG8gNyBBdWd1c3QgMjAwNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldElTT1dlZWsobmV3IERhdGUoMjAwNCwgNywgNyksIDUzKVxuICogLy89PiBTYXQgSmFuIDAxIDIwMDUgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0SVNPV2VlayhkYXRlLCB3ZWVrKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGlmZiA9ICgwLCBfaW5kZXguZ2V0SVNPV2VlaykoX2RhdGUpIC0gd2VlaztcbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgLSBkaWZmICogNyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRNaW51dGVzID0gc2V0TWludXRlcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0TWludXRlc1xuICogQGNhdGVnb3J5IE1pbnV0ZSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIG1pbnV0ZXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIG1pbnV0ZXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gbWludXRlcyAtIFRoZSBtaW51dGVzIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaW51dGVzIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgNDUgbWludXRlcyB0byAxIFNlcHRlbWJlciAyMDE0IDExOjMwOjQwOlxuICogY29uc3QgcmVzdWx0ID0gc2V0TWludXRlcyhuZXcgRGF0ZSgyMDE0LCA4LCAxLCAxMSwgMzAsIDQwKSwgNDUpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAxMTo0NTo0MFxuICovXG5mdW5jdGlvbiBzZXRNaW51dGVzKGRhdGUsIG1pbnV0ZXMpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIF9kYXRlLnNldE1pbnV0ZXMobWludXRlcyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRNb250aCA9IHNldE1vbnRoO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2dldERheXNJbk1vbnRoLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0TW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIG1vbnRoIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBtb250aCB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBtb250aCAtIFRoZSBtb250aCBpbmRleCB0byBzZXQgKDAtMTEpXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIG1vbnRoIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgRmVicnVhcnkgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldE1vbnRoKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAxKVxuICogLy89PiBTYXQgRmViIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0TW9udGgoZGF0ZSwgbW9udGgpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4My50b0RhdGUpKGRhdGUpO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF0ZSgpO1xuXG4gIGNvbnN0IGRhdGVXaXRoRGVzaXJlZE1vbnRoID0gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZGF0ZVdpdGhEZXNpcmVkTW9udGguc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIDE1KTtcbiAgZGF0ZVdpdGhEZXNpcmVkTW9udGguc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IGRheXNJbk1vbnRoID0gKDAsIF9pbmRleDIuZ2V0RGF5c0luTW9udGgpKGRhdGVXaXRoRGVzaXJlZE1vbnRoKTtcbiAgLy8gU2V0IHRoZSBsYXN0IGRheSBvZiB0aGUgbmV3IG1vbnRoXG4gIC8vIGlmIHRoZSBvcmlnaW5hbCBkYXRlIHdhcyB0aGUgbGFzdCBkYXkgb2YgdGhlIGxvbmdlciBtb250aFxuICBfZGF0ZS5zZXRNb250aChtb250aCwgTWF0aC5taW4oZGF5LCBkYXlzSW5Nb250aCkpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0UXVhcnRlciA9IHNldFF1YXJ0ZXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vc2V0TW9udGguanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRRdWFydGVyXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIHllYXIgcXVhcnRlciB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgeWVhciBxdWFydGVyIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHF1YXJ0ZXIgLSBUaGUgcXVhcnRlciBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgcXVhcnRlciBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHRoZSAybmQgcXVhcnRlciB0byAyIEp1bHkgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFF1YXJ0ZXIobmV3IERhdGUoMjAxNCwgNiwgMiksIDIpXG4gKiAvLz0+IFdlZCBBcHIgMDIgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzZXRRdWFydGVyKGRhdGUsIHF1YXJ0ZXIpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBvbGRRdWFydGVyID0gTWF0aC50cnVuYyhfZGF0ZS5nZXRNb250aCgpIC8gMykgKyAxO1xuICBjb25zdCBkaWZmID0gcXVhcnRlciAtIG9sZFF1YXJ0ZXI7XG4gIHJldHVybiAoMCwgX2luZGV4LnNldE1vbnRoKShfZGF0ZSwgX2RhdGUuZ2V0TW9udGgoKSArIGRpZmYgKiAzKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRTZWNvbmRzID0gc2V0U2Vjb25kcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0U2Vjb25kc1xuICogQGNhdGVnb3J5IFNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIHNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIHNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gc2Vjb25kcyAtIFRoZSBzZWNvbmRzIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBzZWNvbmRzIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgNDUgc2Vjb25kcyB0byAxIFNlcHRlbWJlciAyMDE0IDExOjMwOjQwOlxuICogY29uc3QgcmVzdWx0ID0gc2V0U2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA4LCAxLCAxMSwgMzAsIDQwKSwgNDUpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAxMTozMDo0NVxuICovXG5mdW5jdGlvbiBzZXRTZWNvbmRzKGRhdGUsIHNlY29uZHMpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIF9kYXRlLnNldFNlY29uZHMoc2Vjb25kcyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRXZWVrID0gc2V0V2VlaztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9nZXRXZWVrLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogVGhlIHtAbGluayBzZXRXZWVrfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc2V0V2Vla1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBsb2NhbCB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBsb2NhbCB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLCBzYXZpbmcgdGhlIHdlZWtkYXkgbnVtYmVyLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1RoZV9JU09fd2Vla19kYXRlX3N5c3RlbVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHdlZWsgLSBUaGUgd2VlayBvZiB0aGUgbmV3IGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBsb2NhbCB3ZWVrIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgdGhlIDFzdCB3ZWVrIHRvIDIgSmFudWFyeSAyMDA1IHdpdGggZGVmYXVsdCBvcHRpb25zOlxuICogY29uc3QgcmVzdWx0ID0gc2V0V2VlayhuZXcgRGF0ZSgyMDA1LCAwLCAyKSwgMSlcbiAqIC8vPT4gU3VuIERlYyAyNiAyMDA0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB0aGUgMXN0IHdlZWsgdG8gMiBKYW51YXJ5IDIwMDUsXG4gKiAvLyBpZiBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayxcbiAqIC8vIGFuZCB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhciBhbHdheXMgY29udGFpbnMgNCBKYW51YXJ5OlxuICogY29uc3QgcmVzdWx0ID0gc2V0V2VlayhuZXcgRGF0ZSgyMDA1LCAwLCAyKSwgMSwge1xuICogICB3ZWVrU3RhcnRzT246IDEsXG4gKiAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNFxuICogfSlcbiAqIC8vPT4gU3VuIEphbiA0IDIwMDQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0V2VlayhkYXRlLCB3ZWVrLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGlmZiA9ICgwLCBfaW5kZXguZ2V0V2VlaykoX2RhdGUsIG9wdGlvbnMpIC0gd2VlaztcbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgLSBkaWZmICogNyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRZZWFyID0gc2V0WWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0WWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSB5ZWFyIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSB5ZWFyIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHllYXIgLSBUaGUgeWVhciBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgeWVhciBzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHllYXIgMjAxMyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc2V0WWVhcihuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMjAxMylcbiAqIC8vPT4gU3VuIFNlcCAwMSAyMDEzIDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldFllYXIoZGF0ZSwgeWVhcikge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZSk7XG5cbiAgLy8gQ2hlY2sgaWYgZGF0ZSBpcyBJbnZhbGlkIERhdGUgYmVjYXVzZSBEYXRlLnByb3RvdHlwZS5zZXRGdWxsWWVhciBpZ25vcmVzIHRoZSB2YWx1ZSBvZiBJbnZhbGlkIERhdGVcbiAgaWYgKGlzTmFOKCtfZGF0ZSkpIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCBOYU4pO1xuICB9XG5cbiAgX2RhdGUuc2V0RnVsbFllYXIoeWVhcik7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mRGF5ID0gc3RhcnRPZkRheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZkRheVxuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgZGF5IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgZGF5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIGRheSBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZEYXkoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mSVNPV2VlayA9IHN0YXJ0T2ZJU09XZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZXZWVrLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZJU09XZWVrKGRhdGUpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguc3RhcnRPZldlZWspKGRhdGUsIHsgd2Vla1N0YXJ0c09uOiAxIH0pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZJU09XZWVrWWVhciA9IHN0YXJ0T2ZJU09XZWVrWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9nZXRJU09XZWVrWWVhci5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZklTT1dlZWsuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZklTT1dlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyLFxuICogd2hpY2ggYWx3YXlzIHN0YXJ0cyAzIGRheXMgYmVmb3JlIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXkuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDU6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mSVNPV2Vla1llYXIobmV3IERhdGUoMjAwNSwgNiwgMikpXG4gKiAvLz0+IE1vbiBKYW4gMDMgMjAwNSAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mSVNPV2Vla1llYXIoZGF0ZSkge1xuICBjb25zdCB5ZWFyID0gKDAsIF9pbmRleC5nZXRJU09XZWVrWWVhcikoZGF0ZSk7XG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeSA9ICgwLCBfaW5kZXgzLmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBmb3VydGhPZkphbnVhcnkuc2V0RnVsbFllYXIoeWVhciwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuICgwLCBfaW5kZXgyLnN0YXJ0T2ZJU09XZWVrKShmb3VydGhPZkphbnVhcnkpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZNb250aCA9IHN0YXJ0T2ZNb250aDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZk1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSBtb250aFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSBtb250aCBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZk1vbnRoKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIF9kYXRlLnNldERhdGUoMSk7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZlF1YXJ0ZXIgPSBzdGFydE9mUXVhcnRlcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZlF1YXJ0ZXJcbiAqIEBjYXRlZ29yeSBRdWFydGVyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSB5ZWFyIHF1YXJ0ZXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgcXVhcnRlciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSBxdWFydGVyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHF1YXJ0ZXIgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mUXVhcnRlcihuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBUdWUgSnVsIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZlF1YXJ0ZXIoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgY3VycmVudE1vbnRoID0gX2RhdGUuZ2V0TW9udGgoKTtcbiAgY29uc3QgbW9udGggPSBjdXJyZW50TW9udGggLSAoY3VycmVudE1vbnRoICUgMyk7XG4gIF9kYXRlLnNldE1vbnRoKG1vbnRoLCAxKTtcbiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mV2VlayA9IHN0YXJ0T2ZXZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZldlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mV2Vla1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBTdW4gQXVnIDMxIDIwMTQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdGhlIHdlZWsgc3RhcnRzIG9uIE1vbmRheSwgdGhlIHN0YXJ0IG9mIHRoZSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSwgeyB3ZWVrU3RhcnRzT246IDEgfSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZXZWVrKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4Mi5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgY29uc3Qgd2Vla1N0YXJ0c09uID1cbiAgICBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgMDtcblxuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7XG4gIGNvbnN0IGRpZmYgPSAoZGF5IDwgd2Vla1N0YXJ0c09uID8gNyA6IDApICsgZGF5IC0gd2Vla1N0YXJ0c09uO1xuXG4gIF9kYXRlLnNldERhdGUoX2RhdGUuZ2V0RGF0ZSgpIC0gZGlmZik7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZldlZWtZZWFyID0gc3RhcnRPZldlZWtZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2dldFdlZWtZZWFyLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9zdGFydE9mV2Vlay5qc1wiKTtcblxudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZldlZWtZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZldlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhci5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhbiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1IHdpdGggZGVmYXVsdCBzZXR0aW5nczpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSlcbiAqIC8vPT4gU3VuIERlYyAyNiAyMDA0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1XG4gKiAvLyBpZiBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB3ZWVrXG4gKiAvLyBhbmQgNCBKYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhcjpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSwge1xuICogICB3ZWVrU3RhcnRzT246IDEsXG4gKiAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNFxuICogfSlcbiAqIC8vPT4gTW9uIEphbiAwMyAyMDA1IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZXZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDQuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3QgeWVhciA9ICgwLCBfaW5kZXgyLmdldFdlZWtZZWFyKShkYXRlLCBvcHRpb25zKTtcbiAgY29uc3QgZmlyc3RXZWVrID0gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZmlyc3RXZWVrLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vlay5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4My5zdGFydE9mV2VlaykoZmlyc3RXZWVrLCBvcHRpb25zKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZZZWFyID0gc3RhcnRPZlllYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHllYXIgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mWWVhcihuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDAwKSlcbiAqIC8vPT4gV2VkIEphbiAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZZZWFyKGRhdGUpIHtcbiAgY29uc3QgY2xlYW5EYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBfZGF0ZS5zZXRGdWxsWWVhcihjbGVhbkRhdGUuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG4gIF9kYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3ViRGF5cyA9IHN1YkRheXM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkRGF5cy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdWJEYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIGRheXMgdG8gYmUgc3VidHJhY3RlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5cyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDEwIGRheXMgZnJvbSAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc3ViRGF5cyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMTApXG4gKiAvLz0+IEZyaSBBdWcgMjIgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdWJEYXlzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGREYXlzKShkYXRlLCAtYW1vdW50KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdWJNb250aHMgPSBzdWJNb250aHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkTW9udGhzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN1Yk1vbnRoc1xuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1vbnRocyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbW9udGhzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBtb250aHMgdG8gYmUgc3VidHJhY3RlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbW9udGhzIHN1YnRyYWN0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgNSBtb250aHMgZnJvbSAxIEZlYnJ1YXJ5IDIwMTU6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJNb250aHMobmV3IERhdGUoMjAxNSwgMSwgMSksIDUpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdWJNb250aHMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZE1vbnRocykoZGF0ZSwgLWFtb3VudCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3ViUXVhcnRlcnMgPSBzdWJRdWFydGVycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRRdWFydGVycy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdWJRdWFydGVyc1xuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhciBxdWFydGVycyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhciBxdWFydGVycyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgcXVhcnRlcnMgdG8gYmUgc3VidHJhY3RlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgcXVhcnRlcnMgc3VidHJhY3RlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCAzIHF1YXJ0ZXJzIGZyb20gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1YlF1YXJ0ZXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAzKVxuICogLy89PiBTdW4gRGVjIDAxIDIwMTMgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3ViUXVhcnRlcnMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZFF1YXJ0ZXJzKShkYXRlLCAtYW1vdW50KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdWJXZWVrcyA9IHN1YldlZWtzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZFdlZWtzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN1YldlZWtzXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB3ZWVrcyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd2Vla3MgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHdlZWtzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHdlZWtzIHN1YnRyYWN0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgNCB3ZWVrcyBmcm9tIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJXZWVrcyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgNClcbiAqIC8vPT4gTW9uIEF1ZyAwNCAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN1YldlZWtzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRXZWVrcykoZGF0ZSwgLWFtb3VudCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3ViWWVhcnMgPSBzdWJZZWFycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRZZWFycy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdWJZZWFyc1xuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhcnMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXJzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiB5ZWFycyB0byBiZSBzdWJ0cmFjdGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSB5ZWFycyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDUgeWVhcnMgZnJvbSAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc3ViWWVhcnMobmV3IERhdGUoMjAxNCwgOCwgMSksIDUpXG4gKiAvLz0+IFR1ZSBTZXAgMDEgMjAwOSAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdWJZZWFycyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkWWVhcnMpKGRhdGUsIC1hbW91bnQpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnRvRGF0ZSA9IHRvRGF0ZTtcblxuLyoqXG4gKiBAbmFtZSB0b0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIERhdGUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGl0cyBjbG9uZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBudW1iZXIsIGl0IGlzIHRyZWF0ZWQgYXMgYSB0aW1lc3RhbXAuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIG5vbmUgb2YgdGhlIGFib3ZlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBJbnZhbGlkIERhdGUuXG4gKlxuICogKipOb3RlKio6ICphbGwqIERhdGUgYXJndW1lbnRzIHBhc3NlZCB0byBhbnkgKmRhdGUtZm5zKiBmdW5jdGlvbiBpcyBwcm9jZXNzZWQgYnkgYHRvRGF0ZWAuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGFyZ3VtZW50IC0gVGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGRhdGUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDbG9uZSB0aGUgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvRGF0ZShuZXcgRGF0ZSgyMDE0LCAxLCAxMSwgMTEsIDMwLCAzMCkpXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IHRoZSB0aW1lc3RhbXAgdG8gZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvRGF0ZSgxMzkyMDk4NDMwMDAwKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqL1xuZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50KSB7XG4gIGNvbnN0IGFyZ1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCk7XG5cbiAgLy8gQ2xvbmUgdGhlIGRhdGVcbiAgaWYgKFxuICAgIGFyZ3VtZW50IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICh0eXBlb2YgYXJndW1lbnQgPT09IFwib2JqZWN0XCIgJiYgYXJnU3RyID09PSBcIltvYmplY3QgRGF0ZV1cIilcbiAgKSB7XG4gICAgLy8gUHJldmVudCB0aGUgZGF0ZSB0byBsb3NlIHRoZSBtaWxsaXNlY29uZHMgd2hlbiBwYXNzZWQgdG8gbmV3IERhdGUoKSBpbiBJRTEwXG4gICAgcmV0dXJuIG5ldyBhcmd1bWVudC5jb25zdHJ1Y3RvcigrYXJndW1lbnQpO1xuICB9IGVsc2UgaWYgKFxuICAgIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJudW1iZXJcIiB8fFxuICAgIGFyZ1N0ciA9PT0gXCJbb2JqZWN0IE51bWJlcl1cIiB8fFxuICAgIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIGFyZ1N0ciA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIlxuICApIHtcbiAgICAvLyBUT0RPOiBDYW4gd2UgZ2V0IHJpZCBvZiBhcz9cbiAgICByZXR1cm4gbmV3IERhdGUoYXJndW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IENhbiB3ZSBnZXQgcmlkIG9mIGFzP1xuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMudHJhbnNwb3NlID0gdHJhbnNwb3NlO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgdHJhbnNwb3NlXG4gKiBAY2F0ZWdvcnkgR2VuZXJpYyBIZWxwZXJzXG4gKiBAc3VtbWFyeSBUcmFuc3Bvc2UgdGhlIGRhdGUgdG8gdGhlIGdpdmVuIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGZ1bmN0aW9uIHRyYW5zcG9zZXMgdGhlIGRhdGUgdG8gdGhlIGdpdmVuIGNvbnN0cnVjdG9yLiBJdCBoZWxwcyB5b3VcbiAqIHRvIHRyYW5zcG9zZSB0aGUgZGF0ZSBpbiB0aGUgc3lzdGVtIHRpbWUgem9uZSB0byBzYXkgYFVUQ0RhdGVgIG9yIGFueSBvdGhlclxuICogZGF0ZSBleHRlbnNpb24uXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlSW5wdXRUeXBlIC0gVGhlIGlucHV0IGBEYXRlYCB0eXBlIGRlcml2ZWQgZnJvbSB0aGUgcGFzc2VkIGFyZ3VtZW50LlxuICogQHR5cGVQYXJhbSBEYXRlT3V0cHV0VHlwZSAtIFRoZSBvdXRwdXQgYERhdGVgIHR5cGUgZGVyaXZlZCBmcm9tIHRoZSBwYXNzZWQgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIGZyb21EYXRlIC0gVGhlIGRhdGUgdG8gdXNlIHZhbHVlcyBmcm9tXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgLSBUaGUgZGF0ZSBjb25zdHJ1Y3RvciB0byB1c2VcbiAqXG4gKiBAcmV0dXJucyBEYXRlIHRyYW5zcG9zZWQgdG8gdGhlIGdpdmVuIGNvbnN0cnVjdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBKdWx5IDEwLCAyMDIyIDAwOjAwIGluIGxvY2FsZSB0aW1lIHpvbmVcbiAqIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgyMDIyLCA2LCAxMClcbiAqIC8vPT4gJ1N1biBKdWwgMTAgMjAyMiAwMDowMDowMCBHTVQrMDgwMCAoU2luZ2Fwb3JlIFN0YW5kYXJkIFRpbWUpJ1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUcmFuc3Bvc2UgdGhlIGRhdGUgdG8gSnVseSAxMCwgMjAyMiAwMDowMCBpbiBVVENcbiAqIHRyYW5zcG9zZShkYXRlLCBVVENEYXRlKVxuICogLy89PiAnU3VuIEp1bCAxMCAyMDIyIDAwOjAwOjAwIEdNVCswMDAwIChDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSknXG4gKi9cbmZ1bmN0aW9uIHRyYW5zcG9zZShmcm9tRGF0ZSwgY29uc3RydWN0b3IpIHtcbiAgY29uc3QgZGF0ZSA9XG4gICAgY29uc3RydWN0b3IgaW5zdGFuY2VvZiBEYXRlXG4gICAgICA/ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoY29uc3RydWN0b3IsIDApXG4gICAgICA6IG5ldyBjb25zdHJ1Y3RvcigwKTtcbiAgZGF0ZS5zZXRGdWxsWWVhcihcbiAgICBmcm9tRGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgIGZyb21EYXRlLmdldE1vbnRoKCksXG4gICAgZnJvbURhdGUuZ2V0RGF0ZSgpLFxuICApO1xuICBkYXRlLnNldEhvdXJzKFxuICAgIGZyb21EYXRlLmdldEhvdXJzKCksXG4gICAgZnJvbURhdGUuZ2V0TWludXRlcygpLFxuICAgIGZyb21EYXRlLmdldFNlY29uZHMoKSxcbiAgICBmcm9tRGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgKTtcbiAgcmV0dXJuIGRhdGU7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1kb20uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIFNjaGVkdWxlciA9IHJlcXVpcmUoJ3NjaGVkdWxlcicpO1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxudmFyIHN1cHByZXNzV2FybmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gc2V0U3VwcHJlc3NXYXJuaW5nKG5ld1N1cHByZXNzV2FybmluZykge1xuICB7XG4gICAgc3VwcHJlc3NXYXJuaW5nID0gbmV3U3VwcHJlc3NXYXJuaW5nO1xuICB9XG59IC8vIEluIERFViwgY2FsbHMgdG8gY29uc29sZS53YXJuIGFuZCBjb25zb2xlLmVycm9yIGdldCByZXBsYWNlZFxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAgaWYgKCFzdXBwcmVzc1dhcm5pbmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIGlmICghc3VwcHJlc3NXYXJuaW5nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgRnVuY3Rpb25Db21wb25lbnQgPSAwO1xudmFyIENsYXNzQ29tcG9uZW50ID0gMTtcbnZhciBJbmRldGVybWluYXRlQ29tcG9uZW50ID0gMjsgLy8gQmVmb3JlIHdlIGtub3cgd2hldGhlciBpdCBpcyBmdW5jdGlvbiBvciBjbGFzc1xuXG52YXIgSG9zdFJvb3QgPSAzOyAvLyBSb290IG9mIGEgaG9zdCB0cmVlLiBDb3VsZCBiZSBuZXN0ZWQgaW5zaWRlIGFub3RoZXIgbm9kZS5cblxudmFyIEhvc3RQb3J0YWwgPSA0OyAvLyBBIHN1YnRyZWUuIENvdWxkIGJlIGFuIGVudHJ5IHBvaW50IHRvIGEgZGlmZmVyZW50IHJlbmRlcmVyLlxuXG52YXIgSG9zdENvbXBvbmVudCA9IDU7XG52YXIgSG9zdFRleHQgPSA2O1xudmFyIEZyYWdtZW50ID0gNztcbnZhciBNb2RlID0gODtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSA5O1xudmFyIENvbnRleHRQcm92aWRlciA9IDEwO1xudmFyIEZvcndhcmRSZWYgPSAxMTtcbnZhciBQcm9maWxlciA9IDEyO1xudmFyIFN1c3BlbnNlQ29tcG9uZW50ID0gMTM7XG52YXIgTWVtb0NvbXBvbmVudCA9IDE0O1xudmFyIFNpbXBsZU1lbW9Db21wb25lbnQgPSAxNTtcbnZhciBMYXp5Q29tcG9uZW50ID0gMTY7XG52YXIgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50ID0gMTc7XG52YXIgRGVoeWRyYXRlZEZyYWdtZW50ID0gMTg7XG52YXIgU3VzcGVuc2VMaXN0Q29tcG9uZW50ID0gMTk7XG52YXIgU2NvcGVDb21wb25lbnQgPSAyMTtcbnZhciBPZmZzY3JlZW5Db21wb25lbnQgPSAyMjtcbnZhciBMZWdhY3lIaWRkZW5Db21wb25lbnQgPSAyMztcbnZhciBDYWNoZUNvbXBvbmVudCA9IDI0O1xudmFyIFRyYWNpbmdNYXJrZXJDb21wb25lbnQgPSAyNTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZUNsaWVudFJlbmRlckZhbGxiYWNrT25UZXh0TWlzbWF0Y2ggPSB0cnVlOyAvLyBUT0RPOiBOZWVkIHRvIHJldmlldyB0aGlzIGNvZGUgb25lIG1vcmUgdGltZSBiZWZvcmUgbGFuZGluZ1xuLy8gdGhlIHJlYWN0LXJlY29uY2lsZXIgcGFja2FnZS5cblxudmFyIGVuYWJsZU5ld1JlY29uY2lsZXIgPSBmYWxzZTsgLy8gU3VwcG9ydCBsZWdhY3kgUHJpbWVyIHN1cHBvcnQgb24gaW50ZXJuYWwgRkIgd3d3XG5cbnZhciBlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uID0gZmFsc2U7IC8vIEZCLW9ubHkgdXNhZ2UuIFRoZSBuZXcgQVBJIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzLlxuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuXG52YXIgZW5hYmxlU3VzcGVuc2VBdm9pZFRoaXNGYWxsYmFjayA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRml6elxuLy8gUmVhY3QgRE9NIENob3BwaW5nIEJsb2NrXG4vL1xuLy8gU2ltaWxhciB0byBtYWluIENob3BwaW5nIEJsb2NrIGJ1dCBvbmx5IGZsYWdzIHJlbGF0ZWQgdG8gUmVhY3QgRE9NLiBUaGVzZSBhcmVcbi8vIGdyb3VwZWQgYmVjYXVzZSB3ZSB3aWxsIGxpa2VseSBiYXRjaCBhbGwgb2YgdGhlbSBpbnRvIGEgc2luZ2xlIG1ham9yIHJlbGVhc2UuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGlzYWJsZSBzdXBwb3J0IGZvciBjb21tZW50IG5vZGVzIGFzIFJlYWN0IERPTSBjb250YWluZXJzLiBBbHJlYWR5IGRpc2FibGVkXG4vLyBpbiBvcGVuIHNvdXJjZSwgYnV0IHd3dyBjb2RlYmFzZSBzdGlsbCByZWxpZXMgb24gaXQuIE5lZWQgdG8gcmVtb3ZlLlxuXG52YXIgZGlzYWJsZUNvbW1lbnRzQXNET01Db250YWluZXJzID0gdHJ1ZTsgLy8gRGlzYWJsZSBqYXZhc2NyaXB0OiBVUkwgc3RyaW5ncyBpbiBocmVmIGZvciBYU1MgcHJvdGVjdGlvbi5cbi8vIGFuZCBjbGllbnQgcmVuZGVyaW5nLCBtb3N0bHkgdG8gYWxsb3cgSlNYIGF0dHJpYnV0ZXMgdG8gYXBwbHkgdG8gdGhlIGN1c3RvbVxuLy8gZWxlbWVudCdzIG9iamVjdCBwcm9wZXJ0aWVzIGluc3RlYWQgb2Ygb25seSBIVE1MIGF0dHJpYnV0ZXMuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExMzQ3XG5cbnZhciBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ID0gZmFsc2U7IC8vIERpc2FibGVzIGNoaWxkcmVuIGZvciA8dGV4dGFyZWE+IGVsZW1lbnRzXG52YXIgd2FybkFib3V0U3RyaW5nUmVmcyA9IHRydWU7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEZWJ1Z2dpbmcgYW5kIERldlRvb2xzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWRkcyB1c2VyIHRpbWluZyBtYXJrcyBmb3IgZS5nLiBzdGF0ZSB1cGRhdGVzLCBzdXNwZW5zZSwgYW5kIHdvcmsgbG9vcCBzdHVmZixcbi8vIGZvciBhbiBleHBlcmltZW50YWwgdGltZWxpbmUgdG9vbC5cblxudmFyIGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlciA9IHRydWU7IC8vIEhlbHBzIGlkZW50aWZ5IHNpZGUgZWZmZWN0cyBpbiByZW5kZXItcGhhc2UgbGlmZWN5Y2xlIGhvb2tzIGFuZCBzZXRTdGF0ZVxuXG52YXIgZW5hYmxlUHJvZmlsZXJUaW1lciA9IHRydWU7IC8vIFJlY29yZCBkdXJhdGlvbnMgZm9yIGNvbW1pdCBhbmQgcGFzc2l2ZSBlZmZlY3RzIHBoYXNlcy5cblxudmFyIGVuYWJsZVByb2ZpbGVyQ29tbWl0SG9va3MgPSB0cnVlOyAvLyBQaGFzZSBwYXJhbSBwYXNzZWQgdG8gb25SZW5kZXIgY2FsbGJhY2sgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBhbiBcInVwZGF0ZVwiIGFuZCBhIFwiY2FzY2FkaW5nLXVwZGF0ZVwiLlxuXG52YXIgYWxsTmF0aXZlRXZlbnRzID0gbmV3IFNldCgpO1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gZXZlbnQgbmFtZVxuICovXG5cblxudmFyIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMgPSB7fTtcbi8qKlxuICogTWFwcGluZyBmcm9tIGxvd2VyY2FzZSByZWdpc3RyYXRpb24gbmFtZXMgdG8gdGhlIHByb3Blcmx5IGNhc2VkIHZlcnNpb24sXG4gKiB1c2VkIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBldmVudCBoYW5kbGVycy4gQXZhaWxhYmxlXG4gKiBvbmx5IGluIHRydWUuXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbnZhciBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gIHt9IDsgLy8gVHJ1c3QgdGhlIGRldmVsb3BlciB0byBvbmx5IHVzZSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzIGluIHRydWVcblxuZnVuY3Rpb24gcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcyk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSArICdDYXB0dXJlJywgZGVwZW5kZW5jaWVzKTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHtcbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSkge1xuICAgICAgZXJyb3IoJ0V2ZW50UmVnaXN0cnk6IE1vcmUgdGhhbiBvbmUgcGx1Z2luIGF0dGVtcHRlZCB0byBwdWJsaXNoIHRoZSBzYW1lICcgKyAncmVnaXN0cmF0aW9uIG5hbWUsIGAlc2AuJywgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSA9IGRlcGVuZGVuY2llcztcblxuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcmVnaXN0cmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdID0gcmVnaXN0cmF0aW9uTmFtZTtcblxuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25Eb3VibGVDbGljaycpIHtcbiAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMub25kYmxjbGljayA9IHJlZ2lzdHJhdGlvbk5hbWU7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBhbGxOYXRpdmVFdmVudHMuYWRkKGRlcGVuZGVuY2llc1tpXSk7XG4gIH1cbn1cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgYXR0cmlidXRlIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIGF0dHJpYnV0ZU5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbih2YWx1ZSwgcHJvcE5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBwcm9wIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgcHJvcE5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBDU1MgcHJvcGVydHkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgcHJvcE5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tIdG1sU3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgSFRNTCBtYXJrdXAgdXNlcyBhIHZhbHVlIG9mIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignRm9ybSBmaWVsZCB2YWx1ZXMgKHZhbHVlLCBjaGVja2VkLCBkZWZhdWx0VmFsdWUsIG9yIGRlZmF1bHRDaGVja2VkIHByb3BzKScgKyAnIG11c3QgYmUgc3RyaW5ncywgbm90ICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cblxuLy8gQSByZXNlcnZlZCBhdHRyaWJ1dGUuXG4vLyBJdCBpcyBoYW5kbGVkIGJ5IFJlYWN0IHNlcGFyYXRlbHkgYW5kIHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG52YXIgUkVTRVJWRUQgPSAwOyAvLyBBIHNpbXBsZSBzdHJpbmcgYXR0cmlidXRlLlxuLy8gQXR0cmlidXRlcyB0aGF0IGFyZW4ndCBpbiB0aGUgZmlsdGVyIGFyZSBwcmVzdW1lZCB0byBoYXZlIHRoaXMgdHlwZS5cblxudmFyIFNUUklORyA9IDE7IC8vIEEgc3RyaW5nIGF0dHJpYnV0ZSB0aGF0IGFjY2VwdHMgYm9vbGVhbnMgaW4gUmVhY3QuIEluIEhUTUwsIHRoZXNlIGFyZSBjYWxsZWRcbi8vIFwiZW51bWVyYXRlZFwiIGF0dHJpYnV0ZXMgd2l0aCBcInRydWVcIiBhbmQgXCJmYWxzZVwiIGFzIHBvc3NpYmxlIHZhbHVlcy5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHNldCB0byBhIFwidHJ1ZVwiIHN0cmluZy5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcImZhbHNlXCIgc3RyaW5nLlxuXG52YXIgQk9PTEVBTklTSF9TVFJJTkcgPSAyOyAvLyBBIHJlYWwgYm9vbGVhbiBhdHRyaWJ1dGUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cblxudmFyIEJPT0xFQU4gPSAzOyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgYXMgd2VsbCBhcyB3aXRoIGEgdmFsdWUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cbi8vIEZvciBhbnkgb3RoZXIgdmFsdWUsIHNob3VsZCBiZSBwcmVzZW50IHdpdGggdGhhdCB2YWx1ZS5cblxudmFyIE9WRVJMT0FERURfQk9PTEVBTiA9IDQ7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIG51bWVyaWMuXG4vLyBXaGVuIGZhbHN5LCBpdCBzaG91bGQgYmUgcmVtb3ZlZC5cblxudmFyIE5VTUVSSUMgPSA1OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIHBvc2l0aXZlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBwb3NpdGl2ZSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBQT1NJVElWRV9OVU1FUklDID0gNjtcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xudmFyIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgPSBcIjpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRcIjtcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG52YXIgQVRUUklCVVRFX05BTUVfQ0hBUiA9IEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyBcIlxcXFwtLjAtOVxcXFx1MDBCN1xcXFx1MDMwMC1cXFxcdTAzNkZcXFxcdTIwM0YtXFxcXHUyMDQwXCI7XG52YXIgVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVggPSBuZXcgUmVnRXhwKCdeWycgKyBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgJ11bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xudmFyIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xuZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKSB7XG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYLnRlc3QoYXR0cmlidXRlTmFtZSkpIHtcbiAgICB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cbiAge1xuICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lOiBgJXNgJywgYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRDtcbiAgfVxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChuYW1lLmxlbmd0aCA+IDIgJiYgKG5hbWVbMF0gPT09ICdvJyB8fCBuYW1lWzBdID09PSAnTycpICYmIChuYW1lWzFdID09PSAnbicgfHwgbmFtZVsxXSA9PT0gJ04nKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzogLy8gJEZsb3dJc3N1ZSBzeW1ib2wgaXMgcGVyZmVjdGx5IHZhbGlkIGhlcmVcblxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAge1xuICAgICAgICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuICFwcm9wZXJ0eUluZm8uYWNjZXB0c0Jvb2xlYW5zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwcmVmaXggPSBuYW1lLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCwgNSk7XG4gICAgICAgICAgcmV0dXJuIHByZWZpeCAhPT0gJ2RhdGEtJyAmJiBwcmVmaXggIT09ICdhcmlhLSc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5SW5mby50eXBlKSB7XG4gICAgICBjYXNlIEJPT0xFQU46XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG5cbiAgICAgIGNhc2UgT1ZFUkxPQURFRF9CT09MRUFOOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlO1xuXG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG5cbiAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKG5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIHR5cGUsIG11c3RVc2VQcm9wZXJ0eSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZXNwYWNlLCBzYW5pdGl6ZVVSTCwgcmVtb3ZlRW1wdHlTdHJpbmcpIHtcbiAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSB0eXBlID09PSBCT09MRUFOSVNIX1NUUklORyB8fCB0eXBlID09PSBCT09MRUFOIHx8IHR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTjtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBhdHRyaWJ1dGVOYW1lc3BhY2U7XG4gIHRoaXMubXVzdFVzZVByb3BlcnR5ID0gbXVzdFVzZVByb3BlcnR5O1xuICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2FuaXRpemVVUkwgPSBzYW5pdGl6ZVVSTDtcbiAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nO1xufSAvLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoaXMgbGlzdCwgYmUgc3VyZSB0byBhbHNvIGFkZCB0aGVtIHRvXG4vLyB0aGUgYHBvc3NpYmxlU3RhbmRhcmROYW1lc2AgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdFxuLy8gbmFtZSB3YXJuaW5ncy5cblxuXG52YXIgcHJvcGVydGllcyA9IHt9OyAvLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblxudmFyIHJlc2VydmVkUHJvcHMgPSBbJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJywgLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ107XG5cbnJlc2VydmVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBSRVNFUlZFRCwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIEEgZmV3IFJlYWN0IHN0cmluZyBhdHRyaWJ1dGVzIGhhdmUgYSBkaWZmZXJlbnQgbmFtZS5cbi8vIFRoaXMgaXMgYSBtYXBwaW5nIGZyb20gUmVhY3QgcHJvcCBuYW1lcyB0byB0aGUgYXR0cmlidXRlIG5hbWVzLlxuXG5bWydhY2NlcHRDaGFyc2V0JywgJ2FjY2VwdC1jaGFyc2V0J10sIFsnY2xhc3NOYW1lJywgJ2NsYXNzJ10sIFsnaHRtbEZvcicsICdmb3InXSwgWydodHRwRXF1aXYnLCAnaHR0cC1lcXVpdiddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBuYW1lID0gX3JlZlswXSxcbiAgICAgIGF0dHJpYnV0ZU5hbWUgPSBfcmVmWzFdO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIuXG4vLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5XG4vLyB0aGVzZSBhcmVuJ3QgYm9vbGVhbiBhdHRyaWJ1dGVzICh0aGV5IGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MpLlxuXG5bJ2NvbnRlbnRFZGl0YWJsZScsICdkcmFnZ2FibGUnLCAnc3BlbGxDaGVjaycsICd2YWx1ZSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBcImVudW1lcmF0ZWRcIiBTVkcgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cbi8vIFNpbmNlIHRoZXNlIGFyZSBTVkcgYXR0cmlidXRlcywgdGhlaXIgYXR0cmlidXRlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cblxuWydhdXRvUmV2ZXJzZScsICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJywgJ2ZvY3VzYWJsZScsICdwcmVzZXJ2ZUFscGhhJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOSVNIX1NUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGJvb2xlYW4gYXR0cmlidXRlcy5cblxuWydhbGxvd0Z1bGxTY3JlZW4nLCAnYXN5bmMnLCAvLyBOb3RlOiB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IHByZXZlbnRzIGl0IGZyb20gYmVpbmcgd3JpdHRlbiB0byB0aGUgRE9NXG4vLyBvbiB0aGUgY2xpZW50IHNpZGUgYmVjYXVzZSB0aGUgYnJvd3NlcnMgYXJlIGluY29uc2lzdGVudC4gSW5zdGVhZCB3ZSBjYWxsIGZvY3VzKCkuXG4nYXV0b0ZvY3VzJywgJ2F1dG9QbGF5JywgJ2NvbnRyb2xzJywgJ2RlZmF1bHQnLCAnZGVmZXInLCAnZGlzYWJsZWQnLCAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLCAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJywgJ2Zvcm1Ob1ZhbGlkYXRlJywgJ2hpZGRlbicsICdsb29wJywgJ25vTW9kdWxlJywgJ25vVmFsaWRhdGUnLCAnb3BlbicsICdwbGF5c0lubGluZScsICdyZWFkT25seScsICdyZXF1aXJlZCcsICdyZXZlcnNlZCcsICdzY29wZWQnLCAnc2VhbWxlc3MnLCAvLyBNaWNyb2RhdGFcbidpdGVtU2NvcGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSB0aGUgZmV3IFJlYWN0IHByb3BzIHRoYXQgd2Ugc2V0IGFzIERPTSBwcm9wZXJ0aWVzXG4vLyByYXRoZXIgdGhhbiBhdHRyaWJ1dGVzLiBUaGVzZSBhcmUgYWxsIGJvb2xlYW5zLlxuXG5bJ2NoZWNrZWQnLCAvLyBOb3RlOiBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2VsZWN0Lm11bHRpcGxlYCBpc1xuLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC4gV2UgaGF2ZSBzcGVjaWFsIGxvZ2ljIGZvciBoYW5kbGluZyB0aGlzLlxuJ211bHRpcGxlJywgJ211dGVkJywgJ3NlbGVjdGVkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCB0cnVlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYXJlIFwib3ZlcmxvYWRlZCBib29sZWFuc1wiOiB0aGV5IGJlaGF2ZSBsaWtlXG4vLyBib29sZWFucywgYnV0IGNhbiBhbHNvIGFjY2VwdCBhIHN0cmluZyB2YWx1ZS5cblxuWydjYXB0dXJlJywgJ2Rvd25sb2FkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBPVkVSTE9BREVEX0JPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1iZXJzLlxuXG5bJ2NvbHMnLCAncm93cycsICdzaXplJywgJ3NwYW4nIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFBPU0lUSVZFX05VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBudW1iZXJzLlxuXG5bJ3Jvd1NwYW4nLCAnc3RhcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIE5VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7XG52YXIgQ0FNRUxJWkUgPSAvW1xcLVxcOl0oW2Etel0pL2c7XG5cbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIHJldHVybiB0b2tlblsxXS50b1VwcGVyQ2FzZSgpO1xufTsgLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIFNWRyBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBzcGVjaWFsIGNhc2luZywgbmFtZXNwYWNpbmcsXG4vLyBvciBib29sZWFuIHZhbHVlIGFzc2lnbm1lbnQuIFJlZ3VsYXIgYXR0cmlidXRlcyB0aGF0IGp1c3QgYWNjZXB0IHN0cmluZ3Ncbi8vIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFyZSBvbWl0dGVkLCBqdXN0IGxpa2UgaW4gdGhlIEhUTUwgYXR0cmlidXRlIGZpbHRlci5cbi8vIFNvbWUgb2YgdGhlc2UgYXR0cmlidXRlcyBjYW4gYmUgaGFyZCB0byBmaW5kLiBUaGlzIGxpc3Qgd2FzIGNyZWF0ZWQgYnlcbi8vIHNjcmFwaW5nIHRoZSBNRE4gZG9jdW1lbnRhdGlvbi5cblxuXG5bJ2FjY2VudC1oZWlnaHQnLCAnYWxpZ25tZW50LWJhc2VsaW5lJywgJ2FyYWJpYy1mb3JtJywgJ2Jhc2VsaW5lLXNoaWZ0JywgJ2NhcC1oZWlnaHQnLCAnY2xpcC1wYXRoJywgJ2NsaXAtcnVsZScsICdjb2xvci1pbnRlcnBvbGF0aW9uJywgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsICdjb2xvci1wcm9maWxlJywgJ2NvbG9yLXJlbmRlcmluZycsICdkb21pbmFudC1iYXNlbGluZScsICdlbmFibGUtYmFja2dyb3VuZCcsICdmaWxsLW9wYWNpdHknLCAnZmlsbC1ydWxlJywgJ2Zsb29kLWNvbG9yJywgJ2Zsb29kLW9wYWNpdHknLCAnZm9udC1mYW1pbHknLCAnZm9udC1zaXplJywgJ2ZvbnQtc2l6ZS1hZGp1c3QnLCAnZm9udC1zdHJldGNoJywgJ2ZvbnQtc3R5bGUnLCAnZm9udC12YXJpYW50JywgJ2ZvbnQtd2VpZ2h0JywgJ2dseXBoLW5hbWUnLCAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCcsICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCcsICdob3Jpei1hZHYteCcsICdob3Jpei1vcmlnaW4teCcsICdpbWFnZS1yZW5kZXJpbmcnLCAnbGV0dGVyLXNwYWNpbmcnLCAnbGlnaHRpbmctY29sb3InLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdvdmVybGluZS1wb3NpdGlvbicsICdvdmVybGluZS10aGlja25lc3MnLCAncGFpbnQtb3JkZXInLCAncGFub3NlLTEnLCAncG9pbnRlci1ldmVudHMnLCAncmVuZGVyaW5nLWludGVudCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicsICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcycsICdzdHJva2UtZGFzaGFycmF5JywgJ3N0cm9rZS1kYXNob2Zmc2V0JywgJ3N0cm9rZS1saW5lY2FwJywgJ3N0cm9rZS1saW5lam9pbicsICdzdHJva2UtbWl0ZXJsaW1pdCcsICdzdHJva2Utb3BhY2l0eScsICdzdHJva2Utd2lkdGgnLCAndGV4dC1hbmNob3InLCAndGV4dC1kZWNvcmF0aW9uJywgJ3RleHQtcmVuZGVyaW5nJywgJ3VuZGVybGluZS1wb3NpdGlvbicsICd1bmRlcmxpbmUtdGhpY2tuZXNzJywgJ3VuaWNvZGUtYmlkaScsICd1bmljb2RlLXJhbmdlJywgJ3VuaXRzLXBlci1lbScsICd2LWFscGhhYmV0aWMnLCAndi1oYW5naW5nJywgJ3YtaWRlb2dyYXBoaWMnLCAndi1tYXRoZW1hdGljYWwnLCAndmVjdG9yLWVmZmVjdCcsICd2ZXJ0LWFkdi15JywgJ3ZlcnQtb3JpZ2luLXgnLCAndmVydC1vcmlnaW4teScsICd3b3JkLXNwYWNpbmcnLCAnd3JpdGluZy1tb2RlJywgJ3htbG5zOnhsaW5rJywgJ3gtaGVpZ2h0JyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeGxpbmsgbmFtZXNwYWNlLlxuXG5bJ3hsaW5rOmFjdHVhdGUnLCAneGxpbms6YXJjcm9sZScsICd4bGluazpyb2xlJywgJ3hsaW5rOnNob3cnLCAneGxpbms6dGl0bGUnLCAneGxpbms6dHlwZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bWwgbmFtZXNwYWNlLlxuXG5bJ3htbDpiYXNlJywgJ3htbDpsYW5nJywgJ3htbDpzcGFjZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlIGV4aXN0cyBib3RoIGluIEhUTUwgYW5kIFNWRy5cbi8vIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBjYXNlLXNlbnNpdGl2ZSBpbiBTVkcgc28gd2UgY2FuJ3QganVzdCB1c2Vcbi8vIHRoZSBSZWFjdCBuYW1lIGxpa2Ugd2UgZG8gZm9yIGF0dHJpYnV0ZXMgdGhhdCBleGlzdCBvbmx5IGluIEhUTUwuXG5cblsndGFiSW5kZXgnLCAnY3Jvc3NPcmlnaW4nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlcyBhY2NlcHQgVVJMcy4gVGhlc2UgbXVzdCBub3QgYWxsb3cgamF2YXNjcmlwdDogVVJMUy5cbi8vIFRoZXNlIHdpbGwgYWxzbyBuZWVkIHRvIGFjY2VwdCBUcnVzdGVkIFR5cGVzIG9iamVjdCBpbiB0aGUgZnV0dXJlLlxuXG52YXIgeGxpbmtIcmVmID0gJ3hsaW5rSHJlZic7XG5wcm9wZXJ0aWVzW3hsaW5rSHJlZl0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKCd4bGlua0hyZWYnLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbid4bGluazpocmVmJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCB0cnVlLCAvLyBzYW5pdGl6ZVVSTFxuZmFsc2UpO1xuWydzcmMnLCAnaHJlZicsICdhY3Rpb24nLCAnZm9ybUFjdGlvbiddLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgcHJvcGVydGllc1thdHRyaWJ1dGVOYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoYXR0cmlidXRlTmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbiAgdHJ1ZSk7XG59KTtcblxuLy8gYW5kIGFueSBuZXdsaW5lIG9yIHRhYiBhcmUgZmlsdGVyZWQgb3V0IGFzIGlmIHRoZXkncmUgbm90IHBhcnQgb2YgdGhlIFVSTC5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLXBhcnNpbmdcbi8vIFRhYiBvciBuZXdsaW5lIGFyZSBkZWZpbmVkIGFzIFxcclxcblxcdDpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS10YWItb3ItbmV3bGluZVxuLy8gQSBDMCBjb250cm9sIGlzIGEgY29kZSBwb2ludCBpbiB0aGUgcmFuZ2UgXFx1MDAwMCBOVUxMIHRvIFxcdTAwMUZcbi8vIElORk9STUFUSU9OIFNFUEFSQVRPUiBPTkUsIGluY2x1c2l2ZTpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNjMC1jb250cm9sLW9yLXNwYWNlXG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxudmFyIGlzSmF2YVNjcmlwdFByb3RvY29sID0gL15bXFx1MDAwMC1cXHUwMDFGIF0qaltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSp2W1xcclxcblxcdF0qYVtcXHJcXG5cXHRdKnNbXFxyXFxuXFx0XSpjW1xcclxcblxcdF0qcltcXHJcXG5cXHRdKmlbXFxyXFxuXFx0XSpwW1xcclxcblxcdF0qdFtcXHJcXG5cXHRdKlxcOi9pO1xudmFyIGRpZFdhcm4gPSBmYWxzZTtcblxuZnVuY3Rpb24gc2FuaXRpemVVUkwodXJsKSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm4gJiYgaXNKYXZhU2NyaXB0UHJvdG9jb2wudGVzdCh1cmwpKSB7XG4gICAgICBkaWRXYXJuID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ0EgZnV0dXJlIHZlcnNpb24gb2YgUmVhY3Qgd2lsbCBibG9jayBqYXZhc2NyaXB0OiBVUkxzIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4gJyArICdVc2UgZXZlbnQgaGFuZGxlcnMgaW5zdGVhZCBpZiB5b3UgY2FuLiBJZiB5b3UgbmVlZCB0byBnZW5lcmF0ZSB1bnNhZmUgSFRNTCB0cnkgJyArICd1c2luZyBkYW5nZXJvdXNseVNldElubmVySFRNTCBpbnN0ZWFkLiBSZWFjdCB3YXMgcGFzc2VkICVzLicsIEpTT04uc3RyaW5naWZ5KHVybCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLiBPbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqIFRoZSBcImV4cGVjdGVkXCIgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuXG4gKiBTb21lIHByb3BlcnRpZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvKSB7XG4gIHtcbiAgICBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG4gICAgICByZXR1cm4gbm9kZVtwcm9wZXJ0eU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGNoZWNrIHByb3RlY3RzIG11bHRpcGxlIHVzZXMgb2YgYGV4cGVjdGVkYCwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgLy8gcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb24gcnVsZSBpcyBkaXNhYmxlZCBpbiBzZXZlcmFsIHNwb3RzXG4gICAgICAvLyBiZWxvdy5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICggcHJvcGVydHlJbmZvLnNhbml0aXplVVJMKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgZnVsbHkgZGlzYWJsZWQgamF2YXNjcmlwdDogVVJMcywgYW5kIGlmXG4gICAgICAgIC8vIHRoZSBoeWRyYXRpb24gaXMgc3VjY2Vzc2Z1bCBvZiBhIGphdmFzY3JpcHQ6IFVSTCwgd2VcbiAgICAgICAgLy8gc3RpbGwgd2FudCB0byB3YXJuIG9uIHRoZSBjbGllbnQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBzYW5pdGl6ZVVSTCgnJyArIGV4cGVjdGVkKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgIHZhciBzdHJpbmdWYWx1ZSA9IG51bGw7XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOKSB7XG4gICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAvLyBXZSBoYWQgYW4gYXR0cmlidXRlIGJ1dCBzaG91bGRuJ3QgaGF2ZSBoYWQgb25lLCBzbyByZWFkIGl0XG4gICAgICAgICAgLy8gZm9yIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGEgYm9vbGVhbiwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgdmFsdWUgaXNcbiAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkLlxuICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgfSAvLyBFdmVuIGlmIHRoaXMgcHJvcGVydHkgdXNlcyBhIG5hbWVzcGFjZSB3ZSB1c2UgZ2V0QXR0cmlidXRlXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXNzdW1lIGl0cyBuYW1lc3BhY2VkIG5hbWUgaXMgdGhlIHNhbWUgYXMgb3VyIGNvbmZpZy5cbiAgICAgICAgLy8gVG8gdXNlIGdldEF0dHJpYnV0ZU5TIHdlIG5lZWQgdGhlIGxvY2FsIG5hbWUgd2hpY2ggd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAvLyBpbiBvdXIgY29uZmlnIGF0bS5cblxuXG4gICAgICAgIHN0cmluZ1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gbnVsbCA/IGV4cGVjdGVkIDogc3RyaW5nVmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCBleHBlY3RlZCwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAge1xuICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghbm9kZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgIHtcbiAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oZXhwZWN0ZWQsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5cbmZ1bmN0aW9uIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgdmFsdWUsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG5cbiAgaWYgKHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgdmFsdWUgPSBudWxsO1xuICB9XG5cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgfHwgcHJvcGVydHlJbmZvID09PSBudWxsKSB7XG4gICAgaWYgKGlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHZhciBfYXR0cmlidXRlTmFtZSA9IG5hbWU7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSwgICcnICsgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtdXN0VXNlUHJvcGVydHkgPSBwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5O1xuXG4gIGlmIChtdXN0VXNlUHJvcGVydHkpIHtcbiAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIHR5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcbiAgICAgIG5vZGVbcHJvcGVydHlOYW1lXSA9IHR5cGUgPT09IEJPT0xFQU4gPyBmYWxzZSA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250cmFyeSB0byBgc2V0QXR0cmlidXRlYCwgb2JqZWN0IHByb3BlcnRpZXMgYXJlIHByb3Blcmx5XG4gICAgICAvLyBgdG9TdHJpbmdgZWQgYnkgSUU4LzkuXG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gVGhlIHJlc3QgYXJlIHRyZWF0ZWQgYXMgYXR0cmlidXRlcyB3aXRoIHNwZWNpYWwgY2FzZXMuXG5cblxuICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lLFxuICAgICAgYXR0cmlidXRlTmFtZXNwYWNlID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWVzcGFjZTtcblxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgX3R5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcbiAgICB2YXIgYXR0cmlidXRlVmFsdWU7XG5cbiAgICBpZiAoX3R5cGUgPT09IEJPT0xFQU4gfHwgX3R5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTiAmJiB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gSWYgYXR0cmlidXRlIHR5cGUgaXMgYm9vbGVhbiwgd2Uga25vdyBmb3Igc3VyZSBpdCB3b24ndCBiZSBhbiBleGVjdXRpb24gc2lua1xuICAgICAgLy8gYW5kIHdlIHdvbid0IHJlcXVpcmUgVHJ1c3RlZCBUeXBlIGhlcmUuXG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgc2V0QXR0cmlidXRlYCB3aXRoIG9iamVjdHMgYmVjb21lcyBvbmx5IGBbb2JqZWN0XWAgaW4gSUU4LzksXG4gICAgICAvLyAoJycgKyB2YWx1ZSkgbWFrZXMgaXQgb3V0cHV0IHRoZSBjb3JyZWN0IHRvU3RyaW5nKCktdmFsdWUuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnR5SW5mby5zYW5pdGl6ZVVSTCkge1xuICAgICAgICBzYW5pdGl6ZVVSTChhdHRyaWJ1dGVWYWx1ZS50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXR0cmlidXRlTmFtZXNwYWNlKSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKGF0dHJpYnV0ZU5hbWVzcGFjZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zY29wZScpO1xudmFyIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZGVidWdfdHJhY2VfbW9kZScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGVnYWN5X2hpZGRlbicpO1xudmFyIFJFQUNUX0NBQ0hFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jYWNoZScpO1xudmFyIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC50cmFjaW5nX21hcmtlcicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgIHByZWZpeCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgICAgfVxuICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuXG5cblxuICAgIHJldHVybiAnXFxuJyArIHByZWZpeCArIG5hbWU7XG4gIH1cbn1cbnZhciByZWVudHJ5ID0gZmFsc2U7XG52YXIgY29tcG9uZW50RnJhbWVDYWNoZTtcblxue1xuICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuICBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuXG4gIGlmICggIWZuIHx8IHJlZW50cnkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB7XG4gICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udHJvbDtcbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLlxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldmlvdXNEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVDbGFzc0NvbXBvbmVudEZyYW1lKGN0b3IsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoY3RvciwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHtcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUsIHNob3VsZENvbnN0cnVjdCh0eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAvLyBNZW1vIG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRmliZXIoZmliZXIpIHtcbiAgdmFyIG93bmVyID0gIGZpYmVyLl9kZWJ1Z093bmVyID8gZmliZXIuX2RlYnVnT3duZXIudHlwZSA6IG51bGwgO1xuICB2YXIgc291cmNlID0gIGZpYmVyLl9kZWJ1Z1NvdXJjZSA7XG5cbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ0xhenknKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlLnJlbmRlcik7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHdvcmtJblByb2dyZXNzKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgZG8ge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKG5vZGUpO1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUpO1xuXG4gICAgcmV0dXJuIGluZm87XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gJ1xcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6ICcgKyB4Lm1lc3NhZ2UgKyAnXFxuJyArIHguc3RhY2s7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUkMShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lKTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lJDEodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHtcbiAgdmFyIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnQ2FjaGUnO1xuXG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lJDEocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRGVoeWRyYXRlZEZyYWdtZW50JztcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSQxKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgLy8gSG9zdCBjb21wb25lbnQgdHlwZSBpcyB0aGUgZGlzcGxheSBuYW1lIChlLmcuIFwiZGl2XCIsIFwiVmlld1wiKVxuICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcmV0dXJuICdSb290JztcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gJ1RleHQnO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgLy8gTmFtZSBjb21lcyBmcm9tIHRoZSB0eXBlIGluIHRoaXMgY2FzZTsgd2UgZG9uJ3QgaGF2ZSBhIHRhZy5cbiAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICBpZiAodHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSkge1xuICAgICAgICAvLyBEb24ndCBiZSBsZXNzIHNwZWNpZmljIHRoYW4gc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuICAgICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ01vZGUnO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICByZXR1cm4gJ09mZnNjcmVlbic7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTY29wZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnVHJhY2luZ01hcmtlcic7XG4gICAgLy8gVGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhpcyB0YWdzIGNvbWUgZnJvbSB0aGUgdXNlci1wcm92aWRlZCB0eXBlOlxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbnZhciBjdXJyZW50ID0gbnVsbDtcbnZhciBpc1JlbmRlcmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG93bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3duZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsXG4gICAgLy8gYW5kIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgdmVyc2lvbi5cblxuXG4gICAgcmV0dXJuIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChjdXJyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcbiAgICBjdXJyZW50ID0gbnVsbDtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50RmliZXIoZmliZXIpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gZmliZXIgPT09IG51bGwgPyBudWxsIDogZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldjtcbiAgICBjdXJyZW50ID0gZmliZXI7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyKCkge1xuICB7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldElzUmVuZGVyaW5nKHJlbmRlcmluZykge1xuICB7XG4gICAgaXNSZW5kZXJpbmcgPSByZW5kZXJpbmc7XG4gIH1cbn1cblxuLy8gRmxvdyBkb2VzIG5vdCBhbGxvdyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvZiBtb3N0IG5vbi1zdHJpbmcgdHlwZXMuIFRvIHdvcmtcbi8vIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHdlIHVzZSBhbiBvcGFxdWUgdHlwZSB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIGJ5XG4vLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAvLyBUaGUgY29lcmNpb24gc2FmZXR5IGNoZWNrIGlzIHBlcmZvcm1lZCBpbiBnZXRUb1N0cmluZ1ZhbHVlKCkuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBmdW5jdGlvbiwgc3ltYm9sIGFyZSBhc3NpZ25lZCBhcyBlbXB0eSBzdHJpbmdzXG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxudmFyIGhhc1JlYWRPbmx5VmFsdWUgPSB7XG4gIGJ1dHRvbjogdHJ1ZSxcbiAgY2hlY2tib3g6IHRydWUsXG4gIGltYWdlOiB0cnVlLFxuICBoaWRkZW46IHRydWUsXG4gIHJhZGlvOiB0cnVlLFxuICByZXNldDogdHJ1ZSxcbiAgc3VibWl0OiB0cnVlXG59O1xuZnVuY3Rpb24gY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcyh0YWdOYW1lLCBwcm9wcykge1xuICB7XG4gICAgaWYgKCEoaGFzUmVhZE9ubHlWYWx1ZVtwcm9wcy50eXBlXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5vbklucHV0IHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLnZhbHVlID09IG51bGwpKSB7XG4gICAgICBlcnJvcignWW91IHByb3ZpZGVkIGEgYHZhbHVlYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIShwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy5jaGVja2VkID09IG51bGwpKSB7XG4gICAgICBlcnJvcignWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdENoZWNrZWRgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2thYmxlKGVsZW0pIHtcbiAgdmFyIHR5cGUgPSBlbGVtLnR5cGU7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFja2VyKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX3ZhbHVlVHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gZGV0YWNoVHJhY2tlcihub2RlKSB7XG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlRnJvbU5vZGUobm9kZSkge1xuICB2YXIgdmFsdWUgPSAnJztcblxuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAoaXNDaGVja2FibGUobm9kZSkpIHtcbiAgICB2YWx1ZSA9IG5vZGUuY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBub2RlLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpIHtcbiAgdmFyIHZhbHVlRmllbGQgPSBpc0NoZWNrYWJsZShub2RlKSA/ICdjaGVja2VkJyA6ICd2YWx1ZSc7XG4gIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgdmFsdWVGaWVsZCk7XG5cbiAge1xuICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbihub2RlW3ZhbHVlRmllbGRdKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50VmFsdWUgPSAnJyArIG5vZGVbdmFsdWVGaWVsZF07IC8vIGlmIHNvbWVvbmUgaGFzIGFscmVhZHkgZGVmaW5lZCBhIHZhbHVlIG9yIFNhZmFyaSwgdGhlbiBiYWlsXG4gIC8vIGFuZCBkb24ndCB0cmFjayB2YWx1ZSB3aWxsIGNhdXNlIG92ZXIgcmVwb3J0aW5nIG9mIGNoYW5nZXMsXG4gIC8vIGJ1dCBpdCdzIGJldHRlciB0aGVuIGEgaGFyZCBmYWlsdXJlXG4gIC8vIChuZWVkZWQgZm9yIGNlcnRhaW4gdGVzdHMgdGhhdCBzcHlPbiBpbnB1dCB2YWx1ZXMgYW5kIFNhZmFyaSlcblxuICBpZiAobm9kZS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZUZpZWxkKSB8fCB0eXBlb2YgZGVzY3JpcHRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBkZXNjcmlwdG9yLnNldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBnZXQgPSBkZXNjcmlwdG9yLmdldCxcbiAgICAgIHNldCA9IGRlc2NyaXB0b3Iuc2V0O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgfVxuICB9KTsgLy8gV2UgY291bGQndmUgcGFzc2VkIHRoaXMgdGhlIGZpcnN0IHRpbWVcbiAgLy8gYnV0IGl0IHRyaWdnZXJzIGEgYnVnIGluIElFMTEgYW5kIEVkZ2UgMTQvMTUuXG4gIC8vIENhbGxpbmcgZGVmaW5lUHJvcGVydHkoKSBhZ2FpbiBzaG91bGQgYmUgZXF1aXZhbGVudC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTc2OFxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlXG4gIH0pO1xuICB2YXIgdHJhY2tlciA9IHtcbiAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9LFxuICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICB9LFxuICAgIHN0b3BUcmFja2luZzogZnVuY3Rpb24gKCkge1xuICAgICAgZGV0YWNoVHJhY2tlcihub2RlKTtcbiAgICAgIGRlbGV0ZSBub2RlW3ZhbHVlRmllbGRdO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIHRyYWNrKG5vZGUpIHtcbiAgaWYgKGdldFRyYWNrZXIobm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVE9ETzogT25jZSBpdCdzIGp1c3QgRmliZXIgd2UgY2FuIG1vdmUgdGhpcyB0byBub2RlLl93cmFwcGVyU3RhdGVcblxuXG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IHRyYWNrVmFsdWVPbk5vZGUobm9kZSk7XG59XG5mdW5jdGlvbiB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChub2RlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0cmFja2VyID0gZ2V0VHJhY2tlcihub2RlKTsgLy8gaWYgdGhlcmUgaXMgbm8gdHJhY2tlciBhdCB0aGlzIHBvaW50IGl0J3MgdW5saWtlbHlcbiAgLy8gdGhhdCB0cnlpbmcgYWdhaW4gd2lsbCBzdWNjZWVkXG5cbiAgaWYgKCF0cmFja2VyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbGFzdFZhbHVlID0gdHJhY2tlci5nZXRWYWx1ZSgpO1xuICB2YXIgbmV4dFZhbHVlID0gZ2V0VmFsdWVGcm9tTm9kZShub2RlKTtcblxuICBpZiAobmV4dFZhbHVlICE9PSBsYXN0VmFsdWUpIHtcbiAgICB0cmFja2VyLnNldFZhbHVlKG5leHRWYWx1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnQoZG9jKSB7XG4gIGRvYyA9IGRvYyB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogdW5kZWZpbmVkKTtcblxuICBpZiAodHlwZW9mIGRvYyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRvYy5hY3RpdmVFbGVtZW50IHx8IGRvYy5ib2R5O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGRvYy5ib2R5O1xuICB9XG59XG5cbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gZmFsc2U7XG52YXIgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaXNDb250cm9sbGVkKHByb3BzKSB7XG4gIHZhciB1c2VzQ2hlY2tlZCA9IHByb3BzLnR5cGUgPT09ICdjaGVja2JveCcgfHwgcHJvcHMudHlwZSA9PT0gJ3JhZGlvJztcbiAgcmV0dXJuIHVzZXNDaGVja2VkID8gcHJvcHMuY2hlY2tlZCAhPSBudWxsIDogcHJvcHMudmFsdWUgIT0gbnVsbDtcbn1cbi8qKlxuICogSW1wbGVtZW50cyBhbiA8aW5wdXQ+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgdGhlc2Ugb3B0aW9uYWxcbiAqIHByb3BzOiBgY2hlY2tlZGAsIGB2YWx1ZWAsIGBkZWZhdWx0Q2hlY2tlZGAsIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBJZiBgY2hlY2tlZGAgb3IgYHZhbHVlYCBhcmUgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9uc1xuICogdGhhdCBhZmZlY3QgdGhlIGNoZWNrZWQgc3RhdGUgb3IgdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgdGhleSBhcmUgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIG5vdFxuICogdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgcHJvcHMgbXVzdCBjaGFuZ2UgaW4gb3JkZXIgZm9yXG4gKiB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXMgdW5jaGVja2VkIChvciBgZGVmYXVsdENoZWNrZWRgKVxuICogd2l0aCBhbiBlbXB0eSB2YWx1ZSAob3IgYGRlZmF1bHRWYWx1ZWApLlxuICpcbiAqIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEyL1dELWh0bWw1LTIwMTIxMDI1L3RoZS1pbnB1dC1lbGVtZW50Lmh0bWxcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZDtcbiAgdmFyIGhvc3RQcm9wcyA9IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBkZWZhdWx0Q2hlY2tlZDogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgY2hlY2tlZDogY2hlY2tlZCAhPSBudWxsID8gY2hlY2tlZCA6IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZFxuICB9KTtcbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ2lucHV0JywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsID8gJycgOiBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsQ2hlY2tlZDogcHJvcHMuY2hlY2tlZCAhPSBudWxsID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSAhPSBudWxsID8gcHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWUpLFxuICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcylcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgJ2NoZWNrZWQnLCBjaGVja2VkLCBmYWxzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICB2YXIgY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG5cbiAgICBpZiAoIW5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvICcgKyAnYSBkZWZpbmVkIHZhbHVlLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSBhIGRlZmluZWQgdG8gJyArICd1bmRlZmluZWQsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpO1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPT09IDAgJiYgbm9kZS52YWx1ZSA9PT0gJycgfHwgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGNvZXJjZSB0byBudW1iZXIgaGVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnKSB7XG4gICAgLy8gU3VibWl0L3Jlc2V0IGlucHV0cyBuZWVkIHRoZSBhdHRyaWJ1dGUgcmVtb3ZlZCBjb21wbGV0ZWx5IHRvIGF2b2lkXG4gICAgLy8gYmxhbmstdGV4dCBidXR0b25zLlxuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIGNvbWVzIGZyb20gYSBjYXNjYWRlIG9mXG4gICAgLy8gcHJvcGVydGllczpcbiAgICAvLyAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMy4gT3RoZXJ3aXNlIHRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2VcbiAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBpdCBvbmx5IGNoYW5nZXMgd2hlbiBpdCBuZWVkc1xuICAgIC8vIHRvIGJlIHJlbW92ZWQsIHN1Y2ggYXMgdHJhbnNpdGlvbmluZyBmcm9tIGEgY2hlY2tib3ggaW50byBhIHRleHQgaW5wdXRcbiAgICBpZiAocHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlcihlbGVtZW50LCBwcm9wcywgaXNIeWRyYXRpbmcpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpIHx8IHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgIHZhciB0eXBlID0gcHJvcHMudHlwZTtcbiAgICB2YXIgaXNCdXR0b24gPSB0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnOyAvLyBBdm9pZCBzZXR0aW5nIHZhbHVlIGF0dHJpYnV0ZSBvbiBzdWJtaXQvcmVzZXQgaW5wdXRzIGFzIGl0IG92ZXJyaWRlcyB0aGVcbiAgICAvLyBkZWZhdWx0IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyLiBTZWU6ICMxMjg3MlxuXG4gICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsVmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICB7XG4gICAgICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgcHJvcGVydHkgc2hvdWxkIHVzZVxuICAgICAgICAvLyB0aGUgd3JhcHBlclN0YXRlLl9pbml0aWFsVmFsdWUgcHJvcGVydHkuIFRoaXMgdXNlczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAzLiBBbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICAgIG5vZGUudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgc3luY2hyb25pemVkIHRvIHRoZSBwcm9wZXJ0eSxcbiAgICAgIC8vIHNvIHdlIGFzc2lnbiBkZWZhdWx0VmFsdWUgdG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAvLyBhc3NpZ25tZW50IHN0ZXAgYWJvdmUuXG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB9XG4gIH0gLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYSBjaHJvbWUgYnVnIHdoZXJlIHNldHRpbmcgZGVmYXVsdENoZWNrZWRcbiAgLy8gd2lsbCBzb21ldGltZXMgaW5mbHVlbmNlIHRoZSB2YWx1ZSBvZiBjaGVja2VkIChldmVuIGFmdGVyIGRldGFjaG1lbnQpLlxuICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuc2V0IG5hbWUgdG8gYXZvaWQgZGlzcnVwdGluZyByYWRpbyBidXR0b24gZ3JvdXBzLlxuXG5cbiAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gJyc7XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgYm90aCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSBhbmRcbiAgICAvLyBhdHRyaWJ1dGUgYXJlIGFzc2lnbmVkIGF0IHRoZSBzYW1lIHRpbWUgdXNpbmcgZGVmYXVsdENoZWNrZWQuIFRoaXMgdXNlczpcbiAgICAvL1xuICAgIC8vICAgMS4gVGhlIGNoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAyLiBUaGUgZGVmYXVsdENoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAzLiBPdGhlcndpc2UsIGZhbHNlXG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIW5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcbiAgfVxuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB1cGRhdGVXcmFwcGVyKG5vZGUsIHByb3BzKTtcbiAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTmFtZWRDb3VzaW5zKHJvb3ROb2RlLCBwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG5cbiAgaWYgKHByb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmFtZSAhPSBudWxsKSB7XG4gICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlO1xuXG4gICAgd2hpbGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7XG4gICAgICBxdWVyeVJvb3QgPSBxdWVyeVJvb3QucGFyZW50Tm9kZTtcbiAgICB9IC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0uIEl0IG1pZ2h0IG5vdCBldmVuIGJlIGluIHRoZVxuICAgIC8vIGRvY3VtZW50LiBMZXQncyBqdXN0IHVzZSB0aGUgbG9jYWwgYHF1ZXJ5U2VsZWN0b3JBbGxgIHRvIGVuc3VyZSB3ZSBkb24ndFxuICAgIC8vIG1pc3MgYW55dGhpbmcuXG5cblxuICAgIHtcbiAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24obmFtZSwgJ25hbWUnKTtcbiAgICB9XG5cbiAgICB2YXIgZ3JvdXAgPSBxdWVyeVJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0nICsgSlNPTi5zdHJpbmdpZnkoJycgKyBuYW1lKSArICddW3R5cGU9XCJyYWRpb1wiXScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG90aGVyTm9kZSA9IGdyb3VwW2ldO1xuXG4gICAgICBpZiAob3RoZXJOb2RlID09PSByb290Tm9kZSB8fCBvdGhlck5vZGUuZm9ybSAhPT0gcm9vdE5vZGUuZm9ybSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gVGhpcyB3aWxsIHRocm93IGlmIHJhZGlvIGJ1dHRvbnMgcmVuZGVyZWQgYnkgZGlmZmVyZW50IGNvcGllcyBvZiBSZWFjdFxuICAgICAgLy8gYW5kIHRoZSBzYW1lIG5hbWUgYXJlIHJlbmRlcmVkIGludG8gdGhlIHNhbWUgZm9ybSAoc2FtZSBhcyAjMTkzOSkuXG4gICAgICAvLyBUaGF0J3MgcHJvYmFibHkgb2theTsgd2UgZG9uJ3Qgc3VwcG9ydCBpdCBqdXN0IGFzIHdlIGRvbid0IHN1cHBvcnRcbiAgICAgIC8vIG1peGluZyBSZWFjdCByYWRpbyBidXR0b25zIHdpdGggbm9uLVJlYWN0IG9uZXMuXG5cblxuICAgICAgdmFyIG90aGVyUHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKG90aGVyTm9kZSk7XG5cbiAgICAgIGlmICghb3RoZXJQcm9wcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0RE9NSW5wdXQ6IE1peGluZyBSZWFjdCBhbmQgbm9uLVJlYWN0IHJhZGlvIGlucHV0cyB3aXRoIHRoZSAnICsgJ3NhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9IC8vIFdlIG5lZWQgdXBkYXRlIHRoZSB0cmFja2VkIHZhbHVlIG9uIHRoZSBuYW1lZCBjb3VzaW4gc2luY2UgdGhlIHZhbHVlXG4gICAgICAvLyB3YXMgY2hhbmdlZCBidXQgdGhlIGlucHV0IHNhdyBubyBldmVudCBvciB2YWx1ZSBzZXRcblxuXG4gICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpOyAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cblxuICAgICAgdXBkYXRlV3JhcHBlcihvdGhlck5vZGUsIG90aGVyUHJvcHMpO1xuICAgIH1cbiAgfVxufSAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFsdWUgdG8gY2VydGFpbiBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLlxuLy8gRm9yIG51bWJlciBpbnB1dHMsIHRoZSBkaXNwbGF5IHZhbHVlIGxvc2VzIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnRzLiBGb3IgZW1haWwgaW5wdXRzLFxuLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbi8vXG4vLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtc1xuLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1M1xuXG5cbmZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanNcbiAgdHlwZSAhPT0gJ251bWJlcicgfHwgZ2V0QWN0aXZlRWxlbWVudChub2RlLm93bmVyRG9jdW1lbnQpICE9PSBub2RlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLmRlZmF1bHRWYWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gZmFsc2U7XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIC8vIElmIGEgdmFsdWUgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoZSBjaGlsZHJlbiBtdXN0IGJlIHNpbXBsZS5cbiAgICBpZiAocHJvcHMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ29iamVjdCcgJiYgcHJvcHMuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZENoaWxkKSB7XG4gICAgICAgICAgICBkaWRXYXJuSW52YWxpZENoaWxkID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCBpbmZlciB0aGUgb3B0aW9uIHZhbHVlIG9mIGNvbXBsZXggY2hpbGRyZW4uICcgKyAnUGFzcyBhIGB2YWx1ZWAgcHJvcCBvciB1c2UgYSBwbGFpbiBzdHJpbmcgYXMgY2hpbGRyZW4gdG8gPG9wdGlvbj4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MKSB7XG4gICAgICAgICAgZGlkV2FybkludmFsaWRJbm5lckhUTUwgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1Bhc3MgYSBgdmFsdWVgIHByb3AgaWYgeW91IHNldCBkYW5nZXJvdXNseUlubmVySFRNTCBzbyBSZWFjdCBrbm93cyAnICsgJ3doaWNoIHZhbHVlIHNob3VsZCBiZSBzZWxlY3RlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVE9ETzogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uXG5cblxuICAgIGlmIChwcm9wcy5zZWxlY3RlZCAhPSBudWxsICYmICFkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbikge1xuICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICcgKyAnc2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LicpO1xuXG4gICAgICBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gdmFsdWU9XCJcIiBzaG91bGQgbWFrZSBhIHZhbHVlIGF0dHJpYnV0ZSAoIzYyMTkpXG4gIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSkpKTtcbiAgfVxufVxuXG52YXIgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYSkge1xuICByZXR1cm4gaXNBcnJheUltcGwoYSk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMTtcblxue1xuICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gIGlmIChvd25lck5hbWUpIHtcbiAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIHZhbHVlUHJvcE5hbWVzID0gWyd2YWx1ZScsICdkZWZhdWx0VmFsdWUnXTtcbi8qKlxuICogVmFsaWRhdGlvbiBmdW5jdGlvbiBmb3IgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKi9cblxuZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3NlbGVjdCcsIHByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wTmFtZSA9IHZhbHVlUHJvcE5hbWVzW2ldO1xuXG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9wTmFtZUlzQXJyYXkgPSBpc0FycmF5KHByb3BzW3Byb3BOYW1lXSk7XG5cbiAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSAmJiAhcHJvcE5hbWVJc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfSBlbHNlIGlmICghcHJvcHMubXVsdGlwbGUgJiYgcHJvcE5hbWVJc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYSBzY2FsYXIgJyArICd2YWx1ZSBpZiBgbXVsdGlwbGVgIGlzIGZhbHNlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyhub2RlLCBtdWx0aXBsZSwgcHJvcFZhbHVlLCBzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgdmFyIG9wdGlvbnMgPSBub2RlLm9wdGlvbnM7XG5cbiAgaWYgKG11bHRpcGxlKSB7XG4gICAgdmFyIHNlbGVjdGVkVmFsdWVzID0gcHJvcFZhbHVlO1xuICAgIHZhciBzZWxlY3RlZFZhbHVlID0ge307XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBQcmVmaXggdG8gYXZvaWQgY2hhb3Mgd2l0aCBzcGVjaWFsIGtleXMuXG4gICAgICBzZWxlY3RlZFZhbHVlWyckJyArIHNlbGVjdGVkVmFsdWVzW2ldXSA9IHRydWU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG9wdGlvbnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVlLmhhc093blByb3BlcnR5KCckJyArIG9wdGlvbnNbX2ldLnZhbHVlKTtcblxuICAgICAgaWYgKG9wdGlvbnNbX2ldLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZWN0ZWQgJiYgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIERvIG5vdCBzZXQgYHNlbGVjdC52YWx1ZWAgYXMgZXhhY3QgYmVoYXZpb3IgaXNuJ3QgY29uc2lzdGVudCBhY3Jvc3MgYWxsXG4gICAgLy8gYnJvd3NlcnMgZm9yIGFsbCBjYXNlcy5cbiAgICB2YXIgX3NlbGVjdGVkVmFsdWUgPSB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BWYWx1ZSkpO1xuXG4gICAgdmFyIGRlZmF1bHRTZWxlY3RlZCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBvcHRpb25zLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIGlmIChvcHRpb25zW19pMl0udmFsdWUgPT09IF9zZWxlY3RlZFZhbHVlKSB7XG4gICAgICAgIG9wdGlvbnNbX2kyXS5zZWxlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICAgIG9wdGlvbnNbX2kyXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkID09PSBudWxsICYmICFvcHRpb25zW19pMl0uZGlzYWJsZWQpIHtcbiAgICAgICAgZGVmYXVsdFNlbGVjdGVkID0gb3B0aW9uc1tfaTJdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgIT09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRTZWxlY3RlZC5zZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEltcGxlbWVudHMgYSA8c2VsZWN0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBvcHRpb25hbGx5IHNldHRpbmcgdGhlXG4gKiBwcm9wcyBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC4gSWYgYG11bHRpcGxlYCBpcyBmYWxzZSwgdGhlIHByb3AgbXVzdCBiZSBhXG4gKiBzdHJpbmdhYmxlLiBJZiBgbXVsdGlwbGVgIGlzIHRydWUsIHRoZSBwcm9wIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nYWJsZXMuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgY2hhbmdlIHRoZVxuICogc2VsZWN0ZWQgb3B0aW9uIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSByZW5kZXJlZCBvcHRpb25zLlxuICpcbiAqIElmIGl0IGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIG9wdGlvbnMgd2lsbCBub3RcbiAqIHVwZGF0ZSBpbiByZXNwb25zZSB0byB1c2VyIGFjdGlvbnMuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgb3B0aW9ucyB0byB1cGRhdGUuXG4gKlxuICogSWYgYGRlZmF1bHRWYWx1ZWAgaXMgcHJvdmlkZWQsIGFueSBvcHRpb25zIHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlcyB3aWxsIGJlXG4gKiBzZWxlY3RlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHJldHVybiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZFxuICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICB3YXNNdWx0aXBsZTogISFwcm9wcy5tdWx0aXBsZVxuICB9O1xuXG4gIHtcbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEpIHtcbiAgICAgIGVycm9yKCdTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHNlbGVjdCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIG5vZGUubXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdFVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgd2FzTXVsdGlwbGUgPSBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHdhc011bHRpcGxlICE9PSAhIXByb3BzLm11bHRpcGxlKSB7XG4gICAgLy8gRm9yIHNpbXBsaWNpdHksIHJlYXBwbHkgYGRlZmF1bHRWYWx1ZWAgaWYgYG11bHRpcGxlYCBpcyB0b2dnbGVkLlxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXZlcnQgdGhlIHNlbGVjdCBiYWNrIHRvIGl0cyBkZWZhdWx0IHVuc2VsZWN0ZWQgc3RhdGUuXG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLm11bHRpcGxlID8gW10gOiAnJywgZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gZmFsc2U7XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIDx0ZXh0YXJlYT4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyBgdmFsdWVgLCBhbmRcbiAqIGBkZWZhdWx0VmFsdWVgLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdHJhZGl0aW9uYWwgRE9NIEFQSSBiZWNhdXNlIHZhbHVlIGlzXG4gKiB1c3VhbGx5IHNldCBhcyBQQ0RBVEEgY2hpbGRyZW4uXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZVxuICogdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGxcbiAqIG5vdCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBlbXB0eSB2YWx1ZSwgdGhlIHByb3BcbiAqIGBkZWZhdWx0VmFsdWVgIGlmIHNwZWNpZmllZCwgb3IgdGhlIGNoaWxkcmVuIGNvbnRlbnQgKGRlcHJlY2F0ZWQpLlxuICovXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2BkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LicpO1xuICB9IC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudFxuICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rU29waGllIHNlZW1lZCB0byBsaWtlIHRoaXNcbiAgLy8gc29sdXRpb24uIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3MgZm9yY2VkXG4gIC8vIHRvIGJlIGEgc3RyaW5nLlxuXG5cbiAgdmFyIGhvc3RQcm9wcyA9IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoaWxkcmVuOiB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKVxuICB9KTtcblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygndGV4dGFyZWEnLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbERlZmF1bHRWYWwpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhIHRleHRhcmVhIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ1RleHRhcmVhIGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCB0ZXh0YXJlYSAnICsgJ2FuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50Jyk7XG5cbiAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgaW5pdGlhbFZhbHVlID0gcHJvcHMudmFsdWU7IC8vIE9ubHkgYm90aGVyIGZldGNoaW5nIGRlZmF1bHQgdmFsdWUgaWYgd2UncmUgZ29pbmcgdG8gdXNlIGl0XG5cbiAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcblxuICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgaW5zdGVhZCBvZiBzZXR0aW5nICcgKyAnY2hpbGRyZW4gb24gPHRleHRhcmVhPi4nKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lmIHlvdSBzdXBwbHkgYGRlZmF1bHRWYWx1ZWAgb24gYSA8dGV4dGFyZWE+LCBkbyBub3QgcGFzcyBjaGlsZHJlbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJzx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdFZhbHVlID0gY2hpbGRyZW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0VmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICBpbml0aWFsVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKGluaXRpYWxWYWx1ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpO1xuICB2YXIgZGVmYXVsdFZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgLy8gQ2FzdCBgdmFsdWVgIHRvIGEgc3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNvcnJlY3RseS4gV2hpbGVcbiAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRvZXNuJ3QuXG4gICAgdmFyIG5ld1ZhbHVlID0gdG9TdHJpbmcodmFsdWUpOyAvLyBUbyBhdm9pZCBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgbG9zaW5nIHRleHQgc2VsZWN0aW9uKSwgb25seSBzZXQgdmFsdWUgaWYgY2hhbmdlZFxuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICBub2RlLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsICYmIG5vZGUuZGVmYXVsdFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKGRlZmF1bHRWYWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMyhlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7IC8vIFRoaXMgaXMgaW4gcG9zdE1vdW50IGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIERPTSBub2RlLCB3aGljaCBpcyBub3RcbiAgLy8gYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIG1vdW50ZWQuXG5cbiAgdmFyIHRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudDsgLy8gT25seSBzZXQgbm9kZS52YWx1ZSBpZiB0ZXh0Q29udGVudCBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWRcbiAgLy8gaW5pdGlhbCB2YWx1ZS4gSW4gSUUxMC9JRTExIHRoZXJlIGlzIGEgYnVnIHdoZXJlIHRoZSBwbGFjZWhvbGRlciBhdHRyaWJ1dGVcbiAgLy8gd2lsbCBwb3B1bGF0ZSB0ZXh0Q29udGVudCBhcyB3ZWxsLlxuICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMDE1MjUvXG5cbiAgaWYgKHRleHRDb250ZW50ID09PSBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKSB7XG4gICAgaWYgKHRleHRDb250ZW50ICE9PSAnJyAmJiB0ZXh0Q29udGVudCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS52YWx1ZSA9IHRleHRDb250ZW50O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIERPTSBjb21wb25lbnQgaXMgc3RpbGwgbW91bnRlZDsgdXBkYXRlXG4gIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcyk7XG59XG5cbnZhciBIVE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbnZhciBNQVRIX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbnZhciBTVkdfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJzsgLy8gQXNzdW1lcyB0aGVyZSBpcyBubyBwYXJlbnQgbmFtZXNwYWNlLlxuXG5mdW5jdGlvbiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdzdmcnOlxuICAgICAgcmV0dXJuIFNWR19OQU1FU1BBQ0U7XG5cbiAgICBjYXNlICdtYXRoJzpcbiAgICAgIHJldHVybiBNQVRIX05BTUVTUEFDRTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSFRNTF9OQU1FU1BBQ0U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkTmFtZXNwYWNlKHBhcmVudE5hbWVzcGFjZSwgdHlwZSkge1xuICBpZiAocGFyZW50TmFtZXNwYWNlID09IG51bGwgfHwgcGFyZW50TmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIC8vIE5vIChvciBkZWZhdWx0KSBwYXJlbnQgbmFtZXNwYWNlOiBwb3RlbnRpYWwgZW50cnkgcG9pbnQuXG4gICAgcmV0dXJuIGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuXG4gIGlmIChwYXJlbnROYW1lc3BhY2UgPT09IFNWR19OQU1FU1BBQ0UgJiYgdHlwZSA9PT0gJ2ZvcmVpZ25PYmplY3QnKSB7XG4gICAgLy8gV2UncmUgbGVhdmluZyBTVkcuXG4gICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9IC8vIEJ5IGRlZmF1bHQsIHBhc3MgbmFtZXNwYWNlIGJlbG93LlxuXG5cbiAgcmV0dXJuIHBhcmVudE5hbWVzcGFjZTtcbn1cblxuLyogZ2xvYmFscyBNU0FwcCAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIHdoaWNoIGhhcyAndW5zYWZlJyBwcml2aWxlZ2VzIChyZXF1aXJlZCBieSB3aW5kb3dzOCBhcHBzKVxuICovXG52YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gIGlmICh0eXBlb2YgTVNBcHAgIT09ICd1bmRlZmluZWQnICYmIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmdW5jKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnVuYztcbiAgfVxufTtcblxudmFyIHJldXNhYmxlU1ZHQ29udGFpbmVyO1xuLyoqXG4gKiBTZXQgdGhlIGlubmVySFRNTCBwcm9wZXJ0eSBvZiBhIG5vZGVcbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0SW5uZXJIVE1MID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgaHRtbCkge1xuICBpZiAobm9kZS5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcblxuICAgIGlmICghKCdpbm5lckhUTUwnIGluIG5vZGUpKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGlubmVySFRNTCBmb3IgU1ZHIG5vZGVzLCBzbyBpbnN0ZWFkIHdlIGluamVjdCB0aGVcbiAgICAgIC8vIG5ldyBtYXJrdXAgaW4gYSB0ZW1wIG5vZGUgYW5kIHRoZW4gbW92ZSB0aGUgY2hpbGQgbm9kZXMgYWNyb3NzIGludG9cbiAgICAgIC8vIHRoZSB0YXJnZXQgbm9kZVxuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIgPSByZXVzYWJsZVNWR0NvbnRhaW5lciB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyLmlubmVySFRNTCA9ICc8c3ZnPicgKyBodG1sLnZhbHVlT2YoKS50b1N0cmluZygpICsgJzwvc3ZnPic7XG4gICAgICB2YXIgc3ZnTm9kZSA9IHJldXNhYmxlU1ZHQ29udGFpbmVyLmZpcnN0Q2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoc3ZnTm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3ZnTm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG5vZGUuaW5uZXJIVE1MID0gaHRtbDtcbn0pO1xuXG4vKipcbiAqIEhUTUwgbm9kZVR5cGUgdmFsdWVzIHRoYXQgcmVwcmVzZW50IHRoZSB0eXBlIG9mIHRoZSBub2RlXG4gKi9cbnZhciBFTEVNRU5UX05PREUgPSAxO1xudmFyIFRFWFRfTk9ERSA9IDM7XG52YXIgQ09NTUVOVF9OT0RFID0gODtcbnZhciBET0NVTUVOVF9OT0RFID0gOTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFID0gMTE7XG5cbi8qKlxuICogU2V0IHRoZSB0ZXh0Q29udGVudCBwcm9wZXJ0eSBvZiBhIG5vZGUuIEZvciB0ZXh0IHVwZGF0ZXMsIGl0J3MgZmFzdGVyXG4gKiB0byBzZXQgdGhlIGBub2RlVmFsdWVgIG9mIHRoZSBUZXh0IG5vZGUgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZ1xuICogYC50ZXh0Q29udGVudGAgd2hpY2ggd2lsbCByZW1vdmUgdGhlIGV4aXN0aW5nIG5vZGUgYW5kIGNyZWF0ZSBhIG5ldyBvbmUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHtcbiAgaWYgKHRleHQpIHtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblxuICAgIGlmIChmaXJzdENoaWxkICYmIGZpcnN0Q2hpbGQgPT09IG5vZGUubGFzdENoaWxkICYmIGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xufTtcblxuLy8gTGlzdCBkZXJpdmVkIGZyb20gR2Vja28gc291cmNlIGNvZGU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9nZWNrby1kZXYvYmxvYi80ZTYzOGVmYzcxL2xheW91dC9zdHlsZS90ZXN0L3Byb3BlcnR5X2RhdGFiYXNlLmpzXG52YXIgc2hvcnRoYW5kVG9Mb25naGFuZCA9IHtcbiAgYW5pbWF0aW9uOiBbJ2FuaW1hdGlvbkRlbGF5JywgJ2FuaW1hdGlvbkRpcmVjdGlvbicsICdhbmltYXRpb25EdXJhdGlvbicsICdhbmltYXRpb25GaWxsTW9kZScsICdhbmltYXRpb25JdGVyYXRpb25Db3VudCcsICdhbmltYXRpb25OYW1lJywgJ2FuaW1hdGlvblBsYXlTdGF0ZScsICdhbmltYXRpb25UaW1pbmdGdW5jdGlvbiddLFxuICBiYWNrZ3JvdW5kOiBbJ2JhY2tncm91bmRBdHRhY2htZW50JywgJ2JhY2tncm91bmRDbGlwJywgJ2JhY2tncm91bmRDb2xvcicsICdiYWNrZ3JvdW5kSW1hZ2UnLCAnYmFja2dyb3VuZE9yaWdpbicsICdiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknLCAnYmFja2dyb3VuZFJlcGVhdCcsICdiYWNrZ3JvdW5kU2l6ZSddLFxuICBiYWNrZ3JvdW5kUG9zaXRpb246IFsnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJ10sXG4gIGJvcmRlcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnLCAnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tFbmQ6IFsnYm9yZGVyQmxvY2tFbmRDb2xvcicsICdib3JkZXJCbG9ja0VuZFN0eWxlJywgJ2JvcmRlckJsb2NrRW5kV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tTdGFydDogWydib3JkZXJCbG9ja1N0YXJ0Q29sb3InLCAnYm9yZGVyQmxvY2tTdGFydFN0eWxlJywgJ2JvcmRlckJsb2NrU3RhcnRXaWR0aCddLFxuICBib3JkZXJCb3R0b206IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnXSxcbiAgYm9yZGVyQ29sb3I6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyVG9wQ29sb3InXSxcbiAgYm9yZGVySW1hZ2U6IFsnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJ10sXG4gIGJvcmRlcklubGluZUVuZDogWydib3JkZXJJbmxpbmVFbmRDb2xvcicsICdib3JkZXJJbmxpbmVFbmRTdHlsZScsICdib3JkZXJJbmxpbmVFbmRXaWR0aCddLFxuICBib3JkZXJJbmxpbmVTdGFydDogWydib3JkZXJJbmxpbmVTdGFydENvbG9yJywgJ2JvcmRlcklubGluZVN0YXJ0U3R5bGUnLCAnYm9yZGVySW5saW5lU3RhcnRXaWR0aCddLFxuICBib3JkZXJMZWZ0OiBbJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJ10sXG4gIGJvcmRlclJhZGl1czogWydib3JkZXJCb3R0b21MZWZ0UmFkaXVzJywgJ2JvcmRlckJvdHRvbVJpZ2h0UmFkaXVzJywgJ2JvcmRlclRvcExlZnRSYWRpdXMnLCAnYm9yZGVyVG9wUmlnaHRSYWRpdXMnXSxcbiAgYm9yZGVyUmlnaHQ6IFsnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclJpZ2h0V2lkdGgnXSxcbiAgYm9yZGVyU3R5bGU6IFsnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyVG9wU3R5bGUnXSxcbiAgYm9yZGVyVG9wOiBbJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlcldpZHRoOiBbJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGNvbHVtblJ1bGU6IFsnY29sdW1uUnVsZUNvbG9yJywgJ2NvbHVtblJ1bGVTdHlsZScsICdjb2x1bW5SdWxlV2lkdGgnXSxcbiAgY29sdW1uczogWydjb2x1bW5Db3VudCcsICdjb2x1bW5XaWR0aCddLFxuICBmbGV4OiBbJ2ZsZXhCYXNpcycsICdmbGV4R3JvdycsICdmbGV4U2hyaW5rJ10sXG4gIGZsZXhGbG93OiBbJ2ZsZXhEaXJlY3Rpb24nLCAnZmxleFdyYXAnXSxcbiAgZm9udDogWydmb250RmFtaWx5JywgJ2ZvbnRGZWF0dXJlU2V0dGluZ3MnLCAnZm9udEtlcm5pbmcnLCAnZm9udExhbmd1YWdlT3ZlcnJpZGUnLCAnZm9udFNpemUnLCAnZm9udFNpemVBZGp1c3QnLCAnZm9udFN0cmV0Y2gnLCAnZm9udFN0eWxlJywgJ2ZvbnRWYXJpYW50JywgJ2ZvbnRWYXJpYW50QWx0ZXJuYXRlcycsICdmb250VmFyaWFudENhcHMnLCAnZm9udFZhcmlhbnRFYXN0QXNpYW4nLCAnZm9udFZhcmlhbnRMaWdhdHVyZXMnLCAnZm9udFZhcmlhbnROdW1lcmljJywgJ2ZvbnRWYXJpYW50UG9zaXRpb24nLCAnZm9udFdlaWdodCcsICdsaW5lSGVpZ2h0J10sXG4gIGZvbnRWYXJpYW50OiBbJ2ZvbnRWYXJpYW50QWx0ZXJuYXRlcycsICdmb250VmFyaWFudENhcHMnLCAnZm9udFZhcmlhbnRFYXN0QXNpYW4nLCAnZm9udFZhcmlhbnRMaWdhdHVyZXMnLCAnZm9udFZhcmlhbnROdW1lcmljJywgJ2ZvbnRWYXJpYW50UG9zaXRpb24nXSxcbiAgZ2FwOiBbJ2NvbHVtbkdhcCcsICdyb3dHYXAnXSxcbiAgZ3JpZDogWydncmlkQXV0b0NvbHVtbnMnLCAnZ3JpZEF1dG9GbG93JywgJ2dyaWRBdXRvUm93cycsICdncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgZ3JpZEFyZWE6IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnLCAnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZENvbHVtbjogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCddLFxuICBncmlkQ29sdW1uR2FwOiBbJ2NvbHVtbkdhcCddLFxuICBncmlkR2FwOiBbJ2NvbHVtbkdhcCcsICdyb3dHYXAnXSxcbiAgZ3JpZFJvdzogWydncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkUm93R2FwOiBbJ3Jvd0dhcCddLFxuICBncmlkVGVtcGxhdGU6IFsnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGxpc3RTdHlsZTogWydsaXN0U3R5bGVJbWFnZScsICdsaXN0U3R5bGVQb3NpdGlvbicsICdsaXN0U3R5bGVUeXBlJ10sXG4gIG1hcmdpbjogWydtYXJnaW5Cb3R0b20nLCAnbWFyZ2luTGVmdCcsICdtYXJnaW5SaWdodCcsICdtYXJnaW5Ub3AnXSxcbiAgbWFya2VyOiBbJ21hcmtlckVuZCcsICdtYXJrZXJNaWQnLCAnbWFya2VyU3RhcnQnXSxcbiAgbWFzazogWydtYXNrQ2xpcCcsICdtYXNrQ29tcG9zaXRlJywgJ21hc2tJbWFnZScsICdtYXNrTW9kZScsICdtYXNrT3JpZ2luJywgJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWScsICdtYXNrUmVwZWF0JywgJ21hc2tTaXplJ10sXG4gIG1hc2tQb3NpdGlvbjogWydtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknXSxcbiAgb3V0bGluZTogWydvdXRsaW5lQ29sb3InLCAnb3V0bGluZVN0eWxlJywgJ291dGxpbmVXaWR0aCddLFxuICBvdmVyZmxvdzogWydvdmVyZmxvd1gnLCAnb3ZlcmZsb3dZJ10sXG4gIHBhZGRpbmc6IFsncGFkZGluZ0JvdHRvbScsICdwYWRkaW5nTGVmdCcsICdwYWRkaW5nUmlnaHQnLCAncGFkZGluZ1RvcCddLFxuICBwbGFjZUNvbnRlbnQ6IFsnYWxpZ25Db250ZW50JywgJ2p1c3RpZnlDb250ZW50J10sXG4gIHBsYWNlSXRlbXM6IFsnYWxpZ25JdGVtcycsICdqdXN0aWZ5SXRlbXMnXSxcbiAgcGxhY2VTZWxmOiBbJ2FsaWduU2VsZicsICdqdXN0aWZ5U2VsZiddLFxuICB0ZXh0RGVjb3JhdGlvbjogWyd0ZXh0RGVjb3JhdGlvbkNvbG9yJywgJ3RleHREZWNvcmF0aW9uTGluZScsICd0ZXh0RGVjb3JhdGlvblN0eWxlJ10sXG4gIHRleHRFbXBoYXNpczogWyd0ZXh0RW1waGFzaXNDb2xvcicsICd0ZXh0RW1waGFzaXNTdHlsZSddLFxuICB0cmFuc2l0aW9uOiBbJ3RyYW5zaXRpb25EZWxheScsICd0cmFuc2l0aW9uRHVyYXRpb24nLCAndHJhbnNpdGlvblByb3BlcnR5JywgJ3RyYW5zaXRpb25UaW1pbmdGdW5jdGlvbiddLFxuICB3b3JkV3JhcDogWydvdmVyZmxvd1dyYXAnXVxufTtcblxuLyoqXG4gKiBDU1MgcHJvcGVydGllcyB3aGljaCBhY2NlcHQgbnVtYmVycyBidXQgYXJlIG5vdCBpbiB1bml0cyBvZiBcInB4XCIuXG4gKi9cbnZhciBpc1VuaXRsZXNzTnVtYmVyID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYXNwZWN0UmF0aW86IHRydWUsXG4gIGJvcmRlckltYWdlT3V0c2V0OiB0cnVlLFxuICBib3JkZXJJbWFnZVNsaWNlOiB0cnVlLFxuICBib3JkZXJJbWFnZVdpZHRoOiB0cnVlLFxuICBib3hGbGV4OiB0cnVlLFxuICBib3hGbGV4R3JvdXA6IHRydWUsXG4gIGJveE9yZGluYWxHcm91cDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGNvbHVtbnM6IHRydWUsXG4gIGZsZXg6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4UG9zaXRpdmU6IHRydWUsXG4gIGZsZXhTaHJpbms6IHRydWUsXG4gIGZsZXhOZWdhdGl2ZTogdHJ1ZSxcbiAgZmxleE9yZGVyOiB0cnVlLFxuICBncmlkQXJlYTogdHJ1ZSxcbiAgZ3JpZFJvdzogdHJ1ZSxcbiAgZ3JpZFJvd0VuZDogdHJ1ZSxcbiAgZ3JpZFJvd1NwYW46IHRydWUsXG4gIGdyaWRSb3dTdGFydDogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblNwYW46IHRydWUsXG4gIGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcbiAgZm9udFdlaWdodDogdHJ1ZSxcbiAgbGluZUNsYW1wOiB0cnVlLFxuICBsaW5lSGVpZ2h0OiB0cnVlLFxuICBvcGFjaXR5OiB0cnVlLFxuICBvcmRlcjogdHJ1ZSxcbiAgb3JwaGFuczogdHJ1ZSxcbiAgdGFiU2l6ZTogdHJ1ZSxcbiAgd2lkb3dzOiB0cnVlLFxuICB6SW5kZXg6IHRydWUsXG4gIHpvb206IHRydWUsXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IHRydWUsXG4gIGZsb29kT3BhY2l0eTogdHJ1ZSxcbiAgc3RvcE9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZURhc2hhcnJheTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogdHJ1ZSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSxcbiAgc3Ryb2tlT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlV2lkdGg6IHRydWVcbn07XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggdmVuZG9yLXNwZWNpZmljIHByZWZpeCwgZWc6IFdlYmtpdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBzdHlsZSBuYW1lLCBlZzogdHJhbnNpdGlvbkR1cmF0aW9uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHN0eWxlIG5hbWUgcHJlZml4ZWQgd2l0aCBgcHJlZml4YCwgcHJvcGVybHkgY2FtZWxDYXNlZCwgZWc6XG4gKiBXZWJraXRUcmFuc2l0aW9uRHVyYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBwcmVmaXhLZXkocHJlZml4LCBrZXkpIHtcbiAgcmV0dXJuIHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG59XG4vKipcbiAqIFN1cHBvcnQgc3R5bGUgbmFtZXMgdGhhdCBtYXkgY29tZSBwYXNzZWQgaW4gcHJlZml4ZWQgYnkgYWRkaW5nIHBlcm11dGF0aW9uc1xuICogb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG5cblxudmFyIHByZWZpeGVzID0gWydXZWJraXQnLCAnbXMnLCAnTW96JywgJ08nXTsgLy8gVXNpbmcgT2JqZWN0LmtleXMgaGVyZSwgb3IgZWxzZSB0aGUgdmFuaWxsYSBmb3ItaW4gbG9vcCBtYWtlcyBJRTggZ28gaW50byBhblxuLy8gaW5maW5pdGUgbG9vcCwgYmVjYXVzZSBpdCBpdGVyYXRlcyBvdmVyIHRoZSBuZXdseSBhZGRlZCBwcm9wcyB0b28uXG5cbk9iamVjdC5rZXlzKGlzVW5pdGxlc3NOdW1iZXIpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgcHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgaXNVbml0bGVzc051bWJlcltwcmVmaXhLZXkocHJlZml4LCBwcm9wKV0gPSBpc1VuaXRsZXNzTnVtYmVyW3Byb3BdO1xuICB9KTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSB2YWx1ZSBpbnRvIHRoZSBwcm9wZXIgY3NzIHdyaXRhYmxlIHZhbHVlLiBUaGUgc3R5bGUgbmFtZSBgbmFtZWBcbiAqIHNob3VsZCBiZSBsb2dpY2FsIChubyBoeXBoZW5zKSwgYXMgc3BlY2lmaWVkXG4gKiBpbiBgQ1NTUHJvcGVydHkuaXNVbml0bGVzc051bWJlcmAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQ1NTIHByb3BlcnR5IG5hbWUgc3VjaCBhcyBgdG9wTWFyZ2luYC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQ1NTIHByb3BlcnR5IHZhbHVlIHN1Y2ggYXMgYDEwcHhgLlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIHN0eWxlIHZhbHVlIHdpdGggZGltZW5zaW9ucyBhcHBsaWVkLlxuICovXG5cbmZ1bmN0aW9uIGRhbmdlcm91c1N0eWxlVmFsdWUobmFtZSwgdmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgLy8gTm90ZSB0aGF0IHdlJ3ZlIHJlbW92ZWQgZXNjYXBlVGV4dEZvckJyb3dzZXIoKSBjYWxscyBoZXJlIHNpbmNlIHRoZVxuICAvLyB3aG9sZSBzdHJpbmcgd2lsbCBiZSBlc2NhcGVkIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBpbmplY3RlZCBpbnRvXG4gIC8vIHRoZSBtYXJrdXAuIElmIHlvdSBwcm92aWRlIHVuc2FmZSB1c2VyIGRhdGEgaGVyZSB0aGV5IGNhbiBpbmplY3RcbiAgLy8gYXJiaXRyYXJ5IENTUyB3aGljaCBtYXkgYmUgcHJvYmxlbWF0aWMgKEkgY291bGRuJ3QgcmVwcm8gdGhpcyk6XG4gIC8vIGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvWFNTX0ZpbHRlcl9FdmFzaW9uX0NoZWF0X1NoZWV0XG4gIC8vIGh0dHA6Ly93d3cudGhlc3Bhbm5lci5jby51ay8yMDA3LzExLzI2L3VsdGltYXRlLXhzcy1jc3MtaW5qZWN0aW9uL1xuICAvLyBUaGlzIGlzIG5vdCBhbiBYU1MgaG9sZSBidXQgaW5zdGVhZCBhIHBvdGVudGlhbCBDU1MgaW5qZWN0aW9uIGlzc3VlXG4gIC8vIHdoaWNoIGhhcyBsZWFkIHRvIGEgZ3JlYXRlciBkaXNjdXNzaW9uIGFib3V0IGhvdyB3ZSdyZSBnb2luZyB0b1xuICAvLyB0cnVzdCBVUkxzIG1vdmluZyBmb3J3YXJkLiBTZWUgIzIxMTU5MDFcbiAgdmFyIGlzRW1wdHkgPSB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcblxuICBpZiAoaXNFbXB0eSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICghaXNDdXN0b21Qcm9wZXJ0eSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSAwICYmICEoaXNVbml0bGVzc051bWJlci5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBpc1VuaXRsZXNzTnVtYmVyW25hbWVdKSkge1xuICAgIHJldHVybiB2YWx1ZSArICdweCc7IC8vIFByZXN1bWVzIGltcGxpY2l0ICdweCcgc3VmZml4IGZvciB1bml0bGVzcyBudW1iZXJzXG4gIH1cblxuICB7XG4gICAgY2hlY2tDU1NQcm9wZXJ0eVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBuYW1lKTtcbiAgfVxuXG4gIHJldHVybiAoJycgKyB2YWx1ZSkudHJpbSgpO1xufVxuXG52YXIgdXBwZXJjYXNlUGF0dGVybiA9IC8oW0EtWl0pL2c7XG52YXIgbXNQYXR0ZXJuID0gL15tcy0vO1xuLyoqXG4gKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnYmFja2dyb3VuZENvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmQtY29sb3JcIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnTW96VHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbW96LXRyYW5zaXRpb25cIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnbXNUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tcy10cmFuc2l0aW9uXCJcbiAqXG4gKiBBcyBNb2Rlcm5penIgc3VnZ2VzdHMgKGh0dHA6Ly9tb2Rlcm5penIuY29tL2RvY3MvI3ByZWZpeGVkKSwgYW4gYG1zYCBwcmVmaXhcbiAqIGlzIGNvbnZlcnRlZCB0byBgLW1zLWAuXG4gKi9cblxuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZSh1cHBlcmNhc2VQYXR0ZXJuLCAnLSQxJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gJ21zVHJhbnNmb3JtJyBpcyBjb3JyZWN0LCBidXQgdGhlIG90aGVyIHByZWZpeGVzIHNob3VsZCBiZSBjYXBpdGFsaXplZFxuICB2YXIgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vO1xuICB2YXIgbXNQYXR0ZXJuJDEgPSAvXi1tcy0vO1xuICB2YXIgaHlwaGVuUGF0dGVybiA9IC8tKC4pL2c7IC8vIHN0eWxlIHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvblxuXG4gIHZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4gPSAvO1xccyokLztcbiAgdmFyIHdhcm5lZFN0eWxlTmFtZXMgPSB7fTtcbiAgdmFyIHdhcm5lZFN0eWxlVmFsdWVzID0ge307XG4gIHZhciB3YXJuZWRGb3JOYU5WYWx1ZSA9IGZhbHNlO1xuICB2YXIgd2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9IGZhbHNlO1xuXG4gIHZhciBjYW1lbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoaHlwaGVuUGF0dGVybiwgZnVuY3Rpb24gKF8sIGNoYXJhY3Rlcikge1xuICAgICAgcmV0dXJuIGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JywgbmFtZSwgLy8gQXMgQW5kaSBTbWl0aCBzdWdnZXN0c1xuICAgIC8vIChodHRwOi8vd3d3LmFuZGlzbWl0aC5jb20vYmxvZy8yMDEyLzAyL21vZGVybml6ci1wcmVmaXhlZC8pLCBhbiBgLW1zYCBwcmVmaXhcbiAgICAvLyBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGBtc2AuXG4gICAgY2FtZWxpemUobmFtZS5yZXBsYWNlKG1zUGF0dGVybiQxLCAnbXMtJykpKTtcbiAgfTtcblxuICB2YXIgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgdmVuZG9yLXByZWZpeGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JywgbmFtZSwgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSkpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSA9IHRydWU7XG5cbiAgICBlcnJvcihcIlN0eWxlIHByb3BlcnR5IHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvbi4gXCIgKyAnVHJ5IFwiJXM6ICVzXCIgaW5zdGVhZC4nLCBuYW1lLCB2YWx1ZS5yZXBsYWNlKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiwgJycpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc05hTiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRGb3JOYU5WYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvck5hTlZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgTmFOYCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJywgbmFtZSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRGb3JJbmZpbml0eVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9IHRydWU7XG5cbiAgICBlcnJvcignYEluZmluaXR5YCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJywgbmFtZSk7XG4gIH07XG5cbiAgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAobmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24obmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIHdhcm5TdHlsZVZhbHVlSXNOYU4obmFtZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICghaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eShuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUkMSA9IHdhcm5WYWxpZFN0eWxlO1xuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBDU1MgcHJvcGVydGllcy5cbiAqL1xuXG4vKipcbiAqIFRoaXMgY3JlYXRlcyBhIHN0cmluZyB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlIHN0eWxlXG4gKiBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGJ5IHNlcnZlci1zaWRlIHJlbmRlcmluZy4gSXQgYnktcGFzc2VzIHdhcm5pbmdzIGFuZFxuICogc2VjdXJpdHkgY2hlY2tzIHNvIGl0J3Mgbm90IHNhZmUgdG8gdXNlIHRoaXMgdmFsdWUgZm9yIGFueXRoaW5nIG90aGVyIHRoYW5cbiAqIGNvbXBhcmlzb24uIEl0IGlzIG9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURhbmdlcm91c1N0cmluZ0ZvclN0eWxlcyhzdHlsZXMpIHtcbiAge1xuICAgIHZhciBzZXJpYWxpemVkID0gJyc7XG4gICAgdmFyIGRlbGltaXRlciA9ICcnO1xuXG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0eWxlVmFsdWUgPSBzdHlsZXNbc3R5bGVOYW1lXTtcblxuICAgICAgaWYgKHN0eWxlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRlbGltaXRlciArIChpc0N1c3RvbVByb3BlcnR5ID8gc3R5bGVOYW1lIDogaHlwaGVuYXRlU3R5bGVOYW1lKHN0eWxlTmFtZSkpICsgJzonO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KTtcbiAgICAgICAgZGVsaW1pdGVyID0gJzsnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkIHx8IG51bGw7XG4gIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgZm9yIG11bHRpcGxlIHN0eWxlcyBvbiBhIG5vZGUuICBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBhc1xuICogJycgKGVtcHR5IHN0cmluZyksIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IHdpbGwgYmUgdW5zZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gc3R5bGVzXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JTdHlsZXMobm9kZSwgc3R5bGVzKSB7XG4gIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7XG5cbiAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG5cbiAgICB7XG4gICAgICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgICAgd2FyblZhbGlkU3R5bGUkMShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG5cbiAgICBpZiAoc3R5bGVOYW1lID09PSAnZmxvYXQnKSB7XG4gICAgICBzdHlsZU5hbWUgPSAnY3NzRmxvYXQnO1xuICAgIH1cblxuICAgIGlmIChpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShzdHlsZU5hbWUsIHN0eWxlVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZVtzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNWYWx1ZUVtcHR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcbn1cbi8qKlxuICogR2l2ZW4ge2NvbG9yOiAncmVkJywgb3ZlcmZsb3c6ICdoaWRkZW4nfSByZXR1cm5zIHtcbiAqICAgY29sb3I6ICdjb2xvcicsXG4gKiAgIG92ZXJmbG93WDogJ292ZXJmbG93JyxcbiAqICAgb3ZlcmZsb3dZOiAnb3ZlcmZsb3cnLFxuICogfS4gVGhpcyBjYW4gYmUgcmVhZCBhcyBcInRoZSBvdmVyZmxvd1kgcHJvcGVydHkgd2FzIHNldCBieSB0aGUgb3ZlcmZsb3dcbiAqIHNob3J0aGFuZFwiLiBUaGF0IGlzLCB0aGUgdmFsdWVzIGFyZSB0aGUgcHJvcGVydHkgdGhhdCBlYWNoIHdhcyBkZXJpdmVkIGZyb20uXG4gKi9cblxuXG5mdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVzKSB7XG4gIHZhciBleHBhbmRlZCA9IHt9O1xuXG4gIGZvciAodmFyIGtleSBpbiBzdHlsZXMpIHtcbiAgICB2YXIgbG9uZ2hhbmRzID0gc2hvcnRoYW5kVG9Mb25naGFuZFtrZXldIHx8IFtrZXldO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25naGFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4cGFuZGVkW2xvbmdoYW5kc1tpXV0gPSBrZXk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4cGFuZGVkO1xufVxuLyoqXG4gKiBXaGVuIG1peGluZyBzaG9ydGhhbmQgYW5kIGxvbmdoYW5kIHByb3BlcnR5IG5hbWVzLCB3ZSB3YXJuIGR1cmluZyB1cGRhdGVzIGlmXG4gKiB3ZSBleHBlY3QgYW4gaW5jb3JyZWN0IHJlc3VsdCB0byBvY2N1ci4gSW4gcGFydGljdWxhciwgd2Ugd2FybiBmb3I6XG4gKlxuICogVXBkYXRpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgb3ZlcndyaXR0ZW4pOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnQ6ICdiYXonLCBmb250VmFyaWFudDogJ2Jhcid9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnQgPSAnYmF6J1xuICogUmVtb3ZpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgbG9zdCB0b28pOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICcnXG4gKiBSZW1vdmluZyBhIGxvbmdoYW5kIHByb3BlcnR5IChzaG91bGQgcmV2ZXJ0IHRvIHNob3J0aGFuZDsgZG9lc24ndCk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2Zvbyd9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnRWYXJpYW50ID0gJydcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlU2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb25JbkRldihzdHlsZVVwZGF0ZXMsIG5leHRTdHlsZXMpIHtcbiAge1xuICAgIGlmICghbmV4dFN0eWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBleHBhbmRlZFVwZGF0ZXMgPSBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVVcGRhdGVzKTtcbiAgICB2YXIgZXhwYW5kZWRTdHlsZXMgPSBleHBhbmRTaG9ydGhhbmRNYXAobmV4dFN0eWxlcyk7XG4gICAgdmFyIHdhcm5lZEFib3V0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gZXhwYW5kZWRVcGRhdGVzKSB7XG4gICAgICB2YXIgb3JpZ2luYWxLZXkgPSBleHBhbmRlZFVwZGF0ZXNba2V5XTtcbiAgICAgIHZhciBjb3JyZWN0T3JpZ2luYWxLZXkgPSBleHBhbmRlZFN0eWxlc1trZXldO1xuXG4gICAgICBpZiAoY29ycmVjdE9yaWdpbmFsS2V5ICYmIG9yaWdpbmFsS2V5ICE9PSBjb3JyZWN0T3JpZ2luYWxLZXkpIHtcbiAgICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvcmlnaW5hbEtleSArICcsJyArIGNvcnJlY3RPcmlnaW5hbEtleTtcblxuICAgICAgICBpZiAod2FybmVkQWJvdXRbd2FybmluZ0tleV0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdhcm5lZEFib3V0W3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXMgYSBzdHlsZSBwcm9wZXJ0eSBkdXJpbmcgcmVyZW5kZXIgKCVzKSB3aGVuIGEgJyArICdjb25mbGljdGluZyBwcm9wZXJ0eSBpcyBzZXQgKCVzKSBjYW4gbGVhZCB0byBzdHlsaW5nIGJ1Z3MuIFRvICcgKyBcImF2b2lkIHRoaXMsIGRvbid0IG1peCBzaG9ydGhhbmQgYW5kIG5vbi1zaG9ydGhhbmQgcHJvcGVydGllcyBcIiArICdmb3IgdGhlIHNhbWUgdmFsdWU7IGluc3RlYWQsIHJlcGxhY2UgdGhlIHNob3J0aGFuZCB3aXRoICcgKyAnc2VwYXJhdGUgdmFsdWVzLicsIGlzVmFsdWVFbXB0eShzdHlsZVVwZGF0ZXNbb3JpZ2luYWxLZXldKSA/ICdSZW1vdmluZycgOiAnVXBkYXRpbmcnLCBvcmlnaW5hbEtleSwgY29ycmVjdE9yaWdpbmFsS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBzaG91bGQgb21pdCB0aGVpciBjbG9zZSB0YWcuIFdlIGtlZXAgYSBsaXN0IGZvclxuLy8gdGhvc2Ugc3BlY2lhbC1jYXNlIHRhZ3MuXG52YXIgb21pdHRlZENsb3NlVGFncyA9IHtcbiAgYXJlYTogdHJ1ZSxcbiAgYmFzZTogdHJ1ZSxcbiAgYnI6IHRydWUsXG4gIGNvbDogdHJ1ZSxcbiAgZW1iZWQ6IHRydWUsXG4gIGhyOiB0cnVlLFxuICBpbWc6IHRydWUsXG4gIGlucHV0OiB0cnVlLFxuICBrZXlnZW46IHRydWUsXG4gIGxpbms6IHRydWUsXG4gIG1ldGE6IHRydWUsXG4gIHBhcmFtOiB0cnVlLFxuICBzb3VyY2U6IHRydWUsXG4gIHRyYWNrOiB0cnVlLFxuICB3YnI6IHRydWUgLy8gTk9URTogbWVudWl0ZW0ncyBjbG9zZSB0YWcgc2hvdWxkIGJlIG9taXR0ZWQsIGJ1dCB0aGF0IGNhdXNlcyBwcm9ibGVtcy5cblxufTtcblxuLy8gYG9taXR0ZWRDbG9zZVRhZ3NgIGV4Y2VwdCB0aGF0IGBtZW51aXRlbWAgc2hvdWxkIHN0aWxsIGhhdmUgaXRzIGNsb3NpbmcgdGFnLlxuXG52YXIgdm9pZEVsZW1lbnRUYWdzID0gYXNzaWduKHtcbiAgbWVudWl0ZW06IHRydWVcbn0sIG9taXR0ZWRDbG9zZVRhZ3MpO1xuXG52YXIgSFRNTCA9ICdfX2h0bWwnO1xuXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfSAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXG5cbiAgaWYgKHZvaWRFbGVtZW50VGFnc1t0YWddKSB7XG4gICAgaWYgKHByb3BzLmNoaWxkcmVuICE9IG51bGwgfHwgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRhZyArIFwiIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgXCIgKyAndXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICBpZiAocHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBzZXQgb25lIG9mIGBjaGlsZHJlbmAgb3IgYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSAnb2JqZWN0JyB8fCAhKEhUTUwgaW4gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuICcgKyAnUGxlYXNlIHZpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kYW5nZXJvdXNseS1zZXQtaW5uZXItaHRtbCAnICsgJ2ZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoIXByb3BzLnN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyAmJiBwcm9wcy5jb250ZW50RWRpdGFibGUgJiYgcHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGBjb250ZW50RWRpdGFibGVgIGFuZCBjb250YWlucyBgY2hpbGRyZW5gIG1hbmFnZWQgYnkgJyArICdSZWFjdC4gSXQgaXMgbm93IHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZ3VhcmFudGVlIHRoYXQgbm9uZSBvZiAnICsgJ3Rob3NlIG5vZGVzIGFyZSB1bmV4cGVjdGVkbHkgbW9kaWZpZWQgb3IgZHVwbGljYXRlZC4gVGhpcyBpcyAnICsgJ3Byb2JhYmx5IG5vdCBpbnRlbnRpb25hbC4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMuc3R5bGUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcHMuc3R5bGUgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHN0eWxlYCBwcm9wIGV4cGVjdHMgYSBtYXBwaW5nIGZyb20gc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMsICcgKyBcIm5vdCBhIHN0cmluZy4gRm9yIGV4YW1wbGUsIHN0eWxlPXt7bWFyZ2luUmlnaHQ6IHNwYWNpbmcgKyAnZW0nfX0gd2hlbiBcIiArICd1c2luZyBKU1guJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDdXN0b21Db21wb25lbnQodGFnTmFtZSwgcHJvcHMpIHtcbiAgaWYgKHRhZ05hbWUuaW5kZXhPZignLScpID09PSAtMSkge1xuICAgIHJldHVybiB0eXBlb2YgcHJvcHMuaXMgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgLy8gVGhlc2UgYXJlIHJlc2VydmVkIFNWRyBhbmQgTWF0aE1MIGVsZW1lbnRzLlxuICAgIC8vIFdlIGRvbid0IG1pbmQgdGhpcyBsaXN0IHRvbyBtdWNoIGJlY2F1c2Ugd2UgZXhwZWN0IGl0IHRvIG5ldmVyIGdyb3cuXG4gICAgLy8gVGhlIGFsdGVybmF0aXZlIGlzIHRvIHRyYWNrIHRoZSBuYW1lc3BhY2UgaW4gYSBmZXcgcGxhY2VzIHdoaWNoIGlzIGNvbnZvbHV0ZWQuXG4gICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9jdXN0b20vI2N1c3RvbS1lbGVtZW50cy1jb3JlLWNvbmNlcHRzXG4gICAgY2FzZSAnYW5ub3RhdGlvbi14bWwnOlxuICAgIGNhc2UgJ2NvbG9yLXByb2ZpbGUnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlLXNyYyc6XG4gICAgY2FzZSAnZm9udC1mYWNlLXVyaSc6XG4gICAgY2FzZSAnZm9udC1mYWNlLWZvcm1hdCc6XG4gICAgY2FzZSAnZm9udC1mYWNlLW5hbWUnOlxuICAgIGNhc2UgJ21pc3NpbmctZ2x5cGgnOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8vIFdoZW4gYWRkaW5nIGF0dHJpYnV0ZXMgdG8gdGhlIEhUTUwgb3IgU1ZHIGFsbG93ZWQgYXR0cmlidXRlIGxpc3QsIGJlIHN1cmUgdG9cbi8vIGFsc28gYWRkIHRoZW0gdG8gdGhpcyBtb2R1bGUgdG8gZW5zdXJlIGNhc2luZyBhbmQgaW5jb3JyZWN0IG5hbWVcbi8vIHdhcm5pbmdzLlxudmFyIHBvc3NpYmxlU3RhbmRhcmROYW1lcyA9IHtcbiAgLy8gSFRNTFxuICBhY2NlcHQ6ICdhY2NlcHQnLFxuICBhY2NlcHRjaGFyc2V0OiAnYWNjZXB0Q2hhcnNldCcsXG4gICdhY2NlcHQtY2hhcnNldCc6ICdhY2NlcHRDaGFyc2V0JyxcbiAgYWNjZXNza2V5OiAnYWNjZXNzS2V5JyxcbiAgYWN0aW9uOiAnYWN0aW9uJyxcbiAgYWxsb3dmdWxsc2NyZWVuOiAnYWxsb3dGdWxsU2NyZWVuJyxcbiAgYWx0OiAnYWx0JyxcbiAgYXM6ICdhcycsXG4gIGFzeW5jOiAnYXN5bmMnLFxuICBhdXRvY2FwaXRhbGl6ZTogJ2F1dG9DYXBpdGFsaXplJyxcbiAgYXV0b2NvbXBsZXRlOiAnYXV0b0NvbXBsZXRlJyxcbiAgYXV0b2NvcnJlY3Q6ICdhdXRvQ29ycmVjdCcsXG4gIGF1dG9mb2N1czogJ2F1dG9Gb2N1cycsXG4gIGF1dG9wbGF5OiAnYXV0b1BsYXknLFxuICBhdXRvc2F2ZTogJ2F1dG9TYXZlJyxcbiAgY2FwdHVyZTogJ2NhcHR1cmUnLFxuICBjZWxscGFkZGluZzogJ2NlbGxQYWRkaW5nJyxcbiAgY2VsbHNwYWNpbmc6ICdjZWxsU3BhY2luZycsXG4gIGNoYWxsZW5nZTogJ2NoYWxsZW5nZScsXG4gIGNoYXJzZXQ6ICdjaGFyU2V0JyxcbiAgY2hlY2tlZDogJ2NoZWNrZWQnLFxuICBjaGlsZHJlbjogJ2NoaWxkcmVuJyxcbiAgY2l0ZTogJ2NpdGUnLFxuICBjbGFzczogJ2NsYXNzTmFtZScsXG4gIGNsYXNzaWQ6ICdjbGFzc0lEJyxcbiAgY2xhc3NuYW1lOiAnY2xhc3NOYW1lJyxcbiAgY29sczogJ2NvbHMnLFxuICBjb2xzcGFuOiAnY29sU3BhbicsXG4gIGNvbnRlbnQ6ICdjb250ZW50JyxcbiAgY29udGVudGVkaXRhYmxlOiAnY29udGVudEVkaXRhYmxlJyxcbiAgY29udGV4dG1lbnU6ICdjb250ZXh0TWVudScsXG4gIGNvbnRyb2xzOiAnY29udHJvbHMnLFxuICBjb250cm9sc2xpc3Q6ICdjb250cm9sc0xpc3QnLFxuICBjb29yZHM6ICdjb29yZHMnLFxuICBjcm9zc29yaWdpbjogJ2Nyb3NzT3JpZ2luJyxcbiAgZGFuZ2Vyb3VzbHlzZXRpbm5lcmh0bWw6ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcsXG4gIGRhdGE6ICdkYXRhJyxcbiAgZGF0ZXRpbWU6ICdkYXRlVGltZScsXG4gIGRlZmF1bHQ6ICdkZWZhdWx0JyxcbiAgZGVmYXVsdGNoZWNrZWQ6ICdkZWZhdWx0Q2hlY2tlZCcsXG4gIGRlZmF1bHR2YWx1ZTogJ2RlZmF1bHRWYWx1ZScsXG4gIGRlZmVyOiAnZGVmZXInLFxuICBkaXI6ICdkaXInLFxuICBkaXNhYmxlZDogJ2Rpc2FibGVkJyxcbiAgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmU6ICdkaXNhYmxlUGljdHVyZUluUGljdHVyZScsXG4gIGRpc2FibGVyZW1vdGVwbGF5YmFjazogJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsXG4gIGRvd25sb2FkOiAnZG93bmxvYWQnLFxuICBkcmFnZ2FibGU6ICdkcmFnZ2FibGUnLFxuICBlbmN0eXBlOiAnZW5jVHlwZScsXG4gIGVudGVya2V5aGludDogJ2VudGVyS2V5SGludCcsXG4gIGZvcjogJ2h0bWxGb3InLFxuICBmb3JtOiAnZm9ybScsXG4gIGZvcm1tZXRob2Q6ICdmb3JtTWV0aG9kJyxcbiAgZm9ybWFjdGlvbjogJ2Zvcm1BY3Rpb24nLFxuICBmb3JtZW5jdHlwZTogJ2Zvcm1FbmNUeXBlJyxcbiAgZm9ybW5vdmFsaWRhdGU6ICdmb3JtTm9WYWxpZGF0ZScsXG4gIGZvcm10YXJnZXQ6ICdmb3JtVGFyZ2V0JyxcbiAgZnJhbWVib3JkZXI6ICdmcmFtZUJvcmRlcicsXG4gIGhlYWRlcnM6ICdoZWFkZXJzJyxcbiAgaGVpZ2h0OiAnaGVpZ2h0JyxcbiAgaGlkZGVuOiAnaGlkZGVuJyxcbiAgaGlnaDogJ2hpZ2gnLFxuICBocmVmOiAnaHJlZicsXG4gIGhyZWZsYW5nOiAnaHJlZkxhbmcnLFxuICBodG1sZm9yOiAnaHRtbEZvcicsXG4gIGh0dHBlcXVpdjogJ2h0dHBFcXVpdicsXG4gICdodHRwLWVxdWl2JzogJ2h0dHBFcXVpdicsXG4gIGljb246ICdpY29uJyxcbiAgaWQ6ICdpZCcsXG4gIGltYWdlc2l6ZXM6ICdpbWFnZVNpemVzJyxcbiAgaW1hZ2VzcmNzZXQ6ICdpbWFnZVNyY1NldCcsXG4gIGlubmVyaHRtbDogJ2lubmVySFRNTCcsXG4gIGlucHV0bW9kZTogJ2lucHV0TW9kZScsXG4gIGludGVncml0eTogJ2ludGVncml0eScsXG4gIGlzOiAnaXMnLFxuICBpdGVtaWQ6ICdpdGVtSUQnLFxuICBpdGVtcHJvcDogJ2l0ZW1Qcm9wJyxcbiAgaXRlbXJlZjogJ2l0ZW1SZWYnLFxuICBpdGVtc2NvcGU6ICdpdGVtU2NvcGUnLFxuICBpdGVtdHlwZTogJ2l0ZW1UeXBlJyxcbiAga2V5cGFyYW1zOiAna2V5UGFyYW1zJyxcbiAga2V5dHlwZTogJ2tleVR5cGUnLFxuICBraW5kOiAna2luZCcsXG4gIGxhYmVsOiAnbGFiZWwnLFxuICBsYW5nOiAnbGFuZycsXG4gIGxpc3Q6ICdsaXN0JyxcbiAgbG9vcDogJ2xvb3AnLFxuICBsb3c6ICdsb3cnLFxuICBtYW5pZmVzdDogJ21hbmlmZXN0JyxcbiAgbWFyZ2lud2lkdGg6ICdtYXJnaW5XaWR0aCcsXG4gIG1hcmdpbmhlaWdodDogJ21hcmdpbkhlaWdodCcsXG4gIG1heDogJ21heCcsXG4gIG1heGxlbmd0aDogJ21heExlbmd0aCcsXG4gIG1lZGlhOiAnbWVkaWEnLFxuICBtZWRpYWdyb3VwOiAnbWVkaWFHcm91cCcsXG4gIG1ldGhvZDogJ21ldGhvZCcsXG4gIG1pbjogJ21pbicsXG4gIG1pbmxlbmd0aDogJ21pbkxlbmd0aCcsXG4gIG11bHRpcGxlOiAnbXVsdGlwbGUnLFxuICBtdXRlZDogJ211dGVkJyxcbiAgbmFtZTogJ25hbWUnLFxuICBub21vZHVsZTogJ25vTW9kdWxlJyxcbiAgbm9uY2U6ICdub25jZScsXG4gIG5vdmFsaWRhdGU6ICdub1ZhbGlkYXRlJyxcbiAgb3BlbjogJ29wZW4nLFxuICBvcHRpbXVtOiAnb3B0aW11bScsXG4gIHBhdHRlcm46ICdwYXR0ZXJuJyxcbiAgcGxhY2Vob2xkZXI6ICdwbGFjZWhvbGRlcicsXG4gIHBsYXlzaW5saW5lOiAncGxheXNJbmxpbmUnLFxuICBwb3N0ZXI6ICdwb3N0ZXInLFxuICBwcmVsb2FkOiAncHJlbG9hZCcsXG4gIHByb2ZpbGU6ICdwcm9maWxlJyxcbiAgcmFkaW9ncm91cDogJ3JhZGlvR3JvdXAnLFxuICByZWFkb25seTogJ3JlYWRPbmx5JyxcbiAgcmVmZXJyZXJwb2xpY3k6ICdyZWZlcnJlclBvbGljeScsXG4gIHJlbDogJ3JlbCcsXG4gIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICByZXZlcnNlZDogJ3JldmVyc2VkJyxcbiAgcm9sZTogJ3JvbGUnLFxuICByb3dzOiAncm93cycsXG4gIHJvd3NwYW46ICdyb3dTcGFuJyxcbiAgc2FuZGJveDogJ3NhbmRib3gnLFxuICBzY29wZTogJ3Njb3BlJyxcbiAgc2NvcGVkOiAnc2NvcGVkJyxcbiAgc2Nyb2xsaW5nOiAnc2Nyb2xsaW5nJyxcbiAgc2VhbWxlc3M6ICdzZWFtbGVzcycsXG4gIHNlbGVjdGVkOiAnc2VsZWN0ZWQnLFxuICBzaGFwZTogJ3NoYXBlJyxcbiAgc2l6ZTogJ3NpemUnLFxuICBzaXplczogJ3NpemVzJyxcbiAgc3BhbjogJ3NwYW4nLFxuICBzcGVsbGNoZWNrOiAnc3BlbGxDaGVjaycsXG4gIHNyYzogJ3NyYycsXG4gIHNyY2RvYzogJ3NyY0RvYycsXG4gIHNyY2xhbmc6ICdzcmNMYW5nJyxcbiAgc3Jjc2V0OiAnc3JjU2V0JyxcbiAgc3RhcnQ6ICdzdGFydCcsXG4gIHN0ZXA6ICdzdGVwJyxcbiAgc3R5bGU6ICdzdHlsZScsXG4gIHN1bW1hcnk6ICdzdW1tYXJ5JyxcbiAgdGFiaW5kZXg6ICd0YWJJbmRleCcsXG4gIHRhcmdldDogJ3RhcmdldCcsXG4gIHRpdGxlOiAndGl0bGUnLFxuICB0eXBlOiAndHlwZScsXG4gIHVzZW1hcDogJ3VzZU1hcCcsXG4gIHZhbHVlOiAndmFsdWUnLFxuICB3aWR0aDogJ3dpZHRoJyxcbiAgd21vZGU6ICd3bW9kZScsXG4gIHdyYXA6ICd3cmFwJyxcbiAgLy8gU1ZHXG4gIGFib3V0OiAnYWJvdXQnLFxuICBhY2NlbnRoZWlnaHQ6ICdhY2NlbnRIZWlnaHQnLFxuICAnYWNjZW50LWhlaWdodCc6ICdhY2NlbnRIZWlnaHQnLFxuICBhY2N1bXVsYXRlOiAnYWNjdW11bGF0ZScsXG4gIGFkZGl0aXZlOiAnYWRkaXRpdmUnLFxuICBhbGlnbm1lbnRiYXNlbGluZTogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgJ2FsaWdubWVudC1iYXNlbGluZSc6ICdhbGlnbm1lbnRCYXNlbGluZScsXG4gIGFsbG93cmVvcmRlcjogJ2FsbG93UmVvcmRlcicsXG4gIGFscGhhYmV0aWM6ICdhbHBoYWJldGljJyxcbiAgYW1wbGl0dWRlOiAnYW1wbGl0dWRlJyxcbiAgYXJhYmljZm9ybTogJ2FyYWJpY0Zvcm0nLFxuICAnYXJhYmljLWZvcm0nOiAnYXJhYmljRm9ybScsXG4gIGFzY2VudDogJ2FzY2VudCcsXG4gIGF0dHJpYnV0ZW5hbWU6ICdhdHRyaWJ1dGVOYW1lJyxcbiAgYXR0cmlidXRldHlwZTogJ2F0dHJpYnV0ZVR5cGUnLFxuICBhdXRvcmV2ZXJzZTogJ2F1dG9SZXZlcnNlJyxcbiAgYXppbXV0aDogJ2F6aW11dGgnLFxuICBiYXNlZnJlcXVlbmN5OiAnYmFzZUZyZXF1ZW5jeScsXG4gIGJhc2VsaW5lc2hpZnQ6ICdiYXNlbGluZVNoaWZ0JyxcbiAgJ2Jhc2VsaW5lLXNoaWZ0JzogJ2Jhc2VsaW5lU2hpZnQnLFxuICBiYXNlcHJvZmlsZTogJ2Jhc2VQcm9maWxlJyxcbiAgYmJveDogJ2Jib3gnLFxuICBiZWdpbjogJ2JlZ2luJyxcbiAgYmlhczogJ2JpYXMnLFxuICBieTogJ2J5JyxcbiAgY2FsY21vZGU6ICdjYWxjTW9kZScsXG4gIGNhcGhlaWdodDogJ2NhcEhlaWdodCcsXG4gICdjYXAtaGVpZ2h0JzogJ2NhcEhlaWdodCcsXG4gIGNsaXA6ICdjbGlwJyxcbiAgY2xpcHBhdGg6ICdjbGlwUGF0aCcsXG4gICdjbGlwLXBhdGgnOiAnY2xpcFBhdGgnLFxuICBjbGlwcGF0aHVuaXRzOiAnY2xpcFBhdGhVbml0cycsXG4gIGNsaXBydWxlOiAnY2xpcFJ1bGUnLFxuICAnY2xpcC1ydWxlJzogJ2NsaXBSdWxlJyxcbiAgY29sb3I6ICdjb2xvcicsXG4gIGNvbG9yaW50ZXJwb2xhdGlvbjogJ2NvbG9ySW50ZXJwb2xhdGlvbicsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uJzogJ2NvbG9ySW50ZXJwb2xhdGlvbicsXG4gIGNvbG9yaW50ZXJwb2xhdGlvbmZpbHRlcnM6ICdjb2xvckludGVycG9sYXRpb25GaWx0ZXJzJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyc6ICdjb2xvckludGVycG9sYXRpb25GaWx0ZXJzJyxcbiAgY29sb3Jwcm9maWxlOiAnY29sb3JQcm9maWxlJyxcbiAgJ2NvbG9yLXByb2ZpbGUnOiAnY29sb3JQcm9maWxlJyxcbiAgY29sb3JyZW5kZXJpbmc6ICdjb2xvclJlbmRlcmluZycsXG4gICdjb2xvci1yZW5kZXJpbmcnOiAnY29sb3JSZW5kZXJpbmcnLFxuICBjb250ZW50c2NyaXB0dHlwZTogJ2NvbnRlbnRTY3JpcHRUeXBlJyxcbiAgY29udGVudHN0eWxldHlwZTogJ2NvbnRlbnRTdHlsZVR5cGUnLFxuICBjdXJzb3I6ICdjdXJzb3InLFxuICBjeDogJ2N4JyxcbiAgY3k6ICdjeScsXG4gIGQ6ICdkJyxcbiAgZGF0YXR5cGU6ICdkYXRhdHlwZScsXG4gIGRlY2VsZXJhdGU6ICdkZWNlbGVyYXRlJyxcbiAgZGVzY2VudDogJ2Rlc2NlbnQnLFxuICBkaWZmdXNlY29uc3RhbnQ6ICdkaWZmdXNlQ29uc3RhbnQnLFxuICBkaXJlY3Rpb246ICdkaXJlY3Rpb24nLFxuICBkaXNwbGF5OiAnZGlzcGxheScsXG4gIGRpdmlzb3I6ICdkaXZpc29yJyxcbiAgZG9taW5hbnRiYXNlbGluZTogJ2RvbWluYW50QmFzZWxpbmUnLFxuICAnZG9taW5hbnQtYmFzZWxpbmUnOiAnZG9taW5hbnRCYXNlbGluZScsXG4gIGR1cjogJ2R1cicsXG4gIGR4OiAnZHgnLFxuICBkeTogJ2R5JyxcbiAgZWRnZW1vZGU6ICdlZGdlTW9kZScsXG4gIGVsZXZhdGlvbjogJ2VsZXZhdGlvbicsXG4gIGVuYWJsZWJhY2tncm91bmQ6ICdlbmFibGVCYWNrZ3JvdW5kJyxcbiAgJ2VuYWJsZS1iYWNrZ3JvdW5kJzogJ2VuYWJsZUJhY2tncm91bmQnLFxuICBlbmQ6ICdlbmQnLFxuICBleHBvbmVudDogJ2V4cG9uZW50JyxcbiAgZXh0ZXJuYWxyZXNvdXJjZXNyZXF1aXJlZDogJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICBmaWxsOiAnZmlsbCcsXG4gIGZpbGxvcGFjaXR5OiAnZmlsbE9wYWNpdHknLFxuICAnZmlsbC1vcGFjaXR5JzogJ2ZpbGxPcGFjaXR5JyxcbiAgZmlsbHJ1bGU6ICdmaWxsUnVsZScsXG4gICdmaWxsLXJ1bGUnOiAnZmlsbFJ1bGUnLFxuICBmaWx0ZXI6ICdmaWx0ZXInLFxuICBmaWx0ZXJyZXM6ICdmaWx0ZXJSZXMnLFxuICBmaWx0ZXJ1bml0czogJ2ZpbHRlclVuaXRzJyxcbiAgZmxvb2RvcGFjaXR5OiAnZmxvb2RPcGFjaXR5JyxcbiAgJ2Zsb29kLW9wYWNpdHknOiAnZmxvb2RPcGFjaXR5JyxcbiAgZmxvb2Rjb2xvcjogJ2Zsb29kQ29sb3InLFxuICAnZmxvb2QtY29sb3InOiAnZmxvb2RDb2xvcicsXG4gIGZvY3VzYWJsZTogJ2ZvY3VzYWJsZScsXG4gIGZvbnRmYW1pbHk6ICdmb250RmFtaWx5JyxcbiAgJ2ZvbnQtZmFtaWx5JzogJ2ZvbnRGYW1pbHknLFxuICBmb250c2l6ZTogJ2ZvbnRTaXplJyxcbiAgJ2ZvbnQtc2l6ZSc6ICdmb250U2l6ZScsXG4gIGZvbnRzaXplYWRqdXN0OiAnZm9udFNpemVBZGp1c3QnLFxuICAnZm9udC1zaXplLWFkanVzdCc6ICdmb250U2l6ZUFkanVzdCcsXG4gIGZvbnRzdHJldGNoOiAnZm9udFN0cmV0Y2gnLFxuICAnZm9udC1zdHJldGNoJzogJ2ZvbnRTdHJldGNoJyxcbiAgZm9udHN0eWxlOiAnZm9udFN0eWxlJyxcbiAgJ2ZvbnQtc3R5bGUnOiAnZm9udFN0eWxlJyxcbiAgZm9udHZhcmlhbnQ6ICdmb250VmFyaWFudCcsXG4gICdmb250LXZhcmlhbnQnOiAnZm9udFZhcmlhbnQnLFxuICBmb250d2VpZ2h0OiAnZm9udFdlaWdodCcsXG4gICdmb250LXdlaWdodCc6ICdmb250V2VpZ2h0JyxcbiAgZm9ybWF0OiAnZm9ybWF0JyxcbiAgZnJvbTogJ2Zyb20nLFxuICBmeDogJ2Z4JyxcbiAgZnk6ICdmeScsXG4gIGcxOiAnZzEnLFxuICBnMjogJ2cyJyxcbiAgZ2x5cGhuYW1lOiAnZ2x5cGhOYW1lJyxcbiAgJ2dseXBoLW5hbWUnOiAnZ2x5cGhOYW1lJyxcbiAgZ2x5cGhvcmllbnRhdGlvbmhvcml6b250YWw6ICdnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCcsXG4gICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJzogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgZ2x5cGhvcmllbnRhdGlvbnZlcnRpY2FsOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJzogJ2dseXBoT3JpZW50YXRpb25WZXJ0aWNhbCcsXG4gIGdseXBocmVmOiAnZ2x5cGhSZWYnLFxuICBncmFkaWVudHRyYW5zZm9ybTogJ2dyYWRpZW50VHJhbnNmb3JtJyxcbiAgZ3JhZGllbnR1bml0czogJ2dyYWRpZW50VW5pdHMnLFxuICBoYW5naW5nOiAnaGFuZ2luZycsXG4gIGhvcml6YWR2eDogJ2hvcml6QWR2WCcsXG4gICdob3Jpei1hZHYteCc6ICdob3JpekFkdlgnLFxuICBob3Jpem9yaWdpbng6ICdob3Jpek9yaWdpblgnLFxuICAnaG9yaXotb3JpZ2luLXgnOiAnaG9yaXpPcmlnaW5YJyxcbiAgaWRlb2dyYXBoaWM6ICdpZGVvZ3JhcGhpYycsXG4gIGltYWdlcmVuZGVyaW5nOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICAnaW1hZ2UtcmVuZGVyaW5nJzogJ2ltYWdlUmVuZGVyaW5nJyxcbiAgaW4yOiAnaW4yJyxcbiAgaW46ICdpbicsXG4gIGlubGlzdDogJ2lubGlzdCcsXG4gIGludGVyY2VwdDogJ2ludGVyY2VwdCcsXG4gIGsxOiAnazEnLFxuICBrMjogJ2syJyxcbiAgazM6ICdrMycsXG4gIGs0OiAnazQnLFxuICBrOiAnaycsXG4gIGtlcm5lbG1hdHJpeDogJ2tlcm5lbE1hdHJpeCcsXG4gIGtlcm5lbHVuaXRsZW5ndGg6ICdrZXJuZWxVbml0TGVuZ3RoJyxcbiAga2VybmluZzogJ2tlcm5pbmcnLFxuICBrZXlwb2ludHM6ICdrZXlQb2ludHMnLFxuICBrZXlzcGxpbmVzOiAna2V5U3BsaW5lcycsXG4gIGtleXRpbWVzOiAna2V5VGltZXMnLFxuICBsZW5ndGhhZGp1c3Q6ICdsZW5ndGhBZGp1c3QnLFxuICBsZXR0ZXJzcGFjaW5nOiAnbGV0dGVyU3BhY2luZycsXG4gICdsZXR0ZXItc3BhY2luZyc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgbGlnaHRpbmdjb2xvcjogJ2xpZ2h0aW5nQ29sb3InLFxuICAnbGlnaHRpbmctY29sb3InOiAnbGlnaHRpbmdDb2xvcicsXG4gIGxpbWl0aW5nY29uZWFuZ2xlOiAnbGltaXRpbmdDb25lQW5nbGUnLFxuICBsb2NhbDogJ2xvY2FsJyxcbiAgbWFya2VyZW5kOiAnbWFya2VyRW5kJyxcbiAgJ21hcmtlci1lbmQnOiAnbWFya2VyRW5kJyxcbiAgbWFya2VyaGVpZ2h0OiAnbWFya2VySGVpZ2h0JyxcbiAgbWFya2VybWlkOiAnbWFya2VyTWlkJyxcbiAgJ21hcmtlci1taWQnOiAnbWFya2VyTWlkJyxcbiAgbWFya2Vyc3RhcnQ6ICdtYXJrZXJTdGFydCcsXG4gICdtYXJrZXItc3RhcnQnOiAnbWFya2VyU3RhcnQnLFxuICBtYXJrZXJ1bml0czogJ21hcmtlclVuaXRzJyxcbiAgbWFya2Vyd2lkdGg6ICdtYXJrZXJXaWR0aCcsXG4gIG1hc2s6ICdtYXNrJyxcbiAgbWFza2NvbnRlbnR1bml0czogJ21hc2tDb250ZW50VW5pdHMnLFxuICBtYXNrdW5pdHM6ICdtYXNrVW5pdHMnLFxuICBtYXRoZW1hdGljYWw6ICdtYXRoZW1hdGljYWwnLFxuICBtb2RlOiAnbW9kZScsXG4gIG51bW9jdGF2ZXM6ICdudW1PY3RhdmVzJyxcbiAgb2Zmc2V0OiAnb2Zmc2V0JyxcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBvcGVyYXRvcjogJ29wZXJhdG9yJyxcbiAgb3JkZXI6ICdvcmRlcicsXG4gIG9yaWVudDogJ29yaWVudCcsXG4gIG9yaWVudGF0aW9uOiAnb3JpZW50YXRpb24nLFxuICBvcmlnaW46ICdvcmlnaW4nLFxuICBvdmVyZmxvdzogJ292ZXJmbG93JyxcbiAgb3ZlcmxpbmVwb3NpdGlvbjogJ292ZXJsaW5lUG9zaXRpb24nLFxuICAnb3ZlcmxpbmUtcG9zaXRpb24nOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gIG92ZXJsaW5ldGhpY2tuZXNzOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICAnb3ZlcmxpbmUtdGhpY2tuZXNzJzogJ292ZXJsaW5lVGhpY2tuZXNzJyxcbiAgcGFpbnRvcmRlcjogJ3BhaW50T3JkZXInLFxuICAncGFpbnQtb3JkZXInOiAncGFpbnRPcmRlcicsXG4gIHBhbm9zZTE6ICdwYW5vc2UxJyxcbiAgJ3Bhbm9zZS0xJzogJ3Bhbm9zZTEnLFxuICBwYXRobGVuZ3RoOiAncGF0aExlbmd0aCcsXG4gIHBhdHRlcm5jb250ZW50dW5pdHM6ICdwYXR0ZXJuQ29udGVudFVuaXRzJyxcbiAgcGF0dGVybnRyYW5zZm9ybTogJ3BhdHRlcm5UcmFuc2Zvcm0nLFxuICBwYXR0ZXJudW5pdHM6ICdwYXR0ZXJuVW5pdHMnLFxuICBwb2ludGVyZXZlbnRzOiAncG9pbnRlckV2ZW50cycsXG4gICdwb2ludGVyLWV2ZW50cyc6ICdwb2ludGVyRXZlbnRzJyxcbiAgcG9pbnRzOiAncG9pbnRzJyxcbiAgcG9pbnRzYXR4OiAncG9pbnRzQXRYJyxcbiAgcG9pbnRzYXR5OiAncG9pbnRzQXRZJyxcbiAgcG9pbnRzYXR6OiAncG9pbnRzQXRaJyxcbiAgcHJlZml4OiAncHJlZml4JyxcbiAgcHJlc2VydmVhbHBoYTogJ3ByZXNlcnZlQWxwaGEnLFxuICBwcmVzZXJ2ZWFzcGVjdHJhdGlvOiAncHJlc2VydmVBc3BlY3RSYXRpbycsXG4gIHByaW1pdGl2ZXVuaXRzOiAncHJpbWl0aXZlVW5pdHMnLFxuICBwcm9wZXJ0eTogJ3Byb3BlcnR5JyxcbiAgcjogJ3InLFxuICByYWRpdXM6ICdyYWRpdXMnLFxuICByZWZ4OiAncmVmWCcsXG4gIHJlZnk6ICdyZWZZJyxcbiAgcmVuZGVyaW5naW50ZW50OiAncmVuZGVyaW5nSW50ZW50JyxcbiAgJ3JlbmRlcmluZy1pbnRlbnQnOiAncmVuZGVyaW5nSW50ZW50JyxcbiAgcmVwZWF0Y291bnQ6ICdyZXBlYXRDb3VudCcsXG4gIHJlcGVhdGR1cjogJ3JlcGVhdER1cicsXG4gIHJlcXVpcmVkZXh0ZW5zaW9uczogJ3JlcXVpcmVkRXh0ZW5zaW9ucycsXG4gIHJlcXVpcmVkZmVhdHVyZXM6ICdyZXF1aXJlZEZlYXR1cmVzJyxcbiAgcmVzb3VyY2U6ICdyZXNvdXJjZScsXG4gIHJlc3RhcnQ6ICdyZXN0YXJ0JyxcbiAgcmVzdWx0OiAncmVzdWx0JyxcbiAgcmVzdWx0czogJ3Jlc3VsdHMnLFxuICByb3RhdGU6ICdyb3RhdGUnLFxuICByeDogJ3J4JyxcbiAgcnk6ICdyeScsXG4gIHNjYWxlOiAnc2NhbGUnLFxuICBzZWN1cml0eTogJ3NlY3VyaXR5JyxcbiAgc2VlZDogJ3NlZWQnLFxuICBzaGFwZXJlbmRlcmluZzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgJ3NoYXBlLXJlbmRlcmluZyc6ICdzaGFwZVJlbmRlcmluZycsXG4gIHNsb3BlOiAnc2xvcGUnLFxuICBzcGFjaW5nOiAnc3BhY2luZycsXG4gIHNwZWN1bGFyY29uc3RhbnQ6ICdzcGVjdWxhckNvbnN0YW50JyxcbiAgc3BlY3VsYXJleHBvbmVudDogJ3NwZWN1bGFyRXhwb25lbnQnLFxuICBzcGVlZDogJ3NwZWVkJyxcbiAgc3ByZWFkbWV0aG9kOiAnc3ByZWFkTWV0aG9kJyxcbiAgc3RhcnRvZmZzZXQ6ICdzdGFydE9mZnNldCcsXG4gIHN0ZGRldmlhdGlvbjogJ3N0ZERldmlhdGlvbicsXG4gIHN0ZW1oOiAnc3RlbWgnLFxuICBzdGVtdjogJ3N0ZW12JyxcbiAgc3RpdGNodGlsZXM6ICdzdGl0Y2hUaWxlcycsXG4gIHN0b3Bjb2xvcjogJ3N0b3BDb2xvcicsXG4gICdzdG9wLWNvbG9yJzogJ3N0b3BDb2xvcicsXG4gIHN0b3BvcGFjaXR5OiAnc3RvcE9wYWNpdHknLFxuICAnc3RvcC1vcGFjaXR5JzogJ3N0b3BPcGFjaXR5JyxcbiAgc3RyaWtldGhyb3VnaHBvc2l0aW9uOiAnc3RyaWtldGhyb3VnaFBvc2l0aW9uJyxcbiAgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nOiAnc3RyaWtldGhyb3VnaFBvc2l0aW9uJyxcbiAgc3RyaWtldGhyb3VnaHRoaWNrbmVzczogJ3N0cmlrZXRocm91Z2hUaGlja25lc3MnLFxuICAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gIHN0cmluZzogJ3N0cmluZycsXG4gIHN0cm9rZTogJ3N0cm9rZScsXG4gIHN0cm9rZWRhc2hhcnJheTogJ3N0cm9rZURhc2hhcnJheScsXG4gICdzdHJva2UtZGFzaGFycmF5JzogJ3N0cm9rZURhc2hhcnJheScsXG4gIHN0cm9rZWRhc2hvZmZzZXQ6ICdzdHJva2VEYXNob2Zmc2V0JyxcbiAgJ3N0cm9rZS1kYXNob2Zmc2V0JzogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICBzdHJva2VsaW5lY2FwOiAnc3Ryb2tlTGluZWNhcCcsXG4gICdzdHJva2UtbGluZWNhcCc6ICdzdHJva2VMaW5lY2FwJyxcbiAgc3Ryb2tlbGluZWpvaW46ICdzdHJva2VMaW5lam9pbicsXG4gICdzdHJva2UtbGluZWpvaW4nOiAnc3Ryb2tlTGluZWpvaW4nLFxuICBzdHJva2VtaXRlcmxpbWl0OiAnc3Ryb2tlTWl0ZXJsaW1pdCcsXG4gICdzdHJva2UtbWl0ZXJsaW1pdCc6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgc3Ryb2tld2lkdGg6ICdzdHJva2VXaWR0aCcsXG4gICdzdHJva2Utd2lkdGgnOiAnc3Ryb2tlV2lkdGgnLFxuICBzdHJva2VvcGFjaXR5OiAnc3Ryb2tlT3BhY2l0eScsXG4gICdzdHJva2Utb3BhY2l0eSc6ICdzdHJva2VPcGFjaXR5JyxcbiAgc3VwcHJlc3Njb250ZW50ZWRpdGFibGV3YXJuaW5nOiAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJyxcbiAgc3VwcHJlc3NoeWRyYXRpb253YXJuaW5nOiAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJyxcbiAgc3VyZmFjZXNjYWxlOiAnc3VyZmFjZVNjYWxlJyxcbiAgc3lzdGVtbGFuZ3VhZ2U6ICdzeXN0ZW1MYW5ndWFnZScsXG4gIHRhYmxldmFsdWVzOiAndGFibGVWYWx1ZXMnLFxuICB0YXJnZXR4OiAndGFyZ2V0WCcsXG4gIHRhcmdldHk6ICd0YXJnZXRZJyxcbiAgdGV4dGFuY2hvcjogJ3RleHRBbmNob3InLFxuICAndGV4dC1hbmNob3InOiAndGV4dEFuY2hvcicsXG4gIHRleHRkZWNvcmF0aW9uOiAndGV4dERlY29yYXRpb24nLFxuICAndGV4dC1kZWNvcmF0aW9uJzogJ3RleHREZWNvcmF0aW9uJyxcbiAgdGV4dGxlbmd0aDogJ3RleHRMZW5ndGgnLFxuICB0ZXh0cmVuZGVyaW5nOiAndGV4dFJlbmRlcmluZycsXG4gICd0ZXh0LXJlbmRlcmluZyc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgdG86ICd0bycsXG4gIHRyYW5zZm9ybTogJ3RyYW5zZm9ybScsXG4gIHR5cGVvZjogJ3R5cGVvZicsXG4gIHUxOiAndTEnLFxuICB1MjogJ3UyJyxcbiAgdW5kZXJsaW5lcG9zaXRpb246ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gICd1bmRlcmxpbmUtcG9zaXRpb24nOiAndW5kZXJsaW5lUG9zaXRpb24nLFxuICB1bmRlcmxpbmV0aGlja25lc3M6ICd1bmRlcmxpbmVUaGlja25lc3MnLFxuICAndW5kZXJsaW5lLXRoaWNrbmVzcyc6ICd1bmRlcmxpbmVUaGlja25lc3MnLFxuICB1bmljb2RlOiAndW5pY29kZScsXG4gIHVuaWNvZGViaWRpOiAndW5pY29kZUJpZGknLFxuICAndW5pY29kZS1iaWRpJzogJ3VuaWNvZGVCaWRpJyxcbiAgdW5pY29kZXJhbmdlOiAndW5pY29kZVJhbmdlJyxcbiAgJ3VuaWNvZGUtcmFuZ2UnOiAndW5pY29kZVJhbmdlJyxcbiAgdW5pdHNwZXJlbTogJ3VuaXRzUGVyRW0nLFxuICAndW5pdHMtcGVyLWVtJzogJ3VuaXRzUGVyRW0nLFxuICB1bnNlbGVjdGFibGU6ICd1bnNlbGVjdGFibGUnLFxuICB2YWxwaGFiZXRpYzogJ3ZBbHBoYWJldGljJyxcbiAgJ3YtYWxwaGFiZXRpYyc6ICd2QWxwaGFiZXRpYycsXG4gIHZhbHVlczogJ3ZhbHVlcycsXG4gIHZlY3RvcmVmZmVjdDogJ3ZlY3RvckVmZmVjdCcsXG4gICd2ZWN0b3ItZWZmZWN0JzogJ3ZlY3RvckVmZmVjdCcsXG4gIHZlcnNpb246ICd2ZXJzaW9uJyxcbiAgdmVydGFkdnk6ICd2ZXJ0QWR2WScsXG4gICd2ZXJ0LWFkdi15JzogJ3ZlcnRBZHZZJyxcbiAgdmVydG9yaWdpbng6ICd2ZXJ0T3JpZ2luWCcsXG4gICd2ZXJ0LW9yaWdpbi14JzogJ3ZlcnRPcmlnaW5YJyxcbiAgdmVydG9yaWdpbnk6ICd2ZXJ0T3JpZ2luWScsXG4gICd2ZXJ0LW9yaWdpbi15JzogJ3ZlcnRPcmlnaW5ZJyxcbiAgdmhhbmdpbmc6ICd2SGFuZ2luZycsXG4gICd2LWhhbmdpbmcnOiAndkhhbmdpbmcnLFxuICB2aWRlb2dyYXBoaWM6ICd2SWRlb2dyYXBoaWMnLFxuICAndi1pZGVvZ3JhcGhpYyc6ICd2SWRlb2dyYXBoaWMnLFxuICB2aWV3Ym94OiAndmlld0JveCcsXG4gIHZpZXd0YXJnZXQ6ICd2aWV3VGFyZ2V0JyxcbiAgdmlzaWJpbGl0eTogJ3Zpc2liaWxpdHknLFxuICB2bWF0aGVtYXRpY2FsOiAndk1hdGhlbWF0aWNhbCcsXG4gICd2LW1hdGhlbWF0aWNhbCc6ICd2TWF0aGVtYXRpY2FsJyxcbiAgdm9jYWI6ICd2b2NhYicsXG4gIHdpZHRoczogJ3dpZHRocycsXG4gIHdvcmRzcGFjaW5nOiAnd29yZFNwYWNpbmcnLFxuICAnd29yZC1zcGFjaW5nJzogJ3dvcmRTcGFjaW5nJyxcbiAgd3JpdGluZ21vZGU6ICd3cml0aW5nTW9kZScsXG4gICd3cml0aW5nLW1vZGUnOiAnd3JpdGluZ01vZGUnLFxuICB4MTogJ3gxJyxcbiAgeDI6ICd4MicsXG4gIHg6ICd4JyxcbiAgeGNoYW5uZWxzZWxlY3RvcjogJ3hDaGFubmVsU2VsZWN0b3InLFxuICB4aGVpZ2h0OiAneEhlaWdodCcsXG4gICd4LWhlaWdodCc6ICd4SGVpZ2h0JyxcbiAgeGxpbmthY3R1YXRlOiAneGxpbmtBY3R1YXRlJyxcbiAgJ3hsaW5rOmFjdHVhdGUnOiAneGxpbmtBY3R1YXRlJyxcbiAgeGxpbmthcmNyb2xlOiAneGxpbmtBcmNyb2xlJyxcbiAgJ3hsaW5rOmFyY3JvbGUnOiAneGxpbmtBcmNyb2xlJyxcbiAgeGxpbmtocmVmOiAneGxpbmtIcmVmJyxcbiAgJ3hsaW5rOmhyZWYnOiAneGxpbmtIcmVmJyxcbiAgeGxpbmtyb2xlOiAneGxpbmtSb2xlJyxcbiAgJ3hsaW5rOnJvbGUnOiAneGxpbmtSb2xlJyxcbiAgeGxpbmtzaG93OiAneGxpbmtTaG93JyxcbiAgJ3hsaW5rOnNob3cnOiAneGxpbmtTaG93JyxcbiAgeGxpbmt0aXRsZTogJ3hsaW5rVGl0bGUnLFxuICAneGxpbms6dGl0bGUnOiAneGxpbmtUaXRsZScsXG4gIHhsaW5rdHlwZTogJ3hsaW5rVHlwZScsXG4gICd4bGluazp0eXBlJzogJ3hsaW5rVHlwZScsXG4gIHhtbGJhc2U6ICd4bWxCYXNlJyxcbiAgJ3htbDpiYXNlJzogJ3htbEJhc2UnLFxuICB4bWxsYW5nOiAneG1sTGFuZycsXG4gICd4bWw6bGFuZyc6ICd4bWxMYW5nJyxcbiAgeG1sbnM6ICd4bWxucycsXG4gICd4bWw6c3BhY2UnOiAneG1sU3BhY2UnLFxuICB4bWxuc3hsaW5rOiAneG1sbnNYbGluaycsXG4gICd4bWxuczp4bGluayc6ICd4bWxuc1hsaW5rJyxcbiAgeG1sc3BhY2U6ICd4bWxTcGFjZScsXG4gIHkxOiAneTEnLFxuICB5MjogJ3kyJyxcbiAgeTogJ3knLFxuICB5Y2hhbm5lbHNlbGVjdG9yOiAneUNoYW5uZWxTZWxlY3RvcicsXG4gIHo6ICd6JyxcbiAgem9vbWFuZHBhbjogJ3pvb21BbmRQYW4nXG59O1xuXG52YXIgYXJpYVByb3BlcnRpZXMgPSB7XG4gICdhcmlhLWN1cnJlbnQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1kZXNjcmlwdGlvbic6IDAsXG4gICdhcmlhLWRldGFpbHMnOiAwLFxuICAnYXJpYS1kaXNhYmxlZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWhpZGRlbic6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWludmFsaWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAnYXJpYS1sYWJlbCc6IDAsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICdhcmlhLWNoZWNrZWQnOiAwLFxuICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAnYXJpYS1tb2RhbCc6IDAsXG4gICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgJ2FyaWEtc29ydCc6IDAsXG4gICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXRvbWljJzogMCxcbiAgJ2FyaWEtYnVzeSc6IDAsXG4gICdhcmlhLWxpdmUnOiAwLFxuICAnYXJpYS1yZWxldmFudCc6IDAsXG4gIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICdhcmlhLWNvbGluZGV4JzogMCxcbiAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAnYXJpYS1mbG93dG8nOiAwLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgJ2FyaWEtb3ducyc6IDAsXG4gICdhcmlhLXBvc2luc2V0JzogMCxcbiAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICdhcmlhLXJvd3NwYW4nOiAwLFxuICAnYXJpYS1zZXRzaXplJzogMFxufTtcblxudmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcbnZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIHJBUklBQ2FtZWwgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSwgbmFtZSkge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwod2FybmVkUHJvcGVydGllcywgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJBUklBQ2FtZWwudGVzdChuYW1lKSkge1xuICAgICAgdmFyIGFyaWFOYW1lID0gJ2FyaWEtJyArIG5hbWUuc2xpY2UoNCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBjb3JyZWN0TmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGFyaWFOYW1lKSA/IGFyaWFOYW1lIDogbnVsbDsgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG5cbiAgICAgIGlmIChjb3JyZWN0TmFtZSA9PSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIEFSSUEgYXR0cmlidXRlcyBmb2xsb3cgdGhlIHBhdHRlcm4gYXJpYS0qIGFuZCBtdXN0IGJlIGxvd2VyY2FzZS4nLCBuYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuXG5cbiAgICAgIGlmIChuYW1lICE9PSBjb3JyZWN0TmFtZSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBjb3JyZWN0TmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyQVJJQS50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgc3RhbmRhcmROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gbG93ZXJDYXNlZE5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKHN0YW5kYXJkTmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuXG5cbiAgICAgIGlmIChuYW1lICE9PSBzdGFuZGFyZE5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgc3RhbmRhcmROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB2YXIgaW52YWxpZFByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSh0eXBlLCBrZXkpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgaW52YWxpZFByb3BzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSBpbnZhbGlkUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgICB9KS5qb2luKCcsICcpO1xuXG4gICAgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWFyaWEtcHJvcHMnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfSBlbHNlIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID4gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWFyaWEtcHJvcHMnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcykge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpO1xufVxuXG52YXIgZGlkV2FyblZhbHVlTnVsbCA9IGZhbHNlO1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIGlmICh0eXBlICE9PSAnaW5wdXQnICYmIHR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdHlwZSAhPT0gJ3NlbGVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMgIT0gbnVsbCAmJiBwcm9wcy52YWx1ZSA9PT0gbnVsbCAmJiAhZGlkV2FyblZhbHVlTnVsbCkge1xuICAgICAgZGlkV2FyblZhbHVlTnVsbCA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlID09PSAnc2VsZWN0JyAmJiBwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICBlcnJvcignYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IGFycmF5IHdoZW4gYG11bHRpcGxlYCBpcyBzZXQgdG8gYHRydWVgICcgKyAndG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgICcgKyAnZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsaWRhdGVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgdmFyIHdhcm5lZFByb3BlcnRpZXMkMSA9IHt9O1xuICB2YXIgRVZFTlRfTkFNRV9SRUdFWCA9IC9eb24uLztcbiAgdmFyIElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWCA9IC9eb25bXkEtWl0vO1xuICB2YXIgckFSSUEkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuICB2YXIgckFSSUFDYW1lbCQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCB2YWx1ZSwgZXZlbnRSZWdpc3RyeSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMkMSwgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllcyQxW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdvbmZvY3VzaW4nIHx8IGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c291dCcpIHtcbiAgICAgIGVycm9yKCdSZWFjdCB1c2VzIG9uRm9jdXMgYW5kIG9uQmx1ciBpbnN0ZWFkIG9mIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dC4gJyArICdBbGwgUmVhY3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0ICcgKyAnYXJlIG5vdCBuZWVkZWQvc3VwcG9ydGVkIGJ5IFJlYWN0LicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXZSBjYW4ndCByZWx5IG9uIHRoZSBldmVudCBzeXN0ZW0gYmVpbmcgaW5qZWN0ZWQgb24gdGhlIHNlcnZlci5cblxuXG4gICAgaWYgKGV2ZW50UmVnaXN0cnkgIT0gbnVsbCkge1xuICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMgPSBldmVudFJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9IGV2ZW50UmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcztcblxuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lID0gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA6IG51bGw7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIEl0IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgLy8gSWYgbm8gZXZlbnQgcGx1Z2lucyBoYXZlIGJlZW4gaW5qZWN0ZWQsIHdlIGFyZSBpbiBhIHNlcnZlciBlbnZpcm9ubWVudC5cbiAgICAgIC8vIFNvIHdlIGNhbid0IHRlbGwgaWYgdGhlIGV2ZW50IG5hbWUgaXMgY29ycmVjdCBmb3Igc3VyZSwgYnV0IHdlIGNhbiBmaWx0ZXJcbiAgICAgIC8vIG91dCBrbm93biBiYWQgb25lcyBsaWtlIGBvbmNsaWNrYC4gV2UgY2FuJ3Qgc3VnZ2VzdCBhIHNwZWNpZmljIHJlcGxhY2VtZW50IHRob3VnaC5cbiAgICAgIGlmIChJTlZBTElEX0VWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuICcgKyAnUmVhY3QgZXZlbnRzIHVzZSB0aGUgY2FtZWxDYXNlIG5hbWluZyBjb252ZW50aW9uLCBmb3IgZXhhbXBsZSBgb25DbGlja2AuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIExldCB0aGUgQVJJQSBhdHRyaWJ1dGUgaG9vayB2YWxpZGF0ZSBBUklBIGF0dHJpYnV0ZXNcblxuXG4gICAgaWYgKHJBUklBJDEudGVzdChuYW1lKSB8fCByQVJJQUNhbWVsJDEudGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnaW5uZXJodG1sJykge1xuICAgICAgZXJyb3IoJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2FyaWEnKSB7XG4gICAgICBlcnJvcignVGhlIGBhcmlhYCBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgaW4gUmVhY3QuICcgKyAnUGFzcyBpbmRpdmlkdWFsIGBhcmlhLWAgYXR0cmlidXRlcyBpbnN0ZWFkLicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnaXMnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGEgYCVzYCBmb3IgYSBzdHJpbmcgYXR0cmlidXRlIGBpc2AuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgdHlwZW9mIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIE5hTiBmb3IgdGhlIGAlc2AgYXR0cmlidXRlLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIG5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcbiAgICB2YXIgaXNSZXNlcnZlZCA9IHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQ7IC8vIEtub3duIGF0dHJpYnV0ZXMgc2hvdWxkIG1hdGNoIHRoZSBjYXNpbmcgc3BlY2lmaWVkIGluIHRoZSBwcm9wZXJ0eSBjb25maWcuXG5cbiAgICBpZiAocG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV07XG5cbiAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgRE9NIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZCAmJiBuYW1lICE9PSBsb3dlckNhc2VkTmFtZSkge1xuICAgICAgLy8gVW5rbm93biBhdHRyaWJ1dGVzIHNob3VsZCBoYXZlIGxvd2VyY2FzZSBjYXNpbmcgc2luY2UgdGhhdCdzIGhvdyB0aGV5XG4gICAgICAvLyB3aWxsIGJlIGNhc2VkIGFueXdheSB3aXRoIHNlcnZlciByZW5kZXJpbmcuXG4gICAgICBlcnJvcignUmVhY3QgZG9lcyBub3QgcmVjb2duaXplIHRoZSBgJXNgIHByb3Agb24gYSBET00gZWxlbWVudC4gSWYgeW91ICcgKyAnaW50ZW50aW9uYWxseSB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUgRE9NIGFzIGEgY3VzdG9tICcgKyAnYXR0cmlidXRlLCBzcGVsbCBpdCBhcyBsb3dlcmNhc2UgYCVzYCBpbnN0ZWFkLiAnICsgJ0lmIHlvdSBhY2NpZGVudGFsbHkgcGFzc2VkIGl0IGZyb20gYSBwYXJlbnQgY29tcG9uZW50LCByZW1vdmUgJyArICdpdCBmcm9tIHRoZSBET00gZWxlbWVudC4nLCBuYW1lLCBsb3dlckNhc2VkTmFtZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHZhbHVlLCBuYW1lLCBuYW1lLCB2YWx1ZSwgbmFtZSwgbmFtZSwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIE5vdyB0aGF0IHdlJ3ZlIHZhbGlkYXRlZCBjYXNpbmcsIGRvIG5vdCB2YWxpZGF0ZVxuICAgIC8vIGRhdGEgdHlwZXMgZm9yIHJlc2VydmVkIHByb3BzXG5cblxuICAgIGlmIChpc1Jlc2VydmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFdhcm4gd2hlbiBhIGtub3duIGF0dHJpYnV0ZSBpcyBhIGJhZCB0eXBlXG5cblxuICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBXYXJuIHdoZW4gcGFzc2luZyB0aGUgc3RyaW5ncyAnZmFsc2UnIG9yICd0cnVlJyBpbnRvIGEgYm9vbGVhbiBwcm9wXG5cblxuICAgIGlmICgodmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgPT09ICd0cnVlJykgJiYgcHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBCT09MRUFOKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgdGhlIHN0cmluZyBgJXNgIGZvciB0aGUgYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC4gJyArICclcyAnICsgJ0RpZCB5b3UgbWVhbiAlcz17JXN9PycsIHZhbHVlLCBuYW1lLCB2YWx1ZSA9PT0gJ2ZhbHNlJyA/ICdUaGUgYnJvd3NlciB3aWxsIGludGVycHJldCBpdCBhcyBhIHRydXRoeSB2YWx1ZS4nIDogJ0FsdGhvdWdoIHRoaXMgd29ya3MsIGl0IHdpbGwgbm90IHdvcmsgYXMgZXhwZWN0ZWQgaWYgeW91IHBhc3MgdGhlIHN0cmluZyBcImZhbHNlXCIuJywgbmFtZSwgdmFsdWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbnZhciB3YXJuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAge1xuICAgIHZhciB1bmtub3duUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5JDEodHlwZSwga2V5LCBwcm9wc1trZXldLCBldmVudFJlZ2lzdHJ5KTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIHVua25vd25Qcm9wcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gdW5rbm93blByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gICAgfSkuam9pbignLCAnKTtcblxuICAgIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgcHJvcCAlcyBvbiA8JXM+IHRhZy4gRWl0aGVyIHJlbW92ZSBpdCBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgaXQgaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH0gZWxzZSBpZiAodW5rbm93blByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIHZhbHVlcyBmb3IgcHJvcHMgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgdGhlbSBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgdGhlbSBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciAnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSkge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FyblVua25vd25Qcm9wZXJ0aWVzKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KTtcbn1cblxudmFyIElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFID0gMTtcbnZhciBJU19OT05fREVMRUdBVEVEID0gMSA8PCAxO1xudmFyIElTX0NBUFRVUkVfUEhBU0UgPSAxIDw8IDI7XG4vLyBzZXQgdG8gTEVHQUNZX0ZCX1NVUFBPUlQuIExFR0FDWV9GQl9TVVBQT1JUIG9ubHkgZ2V0cyBzZXQgd2hlblxuLy8gd2UgY2FsbCB3aWxsRGVmZXJMYXRlckZvckxlZ2FjeUZCU3VwcG9ydCwgdGh1cyBub3QgYmFpbGluZyBvdXRcbi8vIHdpbGwgcmVzdWx0IGluIGVuZGxlc3MgY3ljbGVzIGxpa2UgYW4gaW5maW5pdGUgbG9vcC5cbi8vIFdlIGFsc28gZG9uJ3Qgd2FudCB0byBkZWZlciBkdXJpbmcgZXZlbnQgcmVwbGF5aW5nLlxuXG52YXIgU0hPVUxEX05PVF9QUk9DRVNTX1BPTFlGSUxMX0VWRU5UX1BMVUdJTlMgPSBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSB8IElTX05PTl9ERUxFR0FURUQgfCBJU19DQVBUVVJFX1BIQVNFO1xuXG4vLyBUaGlzIGV4aXN0cyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gUmVhY3RET01FdmVudFJlcGxheWluZ1xuLy8gYW5kIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxudmFyIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7XG5mdW5jdGlvbiBzZXRSZXBsYXlpbmdFdmVudChldmVudCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnRSZXBsYXlpbmdFdmVudCAhPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gYmUgbnVsbC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IGV2ZW50O1xufVxuZnVuY3Rpb24gcmVzZXRSZXBsYXlpbmdFdmVudCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50UmVwbGF5aW5nRXZlbnQgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBjdXJyZW50bHkgcmVwbGF5aW5nIGV2ZW50IHRvIG5vdCBiZSBudWxsLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzUmVwbGF5aW5nRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGV2ZW50ID09PSBjdXJyZW50UmVwbGF5aW5nRXZlbnQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdGFyZ2V0IG5vZGUgZnJvbSBhIG5hdGl2ZSBicm93c2VyIGV2ZW50IGJ5IGFjY291bnRpbmcgZm9yXG4gKiBpbmNvbnNpc3RlbmNpZXMgaW4gYnJvd3NlciBET00gQVBJcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtET01FdmVudFRhcmdldH0gVGFyZ2V0IG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpIHtcbiAgLy8gRmFsbGJhY2sgdG8gbmF0aXZlRXZlbnQuc3JjRWxlbWVudCBmb3IgSUU5XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDZcbiAgdmFyIHRhcmdldCA9IG5hdGl2ZUV2ZW50LnRhcmdldCB8fCBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IHdpbmRvdzsgLy8gTm9ybWFsaXplIFNWRyA8dXNlPiBlbGVtZW50IGV2ZW50cyAjNDk2M1xuXG4gIGlmICh0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpIHtcbiAgICB0YXJnZXQgPSB0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQ7XG4gIH0gLy8gU2FmYXJpIG1heSBmaXJlIGV2ZW50cyBvbiB0ZXh0IG5vZGVzIChOb2RlLlRFWFRfTk9ERSBpcyAzKS5cbiAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2pzL2V2ZW50c19wcm9wZXJ0aWVzLmh0bWxcblxuXG4gIHJldHVybiB0YXJnZXQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSA/IHRhcmdldC5wYXJlbnROb2RlIDogdGFyZ2V0O1xufVxuXG52YXIgcmVzdG9yZUltcGwgPSBudWxsO1xudmFyIHJlc3RvcmVUYXJnZXQgPSBudWxsO1xudmFyIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCkge1xuICAvLyBXZSBwZXJmb3JtIHRoaXMgdHJhbnNsYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgZXZlbnQgbG9vcCBzbyB0aGF0IHdlXG4gIC8vIGFsd2F5cyByZWNlaXZlIHRoZSBjb3JyZWN0IGZpYmVyIGhlcmVcbiAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKHRhcmdldCk7XG5cbiAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgLy8gVW5tb3VudGVkXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZXN0b3JlSW1wbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBhIHRhcmdldCBmb3IgY29udHJvbGxlZCAnICsgJ2V2ZW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHZhciBzdGF0ZU5vZGUgPSBpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZTsgLy8gR3VhcmQgYWdhaW5zdCBGaWJlciBiZWluZyB1bm1vdW50ZWQuXG5cbiAgaWYgKHN0YXRlTm9kZSkge1xuICAgIHZhciBfcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG5cbiAgICByZXN0b3JlSW1wbChpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZSwgaW50ZXJuYWxJbnN0YW5jZS50eXBlLCBfcHJvcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihpbXBsKSB7XG4gIHJlc3RvcmVJbXBsID0gaW1wbDtcbn1cbmZ1bmN0aW9uIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KSB7XG4gIGlmIChyZXN0b3JlVGFyZ2V0KSB7XG4gICAgaWYgKHJlc3RvcmVRdWV1ZSkge1xuICAgICAgcmVzdG9yZVF1ZXVlLnB1c2godGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdG9yZVF1ZXVlID0gW3RhcmdldF07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3RvcmVUYXJnZXQgPSB0YXJnZXQ7XG4gIH1cbn1cbmZ1bmN0aW9uIG5lZWRzU3RhdGVSZXN0b3JlKCkge1xuICByZXR1cm4gcmVzdG9yZVRhcmdldCAhPT0gbnVsbCB8fCByZXN0b3JlUXVldWUgIT09IG51bGw7XG59XG5mdW5jdGlvbiByZXN0b3JlU3RhdGVJZk5lZWRlZCgpIHtcbiAgaWYgKCFyZXN0b3JlVGFyZ2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRhcmdldCA9IHJlc3RvcmVUYXJnZXQ7XG4gIHZhciBxdWV1ZWRUYXJnZXRzID0gcmVzdG9yZVF1ZXVlO1xuICByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbiAgcmVzdG9yZVF1ZXVlID0gbnVsbDtcbiAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KTtcblxuICBpZiAocXVldWVkVGFyZ2V0cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWVkVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQocXVldWVkVGFyZ2V0c1tpXSk7XG4gICAgfVxuICB9XG59XG5cbi8vIHRoZSByZW5kZXJlci4gU3VjaCBhcyB3aGVuIHdlJ3JlIGRpc3BhdGNoaW5nIGV2ZW50cyBvciBpZiB0aGlyZCBwYXJ0eVxuLy8gbGlicmFyaWVzIG5lZWQgdG8gY2FsbCBiYXRjaGVkVXBkYXRlcy4gRXZlbnR1YWxseSwgdGhpcyBBUEkgd2lsbCBnbyBhd2F5IHdoZW5cbi8vIGV2ZXJ5dGhpbmcgaXMgYmF0Y2hlZCBieSBkZWZhdWx0LiBXZSdsbCB0aGVuIGhhdmUgYSBzaW1pbGFyIEFQSSB0byBvcHQtb3V0IG9mXG4vLyBzY2hlZHVsZWQgd29yayBhbmQgaW5zdGVhZCBkbyBzeW5jaHJvbm91cyB3b3JrLlxuLy8gRGVmYXVsdHNcblxudmFyIGJhdGNoZWRVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYm9va2tlZXBpbmcpIHtcbiAgcmV0dXJuIGZuKGJvb2trZWVwaW5nKTtcbn07XG5cbnZhciBmbHVzaFN5bmNJbXBsID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmaW5pc2hFdmVudEhhbmRsZXIoKSB7XG4gIC8vIEhlcmUgd2Ugd2FpdCB1bnRpbCBhbGwgdXBkYXRlcyBoYXZlIHByb3BhZ2F0ZWQsIHdoaWNoIGlzIGltcG9ydGFudFxuICAvLyB3aGVuIHVzaW5nIGNvbnRyb2xsZWQgY29tcG9uZW50cyB3aXRoaW4gbGF5ZXJzOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2OThcbiAgLy8gVGhlbiB3ZSByZXN0b3JlIHN0YXRlIG9mIGFueSBjb250cm9sbGVkIGNvbXBvbmVudC5cbiAgdmFyIGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzID0gbmVlZHNTdGF0ZVJlc3RvcmUoKTtcblxuICBpZiAoY29udHJvbGxlZENvbXBvbmVudHNIYXZlUGVuZGluZ1VwZGF0ZXMpIHtcbiAgICAvLyBJZiBhIGNvbnRyb2xsZWQgZXZlbnQgd2FzIGZpcmVkLCB3ZSBtYXkgbmVlZCB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZlxuICAgIC8vIHRoZSBET00gbm9kZSBiYWNrIHRvIHRoZSBjb250cm9sbGVkIHZhbHVlLiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuIFJlYWN0XG4gICAgLy8gYmFpbHMgb3V0IG9mIHRoZSB1cGRhdGUgd2l0aG91dCB0b3VjaGluZyB0aGUgRE9NLlxuICAgIC8vIFRPRE86IFJlc3RvcmUgc3RhdGUgaW4gdGhlIG1pY3JvdGFzaywgYWZ0ZXIgdGhlIGRpc2NyZXRlIHVwZGF0ZXMgZmx1c2gsXG4gICAgLy8gaW5zdGVhZCBvZiBlYXJseSBmbHVzaGluZyB0aGVtIGhlcmUuXG4gICAgZmx1c2hTeW5jSW1wbCgpO1xuICAgIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMoZm4sIGEsIGIpIHtcbiAgaWYgKGlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgYW5vdGhlciBiYXRjaCwgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0XG4gICAgLy8gZnVsbHkgY29tcGxldGVzIGJlZm9yZSByZXN0b3Jpbmcgc3RhdGUuXG4gICAgcmV0dXJuIGZuKGEsIGIpO1xuICB9XG5cbiAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhdGNoZWRVcGRhdGVzSW1wbChmbiwgYSwgYik7XG4gIH0gZmluYWxseSB7XG4gICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBmYWxzZTtcbiAgICBmaW5pc2hFdmVudEhhbmRsZXIoKTtcbiAgfVxufSAvLyBUT0RPOiBSZXBsYWNlIHdpdGggZmx1c2hTeW5jXG5mdW5jdGlvbiBzZXRCYXRjaGluZ0ltcGxlbWVudGF0aW9uKF9iYXRjaGVkVXBkYXRlc0ltcGwsIF9kaXNjcmV0ZVVwZGF0ZXNJbXBsLCBfZmx1c2hTeW5jSW1wbCkge1xuICBiYXRjaGVkVXBkYXRlc0ltcGwgPSBfYmF0Y2hlZFVwZGF0ZXNJbXBsO1xuICBmbHVzaFN5bmNJbXBsID0gX2ZsdXNoU3luY0ltcGw7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7XG4gIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJztcbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJldmVudE1vdXNlRXZlbnQobmFtZSwgdHlwZSwgcHJvcHMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnb25DbGljayc6XG4gICAgY2FzZSAnb25DbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2snOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bic6XG4gICAgY2FzZSAnb25Nb3VzZURvd25DYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmVDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlVXAnOlxuICAgIGNhc2UgJ29uTW91c2VVcENhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VFbnRlcic6XG4gICAgICByZXR1cm4gISEocHJvcHMuZGlzYWJsZWQgJiYgaXNJbnRlcmFjdGl2ZSh0eXBlKSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gKiBAcmV0dXJuIHs/ZnVuY3Rpb259IFRoZSBzdG9yZWQgY2FsbGJhY2suXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gIHZhciBzdGF0ZU5vZGUgPSBpbnN0LnN0YXRlTm9kZTtcblxuICBpZiAoc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgLy8gV29yayBpbiBwcm9ncmVzcyAoZXg6IG9ubG9hZCBldmVudHMgaW4gaW5jcmVtZW50YWwgbW9kZSkuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG5cbiAgaWYgKHByb3BzID09PSBudWxsKSB7XG4gICAgLy8gV29yayBpbiBwcm9ncmVzcy5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IHByb3BzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuXG4gIGlmIChzaG91bGRQcmV2ZW50TW91c2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBpbnN0LnR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGxpc3RlbmVyICYmIHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGBcIiArIHJlZ2lzdHJhdGlvbk5hbWUgKyBcImAgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgXCIgKyB0eXBlb2YgbGlzdGVuZXIgKyBcImAgdHlwZS5cIik7XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXI7XG59XG5cbnZhciBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlOyAvLyBDaGVjayBpZiBicm93c2VyIHN1cHBvcnQgZXZlbnRzIHdpdGggcGFzc2l2ZSBsaXN0ZW5lcnNcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI1NhZmVseV9kZXRlY3Rpbmdfb3B0aW9uX3N1cHBvcnRcblxuaWYgKGNhblVzZURPTSkge1xuICB0cnkge1xuICAgIHZhciBvcHRpb25zID0ge307IC8vICRGbG93Rml4TWU6IElnbm9yZSBGbG93IGNvbXBsYWluaW5nIGFib3V0IG5lZWRpbmcgYSB2YWx1ZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdGlvbnMsICdwYXNzaXZlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gIHRyeSB7XG4gICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCA9IGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2Q7XG5cbntcbiAgLy8gSW4gREVWIG1vZGUsIHdlIHN3YXAgb3V0IGludm9rZUd1YXJkZWRDYWxsYmFjayBmb3IgYSBzcGVjaWFsIHZlcnNpb25cbiAgLy8gdGhhdCBwbGF5cyBtb3JlIG5pY2VseSB3aXRoIHRoZSBicm93c2VyJ3MgRGV2VG9vbHMuIFRoZSBpZGVhIGlzIHRvIHByZXNlcnZlXG4gIC8vIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLiBCZWNhdXNlIFJlYWN0IHdyYXBzIGFsbCB1c2VyLXByb3ZpZGVkXG4gIC8vIGZ1bmN0aW9ucyBpbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGFuZCB0aGUgcHJvZHVjdGlvbiB2ZXJzaW9uIG9mXG4gIC8vIGludm9rZUd1YXJkZWRDYWxsYmFjayB1c2VzIGEgdHJ5LWNhdGNoLCBhbGwgdXNlciBleGNlcHRpb25zIGFyZSB0cmVhdGVkXG4gIC8vIGxpa2UgY2F1Z2h0IGV4Y2VwdGlvbnMsIGFuZCB0aGUgRGV2VG9vbHMgd29uJ3QgcGF1c2UgdW5sZXNzIHRoZSBkZXZlbG9wZXJcbiAgLy8gdGFrZXMgdGhlIGV4dHJhIHN0ZXAgb2YgZW5hYmxpbmcgcGF1c2Ugb24gY2F1Z2h0IGV4Y2VwdGlvbnMuIFRoaXMgaXNcbiAgLy8gdW5pbnR1aXRpdmUsIHRob3VnaCwgYmVjYXVzZSBldmVuIHRob3VnaCBSZWFjdCBoYXMgY2F1Z2h0IHRoZSBlcnJvciwgZnJvbVxuICAvLyB0aGUgZGV2ZWxvcGVyJ3MgcGVyc3BlY3RpdmUsIHRoZSBlcnJvciBpcyB1bmNhdWdodC5cbiAgLy9cbiAgLy8gVG8gcHJlc2VydmUgdGhlIGV4cGVjdGVkIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLCB3ZSBkb24ndCB1c2UgYVxuICAvLyB0cnktY2F0Y2ggaW4gREVWLiBJbnN0ZWFkLCB3ZSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoIGEgZmFrZSBldmVudCB0byBhIGZha2VcbiAgLy8gRE9NIG5vZGUsIGFuZCBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIGZyb20gaW5zaWRlIGFuIGV2ZW50IGhhbmRsZXJcbiAgLy8gZm9yIHRoYXQgZmFrZSBldmVudC4gSWYgdGhlIGNhbGxiYWNrIHRocm93cywgdGhlIGVycm9yIGlzIFwiY2FwdHVyZWRcIiB1c2luZ1xuICAvLyBhIGdsb2JhbCBldmVudCBoYW5kbGVyLiBCdXQgYmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVucyBpbiBhIGRpZmZlcmVudFxuICAvLyBldmVudCBsb29wIGNvbnRleHQsIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgbm9ybWFsIHByb2dyYW0gZmxvdy5cbiAgLy8gRWZmZWN0aXZlbHksIHRoaXMgZ2l2ZXMgdXMgdHJ5LWNhdGNoIGJlaGF2aW9yIHdpdGhvdXQgYWN0dWFsbHkgdXNpbmdcbiAgLy8gdHJ5LWNhdGNoLiBOZWF0IVxuICAvLyBDaGVjayB0aGF0IHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBBUElzIHdlIG5lZWQgdG8gaW1wbGVtZW50IG91ciBzcGVjaWFsXG4gIC8vIERFViB2ZXJzaW9uIG9mIGludm9rZUd1YXJkZWRDYWxsYmFja1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kaXNwYXRjaEV2ZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGZha2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncmVhY3QnKTtcblxuICAgIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBmdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tEZXYobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgLy8gSWYgZG9jdW1lbnQgZG9lc24ndCBleGlzdCB3ZSBrbm93IGZvciBzdXJlIHdlIHdpbGwgY3Jhc2ggaW4gdGhpcyBtZXRob2RcbiAgICAgIC8vIHdoZW4gd2UgY2FsbCBkb2N1bWVudC5jcmVhdGVFdmVudCgpLiBIb3dldmVyIHRoaXMgY2FuIGNhdXNlIGNvbmZ1c2luZ1xuICAgICAgLy8gZXJyb3JzOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svY3JlYXRlLXJlYWN0LWFwcC9pc3N1ZXMvMzQ4MlxuICAgICAgLy8gU28gd2UgcHJlZW1wdGl2ZWx5IHRocm93IHdpdGggYSBiZXR0ZXIgbWVzc2FnZSBpbnN0ZWFkLlxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgZG9jdW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYGRvY3VtZW50YCBnbG9iYWwgd2FzIGRlZmluZWQgd2hlbiBSZWFjdCB3YXMgaW5pdGlhbGl6ZWQsIGJ1dCBpcyBub3QgJyArICdkZWZpbmVkIGFueW1vcmUuIFRoaXMgY2FuIGhhcHBlbiBpbiBhIHRlc3QgZW52aXJvbm1lbnQgaWYgYSBjb21wb25lbnQgJyArICdzY2hlZHVsZXMgYW4gdXBkYXRlIGZyb20gYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBidXQgdGhlIHRlc3QgaGFzIGFscmVhZHkgJyArICdmaW5pc2hlZCBydW5uaW5nLiBUbyBzb2x2ZSB0aGlzLCB5b3UgY2FuIGVpdGhlciB1bm1vdW50IHRoZSBjb21wb25lbnQgYXQgJyArICd0aGUgZW5kIG9mIHlvdXIgdGVzdCAoYW5kIGVuc3VyZSB0aGF0IGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBnZXQgJyArICdjYW5jZWxlZCBpbiBgY29tcG9uZW50V2lsbFVubW91bnRgKSwgb3IgeW91IGNhbiBjaGFuZ2UgdGhlIHRlc3QgaXRzZWxmICcgKyAndG8gYmUgYXN5bmNocm9ub3VzLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICB2YXIgZGlkQ2FsbCA9IGZhbHNlOyAvLyBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLiBXZVxuICAgICAgLy8gc2V0IHRoaXMgdG8gdHJ1ZSBhdCB0aGUgYmVnaW5uaW5nLCB0aGVuIHNldCBpdCB0byBmYWxzZSByaWdodCBhZnRlclxuICAgICAgLy8gY2FsbGluZyB0aGUgZnVuY3Rpb24uIElmIHRoZSBmdW5jdGlvbiBlcnJvcnMsIGBkaWRFcnJvcmAgd2lsbCBuZXZlciBiZVxuICAgICAgLy8gc2V0IHRvIGZhbHNlLiBUaGlzIHN0cmF0ZWd5IHdvcmtzIGV2ZW4gaWYgdGhlIGJyb3dzZXIgaXMgZmxha3kgYW5kXG4gICAgICAvLyBmYWlscyB0byBjYWxsIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlciwgYmVjYXVzZSBpdCBkb2Vzbid0IHJlbHkgb25cbiAgICAgIC8vIHRoZSBlcnJvciBldmVudCBhdCBhbGwuXG5cbiAgICAgIHZhciBkaWRFcnJvciA9IHRydWU7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSB2YWx1ZSBvZiB3aW5kb3cuZXZlbnQgc28gdGhhdCB3ZSBjYW4gcmVzZXQgaXRcbiAgICAgIC8vIGR1cmluZyB0aGUgY2FsbGJhY2sgdG8gbGV0IHVzZXIgY29kZSBhY2Nlc3Mgd2luZG93LmV2ZW50IGluIHRoZVxuICAgICAgLy8gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGl0LlxuXG4gICAgICB2YXIgd2luZG93RXZlbnQgPSB3aW5kb3cuZXZlbnQ7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHdpbmRvdy5ldmVudCB0byByZXN0b3JlIGl0IGFmdGVyIGV2ZW50XG4gICAgICAvLyBkaXNwYXRjaGluZzogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzY4OFxuXG4gICAgICB2YXIgd2luZG93RXZlbnREZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdldmVudCcpO1xuXG4gICAgICBmdW5jdGlvbiByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpIHtcbiAgICAgICAgLy8gV2UgaW1tZWRpYXRlbHkgcmVtb3ZlIHRoZSBjYWxsYmFjayBmcm9tIGV2ZW50IGxpc3RlbmVycyBzbyB0aGF0XG4gICAgICAgIC8vIG5lc3RlZCBgaW52b2tlR3VhcmRlZENhbGxiYWNrYCBjYWxscyBkbyBub3QgY2xhc2guIE90aGVyd2lzZSwgYVxuICAgICAgICAvLyBuZXN0ZWQgY2FsbCB3b3VsZCB0cmlnZ2VyIHRoZSBmYWtlIGV2ZW50IGhhbmRsZXJzIG9mIGFueSBjYWxsIGhpZ2hlclxuICAgICAgICAvLyBpbiB0aGUgc3RhY2suXG4gICAgICAgIGZha2VOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFdlIGNoZWNrIGZvciB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykgdG8gcHJldmVudCB0aGVcbiAgICAgICAgLy8gd2luZG93LmV2ZW50IGFzc2lnbm1lbnQgaW4gYm90aCBJRSA8PSAxMCBhcyB0aGV5IHRocm93IGFuIGVycm9yXG4gICAgICAgIC8vIFwiTWVtYmVyIG5vdCBmb3VuZFwiIGluIHN0cmljdCBtb2RlLCBhbmQgaW4gRmlyZWZveCB3aGljaCBkb2VzIG5vdFxuICAgICAgICAvLyBzdXBwb3J0IHdpbmRvdy5ldmVudC5cblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5ldmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpKSB7XG4gICAgICAgICAgd2luZG93LmV2ZW50ID0gd2luZG93RXZlbnQ7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gQ3JlYXRlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIG91ciBmYWtlIGV2ZW50LiBXZSB3aWxsIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50IHVzaW5nIGBkaXNwYXRjaEV2ZW50YC4gSW5zaWRlIHRoZSBoYW5kbGVyLCB3ZVxuICAgICAgLy8gY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjay5cblxuXG4gICAgICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gICAgICBmdW5jdGlvbiBjYWxsQ2FsbGJhY2soKSB7XG4gICAgICAgIGRpZENhbGwgPSB0cnVlO1xuICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpO1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTtcbiAgICAgICAgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICAgIH0gLy8gQ3JlYXRlIGEgZ2xvYmFsIGVycm9yIGV2ZW50IGhhbmRsZXIuIFdlIHVzZSB0aGlzIHRvIGNhcHR1cmUgdGhlIHZhbHVlXG4gICAgICAvLyB0aGF0IHdhcyB0aHJvd24uIEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIGVycm9yIGhhbmRsZXIgd2lsbCBmaXJlIG1vcmVcbiAgICAgIC8vIHRoYW4gb25jZTsgZm9yIGV4YW1wbGUsIGlmIG5vbi1SZWFjdCBjb2RlIGFsc28gY2FsbHMgYGRpc3BhdGNoRXZlbnRgXG4gICAgICAvLyBhbmQgYSBoYW5kbGVyIGZvciB0aGF0IGV2ZW50IHRocm93cy4gV2Ugc2hvdWxkIGJlIHJlc2lsaWVudCB0byBtb3N0IG9mXG4gICAgICAvLyB0aG9zZSBjYXNlcy4gRXZlbiBpZiBvdXIgZXJyb3IgZXZlbnQgaGFuZGxlciBmaXJlcyBtb3JlIHRoYW4gb25jZSwgdGhlXG4gICAgICAvLyBsYXN0IGVycm9yIGV2ZW50IGlzIGFsd2F5cyB1c2VkLiBJZiB0aGUgY2FsbGJhY2sgYWN0dWFsbHkgZG9lcyBlcnJvcixcbiAgICAgIC8vIHdlIGtub3cgdGhhdCB0aGUgbGFzdCBlcnJvciBldmVudCBpcyB0aGUgY29ycmVjdCBvbmUsIGJlY2F1c2UgaXQncyBub3RcbiAgICAgIC8vIHBvc3NpYmxlIGZvciBhbnl0aGluZyBlbHNlIHRvIGhhdmUgaGFwcGVuZWQgaW4gYmV0d2VlbiBvdXIgY2FsbGJhY2tcbiAgICAgIC8vIGVycm9yaW5nIGFuZCB0aGUgY29kZSB0aGF0IGZvbGxvd3MgdGhlIGBkaXNwYXRjaEV2ZW50YCBjYWxsIGJlbG93LiBJZlxuICAgICAgLy8gdGhlIGNhbGxiYWNrIGRvZXNuJ3QgZXJyb3IsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgd2FzIGZpcmVkLCB3ZSBrbm93IHRvXG4gICAgICAvLyBpZ25vcmUgaXQgYmVjYXVzZSBgZGlkRXJyb3JgIHdpbGwgYmUgZmFsc2UsIGFzIGRlc2NyaWJlZCBhYm92ZS5cblxuXG4gICAgICB2YXIgZXJyb3I7IC8vIFVzZSB0aGlzIHRvIHRyYWNrIHdoZXRoZXIgdGhlIGVycm9yIGV2ZW50IGlzIGV2ZXIgY2FsbGVkLlxuXG4gICAgICB2YXIgZGlkU2V0RXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBpc0Nyb3NzT3JpZ2luRXJyb3IgPSBmYWxzZTtcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlV2luZG93RXJyb3IoZXZlbnQpIHtcbiAgICAgICAgZXJyb3IgPSBldmVudC5lcnJvcjtcbiAgICAgICAgZGlkU2V0RXJyb3IgPSB0cnVlO1xuXG4gICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCAmJiBldmVudC5jb2xubyA9PT0gMCAmJiBldmVudC5saW5lbm8gPT09IDApIHtcbiAgICAgICAgICBpc0Nyb3NzT3JpZ2luRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAvLyBTb21lIG90aGVyIGVycm9yIGhhbmRsZXIgaGFzIHByZXZlbnRlZCBkZWZhdWx0LlxuICAgICAgICAgIC8vIEJyb3dzZXJzIHNpbGVuY2UgdGhlIGVycm9yIHJlcG9ydCBpZiB0aGlzIGhhcHBlbnMuXG4gICAgICAgICAgLy8gV2UnbGwgcmVtZW1iZXIgdGhpcyB0byBsYXRlciBkZWNpZGUgd2hldGhlciB0byBsb2cgaXQgb3Igbm90LlxuICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoaW5uZXIpIHsvLyBJZ25vcmUuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhIGZha2UgZXZlbnQgdHlwZS5cblxuXG4gICAgICB2YXIgZXZ0VHlwZSA9IFwicmVhY3QtXCIgKyAobmFtZSA/IG5hbWUgOiAnaW52b2tlZ3VhcmRlZGNhbGxiYWNrJyk7IC8vIEF0dGFjaCBvdXIgZXZlbnQgaGFuZGxlcnNcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTsgLy8gU3luY2hyb25vdXNseSBkaXNwYXRjaCBvdXIgZmFrZSBldmVudC4gSWYgdGhlIHVzZXItcHJvdmlkZWQgZnVuY3Rpb25cbiAgICAgIC8vIGVycm9ycywgaXQgd2lsbCB0cmlnZ2VyIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlci5cblxuICAgICAgZXZ0LmluaXRFdmVudChldnRUeXBlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgZmFrZU5vZGUuZGlzcGF0Y2hFdmVudChldnQpO1xuXG4gICAgICBpZiAod2luZG93RXZlbnREZXNjcmlwdG9yKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdldmVudCcsIHdpbmRvd0V2ZW50RGVzY3JpcHRvcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWRDYWxsICYmIGRpZEVycm9yKSB7XG4gICAgICAgIGlmICghZGlkU2V0RXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgZXJyb3JlZCwgYnV0IHRoZSBlcnJvciBldmVudCBuZXZlciBmaXJlZC5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdBbiBlcnJvciB3YXMgdGhyb3duIGluc2lkZSBvbmUgb2YgeW91ciBjb21wb25lbnRzLCBidXQgUmVhY3QgJyArIFwiZG9lc24ndCBrbm93IHdoYXQgaXQgd2FzLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gYnJvd3NlciBcIiArICdmbGFraW5lc3MuIFJlYWN0IGRvZXMgaXRzIGJlc3QgdG8gcHJlc2VydmUgdGhlIFwiUGF1c2Ugb24gJyArICdleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIERldlRvb2xzLCB3aGljaCByZXF1aXJlcyBzb21lICcgKyBcIkRFVi1tb2RlIG9ubHkgdHJpY2tzLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlc2UgZG9uJ3Qgd29yayBpbiBcIiArICd5b3VyIGJyb3dzZXIuIFRyeSB0cmlnZ2VyaW5nIHRoZSBlcnJvciBpbiBwcm9kdWN0aW9uIG1vZGUsICcgKyAnb3Igc3dpdGNoaW5nIHRvIGEgbW9kZXJuIGJyb3dzZXIuIElmIHlvdSBzdXNwZWN0IHRoYXQgdGhpcyBpcyAnICsgJ2FjdHVhbGx5IGFuIGlzc3VlIHdpdGggUmVhY3QsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ3Jvc3NPcmlnaW5FcnJvcikge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXCJBIGNyb3NzLW9yaWdpbiBlcnJvciB3YXMgdGhyb3duLiBSZWFjdCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIFwiICsgJ3RoZSBhY3R1YWwgZXJyb3Igb2JqZWN0IGluIGRldmVsb3BtZW50LiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY3Jvc3NvcmlnaW4tZXJyb3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuXG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcblxuICAgICAgaWYgKCFkaWRDYWxsKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgYW5kIG91ciBldmVudCB3YXMgbm90IGRpc3BhdGNoZWQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY3MzRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjU4NVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxID0gaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbDtcblxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsOyAvLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxuXG52YXIgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG52YXIgcmV0aHJvd0Vycm9yID0gbnVsbDtcbnZhciByZXBvcnRlciA9IHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn07XG4vKipcbiAqIENhbGwgYSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LlxuICogUmV0dXJucyBhbiBlcnJvciBpZiBpdCB0aHJvd3MsIG90aGVyd2lzZSBudWxsLlxuICpcbiAqIEluIHByb2R1Y3Rpb24sIHRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSB0cnktY2F0Y2guIFRoZSByZWFzb24gd2UgZG9uJ3RcbiAqIHVzZSBhIHRyeS1jYXRjaCBkaXJlY3RseSBpcyBzbyB0aGF0IHdlIGNhbiBzd2FwIG91dCBhIGRpZmZlcmVudFxuICogaW1wbGVtZW50YXRpb24gaW4gREVWIG1vZGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGhhc0Vycm9yID0gZmFsc2U7XG4gIGNhdWdodEVycm9yID0gbnVsbDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpO1xufVxuLyoqXG4gKiBTYW1lIGFzIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLCBpdCBzdG9yZXNcbiAqIGl0IGluIGEgZ2xvYmFsIHNvIGl0IGNhbiBiZSByZXRocm93biBieSBgcmV0aHJvd0NhdWdodEVycm9yYCBsYXRlci5cbiAqIFRPRE86IFNlZSBpZiBjYXVnaHRFcnJvciBhbmQgcmV0aHJvd0Vycm9yIGNhbiBiZSB1bmlmaWVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICBpZiAoIWhhc1JldGhyb3dFcnJvcikge1xuICAgICAgaGFzUmV0aHJvd0Vycm9yID0gdHJ1ZTtcbiAgICAgIHJldGhyb3dFcnJvciA9IGVycm9yO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0aGUgZmlyc3QgZXJyb3Igd2hpY2hcbiAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAqL1xuXG5mdW5jdGlvbiByZXRocm93Q2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNSZXRocm93RXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSByZXRocm93RXJyb3I7XG4gICAgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG4gICAgcmV0aHJvd0Vycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuZnVuY3Rpb24gaGFzQ2F1Z2h0RXJyb3IoKSB7XG4gIHJldHVybiBoYXNFcnJvcjtcbn1cbmZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyQ2F1Z2h0RXJyb3Igd2FzIGNhbGxlZCBidXQgbm8gZXJyb3Igd2FzIGNhcHR1cmVkLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgY3VycmVudGx5IHNoYXJlZCBhbmQgYXNzdW1lZCB0byBiZSBzdGF0ZWxlc3MuXG4gKiBJZiB0aGlzIGJlY29tZXMgYW4gYWN0dWFsIE1hcCwgdGhhdCB3aWxsIGJyZWFrLlxuICovXG5mdW5jdGlvbiBnZXQoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxzO1xufVxuZnVuY3Rpb24gaGFzKGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscyAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAga2V5Ll9yZWFjdEludGVybmFscyA9IHZhbHVlO1xufVxuXG4vLyBEb24ndCBjaGFuZ2UgdGhlc2UgdHdvIHZhbHVlcy4gVGhleSdyZSB1c2VkIGJ5IFJlYWN0IERldiBUb29scy5cbnZhciBOb0ZsYWdzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIFBlcmZvcm1lZFdvcmsgPVxuLyogICAgICAgICAgICAgICAgKi9cbjE7IC8vIFlvdSBjYW4gY2hhbmdlIHRoZSByZXN0IChhbmQgYWRkIG1vcmUpLlxuXG52YXIgUGxhY2VtZW50ID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBVcGRhdGUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG40O1xudmFyIENoaWxkRGVsZXRpb24gPVxuLyogICAgICAgICAgICAgICAgKi9cbjE2O1xudmFyIENvbnRlbnRSZXNldCA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjMyO1xudmFyIENhbGxiYWNrID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjY0O1xudmFyIERpZENhcHR1cmUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjEyODtcbnZhciBGb3JjZUNsaWVudFJlbmRlciA9XG4vKiAgICAgICAgICAgICovXG4yNTY7XG52YXIgUmVmID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTEyO1xudmFyIFNuYXBzaG90ID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjEwMjQ7XG52YXIgUGFzc2l2ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBIeWRyYXRpbmcgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIFZpc2liaWxpdHkgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjgxOTI7XG52YXIgU3RvcmVDb25zaXN0ZW5jeSA9XG4vKiAgICAgICAgICAgICAqL1xuMTYzODQ7XG52YXIgTGlmZWN5Y2xlRWZmZWN0TWFzayA9IFBhc3NpdmUgfCBVcGRhdGUgfCBDYWxsYmFjayB8IFJlZiB8IFNuYXBzaG90IHwgU3RvcmVDb25zaXN0ZW5jeTsgLy8gVW5pb24gb2YgYWxsIGNvbW1pdCBmbGFncyAoZmxhZ3Mgd2l0aCB0aGUgbGlmZXRpbWUgb2YgYSBwYXJ0aWN1bGFyIGNvbW1pdClcblxudmFyIEhvc3RFZmZlY3RNYXNrID1cbi8qICAgICAgICAgICAgICAgKi9cbjMyNzY3OyAvLyBUaGVzZSBhcmUgbm90IHJlYWxseSBzaWRlIGVmZmVjdHMsIGJ1dCB3ZSBzdGlsbCByZXVzZSB0aGlzIGZpZWxkLlxuXG52YXIgSW5jb21wbGV0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMzI3Njg7XG52YXIgU2hvdWxkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAqL1xuNjU1MzY7XG52YXIgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSA9XG4vKiAqL1xuMTMxMDcyO1xudmFyIEZvcmtlZCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwNDg1NzY7IC8vIFN0YXRpYyB0YWdzIGRlc2NyaWJlIGFzcGVjdHMgb2YgYSBmaWJlciB0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8gYSByZW5kZXIsXG4vLyBlLmcuIGEgZmliZXIgdXNlcyBhIHBhc3NpdmUgZWZmZWN0IChldmVuIGlmIHRoZXJlIGFyZSBubyB1cGRhdGVzIG9uIHRoaXMgcGFydGljdWxhciByZW5kZXIpLlxuLy8gVGhpcyBlbmFibGVzIHVzIHRvIGRlZmVyIG1vcmUgd29yayBpbiB0aGUgdW5tb3VudCBjYXNlLFxuLy8gc2luY2Ugd2UgY2FuIGRlZmVyIHRyYXZlcnNpbmcgdGhlIHRyZWUgZHVyaW5nIGxheW91dCB0byBsb29rIGZvciBQYXNzaXZlIGVmZmVjdHMsXG4vLyBhbmQgaW5zdGVhZCByZWx5IG9uIHRoZSBzdGF0aWMgZmxhZyBhcyBhIHNpZ25hbCB0aGF0IHRoZXJlIG1heSBiZSBjbGVhbnVwIHdvcmsuXG5cbnZhciBSZWZTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yMDk3MTUyO1xudmFyIExheW91dFN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjQxOTQzMDQ7XG52YXIgUGFzc2l2ZVN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAqL1xuODM4ODYwODsgLy8gVGhlc2UgZmxhZ3MgYWxsb3cgdXMgdG8gdHJhdmVyc2UgdG8gZmliZXJzIHRoYXQgaGF2ZSBlZmZlY3RzIG9uIG1vdW50XG4vLyB3aXRob3V0IHRyYXZlcnNpbmcgdGhlIGVudGlyZSB0cmVlIGFmdGVyIGV2ZXJ5IGNvbW1pdCBmb3Jcbi8vIGRvdWJsZSBpbnZva2luZ1xuXG52YXIgTW91bnRMYXlvdXREZXYgPVxuLyogICAgICAgICAgICAgICAqL1xuMTY3NzcyMTY7XG52YXIgTW91bnRQYXNzaXZlRGV2ID1cbi8qICAgICAgICAgICAgICAqL1xuMzM1NTQ0MzI7IC8vIEdyb3VwcyBvZiBmbGFncyB0aGF0IGFyZSB1c2VkIGluIHRoZSBjb21taXQgcGhhc2UgdG8gc2tpcCBvdmVyIHRyZWVzIHRoYXRcbi8vIGRvbid0IGNvbnRhaW4gZWZmZWN0cywgYnkgY2hlY2tpbmcgc3VidHJlZUZsYWdzLlxuXG52YXIgQmVmb3JlTXV0YXRpb25NYXNrID0gLy8gVE9ETzogUmVtb3ZlIFVwZGF0ZSBmbGFnIGZyb20gYmVmb3JlIG11dGF0aW9uIHBoYXNlIGJ5IHJlLWxhbmRpbmcgVmlzaWJpbGl0eVxuLy8gZmxhZyBsb2dpYyAoc2VlICMyMDA0MylcblVwZGF0ZSB8IFNuYXBzaG90IHwgKCAwKTtcbnZhciBNdXRhdGlvbk1hc2sgPSBQbGFjZW1lbnQgfCBVcGRhdGUgfCBDaGlsZERlbGV0aW9uIHwgQ29udGVudFJlc2V0IHwgUmVmIHwgSHlkcmF0aW5nIHwgVmlzaWJpbGl0eTtcbnZhciBMYXlvdXRNYXNrID0gVXBkYXRlIHwgQ2FsbGJhY2sgfCBSZWYgfCBWaXNpYmlsaXR5OyAvLyBUT0RPOiBTcGxpdCBpbnRvIFBhc3NpdmVNb3VudE1hc2sgYW5kIFBhc3NpdmVVbm1vdW50TWFza1xuXG52YXIgUGFzc2l2ZU1hc2sgPSBQYXNzaXZlIHwgQ2hpbGREZWxldGlvbjsgLy8gVW5pb24gb2YgdGFncyB0aGF0IGRvbid0IGdldCByZXNldCBvbiBjbG9uZXMuXG4vLyBUaGlzIGFsbG93cyBjZXJ0YWluIGNvbmNlcHRzIHRvIHBlcnNpc3Qgd2l0aG91dCByZWNhbGN1bGF0aW5nIHRoZW0sXG4vLyBlLmcuIHdoZXRoZXIgYSBzdWJ0cmVlIGNvbnRhaW5zIHBhc3NpdmUgZWZmZWN0cyBvciBwb3J0YWxzLlxuXG52YXIgU3RhdGljTWFzayA9IExheW91dFN0YXRpYyB8IFBhc3NpdmVTdGF0aWMgfCBSZWZTdGF0aWM7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xuZnVuY3Rpb24gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikge1xuICB2YXIgbm9kZSA9IGZpYmVyO1xuICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBmaWJlcjtcblxuICBpZiAoIWZpYmVyLmFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhpcyBtaWdodCBiZSBhIG5ldyB0cmVlIHRoYXQgaXNuJ3QgaW5zZXJ0ZWRcbiAgICAvLyB5ZXQuIElmIGl0IGlzLCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHBlbmRpbmcgaW5zZXJ0aW9uIGVmZmVjdCBvbiBpdC5cbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlO1xuXG4gICAgZG8ge1xuICAgICAgbm9kZSA9IG5leHROb2RlO1xuXG4gICAgICBpZiAoKG5vZGUuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBpbnNlcnRpb24gb3IgaW4tcHJvZ3Jlc3MgaHlkcmF0aW9uLiBUaGUgbmVhcmVzdCBwb3NzaWJsZVxuICAgICAgICAvLyBtb3VudGVkIGZpYmVyIGlzIHRoZSBwYXJlbnQgYnV0IHdlIG5lZWQgdG8gY29udGludWUgdG8gZmlndXJlIG91dFxuICAgICAgICAvLyBpZiB0aGF0IG9uZSBpcyBzdGlsbCBtb3VudGVkLlxuICAgICAgICBuZWFyZXN0TW91bnRlZCA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0Tm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5leHROb2RlKTtcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAobm9kZS5yZXR1cm4pIHtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAobm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgdGhpcyB3YXMgYSBuZXN0ZWQgSG9zdFJvb3Qgd2hlbiB1c2VkIHdpdGhcbiAgICAvLyByZW5kZXJDb250YWluZXJJbnRvU3VidHJlZS5cbiAgICByZXR1cm4gbmVhcmVzdE1vdW50ZWQ7XG4gIH0gLy8gSWYgd2UgZGlkbid0IGhpdCB0aGUgcm9vdCwgdGhhdCBtZWFucyB0aGF0IHdlJ3JlIGluIGFuIGRpc2Nvbm5lY3RlZCB0cmVlXG4gIC8vIHRoYXQgaGFzIGJlZW4gdW5tb3VudGVkLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBzdXNwZW5zZVN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKGZpYmVyKSB7XG4gIHJldHVybiBmaWJlci50YWcgPT09IEhvc3RSb290ID8gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gOiBudWxsO1xufVxuZnVuY3Rpb24gaXNGaWJlck1vdW50ZWQoZmliZXIpIHtcbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cbmZ1bmN0aW9uIGlzTW91bnRlZChjb21wb25lbnQpIHtcbiAge1xuICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdmFyIG93bmVyRmliZXIgPSBvd25lcjtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG93bmVyRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoIWluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcikge1xuICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGlzTW91bnRlZCBpbnNpZGUgaXRzIHJlbmRlcigpIGZ1bmN0aW9uLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lckZpYmVyKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICBpZiAoIWZpYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7XG4gIGlmIChnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSAhPT0gZmliZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmICghYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGVuIHdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiBpdCBpcyBtb3VudGVkLlxuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IGZpYmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gSWYgd2UgaGF2ZSB0d28gcG9zc2libGUgYnJhbmNoZXMsIHdlJ2xsIHdhbGsgYmFja3dhcmRzIHVwIHRvIHRoZSByb290XG4gIC8vIHRvIHNlZSB3aGF0IHBhdGggdGhlIHJvb3QgcG9pbnRzIHRvLiBPbiB0aGUgd2F5IHdlIG1heSBoaXQgb25lIG9mIHRoZVxuICAvLyBzcGVjaWFsIGNhc2VzIGFuZCB3ZSdsbCBkZWFsIHdpdGggdGhlbS5cblxuXG4gIHZhciBhID0gZmliZXI7XG4gIHZhciBiID0gYWx0ZXJuYXRlO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHBhcmVudEEgPSBhLnJldHVybjtcblxuICAgIGlmIChwYXJlbnRBID09PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBhdCB0aGUgcm9vdC5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnRCID0gcGFyZW50QS5hbHRlcm5hdGU7XG5cbiAgICBpZiAocGFyZW50QiA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gYWx0ZXJuYXRlLiBUaGlzIGlzIGFuIHVudXN1YWwgY2FzZS4gQ3VycmVudGx5LCBpdCBvbmx5XG4gICAgICAvLyBoYXBwZW5zIHdoZW4gYSBTdXNwZW5zZSBjb21wb25lbnQgaXMgaGlkZGVuLiBBbiBleHRyYSBmcmFnbWVudCBmaWJlclxuICAgICAgLy8gaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0aGUgU3VzcGVuc2UgZmliZXIgYW5kIGl0cyBjaGlsZHJlbi4gU2tpcFxuICAgICAgLy8gb3ZlciB0aGlzIGV4dHJhIGZyYWdtZW50IGZpYmVyIGFuZCBwcm9jZWVkIHRvIHRoZSBuZXh0IHBhcmVudC5cbiAgICAgIHZhciBuZXh0UGFyZW50ID0gcGFyZW50QS5yZXR1cm47XG5cbiAgICAgIGlmIChuZXh0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGEgPSBiID0gbmV4dFBhcmVudDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSdyZSBhdCB0aGUgcm9vdC5cblxuXG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIGJvdGggY29waWVzIG9mIHRoZSBwYXJlbnQgZmliZXIgcG9pbnQgdG8gdGhlIHNhbWUgY2hpbGQsIHdlIGNhblxuICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBjaGlsZCBpcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBiYWlsb3V0IG9uIGxvd1xuICAgIC8vIHByaW9yaXR5OiB0aGUgYmFpbGVkIG91dCBmaWJlcidzIGNoaWxkIHJldXNlcyB0aGUgY3VycmVudCBjaGlsZC5cblxuXG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCA9PT0gYikge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBCIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGFsdGVybmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH0gLy8gV2Ugc2hvdWxkIG5ldmVyIGhhdmUgYW4gYWx0ZXJuYXRlIGZvciBhbnkgbW91bnRpbmcgbm9kZS4gU28gdGhlIG9ubHlcbiAgICAgIC8vIHdheSB0aGlzIGNvdWxkIHBvc3NpYmx5IGhhcHBlbiBpcyBpZiB0aGlzIHdhcyB1bm1vdW50ZWQsIGlmIGF0IGFsbC5cblxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAoYS5yZXR1cm4gIT09IGIucmV0dXJuKSB7XG4gICAgICAvLyBUaGUgcmV0dXJuIHBvaW50ZXIgb2YgQSBhbmQgdGhlIHJldHVybiBwb2ludGVyIG9mIEIgcG9pbnQgdG8gZGlmZmVyZW50XG4gICAgICAvLyBmaWJlcnMuIFdlIGFzc3VtZSB0aGF0IHJldHVybiBwb2ludGVycyBuZXZlciBjcmlzcy1jcm9zcywgc28gQSBtdXN0XG4gICAgICAvLyBiZWxvbmcgdG8gdGhlIGNoaWxkIHNldCBvZiBBLnJldHVybiwgYW5kIEIgbXVzdCBiZWxvbmcgdG8gdGhlIGNoaWxkXG4gICAgICAvLyBzZXQgb2YgQi5yZXR1cm4uXG4gICAgICBhID0gcGFyZW50QTtcbiAgICAgIGIgPSBwYXJlbnRCO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmV0dXJuIHBvaW50ZXJzIHBvaW50IHRvIHRoZSBzYW1lIGZpYmVyLiBXZSdsbCBoYXZlIHRvIHVzZSB0aGVcbiAgICAgIC8vIGRlZmF1bHQsIHNsb3cgcGF0aDogc2NhbiB0aGUgY2hpbGQgc2V0cyBvZiBlYWNoIHBhcmVudCBhbHRlcm5hdGUgdG8gc2VlXG4gICAgICAvLyB3aGljaCBjaGlsZCBiZWxvbmdzIHRvIHdoaWNoIHNldC5cbiAgICAgIC8vXG4gICAgICAvLyBTZWFyY2ggcGFyZW50IEEncyBjaGlsZCBzZXRcbiAgICAgIHZhciBkaWRGaW5kQ2hpbGQgPSBmYWxzZTtcbiAgICAgIHZhciBfY2hpbGQgPSBwYXJlbnRBLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgLy8gU2VhcmNoIHBhcmVudCBCJ3MgY2hpbGQgc2V0XG4gICAgICAgIF9jaGlsZCA9IHBhcmVudEIuY2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGlkRmluZENoaWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaGlsZCB3YXMgbm90IGZvdW5kIGluIGVpdGhlciBwYXJlbnQgc2V0LiBUaGlzIGluZGljYXRlcyBhIGJ1ZyAnICsgJ2luIFJlYWN0IHJlbGF0ZWQgdG8gdGhlIHJldHVybiBwb2ludGVyLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhLmFsdGVybmF0ZSAhPT0gYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmV0dXJuIGZpYmVycyBzaG91bGQgYWx3YXlzIGJlIGVhY2ggb3RoZXJzJyBhbHRlcm5hdGVzLiBcIiArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfSAvLyBJZiB0aGUgcm9vdCBpcyBub3QgYSBob3N0IGNvbnRhaW5lciwgd2UncmUgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZS4gSS5lLlxuICAvLyB1bm1vdW50ZWQuXG5cblxuICBpZiAoYS50YWcgIT09IEhvc3RSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cblxuICBpZiAoYS5zdGF0ZU5vZGUuY3VycmVudCA9PT0gYSkge1xuICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gT3RoZXJ3aXNlIEIgaGFzIHRvIGJlIGN1cnJlbnQgYnJhbmNoLlxuXG5cbiAgcmV0dXJuIGFsdGVybmF0ZTtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG4gIHJldHVybiBjdXJyZW50UGFyZW50ICE9PSBudWxsID8gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGN1cnJlbnRQYXJlbnQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKG5vZGUpIHtcbiAgLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICB2YXIgbWF0Y2ggPSBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwoY2hpbGQpO1xuXG4gICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuXG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuICByZXR1cm4gY3VycmVudFBhcmVudCAhPT0gbnVsbCA/IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwoY3VycmVudFBhcmVudCkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKG5vZGUpIHtcbiAgLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICBpZiAoY2hpbGQudGFnICE9PSBIb3N0UG9ydGFsKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGNoaWxkKTtcblxuICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVGhpcyBtb2R1bGUgb25seSBleGlzdHMgYXMgYW4gRVNNIHdyYXBwZXIgYXJvdW5kIHRoZSBleHRlcm5hbCBDb21tb25KU1xudmFyIHNjaGVkdWxlQ2FsbGJhY2sgPSBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbnZhciBjYW5jZWxDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbnZhciBzaG91bGRZaWVsZCA9IFNjaGVkdWxlci51bnN0YWJsZV9zaG91bGRZaWVsZDtcbnZhciByZXF1ZXN0UGFpbnQgPSBTY2hlZHVsZXIudW5zdGFibGVfcmVxdWVzdFBhaW50O1xudmFyIG5vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG52YXIgZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBTY2hlZHVsZXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw7XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk7XG52YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk7XG52YXIgTG93UHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTG93UHJpb3JpdHk7XG52YXIgSWRsZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0lkbGVQcmlvcml0eTtcbi8vIHRoaXMgZG9lc24ndCBhY3R1YWxseSBleGlzdCBvbiB0aGUgc2NoZWR1bGVyLCBidXQgaXQgKmRvZXMqXG4vLyBvbiBzY2hlZHVsZXIvdW5zdGFibGVfbW9jaywgd2hpY2ggd2UnbGwgbmVlZCBmb3IgaW50ZXJuYWwgdGVzdGluZ1xudmFyIHVuc3RhYmxlX3lpZWxkVmFsdWUgPSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZTtcbnZhciB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZTtcblxudmFyIHJlbmRlcmVySUQgPSBudWxsO1xudmFyIGluamVjdGVkSG9vayA9IG51bGw7XG52YXIgaW5qZWN0ZWRQcm9maWxpbmdIb29rcyA9IG51bGw7XG52YXIgaGFzTG9nZ2VkRXJyb3IgPSBmYWxzZTtcbnZhciBpc0RldlRvb2xzUHJlc2VudCA9IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnO1xuZnVuY3Rpb24gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscykge1xuICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBObyBEZXZUb29sc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBob29rID0gX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG4gIGlmIChob29rLmlzRGlzYWJsZWQpIHtcbiAgICAvLyBUaGlzIGlzbid0IGEgcmVhbCBwcm9wZXJ0eSBvbiB0aGUgaG9vaywgYnV0IGl0IGNhbiBiZSBzZXQgdG8gb3B0IG91dFxuICAgIC8vIG9mIERldlRvb2xzIGludGVncmF0aW9uIGFuZCBhc3NvY2lhdGVkIHdhcm5pbmdzIGFuZCBsb2dzLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzg3N1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFob29rLnN1cHBvcnRzRmliZXIpIHtcbiAgICB7XG4gICAgICBlcnJvcignVGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFJlYWN0IERldlRvb2xzIGlzIHRvbyBvbGQgYW5kIHdpbGwgbm90IHdvcmsgJyArICd3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUmVhY3QuIFBsZWFzZSB1cGRhdGUgUmVhY3QgRGV2VG9vbHMuICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyk7XG4gICAgfSAvLyBEZXZUb29scyBleGlzdHMsIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3Qgc3VwcG9ydCBGaWJlci5cblxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgIC8vIENvbmRpdGlvbmFsbHkgaW5qZWN0IHRoZXNlIGhvb2tzIG9ubHkgaWYgVGltZWxpbmUgcHJvZmlsZXIgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQuXG4gICAgICAvLyBUaGlzIGdpdmVzIERldlRvb2xzIGEgd2F5IHRvIGZlYXR1cmUgZGV0ZWN0IHRoYXQgaXNuJ3QgdGllZCB0byB2ZXJzaW9uIG51bWJlclxuICAgICAgLy8gKHNpbmNlIHByb2ZpbGluZyBhbmQgdGltZWxpbmUgYXJlIGNvbnRyb2xsZWQgYnkgZGlmZmVyZW50IGZlYXR1cmUgZmxhZ3MpLlxuICAgICAgaW50ZXJuYWxzID0gYXNzaWduKHt9LCBpbnRlcm5hbHMsIHtcbiAgICAgICAgZ2V0TGFuZUxhYmVsTWFwOiBnZXRMYW5lTGFiZWxNYXAsXG4gICAgICAgIGluamVjdFByb2ZpbGluZ0hvb2tzOiBpbmplY3RQcm9maWxpbmdIb29rc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyZXJJRCA9IGhvb2suaW5qZWN0KGludGVybmFscyk7IC8vIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGluamVjdGVkLCBzbyBub3cgaXQgaXMgc2FmZSB0byBzZXQgdXAgaG9va3MuXG5cbiAgICBpbmplY3RlZEhvb2sgPSBob29rO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBDYXRjaCBhbGwgZXJyb3JzIGJlY2F1c2UgaXQgaXMgdW5zYWZlIHRvIHRocm93IGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcy4nLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChob29rLmNoZWNrRENFKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcmVhbCBEZXZUb29scy5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGxpa2VseSBhIGhvb2sgaW5zdGFsbGVkIGJ5IEZhc3QgUmVmcmVzaCBydW50aW1lLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gb25TY2hlZHVsZVJvb3Qocm9vdCwgY2hpbGRyZW4pIHtcbiAge1xuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCBjaGlsZHJlbik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCAhaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0Um9vdChyb290LCBldmVudFByaW9yaXR5KSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgZGlkRXJyb3IgPSAocm9vdC5jdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IERpZENhcHR1cmU7XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50UHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSWRsZVByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHNjaGVkdWxlclByaW9yaXR5LCBkaWRFcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgdW5kZWZpbmVkLCBkaWRFcnJvcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uUG9zdENvbW1pdFJvb3Qocm9vdCkge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Qb3N0Q29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0VW5tb3VudChmaWJlcikge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50KHJlbmRlcmVySUQsIGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMobmV3SXNTdHJpY3RNb2RlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIHVuc3RhYmxlX3lpZWxkVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFdlJ3JlIGluIGEgdGVzdCBiZWNhdXNlIFNjaGVkdWxlci51bnN0YWJsZV95aWVsZFZhbHVlIG9ubHkgZXhpc3RzXG4gICAgICAvLyBpbiBTY2hlZHVsZXJNb2NrLiBUbyByZWR1Y2UgdGhlIG5vaXNlIGluIHN0cmljdCBtb2RlIHRlc3RzLFxuICAgICAgLy8gc3VwcHJlc3Mgd2FybmluZ3MgYW5kIGRpc2FibGUgc2NoZWR1bGVyIHlpZWxkaW5nIGR1cmluZyB0aGUgZG91YmxlIHJlbmRlclxuICAgICAgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUobmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIHNldFN1cHByZXNzV2FybmluZyhuZXdJc1N0cmljdE1vZGUpO1xuICAgIH1cblxuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5zZXRTdHJpY3RNb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZShyZW5kZXJlcklELCBuZXdJc1N0cmljdE1vZGUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gUHJvZmlsZXIgQVBJIGhvb2tzXG5cbmZ1bmN0aW9uIGluamVjdFByb2ZpbGluZ0hvb2tzKHByb2ZpbGluZ0hvb2tzKSB7XG4gIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBwcm9maWxpbmdIb29rcztcbn1cblxuZnVuY3Rpb24gZ2V0TGFuZUxhYmVsTWFwKCkge1xuICB7XG4gICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgbGFuZSA9IDE7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgVG90YWxMYW5lczsgaW5kZXgrKykge1xuICAgICAgdmFyIGxhYmVsID0gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpO1xuICAgICAgbWFwLnNldChsYW5lLCBsYWJlbCk7XG4gICAgICBsYW5lICo9IDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbW1pdFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZmliZXIsIHdha2VhYmxlLCBsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFN1c3BlbmRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50U3VzcGVuZGVkKGZpYmVyLCB3YWtlYWJsZSwgbGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlcllpZWxkZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIE5vTW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDsgLy8gVE9ETzogUmVtb3ZlIENvbmN1cnJlbnRNb2RlIGJ5IHJlYWRpbmcgZnJvbSB0aGUgcm9vdCB0YWcgaW5zdGVhZFxuXG52YXIgQ29uY3VycmVudE1vZGUgPVxuLyogICAgICAgICAgICAgICAgICovXG4xO1xudmFyIFByb2ZpbGVNb2RlID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBTdHJpY3RMZWdhY3lNb2RlID1cbi8qICAgICAgICAgICAgICAgKi9cbjg7XG52YXIgU3RyaWN0RWZmZWN0c01vZGUgPVxuLyogICAgICAgICAgICAgICovXG4xNjtcblxuLy8gVE9ETzogVGhpcyBpcyBwcmV0dHkgd2VsbCBzdXBwb3J0ZWQgYnkgYnJvd3NlcnMuIE1heWJlIHdlIGNhbiBkcm9wIGl0LlxudmFyIGNsejMyID0gTWF0aC5jbHozMiA/IE1hdGguY2x6MzIgOiBjbHozMkZhbGxiYWNrOyAvLyBDb3VudCBsZWFkaW5nIHplcm9zLlxuLy8gQmFzZWQgb246XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL2NsejMyXG5cbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcblxuZnVuY3Rpb24gY2x6MzJGYWxsYmFjayh4KSB7XG4gIHZhciBhc1VpbnQgPSB4ID4+PiAwO1xuXG4gIGlmIChhc1VpbnQgPT09IDApIHtcbiAgICByZXR1cm4gMzI7XG4gIH1cblxuICByZXR1cm4gMzEgLSAobG9nKGFzVWludCkgLyBMTjIgfCAwKSB8IDA7XG59XG5cbi8vIElmIHRob3NlIHZhbHVlcyBhcmUgY2hhbmdlZCB0aGF0IHBhY2thZ2Ugc2hvdWxkIGJlIHJlYnVpbHQgYW5kIHJlZGVwbG95ZWQuXG5cbnZhciBUb3RhbExhbmVzID0gMzE7XG52YXIgTm9MYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIE5vTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgU3luY0xhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTtcbnZhciBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lID1cbi8qICAgICovXG4yO1xudmFyIElucHV0Q29udGludW91c0xhbmUgPVxuLyogICAgICAgICAgICAgKi9cbjQ7XG52YXIgRGVmYXVsdEh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAqL1xuODtcbnZhciBEZWZhdWx0TGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4xNjtcbnZhciBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgVHJhbnNpdGlvbkxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE5NDI0MDtcbnZhciBUcmFuc2l0aW9uTGFuZTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgVHJhbnNpdGlvbkxhbmUyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEyODtcbnZhciBUcmFuc2l0aW9uTGFuZTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjU2O1xudmFyIFRyYW5zaXRpb25MYW5lNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7XG52YXIgVHJhbnNpdGlvbkxhbmU1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwMjQ7XG52YXIgVHJhbnNpdGlvbkxhbmU2ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjIwNDg7XG52YXIgVHJhbnNpdGlvbkxhbmU3ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVHJhbnNpdGlvbkxhbmU4ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgxOTI7XG52YXIgVHJhbnNpdGlvbkxhbmU5ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE2Mzg0O1xudmFyIFRyYW5zaXRpb25MYW5lMTAgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4zMjc2ODtcbnZhciBUcmFuc2l0aW9uTGFuZTExID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjU1MzY7XG52YXIgVHJhbnNpdGlvbkxhbmUxMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEzMTA3MjtcbnZhciBUcmFuc2l0aW9uTGFuZTEzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjYyMTQ0O1xudmFyIFRyYW5zaXRpb25MYW5lMTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG41MjQyODg7XG52YXIgVHJhbnNpdGlvbkxhbmUxNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwNDg1NzY7XG52YXIgVHJhbnNpdGlvbkxhbmUxNiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjIwOTcxNTI7XG52YXIgUmV0cnlMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTMwMDIzNDI0O1xudmFyIFJldHJ5TGFuZTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG40MTk0MzA0O1xudmFyIFJldHJ5TGFuZTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG44Mzg4NjA4O1xudmFyIFJldHJ5TGFuZTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xNjc3NzIxNjtcbnZhciBSZXRyeUxhbmU0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMzM1NTQ0MzI7XG52YXIgUmV0cnlMYW5lNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY3MTA4ODY0O1xudmFyIFNvbWVSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xudmFyIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgKi9cbjEzNDIxNzcyODtcbnZhciBOb25JZGxlTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4yNjg0MzU0NTU7XG52YXIgSWRsZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAqL1xuMjY4NDM1NDU2O1xudmFyIElkbGVMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUzNjg3MDkxMjtcbnZhciBPZmZzY3JlZW5MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMDczNzQxODI0OyAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBleHBlcmltZW50YWwgdGltZWxpbmUgKHJlYWN0LWRldnRvb2xzLXRpbWVsaW5lKVxuLy8gSXQgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBMYW5lcyB2YWx1ZXMgYWJvdmUuXG5cbmZ1bmN0aW9uIGdldExhYmVsRm9yTGFuZShsYW5lKSB7XG4gIHtcbiAgICBpZiAobGFuZSAmIFN5bmNMYW5lKSB7XG4gICAgICByZXR1cm4gJ1N5bmMnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdJbnB1dENvbnRpbnVvdXNIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSW5wdXRDb250aW51b3VzTGFuZSkge1xuICAgICAgcmV0dXJuICdJbnB1dENvbnRpbnVvdXMnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgRGVmYXVsdEh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnRGVmYXVsdEh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBEZWZhdWx0TGFuZSkge1xuICAgICAgcmV0dXJuICdEZWZhdWx0JztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ1RyYW5zaXRpb25IeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgVHJhbnNpdGlvbkxhbmVzKSB7XG4gICAgICByZXR1cm4gJ1RyYW5zaXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgUmV0cnlMYW5lcykge1xuICAgICAgcmV0dXJuICdSZXRyeSc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ1NlbGVjdGl2ZUh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJZGxlSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdJZGxlSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElkbGVMYW5lKSB7XG4gICAgICByZXR1cm4gJ0lkbGUnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgcmV0dXJuICdPZmZzY3JlZW4nO1xuICAgIH1cbiAgfVxufVxudmFyIE5vVGltZXN0YW1wID0gLTE7XG52YXIgbmV4dFRyYW5zaXRpb25MYW5lID0gVHJhbnNpdGlvbkxhbmUxO1xudmFyIG5leHRSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xuXG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhsYW5lcykge1xuICBzd2l0Y2ggKGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpKSB7XG4gICAgY2FzZSBTeW5jTGFuZTpcbiAgICAgIHJldHVybiBTeW5jTGFuZTtcblxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgcmV0dXJuIElucHV0Q29udGludW91c0xhbmU7XG5cbiAgICBjYXNlIERlZmF1bHRIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIERlZmF1bHRIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICAgIHJldHVybiBEZWZhdWx0TGFuZTtcblxuICAgIGNhc2UgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgICByZXR1cm4gbGFuZXMgJiBUcmFuc2l0aW9uTGFuZXM7XG5cbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgcmV0dXJuIGxhbmVzICYgUmV0cnlMYW5lcztcblxuICAgIGNhc2UgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBJZGxlSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgICByZXR1cm4gSWRsZUxhbmU7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkxhbmU6XG4gICAgICByZXR1cm4gT2Zmc2NyZWVuTGFuZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH0gLy8gVGhpcyBzaG91bGRuJ3QgYmUgcmVhY2hhYmxlLCBidXQgYXMgYSBmYWxsYmFjaywgcmV0dXJuIHRoZSBlbnRpcmUgYml0bWFzay5cblxuXG4gICAgICByZXR1cm4gbGFuZXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmV4dExhbmVzKHJvb3QsIHdpcExhbmVzKSB7XG4gIC8vIEVhcmx5IGJhaWxvdXQgaWYgdGhlcmUncyBubyBwZW5kaW5nIHdvcmsgbGVmdC5cbiAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuXG4gIGlmIChwZW5kaW5nTGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBuZXh0TGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuICB2YXIgcGluZ2VkTGFuZXMgPSByb290LnBpbmdlZExhbmVzOyAvLyBEbyBub3Qgd29yayBvbiBhbnkgaWRsZSB3b3JrIHVudGlsIGFsbCB0aGUgbm9uLWlkbGUgd29yayBoYXMgZmluaXNoZWQsXG4gIC8vIGV2ZW4gaWYgdGhlIHdvcmsgaXMgc3VzcGVuZGVkLlxuXG4gIHZhciBub25JZGxlUGVuZGluZ0xhbmVzID0gcGVuZGluZ0xhbmVzICYgTm9uSWRsZUxhbmVzO1xuXG4gIGlmIChub25JZGxlUGVuZGluZ0xhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIG5vbklkbGVVbmJsb2NrZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICBpZiAobm9uSWRsZVVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlVW5ibG9ja2VkTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9uSWRsZVBpbmdlZExhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIHBpbmdlZExhbmVzO1xuXG4gICAgICBpZiAobm9uSWRsZVBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKG5vbklkbGVQaW5nZWRMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoZSBvbmx5IHJlbWFpbmluZyB3b3JrIGlzIElkbGUuXG4gICAgdmFyIHVuYmxvY2tlZExhbmVzID0gcGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzO1xuXG4gICAgaWYgKHVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyh1bmJsb2NrZWRMYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwaW5nZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhwaW5nZWRMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgcmVhY2hhYmxlIGlmIHdlJ3JlIHN1c3BlbmRlZFxuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgaW4gdGhpcyBwYXRoIGlmIGEgZmFsbGJhY2sgdGltZXIgaXMgbm90IHNjaGVkdWxlZC5cbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfSAvLyBJZiB3ZSdyZSBhbHJlYWR5IGluIHRoZSBtaWRkbGUgb2YgYSByZW5kZXIsIHN3aXRjaGluZyBsYW5lcyB3aWxsIGludGVycnVwdFxuICAvLyBpdCBhbmQgd2UnbGwgbG9zZSBvdXIgcHJvZ3Jlc3MuIFdlIHNob3VsZCBvbmx5IGRvIHRoaXMgaWYgdGhlIG5ldyBsYW5lcyBhcmVcbiAgLy8gaGlnaGVyIHByaW9yaXR5LlxuXG5cbiAgaWYgKHdpcExhbmVzICE9PSBOb0xhbmVzICYmIHdpcExhbmVzICE9PSBuZXh0TGFuZXMgJiYgLy8gSWYgd2UgYWxyZWFkeSBzdXNwZW5kZWQgd2l0aCBhIGRlbGF5LCB0aGVuIGludGVycnVwdGluZyBpcyBmaW5lLiBEb24ndFxuICAvLyBib3RoZXIgd2FpdGluZyB1bnRpbCB0aGUgcm9vdCBpcyBjb21wbGV0ZS5cbiAgKHdpcExhbmVzICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgdmFyIG5leHRMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShuZXh0TGFuZXMpO1xuICAgIHZhciB3aXBMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSh3aXBMYW5lcyk7XG5cbiAgICBpZiAoIC8vIFRlc3RzIHdoZXRoZXIgdGhlIG5leHQgbGFuZSBpcyBlcXVhbCBvciBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSB3aXBcbiAgICAvLyBvbmUuIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYml0cyBkZWNyZWFzZSBpbiBwcmlvcml0eSBhcyB5b3UgZ28gbGVmdC5cbiAgICBuZXh0TGFuZSA+PSB3aXBMYW5lIHx8IC8vIERlZmF1bHQgcHJpb3JpdHkgdXBkYXRlcyBzaG91bGQgbm90IGludGVycnVwdCB0cmFuc2l0aW9uIHVwZGF0ZXMuIFRoZVxuICAgIC8vIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIGRlZmF1bHQgdXBkYXRlcyBhbmQgdHJhbnNpdGlvbiB1cGRhdGVzIGlzIHRoYXRcbiAgICAvLyBkZWZhdWx0IHVwZGF0ZXMgZG8gbm90IHN1cHBvcnQgcmVmcmVzaCB0cmFuc2l0aW9ucy5cbiAgICBuZXh0TGFuZSA9PT0gRGVmYXVsdExhbmUgJiYgKHdpcExhbmUgJiBUcmFuc2l0aW9uTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAvLyBLZWVwIHdvcmtpbmcgb24gdGhlIGV4aXN0aW5nIGluLXByb2dyZXNzIHRyZWUuIERvIG5vdCBpbnRlcnJ1cHQuXG4gICAgICByZXR1cm4gd2lwTGFuZXM7XG4gICAgfVxuICB9XG5cbiAgaWYgKChuZXh0TGFuZXMgJiBJbnB1dENvbnRpbnVvdXNMYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIC8vIFdoZW4gdXBkYXRlcyBhcmUgc3luYyBieSBkZWZhdWx0LCB3ZSBlbnRhbmdsZSBjb250aW51b3VzIHByaW9yaXR5IHVwZGF0ZXNcbiAgICAvLyBhbmQgZGVmYXVsdCB1cGRhdGVzLCBzbyB0aGV5IHJlbmRlciBpbiB0aGUgc2FtZSBiYXRjaC4gVGhlIG9ubHkgcmVhc29uXG4gICAgLy8gdGhleSB1c2Ugc2VwYXJhdGUgbGFuZXMgaXMgYmVjYXVzZSBjb250aW51b3VzIHVwZGF0ZXMgc2hvdWxkIGludGVycnVwdFxuICAgIC8vIHRyYW5zaXRpb25zLCBidXQgZGVmYXVsdCB1cGRhdGVzIHNob3VsZCBub3QuXG4gICAgbmV4dExhbmVzIHw9IHBlbmRpbmdMYW5lcyAmIERlZmF1bHRMYW5lO1xuICB9IC8vIENoZWNrIGZvciBlbnRhbmdsZWQgbGFuZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBiYXRjaC5cbiAgLy9cbiAgLy8gQSBsYW5lIGlzIHNhaWQgdG8gYmUgZW50YW5nbGVkIHdpdGggYW5vdGhlciB3aGVuIGl0J3Mgbm90IGFsbG93ZWQgdG8gcmVuZGVyXG4gIC8vIGluIGEgYmF0Y2ggdGhhdCBkb2VzIG5vdCBhbHNvIGluY2x1ZGUgdGhlIG90aGVyIGxhbmUuIFR5cGljYWxseSB3ZSBkbyB0aGlzXG4gIC8vIHdoZW4gbXVsdGlwbGUgdXBkYXRlcyBoYXZlIHRoZSBzYW1lIHNvdXJjZSwgYW5kIHdlIG9ubHkgd2FudCB0byByZXNwb25kIHRvXG4gIC8vIHRoZSBtb3N0IHJlY2VudCBldmVudCBmcm9tIHRoYXQgc291cmNlLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgd2UgYXBwbHkgZW50YW5nbGVtZW50cyAqYWZ0ZXIqIGNoZWNraW5nIGZvciBwYXJ0aWFsIHdvcmsgYWJvdmUuXG4gIC8vIFRoaXMgbWVhbnMgdGhhdCBpZiBhIGxhbmUgaXMgZW50YW5nbGVkIGR1cmluZyBhbiBpbnRlcmxlYXZlZCBldmVudCB3aGlsZVxuICAvLyBpdCdzIGFscmVhZHkgcmVuZGVyaW5nLCB3ZSB3b24ndCBpbnRlcnJ1cHQgaXQuIFRoaXMgaXMgaW50ZW50aW9uYWwsIHNpbmNlXG4gIC8vIGVudGFuZ2xlbWVudCBpcyB1c3VhbGx5IFwiYmVzdCBlZmZvcnRcIjogd2UnbGwgdHJ5IG91ciBiZXN0IHRvIHJlbmRlciB0aGVcbiAgLy8gbGFuZXMgaW4gdGhlIHNhbWUgYmF0Y2gsIGJ1dCBpdCdzIG5vdCB3b3J0aCB0aHJvd2luZyBvdXQgcGFydGlhbGx5XG4gIC8vIGNvbXBsZXRlZCB3b3JrIGluIG9yZGVyIHRvIGRvIGl0LlxuICAvLyBUT0RPOiBSZWNvbnNpZGVyIHRoaXMuIFRoZSBjb3VudGVyLWFyZ3VtZW50IGlzIHRoYXQgdGhlIHBhcnRpYWwgd29ya1xuICAvLyByZXByZXNlbnRzIGFuIGludGVybWVkaWF0ZSBzdGF0ZSwgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byBzaG93IHRvIHRoZSB1c2VyLlxuICAvLyBBbmQgYnkgc3BlbmRpbmcgZXh0cmEgdGltZSBmaW5pc2hpbmcgaXQsIHdlJ3JlIGluY3JlYXNpbmcgdGhlIGFtb3VudCBvZlxuICAvLyB0aW1lIGl0IHRha2VzIHRvIHNob3cgdGhlIGZpbmFsIHN0YXRlLCB3aGljaCBpcyB3aGF0IHRoZXkgYXJlIGFjdHVhbGx5XG4gIC8vIHdhaXRpbmcgZm9yLlxuICAvL1xuICAvLyBGb3IgdGhvc2UgZXhjZXB0aW9ucyB3aGVyZSBlbnRhbmdsZW1lbnQgaXMgc2VtYW50aWNhbGx5IGltcG9ydGFudCwgbGlrZVxuICAvLyB1c2VNdXRhYmxlU291cmNlLCB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gcGFydGlhbCB3b3JrIGF0IHRoZVxuICAvLyB0aW1lIHdlIGFwcGx5IHRoZSBlbnRhbmdsZW1lbnQuXG5cblxuICB2YXIgZW50YW5nbGVkTGFuZXMgPSByb290LmVudGFuZ2xlZExhbmVzO1xuXG4gIGlmIChlbnRhbmdsZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICAgIHZhciBsYW5lcyA9IG5leHRMYW5lcyAmIGVudGFuZ2xlZExhbmVzO1xuXG4gICAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgICBuZXh0TGFuZXMgfD0gZW50YW5nbGVtZW50c1tpbmRleF07XG4gICAgICBsYW5lcyAmPSB+bGFuZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dExhbmVzO1xufVxuZnVuY3Rpb24gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcykge1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciBldmVudFRpbWUgPSBldmVudFRpbWVzW2luZGV4XTtcblxuICAgIGlmIChldmVudFRpbWUgPiBtb3N0UmVjZW50RXZlbnRUaW1lKSB7XG4gICAgICBtb3N0UmVjZW50RXZlbnRUaW1lID0gZXZlbnRUaW1lO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG5cbiAgcmV0dXJuIG1vc3RSZWNlbnRFdmVudFRpbWU7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVFeHBpcmF0aW9uVGltZShsYW5lLCBjdXJyZW50VGltZSkge1xuICBzd2l0Y2ggKGxhbmUpIHtcbiAgICBjYXNlIFN5bmNMYW5lOlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICAvLyBVc2VyIGludGVyYWN0aW9ucyBzaG91bGQgZXhwaXJlIHNsaWdodGx5IG1vcmUgcXVpY2tseS5cbiAgICAgIC8vXG4gICAgICAvLyBOT1RFOiBUaGlzIGlzIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBjb25zdGFudCBhcyBpbiBTY2hlZHVsZXIuanMuXG4gICAgICAvLyBXaGVuIHdlIG1hZGUgaXQgbGFyZ2VyLCBhIHByb2R1Y3QgbWV0cmljIGluIHd3dyByZWdyZXNzZWQsIHN1Z2dlc3RpbmdcbiAgICAgIC8vIHRoZXJlJ3MgYSB1c2VyIGludGVyYWN0aW9uIHRoYXQncyBiZWluZyBzdGFydmVkIGJ5IGEgc2VyaWVzIG9mXG4gICAgICAvLyBzeW5jaHJvbm91cyB1cGRhdGVzLiBJZiB0aGF0IHRoZW9yeSBpcyBjb3JyZWN0LCB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzXG4gICAgICAvLyB0byBmaXggdGhlIHN0YXJ2YXRpb24uIEhvd2V2ZXIsIHRoaXMgc2NlbmFyaW8gc3VwcG9ydHMgdGhlIGlkZWEgdGhhdFxuICAgICAgLy8gZXhwaXJhdGlvbiB0aW1lcyBhcmUgYW4gaW1wb3J0YW50IHNhZmVndWFyZCB3aGVuIHN0YXJ2YXRpb25cbiAgICAgIC8vIGRvZXMgaGFwcGVuLlxuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgMjUwO1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgIGNhc2UgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgNTAwMDtcblxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICAvLyBUT0RPOiBSZXRyaWVzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGV4cGlyZSBpZiB0aGV5IGFyZSBDUFUgYm91bmQgZm9yXG4gICAgICAvLyB0b28gbG9uZywgYnV0IHdoZW4gSSBtYWRlIHRoaXMgY2hhbmdlIGl0IGNhdXNlZCBhIHNwaWtlIGluIGJyb3dzZXJcbiAgICAgIC8vIGNyYXNoZXMuIFRoZXJlIG11c3QgYmUgc29tZSBvdGhlciB1bmRlcmx5aW5nIGJ1Zzsgbm90IHN1cGVyIHVyZ2VudCBidXRcbiAgICAgIC8vIGlkZWFsbHkgc2hvdWxkIGZpZ3VyZSBvdXQgd2h5IGFuZCBmaXggaXQuIFVuZm9ydHVuYXRlbHkgd2UgZG9uJ3QgaGF2ZVxuICAgICAgLy8gYSByZXBybyBmb3IgdGhlIGNyYXNoZXMsIG9ubHkgZGV0ZWN0ZWQgdmlhIHByb2R1Y3Rpb24gbWV0cmljcy5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcblxuICAgIGNhc2UgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElkbGVIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgY2FzZSBPZmZzY3JlZW5MYW5lOlxuICAgICAgLy8gQW55dGhpbmcgaWRsZSBwcmlvcml0eSBvciBsb3dlciBzaG91bGQgbmV2ZXIgZXhwaXJlLlxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSkge1xuICAvLyBUT0RPOiBUaGlzIGdldHMgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgeWllbGQuIFdlIGNhbiBvcHRpbWl6ZSBieSBzdG9yaW5nXG4gIC8vIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUgb24gdGhlIHJvb3QuIFRoZW4gdXNlIHRoYXQgdG8gcXVpY2tseSBiYWlsIG91dFxuICAvLyBvZiB0aGlzIGZ1bmN0aW9uLlxuICB2YXIgcGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBwZW5kaW5nIGxhbmVzIGFuZCBjaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZWlyXG4gIC8vIGV4cGlyYXRpb24gdGltZS4gSWYgc28sIHdlJ2xsIGFzc3VtZSB0aGUgdXBkYXRlIGlzIGJlaW5nIHN0YXJ2ZWQgYW5kIG1hcmtcbiAgLy8gaXQgYXMgZXhwaXJlZCB0byBmb3JjZSBpdCB0byBmaW5pc2guXG5cbiAgdmFyIGxhbmVzID0gcGVuZGluZ0xhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWVzW2luZGV4XTtcblxuICAgIGlmIChleHBpcmF0aW9uVGltZSA9PT0gTm9UaW1lc3RhbXApIHtcbiAgICAgIC8vIEZvdW5kIGEgcGVuZGluZyBsYW5lIHdpdGggbm8gZXhwaXJhdGlvbiB0aW1lLiBJZiBpdCdzIG5vdCBzdXNwZW5kZWQsIG9yXG4gICAgICAvLyBpZiBpdCdzIHBpbmdlZCwgYXNzdW1lIGl0J3MgQ1BVLWJvdW5kLiBDb21wdXRlIGEgbmV3IGV4cGlyYXRpb24gdGltZVxuICAgICAgLy8gdXNpbmcgdGhlIGN1cnJlbnQgdGltZS5cbiAgICAgIGlmICgobGFuZSAmIHN1c3BlbmRlZExhbmVzKSA9PT0gTm9MYW5lcyB8fCAobGFuZSAmIHBpbmdlZExhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgICAgICAvLyBBc3N1bWVzIHRpbWVzdGFtcHMgYXJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy5cbiAgICAgICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IGNvbXB1dGVFeHBpcmF0aW9uVGltZShsYW5lLCBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChleHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGhpcyBsYW5lIGV4cGlyZWRcbiAgICAgIHJvb3QuZXhwaXJlZExhbmVzIHw9IGxhbmU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn0gLy8gVGhpcyByZXR1cm5zIHRoZSBoaWdoZXN0IHByaW9yaXR5IHBlbmRpbmcgbGFuZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXlcbi8vIGFyZSBzdXNwZW5kZWQuXG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eVBlbmRpbmdMYW5lcyhyb290KSB7XG4gIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhyb290LnBlbmRpbmdMYW5lcyk7XG59XG5mdW5jdGlvbiBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KSB7XG4gIHZhciBldmVyeXRoaW5nQnV0T2Zmc2NyZWVuID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+T2Zmc2NyZWVuTGFuZTtcblxuICBpZiAoZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybiBldmVyeXRoaW5nQnV0T2Zmc2NyZWVuO1xuICB9XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gJiBPZmZzY3JlZW5MYW5lKSB7XG4gICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG4gIH1cblxuICByZXR1cm4gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzU3luY0xhbmUobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFN5bmNMYW5lKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzTm9uSWRsZVdvcmsobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIE5vbklkbGVMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlSZXRyaWVzKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBSZXRyeUxhbmVzKSA9PT0gbGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlOb25VcmdlbnRMYW5lcyhsYW5lcykge1xuICB2YXIgVXJnZW50TGFuZXMgPSBTeW5jTGFuZSB8IElucHV0Q29udGludW91c0xhbmUgfCBEZWZhdWx0TGFuZTtcbiAgcmV0dXJuIChsYW5lcyAmIFVyZ2VudExhbmVzKSA9PT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKSB7XG5cbiAgdmFyIFN5bmNEZWZhdWx0TGFuZXMgPSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lIHwgSW5wdXRDb250aW51b3VzTGFuZSB8IERlZmF1bHRIeWRyYXRpb25MYW5lIHwgRGVmYXVsdExhbmU7XG4gIHJldHVybiAobGFuZXMgJiBTeW5jRGVmYXVsdExhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhIHNlcGFyYXRlIGNoZWNrIGZyb20gaW5jbHVkZXNCbG9ja2luZ0xhbmUgYmVjYXVzZSBhIGxhbmUgY2FuXG4gIC8vIGV4cGlyZSBhZnRlciBhIHJlbmRlciBoYXMgYWxyZWFkeSBzdGFydGVkLlxuICByZXR1cm4gKGxhbmVzICYgcm9vdC5leHBpcmVkTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNUcmFuc2l0aW9uTGFuZShsYW5lKSB7XG4gIHJldHVybiAobGFuZSAmIFRyYW5zaXRpb25MYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpIHtcbiAgLy8gQ3ljbGUgdGhyb3VnaCB0aGUgbGFuZXMsIGFzc2lnbmluZyBlYWNoIG5ldyB0cmFuc2l0aW9uIHRvIHRoZSBuZXh0IGxhbmUuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgbWVhbnMgZXZlcnkgdHJhbnNpdGlvbiBnZXRzIGl0cyBvd24gbGFuZSwgdW50aWwgd2VcbiAgLy8gcnVuIG91dCBvZiBsYW5lcyBhbmQgY3ljbGUgYmFjayB0byB0aGUgYmVnaW5uaW5nLlxuICB2YXIgbGFuZSA9IG5leHRUcmFuc2l0aW9uTGFuZTtcbiAgbmV4dFRyYW5zaXRpb25MYW5lIDw8PSAxO1xuXG4gIGlmICgobmV4dFRyYW5zaXRpb25MYW5lICYgVHJhbnNpdGlvbkxhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIG5leHRUcmFuc2l0aW9uTGFuZSA9IFRyYW5zaXRpb25MYW5lMTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gY2xhaW1OZXh0UmV0cnlMYW5lKCkge1xuICB2YXIgbGFuZSA9IG5leHRSZXRyeUxhbmU7XG4gIG5leHRSZXRyeUxhbmUgPDw9IDE7XG5cbiAgaWYgKChuZXh0UmV0cnlMYW5lICYgUmV0cnlMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBuZXh0UmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcykge1xuICByZXR1cm4gbGFuZXMgJiAtbGFuZXM7XG59XG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZShsYW5lcykge1xuICAvLyBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZ2V0cyBpbmxpbmVkLiBPbmx5IGV4aXN0cyBzbyB0byBjb21tdW5pY2F0ZSB0aGF0IGl0XG4gIC8vIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGJpdCBpcyBzZWxlY3RlZDsgeW91IGNhbiBwaWNrIGFueSBiaXQgd2l0aG91dFxuICAvLyBhZmZlY3RpbmcgdGhlIGFsZ29yaXRobXMgd2hlcmUgaXRzIHVzZWQuIEhlcmUgSSdtIHVzaW5nXG4gIC8vIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUgYmVjYXVzZSBpdCByZXF1aXJlcyB0aGUgZmV3ZXN0IG9wZXJhdGlvbnMuXG4gIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcykge1xuICByZXR1cm4gMzEgLSBjbHozMihsYW5lcyk7XG59XG5cbmZ1bmN0aW9uIGxhbmVUb0luZGV4KGxhbmUpIHtcbiAgcmV0dXJuIHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZSk7XG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVzU29tZUxhbmUoYSwgYikge1xuICByZXR1cm4gKGEgJiBiKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGlzU3Vic2V0T2ZMYW5lcyhzZXQsIHN1YnNldCkge1xuICByZXR1cm4gKHNldCAmIHN1YnNldCkgPT09IHN1YnNldDtcbn1cbmZ1bmN0aW9uIG1lcmdlTGFuZXMoYSwgYikge1xuICByZXR1cm4gYSB8IGI7XG59XG5mdW5jdGlvbiByZW1vdmVMYW5lcyhzZXQsIHN1YnNldCkge1xuICByZXR1cm4gc2V0ICYgfnN1YnNldDtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdExhbmVzKGEsIGIpIHtcbiAgcmV0dXJuIGEgJiBiO1xufSAvLyBTZWVtcyByZWR1bmRhbnQsIGJ1dCBpdCBjaGFuZ2VzIHRoZSB0eXBlIGZyb20gYSBzaW5nbGUgbGFuZSAodXNlZCBmb3Jcbi8vIHVwZGF0ZXMpIHRvIGEgZ3JvdXAgb2YgbGFuZXMgKHVzZWQgZm9yIGZsdXNoaW5nIHdvcmspLlxuXG5mdW5jdGlvbiBsYW5lVG9MYW5lcyhsYW5lKSB7XG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gaGlnaGVyUHJpb3JpdHlMYW5lKGEsIGIpIHtcbiAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXQgcmFuZ2VzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICByZXR1cm4gYSAhPT0gTm9MYW5lICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHtcbiAgLy8gSW50ZW50aW9uYWxseSBwdXNoaW5nIG9uZSBieSBvbmUuXG4gIC8vIGh0dHBzOi8vdjguZGV2L2Jsb2cvZWxlbWVudHMta2luZHMjYXZvaWQtY3JlYXRpbmctaG9sZXNcbiAgdmFyIGxhbmVNYXAgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IFRvdGFsTGFuZXM7IGkrKykge1xuICAgIGxhbmVNYXAucHVzaChpbml0aWFsKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lTWFwO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHVwZGF0ZUxhbmUsIGV2ZW50VGltZSkge1xuICByb290LnBlbmRpbmdMYW5lcyB8PSB1cGRhdGVMYW5lOyAvLyBJZiB0aGVyZSBhcmUgYW55IHN1c3BlbmRlZCB0cmFuc2l0aW9ucywgaXQncyBwb3NzaWJsZSB0aGlzIG5ldyB1cGRhdGVcbiAgLy8gY291bGQgdW5ibG9jayB0aGVtLiBDbGVhciB0aGUgc3VzcGVuZGVkIGxhbmVzIHNvIHRoYXQgd2UgY2FuIHRyeSByZW5kZXJpbmdcbiAgLy8gdGhlbSBhZ2Fpbi5cbiAgLy9cbiAgLy8gVE9ETzogV2UgcmVhbGx5IG9ubHkgbmVlZCB0byB1bnN1c3BlbmQgb25seSBsYW5lcyB0aGF0IGFyZSBpbiB0aGVcbiAgLy8gYHN1YnRyZWVMYW5lc2Agb2YgdGhlIHVwZGF0ZWQgZmliZXIsIG9yIHRoZSB1cGRhdGUgbGFuZXMgb2YgdGhlIHJldHVyblxuICAvLyBwYXRoLiBUaGlzIHdvdWxkIGV4Y2x1ZGUgc3VzcGVuZGVkIHVwZGF0ZXMgaW4gYW4gdW5yZWxhdGVkIHNpYmxpbmcgdHJlZSxcbiAgLy8gc2luY2UgdGhlcmUncyBubyB3YXkgZm9yIHRoaXMgdXBkYXRlIHRvIHVuYmxvY2sgaXQuXG4gIC8vXG4gIC8vIFdlIGRvbid0IGRvIHRoaXMgaWYgdGhlIGluY29taW5nIHVwZGF0ZSBpcyBpZGxlLCBiZWNhdXNlIHdlIG5ldmVyIHByb2Nlc3NcbiAgLy8gaWRsZSB1cGRhdGVzIHVudGlsIGFmdGVyIGFsbCB0aGUgcmVndWxhciB1cGRhdGVzIGhhdmUgZmluaXNoZWQ7IHRoZXJlJ3Mgbm9cbiAgLy8gd2F5IGl0IGNvdWxkIHVuYmxvY2sgYSB0cmFuc2l0aW9uLlxuXG4gIGlmICh1cGRhdGVMYW5lICE9PSBJZGxlTGFuZSkge1xuICAgIHJvb3Quc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KHVwZGF0ZUxhbmUpOyAvLyBXZSBjYW4gYWx3YXlzIG92ZXJ3cml0ZSBhbiBleGlzdGluZyB0aW1lc3RhbXAgYmVjYXVzZSB3ZSBwcmVmZXIgdGhlIG1vc3RcbiAgLy8gcmVjZW50IGV2ZW50LCBhbmQgd2UgYXNzdW1lIHRpbWUgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuXG4gIGV2ZW50VGltZXNbaW5kZXhdID0gZXZlbnRUaW1lO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyB8PSBzdXNwZW5kZWRMYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyAmPSB+c3VzcGVuZGVkTGFuZXM7IC8vIFRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBDUFUtYm91bmQuIENsZWFyIHRoZWlyIGV4cGlyYXRpb24gdGltZXMuXG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzO1xuICB2YXIgbGFuZXMgPSBzdXNwZW5kZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMsIGV2ZW50VGltZSkge1xuICByb290LnBpbmdlZExhbmVzIHw9IHJvb3Quc3VzcGVuZGVkTGFuZXMgJiBwaW5nZWRMYW5lcztcbn1cbmZ1bmN0aW9uIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpIHtcbiAgdmFyIG5vTG9uZ2VyUGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+cmVtYWluaW5nTGFuZXM7XG4gIHJvb3QucGVuZGluZ0xhbmVzID0gcmVtYWluaW5nTGFuZXM7IC8vIExldCdzIHRyeSBldmVyeXRoaW5nIGFnYWluXG5cbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICByb290LmV4cGlyZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gQ2xlYXIgdGhlIGxhbmVzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgcGVuZGluZyB3b3JrXG5cbiAgdmFyIGxhbmVzID0gbm9Mb25nZXJQZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IE5vTGFuZXM7XG4gICAgZXZlbnRUaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGVudGFuZ2xlZExhbmVzKSB7XG4gIC8vIEluIGFkZGl0aW9uIHRvIGVudGFuZ2xpbmcgZWFjaCBvZiB0aGUgZ2l2ZW4gbGFuZXMgd2l0aCBlYWNoIG90aGVyLCB3ZSBhbHNvXG4gIC8vIGhhdmUgdG8gY29uc2lkZXIgX3RyYW5zaXRpdmVfIGVudGFuZ2xlbWVudHMuIEZvciBlYWNoIGxhbmUgdGhhdCBpcyBhbHJlYWR5XG4gIC8vIGVudGFuZ2xlZCB3aXRoICphbnkqIG9mIHRoZSBnaXZlbiBsYW5lcywgdGhhdCBsYW5lIGlzIG5vdyB0cmFuc2l0aXZlbHlcbiAgLy8gZW50YW5nbGVkIHdpdGggKmFsbCogdGhlIGdpdmVuIGxhbmVzLlxuICAvL1xuICAvLyBUcmFuc2xhdGVkOiBJZiBDIGlzIGVudGFuZ2xlZCB3aXRoIEEsIHRoZW4gZW50YW5nbGluZyBBIHdpdGggQiBhbHNvXG4gIC8vIGVudGFuZ2xlcyBDIHdpdGggQi5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBoYXJkIHRvIGdyYXNwLCBpdCBtaWdodCBoZWxwIHRvIGludGVudGlvbmFsbHkgYnJlYWsgdGhpc1xuICAvLyBmdW5jdGlvbiBhbmQgbG9vayBhdCB0aGUgdGVzdHMgdGhhdCBmYWlsIGluIFJlYWN0VHJhbnNpdGlvbi10ZXN0LmpzLiBUcnlcbiAgLy8gY29tbWVudGluZyBvdXQgb25lIG9mIHRoZSBjb25kaXRpb25zIGJlbG93LlxuICB2YXIgcm9vdEVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcyB8PSBlbnRhbmdsZWRMYW5lcztcbiAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gIHZhciBsYW5lcyA9IHJvb3RFbnRhbmdsZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMpIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG5cbiAgICBpZiAoIC8vIElzIHRoaXMgb25lIG9mIHRoZSBuZXdseSBlbnRhbmdsZWQgbGFuZXM/XG4gICAgbGFuZSAmIGVudGFuZ2xlZExhbmVzIHwgLy8gSXMgdGhpcyBsYW5lIHRyYW5zaXRpdmVseSBlbnRhbmdsZWQgd2l0aCB0aGUgbmV3bHkgZW50YW5nbGVkIGxhbmVzP1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdICYgZW50YW5nbGVkTGFuZXMpIHtcbiAgICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdIHw9IGVudGFuZ2xlZExhbmVzO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uKHJvb3QsIHJlbmRlckxhbmVzKSB7XG4gIHZhciByZW5kZXJMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShyZW5kZXJMYW5lcyk7XG4gIHZhciBsYW5lO1xuXG4gIHN3aXRjaCAocmVuZGVyTGFuZSkge1xuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIGxhbmUgPSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgICAgbGFuZSA9IERlZmF1bHRIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIGxhbmUgPSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICAgIGxhbmUgPSBJZGxlSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpcyBhbHJlYWR5IGVpdGhlciBhIGh5ZHJhdGlvbiBsYW5lLCBvciBzaG91bGRuJ3RcbiAgICAgIC8vIGJlIHJldHJpZWQgYXQgYSBoeWRyYXRpb24gbGFuZS5cbiAgICAgIGxhbmUgPSBOb0xhbmU7XG4gICAgICBicmVhaztcbiAgfSAvLyBDaGVjayBpZiB0aGUgbGFuZSB3ZSBjaG9zZSBpcyBzdXNwZW5kZWQuIElmIHNvLCB0aGF0IGluZGljYXRlcyB0aGF0IHdlXG4gIC8vIGFscmVhZHkgYXR0ZW1wdGVkIGFuZCBmYWlsZWQgdG8gaHlkcmF0ZSBhdCB0aGF0IGxldmVsLiBBbHNvIGNoZWNrIGlmIHdlJ3JlXG4gIC8vIGFscmVhZHkgcmVuZGVyaW5nIHRoYXQgbGFuZSwgd2hpY2ggaXMgcmFyZSBidXQgY291bGQgaGFwcGVuLlxuXG5cbiAgaWYgKChsYW5lICYgKHJvb3Quc3VzcGVuZGVkTGFuZXMgfCByZW5kZXJMYW5lcykpICE9PSBOb0xhbmUpIHtcbiAgICAvLyBHaXZlIHVwIHRyeWluZyB0byBoeWRyYXRlIGFuZCBmYWxsIGJhY2sgdG8gY2xpZW50IHJlbmRlci5cbiAgICByZXR1cm4gTm9MYW5lO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgZmliZXIsIGxhbmVzKSB7XG5cbiAgaWYgKCFpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gcm9vdC5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciB1cGRhdGVycyA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuICAgIHVwZGF0ZXJzLmFkZChmaWJlcik7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcykge1xuXG4gIGlmICghaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDtcbiAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIHVwZGF0ZXJzID0gcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcFtpbmRleF07XG5cbiAgICBpZiAodXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgIHVwZGF0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCB8fCAhbWVtb2l6ZWRVcGRhdGVycy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB1cGRhdGVycy5jbGVhcigpO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKHJvb3QsIGxhbmVzKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgRGlzY3JldGVFdmVudFByaW9yaXR5ID0gU3luY0xhbmU7XG52YXIgQ29udGludW91c0V2ZW50UHJpb3JpdHkgPSBJbnB1dENvbnRpbnVvdXNMYW5lO1xudmFyIERlZmF1bHRFdmVudFByaW9yaXR5ID0gRGVmYXVsdExhbmU7XG52YXIgSWRsZUV2ZW50UHJpb3JpdHkgPSBJZGxlTGFuZTtcbnZhciBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBOb0xhbmU7XG5mdW5jdGlvbiBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlUHJpb3JpdHk7XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkobmV3UHJpb3JpdHkpIHtcbiAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gbmV3UHJpb3JpdHk7XG59XG5mdW5jdGlvbiBydW5XaXRoUHJpb3JpdHkocHJpb3JpdHksIGZuKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gY3VycmVudFVwZGF0ZVByaW9yaXR5O1xuXG4gIHRyeSB7XG4gICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJpb3JpdHk7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJldmlvdXNQcmlvcml0eTtcbiAgfVxufVxuZnVuY3Rpb24gaGlnaGVyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhICE9PSAwICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBsb3dlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSA9PT0gMCB8fCBhID4gYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gaXNIaWdoZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgIT09IDAgJiYgYSA8IGI7XG59XG5mdW5jdGlvbiBsYW5lc1RvRXZlbnRQcmlvcml0eShsYW5lcykge1xuICB2YXIgbGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xuXG4gIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSwgbGFuZSkpIHtcbiAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkoQ29udGludW91c0V2ZW50UHJpb3JpdHksIGxhbmUpKSB7XG4gICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgaWYgKGluY2x1ZGVzTm9uSWRsZVdvcmsobGFuZSkpIHtcbiAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICByZXR1cm4gSWRsZUV2ZW50UHJpb3JpdHk7XG59XG5cbi8vIFRoaXMgaXMgaW1wb3J0ZWQgYnkgdGhlIGV2ZW50IHJlcGxheWluZyBpbXBsZW1lbnRhdGlvbiBpbiBSZWFjdCBET00uIEl0J3Ncbi8vIGluIGEgc2VwYXJhdGUgZmlsZSB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgcmVuZGVyZXIgYW5kXG4vLyB0aGUgcmVjb25jaWxlci5cbmZ1bmN0aW9uIGlzUm9vdERlaHlkcmF0ZWQocm9vdCkge1xuICB2YXIgY3VycmVudFN0YXRlID0gcm9vdC5jdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBjdXJyZW50U3RhdGUuaXNEZWh5ZHJhdGVkO1xufVxuXG52YXIgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbjtcblxuZnVuY3Rpb24gc2V0QXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZuKSB7XG4gIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24gPSBmbjtcbn1cbmZ1bmN0aW9uIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcikge1xuICBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTtcbn1cbnZhciBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbjtcbmZ1bmN0aW9uIHNldEF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGZuKSB7XG4gIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5O1xuZnVuY3Rpb24gc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KGZuKSB7XG4gIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSA9IGZuO1xufVxudmFyIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxO1xuZnVuY3Rpb24gc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGZuKSB7XG4gIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eSA9IGZuO1xufSAvLyBUT0RPOiBVcGdyYWRlIHRoaXMgZGVmaW5pdGlvbiBvbmNlIHdlJ3JlIG9uIGEgbmV3ZXIgdmVyc2lvbiBvZiBGbG93IHRoYXRcbi8vIGhhcyB0aGlzIGRlZmluaXRpb24gYnVpbHQtaW4uXG5cbnZhciBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7IC8vIFRoZSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMgdG8gYmUgcmVwbGF5ZWQuXG5cbnZhciBxdWV1ZWREaXNjcmV0ZUV2ZW50cyA9IFtdOyAvLyBJbmRpY2F0ZXMgaWYgYW55IGNvbnRpbnVvdXMgZXZlbnQgdGFyZ2V0cyBhcmUgbm9uLW51bGwgZm9yIGVhcmx5IGJhaWxvdXQuXG4vLyBpZiB0aGUgbGFzdCB0YXJnZXQgd2FzIGRlaHlkcmF0ZWQuXG5cbnZhciBxdWV1ZWRGb2N1cyA9IG51bGw7XG52YXIgcXVldWVkRHJhZyA9IG51bGw7XG52YXIgcXVldWVkTW91c2UgPSBudWxsOyAvLyBGb3IgcG9pbnRlciBldmVudHMgdGhlcmUgY2FuIGJlIG9uZSBsYXRlc3QgZXZlbnQgcGVyIHBvaW50ZXJJZC5cblxudmFyIHF1ZXVlZFBvaW50ZXJzID0gbmV3IE1hcCgpO1xudmFyIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcyA9IG5ldyBNYXAoKTsgLy8gV2UgY291bGQgY29uc2lkZXIgcmVwbGF5aW5nIHNlbGVjdGlvbmNoYW5nZSBhbmQgdG91Y2htb3ZlcyB0b28uXG5cbnZhciBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXTtcbnZhciBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMgPSBbJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3RvdWNoY2FuY2VsJywgJ3RvdWNoZW5kJywgJ3RvdWNoc3RhcnQnLCAnYXV4Y2xpY2snLCAnZGJsY2xpY2snLCAncG9pbnRlcmNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVydXAnLCAnZHJhZ2VuZCcsICdkcmFnc3RhcnQnLCAnZHJvcCcsICdjb21wb3NpdGlvbmVuZCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnaW5wdXQnLCAndGV4dElucHV0JywgLy8gSW50ZW50aW9uYWxseSBjYW1lbENhc2Vcbidjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdjbGljaycsICdjaGFuZ2UnLCAnY29udGV4dG1lbnUnLCAncmVzZXQnLCAnc3VibWl0J107XG5mdW5jdGlvbiBpc0Rpc2NyZXRlRXZlbnRUaGF0UmVxdWlyZXNIeWRyYXRpb24oZXZlbnRUeXBlKSB7XG4gIHJldHVybiBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMuaW5kZXhPZihldmVudFR5cGUpID4gLTE7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVF1ZXVlZFJlcGxheWFibGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4ge1xuICAgIGJsb2NrZWRPbjogYmxvY2tlZE9uLFxuICAgIGRvbUV2ZW50TmFtZTogZG9tRXZlbnROYW1lLFxuICAgIGV2ZW50U3lzdGVtRmxhZ3M6IGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgbmF0aXZlRXZlbnQ6IG5hdGl2ZUV2ZW50LFxuICAgIHRhcmdldENvbnRhaW5lcnM6IFt0YXJnZXRDb250YWluZXJdXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgICAgcXVldWVkRHJhZyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgICAgcXVldWVkTW91c2UgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgICB7XG4gICAgICAgIHZhciBwb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJzLmRlbGV0ZShwb2ludGVySWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgICAge1xuICAgICAgICB2YXIgX3BvaW50ZXJJZCA9IG5hdGl2ZUV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmRlbGV0ZShfcG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChleGlzdGluZ1F1ZXVlZEV2ZW50LCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoZXhpc3RpbmdRdWV1ZWRFdmVudCA9PT0gbnVsbCB8fCBleGlzdGluZ1F1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50ICE9PSBuYXRpdmVFdmVudCkge1xuICAgIHZhciBxdWV1ZWRFdmVudCA9IGNyZWF0ZVF1ZXVlZFJlcGxheWFibGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgICBpZiAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2ZpYmVyMiA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBpbmNyZWFzZSB0aGUgcHJpb3JpdHkgb2YgdGhpcyB0YXJnZXQuXG4gICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKF9maWJlcjIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWV1ZWRFdmVudDtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFscmVhZHkgcXVldWVkIHRoaXMgZXhhY3QgZXZlbnQsIHRoZW4gaXQncyBiZWNhdXNlXG4gIC8vIHRoZSBkaWZmZXJlbnQgZXZlbnQgc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBET00gZXZlbnQgbGlzdGVuZXJzLlxuICAvLyBXZSBjYW4gYWNjdW11bGF0ZSB0aGUgZmxhZ3MsIGFuZCB0aGUgdGFyZ2V0Q29udGFpbmVycywgYW5kXG4gIC8vIHN0b3JlIGEgc2luZ2xlIGV2ZW50IHRvIGJlIHJlcGxheWVkLlxuXG5cbiAgZXhpc3RpbmdRdWV1ZWRFdmVudC5ldmVudFN5c3RlbUZsYWdzIHw9IGV2ZW50U3lzdGVtRmxhZ3M7XG4gIHZhciB0YXJnZXRDb250YWluZXJzID0gZXhpc3RpbmdRdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuXG4gIGlmICh0YXJnZXRDb250YWluZXIgIT09IG51bGwgJiYgdGFyZ2V0Q29udGFpbmVycy5pbmRleE9mKHRhcmdldENvbnRhaW5lcikgPT09IC0xKSB7XG4gICAgdGFyZ2V0Q29udGFpbmVycy5wdXNoKHRhcmdldENvbnRhaW5lcik7XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdRdWV1ZWRFdmVudDtcbn1cblxuZnVuY3Rpb24gcXVldWVJZkNvbnRpbnVvdXNFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICAvLyBUaGVzZSBzZXQgcmVsYXRlZFRhcmdldCB0byBudWxsIGJlY2F1c2UgdGhlIHJlcGxheWVkIGV2ZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiB3ZVxuICAvLyBtb3ZlZCBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdyAobm8gdGFyZ2V0KSBvbnRvIHRoZSB0YXJnZXQgb25jZSBpdCBoeWRyYXRlcy5cbiAgLy8gSW5zdGVhZCBvZiBtdXRhdGluZyB3ZSBjb3VsZCBjbG9uZSB0aGUgZXZlbnQuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICB7XG4gICAgICAgIHZhciBmb2N1c0V2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZEZvY3VzID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRGb2N1cywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZm9jdXNFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIGRyYWdFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWREcmFnID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWREcmFnLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBkcmFnRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBtb3VzZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZE1vdXNlID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRNb3VzZSwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbW91c2VFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBwb2ludGVySWQgPSBwb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5zZXQocG9pbnRlcklkLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJzLmdldChwb2ludGVySWQpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIHBvaW50ZXJFdmVudCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVyRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIF9wb2ludGVySWQyID0gX3BvaW50ZXJFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5zZXQoX3BvaW50ZXJJZDIsIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkUG9pbnRlckNhcHR1cmVzLmdldChfcG9pbnRlcklkMikgfHwgbnVsbCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgX3BvaW50ZXJFdmVudCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0gLy8gQ2hlY2sgaWYgdGhpcyB0YXJnZXQgaXMgdW5ibG9ja2VkLiBSZXR1cm5zIHRydWUgaWYgaXQncyB1bmJsb2NrZWQuXG5cbmZ1bmN0aW9uIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaGFyZXMgYSBsb3Qgb2YgbG9naWMgd2l0aCBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50LlxuICAvLyBUcnkgdG8gdW5pZnkgdGhlbS4gSXQncyBhIGJpdCB0cmlja3kgc2luY2UgaXQgd291bGQgcmVxdWlyZSB0d28gcmV0dXJuXG4gIC8vIHZhbHVlcy5cbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShxdWV1ZWRUYXJnZXQudGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7XG5cbiAgICAgIGlmICh0YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlJ3JlIGJsb2NrZWQgb24gaHlkcmF0aW5nIHRoaXMgYm91bmRhcnkuXG4gICAgICAgICAgLy8gSW5jcmVhc2UgaXRzIHByaW9yaXR5LlxuICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBpbnN0YW5jZTtcbiAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mXG4gICAgICAgICAgLy8gYSByb290IG90aGVyIHRoYW4gc3luYy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCkge1xuICAvLyBUT0RPOiBUaGlzIHdpbGwgcmVhZCB0aGUgcHJpb3JpdHkgaWYgaXQncyBkaXNwYXRjaGVkIGJ5IHRoZSBSZWFjdFxuICAvLyBldmVudCBzeXN0ZW0gYnV0IG5vdCBuYXRpdmUgZXZlbnRzLiBTaG91bGQgcmVhZCB3aW5kb3cuZXZlbnQudHlwZSwgbGlrZVxuICAvLyB3ZSBkbyBmb3IgdXBkYXRlcyAoZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkpLlxuICB2YXIgdXBkYXRlUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMSgpO1xuICB2YXIgcXVldWVkVGFyZ2V0ID0ge1xuICAgIGJsb2NrZWRPbjogbnVsbCxcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICBwcmlvcml0eTogdXBkYXRlUHJpb3JpdHlcbiAgfTtcbiAgdmFyIGkgPSAwO1xuXG4gIGZvciAoOyBpIDwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gU3RvcCBvbmNlIHdlIGhpdCB0aGUgZmlyc3QgdGFyZ2V0IHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhblxuICAgIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KHVwZGF0ZVByaW9yaXR5LCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbaV0ucHJpb3JpdHkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc3BsaWNlKGksIDAsIHF1ZXVlZFRhcmdldCk7XG5cbiAgaWYgKGkgPT09IDApIHtcbiAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgd2hpbGUgKHRhcmdldENvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChxdWV1ZWRFdmVudC5kb21FdmVudE5hbWUsIHF1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcXVldWVkRXZlbnQubmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKG5leHRCbG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIG5hdGl2ZUV2ZW50ID0gcXVldWVkRXZlbnQubmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBuYXRpdmVFdmVudENsb25lID0gbmV3IG5hdGl2ZUV2ZW50LmNvbnN0cnVjdG9yKG5hdGl2ZUV2ZW50LnR5cGUsIG5hdGl2ZUV2ZW50KTtcbiAgICAgICAgc2V0UmVwbGF5aW5nRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7XG4gICAgICAgIG5hdGl2ZUV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KG5hdGl2ZUV2ZW50Q2xvbmUpO1xuICAgICAgICByZXNldFJlcGxheWluZ0V2ZW50KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgIHZhciBfZmliZXIzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjMgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMyk7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBUaGlzIHRhcmdldCBjb250YWluZXIgd2FzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLiBUcnkgdGhlIG5leHQuXG5cblxuICAgIHRhcmdldENvbnRhaW5lcnMuc2hpZnQoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXAocXVldWVkRXZlbnQsIGtleSwgbWFwKSB7XG4gIGlmIChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSkge1xuICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYXlVbmJsb2NrZWRFdmVudHMoKSB7XG4gIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTtcblxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEZvY3VzKSkge1xuICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykpIHtcbiAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZE1vdXNlKSkge1xuICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgfVxuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcblxuICAgIGlmICghaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCkge1xuICAgICAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IHRydWU7IC8vIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gYXR0ZW1wdCByZXBsYXlpbmcgYXMgbWFueSBldmVudHMgYXMgYXJlXG4gICAgICAvLyBub3cgdW5ibG9ja2VkLiBUaGlzIGZpcnN0IG1pZ2h0IG5vdCBhY3R1YWxseSBiZSB1bmJsb2NrZWQgeWV0LlxuICAgICAgLy8gV2UgY291bGQgY2hlY2sgaXQgZWFybHkgdG8gYXZvaWQgc2NoZWR1bGluZyBhbiB1bm5lY2Vzc2FyeSBjYWxsYmFjay5cblxuICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCByZXBsYXlVbmJsb2NrZWRFdmVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeUlmQmxvY2tlZE9uKHVuYmxvY2tlZCkge1xuICAvLyBNYXJrIGFueXRoaW5nIHRoYXQgd2FzIGJsb2NrZWQgb24gdGhpcyBhcyBubyBsb25nZXIgYmxvY2tlZFxuICAvLyBhbmQgZWxpZ2libGUgZm9yIGEgcmVwbGF5LlxuICBpZiAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREaXNjcmV0ZUV2ZW50c1swXSwgdW5ibG9ja2VkKTsgLy8gVGhpcyBpcyBhIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgZWFjaCBib3VuZGFyeSB0aGF0IGNvbW1pdHMuIEkgdGhpbmsgaXQnc1xuICAgIC8vIHdvcnRoIGl0IGJlY2F1c2Ugd2UgZXhwZWN0IHZlcnkgZmV3IGRpc2NyZXRlIGV2ZW50cyB0byBxdWV1ZSB1cCBhbmQgb25jZVxuICAgIC8vIHdlIGFyZSBhY3R1YWxseSBmdWxseSB1bmJsb2NrZWQgaXQgd2lsbCBiZSBmYXN0IHRvIHJlcGxheSB0aGVtLlxuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlZEV2ZW50ID0gcXVldWVkRGlzY3JldGVFdmVudHNbaV07XG5cbiAgICAgIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERyYWcsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7XG4gIH1cblxuICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uIChxdWV1ZWRFdmVudCkge1xuICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCk7XG4gIH07XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaCh1bmJsb2NrKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2godW5ibG9jayk7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW19pXTtcblxuICAgIGlmIChxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RXhwbGljaXRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbMF07XG5cbiAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQobmV4dEV4cGxpY2l0VGFyZ2V0KTtcblxuICAgICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UncmUgdW5ibG9ja2VkLlxuICAgICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7IC8vIFRPRE86IGNhbiB3ZSBzdG9wIGV4cG9ydGluZyB0aGVzZT9cblxudmFyIF9lbmFibGVkID0gdHJ1ZTsgLy8gVGhpcyBpcyBleHBvcnRlZCBpbiBGQiBidWlsZHMgZm9yIHVzZSBieSBsZWdhY3kgRkIgbGF5ZXIgaW5mcmEuXG4vLyBXZSdkIGxpa2UgdG8gcmVtb3ZlIHRoaXMgYnV0IGl0J3Mgbm90IGNsZWFyIGlmIHRoaXMgaXMgc2FmZS5cblxuZnVuY3Rpb24gc2V0RW5hYmxlZChlbmFibGVkKSB7XG4gIF9lbmFibGVkID0gISFlbmFibGVkO1xufVxuZnVuY3Rpb24gaXNFbmFibGVkKCkge1xuICByZXR1cm4gX2VuYWJsZWQ7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICB2YXIgZXZlbnRQcmlvcml0eSA9IGdldEV2ZW50UHJpb3JpdHkoZG9tRXZlbnROYW1lKTtcbiAgdmFyIGxpc3RlbmVyV3JhcHBlcjtcblxuICBzd2l0Y2ggKGV2ZW50UHJpb3JpdHkpIHtcbiAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoQ29udGludW91c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgIGRlZmF1bHQ6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaEV2ZW50O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJXcmFwcGVyLmJpbmQobnVsbCwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaERpc2NyZXRlRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KENvbnRpbnVvdXNFdmVudFByaW9yaXR5KTtcbiAgICBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoIV9lbmFibGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGRpc3BhdGNoRXZlbnRXaXRoRW5hYmxlQ2FwdHVyZVBoYXNlU2VsZWN0aXZlSHlkcmF0aW9uV2l0aG91dERpc2NyZXRlRXZlbnRSZXBsYXkoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50V2l0aEVuYWJsZUNhcHR1cmVQaGFzZVNlbGVjdGl2ZUh5ZHJhdGlvbldpdGhvdXREaXNjcmV0ZUV2ZW50UmVwbGF5KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgYmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gIGlmIChibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgcmV0dXJuX3RhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcik7XG4gICAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocXVldWVJZkNvbnRpbnVvdXNFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkpIHtcbiAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgbmVlZCB0byBjbGVhciBvbmx5IGlmIHdlIGRpZG4ndCBxdWV1ZSBiZWNhdXNlXG4gIC8vIHF1ZXVlaW5nIGlzIGFjY3VtdWxhdGl2ZS5cblxuXG4gIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG5cbiAgaWYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFICYmIGlzRGlzY3JldGVFdmVudFRoYXRSZXF1aXJlc0h5ZHJhdGlvbihkb21FdmVudE5hbWUpKSB7XG4gICAgd2hpbGUgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShibG9ja2VkT24pO1xuXG4gICAgICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5leHRCbG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCByZXR1cm5fdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRCbG9ja2VkT24gPT09IGJsb2NrZWRPbikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gVGhpcyBpcyBub3QgcmVwbGF5YWJsZSBzbyB3ZSdsbCBpbnZva2UgaXQgYnV0IHdpdGhvdXQgYSB0YXJnZXQsXG4gIC8vIGluIGNhc2UgdGhlIGV2ZW50IHN5c3RlbSBuZWVkcyB0byB0cmFjZSBpdC5cblxuXG4gIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCBudWxsLCB0YXJnZXRDb250YWluZXIpO1xufVxuXG52YXIgcmV0dXJuX3RhcmdldEluc3QgPSBudWxsOyAvLyBSZXR1cm5zIGEgU3VzcGVuc2VJbnN0YW5jZSBvciBDb250YWluZXIgaWYgaXQncyBibG9ja2VkLlxuLy8gVGhlIHJldHVybl90YXJnZXRJbnN0IGZpZWxkIGFib3ZlIGlzIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZSByZXR1cm4gdmFsdWUuXG5cbmZ1bmN0aW9uIGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRPRE86IFdhcm4gaWYgX2VuYWJsZWQgaXMgZmFsc2UuXG4gIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgdGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgdHJlZSBoYXMgYmVlbiB1bm1vdW50ZWQgYWxyZWFkeS4gRGlzcGF0Y2ggd2l0aG91dCBhIHRhcmdldC5cbiAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBRdWV1ZSB0aGUgZXZlbnQgdG8gYmUgcmVwbGF5ZWQgbGF0ZXIuIEFib3J0IGRpc3BhdGNoaW5nIHNpbmNlIHdlXG4gICAgICAgICAgLy8gZG9uJ3Qgd2FudCB0aGlzIGV2ZW50IGRpc3BhdGNoZWQgdHdpY2UgdGhyb3VnaCB0aGUgZXZlbnQgc3lzdGVtLlxuICAgICAgICAgIC8vIFRPRE86IElmIHRoaXMgaXMgdGhlIGZpcnN0IGRpc2NyZXRlIGV2ZW50IGluIHRoZSBxdWV1ZS4gU2NoZWR1bGUgYW4gaW5jcmVhc2VkXG4gICAgICAgICAgLy8gcHJpb3JpdHkgZm9yIHRoaXMgYm91bmRhcnkuXG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9IC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgc29tZXRoaW5nIHdlbnQgd3JvbmcgYnV0IHRvIGF2b2lkIGJsb2NraW5nXG4gICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0sIGRpc3BhdGNoIHRoZSBldmVudCB3aXRob3V0IGEgdGFyZ2V0LlxuICAgICAgICAvLyBUT0RPOiBXYXJuLlxuXG5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMgZHVyaW5nIGEgcmVwbGF5IHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCBpdCBtaWdodCBibG9ja1xuICAgICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0uXG4gICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobmVhcmVzdE1vdW50ZWQgIT09IHRhcmdldEluc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdFxuICAgICAgICAvLyBjb21wb25lbnQncyBtb3VudCwgaWdub3JlIGl0IGZvciBub3cgKHRoYXQgaXMsIHRyZWF0IGl0IGFzIGlmIGl0IHdhcyBhblxuICAgICAgICAvLyBldmVudCBvbiBhIG5vbi1SZWFjdCB0cmVlKS4gV2UgbWlnaHQgYWxzbyBjb25zaWRlciBxdWV1ZWluZyBldmVudHMgYW5kXG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LlxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7IC8vIFdlJ3JlIG5vdCBibG9ja2VkIG9uIGFueXRoaW5nLlxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBVc2VkIGJ5IFNpbXBsZUV2ZW50UGx1Z2luOlxuICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgY2FzZSAnY2xpY2snOlxuICAgIGNhc2UgJ2Nsb3NlJzpcbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnY29weSc6XG4gICAgY2FzZSAnY3V0JzpcbiAgICBjYXNlICdhdXhjbGljayc6XG4gICAgY2FzZSAnZGJsY2xpY2snOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdpbnZhbGlkJzpcbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgIGNhc2UgJ3BhdXNlJzpcbiAgICBjYXNlICdwbGF5JzpcbiAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICBjYXNlICdwb2ludGVyZG93bic6XG4gICAgY2FzZSAncG9pbnRlcnVwJzpcbiAgICBjYXNlICdyYXRlY2hhbmdlJzpcbiAgICBjYXNlICdyZXNldCc6XG4gICAgY2FzZSAncmVzaXplJzpcbiAgICBjYXNlICdzZWVrZWQnOlxuICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgY2FzZSAndG91Y2hjYW5jZWwnOlxuICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICBjYXNlICd2b2x1bWVjaGFuZ2UnOiAvLyBVc2VkIGJ5IHBvbHlmaWxsczpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2NoYW5nZSc6XG4gICAgY2FzZSAnc2VsZWN0aW9uY2hhbmdlJzpcbiAgICBjYXNlICd0ZXh0SW5wdXQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uc3RhcnQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICBjYXNlICdjb21wb3NpdGlvbnVwZGF0ZSc6IC8vIE9ubHkgZW5hYmxlQ3JlYXRlRXZlbnRIYW5kbGVBUEk6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdiZWZvcmVibHVyJzpcbiAgICBjYXNlICdhZnRlcmJsdXInOiAvLyBOb3QgdXNlZCBieSBSZWFjdCBidXQgY291bGQgYmUgYnkgdXNlciBjb2RlOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnYmVmb3JlaW5wdXQnOlxuICAgIGNhc2UgJ2JsdXInOlxuICAgIGNhc2UgJ2Z1bGxzY3JlZW5jaGFuZ2UnOlxuICAgIGNhc2UgJ2ZvY3VzJzpcbiAgICBjYXNlICdoYXNoY2hhbmdlJzpcbiAgICBjYXNlICdwb3BzdGF0ZSc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICdzZWxlY3RzdGFydCc6XG4gICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuXG4gICAgY2FzZSAnZHJhZyc6XG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnZXhpdCc6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3Njcm9sbCc6XG4gICAgY2FzZSAndG9nZ2xlJzpcbiAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgIGNhc2UgJ3doZWVsJzogLy8gTm90IHVzZWQgYnkgUmVhY3QgYnV0IGNvdWxkIGJlIGJ5IHVzZXIgY29kZTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ21vdXNlZW50ZXInOlxuICAgIGNhc2UgJ21vdXNlbGVhdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJlbnRlcic6XG4gICAgY2FzZSAncG9pbnRlcmxlYXZlJzpcbiAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcblxuICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgICAge1xuICAgICAgICAvLyBXZSBtaWdodCBiZSBpbiB0aGUgU2NoZWR1bGVyIGNhbGxiYWNrLlxuICAgICAgICAvLyBFdmVudHVhbGx5IHRoaXMgbWVjaGFuaXNtIHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBjaGVja1xuICAgICAgICAvLyBvZiB0aGUgY3VycmVudCBwcmlvcml0eSBvbiB0aGUgbmF0aXZlIHNjaGVkdWxlci5cbiAgICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5ID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcblxuICAgICAgICBzd2l0Y2ggKHNjaGVkdWxlclByaW9yaXR5KSB7XG4gICAgICAgICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgICAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIExvd1NjaGVkdWxlclByaW9yaXR5LCBzb21laG93LiBNYXliZSB0aGUgc2FtZSBsYW5lIGFzIGh5ZHJhdGlvbi5cbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyLCBwYXNzaXZlKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyLCBwYXNzaXZlKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHtcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH0pO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5cbi8qKlxuICogVGhlc2UgdmFyaWFibGVzIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRleHQgY29udGVudCBvZiBhIHRhcmdldCBub2RlLFxuICogYWxsb3dpbmcgY29tcGFyaXNvbiBvZiBjb250ZW50IGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBJZGVudGlmeSB0aGUgbm9kZSB3aGVyZSBzZWxlY3Rpb24gY3VycmVudGx5IGJlZ2lucywgdGhlbiBvYnNlcnZlXG4gKiBib3RoIGl0cyB0ZXh0IGNvbnRlbnQgYW5kIGl0cyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBET00uIFNpbmNlIHRoZVxuICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW5cbiAqIHVzZSBpdHMgcG9zaXRpb24gdG8gZmluZCBpdHMgcmVwbGFjZW1lbnQuXG4gKlxuICpcbiAqL1xudmFyIHJvb3QgPSBudWxsO1xudmFyIHN0YXJ0VGV4dCA9IG51bGw7XG52YXIgZmFsbGJhY2tUZXh0ID0gbnVsbDtcbmZ1bmN0aW9uIGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcm9vdCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICBzdGFydFRleHQgPSBnZXRUZXh0KCk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcmVzZXQoKSB7XG4gIHJvb3QgPSBudWxsO1xuICBzdGFydFRleHQgPSBudWxsO1xuICBmYWxsYmFja1RleHQgPSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0RGF0YSgpIHtcbiAgaWYgKGZhbGxiYWNrVGV4dCkge1xuICAgIHJldHVybiBmYWxsYmFja1RleHQ7XG4gIH1cblxuICB2YXIgc3RhcnQ7XG4gIHZhciBzdGFydFZhbHVlID0gc3RhcnRUZXh0O1xuICB2YXIgc3RhcnRMZW5ndGggPSBzdGFydFZhbHVlLmxlbmd0aDtcbiAgdmFyIGVuZDtcbiAgdmFyIGVuZFZhbHVlID0gZ2V0VGV4dCgpO1xuICB2YXIgZW5kTGVuZ3RoID0gZW5kVmFsdWUubGVuZ3RoO1xuXG4gIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IHN0YXJ0TGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRdICE9PSBlbmRWYWx1ZVtzdGFydF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBtaW5FbmQgPSBzdGFydExlbmd0aCAtIHN0YXJ0O1xuXG4gIGZvciAoZW5kID0gMTsgZW5kIDw9IG1pbkVuZDsgZW5kKyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gIT09IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzbGljZVRhaWwgPSBlbmQgPiAxID8gMSAtIGVuZCA6IHVuZGVmaW5lZDtcbiAgZmFsbGJhY2tUZXh0ID0gZW5kVmFsdWUuc2xpY2Uoc3RhcnQsIHNsaWNlVGFpbCk7XG4gIHJldHVybiBmYWxsYmFja1RleHQ7XG59XG5mdW5jdGlvbiBnZXRUZXh0KCkge1xuICBpZiAoJ3ZhbHVlJyBpbiByb290KSB7XG4gICAgcmV0dXJuIHJvb3QudmFsdWU7XG4gIH1cblxuICByZXR1cm4gcm9vdC50ZXh0Q29udGVudDtcbn1cblxuLyoqXG4gKiBgY2hhckNvZGVgIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBcImNoYXJhY3RlciBjb2RlXCIgYW5kIGlzIHNhZmUgdG8gdXNlIHdpdGhcbiAqIGBTdHJpbmcuZnJvbUNoYXJDb2RlYC4gQXMgc3VjaCwgb25seSBrZXlzIHRoYXQgY29ycmVzcG9uZCB0byBwcmludGFibGVcbiAqIGNoYXJhY3RlcnMgcHJvZHVjZSBhIHZhbGlkIGBjaGFyQ29kZWAsIHRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIEVudGVyLlxuICogVGhlIFRhYi1rZXkgaXMgY29uc2lkZXJlZCBub24tcHJpbnRhYmxlIGFuZCBkb2VzIG5vdCBoYXZlIGEgYGNoYXJDb2RlYCxcbiAqIHByZXN1bWFibHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm9kdWNlIGEgdGFiLWNoYXJhY3RlciBpbiBicm93c2Vycy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IE5vcm1hbGl6ZWQgYGNoYXJDb2RlYCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkge1xuICB2YXIgY2hhckNvZGU7XG4gIHZhciBrZXlDb2RlID0gbmF0aXZlRXZlbnQua2V5Q29kZTtcblxuICBpZiAoJ2NoYXJDb2RlJyBpbiBuYXRpdmVFdmVudCkge1xuICAgIGNoYXJDb2RlID0gbmF0aXZlRXZlbnQuY2hhckNvZGU7IC8vIEZGIGRvZXMgbm90IHNldCBgY2hhckNvZGVgIGZvciB0aGUgRW50ZXIta2V5LCBjaGVjayBhZ2FpbnN0IGBrZXlDb2RlYC5cblxuICAgIGlmIChjaGFyQ29kZSA9PT0gMCAmJiBrZXlDb2RlID09PSAxMykge1xuICAgICAgY2hhckNvZGUgPSAxMztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSUU4IGRvZXMgbm90IGltcGxlbWVudCBgY2hhckNvZGVgLCBidXQgYGtleUNvZGVgIGhhcyB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICBjaGFyQ29kZSA9IGtleUNvZGU7XG4gIH0gLy8gSUUgYW5kIEVkZ2UgKG9uIFdpbmRvd3MpIGFuZCBDaHJvbWUgLyBTYWZhcmkgKG9uIFdpbmRvd3MgYW5kIExpbnV4KVxuICAvLyByZXBvcnQgRW50ZXIgYXMgY2hhckNvZGUgMTAgd2hlbiBjdHJsIGlzIHByZXNzZWQuXG5cblxuICBpZiAoY2hhckNvZGUgPT09IDEwKSB7XG4gICAgY2hhckNvZGUgPSAxMztcbiAgfSAvLyBTb21lIG5vbi1wcmludGFibGUga2V5cyBhcmUgcmVwb3J0ZWQgaW4gYGNoYXJDb2RlYC9ga2V5Q29kZWAsIGRpc2NhcmQgdGhlbS5cbiAgLy8gTXVzdCBub3QgZGlzY2FyZCB0aGUgKG5vbi0pcHJpbnRhYmxlIEVudGVyLWtleS5cblxuXG4gIGlmIChjaGFyQ29kZSA+PSAzMiB8fCBjaGFyQ29kZSA9PT0gMTMpIHtcbiAgICByZXR1cm4gY2hhckNvZGU7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn0gLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGEgZmFjdG9yeSBzbyB0aGF0IHdlIGhhdmUgZGlmZmVyZW50IHJldHVybmVkIGNvbnN0cnVjdG9ycy5cbi8vIElmIHdlIGhhZCBhIHNpbmdsZSBjb25zdHJ1Y3RvciwgaXQgd291bGQgYmUgbWVnYW1vcnBoaWMgYW5kIGVuZ2luZXMgd291bGQgZGVvcHQuXG5cblxuZnVuY3Rpb24gY3JlYXRlU3ludGhldGljRXZlbnQoSW50ZXJmYWNlKSB7XG4gIC8qKlxuICAgKiBTeW50aGV0aWMgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIGJ5IGV2ZW50IHBsdWdpbnMsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhXG4gICAqIHRvcC1sZXZlbCBldmVudCBkZWxlZ2F0aW9uIGhhbmRsZXIuXG4gICAqXG4gICAqIFRoZXNlIHN5c3RlbXMgc2hvdWxkIGdlbmVyYWxseSB1c2UgcG9vbGluZyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBnYXJiYWdlXG4gICAqIGNvbGxlY3Rpb24uIFRoZSBzeXN0ZW0gc2hvdWxkIGNoZWNrIGBpc1BlcnNpc3RlbnRgIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZVxuICAgKiBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgaW50byB0aGUgcG9vbCBhZnRlciBiZWluZyBkaXNwYXRjaGVkLiBVc2VycyB0aGF0XG4gICAqIG5lZWQgYSBwZXJzaXN0ZWQgZXZlbnQgc2hvdWxkIGludm9rZSBgcGVyc2lzdGAuXG4gICAqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgKGFuZCBzdWJjbGFzc2VzKSBpbXBsZW1lbnQgdGhlIERPTSBMZXZlbCAzIEV2ZW50cyBBUEkgYnlcbiAgICogbm9ybWFsaXppbmcgYnJvd3NlciBxdWlya3MuIFN1YmNsYXNzZXMgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gaW1wbGVtZW50IGFcbiAgICogRE9NIGludGVyZmFjZTsgY3VzdG9tIGFwcGxpY2F0aW9uLXNwZWNpZmljIGV2ZW50cyBjYW4gYWxzbyBzdWJjbGFzcyB0aGlzLlxuICAgKi9cbiAgZnVuY3Rpb24gU3ludGhldGljQmFzZUV2ZW50KHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHRoaXMuX3JlYWN0TmFtZSA9IHJlYWN0TmFtZTtcbiAgICB0aGlzLl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgICB0aGlzLnR5cGUgPSByZWFjdEV2ZW50VHlwZTtcbiAgICB0aGlzLm5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX3Byb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgICAgaWYgKCFJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkoX3Byb3BOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vcm1hbGl6ZSA9IEludGVyZmFjZVtfcHJvcE5hbWVdO1xuXG4gICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5vcm1hbGl6ZShuYXRpdmVFdmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW19wcm9wTmFtZV0gPSBuYXRpdmVFdmVudFtfcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IG5hdGl2ZUV2ZW50LnJldHVyblZhbHVlID09PSBmYWxzZTtcblxuICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYXNzaWduKFN5bnRoZXRpY0Jhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgIT09ICd1bmtub3duJykge1xuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgLy8gVGhlIENoYW5nZUV2ZW50UGx1Z2luIHJlZ2lzdGVycyBhIFwicHJvcGVydHljaGFuZ2VcIiBldmVudCBmb3JcbiAgICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgICAvLyB0eXBlb2YgY2hlY2sgb2YgXCJ1bmtub3duXCIgY2lyY3VtdmVudHMgdGhpcyBpc3N1ZSAoYW5kIGlzIGFsc29cbiAgICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICovXG4gICAgcGVyc2lzdDogZnVuY3Rpb24gKCkgey8vIE1vZGVybiBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNQZXJzaXN0ZW50OiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICB9KTtcbiAgcmV0dXJuIFN5bnRoZXRpY0Jhc2VFdmVudDtcbn1cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGV2ZW50UGhhc2U6IDAsXG4gIGJ1YmJsZXM6IDAsXG4gIGNhbmNlbGFibGU6IDAsXG4gIHRpbWVTdGFtcDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xuICB9LFxuICBkZWZhdWx0UHJldmVudGVkOiAwLFxuICBpc1RydXN0ZWQ6IDBcbn07XG52YXIgU3ludGhldGljRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChFdmVudEludGVyZmFjZSk7XG5cbnZhciBVSUV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICB2aWV3OiAwLFxuICBkZXRhaWw6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpO1xudmFyIGxhc3RNb3ZlbWVudFg7XG52YXIgbGFzdE1vdmVtZW50WTtcbnZhciBsYXN0TW91c2VFdmVudDtcblxuZnVuY3Rpb24gdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICE9PSBsYXN0TW91c2VFdmVudCkge1xuICAgIGlmIChsYXN0TW91c2VFdmVudCAmJiBldmVudC50eXBlID09PSAnbW91c2Vtb3ZlJykge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gMDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSAwO1xuICAgIH1cblxuICAgIGxhc3RNb3VzZUV2ZW50ID0gZXZlbnQ7XG4gIH1cbn1cbi8qKlxuICogQGludGVyZmFjZSBNb3VzZUV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBNb3VzZUV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHNjcmVlblg6IDAsXG4gIHNjcmVlblk6IDAsXG4gIGNsaWVudFg6IDAsXG4gIGNsaWVudFk6IDAsXG4gIHBhZ2VYOiAwLFxuICBwYWdlWTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICBidXR0b246IDAsXG4gIGJ1dHRvbnM6IDAsXG4gIHJlbGF0ZWRUYXJnZXQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC5yZWxhdGVkVGFyZ2V0ID09PSB1bmRlZmluZWQpIHJldHVybiBldmVudC5mcm9tRWxlbWVudCA9PT0gZXZlbnQuc3JjRWxlbWVudCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50O1xuICAgIHJldHVybiBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICB9LFxuICBtb3ZlbWVudFg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRYJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WDtcbiAgICB9XG5cbiAgICB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZShldmVudCk7XG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFg7XG4gIH0sXG4gIG1vdmVtZW50WTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFknIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRZO1xuICAgIH0gLy8gRG9uJ3QgbmVlZCB0byBjYWxsIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKCkgaGVyZVxuICAgIC8vIGJlY2F1c2UgaXQncyBndWFyYW50ZWVkIHRvIGhhdmUgYWxyZWFkeSBydW4gd2hlbiBtb3ZlbWVudFhcbiAgICAvLyB3YXMgY29waWVkLlxuXG5cbiAgICByZXR1cm4gbGFzdE1vdmVtZW50WTtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoTW91c2VFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRHJhZ0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgRHJhZ0V2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGFUcmFuc2ZlcjogMFxufSk7XG5cbnZhciBTeW50aGV0aWNEcmFnRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChEcmFnRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEZvY3VzRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBGb2N1c0V2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEZvY3VzRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtYW5pbWF0aW9ucy8jQW5pbWF0aW9uRXZlbnQtaW50ZXJmYWNlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BbmltYXRpb25FdmVudFxuICovXG5cbnZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgYW5pbWF0aW9uTmFtZTogMCxcbiAgZWxhcHNlZFRpbWU6IDAsXG4gIHBzZXVkb0VsZW1lbnQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQW5pbWF0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChBbmltYXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY2xpcGJvYXJkLWFwaXMvXG4gKi9cblxudmFyIENsaXBib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBjbGlwYm9hcmREYXRhOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2NsaXBib2FyZERhdGEnIGluIGV2ZW50ID8gZXZlbnQuY2xpcGJvYXJkRGF0YSA6IHdpbmRvdy5jbGlwYm9hcmREYXRhO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9uZXZlbnRzXG4gKi9cblxudmFyIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGE6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQ29tcG9zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1XG4gKiAgICAgIC8jZXZlbnRzLWlucHV0ZXZlbnRzXG4gKi9cbi8vIEhhcHBlbnMgdG8gc2hhcmUgdGhlIHNhbWUgbGlzdCBmb3Igbm93LlxuXG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7XG4vKipcbiAqIE5vcm1hbGl6YXRpb24gb2YgZGVwcmVjYXRlZCBIVE1MNSBga2V5YCB2YWx1ZXNcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIGxlZ2FjeSBga2V5Q29kZWAgdG8gSFRNTDUgYGtleWBcbiAqIE9ubHkgc3BlY2lhbCBrZXlzIHN1cHBvcnRlZCwgYWxsIG90aGVycyBkZXBlbmQgb24ga2V5Ym9hcmQgbGF5b3V0IG9yIGJyb3dzZXJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAnOCc6ICdCYWNrc3BhY2UnLFxuICAnOSc6ICdUYWInLFxuICAnMTInOiAnQ2xlYXInLFxuICAnMTMnOiAnRW50ZXInLFxuICAnMTYnOiAnU2hpZnQnLFxuICAnMTcnOiAnQ29udHJvbCcsXG4gICcxOCc6ICdBbHQnLFxuICAnMTknOiAnUGF1c2UnLFxuICAnMjAnOiAnQ2Fwc0xvY2snLFxuICAnMjcnOiAnRXNjYXBlJyxcbiAgJzMyJzogJyAnLFxuICAnMzMnOiAnUGFnZVVwJyxcbiAgJzM0JzogJ1BhZ2VEb3duJyxcbiAgJzM1JzogJ0VuZCcsXG4gICczNic6ICdIb21lJyxcbiAgJzM3JzogJ0Fycm93TGVmdCcsXG4gICczOCc6ICdBcnJvd1VwJyxcbiAgJzM5JzogJ0Fycm93UmlnaHQnLFxuICAnNDAnOiAnQXJyb3dEb3duJyxcbiAgJzQ1JzogJ0luc2VydCcsXG4gICc0Nic6ICdEZWxldGUnLFxuICAnMTEyJzogJ0YxJyxcbiAgJzExMyc6ICdGMicsXG4gICcxMTQnOiAnRjMnLFxuICAnMTE1JzogJ0Y0JyxcbiAgJzExNic6ICdGNScsXG4gICcxMTcnOiAnRjYnLFxuICAnMTE4JzogJ0Y3JyxcbiAgJzExOSc6ICdGOCcsXG4gICcxMjAnOiAnRjknLFxuICAnMTIxJzogJ0YxMCcsXG4gICcxMjInOiAnRjExJyxcbiAgJzEyMyc6ICdGMTInLFxuICAnMTQ0JzogJ051bUxvY2snLFxuICAnMTQ1JzogJ1Njcm9sbExvY2snLFxuICAnMjI0JzogJ01ldGEnXG59O1xuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgYGtleWAgcHJvcGVydHkuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cbiAgICAvLyBGaXJlRm94IGltcGxlbWVudHMgYGtleWAgYnV0IHJldHVybnMgYE1velByaW50YWJsZUtleWAgZm9yIGFsbFxuICAgIC8vIHByaW50YWJsZSBjaGFyYWN0ZXJzIChub3JtYWxpemVkIHRvIGBVbmlkZW50aWZpZWRgKSwgaWdub3JlIGl0LlxuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XSB8fCBuYXRpdmVFdmVudC5rZXk7XG5cbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH0gLy8gQnJvd3NlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGtleWAsIHBvbHlmaWxsIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLlxuXG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsgLy8gVGhlIGVudGVyLWtleSBpcyB0ZWNobmljYWxseSBib3RoIHByaW50YWJsZSBhbmQgbm9uLXByaW50YWJsZSBhbmQgY2FuXG4gICAgLy8gdGh1cyBiZSBjYXB0dXJlZCBieSBga2V5cHJlc3NgLCBubyBvdGhlciBub24tcHJpbnRhYmxlIGtleSBzaG91bGQuXG5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaFxuICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuXG4gICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIG1vZGlmaWVyIGtleSB0byB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBpbiB0aGUgZXZlbnQuXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8ja2V5cy1Nb2RpZmllcnNcbiAqL1xuXG5cbnZhciBtb2RpZmllcktleVRvUHJvcCA9IHtcbiAgQWx0OiAnYWx0S2V5JyxcbiAgQ29udHJvbDogJ2N0cmxLZXknLFxuICBNZXRhOiAnbWV0YUtleScsXG4gIFNoaWZ0OiAnc2hpZnRLZXknXG59OyAvLyBPbGRlciBicm93c2VycyAoU2FmYXJpIDw9IDEwLCBpT1MgU2FmYXJpIDw9IDEwLjIpIGRvIG5vdCBzdXBwb3J0XG4vLyBnZXRNb2RpZmllclN0YXRlLiBJZiBnZXRNb2RpZmllclN0YXRlIGlzIG5vdCBzdXBwb3J0ZWQsIHdlIG1hcCBpdCB0byBhIHNldCBvZlxuLy8gbW9kaWZpZXIga2V5cyBleHBvc2VkIGJ5IHRoZSBldmVudC4gSW4gdGhpcyBjYXNlLCBMb2NrLWtleXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cbmZ1bmN0aW9uIG1vZGlmaWVyU3RhdGVHZXR0ZXIoa2V5QXJnKSB7XG4gIHZhciBzeW50aGV0aWNFdmVudCA9IHRoaXM7XG4gIHZhciBuYXRpdmVFdmVudCA9IHN5bnRoZXRpY0V2ZW50Lm5hdGl2ZUV2ZW50O1xuXG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuXG4gIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtcbiAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIGtleTogZ2V0RXZlbnRLZXksXG4gIGNvZGU6IDAsXG4gIGxvY2F0aW9uOiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICByZXBlYXQ6IDAsXG4gIGxvY2FsZTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICAvLyBMZWdhY3kgSW50ZXJmYWNlXG4gIGNoYXJDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgY2hhckNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlQcmVzcyBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGUgYWN0dWFsIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gICAgLy8gS2V5UHJlc3MgaXMgZGVwcmVjYXRlZCwgYnV0IGl0cyByZXBsYWNlbWVudCBpcyBub3QgeWV0IGZpbmFsIGFuZCBub3RcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBhbnkgbWFqb3IgYnJvd3Nlci4gT25seSBLZXlQcmVzcyBoYXMgY2hhckNvZGUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGtleUNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlEb3duL1VwIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHBoeXNpY2FsIGtleWJvYXJkIGtleS5cbiAgICAvLyBUaGUgYWN0dWFsIG1lYW5pbmcgb2YgdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIHVzZXJzJyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWQuIEFzc3VtaW5nIHRoYXQgaXQgaXMgYSBVUyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyBwcm92aWRlcyBhIHN1cnByaXNpbmdseSBhY2N1cmF0ZSBtYXBwaW5nIGZvciBVUyBhbmQgRXVyb3BlYW4gdXNlcnMuXG4gICAgLy8gRHVlIHRvIHRoaXMsIGl0IGlzIGxlZnQgdG8gdGhlIHVzZXIgdG8gaW1wbGVtZW50IGF0IHRoaXMgdGltZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9LFxuICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYHdoaWNoYCBpcyBhbiBhbGlhcyBmb3IgZWl0aGVyIGBrZXlDb2RlYCBvciBgY2hhckNvZGVgIGRlcGVuZGluZyBvbiB0aGVcbiAgICAvLyB0eXBlIG9mIHRoZSBldmVudC5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljS2V5Ym9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEtleWJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFBvaW50ZXJFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9wb2ludGVyZXZlbnRzL1xuICovXG5cbnZhciBQb2ludGVyRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgcG9pbnRlcklkOiAwLFxuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBwcmVzc3VyZTogMCxcbiAgdGFuZ2VudGlhbFByZXNzdXJlOiAwLFxuICB0aWx0WDogMCxcbiAgdGlsdFk6IDAsXG4gIHR3aXN0OiAwLFxuICBwb2ludGVyVHlwZTogMCxcbiAgaXNQcmltYXJ5OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1BvaW50ZXJFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFBvaW50ZXJFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgVG91Y2hFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi90b3VjaC1ldmVudHMvXG4gKi9cblxudmFyIFRvdWNoRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgdG91Y2hlczogMCxcbiAgdGFyZ2V0VG91Y2hlczogMCxcbiAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxufSk7XG5cbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG91Y2hFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMDkwMzIwLyN0cmFuc2l0aW9uLWV2ZW50cy1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RyYW5zaXRpb25FdmVudFxuICovXG5cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIHByb3BlcnR5TmFtZTogMCxcbiAgZWxhcHNlZFRpbWU6IDAsXG4gIHBzZXVkb0VsZW1lbnQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBXaGVlbEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgV2hlZWxFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBkZWx0YVg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFYJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWCA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWGAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChyaWdodCBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFYJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWCA6IDA7XG4gIH0sXG4gIGRlbHRhWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVknIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFZYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YWAgZm9yIElFPDkgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGEnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGEgOiAwO1xuICB9LFxuICBkZWx0YVo6IDAsXG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgXCJkZWx0YU1vZGVcIiBpcyByZXBvcnRpbmcgaW4gcmF3IHdoZWVsIGRlbHRhIHdoZXJlIG9uZVxuICAvLyBub3RjaCBvbiB0aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0gMTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxzLlxuICAvLyBBIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBET01fREVMVEFfTElORSAoMSkgaXMgNSUgb2Ygdmlld3BvcnQgc2l6ZSBvclxuICAvLyB+NDAgcGl4ZWxzLCBmb3IgRE9NX0RFTFRBX1NDUkVFTiAoMikgaXQgaXMgODcuNSUgb2Ygdmlld3BvcnQgc2l6ZS5cbiAgZGVsdGFNb2RlOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1doZWVsRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChXaGVlbEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIEVORF9LRVlDT0RFUyA9IFs5LCAxMywgMjcsIDMyXTsgLy8gVGFiLCBSZXR1cm4sIEVzYywgU3BhY2VcblxudmFyIFNUQVJUX0tFWUNPREUgPSAyMjk7XG52YXIgY2FuVXNlQ29tcG9zaXRpb25FdmVudCA9IGNhblVzZURPTSAmJiAnQ29tcG9zaXRpb25FdmVudCcgaW4gd2luZG93O1xudmFyIGRvY3VtZW50TW9kZSA9IG51bGw7XG5cbmlmIChjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQpIHtcbiAgZG9jdW1lbnRNb2RlID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xufSAvLyBXZWJraXQgb2ZmZXJzIGEgdmVyeSB1c2VmdWwgYHRleHRJbnB1dGAgZXZlbnQgdGhhdCBjYW4gYmUgdXNlZCB0b1xuLy8gZGlyZWN0bHkgcmVwcmVzZW50IGBiZWZvcmVJbnB1dGAuIFRoZSBJRSBgdGV4dGlucHV0YCBldmVudCBpcyBub3QgYXNcbi8vIHVzZWZ1bCwgc28gd2UgZG9uJ3QgdXNlIGl0LlxuXG5cbnZhciBjYW5Vc2VUZXh0SW5wdXRFdmVudCA9IGNhblVzZURPTSAmJiAnVGV4dEV2ZW50JyBpbiB3aW5kb3cgJiYgIWRvY3VtZW50TW9kZTsgLy8gSW4gSUU5Kywgd2UgaGF2ZSBhY2Nlc3MgdG8gY29tcG9zaXRpb24gZXZlbnRzLCBidXQgdGhlIGRhdGEgc3VwcGxpZWRcbi8vIGJ5IHRoZSBuYXRpdmUgY29tcG9zaXRpb25lbmQgZXZlbnQgbWF5IGJlIGluY29ycmVjdC4gSmFwYW5lc2UgaWRlb2dyYXBoaWNcbi8vIHNwYWNlcywgZm9yIGluc3RhbmNlIChcXHUzMDAwKSBhcmUgbm90IHJlY29yZGVkIGNvcnJlY3RseS5cblxudmFyIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhID0gY2FuVXNlRE9NICYmICghY2FuVXNlQ29tcG9zaXRpb25FdmVudCB8fCBkb2N1bWVudE1vZGUgJiYgZG9jdW1lbnRNb2RlID4gOCAmJiBkb2N1bWVudE1vZGUgPD0gMTEpO1xudmFyIFNQQUNFQkFSX0NPREUgPSAzMjtcbnZhciBTUEFDRUJBUl9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZShTUEFDRUJBUl9DT0RFKTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25CZWZvcmVJbnB1dCcsIFsnY29tcG9zaXRpb25lbmQnLCAna2V5cHJlc3MnLCAndGV4dElucHV0JywgJ3Bhc3RlJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25FbmQnLCBbJ2NvbXBvc2l0aW9uZW5kJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25TdGFydCcsIFsnY29tcG9zaXRpb25zdGFydCcsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uVXBkYXRlJywgWydjb21wb3NpdGlvbnVwZGF0ZScsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbn0gLy8gVHJhY2sgd2hldGhlciB3ZSd2ZSBldmVyIGhhbmRsZWQgYSBrZXlwcmVzcyBvbiB0aGUgc3BhY2Uga2V5LlxuXG5cbnZhciBoYXNTcGFjZUtleXByZXNzID0gZmFsc2U7XG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGEgbmF0aXZlIGtleXByZXNzIGV2ZW50IGlzIGFzc3VtZWQgdG8gYmUgYSBjb21tYW5kLlxuICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIEZpcmVmb3ggZmlyZXMgYGtleXByZXNzYCBldmVudHMgZm9yIGtleSBjb21tYW5kc1xuICogKGN1dCwgY29weSwgc2VsZWN0LWFsbCwgZXRjLikgZXZlbiB0aG91Z2ggbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLlxuICovXG5cbmZ1bmN0aW9uIGlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiAobmF0aXZlRXZlbnQuY3RybEtleSB8fCBuYXRpdmVFdmVudC5hbHRLZXkgfHwgbmF0aXZlRXZlbnQubWV0YUtleSkgJiYgLy8gY3RybEtleSAmJiBhbHRLZXkgaXMgZXF1aXZhbGVudCB0byBBbHRHciwgYW5kIGlzIG5vdCBhIGNvbW1hbmQuXG4gICEobmF0aXZlRXZlbnQuY3RybEtleSAmJiBuYXRpdmVFdmVudC5hbHRLZXkpO1xufVxuLyoqXG4gKiBUcmFuc2xhdGUgbmF0aXZlIHRvcCBsZXZlbCBldmVudHMgaW50byBldmVudCB0eXBlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKGRvbUV2ZW50TmFtZSkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2NvbXBvc2l0aW9uc3RhcnQnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uU3RhcnQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uRW5kJztcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9udXBkYXRlJzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvblVwZGF0ZSc7XG4gIH1cbn1cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgYmVzdC1ndWVzcyBtb2RlbCB0aGluayB0aGlzIGV2ZW50IHNpZ25pZmllcyB0aGF0XG4gKiBjb21wb3NpdGlvbiBoYXMgYmVndW4/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJyAmJiBuYXRpdmVFdmVudC5rZXlDb2RlID09PSBTVEFSVF9LRVlDT0RFO1xufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBtb2RlIHRoaW5rIHRoYXQgdGhpcyBldmVudCBpcyB0aGUgZW5kIG9mIGNvbXBvc2l0aW9uP1xuICovXG5cblxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICAvLyBDb21tYW5kIGtleXMgaW5zZXJ0IG9yIGNsZWFyIElNRSBpbnB1dC5cbiAgICAgIHJldHVybiBFTkRfS0VZQ09ERVMuaW5kZXhPZihuYXRpdmVFdmVudC5rZXlDb2RlKSAhPT0gLTE7XG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICAgIC8vIEV4cGVjdCBJTUUga2V5Q29kZSBvbiBlYWNoIGtleWRvd24uIElmIHdlIGdldCBhbnkgb3RoZXJcbiAgICAgIC8vIGNvZGUgd2UgbXVzdCBoYXZlIGV4aXRlZCBlYXJsaWVyLlxuICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmtleUNvZGUgIT09IFNUQVJUX0tFWUNPREU7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICAvLyBFdmVudHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbmNlbGxpbmcgSU1FLlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIEdvb2dsZSBJbnB1dCBUb29scyBwcm92aWRlcyBjb21wb3NpdGlvbiBkYXRhIHZpYSBhIEN1c3RvbUV2ZW50LFxuICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRlZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIGV2ZW50IG9iamVjdCwgdXNlIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBwbGFpblxuICogY29tcG9zaXRpb24gZXZlbnQgYW5kIHdlIGhhdmUgbm90aGluZyBzcGVjaWFsIHRvIGV4dHJhY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHs/c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGV0YWlsID0gbmF0aXZlRXZlbnQuZGV0YWlsO1xuXG4gIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7XG4gICAgcmV0dXJuIGRldGFpbC5kYXRhO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIENoZWNrIGlmIGEgY29tcG9zaXRpb24gZXZlbnQgd2FzIHRyaWdnZXJlZCBieSBLb3JlYW4gSU1FLlxuICogT3VyIGZhbGxiYWNrIG1vZGUgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggSUUncyBLb3JlYW4gSU1FLFxuICogc28ganVzdCB1c2UgbmF0aXZlIGNvbXBvc2l0aW9uIGV2ZW50cyB3aGVuIEtvcmVhbiBJTUUgaXMgdXNlZC5cbiAqIEFsdGhvdWdoIENvbXBvc2l0aW9uRXZlbnQubG9jYWxlIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsXG4gKiBpdCBpcyBhdmFpbGFibGUgaW4gSUUsIHdoZXJlIG91ciBmYWxsYmFjayBtb2RlIGlzIGVuYWJsZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cblxuZnVuY3Rpb24gaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbmF0aXZlRXZlbnQubG9jYWxlID09PSAna28nO1xufSAvLyBUcmFjayB0aGUgY3VycmVudCBJTUUgY29tcG9zaXRpb24gc3RhdHVzLCBpZiBhbnkuXG5cblxudmFyIGlzQ29tcG9zaW5nID0gZmFsc2U7XG4vKipcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5cbiAqL1xuXG5mdW5jdGlvbiBleHRyYWN0Q29tcG9zaXRpb25FdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgZXZlbnRUeXBlO1xuICB2YXIgZmFsbGJhY2tEYXRhO1xuXG4gIGlmIChjYW5Vc2VDb21wb3NpdGlvbkV2ZW50KSB7XG4gICAgZXZlbnRUeXBlID0gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKTtcbiAgfSBlbHNlIGlmICghaXNDb21wb3NpbmcpIHtcbiAgICBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uU3RhcnQnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICBldmVudFR5cGUgPSAnb25Db21wb3NpdGlvbkVuZCc7XG4gIH1cblxuICBpZiAoIWV2ZW50VHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIFRoZSBjdXJyZW50IGNvbXBvc2l0aW9uIGlzIHN0b3JlZCBzdGF0aWNhbGx5IGFuZCBtdXN0IG5vdCBiZVxuICAgIC8vIG92ZXJ3cml0dGVuIHdoaWxlIGNvbXBvc2l0aW9uIGNvbnRpbnVlcy5cbiAgICBpZiAoIWlzQ29tcG9zaW5nICYmIGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25TdGFydCcpIHtcbiAgICAgIGlzQ29tcG9zaW5nID0gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uRW5kJykge1xuICAgICAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgICAgIGZhbGxiYWNrRGF0YSA9IGdldERhdGEoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIGV2ZW50VHlwZSk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoZXZlbnRUeXBlLCBkb21FdmVudE5hbWUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG5cbiAgICBpZiAoZmFsbGJhY2tEYXRhKSB7XG4gICAgICAvLyBJbmplY3QgZGF0YSBnZW5lcmF0ZWQgZnJvbSBmYWxsYmFjayBwYXRoIGludG8gdGhlIHN5bnRoZXRpYyBldmVudC5cbiAgICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgcHJvcGVydHkgb2YgbmF0aXZlIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UuXG4gICAgICBldmVudC5kYXRhID0gZmFsbGJhY2tEYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY3VzdG9tRGF0YSA9IGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuXG4gICAgICBpZiAoY3VzdG9tRGF0YSAhPT0gbnVsbCkge1xuICAgICAgICBldmVudC5kYXRhID0gY3VzdG9tRGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBJZiBuYXRpdmUgYHRleHRJbnB1dGAgZXZlbnRzIGFyZSBhdmFpbGFibGUsIG91ciBnb2FsIGlzIHRvIG1ha2VcbiAgICAgICAqIHVzZSBvZiB0aGVtLiBIb3dldmVyLCB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZTogdGhlIHNwYWNlYmFyIGtleS5cbiAgICAgICAqIEluIFdlYmtpdCwgcHJldmVudGluZyBkZWZhdWx0IG9uIGEgc3BhY2ViYXIgYHRleHRJbnB1dGAgZXZlbnRcbiAgICAgICAqIGNhbmNlbHMgY2hhcmFjdGVyIGluc2VydGlvbiwgYnV0IGl0ICphbHNvKiBjYXVzZXMgdGhlIGJyb3dzZXJcbiAgICAgICAqIHRvIGZhbGwgYmFjayB0byBpdHMgZGVmYXVsdCBzcGFjZWJhciBiZWhhdmlvciBvZiBzY3JvbGxpbmcgdGhlXG4gICAgICAgKiBwYWdlLlxuICAgICAgICpcbiAgICAgICAqIFRyYWNraW5nIGF0OlxuICAgICAgICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM1NTEwM1xuICAgICAgICpcbiAgICAgICAqIFRvIGF2b2lkIHRoaXMgaXNzdWUsIHVzZSB0aGUga2V5cHJlc3MgZXZlbnQgYXMgaWYgbm8gYHRleHRJbnB1dGBcbiAgICAgICAqIGV2ZW50IGlzIGF2YWlsYWJsZS5cbiAgICAgICAqL1xuICAgICAgdmFyIHdoaWNoID0gbmF0aXZlRXZlbnQud2hpY2g7XG5cbiAgICAgIGlmICh3aGljaCAhPT0gU1BBQ0VCQVJfQ09ERSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9IHRydWU7XG4gICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcblxuICAgIGNhc2UgJ3RleHRJbnB1dCc6XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgIHZhciBjaGFycyA9IG5hdGl2ZUV2ZW50LmRhdGE7IC8vIElmIGl0J3MgYSBzcGFjZWJhciBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkXG4gICAgICAvLyBpdCBhdCB0aGUga2V5cHJlc3MgbGV2ZWwgYW5kIGJhaWwgaW1tZWRpYXRlbHkuIEFuZHJvaWQgQ2hyb21lXG4gICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMsIHNvIHdlIG5lZWQgdG8gaWdub3JlIGl0LlxuXG4gICAgICBpZiAoY2hhcnMgPT09IFNQQUNFQkFSX0NIQVIgJiYgaGFzU3BhY2VLZXlwcmVzcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoYXJzO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEZvciBvdGhlciBuYXRpdmUgZXZlbnQgdHlwZXMsIGRvIG5vdGhpbmcuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBGb3IgYnJvd3NlcnMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUgYHRleHRJbnB1dGAgZXZlbnQsIGV4dHJhY3QgdGhlXG4gKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8gdXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBjb21wb3NpbmcgKElNRSkgYW5kIHVzaW5nIGEgZmFsbGJhY2sgdG8gZG8gc28sXG4gIC8vIHRyeSB0byBleHRyYWN0IHRoZSBjb21wb3NlZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZhbGxiYWNrIG9iamVjdC5cbiAgLy8gSWYgY29tcG9zaXRpb24gZXZlbnQgaXMgYXZhaWxhYmxlLCB3ZSBleHRyYWN0IGEgc3RyaW5nIG9ubHkgYXRcbiAgLy8gY29tcG9zaXRpb25ldmVudCwgb3RoZXJ3aXNlIGV4dHJhY3QgaXQgYXQgZmFsbGJhY2sgZXZlbnRzLlxuICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAnY29tcG9zaXRpb25lbmQnIHx8ICFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ICYmIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgdmFyIGNoYXJzID0gZ2V0RGF0YSgpO1xuICAgICAgcmVzZXQoKTtcbiAgICAgIGlzQ29tcG9zaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm4gY2hhcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICAgIC8vIElmIGEgcGFzdGUgZXZlbnQgb2NjdXJzIGFmdGVyIGEga2V5cHJlc3MsIHRocm93IG91dCB0aGUgaW5wdXRcbiAgICAgIC8vIGNoYXJzLiBQYXN0ZSBldmVudHMgc2hvdWxkIG5vdCBsZWFkIHRvIEJlZm9yZUlucHV0IGV2ZW50cy5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBBcyBvZiB2MjcsIEZpcmVmb3ggbWF5IGZpcmUga2V5cHJlc3MgZXZlbnRzIGV2ZW4gd2hlbiBubyBjaGFyYWN0ZXJcbiAgICAgICAqIHdpbGwgYmUgaW5zZXJ0ZWQuIEEgZmV3IHBvc3NpYmlsaXRpZXM6XG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIGAwYC4gQXJyb3cga2V5cywgRXNjIGtleSwgZXRjLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IG5vIGNoYXIgaXMgYXZhaWxhYmxlLlxuICAgICAgICogICBFeDogJ0FsdEdyICsgZGAgaW4gUG9saXNoLiBUaGVyZSBpcyBubyBtb2RpZmllZCBjaGFyYWN0ZXIgZm9yXG4gICAgICAgKiAgIHRoaXMga2V5IGNvbWJpbmF0aW9uIGFuZCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQgaW50byB0aGVcbiAgICAgICAqICAgZG9jdW1lbnQsIGJ1dCBGRiBmaXJlcyB0aGUga2V5cHJlc3MgZm9yIGNoYXIgY29kZSBgMTAwYCBhbnl3YXkuXG4gICAgICAgKiAgIE5vIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBhIGNvbW1hbmQgY29tYmluYXRpb24gaXNcbiAgICAgICAqICAgYmVpbmcgdXNlZC4gRXg6IGBDbWQrQ2AuIE5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCwgYW5kIG5vXG4gICAgICAgKiAgIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqL1xuICAgICAgaWYgKCFpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgLy8gSUUgZmlyZXMgdGhlIGBrZXlwcmVzc2AgZXZlbnQgd2hlbiBhIHVzZXIgdHlwZXMgYW4gZW1vamkgdmlhXG4gICAgICAgIC8vIFRvdWNoIGtleWJvYXJkIG9mIFdpbmRvd3MuICBJbiBzdWNoIGEgY2FzZSwgdGhlIGBjaGFyYCBwcm9wZXJ0eVxuICAgICAgICAvLyBob2xkcyBhbiBlbW9qaSBjaGFyYWN0ZXIgbGlrZSBgXFx1RDgzRFxcdURFMEFgLiAgQmVjYXVzZSBpdHMgbGVuZ3RoXG4gICAgICAgIC8vIGlzIDIsIHRoZSBwcm9wZXJ0eSBgd2hpY2hgIGRvZXMgbm90IHJlcHJlc2VudCBhbiBlbW9qaSBjb3JyZWN0bHkuXG4gICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlLCB3ZSBkaXJlY3RseSByZXR1cm4gdGhlIGBjaGFyYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHVzaW5nIGB3aGljaGAuXG4gICAgICAgIGlmIChuYXRpdmVFdmVudC5jaGFyICYmIG5hdGl2ZUV2ZW50LmNoYXIubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHJldHVybiBuYXRpdmVFdmVudC5jaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKG5hdGl2ZUV2ZW50LndoaWNoKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobmF0aXZlRXZlbnQud2hpY2gpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSA/IG51bGwgOiBuYXRpdmVFdmVudC5kYXRhO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEV4dHJhY3QgYSBTeW50aGV0aWNJbnB1dEV2ZW50IGZvciBgYmVmb3JlSW5wdXRgLCBiYXNlZCBvbiBlaXRoZXIgbmF0aXZlXG4gKiBgdGV4dElucHV0YCBvciBmYWxsYmFjayBiZWhhdmlvci5cbiAqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgY2hhcnM7XG5cbiAgaWYgKGNhblVzZVRleHRJbnB1dEV2ZW50KSB7XG4gICAgY2hhcnMgPSBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICB9IGVsc2Uge1xuICAgIGNoYXJzID0gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICB9IC8vIElmIG5vIGNoYXJhY3RlcnMgYXJlIGJlaW5nIGluc2VydGVkLCBubyBCZWZvcmVJbnB1dCBldmVudCBzaG91bGRcbiAgLy8gYmUgZmlyZWQuXG5cblxuICBpZiAoIWNoYXJzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsICdvbkJlZm9yZUlucHV0Jyk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0lucHV0RXZlbnQoJ29uQmVmb3JlSW5wdXQnLCAnYmVmb3JlaW5wdXQnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICAgIGV2ZW50LmRhdGEgPSBjaGFycztcbiAgfVxufVxuLyoqXG4gKiBDcmVhdGUgYW4gYG9uQmVmb3JlSW5wdXRgIGV2ZW50IHRvIG1hdGNoXG4gKiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNS8jZXZlbnRzLWlucHV0ZXZlbnRzLlxuICpcbiAqIFRoaXMgZXZlbnQgcGx1Z2luIGlzIGJhc2VkIG9uIHRoZSBuYXRpdmUgYHRleHRJbnB1dGAgZXZlbnRcbiAqIGF2YWlsYWJsZSBpbiBDaHJvbWUsIFNhZmFyaSwgT3BlcmEsIGFuZCBJRS4gVGhpcyBldmVudCBmaXJlcyBhZnRlclxuICogYG9uS2V5UHJlc3NgIGFuZCBgb25Db21wb3NpdGlvbkVuZGAsIGJ1dCBiZWZvcmUgYG9uSW5wdXRgLlxuICpcbiAqIGBiZWZvcmVJbnB1dGAgaXMgc3BlYydkIGJ1dCBub3QgaW1wbGVtZW50ZWQgaW4gYW55IGJyb3dzZXJzLCBhbmRcbiAqIHRoZSBgaW5wdXRgIGV2ZW50IGRvZXMgbm90IHByb3ZpZGUgYW55IHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGhhc1xuICogYWN0dWFsbHkgYmVlbiBhZGRlZCwgY29udHJhcnkgdG8gdGhlIHNwZWMuIFRodXMsIGB0ZXh0SW5wdXRgIGlzIHRoZSBiZXN0XG4gKiBhdmFpbGFibGUgZXZlbnQgdG8gaWRlbnRpZnkgdGhlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4gaW5zZXJ0ZWRcbiAqIGludG8gdGhlIHRhcmdldCBub2RlLlxuICpcbiAqIFRoaXMgcGx1Z2luIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGBjb21wb3NpdGlvbmAgZXZlbnRzLCB0aHVzXG4gKiBhbGxvd2luZyB1cyB0byBzaGFyZSBjb21wb3NpdGlvbiBmYWxsYmFjayBjb2RlIGZvciBib3RoIGBiZWZvcmVJbnB1dGAgYW5kXG4gKiBgY29tcG9zaXRpb25gIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvdGhlLWlucHV0LWVsZW1lbnQuaHRtbCNpbnB1dC10eXBlLWF0dHItc3VtbWFyeVxuICovXG52YXIgc3VwcG9ydGVkSW5wdXRUeXBlcyA9IHtcbiAgY29sb3I6IHRydWUsXG4gIGRhdGU6IHRydWUsXG4gIGRhdGV0aW1lOiB0cnVlLFxuICAnZGF0ZXRpbWUtbG9jYWwnOiB0cnVlLFxuICBlbWFpbDogdHJ1ZSxcbiAgbW9udGg6IHRydWUsXG4gIG51bWJlcjogdHJ1ZSxcbiAgcGFzc3dvcmQ6IHRydWUsXG4gIHJhbmdlOiB0cnVlLFxuICBzZWFyY2g6IHRydWUsXG4gIHRlbDogdHJ1ZSxcbiAgdGV4dDogdHJ1ZSxcbiAgdGltZTogdHJ1ZSxcbiAgdXJsOiB0cnVlLFxuICB3ZWVrOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBpc1RleHRJbnB1dEVsZW1lbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ2lucHV0Jykge1xuICAgIHJldHVybiAhIXN1cHBvcnRlZElucHV0VHlwZXNbZWxlbS50eXBlXTtcbiAgfVxuXG4gIGlmIChub2RlTmFtZSA9PT0gJ3RleHRhcmVhJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIE5PVEU6IFRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG5vbi1nZW5lcmljIGV2ZW50cyBzdWNoIGFzIGBjaGFuZ2VgLFxuICogYHJlc2V0YCwgYGxvYWRgLCBgZXJyb3JgLCBhbmQgYHNlbGVjdGAuXG4gKlxuICogQm9ycm93cyBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lU3VmZml4IEV2ZW50IG5hbWUsIGUuZy4gXCJjbGlja1wiLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgc3VwcG9ydGVkLlxuICogQGludGVybmFsXG4gKiBAbGljZW5zZSBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiAqL1xuXG5mdW5jdGlvbiBpc0V2ZW50U3VwcG9ydGVkKGV2ZW50TmFtZVN1ZmZpeCkge1xuICBpZiAoIWNhblVzZURPTSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBldmVudE5hbWUgPSAnb24nICsgZXZlbnROYW1lU3VmZml4O1xuICB2YXIgaXNTdXBwb3J0ZWQgPSAoZXZlbnROYW1lIGluIGRvY3VtZW50KTtcblxuICBpZiAoIWlzU3VwcG9ydGVkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShldmVudE5hbWUsICdyZXR1cm47Jyk7XG4gICAgaXNTdXBwb3J0ZWQgPSB0eXBlb2YgZWxlbWVudFtldmVudE5hbWVdID09PSAnZnVuY3Rpb24nO1xuICB9XG5cbiAgcmV0dXJuIGlzU3VwcG9ydGVkO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQxKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ2hhbmdlJywgWydjaGFuZ2UnLCAnY2xpY2snLCAnZm9jdXNpbicsICdmb2N1c291dCcsICdpbnB1dCcsICdrZXlkb3duJywgJ2tleXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpIHtcbiAgLy8gRmxhZyB0aGlzIGV2ZW50IGxvb3AgYXMgbmVlZGluZyBzdGF0ZSByZXN0b3JlLlxuICBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCk7XG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoaW5zdCwgJ29uQ2hhbmdlJyk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvbkNoYW5nZScsICdjaGFuZ2UnLCBudWxsLCBuYXRpdmVFdmVudCwgdGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBGb3IgSUUgc2hpbXNcbiAqL1xuXG5cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2hhbmdlYCBldmVudFxuICovXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNoYW5nZUV2ZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ3NlbGVjdCcgfHwgbm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgZWxlbS50eXBlID09PSAnZmlsZSc7XG59XG5cbmZ1bmN0aW9uIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpKTsgLy8gSWYgY2hhbmdlIGFuZCBwcm9wZXJ0eWNoYW5nZSBidWJibGVkLCB3ZSdkIGp1c3QgYmluZCB0byBpdCBsaWtlIGFsbCB0aGVcbiAgLy8gb3RoZXIgZXZlbnRzIGFuZCBoYXZlIGl0IGdvIHRocm91Z2ggUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLiBTaW5jZSBpdFxuICAvLyBkb2Vzbid0LCB3ZSBtYW51YWxseSBsaXN0ZW4gZm9yIHRoZSBldmVudHMgYW5kIHNvIHdlIGhhdmUgdG8gZW5xdWV1ZSBhbmRcbiAgLy8gcHJvY2VzcyB0aGUgYWJzdHJhY3QgZXZlbnQgbWFudWFsbHkuXG4gIC8vXG4gIC8vIEJhdGNoaW5nIGlzIG5lY2Vzc2FyeSBoZXJlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGFsbCBldmVudCBoYW5kbGVycyBydW5cbiAgLy8gYmVmb3JlIHRoZSBuZXh0IHJlcmVuZGVyIChpbmNsdWRpbmcgZXZlbnQgaGFuZGxlcnMgYXR0YWNoZWQgdG8gYW5jZXN0b3JcbiAgLy8gZWxlbWVudHMgaW5zdGVhZCBvZiBkaXJlY3RseSBvbiB0aGUgaW5wdXQpLiBXaXRob3V0IHRoaXMsIGNvbnRyb2xsZWRcbiAgLy8gY29tcG9uZW50cyBkb24ndCB3b3JrIHByb3Blcmx5IGluIGNvbmp1bmN0aW9uIHdpdGggZXZlbnQgYnViYmxpbmcgYmVjYXVzZVxuICAvLyB0aGUgY29tcG9uZW50IGlzIHJlcmVuZGVyZWQgYW5kIHRoZSB2YWx1ZSByZXZlcnRlZCBiZWZvcmUgYWxsIHRoZSBldmVudFxuICAvLyBoYW5kbGVycyBjYW4gcnVuLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MDguXG5cbiAgYmF0Y2hlZFVwZGF0ZXMocnVuRXZlbnRJbkJhdGNoLCBkaXNwYXRjaFF1ZXVlKTtcbn1cblxuZnVuY3Rpb24gcnVuRXZlbnRJbkJhdGNoKGRpc3BhdGNoUXVldWUpIHtcbiAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgMCk7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KSB7XG4gIHZhciB0YXJnZXROb2RlID0gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KTtcblxuICBpZiAodXBkYXRlVmFsdWVJZkNoYW5nZWQodGFyZ2V0Tm9kZSkpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBpbnB1dGAgZXZlbnRcbiAqL1xuXG5cbnZhciBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBmYWxzZTtcblxuaWYgKGNhblVzZURPTSkge1xuICAvLyBJRTkgY2xhaW1zIHRvIHN1cHBvcnQgdGhlIGlucHV0IGV2ZW50IGJ1dCBmYWlscyB0byB0cmlnZ2VyIGl0IHdoZW5cbiAgLy8gZGVsZXRpbmcgdGV4dCwgc28gd2UgaWdub3JlIGl0cyBpbnB1dCBldmVudHMuXG4gIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2lucHV0JykgJiYgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID4gOSk7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBTdGFydHMgdHJhY2tpbmcgcHJvcGVydHljaGFuZ2UgZXZlbnRzIG9uIHRoZSBwYXNzZWQtaW4gZWxlbWVudFxuICogYW5kIG92ZXJyaWRlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB1c2VyIGV2ZW50cyBmcm9tXG4gKiB2YWx1ZSBjaGFuZ2VzIGluIEpTLlxuICovXG5cblxuZnVuY3Rpb24gc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0O1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3Q7XG4gIGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBSZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lcnMgZnJvbSB0aGUgY3VycmVudGx5LXRyYWNrZWQgZWxlbWVudCxcbiAqIGlmIGFueSBleGlzdHMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHtcbiAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIEhhbmRsZXMgYSBwcm9wZXJ0eWNoYW5nZSBldmVudCwgc2VuZGluZyBhIGBjaGFuZ2VgIGV2ZW50IGlmXG4gKiB0aGUgdmFsdWUgb2YgdGhlIGFjdGl2ZSBlbGVtZW50IGhhcyBjaGFuZ2VkLlxuICovXG5cblxuZnVuY3Rpb24gaGFuZGxlUHJvcGVydHlDaGFuZ2UobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LnByb3BlcnR5TmFtZSAhPT0gJ3ZhbHVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpKSB7XG4gICAgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSwgdGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c2luJykge1xuICAgIC8vIEluIElFOSwgcHJvcGVydHljaGFuZ2UgZmlyZXMgZm9yIG1vc3QgaW5wdXQgZXZlbnRzIGJ1dCBpcyBidWdneSBhbmRcbiAgICAvLyBkb2Vzbid0IGZpcmUgd2hlbiB0ZXh0IGlzIGRlbGV0ZWQsIGJ1dCBjb252ZW5pZW50bHksIHNlbGVjdGlvbmNoYW5nZVxuICAgIC8vIGFwcGVhcnMgdG8gZmlyZSBpbiBhbGwgb2YgdGhlIHJlbWFpbmluZyBjYXNlcyBzbyB3ZSBjYXRjaCB0aG9zZSBhbmRcbiAgICAvLyBmb3J3YXJkIHRoZSBldmVudCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWRcbiAgICAvLyBJbiBlaXRoZXIgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIHRoZSB2YWx1ZVxuICAgIC8vIGlzIGNoYW5nZWQgZnJvbSBKUyBzbyB3ZSByZWRlZmluZSBhIHNldHRlciBmb3IgYC52YWx1ZWAgdGhhdCB1cGRhdGVzXG4gICAgLy8gb3VyIGFjdGl2ZUVsZW1lbnRWYWx1ZSB2YXJpYWJsZSwgYWxsb3dpbmcgdXMgdG8gaWdub3JlIHRob3NlIGNoYW5nZXNcbiAgICAvL1xuICAgIC8vIHN0b3BXYXRjaGluZygpIHNob3VsZCBiZSBhIG5vb3AgaGVyZSBidXQgd2UgY2FsbCBpdCBqdXN0IGluIGNhc2Ugd2VcbiAgICAvLyBtaXNzZWQgYSBibHVyIGV2ZW50IHNvbWVob3cuXG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgICBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KTtcbiAgfSBlbHNlIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c291dCcpIHtcbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICB9XG59IC8vIEZvciBJRTggYW5kIElFOS5cblxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnc2VsZWN0aW9uY2hhbmdlJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXl1cCcgfHwgZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicpIHtcbiAgICAvLyBPbiB0aGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50LCB0aGUgdGFyZ2V0IGlzIGp1c3QgZG9jdW1lbnQgd2hpY2ggaXNuJ3RcbiAgICAvLyBoZWxwZnVsIGZvciB1cyBzbyBqdXN0IGNoZWNrIGFjdGl2ZUVsZW1lbnQgaW5zdGVhZC5cbiAgICAvL1xuICAgIC8vIDk5JSBvZiB0aGUgdGltZSwga2V5ZG93biBhbmQga2V5dXAgYXJlbid0IG5lY2Vzc2FyeS4gSUU4IGZhaWxzIHRvIGZpcmVcbiAgICAvLyBwcm9wZXJ0eWNoYW5nZSBvbiB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYWZ0ZXIgc2V0dGluZyBgdmFsdWVgIGZyb20gYVxuICAgIC8vIHNjcmlwdCBhbmQgZmlyZXMgb25seSBrZXlkb3duLCBrZXlwcmVzcywga2V5dXAuIENhdGNoaW5nIGtleXVwIHVzdWFsbHlcbiAgICAvLyBnZXRzIGl0IGFuZCBjYXRjaGluZyBrZXlkb3duIGxldHMgdXMgZmlyZSBhbiBldmVudCBmb3IgdGhlIGZpcnN0XG4gICAgLy8ga2V5c3Ryb2tlIGlmIHVzZXIgZG9lcyBhIGtleSByZXBlYXQgKGl0J2xsIGJlIGEgbGl0dGxlIGRlbGF5ZWQ6IHJpZ2h0XG4gICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQga2V5c3Ryb2tlKS4gT3RoZXIgaW5wdXQgbWV0aG9kcyAoZS5nLiwgcGFzdGUpIHNlZW0gdG9cbiAgICAvLyBmaXJlIHNlbGVjdGlvbmNoYW5nZSBub3JtYWxseS5cbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0KTtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNsaWNrYCBldmVudFxuICovXG5cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2xpY2tFdmVudChlbGVtKSB7XG4gIC8vIFVzZSB0aGUgYGNsaWNrYCBldmVudCB0byBkZXRlY3QgY2hhbmdlcyB0byBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzLlxuICAvLyBUaGlzIGFwcHJvYWNoIHdvcmtzIGFjcm9zcyBhbGwgYnJvd3NlcnMsIHdoZXJlYXMgYGNoYW5nZWAgZG9lcyBub3QgZmlyZVxuICAvLyB1bnRpbCBgYmx1cmAgaW4gSUU4LlxuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW0udHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2xpY2snKSB7XG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnaW5wdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIobm9kZSkge1xuICB2YXIgc3RhdGUgPSBub2RlLl93cmFwcGVyU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuY29udHJvbGxlZCB8fCBub2RlLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIElmIGNvbnRyb2xsZWQsIGFzc2lnbiB0aGUgdmFsdWUgYXR0cmlidXRlIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9uIGJsdXJcbiAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgJ251bWJlcicsIG5vZGUudmFsdWUpO1xuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uQ2hhbmdlYCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgY2hhbmdlIGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuIFRoaXMgZXZlbnQgZmlyZXMgYXQgYSB0aW1lIHdoZW4gaXQncyBwb3NzaWJsZSB0b1xuICogY2hhbmdlIHRoZSBlbGVtZW50J3MgdmFsdWUgd2l0aG91dCBzZWVpbmcgYSBmbGlja2VyLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIHNlbGVjdFxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcbiAgdmFyIGdldFRhcmdldEluc3RGdW5jLCBoYW5kbGVFdmVudEZ1bmM7XG5cbiAgaWYgKHNob3VsZFVzZUNoYW5nZUV2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQ7XG4gIH0gZWxzZSBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpKSB7XG4gICAgaWYgKGlzSW5wdXRFdmVudFN1cHBvcnRlZCkge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICBoYW5kbGVFdmVudEZ1bmMgPSBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgfVxuICB9IGVsc2UgaWYgKHNob3VsZFVzZUNsaWNrRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50O1xuICB9XG5cbiAgaWYgKGdldFRhcmdldEluc3RGdW5jKSB7XG4gICAgdmFyIGluc3QgPSBnZXRUYXJnZXRJbnN0RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldEluc3QpO1xuXG4gICAgaWYgKGluc3QpIHtcbiAgICAgIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBpbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYW5kbGVFdmVudEZ1bmMpIHtcbiAgICBoYW5kbGVFdmVudEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXROb2RlLCB0YXJnZXRJbnN0KTtcbiAgfSAvLyBXaGVuIGJsdXJyaW5nLCBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSBmb3IgbnVtYmVyIGlucHV0c1xuXG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIodGFyZ2V0Tm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMigpIHtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUVudGVyJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uTW91c2VMZWF2ZScsIFsnbW91c2VvdXQnLCAnbW91c2VvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJFbnRlcicsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Qb2ludGVyTGVhdmUnLCBbJ3BvaW50ZXJvdXQnLCAncG9pbnRlcm92ZXInXSk7XG59XG4vKipcbiAqIEZvciBhbG1vc3QgZXZlcnkgaW50ZXJhY3Rpb24gd2UgY2FyZSBhYm91dCwgdGhlcmUgd2lsbCBiZSBib3RoIGEgdG9wLWxldmVsXG4gKiBgbW91c2VvdmVyYCBhbmQgYG1vdXNlb3V0YCBldmVudCB0aGF0IG9jY3Vycy4gT25seSB1c2UgYG1vdXNlb3V0YCBzbyB0aGF0XG4gKiB3ZSBkbyBub3QgZXh0cmFjdCBkdXBsaWNhdGUgZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhlXG4gKiBicm93c2VyIGZyb20gb3V0c2lkZSB3aWxsIG5vdCBmaXJlIGEgYG1vdXNlb3V0YCBldmVudC4gSW4gdGhpcyBjYXNlLCB3ZSB1c2VcbiAqIHRoZSBgbW91c2VvdmVyYCB0b3AtbGV2ZWwgZXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDIoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgaXNPdmVyRXZlbnQgPSBkb21FdmVudE5hbWUgPT09ICdtb3VzZW92ZXInIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJztcbiAgdmFyIGlzT3V0RXZlbnQgPSBkb21FdmVudE5hbWUgPT09ICdtb3VzZW91dCcgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm91dCc7XG5cbiAgaWYgKGlzT3ZlckV2ZW50ICYmICFpc1JlcGxheWluZ0V2ZW50KG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIElmIHRoaXMgaXMgYW4gb3ZlciBldmVudCB3aXRoIGEgdGFyZ2V0LCB3ZSBtaWdodCBoYXZlIGFscmVhZHkgZGlzcGF0Y2hlZFxuICAgIC8vIHRoZSBldmVudCBpbiB0aGUgb3V0IGV2ZW50IG9mIHRoZSBvdGhlciB0YXJnZXQuIElmIHRoaXMgaXMgcmVwbGF5ZWQsXG4gICAgLy8gdGhlbiBpdCdzIGJlY2F1c2Ugd2UgY291bGRuJ3QgZGlzcGF0Y2ggYWdhaW5zdCB0aGlzIHRhcmdldCBwcmV2aW91c2x5XG4gICAgLy8gc28gd2UgaGF2ZSB0byBkbyBpdCBub3cgaW5zdGVhZC5cbiAgICB2YXIgcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQ7XG5cbiAgICBpZiAocmVsYXRlZCkge1xuICAgICAgLy8gSWYgdGhlIHJlbGF0ZWQgbm9kZSBpcyBtYW5hZ2VkIGJ5IFJlYWN0LCB3ZSBjYW4gYXNzdW1lIHRoYXQgd2UgaGF2ZVxuICAgICAgLy8gYWxyZWFkeSBkaXNwYXRjaGVkIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50cyBkdXJpbmcgaXRzIG1vdXNlb3V0LlxuICAgICAgaWYgKGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJlbGF0ZWQpIHx8IGlzQ29udGFpbmVyTWFya2VkQXNSb290KHJlbGF0ZWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWlzT3V0RXZlbnQgJiYgIWlzT3ZlckV2ZW50KSB7XG4gICAgLy8gTXVzdCBub3QgYmUgYSBtb3VzZSBvciBwb2ludGVyIGluIG9yIG91dCAtIGlnbm9yaW5nLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB3aW47IC8vIFRPRE86IHdoeSBpcyB0aGlzIG51bGxhYmxlIGluIHRoZSB0eXBlcyBidXQgd2UgcmVhZCBmcm9tIGl0P1xuXG4gIGlmIChuYXRpdmVFdmVudFRhcmdldC53aW5kb3cgPT09IG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgLy8gYG5hdGl2ZUV2ZW50VGFyZ2V0YCBpcyBwcm9iYWJseSBhIHdpbmRvdyBvYmplY3QuXG4gICAgd2luID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1lbnRgIGlzIHNvbWV0aW1lcyB1bmRlZmluZWQgaW4gSUU4LlxuICAgIHZhciBkb2MgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50O1xuXG4gICAgaWYgKGRvYykge1xuICAgICAgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbiA9IHdpbmRvdztcbiAgICB9XG4gIH1cblxuICB2YXIgZnJvbTtcbiAgdmFyIHRvO1xuXG4gIGlmIChpc091dEV2ZW50KSB7XG4gICAgdmFyIF9yZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC50b0VsZW1lbnQ7XG5cbiAgICBmcm9tID0gdGFyZ2V0SW5zdDtcbiAgICB0byA9IF9yZWxhdGVkID8gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoX3JlbGF0ZWQpIDogbnVsbDtcblxuICAgIGlmICh0byAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0byk7XG5cbiAgICAgIGlmICh0byAhPT0gbmVhcmVzdE1vdW50ZWQgfHwgdG8udGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIHRvLnRhZyAhPT0gSG9zdFRleHQpIHtcbiAgICAgICAgdG8gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBNb3ZpbmcgdG8gYSBub2RlIGZyb20gb3V0c2lkZSB0aGUgd2luZG93LlxuICAgIGZyb20gPSBudWxsO1xuICAgIHRvID0gdGFyZ2V0SW5zdDtcbiAgfVxuXG4gIGlmIChmcm9tID09PSB0bykge1xuICAgIC8vIE5vdGhpbmcgcGVydGFpbnMgdG8gb3VyIG1hbmFnZWQgY29tcG9uZW50cy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgdmFyIGxlYXZlRXZlbnRUeXBlID0gJ29uTW91c2VMZWF2ZSc7XG4gIHZhciBlbnRlckV2ZW50VHlwZSA9ICdvbk1vdXNlRW50ZXInO1xuICB2YXIgZXZlbnRUeXBlUHJlZml4ID0gJ21vdXNlJztcblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm91dCcgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInKSB7XG4gICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50O1xuICAgIGxlYXZlRXZlbnRUeXBlID0gJ29uUG9pbnRlckxlYXZlJztcbiAgICBlbnRlckV2ZW50VHlwZSA9ICdvblBvaW50ZXJFbnRlcic7XG4gICAgZXZlbnRUeXBlUHJlZml4ID0gJ3BvaW50ZXInO1xuICB9XG5cbiAgdmFyIGZyb21Ob2RlID0gZnJvbSA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZShmcm9tKTtcbiAgdmFyIHRvTm9kZSA9IHRvID09IG51bGwgPyB3aW4gOiBnZXROb2RlRnJvbUluc3RhbmNlKHRvKTtcbiAgdmFyIGxlYXZlID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihsZWF2ZUV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2xlYXZlJywgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgbGVhdmUudGFyZ2V0ID0gZnJvbU5vZGU7XG4gIGxlYXZlLnJlbGF0ZWRUYXJnZXQgPSB0b05vZGU7XG4gIHZhciBlbnRlciA9IG51bGw7IC8vIFdlIHNob3VsZCBvbmx5IHByb2Nlc3MgdGhpcyBuYXRpdmVFdmVudCBpZiB3ZSBhcmUgcHJvY2Vzc2luZ1xuICAvLyB0aGUgZmlyc3QgYW5jZXN0b3IuIE5leHQgdGltZSwgd2Ugd2lsbCBpZ25vcmUgdGhlIGV2ZW50LlxuXG4gIHZhciBuYXRpdmVUYXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChuYXRpdmVUYXJnZXRJbnN0ID09PSB0YXJnZXRJbnN0KSB7XG4gICAgdmFyIGVudGVyRXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKGVudGVyRXZlbnRUeXBlLCBldmVudFR5cGVQcmVmaXggKyAnZW50ZXInLCB0bywgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBlbnRlckV2ZW50LnRhcmdldCA9IHRvTm9kZTtcbiAgICBlbnRlckV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBmcm9tTm9kZTtcbiAgICBlbnRlciA9IGVudGVyRXZlbnQ7XG4gIH1cblxuICBhY2N1bXVsYXRlRW50ZXJMZWF2ZVR3b1BoYXNlTGlzdGVuZXJzKGRpc3BhdGNoUXVldWUsIGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pO1xufVxuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIG9iamVjdElzID0gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGlzO1xuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cblxuZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKG9iamVjdElzKG9iakEsIG9iakIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzQVtpXTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBjdXJyZW50S2V5KSB8fCAhb2JqZWN0SXMob2JqQVtjdXJyZW50S2V5XSwgb2JqQltjdXJyZW50S2V5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5mdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGlsZCkge1xuICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cbi8qKlxuICogR2V0IHRoZSBuZXh0IHNpYmxpbmcgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIHdpbGwgd2FsayB1cCB0aGVcbiAqIERPTSBpZiBhIG5vZGUncyBzaWJsaW5ncyBoYXZlIGJlZW4gZXhoYXVzdGVkLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7P0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRTaWJsaW5nTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gIH1cbn1cbi8qKlxuICogR2V0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBub2RlcyB3aGljaCBjb250YWluIGNoYXJhY3RlcnMgYXQgb2Zmc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gcm9vdFxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQocm9vdCwgb2Zmc2V0KSB7XG4gIHZhciBub2RlID0gZ2V0TGVhZk5vZGUocm9vdCk7XG4gIHZhciBub2RlU3RhcnQgPSAwO1xuICB2YXIgbm9kZUVuZCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBub2RlRW5kID0gbm9kZVN0YXJ0ICsgbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG5cbiAgICAgIGlmIChub2RlU3RhcnQgPD0gb2Zmc2V0ICYmIG5vZGVFbmQgPj0gb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICBvZmZzZXQ6IG9mZnNldCAtIG5vZGVTdGFydFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBub2RlU3RhcnQgPSBub2RlRW5kO1xuICAgIH1cblxuICAgIG5vZGUgPSBnZXRMZWFmTm9kZShnZXRTaWJsaW5nTm9kZShub2RlKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG91dGVyTm9kZVxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRPZmZzZXRzKG91dGVyTm9kZSkge1xuICB2YXIgb3duZXJEb2N1bWVudCA9IG91dGVyTm9kZS5vd25lckRvY3VtZW50O1xuICB2YXIgd2luID0gb3duZXJEb2N1bWVudCAmJiBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24gJiYgd2luLmdldFNlbGVjdGlvbigpO1xuXG4gIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZSA9IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldDsgLy8gSW4gRmlyZWZveCwgYW5jaG9yTm9kZSBhbmQgZm9jdXNOb2RlIGNhbiBiZSBcImFub255bW91cyBkaXZzXCIsIGUuZy4gdGhlXG4gIC8vIHVwL2Rvd24gYnV0dG9ucyBvbiBhbiA8aW5wdXQgdHlwZT1cIm51bWJlclwiPi4gQW5vbnltb3VzIGRpdnMgZG8gbm90IHNlZW0gdG9cbiAgLy8gZXhwb3NlIHByb3BlcnRpZXMsIHRyaWdnZXJpbmcgYSBcIlBlcm1pc3Npb24gZGVuaWVkIGVycm9yXCIgaWYgYW55IG9mIGl0c1xuICAvLyBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZC4gVGhlIG9ubHkgc2VlbWluZ2x5IHBvc3NpYmxlIHdheSB0byBhdm9pZCBlcnJvcmluZ1xuICAvLyBpcyB0byBhY2Nlc3MgYSBwcm9wZXJ0eSB0aGF0IHR5cGljYWxseSB3b3JrcyBmb3Igbm9uLWFub255bW91cyBkaXZzIGFuZFxuICAvLyBjYXRjaCBhbnkgZXJyb3IgdGhhdCBtYXkgb3RoZXJ3aXNlIGFyaXNlLiBTZWVcbiAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NDI3XG5cbiAgdHJ5IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgICBhbmNob3JOb2RlLm5vZGVUeXBlO1xuICAgIGZvY3VzTm9kZS5ub2RlVHlwZTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0TW9kZXJuT2Zmc2V0c0Zyb21Qb2ludHMob3V0ZXJOb2RlLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHtzdGFydCwgZW5kfSB3aGVyZSBgc3RhcnRgIGlzIHRoZSBjaGFyYWN0ZXIvY29kZXBvaW50IGluZGV4IG9mXG4gKiAoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KSB3aXRoaW4gdGhlIHRleHRDb250ZW50IG9mIGBvdXRlck5vZGVgLCBhbmRcbiAqIGBlbmRgIGlzIHRoZSBpbmRleCBvZiAoZm9jdXNOb2RlLCBmb2N1c09mZnNldCkuXG4gKlxuICogUmV0dXJucyBudWxsIGlmIHlvdSBwYXNzIGluIGdhcmJhZ2UgaW5wdXQgYnV0IHdlIHNob3VsZCBwcm9iYWJseSBqdXN0IGNyYXNoLlxuICpcbiAqIEV4cG9ydGVkIG9ubHkgZm9yIHRlc3RpbmcuXG4gKi9cblxuZnVuY3Rpb24gZ2V0TW9kZXJuT2Zmc2V0c0Zyb21Qb2ludHMob3V0ZXJOb2RlLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpIHtcbiAgdmFyIGxlbmd0aCA9IDA7XG4gIHZhciBzdGFydCA9IC0xO1xuICB2YXIgZW5kID0gLTE7XG4gIHZhciBpbmRleFdpdGhpbkFuY2hvciA9IDA7XG4gIHZhciBpbmRleFdpdGhpbkZvY3VzID0gMDtcbiAgdmFyIG5vZGUgPSBvdXRlck5vZGU7XG4gIHZhciBwYXJlbnROb2RlID0gbnVsbDtcblxuICBvdXRlcjogd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbmV4dCA9IG51bGw7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IGFuY2hvck5vZGUgJiYgKGFuY2hvck9mZnNldCA9PT0gMCB8fCBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpKSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoICsgYW5jaG9yT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZm9jdXNOb2RlICYmIChmb2N1c09mZnNldCA9PT0gMCB8fCBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpKSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aCArIGZvY3VzT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICAgIGxlbmd0aCArPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUuZmlyc3RDaGlsZCkgPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgZmlyc3QgY2hpbGQgYG5leHRgLlxuXG5cbiAgICAgIHBhcmVudE5vZGUgPSBub2RlO1xuICAgICAgbm9kZSA9IG5leHQ7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBvdXRlck5vZGUpIHtcbiAgICAgICAgLy8gSWYgYG91dGVyTm9kZWAgaGFzIGNoaWxkcmVuLCB0aGlzIGlzIGFsd2F5cyB0aGUgc2Vjb25kIHRpbWUgdmlzaXRpbmdcbiAgICAgICAgLy8gaXQuIElmIGl0IGhhcyBubyBjaGlsZHJlbiwgdGhpcyBpcyBzdGlsbCB0aGUgZmlyc3QgbG9vcCwgYW5kIHRoZSBvbmx5XG4gICAgICAgIC8vIHZhbGlkIHNlbGVjdGlvbiBpcyBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgYm90aCBlcXVhbCB0byB0aGlzIG5vZGVcbiAgICAgICAgLy8gYW5kIGJvdGggb2Zmc2V0cyAwLCBpbiB3aGljaCBjYXNlIHdlIHdpbGwgaGF2ZSBoYW5kbGVkIGFib3ZlLlxuICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGFuY2hvck5vZGUgJiYgKytpbmRleFdpdGhpbkFuY2hvciA9PT0gYW5jaG9yT2Zmc2V0KSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gZm9jdXNOb2RlICYmICsraW5kZXhXaXRoaW5Gb2N1cyA9PT0gZm9jdXNPZmZzZXQpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5leHQgPSBub2RlLm5leHRTaWJsaW5nKSAhPT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBuZXh0IHNpYmxpbmcgYG5leHRgLlxuXG5cbiAgICBub2RlID0gbmV4dDtcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gLTEgfHwgZW5kID09PSAtMSkge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKFdvdWxkIGhhcHBlbiBpZiB0aGUgYW5jaG9yL2ZvY3VzIG5vZGVzIGFyZW4ndFxuICAgIC8vIGFjdHVhbGx5IGluc2lkZSB0aGUgcGFzc2VkLWluIG5vZGUuKVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogc3RhcnQsXG4gICAgZW5kOiBlbmRcbiAgfTtcbn1cbi8qKlxuICogSW4gbW9kZXJuIG5vbi1JRSBicm93c2Vycywgd2UgY2FuIHN1cHBvcnQgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZFxuICogc2VsZWN0aW9ucy5cbiAqXG4gKiBOb3RlOiBJRTEwKyBzdXBwb3J0cyB0aGUgU2VsZWN0aW9uIG9iamVjdCwgYnV0IGl0IGRvZXMgbm90IHN1cHBvcnRcbiAqIHRoZSBgZXh0ZW5kYCBtZXRob2QsIHdoaWNoIG1lYW5zIHRoYXQgZXZlbiBpbiBtb2Rlcm4gSUUsIGl0J3Mgbm90IHBvc3NpYmxlXG4gKiB0byBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZSBhIGJhY2t3YXJkIHNlbGVjdGlvbi4gVGh1cywgZm9yIGFsbCBJRVxuICogdmVyc2lvbnMsIHdlIHVzZSB0aGUgb2xkIElFIEFQSSB0byBjcmVhdGUgb3VyIHNlbGVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gb2Zmc2V0c1xuICovXG5cbmZ1bmN0aW9uIHNldE9mZnNldHMobm9kZSwgb2Zmc2V0cykge1xuICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xuICB2YXIgd2luID0gZG9jICYmIGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IC8vIEVkZ2UgZmFpbHMgd2l0aCBcIk9iamVjdCBleHBlY3RlZFwiIGluIHNvbWUgc2NlbmFyaW9zLlxuICAvLyAoRm9yIGluc3RhbmNlOiBUaW55TUNFIGVkaXRvciB1c2VkIGluIGEgbGlzdCBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyBwYXN0aW5nIHRvIGFkZCBtb3JlLFxuICAvLyBmYWlscyB3aGVuIHBhc3RpbmcgMTAwKyBpdGVtcylcblxuICBpZiAoIXdpbi5nZXRTZWxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICB2YXIgbGVuZ3RoID0gbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG4gIHZhciBzdGFydCA9IE1hdGgubWluKG9mZnNldHMuc3RhcnQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZCA9PT0gdW5kZWZpbmVkID8gc3RhcnQgOiBNYXRoLm1pbihvZmZzZXRzLmVuZCwgbGVuZ3RoKTsgLy8gSUUgMTEgdXNlcyBtb2Rlcm4gc2VsZWN0aW9uLCBidXQgZG9lc24ndCBzdXBwb3J0IHRoZSBleHRlbmQgbWV0aG9kLlxuICAvLyBGbGlwIGJhY2t3YXJkIHNlbGVjdGlvbnMsIHNvIHdlIGNhbiBzZXQgd2l0aCBhIHNpbmdsZSByYW5nZS5cblxuICBpZiAoIXNlbGVjdGlvbi5leHRlbmQgJiYgc3RhcnQgPiBlbmQpIHtcbiAgICB2YXIgdGVtcCA9IGVuZDtcbiAgICBlbmQgPSBzdGFydDtcbiAgICBzdGFydCA9IHRlbXA7XG4gIH1cblxuICB2YXIgc3RhcnRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIHN0YXJ0KTtcbiAgdmFyIGVuZE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgZW5kKTtcblxuICBpZiAoc3RhcnRNYXJrZXIgJiYgZW5kTWFya2VyKSB7XG4gICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAxICYmIHNlbGVjdGlvbi5hbmNob3JOb2RlID09PSBzdGFydE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgPT09IHN0YXJ0TWFya2VyLm9mZnNldCAmJiBzZWxlY3Rpb24uZm9jdXNOb2RlID09PSBlbmRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uZm9jdXNPZmZzZXQgPT09IGVuZE1hcmtlci5vZmZzZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZXRTdGFydChzdGFydE1hcmtlci5ub2RlLCBzdGFydE1hcmtlci5vZmZzZXQpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcblxuICAgIGlmIChzdGFydCA+IGVuZCkge1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgIHNlbGVjdGlvbi5leHRlbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZS5zZXRFbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNUZXh0Tm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gIGlmICghb3V0ZXJOb2RlIHx8ICFpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlID09PSBpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKG91dGVyTm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShpbm5lck5vZGUpKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZS5wYXJlbnROb2RlKTtcbiAgfSBlbHNlIGlmICgnY29udGFpbnMnIGluIG91dGVyTm9kZSkge1xuICAgIHJldHVybiBvdXRlck5vZGUuY29udGFpbnMoaW5uZXJOb2RlKTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICByZXR1cm4gISEob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGlubmVyTm9kZSkgJiAxNik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW5Eb2N1bWVudChub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBjb250YWluc05vZGUobm9kZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgbm9kZSk7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbkZyYW1lKGlmcmFtZSkge1xuICB0cnkge1xuICAgIC8vIEFjY2Vzc2luZyB0aGUgY29udGVudERvY3VtZW50IG9mIGEgSFRNTElmcmFtZUVsZW1lbnQgY2FuIGNhdXNlIHRoZSBicm93c2VyXG4gICAgLy8gdG8gdGhyb3csIGUuZy4gaWYgaXQgaGFzIGEgY3Jvc3Mtb3JpZ2luIHNyYyBhdHRyaWJ1dGUuXG4gICAgLy8gU2FmYXJpIHdpbGwgc2hvdyBhbiBlcnJvciBpbiB0aGUgY29uc29sZSB3aGVuIHRoZSBhY2Nlc3MgcmVzdWx0cyBpbiBcIkJsb2NrZWQgYSBmcmFtZSB3aXRoIG9yaWdpblwiLiBlLmc6XG4gICAgLy8gaWZyYW1lLmNvbnRlbnREb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAvLyBBIHNhZmV0eSB3YXkgaXMgdG8gYWNjZXNzIG9uZSBvZiB0aGUgY3Jvc3Mgb3JpZ2luIHByb3BlcnRpZXM6IFdpbmRvdyBvciBMb2NhdGlvblxuICAgIC8vIFdoaWNoIG1pZ2h0IHJlc3VsdCBpbiBcIlNlY3VyaXR5RXJyb3JcIiBET00gRXhjZXB0aW9uIGFuZCBpdCBpcyBjb21wYXRpYmxlIHRvIFNhZmFyaS5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9icm93c2Vycy5odG1sI2ludGVncmF0aW9uLXdpdGgtaWRsXG4gICAgcmV0dXJuIHR5cGVvZiBpZnJhbWUuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmID09PSAnc3RyaW5nJztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnREZWVwKCkge1xuICB2YXIgd2luID0gd2luZG93O1xuICB2YXIgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoKTtcblxuICB3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIHdpbi5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgIGlmIChpc1NhbWVPcmlnaW5GcmFtZShlbGVtZW50KSkge1xuICAgICAgd2luID0gZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCh3aW4uZG9jdW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG4vKipcbiAqIEBSZWFjdElucHV0U2VsZWN0aW9uOiBSZWFjdCBpbnB1dCBzZWxlY3Rpb24gbW9kdWxlLiBCYXNlZCBvbiBTZWxlY3Rpb24uanMsXG4gKiBidXQgbW9kaWZpZWQgdG8gYmUgc3VpdGFibGUgZm9yIHJlYWN0IGFuZCBoYXMgYSBjb3VwbGUgb2YgYnVnIGZpeGVzIChkb2Vzbid0XG4gKiBhc3N1bWUgYnV0dG9ucyBoYXZlIHJhbmdlIHNlbGVjdGlvbnMgYWxsb3dlZCkuXG4gKiBJbnB1dCBzZWxlY3Rpb24gbW9kdWxlIGZvciBSZWFjdC5cbiAqL1xuXG4vKipcbiAqIEBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6IHdlIGdldCB0aGUgZWxlbWVudCB0eXBlcyB0aGF0IHN1cHBvcnQgc2VsZWN0aW9uXG4gKiBmcm9tIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2RvLW5vdC1hcHBseSwgbG9va2luZyBhdCBgc2VsZWN0aW9uU3RhcnRgXG4gKiBhbmQgYHNlbGVjdGlvbkVuZGAgcm93cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSAmJiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ3RleHQnIHx8IGVsZW0udHlwZSA9PT0gJ3NlYXJjaCcgfHwgZWxlbS50eXBlID09PSAndGVsJyB8fCBlbGVtLnR5cGUgPT09ICd1cmwnIHx8IGVsZW0udHlwZSA9PT0gJ3Bhc3N3b3JkJykgfHwgbm9kZU5hbWUgPT09ICd0ZXh0YXJlYScgfHwgZWxlbS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJyk7XG59XG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpIHtcbiAgdmFyIGZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgcmV0dXJuIHtcbiAgICBmb2N1c2VkRWxlbTogZm9jdXNlZEVsZW0sXG4gICAgc2VsZWN0aW9uUmFuZ2U6IGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhmb2N1c2VkRWxlbSkgPyBnZXRTZWxlY3Rpb24oZm9jdXNlZEVsZW0pIDogbnVsbFxuICB9O1xufVxuLyoqXG4gKiBAcmVzdG9yZVNlbGVjdGlvbjogSWYgYW55IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB3YXMgcG90ZW50aWFsbHkgbG9zdCxcbiAqIHJlc3RvcmUgaXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcGVyZm9ybWluZyBvcGVyYXRpb25zIHRoYXQgY291bGQgcmVtb3ZlIGRvbVxuICogbm9kZXMgYW5kIHBsYWNlIHRoZW0gYmFjayBpbiwgcmVzdWx0aW5nIGluIGZvY3VzIGJlaW5nIGxvc3QuXG4gKi9cblxuZnVuY3Rpb24gcmVzdG9yZVNlbGVjdGlvbihwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uKSB7XG4gIHZhciBjdXJGb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7XG4gIHZhciBwcmlvckZvY3VzZWRFbGVtID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5mb2N1c2VkRWxlbTtcbiAgdmFyIHByaW9yU2VsZWN0aW9uUmFuZ2UgPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLnNlbGVjdGlvblJhbmdlO1xuXG4gIGlmIChjdXJGb2N1c2VkRWxlbSAhPT0gcHJpb3JGb2N1c2VkRWxlbSAmJiBpc0luRG9jdW1lbnQocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICBpZiAocHJpb3JTZWxlY3Rpb25SYW5nZSAhPT0gbnVsbCAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICAgIHNldFNlbGVjdGlvbihwcmlvckZvY3VzZWRFbGVtLCBwcmlvclNlbGVjdGlvblJhbmdlKTtcbiAgICB9IC8vIEZvY3VzaW5nIGEgbm9kZSBjYW4gY2hhbmdlIHRoZSBzY3JvbGwgcG9zaXRpb24sIHdoaWNoIGlzIHVuZGVzaXJhYmxlXG5cblxuICAgIHZhciBhbmNlc3RvcnMgPSBbXTtcbiAgICB2YXIgYW5jZXN0b3IgPSBwcmlvckZvY3VzZWRFbGVtO1xuXG4gICAgd2hpbGUgKGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKGFuY2VzdG9yLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgYW5jZXN0b3JzLnB1c2goe1xuICAgICAgICAgIGVsZW1lbnQ6IGFuY2VzdG9yLFxuICAgICAgICAgIGxlZnQ6IGFuY2VzdG9yLnNjcm9sbExlZnQsXG4gICAgICAgICAgdG9wOiBhbmNlc3Rvci5zY3JvbGxUb3BcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcmlvckZvY3VzZWRFbGVtLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcmlvckZvY3VzZWRFbGVtLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbmNlc3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpbmZvID0gYW5jZXN0b3JzW2ldO1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbExlZnQgPSBpbmZvLmxlZnQ7XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsVG9wID0gaW5mby50b3A7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEBnZXRTZWxlY3Rpb246IEdldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSBmb2N1c2VkIHRleHRhcmVhLCBpbnB1dCBvclxuICogY29udGVudEVkaXRhYmxlIG5vZGUuXG4gKiAtQGlucHV0OiBMb29rIHVwIHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dFxuICogLUByZXR1cm4ge3N0YXJ0OiBzZWxlY3Rpb25TdGFydCwgZW5kOiBzZWxlY3Rpb25FbmR9XG4gKi9cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKGlucHV0KSB7XG4gIHZhciBzZWxlY3Rpb247XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICAvLyBNb2Rlcm4gYnJvd3NlciB3aXRoIGlucHV0IG9yIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgIHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb250ZW50IGVkaXRhYmxlIG9yIG9sZCBJRSB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSBnZXRPZmZzZXRzKGlucHV0KTtcbiAgfVxuXG4gIHJldHVybiBzZWxlY3Rpb24gfHwge1xuICAgIHN0YXJ0OiAwLFxuICAgIGVuZDogMFxuICB9O1xufVxuLyoqXG4gKiBAc2V0U2VsZWN0aW9uOiBTZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgdGV4dGFyZWEgb3IgaW5wdXQgYW5kIGZvY3VzZXNcbiAqIHRoZSBpbnB1dC5cbiAqIC1AaW5wdXQgICAgIFNldCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXQgb3IgdGV4dGFyZWFcbiAqIC1Ab2Zmc2V0cyAgIE9iamVjdCBvZiBzYW1lIGZvcm0gdGhhdCBpcyByZXR1cm5lZCBmcm9tIGdldCpcbiAqL1xuXG5mdW5jdGlvbiBzZXRTZWxlY3Rpb24oaW5wdXQsIG9mZnNldHMpIHtcbiAgdmFyIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kO1xuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHN0YXJ0O1xuICB9XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICBpbnB1dC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgIGlucHV0LnNlbGVjdGlvbkVuZCA9IE1hdGgubWluKGVuZCwgaW5wdXQudmFsdWUubGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRPZmZzZXRzKGlucHV0LCBvZmZzZXRzKTtcbiAgfVxufVxuXG52YXIgc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSAxMTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvblNlbGVjdCcsIFsnZm9jdXNvdXQnLCAnY29udGV4dG1lbnUnLCAnZHJhZ2VuZCcsICdmb2N1c2luJywgJ2tleWRvd24nLCAna2V5dXAnLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG52YXIgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDtcbnZhciBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbnZhciBtb3VzZURvd24gPSBmYWxzZTtcbi8qKlxuICogR2V0IGFuIG9iamVjdCB3aGljaCBpcyBhIHVuaXF1ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIG5vdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBub2RlcyBvciBicm93c2VycywgYnV0XG4gKiB0d28gaWRlbnRpY2FsIHNlbGVjdGlvbnMgb24gdGhlIHNhbWUgbm9kZSB3aWxsIHJldHVybiBpZGVudGljYWwgb2JqZWN0cy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24kMShub2RlKSB7XG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIG5vZGUgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG5vZGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBub2RlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBub2RlLnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIHdpbiA9IG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuY2hvck5vZGU6IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0OiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlOiBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldFxuICAgIH07XG4gIH1cbn1cbi8qKlxuICogR2V0IGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgdGFyZ2V0LlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXREb2N1bWVudChldmVudFRhcmdldCkge1xuICByZXR1cm4gZXZlbnRUYXJnZXQud2luZG93ID09PSBldmVudFRhcmdldCA/IGV2ZW50VGFyZ2V0LmRvY3VtZW50IDogZXZlbnRUYXJnZXQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyBldmVudFRhcmdldCA6IGV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG59XG4vKipcbiAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFRhcmdldFxuICogQHJldHVybiB7P1N5bnRoZXRpY0V2ZW50fVxuICovXG5cblxuZnVuY3Rpb24gY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBlbGVtZW50LCBhbmQgdGhhdCB0aGUgdXNlciBpcyBub3QgZHJhZ2dpbmcgYVxuICAvLyBzZWxlY3Rpb24gKHRoaXMgbWF0Y2hlcyBuYXRpdmUgYHNlbGVjdGAgZXZlbnQgYmVoYXZpb3IpLiBJbiBIVE1MNSwgc2VsZWN0XG4gIC8vIGZpcmVzIG9ubHkgb24gaW5wdXQgYW5kIHRleHRhcmVhIHRodXMgaWYgdGhlcmUncyBubyBmb2N1c2VkIGVsZW1lbnQgd2VcbiAgLy8gd29uJ3QgZGlzcGF0Y2guXG4gIHZhciBkb2MgPSBnZXRFdmVudFRhcmdldERvY3VtZW50KG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobW91c2VEb3duIHx8IGFjdGl2ZUVsZW1lbnQkMSA9PSBudWxsIHx8IGFjdGl2ZUVsZW1lbnQkMSAhPT0gZ2V0QWN0aXZlRWxlbWVudChkb2MpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIE9ubHkgZmlyZSB3aGVuIHNlbGVjdGlvbiBoYXMgYWN0dWFsbHkgY2hhbmdlZC5cblxuXG4gIHZhciBjdXJyZW50U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uJDEoYWN0aXZlRWxlbWVudCQxKTtcblxuICBpZiAoIWxhc3RTZWxlY3Rpb24gfHwgIXNoYWxsb3dFcXVhbChsYXN0U2VsZWN0aW9uLCBjdXJyZW50U2VsZWN0aW9uKSkge1xuICAgIGxhc3RTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoYWN0aXZlRWxlbWVudEluc3QkMSwgJ29uU2VsZWN0Jyk7XG5cbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudCgnb25TZWxlY3QnLCAnc2VsZWN0JywgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICAgIH0pO1xuICAgICAgZXZlbnQudGFyZ2V0ID0gYWN0aXZlRWxlbWVudCQxO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvblNlbGVjdGAgZXZlbnQgdGhhdCBub3JtYWxpemVzIHNlbGVjdCBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIGNvbnRlbnRFZGl0YWJsZVxuICpcbiAqIFRoaXMgZGlmZmVycyBmcm9tIG5hdGl2ZSBicm93c2VyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKiAtIEZpcmVzIG9uIGNvbnRlbnRFZGl0YWJsZSBmaWVsZHMgYXMgd2VsbCBhcyBpbnB1dHMuXG4gKiAtIEZpcmVzIGZvciBjb2xsYXBzZWQgc2VsZWN0aW9uLlxuICogLSBGaXJlcyBhZnRlciB1c2VyIGlucHV0LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIC8vIFRyYWNrIHRoZSBpbnB1dCBub2RlIHRoYXQgaGFzIGZvY3VzLlxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSB8fCB0YXJnZXROb2RlLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IHRhcmdldE5vZGU7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSB0YXJnZXRJbnN0O1xuICAgICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xuICAgICAgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG4gICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIC8vIERvbid0IGZpcmUgdGhlIGV2ZW50IHdoaWxlIHRoZSB1c2VyIGlzIGRyYWdnaW5nLiBUaGlzIG1hdGNoZXMgdGhlXG4gICAgLy8gc2VtYW50aWNzIG9mIHRoZSBuYXRpdmUgc2VsZWN0IGV2ZW50LlxuXG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgIG1vdXNlRG93biA9IHRydWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICBjYXNlICdtb3VzZXVwJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgIG1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIENocm9tZSBhbmQgSUUgZmlyZSBub24tc3RhbmRhcmQgZXZlbnQgd2hlbiBzZWxlY3Rpb24gaXMgY2hhbmdlZCAoYW5kXG4gICAgLy8gc29tZXRpbWVzIHdoZW4gaXQgaGFzbid0KS4gSUUncyBldmVudCBmaXJlcyBvdXQgb2Ygb3JkZXIgd2l0aCByZXNwZWN0XG4gICAgLy8gdG8ga2V5IGFuZCBpbnB1dCBldmVudHMgb24gZGVsZXRpb24sIHNvIHdlIGRpc2NhcmQgaXQuXG4gICAgLy9cbiAgICAvLyBGaXJlZm94IGRvZXNuJ3Qgc3VwcG9ydCBzZWxlY3Rpb25jaGFuZ2UsIHNvIGNoZWNrIHNlbGVjdGlvbiBzdGF0dXNcbiAgICAvLyBhZnRlciBlYWNoIGtleSBlbnRyeS4gVGhlIHNlbGVjdGlvbiBjaGFuZ2VzIGFmdGVyIGtleWRvd24gYW5kIGJlZm9yZVxuICAgIC8vIGtleXVwLCBidXQgd2UgY2hlY2sgb24ga2V5ZG93biBhcyB3ZWxsIGluIHRoZSBjYXNlIG9mIGhvbGRpbmcgZG93biBhXG4gICAgLy8ga2V5LCB3aGVuIG11bHRpcGxlIGtleWRvd24gZXZlbnRzIGFyZSBmaXJlZCBidXQgb25seSBvbmUga2V5dXAgaXMuXG4gICAgLy8gVGhpcyBpcyBhbHNvIG91ciBhcHByb2FjaCBmb3IgSUUgaGFuZGxpbmcsIGZvciB0aGUgcmVhc29uIGFib3ZlLlxuXG4gICAgY2FzZSAnc2VsZWN0aW9uY2hhbmdlJzpcbiAgICAgIGlmIChza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBtYXBwaW5nIG9mIHN0YW5kYXJkIHZlbmRvciBwcmVmaXhlcyB1c2luZyB0aGUgZGVmaW5lZCBzdHlsZSBwcm9wZXJ0eSBhbmQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVQcm9wXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIG1ha2VQcmVmaXhNYXAoc3R5bGVQcm9wLCBldmVudE5hbWUpIHtcbiAgdmFyIHByZWZpeGVzID0ge307XG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1snV2Via2l0JyArIHN0eWxlUHJvcF0gPSAnd2Via2l0JyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ01veicgKyBzdHlsZVByb3BdID0gJ21veicgKyBldmVudE5hbWU7XG4gIHJldHVybiBwcmVmaXhlcztcbn1cbi8qKlxuICogQSBsaXN0IG9mIGV2ZW50IG5hbWVzIHRvIGEgY29uZmlndXJhYmxlIGxpc3Qgb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG5cblxudmFyIHZlbmRvclByZWZpeGVzID0ge1xuICBhbmltYXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25FbmQnKSxcbiAgYW5pbWF0aW9uaXRlcmF0aW9uOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uSXRlcmF0aW9uJyksXG4gIGFuaW1hdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uU3RhcnQnKSxcbiAgdHJhbnNpdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnVHJhbnNpdGlvbicsICdUcmFuc2l0aW9uRW5kJylcbn07XG4vKipcbiAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5kIHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS5cbiAqL1xuXG52YXIgcHJlZml4ZWRFdmVudE5hbWVzID0ge307XG4vKipcbiAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLlxuICovXG5cbnZhciBzdHlsZSA9IHt9O1xuLyoqXG4gKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLlxuICovXG5cbmlmIChjYW5Vc2VET00pIHtcbiAgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLlxuXG4gIGlmICghKCdBbmltYXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25lbmQuYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25zdGFydC5hbmltYXRpb247XG4gIH0gLy8gU2FtZSBhcyBhYm92ZVxuXG5cbiAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb247XG4gIH1cbn1cbi8qKlxuICogQXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHZlbmRvciBwcmVmaXhlZCBldmVudCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9IGVsc2UgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgfVxuXG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuXG4gIGZvciAodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApIHtcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXZlbnROYW1lO1xufVxuXG52YXIgQU5JTUFUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25lbmQnKTtcbnZhciBBTklNQVRJT05fSVRFUkFUSU9OID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbml0ZXJhdGlvbicpO1xudmFyIEFOSU1BVElPTl9TVEFSVCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25zdGFydCcpO1xudmFyIFRSQU5TSVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ3RyYW5zaXRpb25lbmQnKTtcblxudmFyIHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzID0gbmV3IE1hcCgpOyAvLyBOT1RFOiBDYXBpdGFsaXphdGlvbiBpcyBpbXBvcnRhbnQgaW4gdGhpcyBsaXN0IVxuLy9cbi8vIEUuZy4gaXQgbmVlZHMgXCJwb2ludGVyRG93blwiLCBub3QgXCJwb2ludGVyZG93blwiLlxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGRlcml2ZSBib3RoIFJlYWN0IG5hbWUgKFwib25Qb2ludGVyRG93blwiKVxuLy8gYW5kIERPTSBuYW1lIChcInBvaW50ZXJkb3duXCIpIGZyb20gdGhlIHNhbWUgbGlzdC5cbi8vXG4vLyBFeGNlcHRpb25zIHRoYXQgZG9uJ3QgbWF0Y2ggdGhpcyBjb252ZW50aW9uIGFyZSBsaXN0ZWQgc2VwYXJhdGVseS5cbi8vXG4vLyBwcmV0dGllci1pZ25vcmVcblxudmFyIHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzID0gWydhYm9ydCcsICdhdXhDbGljaycsICdjYW5jZWwnLCAnY2FuUGxheScsICdjYW5QbGF5VGhyb3VnaCcsICdjbGljaycsICdjbG9zZScsICdjb250ZXh0TWVudScsICdjb3B5JywgJ2N1dCcsICdkcmFnJywgJ2RyYWdFbmQnLCAnZHJhZ0VudGVyJywgJ2RyYWdFeGl0JywgJ2RyYWdMZWF2ZScsICdkcmFnT3ZlcicsICdkcmFnU3RhcnQnLCAnZHJvcCcsICdkdXJhdGlvbkNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdnb3RQb2ludGVyQ2FwdHVyZScsICdpbnB1dCcsICdpbnZhbGlkJywgJ2tleURvd24nLCAna2V5UHJlc3MnLCAna2V5VXAnLCAnbG9hZCcsICdsb2FkZWREYXRhJywgJ2xvYWRlZE1ldGFkYXRhJywgJ2xvYWRTdGFydCcsICdsb3N0UG9pbnRlckNhcHR1cmUnLCAnbW91c2VEb3duJywgJ21vdXNlTW92ZScsICdtb3VzZU91dCcsICdtb3VzZU92ZXInLCAnbW91c2VVcCcsICdwYXN0ZScsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncG9pbnRlckNhbmNlbCcsICdwb2ludGVyRG93bicsICdwb2ludGVyTW92ZScsICdwb2ludGVyT3V0JywgJ3BvaW50ZXJPdmVyJywgJ3BvaW50ZXJVcCcsICdwcm9ncmVzcycsICdyYXRlQ2hhbmdlJywgJ3Jlc2V0JywgJ3Jlc2l6ZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1Ym1pdCcsICdzdXNwZW5kJywgJ3RpbWVVcGRhdGUnLCAndG91Y2hDYW5jZWwnLCAndG91Y2hFbmQnLCAndG91Y2hTdGFydCcsICd2b2x1bWVDaGFuZ2UnLCAnc2Nyb2xsJywgJ3RvZ2dsZScsICd0b3VjaE1vdmUnLCAnd2FpdGluZycsICd3aGVlbCddO1xuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZUV2ZW50KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKSB7XG4gIHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzLnNldChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWFjdE5hbWUsIFtkb21FdmVudE5hbWVdKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudHMoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2ltcGxlRXZlbnRQbHVnaW5FdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZXZlbnROYW1lID0gc2ltcGxlRXZlbnRQbHVnaW5FdmVudHNbaV07XG4gICAgdmFyIGRvbUV2ZW50TmFtZSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBjYXBpdGFsaXplZEV2ZW50ID0gZXZlbnROYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBldmVudE5hbWUuc2xpY2UoMSk7XG4gICAgcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsICdvbicgKyBjYXBpdGFsaXplZEV2ZW50KTtcbiAgfSAvLyBTcGVjaWFsIGNhc2VzIHdoZXJlIGV2ZW50IG5hbWVzIGRvbid0IG1hdGNoLlxuXG5cbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fRU5ELCAnb25BbmltYXRpb25FbmQnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fSVRFUkFUSU9OLCAnb25BbmltYXRpb25JdGVyYXRpb24nKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fU1RBUlQsICdvbkFuaW1hdGlvblN0YXJ0Jyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2RibGNsaWNrJywgJ29uRG91YmxlQ2xpY2snKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZm9jdXNpbicsICdvbkZvY3VzJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2ZvY3Vzb3V0JywgJ29uQmx1cicpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KFRSQU5TSVRJT05fRU5ELCAnb25UcmFuc2l0aW9uRW5kJyk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciByZWFjdE5hbWUgPSB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5nZXQoZG9tRXZlbnROYW1lKTtcblxuICBpZiAocmVhY3ROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRXZlbnQ7XG4gIHZhciByZWFjdEV2ZW50VHlwZSA9IGRvbUV2ZW50TmFtZTtcblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGtleXByZXNzIGV2ZW50IGZvciBmdW5jdGlvbiBrZXlzIHRvby4gVGhpcyByZW1vdmVzXG4gICAgICAvLyB0aGUgdW53YW50ZWQga2V5cHJlc3MgZXZlbnRzLiBFbnRlciBpcyBob3dldmVyIGJvdGggcHJpbnRhYmxlIGFuZFxuICAgICAgLy8gbm9uLXByaW50YWJsZS4gT25lIHdvdWxkIGV4cGVjdCBUYWIgdG8gYmUgYXMgd2VsbCAoYnV0IGl0IGlzbid0KS5cbiAgICAgIGlmIChnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNLZXlib2FyZEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2ZvY3VzJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2JsdXInO1xuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYmVmb3JlYmx1cic6XG4gICAgY2FzZSAnYWZ0ZXJibHVyJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NsaWNrJzpcbiAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGNsaWNrIGV2ZW50IG9uIHJpZ2h0IG1vdXNlIGNsaWNrcy4gVGhpcyByZW1vdmVzIHRoZVxuICAgICAgLy8gdW53YW50ZWQgY2xpY2sgZXZlbnRzLlxuICAgICAgaWYgKG5hdGl2ZUV2ZW50LmJ1dHRvbiA9PT0gMikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdhdXhjbGljayc6XG4gICAgY2FzZSAnZGJsY2xpY2snOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICBjYXNlICdtb3VzZXVwJzogLy8gVE9ETzogRGlzYWJsZWQgZWxlbWVudHMgc2hvdWxkIG5vdCByZXNwb25kIHRvIG1vdXNlIGV2ZW50c1xuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZHJhZyc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnZXhpdCc6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICBjYXNlICdkcm9wJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0RyYWdFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndG91Y2hjYW5jZWwnOlxuICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgIGNhc2UgJ3RvdWNoc3RhcnQnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBBTklNQVRJT05fRU5EOlxuICAgIGNhc2UgQU5JTUFUSU9OX0lURVJBVElPTjpcbiAgICBjYXNlIEFOSU1BVElPTl9TVEFSVDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRSQU5TSVRJT05fRU5EOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzY3JvbGwnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVUlFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnd2hlZWwnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljV2hlZWxFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY29weSc6XG4gICAgY2FzZSAnY3V0JzpcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAncG9pbnRlcmNhbmNlbCc6XG4gICAgY2FzZSAncG9pbnRlcmRvd24nOlxuICAgIGNhc2UgJ3BvaW50ZXJtb3ZlJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcnVwJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGluQ2FwdHVyZVBoYXNlID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFKSAhPT0gMDtcblxuICB7XG4gICAgLy8gU29tZSBldmVudHMgZG9uJ3QgYnViYmxlIGluIHRoZSBicm93c2VyLlxuICAgIC8vIEluIHRoZSBwYXN0LCBSZWFjdCBoYXMgYWx3YXlzIGJ1YmJsZWQgdGhlbSwgYnV0IHRoaXMgY2FuIGJlIHN1cnByaXNpbmcuXG4gICAgLy8gV2UncmUgZ29pbmcgdG8gdHJ5IGFsaWduaW5nIGNsb3NlciB0byB0aGUgYnJvd3NlciBiZWhhdmlvciBieSBub3QgYnViYmxpbmdcbiAgICAvLyB0aGVtIGluIFJlYWN0IGVpdGhlci4gV2UnbGwgc3RhcnQgYnkgbm90IGJ1YmJsaW5nIG9uU2Nyb2xsLCBhbmQgdGhlbiBleHBhbmQuXG4gICAgdmFyIGFjY3VtdWxhdGVUYXJnZXRPbmx5ID0gIWluQ2FwdHVyZVBoYXNlICYmIC8vIFRPRE86IGlkZWFsbHksIHdlJ2QgZXZlbnR1YWxseSBhZGQgYWxsIGV2ZW50cyBmcm9tXG4gICAgLy8gbm9uRGVsZWdhdGVkRXZlbnRzIGxpc3QgaW4gRE9NUGx1Z2luRXZlbnRTeXN0ZW0uXG4gICAgLy8gVGhlbiB3ZSBjYW4gcmVtb3ZlIHRoaXMgc3BlY2lhbCBsaXN0LlxuICAgIC8vIFRoaXMgaXMgYSBicmVha2luZyBjaGFuZ2UgdGhhdCBjYW4gd2FpdCB1bnRpbCBSZWFjdCAxOC5cbiAgICBkb21FdmVudE5hbWUgPT09ICdzY3JvbGwnO1xuXG4gICAgdmFyIF9saXN0ZW5lcnMgPSBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgcmVhY3ROYW1lLCBuYXRpdmVFdmVudC50eXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHkpO1xuXG4gICAgaWYgKF9saXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBjcmVhdGUgZXZlbnQgbGF6aWx5LlxuICAgICAgdmFyIF9ldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IF9ldmVudCxcbiAgICAgICAgbGlzdGVuZXJzOiBfbGlzdGVuZXJzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRvcC1sZXZlbCBzaWRlIGVmZmVjdC5cbnJlZ2lzdGVyU2ltcGxlRXZlbnRzKCk7XG5yZWdpc3RlckV2ZW50cyQyKCk7XG5yZWdpc3RlckV2ZW50cyQxKCk7XG5yZWdpc3RlckV2ZW50cyQzKCk7XG5yZWdpc3RlckV2ZW50cygpO1xuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICAvLyBUT0RPOiB3ZSBzaG91bGQgcmVtb3ZlIHRoZSBjb25jZXB0IG9mIGEgXCJTaW1wbGVFdmVudFBsdWdpblwiLlxuICAvLyBUaGlzIGlzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBldmVudCBzeXN0ZW0uIEFsbFxuICAvLyB0aGUgb3RoZXIgcGx1Z2lucyBhcmUgZXNzZW50aWFsbHkgcG9seWZpbGxzLiBTbyB0aGUgcGx1Z2luXG4gIC8vIHNob3VsZCBwcm9iYWJseSBiZSBpbmxpbmVkIHNvbWV3aGVyZSBhbmQgaGF2ZSBpdHMgbG9naWNcbiAgLy8gYmUgY29yZSB0aGUgdG8gZXZlbnQgc3lzdGVtLiBUaGlzIHdvdWxkIHBvdGVudGlhbGx5IGFsbG93XG4gIC8vIHVzIHRvIHNoaXAgYnVpbGRzIG9mIFJlYWN0IHdpdGhvdXQgdGhlIHBvbHlmaWxsZWQgcGx1Z2lucyBiZWxvdy5cbiAgZXh0cmFjdEV2ZW50cyQ0KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzKTtcbiAgdmFyIHNob3VsZFByb2Nlc3NQb2x5ZmlsbFBsdWdpbnMgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TKSA9PT0gMDsgLy8gV2UgZG9uJ3QgcHJvY2VzcyB0aGVzZSBldmVudHMgdW5sZXNzIHdlIGFyZSBpbiB0aGVcbiAgLy8gZXZlbnQncyBuYXRpdmUgXCJidWJibGVcIiBwaGFzZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSdyZVxuICAvLyBub3QgaW4gdGhlIGNhcHR1cmUgcGhhc2UuIFRoYXQncyBiZWNhdXNlIHdlIGVtdWxhdGVcbiAgLy8gdGhlIGNhcHR1cmUgcGhhc2UgaGVyZSBzdGlsbC4gVGhpcyBpcyBhIHRyYWRlLW9mZixcbiAgLy8gYmVjYXVzZSBpbiBhbiBpZGVhbCB3b3JsZCB3ZSB3b3VsZCBub3QgZW11bGF0ZSBhbmQgdXNlXG4gIC8vIHRoZSBwaGFzZXMgcHJvcGVybHksIGxpa2Ugd2UgZG8gd2l0aCB0aGUgU2ltcGxlRXZlbnRcbiAgLy8gcGx1Z2luLiBIb3dldmVyLCB0aGUgcGx1Z2lucyBiZWxvdyBlaXRoZXIgZXhwZWN0XG4gIC8vIGVtdWxhdGlvbiAoRW50ZXJMZWF2ZSkgb3IgdXNlIHN0YXRlIGxvY2FsaXplZCB0byB0aGF0XG4gIC8vIHBsdWdpbiAoQmVmb3JlSW5wdXQsIENoYW5nZSwgU2VsZWN0KS4gVGhlIHN0YXRlIGluXG4gIC8vIHRoZXNlIG1vZHVsZXMgY29tcGxpY2F0ZXMgdGhpbmdzLCBhcyB5b3UnbGwgZXNzZW50aWFsbHlcbiAgLy8gZ2V0IHRoZSBjYXNlIHdoZXJlIHRoZSBjYXB0dXJlIHBoYXNlIGV2ZW50IG1pZ2h0IGNoYW5nZVxuICAvLyBzdGF0ZSwgb25seSBmb3IgdGhlIGZvbGxvd2luZyBidWJibGUgZXZlbnQgdG8gY29tZSBpblxuICAvLyBsYXRlciBhbmQgbm90IHRyaWdnZXIgYW55dGhpbmcgYXMgdGhlIHN0YXRlIG5vd1xuICAvLyBpbnZhbGlkYXRlcyB0aGUgaGV1cmlzdGljcyBvZiB0aGUgZXZlbnQgcGx1Z2luLiBXZVxuICAvLyBjb3VsZCBhbHRlciBhbGwgdGhlc2UgcGx1Z2lucyB0byB3b3JrIGluIHN1Y2ggd2F5cywgYnV0XG4gIC8vIHRoYXQgbWlnaHQgY2F1c2Ugb3RoZXIgdW5rbm93biBzaWRlLWVmZmVjdHMgdGhhdCB3ZVxuICAvLyBjYW4ndCBmb3Jlc2VlIHJpZ2h0IG5vdy5cblxuICBpZiAoc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucykge1xuICAgIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59IC8vIExpc3Qgb2YgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBpbmRpdmlkdWFsbHkgYXR0YWNoZWQgdG8gbWVkaWEgZWxlbWVudHMuXG5cblxudmFyIG1lZGlhRXZlbnRUeXBlcyA9IFsnYWJvcnQnLCAnY2FucGxheScsICdjYW5wbGF5dGhyb3VnaCcsICdkdXJhdGlvbmNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdsb2FkZWRkYXRhJywgJ2xvYWRlZG1ldGFkYXRhJywgJ2xvYWRzdGFydCcsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncHJvZ3Jlc3MnLCAncmF0ZWNoYW5nZScsICdyZXNpemUnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdXNwZW5kJywgJ3RpbWV1cGRhdGUnLCAndm9sdW1lY2hhbmdlJywgJ3dhaXRpbmcnXTsgLy8gV2Ugc2hvdWxkIG5vdCBkZWxlZ2F0ZSB0aGVzZSBldmVudHMgdG8gdGhlIGNvbnRhaW5lciwgYnV0IHJhdGhlclxuLy8gc2V0IHRoZW0gb24gdGhlIGFjdHVhbCB0YXJnZXQgZWxlbWVudCBpdHNlbGYuIFRoaXMgaXMgcHJpbWFyaWx5XG4vLyBiZWNhdXNlIHRoZXNlIGV2ZW50cyBkbyBub3QgY29uc2lzdGVudGx5IGJ1YmJsZSBpbiB0aGUgRE9NLlxuXG52YXIgbm9uRGVsZWdhdGVkRXZlbnRzID0gbmV3IFNldChbJ2NhbmNlbCcsICdjbG9zZScsICdpbnZhbGlkJywgJ2xvYWQnLCAnc2Nyb2xsJywgJ3RvZ2dsZSddLmNvbmNhdChtZWRpYUV2ZW50VHlwZXMpKTtcblxuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICB2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgJ3Vua25vd24tZXZlbnQnO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKHR5cGUsIGxpc3RlbmVyLCB1bmRlZmluZWQsIGV2ZW50KTtcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBkaXNwYXRjaExpc3RlbmVycywgaW5DYXB0dXJlUGhhc2UpIHtcbiAgdmFyIHByZXZpb3VzSW5zdGFuY2U7XG5cbiAgaWYgKGluQ2FwdHVyZVBoYXNlKSB7XG4gICAgZm9yICh2YXIgaSA9IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgX2Rpc3BhdGNoTGlzdGVuZXJzJGkgPSBkaXNwYXRjaExpc3RlbmVyc1tpXSxcbiAgICAgICAgICBpbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmluc3RhbmNlLFxuICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgIGxpc3RlbmVyID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkubGlzdGVuZXI7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAhPT0gcHJldmlvdXNJbnN0YW5jZSAmJiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kgPSBkaXNwYXRjaExpc3RlbmVyc1tfaV0sXG4gICAgICAgICAgX2luc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmluc3RhbmNlLFxuICAgICAgICAgIF9jdXJyZW50VGFyZ2V0ID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgX2xpc3RlbmVyID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmxpc3RlbmVyO1xuXG4gICAgICBpZiAoX2luc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIF9saXN0ZW5lciwgX2N1cnJlbnRUYXJnZXQpO1xuICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IF9pbnN0YW5jZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICB2YXIgaW5DYXB0dXJlUGhhc2UgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UpICE9PSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hRdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZGlzcGF0Y2hRdWV1ZSRpID0gZGlzcGF0Y2hRdWV1ZVtpXSxcbiAgICAgICAgZXZlbnQgPSBfZGlzcGF0Y2hRdWV1ZSRpLmV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnMgPSBfZGlzcGF0Y2hRdWV1ZSRpLmxpc3RlbmVycztcbiAgICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZUl0ZW1zSW5PcmRlcihldmVudCwgbGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSk7IC8vICBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgfSAvLyBUaGlzIHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHJldGhyb3cgaWYgYW55IG9mIHRoZSBldmVudCBoYW5kbGVycyB0aHJldy5cblxuXG4gIHJldGhyb3dDYXVnaHRFcnJvcigpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzKTtcbiAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncyk7XG59XG5cbmZ1bmN0aW9uIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRFbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgpIGNhbGwgZm9yIFwiJXNcIi4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBkb21FdmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyID0gZmFsc2U7XG4gIHZhciBsaXN0ZW5lclNldCA9IGdldEV2ZW50TGlzdGVuZXJTZXQodGFyZ2V0RWxlbWVudCk7XG4gIHZhciBsaXN0ZW5lclNldEtleSA9IGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG5cbiAgaWYgKCFsaXN0ZW5lclNldC5oYXMobGlzdGVuZXJTZXRLZXkpKSB7XG4gICAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgZG9tRXZlbnROYW1lLCBJU19OT05fREVMRUdBVEVELCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcbiAgICBsaXN0ZW5lclNldC5hZGQobGlzdGVuZXJTZXRLZXkpO1xuICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgdGFyZ2V0KSB7XG4gIHtcbiAgICBpZiAobm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpICYmICFpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgICBlcnJvcignRGlkIG5vdCBleHBlY3QgYSBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCkgY2FsbCBmb3IgXCIlc1wiIGluIHRoZSBidWJibGUgcGhhc2UuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZG9tRXZlbnROYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZXZlbnRTeXN0ZW1GbGFncyA9IDA7XG5cbiAgaWYgKGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICBldmVudFN5c3RlbUZsYWdzIHw9IElTX0NBUFRVUkVfUEhBU0U7XG4gIH1cblxuICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG59IC8vIFRoaXMgaXMgb25seSB1c2VkIGJ5IGNyZWF0ZUV2ZW50SGFuZGxlIHdoZW4gdGhlXG52YXIgbGlzdGVuaW5nTWFya2VyID0gJ19yZWFjdExpc3RlbmluZycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcbmZ1bmN0aW9uIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIGlmICghcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgIHJvb3RDb250YWluZXJFbGVtZW50W2xpc3RlbmluZ01hcmtlcl0gPSB0cnVlO1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb21FdmVudE5hbWUpIHtcbiAgICAgIC8vIFdlIGhhbmRsZSBzZWxlY3Rpb25jaGFuZ2Ugc2VwYXJhdGVseSBiZWNhdXNlIGl0XG4gICAgICAvLyBkb2Vzbid0IGJ1YmJsZSBhbmQgbmVlZHMgdG8gYmUgb24gdGhlIGRvY3VtZW50LlxuICAgICAgaWYgKGRvbUV2ZW50TmFtZSAhPT0gJ3NlbGVjdGlvbmNoYW5nZScpIHtcbiAgICAgICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZmFsc2UsIHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCB0cnVlLCByb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJFbGVtZW50IDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChvd25lckRvY3VtZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50IGFsc28gbmVlZHMgZGVkdXBsaWNhdGlvblxuICAgICAgLy8gYnV0IGl0IGlzIGF0dGFjaGVkIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmICghb3duZXJEb2N1bWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgICAgIG93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSA9IHRydWU7XG4gICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoJ3NlbGVjdGlvbmNoYW5nZScsIGZhbHNlLCBvd25lckRvY3VtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIGlzRGVmZXJyZWRMaXN0ZW5lckZvckxlZ2FjeUZCU3VwcG9ydCkge1xuICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncyk7IC8vIElmIHBhc3NpdmUgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmVcbiAgLy8gYWN0aXZlIGFuZCBub3QgcGFzc2l2ZS5cblxuICB2YXIgaXNQYXNzaXZlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkKSB7XG4gICAgLy8gQnJvd3NlcnMgaW50cm9kdWNlZCBhbiBpbnRlcnZlbnRpb24sIG1ha2luZyB0aGVzZSBldmVudHNcbiAgICAvLyBwYXNzaXZlIGJ5IGRlZmF1bHQgb24gZG9jdW1lbnQuIFJlYWN0IGRvZXNuJ3QgYmluZCB0aGVtXG4gICAgLy8gdG8gZG9jdW1lbnQgYW55bW9yZSwgYnV0IGNoYW5naW5nIHRoaXMgbm93IHdvdWxkIHVuZG9cbiAgICAvLyB0aGUgcGVyZm9ybWFuY2Ugd2lucyBmcm9tIHRoZSBjaGFuZ2UuIFNvIHdlIGVtdWxhdGVcbiAgICAvLyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgbWFudWFsbHkgb24gdGhlIHJvb3RzIG5vdy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5NjUxXG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNobW92ZScgfHwgZG9tRXZlbnROYW1lID09PSAnd2hlZWwnKSB7XG4gICAgICBpc1Bhc3NpdmVMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0Q29udGFpbmVyID0gIHRhcmdldENvbnRhaW5lcjtcbiAgdmFyIHVuc3Vic2NyaWJlTGlzdGVuZXI7IC8vIFdoZW4gbGVnYWN5RkJTdXBwb3J0IGlzIGVuYWJsZWQsIGl0J3MgZm9yIHdoZW4gd2VcblxuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lcikge1xuICByZXR1cm4gZ3JhbmRDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lciB8fCBncmFuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIGdyYW5kQ29udGFpbmVyLnBhcmVudE5vZGUgPT09IHRhcmdldENvbnRhaW5lcjtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgYW5jZXN0b3JJbnN0ID0gdGFyZ2V0SW5zdDtcblxuICBpZiAoKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSkgPT09IDAgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19OT05fREVMRUdBVEVEKSA9PT0gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXJOb2RlID0gdGFyZ2V0Q29udGFpbmVyOyAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGxlZ2FjeSBGQiBzdXBwb3J0IGZsYWcsIHdlXG5cbiAgICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIGJlbG93IGxvZ2ljIGF0dGVtcHRzIHRvIHdvcmsgb3V0IGlmIHdlIG5lZWQgdG8gY2hhbmdlXG4gICAgICAvLyB0aGUgdGFyZ2V0IGZpYmVyIHRvIGEgZGlmZmVyZW50IGFuY2VzdG9yLiBXZSBoYWQgc2ltaWxhciBsb2dpY1xuICAgICAgLy8gaW4gdGhlIGxlZ2FjeSBldmVudCBzeXN0ZW0sIGV4Y2VwdCB0aGUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlblxuICAgICAgLy8gc3lzdGVtcyBpcyB0aGF0IHRoZSBtb2Rlcm4gZXZlbnQgc3lzdGVtIG5vdyBoYXMgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgIC8vIGF0dGFjaGVkIHRvIGVhY2ggUmVhY3QgUm9vdCBhbmQgUmVhY3QgUG9ydGFsIFJvb3QuIFRvZ2V0aGVyLFxuICAgICAgLy8gdGhlIERPTSBub2RlcyByZXByZXNlbnRpbmcgdGhlc2Ugcm9vdHMgYXJlIHRoZSBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIFRvIGZpZ3VyZSBvdXQgd2hpY2ggYW5jZXN0b3IgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZSwgd2UgdHJhdmVyc2VcbiAgICAgIC8vIHVwIHRoZSBmaWJlciB0cmVlIGZyb20gdGhlIHRhcmdldCBpbnN0YW5jZSBhbmQgYXR0ZW1wdCB0byBmaW5kXG4gICAgICAvLyByb290IGJvdW5kYXJpZXMgdGhhdCBtYXRjaCB0aGF0IG9mIG91ciBjdXJyZW50IFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gSWYgd2UgZmluZCB0aGF0IFwicm9vdENvbnRhaW5lclwiLCB3ZSBmaW5kIHRoZSBwYXJlbnQgZmliZXJcbiAgICAgIC8vIHN1Yi10cmVlIGZvciB0aGF0IHJvb3QgYW5kIG1ha2UgdGhhdCBvdXIgYW5jZXN0b3IgaW5zdGFuY2UuXG4gICAgICB2YXIgbm9kZSA9IHRhcmdldEluc3Q7XG5cbiAgICAgIG1haW5Mb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub2RlVGFnID0gbm9kZS50YWc7XG5cbiAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RSb290IHx8IG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBpcyBhIHBvcnRhbCwgYnV0IGl0J3Mgbm90IHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgICAgICAgICAgLy8gTm9ybWFsbHkgcG9ydGFscyBoYW5kbGUgdGhlaXIgb3duIGV2ZW50cyBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSByb290LlxuICAgICAgICAgICAgLy8gU28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gc3RvcCBub3cuIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgdGhpcyBwb3J0YWxcbiAgICAgICAgICAgIC8vIHdhcyBwYXJ0IG9mICpvdXIqIHJvb3QuXG4gICAgICAgICAgICB2YXIgZ3JhbmROb2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgICAgICAgIHdoaWxlIChncmFuZE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGdyYW5kVGFnID0gZ3JhbmROb2RlLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZ3JhbmRUYWcgPT09IEhvc3RSb290IHx8IGdyYW5kVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYW5kQ29udGFpbmVyID0gZ3JhbmROb2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvciBhbmQgd2UgZm91bmQgaXQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGEgcGFyZW50IG9mIHRoZSBQb3J0YWwuIFRoYXQgbWVhbnMgd2UgY2FuIGlnbm9yZSBpdCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gUG9ydGFsIHdpbGwgYnViYmxlIHRocm91Z2ggdG8gdXMuXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ3JhbmROb2RlID0gZ3JhbmROb2RlLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgaXQncyBjb3JyZXNwb25kaW5nIGhvc3QgZmliZXIgaW4gdGhlIG90aGVyXG4gICAgICAgICAgLy8gdHJlZS4gVG8gZG8gdGhpcyB3ZSBjYW4gdXNlIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLCBidXQgd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGZpYmVyIGlzIGEgaG9zdCBpbnN0YW5jZSwgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cCB0aHJvdWdoIHRoZSBET00gdGlsbCB3ZSBmaW5kIHRoZSBjb3JyZWN0XG4gICAgICAgICAgLy8gbm9kZSB0aGF0IGlzIGZyb20gdGhlIG90aGVyIHRyZWUuXG5cblxuICAgICAgICAgIHdoaWxlIChjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnROb2RlID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50Tm9kZS50YWc7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRUYWcgPT09IEhvc3RDb21wb25lbnQgfHwgcGFyZW50VGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICAgICAgICBub2RlID0gYW5jZXN0b3JJbnN0ID0gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgY29udGludWUgbWFpbkxvb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBiYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCBhbmNlc3Rvckluc3QpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgIGN1cnJlbnRUYXJnZXQ6IGN1cnJlbnRUYXJnZXRcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUsIG5hdGl2ZUV2ZW50VHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5LCBuYXRpdmVFdmVudCkge1xuICB2YXIgY2FwdHVyZU5hbWUgPSByZWFjdE5hbWUgIT09IG51bGwgPyByZWFjdE5hbWUgKyAnQ2FwdHVyZScgOiBudWxsO1xuICB2YXIgcmVhY3RFdmVudE5hbWUgPSBpbkNhcHR1cmVQaGFzZSA/IGNhcHR1cmVOYW1lIDogcmVhY3ROYW1lO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyO1xuICB2YXIgbGFzdEhvc3RDb21wb25lbnQgPSBudWxsOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTIgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMi5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTIudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIGxhc3RIb3N0Q29tcG9uZW50ID0gc3RhdGVOb2RlOyAvLyBjcmVhdGVFdmVudEhhbmRsZSBsaXN0ZW5lcnNcblxuXG4gICAgICBpZiAocmVhY3RFdmVudE5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0RXZlbnROYW1lKTtcblxuICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBsYXN0SG9zdENvbXBvbmVudCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBJZiB3ZSBhcmUgb25seSBhY2N1bXVsYXRpbmcgZXZlbnRzIGZvciB0aGUgdGFyZ2V0LCB0aGVuIHdlIGRvbid0XG4gICAgLy8gY29udGludWUgdG8gcHJvcGFnYXRlIHRocm91Z2ggdGhlIFJlYWN0IGZpYmVyIHRyZWUgdG8gZmluZCBvdGhlclxuICAgIC8vIGxpc3RlbmVycy5cblxuXG4gICAgaWYgKGFjY3VtdWxhdGVUYXJnZXRPbmx5KSB7XG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIHdlIGFyZSBwcm9jZXNzaW5nIHRoZSBvbkJlZm9yZUJsdXIgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byB0YWtlXG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcnM7XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gQmVmb3JlSW5wdXRFdmVudFBsdWdpblxuLy8gLSBDaGFuZ2VFdmVudFBsdWdpblxuLy8gLSBTZWxlY3RFdmVudFBsdWdpblxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIG9ubHkgcHJvY2VzcyB0aGVzZSBwbHVnaW5zXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMgKHZpYSBlbXVsYXRpb24pLlxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSkge1xuICB2YXIgY2FwdHVyZU5hbWUgPSByZWFjdE5hbWUgKyAnQ2FwdHVyZSc7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0RmliZXI7IC8vIEFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBhbmQgbGlzdGVuZXJzIHZpYSB0aGUgdGFyZ2V0IC0+IHJvb3QgcGF0aC5cblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICB2YXIgX2luc3RhbmNlMyA9IGluc3RhbmNlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2UzLnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlMy50YWc7IC8vIEhhbmRsZSBsaXN0ZW5lcnMgdGhhdCBhcmUgb24gSG9zdENvbXBvbmVudHMgKGkuZS4gPGRpdj4pXG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG4gICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVOYW1lKTtcblxuICAgICAgaWYgKGNhcHR1cmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVhY3ROYW1lKTtcblxuICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgYnViYmxlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcnM7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudChpbnN0KSB7XG4gIGlmIChpbnN0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkbyB7XG4gICAgaW5zdCA9IGluc3QucmV0dXJuOyAvLyBUT0RPOiBJZiB0aGlzIGlzIGEgSG9zdFJvb3Qgd2UgbWlnaHQgd2FudCB0byBiYWlsIG91dC5cbiAgICAvLyBUaGF0IGlzIGRlcGVuZGluZyBvbiBpZiB3ZSB3YW50IG5lc3RlZCBzdWJ0cmVlcyAobGF5ZXJzKSB0byBidWJibGVcbiAgICAvLyBldmVudHMgdG8gdGhlaXIgcGFyZW50LiBXZSBjb3VsZCBhbHNvIGdvIHRocm91Z2ggcGFyZW50Tm9kZSBvbiB0aGVcbiAgICAvLyBob3N0IG5vZGUgYnV0IHRoYXQgd291bGRuJ3Qgd29yayBmb3IgUmVhY3QgTmF0aXZlIGFuZCBkb2Vzbid0IGxldCB1c1xuICAgIC8vIGRvIHRoZSBwb3J0YWwgZmVhdHVyZS5cbiAgfSB3aGlsZSAoaW5zdCAmJiBpbnN0LnRhZyAhPT0gSG9zdENvbXBvbmVudCk7XG5cbiAgaWYgKGluc3QpIHtcbiAgICByZXR1cm4gaW5zdDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBSZXR1cm4gdGhlIGxvd2VzdCBjb21tb24gYW5jZXN0b3Igb2YgQSBhbmQgQiwgb3IgbnVsbCBpZiB0aGV5IGFyZSBpblxuICogZGlmZmVyZW50IHRyZWVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7XG4gIHZhciBub2RlQSA9IGluc3RBO1xuICB2YXIgbm9kZUIgPSBpbnN0QjtcbiAgdmFyIGRlcHRoQSA9IDA7XG5cbiAgZm9yICh2YXIgdGVtcEEgPSBub2RlQTsgdGVtcEE7IHRlbXBBID0gZ2V0UGFyZW50KHRlbXBBKSkge1xuICAgIGRlcHRoQSsrO1xuICB9XG5cbiAgdmFyIGRlcHRoQiA9IDA7XG5cbiAgZm9yICh2YXIgdGVtcEIgPSBub2RlQjsgdGVtcEI7IHRlbXBCID0gZ2V0UGFyZW50KHRlbXBCKSkge1xuICAgIGRlcHRoQisrO1xuICB9IC8vIElmIEEgaXMgZGVlcGVyLCBjcmF3bCB1cC5cblxuXG4gIHdoaWxlIChkZXB0aEEgLSBkZXB0aEIgPiAwKSB7XG4gICAgbm9kZUEgPSBnZXRQYXJlbnQobm9kZUEpO1xuICAgIGRlcHRoQS0tO1xuICB9IC8vIElmIEIgaXMgZGVlcGVyLCBjcmF3bCB1cC5cblxuXG4gIHdoaWxlIChkZXB0aEIgLSBkZXB0aEEgPiAwKSB7XG4gICAgbm9kZUIgPSBnZXRQYXJlbnQobm9kZUIpO1xuICAgIGRlcHRoQi0tO1xuICB9IC8vIFdhbGsgaW4gbG9ja3N0ZXAgdW50aWwgd2UgZmluZCBhIG1hdGNoLlxuXG5cbiAgdmFyIGRlcHRoID0gZGVwdGhBO1xuXG4gIHdoaWxlIChkZXB0aC0tKSB7XG4gICAgaWYgKG5vZGVBID09PSBub2RlQiB8fCBub2RlQiAhPT0gbnVsbCAmJiBub2RlQSA9PT0gbm9kZUIuYWx0ZXJuYXRlKSB7XG4gICAgICByZXR1cm4gbm9kZUE7XG4gICAgfVxuXG4gICAgbm9kZUEgPSBnZXRQYXJlbnQobm9kZUEpO1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGV2ZW50LCB0YXJnZXQsIGNvbW1vbiwgaW5DYXB0dXJlUGhhc2UpIHtcbiAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5fcmVhY3ROYW1lO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldDtcblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICBpZiAoaW5zdGFuY2UgPT09IGNvbW1vbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIF9pbnN0YW5jZTQgPSBpbnN0YW5jZSxcbiAgICAgICAgYWx0ZXJuYXRlID0gX2luc3RhbmNlNC5hbHRlcm5hdGUsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTQuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2U0LnRhZztcblxuICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwgJiYgYWx0ZXJuYXRlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudFRhcmdldCA9IHN0YXRlTm9kZTtcblxuICAgICAgaWYgKGluQ2FwdHVyZVBoYXNlKSB7XG4gICAgICAgIHZhciBjYXB0dXJlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGNhcHR1cmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWluQ2FwdHVyZVBoYXNlKSB7XG4gICAgICAgIHZhciBidWJibGVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICBpZiAoYnViYmxlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gIH1cbn0gLy8gV2Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gZm9yOlxuLy8gLSBFbnRlckxlYXZlRXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhpcyBwbHVnaW5cbi8vIGluIHRoZSBidWJibGUgcGhhc2UsIHNvIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSB0d29cbi8vIHBoYXNlIGV2ZW50IGxpc3RlbmVycy5cblxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZVR3b1BoYXNlTGlzdGVuZXJzKGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGVudGVyRXZlbnQsIGZyb20sIHRvKSB7XG4gIHZhciBjb21tb24gPSBmcm9tICYmIHRvID8gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZnJvbSwgdG8pIDogbnVsbDtcblxuICBpZiAoZnJvbSAhPT0gbnVsbCkge1xuICAgIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbGVhdmVFdmVudCwgZnJvbSwgY29tbW9uLCBmYWxzZSk7XG4gIH1cblxuICBpZiAodG8gIT09IG51bGwgJiYgZW50ZXJFdmVudCAhPT0gbnVsbCkge1xuICAgIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZW50ZXJFdmVudCwgdG8sIGNvbW1vbiwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgY2FwdHVyZSkge1xuICByZXR1cm4gZG9tRXZlbnROYW1lICsgXCJfX1wiICsgKGNhcHR1cmUgPyAnY2FwdHVyZScgOiAnYnViYmxlJyk7XG59XG5cbnZhciBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IGZhbHNlO1xudmFyIERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MID0gJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJztcbnZhciBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgPSAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJztcbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyA9ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnO1xudmFyIEFVVE9GT0NVUyA9ICdhdXRvRm9jdXMnO1xudmFyIENISUxEUkVOID0gJ2NoaWxkcmVuJztcbnZhciBTVFlMRSA9ICdzdHlsZSc7XG52YXIgSFRNTCQxID0gJ19faHRtbCc7XG52YXIgd2FybmVkVW5rbm93blRhZ3M7XG52YXIgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudDtcbnZhciB3YXJuRm9yUHJvcERpZmZlcmVuY2U7XG52YXIgd2FybkZvckV4dHJhQXR0cmlidXRlcztcbnZhciB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXI7XG52YXIgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZztcbnZhciBub3JtYWxpemVIVE1MO1xuXG57XG4gIHdhcm5lZFVua25vd25UYWdzID0ge1xuICAgIC8vIFRoZXJlIGFyZSB3b3JraW5nIHBvbHlmaWxscyBmb3IgPGRpYWxvZz4uIExldCBwZW9wbGUgdXNlIGl0LlxuICAgIGRpYWxvZzogdHJ1ZSxcbiAgICAvLyBFbGVjdHJvbiBzaGlwcyBhIGN1c3RvbSA8d2Vidmlldz4gdGFnIHRvIGRpc3BsYXkgZXh0ZXJuYWwgd2ViIGNvbnRlbnQgaW5cbiAgICAvLyBhbiBpc29sYXRlZCBmcmFtZSBhbmQgcHJvY2Vzcy5cbiAgICAvLyBUaGlzIHRhZyBpcyBub3QgcHJlc2VudCBpbiBub24gRWxlY3Ryb24gZW52aXJvbm1lbnRzIHN1Y2ggYXMgSlNEb20gd2hpY2hcbiAgICAvLyBpcyBvZnRlbiB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9lbGVjdHJvbmpzLm9yZy9kb2NzL2FwaS93ZWJ2aWV3LXRhZ1xuICAgIHdlYnZpZXc6IHRydWVcbiAgfTtcblxuICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIHtcbiAgICAgIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzXG4gICAgfSk7XG4gIH07IC8vIElFIDExIHBhcnNlcyAmIG5vcm1hbGl6ZXMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhcyBvcHBvc2VkIHRvIG90aGVyXG4gIC8vIGJyb3dzZXJzLiBJdCBhZGRzIHNwYWNlcyBhbmQgc29ydHMgdGhlIHByb3BlcnRpZXMgaW4gc29tZVxuICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1NcbiAgLy8gcHJvcGVydGllcyBpbiB0aGUgY2xpZW50ICYgc2VydmVyIHZlcnNpb25zIG9yIGFwcGx5aW5nXG4gIC8vIGBleHBlY3RlZFN0eWxlYCB0byBhIHRlbXBvcmFyeSBET00gbm9kZSB0byByZWFkIGl0cyBgc3R5bGVgIGF0dHJpYnV0ZVxuICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzXG4gIC8vIGluIHRoYXQgYnJvd3NlciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mIGRvaW5nIGFsbCB0aGF0IHdvcmsuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExODA3XG5cblxuICBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nID0gY2FuVXNlRE9NICYmICFkb2N1bWVudC5kb2N1bWVudE1vZGU7XG5cbiAgd2FybkZvclByb3BEaWZmZXJlbmNlID0gZnVuY3Rpb24gKHByb3BOYW1lLCBzZXJ2ZXJWYWx1ZSwgY2xpZW50VmFsdWUpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZENsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclZhbHVlKTtcblxuICAgIGlmIChub3JtYWxpemVkU2VydmVyVmFsdWUgPT09IG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdQcm9wIGAlc2AgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiAlcyBDbGllbnQ6ICVzJywgcHJvcE5hbWUsIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSksIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkpO1xuICB9O1xuXG4gIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZXMpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9KTtcblxuICAgIGVycm9yKCdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7XG4gIH07XG5cbiAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGxpc3RlbmVyID09PSBmYWxzZSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYGZhbHNlYC5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGAlc2AgdHlwZS4nLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTsgLy8gUGFyc2UgdGhlIEhUTUwgYW5kIHJlYWQgaXQgYmFjayB0byBub3JtYWxpemUgdGhlIEhUTUwgc3RyaW5nIHNvIHRoYXQgaXRcbiAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uXG5cblxuICBub3JtYWxpemVIVE1MID0gZnVuY3Rpb24gKHBhcmVudCwgaHRtbCkge1xuICAgIC8vIFdlIGNvdWxkIGhhdmUgY3JlYXRlZCBhIHNlcGFyYXRlIGRvY3VtZW50IGhlcmUgdG8gYXZvaWRcbiAgICAvLyByZS1pbml0aWFsaXppbmcgY3VzdG9tIGVsZW1lbnRzIGlmIHRoZXkgZXhpc3QuIEJ1dCB0aGlzIGJyZWFrc1xuICAgIC8vIGhvdyA8bm9zY3JpcHQ+IGlzIGJlaW5nIGhhbmRsZWQuIFNvIHdlIHVzZSB0aGUgc2FtZSBkb2N1bWVudC5cbiAgICAvLyBTZWUgdGhlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTExNTcuXG4gICAgdmFyIHRlc3RFbGVtZW50ID0gcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UgPyBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHBhcmVudC50YWdOYW1lKSA6IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhwYXJlbnQubmFtZXNwYWNlVVJJLCBwYXJlbnQudGFnTmFtZSk7XG4gICAgdGVzdEVsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICByZXR1cm4gdGVzdEVsZW1lbnQuaW5uZXJIVE1MO1xuICB9O1xufSAvLyBIVE1MIHBhcnNpbmcgbm9ybWFsaXplcyBDUiBhbmQgQ1JMRiB0byBMRi5cbi8vIEl0IGFsc28gY2FuIHR1cm4gXFx1MDAwMCBpbnRvIFxcdUZGRkQgaW5zaWRlIGF0dHJpYnV0ZXMuXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc2luZ2xlLXBhZ2UuaHRtbCNwcmVwcm9jZXNzaW5nLXRoZS1pbnB1dC1zdHJlYW1cbi8vIElmIHdlIGhhdmUgYSBtaXNtYXRjaCwgaXQgbWlnaHQgYmUgY2F1c2VkIGJ5IHRoYXQuXG4vLyBXZSB3aWxsIHN0aWxsIHBhdGNoIHVwIGluIHRoaXMgY2FzZSBidXQgbm90IGZpcmUgdGhlIHdhcm5pbmcuXG5cblxudmFyIE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCA9IC9cXHJcXG4/L2c7XG52YXIgTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYID0gL1xcdTAwMDB8XFx1RkZGRC9nO1xuXG5mdW5jdGlvbiBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUobWFya3VwKSB7XG4gIHtcbiAgICBjaGVja0h0bWxTdHJpbmdDb2VyY2lvbihtYXJrdXApO1xuICB9XG5cbiAgdmFyIG1hcmt1cFN0cmluZyA9IHR5cGVvZiBtYXJrdXAgPT09ICdzdHJpbmcnID8gbWFya3VwIDogJycgKyBtYXJrdXA7XG4gIHJldHVybiBtYXJrdXBTdHJpbmcucmVwbGFjZShOT1JNQUxJWkVfTkVXTElORVNfUkVHRVgsICdcXG4nKS5yZXBsYWNlKE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCwgJycpO1xufVxuXG5mdW5jdGlvbiBjaGVja0ZvclVubWF0Y2hlZFRleHQoc2VydmVyVGV4dCwgY2xpZW50VGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldikge1xuICB2YXIgbm9ybWFsaXplZENsaWVudFRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoY2xpZW50VGV4dCk7XG4gIHZhciBub3JtYWxpemVkU2VydmVyVGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJUZXh0KTtcblxuICBpZiAobm9ybWFsaXplZFNlcnZlclRleHQgPT09IG5vcm1hbGl6ZWRDbGllbnRUZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFdhcm5EZXYpIHtcbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGV4dCBjb250ZW50IGRpZCBub3QgbWF0Y2guIFNlcnZlcjogXCIlc1wiIENsaWVudDogXCIlc1wiJywgbm9ybWFsaXplZFNlcnZlclRleHQsIG5vcm1hbGl6ZWRDbGllbnRUZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaXNDb25jdXJyZW50TW9kZSAmJiBlbmFibGVDbGllbnRSZW5kZXJGYWxsYmFja09uVGV4dE1pc21hdGNoKSB7XG4gICAgLy8gSW4gY29uY3VycmVudCByb290cywgd2UgdGhyb3cgd2hlbiB0aGVyZSdzIGEgdGV4dCBtaXNtYXRjaCBhbmQgcmV2ZXJ0IHRvXG4gICAgLy8gY2xpZW50IHJlbmRlcmluZywgdXAgdG8gdGhlIG5lYXJlc3QgU3VzcGVuc2UgYm91bmRhcnkuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUZXh0IGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggc2VydmVyLXJlbmRlcmVkIEhUTUwuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJFbGVtZW50IDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KG5vZGUpIHtcbiAgLy8gTW9iaWxlIFNhZmFyaSBkb2VzIG5vdCBmaXJlIHByb3Blcmx5IGJ1YmJsZSBjbGljayBldmVudHMgb25cbiAgLy8gbm9uLWludGVyYWN0aXZlIGVsZW1lbnRzLCB3aGljaCBtZWFucyBkZWxlZ2F0ZWQgY2xpY2sgbGlzdGVuZXJzIGRvIG5vdFxuICAvLyBmaXJlLiBUaGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBidWcgaW52b2x2ZXMgYXR0YWNoaW5nIGFuIGVtcHR5IGNsaWNrXG4gIC8vIGxpc3RlbmVyIG9uIHRoZSB0YXJnZXQgbm9kZS5cbiAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1sXG4gIC8vIEp1c3Qgc2V0IGl0IHVzaW5nIHRoZSBvbmNsaWNrIHByb3BlcnR5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBtYW5hZ2UgYW55XG4gIC8vIGJvb2trZWVwaW5nIGZvciBpdC4gTm90IHN1cmUgaWYgd2UgbmVlZCB0byBjbGVhciBpdCB3aGVuIHRoZSBsaXN0ZW5lciBpc1xuICAvLyByZW1vdmVkLlxuICAvLyBUT0RPOiBPbmx5IGRvIHRoaXMgZm9yIHRoZSByZWxldmFudCBTYWZhcmlzIG1heWJlP1xuICBub2RlLm9uY2xpY2sgPSBub29wO1xufVxuXG5mdW5jdGlvbiBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBuZXh0UHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGZvciAodmFyIHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXh0UHJvcCA9IG5leHRQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAvLyBGcmVlemUgdGhlIG5leHQgc3R5bGUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBiZVxuICAgICAgICAgIC8vIG11dGF0ZWQuIFdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgICAgT2JqZWN0LmZyZWV6ZShuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuXG5cblxuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIGluaXRpYWwgdGV4dENvbnRlbnQgd2hlbiB0aGUgdGV4dCBpcyBlbXB0eS4gSW4gSUUxMSBzZXR0aW5nXG4gICAgICAgIC8vIHRleHRDb250ZW50IG9uIGEgPHRleHRhcmVhPiB3aWxsIGNhdXNlIHRoZSBwbGFjZWhvbGRlciB0byBub3RcbiAgICAgICAgLy8gc2hvdyB3aXRoaW4gdGhlIDx0ZXh0YXJlYT4gdW50aWwgaXQgaGFzIGJlZW4gZm9jdXNlZCBhbmQgYmx1cnJlZCBhZ2Fpbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82NzMxI2lzc3VlY29tbWVudC0yNTQ4NzQ1NTNcbiAgICAgICAgdmFyIGNhblNldFRleHRDb250ZW50ID0gdGFnICE9PSAndGV4dGFyZWEnIHx8IG5leHRQcm9wICE9PSAnJztcblxuICAgICAgICBpZiAoY2FuU2V0VGV4dENvbnRlbnQpIHtcbiAgICAgICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyArIG5leHRQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBBVVRPRk9DVVMpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgLy8gVE9ETzogSGFuZGxlIHdhc0N1c3RvbUNvbXBvbmVudFRhZ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZVBheWxvYWQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgcHJvcEtleSA9IHVwZGF0ZVBheWxvYWRbaV07XG4gICAgdmFyIHByb3BWYWx1ZSA9IHVwZGF0ZVBheWxvYWRbaSArIDFdO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgcHJvcFZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50LCBwYXJlbnROYW1lc3BhY2UpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnOyAvLyBXZSBjcmVhdGUgdGFncyBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoZWlyIHBhcmVudCBjb250YWluZXIsIGV4Y2VwdCBIVE1MXG4gIC8vIHRhZ3MgZ2V0IG5vIG5hbWVzcGFjZS5cblxuICB2YXIgb3duZXJEb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHZhciBkb21FbGVtZW50O1xuICB2YXIgbmFtZXNwYWNlVVJJID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgbmFtZXNwYWNlVVJJID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICB7XG4gICAgICBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKTsgLy8gU2hvdWxkIHRoaXMgY2hlY2sgYmUgZ2F0ZWQgYnkgcGFyZW50IG5hbWVzcGFjZT8gTm90IHN1cmUgd2Ugd2FudCB0b1xuICAgICAgLy8gYWxsb3cgPFNWRz4gb3IgPG1BVEg+LlxuXG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIHR5cGUgIT09IHR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBlcnJvcignPCVzIC8+IGlzIHVzaW5nIGluY29ycmVjdCBjYXNpbmcuICcgKyAnVXNlIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMsICcgKyAnb3IgbG93ZXJjYXNlIGZvciBIVE1MIGVsZW1lbnRzLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnc2NyaXB0Jykge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBzY3JpcHQgdmlhIC5pbm5lckhUTUwgc28gaXRzIFwicGFyc2VyLWluc2VydGVkXCIgZmxhZyBpc1xuICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0IGRvZXMgbm90IGV4ZWN1dGVcbiAgICAgIHZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBkaXYuaW5uZXJIVE1MID0gJzxzY3JpcHQ+PCcgKyAnL3NjcmlwdD4nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAvLyBUaGlzIGlzIGd1YXJhbnRlZWQgdG8geWllbGQgYSBzY3JpcHQgZWxlbWVudC5cblxuICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBkaXYuZmlyc3RDaGlsZDtcbiAgICAgIGRvbUVsZW1lbnQgPSBkaXYucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcHJvcHMuaXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyAkRmxvd0lzc3VlIGBjcmVhdGVFbGVtZW50YCBzaG91bGQgYmUgdXBkYXRlZCBmb3IgV2ViIENvbXBvbmVudHNcbiAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSwge1xuICAgICAgICBpczogcHJvcHMuaXNcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZXBhcmF0ZSBlbHNlIGJyYW5jaCBpbnN0ZWFkIG9mIHVzaW5nIGBwcm9wcy5pcyB8fCB1bmRlZmluZWRgIGFib3ZlIGJlY2F1c2Ugb2YgYSBGaXJlZm94IGJ1Zy5cbiAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzY4OTZcbiAgICAgIC8vIGFuZCBkaXNjdXNzaW9uIGluIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNzYyNDBcbiAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7IC8vIE5vcm1hbGx5IGF0dHJpYnV0ZXMgYXJlIGFzc2lnbmVkIGluIGBzZXRJbml0aWFsRE9NUHJvcGVydGllc2AsIGhvd2V2ZXIgdGhlIGBtdWx0aXBsZWAgYW5kIGBzaXplYFxuICAgICAgLy8gYXR0cmlidXRlcyBvbiBgc2VsZWN0YHMgbmVlZHMgdG8gYmUgYWRkZWQgYmVmb3JlIGBvcHRpb25gcyBhcmUgaW5zZXJ0ZWQuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzOlxuICAgICAgLy8gLSBhIGJ1ZyB3aGVyZSB0aGUgYHNlbGVjdGAgZG9lcyBub3Qgc2Nyb2xsIHRvIHRoZSBjb3JyZWN0IG9wdGlvbiBiZWNhdXNlIHNpbmd1bGFyXG4gICAgICAvLyAgYHNlbGVjdGAgZWxlbWVudHMgYXV0b21hdGljYWxseSBwaWNrIHRoZSBmaXJzdCBpdGVtICMxMzIyMlxuICAgICAgLy8gLSBhIGJ1ZyB3aGVyZSB0aGUgYHNlbGVjdGAgc2V0IHRoZSBmaXJzdCBpdGVtIGFzIHNlbGVjdGVkIGRlc3BpdGUgdGhlIGBzaXplYCBhdHRyaWJ1dGUgIzE0MjM5XG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzIyMlxuICAgICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQyMzlcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHZhciBub2RlID0gZG9tRWxlbWVudDtcblxuICAgICAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgICBub2RlLm11bHRpcGxlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5zaXplKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBhIHNpemUgZ3JlYXRlciB0aGFuIDEgY2F1c2VzIGEgc2VsZWN0IHRvIGJlaGF2ZSBsaWtlIGBtdWx0aXBsZT10cnVlYCwgd2hlcmVcbiAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IG5vIG9wdGlvbiBpcyBzZWxlY3RlZC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiBhIHNlbGVjdCBpbiBcInNpbmdsZSBzZWxlY3Rpb24gbW9kZVwiLlxuICAgICAgICAgIG5vZGUuc2l6ZSA9IHByb3BzLnNpemU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgdHlwZSk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvbUVsZW1lbnQpID09PSAnW29iamVjdCBIVE1MVW5rbm93bkVsZW1lbnRdJyAmJiAhaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkpIHtcbiAgICAgICAgd2FybmVkVW5rbm93blRhZ3NbdHlwZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgdGFnIDwlcz4gaXMgdW5yZWNvZ25pemVkIGluIHRoaXMgYnJvd3Nlci4gJyArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoICcgKyAnYW4gdXBwZXJjYXNlIGxldHRlci4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpLmNyZWF0ZVRleHROb2RlKHRleHQpO1xufVxuZnVuY3Rpb24gc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHZhciBwcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpO1xuICBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBwcm9wcywgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlcihkb21FbGVtZW50LCByYXdQcm9wcywgZmFsc2UpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cbn0gLy8gQ2FsY3VsYXRlIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3byBvYmplY3RzLlxuXG5mdW5jdGlvbiBkaWZmUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIGxhc3RSYXdQcm9wcywgbmV4dFJhd1Byb3BzLCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIG5leHRSYXdQcm9wcyk7XG4gIH1cblxuICB2YXIgdXBkYXRlUGF5bG9hZCA9IG51bGw7XG4gIHZhciBsYXN0UHJvcHM7XG4gIHZhciBuZXh0UHJvcHM7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbGFzdFByb3BzID0gbGFzdFJhd1Byb3BzO1xuICAgICAgbmV4dFByb3BzID0gbmV4dFJhd1Byb3BzO1xuXG4gICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgbmV4dFByb3BzKTtcbiAgdmFyIHByb3BLZXk7XG4gIHZhciBzdHlsZU5hbWU7XG4gIHZhciBzdHlsZVVwZGF0ZXMgPSBudWxsO1xuXG4gIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbGFzdFByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgdmFyIGxhc3RTdHlsZSA9IGxhc3RQcm9wc1twcm9wS2V5XTtcblxuICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBmaWJlciBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFsbCBvdGhlciBkZWxldGVkIHByb3BlcnRpZXMgd2UgYWRkIGl0IHRvIHRoZSBxdWV1ZS4gV2UgdXNlXG4gICAgICAvLyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGluIHRoZSBjb21taXQgcGhhc2UgaW5zdGVhZC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFByb3ApIHtcbiAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkge1xuICAgICAgICAgIGlmIChsYXN0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVXBkYXRlIHN0eWxlcyB0aGF0IGNoYW5nZWQgc2luY2UgYGxhc3RQcm9wYC5cblxuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgbGFzdFByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bbc3R5bGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gbmV4dFByb3Bbc3R5bGVOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQucHVzaChwcm9wS2V5LCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3AgPyBsYXN0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRIdG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGVhZ2VybHkgbGlzdGVuIHRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBjb21taXR0ZWQgeWV0LlxuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCAmJiBsYXN0UHJvcCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgcHJvcHMgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgcHJvcGVydHkgd2UgYWx3YXlzIGFkZCBpdCB0byB0aGUgcXVldWUgYW5kIHRoZW4gd2VcbiAgICAgIC8vIGZpbHRlciBpdCBvdXQgdXNpbmcgdGhlIGFsbG93ZWQgcHJvcGVydHkgbGlzdCBkdXJpbmcgdGhlIGNvbW1pdC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0eWxlVXBkYXRlcykge1xuICAgIHtcbiAgICAgIHZhbGlkYXRlU2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb25JbkRldihzdHlsZVVwZGF0ZXMsIG5leHRQcm9wc1tTVFlMRV0pO1xuICAgIH1cblxuICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChTVFlMRSwgc3R5bGVVcGRhdGVzKTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVQYXlsb2FkO1xufSAvLyBBcHBseSB0aGUgZGlmZi5cblxuZnVuY3Rpb24gdXBkYXRlUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0YWcsIGxhc3RSYXdQcm9wcywgbmV4dFJhd1Byb3BzKSB7XG4gIC8vIFVwZGF0ZSBjaGVja2VkICpiZWZvcmUqIG5hbWUuXG4gIC8vIEluIHRoZSBtaWRkbGUgb2YgYW4gdXBkYXRlLCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGNoZWNrZWQuXG4gIC8vIFdoZW4gYSBjaGVja2VkIHJhZGlvIHRyaWVzIHRvIGNoYW5nZSBuYW1lLCBicm93c2VyIG1ha2VzIGFub3RoZXIgcmFkaW8ncyBjaGVja2VkIGZhbHNlLlxuICBpZiAodGFnID09PSAnaW5wdXQnICYmIG5leHRSYXdQcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5leHRSYXdQcm9wcy5uYW1lICE9IG51bGwpIHtcbiAgICB1cGRhdGVDaGVja2VkKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gIH1cblxuICB2YXIgd2FzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCBsYXN0UmF3UHJvcHMpO1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIG5leHRSYXdQcm9wcyk7IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG4gIHVwZGF0ZURPTVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgd2FzQ3VzdG9tQ29tcG9uZW50VGFnLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7IC8vIFRPRE86IEVuc3VyZSB0aGF0IGFuIHVwZGF0ZSBnZXRzIHNjaGVkdWxlZCBpZiBhbnkgb2YgdGhlIHNwZWNpYWwgcHJvcHNcbiAgLy8gY2hhbmdlZC5cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFVwZGF0ZSB0aGUgd3JhcHBlciBhcm91bmQgaW5wdXRzICphZnRlciogdXBkYXRpbmcgcHJvcHMuIFRoaXMgaGFzIHRvXG4gICAgICAvLyBoYXBwZW4gYWZ0ZXIgYHVwZGF0ZURPTVByb3BlcnRpZXNgLiBPdGhlcndpc2UgSFRNTDUgaW5wdXQgdmFsaWRhdGlvbnNcbiAgICAgIC8vIHJhaXNlIHdhcm5pbmdzIGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBiZWluZyBhc3NpZ25lZC5cbiAgICAgIHVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgdXBkYXRlV3JhcHBlciQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAvLyA8c2VsZWN0PiB2YWx1ZSB1cGRhdGUgbmVlZHMgdG8gb2NjdXIgYWZ0ZXIgPG9wdGlvbj4gY2hpbGRyZW5cbiAgICAgIC8vIHJlY29uY2lsaWF0aW9uXG4gICAgICBwb3N0VXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUocHJvcE5hbWUpIHtcbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHByb3BOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIXBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdIHx8IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZkh5ZHJhdGVkUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIHJhd1Byb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJFbGVtZW50LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZztcbiAgdmFyIGV4dHJhQXR0cmlidXRlTmFtZXM7XG5cbiAge1xuICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICBleHRyYUF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgIHZhciBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZXNbX2ldLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cbiAgICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NoZWNrZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgdXNlIHRoZSBvcmlnaW5hbCBuYW1lLlxuICAgICAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEwNjc2LlxuICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuYWRkKGF0dHJpYnV0ZXNbX2ldLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcblxuICBmb3IgKHZhciBwcm9wS2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCFyYXdQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcm9wID0gcmF3UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgY2hpbGRyZW4gd2UgY29tcGFyZSBhZ2FpbnN0IHRleHRDb250ZW50LiBUaGlzXG4gICAgICAvLyBtaWdodCBtYXRjaCBhZGRpdGlvbmFsIEhUTUwgdGhhdCBpcyBoaWRkZW4gd2hlbiB3ZSByZWFkIGl0IHVzaW5nXG4gICAgICAvLyB0ZXh0Q29udGVudC4gRS5nLiBcImZvb1wiIHdpbGwgbWF0Y2ggXCJmPHNwYW4+b288L3NwYW4+XCIgYnV0IHRoYXQgc3RpbGxcbiAgICAgIC8vIHNhdGlzZmllcyBvdXIgcmVxdWlyZW1lbnQuIE91ciByZXF1aXJlbWVudCBpcyBub3QgdG8gcHJvZHVjZSBwZXJmZWN0XG4gICAgICAvLyBIVE1MIGFuZCBhdHRyaWJ1dGVzLiBJZGVhbGx5IHdlIHNob3VsZCBwcmVzZXJ2ZSBzdHJ1Y3R1cmUgYnV0IGl0J3NcbiAgICAgIC8vIG9rIG5vdCB0byBpZiB0aGUgdmlzaWJsZSBjb250ZW50IGlzIHN0aWxsIGVub3VnaCB0byBpbmRpY2F0ZSB3aGF0XG4gICAgICAvLyBldmVuIGxpc3RlbmVycyB0aGVzZSBub2RlcyBtaWdodCBiZSB3aXJlZCB1cCB0by5cbiAgICAgIC8vIFRPRE86IFdhcm4gaWYgdGhlcmUgaXMgbW9yZSB0aGFuIGEgc2luZ2xlIHRleHROb2RlIGFzIGEgY2hpbGQuXG4gICAgICAvLyBUT0RPOiBTaG91bGQgd2UgdXNlIGRvbUVsZW1lbnQuZmlyc3RDaGlsZC5ub2RlVmFsdWUgdG8gY29tcGFyZT9cbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChkb21FbGVtZW50LnRleHRDb250ZW50LCBuZXh0UHJvcCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09ICcnICsgbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3AsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sICcnICsgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzaG91bGRXYXJuRGV2ICYmIHRydWUgJiYgLy8gQ29udmluY2UgRmxvdyB3ZSd2ZSBjYWxjdWxhdGVkIGl0IChpdCdzIERFVi1vbmx5IGluIHRoaXMgbWV0aG9kLilcbiAgICB0eXBlb2YgaXNDdXN0b21Db21wb25lbnRUYWcgPT09ICdib29sZWFuJykge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcHJvcGVydGllcyBjb3JyZXNwb25kIHRvIHRoZWlyIGV4cGVjdGVkIHZhbHVlcy5cbiAgICAgIHZhciBzZXJ2ZXJWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSBpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ID8gbnVsbCA6IGdldFByb3BlcnR5SW5mbyhwcm9wS2V5KTtcblxuICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSA9PT0gdHJ1ZSkgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgfHwgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkXG4gICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cbiAgICAgIHByb3BLZXkgPT09ICd2YWx1ZScgfHwgcHJvcEtleSA9PT0gJ2NoZWNrZWQnIHx8IHByb3BLZXkgPT09ICdzZWxlY3RlZCcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgICAgdmFyIHNlcnZlckhUTUwgPSBkb21FbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkSFRNTCA9IG5vcm1hbGl6ZUhUTUwoZG9tRWxlbWVudCwgbmV4dEh0bWwpO1xuXG4gICAgICAgICAgaWYgKGV4cGVjdGVkSFRNTCAhPT0gc2VydmVySFRNTCkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlckhUTUwsIGV4cGVjdGVkSFRNTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG5cbiAgICAgICAgaWYgKGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmcpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRTdHlsZSA9IGNyZWF0ZURhbmdlcm91c1N0cmluZ0ZvclN0eWxlcyhuZXh0UHJvcCk7XG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZFN0eWxlICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBleHBlY3RlZFN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgJiYgIWVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcblxuICAgICAgICBpZiAobmV4dFByb3AgIT09IHNlcnZlclZhbHVlKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZElnbm9yZUF0dHJpYnV0ZShwcm9wS2V5LCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSAmJiAhc2hvdWxkUmVtb3ZlQXR0cmlidXRlKHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgICAgICB2YXIgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBwYXJlbnROYW1lc3BhY2U7XG5cbiAgICAgICAgICBpZiAob3duTmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgICAgb3duTmFtZXNwYWNlID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHRhZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wS2V5KTtcblxuICAgICAgICAgICAgaWYgKHN0YW5kYXJkTmFtZSAhPT0gbnVsbCAmJiBzdGFuZGFyZE5hbWUgIT09IHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYW4gU1ZHIHByb3AgaXMgc3VwcGxpZWQgd2l0aCBiYWQgY2FzaW5nLCBpdCB3aWxsXG4gICAgICAgICAgICAgIC8vIGJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgZnJvbSBIVE1MLCBidXQgd2lsbCBwcm9kdWNlIGEgbWlzbWF0Y2hcbiAgICAgICAgICAgICAgLy8gKGFuZCB3b3VsZCBiZSBpbmNvcnJlY3RseSByZW5kZXJlZCBvbiB0aGUgY2xpZW50KS5cbiAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgYWxyZWFkeSB3YXJuIGFib3V0IGJhZCBjYXNpbmcgZWxzZXdoZXJlLlxuICAgICAgICAgICAgICAvLyBTbyB3ZSdsbCBza2lwIHRoZSBtaXNsZWFkaW5nIGV4dHJhIG1pc21hdGNoIHdhcm5pbmcgaW4gdGhpcyBjYXNlLlxuICAgICAgICAgICAgICBpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcgPSB0cnVlOyAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cbiAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUoc3RhbmRhcmROYW1lKTtcbiAgICAgICAgICAgIH0gLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuXG5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRvbnRXYXJuQ3VzdG9tRWxlbWVudCA9IGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgIDtcblxuICAgICAgICBpZiAoIWRvbnRXYXJuQ3VzdG9tRWxlbWVudCAmJiBuZXh0UHJvcCAhPT0gc2VydmVyVmFsdWUgJiYgIWlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZykge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChzaG91bGRXYXJuRGV2KSB7XG4gICAgICBpZiAoIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuc2l6ZSA+IDAgJiYgcmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyhleHRyYUF0dHJpYnV0ZU5hbWVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIHRydWUpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIC8vIEZvciBpbnB1dCBhbmQgdGV4dGFyZWEgd2UgY3VycmVudCBhbHdheXMgc2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSBhdFxuICAgICAgLy8gcG9zdCBtb3VudCB0byBmb3JjZSBpdCB0byBkaXZlcmdlIGZyb20gYXR0cmlidXRlcy4gSG93ZXZlciwgZm9yXG4gICAgICAvLyBvcHRpb24gYW5kIHNlbGVjdCB3ZSBkb24ndCBxdWl0ZSBkbyB0aGUgc2FtZSB0aGluZyBhbmQgc2VsZWN0XG4gICAgICAvLyBpcyBub3QgcmVzaWxpZW50IHRvIHRoZSBET00gc3RhdGUgY2hhbmdpbmcgc28gd2UgZG9uJ3QgZG8gdGhhdCBoZXJlLlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbm90IGRvaW5nIHRoaXMgZm9yIGlucHV0IGFuZCB0ZXh0YXJlYS5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcmF3UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFRleHQodGV4dE5vZGUsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgdmFyIGlzRGlmZmVyZW50ID0gdGV4dE5vZGUubm9kZVZhbHVlICE9PSB0ZXh0O1xuICByZXR1cm4gaXNEaWZmZXJlbnQ7XG59XG5mdW5jdGlvbiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGNoaWxkKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIDwlcz4gaW4gPCVzPi4nLCBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGNoaWxkKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiB0aGUgdGV4dCBub2RlIFwiJXNcIiBpbiA8JXM+LicsIGNoaWxkLm5vZGVWYWx1ZSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHRhZywgcHJvcHMpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgPCVzPiBpbiA8JXM+LicsIHRhZywgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpIHtcbiAge1xuICAgIGlmICh0ZXh0ID09PSAnJykge1xuICAgICAgLy8gV2UgZXhwZWN0IHRvIGluc2VydCBlbXB0eSB0ZXh0IG5vZGVzIHNpbmNlIHRoZXkncmUgbm90IHJlcHJlc2VudGVkIGluXG4gICAgICAvLyB0aGUgSFRNTC5cbiAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIHNwZWNpYWwgY2FzZSBpZiB3ZSBjYW4ganVzdCBhdm9pZCBpbnNlcnRpbmcgZW1wdHlcbiAgICAgIC8vIHRleHQgbm9kZXMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyB0ZXh0IG5vZGUgZm9yIFwiJXNcIiBpbiA8JXM+LicsIHRleHQsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMyhkb21FbGVtZW50LCB0YWcsIHByb3BzKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG4gIH1cbn1cblxudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vIFRoaXMgdmFsaWRhdGlvbiBjb2RlIHdhcyB3cml0dGVuIGJhc2VkIG9uIHRoZSBIVE1MNSBwYXJzaW5nIHNwZWM6XG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG4gIC8vXG4gIC8vIE5vdGU6IHRoaXMgZG9lcyBub3QgY2F0Y2ggYWxsIGludmFsaWQgbmVzdGluZywgbm9yIGRvZXMgaXQgdHJ5IHRvIChhcyBpdCdzXG4gIC8vIG5vdCBjbGVhciB3aGF0IHByYWN0aWNhbCBiZW5lZml0IGRvaW5nIHNvIHByb3ZpZGVzKTsgaW5zdGVhZCwgd2Ugd2FybiBvbmx5XG4gIC8vIGZvciBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIHdpbGwgZ2l2ZSBhIHBhcnNlIHRyZWUgZGlmZmVyaW5nIGZyb20gd2hhdCBSZWFjdFxuICAvLyBpbnRlbmRlZC4gRm9yIGV4YW1wbGUsIDxiPjxkaXY+PC9kaXY+PC9iPiBpcyBpbnZhbGlkIGJ1dCB3ZSBkb24ndCB3YXJuXG4gIC8vIGJlY2F1c2UgaXQgc3RpbGwgcGFyc2VzIGNvcnJlY3RseTsgd2UgZG8gd2FybiBmb3Igb3RoZXIgY2FzZXMgbGlrZSBuZXN0ZWRcbiAgLy8gPHA+IHRhZ3Mgd2hlcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgaW1wbGljaXRseSBjbG9zZXMgdGhlXG4gIC8vIGZpcnN0LCBjYXVzaW5nIGEgY29uZnVzaW5nIG1lc3MuXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3NwZWNpYWxcbiAgdmFyIHNwZWNpYWxUYWdzID0gWydhZGRyZXNzJywgJ2FwcGxldCcsICdhcmVhJywgJ2FydGljbGUnLCAnYXNpZGUnLCAnYmFzZScsICdiYXNlZm9udCcsICdiZ3NvdW5kJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FwdGlvbicsICdjZW50ZXInLCAnY29sJywgJ2NvbGdyb3VwJywgJ2RkJywgJ2RldGFpbHMnLCAnZGlyJywgJ2RpdicsICdkbCcsICdkdCcsICdlbWJlZCcsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb290ZXInLCAnZm9ybScsICdmcmFtZScsICdmcmFtZXNldCcsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsICdoZWFkJywgJ2hlYWRlcicsICdoZ3JvdXAnLCAnaHInLCAnaHRtbCcsICdpZnJhbWUnLCAnaW1nJywgJ2lucHV0JywgJ2lzaW5kZXgnLCAnbGknLCAnbGluaycsICdsaXN0aW5nJywgJ21haW4nLCAnbWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGEnLCAnbmF2JywgJ25vZW1iZWQnLCAnbm9mcmFtZXMnLCAnbm9zY3JpcHQnLCAnb2JqZWN0JywgJ29sJywgJ3AnLCAncGFyYW0nLCAncGxhaW50ZXh0JywgJ3ByZScsICdzY3JpcHQnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc291cmNlJywgJ3N0eWxlJywgJ3N1bW1hcnknLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGl0bGUnLCAndHInLCAndHJhY2snLCAndWwnLCAnd2JyJywgJ3htcCddOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuXG4gIHZhciBpblNjb3BlVGFncyA9IFsnYXBwbGV0JywgJ2NhcHRpb24nLCAnaHRtbCcsICd0YWJsZScsICd0ZCcsICd0aCcsICdtYXJxdWVlJywgJ29iamVjdCcsICd0ZW1wbGF0ZScsIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2h0bWwtaW50ZWdyYXRpb24tcG9pbnRcbiAgLy8gVE9ETzogRGlzdGluZ3Vpc2ggYnkgbmFtZXNwYWNlIGhlcmUgLS0gZm9yIDx0aXRsZT4sIGluY2x1ZGluZyBpdCBoZXJlXG4gIC8vIGVycnMgb24gdGhlIHNpZGUgb2YgZmV3ZXIgd2FybmluZ3NcbiAgJ2ZvcmVpZ25PYmplY3QnLCAnZGVzYycsICd0aXRsZSddOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1idXR0b24tc2NvcGVcblxuICB2YXIgYnV0dG9uU2NvcGVUYWdzID0gaW5TY29wZVRhZ3MuY29uY2F0KFsnYnV0dG9uJ10pOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNnZW5lcmF0ZS1pbXBsaWVkLWVuZC10YWdzXG5cbiAgdmFyIGltcGxpZWRFbmRUYWdzID0gWydkZCcsICdkdCcsICdsaScsICdvcHRpb24nLCAnb3B0Z3JvdXAnLCAncCcsICdycCcsICdydCddO1xuICB2YXIgZW1wdHlBbmNlc3RvckluZm8gPSB7XG4gICAgY3VycmVudDogbnVsbCxcbiAgICBmb3JtVGFnOiBudWxsLFxuICAgIGFUYWdJblNjb3BlOiBudWxsLFxuICAgIGJ1dHRvblRhZ0luU2NvcGU6IG51bGwsXG4gICAgbm9iclRhZ0luU2NvcGU6IG51bGwsXG4gICAgcFRhZ0luQnV0dG9uU2NvcGU6IG51bGwsXG4gICAgbGlzdEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbCxcbiAgICBkbEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbFxuICB9O1xuXG4gIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAob2xkSW5mbywgdGFnKSB7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IGFzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbyk7XG5cbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHRhZzogdGFnXG4gICAgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7XG4gICAgfSAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFncyBpblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEgJiYgdGFnICE9PSAnYWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBhbmNlc3RvckluZm8uY3VycmVudCA9IGluZm87XG5cbiAgICBpZiAodGFnID09PSAnZm9ybScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbm9icicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnZGQnIHx8IHRhZyA9PT0gJ2R0Jykge1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JJbmZvO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGlzVGFnVmFsaWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7XG4gICAgLy8gRmlyc3QsIGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uXG4gICAgc3dpdGNoIChwYXJlbnRUYWcpIHtcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdFxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JztcblxuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcblxuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRkXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jYXB0aW9uXG4gICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yIHNpbmNlIHRoZXNlIHJ1bGVzIGZhbGwgYmFjayB0byBcImluIGJvZHlcIiBtb2RlIGZvclxuICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG5cbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGJvZHlcblxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNvbGdyb3VwXG5cbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcblxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY2FwdGlvbicgfHwgdGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5JyB8fCB0YWcgPT09ICd0Zm9vdCcgfHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmhlYWRcblxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudFxuXG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknIHx8IHRhZyA9PT0gJ2ZyYW1lc2V0JztcblxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnZnJhbWUnO1xuXG4gICAgICBjYXNlICcjZG9jdW1lbnQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaHRtbCc7XG4gICAgfSAvLyBQcm9iYWJseSBpbiB0aGUgXCJpbiBib2R5XCIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zXG4gICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyAhPT0gJ2gxJyAmJiBwYXJlbnRUYWcgIT09ICdoMicgJiYgcGFyZW50VGFnICE9PSAnaDMnICYmIHBhcmVudFRhZyAhPT0gJ2g0JyAmJiBwYXJlbnRUYWcgIT09ICdoNScgJiYgcGFyZW50VGFnICE9PSAnaDYnO1xuXG4gICAgICBjYXNlICdycCc6XG4gICAgICBjYXNlICdydCc6XG4gICAgICAgIHJldHVybiBpbXBsaWVkRW5kVGFncy5pbmRleE9mKHBhcmVudFRhZykgPT09IC0xO1xuXG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgY2FzZSAnY29sJzpcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0ZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICBjYXNlICd0aCc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIC8vIFRoZXNlIHRhZ3MgYXJlIG9ubHkgdmFsaWQgd2l0aCBhIGZldyBwYXJlbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIGNoaWxkXG4gICAgICAgIC8vIHBhcnNpbmcgcnVsZXMgLS0gaWYgd2UncmUgZG93biBoZXJlLCB0aGVuIG5vbmUgb2YgdGhvc2UgbWF0Y2hlZCBhbmRcbiAgICAgICAgLy8gc28gd2UgYWxsb3cgaXQgb25seSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHBhcmVudCBpcywgYXMgYWxsIG90aGVyXG4gICAgICAgIC8vIGNhc2VzIGFyZSBpbnZhbGlkLlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnID09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdhZGRyZXNzJzpcbiAgICAgIGNhc2UgJ2FydGljbGUnOlxuICAgICAgY2FzZSAnYXNpZGUnOlxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgY2FzZSAnZGlyJzpcbiAgICAgIGNhc2UgJ2Rpdic6XG4gICAgICBjYXNlICdkbCc6XG4gICAgICBjYXNlICdmaWVsZHNldCc6XG4gICAgICBjYXNlICdmaWdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2ZpZ3VyZSc6XG4gICAgICBjYXNlICdmb290ZXInOlxuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgIGNhc2UgJ2hncm91cCc6XG4gICAgICBjYXNlICdtYWluJzpcbiAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgY2FzZSAnbmF2JzpcbiAgICAgIGNhc2UgJ29sJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnc2VjdGlvbic6XG4gICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGNhc2UgJ3VsJzpcbiAgICAgIGNhc2UgJ3ByZSc6XG4gICAgICBjYXNlICdsaXN0aW5nJzpcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ3htcCc6XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmZvcm1UYWcgfHwgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdsaSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnZGQnOlxuICAgICAgY2FzZSAnZHQnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAvLyBTcGVjIHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBzb3VuZHNcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGlzIGNoZWNrLlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdub2JyJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICB2YXIgZGlkV2FybiQxID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICBpZiAoY2hpbGRUYWcgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJyk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGFnID0gJyN0ZXh0JztcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNoaWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87XG4gICAgdmFyIGludmFsaWRBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgPyBudWxsIDogZmluZEludmFsaWRBbmNlc3RvckZvclRhZyhjaGlsZFRhZywgYW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW52YWxpZFBhcmVudE9yQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50IHx8IGludmFsaWRBbmNlc3RvcjtcblxuICAgIGlmICghaW52YWxpZFBhcmVudE9yQW5jZXN0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYW5jZXN0b3JUYWcgPSBpbnZhbGlkUGFyZW50T3JBbmNlc3Rvci50YWc7XG4gICAgdmFyIHdhcm5LZXkgPSAhIWludmFsaWRQYXJlbnQgKyAnfCcgKyBjaGlsZFRhZyArICd8JyArIGFuY2VzdG9yVGFnO1xuXG4gICAgaWYgKGRpZFdhcm4kMVt3YXJuS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm4kMVt3YXJuS2V5XSA9IHRydWU7XG4gICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7XG4gICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7XG5cbiAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHtcbiAgICAgIGlmICgvXFxTLy50ZXN0KGNoaWxkVGV4dCkpIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnO1xuICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9IFwiIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gXCIgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyArICc+JztcbiAgICB9XG5cbiAgICBpZiAoaW52YWxpZFBhcmVudCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+LCA8dGhlYWQ+IG9yIDx0Zm9vdD4gdG8geW91ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nlci4nO1xuICAgICAgfVxuXG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxID0gJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZyc7XG52YXIgU1VTUEVOU0VfU1RBUlRfREFUQSA9ICckJztcbnZhciBTVVNQRU5TRV9FTkRfREFUQSA9ICcvJCc7XG52YXIgU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBID0gJyQ/JztcbnZhciBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBID0gJyQhJztcbnZhciBTVFlMRSQxID0gJ3N0eWxlJztcbnZhciBldmVudHNFbmFibGVkID0gbnVsbDtcbnZhciBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGw7XG5mdW5jdGlvbiBnZXRSb290SG9zdENvbnRleHQocm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gIHZhciB0eXBlO1xuICB2YXIgbmFtZXNwYWNlO1xuICB2YXIgbm9kZVR5cGUgPSByb290Q29udGFpbmVySW5zdGFuY2Uubm9kZVR5cGU7XG5cbiAgc3dpdGNoIChub2RlVHlwZSkge1xuICAgIGNhc2UgRE9DVU1FTlRfTk9ERTpcbiAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6XG4gICAgICB7XG4gICAgICAgIHR5cGUgPSBub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/ICcjZG9jdW1lbnQnIDogJyNmcmFnbWVudCc7XG4gICAgICAgIHZhciByb290ID0gcm9vdENvbnRhaW5lckluc3RhbmNlLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgbmFtZXNwYWNlID0gcm9vdCA/IHJvb3QubmFtZXNwYWNlVVJJIDogZ2V0Q2hpbGROYW1lc3BhY2UobnVsbCwgJycpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckluc3RhbmNlLnBhcmVudE5vZGUgOiByb290Q29udGFpbmVySW5zdGFuY2U7XG4gICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBjb250YWluZXIubmFtZXNwYWNlVVJJIHx8IG51bGw7XG4gICAgICAgIHR5cGUgPSBjb250YWluZXIudGFnTmFtZTtcbiAgICAgICAgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2Uob3duTmFtZXNwYWNlLCB0eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIHZhbGlkYXRlZFRhZyA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhudWxsLCB2YWxpZGF0ZWRUYWcpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgIGFuY2VzdG9ySW5mbzogYW5jZXN0b3JJbmZvXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGRIb3N0Q29udGV4dChwYXJlbnRIb3N0Q29udGV4dCwgdHlwZSwgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gIHtcbiAgICB2YXIgcGFyZW50SG9zdENvbnRleHREZXYgPSBwYXJlbnRIb3N0Q29udGV4dDtcbiAgICB2YXIgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2UocGFyZW50SG9zdENvbnRleHREZXYubmFtZXNwYWNlLCB0eXBlKTtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhwYXJlbnRIb3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgIGFuY2VzdG9ySW5mbzogYW5jZXN0b3JJbmZvXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gcHJlcGFyZUZvckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIGV2ZW50c0VuYWJsZWQgPSBpc0VuYWJsZWQoKTtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpO1xuICB2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsO1xuXG4gIHNldEVuYWJsZWQoZmFsc2UpO1xuICByZXR1cm4gYWN0aXZlSW5zdGFuY2U7XG59XG5mdW5jdGlvbiByZXNldEFmdGVyQ29tbWl0KGNvbnRhaW5lckluZm8pIHtcbiAgcmVzdG9yZVNlbGVjdGlvbihzZWxlY3Rpb25JbmZvcm1hdGlvbik7XG4gIHNldEVuYWJsZWQoZXZlbnRzRW5hYmxlZCk7XG4gIGV2ZW50c0VuYWJsZWQgPSBudWxsO1xuICBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGw7XG59XG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZSh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICAvLyBUT0RPOiB0YWtlIG5hbWVzcGFjZSBpbnRvIGFjY291bnQgd2hlbiB2YWxpZGF0aW5nLlxuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyh0eXBlLCBudWxsLCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgcHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG5cbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH1cblxuICB2YXIgZG9tRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgcGFyZW50TmFtZXNwYWNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgZG9tRWxlbWVudCk7XG4gIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpO1xuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAgc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICByZXR1cm4gISFwcm9wcy5hdXRvRm9jdXM7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlVXBkYXRlKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG5cbiAgICBpZiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuICE9PSB0eXBlb2Ygb2xkUHJvcHMuY2hpbGRyZW4gJiYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIG5ld1Byb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcm9wcykge1xuICByZXR1cm4gdHlwZSA9PT0gJ3RleHRhcmVhJyB8fCB0eXBlID09PSAnbm9zY3JpcHQnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSBudWxsICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCAhPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCB0ZXh0LCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuICB9XG5cbiAgdmFyIHRleHROb2RlID0gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dE5vZGUpO1xuICByZXR1cm4gdGV4dE5vZGU7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSgpIHtcbiAgdmFyIGN1cnJlbnRFdmVudCA9IHdpbmRvdy5ldmVudDtcblxuICBpZiAoY3VycmVudEV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICByZXR1cm4gZ2V0RXZlbnRQcmlvcml0eShjdXJyZW50RXZlbnQudHlwZSk7XG59XG4vLyBpZiBhIGNvbXBvbmVudCBqdXN0IGltcG9ydHMgUmVhY3RET00gKGUuZy4gZm9yIGZpbmRET01Ob2RlKS5cbi8vIFNvbWUgZW52aXJvbm1lbnRzIG1pZ2h0IG5vdCBoYXZlIHNldFRpbWVvdXQgb3IgY2xlYXJUaW1lb3V0LlxuXG52YXIgc2NoZWR1bGVUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIGNhbmNlbFRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIG5vVGltZW91dCA9IC0xO1xudmFyIGxvY2FsUHJvbWlzZSA9IHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nID8gUHJvbWlzZSA6IHVuZGVmaW5lZDsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIHNjaGVkdWxlTWljcm90YXNrID0gdHlwZW9mIHF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nID8gcXVldWVNaWNyb3Rhc2sgOiB0eXBlb2YgbG9jYWxQcm9taXNlICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICByZXR1cm4gbG9jYWxQcm9taXNlLnJlc29sdmUobnVsbCkudGhlbihjYWxsYmFjaykuY2F0Y2goaGFuZGxlRXJyb3JJbk5leHRUaWNrKTtcbn0gOiBzY2hlZHVsZVRpbWVvdXQ7IC8vIFRPRE86IERldGVybWluZSB0aGUgYmVzdCBmYWxsYmFjayBoZXJlLlxuXG5mdW5jdGlvbiBoYW5kbGVFcnJvckluTmV4dFRpY2soZXJyb3IpIHtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBEZXNwaXRlIHRoZSBuYW1pbmcgdGhhdCBtaWdodCBpbXBseSBvdGhlcndpc2UsIHRoaXMgbWV0aG9kIG9ubHlcbiAgLy8gZmlyZXMgaWYgdGhlcmUgaXMgYW4gYFVwZGF0ZWAgZWZmZWN0IHNjaGVkdWxlZCBkdXJpbmcgbW91bnRpbmcuXG4gIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdFxuICAvLyBkb2VzIHRvIGltcGxlbWVudCB0aGUgYGF1dG9Gb2N1c2AgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQpLiBCdXRcbiAgLy8gdGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbiAoc3VjaCBhcyBwYXRjaGluZ1xuICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaWYgKG5ld1Byb3BzLmF1dG9Gb2N1cykge1xuICAgICAgICBkb21FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgICB7XG4gICAgICAgIGlmIChuZXdQcm9wcy5zcmMpIHtcbiAgICAgICAgICBkb21FbGVtZW50LnNyYyA9IG5ld1Byb3BzLnNyYztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBBcHBseSB0aGUgZGlmZiB0byB0aGUgRE9NIG5vZGUuXG4gIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTsgLy8gVXBkYXRlIHRoZSBwcm9wcyBoYW5kbGUgc28gdGhhdCB3ZSBrbm93IHdoaWNoIHByb3BzIGFyZSB0aGUgb25lcyB3aXRoXG4gIC8vIHdpdGggY3VycmVudCBldmVudCBoYW5kbGVycy5cblxuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCkge1xuICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyk7XG59XG5mdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gbmV3VGV4dDtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgdmFyIHBhcmVudE5vZGU7XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXI7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH0gLy8gVGhpcyBjb250YWluZXIgbWlnaHQgYmUgdXNlZCBmb3IgYSBwb3J0YWwuXG4gIC8vIElmIHNvbWV0aGluZyBpbnNpZGUgYSBwb3J0YWwgaXMgY2xpY2tlZCwgdGhhdCBjbGljayBzaG91bGQgYnViYmxlXG4gIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkXG4gIC8vIG5ldmVyIGJ1YmJsZSB0aHJvdWdoIHRoZSAqRE9NKiB0cmVlIHVubGVzcyBhbiBhbmNlc3RvciB3aXRoIG9uY2xpY2tcbiAgLy8gZXZlbnQgZXhpc3RzLiBTbyB3ZSB3b3VsZG4ndCBzZWUgaXQgYW5kIGRpc3BhdGNoIGl0LlxuICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2tcbiAgLy8gZGVmaW5lZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTkxOFxuXG5cbiAgdmFyIHJlYWN0Um9vdENvbnRhaW5lciA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gIGlmICgocmVhY3RSb290Q29udGFpbmVyID09PSBudWxsIHx8IHJlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSAmJiBwYXJlbnROb2RlLm9uY2xpY2sgPT09IG51bGwpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50SW5zdGFuY2UsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbn1cbmZ1bmN0aW9uIGluc2VydEluQ29udGFpbmVyQmVmb3JlKGNvbnRhaW5lciwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShwYXJlbnRJbnN0YW5jZSwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHN1c3BlbnNlSW5zdGFuY2U7IC8vIERlbGV0ZSBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgZG8ge1xuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobm9kZSk7XG5cbiAgICBpZiAobmV4dE5vZGUgJiYgbmV4dE5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBuZXh0Tm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobmV4dE5vZGUpOyAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cbiAgICAgICAgICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbmV4dE5vZGU7XG4gIH0gd2hpbGUgKG5vZGUpOyAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnlGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY29udGFpbmVyLnBhcmVudE5vZGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSk7XG4gIH0gLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gaGlkZUluc3RhbmNlKGluc3RhbmNlKSB7XG4gIC8vIFRPRE86IERvZXMgdGhpcyB3b3JrIGZvciBhbGwgZWxlbWVudCB0eXBlcz8gV2hhdCBhYm91dCBNYXRoTUw/IFNob3VsZCB3ZVxuICAvLyBwYXNzIGhvc3QgY29udGV4dCB0byB0aGlzIG1ldGhvZD9cbiAgaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgdmFyIHN0eWxlID0gaW5zdGFuY2Uuc3R5bGU7XG5cbiAgaWYgKHR5cGVvZiBzdHlsZS5zZXRQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7XG4gIH0gZWxzZSB7XG4gICAgc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuZnVuY3Rpb24gaGlkZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9ICcnO1xufVxuZnVuY3Rpb24gdW5oaWRlSW5zdGFuY2UoaW5zdGFuY2UsIHByb3BzKSB7XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZVByb3AgPSBwcm9wc1tTVFlMRSQxXTtcbiAgdmFyIGRpc3BsYXkgPSBzdHlsZVByb3AgIT09IHVuZGVmaW5lZCAmJiBzdHlsZVByb3AgIT09IG51bGwgJiYgc3R5bGVQcm9wLmhhc093blByb3BlcnR5KCdkaXNwbGF5JykgPyBzdHlsZVByb3AuZGlzcGxheSA6IG51bGw7XG4gIGluc3RhbmNlLnN0eWxlLmRpc3BsYXkgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKCdkaXNwbGF5JywgZGlzcGxheSk7XG59XG5mdW5jdGlvbiB1bmhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0KSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSB0ZXh0O1xufVxuZnVuY3Rpb24gY2xlYXJDb250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci50ZXh0Q29udGVudCA9ICcnO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIGlmIChjb250YWluZXIuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICE9PSBFTEVNRU5UX05PREUgfHwgdHlwZS50b0xvd2VyQ2FzZSgpICE9PSBpbnN0YW5jZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhbiBlbGVtZW50IG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKGluc3RhbmNlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSAnJyB8fCBpbnN0YW5jZS5ub2RlVHlwZSAhPT0gVEVYVF9OT0RFKSB7XG4gICAgLy8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IHBhcnNlZCBieSBIVE1MIHNvIHRoZXJlIHdvbid0IGJlIGEgY29ycmVjdCBtYXRjaCBoZXJlLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYSB0ZXh0IG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgc3VzcGVuc2Ugbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrRXJyb3JEZXRhaWxzKGluc3RhbmNlKSB7XG4gIHZhciBkYXRhc2V0ID0gaW5zdGFuY2UubmV4dFNpYmxpbmcgJiYgaW5zdGFuY2UubmV4dFNpYmxpbmcuZGF0YXNldDtcbiAgdmFyIGRpZ2VzdCwgbWVzc2FnZSwgc3RhY2s7XG5cbiAgaWYgKGRhdGFzZXQpIHtcbiAgICBkaWdlc3QgPSBkYXRhc2V0LmRnc3Q7XG5cbiAgICB7XG4gICAgICBtZXNzYWdlID0gZGF0YXNldC5tc2c7XG4gICAgICBzdGFjayA9IGRhdGFzZXQuc3RjaztcbiAgICB9XG4gIH1cblxuICB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICBkaWdlc3Q6IGRpZ2VzdCxcbiAgICAgIHN0YWNrOiBzdGFja1xuICAgIH07XG4gIH0gLy8gbGV0IHZhbHVlID0ge21lc3NhZ2U6IHVuZGVmaW5lZCwgaGFzaDogdW5kZWZpbmVkfTtcbiAgLy8gY29uc3QgbmV4dFNpYmxpbmcgPSBpbnN0YW5jZS5uZXh0U2libGluZztcbiAgLy8gaWYgKG5leHRTaWJsaW5nKSB7XG4gIC8vICAgY29uc3QgZGF0YXNldCA9ICgobmV4dFNpYmxpbmc6IGFueSk6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpLmRhdGFzZXQ7XG4gIC8vICAgdmFsdWUubWVzc2FnZSA9IGRhdGFzZXQubXNnO1xuICAvLyAgIHZhbHVlLmhhc2ggPSBkYXRhc2V0Lmhhc2g7XG4gIC8vICAgaWYgKHRydWUpIHtcbiAgLy8gICAgIHZhbHVlLnN0YWNrID0gZGF0YXNldC5zdGFjaztcbiAgLy8gICB9XG4gIC8vIH1cbiAgLy8gcmV0dXJuIHZhbHVlO1xuXG59XG5mdW5jdGlvbiByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShpbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgaW5zdGFuY2UuX3JlYWN0UmV0cnkgPSBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGUobm9kZSkge1xuICAvLyBTa2lwIG5vbi1oeWRyYXRhYmxlIG5vZGVzLlxuICBmb3IgKDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5uZXh0U2libGluZykge1xuICAgIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIG5vZGVEYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAobm9kZURhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShpbnN0YW5jZS5uZXh0U2libGluZyk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcbn1cbmZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50c1xuICAvLyBnZXQgYXR0YWNoZWQuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH0gLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpOyAvLyBUT0RPOiBUZW1wb3JhcnkgaGFjayB0byBjaGVjayBpZiB3ZSdyZSBpbiBhIGNvbmN1cnJlbnQgcm9vdC4gV2UgY2FuIGRlbGV0ZVxuICAvLyB3aGVuIHRoZSBsZWdhY3kgcm9vdCBBUEkgaXMgcmVtb3ZlZC5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlLm5leHRTaWJsaW5nOyAvLyBTa2lwIHBhc3QgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBub2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICB9IC8vIFRPRE86IFdhcm4sIHdlIGRpZG4ndCBmaW5kIHRoZSBlbmQgY29tbWVudCBib3VuZGFyeS5cblxuXG4gIHJldHVybiBudWxsO1xufSAvLyBSZXR1cm5zIHRoZSBTdXNwZW5zZUluc3RhbmNlIGlmIHRoaXMgbm9kZSBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhXG4vLyBTdXNwZW5zZUluc3RhbmNlLiBJLmUuIGlmIGl0cyBwcmV2aW91cyBzaWJsaW5nIGlzIGEgQ29tbWVudCB3aXRoXG4vLyBTVVNQRU5TRV94X1NUQVJUX0RBVEEuIE90aGVyd2lzZSwgbnVsbC5cblxuZnVuY3Rpb24gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXRJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHRhcmdldEluc3RhbmNlLnByZXZpb3VzU2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZENvbnRhaW5lcihjb250YWluZXIpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkge1xuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhwYXJlbnRUeXBlKSB7XG4gIHJldHVybiBwYXJlbnRUeXBlICE9PSAnaGVhZCcgJiYgcGFyZW50VHlwZSAhPT0gJ2JvZHknO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB2YXIgc2hvdWxkV2FybkRldiA9IHRydWU7XG4gIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgaWYgKHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuXG4gICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIGluc3RhbmNlLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHRleHQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAge1xuICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50SW5zdGFuY2UsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudEluc3RhbmNlLCB0ZXh0KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHBhcmVudENvbnRhaW5lcikge1xuICB7XG4gICAgLy8gVE9ETzogVGhpcyBnZXRzIGxvZ2dlZCBieSBvblJlY292ZXJhYmxlRXJyb3IsIHRvbywgc28gd2Ugc2hvdWxkIGJlXG4gICAgLy8gYWJsZSB0byByZW1vdmUgaXQuXG4gICAgZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24uIFRoZSBzZXJ2ZXIgSFRNTCB3YXMgcmVwbGFjZWQgd2l0aCBjbGllbnQgY29udGVudCBpbiA8JXM+LicsIHBhcmVudENvbnRhaW5lci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVBvcnRhbE1vdW50KHBvcnRhbEluc3RhbmNlKSB7XG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHBvcnRhbEluc3RhbmNlKTtcbn1cblxudmFyIHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xudmFyIGludGVybmFsSW5zdGFuY2VLZXkgPSAnX19yZWFjdEZpYmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxQcm9wc0tleSA9ICdfX3JlYWN0UHJvcHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5ID0gJ19fcmVhY3RDb250YWluZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXkgPSAnX19yZWFjdEV2ZW50cyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5ID0gJ19fcmVhY3RMaXN0ZW5lcnMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleSA9ICdfX3JlYWN0SGFuZGxlcyQnICsgcmFuZG9tS2V5O1xuZnVuY3Rpb24gZGV0YWNoRGVsZXRlZEluc3RhbmNlKG5vZGUpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBvbiBob3N0IGNvbXBvbmVudHMuIEkgZG9uJ3QgdGhpbmsgYWxsIG9mXG4gIC8vIHRoZXNlIGZpZWxkcyBhcmUgcmVsZXZhbnQuXG4gIGRlbGV0ZSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbFByb3BzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleV07XG59XG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5mdW5jdGlvbiBtYXJrQ29udGFpbmVyQXNSb290KGhvc3RSb290LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBob3N0Um9vdDtcbn1cbmZ1bmN0aW9uIHVubWFya0NvbnRhaW5lckFzUm9vdChub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xufVxuZnVuY3Rpb24gaXNDb250YWluZXJNYXJrZWRBc1Jvb3Qobm9kZSkge1xuICByZXR1cm4gISFub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xufSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci5cbi8vIElmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgaHlkcmF0ZWQgb3Igbm90IHlldCByZW5kZXJlZCBzdWJ0cmVlLCB0aGVuXG4vLyB0aGlzIG1heSBhbHNvIHJldHVybiBhIFN1c3BlbnNlQ29tcG9uZW50IG9yIEhvc3RSb290IHRvIGluZGljYXRlIHRoYXQuXG4vLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3Vcbi8vIHBhc3MgdGhlIENvbnRhaW5lciBub2RlIGFzIHRoZSB0YXJnZXROb2RlLCB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgZ2V0IHRoZVxuLy8gSG9zdFJvb3QgYmFjay4gVG8gZ2V0IHRvIHRoZSBIb3N0Um9vdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNoaWxkIG9mIGl0LlxuLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLlxuXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICBpZiAodGFyZ2V0SW5zdCkge1xuICAgIC8vIERvbid0IHJldHVybiBIb3N0Um9vdCBvciBTdXNwZW5zZUNvbXBvbmVudCBoZXJlLlxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9IC8vIElmIHRoZSBkaXJlY3QgZXZlbnQgdGFyZ2V0IGlzbid0IGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUsIHdlIG5lZWQgdG8gbG9va1xuICAvLyB0byBzZWUgaWYgb25lIG9mIGl0cyBwYXJlbnRzIGlzIGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUuXG5cblxuICB2YXIgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgIC8vIFdlJ2xsIGNoZWNrIGlmIHRoaXMgaXMgYSBjb250YWluZXIgcm9vdCB0aGF0IGNvdWxkIGluY2x1ZGVcbiAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGlmIHdlJ3JlIGEgY2hpbGQgb2YgYSBkZWh5ZHJhdGVkIGNvbnRhaW5lciwgd2UgbmVlZCB0byBmaXJzdFxuICAgIC8vIGZpbmQgdGhhdCBpbm5lciBjb250YWluZXIgYmVmb3JlIG1vdmluZyBvbiB0byBmaW5kaW5nIHRoZSBwYXJlbnRcbiAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlXG4gICAgLy8gaXRzZWxmIGJlY2F1c2UgdGhlIGZpYmVycyBhcmUgY29uY2VwdHVhbGx5IGJldHdlZW4gdGhlIGNvbnRhaW5lclxuICAgIC8vIG5vZGUgYW5kIHRoZSBmaXJzdCBjaGlsZC4gSXQgaXNuJ3Qgc3Vycm91bmRpbmcgdGhlIGNvbnRhaW5lciBub2RlLlxuICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLlxuICAgIHRhcmdldEluc3QgPSBwYXJlbnROb2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldIHx8IHBhcmVudE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICBpZiAodGFyZ2V0SW5zdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyB3YXNuJ3QgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlIGV2ZW50LCB3ZSBtaWdodCBoYXZlXG4gICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZFxuICAgICAgLy8gYWxzbyBoYXZlIGJlZW4gbm9uLVJlYWN0IG5vZGVzLiBXZSBuZWVkIHRvIGFuc3dlciB3aGljaCBvbmUuXG4gICAgICAvLyBJZiB3ZSB0aGUgaW5zdGFuY2UgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiwgdGhlbiB0aGVyZSBjYW4ndCBiZVxuICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0XG4gICAgICAvLyBiYWlsb3V0LiBNb3N0IG9mIHRoZSB0aW1lLCB3aGVuIHBlb3BsZSBhZGQgbm9uLVJlYWN0IGNoaWxkcmVuIHRvXG4gICAgICAvLyB0aGUgdHJlZSwgaXQgaXMgdXNpbmcgYSByZWYgdG8gYSBjaGlsZC1sZXNzIERPTSBub2RlLlxuICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdFxuICAgICAgLy8gaGFzIGV2ZXIgZ29uZSBmcm9tIGhhdmluZyBjaGlsZHJlbiB0byBkZWxldGluZyB0aGVtIG9yIHZpY2UgdmVyc2FcbiAgICAgIC8vIGl0IHdvdWxkIGhhdmUgZGVsZXRlZCB0aGUgZGVoeWRyYXRlZCBib3VuZGFyeSBuZXN0ZWQgaW5zaWRlIGFscmVhZHkuXG4gICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodFxuICAgICAgLy8gaGF2ZSBvbmUgb24gdGhlIGFsdGVybmF0ZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGluIGNhc2UgdGhpcyB3YXMgYVxuICAgICAgLy8gcm9vdC5cbiAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBOZXh0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgbm9kZSB0aGF0IHNraXBwZWQgcGFzdCBpc1xuICAgICAgICAvLyBuZXN0ZWQgd2l0aGluIGEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbmQgaWYgc28sIHdoaWNoIG9uZS5cbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgZm91bmQgYSBzdXNwZW5zZSBpbnN0YW5jZS4gVGhhdCBtZWFucyB0aGF0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAvLyBoeWRyYXRlZCBpdCB5ZXQuIEV2ZW4gdGhvdWdoIHdlIGxlYXZlIHRoZSBjb21tZW50cyBpbiB0aGVcbiAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTVxuICAgICAgICAgIC8vIHRoYXQgY291bGQgYWxyZWFkeSBiZSBoeWRyYXRlZCwgd2Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGVtXG4gICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIHBhc3Mgc2luY2UgaWYgdGhlIHRhcmdldCBpcyBoeWRyYXRlZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuXG4gICAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBmaWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN1c3BlbnNlQ29tcG9uZW50XG4gICAgICAgICAgLy8gYXMgdGhlIGRlZXBlc3QgaW5zdGFuY2UuXG4gICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3VzcGVuc2VJbnN0O1xuICAgICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgZmluZCBhIEZpYmVyIG9uIHRoZSBjb21tZW50LCBpdCBtaWdodCBiZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGFcbiAgICAgICAgICAvLyBwYXJlbnQgYm91bmRhcnkgdGhhdCBoYXNuJ3QgYWJvdmUgdGhpcyBvbmUgc28gd2UgbmVlZCB0byBmaW5kXG4gICAgICAgICAgLy8gdGhlIG91dGVyIG1vc3QgdGhhdCBpcyBrbm93bi5cblxuXG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7IC8vIElmIHdlIGRvbid0IGZpbmQgb25lLCB0aGVuIHRoYXQgc2hvdWxkIG1lYW4gdGhhdCB0aGUgcGFyZW50XG4gICAgICAgICAgLy8gaG9zdCBjb21wb25lbnQgYWxzbyBoYXNuJ3QgaHlkcmF0ZWQgeWV0LiBXZSBjYW4gcmV0dXJuIGl0XG4gICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG5cbiAgaWYgKGluc3QpIHtcbiAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKCdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpO1xufVxuZnVuY3Rpb24gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVGaWJlclByb3BzKG5vZGUsIHByb3BzKSB7XG4gIG5vZGVbaW50ZXJuYWxQcm9wc0tleV0gPSBwcm9wcztcbn1cbmZ1bmN0aW9uIGdldEV2ZW50TGlzdGVuZXJTZXQobm9kZSkge1xuICB2YXIgZWxlbWVudExpc3RlbmVyU2V0ID0gbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldO1xuXG4gIGlmIChlbGVtZW50TGlzdGVuZXJTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XSA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50TGlzdGVuZXJTZXQ7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbHVlU3RhY2sgPSBbXTtcbnZhciBmaWJlclN0YWNrO1xuXG57XG4gIGZpYmVyU3RhY2sgPSBbXTtcbn1cblxudmFyIGluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNyZWF0ZUN1cnNvcihkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiBkZWZhdWx0VmFsdWVcbiAgfTtcbn1cblxuZnVuY3Rpb24gcG9wKGN1cnNvciwgZmliZXIpIHtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHBvcC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKGZpYmVyICE9PSBmaWJlclN0YWNrW2luZGV4XSkge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgRmliZXIgcG9wcGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleF07XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gbnVsbDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBudWxsO1xuICB9XG5cbiAgaW5kZXgtLTtcbn1cblxuZnVuY3Rpb24gcHVzaChjdXJzb3IsIHZhbHVlLCBmaWJlcikge1xuICBpbmRleCsrO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IGN1cnNvci5jdXJyZW50O1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IGZpYmVyO1xuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZTtcbn1cblxudmFyIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dDtcblxue1xuICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQgPSB7fTtcbn1cblxudmFyIGVtcHR5Q29udGV4dE9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlDb250ZXh0T2JqZWN0KTtcbn0gLy8gQSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgbWVyZ2VkIGNvbnRleHQgb2JqZWN0IG9uIHRoZSBzdGFjay5cblxuXG52YXIgY29udGV4dFN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGVtcHR5Q29udGV4dE9iamVjdCk7IC8vIEEgY3Vyc29yIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQuXG5cbnZhciBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGZhbHNlKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgY29udGV4dCBvYmplY3QgdGhhdCB3YXMgb24gdGhlIHN0YWNrLlxuLy8gV2UgdXNlIHRoaXMgdG8gZ2V0IGFjY2VzcyB0byB0aGUgcGFyZW50IGNvbnRleHQgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5XG4vLyBwdXNoZWQgdGhlIG5leHQgY29udGV4dCBwcm92aWRlciwgYW5kIG5vdyBuZWVkIHRvIG1lcmdlIHRoZWlyIGNvbnRleHRzLlxuXG52YXIgcHJldmlvdXNDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG5mdW5jdGlvbiBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyKSB7XG4gIHtcbiAgICBpZiAoZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyICYmIGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIC8vIElmIHRoZSBmaWJlciBpcyBhIGNvbnRleHQgcHJvdmlkZXIgaXRzZWxmLCB3aGVuIHdlIHJlYWQgaXRzIGNvbnRleHRcbiAgICAgIC8vIHdlIG1heSBoYXZlIGFscmVhZHkgcHVzaGVkIGl0cyBvd24gY2hpbGQgY29udGV4dCBvbiB0aGUgc3RhY2suIEEgY29udGV4dFxuICAgICAgLy8gcHJvdmlkZXIgc2hvdWxkIG5vdCBcInNlZVwiIGl0cyBvd24gY2hpbGQgY29udGV4dC4gVGhlcmVmb3JlIHdlIHJlYWQgdGhlXG4gICAgICAvLyBwcmV2aW91cyAocGFyZW50KSBjb250ZXh0IGluc3RlYWQgZm9yIGEgY29udGV4dCBwcm92aWRlci5cbiAgICAgIHJldHVybiBwcmV2aW91c0NvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBtYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9IHVubWFza2VkQ29udGV4dDtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dCA9IG1hc2tlZENvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IHR5cGUuY29udGV4dFR5cGVzO1xuXG4gICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gICAgfSAvLyBBdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyB1bm1hc2tlZCBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuICAgIC8vIEZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBjYWxscyB0byBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLlxuICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaW5maW5pdGUgbG9vcHMgaWYgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBjYWxscyBzZXRTdGF0ZS5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPT09IHVubWFza2VkQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjb250ZXh0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dFR5cGVzKSB7XG4gICAgICBjb250ZXh0W2tleV0gPSB1bm1hc2tlZENvbnRleHRba2V5XTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNvbnRleHRUeXBlcywgY29udGV4dCwgJ2NvbnRleHQnLCBuYW1lKTtcbiAgICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgICAvLyBDb250ZXh0IGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjbGFzcyBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkIHNvIGNoZWNrIGZvciBpbnN0YW5jZS5cblxuXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzQ29udGV4dENoYW5nZWQoKSB7XG4gIHtcbiAgICByZXR1cm4gZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKHR5cGUpIHtcbiAge1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG4gICAgcmV0dXJuIGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyLCBjb250ZXh0LCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIGlmIChjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZW1wdHlDb250ZXh0T2JqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29udGV4dCBmb3VuZCBvbiBzdGFjay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBjb250ZXh0LCBmaWJlcik7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCB0eXBlLCBwYXJlbnRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlczsgLy8gVE9ETyAoYnZhdWdobikgUmVwbGFjZSB0aGlzIGJlaGF2aW9yIHdpdGggYW4gaW52YXJpYW50KCkgaW4gdGhlIGZ1dHVyZS5cbiAgICAvLyBJdCBoYXMgb25seSBiZWVuIGFkZGVkIGluIEZpYmVyIHRvIG1hdGNoIHRoZSAodW5pbnRlbnRpb25hbCkgYmVoYXZpb3IgaW4gU3RhY2suXG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuICAgICAgY2hlY2tQcm9wVHlwZXMoY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkIGNvbnRleHQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCFpc0ZpYmVyTW91bnRlZChmaWJlcikgfHwgZmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBzdWJ0cmVlIHBhcmVudCB0byBiZSBhIG1vdW50ZWQgY2xhc3MgY29tcG9uZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIGRvIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuY29udGV4dDtcblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBDb21wb25lbnQgPSBub2RlLnR5cGU7XG5cbiAgICAgICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVuZXhwZWN0ZWQgZGV0YWNoZWQgc3VidHJlZSBwYXJlbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQ29uY3VycmVudFJvb3QgPSAxO1xuXG52YXIgc3luY1F1ZXVlID0gbnVsbDtcbnZhciBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSBmYWxzZTtcbnZhciBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG5mdW5jdGlvbiBzY2hlZHVsZVN5bmNDYWxsYmFjayhjYWxsYmFjaykge1xuICAvLyBQdXNoIHRoaXMgY2FsbGJhY2sgaW50byBhbiBpbnRlcm5hbCBxdWV1ZS4gV2UnbGwgZmx1c2ggdGhlc2UgZWl0aGVyIGluXG4gIC8vIHRoZSBuZXh0IHRpY2ssIG9yIGVhcmxpZXIgaWYgc29tZXRoaW5nIGNhbGxzIGBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlYC5cbiAgaWYgKHN5bmNRdWV1ZSA9PT0gbnVsbCkge1xuICAgIHN5bmNRdWV1ZSA9IFtjYWxsYmFja107XG4gIH0gZWxzZSB7XG4gICAgLy8gUHVzaCBvbnRvIGV4aXN0aW5nIHF1ZXVlLiBEb24ndCBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2sgYmVjYXVzZVxuICAgIC8vIHdlIGFscmVhZHkgc2NoZWR1bGVkIG9uZSB3aGVuIHdlIGNyZWF0ZWQgdGhlIHF1ZXVlLlxuICAgIHN5bmNRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVMZWdhY3lTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpIHtcbiAgLy8gT25seSBmbHVzaGVzIHRoZSBxdWV1ZSBpZiB0aGVyZSdzIGEgbGVnYWN5IHN5bmMgY2FsbGJhY2sgc2NoZWR1bGVkLlxuICAvLyBUT0RPOiBUaGVyZSdzIG9ubHkgYSBzaW5nbGUgdHlwZSBvZiBjYWxsYmFjazogcGVyZm9ybVN5bmNPbldvcmtPblJvb3QuIFNvXG4gIC8vIGl0IG1pZ2h0IG1ha2UgbW9yZSBzZW5zZSBmb3IgdGhlIHF1ZXVlIHRvIGJlIGEgbGlzdCBvZiByb290cyBpbnN0ZWFkIG9mIGFcbiAgLy8gbGlzdCBvZiBnZW5lcmljIGNhbGxiYWNrcy4gVGhlbiB3ZSBjYW4gaGF2ZSB0d286IG9uZSBmb3IgbGVnYWN5IHJvb3RzLCBvbmVcbiAgLy8gZm9yIGNvbmN1cnJlbnQgcm9vdHMuIEFuZCB0aGlzIG1ldGhvZCB3b3VsZCBvbmx5IGZsdXNoIHRoZSBsZWdhY3kgb25lcy5cbiAgaWYgKGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcykge1xuICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja3MoKSB7XG4gIGlmICghaXNGbHVzaGluZ1N5bmNRdWV1ZSAmJiBzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSB0cnVlO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcHJldmlvdXNVcGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc1N5bmMgPSB0cnVlO1xuICAgICAgdmFyIHF1ZXVlID0gc3luY1F1ZXVlOyAvLyBUT0RPOiBJcyB0aGlzIG5lY2Vzc2FyeSBhbnltb3JlPyBUaGUgb25seSB1c2VyIGNvZGUgdGhhdCBydW5zIGluIHRoaXNcbiAgICAgIC8vIHF1ZXVlIGlzIGluIHRoZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlcy5cblxuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2soaXNTeW5jKTtcbiAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgfVxuXG4gICAgICBzeW5jUXVldWUgPSBudWxsO1xuICAgICAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgIGlmIChzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgc3luY1F1ZXVlID0gc3luY1F1ZXVlLnNsaWNlKGkgKyAxKTtcbiAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2tcblxuXG4gICAgICBzY2hlZHVsZUNhbGxiYWNrKEltbWVkaWF0ZVByaW9yaXR5LCBmbHVzaFN5bmNDYWxsYmFja3MpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZVByaW9yaXR5KTtcbiAgICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVE9ETzogVXNlIHRoZSB1bmlmaWVkIGZpYmVyIHN0YWNrIG1vZHVsZSBpbnN0ZWFkIG9mIHRoaXMgbG9jYWwgb25lP1xuLy8gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgaXQgeWV0IHRvIGRlcmlzayB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgYmVjYXVzZVxuLy8gdGhlIHdheSB3ZSBwdXNoL3BvcCB0aGVzZSB2YWx1ZXMgaXMgYSBiaXQgdW51c3VhbC4gSWYgdGhlcmUncyBhIG1pc3Rha2UsIEknZFxuLy8gcmF0aGVyIHRoZSBpZHMgYmUgd3JvbmcgdGhhbiBjcmFzaCB0aGUgd2hvbGUgcmVjb25jaWxlci5cbnZhciBmb3JrU3RhY2sgPSBbXTtcbnZhciBmb3JrU3RhY2tJbmRleCA9IDA7XG52YXIgdHJlZUZvcmtQcm92aWRlciA9IG51bGw7XG52YXIgdHJlZUZvcmtDb3VudCA9IDA7XG52YXIgaWRTdGFjayA9IFtdO1xudmFyIGlkU3RhY2tJbmRleCA9IDA7XG52YXIgdHJlZUNvbnRleHRQcm92aWRlciA9IG51bGw7XG52YXIgdHJlZUNvbnRleHRJZCA9IDE7XG52YXIgdHJlZUNvbnRleHRPdmVyZmxvdyA9ICcnO1xuZnVuY3Rpb24gaXNGb3JrZWRDaGlsZCh3b3JrSW5Qcm9ncmVzcykge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmtlZCkgIT09IE5vRmxhZ3M7XG59XG5mdW5jdGlvbiBnZXRGb3Jrc0F0TGV2ZWwod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiB0cmVlRm9ya0NvdW50O1xufVxuZnVuY3Rpb24gZ2V0VHJlZUlkKCkge1xuICB2YXIgb3ZlcmZsb3cgPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICB2YXIgaWRXaXRoTGVhZGluZ0JpdCA9IHRyZWVDb250ZXh0SWQ7XG4gIHZhciBpZCA9IGlkV2l0aExlYWRpbmdCaXQgJiB+Z2V0TGVhZGluZ0JpdChpZFdpdGhMZWFkaW5nQml0KTtcbiAgcmV0dXJuIGlkLnRvU3RyaW5nKDMyKSArIG92ZXJmbG93O1xufVxuZnVuY3Rpb24gcHVzaFRyZWVGb3JrKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHdlIHJlY29uY2lsZSBhbiBhcnJheSAob3IgaXRlcmF0b3IpIG9mIGNoaWxkXG4gIC8vIGZpYmVycywgYmVjYXVzZSB0aGF0J3MgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgd2Uga25vdyBob3cgbWFueSBjaGlsZHJlbiBpblxuICAvLyB0aGUgd2hvbGUgc2V0IHdpdGhvdXQgZG9pbmcgZXh0cmEgd29yayBsYXRlciwgb3Igc3RvcmluZyBhZGR0aW9uYWxcbiAgLy8gaW5mb3JtYXRpb24gb24gdGhlIGZpYmVyLlxuICAvL1xuICAvLyBUaGF0J3Mgd2h5IHRoaXMgZnVuY3Rpb24gaXMgc2VwYXJhdGUgZnJvbSBwdXNoVHJlZUlkIOKAlCBpdCdzIGNhbGxlZCBkdXJpbmdcbiAgLy8gdGhlIHJlbmRlciBwaGFzZSBvZiB0aGUgZm9yayBwYXJlbnQsIG5vdCB0aGUgY2hpbGQsIHdoaWNoIGlzIHdoZXJlIHdlIHB1c2hcbiAgLy8gdGhlIG90aGVyIGNvbnRleHQgdmFsdWVzLlxuICAvL1xuICAvLyBJbiB0aGUgRml6eiBpbXBsZW1lbnRhdGlvbiB0aGlzIGlzIG11Y2ggc2ltcGxlciBiZWNhdXNlIHRoZSBjaGlsZCBpc1xuICAvLyByZW5kZXJlZCBpbiB0aGUgc2FtZSBjYWxsc3RhY2sgYXMgdGhlIHBhcmVudC5cbiAgLy9cbiAgLy8gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGp1c3QgYWRkIGEgYGZvcmtzYCBmaWVsZCB0byB0aGUgRmliZXIgdHlwZS4gSXQgd291bGRcbiAgLy8gbWFrZSB0aGlzIG1vZHVsZSBzaW1wbGVyLlxuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtDb3VudDtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtQcm92aWRlcjtcbiAgdHJlZUZvcmtQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB0cmVlRm9ya0NvdW50ID0gdG90YWxDaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4sIGluZGV4KSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0SWQ7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dFByb3ZpZGVyO1xuICB0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBiYXNlSWRXaXRoTGVhZGluZ0JpdCA9IHRyZWVDb250ZXh0SWQ7XG4gIHZhciBiYXNlT3ZlcmZsb3cgPSB0cmVlQ29udGV4dE92ZXJmbG93OyAvLyBUaGUgbGVmdG1vc3QgMSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSwgbm9uLWluY2x1c2l2ZS4gSXQncyBub3QgcGFydFxuICAvLyBvZiB0aGUgaWQ7IHdlIHVzZSBpdCB0byBhY2NvdW50IGZvciBsZWFkaW5nIDBzLlxuXG4gIHZhciBiYXNlTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKGJhc2VJZFdpdGhMZWFkaW5nQml0KSAtIDE7XG4gIHZhciBiYXNlSWQgPSBiYXNlSWRXaXRoTGVhZGluZ0JpdCAmIH4oMSA8PCBiYXNlTGVuZ3RoKTtcbiAgdmFyIHNsb3QgPSBpbmRleCArIDE7XG4gIHZhciBsZW5ndGggPSBnZXRCaXRMZW5ndGgodG90YWxDaGlsZHJlbikgKyBiYXNlTGVuZ3RoOyAvLyAzMCBpcyB0aGUgbWF4IGxlbmd0aCB3ZSBjYW4gc3RvcmUgd2l0aG91dCBvdmVyZmxvd2luZywgdGFraW5nIGludG9cbiAgLy8gY29uc2lkZXJhdGlvbiB0aGUgbGVhZGluZyAxIHdlIHVzZSB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuXG4gIGlmIChsZW5ndGggPiAzMCkge1xuICAgIC8vIFdlIG92ZXJmbG93ZWQgdGhlIGJpdHdpc2Utc2FmZSByYW5nZS4gRmFsbCBiYWNrIHRvIHNsb3dlciBhbGdvcml0aG0uXG4gICAgLy8gVGhpcyBicmFuY2ggYXNzdW1lcyB0aGUgbGVuZ3RoIG9mIHRoZSBiYXNlIGlkIGlzIGdyZWF0ZXIgdGhhbiA1OyBpdCB3b24ndFxuICAgIC8vIHdvcmsgZm9yIHNtYWxsZXIgaWRzLCBiZWNhdXNlIHlvdSBuZWVkIDUgYml0cyBwZXIgY2hhcmFjdGVyLlxuICAgIC8vXG4gICAgLy8gV2UgZW5jb2RlIHRoZSBpZCBpbiBtdWx0aXBsZSBzdGVwczogZmlyc3QgdGhlIGJhc2UgaWQsIHRoZW4gdGhlXG4gICAgLy8gcmVtYWluaW5nIGRpZ2l0cy5cbiAgICAvL1xuICAgIC8vIEVhY2ggNSBiaXQgc2VxdWVuY2UgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgYmFzZSAzMiBjaGFyYWN0ZXIuIFNvIGZvclxuICAgIC8vIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50IGlkIGlzIDIzIGJpdHMgbG9uZywgd2UgY2FuIGNvbnZlcnQgMjAgb2YgdGhvc2VcbiAgICAvLyBiaXRzIGludG8gYSBzdHJpbmcgb2YgNCBjaGFyYWN0ZXJzLCB3aXRoIDMgYml0cyBsZWZ0IG92ZXIuXG4gICAgLy9cbiAgICAvLyBGaXJzdCBjYWxjdWxhdGUgaG93IG1hbnkgYml0cyBpbiB0aGUgYmFzZSBpZCByZXByZXNlbnQgYSBjb21wbGV0ZVxuICAgIC8vIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuXG4gICAgdmFyIG51bWJlck9mT3ZlcmZsb3dCaXRzID0gYmFzZUxlbmd0aCAtIGJhc2VMZW5ndGggJSA1OyAvLyBUaGVuIGNyZWF0ZSBhIGJpdG1hc2sgdGhhdCBzZWxlY3RzIG9ubHkgdGhvc2UgYml0cy5cblxuICAgIHZhciBuZXdPdmVyZmxvd0JpdHMgPSAoMSA8PCBudW1iZXJPZk92ZXJmbG93Qml0cykgLSAxOyAvLyBTZWxlY3QgdGhlIGJpdHMsIGFuZCBjb252ZXJ0IHRoZW0gdG8gYSBiYXNlIDMyIHN0cmluZy5cblxuICAgIHZhciBuZXdPdmVyZmxvdyA9IChiYXNlSWQgJiBuZXdPdmVyZmxvd0JpdHMpLnRvU3RyaW5nKDMyKTsgLy8gTm93IHdlIGNhbiByZW1vdmUgdGhvc2UgYml0cyBmcm9tIHRoZSBiYXNlIGlkLlxuXG4gICAgdmFyIHJlc3RPZkJhc2VJZCA9IGJhc2VJZCA+PiBudW1iZXJPZk92ZXJmbG93Qml0cztcbiAgICB2YXIgcmVzdE9mQmFzZUxlbmd0aCA9IGJhc2VMZW5ndGggLSBudW1iZXJPZk92ZXJmbG93Qml0czsgLy8gRmluYWxseSwgZW5jb2RlIHRoZSByZXN0IG9mIHRoZSBiaXRzIHVzaW5nIHRoZSBub3JtYWwgYWxnb3JpdGhtLiBCZWNhdXNlXG4gICAgLy8gd2UgbWFkZSBtb3JlIHJvb20sIHRoaXMgdGltZSBpdCB3b24ndCBvdmVyZmxvdy5cblxuICAgIHZhciByZXN0T2ZMZW5ndGggPSBnZXRCaXRMZW5ndGgodG90YWxDaGlsZHJlbikgKyByZXN0T2ZCYXNlTGVuZ3RoO1xuICAgIHZhciByZXN0T2ZOZXdCaXRzID0gc2xvdCA8PCByZXN0T2ZCYXNlTGVuZ3RoO1xuICAgIHZhciBpZCA9IHJlc3RPZk5ld0JpdHMgfCByZXN0T2ZCYXNlSWQ7XG4gICAgdmFyIG92ZXJmbG93ID0gbmV3T3ZlcmZsb3cgKyBiYXNlT3ZlcmZsb3c7XG4gICAgdHJlZUNvbnRleHRJZCA9IDEgPDwgcmVzdE9mTGVuZ3RoIHwgaWQ7XG4gICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IG92ZXJmbG93O1xuICB9IGVsc2Uge1xuICAgIC8vIE5vcm1hbCBwYXRoXG4gICAgdmFyIG5ld0JpdHMgPSBzbG90IDw8IGJhc2VMZW5ndGg7XG5cbiAgICB2YXIgX2lkID0gbmV3Qml0cyB8IGJhc2VJZDtcblxuICAgIHZhciBfb3ZlcmZsb3cgPSBiYXNlT3ZlcmZsb3c7XG4gICAgdHJlZUNvbnRleHRJZCA9IDEgPDwgbGVuZ3RoIHwgX2lkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBfb3ZlcmZsb3c7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7IC8vIFRoaXMgY29tcG9uZW50IG1hdGVyaWFsaXplZCBhbiBpZC4gVGhpcyB3aWxsIGFmZmVjdCBhbnkgaWRzIHRoYXQgYXBwZWFyXG4gIC8vIGluIGl0cyBjaGlsZHJlbi5cblxuICB2YXIgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG51bWJlck9mRm9ya3MgPSAxO1xuICAgIHZhciBzbG90SW5kZXggPSAwO1xuICAgIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCaXRMZW5ndGgobnVtYmVyKSB7XG4gIHJldHVybiAzMiAtIGNsejMyKG51bWJlcik7XG59XG5cbmZ1bmN0aW9uIGdldExlYWRpbmdCaXQoaWQpIHtcbiAgcmV0dXJuIDEgPDwgZ2V0Qml0TGVuZ3RoKGlkKSAtIDE7XG59XG5cbmZ1bmN0aW9uIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlcy5cbiAgLy8gVGhpcyBpcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gb3RoZXIgY29udGV4dC1saWtlIG1vZHVsZXMgaW4gRmliZXJcbiAgLy8gYmVjYXVzZSB0aGUgc2FtZSBGaWJlciBtYXkgYXBwZWFyIG9uIHRoZSBzdGFjayBtdWx0aXBsZSB0aW1lcyBhbmQgZm9yXG4gIC8vIGRpZmZlcmVudCByZWFzb25zLiBXZSBoYXZlIHRvIGtlZXAgcG9wcGluZyB1bnRpbCB0aGUgd29yay1pbi1wcm9ncmVzcyBpc1xuICAvLyBubyBsb25nZXIgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUZvcmtQcm92aWRlcikge1xuICAgIHRyZWVGb3JrUHJvdmlkZXIgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gICAgdHJlZUZvcmtDb3VudCA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XTtcbiAgICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxuXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUNvbnRleHRQcm92aWRlcikge1xuICAgIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVDb250ZXh0SWQgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5kZWRUcmVlQ29udGV4dCgpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG5cbiAgaWYgKHRyZWVDb250ZXh0UHJvdmlkZXIgIT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRyZWVDb250ZXh0SWQsXG4gICAgICBvdmVyZmxvdzogdHJlZUNvbnRleHRPdmVyZmxvd1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVTdXNwZW5kZWRUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuZGVkQ29udGV4dCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRJZCA9IHN1c3BlbmRlZENvbnRleHQuaWQ7XG4gIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBzdXNwZW5kZWRDb250ZXh0Lm92ZXJmbG93O1xuICB0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZk5vdEh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmICghZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGJlIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgJyArICdhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBtYXkgaGF2ZSBiZWVuIGFuIGluc2VydGlvbiBvciBhIGh5ZHJhdGlvbi5cblxudmFyIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbnZhciBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbnZhciBpc0h5ZHJhdGluZyA9IGZhbHNlOyAvLyBUaGlzIGZsYWcgYWxsb3dzIGZvciB3YXJuaW5nIHN1cHJlc3Npb24gd2hlbiB3ZSBleHBlY3QgdGhlcmUgdG8gYmUgbWlzbWF0Y2hlc1xuLy8gZHVlIHRvIGVhcmxpZXIgbWlzbWF0Y2hlcyBvciBhIHN1c3BlbmRlZCBmaWJlci5cblxudmFyIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7IC8vIEh5ZHJhdGlvbiBlcnJvcnMgdGhhdCB3ZXJlIHRocm93biBpbnNpZGUgdGhpcyBib3VuZGFyeVxuXG52YXIgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcblxuZnVuY3Rpb24gd2FybklmSHlkcmF0aW5nKCkge1xuICB7XG4gICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICBlcnJvcignV2Ugc2hvdWxkIG5vdCBiZSBoeWRyYXRpbmcgaGVyZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYSBidWcuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCkge1xuICB7XG4gICAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBkaWRTdXNwZW5kT3JFcnJvcldoaWxlSHlkcmF0aW5nREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFN1c3BlbmRPckVycm9yREVWO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVudGVySHlkcmF0aW9uU3RhdGUoZmliZXIpIHtcblxuICB2YXIgcGFyZW50SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluQ29udGFpbmVyKHBhcmVudEluc3RhbmNlKTtcbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVlbnRlckh5ZHJhdGlvblN0YXRlRnJvbURlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyLCBzdXNwZW5zZUluc3RhbmNlLCB0cmVlQ29udGV4dCkge1xuXG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpblN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcblxuICBpZiAodHJlZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQoZmliZXIsIHRyZWVDb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBpbnN0YW5jZSkge1xuICB7XG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlKHJldHVybkZpYmVyLnR5cGUsIHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHMsIHJldHVybkZpYmVyLnN0YXRlTm9kZSwgaW5zdGFuY2UsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gcmV0dXJuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCwgaW5zdGFuY2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpO1xuICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGNyZWF0ZUZpYmVyRnJvbUhvc3RJbnN0YW5jZUZvckRlbGV0aW9uKCk7XG4gIGNoaWxkVG9EZWxldGUuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gIGNoaWxkVG9EZWxldGUucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTtcbiAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICB7XG4gICAgaWYgKGRpZFN1c3BlbmRPckVycm9yREVWKSB7XG4gICAgICAvLyBJbnNpZGUgYSBib3VuZGFyeSB0aGF0IGFscmVhZHkgc3VzcGVuZGVkLiBXZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nIHRoZVxuICAgICAgLy8gc2libGluZ3Mgb2YgYSBzdXNwZW5kZWQgbm9kZS4gVGhlIG1pc21hdGNoIG1heSBiZSBkdWUgdG8gdGhlIG1pc3NpbmdcbiAgICAgIC8vIGRhdGEsIHNvIGl0J3MgcHJvYmFibHkgYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgICAgdmFyIF9wcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90eXBlLCBfcHJvcHMsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcblxuICAgICAgICAgICAgICAgIHZhciBfaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90ZXh0LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIF9pc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9wYXJlbnRJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICAgICAgICBpZiAoX3BhcmVudEluc3RhbmNlICE9PSBudWxsKSBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgX3R5cGUyID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIF9wcm9wczIgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKF9wYXJlbnRJbnN0YW5jZSwgX3R5cGUyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHZhciBfdGV4dDIgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90ZXh0Mik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKSB7XG4gIGZpYmVyLmZsYWdzID0gZmliZXIuZmxhZ3MgJiB+SHlkcmF0aW5nIHwgUGxhY2VtZW50O1xuICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiB0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjYW5IeWRyYXRlSW5zdGFuY2UobmV4dEluc3RhbmNlLCB0eXBlKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChpbnN0YW5jZSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UobmV4dEluc3RhbmNlLCB0ZXh0KTtcblxuICAgICAgICBpZiAodGV4dEluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gdGV4dEluc3RhbmNlO1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFRleHQgSW5zdGFuY2VzIGRvbid0IGhhdmUgY2hpbGRyZW4gc28gdGhlcmUncyBub3RoaW5nIHRvIGh5ZHJhdGUuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gY2FuSHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UobmV4dEluc3RhbmNlKTtcblxuICAgICAgICBpZiAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0ge1xuICAgICAgICAgICAgZGVoeWRyYXRlZDogc3VzcGVuc2VJbnN0YW5jZSxcbiAgICAgICAgICAgIHRyZWVDb250ZXh0OiBnZXRTdXNwZW5kZWRUcmVlQ29udGV4dCgpLFxuICAgICAgICAgICAgcmV0cnlMYW5lOiBPZmZzY3JlZW5MYW5lXG4gICAgICAgICAgfTtcbiAgICAgICAgICBmaWJlci5tZW1vaXplZFN0YXRlID0gc3VzcGVuc2VTdGF0ZTsgLy8gU3RvcmUgdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQgYXMgYSBjaGlsZCBmaWJlci5cbiAgICAgICAgICAvLyBUaGlzIHNpbXBsaWZpZXMgdGhlIGNvZGUgZm9yIGdldEhvc3RTaWJsaW5nIGFuZCBkZWxldGluZyBub2RlcyxcbiAgICAgICAgICAvLyBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgdG8gY29uc2lkZXIgYWxsIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gICAgICAgICAgLy8gY2hlY2sgaWYgdGhleSdyZSBkZWh5ZHJhdGVkIG9uZXMgb3Igbm90LlxuXG4gICAgICAgICAgdmFyIGRlaHlkcmF0ZWRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbURlaHlkcmF0ZWRGcmFnbWVudChzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgICBkZWh5ZHJhdGVkRnJhZ21lbnQucmV0dXJuID0gZmliZXI7XG4gICAgICAgICAgZmliZXIuY2hpbGQgPSBkZWh5ZHJhdGVkRnJhZ21lbnQ7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjsgLy8gV2hpbGUgYSBTdXNwZW5zZSBJbnN0YW5jZSBkb2VzIGhhdmUgY2hpbGRyZW4sIHdlIHdvbid0IHN0ZXAgaW50b1xuICAgICAgICAgIC8vIGl0IGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSW5zdGVhZCwgd2UnbGwgcmVlbnRlciBpdCBsYXRlci5cblxuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSB7XG4gIHJldHVybiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmIChmaWJlci5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzO1xufVxuXG5mdW5jdGlvbiB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goZmliZXIpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdIeWRyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIGluaXRpYWwgVUkgZG9lcyBub3QgbWF0Y2ggd2hhdCB3YXMgJyArICdyZW5kZXJlZCBvbiB0aGUgc2VydmVyLicpO1xufVxuXG5mdW5jdGlvbiB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZShmaWJlcikge1xuICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgaWYgKCFuZXh0SW5zdGFuY2UpIHtcbiAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTtcbiAgICB9IC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG5cblxuICAgIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UgPSBuZXh0SW5zdGFuY2U7XG5cbiAgaWYgKCF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBJZiB3ZSBjYW4ndCBoeWRyYXRlIHRoaXMgaW5zdGFuY2UgbGV0J3MgdHJ5IHRoZSBuZXh0IG9uZS5cbiAgICAvLyBXZSB1c2UgdGhpcyBhcyBhIGhldXJpc3RpYy4gSXQncyBiYXNlZCBvbiBpbnR1aXRpb24gYW5kIG5vdCBkYXRhIHNvIGl0XG4gICAgLy8gbWlnaHQgYmUgZmxhd2VkIG9yIHVubmVjZXNzYXJ5LlxuXG5cbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gICAgdmFyIHByZXZIeWRyYXRpb25QYXJlbnRGaWJlciA9IGh5ZHJhdGlvblBhcmVudEZpYmVyO1xuXG4gICAgaWYgKCFuZXh0SW5zdGFuY2UgfHwgIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG4gICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIG1hdGNoZWQgdGhlIG5leHQgb25lLCB3ZSdsbCBub3cgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IG9uZSB3YXNcbiAgICAvLyBzdXBlcmZsdW91cyBhbmQgd2UnbGwgZGVsZXRlIGl0LiBTaW5jZSB3ZSBjYW4ndCBlYWdlcmx5IGRlbGV0ZSBpdFxuICAgIC8vIHdlJ2xsIGhhdmUgdG8gc2NoZWR1bGUgYSBkZWxldGlvbi4gVG8gZG8gdGhhdCwgdGhpcyBub2RlIG5lZWRzIGEgZHVtbXlcbiAgICAvLyBmaWJlciBhc3NvY2lhdGVkIHdpdGggaXQuXG5cblxuICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIsIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2UoZmliZXIsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcblxuICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRXYXJuSWZNaXNtYXRjaERldiA9ICFkaWRTdXNwZW5kT3JFcnJvckRFVjtcbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGZpYmVyLCBzaG91bGRXYXJuSWZNaXNtYXRjaERldik7IC8vIFRPRE86IFR5cGUgdGhpcyBzcGVjaWZpYyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50LlxuXG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLlxuXG4gIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHRleHRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIHRleHRDb250ZW50ID0gZmliZXIubWVtb2l6ZWRQcm9wcztcbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGh5ZHJhdGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgZmliZXIpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBXZSBhc3N1bWUgdGhhdCBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSBpcyBjYWxsZWQgaW4gYSBjb250ZXh0IHdoZXJlIHRoZVxuICAgIC8vIGh5ZHJhdGlvbiBwYXJlbnQgaXMgdGhlIHBhcmVudCBob3N0IGNvbXBvbmVudCBvZiB0aGlzIGhvc3QgdGV4dC5cbiAgICB2YXIgcmV0dXJuRmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUyID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZTIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0U3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgaHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUgIT09IG51bGwgPyBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgOiBudWxsO1xuXG4gIGlmICghc3VzcGVuc2VJbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcikge1xuICB2YXIgcGFyZW50ID0gZmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwgJiYgcGFyZW50LnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBwYXJlbnQudGFnICE9PSBIb3N0Um9vdCAmJiBwYXJlbnQudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHBhcmVudDtcbn1cblxuZnVuY3Rpb24gcG9wSHlkcmF0aW9uU3RhdGUoZmliZXIpIHtcblxuICBpZiAoZmliZXIgIT09IGh5ZHJhdGlvblBhcmVudEZpYmVyKSB7XG4gICAgLy8gV2UncmUgZGVlcGVyIHRoYW4gdGhlIGN1cnJlbnQgaHlkcmF0aW9uIGNvbnRleHQsIGluc2lkZSBhbiBpbnNlcnRlZFxuICAgIC8vIHRyZWUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIC8vIElmIHdlJ3JlIG5vdCBjdXJyZW50bHkgaHlkcmF0aW5nIGJ1dCB3ZSdyZSBpbiBhIGh5ZHJhdGlvbiBjb250ZXh0LCB0aGVuXG4gICAgLy8gd2Ugd2VyZSBhbiBpbnNlcnRpb24gYW5kIG5vdyBuZWVkIHRvIHBvcCB1cCByZWVudGVyIGh5ZHJhdGlvbiBvZiBvdXJcbiAgICAvLyBzaWJsaW5ncy5cbiAgICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcbiAgICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIElmIHdlIGhhdmUgYW55IHJlbWFpbmluZyBoeWRyYXRhYmxlIG5vZGVzLCB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGVtIG5vdy5cbiAgLy8gV2Ugb25seSBkbyB0aGlzIGRlZXBlciB0aGFuIGhlYWQgYW5kIGJvZHkgc2luY2UgdGhleSB0ZW5kIHRvIGhhdmUgcmFuZG9tXG4gIC8vIG90aGVyIG5vZGVzIGluIHRoZW0uIFdlIGFsc28gaWdub3JlIGNvbXBvbmVudHMgd2l0aCBwdXJlIHRleHQgY29udGVudCBpblxuICAvLyBzaWRlIG9mIHRoZW0uIFdlIGFsc28gZG9uJ3QgZGVsZXRlIGFueXRoaW5nIGluc2lkZSB0aGUgcm9vdCBjb250YWluZXIuXG5cblxuICBpZiAoZmliZXIudGFnICE9PSBIb3N0Um9vdCAmJiAoZmliZXIudGFnICE9PSBIb3N0Q29tcG9uZW50IHx8IHNob3VsZERlbGV0ZVVuaHlkcmF0ZWRUYWlsSW5zdGFuY2VzKGZpYmVyLnR5cGUpICYmICFzaG91bGRTZXRUZXh0Q29udGVudChmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzKSkpIHtcbiAgICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICAgIGlmIChuZXh0SW5zdGFuY2UpIHtcbiAgICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgICB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKGZpYmVyKTtcbiAgICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgICAgICAgZGVsZXRlSHlkcmF0YWJsZUluc3RhbmNlKGZpYmVyLCBuZXh0SW5zdGFuY2UpO1xuICAgICAgICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcik7XG4gIH0gZWxzZSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGh5ZHJhdGlvblBhcmVudEZpYmVyID8gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpYmVyLnN0YXRlTm9kZSkgOiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZyAmJiBuZXh0SHlkcmF0YWJsZUluc3RhbmNlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKGZpYmVyKSB7XG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIHdoaWxlIChuZXh0SW5zdGFuY2UpIHtcbiAgICB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKGZpYmVyLCBuZXh0SW5zdGFuY2UpO1xuICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0SHlkcmF0aW9uU3RhdGUoKSB7XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKSB7XG4gIGlmIChoeWRyYXRpb25FcnJvcnMgIT09IG51bGwpIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIGEgZm9yY2VkIGNsaWVudCByZW5kZXIuIFRoZSBlcnJvcnMgdGhhdCBvY2N1cnJlZFxuICAgIC8vIGR1cmluZyB0aGUgaHlkcmF0aW9uIGF0dGVtcHQgYXJlIG5vdyByZWNvdmVyZWQuIFdlIHdpbGwgbG9nIHRoZW0gaW5cbiAgICAvLyBjb21taXQgcGhhc2UsIG9uY2UgdGhlIGVudGlyZSB0cmVlIGhhcyBmaW5pc2hlZC5cbiAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGh5ZHJhdGlvbkVycm9ycyk7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJc0h5ZHJhdGluZygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUh5ZHJhdGlvbkVycm9yKGVycm9yKSB7XG4gIGlmIChoeWRyYXRpb25FcnJvcnMgPT09IG51bGwpIHtcbiAgICBoeWRyYXRpb25FcnJvcnMgPSBbZXJyb3JdO1xuICB9IGVsc2Uge1xuICAgIGh5ZHJhdGlvbkVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIE5vVHJhbnNpdGlvbiA9IG51bGw7XG5mdW5jdGlvbiByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSB7XG4gIHJldHVybiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb247XG59XG5cbnZhciBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncyA9IHtcbiAgcmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LFxuICBmbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKCkge30sXG4gIHJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKCkge30sXG4gIGRpc2NhcmRQZW5kaW5nV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9XG59O1xuXG57XG4gIHZhciBmaW5kU3RyaWN0Um9vdCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgIHZhciBtYXliZVN0cmljdFJvb3QgPSBudWxsO1xuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgbWF5YmVTdHJpY3RSb290ID0gbm9kZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBtYXliZVN0cmljdFJvb3Q7XG4gIH07XG5cbiAgdmFyIHNldFRvU29ydGVkU3RyaW5nID0gZnVuY3Rpb24gKHNldCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoKS5qb2luKCcsICcpO1xuICB9O1xuXG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIC8vIERlZHVwZSBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG4gICAgaWYgKGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMuXG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSBkbyBhbiBpbml0aWFsIHBhc3MgdG8gZ2F0aGVyIGNvbXBvbmVudCBuYW1lc1xuICAgIHZhciBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfSAvLyBGaW5hbGx5LCB3ZSBmbHVzaCBhbGwgdGhlIHdhcm5pbmdzXG4gICAgLy8gVU5TQUZFXyBvbmVzIGJlZm9yZSB0aGUgZGVwcmVjYXRlZCBvbmVzLCBzaW5jZSB0aGV5J2xsIGJlICdsb3VkZXInXG5cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBzb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCBcIiArICdyZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMiA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczIpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxNb3VudCBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxNb3VudCB0byBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMzKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNCA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgcmVmYWN0b3IgeW91ciBcIiArICdjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczUgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsVXBkYXRlIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIHZhciBzdHJpY3RSb290ID0gZmluZFN0cmljdFJvb3QoZmliZXIpO1xuXG4gICAgaWYgKHN0cmljdFJvb3QgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cblxuXG4gICAgaWYgKGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhcm5pbmdzRm9yUm9vdCA9IHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5nZXQoc3RyaWN0Um9vdCk7XG5cbiAgICBpZiAoZmliZXIudHlwZS5jb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBmaWJlci50eXBlLmNoaWxkQ29udGV4dFR5cGVzICE9IG51bGwgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHdhcm5pbmdzRm9yUm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhcm5pbmdzRm9yUm9vdCA9IFtdO1xuICAgICAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuc2V0KHN0cmljdFJvb3QsIHdhcm5pbmdzRm9yUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5pbmdzRm9yUm9vdC5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZm9yRWFjaChmdW5jdGlvbiAoZmliZXJBcnJheSwgc3RyaWN0Um9vdCkge1xuICAgICAgaWYgKGZpYmVyQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpcnN0RmliZXIgPSBmaWJlckFycmF5WzBdO1xuICAgICAgdmFyIHVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgZmliZXJBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcodW5pcXVlTmFtZXMpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmlyc3RGaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0xlZ2FjeSBjb250ZXh0IEFQSSBoYXMgYmVlbiBkZXRlY3RlZCB3aXRoaW4gYSBzdHJpY3QtbW9kZSB0cmVlLicgKyAnXFxuXFxuVGhlIG9sZCBBUEkgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gYWxsIDE2LnggcmVsZWFzZXMsIGJ1dCBhcHBsaWNhdGlvbnMgJyArICd1c2luZyBpdCBzaG91bGQgbWlncmF0ZSB0byB0aGUgbmV3IHZlcnNpb24uJyArICdcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9sZWdhY3ktY29udGV4dCcsIHNvcnRlZE5hbWVzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZGlzY2FyZFBlbmRpbmdXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpO1xuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TWFwcztcbnZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nO1xudmFyIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZztcblxudmFyIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge307XG5cbntcbiAgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbiAgLyoqXG4gICAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAgICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gICAqIHVwZGF0ZXMuXG4gICAqL1xuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmcgPSB7fTtcblxuICB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHtcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hpbGQuX3N0b3JlIHx8IGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgfHwgY2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNoaWxkLl9zdG9yZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QgQ29tcG9uZW50IGluIHdhcm5Gb3JNaXNzaW5nS2V5IHNob3VsZCBoYXZlIGEgX3N0b3JlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0tleVVzZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlICcgKyAnXCJrZXlcIiBwcm9wLiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgJyArICdtb3JlIGluZm9ybWF0aW9uLicpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBpc1JlYWN0Q2xhc3ModHlwZSkge1xuICByZXR1cm4gdHlwZS5wcm90b3R5cGUgJiYgdHlwZS5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudDtcbn1cblxuZnVuY3Rpb24gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KSB7XG4gIHZhciBtaXhlZFJlZiA9IGVsZW1lbnQucmVmO1xuXG4gIGlmIChtaXhlZFJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnb2JqZWN0Jykge1xuICAgIHtcbiAgICAgIC8vIFRPRE86IENsZWFuIHRoaXMgdXAgb25jZSB3ZSB0dXJuIG9uIHRoZSBzdHJpbmcgcmVmIHdhcm5pbmcgZm9yXG4gICAgICAvLyBldmVyeW9uZSwgYmVjYXVzZSB0aGUgc3RyaWN0IG1vZGUgY2FzZSB3aWxsIG5vIGxvbmdlciBiZSByZWxldmFudFxuICAgICAgaWYgKChyZXR1cm5GaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSB8fCB3YXJuQWJvdXRTdHJpbmdSZWZzKSAmJiAvLyBXZSB3YXJuIGluIFJlYWN0RWxlbWVudC5qcyBpZiBvd25lciBhbmQgc2VsZiBhcmUgZXF1YWwgZm9yIHN0cmluZyByZWZzXG4gICAgICAvLyBiZWNhdXNlIHRoZXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvblxuICAgICAgLy8gdXNpbmcgYSBjb2RlbW9kLiBUaGVyZWZvcmUsIHdlIGRvbid0IGhhdmUgdG8gd2FybiBhYm91dCBzdHJpbmcgcmVmcyBhZ2Fpbi5cbiAgICAgICEoZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fc2VsZiAmJiBlbGVtZW50Ll9vd25lci5zdGF0ZU5vZGUgIT09IGVsZW1lbnQuX3NlbGYpICYmIC8vIFdpbGwgYWxyZWFkeSB0aHJvdyB3aXRoIFwiRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgaGF2ZSBzdHJpbmcgcmVmc1wiXG4gICAgICAhKGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyLnRhZyAhPT0gQ2xhc3NDb21wb25lbnQpICYmIC8vIFdpbGwgYWxyZWFkeSB3YXJuIHdpdGggXCJGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzXCJcbiAgICAgICEodHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNSZWFjdENsYXNzKGVsZW1lbnQudHlwZSkpICYmIC8vIFdpbGwgYWxyZWFkeSB0aHJvdyB3aXRoIFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoc29tZVN0cmluZ1JlZikgYnV0IG5vIG93bmVyIHdhcyBzZXRcIlxuICAgICAgZWxlbWVudC5fb3duZXIpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlcnJvcignQ29tcG9uZW50IFwiJXNcIiBjb250YWlucyB0aGUgc3RyaW5nIHJlZiBcIiVzXCIuIFN1cHBvcnQgZm9yIHN0cmluZyByZWZzICcgKyAnd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIFdlIHJlY29tbWVuZCB1c2luZyAnICsgJ3VzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgbWl4ZWRSZWYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuX293bmVyKSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBpbnN0O1xuXG4gICAgICBpZiAob3duZXIpIHtcbiAgICAgICAgdmFyIG93bmVyRmliZXIgPSBvd25lcjtcblxuICAgICAgICBpZiAob3duZXJGaWJlci50YWcgIT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBoYXZlIHN0cmluZyByZWZzLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5zdCA9IG93bmVyRmliZXIuc3RhdGVOb2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiBcIiArIG1peGVkUmVmICsgXCIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIFwiICsgJ2J1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9IC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3Qgc28gRmxvdyBrbm93cyBpdCB3b24ndCBjaGFuZ2UgaW4gdGhlIGNsb3N1cmVcblxuXG4gICAgICB2YXIgcmVzb2x2ZWRJbnN0ID0gaW5zdDtcblxuICAgICAge1xuICAgICAgICBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbihtaXhlZFJlZiwgJ3JlZicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjsgLy8gQ2hlY2sgaWYgcHJldmlvdXMgc3RyaW5nIHJlZiBtYXRjaGVzIG5ldyBzdHJpbmcgcmVmXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSBudWxsICYmIHR5cGVvZiBjdXJyZW50LnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBjdXJyZW50LnJlZi5fc3RyaW5nUmVmID09PSBzdHJpbmdSZWYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVmO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gcmVzb2x2ZWRJbnN0LnJlZnM7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgZGVsZXRlIHJlZnNbc3RyaW5nUmVmXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZzW3N0cmluZ1JlZl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmVmLl9zdHJpbmdSZWYgPSBzdHJpbmdSZWY7XG4gICAgICByZXR1cm4gcmVmO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIG1peGVkUmVmICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhIHN0cmluZywgYW4gb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZVJlZigpLCBvciBudWxsLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVsZW1lbnQuX293bmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgcmVmIHdhcyBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKFwiICsgbWl4ZWRSZWYgKyBcIikgYnV0IG5vIG93bmVyIHdhcyBzZXQuIFRoaXMgY291bGQgaGFwcGVuIGZvciBvbmUgb2ZcIiArICcgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBmdW5jdGlvbiBjb21wb25lbnRcXG4nICsgXCIyLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnQncyByZW5kZXIgbWV0aG9kXFxuXCIgKyAnMy4gWW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWZzLW11c3QtaGF2ZS1vd25lciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWl4ZWRSZWY7XG59XG5cbmZ1bmN0aW9uIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpIHtcbiAgdmFyIGNoaWxkU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ld0NoaWxkKTtcbiAgdGhyb3cgbmV3IEVycm9yKFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChjaGlsZFN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKG5ld0NoaWxkKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRTdHJpbmcpICsgXCIpLiBcIiArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZC4nKTtcbn1cblxuZnVuY3Rpb24gd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRnVuY3Rpb25zIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZC4gVGhpcyBtYXkgaGFwcGVuIGlmICcgKyAneW91IHJldHVybiBhIENvbXBvbmVudCBpbnN0ZWFkIG9mIDxDb21wb25lbnQgLz4gZnJvbSByZW5kZXIuICcgKyAnT3IgbWF5YmUgeW91IG1lYW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiByZXR1cm4gaXQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUxhenkobGF6eVR5cGUpIHtcbiAgdmFyIHBheWxvYWQgPSBsYXp5VHlwZS5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5VHlwZS5faW5pdDtcbiAgcmV0dXJuIGluaXQocGF5bG9hZCk7XG59IC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBleGlzdHMgYmVjYXVzZSBJIGV4cGVjdCB0byBjbG9uZSB0aGUgY29kZSBpbiBlYWNoIHBhdGhcbi8vIHRvIGJlIGFibGUgdG8gb3B0aW1pemUgZWFjaCBwYXRoIGluZGl2aWR1YWxseSBieSBicmFuY2hpbmcgZWFybHkuIFRoaXMgbmVlZHNcbi8vIGEgY29tcGlsZXIgb3Igd2UgY2FuIGRvIGl0IG1hbnVhbGx5LiBIZWxwZXJzIHRoYXQgZG9uJ3QgbmVlZCB0aGlzIGJyYW5jaGluZ1xuLy8gbGl2ZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24uXG5cblxuZnVuY3Rpb24gQ2hpbGRSZWNvbmNpbGVyKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCkge1xuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8gVE9ETzogRm9yIHRoZSBzaG91bGRDbG9uZSBjYXNlLCB0aGlzIGNvdWxkIGJlIG1pY3JvLW9wdGltaXplZCBhIGJpdCBieVxuICAgIC8vIGFzc3VtaW5nIHRoYXQgYWZ0ZXIgdGhlIGZpcnN0IGNoaWxkIHdlJ3ZlIGFscmVhZHkgYWRkZWQgZXZlcnl0aGluZy5cblxuXG4gICAgdmFyIGNoaWxkVG9EZWxldGUgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZFRvRGVsZXRlICE9PSBudWxsKSB7XG4gICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICBjaGlsZFRvRGVsZXRlID0gY2hpbGRUb0RlbGV0ZS5zaWJsaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgLy8gQWRkIHRoZSByZW1haW5pbmcgY2hpbGRyZW4gdG8gYSB0ZW1wb3JhcnkgbWFwIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlbSBieVxuICAgIC8vIGtleXMgcXVpY2tseS4gSW1wbGljaXQgKG51bGwpIGtleXMgZ2V0IGFkZGVkIHRvIHRoaXMgc2V0IHdpdGggdGhlaXIgaW5kZXhcbiAgICAvLyBpbnN0ZWFkLlxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgIHZhciBleGlzdGluZ0NoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoZXhpc3RpbmdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGV4aXN0aW5nQ2hpbGQua2V5ICE9PSBudWxsKSB7XG4gICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGV4aXN0aW5nQ2hpbGQua2V5LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGV4aXN0aW5nQ2hpbGQuaW5kZXgsIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBleGlzdGluZ0NoaWxkID0gZXhpc3RpbmdDaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBleGlzdGluZ0NoaWxkcmVuO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlRmliZXIoZmliZXIsIHBlbmRpbmdQcm9wcykge1xuICAgIC8vIFdlIGN1cnJlbnRseSBzZXQgc2libGluZyB0byBudWxsIGFuZCBpbmRleCB0byAwIGhlcmUgYmVjYXVzZSBpdCBpcyBlYXN5XG4gICAgLy8gdG8gZm9yZ2V0IHRvIGRvIGJlZm9yZSByZXR1cm5pbmcgaXQuIEUuZy4gZm9yIHRoZSBzaW5nbGUgY2hpbGQgY2FzZS5cbiAgICB2YXIgY2xvbmUgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhmaWJlciwgcGVuZGluZ1Byb3BzKTtcbiAgICBjbG9uZS5pbmRleCA9IDA7XG4gICAgY2xvbmUuc2libGluZyA9IG51bGw7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgZnVuY3Rpb24gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJbmRleCkge1xuICAgIG5ld0ZpYmVyLmluZGV4ID0gbmV3SW5kZXg7XG5cbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIER1cmluZyBoeWRyYXRpb24sIHRoZSB1c2VJZCBhbGdvcml0aG0gbmVlZHMgdG8ga25vdyB3aGljaCBmaWJlcnMgYXJlXG4gICAgICAvLyBwYXJ0IG9mIGEgbGlzdCBvZiBjaGlsZHJlbiAoYXJyYXlzLCBpdGVyYXRvcnMpLlxuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gRm9ya2VkO1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudCA9IG5ld0ZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgb2xkSW5kZXggPSBjdXJyZW50LmluZGV4O1xuXG4gICAgICBpZiAob2xkSW5kZXggPCBsYXN0UGxhY2VkSW5kZXgpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIG1vdmUuXG4gICAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXRlbSBjYW4gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgcmV0dXJuIG9sZEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbi5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGxhY2VTaW5nbGVDaGlsZChuZXdGaWJlcikge1xuICAgIC8vIFRoaXMgaXMgc2ltcGxlciBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLiBXZSBvbmx5IG5lZWQgdG8gZG8gYVxuICAgIC8vIHBsYWNlbWVudCBmb3IgaW5zZXJ0aW5nIG5ldyBjaGlsZHJlbi5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cyAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmliZXI7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudCwgdGV4dENvbnRlbnQsIGxhbmVzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHRleHRDb250ZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQsIGxhbmVzKSB7XG4gICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKGVsZW1lbnRUeXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIGxhbmVzLCBlbGVtZW50LmtleSk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChjdXJyZW50LmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSB8fCAoIC8vIEtlZXAgdGhpcyBjaGVjayBpbmxpbmUgc28gaXQgb25seSBydW5zIG9uIHRoZSBmYWxzZSBwYXRoOlxuICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhjdXJyZW50LCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLlxuICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBIb3QgUmVsb2FkaW5nIGNoZWNrIGFib3ZlLFxuICAgICAgLy8gYmVjYXVzZSBob3QgcmVsb2FkaW5nIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gcHJvZCBiZWNhdXNlXG4gICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuXG4gICAgICB0eXBlb2YgZWxlbWVudFR5cGUgPT09ICdvYmplY3QnICYmIGVsZW1lbnRUeXBlICE9PSBudWxsICYmIGVsZW1lbnRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiYgcmVzb2x2ZUxhenkoZWxlbWVudFR5cGUpID09PSBjdXJyZW50LnR5cGUpIHtcbiAgICAgICAgLy8gTW92ZSBiYXNlZCBvbiBpbmRleFxuICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKTtcbiAgICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgfVxuICAgIH0gLy8gSW5zZXJ0XG5cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFBvcnRhbCB8fCBjdXJyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fCBjdXJyZW50LnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiAhPT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZnJhZ21lbnQsIGxhbmVzLCBrZXkpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gRnJhZ21lbnQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmcmFnbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZnJhZ21lbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZFxuICAgICAgLy8gd2UgY2FuIGNvbnRpbnVlIHRvIHJlcGxhY2UgaXQgd2l0aG91dCBhYm9ydGluZyBldmVuIGlmIGl0IGlzIG5vdCBhIHRleHRcbiAgICAgIC8vIG5vZGUuXG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQoJycgKyBuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBudWxsLCBuZXdDaGlsZCk7XG4gICAgICAgICAgICBfY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQyID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgICAgICAgIF9jcmVhdGVkMi5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlZDI7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9jcmVhdGVkMyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgbnVsbCk7XG5cbiAgICAgICAgX2NyZWF0ZWQzLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICByZXR1cm4gX2NyZWF0ZWQzO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBmaWJlciBpZiB0aGUga2V5cyBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiBudWxsLlxuICAgIHZhciBrZXkgPSBvbGRGaWJlciAhPT0gbnVsbCA/IG9sZEZpYmVyLmtleSA6IG51bGw7XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBvbGRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yXG4gICAgICAvLyBuZXcgbm9kZSBmb3IgdGhlIGtleS4gSWYgYm90aCBhcmUgdGV4dCBub2RlcywgdGhleSBtYXRjaC5cbiAgICAgIHZhciBtYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX21hdGNoZWRGaWJlcjIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdDaGlsZC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXkpIHx8IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIzID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjMsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogV2FybnMgaWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgb3IgbWlzc2luZyBrZXlcbiAgICovXG5cblxuICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcgfHwgY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGtub3duS2V5cztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCwgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIHZhciBrZXkgPSBjaGlsZC5rZXk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChrbm93bktleXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGtub3duS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgha25vd25LZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvcignRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCBgJXNgLiAnICsgJ0tleXMgc2hvdWxkIGJlIHVuaXF1ZSBzbyB0aGF0IGNvbXBvbmVudHMgbWFpbnRhaW4gdGhlaXIgaWRlbnRpdHkgJyArICdhY3Jvc3MgdXBkYXRlcy4gTm9uLXVuaXF1ZSBrZXlzIG1heSBjYXVzZSBjaGlsZHJlbiB0byBiZSAnICsgJ2R1cGxpY2F0ZWQgYW5kL29yIG9taXR0ZWQg4oCUIHRoZSBiZWhhdmlvciBpcyB1bnN1cHBvcnRlZCBhbmQgJyArICdjb3VsZCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi4nLCBrZXkpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBjaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGNoaWxkLl9pbml0O1xuICAgICAgICAgIHdhcm5PbkludmFsaWRLZXkoaW5pdChwYXlsb2FkKSwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtub3duS2V5cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbiwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGFsZ29yaXRobSBjYW4ndCBvcHRpbWl6ZSBieSBzZWFyY2hpbmcgZnJvbSBib3RoIGVuZHMgc2luY2Ugd2VcbiAgICAvLyBkb24ndCBoYXZlIGJhY2twb2ludGVycyBvbiBmaWJlcnMuIEknbSB0cnlpbmcgdG8gc2VlIGhvdyBmYXIgd2UgY2FuIGdldFxuICAgIC8vIHdpdGggdGhhdCBtb2RlbC4gSWYgaXQgZW5kcyB1cCBub3QgYmVpbmcgd29ydGggdGhlIHRyYWRlb2Zmcywgd2UgY2FuXG4gICAgLy8gYWRkIGl0IGxhdGVyLlxuICAgIC8vIEV2ZW4gd2l0aCBhIHR3byBlbmRlZCBvcHRpbWl6YXRpb24sIHdlJ2Qgd2FudCB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhc2VcbiAgICAvLyB3aGVyZSB0aGVyZSBhcmUgZmV3IGNoYW5nZXMgYW5kIGJydXRlIGZvcmNlIHRoZSBjb21wYXJpc29uIGluc3RlYWQgb2ZcbiAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW5cbiAgICAvLyBmb3J3YXJkLW9ubHkgbW9kZSBhbmQgb25seSBnbyBmb3IgdGhlIE1hcCBvbmNlIHdlIG5vdGljZSB0aGF0IHdlIG5lZWRcbiAgICAvLyBsb3RzIG9mIGxvb2sgYWhlYWQuIFRoaXMgZG9lc24ndCBoYW5kbGUgcmV2ZXJzYWwgYXMgd2VsbCBhcyB0d28gZW5kZWRcbiAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG9cbiAgICAvLyB3b3JrIG9uIEl0ZXJhYmxlcywgd2UnZCBuZWVkIHRvIGNvcHkgdGhlIHdob2xlIHNldC5cbiAgICAvLyBJbiB0aGlzIGZpcnN0IGl0ZXJhdGlvbiwgd2UnbGwganVzdCBsaXZlIHdpdGggaGl0dGluZyB0aGUgYmFkIGNhc2VcbiAgICAvLyAoYWRkaW5nIGV2ZXJ5dGhpbmcgdG8gYSBNYXApIGluIGZvciBldmVyeSBpbnNlcnQvbW92ZS5cbiAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY29kZSwgYWxzbyB1cGRhdGUgcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcigpIHdoaWNoXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBhbGdvcml0aG0uXG4gICAge1xuICAgICAgLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAobmV3SWR4ID09PSBuZXdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBfbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIHZhciBfbmV3RmliZXIyID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjIuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyMi5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXIyLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgdmFyIF9udW1iZXJPZkZvcmtzMiA9IG5ld0lkeDtcbiAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbkl0ZXJhYmxlLCBsYW5lcykge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgcmVjb25jaWxlQ2hpbGRyZW5BcnJheSgpLFxuICAgIC8vIGJ1dCB1c2luZyB0aGUgaXRlcmF0b3IgaW5zdGVhZC5cbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVuZGVyaW5nIEdlbmVyYXRvcnMgYmVjYXVzZSBpdCdzIGEgbXV0YXRpb24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjk5NVxuICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCB0b1N0cmluZ1RhZ1xuICAgICAgbmV3Q2hpbGRyZW5JdGVyYWJsZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnR2VuZXJhdG9yJykge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEdlbmVyYXRvcnMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgR2VuZXJhdG9ycyBhcyBjaGlsZHJlbiBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBsaWtlbHkgeWllbGQgJyArICd1bmV4cGVjdGVkIHJlc3VsdHMgYmVjYXVzZSBlbnVtZXJhdGluZyBhIGdlbmVyYXRvciBtdXRhdGVzIGl0LiAnICsgJ1lvdSBtYXkgY29udmVydCBpdCB0byBhbiBhcnJheSB3aXRoIGBBcnJheS5mcm9tKClgIG9yIHRoZSAnICsgJ2BbLi4uc3ByZWFkXWAgb3BlcmF0b3IgYmVmb3JlIHJlbmRlcmluZy4gS2VlcCBpbiBtaW5kICcgKyAneW91IG1pZ2h0IG5lZWQgdG8gcG9seWZpbGwgdGhlc2UgZmVhdHVyZXMgZm9yIG9sZGVyIGJyb3dzZXJzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IHRydWU7XG4gICAgICB9IC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuXG5cbiAgICAgIGlmIChuZXdDaGlsZHJlbkl0ZXJhYmxlLmVudHJpZXMgPT09IGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICB9IC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgLy8gV2UnbGwgZ2V0IGEgZGlmZmVyZW50IGl0ZXJhdG9yIGxhdGVyIGZvciB0aGUgbWFpbiBwYXNzLlxuXG5cbiAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICAgIGlmIChfbmV3Q2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgICAgdmFyIF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgICAgICBmb3IgKDsgIV9zdGVwLmRvbmU7IF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKG5ld0NoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gaXRlcmFibGUgb2JqZWN0IHByb3ZpZGVkIG5vIGl0ZXJhdG9yLicpO1xuICAgIH1cblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG4gICAgdmFyIG9sZEZpYmVyID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgdmFyIGxhc3RQbGFjZWRJbmRleCA9IDA7XG4gICAgdmFyIG5ld0lkeCA9IDA7XG4gICAgdmFyIG5leHRPbGRGaWJlciA9IG51bGw7XG4gICAgdmFyIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCk7XG5cbiAgICBmb3IgKDsgb2xkRmliZXIgIT09IG51bGwgJiYgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgIGlmIChvbGRGaWJlci5pbmRleCA+IG5ld0lkeCkge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlcjtcbiAgICAgICAgb2xkRmliZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICBpZiAob2xkRmliZXIgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgc2xvdCwgYnV0IHdlIGRpZG4ndCByZXVzZSB0aGUgZXhpc3RpbmcgZmliZXIsIHNvIHdlXG4gICAgICAgICAgLy8gbmVlZCB0byBkZWxldGUgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgIH1cblxuICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIzID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgICBpZiAoX25ld0ZpYmVyMyA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIzLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyMztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIzO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgX251bWJlck9mRm9ya3MzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzMyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyNCA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyNCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXI0LmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjQua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyNC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyNCwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczQgPSBuZXdJZHg7XG4gICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzNCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBjaGVjayBmb3Iga2V5cyBvbiB0ZXh0IG5vZGVzIHNpbmNlIHdlIGRvbid0IGhhdmUgYVxuICAgIC8vIHdheSB0byBkZWZpbmUgdGhlbS5cbiAgICBpZiAoY3VycmVudEZpcnN0Q2hpbGQgIT09IG51bGwgJiYgY3VycmVudEZpcnN0Q2hpbGQudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG5vZGUgc28gbGV0J3MganVzdCB1cGRhdGUgaXQgYW5kIGRlbGV0ZVxuICAgICAgLy8gdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQuc2libGluZyk7XG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfSAvLyBUaGUgZXhpc3RpbmcgZmlyc3QgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZVxuICAgIC8vIGFuZCBkZWxldGUgdGhlIGV4aXN0aW5nIG9uZXMuXG5cblxuICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBGcmFnbWVudCkge1xuICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4pO1xuICAgICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjaGlsZC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUgfHwgKCAvLyBLZWVwIHRoaXMgY2hlY2sgaW5saW5lIHNvIGl0IG9ubHkgcnVucyBvbiB0aGUgZmFsc2UgcGF0aDpcbiAgICAgICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGNoaWxkLCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLlxuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgSG90IFJlbG9hZGluZyBjaGVjayBhYm92ZSxcbiAgICAgICAgICAvLyBiZWNhdXNlIGhvdCByZWxvYWRpbmcgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBwcm9kIGJlY2F1c2VcbiAgICAgICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuXG4gICAgICAgICAgdHlwZW9mIGVsZW1lbnRUeXBlID09PSAnb2JqZWN0JyAmJiBlbGVtZW50VHlwZSAhPT0gbnVsbCAmJiBlbGVtZW50VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY2hpbGQudHlwZSkge1xuICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuXG4gICAgICAgICAgICB2YXIgX2V4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQucHJvcHMpO1xuXG4gICAgICAgICAgICBfZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBfZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgX2V4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICAgICAgX2V4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfZXhpc3Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIERpZG4ndCBtYXRjaC5cblxuXG4gICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGVsZW1lbnQua2V5KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jcmVhdGVkNCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICBfY3JlYXRlZDQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCk7XG4gICAgICBfY3JlYXRlZDQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gX2NyZWF0ZWQ0O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICB2YXIga2V5ID0gcG9ydGFsLmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIGlmIChjaGlsZC50YWcgPT09IEhvc3RQb3J0YWwgJiYgY2hpbGQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gPT09IHBvcnRhbC5jb250YWluZXJJbmZvICYmIGNoaWxkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiA9PT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBwb3J0YWwuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfSAvLyBUaGlzIEFQSSB3aWxsIHRhZyB0aGUgY2hpbGRyZW4gd2l0aCB0aGUgc2lkZS1lZmZlY3Qgb2YgdGhlIHJlY29uY2lsaWF0aW9uXG4gIC8vIGl0c2VsZi4gVGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzaWRlLWVmZmVjdCBsaXN0IGFzIHdlIHBhc3MgdGhyb3VnaCB0aGVcbiAgLy8gY2hpbGRyZW4gYW5kIHRoZSBwYXJlbnQuXG5cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZEZpYmVycyhyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlY3Vyc2l2ZS5cbiAgICAvLyBJZiB0aGUgdG9wIGxldmVsIGl0ZW0gaXMgYW4gYXJyYXksIHdlIHRyZWF0IGl0IGFzIGEgc2V0IG9mIGNoaWxkcmVuLFxuICAgIC8vIG5vdCBhcyBhIGZyYWdtZW50LiBOZXN0ZWQgYXJyYXlzIG9uIHRoZSBvdGhlciBoYW5kIHdpbGwgYmUgdHJlYXRlZCBhc1xuICAgIC8vIGZyYWdtZW50IG5vZGVzLiBSZWN1cnNpb24gaGFwcGVucyBhdCB0aGUgbm9ybWFsIGZsb3cuXG4gICAgLy8gSGFuZGxlIHRvcCBsZXZlbCB1bmtleWVkIGZyYWdtZW50cyBhcyBpZiB0aGV5IHdlcmUgYXJyYXlzLlxuICAgIC8vIFRoaXMgbGVhZHMgdG8gYW4gYW1iaWd1aXR5IGJldHdlZW4gPD57Wy4uLl19PC8+IGFuZCA8Pi4uLjwvPi5cbiAgICAvLyBXZSB0cmVhdCB0aGUgYW1iaWd1b3VzIGNhc2VzIGFib3ZlIHRoZSBzYW1lLlxuICAgIHZhciBpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50ID0gdHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCAmJiBuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFICYmIG5ld0NoaWxkLmtleSA9PT0gbnVsbDtcblxuICAgIGlmIChpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50KSB7XG4gICAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuO1xuICAgIH0gLy8gSGFuZGxlIG9iamVjdCB0eXBlc1xuXG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpKTtcblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7IC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gYmUgbm9uLXJlY3Vyc2l2ZS5cblxuICAgICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycyhyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpKSB7XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgJycgKyBuZXdDaGlsZCwgbGFuZXMpKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfSAvLyBSZW1haW5pbmcgY2FzZXMgYXJlIGFsbCB0cmVhdGVkIGFzIGVtcHR5LlxuXG5cbiAgICByZXR1cm4gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgfVxuXG4gIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycztcbn1cblxudmFyIHJlY29uY2lsZUNoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKHRydWUpO1xudmFyIG1vdW50Q2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIoZmFsc2UpO1xuZnVuY3Rpb24gY2xvbmVDaGlsZEZpYmVycyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5jaGlsZCAhPT0gY3VycmVudC5jaGlsZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcblxuICB3aGlsZSAoY3VycmVudENoaWxkLnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICBjdXJyZW50Q2hpbGQgPSBjdXJyZW50Q2hpbGQuc2libGluZztcbiAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnNpYmxpbmcgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICAgIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgbmV3Q2hpbGQuc2libGluZyA9IG51bGw7XG59IC8vIFJlc2V0IGEgd29ya0luUHJvZ3Jlc3MgY2hpbGQgc2V0IHRvIHByZXBhcmUgaXQgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHJlc2V0V29ya0luUHJvZ3Jlc3MoY2hpbGQsIGxhbmVzKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxudmFyIHZhbHVlQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKG51bGwpO1xudmFyIHJlbmRlcmVyU2lnaWw7XG5cbntcbiAgLy8gVXNlIHRoaXMgdG8gZGV0ZWN0IG11bHRpcGxlIHJlbmRlcmVycyB1c2luZyB0aGUgc2FtZSBjb250ZXh0XG4gIHJlbmRlcmVyU2lnaWwgPSB7fTtcbn1cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gbnVsbDtcbnZhciBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xudmFyIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG52YXIgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuZnVuY3Rpb24gcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCkge1xuICAvLyBUaGlzIGlzIGNhbGxlZCByaWdodCBiZWZvcmUgUmVhY3QgeWllbGRzIGV4ZWN1dGlvbiwgdG8gZW5zdXJlIGByZWFkQ29udGV4dGBcbiAgLy8gY2Fubm90IGJlIGNhbGxlZCBvdXRzaWRlIHRoZSByZW5kZXIgcGhhc2UuXG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gbnVsbDtcbiAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbiAgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcblxuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCkge1xuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGV4aXREaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gcHVzaFByb3ZpZGVyKHByb3ZpZGVyRmliZXIsIGNvbnRleHQsIG5leHRWYWx1ZSkge1xuICB7XG4gICAgcHVzaCh2YWx1ZUN1cnNvciwgY29udGV4dC5fY3VycmVudFZhbHVlLCBwcm92aWRlckZpYmVyKTtcbiAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBuZXh0VmFsdWU7XG5cbiAgICB7XG4gICAgICBpZiAoY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSB1bmRlZmluZWQgJiYgY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSBudWxsICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gcmVuZGVyZXJTaWdpbCkge1xuICAgICAgICBlcnJvcignRGV0ZWN0ZWQgbXVsdGlwbGUgcmVuZGVyZXJzIGNvbmN1cnJlbnRseSByZW5kZXJpbmcgdGhlICcgKyAnc2FtZSBjb250ZXh0IHByb3ZpZGVyLiBUaGlzIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZC4nKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID0gcmVuZGVyZXJTaWdpbDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvcFByb3ZpZGVyKGNvbnRleHQsIHByb3ZpZGVyRmliZXIpIHtcbiAgdmFyIGN1cnJlbnRWYWx1ZSA9IHZhbHVlQ3Vyc29yLmN1cnJlbnQ7XG4gIHBvcCh2YWx1ZUN1cnNvciwgcHJvdmlkZXJGaWJlcik7XG5cbiAge1xuICAgIHtcbiAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgocGFyZW50LCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KSB7XG4gIC8vIFVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMgb2YgYWxsIHRoZSBhbmNlc3RvcnMsIGluY2x1ZGluZyB0aGUgYWx0ZXJuYXRlcy5cbiAgdmFyIG5vZGUgPSBwYXJlbnQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gbm9kZS5hbHRlcm5hdGU7XG5cbiAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgbm9kZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiAhaXNTdWJzZXRPZkxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBwcm9wYWdhdGlvblJvb3QpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBpZiAobm9kZSAhPT0gcHJvcGFnYXRpb25Sb290KSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJvcGFnYXRpb24gcm9vdCB3aGVuIHNjaGVkdWxpbmcgY29udGV4dCB3b3JrLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZV9lYWdlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VfZWFnZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKSB7XG5cbiAgdmFyIGZpYmVyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgaWYgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgZmliZXIucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIH1cblxuICB3aGlsZSAoZmliZXIgIT09IG51bGwpIHtcbiAgICB2YXIgbmV4dEZpYmVyID0gdm9pZCAwOyAvLyBWaXNpdCB0aGlzIGZpYmVyLlxuXG4gICAgdmFyIGxpc3QgPSBmaWJlci5kZXBlbmRlbmNpZXM7XG5cbiAgICBpZiAobGlzdCAhPT0gbnVsbCkge1xuICAgICAgbmV4dEZpYmVyID0gZmliZXIuY2hpbGQ7XG4gICAgICB2YXIgZGVwZW5kZW5jeSA9IGxpc3QuZmlyc3RDb250ZXh0O1xuXG4gICAgICB3aGlsZSAoZGVwZW5kZW5jeSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgY29udGV4dCBtYXRjaGVzLlxuICAgICAgICBpZiAoZGVwZW5kZW5jeS5jb250ZXh0ID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgLy8gTWF0Y2ghIFNjaGVkdWxlIGFuIHVwZGF0ZSBvbiB0aGlzIGZpYmVyLlxuICAgICAgICAgIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAvLyBTY2hlZHVsZSBhIGZvcmNlIHVwZGF0ZSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcy5cbiAgICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocmVuZGVyTGFuZXMpO1xuICAgICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gICAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7IC8vIFRPRE86IEJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIHdvcmstaW4tcHJvZ3Jlc3MsIHRoaXMgd2lsbCBhZGQgdGhlXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG8gdGhlIGN1cnJlbnQgZmliZXIsIHRvbywgd2hpY2ggbWVhbnMgaXQgd2lsbCBwZXJzaXN0IGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoaXMgcmVuZGVyIGlzIHRocm93biBhd2F5LiBTaW5jZSBpdCdzIGEgcmFjZSBjb25kaXRpb24sIG5vdCBzdXJlIGl0J3NcbiAgICAgICAgICAgIC8vIHdvcnRoIGZpeGluZy5cbiAgICAgICAgICAgIC8vIElubGluZWQgYGVucXVldWVVcGRhdGVgIHRvIHJlbW92ZSBpbnRlcmxlYXZlZCB1cGRhdGUgY2hlY2tcblxuICAgICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkgOyBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuICAgICAgICAgICAgICB2YXIgcGVuZGluZyA9IHNoYXJlZFF1ZXVlLnBlbmRpbmc7XG5cbiAgICAgICAgICAgICAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICAgICAgICAgICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgICAgICAgICAgICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2hhcmVkUXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKGZpYmVyLnJldHVybiwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTsgLy8gTWFyayB0aGUgdXBkYXRlZCBsYW5lcyBvbiB0aGUgbGlzdCwgdG9vLlxuXG4gICAgICAgICAgbGlzdC5sYW5lcyA9IG1lcmdlTGFuZXMobGlzdC5sYW5lcywgcmVuZGVyTGFuZXMpOyAvLyBTaW5jZSB3ZSBhbHJlYWR5IGZvdW5kIGEgbWF0Y2gsIHdlIGNhbiBzdG9wIHRyYXZlcnNpbmcgdGhlXG4gICAgICAgICAgLy8gZGVwZW5kZW5jeSBsaXN0LlxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jeS5uZXh0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBDb250ZXh0UHJvdmlkZXIpIHtcbiAgICAgIC8vIERvbid0IHNjYW4gZGVlcGVyIGlmIHRoaXMgaXMgYSBtYXRjaGluZyBwcm92aWRlclxuICAgICAgbmV4dEZpYmVyID0gZmliZXIudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MudHlwZSA/IG51bGwgOiBmaWJlci5jaGlsZDtcbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gRGVoeWRyYXRlZEZyYWdtZW50KSB7XG4gICAgICAvLyBJZiBhIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgaXMgaW4gdGhpcyBzdWJ0cmVlLCB3ZSBkb24ndCBrbm93XG4gICAgICAvLyBpZiBpdCB3aWxsIGhhdmUgYW55IGNvbnRleHQgY29uc3VtZXJzIGluIGl0LiBUaGUgYmVzdCB3ZSBjYW4gZG8gaXNcbiAgICAgIC8vIG1hcmsgaXQgYXMgaGF2aW5nIHVwZGF0ZXMuXG4gICAgICB2YXIgcGFyZW50U3VzcGVuc2UgPSBmaWJlci5yZXR1cm47XG5cbiAgICAgIGlmIChwYXJlbnRTdXNwZW5zZSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIGp1c3QgY2FtZSBmcm9tIGEgcGFyZW50IHNvIHdlIG11c3QgaGF2ZSBoYWQgYSBwYXJlbnQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHBhcmVudFN1c3BlbnNlLmxhbmVzID0gbWVyZ2VMYW5lcyhwYXJlbnRTdXNwZW5zZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9hbHRlcm5hdGUgPSBwYXJlbnRTdXNwZW5zZS5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChfYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgIF9hbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKF9hbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IHBhc3NpbmcgdGhpcyBmaWJlciBhcyB0aGUgcGFyZW50XG4gICAgICAvLyBiZWNhdXNlIHdlIHdhbnQgdG8gc2NoZWR1bGUgdGhpcyBmaWJlciBhcyBoYXZpbmcgd29ya1xuICAgICAgLy8gb24gaXRzIGNoaWxkcmVuLiBXZSdsbCB1c2UgdGhlIGNoaWxkTGFuZXMgb25cbiAgICAgIC8vIHRoaXMgZmliZXIgdG8gaW5kaWNhdGUgdGhhdCBhIGNvbnRleHQgaGFzIGNoYW5nZWQuXG5cblxuICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChwYXJlbnRTdXNwZW5zZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnNpYmxpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYXZlcnNlIGRvd24uXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICB9XG5cbiAgICBpZiAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgIG5leHRGaWJlci5yZXR1cm4gPSBmaWJlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2hpbGQuIFRyYXZlcnNlIHRvIG5leHQgc2libGluZy5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyO1xuXG4gICAgICB3aGlsZSAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChuZXh0RmliZXIgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmFjayB0byB0aGUgcm9vdCBvZiB0aGlzIHN1YnRyZWUuIEV4aXQuXG4gICAgICAgICAgbmV4dEZpYmVyID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaWJsaW5nID0gbmV4dEZpYmVyLnNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBzaWJsaW5nIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgICAgIHNpYmxpbmcucmV0dXJuID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgICAgICBuZXh0RmliZXIgPSBzaWJsaW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIE5vIG1vcmUgc2libGluZ3MuIFRyYXZlcnNlIHVwLlxuXG5cbiAgICAgICAgbmV4dEZpYmVyID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlciA9IG5leHRGaWJlcjtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG4gIHZhciBkZXBlbmRlbmNpZXMgPSB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXM7XG5cbiAgaWYgKGRlcGVuZGVuY2llcyAhPT0gbnVsbCkge1xuICAgIHtcbiAgICAgIHZhciBmaXJzdENvbnRleHQgPSBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0O1xuXG4gICAgICBpZiAoZmlyc3RDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKGRlcGVuZGVuY2llcy5sYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICAgICAgLy8gQ29udGV4dCBsaXN0IGhhcyBhIHBlbmRpbmcgdXBkYXRlLiBNYXJrIHRoYXQgdGhpcyBmaWJlciBwZXJmb3JtZWQgd29yay5cbiAgICAgICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgICAgICB9IC8vIFJlc2V0IHRoZSB3b3JrLWluLXByb2dyZXNzIGxpc3RcblxuXG4gICAgICAgIGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVhZENvbnRleHQoY29udGV4dCkge1xuICB7XG4gICAgLy8gVGhpcyB3YXJuaW5nIHdvdWxkIGZpcmUgaWYgeW91IHJlYWQgY29udGV4dCBpbnNpZGUgYSBIb29rIGxpa2UgdXNlTWVtby5cbiAgICAvLyBVbmxpa2UgdGhlIGNsYXNzIGNoZWNrIGJlbG93LCBpdCdzIG5vdCBlbmZvcmNlZCBpbiBwcm9kdWN0aW9uIGZvciBwZXJmLlxuICAgIGlmIChpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKSB7XG4gICAgICBlcnJvcignQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHZhbHVlID0gIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA7XG5cbiAgaWYgKGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9PT0gY29udGV4dCkgOyBlbHNlIHtcbiAgICB2YXIgY29udGV4dEl0ZW0gPSB7XG4gICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgbWVtb2l6ZWRWYWx1ZTogdmFsdWUsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmIChsYXN0Q29udGV4dERlcGVuZGVuY3kgPT09IG51bGwpIHtcbiAgICAgIGlmIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICAgICAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCBkZXBlbmRlbmN5IGZvciB0aGlzIGNvbXBvbmVudC4gQ3JlYXRlIGEgbmV3IGxpc3QuXG5cblxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY29udGV4dEl0ZW07XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5kZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBmaXJzdENvbnRleHQ6IGNvbnRleHRJdGVtXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgYSBuZXcgY29udGV4dCBpdGVtLlxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbGFzdENvbnRleHREZXBlbmRlbmN5Lm5leHQgPSBjb250ZXh0SXRlbTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJlbmRlci4gV2hlbiB0aGlzIHJlbmRlciBleGl0cywgZWl0aGVyIGJlY2F1c2UgaXQgZmluaXNoZXMgb3IgYmVjYXVzZSBpdCBpc1xuLy8gaW50ZXJydXB0ZWQsIHRoZSBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGwgYmUgdHJhbnNmZXJyZWQgb250byB0aGUgbWFpbiBwYXJ0XG4vLyBvZiB0aGUgcXVldWUuXG5cbnZhciBjb25jdXJyZW50UXVldWVzID0gbnVsbDtcbmZ1bmN0aW9uIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpIHtcbiAgaWYgKGNvbmN1cnJlbnRRdWV1ZXMgPT09IG51bGwpIHtcbiAgICBjb25jdXJyZW50UXVldWVzID0gW3F1ZXVlXTtcbiAgfSBlbHNlIHtcbiAgICBjb25jdXJyZW50UXVldWVzLnB1c2gocXVldWUpO1xuICB9XG59XG5mdW5jdGlvbiBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCkge1xuICAvLyBUcmFuc2ZlciB0aGUgaW50ZXJsZWF2ZWQgdXBkYXRlcyBvbnRvIHRoZSBtYWluIHF1ZXVlLiBFYWNoIHF1ZXVlIGhhcyBhXG4gIC8vIGBwZW5kaW5nYCBmaWVsZCBhbmQgYW4gYGludGVybGVhdmVkYCBmaWVsZC4gV2hlbiB0aGV5IGFyZSBub3QgbnVsbCwgdGhleVxuICAvLyBwb2ludCB0byB0aGUgbGFzdCBub2RlIGluIGEgY2lyY3VsYXIgbGlua2VkIGxpc3QuIFdlIG5lZWQgdG8gYXBwZW5kIHRoZVxuICAvLyBpbnRlcmxlYXZlZCBsaXN0IHRvIHRoZSBlbmQgb2YgdGhlIHBlbmRpbmcgbGlzdCBieSBqb2luaW5nIHRoZW0gaW50byBhXG4gIC8vIHNpbmdsZSwgY2lyY3VsYXIgbGlzdC5cbiAgaWYgKGNvbmN1cnJlbnRRdWV1ZXMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmN1cnJlbnRRdWV1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWV1ZSA9IGNvbmN1cnJlbnRRdWV1ZXNbaV07XG4gICAgICB2YXIgbGFzdEludGVybGVhdmVkVXBkYXRlID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGlmIChsYXN0SW50ZXJsZWF2ZWRVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgcXVldWUuaW50ZXJsZWF2ZWQgPSBudWxsO1xuICAgICAgICB2YXIgZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IGxhc3RJbnRlcmxlYXZlZFVwZGF0ZS5uZXh0O1xuICAgICAgICB2YXIgbGFzdFBlbmRpbmdVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gICAgICAgIGlmIChsYXN0UGVuZGluZ1VwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgICAgICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBmaXJzdEludGVybGVhdmVkVXBkYXRlO1xuICAgICAgICAgIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUucGVuZGluZyA9IGxhc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25jdXJyZW50UXVldWVzID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciBpbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG4gIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKSB7XG4gIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG59IC8vIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBvdXRzaWRlIHRoaXMgbW9kdWxlIHNob3VsZCBvbmx5IGJlIGRvbmUgZm9yIGJhY2t3YXJkc1xuLy8gY29tcGF0aWJpbGl0eSBhbmQgc2hvdWxkIGFsd2F5cyBiZSBhY2NvbXBhbmllZCBieSBhIHdhcm5pbmcuXG5cbnZhciB1bnNhZmVfbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdDtcblxuZnVuY3Rpb24gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Qoc291cmNlRmliZXIsIGxhbmUpIHtcbiAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgZmliZXIncyBsYW5lc1xuICBzb3VyY2VGaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoc291cmNlRmliZXIubGFuZXMsIGxhbmUpO1xuICB2YXIgYWx0ZXJuYXRlID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgbGFuZSk7XG4gIH1cblxuICB7XG4gICAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCAmJiAoc291cmNlRmliZXIuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgIH1cbiAgfSAvLyBXYWxrIHRoZSBwYXJlbnQgcGF0aCB0byB0aGUgcm9vdCBhbmQgdXBkYXRlIHRoZSBjaGlsZCBsYW5lcy5cblxuXG4gIHZhciBub2RlID0gc291cmNlRmliZXI7XG4gIHZhciBwYXJlbnQgPSBzb3VyY2VGaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIHBhcmVudC5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhwYXJlbnQuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgYWx0ZXJuYXRlID0gcGFyZW50LmFsdGVybmF0ZTtcblxuICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKChwYXJlbnQuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICB2YXIgcm9vdCA9IG5vZGUuc3RhdGVOb2RlO1xuICAgIHJldHVybiByb290O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7IC8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG5cbnZhciBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGU7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlO1xuXG57XG4gIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSBmYWxzZTtcbiAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBiYXNlU3RhdGU6IGZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgZmlyc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIHNoYXJlZDoge1xuICAgICAgcGVuZGluZzogbnVsbCxcbiAgICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgICAgbGFuZXM6IE5vTGFuZXNcbiAgICB9LFxuICAgIGVmZmVjdHM6IG51bGxcbiAgfTtcbiAgZmliZXIudXBkYXRlUXVldWUgPSBxdWV1ZTtcbn1cbmZ1bmN0aW9uIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gQ2xvbmUgdGhlIHVwZGF0ZSBxdWV1ZSBmcm9tIGN1cnJlbnQuIFVubGVzcyBpdCdzIGFscmVhZHkgYSBjbG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgdmFyIGNsb25lID0ge1xuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgZmlyc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlLFxuICAgICAgbGFzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZSxcbiAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgIGVmZmVjdHM6IGN1cnJlbnRRdWV1ZS5lZmZlY3RzXG4gICAgfTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGNsb25lO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgZXZlbnRUaW1lOiBldmVudFRpbWUsXG4gICAgbGFuZTogbGFuZSxcbiAgICB0YWc6IFVwZGF0ZVN0YXRlLFxuICAgIHBheWxvYWQ6IG51bGwsXG4gICAgY2FsbGJhY2s6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICByZXR1cm4gdXBkYXRlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIE9ubHkgb2NjdXJzIGlmIHRoZSBmaWJlciBoYXMgYmVlbiB1bm1vdW50ZWQuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAge1xuICAgIGlmIChjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPT09IHNoYXJlZFF1ZXVlICYmICFkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlKSB7XG4gICAgICBlcnJvcignQW4gdXBkYXRlIChzZXRTdGF0ZSwgcmVwbGFjZVN0YXRlLCBvciBmb3JjZVVwZGF0ZSkgd2FzIHNjaGVkdWxlZCAnICsgJ2Zyb20gaW5zaWRlIGFuIHVwZGF0ZSBmdW5jdGlvbi4gVXBkYXRlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHVyZSwgJyArICd3aXRoIHplcm8gc2lkZS1lZmZlY3RzLiBDb25zaWRlciB1c2luZyBjb21wb25lbnREaWRVcGRhdGUgb3IgYSAnICsgJ2NhbGxiYWNrLicpO1xuXG4gICAgICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNVbnNhZmVDbGFzc1JlbmRlclBoYXNlVXBkYXRlKCkpIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVuc2FmZSByZW5kZXIgcGhhc2UgdXBkYXRlLiBBZGQgZGlyZWN0bHkgdG8gdGhlIHVwZGF0ZVxuICAgIC8vIHF1ZXVlIHNvIHdlIGNhbiBwcm9jZXNzIGl0IGltbWVkaWF0ZWx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIuXG4gICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICB9XG5cbiAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlOyAvLyBVcGRhdGUgdGhlIGNoaWxkTGFuZXMgZXZlbiB0aG91Z2ggd2UncmUgbW9zdCBsaWtlbHkgYWxyZWFkeSByZW5kZXJpbmdcbiAgICAvLyB0aGlzIGZpYmVyLiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpbiB0aGUgY2FzZSB3aGVyZSB5b3VcbiAgICAvLyB1cGRhdGUgYSBkaWZmZXJlbnQgY29tcG9uZW50IGR1cmluZyByZW5kZXIgcGhhc2UgdGhhbiB0aGUgb25lIHRoYXQgaXNcbiAgICAvLyBjdXJyZW50bHkgcmVuZGVyaW5ncyAoYSBwYXR0ZXJuIHRoYXQgaXMgYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nKS5cblxuICAgIHJldHVybiB1bnNhZmVfbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbnF1ZXVlQ29uY3VycmVudENsYXNzVXBkYXRlKGZpYmVyLCBzaGFyZWRRdWV1ZSwgdXBkYXRlLCBsYW5lKTtcbiAgfVxufVxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSkge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBPbmx5IG9jY3VycyBpZiB0aGUgZmliZXIgaGFzIGJlZW4gdW5tb3VudGVkLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcblxuICBpZiAoaXNUcmFuc2l0aW9uTGFuZShsYW5lKSkge1xuICAgIHZhciBxdWV1ZUxhbmVzID0gc2hhcmVkUXVldWUubGFuZXM7IC8vIElmIGFueSBlbnRhbmdsZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBwZW5kaW5nIG9uIHRoZSByb290LCB0aGVuIHRoZXkgbXVzdFxuICAgIC8vIGhhdmUgZmluaXNoZWQuIFdlIGNhbiByZW1vdmUgdGhlbSBmcm9tIHRoZSBzaGFyZWQgcXVldWUsIHdoaWNoIHJlcHJlc2VudHNcbiAgICAvLyBhIHN1cGVyc2V0IG9mIHRoZSBhY3R1YWxseSBwZW5kaW5nIGxhbmVzLiBJbiBzb21lIGNhc2VzIHdlIG1heSBlbnRhbmdsZVxuICAgIC8vIG1vcmUgdGhhbiB3ZSBuZWVkIHRvLCBidXQgdGhhdCdzIE9LLiBJbiBmYWN0IGl0J3Mgd29yc2UgaWYgd2UgKmRvbid0KlxuICAgIC8vIGVudGFuZ2xlIHdoZW4gd2Ugc2hvdWxkLlxuXG4gICAgcXVldWVMYW5lcyA9IGludGVyc2VjdExhbmVzKHF1ZXVlTGFuZXMsIHJvb3QucGVuZGluZ0xhbmVzKTsgLy8gRW50YW5nbGUgdGhlIG5ldyB0cmFuc2l0aW9uIGxhbmUgd2l0aCB0aGUgb3RoZXIgdHJhbnNpdGlvbiBsYW5lcy5cblxuICAgIHZhciBuZXdRdWV1ZUxhbmVzID0gbWVyZ2VMYW5lcyhxdWV1ZUxhbmVzLCBsYW5lKTtcbiAgICBzaGFyZWRRdWV1ZS5sYW5lcyA9IG5ld1F1ZXVlTGFuZXM7IC8vIEV2ZW4gaWYgcXVldWUubGFuZXMgYWxyZWFkeSBpbmNsdWRlIGxhbmUsIHdlIGRvbid0IGtub3cgZm9yIGNlcnRhaW4gaWZcbiAgICAvLyB0aGUgbGFuZSBmaW5pc2hlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIGVudGFuZ2xlZCBpdC4gU28gd2UgbmVlZCB0b1xuICAgIC8vIGVudGFuZ2xlIGl0IGFnYWluLCBqdXN0IHRvIGJlIHN1cmUuXG5cbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBuZXdRdWV1ZUxhbmVzKTtcbiAgfVxufVxuZnVuY3Rpb24gZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBjYXB0dXJlZFVwZGF0ZSkge1xuICAvLyBDYXB0dXJlZCB1cGRhdGVzIGFyZSB1cGRhdGVzIHRoYXQgYXJlIHRocm93biBieSBhIGNoaWxkIGR1cmluZyB0aGUgcmVuZGVyXG4gIC8vIHBoYXNlLiBUaGV5IHNob3VsZCBiZSBkaXNjYXJkZWQgaWYgdGhlIHJlbmRlciBpcyBhYm9ydGVkLiBUaGVyZWZvcmUsXG4gIC8vIHdlIHNob3VsZCBvbmx5IHB1dCB0aGVtIG9uIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlLCBub3QgdGhlIGN1cnJlbnQgb25lLlxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsgLy8gQ2hlY2sgaWYgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaXMgYSBjbG9uZS5cblxuICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuXG4gICAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHtcbiAgICAgIC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQuIFRoaXMgaGFwcGVucyB3aGVuXG4gICAgICAvLyB3ZSBiYWlsIG91dCBvbiBhIHBhcmVudCBmaWJlciB0aGF0IHRoZW4gY2FwdHVyZXMgYW4gZXJyb3IgdGhyb3duIGJ5XG4gICAgICAvLyBhIGNoaWxkLiBTaW5jZSB3ZSB3YW50IHRvIGFwcGVuZCB0aGUgdXBkYXRlIG9ubHkgdG8gdGhlIHdvcmstaW5cbiAgICAgIC8vIC1wcm9ncmVzcyBxdWV1ZSwgd2UgbmVlZCB0byBjbG9uZSB0aGUgdXBkYXRlcy4gV2UgdXN1YWxseSBjbG9uZSBkdXJpbmdcbiAgICAgIC8vIHByb2Nlc3NVcGRhdGVRdWV1ZSwgYnV0IHRoYXQgZGlkbid0IGhhcHBlbiBpbiB0aGlzIGNhc2UgYmVjYXVzZSB3ZVxuICAgICAgLy8gc2tpcHBlZCBvdmVyIHRoZSBwYXJlbnQgd2hlbiB3ZSBiYWlsZWQgb3V0LlxuICAgICAgdmFyIG5ld0ZpcnN0ID0gbnVsbDtcbiAgICAgIHZhciBuZXdMYXN0ID0gbnVsbDtcbiAgICAgIHZhciBmaXJzdEJhc2VVcGRhdGUgPSBxdWV1ZS5maXJzdEJhc2VVcGRhdGU7XG5cbiAgICAgIGlmIChmaXJzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSB1cGRhdGVzIGFuZCBjbG9uZSB0aGVtLlxuICAgICAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZS5ldmVudFRpbWUsXG4gICAgICAgICAgICBsYW5lOiB1cGRhdGUubGFuZSxcbiAgICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNsb25lO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjbG9uZTtcbiAgICAgICAgICAgIG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICAgICAgfSB3aGlsZSAodXBkYXRlICE9PSBudWxsKTsgLy8gQXBwZW5kIHRoZSBjYXB0dXJlZCB1cGRhdGUgdGhlIGVuZCBvZiB0aGUgY2xvbmVkIGxpc3QuXG5cblxuICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICAgIG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIG5vIGJhc2UgdXBkYXRlcy5cbiAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlID0ge1xuICAgICAgICBiYXNlU3RhdGU6IGN1cnJlbnRRdWV1ZS5iYXNlU3RhdGUsXG4gICAgICAgIGZpcnN0QmFzZVVwZGF0ZTogbmV3Rmlyc3QsXG4gICAgICAgIGxhc3RCYXNlVXBkYXRlOiBuZXdMYXN0LFxuICAgICAgICBzaGFyZWQ6IGN1cnJlbnRRdWV1ZS5zaGFyZWQsXG4gICAgICAgIGVmZmVjdHM6IGN1cnJlbnRRdWV1ZS5lZmZlY3RzXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBxdWV1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gLy8gQXBwZW5kIHRoZSB1cGRhdGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cblxuXG4gIHZhciBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlO1xuXG4gIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgIHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIGxhc3RCYXNlVXBkYXRlLm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMsIGluc3RhbmNlKSB7XG4gIHN3aXRjaCAodXBkYXRlLnRhZykge1xuICAgIGNhc2UgUmVwbGFjZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIFVwZGF0ZXIgZnVuY3Rpb25cbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHBheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgICAgICB9IC8vIFN0YXRlIG9iamVjdFxuXG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENhcHR1cmVVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICB9XG4gICAgLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2hcblxuICAgIGNhc2UgVXBkYXRlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuICAgICAgICB2YXIgcGFydGlhbFN0YXRlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3BheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4aXREaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQYXJ0aWFsIHN0YXRlIG9iamVjdFxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIE51bGwgYW5kIHVuZGVmaW5lZCBhcmUgdHJlYXRlZCBhcyBuby1vcHMuXG4gICAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgICAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgICAgICAgcmV0dXJuIGFzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3JjZVVwZGF0ZTpcbiAgICAgIHtcbiAgICAgICAgaGFzRm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIHByZXZTdGF0ZTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBwcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZDtcbiAgfVxuXG4gIHZhciBmaXJzdEJhc2VVcGRhdGUgPSBxdWV1ZS5maXJzdEJhc2VVcGRhdGU7XG4gIHZhciBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlOyAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzLiBJZiBzbywgdHJhbnNmZXIgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmdRdWV1ZSAhPT0gbnVsbCkge1xuICAgIHF1ZXVlLnNoYXJlZC5wZW5kaW5nID0gbnVsbDsgLy8gVGhlIHBlbmRpbmcgcXVldWUgaXMgY2lyY3VsYXIuIERpc2Nvbm5lY3QgdGhlIHBvaW50ZXIgYmV0d2VlbiBmaXJzdFxuICAgIC8vIGFuZCBsYXN0IHNvIHRoYXQgaXQncyBub24tY2lyY3VsYXIuXG5cbiAgICB2YXIgbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7XG4gICAgdmFyIGZpcnN0UGVuZGluZ1VwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IG51bGw7IC8vIEFwcGVuZCBwZW5kaW5nIHVwZGF0ZXMgdG8gYmFzZSBxdWV1ZVxuXG4gICAgaWYgKGxhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICBmaXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgfVxuXG4gICAgbGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTsgLy8gSWYgdGhlcmUncyBhIGN1cnJlbnQgcXVldWUsIGFuZCBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBiYXNlIHF1ZXVlLCB0aGVuXG4gICAgLy8gd2UgbmVlZCB0byB0cmFuc2ZlciB0aGUgdXBkYXRlcyB0byB0aGF0IHF1ZXVlLCB0b28uIEJlY2F1c2UgdGhlIGJhc2VcbiAgICAvLyBxdWV1ZSBpcyBhIHNpbmdseS1saW5rZWQgbGlzdCB3aXRoIG5vIGN5Y2xlcywgd2UgY2FuIGFwcGVuZCB0byBib3RoXG4gICAgLy8gbGlzdHMgYW5kIHRha2UgYWR2YW50YWdlIG9mIHN0cnVjdHVyYWwgc2hhcmluZy5cbiAgICAvLyBUT0RPOiBQYXNzIGBjdXJyZW50YCBhcyBhcmd1bWVudFxuXG4gICAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhbHdheXMgbm9uLW51bGwgb24gYSBDbGFzc0NvbXBvbmVudCBvciBIb3N0Um9vdFxuICAgICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG4gICAgICB2YXIgY3VycmVudExhc3RCYXNlVXBkYXRlID0gY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoY3VycmVudExhc3RCYXNlVXBkYXRlICE9PSBsYXN0QmFzZVVwZGF0ZSkge1xuICAgICAgICBpZiAoY3VycmVudExhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgY3VycmVudFF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50TGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBUaGVzZSB2YWx1ZXMgbWF5IGNoYW5nZSBhcyB3ZSBwcm9jZXNzIHRoZSBxdWV1ZS5cblxuXG4gIGlmIChmaXJzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgdXBkYXRlcyB0byBjb21wdXRlIHRoZSByZXN1bHQuXG4gICAgdmFyIG5ld1N0YXRlID0gcXVldWUuYmFzZVN0YXRlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIGFjY3VtdWxhdGUgdGhpcy4gSW5zdGVhZCwgd2UgY2FuIHJlbW92ZSByZW5kZXJMYW5lc1xuICAgIC8vIGZyb20gdGhlIG9yaWdpbmFsIGxhbmVzLlxuXG4gICAgdmFyIG5ld0xhbmVzID0gTm9MYW5lcztcbiAgICB2YXIgbmV3QmFzZVN0YXRlID0gbnVsbDtcbiAgICB2YXIgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgbmV3TGFzdEJhc2VVcGRhdGUgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lO1xuICAgICAgdmFyIHVwZGF0ZUV2ZW50VGltZSA9IHVwZGF0ZS5ldmVudFRpbWU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZSA9IGNsb25lO1xuICAgICAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xhc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cblxuXG4gICAgICAgIG5ld0xhbmVzID0gbWVyZ2VMYW5lcyhuZXdMYW5lcywgdXBkYXRlTGFuZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIGhhdmUgc3VmZmljaWVudCBwcmlvcml0eS5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9jbG9uZSA9IHtcbiAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLFxuICAgICAgICAgICAgLy8gVGhpcyB1cGRhdGUgaXMgZ29pbmcgdG8gYmUgY29tbWl0dGVkIHNvIHdlIG5ldmVyIHdhbnQgdW5jb21taXRcbiAgICAgICAgICAgIC8vIGl0LiBVc2luZyBOb0xhbmUgd29ya3MgYmVjYXVzZSAwIGlzIGEgc3Vic2V0IG9mIGFsbCBiaXRtYXNrcywgc29cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBuZXZlciBiZSBza2lwcGVkIGJ5IHRoZSBjaGVjayBhYm92ZS5cbiAgICAgICAgICAgIGxhbmU6IE5vTGFuZSxcbiAgICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0xhc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUubmV4dCA9IF9jbG9uZTtcbiAgICAgICAgfSAvLyBQcm9jZXNzIHRoaXMgdXBkYXRlLlxuXG5cbiAgICAgICAgbmV3U3RhdGUgPSBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIG5ld1N0YXRlLCBwcm9wcywgaW5zdGFuY2UpO1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB1cGRhdGUuY2FsbGJhY2s7XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsICYmIC8vIElmIHRoZSB1cGRhdGUgd2FzIGFscmVhZHkgY29tbWl0dGVkLCB3ZSBzaG91bGQgbm90IHF1ZXVlIGl0c1xuICAgICAgICAvLyBjYWxsYmFjayBhZ2Fpbi5cbiAgICAgICAgdXBkYXRlLmxhbmUgIT09IE5vTGFuZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENhbGxiYWNrO1xuICAgICAgICAgIHZhciBlZmZlY3RzID0gcXVldWUuZWZmZWN0cztcblxuICAgICAgICAgIGlmIChlZmZlY3RzID09PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZS5lZmZlY3RzID0gW3VwZGF0ZV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaCh1cGRhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcblxuICAgICAgaWYgKHVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcblxuICAgICAgICBpZiAocGVuZGluZ1F1ZXVlID09PSBudWxsKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgZnJvbSBpbnNpZGUgYSByZWR1Y2VyLiBBZGQgdGhlIG5ld1xuICAgICAgICAgIC8vIHBlbmRpbmcgdXBkYXRlcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCBrZWVwIHByb2Nlc3NpbmcuXG4gICAgICAgICAgdmFyIF9sYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTsgLy8gSW50ZW50aW9uYWxseSB1bnNvdW5kLiBQZW5kaW5nIHVwZGF0ZXMgZm9ybSBhIGNpcmN1bGFyIGxpc3QsIGJ1dCB3ZVxuICAgICAgICAgIC8vIHVucmF2ZWwgdGhlbSB3aGVuIHRyYW5zZmVycmluZyB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuXG4gICAgICAgICAgdmFyIF9maXJzdFBlbmRpbmdVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBfbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IG51bGw7XG4gICAgICAgICAgdXBkYXRlID0gX2ZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IF9sYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlICh0cnVlKTtcblxuICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcXVldWUuYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICAgIHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IG5ld0ZpcnN0QmFzZVVwZGF0ZTtcbiAgICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlOyAvLyBJbnRlcmxlYXZlZCB1cGRhdGVzIGFyZSBzdG9yZWQgb24gYSBzZXBhcmF0ZSBxdWV1ZS4gV2UgYXJlbid0IGdvaW5nIHRvXG4gICAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXNcbiAgICAvLyBhcmUgcmVtYWluaW5nLlxuXG4gICAgdmFyIGxhc3RJbnRlcmxlYXZlZCA9IHF1ZXVlLnNoYXJlZC5pbnRlcmxlYXZlZDtcblxuICAgIGlmIChsYXN0SW50ZXJsZWF2ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbnRlcmxlYXZlZCA9IGxhc3RJbnRlcmxlYXZlZDtcblxuICAgICAgZG8ge1xuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIGludGVybGVhdmVkLmxhbmUpO1xuICAgICAgICBpbnRlcmxlYXZlZCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgICB9IHdoaWxlIChpbnRlcmxlYXZlZCAhPT0gbGFzdEludGVybGVhdmVkKTtcbiAgICB9IGVsc2UgaWYgKGZpcnN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gYHF1ZXVlLmxhbmVzYCBpcyB1c2VkIGZvciBlbnRhbmdsaW5nIHRyYW5zaXRpb25zLiBXZSBjYW4gc2V0IGl0IGJhY2sgdG9cbiAgICAgIC8vIHplcm8gb25jZSB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgICBxdWV1ZS5zaGFyZWQubGFuZXMgPSBOb0xhbmVzO1xuICAgIH0gLy8gU2V0IHRoZSByZW1haW5pbmcgZXhwaXJhdGlvbiB0aW1lIHRvIGJlIHdoYXRldmVyIGlzIHJlbWFpbmluZyBpbiB0aGUgcXVldWUuXG4gICAgLy8gVGhpcyBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHRoZSBvbmx5IHR3byBvdGhlciB0aGluZ3MgdGhhdCBjb250cmlidXRlIHRvXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lIGFyZSBwcm9wcyBhbmQgY29udGV4dC4gV2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIHRoZVxuICAgIC8vIGJlZ2luIHBoYXNlIGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBzbyB3ZSd2ZSBhbHJlYWR5XG4gICAgLy8gZGVhbHQgd2l0aCB0aGUgcHJvcHMuIENvbnRleHQgaW4gY29tcG9uZW50cyB0aGF0IHNwZWNpZnlcbiAgICAvLyBzaG91bGRDb21wb25lbnRVcGRhdGUgaXMgdHJpY2t5OyBidXQgd2UnbGwgaGF2ZSB0byBhY2NvdW50IGZvclxuICAgIC8vIHRoYXQgcmVnYXJkbGVzcy5cblxuXG4gICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhuZXdMYW5lcyk7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBuZXdMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICB7XG4gICAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgYXMgY2FsbGJhY2suIEV4cGVjdGVkIGEgZnVuY3Rpb24uIEluc3RlYWQgJyArIChcInJlY2VpdmVkOiBcIiArIGNhbGxiYWNrKSk7XG4gIH1cblxuICBjYWxsYmFjay5jYWxsKGNvbnRleHQpO1xufVxuXG5mdW5jdGlvbiByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpIHtcbiAgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB7XG4gIHJldHVybiBoYXNGb3JjZVVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgZmluaXNoZWRRdWV1ZSwgaW5zdGFuY2UpIHtcbiAgLy8gQ29tbWl0IHRoZSBlZmZlY3RzXG4gIHZhciBlZmZlY3RzID0gZmluaXNoZWRRdWV1ZS5lZmZlY3RzO1xuICBmaW5pc2hlZFF1ZXVlLmVmZmVjdHMgPSBudWxsO1xuXG4gIGlmIChlZmZlY3RzICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZmZlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWZmZWN0ID0gZWZmZWN0c1tpXTtcbiAgICAgIHZhciBjYWxsYmFjayA9IGVmZmVjdC5jYWxsYmFjaztcblxuICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgIGVmZmVjdC5jYWxsYmFjayA9IG51bGw7XG4gICAgICAgIGNhbGxDYWxsYmFjayhjYWxsYmFjaywgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgTk9fQ09OVEVYVCA9IHt9O1xudmFyIGNvbnRleHRTdGFja0N1cnNvciQxID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xuXG5mdW5jdGlvbiByZXF1aXJlZENvbnRleHQoYykge1xuICBpZiAoYyA9PT0gTk9fQ09OVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgaG9zdCBjb250ZXh0IHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7IC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG5cbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgTk9fQ09OVEVYVCwgZmliZXIpO1xuICB2YXIgbmV4dFJvb3RDb250ZXh0ID0gZ2V0Um9vdEhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpOyAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0aHJvdywgcmVwbGFjZSBpdC5cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dFJvb3RDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250YWluZXIoZmliZXIpIHtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xuICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICB2YXIgbmV4dENvbnRleHQgPSBnZXRDaGlsZEhvc3RDb250ZXh0KGNvbnRleHQsIGZpYmVyLnR5cGUpOyAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS5cblxuICBpZiAoY29udGV4dCA9PT0gbmV4dENvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGV4dChmaWJlcikge1xuICAvLyBEbyBub3QgcG9wIHVubGVzcyB0aGlzIEZpYmVyIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gIC8vIHB1c2hIb3N0Q29udGV4dCgpIG9ubHkgcHVzaGVzIEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuICBpZiAoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZmliZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbnZhciBEZWZhdWx0U3VzcGVuc2VDb250ZXh0ID0gMDsgLy8gVGhlIFN1c3BlbnNlIENvbnRleHQgaXMgc3BsaXQgaW50byB0d28gcGFydHMuIFRoZSBsb3dlciBiaXRzIGlzXG4vLyBpbmhlcml0ZWQgZGVlcGx5IGRvd24gdGhlIHN1YnRyZWUuIFRoZSB1cHBlciBiaXRzIG9ubHkgYWZmZWN0XG4vLyB0aGlzIGltbWVkaWF0ZSBzdXNwZW5zZSBib3VuZGFyeSBhbmQgZ2V0cyByZXNldCBlYWNoIG5ld1xuLy8gYm91bmRhcnkgb3Igc3VzcGVuc2UgbGlzdC5cblxudmFyIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrID0gMTsgLy8gU3VidHJlZSBGbGFnczpcbi8vIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCBpbmRpY2F0ZXMgdGhhdCBvbmUgb2Ygb3VyIHBhcmVudCBTdXNwZW5zZVxuLy8gYm91bmRhcmllcyBpcyBub3QgY3VycmVudGx5IHNob3dpbmcgdmlzaWJsZSBtYWluIGNvbnRlbnQuXG4vLyBFaXRoZXIgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBvciBpcyBub3QgbW91bnRlZCBhdCBhbGwuXG4vLyBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlc2lyYWJsZSB0byB0cmlnZ2VyIGEgZmFsbGJhY2sgYXRcbi8vIHRoZSBwYXJlbnQuIElmIG5vdCwgdGhlbiB3ZSBtaWdodCBuZWVkIHRvIHRyaWdnZXIgdW5kZXNpcmFibGUgYm91bmRhcmllc1xuLy8gYW5kL29yIHN1c3BlbmQgdGhlIGNvbW1pdCB0byBhdm9pZCBoaWRpbmcgdGhlIHBhcmVudCBjb250ZW50LlxuXG52YXIgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0ID0gMTsgLy8gU2hhbGxvdyBGbGFnczpcbi8vIEZvcmNlU3VzcGVuc2VGYWxsYmFjayBjYW4gYmUgdXNlZCBieSBTdXNwZW5zZUxpc3QgdG8gZm9yY2UgbmV3bHkgYWRkZWRcbi8vIGl0ZW1zIGludG8gdGhlaXIgZmFsbGJhY2sgc3RhdGUgZHVyaW5nIG9uZSBvZiB0aGUgcmVuZGVyIHBhc3Nlcy5cblxudmFyIEZvcmNlU3VzcGVuc2VGYWxsYmFjayA9IDI7XG52YXIgc3VzcGVuc2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihEZWZhdWx0U3VzcGVuc2VDb250ZXh0KTtcbmZ1bmN0aW9uIGhhc1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBmbGFnKSB7XG4gIHJldHVybiAocGFyZW50Q29udGV4dCAmIGZsYWcpICE9PSAwO1xufVxuZnVuY3Rpb24gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrO1xufVxuZnVuY3Rpb24gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzaGFsbG93Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrIHwgc2hhbGxvd0NvbnRleHQ7XG59XG5mdW5jdGlvbiBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHN1YnRyZWVDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0IHwgc3VidHJlZUNvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoU3VzcGVuc2VDb250ZXh0KGZpYmVyLCBuZXdDb250ZXh0KSB7XG4gIHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgbmV3Q29udGV4dCwgZmliZXIpO1xufVxuZnVuY3Rpb24gcG9wU3VzcGVuc2VDb250ZXh0KGZpYmVyKSB7XG4gIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhcHR1cmVTdXNwZW5zZSh3b3JrSW5Qcm9ncmVzcywgaGFzSW52aXNpYmxlUGFyZW50KSB7XG4gIC8vIElmIGl0IHdhcyB0aGUgcHJpbWFyeSBjaGlsZHJlbiB0aGF0IGp1c3Qgc3VzcGVuZGVkLCBjYXB0dXJlIGFuZCByZW5kZXIgdGhlXG4gIC8vIGZhbGxiYWNrLiBPdGhlcndpc2UsIGRvbid0IGNhcHR1cmUgYW5kIGJ1YmJsZSB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFsd2F5cyBjYXB0dXJlcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7IC8vIFJlZ3VsYXIgYm91bmRhcmllcyBhbHdheXMgY2FwdHVyZS5cblxuICB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gSWYgaXQncyBhIGJvdW5kYXJ5IHdlIHNob3VsZCBhdm9pZCwgdGhlbiB3ZSBwcmVmZXIgdG8gYnViYmxlIHVwIHRvIHRoZVxufVxuZnVuY3Rpb24gZmluZEZpcnN0U3VzcGVuZGVkKHJvdykge1xuICB2YXIgbm9kZSA9IHJvdztcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IG5vZGUubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgICBpZiAoZGVoeWRyYXRlZCA9PT0gbnVsbCB8fCBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGRlaHlkcmF0ZWQpIHx8IGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGRlaHlkcmF0ZWQpKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQgJiYgLy8gcmV2ZWFsT3JkZXIgdW5kZWZpbmVkIGNhbid0IGJlIHRydXN0ZWQgYmVjYXVzZSBpdCBkb24ndFxuICAgIC8vIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBpdCBzdXNwZW5kZWQgb3Igbm90LlxuICAgIG5vZGUubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZGlkU3VzcGVuZCA9IChub2RlLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgIGlmIChkaWRTdXNwZW5kKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcm93KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHJvdykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBOb0ZsYWdzJDEgPVxuLyogICAqL1xuMDsgLy8gUmVwcmVzZW50cyB3aGV0aGVyIGVmZmVjdCBzaG91bGQgZmlyZS5cblxudmFyIEhhc0VmZmVjdCA9XG4vKiAqL1xuMTsgLy8gUmVwcmVzZW50cyB0aGUgcGhhc2UgaW4gd2hpY2ggdGhlIGVmZmVjdCAobm90IHRoZSBjbGVhbi11cCkgZmlyZXMuXG5cbnZhciBJbnNlcnRpb24gPVxuLyogICovXG4yO1xudmFyIExheW91dCA9XG4vKiAgICAqL1xuNDtcbnZhciBQYXNzaXZlJDEgPVxuLyogICAqL1xuODtcblxuLy8gYW5kIHNob3VsZCBiZSByZXNldCBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgcmVuZGVyLlxuLy8gVGhpcyB0cmFja3Mgd2hpY2ggbXV0YWJsZSBzb3VyY2VzIG5lZWQgdG8gYmUgcmVzZXQgYWZ0ZXIgYSByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMgPSBbXTtcbmZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IHdvcmtJblByb2dyZXNzU291cmNlc1tpXTtcblxuICAgIHtcbiAgICAgIG11dGFibGVTb3VyY2UuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGggPSAwO1xufVxuLy8gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHZlcnNpb24gdXNlZCBmb3Igc2VydmVyIHJlbmRlcmluZyBtYXRjaGVzIHRoZSBvbmVcbi8vIHRoYXQgaXMgZXZlbnR1YWxseSByZWFkIGR1cmluZyBoeWRyYXRpb24uXG4vLyBJZiB0aGV5IGRvbid0IG1hdGNoIHRoZXJlJ3MgYSBwb3RlbnRpYWwgdGVhciBhbmQgYSBmdWxsIGRlb3B0IHJlbmRlciBpcyByZXF1aXJlZC5cblxuZnVuY3Rpb24gcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpIHtcbiAgdmFyIGdldFZlcnNpb24gPSBtdXRhYmxlU291cmNlLl9nZXRWZXJzaW9uO1xuICB2YXIgdmVyc2lvbiA9IGdldFZlcnNpb24obXV0YWJsZVNvdXJjZS5fc291cmNlKTsgLy8gVE9ETyBDbGVhciB0aGlzIGRhdGEgb25jZSBhbGwgcGVuZGluZyBoeWRyYXRpb24gd29yayBpcyBmaW5pc2hlZC5cbiAgLy8gUmV0YWluaW5nIGl0IGZvcmV2ZXIgbWF5IGludGVyZmVyZSB3aXRoIEdDLlxuXG4gIGlmIChyb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPT0gbnVsbCkge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IFttdXRhYmxlU291cmNlLCB2ZXJzaW9uXTtcbiAgfSBlbHNlIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChtdXRhYmxlU291cmNlLCB2ZXJzaW9uKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7XG52YXIgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90O1xuXG57XG4gIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuLy8gVGhlc2UgYXJlIHNldCByaWdodCBiZWZvcmUgY2FsbGluZyB0aGUgY29tcG9uZW50LlxudmFyIHJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIEkndmUgbmFtZWQgaXQgZGlmZmVyZW50bHkgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbVxuLy8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsOyAvLyBIb29rcyBhcmUgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIGZpYmVyJ3MgbWVtb2l6ZWRTdGF0ZSBmaWVsZC4gVGhlXG4vLyBjdXJyZW50IGhvb2sgbGlzdCBpcyB0aGUgbGlzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmliZXIuIFRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuXG52YXIgY3VycmVudEhvb2sgPSBudWxsO1xudmFyIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7IC8vIFdoZXRoZXIgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzXG4vLyBkb2VzIG5vdCBnZXQgcmVzZXQgaWYgd2UgZG8gYW5vdGhlciByZW5kZXIgcGFzczsgb25seSB3aGVuIHdlJ3JlIGNvbXBsZXRlbHlcbi8vIGZpbmlzaGVkIGV2YWx1YXRpbmcgdGhpcyBjb21wb25lbnQuIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHdlIGtub3dcbi8vIHdoZXRoZXIgd2UgbmVlZCB0byBjbGVhciByZW5kZXIgcGhhc2UgdXBkYXRlcyBhZnRlciBhIHRocm93LlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBXaGVyZSBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbmx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIgcGFzcy4gVGhpc1xuLy8gZ2V0cyByZXNldCBhZnRlciBlYWNoIGF0dGVtcHQuXG4vLyBUT0RPOiBNYXliZSB0aGVyZSdzIHNvbWUgd2F5IHRvIGNvbnNvbGlkYXRlIHRoaXMgd2l0aFxuLy8gYGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVgLiBPciB3aXRoIGBudW1iZXJPZlJlUmVuZGVyc2AuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTsgLy8gQ291bnRzIHRoZSBudW1iZXIgb2YgdXNlSWQgaG9va3MgaW4gdGhpcyBjb21wb25lbnQuXG5cbnZhciBsb2NhbElkQ291bnRlciA9IDA7IC8vIFVzZWQgZm9yIGlkcyB0aGF0IGFyZSBnZW5lcmF0ZWQgY29tcGxldGVseSBjbGllbnQtc2lkZSAoaS5lLiBub3QgZHVyaW5nXG4vLyBoeWRyYXRpb24pLiBUaGlzIGNvdW50ZXIgaXMgZ2xvYmFsLCBzbyBjbGllbnQgaWRzIGFyZSBub3Qgc3RhYmxlIGFjcm9zc1xuLy8gcmVuZGVyIGF0dGVtcHRzLlxuXG52YXIgZ2xvYmFsQ2xpZW50SWRDb3VudGVyID0gMDtcbnZhciBSRV9SRU5ERVJfTElNSVQgPSAyNTsgLy8gSW4gREVWLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHByaW1pdGl2ZSBob29rXG5cbnZhciBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7IC8vIEluIERFViwgdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBob29rcyBhcmUgY2FsbGVkIGluIHRoZSBzYW1lIG9yZGVyIGJldHdlZW4gcmVuZGVycy5cbi8vIFRoZSBsaXN0IHN0b3JlcyB0aGUgb3JkZXIgb2YgaG9va3MgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgcmVuZGVyIChtb3VudCkuXG4vLyBTdWJzZXF1ZW50IHJlbmRlcnMgKHVwZGF0ZXMpIHJlZmVyZW5jZSB0aGlzIGxpc3QuXG5cbnZhciBob29rVHlwZXNEZXYgPSBudWxsO1xudmFyIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIEluIERFViwgdGhpcyB0cmFja3Mgd2hldGhlciBjdXJyZW50bHkgcmVuZGVyaW5nIGNvbXBvbmVudCBuZWVkcyB0byBpZ25vcmVcbi8vIHRoZSBkZXBlbmRlbmNpZXMgZm9yIEhvb2tzIHRoYXQgbmVlZCB0aGVtIChlLmcuIHVzZUVmZmVjdCBvciB1c2VNZW1vKS5cbi8vIFdoZW4gdHJ1ZSwgc3VjaCBIb29rcyB3aWxsIGFsd2F5cyBiZSBcInJlbW91bnRlZFwiLiBPbmx5IHVzZWQgZHVyaW5nIGhvdCByZWxvYWQuXG5cbnZhciBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBtb3VudEhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiA9PT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzRGV2ID0gW2hvb2tOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va1R5cGVzRGV2LnB1c2goaG9va05hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2Kys7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXZbaG9va1R5cGVzVXBkYXRlSW5kZXhEZXZdICE9PSBob29rTmFtZSkge1xuICAgICAgICB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihob29rTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpIHtcbiAge1xuICAgIGlmIChkZXBzICE9PSB1bmRlZmluZWQgJiYgZGVwcyAhPT0gbnVsbCAmJiAhaXNBcnJheShkZXBzKSkge1xuICAgICAgLy8gVmVyaWZ5IGRlcHMsIGJ1dCBvbmx5IG9uIG1vdW50IHRvIGF2b2lkIGV4dHJhIGNoZWNrcy5cbiAgICAgIC8vIEl0J3MgdW5saWtlbHkgdGhlaXIgdHlwZSB3b3VsZCBjaGFuZ2UgYXMgdXN1YWxseSB5b3UgZGVmaW5lIHRoZW0gaW5saW5lLlxuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkgKGluc3RlYWQsIHJlY2VpdmVkIGAlc2ApLiBXaGVuICcgKyAnc3BlY2lmaWVkLCB0aGUgZmluYWwgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheS4nLCBjdXJyZW50SG9va05hbWVJbkRldiwgdHlwZW9mIGRlcHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihjdXJyZW50SG9va05hbWUpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxKTtcblxuICAgIGlmICghZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgdGFibGUgPSAnJztcbiAgICAgICAgdmFyIHNlY29uZENvbHVtblN0YXJ0ID0gMzA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXY7IGkrKykge1xuICAgICAgICAgIHZhciBvbGRIb29rTmFtZSA9IGhvb2tUeXBlc0RldltpXTtcbiAgICAgICAgICB2YXIgbmV3SG9va05hbWUgPSBpID09PSBob29rVHlwZXNVcGRhdGVJbmRleERldiA/IGN1cnJlbnRIb29rTmFtZSA6IG9sZEhvb2tOYW1lO1xuICAgICAgICAgIHZhciByb3cgPSBpICsgMSArIFwiLiBcIiArIG9sZEhvb2tOYW1lOyAvLyBFeHRyYSBzcGFjZSBzbyBzZWNvbmQgY29sdW1uIGxpbmVzIHVwXG4gICAgICAgICAgLy8gbG9sIEAgSUUgbm90IHN1cHBvcnRpbmcgU3RyaW5nI3JlcGVhdFxuXG4gICAgICAgICAgd2hpbGUgKHJvdy5sZW5ndGggPCBzZWNvbmRDb2x1bW5TdGFydCkge1xuICAgICAgICAgICAgcm93ICs9ICcgJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByb3cgKz0gbmV3SG9va05hbWUgKyAnXFxuJztcbiAgICAgICAgICB0YWJsZSArPSByb3c7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignUmVhY3QgaGFzIGRldGVjdGVkIGEgY2hhbmdlIGluIHRoZSBvcmRlciBvZiBIb29rcyBjYWxsZWQgYnkgJXMuICcgKyAnVGhpcyB3aWxsIGxlYWQgdG8gYnVncyBhbmQgZXJyb3JzIGlmIG5vdCBmaXhlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVhZCB0aGUgUnVsZXMgb2YgSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rc1xcblxcbicgKyAnICAgUHJldmlvdXMgcmVuZGVyICAgICAgICAgICAgTmV4dCByZW5kZXJcXG4nICsgJyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicgKyAnJXMnICsgJyAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxcbicsIGNvbXBvbmVudE5hbWUsIHRhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dJbnZhbGlkSG9va0Vycm9yKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3InICsgJyBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuJyArICcyLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuJyArICczLiBZb3UgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QgaW4gdGhlIHNhbWUgYXBwXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS4nKTtcbn1cblxuZnVuY3Rpb24gYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykge1xuICB7XG4gICAgaWYgKGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzKSB7XG4gICAgICAvLyBPbmx5IHRydWUgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyBiZWluZyBob3QgcmVsb2FkZWQuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByZXZEZXBzID09PSBudWxsKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgbm90IGR1cmluZyAnICsgJ3RoZSBwcmV2aW91cyByZW5kZXIuIEV2ZW4gdGhvdWdoIHRoZSBmaW5hbCBhcmd1bWVudCBpcyBvcHRpb25hbCwgJyArICdpdHMgdHlwZSBjYW5ub3QgY2hhbmdlIGJldHdlZW4gcmVuZGVycy4nLCBjdXJyZW50SG9va05hbWVJbkRldik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAge1xuICAgIC8vIERvbid0IGJvdGhlciBjb21wYXJpbmcgbGVuZ3RocyBpbiBwcm9kIGJlY2F1c2UgdGhlc2UgYXJyYXlzIHNob3VsZCBiZVxuICAgIC8vIHBhc3NlZCBpbmxpbmUuXG4gICAgaWYgKG5leHREZXBzLmxlbmd0aCAhPT0gcHJldkRlcHMubGVuZ3RoKSB7XG4gICAgICBlcnJvcignVGhlIGZpbmFsIGFyZ3VtZW50IHBhc3NlZCB0byAlcyBjaGFuZ2VkIHNpemUgYmV0d2VlbiByZW5kZXJzLiBUaGUgJyArICdvcmRlciBhbmQgc2l6ZSBvZiB0aGlzIGFycmF5IG11c3QgcmVtYWluIGNvbnN0YW50LlxcblxcbicgKyAnUHJldmlvdXM6ICVzXFxuJyArICdJbmNvbWluZzogJXMnLCBjdXJyZW50SG9va05hbWVJbkRldiwgXCJbXCIgKyBwcmV2RGVwcy5qb2luKCcsICcpICsgXCJdXCIsIFwiW1wiICsgbmV4dERlcHMuam9pbignLCAnKSArIFwiXVwiKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZEZXBzLmxlbmd0aCAmJiBpIDwgbmV4dERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob2JqZWN0SXMobmV4dERlcHNbaV0sIHByZXZEZXBzW2ldKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgc2Vjb25kQXJnLCBuZXh0UmVuZGVyTGFuZXMpIHtcbiAgcmVuZGVyTGFuZXMgPSBuZXh0UmVuZGVyTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSB3b3JrSW5Qcm9ncmVzcztcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzIDogbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBVc2VkIGZvciBob3QgcmVsb2FkaW5nOlxuXG4gICAgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lczsgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzZXRcbiAgLy8gY3VycmVudEhvb2sgPSBudWxsO1xuICAvLyB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuICAvLyBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gIC8vIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgLy8gVE9ETyBXYXJuIGlmIG5vIGhvb2tzIGFyZSB1c2VkIGF0IGFsbCBkdXJpbmcgbW91bnQsIHRoZW4gc29tZSBhcmUgdXNlZCBkdXJpbmcgdXBkYXRlLlxuICAvLyBDdXJyZW50bHkgd2Ugd2lsbCBpZGVudGlmeSB0aGUgdXBkYXRlIHJlbmRlciBhcyBhIG1vdW50IGJlY2F1c2UgbWVtb2l6ZWRTdGF0ZSA9PT0gbnVsbC5cbiAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSlcbiAgLy8gVXNpbmcgbWVtb2l6ZWRTdGF0ZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbW91bnQvdXBkYXRlIG9ubHkgd29ya3MgaWYgYXQgbGVhc3Qgb25lIHN0YXRlZnVsIGhvb2sgaXMgdXNlZC5cbiAgLy8gTm9uLXN0YXRlZnVsIGhvb2tzIChlLmcuIGNvbnRleHQpIGRvbid0IGdldCBhZGRlZCB0byBtZW1vaXplZFN0YXRlLFxuICAvLyBzbyBtZW1vaXplZFN0YXRlIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy5cblxuICB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgfSBlbHNlIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBoYW5kbGVzIGFuIGVkZ2UgY2FzZSB3aGVyZSBhIGNvbXBvbmVudCBpcyB1cGRhdGluZyxcbiAgICAgIC8vIGJ1dCBubyBzdGF0ZWZ1bCBob29rcyBoYXZlIGJlZW4gdXNlZC5cbiAgICAgIC8vIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3Rpb24gY29kZSBiZWhhdmlvciAod2hpY2ggd2lsbCB1c2UgSG9va3NEaXNwYXRjaGVyT25Nb3VudCksXG4gICAgICAvLyBidXQgd2l0aCB0aGUgZXh0cmEgREVWIHZhbGlkYXRpb24gdG8gZW5zdXJlIGhvb2tzIG9yZGVyaW5nIGhhc24ndCBjaGFuZ2VkLlxuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGRvZXMgdGhhdC5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVjtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpOyAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlXG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcykge1xuICAgIC8vIEtlZXAgcmVuZGVyaW5nIGluIGEgbG9vcCBmb3IgYXMgbG9uZyBhcyByZW5kZXIgcGhhc2UgdXBkYXRlcyBjb250aW51ZSB0b1xuICAgIC8vIGJlIHNjaGVkdWxlZC4gVXNlIGEgY291bnRlciB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLlxuICAgIHZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbiAgICAgIGxvY2FsSWRDb3VudGVyID0gMDtcblxuICAgICAgaWYgKG51bWJlck9mUmVSZW5kZXJzID49IFJFX1JFTkRFUl9MSU1JVCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBtYW55IHJlLXJlbmRlcnMuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlbmRlcnMgdG8gcHJldmVudCAnICsgJ2FuIGluZmluaXRlIGxvb3AuJyk7XG4gICAgICB9XG5cbiAgICAgIG51bWJlck9mUmVSZW5kZXJzICs9IDE7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gRXZlbiB3aGVuIGhvdCByZWxvYWRpbmcsIGFsbG93IGRlcGVuZGVuY2llcyB0byBzdGFiaWxpemVcbiAgICAgICAgLy8gYWZ0ZXIgZmlyc3QgcmVuZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuXG4gICAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICB9IC8vIFN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cblxuICAgICAgY3VycmVudEhvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAge1xuICAgICAgICAvLyBBbHNvIHZhbGlkYXRlIGhvb2sgb3JkZXIgZm9yIGNhc2NhZGluZyB1cGRhdGVzLlxuICAgICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgICAgfVxuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9ICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgO1xuICAgICAgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gICAgfSB3aGlsZSAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKTtcbiAgfSAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jZS5cblxuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBob29rVHlwZXNEZXY7XG4gIH0gLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuXG4gIC8vIGhvb2tUeXBlc0RldiBjb3VsZCBjYXRjaCBtb3JlIGNhc2VzIChlLmcuIGNvbnRleHQpIGJ1dCBvbmx5IGluIERFViBidW5kbGVzLlxuXG5cbiAgdmFyIGRpZFJlbmRlclRvb0Zld0hvb2tzID0gY3VycmVudEhvb2sgIT09IG51bGwgJiYgY3VycmVudEhvb2submV4dCAhPT0gbnVsbDtcbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBDb25maXJtIHRoYXQgYSBzdGF0aWMgZmxhZyB3YXMgbm90IGFkZGVkIG9yIHJlbW92ZWQgc2luY2UgdGhlIGxhc3RcbiAgICAvLyByZW5kZXIuIElmIHRoaXMgZmlyZXMsIGl0IHN1Z2dlc3RzIHRoYXQgd2UgaW5jb3JyZWN0bHkgcmVzZXQgdGhlIHN0YXRpY1xuICAgIC8vIGZsYWdzIGluIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgY29kZWJhc2UuIFRoaXMgaGFzIGhhcHBlbmVkIGJlZm9yZSwgZm9yXG4gICAgLy8gZXhhbXBsZSwgaW4gdGhlIFN1c3BlbnNlTGlzdCBpbXBsZW1lbnRhdGlvbi5cblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmZsYWdzICYgU3RhdGljTWFzaykgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIFN0YXRpY01hc2spICYmIC8vIERpc2FibGUgdGhpcyB3YXJuaW5nIGluIGxlZ2FjeSBtb2RlLCBiZWNhdXNlIGxlZ2FjeSBTdXNwZW5zZSBpcyB3ZWlyZFxuICAgIC8vIGFuZCBjcmVhdGVzIGZhbHNlIHBvc2l0aXZlcy4gVG8gbWFrZSB0aGlzIHdvcmsgaW4gbGVnYWN5IG1vZGUsIHdlJ2RcbiAgICAvLyBuZWVkIHRvIG1hcmsgZmliZXJzIHRoYXQgY29tbWl0IGluIGFuIGluY29tcGxldGUgc3RhdGUsIHNvbWVob3cuIEZvclxuICAgIC8vIG5vdyBJJ2xsIGRpc2FibGUgdGhlIHdhcm5pbmcgdGhhdCBtb3N0IG9mIHRoZSBidWdzIHRoYXQgd291bGQgdHJpZ2dlclxuICAgIC8vIGl0IGFyZSBlaXRoZXIgZXhjbHVzaXZlIHRvIGNvbmN1cnJlbnQgbW9kZSBvciBleGlzdCBpbiBib3RoLlxuICAgIChjdXJyZW50Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZXJyb3IoJ0ludGVybmFsIFJlYWN0IGVycm9yOiBFeHBlY3RlZCBzdGF0aWMgZmxhZyB3YXMgbWlzc2luZy4gUGxlYXNlICcgKyAnbm90aWZ5IHRoZSBSZWFjdCB0ZWFtLicpO1xuICAgIH1cbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gVGhpcyBpcyByZXNldCBieSBjaGVja0RpZFJlbmRlcklkSG9va1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgaWYgKGRpZFJlbmRlclRvb0Zld0hvb2tzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZW5kZXJlZCBmZXdlciBob29rcyB0aGFuIGV4cGVjdGVkLiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYW4gYWNjaWRlbnRhbCAnICsgJ2Vhcmx5IHJldHVybiBzdGF0ZW1lbnQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5mdW5jdGlvbiBjaGVja0RpZFJlbmRlcklkSG9vaygpIHtcbiAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGV2ZXJ5IHJlbmRlcldpdGhIb29rcyBjYWxsLlxuICAvLyBDb25jZXB0dWFsbHksIGl0J3MgcGFydCBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIHJlbmRlcldpdGhIb29rczsgaXQncyBvbmx5IGFcbiAgLy8gc2VwYXJhdGUgZnVuY3Rpb24gdG8gYXZvaWQgdXNpbmcgYW4gYXJyYXkgdHVwbGUuXG4gIHZhciBkaWRSZW5kZXJJZEhvb2sgPSBsb2NhbElkQ291bnRlciAhPT0gMDtcbiAgbG9jYWxJZENvdW50ZXIgPSAwO1xuICByZXR1cm4gZGlkUmVuZGVySWRIb29rO1xufVxuZnVuY3Rpb24gYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBsYW5lcykge1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gcmVzZXQgdGhlIGZsYWdzIGhlcmUsIGJlY2F1c2UgdGhleSdyZSByZXNldCBpbiB0aGVcbiAgLy8gY29tcGxldGUgcGhhc2UgKGJ1YmJsZVByb3BlcnRpZXMpLlxuXG4gIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH4oTW91bnRQYXNzaXZlRGV2IHwgTW91bnRMYXlvdXREZXYgfCBQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpO1xuICB9XG5cbiAgY3VycmVudC5sYW5lcyA9IHJlbW92ZUxhbmVzKGN1cnJlbnQubGFuZXMsIGxhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0SG9va3NBZnRlclRocm93KCkge1xuICAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jZS5cbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUpIHtcbiAgICAvLyBUaGVyZSB3ZXJlIHJlbmRlciBwaGFzZSB1cGRhdGVzLiBUaGVzZSBhcmUgb25seSB2YWxpZCBmb3IgdGhpcyByZW5kZXJcbiAgICAvLyBwaGFzZSwgd2hpY2ggd2UgYXJlIG5vdyBhYm9ydGluZy4gUmVtb3ZlIHRoZSB1cGRhdGVzIGZyb20gdGhlIHF1ZXVlcyBzb1xuICAgIC8vIHRoZXkgZG8gbm90IHBlcnNpc3QgdG8gdGhlIG5leHQgcmVuZGVyLiBEbyBub3QgcmVtb3ZlIHVwZGF0ZXMgZnJvbSBob29rc1xuICAgIC8vIHRoYXQgd2VyZW4ndCBwcm9jZXNzZWQuXG4gICAgLy9cbiAgICAvLyBPbmx5IHJlc2V0IHRoZSB1cGRhdGVzIGZyb20gdGhlIHF1ZXVlIGlmIGl0IGhhcyBhIGNsb25lLiBJZiBpdCBkb2VzXG4gICAgLy8gbm90IGhhdmUgYSBjbG9uZSwgdGhhdCBtZWFucyBpdCB3YXNuJ3QgcHJvY2Vzc2VkLCBhbmQgdGhlIHVwZGF0ZXMgd2VyZVxuICAgIC8vIHNjaGVkdWxlZCBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIHZhciBob29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuXG4gICAgd2hpbGUgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaG9vayA9IGhvb2submV4dDtcbiAgICB9XG5cbiAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gIH1cblxuICByZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsO1xuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIHZhciBob29rID0ge1xuICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgYmFzZVN0YXRlOiBudWxsLFxuICAgIGJhc2VRdWV1ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3RcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYm90aCBmb3IgdXBkYXRlcyBhbmQgZm9yIHJlLXJlbmRlcnMgdHJpZ2dlcmVkIGJ5IGFcbiAgLy8gcmVuZGVyIHBoYXNlIHVwZGF0ZS4gSXQgYXNzdW1lcyB0aGVyZSBpcyBlaXRoZXIgYSBjdXJyZW50IGhvb2sgd2UgY2FuXG4gIC8vIGNsb25lLCBvciBhIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBmcm9tIGEgcHJldmlvdXMgcmVuZGVyIHBhc3MgdGhhdCB3ZSBjYW5cbiAgLy8gdXNlIGFzIGEgYmFzZS4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBiYXNlIGxpc3QsIHdlIG11c3Qgc3dpdGNoIHRvXG4gIC8vIHRoZSBkaXNwYXRjaGVyIHVzZWQgZm9yIG1vdW50cy5cbiAgdmFyIG5leHRDdXJyZW50SG9vaztcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgfVxuXG4gIHZhciBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuICB9IGVsc2Uge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgfVxuXG4gIGlmIChuZXh0V29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuXG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbmV4dFdvcmtJblByb2dyZXNzSG9vaztcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2xvbmUgZnJvbSB0aGUgY3VycmVudCBob29rLlxuICAgIGlmIChuZXh0Q3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgbW9yZSBob29rcyB0aGFuIGR1cmluZyB0aGUgcHJldmlvdXMgcmVuZGVyLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICAgIHZhciBuZXdIb29rID0ge1xuICAgICAgbWVtb2l6ZWRTdGF0ZTogY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudEhvb2suYmFzZVN0YXRlLFxuICAgICAgYmFzZVF1ZXVlOiBjdXJyZW50SG9vay5iYXNlUXVldWUsXG4gICAgICBxdWV1ZTogY3VycmVudEhvb2sucXVldWUsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3QuXG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXdIb29rO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gbmV3SG9vaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NIb29rO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCkge1xuICByZXR1cm4ge1xuICAgIGxhc3RFZmZlY3Q6IG51bGwsXG4gICAgc3RvcmVzOiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJhc2ljU3RhdGVSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgcmV0dXJuIHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicgPyBhY3Rpb24oc3RhdGUpIDogYWN0aW9uO1xufVxuXG5mdW5jdGlvbiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBpbml0aWFsU3RhdGU7XG5cbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXQoaW5pdGlhbEFyZyk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbEFyZztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSB7XG4gICAgcGVuZGluZzogbnVsbCxcbiAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICBsYW5lczogTm9MYW5lcyxcbiAgICBkaXNwYXRjaDogbnVsbCxcbiAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiByZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoUmVkdWNlckFjdGlvbi5iaW5kKG51bGwsIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIHF1ZXVlKTtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnQgPSBjdXJyZW50SG9vazsgLy8gVGhlIGxhc3QgcmViYXNlIHVwZGF0ZSB0aGF0IGlzIE5PVCBwYXJ0IG9mIHRoZSBiYXNlIHN0YXRlLlxuXG4gIHZhciBiYXNlUXVldWUgPSBjdXJyZW50LmJhc2VRdWV1ZTsgLy8gVGhlIGxhc3QgcGVuZGluZyB1cGRhdGUgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIG5ldyB1cGRhdGVzIHRoYXQgaGF2ZW4ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG4gICAgLy8gV2UnbGwgYWRkIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG4gICAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gTWVyZ2UgdGhlIHBlbmRpbmcgcXVldWUgYW5kIHRoZSBiYXNlIHF1ZXVlLlxuICAgICAgdmFyIGJhc2VGaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgICAgdmFyIHBlbmRpbmdGaXJzdCA9IHBlbmRpbmdRdWV1ZS5uZXh0O1xuICAgICAgYmFzZVF1ZXVlLm5leHQgPSBwZW5kaW5nRmlyc3Q7XG4gICAgICBwZW5kaW5nUXVldWUubmV4dCA9IGJhc2VGaXJzdDtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3VycmVudC5iYXNlUXVldWUgIT09IGJhc2VRdWV1ZSkge1xuICAgICAgICAvLyBJbnRlcm5hbCBpbnZhcmlhbnQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZmVhc2libHkgY291bGQgaW5cbiAgICAgICAgLy8gdGhlIGZ1dHVyZSBpZiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcsIG9yIHNvbWUgZm9ybSBvZiB0aGF0LlxuICAgICAgICBlcnJvcignSW50ZXJuYWwgZXJyb3I6IEV4cGVjdGVkIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgdG8gYmUgYSBjbG9uZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnQuYmFzZVF1ZXVlID0gYmFzZVF1ZXVlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgYSBxdWV1ZSB0byBwcm9jZXNzLlxuICAgIHZhciBmaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgIHZhciBuZXdTdGF0ZSA9IGN1cnJlbnQuYmFzZVN0YXRlO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVGaXJzdCA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUxhc3QgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdCYXNlUXVldWVGaXJzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuICAgICAgICAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIGFjY3VtdWxhdGUgdGhpcy4gSW5zdGVhZCwgd2UgY2FuIHJlbW92ZVxuICAgICAgICAvLyByZW5kZXJMYW5lcyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9jbG9uZSA9IHtcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IF9jbG9uZTtcbiAgICAgICAgfSAvLyBQcm9jZXNzIHRoaXMgdXBkYXRlLlxuXG5cbiAgICAgICAgaWYgKHVwZGF0ZS5oYXNFYWdlclN0YXRlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyB1cGRhdGUgaXMgYSBzdGF0ZSB1cGRhdGUgKG5vdCBhIHJlZHVjZXIpIGFuZCB3YXMgcHJvY2Vzc2VkIGVhZ2VybHksXG4gICAgICAgICAgLy8gd2UgY2FuIHVzZSB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZVxuICAgICAgICAgIG5ld1N0YXRlID0gdXBkYXRlLmVhZ2VyU3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCAmJiB1cGRhdGUgIT09IGZpcnN0KTtcblxuICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gbmV3QmFzZVF1ZXVlRmlyc3Q7XG4gICAgfSAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgaG9vay5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAvLyBwcm9jZXNzIHRoZW0gZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgd2UgZG8gbmVlZCB0byB0cmFjayB3aGljaCBsYW5lc1xuICAvLyBhcmUgcmVtYWluaW5nLlxuXG5cbiAgdmFyIGxhc3RJbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChsYXN0SW50ZXJsZWF2ZWQgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWRMYW5lID0gaW50ZXJsZWF2ZWQubGFuZTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIGludGVybGVhdmVkTGFuZSk7XG4gICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGludGVybGVhdmVkTGFuZSk7XG4gICAgICBpbnRlcmxlYXZlZCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gIH0gZWxzZSBpZiAoYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gYHF1ZXVlLmxhbmVzYCBpcyB1c2VkIGZvciBlbnRhbmdsaW5nIHRyYW5zaXRpb25zLiBXZSBjYW4gc2V0IGl0IGJhY2sgdG9cbiAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgIHF1ZXVlLmxhbmVzID0gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7IC8vIFRoaXMgaXMgYSByZS1yZW5kZXIuIEFwcGx5IHRoZSBuZXcgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgdG8gdGhlIHByZXZpb3VzXG4gIC8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgdmFyIGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IHF1ZXVlLnBlbmRpbmc7XG4gIHZhciBuZXdTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobGFzdFJlbmRlclBoYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHF1ZXVlIGRvZXNuJ3QgcGVyc2lzdCBwYXN0IHRoaXMgcmVuZGVyIHBhc3MuXG4gICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgdmFyIGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUgPSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIC8vIFByb2Nlc3MgdGhpcyByZW5kZXIgcGhhc2UgdXBkYXRlLiBXZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZVxuICAgICAgLy8gcHJpb3JpdHkgYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBhcyB0aGUgY3VycmVudFxuICAgICAgLy8gcmVuZGVyJ3MuXG4gICAgICB2YXIgYWN0aW9uID0gdXBkYXRlLmFjdGlvbjtcbiAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSk7IC8vIE1hcmsgdGhhdCB0aGUgZmliZXIgcGVyZm9ybWVkIHdvcmssIGJ1dCBvbmx5IGlmIHRoZSBuZXcgc3RhdGUgaXNcbiAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS5cblxuXG4gICAgaWYgKCFvYmplY3RJcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSkge1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTsgLy8gRG9uJ3QgcGVyc2lzdCB0aGUgc3RhdGUgYWNjdW11bGF0ZWQgZnJvbSB0aGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgdG9cbiAgICAvLyB0aGUgYmFzZSBzdGF0ZSB1bmxlc3MgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgIC8vIFRPRE86IE5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGRlc2lyZWQgc2VtYW50aWNzLCBidXQgaXQncyB3aGF0IHdlXG4gICAgLy8gZG8gZm9yIGdEU0ZQLiBJIGNhbid0IHJlbWVtYmVyIHdoeS5cblxuICAgIGlmIChob29rLmJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9XG5cbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAgcmV0dXJuIFtuZXdTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiBtb3VudE11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dFNuYXBzaG90O1xuICB2YXIgaXNIeWRyYXRpbmcgPSBnZXRJc0h5ZHJhdGluZygpO1xuXG4gIGlmIChpc0h5ZHJhdGluZykge1xuICAgIGlmIChnZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZ2V0U2VydmVyU25hcHNob3QsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciAnICsgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBXaWxsIHJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLicpO1xuICAgIH1cblxuICAgIG5leHRTbmFwc2hvdCA9IGdldFNlcnZlclNuYXBzaG90KCk7XG5cbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICAgIGlmIChuZXh0U25hcHNob3QgIT09IGdldFNlcnZlclNuYXBzaG90KCkpIHtcbiAgICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTZXJ2ZXJTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXh0U25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICB2YXIgY2FjaGVkU25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICAgIGlmICghb2JqZWN0SXMobmV4dFNuYXBzaG90LCBjYWNoZWRTbmFwc2hvdCkpIHtcbiAgICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVW5sZXNzIHdlJ3JlIHJlbmRlcmluZyBhIGJsb2NraW5nIGxhbmUsIHNjaGVkdWxlIGEgY29uc2lzdGVuY3kgY2hlY2suXG4gICAgLy8gUmlnaHQgYmVmb3JlIGNvbW1pdHRpbmcsIHdlIHdpbGwgd2FsayB0aGUgdHJlZSBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZVxuICAgIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQuXG4gICAgLy9cbiAgICAvLyBXZSB3b24ndCBkbyB0aGlzIGlmIHdlJ3JlIGh5ZHJhdGluZyBzZXJ2ZXItcmVuZGVyZWQgY29udGVudCwgYmVjYXVzZSBpZlxuICAgIC8vIHRoZSBjb250ZW50IGlzIHN0YWxlLCBpdCdzIGFscmVhZHkgdmlzaWJsZSBhbnl3YXkuIEluc3RlYWQgd2UnbGwgcGF0Y2hcbiAgICAvLyBpdCB1cCBpbiBhIHBhc3NpdmUgZWZmZWN0LlxuXG5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB3b3JrLWluLXByb2dyZXNzIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmICghaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICB9XG4gIH0gLy8gUmVhZCB0aGUgY3VycmVudCBzbmFwc2hvdCBmcm9tIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXIuIFRoaXMgYnJlYWtzIHRoZVxuICAvLyBub3JtYWwgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmUgdXBkYXRlcyBhcmVcbiAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLlxuXG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV4dFNuYXBzaG90O1xuICB2YXIgaW5zdCA9IHtcbiAgICB2YWx1ZTogbmV4dFNuYXBzaG90LFxuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdFxuICB9O1xuICBob29rLnF1ZXVlID0gaW5zdDsgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmUuXG5cbiAgbW91bnRFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byB1cGRhdGUgdGhlIG11dGFibGUgaW5zdGFuY2UgZmllbGRzLiBXZSB3aWxsIHVwZGF0ZVxuICAvLyB0aGlzIHdoZW5ldmVyIHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIG9yIHZhbHVlIGNoYW5nZXMuIEJlY2F1c2UgdGhlcmUncyBub1xuICAvLyBjbGVhbi11cCBmdW5jdGlvbiwgYW5kIHdlIHRyYWNrIHRoZSBkZXBzIGNvcnJlY3RseSwgd2UgY2FuIGNhbGwgcHVzaEVmZmVjdFxuICAvLyBkaXJlY3RseSwgd2l0aG91dCBzdG9yaW5nIGFueSBhZGRpdGlvbmFsIHN0YXRlLiBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZVxuICAvLyBkb24ndCBuZWVkIHRvIHNldCBhIHN0YXRpYyBmbGFnLCBlaXRoZXIuXG4gIC8vIFRPRE86IFdlIGNhbiBtb3ZlIHRoaXMgdG8gdGhlIHBhc3NpdmUgcGhhc2Ugb25jZSB3ZSBhZGQgYSBwcmUtY29tbWl0XG4gIC8vIGNvbnNpc3RlbmN5IGNoZWNrLiBTZWUgdGhlIG5leHQgY29tbWVudC5cblxuICBmaWJlci5mbGFncyB8PSBQYXNzaXZlO1xuICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTtcbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTsgLy8gUmVhZCB0aGUgY3VycmVudCBzbmFwc2hvdCBmcm9tIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXIuIFRoaXMgYnJlYWtzIHRoZVxuICAvLyBub3JtYWwgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmUgdXBkYXRlcyBhcmVcbiAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLlxuXG4gIHZhciBuZXh0U25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICB2YXIgY2FjaGVkU25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcHJldlNuYXBzaG90ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICB2YXIgc25hcHNob3RDaGFuZ2VkID0gIW9iamVjdElzKHByZXZTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcblxuICBpZiAoc25hcHNob3RDaGFuZ2VkKSB7XG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV4dFNuYXBzaG90O1xuICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gIH1cblxuICB2YXIgaW5zdCA9IGhvb2sucXVldWU7XG4gIHVwZGF0ZUVmZmVjdChzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIHN1YnNjcmliZSksIFtzdWJzY3JpYmVdKTsgLy8gV2hlbmV2ZXIgZ2V0U25hcHNob3Qgb3Igc3Vic2NyaWJlIGNoYW5nZXMsIHdlIG5lZWQgdG8gY2hlY2sgaW4gdGhlXG4gIC8vIGNvbW1pdCBwaGFzZSBpZiB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgbXV0YXRpb24uIEluIGNvbmN1cnJlbnQgbW9kZVxuICAvLyB0aGlzIGNhbiBoYXBwZW4gYWxsIHRoZSB0aW1lLCBidXQgZXZlbiBpbiBzeW5jaHJvbm91cyBtb2RlLCBhbiBlYXJsaWVyXG4gIC8vIGVmZmVjdCBtYXkgaGF2ZSBtdXRhdGVkIHRoZSBzdG9yZS5cblxuICBpZiAoaW5zdC5nZXRTbmFwc2hvdCAhPT0gZ2V0U25hcHNob3QgfHwgc25hcHNob3RDaGFuZ2VkIHx8IC8vIENoZWNrIGlmIHRoZSBzdXNiY3JpYmUgZnVuY3Rpb24gY2hhbmdlZC4gV2UgY2FuIHNhdmUgc29tZSBtZW1vcnkgYnlcbiAgLy8gY2hlY2tpbmcgd2hldGhlciB3ZSBzY2hlZHVsZWQgYSBzdWJzY3JpcHRpb24gZWZmZWN0IGFib3ZlLlxuICB3b3JrSW5Qcm9ncmVzc0hvb2sgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3NIb29rLm1lbW9pemVkU3RhdGUudGFnICYgSGFzRWZmZWN0KSB7XG4gICAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTsgLy8gVW5sZXNzIHdlJ3JlIHJlbmRlcmluZyBhIGJsb2NraW5nIGxhbmUsIHNjaGVkdWxlIGEgY29uc2lzdGVuY3kgY2hlY2suXG4gICAgLy8gUmlnaHQgYmVmb3JlIGNvbW1pdHRpbmcsIHdlIHdpbGwgd2FsayB0aGUgdHJlZSBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZVxuICAgIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQuXG5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB3b3JrLWluLXByb2dyZXNzIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmICghaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFNuYXBzaG90O1xufVxuXG5mdW5jdGlvbiBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgcmVuZGVyZWRTbmFwc2hvdCkge1xuICBmaWJlci5mbGFncyB8PSBTdG9yZUNvbnNpc3RlbmN5O1xuICB2YXIgY2hlY2sgPSB7XG4gICAgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90LFxuICAgIHZhbHVlOiByZW5kZXJlZFNuYXBzaG90XG4gIH07XG4gIHZhciBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWU7XG5cbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZSA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlO1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcyA9IFtjaGVja107XG4gIH0gZWxzZSB7XG4gICAgdmFyIHN0b3JlcyA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcztcblxuICAgIGlmIChzdG9yZXMgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcyA9IFtjaGVja107XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3Jlcy5wdXNoKGNoZWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlU3RvcmVJbnN0YW5jZShmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCkge1xuICAvLyBUaGVzZSBhcmUgdXBkYXRlZCBpbiB0aGUgcGFzc2l2ZSBwaGFzZVxuICBpbnN0LnZhbHVlID0gbmV4dFNuYXBzaG90O1xuICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7IC8vIFNvbWV0aGluZyBtYXkgaGF2ZSBiZWVuIG11dGF0ZWQgaW4gYmV0d2VlbiByZW5kZXIgYW5kIGNvbW1pdC4gVGhpcyBjb3VsZFxuICAvLyBoYXZlIGJlZW4gaW4gYW4gZXZlbnQgdGhhdCBmaXJlZCBiZWZvcmUgdGhlIHBhc3NpdmUgZWZmZWN0cywgb3IgaXQgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGEgbGF5b3V0IGVmZmVjdC4gSW4gdGhhdCBjYXNlLCB3ZSB3b3VsZCBoYXZlIHVzZWQgdGhlIG9sZFxuICAvLyBzbmFwc2hvIGFuZCBnZXRTbmFwc2hvdCB2YWx1ZXMgdG8gYmFpbCBvdXQuIFdlIG5lZWQgdG8gY2hlY2sgb25lIG1vcmUgdGltZS5cblxuICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlVG9TdG9yZShmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSB7XG4gIHZhciBoYW5kbGVTdG9yZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGUgc3RvcmUgY2hhbmdlZC4gQ2hlY2sgaWYgdGhlIHNuYXBzaG90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZVxuICAgIC8vIHJlYWQgZnJvbSB0aGUgc3RvcmUuXG4gICAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgICAgZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKTtcbiAgICB9XG4gIH07IC8vIFN1YnNjcmliZSB0byB0aGUgc3RvcmUgYW5kIHJldHVybiBhIGNsZWFuLXVwIGZ1bmN0aW9uLlxuXG5cbiAgcmV0dXJuIHN1YnNjcmliZShoYW5kbGVTdG9yZUNoYW5nZSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkge1xuICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSBpbnN0LmdldFNuYXBzaG90O1xuICB2YXIgcHJldlZhbHVlID0gaW5zdC52YWx1ZTtcblxuICB0cnkge1xuICAgIHZhciBuZXh0VmFsdWUgPSBsYXRlc3RHZXRTbmFwc2hvdCgpO1xuICAgIHJldHVybiAhb2JqZWN0SXMocHJldlZhbHVlLCBuZXh0VmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcikge1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlKCk7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICBob29rLnF1ZXVlID0gcXVldWU7XG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoID0gZGlzcGF0Y2hTZXRTdGF0ZS5iaW5kKG51bGwsIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIHF1ZXVlKTtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiB1cGRhdGVSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHB1c2hFZmZlY3QodGFnLCBjcmVhdGUsIGRlc3Ryb3ksIGRlcHMpIHtcbiAgdmFyIGVmZmVjdCA9IHtcbiAgICB0YWc6IHRhZyxcbiAgICBjcmVhdGU6IGNyZWF0ZSxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIGRlcHM6IGRlcHMsXG4gICAgLy8gQ2lyY3VsYXJcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHZhciBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWU7XG5cbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZSA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlO1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFzdEVmZmVjdCA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG5cbiAgICBpZiAobGFzdEVmZmVjdCA9PT0gbnVsbCkge1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICBsYXN0RWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgICBlZmZlY3QubmV4dCA9IGZpcnN0RWZmZWN0O1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWZmZWN0O1xufVxuXG5mdW5jdGlvbiBtb3VudFJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIHtcbiAgICB2YXIgX3JlZjIgPSB7XG4gICAgICBjdXJyZW50OiBpbml0aWFsVmFsdWVcbiAgICB9O1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IF9yZWYyO1xuICAgIHJldHVybiBfcmVmMjtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHJldHVybiBob29rLm1lbW9pemVkU3RhdGU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIHVuZGVmaW5lZCwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgZGVzdHJveSA9IHVuZGVmaW5lZDtcblxuICBpZiAoY3VycmVudEhvb2sgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldkVmZmVjdCA9IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gICAgZGVzdHJveSA9IHByZXZFZmZlY3QuZGVzdHJveTtcblxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldkVmZmVjdC5kZXBzO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHJldHVybiBtb3VudEVmZmVjdEltcGwoTW91bnRQYXNzaXZlRGV2IHwgUGFzc2l2ZSB8IFBhc3NpdmVTdGF0aWMsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChQYXNzaXZlLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFVwZGF0ZSwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QoY3JlYXRlLCByZWYpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVmQ2FsbGJhY2sgPSByZWY7XG5cbiAgICB2YXIgX2luc3QgPSBjcmVhdGUoKTtcblxuICAgIHJlZkNhbGxiYWNrKF9pbnN0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmQ2FsbGJhY2sobnVsbCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVmT2JqZWN0ID0gcmVmO1xuXG4gICAge1xuICAgICAgaWYgKCFyZWZPYmplY3QuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIGZpcnN0IGFyZ3VtZW50IHRvIGVpdGhlciBiZSBhICcgKyAncmVmIGNhbGxiYWNrIG9yIFJlYWN0LmNyZWF0ZVJlZigpIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgJ2FuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhyZWZPYmplY3QpLmpvaW4oJywgJykgKyAnfScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfaW5zdDIgPSBjcmVhdGUoKTtcblxuICAgIHJlZk9iamVjdC5jdXJyZW50ID0gX2luc3QyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZPYmplY3QuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICB7XG4gICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gIH1cblxuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gIH1cblxuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIExheW91dCwgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSwgZWZmZWN0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIExheW91dCwgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSwgZWZmZWN0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHsvLyBUaGlzIGhvb2sgaXMgbm9ybWFsbHkgYSBuby1vcC5cbiAgLy8gVGhlIHJlYWN0LWRlYnVnLWhvb2tzIHBhY2thZ2UgaW5qZWN0cyBpdHMgb3duIGltcGxlbWVudGF0aW9uXG4gIC8vIHNvIHRoYXQgZS5nLiBEZXZUb29scyBjYW4gZGlzcGxheSBjdXN0b20gaG9vayB2YWx1ZXMuXG59XG5cbnZhciB1cGRhdGVEZWJ1Z1ZhbHVlID0gbW91bnREZWJ1Z1ZhbHVlO1xuXG5mdW5jdGlvbiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gbW91bnRNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEFzc3VtZSB0aGVzZSBhcmUgZGVmaW5lZC4gSWYgdGhleSdyZSBub3QsIGFyZUhvb2tJbnB1dHNFcXVhbCB3aWxsIHdhcm4uXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcmVzb2x2ZWRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rO1xuICB2YXIgcHJldlZhbHVlID0gcmVzb2x2ZWRDdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmIChjdXJyZW50SG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYSBtb3VudC5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlcmVuZGVyIGR1cmluZyBhbiB1cGRhdGUuXG4gICAgdmFyIHByZXZWYWx1ZSA9IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpIHtcbiAgdmFyIHNob3VsZERlZmVyVmFsdWUgPSAhaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMocmVuZGVyTGFuZXMpO1xuXG4gIGlmIChzaG91bGREZWZlclZhbHVlKSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cmdlbnQgdXBkYXRlLiBJZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQsIGtlZXAgdXNpbmcgdGhlXG4gICAgLy8gcHJldmlvdXMgdmFsdWUgYW5kIHNwYXduIGEgZGVmZXJyZWQgcmVuZGVyIHRvIHVwZGF0ZSBpdCBsYXRlci5cbiAgICBpZiAoIW9iamVjdElzKHZhbHVlLCBwcmV2VmFsdWUpKSB7XG4gICAgICAvLyBTY2hlZHVsZSBhIGRlZmVycmVkIHJlbmRlclxuICAgICAgdmFyIGRlZmVycmVkTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCk7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBkZWZlcnJlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhkZWZlcnJlZExhbmUpOyAvLyBTZXQgdGhpcyB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlbmRlcmVkIHZhbHVlIGlzIGluY29uc2lzdGVudFxuICAgICAgLy8gZnJvbSB0aGUgbGF0ZXN0IHZhbHVlLiBUaGUgbmFtZSBcImJhc2VTdGF0ZVwiIGRvZXNuJ3QgcmVhbGx5IG1hdGNoIGhvdyB3ZVxuICAgICAgLy8gdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZyBhIHN0YXRlIGhvb2sgZmllbGQgaW5zdGVhZCBvZiBjcmVhdGluZyBhXG4gICAgICAvLyBuZXcgb25lLlxuXG4gICAgICBob29rLmJhc2VTdGF0ZSA9IHRydWU7XG4gICAgfSAvLyBSZXVzZSB0aGUgcHJldmlvdXMgdmFsdWVcblxuXG4gICAgcmV0dXJuIHByZXZWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIG5vdCBhbiB1cmdlbnQgdXBkYXRlLCBzbyB3ZSBjYW4gdXNlIHRoZSBsYXRlc3QgdmFsdWUgcmVnYXJkbGVzc1xuICAgIC8vIG9mIHdoYXQgaXQgaXMuIE5vIG5lZWQgdG8gZGVmZXIgaXQuXG4gICAgLy8gSG93ZXZlciwgaWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhIHNwYXduZWQgcmVuZGVyLCB0aGVuIHdlIG5lZWQgdG8gbWFya1xuICAgIC8vIHRoaXMgYXMgYW4gdXBkYXRlIHRvIHByZXZlbnQgdGhlIGZpYmVyIGZyb20gYmFpbGluZyBvdXQuXG4gICAgLy9cbiAgICAvLyBgYmFzZVN0YXRlYCBpcyB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJlbmRlcmVkXG4gICAgLy8gdmFsdWUuIFRoZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IG1hdGNoIGhvdyB3ZSB1c2UgaXQgYmVjYXVzZSB3ZSdyZSByZXVzaW5nXG4gICAgLy8gYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIGlmIChob29rLmJhc2VTdGF0ZSkge1xuICAgICAgLy8gRmxpcCB0aGlzIGJhY2sgdG8gZmFsc2UuXG4gICAgICBob29rLmJhc2VTdGF0ZSA9IGZhbHNlO1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNldFBlbmRpbmcsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShoaWdoZXJFdmVudFByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHksIENvbnRpbnVvdXNFdmVudFByaW9yaXR5KSk7XG4gIHNldFBlbmRpbmcodHJ1ZSk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0ge307XG4gIHZhciBjdXJyZW50VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzZXRQZW5kaW5nKGZhbHNlKTtcbiAgICBjYWxsYmFjaygpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFRyYW5zaXRpb24oKSB7XG4gIHZhciBfbW91bnRTdGF0ZSA9IG1vdW50U3RhdGUoZmFsc2UpLFxuICAgICAgaXNQZW5kaW5nID0gX21vdW50U3RhdGVbMF0sXG4gICAgICBzZXRQZW5kaW5nID0gX21vdW50U3RhdGVbMV07IC8vIFRoZSBgc3RhcnRgIG1ldGhvZCBuZXZlciBjaGFuZ2VzLlxuXG5cbiAgdmFyIHN0YXJ0ID0gc3RhcnRUcmFuc2l0aW9uLmJpbmQobnVsbCwgc2V0UGVuZGluZyk7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gc3RhcnQ7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRyYW5zaXRpb24oKSB7XG4gIHZhciBfdXBkYXRlU3RhdGUgPSB1cGRhdGVTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3VwZGF0ZVN0YXRlWzBdO1xuXG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBzdGFydCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIFtpc1BlbmRpbmcsIHN0YXJ0XTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJUcmFuc2l0aW9uKCkge1xuICB2YXIgX3JlcmVuZGVyU3RhdGUgPSByZXJlbmRlclN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfcmVyZW5kZXJTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbnZhciBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudElkKCkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7IC8vIFRPRE86IEluIEZpenosIGlkIGdlbmVyYXRpb24gaXMgc3BlY2lmaWMgdG8gZWFjaCBzZXJ2ZXIgY29uZmlnLiBNYXliZSB3ZVxuICAvLyBzaG91bGQgZG8gdGhpcyBpbiBGaWJlciwgdG9vPyBEZWZlcnJpbmcgdGhpcyBkZWNpc2lvbiBmb3Igbm93IGJlY2F1c2VcbiAgLy8gdGhlcmUncyBubyBvdGhlciBwbGFjZSB0byBzdG9yZSB0aGUgcHJlZml4IGV4Y2VwdCBmb3IgYW4gaW50ZXJuYWwgZmllbGQgb25cbiAgLy8gdGhlIHB1YmxpYyBjcmVhdGVSb290IG9iamVjdCwgd2hpY2ggdGhlIGZpYmVyIHRyZWUgZG9lcyBub3QgY3VycmVudGx5IGhhdmVcbiAgLy8gYSByZWZlcmVuY2UgdG8uXG5cbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSByb290LmlkZW50aWZpZXJQcmVmaXg7XG4gIHZhciBpZDtcblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIHZhciB0cmVlSWQgPSBnZXRUcmVlSWQoKTsgLy8gVXNlIGEgY2FwdGlhbCBSIHByZWZpeCBmb3Igc2VydmVyLWdlbmVyYXRlZCBpZHMuXG5cbiAgICBpZCA9ICc6JyArIGlkZW50aWZpZXJQcmVmaXggKyAnUicgKyB0cmVlSWQ7IC8vIFVubGVzcyB0aGlzIGlzIHRoZSBmaXJzdCBpZCBhdCB0aGlzIGxldmVsLCBhcHBlbmQgYSBudW1iZXIgYXQgdGhlIGVuZFxuICAgIC8vIHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhpcyB1c2VJZCBob29rIGFtb25nIGFsbCB0aGUgdXNlSWRcbiAgICAvLyBob29rcyBmb3IgdGhpcyBmaWJlci5cblxuICAgIHZhciBsb2NhbElkID0gbG9jYWxJZENvdW50ZXIrKztcblxuICAgIGlmIChsb2NhbElkID4gMCkge1xuICAgICAgaWQgKz0gJ0gnICsgbG9jYWxJZC50b1N0cmluZygzMik7XG4gICAgfVxuXG4gICAgaWQgKz0gJzonO1xuICB9IGVsc2Uge1xuICAgIC8vIFVzZSBhIGxvd2VyY2FzZSByIHByZWZpeCBmb3IgY2xpZW50LWdlbmVyYXRlZCBpZHMuXG4gICAgdmFyIGdsb2JhbENsaWVudElkID0gZ2xvYmFsQ2xpZW50SWRDb3VudGVyKys7XG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ3InICsgZ2xvYmFsQ2xpZW50SWQudG9TdHJpbmcoMzIpICsgJzonO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaWQ7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSWQoKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBpZCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFJlZHVjZXJBY3Rpb24oZmliZXIsIHF1ZXVlLCBhY3Rpb24pIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcihcIlN0YXRlIHVwZGF0ZXMgZnJvbSB0aGUgdXNlU3RhdGUoKSBhbmQgdXNlUmVkdWNlcigpIEhvb2tzIGRvbid0IHN1cHBvcnQgdGhlIFwiICsgJ3NlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyICcgKyAncmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIHRoZSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGxhbmU6IGxhbmUsXG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgaGFzRWFnZXJTdGF0ZTogZmFsc2UsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpKSB7XG4gICAgZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKTtcbiAgICB9XG4gIH1cblxuICBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoU2V0U3RhdGUoZmliZXIsIHF1ZXVlLCBhY3Rpb24pIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcihcIlN0YXRlIHVwZGF0ZXMgZnJvbSB0aGUgdXNlU3RhdGUoKSBhbmQgdXNlUmVkdWNlcigpIEhvb2tzIGRvbid0IHN1cHBvcnQgdGhlIFwiICsgJ3NlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyICcgKyAncmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIHRoZSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGxhbmU6IGxhbmUsXG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgaGFzRWFnZXJTdGF0ZTogZmFsc2UsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpKSB7XG4gICAgZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoZmliZXIubGFuZXMgPT09IE5vTGFuZXMgJiYgKGFsdGVybmF0ZSA9PT0gbnVsbCB8fCBhbHRlcm5hdGUubGFuZXMgPT09IE5vTGFuZXMpKSB7XG4gICAgICAvLyBUaGUgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5LCB3aGljaCBtZWFucyB3ZSBjYW4gZWFnZXJseSBjb21wdXRlIHRoZVxuICAgICAgLy8gbmV4dCBzdGF0ZSBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gSWYgdGhlIG5ldyBzdGF0ZSBpcyB0aGVcbiAgICAgIC8vIHNhbWUgYXMgdGhlIGN1cnJlbnQgc3RhdGUsIHdlIG1heSBiZSBhYmxlIHRvIGJhaWwgb3V0IGVudGlyZWx5LlxuICAgICAgdmFyIGxhc3RSZW5kZXJlZFJlZHVjZXIgPSBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyO1xuXG4gICAgICBpZiAobGFzdFJlbmRlcmVkUmVkdWNlciAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnRTdGF0ZSA9IHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlO1xuICAgICAgICAgIHZhciBlYWdlclN0YXRlID0gbGFzdFJlbmRlcmVkUmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7IC8vIFN0YXNoIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlLCBhbmQgdGhlIHJlZHVjZXIgdXNlZCB0byBjb21wdXRlXG4gICAgICAgICAgLy8gaXQsIG9uIHRoZSB1cGRhdGUgb2JqZWN0LiBJZiB0aGUgcmVkdWNlciBoYXNuJ3QgY2hhbmdlZCBieSB0aGVcbiAgICAgICAgICAvLyB0aW1lIHdlIGVudGVyIHRoZSByZW5kZXIgcGhhc2UsIHRoZW4gdGhlIGVhZ2VyIHN0YXRlIGNhbiBiZSB1c2VkXG4gICAgICAgICAgLy8gd2l0aG91dCBjYWxsaW5nIHRoZSByZWR1Y2VyIGFnYWluLlxuXG4gICAgICAgICAgdXBkYXRlLmhhc0VhZ2VyU3RhdGUgPSB0cnVlO1xuICAgICAgICAgIHVwZGF0ZS5lYWdlclN0YXRlID0gZWFnZXJTdGF0ZTtcblxuICAgICAgICAgIGlmIChvYmplY3RJcyhlYWdlclN0YXRlLCBjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgICAgICAvLyBGYXN0IHBhdGguIFdlIGNhbiBiYWlsIG91dCB3aXRob3V0IHNjaGVkdWxpbmcgUmVhY3QgdG8gcmUtcmVuZGVyLlxuICAgICAgICAgICAgLy8gSXQncyBzdGlsbCBwb3NzaWJsZSB0aGF0IHdlJ2xsIG5lZWQgdG8gcmViYXNlIHRoaXMgdXBkYXRlIGxhdGVyLFxuICAgICAgICAgICAgLy8gaWYgdGhlIGNvbXBvbmVudCByZS1yZW5kZXJzIGZvciBhIGRpZmZlcmVudCByZWFzb24gYW5kIGJ5IHRoYXRcbiAgICAgICAgICAgIC8vIHRpbWUgdGhlIHJlZHVjZXIgaGFzIGNoYW5nZWQuXG4gICAgICAgICAgICAvLyBUT0RPOiBEbyB3ZSBzdGlsbCBuZWVkIHRvIGVudGFuZ2xlIHRyYW5zaXRpb25zIGluIHRoaXMgY2FzZT9cbiAgICAgICAgICAgIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZUFuZEVhZ2VybHlCYWlsb3V0KGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7Ly8gU3VwcHJlc3MgdGhlIGVycm9yLiBJdCB3aWxsIHRocm93IGFnYWluIGluIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUpO1xufVxuXG5mdW5jdGlvbiBpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gIHJldHVybiBmaWJlciA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgYWx0ZXJuYXRlID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xufVxuXG5mdW5jdGlvbiBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSkge1xuICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gU3Rhc2ggaXQgaW4gYSBsYXppbHktY3JlYXRlZCBtYXAgb2ZcbiAgLy8gcXVldWUgLT4gbGlua2VkIGxpc3Qgb2YgdXBkYXRlcy4gQWZ0ZXIgdGhpcyByZW5kZXIgcGFzcywgd2UnbGwgcmVzdGFydFxuICAvLyBhbmQgYXBwbHkgdGhlIHN0YXNoZWQgdXBkYXRlcyBvbiB0b3Agb2YgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IHRydWU7XG4gIHZhciBwZW5kaW5nID0gcXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xufSAvLyBUT0RPOiBNb3ZlIHRvIFJlYWN0RmliZXJDb25jdXJyZW50VXBkYXRlcz9cblxuXG5mdW5jdGlvbiBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpIHtcbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5XG4gICAgLy8gbXVzdCBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaFxuICAgIC8vIHJlcHJlc2VudHMgYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZVxuICAgIC8vIG1heSBlbnRhbmdsZSBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmXG4gICAgLy8gd2UgKmRvbid0KiBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgcXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUsIGFjdGlvbikge1xuXG4gIHtcbiAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICB9XG59XG5cbnZhciBDb250ZXh0T25seURpc3BhdGNoZXIgPSB7XG4gIHJlYWRDb250ZXh0OiByZWFkQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2s6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlQ29udGV4dDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJbnNlcnRpb25FZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTGF5b3V0RWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU1lbW86IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3RhdGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVRyYW5zaXRpb246IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTXV0YWJsZVNvdXJjZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJZDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbn07XG5cbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xuXG57XG4gIHZhciB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICB9O1xuXG4gIHZhciB3YXJuSW52YWxpZEhvb2tBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0RvIG5vdCBjYWxsIEhvb2tzIGluc2lkZSB1c2VFZmZlY3QoLi4uKSwgdXNlTWVtbyguLi4pLCBvciBvdGhlciBidWlsdC1pbiBIb29rcy4gJyArICdZb3UgY2FuIG9ubHkgY2FsbCBIb29rcyBhdCB0aGUgdG9wIGxldmVsIG9mIHlvdXIgUmVhY3QgZnVuY3Rpb24uICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rcycpO1xuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xufVxuXG52YXIgbm93JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfbm93O1xudmFyIGNvbW1pdFRpbWUgPSAwO1xudmFyIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IC0xO1xudmFyIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG52YXIgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xO1xuLyoqXG4gKiBUcmFja3Mgd2hldGhlciB0aGUgY3VycmVudCB1cGRhdGUgd2FzIGEgbmVzdGVkL2Nhc2NhZGluZyB1cGRhdGUgKHNjaGVkdWxlZCBmcm9tIGEgbGF5b3V0IGVmZmVjdCkuXG4gKlxuICogVGhlIG92ZXJhbGwgc2VxdWVuY2UgaXM6XG4gKiAgIDEuIHJlbmRlclxuICogICAyLiBjb21taXQgKGFuZCBjYWxsIGBvblJlbmRlcmAsIGBvbkNvbW1pdGApXG4gKiAgIDMuIGNoZWNrIGZvciBuZXN0ZWQgdXBkYXRlc1xuICogICA0LiBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgKGFuZCBjYWxsIGBvblBvc3RDb21taXRgKVxuICpcbiAqIE5lc3RlZCB1cGRhdGVzIGFyZSBpZGVudGlmaWVkIGluIHN0ZXAgMyBhYm92ZSxcbiAqIGJ1dCBzdGVwIDQgc3RpbGwgYXBwbGllcyB0byB0aGUgd29yayB0aGF0IHdhcyBqdXN0IGNvbW1pdHRlZC5cbiAqIFdlIHVzZSB0d28gZmxhZ3MgdG8gdHJhY2sgbmVzdGVkIHVwZGF0ZXMgdGhlbjpcbiAqIG9uZSB0cmFja3Mgd2hldGhlciB0aGUgdXBjb21pbmcgdXBkYXRlIGlzIGEgbmVzdGVkIHVwZGF0ZSxcbiAqIGFuZCB0aGUgb3RoZXIgdHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZCB1cGRhdGUuXG4gKiBUaGUgZmlyc3QgdmFsdWUgZ2V0cyBzeW5jZWQgdG8gdGhlIHNlY29uZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlbmRlciBwaGFzZS5cbiAqL1xuXG52YXIgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7XG52YXIgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRVcGRhdGVJc05lc3RlZDtcbn1cblxuZnVuY3Rpb24gbWFya05lc3RlZFVwZGF0ZVNjaGVkdWxlZCgpIHtcbiAge1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXROZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3luY05lc3RlZFVwZGF0ZUZsYWcoKSB7XG4gIHtcbiAgICBjdXJyZW50VXBkYXRlSXNOZXN0ZWQgPSBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQ7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q29tbWl0VGltZSgpIHtcbiAgcmV0dXJuIGNvbW1pdFRpbWU7XG59XG5cbmZ1bmN0aW9uIHJlY29yZENvbW1pdFRpbWUoKSB7XG5cbiAgY29tbWl0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0UHJvZmlsZXJUaW1lcihmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gbm93JDEoKTtcblxuICBpZiAoZmliZXIuYWN0dWFsU3RhcnRUaW1lIDwgMCkge1xuICAgIGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA9IG5vdyQxKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGZpYmVyLCBvdmVycmlkZUJhc2VUaW1lKSB7XG5cbiAgaWYgKHByb2ZpbGVyU3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gcHJvZmlsZXJTdGFydFRpbWU7XG4gICAgZmliZXIuYWN0dWFsRHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG5cbiAgICBpZiAob3ZlcnJpZGVCYXNlVGltZSkge1xuICAgICAgZmliZXIuc2VsZkJhc2VEdXJhdGlvbiA9IGVsYXBzZWRUaW1lO1xuICAgIH1cblxuICAgIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAobGF5b3V0RWZmZWN0U3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gbGF5b3V0RWZmZWN0U3RhcnRUaW1lO1xuICAgIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICByb290LmVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcGFyZW50U3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaWJlcikge1xuXG4gIGlmIChwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZTtcbiAgICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gLTE7IC8vIFN0b3JlIGR1cmF0aW9uIG9uIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3JcbiAgICAvLyBPciB0aGUgcm9vdCAoZm9yIHRoZSBEZXZUb29scyBQcm9maWxlciB0byByZWFkKVxuXG4gICAgdmFyIHBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAgd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAocGFyZW50U3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBEZXRhY2hlZCBmaWJlcnMgaGF2ZSB0aGVpciBzdGF0ZSBub2RlIGNsZWFyZWQgb3V0LlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgcmV0dXJuIHBvaW50ZXIgaXMgYWxzbyBjbGVhcmVkIG91dCxcbiAgICAgICAgICAgIC8vIHNvIHdlIHdvbid0IGJlIGFibGUgdG8gcmVwb3J0IHRoZSB0aW1lIHNwZW50IGluIHRoaXMgUHJvZmlsZXIncyBzdWJ0cmVlLlxuICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydExheW91dEVmZmVjdFRpbWVyKCkge1xuXG4gIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCkge1xuXG4gIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKGZpYmVyKSB7XG4gIC8vIFRyYW5zZmVyIHRpbWUgc3BlbnQgcmVuZGVyaW5nIHRoZXNlIGNoaWxkcmVuIHNvIHdlIGRvbid0IGxvc2UgaXRcbiAgLy8gYWZ0ZXIgd2UgcmVyZW5kZXIuIFRoaXMgaXMgdXNlZCBhcyBhIGhlbHBlciBpbiBzcGVjaWFsIGNhc2VzXG4gIC8vIHdoZXJlIHdlIHNob3VsZCBjb3VudCB0aGUgd29yayBvZiBtdWx0aXBsZSBwYXNzZXMuXG4gIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgYmFzZVByb3BzKSB7XG4gIGlmIChDb21wb25lbnQgJiYgQ29tcG9uZW50LmRlZmF1bHRQcm9wcykge1xuICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wcy4gVGFrZW4gZnJvbSBSZWFjdEVsZW1lbnRcbiAgICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGJhc2VQcm9wcyk7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IENvbXBvbmVudC5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9wcztcbiAgfVxuXG4gIHJldHVybiBiYXNlUHJvcHM7XG59XG5cbnZhciBmYWtlSW50ZXJuYWxJbnN0YW5jZSA9IHt9O1xudmFyIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGU7XG52YXIgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlO1xudmFyIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGU7XG52YXIgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlO1xudmFyIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25JbnZhbGlkQ2FsbGJhY2s7XG52YXIgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGU7XG52YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXM7XG52YXIgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlO1xudmFyIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMTtcblxue1xuICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcyA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEgPSBuZXcgU2V0KCk7XG4gIHZhciBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBuZXcgU2V0KCk7XG5cbiAgd2Fybk9uSW52YWxpZENhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgaWYgKGNhbGxiYWNrID09PSBudWxsIHx8IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBjYWxsZXJOYW1lICsgJ18nICsgY2FsbGJhY2s7XG5cbiAgICBpZiAoIWRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5oYXMoa2V5KSkge1xuICAgICAgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmFkZChrZXkpO1xuXG4gICAgICBlcnJvcignJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH07XG5cbiAgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gZnVuY3Rpb24gKHR5cGUsIHBhcnRpYWxTdGF0ZSkge1xuICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKTogQSB2YWxpZCBzdGF0ZSBvYmplY3QgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuICcgKyAnWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gVGhpcyBpcyBzbyBncm9zcyBidXQgaXQncyBhdCBsZWFzdCBub24tY3JpdGljYWwgYW5kIGNhbiBiZSByZW1vdmVkIGlmXG4gIC8vIGl0IGNhdXNlcyBwcm9ibGVtcy4gVGhpcyBpcyBtZWFudCB0byBnaXZlIGEgbmljZXIgZXJyb3IgbWVzc2FnZSBmb3JcbiAgLy8gUmVhY3RET00xNS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihyZWFjdERPTTE2Q29tcG9uZW50LFxuICAvLyAuLi4pKSB3aGljaCBvdGhlcndpc2UgdGhyb3dzIGEgXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYSBmdW5jdGlvblwiXG4gIC8vIGV4Y2VwdGlvbi5cblxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYWtlSW50ZXJuYWxJbnN0YW5jZSwgJ19wcm9jZXNzQ2hpbGRDb250ZXh0Jywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ19wcm9jZXNzQ2hpbGRDb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgaW4gUmVhY3QgMTYrLiBUaGlzIGxpa2VseSAnICsgJ21lYW5zIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBhbmQgYXJlIGF0dGVtcHRpbmcgdG8gbmVzdCAnICsgJ2EgUmVhY3QgMTUgdHJlZSBpbnNpZGUgYSBSZWFjdCAxNiB0cmVlIHVzaW5nICcgKyBcInVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLCB3aGljaCBpc24ndCBzdXBwb3J0ZWQuIFRyeSBcIiArICd0byBtYWtlIHN1cmUgeW91IGhhdmUgb25seSBvbmUgY29weSBvZiBSZWFjdCAoYW5kIGlkZWFsbHksIHN3aXRjaCAnICsgJ3RvIFJlYWN0RE9NLmNyZWF0ZVBvcnRhbCkuJyk7XG4gICAgfVxuICB9KTtcbiAgT2JqZWN0LmZyZWV6ZShmYWtlSW50ZXJuYWxJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5leHRQcm9wcykge1xuICB2YXIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG5cbiAge1xuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZShjdG9yLCBwYXJ0aWFsU3RhdGUpO1xuICB9IC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG5cblxuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCA/IHByZXZTdGF0ZSA6IGFzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbWVtb2l6ZWRTdGF0ZTsgLy8gT25jZSB0aGUgdXBkYXRlIHF1ZXVlIGlzIGVtcHR5LCBwZXJzaXN0IHRoZSBkZXJpdmVkIHN0YXRlIG9udG8gdGhlXG4gIC8vIGJhc2Ugc3RhdGUuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gUXVldWUgaXMgYWx3YXlzIG5vbi1udWxsIGZvciBjbGFzc2VzXG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gbWVtb2l6ZWRTdGF0ZTtcbiAgfVxufVxuXG52YXIgY2xhc3NDb21wb25lbnRVcGRhdGVyID0ge1xuICBpc01vdW50ZWQ6IGlzTW91bnRlZCxcbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9LFxuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnRhZyA9IFJlcGxhY2VTdGF0ZTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdyZXBsYWNlU3RhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9LFxuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHNob3VsZFVwZGF0ZSA9IGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcblxuICAgIHtcbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yKCclcy5zaG91bGRDb21wb25lbnRVcGRhdGUoKTogUmV0dXJuZWQgdW5kZWZpbmVkIGluc3RlYWQgb2YgYSAnICsgJ2Jvb2xlYW4gdmFsdWUuIE1ha2Ugc3VyZSB0byByZXR1cm4gdHJ1ZSBvciBmYWxzZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH1cblxuICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbChvbGRQcm9wcywgbmV3UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG4gICAgdmFyIHJlbmRlclByZXNlbnQgPSBpbnN0YW5jZS5yZW5kZXI7XG5cbiAgICBpZiAoIXJlbmRlclByZXNlbnQpIHtcbiAgICAgIGlmIChjdG9yLnByb3RvdHlwZSAmJiB0eXBlb2YgY3Rvci5wcm90b3R5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiBkaWQgeW91IGFjY2lkZW50YWxseSByZXR1cm4gYW4gb2JqZWN0IGZyb20gdGhlIGNvbnN0cnVjdG9yPycsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IHlvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gZGVmaW5lIGByZW5kZXJgLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUgJiYgIWluc3RhbmNlLmdldEluaXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCAmJiAhaW5zdGFuY2Uuc3RhdGUpIHtcbiAgICAgIGVycm9yKCdnZXRJbml0aWFsU3RhdGUgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3RlYWQ/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmdldERlZmF1bHRQcm9wcyAmJiAhaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ1VzZSBhIHN0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgZGVmYXVsdFByb3BzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnByb3BUeXBlcykge1xuICAgICAgZXJyb3IoJ3Byb3BUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIHByb3BUeXBlcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5jb250ZXh0VHlwZSkge1xuICAgICAgZXJyb3IoJ2NvbnRleHRUeXBlIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGUgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3Rvci5jaGlsZENvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmhhcyhjdG9yKSAmJiAvLyBTdHJpY3QgTW9kZSBoYXMgaXRzIG93biB3YXJuaW5nIGZvciBsZWdhY3kgY29udGV4dCwgc28gd2UgY2FuIHNraXBcbiAgICAgIC8vIHRoaXMgb25lLlxuICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5hZGQoY3Rvcik7XG5cbiAgICAgICAgZXJyb3IoJyVzIHVzZXMgdGhlIGxlZ2FjeSBjaGlsZENvbnRleHRUeXBlcyBBUEkgd2hpY2ggaXMgbm8gbG9uZ2VyICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gVXNlICcgKyAnUmVhY3QuY3JlYXRlQ29udGV4dCgpIGluc3RlYWRcXG5cXG4uJyArICdMZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEuaGFzKGN0b3IpICYmIC8vIFN0cmljdCBNb2RlIGhhcyBpdHMgb3duIHdhcm5pbmcgZm9yIGxlZ2FjeSBjb250ZXh0LCBzbyB3ZSBjYW4gc2tpcFxuICAgICAgLy8gdGhpcyBvbmUuXG4gICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmFkZChjdG9yKTtcblxuICAgICAgICBlcnJvcignJXMgdXNlcyB0aGUgbGVnYWN5IGNvbnRleHRUeXBlcyBBUEkgd2hpY2ggaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gVXNlICcgKyAnUmVhY3QuY3JlYXRlQ29udGV4dCgpIHdpdGggc3RhdGljIGNvbnRleHRUeXBlIGluc3RlYWQuXFxuXFxuJyArICdMZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyBkZWNsYXJlcyBib3RoIGNvbnRleHRUeXBlcyBhbmQgY29udGV4dFR5cGUgc3RhdGljIHByb3BlcnRpZXMuICcgKyAnVGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBzaG91bGRDb21wb25lbnRVcGRhdGUoKS4gJyArICdzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuICcgKyAnUGxlYXNlIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHVzZWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdBIHB1cmUgY29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFVubW91bnQoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRSZWNlaXZlUHJvcHMoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdJZiB5b3UgbWVhbnQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBpbiByZXNwb25zZSB0byBjaGFuZ2luZyBwcm9wcywgJyArICd1c2UgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpLiBJZiB5b3UgbWVhbnQgdG8gZmV0Y2ggZGF0YSBvciAnICsgJ3J1biBzaWRlLWVmZmVjdHMgb3IgbXV0YXRpb25zIGFmdGVyIFJlYWN0IGhhcyB1cGRhdGVkIHRoZSBVSSwgdXNlIGNvbXBvbmVudERpZFVwZGF0ZSgpLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgaGFzTXV0YXRlZFByb3BzID0gaW5zdGFuY2UucHJvcHMgIT09IG5ld1Byb3BzO1xuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSB1bmRlZmluZWQgJiYgaGFzTXV0YXRlZFByb3BzKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogV2hlbiBjYWxsaW5nIHN1cGVyKCkgaW4gYCVzYCwgbWFrZSBzdXJlIHRvIHBhc3MgJyArIFwidXAgdGhlIHNhbWUgcHJvcHMgdGhhdCB5b3VyIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHdhcyBwYXNzZWQuXCIsIG5hbWUsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGVycm9yKCdTZXR0aW5nIGRlZmF1bHRQcm9wcyBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQuJyArICcgSW5zdGVhZCwgZGVmaW5lIGRlZmF1bHRQcm9wcyBhcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiAlcy4nLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgIWRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5oYXMoY3RvcikpIHtcbiAgICAgIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5hZGQoY3Rvcik7XG5cbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBzaG91bGQgYmUgdXNlZCB3aXRoIGNvbXBvbmVudERpZFVwZGF0ZSgpLiAnICsgJ1RoaXMgY29tcG9uZW50IGRlZmluZXMgZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBvbmx5LicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGlzIGRlZmluZWQgYXMgYSBzdGF0aWMgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhbiBpbnN0YW5jZSBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIF9zdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gICAgaWYgKF9zdGF0ZSAmJiAodHlwZW9mIF9zdGF0ZSAhPT0gJ29iamVjdCcgfHwgaXNBcnJheShfc3RhdGUpKSkge1xuICAgICAgZXJyb3IoJyVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbCcsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjdG9yLmNoaWxkQ29udGV4dFR5cGVzICE9PSAnb2JqZWN0Jykge1xuICAgICAgZXJyb3IoJyVzLmdldENoaWxkQ29udGV4dCgpOiBjaGlsZENvbnRleHRUeXBlcyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gJyArICd1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuJywgbmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UudXBkYXRlciA9IGNsYXNzQ29tcG9uZW50VXBkYXRlcjtcbiAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gaW5zdGFuY2U7IC8vIFRoZSBpbnN0YW5jZSBuZWVkcyBhY2Nlc3MgdG8gdGhlIGZpYmVyIHNvIHRoYXQgaXQgY2FuIHNjaGVkdWxlIHVwZGF0ZXNcblxuICBzZXQoaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzKTtcblxuICB7XG4gICAgaW5zdGFuY2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IGZha2VJbnRlcm5hbEluc3RhbmNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHByb3BzKSB7XG4gIHZhciBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGZhbHNlO1xuICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcblxuICB7XG4gICAgaWYgKCdjb250ZXh0VHlwZScgaW4gY3Rvcikge1xuICAgICAgdmFyIGlzVmFsaWQgPSAvLyBBbGxvdyBudWxsIGZvciBjb25kaXRpb25hbCBkZWNsYXJhdGlvblxuICAgICAgY29udGV4dFR5cGUgPT09IG51bGwgfHwgY29udGV4dFR5cGUgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFICYmIGNvbnRleHRUeXBlLl9jb250ZXh0ID09PSB1bmRlZmluZWQ7IC8vIE5vdCBhIDxDb250ZXh0LkNvbnN1bWVyPlxuXG4gICAgICBpZiAoIWlzVmFsaWQgJiYgIWRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmFkZChjdG9yKTtcbiAgICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG5cbiAgICAgICAgaWYgKGNvbnRleHRUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIHVuZGVmaW5lZC4gJyArICdUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSB0eXBvIG9yIGJ5IG1peGluZyB1cCBuYW1lZCBhbmQgZGVmYXVsdCBpbXBvcnRzLiAnICsgJ1RoaXMgY2FuIGFsc28gaGFwcGVuIGR1ZSB0byBhIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHNvICcgKyAndHJ5IG1vdmluZyB0aGUgY3JlYXRlQ29udGV4dCgpIGNhbGwgdG8gYSBzZXBhcmF0ZSBmaWxlLic7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYSAnICsgdHlwZW9mIGNvbnRleHRUeXBlICsgJy4nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuUHJvdmlkZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLl9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyA8Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Db25zdW1lciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY29udGV4dFR5cGUpLmpvaW4oJywgJykgKyAnfS4nO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJyVzIGRlZmluZXMgYW4gaW52YWxpZCBjb250ZXh0VHlwZS4gJyArICdjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lcycsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSBjdG9yLmNvbnRleHRUeXBlcztcbiAgICBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGNvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBJbnN0YW50aWF0ZSB0d2ljZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG5cbiAge1xuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGUgIT09IG51bGwgJiYgaW5zdGFuY2Uuc3RhdGUgIT09IHVuZGVmaW5lZCA/IGluc3RhbmNlLnN0YXRlIDogbnVsbDtcbiAgYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgc3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAgIC8vIFdhcm4gYWJvdXQgdGhlc2UgbGlmZWN5Y2xlcyBpZiB0aGV5IGFyZSBwcmVzZW50LlxuICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC5cblxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgICB2YXIgbmV3QXBpTmFtZSA9IHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKScgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmhhcyhfY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmFkZChfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgICBlcnJvcignVW5zYWZlIGxlZ2FjeSBsaWZlY3ljbGVzIHdpbGwgbm90IGJlIGNhbGxlZCBmb3IgY29tcG9uZW50cyB1c2luZyBuZXcgY29tcG9uZW50IEFQSXMuXFxuXFxuJyArICclcyB1c2VzICVzIGJ1dCBhbHNvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVnYWN5IGxpZmVjeWNsZXM6JXMlcyVzXFxuXFxuJyArICdUaGUgYWJvdmUgbGlmZWN5Y2xlcyBzaG91bGQgYmUgcmVtb3ZlZC4gTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTpcXG4nICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMnLCBfY29tcG9uZW50TmFtZSwgbmV3QXBpTmFtZSwgZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsTW91bnROYW1lIDogJycsIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lIDogJycsIGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxVcGRhdGVOYW1lIDogJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgLy8gUmVhY3RGaWJlckNvbnRleHQgdXN1YWxseSB1cGRhdGVzIHRoaXMgY2FjaGUgYnV0IGNhbid0IGZvciBuZXdseS1jcmVhdGVkIGluc3RhbmNlcy5cblxuXG4gIGlmIChpc0xlZ2FjeUNvbnRleHRDb25zdW1lcikge1xuICAgIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgdmFyIG9sZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmIChvbGRTdGF0ZSAhPT0gaW5zdGFuY2Uuc3RhdGUpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbE1vdW50KCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byB0aGlzLnN0YXRlIGlzICcgKyBcImRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBvbGRTdGF0ZSkge1xuICAgIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byAnICsgXCJ0aGlzLnN0YXRlIGlzIGRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn0gLy8gSW52b2tlcyB0aGUgbW91bnQgbGlmZS1jeWNsZXMgb24gYSBwcmV2aW91c2x5IG5ldmVyIHJlbmRlcmVkIGluc3RhbmNlLlxuXG5cbmZ1bmN0aW9uIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICBpbnN0YW5jZS5yZWZzID0ge307XG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAge1xuICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYXNzaWduIHByb3BzIGRpcmVjdGx5IHRvIHN0YXRlICcgKyBcImJlY2F1c2UgdXBkYXRlcyB0byBwcm9wcyB3b24ndCBiZSByZWZsZWN0ZWQgaW4gc3RhdGUuIFwiICsgJ0luIG1vc3QgY2FzZXMsIGl0IGlzIGJldHRlciB0byB1c2UgcHJvcHMgZGlyZWN0bHkuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9IC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG5cbiAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpOyAvLyBJZiB3ZSBoYWQgYWRkaXRpb25hbCBzdGF0ZSB1cGRhdGVzIGR1cmluZyB0aGlzIGxpZmUtY3ljbGUsIGxldCdzXG4gICAgLy8gcHJvY2VzcyB0aGVtIG5vdy5cblxuICAgIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgfVxuXG4gICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzO1xuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIG5leHRDb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBuZXh0Q29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSkge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAgICAgIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIF9maWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgICAgIH1cblxuICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIF9maWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFncztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2ZpYmVyRmxhZ3MyID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIF9maWJlckZsYWdzMiB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgICB9XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IF9maWJlckZsYWdzMjtcbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59IC8vIEludm9rZXMgdGhlIHVwZGF0ZSBsaWZlLWN5Y2xlcyBhbmQgcmV0dXJucyBmYWxzZSBpZiBpdCBzaG91bGRuJ3QgcmVyZW5kZXIuXG5cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA/IHVucmVzb2x2ZWRPbGRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgdW5yZXNvbHZlZE9sZFByb3BzKTtcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIHVucmVzb2x2ZWROZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dFVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSB1bnJlc29sdmVkTmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyA9PT0gdW5yZXNvbHZlZE5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpICYmICEoZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgICkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB8fCBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB8fCAvLyBUT0RPOiBJbiBzb21lIGNhc2VzLCB3ZSdsbCBlbmQgdXAgY2hlY2tpbmcgaWYgY29udGV4dCBoYXMgY2hhbmdlZCB0d2ljZSxcbiAgLy8gYm90aCBiZWZvcmUgYW5kIGFmdGVyIGBzaG91bGRDb21wb25lbnRVcGRhdGVgIGhhcyBiZWVuIGNhbGxlZC4gTm90IGlkZWFsLFxuICAvLyBidXQgSSdtIGxvYXRoIHRvIHJlZmFjdG9yIHRoaXMgZnVuY3Rpb24uIFRoaXMgb25seSBoYXBwZW5zIGZvciBtZW1vaXplZFxuICAvLyBjb21wb25lbnRzIHNvIGl0J3Mgbm90IHRoYXQgY29tbW9uLlxuICBlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uICAgO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH0gLy8gSWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmVkIGZhbHNlLCB3ZSBzaG91bGQgc3RpbGwgdXBkYXRlIHRoZVxuICAgIC8vIG1lbW9pemVkIHByb3BzL3N0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuXG5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBuZXdQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gVXBkYXRlIHRoZSBleGlzdGluZyBpbnN0YW5jZSdzIHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgcG9pbnRlcnMgZXZlblxuICAvLyBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJucyBmYWxzZS5cblxuXG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gbmV3U3RhdGU7XG4gIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZSkge1xuICAvLyBJZiB0aGUgdmFsdWUgaXMgYW4gZXJyb3IsIGNhbGwgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBhZnRlciBpdCBpcyB0aHJvd25cbiAgLy8gc28gdGhlIHN0YWNrIGlzIGFjY3VyYXRlLlxuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzdGFjazogZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHNvdXJjZSksXG4gICAgZGlnZXN0OiBudWxsXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBkaWdlc3QsIHN0YWNrKSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHNvdXJjZTogbnVsbCxcbiAgICBzdGFjazogc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogbnVsbCxcbiAgICBkaWdlc3Q6IGRpZ2VzdCAhPSBudWxsID8gZGlnZXN0IDogbnVsbFxuICB9O1xufVxuXG4vLyBUaGlzIG1vZHVsZSBpcyBmb3JrZWQgaW4gZGlmZmVyZW50IGVudmlyb25tZW50cy5cbi8vIEJ5IGRlZmF1bHQsIHJldHVybiBgdHJ1ZWAgdG8gbG9nIGVycm9ycyB0byB0aGUgY29uc29sZS5cbi8vIEZvcmtzIGNhbiByZXR1cm4gYGZhbHNlYCBpZiB0aGlzIGlzbid0IGRlc2lyYWJsZS5cbmZ1bmN0aW9uIHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsb2dDYXB0dXJlZEVycm9yKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgdHJ5IHtcbiAgICB2YXIgbG9nRXJyb3IgPSBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbyk7IC8vIEFsbG93IGluamVjdGVkIHNob3dFcnJvckRpYWxvZygpIHRvIHByZXZlbnQgZGVmYXVsdCBjb25zb2xlLmVycm9yIGxvZ2dpbmcuXG4gICAgLy8gVGhpcyBlbmFibGVzIHJlbmRlcmVycyBsaWtlIFJlYWN0TmF0aXZlIHRvIGJldHRlciBtYW5hZ2UgcmVkYm94IGJlaGF2aW9yLlxuXG4gICAgaWYgKGxvZ0Vycm9yID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIGlmICh0cnVlKSB7XG4gICAgICB2YXIgc291cmNlID0gZXJyb3JJbmZvLnNvdXJjZTtcbiAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjaztcbiAgICAgIHZhciBjb21wb25lbnRTdGFjayA9IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJzsgLy8gQnJvd3NlcnMgc3VwcG9ydCBzaWxlbmNpbmcgdW5jYXVnaHQgZXJyb3JzIGJ5IGNhbGxpbmdcbiAgICAgIC8vIGBwcmV2ZW50RGVmYXVsdCgpYCBpbiB3aW5kb3cgYGVycm9yYCBoYW5kbGVyLlxuICAgICAgLy8gV2UgcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24gYXMgYW4gZXhwYW5kbyBvbiB0aGUgZXJyb3IuXG5cbiAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAvLyBUaGUgZXJyb3IgaXMgcmVjb3ZlcmFibGUgYW5kIHdhcyBzaWxlbmNlZC5cbiAgICAgICAgICAvLyBJZ25vcmUgaXQgYW5kIGRvbid0IHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cbiAgICAgICAgICAvLyBUaGlzIGlzIGhhbmR5IGZvciB0ZXN0aW5nIGVycm9yIGJvdW5kYXJpZXMgd2l0aG91dCBub2lzZS5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gVGhlIGVycm9yIGlzIGZhdGFsLiBTaW5jZSB0aGUgc2lsZW5jaW5nIG1pZ2h0IGhhdmVcbiAgICAgICAgLy8gYmVlbiBhY2NpZGVudGFsLCB3ZSdsbCBzdXJmYWNlIGl0IGFueXdheS5cbiAgICAgICAgLy8gSG93ZXZlciwgdGhlIGJyb3dzZXIgd291bGQgaGF2ZSBzaWxlbmNlZCB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICAgICAgLy8gc28gd2UnbGwgcHJpbnQgaXQgZmlyc3QsIGFuZCB0aGVuIHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cblxuXG4gICAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICAgICAgLy8gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGJsb2NrLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEzMzg0XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gc291cmNlID8gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihzb3VyY2UpIDogbnVsbDtcbiAgICAgIHZhciBjb21wb25lbnROYW1lTWVzc2FnZSA9IGNvbXBvbmVudE5hbWUgPyBcIlRoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiB0aGUgPFwiICsgY29tcG9uZW50TmFtZSArIFwiPiBjb21wb25lbnQ6XCIgOiAnVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIG9uZSBvZiB5b3VyIFJlYWN0IGNvbXBvbmVudHM6JztcbiAgICAgIHZhciBlcnJvckJvdW5kYXJ5TWVzc2FnZTtcblxuICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSAnQ29uc2lkZXIgYWRkaW5nIGFuIGVycm9yIGJvdW5kYXJ5IHRvIHlvdXIgdHJlZSB0byBjdXN0b21pemUgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3IuXFxuJyArICdWaXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZXJyb3ItYm91bmRhcmllcyB0byBsZWFybiBtb3JlIGFib3V0IGVycm9yIGJvdW5kYXJpZXMuJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBlcnJvckJvdW5kYXJ5TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoYm91bmRhcnkpIHx8ICdBbm9ueW1vdXMnO1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9IFwiUmVhY3Qgd2lsbCB0cnkgdG8gcmVjcmVhdGUgdGhpcyBjb21wb25lbnQgdHJlZSBmcm9tIHNjcmF0Y2ggXCIgKyAoXCJ1c2luZyB0aGUgZXJyb3IgYm91bmRhcnkgeW91IHByb3ZpZGVkLCBcIiArIGVycm9yQm91bmRhcnlOYW1lICsgXCIuXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29tYmluZWRNZXNzYWdlID0gY29tcG9uZW50TmFtZU1lc3NhZ2UgKyBcIlxcblwiICsgY29tcG9uZW50U3RhY2sgKyBcIlxcblxcblwiICsgKFwiXCIgKyBlcnJvckJvdW5kYXJ5TWVzc2FnZSk7IC8vIEluIGRldmVsb3BtZW50LCB3ZSBwcm92aWRlIG91ciBvd24gbWVzc2FnZSB3aXRoIGp1c3QgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAgICAgIC8vIFdlIGRvbid0IGluY2x1ZGUgdGhlIG9yaWdpbmFsIGVycm9yIG1lc3NhZ2UgYW5kIEpTIHN0YWNrIGJlY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAgIC8vIGhhcyBhbHJlYWR5IHByaW50ZWQgaXQuIEV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIHN3YWxsb3dzIHRoZSBlcnJvciwgaXQgaXMgc3RpbGxcbiAgICAgIC8vIGRpc3BsYXllZCBieSB0aGUgYnJvd3NlciB0aGFua3MgdG8gdGhlIERFVi1vbmx5IGZha2UgZXZlbnQgdHJpY2sgaW4gUmVhY3RFcnJvclV0aWxzLlxuXG4gICAgICBjb25zb2xlWydlcnJvciddKGNvbWJpbmVkTWVzc2FnZSk7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBwcm9kdWN0aW9uLCB3ZSBwcmludCB0aGUgZXJyb3IgZGlyZWN0bHkuXG4gICAgICAvLyBUaGlzIHdpbGwgaW5jbHVkZSB0aGUgbWVzc2FnZSwgdGhlIEpTIHN0YWNrLCBhbmQgYW55dGhpbmcgdGhlIGJyb3dzZXIgd2FudHMgdG8gc2hvdy5cbiAgICAgIC8vIFdlIHBhc3MgdGhlIGVycm9yIG9iamVjdCBpbnN0ZWFkIG9mIGN1c3RvbSBtZXNzYWdlIHNvIHRoYXQgdGhlIGJyb3dzZXIgZGlzcGxheXMgdGhlIGVycm9yIG5hdGl2ZWx5LlxuICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93LCBvciBSZWFjdCBpbnRlcm5hbCBzdGF0ZSB3aWxsIGdldCBtZXNzZWQgdXAuXG4gICAgLy8gSWYgY29uc29sZS5lcnJvciBpcyBvdmVycmlkZGVuLCBvciBsb2dDYXB0dXJlZEVycm9yKCkgc2hvd3MgYSBkaWFsb2cgdGhhdCB0aHJvd3MsXG4gICAgLy8gd2Ugd2FudCB0byByZXBvcnQgdGhpcyBlcnJvciBvdXRzaWRlIG9mIHRoZSBub3JtYWwgc3RhY2sgYXMgYSBsYXN0IHJlc29ydC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMTg4XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBQb3NzaWJseVdlYWtNYXAkMSA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdEVycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7IC8vIFVubW91bnQgdGhlIHJvb3QgYnkgcmVuZGVyaW5nIG51bGwuXG5cbiAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG4gIHVwZGF0ZS5wYXlsb2FkID0ge1xuICAgIGVsZW1lbnQ6IG51bGxcbiAgfTtcbiAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICBvblVuY2F1Z2h0RXJyb3IoZXJyb3IpO1xuICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gIH07XG5cbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpO1xuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9IGZpYmVyLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGVycm9yJDEgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgICB1cGRhdGUucGF5bG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IkMSk7XG4gICAgfTtcblxuICAgIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHtcbiAgICAgICAgbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpO1xuICAgICAgfVxuXG4gICAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuICAgIH07XG4gIH1cblxuICB2YXIgaW5zdCA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICBpZiAoaW5zdCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdC5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAge1xuICAgICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG5cbiAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRvIHByZXNlcnZlIHRoZSBwcmVleGlzdGluZyByZXRyeSBiZWhhdmlvciBvZiBlcnJvciBib3VuZGFyaWVzLFxuICAgICAgICAvLyB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIG9uZXMgYWxyZWFkeSBmYWlsZWQgZHVyaW5nIHRoaXMgYmF0Y2guXG4gICAgICAgIC8vIFRoaXMgZ2V0cyByZXNldCBiZWZvcmUgd2UgeWllbGQgYmFjayB0byB0aGUgYnJvd3Nlci5cbiAgICAgICAgLy8gVE9ETzogV2FybiBpbiBzdHJpY3QgbW9kZSBpZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXNcbiAgICAgICAgLy8gbm90IGRlZmluZWQuXG4gICAgICAgIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdGhpcy5jb21wb25lbnREaWRDYXRjaChlcnJvciQxLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJydcbiAgICAgIH0pO1xuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSWYgY29tcG9uZW50RGlkQ2F0Y2ggaXMgdGhlIG9ubHkgZXJyb3IgYm91bmRhcnkgbWV0aG9kIGRlZmluZWQsXG4gICAgICAgICAgLy8gdGhlbiBpdCBuZWVkcyB0byBjYWxsIHNldFN0YXRlIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuXG4gICAgICAgICAgLy8gSWYgbm8gc3RhdGUgdXBkYXRlIGlzIHNjaGVkdWxlZCB0aGVuIHRoZSBib3VuZGFyeSB3aWxsIHN3YWxsb3cgdGhlIGVycm9yLlxuICAgICAgICAgIGlmICghaW5jbHVkZXNTb21lTGFuZShmaWJlci5sYW5lcywgU3luY0xhbmUpKSB7XG4gICAgICAgICAgICBlcnJvcignJXM6IEVycm9yIGJvdW5kYXJpZXMgc2hvdWxkIGltcGxlbWVudCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKS4gJyArICdJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIC8vIEF0dGFjaCBhIHBpbmcgbGlzdGVuZXJcbiAgLy9cbiAgLy8gVGhlIGRhdGEgbWlnaHQgcmVzb2x2ZSBiZWZvcmUgd2UgaGF2ZSBhIGNoYW5jZSB0byBjb21taXQgdGhlIGZhbGxiYWNrLiBPcixcbiAgLy8gaW4gdGhlIGNhc2Ugb2YgYSByZWZyZXNoLCB3ZSdsbCBuZXZlciBjb21taXQgYSBmYWxsYmFjay4gU28gd2UgbmVlZCB0b1xuICAvLyBhdHRhY2ggYSBsaXN0ZW5lciBub3cuIFdoZW4gaXQgcmVzb2x2ZXMgKFwicGluZ3NcIiksIHdlIGNhbiBkZWNpZGUgd2hldGhlciB0b1xuICAvLyB0cnkgcmVuZGVyaW5nIHRoZSB0cmVlIGFnYWluLlxuICAvL1xuICAvLyBPbmx5IGF0dGFjaCBhIGxpc3RlbmVyIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgbGFuZXNcbiAgLy8gd2UncmUgY3VycmVudGx5IHJlbmRlcmluZyAod2hpY2ggYWN0cyBsaWtlIGEgXCJ0aHJlYWQgSURcIiBoZXJlKS5cbiAgLy9cbiAgLy8gV2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzXG4gIC8vIGNvbW1pdHMgZmFsbGJhY2tzIHN5bmNocm9ub3VzbHksIHNvIHRoZXJlIGFyZSBubyBwaW5ncy5cbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuICB2YXIgdGhyZWFkSURzO1xuXG4gIGlmIChwaW5nQ2FjaGUgPT09IG51bGwpIHtcbiAgICBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAkMSgpO1xuICAgIHRocmVhZElEcyA9IG5ldyBTZXQoKTtcbiAgICBwaW5nQ2FjaGUuc2V0KHdha2VhYmxlLCB0aHJlYWRJRHMpO1xuICB9IGVsc2Uge1xuICAgIHRocmVhZElEcyA9IHBpbmdDYWNoZS5nZXQod2FrZWFibGUpO1xuXG4gICAgaWYgKHRocmVhZElEcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgICBwaW5nQ2FjaGUuc2V0KHdha2VhYmxlLCB0aHJlYWRJRHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghdGhyZWFkSURzLmhhcyhsYW5lcykpIHtcbiAgICAvLyBNZW1vaXplIHVzaW5nIHRoZSB0aHJlYWQgSUQgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgIHRocmVhZElEcy5hZGQobGFuZXMpO1xuICAgIHZhciBwaW5nID0gcGluZ1N1c3BlbmRlZFJvb3QuYmluZChudWxsLCByb290LCB3YWtlYWJsZSwgbGFuZXMpO1xuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCByZXN0b3JlIHRoZSBvcmlnaW5hbCB1cGRhdGVyc1xuICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YWtlYWJsZS50aGVuKHBpbmcsIHBpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIC8vIFJldHJ5IGxpc3RlbmVyXG4gIC8vXG4gIC8vIElmIHRoZSBmYWxsYmFjayBkb2VzIGNvbW1pdCwgd2UgbmVlZCB0byBhdHRhY2ggYSBkaWZmZXJlbnQgdHlwZSBvZlxuICAvLyBsaXN0ZW5lci4gVGhpcyBvbmUgc2NoZWR1bGVzIGFuIHVwZGF0ZSBvbiB0aGUgU3VzcGVuc2UgYm91bmRhcnkgdG8gdHVyblxuICAvLyB0aGUgZmFsbGJhY2sgc3RhdGUgb2ZmLlxuICAvL1xuICAvLyBTdGFzaCB0aGUgd2FrZWFibGUgb24gdGhlIGJvdW5kYXJ5IGZpYmVyIHNvIHdlIGNhbiBhY2Nlc3MgaXQgaW4gdGhlXG4gIC8vIGNvbW1pdCBwaGFzZS5cbiAgLy9cbiAgLy8gV2hlbiB0aGUgd2FrZWFibGUgcmVzb2x2ZXMsIHdlJ2xsIGF0dGVtcHQgdG8gcmVuZGVyIHRoZSBib3VuZGFyeVxuICAvLyBhZ2FpbiAoXCJyZXRyeVwiKS5cbiAgdmFyIHdha2VhYmxlcyA9IHN1c3BlbnNlQm91bmRhcnkudXBkYXRlUXVldWU7XG5cbiAgaWYgKHdha2VhYmxlcyA9PT0gbnVsbCkge1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICB1cGRhdGVRdWV1ZS5hZGQod2FrZWFibGUpO1xuICAgIHN1c3BlbnNlQm91bmRhcnkudXBkYXRlUXVldWUgPSB1cGRhdGVRdWV1ZTtcbiAgfSBlbHNlIHtcbiAgICB3YWtlYWJsZXMuYWRkKHdha2VhYmxlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldFN1c3BlbmRlZENvbXBvbmVudChzb3VyY2VGaWJlciwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIEEgbGVnYWN5IG1vZGUgU3VzcGVuc2UgcXVpcmssIG9ubHkgcmVsZXZhbnQgdG8gaG9vayBjb21wb25lbnRzLlxuXG5cbiAgdmFyIHRhZyA9IHNvdXJjZUZpYmVyLnRhZztcblxuICBpZiAoKHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAodGFnID09PSBGdW5jdGlvbkNvbXBvbmVudCB8fCB0YWcgPT09IEZvcndhcmRSZWYgfHwgdGFnID09PSBTaW1wbGVNZW1vQ29tcG9uZW50KSkge1xuICAgIHZhciBjdXJyZW50U291cmNlID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnRTb3VyY2UpIHtcbiAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gY3VycmVudFNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgICAgIHNvdXJjZUZpYmVyLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50U291cmNlLm1lbW9pemVkU3RhdGU7XG4gICAgICBzb3VyY2VGaWJlci5sYW5lcyA9IGN1cnJlbnRTb3VyY2UubGFuZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIHNvdXJjZUZpYmVyLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcikge1xuICB2YXIgbm9kZSA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIHNob3VsZENhcHR1cmVTdXNwZW5zZShub2RlKSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSAvLyBUaGlzIGJvdW5kYXJ5IGFscmVhZHkgY2FwdHVyZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBDb250aW51ZSB0byB0aGUgbmV4dFxuICAgIC8vIGJvdW5kYXJ5LlxuXG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH0gd2hpbGUgKG5vZGUgIT09IG51bGwpO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBtYXJrcyBhIFN1c3BlbnNlIGJvdW5kYXJ5IHNvIHRoYXQgd2hlbiB3ZSdyZSB1bndpbmRpbmcgdGhlIHN0YWNrLFxuICAvLyBpdCBjYXB0dXJlcyB0aGUgc3VzcGVuZGVkIFwiZXhjZXB0aW9uXCIgYW5kIGRvZXMgYSBzZWNvbmQgKGZhbGxiYWNrKSBwYXNzLlxuICBpZiAoKHN1c3BlbnNlQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gTGVnYWN5IE1vZGUgU3VzcGVuc2VcbiAgICAvL1xuICAgIC8vIElmIHRoZSBib3VuZGFyeSBpcyBpbiBsZWdhY3kgbW9kZSwgd2Ugc2hvdWxkICpub3QqXG4gICAgLy8gc3VzcGVuZCB0aGUgY29tbWl0LiBQcmV0ZW5kIGFzIGlmIHRoZSBzdXNwZW5kZWQgY29tcG9uZW50IHJlbmRlcmVkXG4gICAgLy8gbnVsbCBhbmQga2VlcCByZW5kZXJpbmcuIFdoZW4gdGhlIFN1c3BlbnNlIGJvdW5kYXJ5IGNvbXBsZXRlcyxcbiAgICAvLyB3ZSdsbCBkbyBhIHNlY29uZCBwYXNzIHRvIHJlbmRlciB0aGUgZmFsbGJhY2suXG4gICAgaWYgKHN1c3BlbnNlQm91bmRhcnkgPT09IHJldHVybkZpYmVyKSB7XG4gICAgICAvLyBTcGVjaWFsIGNhc2Ugd2hlcmUgd2Ugc3VzcGVuZGVkIHdoaWxlIHJlY29uY2lsaW5nIHRoZSBjaGlsZHJlbiBvZlxuICAgICAgLy8gYSBTdXNwZW5zZSBib3VuZGFyeSdzIGlubmVyIE9mZnNjcmVlbiB3cmFwcGVyIGZpYmVyLiBUaGlzIGhhcHBlbnNcbiAgICAgIC8vIHdoZW4gYSBSZWFjdC5sYXp5IGNvbXBvbmVudCBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhXG4gICAgICAvLyBTdXNwZW5zZSBib3VuZGFyeS5cbiAgICAgIC8vXG4gICAgICAvLyBTdXNwZW5zZSBib3VuZGFyaWVzIGFyZSBpbXBsZW1lbnRlZCBhcyBtdWx0aXBsZSBmaWJlcnMsIGJ1dCB0aGV5XG4gICAgICAvLyBhcmUgYSBzaW5nbGUgY29uY2VwdHVhbCB1bml0LiBUaGUgbGVnYWN5IG1vZGUgYmVoYXZpb3Igd2hlcmUgd2VcbiAgICAgIC8vIHByZXRlbmQgdGhlIHN1c3BlbmRlZCBmaWJlciBjb21taXR0ZWQgYXMgYG51bGxgIHdvbid0IHdvcmssXG4gICAgICAvLyBiZWNhdXNlIGluIHRoaXMgY2FzZSB0aGUgXCJzdXNwZW5kZWRcIiBmaWJlciBpcyB0aGUgaW5uZXJcbiAgICAgIC8vIE9mZnNjcmVlbiB3cmFwcGVyLlxuICAgICAgLy9cbiAgICAgIC8vIEJlY2F1c2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBib3VuZGFyeSBoYXZlbid0IHN0YXJ0ZWQgcmVuZGVyaW5nXG4gICAgICAvLyB5ZXQgKGkuZS4gbm90aGluZyBpbiB0aGUgdHJlZSBoYXMgcGFydGlhbGx5IHJlbmRlcmVkKSB3ZSBjYW5cbiAgICAgIC8vIHN3aXRjaCB0byB0aGUgcmVndWxhciwgY29uY3VycmVudCBtb2RlIGJlaGF2aW9yOiBtYXJrIHRoZVxuICAgICAgLy8gYm91bmRhcnkgd2l0aCBTaG91bGRDYXB0dXJlIGFuZCBlbnRlciB0aGUgdW53aW5kIHBoYXNlLlxuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICBzb3VyY2VGaWJlci5mbGFncyB8PSBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlOyAvLyBXZSdyZSBnb2luZyB0byBjb21taXQgdGhpcyBmaWJlciBldmVuIHRob3VnaCBpdCBkaWRuJ3QgY29tcGxldGUuXG4gICAgICAvLyBCdXQgd2Ugc2hvdWxkbid0IGNhbGwgYW55IGxpZmVjeWNsZSBtZXRob2RzIG9yIGNhbGxiYWNrcy4gUmVtb3ZlXG4gICAgICAvLyBhbGwgbGlmZWN5Y2xlIGVmZmVjdCB0YWdzLlxuXG4gICAgICBzb3VyY2VGaWJlci5mbGFncyAmPSB+KExpZmVjeWNsZUVmZmVjdE1hc2sgfCBJbmNvbXBsZXRlKTtcblxuICAgICAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTb3VyY2VGaWJlciA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICBpZiAoY3VycmVudFNvdXJjZUZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudC4gQ2hhbmdlIHRoZSB0YWcgc28gaXQncyBub3QgbWlzdGFrZW4gZm9yIGFcbiAgICAgICAgICAvLyBjb21wbGV0ZWQgY2xhc3MgY29tcG9uZW50LiBGb3IgZXhhbXBsZSwgd2Ugc2hvdWxkIG5vdCBjYWxsXG4gICAgICAgICAgLy8gY29tcG9uZW50V2lsbFVubW91bnQgaWYgaXQgaXMgZGVsZXRlZC5cbiAgICAgICAgICBzb3VyY2VGaWJlci50YWcgPSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSB0cnkgcmVuZGVyaW5nIGFnYWluLCB3ZSBzaG91bGQgbm90IHJldXNlIHRoZSBjdXJyZW50IGZpYmVyLFxuICAgICAgICAgIC8vIHNpbmNlIGl0J3Mga25vd24gdG8gYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBVc2UgYSBmb3JjZSB1cGRhdGUgdG9cbiAgICAgICAgICAvLyBwcmV2ZW50IGEgYmFpbCBvdXQuXG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgU3luY0xhbmUpO1xuICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICBlbnF1ZXVlVXBkYXRlKHNvdXJjZUZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuIE1hcmsgaXQgd2l0aCBTeW5jIHByaW9yaXR5IHRvXG4gICAgICAvLyBpbmRpY2F0ZSB0aGF0IGl0IHN0aWxsIGhhcyBwZW5kaW5nIHdvcmsuXG5cblxuICAgICAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBTeW5jTGFuZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1c3BlbnNlQm91bmRhcnk7XG4gIH0gLy8gQ29uZmlybWVkIHRoYXQgdGhlIGJvdW5kYXJ5IGlzIGluIGEgY29uY3VycmVudCBtb2RlIHRyZWUuIENvbnRpbnVlXG4gIC8vIHdpdGggdGhlIG5vcm1hbCBzdXNwZW5kIHBhdGguXG4gIC8vXG4gIC8vIEFmdGVyIHRoaXMgd2UnbGwgdXNlIGEgc2V0IG9mIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpc1xuICAvLyByZW5kZXIgcGFzcyB3aWxsIHJ1biB0byBjb21wbGV0aW9uIG9yIHJlc3RhcnQgb3IgXCJzdXNwZW5kXCIgdGhlIGNvbW1pdC5cbiAgLy8gVGhlIGFjdHVhbCBsb2dpYyBmb3IgdGhpcyBpcyBzcHJlYWQgb3V0IGluIGRpZmZlcmVudCBwbGFjZXMuXG4gIC8vXG4gIC8vIFRoaXMgZmlyc3QgcHJpbmNpcGxlIGlzIHRoYXQgaWYgd2UncmUgZ29pbmcgdG8gc3VzcGVuZCB3aGVuIHdlIGNvbXBsZXRlXG4gIC8vIGEgcm9vdCwgdGhlbiB3ZSBzaG91bGQgYWxzbyByZXN0YXJ0IGlmIHdlIGdldCBhbiB1cGRhdGUgb3IgcGluZyB0aGF0XG4gIC8vIG1pZ2h0IHVuc3VzcGVuZCBpdCwgYW5kIHZpY2UgdmVyc2EuIFRoZSBvbmx5IHJlYXNvbiB0byBzdXNwZW5kIGlzXG4gIC8vIGJlY2F1c2UgeW91IHRoaW5rIHlvdSBtaWdodCB3YW50IHRvIHJlc3RhcnQgYmVmb3JlIGNvbW1pdHRpbmcuIEhvd2V2ZXIsXG4gIC8vIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZXN0YXJ0IG9ubHkgd2hpbGUgaW4gdGhlIHBlcmlvZCB3ZSdyZSBzdXNwZW5kZWQuXG4gIC8vXG4gIC8vIFJlc3RhcnRpbmcgdG9vIGFnZ3Jlc3NpdmVseSBpcyBhbHNvIG5vdCBnb29kIGJlY2F1c2UgaXQgc3RhcnZlcyBvdXQgYW55XG4gIC8vIGludGVybWVkaWF0ZSBsb2FkaW5nIHN0YXRlLiBTbyB3ZSB1c2UgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hlbi5cbiAgLy8gU3VzcGVuc2UgSGV1cmlzdGljc1xuICAvL1xuICAvLyBJZiBub3RoaW5nIHRocmV3IGEgUHJvbWlzZSBvciBhbGwgdGhlIHNhbWUgZmFsbGJhY2tzIGFyZSBhbHJlYWR5IHNob3dpbmcsXG4gIC8vIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LlxuICAvL1xuICAvLyBJZiB0aGlzIGlzIGFuIGluaXRpYWwgcmVuZGVyIG9mIGEgbmV3IHRyZWUgb2YgU3VzcGVuc2UgYm91bmRhcmllcyBhbmRcbiAgLy8gdGhvc2UgdHJpZ2dlciBhIGZhbGxiYWNrLCB0aGVuIGRvbid0IHN1c3BlbmQvcmVzdGFydC4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBjYW4gc2hvdyB0aGUgaW5pdGlhbCBsb2FkaW5nIHN0YXRlIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuXG4gIC8vXG4gIC8vIElmIHdlIGhpdCBhIFwiRGVsYXllZFwiIGNhc2UsIHN1Y2ggYXMgd2hlbiB3ZSdkIHN3aXRjaCBmcm9tIGNvbnRlbnQgYmFjayBpbnRvXG4gIC8vIGEgZmFsbGJhY2ssIHRoZW4gd2Ugc2hvdWxkIGFsd2F5cyBzdXNwZW5kL3Jlc3RhcnQuIFRyYW5zaXRpb25zIGFwcGx5XG4gIC8vIHRvIHRoaXMgY2FzZS4gSWYgbm9uZSBpcyBkZWZpbmVkLCBKTkQgaXMgdXNlZCBpbnN0ZWFkLlxuICAvL1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBhbmQgaXQgZ2V0cyBcInJldHJpZWRcIiwgYWxsb3dpbmcgdXMgdG8gc2hvd1xuICAvLyBhbm90aGVyIGxldmVsLCBidXQgdGhlcmUncyBzdGlsbCBhbiBpbm5lciBib3VuZGFyeSB0aGF0IHdvdWxkIHNob3cgYSBmYWxsYmFjayxcbiAgLy8gdGhlbiB3ZSBzdXNwZW5kL3Jlc3RhcnQgZm9yIDUwMG1zIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2Ugc2hvd2VkIGEgZmFsbGJhY2tcbiAgLy8gYW55d2hlcmUgaW4gdGhlIHRyZWUuIFRoaXMgZWZmZWN0aXZlbHkgdGhyb3R0bGVzIHByb2dyZXNzaXZlIGxvYWRpbmcgaW50byBhXG4gIC8vIGNvbnNpc3RlbnQgdHJhaW4gb2YgY29tbWl0cy4gVGhpcyBhbHNvIGdpdmVzIHVzIGFuIG9wcG9ydHVuaXR5IHRvIHJlc3RhcnQgdG9cbiAgLy8gZ2V0IHRvIHRoZSBjb21wbGV0ZWQgc3RhdGUgc2xpZ2h0bHkgZWFybGllci5cbiAgLy9cbiAgLy8gSWYgdGhlcmUncyBhbWJpZ3VpdHkgZHVlIHRvIGJhdGNoaW5nIGl0J3MgcmVzb2x2ZWQgaW4gcHJlZmVyZW5jZSBvZjpcbiAgLy8gMSkgXCJkZWxheWVkXCIsIDIpIFwiaW5pdGlhbCByZW5kZXJcIiwgMykgXCJyZXRyeVwiLlxuICAvL1xuICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IGEgXCJidXN5XCIgc3RhdGUgZG9lc24ndCBnZXQgZm9yY2UgY29tbWl0dGVkLiBXZSB3YW50IHRvXG4gIC8vIGVuc3VyZSB0aGF0IG5ldyBpbml0aWFsIGxvYWRpbmcgc3RhdGVzIGNhbiBjb21taXQgYXMgc29vbiBhcyBwb3NzaWJsZS5cblxuXG4gIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTsgLy8gVE9ETzogSSB0aGluayB3ZSBjYW4gcmVtb3ZlIHRoaXMsIHNpbmNlIHdlIG5vdyB1c2UgYERpZENhcHR1cmVgIGluXG4gIC8vIHRoZSBiZWdpbiBwaGFzZSB0byBwcmV2ZW50IGFuIGVhcmx5IGJhaWxvdXQuXG5cbiAgc3VzcGVuc2VCb3VuZGFyeS5sYW5lcyA9IHJvb3RSZW5kZXJMYW5lcztcbiAgcmV0dXJuIHN1c3BlbnNlQm91bmRhcnk7XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKHJvb3QsIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuXG4gIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG5cbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzXG4gICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUaGlzIGlzIGEgd2FrZWFibGUuIFRoZSBjb21wb25lbnQgc3VzcGVuZGVkLlxuICAgIHZhciB3YWtlYWJsZSA9IHZhbHVlO1xuICAgIHJlc2V0U3VzcGVuZGVkQ29tcG9uZW50KHNvdXJjZUZpYmVyKTtcblxuICAgIHtcbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgdmFyIHN1c3BlbnNlQm91bmRhcnkgPSBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcik7XG5cbiAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeSAhPT0gbnVsbCkge1xuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG4gICAgICBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBXZSBvbmx5IGF0dGFjaCBwaW5nIGxpc3RlbmVycyBpbiBjb25jdXJyZW50IG1vZGUuIExlZ2FjeSBTdXNwZW5zZSBhbHdheXNcbiAgICAgIC8vIGNvbW1pdHMgZmFsbGJhY2tzIHN5bmNocm9ub3VzbHksIHNvIHRoZXJlIGFyZSBubyBwaW5ncy5cblxuICAgICAgaWYgKHN1c3BlbnNlQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgYXR0YWNoUmV0cnlMaXN0ZW5lcihzdXNwZW5zZUJvdW5kYXJ5LCByb290LCB3YWtlYWJsZSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGJvdW5kYXJ5IHdhcyBmb3VuZC4gVW5sZXNzIHRoaXMgaXMgYSBzeW5jIHVwZGF0ZSwgdGhpcyBpcyBPSy5cbiAgICAgIC8vIFdlIGNhbiBzdXNwZW5kIGFuZCB3YWl0IGZvciBtb3JlIGRhdGEgdG8gYXJyaXZlLlxuICAgICAgaWYgKCFpbmNsdWRlc1N5bmNMYW5lKHJvb3RSZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBzeW5jIHVwZGF0ZS4gU3VzcGVuZC4gU2luY2Ugd2UncmUgbm90IGFjdGl2YXRpbmcgYVxuICAgICAgICAvLyBTdXNwZW5zZSBib3VuZGFyeSwgdGhpcyB3aWxsIHVud2luZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCB3aXRob3V0XG4gICAgICAgIC8vIHBlcmZvcm1pbmcgYSBzZWNvbmQgcGFzcyB0byByZW5kZXIgYSBmYWxsYmFjay4gKFRoaXMgaXMgYXJndWFibHkgaG93XG4gICAgICAgIC8vIHJlZnJlc2ggdHJhbnNpdGlvbnMgc2hvdWxkIHdvcmssIHRvbywgc2luY2Ugd2UncmUgbm90IGdvaW5nIHRvIGNvbW1pdFxuICAgICAgICAvLyB0aGUgZmFsbGJhY2tzIGFueXdheS4pXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgY2FzZSBhbHNvIGFwcGxpZXMgdG8gaW5pdGlhbCBoeWRyYXRpb24uXG4gICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFRoaXMgaXMgYSBzeW5jL2Rpc2NyZXRlIHVwZGF0ZS4gV2UgdHJlYXQgdGhpcyBjYXNlIGxpa2UgYW4gZXJyb3JcbiAgICAgIC8vIGJlY2F1c2UgZGlzY3JldGUgcmVuZGVycyBhcmUgZXhwZWN0ZWQgdG8gcHJvZHVjZSBhIGNvbXBsZXRlIHRyZWVcbiAgICAgIC8vIHN5bmNocm9ub3VzbHkgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCBleHRlcm5hbCBzdGF0ZS5cblxuXG4gICAgICB2YXIgdW5jYXVnaHRTdXNwZW5zZUVycm9yID0gbmV3IEVycm9yKCdBIGNvbXBvbmVudCBzdXNwZW5kZWQgd2hpbGUgcmVzcG9uZGluZyB0byBzeW5jaHJvbm91cyBpbnB1dC4gVGhpcyAnICsgJ3dpbGwgY2F1c2UgdGhlIFVJIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBsb2FkaW5nIGluZGljYXRvci4gVG8gJyArICdmaXgsIHVwZGF0ZXMgdGhhdCBzdXNwZW5kIHNob3VsZCBiZSB3cmFwcGVkICcgKyAnd2l0aCBzdGFydFRyYW5zaXRpb24uJyk7IC8vIElmIHdlJ3JlIG91dHNpZGUgYSB0cmFuc2l0aW9uLCBmYWxsIHRocm91Z2ggdG8gdGhlIHJlZ3VsYXIgZXJyb3IgcGF0aC5cbiAgICAgIC8vIFRoZSBlcnJvciB3aWxsIGJlIGNhdWdodCBieSB0aGUgbmVhcmVzdCBzdXNwZW5zZSBib3VuZGFyeS5cblxuICAgICAgdmFsdWUgPSB1bmNhdWdodFN1c3BlbnNlRXJyb3I7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSByZWd1bGFyIGVycm9yLCBub3QgYSBTdXNwZW5zZSB3YWtlYWJsZS5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCk7XG5cbiAgICAgIHZhciBfc3VzcGVuc2VCb3VuZGFyeSA9IGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKTsgLy8gSWYgdGhlIGVycm9yIHdhcyB0aHJvd24gZHVyaW5nIGh5ZHJhdGlvbiwgd2UgbWF5IGJlIGFibGUgdG8gcmVjb3ZlciBieVxuICAgICAgLy8gZGlzY2FyZGluZyB0aGUgZGVoeWRyYXRlZCBjb250ZW50IGFuZCBzd2l0Y2hpbmcgdG8gYSBjbGllbnQgcmVuZGVyLlxuICAgICAgLy8gSW5zdGVhZCBvZiBzdXJmYWNpbmcgdGhlIGVycm9yLCBmaW5kIHRoZSBuZWFyZXN0IFN1c3BlbnNlIGJvdW5kYXJ5XG4gICAgICAvLyBhbmQgcmVuZGVyIGl0IGFnYWluIHdpdGhvdXQgaHlkcmF0aW9uLlxuXG5cbiAgICAgIGlmIChfc3VzcGVuc2VCb3VuZGFyeSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoKF9zdXNwZW5zZUJvdW5kYXJ5LmZsYWdzICYgU2hvdWxkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBTZXQgYSBmbGFnIHRvIGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIHRyeSByZW5kZXJpbmcgdGhlIG5vcm1hbFxuICAgICAgICAgIC8vIGNoaWxkcmVuIGFnYWluLCBub3QgdGhlIGZhbGxiYWNrLlxuICAgICAgICAgIF9zdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKF9zdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7IC8vIEV2ZW4gdGhvdWdoIHRoZSB1c2VyIG1heSBub3QgYmUgYWZmZWN0ZWQgYnkgdGhpcyBlcnJvciwgd2Ugc2hvdWxkXG4gICAgICAgIC8vIHN0aWxsIGxvZyBpdCBzbyBpdCBjYW4gYmUgZml4ZWQuXG5cbiAgICAgICAgcXVldWVIeWRyYXRpb25FcnJvcihjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlRmliZXIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKTtcbiAgcmVuZGVyRGlkRXJyb3IodmFsdWUpOyAvLyBXZSBkaWRuJ3QgZmluZCBhIGJvdW5kYXJ5IHRoYXQgY291bGQgaGFuZGxlIHRoaXMgdHlwZSBvZiBleGNlcHRpb24uIFN0YXJ0XG4gIC8vIG92ZXIgYW5kIHRyYXZlcnNlIHBhcmVudCBwYXRoIGFnYWluLCB0aGlzIHRpbWUgdHJlYXRpbmcgdGhlIGV4Y2VwdGlvblxuICAvLyBhcyBhbiBlcnJvci5cblxuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSByZXR1cm5GaWJlcjtcblxuICBkbyB7XG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2Vycm9ySW5mbyA9IHZhbHVlO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG4gICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgbGFuZSk7XG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVJvb3RFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX2Vycm9ySW5mbywgbGFuZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAvLyBDYXB0dXJlIGFuZCByZXRyeVxuICAgICAgICB2YXIgZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgIHZhciBjdG9yID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncyAmJiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkpKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcblxuICAgICAgICAgIHZhciBfbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIF9sYW5lKTsgLy8gU2NoZWR1bGUgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHJlLXJlbmRlciB1c2luZyB1cGRhdGVkIHN0YXRlXG5cbiAgICAgICAgICB2YXIgX3VwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGVycm9ySW5mbywgX2xhbmUpO1xuXG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgfSB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpO1xufVxuXG5mdW5jdGlvbiBnZXRTdXNwZW5kZWRDYWNoZSgpIHtcbiAge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBTdXNwZW5zZSBib3VuZGFyeSBzdXNwZW5kcy4gSXQgcmV0dXJucyB0aGVcbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0QmFkQ2xhc3M7XG52YXIgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnM7XG52YXIgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcztcbnZhciBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcjtcbnZhciBkaWRXYXJuQWJvdXRUYWlsT3B0aW9ucztcbnZhciBkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50O1xuXG57XG4gIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307XG4gIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzID0ge307XG4gIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXIgPSB7fTtcbiAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnMgPSB7fTtcbiAgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xufVxuXG5mdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIElmIHRoaXMgaXMgYSBmcmVzaCBuZXcgY29tcG9uZW50IHRoYXQgaGFzbid0IGJlZW4gcmVuZGVyZWQgeWV0LCB3ZVxuICAgIC8vIHdvbid0IHVwZGF0ZSBpdHMgY2hpbGQgc2V0IGJ5IGFwcGx5aW5nIG1pbmltYWwgc2lkZS1lZmZlY3RzLiBJbnN0ZWFkLFxuICAgIC8vIHdlIHdpbGwgYWRkIHRoZW0gYWxsIHRvIHRoZSBjaGlsZCBiZWZvcmUgaXQgZ2V0cyByZW5kZXJlZC4gVGhhdCBtZWFuc1xuICAgIC8vIHdlIGNhbiBvcHRpbWl6ZSB0aGlzIHJlY29uY2lsaWF0aW9uIHBhc3MgYnkgbm90IHRyYWNraW5nIHNpZGUtZWZmZWN0cy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHRoZSBjdXJyZW50IGNoaWxkIGlzIHRoZSBzYW1lIGFzIHRoZSB3b3JrIGluIHByb2dyZXNzLCBpdCBtZWFucyB0aGF0XG4gICAgLy8gd2UgaGF2ZW4ndCB5ZXQgc3RhcnRlZCBhbnkgd29yayBvbiB0aGVzZSBjaGlsZHJlbi4gVGhlcmVmb3JlLCB3ZSB1c2VcbiAgICAvLyB0aGUgY2xvbmUgYWxnb3JpdGhtIHRvIGNyZWF0ZSBhIGNvcHkgb2YgYWxsIHRoZSBjdXJyZW50IGNoaWxkcmVuLlxuICAgIC8vIElmIHdlIGhhZCBhbnkgcHJvZ3Jlc3NlZCB3b3JrIGFscmVhZHksIHRoYXQgaXMgaW52YWxpZCBhdCB0aGlzIHBvaW50IHNvXG4gICAgLy8gbGV0J3MgdGhyb3cgaXQgb3V0LlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyBmb3JrIG9mIHJlY29uY2lsZUNoaWxkcmVuLiBJdCdzIHVzZWQgaW4gY2FzZXMgd2hlcmUgd2VcbiAgLy8gd2FudCB0byByZWNvbmNpbGUgd2l0aG91dCBtYXRjaGluZyBhZ2FpbnN0IHRoZSBleGlzdGluZyBzZXQuIFRoaXMgaGFzIHRoZVxuICAvLyBlZmZlY3Qgb2YgYWxsIGN1cnJlbnQgY2hpbGRyZW4gYmVpbmcgdW5tb3VudGVkOyBldmVuIGlmIHRoZSB0eXBlIGFuZCBrZXlcbiAgLy8gYXJlIHRoZSBzYW1lLCB0aGUgb2xkIGNoaWxkIGlzIHVubW91bnRlZCBhbmQgYSBuZXcgY2hpbGQgaXMgY3JlYXRlZC5cbiAgLy9cbiAgLy8gVG8gZG8gdGhpcywgd2UncmUgZ29pbmcgdG8gZ28gdGhyb3VnaCB0aGUgcmVjb25jaWxlIGFsZ29yaXRobSB0d2ljZS4gSW5cbiAgLy8gdGhlIGZpcnN0IHBhc3MsIHdlIHNjaGVkdWxlIGEgZGVsZXRpb24gZm9yIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbiBieVxuICAvLyBwYXNzaW5nIG51bGwuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTsgLy8gSW4gdGhlIHNlY29uZCBwYXNzLCB3ZSBtb3VudCB0aGUgbmV3IGNoaWxkcmVuLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0IHdlXG4gIC8vIHBhc3MgbnVsbCBpbiBwbGFjZSBvZiB3aGVyZSB3ZSB1c3VhbGx5IHBhc3MgdGhlIGN1cnJlbnQgY2hpbGQgc2V0LiBUaGlzIGhhc1xuICAvLyB0aGUgZWZmZWN0IG9mIHJlbW91bnRpbmcgYWxsIGNoaWxkcmVuIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVpclxuICAvLyBpZGVudGl0aWVzIG1hdGNoLlxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVGb3J3YXJkUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgYWZ0ZXIgdGhlIGZpcnN0IHJlbmRlciBzdXNwZW5kcy5cbiAgLy8gV2UnbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgZmluZSBvciBjYW4gY2F1c2UgaXNzdWVzLlxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciByZW5kZXIgPSBDb21wb25lbnQucmVuZGVyO1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmOyAvLyBUaGUgcmVzdCBpcyBhIGZvcmsgb2YgdXBkYXRlRnVuY3Rpb25Db21wb25lbnRcblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICB2YXIgaGFzSWQ7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlciwgbmV4dFByb3BzLCByZWYsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmICFkaWRSZWNlaXZlVXBkYXRlKSB7XG4gICAgYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7XG4gICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHZhciB0eXBlID0gQ29tcG9uZW50LnR5cGU7XG5cbiAgICBpZiAoaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSAmJiBDb21wb25lbnQuY29tcGFyZSA9PT0gbnVsbCAmJiAvLyBTaW1wbGVNZW1vQ29tcG9uZW50IGNvZGVwYXRoIGRvZXNuJ3QgcmVzb2x2ZSBvdXRlciBwcm9wcyBlaXRoZXIuXG4gICAgQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICAgICAge1xuICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG4gICAgICB9IC8vIElmIHRoaXMgaXMgYSBwbGFpbiBmdW5jdGlvbiBjb21wb25lbnQgd2l0aG91dCBkZWZhdWx0IHByb3BzLFxuICAgICAgLy8gYW5kIHdpdGggb25seSB0aGUgZGVmYXVsdCBzaGFsbG93IGNvbXBhcmlzb24sIHdlIHVwZ3JhZGUgaXRcbiAgICAgIC8vIHRvIGEgU2ltcGxlTWVtb0NvbXBvbmVudCB0byBhbGxvdyBmYXN0IHBhdGggdXBkYXRlcy5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBTaW1wbGVNZW1vQ29tcG9uZW50O1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVkVHlwZTtcblxuICAgICAge1xuICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIHR5cGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVzb2x2ZWRUeXBlLCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAgIC8vIFdlIGNvdWxkIG1vdmUgaXQgdGhlcmUsIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdGhpcyBmb3IgbGF6eSBjb2RlIHBhdGguXG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCBDb21wb25lbnQuZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkgfHwgJ1Vua25vd24nO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIGVycm9yKCclczogU3VwcG9ydCBmb3IgZGVmYXVsdFByb3BzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIG1lbW8gY29tcG9uZW50cyAnICsgJ2luIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIFVzZSBKYXZhU2NyaXB0IGRlZmF1bHQgcGFyYW1ldGVycyBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoQ29tcG9uZW50LnR5cGUsIG51bGwsIG5leHRQcm9wcywgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLm1vZGUsIHJlbmRlckxhbmVzKTtcbiAgICBjaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgY2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICB7XG4gICAgdmFyIF90eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgdmFyIF9pbm5lclByb3BUeXBlcyA9IF90eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChfaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgY2hlY2tQcm9wVHlwZXMoX2lubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShfdHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Q2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBUaGlzIGlzIGFsd2F5cyBleGFjdGx5IG9uZSBjaGlsZFxuXG4gIHZhciBoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgPSBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcyk7XG5cbiAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQpIHtcbiAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIHByb3BzIHdpdGggcmVzb2x2ZWQgZGVmYXVsdFByb3BzLFxuICAgIC8vIHVubGlrZSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgd2hpY2ggd2lsbCBiZSB0aGUgdW5yZXNvbHZlZCBvbmVzLlxuICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Q2hpbGQubWVtb2l6ZWRQcm9wczsgLy8gRGVmYXVsdCB0byBzaGFsbG93IGNvbXBhcmlzb25cblxuICAgIHZhciBjb21wYXJlID0gQ29tcG9uZW50LmNvbXBhcmU7XG4gICAgY29tcGFyZSA9IGNvbXBhcmUgIT09IG51bGwgPyBjb21wYXJlIDogc2hhbGxvd0VxdWFsO1xuXG4gICAgaWYgKGNvbXBhcmUocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgbmV4dFByb3BzKTtcbiAgbmV3Q2hpbGQucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXdDaGlsZDtcbiAgcmV0dXJuIG5ld0NoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgaW5uZXIgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgb3V0ZXJNZW1vVHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuXG4gICAgICBpZiAob3V0ZXJNZW1vVHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgIC8vIFdlIHdhcm4gd2hlbiB5b3UgZGVmaW5lIHByb3BUeXBlcyBvbiBsYXp5KClcbiAgICAgICAgLy8gc28gbGV0J3MganVzdCBza2lwIG92ZXIgaXQgdG8gZmluZCBtZW1vKCkgb3V0ZXIgd3JhcHBlci5cbiAgICAgICAgLy8gSW5uZXIgcHJvcHMgZm9yIG1lbW8gYXJlIHZhbGlkYXRlZCBsYXRlci5cbiAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSBvdXRlck1lbW9UeXBlO1xuICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBpbml0KHBheWxvYWQpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IG51bGw7XG4gICAgICAgIH0gLy8gSW5uZXIgcHJvcFR5cGVzIHdpbGwgYmUgdmFsaWRhdGVkIGluIHRoZSBmdW5jdGlvbiBjb21wb25lbnQgcGF0aC5cblxuXG4gICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IG91dGVyTWVtb1R5cGUgJiYgb3V0ZXJNZW1vVHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgKFNpbXBsZU1lbW9Db21wb25lbnQgaGFzIG5vIGRlZmF1bHRQcm9wcylcbiAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShvdXRlck1lbW9UeXBlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG5cbiAgICBpZiAoc2hhbGxvd0VxdWFsKHByZXZQcm9wcywgbmV4dFByb3BzKSAmJiBjdXJyZW50LnJlZiA9PT0gd29ya0luUHJvZ3Jlc3MucmVmICYmICggLy8gUHJldmVudCBiYWlsb3V0IGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VkIGR1ZSB0byBob3QgcmVsb2FkLlxuICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSBjdXJyZW50LnR5cGUgKSkge1xuICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlOyAvLyBUaGUgcHJvcHMgYXJlIHNoYWxsb3dseSBlcXVhbC4gUmV1c2UgdGhlIHByZXZpb3VzIHByb3BzIG9iamVjdCwgbGlrZSB3ZVxuICAgICAgLy8gd291bGQgZHVyaW5nIGEgbm9ybWFsIGZpYmVyIGJhaWxvdXQuXG4gICAgICAvL1xuICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBzdHJvbmcgZ3VhcmFudGVlcyB0aGF0IHRoZSBwcm9wcyBvYmplY3QgaXMgcmVmZXJlbnRpYWxseVxuICAgICAgLy8gZXF1YWwgZHVyaW5nIHVwZGF0ZXMgd2hlcmUgd2UgY2FuJ3QgYmFpbCBvdXQgYW55d2F5IOKAlCBsaWtlIGlmIHRoZSBwcm9wc1xuICAgICAgLy8gYXJlIHNoYWxsb3dseSBlcXVhbCwgYnV0IHRoZXJlJ3MgYSBsb2NhbCBzdGF0ZSBvciBjb250ZXh0IHVwZGF0ZSBpbiB0aGVcbiAgICAgIC8vIHNhbWUgYmF0Y2guXG4gICAgICAvL1xuICAgICAgLy8gSG93ZXZlciwgYXMgYSBwcmluY2lwbGUsIHdlIHNob3VsZCBhaW0gdG8gbWFrZSB0aGUgYmVoYXZpb3IgY29uc2lzdGVudFxuICAgICAgLy8gYWNyb3NzIGRpZmZlcmVudCB3YXlzIG9mIG1lbW9pemluZyBhIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIFJlYWN0Lm1lbW9cbiAgICAgIC8vIGhhcyBhIGRpZmZlcmVudCBpbnRlcm5hbCBGaWJlciBsYXlvdXQgaWYgeW91IHBhc3MgYSBub3JtYWwgZnVuY3Rpb25cbiAgICAgIC8vIGNvbXBvbmVudCAoU2ltcGxlTWVtb0NvbXBvbmVudCkgdmVyc3VzIGlmIHlvdSBwYXNzIGEgZGlmZmVyZW50IHR5cGVcbiAgICAgIC8vIGxpa2UgZm9yd2FyZFJlZiAoTWVtb0NvbXBvbmVudCkuIEJ1dCB0aGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC5cbiAgICAgIC8vIFdyYXBwaW5nIGEgY29tcG9uZW50IGluIGZvcndhcmRSZWYgKG9yIFJlYWN0LmxhenksIGV0Yykgc2hvdWxkbid0XG4gICAgICAvLyBhZmZlY3Qgd2hldGhlciB0aGUgcHJvcHMgb2JqZWN0IGlzIHJldXNlZCBkdXJpbmcgYSBiYWlsb3V0LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBuZXh0UHJvcHMgPSBwcmV2UHJvcHM7XG5cbiAgICAgIGlmICghY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICAgIC8vIFRoZSBwZW5kaW5nIGxhbmVzIHdlcmUgY2xlYXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGJlZ2luV29yay4gV2UncmVcbiAgICAgICAgLy8gYWJvdXQgdG8gYmFpbCBvdXQsIGJ1dCB0aGVyZSBtaWdodCBiZSBvdGhlciBsYW5lcyB0aGF0IHdlcmVuJ3RcbiAgICAgICAgLy8gaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgcmVuZGVyLiBVc3VhbGx5LCB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhlXG4gICAgICAgIC8vIHJlbWFpbmluZyB1cGRhdGVzIGlzIGFjY3VtdWxhdGVkIGR1cmluZyB0aGUgZXZhbHVhdGlvbiBvZiB0aGVcbiAgICAgICAgLy8gY29tcG9uZW50IChpLmUuIHdoZW4gcHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlKS4gQnV0IHNpbmNlIHNpbmNlXG4gICAgICAgIC8vIHdlJ3JlIGJhaWxpbmcgb3V0IGVhcmx5ICp3aXRob3V0KiBldmFsdWF0aW5nIHRoZSBjb21wb25lbnQsIHdlIG5lZWRcbiAgICAgICAgLy8gdG8gYWNjb3VudCBmb3IgaXQgaGVyZSwgdG9vLiBSZXNldCB0byB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgZmliZXIuXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgb25seSBhcHBsaWVzIHRvIFNpbXBsZU1lbW9Db21wb25lbnQsIG5vdCBNZW1vQ29tcG9uZW50LFxuICAgICAgICAvLyBiZWNhdXNlIGEgTWVtb0NvbXBvbmVudCBmaWJlciBkb2VzIG5vdCBoYXZlIGhvb2tzIG9yIGFuIHVwZGF0ZSBxdWV1ZTtcbiAgICAgICAgLy8gcmF0aGVyLCBpdCB3cmFwcyBhcm91bmQgYW4gaW5uZXIgY29tcG9uZW50LCB3aGljaCBtYXkgb3IgbWF5IG5vdFxuICAgICAgICAvLyBjb250YWlucyBob29rcy5cbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGUgcmVzZXQgYXQgaW4gYmVnaW5Xb3JrIG91dCBvZiB0aGUgY29tbW9uIHBhdGggc28gdGhhdFxuICAgICAgICAvLyB0aGlzIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgcHJldlN0YXRlID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSA6IG51bGw7XG5cbiAgaWYgKG5leHRQcm9wcy5tb2RlID09PSAnaGlkZGVuJyB8fCBlbmFibGVMZWdhY3lIaWRkZW4gKSB7XG4gICAgLy8gUmVuZGVyaW5nIGEgaGlkZGVuIHRyZWUuXG4gICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIGxlZ2FjeSBzeW5jIG1vZGUsIGRvbid0IGRlZmVyIHRoZSBzdWJ0cmVlLiBSZW5kZXIgaXQgbm93LlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgaG93IE9mZnNjcmVlbiBzaG91bGQgd29yayB3aXRoIHRyYW5zaXRpb25zIGluIHRoZSBmdXR1cmVcbiAgICAgIHZhciBuZXh0U3RhdGUgPSB7XG4gICAgICAgIGJhc2VMYW5lczogTm9MYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXh0U3RhdGU7XG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIE9mZnNjcmVlbkxhbmUpKSB7XG4gICAgICB2YXIgc3Bhd25lZENhY2hlUG9vbCA9IG51bGw7IC8vIFdlJ3JlIGhpZGRlbiwgYW5kIHdlJ3JlIG5vdCByZW5kZXJpbmcgYXQgT2Zmc2NyZWVuLiBXZSB3aWxsIGJhaWwgb3V0XG4gICAgICAvLyBhbmQgcmVzdW1lIHRoaXMgdHJlZSBsYXRlci5cblxuICAgICAgdmFyIG5leHRCYXNlTGFuZXM7XG5cbiAgICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZCYXNlTGFuZXMgPSBwcmV2U3RhdGUuYmFzZUxhbmVzO1xuICAgICAgICBuZXh0QmFzZUxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2QmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0QmFzZUxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgICB9IC8vIFNjaGVkdWxlIHRoaXMgZmliZXIgdG8gcmUtcmVuZGVyIGF0IG9mZnNjcmVlbiBwcmlvcml0eS4gVGhlbiBiYWlsb3V0LlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGxhbmVUb0xhbmVzKE9mZnNjcmVlbkxhbmUpO1xuICAgICAgdmFyIF9uZXh0U3RhdGUgPSB7XG4gICAgICAgIGJhc2VMYW5lczogbmV4dEJhc2VMYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBzcGF3bmVkQ2FjaGVQb29sLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBfbmV4dFN0YXRlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgLy8gdG8gYXZvaWQgYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG5cblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBuZXh0QmFzZUxhbmVzKTtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIHNlY29uZCByZW5kZXIuIFRoZSBzdXJyb3VuZGluZyB2aXNpYmxlIGNvbnRlbnQgaGFzIGFscmVhZHlcbiAgICAgIC8vIGNvbW1pdHRlZC4gTm93IHdlIHJlc3VtZSByZW5kZXJpbmcgdGhlIGhpZGRlbiB0cmVlLlxuICAgICAgLy8gUmVuZGVyaW5nIGF0IG9mZnNjcmVlbiwgc28gd2UgY2FuIGNsZWFyIHRoZSBiYXNlIGxhbmVzLlxuICAgICAgdmFyIF9uZXh0U3RhdGUyID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTI7IC8vIFB1c2ggdGhlIGxhbmVzIHRoYXQgd2VyZSBza2lwcGVkIHdoZW4gd2UgYmFpbGVkIG91dC5cblxuICAgICAgdmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHByZXZTdGF0ZSAhPT0gbnVsbCA/IHByZXZTdGF0ZS5iYXNlTGFuZXMgOiByZW5kZXJMYW5lcztcblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZW5kZXJpbmcgYSB2aXNpYmxlIHRyZWUuXG4gICAgdmFyIF9zdWJ0cmVlUmVuZGVyTGFuZXM7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBnb2luZyBmcm9tIGhpZGRlbiAtPiB2aXNpYmxlLlxuICAgICAgX3N1YnRyZWVSZW5kZXJMYW5lcyA9IG1lcmdlTGFuZXMocHJldlN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugd2VyZW4ndCBwcmV2aW91c2x5IGhpZGRlbiwgYW5kIHdlIHN0aWxsIGFyZW4ndCwgc28gdGhlcmUncyBub3RoaW5nXG4gICAgICAvLyBzcGVjaWFsIHRvIGRvLiBOZWVkIHRvIHB1c2ggdG8gdGhlIHN0YWNrIHJlZ2FyZGxlc3MsIHRob3VnaCwgdG8gYXZvaWRcbiAgICAgIC8vIGEgcHVzaC9wb3AgbWlzYWxpZ25tZW50LlxuICAgICAgX3N1YnRyZWVSZW5kZXJMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgIH1cblxuICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgX3N1YnRyZWVSZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn0gLy8gTm90ZTogVGhlc2UgaGFwcGVuIHRvIGhhdmUgaWRlbnRpY2FsIGJlZ2luIHBoYXNlcywgZm9yIG5vdy4gV2Ugc2hvdWxkbid0IGhvbGRcblxuZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG5cbiAgICB7XG4gICAgICAvLyBSZXNldCBlZmZlY3QgZHVyYXRpb25zIGZvciB0aGUgbmV4dCBldmVudHVhbCBlZmZlY3QgcGhhc2UuXG4gICAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsICYmIHJlZiAhPT0gbnVsbCB8fCBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSByZWYpIHtcbiAgICAvLyBTY2hlZHVsZSBhIFJlZiBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWY7XG5cbiAgICB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgY29udGV4dDtcblxuICB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgICBjb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHZhciBoYXNJZDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBlcnJvci5cbiAgICBzd2l0Y2ggKHNob3VsZEVycm9yKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUT0RPIFRoaXMgd2F5IG9mIHJlc2V0dGluZyB0aGUgZXJyb3IgYm91bmRhcnkgc3RhdGUgaXMgYSBoYWNrLlxuICAgICAgICAgIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzP1xuXG4gICAgICAgICAgdmFyIHRlbXBJbnN0YW5jZSA9IG5ldyBjdG9yKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMsIF9pbnN0YW5jZS5jb250ZXh0KTtcbiAgICAgICAgICB2YXIgc3RhdGUgPSB0ZW1wSW5zdGFuY2Uuc3RhdGU7XG5cbiAgICAgICAgICBfaW5zdGFuY2UudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUoX2luc3RhbmNlLCBzdGF0ZSwgbnVsbCk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIHRydWU6XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG5cbiAgICAgICAgICB2YXIgZXJyb3IkMSA9IG5ldyBFcnJvcignU2ltdWxhdGVkIGVycm9yIGNvbWluZyBmcm9tIERldlRvb2xzJyk7XG4gICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTsgLy8gU2NoZWR1bGUgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHJlLXJlbmRlciB1c2luZyB1cGRhdGVkIHN0YXRlXG5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IkMSwgd29ya0luUHJvZ3Jlc3MpLCBsYW5lKTtcbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIHVwZGF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRVcGRhdGU7XG5cbiAgaWYgKGluc3RhbmNlID09PSBudWxsKSB7XG4gICAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIEluIHRoZSBpbml0aWFsIHBhc3Mgd2UgbWlnaHQgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlLlxuXG4gICAgY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMpO1xuICAgIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICBzaG91bGRVcGRhdGUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbiBhIHJlc3VtZSwgd2UnbGwgYWxyZWFkeSBoYXZlIGFuIGluc3RhbmNlIHdlIGNhbiByZXVzZS5cbiAgICBzaG91bGRVcGRhdGUgPSByZXN1bWVNb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgc2hvdWxkVXBkYXRlID0gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBuZXh0VW5pdE9mV29yayA9IGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICB2YXIgaW5zdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmIChzaG91bGRVcGRhdGUgJiYgaW5zdC5wcm9wcyAhPT0gbmV4dFByb3BzKSB7XG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgZXJyb3IoJ0l0IGxvb2tzIGxpa2UgJXMgaXMgcmVhc3NpZ25pbmcgaXRzIG93biBgdGhpcy5wcm9wc2Agd2hpbGUgcmVuZGVyaW5nLiAnICsgJ1RoaXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgY2FuIGxlYWQgdG8gY29uZnVzaW5nIGJ1Z3MuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ2EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0VW5pdE9mV29yaztcbn1cblxuZnVuY3Rpb24gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcykge1xuICAvLyBSZWZzIHNob3VsZCB1cGRhdGUgZXZlbiBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJucyBmYWxzZVxuICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIGRpZENhcHR1cmVFcnJvciA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmICghc2hvdWxkVXBkYXRlICYmICFkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBDb250ZXh0IHByb3ZpZGVycyBzaG91bGQgZGVmZXIgdG8gc0NVIGZvciByZW5kZXJpbmdcbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gUmVyZW5kZXJcblxuICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIG5leHRDaGlsZHJlbjtcblxuICBpZiAoZGlkQ2FwdHVyZUVycm9yICYmIHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYgd2UgY2FwdHVyZWQgYW4gZXJyb3IsIGJ1dCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXMgbm90IGRlZmluZWQsXG4gICAgLy8gdW5tb3VudCBhbGwgdGhlIGNoaWxkcmVuLiBjb21wb25lbnREaWRDYXRjaCB3aWxsIHNjaGVkdWxlIGFuIHVwZGF0ZSB0b1xuICAgIC8vIHJlLXJlbmRlciBhIGZhbGxiYWNrLiBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB3ZSBtaWdyYXRlIGV2ZXJ5b25lIHRvXG4gICAgLy8gdGhlIG5ldyBBUEkuXG4gICAgLy8gVE9ETzogV2FybiBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgIG5leHRDaGlsZHJlbiA9IG51bGw7XG5cbiAgICB7XG4gICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGluc3RhbmNlLnJlbmRlcigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBJZiB3ZSdyZSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlY29uY2lsZSB3aXRob3V0IHJldXNpbmcgYW55IG9mXG4gICAgLy8gdGhlIGV4aXN0aW5nIGNoaWxkcmVuLiBDb25jZXB0dWFsbHksIHRoZSBub3JtYWwgY2hpbGRyZW4gYW5kIHRoZSBjaGlsZHJlblxuICAgIC8vIHRoYXQgYXJlIHNob3duIG9uIGVycm9yIGFyZSB0d28gZGlmZmVyZW50IHNldHMsIHNvIHdlIHNob3VsZG4ndCByZXVzZVxuICAgIC8vIG5vcm1hbCBjaGlsZHJlbiBldmVuIGlmIHRoZWlyIGlkZW50aXRpZXMgbWF0Y2guXG4gICAgZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IC8vIE1lbW9pemUgc3RhdGUgdXNpbmcgdGhlIHZhbHVlcyB3ZSBqdXN0IHVzZWQgdG8gcmVuZGVyLlxuICAvLyBUT0RPOiBSZXN0cnVjdHVyZSBzbyB3ZSBuZXZlciByZWFkIHZhbHVlcyBmcm9tIHRoZSBpbnN0YW5jZS5cblxuXG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTsgLy8gVGhlIGNvbnRleHQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNvIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgaXQuXG5cbiAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKSB7XG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmIChyb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5wZW5kaW5nQ29udGV4dCwgcm9vdC5wZW5kaW5nQ29udGV4dCAhPT0gcm9vdC5jb250ZXh0KTtcbiAgfSBlbHNlIGlmIChyb290LmNvbnRleHQpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGJlIHNldFxuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGV4dCwgZmFsc2UpO1xuICB9XG5cbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGFpbmVySW5mbyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RSb290KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBjdXJyZW50IGZpYmVyLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwcmV2Q2hpbGRyZW4gPSBwcmV2U3RhdGUuZWxlbWVudDtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG5cbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRTdGF0ZS5lbGVtZW50O1xuXG4gIGlmICggcHJldlN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgIC8vIFRoaXMgaXMgYSBoeWRyYXRpb24gcm9vdCB3aG9zZSBzaGVsbCBoYXMgbm90IHlldCBoeWRyYXRlZC4gV2Ugc2hvdWxkXG4gICAgLy8gYXR0ZW1wdCB0byBoeWRyYXRlLlxuICAgIC8vIEZsaXAgaXNEZWh5ZHJhdGVkIHRvIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgd2hlbiB0aGlzIHJlbmRlclxuICAgIC8vIGZpbmlzaGVzLCB0aGUgcm9vdCB3aWxsIG5vIGxvbmdlciBiZSBkZWh5ZHJhdGVkLlxuICAgIHZhciBvdmVycmlkZVN0YXRlID0ge1xuICAgICAgZWxlbWVudDogbmV4dENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBmYWxzZSxcbiAgICAgIGNhY2hlOiBuZXh0U3RhdGUuY2FjaGUsXG4gICAgICBwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOiBuZXh0U3RhdGUucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyxcbiAgICAgIHRyYW5zaXRpb25zOiBuZXh0U3RhdGUudHJhbnNpdGlvbnNcbiAgICB9O1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBgYmFzZVN0YXRlYCBjYW4gYWx3YXlzIGJlIHRoZSBsYXN0IHN0YXRlIGJlY2F1c2UgdGhlIHJvb3QgZG9lc24ndFxuICAgIC8vIGhhdmUgcmVkdWNlciBmdW5jdGlvbnMgc28gaXQgZG9lc24ndCBuZWVkIHJlYmFzaW5nLlxuXG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgYSBwcmV2aW91cyBhdHRlbXB0IHRvIGh5ZHJhdGUgdGhlIHNoZWxsLCBzbyB3ZVxuICAgICAgLy8gZm9yY2VkIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIobmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nLiBCZWNhdXNlIHRoZSBlcnJvciBoYXBwZW5lZCBvdXRzaWRlICcgKyAnb2YgYSBTdXNwZW5zZSBib3VuZGFyeSwgdGhlIGVudGlyZSByb290IHdpbGwgc3dpdGNoIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKTtcbiAgICB9IGVsc2UgaWYgKG5leHRDaGlsZHJlbiAhPT0gcHJldkNoaWxkcmVuKSB7XG4gICAgICB2YXIgX3JlY292ZXJhYmxlRXJyb3IgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihuZXcgRXJyb3IoJ1RoaXMgcm9vdCByZWNlaXZlZCBhbiBlYXJseSB1cGRhdGUsIGJlZm9yZSBhbnl0aGluZyB3YXMgYWJsZSAnICsgJ2h5ZHJhdGUuIFN3aXRjaGVkIHRoZSBlbnRpcmUgcm9vdCB0byBjbGllbnQgcmVuZGVyaW5nLicpLCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgX3JlY292ZXJhYmxlRXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgb3V0ZXJtb3N0IHNoZWxsIGhhcyBub3QgaHlkcmF0ZWQgeWV0LiBTdGFydCBoeWRyYXRpbmcuXG4gICAgICBlbnRlckh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgdmFyIGNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICAgICAgdmFyIG5vZGUgPSBjaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgLy8gTWFyayBlYWNoIGNoaWxkIGFzIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGZhc3QgcGF0aCB0byBrbm93IHdoZXRoZXIgdGhpc1xuICAgICAgICAvLyB0cmVlIGlzIHBhcnQgb2YgYSBoeWRyYXRpbmcgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkXG4gICAgICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgICAgICAvLyBDb25jZXB0dWFsbHkgdGhpcyBpcyBzaW1pbGFyIHRvIFBsYWNlbWVudCBpbiB0aGF0IGEgbmV3IHN1YnRyZWUgaXNcbiAgICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0aGUgUmVhY3QgdHJlZSBoZXJlLiBJdCBqdXN0IGhhcHBlbnMgdG8gbm90IG5lZWQgRE9NXG4gICAgICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgICAgICBub2RlLmZsYWdzID0gbm9kZS5mbGFncyAmIH5QbGFjZW1lbnQgfCBIeWRyYXRpbmc7XG4gICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJvb3QgaXMgbm90IGRlaHlkcmF0ZWQuIEVpdGhlciB0aGlzIGlzIGEgY2xpZW50LW9ubHkgcm9vdCwgb3IgaXRcbiAgICAvLyBhbHJlYWR5IGh5ZHJhdGVkLlxuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcblxuICAgIGlmIChuZXh0Q2hpbGRyZW4gPT09IHByZXZDaGlsZHJlbikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKSB7XG4gIC8vIFJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLlxuICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gIHF1ZXVlSHlkcmF0aW9uRXJyb3IocmVjb3ZlcmFibGVFcnJvcik7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBudWxsO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgaXNEaXJlY3RUZXh0Q2hpbGQgPSBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBuZXh0UHJvcHMpO1xuXG4gIGlmIChpc0RpcmVjdFRleHRDaGlsZCkge1xuICAgIC8vIFdlIHNwZWNpYWwgY2FzZSBhIGRpcmVjdCB0ZXh0IGNoaWxkIG9mIGEgaG9zdCBub2RlLiBUaGlzIGlzIGEgY29tbW9uXG4gICAgLy8gY2FzZS4gV2Ugd29uJ3QgaGFuZGxlIGl0IGFzIGEgcmVpZmllZCBjaGlsZC4gV2Ugd2lsbCBpbnN0ZWFkIGhhbmRsZVxuICAgIC8vIHRoaXMgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQgdGhhdCBhbHNvIGhhcyBhY2Nlc3MgdG8gdGhpcyBwcm9wLiBUaGF0XG4gICAgLy8gYXZvaWRzIGFsbG9jYXRpbmcgYW5vdGhlciBIb3N0VGV4dCBmaWJlciBhbmQgdHJhdmVyc2luZyBpdC5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXZQcm9wcyAhPT0gbnVsbCAmJiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcmV2UHJvcHMpKSB7XG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gYSBkaXJlY3QgdGV4dCBjaGlsZCB0byBhIG5vcm1hbCBjaGlsZCwgb3IgdG9cbiAgICAvLyBlbXB0eSwgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgdGV4dCBjb250ZW50IHRvIGJlIHJlc2V0LlxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENvbnRlbnRSZXNldDtcbiAgfVxuXG4gIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gTm90aGluZyB0byBkbyBoZXJlLiBUaGlzIGlzIHRlcm1pbmFsLiBXZSdsbCBkbyB0aGUgY29tcGxldGlvbiBzdGVwXG4gIC8vIGltbWVkaWF0ZWx5IGFmdGVyLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1vdW50TGF6eUNvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGxhenlDb21wb25lbnQgPSBlbGVtZW50VHlwZTtcbiAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG4gIHZhciBDb21wb25lbnQgPSBpbml0KHBheWxvYWQpOyAvLyBTdG9yZSB0aGUgdW53cmFwcGVkIGNvbXBvbmVudCBpbiB0aGUgdHlwZS5cblxuICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50O1xuICB2YXIgcmVzb2x2ZWRUYWcgPSB3b3JrSW5Qcm9ncmVzcy50YWcgPSByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpO1xuICB2YXIgcmVzb2x2ZWRQcm9wcyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCBwcm9wcyk7XG4gIHZhciBjaGlsZDtcblxuICBzd2l0Y2ggKHJlc29sdmVkVGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlRm9yd2FyZFJlZihudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCByZXNvbHZlZFByb3BzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZU1lbW9Db21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQudHlwZSwgcmVzb2x2ZWRQcm9wcyksIC8vIFRoZSBpbm5lciB0eXBlIGNhbiBoYXZlIGRlZmF1bHRzIHRvb1xuICAgICAgICByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgfVxuXG4gIHZhciBoaW50ID0gJyc7XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIENvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgIGhpbnQgPSAnIERpZCB5b3Ugd3JhcCBhIGNvbXBvbmVudCBpbiBSZWFjdC5sYXp5KCkgbW9yZSB0aGFuIG9uY2U/JztcbiAgICB9XG4gIH0gLy8gVGhpcyBtZXNzYWdlIGludGVudGlvbmFsbHkgZG9lc24ndCBtZW50aW9uIEZvcndhcmRSZWYgb3IgTWVtb0NvbXBvbmVudFxuICAvLyBiZWNhdXNlIHRoZSBmYWN0IHRoYXQgaXQncyBhIHNlcGFyYXRlIHR5cGUgb2Ygd29yayBpcyBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG5cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IHR5cGUgaXMgaW52YWxpZC4gUmVjZWl2ZWQgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG86IFwiICsgQ29tcG9uZW50ICsgXCIuIFwiICsgKFwiTGF6eSBlbGVtZW50IHR5cGUgbXVzdCByZXNvbHZlIHRvIGEgY2xhc3Mgb3IgZnVuY3Rpb24uXCIgKyBoaW50KSk7XG59XG5cbmZ1bmN0aW9uIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsgLy8gUHJvbW90ZSB0aGUgZmliZXIgdG8gYSBjbGFzcyBhbmQgdHJ5IHJlbmRlcmluZyBhZ2Fpbi5cblxuICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuICAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSB7XG4gIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgY29udGV4dDtcblxuICB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgdmFsdWU7XG4gIHZhciBoYXNJZDtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQucHJvdG90eXBlICYmIHR5cGVvZiBDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0QmFkQ2xhc3NbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoXCJUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGhhdmUgYSByZW5kZXIgbWV0aG9kLCBidXQgZG9lc24ndCBleHRlbmQgUmVhY3QuQ29tcG9uZW50LiBcIiArICdUaGlzIGlzIGxpa2VseSB0byBjYXVzZSBlcnJvcnMuIENoYW5nZSAlcyB0byBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuJywgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0QmFkQ2xhc3NbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIG51bGwpO1xuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG5cbiAge1xuICAgIC8vIFN1cHBvcnQgZm9yIG1vZHVsZSBjb21wb25lbnRzIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHJlbW92ZWQgYmVoaW5kIGEgZmxhZy5cbiAgICAvLyBXaGV0aGVyIG9yIG5vdCBpdCB3b3VsZCBjcmFzaCBsYXRlciwgd2Ugd2FudCB0byBzaG93IGEgZ29vZCBtZXNzYWdlIGluIERFViBmaXJzdC5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZSwgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCAvLyBSdW4gdGhlc2UgY2hlY2tzIGluIHByb2R1Y3Rpb24gb25seSBpZiB0aGUgZmxhZyBpcyBvZmYuXG4gIC8vIEV2ZW50dWFsbHkgd2UnbGwgZGVsZXRlIHRoaXMgYnJhbmNoIGFsdG9nZXRoZXIuXG4gICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTIgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTJdKSB7XG4gICAgICAgIGVycm9yKCdUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGJlIGEgZnVuY3Rpb24gY29tcG9uZW50IHRoYXQgcmV0dXJucyBhIGNsYXNzIGluc3RhbmNlLiAnICsgJ0NoYW5nZSAlcyB0byBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4gJyArIFwiSWYgeW91IGNhbid0IHVzZSBhIGNsYXNzIHRyeSBhc3NpZ25pbmcgdGhlIHByb3RvdHlwZSBvbiB0aGUgZnVuY3Rpb24gYXMgYSB3b3JrYXJvdW5kLiBcIiArIFwiYCVzLnByb3RvdHlwZSA9IFJlYWN0LkNvbXBvbmVudC5wcm90b3R5cGVgLiBEb24ndCB1c2UgYW4gYXJyb3cgZnVuY3Rpb24gc2luY2UgaXQgXCIgKyAnY2Fubm90IGJlIGNhbGxlZCB3aXRoIGBuZXdgIGJ5IFJlYWN0LicsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyLCBfY29tcG9uZW50TmFtZTIpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfSAvLyBQcm9jZWVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyBhIGNsYXNzIGluc3RhbmNlXG5cblxuICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IENsYXNzQ29tcG9uZW50OyAvLyBUaHJvdyBvdXQgYW55IGhvb2tzIHRoYXQgd2VyZSB1c2VkLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsOyAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAgIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cbiAgICB2YXIgaGFzQ29udGV4dCA9IGZhbHNlO1xuXG4gICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gdmFsdWUuc3RhdGUgIT09IG51bGwgJiYgdmFsdWUuc3RhdGUgIT09IHVuZGVmaW5lZCA/IHZhbHVlLnN0YXRlIDogbnVsbDtcbiAgICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICAgIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgdmFsdWUpO1xuICAgIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBmaW5pc2hDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBmdW5jdGlvbiBjb21wb25lbnRcbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBGdW5jdGlvbkNvbXBvbmVudDtcblxuICAgIHtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7XG4gICAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihudWxsLCB3b3JrSW5Qcm9ncmVzcywgdmFsdWUsIHJlbmRlckxhbmVzKTtcblxuICAgIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpIHtcbiAge1xuICAgIGlmIChDb21wb25lbnQpIHtcbiAgICAgIGlmIChDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb24gY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgIH1cblxuICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvd25lck5hbWUgfHwgJyc7XG4gICAgICB2YXIgZGVidWdTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2U7XG5cbiAgICAgIGlmIChkZWJ1Z1NvdXJjZSkge1xuICAgICAgICB3YXJuaW5nS2V5ID0gZGVidWdTb3VyY2UuZmlsZU5hbWUgKyAnOicgKyBkZWJ1Z1NvdXJjZS5saW5lTnVtYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmc1t3YXJuaW5nS2V5XSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzLiAnICsgJ0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHVzZSBSZWFjdC5mb3J3YXJkUmVmKCk/JXMnLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignJXM6IFN1cHBvcnQgZm9yIGRlZmF1bHRQcm9wcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBmdW5jdGlvbiBjb21wb25lbnRzICcgKyAnaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gVXNlIEphdmFTY3JpcHQgZGVmYXVsdCBwYXJhbWV0ZXJzIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUzID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdKSB7XG4gICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBjb250ZXh0VHlwZS4nLCBfY29tcG9uZW50TmFtZTQpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFNVU1BFTkRFRF9NQVJLRVIgPSB7XG4gIGRlaHlkcmF0ZWQ6IG51bGwsXG4gIHRyZWVDb250ZXh0OiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lcyxcbiAgICBjYWNoZVBvb2w6IGdldFN1c3BlbmRlZENhY2hlKCksXG4gICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjYWNoZVBvb2wgPSBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiBtZXJnZUxhbmVzKHByZXZPZmZzY3JlZW5TdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKSxcbiAgICBjYWNoZVBvb2w6IGNhY2hlUG9vbCxcbiAgICB0cmFuc2l0aW9uczogcHJldk9mZnNjcmVlblN0YXRlLnRyYW5zaXRpb25zXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgIC8vIGlzIHRydWUuIE1vcmUgcHJlY2lzZSBuYW1lIG1pZ2h0IGJlIFwiRm9yY2VSZW1haW5TdXNwZW5zZUZhbGxiYWNrXCIuXG4gICAgICAvLyBOb3RlOiBUaGlzIGlzIGEgZmFjdG9yaW5nIHNtZWxsLiBDYW4ndCByZW1haW4gb24gYSBmYWxsYmFjayBpZiB0aGVyZSdzXG4gICAgICAvLyBubyBmYWxsYmFjayB0byByZW1haW4gb24uXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IC8vIE5vdCBjdXJyZW50bHkgc2hvd2luZyBjb250ZW50LiBDb25zdWx0IHRoZSBTdXNwZW5zZSBjb250ZXh0LlxuXG5cbiAgcmV0dXJuIGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IFNob3VsZCBub3QgcmVtb3ZlIHJlbmRlciBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIGR1cmluZyB0aGlzIHJlbmRlclxuICByZXR1cm4gcmVtb3ZlTGFuZXMoY3VycmVudC5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBzdXNwZW5kLlxuXG4gIHtcbiAgICBpZiAoc2hvdWxkU3VzcGVuZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3dGYWxsYmFjayA9IGZhbHNlO1xuICB2YXIgZGlkU3VzcGVuZCA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChkaWRTdXNwZW5kIHx8IHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50KSkge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGlzIGJvdW5kYXJ5J3Mgc3VidHJlZSBhbHJlYWR5IHN1c3BlbmRlZC4gU3dpdGNoIHRvXG4gICAgLy8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICBzaG93RmFsbGJhY2sgPSB0cnVlO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5EaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIC8vIEF0dGVtcHRpbmcgdGhlIG1haW4gY29udGVudFxuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudCBvciB0aGlzIGJvdW5kYXJ5IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gTWFyayB0aGlzIHN1YnRyZWUgY29udGV4dCBhcyBoYXZpbmcgYXQgbGVhc3Qgb25lIGludmlzaWJsZSBwYXJlbnQgdGhhdCBjb3VsZFxuICAgICAgLy8gaGFuZGxlIHRoZSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIEF2b2lkZWQgYm91bmRhcmllcyBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2UgdGhleSBjYW5ub3QgaGFuZGxlIHByZWZlcnJlZCBmYWxsYmFjayBzdGF0ZXMuXG4gICAgICB7XG4gICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7IC8vIE9LLCB0aGUgbmV4dCBwYXJ0IGlzIGNvbmZ1c2luZy4gV2UncmUgYWJvdXQgdG8gcmVjb25jaWxlIHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSdzIGNoaWxkcmVuLiBUaGlzIGludm9sdmVzIHNvbWUgY3VzdG9tIHJlY29uY2lsaWF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaHlkcmF0aW5nLCB0cnkgdG8gaHlkcmF0ZSB0aGlzIGJvdW5kYXJ5LlxuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTsgLy8gVGhpcyBjb3VsZCd2ZSBiZWVuIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQuXG5cbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGRlaHlkcmF0ZWQgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChkZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgZGVoeWRyYXRlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIG5leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuXG4gICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgdmFyIGZhbGxiYWNrRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcblxuICAgICAgcmV0dXJuIGZhbGxiYWNrRnJhZ21lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cGRhdGUuXG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9kZWh5ZHJhdGVkID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChfZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kLCBuZXh0UHJvcHMsIF9kZWh5ZHJhdGVkLCBwcmV2U3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgX25leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4sIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3RhdGUgPSBjdXJyZW50LmNoaWxkLm1lbW9pemVkU3RhdGU7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLm1lbW9pemVkU3RhdGUgPSBwcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcblxuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4yID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MyA9IHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50MztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseVxuICAgIC8vIGNvbXBsZXRlZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfVxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW5gIGlzIGBhbnlgIHR5cGVkLCBzbyB3ZSB1c2VcbiAgLy8gdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNvbnN0cmFpbiBpdC5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgTm9MYW5lcywgbnVsbCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVXb3JrSW5Qcm9ncmVzc2AgaXMgYGFueWAgdHlwZWQsIHNvIHdlIHVzZSB0aGlzXG4gIC8vIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LlxuICByZXR1cm4gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDtcbiAgdmFyIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZztcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBEZWxldGUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50XG4gICAgdmFyIGRlbGV0aW9ucyA9IHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IFtjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50XTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAvLyBNYWtlIHN1cmUgd2UncmUgb24gdGhlIHNlY29uZCBwYXNzLCBpLmUuIHRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50IHdhc1xuICAvLyBhbHJlYWR5IGNsb25lZC4gSW4gbGVnYWN5IG1vZGUsIHRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhpcyBpc24ndCB0cnVlIGlzXG4gIC8vIHdoZW4gRGV2VG9vbHMgZm9yY2VzIHVzIHRvIGRpc3BsYXkgYSBmYWxsYmFjazsgd2Ugc2tpcCB0aGUgZmlyc3QgcmVuZGVyXG4gIC8vIHBhc3MgZW50aXJlbHkgYW5kIGdvIHN0cmFpZ2h0IHRvIHJlbmRlcmluZyB0aGUgZmFsbGJhY2suIChJbiBDb25jdXJyZW50XG4gIC8vIE1vZGUsIFN1c3BlbnNlTGlzdCBjYW4gYWxzbyB0cmlnZ2VyIHRoaXMgc2NlbmFyaW8sIGJ1dCB0aGlzIGlzIGEgbGVnYWN5LVxuICAvLyBvbmx5IGNvZGVwYXRoLilcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCkge1xuICAgIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gLy8gVGhlIGZhbGxiYWNrIGZpYmVyIHdhcyBhZGRlZCBhcyBhIGRlbGV0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGFzcy5cbiAgICAvLyBIb3dldmVyLCBzaW5jZSB3ZSdyZSBnb2luZyB0byByZW1haW4gb24gdGhlIGZhbGxiYWNrLCB3ZSBubyBsb25nZXIgd2FudFxuICAgIC8vIHRvIGRlbGV0ZSBpdC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LCBwcmltYXJ5Q2hpbGRQcm9wcyk7IC8vIFNpbmNlIHdlJ3JlIHJldXNpbmcgYSBjdXJyZW50IHRyZWUsIHdlIG5lZWQgdG8gcmV1c2UgdGhlIGZsYWdzLCB0b28uXG4gICAgLy8gKFdlIGRvbid0IGRvIHRoaXMgaW4gbGVnYWN5IG1vZGUsIGJlY2F1c2UgaW4gbGVnYWN5IG1vZGUgd2UgZG9uJ3QgcmUtdXNlXG4gICAgLy8gdGhlIGN1cnJlbnQgdHJlZTsgc2VlIHByZXZpb3VzIGJyYW5jaC4pXG5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zdWJ0cmVlRmxhZ3MgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgfVxuXG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBmYWxsYmFja0NoaWxkcmVuKTtcbiAgfSBlbHNlIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAgIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKSB7XG4gIC8vIEZhbGxpbmcgYmFjayB0byBjbGllbnQgcmVuZGVyaW5nLiBCZWNhdXNlIHRoaXMgaGFzIHBlcmZvcm1hbmNlXG4gIC8vIGltcGxpY2F0aW9ucywgaXQncyBjb25zaWRlcmVkIGEgcmVjb3ZlcmFibGUgZXJyb3IsIGV2ZW4gdGhvdWdoIHRoZSB1c2VyXG4gIC8vIGxpa2VseSB3b24ndCBvYnNlcnZlIGFueXRoaW5nIHdyb25nIHdpdGggdGhlIFVJLlxuICAvL1xuICAvLyBUaGUgZXJyb3IgaXMgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50IHRvIGVuZm9yY2UgdGhhdCBldmVyeSBjYWxsZXIgcHJvdmlkZVxuICAvLyBhIGN1c3RvbSBtZXNzYWdlLCBvciBleHBsaWNpdGx5IG9wdCBvdXQgKGN1cnJlbnRseSB0aGUgb25seSBwYXRoIHRoYXQgb3B0c1xuICAvLyBvdXQgaXMgbGVnYWN5IG1vZGU7IGV2ZXJ5IGNvbmN1cnJlbnQgcGF0aCBwcm92aWRlcyBhbiBlcnJvcikuXG4gIGlmIChyZWNvdmVyYWJsZUVycm9yICE9PSBudWxsKSB7XG4gICAgcXVldWVIeWRyYXRpb25FcnJvcihyZWNvdmVyYWJsZUVycm9yKTtcbiAgfSAvLyBUaGlzIHdpbGwgYWRkIHRoZSBvbGQgZmliZXIgdG8gdGhlIGRlbGV0aW9uIGxpc3RcblxuXG4gIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIFdlJ3JlIG5vdyBub3Qgc3VzcGVuZGVkIG5vciBkZWh5ZHJhdGVkLlxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbik7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGZpYmVyTW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIGZpYmVyTW9kZSk7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBmaWJlck1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlXG4gIC8vIGJvdW5kYXJ5KSBhbHJlYWR5IG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgIC8vIFdlIHdpbGwgaGF2ZSBkcm9wcGVkIHRoZSBlZmZlY3QgbGlzdCB3aGljaCBjb250YWlucyB0aGVcbiAgICAvLyBkZWxldGlvbi4gV2UgbmVlZCB0byByZWNvbmNpbGUgdG8gZGVsZXRlIHRoZSBjdXJyZW50IGNoaWxkLlxuICAgIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gRHVyaW5nIHRoZSBmaXJzdCBwYXNzLCB3ZSdsbCBiYWlsIG91dCBhbmQgbm90IGRyaWxsIGludG8gdGhlIGNoaWxkcmVuLlxuICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB0aGUgY29udGVudCBpbiBwbGFjZSBhbmQgdHJ5IHRvIGh5ZHJhdGUgaXQgbGF0ZXIuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ0Nhbm5vdCBoeWRyYXRlIFN1c3BlbnNlIGluIGxlZ2FjeSBtb2RlLiBTd2l0Y2ggZnJvbSAnICsgJ1JlYWN0RE9NLmh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyKSB0byAnICsgJ1JlYWN0RE9NQ2xpZW50Lmh5ZHJhdGVSb290KGNvbnRhaW5lciwgPEFwcCAvPiknICsgJy5yZW5kZXIoZWxlbWVudCkgb3IgcmVtb3ZlIHRoZSBTdXNwZW5zZSBjb21wb25lbnRzIGZyb20gJyArICd0aGUgc2VydmVyIHJlbmRlcmVkIGNvbXBvbmVudHMuJyk7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhTeW5jTGFuZSk7XG4gIH0gZWxzZSBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAvLyBUaGlzIGlzIGEgY2xpZW50LW9ubHkgYm91bmRhcnkuIFNpbmNlIHdlIHdvbid0IGdldCBhbnkgY29udGVudCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAvLyBmb3IgdGhpcywgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGF0IGF0IGEgaGlnaGVyIHByaW9yaXR5IGJhc2VkIG9uIHdoZW4gaXQgd291bGRcbiAgICAvLyBoYXZlIHRpbWVkIG91dC4gSW4gdGhlb3J5IHdlIGNvdWxkIHJlbmRlciBpdCBpbiB0aGlzIHBhc3MgYnV0IGl0IHdvdWxkIGhhdmUgdGhlXG4gICAgLy8gd3JvbmcgcHJpb3JpdHkgYXNzb2NpYXRlZCB3aXRoIGl0IGFuZCB3aWxsIHByZXZlbnQgaHlkcmF0aW9uIG9mIHBhcmVudCBwYXRoLlxuICAgIC8vIEluc3RlYWQsIHdlJ2xsIGxlYXZlIHdvcmsgbGVmdCBvbiBpdCB0byByZW5kZXIgaXQgaW4gYSBzZXBhcmF0ZSBjb21taXQuXG4gICAgLy8gVE9ETyBUaGlzIHRpbWUgc2hvdWxkIGJlIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBzZXJ2ZXIgcmVuZGVyZWQgcmVzcG9uc2UgdGhhdCBpc1xuICAgIC8vIGEgcGFyZW50IHRvIHRoaXMgYm91bmRhcnkgd2FzIGRpc3BsYXllZC4gSG93ZXZlciwgc2luY2Ugd2UgY3VycmVudGx5IGRvbid0IGhhdmVcbiAgICAvLyBhIHByb3RvY29sIHRvIHRyYW5zZmVyIHRoYXQgdGltZSwgd2UnbGwganVzdCBlc3RpbWF0ZSBpdCBieSB1c2luZyB0aGUgY3VycmVudFxuICAgIC8vIHRpbWUuIFRoaXMgd2lsbCBtZWFuIHRoYXQgU3VzcGVuc2UgdGltZW91dHMgYXJlIHNsaWdodGx5IHNoaWZ0ZWQgdG8gbGF0ZXIgdGhhblxuICAgIC8vIHRoZXkgc2hvdWxkIGJlLlxuICAgIC8vIFNjaGVkdWxlIGEgbm9ybWFsIHByaSB1cGRhdGUgdG8gcmVuZGVyIHRoaXMgY29udGVudC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKERlZmF1bHRIeWRyYXRpb25MYW5lKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSdsbCBjb250aW51ZSBoeWRyYXRpbmcgdGhlIHJlc3QgYXQgb2Zmc2NyZWVuIHByaW9yaXR5IHNpbmNlIHdlJ2xsIGFscmVhZHlcbiAgICAvLyBiZSBzaG93aW5nIHRoZSByaWdodCBjb250ZW50IGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXIsIGl0IGlzIG5vIHJ1c2guXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGRpZFN1c3BlbmQsIG5leHRQcm9wcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKCFkaWRTdXNwZW5kKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyIHBhc3MuIEF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgaHlkcmF0aW5nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgcGFzcyxcbiAgICAvLyBidXQgYWZ0ZXIgd2UndmUgYWxyZWFkeSBjb21taXR0ZWQgb25jZS5cbiAgICB3YXJuSWZIeWRyYXRpbmcoKTtcblxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCAvLyBUT0RPOiBXaGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZSwgd2Ugc2hvdWxkIG1ha2UgdGhpcyBlcnJvciBhcmd1bWVudFxuICAgICAgLy8gcmVxdWlyZWQg4oCUIGV2ZXJ5IGNvbmN1cnJlbnQgbW9kZSBwYXRoIHRoYXQgY2F1c2VzIGh5ZHJhdGlvbiB0b1xuICAgICAgLy8gZGUtb3B0IHRvIGNsaWVudCByZW5kZXJpbmcgc2hvdWxkIGhhdmUgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgIG51bGwpO1xuICAgIH1cblxuICAgIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgLy8gVGhpcyBib3VuZGFyeSBpcyBpbiBhIHBlcm1hbmVudCBmYWxsYmFjayBzdGF0ZS4gSW4gdGhpcyBjYXNlLCB3ZSdsbCBuZXZlclxuICAgICAgLy8gZ2V0IGFuIHVwZGF0ZSBhbmQgd2UnbGwgbmV2ZXIgYmUgYWJsZSB0byBoeWRyYXRlIHRoZSBmaW5hbCBjb250ZW50LiBMZXQncyBqdXN0IHRyeSB0aGVcbiAgICAgIC8vIGNsaWVudCBzaWRlIHJlbmRlciBpbnN0ZWFkLlxuICAgICAgdmFyIGRpZ2VzdCwgbWVzc2FnZSwgc3RhY2s7XG5cbiAgICAgIHtcbiAgICAgICAgdmFyIF9nZXRTdXNwZW5zZUluc3RhbmNlRiA9IGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhzdXNwZW5zZUluc3RhbmNlKTtcblxuICAgICAgICBkaWdlc3QgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYuZGlnZXN0O1xuICAgICAgICBtZXNzYWdlID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLm1lc3NhZ2U7XG4gICAgICAgIHN0YWNrID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLnN0YWNrO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3I7XG5cbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ1RoZSBzZXJ2ZXIgY291bGQgbm90IGZpbmlzaCB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LCBsaWtlbHkgJyArICdkdWUgdG8gYW4gZXJyb3IgZHVyaW5nIHNlcnZlciByZW5kZXJpbmcuIFN3aXRjaGVkIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBkaWdlc3QsIHN0YWNrKTtcbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIGNhcHR1cmVkVmFsdWUpO1xuICAgIH1cbiAgICAvLyBhbnkgY29udGV4dCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byB0cmVhdCBpcyBhcyBpZiB0aGUgaW5wdXQgbWlnaHQgaGF2ZSBjaGFuZ2VkLlxuXG5cbiAgICB2YXIgaGFzQ29udGV4dENoYW5nZWQgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBjdXJyZW50LmNoaWxkTGFuZXMpO1xuXG4gICAgaWYgKGRpZFJlY2VpdmVVcGRhdGUgfHwgaGFzQ29udGV4dENoYW5nZWQpIHtcbiAgICAgIC8vIFRoaXMgYm91bmRhcnkgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGZpcnN0IHJlbmRlci4gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3cgdW5hYmxlIHRvXG4gICAgICAvLyBoeWRyYXRlIGl0LiBXZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIGh5ZHJhdGUgaXQgdXNpbmcgYSBoaWdoZXIgcHJpb3JpdHkgbGFuZS5cbiAgICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lID0gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgaWYgKGF0dGVtcHRIeWRyYXRpb25BdExhbmUgIT09IE5vTGFuZSAmJiBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSkge1xuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbXV0YXRpbmcgc2luY2UgdGhpcyByZW5kZXIgd2lsbCBnZXQgaW50ZXJydXB0ZWQuIFRoaXNcbiAgICAgICAgICAvLyBpcyBvbmUgb2YgdGhlIHZlcnkgcmFyZSB0aW1lcyB3aGVyZSB3ZSBtdXRhdGUgdGhlIGN1cnJlbnQgdHJlZVxuICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZTsgLy8gVE9ETzogSWRlYWxseSB0aGlzIHdvdWxkIGluaGVyaXQgdGhlIGV2ZW50IHRpbWUgb2YgdGhlIGN1cnJlbnQgcmVuZGVyXG5cbiAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGN1cnJlbnQsIGF0dGVtcHRIeWRyYXRpb25BdExhbmUpO1xuICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIElmIHdlIGhhdmUgc2NoZWR1bGVkIGhpZ2hlciBwcmkgd29yayBhYm92ZSwgdGhpcyB3aWxsIHByb2JhYmx5IGp1c3QgYWJvcnQgdGhlIHJlbmRlclxuICAgICAgLy8gc2luY2Ugd2Ugbm93IGhhdmUgaGlnaGVyIHByaW9yaXR5IHdvcmssIGJ1dCBpbiBjYXNlIGl0IGRvZXNuJ3QsIHdlIG5lZWQgdG8gcHJlcGFyZSB0b1xuICAgICAgLy8gcmVuZGVyIHNvbWV0aGluZywgaWYgd2UgdGltZSBvdXQuIEV2ZW4gaWYgdGhhdCByZXF1aXJlcyB1cyB0byBkZWxldGUgZXZlcnl0aGluZyBhbmRcbiAgICAgIC8vIHNraXAgaHlkcmF0aW9uLlxuICAgICAgLy8gRGVsYXkgaGF2aW5nIHRvIGRvIHRoaXMgYXMgbG9uZyBhcyB0aGUgc3VzcGVuc2UgdGltZW91dCBhbGxvd3MgdXMuXG5cblxuICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuXG4gICAgICB2YXIgX2NhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhpcyBTdXNwZW5zZSBib3VuZGFyeSByZWNlaXZlZCBhbiB1cGRhdGUgYmVmb3JlIGl0IGZpbmlzaGVkICcgKyAnaHlkcmF0aW5nLiBUaGlzIGNhdXNlZCB0aGUgYm91bmRhcnkgdG8gc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcuICcgKyAnVGhlIHVzdWFsIHdheSB0byBmaXggdGhpcyBpcyB0byB3cmFwIHRoZSBvcmlnaW5hbCB1cGRhdGUgJyArICdpbiBzdGFydFRyYW5zaXRpb24uJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyBzdGlsbCBwZW5kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIsIHNvIHdlIGNhbid0IGh5ZHJhdGUgaXRzXG4gICAgICAvLyBjb250ZW50LiBXZSB0cmVhdCBpdCBhcyBpZiB0aGlzIGNvbXBvbmVudCBzdXNwZW5kZWQgaXRzZWxmLiBJdCBtaWdodCBzZWVtIGFzIGlmXG4gICAgICAvLyB3ZSBjb3VsZCBqdXN0IHRyeSB0byByZW5kZXIgaXQgY2xpZW50LXNpZGUgaW5zdGVhZC4gSG93ZXZlciwgdGhpcyB3aWxsIHBlcmZvcm0gYVxuICAgICAgLy8gbG90IG9mIHVubmVjZXNzYXJ5IHdvcmsgYW5kIGlzIHVubGlrZWx5IHRvIGNvbXBsZXRlIHNpbmNlIGl0IG9mdGVuIHdpbGwgc3VzcGVuZFxuICAgICAgLy8gb24gbWlzc2luZyBkYXRhIGFueXdheS4gQWRkaXRpb25hbGx5LCB0aGUgc2VydmVyIG1pZ2h0IGJlIGFibGUgdG8gcmVuZGVyIG1vcmVcbiAgICAgIC8vIHRoYW4gd2UgY2FuIG9uIHRoZSBjbGllbnQgeWV0LiBJbiB0aGF0IGNhc2Ugd2UnZCBlbmQgdXAgd2l0aCBtb3JlIGZhbGxiYWNrIHN0YXRlc1xuICAgICAgLy8gb24gdGhlIGNsaWVudCB0aGFuIGlmIHdlIGp1c3QgbGVhdmUgaXQgYWxvbmUuIElmIHRoZSBzZXJ2ZXIgdGltZXMgb3V0IG9yIGVycm9yc1xuICAgICAgLy8gdGhlc2Ugc2hvdWxkIHVwZGF0ZSB0aGlzIGJvdW5kYXJ5IHRvIHRoZSBwZXJtYW5lbnQgRmFsbGJhY2sgc3RhdGUgaW5zdGVhZC5cbiAgICAgIC8vIE1hcmsgaXQgYXMgaGF2aW5nIGNhcHR1cmVkIChpLmUuIHN1c3BlbmRlZCkuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBMZWF2ZSB0aGUgY2hpbGQgaW4gcGxhY2UuIEkuZS4gdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gUmVnaXN0ZXIgYSBjYWxsYmFjayB0byByZXRyeSB0aGlzIGJvdW5kYXJ5IG9uY2UgdGhlIHNlcnZlciBoYXMgc2VudCB0aGUgcmVzdWx0LlxuXG4gICAgICB2YXIgcmV0cnkgPSByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5LmJpbmQobnVsbCwgY3VycmVudCk7XG4gICAgICByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShzdXNwZW5zZUluc3RhbmNlLCByZXRyeSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICAgIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZS50cmVlQ29udGV4dCk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTWFyayB0aGUgY2hpbGRyZW4gYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgICAvLyB0cmVlIGlzIHBhcnQgb2YgYSBoeWRyYXRpbmcgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkXG4gICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0aGUgUmVhY3QgdHJlZSBoZXJlLiBJdCBqdXN0IGhhcHBlbnMgdG8gbm90IG5lZWQgRE9NXG4gICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cblxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gSHlkcmF0aW5nO1xuICAgICAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MuIFdlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIGh5ZHJhdGVkLCBidXRcbiAgICAvLyBzb21ldGhpbmcgZWl0aGVyIHN1c3BlbmRlZCBvciBlcnJvcmVkLlxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgaHlkcmF0aW9uLiBUcnkgYWdhaW4gd2l0aG91dCBoeWRyYXRpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICAgIHZhciBfY2FwdHVyZWRWYWx1ZTIgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZyB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LiAnICsgJ1N3aXRjaGVkIHRvIGNsaWVudCByZW5kZXJpbmcuJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZTIpO1xuICAgIH0gZWxzZSBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZCBhbmQgd2Ugc2hvdWxkIHN0aWxsIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIExlYXZlIHRoZSBleGlzdGluZyBjaGlsZCBpbiBwbGFjZS5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhlIGRlaHlkcmF0ZWQgY29tcGxldGlvbiBwYXNzIGV4cGVjdHMgdGhpcyBmbGFnIHRvIGJlIHRoZXJlXG4gICAgICAvLyBidXQgdGhlIG5vcm1hbCBzdXNwZW5zZSBwYXNzIGRvZXNuJ3QuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3VzcGVuZGVkIGJ1dCB3ZSBzaG91bGQgbm8gbG9uZ2VyIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIFRoZXJlZm9yZSB3ZSBub3cgaGF2ZSB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGZpYmVyLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KSB7XG4gIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpO1xufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGZpcnN0Q2hpbGQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIE1hcmsgYW55IFN1c3BlbnNlIGJvdW5kYXJpZXMgd2l0aCBmYWxsYmFja3MgYXMgaGF2aW5nIHdvcmsgdG8gZG8uXG4gIC8vIElmIHRoZXkgd2VyZSBwcmV2aW91c2x5IGZvcmNlZCBpbnRvIGZhbGxiYWNrcywgdGhleSBtYXkgbm93IGJlIGFibGVcbiAgLy8gdG8gdW5ibG9jay5cbiAgdmFyIG5vZGUgPSBmaXJzdENoaWxkO1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50KSB7XG4gICAgICAvLyBJZiB0aGUgdGFpbCBpcyBoaWRkZW4gdGhlcmUgbWlnaHQgbm90IGJlIGFuIFN1c3BlbnNlIGJvdW5kYXJpZXNcbiAgICAgIC8vIHRvIHNjaGVkdWxlIHdvcmsgb24uIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHNjaGVkdWxlIGl0IG9uIHRoZVxuICAgICAgLy8gbGlzdCBpdHNlbGYuXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHRyYXZlcnNlIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGlzdCBzaW5jZVxuICAgICAgLy8gdGhlIGxpc3Qgd2lsbCBwcm9wYWdhdGUgdGhlIGNoYW5nZSB3aGVuIGl0IHJlcmVuZGVycy5cbiAgICAgIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Q29udGVudFJvdyhmaXJzdENoaWxkKSB7XG4gIC8vIFRoaXMgaXMgZ29pbmcgdG8gZmluZCB0aGUgbGFzdCByb3cgYW1vbmcgdGhlc2UgY2hpbGRyZW4gdGhhdCBpcyBhbHJlYWR5XG4gIC8vIHNob3dpbmcgY29udGVudCBvbiB0aGUgc2NyZWVuLCBhcyBvcHBvc2VkIHRvIGJlaW5nIGluIGZhbGxiYWNrIHN0YXRlIG9yXG4gIC8vIG5ldy4gSWYgYSByb3cgaGFzIG11bHRpcGxlIFN1c3BlbnNlIGJvdW5kYXJpZXMsIGFueSBvZiB0aGVtIGJlaW5nIGluIHRoZVxuICAvLyBmYWxsYmFjayBzdGF0ZSwgY291bnRzIGFzIHRoZSB3aG9sZSByb3cgYmVpbmcgaW4gYSBmYWxsYmFjayBzdGF0ZS5cbiAgLy8gTm90ZSB0aGF0IHRoZSBcInJvd3NcIiB3aWxsIGJlIHdvcmtJblByb2dyZXNzLCBidXQgYW55IG5lc3RlZCBjaGlsZHJlblxuICAvLyB3aWxsIHN0aWxsIGJlIGN1cnJlbnQgc2luY2Ugd2UgaGF2ZW4ndCByZW5kZXJlZCB0aGVtIHlldC4gVGhlIG1vdW50ZWRcbiAgLy8gb3JkZXIgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgbmV3IG9yZGVyLiBXZSB1c2UgdGhlIG5ldyBvcmRlci5cbiAgdmFyIHJvdyA9IGZpcnN0Q2hpbGQ7XG4gIHZhciBsYXN0Q29udGVudFJvdyA9IG51bGw7XG5cbiAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50Um93ID0gcm93LmFsdGVybmF0ZTsgLy8gTmV3IHJvd3MgY2FuJ3QgYmUgY29udGVudCByb3dzLlxuXG4gICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICBsYXN0Q29udGVudFJvdyA9IHJvdztcbiAgICB9XG5cbiAgICByb3cgPSByb3cuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBsYXN0Q29udGVudFJvdztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHJldmVhbE9yZGVyICE9PSB1bmRlZmluZWQgJiYgcmV2ZWFsT3JkZXIgIT09ICdmb3J3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICdiYWNrd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAndG9nZXRoZXInICYmICFkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0pIHtcbiAgICAgIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgcmV2ZWFsT3JkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdVc2UgbG93ZXJjYXNlIFwiJXNcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmQnOlxuICAgICAgICAgIGNhc2UgJ2JhY2t3YXJkJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdSZWFjdCB1c2VzIHRoZSAtcyBzdWZmaXggaW4gdGhlIHNwZWxsaW5nLiBVc2UgXCIlc3NcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsIHJldmVhbE9yZGVyKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRhaWxPcHRpb25zKHRhaWxNb2RlLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHRhaWxNb2RlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSkge1xuICAgICAgaWYgKHRhaWxNb2RlICE9PSAnY29sbGFwc2VkJyAmJiB0YWlsTW9kZSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgdGFpbCBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcImNvbGxhcHNlZFwiIG9yIFwiaGlkZGVuXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfSBlbHNlIGlmIChyZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignPFN1c3BlbnNlTGlzdCB0YWlsPVwiJXNcIiAvPiBpcyBvbmx5IHZhbGlkIGlmIHJldmVhbE9yZGVyIGlzICcgKyAnXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCIuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHNwZWNpZnkgcmV2ZWFsT3JkZXI9XCJmb3J3YXJkc1wiPycsIHRhaWxNb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZFNsb3QsIGluZGV4KSB7XG4gIHtcbiAgICB2YXIgaXNBbkFycmF5ID0gaXNBcnJheShjaGlsZFNsb3QpO1xuICAgIHZhciBpc0l0ZXJhYmxlID0gIWlzQW5BcnJheSAmJiB0eXBlb2YgZ2V0SXRlcmF0b3JGbihjaGlsZFNsb3QpID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYgKGlzQW5BcnJheSB8fCBpc0l0ZXJhYmxlKSB7XG4gICAgICB2YXIgdHlwZSA9IGlzQW5BcnJheSA/ICdhcnJheScgOiAnaXRlcmFibGUnO1xuXG4gICAgICBlcnJvcignQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gJyArICdhbiBhZGRpdGlvbmFsIFN1c3BlbnNlTGlzdCB0byBjb25maWd1cmUgaXRzIHJldmVhbE9yZGVyOiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPiAuLi4gJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiAnICsgJzwvU3VzcGVuc2VMaXN0PicsIHR5cGUsIGluZGV4LCB0eXBlKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKGNoaWxkcmVuLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKChyZXZlYWxPcmRlciA9PT0gJ2ZvcndhcmRzJyB8fCByZXZlYWxPcmRlciA9PT0gJ2JhY2t3YXJkcycpICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZHJlbltpXSwgaSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuSXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuXG4gICAgICAgICAgaWYgKGNoaWxkcmVuSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB2YXIgX2kgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcignQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gJyArICdUaGlzIGlzIG5vdCB1c2VmdWwgc2luY2UgaXQgbmVlZHMgbXVsdGlwbGUgcm93cy4gJyArICdEaWQgeW91IG1lYW4gdG8gcGFzcyBtdWx0aXBsZSBjaGlsZHJlbiBvciBhbiBhcnJheT8nLCByZXZlYWxPcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBpc0JhY2t3YXJkcywgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKSB7XG4gIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcyxcbiAgICAgIHJlbmRlcmluZzogbnVsbCxcbiAgICAgIHJlbmRlcmluZ1N0YXJ0VGltZTogMCxcbiAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LFxuICAgICAgdGFpbDogdGFpbCxcbiAgICAgIHRhaWxNb2RlOiB0YWlsTW9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UgY2FuIHJldXNlIHRoZSBleGlzdGluZyBvYmplY3QgZnJvbSBwcmV2aW91cyByZW5kZXJzLlxuICAgIHJlbmRlclN0YXRlLmlzQmFja3dhcmRzID0gaXNCYWNrd2FyZHM7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPSAwO1xuICAgIHJlbmRlclN0YXRlLmxhc3QgPSBsYXN0Q29udGVudFJvdztcbiAgICByZW5kZXJTdGF0ZS50YWlsID0gdGFpbDtcbiAgICByZW5kZXJTdGF0ZS50YWlsTW9kZSA9IHRhaWxNb2RlO1xuICB9XG59IC8vIFRoaXMgY2FuIGVuZCB1cCByZW5kZXJpbmcgdGhpcyBjb21wb25lbnQgbXVsdGlwbGUgcGFzc2VzLlxuLy8gVGhlIGZpcnN0IHBhc3Mgc3BsaXRzIHRoZSBjaGlsZHJlbiBmaWJlcnMgaW50byB0d28gc2V0cy4gQSBoZWFkIGFuZCB0YWlsLlxuLy8gV2UgZmlyc3QgcmVuZGVyIHRoZSBoZWFkLiBJZiBhbnl0aGluZyBpcyBpbiBmYWxsYmFjayBzdGF0ZSwgd2UgZG8gYW5vdGhlclxuLy8gcGFzcyB0aHJvdWdoIGJlZ2luV29yayB0byByZXJlbmRlciBhbGwgY2hpbGRyZW4gKGluY2x1ZGluZyB0aGUgdGFpbCkgd2l0aFxuLy8gdGhlIGZvcmNlIHN1c3BlbmQgY29udGV4dC4gSWYgdGhlIGZpcnN0IHJlbmRlciBkaWRuJ3QgaGF2ZSBhbnl0aGluZyBpblxuLy8gaW4gZmFsbGJhY2sgc3RhdGUuIFRoZW4gd2UgcmVuZGVyIGVhY2ggcm93IGluIHRoZSB0YWlsIG9uZS1ieS1vbmUuXG4vLyBUaGF0IGhhcHBlbnMgaW4gdGhlIGNvbXBsZXRlV29yayBwaGFzZSB3aXRob3V0IGdvaW5nIGJhY2sgdG8gYmVnaW5Xb3JrLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJldmVhbE9yZGVyID0gbmV4dFByb3BzLnJldmVhbE9yZGVyO1xuICB2YXIgdGFpbE1vZGUgPSBuZXh0UHJvcHMudGFpbDtcbiAgdmFyIG5ld0NoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpO1xuICB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKG5ld0NoaWxkcmVuLCByZXZlYWxPcmRlcik7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvdWxkRm9yY2VGYWxsYmFjayA9IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG5cbiAgaWYgKHNob3VsZEZvcmNlRmFsbGJhY2spIHtcbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIHZhciBkaWRTdXNwZW5kQmVmb3JlID0gY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgaWYgKGRpZFN1c3BlbmRCZWZvcmUpIHtcbiAgICAgIC8vIElmIHdlIHByZXZpb3VzbHkgZm9yY2VkIGEgZmFsbGJhY2ssIHdlIG5lZWQgdG8gc2NoZWR1bGUgd29ya1xuICAgICAgLy8gb24gYW55IG5lc3RlZCBib3VuZGFyaWVzIHRvIGxldCB0aGVtIGtub3cgdG8gdHJ5IHRvIHJlbmRlclxuICAgICAgLy8gYWdhaW4uIFRoaXMgaXMgdGhlIHNhbWUgYXMgY29udGV4dCB1cGRhdGluZy5cbiAgICAgIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MuY2hpbGQsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICB9XG5cbiAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIC8vIEluIGxlZ2FjeSBtb2RlLCBTdXNwZW5zZUxpc3QgZG9lc24ndCB3b3JrIHNvIHdlIGp1c3RcbiAgICAvLyB1c2UgbWFrZSBpdCBhIG5vb3AgYnkgdHJlYXRpbmcgaXQgYXMgdGhlIGRlZmF1bHQgcmV2ZWFsT3JkZXIuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChyZXZlYWxPcmRlcikge1xuICAgICAgY2FzZSAnZm9yd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhc3RDb250ZW50Um93ID0gZmluZExhc3RDb250ZW50Um93KHdvcmtJblByb2dyZXNzLmNoaWxkKTtcbiAgICAgICAgICB2YXIgdGFpbDtcblxuICAgICAgICAgIGlmIChsYXN0Q29udGVudFJvdyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIHdob2xlIGxpc3QgaXMgcGFydCBvZiB0aGUgdGFpbC5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIGNvdWxkIGZhc3QgcGF0aCBieSBqdXN0IHJlbmRlcmluZyB0aGUgdGFpbCBub3cuXG4gICAgICAgICAgICB0YWlsID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIHRhaWwgcm93cyBhZnRlciB0aGUgY29udGVudCByb3cuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byByZW5kZXIgdGhlbSBzZXBhcmF0ZWx5IGxhdGVyLlxuICAgICAgICAgICAgdGFpbCA9IGxhc3RDb250ZW50Um93LnNpYmxpbmc7XG4gICAgICAgICAgICBsYXN0Q29udGVudFJvdy5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIHRhaWwsIGxhc3RDb250ZW50Um93LCB0YWlsTW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGZpbmQgdGhlIGZpcnN0IHJvdyB0aGF0IGhhcyBleGlzdGluZyBjb250ZW50LlxuICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UncmUgZ29pbmcgdG8gcmV2ZXJzZSB0aGUgbGlzdCBvZiBldmVyeXRoaW5nXG4gICAgICAgICAgLy8gd2UgcGFzcyBpbiB0aGUgbWVhbnRpbWUuIFRoYXQncyBnb2luZyB0byBiZSBvdXIgdGFpbCBpbiByZXZlcnNlXG4gICAgICAgICAgLy8gb3JkZXIuXG4gICAgICAgICAgdmFyIF90YWlsID0gbnVsbDtcbiAgICAgICAgICB2YXIgcm93ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuXG4gICAgICAgICAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Um93ICE9PSBudWxsICYmIGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50Um93KSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1haW4gY29udGVudC5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByb3c7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbmV4dFJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgcm93LnNpYmxpbmcgPSBfdGFpbDtcbiAgICAgICAgICAgIF90YWlsID0gcm93O1xuICAgICAgICAgICAgcm93ID0gbmV4dFJvdztcbiAgICAgICAgICB9IC8vIFRPRE86IElmIHdvcmtJblByb2dyZXNzLmNoaWxkIGlzIG51bGwsIHdlIGNhbiBjb250aW51ZSBvbiB0aGUgdGFpbCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCB0cnVlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIF90YWlsLCBudWxsLCAvLyBsYXN0XG4gICAgICAgICAgdGFpbE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAge1xuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgbnVsbCwgLy8gdGFpbFxuICAgICAgICAgIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB1bmRlZmluZWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgZGVmYXVsdCByZXZlYWwgb3JkZXIgaXMgdGhlIHNhbWUgYXMgbm90IGhhdmluZ1xuICAgICAgICAgIC8vIGEgYm91bmRhcnkuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFBvcnRhbHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB3ZSBkb24ndCBhcHBlbmQgdGhlIGNoaWxkcmVuIGR1cmluZyBtb3VudFxuICAgIC8vIGJ1dCBhdCBjb21taXQuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHRyYWNrIGluc2VydGlvbnMgd2hpY2ggdGhlIG5vcm1hbFxuICAgIC8vIGZsb3cgZG9lc24ndCBkbyBkdXJpbmcgbW91bnQuIFRoaXMgZG9lc24ndCBoYXBwZW4gYXQgdGhlIHJvb3QgYmVjYXVzZVxuICAgIC8vIHRoZSByb290IGFsd2F5cyBzdGFydHMgd2l0aCBhIFwiY3VycmVudFwiIHdpdGggYSBudWxsIGNoaWxkLlxuICAgIC8vIFRPRE86IENvbnNpZGVyIHVuaWZ5aW5nIHRoaXMgd2l0aCBob3cgdGhlIHJvb3Qgd29ya3MuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgcHJvdmlkZXJUeXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlclR5cGUuX2NvbnRleHQ7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG5ld1ZhbHVlID0gbmV3UHJvcHMudmFsdWU7XG5cbiAge1xuICAgIGlmICghKCd2YWx1ZScgaW4gbmV3UHJvcHMpKSB7XG4gICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGhlIGB2YWx1ZWAgcHJvcCBpcyByZXF1aXJlZCBmb3IgdGhlIGA8Q29udGV4dC5Qcm92aWRlcj5gLiBEaWQgeW91IG1pc3NwZWxsIGl0IG9yIGZvcmdldCB0byBwYXNzIGl0PycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcm92aWRlclByb3BUeXBlcyA9IHdvcmtJblByb2dyZXNzLnR5cGUucHJvcFR5cGVzO1xuXG4gICAgaWYgKHByb3ZpZGVyUHJvcFR5cGVzKSB7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm92aWRlclByb3BUeXBlcywgbmV3UHJvcHMsICdwcm9wJywgJ0NvbnRleHQuUHJvdmlkZXInKTtcbiAgICB9XG4gIH1cblxuICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcblxuICB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBudWxsKSB7XG4gICAgICB2YXIgb2xkVmFsdWUgPSBvbGRQcm9wcy52YWx1ZTtcblxuICAgICAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgLy8gTm8gY2hhbmdlLiBCYWlsb3V0IGVhcmx5IGlmIGNoaWxkcmVuIGFyZSB0aGUgc2FtZS5cbiAgICAgICAgaWYgKG9sZFByb3BzLmNoaWxkcmVuID09PSBuZXdQcm9wcy5jaGlsZHJlbiAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSkge1xuICAgICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgICAvLyB0aGVtIHRvIHVwZGF0ZS5cbiAgICAgICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG5cbiAge1xuICAgIGlmIChjb250ZXh0Ll9jb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQncyBhIENvbnRleHQgKHJhdGhlciB0aGFuIGEgQ29uc3VtZXIpLlxuICAgICAgLy8gT3IgaXQgbWF5IGJlIGJlY2F1c2UgaXQncyBvbGRlciBSZWFjdCB3aGVyZSB0aGV5J3JlIHRoZSBzYW1lIHRoaW5nLlxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHdhcm4gaWYgd2UncmUgc3VyZSBpdCdzIGEgbmV3IFJlYWN0LlxuICAgICAgaWYgKGNvbnRleHQgIT09IGNvbnRleHQuQ29uc3VtZXIpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIpIHtcbiAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dD4gZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5fY29udGV4dDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZW5kZXIgPSBuZXdQcm9wcy5jaGlsZHJlbjtcblxuICB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgJyArIFwidGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCBcIiArICd0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgJyArICdpcyBubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgYXJvdW5kIGl0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRyZW47XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5ld0NoaWxkcmVuID0gcmVuZGVyKG5ld1ZhbHVlKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpIHtcbiAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBSZXVzZSBwcmV2aW91cyBkZXBlbmRlbmNpZXNcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCB1cGRhdGUgXCJiYXNlXCIgcmVuZGVyIHRpbWVzIGZvciBiYWlsb3V0cy5cbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICB9XG5cbiAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcyk7IC8vIENoZWNrIGlmIHRoZSBjaGlsZHJlbiBoYXZlIGFueSBwZW5kaW5nIHdvcmsuXG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSkge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBkb24ndCBoYXZlIGFueSB3b3JrIGVpdGhlci4gV2UgY2FuIHNraXAgdGhlbS5cbiAgICAvLyBUT0RPOiBPbmNlIHdlIGFkZCBiYWNrIHJlc3VtaW5nLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGNoaWxkcmVuIGFyZVxuICAgIC8vIGEgd29yay1pbi1wcm9ncmVzcyBzZXQuIElmIHNvLCB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZWlyIGVmZmVjdHMuXG4gICAge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgLy8gZmliZXJzIGFuZCBjb250aW51ZS5cblxuXG4gIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHJlbW91bnRGaWJlcihjdXJyZW50LCBvbGRXb3JrSW5Qcm9ncmVzcywgbmV3V29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciByZXR1cm5GaWJlciA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIGlmIChyZXR1cm5GaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcmV2aW91cyBzaWJsaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZXZTaWJsaW5nLnNpYmxpbmcgPSBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgICB9IC8vIERlbGV0ZSB0aGUgb2xkIGZpYmVyIGFuZCBwbGFjZSB0aGUgbmV3IG9uZS5cbiAgICAvLyBTaW5jZSB0aGUgb2xkIGZpYmVyIGlzIGRpc2Nvbm5lY3RlZCwgd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBtYW51YWxseS5cblxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjdXJyZW50XTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDsgLy8gUmVzdGFydCB3b3JrIGZyb20gdGhlIG5ldyBmaWJlci5cblxuICAgIHJldHVybiBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBCZWZvcmUgcGVyZm9ybWluZyBhbiBlYXJseSBiYWlsb3V0LCB3ZSBtdXN0IGNoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nXG4gIC8vIHVwZGF0ZXMgb3IgY29udGV4dC5cbiAgdmFyIHVwZGF0ZUxhbmVzID0gY3VycmVudC5sYW5lcztcblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZSh1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm8gcGVuZGluZyB1cGRhdGUsIGJ1dCBiZWNhdXNlIGNvbnRleHQgaXMgcHJvcGFnYXRlZCBsYXppbHksIHdlIG5lZWRcblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZpYmVyIGRvZXMgbm90IGhhdmUgYW55IHBlbmRpbmcgd29yay4gQmFpbG91dCB3aXRob3V0IGVudGVyaW5nXG4gIC8vIHRoZSBiZWdpbiBwaGFzZS4gVGhlcmUncyBzdGlsbCBzb21lIGJvb2trZWVwaW5nIHdlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZVxuICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy52YWx1ZTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAge1xuICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgdmFyIGhhc0NoaWxkV29yayA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG4gICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFdlIGtub3cgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHN1c3BlbmQgYWdhaW4gYmVjYXVzZSBpZiBpdCBoYXNcbiAgICAgICAgICAgIC8vIGJlZW4gdW5zdXNwZW5kZWQgaXQgaGFzIGNvbW1pdHRlZCBhcyBhIHJlc29sdmVkIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgICAgIC8vIElmIGl0IG5lZWRzIHRvIGJlIHJldHJpZWQsIGl0IHNob3VsZCBoYXZlIHdvcmsgc2NoZWR1bGVkIG9uIGl0LlxuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBXZSBzaG91bGQgbmV2ZXIgcmVuZGVyIHRoZSBjaGlsZHJlbiBvZiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgdW50aWwgd2VcbiAgICAgICAgICAgIC8vIHVwZ3JhZGUgaXQuIFdlIHJldHVybiBudWxsIGluc3RlYWQgb2YgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yay5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSAvLyBJZiB0aGlzIGJvdW5kYXJ5IGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHdlIG5lZWQgdG8gZGVjaWRlXG4gICAgICAgICAgLy8gd2hldGhlciB0byByZXRyeSB0aGUgcHJpbWFyeSBjaGlsZHJlbiwgb3IgdG8gc2tpcCBvdmVyIGl0IGFuZFxuICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgLy8gY2hpbGQgZnJhZ21lbnQuXG5cblxuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgcHJpbWFyeUNoaWxkTGFuZXMpKSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBoYXZlIHBlbmRpbmcgd29yay4gVXNlIHRoZSBub3JtYWwgcGF0aFxuICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAvLyBvbiBpdFxuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGRvIG5vdCBoYXZlIHBlbmRpbmcgd29yayB3aXRoIHN1ZmZpY2llbnRcbiAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbiBhbmQgd29yayBvbiB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgICAgIHJldHVybiBjaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm90ZTogV2UgY2FuIHJldHVybiBgbnVsbGAgaGVyZSBiZWNhdXNlIHdlIGFscmVhZHkgY2hlY2tlZFxuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZXJlIHdlcmUgbmVzdGVkIGNvbnRleHQgY29uc3VtZXJzLCB2aWEgdGhlIGNhbGwgdG9cbiAgICAgICAgICAgICAgLy8gYGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmtgIGFib3ZlLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgdmFyIF9oYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2FzIGluIGZhbGxiYWNrIHN0YXRlIGxhc3QgdGltZSwgYW5kIHdlIGhhdmUgYWxsIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBjaGlsZHJlbiB0aGVuIHdlJ3JlIHN0aWxsIGluIHByb2dyZXNzaXZlIGxvYWRpbmcgc3RhdGUuXG4gICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAvLyB0cmVlIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSB0YWlsLiBTbyB3ZSBuZWVkIHRvIHVzZSB0aGUgbm9ybWFsXG4gICAgICAgICAgICAvLyBwYXRoIHRvIGNvbXB1dGUgdGhlIGNvcnJlY3QgdGFpbC5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAvLyB0aGVtIGdvdCByZXRyaWVkIHNvIHRoZXknbGwgc3RpbGwgYmUgYmxvY2tlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkIGJlZm9yZSBhbmQgd2UncmUgcmVuZGVyaW5nIHRoZSBzYW1lIGNoaWxkcmVuLFxuICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgLy8gaW4gdGhlIFwidG9nZXRoZXJcIiBtb2RlLCBzbyB3ZSBjYW4gY29udGludWUgZnJvbSB0aGUgc3RhdGUgd2UgaGFkLlxuXG5cbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBSZXNldCB0byB0aGUgXCJ0b2dldGhlclwiIG1vZGUgaW4gY2FzZSB3ZSd2ZSBzdGFydGVkIGEgZGlmZmVyZW50XG4gICAgICAgICAgLy8gdXBkYXRlIGluIHRoZSBwYXN0IGJ1dCBkaWRuJ3QgY29tcGxldGUgaXQuXG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG5cbiAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgdGhlIHRyZWUgc3RpbGwgbmVlZHMgdG8gYmUgZGVmZXJyZWQuIFRoaXMgaXNcbiAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAvLyBzbyB3ZSdsbCBqdXN0IGVudGVyIHRoYXQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2UnbGwgYmFpbCBvdXRcbiAgICAgICAgLy8gYXQgdGhlIG5leHQgbGV2ZWwgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYmVjYXVzZSB0aGUgY2hpbGQgcHJvcHNcbiAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIHJlZmFjdG9yIGBiZWdpbldvcmtgIHRvIHNwbGl0IHRoZSBiYWlsb3V0XG4gICAgICAgIC8vIHBhdGggZnJvbSB0aGUgbm9ybWFsIHBhdGguIEknbSB0ZW1wdGVkIHRvIGRvIGEgbGFiZWxlZCBicmVhayBoZXJlXG4gICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lcztcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gYmVnaW5Xb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCAmJiBjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHdpbGwgcmVzdGFydCB0aGUgYmVnaW4gcGhhc2Ugd2l0aCBhIG5ldyBmaWJlci5cbiAgICAgIHJldHVybiByZW1vdW50RmliZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5rZXksIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgfHwgbnVsbCwgd29ya0luUHJvZ3Jlc3MubW9kZSwgd29ya0luUHJvZ3Jlc3MubGFuZXMpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IGhhc0NvbnRleHRDaGFuZ2VkKCkgfHwgKCAvLyBGb3JjZSBhIHJlLXJlbmRlciBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZDpcbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIC8vIElmIHByb3BzIG9yIGNvbnRleHQgY2hhbmdlZCwgbWFyayB0aGUgZmliZXIgYXMgaGF2aW5nIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgLy8gVGhpcyBtYXkgYmUgdW5zZXQgaWYgdGhlIHByb3BzIGFyZSBkZXRlcm1pbmVkIHRvIGJlIGVxdWFsIGxhdGVyIChtZW1vKS5cbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIHByb3BzIG5vciBsZWdhY3kgY29udGV4dCBjaGFuZ2VzLiBDaGVjayBpZiB0aGVyZSdzIGEgcGVuZGluZ1xuICAgICAgLy8gdXBkYXRlIG9yIGNvbnRleHQgY2hhbmdlLlxuICAgICAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgJiYgLy8gSWYgdGhpcyBpcyB0aGUgc2Vjb25kIHBhc3Mgb2YgYW4gZXJyb3Igb3Igc3VzcGVuc2UgYm91bmRhcnksIHRoZXJlXG4gICAgICAvLyBtYXkgbm90IGJlIHdvcmsgc2NoZWR1bGVkIG9uIGBjdXJyZW50YCwgc28gd2UgY2hlY2sgZm9yIHRoaXMgZmxhZy5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIE5vIHBlbmRpbmcgdXBkYXRlcyBvciBjb250ZXh0LiBCYWlsIG91dCBub3cuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbiB0aGlzIGZpYmVyLCBidXQgdGhlcmUgYXJlIG5vIG5ldyBwcm9wc1xuICAgICAgICAvLyBub3IgbGVnYWN5IGNvbnRleHQuIFNldCB0aGlzIHRvIGZhbHNlLiBJZiBhbiB1cGRhdGUgcXVldWUgb3IgY29udGV4dFxuICAgICAgICAvLyBjb25zdW1lciBwcm9kdWNlcyBhIGNoYW5nZWQgdmFsdWUsIGl0IHdpbGwgc2V0IHRoaXMgdG8gdHJ1ZS4gT3RoZXJ3aXNlLFxuICAgICAgICAvLyB0aGUgY29tcG9uZW50IHdpbGwgYXNzdW1lIHRoZSBjaGlsZHJlbiBoYXZlIG5vdCBjaGFuZ2VkIGFuZCBiYWlsIG91dC5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjaGlsZCBiZWxvbmdzIHRvIGEgbGlzdCBvZiBtdWxpcGxlIGNoaWxkcmVuIGluXG4gICAgICAvLyBpdHMgcGFyZW50LlxuICAgICAgLy9cbiAgICAgIC8vIEluIGEgdHJ1ZSBtdWx0aS10aHJlYWRlZCBpbXBsZW1lbnRhdGlvbiwgd2Ugd291bGQgcmVuZGVyIGNoaWxkcmVuIG9uXG4gICAgICAvLyBwYXJhbGxlbCB0aHJlYWRzLiBUaGlzIHdvdWxkIHJlcHJlc2VudCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IHJlbmRlclxuICAgICAgLy8gdGhyZWFkIGZvciB0aGlzIHN1YnRyZWUuXG4gICAgICAvL1xuICAgICAgLy8gV2Ugb25seSB1c2UgdGhpcyBmb3IgaWQgZ2VuZXJhdGlvbiBkdXJpbmcgaHlkcmF0aW9uLCB3aGljaCBpcyB3aHkgdGhlXG4gICAgICAvLyBsb2dpYyBpcyBsb2NhdGVkIGluIHRoaXMgc3BlY2lhbCBicmFuY2guXG4gICAgICB2YXIgc2xvdEluZGV4ID0gd29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IGdldEZvcmtzQXRMZXZlbCgpO1xuICAgICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgICB9XG4gIH0gLy8gQmVmb3JlIGVudGVyaW5nIHRoZSBiZWdpbiBwaGFzZSwgY2xlYXIgcGVuZGluZyB1cGRhdGUgcHJpb3JpdHkuXG4gIC8vIFRPRE86IFRoaXMgYXNzdW1lcyB0aGF0IHdlJ3JlIGFib3V0IHRvIGV2YWx1YXRlIHRoZSBjb21wb25lbnQgYW5kIHByb2Nlc3NcbiAgLy8gdGhlIHVwZGF0ZSBxdWV1ZS4gSG93ZXZlciwgdGhlcmUncyBhbiBleGNlcHRpb246IFNpbXBsZU1lbW9Db21wb25lbnRcbiAgLy8gc29tZXRpbWVzIGJhaWxzIG91dCBsYXRlciBpbiB0aGUgYmVnaW4gcGhhc2UuIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkXG4gIC8vIG1vdmUgdGhpcyBhc3NpZ25tZW50IG91dCBvZiB0aGUgY29tbW9uIHBhdGggYW5kIGludG8gZWFjaCBicmFuY2guXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudExhenlDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gQ29tcG9uZW50ID8gdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHVucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50ID8gX3VucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCBfcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IHR5cGUgPyBfdW5yZXNvbHZlZFByb3BzMiA6IHJlc29sdmVEZWZhdWx0UHJvcHModHlwZSwgX3VucmVzb2x2ZWRQcm9wczIpO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGb3J3YXJkUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBfcmVzb2x2ZWRQcm9wczIsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTW9kZTpcbiAgICAgIHJldHVybiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX3R5cGUyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBSZXNvbHZlIG91dGVyIHByb3BzIGZpcnN0LCB0aGVuIHJlc29sdmUgaW5uZXIgcHJvcHMuXG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLCBfdW5yZXNvbHZlZFByb3BzMyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gX3R5cGUyLnByb3BUeXBlcztcblxuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBfcmVzb2x2ZWRQcm9wczMsIC8vIFJlc29sdmVkIGZvciBvdXRlciBvbmx5XG4gICAgICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKF90eXBlMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLnR5cGUsIF9yZXNvbHZlZFByb3BzMyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfdHlwZTIsIF9yZXNvbHZlZFByb3BzMywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9Db21wb25lbnQyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczQgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzNCA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudDIsIF91bnJlc29sdmVkUHJvcHM0KTtcblxuICAgICAgICByZXR1cm4gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9Db21wb25lbnQyLCBfcmVzb2x2ZWRQcm9wczQsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBcIiArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gVGFnIHRoZSBmaWJlciB3aXRoIGFuIHVwZGF0ZSBlZmZlY3QuIFRoaXMgdHVybnMgYSBQbGFjZW1lbnQgaW50b1xuICAvLyBhIFBsYWNlbWVudEFuZFVwZGF0ZS5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpIHtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gIH1cbn1cblxudmFyIGFwcGVuZEFsbENoaWxkcmVuO1xudmFyIHVwZGF0ZUhvc3RDb250YWluZXI7XG52YXIgdXBkYXRlSG9zdENvbXBvbmVudCQxO1xudmFyIHVwZGF0ZUhvc3RUZXh0JDE7XG5cbntcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgLy8gSW4gbXV0YXRpb24gbW9kZSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhIGJhaWxvdXQgYmVjYXVzZVxuICAgICAgLy8gd2Ugd29uJ3QgdG91Y2ggdGhpcyBub2RlIGV2ZW4gaWYgY2hpbGRyZW4gY2hhbmdlZC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGdldCB1cGRhdGVkIGJlY2F1c2Ugb25lIG9mIG91ciBjaGlsZHJlbiB1cGRhdGVkLCB3ZSBkb24ndFxuICAgIC8vIGhhdmUgbmV3UHJvcHMgc28gd2UnbGwgaGF2ZSB0byByZXVzZSB0aGVtLlxuICAgIC8vIFRPRE86IFNwbGl0IHRoZSB1cGRhdGUgQVBJIGFzIHNlcGFyYXRlIGZvciB0aGUgcHJvcHMgdnMuIGNoaWxkcmVuLlxuICAgIC8vIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIGNoaWxkcmVuIHdlcmVuJ3Qgc3BlY2lhbCBjYXNlZCBhdCBhbGwgdGhvLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG5cbiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IHByZXBhcmVVcGRhdGUoaW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG5cbiAgICBpZiAodXBkYXRlUGF5bG9hZCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgICAvLyBJZiB0aGUgdGV4dCBkaWZmZXJzLCBtYXJrIGl0IGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGluIGRvbmUgaW4gY29tbWl0V29yay5cbiAgICBpZiAob2xkVGV4dCAhPT0gbmV3VGV4dCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjaykge1xuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIC8vIElmIHdlJ3JlIGh5ZHJhdGluZywgd2Ugc2hvdWxkIGNvbnN1bWUgYXMgbWFueSBpdGVtcyBhcyB3ZSBjYW5cbiAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhbnkgYmVoaW5kLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAocmVuZGVyU3RhdGUudGFpbE1vZGUpIHtcbiAgICBjYXNlICdoaWRkZW4nOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIHRhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIGxhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHRhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGFzdFRhaWxOb2RlID0gdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFpbE5vZGUgPSB0YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKGxhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdjb2xsYXBzZWQnOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIF90YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBfbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoX3RhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKF90YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIF9sYXN0VGFpbE5vZGUgPSBfdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RhaWxOb2RlID0gX3RhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAoX2xhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgaWYgKCFoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2sgJiYgcmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gV2Ugc3VzcGVuZGVkIGR1cmluZyB0aGUgaGVhZC4gV2Ugd2FudCB0byBzaG93IGF0IGxlYXN0IG9uZVxuICAgICAgICAgICAgLy8gcm93IGF0IHRoZSB0YWlsLiBTbyB3ZSdsbCBrZWVwIG9uIGFuZCBjdXQgb2ZmIHRoZSByZXN0LlxuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIF9sYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBidWJibGVQcm9wZXJ0aWVzKGNvbXBsZXRlZFdvcmspIHtcbiAgdmFyIGRpZEJhaWxvdXQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZSAhPT0gbnVsbCAmJiBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZS5jaGlsZCA9PT0gY29tcGxldGVkV29yay5jaGlsZDtcbiAgdmFyIG5ld0NoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgc3VidHJlZUZsYWdzID0gTm9GbGFncztcblxuICBpZiAoIWRpZEJhaWxvdXQpIHtcbiAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXRcbiAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb247XG4gICAgICB2YXIgdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHZhciBjaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKGNoaWxkLmxhbmVzLCBjaGlsZC5jaGlsZExhbmVzKSk7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBjaGlsZC5zdWJ0cmVlRmxhZ3M7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBjaGlsZC5mbGFnczsgLy8gV2hlbiBhIGZpYmVyIGlzIGNsb25lZCwgaXRzIGFjdHVhbER1cmF0aW9uIGlzIHJlc2V0IHRvIDAuIFRoaXMgdmFsdWUgd2lsbFxuICAgICAgICAvLyBvbmx5IGJlIHVwZGF0ZWQgaWYgd29yayBpcyBkb25lIG9uIHRoZSBmaWJlciAoaS5lLiBpdCBkb2Vzbid0IGJhaWxvdXQpLlxuICAgICAgICAvLyBXaGVuIHdvcmsgaXMgZG9uZSwgaXQgc2hvdWxkIGJ1YmJsZSB0byB0aGUgcGFyZW50J3MgYWN0dWFsRHVyYXRpb24uIElmXG4gICAgICAgIC8vIHRoZSBmaWJlciBoYXMgbm90IGJlZW4gY2xvbmVkIHRob3VnaCwgKG1lYW5pbmcgbm8gd29yayB3YXMgZG9uZSksIHRoZW5cbiAgICAgICAgLy8gdGhpcyB2YWx1ZSB3aWxsIHJlZmxlY3QgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IHdvcmtpbmcgb24gYSBwcmV2aW91c1xuICAgICAgICAvLyByZW5kZXIuIEluIHRoYXQgY2FzZSBpdCBzaG91bGQgbm90IGJ1YmJsZS4gV2UgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd2FzXG4gICAgICAgIC8vIGNsb25lZCBieSBjb21wYXJpbmcgdGhlIGNoaWxkIHBvaW50ZXIuXG5cbiAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgIHRyZWVCYXNlRHVyYXRpb24gKz0gY2hpbGQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSB0cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZC5sYW5lcywgX2NoaWxkLmNoaWxkTGFuZXMpKTtcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5zdWJ0cmVlRmxhZ3M7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQuZmxhZ3M7IC8vIFVwZGF0ZSB0aGUgcmV0dXJuIHBvaW50ZXIgc28gdGhlIHRyZWUgaXMgY29uc2lzdGVudC4gVGhpcyBpcyBhIGNvZGVcbiAgICAgICAgLy8gc21lbGwgYmVjYXVzZSBpdCBhc3N1bWVzIHRoZSBjb21taXQgcGhhc2UgaXMgbmV2ZXIgY29uY3VycmVudCB3aXRoXG4gICAgICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuIFdpbGwgYWRkcmVzcyBkdXJpbmcgcmVmYWN0b3IgdG8gYWx0ZXJuYXRlIG1vZGVsLlxuXG4gICAgICAgIF9jaGlsZC5yZXR1cm4gPSBjb21wbGV0ZWRXb3JrO1xuICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLnN1YnRyZWVGbGFncyB8PSBzdWJ0cmVlRmxhZ3M7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG4gICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIHByb2ZpbGluZyBtb2RlLCByZXNldENoaWxkRXhwaXJhdGlvblRpbWUgaXMgYWxzbyB1c2VkIHRvIHJlc2V0XG4gICAgICAvLyBwcm9maWxlciBkdXJhdGlvbnMuXG4gICAgICB2YXIgX3RyZWVCYXNlRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB2YXIgX2NoaWxkMiA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQyICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkMi5sYW5lcywgX2NoaWxkMi5jaGlsZExhbmVzKSk7IC8vIFwiU3RhdGljXCIgZmxhZ3Mgc2hhcmUgdGhlIGxpZmV0aW1lIG9mIHRoZSBmaWJlci9ob29rIHRoZXkgYmVsb25nIHRvLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgYnViYmxlIHRob3NlIHVwIGV2ZW4gZHVyaW5nIGEgYmFpbG91dC4gQWxsIHRoZSBvdGhlclxuICAgICAgICAvLyBmbGFncyBoYXZlIGEgbGlmZXRpbWUgb25seSBvZiBhIHNpbmdsZSByZW5kZXIgKyBjb21taXQsIHNvIHdlIHNob3VsZFxuICAgICAgICAvLyBpZ25vcmUgdGhlbS5cblxuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMi5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMi5mbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIF90cmVlQmFzZUR1cmF0aW9uICs9IF9jaGlsZDIudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgX2NoaWxkMiA9IF9jaGlsZDIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gX3RyZWVCYXNlRHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY2hpbGQzID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZDMgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQzLmxhbmVzLCBfY2hpbGQzLmNoaWxkTGFuZXMpKTsgLy8gXCJTdGF0aWNcIiBmbGFncyBzaGFyZSB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpYmVyL2hvb2sgdGhleSBiZWxvbmcgdG8sXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyXG4gICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGlnbm9yZSB0aGVtLlxuXG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQzLnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQzLmZsYWdzICYgU3RhdGljTWFzazsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZVxuICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGhcbiAgICAgICAgLy8gdGhlIHJlbmRlciBwaGFzZS4gV2lsbCBhZGRyZXNzIGR1cmluZyByZWZhY3RvciB0byBhbHRlcm5hdGUgbW9kZWwuXG5cbiAgICAgICAgX2NoaWxkMy5yZXR1cm4gPSBjb21wbGV0ZWRXb3JrO1xuICAgICAgICBfY2hpbGQzID0gX2NoaWxkMy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgfVxuXG4gIGNvbXBsZXRlZFdvcmsuY2hpbGRMYW5lcyA9IG5ld0NoaWxkTGFuZXM7XG4gIHJldHVybiBkaWRCYWlsb3V0O1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0U3RhdGUpIHtcbiAgaWYgKGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSAmJiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2Rlcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyIHwgSW5jb21wbGV0ZSB8IFNob3VsZENhcHR1cmU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHdhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwgJiYgbmV4dFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAvLyBXZSBtaWdodCBiZSBpbnNpZGUgYSBoeWRyYXRpb24gc3RhdGUgdGhlIGZpcnN0IHRpbWUgd2UncmUgcGlja2luZyB1cCB0aGlzXG4gICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIGFuZCBhbHNvIGFmdGVyIHdlJ3ZlIHJlZW50ZXJlZCBpdCBmb3IgZnVydGhlciBoeWRyYXRpb24uXG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGlmICghd2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50IHdhcyBjb21wbGV0ZWQgd2l0aG91dCBhIGh5ZHJhdGVkIG5vZGUuICcgKyAnVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcHJlcGFyZVRvSHlkcmF0ZUhvc3RTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgdmFyIGlzVGltZWRPdXRTdXNwZW5zZSA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChpc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgbWlnaHQgaGF2ZSByZWVudGVyZWQgdGhpcyBib3VuZGFyeSB0byBoeWRyYXRlIGl0LiBJZiBzbywgd2UgbmVlZCB0byByZXNldCB0aGUgaHlkcmF0aW9uXG4gICAgICAvLyBzdGF0ZSBzaW5jZSB3ZSdyZSBub3cgZXhpdGluZyBvdXQgb2YgaXQuIHBvcEh5ZHJhdGlvblN0YXRlIGRvZXNuJ3QgZG8gdGhhdCBmb3IgdXMuXG4gICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGJvdW5kYXJ5IGRpZCBub3Qgc3VzcGVuZCBzbyBpdCdzIG5vdyBoeWRyYXRlZCBhbmQgdW5zdXNwZW5kZWQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgfSAvLyBJZiBub3RoaW5nIHN1c3BlbmRlZCwgd2UgbmVlZCB0byBzY2hlZHVsZSBhbiBlZmZlY3QgdG8gbWFyayB0aGlzIGJvdW5kYXJ5XG4gICAgICAvLyBhcyBoYXZpbmcgaHlkcmF0ZWQgc28gZXZlbnRzIGtub3cgdGhhdCB0aGV5J3JlIGZyZWUgdG8gYmUgaW52b2tlZC5cbiAgICAgIC8vIEl0J3MgYWxzbyBhIHNpZ25hbCB0byByZXBsYXkgZXZlbnRzIGFuZCB0aGUgc3VzcGVuc2UgY2FsbGJhY2suXG4gICAgICAvLyBJZiBzb21ldGhpbmcgc3VzcGVuZGVkLCBzY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIHJldHJ5IGxpc3RlbmVycy5cbiAgICAgIC8vIFNvIHdlIG1pZ2h0IGFzIHdlbGwgYWx3YXlzIG1hcmsgdGhpcy5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAge1xuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIHZhciBfaXNUaW1lZE91dFN1c3BlbnNlID0gbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKF9pc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAoX3ByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gX3ByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0aGlzIHRyZWUuIElmIHRoaXMgd2FzIGEgZm9yY2VkIGNsaWVudCByZW5kZXIsXG4gICAgLy8gdGhlcmUgbWF5IGhhdmUgYmVlbiByZWNvdmVyYWJsZSBlcnJvcnMgZHVyaW5nIGZpcnN0IGh5ZHJhdGlvblxuICAgIC8vIGF0dGVtcHQuIElmIHNvLCBhZGQgdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGVcbiAgICAvLyBjb21taXQgcGhhc2UuXG4gICAgdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKTsgLy8gRmFsbCB0aHJvdWdoIHRvIG5vcm1hbCBTdXNwZW5zZSBwYXRoXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG5cbiAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICBjYXNlIE1vZGU6XG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciBmaWJlclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcblxuICAgICAgICBpZiAoZmliZXJSb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgZmliZXJSb290LmNvbnRleHQgPSBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQ7XG4gICAgICAgICAgZmliZXJSb290LnBlbmRpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQuY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgcG9wIHNvIHRoYXQgd2UgY2FuIGRlbGV0ZSBhbnkgcmVtYWluaW5nIGNoaWxkcmVuXG4gICAgICAgICAgLy8gdGhhdCB3ZXJlbid0IGh5ZHJhdGVkLlxuICAgICAgICAgIHZhciB3YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmICh3YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHRoZW4gd2UnbGwgbmVlZCB0byBzY2hlZHVsZSBhbiB1cGRhdGUgZm9yXG4gICAgICAgICAgICAvLyB0aGUgY29tbWl0IHNpZGUtZWZmZWN0cyBvbiB0aGUgcm9vdC5cbiAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICAgIGlmICggLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGNsaWVudCByb290XG4gICAgICAgICAgICAgICFwcmV2U3RhdGUuaXNEZWh5ZHJhdGVkIHx8IC8vIENoZWNrIGlmIHdlIHJldmVydGVkIHRvIGNsaWVudCByZW5kZXJpbmcgKGUuZy4gZHVlIHRvIGFuIGVycm9yKVxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gY2xlYXIgdGhpcyBjb250YWluZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZVxuICAgICAgICAgICAgICAgIC8vIG5leHQgY29tbWl0LiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgUmVhY3QgcmVuZGVyaW5nIGludG8gYVxuICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lciB3aXRoIHByZXZpb3VzIGNoaWxkcmVuLiBJdCdzIGFsc28gc2FmZSB0byBkbyBmb3JcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIHRvbywgYmVjYXVzZSBjdXJyZW50LmNoaWxkIHdvdWxkIG9ubHkgYmUgbnVsbCBpZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyByZW5kZXIgd2FzIG51bGwgKHNvIHRoZSBjb250YWluZXIgd291bGQgYWxyZWFkeVxuICAgICAgICAgICAgICAgIC8vIGJlIGVtcHR5KS5cbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDsgLy8gSWYgdGhpcyB3YXMgYSBmb3JjZWQgY2xpZW50IHJlbmRlciwgdGhlcmUgbWF5IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uIGF0dGVtcHQuIElmIHNvLCBhZGRcbiAgICAgICAgICAgICAgICAvLyB0aGVtIHRvIGEgcXVldWUgc28gd2UgY2FuIGxvZyB0aGVtIGluIHRoZSBjb21taXQgcGhhc2UuXG5cbiAgICAgICAgICAgICAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpO1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB1cGRhdGVIb3N0Q29tcG9uZW50JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnQucmVmICE9PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghbmV3UHJvcHMpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cblxuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTsgLy8gVE9ETzogTW92ZSBjcmVhdGVJbnN0YW5jZSB0byBiZWdpbldvcmsgYW5kIGtlZXAgaXQgb24gYSBjb250ZXh0XG4gICAgICAgICAgLy8gXCJzdGFja1wiIGFzIHRoZSBwYXJlbnQuIFRoZW4gYXBwZW5kIGNoaWxkcmVuIGFzIHdlIGdvIGluIGJlZ2luV29ya1xuICAgICAgICAgIC8vIG9yIGNvbXBsZXRlV29yayBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSB3YW50IHRvIGFkZCB0aGVtIHRvcC0+ZG93biBvclxuICAgICAgICAgIC8vIGJvdHRvbS0+dXAuIFRvcC0+ZG93biBpcyBmYXN0ZXIgaW4gSUUxMS5cblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAoX3dhc0h5ZHJhdGVkKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYW5kIGNyZWF0ZUluc3RhbmNlIHN0ZXAgaW50byB0aGUgYmVnaW5QaGFzZVxuICAgICAgICAgICAgLy8gdG8gY29uc29saWRhdGUuXG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpKSB7XG4gICAgICAgICAgICAgIC8vIElmIGNoYW5nZXMgdG8gdGhlIGh5ZHJhdGVkIG5vZGUgbmVlZCB0byBiZSBhcHBsaWVkIGF0IHRoZVxuICAgICAgICAgICAgICAvLyBjb21taXQtcGhhc2Ugd2UgbWFyayB0aGlzIGFzIHN1Y2guXG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSh0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIGFwcGVuZEFsbENoaWxkcmVuKGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlOyAvLyBDZXJ0YWluIHJlbmRlcmVycyByZXF1aXJlIGNvbW1pdC10aW1lIGVmZmVjdHMgZm9yIGluaXRpYWwgbW91bnQuXG4gICAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIHN1cHBvcnRzIGF1dG8tZm9jdXMgZm9yIGNlcnRhaW4gZWxlbWVudHMpLlxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHN1Y2ggcmVuZGVyZXJzIGdldCBzY2hlZHVsZWQgZm9yIGxhdGVyIHdvcmsuXG5cbiAgICAgICAgICAgIGlmIChmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbihpbnN0YW5jZSwgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSByZWYgb24gYSBob3N0IG5vZGUgd2UgbmVlZCB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAgICAgICBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gbmV3UHJvcHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuXG4gICAgICAgICAgdXBkYXRlSG9zdFRleHQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTtcblxuICAgICAgICAgIHZhciBfY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTtcblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQyID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZDIpIHtcbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGNyZWF0ZVRleHRJbnN0YW5jZShuZXdUZXh0LCBfcm9vdENvbnRhaW5lckluc3RhbmNlLCBfY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7IC8vIFNwZWNpYWwgcGF0aCBmb3IgZGVoeWRyYXRlZCBib3VuZGFyaWVzLiBXZSBtYXkgZXZlbnR1YWxseSBtb3ZlIHRoaXNcbiAgICAgICAgLy8gdG8gaXRzIG93biBmaWJlciB0eXBlIHNvIHRoYXQgd2UgY2FuIGFkZCBvdGhlciBraW5kcyBvZiBoeWRyYXRpb25cbiAgICAgICAgLy8gYm91bmRhcmllcyB0aGF0IGFyZW4ndCBhc3NvY2lhdGVkIHdpdGggYSBTdXNwZW5zZSB0cmVlLiBJbiBhbnRpY2lwYXRpb25cbiAgICAgICAgLy8gb2Ygc3VjaCBhIHJlZmFjdG9yLCBhbGwgdGhlIGh5ZHJhdGlvbiBsb2dpYyBpcyBjb250YWluZWQgaW5cbiAgICAgICAgLy8gdGhpcyBicmFuY2guXG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGZhbGx0aHJvdWdoVG9Ob3JtYWxTdXNwZW5zZVBhdGggPSBjb21wbGV0ZURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0U3RhdGUpO1xuXG4gICAgICAgICAgaWYgKCFmYWxsdGhyb3VnaFRvTm9ybWFsU3VzcGVuc2VQYXRoKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZS4gVGhlcmUgd2VyZSByZW1haW5pbmcgdW5oeWRyYXRlZCBub2Rlcy4gV2UgdHJlYXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBhcyBhIG1pc21hdGNoLiBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRGlkIG5vdCBmaW5pc2ggaHlkcmF0aW5nLCBlaXRoZXIgYmVjYXVzZSB0aGlzIGlzIHRoZSBpbml0aWFsXG4gICAgICAgICAgICAgIC8vIHJlbmRlciBvciBiZWNhdXNlIHNvbWV0aGluZyBzdXNwZW5kZWQuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gQ29udGludWUgd2l0aCB0aGUgbm9ybWFsIFN1c3BlbnNlIHBhdGguXG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQuIFJlLXJlbmRlciB3aXRoIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzOyAvLyBEbyBub3QgcmVzZXQgdGhlIGVmZmVjdCBsaXN0LlxuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5leHREaWRUaW1lb3V0ID0gbmV4dFN0YXRlICE9PSBudWxsO1xuICAgICAgICB2YXIgcHJldkRpZFRpbWVvdXQgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgLy8gYSBwYXNzaXZlIGVmZmVjdCwgd2hpY2ggaXMgd2hlbiB3ZSBwcm9jZXNzIHRoZSB0cmFuc2l0aW9uc1xuXG5cbiAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0ICE9PSBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgIC8vIGFuIGVmZmVjdCB0byB0b2dnbGUgdGhlIHN1YnRyZWUncyB2aXNpYmlsaXR5LiBXaGVuIHdlIHN3aXRjaCBmcm9tXG4gICAgICAgICAgLy8gZmFsbGJhY2sgLT4gcHJpbWFyeSwgdGhlIGlubmVyIE9mZnNjcmVlbiBmaWJlciBzY2hlZHVsZXMgdGhpcyBlZmZlY3RcbiAgICAgICAgICAvLyBhcyBwYXJ0IG9mIGl0cyBub3JtYWwgY29tcGxldGUgcGhhc2UuIEJ1dCB3aGVuIHdlIHN3aXRjaCBmcm9tXG4gICAgICAgICAgLy8gcHJpbWFyeSAtPiBmYWxsYmFjaywgdGhlIGlubmVyIE9mZnNjcmVlbiBmaWJlciBkb2VzIG5vdCBoYXZlIGEgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZS4gU28gd2UgbmVlZCB0byBzY2hlZHVsZSBpdHMgZWZmZWN0IGhlcmUuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXZSBhbHNvIHVzZSB0aGlzIGZsYWcgdG8gY29ubmVjdC9kaXNjb25uZWN0IHRoZSBlZmZlY3RzLCBidXQgdGhlIHNhbWVcbiAgICAgICAgICAvLyBsb2dpYyBhcHBsaWVzOiB3aGVuIHJlLWNvbm5lY3RpbmcsIHRoZSBPZmZzY3JlZW4gZmliZXIncyBjb21wbGV0ZVxuICAgICAgICAgIC8vIHBoYXNlIHdpbGwgaGFuZGxlIHNjaGVkdWxpbmcgdGhlIGVmZmVjdC4gSXQncyBvbmx5IHdoZW4gdGhlIGZhbGxiYWNrXG4gICAgICAgICAgLy8gaXMgYWN0aXZlIHRoYXQgd2UgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLlxuXG5cbiAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIHZhciBfb2Zmc2NyZWVuRmliZXIyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICBfb2Zmc2NyZWVuRmliZXIyLmZsYWdzIHw9IFZpc2liaWxpdHk7IC8vIFRPRE86IFRoaXMgd2lsbCBzdGlsbCBzdXNwZW5kIGEgc3luY2hyb25vdXMgdHJlZSBpZiBhbnl0aGluZ1xuICAgICAgICAgICAgLy8gaW4gdGhlIGNvbmN1cnJlbnQgdHJlZSBhbHJlYWR5IHN1c3BlbmRlZCBkdXJpbmcgdGhpcyByZW5kZXIuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEga25vd24gYnVnLlxuXG4gICAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYmFjayB0byB0aHJvd0V4Y2VwdGlvbiBiZWNhdXNlIHRoaXMgaXMgdG9vIGxhdGVcbiAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxhcmdlIHRyZWUgd2hpY2ggaXMgY29tbW9uIGZvciBpbml0aWFsIGxvYWRzLiBXZVxuICAgICAgICAgICAgICAvLyBkb24ndCBrbm93IGlmIHdlIHNob3VsZCByZXN0YXJ0IGEgcmVuZGVyIG9yIG5vdCB1bnRpbCB3ZSBnZXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBtYXJrZXIsIGFuZCB0aGlzIGlzIHRvbyBsYXRlLlxuICAgICAgICAgICAgICAvLyBJZiB0aGlzIHJlbmRlciBhbHJlYWR5IGhhZCBhIHBpbmcgb3IgbG93ZXIgcHJpIHVwZGF0ZXMsXG4gICAgICAgICAgICAgIC8vIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGtub3cgd2UncmUgZ29pbmcgdG8gc3VzcGVuZCB3ZVxuICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgYWJsZSB0byBpbW1lZGlhdGVseSByZXN0YXJ0IGZyb20gd2l0aGluIHRocm93RXhjZXB0aW9uLlxuICAgICAgICAgICAgICB2YXIgaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0ID0gY3VycmVudCA9PT0gbnVsbCAmJiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayAhPT0gdHJ1ZSB8fCAhZW5hYmxlU3VzcGVuc2VBdm9pZFRoaXNGYWxsYmFjayk7XG5cbiAgICAgICAgICAgICAgaWYgKGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCB8fCBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgaW4gYW4gaW52aXNpYmxlIHRyZWUgb3IgYSBuZXcgcmVuZGVyLCB0aGVuIHNob3dpbmdcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGJvdW5kYXJ5IGlzIG9rLlxuICAgICAgICAgICAgICAgIHJlbmRlckRpZFN1c3BlbmQoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gaGlkZSBjb250ZW50IHNvIHdlIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIHN1c3BlbmQgZm9yIGxvbmdlciBpZiBwb3NzaWJsZS5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd2FrZWFibGVzID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHdha2VhYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggYSByZXRyeSBsaXN0ZW5lciB0byB0aGUgcHJvbWlzZS5cbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2VcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCkge1xuICAgICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHByZXBhcmVQb3J0YWxNb3VudCh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIC8vIFBvcCBwcm92aWRlciBmaWJlclxuICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBTYW1lIGFzIGNsYXNzIGNvbXBvbmVudCBjYXNlLiBJIHB1dCBpdCBkb3duIGhlcmUgc28gdGhhdCB0aGUgdGFncyBhcmVcbiAgICAgICAgLy8gc2VxdWVudGlhbCB0byBlbnN1cmUgdGhpcyBzd2l0Y2ggaXMgY29tcGlsZWQgdG8gYSBqdW1wIHRhYmxlLlxuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKF9Db21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIGluIHRoZSBkZWZhdWx0LCBcImluZGVwZW5kZW50XCIgbW9kZS5cbiAgICAgICAgICAvLyBXZSBkb24ndCBkbyBhbnl0aGluZyBpbiB0aGlzIG1vZGUuXG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlkU3VzcGVuZEFscmVhZHkgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcbiAgICAgICAgdmFyIHJlbmRlcmVkVGFpbCA9IHJlbmRlclN0YXRlLnJlbmRlcmluZztcblxuICAgICAgICBpZiAocmVuZGVyZWRUYWlsID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UganVzdCByZW5kZXJlZCB0aGUgaGVhZC5cbiAgICAgICAgICBpZiAoIWRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBwYXNzLiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgYW55dGhpbmcgaXMgc3RpbGxcbiAgICAgICAgICAgIC8vIHN1c3BlbmRlZCBpbiB0aGUgcmVuZGVyZWQgc2V0LlxuICAgICAgICAgICAgLy8gSWYgbmV3IGNvbnRlbnQgdW5zdXNwZW5kZWQsIGJ1dCB0aGVyZSdzIHN0aWxsIHNvbWUgY29udGVudCB0aGF0XG4gICAgICAgICAgICAvLyBkaWRuJ3QuIFRoZW4gd2UgbmVlZCB0byBkbyBhIHNlY29uZCBwYXNzIHRoYXQgZm9yY2VzIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAgIC8vIHRvIGtlZXAgc2hvd2luZyB0aGVpciBmYWxsYmFja3MuXG4gICAgICAgICAgICAvLyBXZSBtaWdodCBiZSBzdXNwZW5kZWQgaWYgc29tZXRoaW5nIGluIHRoaXMgcmVuZGVyIHBhc3Mgc3VzcGVuZGVkLCBvclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIGluIHRoZSBwcmV2aW91cyBjb21taXR0ZWQgcGFzcyBzdXNwZW5kZWQuIE90aGVyd2lzZSxcbiAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gY2hhbmNlIHNvIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgY2FsbCB0b1xuICAgICAgICAgICAgLy8gZmluZEZpcnN0U3VzcGVuZGVkLlxuICAgICAgICAgICAgdmFyIGNhbm5vdEJlU3VzcGVuZGVkID0gcmVuZGVySGFzTm90U3VzcGVuZGVkWWV0KCkgJiYgKGN1cnJlbnQgPT09IG51bGwgfHwgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncyk7XG5cbiAgICAgICAgICAgIGlmICghY2Fubm90QmVTdXNwZW5kZWQpIHtcbiAgICAgICAgICAgICAgdmFyIHJvdyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICAgIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJvdyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIElmIHRoaXMgaXMgYSBuZXdseSBzdXNwZW5kZWQgdHJlZSwgaXQgbWlnaHQgbm90IGdldCBjb21taXR0ZWQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIHNlY29uZCBwYXNzLiBJbiB0aGF0IGNhc2Ugbm90aGluZyB3aWxsIHN1YnNjcmliZSB0b1xuICAgICAgICAgICAgICAgICAgLy8gaXRzIHRoZW5hYmxlcy4gSW5zdGVhZCwgd2UnbGwgdHJhbnNmZXIgaXRzIHRoZW5hYmxlcyB0byB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbnNlTGlzdCBzbyB0aGF0IGl0IGNhbiByZXRyeSBpZiB0aGV5IHJlc29sdmUuXG4gICAgICAgICAgICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBtdWx0aXBsZSBvZiB0aGVzZSBpbiB0aGUgbGlzdCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIHdhaXQgZm9yIGFsbCBvZiB0aGVtIGFueXdheSwgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyXG4gICAgICAgICAgICAgICAgICAvLyB3aGljaCBvbmVzIGdldHMgdG8gcGluZy4gSW4gdGhlb3J5IHdlIGNvdWxkIGdldCBjbGV2ZXIgYW5kIGtlZXBcbiAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIG9mIGhvdyBtYW55IGRlcGVuZGVuY2llcyByZW1haW4gYnV0IGl0IGdldHMgdHJpY2t5IGJlY2F1c2VcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtZWFudGltZSwgd2UgY2FuIGFkZC9yZW1vdmUvY2hhbmdlIGl0ZW1zIGFuZCBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAgICAgICAvLyBXZSBtaWdodCBiYWlsIG91dCBvZiB0aGUgbG9vcCBiZWZvcmUgZmluZGluZyBhbnkgYnV0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoYXQgbWVhbnMgdGhhdCB0aGUgb3RoZXIgYm91bmRhcmllcyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyB3ZSBkaWQgZmluZCBhbHJlYWR5IGhhcyB0aGVpciBsaXN0ZW5lcnMgYXR0YWNoZWQuXG5cbiAgICAgICAgICAgICAgICAgIHZhciBuZXdUaGVuYWJsZXMgPSBzdXNwZW5kZWQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChuZXdUaGVuYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBuZXdUaGVuYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgICAgIH0gLy8gUmVyZW5kZXIgdGhlIHdob2xlIGxpc3QsIGJ1dCB0aGlzIHRpbWUsIHdlJ2xsIGZvcmNlIGZhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgZmxhZ3MgYmVmb3JlIGRvaW5nIHRoZSBzZWNvbmQgcGFzcyBzaW5jZSB0aGF0J3Mgbm93IGludmFsaWQuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgY2hpbGQgZmliZXJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLlxuXG5cbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgICAgICAgICAgICAgICByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7IC8vIFNldCB1cCB0aGUgU3VzcGVuc2UgQ29udGV4dCB0byBmb3JjZSBzdXNwZW5zZSBhbmQgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgIC8vIHJlcmVuZGVyIHRoZSBjaGlsZHJlbi5cblxuICAgICAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjaykpOyAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByb3cgPSByb3cuc2libGluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCAmJiBub3coKSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIGFscmVhZHkgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYnV0IHdlIHN0aWxsIGhhdmUgcm93c1xuICAgICAgICAgICAgICAvLyBsZWZ0IGluIHRoZSB0YWlsLiBXZSdsbCBqdXN0IGdpdmUgdXAgZnVydGhlciBhdHRlbXB0cyB0byByZW5kZXJcbiAgICAgICAgICAgICAgLy8gdGhlIG1haW4gY29udGVudCBhbmQgb25seSByZW5kZXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICB9IC8vIE5leHQgd2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZSB0YWlsLlxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSByZW5kZXJlZCByb3cgdG8gdGhlIGNoaWxkIGxpc3QuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgdmFyIF9zdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocmVuZGVyZWRUYWlsKTtcblxuICAgICAgICAgICAgaWYgKF9zdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlOyAvLyBFbnN1cmUgd2UgdHJhbnNmZXIgdGhlIHVwZGF0ZSBxdWV1ZSB0byB0aGUgcGFyZW50IHNvIHRoYXQgaXQgZG9lc24ndFxuICAgICAgICAgICAgICAvLyBnZXQgbG9zdCBpZiB0aGlzIHJvdyBlbmRzIHVwIGRyb3BwZWQgZHVyaW5nIGEgc2Vjb25kIHBhc3MuXG5cbiAgICAgICAgICAgICAgdmFyIF9uZXdUaGVuYWJsZXMgPSBfc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgIGlmIChfbmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBfbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgdHJ1ZSk7IC8vIFRoaXMgbWlnaHQgaGF2ZSBiZWVuIG1vZGlmaWVkLlxuXG4gICAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsID09PSBudWxsICYmIHJlbmRlclN0YXRlLnRhaWxNb2RlID09PSAnaGlkZGVuJyAmJiAhcmVuZGVyZWRUYWlsLmFsdGVybmF0ZSAmJiAhZ2V0SXNIeWRyYXRpbmcoKSAvLyBXZSBkb24ndCBjdXQgaXQgaWYgd2UncmUgaHlkcmF0aW5nLlxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUuXG4gICAgICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIC8vIFRoZSB0aW1lIGl0IHRvb2sgdG8gcmVuZGVyIGxhc3Qgcm93IGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmVtYWluaW5nXG4gICAgICAgICAgICAvLyB0aW1lIHdlIGhhdmUgdG8gcmVuZGVyLiBTbyByZW5kZXJpbmcgb25lIG1vcmUgcm93IHdvdWxkIGxpa2VseVxuICAgICAgICAgICAgLy8gZXhjZWVkIGl0LlxuICAgICAgICAgICAgbm93KCkgKiAyIC0gcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpICYmIHJlbmRlckxhbmVzICE9PSBPZmZzY3JlZW5MYW5lKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgbm93IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGFuZCB3ZSdsbCBqdXN0IGdpdmUgdXAgZnVydGhlclxuICAgICAgICAgICAgICAvLyBhdHRlbXB0cyB0byByZW5kZXIgdGhlIG1haW4gY29udGVudCBhbmQgb25seSByZW5kZXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgaXMgdXN1YWxseSBmYXN0ZXIuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWZmZWN0IGxpc3Qgb2YgdGhlIGJhY2t3YXJkcyB0YWlsIHdpbGwgaGF2ZSBiZWVuIGFkZGVkXG4gICAgICAgICAgICAvLyB0byB0aGUgZW5kLiBUaGlzIGJyZWFrcyB0aGUgZ3VhcmFudGVlIHRoYXQgbGlmZS1jeWNsZXMgZmlyZSBpblxuICAgICAgICAgICAgLy8gc2libGluZyBvcmRlciBidXQgdGhhdCBpc24ndCBhIHN0cm9uZyBndWFyYW50ZWUgcHJvbWlzZWQgYnkgUmVhY3QuXG4gICAgICAgICAgICAvLyBFc3BlY2lhbGx5IHNpbmNlIHRoZXNlIG1pZ2h0IGFsc28ganVzdCBwb3AgaW4gZHVyaW5nIGZ1dHVyZSBjb21taXRzLlxuICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuXG4gICAgICAgICAgICByZW5kZXJlZFRhaWwuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1NpYmxpbmcgPSByZW5kZXJTdGF0ZS5sYXN0O1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2libGluZy5zaWJsaW5nID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3QgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBzdGlsbCBoYXZlIHRhaWwgcm93cyB0byByZW5kZXIuXG4gICAgICAgICAgLy8gUG9wIGEgcm93LlxuICAgICAgICAgIHZhciBuZXh0ID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBuZXh0O1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBuZXh0LnNpYmxpbmc7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgbmV4dC5zaWJsaW5nID0gbnVsbDsgLy8gUmVzdG9yZSB0aGUgY29udGV4dC5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBjYW4gcHJvYmFibHkganVzdCBhdm9pZCBwb3BwaW5nIGl0IGluc3RlYWQgYW5kIG9ubHlcbiAgICAgICAgICAvLyBzZXR0aW5nIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGdvIGZyb20gbm90IHN1c3BlbmRlZCB0byBzdXNwZW5kZWQuXG5cbiAgICAgICAgICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKGRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBEbyBhIHBhc3Mgb3ZlciB0aGUgbmV4dCByb3cuXG4gICAgICAgICAgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIF9uZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICB2YXIgbmV4dElzSGlkZGVuID0gX25leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBwcmV2SXNIaWRkZW4gPSBfcHJldlN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKHByZXZJc0hpZGRlbiAhPT0gbmV4dElzSGlkZGVuICYmICggLy8gTGVnYWN5SGlkZGVuIGRvZXNuJ3QgZG8gYW55IGhpZGluZyDigJQgaXQgb25seSBwcmUtcmVuZGVycy5cbiAgICAgICAgICAhZW5hYmxlTGVnYWN5SGlkZGVuICkpIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZXh0SXNIaWRkZW4gfHwgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGZvciBoaWRkZW4gY2hpbGRyZW4gdW5sZXNzIHdlJ3JlIHJlbmRlcmluZ1xuICAgICAgICAgIC8vIGF0IG9mZnNjcmVlbiBwcmlvcml0eS5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShzdWJ0cmVlUmVuZGVyTGFuZXMsIE9mZnNjcmVlbkxhbmUpKSB7XG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZSBpbiB0aGUgaGlkZGVuIHN1YnRyZWUuXG4gICAgICAgICAgICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIGhpZGUgdGhvc2Ugbm9kZXMgaW4gdGhlIGNvbW1pdCBwaGFzZSwgc29cbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgYSB2aXNpYmlsaXR5IGVmZmVjdC5cbiAgICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgJiAoUGxhY2VtZW50IHwgVXBkYXRlKSkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFwiICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gdW53aW5kV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG4gIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBmbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICB2YXIgX2ZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKChfZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSAhPT0gTm9GbGFncyAmJiAoX2ZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgZHVyaW5nIHJlbmRlciB0aGF0IHdhc24ndCBjYXB0dXJlZCBieSBhIHN1c3BlbnNlXG4gICAgICAgICAgLy8gYm91bmRhcnkuIERvIGEgc2Vjb25kIHBhc3Mgb24gdGhlIHJvb3QgdG8gdW5tb3VudCB0aGUgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBfZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9IC8vIFdlIHVud291bmQgdG8gdGhlIHJvb3Qgd2l0aG91dCBjb21wbGV0aW5nIGl0LiBFeGl0LlxuXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFRPRE86IHBvcEh5ZHJhdGlvblN0YXRlXG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwgJiYgc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaHJldyBpbiBuZXdseSBtb3VudGVkIGRlaHlkcmF0ZWQgY29tcG9uZW50LiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiAnICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2ZsYWdzMiA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChfZmxhZ3MyICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzMiAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTsgLy8gQ2FwdHVyZWQgYSBzdXNwZW5zZSBlZmZlY3QuIFJlLXJlbmRlciB0aGUgYm91bmRhcnkuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7IC8vIFN1c3BlbnNlTGlzdCBkb2Vzbid0IGFjdHVhbGx5IGNhdGNoIGFueXRoaW5nLiBJdCBzaG91bGQndmUgYmVlblxuICAgICAgICAvLyBjYXVnaHQgYnkgYSBuZXN0ZWQgYm91bmRhcnkuIElmIG5vdCwgaXQgc2hvdWxkIGJ1YmJsZSB0aHJvdWdoLlxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yaywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG4gIHBvcFRyZWVDb250ZXh0KGludGVycnVwdGVkV29yayk7XG5cbiAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gaW50ZXJydXB0ZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3QoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHBvcFN1c3BlbnNlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHBvcFN1c3BlbnNlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBjb250ZXh0ID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBudWxsO1xuXG57XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbmV3IFNldCgpO1xufSAvLyBVc2VkIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlIHRvIHRyYWNrIHRoZSBzdGF0ZSBvZiB0aGUgT2Zmc2NyZWVuIGNvbXBvbmVudCBzdGFjay5cbi8vIEFsbG93cyB1cyB0byBhdm9pZCB0cmF2ZXJzaW5nIHRoZSByZXR1cm4gcGF0aCB0byBmaW5kIHRoZSBuZWFyZXN0IE9mZnNjcmVlbiBhbmNlc3Rvci5cbi8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVN1c3BlbnNlTGF5b3V0RWZmZWN0U2VtYW50aWNzIGlzIGVuYWJsZWQuXG5cblxudmFyIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGZhbHNlO1xudmFyIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBmYWxzZTtcbnZhciBQb3NzaWJseVdlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtTZXQgOiBTZXQ7XG52YXIgbmV4dEVmZmVjdCA9IG51bGw7IC8vIFVzZWQgZm9yIFByb2ZpbGluZyBidWlsZHMgdG8gdHJhY2sgdXBkYXRlcnMuXG5cbnZhciBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xudmFyIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbmZ1bmN0aW9uIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvcikge1xuICAvLyBXcmFwcGluZyBlYWNoIHNtYWxsIHBhcnQgb2YgdGhlIGNvbW1pdCBwaGFzZSBpbnRvIGEgZ3VhcmRlZFxuICAvLyBjYWxsYmFjayBpcyBhIGJpdCB0b28gc2xvdyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjE2NjYpLlxuICAvLyBCdXQgd2UgcmVseSBvbiBpdCB0byBzdXJmYWNlIGVycm9ycyB0byBERVYgdG9vbHMgbGlrZSBvdmVybGF5c1xuICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMTcxMikuXG4gIC8vIEFzIGEgY29tcHJvbWlzZSwgcmV0aHJvdyBvbmx5IGNhdWdodCBlcnJvcnMgaW4gYSBndWFyZC5cbiAge1xuICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgICBjbGVhckNhdWdodEVycm9yKCk7XG4gIH1cbn1cblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50LCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5wcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgIHRyeSB7XG4gICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgfVxufTsgLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0LCBjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgdW5tb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIoY3VycmVudCwgaW5zdGFuY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50RGlkTW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlBdHRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEF0dGFjaFJlZihjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJldFZhbDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyAmJiBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIHJldFZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsRGVzdHJveShjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KSB7XG4gIHRyeSB7XG4gICAgZGVzdHJveSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuXG52YXIgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcbnZhciBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaXJzdENoaWxkKSB7XG4gIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpOyAvLyBXZSBubyBsb25nZXIgbmVlZCB0byB0cmFjayB0aGUgYWN0aXZlIGluc3RhbmNlIGZpYmVyXG5cbiAgdmFyIHNob3VsZEZpcmUgPSBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXI7XG4gIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlO1xuICBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBudWxsO1xuICByZXR1cm4gc2hvdWxkRmlyZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2JlZ2luKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRoaXMgcGhhc2UgaXMgb25seSB1c2VkIGZvciBiZWZvcmVBY3RpdmVJbnN0YW5jZUJsdXIuXG5cbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgQmVmb3JlTXV0YXRpb25NYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmICgoZmxhZ3MgJiBTbmFwc2hvdCkgIT09IE5vRmxhZ3MpIHtcbiAgICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcblxuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzbmFwc2hvdCA9IGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBwcmV2UHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBwcmV2UHJvcHMpLCBwcmV2U3RhdGUpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBkaWRXYXJuU2V0ID0gZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKHNuYXBzaG90ID09PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5TZXQuaGFzKGZpbmlzaGVkV29yay50eXBlKSkge1xuICAgICAgICAgICAgICAgIGRpZFdhcm5TZXQuYWRkKGZpbmlzaGVkV29yay50eXBlKTtcblxuICAgICAgICAgICAgICAgIGVycm9yKCclcy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpOiBBIHNuYXBzaG90IHZhbHVlIChvciBudWxsKSAnICsgJ211c3QgYmUgcmV0dXJuZWQuIFlvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlID0gc25hcHNob3Q7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGZvciB0aGVzZSBjb21wb25lbnQgdHlwZXNcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzICcgKyAnbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChmbGFncywgZmluaXNoZWRXb3JrLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAgLy8gVW5tb3VudFxuICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuICAgICAgICBlZmZlY3QuZGVzdHJveSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoZmxhZ3MsIGZpbmlzaGVkV29yaykge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBmbGFncykgPT09IGZsYWdzKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIE1vdW50XG5cblxuICAgICAgICB2YXIgY3JlYXRlID0gZWZmZWN0LmNyZWF0ZTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcblxuICAgICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRlc3Ryb3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBob29rTmFtZSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKChlZmZlY3QudGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZWZmZWN0LnRhZyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUVmZmVjdCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBhZGRlbmR1bSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKGRlc3Ryb3kgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZCBudWxsLiBJZiB5b3VyIGVmZmVjdCBkb2VzIG5vdCByZXF1aXJlIGNsZWFuICcgKyAndXAsIHJldHVybiB1bmRlZmluZWQgKG9yIG5vdGhpbmcpLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZXN0cm95LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnXFxuXFxuSXQgbG9va3MgbGlrZSB5b3Ugd3JvdGUgJyArIGhvb2tOYW1lICsgJyhhc3luYyAoKSA9PiAuLi4pIG9yIHJldHVybmVkIGEgUHJvbWlzZS4gJyArICdJbnN0ZWFkLCB3cml0ZSB0aGUgYXN5bmMgZnVuY3Rpb24gaW5zaWRlIHlvdXIgZWZmZWN0ICcgKyAnYW5kIGNhbGwgaXQgaW1tZWRpYXRlbHk6XFxuXFxuJyArIGhvb2tOYW1lICsgJygoKSA9PiB7XFxuJyArICcgIGFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSgpIHtcXG4nICsgJyAgICAvLyBZb3UgY2FuIGF3YWl0IGhlcmVcXG4nICsgJyAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE15QVBJLmdldERhdGEoc29tZUlkKTtcXG4nICsgJyAgICAvLyAuLi5cXG4nICsgJyAgfVxcbicgKyAnICBmZXRjaERhdGEoKTtcXG4nICsgXCJ9LCBbc29tZUlkXSk7IC8vIE9yIFtdIGlmIGVmZmVjdCBkb2Vzbid0IG5lZWQgcHJvcHMgb3Igc3RhdGVcXG5cXG5cIiArICdMZWFybiBtb3JlIGFib3V0IGRhdGEgZmV0Y2hpbmcgd2l0aCBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2hvb2tzLWRhdGEtZmV0Y2hpbmcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZDogJyArIGRlc3Ryb3k7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVycm9yKCclcyBtdXN0IG5vdCByZXR1cm4gYW55dGhpbmcgYmVzaWRlcyBhIGZ1bmN0aW9uLCAnICsgJ3doaWNoIGlzIHVzZWQgZm9yIGNsZWFuLXVwLiVzJywgaG9va05hbWUsIGFkZGVuZHVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZUVmZmVjdER1cmF0aW9ucyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuICB7XG4gICAgLy8gT25seSBQcm9maWxlcnMgd2l0aCB3b3JrIGluIHRoZWlyIHN1YnRyZWUgd2lsbCBoYXZlIGFuIFVwZGF0ZSBlZmZlY3Qgc2NoZWR1bGVkLlxuICAgIGlmICgoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSAhPT0gTm9GbGFncykge1xuICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIF9maW5pc2hlZFdvcmskbWVtb2l6ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICAgIGlkID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLmlkLFxuICAgICAgICAgICAgICAgIG9uUG9zdENvbW1pdCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5vblBvc3RDb21taXQ7IC8vIFRoaXMgdmFsdWUgd2lsbCBzdGlsbCByZWZsZWN0IHRoZSBwcmV2aW91cyBjb21taXQgcGhhc2UuXG4gICAgICAgICAgICAvLyBJdCBkb2VzIG5vdCBnZXQgcmVzZXQgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGNvbW1pdCBwaGFzZS5cblxuICAgICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgcGhhc2UgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHBoYXNlID0gJ25lc3RlZC11cGRhdGUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25Qb3N0Q29tbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG9uUG9zdENvbW1pdChpZCwgcGhhc2UsIHBhc3NpdmVFZmZlY3REdXJhdGlvbiwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICB9IC8vIEJ1YmJsZSB0aW1lcyB0byB0aGUgbmV4dCBuZWFyZXN0IGFuY2VzdG9yIFByb2ZpbGVyLlxuICAgICAgICAgICAgLy8gQWZ0ZXIgd2UgcHJvY2VzcyB0aGF0IFByb2ZpbGVyLCB3ZSdsbCBidWJibGUgZnVydGhlciB1cC5cblxuXG4gICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuO1xuXG4gICAgICAgICAgICBvdXRlcjogd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgcm9vdC5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gcGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gcGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKGZpbmlzaGVkUm9vdCwgY3VycmVudCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcykge1xuICBpZiAoKGZpbmlzaGVkV29yay5mbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBsYXlvdXQgZWZmZWN0cyBoYXZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQgKGR1cmluZyBtdXRhdGlvbiBwaGFzZSkuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgdG8gcHJldmVudCBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLFxuICAgICAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgICAgICAvLyBieSBhIGNyZWF0ZSBmdW5jdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCBkdXJpbmcgdGhlIHNhbWUgY29tbWl0LlxuICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZE1vdW50LiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBjdXJyZW50Lm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBUT0RPOiBJIHRoaW5rIHRoaXMgaXMgbm93IGFsd2F5cyBub24tbnVsbCBieSB0aGUgdGltZSBpdCByZWFjaGVzIHRoZVxuICAgICAgICAgIC8vIGNvbW1pdCBwaGFzZS4gQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIHR5cGUgY2hlY2suXG5cblxuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cblxuICAgICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCB1cGRhdGVRdWV1ZSwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPOiBJIHRoaW5rIHRoaXMgaXMgbm93IGFsd2F5cyBub24tbnVsbCBieSB0aGUgdGltZSBpdCByZWFjaGVzIHRoZVxuICAgICAgICAgIC8vIGNvbW1pdCBwaGFzZS4gQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIHR5cGUgY2hlY2suXG4gICAgICAgICAgdmFyIF91cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmIChfdXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLmNoaWxkLnRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgX3VwZGF0ZVF1ZXVlLCBfaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UyID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gUmVuZGVyZXJzIG1heSBzY2hlZHVsZSB3b3JrIHRvIGJlIGRvbmUgYWZ0ZXIgaG9zdCBjb21wb25lbnRzIGFyZSBtb3VudGVkXG4gICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBtYXkgc2NoZWR1bGUgYXV0by1mb2N1cyBmb3IgaW5wdXRzIGFuZCBmb3JtIGNvbnRyb2xzKS5cbiAgICAgICAgICAvLyBUaGVzZSBlZmZlY3RzIHNob3VsZCBvbmx5IGJlIGNvbW1pdHRlZCB3aGVuIGNvbXBvbmVudHMgYXJlIGZpcnN0IG1vdW50ZWQsXG4gICAgICAgICAgLy8gYWthIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudC9hbHRlcm5hdGUuXG5cbiAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiBmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGU7XG4gICAgICAgICAgICB2YXIgcHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggdGV4dC5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIG5vIGxpZmUtY3ljbGVzIGFzc29jaWF0ZWQgd2l0aCBwb3J0YWxzLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplMiA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICAgIG9uQ29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vbkNvbW1pdCxcbiAgICAgICAgICAgICAgICBvblJlbmRlciA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25SZW5kZXI7XG4gICAgICAgICAgICB2YXIgZWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgcGhhc2UgPSBjdXJyZW50ID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHBoYXNlID0gJ25lc3RlZC11cGRhdGUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25SZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgb25SZW5kZXIoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uQ29tbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgb25Db21taXQoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBlZmZlY3REdXJhdGlvbiwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICAgIH0gLy8gU2NoZWR1bGUgYSBwYXNzaXZlIGVmZmVjdCBmb3IgdGhpcyBQcm9maWxlciB0byBjYWxsIG9uUG9zdENvbW1pdCBob29rcy5cbiAgICAgICAgICAgICAgLy8gVGhpcyBlZmZlY3Qgc2hvdWxkIGJlIHNjaGVkdWxlZCBldmVuIGlmIHRoZXJlIGlzIG5vIG9uUG9zdENvbW1pdCBjYWxsYmFjayBmb3IgdGhpcyBQcm9maWxlcixcbiAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZWZmZWN0IGlzIGFsc28gd2hlcmUgdGltZXMgYnViYmxlIHRvIHBhcmVudCBQcm9maWxlcnMuXG5cblxuICAgICAgICAgICAgICBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaW5pc2hlZFdvcmspOyAvLyBQcm9wYWdhdGUgbGF5b3V0IGVmZmVjdCBkdXJhdGlvbnMgdG8gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3Rvci5cbiAgICAgICAgICAgICAgLy8gRG8gbm90IHJlc2V0IHRoZXNlIHZhbHVlcyB1bnRpbCB0aGUgbmV4dCByZW5kZXIgc28gRGV2VG9vbHMgaGFzIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSBmaXJzdC5cblxuICAgICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuO1xuXG4gICAgICAgICAgICAgIG91dGVyOiB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzICcgKyAnbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgIHtcbiAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yayk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c09uRmliZXIobm9kZSkge1xuICAvLyBUdXJuIG9uIGxheW91dCBlZmZlY3RzIGluIGEgdHJlZSB0aGF0IHByZXZpb3VzbHkgZGlzYXBwZWFyZWQuXG4gIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljXG4gIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggbm9kZS5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudERpZE1vdW50KG5vZGUsIG5vZGUucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzYWZlbHlBdHRhY2hSZWYobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgc2FmZWx5QXR0YWNoUmVmKG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbikge1xuICAvLyBPbmx5IGhpZGUgb3IgdW5oaWRlIHRoZSB0b3AtbW9zdCBob3N0IG5vZGVzLlxuICB2YXIgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcblxuICB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbnVsbCkge1xuICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG5vZGU7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgICBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdW5oaWRlSW5zdGFuY2Uobm9kZS5zdGF0ZU5vZGUsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlMyA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKG5vZGUudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQgfHwgbm9kZS50YWcgPT09IExlZ2FjeUhpZGRlbkNvbXBvbmVudCkgJiYgbm9kZS5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmIG5vZGUgIT09IGZpbmlzaGVkV29yaykgOyBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG5vZGUpIHtcbiAgICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBub2RlKSB7XG4gICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEF0dGFjaFJlZihmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHJlZiA9IGZpbmlzaGVkV29yay5yZWY7XG5cbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgdmFyIGluc3RhbmNlVG9Vc2U7XG5cbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBpbnN0YW5jZTtcbiAgICB9IC8vIE1vdmVkIG91dHNpZGUgdG8gZW5zdXJlIERDRSB3b3JrcyB3aXRoIHRoaXMgZmxhZ1xuXG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciByZXRWYWw7XG5cbiAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICByZXRWYWwgPSByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0VmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsYmFjayByZWYgaW4gJXMuICcgKyAnQSBjYWxsYmFjayByZWYgc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbi4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFyZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiAnICsgJ1VzZSBlaXRoZXIgYSByZWYtc2V0dGVyIGZ1bmN0aW9uIG9yIFJlYWN0LmNyZWF0ZVJlZigpLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVmLmN1cnJlbnQgPSBpbnN0YW5jZVRvVXNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlck11dGF0aW9uKGZpYmVyKSB7XG4gIC8vIEN1dCBvZmYgdGhlIHJldHVybiBwb2ludGVyIHRvIGRpc2Nvbm5lY3QgaXQgZnJvbSB0aGUgdHJlZS5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIGRldGVjdCBhbmQgd2FybiBhZ2FpbnN0IHN0YXRlIHVwZGF0ZXMgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC5cbiAgLy8gSXQgYWxzbyBwcmV2ZW50cyBldmVudHMgZnJvbSBidWJibGluZyBmcm9tIHdpdGhpbiBkaXNjb25uZWN0ZWQgY29tcG9uZW50cy5cbiAgLy9cbiAgLy8gSWRlYWxseSwgd2Ugc2hvdWxkIGFsc28gY2xlYXIgdGhlIGNoaWxkIHBvaW50ZXIgb2YgdGhlIHBhcmVudCBhbHRlcm5hdGUgdG8gbGV0IHRoaXNcbiAgLy8gZ2V0IEdDOmVkIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIGZvciBzdXJlIHdoaWNoIHBhcmVudCBpcyB0aGUgY3VycmVudFxuICAvLyBvbmUgc28gd2UnbGwgc2V0dGxlIGZvciBHQzppbmcgdGhlIHN1YnRyZWUgb2YgdGhpcyBjaGlsZC5cbiAgLy8gVGhpcyBjaGlsZCBpdHNlbGYgd2lsbCBiZSBHQzplZCB3aGVuIHRoZSBwYXJlbnQgdXBkYXRlcyB0aGUgbmV4dCB0aW1lLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY2xlYXIgY2hpbGQgb3Igc2libGluZyBwb2ludGVycyB5ZXQuXG4gIC8vIFRoZXkncmUgbmVlZGVkIGZvciBwYXNzaXZlIGVmZmVjdHMgYW5kIGZvciBmaW5kRE9NTm9kZS5cbiAgLy8gV2UgZGVmZXIgdGhvc2UgZmllbGRzLCBhbmQgYWxsIG90aGVyIGNsZWFudXAsIHRvIHRoZSBwYXNzaXZlIHBoYXNlIChzZWUgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMpLlxuICAvL1xuICAvLyBEb24ndCByZXNldCB0aGUgYWx0ZXJuYXRlIHlldCwgZWl0aGVyLiBXZSBuZWVkIHRoYXQgc28gd2UgY2FuIGRldGFjaCB0aGVcbiAgLy8gYWx0ZXJuYXRlJ3MgZmllbGRzIGluIHRoZSBwYXNzaXZlIHBoYXNlLiBDbGVhcmluZyB0aGUgcmV0dXJuIHBvaW50ZXIgaXNcbiAgLy8gc3VmZmljaWVudCBmb3IgZmluZERPTU5vZGUgc2VtYW50aWNzLlxuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUucmV0dXJuID0gbnVsbDtcbiAgfVxuXG4gIGZpYmVyLnJldHVybiA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGZpYmVyLmFsdGVybmF0ZSA9IG51bGw7XG4gICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoYWx0ZXJuYXRlKTtcbiAgfSAvLyBOb3RlOiBEZWZlbnNpdmVseSB1c2luZyBuZWdhdGlvbiBpbnN0ZWFkIG9mIDwgaW4gY2FzZVxuICAvLyBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGlzIHVuZGVmaW5lZC5cblxuXG4gIHtcbiAgICAvLyBDbGVhciBjeWNsaWNhbCBGaWJlciBmaWVsZHMuIFRoaXMgbGV2ZWwgYWxvbmUgaXMgZGVzaWduZWQgdG8gcm91Z2hseVxuICAgIC8vIGFwcHJveGltYXRlIHRoZSBwbGFubmVkIEZpYmVyIHJlZmFjdG9yLiBJbiB0aGF0IHdvcmxkLCBgc2V0U3RhdGVgIHdpbGwgYmVcbiAgICAvLyBib3VuZCB0byBhIHNwZWNpYWwgXCJpbnN0YW5jZVwiIG9iamVjdCBpbnN0ZWFkIG9mIGEgRmliZXIuIFRoZSBJbnN0YW5jZVxuICAgIC8vIG9iamVjdCB3aWxsIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBmaWVsZHMuIEl0IHdpbGwgb25seSBiZSBjb25uZWN0ZWQgdG9cbiAgICAvLyB0aGUgZmliZXIgdHJlZSB2aWEgYSBzaW5nbGUgbGluayBhdCB0aGUgcm9vdC4gU28gaWYgdGhpcyBsZXZlbCBhbG9uZSBpc1xuICAgIC8vIHN1ZmZpY2llbnQgdG8gZml4IG1lbW9yeSBpc3N1ZXMsIHRoYXQgYm9kZXMgd2VsbCBmb3Igb3VyIHBsYW5zLlxuICAgIGZpYmVyLmNoaWxkID0gbnVsbDtcbiAgICBmaWJlci5kZWxldGlvbnMgPSBudWxsO1xuICAgIGZpYmVyLnNpYmxpbmcgPSBudWxsOyAvLyBUaGUgYHN0YXRlTm9kZWAgaXMgY3ljbGljYWwgYmVjYXVzZSBvbiBob3N0IG5vZGVzIGl0IHBvaW50cyB0byB0aGUgaG9zdFxuICAgIC8vIHRyZWUsIHdoaWNoIGhhcyBpdHMgb3duIHBvaW50ZXJzIHRvIGNoaWxkcmVuLCBwYXJlbnRzLCBhbmQgc2libGluZ3MuXG4gICAgLy8gVGhlIG90aGVyIGhvc3Qgbm9kZXMgYWxzbyBwb2ludCBiYWNrIHRvIGZpYmVycywgc28gd2Ugc2hvdWxkIGRldGFjaCB0aGF0XG4gICAgLy8gb25lLCB0b28uXG5cbiAgICBpZiAoZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgIGRldGFjaERlbGV0ZWRJbnN0YW5jZShob3N0SW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7IC8vIEknbSBpbnRlbnRpb25hbGx5IG5vdCBjbGVhcmluZyB0aGUgYHJldHVybmAgZmllbGQgaW4gdGhpcyBsZXZlbC4gV2VcbiAgICAvLyBhbHJlYWR5IGRpc2Nvbm5lY3QgdGhlIGByZXR1cm5gIHBvaW50ZXIgYXQgdGhlIHJvb3Qgb2YgdGhlIGRlbGV0ZWRcbiAgICAvLyBzdWJ0cmVlIChpbiBgZGV0YWNoRmliZXJNdXRhdGlvbmApLiBCZXNpZGVzLCBgcmV0dXJuYCBieSBpdHNlbGYgaXMgbm90XG4gICAgLy8gY3ljbGljYWwg4oCUIGl0J3Mgb25seSBjeWNsaWNhbCB3aGVuIGNvbWJpbmVkIHdpdGggYGNoaWxkYCwgYHNpYmxpbmdgLCBhbmRcbiAgICAvLyBgYWx0ZXJuYXRlYC4gQnV0IHdlJ2xsIGNsZWFyIGl0IGluIHRoZSBuZXh0IGxldmVsIGFueXdheSwganVzdCBpbiBjYXNlLlxuXG4gICAge1xuICAgICAgZmliZXIuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFRoZW9yZXRpY2FsbHksIG5vdGhpbmcgaW4gaGVyZSBzaG91bGQgYmUgbmVjZXNzYXJ5LCBiZWNhdXNlIHdlIGFscmVhZHlcbiAgICAgIC8vIGRpc2Nvbm5lY3RlZCB0aGUgZmliZXIgZnJvbSB0aGUgdHJlZS4gU28gZXZlbiBpZiBzb21ldGhpbmcgbGVha3MgdGhpc1xuICAgICAgLy8gcGFydGljdWxhciBmaWJlciwgaXQgd29uJ3QgbGVhayBhbnl0aGluZyBlbHNlXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBicmFuY2ggaXMgdG8gYmUgc3VwZXIgYWdncmVzc2l2ZSBzbyB3ZSBjYW4gbWVhc3VyZVxuICAgICAgLy8gaWYgdGhlcmUncyBhbnkgZGlmZmVyZW5jZSBpbiBtZW1vcnkgaW1wYWN0LiBJZiB0aGVyZSBpcywgdGhhdCBjb3VsZFxuICAgICAgLy8gaW5kaWNhdGUgYSBSZWFjdCBsZWFrIHdlIGRvbid0IGtub3cgYWJvdXQuXG4gICAgICBmaWJlci5yZXR1cm4gPSBudWxsO1xuICAgICAgZmliZXIuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDsgLy8gVE9ETzogTW92ZSB0byBgY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXJgIGluc3RlYWQuXG5cbiAgICAgIGZpYmVyLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFBhcmVudEZpYmVyKGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIGlmIChpc0hvc3RQYXJlbnQocGFyZW50KSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gaXNIb3N0UGFyZW50KGZpYmVyKSB7XG4gIHJldHVybiBmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgZmliZXIudGFnID09PSBIb3N0Um9vdCB8fCBmaWJlci50YWcgPT09IEhvc3RQb3J0YWw7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RTaWJsaW5nKGZpYmVyKSB7XG4gIC8vIFdlJ3JlIGdvaW5nIHRvIHNlYXJjaCBmb3J3YXJkIGludG8gdGhlIHRyZWUgdW50aWwgd2UgZmluZCBhIHNpYmxpbmcgaG9zdFxuICAvLyBub2RlLiBVbmZvcnR1bmF0ZWx5LCBpZiBtdWx0aXBsZSBpbnNlcnRpb25zIGFyZSBkb25lIGluIGEgcm93IHdlIGhhdmUgdG9cbiAgLy8gc2VhcmNoIHBhc3QgdGhlbS4gVGhpcyBsZWFkcyB0byBleHBvbmVudGlhbCBzZWFyY2ggZm9yIHRoZSBuZXh0IHNpYmxpbmcuXG4gIC8vIFRPRE86IEZpbmQgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcy5cbiAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICBzaWJsaW5nczogd2hpbGUgKHRydWUpIHtcbiAgICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZywgbGV0J3MgdHJ5IHRoZSBuZXh0IHNpYmxpbmcuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IGlzSG9zdFBhcmVudChub2RlLnJldHVybikpIHtcbiAgICAgICAgLy8gSWYgd2UgcG9wIG91dCBvZiB0aGUgcm9vdCBvciBoaXQgdGhlIHBhcmVudCB0aGUgZmliZXIgd2UgYXJlIHRoZVxuICAgICAgICAvLyBsYXN0IHNpYmxpbmcuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG5cbiAgICB3aGlsZSAobm9kZS50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgbm9kZS50YWcgIT09IEhvc3RUZXh0ICYmIG5vZGUudGFnICE9PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIGl0IGlzIG5vdCBob3N0IG5vZGUgYW5kLCB3ZSBtaWdodCBoYXZlIGEgaG9zdCBub2RlIGluc2lkZSBpdC5cbiAgICAgIC8vIFRyeSB0byBzZWFyY2ggZG93biB1bnRpbCB3ZSBmaW5kIG9uZS5cbiAgICAgIGlmIChub2RlLmZsYWdzICYgUGxhY2VtZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBjaGlsZCwgdHJ5IHRoZSBzaWJsaW5ncyBpbnN0ZWFkLlxuICAgICAgICBjb250aW51ZSBzaWJsaW5ncztcbiAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAvLyBXZSBhbHNvIHNraXAgcG9ydGFscyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoaXMgaG9zdCB0cmVlLlxuXG5cbiAgICAgIGlmIChub2RlLmNoaWxkID09PSBudWxsIHx8IG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIH1cbiAgICB9IC8vIENoZWNrIGlmIHRoaXMgaG9zdCBub2RlIGlzIHN0YWJsZSBvciBhYm91dCB0byBiZSBwbGFjZWQuXG5cblxuICAgIGlmICghKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpKSB7XG4gICAgICAvLyBGb3VuZCBpdCFcbiAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGxhY2VtZW50KGZpbmlzaGVkV29yaykge1xuXG5cbiAgdmFyIHBhcmVudEZpYmVyID0gZ2V0SG9zdFBhcmVudEZpYmVyKGZpbmlzaGVkV29yayk7IC8vIE5vdGU6IHRoZXNlIHR3byB2YXJpYWJsZXMgKm11c3QqIGFsd2F5cyBiZSB1cGRhdGVkIHRvZ2V0aGVyLlxuXG4gIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChwYXJlbnRGaWJlci5mbGFncyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHBhcmVudCBiZWZvcmUgZG9pbmcgYW55IGluc2VydGlvbnNcbiAgICAgICAgICByZXNldFRleHRDb250ZW50KHBhcmVudCk7IC8vIENsZWFyIENvbnRlbnRSZXNldCBmcm9tIHRoZSBlZmZlY3QgdGFnXG5cbiAgICAgICAgICBwYXJlbnRGaWJlci5mbGFncyAmPSB+Q29udGVudFJlc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7IC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAgICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuXG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShmaW5pc2hlZFdvcmssIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICB2YXIgX2JlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihmaW5pc2hlZFdvcmssIF9iZWZvcmUsIF9wYXJlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2hcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9zdCBwYXJlbnQgZmliZXIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QpIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCkge1xuICAgIHZhciBzdGF0ZU5vZGUgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGQocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIFRoZXNlIGFyZSB0cmFja2VkIG9uIHRoZSBzdGFjayBhcyB3ZSByZWN1cnNpdmVseSB0cmF2ZXJzZSBhXG4vLyBkZWxldGVkIHN1YnRyZWUuXG4vLyBUT0RPOiBVcGRhdGUgdGhlc2UgZHVyaW5nIHRoZSB3aG9sZSBtdXRhdGlvbiBwaGFzZSwgbm90IGp1c3QgZHVyaW5nXG4vLyBhIGRlbGV0aW9uLlxuXG5cbnZhciBob3N0UGFyZW50ID0gbnVsbDtcbnZhciBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzKHJvb3QsIHJldHVybkZpYmVyLCBkZWxldGVkRmliZXIpIHtcbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGRlbGV0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICAvLyBSZWN1cnNpdmVseSBkZWxldGUgYWxsIGhvc3Qgbm9kZXMgZnJvbSB0aGUgcGFyZW50LCBkZXRhY2ggcmVmcywgY2xlYW5cbiAgICAvLyB1cCBtb3VudGVkIGxheW91dCBlZmZlY3RzLCBhbmQgY2FsbCBjb21wb25lbnRXaWxsVW5tb3VudC5cbiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIHRoZSB0b3Btb3N0IGhvc3QgY2hpbGQgaW4gZWFjaCBicmFuY2guIEJ1dCB0aGVuIHdlXG4gICAgLy8gc3RpbGwgbmVlZCB0byBrZWVwIHRyYXZlcnNpbmcgdG8gdW5tb3VudCBlZmZlY3RzLCByZWZzLCBhbmQgY1dVLiBUT0RPOiBXZVxuICAgIC8vIGNvdWxkIHNwbGl0IHRoaXMgaW50byB0d28gc2VwYXJhdGUgdHJhdmVyc2FscyBmdW5jdGlvbnMsIHdoZXJlIHRoZSBzZWNvbmRcbiAgICAvLyBvbmUgZG9lc24ndCBpbmNsdWRlIGFueSByZW1vdmVDaGlsZCBsb2dpYy4gVGhpcyBpcyBtYXliZSB0aGUgc2FtZVxuICAgIC8vIGZ1bmN0aW9uIGFzIFwiZGlzYXBwZWFyTGF5b3V0RWZmZWN0c1wiIChvciB3aGF0ZXZlciB0aGF0IHR1cm5zIGludG8gYWZ0ZXJcbiAgICAvLyB0aGUgbGF5b3V0IHBoYXNlIGlzIHJlZmFjdG9yZWQgdG8gdXNlIHJlY3Vyc2lvbikuXG4gICAgLy8gQmVmb3JlIHN0YXJ0aW5nLCBmaW5kIHRoZSBuZWFyZXN0IGhvc3QgcGFyZW50IG9uIHRoZSBzdGFjayBzbyB3ZSBrbm93XG4gICAgLy8gd2hpY2ggaW5zdGFuY2UvY29udGFpbmVyIHRvIHJlbW92ZSB0aGUgY2hpbGRyZW4gZnJvbS5cbiAgICAvLyBUT0RPOiBJbnN0ZWFkIG9mIHNlYXJjaGluZyB1cCB0aGUgZmliZXIgcmV0dXJuIHBhdGggb24gZXZlcnkgZGVsZXRpb24sIHdlXG4gICAgLy8gY2FuIHRyYWNrIHRoZSBuZWFyZXN0IGhvc3QgY29tcG9uZW50IG9uIHRoZSBKUyBzdGFjayBhcyB3ZSB0cmF2ZXJzZSB0aGVcbiAgICAvLyB0cmVlIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlLiBUaGlzIHdvdWxkIG1ha2UgaW5zZXJ0aW9ucyBmYXN0ZXIsIHRvby5cbiAgICB2YXIgcGFyZW50ID0gcmV0dXJuRmliZXI7XG5cbiAgICBmaW5kUGFyZW50OiB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudC50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGhvc3RQYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihyb290LCByZXR1cm5GaWJlciwgZGVsZXRlZEZpYmVyKTtcbiAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgfVxuXG4gIGRldGFjaEZpYmVyTXV0YXRpb24oZGVsZXRlZEZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIHBhcmVudCkge1xuICAvLyBUT0RPOiBVc2UgYSBzdGF0aWMgZmxhZyB0byBza2lwIHRyZWVzIHRoYXQgZG9uJ3QgaGF2ZSB1bm1vdW50IGVmZmVjdHNcbiAgdmFyIGNoaWxkID0gcGFyZW50LmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBjaGlsZCk7XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpIHtcbiAgb25Db21taXRVbm1vdW50KGRlbGV0ZWRGaWJlcik7IC8vIFRoZSBjYXNlcyBpbiB0aGlzIG91dGVyIHN3aXRjaCBtb2RpZnkgdGhlIHN0YWNrIGJlZm9yZSB0aGV5IHRyYXZlcnNlXG4gIC8vIGludG8gdGhlaXIgc3VidHJlZS4gVGhlcmUgYXJlIHNpbXBsZXIgY2FzZXMgaW4gdGhlIGlubmVyIHN3aXRjaFxuICAvLyB0aGF0IGRvbid0IG1vZGlmeSB0aGUgc3RhY2suXG5cbiAgc3dpdGNoIChkZWxldGVkRmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgfSAvLyBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCB0byBuZXh0IGJyYW5jaFxuXG4gICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lLW5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIHRoZSBuZWFyZXN0IGhvc3QgY2hpbGQuIFNldCB0aGUgaG9zdCBwYXJlbnRcbiAgICAgICAgLy8gdG8gYG51bGxgIG9uIHRoZSBzdGFjayB0byBpbmRpY2F0ZSB0aGF0IG5lc3RlZCBjaGlsZHJlbiBkb24ndFxuICAgICAgICAvLyBuZWVkIHRvIGJlIHJlbW92ZWQuXG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBudWxsO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuXG4gICAgICAgICAgaWYgKGhvc3RQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIE5vdyB0aGF0IGFsbCB0aGUgY2hpbGQgZWZmZWN0cyBoYXZlIHVubW91bnRlZCwgd2UgY2FuIHJlbW92ZSB0aGVcbiAgICAgICAgICAgIC8vIG5vZGUgZnJvbSB0aGUgdHJlZS5cbiAgICAgICAgICAgIGlmIChob3N0UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGQoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBEZWh5ZHJhdGVkRnJhZ21lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIERlbGV0ZSB0aGUgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBhbmQgYWxsIG9mIGl0cyBjb250ZW50LlxuXG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChob3N0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSBnbyBpbnRvIGEgcG9ydGFsLCBpdCBiZWNvbWVzIHRoZSBwYXJlbnQgdG8gcmVtb3ZlIGZyb20uXG4gICAgICAgICAgdmFyIF9wcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgICAgICAgdmFyIF9wcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBob3N0UGFyZW50ID0gX3ByZXZIb3N0UGFyZW50O1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IF9wcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZGVsZXRlZEZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG5cbiAgICAgICAgICAgIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgX2VmZmVjdCA9IGVmZmVjdCxcbiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSA9IF9lZmZlY3QuZGVzdHJveSxcbiAgICAgICAgICAgICAgICAgICAgdGFnID0gX2VmZmVjdC50YWc7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICggZGVsZXRlZEZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnXG4gICAgICAgICBkZWxldGVkRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBvZmZzY3JlZW4gY29tcG9uZW50IGlzIGhpZGRlbiwgd2UgYWxyZWFkeSB1bm1vdW50ZWQgaXQuIEJlZm9yZVxuICAgICAgICAgIC8vIGRlbGV0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgdGhhdCBpdCdzIGFscmVhZHkgdW5tb3VudGVkIHNvIHRoYXQgd2VcbiAgICAgICAgICAvLyBkb24ndCBhdHRlbXB0IHRvIHVubW91bnQgdGhlIGVmZmVjdHMgYWdhaW4uXG4gICAgICAgICAgLy8gVE9ETzogSWYgdGhlIHRyZWUgaXMgaGlkZGVuLCBpbiBtb3N0IGNhc2VzIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNraXBcbiAgICAgICAgICAvLyBvdmVyIHRoZSBuZXN0ZWQgY2hpbGRyZW4gZW50aXJlbHkuIEFuIGV4Y2VwdGlvbiBpcyB3ZSBoYXZlbid0IHlldCBmb3VuZFxuICAgICAgICAgIC8vIHRoZSB0b3Btb3N0IGhvc3Qgbm9kZSB0byBkZWxldGUsIHdoaWNoIHdlIGFscmVhZHkgdHJhY2sgb24gdGhlIHN0YWNrLlxuICAgICAgICAgIC8vIEJ1dCB0aGUgb3RoZXIgY2FzZSBpcyBwb3J0YWxzLCB3aGljaCBuZWVkIHRvIGJlIGRldGFjaGVkIG5vIG1hdHRlciBob3dcbiAgICAgICAgICAvLyBkZWVwbHkgdGhleSBhcmUgbmVzdGVkLiBXZSBzaG91bGQgdXNlIGEgc3VidHJlZSBmbGFnIHRvIHRyYWNrIHdoZXRoZXIgYVxuICAgICAgICAgIC8vIHN1YnRyZWUgaW5jbHVkZXMgYSBuZXN0ZWQgcG9ydGFsLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUNhbGxiYWNrKGZpbmlzaGVkV29yaykge1xuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gcGFzc2l2ZSBwaGFzZVxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcblxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIElmIHRoaXMgYm91bmRhcnkganVzdCB0aW1lZCBvdXQsIHRoZW4gaXQgd2lsbCBoYXZlIGEgc2V0IG9mIHdha2VhYmxlcy5cbiAgLy8gRm9yIGVhY2ggd2FrZWFibGUsIGF0dGFjaCBhIGxpc3RlbmVyIHNvIHRoYXQgd2hlbiBpdCByZXNvbHZlcywgUmVhY3RcbiAgLy8gYXR0ZW1wdHMgdG8gcmUtcmVuZGVyIHRoZSBib3VuZGFyeSBpbiB0aGUgcHJpbWFyeSAocHJlLXRpbWVvdXQpIHN0YXRlLlxuICB2YXIgd2FrZWFibGVzID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgIGlmIChyZXRyeUNhY2hlID09PSBudWxsKSB7XG4gICAgICByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IG5ldyBQb3NzaWJseVdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICB3YWtlYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAod2FrZWFibGUpIHtcbiAgICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIGJvdW5kYXJ5IGZpYmVyIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICAgIHZhciByZXRyeSA9IHJlc29sdmVSZXRyeVdha2VhYmxlLmJpbmQobnVsbCwgZmluaXNoZWRXb3JrLCB3YWtlYWJsZSk7XG5cbiAgICAgIGlmICghcmV0cnlDYWNoZS5oYXMod2FrZWFibGUpKSB7XG4gICAgICAgIHJldHJ5Q2FjaGUuYWRkKHdha2VhYmxlKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgICAgICBpZiAoaW5Qcm9ncmVzc0xhbmVzICE9PSBudWxsICYmIGluUHJvZ3Jlc3NSb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCBhc3NvY2lhdGUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzIHdpdGggaXQuXG4gICAgICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMoaW5Qcm9ncmVzc1Jvb3QsIGluUHJvZ3Jlc3NMYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvcignRXhwZWN0ZWQgZmluaXNoZWQgcm9vdCBhbmQgbGFuZXMgdG8gYmUgc2V0LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSAvLyBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IGdvZXMgZnJvbSB2aXNpYmxlIHRvIGhpZGRlbi5cbmZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IGNvbW1pdHRlZExhbmVzO1xuICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuICBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaywgcm9vdCk7XG4gIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuICBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xuICBpblByb2dyZXNzUm9vdCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGxhbmVzKSB7XG4gIC8vIERlbGV0aW9ucyBlZmZlY3RzIGNhbiBiZSBzY2hlZHVsZWQgb24gYW55IGZpYmVyIHR5cGUuIFRoZXkgbmVlZCB0byBoYXBwZW5cbiAgLy8gYmVmb3JlIHRoZSBjaGlsZHJlbiBlZmZlY3RzIGhhZSBmaXJlZC5cbiAgdmFyIGRlbGV0aW9ucyA9IHBhcmVudEZpYmVyLmRlbGV0aW9ucztcblxuICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZFRvRGVsZXRlID0gZGVsZXRpb25zW2ldO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGNoaWxkVG9EZWxldGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY2hpbGRUb0RlbGV0ZSwgcGFyZW50RmliZXIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcHJldkRlYnVnRmliZXIgPSBnZXRDdXJyZW50RmliZXIoKTtcblxuICBpZiAocGFyZW50RmliZXIuc3VidHJlZUZsYWdzICYgTXV0YXRpb25NYXNrKSB7XG4gICAgdmFyIGNoaWxkID0gcGFyZW50RmliZXIuY2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihjaGlsZCk7XG4gICAgICBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGNoaWxkLCByb290KTtcbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG4gIH1cblxuICBzZXRDdXJyZW50RmliZXIocHJldkRlYnVnRmliZXIpO1xufVxuXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaywgcm9vdCwgbGFuZXMpIHtcbiAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7IC8vIFRoZSBlZmZlY3QgZmxhZyBzaG91bGQgYmUgY2hlY2tlZCAqYWZ0ZXIqIHdlIHJlZmluZSB0aGUgdHlwZSBvZiBmaWJlcixcbiAgLy8gYmVjYXVzZSB0aGUgZmliZXIgdGFnIGlzIG1vcmUgc3BlY2lmaWMuIEFuIGV4Y2VwdGlvbiBpcyBhbnkgZmxhZyByZWxhdGVkXG4gIC8vIHRvIHJlY29uY2lsYXRpb24sIGJlY2F1c2UgdGhvc2UgY2FuIGJlIHNldCBvbiBhbGwgZmliZXIgdHlwZXMuXG5cbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KEluc2VydGlvbiB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9IC8vIExheW91dCBlZmZlY3RzIGFyZSBkZXN0cm95ZWQgZHVyaW5nIHRoZSBtdXRhdGlvbiBwaGFzZSBzbyB0aGF0IGFsbFxuICAgICAgICAgIC8vIGRlc3Ryb3kgZnVuY3Rpb25zIGZvciBhbGwgZmliZXJzIGFyZSBjYWxsZWQgYmVmb3JlIGFueSBjcmVhdGUgZnVuY3Rpb25zLlxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IHNob3VsZCBuZXZlciBvdmVycmlkZSBhIHJlZiBzZXRcbiAgICAgICAgICAvLyBieSBhIGNyZWF0ZSBmdW5jdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCBkdXJpbmcgdGhlIHNhbWUgY29tbWl0LlxuXG5cbiAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IENvbnRlbnRSZXNldCBnZXRzIGNsZWFyZWQgYnkgdGhlIGNoaWxkcmVuIGR1cmluZyB0aGUgY29tbWl0XG4gICAgICAgICAgLy8gcGhhc2UuIFRoaXMgaXMgYSByZWZhY3RvciBoYXphcmQgYmVjYXVzZSBpdCBtZWFucyB3ZSBtdXN0IHJlYWRcbiAgICAgICAgICAvLyBmbGFncyB0aGUgZmxhZ3MgYWZ0ZXIgYGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0c2AgaGFzIGFscmVhZHkgcnVuO1xuICAgICAgICAgIC8vIHRoZSBvcmRlciBtYXR0ZXJzLiBXZSBzaG91bGQgcmVmYWN0b3Igc28gdGhhdCBDb250ZW50UmVzZXQgZG9lcyBub3RcbiAgICAgICAgICAvLyByZWx5IG9uIG11dGF0aW5nIHRoZSBmbGFnIGR1cmluZyBjb21taXQuIExpa2UgYnkgc2V0dGluZyBhIGZsYWdcbiAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSBpbnN0ZWFkLlxuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlNCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChfaW5zdGFuY2U0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gQ29tbWl0IHRoZSB3b3JrIHByZXBhcmVkIGVhcmxpZXIuXG4gICAgICAgICAgICAgIHZhciBuZXdQcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpblxuICAgICAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgICAgdmFyIG9sZFByb3BzID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG5ld1Byb3BzO1xuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlOyAvLyBUT0RPOiBUeXBlIHRoZSB1cGRhdGVRdWV1ZSB0byBiZSBzcGVjaWZpYyB0byBob3N0IGNvbXBvbmVudHMuXG5cbiAgICAgICAgICAgICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29tbWl0VXBkYXRlKF9pbnN0YW5jZTQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgc2hvdWxkIGhhdmUgYSB0ZXh0IG5vZGUgaW5pdGlhbGl6ZWQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICB2YXIgbmV3VGV4dCA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3VGV4dDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgcHJldlJvb3RTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgICAgICBpZiAocHJldlJvb3RTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29tbWl0SHlkcmF0ZWRDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIHZhciBvZmZzY3JlZW5GaWJlciA9IGZpbmlzaGVkV29yay5jaGlsZDtcblxuICAgICAgICBpZiAob2Zmc2NyZWVuRmliZXIuZmxhZ3MgJiBWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIG9mZnNjcmVlbkluc3RhbmNlID0gb2Zmc2NyZWVuRmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBuZXdTdGF0ZSA9IG9mZnNjcmVlbkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIGlzSGlkZGVuID0gbmV3U3RhdGUgIT09IG51bGw7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHN0YXRlIG9uIHRoZSBPZmZzY3JlZW4gaW5zdGFuY2Ugc28gd2UgY2FuXG4gICAgICAgICAgLy8gcmVhZCBpdCBkdXJpbmcgYW4gZXZlbnRcblxuICAgICAgICAgIG9mZnNjcmVlbkluc3RhbmNlLmlzSGlkZGVuID0gaXNIaWRkZW47XG5cbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIHZhciB3YXNIaWRkZW4gPSBvZmZzY3JlZW5GaWJlci5hbHRlcm5hdGUgIT09IG51bGwgJiYgb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICAgIGlmICghd2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdG8gcGFzc2l2ZSBwaGFzZVxuICAgICAgICAgICAgICBtYXJrQ29tbWl0VGltZU9mRmFsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0U3VzcGVuc2VDYWxsYmFjayhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF93YXNIaWRkZW4gPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoIC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlYWQgZmxhZ1xuICAgICAgICAgZmluaXNoZWRXb3JrLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICAgIC8vIEJlZm9yZSBjb21taXR0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgb24gdGhlIHN0YWNrIHdoZXRoZXIgdGhpc1xuICAgICAgICAgIC8vIG9mZnNjcmVlbiBzdWJ0cmVlIHdhcyBhbHJlYWR5IGhpZGRlbiwgc28gdGhhdCB3ZSBkb24ndCB1bm1vdW50IHRoZVxuICAgICAgICAgIC8vIGVmZmVjdHMgYWdhaW4uXG4gICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgX3dhc0hpZGRlbjtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgX29mZnNjcmVlbkluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgX25ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICB2YXIgX2lzSGlkZGVuID0gX25ld1N0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgdmFyIG9mZnNjcmVlbkJvdW5kYXJ5ID0gZmluaXNoZWRXb3JrOyAvLyBUcmFjayB0aGUgY3VycmVudCBzdGF0ZSBvbiB0aGUgT2Zmc2NyZWVuIGluc3RhbmNlIHNvIHdlIGNhblxuICAgICAgICAgIC8vIHJlYWQgaXQgZHVyaW5nIGFuIGV2ZW50XG5cbiAgICAgICAgICBfb2Zmc2NyZWVuSW5zdGFuY2UuaXNIaWRkZW4gPSBfaXNIaWRkZW47XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoX2lzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGlmICghX3dhc0hpZGRlbikge1xuICAgICAgICAgICAgICAgIGlmICgob2Zmc2NyZWVuQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQm91bmRhcnk7XG4gICAgICAgICAgICAgICAgICB2YXIgb2Zmc2NyZWVuQ2hpbGQgPSBvZmZzY3JlZW5Cb3VuZGFyeS5jaGlsZDtcblxuICAgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNjcmVlbkNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBvZmZzY3JlZW5DaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihvZmZzY3JlZW5DaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQ2hpbGQuc2libGluZztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIHJ1biB3aGVuZXZlciB0aGVyZSdzIGFuIGluc2VydGlvbiBvciB1cGRhdGVcbiAgICAgICAgICAgIC8vIGluc2lkZSBhIGhpZGRlbiBPZmZzY3JlZW4gdHJlZS5cbiAgICAgICAgICAgIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKG9mZnNjcmVlbkJvdW5kYXJ5LCBfaXNIaWRkZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gUGxhY2VtZW50IGVmZmVjdHMgKGluc2VydGlvbnMsIHJlb3JkZXJzKSBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlclxuICAvLyB0eXBlLiBUaGV5IG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgY2hpbGRyZW4gZWZmZWN0cyBoYXZlIGZpcmVkLCBidXRcbiAgLy8gYmVmb3JlIHRoZSBlZmZlY3RzIG9uIHRoaXMgZmliZXIgaGF2ZSBmaXJlZC5cbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmIChmbGFncyAmIFBsYWNlbWVudCkge1xuICAgIHRyeSB7XG4gICAgICBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgfSAvLyBDbGVhciB0aGUgXCJwbGFjZW1lbnRcIiBmcm9tIGVmZmVjdCB0YWcgc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhpcyBpc1xuICAgIC8vIGluc2VydGVkLCBiZWZvcmUgYW55IGxpZmUtY3ljbGVzIGxpa2UgY29tcG9uZW50RGlkTW91bnQgZ2V0cyBjYWxsZWQuXG4gICAgLy8gVE9ETzogZmluZERPTU5vZGUgZG9lc24ndCByZWx5IG9uIHRoaXMgYW55IG1vcmUgYnV0IGlzTW91bnRlZCBkb2VzXG4gICAgLy8gYW5kIGlzTW91bnRlZCBpcyBkZXByZWNhdGVkIGFueXdheSBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBraWxsIHRoaXMuXG5cblxuICAgIGZpbmlzaGVkV29yay5mbGFncyAmPSB+UGxhY2VtZW50O1xuICB9XG5cbiAgaWYgKGZsYWdzICYgSHlkcmF0aW5nKSB7XG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5IeWRyYXRpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IGNvbW1pdHRlZExhbmVzO1xuICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgLy8gU3VzcGVuc2UgbGF5b3V0IGVmZmVjdHMgc2VtYW50aWNzIGRvbid0IGNoYW5nZSBmb3IgbGVnYWN5IHJvb3RzLlxuICB2YXIgaXNNb2Rlcm5Sb290ID0gKHN1YnRyZWVSb290Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICggZmliZXIudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQgJiYgaXNNb2Rlcm5Sb290KSB7XG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBzdGFjaydzIHN0YXRlLlxuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBpc0hpZGRlbiB8fCBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG5cbiAgICAgIGlmIChuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4pIHtcbiAgICAgICAgLy8gVGhlIE9mZnNjcmVlbiB0cmVlIGlzIGhpZGRlbi4gU2tpcCBvdmVyIGl0cyBsYXlvdXQgZWZmZWN0cy5cbiAgICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBBbHNvIGNoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRNYXNrXG4gICAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICB2YXIgd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gd2FzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuOyAvLyBUcmF2ZXJzZSB0aGUgT2Zmc2NyZWVuIHN1YnRyZWUgd2l0aCB0aGUgY3VycmVudCBPZmZzY3JlZW4gYXMgdGhlIHJvb3QuXG5cbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcblxuICAgICAgICBpZiAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiAmJiAhcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByb290IG9mIGEgcmVhcHBlYXJpbmcgYm91bmRhcnkuIFR1cm4gaXRzIGxheW91dCBlZmZlY3RzXG4gICAgICAgICAgLy8gYmFjayBvbi5cbiAgICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKGZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZCA9IGZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgICAgICAgIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oY2hpbGQsIC8vIE5ldyByb290OyBidWJibGUgYmFjayB1cCB0byBoZXJlIGFuZCBzdG9wLlxuICAgICAgICAgIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gUmVzdG9yZSBPZmZzY3JlZW4gc3RhdGUgYW5kIHJlc3VtZSBpbiBvdXItcHJvZ3Jlc3MgdHJhdmVyc2FsLlxuXG5cbiAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzICYmIGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdExheW91dEVmZmVjdE9uRmliZXIocm9vdCwgY3VycmVudCwgZmliZXIsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgKFJlZlN0YXRpYyB8IExheW91dFN0YXRpYylcblxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCBmaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIFJlZlN0YXRpY1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZmliZXIsIGZpYmVyLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYVxuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBhbHJlYWR5IGhpZGRlbi4gRG9uJ3QgZGlzYXBwZWFyXG4gICAgICAgICAgICAvLyBpdHMgZWZmZWN0cy5cbiAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpY1xuXG5cbiAgICBpZiAoZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmIChmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCkge1xuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBzdGlsbCBoaWRkZW4uIERvbid0IHJlLWFwcGVhciBpdHMgZWZmZWN0cy5cbiAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuXG4gICAgaWYgKGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbm9kZSBtYXkgaGF2ZSBiZWVuIHJldXNlZCBmcm9tIGEgcHJldmlvdXMgcmVuZGVyLCBzbyB3ZSBjYW4ndFxuICAgICAgLy8gYXNzdW1lIGl0cyByZXR1cm4gcG9pbnRlciBpcyBjb3JyZWN0LlxuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIExheW91dFN0YXRpY1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgIHRyeSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNPbkZpYmVyKGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0XG4gICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuXG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICBuZXh0RWZmZWN0ID0gZmluaXNoZWRXb3JrO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2JlZ2luKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXRQYXNzaXZlTW91bnRPbkZpYmVyKHJvb3QsIGZpYmVyLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKGZpcnN0Q2hpbGQpIHtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpO1xufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfYmVnaW4oKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgobmV4dEVmZmVjdC5mbGFncyAmIENoaWxkRGVsZXRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgZGVsZXRpb25zID0gZmliZXIuZGVsZXRpb25zO1xuXG4gICAgICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpYmVyVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyVG9EZWxldGU7XG4gICAgICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihmaWJlclRvRGVsZXRlLCBmaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gQSBmaWJlciB3YXMgZGVsZXRlZCBmcm9tIHRoaXMgcGFyZW50IGZpYmVyLCBidXQgaXQncyBzdGlsbCBwYXJ0IG9mXG4gICAgICAgICAgLy8gdGhlIHByZXZpb3VzIChhbHRlcm5hdGUpIHBhcmVudCBmaWJlcidzIGxpc3Qgb2YgY2hpbGRyZW4uIEJlY2F1c2VcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhcmUgYSBsaW5rZWQgbGlzdCwgYW4gZWFybGllciBzaWJsaW5nIHRoYXQncyBzdGlsbCBhbGl2ZVxuICAgICAgICAgIC8vIHdpbGwgYmUgY29ubmVjdGVkIHRvIHRoZSBkZWxldGVkIGZpYmVyIHZpYSBpdHMgYGFsdGVybmF0ZWA6XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tYWx0ZXJuYXRlLS0+IHByZXZpb3VzIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tc2libGluZy0tPiBkZWxldGVkIGZpYmVyXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXZSBjYW4ndCBkaXNjb25uZWN0IGBhbHRlcm5hdGVgIG9uIG5vZGVzIHRoYXQgaGF2ZW4ndCBiZWVuIGRlbGV0ZWRcbiAgICAgICAgICAvLyB5ZXQsIGJ1dCB3ZSBjYW4gZGlzY29ubmVjdCB0aGUgYHNpYmxpbmdgIGFuZCBgY2hpbGRgIHBvaW50ZXJzLlxuICAgICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBkZXRhY2hlZENoaWxkID0gcHJldmlvdXNGaWJlci5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNGaWJlci5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBkZXRhY2hlZFNpYmxpbmcgPSBkZXRhY2hlZENoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBkZXRhY2hlZENoaWxkID0gZGV0YWNoZWRTaWJsaW5nO1xuICAgICAgICAgICAgICB9IHdoaWxlIChkZXRhY2hlZENoaWxkICE9PSBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2NvbXBsZXRlKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmliZXIpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihmaW5pc2hlZFdvcmspIHtcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oZGVsZXRlZFN1YnRyZWVSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gRGVsZXRpb24gZWZmZWN0cyBmaXJlIGluIHBhcmVudCAtPiBjaGlsZCBvcmRlclxuICAgIC8vIFRPRE86IENoZWNrIGlmIGZpYmVyIGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZ1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihmaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETzogT25seSB0cmF2ZXJzZSBzdWJ0cmVlIGlmIGl0IGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZy4gKEJ1dCwgaWYgd2VcbiAgICAvLyBkbyB0aGlzLCBzdGlsbCBuZWVkIHRvIGhhbmRsZSBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGNvcnJlY3RseS4pXG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2NvbXBsZXRlKGRlbGV0ZWRTdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfY29tcGxldGUoZGVsZXRlZFN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG4gICAgdmFyIHJldHVybkZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAge1xuICAgICAgLy8gUmVjdXJzaXZlbHkgdHJhdmVyc2UgdGhlIGVudGlyZSBkZWxldGVkIHRyZWUgYW5kIGNsZWFuIHVwIGZpYmVyIGZpZWxkcy5cbiAgICAgIC8vIFRoaXMgaXMgbW9yZSBhZ2dyZXNzaXZlIHRoYW4gaWRlYWwsIGFuZCB0aGUgbG9uZyB0ZXJtIGdvYWwgaXMgdG8gb25seVxuICAgICAgLy8gaGF2ZSB0byBkZXRhY2ggdGhlIGRlbGV0ZWQgdHJlZSBhdCB0aGUgcm9vdC5cbiAgICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKTtcblxuICAgICAgaWYgKGZpYmVyID09PSBkZWxldGVkU3VidHJlZVJvb3QpIHtcbiAgICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSByZXR1cm5GaWJlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHN3aXRjaCAoY3VycmVudC50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxLCBjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59IC8vIFRPRE86IFJldXNlIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyB0cmF2ZXJzYWwgaGVyZT9cblxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmliZXIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaWJlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RVbm1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdFVubW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIENPTVBPTkVOVF9UWVBFID0gMDtcbnZhciBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSAxO1xudmFyIFJPTEVfVFlQRSA9IDI7XG52YXIgVEVTVF9OQU1FX1RZUEUgPSAzO1xudmFyIFRFWFRfVFlQRSA9IDQ7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIENPTVBPTkVOVF9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5jb21wb25lbnQnKTtcbiAgSEFTX1BTRVVET19DTEFTU19UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5oYXNfcHNldWRvX2NsYXNzJyk7XG4gIFJPTEVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3Iucm9sZScpO1xuICBURVNUX05BTUVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IudGVzdF9pZCcpO1xuICBURVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnRleHQnKTtcbn1cbnZhciBjb21taXRIb29rcyA9IFtdO1xuZnVuY3Rpb24gb25Db21taXRSb290JDEoKSB7XG4gIHtcbiAgICBjb21taXRIb29rcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21taXRIb29rKSB7XG4gICAgICByZXR1cm4gY29tbWl0SG9vaygpO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlO1xuZnVuY3Rpb24gaXNMZWdhY3lBY3RFbnZpcm9ubWVudChmaWJlcikge1xuICB7XG4gICAgLy8gTGVnYWN5IG1vZGUuIFdlIHByZXNlcnZlIHRoZSBiZWhhdmlvciBvZiBSZWFjdCAxNydzIGFjdC4gSXQgYXNzdW1lcyBhblxuICAgIC8vIGFjdCBlbnZpcm9ubWVudCB3aGVuZXZlciBgamVzdGAgaXMgZGVmaW5lZCwgYnV0IHlvdSBjYW4gc3RpbGwgdHVybiBvZmZcbiAgICAvLyBzcHVyaW91cyB3YXJuaW5ncyBieSBzZXR0aW5nIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBleHBsaWNpdGx5XG4gICAgLy8gdG8gZmFsc2UuXG4gICAgdmFyIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCA9IC8vICRGbG93RXhwZWN0ZWRFcnJvciDigJMgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGdsb2JhbFxuICAgIHR5cGVvZiBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgIT09ICd1bmRlZmluZWQnID8gSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIDogdW5kZWZpbmVkOyAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBqZXN0XG5cbiAgICB2YXIgamVzdElzRGVmaW5lZCA9IHR5cGVvZiBqZXN0ICE9PSAndW5kZWZpbmVkJztcbiAgICByZXR1cm4gIGplc3RJc0RlZmluZWQgJiYgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICE9PSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSB7XG4gIHtcbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIOKAkyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gcmVsZXZhbnQgZG9jdW1lbnRhdGlvbiBwYWdlLlxuICAgICAgZXJyb3IoJ1RoZSBjdXJyZW50IHRlc3RpbmcgZW52aXJvbm1lbnQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCAnICsgJ2FjdCguLi4pJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbDtcbiAgfVxufVxuXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcixcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsXG4gICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlO1xudmFyIE5vQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAqL1xuMDtcbnZhciBCYXRjaGVkQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICovXG4xO1xudmFyIFJlbmRlckNvbnRleHQgPVxuLyogICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgQ29tbWl0Q29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBSb290SW5Qcm9ncmVzcyA9IDA7XG52YXIgUm9vdEZhdGFsRXJyb3JlZCA9IDE7XG52YXIgUm9vdEVycm9yZWQgPSAyO1xudmFyIFJvb3RTdXNwZW5kZWQgPSAzO1xudmFyIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgPSA0O1xudmFyIFJvb3RDb21wbGV0ZWQgPSA1O1xudmFyIFJvb3REaWROb3RDb21wbGV0ZSA9IDY7IC8vIERlc2NyaWJlcyB3aGVyZSB3ZSBhcmUgaW4gdGhlIFJlYWN0IGV4ZWN1dGlvbiBzdGFja1xuXG52YXIgZXhlY3V0aW9uQ29udGV4dCA9IE5vQ29udGV4dDsgLy8gVGhlIHJvb3Qgd2UncmUgd29ya2luZyBvblxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDsgLy8gVGhlIGZpYmVyIHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzID0gbnVsbDsgLy8gVGhlIGxhbmVzIHdlJ3JlIHJlbmRlcmluZ1xuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBTdGFjayB0aGF0IGFsbG93cyBjb21wb25lbnRzIHRvIGNoYW5nZSB0aGUgcmVuZGVyIGxhbmVzIGZvciBpdHMgc3VidHJlZVxuLy8gVGhpcyBpcyBhIHN1cGVyc2V0IG9mIHRoZSBsYW5lcyB3ZSBzdGFydGVkIHdvcmtpbmcgb24gYXQgdGhlIHJvb3QuIFRoZSBvbmx5XG4vLyBjYXNlIHdoZXJlIGl0J3MgZGlmZmVyZW50IGZyb20gYHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzYCBpcyB3aGVuIHdlXG4vLyBlbnRlciBhIHN1YnRyZWUgdGhhdCBpcyBoaWRkZW4gYW5kIG5lZWRzIHRvIGJlIHVuaGlkZGVuOiBTdXNwZW5zZSBhbmRcbi8vIE9mZnNjcmVlbiBjb21wb25lbnQuXG4vL1xuLy8gTW9zdCB0aGluZ3MgaW4gdGhlIHdvcmsgbG9vcCBzaG91bGQgZGVhbCB3aXRoIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLlxuLy8gTW9zdCB0aGluZ3MgaW4gYmVnaW4vY29tcGxldGUgcGhhc2VzIHNob3VsZCBkZWFsIHdpdGggc3VidHJlZVJlbmRlckxhbmVzLlxuXG52YXIgc3VidHJlZVJlbmRlckxhbmVzID0gTm9MYW5lcztcbnZhciBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTm9MYW5lcyk7IC8vIFdoZXRoZXIgdG8gcm9vdCBjb21wbGV0ZWQsIGVycm9yZWQsIHN1c3BlbmRlZCwgZXRjLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzOyAvLyBBIGZhdGFsIGVycm9yLCBpZiBvbmUgaXMgdGhyb3duXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gbnVsbDsgLy8gXCJJbmNsdWRlZFwiIGxhbmVzIHJlZmVyIHRvIGxhbmVzIHRoYXQgd2VyZSB3b3JrZWQgb24gZHVyaW5nIHRoaXMgcmVuZGVyLiBJdCdzXG4vLyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiBgcmVuZGVyTGFuZXNgIGJlY2F1c2UgYHJlbmRlckxhbmVzYCBjYW4gY2hhbmdlIGFzIHlvdVxuLy8gZW50ZXIgYW5kIGV4aXQgYW4gT2Zmc2NyZWVuIHRyZWUuIFRoaXMgdmFsdWUgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGFsbCByZW5kZXJcbi8vIGxhbmVzIGZvciB0aGUgZW50aXJlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgd29yayBsZWZ0IG92ZXIgYnkgY29tcG9uZW50cyB0aGF0IHdlcmUgdmlzaXRlZCBkdXJpbmcgdGhpcyByZW5kZXIuIE9ubHlcbi8vIGluY2x1ZGVzIHVucHJvY2Vzc2VkIHVwZGF0ZXMsIG5vdCB3b3JrIGluIGJhaWxlZCBvdXQgY2hpbGRyZW4uXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCAoaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQpIGR1cmluZyB0aGlzIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UgKCpub3QqIGFuIGludGVybGVhdmVkIGV2ZW50KS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lczsgLy8gRXJyb3JzIHRoYXQgYXJlIHRocm93biBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBudWxsOyAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgd2UgcmVjb3ZlcmVkIGZyb20gd2l0aG91dCBzdXJmYWNpbmcgdGhlbSB0byB0aGUgVUkuXG4vLyBXZSB3aWxsIGxvZyB0aGVtIG9uY2UgdGhlIHRyZWUgY29tbWl0cy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDsgLy8gVGhlIG1vc3QgcmVjZW50IHRpbWUgd2UgY29tbWl0dGVkIGEgZmFsbGJhY2suIFRoaXMgbGV0cyB1cyBlbnN1cmUgYSB0cmFpblxuLy8gbW9kZWwgd2hlcmUgd2UgZG9uJ3QgY29tbWl0IG5ldyBsb2FkaW5nIHN0YXRlcyBpbiB0b28gcXVpY2sgc3VjY2Vzc2lvbi5cblxudmFyIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwO1xudmFyIEZBTExCQUNLX1RIUk9UVExFX01TID0gNTAwOyAvLyBUaGUgYWJzb2x1dGUgdGltZSBmb3Igd2hlbiB3ZSBzaG91bGQgc3RhcnQgZ2l2aW5nIHVwIG9uIHJlbmRlcmluZ1xuLy8gbW9yZSBhbmQgcHJlZmVyIENQVSBzdXNwZW5zZSBoZXVyaXN0aWNzIGluc3RlYWQuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gSW5maW5pdHk7IC8vIEhvdyBsb25nIGEgcmVuZGVyIGlzIHN1cHBvc2VkIHRvIHRha2UgYmVmb3JlIHdlIHN0YXJ0IGZvbGxvd2luZyBDUFVcbi8vIHN1c3BlbnNlIGhldXJpc3RpY3MgYW5kIG9wdCBvdXQgb2YgcmVuZGVyaW5nIG1vcmUgY29udGVudC5cblxudmFyIFJFTkRFUl9USU1FT1VUX01TID0gNTAwO1xudmFyIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBudWxsO1xuXG5mdW5jdGlvbiByZXNldFJlbmRlclRpbWVyKCkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gbm93KCkgKyBSRU5ERVJfVElNRU9VVF9NUztcbn1cblxuZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWU7XG59XG52YXIgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xudmFyIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG52YXIgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsOyAvLyBPbmx5IHVzZWQgd2hlbiBlbmFibGVQcm9maWxlck5lc3RlZFVwZGF0ZVNjaGVkdWxlZEhvb2sgaXMgdHJ1ZTtcbnZhciByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDtcbnZhciBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG52YXIgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMgPSBbXTtcbnZhciBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDsgLy8gVXNlIHRoZXNlIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiBuZXN0ZWQgdXBkYXRlc1xuXG52YXIgTkVTVEVEX1VQREFURV9MSU1JVCA9IDUwO1xudmFyIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbnZhciByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xudmFyIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciBORVNURURfUEFTU0lWRV9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsOyAvLyBJZiB0d28gdXBkYXRlcyBhcmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUgc2FtZSBldmVudCwgd2Ugc2hvdWxkIHRyZWF0IHRoZWlyXG4vLyBldmVudCB0aW1lcyBhcyBzaW11bHRhbmVvdXMsIGV2ZW4gaWYgdGhlIGFjdHVhbCBjbG9jayB0aW1lIGhhcyBhZHZhbmNlZFxuLy8gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG52YXIgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xudmFyIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lcztcbnZhciBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldFdvcmtJblByb2dyZXNzUm9vdCgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdDtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RFdmVudFRpbWUoKSB7XG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICAvLyBXZSdyZSBpbnNpZGUgUmVhY3QsIHNvIGl0J3MgZmluZSB0byByZWFkIHRoZSBhY3R1YWwgdGltZS5cbiAgICByZXR1cm4gbm93KCk7XG4gIH0gLy8gV2UncmUgbm90IGluc2lkZSBSZWFjdCwgc28gd2UgbWF5IGJlIGluIHRoZSBtaWRkbGUgb2YgYSBicm93c2VyIGV2ZW50LlxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFRpbWUgIT09IE5vVGltZXN0YW1wKSB7XG4gICAgLy8gVXNlIHRoZSBzYW1lIHN0YXJ0IHRpbWUgZm9yIGFsbCB1cGRhdGVzIHVudGlsIHdlIGVudGVyIFJlYWN0IGFnYWluLlxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xuICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZSBzaW5jZSBSZWFjdCB5aWVsZGVkLiBDb21wdXRlIGEgbmV3IHN0YXJ0IHRpbWUuXG5cblxuICBjdXJyZW50RXZlbnRUaW1lID0gbm93KCk7XG4gIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xufVxuZnVuY3Rpb24gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpIHtcbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH0gZWxzZSBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBUaGVzZSBhcmUgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLiBUaGVcbiAgICAvLyBvbGQgYmVoYXZpb3IgaXMgdG8gZ2l2ZSB0aGlzIHRoZSBzYW1lIFwidGhyZWFkXCIgKGxhbmVzKSBhc1xuICAgIC8vIHdoYXRldmVyIGlzIGN1cnJlbnRseSByZW5kZXJpbmcuIFNvIGlmIHlvdSBjYWxsIGBzZXRTdGF0ZWAgb24gYSBjb21wb25lbnRcbiAgICAvLyB0aGF0IGhhcHBlbnMgbGF0ZXIgaW4gdGhlIHNhbWUgcmVuZGVyLCBpdCB3aWxsIGZsdXNoLiBJZGVhbGx5LCB3ZSB3YW50IHRvXG4gICAgLy8gcmVtb3ZlIHRoZSBzcGVjaWFsIGNhc2UgYW5kIHRyZWF0IHRoZW0gYXMgaWYgdGhleSBjYW1lIGZyb20gYW5cbiAgICAvLyBpbnRlcmxlYXZlZCBldmVudC4gUmVnYXJkbGVzcywgdGhpcyBwYXR0ZXJuIGlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC5cbiAgICAvLyBUaGlzIGJlaGF2aW9yIGlzIG9ubHkgYSBmYWxsYmFjay4gVGhlIGZsYWcgb25seSBleGlzdHMgdW50aWwgd2UgY2FuIHJvbGxcbiAgICAvLyBvdXQgdGhlIHNldFN0YXRlIHdhcm5pbmcsIHNpbmNlIGV4aXN0aW5nIGNvZGUgbWlnaHQgYWNjaWRlbnRhbGx5IHJlbHkgb25cbiAgICAvLyB0aGUgY3VycmVudCBiZWhhdmlvci5cbiAgICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmUod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIGlzVHJhbnNpdGlvbiA9IHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpICE9PSBOb1RyYW5zaXRpb247XG5cbiAgaWYgKGlzVHJhbnNpdGlvbikge1xuICAgIGlmICggUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICAgICAgaWYgKCF0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzKSB7XG4gICAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7XG4gICAgICB9XG5cbiAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuYWRkKGZpYmVyKTtcbiAgICB9IC8vIFRoZSBhbGdvcml0aG0gZm9yIGFzc2lnbmluZyBhbiB1cGRhdGUgdG8gYSBsYW5lIHNob3VsZCBiZSBzdGFibGUgZm9yIGFsbFxuICAgIC8vIHVwZGF0ZXMgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aGluIHRoZSBzYW1lIGV2ZW50LiBUbyBkbyB0aGlzLCB0aGVcbiAgICAvLyBpbnB1dHMgdG8gdGhlIGFsZ29yaXRobSBtdXN0IGJlIHRoZSBzYW1lLlxuICAgIC8vXG4gICAgLy8gVGhlIHRyaWNrIHdlIHVzZSBpcyB0byBjYWNoZSB0aGUgZmlyc3Qgb2YgZWFjaCBvZiB0aGVzZSBpbnB1dHMgd2l0aGluIGFuXG4gICAgLy8gZXZlbnQuIFRoZW4gcmVzZXQgdGhlIGNhY2hlZCB2YWx1ZXMgb25jZSB3ZSBjYW4gYmUgc3VyZSB0aGUgZXZlbnQgaXNcbiAgICAvLyBvdmVyLiBPdXIgaGV1cmlzdGljIGZvciB0aGF0IGlzIHdoZW5ldmVyIHdlIGVudGVyIGEgY29uY3VycmVudCB3b3JrIGxvb3AuXG5cblxuICAgIGlmIChjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAvLyBBbGwgdHJhbnNpdGlvbnMgd2l0aGluIHRoZSBzYW1lIGV2ZW50IGFyZSBhc3NpZ25lZCB0aGUgc2FtZSBsYW5lLlxuICAgICAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZTtcbiAgfSAvLyBVcGRhdGVzIG9yaWdpbmF0aW5nIGluc2lkZSBjZXJ0YWluIFJlYWN0IG1ldGhvZHMsIGxpa2UgZmx1c2hTeW5jLCBoYXZlXG4gIC8vIHRoZWlyIHByaW9yaXR5IHNldCBieSB0cmFja2luZyBpdCB3aXRoIGEgY29udGV4dCB2YXJpYWJsZS5cbiAgLy9cbiAgLy8gVGhlIG9wYXF1ZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbmZpZyBpcyBpbnRlcm5hbGx5IGEgbGFuZSwgc28gd2UgY2FuXG4gIC8vIHVzZSB0aGF0IGRpcmVjdGx5LlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIHRvIHRoZSBldmVudCBwcmlvcml0eSBtb2R1bGUuXG5cblxuICB2YXIgdXBkYXRlTGFuZSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gIGlmICh1cGRhdGVMYW5lICE9PSBOb0xhbmUpIHtcbiAgICByZXR1cm4gdXBkYXRlTGFuZTtcbiAgfSAvLyBUaGlzIHVwZGF0ZSBvcmlnaW5hdGVkIG91dHNpZGUgUmVhY3QuIEFzayB0aGUgaG9zdCBlbnZpcm9ubWVudCBmb3IgYW5cbiAgLy8gYXBwcm9wcmlhdGUgcHJpb3JpdHksIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGV2ZW50LlxuICAvL1xuICAvLyBUaGUgb3BhcXVlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29uZmlnIGlzIGludGVybmFsbHkgYSBsYW5lLCBzbyB3ZSBjYW5cbiAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuXG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS5cblxuXG4gIHZhciBldmVudExhbmUgPSBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSgpO1xuICByZXR1cm4gZXZlbnRMYW5lO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UmV0cnlMYW5lKGZpYmVyKSB7XG4gIC8vIFRoaXMgaXMgYSBmb3JrIG9mIGByZXF1ZXN0VXBkYXRlTGFuZWAgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciBTdXNwZW5zZVxuICAvLyBcInJldHJpZXNcIiDigJQgYSBzcGVjaWFsIHVwZGF0ZSB0aGF0IGF0dGVtcHRzIHRvIGZsaXAgYSBTdXNwZW5zZSBib3VuZGFyeVxuICAvLyBmcm9tIGl0cyBwbGFjZWhvbGRlciBzdGF0ZSB0byBpdHMgcHJpbWFyeS9yZXNvbHZlZCBzdGF0ZS5cbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH1cblxuICByZXR1cm4gY2xhaW1OZXh0UmV0cnlMYW5lKCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpO1xuXG4gIHtcbiAgICBpZiAoaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KSB7XG4gICAgICBlcnJvcigndXNlSW5zZXJ0aW9uRWZmZWN0IG11c3Qgbm90IHNjaGVkdWxlIHVwZGF0ZXMuJyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIH1cbiAgfSAvLyBNYXJrIHRoYXQgdGhlIHJvb3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuXG5cblxuICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9MYW5lcyAmJiByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBUaGlzIHVwZGF0ZSB3YXMgZGlzcGF0Y2hlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpcyBpcyBhIG1pc3Rha2VcbiAgICAvLyBpZiB0aGUgdXBkYXRlIG9yaWdpbmF0ZXMgZnJvbSB1c2VyIHNwYWNlICh3aXRoIHRoZSBleGNlcHRpb24gb2YgbG9jYWxcbiAgICAvLyBob29rIHVwZGF0ZXMsIHdoaWNoIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGFuZCBkb24ndCByZWFjaCB0aGlzXG4gICAgLy8gZnVuY3Rpb24pLCBidXQgdGhlcmUgYXJlIHNvbWUgaW50ZXJuYWwgUmVhY3QgZmVhdHVyZXMgdGhhdCB1c2UgdGhpcyBhc1xuICAgIC8vIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbGlrZSBzZWxlY3RpdmUgaHlkcmF0aW9uLlxuICAgIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKTsgLy8gVHJhY2sgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2VcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgbm9ybWFsIHVwZGF0ZSwgc2NoZWR1bGVkIGZyb20gb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLiBGb3JcbiAgICAvLyBleGFtcGxlLCBkdXJpbmcgYW4gaW5wdXQgZXZlbnQuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKTtcblxuICAgIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAgIC8vIFJlY2VpdmVkIGFuIHVwZGF0ZSB0byBhIHRyZWUgdGhhdCdzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyaW5nLiBNYXJrXG4gICAgICAvLyB0aGF0IHRoZXJlIHdhcyBhbiBpbnRlcmxlYXZlZCB1cGRhdGUgd29yayBvbiB0aGlzIHJvb3QuIFVubGVzcyB0aGVcbiAgICAgIC8vIGBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2hgIGZsYWcgaXMgb2ZmIGFuZCB0aGlzIGlzIGEgcmVuZGVyXG4gICAgICAvLyBwaGFzZSB1cGRhdGUuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgdHJlYXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXMgaWZcbiAgICAgIC8vIHRoZXkgd2VyZSBpbnRlcmxlYXZlZCwgZm9yIGJhY2t3YXJkcyBjb21wYXQgcmVhc29ucy5cbiAgICAgIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcywgbGFuZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgICAgIC8vIFRoZSByb290IGFscmVhZHkgc3VzcGVuZGVkIHdpdGggYSBkZWxheSwgd2hpY2ggbWVhbnMgdGhpcyByZW5kZXJcbiAgICAgICAgLy8gZGVmaW5pdGVseSB3b24ndCBmaW5pc2guIFNpbmNlIHdlIGhhdmUgYSBuZXcgdXBkYXRlLCBsZXQncyBtYXJrIGl0IGFzXG4gICAgICAgIC8vIHN1c3BlbmRlZCBub3csIHJpZ2h0IGJlZm9yZSBtYXJraW5nIHRoZSBpbmNvbWluZyB1cGRhdGUuIFRoaXMgaGFzIHRoZVxuICAgICAgICAvLyBlZmZlY3Qgb2YgaW50ZXJydXB0aW5nIHRoZSBjdXJyZW50IHJlbmRlciBhbmQgc3dpdGNoaW5nIHRvIHRoZSB1cGRhdGUuXG4gICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3Qgb3ZlcnJpZGUgcGluZ3MgdGhhdCBoYXBwZW4gd2hpbGUgd2UndmVcbiAgICAgICAgLy8gYWxyZWFkeSBzdGFydGVkIHJlbmRlcmluZy5cbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG5cbiAgICBpZiAobGFuZSA9PT0gU3luY0xhbmUgJiYgZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS5cbiAgICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kpKSB7XG4gICAgICAvLyBGbHVzaCB0aGUgc3luY2hyb25vdXMgd29yayBub3csIHVubGVzcyB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgb3IgaW5zaWRlXG4gICAgICAvLyBhIGJhdGNoLiBUaGlzIGlzIGludGVudGlvbmFsbHkgaW5zaWRlIHNjaGVkdWxlVXBkYXRlT25GaWJlciBpbnN0ZWFkIG9mXG4gICAgICAvLyBzY2hlZHVsZUNhbGxiYWNrRm9yRmliZXIgdG8gcHJlc2VydmUgdGhlIGFiaWxpdHkgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgLy8gd2l0aG91dCBpbW1lZGlhdGVseSBmbHVzaGluZyBpdC4gV2Ugb25seSBkbyB0aGlzIGZvciB1c2VyLWluaXRpYXRlZFxuICAgICAgLy8gdXBkYXRlcywgdG8gcHJlc2VydmUgaGlzdG9yaWNhbCBiZWhhdmlvciBvZiBsZWdhY3kgbW9kZS5cbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpIHtcbiAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgZm9yayBvZiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgdGhhdCBpcyBvbmx5IHVzZWQgdG9cbiAgLy8gc2NoZWR1bGUgdGhlIGluaXRpYWwgaHlkcmF0aW9uIG9mIGEgcm9vdCB0aGF0IGhhcyBqdXN0IGJlZW4gY3JlYXRlZC4gTW9zdFxuICAvLyBvZiB0aGUgc3R1ZmYgaW4gc2NoZWR1bGVVcGRhdGVPbkZpYmVyIGNhbiBiZSBza2lwcGVkLlxuICAvL1xuICAvLyBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgc2VwYXJhdGUgcGF0aCwgdGhvdWdoLCBpcyB0byBkaXN0aW5ndWlzaCB0aGVcbiAgLy8gaW5pdGlhbCBjaGlsZHJlbiBmcm9tIHN1YnNlcXVlbnQgdXBkYXRlcy4gSW4gZnVsbHkgY2xpZW50LXJlbmRlcmVkIHJvb3RzXG4gIC8vIChjcmVhdGVSb290IGluc3RlYWQgb2YgaHlkcmF0ZVJvb3QpLCBhbGwgdG9wLWxldmVsIHJlbmRlcnMgYXJlIG1vZGVsZWQgYXNcbiAgLy8gdXBkYXRlcywgYnV0IGh5ZHJhdGlvbiByb290cyBhcmUgc3BlY2lhbCBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0XG4gIC8vIG1hdGNoIHdoYXQgd2FzIHJlbmRlcmVkIG9uIHRoZSBzZXJ2ZXIuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICBjdXJyZW50LmxhbmVzID0gbGFuZTtcbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuZnVuY3Rpb24gaXNVbnNhZmVDbGFzc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSB7XG4gIC8vIENoZWNrIGlmIHRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBPbmx5IGNhbGxlZCBieSBjbGFzcyBjb21wb25lbnRzLFxuICAvLyB3aGljaCBzcGVjaWFsIChkZXByZWNhdGVkKSBiZWhhdmlvciBmb3IgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlIHByb3BzLlxuICByZXR1cm4gKC8vIFRPRE86IFJlbW92ZSBvdXRkYXRlZCBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2ggZXhwZXJpbWVudC4gV2VcbiAgICAvLyBkZWNpZGVkIG5vdCB0byBlbmFibGUgaXQuXG4gICAgIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dFxuICApO1xufSAvLyBVc2UgdGhpcyBmdW5jdGlvbiB0byBzY2hlZHVsZSBhIHRhc2sgZm9yIGEgcm9vdC4gVGhlcmUncyBvbmx5IG9uZSB0YXNrIHBlclxuLy8gcm9vdDsgaWYgYSB0YXNrIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCwgd2UnbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwcmlvcml0eVxuLy8gb2YgdGhlIGV4aXN0aW5nIHRhc2sgaXMgdGhlIHNhbWUgYXMgdGhlIHByaW9yaXR5IG9mIHRoZSBuZXh0IGxldmVsIHRoYXQgdGhlXG4vLyByb290IGhhcyB3b3JrIG9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBldmVyeSB1cGRhdGUsIGFuZCByaWdodCBiZWZvcmVcbi8vIGV4aXRpbmcgYSB0YXNrLlxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFRoZXJlJ3Mgbm90aGluZyB0byB3b3JrIG9uLlxuICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgfVxuXG4gICAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgdXNlIHRoZSBoaWdoZXN0IHByaW9yaXR5IGxhbmUgdG8gcmVwcmVzZW50IHRoZSBwcmlvcml0eSBvZiB0aGUgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuICB2YXIgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID0gcm9vdC5jYWxsYmFja1ByaW9yaXR5O1xuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPT09IG5ld0NhbGxiYWNrUHJpb3JpdHkgJiYgLy8gU3BlY2lhbCBjYXNlIHJlbGF0ZWQgdG8gYGFjdGAuIElmIHRoZSBjdXJyZW50bHkgc2NoZWR1bGVkIHRhc2sgaXMgYVxuICAvLyBTY2hlZHVsZXIgdGFzaywgcmF0aGVyIHRoYW4gYW4gYGFjdGAgdGFzaywgY2FuY2VsIGl0IGFuZCByZS1zY2hlZHVsZWRcbiAgLy8gb24gdGhlIGBhY3RgIHF1ZXVlLlxuICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IGZha2VBY3RDYWxsYmFja05vZGUpKSB7XG4gICAge1xuICAgICAgLy8gSWYgd2UncmUgZ29pbmcgdG8gcmUtdXNlIGFuIGV4aXN0aW5nIHRhc2ssIGl0IG5lZWRzIHRvIGV4aXN0LlxuICAgICAgLy8gQXNzdW1lIHRoYXQgZGlzY3JldGUgdXBkYXRlIG1pY3JvdGFza3MgYXJlIG5vbi1jYW5jZWxsYWJsZSBhbmQgbnVsbC5cbiAgICAgIC8vIFRPRE86IFRlbXBvcmFyeSB1bnRpbCB3ZSBjb25maXJtIHRoaXMgd2FybmluZyBpcyBub3QgZmlyZWQuXG4gICAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgIT09IFN5bmNMYW5lKSB7XG4gICAgICAgIGVycm9yKCdFeHBlY3RlZCBzY2hlZHVsZWQgY2FsbGJhY2sgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cblxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9IG51bGwpIHtcbiAgICAvLyBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ldyBvbmUgYmVsb3cuXG4gICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gIH0gLy8gU2NoZWR1bGUgYSBuZXcgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tOb2RlO1xuXG4gIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jTGFuZSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIGlmIChyb290LnRhZyA9PT0gTGVnYWN5Um9vdCkge1xuICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kgIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVTeW5jQ2FsbGJhY2socGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBxdWV1ZSBpbiBhIG1pY3JvdGFzay5cbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEluc2lkZSBgYWN0YCwgdXNlIG91ciBpbnRlcm5hbCBgYWN0YCBxdWV1ZSBzbyB0aGF0IHRoZXNlIGdldCBmbHVzaGVkXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2NvcGUgZXZlbiB3aGVuIHVzaW5nIHRoZSBzeW5jIHZlcnNpb25cbiAgICAgICAgLy8gb2YgYGFjdGAuXG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudC5wdXNoKGZsdXNoU3luY0NhbGxiYWNrcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlZHVsZU1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gSW4gU2FmYXJpLCBhcHBlbmRpbmcgYW4gaWZyYW1lIGZvcmNlcyBtaWNyb3Rhc2tzIHRvIHJ1bi5cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIyNDU5XG4gICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBydW5uaW5nIGNhbGxiYWNrcyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlclxuICAgICAgICAgIC8vIG9yIGNvbW1pdCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgdGhhdC5cbiAgICAgICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyB3b3VsZCBzdGlsbCBwcmVtYXR1cmVseSBmbHVzaCB0aGUgY2FsbGJhY2tzXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgb3V0c2lkZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlIChlLmcuIGluIGFuIGV2ZW50KS5cbiAgICAgICAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3Q2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbDtcblxuICAgIHN3aXRjaCAobGFuZXNUb0V2ZW50UHJpb3JpdHkobmV4dExhbmVzKSkge1xuICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJbW1lZGlhdGVQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgSWRsZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJZGxlUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlQ2FsbGJhY2skMShzY2hlZHVsZXJQcmlvcml0eUxldmVsLCBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gIH1cblxuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBuZXdDYWxsYmFja1ByaW9yaXR5O1xuICByb290LmNhbGxiYWNrTm9kZSA9IG5ld0NhbGxiYWNrTm9kZTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIGV2ZXJ5IGNvbmN1cnJlbnQgdGFzaywgaS5lLiBhbnl0aGluZyB0aGF0XG4vLyBnb2VzIHRocm91Z2ggU2NoZWR1bGVyLlxuXG5cbmZ1bmN0aW9uIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdChyb290LCBkaWRUaW1lb3V0KSB7XG4gIHtcbiAgICByZXNldE5lc3RlZFVwZGF0ZUZsYWcoKTtcbiAgfSAvLyBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIGEgUmVhY3QgZXZlbnQsIHdlIGNhbiBjbGVhciB0aGUgY3VycmVudFxuICAvLyBldmVudCB0aW1lLiBUaGUgbmV4dCB1cGRhdGUgd2lsbCBjb21wdXRlIGEgbmV3IGV2ZW50IHRpbWUuXG5cblxuICBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lcztcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfSAvLyBGbHVzaCBhbnkgcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMgYmVmb3JlIGRlY2lkaW5nIHdoaWNoIGxhbmVzIHRvIHdvcmsgb24sXG4gIC8vIGluIGNhc2UgdGhleSBzY2hlZHVsZSBhZGRpdGlvbmFsIHdvcmsuXG5cblxuICB2YXIgb3JpZ2luYWxDYWxsYmFja05vZGUgPSByb290LmNhbGxiYWNrTm9kZTtcbiAgdmFyIGRpZEZsdXNoUGFzc2l2ZUVmZmVjdHMgPSBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG5cbiAgaWYgKGRpZEZsdXNoUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHBhc3NpdmUgZWZmZWN0IHBoYXNlIG1heSBoYXZlIGNhbmNlbGVkIHRoZSBjdXJyZW50IHRhc2suXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhc2sgbm9kZSBmb3IgdGhpcyByb290IHdhcyBjaGFuZ2VkLlxuICAgIGlmIChyb290LmNhbGxiYWNrTm9kZSAhPT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IHRhc2sgd2FzIGNhbmNlbGVkLiBFeGl0LiBXZSBkb24ndCBuZWVkIHRvIGNhbGxcbiAgICAgIC8vIGBlbnN1cmVSb290SXNTY2hlZHVsZWRgIGJlY2F1c2UgdGhlIGNoZWNrIGFib3ZlIGltcGxpZXMgZWl0aGVyIHRoYXRcbiAgICAgIC8vIHRoZXJlJ3MgYSBuZXcgdGFzaywgb3IgdGhhdCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrIG9uIHRoaXMgcm9vdC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSAvLyBEZXRlcm1pbmUgdGhlIG5leHQgbGFuZXMgdG8gd29yayBvbiwgdXNpbmcgdGhlIGZpZWxkcyBzdG9yZWRcbiAgLy8gb24gdGhlIHJvb3QuXG5cblxuICB2YXIgbGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ID8gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgOiBOb0xhbmVzKTtcblxuICBpZiAobGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBEZWZlbnNpdmUgY29kaW5nLiBUaGlzIGlzIG5ldmVyIGV4cGVjdGVkIHRvIGhhcHBlbi5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBXZSBkaXNhYmxlIHRpbWUtc2xpY2luZyBpbiBzb21lIGNhc2VzOiBpZiB0aGUgd29yayBoYXMgYmVlbiBDUFUtYm91bmRcbiAgLy8gZm9yIHRvbyBsb25nIChcImV4cGlyZWRcIiB3b3JrLCB0byBwcmV2ZW50IHN0YXJ2YXRpb24pLCBvciB3ZSdyZSBpblxuICAvLyBzeW5jLXVwZGF0ZXMtYnktZGVmYXVsdCBtb2RlLlxuICAvLyBUT0RPOiBXZSBvbmx5IGNoZWNrIGBkaWRUaW1lb3V0YCBkZWZlbnNpdmVseSwgdG8gYWNjb3VudCBmb3IgYSBTY2hlZHVsZXJcbiAgLy8gYnVnIHdlJ3JlIHN0aWxsIGludmVzdGlnYXRpbmcuIE9uY2UgdGhlIGJ1ZyBpbiBTY2hlZHVsZXIgaXMgZml4ZWQsXG4gIC8vIHdlIGNhbiByZW1vdmUgdGhpcywgc2luY2Ugd2UgdHJhY2sgZXhwaXJhdGlvbiBvdXJzZWx2ZXMuXG5cblxuICB2YXIgc2hvdWxkVGltZVNsaWNlID0gIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKSAmJiAhaW5jbHVkZXNFeHBpcmVkTGFuZShyb290LCBsYW5lcykgJiYgKCAhZGlkVGltZW91dCk7XG4gIHZhciBleGl0U3RhdHVzID0gc2hvdWxkVGltZVNsaWNlID8gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpIDogcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gIGlmIChleGl0U3RhdHVzICE9PSBSb290SW5Qcm9ncmVzcykge1xuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgICAgLy8gSWYgc29tZXRoaW5nIHRocmV3IGFuIGVycm9yLCB0cnkgcmVuZGVyaW5nIG9uZSBtb3JlIHRpbWUuIFdlJ2xsXG4gICAgICAvLyByZW5kZXIgc3luY2hyb25vdXNseSB0byBibG9jayBjb25jdXJyZW50IGRhdGEgbXV0YXRpb25zLCBhbmQgd2UnbGxcbiAgICAgIC8vIGluY2x1ZGVzIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlclxuICAgICAgLy8gdGhlIHNlY29uZCBhdHRlbXB0LCB3ZSdsbCBnaXZlIHVwIGFuZCBjb21taXQgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgICAgdmFyIGVycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgICBpZiAoZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIGxhbmVzID0gZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgdmFyIGZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgICB0aHJvdyBmYXRhbEVycm9yO1xuICAgIH1cblxuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHtcbiAgICAgIC8vIFRoZSByZW5kZXIgdW53b3VuZCB3aXRob3V0IGNvbXBsZXRpbmcgdGhlIHRyZWUuIFRoaXMgaGFwcGVucyBpbiBzcGVjaWFsXG4gICAgICAvLyBjYXNlcyB3aGVyZSBuZWVkIHRvIGV4aXQgdGhlIGN1cnJlbnQgcmVuZGVyIHdpdGhvdXQgcHJvZHVjaW5nIGFcbiAgICAgIC8vIGNvbnNpc3RlbnQgdHJlZSBvciBjb21taXR0aW5nLlxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGR1cmluZyBhIGNvbmN1cnJlbnQgcmVuZGVyLCBub3QgYSBkaXNjcmV0ZSBvclxuICAgICAgLy8gc3luY2hyb25vdXMgdXBkYXRlLiBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHRoaXMgd2hlbiB3ZVxuICAgICAgLy8gdW53b3VuZCB0aGUgc3RhY2suXG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJlbmRlciBjb21wbGV0ZWQuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIHJlbmRlciBtYXkgaGF2ZSB5aWVsZGVkIHRvIGEgY29uY3VycmVudCBldmVudCwgYW5kIGlmIHNvLFxuICAgICAgLy8gY29uZmlybSB0aGF0IGFueSBuZXdseSByZW5kZXJlZCBzdG9yZXMgYXJlIGNvbnNpc3RlbnQuXG4gICAgICAvLyBUT0RPOiBJdCdzIHBvc3NpYmxlIHRoYXQgZXZlbiBhIGNvbmN1cnJlbnQgcmVuZGVyIG1heSBuZXZlciBoYXZlIHlpZWxkZWRcbiAgICAgIC8vIHRvIHRoZSBtYWluIHRocmVhZCwgaWYgaXQgd2FzIGZhc3QgZW5vdWdoLCBvciBpZiBpdCBleHBpcmVkLiBXZSBjb3VsZFxuICAgICAgLy8gc2tpcCB0aGUgY29uc2lzdGVuY3kgY2hlY2sgaW4gdGhhdCBjYXNlLCB0b28uXG4gICAgICB2YXIgcmVuZGVyV2FzQ29uY3VycmVudCA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcyk7XG4gICAgICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHJlbmRlcldhc0NvbmN1cnJlbnQgJiYgIWlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspKSB7XG4gICAgICAgIC8vIEEgc3RvcmUgd2FzIG11dGF0ZWQgaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQuIFJlbmRlciBhZ2FpbixcbiAgICAgICAgLy8gc3luY2hyb25vdXNseSwgdG8gYmxvY2sgZnVydGhlciBtdXRhdGlvbnMuXG4gICAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7IC8vIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4gaWYgc29tZXRoaW5nIHRocmV3XG5cbiAgICAgICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICAgICAgdmFyIF9lcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgICAgIGlmIChfZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgICBsYW5lcyA9IF9lcnJvclJldHJ5TGFuZXM7XG4gICAgICAgICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgX2Vycm9yUmV0cnlMYW5lcyk7IC8vIFdlIGFzc3VtZSB0aGUgdHJlZSBpcyBub3cgY29uc2lzdGVudCBiZWNhdXNlIHdlIGRpZG4ndCB5aWVsZCB0byBhbnlcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgZXZlbnRzLlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgICAgICAgdmFyIF9mYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgICAgIHRocm93IF9mYXRhbEVycm9yO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBUaGUgbmV4dCBzdGVwIGlzIGVpdGhlciB0byBjb21taXQgaXQsXG4gICAgICAvLyBvciwgaWYgc29tZXRoaW5nIHN1c3BlbmRlZCwgd2FpdCB0byBjb21taXQgaXQgYWZ0ZXIgYSB0aW1lb3V0LlxuXG5cbiAgICAgIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICAgICAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gICAgICBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyb290LmNhbGxiYWNrTm9kZSA9PT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAvLyBUaGUgdGFzayBub2RlIHNjaGVkdWxlZCBmb3IgdGhpcyByb290IGlzIHRoZSBzYW1lIG9uZSB0aGF0J3NcbiAgICAvLyBjdXJyZW50bHkgZXhlY3V0ZWQuIE5lZWQgdG8gcmV0dXJuIGEgY29udGludWF0aW9uLlxuICAgIHJldHVybiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpIHtcbiAgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbiwgZGlzY2FyZCBzZXJ2ZXIgcmVzcG9uc2UgYW5kIGZhbGxcbiAgLy8gYmFjayB0byBjbGllbnQgc2lkZSByZW5kZXIuXG4gIC8vIEJlZm9yZSByZW5kZXJpbmcgYWdhaW4sIHNhdmUgdGhlIGVycm9ycyBmcm9tIHRoZSBwcmV2aW91cyBhdHRlbXB0LlxuICB2YXIgZXJyb3JzRnJvbUZpcnN0QXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnM7XG5cbiAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAvLyBUaGUgc2hlbGwgZmFpbGVkIHRvIGh5ZHJhdGUuIFNldCBhIGZsYWcgdG8gZm9yY2UgYSBjbGllbnQgcmVuZGVyaW5nXG4gICAgLy8gZHVyaW5nIHRoZSBuZXh0IGF0dGVtcHQuIFRvIGRvIHRoaXMsIHdlIGNhbGwgcHJlcGFyZUZyZXNoU3RhY2sgbm93XG4gICAgLy8gdG8gY3JlYXRlIHRoZSByb290IHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIFRoaXMgaXMgYSBiaXQgd2VpcmQgaW4gdGVybXNcbiAgICAvLyBvZiBmYWN0b3JpbmcsIGJlY2F1c2UgaXQgcmVsaWVzIG9uIHJlbmRlclJvb3RTeW5jIG5vdCBjYWxsaW5nXG4gICAgLy8gcHJlcGFyZUZyZXNoU3RhY2sgYWdhaW4gaW4gdGhlIGNhbGwgYmVsb3csIHdoaWNoIGhhcHBlbnMgYmVjYXVzZSB0aGVcbiAgICAvLyByb290IGFuZCBsYW5lcyBoYXZlbid0IGNoYW5nZWQuXG4gICAgLy9cbiAgICAvLyBUT0RPOiBJIHRoaW5rIHdoYXQgd2Ugc2hvdWxkIGRvIGlzIHNldCBGb3JjZUNsaWVudFJlbmRlciBpbnNpZGVcbiAgICAvLyB0aHJvd0V4Y2VwdGlvbiwgbGlrZSB3ZSBkbyBmb3IgbmVzdGVkIFN1c3BlbnNlIGJvdW5kYXJpZXMuIFRoZSByZWFzb25cbiAgICAvLyBpdCdzIGhlcmUgaW5zdGVhZCBpcyBzbyB3ZSBjYW4gc3dpdGNoIHRvIHRoZSBzeW5jaHJvbm91cyB3b3JrIGxvb3AsIHRvby5cbiAgICAvLyBTb21ldGhpbmcgdG8gY29uc2lkZXIgZm9yIGEgZnV0dXJlIHJlZmFjdG9yLlxuICAgIHZhciByb290V29ya0luUHJvZ3Jlc3MgPSBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgIHJvb3RXb3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcblxuICAgIHtcbiAgICAgIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuXG4gIGlmIChleGl0U3RhdHVzICE9PSBSb290RXJyb3JlZCkge1xuICAgIC8vIFN1Y2Nlc3NmdWxseSBmaW5pc2hlZCByZW5kZXJpbmcgb24gcmV0cnlcbiAgICAvLyBUaGUgZXJyb3JzIGZyb20gdGhlIGZhaWxlZCBmaXJzdCBhdHRlbXB0IGhhdmUgYmVlbiByZWNvdmVyZWQuIEFkZFxuICAgIC8vIHRoZW0gdG8gdGhlIGNvbGxlY3Rpb24gb2YgcmVjb3ZlcmFibGUgZXJyb3JzLiBXZSdsbCBsb2cgdGhlbSBpbiB0aGVcbiAgICAvLyBjb21taXQgcGhhc2UuXG4gICAgdmFyIGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0ID0gd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnM7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBlcnJvcnNGcm9tRmlyc3RBdHRlbXB0OyAvLyBUaGUgZXJyb3JzIGZyb20gdGhlIHNlY29uZCBhdHRlbXB0IHNob3VsZCBiZSBxdWV1ZWQgYWZ0ZXIgdGhlIGVycm9yc1xuICAgIC8vIGZyb20gdGhlIGZpcnN0IGF0dGVtcHQsIHRvIHByZXNlcnZlIHRoZSBjYXVzYWwgc2VxdWVuY2UuXG5cbiAgICBpZiAoZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQgIT09IG51bGwpIHtcbiAgICAgIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGl0U3RhdHVzO1xufVxuXG5mdW5jdGlvbiBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9ycykge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGVycm9ycztcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycy5wdXNoLmFwcGx5KHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCBlcnJvcnMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENvbmN1cnJlbnRSZW5kZXIocm9vdCwgZXhpdFN0YXR1cywgbGFuZXMpIHtcbiAgc3dpdGNoIChleGl0U3RhdHVzKSB7XG4gICAgY2FzZSBSb290SW5Qcm9ncmVzczpcbiAgICBjYXNlIFJvb3RGYXRhbEVycm9yZWQ6XG4gICAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIC8vIEZsb3cga25vd3MgYWJvdXQgaW52YXJpYW50LCBzbyBpdCBjb21wbGFpbnMgaWYgSSBhZGQgYSBicmVha1xuICAgIC8vIHN0YXRlbWVudCwgYnV0IGVzbGludCBkb2Vzbid0IGtub3cgYWJvdXQgaW52YXJpYW50LCBzbyBpdCBjb21wbGFpbnNcbiAgICAvLyBpZiBJIGRvLiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgUm9vdEVycm9yZWQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIHJldHJ5IHRoaXMgdHJlZS4gSWYgd2UgcmVhY2hlZFxuICAgICAgICAvLyB0aGlzIHBvaW50LCBpdCBlcnJvcmVkIGFnYWluLiBDb21taXQgaXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdFN1c3BlbmRlZDpcbiAgICAgIHtcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7IC8vIFdlIGhhdmUgYW4gYWNjZXB0YWJsZSBsb2FkaW5nIHN0YXRlLiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgd2VcbiAgICAgICAgLy8gc2hvdWxkIGltbWVkaWF0ZWx5IGNvbW1pdCBpdCBvciB3YWl0IGEgYml0LlxuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlSZXRyaWVzKGxhbmVzKSAmJiAvLyBkbyBub3QgZGVsYXkgaWYgd2UncmUgaW5zaWRlIGFuIGFjdCgpIHNjb3BlXG4gICAgICAgICFzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSkge1xuICAgICAgICAgIC8vIFRoaXMgcmVuZGVyIG9ubHkgaW5jbHVkZWQgcmV0cmllcywgbm8gdXBkYXRlcy4gVGhyb3R0bGUgY29tbWl0dGluZ1xuICAgICAgICAgIC8vIHJldHJpZXMgc28gdGhhdCB3ZSBkb24ndCBzaG93IHRvbyBtYW55IGxvYWRpbmcgc3RhdGVzIHRvbyBxdWlja2x5LlxuICAgICAgICAgIHZhciBtc1VudGlsVGltZW91dCA9IGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgKyBGQUxMQkFDS19USFJPVFRMRV9NUyAtIG5vdygpOyAvLyBEb24ndCBib3RoZXIgd2l0aCBhIHZlcnkgc2hvcnQgc3VzcGVuc2UgdGltZS5cblxuICAgICAgICAgIGlmIChtc1VudGlsVGltZW91dCA+IDEwKSB7XG4gICAgICAgICAgICB2YXIgbmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuXG4gICAgICAgICAgICBpZiAobmV4dExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgICAgIC8vIFRoZXJlJ3MgYWRkaXRpb25hbCB3b3JrIG9uIHRoaXMgcm9vdC5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG5cbiAgICAgICAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHN1c3BlbmRlZExhbmVzLCBsYW5lcykpIHtcbiAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHByZWZlciB0byByZW5kZXIgdGhlIGZhbGxiYWNrIG9mIGF0IHRoZSBsYXN0XG4gICAgICAgICAgICAgIC8vIHN1c3BlbmRlZCBsZXZlbC4gUGluZyB0aGUgbGFzdCBzdXNwZW5kZWQgbGV2ZWwgdG8gdHJ5XG4gICAgICAgICAgICAgIC8vIHJlbmRlcmluZyBpdCBhZ2Fpbi5cbiAgICAgICAgICAgICAgLy8gRklYTUU6IFdoYXQgaWYgdGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgSWRsZT8gU2hvdWxkIG5vdCByZXN0YXJ0LlxuICAgICAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgICAgICAgICBtYXJrUm9vdFBpbmdlZChyb290LCBzdXNwZW5kZWRMYW5lcyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSAvLyBUaGUgcmVuZGVyIGlzIHN1c3BlbmRlZCwgaXQgaGFzbid0IHRpbWVkIG91dCwgYW5kIHRoZXJlJ3Mgbm9cbiAgICAgICAgICAgIC8vIGxvd2VyIHByaW9yaXR5IHdvcmsgdG8gZG8uIEluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZmFsbGJhY2tcbiAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5LCB3YWl0IGZvciBtb3JlIGRhdGEgdG8gYXJyaXZlLlxuXG5cbiAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBtc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVGhlIHdvcmsgZXhwaXJlZC4gQ29tbWl0IGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290U3VzcGVuZGVkV2l0aERlbGF5OlxuICAgICAge1xuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIHRyYW5zaXRpb24sIHNvIHdlIHNob3VsZCBleGl0IHdpdGhvdXQgY29tbWl0dGluZyBhXG4gICAgICAgICAgLy8gcGxhY2Vob2xkZXIgYW5kIHdpdGhvdXQgc2NoZWR1bGluZyBhIHRpbWVvdXQuIERlbGF5IGluZGVmaW5pdGVseVxuICAgICAgICAgIC8vIHVudGlsIHdlIHJlY2VpdmUgbW9yZSBkYXRhLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgdHJhbnNpdGlvbiwgYnV0IHdlIGRpZCB0cmlnZ2VyIGFuIGF2b2lkZWQgc3RhdGUuXG4gICAgICAgICAgLy8gU2NoZWR1bGUgYSBwbGFjZWhvbGRlciB0byBkaXNwbGF5IGFmdGVyIGEgc2hvcnQgZGVsYXksIHVzaW5nIHRoZSBKdXN0XG4gICAgICAgICAgLy8gTm90aWNlYWJsZSBEaWZmZXJlbmNlLlxuICAgICAgICAgIC8vIFRPRE86IElzIHRoZSBKTkQgb3B0aW1pemF0aW9uIHdvcnRoIHRoZSBhZGRlZCBjb21wbGV4aXR5PyBJZiB0aGlzIGlzXG4gICAgICAgICAgLy8gdGhlIG9ubHkgcmVhc29uIHdlIHRyYWNrIHRoZSBldmVudCB0aW1lLCB0aGVuIHByb2JhYmx5IG5vdC5cbiAgICAgICAgICAvLyBDb25zaWRlciByZW1vdmluZy5cbiAgICAgICAgICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IGdldE1vc3RSZWNlbnRFdmVudFRpbWUocm9vdCwgbGFuZXMpO1xuICAgICAgICAgIHZhciBldmVudFRpbWVNcyA9IG1vc3RSZWNlbnRFdmVudFRpbWU7XG4gICAgICAgICAgdmFyIHRpbWVFbGFwc2VkTXMgPSBub3coKSAtIGV2ZW50VGltZU1zO1xuXG4gICAgICAgICAgdmFyIF9tc1VudGlsVGltZW91dCA9IGpuZCh0aW1lRWxhcHNlZE1zKSAtIHRpbWVFbGFwc2VkTXM7IC8vIERvbid0IGJvdGhlciB3aXRoIGEgdmVyeSBzaG9ydCBzdXNwZW5zZSB0aW1lLlxuXG5cbiAgICAgICAgICBpZiAoX21zVW50aWxUaW1lb3V0ID4gMTApIHtcbiAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZmFsbGJhY2sgaW1tZWRpYXRlbHksIHdhaXQgZm9yIG1vcmUgZGF0YVxuICAgICAgICAgICAgLy8gdG8gYXJyaXZlLlxuICAgICAgICAgICAgcm9vdC50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KGNvbW1pdFJvb3QuYmluZChudWxsLCByb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyksIF9tc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gQ29tbWl0IHRoZSBwbGFjZWhvbGRlci5cblxuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdENvbXBsZXRlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gVGhlIHdvcmsgY29tcGxldGVkLiBSZWFkeSB0byBjb21taXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biByb290IGV4aXQgc3RhdHVzLicpO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gU2VhcmNoIHRoZSByZW5kZXJlZCB0cmVlIGZvciBleHRlcm5hbCBzdG9yZSByZWFkcywgYW5kIGNoZWNrIHdoZXRoZXIgdGhlXG4gIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQgaW4gYSBjb25jdXJyZW50IGV2ZW50LiBJbnRlbnRpb25hbGx5IHVzaW5nIGFuIGl0ZXJhdGl2ZVxuICAvLyBsb29wIGluc3RlYWQgb2YgcmVjdXJzaW9uIHNvIHdlIGNhbiBleGl0IGVhcmx5LlxuICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLmZsYWdzICYgU3RvcmVDb25zaXN0ZW5jeSkge1xuICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gbm9kZS51cGRhdGVRdWV1ZTtcblxuICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBjaGVja3MgPSB1cGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICAgICAgaWYgKGNoZWNrcyAhPT0gbnVsbCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hlY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hlY2sgPSBjaGVja3NbaV07XG4gICAgICAgICAgICB2YXIgZ2V0U25hcHNob3QgPSBjaGVjay5nZXRTbmFwc2hvdDtcbiAgICAgICAgICAgIHZhciByZW5kZXJlZFZhbHVlID0gY2hlY2sudmFsdWU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICghb2JqZWN0SXMoZ2V0U25hcHNob3QoKSwgcmVuZGVyZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3VuZCBhbiBpbmNvbnNpc3RlbnQgc3RvcmUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBJZiBgZ2V0U25hcHNob3RgIHRocm93cywgcmV0dXJuIGBmYWxzZWAuIFRoaXMgd2lsbCBzY2hlZHVsZVxuICAgICAgICAgICAgICAvLyBhIHJlLXJlbmRlciwgYW5kIHRoZSBlcnJvciB3aWxsIGJlIHJldGhyb3duIGR1cmluZyByZW5kZXIuXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKG5vZGUuc3VidHJlZUZsYWdzICYgU3RvcmVDb25zaXN0ZW5jeSAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBjaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH0gLy8gRmxvdyBkb2Vzbid0IGtub3cgdGhpcyBpcyB1bnJlYWNoYWJsZSwgYnV0IGVzbGludCBkb2VzXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnJlYWNoYWJsZVxuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgLy8gV2hlbiBzdXNwZW5kaW5nLCB3ZSBzaG91bGQgYWx3YXlzIGV4Y2x1ZGUgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBvciAobW9yZVxuICAvLyByYXJlbHksIHNpbmNlIHdlIHRyeSB0byBhdm9pZCBpdCkgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgLy8gVE9ETzogTG9sIG1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGZhY3RvciB0aGlzIGJlc2lkZXMgdGhpc1xuICAvLyBvYm5veGlvdXNseSBuYW1lZCBmdW5jdGlvbiA6KVxuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyk7XG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzKTtcbiAgbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3Igc3luY2hyb25vdXMgdGFza3MgdGhhdCBkb24ndCBnb1xuLy8gdGhyb3VnaCBTY2hlZHVsZXJcblxuXG5mdW5jdGlvbiBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCkge1xuICB7XG4gICAgc3luY05lc3RlZFVwZGF0ZUZsYWcoKTtcbiAgfVxuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9XG5cbiAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB2YXIgbGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgTm9MYW5lcyk7XG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGxhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICAvLyBUaGVyZSdzIG5vIHJlbWFpbmluZyBzeW5jIHdvcmsgbGVmdC5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG5cbiAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgLy8gSWYgc29tZXRoaW5nIHRocmV3IGFuIGVycm9yLCB0cnkgcmVuZGVyaW5nIG9uZSBtb3JlIHRpbWUuIFdlJ2xsIHJlbmRlclxuICAgIC8vIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsIGluY2x1ZGVzXG4gICAgLy8gYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyIHRoZSBzZWNvbmRcbiAgICAvLyBhdHRlbXB0LCB3ZSdsbCBnaXZlIHVwIGFuZCBjb21taXQgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgIGlmIChlcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIGxhbmVzID0gZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICB2YXIgZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICB0aHJvdyBmYXRhbEVycm9yO1xuICB9XG5cbiAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3REaWROb3RDb21wbGV0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBCZWNhdXNlIHRoaXMgaXMgYSBzeW5jIHJlbmRlciwgd2VcbiAgLy8gd2lsbCBjb21taXQgaXQgZXZlbiBpZiBzb21ldGhpbmcgc3VzcGVuZGVkLlxuXG5cbiAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBsYW5lcztcbiAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7IC8vIEJlZm9yZSBleGl0aW5nLCBtYWtlIHN1cmUgdGhlcmUncyBhIGNhbGxiYWNrIHNjaGVkdWxlZCBmb3IgdGhlIG5leHRcbiAgLy8gcGVuZGluZyBsZXZlbC5cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmx1c2hSb290KHJvb3QsIGxhbmVzKSB7XG4gIGlmIChsYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG1lcmdlTGFuZXMobGFuZXMsIFN5bmNMYW5lKSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMkMShmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gSWYgdGhlcmUgd2VyZSBsZWdhY3kgc3luYyB1cGRhdGVzLCBmbHVzaCB0aGVtIGF0IHRoZSBlbmQgb2YgdGhlIG91dGVyXG4gICAgLy8gbW9zdCBiYXRjaGVkVXBkYXRlcy1saWtlIG1ldGhvZC5cblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS5cbiAgICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kpKSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaXNjcmV0ZVVwZGF0ZXMoZm4sIGEsIGIsIGMsIGQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICByZXR1cm4gZm4oYSwgYiwgYywgZCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgIH1cbiAgfVxufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5mdW5jdGlvbiBmbHVzaFN5bmMoZm4pIHtcbiAgLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGZsdXNoIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlXG4gIC8vIG5leHQgZXZlbnQsIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBvbmUuXG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCAmJiByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy50YWcgPT09IExlZ2FjeVJvb3QgJiYgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9XG5cbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcblxuICAgIGlmIChmbikge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2guXG4gICAgLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBoYXBwZW4gZXZlbiBpZiBiYXRjaGVkVXBkYXRlcyBpcyBoaWdoZXIgdXBcbiAgICAvLyB0aGUgc3RhY2suXG5cbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQWxyZWFkeVJlbmRlcmluZygpIHtcbiAgLy8gVXNlZCBieSB0aGUgcmVuZGVyZXIgdG8gcHJpbnQgYSB3YXJuaW5nIGlmIGNlcnRhaW4gQVBJcyBhcmUgY2FsbGVkIGZyb21cbiAgLy8gdGhlIHdyb25nIGNvbnRleHQuXG4gIHJldHVybiAgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0O1xufVxuZnVuY3Rpb24gcHVzaFJlbmRlckxhbmVzKGZpYmVyLCBsYW5lcykge1xuICBwdXNoKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgc3VidHJlZVJlbmRlckxhbmVzLCBmaWJlcik7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IG1lcmdlTGFuZXMoc3VidHJlZVJlbmRlckxhbmVzLCBsYW5lcyk7XG4gIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMsIGxhbmVzKTtcbn1cbmZ1bmN0aW9uIHBvcFJlbmRlckxhbmVzKGZpYmVyKSB7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvci5jdXJyZW50O1xuICBwb3Aoc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKSB7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHRpbWVvdXRIYW5kbGUgPSByb290LnRpbWVvdXRIYW5kbGU7XG5cbiAgaWYgKHRpbWVvdXRIYW5kbGUgIT09IG5vVGltZW91dCkge1xuICAgIC8vIFRoZSByb290IHByZXZpb3VzIHN1c3BlbmRlZCBhbmQgc2NoZWR1bGVkIGEgdGltZW91dCB0byBjb21taXQgYSBmYWxsYmFja1xuICAgIC8vIHN0YXRlLiBOb3cgdGhhdCB3ZSBoYXZlIGFkZGl0aW9uYWwgd29yaywgY2FuY2VsIHRoZSB0aW1lb3V0LlxuICAgIHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDsgLy8gJEZsb3dGaXhNZSBDb21wbGFpbnMgbm9UaW1lb3V0IGlzIG5vdCBhIFRpbWVvdXRJRCwgZGVzcGl0ZSB0aGUgY2hlY2sgYWJvdmVcblxuICAgIGNhbmNlbFRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJydXB0ZWRXb3JrID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gICAgd2hpbGUgKGludGVycnVwdGVkV29yayAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpbnRlcnJ1cHRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBpbnRlcnJ1cHRlZFdvcmsgPSBpbnRlcnJ1cHRlZFdvcmsucmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHZhciByb290V29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhyb290LmN1cnJlbnQsIG51bGwpO1xuICB3b3JrSW5Qcm9ncmVzcyA9IHJvb3RXb3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBudWxsO1xuICBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCk7XG5cbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MoKTtcbiAgfVxuXG4gIHJldHVybiByb290V29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKSB7XG4gIGRvIHtcbiAgICB2YXIgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXNldCBtb2R1bGUtbGV2ZWwgc3RhdGUgdGhhdCB3YXMgc2V0IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTsgLy8gVE9ETzogSSBmb3VuZCBhbmQgYWRkZWQgdGhpcyBtaXNzaW5nIGxpbmUgd2hpbGUgaW52ZXN0aWdhdGluZyBhXG4gICAgICAvLyBzZXBhcmF0ZSBpc3N1ZS4gV3JpdGUgYSByZWdyZXNzaW9uIHRlc3QgdXNpbmcgc3RyaW5nIHJlZnMuXG5cbiAgICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG5cbiAgICAgIGlmIChlcnJvcmVkV29yayA9PT0gbnVsbCB8fCBlcnJvcmVkV29yay5yZXR1cm4gPT09IG51bGwpIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQgdG8gYmUgd29ya2luZyBvbiBhIG5vbi1yb290IGZpYmVyLiBUaGlzIGlzIGEgZmF0YWwgZXJyb3JcbiAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSdzIG5vIGFuY2VzdG9yIHRoYXQgY2FuIGhhbmRsZSBpdDsgdGhlIHJvb3QgaXNcbiAgICAgICAgLy8gc3VwcG9zZWQgdG8gY2FwdHVyZSBhbGwgZXJyb3JzIHRoYXQgd2VyZW4ndCBjYXVnaHQgYnkgYW4gZXJyb3JcbiAgICAgICAgLy8gYm91bmRhcnkuXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RmF0YWxFcnJvcmVkO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gdGhyb3duVmFsdWU7IC8vIFNldCBgd29ya0luUHJvZ3Jlc3NgIHRvIG51bGwuIFRoaXMgcmVwcmVzZW50cyBhZHZhbmNpbmcgdG8gdGhlIG5leHRcbiAgICAgICAgLy8gc2libGluZywgb3IgdGhlIHBhcmVudCBpZiB0aGVyZSBhcmUgbm8gc2libGluZ3MuIEJ1dCBzaW5jZSB0aGUgcm9vdFxuICAgICAgICAvLyBoYXMgbm8gc2libGluZ3Mgbm9yIGEgcGFyZW50LCB3ZSBzZXQgaXQgdG8gbnVsbC4gVXN1YWxseSB0aGlzIGlzXG4gICAgICAgIC8vIGhhbmRsZWQgYnkgYGNvbXBsZXRlVW5pdE9mV29ya2Agb3IgYHVud2luZFdvcmtgLCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgLy8gaW50ZW50aW9uYWxseSBub3QgY2FsbGluZyB0aG9zZSwgd2UgbmVlZCBzZXQgaXQgaGVyZS5cbiAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgY2FsbGluZyBgdW53aW5kV29ya2AgdG8gcG9wIHRoZSBjb250ZXh0cy5cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZXJyb3JlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgdGltZSBzcGVudCByZW5kZXJpbmcgYmVmb3JlIGFuIGVycm9yIHdhcyB0aHJvd24uIFRoaXNcbiAgICAgICAgLy8gYXZvaWRzIGluYWNjdXJhdGUgUHJvZmlsZXIgZHVyYXRpb25zIGluIHRoZSBjYXNlIG9mIGFcbiAgICAgICAgLy8gc3VzcGVuZGVkIHJlbmRlci5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShlcnJvcmVkV29yaywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcblxuICAgICAgICBpZiAodGhyb3duVmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHRocm93blZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGhyb3duVmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciB3YWtlYWJsZSA9IHRocm93blZhbHVlO1xuICAgICAgICAgIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZXJyb3JlZFdvcmssIHdha2VhYmxlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya0NvbXBvbmVudEVycm9yZWQoZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgZXJyb3JlZFdvcmsucmV0dXJuLCBlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIGNvbXBsZXRlVW5pdE9mV29yayhlcnJvcmVkV29yayk7XG4gICAgfSBjYXRjaCAoeWV0QW5vdGhlclRocm93blZhbHVlKSB7XG4gICAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHJldHVybiBwYXRoIGFsc28gdGhyZXcuXG4gICAgICB0aHJvd25WYWx1ZSA9IHlldEFub3RoZXJUaHJvd25WYWx1ZTtcblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSBlcnJvcmVkV29yayAmJiBlcnJvcmVkV29yayAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGhhcyBhbHJlYWR5IGVycm9yZWQsIHRoZW4gd2UgaGFkIHRyb3VibGUgcHJvY2Vzc2luZ1xuICAgICAgICAvLyB0aGUgZXJyb3IuIEJ1YmJsZSBpdCB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgICAgICAgZXJyb3JlZFdvcmsgPSBlcnJvcmVkV29yay5yZXR1cm47XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gZXJyb3JlZFdvcms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIFJldHVybiB0byB0aGUgbm9ybWFsIHdvcmsgbG9vcC5cblxuXG4gICAgcmV0dXJuO1xuICB9IHdoaWxlICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gcHVzaERpc3BhdGNoZXIoKSB7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50O1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAocHJldkRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAvLyBUaGUgUmVhY3QgaXNvbW9ycGhpYyBwYWNrYWdlIGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGRpc3BhdGNoZXIuXG4gICAgLy8gSW5zdGVhZCB0aGUgZmlyc3QgcmVuZGVyZXIgd2lsbCBsYXppbHkgYXR0YWNoIG9uZSwgaW4gb3JkZXIgdG8gZ2l2ZVxuICAgIC8vIG5pY2VyIGVycm9yIG1lc3NhZ2VzLlxuICAgIHJldHVybiBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZEaXNwYXRjaGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpIHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCkge1xuICBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gbm93KCk7XG59XG5mdW5jdGlvbiBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGxhbmUpIHtcbiAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gbWVyZ2VMYW5lcyhsYW5lLCB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMpO1xufVxuZnVuY3Rpb24gcmVuZGVyRGlkU3VzcGVuZCgpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcyB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkIHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHVwZGF0ZXMgdGhhdCB3ZSBza2lwcGVkIHRyZWUgdGhhdCBtaWdodCBoYXZlIHVuYmxvY2tlZFxuICAvLyB0aGlzIHJlbmRlci5cblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwgJiYgKGluY2x1ZGVzTm9uSWRsZVdvcmsod29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKSB8fCBpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzKSkpIHtcbiAgICAvLyBNYXJrIHRoZSBjdXJyZW50IHJlbmRlciBhcyBzdXNwZW5kZWQgc28gdGhhdCB3ZSBzd2l0Y2ggdG8gd29ya2luZyBvblxuICAgIC8vIHRoZSB1cGRhdGVzIHRoYXQgd2VyZSBza2lwcGVkLiBVc3VhbGx5IHdlIG9ubHkgc3VzcGVuZCBhdCB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIHJlbmRlciBwaGFzZS5cbiAgICAvLyBUT0RPOiBXZSBzaG91bGQgcHJvYmFibHkgYWx3YXlzIG1hcmsgdGhlIHJvb3QgYXMgc3VzcGVuZGVkIGltbWVkaWF0ZWx5XG4gICAgLy8gKGluc2lkZSB0aGlzIGZ1bmN0aW9uKSwgc2luY2UgYnkgc3VzcGVuZGluZyBhdCB0aGUgZW5kIG9mIHRoZSByZW5kZXJcbiAgICAvLyBwaGFzZSBpbnRyb2R1Y2VzIGEgcG90ZW50aWFsIG1pc3Rha2Ugd2hlcmUgd2Ugc3VzcGVuZCBsYW5lcyB0aGF0IHdlcmVcbiAgICAvLyBwaW5nZWQgb3IgdXBkYXRlZCB3aGlsZSB3ZSB3ZXJlIHJlbmRlcmluZy5cbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHdvcmtJblByb2dyZXNzUm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRFcnJvcihlcnJvcikge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RXJyb3JlZDtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IFtlcnJvcl07XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxufSAvLyBDYWxsZWQgZHVyaW5nIHJlbmRlciB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcgaGFzIHN1c3BlbmRlZC5cbi8vIFJldHVybnMgZmFsc2UgaWYgd2UncmUgbm90IHN1cmUuXG5cbmZ1bmN0aW9uIHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgb3IgY29tcGxldGVkLCB3ZSBjYW4ndCByZWFsbHkgYmUgc3VyZSxcbiAgLy8gc28gdGhvc2UgYXJlIGZhbHNlLlxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgICAgIH0gLy8gQXQgdGhpcyBwb2ludCwgbW92ZSBGaWJlcnMgdGhhdCBzY2hlZHVsZWQgdGhlIHVwY29taW5nIHdvcmsgZnJvbSB0aGUgTWFwIHRvIHRoZSBTZXQuXG4gICAgICAgIC8vIElmIHdlIGJhaWxvdXQgb24gdGhpcyB3b3JrLCB3ZSdsbCBtb3ZlIHRoZW0gYmFjayAobGlrZSBhYm92ZSkuXG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIG1vdmUgdGhlbSBub3cgaW4gY2FzZSB0aGUgd29yayBzcGF3bnMgbW9yZSB3b3JrIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGggZGlmZmVyZW50IHVwZGF0ZXJzLlxuICAgICAgICAvLyBUaGF0IHdheSB3ZSBjYW4ga2VlcCB0aGUgY3VycmVudCB1cGRhdGUgYW5kIGZ1dHVyZSB1cGRhdGVzIHNlcGFyYXRlLlxuXG5cbiAgICAgICAgbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcygpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wU3luYygpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSBzeW5jIHJlbmRlciwgc28gd2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgdGhlIHdob2xlIHRyZWUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IGFuIGluY29tcGxldGUgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgJyArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gU2V0IHRoaXMgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGVyZSdzIG5vIGluLXByb2dyZXNzIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG59IC8vIFRoZSB3b3JrIGxvb3AgaXMgYW4gZXh0cmVtZWx5IGhvdCBwYXRoLiBUZWxsIENsb3N1cmUgbm90IHRvIGlubGluZSBpdC5cblxuLyoqIEBub2lubGluZSAqL1xuXG5cbmZ1bmN0aW9uIHdvcmtMb29wU3luYygpIHtcbiAgLy8gQWxyZWFkeSB0aW1lZCBvdXQsIHNvIHBlcmZvcm0gd29yayB3aXRob3V0IGNoZWNraW5nIGlmIHdlIG5lZWQgdG8geWllbGQuXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIHBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGRvIHtcbiAgICB0cnkge1xuICAgICAgd29ya0xvb3BDb25jdXJyZW50KCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoICh0aHJvd25WYWx1ZSkge1xuICAgICAgaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpO1xuICAgIH1cbiAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBTdGlsbCB3b3JrIHJlbWFpbmluZy5cbiAgICB7XG4gICAgICBtYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBSb290SW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICAvLyBDb21wbGV0ZWQgdGhlIHRyZWUuXG4gICAge1xuICAgICAgbWFya1JlbmRlclN0b3BwZWQoKTtcbiAgICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBSZXR1cm4gdGhlIGZpbmFsIGV4aXQgc3RhdHVzLlxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG4gIH1cbn1cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcENvbmN1cnJlbnQoKSB7XG4gIC8vIFBlcmZvcm0gd29yayB1bnRpbCBTY2hlZHVsZXIgYXNrcyB1cyB0byB5aWVsZFxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwgJiYgIXNob3VsZFlpZWxkKCkpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gIC8vIG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZSBtZWFucyB0aGF0IHdlIGRvbid0XG4gIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgdmFyIGN1cnJlbnQgPSB1bml0T2ZXb3JrLmFsdGVybmF0ZTtcbiAgc2V0Q3VycmVudEZpYmVyKHVuaXRPZldvcmspO1xuICB2YXIgbmV4dDtcblxuICBpZiAoICh1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKHVuaXRPZldvcmssIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIG5leHQgPSBiZWdpbldvcmskMShjdXJyZW50LCB1bml0T2ZXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgdW5pdE9mV29yay5tZW1vaXplZFByb3BzID0gdW5pdE9mV29yay5wZW5kaW5nUHJvcHM7XG5cbiAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGRvZXNuJ3Qgc3Bhd24gbmV3IHdvcmssIGNvbXBsZXRlIHRoZSBjdXJyZW50IHdvcmsuXG4gICAgY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgfVxuXG4gIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKSB7XG4gIC8vIEF0dGVtcHQgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQgdW5pdCBvZiB3b3JrLCB0aGVuIG1vdmUgdG8gdGhlIG5leHRcbiAgLy8gc2libGluZy4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgc2libGluZ3MsIHJldHVybiB0byB0aGUgcGFyZW50IGZpYmVyLlxuICB2YXIgY29tcGxldGVkV29yayA9IHVuaXRPZldvcms7XG5cbiAgZG8ge1xuICAgIC8vIFRoZSBjdXJyZW50LCBmbHVzaGVkLCBzdGF0ZSBvZiB0aGlzIGZpYmVyIGlzIHRoZSBhbHRlcm5hdGUuIElkZWFsbHlcbiAgICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAgIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgICB2YXIgY3VycmVudCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgIHZhciByZXR1cm5GaWJlciA9IGNvbXBsZXRlZFdvcmsucmV0dXJuOyAvLyBDaGVjayBpZiB0aGUgd29yayBjb21wbGV0ZWQgb3IgaWYgc29tZXRoaW5nIHRocmV3LlxuXG4gICAgaWYgKChjb21wbGV0ZWRXb3JrLmZsYWdzICYgSW5jb21wbGV0ZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihjb21wbGV0ZWRXb3JrKTtcbiAgICAgIHZhciBuZXh0ID0gdm9pZCAwO1xuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIoY29tcGxldGVkV29yayk7XG4gICAgICAgIG5leHQgPSBjb21wbGV0ZVdvcmsoY3VycmVudCwgY29tcGxldGVkV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTsgLy8gVXBkYXRlIHJlbmRlciBkdXJhdGlvbiBhc3N1bWluZyB3ZSBkaWRuJ3QgZXJyb3IuXG5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENvbXBsZXRpbmcgdGhpcyBmaWJlciBzcGF3bmVkIG5ldyB3b3JrLiBXb3JrIG9uIHRoYXQgbmV4dC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBuZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIHNvbWV0aGluZyB0aHJldy4gUG9wIHZhbHVlcyBvZmZcbiAgICAgIC8vIHRoZSBzdGFjayB3aXRob3V0IGVudGVyaW5nIHRoZSBjb21wbGV0ZSBwaGFzZS4gSWYgdGhpcyBpcyBhIGJvdW5kYXJ5LFxuICAgICAgLy8gY2FwdHVyZSB2YWx1ZXMgaWYgcG9zc2libGUuXG4gICAgICB2YXIgX25leHQgPSB1bndpbmRXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmspOyAvLyBCZWNhdXNlIHRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSwgZG9uJ3QgcmVzZXQgaXRzIGxhbmVzLlxuXG5cbiAgICAgIGlmIChfbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiBjb21wbGV0aW5nIHRoaXMgd29yayBzcGF3bmVkIG5ldyB3b3JrLCBkbyB0aGF0IG5leHQuIFdlJ2xsIGNvbWVcbiAgICAgICAgLy8gYmFjayBoZXJlIGFnYWluLlxuICAgICAgICAvLyBTaW5jZSB3ZSdyZSByZXN0YXJ0aW5nLCByZW1vdmUgYW55dGhpbmcgdGhhdCBpcyBub3QgYSBob3N0IGVmZmVjdFxuICAgICAgICAvLyBmcm9tIHRoZSBlZmZlY3QgdGFnLlxuICAgICAgICBfbmV4dC5mbGFncyAmPSBIb3N0RWZmZWN0TWFzaztcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBfbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHJlbmRlciBkdXJhdGlvbiBmb3IgdGhlIGZpYmVyIHRoYXQgZXJyb3JlZC5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7IC8vIEluY2x1ZGUgdGhlIHRpbWUgc3BlbnQgd29ya2luZyBvbiBmYWlsZWQgY2hpbGRyZW4gYmVmb3JlIGNvbnRpbnVpbmcuXG5cbiAgICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAvLyBNYXJrIHRoZSBwYXJlbnQgZmliZXIgYXMgaW5jb21wbGV0ZSBhbmQgY2xlYXIgaXRzIHN1YnRyZWUgZmxhZ3MuXG4gICAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG4gICAgICAgIHJldHVybkZpYmVyLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSd2ZSB1bndvdW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdERpZE5vdENvbXBsZXRlO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2libGluZ0ZpYmVyID0gY29tcGxldGVkV29yay5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmdGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGRvIGluIHRoaXMgcmV0dXJuRmliZXIsIGRvIHRoYXQgbmV4dC5cbiAgICAgIHdvcmtJblByb2dyZXNzID0gc2libGluZ0ZpYmVyO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gT3RoZXJ3aXNlLCByZXR1cm4gdG8gdGhlIHBhcmVudFxuXG5cbiAgICBjb21wbGV0ZWRXb3JrID0gcmV0dXJuRmliZXI7IC8vIFVwZGF0ZSB0aGUgbmV4dCB0aGluZyB3ZSdyZSB3b3JraW5nIG9uIGluIGNhc2Ugc29tZXRoaW5nIHRocm93cy5cblxuICAgIHdvcmtJblByb2dyZXNzID0gY29tcGxldGVkV29yaztcbiAgfSB3aGlsZSAoY29tcGxldGVkV29yayAhPT0gbnVsbCk7IC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIHJvb3QuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdENvbXBsZXRlZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRSb290KHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucykge1xuICAvLyBUT0RPOiBUaGlzIG5vIGxvbmdlciBtYWtlcyBhbnkgc2Vuc2UuIFdlIGFscmVhZHkgd3JhcCB0aGUgbXV0YXRpb24gYW5kXG4gIC8vIGxheW91dCBwaGFzZXMuIFNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZS5cbiAgdmFyIHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRSb290SW1wbChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgZG8ge1xuICAgIC8vIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIGNhbGwgYGZsdXNoU3luY1VwZGF0ZVF1ZXVlYCBhdCB0aGUgZW5kLCB3aGljaFxuICAgIC8vIG1lYW5zIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIHNvbWV0aW1lcyByZXN1bHQgaW4gYWRkaXRpb25hbFxuICAgIC8vIHBhc3NpdmUgZWZmZWN0cy4gU28gd2UgbmVlZCB0byBrZWVwIGZsdXNoaW5nIGluIGEgbG9vcCB1bnRpbCB0aGVyZSBhcmVcbiAgICAvLyBubyBtb3JlIHBlbmRpbmcgZWZmZWN0cy5cbiAgICAvLyBUT0RPOiBNaWdodCBiZSBiZXR0ZXIgaWYgYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIGRpZCBub3QgYXV0b21hdGljYWxseVxuICAgIC8vIGZsdXNoIHN5bmNocm9ub3VzIHdvcmsgYXQgdGhlIGVuZCwgdG8gYXZvaWQgZmFjdG9yaW5nIGhhemFyZHMgbGlrZSB0aGlzLlxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSB3aGlsZSAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpO1xuXG4gIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9XG5cbiAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuZmluaXNoZWRXb3JrO1xuICB2YXIgbGFuZXMgPSByb290LmZpbmlzaGVkTGFuZXM7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IG51bGwpIHtcblxuICAgIHtcbiAgICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgICAgIGVycm9yKCdyb290LmZpbmlzaGVkTGFuZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSBkdXJpbmcgYSBjb21taXQuIFRoaXMgaXMgYSAnICsgJ2J1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKGZpbmlzaGVkV29yayA9PT0gcm9vdC5jdXJyZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IHRoZSBzYW1lIHRyZWUgYXMgYmVmb3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH0gLy8gY29tbWl0Um9vdCBuZXZlciByZXR1cm5zIGEgY29udGludWF0aW9uOyBpdCBhbHdheXMgZmluaXNoZXMgc3luY2hyb25vdXNseS5cbiAgLy8gU28gd2UgY2FuIGNsZWFyIHRoZXNlIG5vdyB0byBhbGxvdyBhIG5ldyBjYWxsYmFjayB0byBiZSBzY2hlZHVsZWQuXG5cblxuICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTsgLy8gVXBkYXRlIHRoZSBmaXJzdCBhbmQgbGFzdCBwZW5kaW5nIHRpbWVzIG9uIHRoaXMgcm9vdC4gVGhlIG5ldyBmaXJzdFxuICAvLyBwZW5kaW5nIHRpbWUgaXMgd2hhdGV2ZXIgaXMgbGVmdCBvbiB0aGUgcm9vdCBmaWJlci5cblxuICB2YXIgcmVtYWluaW5nTGFuZXMgPSBtZXJnZUxhbmVzKGZpbmlzaGVkV29yay5sYW5lcywgZmluaXNoZWRXb3JrLmNoaWxkTGFuZXMpO1xuICBtYXJrUm9vdEZpbmlzaGVkKHJvb3QsIHJlbWFpbmluZ0xhbmVzKTtcblxuICBpZiAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgLy8gV2UgY2FuIHJlc2V0IHRoZXNlIG5vdyB0aGF0IHRoZXkgYXJlIGZpbmlzaGVkLlxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgfSAvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMsIHNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gcHJvY2VzcyB0aGVtLlxuICAvLyBEbyB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCBzbyBpdCBpcyBxdWV1ZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgdGhhdFxuICAvLyBtaWdodCBnZXQgc2NoZWR1bGVkIGluIHRoZSBjb21taXQgcGhhc2UuIChTZWUgIzE2NzE0LilcbiAgLy8gVE9ETzogRGVsZXRlIGFsbCBvdGhlciBwbGFjZXMgdGhhdCBzY2hlZHVsZSB0aGUgcGFzc2l2ZSBlZmZlY3QgY2FsbGJhY2tcbiAgLy8gVGhleSdyZSByZWR1bmRhbnQuXG5cblxuICBpZiAoKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgfHwgKGZpbmlzaGVkV29yay5mbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncykge1xuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIC8vIHRvIHN0b3JlIGl0IGluIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgdW50aWwgdGhleSBnZXQgcHJvY2Vzc2VkXG4gICAgICAvLyBXZSBuZWVkIHRvIHBhc3MgdGhpcyB0aHJvdWdoIGFzIGFuIGFyZ3VtZW50IHRvIGNvbW1pdFJvb3RcbiAgICAgIC8vIGJlY2F1c2Ugd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyBtaWdodCBoYXZlIGNoYW5nZWQgYmV0d2VlblxuICAgICAgLy8gdGhlIHByZXZpb3VzIHJlbmRlciBhbmQgY29tbWl0IGlmIHdlIHRocm90dGxlIHRoZSBjb21taXRcbiAgICAgIC8vIHdpdGggc2V0VGltZW91dFxuXG4gICAgICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpOyAvLyBUaGlzIHJlbmRlciB0cmlnZ2VyZWQgcGFzc2l2ZSBlZmZlY3RzOiByZWxlYXNlIHRoZSByb290IGNhY2hlIHBvb2xcbiAgICAgICAgLy8gKmFmdGVyKiBwYXNzaXZlIGVmZmVjdHMgZmlyZSB0byBhdm9pZCBmcmVlaW5nIGEgY2FjaGUgcG9vbCB0aGF0IG1heVxuICAgICAgICAvLyBiZSByZWZlcmVuY2VkIGJ5IGEgbm9kZSBpbiB0aGUgdHJlZSAoSG9zdFJvb3QsIENhY2hlIGJvdW5kYXJ5IGV0YylcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGVmZmVjdHMgaW4gdGhlIHdob2xlIHRyZWUuXG4gIC8vIFRPRE86IFRoaXMgaXMgbGVmdCBvdmVyIGZyb20gdGhlIGVmZmVjdCBsaXN0IGltcGxlbWVudGF0aW9uLCB3aGVyZSB3ZSBoYWRcbiAgLy8gdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYGZpcnN0RWZmZWN0YCB0byBzYXRpc2Z5IEZsb3cuIEkgdGhpbmsgdGhlXG4gIC8vIG9ubHkgb3RoZXIgcmVhc29uIHRoaXMgb3B0aW1pemF0aW9uIGV4aXN0cyBpcyBiZWNhdXNlIGl0IGFmZmVjdHMgcHJvZmlsaW5nLlxuICAvLyBSZWNvbnNpZGVyIHdoZXRoZXIgdGhpcyBpcyBuZWNlc3NhcnkuXG5cblxuICB2YXIgc3VidHJlZUhhc0VmZmVjdHMgPSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcbiAgdmFyIHJvb3RIYXNFZmZlY3QgPSAoZmluaXNoZWRXb3JrLmZsYWdzICYgKEJlZm9yZU11dGF0aW9uTWFzayB8IE11dGF0aW9uTWFzayB8IExheW91dE1hc2sgfCBQYXNzaXZlTWFzaykpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChzdWJ0cmVlSGFzRWZmZWN0cyB8fCByb290SGFzRWZmZWN0KSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDsgLy8gUmVzZXQgdGhpcyB0byBudWxsIGJlZm9yZSBjYWxsaW5nIGxpZmVjeWNsZXNcblxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7IC8vIFRoZSBjb21taXQgcGhhc2UgaXMgYnJva2VuIGludG8gc2V2ZXJhbCBzdWItcGhhc2VzLiBXZSBkbyBhIHNlcGFyYXRlIHBhc3NcbiAgICAvLyBvZiB0aGUgZWZmZWN0IGxpc3QgZm9yIGVhY2ggcGhhc2U6IGFsbCBtdXRhdGlvbiBlZmZlY3RzIGNvbWUgYmVmb3JlIGFsbFxuICAgIC8vIGxheW91dCBlZmZlY3RzLCBhbmQgc28gb24uXG4gICAgLy8gVGhlIGZpcnN0IHBoYXNlIGEgXCJiZWZvcmUgbXV0YXRpb25cIiBwaGFzZS4gV2UgdXNlIHRoaXMgcGhhc2UgdG8gcmVhZCB0aGVcbiAgICAvLyBzdGF0ZSBvZiB0aGUgaG9zdCB0cmVlIHJpZ2h0IGJlZm9yZSB3ZSBtdXRhdGUgaXQuIFRoaXMgaXMgd2hlcmVcbiAgICAvLyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSBpcyBjYWxsZWQuXG5cbiAgICB2YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG5cbiAgICB7XG4gICAgICAvLyBNYXJrIHRoZSBjdXJyZW50IGNvbW1pdCB0aW1lIHRvIGJlIHNoYXJlZCBieSBhbGwgUHJvZmlsZXJzIGluIHRoaXNcbiAgICAgIC8vIGJhdGNoLiBUaGlzIGVuYWJsZXMgdGhlbSB0byBiZSBncm91cGVkIGxhdGVyLlxuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cblxuXG4gICAgY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuXG4gICAgcmVzZXRBZnRlckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAgIC8vIHRoZSBtdXRhdGlvbiBwaGFzZSwgc28gdGhhdCB0aGUgcHJldmlvdXMgdHJlZSBpcyBzdGlsbCBjdXJyZW50IGR1cmluZ1xuICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBsYXlvdXQgcGhhc2UsIHNvIHRoYXQgdGhlIGZpbmlzaGVkXG4gICAgLy8gd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIFRoZSBuZXh0IHBoYXNlIGlzIHRoZSBsYXlvdXQgcGhhc2UsIHdoZXJlIHdlIGNhbGwgZWZmZWN0cyB0aGF0IHJlYWRcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuXG4gICAgY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKTtcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgICAvLyBvcHBvcnR1bml0eSB0byBwYWludC5cblxuXG4gICAgcmVxdWVzdFBhaW50KCk7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBSZXNldCB0aGUgcHJpb3JpdHkgdG8gdGhlIHByZXZpb3VzIG5vbi1zeW5jIHZhbHVlLlxuXG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9IGVsc2Uge1xuICAgIC8vIE5vIGVmZmVjdHMuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBNZWFzdXJlIHRoZXNlIGFueXdheSBzbyB0aGUgZmxhbWVncmFwaCBleHBsaWNpdGx5IHNob3dzIHRoYXQgdGhlcmUgd2VyZVxuICAgIC8vIG5vIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gcmVwb3J0IHRoaXMuXG5cbiAgICB7XG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMgPSByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cztcblxuICBpZiAocm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBUaGlzIGNvbW1pdCBoYXMgcGFzc2l2ZSBlZmZlY3RzLiBTdGFzaCBhIHJlZmVyZW5jZSB0byB0aGVtLiBCdXQgZG9uJ3RcbiAgICAvLyBzY2hlZHVsZSBhIGNhbGxiYWNrIHVudGlsIGFmdGVyIGZsdXNoaW5nIGxheW91dCB3b3JrLlxuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSByb290O1xuICAgIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gbGFuZXM7XG4gIH0gZWxzZSB7XG5cbiAgICB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYW4gZWZmZWN0IG1pZ2h0IGhhdmUgdXBkYXRlZCBpdFxuXG5cbiAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lczsgLy8gQ2hlY2sgaWYgdGhlcmUncyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3RcbiAgLy8gVE9ETzogVGhpcyBpcyBwYXJ0IG9mIHRoZSBgY29tcG9uZW50RGlkQ2F0Y2hgIGltcGxlbWVudGF0aW9uLiBJdHMgcHVycG9zZVxuICAvLyBpcyB0byBkZXRlY3Qgd2hldGhlciBzb21ldGhpbmcgbWlnaHQgaGF2ZSBjYWxsZWQgc2V0U3RhdGUgaW5zaWRlXG4gIC8vIGBjb21wb25lbnREaWRDYXRjaGAuIFRoZSBtZWNoYW5pc20gaXMga25vd24gdG8gYmUgZmxhd2VkIGJlY2F1c2UgYHNldFN0YXRlYFxuICAvLyBpbnNpZGUgYGNvbXBvbmVudERpZENhdGNoYCBpcyBpdHNlbGYgZmxhd2VkIOKAlCB0aGF0J3Mgd2h5IHdlIHJlY29tbWVuZFxuICAvLyBgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yYCBpbnN0ZWFkLiBIb3dldmVyLCBpdCBjb3VsZCBiZSBpbXByb3ZlZCBieVxuICAvLyBjaGVja2luZyBpZiByZW1haW5pbmdMYW5lcyBpbmNsdWRlcyBTeW5jIHdvcmssIGluc3RlYWQgb2Ygd2hldGhlciB0aGVyZSdzXG4gIC8vIGFueSB3b3JrIHJlbWFpbmluZyBhdCBhbGwgKHdoaWNoIHdvdWxkIGFsc28gaW5jbHVkZSBzdHVmZiBsaWtlIFN1c3BlbnNlXG4gIC8vIHJldHJpZXMgb3IgdHJhbnNpdGlvbnMpLiBJdCdzIGJlZW4gbGlrZSB0aGlzIGZvciBhIHdoaWxlLCB0aG91Z2gsIHNvIGZpeGluZ1xuICAvLyBpdCBwcm9iYWJseSBpc24ndCB0aGF0IHVyZ2VudC5cblxuICBpZiAocmVtYWluaW5nTGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLCB3ZSBjYW4gY2xlYXIgdGhlIHNldCBvZiBhbHJlYWR5IGZhaWxlZFxuICAgIC8vIGVycm9yIGJvdW5kYXJpZXMuXG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICghcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKHJvb3QuY3VycmVudCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29tbWl0Um9vdChmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLCByZW5kZXJQcmlvcml0eUxldmVsKTtcblxuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICByb290Lm1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgb25Db21taXRSb290JDEoKTtcbiAgfSAvLyBBbHdheXMgY2FsbCB0aGlzIGJlZm9yZSBleGl0aW5nIGBjb21taXRSb290YCwgdG8gZW5zdXJlIHRoYXQgYW55XG4gIC8vIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QgaXMgc2NoZWR1bGVkLlxuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocmVjb3ZlcmFibGVFcnJvcnMgIT09IG51bGwpIHtcbiAgICAvLyBUaGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCByZWNvdmVyZWQgZnJvbSB0aGVtIHdpdGhvdXRcbiAgICAvLyBuZWVkaW5nIHRvIHN1cmZhY2UgaXQgdG8gdGhlIFVJLiBXZSBsb2cgdGhlbSBoZXJlLlxuICAgIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSByb290Lm9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb3ZlcmFibGVFcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gcmVjb3ZlcmFibGVFcnJvcnNbaV07XG4gICAgICB2YXIgY29tcG9uZW50U3RhY2sgPSByZWNvdmVyYWJsZUVycm9yLnN0YWNrO1xuICAgICAgdmFyIGRpZ2VzdCA9IHJlY292ZXJhYmxlRXJyb3IuZGlnZXN0O1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yKHJlY292ZXJhYmxlRXJyb3IudmFsdWUsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IGNvbXBvbmVudFN0YWNrLFxuICAgICAgICBkaWdlc3Q6IGRpZ2VzdFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG4gICAgdmFyIGVycm9yJDEgPSBmaXJzdFVuY2F1Z2h0RXJyb3I7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvciQxO1xuICB9IC8vIElmIHRoZSBwYXNzaXZlIGVmZmVjdHMgYXJlIHRoZSByZXN1bHQgb2YgYSBkaXNjcmV0ZSByZW5kZXIsIGZsdXNoIHRoZW1cbiAgLy8gc3luY2hyb25vdXNseSBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHRhc2sgc28gdGhhdCB0aGUgcmVzdWx0IGlzXG4gIC8vIGltbWVkaWF0ZWx5IG9ic2VydmFibGUuIE90aGVyd2lzZSwgd2UgYXNzdW1lIHRoYXQgdGhleSBhcmUgbm90XG4gIC8vIG9yZGVyLWRlcGVuZGVudCBhbmQgZG8gbm90IG5lZWQgdG8gYmUgb2JzZXJ2ZWQgYnkgZXh0ZXJuYWwgc3lzdGVtcywgc28gd2VcbiAgLy8gY2FuIHdhaXQgdW50aWwgYWZ0ZXIgcGFpbnQuXG4gIC8vIFRPRE86IFdlIGNhbiBvcHRpbWl6ZSB0aGlzIGJ5IG5vdCBzY2hlZHVsaW5nIHRoZSBjYWxsYmFjayBlYXJsaWVyLiBTaW5jZSB3ZVxuICAvLyBjdXJyZW50bHkgc2NoZWR1bGUgdGhlIGNhbGxiYWNrIGluIG11bHRpcGxlIHBsYWNlcywgd2lsbCB3YWl0IHVudGlsIHRob3NlXG4gIC8vIGFyZSBjb25zb2xpZGF0ZWQuXG5cblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcywgU3luY0xhbmUpICYmIHJvb3QudGFnICE9PSBMZWdhY3lSb290KSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYSBwYXNzaXZlIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVtYWluaW5nTGFuZXMsIFN5bmNMYW5lKSkge1xuICAgIHtcbiAgICAgIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKTtcbiAgICB9IC8vIENvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHJvb3Qgc3luY2hyb25vdXNseSByZS1yZW5kZXJzIHdpdGhvdXRcbiAgICAvLyBmaW5pc2hpbmcuIElmIHRoZXJlIGFyZSB0b28gbWFueSwgaXQgaW5kaWNhdGVzIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wLlxuXG5cbiAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gIH0gLy8gSWYgbGF5b3V0IHdvcmsgd2FzIHNjaGVkdWxlZCwgZmx1c2ggaXQgbm93LlxuXG5cbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0cygpIHtcbiAgLy8gUmV0dXJucyB3aGV0aGVyIHBhc3NpdmUgZWZmZWN0cyB3ZXJlIGZsdXNoZWQuXG4gIC8vIFRPRE86IENvbWJpbmUgdGhpcyBjaGVjayB3aXRoIHRoZSBvbmUgaW4gZmx1c2hQYXNzaXZlRUZmZWN0c0ltcGwuIFdlIHNob3VsZFxuICAvLyBwcm9iYWJseSBqdXN0IGNvbWJpbmUgdGhlIHR3byBmdW5jdGlvbnMuIEkgYmVsaWV2ZSB0aGV5IHdlcmUgb25seSBzZXBhcmF0ZVxuICAvLyBpbiB0aGUgZmlyc3QgcGxhY2UgYmVjYXVzZSB3ZSB1c2VkIHRvIHdyYXAgaXQgd2l0aFxuICAvLyBgU2NoZWR1bGVyLnJ1bldpdGhQcmlvcml0eWAsIHdoaWNoIGFjY2VwdHMgYSBmdW5jdGlvbi4gQnV0IG5vdyB3ZSB0cmFjayB0aGVcbiAgLy8gcHJpb3JpdHkgd2l0aGluIFJlYWN0IGl0c2VsZiwgc28gd2UgY2FuIG11dGF0ZSB0aGUgdmFyaWFibGUgZGlyZWN0bHkuXG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIHZhciByZW5kZXJQcmlvcml0eSA9IGxhbmVzVG9FdmVudFByaW9yaXR5KHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzKTtcbiAgICB2YXIgcHJpb3JpdHkgPSBsb3dlckV2ZW50UHJpb3JpdHkoRGVmYXVsdEV2ZW50UHJpb3JpdHksIHJlbmRlclByaW9yaXR5KTtcbiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByaW9yaXR5KTtcbiAgICAgIHJldHVybiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsgLy8gT25jZSBwYXNzaXZlIGVmZmVjdHMgaGF2ZSBydW4gZm9yIHRoZSB0cmVlIC0gZ2l2aW5nIGNvbXBvbmVudHMgYVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cy5wdXNoKGZpYmVyKTtcblxuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShOb3JtYWxQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCkge1xuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gQ2FjaGUgYW5kIGNsZWFyIHRoZSB0cmFuc2l0aW9ucyBmbGFnXG5cblxuICB2YXIgdHJhbnNpdGlvbnMgPSBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zO1xuICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDtcbiAgdmFyIHJvb3QgPSByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cztcbiAgdmFyIGxhbmVzID0gcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXM7XG4gIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDsgLy8gVE9ETzogVGhpcyBpcyBzb21ldGltZXMgb3V0IG9mIHN5bmMgd2l0aCByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy5cbiAgLy8gRmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4gSXQncyBub3QgY2F1c2luZyBhbnkga25vd24gaXNzdWVzIChwcm9iYWJseVxuICAvLyBiZWNhdXNlIGl0J3Mgb25seSB1c2VkIGZvciBwcm9maWxpbmcpLCBidXQgaXQncyBhIHJlZmFjdG9yIGhhemFyZC5cblxuICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZsdXNoIHBhc3NpdmUgZWZmZWN0cyB3aGlsZSBhbHJlYWR5IHJlbmRlcmluZy4nKTtcbiAgfVxuXG4gIHtcbiAgICBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDtcbiAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKHJvb3QuY3VycmVudCk7XG4gIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHMocm9vdCwgcm9vdC5jdXJyZW50LCBsYW5lcywgdHJhbnNpdGlvbnMpOyAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuICB7XG4gICAgdmFyIHByb2ZpbGVyRWZmZWN0cyA9IHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzO1xuICAgIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2ZpbGVyRWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIF9maWJlciA9IHByb2ZpbGVyRWZmZWN0c1tpXTtcbiAgICAgIGNvbW1pdFBhc3NpdmVFZmZlY3REdXJhdGlvbnMocm9vdCwgX2ZpYmVyKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpO1xuICB9XG5cbiAge1xuICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIHRydWUpO1xuICB9XG5cbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcblxuICB7XG4gICAgLy8gSWYgYWRkaXRpb25hbCBwYXNzaXZlIGVmZmVjdHMgd2VyZSBzY2hlZHVsZWQsIGluY3JlbWVudCBhIGNvdW50ZXIuIElmIHRoaXNcbiAgICAvLyBleGNlZWRzIHRoZSBsaW1pdCwgd2UnbGwgZmlyZSBhIHdhcm5pbmcuXG4gICAgaWYgKGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGlmIChyb290ID09PSByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IHJvb3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICB9IC8vIFRPRE86IE1vdmUgdG8gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c1xuXG5cbiAgb25Qb3N0Q29tbWl0Um9vdChyb290KTtcblxuICB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IHJvb3QuY3VycmVudC5zdGF0ZU5vZGU7XG4gICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIHJldHVybiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCAhPT0gbnVsbCAmJiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZChpbnN0YW5jZSkge1xuICBpZiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPT09IG51bGwpIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG5ldyBTZXQoW2luc3RhbmNlXSk7XG4gIH0gZWxzZSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IHRydWU7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn1cblxudmFyIG9uVW5jYXVnaHRFcnJvciA9IHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcjtcblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qocm9vdEZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpIHtcbiAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUocm9vdEZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3Ioc291cmNlRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yJDEpIHtcbiAge1xuICAgIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvciQxKTtcbiAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICB9XG5cbiAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBFcnJvciB3YXMgdGhyb3duIGF0IHRoZSByb290LiBUaGVyZSBpcyBubyBwYXJlbnQsIHNvIHRoZSByb290XG4gICAgLy8gaXRzZWxmIHNob3VsZCBjYXB0dXJlIGl0LlxuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHNvdXJjZUZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gbnVsbDtcblxuICB7XG4gICAgZmliZXIgPSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KGZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgY3RvciA9IGZpYmVyLnR5cGU7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICB2YXIgZXJyb3JJbmZvID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IkMSwgc291cmNlRmliZXIpO1xuICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gVE9ETzogVW50aWwgd2UgcmUtbGFuZCBza2lwVW5tb3VudGVkQm91bmRhcmllcyAoc2VlICMyMDE0NyksIHRoaXMgd2FybmluZ1xuICAgIC8vIHdpbGwgZmlyZSBmb3IgZXJyb3JzIHRoYXQgYXJlIHRocm93biBieSBkZXN0cm95IGZ1bmN0aW9ucyBpbnNpZGUgZGVsZXRlZFxuICAgIC8vIHRyZWVzLiBXaGF0IGl0IHNob3VsZCBpbnN0ZWFkIGRvIGlzIHByb3BhZ2F0ZSB0aGUgZXJyb3IgdG8gdGhlIHBhcmVudCBvZlxuICAgIC8vIHRoZSBkZWxldGVkIHRyZWUuIEluIHRoZSBtZWFudGltZSwgZG8gbm90IGFkZCB0aGlzIHdhcm5pbmcgdG8gdGhlXG4gICAgLy8gYWxsb3dsaXN0OyB0aGlzIGlzIG9ubHkgZm9yIG91ciBpbnRlcm5hbCB1c2UuXG4gICAgZXJyb3IoJ0ludGVybmFsIFJlYWN0IGVycm9yOiBBdHRlbXB0ZWQgdG8gY2FwdHVyZSBhIGNvbW1pdCBwaGFzZSBlcnJvciAnICsgJ2luc2lkZSBhIGRldGFjaGVkIHRyZWUuIFRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIFJlYWN0LiBMaWtlbHkgJyArICdjYXVzZXMgaW5jbHVkZSBkZWxldGluZyB0aGUgc2FtZSBmaWJlciBtb3JlIHRoYW4gb25jZSwgY29tbWl0dGluZyBhbiAnICsgJ2FscmVhZHktZmluaXNoZWQgdHJlZSwgb3IgYW4gaW5jb25zaXN0ZW50IHJldHVybiBwb2ludGVyLlxcblxcbicgKyAnRXJyb3IgbWVzc2FnZTpcXG5cXG4lcycsIGVycm9yJDEpO1xuICB9XG59XG5mdW5jdGlvbiBwaW5nU3VzcGVuZGVkUm9vdChyb290LCB3YWtlYWJsZSwgcGluZ2VkTGFuZXMpIHtcbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuXG4gIGlmIChwaW5nQ2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICBwaW5nQ2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzKTtcbiAgd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCk7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCA9PT0gcm9vdCAmJiBpc1N1YnNldE9mTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMsIHBpbmdlZExhbmVzKSkge1xuICAgIC8vIFJlY2VpdmVkIGEgcGluZyBhdCB0aGUgc2FtZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCB3ZSdyZSBjdXJyZW50bHlcbiAgICAvLyByZW5kZXJpbmcuIFdlIG1pZ2h0IHdhbnQgdG8gcmVzdGFydCB0aGlzIHJlbmRlci4gVGhpcyBzaG91bGQgbWlycm9yXG4gICAgLy8gdGhlIGxvZ2ljIG9mIHdoZXRoZXIgb3Igbm90IGEgcm9vdCBzdXNwZW5kcyBvbmNlIGl0IGNvbXBsZXRlcy5cbiAgICAvLyBUT0RPOiBJZiB3ZSdyZSByZW5kZXJpbmcgc3luYyBlaXRoZXIgZHVlIHRvIFN5bmMsIEJhdGNoZWQgb3IgZXhwaXJlZCxcbiAgICAvLyB3ZSBzaG91bGQgcHJvYmFibHkgbmV2ZXIgcmVzdGFydC5cbiAgICAvLyBJZiB3ZSdyZSBzdXNwZW5kZWQgd2l0aCBkZWxheSwgb3IgaWYgaXQncyBhIHJldHJ5LCB3ZSdsbCBhbHdheXMgc3VzcGVuZFxuICAgIC8vIHNvIHdlIGNhbiBhbHdheXMgcmVzdGFydC5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkICYmIGluY2x1ZGVzT25seVJldHJpZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpICYmIG5vdygpIC0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA8IEZBTExCQUNLX1RIUk9UVExFX01TKSB7XG4gICAgICAvLyBSZXN0YXJ0IGZyb20gdGhlIHJvb3QuXG4gICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRXZlbiB0aG91Z2ggd2UgY2FuJ3QgcmVzdGFydCByaWdodCBub3csIHdlIG1pZ2h0IGdldCBhblxuICAgICAgLy8gb3Bwb3J0dW5pdHkgbGF0ZXIuIFNvIHdlIG1hcmsgdGhpcyByZW5kZXIgYXMgaGF2aW5nIGEgcGluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcywgcGluZ2VkTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuXG5mdW5jdGlvbiByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKSB7XG4gIC8vIFRoZSBib3VuZGFyeSBmaWJlciAoYSBTdXNwZW5zZSBjb21wb25lbnQgb3IgU3VzcGVuc2VMaXN0IGNvbXBvbmVudClcbiAgLy8gcHJldmlvdXNseSB3YXMgcmVuZGVyZWQgaW4gaXRzIGZhbGxiYWNrIHN0YXRlLiBPbmUgb2YgdGhlIHByb21pc2VzIHRoYXRcbiAgLy8gc3VzcGVuZGVkIGl0IGhhcyByZXNvbHZlZCwgd2hpY2ggbWVhbnMgYXQgbGVhc3QgcGFydCBvZiB0aGUgdHJlZSB3YXNcbiAgLy8gbGlrZWx5IHVuYmxvY2tlZC4gVHJ5IHJlbmRlcmluZyBhZ2FpbiwgYXQgYSBuZXcgbGFuZXMuXG4gIGlmIChyZXRyeUxhbmUgPT09IE5vTGFuZSkge1xuICAgIC8vIFRPRE86IEFzc2lnbiB0aGlzIHRvIGBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZWA/IHRvIGF2b2lkXG4gICAgLy8gdW5uZWNlc3NhcnkgZW50YW5nbGVtZW50P1xuICAgIHJldHJ5TGFuZSA9IHJlcXVlc3RSZXRyeUxhbmUoYm91bmRhcnlGaWJlcik7XG4gIH0gLy8gVE9ETzogU3BlY2lhbCBjYXNlIGlkbGUgcHJpb3JpdHk/XG5cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHJldHJ5TGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVJldHJ5V2FrZWFibGUoYm91bmRhcnlGaWJlciwgd2FrZWFibGUpIHtcbiAgdmFyIHJldHJ5TGFuZSA9IE5vTGFuZTsgLy8gRGVmYXVsdFxuXG4gIHZhciByZXRyeUNhY2hlO1xuXG4gIHN3aXRjaCAoYm91bmRhcnlGaWJlci50YWcpIHtcbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaW5nZWQgdW5rbm93biBzdXNwZW5zZSBib3VuZGFyeSB0eXBlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH1cblxuICBpZiAocmV0cnlDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHJldHJ5Q2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufSAvLyBDb21wdXRlcyB0aGUgbmV4dCBKdXN0IE5vdGljZWFibGUgRGlmZmVyZW5jZSAoSk5EKSBib3VuZGFyeS5cbi8vIFRoZSB0aGVvcnkgaXMgdGhhdCBhIHBlcnNvbiBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc21hbGwgZGlmZmVyZW5jZXMgaW4gdGltZS5cbi8vIFRoZXJlZm9yZSwgaWYgd2Ugd2FpdCBhIGJpdCBsb25nZXIgdGhhbiBuZWNlc3NhcnkgdGhhdCB3b24ndCB0cmFuc2xhdGUgdG8gYSBub3RpY2VhYmxlXG4vLyBkaWZmZXJlbmNlIGluIHRoZSBleHBlcmllbmNlLiBIb3dldmVyLCB3YWl0aW5nIGZvciBsb25nZXIgbWlnaHQgbWVhbiB0aGF0IHdlIGNhbiBhdm9pZFxuLy8gc2hvd2luZyBhbiBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gVGhlIGxvbmdlciB3ZSBoYXZlIGFscmVhZHkgd2FpdGVkLCB0aGUgaGFyZGVyIGl0XG4vLyBpcyB0byB0ZWxsIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuIFRoZXJlZm9yZSwgdGhlIGxvbmdlciB3ZSd2ZSBhbHJlYWR5IHdhaXRlZCxcbi8vIHRoZSBsb25nZXIgd2UgY2FuIHdhaXQgYWRkaXRpb25hbGx5LiBBdCBzb21lIHBvaW50IHdlIGhhdmUgdG8gZ2l2ZSB1cCB0aG91Z2guXG4vLyBXZSBwaWNrIGEgdHJhaW4gbW9kZWwgd2hlcmUgdGhlIG5leHQgYm91bmRhcnkgY29tbWl0cyBhdCBhIGNvbnNpc3RlbnQgc2NoZWR1bGUuXG4vLyBUaGVzZSBwYXJ0aWN1bGFyIG51bWJlcnMgYXJlIHZhZ3VlIGVzdGltYXRlcy4gV2UgZXhwZWN0IHRvIGFkanVzdCB0aGVtIGJhc2VkIG9uIHJlc2VhcmNoLlxuXG5mdW5jdGlvbiBqbmQodGltZUVsYXBzZWQpIHtcbiAgcmV0dXJuIHRpbWVFbGFwc2VkIDwgMTIwID8gMTIwIDogdGltZUVsYXBzZWQgPCA0ODAgPyA0ODAgOiB0aW1lRWxhcHNlZCA8IDEwODAgPyAxMDgwIDogdGltZUVsYXBzZWQgPCAxOTIwID8gMTkyMCA6IHRpbWVFbGFwc2VkIDwgMzAwMCA/IDMwMDAgOiB0aW1lRWxhcHNlZCA8IDQzMjAgPyA0MzIwIDogY2VpbCh0aW1lRWxhcHNlZCAvIDE5NjApICogMTk2MDtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCkge1xuICBpZiAobmVzdGVkVXBkYXRlQ291bnQgPiBORVNURURfVVBEQVRFX0xJTUlUKSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArICdyZXBlYXRlZGx5IGNhbGxzIHNldFN0YXRlIGluc2lkZSBjb21wb25lbnRXaWxsVXBkYXRlIG9yICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgdXBkYXRlcyB0byAnICsgJ3ByZXZlbnQgaW5maW5pdGUgbG9vcHMuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAgICBlcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyBcImNhbGxzIHNldFN0YXRlIGluc2lkZSB1c2VFZmZlY3QsIGJ1dCB1c2VFZmZlY3QgZWl0aGVyIGRvZXNuJ3QgXCIgKyAnaGF2ZSBhIGRlcGVuZGVuY3kgYXJyYXksIG9yIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZXMgb24gJyArICdldmVyeSByZW5kZXIuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpIHtcbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihmaWJlciwgaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAge1xuICAgIC8vIFRPRE8gKFN0cmljdEVmZmVjdHMpIFNob3VsZCB3ZSBzZXQgYSBtYXJrZXIgb24gdGhlIHJvb3QgaWYgaXQgY29udGFpbnMgc3RyaWN0IGVmZmVjdHNcbiAgICAvLyBzbyB3ZSBkb24ndCB0cmF2ZXJzZSB1bm5lY2Vzc2FyaWx5PyBzaW1pbGFyIHRvIHN1YnRyZWVGbGFncyBidXQganVzdCBhdCB0aGUgcm9vdCBsZXZlbC5cbiAgICAvLyBNYXliZSBub3QgYSBiaWcgZGVhbCBzaW5jZSB0aGlzIGlzIERFViBvbmx5IGJlaGF2aW9yLlxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudExheW91dERldiwgaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYpO1xuXG4gICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50UGFzc2l2ZURldiwgaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlRWZmZWN0c0luRGV2KGZpcnN0Q2hpbGQsIGZpYmVyRmxhZ3MsIGludm9rZUVmZmVjdEZuKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICB2YXIgY3VycmVudCA9IGZpcnN0Q2hpbGQ7XG4gICAgdmFyIHN1YnRyZWVSb290ID0gbnVsbDtcblxuICAgIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJpbWFyeVN1YnRyZWVGbGFnID0gY3VycmVudC5zdWJ0cmVlRmxhZ3MgJiBmaWJlckZsYWdzO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gc3VidHJlZVJvb3QgJiYgY3VycmVudC5jaGlsZCAhPT0gbnVsbCAmJiBwcmltYXJ5U3VidHJlZUZsYWcgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBmaWJlckZsYWdzKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIGludm9rZUVmZmVjdEZuKGN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudCA9IHN1YnRyZWVSb290ID0gY3VycmVudC5yZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBudWxsO1xuZnVuY3Rpb24gd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gV2UgbGV0IHRoZSBvdGhlciB3YXJuaW5nIGFib3V0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGRlYWwgd2l0aCB0aGlzIG9uZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIShmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEluZGV0ZXJtaW5hdGVDb21wb25lbnQgJiYgdGFnICE9PSBIb3N0Um9vdCAmJiB0YWcgIT09IENsYXNzQ29tcG9uZW50ICYmIHRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgdGFnICE9PSBGb3J3YXJkUmVmICYmIHRhZyAhPT0gTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgIC8vIE9ubHkgd2FybiBmb3IgdXNlci1kZWZpbmVkIGNvbXBvbmVudHMsIG5vdCBpbnRlcm5hbCBvbmVzIGxpa2UgU3VzcGVuc2UuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBzaG93IHRoZSB3aG9sZSBzdGFjayBidXQgZGVkdXBlIG9uIHRoZSB0b3AgY29tcG9uZW50J3MgbmFtZSBiZWNhdXNlXG4gICAgLy8gdGhlIHByb2JsZW1hdGljIGNvZGUgYWxtb3N0IGFsd2F5cyBsaWVzIGluc2lkZSB0aGF0IGNvbXBvbmVudC5cblxuXG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnUmVhY3RDb21wb25lbnQnO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbmV3IFNldChbY29tcG9uZW50TmFtZV0pO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgIHRyeSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICBlcnJvcihcIkNhbid0IHBlcmZvcm0gYSBSZWFjdCBzdGF0ZSB1cGRhdGUgb24gYSBjb21wb25lbnQgdGhhdCBoYXNuJ3QgbW91bnRlZCB5ZXQuIFwiICsgJ1RoaXMgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgYSBzaWRlLWVmZmVjdCBpbiB5b3VyIHJlbmRlciBmdW5jdGlvbiB0aGF0ICcgKyAnYXN5bmNocm9ub3VzbHkgbGF0ZXIgY2FsbHMgdHJpZXMgdG8gdXBkYXRlIHRoZSBjb21wb25lbnQuIE1vdmUgdGhpcyB3b3JrIHRvICcgKyAndXNlRWZmZWN0IGluc3RlYWQuJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxudmFyIGJlZ2luV29yayQxO1xuXG57XG4gIHZhciBkdW1teUZpYmVyID0gbnVsbDtcblxuICBiZWdpbldvcmskMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcykge1xuICAgIC8vIElmIGEgY29tcG9uZW50IHRocm93cyBhbiBlcnJvciwgd2UgcmVwbGF5IGl0IGFnYWluIGluIGEgc3luY2hyb25vdXNseVxuICAgIC8vIGRpc3BhdGNoZWQgZXZlbnQsIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgdHJlYXQgaXQgYXMgYW4gdW5jYXVnaHRcbiAgICAvLyBlcnJvciBTZWUgUmVhY3RFcnJvclV0aWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNvcHkgdGhlIHdvcmstaW4tcHJvZ3Jlc3Mgb250byBhIGR1bW15XG4gICAgLy8gZmliZXIuIElmIGJlZ2luV29yayB0aHJvd3MsIHdlJ2xsIHVzZSB0aGlzIHRvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB2YXIgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihkdW1teUZpYmVyLCB1bml0T2ZXb3JrKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmVnaW5Xb3JrKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcbiAgICB9IGNhdGNoIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICBpZiAoZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHx8IG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IHByb21pc2VzLlxuICAgICAgICAvLyBEb24ndCByZXBsYXkgZXJyb3JzIGlmIHdlIGFyZSBoeWRyYXRpbmcgYW5kIGhhdmUgYWxyZWFkeSBzdXNwZW5kZWQgb3IgaGFuZGxlZCBhbiBlcnJvclxuICAgICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgICAgfSAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggaGFuZGxlRXJyb3I7IGFueSBjaGFuZ2VzIGhlcmUgbXVzdCBoYXZlXG4gICAgICAvLyBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdGhlcmUuXG5cblxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpOyAvLyBEb24ndCByZXNldCBjdXJyZW50IGRlYnVnIGZpYmVyLCBzaW5jZSB3ZSdyZSBhYm91dCB0byB3b3JrIG9uIHRoZVxuICAgICAgLy8gc2FtZSBmaWJlciBhZ2Fpbi5cbiAgICAgIC8vIFVud2luZCB0aGUgZmFpbGVkIHN0YWNrIGZyYW1lXG5cbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCB1bml0T2ZXb3JrKTsgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyBvZiB0aGUgZmliZXIuXG5cbiAgICAgIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHVuaXRPZldvcmssIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5KTtcblxuICAgICAgaWYgKCB1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIgdGltZXIuXG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIH0gLy8gUnVuIGJlZ2luV29yayBhZ2Fpbi5cblxuXG4gICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgYmVnaW5Xb3JrLCBudWxsLCBjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG5cbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIHZhciByZXBsYXlFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlcGxheUVycm9yID09PSAnb2JqZWN0JyAmJiByZXBsYXlFcnJvciAhPT0gbnVsbCAmJiByZXBsYXlFcnJvci5fc3VwcHJlc3NMb2dnaW5nICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yID09PSAnb2JqZWN0JyAmJiBvcmlnaW5hbEVycm9yICE9PSBudWxsICYmICFvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgICAvLyBJZiBzdXBwcmVzc2VkLCBsZXQgdGhlIGZsYWcgY2Fycnkgb3ZlciB0byB0aGUgb3JpZ2luYWwgZXJyb3Igd2hpY2ggaXMgdGhlIG9uZSB3ZSdsbCByZXRocm93LlxuICAgICAgICAgIG9yaWdpbmFsRXJyb3IuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gV2UgYWx3YXlzIHRocm93IHRoZSBvcmlnaW5hbCBlcnJvciBpbiBjYXNlIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MgaXMgbm90IGlkZW1wb3RlbnQuXG4gICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgYSBtZW1vaXplZCBmdW5jdGlvbiBvciBDb21tb25KUyBtb2R1bGUgZG9lc24ndCB0aHJvdyBhZnRlciBmaXJzdCBpbnZvY2F0aW9uLlxuXG5cbiAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmICFnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSkge1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUgPSB3b3JrSW5Qcm9ncmVzcyAmJiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnVW5rbm93bic7IC8vIERlZHVwZSBieSB0aGUgcmVuZGVyaW5nIGNvbXBvbmVudCBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLlxuXG4gICAgICAgICAgICB2YXIgZGVkdXBlS2V5ID0gcmVuZGVyaW5nQ29tcG9uZW50TmFtZTtcblxuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuaGFzKGRlZHVwZUtleSkpIHtcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChkZWR1cGVLZXkpO1xuICAgICAgICAgICAgICB2YXIgc2V0U3RhdGVDb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGEgY29tcG9uZW50IChgJXNgKSB3aGlsZSByZW5kZXJpbmcgYSAnICsgJ2RpZmZlcmVudCBjb21wb25lbnQgKGAlc2ApLiBUbyBsb2NhdGUgdGhlIGJhZCBzZXRTdGF0ZSgpIGNhbGwgaW5zaWRlIGAlc2AsICcgKyAnZm9sbG93IHRoZSBzdGFjayB0cmFjZSBhcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NldHN0YXRlLWluLXJlbmRlcicsIHNldFN0YXRlQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIpIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgZHVyaW5nIGFuIGV4aXN0aW5nIHN0YXRlIHRyYW5zaXRpb24gKHN1Y2ggYXMgJyArICd3aXRoaW4gYHJlbmRlcmApLiBSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlICcgKyAnZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLicpO1xuXG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuICAgICAgbWVtb2l6ZWRVcGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzY2hlZHVsaW5nRmliZXIpIHtcbiAgICAgICAgYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIHNjaGVkdWxpbmdGaWJlciwgbGFuZXMpO1xuICAgICAgfSk7IC8vIFRoaXMgZnVuY3Rpb24gaW50ZW50aW9uYWxseSBkb2VzIG5vdCBjbGVhciBtZW1vaXplZCB1cGRhdGVycy5cbiAgICAgIC8vIFRob3NlIG1heSBzdGlsbCBiZSByZWxldmFudCB0byB0aGUgY3VycmVudCBjb21taXRcbiAgICAgIC8vIGFuZCBhIGZ1dHVyZSBvbmUgKGUuZy4gU3VzcGVuc2UpLlxuICAgIH1cbiAgfVxufVxudmFyIGZha2VBY3RDYWxsYmFja05vZGUgPSB7fTtcblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFjayQxKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGFuIGBhY3RgIHNjb3BlLCBieXBhc3MgU2NoZWR1bGVyIGFuZCBwdXNoIHRvXG4gICAgLy8gdGhlIGBhY3RgIHF1ZXVlIGluc3RlYWQuXG4gICAgdmFyIGFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50O1xuXG4gICAgaWYgKGFjdFF1ZXVlICE9PSBudWxsKSB7XG4gICAgICBhY3RRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBmYWtlQWN0Q2FsbGJhY2tOb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbENhbGxiYWNrJDEoY2FsbGJhY2tOb2RlKSB7XG4gIGlmICggY2FsbGJhY2tOb2RlID09PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIEluIHByb2R1Y3Rpb24sIGFsd2F5cyBjYWxsIFNjaGVkdWxlci4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHN0cmlwcGVkIG91dC5cblxuXG4gIHJldHVybiBjYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSB7XG4gIC8vIE5ldmVyIGZvcmNlIGZsdXNoIGluIHByb2R1Y3Rpb24uIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGdldCBzdHJpcHBlZCBvdXQuXG4gIHJldHVybiAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIGlmICghaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSkge1xuICAgICAgICAvLyBOb3QgaW4gYW4gYWN0IGVudmlyb25tZW50LiBObyBuZWVkIHRvIHdhcm4uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVnYWN5IG1vZGUgaGFzIGFkZGl0aW9uYWwgY2FzZXMgd2hlcmUgd2Ugc3VwcHJlc3MgYSB3YXJuaW5nLlxuICAgICAgaWYgKCFpc0xlZ2FjeUFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChleGVjdXRpb25Db250ZXh0ICE9PSBOb0NvbnRleHQpIHtcbiAgICAgICAgLy8gTGVnYWN5IG1vZGUgZG9lc24ndCB3YXJuIGlmIHRoZSB1cGRhdGUgaXMgYmF0Y2hlZCwgaS5lLlxuICAgICAgICAvLyBiYXRjaGVkVXBkYXRlcyBvciBmbHVzaFN5bmMuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpYmVyLnRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgZmliZXIudGFnICE9PSBGb3J3YXJkUmVmICYmIGZpYmVyLnRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkge1xuICAgICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUtaG9va3MgY29kZSwgbGVnYWN5IG1vZGUgb25seVxuICAgICAgICAvLyB3YXJucyBmb3IgdXBkYXRlcyB0aGF0IG9yaWdpbmF0ZSBmcm9tIGEgaG9vay5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICBlcnJvcignQW4gdXBkYXRlIHRvICVzIGluc2lkZSBhIHRlc3Qgd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgY2F1c2VzIFJlYWN0IHN0YXRlIHVwZGF0ZXMgc2hvdWxkIGJlICcgKyAnd3JhcHBlZCBpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmlyZSBldmVudHMgdGhhdCB1cGRhdGUgc3RhdGUgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuSWZTdXNwZW5zZVJlc29sdXRpb25Ob3RXcmFwcGVkV2l0aEFjdERFVihyb290KSB7XG4gIHtcbiAgICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIHN1c3BlbmRlZCByZXNvdXJjZSBmaW5pc2hlZCBsb2FkaW5nIGluc2lkZSBhIHRlc3QsIGJ1dCB0aGUgZXZlbnQgJyArICd3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCByZXNvbHZlcyBzdXNwZW5kZWQgZGF0YSBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ2ludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaW5pc2ggbG9hZGluZyBzdXNwZW5kZWQgZGF0YSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoaXNSdW5uaW5nKSB7XG4gIHtcbiAgICBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBpc1J1bm5pbmc7XG4gIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2RlcyAqL1xudmFyIHJlc29sdmVGYW1pbHkgPSBudWxsOyAvLyAkRmxvd0ZpeE1lIEZsb3cgZ2V0cyBjb25mdXNlZCBieSBhIFdlYWtTZXQgZmVhdHVyZSBjaGVjayBiZWxvdy5cblxudmFyIGZhaWxlZEJvdW5kYXJpZXMgPSBudWxsO1xudmFyIHNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAge1xuICAgIHJlc29sdmVGYW1pbHkgPSBoYW5kbGVyO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgLy8gTm8gaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuXG4gIHJldHVybiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZWFsIGZvcndhcmRSZWYuIERvbid0IHdhbnQgdG8gY3Jhc2ggZWFybHkuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCAmJiB0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZvcndhcmRSZWYgaXMgc3BlY2lhbCBiZWNhdXNlIGl0cyByZXNvbHZlZCAudHlwZSBpcyBhbiBvYmplY3QsXG4gICAgICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2Ugb25seSBoYXZlIGl0cyBpbm5lciByZW5kZXIgZnVuY3Rpb24gaW4gdGhlIG1hcC5cbiAgICAgICAgLy8gSWYgdGhhdCBpbm5lciByZW5kZXIgZnVuY3Rpb24gaXMgZGlmZmVyZW50LCB3ZSdsbCBidWlsZCBhIG5ldyBmb3J3YXJkUmVmIHR5cGUuXG4gICAgICAgIHZhciBjdXJyZW50UmVuZGVyID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUucmVuZGVyKTtcblxuICAgICAgICBpZiAodHlwZS5yZW5kZXIgIT09IGN1cnJlbnRSZW5kZXIpIHtcbiAgICAgICAgICB2YXIgc3ludGhldGljVHlwZSA9IHtcbiAgICAgICAgICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgICAgICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN5bnRoZXRpY1R5cGUuZGlzcGxheU5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzeW50aGV0aWNUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGZpYmVyLCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHJldlR5cGUgPSBmaWJlci5lbGVtZW50VHlwZTtcbiAgICB2YXIgbmV4dFR5cGUgPSBlbGVtZW50LnR5cGU7IC8vIElmIHdlIGdvdCBoZXJlLCB3ZSBrbm93IHR5cGVzIGFyZW4ndCA9PT0gZXF1YWwuXG5cbiAgICB2YXIgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSBmYWxzZTtcbiAgICB2YXIgJCR0eXBlb2ZOZXh0VHlwZSA9IHR5cGVvZiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgbmV4dFR5cGUgIT09IG51bGwgPyBuZXh0VHlwZS4kJHR5cGVvZiA6IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBpbm5lciB0eXBlIHlldC5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBsYXp5IGlubmVyIHR5cGUgaXMgc3RhYmxlLFxuICAgICAgICAgICAgLy8gYW5kIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgcmVjb25jaWxpbmcgaXQgYXdheS5cbiAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byB1bndyYXAgb3IgYWN0dWFsbHkgdXNlIHRoZSBuZXcgbGF6eSB0eXBlLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpZiBpdCB3YXMgYnV0IGNhbiBubyBsb25nZXIgYmUgc2ltcGxlLFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHNldCB0aGlzLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gQ2hlY2sgaWYgYm90aCB0eXBlcyBoYXZlIGEgZmFtaWx5IGFuZCBpdCdzIHRoZSBzYW1lIG9uZS5cblxuXG4gICAgaWYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzKSB7XG4gICAgICAvLyBOb3RlOiBtZW1vKCkgYW5kIGZvcndhcmRSZWYoKSB3ZSdsbCBjb21wYXJlIG91dGVyIHJhdGhlciB0aGFuIGlubmVyIHR5cGUuXG4gICAgICAvLyBUaGlzIG1lYW5zIGJvdGggb2YgdGhlbSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgdG8gcHJlc2VydmUgc3RhdGUuXG4gICAgICAvLyBJZiB3ZSB1bndyYXBwZWQgYW5kIGNvbXBhcmVkIHRoZSBpbm5lciB0eXBlcyBmb3Igd3JhcHBlcnMgaW5zdGVhZCxcbiAgICAgIC8vIHRoZW4gd2Ugd291bGQgcmlzayBmYWxzZWx5IHNheWluZyB0d28gc2VwYXJhdGUgbWVtbyhGb28pXG4gICAgICAvLyBjYWxscyBhcmUgZXF1aXZhbGVudCBiZWNhdXNlIHRoZXkgd3JhcCB0aGUgc2FtZSBGb28gZnVuY3Rpb24uXG4gICAgICB2YXIgcHJldkZhbWlseSA9IHJlc29sdmVGYW1pbHkocHJldlR5cGUpO1xuXG4gICAgICBpZiAocHJldkZhbWlseSAhPT0gdW5kZWZpbmVkICYmIHByZXZGYW1pbHkgPT09IHJlc29sdmVGYW1pbHkobmV4dFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgV2Vha1NldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzID09PSBudWxsKSB7XG4gICAgICBmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICBmYWlsZWRCb3VuZGFyaWVzLmFkZChmaWJlcik7XG4gIH1cbn1cbnZhciBzY2hlZHVsZVJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgdXBkYXRlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3RhbGVGYW1pbGllcyA9IHVwZGF0ZS5zdGFsZUZhbWlsaWVzLFxuICAgICAgICB1cGRhdGVkRmFtaWxpZXMgPSB1cGRhdGUudXBkYXRlZEZhbWlsaWVzO1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2NoZWR1bGVSb290ID0gZnVuY3Rpb24gKHJvb3QsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290LmNvbnRleHQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgLy8gU3VwZXIgZWRnZSBjYXNlOiByb290IGhhcyBhIGxlZ2FjeSBfcmVuZGVyU3VidHJlZSBjb250ZXh0XG4gICAgICAvLyBidXQgd2UgZG9uJ3Qga25vdyB0aGUgcGFyZW50Q29tcG9uZW50IHNvIHdlIGNhbid0IHBhc3MgaXQuXG4gICAgICAvLyBKdXN0IGlnbm9yZS4gV2UnbGwgZGVsZXRlIHRoaXMgd2l0aCBfcmVuZGVyU3VidHJlZSBjb2RlIHBhdGggbGF0ZXIuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoZmliZXIsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcykge1xuICB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNvbHZlRmFtaWx5IHRvIGJlIHNldCBkdXJpbmcgaG90IHJlbG9hZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZW5kZXIgPSBmYWxzZTtcbiAgICB2YXIgbmVlZHNSZW1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkoY2FuZGlkYXRlVHlwZSk7XG5cbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RhbGVGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodXBkYXRlZEZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgaWYgKHRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZWRzUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMuaGFzKGZpYmVyKSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgZmFpbGVkQm91bmRhcmllcy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQpIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z05lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCB8fCBuZWVkc1JlbmRlcikge1xuICAgICAgdmFyIF9yb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChfcm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoX3Jvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiAhbmVlZHNSZW1vdW50KSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGNoaWxkLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgZmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBob3N0SW5zdGFuY2VzID0gbmV3IFNldCgpO1xuICAgIHZhciB0eXBlcyA9IG5ldyBTZXQoZmFtaWxpZXMubWFwKGZ1bmN0aW9uIChmYW1pbHkpIHtcbiAgICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgICB9KSk7XG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIHJldHVybiBob3N0SW5zdGFuY2VzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoZmliZXIsIHR5cGVzLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZGlkTWF0Y2ggPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKGNhbmRpZGF0ZVR5cGUpKSB7XG4gICAgICAgIGRpZE1hdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlkTWF0Y2gpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4gVGhpcyBvbmx5IGRyaWxscyBkb3duIHRvIHRoZSBjbG9zZXN0IGhvc3QgY29tcG9uZW50cy5cbiAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZWFyY2ggZGVlcGVyIGJlY2F1c2UgZm9yIHRoZSBwdXJwb3NlIG9mIGdpdmluZ1xuICAgICAgLy8gdmlzdWFsIGZlZWRiYWNrLCBcImZsYXNoaW5nXCIgb3V0ZXJtb3N0IHBhcmVudCByZWN0YW5nbGVzIGlzIHN1ZmZpY2llbnQuXG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwgbWF5YmUgdGhlcmUgd2lsbCBiZSBvbmUgZnVydGhlciBkb3duIGluIHRoZSBjaGlsZCB0cmVlLlxuICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShjaGlsZCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoc2libGluZywgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcblxuICAgIGlmIChmb3VuZEhvc3RJbnN0YW5jZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBob3N0IGNoaWxkcmVuLCBmYWxsYmFjayB0byBjbG9zZXN0IGhvc3QgcGFyZW50LlxuXG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gcmVhY2ggcm9vdCBmaXJzdC4nKTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBub2RlID0gZmliZXI7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICAvLyBXZSBnb3QgYSBtYXRjaC5cbiAgICAgICAgZm91bmRIb3N0SW5zdGFuY2VzID0gdHJ1ZTtcbiAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpOyAvLyBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSwgc28ga2VlcCBzZWFyY2hpbmcuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaWJlcikge1xuICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmliZXIpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc0JhZE1hcFBvbHlmaWxsO1xuXG57XG4gIGhhc0JhZE1hcFBvbHlmaWxsID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtub25FeHRlbnNpYmxlT2JqZWN0XSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXcgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgYWJvdXQgYmFkIHBvbHlmaWxsc1xuICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyBJbnN0YW5jZVxuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5rZXkgPSBrZXk7XG4gIHRoaXMuZWxlbWVudFR5cGUgPSBudWxsO1xuICB0aGlzLnR5cGUgPSBudWxsO1xuICB0aGlzLnN0YXRlTm9kZSA9IG51bGw7IC8vIEZpYmVyXG5cbiAgdGhpcy5yZXR1cm4gPSBudWxsO1xuICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgdGhpcy5zaWJsaW5nID0gbnVsbDtcbiAgdGhpcy5pbmRleCA9IDA7XG4gIHRoaXMucmVmID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7XG4gIHRoaXMubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gIHRoaXMudXBkYXRlUXVldWUgPSBudWxsO1xuICB0aGlzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB0aGlzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gIHRoaXMubW9kZSA9IG1vZGU7IC8vIEVmZmVjdHNcblxuICB0aGlzLmZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICB0aGlzLmRlbGV0aW9ucyA9IG51bGw7XG4gIHRoaXMubGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmFsdGVybmF0ZSA9IG51bGw7XG5cbiAge1xuICAgIC8vIE5vdGU6IFRoZSBmb2xsb3dpbmcgaXMgZG9uZSB0byBhdm9pZCBhIHY4IHBlcmZvcm1hbmNlIGNsaWZmLlxuICAgIC8vXG4gICAgLy8gSW5pdGlhbGl6aW5nIHRoZSBmaWVsZHMgYmVsb3cgdG8gc21pcyBhbmQgbGF0ZXIgdXBkYXRpbmcgdGhlbSB3aXRoXG4gICAgLy8gZG91YmxlIHZhbHVlcyB3aWxsIGNhdXNlIEZpYmVycyB0byBlbmQgdXAgaGF2aW5nIHNlcGFyYXRlIHNoYXBlcy5cbiAgICAvLyBUaGlzIGJlaGF2aW9yL2J1ZyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggT2JqZWN0LnByZXZlbnRFeHRlbnNpb24oKS5cbiAgICAvLyBGb3J0dW5hdGVseSB0aGlzIG9ubHkgaW1wYWN0cyBERVYgYnVpbGRzLlxuICAgIC8vIFVuZm9ydHVuYXRlbHkgaXQgbWFrZXMgUmVhY3QgdW51c2FibHkgc2xvdyBmb3Igc29tZSBhcHBsaWNhdGlvbnMuXG4gICAgLy8gVG8gd29yayBhcm91bmQgdGhpcywgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIGJlbG93IHdpdGggZG91Ymxlcy5cbiAgICAvL1xuICAgIC8vIExlYXJuIG1vcmUgYWJvdXQgdGhpcyBoZXJlOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQzNjVcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD04NTM4XG4gICAgdGhpcy5hY3R1YWxEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gTnVtYmVyLk5hTjsgLy8gSXQncyBva2F5IHRvIHJlcGxhY2UgdGhlIGluaXRpYWwgZG91YmxlcyB3aXRoIHNtaXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgLy8gVGhpcyB3b24ndCB0cmlnZ2VyIHRoZSBwZXJmb3JtYW5jZSBjbGlmZiBtZW50aW9uZWQgYWJvdmUsXG4gICAgLy8gYW5kIGl0IHNpbXBsaWZpZXMgb3RoZXIgcHJvZmlsZXIgY29kZSAoaW5jbHVkaW5nIERldlRvb2xzKS5cblxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIC8vIFRoaXMgaXNuJ3QgZGlyZWN0bHkgdXNlZCBidXQgaXMgaGFuZHkgZm9yIGRlYnVnZ2luZyBpbnRlcm5hbHM6XG4gICAgdGhpcy5fZGVidWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnTmVlZHNSZW1vdW50ID0gZmFsc2U7XG4gICAgdGhpcy5fZGVidWdIb29rVHlwZXMgPSBudWxsO1xuXG4gICAgaWYgKCFoYXNCYWRNYXBQb2x5ZmlsbCAmJiB0eXBlb2YgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICB9XG59IC8vIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYSBQT0pPIGNvbnN0cnVjdG9yLCBzdGlsbFxuLy8gcGxlYXNlIGVuc3VyZSB3ZSBkbyB0aGUgZm9sbG93aW5nOlxuLy8gMSkgTm9ib2R5IHNob3VsZCBhZGQgYW55IGluc3RhbmNlIG1ldGhvZHMgb24gdGhpcy4gSW5zdGFuY2UgbWV0aG9kcyBjYW4gYmVcbi8vICAgIG1vcmUgZGlmZmljdWx0IHRvIHByZWRpY3Qgd2hlbiB0aGV5IGdldCBvcHRpbWl6ZWQgYW5kIHRoZXkgYXJlIGFsbW9zdFxuLy8gICAgbmV2ZXIgaW5saW5lZCBwcm9wZXJseSBpbiBzdGF0aWMgY29tcGlsZXJzLlxuLy8gMikgTm9ib2R5IHNob3VsZCByZWx5IG9uIGBpbnN0YW5jZW9mIEZpYmVyYCBmb3IgdHlwZSB0ZXN0aW5nLiBXZSBzaG91bGRcbi8vICAgIGFsd2F5cyBrbm93IHdoZW4gaXQgaXMgYSBmaWJlci5cbi8vIDMpIFdlIG1pZ2h0IHdhbnQgdG8gZXhwZXJpbWVudCB3aXRoIHVzaW5nIG51bWVyaWMga2V5cyBzaW5jZSB0aGV5IGFyZSBlYXNpZXJcbi8vICAgIHRvIG9wdGltaXplIGluIGEgbm9uLUpJVCBlbnZpcm9ubWVudC5cbi8vIDQpIFdlIGNhbiBlYXNpbHkgZ28gZnJvbSBhIGNvbnN0cnVjdG9yIHRvIGEgY3JlYXRlRmliZXIgb2JqZWN0IGxpdGVyYWwgaWYgdGhhdFxuLy8gICAgaXMgZmFzdGVyLlxuLy8gNSkgSXQgc2hvdWxkIGJlIGVhc3kgdG8gcG9ydCB0aGlzIHRvIGEgQyBzdHJ1Y3QgYW5kIGtlZXAgYSBDIGltcGxlbWVudGF0aW9uXG4vLyAgICBjb21wYXRpYmxlLlxuXG5cbnZhciBjcmVhdGVGaWJlciA9IGZ1bmN0aW9uICh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gIC8vICRGbG93Rml4TWU6IHRoZSBzaGFwZXMgYXJlIGV4YWN0IGhlcmUgYnV0IEZsb3cgZG9lc24ndCBsaWtlIGNvbnN0cnVjdG9yc1xuICByZXR1cm4gbmV3IEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgIXNob3VsZENvbnN0cnVjdCQxKHR5cGUpICYmIHR5cGUuZGVmYXVsdFByb3BzID09PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpIHtcbiAgaWYgKHR5cGVvZiBDb21wb25lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSA/IENsYXNzQ29tcG9uZW50IDogRnVuY3Rpb25Db21wb25lbnQ7XG4gIH0gZWxzZSBpZiAoQ29tcG9uZW50ICE9PSB1bmRlZmluZWQgJiYgQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gQ29tcG9uZW50LiQkdHlwZW9mO1xuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICByZXR1cm4gRm9yd2FyZFJlZjtcbiAgICB9XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgcmV0dXJuIE1lbW9Db21wb25lbnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7XG59IC8vIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgYW4gYWx0ZXJuYXRlIGZpYmVyIHRvIGRvIHdvcmsgb24uXG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIHBlbmRpbmdQcm9wcykge1xuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSBjdXJyZW50LmFsdGVybmF0ZTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgPT09IG51bGwpIHtcbiAgICAvLyBXZSB1c2UgYSBkb3VibGUgYnVmZmVyaW5nIHBvb2xpbmcgdGVjaG5pcXVlIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHdlJ2xsXG4gICAgLy8gb25seSBldmVyIG5lZWQgYXQgbW9zdCB0d28gdmVyc2lvbnMgb2YgYSB0cmVlLiBXZSBwb29sIHRoZSBcIm90aGVyXCIgdW51c2VkXG4gICAgLy8gbm9kZSB0aGF0IHdlJ3JlIGZyZWUgdG8gcmV1c2UuIFRoaXMgaXMgbGF6aWx5IGNyZWF0ZWQgdG8gYXZvaWQgYWxsb2NhdGluZ1xuICAgIC8vIGV4dHJhIG9iamVjdHMgZm9yIHRoaW5ncyB0aGF0IGFyZSBuZXZlciB1cGRhdGVkLiBJdCBhbHNvIGFsbG93IHVzIHRvXG4gICAgLy8gcmVjbGFpbSB0aGUgZXh0cmEgbWVtb3J5IGlmIG5lZWRlZC5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZUZpYmVyKGN1cnJlbnQudGFnLCBwZW5kaW5nUHJvcHMsIGN1cnJlbnQua2V5LCBjdXJyZW50Lm1vZGUpO1xuICAgIHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID0gY3VycmVudC5lbGVtZW50VHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuXG4gICAge1xuICAgICAgLy8gREVWLW9ubHkgZmllbGRzXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2UgPSBjdXJyZW50Ll9kZWJ1Z1NvdXJjZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0hvb2tUeXBlcyA9IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IGN1cnJlbnQ7XG4gICAgY3VycmVudC5hbHRlcm5hdGUgPSB3b3JrSW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gYWx0ZXJuYXRlLlxuICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgdGFnLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBOb0ZsYWdzOyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuXG4gICAge1xuICAgICAgLy8gV2UgaW50ZW50aW9uYWxseSByZXNldCwgcmF0aGVyIHRoYW4gY29weSwgYWN0dWFsRHVyYXRpb24gJiBhY3R1YWxTdGFydFRpbWUuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHRpbWUgZnJvbSBlbmRsZXNzbHkgYWNjdW11bGF0aW5nIGluIG5ldyBjb21taXRzLlxuICAgICAgLy8gVGhpcyBoYXMgdGhlIGRvd25zaWRlIG9mIHJlc2V0dGluZyB2YWx1ZXMgZm9yIGRpZmZlcmVudCBwcmlvcml0eSByZW5kZXJzLFxuICAgICAgLy8gQnV0IHdvcmtzIGZvciB5aWVsZGluZyAodGhlIGNvbW1vbiBjYXNlKSBhbmQgc2hvdWxkIHN1cHBvcnQgcmVzdW1pbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICB9XG4gIH0gLy8gUmVzZXQgYWxsIGVmZmVjdHMgZXhjZXB0IHN0YXRpYyBvbmVzLlxuICAvLyBTdGF0aWMgZWZmZWN0cyBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBjdXJyZW50LmZsYWdzICYgU3RhdGljTWFzaztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgfTsgLy8gVGhlc2Ugd2lsbCBiZSBvdmVycmlkZGVuIGR1cmluZyB0aGUgcGFyZW50J3MgcmVjb25jaWxpYXRpb25cblxuICB3b3JrSW5Qcm9ncmVzcy5zaWJsaW5nID0gY3VycmVudC5zaWJsaW5nO1xuICB3b3JrSW5Qcm9ncmVzcy5pbmRleCA9IGN1cnJlbnQuaW5kZXg7XG4gIHdvcmtJblByb2dyZXNzLnJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ID0gY3VycmVudC5fZGVidWdOZWVkc1JlbW91bnQ7XG5cbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufSAvLyBVc2VkIHRvIHJldXNlIGEgRmliZXIgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3Mod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgcmVzZXRzIHRoZSBGaWJlciB0byB3aGF0IGNyZWF0ZUZpYmVyIG9yIGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkXG4gIC8vIGhhdmUgc2V0IHRoZSB2YWx1ZXMgdG8gYmVmb3JlIGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSWRlYWxseSB0aGlzIHdvdWxkbid0XG4gIC8vIGJlIG5lY2Vzc2FyeSBidXQgdW5mb3J0dW5hdGVseSBtYW55IGNvZGUgcGF0aHMgcmVhZHMgZnJvbSB0aGUgd29ya0luUHJvZ3Jlc3NcbiAgLy8gd2hlbiB0aGV5IHNob3VsZCBiZSByZWFkaW5nIGZyb20gY3VycmVudCBhbmQgd3JpdGluZyB0byB3b3JrSW5Qcm9ncmVzcy5cbiAgLy8gV2UgYXNzdW1lIHBlbmRpbmdQcm9wcywgaW5kZXgsIGtleSwgcmVmLCByZXR1cm4gYXJlIHN0aWxsIHVudG91Y2hlZCB0b1xuICAvLyBhdm9pZCBkb2luZyBhbm90aGVyIHJlY29uY2lsaWF0aW9uLlxuICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJ1dCBrZWVwIGFueSBQbGFjZW1lbnQgdGFncywgc2luY2UgdGhhdCdzIHNvbWV0aGluZ1xuICAvLyB0aGF0IGNoaWxkIGZpYmVyIGlzIHNldHRpbmcsIG5vdCB0aGUgcmVjb25jaWxpYXRpb24uXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IFN0YXRpY01hc2sgfCBQbGFjZW1lbnQ7IC8vIFRoZSBlZmZlY3RzIGFyZSBubyBsb25nZXIgdmFsaWQuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBSZXNldCB0byBjcmVhdGVGaWJlcidzIGluaXRpYWwgdmFsdWVzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZXNldCB0byB0aGUgY2xvbmVkIHZhbHVlcyB0aGF0IGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkJ3ZlLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gICAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gICAgdmFyIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgICAgZmlyc3RDb250ZXh0OiBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dFxuICAgIH07XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufVxuZnVuY3Rpb24gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSkge1xuICB2YXIgbW9kZTtcblxuICBpZiAodGFnID09PSBDb25jdXJyZW50Um9vdCkge1xuICAgIG1vZGUgPSBDb25jdXJyZW50TW9kZTtcblxuICAgIGlmIChpc1N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAge1xuICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBtb2RlID0gTm9Nb2RlO1xuICB9XG5cbiAgaWYgKCBpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIC8vIEFsd2F5cyBjb2xsZWN0IHByb2ZpbGUgdGltaW5ncyB3aGVuIERldlRvb2xzIGFyZSBwcmVzZW50LlxuICAgIC8vIFRoaXMgZW5hYmxlcyBEZXZUb29scyB0byBzdGFydCBjYXB0dXJpbmcgdGltaW5nIGF0IGFueSBwb2ludOKAk1xuICAgIC8vIFdpdGhvdXQgc29tZSBub2RlcyBpbiB0aGUgdHJlZSBoYXZpbmcgZW1wdHkgYmFzZSB0aW1lcy5cbiAgICBtb2RlIHw9IFByb2ZpbGVNb2RlO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyKEhvc3RSb290LCBudWxsLCBudWxsLCBtb2RlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCAvLyBSZWFjdCRFbGVtZW50VHlwZVxua2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXJUYWcgPSBJbmRldGVybWluYXRlQ29tcG9uZW50OyAvLyBUaGUgcmVzb2x2ZWQgdHlwZSBpcyBzZXQgaWYgd2Uga25vdyB3aGF0IHRoZSBmaW5hbCB0eXBlIHdpbGwgYmUuIEkuZS4gaXQncyBub3QgbGF6eS5cblxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoc2hvdWxkQ29uc3RydWN0JDEodHlwZSkpIHtcbiAgICAgIGZpYmVyVGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGZpYmVyVGFnID0gSG9zdENvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICBnZXRUYWc6IHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQocGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICBmaWJlclRhZyA9IE1vZGU7XG4gICAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAgICBpZiAoIChtb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAvLyBTdHJpY3QgZWZmZWN0cyBzaG91bGQgbmV2ZXIgcnVuIG9uIGxlZ2FjeSByb290c1xuICAgICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfU0NPUEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfQ0FDSEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfVFJBQ0lOR19NQVJLRVJfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dFByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gRm9yd2FyZFJlZjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTWVtb0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBMYXp5Q29tcG9uZW50O1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBcIiArICduYW1lZCBpbXBvcnRzLic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lciA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXIpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiAnICsgJ2NvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgY29tcG9uZW50cykgJyArIChcImJ1dCBnb3Q6IFwiICsgKHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSkgKyBcIi5cIiArIGluZm8pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKGZpYmVyVGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgZmliZXIudHlwZSA9IHJlc29sdmVkVHlwZTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBvd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIG93bmVyID0gbnVsbDtcblxuICB7XG4gICAgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBlbGVtZW50LnByb3BzO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwga2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcyk7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRnJhZ21lbnQsIGVsZW1lbnRzLCBrZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignUHJvZmlsZXIgbXVzdCBzcGVjaWZ5IGFuIFwiaWRcIiBvZiB0eXBlIGBzdHJpbmdgIGFzIGEgcHJvcC4gUmVjZWl2ZWQgdGhlIHR5cGUgYCVzYCBpbnN0ZWFkLicsIHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFByb2ZpbGVyLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSB8IFByb2ZpbGVNb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuXG4gIHtcbiAgICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgICBlZmZlY3REdXJhdGlvbjogMCxcbiAgICAgIHBhc3NpdmVFZmZlY3REdXJhdGlvbjogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihTdXNwZW5zZUNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VMaXN0Q29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKE9mZnNjcmVlbkNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX09GRlNDUkVFTl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICB2YXIgcHJpbWFyeUNoaWxkSW5zdGFuY2UgPSB7XG4gICAgaXNIaWRkZW46IGZhbHNlXG4gIH07XG4gIGZpYmVyLnN0YXRlTm9kZSA9IHByaW1hcnlDaGlsZEluc3RhbmNlO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gJ0RFTEVURUQnO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoZGVoeWRyYXRlZE5vZGUpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRGVoeWRyYXRlZEZyYWdtZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5zdGF0ZU5vZGUgPSBkZWh5ZHJhdGVkTm9kZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IHBvcnRhbC5jaGlsZHJlbiAhPT0gbnVsbCA/IHBvcnRhbC5jaGlsZHJlbiA6IFtdO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0UG9ydGFsLCBwZW5kaW5nUHJvcHMsIHBvcnRhbC5rZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgY29udGFpbmVySW5mbzogcG9ydGFsLmNvbnRhaW5lckluZm8sXG4gICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuICAgIC8vIFVzZWQgYnkgcGVyc2lzdGVudCB1cGRhdGVzXG4gICAgaW1wbGVtZW50YXRpb246IHBvcnRhbC5pbXBsZW1lbnRhdGlvblxuICB9O1xuICByZXR1cm4gZmliZXI7XG59IC8vIFVzZWQgZm9yIHN0YXNoaW5nIFdJUCBwcm9wZXJ0aWVzIHRvIHJlcGxheSBmYWlsZWQgd29yayBpbiBERVYuXG5cbmZ1bmN0aW9uIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHRhcmdldCwgc291cmNlKSB7XG4gIGlmICh0YXJnZXQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIEZpYmVyJ3MgaW5pdGlhbCBwcm9wZXJ0aWVzIHdpbGwgYWx3YXlzIGJlIG92ZXJ3cml0dGVuLlxuICAgIC8vIFdlIG9ubHkgdXNlIGEgRmliZXIgdG8gZW5zdXJlIHRoZSBzYW1lIGhpZGRlbiBjbGFzcyBzbyBERVYgaXNuJ3Qgc2xvdy5cbiAgICB0YXJnZXQgPSBjcmVhdGVGaWJlcihJbmRldGVybWluYXRlQ29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSB3cml0dGVuIGFzIGEgbGlzdCBvZiBhbGwgcHJvcGVydGllcy5cbiAgLy8gV2UgdHJpZWQgdG8gdXNlIE9iamVjdC5hc3NpZ24oKSBpbnN0ZWFkIGJ1dCB0aGlzIGlzIGNhbGxlZCBpblxuICAvLyB0aGUgaG90dGVzdCBwYXRoLCBhbmQgT2JqZWN0LmFzc2lnbigpIHdhcyB0b28gc2xvdzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwMlxuICAvLyBUaGlzIGNvZGUgaXMgREVWLW9ubHkgc28gc2l6ZSBpcyBub3QgYSBjb25jZXJuLlxuXG5cbiAgdGFyZ2V0LnRhZyA9IHNvdXJjZS50YWc7XG4gIHRhcmdldC5rZXkgPSBzb3VyY2Uua2V5O1xuICB0YXJnZXQuZWxlbWVudFR5cGUgPSBzb3VyY2UuZWxlbWVudFR5cGU7XG4gIHRhcmdldC50eXBlID0gc291cmNlLnR5cGU7XG4gIHRhcmdldC5zdGF0ZU5vZGUgPSBzb3VyY2Uuc3RhdGVOb2RlO1xuICB0YXJnZXQucmV0dXJuID0gc291cmNlLnJldHVybjtcbiAgdGFyZ2V0LmNoaWxkID0gc291cmNlLmNoaWxkO1xuICB0YXJnZXQuc2libGluZyA9IHNvdXJjZS5zaWJsaW5nO1xuICB0YXJnZXQuaW5kZXggPSBzb3VyY2UuaW5kZXg7XG4gIHRhcmdldC5yZWYgPSBzb3VyY2UucmVmO1xuICB0YXJnZXQucGVuZGluZ1Byb3BzID0gc291cmNlLnBlbmRpbmdQcm9wcztcbiAgdGFyZ2V0Lm1lbW9pemVkUHJvcHMgPSBzb3VyY2UubWVtb2l6ZWRQcm9wcztcbiAgdGFyZ2V0LnVwZGF0ZVF1ZXVlID0gc291cmNlLnVwZGF0ZVF1ZXVlO1xuICB0YXJnZXQubWVtb2l6ZWRTdGF0ZSA9IHNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICB0YXJnZXQuZGVwZW5kZW5jaWVzID0gc291cmNlLmRlcGVuZGVuY2llcztcbiAgdGFyZ2V0Lm1vZGUgPSBzb3VyY2UubW9kZTtcbiAgdGFyZ2V0LmZsYWdzID0gc291cmNlLmZsYWdzO1xuICB0YXJnZXQuc3VidHJlZUZsYWdzID0gc291cmNlLnN1YnRyZWVGbGFncztcbiAgdGFyZ2V0LmRlbGV0aW9ucyA9IHNvdXJjZS5kZWxldGlvbnM7XG4gIHRhcmdldC5sYW5lcyA9IHNvdXJjZS5sYW5lcztcbiAgdGFyZ2V0LmNoaWxkTGFuZXMgPSBzb3VyY2UuY2hpbGRMYW5lcztcbiAgdGFyZ2V0LmFsdGVybmF0ZSA9IHNvdXJjZS5hbHRlcm5hdGU7XG5cbiAge1xuICAgIHRhcmdldC5hY3R1YWxEdXJhdGlvbiA9IHNvdXJjZS5hY3R1YWxEdXJhdGlvbjtcbiAgICB0YXJnZXQuYWN0dWFsU3RhcnRUaW1lID0gc291cmNlLmFjdHVhbFN0YXJ0VGltZTtcbiAgICB0YXJnZXQuc2VsZkJhc2VEdXJhdGlvbiA9IHNvdXJjZS5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHRhcmdldC50cmVlQmFzZUR1cmF0aW9uID0gc291cmNlLnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87XG4gIHRoaXMucGVuZGluZ0NoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgdGhpcy5waW5nQ2FjaGUgPSBudWxsO1xuICB0aGlzLmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHRoaXMudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgdGhpcy5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lO1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5pZGVudGlmaWVyUHJlZml4ID0gaWRlbnRpZmllclByZWZpeDtcbiAgdGhpcy5vblJlY292ZXJhYmxlRXJyb3IgPSBvblJlY292ZXJhYmxlRXJyb3I7XG5cbiAge1xuICAgIHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IG51bGw7XG4gIH1cblxuICB7XG4gICAgdGhpcy5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgdGhpcy5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIHRoaXMubWVtb2l6ZWRVcGRhdGVycyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHRoaXMucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IFRvdGFsTGFuZXM7IF9pKyspIHtcbiAgICAgIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAucHVzaChuZXcgU2V0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZVJvb3QoKScgOiAnY3JlYXRlUm9vdCgpJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTGVnYWN5Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZSgpJyA6ICdyZW5kZXIoKSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCAvLyBUT0RPOiBXZSBoYXZlIHNldmVyYWwgb2YgdGhlc2UgYXJndW1lbnRzIHRoYXQgYXJlIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZVxuLy8gaG9zdCBjb25maWcsIGJ1dCBiZWNhdXNlIHRoZXkgYXJlIHBhc3NlZCBpbiBhdCBydW50aW1lLCB3ZSBoYXZlIHRvIHRocmVhZFxuLy8gdGhlbSB0aHJvdWdoIHRoZSByb290IGNvbnN0cnVjdG9yLiBQZXJoYXBzIHdlIHNob3VsZCBwdXQgdGhlbSBhbGwgaW50byBhXG4vLyBzaW5nbGUgdHlwZSwgbGlrZSBhIER5bmFtaWNIb3N0Q29uZmlnIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUgcmVuZGVyZXIuXG5pZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIC8vIHN0YXRlTm9kZSBpcyBhbnkuXG5cblxuICB2YXIgdW5pbml0aWFsaXplZEZpYmVyID0gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSk7XG4gIHJvb3QuY3VycmVudCA9IHVuaW5pdGlhbGl6ZWRGaWJlcjtcbiAgdW5pbml0aWFsaXplZEZpYmVyLnN0YXRlTm9kZSA9IHJvb3Q7XG5cbiAge1xuICAgIHZhciBfaW5pdGlhbFN0YXRlID0ge1xuICAgICAgZWxlbWVudDogaW5pdGlhbENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBoeWRyYXRlLFxuICAgICAgY2FjaGU6IG51bGwsXG4gICAgICAvLyBub3QgZW5hYmxlZCB5ZXRcbiAgICAgIHRyYW5zaXRpb25zOiBudWxsLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbnVsbFxuICAgIH07XG4gICAgdW5pbml0aWFsaXplZEZpYmVyLm1lbW9pemVkU3RhdGUgPSBfaW5pdGlhbFN0YXRlO1xuICB9XG5cbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7XG4gIHJldHVybiByb290O1xufVxuXG52YXIgUmVhY3RWZXJzaW9uID0gJzE4LjMuMSc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVySW5mbywgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgQVBJIGZvciBjcm9zcy1yZW5kZXJlciBpbXBsZW1lbnRhdGlvbi5cbmltcGxlbWVudGF0aW9uKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG5cbiAge1xuICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oa2V5KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IFBvcnRhbFxuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvblxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcztcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkge1xuICB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb21wb25lbnQpLmpvaW4oJywnKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgYSBSZWFjdENvbXBvbmVudC4gS2V5czogXCIgKyBrZXlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihob3N0RmliZXIpO1xuXG4gICAgICAgICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggaXMgaW5zaWRlIFN0cmljdE1vZGUuICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggcmVuZGVycyBTdHJpY3RNb2RlIGNoaWxkcmVuLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgLy8gSWRlYWxseSB0aGlzIHNob3VsZCByZXNldCB0byBwcmV2aW91cyBidXQgdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGluXG4gICAgICAgICAgLy8gcmVuZGVyIGFuZCB0aGVyZSdzIGFub3RoZXIgd2FybmluZyBmb3IgdGhhdCBhbnl3YXkuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihwcmV2aW91c0ZpYmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250YWluZXIoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBoeWRyYXRlID0gZmFsc2U7XG4gIHZhciBpbml0aWFsQ2hpbGRyZW4gPSBudWxsO1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIC8vIFRPRE86IFJlbW92ZSBgY2FsbGJhY2tgIHdoZW4gd2UgZGVsZXRlIGxlZ2FjeSBtb2RlLlxuY2FsbGJhY2ssIGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IHRydWU7XG4gIHZhciByb290ID0gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTsgLy8gVE9ETzogTW92ZSB0aGlzIHRvIEZpYmVyUm9vdCBjb25zdHJ1Y3RvclxuXG4gIHJvb3QuY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKG51bGwpOyAvLyBTY2hlZHVsZSB0aGUgaW5pdGlhbCByZW5kZXIuIEluIGEgaHlkcmF0aW9uIHJvb3QsIHRoaXMgaXMgZGlmZmVyZW50IGZyb21cbiAgLy8gYSByZWd1bGFyIHVwZGF0ZSBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0IG1hdGNoIHdhcyB3YXMgcmVuZGVyZWRcbiAgLy8gb24gdGhlIHNlcnZlci5cbiAgLy8gTk9URTogVGhpcyB1cGRhdGUgaW50ZW50aW9uYWxseSBkb2Vzbid0IGhhdmUgYSBwYXlsb2FkLiBXZSdyZSBvbmx5IHVzaW5nXG4gIC8vIHRoZSB1cGRhdGUgdG8gc2NoZWR1bGUgd29yayBvbiB0aGUgcm9vdCBmaWJlciAoYW5kLCBmb3IgbGVnYWN5IHJvb3RzLCB0b1xuICAvLyBlbnF1ZXVlIHRoZSBjYWxsYmFjayBpZiBvbmUgaXMgcHJvdmlkZWQpLlxuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGN1cnJlbnQpO1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwgPyBjYWxsYmFjayA6IG51bGw7XG4gIGVucXVldWVVcGRhdGUoY3VycmVudCwgdXBkYXRlLCBsYW5lKTtcbiAgc2NoZWR1bGVJbml0aWFsSHlkcmF0aW9uT25Sb290KHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIHJldHVybiByb290O1xufVxuZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIGNvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaykge1xuICB7XG4gICAgb25TY2hlZHVsZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KTtcbiAgfVxuXG4gIHZhciBjdXJyZW50JDEgPSBjb250YWluZXIuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50JDEpO1xuXG4gIHtcbiAgICBtYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICB9XG5cbiAgdmFyIGNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpO1xuXG4gIGlmIChjb250YWluZXIuY29udGV4dCA9PT0gbnVsbCkge1xuICAgIGNvbnRhaW5lci5jb250ZXh0ID0gY29udGV4dDtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucGVuZGluZ0NvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiBjdXJyZW50ICE9PSBudWxsICYmICFkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ1JlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlOyAnICsgJ3RyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyIGlzIG5vdCBhbGxvd2VkLiAnICsgJ0lmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiBjb21wb25lbnREaWRVcGRhdGUuXFxuXFxuJyArICdDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAlcy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpIHx8ICdVbmtub3duJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBlbGVtZW50XG4gIH07XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcblxuICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShjdXJyZW50JDEsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgY3VycmVudCQxLCBsYW5lLCBldmVudFRpbWUpO1xuICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgY3VycmVudCQxLCBsYW5lKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gZ2V0UHVibGljUm9vdEluc3RhbmNlKGNvbnRhaW5lcikge1xuICB2YXIgY29udGFpbmVyRmliZXIgPSBjb250YWluZXIuY3VycmVudDtcblxuICBpZiAoIWNvbnRhaW5lckZpYmVyLmNoaWxkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKGNvbnRhaW5lckZpYmVyLmNoaWxkLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBnZXRQdWJsaWNJbnN0YW5jZShjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGUpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiQxKGZpYmVyKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICAvLyBGbHVzaCB0aGUgZmlyc3Qgc2NoZWR1bGVkIFwidXBkYXRlXCIuXG4gICAgICAgICAgdmFyIGxhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5UGVuZGluZ0xhbmVzKHJvb3QpO1xuICAgICAgICAgIGZsdXNoUm9vdChyb290LCBsYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pOyAvLyBJZiB3ZSdyZSBzdGlsbCBibG9ja2VkIGFmdGVyIHRoaXMsIHdlIG5lZWQgdG8gaW5jcmVhc2VcbiAgICAgICAgLy8gdGhlIHByaW9yaXR5IG9mIGFueSBwcm9taXNlcyByZXNvbHZpbmcgd2l0aGluIHRoaXNcbiAgICAgICAgLy8gYm91bmRhcnkgc28gdGhhdCB0aGV5IG5leHQgYXR0ZW1wdCBhbHNvIGhhcyBoaWdoZXIgcHJpLlxuXG4gICAgICAgIHZhciByZXRyeUxhbmUgPSBTeW5jTGFuZTtcbiAgICAgICAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsICYmIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gaGlnaGVyUHJpb3JpdHlMYW5lKHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lLCByZXRyeUxhbmUpO1xuICB9XG59IC8vIEluY3JlYXNlcyB0aGUgcHJpb3JpdHkgb2YgdGhlbmFibGVzIHdoZW4gdGhleSByZXNvbHZlIHdpdGhpbiB0aGlzIGJvdW5kYXJ5LlxuXG5cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSkge1xuICAgIG1hcmtSZXRyeUxhbmVJbXBsKGFsdGVybmF0ZSwgcmV0cnlMYW5lKTtcbiAgfVxufVxuZnVuY3Rpb24gYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYW5lID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIH1cblxuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgb3RoZXIgdGhhbiBzeW5jaHJvbm91c2x5IGZsdXNoIGl0LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxuXG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xufVxuXG52YXIgc2hvdWxkRXJyb3JJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkRXJyb3IoZmliZXIpIHtcbiAgcmV0dXJuIHNob3VsZEVycm9ySW1wbChmaWJlcik7XG59XG5cbnZhciBzaG91bGRTdXNwZW5kSW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRTdXNwZW5kKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRTdXNwZW5kSW1wbChmaWJlcik7XG59XG52YXIgb3ZlcnJpZGVIb29rU3RhdGUgPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsO1xudmFyIHNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbnZhciBzZXRFcnJvckhhbmRsZXIgPSBudWxsO1xudmFyIHNldFN1c3BlbnNlSGFuZGxlciA9IG51bGw7XG5cbntcbiAgdmFyIGNvcHlXaXRoRGVsZXRlSW1wbCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIGluZGV4KSB7XG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7XG5cbiAgICBpZiAoaW5kZXggKyAxID09PSBwYXRoLmxlbmd0aCkge1xuICAgICAgaWYgKGlzQXJyYXkodXBkYXRlZCkpIHtcbiAgICAgICAgdXBkYXRlZC5zcGxpY2Uoa2V5LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH0gLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aERlbGV0ZUltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoRGVsZXRlID0gZnVuY3Rpb24gKG9iaiwgcGF0aCkge1xuICAgIHJldHVybiBjb3B5V2l0aERlbGV0ZUltcGwob2JqLCBwYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWVJbXBsID0gZnVuY3Rpb24gKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXgpIHtcbiAgICB2YXIgb2xkS2V5ID0gb2xkUGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IG9sZFBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgbmV3S2V5ID0gbmV3UGF0aFtpbmRleF07IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgICAgdXBkYXRlZFtuZXdLZXldID0gdXBkYXRlZFtvbGRLZXldO1xuXG4gICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShvbGRLZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbb2xkS2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgdXBkYXRlZFtvbGRLZXldID0gY29weVdpdGhSZW5hbWVJbXBsKCAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICBvYmpbb2xkS2V5XSwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWUgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgaWYgKG9sZFBhdGgubGVuZ3RoICE9PSBuZXdQYXRoLmxlbmd0aCkge1xuICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIG9mIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHtcbiAgICAgICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgdG8gYmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgZGVlcGVzdCBrZXknKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3B5V2l0aFJlbmFtZUltcGwob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXRJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgaWYgKGluZGV4ID49IHBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoU2V0SW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoU2V0ID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgdmFsdWUpIHtcbiAgICByZXR1cm4gY29weVdpdGhTZXRJbXBsKG9iaiwgcGF0aCwgMCwgdmFsdWUpO1xuICB9O1xuXG4gIHZhciBmaW5kSG9vayA9IGZ1bmN0aW9uIChmaWJlciwgaWQpIHtcbiAgICAvLyBGb3Igbm93LCB0aGUgXCJpZFwiIG9mIHN0YXRlZnVsIGhvb2tzIGlzIGp1c3QgdGhlIHN0YXRlZnVsIGhvb2sgaW5kZXguXG4gICAgLy8gVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgd2l0aCBlLmcuIG5lc3RlZCBob29rcy5cbiAgICB2YXIgY3VycmVudEhvb2sgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgd2hpbGUgKGN1cnJlbnRIb29rICE9PSBudWxsICYmIGlkID4gMCkge1xuICAgICAgY3VycmVudEhvb2sgPSBjdXJyZW50SG9vay5uZXh0O1xuICAgICAgaWQtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudEhvb2s7XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgZWRpdGFibGUgdmFsdWVzIGZvciB1c2VTdGF0ZSBhbmQgdXNlUmVkdWNlci5cblxuXG4gIG92ZXJyaWRlSG9va1N0YXRlID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgcGF0aCwgdmFsdWUpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhTZXQoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoLCB2YWx1ZSk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoRGVsZXRlKGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoUmVuYW1lKGhvb2subWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gU3VwcG9ydCBEZXZUb29scyBwcm9wcyBmb3IgZnVuY3Rpb24gY29tcG9uZW50cywgZm9yd2FyZFJlZiwgbWVtbywgaG9zdCBjb21wb25lbnRzLCBldGMuXG5cblxuICBvdmVycmlkZVByb3BzID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoLCB2YWx1ZSkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoU2V0KGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgsIHZhbHVlKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhEZWxldGUoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoUmVuYW1lKGZpYmVyLm1lbW9pemVkUHJvcHMsIG9sZFBhdGgsIG5ld1BhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgc2NoZWR1bGVVcGRhdGUgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgc2V0RXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKG5ld1Nob3VsZEVycm9ySW1wbCkge1xuICAgIHNob3VsZEVycm9ySW1wbCA9IG5ld1Nob3VsZEVycm9ySW1wbDtcbiAgfTtcblxuICBzZXRTdXNwZW5zZUhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkU3VzcGVuZEltcGwpIHtcbiAgICBzaG91bGRTdXNwZW5kSW1wbCA9IG5ld1Nob3VsZFN1c3BlbmRJbXBsO1xuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcihmaWJlcikge1xuICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xufVxuXG5mdW5jdGlvbiBlbXB0eUZpbmRGaWJlckJ5SG9zdEluc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scygpIHtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIGluamVjdEludG9EZXZUb29scyhkZXZUb29sc0NvbmZpZykge1xuICB2YXIgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2UgPSBkZXZUb29sc0NvbmZpZy5maW5kRmliZXJCeUhvc3RJbnN0YW5jZTtcbiAgdmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xuICByZXR1cm4gaW5qZWN0SW50ZXJuYWxzKHtcbiAgICBidW5kbGVUeXBlOiBkZXZUb29sc0NvbmZpZy5idW5kbGVUeXBlLFxuICAgIHZlcnNpb246IGRldlRvb2xzQ29uZmlnLnZlcnNpb24sXG4gICAgcmVuZGVyZXJQYWNrYWdlTmFtZTogZGV2VG9vbHNDb25maWcucmVuZGVyZXJQYWNrYWdlTmFtZSxcbiAgICByZW5kZXJlckNvbmZpZzogZGV2VG9vbHNDb25maWcucmVuZGVyZXJDb25maWcsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGU6IG92ZXJyaWRlSG9va1N0YXRlLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aDogb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aDogb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoLFxuICAgIG92ZXJyaWRlUHJvcHM6IG92ZXJyaWRlUHJvcHMsXG4gICAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6IG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoLFxuICAgIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoOiBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCxcbiAgICBzZXRFcnJvckhhbmRsZXI6IHNldEVycm9ySGFuZGxlcixcbiAgICBzZXRTdXNwZW5zZUhhbmRsZXI6IHNldFN1c3BlbnNlSGFuZGxlcixcbiAgICBzY2hlZHVsZVVwZGF0ZTogc2NoZWR1bGVVcGRhdGUsXG4gICAgY3VycmVudERpc3BhdGNoZXJSZWY6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6IGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyLFxuICAgIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSB8fCBlbXB0eUZpbmRGaWJlckJ5SG9zdEluc3RhbmNlLFxuICAgIC8vIFJlYWN0IFJlZnJlc2hcbiAgICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6ICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggLFxuICAgIHNjaGVkdWxlUmVmcmVzaDogIHNjaGVkdWxlUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSb290OiAgc2NoZWR1bGVSb290ICxcbiAgICBzZXRSZWZyZXNoSGFuZGxlcjogIHNldFJlZnJlc2hIYW5kbGVyICxcbiAgICAvLyBFbmFibGVzIERldlRvb2xzIHRvIGFwcGVuZCBvd25lciBzdGFja3MgdG8gZXJyb3IgbWVzc2FnZXMgaW4gREVWIG1vZGUuXG4gICAgZ2V0Q3VycmVudEZpYmVyOiAgZ2V0Q3VycmVudEZpYmVyRm9yRGV2VG9vbHMgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gZGV0ZWN0IHJlY29uY2lsZXIgdmVyc2lvbiByYXRoZXIgdGhhbiByZW5kZXJlciB2ZXJzaW9uXG4gICAgLy8gd2hpY2ggbWF5IG5vdCBtYXRjaCBmb3IgdGhpcmQgcGFydHkgcmVuZGVyZXJzLlxuICAgIHJlY29uY2lsZXJWZXJzaW9uOiBSZWFjdFZlcnNpb25cbiAgfSk7XG59XG5cbi8qIGdsb2JhbCByZXBvcnRFcnJvciAqL1xuXG52YXIgZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvciA9IHR5cGVvZiByZXBvcnRFcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IC8vIEluIG1vZGVybiBicm93c2VycywgcmVwb3J0RXJyb3Igd2lsbCBkaXNwYXRjaCBhbiBlcnJvciBldmVudCxcbi8vIGVtdWxhdGluZyBhbiB1bmNhdWdodCBKYXZhU2NyaXB0IGVycm9yLlxucmVwb3J0RXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgLy8gSW4gb2xkZXIgYnJvd3NlcnMgYW5kIHRlc3QgZW52aXJvbm1lbnRzLCBmYWxsYmFjayB0byBjb25zb2xlLmVycm9yLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpO1xufTtcblxuZnVuY3Rpb24gUmVhY3RET01Sb290KGludGVybmFsUm9vdCkge1xuICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBpbnRlcm5hbFJvb3Q7XG59XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUucmVuZGVyID0gUmVhY3RET01Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG5cbiAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYW4gdW5tb3VudGVkIHJvb3QuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH0gZWxzZSBpZiAoaXNWYWxpZENvbnRhaW5lcihhcmd1bWVudHNbMV0pKSB7XG4gICAgICBlcnJvcignWW91IHBhc3NlZCBhIGNvbnRhaW5lciB0byB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHJvb3QucmVuZGVyKC4uLikuICcgKyBcIllvdSBkb24ndCBuZWVkIHRvIHBhc3MgaXQgYWdhaW4gc2luY2UgeW91IGFscmVhZHkgcGFzc2VkIGl0IHRvIGNyZWF0ZSB0aGUgcm9vdC5cIik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBzZWNvbmQgYXJndW1lbnQgdG8gcm9vdC5yZW5kZXIoLi4uKSBidXQgaXQgb25seSBhY2NlcHRzICcgKyAnb25lIGFyZ3VtZW50LicpO1xuICAgIH1cblxuICAgIHZhciBjb250YWluZXIgPSByb290LmNvbnRhaW5lckluZm87XG5cbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhyb290LmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlKSB7XG4gICAgICAgIGlmIChob3N0SW5zdGFuY2UucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoZSAnICsgJ3Jvb3QgY29udGFpbmVyIHdhcyByZW1vdmVkIHdpdGhvdXQgdXNpbmcgUmVhY3QuIFRoaXMgaXMgbm90ICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGVycm9ycy4gSW5zdGVhZCwgY2FsbCAnICsgXCJyb290LnVubW91bnQoKSB0byBlbXB0eSBhIHJvb3QncyBjb250YWluZXIuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBudWxsLCBudWxsKTtcbn07XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5tb3VudCA9IFJlYWN0RE9NUm9vdC5wcm90b3R5cGUudW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcigndW5tb3VudCguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IGEgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBudWxsO1xuICAgIHZhciBjb250YWluZXIgPSByb290LmNvbnRhaW5lckluZm87XG5cbiAgICB7XG4gICAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgICAgZXJyb3IoJ0F0dGVtcHRlZCB0byBzeW5jaHJvbm91c2x5IHVubW91bnQgYSByb290IHdoaWxlIFJlYWN0IHdhcyBhbHJlYWR5ICcgKyAncmVuZGVyaW5nLiBSZWFjdCBjYW5ub3QgZmluaXNoIHVubW91bnRpbmcgdGhlIHJvb3QgdW50aWwgdGhlICcgKyAnY3VycmVudCByZW5kZXIgaGFzIGNvbXBsZXRlZCwgd2hpY2ggbWF5IGxlYWQgdG8gYSByYWNlIGNvbmRpdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKG51bGwsIHJvb3QsIG51bGwsIG51bGwpO1xuICAgIH0pO1xuICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlUm9vdCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuICB2YXIgaXNTdHJpY3RNb2RlID0gZmFsc2U7XG4gIHZhciBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlID0gZmFsc2U7XG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7XG4gIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yO1xuICB2YXIgdHJhbnNpdGlvbkNhbGxiYWNrcyA9IG51bGw7XG5cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAge1xuICAgICAgaWYgKG9wdGlvbnMuaHlkcmF0ZSkge1xuICAgICAgICB3YXJuKCdoeWRyYXRlIHRocm91Z2ggY3JlYXRlUm9vdCBpcyBkZXByZWNhdGVkLiBVc2UgUmVhY3RET01DbGllbnQuaHlkcmF0ZVJvb3QoY29udGFpbmVyLCA8QXBwIC8+KSBpbnN0ZWFkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgSlNYIGVsZW1lbnQgdG8gY3JlYXRlUm9vdC4gWW91IHByb2JhYmx5IG1lYW50IHRvICcgKyAnY2FsbCByb290LnJlbmRlciBpbnN0ZWFkLiAnICsgJ0V4YW1wbGUgdXNhZ2U6XFxuXFxuJyArICcgIGxldCByb290ID0gY3JlYXRlUm9vdChkb21Db250YWluZXIpO1xcbicgKyAnICByb290LnJlbmRlcig8QXBwIC8+KTsnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uQ2FsbGJhY2tzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyYW5zaXRpb25DYWxsYmFja3MgPSBvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3M7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSBjcmVhdGVDb250YWluZXIoY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgbnVsbCwgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTtcbiAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICByZXR1cm4gbmV3IFJlYWN0RE9NUm9vdChyb290KTtcbn1cblxuZnVuY3Rpb24gUmVhY3RET01IeWRyYXRpb25Sb290KGludGVybmFsUm9vdCkge1xuICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBpbnRlcm5hbFJvb3Q7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlSHlkcmF0aW9uKHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgcXVldWVFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpO1xuICB9XG59XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb24gPSBzY2hlZHVsZUh5ZHJhdGlvbjtcbmZ1bmN0aW9uIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdoeWRyYXRlUm9vdCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuXG4gIHtcbiAgICBpZiAoaW5pdGlhbENoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yKCdNdXN0IHByb3ZpZGUgaW5pdGlhbCBjaGlsZHJlbiBhcyBzZWNvbmQgYXJndW1lbnQgdG8gaHlkcmF0ZVJvb3QuICcgKyAnRXhhbXBsZSB1c2FnZTogaHlkcmF0ZVJvb3QoZG9tQ29udGFpbmVyLCA8QXBwIC8+KScpO1xuICAgIH1cbiAgfSAvLyBGb3Igbm93IHdlIHJldXNlIHRoZSB3aG9sZSBiYWcgb2Ygb3B0aW9ucyBzaW5jZSB0aGV5IGNvbnRhaW5cbiAgLy8gdGhlIGh5ZHJhdGlvbiBjYWxsYmFja3MuXG5cblxuICB2YXIgaHlkcmF0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IG51bGw7IC8vIFRPRE86IERlbGV0ZSB0aGlzIG9wdGlvblxuXG4gIHZhciBtdXRhYmxlU291cmNlcyA9IG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmh5ZHJhdGVkU291cmNlcyB8fCBudWxsO1xuICB2YXIgaXNTdHJpY3RNb2RlID0gZmFsc2U7XG4gIHZhciBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlID0gZmFsc2U7XG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7XG4gIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yO1xuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIG51bGwsIGNvbnRhaW5lciwgQ29uY3VycmVudFJvb3QsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTsgLy8gVGhpcyBjYW4ndCBiZSBhIGNvbW1lbnQgbm9kZSBzaW5jZSBoeWRyYXRpb24gZG9lc24ndCB3b3JrIG9uIGNvbW1lbnQgbm9kZXMgYW55d2F5LlxuXG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKGNvbnRhaW5lcik7XG5cbiAgaWYgKG11dGFibGVTb3VyY2VzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhYmxlU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG11dGFibGVTb3VyY2UgPSBtdXRhYmxlU291cmNlc1tpXTtcbiAgICAgIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFJlYWN0RE9NSHlkcmF0aW9uUm9vdChyb290KTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXIobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCAhZGlzYWJsZUNvbW1lbnRzQXNET01Db250YWluZXJzICApKTtcbn0gLy8gVE9ETzogUmVtb3ZlIHRoaXMgZnVuY3Rpb24gd2hpY2ggYWxzbyBpbmNsdWRlcyBjb21tZW50IG5vZGVzLlxuLy8gV2Ugb25seSB1c2UgaXQgaW4gcGxhY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBtb3JlIHJlbGF4ZWQuXG5cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXJMZWdhY3kobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgJykpO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcikge1xuICB7XG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ2NyZWF0ZVJvb3QoKTogQ3JlYXRpbmcgcm9vdHMgZGlyZWN0bHkgd2l0aCBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgdXNpbmcgYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpKSB7XG4gICAgICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIpIHtcbiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5yZW5kZXIoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkgb24gYSBjb250YWluZXIgdGhhdCAnICsgJ2hhcyBhbHJlYWR5IGJlZW4gcGFzc2VkIHRvIGNyZWF0ZVJvb3QoKSBiZWZvcmUuIEluc3RlYWQsIGNhbGwgJyArICdyb290LnJlbmRlcigpIG9uIHRoZSBleGlzdGluZyByb290IGluc3RlYWQgaWYgeW91IHdhbnQgdG8gdXBkYXRlIGl0LicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIHRvcExldmVsVXBkYXRlV2FybmluZ3M7XG5cbntcbiAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgJiYgY29udGFpbmVyLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lci5jdXJyZW50KTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSkge1xuICAgICAgICBpZiAoaG9zdEluc3RhbmNlLnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikge1xuICAgICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogSXQgbG9va3MgbGlrZSB0aGUgUmVhY3QtcmVuZGVyZWQgY29udGVudCBvZiB0aGlzICcgKyAnY29udGFpbmVyIHdhcyByZW1vdmVkIHdpdGhvdXQgdXNpbmcgUmVhY3QuIFRoaXMgaXMgbm90ICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGVycm9ycy4gSW5zdGVhZCwgY2FsbCAnICsgJ1JlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUgdG8gZW1wdHkgYSBjb250YWluZXIuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCA9ICEhY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKHJvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCkpO1xuXG4gICAgaWYgKGhhc05vblJvb3RSZWFjdENoaWxkICYmICFpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0KSB7XG4gICAgICBlcnJvcigncmVuZGVyKC4uLik6IFJlcGxhY2luZyBSZWFjdC1yZW5kZXJlZCBjaGlsZHJlbiB3aXRoIGEgbmV3IHJvb3QgJyArICdjb21wb25lbnQuIElmIHlvdSBpbnRlbmRlZCB0byB1cGRhdGUgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgJyArICd5b3Ugc2hvdWxkIGluc3RlYWQgaGF2ZSB0aGUgZXhpc3RpbmcgY2hpbGRyZW4gdXBkYXRlIHRoZWlyIHN0YXRlICcgKyAnYW5kIHJlbmRlciB0aGUgbmV3IGNvbXBvbmVudHMgaW5zdGVhZCBvZiBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgY29udGFpbmVyLnRhZ05hbWUgJiYgY29udGFpbmVyLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSB7XG4gICAgICBlcnJvcigncmVuZGVyKCk6IFJlbmRlcmluZyBjb21wb25lbnRzIGRpcmVjdGx5IGludG8gZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHJlbmRlcmluZyBpbnRvIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcE9uUmVjb3ZlcmFibGVFcnJvcigpIHsvLyBUaGlzIGlzbid0IHJlYWNoYWJsZSBiZWNhdXNlIG9uUmVjb3ZlcmFibGVFcnJvciBpc24ndCBjYWxsZWQgaW4gdGhlXG4gIC8vIGxlZ2FjeSBBUEkuXG59XG5cbmZ1bmN0aW9uIGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrLCBpc0h5ZHJhdGlvbkNvbnRhaW5lcikge1xuICBpZiAoaXNIeWRyYXRpb25Db250YWluZXIpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIGNhbGxiYWNrLCBjb250YWluZXIsIExlZ2FjeVJvb3QsIG51bGwsIC8vIGh5ZHJhdGlvbkNhbGxiYWNrc1xuICAgIGZhbHNlLCAvLyBpc1N0cmljdE1vZGVcbiAgICBmYWxzZSwgLy8gY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSxcbiAgICAnJywgLy8gaWRlbnRpZmllclByZWZpeFxuICAgIG5vb3BPblJlY292ZXJhYmxlRXJyb3IpO1xuICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gcm9vdDtcbiAgICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTtcbiAgICB2YXIgcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICBmbHVzaFN5bmMoKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfSBlbHNlIHtcbiAgICAvLyBGaXJzdCBjbGVhciBhbnkgZXhpc3RpbmcgY29udGVudC5cbiAgICB2YXIgcm9vdFNpYmxpbmc7XG5cbiAgICB3aGlsZSAocm9vdFNpYmxpbmcgPSBjb250YWluZXIubGFzdENoaWxkKSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQocm9vdFNpYmxpbmcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKF9yb290KTtcblxuICAgICAgICBfb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9yb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzXG4gICAgZmFsc2UsIC8vIGlzU3RyaWN0TW9kZVxuICAgIGZhbHNlLCAvLyBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLFxuICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4XG4gICAgbm9vcE9uUmVjb3ZlcmFibGVFcnJvcik7XG5cbiAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IF9yb290O1xuICAgIG1hcmtDb250YWluZXJBc1Jvb3QoX3Jvb3QuY3VycmVudCwgY29udGFpbmVyKTtcblxuICAgIHZhciBfcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuXG4gICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoX3Jvb3RDb250YWluZXJFbGVtZW50KTsgLy8gSW5pdGlhbCBtb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgX3Jvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHJldHVybiBfcm9vdDtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICB7XG4gICAgaWYgKGNhbGxiYWNrICE9PSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgY2hpbGRyZW4sIGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlLCBjYWxsYmFjaykge1xuICB7XG4gICAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyhjb250YWluZXIpO1xuICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2ssICdyZW5kZXInKTtcbiAgfVxuXG4gIHZhciBtYXliZVJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgdmFyIHJvb3Q7XG5cbiAgaWYgKCFtYXliZVJvb3QpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgcm9vdCA9IGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2ssIGZvcmNlSHlkcmF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdCA9IG1heWJlUm9vdDtcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gVXBkYXRlXG5cblxuICAgIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICByZXR1cm4gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xufVxuXG52YXIgZGlkV2FybkFib3V0RmluZERPTU5vZGUgPSBmYWxzZTtcbmZ1bmN0aW9uIGZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kRE9NTm9kZSkge1xuICAgICAgZGlkV2FybkFib3V0RmluZERPTU5vZGUgPSB0cnVlO1xuXG4gICAgICBlcnJvcignZmluZERPTU5vZGUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yICcgKyAncmVsZWFzZS4gSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50ICcgKyAndG8gcmVmZXJlbmNlLiBMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScpO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyJDMuY3VycmVudDtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci5zdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciB3YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXI7XG5cbiAgICAgIGlmICghd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBmaW5kRE9NTm9kZSBpbnNpZGUgaXRzIHJlbmRlcigpLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG93bmVyLnR5cGUpIHx8ICdBIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiBjb21wb25lbnRPckVsZW1lbnQ7XG4gIH1cblxuICB7XG4gICAgcmV0dXJuIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnRPckVsZW1lbnQsICdmaW5kRE9NTm9kZScpO1xuICB9XG59XG5mdW5jdGlvbiBoeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS5oeWRyYXRlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBoeWRyYXRlUm9vdCAnICsgJ2luc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gdGhlIG5ldyBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzICcgKyBcImlmIGl0J3MgcnVubmluZyBSZWFjdCAxNy4gTGVhcm4gXCIgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5oeWRyYXRlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCBoeWRyYXRlUm9vdChjb250YWluZXIsIGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiB0aHJvdyBvciB3YXJuIGlmIHdlIGNvdWxkbid0IGh5ZHJhdGU/XG5cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCB0cnVlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiByZW5kZXIoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLnJlbmRlciBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIFJlYWN0IDE4LiBVc2UgY3JlYXRlUm9vdCAnICsgJ2luc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gdGhlIG5ldyBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzICcgKyBcImlmIGl0J3MgcnVubmluZyBSZWFjdCAxNy4gTGVhcm4gXCIgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QucmVuZGVyKGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBlbGVtZW50LCBjb250YWluZXIsIGZhbHNlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00udW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkICcgKyAnaW4gUmVhY3QgMTguIENvbnNpZGVyIHVzaW5nIGEgcG9ydGFsIGluc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gJyArIFwidGhlIGNyZWF0ZVJvb3QgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyBpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgXCIgKyAnMTcuIExlYXJuIG1vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lck5vZGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgaWYgKHBhcmVudENvbXBvbmVudCA9PSBudWxsIHx8ICFoYXMocGFyZW50Q29tcG9uZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnQnKTtcbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGZhbHNlLCBjYWxsYmFjayk7XG59XG52YXIgZGlkV2FybkFib3V0VW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IGZhbHNlO1xuZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpIHtcbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0VW5tb3VudENvbXBvbmVudEF0Tm9kZSkge1xuICAgICAgZGlkV2FybkFib3V0VW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IHRydWU7XG5cbiAgICAgIGVycm9yKCd1bm1vdW50Q29tcG9uZW50QXROb2RlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgJyArICduZXh0IG1ham9yIHJlbGVhc2UuIFN3aXRjaCB0byB0aGUgY3JlYXRlUm9vdCBBUEkuIExlYXJuICcgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VubW91bnRDb21wb25lbnRBdE5vZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC51bm1vdW50KCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAge1xuICAgICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgdmFyIHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCA9IHJvb3RFbCAmJiAhZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpO1xuXG4gICAgICBpZiAocmVuZGVyZWRCeURpZmZlcmVudFJlYWN0KSB7XG4gICAgICAgIGVycm9yKFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfSAvLyBVbm1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIG51bGwsIGNvbnRhaW5lciwgZmFsc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSBUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgYGRlbGV0ZSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcmBcbiAgICAgICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSBudWxsO1xuICAgICAgICB1bm1hcmtDb250YWluZXJBc1Jvb3QoY29udGFpbmVyKTtcbiAgICAgIH0pO1xuICAgIH0pOyAvLyBJZiB5b3UgY2FsbCB1bm1vdW50Q29tcG9uZW50QXROb2RlIHR3aWNlIGluIHF1aWNrIHN1Y2Nlc3Npb24sIHlvdSdsbFxuICAgIC8vIGdldCBgdHJ1ZWAgdHdpY2UuIFRoYXQncyBwcm9iYWJseSBmaW5lP1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgdmFyIF9yb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcblxuICAgICAgdmFyIGhhc05vblJvb3RSZWFjdENoaWxkID0gISEoX3Jvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlKF9yb290RWwpKTsgLy8gQ2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpdHNlbGYgaXMgYSBSZWFjdCByb290IG5vZGUuXG5cbiAgICAgIHZhciBpc0NvbnRhaW5lclJlYWN0Um9vdCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyLnBhcmVudE5vZGUpICYmICEhY29udGFpbmVyLnBhcmVudE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lcjtcblxuICAgICAgaWYgKGhhc05vblJvb3RSZWFjdENoaWxkKSB7XG4gICAgICAgIGVycm9yKFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBSZWFjdCBhbmQgaXMgbm90IGEgdG9wLWxldmVsIGNvbnRhaW5lci4gJXMnLCBpc0NvbnRhaW5lclJlYWN0Um9vdCA/ICdZb3UgbWF5IGhhdmUgYWNjaWRlbnRhbGx5IHBhc3NlZCBpbiBhIFJlYWN0IHJvb3Qgbm9kZSBpbnN0ZWFkICcgKyAnb2YgaXRzIGNvbnRhaW5lci4nIDogJ0luc3RlYWQsIGhhdmUgdGhlIHBhcmVudCBjb21wb25lbnQgdXBkYXRlIGl0cyBzdGF0ZSBhbmQgJyArICdyZXJlbmRlciBpbiBvcmRlciB0byByZW1vdmUgdGhpcyBjb21wb25lbnQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbnNldEF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKTtcbnNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMSk7XG5zZXRHZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KTtcbnNldEF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KHJ1bldpdGhQcmlvcml0eSk7XG5cbntcbiAgaWYgKHR5cGVvZiBNYXAgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBNYXAgaGFzIG5vIHByb3RvdHlwZVxuICBNYXAucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIE1hcC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgU2V0ICE9PSAnZnVuY3Rpb24nIHx8IC8vICRGbG93SXNzdWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgU2V0IGhhcyBubyBwcm90b3R5cGVcbiAgU2V0LnByb3RvdHlwZSA9PSBudWxsIHx8IHR5cGVvZiBTZXQucHJvdG90eXBlLmNsZWFyICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICBlcnJvcignUmVhY3QgZGVwZW5kcyBvbiBNYXAgYW5kIFNldCBidWlsdC1pbiB0eXBlcy4gTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSAnICsgJ3BvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtcG9seWZpbGxzJyk7XG4gIH1cbn1cblxuc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMyk7XG5zZXRCYXRjaGluZ0ltcGxlbWVudGF0aW9uKGJhdGNoZWRVcGRhdGVzJDEsIGRpc2NyZXRlVXBkYXRlcywgZmx1c2hTeW5jKTtcblxuZnVuY3Rpb24gY3JlYXRlUG9ydGFsJDEoY2hpbGRyZW4sIGNvbnRhaW5lcikge1xuICB2YXIga2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9IC8vIFRPRE86IHBhc3MgUmVhY3RET00gcG9ydGFsIGltcGxlbWVudGF0aW9uIGFzIHRoaXJkIGFyZ3VtZW50XG4gIC8vICRGbG93Rml4TWUgVGhlIEZsb3cgdHlwZSBpcyBvcGFxdWUgYnV0IHRoZXJlJ3Mgbm8gd2F5IHRvIGFjdHVhbGx5IGNyZWF0ZSBpdC5cblxuXG4gIHJldHVybiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lciwgbnVsbCwga2V5KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuICByZXR1cm4gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjayk7XG59XG5cbnZhciBJbnRlcm5hbHMgPSB7XG4gIHVzaW5nQ2xpZW50RW50cnlQb2ludDogZmFsc2UsXG4gIC8vIEtlZXAgaW4gc3luYyB3aXRoIFJlYWN0VGVzdFV0aWxzLmpzLlxuICAvLyBUaGlzIGlzIGFuIGFycmF5IGZvciBiZXR0ZXIgbWluaWZpY2F0aW9uLlxuICBFdmVudHM6IFtnZXRJbnN0YW5jZUZyb21Ob2RlLCBnZXROb2RlRnJvbUluc3RhbmNlLCBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlLCBlbnF1ZXVlU3RhdGVSZXN0b3JlLCByZXN0b3JlU3RhdGVJZk5lZWRlZCwgYmF0Y2hlZFVwZGF0ZXMkMV1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3QkMShjb250YWluZXIsIG9wdGlvbnMpIHtcbiAge1xuICAgIGlmICghSW50ZXJuYWxzLnVzaW5nQ2xpZW50RW50cnlQb2ludCAmJiAhZmFsc2UpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGltcG9ydGluZyBjcmVhdGVSb290IGZyb20gXCJyZWFjdC1kb21cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUm9vdChjb250YWluZXIsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlUm9vdCQxKGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKSB7XG4gIHtcbiAgICBpZiAoIUludGVybmFscy51c2luZ0NsaWVudEVudHJ5UG9pbnQgJiYgIWZhbHNlKSB7XG4gICAgICBlcnJvcignWW91IGFyZSBpbXBvcnRpbmcgaHlkcmF0ZVJvb3QgZnJvbSBcInJlYWN0LWRvbVwiIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnWW91IHNob3VsZCBpbnN0ZWFkIGltcG9ydCBpdCBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBoeWRyYXRlUm9vdChjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucyk7XG59IC8vIE92ZXJsb2FkIHRoZSBkZWZpbml0aW9uIHRvIHRoZSB0d28gdmFsaWQgc2lnbmF0dXJlcy5cbi8vIFdhcm5pbmcsIHRoaXMgb3B0cy1vdXQgb2YgY2hlY2tpbmcgdGhlIGZ1bmN0aW9uIGJvZHkuXG5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuZnVuY3Rpb24gZmx1c2hTeW5jJDEoZm4pIHtcbiAge1xuICAgIGlmIChpc0FscmVhZHlSZW5kZXJpbmcoKSkge1xuICAgICAgZXJyb3IoJ2ZsdXNoU3luYyB3YXMgY2FsbGVkIGZyb20gaW5zaWRlIGEgbGlmZWN5Y2xlIG1ldGhvZC4gUmVhY3QgY2Fubm90ICcgKyAnZmx1c2ggd2hlbiBSZWFjdCBpcyBhbHJlYWR5IHJlbmRlcmluZy4gQ29uc2lkZXIgbW92aW5nIHRoaXMgY2FsbCB0byAnICsgJ2Egc2NoZWR1bGVyIHRhc2sgb3IgbWljcm8gdGFzay4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmx1c2hTeW5jKGZuKTtcbn1cbnZhciBmb3VuZERldlRvb2xzID0gaW5qZWN0SW50b0RldlRvb2xzKHtcbiAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICBidW5kbGVUeXBlOiAgMSAsXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcbiAgcmVuZGVyZXJQYWNrYWdlTmFtZTogJ3JlYWN0LWRvbSdcbn0pO1xuXG57XG4gIGlmICghZm91bmREZXZUb29scyAmJiBjYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2luZG93LnNlbGYpIHtcbiAgICAvLyBJZiB3ZSdyZSBpbiBDaHJvbWUgb3IgRmlyZWZveCwgcHJvdmlkZSBhIGRvd25sb2FkIGxpbmsgaWYgbm90IGluc3RhbGxlZC5cbiAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUnKSA+IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWRnZScpID09PSAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xKSB7XG4gICAgICB2YXIgcHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7IC8vIERvbid0IHdhcm4gaW4gZXhvdGljIGNhc2VzIGxpa2UgY2hyb21lLWV4dGVuc2lvbjovLy5cblxuICAgICAgaWYgKC9eKGh0dHBzP3xmaWxlKTokLy50ZXN0KHByb3RvY29sKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gICAgICAgIGNvbnNvbGUuaW5mbygnJWNEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgJyArICdmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnICsgKHByb3RvY29sID09PSAnZmlsZTonID8gJ1xcbllvdSBtaWdodCBuZWVkIHRvIHVzZSBhIGxvY2FsIEhUVFAgc2VydmVyIChpbnN0ZWFkIG9mIGZpbGU6Ly8pOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scy1mYXEnIDogJycpLCAnZm9udC13ZWlnaHQ6Ym9sZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gSW50ZXJuYWxzO1xuZXhwb3J0cy5jcmVhdGVQb3J0YWwgPSBjcmVhdGVQb3J0YWwkMTtcbmV4cG9ydHMuY3JlYXRlUm9vdCA9IGNyZWF0ZVJvb3QkMTtcbmV4cG9ydHMuZmluZERPTU5vZGUgPSBmaW5kRE9NTm9kZTtcbmV4cG9ydHMuZmx1c2hTeW5jID0gZmx1c2hTeW5jJDE7XG5leHBvcnRzLmh5ZHJhdGUgPSBoeWRyYXRlO1xuZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGh5ZHJhdGVSb290JDE7XG5leHBvcnRzLnJlbmRlciA9IHJlbmRlcjtcbmV4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IHVubW91bnRDb21wb25lbnRBdE5vZGU7XG5leHBvcnRzLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzID0gYmF0Y2hlZFVwZGF0ZXMkMTtcbmV4cG9ydHMudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIgPSByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gbS5jcmVhdGVSb290O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gbS5oeWRyYXRlUm9vdDtcbn0gZWxzZSB7XG4gIHZhciBpID0gbS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gZnVuY3Rpb24oYywgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uY3JlYXRlUm9vdChjLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbihjLCBoLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5oeWRyYXRlUm9vdChjLCBoLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiBzY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nID0gZmFsc2U7XG52YXIgZW5hYmxlUHJvZmlsaW5nID0gZmFsc2U7XG52YXIgZnJhbWVZaWVsZE1zID0gNTtcblxuZnVuY3Rpb24gcHVzaChoZWFwLCBub2RlKSB7XG4gIHZhciBpbmRleCA9IGhlYXAubGVuZ3RoO1xuICBoZWFwLnB1c2gobm9kZSk7XG4gIHNpZnRVcChoZWFwLCBub2RlLCBpbmRleCk7XG59XG5mdW5jdGlvbiBwZWVrKGhlYXApIHtcbiAgcmV0dXJuIGhlYXAubGVuZ3RoID09PSAwID8gbnVsbCA6IGhlYXBbMF07XG59XG5mdW5jdGlvbiBwb3AoaGVhcCkge1xuICBpZiAoaGVhcC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBmaXJzdCA9IGhlYXBbMF07XG4gIHZhciBsYXN0ID0gaGVhcC5wb3AoKTtcblxuICBpZiAobGFzdCAhPT0gZmlyc3QpIHtcbiAgICBoZWFwWzBdID0gbGFzdDtcbiAgICBzaWZ0RG93bihoZWFwLCBsYXN0LCAwKTtcbiAgfVxuXG4gIHJldHVybiBmaXJzdDtcbn1cblxuZnVuY3Rpb24gc2lmdFVwKGhlYXAsIG5vZGUsIGkpIHtcbiAgdmFyIGluZGV4ID0gaTtcblxuICB3aGlsZSAoaW5kZXggPiAwKSB7XG4gICAgdmFyIHBhcmVudEluZGV4ID0gaW5kZXggLSAxID4+PiAxO1xuICAgIHZhciBwYXJlbnQgPSBoZWFwW3BhcmVudEluZGV4XTtcblxuICAgIGlmIChjb21wYXJlKHBhcmVudCwgbm9kZSkgPiAwKSB7XG4gICAgICAvLyBUaGUgcGFyZW50IGlzIGxhcmdlci4gU3dhcCBwb3NpdGlvbnMuXG4gICAgICBoZWFwW3BhcmVudEluZGV4XSA9IG5vZGU7XG4gICAgICBoZWFwW2luZGV4XSA9IHBhcmVudDtcbiAgICAgIGluZGV4ID0gcGFyZW50SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgc21hbGxlci4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2lmdERvd24oaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuICB2YXIgbGVuZ3RoID0gaGVhcC5sZW5ndGg7XG4gIHZhciBoYWxmTGVuZ3RoID0gbGVuZ3RoID4+PiAxO1xuXG4gIHdoaWxlIChpbmRleCA8IGhhbGZMZW5ndGgpIHtcbiAgICB2YXIgbGVmdEluZGV4ID0gKGluZGV4ICsgMSkgKiAyIC0gMTtcbiAgICB2YXIgbGVmdCA9IGhlYXBbbGVmdEluZGV4XTtcbiAgICB2YXIgcmlnaHRJbmRleCA9IGxlZnRJbmRleCArIDE7XG4gICAgdmFyIHJpZ2h0ID0gaGVhcFtyaWdodEluZGV4XTsgLy8gSWYgdGhlIGxlZnQgb3IgcmlnaHQgbm9kZSBpcyBzbWFsbGVyLCBzd2FwIHdpdGggdGhlIHNtYWxsZXIgb2YgdGhvc2UuXG5cbiAgICBpZiAoY29tcGFyZShsZWZ0LCBub2RlKSA8IDApIHtcbiAgICAgIGlmIChyaWdodEluZGV4IDwgbGVuZ3RoICYmIGNvbXBhcmUocmlnaHQsIGxlZnQpIDwgMCkge1xuICAgICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0O1xuICAgICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgICAgaW5kZXggPSByaWdodEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhcFtpbmRleF0gPSBsZWZ0O1xuICAgICAgICBoZWFwW2xlZnRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IGxlZnRJbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbm9kZSkgPCAwKSB7XG4gICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0O1xuICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7XG4gICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5laXRoZXIgY2hpbGQgaXMgc21hbGxlci4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIC8vIENvbXBhcmUgc29ydCBpbmRleCBmaXJzdCwgdGhlbiB0YXNrIGlkLlxuICB2YXIgZGlmZiA9IGEuc29ydEluZGV4IC0gYi5zb3J0SW5kZXg7XG4gIHJldHVybiBkaWZmICE9PSAwID8gZGlmZiA6IGEuaWQgLSBiLmlkO1xufVxuXG4vLyBUT0RPOiBVc2Ugc3ltYm9scz9cbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IDE7XG52YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSAyO1xudmFyIE5vcm1hbFByaW9yaXR5ID0gMztcbnZhciBMb3dQcmlvcml0eSA9IDQ7XG52YXIgSWRsZVByaW9yaXR5ID0gNTtcblxuZnVuY3Rpb24gbWFya1Rhc2tFcnJvcmVkKHRhc2ssIG1zKSB7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuXG52YXIgaGFzUGVyZm9ybWFuY2VOb3cgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbic7XG5cbmlmIChoYXNQZXJmb3JtYW5jZU5vdykge1xuICB2YXIgbG9jYWxQZXJmb3JtYW5jZSA9IHBlcmZvcm1hbmNlO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbFBlcmZvcm1hbmNlLm5vdygpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIGxvY2FsRGF0ZSA9IERhdGU7XG4gIHZhciBpbml0aWFsVGltZSA9IGxvY2FsRGF0ZS5ub3coKTtcblxuICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbG9jYWxEYXRlLm5vdygpIC0gaW5pdGlhbFRpbWU7XG4gIH07XG59IC8vIE1heCAzMSBiaXQgaW50ZWdlci4gVGhlIG1heCBpbnRlZ2VyIHNpemUgaW4gVjggZm9yIDMyLWJpdCBzeXN0ZW1zLlxuLy8gTWF0aC5wb3coMiwgMzApIC0gMVxuLy8gMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcblxuXG52YXIgbWF4U2lnbmVkMzFCaXRJbnQgPSAxMDczNzQxODIzOyAvLyBUaW1lcyBvdXQgaW1tZWRpYXRlbHlcblxudmFyIElNTUVESUFURV9QUklPUklUWV9USU1FT1VUID0gLTE7IC8vIEV2ZW50dWFsbHkgdGltZXMgb3V0XG5cbnZhciBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZX1RJTUVPVVQgPSAyNTA7XG52YXIgTk9STUFMX1BSSU9SSVRZX1RJTUVPVVQgPSA1MDAwO1xudmFyIExPV19QUklPUklUWV9USU1FT1VUID0gMTAwMDA7IC8vIE5ldmVyIHRpbWVzIG91dFxuXG52YXIgSURMRV9QUklPUklUWV9USU1FT1VUID0gbWF4U2lnbmVkMzFCaXRJbnQ7IC8vIFRhc2tzIGFyZSBzdG9yZWQgb24gYSBtaW4gaGVhcFxuXG52YXIgdGFza1F1ZXVlID0gW107XG52YXIgdGltZXJRdWV1ZSA9IFtdOyAvLyBJbmNyZW1lbnRpbmcgaWQgY291bnRlci4gVXNlZCB0byBtYWludGFpbiBpbnNlcnRpb24gb3JkZXIuXG5cbnZhciB0YXNrSWRDb3VudGVyID0gMTsgLy8gUGF1c2luZyB0aGUgc2NoZWR1bGVyIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxudmFyIGN1cnJlbnRUYXNrID0gbnVsbDtcbnZhciBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5OyAvLyBUaGlzIGlzIHNldCB3aGlsZSBwZXJmb3JtaW5nIHdvcmssIHRvIHByZXZlbnQgcmUtZW50cmFuY2UuXG5cbnZhciBpc1BlcmZvcm1pbmdXb3JrID0gZmFsc2U7XG52YXIgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcbnZhciBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7IC8vIENhcHR1cmUgbG9jYWwgcmVmZXJlbmNlcyB0byBuYXRpdmUgQVBJcywgaW4gY2FzZSBhIHBvbHlmaWxsIG92ZXJyaWRlcyB0aGVtLlxuXG52YXIgbG9jYWxTZXRUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogbnVsbDtcbnZhciBsb2NhbENsZWFyVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiBudWxsO1xudmFyIGxvY2FsU2V0SW1tZWRpYXRlID0gdHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcgPyBzZXRJbW1lZGlhdGUgOiBudWxsOyAvLyBJRSBhbmQgTm9kZS5qcyArIGpzZG9tXG5cbnZhciBpc0lucHV0UGVuZGluZyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci5zY2hlZHVsaW5nICE9PSB1bmRlZmluZWQgJiYgbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcgIT09IHVuZGVmaW5lZCA/IG5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nLmJpbmQobmF2aWdhdG9yLnNjaGVkdWxpbmcpIDogbnVsbDtcblxuZnVuY3Rpb24gYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSkge1xuICAvLyBDaGVjayBmb3IgdGFza3MgdGhhdCBhcmUgbm8gbG9uZ2VyIGRlbGF5ZWQgYW5kIGFkZCB0aGVtIHRvIHRoZSBxdWV1ZS5cbiAgdmFyIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICB3aGlsZSAodGltZXIgIT09IG51bGwpIHtcbiAgICBpZiAodGltZXIuY2FsbGJhY2sgPT09IG51bGwpIHtcbiAgICAgIC8vIFRpbWVyIHdhcyBjYW5jZWxsZWQuXG4gICAgICBwb3AodGltZXJRdWV1ZSk7XG4gICAgfSBlbHNlIGlmICh0aW1lci5zdGFydFRpbWUgPD0gY3VycmVudFRpbWUpIHtcbiAgICAgIC8vIFRpbWVyIGZpcmVkLiBUcmFuc2ZlciB0byB0aGUgdGFzayBxdWV1ZS5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICAgIHRpbWVyLnNvcnRJbmRleCA9IHRpbWVyLmV4cGlyYXRpb25UaW1lO1xuICAgICAgcHVzaCh0YXNrUXVldWUsIHRpbWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtYWluaW5nIHRpbWVycyBhcmUgcGVuZGluZy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlVGltZW91dChjdXJyZW50VGltZSkge1xuICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQpIHtcbiAgICBpZiAocGVlayh0YXNrUXVldWUpICE9PSBudWxsKSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIGZpcnN0VGltZXIuc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFdvcmsoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpIHtcblxuXG4gIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgaWYgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQpIHtcbiAgICAvLyBXZSBzY2hlZHVsZWQgYSB0aW1lb3V0IGJ1dCBpdCdzIG5vIGxvbmdlciBuZWVkZWQuIENhbmNlbCBpdC5cbiAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG4gICAgY2FuY2VsSG9zdFRpbWVvdXQoKTtcbiAgfVxuXG4gIGlzUGVyZm9ybWluZ1dvcmsgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICBpZiAoZW5hYmxlUHJvZmlsaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgICAgICBtYXJrVGFza0Vycm9yZWQoY3VycmVudFRhc2ssIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICBjdXJyZW50VGFzay5pc1F1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNhdGNoIGluIHByb2QgY29kZSBwYXRoLlxuICAgICAgcmV0dXJuIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFRhc2sgPSBudWxsO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuICB2YXIgY3VycmVudFRpbWUgPSBpbml0aWFsVGltZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuXG4gIHdoaWxlIChjdXJyZW50VGFzayAhPT0gbnVsbCAmJiAhKGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyApKSB7XG4gICAgaWYgKGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lID4gY3VycmVudFRpbWUgJiYgKCFoYXNUaW1lUmVtYWluaW5nIHx8IHNob3VsZFlpZWxkVG9Ib3N0KCkpKSB7XG4gICAgICAvLyBUaGlzIGN1cnJlbnRUYXNrIGhhc24ndCBleHBpcmVkLCBhbmQgd2UndmUgcmVhY2hlZCB0aGUgZGVhZGxpbmUuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgY2FsbGJhY2sgPSBjdXJyZW50VGFzay5jYWxsYmFjaztcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1cnJlbnRUYXNrLmNhbGxiYWNrID0gbnVsbDtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFRhc2sucHJpb3JpdHlMZXZlbDtcbiAgICAgIHZhciBkaWRVc2VyQ2FsbGJhY2tUaW1lb3V0ID0gY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWU7XG5cbiAgICAgIHZhciBjb250aW51YXRpb25DYWxsYmFjayA9IGNhbGxiYWNrKGRpZFVzZXJDYWxsYmFja1RpbWVvdXQpO1xuICAgICAgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbkNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGN1cnJlbnRUYXNrLmNhbGxiYWNrID0gY29udGludWF0aW9uQ2FsbGJhY2s7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmIChjdXJyZW50VGFzayA9PT0gcGVlayh0YXNrUXVldWUpKSB7XG4gICAgICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcCh0YXNrUXVldWUpO1xuICAgIH1cblxuICAgIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuICB9IC8vIFJldHVybiB3aGV0aGVyIHRoZXJlJ3MgYWRkaXRpb25hbCB3b3JrXG5cblxuICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZmlyc3RUaW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIGZpcnN0VGltZXIuc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkocHJpb3JpdHlMZXZlbCwgZXZlbnRIYW5kbGVyKSB7XG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9uZXh0KGV2ZW50SGFuZGxlcikge1xuICB2YXIgcHJpb3JpdHlMZXZlbDtcblxuICBzd2l0Y2ggKGN1cnJlbnRQcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAvLyBTaGlmdCBkb3duIHRvIG5vcm1hbCBwcmlvcml0eVxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gQW55dGhpbmcgbG93ZXIgdGhhbiBub3JtYWwgcHJpb3JpdHkgc2hvdWxkIHJlbWFpbiBhdCB0aGUgY3VycmVudCBsZXZlbC5cbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZlbnRIYW5kbGVyKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfd3JhcENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIHZhciBwYXJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgcnVuV2l0aFByaW9yaXR5LCBpbmxpbmVkIGZvciBwZXJmb3JtYW5jZS5cbiAgICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwYXJlbnRQcmlvcml0eUxldmVsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgdmFyIHN0YXJ0VGltZTtcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwpIHtcbiAgICB2YXIgZGVsYXkgPSBvcHRpb25zLmRlbGF5O1xuXG4gICAgaWYgKHR5cGVvZiBkZWxheSA9PT0gJ251bWJlcicgJiYgZGVsYXkgPiAwKSB7XG4gICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZSArIGRlbGF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gIH1cblxuICB2YXIgdGltZW91dDtcblxuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IElNTUVESUFURV9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSURMRV9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IExPV19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgIGRlZmF1bHQ6XG4gICAgICB0aW1lb3V0ID0gTk9STUFMX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBleHBpcmF0aW9uVGltZSA9IHN0YXJ0VGltZSArIHRpbWVvdXQ7XG4gIHZhciBuZXdUYXNrID0ge1xuICAgIGlkOiB0YXNrSWRDb3VudGVyKyssXG4gICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgIHByaW9yaXR5TGV2ZWw6IHByaW9yaXR5TGV2ZWwsXG4gICAgc3RhcnRUaW1lOiBzdGFydFRpbWUsXG4gICAgZXhwaXJhdGlvblRpbWU6IGV4cGlyYXRpb25UaW1lLFxuICAgIHNvcnRJbmRleDogLTFcbiAgfTtcblxuICBpZiAoc3RhcnRUaW1lID4gY3VycmVudFRpbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZGVsYXllZCB0YXNrLlxuICAgIG5ld1Rhc2suc29ydEluZGV4ID0gc3RhcnRUaW1lO1xuICAgIHB1c2godGltZXJRdWV1ZSwgbmV3VGFzayk7XG5cbiAgICBpZiAocGVlayh0YXNrUXVldWUpID09PSBudWxsICYmIG5ld1Rhc2sgPT09IHBlZWsodGltZXJRdWV1ZSkpIHtcbiAgICAgIC8vIEFsbCB0YXNrcyBhcmUgZGVsYXllZCwgYW5kIHRoaXMgaXMgdGhlIHRhc2sgd2l0aCB0aGUgZWFybGllc3QgZGVsYXkuXG4gICAgICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgICAgICAvLyBDYW5jZWwgYW4gZXhpc3RpbmcgdGltZW91dC5cbiAgICAgICAgY2FuY2VsSG9zdFRpbWVvdXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgfSAvLyBTY2hlZHVsZSBhIHRpbWVvdXQuXG5cblxuICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIHN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBleHBpcmF0aW9uVGltZTtcbiAgICBwdXNoKHRhc2tRdWV1ZSwgbmV3VGFzayk7XG4gICAgLy8gd2FpdCB1bnRpbCB0aGUgbmV4dCB0aW1lIHdlIHlpZWxkLlxuXG5cbiAgICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkICYmICFpc1BlcmZvcm1pbmdXb3JrKSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld1Rhc2s7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uKCkge1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbigpIHtcblxuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkICYmICFpc1BlcmZvcm1pbmdXb3JrKSB7XG4gICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSgpIHtcbiAgcmV0dXJuIHBlZWsodGFza1F1ZXVlKTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sodGFzaykge1xuICAvLyByZW1vdmUgZnJvbSB0aGUgcXVldWUgYmVjYXVzZSB5b3UgY2FuJ3QgcmVtb3ZlIGFyYml0cmFyeSBub2RlcyBmcm9tIGFuXG4gIC8vIGFycmF5IGJhc2VkIGhlYXAsIG9ubHkgdGhlIGZpcnN0IG9uZS4pXG5cblxuICB0YXNrLmNhbGxiYWNrID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7XG4gIHJldHVybiBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbn1cblxudmFyIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG52YXIgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDtcbnZhciB0YXNrVGltZW91dElEID0gLTE7IC8vIFNjaGVkdWxlciBwZXJpb2RpY2FsbHkgeWllbGRzIGluIGNhc2UgdGhlcmUgaXMgb3RoZXIgd29yayBvbiB0aGUgbWFpblxuLy8gdGhyZWFkLCBsaWtlIHVzZXIgZXZlbnRzLiBCeSBkZWZhdWx0LCBpdCB5aWVsZHMgbXVsdGlwbGUgdGltZXMgcGVyIGZyYW1lLlxuLy8gSXQgZG9lcyBub3QgYXR0ZW1wdCB0byBhbGlnbiB3aXRoIGZyYW1lIGJvdW5kYXJpZXMsIHNpbmNlIG1vc3QgdGFza3MgZG9uJ3Rcbi8vIG5lZWQgdG8gYmUgZnJhbWUgYWxpZ25lZDsgZm9yIHRob3NlIHRoYXQgZG8sIHVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXG5cbnZhciBmcmFtZUludGVydmFsID0gZnJhbWVZaWVsZE1zO1xudmFyIHN0YXJ0VGltZSA9IC0xO1xuXG5mdW5jdGlvbiBzaG91bGRZaWVsZFRvSG9zdCgpIHtcbiAgdmFyIHRpbWVFbGFwc2VkID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKSAtIHN0YXJ0VGltZTtcblxuICBpZiAodGltZUVsYXBzZWQgPCBmcmFtZUludGVydmFsKSB7XG4gICAgLy8gVGhlIG1haW4gdGhyZWFkIGhhcyBvbmx5IGJlZW4gYmxvY2tlZCBmb3IgYSByZWFsbHkgc2hvcnQgYW1vdW50IG9mIHRpbWU7XG4gICAgLy8gc21hbGxlciB0aGFuIGEgc2luZ2xlIGZyYW1lLiBEb24ndCB5aWVsZCB5ZXQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIFRoZSBtYWluIHRocmVhZCBoYXMgYmVlbiBibG9ja2VkIGZvciBhIG5vbi1uZWdsaWdpYmxlIGFtb3VudCBvZiB0aW1lLiBXZVxuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RQYWludCgpIHtcblxufVxuXG5mdW5jdGlvbiBmb3JjZUZyYW1lUmF0ZShmcHMpIHtcbiAgaWYgKGZwcyA8IDAgfHwgZnBzID4gMTI1KSB7XG4gICAgLy8gVXNpbmcgY29uc29sZVsnZXJyb3InXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG4gICAgY29uc29sZVsnZXJyb3InXSgnZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsICcgKyAnZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZnBzID4gMCkge1xuICAgIGZyYW1lSW50ZXJ2YWwgPSBNYXRoLmZsb29yKDEwMDAgLyBmcHMpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlc2V0IHRoZSBmcmFtZXJhdGVcbiAgICBmcmFtZUludGVydmFsID0gZnJhbWVZaWVsZE1zO1xuICB9XG59XG5cbnZhciBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydCB0aW1lIHNvIHdlIGNhbiBtZWFzdXJlIGhvdyBsb25nIHRoZSBtYWluIHRocmVhZFxuICAgIC8vIGhhcyBiZWVuIGJsb2NrZWQuXG5cbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICB2YXIgaGFzVGltZVJlbWFpbmluZyA9IHRydWU7IC8vIElmIGEgc2NoZWR1bGVyIHRhc2sgdGhyb3dzLCBleGl0IHRoZSBjdXJyZW50IGJyb3dzZXIgdGFzayBzbyB0aGVcbiAgICAvLyBlcnJvciBjYW4gYmUgb2JzZXJ2ZWQuXG4gICAgLy9cbiAgICAvLyBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBhIHRyeS1jYXRjaCwgc2luY2UgdGhhdCBtYWtlcyBzb21lIGRlYnVnZ2luZ1xuICAgIC8vIHRlY2huaXF1ZXMgaGFyZGVyLiBJbnN0ZWFkLCBpZiBgc2NoZWR1bGVkSG9zdENhbGxiYWNrYCBlcnJvcnMsIHRoZW5cbiAgICAvLyBgaGFzTW9yZVdvcmtgIHdpbGwgcmVtYWluIHRydWUsIGFuZCB3ZSdsbCBjb250aW51ZSB0aGUgd29yayBsb29wLlxuXG4gICAgdmFyIGhhc01vcmVXb3JrID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBoYXNNb3JlV29yayA9IHNjaGVkdWxlZEhvc3RDYWxsYmFjayhoYXNUaW1lUmVtYWluaW5nLCBjdXJyZW50VGltZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChoYXNNb3JlV29yaykge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgd29yaywgc2NoZWR1bGUgdGhlIG5leHQgbWVzc2FnZSBldmVudCBhdCB0aGUgZW5kXG4gICAgICAgIC8vIG9mIHRoZSBwcmVjZWRpbmcgb25lLlxuICAgICAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgfSAvLyBZaWVsZGluZyB0byB0aGUgYnJvd3NlciB3aWxsIGdpdmUgaXQgYSBjaGFuY2UgdG8gcGFpbnQsIHNvIHdlIGNhblxufTtcblxudmFyIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuXG5pZiAodHlwZW9mIGxvY2FsU2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIE5vZGUuanMgYW5kIG9sZCBJRS5cbiAgLy8gVGhlcmUncyBhIGZldyByZWFzb25zIGZvciB3aHkgd2UgcHJlZmVyIHNldEltbWVkaWF0ZS5cbiAgLy9cbiAgLy8gVW5saWtlIE1lc3NhZ2VDaGFubmVsLCBpdCBkb2Vzbid0IHByZXZlbnQgYSBOb2RlLmpzIHByb2Nlc3MgZnJvbSBleGl0aW5nLlxuICAvLyAoRXZlbiB0aG91Z2ggdGhpcyBpcyBhIERPTSBmb3JrIG9mIHRoZSBTY2hlZHVsZXIsIHlvdSBjb3VsZCBnZXQgaGVyZVxuICAvLyB3aXRoIGEgbWl4IG9mIE5vZGUuanMgMTUrLCB3aGljaCBoYXMgYSBNZXNzYWdlQ2hhbm5lbCwgYW5kIGpzZG9tLilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMDc1NlxuICAvL1xuICAvLyBCdXQgYWxzbywgaXQgcnVucyBlYXJsaWVyIHdoaWNoIGlzIHRoZSBzZW1hbnRpYyB3ZSB3YW50LlxuICAvLyBJZiBvdGhlciBicm93c2VycyBldmVyIGltcGxlbWVudCBpdCwgaXQncyBiZXR0ZXIgdG8gdXNlIGl0LlxuICAvLyBBbHRob3VnaCBib3RoIG9mIHRoZXNlIHdvdWxkIGJlIGluZmVyaW9yIHRvIG5hdGl2ZSBzY2hlZHVsaW5nLlxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldEltbWVkaWF0ZShwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUpO1xuICB9O1xufSBlbHNlIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vIERPTSBhbmQgV29ya2VyIGVudmlyb25tZW50cy5cbiAgLy8gV2UgcHJlZmVyIE1lc3NhZ2VDaGFubmVsIGJlY2F1c2Ugb2YgdGhlIDRtcyBzZXRUaW1lb3V0IGNsYW1waW5nLlxuICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICB2YXIgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIHBvcnQucG9zdE1lc3NhZ2UobnVsbCk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBXZSBzaG91bGQgb25seSBmYWxsYmFjayBoZXJlIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbG9jYWxTZXRUaW1lb3V0KHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSwgMCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIb3N0Q2FsbGJhY2soY2FsbGJhY2spIHtcbiAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgaWYgKCFpc01lc3NhZ2VMb29wUnVubmluZykge1xuICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gdHJ1ZTtcbiAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIb3N0VGltZW91dChjYWxsYmFjaywgbXMpIHtcbiAgdGFza1RpbWVvdXRJRCA9IGxvY2FsU2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgY2FsbGJhY2soZXhwb3J0cy51bnN0YWJsZV9ub3coKSk7XG4gIH0sIG1zKTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsSG9zdFRpbWVvdXQoKSB7XG4gIGxvY2FsQ2xlYXJUaW1lb3V0KHRhc2tUaW1lb3V0SUQpO1xuICB0YXNrVGltZW91dElEID0gLTE7XG59XG5cbnZhciB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSByZXF1ZXN0UGFpbnQ7XG52YXIgdW5zdGFibGVfUHJvZmlsaW5nID0gIG51bGw7XG5cbmV4cG9ydHMudW5zdGFibGVfSWRsZVByaW9yaXR5ID0gSWRsZVByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSA9IEltbWVkaWF0ZVByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eSA9IExvd1ByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmcgPSB1bnN0YWJsZV9Qcm9maWxpbmc7XG5leHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5ID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrID0gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uID0gdW5zdGFibGVfY29udGludWVFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlID0gZm9yY2VGcmFtZVJhdGU7XG5leHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsID0gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw7XG5leHBvcnRzLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlID0gdW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU7XG5leHBvcnRzLnVuc3RhYmxlX25leHQgPSB1bnN0YWJsZV9uZXh0O1xuZXhwb3J0cy51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbiA9IHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQ7XG5leHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSA9IHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayA9IHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkID0gc2hvdWxkWWllbGRUb0hvc3Q7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjayA9IHVuc3RhYmxlX3dyYXBDYWxsYmFjaztcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRHJhZ2dhYmxlQ29yZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfRHJhZ2dhYmxlQ29yZS5kZWZhdWx0O1xuICB9XG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX3Byb3BUeXBlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xudmFyIF9yZWFjdERvbSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0LWRvbVwiKSk7XG52YXIgX2Nsc3ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbHN4XCIpKTtcbnZhciBfZG9tRm5zID0gcmVxdWlyZShcIi4vdXRpbHMvZG9tRm5zXCIpO1xudmFyIF9wb3NpdGlvbkZucyA9IHJlcXVpcmUoXCIuL3V0aWxzL3Bvc2l0aW9uRm5zXCIpO1xudmFyIF9zaGltcyA9IHJlcXVpcmUoXCIuL3V0aWxzL3NoaW1zXCIpO1xudmFyIF9EcmFnZ2FibGVDb3JlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9EcmFnZ2FibGVDb3JlXCIpKTtcbnZhciBfbG9nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dGlscy9sb2dcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaiwgbm9kZUludGVyb3ApIHsgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGtleSA9IF90b1Byb3BlcnR5S2V5KGtleSk7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7IHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTsgcmV0dXJuIHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgPyBrZXkgOiBTdHJpbmcoa2V5KTsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7IGlmICh0eXBlb2YgaW5wdXQgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7IHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgXCJkZWZhdWx0XCIpOyBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlczsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoaGludCA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikoaW5wdXQpOyB9IC8qOjogaW1wb3J0IHR5cGUge0NvbnRyb2xQb3NpdGlvbiwgUG9zaXRpb25PZmZzZXRDb250cm9sUG9zaXRpb24sIERyYWdnYWJsZUNvcmVQcm9wcywgRHJhZ2dhYmxlQ29yZURlZmF1bHRQcm9wc30gZnJvbSAnLi9EcmFnZ2FibGVDb3JlJzsqL1xuLyo6OiBpbXBvcnQgdHlwZSB7Qm91bmRzLCBEcmFnZ2FibGVFdmVudEhhbmRsZXJ9IGZyb20gJy4vdXRpbHMvdHlwZXMnOyovXG4vKjo6IGltcG9ydCB0eXBlIHtFbGVtZW50IGFzIFJlYWN0RWxlbWVudH0gZnJvbSAncmVhY3QnOyovXG4vKjo6IHR5cGUgRHJhZ2dhYmxlU3RhdGUgPSB7XG4gIGRyYWdnaW5nOiBib29sZWFuLFxuICBkcmFnZ2VkOiBib29sZWFuLFxuICB4OiBudW1iZXIsIHk6IG51bWJlcixcbiAgc2xhY2tYOiBudW1iZXIsIHNsYWNrWTogbnVtYmVyLFxuICBpc0VsZW1lbnRTVkc6IGJvb2xlYW4sXG4gIHByZXZQcm9wc1Bvc2l0aW9uOiA/Q29udHJvbFBvc2l0aW9uLFxufTsqL1xuLyo6OiBleHBvcnQgdHlwZSBEcmFnZ2FibGVEZWZhdWx0UHJvcHMgPSB7XG4gIC4uLkRyYWdnYWJsZUNvcmVEZWZhdWx0UHJvcHMsXG4gIGF4aXM6ICdib3RoJyB8ICd4JyB8ICd5JyB8ICdub25lJyxcbiAgYm91bmRzOiBCb3VuZHMgfCBzdHJpbmcgfCBmYWxzZSxcbiAgZGVmYXVsdENsYXNzTmFtZTogc3RyaW5nLFxuICBkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dpbmc6IHN0cmluZyxcbiAgZGVmYXVsdENsYXNzTmFtZURyYWdnZWQ6IHN0cmluZyxcbiAgZGVmYXVsdFBvc2l0aW9uOiBDb250cm9sUG9zaXRpb24sXG4gIHNjYWxlOiBudW1iZXIsXG59OyovXG4vKjo6IGV4cG9ydCB0eXBlIERyYWdnYWJsZVByb3BzID0ge1xuICAuLi5EcmFnZ2FibGVDb3JlUHJvcHMsXG4gIC4uLkRyYWdnYWJsZURlZmF1bHRQcm9wcyxcbiAgcG9zaXRpb25PZmZzZXQ6IFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uLFxuICBwb3NpdGlvbjogQ29udHJvbFBvc2l0aW9uLFxufTsqL1xuLy9cbi8vIERlZmluZSA8RHJhZ2dhYmxlPlxuLy9cbmNsYXNzIERyYWdnYWJsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCAvKjo6IDxEcmFnZ2FibGVQcm9wcywgRHJhZ2dhYmxlU3RhdGU+Ki97XG4gIC8vIFJlYWN0IDE2LjMrXG4gIC8vIEFyaXR5IChwcm9wcywgc3RhdGUpXG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoX3JlZiAvKjo6ICovLCBfcmVmMiAvKjo6ICovKSAvKjogP1BhcnRpYWw8RHJhZ2dhYmxlU3RhdGU+Ki97XG4gICAgbGV0IHtcbiAgICAgIHBvc2l0aW9uXG4gICAgfSAvKjogRHJhZ2dhYmxlUHJvcHMqLyA9IF9yZWYgLyo6IERyYWdnYWJsZVByb3BzKi87XG4gICAgbGV0IHtcbiAgICAgIHByZXZQcm9wc1Bvc2l0aW9uXG4gICAgfSAvKjogRHJhZ2dhYmxlU3RhdGUqLyA9IF9yZWYyIC8qOiBEcmFnZ2FibGVTdGF0ZSovO1xuICAgIC8vIFNldCB4L3kgaWYgYSBuZXcgcG9zaXRpb24gaXMgcHJvdmlkZWQgaW4gcHJvcHMgdGhhdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgcHJldmlvdXMuXG4gICAgaWYgKHBvc2l0aW9uICYmICghcHJldlByb3BzUG9zaXRpb24gfHwgcG9zaXRpb24ueCAhPT0gcHJldlByb3BzUG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ICE9PSBwcmV2UHJvcHNQb3NpdGlvbi55KSkge1xuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZTogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICVqJywge1xuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgcHJldlByb3BzUG9zaXRpb25cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogcG9zaXRpb24ueCxcbiAgICAgICAgeTogcG9zaXRpb24ueSxcbiAgICAgICAgcHJldlByb3BzUG9zaXRpb246IHtcbiAgICAgICAgICAuLi5wb3NpdGlvblxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdHJ1Y3Rvcihwcm9wcyAvKjogRHJhZ2dhYmxlUHJvcHMqLykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvbkRyYWdTdGFydFwiLCAoZSwgY29yZURhdGEpID0+IHtcbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGU6IG9uRHJhZ1N0YXJ0OiAlaicsIGNvcmVEYXRhKTtcblxuICAgICAgLy8gU2hvcnQtY2lyY3VpdCBpZiB1c2VyJ3MgY2FsbGJhY2sga2lsbGVkIGl0LlxuICAgICAgY29uc3Qgc2hvdWxkU3RhcnQgPSB0aGlzLnByb3BzLm9uU3RhcnQoZSwgKDAsIF9wb3NpdGlvbkZucy5jcmVhdGVEcmFnZ2FibGVEYXRhKSh0aGlzLCBjb3JlRGF0YSkpO1xuICAgICAgLy8gS2lsbHMgc3RhcnQgZXZlbnQgb24gY29yZSBhcyB3ZWxsLCBzbyBtb3ZlIGhhbmRsZXJzIGFyZSBuZXZlciBib3VuZC5cbiAgICAgIGlmIChzaG91bGRTdGFydCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZzogdHJ1ZSxcbiAgICAgICAgZHJhZ2dlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25EcmFnXCIsIChlLCBjb3JlRGF0YSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnN0YXRlLmRyYWdnaW5nKSByZXR1cm4gZmFsc2U7XG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlOiBvbkRyYWc6ICVqJywgY29yZURhdGEpO1xuICAgICAgY29uc3QgdWlEYXRhID0gKDAsIF9wb3NpdGlvbkZucy5jcmVhdGVEcmFnZ2FibGVEYXRhKSh0aGlzLCBjb3JlRGF0YSk7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgeDogdWlEYXRhLngsXG4gICAgICAgIHk6IHVpRGF0YS55LFxuICAgICAgICBzbGFja1g6IDAsXG4gICAgICAgIHNsYWNrWTogMFxuICAgICAgfTtcblxuICAgICAgLy8gS2VlcCB3aXRoaW4gYm91bmRzLlxuICAgICAgaWYgKHRoaXMucHJvcHMuYm91bmRzKSB7XG4gICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgeCBhbmQgeS5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHgsXG4gICAgICAgICAgeVxuICAgICAgICB9ID0gbmV3U3RhdGU7XG5cbiAgICAgICAgLy8gQWRkIHNsYWNrIHRvIHRoZSB2YWx1ZXMgdXNlZCB0byBjYWxjdWxhdGUgYm91bmQgcG9zaXRpb24uIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCBpZlxuICAgICAgICAvLyB3ZSBzdGFydCByZW1vdmluZyBzbGFjaywgdGhlIGVsZW1lbnQgd29uJ3QgcmVhY3QgdG8gaXQgcmlnaHQgYXdheSB1bnRpbCBpdCdzIGJlZW5cbiAgICAgICAgLy8gY29tcGxldGVseSByZW1vdmVkLlxuICAgICAgICBuZXdTdGF0ZS54ICs9IHRoaXMuc3RhdGUuc2xhY2tYO1xuICAgICAgICBuZXdTdGF0ZS55ICs9IHRoaXMuc3RhdGUuc2xhY2tZO1xuXG4gICAgICAgIC8vIEdldCBib3VuZCBwb3NpdGlvbi4gVGhpcyB3aWxsIGNlaWwvZmxvb3IgdGhlIHggYW5kIHkgd2l0aGluIHRoZSBib3VuZGFyaWVzLlxuICAgICAgICBjb25zdCBbbmV3U3RhdGVYLCBuZXdTdGF0ZVldID0gKDAsIF9wb3NpdGlvbkZucy5nZXRCb3VuZFBvc2l0aW9uKSh0aGlzLCBuZXdTdGF0ZS54LCBuZXdTdGF0ZS55KTtcbiAgICAgICAgbmV3U3RhdGUueCA9IG5ld1N0YXRlWDtcbiAgICAgICAgbmV3U3RhdGUueSA9IG5ld1N0YXRlWTtcblxuICAgICAgICAvLyBSZWNhbGN1bGF0ZSBzbGFjayBieSBub3RpbmcgaG93IG11Y2ggd2FzIHNoYXZlZCBieSB0aGUgYm91bmRQb3NpdGlvbiBoYW5kbGVyLlxuICAgICAgICBuZXdTdGF0ZS5zbGFja1ggPSB0aGlzLnN0YXRlLnNsYWNrWCArICh4IC0gbmV3U3RhdGUueCk7XG4gICAgICAgIG5ld1N0YXRlLnNsYWNrWSA9IHRoaXMuc3RhdGUuc2xhY2tZICsgKHkgLSBuZXdTdGF0ZS55KTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIGV2ZW50IHdlIGZpcmUgdG8gcmVmbGVjdCB3aGF0IHJlYWxseSBoYXBwZW5lZCBhZnRlciBib3VuZHMgdG9vayBlZmZlY3QuXG4gICAgICAgIHVpRGF0YS54ID0gbmV3U3RhdGUueDtcbiAgICAgICAgdWlEYXRhLnkgPSBuZXdTdGF0ZS55O1xuICAgICAgICB1aURhdGEuZGVsdGFYID0gbmV3U3RhdGUueCAtIHRoaXMuc3RhdGUueDtcbiAgICAgICAgdWlEYXRhLmRlbHRhWSA9IG5ld1N0YXRlLnkgLSB0aGlzLnN0YXRlLnk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3J0LWNpcmN1aXQgaWYgdXNlcidzIGNhbGxiYWNrIGtpbGxlZCBpdC5cbiAgICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9IHRoaXMucHJvcHMub25EcmFnKGUsIHVpRGF0YSk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25EcmFnU3RvcFwiLCAoZSwgY29yZURhdGEpID0+IHtcbiAgICAgIGlmICghdGhpcy5zdGF0ZS5kcmFnZ2luZykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBTaG9ydC1jaXJjdWl0IGlmIHVzZXIncyBjYWxsYmFjayBraWxsZWQgaXQuXG4gICAgICBjb25zdCBzaG91bGRDb250aW51ZSA9IHRoaXMucHJvcHMub25TdG9wKGUsICgwLCBfcG9zaXRpb25GbnMuY3JlYXRlRHJhZ2dhYmxlRGF0YSkodGhpcywgY29yZURhdGEpKTtcbiAgICAgIGlmIChzaG91bGRDb250aW51ZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGU6IG9uRHJhZ1N0b3A6ICVqJywgY29yZURhdGEpO1xuICAgICAgY29uc3QgbmV3U3RhdGUgLyo6IFBhcnRpYWw8RHJhZ2dhYmxlU3RhdGU+Ki8gPSB7XG4gICAgICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICAgICAgc2xhY2tYOiAwLFxuICAgICAgICBzbGFja1k6IDBcbiAgICAgIH07XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgYSBjb250cm9sbGVkIGNvbXBvbmVudCwgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbiB3aWxsIGJlIHRvXG4gICAgICAvLyByZXZlcnQgYmFjayB0byB0aGUgb2xkIHBvc2l0aW9uLiBXZSBleHBlY3QgYSBoYW5kbGVyIG9uIGBvbkRyYWdTdG9wYCwgYXQgdGhlIGxlYXN0LlxuICAgICAgY29uc3QgY29udHJvbGxlZCA9IEJvb2xlYW4odGhpcy5wcm9wcy5wb3NpdGlvbik7XG4gICAgICBpZiAoY29udHJvbGxlZCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeCxcbiAgICAgICAgICB5XG4gICAgICAgIH0gPSB0aGlzLnByb3BzLnBvc2l0aW9uO1xuICAgICAgICBuZXdTdGF0ZS54ID0geDtcbiAgICAgICAgbmV3U3RhdGUueSA9IHk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgLy8gV2hldGhlciBvciBub3Qgd2UgYXJlIGN1cnJlbnRseSBkcmFnZ2luZy5cbiAgICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGhhdmUgYmVlbiBkcmFnZ2VkIGJlZm9yZS5cbiAgICAgIGRyYWdnZWQ6IGZhbHNlLFxuICAgICAgLy8gQ3VycmVudCB0cmFuc2Zvcm0geCBhbmQgeS5cbiAgICAgIHg6IHByb3BzLnBvc2l0aW9uID8gcHJvcHMucG9zaXRpb24ueCA6IHByb3BzLmRlZmF1bHRQb3NpdGlvbi54LFxuICAgICAgeTogcHJvcHMucG9zaXRpb24gPyBwcm9wcy5wb3NpdGlvbi55IDogcHJvcHMuZGVmYXVsdFBvc2l0aW9uLnksXG4gICAgICBwcmV2UHJvcHNQb3NpdGlvbjoge1xuICAgICAgICAuLi5wcm9wcy5wb3NpdGlvblxuICAgICAgfSxcbiAgICAgIC8vIFVzZWQgZm9yIGNvbXBlbnNhdGluZyBmb3Igb3V0LW9mLWJvdW5kcyBkcmFnc1xuICAgICAgc2xhY2tYOiAwLFxuICAgICAgc2xhY2tZOiAwLFxuICAgICAgLy8gQ2FuIG9ubHkgZGV0ZXJtaW5lIGlmIFNWRyBhZnRlciBtb3VudGluZ1xuICAgICAgaXNFbGVtZW50U1ZHOiBmYWxzZVxuICAgIH07XG4gICAgaWYgKHByb3BzLnBvc2l0aW9uICYmICEocHJvcHMub25EcmFnIHx8IHByb3BzLm9uU3RvcCkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ0EgYHBvc2l0aW9uYCB3YXMgYXBwbGllZCB0byB0aGlzIDxEcmFnZ2FibGU+LCB3aXRob3V0IGRyYWcgaGFuZGxlcnMuIFRoaXMgd2lsbCBtYWtlIHRoaXMgJyArICdjb21wb25lbnQgZWZmZWN0aXZlbHkgdW5kcmFnZ2FibGUuIFBsZWFzZSBhdHRhY2ggYG9uRHJhZ2Agb3IgYG9uU3RvcGAgaGFuZGxlcnMgc28geW91IGNhbiBhZGp1c3QgdGhlICcgKyAnYHBvc2l0aW9uYCBvZiB0aGlzIGVsZW1lbnQuJyk7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgZWxlbWVudCBwYXNzZWQgaXMgYW4gaW5zdGFuY2VvZiBTVkdFbGVtZW50XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuU1ZHRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5maW5kRE9NTm9kZSgpIGluc3RhbmNlb2Ygd2luZG93LlNWR0VsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0VsZW1lbnRTVkc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRyYWdnaW5nOiBmYWxzZVxuICAgIH0pOyAvLyBwcmV2ZW50cyBpbnZhcmlhbnQgaWYgdW5tb3VudGVkIHdoaWxlIGRyYWdnaW5nXG4gIH1cblxuICAvLyBSZWFjdCBTdHJpY3QgTW9kZSBjb21wYXRpYmlsaXR5OiBpZiBgbm9kZVJlZmAgaXMgcGFzc2VkLCB3ZSB3aWxsIHVzZSBpdCBpbnN0ZWFkIG9mIHRyeWluZyB0byBmaW5kXG4gIC8vIHRoZSB1bmRlcmx5aW5nIERPTSBub2RlIG91cnNlbHZlcy4gU2VlIHRoZSBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gIGZpbmRET01Ob2RlKCkgLyo6ID9IVE1MRWxlbWVudCove1xuICAgIHZhciBfdGhpcyRwcm9wcyRub2RlUmVmJGMsIF90aGlzJHByb3BzO1xuICAgIHJldHVybiAoX3RoaXMkcHJvcHMkbm9kZVJlZiRjID0gKF90aGlzJHByb3BzID0gdGhpcy5wcm9wcykgPT09IG51bGwgfHwgX3RoaXMkcHJvcHMgPT09IHZvaWQgMCB8fCAoX3RoaXMkcHJvcHMgPSBfdGhpcyRwcm9wcy5ub2RlUmVmKSA9PT0gbnVsbCB8fCBfdGhpcyRwcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcHJvcHMuY3VycmVudCkgIT09IG51bGwgJiYgX3RoaXMkcHJvcHMkbm9kZVJlZiRjICE9PSB2b2lkIDAgPyBfdGhpcyRwcm9wcyRub2RlUmVmJGMgOiBfcmVhY3REb20uZGVmYXVsdC5maW5kRE9NTm9kZSh0aGlzKTtcbiAgfVxuICByZW5kZXIoKSAvKjogUmVhY3RFbGVtZW50PGFueT4qL3tcbiAgICBjb25zdCB7XG4gICAgICBheGlzLFxuICAgICAgYm91bmRzLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBkZWZhdWx0UG9zaXRpb24sXG4gICAgICBkZWZhdWx0Q2xhc3NOYW1lLFxuICAgICAgZGVmYXVsdENsYXNzTmFtZURyYWdnaW5nLFxuICAgICAgZGVmYXVsdENsYXNzTmFtZURyYWdnZWQsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIHBvc2l0aW9uT2Zmc2V0LFxuICAgICAgc2NhbGUsXG4gICAgICAuLi5kcmFnZ2FibGVDb3JlUHJvcHNcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBsZXQgc3R5bGUgPSB7fTtcbiAgICBsZXQgc3ZnVHJhbnNmb3JtID0gbnVsbDtcblxuICAgIC8vIElmIHRoaXMgaXMgY29udHJvbGxlZCwgd2UgZG9uJ3Qgd2FudCB0byBtb3ZlIGl0IC0gdW5sZXNzIGl0J3MgZHJhZ2dpbmcuXG4gICAgY29uc3QgY29udHJvbGxlZCA9IEJvb2xlYW4ocG9zaXRpb24pO1xuICAgIGNvbnN0IGRyYWdnYWJsZSA9ICFjb250cm9sbGVkIHx8IHRoaXMuc3RhdGUuZHJhZ2dpbmc7XG4gICAgY29uc3QgdmFsaWRQb3NpdGlvbiA9IHBvc2l0aW9uIHx8IGRlZmF1bHRQb3NpdGlvbjtcbiAgICBjb25zdCB0cmFuc2Zvcm1PcHRzID0ge1xuICAgICAgLy8gU2V0IGxlZnQgaWYgaG9yaXpvbnRhbCBkcmFnIGlzIGVuYWJsZWRcbiAgICAgIHg6ICgwLCBfcG9zaXRpb25GbnMuY2FuRHJhZ1gpKHRoaXMpICYmIGRyYWdnYWJsZSA/IHRoaXMuc3RhdGUueCA6IHZhbGlkUG9zaXRpb24ueCxcbiAgICAgIC8vIFNldCB0b3AgaWYgdmVydGljYWwgZHJhZyBpcyBlbmFibGVkXG4gICAgICB5OiAoMCwgX3Bvc2l0aW9uRm5zLmNhbkRyYWdZKSh0aGlzKSAmJiBkcmFnZ2FibGUgPyB0aGlzLnN0YXRlLnkgOiB2YWxpZFBvc2l0aW9uLnlcbiAgICB9O1xuXG4gICAgLy8gSWYgdGhpcyBlbGVtZW50IHdhcyBTVkcsIHdlIHVzZSB0aGUgYHRyYW5zZm9ybWAgYXR0cmlidXRlLlxuICAgIGlmICh0aGlzLnN0YXRlLmlzRWxlbWVudFNWRykge1xuICAgICAgc3ZnVHJhbnNmb3JtID0gKDAsIF9kb21GbnMuY3JlYXRlU1ZHVHJhbnNmb3JtKSh0cmFuc2Zvcm1PcHRzLCBwb3NpdGlvbk9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCBhIENTUyB0cmFuc2Zvcm0gdG8gbW92ZSB0aGUgZWxlbWVudCBhcm91bmQuIFRoaXMgYWxsb3dzIHVzIHRvIG1vdmUgdGhlIGVsZW1lbnQgYXJvdW5kXG4gICAgICAvLyB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHdoZXRoZXIgb3Igbm90IGl0IGlzIHJlbGF0aXZlbHkgb3IgYWJzb2x1dGVseSBwb3NpdGlvbmVkLlxuICAgICAgLy8gSWYgdGhlIGl0ZW0geW91IGFyZSBkcmFnZ2luZyBhbHJlYWR5IGhhcyBhIHRyYW5zZm9ybSBzZXQsIHdyYXAgaXQgaW4gYSA8c3Bhbj4gc28gPERyYWdnYWJsZT5cbiAgICAgIC8vIGhhcyBhIGNsZWFuIHNsYXRlLlxuICAgICAgc3R5bGUgPSAoMCwgX2RvbUZucy5jcmVhdGVDU1NUcmFuc2Zvcm0pKHRyYW5zZm9ybU9wdHMsIHBvc2l0aW9uT2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyBNYXJrIHdpdGggY2xhc3Mgd2hpbGUgZHJhZ2dpbmdcbiAgICBjb25zdCBjbGFzc05hbWUgPSAoMCwgX2Nsc3guZGVmYXVsdCkoY2hpbGRyZW4ucHJvcHMuY2xhc3NOYW1lIHx8ICcnLCBkZWZhdWx0Q2xhc3NOYW1lLCB7XG4gICAgICBbZGVmYXVsdENsYXNzTmFtZURyYWdnaW5nXTogdGhpcy5zdGF0ZS5kcmFnZ2luZyxcbiAgICAgIFtkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dlZF06IHRoaXMuc3RhdGUuZHJhZ2dlZFxuICAgIH0pO1xuXG4gICAgLy8gUmV1c2UgdGhlIGNoaWxkIHByb3ZpZGVkXG4gICAgLy8gVGhpcyBtYWtlcyBpdCBmbGV4aWJsZSB0byB1c2Ugd2hhdGV2ZXIgZWxlbWVudCBpcyB3YW50ZWQgKGRpdiwgdWwsIGV0YylcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0RyYWdnYWJsZUNvcmUuZGVmYXVsdCwgX2V4dGVuZHMoe30sIGRyYWdnYWJsZUNvcmVQcm9wcywge1xuICAgICAgb25TdGFydDogdGhpcy5vbkRyYWdTdGFydCxcbiAgICAgIG9uRHJhZzogdGhpcy5vbkRyYWcsXG4gICAgICBvblN0b3A6IHRoaXMub25EcmFnU3RvcFxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIC4uLmNoaWxkcmVuLnByb3BzLnN0eWxlLFxuICAgICAgICAuLi5zdHlsZVxuICAgICAgfSxcbiAgICAgIHRyYW5zZm9ybTogc3ZnVHJhbnNmb3JtXG4gICAgfSkpO1xuICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBEcmFnZ2FibGU7XG5fZGVmaW5lUHJvcGVydHkoRHJhZ2dhYmxlLCBcImRpc3BsYXlOYW1lXCIsICdEcmFnZ2FibGUnKTtcbl9kZWZpbmVQcm9wZXJ0eShEcmFnZ2FibGUsIFwicHJvcFR5cGVzXCIsIHtcbiAgLy8gQWNjZXB0cyBhbGwgcHJvcHMgPERyYWdnYWJsZUNvcmU+IGFjY2VwdHMuXG4gIC4uLl9EcmFnZ2FibGVDb3JlLmRlZmF1bHQucHJvcFR5cGVzLFxuICAvKipcbiAgICogYGF4aXNgIGRldGVybWluZXMgd2hpY2ggYXhpcyB0aGUgZHJhZ2dhYmxlIGNhbiBtb3ZlLlxuICAgKlxuICAgKiAgTm90ZSB0aGF0IGFsbCBjYWxsYmFja3Mgd2lsbCBzdGlsbCByZXR1cm4gZGF0YSBhcyBub3JtYWwuIFRoaXMgb25seVxuICAgKiAgY29udHJvbHMgZmx1c2hpbmcgdG8gdGhlIERPTS5cbiAgICpcbiAgICogJ2JvdGgnIGFsbG93cyBtb3ZlbWVudCBob3Jpem9udGFsbHkgYW5kIHZlcnRpY2FsbHkuXG4gICAqICd4JyBsaW1pdHMgbW92ZW1lbnQgdG8gaG9yaXpvbnRhbCBheGlzLlxuICAgKiAneScgbGltaXRzIG1vdmVtZW50IHRvIHZlcnRpY2FsIGF4aXMuXG4gICAqICdub25lJyBsaW1pdHMgYWxsIG1vdmVtZW50LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byAnYm90aCcuXG4gICAqL1xuICBheGlzOiBfcHJvcFR5cGVzLmRlZmF1bHQub25lT2YoWydib3RoJywgJ3gnLCAneScsICdub25lJ10pLFxuICAvKipcbiAgICogYGJvdW5kc2AgZGV0ZXJtaW5lcyB0aGUgcmFuZ2Ugb2YgbW92ZW1lbnQgYXZhaWxhYmxlIHRvIHRoZSBlbGVtZW50LlxuICAgKiBBdmFpbGFibGUgdmFsdWVzIGFyZTpcbiAgICpcbiAgICogJ3BhcmVudCcgcmVzdHJpY3RzIG1vdmVtZW50IHdpdGhpbiB0aGUgRHJhZ2dhYmxlJ3MgcGFyZW50IG5vZGUuXG4gICAqXG4gICAqIEFsdGVybmF0aXZlbHksIHBhc3MgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzLCBhbGwgb2Ygd2hpY2ggYXJlIG9wdGlvbmFsOlxuICAgKlxuICAgKiB7bGVmdDogTEVGVF9CT1VORCwgcmlnaHQ6IFJJR0hUX0JPVU5ELCBib3R0b206IEJPVFRPTV9CT1VORCwgdG9wOiBUT1BfQk9VTkR9XG4gICAqXG4gICAqIEFsbCB2YWx1ZXMgYXJlIGluIHB4LlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogICBsZXQgQXBwID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICogICAgICAgICByZXR1cm4gKFxuICAgKiAgICAgICAgICAgIDxEcmFnZ2FibGUgYm91bmRzPXt7cmlnaHQ6IDMwMCwgYm90dG9tOiAzMDB9fT5cbiAgICogICAgICAgICAgICAgIDxkaXY+Q29udGVudDwvZGl2PlxuICAgKiAgICAgICAgICAgPC9EcmFnZ2FibGU+XG4gICAqICAgICAgICAgKTtcbiAgICogICAgICAgfVxuICAgKiAgIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGJvdW5kczogX3Byb3BUeXBlcy5kZWZhdWx0Lm9uZU9mVHlwZShbX3Byb3BUeXBlcy5kZWZhdWx0LnNoYXBlKHtcbiAgICBsZWZ0OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLFxuICAgIHJpZ2h0OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLFxuICAgIHRvcDogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlcixcbiAgICBib3R0b206IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXJcbiAgfSksIF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsIF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZihbZmFsc2VdKV0pLFxuICBkZWZhdWx0Q2xhc3NOYW1lOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICBkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dpbmc6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2VkOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuICAvKipcbiAgICogYGRlZmF1bHRQb3NpdGlvbmAgc3BlY2lmaWVzIHRoZSB4IGFuZCB5IHRoYXQgdGhlIGRyYWdnZWQgaXRlbSBzaG91bGQgc3RhcnQgYXRcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganN4XG4gICAqICAgICAgbGV0IEFwcCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAqICAgICAgICAgICAgICByZXR1cm4gKFxuICAgKiAgICAgICAgICAgICAgICAgIDxEcmFnZ2FibGUgZGVmYXVsdFBvc2l0aW9uPXt7eDogMjUsIHk6IDI1fX0+XG4gICAqICAgICAgICAgICAgICAgICAgICAgIDxkaXY+SSBzdGFydCB3aXRoIHRyYW5zZm9ybVg6IDI1cHggYW5kIHRyYW5zZm9ybVk6IDI1cHg7PC9kaXY+XG4gICAqICAgICAgICAgICAgICAgICAgPC9EcmFnZ2FibGU+XG4gICAqICAgICAgICAgICAgICApO1xuICAgKiAgICAgICAgICB9XG4gICAqICAgICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZGVmYXVsdFBvc2l0aW9uOiBfcHJvcFR5cGVzLmRlZmF1bHQuc2hhcGUoe1xuICAgIHg6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsXG4gICAgeTogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlclxuICB9KSxcbiAgcG9zaXRpb25PZmZzZXQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5zaGFwZSh7XG4gICAgeDogX3Byb3BUeXBlcy5kZWZhdWx0Lm9uZU9mVHlwZShbX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlciwgX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZ10pLFxuICAgIHk6IF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZlR5cGUoW19wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsIF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmddKVxuICB9KSxcbiAgLyoqXG4gICAqIGBwb3NpdGlvbmAsIGlmIHByZXNlbnQsIGRlZmluZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQuXG4gICAqXG4gICAqICBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IGZvcm0gZWxlbWVudHMgaW4gUmVhY3Qgd29yayAtIGlmIG5vIGBwb3NpdGlvbmAgaXMgc3VwcGxpZWQsIHRoZSBjb21wb25lbnRcbiAgICogIGlzIHVuY29udHJvbGxlZC5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganN4XG4gICAqICAgICAgbGV0IEFwcCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAqICAgICAgICAgICAgICByZXR1cm4gKFxuICAgKiAgICAgICAgICAgICAgICAgIDxEcmFnZ2FibGUgcG9zaXRpb249e3t4OiAyNSwgeTogMjV9fT5cbiAgICogICAgICAgICAgICAgICAgICAgICAgPGRpdj5JIHN0YXJ0IHdpdGggdHJhbnNmb3JtWDogMjVweCBhbmQgdHJhbnNmb3JtWTogMjVweDs8L2Rpdj5cbiAgICogICAgICAgICAgICAgICAgICA8L0RyYWdnYWJsZT5cbiAgICogICAgICAgICAgICAgICk7XG4gICAqICAgICAgICAgIH1cbiAgICogICAgICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwb3NpdGlvbjogX3Byb3BUeXBlcy5kZWZhdWx0LnNoYXBlKHtcbiAgICB4OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLFxuICAgIHk6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXJcbiAgfSksXG4gIC8qKlxuICAgKiBUaGVzZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZWZpbmVkIG9uIHRoZSBjaGlsZCwgbm90IGhlcmUuXG4gICAqL1xuICBjbGFzc05hbWU6IF9zaGltcy5kb250U2V0TWUsXG4gIHN0eWxlOiBfc2hpbXMuZG9udFNldE1lLFxuICB0cmFuc2Zvcm06IF9zaGltcy5kb250U2V0TWVcbn0pO1xuX2RlZmluZVByb3BlcnR5KERyYWdnYWJsZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICAuLi5fRHJhZ2dhYmxlQ29yZS5kZWZhdWx0LmRlZmF1bHRQcm9wcyxcbiAgYXhpczogJ2JvdGgnLFxuICBib3VuZHM6IGZhbHNlLFxuICBkZWZhdWx0Q2xhc3NOYW1lOiAncmVhY3QtZHJhZ2dhYmxlJyxcbiAgZGVmYXVsdENsYXNzTmFtZURyYWdnaW5nOiAncmVhY3QtZHJhZ2dhYmxlLWRyYWdnaW5nJyxcbiAgZGVmYXVsdENsYXNzTmFtZURyYWdnZWQ6ICdyZWFjdC1kcmFnZ2FibGUtZHJhZ2dlZCcsXG4gIGRlZmF1bHRQb3NpdGlvbjoge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9LFxuICBzY2FsZTogMVxufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9wcm9wVHlwZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcbnZhciBfcmVhY3REb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdC1kb21cIikpO1xudmFyIF9kb21GbnMgPSByZXF1aXJlKFwiLi91dGlscy9kb21GbnNcIik7XG52YXIgX3Bvc2l0aW9uRm5zID0gcmVxdWlyZShcIi4vdXRpbHMvcG9zaXRpb25GbnNcIik7XG52YXIgX3NoaW1zID0gcmVxdWlyZShcIi4vdXRpbHMvc2hpbXNcIik7XG52YXIgX2xvZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXRpbHMvbG9nXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGVCYWJlbEludGVyb3AgPSBuZXcgV2Vha01hcCgpOyB2YXIgY2FjaGVOb2RlSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKG5vZGVJbnRlcm9wKSB7IHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDsgfSkobm9kZUludGVyb3ApOyB9XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7IGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChrZXkgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHsgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpOyByZXR1cm4gdHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmICh0eXBlb2YgcmVzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7IH1cbi8qOjogaW1wb3J0IHR5cGUge0V2ZW50SGFuZGxlciwgTW91c2VUb3VjaEV2ZW50fSBmcm9tICcuL3V0aWxzL3R5cGVzJzsqL1xuLyo6OiBpbXBvcnQgdHlwZSB7RWxlbWVudCBhcyBSZWFjdEVsZW1lbnR9IGZyb20gJ3JlYWN0JzsqL1xuLy8gU2ltcGxlIGFic3RyYWN0aW9uIGZvciBkcmFnZ2luZyBldmVudHMgbmFtZXMuXG5jb25zdCBldmVudHNGb3IgPSB7XG4gIHRvdWNoOiB7XG4gICAgc3RhcnQ6ICd0b3VjaHN0YXJ0JyxcbiAgICBtb3ZlOiAndG91Y2htb3ZlJyxcbiAgICBzdG9wOiAndG91Y2hlbmQnXG4gIH0sXG4gIG1vdXNlOiB7XG4gICAgc3RhcnQ6ICdtb3VzZWRvd24nLFxuICAgIG1vdmU6ICdtb3VzZW1vdmUnLFxuICAgIHN0b3A6ICdtb3VzZXVwJ1xuICB9XG59O1xuXG4vLyBEZWZhdWx0IHRvIG1vdXNlIGV2ZW50cy5cbmxldCBkcmFnRXZlbnRGb3IgPSBldmVudHNGb3IubW91c2U7XG4vKjo6IGV4cG9ydCB0eXBlIERyYWdnYWJsZURhdGEgPSB7XG4gIG5vZGU6IEhUTUxFbGVtZW50LFxuICB4OiBudW1iZXIsIHk6IG51bWJlcixcbiAgZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyLFxuICBsYXN0WDogbnVtYmVyLCBsYXN0WTogbnVtYmVyLFxufTsqL1xuLyo6OiBleHBvcnQgdHlwZSBEcmFnZ2FibGVFdmVudEhhbmRsZXIgPSAoZTogTW91c2VFdmVudCwgZGF0YTogRHJhZ2dhYmxlRGF0YSkgPT4gdm9pZCB8IGZhbHNlOyovXG4vKjo6IGV4cG9ydCB0eXBlIENvbnRyb2xQb3NpdGlvbiA9IHt4OiBudW1iZXIsIHk6IG51bWJlcn07Ki9cbi8qOjogZXhwb3J0IHR5cGUgUG9zaXRpb25PZmZzZXRDb250cm9sUG9zaXRpb24gPSB7eDogbnVtYmVyfHN0cmluZywgeTogbnVtYmVyfHN0cmluZ307Ki9cbi8qOjogZXhwb3J0IHR5cGUgRHJhZ2dhYmxlQ29yZURlZmF1bHRQcm9wcyA9IHtcbiAgYWxsb3dBbnlDbGljazogYm9vbGVhbixcbiAgZGlzYWJsZWQ6IGJvb2xlYW4sXG4gIGVuYWJsZVVzZXJTZWxlY3RIYWNrOiBib29sZWFuLFxuICBvblN0YXJ0OiBEcmFnZ2FibGVFdmVudEhhbmRsZXIsXG4gIG9uRHJhZzogRHJhZ2dhYmxlRXZlbnRIYW5kbGVyLFxuICBvblN0b3A6IERyYWdnYWJsZUV2ZW50SGFuZGxlcixcbiAgb25Nb3VzZURvd246IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkLFxuICBzY2FsZTogbnVtYmVyLFxufTsqL1xuLyo6OiBleHBvcnQgdHlwZSBEcmFnZ2FibGVDb3JlUHJvcHMgPSB7XG4gIC4uLkRyYWdnYWJsZUNvcmVEZWZhdWx0UHJvcHMsXG4gIGNhbmNlbDogc3RyaW5nLFxuICBjaGlsZHJlbjogUmVhY3RFbGVtZW50PGFueT4sXG4gIG9mZnNldFBhcmVudDogSFRNTEVsZW1lbnQsXG4gIGdyaWQ6IFtudW1iZXIsIG51bWJlcl0sXG4gIGhhbmRsZTogc3RyaW5nLFxuICBub2RlUmVmPzogP1JlYWN0LkVsZW1lbnRSZWY8YW55Pixcbn07Ki9cbi8vXG4vLyBEZWZpbmUgPERyYWdnYWJsZUNvcmU+LlxuLy9cbi8vIDxEcmFnZ2FibGVDb3JlPiBpcyBmb3IgYWR2YW5jZWQgdXNhZ2Ugb2YgPERyYWdnYWJsZT4uIEl0IG1haW50YWlucyBtaW5pbWFsIGludGVybmFsIHN0YXRlIHNvIGl0IGNhblxuLy8gd29yayB3ZWxsIHdpdGggbGlicmFyaWVzIHRoYXQgcmVxdWlyZSBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgZWxlbWVudC5cbi8vXG5cbmNsYXNzIERyYWdnYWJsZUNvcmUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgLyo6OiA8RHJhZ2dhYmxlQ29yZVByb3BzPiove1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRyYWdnaW5nXCIsIGZhbHNlKTtcbiAgICAvLyBVc2VkIHdoaWxlIGRyYWdnaW5nIHRvIGRldGVybWluZSBkZWx0YXMuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibGFzdFhcIiwgTmFOKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJsYXN0WVwiLCBOYU4pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInRvdWNoSWRlbnRpZmllclwiLCBudWxsKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJtb3VudGVkXCIsIGZhbHNlKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJoYW5kbGVEcmFnU3RhcnRcIiwgZSA9PiB7XG4gICAgICAvLyBNYWtlIGl0IHBvc3NpYmxlIHRvIGF0dGFjaCBldmVudCBoYW5kbGVycyBvbiB0b3Agb2YgdGhpcyBvbmUuXG4gICAgICB0aGlzLnByb3BzLm9uTW91c2VEb3duKGUpO1xuXG4gICAgICAvLyBPbmx5IGFjY2VwdCBsZWZ0LWNsaWNrcy5cbiAgICAgIGlmICghdGhpcy5wcm9wcy5hbGxvd0FueUNsaWNrICYmIHR5cGVvZiBlLmJ1dHRvbiA9PT0gJ251bWJlcicgJiYgZS5idXR0b24gIT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gR2V0IG5vZGVzLiBCZSBzdXJlIHRvIGdyYWIgcmVsYXRpdmUgZG9jdW1lbnQgKGNvdWxkIGJlIGlmcmFtZWQpXG4gICAgICBjb25zdCB0aGlzTm9kZSA9IHRoaXMuZmluZERPTU5vZGUoKTtcbiAgICAgIGlmICghdGhpc05vZGUgfHwgIXRoaXNOb2RlLm93bmVyRG9jdW1lbnQgfHwgIXRoaXNOb2RlLm93bmVyRG9jdW1lbnQuYm9keSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJzxEcmFnZ2FibGVDb3JlPiBub3QgbW91bnRlZCBvbiBEcmFnU3RhcnQhJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIG93bmVyRG9jdW1lbnRcbiAgICAgIH0gPSB0aGlzTm9kZTtcblxuICAgICAgLy8gU2hvcnQgY2lyY3VpdCBpZiBoYW5kbGUgb3IgY2FuY2VsIHByb3Agd2FzIHByb3ZpZGVkIGFuZCBzZWxlY3RvciBkb2Vzbid0IG1hdGNoLlxuICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQgfHwgIShlLnRhcmdldCBpbnN0YW5jZW9mIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuTm9kZSkgfHwgdGhpcy5wcm9wcy5oYW5kbGUgJiYgISgwLCBfZG9tRm5zLm1hdGNoZXNTZWxlY3RvckFuZFBhcmVudHNUbykoZS50YXJnZXQsIHRoaXMucHJvcHMuaGFuZGxlLCB0aGlzTm9kZSkgfHwgdGhpcy5wcm9wcy5jYW5jZWwgJiYgKDAsIF9kb21GbnMubWF0Y2hlc1NlbGVjdG9yQW5kUGFyZW50c1RvKShlLnRhcmdldCwgdGhpcy5wcm9wcy5jYW5jZWwsIHRoaXNOb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXZlbnQgc2Nyb2xsaW5nIG9uIG1vYmlsZSBkZXZpY2VzLCBsaWtlIGlwYWQvaXBob25lLlxuICAgICAgLy8gSW1wb3J0YW50IHRoYXQgdGhpcyBpcyBhZnRlciBoYW5kbGUvY2FuY2VsLlxuICAgICAgaWYgKGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIC8vIFNldCB0b3VjaCBpZGVudGlmaWVyIGluIGNvbXBvbmVudCBzdGF0ZSBpZiB0aGlzIGlzIGEgdG91Y2ggZXZlbnQuIFRoaXMgYWxsb3dzIHVzIHRvXG4gICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIGluZGl2aWR1YWwgdG91Y2hlcyBvbiBtdWx0aXRvdWNoIHNjcmVlbnMgYnkgaWRlbnRpZnlpbmcgd2hpY2hcbiAgICAgIC8vIHRvdWNocG9pbnQgd2FzIHNldCB0byB0aGlzIGVsZW1lbnQuXG4gICAgICBjb25zdCB0b3VjaElkZW50aWZpZXIgPSAoMCwgX2RvbUZucy5nZXRUb3VjaElkZW50aWZpZXIpKGUpO1xuICAgICAgdGhpcy50b3VjaElkZW50aWZpZXIgPSB0b3VjaElkZW50aWZpZXI7XG5cbiAgICAgIC8vIEdldCB0aGUgY3VycmVudCBkcmFnIHBvaW50IGZyb20gdGhlIGV2ZW50LiBUaGlzIGlzIHVzZWQgYXMgdGhlIG9mZnNldC5cbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gKDAsIF9wb3NpdGlvbkZucy5nZXRDb250cm9sUG9zaXRpb24pKGUsIHRvdWNoSWRlbnRpZmllciwgdGhpcyk7XG4gICAgICBpZiAocG9zaXRpb24gPT0gbnVsbCkgcmV0dXJuOyAvLyBub3QgcG9zc2libGUgYnV0IHNhdGlzZmllcyBmbG93XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSBwb3NpdGlvbjtcblxuICAgICAgLy8gQ3JlYXRlIGFuIGV2ZW50IG9iamVjdCB3aXRoIGFsbCB0aGUgZGF0YSBwYXJlbnRzIG5lZWQgdG8gbWFrZSBhIGRlY2lzaW9uIGhlcmUuXG4gICAgICBjb25zdCBjb3JlRXZlbnQgPSAoMCwgX3Bvc2l0aW9uRm5zLmNyZWF0ZUNvcmVEYXRhKSh0aGlzLCB4LCB5KTtcbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGVDb3JlOiBoYW5kbGVEcmFnU3RhcnQ6ICVqJywgY29yZUV2ZW50KTtcblxuICAgICAgLy8gQ2FsbCBldmVudCBoYW5kbGVyLiBJZiBpdCByZXR1cm5zIGV4cGxpY2l0IGZhbHNlLCBjYW5jZWwuXG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnY2FsbGluZycsIHRoaXMucHJvcHMub25TdGFydCk7XG4gICAgICBjb25zdCBzaG91bGRVcGRhdGUgPSB0aGlzLnByb3BzLm9uU3RhcnQoZSwgY29yZUV2ZW50KTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IGZhbHNlIHx8IHRoaXMubW91bnRlZCA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgLy8gQWRkIGEgc3R5bGUgdG8gdGhlIGJvZHkgdG8gZGlzYWJsZSB1c2VyLXNlbGVjdC4gVGhpcyBwcmV2ZW50cyB0ZXh0IGZyb21cbiAgICAgIC8vIGJlaW5nIHNlbGVjdGVkIGFsbCBvdmVyIHRoZSBwYWdlLlxuICAgICAgaWYgKHRoaXMucHJvcHMuZW5hYmxlVXNlclNlbGVjdEhhY2spICgwLCBfZG9tRm5zLmFkZFVzZXJTZWxlY3RTdHlsZXMpKG93bmVyRG9jdW1lbnQpO1xuXG4gICAgICAvLyBJbml0aWF0ZSBkcmFnZ2luZy4gU2V0IHRoZSBjdXJyZW50IHggYW5kIHkgYXMgb2Zmc2V0c1xuICAgICAgLy8gc28gd2Uga25vdyBob3cgbXVjaCB3ZSd2ZSBtb3ZlZCBkdXJpbmcgdGhlIGRyYWcuIFRoaXMgYWxsb3dzIHVzXG4gICAgICAvLyB0byBkcmFnIGVsZW1lbnRzIGFyb3VuZCBldmVuIGlmIHRoZXkgaGF2ZSBiZWVuIG1vdmVkLCB3aXRob3V0IGlzc3VlLlxuICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLmxhc3RYID0geDtcbiAgICAgIHRoaXMubGFzdFkgPSB5O1xuXG4gICAgICAvLyBBZGQgZXZlbnRzIHRvIHRoZSBkb2N1bWVudCBkaXJlY3RseSBzbyB3ZSBjYXRjaCB3aGVuIHRoZSB1c2VyJ3MgbW91c2UvdG91Y2ggbW92ZXMgb3V0c2lkZSBvZlxuICAgICAgLy8gdGhpcyBlbGVtZW50LiBXZSB1c2UgZGlmZmVyZW50IGV2ZW50cyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3Qgd2UgaGF2ZSBkZXRlY3RlZCB0aGF0IHRoaXNcbiAgICAgIC8vIGlzIGEgdG91Y2gtY2FwYWJsZSBkZXZpY2UuXG4gICAgICAoMCwgX2RvbUZucy5hZGRFdmVudCkob3duZXJEb2N1bWVudCwgZHJhZ0V2ZW50Rm9yLm1vdmUsIHRoaXMuaGFuZGxlRHJhZyk7XG4gICAgICAoMCwgX2RvbUZucy5hZGRFdmVudCkob3duZXJEb2N1bWVudCwgZHJhZ0V2ZW50Rm9yLnN0b3AsIHRoaXMuaGFuZGxlRHJhZ1N0b3ApO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImhhbmRsZURyYWdcIiwgZSA9PiB7XG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgZHJhZyBwb2ludCBmcm9tIHRoZSBldmVudC4gVGhpcyBpcyB1c2VkIGFzIHRoZSBvZmZzZXQuXG4gICAgICBjb25zdCBwb3NpdGlvbiA9ICgwLCBfcG9zaXRpb25GbnMuZ2V0Q29udHJvbFBvc2l0aW9uKShlLCB0aGlzLnRvdWNoSWRlbnRpZmllciwgdGhpcyk7XG4gICAgICBpZiAocG9zaXRpb24gPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgbGV0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHBvc2l0aW9uO1xuXG4gICAgICAvLyBTbmFwIHRvIGdyaWQgaWYgcHJvcCBoYXMgYmVlbiBwcm92aWRlZFxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5wcm9wcy5ncmlkKSkge1xuICAgICAgICBsZXQgZGVsdGFYID0geCAtIHRoaXMubGFzdFgsXG4gICAgICAgICAgZGVsdGFZID0geSAtIHRoaXMubGFzdFk7XG4gICAgICAgIFtkZWx0YVgsIGRlbHRhWV0gPSAoMCwgX3Bvc2l0aW9uRm5zLnNuYXBUb0dyaWQpKHRoaXMucHJvcHMuZ3JpZCwgZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgICBpZiAoIWRlbHRhWCAmJiAhZGVsdGFZKSByZXR1cm47IC8vIHNraXAgdXNlbGVzcyBkcmFnXG4gICAgICAgIHggPSB0aGlzLmxhc3RYICsgZGVsdGFYLCB5ID0gdGhpcy5sYXN0WSArIGRlbHRhWTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvcmVFdmVudCA9ICgwLCBfcG9zaXRpb25GbnMuY3JlYXRlQ29yZURhdGEpKHRoaXMsIHgsIHkpO1xuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZUNvcmU6IGhhbmRsZURyYWc6ICVqJywgY29yZUV2ZW50KTtcblxuICAgICAgLy8gQ2FsbCBldmVudCBoYW5kbGVyLiBJZiBpdCByZXR1cm5zIGV4cGxpY2l0IGZhbHNlLCB0cmlnZ2VyIGVuZC5cbiAgICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9IHRoaXMucHJvcHMub25EcmFnKGUsIGNvcmVFdmVudCk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSBmYWxzZSB8fCB0aGlzLm1vdW50ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gJEZsb3dJZ25vcmVcbiAgICAgICAgICB0aGlzLmhhbmRsZURyYWdTdG9wKG5ldyBNb3VzZUV2ZW50KCdtb3VzZXVwJykpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBPbGQgYnJvd3NlcnNcbiAgICAgICAgICBjb25zdCBldmVudCA9ICgoZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJykgLyo6IGFueSovKSAvKjogTW91c2VUb3VjaEV2ZW50Ki8pO1xuICAgICAgICAgIC8vIEkgc2VlIHdoeSB0aGlzIGluc2FuaXR5IHdhcyBkZXByZWNhdGVkXG4gICAgICAgICAgLy8gJEZsb3dJZ25vcmVcbiAgICAgICAgICBldmVudC5pbml0TW91c2VFdmVudCgnbW91c2V1cCcsIHRydWUsIHRydWUsIHdpbmRvdywgMCwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGwpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlRHJhZ1N0b3AoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFggPSB4O1xuICAgICAgdGhpcy5sYXN0WSA9IHk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaGFuZGxlRHJhZ1N0b3BcIiwgZSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gKDAsIF9wb3NpdGlvbkZucy5nZXRDb250cm9sUG9zaXRpb24pKGUsIHRoaXMudG91Y2hJZGVudGlmaWVyLCB0aGlzKTtcbiAgICAgIGlmIChwb3NpdGlvbiA9PSBudWxsKSByZXR1cm47XG4gICAgICBsZXQge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gcG9zaXRpb247XG5cbiAgICAgIC8vIFNuYXAgdG8gZ3JpZCBpZiBwcm9wIGhhcyBiZWVuIHByb3ZpZGVkXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnByb3BzLmdyaWQpKSB7XG4gICAgICAgIGxldCBkZWx0YVggPSB4IC0gdGhpcy5sYXN0WCB8fCAwO1xuICAgICAgICBsZXQgZGVsdGFZID0geSAtIHRoaXMubGFzdFkgfHwgMDtcbiAgICAgICAgW2RlbHRhWCwgZGVsdGFZXSA9ICgwLCBfcG9zaXRpb25GbnMuc25hcFRvR3JpZCkodGhpcy5wcm9wcy5ncmlkLCBkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgIHggPSB0aGlzLmxhc3RYICsgZGVsdGFYLCB5ID0gdGhpcy5sYXN0WSArIGRlbHRhWTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvcmVFdmVudCA9ICgwLCBfcG9zaXRpb25GbnMuY3JlYXRlQ29yZURhdGEpKHRoaXMsIHgsIHkpO1xuXG4gICAgICAvLyBDYWxsIGV2ZW50IGhhbmRsZXJcbiAgICAgIGNvbnN0IHNob3VsZENvbnRpbnVlID0gdGhpcy5wcm9wcy5vblN0b3AoZSwgY29yZUV2ZW50KTtcbiAgICAgIGlmIChzaG91bGRDb250aW51ZSA9PT0gZmFsc2UgfHwgdGhpcy5tb3VudGVkID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLmZpbmRET01Ob2RlKCk7XG4gICAgICBpZiAodGhpc05vZGUpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHVzZXItc2VsZWN0IGhhY2tcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZW5hYmxlVXNlclNlbGVjdEhhY2spICgwLCBfZG9tRm5zLnJlbW92ZVVzZXJTZWxlY3RTdHlsZXMpKHRoaXNOb2RlLm93bmVyRG9jdW1lbnQpO1xuICAgICAgfVxuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZUNvcmU6IGhhbmRsZURyYWdTdG9wOiAlaicsIGNvcmVFdmVudCk7XG5cbiAgICAgIC8vIFJlc2V0IHRoZSBlbC5cbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubGFzdFggPSBOYU47XG4gICAgICB0aGlzLmxhc3RZID0gTmFOO1xuICAgICAgaWYgKHRoaXNOb2RlKSB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBoYW5kbGVyc1xuICAgICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlQ29yZTogUmVtb3ZpbmcgaGFuZGxlcnMnKTtcbiAgICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKHRoaXNOb2RlLm93bmVyRG9jdW1lbnQsIGRyYWdFdmVudEZvci5tb3ZlLCB0aGlzLmhhbmRsZURyYWcpO1xuICAgICAgICAoMCwgX2RvbUZucy5yZW1vdmVFdmVudCkodGhpc05vZGUub3duZXJEb2N1bWVudCwgZHJhZ0V2ZW50Rm9yLnN0b3AsIHRoaXMuaGFuZGxlRHJhZ1N0b3ApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uTW91c2VEb3duXCIsIGUgPT4ge1xuICAgICAgZHJhZ0V2ZW50Rm9yID0gZXZlbnRzRm9yLm1vdXNlOyAvLyBvbiB0b3VjaHNjcmVlbiBsYXB0b3BzIHdlIGNvdWxkIHN3aXRjaCBiYWNrIHRvIG1vdXNlXG5cbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZURyYWdTdGFydChlKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvbk1vdXNlVXBcIiwgZSA9PiB7XG4gICAgICBkcmFnRXZlbnRGb3IgPSBldmVudHNGb3IubW91c2U7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVEcmFnU3RvcChlKTtcbiAgICB9KTtcbiAgICAvLyBTYW1lIGFzIG9uTW91c2VEb3duIChzdGFydCBkcmFnKSwgYnV0IG5vdyBjb25zaWRlciB0aGlzIGEgdG91Y2ggZGV2aWNlLlxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uVG91Y2hTdGFydFwiLCBlID0+IHtcbiAgICAgIC8vIFdlJ3JlIG9uIGEgdG91Y2ggZGV2aWNlIG5vdywgc28gY2hhbmdlIHRoZSBldmVudCBoYW5kbGVyc1xuICAgICAgZHJhZ0V2ZW50Rm9yID0gZXZlbnRzRm9yLnRvdWNoO1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KGUpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uVG91Y2hFbmRcIiwgZSA9PiB7XG4gICAgICAvLyBXZSdyZSBvbiBhIHRvdWNoIGRldmljZSBub3csIHNvIGNoYW5nZSB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgIGRyYWdFdmVudEZvciA9IGV2ZW50c0Zvci50b3VjaDtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZURyYWdTdG9wKGUpO1xuICAgIH0pO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgLy8gVG91Y2ggaGFuZGxlcnMgbXVzdCBiZSBhZGRlZCB3aXRoIHtwYXNzaXZlOiBmYWxzZX0gdG8gYmUgY2FuY2VsYWJsZS5cbiAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzAxL3Njcm9sbGluZy1pbnRlcnZlbnRpb25cbiAgICBjb25zdCB0aGlzTm9kZSA9IHRoaXMuZmluZERPTU5vZGUoKTtcbiAgICBpZiAodGhpc05vZGUpIHtcbiAgICAgICgwLCBfZG9tRm5zLmFkZEV2ZW50KSh0aGlzTm9kZSwgZXZlbnRzRm9yLnRvdWNoLnN0YXJ0LCB0aGlzLm9uVG91Y2hTdGFydCwge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICAgIC8vIFJlbW92ZSBhbnkgbGVmdG92ZXIgZXZlbnQgaGFuZGxlcnMuIFJlbW92ZSBib3RoIHRvdWNoIGFuZCBtb3VzZSBoYW5kbGVycyBpbiBjYXNlXG4gICAgLy8gc29tZSBicm93c2VyIHF1aXJrIGNhdXNlZCBhIHRvdWNoIGV2ZW50IHRvIGZpcmUgZHVyaW5nIGEgbW91c2UgbW92ZSwgb3IgdmljZSB2ZXJzYS5cbiAgICBjb25zdCB0aGlzTm9kZSA9IHRoaXMuZmluZERPTU5vZGUoKTtcbiAgICBpZiAodGhpc05vZGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb3duZXJEb2N1bWVudFxuICAgICAgfSA9IHRoaXNOb2RlO1xuICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKG93bmVyRG9jdW1lbnQsIGV2ZW50c0Zvci5tb3VzZS5tb3ZlLCB0aGlzLmhhbmRsZURyYWcpO1xuICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKG93bmVyRG9jdW1lbnQsIGV2ZW50c0Zvci50b3VjaC5tb3ZlLCB0aGlzLmhhbmRsZURyYWcpO1xuICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKG93bmVyRG9jdW1lbnQsIGV2ZW50c0Zvci5tb3VzZS5zdG9wLCB0aGlzLmhhbmRsZURyYWdTdG9wKTtcbiAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KShvd25lckRvY3VtZW50LCBldmVudHNGb3IudG91Y2guc3RvcCwgdGhpcy5oYW5kbGVEcmFnU3RvcCk7XG4gICAgICAoMCwgX2RvbUZucy5yZW1vdmVFdmVudCkodGhpc05vZGUsIGV2ZW50c0Zvci50b3VjaC5zdGFydCwgdGhpcy5vblRvdWNoU3RhcnQsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMucHJvcHMuZW5hYmxlVXNlclNlbGVjdEhhY2spICgwLCBfZG9tRm5zLnJlbW92ZVVzZXJTZWxlY3RTdHlsZXMpKG93bmVyRG9jdW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlYWN0IFN0cmljdCBNb2RlIGNvbXBhdGliaWxpdHk6IGlmIGBub2RlUmVmYCBpcyBwYXNzZWQsIHdlIHdpbGwgdXNlIGl0IGluc3RlYWQgb2YgdHJ5aW5nIHRvIGZpbmRcbiAgLy8gdGhlIHVuZGVybHlpbmcgRE9NIG5vZGUgb3Vyc2VsdmVzLiBTZWUgdGhlIFJFQURNRSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgZmluZERPTU5vZGUoKSAvKjogP0hUTUxFbGVtZW50Ki97XG4gICAgdmFyIF90aGlzJHByb3BzLCBfdGhpcyRwcm9wczI7XG4gICAgcmV0dXJuIChfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMpICE9PSBudWxsICYmIF90aGlzJHByb3BzICE9PSB2b2lkIDAgJiYgX3RoaXMkcHJvcHMubm9kZVJlZiA/IChfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzKSA9PT0gbnVsbCB8fCBfdGhpcyRwcm9wczIgPT09IHZvaWQgMCB8fCAoX3RoaXMkcHJvcHMyID0gX3RoaXMkcHJvcHMyLm5vZGVSZWYpID09PSBudWxsIHx8IF90aGlzJHByb3BzMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcHJvcHMyLmN1cnJlbnQgOiBfcmVhY3REb20uZGVmYXVsdC5maW5kRE9NTm9kZSh0aGlzKTtcbiAgfVxuICByZW5kZXIoKSAvKjogUmVhY3QuRWxlbWVudDxhbnk+Ki97XG4gICAgLy8gUmV1c2UgdGhlIGNoaWxkIHByb3ZpZGVkXG4gICAgLy8gVGhpcyBtYWtlcyBpdCBmbGV4aWJsZSB0byB1c2Ugd2hhdGV2ZXIgZWxlbWVudCBpcyB3YW50ZWQgKGRpdiwgdWwsIGV0YylcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChSZWFjdC5DaGlsZHJlbi5vbmx5KHRoaXMucHJvcHMuY2hpbGRyZW4pLCB7XG4gICAgICAvLyBOb3RlOiBtb3VzZU1vdmUgaGFuZGxlciBpcyBhdHRhY2hlZCB0byBkb2N1bWVudCBzbyBpdCB3aWxsIHN0aWxsIGZ1bmN0aW9uXG4gICAgICAvLyB3aGVuIHRoZSB1c2VyIGRyYWdzIHF1aWNrbHkgYW5kIGxlYXZlcyB0aGUgYm91bmRzIG9mIHRoZSBlbGVtZW50LlxuICAgICAgb25Nb3VzZURvd246IHRoaXMub25Nb3VzZURvd24sXG4gICAgICBvbk1vdXNlVXA6IHRoaXMub25Nb3VzZVVwLFxuICAgICAgLy8gb25Ub3VjaFN0YXJ0IGlzIGFkZGVkIG9uIGBjb21wb25lbnREaWRNb3VudGAgc28gdGhleSBjYW4gYmUgYWRkZWQgd2l0aFxuICAgICAgLy8ge3Bhc3NpdmU6IGZhbHNlfSwgd2hpY2ggYWxsb3dzIGl0IHRvIGNhbmNlbC4gU2VlXG4gICAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE3LzAxL3Njcm9sbGluZy1pbnRlcnZlbnRpb25cbiAgICAgIG9uVG91Y2hFbmQ6IHRoaXMub25Ub3VjaEVuZFxuICAgIH0pO1xuICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBEcmFnZ2FibGVDb3JlO1xuX2RlZmluZVByb3BlcnR5KERyYWdnYWJsZUNvcmUsIFwiZGlzcGxheU5hbWVcIiwgJ0RyYWdnYWJsZUNvcmUnKTtcbl9kZWZpbmVQcm9wZXJ0eShEcmFnZ2FibGVDb3JlLCBcInByb3BUeXBlc1wiLCB7XG4gIC8qKlxuICAgKiBgYWxsb3dBbnlDbGlja2AgYWxsb3dzIGRyYWdnaW5nIHVzaW5nIGFueSBtb3VzZSBidXR0b24uXG4gICAqIEJ5IGRlZmF1bHQsIHdlIG9ubHkgYWNjZXB0IHRoZSBsZWZ0IGJ1dHRvbi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGFsbG93QW55Q2xpY2s6IF9wcm9wVHlwZXMuZGVmYXVsdC5ib29sLFxuICBjaGlsZHJlbjogX3Byb3BUeXBlcy5kZWZhdWx0Lm5vZGUuaXNSZXF1aXJlZCxcbiAgLyoqXG4gICAqIGBkaXNhYmxlZGAsIGlmIHRydWUsIHN0b3BzIHRoZSA8RHJhZ2dhYmxlPiBmcm9tIGRyYWdnaW5nLiBBbGwgaGFuZGxlcnMsXG4gICAqIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgb25Nb3VzZURvd25gLCB3aWxsIG5vdCBmaXJlLlxuICAgKi9cbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5ib29sLFxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgd2UgYWRkICd1c2VyLXNlbGVjdDpub25lJyBhdHRyaWJ1dGVzIHRvIHRoZSBkb2N1bWVudCBib2R5XG4gICAqIHRvIHByZXZlbnQgdWdseSB0ZXh0IHNlbGVjdGlvbiBkdXJpbmcgZHJhZy4gSWYgdGhpcyBpcyBjYXVzaW5nIHByb2JsZW1zXG4gICAqIGZvciB5b3VyIGFwcCwgc2V0IHRoaXMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGVuYWJsZVVzZXJTZWxlY3RIYWNrOiBfcHJvcFR5cGVzLmRlZmF1bHQuYm9vbCxcbiAgLyoqXG4gICAqIGBvZmZzZXRQYXJlbnRgLCBpZiBzZXQsIHVzZXMgdGhlIHBhc3NlZCBET00gbm9kZSB0byBjb21wdXRlIGRyYWcgb2Zmc2V0c1xuICAgKiBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBwYXJlbnQgbm9kZS5cbiAgICovXG4gIG9mZnNldFBhcmVudDogZnVuY3Rpb24gKHByb3BzIC8qOiBEcmFnZ2FibGVDb3JlUHJvcHMqLywgcHJvcE5hbWUgLyo6ICRLZXlzPERyYWdnYWJsZUNvcmVQcm9wcz4qLykge1xuICAgIGlmIChwcm9wc1twcm9wTmFtZV0gJiYgcHJvcHNbcHJvcE5hbWVdLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyYWdnYWJsZVxcJ3Mgb2Zmc2V0UGFyZW50IG11c3QgYmUgYSBET00gTm9kZS4nKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBgZ3JpZGAgc3BlY2lmaWVzIHRoZSB4IGFuZCB5IHRoYXQgZHJhZ2dpbmcgc2hvdWxkIHNuYXAgdG8uXG4gICAqL1xuICBncmlkOiBfcHJvcFR5cGVzLmRlZmF1bHQuYXJyYXlPZihfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyKSxcbiAgLyoqXG4gICAqIGBoYW5kbGVgIHNwZWNpZmllcyBhIHNlbGVjdG9yIHRvIGJlIHVzZWQgYXMgdGhlIGhhbmRsZSB0aGF0IGluaXRpYXRlcyBkcmFnLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogICBsZXQgQXBwID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICogICAgICAgICByZXR1cm4gKFxuICAgKiAgICAgICAgICAgIDxEcmFnZ2FibGUgaGFuZGxlPVwiLmhhbmRsZVwiPlxuICAgKiAgICAgICAgICAgICAgPGRpdj5cbiAgICogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImhhbmRsZVwiPkNsaWNrIG1lIHRvIGRyYWc8L2Rpdj5cbiAgICogICAgICAgICAgICAgICAgICA8ZGl2PlRoaXMgaXMgc29tZSBvdGhlciBjb250ZW50PC9kaXY+XG4gICAqICAgICAgICAgICAgICA8L2Rpdj5cbiAgICogICAgICAgICAgIDwvRHJhZ2dhYmxlPlxuICAgKiAgICAgICAgICk7XG4gICAqICAgICAgIH1cbiAgICogICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBoYW5kbGU6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIC8qKlxuICAgKiBgY2FuY2VsYCBzcGVjaWZpZXMgYSBzZWxlY3RvciB0byBiZSB1c2VkIHRvIHByZXZlbnQgZHJhZyBpbml0aWFsaXphdGlvbi5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganN4XG4gICAqICAgbGV0IEFwcCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgICAgcmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAqICAgICAgICAgICByZXR1cm4oXG4gICAqICAgICAgICAgICAgICAgPERyYWdnYWJsZSBjYW5jZWw9XCIuY2FuY2VsXCI+XG4gICAqICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAqICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjYW5jZWxcIj5Zb3UgY2FuJ3QgZHJhZyBmcm9tIGhlcmU8L2Rpdj5cbiAgICogICAgICAgICAgICAgICAgICAgICA8ZGl2PkRyYWdnaW5nIGhlcmUgd29ya3MgZmluZTwvZGl2PlxuICAgKiAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICogICAgICAgICAgICAgICA8L0RyYWdnYWJsZT5cbiAgICogICAgICAgICAgICk7XG4gICAqICAgICAgIH1cbiAgICogICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBjYW5jZWw6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIC8qIElmIHJ1bm5pbmcgaW4gUmVhY3QgU3RyaWN0IG1vZGUsIFJlYWN0RE9NLmZpbmRET01Ob2RlKCkgaXMgZGVwcmVjYXRlZC5cbiAgICogVW5mb3J0dW5hdGVseSwgaW4gb3JkZXIgZm9yIDxEcmFnZ2FibGU+IHRvIHdvcmsgcHJvcGVybHksIHdlIG5lZWQgcmF3IGFjY2Vzc1xuICAgKiB0byB0aGUgdW5kZXJseWluZyBET00gbm9kZS4gSWYgeW91IHdhbnQgdG8gYXZvaWQgdGhlIHdhcm5pbmcsIHBhc3MgYSBgbm9kZVJlZmBcbiAgICogYXMgaW4gdGhpcyBleGFtcGxlOlxuICAgKlxuICAgKiBmdW5jdGlvbiBNeUNvbXBvbmVudCgpIHtcbiAgICogICBjb25zdCBub2RlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgKiAgIHJldHVybiAoXG4gICAqICAgICA8RHJhZ2dhYmxlIG5vZGVSZWY9e25vZGVSZWZ9PlxuICAgKiAgICAgICA8ZGl2IHJlZj17bm9kZVJlZn0+RXhhbXBsZSBUYXJnZXQ8L2Rpdj5cbiAgICogICAgIDwvRHJhZ2dhYmxlPlxuICAgKiAgICk7XG4gICAqIH1cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgYXJiaXRyYXJpbHkgbmVzdGVkIGNvbXBvbmVudHMsIHNvIGxvbmcgYXMgdGhlIHJlZiBlbmRzIHVwXG4gICAqIHBvaW50aW5nIHRvIHRoZSBhY3R1YWwgY2hpbGQgRE9NIG5vZGUgYW5kIG5vdCBhIGN1c3RvbSBjb21wb25lbnQuXG4gICAqL1xuICBub2RlUmVmOiBfcHJvcFR5cGVzLmRlZmF1bHQub2JqZWN0LFxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gZHJhZ2dpbmcgc3RhcnRzLlxuICAgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJvb2xlYW4gZmFsc2UsIGRyYWdnaW5nIHdpbGwgYmUgY2FuY2VsZWQuXG4gICAqL1xuICBvblN0YXJ0OiBfcHJvcFR5cGVzLmRlZmF1bHQuZnVuYyxcbiAgLyoqXG4gICAqIENhbGxlZCB3aGlsZSBkcmFnZ2luZy5cbiAgICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBib29sZWFuIGZhbHNlLCBkcmFnZ2luZyB3aWxsIGJlIGNhbmNlbGVkLlxuICAgKi9cbiAgb25EcmFnOiBfcHJvcFR5cGVzLmRlZmF1bHQuZnVuYyxcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGRyYWdnaW5nIHN0b3BzLlxuICAgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJvb2xlYW4gZmFsc2UsIHRoZSBkcmFnIHdpbGwgcmVtYWluIGFjdGl2ZS5cbiAgICovXG4gIG9uU3RvcDogX3Byb3BUeXBlcy5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBBIHdvcmthcm91bmQgb3B0aW9uIHdoaWNoIGNhbiBiZSBwYXNzZWQgaWYgb25Nb3VzZURvd24gbmVlZHMgdG8gYmUgYWNjZXNzZWQsXG4gICAqIHNpbmNlIGl0J2xsIGFsd2F5cyBiZSBibG9ja2VkIChhcyB0aGVyZSBpcyBpbnRlcm5hbCB1c2Ugb2Ygb25Nb3VzZURvd24pXG4gICAqL1xuICBvbk1vdXNlRG93bjogX3Byb3BUeXBlcy5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBgc2NhbGVgLCBpZiBzZXQsIGFwcGxpZXMgc2NhbGluZyB3aGlsZSBkcmFnZ2luZyBhbiBlbGVtZW50XG4gICAqL1xuICBzY2FsZTogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlcixcbiAgLyoqXG4gICAqIFRoZXNlIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlZmluZWQgb24gdGhlIGNoaWxkLCBub3QgaGVyZS5cbiAgICovXG4gIGNsYXNzTmFtZTogX3NoaW1zLmRvbnRTZXRNZSxcbiAgc3R5bGU6IF9zaGltcy5kb250U2V0TWUsXG4gIHRyYW5zZm9ybTogX3NoaW1zLmRvbnRTZXRNZVxufSk7XG5fZGVmaW5lUHJvcGVydHkoRHJhZ2dhYmxlQ29yZSwgXCJkZWZhdWx0UHJvcHNcIiwge1xuICBhbGxvd0FueUNsaWNrOiBmYWxzZSxcbiAgLy8gYnkgZGVmYXVsdCBvbmx5IGFjY2VwdCBsZWZ0IGNsaWNrXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgZW5hYmxlVXNlclNlbGVjdEhhY2s6IHRydWUsXG4gIG9uU3RhcnQ6IGZ1bmN0aW9uICgpIHt9LFxuICBvbkRyYWc6IGZ1bmN0aW9uICgpIHt9LFxuICBvblN0b3A6IGZ1bmN0aW9uICgpIHt9LFxuICBvbk1vdXNlRG93bjogZnVuY3Rpb24gKCkge30sXG4gIHNjYWxlOiAxXG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuY29uc3Qge1xuICBkZWZhdWx0OiBEcmFnZ2FibGUsXG4gIERyYWdnYWJsZUNvcmVcbn0gPSByZXF1aXJlKCcuL0RyYWdnYWJsZScpO1xuXG4vLyBQcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGxpYiBleHBvcnRlZCA8RHJhZ2dhYmxlPiBhcyB0aGUgcm9vdCBleHBvcnQuIEFzIHRvIG5vLS8vIHRoZW0sIG9yIFR5cGVTY3JpcHQsIHdlIGV4cG9ydCAqYm90aCogYXMgdGhlIHJvb3QgYW5kIGFzICdkZWZhdWx0Jy5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbXphYnJpc2tpZS9yZWFjdC1kcmFnZ2FibGUvcHVsbC8yNTRcbi8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vbXphYnJpc2tpZS9yZWFjdC1kcmFnZ2FibGUvaXNzdWVzLzI2NlxubW9kdWxlLmV4cG9ydHMgPSBEcmFnZ2FibGU7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gRHJhZ2dhYmxlO1xubW9kdWxlLmV4cG9ydHMuRHJhZ2dhYmxlQ29yZSA9IERyYWdnYWJsZUNvcmU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmFkZENsYXNzTmFtZSA9IGFkZENsYXNzTmFtZTtcbmV4cG9ydHMuYWRkRXZlbnQgPSBhZGRFdmVudDtcbmV4cG9ydHMuYWRkVXNlclNlbGVjdFN0eWxlcyA9IGFkZFVzZXJTZWxlY3RTdHlsZXM7XG5leHBvcnRzLmNyZWF0ZUNTU1RyYW5zZm9ybSA9IGNyZWF0ZUNTU1RyYW5zZm9ybTtcbmV4cG9ydHMuY3JlYXRlU1ZHVHJhbnNmb3JtID0gY3JlYXRlU1ZHVHJhbnNmb3JtO1xuZXhwb3J0cy5nZXRUb3VjaCA9IGdldFRvdWNoO1xuZXhwb3J0cy5nZXRUb3VjaElkZW50aWZpZXIgPSBnZXRUb3VjaElkZW50aWZpZXI7XG5leHBvcnRzLmdldFRyYW5zbGF0aW9uID0gZ2V0VHJhbnNsYXRpb247XG5leHBvcnRzLmlubmVySGVpZ2h0ID0gaW5uZXJIZWlnaHQ7XG5leHBvcnRzLmlubmVyV2lkdGggPSBpbm5lcldpZHRoO1xuZXhwb3J0cy5tYXRjaGVzU2VsZWN0b3IgPSBtYXRjaGVzU2VsZWN0b3I7XG5leHBvcnRzLm1hdGNoZXNTZWxlY3RvckFuZFBhcmVudHNUbyA9IG1hdGNoZXNTZWxlY3RvckFuZFBhcmVudHNUbztcbmV4cG9ydHMub2Zmc2V0WFlGcm9tUGFyZW50ID0gb2Zmc2V0WFlGcm9tUGFyZW50O1xuZXhwb3J0cy5vdXRlckhlaWdodCA9IG91dGVySGVpZ2h0O1xuZXhwb3J0cy5vdXRlcldpZHRoID0gb3V0ZXJXaWR0aDtcbmV4cG9ydHMucmVtb3ZlQ2xhc3NOYW1lID0gcmVtb3ZlQ2xhc3NOYW1lO1xuZXhwb3J0cy5yZW1vdmVFdmVudCA9IHJlbW92ZUV2ZW50O1xuZXhwb3J0cy5yZW1vdmVVc2VyU2VsZWN0U3R5bGVzID0gcmVtb3ZlVXNlclNlbGVjdFN0eWxlcztcbnZhciBfc2hpbXMgPSByZXF1aXJlKFwiLi9zaGltc1wiKTtcbnZhciBfZ2V0UHJlZml4ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vZ2V0UHJlZml4XCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaiwgbm9kZUludGVyb3ApIHsgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuLyo6OiBpbXBvcnQgdHlwZSB7Q29udHJvbFBvc2l0aW9uLCBQb3NpdGlvbk9mZnNldENvbnRyb2xQb3NpdGlvbiwgTW91c2VUb3VjaEV2ZW50fSBmcm9tICcuL3R5cGVzJzsqL1xubGV0IG1hdGNoZXNTZWxlY3RvckZ1bmMgPSAnJztcbmZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcihlbCAvKjogTm9kZSovLCBzZWxlY3RvciAvKjogc3RyaW5nKi8pIC8qOiBib29sZWFuKi97XG4gIGlmICghbWF0Y2hlc1NlbGVjdG9yRnVuYykge1xuICAgIG1hdGNoZXNTZWxlY3RvckZ1bmMgPSAoMCwgX3NoaW1zLmZpbmRJbkFycmF5KShbJ21hdGNoZXMnLCAnd2Via2l0TWF0Y2hlc1NlbGVjdG9yJywgJ21vek1hdGNoZXNTZWxlY3RvcicsICdtc01hdGNoZXNTZWxlY3RvcicsICdvTWF0Y2hlc1NlbGVjdG9yJ10sIGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgIC8vICRGbG93SWdub3JlOiBEb2Vzbid0IHRoaW5rIGVsZW1lbnRzIGFyZSBpbmRleGFibGVcbiAgICAgIHJldHVybiAoMCwgX3NoaW1zLmlzRnVuY3Rpb24pKGVsW21ldGhvZF0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gTWlnaHQgbm90IGJlIGZvdW5kIGVudGlyZWx5IChub3QgYW4gRWxlbWVudD8pIC0gaW4gdGhhdCBjYXNlLCBiYWlsXG4gIC8vICRGbG93SWdub3JlOiBEb2Vzbid0IHRoaW5rIGVsZW1lbnRzIGFyZSBpbmRleGFibGVcbiAgaWYgKCEoMCwgX3NoaW1zLmlzRnVuY3Rpb24pKGVsW21hdGNoZXNTZWxlY3RvckZ1bmNdKSkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vICRGbG93SWdub3JlOiBEb2Vzbid0IHRoaW5rIGVsZW1lbnRzIGFyZSBpbmRleGFibGVcbiAgcmV0dXJuIGVsW21hdGNoZXNTZWxlY3RvckZ1bmNdKHNlbGVjdG9yKTtcbn1cblxuLy8gV29ya3MgdXAgdGhlIHRyZWUgdG8gdGhlIGRyYWdnYWJsZSBpdHNlbGYgYXR0ZW1wdGluZyB0byBtYXRjaCBzZWxlY3Rvci5cbmZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvckFuZFBhcmVudHNUbyhlbCAvKjogTm9kZSovLCBzZWxlY3RvciAvKjogc3RyaW5nKi8sIGJhc2VOb2RlIC8qOiBOb2RlKi8pIC8qOiBib29sZWFuKi97XG4gIGxldCBub2RlID0gZWw7XG4gIGRvIHtcbiAgICBpZiAobWF0Y2hlc1NlbGVjdG9yKG5vZGUsIHNlbGVjdG9yKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKG5vZGUgPT09IGJhc2VOb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gJEZsb3dJZ25vcmVbaW5jb21wYXRpYmxlLXR5cGVdXG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfSB3aGlsZSAobm9kZSk7XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50KGVsIC8qOiA/Tm9kZSovLCBldmVudCAvKjogc3RyaW5nKi8sIGhhbmRsZXIgLyo6IEZ1bmN0aW9uKi8sIGlucHV0T3B0aW9ucyAvKjogT2JqZWN0Ki8pIC8qOiB2b2lkKi97XG4gIGlmICghZWwpIHJldHVybjtcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIC4uLmlucHV0T3B0aW9uc1xuICB9O1xuICAvLyAkRmxvd0lnbm9yZVttZXRob2QtdW5iaW5kaW5nXVxuICBpZiAoZWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKGVsLmF0dGFjaEV2ZW50KSB7XG4gICAgZWwuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBoYW5kbGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyAkRmxvd0lnbm9yZTogRG9lc24ndCB0aGluayBlbGVtZW50cyBhcmUgaW5kZXhhYmxlXG4gICAgZWxbJ29uJyArIGV2ZW50XSA9IGhhbmRsZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50KGVsIC8qOiA/Tm9kZSovLCBldmVudCAvKjogc3RyaW5nKi8sIGhhbmRsZXIgLyo6IEZ1bmN0aW9uKi8sIGlucHV0T3B0aW9ucyAvKjogT2JqZWN0Ki8pIC8qOiB2b2lkKi97XG4gIGlmICghZWwpIHJldHVybjtcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIC4uLmlucHV0T3B0aW9uc1xuICB9O1xuICAvLyAkRmxvd0lnbm9yZVttZXRob2QtdW5iaW5kaW5nXVxuICBpZiAoZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKGVsLmRldGFjaEV2ZW50KSB7XG4gICAgZWwuZGV0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBoYW5kbGVyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyAkRmxvd0lnbm9yZTogRG9lc24ndCB0aGluayBlbGVtZW50cyBhcmUgaW5kZXhhYmxlXG4gICAgZWxbJ29uJyArIGV2ZW50XSA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIG91dGVySGVpZ2h0KG5vZGUgLyo6IEhUTUxFbGVtZW50Ki8pIC8qOiBudW1iZXIqL3tcbiAgLy8gVGhpcyBpcyBkZWxpYmVyYXRlbHkgZXhjbHVkaW5nIG1hcmdpbiBmb3Igb3VyIGNhbGN1bGF0aW9ucywgc2luY2Ugd2UgYXJlIHVzaW5nXG4gIC8vIG9mZnNldFRvcCB3aGljaCBpcyBpbmNsdWRpbmcgbWFyZ2luLiBTZWUgZ2V0Qm91bmRQb3NpdGlvblxuICBsZXQgaGVpZ2h0ID0gbm9kZS5jbGllbnRIZWlnaHQ7XG4gIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgaGVpZ2h0ICs9ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoKTtcbiAgaGVpZ2h0ICs9ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLmJvcmRlckJvdHRvbVdpZHRoKTtcbiAgcmV0dXJuIGhlaWdodDtcbn1cbmZ1bmN0aW9uIG91dGVyV2lkdGgobm9kZSAvKjogSFRNTEVsZW1lbnQqLykgLyo6IG51bWJlciove1xuICAvLyBUaGlzIGlzIGRlbGliZXJhdGVseSBleGNsdWRpbmcgbWFyZ2luIGZvciBvdXIgY2FsY3VsYXRpb25zLCBzaW5jZSB3ZSBhcmUgdXNpbmdcbiAgLy8gb2Zmc2V0TGVmdCB3aGljaCBpcyBpbmNsdWRpbmcgbWFyZ2luLiBTZWUgZ2V0Qm91bmRQb3NpdGlvblxuICBsZXQgd2lkdGggPSBub2RlLmNsaWVudFdpZHRoO1xuICBjb25zdCBjb21wdXRlZFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gIHdpZHRoICs9ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLmJvcmRlckxlZnRXaWR0aCk7XG4gIHdpZHRoICs9ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLmJvcmRlclJpZ2h0V2lkdGgpO1xuICByZXR1cm4gd2lkdGg7XG59XG5mdW5jdGlvbiBpbm5lckhlaWdodChub2RlIC8qOiBIVE1MRWxlbWVudCovKSAvKjogbnVtYmVyKi97XG4gIGxldCBoZWlnaHQgPSBub2RlLmNsaWVudEhlaWdodDtcbiAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICBoZWlnaHQgLT0gKDAsIF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCk7XG4gIGhlaWdodCAtPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tKTtcbiAgcmV0dXJuIGhlaWdodDtcbn1cbmZ1bmN0aW9uIGlubmVyV2lkdGgobm9kZSAvKjogSFRNTEVsZW1lbnQqLykgLyo6IG51bWJlciove1xuICBsZXQgd2lkdGggPSBub2RlLmNsaWVudFdpZHRoO1xuICBjb25zdCBjb21wdXRlZFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gIHdpZHRoIC09ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLnBhZGRpbmdMZWZ0KTtcbiAgd2lkdGggLT0gKDAsIF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUucGFkZGluZ1JpZ2h0KTtcbiAgcmV0dXJuIHdpZHRoO1xufVxuLyo6OiBpbnRlcmZhY2UgRXZlbnRXaXRoT2Zmc2V0IHtcbiAgY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXJcbn0qL1xuLy8gR2V0IGZyb20gb2Zmc2V0UGFyZW50XG5mdW5jdGlvbiBvZmZzZXRYWUZyb21QYXJlbnQoZXZ0IC8qOiBFdmVudFdpdGhPZmZzZXQqLywgb2Zmc2V0UGFyZW50IC8qOiBIVE1MRWxlbWVudCovLCBzY2FsZSAvKjogbnVtYmVyKi8pIC8qOiBDb250cm9sUG9zaXRpb24qL3tcbiAgY29uc3QgaXNCb2R5ID0gb2Zmc2V0UGFyZW50ID09PSBvZmZzZXRQYXJlbnQub3duZXJEb2N1bWVudC5ib2R5O1xuICBjb25zdCBvZmZzZXRQYXJlbnRSZWN0ID0gaXNCb2R5ID8ge1xuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiAwXG4gIH0gOiBvZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHggPSAoZXZ0LmNsaWVudFggKyBvZmZzZXRQYXJlbnQuc2Nyb2xsTGVmdCAtIG9mZnNldFBhcmVudFJlY3QubGVmdCkgLyBzY2FsZTtcbiAgY29uc3QgeSA9IChldnQuY2xpZW50WSArIG9mZnNldFBhcmVudC5zY3JvbGxUb3AgLSBvZmZzZXRQYXJlbnRSZWN0LnRvcCkgLyBzY2FsZTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHlcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNTU1RyYW5zZm9ybShjb250cm9sUG9zIC8qOiBDb250cm9sUG9zaXRpb24qLywgcG9zaXRpb25PZmZzZXQgLyo6IFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uKi8pIC8qOiBPYmplY3QqL3tcbiAgY29uc3QgdHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbihjb250cm9sUG9zLCBwb3NpdGlvbk9mZnNldCwgJ3B4Jyk7XG4gIHJldHVybiB7XG4gICAgWygwLCBfZ2V0UHJlZml4LmJyb3dzZXJQcmVmaXhUb0tleSkoJ3RyYW5zZm9ybScsIF9nZXRQcmVmaXguZGVmYXVsdCldOiB0cmFuc2xhdGlvblxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlU1ZHVHJhbnNmb3JtKGNvbnRyb2xQb3MgLyo6IENvbnRyb2xQb3NpdGlvbiovLCBwb3NpdGlvbk9mZnNldCAvKjogUG9zaXRpb25PZmZzZXRDb250cm9sUG9zaXRpb24qLykgLyo6IHN0cmluZyove1xuICBjb25zdCB0cmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uKGNvbnRyb2xQb3MsIHBvc2l0aW9uT2Zmc2V0LCAnJyk7XG4gIHJldHVybiB0cmFuc2xhdGlvbjtcbn1cbmZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uKF9yZWYgLyo6OiAqLywgcG9zaXRpb25PZmZzZXQgLyo6IFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uKi8sIHVuaXRTdWZmaXggLyo6IHN0cmluZyovKSAvKjogc3RyaW5nKi97XG4gIGxldCB7XG4gICAgeCxcbiAgICB5XG4gIH0gLyo6IENvbnRyb2xQb3NpdGlvbiovID0gX3JlZiAvKjogQ29udHJvbFBvc2l0aW9uKi87XG4gIGxldCB0cmFuc2xhdGlvbiA9IFwidHJhbnNsYXRlKFwiLmNvbmNhdCh4KS5jb25jYXQodW5pdFN1ZmZpeCwgXCIsXCIpLmNvbmNhdCh5KS5jb25jYXQodW5pdFN1ZmZpeCwgXCIpXCIpO1xuICBpZiAocG9zaXRpb25PZmZzZXQpIHtcbiAgICBjb25zdCBkZWZhdWx0WCA9IFwiXCIuY29uY2F0KHR5cGVvZiBwb3NpdGlvbk9mZnNldC54ID09PSAnc3RyaW5nJyA/IHBvc2l0aW9uT2Zmc2V0LnggOiBwb3NpdGlvbk9mZnNldC54ICsgdW5pdFN1ZmZpeCk7XG4gICAgY29uc3QgZGVmYXVsdFkgPSBcIlwiLmNvbmNhdCh0eXBlb2YgcG9zaXRpb25PZmZzZXQueSA9PT0gJ3N0cmluZycgPyBwb3NpdGlvbk9mZnNldC55IDogcG9zaXRpb25PZmZzZXQueSArIHVuaXRTdWZmaXgpO1xuICAgIHRyYW5zbGF0aW9uID0gXCJ0cmFuc2xhdGUoXCIuY29uY2F0KGRlZmF1bHRYLCBcIiwgXCIpLmNvbmNhdChkZWZhdWx0WSwgXCIpXCIpICsgdHJhbnNsYXRpb247XG4gIH1cbiAgcmV0dXJuIHRyYW5zbGF0aW9uO1xufVxuZnVuY3Rpb24gZ2V0VG91Y2goZSAvKjogTW91c2VUb3VjaEV2ZW50Ki8sIGlkZW50aWZpZXIgLyo6IG51bWJlciovKSAvKjogP3tjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlcn0qL3tcbiAgcmV0dXJuIGUudGFyZ2V0VG91Y2hlcyAmJiAoMCwgX3NoaW1zLmZpbmRJbkFycmF5KShlLnRhcmdldFRvdWNoZXMsIHQgPT4gaWRlbnRpZmllciA9PT0gdC5pZGVudGlmaWVyKSB8fCBlLmNoYW5nZWRUb3VjaGVzICYmICgwLCBfc2hpbXMuZmluZEluQXJyYXkpKGUuY2hhbmdlZFRvdWNoZXMsIHQgPT4gaWRlbnRpZmllciA9PT0gdC5pZGVudGlmaWVyKTtcbn1cbmZ1bmN0aW9uIGdldFRvdWNoSWRlbnRpZmllcihlIC8qOiBNb3VzZVRvdWNoRXZlbnQqLykgLyo6ID9udW1iZXIqL3tcbiAgaWYgKGUudGFyZ2V0VG91Y2hlcyAmJiBlLnRhcmdldFRvdWNoZXNbMF0pIHJldHVybiBlLnRhcmdldFRvdWNoZXNbMF0uaWRlbnRpZmllcjtcbiAgaWYgKGUuY2hhbmdlZFRvdWNoZXMgJiYgZS5jaGFuZ2VkVG91Y2hlc1swXSkgcmV0dXJuIGUuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcjtcbn1cblxuLy8gVXNlci1zZWxlY3QgSGFja3M6XG4vL1xuLy8gVXNlZnVsIGZvciBwcmV2ZW50aW5nIGJsdWUgaGlnaGxpZ2h0cyBhbGwgb3ZlciBldmVyeXRoaW5nIHdoZW4gZHJhZ2dpbmcuXG5cbi8vIE5vdGUgd2UncmUgcGFzc2luZyBgZG9jdW1lbnRgIGIvYyB3ZSBjb3VsZCBiZSBpZnJhbWVkXG5mdW5jdGlvbiBhZGRVc2VyU2VsZWN0U3R5bGVzKGRvYyAvKjogP0RvY3VtZW50Ki8pIHtcbiAgaWYgKCFkb2MpIHJldHVybjtcbiAgbGV0IHN0eWxlRWwgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoJ3JlYWN0LWRyYWdnYWJsZS1zdHlsZS1lbCcpO1xuICBpZiAoIXN0eWxlRWwpIHtcbiAgICBzdHlsZUVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbC50eXBlID0gJ3RleHQvY3NzJztcbiAgICBzdHlsZUVsLmlkID0gJ3JlYWN0LWRyYWdnYWJsZS1zdHlsZS1lbCc7XG4gICAgc3R5bGVFbC5pbm5lckhUTUwgPSAnLnJlYWN0LWRyYWdnYWJsZS10cmFuc3BhcmVudC1zZWxlY3Rpb24gKjo6LW1vei1zZWxlY3Rpb24ge2FsbDogaW5oZXJpdDt9XFxuJztcbiAgICBzdHlsZUVsLmlubmVySFRNTCArPSAnLnJlYWN0LWRyYWdnYWJsZS10cmFuc3BhcmVudC1zZWxlY3Rpb24gKjo6c2VsZWN0aW9uIHthbGw6IGluaGVyaXQ7fVxcbic7XG4gICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG4gIH1cbiAgaWYgKGRvYy5ib2R5KSBhZGRDbGFzc05hbWUoZG9jLmJvZHksICdyZWFjdC1kcmFnZ2FibGUtdHJhbnNwYXJlbnQtc2VsZWN0aW9uJyk7XG59XG5mdW5jdGlvbiByZW1vdmVVc2VyU2VsZWN0U3R5bGVzKGRvYyAvKjogP0RvY3VtZW50Ki8pIHtcbiAgaWYgKCFkb2MpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBpZiAoZG9jLmJvZHkpIHJlbW92ZUNsYXNzTmFtZShkb2MuYm9keSwgJ3JlYWN0LWRyYWdnYWJsZS10cmFuc3BhcmVudC1zZWxlY3Rpb24nKTtcbiAgICAvLyAkRmxvd0lnbm9yZTogSUVcbiAgICBpZiAoZG9jLnNlbGVjdGlvbikge1xuICAgICAgLy8gJEZsb3dJZ25vcmU6IElFXG4gICAgICBkb2Muc2VsZWN0aW9uLmVtcHR5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSBzZWxlY3Rpb24gY2F1c2VkIGJ5IHNjcm9sbCwgdW5sZXNzIGl0J3MgYSBmb2N1c2VkIGlucHV0XG4gICAgICAvLyAod2UgdXNlIGRvYy5kZWZhdWx0VmlldyBpbiBjYXNlIHdlJ3JlIGluIGFuIGlmcmFtZSlcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IChkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93KS5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnR5cGUgIT09ICdDYXJldCcpIHtcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIHByb2JhYmx5IElFXG4gIH1cbn1cbmZ1bmN0aW9uIGFkZENsYXNzTmFtZShlbCAvKjogSFRNTEVsZW1lbnQqLywgY2xhc3NOYW1lIC8qOiBzdHJpbmcqLykge1xuICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgZWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICB9IGVsc2Uge1xuICAgIGlmICghZWwuY2xhc3NOYW1lLm1hdGNoKG5ldyBSZWdFeHAoXCIoPzpefFxcXFxzKVwiLmNvbmNhdChjbGFzc05hbWUsIFwiKD8hXFxcXFMpXCIpKSkpIHtcbiAgICAgIGVsLmNsYXNzTmFtZSArPSBcIiBcIi5jb25jYXQoY2xhc3NOYW1lKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzTmFtZShlbCAvKjogSFRNTEVsZW1lbnQqLywgY2xhc3NOYW1lIC8qOiBzdHJpbmcqLykge1xuICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICB9IGVsc2Uge1xuICAgIGVsLmNsYXNzTmFtZSA9IGVsLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoPzpefFxcXFxzKVwiLmNvbmNhdChjbGFzc05hbWUsIFwiKD8hXFxcXFMpXCIpLCAnZycpLCAnJyk7XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuYnJvd3NlclByZWZpeFRvS2V5ID0gYnJvd3NlclByZWZpeFRvS2V5O1xuZXhwb3J0cy5icm93c2VyUHJlZml4VG9TdHlsZSA9IGJyb3dzZXJQcmVmaXhUb1N0eWxlO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuZXhwb3J0cy5nZXRQcmVmaXggPSBnZXRQcmVmaXg7XG5jb25zdCBwcmVmaXhlcyA9IFsnTW96JywgJ1dlYmtpdCcsICdPJywgJ21zJ107XG5mdW5jdGlvbiBnZXRQcmVmaXgoKSAvKjogc3RyaW5nKi97XG4gIHZhciBfd2luZG93JGRvY3VtZW50O1xuICBsZXQgcHJvcCAvKjogc3RyaW5nKi8gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICd0cmFuc2Zvcm0nO1xuICAvLyBFbnN1cmUgd2UncmUgcnVubmluZyBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSB0aGVyZSBpcyBhY3R1YWxseSBhIGdsb2JhbFxuICAvLyBgd2luZG93YCBvYmpcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gJyc7XG5cbiAgLy8gSWYgd2UncmUgaW4gYSBwc2V1ZG8tYnJvd3NlciBzZXJ2ZXItc2lkZSBlbnZpcm9ubWVudCwgdGhpcyBhY2Nlc3NcbiAgLy8gcGF0aCBtYXkgbm90IGV4aXN0LCBzbyBiYWlsIG91dCBpZiBpdCBkb2Vzbid0LlxuICBjb25zdCBzdHlsZSA9IChfd2luZG93JGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50KSA9PT0gbnVsbCB8fCBfd2luZG93JGRvY3VtZW50ID09PSB2b2lkIDAgfHwgKF93aW5kb3ckZG9jdW1lbnQgPSBfd2luZG93JGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgPT09IG51bGwgfHwgX3dpbmRvdyRkb2N1bWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdyRkb2N1bWVudC5zdHlsZTtcbiAgaWYgKCFzdHlsZSkgcmV0dXJuICcnO1xuICBpZiAocHJvcCBpbiBzdHlsZSkgcmV0dXJuICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGJyb3dzZXJQcmVmaXhUb0tleShwcm9wLCBwcmVmaXhlc1tpXSkgaW4gc3R5bGUpIHJldHVybiBwcmVmaXhlc1tpXTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5mdW5jdGlvbiBicm93c2VyUHJlZml4VG9LZXkocHJvcCAvKjogc3RyaW5nKi8sIHByZWZpeCAvKjogc3RyaW5nKi8pIC8qOiBzdHJpbmcqL3tcbiAgcmV0dXJuIHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCkuY29uY2F0KGtlYmFiVG9UaXRsZUNhc2UocHJvcCkpIDogcHJvcDtcbn1cbmZ1bmN0aW9uIGJyb3dzZXJQcmVmaXhUb1N0eWxlKHByb3AgLyo6IHN0cmluZyovLCBwcmVmaXggLyo6IHN0cmluZyovKSAvKjogc3RyaW5nKi97XG4gIHJldHVybiBwcmVmaXggPyBcIi1cIi5jb25jYXQocHJlZml4LnRvTG93ZXJDYXNlKCksIFwiLVwiKS5jb25jYXQocHJvcCkgOiBwcm9wO1xufVxuZnVuY3Rpb24ga2ViYWJUb1RpdGxlQ2FzZShzdHIgLyo6IHN0cmluZyovKSAvKjogc3RyaW5nKi97XG4gIGxldCBvdXQgPSAnJztcbiAgbGV0IHNob3VsZENhcGl0YWxpemUgPSB0cnVlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzaG91bGRDYXBpdGFsaXplKSB7XG4gICAgICBvdXQgKz0gc3RyW2ldLnRvVXBwZXJDYXNlKCk7XG4gICAgICBzaG91bGRDYXBpdGFsaXplID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICctJykge1xuICAgICAgc2hvdWxkQ2FwaXRhbGl6ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dCArPSBzdHJbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8vIERlZmF1bHQgZXhwb3J0IGlzIHRoZSBwcmVmaXggaXRzZWxmLCBsaWtlICdNb3onLCAnV2Via2l0JywgZXRjXG4vLyBOb3RlIHRoYXQgeW91IG1heSBoYXZlIHRvIHJlLXRlc3QgZm9yIGNlcnRhaW4gdGhpbmdzOyBmb3IgaW5zdGFuY2UsIENocm9tZSA1MFxuLy8gY2FuIGhhbmRsZSB1bnByZWZpeGVkIGB0cmFuc2Zvcm1gLCBidXQgbm90IHVucHJlZml4ZWQgYHVzZXItc2VsZWN0YFxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gKGdldFByZWZpeCgpIC8qOiBzdHJpbmcqLyk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBsb2c7XG4vKmVzbGludCBuby1jb25zb2xlOjAqL1xuZnVuY3Rpb24gbG9nKCkge1xuICBpZiAodW5kZWZpbmVkKSBjb25zb2xlLmxvZyguLi5hcmd1bWVudHMpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jYW5EcmFnWCA9IGNhbkRyYWdYO1xuZXhwb3J0cy5jYW5EcmFnWSA9IGNhbkRyYWdZO1xuZXhwb3J0cy5jcmVhdGVDb3JlRGF0YSA9IGNyZWF0ZUNvcmVEYXRhO1xuZXhwb3J0cy5jcmVhdGVEcmFnZ2FibGVEYXRhID0gY3JlYXRlRHJhZ2dhYmxlRGF0YTtcbmV4cG9ydHMuZ2V0Qm91bmRQb3NpdGlvbiA9IGdldEJvdW5kUG9zaXRpb247XG5leHBvcnRzLmdldENvbnRyb2xQb3NpdGlvbiA9IGdldENvbnRyb2xQb3NpdGlvbjtcbmV4cG9ydHMuc25hcFRvR3JpZCA9IHNuYXBUb0dyaWQ7XG52YXIgX3NoaW1zID0gcmVxdWlyZShcIi4vc2hpbXNcIik7XG52YXIgX2RvbUZucyA9IHJlcXVpcmUoXCIuL2RvbUZuc1wiKTtcbi8qOjogaW1wb3J0IHR5cGUgRHJhZ2dhYmxlIGZyb20gJy4uL0RyYWdnYWJsZSc7Ki9cbi8qOjogaW1wb3J0IHR5cGUge0JvdW5kcywgQ29udHJvbFBvc2l0aW9uLCBEcmFnZ2FibGVEYXRhLCBNb3VzZVRvdWNoRXZlbnR9IGZyb20gJy4vdHlwZXMnOyovXG4vKjo6IGltcG9ydCB0eXBlIERyYWdnYWJsZUNvcmUgZnJvbSAnLi4vRHJhZ2dhYmxlQ29yZSc7Ki9cbmZ1bmN0aW9uIGdldEJvdW5kUG9zaXRpb24oZHJhZ2dhYmxlIC8qOiBEcmFnZ2FibGUqLywgeCAvKjogbnVtYmVyKi8sIHkgLyo6IG51bWJlciovKSAvKjogW251bWJlciwgbnVtYmVyXSove1xuICAvLyBJZiBubyBib3VuZHMsIHNob3J0LWNpcmN1aXQgYW5kIG1vdmUgb25cbiAgaWYgKCFkcmFnZ2FibGUucHJvcHMuYm91bmRzKSByZXR1cm4gW3gsIHldO1xuXG4gIC8vIENsb25lIG5ldyBib3VuZHNcbiAgbGV0IHtcbiAgICBib3VuZHNcbiAgfSA9IGRyYWdnYWJsZS5wcm9wcztcbiAgYm91bmRzID0gdHlwZW9mIGJvdW5kcyA9PT0gJ3N0cmluZycgPyBib3VuZHMgOiBjbG9uZUJvdW5kcyhib3VuZHMpO1xuICBjb25zdCBub2RlID0gZmluZERPTU5vZGUoZHJhZ2dhYmxlKTtcbiAgaWYgKHR5cGVvZiBib3VuZHMgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3Qge1xuICAgICAgb3duZXJEb2N1bWVudFxuICAgIH0gPSBub2RlO1xuICAgIGNvbnN0IG93bmVyV2luZG93ID0gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICBsZXQgYm91bmROb2RlO1xuICAgIGlmIChib3VuZHMgPT09ICdwYXJlbnQnKSB7XG4gICAgICBib3VuZE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvdW5kTm9kZSA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3Rvcihib3VuZHMpO1xuICAgIH1cbiAgICBpZiAoIShib3VuZE5vZGUgaW5zdGFuY2VvZiBvd25lcldpbmRvdy5IVE1MRWxlbWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQm91bmRzIHNlbGVjdG9yIFwiJyArIGJvdW5kcyArICdcIiBjb3VsZCBub3QgZmluZCBhbiBlbGVtZW50LicpO1xuICAgIH1cbiAgICBjb25zdCBib3VuZE5vZGVFbCAvKjogSFRNTEVsZW1lbnQqLyA9IGJvdW5kTm9kZTsgLy8gZm9yIEZsb3csIGNhbid0IHNlZW0gdG8gcmVmaW5lIGNvcnJlY3RseVxuICAgIGNvbnN0IG5vZGVTdHlsZSA9IG93bmVyV2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgY29uc3QgYm91bmROb2RlU3R5bGUgPSBvd25lcldpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGJvdW5kTm9kZUVsKTtcbiAgICAvLyBDb21wdXRlIGJvdW5kcy4gVGhpcyBpcyBhIHBhaW4gd2l0aCBwYWRkaW5nIGFuZCBvZmZzZXRzIGJ1dCB0aGlzIGdldHMgaXQgZXhhY3RseSByaWdodC5cbiAgICBib3VuZHMgPSB7XG4gICAgICBsZWZ0OiAtbm9kZS5vZmZzZXRMZWZ0ICsgKDAsIF9zaGltcy5pbnQpKGJvdW5kTm9kZVN0eWxlLnBhZGRpbmdMZWZ0KSArICgwLCBfc2hpbXMuaW50KShub2RlU3R5bGUubWFyZ2luTGVmdCksXG4gICAgICB0b3A6IC1ub2RlLm9mZnNldFRvcCArICgwLCBfc2hpbXMuaW50KShib3VuZE5vZGVTdHlsZS5wYWRkaW5nVG9wKSArICgwLCBfc2hpbXMuaW50KShub2RlU3R5bGUubWFyZ2luVG9wKSxcbiAgICAgIHJpZ2h0OiAoMCwgX2RvbUZucy5pbm5lcldpZHRoKShib3VuZE5vZGVFbCkgLSAoMCwgX2RvbUZucy5vdXRlcldpZHRoKShub2RlKSAtIG5vZGUub2Zmc2V0TGVmdCArICgwLCBfc2hpbXMuaW50KShib3VuZE5vZGVTdHlsZS5wYWRkaW5nUmlnaHQpIC0gKDAsIF9zaGltcy5pbnQpKG5vZGVTdHlsZS5tYXJnaW5SaWdodCksXG4gICAgICBib3R0b206ICgwLCBfZG9tRm5zLmlubmVySGVpZ2h0KShib3VuZE5vZGVFbCkgLSAoMCwgX2RvbUZucy5vdXRlckhlaWdodCkobm9kZSkgLSBub2RlLm9mZnNldFRvcCArICgwLCBfc2hpbXMuaW50KShib3VuZE5vZGVTdHlsZS5wYWRkaW5nQm90dG9tKSAtICgwLCBfc2hpbXMuaW50KShub2RlU3R5bGUubWFyZ2luQm90dG9tKVxuICAgIH07XG4gIH1cblxuICAvLyBLZWVwIHggYW5kIHkgYmVsb3cgcmlnaHQgYW5kIGJvdHRvbSBsaW1pdHMuLi5cbiAgaWYgKCgwLCBfc2hpbXMuaXNOdW0pKGJvdW5kcy5yaWdodCkpIHggPSBNYXRoLm1pbih4LCBib3VuZHMucmlnaHQpO1xuICBpZiAoKDAsIF9zaGltcy5pc051bSkoYm91bmRzLmJvdHRvbSkpIHkgPSBNYXRoLm1pbih5LCBib3VuZHMuYm90dG9tKTtcblxuICAvLyBCdXQgYWJvdmUgbGVmdCBhbmQgdG9wIGxpbWl0cy5cbiAgaWYgKCgwLCBfc2hpbXMuaXNOdW0pKGJvdW5kcy5sZWZ0KSkgeCA9IE1hdGgubWF4KHgsIGJvdW5kcy5sZWZ0KTtcbiAgaWYgKCgwLCBfc2hpbXMuaXNOdW0pKGJvdW5kcy50b3ApKSB5ID0gTWF0aC5tYXgoeSwgYm91bmRzLnRvcCk7XG4gIHJldHVybiBbeCwgeV07XG59XG5mdW5jdGlvbiBzbmFwVG9HcmlkKGdyaWQgLyo6IFtudW1iZXIsIG51bWJlcl0qLywgcGVuZGluZ1ggLyo6IG51bWJlciovLCBwZW5kaW5nWSAvKjogbnVtYmVyKi8pIC8qOiBbbnVtYmVyLCBudW1iZXJdKi97XG4gIGNvbnN0IHggPSBNYXRoLnJvdW5kKHBlbmRpbmdYIC8gZ3JpZFswXSkgKiBncmlkWzBdO1xuICBjb25zdCB5ID0gTWF0aC5yb3VuZChwZW5kaW5nWSAvIGdyaWRbMV0pICogZ3JpZFsxXTtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cbmZ1bmN0aW9uIGNhbkRyYWdYKGRyYWdnYWJsZSAvKjogRHJhZ2dhYmxlKi8pIC8qOiBib29sZWFuKi97XG4gIHJldHVybiBkcmFnZ2FibGUucHJvcHMuYXhpcyA9PT0gJ2JvdGgnIHx8IGRyYWdnYWJsZS5wcm9wcy5heGlzID09PSAneCc7XG59XG5mdW5jdGlvbiBjYW5EcmFnWShkcmFnZ2FibGUgLyo6IERyYWdnYWJsZSovKSAvKjogYm9vbGVhbiove1xuICByZXR1cm4gZHJhZ2dhYmxlLnByb3BzLmF4aXMgPT09ICdib3RoJyB8fCBkcmFnZ2FibGUucHJvcHMuYXhpcyA9PT0gJ3knO1xufVxuXG4vLyBHZXQge3gsIHl9IHBvc2l0aW9ucyBmcm9tIGV2ZW50LlxuZnVuY3Rpb24gZ2V0Q29udHJvbFBvc2l0aW9uKGUgLyo6IE1vdXNlVG91Y2hFdmVudCovLCB0b3VjaElkZW50aWZpZXIgLyo6ID9udW1iZXIqLywgZHJhZ2dhYmxlQ29yZSAvKjogRHJhZ2dhYmxlQ29yZSovKSAvKjogP0NvbnRyb2xQb3NpdGlvbiove1xuICBjb25zdCB0b3VjaE9iaiA9IHR5cGVvZiB0b3VjaElkZW50aWZpZXIgPT09ICdudW1iZXInID8gKDAsIF9kb21GbnMuZ2V0VG91Y2gpKGUsIHRvdWNoSWRlbnRpZmllcikgOiBudWxsO1xuICBpZiAodHlwZW9mIHRvdWNoSWRlbnRpZmllciA9PT0gJ251bWJlcicgJiYgIXRvdWNoT2JqKSByZXR1cm4gbnVsbDsgLy8gbm90IHRoZSByaWdodCB0b3VjaFxuICBjb25zdCBub2RlID0gZmluZERPTU5vZGUoZHJhZ2dhYmxlQ29yZSk7XG4gIC8vIFVzZXIgY2FuIHByb3ZpZGUgYW4gb2Zmc2V0UGFyZW50IGlmIGRlc2lyZWQuXG4gIGNvbnN0IG9mZnNldFBhcmVudCA9IGRyYWdnYWJsZUNvcmUucHJvcHMub2Zmc2V0UGFyZW50IHx8IG5vZGUub2Zmc2V0UGFyZW50IHx8IG5vZGUub3duZXJEb2N1bWVudC5ib2R5O1xuICByZXR1cm4gKDAsIF9kb21GbnMub2Zmc2V0WFlGcm9tUGFyZW50KSh0b3VjaE9iaiB8fCBlLCBvZmZzZXRQYXJlbnQsIGRyYWdnYWJsZUNvcmUucHJvcHMuc2NhbGUpO1xufVxuXG4vLyBDcmVhdGUgYW4gZGF0YSBvYmplY3QgZXhwb3NlZCBieSA8RHJhZ2dhYmxlQ29yZT4ncyBldmVudHNcbmZ1bmN0aW9uIGNyZWF0ZUNvcmVEYXRhKGRyYWdnYWJsZSAvKjogRHJhZ2dhYmxlQ29yZSovLCB4IC8qOiBudW1iZXIqLywgeSAvKjogbnVtYmVyKi8pIC8qOiBEcmFnZ2FibGVEYXRhKi97XG4gIGNvbnN0IGlzU3RhcnQgPSAhKDAsIF9zaGltcy5pc051bSkoZHJhZ2dhYmxlLmxhc3RYKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmRET01Ob2RlKGRyYWdnYWJsZSk7XG4gIGlmIChpc1N0YXJ0KSB7XG4gICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgbW92ZSwgdXNlIHRoZSB4IGFuZCB5IGFzIGxhc3QgY29vcmRzLlxuICAgIHJldHVybiB7XG4gICAgICBub2RlLFxuICAgICAgZGVsdGFYOiAwLFxuICAgICAgZGVsdGFZOiAwLFxuICAgICAgbGFzdFg6IHgsXG4gICAgICBsYXN0WTogeSxcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UgY2FsY3VsYXRlIHByb3BlciB2YWx1ZXMuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGUsXG4gICAgICBkZWx0YVg6IHggLSBkcmFnZ2FibGUubGFzdFgsXG4gICAgICBkZWx0YVk6IHkgLSBkcmFnZ2FibGUubGFzdFksXG4gICAgICBsYXN0WDogZHJhZ2dhYmxlLmxhc3RYLFxuICAgICAgbGFzdFk6IGRyYWdnYWJsZS5sYXN0WSxcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfTtcbiAgfVxufVxuXG4vLyBDcmVhdGUgYW4gZGF0YSBleHBvc2VkIGJ5IDxEcmFnZ2FibGU+J3MgZXZlbnRzXG5mdW5jdGlvbiBjcmVhdGVEcmFnZ2FibGVEYXRhKGRyYWdnYWJsZSAvKjogRHJhZ2dhYmxlKi8sIGNvcmVEYXRhIC8qOiBEcmFnZ2FibGVEYXRhKi8pIC8qOiBEcmFnZ2FibGVEYXRhKi97XG4gIGNvbnN0IHNjYWxlID0gZHJhZ2dhYmxlLnByb3BzLnNjYWxlO1xuICByZXR1cm4ge1xuICAgIG5vZGU6IGNvcmVEYXRhLm5vZGUsXG4gICAgeDogZHJhZ2dhYmxlLnN0YXRlLnggKyBjb3JlRGF0YS5kZWx0YVggLyBzY2FsZSxcbiAgICB5OiBkcmFnZ2FibGUuc3RhdGUueSArIGNvcmVEYXRhLmRlbHRhWSAvIHNjYWxlLFxuICAgIGRlbHRhWDogY29yZURhdGEuZGVsdGFYIC8gc2NhbGUsXG4gICAgZGVsdGFZOiBjb3JlRGF0YS5kZWx0YVkgLyBzY2FsZSxcbiAgICBsYXN0WDogZHJhZ2dhYmxlLnN0YXRlLngsXG4gICAgbGFzdFk6IGRyYWdnYWJsZS5zdGF0ZS55XG4gIH07XG59XG5cbi8vIEEgbG90IGZhc3RlciB0aGFuIHN0cmluZ2lmeS9wYXJzZVxuZnVuY3Rpb24gY2xvbmVCb3VuZHMoYm91bmRzIC8qOiBCb3VuZHMqLykgLyo6IEJvdW5kcyove1xuICByZXR1cm4ge1xuICAgIGxlZnQ6IGJvdW5kcy5sZWZ0LFxuICAgIHRvcDogYm91bmRzLnRvcCxcbiAgICByaWdodDogYm91bmRzLnJpZ2h0LFxuICAgIGJvdHRvbTogYm91bmRzLmJvdHRvbVxuICB9O1xufVxuZnVuY3Rpb24gZmluZERPTU5vZGUoZHJhZ2dhYmxlIC8qOiBEcmFnZ2FibGUgfCBEcmFnZ2FibGVDb3JlKi8pIC8qOiBIVE1MRWxlbWVudCove1xuICBjb25zdCBub2RlID0gZHJhZ2dhYmxlLmZpbmRET01Ob2RlKCk7XG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignPERyYWdnYWJsZUNvcmU+OiBVbm1vdW50ZWQgZHVyaW5nIGV2ZW50IScpO1xuICB9XG4gIC8vICRGbG93SWdub3JlIHdlIGNhbid0IGFzc2VydCBvbiBIVE1MRWxlbWVudCBkdWUgdG8gdGVzdHMuLi4gRklYTUVcbiAgcmV0dXJuIG5vZGU7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRvbnRTZXRNZSA9IGRvbnRTZXRNZTtcbmV4cG9ydHMuZmluZEluQXJyYXkgPSBmaW5kSW5BcnJheTtcbmV4cG9ydHMuaW50ID0gaW50O1xuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcbmV4cG9ydHMuaXNOdW0gPSBpc051bTtcbi8vIEBjcmVkaXRzIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3JvZ296aG5pa29mZi9hNDNjZmVkMjdjNDFlNGU2OGNkY1xuZnVuY3Rpb24gZmluZEluQXJyYXkoYXJyYXkgLyo6IEFycmF5PGFueT4gfCBUb3VjaExpc3QqLywgY2FsbGJhY2sgLyo6IEZ1bmN0aW9uKi8pIC8qOiBhbnkqL3tcbiAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNhbGxiYWNrLmFwcGx5KGNhbGxiYWNrLCBbYXJyYXlbaV0sIGksIGFycmF5XSkpIHJldHVybiBhcnJheVtpXTtcbiAgfVxufVxuZnVuY3Rpb24gaXNGdW5jdGlvbihmdW5jIC8qOiBhbnkqLykgLyo6IGJvb2xlYW4gJWNoZWNrcyove1xuICAvLyAkRmxvd0lnbm9yZVttZXRob2QtdW5iaW5kaW5nXVxuICByZXR1cm4gdHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGZ1bmMpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuZnVuY3Rpb24gaXNOdW0obnVtIC8qOiBhbnkqLykgLyo6IGJvb2xlYW4gJWNoZWNrcyove1xuICByZXR1cm4gdHlwZW9mIG51bSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG51bSk7XG59XG5mdW5jdGlvbiBpbnQoYSAvKjogc3RyaW5nKi8pIC8qOiBudW1iZXIqL3tcbiAgcmV0dXJuIHBhcnNlSW50KGEsIDEwKTtcbn1cbmZ1bmN0aW9uIGRvbnRTZXRNZShwcm9wcyAvKjogT2JqZWN0Ki8sIHByb3BOYW1lIC8qOiBzdHJpbmcqLywgY29tcG9uZW50TmFtZSAvKjogc3RyaW5nKi8pIC8qOiA/RXJyb3IqL3tcbiAgaWYgKHByb3BzW3Byb3BOYW1lXSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoXCJJbnZhbGlkIHByb3AgXCIuY29uY2F0KHByb3BOYW1lLCBcIiBwYXNzZWQgdG8gXCIpLmNvbmNhdChjb21wb25lbnROYW1lLCBcIiAtIGRvIG5vdCBzZXQgdGhpcywgc2V0IGl0IG9uIHRoZSBjaGlsZC5cIikpO1xuICB9XG59IiwiZnVuY3Rpb24gcihlKXt2YXIgdCxmLG49XCJcIjtpZihcInN0cmluZ1wiPT10eXBlb2YgZXx8XCJudW1iZXJcIj09dHlwZW9mIGUpbis9ZTtlbHNlIGlmKFwib2JqZWN0XCI9PXR5cGVvZiBlKWlmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdJiYoZj1yKGVbdF0pKSYmKG4mJihuKz1cIiBcIiksbis9Zik7ZWxzZSBmb3IodCBpbiBlKWVbdF0mJihuJiYobis9XCIgXCIpLG4rPXQpO3JldHVybiBufWV4cG9ydCBmdW5jdGlvbiBjbHN4KCl7Zm9yKHZhciBlLHQsZj0wLG49XCJcIjtmPGFyZ3VtZW50cy5sZW5ndGg7KShlPWFyZ3VtZW50c1tmKytdKSYmKHQ9cihlKSkmJihuJiYobis9XCIgXCIpLG4rPXQpO3JldHVybiBufWV4cG9ydCBkZWZhdWx0IGNsc3g7IiwiLyogZ2xvYmFsIE1hcDpyZWFkb25seSwgU2V0OnJlYWRvbmx5LCBBcnJheUJ1ZmZlcjpyZWFkb25seSAqL1xuXG52YXIgaGFzRWxlbWVudFR5cGUgPSB0eXBlb2YgRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBoYXNTZXQgPSB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nO1xudmFyIGhhc0FycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nICYmICEhQXJyYXlCdWZmZXIuaXNWaWV3O1xuXG4vLyBOb3RlOiBXZSAqKmRvbid0KiogbmVlZCBgZW52SGFzQmlnSW50NjRBcnJheWAgaW4gZmRlIGVzNi9pbmRleC5qc1xuXG5mdW5jdGlvbiBlcXVhbChhLCBiKSB7XG4gIC8vIFNUQVJUOiBmYXN0LWRlZXAtZXF1YWwgZXM2L2luZGV4LmpzIDMuMS4zXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09ICdvYmplY3QnICYmIHR5cGVvZiBiID09ICdvYmplY3QnKSB7XG4gICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW5ndGgsIGksIGtleXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICBpZiAoIWVxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBTVEFSVDogTW9kaWZpY2F0aW9uczpcbiAgICAvLyAxLiBFeHRyYSBgaGFzPFR5cGU+ICYmYCBoZWxwZXJzIGluIGluaXRpYWwgY29uZGl0aW9uIGFsbG93IGVzNiBjb2RlXG4gICAgLy8gICAgdG8gY28tZXhpc3Qgd2l0aCBlczUuXG4gICAgLy8gMi4gUmVwbGFjZSBgZm9yIG9mYCB3aXRoIGVzNSBjb21wbGlhbnQgaXRlcmF0aW9uIHVzaW5nIGBmb3JgLlxuICAgIC8vICAgIEJhc2ljYWxseSwgdGFrZTpcbiAgICAvL1xuICAgIC8vICAgIGBgYGpzXG4gICAgLy8gICAgZm9yIChpIG9mIGEuZW50cmllcygpKVxuICAgIC8vICAgICAgaWYgKCFiLmhhcyhpWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgIGBgYFxuICAgIC8vXG4gICAgLy8gICAgLi4uIGFuZCBjb252ZXJ0IHRvOlxuICAgIC8vXG4gICAgLy8gICAgYGBganNcbiAgICAvLyAgICBpdCA9IGEuZW50cmllcygpO1xuICAgIC8vICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgLy8gICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgYGBgXG4gICAgLy9cbiAgICAvLyAgICAqKk5vdGUqKjogYGlgIGFjY2VzcyBzd2l0Y2hlcyB0byBgaS52YWx1ZWAuXG4gICAgdmFyIGl0O1xuICAgIGlmIChoYXNNYXAgJiYgKGEgaW5zdGFuY2VvZiBNYXApICYmIChiIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICBpdCA9IGEuZW50cmllcygpO1xuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAgICAgaWYgKCFiLmhhcyhpLnZhbHVlWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgICAgIGlmICghZXF1YWwoaS52YWx1ZVsxXSwgYi5nZXQoaS52YWx1ZVswXSkpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaGFzU2V0ICYmIChhIGluc3RhbmNlb2YgU2V0KSAmJiAoYiBpbnN0YW5jZW9mIFNldCkpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBFTkQ6IE1vZGlmaWNhdGlvbnNcblxuICAgIGlmIChoYXNBcnJheUJ1ZmZlciAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGIpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChhLmNvbnN0cnVjdG9yID09PSBSZWdFeHApIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgICAvLyBTVEFSVDogTW9kaWZpY2F0aW9uczpcbiAgICAvLyBBcHBseSBndWFyZHMgZm9yIGBPYmplY3QuY3JlYXRlKG51bGwpYCBoYW5kbGluZy4gU2VlOlxuICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL0Zvcm1pZGFibGVMYWJzL3JlYWN0LWZhc3QtY29tcGFyZS9pc3N1ZXMvNjRcbiAgICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9lcG9iZXJlemtpbi9mYXN0LWRlZXAtZXF1YWwvaXNzdWVzLzQ5XG4gICAgaWYgKGEudmFsdWVPZiAhPT0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mICYmIHR5cGVvZiBhLnZhbHVlT2YgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGIudmFsdWVPZiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTtcbiAgICBpZiAoYS50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAmJiB0eXBlb2YgYS50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgYi50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGEudG9TdHJpbmcoKSA9PT0gYi50b1N0cmluZygpO1xuICAgIC8vIEVORDogTW9kaWZpY2F0aW9uc1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5c1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBFTkQ6IGZhc3QtZGVlcC1lcXVhbFxuXG4gICAgLy8gU1RBUlQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuICAgIC8vIGN1c3RvbSBoYW5kbGluZyBmb3IgRE9NIGVsZW1lbnRzXG4gICAgaWYgKGhhc0VsZW1lbnRUeXBlICYmIGEgaW5zdGFuY2VvZiBFbGVtZW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBjdXN0b20gaGFuZGxpbmcgZm9yIFJlYWN0L1ByZWFjdFxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgaWYgKChrZXlzW2ldID09PSAnX293bmVyJyB8fCBrZXlzW2ldID09PSAnX192JyB8fCBrZXlzW2ldID09PSAnX19vJykgJiYgYS4kJHR5cGVvZikge1xuICAgICAgICAvLyBSZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBSZWFjdCBlbGVtZW50cycgX293bmVyXG4gICAgICAgIC8vIFByZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBQcmVhY3QgZWxlbWVudHMnIF9fdiBhbmQgX19vXG4gICAgICAgIC8vICAgIF9fdiA9ICRfb3JpZ2luYWwgLyAkX3Zub2RlXG4gICAgICAgIC8vICAgIF9fbyA9ICRfb3duZXJcbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBjb250YWluIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIGFyZSBub3QgbmVlZGVkIHdoZW5cbiAgICAgICAgLy8gY29tcGFyaW5nIHRoZSBhY3R1YWwgZWxlbWVudHMgKGFuZCBub3QgdGhlaXIgb3duZXJzKVxuICAgICAgICAvLyAuJCR0eXBlb2YgYW5kIC5fc3RvcmUgb24ganVzdCByZWFzb25hYmxlIG1hcmtlcnMgb2YgZWxlbWVudHNcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYWxsIG90aGVyIHByb3BlcnRpZXMgc2hvdWxkIGJlIHRyYXZlcnNlZCBhcyB1c3VhbFxuICAgICAgaWYgKCFlcXVhbChhW2tleXNbaV1dLCBiW2tleXNbaV1dKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBFTkQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuXG4gICAgLy8gU1RBUlQ6IGZhc3QtZGVlcC1lcXVhbFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbn1cbi8vIGVuZCBmYXN0LWRlZXAtZXF1YWxcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXF1YWwoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCgoZXJyb3IubWVzc2FnZSB8fCAnJykubWF0Y2goL3N0YWNrfHJlY3Vyc2lvbi9pKSkpIHtcbiAgICAgIC8vIHdhcm4gb24gY2lyY3VsYXIgcmVmZXJlbmNlcywgZG9uJ3QgY3Jhc2hcbiAgICAgIC8vIGJyb3dzZXJzIGdpdmUgdGhpcyBkaWZmZXJlbnQgZXJyb3JzIG5hbWUgYW5kIG1lc3NhZ2VzOlxuICAgICAgLy8gY2hyb21lL3NhZmFyaTogXCJSYW5nZUVycm9yXCIsIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIlxuICAgICAgLy8gZmlyZWZveDogXCJJbnRlcm5hbEVycm9yXCIsIHRvbyBtdWNoIHJlY3Vyc2lvblwiXG4gICAgICAvLyBlZGdlOiBcIkVycm9yXCIsIFwiT3V0IG9mIHN0YWNrIHNwYWNlXCJcbiAgICAgIGNvbnNvbGUud2FybigncmVhY3QtZmFzdC1jb21wYXJlIGNhbm5vdCBoYW5kbGUgY2lyY3VsYXIgcmVmcycpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBzb21lIG90aGVyIGVycm9yLiB3ZSBzaG91bGQgZGVmaW5pdGVseSBrbm93IGFib3V0IHRoZXNlXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnZm9jdXMtbG9jay9jb25zdGFudHMnO1xuaW1wb3J0IHsgaW5saW5lUHJvcCB9IGZyb20gJy4vdXRpbCc7XG52YXIgQXV0b0ZvY3VzSW5zaWRlID0gZnVuY3Rpb24gQXV0b0ZvY3VzSW5zaWRlKF9yZWYpIHtcbiAgdmFyIF9yZWYkZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgIGRpc2FibGVkID0gX3JlZiRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJGRpc2FibGVkLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBfcmVmJGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYkY2xhc3NOYW1lID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfcmVmJGNsYXNzTmFtZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBpbmxpbmVQcm9wKGNvbnN0YW50cy5GT0NVU19BVVRPLCAhZGlzYWJsZWQpLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSksIGNoaWxkcmVuKTtcbn07XG5BdXRvRm9jdXNJbnNpZGUucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEF1dG9Gb2N1c0luc2lkZTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZvY3VzTG9ja1VJIGZyb20gJy4vTG9jayc7XG5pbXBvcnQgRm9jdXNUcmFwIGZyb20gJy4vVHJhcCc7XG52YXIgRm9jdXNMb2NrQ29tYmluYXRpb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb2N1c0xvY2tVSUNvbWJpbmF0aW9uKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzTG9ja1VJLCBfZXh0ZW5kcyh7XG4gICAgc2lkZUNhcjogRm9jdXNUcmFwLFxuICAgIHJlZjogcmVmXG4gIH0sIHByb3BzKSk7XG59KTtcbnZhciBfcmVmID0gRm9jdXNMb2NrVUkucHJvcFR5cGVzIHx8IHt9LFxuICBzaWRlQ2FyID0gX3JlZi5zaWRlQ2FyLFxuICBwcm9wVHlwZXMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBbXCJzaWRlQ2FyXCJdKTtcbkZvY3VzTG9ja0NvbWJpbmF0aW9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHByb3BUeXBlcyA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgRm9jdXNMb2NrQ29tYmluYXRpb247IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmV4cG9ydCB2YXIgaGlkZGVuR3VhcmQgPSB7XG4gIHdpZHRoOiAnMXB4JyxcbiAgaGVpZ2h0OiAnMHB4JyxcbiAgcGFkZGluZzogMCxcbiAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgdG9wOiAnMXB4JyxcbiAgbGVmdDogJzFweCdcbn07XG52YXIgSW5Gb2N1c0d1YXJkID0gZnVuY3Rpb24gSW5Gb2N1c0d1YXJkKF9yZWYpIHtcbiAgdmFyIF9yZWYkY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIGNoaWxkcmVuID0gX3JlZiRjaGlsZHJlbiA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkY2hpbGRyZW47XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJndWFyZC1maXJzdFwiLFxuICAgIFwiZGF0YS1mb2N1cy1ndWFyZFwiOiB0cnVlLFxuICAgIFwiZGF0YS1mb2N1cy1hdXRvLWd1YXJkXCI6IHRydWUsXG4gICAgc3R5bGU6IGhpZGRlbkd1YXJkXG4gIH0pLCBjaGlsZHJlbiwgY2hpbGRyZW4gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJndWFyZC1sYXN0XCIsXG4gICAgXCJkYXRhLWZvY3VzLWd1YXJkXCI6IHRydWUsXG4gICAgXCJkYXRhLWZvY3VzLWF1dG8tZ3VhcmRcIjogdHJ1ZSxcbiAgICBzdHlsZTogaGlkZGVuR3VhcmRcbiAgfSkpO1xufTtcbkluRm9jdXNHdWFyZC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZVxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgSW5Gb2N1c0d1YXJkOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICdmb2N1cy1sb2NrL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbmxpbmVQcm9wIH0gZnJvbSAnLi91dGlsJztcbnZhciBGcmVlRm9jdXNJbnNpZGUgPSBmdW5jdGlvbiBGcmVlRm9jdXNJbnNpZGUoX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIGlubGluZVByb3AoY29uc3RhbnRzLkZPQ1VTX0FMTE9XLCB0cnVlKSwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0pLCBjaGlsZHJlbik7XG59O1xuRnJlZUZvY3VzSW5zaWRlLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgRnJlZUZvY3VzSW5zaWRlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgbm9kZSwgYm9vbCwgc3RyaW5nLCBhbnksIGFycmF5T2YsIG9uZU9mVHlwZSwgb2JqZWN0LCBmdW5jIH0gZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnZm9jdXMtbG9jay9jb25zdGFudHMnO1xuaW1wb3J0IHsgdXNlTWVyZ2VSZWZzIH0gZnJvbSAndXNlLWNhbGxiYWNrLXJlZic7XG5pbXBvcnQgeyBoaWRkZW5HdWFyZCB9IGZyb20gJy4vRm9jdXNHdWFyZCc7XG5pbXBvcnQgeyBtZWRpdW1Gb2N1cywgbWVkaXVtQmx1ciwgbWVkaXVtU2lkZWNhciB9IGZyb20gJy4vbWVkaXVtJztcbmltcG9ydCB7IGZvY3VzU2NvcGUgfSBmcm9tICcuL3Njb3BlJztcbnZhciBlbXB0eUFycmF5ID0gW107XG52YXIgRm9jdXNMb2NrID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRm9jdXNMb2NrVUkocHJvcHMsIHBhcmVudFJlZikge1xuICB2YXIgX2V4dGVuZHMyO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoKSxcbiAgICByZWFsT2JzZXJ2ZWQgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgc2V0T2JzZXJ2ZWQgPSBfUmVhY3QkdXNlU3RhdGVbMV07XG4gIHZhciBvYnNlcnZlZCA9IFJlYWN0LnVzZVJlZigpO1xuICB2YXIgaXNBY3RpdmUgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICB2YXIgb3JpZ2luYWxGb2N1c2VkRWxlbWVudCA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTIgPSBSZWFjdC51c2VTdGF0ZSh7fSksXG4gICAgdXBkYXRlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgX3Byb3BzJGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgZGlzYWJsZWQgPSBfcHJvcHMkZGlzYWJsZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVkLFxuICAgIF9wcm9wcyRub0ZvY3VzR3VhcmRzID0gcHJvcHMubm9Gb2N1c0d1YXJkcyxcbiAgICBub0ZvY3VzR3VhcmRzID0gX3Byb3BzJG5vRm9jdXNHdWFyZHMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJG5vRm9jdXNHdWFyZHMsXG4gICAgX3Byb3BzJHBlcnNpc3RlbnRGb2N1ID0gcHJvcHMucGVyc2lzdGVudEZvY3VzLFxuICAgIHBlcnNpc3RlbnRGb2N1cyA9IF9wcm9wcyRwZXJzaXN0ZW50Rm9jdSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkcGVyc2lzdGVudEZvY3UsXG4gICAgX3Byb3BzJGNyb3NzRnJhbWUgPSBwcm9wcy5jcm9zc0ZyYW1lLFxuICAgIGNyb3NzRnJhbWUgPSBfcHJvcHMkY3Jvc3NGcmFtZSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRjcm9zc0ZyYW1lLFxuICAgIF9wcm9wcyRhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgYXV0b0ZvY3VzID0gX3Byb3BzJGF1dG9Gb2N1cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9wcm9wcyRhdXRvRm9jdXMsXG4gICAgYWxsb3dUZXh0U2VsZWN0aW9uID0gcHJvcHMuYWxsb3dUZXh0U2VsZWN0aW9uLFxuICAgIGdyb3VwID0gcHJvcHMuZ3JvdXAsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIHdoaXRlTGlzdCA9IHByb3BzLndoaXRlTGlzdCxcbiAgICBoYXNQb3NpdGl2ZUluZGljZXMgPSBwcm9wcy5oYXNQb3NpdGl2ZUluZGljZXMsXG4gICAgX3Byb3BzJHNoYXJkcyA9IHByb3BzLnNoYXJkcyxcbiAgICBzaGFyZHMgPSBfcHJvcHMkc2hhcmRzID09PSB2b2lkIDAgPyBlbXB0eUFycmF5IDogX3Byb3BzJHNoYXJkcyxcbiAgICBfcHJvcHMkYXMgPSBwcm9wcy5hcyxcbiAgICBDb250YWluZXIgPSBfcHJvcHMkYXMgPT09IHZvaWQgMCA/ICdkaXYnIDogX3Byb3BzJGFzLFxuICAgIF9wcm9wcyRsb2NrUHJvcHMgPSBwcm9wcy5sb2NrUHJvcHMsXG4gICAgY29udGFpbmVyUHJvcHMgPSBfcHJvcHMkbG9ja1Byb3BzID09PSB2b2lkIDAgPyB7fSA6IF9wcm9wcyRsb2NrUHJvcHMsXG4gICAgU2lkZUNhciA9IHByb3BzLnNpZGVDYXIsXG4gICAgX3Byb3BzJHJldHVybkZvY3VzID0gcHJvcHMucmV0dXJuRm9jdXMsXG4gICAgc2hvdWxkUmV0dXJuRm9jdXMgPSBfcHJvcHMkcmV0dXJuRm9jdXMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHJldHVybkZvY3VzLFxuICAgIGZvY3VzT3B0aW9ucyA9IHByb3BzLmZvY3VzT3B0aW9ucyxcbiAgICBvbkFjdGl2YXRpb25DYWxsYmFjayA9IHByb3BzLm9uQWN0aXZhdGlvbixcbiAgICBvbkRlYWN0aXZhdGlvbkNhbGxiYWNrID0gcHJvcHMub25EZWFjdGl2YXRpb247XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoe30pLFxuICAgIGlkID0gX1JlYWN0JHVzZVN0YXRlM1swXTtcbiAgdmFyIG9uQWN0aXZhdGlvbiA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGNhcHR1cmVGb2N1c1Jlc3RvcmUgPSBfcmVmLmNhcHR1cmVGb2N1c1Jlc3RvcmU7XG4gICAgaWYgKCFvcmlnaW5hbEZvY3VzZWRFbGVtZW50LmN1cnJlbnQpIHtcbiAgICAgIHZhciBfZG9jdW1lbnQ7XG4gICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IChfZG9jdW1lbnQgPSBkb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgb3JpZ2luYWxGb2N1c2VkRWxlbWVudC5jdXJyZW50ID0gYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChhY3RpdmVFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIG9yaWdpbmFsRm9jdXNlZEVsZW1lbnQuY3VycmVudCA9IGNhcHR1cmVGb2N1c1Jlc3RvcmUoYWN0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvYnNlcnZlZC5jdXJyZW50ICYmIG9uQWN0aXZhdGlvbkNhbGxiYWNrKSB7XG4gICAgICBvbkFjdGl2YXRpb25DYWxsYmFjayhvYnNlcnZlZC5jdXJyZW50KTtcbiAgICB9XG4gICAgaXNBY3RpdmUuY3VycmVudCA9IHRydWU7XG4gICAgdXBkYXRlKCk7XG4gIH0sIFtvbkFjdGl2YXRpb25DYWxsYmFja10pO1xuICB2YXIgb25EZWFjdGl2YXRpb24gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgaXNBY3RpdmUuY3VycmVudCA9IGZhbHNlO1xuICAgIGlmIChvbkRlYWN0aXZhdGlvbkNhbGxiYWNrKSB7XG4gICAgICBvbkRlYWN0aXZhdGlvbkNhbGxiYWNrKG9ic2VydmVkLmN1cnJlbnQpO1xuICAgIH1cbiAgICB1cGRhdGUoKTtcbiAgfSwgW29uRGVhY3RpdmF0aW9uQ2FsbGJhY2tdKTtcbiAgdmFyIHJldHVybkZvY3VzID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGFsbG93RGVmZXIpIHtcbiAgICB2YXIgZm9jdXNSZXN0b3JlID0gb3JpZ2luYWxGb2N1c2VkRWxlbWVudC5jdXJyZW50O1xuICAgIGlmIChmb2N1c1Jlc3RvcmUpIHtcbiAgICAgIHZhciByZXR1cm5Gb2N1c1RvID0gKHR5cGVvZiBmb2N1c1Jlc3RvcmUgPT09ICdmdW5jdGlvbicgPyBmb2N1c1Jlc3RvcmUoKSA6IGZvY3VzUmVzdG9yZSkgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgIHZhciBob3dUb1JldHVybkZvY3VzID0gdHlwZW9mIHNob3VsZFJldHVybkZvY3VzID09PSAnZnVuY3Rpb24nID8gc2hvdWxkUmV0dXJuRm9jdXMocmV0dXJuRm9jdXNUbykgOiBzaG91bGRSZXR1cm5Gb2N1cztcbiAgICAgIGlmIChob3dUb1JldHVybkZvY3VzKSB7XG4gICAgICAgIHZhciByZXR1cm5Gb2N1c09wdGlvbnMgPSB0eXBlb2YgaG93VG9SZXR1cm5Gb2N1cyA9PT0gJ29iamVjdCcgPyBob3dUb1JldHVybkZvY3VzIDogdW5kZWZpbmVkO1xuICAgICAgICBvcmlnaW5hbEZvY3VzZWRFbGVtZW50LmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBpZiAoYWxsb3dEZWZlcikge1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldHVybkZvY3VzVG8uZm9jdXMocmV0dXJuRm9jdXNPcHRpb25zKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm5Gb2N1c1RvLmZvY3VzKHJldHVybkZvY3VzT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIFtzaG91bGRSZXR1cm5Gb2N1c10pO1xuICB2YXIgb25Gb2N1cyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChpc0FjdGl2ZS5jdXJyZW50KSB7XG4gICAgICBtZWRpdW1Gb2N1cy51c2VNZWRpdW0oZXZlbnQpO1xuICAgIH1cbiAgfSwgW10pO1xuICB2YXIgb25CbHVyID0gbWVkaXVtQmx1ci51c2VNZWRpdW07XG4gIHZhciBzZXRPYnNlcnZlTm9kZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChuZXdPYnNlcnZlZCkge1xuICAgIGlmIChvYnNlcnZlZC5jdXJyZW50ICE9PSBuZXdPYnNlcnZlZCkge1xuICAgICAgb2JzZXJ2ZWQuY3VycmVudCA9IG5ld09ic2VydmVkO1xuICAgICAgc2V0T2JzZXJ2ZWQobmV3T2JzZXJ2ZWQpO1xuICAgIH1cbiAgfSwgW10pO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmICh0eXBlb2YgYWxsb3dUZXh0U2VsZWN0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS53YXJuKCdSZWFjdC1Gb2N1cy1Mb2NrOiBhbGxvd1RleHRTZWxlY3Rpb24gaXMgZGVwcmVjYXRlZCBhbmQgZW5hYmxlZCBieSBkZWZhdWx0Jyk7XG4gICAgfVxuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIW9ic2VydmVkLmN1cnJlbnQgJiYgdHlwZW9mIENvbnRhaW5lciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9jdXNMb2NrOiBjb3VsZCBub3Qgb2J0YWluIHJlZiB0byBpbnRlcm5hbCBub2RlJyk7XG4gICAgICB9XG4gICAgfSwgW10pO1xuICB9XG4gIHZhciBsb2NrUHJvcHMgPSBfZXh0ZW5kcygoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMltjb25zdGFudHMuRk9DVVNfRElTQUJMRURdID0gZGlzYWJsZWQgJiYgJ2Rpc2FibGVkJywgX2V4dGVuZHMyW2NvbnN0YW50cy5GT0NVU19HUk9VUF0gPSBncm91cCwgX2V4dGVuZHMyKSwgY29udGFpbmVyUHJvcHMpO1xuICB2YXIgaGFzTGVhZGluZ0d1YXJkcyA9IG5vRm9jdXNHdWFyZHMgIT09IHRydWU7XG4gIHZhciBoYXNUYWlsaW5nR3VhcmRzID0gaGFzTGVhZGluZ0d1YXJkcyAmJiBub0ZvY3VzR3VhcmRzICE9PSAndGFpbCc7XG4gIHZhciBtZXJnZWRSZWYgPSB1c2VNZXJnZVJlZnMoW3BhcmVudFJlZiwgc2V0T2JzZXJ2ZU5vZGVdKTtcbiAgdmFyIGZvY3VzU2NvcGVWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvYnNlcnZlZDogb2JzZXJ2ZWQsXG4gICAgICBzaGFyZHM6IHNoYXJkcyxcbiAgICAgIGVuYWJsZWQ6ICFkaXNhYmxlZCxcbiAgICAgIGFjdGl2ZTogaXNBY3RpdmUuY3VycmVudFxuICAgIH07XG4gIH0sIFtkaXNhYmxlZCwgaXNBY3RpdmUuY3VycmVudCwgc2hhcmRzLCByZWFsT2JzZXJ2ZWRdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBoYXNMZWFkaW5nR3VhcmRzICYmIFtcbiAgLyojX19QVVJFX18qL1xuICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiZ3VhcmQtZmlyc3RcIixcbiAgICBcImRhdGEtZm9jdXMtZ3VhcmRcIjogdHJ1ZSxcbiAgICB0YWJJbmRleDogZGlzYWJsZWQgPyAtMSA6IDAsXG4gICAgc3R5bGU6IGhpZGRlbkd1YXJkXG4gIH0pLCBoYXNQb3NpdGl2ZUluZGljZXMgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBcImd1YXJkLW5lYXJlc3RcIixcbiAgICBcImRhdGEtZm9jdXMtZ3VhcmRcIjogdHJ1ZSxcbiAgICB0YWJJbmRleDogZGlzYWJsZWQgPyAtMSA6IDEsXG4gICAgc3R5bGU6IGhpZGRlbkd1YXJkXG4gIH0pIDogbnVsbF0sICFkaXNhYmxlZCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTaWRlQ2FyLCB7XG4gICAgaWQ6IGlkLFxuICAgIHNpZGVDYXI6IG1lZGl1bVNpZGVjYXIsXG4gICAgb2JzZXJ2ZWQ6IHJlYWxPYnNlcnZlZCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgcGVyc2lzdGVudEZvY3VzOiBwZXJzaXN0ZW50Rm9jdXMsXG4gICAgY3Jvc3NGcmFtZTogY3Jvc3NGcmFtZSxcbiAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICB3aGl0ZUxpc3Q6IHdoaXRlTGlzdCxcbiAgICBzaGFyZHM6IHNoYXJkcyxcbiAgICBvbkFjdGl2YXRpb246IG9uQWN0aXZhdGlvbixcbiAgICBvbkRlYWN0aXZhdGlvbjogb25EZWFjdGl2YXRpb24sXG4gICAgcmV0dXJuRm9jdXM6IHJldHVybkZvY3VzLFxuICAgIGZvY3VzT3B0aW9uczogZm9jdXNPcHRpb25zXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb250YWluZXIsIF9leHRlbmRzKHtcbiAgICByZWY6IG1lcmdlZFJlZlxuICB9LCBsb2NrUHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBvbkJsdXI6IG9uQmx1cixcbiAgICBvbkZvY3VzOiBvbkZvY3VzXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChmb2N1c1Njb3BlLlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGZvY3VzU2NvcGVWYWx1ZVxuICB9LCBjaGlsZHJlbikpLCBoYXNUYWlsaW5nR3VhcmRzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBcImRhdGEtZm9jdXMtZ3VhcmRcIjogdHJ1ZSxcbiAgICB0YWJJbmRleDogZGlzYWJsZWQgPyAtMSA6IDAsXG4gICAgc3R5bGU6IGhpZGRlbkd1YXJkXG4gIH0pKTtcbn0pO1xuRm9jdXNMb2NrLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgY2hpbGRyZW46IG5vZGUsXG4gIGRpc2FibGVkOiBib29sLFxuICByZXR1cm5Gb2N1czogb25lT2ZUeXBlKFtib29sLCBvYmplY3QsIGZ1bmNdKSxcbiAgZm9jdXNPcHRpb25zOiBvYmplY3QsXG4gIG5vRm9jdXNHdWFyZHM6IGJvb2wsXG4gIGhhc1Bvc2l0aXZlSW5kaWNlczogYm9vbCxcbiAgYWxsb3dUZXh0U2VsZWN0aW9uOiBib29sLFxuICBhdXRvRm9jdXM6IGJvb2wsXG4gIHBlcnNpc3RlbnRGb2N1czogYm9vbCxcbiAgY3Jvc3NGcmFtZTogYm9vbCxcbiAgZ3JvdXA6IHN0cmluZyxcbiAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gIHdoaXRlTGlzdDogZnVuYyxcbiAgc2hhcmRzOiBhcnJheU9mKGFueSksXG4gIGFzOiBvbmVPZlR5cGUoW3N0cmluZywgZnVuYywgb2JqZWN0XSksXG4gIGxvY2tQcm9wczogb2JqZWN0LFxuICBvbkFjdGl2YXRpb246IGZ1bmMsXG4gIG9uRGVhY3RpdmF0aW9uOiBmdW5jLFxuICBzaWRlQ2FyOiBhbnkuaXNSZXF1aXJlZFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgRm9jdXNMb2NrOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICdmb2N1cy1sb2NrL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbmxpbmVQcm9wIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IG1lZGl1bUVmZmVjdCB9IGZyb20gJy4vbWVkaXVtJztcbmV4cG9ydCB2YXIgdXNlRm9jdXNJbnNpZGUgPSBmdW5jdGlvbiB1c2VGb2N1c0luc2lkZShvYnNlcnZlZFJlZikge1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbmFibGVkID0gdHJ1ZTtcbiAgICBtZWRpdW1FZmZlY3QudXNlTWVkaXVtKGZ1bmN0aW9uIChjYXIpIHtcbiAgICAgIHZhciBvYnNlcnZlZCA9IG9ic2VydmVkUmVmICYmIG9ic2VydmVkUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoZW5hYmxlZCAmJiBvYnNlcnZlZCkge1xuICAgICAgICBpZiAoIWNhci5mb2N1c0luc2lkZShvYnNlcnZlZCkpIHtcbiAgICAgICAgICBjYXIubW92ZUZvY3VzSW5zaWRlKG9ic2VydmVkLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBlbmFibGVkID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW29ic2VydmVkUmVmXSk7XG59O1xuZnVuY3Rpb24gTW92ZUZvY3VzSW5zaWRlKF9yZWYpIHtcbiAgdmFyIF9yZWYkZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuICAgIGlzRGlzYWJsZWQgPSBfcmVmJGRpc2FibGVkID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkZGlzYWJsZWQsXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICB2YXIgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB1c2VGb2N1c0luc2lkZShpc0Rpc2FibGVkID8gdW5kZWZpbmVkIDogcmVmKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHt9LCBpbmxpbmVQcm9wKGNvbnN0YW50cy5GT0NVU19BVVRPLCAhaXNEaXNhYmxlZCksIHtcbiAgICByZWY6IHJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9KSwgY2hpbGRyZW4pO1xufVxuTW92ZUZvY3VzSW5zaWRlLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBNb3ZlRm9jdXNJbnNpZGU7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB3aXRoU2lkZUVmZmVjdCBmcm9tICdyZWFjdC1jbGllbnRzaWRlLWVmZmVjdCc7XG5pbXBvcnQgeyBtb3ZlRm9jdXNJbnNpZGUsIGZvY3VzSW5zaWRlLCBmb2N1c0lzSGlkZGVuLCBleHBhbmRGb2N1c2FibGVOb2RlcywgZm9jdXNOZXh0RWxlbWVudCwgZm9jdXNQcmV2RWxlbWVudCwgZm9jdXNGaXJzdEVsZW1lbnQsIGZvY3VzTGFzdEVsZW1lbnQsIGNhcHR1cmVGb2N1c1Jlc3RvcmUgfSBmcm9tICdmb2N1cy1sb2NrJztcbmltcG9ydCB7IGRlZmVyQWN0aW9uLCBleHRyYWN0UmVmIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IG1lZGl1bUZvY3VzLCBtZWRpdW1CbHVyLCBtZWRpdW1FZmZlY3QgfSBmcm9tICcuL21lZGl1bSc7XG52YXIgZm9jdXNPbkJvZHkgPSBmdW5jdGlvbiBmb2N1c09uQm9keSgpIHtcbiAgcmV0dXJuIGRvY3VtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGRvY3VtZW50LmJvZHk7XG59O1xudmFyIGlzRnJlZUZvY3VzID0gZnVuY3Rpb24gaXNGcmVlRm9jdXMoKSB7XG4gIHJldHVybiBmb2N1c09uQm9keSgpIHx8IGZvY3VzSXNIaWRkZW4oKTtcbn07XG52YXIgbGFzdEFjdGl2ZVRyYXAgPSBudWxsO1xudmFyIGxhc3RBY3RpdmVGb2N1cyA9IG51bGw7XG52YXIgbGFzdFBvcnRhbGVkRWxlbWVudCA9IG51bGw7XG52YXIgZm9jdXNXYXNPdXRzaWRlV2luZG93ID0gZmFsc2U7XG52YXIgZGVmYXVsdFdoaXRlbGlzdCA9IGZ1bmN0aW9uIGRlZmF1bHRXaGl0ZWxpc3QoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBmb2N1c1doaXRlbGlzdGVkID0gZnVuY3Rpb24gZm9jdXNXaGl0ZWxpc3RlZChhY3RpdmVFbGVtZW50KSB7XG4gIHJldHVybiAobGFzdEFjdGl2ZVRyYXAud2hpdGVMaXN0IHx8IGRlZmF1bHRXaGl0ZWxpc3QpKGFjdGl2ZUVsZW1lbnQpO1xufTtcbnZhciByZWNvcmRQb3J0YWwgPSBmdW5jdGlvbiByZWNvcmRQb3J0YWwob2JzZXJ2ZXJOb2RlLCBwb3J0YWxlZEVsZW1lbnQpIHtcbiAgbGFzdFBvcnRhbGVkRWxlbWVudCA9IHtcbiAgICBvYnNlcnZlck5vZGU6IG9ic2VydmVyTm9kZSxcbiAgICBwb3J0YWxlZEVsZW1lbnQ6IHBvcnRhbGVkRWxlbWVudFxuICB9O1xufTtcbnZhciBmb2N1c0lzUG9ydGFsZWRQYWlyID0gZnVuY3Rpb24gZm9jdXNJc1BvcnRhbGVkUGFpcihlbGVtZW50KSB7XG4gIHJldHVybiBsYXN0UG9ydGFsZWRFbGVtZW50ICYmIGxhc3RQb3J0YWxlZEVsZW1lbnQucG9ydGFsZWRFbGVtZW50ID09PSBlbGVtZW50O1xufTtcbmZ1bmN0aW9uIGF1dG9HdWFyZChzdGFydEluZGV4LCBlbmQsIHN0ZXAsIGFsbE5vZGVzKSB7XG4gIHZhciBsYXN0R3VhcmQgPSBudWxsO1xuICB2YXIgaSA9IHN0YXJ0SW5kZXg7XG4gIGRvIHtcbiAgICB2YXIgaXRlbSA9IGFsbE5vZGVzW2ldO1xuICAgIGlmIChpdGVtLmd1YXJkKSB7XG4gICAgICBpZiAoaXRlbS5ub2RlLmRhdGFzZXQuZm9jdXNBdXRvR3VhcmQpIHtcbiAgICAgICAgbGFzdEd1YXJkID0gaXRlbTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGl0ZW0ubG9ja0l0ZW0pIHtcbiAgICAgIGlmIChpICE9PSBzdGFydEluZGV4KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxhc3RHdWFyZCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSB3aGlsZSAoKGkgKz0gc3RlcCkgIT09IGVuZCk7XG4gIGlmIChsYXN0R3VhcmQpIHtcbiAgICBsYXN0R3VhcmQubm9kZS50YWJJbmRleCA9IDA7XG4gIH1cbn1cbnZhciBmb2N1c1dhc091dHNpZGUgPSBmdW5jdGlvbiBmb2N1c1dhc091dHNpZGUoY3Jvc3NGcmFtZU9wdGlvbikge1xuICBpZiAoY3Jvc3NGcmFtZU9wdGlvbikge1xuICAgIHJldHVybiBCb29sZWFuKGZvY3VzV2FzT3V0c2lkZVdpbmRvdyk7XG4gIH1cbiAgcmV0dXJuIGZvY3VzV2FzT3V0c2lkZVdpbmRvdyA9PT0gJ21lYW53aGlsZSc7XG59O1xudmFyIGNoZWNrSW5Ib3N0ID0gZnVuY3Rpb24gY2hlY2tJbkhvc3QoY2hlY2ssIGVsLCBib3VuZGFyeSkge1xuICByZXR1cm4gZWwgJiYgKGVsLmhvc3QgPT09IGNoZWNrICYmICghZWwuYWN0aXZlRWxlbWVudCB8fCBib3VuZGFyeS5jb250YWlucyhlbC5hY3RpdmVFbGVtZW50KSkgfHwgZWwucGFyZW50Tm9kZSAmJiBjaGVja0luSG9zdChjaGVjaywgZWwucGFyZW50Tm9kZSwgYm91bmRhcnkpKTtcbn07XG52YXIgd2l0aGluSG9zdCA9IGZ1bmN0aW9uIHdpdGhpbkhvc3QoYWN0aXZlRWxlbWVudCwgd29ya2luZ0FyZWEpIHtcbiAgcmV0dXJuIHdvcmtpbmdBcmVhLnNvbWUoZnVuY3Rpb24gKGFyZWEpIHtcbiAgICByZXR1cm4gY2hlY2tJbkhvc3QoYWN0aXZlRWxlbWVudCwgYXJlYSwgYXJlYSk7XG4gIH0pO1xufTtcbnZhciBhY3RpdmF0ZVRyYXAgPSBmdW5jdGlvbiBhY3RpdmF0ZVRyYXAoKSB7XG4gIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgaWYgKGxhc3RBY3RpdmVUcmFwKSB7XG4gICAgdmFyIF9sYXN0QWN0aXZlVHJhcCA9IGxhc3RBY3RpdmVUcmFwLFxuICAgICAgb2JzZXJ2ZWQgPSBfbGFzdEFjdGl2ZVRyYXAub2JzZXJ2ZWQsXG4gICAgICBwZXJzaXN0ZW50Rm9jdXMgPSBfbGFzdEFjdGl2ZVRyYXAucGVyc2lzdGVudEZvY3VzLFxuICAgICAgYXV0b0ZvY3VzID0gX2xhc3RBY3RpdmVUcmFwLmF1dG9Gb2N1cyxcbiAgICAgIHNoYXJkcyA9IF9sYXN0QWN0aXZlVHJhcC5zaGFyZHMsXG4gICAgICBjcm9zc0ZyYW1lID0gX2xhc3RBY3RpdmVUcmFwLmNyb3NzRnJhbWUsXG4gICAgICBmb2N1c09wdGlvbnMgPSBfbGFzdEFjdGl2ZVRyYXAuZm9jdXNPcHRpb25zO1xuICAgIHZhciB3b3JraW5nTm9kZSA9IG9ic2VydmVkIHx8IGxhc3RQb3J0YWxlZEVsZW1lbnQgJiYgbGFzdFBvcnRhbGVkRWxlbWVudC5wb3J0YWxlZEVsZW1lbnQ7XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIGlmICh3b3JraW5nTm9kZSkge1xuICAgICAgdmFyIHdvcmtpbmdBcmVhID0gW3dvcmtpbmdOb2RlXS5jb25jYXQoc2hhcmRzLm1hcChleHRyYWN0UmVmKS5maWx0ZXIoQm9vbGVhbikpO1xuICAgICAgaWYgKCFhY3RpdmVFbGVtZW50IHx8IGZvY3VzV2hpdGVsaXN0ZWQoYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgaWYgKHBlcnNpc3RlbnRGb2N1cyB8fCBmb2N1c1dhc091dHNpZGUoY3Jvc3NGcmFtZSkgfHwgIWlzRnJlZUZvY3VzKCkgfHwgIWxhc3RBY3RpdmVGb2N1cyAmJiBhdXRvRm9jdXMpIHtcbiAgICAgICAgICBpZiAod29ya2luZ05vZGUgJiYgIShmb2N1c0luc2lkZSh3b3JraW5nQXJlYSkgfHwgYWN0aXZlRWxlbWVudCAmJiB3aXRoaW5Ib3N0KGFjdGl2ZUVsZW1lbnQsIHdvcmtpbmdBcmVhKSB8fCBmb2N1c0lzUG9ydGFsZWRQYWlyKGFjdGl2ZUVsZW1lbnQsIHdvcmtpbmdOb2RlKSkpIHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudCAmJiAhbGFzdEFjdGl2ZUZvY3VzICYmIGFjdGl2ZUVsZW1lbnQgJiYgIWF1dG9Gb2N1cykge1xuICAgICAgICAgICAgICBpZiAoYWN0aXZlRWxlbWVudC5ibHVyKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gbW92ZUZvY3VzSW5zaWRlKHdvcmtpbmdBcmVhLCBsYXN0QWN0aXZlRm9jdXMsIHtcbiAgICAgICAgICAgICAgICBmb2N1c09wdGlvbnM6IGZvY3VzT3B0aW9uc1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbGFzdFBvcnRhbGVkRWxlbWVudCA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb2N1c1dhc091dHNpZGVXaW5kb3cgPSBmYWxzZTtcbiAgICAgICAgICBsYXN0QWN0aXZlRm9jdXMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZG9jdW1lbnQgJiYgYWN0aXZlRWxlbWVudCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1mb2N1cy1hdXRvLWd1YXJkXScpKSB7XG4gICAgICAgIHZhciBuZXdBY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgdmFyIGFsbE5vZGVzID0gZXhwYW5kRm9jdXNhYmxlTm9kZXMod29ya2luZ0FyZWEpO1xuICAgICAgICB2YXIgZm9jdXNlZEluZGV4ID0gYWxsTm9kZXMubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgdmFyIG5vZGUgPSBfcmVmLm5vZGU7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0pLmluZGV4T2YobmV3QWN0aXZlRWxlbWVudCk7XG4gICAgICAgIGlmIChmb2N1c2VkSW5kZXggPiAtMSkge1xuICAgICAgICAgIGFsbE5vZGVzLmZpbHRlcihmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICAgIHZhciBndWFyZCA9IF9yZWYyLmd1YXJkLFxuICAgICAgICAgICAgICBub2RlID0gX3JlZjIubm9kZTtcbiAgICAgICAgICAgIHJldHVybiBndWFyZCAmJiBub2RlLmRhdGFzZXQuZm9jdXNBdXRvR3VhcmQ7XG4gICAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgICAgIHZhciBub2RlID0gX3JlZjMubm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlLnJlbW92ZUF0dHJpYnV0ZSgndGFiSW5kZXgnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhdXRvR3VhcmQoZm9jdXNlZEluZGV4LCBhbGxOb2Rlcy5sZW5ndGgsICsxLCBhbGxOb2Rlcyk7XG4gICAgICAgICAgYXV0b0d1YXJkKGZvY3VzZWRJbmRleCwgLTEsIC0xLCBhbGxOb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgb25UcmFwID0gZnVuY3Rpb24gb25UcmFwKGV2ZW50KSB7XG4gIGlmIChhY3RpdmF0ZVRyYXAoKSAmJiBldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn07XG52YXIgb25CbHVyID0gZnVuY3Rpb24gb25CbHVyKCkge1xuICByZXR1cm4gZGVmZXJBY3Rpb24oYWN0aXZhdGVUcmFwKTtcbn07XG52YXIgb25Gb2N1cyA9IGZ1bmN0aW9uIG9uRm9jdXMoZXZlbnQpIHtcbiAgdmFyIHNvdXJjZSA9IGV2ZW50LnRhcmdldDtcbiAgdmFyIGN1cnJlbnROb2RlID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgaWYgKCFjdXJyZW50Tm9kZS5jb250YWlucyhzb3VyY2UpKSB7XG4gICAgcmVjb3JkUG9ydGFsKGN1cnJlbnROb2RlLCBzb3VyY2UpO1xuICB9XG59O1xudmFyIEZvY3VzV2F0Y2hlciA9IGZ1bmN0aW9uIEZvY3VzV2F0Y2hlcigpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xudmFyIEZvY3VzVHJhcCA9IGZ1bmN0aW9uIEZvY3VzVHJhcChfcmVmNCkge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmNC5jaGlsZHJlbjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBvbkJsdXI6IG9uQmx1cixcbiAgICBvbkZvY3VzOiBvbkZvY3VzXG4gIH0sIGNoaWxkcmVuKTtcbn07XG5Gb2N1c1RyYXAucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZFxufSA6IHt9O1xudmFyIG9uV2luZG93Qmx1ciA9IGZ1bmN0aW9uIG9uV2luZG93Qmx1cigpIHtcbiAgZm9jdXNXYXNPdXRzaWRlV2luZG93ID0gJ2p1c3QnO1xuICBkZWZlckFjdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgZm9jdXNXYXNPdXRzaWRlV2luZG93ID0gJ21lYW53aGlsZSc7XG4gIH0pO1xufTtcbnZhciBhdHRhY2hIYW5kbGVyID0gZnVuY3Rpb24gYXR0YWNoSGFuZGxlcigpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG9uVHJhcCk7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25CbHVyKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbldpbmRvd0JsdXIpO1xufTtcbnZhciBkZXRhY2hIYW5kbGVyID0gZnVuY3Rpb24gZGV0YWNoSGFuZGxlcigpIHtcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG9uVHJhcCk7XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25CbHVyKTtcbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbldpbmRvd0JsdXIpO1xufTtcbmZ1bmN0aW9uIHJlZHVjZVByb3BzVG9TdGF0ZShwcm9wc0xpc3QpIHtcbiAgcmV0dXJuIHByb3BzTGlzdC5maWx0ZXIoZnVuY3Rpb24gKF9yZWY1KSB7XG4gICAgdmFyIGRpc2FibGVkID0gX3JlZjUuZGlzYWJsZWQ7XG4gICAgcmV0dXJuICFkaXNhYmxlZDtcbiAgfSk7XG59XG52YXIgZm9jdXNMb2NrQVBJID0ge1xuICBtb3ZlRm9jdXNJbnNpZGU6IG1vdmVGb2N1c0luc2lkZSxcbiAgZm9jdXNJbnNpZGU6IGZvY3VzSW5zaWRlLFxuICBmb2N1c05leHRFbGVtZW50OiBmb2N1c05leHRFbGVtZW50LFxuICBmb2N1c1ByZXZFbGVtZW50OiBmb2N1c1ByZXZFbGVtZW50LFxuICBmb2N1c0ZpcnN0RWxlbWVudDogZm9jdXNGaXJzdEVsZW1lbnQsXG4gIGZvY3VzTGFzdEVsZW1lbnQ6IGZvY3VzTGFzdEVsZW1lbnQsXG4gIGNhcHR1cmVGb2N1c1Jlc3RvcmU6IGNhcHR1cmVGb2N1c1Jlc3RvcmVcbn07XG5mdW5jdGlvbiBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50KHRyYXBzKSB7XG4gIHZhciB0cmFwID0gdHJhcHMuc2xpY2UoLTEpWzBdO1xuICBpZiAodHJhcCAmJiAhbGFzdEFjdGl2ZVRyYXApIHtcbiAgICBhdHRhY2hIYW5kbGVyKCk7XG4gIH1cbiAgdmFyIGxhc3RUcmFwID0gbGFzdEFjdGl2ZVRyYXA7XG4gIHZhciBzYW1lVHJhcCA9IGxhc3RUcmFwICYmIHRyYXAgJiYgdHJhcC5pZCA9PT0gbGFzdFRyYXAuaWQ7XG4gIGxhc3RBY3RpdmVUcmFwID0gdHJhcDtcbiAgaWYgKGxhc3RUcmFwICYmICFzYW1lVHJhcCkge1xuICAgIGxhc3RUcmFwLm9uRGVhY3RpdmF0aW9uKCk7XG4gICAgaWYgKCF0cmFwcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWY2KSB7XG4gICAgICB2YXIgaWQgPSBfcmVmNi5pZDtcbiAgICAgIHJldHVybiBpZCA9PT0gbGFzdFRyYXAuaWQ7XG4gICAgfSkubGVuZ3RoKSB7XG4gICAgICBsYXN0VHJhcC5yZXR1cm5Gb2N1cyghdHJhcCk7XG4gICAgfVxuICB9XG4gIGlmICh0cmFwKSB7XG4gICAgbGFzdEFjdGl2ZUZvY3VzID0gbnVsbDtcbiAgICBpZiAoIXNhbWVUcmFwIHx8IGxhc3RUcmFwLm9ic2VydmVkICE9PSB0cmFwLm9ic2VydmVkKSB7XG4gICAgICB0cmFwLm9uQWN0aXZhdGlvbihmb2N1c0xvY2tBUEkpO1xuICAgIH1cbiAgICBhY3RpdmF0ZVRyYXAodHJ1ZSk7XG4gICAgZGVmZXJBY3Rpb24oYWN0aXZhdGVUcmFwKTtcbiAgfSBlbHNlIHtcbiAgICBkZXRhY2hIYW5kbGVyKCk7XG4gICAgbGFzdEFjdGl2ZUZvY3VzID0gbnVsbDtcbiAgfVxufVxubWVkaXVtRm9jdXMuYXNzaWduU3luY01lZGl1bShvbkZvY3VzKTtcbm1lZGl1bUJsdXIuYXNzaWduTWVkaXVtKG9uQmx1cik7XG5tZWRpdW1FZmZlY3QuYXNzaWduTWVkaXVtKGZ1bmN0aW9uIChjYikge1xuICByZXR1cm4gY2IoZm9jdXNMb2NrQVBJKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFNpZGVFZmZlY3QocmVkdWNlUHJvcHNUb1N0YXRlLCBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50KShGb2N1c1dhdGNoZXIpOyIsImltcG9ydCBGb2N1c0xvY2tVSSBmcm9tICcuL0xvY2snO1xuaW1wb3J0IEF1dG9Gb2N1c0luc2lkZSBmcm9tICcuL0F1dG9Gb2N1c0luc2lkZSc7XG5pbXBvcnQgTW92ZUZvY3VzSW5zaWRlLCB7IHVzZUZvY3VzSW5zaWRlIH0gZnJvbSAnLi9Nb3ZlRm9jdXNJbnNpZGUnO1xuaW1wb3J0IEZyZWVGb2N1c0luc2lkZSBmcm9tICcuL0ZyZWVGb2N1c0luc2lkZSc7XG5pbXBvcnQgSW5Gb2N1c0d1YXJkIGZyb20gJy4vRm9jdXNHdWFyZCc7XG5pbXBvcnQgeyB1c2VGb2N1c0NvbnRyb2xsZXIsIHVzZUZvY3VzU2NvcGUgfSBmcm9tICcuL3VzZS1mb2N1cy1zY29wZSc7XG5pbXBvcnQgeyB1c2VGb2N1c1N0YXRlIH0gZnJvbSAnLi91c2UtZm9jdXMtc3RhdGUnO1xuZXhwb3J0IHsgQXV0b0ZvY3VzSW5zaWRlLCBNb3ZlRm9jdXNJbnNpZGUsIEZyZWVGb2N1c0luc2lkZSwgSW5Gb2N1c0d1YXJkLCBGb2N1c0xvY2tVSSwgdXNlRm9jdXNJbnNpZGUsIHVzZUZvY3VzQ29udHJvbGxlciwgdXNlRm9jdXNTY29wZSwgdXNlRm9jdXNTdGF0ZSB9O1xuZXhwb3J0IGRlZmF1bHQgRm9jdXNMb2NrVUk7IiwiaW1wb3J0IEZvY3VzTG9jayBmcm9tICcuL0NvbWJpbmF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vVUknO1xuZXhwb3J0IGRlZmF1bHQgRm9jdXNMb2NrOyIsImltcG9ydCB7IGNyZWF0ZU1lZGl1bSwgY3JlYXRlU2lkZWNhck1lZGl1bSB9IGZyb20gJ3VzZS1zaWRlY2FyJztcbmV4cG9ydCB2YXIgbWVkaXVtRm9jdXMgPSBjcmVhdGVNZWRpdW0oe30sIGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciB0YXJnZXQgPSBfcmVmLnRhcmdldCxcbiAgICBjdXJyZW50VGFyZ2V0ID0gX3JlZi5jdXJyZW50VGFyZ2V0O1xuICByZXR1cm4ge1xuICAgIHRhcmdldDogdGFyZ2V0LFxuICAgIGN1cnJlbnRUYXJnZXQ6IGN1cnJlbnRUYXJnZXRcbiAgfTtcbn0pO1xuZXhwb3J0IHZhciBtZWRpdW1CbHVyID0gY3JlYXRlTWVkaXVtKCk7XG5leHBvcnQgdmFyIG1lZGl1bUVmZmVjdCA9IGNyZWF0ZU1lZGl1bSgpO1xuZXhwb3J0IHZhciBtZWRpdW1TaWRlY2FyID0gY3JlYXRlU2lkZWNhck1lZGl1bSh7XG4gIGFzeW5jOiB0cnVlLFxuICBzc3I6IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcbn0pOyIsImV4cG9ydCB2YXIgY3JlYXRlTmFub0V2ZW50cyA9IGZ1bmN0aW9uIGNyZWF0ZU5hbm9FdmVudHMoKSB7XG4gIHJldHVybiB7XG4gICAgZW1pdDogZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwLCBjYWxsYmFja3MgPSB0aGlzLmV2ZW50c1tldmVudF0gfHwgW10sIGxlbmd0aCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjYWxsYmFja3NbaV0uYXBwbHkoY2FsbGJhY2tzLCBhcmdzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV2ZW50czoge30sXG4gICAgb246IGZ1bmN0aW9uIG9uKGV2ZW50LCBjYikge1xuICAgICAgdmFyIF90aGlzJGV2ZW50cyxcbiAgICAgICAgX3RoaXMgPSB0aGlzO1xuICAgICAgKChfdGhpcyRldmVudHMgPSB0aGlzLmV2ZW50cylbZXZlbnRdIHx8IChfdGhpcyRldmVudHNbZXZlbnRdID0gW10pKS5wdXNoKGNiKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyRldmVudHMkZXZlbnQ7XG4gICAgICAgIF90aGlzLmV2ZW50c1tldmVudF0gPSAoX3RoaXMkZXZlbnRzJGV2ZW50ID0gX3RoaXMuZXZlbnRzW2V2ZW50XSkgPT0gbnVsbCA/IHZvaWQgMCA6IF90aGlzJGV2ZW50cyRldmVudC5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICByZXR1cm4gY2IgIT09IGk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59OyIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5leHBvcnQgdmFyIGZvY3VzU2NvcGUgPSAvKiNfX1BVUkVfXyovY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZm9jdXNTY29wZSB9IGZyb20gJy4vc2NvcGUnO1xuaW1wb3J0IHsgbWVkaXVtRWZmZWN0IH0gZnJvbSAnLi9tZWRpdW0nO1xuaW1wb3J0IHsgZXh0cmFjdFJlZiB9IGZyb20gJy4vdXRpbCc7XG52YXIgY29sbGFwc2VSZWZzID0gZnVuY3Rpb24gY29sbGFwc2VSZWZzKHNoYXJkcykge1xuICByZXR1cm4gc2hhcmRzLm1hcChleHRyYWN0UmVmKS5maWx0ZXIoQm9vbGVhbik7XG59O1xudmFyIHdpdGhNZWRpdW0gPSBmdW5jdGlvbiB3aXRoTWVkaXVtKGZuKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIHJldHVybiBtZWRpdW1FZmZlY3QudXNlTWVkaXVtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc29sdmUoZm4uYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuZXhwb3J0IHZhciB1c2VGb2N1c0NvbnRyb2xsZXIgPSBmdW5jdGlvbiB1c2VGb2N1c0NvbnRyb2xsZXIoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzaGFyZHMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc2hhcmRzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIGlmICghc2hhcmRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlRm9jdXNDb250cm9sbGVyIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB0YXJnZXQgZWxlbWVudCcpO1xuICB9XG4gIHZhciByZWYgPSB1c2VSZWYoc2hhcmRzKTtcbiAgcmVmLmN1cnJlbnQgPSBzaGFyZHM7XG4gIHJldHVybiB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXV0b0ZvY3VzOiBmdW5jdGlvbiBhdXRvRm9jdXMoZm9jdXNPcHRpb25zKSB7XG4gICAgICAgIGlmIChmb2N1c09wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGZvY3VzT3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aXRoTWVkaXVtKGZ1bmN0aW9uIChjYXIpIHtcbiAgICAgICAgICByZXR1cm4gY2FyLm1vdmVGb2N1c0luc2lkZShjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpLCBudWxsLCBmb2N1c09wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmb2N1c05leHQ6IGZ1bmN0aW9uIGZvY3VzTmV4dChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB3aXRoTWVkaXVtKGZ1bmN0aW9uIChjYXIpIHtcbiAgICAgICAgICBjYXIubW92ZUZvY3VzSW5zaWRlKGNvbGxhcHNlUmVmcyhyZWYuY3VycmVudCksIG51bGwpO1xuICAgICAgICAgIGNhci5mb2N1c05leHRFbGVtZW50KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIF9leHRlbmRzKHtcbiAgICAgICAgICAgIHNjb3BlOiBjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpXG4gICAgICAgICAgfSwgb3B0aW9ucykpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmb2N1c1ByZXY6IGZ1bmN0aW9uIGZvY3VzUHJldihvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB3aXRoTWVkaXVtKGZ1bmN0aW9uIChjYXIpIHtcbiAgICAgICAgICBjYXIubW92ZUZvY3VzSW5zaWRlKGNvbGxhcHNlUmVmcyhyZWYuY3VycmVudCksIG51bGwpO1xuICAgICAgICAgIGNhci5mb2N1c1ByZXZFbGVtZW50KGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIF9leHRlbmRzKHtcbiAgICAgICAgICAgIHNjb3BlOiBjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpXG4gICAgICAgICAgfSwgb3B0aW9ucykpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmb2N1c0ZpcnN0OiBmdW5jdGlvbiBmb2N1c0ZpcnN0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhNZWRpdW0oZnVuY3Rpb24gKGNhcikge1xuICAgICAgICAgIGNhci5mb2N1c0ZpcnN0RWxlbWVudChjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZm9jdXNMYXN0OiBmdW5jdGlvbiBmb2N1c0xhc3Qob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gd2l0aE1lZGl1bShmdW5jdGlvbiAoY2FyKSB7XG4gICAgICAgICAgY2FyLmZvY3VzTGFzdEVsZW1lbnQoY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KSwgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcbn07XG5leHBvcnQgdmFyIHVzZUZvY3VzU2NvcGUgPSBmdW5jdGlvbiB1c2VGb2N1c1Njb3BlKCkge1xuICB2YXIgc2NvcGUgPSB1c2VDb250ZXh0KGZvY3VzU2NvcGUpO1xuICBpZiAoIXNjb3BlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGb2N1c0xvY2sgaXMgcmVxdWlyZWQgdG8gb3BlcmF0ZSB3aXRoIEZvY3VzU2NvcGUnKTtcbiAgfVxuICByZXR1cm4gdXNlRm9jdXNDb250cm9sbGVyLmFwcGx5KHZvaWQgMCwgW3Njb3BlLm9ic2VydmVkXS5jb25jYXQoc2NvcGUuc2hhcmRzKSk7XG59OyIsImltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVOYW5vRXZlbnRzIH0gZnJvbSAnLi9uYW5vLWV2ZW50cyc7XG52YXIgbWFpbmJ1cyA9IGNyZWF0ZU5hbm9FdmVudHMoKTtcbnZhciBzdWJzY3JpYmVDb3VudGVyID0gMDtcbnZhciBvbkZvY3VzSW4gPSBmdW5jdGlvbiBvbkZvY3VzSW4oZXZlbnQpIHtcbiAgcmV0dXJuIG1haW5idXMuZW1pdCgnYXNzaWduJywgZXZlbnQudGFyZ2V0KTtcbn07XG52YXIgb25Gb2N1c091dCA9IGZ1bmN0aW9uIG9uRm9jdXNPdXQoZXZlbnQpIHtcbiAgcmV0dXJuIG1haW5idXMuZW1pdCgncmVzZXQnLCBldmVudC50YXJnZXQpO1xufTtcbnZhciB1c2VEb2N1bWVudEZvY3VzU3Vic2NyaWJlID0gZnVuY3Rpb24gdXNlRG9jdW1lbnRGb2N1c1N1YnNjcmliZSgpIHtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN1YnNjcmliZUNvdW50ZXIpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvbkZvY3VzSW4pO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBvbkZvY3VzT3V0KTtcbiAgICB9XG4gICAgc3Vic2NyaWJlQ291bnRlciArPSAxO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBzdWJzY3JpYmVDb3VudGVyIC09IDE7XG4gICAgICBpZiAoIXN1YnNjcmliZUNvdW50ZXIpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG9uRm9jdXNJbik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25Gb2N1c091dCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW10pO1xufTtcbnZhciBnZXRGb2N1c1N0YXRlID0gZnVuY3Rpb24gZ2V0Rm9jdXNTdGF0ZSh0YXJnZXQsIGN1cnJlbnQpIHtcbiAgaWYgKHRhcmdldCA9PT0gY3VycmVudCkge1xuICAgIHJldHVybiAnc2VsZic7XG4gIH1cbiAgaWYgKGN1cnJlbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgIHJldHVybiAnd2l0aGluJztcbiAgfVxuICByZXR1cm4gJ3dpdGhpbi1ib3VuZGFyeSc7XG59O1xuZXhwb3J0IHZhciB1c2VGb2N1c1N0YXRlID0gZnVuY3Rpb24gdXNlRm9jdXNTdGF0ZShjYWxsYmFja3MpIHtcbiAgaWYgKGNhbGxiYWNrcyA9PT0gdm9pZCAwKSB7XG4gICAgY2FsbGJhY2tzID0ge307XG4gIH1cbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKGZhbHNlKSxcbiAgICBhY3RpdmUgPSBfdXNlU3RhdGVbMF0sXG4gICAgc2V0QWN0aXZlID0gX3VzZVN0YXRlWzFdO1xuICB2YXIgX3VzZVN0YXRlMiA9IHVzZVN0YXRlKCcnKSxcbiAgICBzdGF0ZSA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3RhdGUgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgcmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgZm9jdXNTdGF0ZSA9IHVzZVJlZih7fSk7XG4gIHZhciBzdGF0ZVRyYWNrZXIgPSB1c2VSZWYoZmFsc2UpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChyZWYuY3VycmVudCkge1xuICAgICAgdmFyIGlzQWxyZWFkeUZvY3VzZWQgPSByZWYuY3VycmVudCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB8fCByZWYuY3VycmVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAgIHNldEFjdGl2ZShpc0FscmVhZHlGb2N1c2VkKTtcbiAgICAgIHNldFN0YXRlKGdldEZvY3VzU3RhdGUoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCwgcmVmLmN1cnJlbnQpKTtcbiAgICAgIGlmIChpc0FscmVhZHlGb2N1c2VkICYmIGNhbGxiYWNrcy5vbkZvY3VzKSB7XG4gICAgICAgIGNhbGxiYWNrcy5vbkZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbXSk7XG4gIHZhciBvbkZvY3VzID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKGUpIHtcbiAgICBmb2N1c1N0YXRlLmN1cnJlbnQgPSB7XG4gICAgICBmb2N1c2VkOiB0cnVlLFxuICAgICAgc3RhdGU6IGdldEZvY3VzU3RhdGUoZS50YXJnZXQsIGUuY3VycmVudFRhcmdldClcbiAgICB9O1xuICB9LCBbXSk7XG4gIHVzZURvY3VtZW50Rm9jdXNTdWJzY3JpYmUoKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZm91dCA9IG1haW5idXMub24oJ3Jlc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9jdXNTdGF0ZS5jdXJyZW50ID0ge307XG4gICAgfSk7XG4gICAgdmFyIGZpbiA9IG1haW5idXMub24oJ2Fzc2lnbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGZvY3VzU3RhdGUuY3VycmVudC5mb2N1c2VkIHx8IGZhbHNlO1xuICAgICAgc2V0QWN0aXZlKG5ld1N0YXRlKTtcbiAgICAgIHNldFN0YXRlKGZvY3VzU3RhdGUuY3VycmVudC5zdGF0ZSB8fCAnJyk7XG4gICAgICBpZiAobmV3U3RhdGUgIT09IHN0YXRlVHJhY2tlci5jdXJyZW50KSB7XG4gICAgICAgIHN0YXRlVHJhY2tlci5jdXJyZW50ID0gbmV3U3RhdGU7XG4gICAgICAgIGlmIChuZXdTdGF0ZSkge1xuICAgICAgICAgIGNhbGxiYWNrcy5vbkZvY3VzICYmIGNhbGxiYWNrcy5vbkZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2tzLm9uQmx1ciAmJiBjYWxsYmFja3Mub25CbHVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZm91dCgpO1xuICAgICAgZmluKCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4ge1xuICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgIHN0YXRlOiBzdGF0ZSxcbiAgICBvbkZvY3VzOiBvbkZvY3VzLFxuICAgIHJlZjogcmVmXG4gIH07XG59OyIsImV4cG9ydCBmdW5jdGlvbiBkZWZlckFjdGlvbihhY3Rpb24pIHtcbiAgc2V0VGltZW91dChhY3Rpb24sIDEpO1xufVxuZXhwb3J0IHZhciBpbmxpbmVQcm9wID0gZnVuY3Rpb24gaW5saW5lUHJvcChuYW1lLCB2YWx1ZSkge1xuICB2YXIgb2JqID0ge307XG4gIG9ialtuYW1lXSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufTtcbmV4cG9ydCB2YXIgZXh0cmFjdFJlZiA9IGZ1bmN0aW9uIGV4dHJhY3RSZWYocmVmKSB7XG4gIHJldHVybiByZWYgJiYgJ2N1cnJlbnQnIGluIHJlZiA/IHJlZi5jdXJyZW50IDogcmVmO1xufTsiLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpdGhTaWRlRWZmZWN0IGZyb20gJ3JlYWN0LXNpZGUtZWZmZWN0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ3JlYWN0LWZhc3QtY29tcGFyZSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IG9iamVjdEFzc2lnbiBmcm9tICdvYmplY3QtYXNzaWduJztcblxudmFyIEFUVFJJQlVURV9OQU1FUyA9IHtcbiAgICBCT0RZOiBcImJvZHlBdHRyaWJ1dGVzXCIsXG4gICAgSFRNTDogXCJodG1sQXR0cmlidXRlc1wiLFxuICAgIFRJVExFOiBcInRpdGxlQXR0cmlidXRlc1wiXG59O1xuXG52YXIgVEFHX05BTUVTID0ge1xuICAgIEJBU0U6IFwiYmFzZVwiLFxuICAgIEJPRFk6IFwiYm9keVwiLFxuICAgIEhFQUQ6IFwiaGVhZFwiLFxuICAgIEhUTUw6IFwiaHRtbFwiLFxuICAgIExJTks6IFwibGlua1wiLFxuICAgIE1FVEE6IFwibWV0YVwiLFxuICAgIE5PU0NSSVBUOiBcIm5vc2NyaXB0XCIsXG4gICAgU0NSSVBUOiBcInNjcmlwdFwiLFxuICAgIFNUWUxFOiBcInN0eWxlXCIsXG4gICAgVElUTEU6IFwidGl0bGVcIlxufTtcblxudmFyIFZBTElEX1RBR19OQU1FUyA9IE9iamVjdC5rZXlzKFRBR19OQU1FUykubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIFRBR19OQU1FU1tuYW1lXTtcbn0pO1xuXG52YXIgVEFHX1BST1BFUlRJRVMgPSB7XG4gICAgQ0hBUlNFVDogXCJjaGFyc2V0XCIsXG4gICAgQ1NTX1RFWFQ6IFwiY3NzVGV4dFwiLFxuICAgIEhSRUY6IFwiaHJlZlwiLFxuICAgIEhUVFBFUVVJVjogXCJodHRwLWVxdWl2XCIsXG4gICAgSU5ORVJfSFRNTDogXCJpbm5lckhUTUxcIixcbiAgICBJVEVNX1BST1A6IFwiaXRlbXByb3BcIixcbiAgICBOQU1FOiBcIm5hbWVcIixcbiAgICBQUk9QRVJUWTogXCJwcm9wZXJ0eVwiLFxuICAgIFJFTDogXCJyZWxcIixcbiAgICBTUkM6IFwic3JjXCIsXG4gICAgVEFSR0VUOiBcInRhcmdldFwiXG59O1xuXG52YXIgUkVBQ1RfVEFHX01BUCA9IHtcbiAgICBhY2Nlc3NrZXk6IFwiYWNjZXNzS2V5XCIsXG4gICAgY2hhcnNldDogXCJjaGFyU2V0XCIsXG4gICAgY2xhc3M6IFwiY2xhc3NOYW1lXCIsXG4gICAgY29udGVudGVkaXRhYmxlOiBcImNvbnRlbnRFZGl0YWJsZVwiLFxuICAgIGNvbnRleHRtZW51OiBcImNvbnRleHRNZW51XCIsXG4gICAgXCJodHRwLWVxdWl2XCI6IFwiaHR0cEVxdWl2XCIsXG4gICAgaXRlbXByb3A6IFwiaXRlbVByb3BcIixcbiAgICB0YWJpbmRleDogXCJ0YWJJbmRleFwiXG59O1xuXG52YXIgSEVMTUVUX1BST1BTID0ge1xuICAgIERFRkFVTFRfVElUTEU6IFwiZGVmYXVsdFRpdGxlXCIsXG4gICAgREVGRVI6IFwiZGVmZXJcIixcbiAgICBFTkNPREVfU1BFQ0lBTF9DSEFSQUNURVJTOiBcImVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzXCIsXG4gICAgT05fQ0hBTkdFX0NMSUVOVF9TVEFURTogXCJvbkNoYW5nZUNsaWVudFN0YXRlXCIsXG4gICAgVElUTEVfVEVNUExBVEU6IFwidGl0bGVUZW1wbGF0ZVwiXG59O1xuXG52YXIgSFRNTF9UQUdfTUFQID0gT2JqZWN0LmtleXMoUkVBQ1RfVEFHX01BUCkucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAgIG9ialtSRUFDVF9UQUdfTUFQW2tleV1dID0ga2V5O1xuICAgIHJldHVybiBvYmo7XG59LCB7fSk7XG5cbnZhciBTRUxGX0NMT1NJTkdfVEFHUyA9IFtUQUdfTkFNRVMuTk9TQ1JJUFQsIFRBR19OQU1FUy5TQ1JJUFQsIFRBR19OQU1FUy5TVFlMRV07XG5cbnZhciBIRUxNRVRfQVRUUklCVVRFID0gXCJkYXRhLXJlYWN0LWhlbG1ldFwiO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iajtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xufTtcblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBpbmhlcml0cyA9IGZ1bmN0aW9uIChzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzcztcbn07XG5cbnZhciBvYmplY3RXaXRob3V0UHJvcGVydGllcyA9IGZ1bmN0aW9uIChvYmosIGtleXMpIHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuXG4gIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTtcbiAgICB0YXJnZXRbaV0gPSBvYmpbaV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxudmFyIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gPSBmdW5jdGlvbiAoc2VsZiwgY2FsbCkge1xuICBpZiAoIXNlbGYpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjtcbn07XG5cbnZhciBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVycyA9IGZ1bmN0aW9uIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzKHN0cikge1xuICAgIHZhciBlbmNvZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG5cbiAgICBpZiAoZW5jb2RlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKS5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKS5yZXBsYWNlKC8nL2csIFwiJiN4Mjc7XCIpO1xufTtcblxudmFyIGdldFRpdGxlRnJvbVByb3BzTGlzdCA9IGZ1bmN0aW9uIGdldFRpdGxlRnJvbVByb3BzTGlzdChwcm9wc0xpc3QpIHtcbiAgICB2YXIgaW5uZXJtb3N0VGl0bGUgPSBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIFRBR19OQU1FUy5USVRMRSk7XG4gICAgdmFyIGlubmVybW9zdFRlbXBsYXRlID0gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuVElUTEVfVEVNUExBVEUpO1xuXG4gICAgaWYgKGlubmVybW9zdFRlbXBsYXRlICYmIGlubmVybW9zdFRpdGxlKSB7XG4gICAgICAgIC8vIHVzZSBmdW5jdGlvbiBhcmcgdG8gYXZvaWQgbmVlZCB0byBlc2NhcGUgJCBjaGFyYWN0ZXJzXG4gICAgICAgIHJldHVybiBpbm5lcm1vc3RUZW1wbGF0ZS5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShpbm5lcm1vc3RUaXRsZSkgPyBpbm5lcm1vc3RUaXRsZS5qb2luKFwiXCIpIDogaW5uZXJtb3N0VGl0bGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBpbm5lcm1vc3REZWZhdWx0VGl0bGUgPSBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIEhFTE1FVF9QUk9QUy5ERUZBVUxUX1RJVExFKTtcblxuICAgIHJldHVybiBpbm5lcm1vc3RUaXRsZSB8fCBpbm5lcm1vc3REZWZhdWx0VGl0bGUgfHwgdW5kZWZpbmVkO1xufTtcblxudmFyIGdldE9uQ2hhbmdlQ2xpZW50U3RhdGUgPSBmdW5jdGlvbiBnZXRPbkNoYW5nZUNsaWVudFN0YXRlKHByb3BzTGlzdCkge1xuICAgIHJldHVybiBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIEhFTE1FVF9QUk9QUy5PTl9DSEFOR0VfQ0xJRU5UX1NUQVRFKSB8fCBmdW5jdGlvbiAoKSB7fTtcbn07XG5cbnZhciBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdCA9IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZXNGcm9tUHJvcHNMaXN0KHRhZ1R5cGUsIHByb3BzTGlzdCkge1xuICAgIHJldHVybiBwcm9wc0xpc3QuZmlsdGVyKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHByb3BzW3RhZ1R5cGVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIH0pLm1hcChmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHByb3BzW3RhZ1R5cGVdO1xuICAgIH0pLnJlZHVjZShmdW5jdGlvbiAodGFnQXR0cnMsIGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCB0YWdBdHRycywgY3VycmVudCk7XG4gICAgfSwge30pO1xufTtcblxudmFyIGdldEJhc2VUYWdGcm9tUHJvcHNMaXN0ID0gZnVuY3Rpb24gZ2V0QmFzZVRhZ0Zyb21Qcm9wc0xpc3QocHJpbWFyeUF0dHJpYnV0ZXMsIHByb3BzTGlzdCkge1xuICAgIHJldHVybiBwcm9wc0xpc3QuZmlsdGVyKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHByb3BzW1RBR19OQU1FUy5CQVNFXSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgIHJldHVybiBwcm9wc1tUQUdfTkFNRVMuQkFTRV07XG4gICAgfSkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoaW5uZXJtb3N0QmFzZVRhZywgdGFnKSB7XG4gICAgICAgIGlmICghaW5uZXJtb3N0QmFzZVRhZy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGFnKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZUtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGxvd2VyQ2FzZUF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZUtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHByaW1hcnlBdHRyaWJ1dGVzLmluZGV4T2YobG93ZXJDYXNlQXR0cmlidXRlS2V5KSAhPT0gLTEgJiYgdGFnW2xvd2VyQ2FzZUF0dHJpYnV0ZUtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlubmVybW9zdEJhc2VUYWcuY29uY2F0KHRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlubmVybW9zdEJhc2VUYWc7XG4gICAgfSwgW10pO1xufTtcblxudmFyIGdldFRhZ3NGcm9tUHJvcHNMaXN0ID0gZnVuY3Rpb24gZ2V0VGFnc0Zyb21Qcm9wc0xpc3QodGFnTmFtZSwgcHJpbWFyeUF0dHJpYnV0ZXMsIHByb3BzTGlzdCkge1xuICAgIC8vIENhbGN1bGF0ZSBsaXN0IG9mIHRhZ3MsIGdpdmluZyBwcmlvcml0eSBpbm5lcm1vc3QgY29tcG9uZW50IChlbmQgb2YgdGhlIHByb3BzbGlzdClcbiAgICB2YXIgYXBwcm92ZWRTZWVuVGFncyA9IHt9O1xuXG4gICAgcmV0dXJuIHByb3BzTGlzdC5maWx0ZXIoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BzW3RhZ05hbWVdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wc1t0YWdOYW1lXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgd2FybihcIkhlbG1ldDogXCIgKyB0YWdOYW1lICsgXCIgc2hvdWxkIGJlIG9mIHR5cGUgXFxcIkFycmF5XFxcIi4gSW5zdGVhZCBmb3VuZCB0eXBlIFxcXCJcIiArIF90eXBlb2YocHJvcHNbdGFnTmFtZV0pICsgXCJcXFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgIHJldHVybiBwcm9wc1t0YWdOYW1lXTtcbiAgICB9KS5yZXZlcnNlKCkucmVkdWNlKGZ1bmN0aW9uIChhcHByb3ZlZFRhZ3MsIGluc3RhbmNlVGFncykge1xuICAgICAgICB2YXIgaW5zdGFuY2VTZWVuVGFncyA9IHt9O1xuXG4gICAgICAgIGluc3RhbmNlVGFncy5maWx0ZXIoZnVuY3Rpb24gKHRhZykge1xuICAgICAgICAgICAgdmFyIHByaW1hcnlBdHRyaWJ1dGVLZXkgPSB2b2lkIDA7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRhZyk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlS2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgbG93ZXJDYXNlQXR0cmlidXRlS2V5ID0gYXR0cmlidXRlS2V5LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIHJ1bGUgd2l0aCBsaW5rIHRhZ3MsIHNpbmNlIHJlbCBhbmQgaHJlZiBhcmUgYm90aCBwcmltYXJ5IHRhZ3MsIHJlbCB0YWtlcyBwcmlvcml0eVxuICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5QXR0cmlidXRlcy5pbmRleE9mKGxvd2VyQ2FzZUF0dHJpYnV0ZUtleSkgIT09IC0xICYmICEocHJpbWFyeUF0dHJpYnV0ZUtleSA9PT0gVEFHX1BST1BFUlRJRVMuUkVMICYmIHRhZ1twcmltYXJ5QXR0cmlidXRlS2V5XS50b0xvd2VyQ2FzZSgpID09PSBcImNhbm9uaWNhbFwiKSAmJiAhKGxvd2VyQ2FzZUF0dHJpYnV0ZUtleSA9PT0gVEFHX1BST1BFUlRJRVMuUkVMICYmIHRhZ1tsb3dlckNhc2VBdHRyaWJ1dGVLZXldLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVzaGVldFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QXR0cmlidXRlS2V5ID0gbG93ZXJDYXNlQXR0cmlidXRlS2V5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGlubmVySFRNTCB3aGljaCBkb2Vzbid0IHdvcmsgbG93ZXJjYXNlZFxuICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5QXR0cmlidXRlcy5pbmRleE9mKGF0dHJpYnV0ZUtleSkgIT09IC0xICYmIChhdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLklOTkVSX0hUTUwgfHwgYXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5DU1NfVEVYVCB8fCBhdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLklURU1fUFJPUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZUtleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghcHJpbWFyeUF0dHJpYnV0ZUtleSB8fCAhdGFnW3ByaW1hcnlBdHRyaWJ1dGVLZXldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0YWdbcHJpbWFyeUF0dHJpYnV0ZUtleV0udG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKCFhcHByb3ZlZFNlZW5UYWdzW3ByaW1hcnlBdHRyaWJ1dGVLZXldKSB7XG4gICAgICAgICAgICAgICAgYXBwcm92ZWRTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWluc3RhbmNlU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV0pIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVNlZW5UYWdzW3ByaW1hcnlBdHRyaWJ1dGVLZXldID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghYXBwcm92ZWRTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XVt2YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVNlZW5UYWdzW3ByaW1hcnlBdHRyaWJ1dGVLZXldW3ZhbHVlXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSkucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24gKHRhZykge1xuICAgICAgICAgICAgcmV0dXJuIGFwcHJvdmVkVGFncy5wdXNoKHRhZyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzZWVuIHRhZ3Mgd2l0aCB0YWdzIGZyb20gdGhpcyBpbnN0YW5jZVxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGluc3RhbmNlU2VlblRhZ3MpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVLZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgdmFyIHRhZ1VuaW9uID0gb2JqZWN0QXNzaWduKHt9LCBhcHByb3ZlZFNlZW5UYWdzW2F0dHJpYnV0ZUtleV0sIGluc3RhbmNlU2VlblRhZ3NbYXR0cmlidXRlS2V5XSk7XG5cbiAgICAgICAgICAgIGFwcHJvdmVkU2VlblRhZ3NbYXR0cmlidXRlS2V5XSA9IHRhZ1VuaW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcHJvdmVkVGFncztcbiAgICB9LCBbXSkucmV2ZXJzZSgpO1xufTtcblxudmFyIGdldElubmVybW9zdFByb3BlcnR5ID0gZnVuY3Rpb24gZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBwcm9wZXJ0eSkge1xuICAgIGZvciAodmFyIGkgPSBwcm9wc0xpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIHByb3BzID0gcHJvcHNMaXN0W2ldO1xuXG4gICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wc1twcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciByZWR1Y2VQcm9wc1RvU3RhdGUgPSBmdW5jdGlvbiByZWR1Y2VQcm9wc1RvU3RhdGUocHJvcHNMaXN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZVRhZzogZ2V0QmFzZVRhZ0Zyb21Qcm9wc0xpc3QoW1RBR19QUk9QRVJUSUVTLkhSRUYsIFRBR19QUk9QRVJUSUVTLlRBUkdFVF0sIHByb3BzTGlzdCksXG4gICAgICAgIGJvZHlBdHRyaWJ1dGVzOiBnZXRBdHRyaWJ1dGVzRnJvbVByb3BzTGlzdChBVFRSSUJVVEVfTkFNRVMuQk9EWSwgcHJvcHNMaXN0KSxcbiAgICAgICAgZGVmZXI6IGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgSEVMTUVUX1BST1BTLkRFRkVSKSxcbiAgICAgICAgZW5jb2RlOiBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIEhFTE1FVF9QUk9QUy5FTkNPREVfU1BFQ0lBTF9DSEFSQUNURVJTKSxcbiAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IGdldEF0dHJpYnV0ZXNGcm9tUHJvcHNMaXN0KEFUVFJJQlVURV9OQU1FUy5IVE1MLCBwcm9wc0xpc3QpLFxuICAgICAgICBsaW5rVGFnczogZ2V0VGFnc0Zyb21Qcm9wc0xpc3QoVEFHX05BTUVTLkxJTkssIFtUQUdfUFJPUEVSVElFUy5SRUwsIFRBR19QUk9QRVJUSUVTLkhSRUZdLCBwcm9wc0xpc3QpLFxuICAgICAgICBtZXRhVGFnczogZ2V0VGFnc0Zyb21Qcm9wc0xpc3QoVEFHX05BTUVTLk1FVEEsIFtUQUdfUFJPUEVSVElFUy5OQU1FLCBUQUdfUFJPUEVSVElFUy5DSEFSU0VULCBUQUdfUFJPUEVSVElFUy5IVFRQRVFVSVYsIFRBR19QUk9QRVJUSUVTLlBST1BFUlRZLCBUQUdfUFJPUEVSVElFUy5JVEVNX1BST1BdLCBwcm9wc0xpc3QpLFxuICAgICAgICBub3NjcmlwdFRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5OT1NDUklQVCwgW1RBR19QUk9QRVJUSUVTLklOTkVSX0hUTUxdLCBwcm9wc0xpc3QpLFxuICAgICAgICBvbkNoYW5nZUNsaWVudFN0YXRlOiBnZXRPbkNoYW5nZUNsaWVudFN0YXRlKHByb3BzTGlzdCksXG4gICAgICAgIHNjcmlwdFRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5TQ1JJUFQsIFtUQUdfUFJPUEVSVElFUy5TUkMsIFRBR19QUk9QRVJUSUVTLklOTkVSX0hUTUxdLCBwcm9wc0xpc3QpLFxuICAgICAgICBzdHlsZVRhZ3M6IGdldFRhZ3NGcm9tUHJvcHNMaXN0KFRBR19OQU1FUy5TVFlMRSwgW1RBR19QUk9QRVJUSUVTLkNTU19URVhUXSwgcHJvcHNMaXN0KSxcbiAgICAgICAgdGl0bGU6IGdldFRpdGxlRnJvbVByb3BzTGlzdChwcm9wc0xpc3QpLFxuICAgICAgICB0aXRsZUF0dHJpYnV0ZXM6IGdldEF0dHJpYnV0ZXNGcm9tUHJvcHNMaXN0KEFUVFJJQlVURV9OQU1FUy5USVRMRSwgcHJvcHNMaXN0KVxuICAgIH07XG59O1xuXG52YXIgcmFmUG9seWZpbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNsb2NrID0gRGF0ZS5ub3coKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICBpZiAoY3VycmVudFRpbWUgLSBjbG9jayA+IDE2KSB7XG4gICAgICAgICAgICBjbG9jayA9IGN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgY2FsbGJhY2soY3VycmVudFRpbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmFmUG9seWZpbGwoY2FsbGJhY2spO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9O1xufSgpO1xuXG52YXIgY2FmUG9seWZpbGwgPSBmdW5jdGlvbiBjYWZQb2x5ZmlsbChpZCkge1xuICAgIHJldHVybiBjbGVhclRpbWVvdXQoaWQpO1xufTtcblxudmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIHx8IHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCByYWZQb2x5ZmlsbCA6IGdsb2JhbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgcmFmUG9seWZpbGw7XG5cbnZhciBjYW5jZWxBbmltYXRpb25GcmFtZSA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSB8fCBjYWZQb2x5ZmlsbCA6IGdsb2JhbC5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCBjYWZQb2x5ZmlsbDtcblxudmFyIHdhcm4gPSBmdW5jdGlvbiB3YXJuKG1zZykge1xuICAgIHJldHVybiBjb25zb2xlICYmIHR5cGVvZiBjb25zb2xlLndhcm4gPT09IFwiZnVuY3Rpb25cIiAmJiBjb25zb2xlLndhcm4obXNnKTtcbn07XG5cbnZhciBfaGVsbWV0Q2FsbGJhY2sgPSBudWxsO1xuXG52YXIgaGFuZGxlQ2xpZW50U3RhdGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDbGllbnRTdGF0ZUNoYW5nZShuZXdTdGF0ZSkge1xuICAgIGlmIChfaGVsbWV0Q2FsbGJhY2spIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX2hlbG1ldENhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBpZiAobmV3U3RhdGUuZGVmZXIpIHtcbiAgICAgICAgX2hlbG1ldENhbGxiYWNrID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbW1pdFRhZ0NoYW5nZXMobmV3U3RhdGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfaGVsbWV0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbW1pdFRhZ0NoYW5nZXMobmV3U3RhdGUpO1xuICAgICAgICBfaGVsbWV0Q2FsbGJhY2sgPSBudWxsO1xuICAgIH1cbn07XG5cbnZhciBjb21taXRUYWdDaGFuZ2VzID0gZnVuY3Rpb24gY29tbWl0VGFnQ2hhbmdlcyhuZXdTdGF0ZSwgY2IpIHtcbiAgICB2YXIgYmFzZVRhZyA9IG5ld1N0YXRlLmJhc2VUYWcsXG4gICAgICAgIGJvZHlBdHRyaWJ1dGVzID0gbmV3U3RhdGUuYm9keUF0dHJpYnV0ZXMsXG4gICAgICAgIGh0bWxBdHRyaWJ1dGVzID0gbmV3U3RhdGUuaHRtbEF0dHJpYnV0ZXMsXG4gICAgICAgIGxpbmtUYWdzID0gbmV3U3RhdGUubGlua1RhZ3MsXG4gICAgICAgIG1ldGFUYWdzID0gbmV3U3RhdGUubWV0YVRhZ3MsXG4gICAgICAgIG5vc2NyaXB0VGFncyA9IG5ld1N0YXRlLm5vc2NyaXB0VGFncyxcbiAgICAgICAgb25DaGFuZ2VDbGllbnRTdGF0ZSA9IG5ld1N0YXRlLm9uQ2hhbmdlQ2xpZW50U3RhdGUsXG4gICAgICAgIHNjcmlwdFRhZ3MgPSBuZXdTdGF0ZS5zY3JpcHRUYWdzLFxuICAgICAgICBzdHlsZVRhZ3MgPSBuZXdTdGF0ZS5zdHlsZVRhZ3MsXG4gICAgICAgIHRpdGxlID0gbmV3U3RhdGUudGl0bGUsXG4gICAgICAgIHRpdGxlQXR0cmlidXRlcyA9IG5ld1N0YXRlLnRpdGxlQXR0cmlidXRlcztcblxuICAgIHVwZGF0ZUF0dHJpYnV0ZXMoVEFHX05BTUVTLkJPRFksIGJvZHlBdHRyaWJ1dGVzKTtcbiAgICB1cGRhdGVBdHRyaWJ1dGVzKFRBR19OQU1FUy5IVE1MLCBodG1sQXR0cmlidXRlcyk7XG5cbiAgICB1cGRhdGVUaXRsZSh0aXRsZSwgdGl0bGVBdHRyaWJ1dGVzKTtcblxuICAgIHZhciB0YWdVcGRhdGVzID0ge1xuICAgICAgICBiYXNlVGFnOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5CQVNFLCBiYXNlVGFnKSxcbiAgICAgICAgbGlua1RhZ3M6IHVwZGF0ZVRhZ3MoVEFHX05BTUVTLkxJTkssIGxpbmtUYWdzKSxcbiAgICAgICAgbWV0YVRhZ3M6IHVwZGF0ZVRhZ3MoVEFHX05BTUVTLk1FVEEsIG1ldGFUYWdzKSxcbiAgICAgICAgbm9zY3JpcHRUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5OT1NDUklQVCwgbm9zY3JpcHRUYWdzKSxcbiAgICAgICAgc2NyaXB0VGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuU0NSSVBULCBzY3JpcHRUYWdzKSxcbiAgICAgICAgc3R5bGVUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5TVFlMRSwgc3R5bGVUYWdzKVxuICAgIH07XG5cbiAgICB2YXIgYWRkZWRUYWdzID0ge307XG4gICAgdmFyIHJlbW92ZWRUYWdzID0ge307XG5cbiAgICBPYmplY3Qua2V5cyh0YWdVcGRhdGVzKS5mb3JFYWNoKGZ1bmN0aW9uICh0YWdUeXBlKSB7XG4gICAgICAgIHZhciBfdGFnVXBkYXRlcyR0YWdUeXBlID0gdGFnVXBkYXRlc1t0YWdUeXBlXSxcbiAgICAgICAgICAgIG5ld1RhZ3MgPSBfdGFnVXBkYXRlcyR0YWdUeXBlLm5ld1RhZ3MsXG4gICAgICAgICAgICBvbGRUYWdzID0gX3RhZ1VwZGF0ZXMkdGFnVHlwZS5vbGRUYWdzO1xuXG5cbiAgICAgICAgaWYgKG5ld1RhZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZGRlZFRhZ3NbdGFnVHlwZV0gPSBuZXdUYWdzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbGRUYWdzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVtb3ZlZFRhZ3NbdGFnVHlwZV0gPSB0YWdVcGRhdGVzW3RhZ1R5cGVdLm9sZFRhZ3M7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGNiICYmIGNiKCk7XG5cbiAgICBvbkNoYW5nZUNsaWVudFN0YXRlKG5ld1N0YXRlLCBhZGRlZFRhZ3MsIHJlbW92ZWRUYWdzKTtcbn07XG5cbnZhciBmbGF0dGVuQXJyYXkgPSBmdW5jdGlvbiBmbGF0dGVuQXJyYXkocG9zc2libGVBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBvc3NpYmxlQXJyYXkpID8gcG9zc2libGVBcnJheS5qb2luKFwiXCIpIDogcG9zc2libGVBcnJheTtcbn07XG5cbnZhciB1cGRhdGVUaXRsZSA9IGZ1bmN0aW9uIHVwZGF0ZVRpdGxlKHRpdGxlLCBhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKHR5cGVvZiB0aXRsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC50aXRsZSAhPT0gdGl0bGUpIHtcbiAgICAgICAgZG9jdW1lbnQudGl0bGUgPSBmbGF0dGVuQXJyYXkodGl0bGUpO1xuICAgIH1cblxuICAgIHVwZGF0ZUF0dHJpYnV0ZXMoVEFHX05BTUVTLlRJVExFLCBhdHRyaWJ1dGVzKTtcbn07XG5cbnZhciB1cGRhdGVBdHRyaWJ1dGVzID0gZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlcyh0YWdOYW1lLCBhdHRyaWJ1dGVzKSB7XG4gICAgdmFyIGVsZW1lbnRUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKVswXTtcblxuICAgIGlmICghZWxlbWVudFRhZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGhlbG1ldEF0dHJpYnV0ZVN0cmluZyA9IGVsZW1lbnRUYWcuZ2V0QXR0cmlidXRlKEhFTE1FVF9BVFRSSUJVVEUpO1xuICAgIHZhciBoZWxtZXRBdHRyaWJ1dGVzID0gaGVsbWV0QXR0cmlidXRlU3RyaW5nID8gaGVsbWV0QXR0cmlidXRlU3RyaW5nLnNwbGl0KFwiLFwiKSA6IFtdO1xuICAgIHZhciBhdHRyaWJ1dGVzVG9SZW1vdmUgPSBbXS5jb25jYXQoaGVsbWV0QXR0cmlidXRlcyk7XG4gICAgdmFyIGF0dHJpYnV0ZUtleXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlS2V5c1tpXTtcbiAgICAgICAgdmFyIHZhbHVlID0gYXR0cmlidXRlc1thdHRyaWJ1dGVdIHx8IFwiXCI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnRUYWcuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICBlbGVtZW50VGFnLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoZWxtZXRBdHRyaWJ1dGVzLmluZGV4T2YoYXR0cmlidXRlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGhlbG1ldEF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGluZGV4VG9TYXZlID0gYXR0cmlidXRlc1RvUmVtb3ZlLmluZGV4T2YoYXR0cmlidXRlKTtcbiAgICAgICAgaWYgKGluZGV4VG9TYXZlICE9PSAtMSkge1xuICAgICAgICAgICAgYXR0cmlidXRlc1RvUmVtb3ZlLnNwbGljZShpbmRleFRvU2F2ZSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaSA9IGF0dHJpYnV0ZXNUb1JlbW92ZS5sZW5ndGggLSAxOyBfaSA+PSAwOyBfaS0tKSB7XG4gICAgICAgIGVsZW1lbnRUYWcucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZXNUb1JlbW92ZVtfaV0pO1xuICAgIH1cblxuICAgIGlmIChoZWxtZXRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gYXR0cmlidXRlc1RvUmVtb3ZlLmxlbmd0aCkge1xuICAgICAgICBlbGVtZW50VGFnLnJlbW92ZUF0dHJpYnV0ZShIRUxNRVRfQVRUUklCVVRFKTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRUYWcuZ2V0QXR0cmlidXRlKEhFTE1FVF9BVFRSSUJVVEUpICE9PSBhdHRyaWJ1dGVLZXlzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgIGVsZW1lbnRUYWcuc2V0QXR0cmlidXRlKEhFTE1FVF9BVFRSSUJVVEUsIGF0dHJpYnV0ZUtleXMuam9pbihcIixcIikpO1xuICAgIH1cbn07XG5cbnZhciB1cGRhdGVUYWdzID0gZnVuY3Rpb24gdXBkYXRlVGFncyh0eXBlLCB0YWdzKSB7XG4gICAgdmFyIGhlYWRFbGVtZW50ID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFRBR19OQU1FUy5IRUFEKTtcbiAgICB2YXIgdGFnTm9kZXMgPSBoZWFkRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHR5cGUgKyBcIltcIiArIEhFTE1FVF9BVFRSSUJVVEUgKyBcIl1cIik7XG4gICAgdmFyIG9sZFRhZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0YWdOb2Rlcyk7XG4gICAgdmFyIG5ld1RhZ3MgPSBbXTtcbiAgICB2YXIgaW5kZXhUb0RlbGV0ZSA9IHZvaWQgMDtcblxuICAgIGlmICh0YWdzICYmIHRhZ3MubGVuZ3RoKSB7XG4gICAgICAgIHRhZ3MuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGF0dHJpYnV0ZSBpbiB0YWcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnLmhhc093blByb3BlcnR5KGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuSU5ORVJfSFRNTCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUwgPSB0YWcuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IHRhZy5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRhZy5jc3NUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0eXBlb2YgdGFnW2F0dHJpYnV0ZV0gPT09IFwidW5kZWZpbmVkXCIgPyBcIlwiIDogdGFnW2F0dHJpYnV0ZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSwgXCJ0cnVlXCIpO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgYSBkdXBsaWNhdGUgdGFnIGZyb20gZG9tVGFnc3RvUmVtb3ZlLCBzbyBpdCBpc24ndCBjbGVhcmVkLlxuICAgICAgICAgICAgaWYgKG9sZFRhZ3Muc29tZShmdW5jdGlvbiAoZXhpc3RpbmdUYWcsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaW5kZXhUb0RlbGV0ZSA9IGluZGV4O1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50LmlzRXF1YWxOb2RlKGV4aXN0aW5nVGFnKTtcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgb2xkVGFncy5zcGxpY2UoaW5kZXhUb0RlbGV0ZSwgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1RhZ3MucHVzaChuZXdFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb2xkVGFncy5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgcmV0dXJuIHRhZy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhZyk7XG4gICAgfSk7XG4gICAgbmV3VGFncy5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgcmV0dXJuIGhlYWRFbGVtZW50LmFwcGVuZENoaWxkKHRhZyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBvbGRUYWdzOiBvbGRUYWdzLFxuICAgICAgICBuZXdUYWdzOiBuZXdUYWdzXG4gICAgfTtcbn07XG5cbnZhciBnZW5lcmF0ZUVsZW1lbnRBdHRyaWJ1dGVzQXNTdHJpbmcgPSBmdW5jdGlvbiBnZW5lcmF0ZUVsZW1lbnRBdHRyaWJ1dGVzQXNTdHJpbmcoYXR0cmlidXRlcykge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5yZWR1Y2UoZnVuY3Rpb24gKHN0ciwga2V5KSB7XG4gICAgICAgIHZhciBhdHRyID0gdHlwZW9mIGF0dHJpYnV0ZXNba2V5XSAhPT0gXCJ1bmRlZmluZWRcIiA/IGtleSArIFwiPVxcXCJcIiArIGF0dHJpYnV0ZXNba2V5XSArIFwiXFxcIlwiIDogXCJcIiArIGtleTtcbiAgICAgICAgcmV0dXJuIHN0ciA/IHN0ciArIFwiIFwiICsgYXR0ciA6IGF0dHI7XG4gICAgfSwgXCJcIik7XG59O1xuXG52YXIgZ2VuZXJhdGVUaXRsZUFzU3RyaW5nID0gZnVuY3Rpb24gZ2VuZXJhdGVUaXRsZUFzU3RyaW5nKHR5cGUsIHRpdGxlLCBhdHRyaWJ1dGVzLCBlbmNvZGUpIHtcbiAgICB2YXIgYXR0cmlidXRlU3RyaW5nID0gZ2VuZXJhdGVFbGVtZW50QXR0cmlidXRlc0FzU3RyaW5nKGF0dHJpYnV0ZXMpO1xuICAgIHZhciBmbGF0dGVuZWRUaXRsZSA9IGZsYXR0ZW5BcnJheSh0aXRsZSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVN0cmluZyA/IFwiPFwiICsgdHlwZSArIFwiIFwiICsgSEVMTUVUX0FUVFJJQlVURSArIFwiPVxcXCJ0cnVlXFxcIiBcIiArIGF0dHJpYnV0ZVN0cmluZyArIFwiPlwiICsgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnMoZmxhdHRlbmVkVGl0bGUsIGVuY29kZSkgKyBcIjwvXCIgKyB0eXBlICsgXCI+XCIgOiBcIjxcIiArIHR5cGUgKyBcIiBcIiArIEhFTE1FVF9BVFRSSUJVVEUgKyBcIj1cXFwidHJ1ZVxcXCI+XCIgKyBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVycyhmbGF0dGVuZWRUaXRsZSwgZW5jb2RlKSArIFwiPC9cIiArIHR5cGUgKyBcIj5cIjtcbn07XG5cbnZhciBnZW5lcmF0ZVRhZ3NBc1N0cmluZyA9IGZ1bmN0aW9uIGdlbmVyYXRlVGFnc0FzU3RyaW5nKHR5cGUsIHRhZ3MsIGVuY29kZSkge1xuICAgIHJldHVybiB0YWdzLnJlZHVjZShmdW5jdGlvbiAoc3RyLCB0YWcpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZUh0bWwgPSBPYmplY3Qua2V5cyh0YWcpLmZpbHRlcihmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gIShhdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLklOTkVSX0hUTUwgfHwgYXR0cmlidXRlID09PSBUQUdfUFJPUEVSVElFUy5DU1NfVEVYVCk7XG4gICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoc3RyaW5nLCBhdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIHZhciBhdHRyID0gdHlwZW9mIHRhZ1thdHRyaWJ1dGVdID09PSBcInVuZGVmaW5lZFwiID8gYXR0cmlidXRlIDogYXR0cmlidXRlICsgXCI9XFxcIlwiICsgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnModGFnW2F0dHJpYnV0ZV0sIGVuY29kZSkgKyBcIlxcXCJcIjtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcgPyBzdHJpbmcgKyBcIiBcIiArIGF0dHIgOiBhdHRyO1xuICAgICAgICB9LCBcIlwiKTtcblxuICAgICAgICB2YXIgdGFnQ29udGVudCA9IHRhZy5pbm5lckhUTUwgfHwgdGFnLmNzc1RleHQgfHwgXCJcIjtcblxuICAgICAgICB2YXIgaXNTZWxmQ2xvc2luZyA9IFNFTEZfQ0xPU0lOR19UQUdTLmluZGV4T2YodHlwZSkgPT09IC0xO1xuXG4gICAgICAgIHJldHVybiBzdHIgKyBcIjxcIiArIHR5cGUgKyBcIiBcIiArIEhFTE1FVF9BVFRSSUJVVEUgKyBcIj1cXFwidHJ1ZVxcXCIgXCIgKyBhdHRyaWJ1dGVIdG1sICsgKGlzU2VsZkNsb3NpbmcgPyBcIi8+XCIgOiBcIj5cIiArIHRhZ0NvbnRlbnQgKyBcIjwvXCIgKyB0eXBlICsgXCI+XCIpO1xuICAgIH0sIFwiXCIpO1xufTtcblxudmFyIGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyA9IGZ1bmN0aW9uIGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyhhdHRyaWJ1dGVzKSB7XG4gICAgdmFyIGluaXRQcm9wcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlcykucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAgICAgICBvYmpbUkVBQ1RfVEFHX01BUFtrZXldIHx8IGtleV0gPSBhdHRyaWJ1dGVzW2tleV07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSwgaW5pdFByb3BzKTtcbn07XG5cbnZhciBjb252ZXJ0UmVhY3RQcm9wc3RvSHRtbEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiBjb252ZXJ0UmVhY3RQcm9wc3RvSHRtbEF0dHJpYnV0ZXMocHJvcHMpIHtcbiAgICB2YXIgaW5pdEF0dHJpYnV0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BzKS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwga2V5KSB7XG4gICAgICAgIG9ialtIVE1MX1RBR19NQVBba2V5XSB8fCBrZXldID0gcHJvcHNba2V5XTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCBpbml0QXR0cmlidXRlcyk7XG59O1xuXG52YXIgZ2VuZXJhdGVUaXRsZUFzUmVhY3RDb21wb25lbnQgPSBmdW5jdGlvbiBnZW5lcmF0ZVRpdGxlQXNSZWFjdENvbXBvbmVudCh0eXBlLCB0aXRsZSwgYXR0cmlidXRlcykge1xuICAgIHZhciBfaW5pdFByb3BzO1xuXG4gICAgLy8gYXNzaWduaW5nIGludG8gYW4gYXJyYXkgdG8gZGVmaW5lIHRvU3RyaW5nIGZ1bmN0aW9uIG9uIGl0XG4gICAgdmFyIGluaXRQcm9wcyA9IChfaW5pdFByb3BzID0ge1xuICAgICAgICBrZXk6IHRpdGxlXG4gICAgfSwgX2luaXRQcm9wc1tIRUxNRVRfQVRUUklCVVRFXSA9IHRydWUsIF9pbml0UHJvcHMpO1xuICAgIHZhciBwcm9wcyA9IGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyhhdHRyaWJ1dGVzLCBpbml0UHJvcHMpO1xuXG4gICAgcmV0dXJuIFtSZWFjdC5jcmVhdGVFbGVtZW50KFRBR19OQU1FUy5USVRMRSwgcHJvcHMsIHRpdGxlKV07XG59O1xuXG52YXIgZ2VuZXJhdGVUYWdzQXNSZWFjdENvbXBvbmVudCA9IGZ1bmN0aW9uIGdlbmVyYXRlVGFnc0FzUmVhY3RDb21wb25lbnQodHlwZSwgdGFncykge1xuICAgIHJldHVybiB0YWdzLm1hcChmdW5jdGlvbiAodGFnLCBpKSB7XG4gICAgICAgIHZhciBfbWFwcGVkVGFnO1xuXG4gICAgICAgIHZhciBtYXBwZWRUYWcgPSAoX21hcHBlZFRhZyA9IHtcbiAgICAgICAgICAgIGtleTogaVxuICAgICAgICB9LCBfbWFwcGVkVGFnW0hFTE1FVF9BVFRSSUJVVEVdID0gdHJ1ZSwgX21hcHBlZFRhZyk7XG5cbiAgICAgICAgT2JqZWN0LmtleXModGFnKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIHZhciBtYXBwZWRBdHRyaWJ1dGUgPSBSRUFDVF9UQUdfTUFQW2F0dHJpYnV0ZV0gfHwgYXR0cmlidXRlO1xuXG4gICAgICAgICAgICBpZiAobWFwcGVkQXR0cmlidXRlID09PSBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MIHx8IG1hcHBlZEF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IHRhZy5pbm5lckhUTUwgfHwgdGFnLmNzc1RleHQ7XG4gICAgICAgICAgICAgICAgbWFwcGVkVGFnLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID0geyBfX2h0bWw6IGNvbnRlbnQgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFwcGVkVGFnW21hcHBlZEF0dHJpYnV0ZV0gPSB0YWdbYXR0cmlidXRlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQodHlwZSwgbWFwcGVkVGFnKTtcbiAgICB9KTtcbn07XG5cbnZhciBnZXRNZXRob2RzRm9yVGFnID0gZnVuY3Rpb24gZ2V0TWV0aG9kc0ZvclRhZyh0eXBlLCB0YWdzLCBlbmNvZGUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBUQUdfTkFNRVMuVElUTEU6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvQ29tcG9uZW50OiBmdW5jdGlvbiB0b0NvbXBvbmVudCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGl0bGVBc1JlYWN0Q29tcG9uZW50KHR5cGUsIHRhZ3MudGl0bGUsIHRhZ3MudGl0bGVBdHRyaWJ1dGVzLCBlbmNvZGUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVUaXRsZUFzU3RyaW5nKHR5cGUsIHRhZ3MudGl0bGUsIHRhZ3MudGl0bGVBdHRyaWJ1dGVzLCBlbmNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgQVRUUklCVVRFX05BTUVTLkJPRFk6XG4gICAgICAgIGNhc2UgQVRUUklCVVRFX05BTUVTLkhUTUw6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvQ29tcG9uZW50OiBmdW5jdGlvbiB0b0NvbXBvbmVudCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRFbGVtZW50QXR0cmlidXRlc3RvUmVhY3RQcm9wcyh0YWdzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlRWxlbWVudEF0dHJpYnV0ZXNBc1N0cmluZyh0YWdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b0NvbXBvbmVudDogZnVuY3Rpb24gdG9Db21wb25lbnQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVRhZ3NBc1JlYWN0Q29tcG9uZW50KHR5cGUsIHRhZ3MpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVUYWdzQXNTdHJpbmcodHlwZSwgdGFncywgZW5jb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgIH1cbn07XG5cbnZhciBtYXBTdGF0ZU9uU2VydmVyID0gZnVuY3Rpb24gbWFwU3RhdGVPblNlcnZlcihfcmVmKSB7XG4gICAgdmFyIGJhc2VUYWcgPSBfcmVmLmJhc2VUYWcsXG4gICAgICAgIGJvZHlBdHRyaWJ1dGVzID0gX3JlZi5ib2R5QXR0cmlidXRlcyxcbiAgICAgICAgZW5jb2RlID0gX3JlZi5lbmNvZGUsXG4gICAgICAgIGh0bWxBdHRyaWJ1dGVzID0gX3JlZi5odG1sQXR0cmlidXRlcyxcbiAgICAgICAgbGlua1RhZ3MgPSBfcmVmLmxpbmtUYWdzLFxuICAgICAgICBtZXRhVGFncyA9IF9yZWYubWV0YVRhZ3MsXG4gICAgICAgIG5vc2NyaXB0VGFncyA9IF9yZWYubm9zY3JpcHRUYWdzLFxuICAgICAgICBzY3JpcHRUYWdzID0gX3JlZi5zY3JpcHRUYWdzLFxuICAgICAgICBzdHlsZVRhZ3MgPSBfcmVmLnN0eWxlVGFncyxcbiAgICAgICAgX3JlZiR0aXRsZSA9IF9yZWYudGl0bGUsXG4gICAgICAgIHRpdGxlID0gX3JlZiR0aXRsZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IF9yZWYkdGl0bGUsXG4gICAgICAgIHRpdGxlQXR0cmlidXRlcyA9IF9yZWYudGl0bGVBdHRyaWJ1dGVzO1xuICAgIHJldHVybiB7XG4gICAgICAgIGJhc2U6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLkJBU0UsIGJhc2VUYWcsIGVuY29kZSksXG4gICAgICAgIGJvZHlBdHRyaWJ1dGVzOiBnZXRNZXRob2RzRm9yVGFnKEFUVFJJQlVURV9OQU1FUy5CT0RZLCBib2R5QXR0cmlidXRlcywgZW5jb2RlKSxcbiAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IGdldE1ldGhvZHNGb3JUYWcoQVRUUklCVVRFX05BTUVTLkhUTUwsIGh0bWxBdHRyaWJ1dGVzLCBlbmNvZGUpLFxuICAgICAgICBsaW5rOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5MSU5LLCBsaW5rVGFncywgZW5jb2RlKSxcbiAgICAgICAgbWV0YTogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuTUVUQSwgbWV0YVRhZ3MsIGVuY29kZSksXG4gICAgICAgIG5vc2NyaXB0OiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5OT1NDUklQVCwgbm9zY3JpcHRUYWdzLCBlbmNvZGUpLFxuICAgICAgICBzY3JpcHQ6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLlNDUklQVCwgc2NyaXB0VGFncywgZW5jb2RlKSxcbiAgICAgICAgc3R5bGU6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLlNUWUxFLCBzdHlsZVRhZ3MsIGVuY29kZSksXG4gICAgICAgIHRpdGxlOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5USVRMRSwgeyB0aXRsZTogdGl0bGUsIHRpdGxlQXR0cmlidXRlczogdGl0bGVBdHRyaWJ1dGVzIH0sIGVuY29kZSlcbiAgICB9O1xufTtcblxudmFyIEhlbG1ldCA9IGZ1bmN0aW9uIEhlbG1ldChDb21wb25lbnQpIHtcbiAgICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICAgIHJldHVybiBfdGVtcCA9IF9jbGFzcyA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgICAgIGluaGVyaXRzKEhlbG1ldFdyYXBwZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gICAgICAgIGZ1bmN0aW9uIEhlbG1ldFdyYXBwZXIoKSB7XG4gICAgICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIZWxtZXRXcmFwcGVyKTtcbiAgICAgICAgICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gIWlzRXF1YWwodGhpcy5wcm9wcywgbmV4dFByb3BzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5tYXBOZXN0ZWRDaGlsZHJlblRvUHJvcHMgPSBmdW5jdGlvbiBtYXBOZXN0ZWRDaGlsZHJlblRvUHJvcHMoY2hpbGQsIG5lc3RlZENoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoIW5lc3RlZENoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLlNDUklQVDpcbiAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5OT1NDUklQVDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVySFRNTDogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLlNUWUxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dDogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiPFwiICsgY2hpbGQudHlwZSArIFwiIC8+IGVsZW1lbnRzIGFyZSBzZWxmLWNsb3NpbmcgYW5kIGNhbiBub3QgY29udGFpbiBjaGlsZHJlbi4gUmVmZXIgdG8gb3VyIEFQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgIH07XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUuZmxhdHRlbkFycmF5VHlwZUNoaWxkcmVuID0gZnVuY3Rpb24gZmxhdHRlbkFycmF5VHlwZUNoaWxkcmVuKF9yZWYpIHtcbiAgICAgICAgICAgIHZhciBfYmFiZWxIZWxwZXJzJGV4dGVuZHM7XG5cbiAgICAgICAgICAgIHZhciBjaGlsZCA9IF9yZWYuY2hpbGQsXG4gICAgICAgICAgICAgICAgYXJyYXlUeXBlQ2hpbGRyZW4gPSBfcmVmLmFycmF5VHlwZUNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIG5ld0NoaWxkUHJvcHMgPSBfcmVmLm5ld0NoaWxkUHJvcHMsXG4gICAgICAgICAgICAgICAgbmVzdGVkQ2hpbGRyZW4gPSBfcmVmLm5lc3RlZENoaWxkcmVuO1xuXG4gICAgICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIGFycmF5VHlwZUNoaWxkcmVuLCAoX2JhYmVsSGVscGVycyRleHRlbmRzID0ge30sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kc1tjaGlsZC50eXBlXSA9IFtdLmNvbmNhdChhcnJheVR5cGVDaGlsZHJlbltjaGlsZC50eXBlXSB8fCBbXSwgW19leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzLCB0aGlzLm1hcE5lc3RlZENoaWxkcmVuVG9Qcm9wcyhjaGlsZCwgbmVzdGVkQ2hpbGRyZW4pKV0pLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5tYXBPYmplY3RUeXBlQ2hpbGRyZW4gPSBmdW5jdGlvbiBtYXBPYmplY3RUeXBlQ2hpbGRyZW4oX3JlZjIpIHtcbiAgICAgICAgICAgIHZhciBfYmFiZWxIZWxwZXJzJGV4dGVuZHMyLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMzO1xuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBfcmVmMi5jaGlsZCxcbiAgICAgICAgICAgICAgICBuZXdQcm9wcyA9IF9yZWYyLm5ld1Byb3BzLFxuICAgICAgICAgICAgICAgIG5ld0NoaWxkUHJvcHMgPSBfcmVmMi5uZXdDaGlsZFByb3BzLFxuICAgICAgICAgICAgICAgIG5lc3RlZENoaWxkcmVuID0gX3JlZjIubmVzdGVkQ2hpbGRyZW47XG5cbiAgICAgICAgICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLlRJVExFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIG5ld1Byb3BzLCAoX2JhYmVsSGVscGVycyRleHRlbmRzMiA9IHt9LCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMyW2NoaWxkLnR5cGVdID0gbmVzdGVkQ2hpbGRyZW4sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczIudGl0bGVBdHRyaWJ1dGVzID0gX2V4dGVuZHMoe30sIG5ld0NoaWxkUHJvcHMpLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMyKSk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5CT0RZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIG5ld1Byb3BzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5QXR0cmlidXRlczogX2V4dGVuZHMoe30sIG5ld0NoaWxkUHJvcHMpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuSFRNTDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBuZXdQcm9wcywgKF9iYWJlbEhlbHBlcnMkZXh0ZW5kczMgPSB7fSwgX2JhYmVsSGVscGVycyRleHRlbmRzM1tjaGlsZC50eXBlXSA9IF9leHRlbmRzKHt9LCBuZXdDaGlsZFByb3BzKSwgX2JhYmVsSGVscGVycyRleHRlbmRzMykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLm1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyA9IGZ1bmN0aW9uIG1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyhhcnJheVR5cGVDaGlsZHJlbiwgbmV3UHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBuZXdGbGF0dGVuZWRQcm9wcyA9IF9leHRlbmRzKHt9LCBuZXdQcm9wcyk7XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFycmF5VHlwZUNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uIChhcnJheUNoaWxkTmFtZSkge1xuICAgICAgICAgICAgICAgIHZhciBfYmFiZWxIZWxwZXJzJGV4dGVuZHM0O1xuXG4gICAgICAgICAgICAgICAgbmV3RmxhdHRlbmVkUHJvcHMgPSBfZXh0ZW5kcyh7fSwgbmV3RmxhdHRlbmVkUHJvcHMsIChfYmFiZWxIZWxwZXJzJGV4dGVuZHM0ID0ge30sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczRbYXJyYXlDaGlsZE5hbWVdID0gYXJyYXlUeXBlQ2hpbGRyZW5bYXJyYXlDaGlsZE5hbWVdLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHM0KSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIG5ld0ZsYXR0ZW5lZFByb3BzO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLndhcm5PbkludmFsaWRDaGlsZHJlbiA9IGZ1bmN0aW9uIHdhcm5PbkludmFsaWRDaGlsZHJlbihjaGlsZCwgbmVzdGVkQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIVZBTElEX1RBR19OQU1FUy5zb21lKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC50eXBlID09PSBuYW1lO1xuICAgICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQudHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2FybihcIllvdSBtYXkgYmUgYXR0ZW1wdGluZyB0byBuZXN0IDxIZWxtZXQ+IGNvbXBvbmVudHMgd2l0aGluIGVhY2ggb3RoZXIsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBSZWZlciB0byBvdXIgQVBJIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3YXJuKFwiT25seSBlbGVtZW50cyB0eXBlcyBcIiArIFZBTElEX1RBR19OQU1FUy5qb2luKFwiLCBcIikgKyBcIiBhcmUgYWxsb3dlZC4gSGVsbWV0IGRvZXMgbm90IHN1cHBvcnQgcmVuZGVyaW5nIDxcIiArIGNoaWxkLnR5cGUgKyBcIj4gZWxlbWVudHMuIFJlZmVyIHRvIG91ciBBUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXN0ZWRDaGlsZHJlbiAmJiB0eXBlb2YgbmVzdGVkQ2hpbGRyZW4gIT09IFwic3RyaW5nXCIgJiYgKCFBcnJheS5pc0FycmF5KG5lc3RlZENoaWxkcmVuKSB8fCBuZXN0ZWRDaGlsZHJlbi5zb21lKGZ1bmN0aW9uIChuZXN0ZWRDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIG5lc3RlZENoaWxkICE9PSBcInN0cmluZ1wiO1xuICAgICAgICAgICAgICAgIH0pKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIZWxtZXQgZXhwZWN0cyBhIHN0cmluZyBhcyBhIGNoaWxkIG9mIDxcIiArIGNoaWxkLnR5cGUgKyBcIj4uIERpZCB5b3UgZm9yZ2V0IHRvIHdyYXAgeW91ciBjaGlsZHJlbiBpbiBicmFjZXM/ICggPFwiICsgY2hpbGQudHlwZSArIFwiPntgYH08L1wiICsgY2hpbGQudHlwZSArIFwiPiApIFJlZmVyIHRvIG91ciBBUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUubWFwQ2hpbGRyZW5Ub1Byb3BzID0gZnVuY3Rpb24gbWFwQ2hpbGRyZW5Ub1Byb3BzKGNoaWxkcmVuLCBuZXdQcm9wcykge1xuICAgICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgICAgIHZhciBhcnJheVR5cGVDaGlsZHJlbiA9IHt9O1xuXG4gICAgICAgICAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkIHx8ICFjaGlsZC5wcm9wcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIF9jaGlsZCRwcm9wcyA9IGNoaWxkLnByb3BzLFxuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbiA9IF9jaGlsZCRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRQcm9wcyA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9jaGlsZCRwcm9wcywgW1wiY2hpbGRyZW5cIl0pO1xuXG4gICAgICAgICAgICAgICAgdmFyIG5ld0NoaWxkUHJvcHMgPSBjb252ZXJ0UmVhY3RQcm9wc3RvSHRtbEF0dHJpYnV0ZXMoY2hpbGRQcm9wcyk7XG5cbiAgICAgICAgICAgICAgICBfdGhpczIud2Fybk9uSW52YWxpZENoaWxkcmVuKGNoaWxkLCBuZXN0ZWRDaGlsZHJlbik7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoaWxkLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuTElOSzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuTUVUQTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuTk9TQ1JJUFQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLlNDUklQVDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuU1RZTEU6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGVDaGlsZHJlbiA9IF90aGlzMi5mbGF0dGVuQXJyYXlUeXBlQ2hpbGRyZW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkOiBjaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGVDaGlsZHJlbjogYXJyYXlUeXBlQ2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRQcm9wczogbmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbjogbmVzdGVkQ2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gX3RoaXMyLm1hcE9iamVjdFR5cGVDaGlsZHJlbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQ6IGNoaWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzOiBuZXdQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZFByb3BzOiBuZXdDaGlsZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZENoaWxkcmVuOiBuZXN0ZWRDaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbmV3UHJvcHMgPSB0aGlzLm1hcEFycmF5VHlwZUNoaWxkcmVuVG9Qcm9wcyhhcnJheVR5cGVDaGlsZHJlbiwgbmV3UHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld1Byb3BzO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIHByb3BzID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbXCJjaGlsZHJlblwiXSk7XG5cbiAgICAgICAgICAgIHZhciBuZXdQcm9wcyA9IF9leHRlbmRzKHt9LCBwcm9wcyk7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gdGhpcy5tYXBDaGlsZHJlblRvUHJvcHMoY2hpbGRyZW4sIG5ld1Byb3BzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBuZXdQcm9wcyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY3JlYXRlQ2xhc3MoSGVsbWV0V3JhcHBlciwgbnVsbCwgW3tcbiAgICAgICAgICAgIGtleTogXCJjYW5Vc2VET01cIixcblxuXG4gICAgICAgICAgICAvLyBDb21wb25lbnQucGVlayBjb21lcyBmcm9tIHJlYWN0LXNpZGUtZWZmZWN0OlxuICAgICAgICAgICAgLy8gRm9yIHRlc3RpbmcsIHlvdSBtYXkgdXNlIGEgc3RhdGljIHBlZWsoKSBtZXRob2QgYXZhaWxhYmxlIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQuXG4gICAgICAgICAgICAvLyBJdCBsZXRzIHlvdSBnZXQgdGhlIGN1cnJlbnQgc3RhdGUgd2l0aG91dCByZXNldHRpbmcgdGhlIG1vdW50ZWQgaW5zdGFuY2Ugc3RhY2suXG4gICAgICAgICAgICAvLyBEb27igJl0IHVzZSBpdCBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbiB0ZXN0aW5nLlxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiYXNlOiB7XCJ0YXJnZXRcIjogXCJfYmxhbmtcIiwgXCJocmVmXCI6IFwiaHR0cDovL215c2l0ZS5jb20vXCJ9XG4gICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYm9keUF0dHJpYnV0ZXM6IHtcImNsYXNzTmFtZVwiOiBcInJvb3RcIn1cbiAgICAgICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkZWZhdWx0VGl0bGU6IFwiRGVmYXVsdCBUaXRsZVwiXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRlZmVyOiB0cnVlXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzOiB0cnVlXG4gICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaHRtbEF0dHJpYnV0ZXM6IHtcImxhbmdcIjogXCJlblwiLCBcImFtcFwiOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBsaW5rOiBbe1wicmVsXCI6IFwiY2Fub25pY2FsXCIsIFwiaHJlZlwiOiBcImh0dHA6Ly9teXNpdGUuY29tL2V4YW1wbGVcIn1dXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBtZXRhOiBbe1wibmFtZVwiOiBcImRlc2NyaXB0aW9uXCIsIFwiY29udGVudFwiOiBcIlRlc3QgZGVzY3JpcHRpb25cIn1dXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBub3NjcmlwdDogW3tcImlubmVySFRNTFwiOiBcIjxpbWcgc3JjPSdodHRwOi8vbXlzaXRlLmNvbS9qcy90ZXN0LmpzJ1wifV1cbiAgICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uQ2hhbmdlQ2xpZW50U3RhdGU6IFwiKG5ld1N0YXRlKSA9PiBjb25zb2xlLmxvZyhuZXdTdGF0ZSlcIlxuICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc2NyaXB0OiBbe1widHlwZVwiOiBcInRleHQvamF2YXNjcmlwdFwiLCBcInNyY1wiOiBcImh0dHA6Ly9teXNpdGUuY29tL2pzL3Rlc3QuanNcIn1dXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBzdHlsZTogW3tcInR5cGVcIjogXCJ0ZXh0L2Nzc1wiLCBcImNzc1RleHRcIjogXCJkaXYgeyBkaXNwbGF5OiBibG9jazsgY29sb3I6IGJsdWU7IH1cIn1dXG4gICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGl0bGU6IFwiVGl0bGVcIlxuICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRpdGxlQXR0cmlidXRlczoge1wiaXRlbXByb3BcIjogXCJuYW1lXCJ9XG4gICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGl0bGVUZW1wbGF0ZTogXCJNeVNpdGUuY29tIC0gJXNcIlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCQkMShjYW5Vc2VET00pIHtcbiAgICAgICAgICAgICAgICBDb21wb25lbnQuY2FuVXNlRE9NID0gY2FuVXNlRE9NO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XSk7XG4gICAgICAgIHJldHVybiBIZWxtZXRXcmFwcGVyO1xuICAgIH0oUmVhY3QuQ29tcG9uZW50KSwgX2NsYXNzLnByb3BUeXBlcyA9IHtcbiAgICAgICAgYmFzZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgYm9keUF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubm9kZSksIFByb3BUeXBlcy5ub2RlXSksXG4gICAgICAgIGRlZmF1bHRUaXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgZGVmZXI6IFByb3BUeXBlcy5ib29sLFxuICAgICAgICBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogUHJvcFR5cGVzLmJvb2wsXG4gICAgICAgIGh0bWxBdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgICBsaW5rOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICAgICAgbWV0YTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgICAgIG5vc2NyaXB0OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICAgICAgb25DaGFuZ2VDbGllbnRTdGF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIHNjcmlwdDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCksXG4gICAgICAgIHN0eWxlOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICAgICAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgIHRpdGxlQXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgdGl0bGVUZW1wbGF0ZTogUHJvcFR5cGVzLnN0cmluZ1xuICAgIH0sIF9jbGFzcy5kZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGRlZmVyOiB0cnVlLFxuICAgICAgICBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVyczogdHJ1ZVxuICAgIH0sIF9jbGFzcy5wZWVrID0gQ29tcG9uZW50LnBlZWssIF9jbGFzcy5yZXdpbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtYXBwZWRTdGF0ZSA9IENvbXBvbmVudC5yZXdpbmQoKTtcbiAgICAgICAgaWYgKCFtYXBwZWRTdGF0ZSkge1xuICAgICAgICAgICAgLy8gcHJvdmlkZSBmYWxsYmFjayBpZiBtYXBwZWRTdGF0ZSBpcyB1bmRlZmluZWRcbiAgICAgICAgICAgIG1hcHBlZFN0YXRlID0gbWFwU3RhdGVPblNlcnZlcih7XG4gICAgICAgICAgICAgICAgYmFzZVRhZzogW10sXG4gICAgICAgICAgICAgICAgYm9keUF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgICAgICAgIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICAgICAgICBsaW5rVGFnczogW10sXG4gICAgICAgICAgICAgICAgbWV0YVRhZ3M6IFtdLFxuICAgICAgICAgICAgICAgIG5vc2NyaXB0VGFnczogW10sXG4gICAgICAgICAgICAgICAgc2NyaXB0VGFnczogW10sXG4gICAgICAgICAgICAgICAgc3R5bGVUYWdzOiBbXSxcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJcIixcbiAgICAgICAgICAgICAgICB0aXRsZUF0dHJpYnV0ZXM6IHt9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXBwZWRTdGF0ZTtcbiAgICB9LCBfdGVtcDtcbn07XG5cbnZhciBOdWxsQ29tcG9uZW50ID0gZnVuY3Rpb24gTnVsbENvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciBIZWxtZXRTaWRlRWZmZWN0cyA9IHdpdGhTaWRlRWZmZWN0KHJlZHVjZVByb3BzVG9TdGF0ZSwgaGFuZGxlQ2xpZW50U3RhdGVDaGFuZ2UsIG1hcFN0YXRlT25TZXJ2ZXIpKE51bGxDb21wb25lbnQpO1xuXG52YXIgSGVsbWV0RXhwb3J0ID0gSGVsbWV0KEhlbG1ldFNpZGVFZmZlY3RzKTtcbkhlbG1ldEV4cG9ydC5yZW5kZXJTdGF0aWMgPSBIZWxtZXRFeHBvcnQucmV3aW5kO1xuXG5leHBvcnQgZGVmYXVsdCBIZWxtZXRFeHBvcnQ7XG5leHBvcnQgeyBIZWxtZXRFeHBvcnQgYXMgSGVsbWV0IH07XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1pcy5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX1NFUlZFUl9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zZXJ2ZXJfY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG52YXIgZW5hYmxlQ2FjaGVFbGVtZW50ID0gZmFsc2U7XG52YXIgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgPSBmYWxzZTsgLy8gTm8ga25vd24gYnVncywgYnV0IG5lZWRzIHBlcmZvcm1hbmNlIHRlc3RpbmdcblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcbi8vIHN0dWZmLiBJbnRlbmRlZCB0byBlbmFibGUgUmVhY3QgY29yZSBtZW1iZXJzIHRvIG1vcmUgZWFzaWx5IGRlYnVnIHNjaGVkdWxpbmdcbi8vIGlzc3VlcyBpbiBERVYgYnVpbGRzLlxuXG52YXIgZW5hYmxlRGVidWdUcmFjaW5nID0gZmFsc2U7IC8vIFRyYWNrIHdoaWNoIEZpYmVyKHMpIHNjaGVkdWxlIHJlbmRlciB3b3JrLlxuXG52YXIgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRTtcblxue1xuICBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFID0gU3ltYm9sLmZvcigncmVhY3QubW9kdWxlLnJlZmVyZW5jZScpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgZW5hYmxlRGVidWdUcmFjaW5nICB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiAgfHwgdHlwZSA9PT0gUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgIHx8IGVuYWJsZUNhY2hlRWxlbWVudCAgfHwgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIFRoaXMgbmVlZHMgdG8gaW5jbHVkZSBhbGwgcG9zc2libGUgbW9kdWxlIHJlZmVyZW5jZSBvYmplY3RcbiAgICAvLyB0eXBlcyBzdXBwb3J0ZWQgYnkgYW55IEZsaWdodCBjb25maWd1cmF0aW9uIGFueXdoZXJlIHNpbmNlXG4gICAgLy8gd2UgZG9uJ3Qga25vdyB3aGljaCBGbGlnaHQgYnVpbGQgdGhpcyB3aWxsIGVuZCB1cCBiZWluZyB1c2VkXG4gICAgLy8gd2l0aC5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFIHx8IHR5cGUuZ2V0TW9kdWxlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1NFUlZFUl9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBTdXNwZW5zZUxpc3QgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUxpc3Qob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xufVxuXG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuU3VzcGVuc2VMaXN0ID0gU3VzcGVuc2VMaXN0O1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzU3VzcGVuc2VMaXN0ID0gaXNTdXNwZW5zZUxpc3Q7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQge2NyZWF0ZUVsZW1lbnQsQ29tcG9uZW50fWZyb20ncmVhY3QnO2ltcG9ydCB7ZmluZERPTU5vZGV9ZnJvbSdyZWFjdC1kb20nO2Z1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcblxuICBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59LyoqXG4gKiBDaGVjayB3aGV0aGVyIHNvbWUgRE9NIG5vZGUgaXMgb3VyIENvbXBvbmVudCdzIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGlzTm9kZUZvdW5kKGN1cnJlbnQsIGNvbXBvbmVudE5vZGUsIGlnbm9yZUNsYXNzKSB7XG4gIGlmIChjdXJyZW50ID09PSBjb21wb25lbnROb2RlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gU1ZHIDx1c2UvPiBlbGVtZW50cyBkbyBub3QgdGVjaG5pY2FsbHkgcmVzaWRlIGluIHRoZSByZW5kZXJlZCBET00sIHNvXG4gIC8vIHRoZXkgZG8gbm90IGhhdmUgY2xhc3NMaXN0IGRpcmVjdGx5LCBidXQgdGhleSBvZmZlciBhIGxpbmsgdG8gdGhlaXJcbiAgLy8gY29ycmVzcG9uZGluZyBlbGVtZW50LCB3aGljaCBjYW4gaGF2ZSBjbGFzc0xpc3QuIFRoaXMgZXh0cmEgY2hlY2sgaXMgZm9yXG4gIC8vIHRoYXQgY2FzZS5cbiAgLy8gU2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9zdHJ1Y3QuaHRtbCNJbnRlcmZhY2VTVkdVc2VFbGVtZW50XG4gIC8vIERpc2N1c3Npb246IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb21heC9yZWFjdC1vbmNsaWNrb3V0c2lkZS9wdWxsLzE3XG5cblxuICBpZiAoY3VycmVudC5jb3JyZXNwb25kaW5nRWxlbWVudCkge1xuICAgIHJldHVybiBjdXJyZW50LmNvcnJlc3BvbmRpbmdFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhpZ25vcmVDbGFzcyk7XG4gIH1cblxuICByZXR1cm4gY3VycmVudC5jbGFzc0xpc3QuY29udGFpbnMoaWdub3JlQ2xhc3MpO1xufVxuLyoqXG4gKiBUcnkgdG8gZmluZCBvdXIgbm9kZSBpbiBhIGhpZXJhcmNoeSBvZiBub2RlcywgcmV0dXJuaW5nIHRoZSBkb2N1bWVudFxuICogbm9kZSBhcyBoaWdoZXN0IG5vZGUgaWYgb3VyIG5vZGUgaXMgbm90IGZvdW5kIGluIHRoZSBwYXRoIHVwLlxuICovXG5cbmZ1bmN0aW9uIGZpbmRIaWdoZXN0KGN1cnJlbnQsIGNvbXBvbmVudE5vZGUsIGlnbm9yZUNsYXNzKSB7XG4gIGlmIChjdXJyZW50ID09PSBjb21wb25lbnROb2RlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gSWYgc291cmNlPWxvY2FsIHRoZW4gdGhpcyBldmVudCBjYW1lIGZyb20gJ3NvbWV3aGVyZSdcbiAgLy8gaW5zaWRlIGFuZCBzaG91bGQgYmUgaWdub3JlZC4gV2UgY291bGQgaGFuZGxlIHRoaXMgd2l0aFxuICAvLyBhIGxheWVyZWQgYXBwcm9hY2gsIHRvbywgYnV0IHRoYXQgcmVxdWlyZXMgZ29pbmcgYmFjayB0b1xuICAvLyB0aGlua2luZyBpbiB0ZXJtcyBvZiBEb20gbm9kZSBuZXN0aW5nLCBydW5uaW5nIGNvdW50ZXJcbiAgLy8gdG8gUmVhY3QncyAneW91IHNob3VsZG4ndCBjYXJlIGFib3V0IHRoZSBET00nIHBoaWxvc29waHkuXG4gIC8vIEFsc28gY292ZXIgc2hhZG93Um9vdCBub2RlIGJ5IGNoZWNraW5nIGN1cnJlbnQuaG9zdFxuXG5cbiAgd2hpbGUgKGN1cnJlbnQucGFyZW50Tm9kZSB8fCBjdXJyZW50Lmhvc3QpIHtcbiAgICAvLyBPbmx5IGNoZWNrIG5vcm1hbCBub2RlIHdpdGhvdXQgc2hhZG93Um9vdFxuICAgIGlmIChjdXJyZW50LnBhcmVudE5vZGUgJiYgaXNOb2RlRm91bmQoY3VycmVudCwgY29tcG9uZW50Tm9kZSwgaWdub3JlQ2xhc3MpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnROb2RlIHx8IGN1cnJlbnQuaG9zdDtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50O1xufVxuLyoqXG4gKiBDaGVjayBpZiB0aGUgYnJvd3NlciBzY3JvbGxiYXIgd2FzIGNsaWNrZWRcbiAqL1xuXG5mdW5jdGlvbiBjbGlja2VkU2Nyb2xsYmFyKGV2dCkge1xuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIDw9IGV2dC5jbGllbnRYIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPD0gZXZ0LmNsaWVudFk7XG59Ly8gaWRlYWxseSB3aWxsIGdldCByZXBsYWNlZCB3aXRoIGV4dGVybmFsIGRlcFxuLy8gd2hlbiByYWZyZXgvZGV0ZWN0LXBhc3NpdmUtZXZlbnRzIzQgYW5kIHJhZnJleC9kZXRlY3QtcGFzc2l2ZS1ldmVudHMjNSBnZXQgbWVyZ2VkIGluXG52YXIgdGVzdFBhc3NpdmVFdmVudFN1cHBvcnQgPSBmdW5jdGlvbiB0ZXN0UGFzc2l2ZUV2ZW50U3VwcG9ydCgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYXNzaXZlID0gZmFsc2U7XG4gIHZhciBvcHRpb25zID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHBhc3NpdmUgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlRXZlbnRTdXBwb3J0Jywgbm9vcCwgb3B0aW9ucyk7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZUV2ZW50U3VwcG9ydCcsIG5vb3AsIG9wdGlvbnMpO1xuICByZXR1cm4gcGFzc2l2ZTtcbn07ZnVuY3Rpb24gYXV0b0luYyhzZWVkKSB7XG4gIGlmIChzZWVkID09PSB2b2lkIDApIHtcbiAgICBzZWVkID0gMDtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICsrc2VlZDtcbiAgfTtcbn1cblxudmFyIHVpZCA9IGF1dG9JbmMoKTt2YXIgcGFzc2l2ZUV2ZW50U3VwcG9ydDtcbnZhciBoYW5kbGVyc01hcCA9IHt9O1xudmFyIGVuYWJsZWRJbnN0YW5jZXMgPSB7fTtcbnZhciB0b3VjaEV2ZW50cyA9IFsndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnXTtcbnZhciBJR05PUkVfQ0xBU1NfTkFNRSA9ICdpZ25vcmUtcmVhY3Qtb25jbGlja291dHNpZGUnO1xuLyoqXG4gKiBPcHRpb25zIGZvciBhZGRFdmVudEhhbmRsZXIgYW5kIHJlbW92ZUV2ZW50SGFuZGxlclxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50SGFuZGxlck9wdGlvbnMoaW5zdGFuY2UsIGV2ZW50TmFtZSkge1xuICB2YXIgaGFuZGxlck9wdGlvbnMgPSB7fTtcbiAgdmFyIGlzVG91Y2hFdmVudCA9IHRvdWNoRXZlbnRzLmluZGV4T2YoZXZlbnROYW1lKSAhPT0gLTE7XG5cbiAgaWYgKGlzVG91Y2hFdmVudCAmJiBwYXNzaXZlRXZlbnRTdXBwb3J0KSB7XG4gICAgaGFuZGxlck9wdGlvbnMucGFzc2l2ZSA9ICFpbnN0YW5jZS5wcm9wcy5wcmV2ZW50RGVmYXVsdDtcbiAgfVxuXG4gIHJldHVybiBoYW5kbGVyT3B0aW9ucztcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgdGhlIEhPQyBmdW5jdGlvbiB0aGF0IHlvdSdsbCB1c2VcbiAqIGluIG9yZGVyIHRvIGltcGFydCBvbk91dHNpZGVDbGljayBsaXN0ZW5pbmcgdG8gYW5cbiAqIGFyYml0cmFyeSBjb21wb25lbnQuIEl0IGdldHMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlXG4gKiBib290c3RyYXBwaW5nIGNvZGUgdG8geWllbGQgYW4gaW5zdGFuY2Ugb2YgdGhlXG4gKiBvbkNsaWNrT3V0c2lkZUhPQyBmdW5jdGlvbiBkZWZpbmVkIGluc2lkZSBzZXR1cEhPQygpLlxuICovXG5cblxuZnVuY3Rpb24gb25DbGlja091dHNpZGVIT0MoV3JhcHBlZENvbXBvbmVudCwgY29uZmlnKSB7XG4gIHZhciBfY2xhc3MsIF90ZW1wO1xuXG4gIHZhciBjb21wb25lbnROYW1lID0gV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG4gIHJldHVybiBfdGVtcCA9IF9jbGFzcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgIF9pbmhlcml0c0xvb3NlKG9uQ2xpY2tPdXRzaWRlLCBfQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIG9uQ2xpY2tPdXRzaWRlKHByb3BzKSB7XG4gICAgICB2YXIgX3RoaXM7XG5cbiAgICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSB8fCB0aGlzO1xuXG4gICAgICBfdGhpcy5fX291dHNpZGVDbGlja0hhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBfdGhpcy5fX2NsaWNrT3V0c2lkZUhhbmRsZXJQcm9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgX3RoaXMuX19jbGlja091dHNpZGVIYW5kbGVyUHJvcChldmVudCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5zdGFuY2UgPSBfdGhpcy5nZXRJbnN0YW5jZSgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UucHJvcHMuaGFuZGxlQ2xpY2tPdXRzaWRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaW5zdGFuY2UucHJvcHMuaGFuZGxlQ2xpY2tPdXRzaWRlKGV2ZW50KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmhhbmRsZUNsaWNrT3V0c2lkZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGluc3RhbmNlLmhhbmRsZUNsaWNrT3V0c2lkZShldmVudCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JhcHBlZENvbXBvbmVudDogXCIgKyBjb21wb25lbnROYW1lICsgXCIgbGFja3MgYSBoYW5kbGVDbGlja091dHNpZGUoZXZlbnQpIGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIG91dHNpZGUgY2xpY2sgZXZlbnRzLlwiKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl9fZ2V0Q29tcG9uZW50Tm9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gX3RoaXMuZ2V0SW5zdGFuY2UoKTtcblxuICAgICAgICBpZiAoY29uZmlnICYmIHR5cGVvZiBjb25maWcuc2V0Q2xpY2tPdXRzaWRlUmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbmZpZy5zZXRDbGlja091dHNpZGVSZWYoKShpbnN0YW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLnNldENsaWNrT3V0c2lkZVJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5zZXRDbGlja091dHNpZGVSZWYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaW5kRE9NTm9kZShpbnN0YW5jZSk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5lbmFibGVPbkNsaWNrT3V0c2lkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgZW5hYmxlZEluc3RhbmNlc1tfdGhpcy5fdWlkXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcGFzc2l2ZUV2ZW50U3VwcG9ydCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBwYXNzaXZlRXZlbnRTdXBwb3J0ID0gdGVzdFBhc3NpdmVFdmVudFN1cHBvcnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVuYWJsZWRJbnN0YW5jZXNbX3RoaXMuX3VpZF0gPSB0cnVlO1xuICAgICAgICB2YXIgZXZlbnRzID0gX3RoaXMucHJvcHMuZXZlbnRUeXBlcztcblxuICAgICAgICBpZiAoIWV2ZW50cy5mb3JFYWNoKSB7XG4gICAgICAgICAgZXZlbnRzID0gW2V2ZW50c107XG4gICAgICAgIH1cblxuICAgICAgICBoYW5kbGVyc01hcFtfdGhpcy5fdWlkXSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGlmIChfdGhpcy5jb21wb25lbnROb2RlID09PSBudWxsKSByZXR1cm47XG4gICAgICAgICAgaWYgKF90aGlzLmluaXRUaW1lU3RhbXAgPiBldmVudC50aW1lU3RhbXApIHJldHVybjtcblxuICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMucHJvcHMuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX3RoaXMucHJvcHMuZXhjbHVkZVNjcm9sbGJhciAmJiBjbGlja2VkU2Nyb2xsYmFyKGV2ZW50KSkgcmV0dXJuO1xuICAgICAgICAgIHZhciBjdXJyZW50ID0gZXZlbnQuY29tcG9zZWQgJiYgZXZlbnQuY29tcG9zZWRQYXRoICYmIGV2ZW50LmNvbXBvc2VkUGF0aCgpLnNoaWZ0KCkgfHwgZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgaWYgKGZpbmRIaWdoZXN0KGN1cnJlbnQsIF90aGlzLmNvbXBvbmVudE5vZGUsIF90aGlzLnByb3BzLm91dHNpZGVDbGlja0lnbm9yZUNsYXNzKSAhPT0gZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5fX291dHNpZGVDbGlja0hhbmRsZXIoZXZlbnQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcnNNYXBbX3RoaXMuX3VpZF0sIGdldEV2ZW50SGFuZGxlck9wdGlvbnMoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIGV2ZW50TmFtZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmRpc2FibGVPbkNsaWNrT3V0c2lkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVsZXRlIGVuYWJsZWRJbnN0YW5jZXNbX3RoaXMuX3VpZF07XG4gICAgICAgIHZhciBmbiA9IGhhbmRsZXJzTWFwW190aGlzLl91aWRdO1xuXG4gICAgICAgIGlmIChmbiAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdmFyIGV2ZW50cyA9IF90aGlzLnByb3BzLmV2ZW50VHlwZXM7XG5cbiAgICAgICAgICBpZiAoIWV2ZW50cy5mb3JFYWNoKSB7XG4gICAgICAgICAgICBldmVudHMgPSBbZXZlbnRzXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZuLCBnZXRFdmVudEhhbmRsZXJPcHRpb25zKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBldmVudE5hbWUpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkZWxldGUgaGFuZGxlcnNNYXBbX3RoaXMuX3VpZF07XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmdldFJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmluc3RhbmNlUmVmID0gcmVmO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuX3VpZCA9IHVpZCgpO1xuICAgICAgX3RoaXMuaW5pdFRpbWVTdGFtcCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgdGhlIFdyYXBwZWRDb21wb25lbnQncyBpbnN0YW5jZS5cbiAgICAgKi9cblxuXG4gICAgdmFyIF9wcm90byA9IG9uQ2xpY2tPdXRzaWRlLnByb3RvdHlwZTtcblxuICAgIF9wcm90by5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uIGdldEluc3RhbmNlKCkge1xuICAgICAgaWYgKFdyYXBwZWRDb21wb25lbnQucHJvdG90eXBlICYmICFXcmFwcGVkQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gdGhpcy5pbnN0YW5jZVJlZjtcbiAgICAgIHJldHVybiByZWYuZ2V0SW5zdGFuY2UgPyByZWYuZ2V0SW5zdGFuY2UoKSA6IHJlZjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkIGNsaWNrIGxpc3RlbmVycyB0byB0aGUgY3VycmVudCBkb2N1bWVudCxcbiAgICAgKiBsaW5rZWQgdG8gdGhpcyBjb21wb25lbnQncyBzdGF0ZS5cbiAgICAgKi9cbiAgICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIC8vIElmIHdlIGFyZSBpbiBhbiBlbnZpcm9ubWVudCB3aXRob3V0IGEgRE9NIHN1Y2hcbiAgICAgIC8vIGFzIHNoYWxsb3cgcmVuZGVyaW5nIG9yIHNuYXBzaG90cyB0aGVuIHdlIGV4aXRcbiAgICAgIC8vIGVhcmx5IHRvIHByZXZlbnQgYW55IHVuaGFuZGxlZCBlcnJvcnMgYmVpbmcgdGhyb3duLlxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmdldEluc3RhbmNlKCk7XG5cbiAgICAgIGlmIChjb25maWcgJiYgdHlwZW9mIGNvbmZpZy5oYW5kbGVDbGlja091dHNpZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5fX2NsaWNrT3V0c2lkZUhhbmRsZXJQcm9wID0gY29uZmlnLmhhbmRsZUNsaWNrT3V0c2lkZShpbnN0YW5jZSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9fY2xpY2tPdXRzaWRlSGFuZGxlclByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcmFwcGVkQ29tcG9uZW50OiBcIiArIGNvbXBvbmVudE5hbWUgKyBcIiBsYWNrcyBhIGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIG91dHNpZGUgY2xpY2sgZXZlbnRzIHNwZWNpZmllZCBieSB0aGUgaGFuZGxlQ2xpY2tPdXRzaWRlIGNvbmZpZyBvcHRpb24uXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29tcG9uZW50Tm9kZSA9IHRoaXMuX19nZXRDb21wb25lbnROb2RlKCk7IC8vIHJldHVybiBlYXJseSBzbyB3ZSBkb250IGluaXRpYXRlIG9uQ2xpY2tPdXRzaWRlXG5cbiAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVPbkNsaWNrT3V0c2lkZSkgcmV0dXJuO1xuICAgICAgdGhpcy5lbmFibGVPbkNsaWNrT3V0c2lkZSgpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdGhpcy5jb21wb25lbnROb2RlID0gdGhpcy5fX2dldENvbXBvbmVudE5vZGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCBkb2N1bWVudCdzIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhpcyBjb21wb25lbnRcbiAgICAgKi9cbiAgICA7XG5cbiAgICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuZGlzYWJsZU9uQ2xpY2tPdXRzaWRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbiBiZSBjYWxsZWQgdG8gZXhwbGljaXRseSBlbmFibGUgZXZlbnQgbGlzdGVuaW5nXG4gICAgICogZm9yIGNsaWNrcyBhbmQgdG91Y2hlcyBvdXRzaWRlIG9mIHRoaXMgZWxlbWVudC5cbiAgICAgKi9cbiAgICA7XG5cbiAgICAvKipcbiAgICAgKiBQYXNzLXRocm91Z2ggcmVuZGVyXG4gICAgICovXG4gICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgICBfdGhpcyRwcm9wcy5leGNsdWRlU2Nyb2xsYmFyO1xuICAgICAgICAgIHZhciBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF90aGlzJHByb3BzLCBbXCJleGNsdWRlU2Nyb2xsYmFyXCJdKTtcblxuICAgICAgaWYgKFdyYXBwZWRDb21wb25lbnQucHJvdG90eXBlICYmIFdyYXBwZWRDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpIHtcbiAgICAgICAgcHJvcHMucmVmID0gdGhpcy5nZXRSZWY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wcy53cmFwcGVkUmVmID0gdGhpcy5nZXRSZWY7XG4gICAgICB9XG5cbiAgICAgIHByb3BzLmRpc2FibGVPbkNsaWNrT3V0c2lkZSA9IHRoaXMuZGlzYWJsZU9uQ2xpY2tPdXRzaWRlO1xuICAgICAgcHJvcHMuZW5hYmxlT25DbGlja091dHNpZGUgPSB0aGlzLmVuYWJsZU9uQ2xpY2tPdXRzaWRlO1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwgcHJvcHMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gb25DbGlja091dHNpZGU7XG4gIH0oQ29tcG9uZW50KSwgX2NsYXNzLmRpc3BsYXlOYW1lID0gXCJPbkNsaWNrT3V0c2lkZShcIiArIGNvbXBvbmVudE5hbWUgKyBcIilcIiwgX2NsYXNzLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBldmVudFR5cGVzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0J10sXG4gICAgZXhjbHVkZVNjcm9sbGJhcjogY29uZmlnICYmIGNvbmZpZy5leGNsdWRlU2Nyb2xsYmFyIHx8IGZhbHNlLFxuICAgIG91dHNpZGVDbGlja0lnbm9yZUNsYXNzOiBJR05PUkVfQ0xBU1NfTkFNRSxcbiAgICBwcmV2ZW50RGVmYXVsdDogZmFsc2UsXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmYWxzZVxuICB9LCBfY2xhc3MuZ2V0Q2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFdyYXBwZWRDb21wb25lbnQuZ2V0Q2xhc3MgPyBXcmFwcGVkQ29tcG9uZW50LmdldENsYXNzKCkgOiBXcmFwcGVkQ29tcG9uZW50O1xuICB9LCBfdGVtcDtcbn1leHBvcnQgZGVmYXVsdCBvbkNsaWNrT3V0c2lkZUhPQztleHBvcnR7SUdOT1JFX0NMQVNTX05BTUV9OyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHN0eWxlU2luZ2xldG9uIH0gZnJvbSAncmVhY3Qtc3R5bGUtc2luZ2xldG9uJztcbmltcG9ydCB7IGZ1bGxXaWR0aENsYXNzTmFtZSwgemVyb1JpZ2h0Q2xhc3NOYW1lLCBub1Njcm9sbGJhcnNDbGFzc05hbWUsIHJlbW92ZWRCYXJTaXplVmFyaWFibGUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRHYXBXaWR0aCB9IGZyb20gJy4vdXRpbHMnO1xudmFyIFN0eWxlID0gc3R5bGVTaW5nbGV0b24oKTtcbi8vIGltcG9ydGFudCB0aXAgLSBvbmNlIHdlIG1lYXN1cmUgc2Nyb2xsQmFyIHdpZHRoIGFuZCByZW1vdmUgdGhlbVxuLy8gd2UgY291bGQgbm90IHJlcGVhdCB0aGlzIG9wZXJhdGlvblxuLy8gdGh1cyB3ZSBhcmUgdXNpbmcgc3R5bGUtc2luZ2xldG9uIC0gb25seSB0aGUgZmlyc3QgXCJ5ZXQgY29ycmVjdFwiIHN0eWxlIHdpbGwgYmUgYXBwbGllZC5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiAoX2EsIGFsbG93UmVsYXRpdmUsIGdhcE1vZGUsIGltcG9ydGFudCkge1xuICAgIHZhciBsZWZ0ID0gX2EubGVmdCwgdG9wID0gX2EudG9wLCByaWdodCA9IF9hLnJpZ2h0LCBnYXAgPSBfYS5nYXA7XG4gICAgaWYgKGdhcE1vZGUgPT09IHZvaWQgMCkgeyBnYXBNb2RlID0gJ21hcmdpbic7IH1cbiAgICByZXR1cm4gXCJcXG4gIC5cIi5jb25jYXQobm9TY3JvbGxiYXJzQ2xhc3NOYW1lLCBcIiB7XFxuICAgb3ZlcmZsb3c6IGhpZGRlbiBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICAgcGFkZGluZy1yaWdodDogXCIpLmNvbmNhdChnYXAsIFwicHggXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgfVxcbiAgYm9keSB7XFxuICAgIG92ZXJmbG93OiBoaWRkZW4gXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluO1xcbiAgICBcIikuY29uY2F0KFtcbiAgICAgICAgYWxsb3dSZWxhdGl2ZSAmJiBcInBvc2l0aW9uOiByZWxhdGl2ZSBcIi5jb25jYXQoaW1wb3J0YW50LCBcIjtcIiksXG4gICAgICAgIGdhcE1vZGUgPT09ICdtYXJnaW4nICYmXG4gICAgICAgICAgICBcIlxcbiAgICBwYWRkaW5nLWxlZnQ6IFwiLmNvbmNhdChsZWZ0LCBcInB4O1xcbiAgICBwYWRkaW5nLXRvcDogXCIpLmNvbmNhdCh0b3AsIFwicHg7XFxuICAgIHBhZGRpbmctcmlnaHQ6IFwiKS5jb25jYXQocmlnaHQsIFwicHg7XFxuICAgIG1hcmdpbi1sZWZ0OjA7XFxuICAgIG1hcmdpbi10b3A6MDtcXG4gICAgbWFyZ2luLXJpZ2h0OiBcIikuY29uY2F0KGdhcCwgXCJweCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICAgIFwiKSxcbiAgICAgICAgZ2FwTW9kZSA9PT0gJ3BhZGRpbmcnICYmIFwicGFkZGluZy1yaWdodDogXCIuY29uY2F0KGdhcCwgXCJweCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XCIpLFxuICAgIF1cbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuam9pbignJyksIFwiXFxuICB9XFxuICBcXG4gIC5cIikuY29uY2F0KHplcm9SaWdodENsYXNzTmFtZSwgXCIge1xcbiAgICByaWdodDogXCIpLmNvbmNhdChnYXAsIFwicHggXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgfVxcbiAgXFxuICAuXCIpLmNvbmNhdChmdWxsV2lkdGhDbGFzc05hbWUsIFwiIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiBcIikuY29uY2F0KGdhcCwgXCJweCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICB9XFxuICBcXG4gIC5cIikuY29uY2F0KHplcm9SaWdodENsYXNzTmFtZSwgXCIgLlwiKS5jb25jYXQoemVyb1JpZ2h0Q2xhc3NOYW1lLCBcIiB7XFxuICAgIHJpZ2h0OiAwIFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gIH1cXG4gIFxcbiAgLlwiKS5jb25jYXQoZnVsbFdpZHRoQ2xhc3NOYW1lLCBcIiAuXCIpLmNvbmNhdChmdWxsV2lkdGhDbGFzc05hbWUsIFwiIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiAwIFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gIH1cXG4gIFxcbiAgYm9keSB7XFxuICAgIFwiKS5jb25jYXQocmVtb3ZlZEJhclNpemVWYXJpYWJsZSwgXCI6IFwiKS5jb25jYXQoZ2FwLCBcInB4O1xcbiAgfVxcblwiKTtcbn07XG4vKipcbiAqIFJlbW92ZXMgcGFnZSBzY3JvbGxiYXIgYW5kIGJsb2NrcyBwYWdlIHNjcm9sbCB3aGVuIG1vdW50ZWRcbiAqL1xuZXhwb3J0IHZhciBSZW1vdmVTY3JvbGxCYXIgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICB2YXIgbm9SZWxhdGl2ZSA9IHByb3BzLm5vUmVsYXRpdmUsIG5vSW1wb3J0YW50ID0gcHJvcHMubm9JbXBvcnRhbnQsIF9hID0gcHJvcHMuZ2FwTW9kZSwgZ2FwTW9kZSA9IF9hID09PSB2b2lkIDAgPyAnbWFyZ2luJyA6IF9hO1xuICAgIC8qXG4gICAgIGdhcCB3aWxsIGJlIG1lYXN1cmVkIG9uIGV2ZXJ5IGNvbXBvbmVudCBtb3VudFxuICAgICBob3dldmVyIGl0IHdpbGwgYmUgdXNlZCBvbmx5IGJ5IHRoZSBcImZpcnN0XCIgaW52b2NhdGlvblxuICAgICBkdWUgdG8gc2luZ2xldG9uIG5hdHVyZSBvZiA8U3R5bGVcbiAgICAgKi9cbiAgICB2YXIgZ2FwID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7IHJldHVybiBnZXRHYXBXaWR0aChnYXBNb2RlKTsgfSwgW2dhcE1vZGVdKTtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdHlsZSwgeyBzdHlsZXM6IGdldFN0eWxlcyhnYXAsICFub1JlbGF0aXZlLCBnYXBNb2RlLCAhbm9JbXBvcnRhbnQgPyAnIWltcG9ydGFudCcgOiAnJykgfSk7XG59O1xuIiwiZXhwb3J0IHZhciB6ZXJvUmlnaHRDbGFzc05hbWUgPSAncmlnaHQtc2Nyb2xsLWJhci1wb3NpdGlvbic7XG5leHBvcnQgdmFyIGZ1bGxXaWR0aENsYXNzTmFtZSA9ICd3aWR0aC1iZWZvcmUtc2Nyb2xsLWJhcic7XG5leHBvcnQgdmFyIG5vU2Nyb2xsYmFyc0NsYXNzTmFtZSA9ICd3aXRoLXNjcm9sbC1iYXJzLWhpZGRlbic7XG4vKipcbiAqIE5hbWUgb2YgYSBDU1MgdmFyaWFibGUgY29udGFpbmluZyB0aGUgYW1vdW50IG9mIFwiaGlkZGVuXCIgc2Nyb2xsYmFyXG4gKiAhIG1pZ2h0IGJlIHVuZGVmaW5lZCAhIHVzZSB3aWxsIGZhbGxiYWNrIVxuICovXG5leHBvcnQgdmFyIHJlbW92ZWRCYXJTaXplVmFyaWFibGUgPSAnLS1yZW1vdmVkLWJvZHktc2Nyb2xsLWJhci1zaXplJztcbiIsImltcG9ydCB7IFJlbW92ZVNjcm9sbEJhciB9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7IHplcm9SaWdodENsYXNzTmFtZSwgZnVsbFdpZHRoQ2xhc3NOYW1lLCBub1Njcm9sbGJhcnNDbGFzc05hbWUsIHJlbW92ZWRCYXJTaXplVmFyaWFibGUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRHYXBXaWR0aCB9IGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0IHsgUmVtb3ZlU2Nyb2xsQmFyLCB6ZXJvUmlnaHRDbGFzc05hbWUsIGZ1bGxXaWR0aENsYXNzTmFtZSwgbm9TY3JvbGxiYXJzQ2xhc3NOYW1lLCByZW1vdmVkQmFyU2l6ZVZhcmlhYmxlLCBnZXRHYXBXaWR0aCwgfTtcbiIsImV4cG9ydCB2YXIgemVyb0dhcCA9IHtcbiAgICBsZWZ0OiAwLFxuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBnYXA6IDAsXG59O1xudmFyIHBhcnNlID0gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHBhcnNlSW50KHggfHwgJycsIDEwKSB8fCAwOyB9O1xudmFyIGdldE9mZnNldCA9IGZ1bmN0aW9uIChnYXBNb2RlKSB7XG4gICAgdmFyIGNzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSk7XG4gICAgdmFyIGxlZnQgPSBjc1tnYXBNb2RlID09PSAncGFkZGluZycgPyAncGFkZGluZ0xlZnQnIDogJ21hcmdpbkxlZnQnXTtcbiAgICB2YXIgdG9wID0gY3NbZ2FwTW9kZSA9PT0gJ3BhZGRpbmcnID8gJ3BhZGRpbmdUb3AnIDogJ21hcmdpblRvcCddO1xuICAgIHZhciByaWdodCA9IGNzW2dhcE1vZGUgPT09ICdwYWRkaW5nJyA/ICdwYWRkaW5nUmlnaHQnIDogJ21hcmdpblJpZ2h0J107XG4gICAgcmV0dXJuIFtwYXJzZShsZWZ0KSwgcGFyc2UodG9wKSwgcGFyc2UocmlnaHQpXTtcbn07XG5leHBvcnQgdmFyIGdldEdhcFdpZHRoID0gZnVuY3Rpb24gKGdhcE1vZGUpIHtcbiAgICBpZiAoZ2FwTW9kZSA9PT0gdm9pZCAwKSB7IGdhcE1vZGUgPSAnbWFyZ2luJzsgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gemVyb0dhcDtcbiAgICB9XG4gICAgdmFyIG9mZnNldHMgPSBnZXRPZmZzZXQoZ2FwTW9kZSk7XG4gICAgdmFyIGRvY3VtZW50V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgdmFyIHdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogb2Zmc2V0c1swXSxcbiAgICAgICAgdG9wOiBvZmZzZXRzWzFdLFxuICAgICAgICByaWdodDogb2Zmc2V0c1syXSxcbiAgICAgICAgZ2FwOiBNYXRoLm1heCgwLCB3aW5kb3dXaWR0aCAtIGRvY3VtZW50V2lkdGggKyBvZmZzZXRzWzJdIC0gb2Zmc2V0c1swXSksXG4gICAgfTtcbn07XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUmVtb3ZlU2Nyb2xsIH0gZnJvbSAnLi9VSSc7XG5pbXBvcnQgU2lkZUNhciBmcm9tICcuL3NpZGVjYXInO1xudmFyIFJlYWN0UmVtb3ZlU2Nyb2xsID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikgeyByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVtb3ZlU2Nyb2xsLCBfX2Fzc2lnbih7fSwgcHJvcHMsIHsgcmVmOiByZWYsIHNpZGVDYXI6IFNpZGVDYXIgfSkpKTsgfSk7XG5SZWFjdFJlbW92ZVNjcm9sbC5jbGFzc05hbWVzID0gUmVtb3ZlU2Nyb2xsLmNsYXNzTmFtZXM7XG5leHBvcnQgZGVmYXVsdCBSZWFjdFJlbW92ZVNjcm9sbDtcbiIsImltcG9ydCB7IF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFJlbW92ZVNjcm9sbEJhciB9IGZyb20gJ3JlYWN0LXJlbW92ZS1zY3JvbGwtYmFyJztcbmltcG9ydCB7IHN0eWxlU2luZ2xldG9uIH0gZnJvbSAncmVhY3Qtc3R5bGUtc2luZ2xldG9uJztcbmltcG9ydCB7IG5vblBhc3NpdmUgfSBmcm9tICcuL2FnZ3Jlc2l2ZUNhcHR1cmUnO1xuaW1wb3J0IHsgaGFuZGxlU2Nyb2xsLCBsb2NhdGlvbkNvdWxkQmVTY3JvbGxlZCB9IGZyb20gJy4vaGFuZGxlU2Nyb2xsJztcbmV4cG9ydCB2YXIgZ2V0VG91Y2hYWSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2hhbmdlZFRvdWNoZXMnIGluIGV2ZW50ID8gW2V2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFldIDogWzAsIDBdO1xufTtcbmV4cG9ydCB2YXIgZ2V0RGVsdGFYWSA9IGZ1bmN0aW9uIChldmVudCkgeyByZXR1cm4gW2V2ZW50LmRlbHRhWCwgZXZlbnQuZGVsdGFZXTsgfTtcbnZhciBleHRyYWN0UmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgIHJldHVybiByZWYgJiYgJ2N1cnJlbnQnIGluIHJlZiA/IHJlZi5jdXJyZW50IDogcmVmO1xufTtcbnZhciBkZWx0YUNvbXBhcmUgPSBmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4geFswXSA9PT0geVswXSAmJiB4WzFdID09PSB5WzFdOyB9O1xudmFyIGdlbmVyYXRlU3R5bGUgPSBmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIFwiXFxuICAuYmxvY2staW50ZXJhY3Rpdml0eS1cIi5jb25jYXQoaWQsIFwiIHtwb2ludGVyLWV2ZW50czogbm9uZTt9XFxuICAuYWxsb3ctaW50ZXJhY3Rpdml0eS1cIikuY29uY2F0KGlkLCBcIiB7cG9pbnRlci1ldmVudHM6IGFsbDt9XFxuXCIpOyB9O1xudmFyIGlkQ291bnRlciA9IDA7XG52YXIgbG9ja1N0YWNrID0gW107XG5leHBvcnQgZnVuY3Rpb24gUmVtb3ZlU2Nyb2xsU2lkZUNhcihwcm9wcykge1xuICAgIHZhciBzaG91bGRQcmV2ZW50UXVldWUgPSBSZWFjdC51c2VSZWYoW10pO1xuICAgIHZhciB0b3VjaFN0YXJ0UmVmID0gUmVhY3QudXNlUmVmKFswLCAwXSk7XG4gICAgdmFyIGFjdGl2ZUF4aXMgPSBSZWFjdC51c2VSZWYoKTtcbiAgICB2YXIgaWQgPSBSZWFjdC51c2VTdGF0ZShpZENvdW50ZXIrKylbMF07XG4gICAgdmFyIFN0eWxlID0gUmVhY3QudXNlU3RhdGUoc3R5bGVTaW5nbGV0b24pWzBdO1xuICAgIHZhciBsYXN0UHJvcHMgPSBSZWFjdC51c2VSZWYocHJvcHMpO1xuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxhc3RQcm9wcy5jdXJyZW50ID0gcHJvcHM7XG4gICAgfSwgW3Byb3BzXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHByb3BzLmluZXJ0KSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoXCJibG9jay1pbnRlcmFjdGl2aXR5LVwiLmNvbmNhdChpZCkpO1xuICAgICAgICAgICAgdmFyIGFsbG93XzEgPSBfX3NwcmVhZEFycmF5KFtwcm9wcy5sb2NrUmVmLmN1cnJlbnRdLCAocHJvcHMuc2hhcmRzIHx8IFtdKS5tYXAoZXh0cmFjdFJlZiksIHRydWUpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgIGFsbG93XzEuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoXCJhbGxvdy1pbnRlcmFjdGl2aXR5LVwiLmNvbmNhdChpZCkpOyB9KTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKFwiYmxvY2staW50ZXJhY3Rpdml0eS1cIi5jb25jYXQoaWQpKTtcbiAgICAgICAgICAgICAgICBhbGxvd18xLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5jbGFzc0xpc3QucmVtb3ZlKFwiYWxsb3ctaW50ZXJhY3Rpdml0eS1cIi5jb25jYXQoaWQpKTsgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9LCBbcHJvcHMuaW5lcnQsIHByb3BzLmxvY2tSZWYuY3VycmVudCwgcHJvcHMuc2hhcmRzXSk7XG4gICAgdmFyIHNob3VsZENhbmNlbEV2ZW50ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50LCBwYXJlbnQpIHtcbiAgICAgICAgaWYgKCd0b3VjaGVzJyBpbiBldmVudCAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgcmV0dXJuICFsYXN0UHJvcHMuY3VycmVudC5hbGxvd1BpbmNoWm9vbTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdG91Y2ggPSBnZXRUb3VjaFhZKGV2ZW50KTtcbiAgICAgICAgdmFyIHRvdWNoU3RhcnQgPSB0b3VjaFN0YXJ0UmVmLmN1cnJlbnQ7XG4gICAgICAgIHZhciBkZWx0YVggPSAnZGVsdGFYJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWCA6IHRvdWNoU3RhcnRbMF0gLSB0b3VjaFswXTtcbiAgICAgICAgdmFyIGRlbHRhWSA9ICdkZWx0YVknIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFZIDogdG91Y2hTdGFydFsxXSAtIHRvdWNoWzFdO1xuICAgICAgICB2YXIgY3VycmVudEF4aXM7XG4gICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgIHZhciBtb3ZlRGlyZWN0aW9uID0gTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkgPyAnaCcgOiAndic7XG4gICAgICAgIC8vIGFsbG93IGhvcml6b250YWwgdG91Y2ggbW92ZSBvbiBSYW5nZSBpbnB1dHMuIFRoZXkgd2lsbCBub3QgY2F1c2UgYW55IHNjcm9sbFxuICAgICAgICBpZiAoJ3RvdWNoZXMnIGluIGV2ZW50ICYmIG1vdmVEaXJlY3Rpb24gPT09ICdoJyAmJiB0YXJnZXQudHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjYW5CZVNjcm9sbGVkSW5NYWluRGlyZWN0aW9uID0gbG9jYXRpb25Db3VsZEJlU2Nyb2xsZWQobW92ZURpcmVjdGlvbiwgdGFyZ2V0KTtcbiAgICAgICAgaWYgKCFjYW5CZVNjcm9sbGVkSW5NYWluRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FuQmVTY3JvbGxlZEluTWFpbkRpcmVjdGlvbikge1xuICAgICAgICAgICAgY3VycmVudEF4aXMgPSBtb3ZlRGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudEF4aXMgPSBtb3ZlRGlyZWN0aW9uID09PSAndicgPyAnaCcgOiAndic7XG4gICAgICAgICAgICBjYW5CZVNjcm9sbGVkSW5NYWluRGlyZWN0aW9uID0gbG9jYXRpb25Db3VsZEJlU2Nyb2xsZWQobW92ZURpcmVjdGlvbiwgdGFyZ2V0KTtcbiAgICAgICAgICAgIC8vIG90aGVyIGF4aXMgbWlnaHQgYmUgbm90IHNjcm9sbGFibGVcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNhbkJlU2Nyb2xsZWRJbk1haW5EaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFjdGl2ZUF4aXMuY3VycmVudCAmJiAnY2hhbmdlZFRvdWNoZXMnIGluIGV2ZW50ICYmIChkZWx0YVggfHwgZGVsdGFZKSkge1xuICAgICAgICAgICAgYWN0aXZlQXhpcy5jdXJyZW50ID0gY3VycmVudEF4aXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjdXJyZW50QXhpcykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhbmNlbGluZ0F4aXMgPSBhY3RpdmVBeGlzLmN1cnJlbnQgfHwgY3VycmVudEF4aXM7XG4gICAgICAgIHJldHVybiBoYW5kbGVTY3JvbGwoY2FuY2VsaW5nQXhpcywgcGFyZW50LCBldmVudCwgY2FuY2VsaW5nQXhpcyA9PT0gJ2gnID8gZGVsdGFYIDogZGVsdGFZLCB0cnVlKTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIHNob3VsZFByZXZlbnQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoX2V2ZW50KSB7XG4gICAgICAgIHZhciBldmVudCA9IF9ldmVudDtcbiAgICAgICAgaWYgKCFsb2NrU3RhY2subGVuZ3RoIHx8IGxvY2tTdGFja1tsb2NrU3RhY2subGVuZ3RoIC0gMV0gIT09IFN0eWxlKSB7XG4gICAgICAgICAgICAvLyBub3QgdGhlIGxhc3QgYWN0aXZlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlbHRhID0gJ2RlbHRhWScgaW4gZXZlbnQgPyBnZXREZWx0YVhZKGV2ZW50KSA6IGdldFRvdWNoWFkoZXZlbnQpO1xuICAgICAgICB2YXIgc291cmNlRXZlbnQgPSBzaG91bGRQcmV2ZW50UXVldWUuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUubmFtZSA9PT0gZXZlbnQudHlwZSAmJiAoZS50YXJnZXQgPT09IGV2ZW50LnRhcmdldCB8fCBldmVudC50YXJnZXQgPT09IGUuc2hhZG93UGFyZW50KSAmJiBkZWx0YUNvbXBhcmUoZS5kZWx0YSwgZGVsdGEpOyB9KVswXTtcbiAgICAgICAgLy8gc2VsZiBldmVudCwgYW5kIHNob3VsZCBiZSBjYW5jZWxlZFxuICAgICAgICBpZiAoc291cmNlRXZlbnQgJiYgc291cmNlRXZlbnQuc2hvdWxkKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3V0c2lkZSBvciBzaGFyZCBldmVudFxuICAgICAgICBpZiAoIXNvdXJjZUV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgc2hhcmROb2RlcyA9IChsYXN0UHJvcHMuY3VycmVudC5zaGFyZHMgfHwgW10pXG4gICAgICAgICAgICAgICAgLm1hcChleHRyYWN0UmVmKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7IH0pO1xuICAgICAgICAgICAgdmFyIHNob3VsZFN0b3AgPSBzaGFyZE5vZGVzLmxlbmd0aCA+IDAgPyBzaG91bGRDYW5jZWxFdmVudChldmVudCwgc2hhcmROb2Rlc1swXSkgOiAhbGFzdFByb3BzLmN1cnJlbnQubm9Jc29sYXRpb247XG4gICAgICAgICAgICBpZiAoc2hvdWxkU3RvcCkge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgW10pO1xuICAgIHZhciBzaG91bGRDYW5jZWwgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobmFtZSwgZGVsdGEsIHRhcmdldCwgc2hvdWxkKSB7XG4gICAgICAgIHZhciBldmVudCA9IHsgbmFtZTogbmFtZSwgZGVsdGE6IGRlbHRhLCB0YXJnZXQ6IHRhcmdldCwgc2hvdWxkOiBzaG91bGQsIHNoYWRvd1BhcmVudDogZ2V0T3V0ZXJtb3N0U2hhZG93UGFyZW50KHRhcmdldCkgfTtcbiAgICAgICAgc2hvdWxkUHJldmVudFF1ZXVlLmN1cnJlbnQucHVzaChldmVudCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2hvdWxkUHJldmVudFF1ZXVlLmN1cnJlbnQgPSBzaG91bGRQcmV2ZW50UXVldWUuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUgIT09IGV2ZW50OyB9KTtcbiAgICAgICAgfSwgMSk7XG4gICAgfSwgW10pO1xuICAgIHZhciBzY3JvbGxUb3VjaFN0YXJ0ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHRvdWNoU3RhcnRSZWYuY3VycmVudCA9IGdldFRvdWNoWFkoZXZlbnQpO1xuICAgICAgICBhY3RpdmVBeGlzLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgfSwgW10pO1xuICAgIHZhciBzY3JvbGxXaGVlbCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBzaG91bGRDYW5jZWwoZXZlbnQudHlwZSwgZ2V0RGVsdGFYWShldmVudCksIGV2ZW50LnRhcmdldCwgc2hvdWxkQ2FuY2VsRXZlbnQoZXZlbnQsIHByb3BzLmxvY2tSZWYuY3VycmVudCkpO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgc2Nyb2xsVG91Y2hNb3ZlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHNob3VsZENhbmNlbChldmVudC50eXBlLCBnZXRUb3VjaFhZKGV2ZW50KSwgZXZlbnQudGFyZ2V0LCBzaG91bGRDYW5jZWxFdmVudChldmVudCwgcHJvcHMubG9ja1JlZi5jdXJyZW50KSk7XG4gICAgfSwgW10pO1xuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxvY2tTdGFjay5wdXNoKFN0eWxlKTtcbiAgICAgICAgcHJvcHMuc2V0Q2FsbGJhY2tzKHtcbiAgICAgICAgICAgIG9uU2Nyb2xsQ2FwdHVyZTogc2Nyb2xsV2hlZWwsXG4gICAgICAgICAgICBvbldoZWVsQ2FwdHVyZTogc2Nyb2xsV2hlZWwsXG4gICAgICAgICAgICBvblRvdWNoTW92ZUNhcHR1cmU6IHNjcm9sbFRvdWNoTW92ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgc2hvdWxkUHJldmVudCwgbm9uUGFzc2l2ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHNob3VsZFByZXZlbnQsIG5vblBhc3NpdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgc2Nyb2xsVG91Y2hTdGFydCwgbm9uUGFzc2l2ZSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsb2NrU3RhY2sgPSBsb2NrU3RhY2suZmlsdGVyKGZ1bmN0aW9uIChpbnN0KSB7IHJldHVybiBpbnN0ICE9PSBTdHlsZTsgfSk7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHNob3VsZFByZXZlbnQsIG5vblBhc3NpdmUpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgc2hvdWxkUHJldmVudCwgbm9uUGFzc2l2ZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgc2Nyb2xsVG91Y2hTdGFydCwgbm9uUGFzc2l2ZSk7XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuICAgIHZhciByZW1vdmVTY3JvbGxCYXIgPSBwcm9wcy5yZW1vdmVTY3JvbGxCYXIsIGluZXJ0ID0gcHJvcHMuaW5lcnQ7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBpbmVydCA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3R5bGUsIHsgc3R5bGVzOiBnZW5lcmF0ZVN0eWxlKGlkKSB9KSA6IG51bGwsXG4gICAgICAgIHJlbW92ZVNjcm9sbEJhciA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVtb3ZlU2Nyb2xsQmFyLCB7IGdhcE1vZGU6IHByb3BzLmdhcE1vZGUgfSkgOiBudWxsKSk7XG59XG5mdW5jdGlvbiBnZXRPdXRlcm1vc3RTaGFkb3dQYXJlbnQobm9kZSkge1xuICAgIHZhciBzaGFkb3dQYXJlbnQgPSBudWxsO1xuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgc2hhZG93UGFyZW50ID0gbm9kZS5ob3N0O1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93UGFyZW50O1xufVxuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZnVsbFdpZHRoQ2xhc3NOYW1lLCB6ZXJvUmlnaHRDbGFzc05hbWUgfSBmcm9tICdyZWFjdC1yZW1vdmUtc2Nyb2xsLWJhci9jb25zdGFudHMnO1xuaW1wb3J0IHsgdXNlTWVyZ2VSZWZzIH0gZnJvbSAndXNlLWNhbGxiYWNrLXJlZic7XG5pbXBvcnQgeyBlZmZlY3RDYXIgfSBmcm9tICcuL21lZGl1bSc7XG52YXIgbm90aGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm47XG59O1xuLyoqXG4gKiBSZW1vdmVzIHNjcm9sbGJhciBmcm9tIHRoZSBwYWdlIGFuZCBjb250YWluIHRoZSBzY3JvbGwgd2l0aGluIHRoZSBMb2NrXG4gKi9cbnZhciBSZW1vdmVTY3JvbGwgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcGFyZW50UmVmKSB7XG4gICAgdmFyIHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICB2YXIgX2EgPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgICAgIG9uU2Nyb2xsQ2FwdHVyZTogbm90aGluZyxcbiAgICAgICAgb25XaGVlbENhcHR1cmU6IG5vdGhpbmcsXG4gICAgICAgIG9uVG91Y2hNb3ZlQ2FwdHVyZTogbm90aGluZyxcbiAgICB9KSwgY2FsbGJhY2tzID0gX2FbMF0sIHNldENhbGxiYWNrcyA9IF9hWzFdO1xuICAgIHZhciBmb3J3YXJkUHJvcHMgPSBwcm9wcy5mb3J3YXJkUHJvcHMsIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSwgcmVtb3ZlU2Nyb2xsQmFyID0gcHJvcHMucmVtb3ZlU2Nyb2xsQmFyLCBlbmFibGVkID0gcHJvcHMuZW5hYmxlZCwgc2hhcmRzID0gcHJvcHMuc2hhcmRzLCBzaWRlQ2FyID0gcHJvcHMuc2lkZUNhciwgbm9Jc29sYXRpb24gPSBwcm9wcy5ub0lzb2xhdGlvbiwgaW5lcnQgPSBwcm9wcy5pbmVydCwgYWxsb3dQaW5jaFpvb20gPSBwcm9wcy5hbGxvd1BpbmNoWm9vbSwgX2IgPSBwcm9wcy5hcywgQ29udGFpbmVyID0gX2IgPT09IHZvaWQgMCA/ICdkaXYnIDogX2IsIGdhcE1vZGUgPSBwcm9wcy5nYXBNb2RlLCByZXN0ID0gX19yZXN0KHByb3BzLCBbXCJmb3J3YXJkUHJvcHNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcInJlbW92ZVNjcm9sbEJhclwiLCBcImVuYWJsZWRcIiwgXCJzaGFyZHNcIiwgXCJzaWRlQ2FyXCIsIFwibm9Jc29sYXRpb25cIiwgXCJpbmVydFwiLCBcImFsbG93UGluY2hab29tXCIsIFwiYXNcIiwgXCJnYXBNb2RlXCJdKTtcbiAgICB2YXIgU2lkZUNhciA9IHNpZGVDYXI7XG4gICAgdmFyIGNvbnRhaW5lclJlZiA9IHVzZU1lcmdlUmVmcyhbcmVmLCBwYXJlbnRSZWZdKTtcbiAgICB2YXIgY29udGFpbmVyUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVzdCksIGNhbGxiYWNrcyk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBlbmFibGVkICYmIChSZWFjdC5jcmVhdGVFbGVtZW50KFNpZGVDYXIsIHsgc2lkZUNhcjogZWZmZWN0Q2FyLCByZW1vdmVTY3JvbGxCYXI6IHJlbW92ZVNjcm9sbEJhciwgc2hhcmRzOiBzaGFyZHMsIG5vSXNvbGF0aW9uOiBub0lzb2xhdGlvbiwgaW5lcnQ6IGluZXJ0LCBzZXRDYWxsYmFja3M6IHNldENhbGxiYWNrcywgYWxsb3dQaW5jaFpvb206ICEhYWxsb3dQaW5jaFpvb20sIGxvY2tSZWY6IHJlZiwgZ2FwTW9kZTogZ2FwTW9kZSB9KSksXG4gICAgICAgIGZvcndhcmRQcm9wcyA/IChSZWFjdC5jbG9uZUVsZW1lbnQoUmVhY3QuQ2hpbGRyZW4ub25seShjaGlsZHJlbiksIF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb250YWluZXJQcm9wcyksIHsgcmVmOiBjb250YWluZXJSZWYgfSkpKSA6IChSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRhaW5lciwgX19hc3NpZ24oe30sIGNvbnRhaW5lclByb3BzLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lLCByZWY6IGNvbnRhaW5lclJlZiB9KSwgY2hpbGRyZW4pKSkpO1xufSk7XG5SZW1vdmVTY3JvbGwuZGVmYXVsdFByb3BzID0ge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgcmVtb3ZlU2Nyb2xsQmFyOiB0cnVlLFxuICAgIGluZXJ0OiBmYWxzZSxcbn07XG5SZW1vdmVTY3JvbGwuY2xhc3NOYW1lcyA9IHtcbiAgICBmdWxsV2lkdGg6IGZ1bGxXaWR0aENsYXNzTmFtZSxcbiAgICB6ZXJvUmlnaHQ6IHplcm9SaWdodENsYXNzTmFtZSxcbn07XG5leHBvcnQgeyBSZW1vdmVTY3JvbGwgfTtcbiIsInZhciBwYXNzaXZlU3VwcG9ydGVkID0gZmFsc2U7XG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBwYXNzaXZlU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBwYXNzaXZlU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgfVxufVxuZXhwb3J0IHZhciBub25QYXNzaXZlID0gcGFzc2l2ZVN1cHBvcnRlZCA/IHsgcGFzc2l2ZTogZmFsc2UgfSA6IGZhbHNlO1xuIiwidmFyIGFsd2F5c0NvbnRhaW5zU2Nyb2xsID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAvLyB0ZXh0YXJlYSB3aWxsIGFsd2F5cyBfY29udGFpbl8gc2Nyb2xsIGluc2lkZSBzZWxmLiBJdCBvbmx5IGNhbiBiZSBoaWRkZW5cbiAgICByZXR1cm4gbm9kZS50YWdOYW1lID09PSAnVEVYVEFSRUEnO1xufTtcbnZhciBlbGVtZW50Q2FuQmVTY3JvbGxlZCA9IGZ1bmN0aW9uIChub2RlLCBvdmVyZmxvdykge1xuICAgIHZhciBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICByZXR1cm4gKFxuICAgIC8vIG5vdC1ub3Qtc2Nyb2xsYWJsZVxuICAgIHN0eWxlc1tvdmVyZmxvd10gIT09ICdoaWRkZW4nICYmXG4gICAgICAgIC8vIGNvbnRhaW5zIHNjcm9sbCBpbnNpZGUgc2VsZlxuICAgICAgICAhKHN0eWxlcy5vdmVyZmxvd1kgPT09IHN0eWxlcy5vdmVyZmxvd1ggJiYgIWFsd2F5c0NvbnRhaW5zU2Nyb2xsKG5vZGUpICYmIHN0eWxlc1tvdmVyZmxvd10gPT09ICd2aXNpYmxlJykpO1xufTtcbnZhciBlbGVtZW50Q291bGRCZVZTY3JvbGxlZCA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBlbGVtZW50Q2FuQmVTY3JvbGxlZChub2RlLCAnb3ZlcmZsb3dZJyk7IH07XG52YXIgZWxlbWVudENvdWxkQmVIU2Nyb2xsZWQgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gZWxlbWVudENhbkJlU2Nyb2xsZWQobm9kZSwgJ292ZXJmbG93WCcpOyB9O1xuZXhwb3J0IHZhciBsb2NhdGlvbkNvdWxkQmVTY3JvbGxlZCA9IGZ1bmN0aW9uIChheGlzLCBub2RlKSB7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgdmFyIGN1cnJlbnQgPSBub2RlO1xuICAgIGRvIHtcbiAgICAgICAgLy8gU2tpcCBvdmVyIHNoYWRvdyByb290XG4gICAgICAgIGlmICh0eXBlb2YgU2hhZG93Um9vdCAhPT0gJ3VuZGVmaW5lZCcgJiYgY3VycmVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlzU2Nyb2xsYWJsZSA9IGVsZW1lbnRDb3VsZEJlU2Nyb2xsZWQoYXhpcywgY3VycmVudCk7XG4gICAgICAgIGlmIChpc1Njcm9sbGFibGUpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGdldFNjcm9sbFZhcmlhYmxlcyhheGlzLCBjdXJyZW50KSwgcyA9IF9hWzFdLCBkID0gX2FbMl07XG4gICAgICAgICAgICBpZiAocyA+IGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnROb2RlO1xuICAgIH0gd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gb3duZXJEb2N1bWVudC5ib2R5KTtcbiAgICByZXR1cm4gZmFsc2U7XG59O1xudmFyIGdldFZTY3JvbGxWYXJpYWJsZXMgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgc2Nyb2xsVG9wID0gX2Euc2Nyb2xsVG9wLCBzY3JvbGxIZWlnaHQgPSBfYS5zY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCA9IF9hLmNsaWVudEhlaWdodDtcbiAgICByZXR1cm4gW1xuICAgICAgICBzY3JvbGxUb3AsXG4gICAgICAgIHNjcm9sbEhlaWdodCxcbiAgICAgICAgY2xpZW50SGVpZ2h0LFxuICAgIF07XG59O1xudmFyIGdldEhTY3JvbGxWYXJpYWJsZXMgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgc2Nyb2xsTGVmdCA9IF9hLnNjcm9sbExlZnQsIHNjcm9sbFdpZHRoID0gX2Euc2Nyb2xsV2lkdGgsIGNsaWVudFdpZHRoID0gX2EuY2xpZW50V2lkdGg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc2Nyb2xsTGVmdCxcbiAgICAgICAgc2Nyb2xsV2lkdGgsXG4gICAgICAgIGNsaWVudFdpZHRoLFxuICAgIF07XG59O1xudmFyIGVsZW1lbnRDb3VsZEJlU2Nyb2xsZWQgPSBmdW5jdGlvbiAoYXhpcywgbm9kZSkge1xuICAgIHJldHVybiBheGlzID09PSAndicgPyBlbGVtZW50Q291bGRCZVZTY3JvbGxlZChub2RlKSA6IGVsZW1lbnRDb3VsZEJlSFNjcm9sbGVkKG5vZGUpO1xufTtcbnZhciBnZXRTY3JvbGxWYXJpYWJsZXMgPSBmdW5jdGlvbiAoYXhpcywgbm9kZSkge1xuICAgIHJldHVybiBheGlzID09PSAndicgPyBnZXRWU2Nyb2xsVmFyaWFibGVzKG5vZGUpIDogZ2V0SFNjcm9sbFZhcmlhYmxlcyhub2RlKTtcbn07XG52YXIgZ2V0RGlyZWN0aW9uRmFjdG9yID0gZnVuY3Rpb24gKGF4aXMsIGRpcmVjdGlvbikge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBlbGVtZW50J3MgZGlyZWN0aW9uIGlzIHJ0bCAocmlnaHQtdG8tbGVmdCksIHRoZW4gc2Nyb2xsTGVmdCBpcyAwIHdoZW4gdGhlIHNjcm9sbGJhciBpcyBhdCBpdHMgcmlnaHRtb3N0IHBvc2l0aW9uLFxuICAgICAqIGFuZCB0aGVuIGluY3JlYXNpbmdseSBuZWdhdGl2ZSBhcyB5b3Ugc2Nyb2xsIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgY29udGVudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3Njcm9sbExlZnRcbiAgICAgKi9cbiAgICByZXR1cm4gYXhpcyA9PT0gJ2gnICYmIGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAtMSA6IDE7XG59O1xuZXhwb3J0IHZhciBoYW5kbGVTY3JvbGwgPSBmdW5jdGlvbiAoYXhpcywgZW5kVGFyZ2V0LCBldmVudCwgc291cmNlRGVsdGEsIG5vT3ZlcnNjcm9sbCkge1xuICAgIHZhciBkaXJlY3Rpb25GYWN0b3IgPSBnZXREaXJlY3Rpb25GYWN0b3IoYXhpcywgd2luZG93LmdldENvbXB1dGVkU3R5bGUoZW5kVGFyZ2V0KS5kaXJlY3Rpb24pO1xuICAgIHZhciBkZWx0YSA9IGRpcmVjdGlvbkZhY3RvciAqIHNvdXJjZURlbHRhO1xuICAgIC8vIGZpbmQgc2Nyb2xsYWJsZSB0YXJnZXRcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHZhciB0YXJnZXRJbkxvY2sgPSBlbmRUYXJnZXQuY29udGFpbnModGFyZ2V0KTtcbiAgICB2YXIgc2hvdWxkQ2FuY2VsU2Nyb2xsID0gZmFsc2U7XG4gICAgdmFyIGlzRGVsdGFQb3NpdGl2ZSA9IGRlbHRhID4gMDtcbiAgICB2YXIgYXZhaWxhYmxlU2Nyb2xsID0gMDtcbiAgICB2YXIgYXZhaWxhYmxlU2Nyb2xsVG9wID0gMDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBfYSA9IGdldFNjcm9sbFZhcmlhYmxlcyhheGlzLCB0YXJnZXQpLCBwb3NpdGlvbiA9IF9hWzBdLCBzY3JvbGxfMSA9IF9hWzFdLCBjYXBhY2l0eSA9IF9hWzJdO1xuICAgICAgICB2YXIgZWxlbWVudFNjcm9sbCA9IHNjcm9sbF8xIC0gY2FwYWNpdHkgLSBkaXJlY3Rpb25GYWN0b3IgKiBwb3NpdGlvbjtcbiAgICAgICAgaWYgKHBvc2l0aW9uIHx8IGVsZW1lbnRTY3JvbGwpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Q291bGRCZVNjcm9sbGVkKGF4aXMsIHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVTY3JvbGwgKz0gZWxlbWVudFNjcm9sbDtcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVTY3JvbGxUb3AgKz0gcG9zaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChcbiAgICAvLyBwb3J0YWxlZCBjb250ZW50XG4gICAgKCF0YXJnZXRJbkxvY2sgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudC5ib2R5KSB8fFxuICAgICAgICAvLyBzZWxmIGNvbnRlbnRcbiAgICAgICAgKHRhcmdldEluTG9jayAmJiAoZW5kVGFyZ2V0LmNvbnRhaW5zKHRhcmdldCkgfHwgZW5kVGFyZ2V0ID09PSB0YXJnZXQpKSk7XG4gICAgLy8gaGFuZGxlIGVwc2lsb24gYXJvdW5kIDAgKG5vbiBzdGFuZGFyZCB6b29tIGxldmVscylcbiAgICBpZiAoaXNEZWx0YVBvc2l0aXZlICYmXG4gICAgICAgICgobm9PdmVyc2Nyb2xsICYmIE1hdGguYWJzKGF2YWlsYWJsZVNjcm9sbCkgPCAxKSB8fCAoIW5vT3ZlcnNjcm9sbCAmJiBkZWx0YSA+IGF2YWlsYWJsZVNjcm9sbCkpKSB7XG4gICAgICAgIHNob3VsZENhbmNlbFNjcm9sbCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpc0RlbHRhUG9zaXRpdmUgJiZcbiAgICAgICAgKChub092ZXJzY3JvbGwgJiYgTWF0aC5hYnMoYXZhaWxhYmxlU2Nyb2xsVG9wKSA8IDEpIHx8ICghbm9PdmVyc2Nyb2xsICYmIC1kZWx0YSA+IGF2YWlsYWJsZVNjcm9sbFRvcCkpKSB7XG4gICAgICAgIHNob3VsZENhbmNlbFNjcm9sbCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzaG91bGRDYW5jZWxTY3JvbGw7XG59O1xuIiwiaW1wb3J0IHsgY3JlYXRlU2lkZWNhck1lZGl1bSB9IGZyb20gJ3VzZS1zaWRlY2FyJztcbmV4cG9ydCB2YXIgZWZmZWN0Q2FyID0gY3JlYXRlU2lkZWNhck1lZGl1bSgpO1xuIiwiaW1wb3J0IHsgZXhwb3J0U2lkZWNhciB9IGZyb20gJ3VzZS1zaWRlY2FyJztcbmltcG9ydCB7IFJlbW92ZVNjcm9sbFNpZGVDYXIgfSBmcm9tICcuL1NpZGVFZmZlY3QnO1xuaW1wb3J0IHsgZWZmZWN0Q2FyIH0gZnJvbSAnLi9tZWRpdW0nO1xuZXhwb3J0IGRlZmF1bHQgZXhwb3J0U2lkZWNhcihlZmZlY3RDYXIsIFJlbW92ZVNjcm9sbFNpZGVDYXIpO1xuIiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEcmFnZ2FibGUgZnJvbSAncmVhY3QtZHJhZ2dhYmxlJztcbmltcG9ydCB7IFJlc2l6YWJsZSB9IGZyb20gJ3JlLXJlc2l6YWJsZSc7XG5pbXBvcnQgeyBmbHVzaFN5bmMgfSBmcm9tICdyZWFjdC1kb20nO1xuXG4vKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxyXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxyXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG5cclxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxyXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXHJcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXHJcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXHJcblxyXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcclxuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG52YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XG5cbnZhciByZXNpemFibGVTdHlsZSA9IHtcbiAgICB3aWR0aDogXCJhdXRvXCIsXG4gICAgaGVpZ2h0OiBcImF1dG9cIixcbiAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDAsXG59O1xudmFyIGdldEVuYWJsZVJlc2l6aW5nQnlGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHsgcmV0dXJuICh7XG4gICAgYm90dG9tOiBmbGFnLFxuICAgIGJvdHRvbUxlZnQ6IGZsYWcsXG4gICAgYm90dG9tUmlnaHQ6IGZsYWcsXG4gICAgbGVmdDogZmxhZyxcbiAgICByaWdodDogZmxhZyxcbiAgICB0b3A6IGZsYWcsXG4gICAgdG9wTGVmdDogZmxhZyxcbiAgICB0b3BSaWdodDogZmxhZyxcbn0pOyB9O1xudmFyIFJuZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUm5kLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJuZChwcm9wcykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucmVzaXppbmdQb3NpdGlvbiA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgICBfdGhpcy5vZmZzZXRGcm9tUGFyZW50ID0geyBsZWZ0OiAwLCB0b3A6IDAgfTtcbiAgICAgICAgX3RoaXMucmVzaXphYmxlRWxlbWVudCA9IHsgY3VycmVudDogbnVsbCB9O1xuICAgICAgICBfdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgcmVzaXppbmc6IGZhbHNlLFxuICAgICAgICAgICAgYm91bmRzOiB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogMCxcbiAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1heFdpZHRoOiBwcm9wcy5tYXhXaWR0aCxcbiAgICAgICAgICAgIG1heEhlaWdodDogcHJvcHMubWF4SGVpZ2h0LFxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5vblJlc2l6ZVN0YXJ0ID0gX3RoaXMub25SZXNpemVTdGFydC5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25SZXNpemUgPSBfdGhpcy5vblJlc2l6ZS5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25SZXNpemVTdG9wID0gX3RoaXMub25SZXNpemVTdG9wLmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5vbkRyYWdTdGFydCA9IF90aGlzLm9uRHJhZ1N0YXJ0LmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5vbkRyYWcgPSBfdGhpcy5vbkRyYWcuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uRHJhZ1N0b3AgPSBfdGhpcy5vbkRyYWdTdG9wLmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5nZXRNYXhTaXplc0Zyb21Qcm9wcyA9IF90aGlzLmdldE1heFNpemVzRnJvbVByb3BzLmJpbmQoX3RoaXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJuZC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0RnJvbVBhcmVudCgpO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQsIGxlZnQgPSBfYS5sZWZ0LCB0b3AgPSBfYS50b3A7XG4gICAgICAgIHZhciBfYiA9IHRoaXMuZ2V0RHJhZ2dhYmxlUG9zaXRpb24oKSwgeCA9IF9iLngsIHkgPSBfYi55O1xuICAgICAgICB0aGlzLmRyYWdnYWJsZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB4OiB4IC0gbGVmdCxcbiAgICAgICAgICAgIHk6IHkgLSB0b3AsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBIQUNLOiBBcHBseSBwb3NpdGlvbiBhZGp1c3RtZW50XG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICB9O1xuICAgIC8vIEhBQ0s6IFRvIGdldCBgcmVhY3QtZHJhZ2dhYmxlYCBzdGF0ZSB4IGFuZCB5LlxuICAgIFJuZC5wcm90b3R5cGUuZ2V0RHJhZ2dhYmxlUG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZHJhZ2dhYmxlLnN0YXRlLCB4ID0gX2EueCwgeSA9IF9hLnk7XG4gICAgICAgIHJldHVybiB7IHg6IHgsIHk6IHkgfTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUuZ2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemFibGUgJiYgdGhpcy5yZXNpemFibGUucGFyZW50Tm9kZTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUuZ2V0UGFyZW50U2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXphYmxlLmdldFBhcmVudFNpemUoKTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUuZ2V0TWF4U2l6ZXNGcm9tUHJvcHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtYXhXaWR0aCA9IHR5cGVvZiB0aGlzLnByb3BzLm1heFdpZHRoID09PSBcInVuZGVmaW5lZFwiID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiB0aGlzLnByb3BzLm1heFdpZHRoO1xuICAgICAgICB2YXIgbWF4SGVpZ2h0ID0gdHlwZW9mIHRoaXMucHJvcHMubWF4SGVpZ2h0ID09PSBcInVuZGVmaW5lZFwiID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiB0aGlzLnByb3BzLm1heEhlaWdodDtcbiAgICAgICAgcmV0dXJuIHsgbWF4V2lkdGg6IG1heFdpZHRoLCBtYXhIZWlnaHQ6IG1heEhlaWdodCB9O1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5nZXRTZWxmRWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXphYmxlICYmIHRoaXMucmVzaXphYmxlLnJlc2l6YWJsZTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUuZ2V0T2Zmc2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGJvdW5kYXJ5KSB7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMucHJvcHMuc2NhbGU7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wcm9wcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ3aW5kb3dcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0IC8gc2NhbGU7XG4gICAgICAgICAgICBjYXNlIFwiYm9keVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCAvIHNjYWxlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYm91bmRhcnkub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLmdldE9mZnNldFdpZHRoID0gZnVuY3Rpb24gKGJvdW5kYXJ5KSB7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMucHJvcHMuc2NhbGU7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wcm9wcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ3aW5kb3dcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggLyBzY2FsZTtcbiAgICAgICAgICAgIGNhc2UgXCJib2R5XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGggLyBzY2FsZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJvdW5kYXJ5Lm9mZnNldFdpZHRoO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLm9uRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25EcmFnU3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25EcmFnU3RhcnQoZSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0RHJhZ2dhYmxlUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0gcG9zO1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMuYm91bmRzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoKTtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5wcm9wcy5zY2FsZTtcbiAgICAgICAgdmFyIGJvdW5kYXJ5O1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwicGFyZW50XCIpIHtcbiAgICAgICAgICAgIGJvdW5kYXJ5ID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSBcImJvZHlcIikge1xuICAgICAgICAgICAgdmFyIHBhcmVudFJlY3RfMSA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRMZWZ0XzEgPSBwYXJlbnRSZWN0XzEubGVmdDtcbiAgICAgICAgICAgIHZhciBwYXJlbnRUb3BfMSA9IHBhcmVudFJlY3RfMS50b3A7XG4gICAgICAgICAgICB2YXIgYm9keVJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdmFyIGxlZnRfMSA9IC0ocGFyZW50TGVmdF8xIC0gcGFyZW50Lm9mZnNldExlZnQgKiBzY2FsZSAtIGJvZHlSZWN0LmxlZnQpIC8gc2NhbGU7XG4gICAgICAgICAgICB2YXIgdG9wXzEgPSAtKHBhcmVudFRvcF8xIC0gcGFyZW50Lm9mZnNldFRvcCAqIHNjYWxlIC0gYm9keVJlY3QudG9wKSAvIHNjYWxlO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gKGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGggLSB0aGlzLnJlc2l6YWJsZS5zaXplLndpZHRoICogc2NhbGUpIC8gc2NhbGUgKyBsZWZ0XzE7XG4gICAgICAgICAgICB2YXIgYm90dG9tID0gKGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0IC0gdGhpcy5yZXNpemFibGUuc2l6ZS5oZWlnaHQgKiBzY2FsZSkgLyBzY2FsZSArIHRvcF8xO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoeyBib3VuZHM6IHsgdG9wOiB0b3BfMSwgcmlnaHQ6IHJpZ2h0LCBib3R0b206IGJvdHRvbSwgbGVmdDogbGVmdF8xIH0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwid2luZG93XCIpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZXNpemFibGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHBhcmVudFJlY3RfMiA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRMZWZ0XzIgPSBwYXJlbnRSZWN0XzIubGVmdDtcbiAgICAgICAgICAgIHZhciBwYXJlbnRUb3BfMiA9IHBhcmVudFJlY3RfMi50b3A7XG4gICAgICAgICAgICB2YXIgbGVmdF8yID0gLShwYXJlbnRMZWZ0XzIgLSBwYXJlbnQub2Zmc2V0TGVmdCAqIHNjYWxlKSAvIHNjYWxlO1xuICAgICAgICAgICAgdmFyIHRvcF8yID0gLShwYXJlbnRUb3BfMiAtIHBhcmVudC5vZmZzZXRUb3AgKiBzY2FsZSkgLyBzY2FsZTtcbiAgICAgICAgICAgIHZhciByaWdodCA9ICh3aW5kb3cuaW5uZXJXaWR0aCAtIHRoaXMucmVzaXphYmxlLnNpemUud2lkdGggKiBzY2FsZSkgLyBzY2FsZSArIGxlZnRfMjtcbiAgICAgICAgICAgIHZhciBib3R0b20gPSAod2luZG93LmlubmVySGVpZ2h0IC0gdGhpcy5yZXNpemFibGUuc2l6ZS5oZWlnaHQgKiBzY2FsZSkgLyBzY2FsZSArIHRvcF8yO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoeyBib3VuZHM6IHsgdG9wOiB0b3BfMiwgcmlnaHQ6IHJpZ2h0LCBib3R0b206IGJvdHRvbSwgbGVmdDogbGVmdF8yIH0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMucHJvcHMuYm91bmRzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBib3VuZGFyeSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5wcm9wcy5ib3VuZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGJvdW5kYXJ5ID0gdGhpcy5wcm9wcy5ib3VuZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYm91bmRhcnkgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYm91bmRhcnlSZWN0ID0gYm91bmRhcnkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBib3VuZGFyeUxlZnQgPSBib3VuZGFyeVJlY3QubGVmdDtcbiAgICAgICAgdmFyIGJvdW5kYXJ5VG9wID0gYm91bmRhcnlSZWN0LnRvcDtcbiAgICAgICAgdmFyIHBhcmVudFJlY3QgPSBwYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBwYXJlbnRMZWZ0ID0gcGFyZW50UmVjdC5sZWZ0O1xuICAgICAgICB2YXIgcGFyZW50VG9wID0gcGFyZW50UmVjdC50b3A7XG4gICAgICAgIHZhciBsZWZ0ID0gKGJvdW5kYXJ5TGVmdCAtIHBhcmVudExlZnQpIC8gc2NhbGU7XG4gICAgICAgIHZhciB0b3AgPSBib3VuZGFyeVRvcCAtIHBhcmVudFRvcDtcbiAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy51cGRhdGVPZmZzZXRGcm9tUGFyZW50KCk7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQ7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgYm91bmRzOiB7XG4gICAgICAgICAgICAgICAgdG9wOiB0b3AgLSBvZmZzZXQudG9wLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiBsZWZ0ICsgKGJvdW5kYXJ5Lm9mZnNldFdpZHRoIC0gdGhpcy5yZXNpemFibGUuc2l6ZS53aWR0aCkgLSBvZmZzZXQubGVmdCAvIHNjYWxlLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogdG9wICsgKGJvdW5kYXJ5Lm9mZnNldEhlaWdodCAtIHRoaXMucmVzaXphYmxlLnNpemUuaGVpZ2h0KSAtIG9mZnNldC50b3AsXG4gICAgICAgICAgICAgICAgbGVmdDogbGVmdCAtIG9mZnNldC5sZWZ0IC8gc2NhbGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUub25EcmFnID0gZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLm9uRHJhZylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5vZmZzZXRGcm9tUGFyZW50LCBsZWZ0ID0gX2EubGVmdCwgdG9wID0gX2EudG9wO1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMuZHJhZ0F4aXMgfHwgdGhpcy5wcm9wcy5kcmFnQXhpcyA9PT0gXCJib3RoXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLm9uRHJhZyhlLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGF0YSksIHsgeDogZGF0YS54ICsgbGVmdCwgeTogZGF0YS55ICsgdG9wIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmRyYWdBeGlzID09PSBcInhcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25EcmFnKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiBkYXRhLnggKyBsZWZ0LCB5OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueSArIHRvcCwgZGVsdGFZOiAwIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmRyYWdBeGlzID09PSBcInlcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25EcmFnKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueCArIGxlZnQsIHk6IGRhdGEueSArIHRvcCwgZGVsdGFYOiAwIH0pKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5vbkRyYWdTdG9wID0gZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLm9uRHJhZ1N0b3ApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBfYSA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudCwgbGVmdCA9IF9hLmxlZnQsIHRvcCA9IF9hLnRvcDtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmRyYWdBeGlzIHx8IHRoaXMucHJvcHMuZHJhZ0F4aXMgPT09IFwiYm90aFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vbkRyYWdTdG9wKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiBkYXRhLnggKyBsZWZ0LCB5OiBkYXRhLnkgKyB0b3AgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuZHJhZ0F4aXMgPT09IFwieFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vbkRyYWdTdG9wKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiBkYXRhLnggKyBsZWZ0LCB5OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueSArIHRvcCwgZGVsdGFZOiAwIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmRyYWdBeGlzID09PSBcInlcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25EcmFnU3RvcChlLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGF0YSksIHsgeDogdGhpcy5vcmlnaW5hbFBvc2l0aW9uLnggKyBsZWZ0LCB5OiBkYXRhLnkgKyB0b3AsIGRlbHRhWDogMCB9KSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUub25SZXNpemVTdGFydCA9IGZ1bmN0aW9uIChlLCBkaXIsIGVsZW1lbnRSZWYpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICByZXNpemluZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMucHJvcHMuc2NhbGU7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQ7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLmdldERyYWdnYWJsZVBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMucmVzaXppbmdQb3NpdGlvbiA9IHsgeDogcG9zLnggKyBvZmZzZXQubGVmdCwgeTogcG9zLnkgKyBvZmZzZXQudG9wIH07XG4gICAgICAgIHRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHBvcztcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuYm91bmRzKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50XzEgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICAgICAgdmFyIGJvdW5kYXJ5ID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSBcInBhcmVudFwiKSB7XG4gICAgICAgICAgICAgICAgYm91bmRhcnkgPSBwYXJlbnRfMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSBcImJvZHlcIikge1xuICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSBcIndpbmRvd1wiKSB7XG4gICAgICAgICAgICAgICAgYm91bmRhcnkgPSB3aW5kb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5ib3VuZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBib3VuZGFyeSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5wcm9wcy5ib3VuZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gdGhpcy5wcm9wcy5ib3VuZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc2VsZl8xID0gdGhpcy5nZXRTZWxmRWxlbWVudCgpO1xuICAgICAgICAgICAgaWYgKHNlbGZfMSBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgICAoYm91bmRhcnkgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBib3VuZGFyeSA9PT0gd2luZG93KSAmJlxuICAgICAgICAgICAgICAgIHBhcmVudF8xIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSB0aGlzLmdldE1heFNpemVzRnJvbVByb3BzKCksIG1heFdpZHRoID0gX2EubWF4V2lkdGgsIG1heEhlaWdodCA9IF9hLm1heEhlaWdodDtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50U2l6ZSA9IHRoaXMuZ2V0UGFyZW50U2l6ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChtYXhXaWR0aCAmJiB0eXBlb2YgbWF4V2lkdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heFdpZHRoLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhdGlvID0gTnVtYmVyKG1heFdpZHRoLnJlcGxhY2UoXCIlXCIsIFwiXCIpKSAvIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoID0gcGFyZW50U2l6ZS53aWR0aCAqIHJhdGlvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1heFdpZHRoLmVuZHNXaXRoKFwicHhcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoID0gTnVtYmVyKG1heFdpZHRoLnJlcGxhY2UoXCJweFwiLCBcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1heEhlaWdodCAmJiB0eXBlb2YgbWF4SGVpZ2h0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXhIZWlnaHQuZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmF0aW8gPSBOdW1iZXIobWF4SGVpZ2h0LnJlcGxhY2UoXCIlXCIsIFwiXCIpKSAvIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IHBhcmVudFNpemUuaGVpZ2h0ICogcmF0aW87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWF4SGVpZ2h0LmVuZHNXaXRoKFwicHhcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IE51bWJlcihtYXhIZWlnaHQucmVwbGFjZShcInB4XCIsIFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc2VsZlJlY3QgPSBzZWxmXzEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGZMZWZ0ID0gc2VsZlJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZlRvcCA9IHNlbGZSZWN0LnRvcDtcbiAgICAgICAgICAgICAgICB2YXIgYm91bmRhcnlSZWN0ID0gdGhpcy5wcm9wcy5ib3VuZHMgPT09IFwid2luZG93XCIgPyB7IGxlZnQ6IDAsIHRvcDogMCB9IDogYm91bmRhcnkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGJvdW5kYXJ5TGVmdCA9IGJvdW5kYXJ5UmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIHZhciBib3VuZGFyeVRvcCA9IGJvdW5kYXJ5UmVjdC50b3A7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldFdpZHRoID0gdGhpcy5nZXRPZmZzZXRXaWR0aChib3VuZGFyeSk7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldEhlaWdodCA9IHRoaXMuZ2V0T2Zmc2V0SGVpZ2h0KGJvdW5kYXJ5KTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzTGVmdCA9IGRpci50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFwibGVmdFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzUmlnaHQgPSBkaXIudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChcInJpZ2h0XCIpO1xuICAgICAgICAgICAgICAgIHZhciBoYXNUb3AgPSBkaXIuc3RhcnRzV2l0aChcInRvcFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzQm90dG9tID0gZGlyLnN0YXJ0c1dpdGgoXCJib3R0b21cIik7XG4gICAgICAgICAgICAgICAgaWYgKChoYXNMZWZ0IHx8IGhhc1RvcCkgJiYgdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IChzZWxmTGVmdCAtIGJvdW5kYXJ5TGVmdCkgLyBzY2FsZSArIHRoaXMucmVzaXphYmxlLnNpemUud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBtYXhXaWR0aDogbWF4ID4gTnVtYmVyKG1heFdpZHRoKSA/IG1heFdpZHRoIDogbWF4IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJTkZPOiBUbyBzZXQgYm91bmRzIGluIGBsb2NrIGFzcGVjdCByYXRpbyB3aXRoIGJvdW5kc2AgY2FzZS4gU2VlIGFsc28gdGhhdCBzdG9yeS5cbiAgICAgICAgICAgICAgICBpZiAoaGFzUmlnaHQgfHwgKHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvICYmICFoYXNMZWZ0ICYmICFoYXNUb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSBvZmZzZXRXaWR0aCArIChib3VuZGFyeUxlZnQgLSBzZWxmTGVmdCkgLyBzY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG1heFdpZHRoOiBtYXggPiBOdW1iZXIobWF4V2lkdGgpID8gbWF4V2lkdGggOiBtYXggfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgoaGFzVG9wIHx8IGhhc0xlZnQpICYmIHRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSAoc2VsZlRvcCAtIGJvdW5kYXJ5VG9wKSAvIHNjYWxlICsgdGhpcy5yZXNpemFibGUuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBtYXggPiBOdW1iZXIobWF4SGVpZ2h0KSA/IG1heEhlaWdodCA6IG1heCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElORk86IFRvIHNldCBib3VuZHMgaW4gYGxvY2sgYXNwZWN0IHJhdGlvIHdpdGggYm91bmRzYCBjYXNlLiBTZWUgYWxzbyB0aGF0IHN0b3J5LlxuICAgICAgICAgICAgICAgIGlmIChoYXNCb3R0b20gfHwgKHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvICYmICFoYXNUb3AgJiYgIWhhc0xlZnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSBvZmZzZXRIZWlnaHQgKyAoYm91bmRhcnlUb3AgLSBzZWxmVG9wKSAvIHNjYWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogbWF4ID4gTnVtYmVyKG1heEhlaWdodCkgPyBtYXhIZWlnaHQgOiBtYXgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIG1heFdpZHRoOiB0aGlzLnByb3BzLm1heFdpZHRoLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogdGhpcy5wcm9wcy5tYXhIZWlnaHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblJlc2l6ZVN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uUmVzaXplU3RhcnQoZSwgZGlyLCBlbGVtZW50UmVmKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5vblJlc2l6ZSA9IGZ1bmN0aW9uIChlLCBkaXJlY3Rpb24sIGVsZW1lbnRSZWYsIGRlbHRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIElORk86IEFwcGx5IHggYW5kIHkgcG9zaXRpb24gYWRqdXN0bWVudHMgY2F1c2VkIGJ5IHJlc2l6aW5nIHRvIGRyYWdnYWJsZVxuICAgICAgICB2YXIgbmV3UG9zID0geyB4OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueCwgeTogdGhpcy5vcmlnaW5hbFBvc2l0aW9uLnkgfTtcbiAgICAgICAgdmFyIGxlZnQgPSAtZGVsdGEud2lkdGg7XG4gICAgICAgIHZhciB0b3AgPSAtZGVsdGEuaGVpZ2h0O1xuICAgICAgICB2YXIgZGlyZWN0aW9ucyA9IFtcInRvcFwiLCBcImxlZnRcIiwgXCJ0b3BMZWZ0XCIsIFwiYm90dG9tTGVmdFwiLCBcInRvcFJpZ2h0XCJdO1xuICAgICAgICBpZiAoZGlyZWN0aW9ucy5pbmNsdWRlcyhkaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBcImJvdHRvbUxlZnRcIikge1xuICAgICAgICAgICAgICAgIG5ld1Bvcy54ICs9IGxlZnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT09IFwidG9wUmlnaHRcIikge1xuICAgICAgICAgICAgICAgIG5ld1Bvcy55ICs9IHRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1Bvcy54ICs9IGxlZnQ7XG4gICAgICAgICAgICAgICAgbmV3UG9zLnkgKz0gdG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBkcmFnZ2FibGVTdGF0ZSA9IHRoaXMuZHJhZ2dhYmxlLnN0YXRlO1xuICAgICAgICBpZiAobmV3UG9zLnggIT09IGRyYWdnYWJsZVN0YXRlLnggfHwgbmV3UG9zLnkgIT09IGRyYWdnYWJsZVN0YXRlLnkpIHtcbiAgICAgICAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZHJhZ2dhYmxlLnNldFN0YXRlKG5ld1Bvcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldEZyb21QYXJlbnQoKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudDtcbiAgICAgICAgdmFyIHggPSB0aGlzLmdldERyYWdnYWJsZVBvc2l0aW9uKCkueCArIG9mZnNldC5sZWZ0O1xuICAgICAgICB2YXIgeSA9IHRoaXMuZ2V0RHJhZ2dhYmxlUG9zaXRpb24oKS55ICsgb2Zmc2V0LnRvcDtcbiAgICAgICAgdGhpcy5yZXNpemluZ1Bvc2l0aW9uID0geyB4OiB4LCB5OiB5IH07XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5vblJlc2l6ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9wcy5vblJlc2l6ZShlLCBkaXJlY3Rpb24sIGVsZW1lbnRSZWYsIGRlbHRhLCB7XG4gICAgICAgICAgICB4OiB4LFxuICAgICAgICAgICAgeTogeSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLm9uUmVzaXplU3RvcCA9IGZ1bmN0aW9uIChlLCBkaXJlY3Rpb24sIGVsZW1lbnRSZWYsIGRlbHRhKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcmVzaXppbmc6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5nZXRNYXhTaXplc0Zyb21Qcm9wcygpLCBtYXhXaWR0aCA9IF9hLm1heFdpZHRoLCBtYXhIZWlnaHQgPSBfYS5tYXhIZWlnaHQ7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBtYXhXaWR0aDogbWF4V2lkdGgsIG1heEhlaWdodDogbWF4SGVpZ2h0IH0pO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblJlc2l6ZVN0b3ApIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25SZXNpemVTdG9wKGUsIGRpcmVjdGlvbiwgZWxlbWVudFJlZiwgZGVsdGEsIHRoaXMucmVzaXppbmdQb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUudXBkYXRlU2l6ZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXNpemFibGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucmVzaXphYmxlLnVwZGF0ZVNpemUoeyB3aWR0aDogc2l6ZS53aWR0aCwgaGVpZ2h0OiBzaXplLmhlaWdodCB9KTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUudXBkYXRlUG9zaXRpb24gPSBmdW5jdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGUuc2V0U3RhdGUocG9zaXRpb24pO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS51cGRhdGVPZmZzZXRGcm9tUGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLnByb3BzLnNjYWxlO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLmdldFNlbGZFbGVtZW50KCk7XG4gICAgICAgIGlmICghcGFyZW50IHx8IHNlbGYgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRSZWN0ID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB2YXIgcGFyZW50TGVmdCA9IHBhcmVudFJlY3QubGVmdDtcbiAgICAgICAgdmFyIHBhcmVudFRvcCA9IHBhcmVudFJlY3QudG9wO1xuICAgICAgICB2YXIgc2VsZlJlY3QgPSBzZWxmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLmdldERyYWdnYWJsZVBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBzY3JvbGxMZWZ0ID0gcGFyZW50LnNjcm9sbExlZnQ7XG4gICAgICAgIHZhciBzY3JvbGxUb3AgPSBwYXJlbnQuc2Nyb2xsVG9wO1xuICAgICAgICB0aGlzLm9mZnNldEZyb21QYXJlbnQgPSB7XG4gICAgICAgICAgICBsZWZ0OiBzZWxmUmVjdC5sZWZ0IC0gcGFyZW50TGVmdCArIHNjcm9sbExlZnQgLSBwb3NpdGlvbi54ICogc2NhbGUsXG4gICAgICAgICAgICB0b3A6IHNlbGZSZWN0LnRvcCAtIHBhcmVudFRvcCArIHNjcm9sbFRvcCAtIHBvc2l0aW9uLnkgKiBzY2FsZSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBkaXNhYmxlRHJhZ2dpbmcgPSBfYS5kaXNhYmxlRHJhZ2dpbmcsIHN0eWxlID0gX2Euc3R5bGUsIGRyYWdIYW5kbGVDbGFzc05hbWUgPSBfYS5kcmFnSGFuZGxlQ2xhc3NOYW1lLCBwb3NpdGlvbiA9IF9hLnBvc2l0aW9uLCBvbk1vdXNlRG93biA9IF9hLm9uTW91c2VEb3duLCBvbk1vdXNlVXAgPSBfYS5vbk1vdXNlVXAsIGRyYWdBeGlzID0gX2EuZHJhZ0F4aXMsIGRyYWdHcmlkID0gX2EuZHJhZ0dyaWQsIGJvdW5kcyA9IF9hLmJvdW5kcywgZW5hYmxlVXNlclNlbGVjdEhhY2sgPSBfYS5lbmFibGVVc2VyU2VsZWN0SGFjaywgY2FuY2VsID0gX2EuY2FuY2VsLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBvblJlc2l6ZVN0YXJ0ID0gX2Eub25SZXNpemVTdGFydCwgb25SZXNpemUgPSBfYS5vblJlc2l6ZSwgb25SZXNpemVTdG9wID0gX2Eub25SZXNpemVTdG9wLCBvbkRyYWdTdGFydCA9IF9hLm9uRHJhZ1N0YXJ0LCBvbkRyYWcgPSBfYS5vbkRyYWcsIG9uRHJhZ1N0b3AgPSBfYS5vbkRyYWdTdG9wLCByZXNpemVIYW5kbGVTdHlsZXMgPSBfYS5yZXNpemVIYW5kbGVTdHlsZXMsIHJlc2l6ZUhhbmRsZUNsYXNzZXMgPSBfYS5yZXNpemVIYW5kbGVDbGFzc2VzLCByZXNpemVIYW5kbGVDb21wb25lbnQgPSBfYS5yZXNpemVIYW5kbGVDb21wb25lbnQsIGVuYWJsZVJlc2l6aW5nID0gX2EuZW5hYmxlUmVzaXppbmcsIHJlc2l6ZUdyaWQgPSBfYS5yZXNpemVHcmlkLCByZXNpemVIYW5kbGVXcmFwcGVyQ2xhc3MgPSBfYS5yZXNpemVIYW5kbGVXcmFwcGVyQ2xhc3MsIHJlc2l6ZUhhbmRsZVdyYXBwZXJTdHlsZSA9IF9hLnJlc2l6ZUhhbmRsZVdyYXBwZXJTdHlsZSwgc2NhbGUgPSBfYS5zY2FsZSwgYWxsb3dBbnlDbGljayA9IF9hLmFsbG93QW55Q2xpY2ssIHJlc2l6YWJsZVByb3BzID0gX19yZXN0KF9hLCBbXCJkaXNhYmxlRHJhZ2dpbmdcIiwgXCJzdHlsZVwiLCBcImRyYWdIYW5kbGVDbGFzc05hbWVcIiwgXCJwb3NpdGlvblwiLCBcIm9uTW91c2VEb3duXCIsIFwib25Nb3VzZVVwXCIsIFwiZHJhZ0F4aXNcIiwgXCJkcmFnR3JpZFwiLCBcImJvdW5kc1wiLCBcImVuYWJsZVVzZXJTZWxlY3RIYWNrXCIsIFwiY2FuY2VsXCIsIFwiY2hpbGRyZW5cIiwgXCJvblJlc2l6ZVN0YXJ0XCIsIFwib25SZXNpemVcIiwgXCJvblJlc2l6ZVN0b3BcIiwgXCJvbkRyYWdTdGFydFwiLCBcIm9uRHJhZ1wiLCBcIm9uRHJhZ1N0b3BcIiwgXCJyZXNpemVIYW5kbGVTdHlsZXNcIiwgXCJyZXNpemVIYW5kbGVDbGFzc2VzXCIsIFwicmVzaXplSGFuZGxlQ29tcG9uZW50XCIsIFwiZW5hYmxlUmVzaXppbmdcIiwgXCJyZXNpemVHcmlkXCIsIFwicmVzaXplSGFuZGxlV3JhcHBlckNsYXNzXCIsIFwicmVzaXplSGFuZGxlV3JhcHBlclN0eWxlXCIsIFwic2NhbGVcIiwgXCJhbGxvd0FueUNsaWNrXCJdKTtcbiAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHRoaXMucHJvcHMuZGVmYXVsdCA/IF9fYXNzaWduKHt9LCB0aGlzLnByb3BzLmRlZmF1bHQpIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBSZW1vdmUgdW5rbm93biBwcm9wcywgc2VlIGFsc28gaHR0cHM6Ly9yZWFjdGpzLm9yZy93YXJuaW5ncy91bmtub3duLXByb3AuaHRtbFxuICAgICAgICBkZWxldGUgcmVzaXphYmxlUHJvcHMuZGVmYXVsdDtcbiAgICAgICAgdmFyIGN1cnNvclN0eWxlID0gZGlzYWJsZURyYWdnaW5nIHx8IGRyYWdIYW5kbGVDbGFzc05hbWUgPyB7IGN1cnNvcjogXCJhdXRvXCIgfSA6IHsgY3Vyc29yOiBcIm1vdmVcIiB9O1xuICAgICAgICB2YXIgaW5uZXJTdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXNpemFibGVTdHlsZSksIGN1cnNvclN0eWxlKSwgc3R5bGUpO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQsIGxlZnQgPSBfYi5sZWZ0LCB0b3AgPSBfYi50b3A7XG4gICAgICAgIHZhciBkcmFnZ2FibGVQb3NpdGlvbjtcbiAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBkcmFnZ2FibGVQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB4OiBwb3NpdGlvbi54IC0gbGVmdCxcbiAgICAgICAgICAgICAgICB5OiBwb3NpdGlvbi55IC0gdG9wLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJTkZPOiBNYWtlIHVuY29udG9yb2xsZWQgY29tcG9uZW50IHdoZW4gcmVzaXppbmcgdG8gY29udHJvbCBwb3NpdGlvbiBieSBzZXRQb3N0aW9uLlxuICAgICAgICB2YXIgcG9zID0gdGhpcy5zdGF0ZS5yZXNpemluZyA/IHVuZGVmaW5lZCA6IGRyYWdnYWJsZVBvc2l0aW9uO1xuICAgICAgICB2YXIgZHJhZ0F4aXNPclVuZGVmaW5lZCA9IHRoaXMuc3RhdGUucmVzaXppbmcgPyBcImJvdGhcIiA6IGRyYWdBeGlzO1xuICAgICAgICByZXR1cm4gKGNyZWF0ZUVsZW1lbnQoRHJhZ2dhYmxlLCB7IHJlZjogZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnZ2FibGUgPSBjO1xuICAgICAgICAgICAgfSwgaGFuZGxlOiBkcmFnSGFuZGxlQ2xhc3NOYW1lID8gXCIuXCIuY29uY2F0KGRyYWdIYW5kbGVDbGFzc05hbWUpIDogdW5kZWZpbmVkLCBkZWZhdWx0UG9zaXRpb246IGRlZmF1bHRWYWx1ZSwgb25Nb3VzZURvd246IG9uTW91c2VEb3duLCBcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIG9uTW91c2VVcDogb25Nb3VzZVVwLCBvblN0YXJ0OiB0aGlzLm9uRHJhZ1N0YXJ0LCBvbkRyYWc6IHRoaXMub25EcmFnLCBvblN0b3A6IHRoaXMub25EcmFnU3RvcCwgYXhpczogZHJhZ0F4aXNPclVuZGVmaW5lZCwgZGlzYWJsZWQ6IGRpc2FibGVEcmFnZ2luZywgZ3JpZDogZHJhZ0dyaWQsIGJvdW5kczogYm91bmRzID8gdGhpcy5zdGF0ZS5ib3VuZHMgOiB1bmRlZmluZWQsIHBvc2l0aW9uOiBwb3MsIGVuYWJsZVVzZXJTZWxlY3RIYWNrOiBlbmFibGVVc2VyU2VsZWN0SGFjaywgY2FuY2VsOiBjYW5jZWwsIHNjYWxlOiBzY2FsZSwgYWxsb3dBbnlDbGljazogYWxsb3dBbnlDbGljaywgbm9kZVJlZjogdGhpcy5yZXNpemFibGVFbGVtZW50IH0sXG4gICAgICAgICAgICBjcmVhdGVFbGVtZW50KFJlc2l6YWJsZSwgX19hc3NpZ24oe30sIHJlc2l6YWJsZVByb3BzLCB7IHJlZjogZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZXNpemFibGUgPSBjO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZXNpemFibGVFbGVtZW50LmN1cnJlbnQgPSBjLnJlc2l6YWJsZTtcbiAgICAgICAgICAgICAgICB9LCBkZWZhdWx0U2l6ZTogZGVmYXVsdFZhbHVlLCBzaXplOiB0aGlzLnByb3BzLnNpemUsIGVuYWJsZTogdHlwZW9mIGVuYWJsZVJlc2l6aW5nID09PSBcImJvb2xlYW5cIiA/IGdldEVuYWJsZVJlc2l6aW5nQnlGbGFnKGVuYWJsZVJlc2l6aW5nKSA6IGVuYWJsZVJlc2l6aW5nLCBvblJlc2l6ZVN0YXJ0OiB0aGlzLm9uUmVzaXplU3RhcnQsIG9uUmVzaXplOiB0aGlzLm9uUmVzaXplLCBvblJlc2l6ZVN0b3A6IHRoaXMub25SZXNpemVTdG9wLCBzdHlsZTogaW5uZXJTdHlsZSwgbWluV2lkdGg6IHRoaXMucHJvcHMubWluV2lkdGgsIG1pbkhlaWdodDogdGhpcy5wcm9wcy5taW5IZWlnaHQsIG1heFdpZHRoOiB0aGlzLnN0YXRlLnJlc2l6aW5nID8gdGhpcy5zdGF0ZS5tYXhXaWR0aCA6IHRoaXMucHJvcHMubWF4V2lkdGgsIG1heEhlaWdodDogdGhpcy5zdGF0ZS5yZXNpemluZyA/IHRoaXMuc3RhdGUubWF4SGVpZ2h0IDogdGhpcy5wcm9wcy5tYXhIZWlnaHQsIGdyaWQ6IHJlc2l6ZUdyaWQsIGhhbmRsZVdyYXBwZXJDbGFzczogcmVzaXplSGFuZGxlV3JhcHBlckNsYXNzLCBoYW5kbGVXcmFwcGVyU3R5bGU6IHJlc2l6ZUhhbmRsZVdyYXBwZXJTdHlsZSwgbG9ja0FzcGVjdFJhdGlvOiB0aGlzLnByb3BzLmxvY2tBc3BlY3RSYXRpbywgbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aDogdGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoLCBsb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodDogdGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodCwgaGFuZGxlU3R5bGVzOiByZXNpemVIYW5kbGVTdHlsZXMsIGhhbmRsZUNsYXNzZXM6IHJlc2l6ZUhhbmRsZUNsYXNzZXMsIGhhbmRsZUNvbXBvbmVudDogcmVzaXplSGFuZGxlQ29tcG9uZW50LCBzY2FsZTogdGhpcy5wcm9wcy5zY2FsZSB9KSwgY2hpbGRyZW4pKSk7XG4gICAgfTtcbiAgICBSbmQuZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBtYXhXaWR0aDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgIG1heEhlaWdodDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgICBvblJlc2l6ZVN0YXJ0OiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uUmVzaXplOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uUmVzaXplU3RvcDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvbkRyYWdTdGFydDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvbkRyYWc6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25EcmFnU3RvcDogZnVuY3Rpb24gKCkgeyB9LFxuICAgIH07XG4gICAgcmV0dXJuIFJuZDtcbn0oUHVyZUNvbXBvbmVudCkpO1xuXG5leHBvcnQgeyBSbmQgfTtcbiIsImltcG9ydCB7IGNuYiB9IGZyb20gJ2NuYnVpbGRlcic7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB6b29tTGV2ZWwgfSBmcm9tICd6b29tLWxldmVsJztcbmltcG9ydCB7IERyYWdnYWJsZUNvcmUgfSBmcm9tICdyZWFjdC1kcmFnZ2FibGUnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbnZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIF90eXBlb2Yob2JqKTtcbn1cblxudmFyIGRvYyA9ICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihkb2N1bWVudCkpID09PSAnb2JqZWN0JyA/IGRvY3VtZW50IDogbnVsbDtcbnZhciBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xudmFyIGlzVW5kZWYgPSBmdW5jdGlvbiBpc1VuZGVmKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJztcbn07XG52YXIgaXNGdW4gPSBmdW5jdGlvbiBpc0Z1bih2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJztcbn07XG52YXIgaXNOdW0gPSBmdW5jdGlvbiBpc051bSh2KSB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ251bWJlcic7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBXaWxsIHJldHVybiByZW5kZXJlciByZXN1bHQgaWYgcHJlc2VudGVkLCBkaXYgZWxlbWVudCBvdGhlcndpc2UuXHJcbiAqIElmIHJlbmRlcmVyIGlzIHByZXNlbnRlZCBpdCdsbCByZWNlaXZlIGBlbGVtZW50UmVmYCBmdW5jdGlvbiB3aGljaCBzaG91bGQgYmUgdXNlZCBhcyBIVE1MRWxlbWVudCdzIHJlZi5cclxuICpcclxuICogQHBhcmFtIHByb3BzIHtFbGVtZW50UHJvcHNXaXRoRWxlbWVudFJlZkFuZFJlbmRlcmVyfVxyXG4gKiBAcGFyYW0gZWxlbWVudFJlZiB7RWxlbWVudFJlZn1cclxuICovXG5cbnZhciByZW5kZXJEaXZXaXRoUmVuZGVyZXIgPSBmdW5jdGlvbiByZW5kZXJEaXZXaXRoUmVuZGVyZXIocHJvcHMsIGVsZW1lbnRSZWYpIHtcbiAgaWYgKGlzRnVuKHByb3BzLnJlbmRlcmVyKSkge1xuICAgIHByb3BzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgIHZhciByZW5kZXJlciA9IHByb3BzLnJlbmRlcmVyO1xuICAgIGRlbGV0ZSBwcm9wcy5yZW5kZXJlcjtcbiAgICByZXR1cm4gcmVuZGVyZXIocHJvcHMpO1xuICB9XG5cbiAgZGVsZXRlIHByb3BzLmVsZW1lbnRSZWY7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9fYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogZWxlbWVudFJlZlxuICB9KSk7XG59O1xuXG52YXIgZ2V0SW5uZXJTaXplID0gZnVuY3Rpb24gZ2V0SW5uZXJTaXplKGVsLCBkaW1lbnNpb24sIHBhZGRpbmcxLCBwYWRkaW5nMikge1xuICB2YXIgc3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG5cbiAgaWYgKHN0eWxlcy5ib3hTaXppbmcgPT09ICdib3JkZXItYm94Jykge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCAoTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzW2RpbWVuc2lvbl0pIHx8IDApIC0gKE51bWJlci5wYXJzZUZsb2F0KHN0eWxlc1twYWRkaW5nMV0pIHx8IDApIC0gKE51bWJlci5wYXJzZUZsb2F0KHN0eWxlc1twYWRkaW5nMl0pIHx8IDApKTtcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIucGFyc2VGbG9hdChzdHlsZXNbZGltZW5zaW9uXSkgfHwgMDtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIFJldHVybiBlbGVtZW50J3MgaGVpZ2h0IHdpdGhvdXQgcGFkZGluZ1xyXG4gKi9cblxuXG52YXIgZ2V0SW5uZXJIZWlnaHQgPSBmdW5jdGlvbiBnZXRJbm5lckhlaWdodChlbCkge1xuICByZXR1cm4gZ2V0SW5uZXJTaXplKGVsLCAnaGVpZ2h0JywgJ3BhZGRpbmdUb3AnLCAncGFkZGluZ0JvdHRvbScpO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIGVsZW1lbnQncyB3aWR0aCB3aXRob3V0IHBhZGRpbmdcclxuICovXG5cbnZhciBnZXRJbm5lcldpZHRoID0gZnVuY3Rpb24gZ2V0SW5uZXJXaWR0aChlbCkge1xuICByZXR1cm4gZ2V0SW5uZXJTaXplKGVsLCAnd2lkdGgnLCAncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0Jyk7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gdW5pcXVlIFVVSUQgdjRcclxuICovXG5cbnZhciB1dWlkID0gZnVuY3Rpb24gdXVpZCgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3dcbiAgdmFyIHV1aWQgPSAnJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICBzd2l0Y2ggKGkpIHtcbiAgICAgIGNhc2UgODpcbiAgICAgIGNhc2UgMjA6XG4gICAgICAgIHtcbiAgICAgICAgICB1dWlkICs9IFwiLVwiLmNvbmNhdChNYXRoLnRydW5jKE1hdGgucmFuZG9tKCkgKiAxNikudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDEyOlxuICAgICAgICB7XG4gICAgICAgICAgdXVpZCArPSAnLTQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgMTY6XG4gICAgICAgIHtcbiAgICAgICAgICB1dWlkICs9IFwiLVwiLmNvbmNhdCgoTWF0aC5yYW5kb20oKSAqIDE2IHwgMCAmIDMgfCA4KS50b1N0cmluZygxNikpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICB1dWlkICs9IE1hdGgudHJ1bmMoTWF0aC5yYW5kb20oKSAqIDE2KS50b1N0cmluZygxNik7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIENhbGN1bGF0ZSB0aHVtYiBzaXplIGZvciBnaXZlbiB2aWV3cG9ydCBhbmQgdHJhY2sgcGFyYW1ldGVyc1xyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY29udGVudFNpemUgLSBTY3JvbGxhYmxlIGNvbnRlbnQgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmlld3BvcnRTaXplIC0gVmlld3BvcnQgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdHJhY2tTaXplIC0gVHJhY2sgc2l6ZSB0aHVtYiBjYW4gbW92ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWluaW1hbFNpemUgLSBNaW5pbWFsIHRodW1iJ3Mgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4aW1hbFNpemUgLSBNYXhpbWFsIHRodW1iJ3Mgc2l6ZVxyXG4gKi9cblxudmFyIGNhbGNUaHVtYlNpemUgPSBmdW5jdGlvbiBjYWxjVGh1bWJTaXplKGNvbnRlbnRTaXplLCB2aWV3cG9ydFNpemUsIHRyYWNrU2l6ZSwgbWluaW1hbFNpemUsIG1heGltYWxTaXplKSB7XG4gIGlmICh2aWV3cG9ydFNpemUgPj0gY29udGVudFNpemUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciB0aHVtYlNpemUgPSB2aWV3cG9ydFNpemUgLyBjb250ZW50U2l6ZSAqIHRyYWNrU2l6ZTtcblxuICBpZiAoaXNOdW0obWF4aW1hbFNpemUpKSB7XG4gICAgdGh1bWJTaXplID0gTWF0aC5taW4obWF4aW1hbFNpemUsIHRodW1iU2l6ZSk7XG4gIH1cblxuICBpZiAoaXNOdW0obWluaW1hbFNpemUpKSB7XG4gICAgdGh1bWJTaXplID0gTWF0aC5tYXgobWluaW1hbFNpemUsIHRodW1iU2l6ZSk7XG4gIH1cblxuICByZXR1cm4gdGh1bWJTaXplO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2FsY3VsYXRlIHRodW1iIG9mZnNldCBmb3IgZ2l2ZW4gdmlld3BvcnQsIHRyYWNrIGFuZCB0aHVtYiBwYXJhbWV0ZXJzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb250ZW50U2l6ZSAtIFNjcm9sbGFibGUgY29udGVudCBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2aWV3cG9ydFNpemUgLSBWaWV3cG9ydCBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0cmFja1NpemUgLSBUcmFjayBzaXplIHRodW1iIGNhbiBtb3ZlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aHVtYlNpemUgLSBUaHVtYiBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzY3JvbGwgLSBTY3JvbGwgdmFsdWUgdG8gcmVwcmVzZW50XHJcbiAqL1xuXG52YXIgY2FsY1RodW1iT2Zmc2V0ID0gZnVuY3Rpb24gY2FsY1RodW1iT2Zmc2V0KGNvbnRlbnRTaXplLCB2aWV3cG9ydFNpemUsIHRyYWNrU2l6ZSwgdGh1bWJTaXplLCBzY3JvbGwpIHtcbiAgaWYgKCFzY3JvbGwgfHwgIXRodW1iU2l6ZSB8fCB2aWV3cG9ydFNpemUgPj0gY29udGVudFNpemUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiAodHJhY2tTaXplIC0gdGh1bWJTaXplKSAqIHNjcm9sbCAvIChjb250ZW50U2l6ZSAtIHZpZXdwb3J0U2l6ZSk7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDYWxjdWxhdGUgc2Nyb2xsIGZvciBnaXZlbiB2aWV3cG9ydCwgdHJhY2sgYW5kIHRodW1iIHBhcmFtZXRlcnNcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGNvbnRlbnRTaXplIC0gU2Nyb2xsYWJsZSBjb250ZW50IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHZpZXdwb3J0U2l6ZSAtIFZpZXdwb3J0IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHRyYWNrU2l6ZSAtIFRyYWNrIHNpemUgdGh1bWIgY2FuIG1vdmVcclxuICogQHBhcmFtIHtudW1iZXJ9IHRodW1iU2l6ZSAtIFRodW1iIHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHRodW1iT2Zmc2V0IC0gVGh1bWIncyBvZmZzZXQgcmVwcmVzZW50aW5nIHRoZSBzY3JvbGxcclxuICovXG5cbnZhciBjYWxjU2Nyb2xsRm9yVGh1bWJPZmZzZXQgPSBmdW5jdGlvbiBjYWxjU2Nyb2xsRm9yVGh1bWJPZmZzZXQoY29udGVudFNpemUsIHZpZXdwb3J0U2l6ZSwgdHJhY2tTaXplLCB0aHVtYlNpemUsIHRodW1iT2Zmc2V0KSB7XG4gIGlmICghdGh1bWJPZmZzZXQgfHwgIXRodW1iU2l6ZSB8fCB2aWV3cG9ydFNpemUgPj0gY29udGVudFNpemUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB0aHVtYk9mZnNldCAqIChjb250ZW50U2l6ZSAtIHZpZXdwb3J0U2l6ZSkgLyAodHJhY2tTaXplIC0gdGh1bWJTaXplKTtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIFJldHVybnMgc2Nyb2xsYmFyIHdpZHRoIHNwZWNpZmljIGZvciBjdXJyZW50IGVudmlyb25tZW50LiBDYW4gcmV0dXJuIHVuZGVmaW5lZCBpZiBET00gaXMgbm90IHJlYWR5IHlldC5cclxuICovXG5cbnZhciBnZXRTY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uIGdldFNjcm9sbGJhcldpZHRoKGZvcmNlKSB7XG4gIGlmIChmb3JjZSA9PT0gdm9pZCAwKSB7XG4gICAgZm9yY2UgPSBmYWxzZTtcbiAgfVxuXG4gIGlmICghZG9jKSB7XG4gICAgZ2V0U2Nyb2xsYmFyV2lkdGguX2NhY2hlID0gMDtcbiAgICByZXR1cm4gZ2V0U2Nyb2xsYmFyV2lkdGguX2NhY2hlO1xuICB9XG5cbiAgaWYgKCFmb3JjZSAmJiAhaXNVbmRlZihnZXRTY3JvbGxiYXJXaWR0aC5fY2FjaGUpKSB7XG4gICAgcmV0dXJuIGdldFNjcm9sbGJhcldpZHRoLl9jYWNoZTtcbiAgfVxuXG4gIHZhciBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsICdwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDBweDtoZWlnaHQ6MTAwcHg7dG9wOi05OTlweDtsZWZ0Oi05OTlweDtvdmVyZmxvdzpzY3JvbGw7Jyk7XG4gIGRvYy5ib2R5LmFwcGVuZChlbCk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbiAgaWYgKGVsLmNsaWVudFdpZHRoID09PSAwKSB7XG4gICAgLy8gRG8gbm90IGV2ZW4gY2FjaGUgdGhpcyB2YWx1ZSBiZWNhdXNlIHRoZXJlIGlzIG5vIGNhbGN1bGF0aW9ucy4gSXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL3hvYm90eWkvcmVhY3Qtc2Nyb2xsYmFycy1jdXN0b20vaXNzdWVzLzEyM1xuICAgIGVsLnJlbW92ZSgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGdldFNjcm9sbGJhcldpZHRoLl9jYWNoZSA9IDEwMCAtIGVsLmNsaWVudFdpZHRoO1xuICBlbC5yZW1vdmUoKTtcbiAgcmV0dXJuIGdldFNjcm9sbGJhcldpZHRoLl9jYWNoZTtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIERldGVjdCBuZWVkIG9mIGhvcml6b250YWwgc2Nyb2xsIHJldmVyc2Ugd2hpbGUgUlRMLlxyXG4gKi9cblxudmFyIHNob3VsZFJldmVyc2VSdGxTY3JvbGwgPSBmdW5jdGlvbiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsKGZvcmNlKSB7XG4gIGlmIChmb3JjZSA9PT0gdm9pZCAwKSB7XG4gICAgZm9yY2UgPSBmYWxzZTtcbiAgfVxuXG4gIGlmICghZm9yY2UgJiYgIWlzVW5kZWYoc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbC5fY2FjaGUpKSB7XG4gICAgcmV0dXJuIHNob3VsZFJldmVyc2VSdGxTY3JvbGwuX2NhY2hlO1xuICB9XG5cbiAgaWYgKCFkb2MpIHtcbiAgICBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsLl9jYWNoZSA9IGZhbHNlO1xuICAgIHJldHVybiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsLl9jYWNoZTtcbiAgfVxuXG4gIHZhciBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdmFyIGNoaWxkID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBlbC5hcHBlbmQoY2hpbGQpO1xuICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMHB4O2hlaWdodDoxMDBweDt0b3A6LTk5OXB4O2xlZnQ6LTk5OXB4O292ZXJmbG93OnNjcm9sbDtkaXJlY3Rpb246cnRsJyk7XG4gIGNoaWxkLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6MTAwMHB4O2hlaWdodDoxMDAwcHgnKTtcbiAgZG9jLmJvZHkuYXBwZW5kKGVsKTtcbiAgZWwuc2Nyb2xsTGVmdCA9IC01MDtcbiAgc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbC5fY2FjaGUgPSBlbC5zY3JvbGxMZWZ0ID09PSAtNTA7XG4gIGVsLnJlbW92ZSgpO1xuICByZXR1cm4gc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbC5fY2FjaGU7XG59O1xuXG52YXIgRW1pdHRyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRW1pdHRyKG1heEhhbmRsZXJzKSB7XG4gICAgaWYgKG1heEhhbmRsZXJzID09PSB2b2lkIDApIHtcbiAgICAgIG1heEhhbmRsZXJzID0gMTA7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRNYXhIYW5kbGVycyhtYXhIYW5kbGVycyk7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG5cbiAgRW1pdHRyLl9jYWxsRXZlbnRIYW5kbGVycyA9IGZ1bmN0aW9uIChlbWl0dGVyLCBoYW5kbGVycywgYXJncykge1xuICAgIGlmICghaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGhhbmRsZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgUmVmbGVjdC5hcHBseShoYW5kbGVyc1swXSwgZW1pdHRlciwgYXJncyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaGFuZGxlcnMgPSBfX3NwcmVhZEFycmF5KFtdLCBoYW5kbGVycywgdHJ1ZSk7XG4gICAgdmFyIGlkeDtcblxuICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgaGFuZGxlcnMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgUmVmbGVjdC5hcHBseShoYW5kbGVyc1tpZHhdLCBlbWl0dGVyLCBhcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5zZXRNYXhIYW5kbGVycyA9IGZ1bmN0aW9uIChjb3VudCkge1xuICAgIGlmICghaXNOdW0oY291bnQpIHx8IGNvdW50IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBtYXhIYW5kbGVycyB0byBiZSBhIHBvc2l0aXZlIG51bWJlciwgZ290ICdcIi5jb25jYXQoY291bnQsIFwiJyBvZiB0eXBlIFwiKS5jb25jYXQoX3R5cGVvZihjb3VudCkpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhIYW5kbGVycyA9IGNvdW50O1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUuZ2V0TWF4SGFuZGxlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heEhhbmRsZXJzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cblxuICAgIGlmIChfdHlwZW9mKHRoaXMuX2hhbmRsZXJzW25hbWVdKSAhPT0gJ29iamVjdCcgfHwgIUFycmF5LmlzQXJyYXkodGhpcy5faGFuZGxlcnNbbmFtZV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgRW1pdHRyLl9jYWxsRXZlbnRIYW5kbGVycyh0aGlzLCB0aGlzLl9oYW5kbGVyc1tuYW1lXSwgYXJncyk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBFbWl0dHIuX2FkZEhhbmRsZXIodGhpcywgbmFtZSwgaGFuZGxlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLnByZXBlbmRPbiA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgRW1pdHRyLl9hZGRIYW5kbGVyKHRoaXMsIG5hbWUsIGhhbmRsZXIsIHRydWUpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAoIWlzRnVuKGhhbmRsZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgZXZlbnQgaGFuZGxlciB0byBiZSBhIGZ1bmN0aW9uLCBnb3QgXCIuY29uY2F0KF90eXBlb2YoaGFuZGxlcikpKTtcbiAgICB9XG5cbiAgICBFbWl0dHIuX2FkZEhhbmRsZXIodGhpcywgbmFtZSwgdGhpcy5fd3JhcE9uY2VIYW5kbGVyKG5hbWUsIGhhbmRsZXIpKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUucHJlcGVuZE9uY2UgPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIGlmICghaXNGdW4oaGFuZGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBldmVudCBoYW5kbGVyIHRvIGJlIGEgZnVuY3Rpb24sIGdvdCBcIi5jb25jYXQoX3R5cGVvZihoYW5kbGVyKSkpO1xuICAgIH1cblxuICAgIEVtaXR0ci5fYWRkSGFuZGxlcih0aGlzLCBuYW1lLCB0aGlzLl93cmFwT25jZUhhbmRsZXIobmFtZSwgaGFuZGxlciksIHRydWUpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIEVtaXR0ci5fcmVtb3ZlSGFuZGxlcih0aGlzLCBuYW1lLCBoYW5kbGVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUucmVtb3ZlQWxsSGFuZGxlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXJzID0gdGhpcy5faGFuZGxlcnM7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHZhciByZW1vdmVIYW5kbGVycyA9IGhhbmRsZXJzLnJlbW92ZUhhbmRsZXI7XG4gICAgZGVsZXRlIGhhbmRsZXJzLnJlbW92ZUhhbmRsZXI7XG4gICAgdmFyIGlkeDtcbiAgICB2YXIgZXZlbnROYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluLG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cbiAgICBmb3IgKGV2ZW50TmFtZSBpbiBoYW5kbGVycykge1xuICAgICAgZm9yIChpZHggPSBoYW5kbGVyc1tldmVudE5hbWVdLmxlbmd0aCAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICBFbWl0dHIuX2NhbGxFdmVudEhhbmRsZXJzKHRoaXMsIHJlbW92ZUhhbmRsZXJzLCBbZXZlbnROYW1lLCBoYW5kbGVyc1tldmVudE5hbWVdW2lkeF0uaGFuZGxlciB8fCBoYW5kbGVyc1tldmVudE5hbWVdW2lkeF1dKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLl93cmFwT25jZUhhbmRsZXIgPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIHZhciBvbmNlU3RhdGUgPSB7XG4gICAgICBmaXJlZDogZmFsc2UsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgd3JhcHBlZEhhbmRsZXI6IHVuZGVmaW5lZCxcbiAgICAgIGVtaXR0ZXI6IHRoaXMsXG4gICAgICBldmVudDogbmFtZVxuICAgIH07XG5cbiAgICB2YXIgd3JhcHBlZEhhbmRsZXIgPSBFbWl0dHIuX29uY2VXcmFwcGVyLmJpbmQob25jZVN0YXRlKTtcblxuICAgIG9uY2VTdGF0ZS53cmFwcGVkSGFuZGxlciA9IHdyYXBwZWRIYW5kbGVyO1xuICAgIHdyYXBwZWRIYW5kbGVyLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHdyYXBwZWRIYW5kbGVyLmV2ZW50ID0gbmFtZTtcbiAgICByZXR1cm4gd3JhcHBlZEhhbmRsZXI7XG4gIH07XG5cbiAgRW1pdHRyLl9hZGRIYW5kbGVyID0gZnVuY3Rpb24gKGVtaXR0ZXIsIG5hbWUsIGhhbmRsZXIsIHByZXBlbmQpIHtcbiAgICBpZiAocHJlcGVuZCA9PT0gdm9pZCAwKSB7XG4gICAgICBwcmVwZW5kID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFpc0Z1bihoYW5kbGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGV2ZW50IGhhbmRsZXIgdG8gYmUgYSBmdW5jdGlvbiwgZ290IFwiLmNvbmNhdChfdHlwZW9mKGhhbmRsZXIpKSk7XG4gICAgfVxuXG4gICAgZW1pdHRlci5faGFuZGxlcnNbbmFtZV0gPSBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXSB8fCBbXTtcbiAgICBlbWl0dGVyLmVtaXQoJ2FkZEhhbmRsZXInLCBuYW1lLCBoYW5kbGVyKTtcblxuICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS51bnNoaWZ0KGhhbmRsZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS5wdXNoKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBlbWl0dGVyO1xuICB9O1xuXG4gIEVtaXR0ci5fb25jZVdyYXBwZXIgPSBmdW5jdGlvbiBfb25jZVdyYXBwZXIoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpcmVkKSB7XG4gICAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZW1pdHRlci5vZmYodGhpcy5ldmVudCwgdGhpcy53cmFwcGVkSGFuZGxlcik7XG4gICAgICBSZWZsZWN0LmFwcGx5KHRoaXMuaGFuZGxlciwgdGhpcy5lbWl0dGVyLCBhcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgRW1pdHRyLl9yZW1vdmVIYW5kbGVyID0gZnVuY3Rpb24gKGVtaXR0ZXIsIG5hbWUsIGhhbmRsZXIpIHtcbiAgICBpZiAoIWlzRnVuKGhhbmRsZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgZXZlbnQgaGFuZGxlciB0byBiZSBhIGZ1bmN0aW9uLCBnb3QgXCIuY29uY2F0KF90eXBlb2YoaGFuZGxlcikpKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZihlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXSkgfHwgIWVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGVtaXR0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGlkeCA9IC0xO1xuXG4gICAgaWYgKGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdWzBdID09PSBoYW5kbGVyIHx8IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdWzBdLmhhbmRsZXIgPT09IGhhbmRsZXIpIHtcbiAgICAgICAgaWR4ID0gMDtcbiAgICAgICAgaGFuZGxlciA9IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdWzBdLmhhbmRsZXIgfHwgZW1pdHRlci5faGFuZGxlcnNbbmFtZV1bMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaWR4ID0gZW1pdHRlci5faGFuZGxlcnNbbmFtZV0ubGVuZ3RoIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgIGlmIChlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVtpZHhdID09PSBoYW5kbGVyIHx8IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdW2lkeF0uaGFuZGxlciA9PT0gaGFuZGxlcikge1xuICAgICAgICAgIGhhbmRsZXIgPSBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVtpZHhdLmhhbmRsZXIgfHwgZW1pdHRlci5faGFuZGxlcnNbbmFtZV1baWR4XTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZW1pdHRlcjtcbiAgICB9XG5cbiAgICBpZiAoaWR4ID09PSAwKSB7XG4gICAgICBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS5zcGxpY2UoaWR4LCAxKTtcbiAgICB9XG5cbiAgICBlbWl0dGVyLmVtaXQoJ3JlbW92ZUhhbmRsZXInLCBuYW1lLCBoYW5kbGVyKTtcbiAgICByZXR1cm4gZW1pdHRlcjtcbiAgfTtcblxuICByZXR1cm4gRW1pdHRyO1xufSgpO1xuXG52YXIgUkFGTG9vcCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJBRkxvb3AoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIHRhcmdldHMgdG8gdXBkYXRlXHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy50YXJnZXRzID0gW107XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSUQgb2YgcmVxdWVzdGVkIGFuaW1hdGlvbiBmcmFtZS4gVmFsdWFibGUgb25seSBpZiBsb29wIGlzIGFjdGl2ZSBhbmQgaGFzIGl0ZW1zIHRvIGl0ZXJhdGUuXHJcbiAgICAgKi9cblxuICAgIHRoaXMuYW5pbWF0aW9uRnJhbWVJRCA9IDA7XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTG9vcCdzIHN0YXRlLlxyXG4gICAgICovXG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFN0YXJ0IHRoZSBsb29wIGlmIGl0IHdhc24ndCB5ZXQuXHJcbiAgICAgKi9cblxuICAgIHRoaXMuc3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLl9pc0FjdGl2ZSAmJiBfdGhpcy50YXJnZXRzLmxlbmd0aCkge1xuICAgICAgICBfdGhpcy5faXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICBpZiAoX3RoaXMuYW5pbWF0aW9uRnJhbWVJRCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX3RoaXMuYW5pbWF0aW9uRnJhbWVJRCk7XG4gICAgICAgIF90aGlzLmFuaW1hdGlvbkZyYW1lSUQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMucmFmQ2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTdG9wIHRoZSBsb29wIGlmIGlzIHdhcyBhY3RpdmUuXHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgICBfdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgaWYgKF90aGlzLmFuaW1hdGlvbkZyYW1lSUQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKF90aGlzLmFuaW1hdGlvbkZyYW1lSUQpO1xuICAgICAgICBfdGhpcy5hbmltYXRpb25GcmFtZUlEID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIHRhcmdldCB0byB0aGUgaXRlcmF0aW9uIGxpc3QgaWYgaXQncyBub3QgdGhlcmUuXHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy5hZGRUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCBzaWxlbnQpIHtcbiAgICAgIGlmIChzaWxlbnQgPT09IHZvaWQgMCkge1xuICAgICAgICBzaWxlbnQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFfdGhpcy50YXJnZXRzLmluY2x1ZGVzKHRhcmdldCkpIHtcbiAgICAgICAgX3RoaXMudGFyZ2V0cy5wdXNoKHRhcmdldCk7XG5cbiAgICAgICAgaWYgKF90aGlzLnRhcmdldHMubGVuZ3RoID09PSAxICYmICFzaWxlbnQpIF90aGlzLnN0YXJ0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJlbW92ZSB0YXJnZXQgZnJvbSBpdGVyYXRpb24gbGlzdCBpZiBpdCB3YXMgdGhlcmUuXHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy5yZW1vdmVUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICB2YXIgaWR4ID0gX3RoaXMudGFyZ2V0cy5pbmRleE9mKHRhcmdldCk7XG5cbiAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgIF90aGlzLnRhcmdldHMuc3BsaWNlKGlkeCwgMSk7XG5cbiAgICAgICAgaWYgKF90aGlzLnRhcmdldHMubGVuZ3RoID09PSAwKSBfdGhpcy5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENhbGxiYWNrIHRoYXQgY2FsbGVkIGVhY2ggYW5pbWF0aW9uIGZyYW1lLlxyXG4gICAgICovXG5cblxuICAgIHRoaXMucmFmQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfdGhpcy50YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghX3RoaXMudGFyZ2V0c1tpXS5fdW5tb3VudGVkKSBfdGhpcy50YXJnZXRzW2ldLnVwZGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5hbmltYXRpb25GcmFtZUlEID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnJhZkNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBfdGhpcy5hbmltYXRpb25GcmFtZUlEO1xuICAgIH07XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUkFGTG9vcC5wcm90b3R5cGUsIFwiaXNBY3RpdmVcIiwge1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIExvb3AncyBzdGF0ZS5cclxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlO1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gUkFGTG9vcDtcbn0oKTtcbnZhciBMb29wID0gbmV3IFJBRkxvb3AoKTtcblxudmFyIEFYSVNfRElSRUNUSU9OO1xuXG4oZnVuY3Rpb24gKEFYSVNfRElSRUNUSU9OKSB7XG4gIEFYSVNfRElSRUNUSU9OW1wiWFwiXSA9IFwieFwiO1xuICBBWElTX0RJUkVDVElPTltcIllcIl0gPSBcInlcIjtcbn0pKEFYSVNfRElSRUNUSU9OIHx8IChBWElTX0RJUkVDVElPTiA9IHt9KSk7XG5cbnZhciBUUkFDS19DTElDS19CRUhBVklPUjtcblxuKGZ1bmN0aW9uIChUUkFDS19DTElDS19CRUhBVklPUikge1xuICBUUkFDS19DTElDS19CRUhBVklPUltcIkpVTVBcIl0gPSBcImp1bXBcIjtcbiAgVFJBQ0tfQ0xJQ0tfQkVIQVZJT1JbXCJTVEVQXCJdID0gXCJzdGVwXCI7XG59KShUUkFDS19DTElDS19CRUhBVklPUiB8fCAoVFJBQ0tfQ0xJQ0tfQkVIQVZJT1IgPSB7fSkpO1xuXG52YXIgU2Nyb2xsYmFyVGh1bWIgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU2Nyb2xsYmFyVGh1bWIsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gU2Nyb2xsYmFyVGh1bWIoKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WCA9IDA7XG4gICAgX3RoaXMuaW5pdGlhbE9mZnNldFkgPSAwO1xuICAgIF90aGlzLmVsZW1lbnRSZWZIYWNrID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMubGFzdERyYWdEYXRhID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICBkZWx0YVg6IDAsXG4gICAgICBkZWx0YVk6IDAsXG4gICAgICBsYXN0WDogMCxcbiAgICAgIGxhc3RZOiAwXG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU9uRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKGV2LCBkYXRhKSB7XG4gICAgICBpZiAoIV90aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMuaGFuZGxlT25EcmFnU3RvcChldiwgZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNCcm93c2VyKSB7XG4gICAgICAgIF90aGlzLnByZXZVc2VyU2VsZWN0ID0gZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0O1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XG4gICAgICAgIF90aGlzLnByZXZPblNlbGVjdFN0YXJ0ID0gZG9jdW1lbnQub25zZWxlY3RzdGFydDtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBTY3JvbGxiYXJUaHVtYi5zZWxlY3RTdGFydFJlcGxhY2VyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLnByb3BzLm9uRHJhZ1N0YXJ0KSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uRHJhZ1N0YXJ0KF90aGlzLmxhc3REcmFnRGF0YSA9IHtcbiAgICAgICAgICB4OiBkYXRhLnggLSBfdGhpcy5pbml0aWFsT2Zmc2V0WCxcbiAgICAgICAgICB5OiBkYXRhLnkgLSBfdGhpcy5pbml0aWFsT2Zmc2V0WSxcbiAgICAgICAgICBsYXN0WDogZGF0YS5sYXN0WCAtIF90aGlzLmluaXRpYWxPZmZzZXRYLFxuICAgICAgICAgIGxhc3RZOiBkYXRhLmxhc3RZIC0gX3RoaXMuaW5pdGlhbE9mZnNldFksXG4gICAgICAgICAgZGVsdGFYOiBkYXRhLmRlbHRhWCxcbiAgICAgICAgICBkZWx0YVk6IGRhdGEuZGVsdGFZXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RyYWdnaW5nJyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU9uRHJhZyA9IGZ1bmN0aW9uIChldiwgZGF0YSkge1xuICAgICAgaWYgKCFfdGhpcy5lbGVtZW50KSB7XG4gICAgICAgIF90aGlzLmhhbmRsZU9uRHJhZ1N0b3AoZXYsIGRhdGEpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLnByb3BzLm9uRHJhZykge1xuICAgICAgICBfdGhpcy5wcm9wcy5vbkRyYWcoX3RoaXMubGFzdERyYWdEYXRhID0ge1xuICAgICAgICAgIHg6IGRhdGEueCAtIF90aGlzLmluaXRpYWxPZmZzZXRYLFxuICAgICAgICAgIHk6IGRhdGEueSAtIF90aGlzLmluaXRpYWxPZmZzZXRZLFxuICAgICAgICAgIGxhc3RYOiBkYXRhLmxhc3RYIC0gX3RoaXMuaW5pdGlhbE9mZnNldFgsXG4gICAgICAgICAgbGFzdFk6IGRhdGEubGFzdFkgLSBfdGhpcy5pbml0aWFsT2Zmc2V0WSxcbiAgICAgICAgICBkZWx0YVg6IGRhdGEuZGVsdGFYLFxuICAgICAgICAgIGRlbHRhWTogZGF0YS5kZWx0YVlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU9uRHJhZ1N0b3AgPSBmdW5jdGlvbiAoZXYsIGRhdGEpIHtcbiAgICAgIHZhciByZXN1bHREYXRhID0gZGF0YSA/IHtcbiAgICAgICAgeDogZGF0YS54IC0gX3RoaXMuaW5pdGlhbE9mZnNldFgsXG4gICAgICAgIHk6IGRhdGEueSAtIF90aGlzLmluaXRpYWxPZmZzZXRZLFxuICAgICAgICBsYXN0WDogZGF0YS5sYXN0WCAtIF90aGlzLmluaXRpYWxPZmZzZXRYLFxuICAgICAgICBsYXN0WTogZGF0YS5sYXN0WSAtIF90aGlzLmluaXRpYWxPZmZzZXRZLFxuICAgICAgICBkZWx0YVg6IGRhdGEuZGVsdGFYLFxuICAgICAgICBkZWx0YVk6IGRhdGEuZGVsdGFZXG4gICAgICB9IDogX3RoaXMubGFzdERyYWdEYXRhO1xuICAgICAgaWYgKF90aGlzLnByb3BzLm9uRHJhZ0VuZCkgX3RoaXMucHJvcHMub25EcmFnRW5kKHJlc3VsdERhdGEpO1xuICAgICAgaWYgKF90aGlzLmVsZW1lbnQpIF90aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dpbmcnKTtcblxuICAgICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSBfdGhpcy5wcmV2VXNlclNlbGVjdDtcblxuICAgICAgICBpZiAoX3RoaXMucHJldk9uU2VsZWN0U3RhcnQpIHtcbiAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIF90aGlzLnByZXZPblNlbGVjdFN0YXJ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnByZXZPblNlbGVjdFN0YXJ0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldFggPSAwO1xuICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldFkgPSAwO1xuICAgICAgX3RoaXMubGFzdERyYWdEYXRhID0ge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICBkZWx0YVg6IDAsXG4gICAgICAgIGRlbHRhWTogMCxcbiAgICAgICAgbGFzdFg6IDAsXG4gICAgICAgIGxhc3RZOiAwXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVPbk1vdXNlRG93biA9IGZ1bmN0aW9uIChldikge1xuICAgICAgaWYgKCFfdGhpcy5lbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBpZiAoIWlzVW5kZWYoZXYub2Zmc2V0WCkpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldFggPSBldi5vZmZzZXRYO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4gICAgICAgIF90aGlzLmluaXRpYWxPZmZzZXRZID0gZXYub2Zmc2V0WTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZWN0ID0gX3RoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WCA9IChldi5jbGllbnRYIHx8IGV2LnRvdWNoZXNbMF0uY2xpZW50WCkgLSByZWN0LmxlZnQ7XG4gICAgICAgIF90aGlzLmluaXRpYWxPZmZzZXRZID0gKGV2LmNsaWVudFkgfHwgZXYudG91Y2hlc1swXS5jbGllbnRZKSAtIHJlY3QudG9wO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLmVsZW1lbnRSZWYpKSBfdGhpcy5wcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICBfdGhpcy5lbGVtZW50ID0gcmVmOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAvLyBAdHMtaWdub3JlXG5cbiAgICAgIF90aGlzLmVsZW1lbnRSZWZIYWNrLmN1cnJlbnQgPSByZWY7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFNjcm9sbGJhclRodW1iLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIjxTY3JvbGxiYXJUaHVtYj4gRWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBTY3JvbGxiYXJUaHVtYi5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5oYW5kbGVPbkRyYWdTdG9wKCk7XG4gICAgdGhpcy5lbGVtZW50UmVmKG51bGwpO1xuICB9O1xuXG4gIFNjcm9sbGJhclRodW1iLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hID0gdGhpcy5wcm9wcztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmVsZW1lbnRSZWY7XG4gICAgICAgIHZhciBheGlzID0gX2EuYXhpcztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uRHJhZztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uRHJhZ0VuZDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uRHJhZ1N0YXJ0O1xuICAgICAgICB2YXIgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcImVsZW1lbnRSZWZcIiwgXCJheGlzXCIsIFwib25EcmFnXCIsIFwib25EcmFnRW5kXCIsIFwib25EcmFnU3RhcnRcIl0pO1xuXG4gICAgcHJvcHMuY2xhc3NOYW1lID0gY25iKCdTY3JvbGxiYXJzQ3VzdG9tLVRodW1iJywgYXhpcyA9PT0gQVhJU19ESVJFQ1RJT04uWCA/ICdTY3JvbGxiYXJzQ3VzdG9tLVRodW1iWCcgOiAnU2Nyb2xsYmFyc0N1c3RvbS1UaHVtYlknLCBwcm9wcy5jbGFzc05hbWUpO1xuXG4gICAgaWYgKHByb3BzLnJlbmRlcmVyKSB7XG4gICAgICBwcm9wcy5heGlzID0gYXhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChEcmFnZ2FibGVDb3JlLCB7XG4gICAgICBhbGxvd0FueUNsaWNrOiBmYWxzZSxcbiAgICAgIGVuYWJsZVVzZXJTZWxlY3RIYWNrOiBmYWxzZSxcbiAgICAgIG9uTW91c2VEb3duOiB0aGlzLmhhbmRsZU9uTW91c2VEb3duLFxuICAgICAgb25EcmFnOiB0aGlzLmhhbmRsZU9uRHJhZyxcbiAgICAgIG9uU3RhcnQ6IHRoaXMuaGFuZGxlT25EcmFnU3RhcnQsXG4gICAgICBvblN0b3A6IHRoaXMuaGFuZGxlT25EcmFnU3RvcCxcbiAgICAgIG5vZGVSZWY6IHRoaXMuZWxlbWVudFJlZkhhY2tcbiAgICB9LCByZW5kZXJEaXZXaXRoUmVuZGVyZXIocHJvcHMsIHRoaXMuZWxlbWVudFJlZikpO1xuICB9O1xuXG4gIFNjcm9sbGJhclRodW1iLnNlbGVjdFN0YXJ0UmVwbGFjZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHJldHVybiBTY3JvbGxiYXJUaHVtYjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIFNjcm9sbGJhclRyYWNrID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKFNjcm9sbGJhclRyYWNrLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIFNjcm9sbGJhclRyYWNrKCkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuZWxlbWVudCA9IG51bGw7XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLmVsZW1lbnRSZWYpKSBfdGhpcy5wcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICBfdGhpcy5lbGVtZW50ID0gcmVmO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIChldikge1xuICAgICAgaWYgKCFldiB8fCAhX3RoaXMuZWxlbWVudCB8fCBldi5idXR0b24gIT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMub25DbGljaykgJiYgZXYudGFyZ2V0ID09PSBfdGhpcy5lbGVtZW50KSB7XG4gICAgICAgIGlmICghaXNVbmRlZihldi5vZmZzZXRYKSkge1xuICAgICAgICAgIF90aGlzLnByb3BzLm9uQ2xpY2soZXYsIHtcbiAgICAgICAgICAgIGF4aXM6IF90aGlzLnByb3BzLmF4aXMsXG4gICAgICAgICAgICBvZmZzZXQ6IF90aGlzLnByb3BzLmF4aXMgPT09IEFYSVNfRElSRUNUSU9OLlggPyBldi5vZmZzZXRYIDogZXYub2Zmc2V0WVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIG9sZCBicm93c2Vyc1xuXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICB2YXIgcmVjdCA9IF90aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuXG4gICAgICAgICAgX3RoaXMucHJvcHMub25DbGljayhldiwge1xuICAgICAgICAgICAgYXhpczogX3RoaXMucHJvcHMuYXhpcyxcbiAgICAgICAgICAgIG9mZnNldDogX3RoaXMucHJvcHMuYXhpcyA9PT0gQVhJU19ESVJFQ1RJT04uWCA/IChldi5jbGllbnRYIHx8IGV2LnRvdWNoZXNbMF0uY2xpZW50WCkgLSByZWN0LmxlZnQgOiAoZXYuY2xpZW50WSB8fCBldi50b3VjaGVzWzBdLmNsaWVudFkpIC0gcmVjdC50b3BcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgU2Nyb2xsYmFyVHJhY2sucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuICB9O1xuXG4gIFNjcm9sbGJhclRyYWNrLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5lbGVtZW50KSB7XG4gICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYobnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIFNjcm9sbGJhclRyYWNrLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hID0gdGhpcy5wcm9wcztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmVsZW1lbnRSZWY7XG4gICAgICAgIHZhciBheGlzID0gX2EuYXhpcztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uQ2xpY2s7XG4gICAgICAgIHZhciBwcm9wcyA9IF9fcmVzdChfYSwgW1wiZWxlbWVudFJlZlwiLCBcImF4aXNcIiwgXCJvbkNsaWNrXCJdKTtcblxuICAgIHByb3BzLmNsYXNzTmFtZSA9IGNuYignU2Nyb2xsYmFyc0N1c3RvbS1UcmFjaycsIGF4aXMgPT09IEFYSVNfRElSRUNUSU9OLlggPyAnU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1gnIDogJ1Njcm9sbGJhcnNDdXN0b20tVHJhY2tZJywgcHJvcHMuY2xhc3NOYW1lKTtcblxuICAgIGlmIChwcm9wcy5yZW5kZXJlcikge1xuICAgICAgcHJvcHMuYXhpcyA9IGF4aXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlckRpdldpdGhSZW5kZXJlcihwcm9wcywgdGhpcy5lbGVtZW50UmVmKTtcbiAgfTtcblxuICByZXR1cm4gU2Nyb2xsYmFyVHJhY2s7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbnZhciBzdHlsZSA9IHtcbiAgaG9sZGVyOiB7XG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICBoZWlnaHQ6ICcxMDAlJ1xuICB9LFxuICB3cmFwcGVyOiB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIHJpZ2h0OiAwXG4gIH0sXG4gIGNvbnRlbnQ6IHtcbiAgICBib3hTaXppbmc6ICdib3JkZXItYm94J1xuICB9LFxuICB0cmFjazoge1xuICAgIGNvbW1vbjoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICBib3JkZXJSYWRpdXM6IDQsXG4gICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLDAsMCwuMSknLFxuICAgICAgdXNlclNlbGVjdDogJ25vbmUnXG4gICAgfSxcbiAgICB4OiB7XG4gICAgICBoZWlnaHQ6IDEwLFxuICAgICAgd2lkdGg6ICdjYWxjKDEwMCUgLSAyMHB4KScsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAxMFxuICAgIH0sXG4gICAgeToge1xuICAgICAgd2lkdGg6IDEwLFxuICAgICAgaGVpZ2h0OiAnY2FsYygxMDAlIC0gMjBweCknLFxuICAgICAgdG9wOiAxMFxuICAgIH1cbiAgfSxcbiAgdGh1bWI6IHtcbiAgICBjb21tb246IHtcbiAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgYm9yZGVyUmFkaXVzOiA0LFxuICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMCwwLDAsLjQpJ1xuICAgIH0sXG4gICAgeDoge1xuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB3aWR0aDogMFxuICAgIH0sXG4gICAgeToge1xuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogMFxuICAgIH1cbiAgfVxufTtcblxudmFyIHBhZ2Vab29tTGV2ZWwgPSBpc0Jyb3dzZXIgPyB6b29tTGV2ZWwoKSA6IDE7XG5cbmlmIChpc0Jyb3dzZXIpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBwYWdlWm9vbUxldmVsID0gem9vbUxldmVsKCk7XG4gIH0sIHtcbiAgICBwYXNzaXZlOiB0cnVlXG4gIH0pO1xufVxuXG52YXIgU2Nyb2xsYmFyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBwYXJlbnRTY3JvbGxiYXI6IG51bGxcbn0pO1xuXG52YXIgU2Nyb2xsYmFyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKFNjcm9sbGJhciwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBTY3JvbGxiYXIocHJvcHMpIHtcbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcykgfHwgdGhpcztcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgY3VycmVudCBzY3JvbGwtcmVsYXRlZCB2YWx1ZXMuPGJyLz5cclxuICAgICAqIElmIDxpPmZvcmNlPC9pPiBpZiB0cnV0aHkgLSB3aWxsIHJlY2FsY3VsYXRlIHRoZW0gaW5zdGVhZCBvZiByZXR1cm5pbmcgY2FjaGVkIHZhbHVlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIFNjcm9sbFN0YXRlXHJcbiAgICAgKi9cblxuXG4gICAgX3RoaXMuZ2V0U2Nyb2xsU3RhdGUgPSBmdW5jdGlvbiAoZm9yY2UpIHtcbiAgICAgIGlmIChmb3JjZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGZvcmNlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5zY3JvbGxWYWx1ZXMgJiYgIWZvcmNlKSB7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbih7fSwgX3RoaXMuc2Nyb2xsVmFsdWVzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNjcm9sbFN0YXRlID0ge1xuICAgICAgICBjbGllbnRIZWlnaHQ6IDAsXG4gICAgICAgIGNsaWVudFdpZHRoOiAwLFxuICAgICAgICBjb250ZW50U2Nyb2xsSGVpZ2h0OiAwLFxuICAgICAgICBjb250ZW50U2Nyb2xsV2lkdGg6IDAsXG4gICAgICAgIHNjcm9sbEhlaWdodDogMCxcbiAgICAgICAgc2Nyb2xsV2lkdGg6IDAsXG4gICAgICAgIHNjcm9sbFRvcDogMCxcbiAgICAgICAgc2Nyb2xsTGVmdDogMCxcbiAgICAgICAgc2Nyb2xsWUJsb2NrZWQ6IGZhbHNlLFxuICAgICAgICBzY3JvbGxYQmxvY2tlZDogZmFsc2UsXG4gICAgICAgIHNjcm9sbFlQb3NzaWJsZTogZmFsc2UsXG4gICAgICAgIHNjcm9sbFhQb3NzaWJsZTogZmFsc2UsXG4gICAgICAgIHRyYWNrWVZpc2libGU6IGZhbHNlLFxuICAgICAgICB0cmFja1hWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgem9vbUxldmVsOiBwYWdlWm9vbUxldmVsICogMSxcbiAgICAgICAgaXNSVEw6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIHZhciBwcm9wcyA9IF90aGlzLnByb3BzO1xuICAgICAgc2Nyb2xsU3RhdGUuaXNSVEwgPSBfdGhpcy5zdGF0ZS5pc1JUTDtcbiAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbFlCbG9ja2VkID0gcHJvcHMubm9TY3JvbGwgfHwgcHJvcHMubm9TY3JvbGxZO1xuICAgICAgc2Nyb2xsU3RhdGUuc2Nyb2xsWEJsb2NrZWQgPSBwcm9wcy5ub1Njcm9sbCB8fCBwcm9wcy5ub1Njcm9sbFg7XG5cbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgc2Nyb2xsU3RhdGUuY2xpZW50SGVpZ2h0ID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgc2Nyb2xsU3RhdGUuY2xpZW50V2lkdGggPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbEhlaWdodCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbFdpZHRoID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxUb3AgPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxMZWZ0ID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbFlQb3NzaWJsZSA9ICFzY3JvbGxTdGF0ZS5zY3JvbGxZQmxvY2tlZCAmJiBzY3JvbGxTdGF0ZS5zY3JvbGxIZWlnaHQgPiBzY3JvbGxTdGF0ZS5jbGllbnRIZWlnaHQ7XG4gICAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbFhQb3NzaWJsZSA9ICFzY3JvbGxTdGF0ZS5zY3JvbGxYQmxvY2tlZCAmJiBzY3JvbGxTdGF0ZS5zY3JvbGxXaWR0aCA+IHNjcm9sbFN0YXRlLmNsaWVudFdpZHRoO1xuICAgICAgICBzY3JvbGxTdGF0ZS50cmFja1lWaXNpYmxlID0gc2Nyb2xsU3RhdGUuc2Nyb2xsWVBvc3NpYmxlIHx8IHByb3BzLnBlcm1hbmVudFRyYWNrcyB8fCBwcm9wcy5wZXJtYW5lbnRUcmFja1k7XG4gICAgICAgIHNjcm9sbFN0YXRlLnRyYWNrWFZpc2libGUgPSBzY3JvbGxTdGF0ZS5zY3JvbGxYUG9zc2libGUgfHwgcHJvcHMucGVybWFuZW50VHJhY2tzIHx8IHByb3BzLnBlcm1hbmVudFRyYWNrWDtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLmNvbnRlbnRFbGVtZW50KSB7XG4gICAgICAgIHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxIZWlnaHQgPSBfdGhpcy5jb250ZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxXaWR0aCA9IF90aGlzLmNvbnRlbnRFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2Nyb2xsU3RhdGU7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTY3JvbGwgdG8gdG9wIGJvcmRlclxyXG4gICAgICovXG5cblxuICAgIF90aGlzLnNjcm9sbFRvVG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2Nyb2xsIHRvIGxlZnQgYm9yZGVyXHJcbiAgICAgKi9cblxuXG4gICAgX3RoaXMuc2Nyb2xsVG9MZWZ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNjcm9sbCB0byBib3R0b20gYm9yZGVyXHJcbiAgICAgKi9cblxuXG4gICAgX3RoaXMuc2Nyb2xsVG9Cb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2Nyb2xsIHRvIHJpZ2h0IGJvcmRlclxyXG4gICAgICovXG5cblxuICAgIF90aGlzLnNjcm9sbFRvUmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFdpZHRoIC0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgdGhlIHNjcm9sbHMgYXQgZ2l2ZW4gY29vcmRpbmF0ZXMuPGJyLz5cclxuICAgICAqIElmIGNvb3JkaW5hdGUgaXMgdW5kZWZpbmVkIC0gY3VycmVudCBzY3JvbGwgdmFsdWUgd2lsbCBwZXJzaXN0LlxyXG4gICAgICovXG5cblxuICAgIF90aGlzLnNjcm9sbFRvID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGlzTnVtKHgpKSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IHg7XG4gICAgICAgIGlmIChpc051bSh5KSkgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IHk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENlbnRlciB0aGUgdmlld3BvcnQgYXQgZ2l2ZW4gY29vcmRpbmF0ZXMuPGJyLz5cclxuICAgICAqIElmIGNvb3JkaW5hdGUgaXMgdW5kZWZpbmVkIC0gY3VycmVudCBzY3JvbGwgdmFsdWUgd2lsbCBwZXJzaXN0LlxyXG4gICAgICovXG5cblxuICAgIF90aGlzLmNlbnRlckF0ID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGlzTnVtKHgpKSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IHggLSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuY2xpZW50V2lkdGggLyAyO1xuICAgICAgICBpZiAoaXNOdW0oeSkpIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSB5IC0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudEhlaWdodCAvIDI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuXG4gICAgX3RoaXMudXBkYXRlID0gZnVuY3Rpb24gKGZvcmNlKSB7XG4gICAgICBpZiAoZm9yY2UgPT09IHZvaWQgMCkge1xuICAgICAgICBmb3JjZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIGF1dG9kZXRlY3QgZGlyZWN0aW9uIGlmIG5vdCBkZWZpbmVkXG5cblxuICAgICAgaWYgKGlzVW5kZWYoX3RoaXMuc3RhdGUuaXNSVEwpKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc1JUTDogZ2V0Q29tcHV0ZWRTdHlsZShfdGhpcy5zY3JvbGxlckVsZW1lbnQpLmRpcmVjdGlvbiA9PT0gJ3J0bCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIF90aGlzLmdldFNjcm9sbFN0YXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzY3JvbGxTdGF0ZSA9IF90aGlzLmdldFNjcm9sbFN0YXRlKHRydWUpO1xuXG4gICAgICB2YXIgcHJldlNjcm9sbFN0YXRlID0gX19hc3NpZ24oe30sIF90aGlzLnNjcm9sbFZhbHVlcyk7XG5cbiAgICAgIHZhciBwcm9wcyA9IF90aGlzLnByb3BzO1xuICAgICAgdmFyIGJpdG1hc2sgPSAwO1xuXG4gICAgICBpZiAoIWZvcmNlKSB7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuY2xpZW50SGVpZ2h0ICE9PSBzY3JvbGxTdGF0ZS5jbGllbnRIZWlnaHQpIGJpdG1hc2sgfD0gTWF0aC50cnVuYygxKTtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5jbGllbnRXaWR0aCAhPT0gc2Nyb2xsU3RhdGUuY2xpZW50V2lkdGgpIGJpdG1hc2sgfD0gMSA8PCAxO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbEhlaWdodCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsSGVpZ2h0KSBiaXRtYXNrIHw9IDEgPDwgMjtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxXaWR0aCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsV2lkdGgpIGJpdG1hc2sgfD0gMSA8PCAzO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbFRvcCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsVG9wKSBiaXRtYXNrIHw9IDEgPDwgNDtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxMZWZ0ICE9PSBzY3JvbGxTdGF0ZS5zY3JvbGxMZWZ0KSBiaXRtYXNrIHw9IDEgPDwgNTtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxZQmxvY2tlZCAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsWUJsb2NrZWQpIGJpdG1hc2sgfD0gMSA8PCA2O1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbFhCbG9ja2VkICE9PSBzY3JvbGxTdGF0ZS5zY3JvbGxYQmxvY2tlZCkgYml0bWFzayB8PSAxIDw8IDc7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWVBvc3NpYmxlICE9PSBzY3JvbGxTdGF0ZS5zY3JvbGxZUG9zc2libGUpIGJpdG1hc2sgfD0gMSA8PCA4O1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbFhQb3NzaWJsZSAhPT0gc2Nyb2xsU3RhdGUuc2Nyb2xsWFBvc3NpYmxlKSBiaXRtYXNrIHw9IDEgPDwgOTtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS50cmFja1lWaXNpYmxlICE9PSBzY3JvbGxTdGF0ZS50cmFja1lWaXNpYmxlKSBiaXRtYXNrIHw9IDEgPDwgMTA7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUudHJhY2tYVmlzaWJsZSAhPT0gc2Nyb2xsU3RhdGUudHJhY2tYVmlzaWJsZSkgYml0bWFzayB8PSAxIDw8IDExO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLmlzUlRMICE9PSBzY3JvbGxTdGF0ZS5pc1JUTCkgYml0bWFzayB8PSAxIDw8IDEyO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxIZWlnaHQgIT09IHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxIZWlnaHQpIGJpdG1hc2sgfD0gMSA8PCAxMztcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsV2lkdGggIT09IHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxXaWR0aCkgYml0bWFzayB8PSAxIDw8IDE0O1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnpvb21MZXZlbCAhPT0gc2Nyb2xsU3RhdGUuem9vbUxldmVsKSBiaXRtYXNrIHw9IDEgPDwgMTU7IC8vIGlmIG5vdCBmb3JjZWQgYW5kIG5vdGhpbmcgaGFzIGNoYW5nZWQgLSBza2lwIHRoaXMgdXBkYXRlXG5cbiAgICAgICAgaWYgKGJpdG1hc2sgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcHJldlNjcm9sbFN0YXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaXRtYXNrID0gMzI3Njc7XG4gICAgICB9XG5cbiAgICAgIGlmICghcHJvcHMubmF0aXZlICYmIF90aGlzLmhvbGRlckVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGJpdG1hc2sgJiAxIDw8IDEzICYmIChwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVlUb0hvbGRlcikpIHtcbiAgICAgICAgICBfdGhpcy5ob2xkZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9IFwiXCIuY29uY2F0KHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxIZWlnaHQsIFwicHhcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYml0bWFzayAmIDEgPDwgMTQgJiYgKHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWFRvSG9sZGVyKSkge1xuICAgICAgICAgIF90aGlzLmhvbGRlckVsZW1lbnQuc3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdChzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsV2lkdGgsIFwicHhcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVzVG9Ib2xkZXIgfHwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVZVG9Ib2xkZXIgfHwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVYVG9Ib2xkZXIpIHtcbiAgICAgICAgICBpZiAoIXNjcm9sbFN0YXRlLmNsaWVudEhlaWdodCAmJiBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsSGVpZ2h0IHx8ICFzY3JvbGxTdGF0ZS5jbGllbnRXaWR0aCAmJiBzY3JvbGxTdGF0ZS5jb250ZW50U2Nyb2xsV2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy8gaWYgc2Nyb2xsYmFycyB2aXNpYmlsaXR5IGhhcyBjaGFuZ2VkXG5cblxuICAgICAgaWYgKGJpdG1hc2sgJiAxIDw8IDEwIHx8IGJpdG1hc2sgJiAxIDw8IDExKSB7XG4gICAgICAgIHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxZQmxvY2tlZCA9IHNjcm9sbFN0YXRlLnNjcm9sbFlCbG9ja2VkO1xuICAgICAgICBwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWEJsb2NrZWQgPSBzY3JvbGxTdGF0ZS5zY3JvbGxYQmxvY2tlZDtcbiAgICAgICAgcHJldlNjcm9sbFN0YXRlLnNjcm9sbFlQb3NzaWJsZSA9IHNjcm9sbFN0YXRlLnNjcm9sbFlQb3NzaWJsZTtcbiAgICAgICAgcHJldlNjcm9sbFN0YXRlLnNjcm9sbFhQb3NzaWJsZSA9IHNjcm9sbFN0YXRlLnNjcm9sbFhQb3NzaWJsZTtcblxuICAgICAgICBpZiAoX3RoaXMudHJhY2tZRWxlbWVudCAmJiBiaXRtYXNrICYgMSA8PCAxMCkge1xuICAgICAgICAgIF90aGlzLnRyYWNrWUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHNjcm9sbFN0YXRlLnRyYWNrWVZpc2libGUgPyAnJyA6ICdub25lJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpcy50cmFja1hFbGVtZW50ICYmIGJpdG1hc2sgJiAxIDw8IDExKSB7XG4gICAgICAgICAgX3RoaXMudHJhY2tYRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gc2Nyb2xsU3RhdGUudHJhY2tYVmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMuc2Nyb2xsVmFsdWVzID0gcHJldlNjcm9sbFN0YXRlO1xuXG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICB0cmFja1lWaXNpYmxlOiBfdGhpcy5zY3JvbGxWYWx1ZXMudHJhY2tZVmlzaWJsZSA9IHNjcm9sbFN0YXRlLnRyYWNrWVZpc2libGUsXG4gICAgICAgICAgdHJhY2tYVmlzaWJsZTogX3RoaXMuc2Nyb2xsVmFsdWVzLnRyYWNrWFZpc2libGUgPSBzY3JvbGxTdGF0ZS50cmFja1hWaXNpYmxlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgKHByb3BzLm5hdGl2ZSA/IF90aGlzLnVwZGF0ZXJOYXRpdmUgOiBfdGhpcy51cGRhdGVyQ3VzdG9tKShiaXRtYXNrLCBzY3JvbGxTdGF0ZSk7XG4gICAgICBfdGhpcy5zY3JvbGxWYWx1ZXMgPSBzY3JvbGxTdGF0ZTtcblxuICAgICAgaWYgKCFwcm9wcy5uYXRpdmUgJiYgYml0bWFzayAmIDEgPDwgMTUpIHtcbiAgICAgICAgZ2V0U2Nyb2xsYmFyV2lkdGgodHJ1ZSk7XG5cbiAgICAgICAgX3RoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZXZlbnRFbWl0dGVyLmVtaXQoJ3VwZGF0ZScsIF9fYXNzaWduKHt9LCBzY3JvbGxTdGF0ZSksIHByZXZTY3JvbGxTdGF0ZSk7XG5cbiAgICAgIGlmIChiaXRtYXNrICYgMSA8PCA0IHx8IGJpdG1hc2sgJiAxIDw8IDUpIF90aGlzLmV2ZW50RW1pdHRlci5lbWl0KCdzY3JvbGwnLCBfX2Fzc2lnbih7fSwgc2Nyb2xsU3RhdGUpLCBwcmV2U2Nyb2xsU3RhdGUpO1xuICAgICAgcmV0dXJuIF90aGlzLnNjcm9sbFZhbHVlcztcbiAgICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuXG5cbiAgICBfdGhpcy51cGRhdGVyTmF0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8ganVzdCBmb3IgZnV0dXJlXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgX3RoaXMudXBkYXRlckN1c3RvbSA9IGZ1bmN0aW9uIChiaXRtYXNrLCBzY3JvbGxWYWx1ZXMpIHtcbiAgICAgIHZhciBwcm9wcyA9IF90aGlzLnByb3BzO1xuXG4gICAgICBpZiAoX3RoaXMudHJhY2tZRWxlbWVudCkge1xuICAgICAgICBpZiAoX3RoaXMudGh1bWJZRWxlbWVudCAmJiAoYml0bWFzayAmIE1hdGgudHJ1bmMoMSkgfHwgYml0bWFzayAmIDEgPDwgMiB8fCBiaXRtYXNrICYgMSA8PCA0IHx8IGJpdG1hc2sgJiAxIDw8IDYgfHwgYml0bWFzayAmIDEgPDwgOCkpIHtcbiAgICAgICAgICBpZiAoc2Nyb2xsVmFsdWVzLnNjcm9sbFlQb3NzaWJsZSkge1xuICAgICAgICAgICAgdmFyIHRyYWNrSW5uZXJTaXplID0gZ2V0SW5uZXJIZWlnaHQoX3RoaXMudHJhY2tZRWxlbWVudCk7XG4gICAgICAgICAgICB2YXIgdGh1bWJTaXplID0gY2FsY1RodW1iU2l6ZShzY3JvbGxWYWx1ZXMuc2Nyb2xsSGVpZ2h0LCBzY3JvbGxWYWx1ZXMuY2xpZW50SGVpZ2h0LCB0cmFja0lubmVyU2l6ZSwgcHJvcHMubWluaW1hbFRodW1iWVNpemUgfHwgcHJvcHMubWluaW1hbFRodW1iU2l6ZSwgcHJvcHMubWF4aW1hbFRodW1iWVNpemUgfHwgcHJvcHMubWF4aW1hbFRodW1iU2l6ZSk7XG4gICAgICAgICAgICB2YXIgdGh1bWJPZmZzZXQgPSBjYWxjVGh1bWJPZmZzZXQoc2Nyb2xsVmFsdWVzLnNjcm9sbEhlaWdodCwgc2Nyb2xsVmFsdWVzLmNsaWVudEhlaWdodCwgdHJhY2tJbm5lclNpemUsIHRodW1iU2l6ZSwgc2Nyb2xsVmFsdWVzLnNjcm9sbFRvcCk7XG4gICAgICAgICAgICBfdGhpcy50aHVtYllFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IFwidHJhbnNsYXRlWShcIi5jb25jYXQodGh1bWJPZmZzZXQsIFwicHgpXCIpO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJZRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIlwiLmNvbmNhdCh0aHVtYlNpemUsIFwicHhcIik7XG4gICAgICAgICAgICBfdGhpcy50aHVtYllFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMudGh1bWJZRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgICAgICAgICAgIF90aGlzLnRodW1iWUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICBfdGhpcy50aHVtYllFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy50cmFja1hFbGVtZW50KSB7XG4gICAgICAgIGlmIChfdGhpcy50aHVtYlhFbGVtZW50ICYmIChiaXRtYXNrICYgMSA8PCAxIHx8IGJpdG1hc2sgJiAxIDw8IDMgfHwgYml0bWFzayAmIDEgPDwgNSB8fCBiaXRtYXNrICYgMSA8PCA3IHx8IGJpdG1hc2sgJiAxIDw8IDkgfHwgYml0bWFzayAmIDEgPDwgMTIpKSB7XG4gICAgICAgICAgaWYgKHNjcm9sbFZhbHVlcy5zY3JvbGxYUG9zc2libGUpIHtcbiAgICAgICAgICAgIHZhciB0cmFja0lubmVyU2l6ZSA9IGdldElubmVyV2lkdGgoX3RoaXMudHJhY2tYRWxlbWVudCk7XG4gICAgICAgICAgICB2YXIgdGh1bWJTaXplID0gY2FsY1RodW1iU2l6ZShzY3JvbGxWYWx1ZXMuc2Nyb2xsV2lkdGgsIHNjcm9sbFZhbHVlcy5jbGllbnRXaWR0aCwgdHJhY2tJbm5lclNpemUsIHByb3BzLm1pbmltYWxUaHVtYlhTaXplIHx8IHByb3BzLm1pbmltYWxUaHVtYlNpemUsIHByb3BzLm1heGltYWxUaHVtYlhTaXplIHx8IHByb3BzLm1heGltYWxUaHVtYlNpemUpO1xuICAgICAgICAgICAgdmFyIHRodW1iT2Zmc2V0ID0gY2FsY1RodW1iT2Zmc2V0KHNjcm9sbFZhbHVlcy5zY3JvbGxXaWR0aCwgc2Nyb2xsVmFsdWVzLmNsaWVudFdpZHRoLCB0cmFja0lubmVyU2l6ZSwgdGh1bWJTaXplLCBzY3JvbGxWYWx1ZXMuc2Nyb2xsTGVmdCk7XG5cbiAgICAgICAgICAgIGlmIChfdGhpcy5zdGF0ZS5pc1JUTCAmJiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsKCkpIHtcbiAgICAgICAgICAgICAgdGh1bWJPZmZzZXQgKz0gdHJhY2tJbm5lclNpemUgLSB0aHVtYlNpemU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF90aGlzLnRodW1iWEVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGVYKFwiLmNvbmNhdCh0aHVtYk9mZnNldCwgXCJweClcIik7XG4gICAgICAgICAgICBfdGhpcy50aHVtYlhFbGVtZW50LnN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQodGh1bWJTaXplLCBcInB4XCIpO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJYRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLnRodW1iWEVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgICAgICBfdGhpcy50aHVtYlhFbGVtZW50LnN0eWxlLndpZHRoID0gJzBweCc7XG4gICAgICAgICAgICBfdGhpcy50aHVtYlhFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmSG9sZGVyID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMuaG9sZGVyRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZldyYXBwZXIgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy53cmFwcGVyRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLndyYXBwZXJQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy53cmFwcGVyUHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmU2Nyb2xsZXIgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy5zY3JvbGxlclByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnNjcm9sbGVyUHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmQ29udGVudCA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLmNvbnRlbnRFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMuY29udGVudFByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLmNvbnRlbnRQcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZUcmFja1ggPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy50cmFja1hFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMudHJhY2tYUHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudHJhY2tYUHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmVHJhY2tZID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMudHJhY2tZRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLnRyYWNrWVByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRyYWNrWVByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZlRodW1iWCA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLnRodW1iWEVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy50aHVtYlhQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy50aHVtYlhQcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZUaHVtYlkgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy50aHVtYllFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMudGh1bWJZUHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudGh1bWJZUHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmFja1hDbGljayA9IGZ1bmN0aW9uIChldiwgdmFsdWVzKSB7XG4gICAgICBpZiAoX3RoaXMucHJvcHMudHJhY2tYUHJvcHMub25DbGljaykge1xuICAgICAgICBfdGhpcy5wcm9wcy50cmFja1hQcm9wcy5vbkNsaWNrKGV2LCB2YWx1ZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV90aGlzLnNjcm9sbGVyRWxlbWVudCB8fCAhX3RoaXMudHJhY2tYRWxlbWVudCB8fCAhX3RoaXMudGh1bWJYRWxlbWVudCB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzIHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuXG4gICAgICB2YXIgdGh1bWJTaXplID0gX3RoaXMudGh1bWJYRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIHZhciB0cmFja0lubmVyU2l6ZSA9IGdldElubmVyV2lkdGgoX3RoaXMudHJhY2tYRWxlbWVudCk7XG4gICAgICB2YXIgdGh1bWJPZmZzZXQgPSAoX3RoaXMuc2Nyb2xsVmFsdWVzLmlzUlRMICYmIHNob3VsZFJldmVyc2VSdGxTY3JvbGwoKSA/IHZhbHVlcy5vZmZzZXQgKyB0aHVtYlNpemUgLyAyIC0gdHJhY2tJbm5lclNpemUgOiB2YWx1ZXMub2Zmc2V0IC0gdGh1bWJTaXplIC8gMikgLSAoTnVtYmVyLnBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShfdGhpcy50cmFja1hFbGVtZW50KS5wYWRkaW5nTGVmdCkgfHwgMCk7XG4gICAgICB2YXIgdGFyZ2V0ID0gY2FsY1Njcm9sbEZvclRodW1iT2Zmc2V0KF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxXaWR0aCwgX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudFdpZHRoLCB0cmFja0lubmVyU2l6ZSwgdGh1bWJTaXplLCB0aHVtYk9mZnNldCk7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy50cmFja0NsaWNrQmVoYXZpb3IgPT09IFRSQUNLX0NMSUNLX0JFSEFWSU9SLlNURVApIHtcbiAgICAgICAgdGFyZ2V0ID0gKF90aGlzLnNjcm9sbFZhbHVlcy5pc1JUTCA/IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxMZWZ0ID4gdGFyZ2V0IDogX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbExlZnQgPCB0YXJnZXQpID8gX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbExlZnQgKyBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50V2lkdGggOiBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsTGVmdCAtIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRXaWR0aDtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSB0YXJnZXQ7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRyYWNrWUNsaWNrID0gZnVuY3Rpb24gKGV2LCB2YWx1ZXMpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy50cmFja1lQcm9wcy5vbkNsaWNrKSBfdGhpcy5wcm9wcy50cmFja1lQcm9wcy5vbkNsaWNrKGV2LCB2YWx1ZXMpO1xuXG4gICAgICBpZiAoIV90aGlzLnNjcm9sbGVyRWxlbWVudCB8fCAhX3RoaXMudHJhY2tZRWxlbWVudCB8fCAhX3RoaXMudGh1bWJZRWxlbWVudCB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzIHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsWVBvc3NpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuXG4gICAgICB2YXIgdGh1bWJTaXplID0gX3RoaXMudGh1bWJZRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB2YXIgdGFyZ2V0ID0gY2FsY1Njcm9sbEZvclRodW1iT2Zmc2V0KF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxIZWlnaHQsIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRIZWlnaHQsIGdldElubmVySGVpZ2h0KF90aGlzLnRyYWNrWUVsZW1lbnQpLCB0aHVtYlNpemUsIHZhbHVlcy5vZmZzZXQgLSB0aHVtYlNpemUgLyAyKSAtIChOdW1iZXIucGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKF90aGlzLnRyYWNrWUVsZW1lbnQpLnBhZGRpbmdUb3ApIHx8IDApO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMudHJhY2tDbGlja0JlaGF2aW9yID09PSBUUkFDS19DTElDS19CRUhBVklPUi5KVU1QKSB7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSB0YXJnZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFRvcCA8IHRhcmdldCA/IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxUb3AgKyBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50SGVpZ2h0IDogX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFRvcCAtIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRyYWNrWU1vdXNlV2hlZWwgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgIHZhciBwcm9wcyA9IF90aGlzLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMudHJhY2tZUHJvcHMgJiYgcHJvcHMudHJhY2tZUHJvcHMub25XaGVlbCkge1xuICAgICAgICBwcm9wcy50cmFja1lQcm9wcy5vbldoZWVsKGV2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmRpc2FibGVUcmFja3NNb3VzZXdoZWVsU2Nyb2xsaW5nIHx8IHByb3BzLmRpc2FibGVUcmFja1lNb3VzZXdoZWVsU2Nyb2xsaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuXG4gICAgICBpZiAoIV90aGlzLnNjcm9sbGVyRWxlbWVudCB8fCBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsWUJsb2NrZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zY3JvbGxUb3AgKz0gZXYuZGVsdGFZO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmFja1hNb3VzZVdoZWVsID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICB2YXIgcHJvcHMgPSBfdGhpcy5wcm9wcztcblxuICAgICAgaWYgKHByb3BzLnRyYWNrWFByb3BzICYmIHByb3BzLnRyYWNrWFByb3BzLm9uV2hlZWwpIHtcbiAgICAgICAgcHJvcHMudHJhY2tYUHJvcHMub25XaGVlbChldik7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5kaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZyB8fCBwcm9wcy5kaXNhYmxlVHJhY2tYTW91c2V3aGVlbFNjcm9sbGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcblxuICAgICAgaWYgKCFfdGhpcy5zY3JvbGxlckVsZW1lbnQgfHwgX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFhCbG9ja2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2Nyb2xsTGVmdCArPSBldi5kZWx0YVg7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRodW1iWERyYWcgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBpZiAoIV90aGlzLnRyYWNrWEVsZW1lbnQgfHwgIV90aGlzLnRodW1iWEVsZW1lbnQgfHwgIV90aGlzLnNjcm9sbGVyRWxlbWVudCB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzIHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsWFBvc3NpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuXG4gICAgICB2YXIgdHJhY2tSZWN0ID0gX3RoaXMudHJhY2tYRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgdmFyIHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoX3RoaXMudHJhY2tYRWxlbWVudCk7XG4gICAgICB2YXIgcGFkZGluZ0xlZnQgPSBOdW1iZXIucGFyc2VGbG9hdChzdHlsZXMucGFkZGluZ0xlZnQpIHx8IDA7XG4gICAgICB2YXIgcGFkZGluZ1JpZ2h0ID0gTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdSaWdodCkgfHwgMDtcbiAgICAgIHZhciB0cmFja0lubmVyU2l6ZSA9IHRyYWNrUmVjdC53aWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0O1xuICAgICAgdmFyIHRodW1iU2l6ZSA9IF90aGlzLnRodW1iWEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICB2YXIgb2Zmc2V0ID0gX3RoaXMuc2Nyb2xsVmFsdWVzLmlzUlRMICYmIHNob3VsZFJldmVyc2VSdGxTY3JvbGwoKSA/IGRhdGEueCArIHRodW1iU2l6ZSAtIHRyYWNrSW5uZXJTaXplICsgcGFkZGluZ0xlZnQgOiBkYXRhLmxhc3RYIC0gcGFkZGluZ0xlZnQ7XG4gICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IGNhbGNTY3JvbGxGb3JUaHVtYk9mZnNldChfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsV2lkdGgsIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRXaWR0aCwgdHJhY2tJbm5lclNpemUsIHRodW1iU2l6ZSwgb2Zmc2V0KTtcblxuICAgICAgaWYgKChfYSA9IF90aGlzLnByb3BzLnRodW1iWFByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25EcmFnKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRodW1iWFByb3BzLm9uRHJhZyhkYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVGh1bWJYRHJhZ0VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICB2YXIgX2E7XG5cbiAgICAgIF90aGlzLmhhbmRsZVRodW1iWERyYWcoZGF0YSk7XG5cbiAgICAgIGlmICgoX2EgPSBfdGhpcy5wcm9wcy50aHVtYlhQcm9wcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uRHJhZ0VuZCkge1xuICAgICAgICBfdGhpcy5wcm9wcy50aHVtYlhQcm9wcy5vbkRyYWdFbmQoZGF0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRodW1iWURyYWcgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBpZiAoIV90aGlzLnNjcm9sbGVyRWxlbWVudCB8fCAhX3RoaXMudHJhY2tZRWxlbWVudCB8fCAhX3RoaXMudGh1bWJZRWxlbWVudCB8fCAhX3RoaXMuc2Nyb2xsVmFsdWVzIHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsWVBvc3NpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuXG4gICAgICB2YXIgdHJhY2tSZWN0ID0gX3RoaXMudHJhY2tZRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgdmFyIHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoX3RoaXMudHJhY2tZRWxlbWVudCk7XG4gICAgICB2YXIgcGFkZGluZ1RvcCA9IE51bWJlci5wYXJzZUZsb2F0KHN0eWxlcy5wYWRkaW5nVG9wKSB8fCAwO1xuICAgICAgdmFyIHBhZGRpbmdCb3R0b20gPSBOdW1iZXIucGFyc2VGbG9hdChzdHlsZXMucGFkZGluZ0JvdHRvbSkgfHwgMDtcbiAgICAgIHZhciB0cmFja0lubmVyU2l6ZSA9IHRyYWNrUmVjdC5oZWlnaHQgLSBwYWRkaW5nVG9wIC0gcGFkZGluZ0JvdHRvbTtcbiAgICAgIHZhciB0aHVtYlNpemUgPSBfdGhpcy50aHVtYllFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIHZhciBvZmZzZXQgPSBkYXRhLnkgLSBwYWRkaW5nVG9wO1xuICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IGNhbGNTY3JvbGxGb3JUaHVtYk9mZnNldChfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsSGVpZ2h0LCBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50SGVpZ2h0LCB0cmFja0lubmVyU2l6ZSwgdGh1bWJTaXplLCBvZmZzZXQpO1xuXG4gICAgICBpZiAoKF9hID0gX3RoaXMucHJvcHMudGh1bWJZUHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkRyYWcpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudGh1bWJZUHJvcHMub25EcmFnKGRhdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUaHVtYllEcmFnRW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgX3RoaXMuaGFuZGxlVGh1bWJZRHJhZyhkYXRhKTtcblxuICAgICAgaWYgKChfYSA9IF90aGlzLnByb3BzLnRodW1iWVByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25EcmFnRW5kKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRodW1iWVByb3BzLm9uRHJhZ0VuZChkYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlU2Nyb2xsZXJTY3JvbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uKCk7XG4gICAgfTtcblxuICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLl9zY3JvbGxEZXRlY3Rpb25UTykge1xuICAgICAgICBfdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCgnc2Nyb2xsU3RhcnQnLCBfdGhpcy5nZXRTY3JvbGxTdGF0ZSgpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNCcm93c2VyKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoX3RoaXMuX3Njcm9sbERldGVjdGlvblRPKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvblRPID0gaXNCcm93c2VyID8gd2luZG93LnNldFRpbWVvdXQoX3RoaXMuX3Njcm9sbERldGVjdGlvbkNhbGxiYWNrLCBfdGhpcy5wcm9wcy5zY3JvbGxEZXRlY3Rpb25UaHJlc2hvbGQgfHwgMCkgOiBudWxsO1xuICAgIH07XG5cbiAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uVE8gPSBudWxsO1xuXG4gICAgICBfdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCgnc2Nyb2xsU3RvcCcsIF90aGlzLmdldFNjcm9sbFN0YXRlKCkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHRyYWNrWFZpc2libGU6IGZhbHNlLFxuICAgICAgdHJhY2tZVmlzaWJsZTogZmFsc2UsXG4gICAgICBpc1JUTDogcHJvcHMucnRsXG4gICAgfTtcbiAgICBfdGhpcy5zY3JvbGxWYWx1ZXMgPSBfdGhpcy5nZXRTY3JvbGxTdGF0ZSh0cnVlKTtcbiAgICBfdGhpcy5ldmVudEVtaXR0ZXIgPSBuZXcgRW1pdHRyKDE1KTtcbiAgICBpZiAocHJvcHMub25VcGRhdGUpIF90aGlzLmV2ZW50RW1pdHRlci5vbigndXBkYXRlJywgcHJvcHMub25VcGRhdGUpO1xuICAgIGlmIChwcm9wcy5vblNjcm9sbCkgX3RoaXMuZXZlbnRFbWl0dGVyLm9uKCdzY3JvbGwnLCBwcm9wcy5vblNjcm9sbCk7XG4gICAgaWYgKHByb3BzLm9uU2Nyb2xsU3RhcnQpIF90aGlzLmV2ZW50RW1pdHRlci5vbignc2Nyb2xsU3RhcnQnLCBwcm9wcy5vblNjcm9sbFN0YXJ0KTtcbiAgICBpZiAocHJvcHMub25TY3JvbGxTdG9wKSBfdGhpcy5ldmVudEVtaXR0ZXIub24oJ3Njcm9sbFN0b3AnLCBwcm9wcy5vblNjcm9sbFN0b3ApO1xuICAgIF90aGlzLmlkID0gdXVpZCgpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTY3JvbGxiYXIucHJvdG90eXBlLCBcInNjcm9sbFRvcFwiLCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3NvcnQtY29tcFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodG9wKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gdG9wO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJzY3JvbGxMZWZ0XCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChsZWZ0KSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgICB9XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTY3JvbGxiYXIucHJvdG90eXBlLCBcInNjcm9sbEhlaWdodFwiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTY3JvbGxiYXIucHJvdG90eXBlLCBcInNjcm9sbFdpZHRoXCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJjbGllbnRIZWlnaHRcIiwge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2Nyb2xsYmFyLnByb3RvdHlwZSwgXCJjbGllbnRXaWR0aFwiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3NvcnQtY29tcFxuXG4gIFNjcm9sbGJhci5jYWxjdWxhdGVTdHlsZXMgPSBmdW5jdGlvbiAocHJvcHMsIHN0YXRlLCBzY3JvbGxWYWx1ZXMsIHNjcm9sbGJhcldpZHRoKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuXG4gICAgdmFyIHVzZURlZmF1bHRTdHlsZXMgPSAhcHJvcHMubm9EZWZhdWx0U3R5bGVzO1xuICAgIHJldHVybiB7XG4gICAgICBob2xkZXI6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLmhvbGRlciksIHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgICAgIH0pLCBwcm9wcy5zdHlsZSksXG4gICAgICB3cmFwcGVyOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGUud3JhcHBlciksICFwcm9wcy5kaXNhYmxlVHJhY2tzV2lkdGhDb21wZW5zYXRpb24gJiYgIXByb3BzLmRpc2FibGVUcmFja1lXaWR0aENvbXBlbnNhdGlvbiAmJiAoX2EgPSB7fSwgX2Fbc3RhdGUuaXNSVEwgPyAnbGVmdCcgOiAncmlnaHQnXSA9IHN0YXRlLnRyYWNrWVZpc2libGUgPyAxMCA6IDAsIF9hKSksICFwcm9wcy5kaXNhYmxlVHJhY2tzV2lkdGhDb21wZW5zYXRpb24gJiYgIXByb3BzLmRpc2FibGVUcmFja1hXaWR0aENvbXBlbnNhdGlvbiAmJiB7XG4gICAgICAgIGJvdHRvbTogc3RhdGUudHJhY2tYVmlzaWJsZSA/IDEwIDogMFxuICAgICAgfSkpLCBwcm9wcy53cmFwcGVyUHJvcHMuc3R5bGUpLCB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgICAgIH0pLFxuICAgICAgY29udGVudDogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUuY29udGVudCksIHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWVRvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWFRvSG9sZGVyID8ge1xuICAgICAgICBkaXNwbGF5OiAndGFibGUtY2VsbCdcbiAgICAgIH0gOiB7XG4gICAgICAgIHBhZGRpbmc6IDAuMDUgLy8gbmVlZGVkIHRvIGRpc2FibGUgbWFyZ2luIGNvbGxhcHNpbmcgd2l0aG91dCBmbGV4Ym94ZXMsIG90aGVyIHBvc3NpYmxlIHNvbHV0aW9ucyBoZXJlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTcxODYzNC9ob3ctdG8tZGlzYWJsZS1tYXJnaW4tY29sbGFwc2luZ1xuXG4gICAgICB9KSwgdXNlRGVmYXVsdFN0eWxlcyAmJiAhKHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWVRvSG9sZGVyKSAmJiB7XG4gICAgICAgIG1pbkhlaWdodDogJzEwMCUnXG4gICAgICB9KSwgdXNlRGVmYXVsdFN0eWxlcyAmJiAhKHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWFRvSG9sZGVyKSAmJiB7XG4gICAgICAgIG1pbldpZHRoOiAnMTAwJSdcbiAgICAgIH0pLCBwcm9wcy5jb250ZW50UHJvcHMuc3R5bGUpLFxuICAgICAgc2Nyb2xsZXI6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKChfYiA9IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgcGFkZGluZ0JvdHRvbTogIXNjcm9sbGJhcldpZHRoICYmIHNjcm9sbFZhbHVlcy5zY3JvbGxYUG9zc2libGUgPyBwcm9wcy5mYWxsYmFja1Njcm9sbGJhcldpZHRoIDogdW5kZWZpbmVkXG4gICAgICB9LCBfYltzdGF0ZS5pc1JUTCA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0J10gPSAhc2Nyb2xsYmFyV2lkdGggJiYgc2Nyb2xsVmFsdWVzLnNjcm9sbFlQb3NzaWJsZSA/IHByb3BzLmZhbGxiYWNrU2Nyb2xsYmFyV2lkdGggOiB1bmRlZmluZWQsIF9iKSwgcHJvcHMuc2Nyb2xsZXJQcm9wcy5zdHlsZSksICFpc1VuZGVmKHByb3BzLnJ0bCkgJiYge1xuICAgICAgICBkaXJlY3Rpb246IHByb3BzLnJ0bCA/ICdydGwnIDogJ2x0cidcbiAgICAgIH0pLCBwcm9wcy5tb21lbnR1bSAmJiB7XG4gICAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAndG91Y2gnXG4gICAgICB9KSwgKF9jID0ge1xuICAgICAgICBvdmVyZmxvd1k6IHNjcm9sbFZhbHVlcy5zY3JvbGxZUG9zc2libGUgPyAnc2Nyb2xsJyA6ICdoaWRkZW4nLFxuICAgICAgICBvdmVyZmxvd1g6IHNjcm9sbFZhbHVlcy5zY3JvbGxYUG9zc2libGUgPyAnc2Nyb2xsJyA6ICdoaWRkZW4nLFxuICAgICAgICBtYXJnaW5Cb3R0b206IHNjcm9sbFZhbHVlcy5zY3JvbGxYUG9zc2libGUgPyAtKHNjcm9sbGJhcldpZHRoIHx8IHByb3BzLmZhbGxiYWNrU2Nyb2xsYmFyV2lkdGgpIC0gTnVtYmVyKHNjcm9sbFZhbHVlcy56b29tTGV2ZWwgIT09IDEpIDogdW5kZWZpbmVkXG4gICAgICB9LCBfY1tzdGF0ZS5pc1JUTCA/ICdtYXJnaW5MZWZ0JyA6ICdtYXJnaW5SaWdodCddID0gc2Nyb2xsVmFsdWVzLnNjcm9sbFlQb3NzaWJsZSA/IC0oc2Nyb2xsYmFyV2lkdGggfHwgcHJvcHMuZmFsbGJhY2tTY3JvbGxiYXJXaWR0aCkgLSBOdW1iZXIoc2Nyb2xsVmFsdWVzLnpvb21MZXZlbCAhPT0gMSkgOiB1bmRlZmluZWQsIF9jKSksXG4gICAgICB0cmFja1g6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRyYWNrLmNvbW1vbiksIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudHJhY2sueCksIHByb3BzLnRyYWNrWFByb3BzLnN0eWxlKSwgIXN0YXRlLnRyYWNrWFZpc2libGUgJiYge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgIH0pLFxuICAgICAgdHJhY2tZOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50cmFjay5jb21tb24pLCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRyYWNrLnkpLCB1c2VEZWZhdWx0U3R5bGVzICYmIChfZCA9IHt9LCBfZFtzdGF0ZS5pc1JUTCA/ICdsZWZ0JyA6ICdyaWdodCddID0gMCwgX2QpKSwgcHJvcHMudHJhY2tZUHJvcHMuc3R5bGUpLCAhc3RhdGUudHJhY2tZVmlzaWJsZSAmJiB7XG4gICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgfSksXG4gICAgICB0aHVtYlg6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRodW1iLmNvbW1vbiksIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudGh1bWIueCksIHByb3BzLnRodW1iWFByb3BzLnN0eWxlKSxcbiAgICAgIHRodW1iWTogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudGh1bWIuY29tbW9uKSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50aHVtYi55KSwgcHJvcHMudGh1bWJZUHJvcHMuc3R5bGUpXG4gICAgfTtcbiAgfTtcblxuICBTY3JvbGxiYXIucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzY3JvbGxlciBlbGVtZW50IHdhcyBub3QgY3JlYXRlZC4gUG9zc2libHkgeW91IGhhdmVuJ3QgcHJvdmlkZWQgSFRNTERpdkVsZW1lbnQgdG8gcmVuZGVyZXIncyBgZWxlbWVudFJlZmAgZnVuY3Rpb24uXCIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbnRlbnRFbGVtZW50KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29udGVudCBlbGVtZW50IHdhcyBub3QgY3JlYXRlZC4gUG9zc2libHkgeW91IGhhdmVuJ3QgcHJvdmlkZWQgSFRNTERpdkVsZW1lbnQgdG8gcmVuZGVyZXIncyBgZWxlbWVudFJlZmAgZnVuY3Rpb24uXCIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcblxuICAgIGlmICghcHJvcHMubmF0aXZlICYmICFwcm9wcy5tb2JpbGVOYXRpdmUpIHtcbiAgICAgIC8vIFRvRG86IG1vdmUgbmF0aXZlIHN0YXRlIHRvIHRoZSBzdGF0ZSBzbyBpdCBjYW4gYmUgc3luY2hyb25pemVkXG4gICAgICBpZiAoIXRoaXMuaG9sZGVyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJob2xkZXIgZWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLndyYXBwZXJFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIndyYXBwZXIgZWxlbWVudCB3YXMgbm90IGNyZWF0ZWQuIFBvc3NpYmx5IHlvdSBoYXZlbid0IHByb3ZpZGVkIEhUTUxEaXZFbGVtZW50IHRvIHJlbmRlcmVyJ3MgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uLlwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBMb29wLmFkZFRhcmdldCh0aGlzKTtcblxuICAgIGlmICghaXNVbmRlZihwcm9wcy5zY3JvbGxUb3ApKSB7XG4gICAgICB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSBwcm9wcy5zY3JvbGxUb3A7XG4gICAgfVxuXG4gICAgaWYgKCFpc1VuZGVmKHByb3BzLnNjcm9sbExlZnQpKSB7XG4gICAgICB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0gcHJvcHMuc2Nyb2xsTGVmdDtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcbiAgfTtcblxuICBTY3JvbGxiYXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIExvb3AucmVtb3ZlVGFyZ2V0KHRoaXMpO1xuICB9O1xuXG4gIFNjcm9sbGJhci5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgaWYgKCF0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAocHJvcHMucnRsICE9PSBwcmV2UHJvcHMucnRsICYmIHByb3BzLnJ0bCAhPT0gdGhpcy5zdGF0ZS5pc1JUTCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzUlRMOiBwcm9wcy5ydGxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLmlzUlRMICE9PSBwcmV2U3RhdGUuaXNSVEwpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1VuZGVmKHByb3BzLnNjcm9sbFRvcCkgJiYgcHJvcHMuc2Nyb2xsVG9wICE9PSB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3ApIHtcbiAgICAgIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IHByb3BzLnNjcm9sbFRvcDtcbiAgICB9XG5cbiAgICBpZiAoIWlzVW5kZWYocHJvcHMuc2Nyb2xsTGVmdCkgJiYgcHJvcHMuc2Nyb2xsTGVmdCAhPT0gdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCkge1xuICAgICAgdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IHByb3BzLnNjcm9sbExlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5vblVwZGF0ZSAhPT0gcHJvcHMub25VcGRhdGUpIHtcbiAgICAgIGlmIChwcmV2UHJvcHMub25VcGRhdGUpIHRoaXMuZXZlbnRFbWl0dGVyLm9mZigndXBkYXRlJywgcHJldlByb3BzLm9uVXBkYXRlKTtcbiAgICAgIGlmIChwcm9wcy5vblVwZGF0ZSkgdGhpcy5ldmVudEVtaXR0ZXIub24oJ3VwZGF0ZScsIHByb3BzLm9uVXBkYXRlKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLm9uU2Nyb2xsICE9PSBwcm9wcy5vblNjcm9sbCkge1xuICAgICAgaWYgKHByZXZQcm9wcy5vblNjcm9sbCkgdGhpcy5ldmVudEVtaXR0ZXIub2ZmKCdzY3JvbGwnLCBwcmV2UHJvcHMub25TY3JvbGwpO1xuICAgICAgaWYgKHByb3BzLm9uU2Nyb2xsKSB0aGlzLmV2ZW50RW1pdHRlci5vbignc2Nyb2xsJywgcHJvcHMub25TY3JvbGwpO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMub25TY3JvbGxTdGFydCAhPT0gcHJvcHMub25TY3JvbGxTdGFydCkge1xuICAgICAgaWYgKHByZXZQcm9wcy5vblNjcm9sbFN0YXJ0KSB0aGlzLmV2ZW50RW1pdHRlci5vZmYoJ3Njcm9sbFN0YXJ0JywgcHJldlByb3BzLm9uU2Nyb2xsU3RhcnQpO1xuICAgICAgaWYgKHByb3BzLm9uU2Nyb2xsU3RhcnQpIHRoaXMuZXZlbnRFbWl0dGVyLm9uKCdzY3JvbGxTdGFydCcsIHByb3BzLm9uU2Nyb2xsU3RhcnQpO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMub25TY3JvbGxTdG9wICE9PSBwcm9wcy5vblNjcm9sbFN0b3ApIHtcbiAgICAgIGlmIChwcmV2UHJvcHMub25TY3JvbGxTdG9wKSB0aGlzLmV2ZW50RW1pdHRlci5vZmYoJ3Njcm9sbFN0b3AnLCBwcmV2UHJvcHMub25TY3JvbGxTdG9wKTtcbiAgICAgIGlmIChwcm9wcy5vblNjcm9sbFN0b3ApIHRoaXMuZXZlbnRFbWl0dGVyLm9uKCdzY3JvbGxTdG9wJywgcHJvcHMub25TY3JvbGxTdG9wKTtcbiAgICB9XG4gIH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9zb3J0LWNvbXBcblxuXG4gIFNjcm9sbGJhci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNyZWF0ZUNvbnRleHQgPSBfYS5jcmVhdGVDb250ZXh0LFxuICAgICAgICBydGwgPSBfYS5ydGwsXG4gICAgICAgIG5hdGl2ZSA9IF9hLm5hdGl2ZSxcbiAgICAgICAgbW9iaWxlTmF0aXZlID0gX2EubW9iaWxlTmF0aXZlLFxuICAgICAgICBtb21lbnR1bSA9IF9hLm1vbWVudHVtO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eubm9EZWZhdWx0U3R5bGVzO1xuICAgICAgICB2YXIgZGlzYWJsZVRyYWNrc01vdXNld2hlZWxTY3JvbGxpbmcgPSBfYS5kaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZyxcbiAgICAgICAgZGlzYWJsZVRyYWNrWE1vdXNld2hlZWxTY3JvbGxpbmcgPSBfYS5kaXNhYmxlVHJhY2tYTW91c2V3aGVlbFNjcm9sbGluZyxcbiAgICAgICAgZGlzYWJsZVRyYWNrWU1vdXNld2hlZWxTY3JvbGxpbmcgPSBfYS5kaXNhYmxlVHJhY2tZTW91c2V3aGVlbFNjcm9sbGluZztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmRpc2FibGVUcmFja3NXaWR0aENvbXBlbnNhdGlvbjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmRpc2FibGVUcmFja1hXaWR0aENvbXBlbnNhdGlvbjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmRpc2FibGVUcmFja1lXaWR0aENvbXBlbnNhdGlvbjtcbiAgICAgICAgdmFyIG5vU2Nyb2xsWCA9IF9hLm5vU2Nyb2xsWCxcbiAgICAgICAgbm9TY3JvbGxZID0gX2Eubm9TY3JvbGxZLFxuICAgICAgICBub1Njcm9sbCA9IF9hLm5vU2Nyb2xsLFxuICAgICAgICBwZXJtYW5lbnRUcmFja1ggPSBfYS5wZXJtYW5lbnRUcmFja1gsXG4gICAgICAgIHBlcm1hbmVudFRyYWNrWSA9IF9hLnBlcm1hbmVudFRyYWNrWSxcbiAgICAgICAgcGVybWFuZW50VHJhY2tzID0gX2EucGVybWFuZW50VHJhY2tzLFxuICAgICAgICByZW1vdmVUcmFja3NXaGVuTm90VXNlZCA9IF9hLnJlbW92ZVRyYWNrc1doZW5Ob3RVc2VkLFxuICAgICAgICByZW1vdmVUcmFja1lXaGVuTm90VXNlZCA9IF9hLnJlbW92ZVRyYWNrWVdoZW5Ob3RVc2VkLFxuICAgICAgICByZW1vdmVUcmFja1hXaGVuTm90VXNlZCA9IF9hLnJlbW92ZVRyYWNrWFdoZW5Ob3RVc2VkO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EubWluaW1hbFRodW1iU2l6ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm1heGltYWxUaHVtYlNpemU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5taW5pbWFsVGh1bWJYU2l6ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm1heGltYWxUaHVtYlhTaXplO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EubWluaW1hbFRodW1iWVNpemU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5tYXhpbWFsVGh1bWJZU2l6ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmZhbGxiYWNrU2Nyb2xsYmFyV2lkdGg7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5zY3JvbGxUb3A7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5zY3JvbGxMZWZ0O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EudHJhY2tDbGlja0JlaGF2aW9yO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Euc2Nyb2xsRGV0ZWN0aW9uVGhyZXNob2xkO1xuICAgICAgICB2YXIgcHJvcHNXcmFwcGVyUHJvcHMgPSBfYS53cmFwcGVyUHJvcHMsXG4gICAgICAgIHByb3BzU2Nyb2xsZXJQcm9wcyA9IF9hLnNjcm9sbGVyUHJvcHMsXG4gICAgICAgIHByb3BzQ29udGVudFByb3BzID0gX2EuY29udGVudFByb3BzLFxuICAgICAgICBwcm9wc1RyYWNrWFByb3BzID0gX2EudHJhY2tYUHJvcHMsXG4gICAgICAgIHByb3BzVHJhY2tZUHJvcHMgPSBfYS50cmFja1lQcm9wcyxcbiAgICAgICAgcHJvcHNUaHVtYlhQcm9wcyA9IF9hLnRodW1iWFByb3BzLFxuICAgICAgICBwcm9wc1RodW1iWVByb3BzID0gX2EudGh1bWJZUHJvcHMsXG4gICAgICAgIHByb3BzU2Nyb2xsYmFyV2lkdGggPSBfYS5zY3JvbGxiYXJXaWR0aDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLmVsZW1lbnRSZWY7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vblVwZGF0ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uU2Nyb2xsO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eub25TY3JvbGxTdGFydDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uU2Nyb2xsU3RvcDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EudHJhbnNsYXRlQ29udGVudFNpemVZVG9Ib2xkZXI7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS50cmFuc2xhdGVDb250ZW50U2l6ZVhUb0hvbGRlcjtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzSG9sZGVyUHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNyZWF0ZUNvbnRleHRcIiwgXCJydGxcIiwgXCJuYXRpdmVcIiwgXCJtb2JpbGVOYXRpdmVcIiwgXCJtb21lbnR1bVwiLCBcIm5vRGVmYXVsdFN0eWxlc1wiLCBcImRpc2FibGVUcmFja3NNb3VzZXdoZWVsU2Nyb2xsaW5nXCIsIFwiZGlzYWJsZVRyYWNrWE1vdXNld2hlZWxTY3JvbGxpbmdcIiwgXCJkaXNhYmxlVHJhY2tZTW91c2V3aGVlbFNjcm9sbGluZ1wiLCBcImRpc2FibGVUcmFja3NXaWR0aENvbXBlbnNhdGlvblwiLCBcImRpc2FibGVUcmFja1hXaWR0aENvbXBlbnNhdGlvblwiLCBcImRpc2FibGVUcmFja1lXaWR0aENvbXBlbnNhdGlvblwiLCBcIm5vU2Nyb2xsWFwiLCBcIm5vU2Nyb2xsWVwiLCBcIm5vU2Nyb2xsXCIsIFwicGVybWFuZW50VHJhY2tYXCIsIFwicGVybWFuZW50VHJhY2tZXCIsIFwicGVybWFuZW50VHJhY2tzXCIsIFwicmVtb3ZlVHJhY2tzV2hlbk5vdFVzZWRcIiwgXCJyZW1vdmVUcmFja1lXaGVuTm90VXNlZFwiLCBcInJlbW92ZVRyYWNrWFdoZW5Ob3RVc2VkXCIsIFwibWluaW1hbFRodW1iU2l6ZVwiLCBcIm1heGltYWxUaHVtYlNpemVcIiwgXCJtaW5pbWFsVGh1bWJYU2l6ZVwiLCBcIm1heGltYWxUaHVtYlhTaXplXCIsIFwibWluaW1hbFRodW1iWVNpemVcIiwgXCJtYXhpbWFsVGh1bWJZU2l6ZVwiLCBcImZhbGxiYWNrU2Nyb2xsYmFyV2lkdGhcIiwgXCJzY3JvbGxUb3BcIiwgXCJzY3JvbGxMZWZ0XCIsIFwidHJhY2tDbGlja0JlaGF2aW9yXCIsIFwic2Nyb2xsRGV0ZWN0aW9uVGhyZXNob2xkXCIsIFwid3JhcHBlclByb3BzXCIsIFwic2Nyb2xsZXJQcm9wc1wiLCBcImNvbnRlbnRQcm9wc1wiLCBcInRyYWNrWFByb3BzXCIsIFwidHJhY2tZUHJvcHNcIiwgXCJ0aHVtYlhQcm9wc1wiLCBcInRodW1iWVByb3BzXCIsIFwic2Nyb2xsYmFyV2lkdGhcIiwgXCJlbGVtZW50UmVmXCIsIFwib25VcGRhdGVcIiwgXCJvblNjcm9sbFwiLCBcIm9uU2Nyb2xsU3RhcnRcIiwgXCJvblNjcm9sbFN0b3BcIiwgXCJ0cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlclwiLCBcInRyYW5zbGF0ZUNvbnRlbnRTaXplWVRvSG9sZGVyXCIsIFwidHJhbnNsYXRlQ29udGVudFNpemVYVG9Ib2xkZXJcIiwgXCJjaGlsZHJlblwiXSk7XG5cbiAgICB2YXIgc2Nyb2xsYmFyV2lkdGggPSAhaXNVbmRlZihwcm9wc1Njcm9sbGJhcldpZHRoKSA/IHByb3BzU2Nyb2xsYmFyV2lkdGggOiBnZXRTY3JvbGxiYXJXaWR0aCgpIHx8IDA7XG5cbiAgICBpZiAobmF0aXZlIHx8ICFzY3JvbGxiYXJXaWR0aCAmJiBtb2JpbGVOYXRpdmUpIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZkhvbGRlcihudWxsKTtcbiAgICAgIHRoaXMuZWxlbWVudFJlZldyYXBwZXIobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUcmFja1gobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUcmFja1kobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUaHVtYlgobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUaHVtYlkobnVsbCk7XG5cbiAgICAgIHZhciBjb250ZW50UHJvcHNfMSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc0NvbnRlbnRQcm9wcyksIHtcbiAgICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1Db250ZW50JyxcbiAgICAgICAgY2xhc3NOYW1lOiBjbmIoJ1Njcm9sbGJhcnNDdXN0b20tQ29udGVudCcsIHByb3BzQ29udGVudFByb3BzLmNsYXNzTmFtZSksXG4gICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgICAgfSk7XG5cbiAgICAgIHZhciBzY3JvbGxlclByb3BzXzEgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNIb2xkZXJQcm9wcyksIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbmIoJ1Njcm9sbGJhcnNDdXN0b20gbmF0aXZlJywgdGhpcy5zdGF0ZS50cmFja1lWaXNpYmxlICYmICd0cmFja1lWaXNpYmxlJywgdGhpcy5zdGF0ZS50cmFja1hWaXNpYmxlICYmICd0cmFja1hWaXNpYmxlJywgdGhpcy5zdGF0ZS5pc1JUTCAmJiAncnRsJywgcHJvcHNIb2xkZXJQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzSG9sZGVyUHJvcHMuc3R5bGUpLCAhaXNVbmRlZihydGwpICYmIHtcbiAgICAgICAgICBkaXJlY3Rpb246IHJ0bCA/ICdydGwnIDogJ2x0cidcbiAgICAgICAgfSksIG1vbWVudHVtICYmIHtcbiAgICAgICAgICBXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogJ3RvdWNoJ1xuICAgICAgICB9KSwge1xuICAgICAgICAgIG92ZXJmbG93WDogbm9TY3JvbGwgfHwgbm9TY3JvbGxYID8gJ2hpZGRlbicgOiBwZXJtYW5lbnRUcmFja3MgfHwgcGVybWFuZW50VHJhY2tYID8gJ3Njcm9sbCcgOiAnYXV0bycsXG4gICAgICAgICAgb3ZlcmZsb3dZOiBub1Njcm9sbCB8fCBub1Njcm9sbFkgPyAnaGlkZGVuJyA6IHBlcm1hbmVudFRyYWNrcyB8fCBwZXJtYW5lbnRUcmFja1kgPyAnc2Nyb2xsJyA6ICdhdXRvJ1xuICAgICAgICB9KSxcbiAgICAgICAgb25TY3JvbGw6IHRoaXMuaGFuZGxlU2Nyb2xsZXJTY3JvbGwsXG4gICAgICAgIGNoaWxkcmVuOiByZW5kZXJEaXZXaXRoUmVuZGVyZXIoY29udGVudFByb3BzXzEsIHRoaXMuZWxlbWVudFJlZkNvbnRlbnQpLFxuICAgICAgICByZW5kZXJlcjogcHJvcHNTY3JvbGxlclByb3BzLnJlbmRlcmVyLFxuICAgICAgICBlbGVtZW50UmVmOiBwcm9wc1Njcm9sbGVyUHJvcHMuZWxlbWVudFJlZlxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZW5kZXJEaXZXaXRoUmVuZGVyZXIoc2Nyb2xsZXJQcm9wc18xLCB0aGlzLmVsZW1lbnRSZWZTY3JvbGxlcik7XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlcyA9IFNjcm9sbGJhci5jYWxjdWxhdGVTdHlsZXModGhpcy5wcm9wcywgdGhpcy5zdGF0ZSwgdGhpcy5zY3JvbGxWYWx1ZXMsIHNjcm9sbGJhcldpZHRoKTtcbiAgICB2YXIgaG9sZGVyQ2hpbGRyZW4gPSBbXTtcblxuICAgIHZhciBjb250ZW50UHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNDb250ZW50UHJvcHMpLCB7XG4gICAgICBrZXk6ICdTY3JvbGxiYXJzQ3VzdG9tLUNvbnRlbnQnLFxuICAgICAgY2xhc3NOYW1lOiBjbmIoJ1Njcm9sbGJhcnNDdXN0b20tQ29udGVudCcsIHByb3BzQ29udGVudFByb3BzLmNsYXNzTmFtZSksXG4gICAgICBzdHlsZTogc3R5bGVzLmNvbnRlbnQsXG4gICAgICBjaGlsZHJlbjogY3JlYXRlQ29udGV4dCA/IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9qc3gtbm8tY29uc3RydWN0ZWQtY29udGV4dC12YWx1ZXNcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsYmFyQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHBhcmVudFNjcm9sbGJhcjogdGhpc1xuICAgICAgICB9XG4gICAgICB9LCBjaGlsZHJlbikgOiBjaGlsZHJlblxuICAgIH0pO1xuXG4gICAgdmFyIHNjcm9sbGVyUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNTY3JvbGxlclByb3BzKSwge1xuICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1TY3JvbGxlcicsXG4gICAgICBjbGFzc05hbWU6IGNuYignU2Nyb2xsYmFyc0N1c3RvbS1TY3JvbGxlcicsIHByb3BzU2Nyb2xsZXJQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHN0eWxlcy5zY3JvbGxlcixcbiAgICAgIGNoaWxkcmVuOiByZW5kZXJEaXZXaXRoUmVuZGVyZXIoY29udGVudFByb3BzLCB0aGlzLmVsZW1lbnRSZWZDb250ZW50KSxcbiAgICAgIG9uU2Nyb2xsOiB0aGlzLmhhbmRsZVNjcm9sbGVyU2Nyb2xsXG4gICAgfSk7XG5cbiAgICB2YXIgd3JhcHBlclByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzV3JhcHBlclByb3BzKSwge1xuICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1XcmFwcGVyJyxcbiAgICAgIGNsYXNzTmFtZTogY25iKCdTY3JvbGxiYXJzQ3VzdG9tLVdyYXBwZXInLCBwcm9wc1dyYXBwZXJQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHN0eWxlcy53cmFwcGVyLFxuICAgICAgY2hpbGRyZW46IHJlbmRlckRpdldpdGhSZW5kZXJlcihzY3JvbGxlclByb3BzLCB0aGlzLmVsZW1lbnRSZWZTY3JvbGxlcilcbiAgICB9KTtcblxuICAgIGhvbGRlckNoaWxkcmVuLnB1c2gocmVuZGVyRGl2V2l0aFJlbmRlcmVyKHdyYXBwZXJQcm9wcywgdGhpcy5lbGVtZW50UmVmV3JhcHBlcikpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUudHJhY2tZVmlzaWJsZSB8fCAhcmVtb3ZlVHJhY2tzV2hlbk5vdFVzZWQgJiYgIXJlbW92ZVRyYWNrWVdoZW5Ob3RVc2VkKSB7XG4gICAgICB2YXIgdGh1bWJZUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNUaHVtYllQcm9wcyksIHtcbiAgICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1UaHVtYlknLFxuICAgICAgICBzdHlsZTogc3R5bGVzLnRodW1iWSxcbiAgICAgICAgZWxlbWVudFJlZjogdGhpcy5lbGVtZW50UmVmVGh1bWJZLFxuICAgICAgICBvbkRyYWc6IHRoaXMuaGFuZGxlVGh1bWJZRHJhZyxcbiAgICAgICAgb25EcmFnRW5kOiB0aGlzLmhhbmRsZVRodW1iWURyYWdFbmQsXG4gICAgICAgIGF4aXM6IEFYSVNfRElSRUNUSU9OLllcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgdHJhY2tZUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNUcmFja1lQcm9wcyksIHtcbiAgICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1knLFxuICAgICAgICBzdHlsZTogc3R5bGVzLnRyYWNrWSxcbiAgICAgICAgZWxlbWVudFJlZjogdGhpcy5lbGVtZW50UmVmVHJhY2tZLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZVRyYWNrWUNsaWNrXG4gICAgICB9KSwgKGRpc2FibGVUcmFja3NNb3VzZXdoZWVsU2Nyb2xsaW5nIHx8IGRpc2FibGVUcmFja1lNb3VzZXdoZWVsU2Nyb2xsaW5nKSAmJiB7XG4gICAgICAgIG9uV2hlZWw6IHRoaXMuaGFuZGxlVHJhY2tZTW91c2VXaGVlbFxuICAgICAgfSksIHtcbiAgICAgICAgYXhpczogQVhJU19ESVJFQ1RJT04uWVxuICAgICAgfSk7XG5cbiAgICAgIHRyYWNrWVByb3BzLmNoaWxkcmVuID0gUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxiYXJUaHVtYiwgX19hc3NpZ24oe30sIHRodW1iWVByb3BzKSk7XG4gICAgICBob2xkZXJDaGlsZHJlbi5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsYmFyVHJhY2ssIF9fYXNzaWduKHt9LCB0cmFja1lQcm9wcykpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50UmVmVHJhY2tZKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmVGh1bWJZKG51bGwpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLnRyYWNrWFZpc2libGUgfHwgIXJlbW92ZVRyYWNrc1doZW5Ob3RVc2VkICYmICFyZW1vdmVUcmFja1hXaGVuTm90VXNlZCkge1xuICAgICAgdmFyIHRodW1iWFByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzVGh1bWJYUHJvcHMpLCB7XG4gICAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tVGh1bWJYJyxcbiAgICAgICAgc3R5bGU6IHN0eWxlcy50aHVtYlgsXG4gICAgICAgIGVsZW1lbnRSZWY6IHRoaXMuZWxlbWVudFJlZlRodW1iWCxcbiAgICAgICAgb25EcmFnOiB0aGlzLmhhbmRsZVRodW1iWERyYWcsXG4gICAgICAgIG9uRHJhZ0VuZDogdGhpcy5oYW5kbGVUaHVtYlhEcmFnRW5kLFxuICAgICAgICBheGlzOiBBWElTX0RJUkVDVElPTi5YXG4gICAgICB9KTtcblxuICAgICAgdmFyIHRyYWNrWFByb3BzID0gX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzVHJhY2tYUHJvcHMpLCB7XG4gICAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tVHJhY2tYJyxcbiAgICAgICAgc3R5bGU6IHN0eWxlcy50cmFja1gsXG4gICAgICAgIGVsZW1lbnRSZWY6IHRoaXMuZWxlbWVudFJlZlRyYWNrWCxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVUcmFja1hDbGlja1xuICAgICAgfSksIChkaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZyB8fCBkaXNhYmxlVHJhY2tYTW91c2V3aGVlbFNjcm9sbGluZykgJiYge1xuICAgICAgICBvbldoZWVsOiB0aGlzLmhhbmRsZVRyYWNrWE1vdXNlV2hlZWxcbiAgICAgIH0pLCB7XG4gICAgICAgIGF4aXM6IEFYSVNfRElSRUNUSU9OLlhcbiAgICAgIH0pO1xuXG4gICAgICB0cmFja1hQcm9wcy5jaGlsZHJlbiA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsYmFyVGh1bWIsIF9fYXNzaWduKHt9LCB0aHVtYlhQcm9wcykpO1xuICAgICAgaG9sZGVyQ2hpbGRyZW4ucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGJhclRyYWNrLCBfX2Fzc2lnbih7fSwgdHJhY2tYUHJvcHMpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRyYWNrWChudWxsKTtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRodW1iWChudWxsKTtcbiAgICB9XG5cbiAgICB2YXIgaG9sZGVyUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNIb2xkZXJQcm9wcyksIHtcbiAgICAgIGNsYXNzTmFtZTogY25iKCdTY3JvbGxiYXJzQ3VzdG9tJywgdGhpcy5zdGF0ZS50cmFja1lWaXNpYmxlICYmICd0cmFja1lWaXNpYmxlJywgdGhpcy5zdGF0ZS50cmFja1hWaXNpYmxlICYmICd0cmFja1hWaXNpYmxlJywgdGhpcy5zdGF0ZS5pc1JUTCAmJiAncnRsJywgcHJvcHNIb2xkZXJQcm9wcy5jbGFzc05hbWUpLFxuICAgICAgc3R5bGU6IHN0eWxlcy5ob2xkZXIsXG4gICAgICBjaGlsZHJlbjogaG9sZGVyQ2hpbGRyZW5cbiAgICB9KTtcblxuICAgIHJldHVybiByZW5kZXJEaXZXaXRoUmVuZGVyZXIoaG9sZGVyUHJvcHMsIHRoaXMuZWxlbWVudFJlZkhvbGRlcik7XG4gIH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9zdGF0aWMtcHJvcGVydHktcGxhY2VtZW50XG5cblxuICBTY3JvbGxiYXIuY29udGV4dFR5cGUgPSBTY3JvbGxiYXJDb250ZXh0OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvc3RhdGljLXByb3BlcnR5LXBsYWNlbWVudFxuXG4gIFNjcm9sbGJhci5kZWZhdWx0UHJvcHMgPSB7XG4gICAgbW9tZW50dW06IHRydWUsXG4gICAgbWluaW1hbFRodW1iU2l6ZTogMzAsXG4gICAgZmFsbGJhY2tTY3JvbGxiYXJXaWR0aDogMjAsXG4gICAgdHJhY2tDbGlja0JlaGF2aW9yOiBUUkFDS19DTElDS19CRUhBVklPUi5KVU1QLFxuICAgIHNjcm9sbERldGVjdGlvblRocmVzaG9sZDogMTAwLFxuICAgIHdyYXBwZXJQcm9wczoge30sXG4gICAgc2Nyb2xsZXJQcm9wczoge30sXG4gICAgY29udGVudFByb3BzOiB7fSxcbiAgICB0cmFja1hQcm9wczoge30sXG4gICAgdHJhY2tZUHJvcHM6IHt9LFxuICAgIHRodW1iWFByb3BzOiB7fSxcbiAgICB0aHVtYllQcm9wczoge31cbiAgfTtcbiAgcmV0dXJuIFNjcm9sbGJhcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0IHsgU2Nyb2xsYmFyLCBTY3JvbGxiYXJDb250ZXh0LCBTY3JvbGxiYXIgYXMgZGVmYXVsdCB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBSZWFjdF9fZGVmYXVsdCA9IF9pbnRlcm9wRGVmYXVsdChSZWFjdCk7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuZnVuY3Rpb24gd2l0aFNpZGVFZmZlY3QocmVkdWNlUHJvcHNUb1N0YXRlLCBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50LCBtYXBTdGF0ZU9uU2VydmVyKSB7XG4gIGlmICh0eXBlb2YgcmVkdWNlUHJvcHNUb1N0YXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZWR1Y2VQcm9wc1RvU3RhdGUgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtYXBTdGF0ZU9uU2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbWFwU3RhdGVPblNlcnZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbWFwU3RhdGVPblNlcnZlciB0byBlaXRoZXIgYmUgdW5kZWZpbmVkIG9yIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgcmV0dXJuIFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIGlmICh0eXBlb2YgV3JhcHBlZENvbXBvbmVudCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBXcmFwcGVkQ29tcG9uZW50IHRvIGJlIGEgUmVhY3QgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIHZhciBtb3VudGVkSW5zdGFuY2VzID0gW107XG4gICAgdmFyIHN0YXRlO1xuXG4gICAgZnVuY3Rpb24gZW1pdENoYW5nZSgpIHtcbiAgICAgIHN0YXRlID0gcmVkdWNlUHJvcHNUb1N0YXRlKG1vdW50ZWRJbnN0YW5jZXMubWFwKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UucHJvcHM7XG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChTaWRlRWZmZWN0LmNhblVzZURPTSkge1xuICAgICAgICBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50KHN0YXRlKTtcbiAgICAgIH0gZWxzZSBpZiAobWFwU3RhdGVPblNlcnZlcikge1xuICAgICAgICBzdGF0ZSA9IG1hcFN0YXRlT25TZXJ2ZXIoc3RhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBTaWRlRWZmZWN0ID1cbiAgICAvKiNfX1BVUkVfXyovXG4gICAgZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gICAgICBfaW5oZXJpdHNMb29zZShTaWRlRWZmZWN0LCBfUHVyZUNvbXBvbmVudCk7XG5cbiAgICAgIGZ1bmN0aW9uIFNpZGVFZmZlY3QoKSB7XG4gICAgICAgIHJldHVybiBfUHVyZUNvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyeSB0byB1c2UgZGlzcGxheU5hbWUgb2Ygd3JhcHBlZCBjb21wb25lbnRcbiAgICAgIC8vIEV4cG9zZSBjYW5Vc2VET00gc28gdGVzdHMgY2FuIG1vbmtleXBhdGNoIGl0XG4gICAgICBTaWRlRWZmZWN0LnBlZWsgPSBmdW5jdGlvbiBwZWVrKCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9O1xuXG4gICAgICBTaWRlRWZmZWN0LnJld2luZCA9IGZ1bmN0aW9uIHJld2luZCgpIHtcbiAgICAgICAgaWYgKFNpZGVFZmZlY3QuY2FuVXNlRE9NKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbWF5IG9ubHkgY2FsbCByZXdpbmQoKSBvbiB0aGUgc2VydmVyLiBDYWxsIHBlZWsoKSB0byByZWFkIHRoZSBjdXJyZW50IHN0YXRlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlY29yZGVkU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIG1vdW50ZWRJbnN0YW5jZXMgPSBbXTtcbiAgICAgICAgcmV0dXJuIHJlY29yZGVkU3RhdGU7XG4gICAgICB9O1xuXG4gICAgICB2YXIgX3Byb3RvID0gU2lkZUVmZmVjdC5wcm90b3R5cGU7XG5cbiAgICAgIF9wcm90by5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID0gZnVuY3Rpb24gVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgICAgbW91bnRlZEluc3RhbmNlcy5wdXNoKHRoaXMpO1xuICAgICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gbW91bnRlZEluc3RhbmNlcy5pbmRleE9mKHRoaXMpO1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIHRoaXMucHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFNpZGVFZmZlY3Q7XG4gICAgfShSZWFjdC5QdXJlQ29tcG9uZW50KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShTaWRlRWZmZWN0LCBcImRpc3BsYXlOYW1lXCIsIFwiU2lkZUVmZmVjdChcIiArIGdldERpc3BsYXlOYW1lKFdyYXBwZWRDb21wb25lbnQpICsgXCIpXCIpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KFNpZGVFZmZlY3QsIFwiY2FuVXNlRE9NXCIsIGNhblVzZURPTSk7XG5cbiAgICByZXR1cm4gU2lkZUVmZmVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3aXRoU2lkZUVmZmVjdDtcbiIsIiFmdW5jdGlvbihlLHQpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQocmVxdWlyZShcInByb3AtdHlwZXNcIikscmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJzaWduYXR1cmVfcGFkXCIpLHJlcXVpcmUoXCJ0cmltLWNhbnZhc1wiKSk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJwcm9wLXR5cGVzXCIsXCJyZWFjdFwiLFwic2lnbmF0dXJlX3BhZFwiLFwidHJpbS1jYW52YXNcIl0sdCk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5TaWduYXR1cmVDYW52YXM9dChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSxyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcInNpZ25hdHVyZV9wYWRcIikscmVxdWlyZShcInRyaW0tY2FudmFzXCIpKTplLlNpZ25hdHVyZUNhbnZhcz10KGVbXCJwcm9wLXR5cGVzXCJdLGUucmVhY3QsZS5zaWduYXR1cmVfcGFkLGVbXCJ0cmltLWNhbnZhc1wiXSl9KHRoaXMsZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocil7aWYobltyXSlyZXR1cm4gbltyXS5leHBvcnRzO3ZhciBhPW5bcl09e2V4cG9ydHM6e30saWQ6cixsb2FkZWQ6ITF9O3JldHVybiBlW3JdLmNhbGwoYS5leHBvcnRzLGEsYS5leHBvcnRzLHQpLGEubG9hZGVkPSEwLGEuZXhwb3J0c312YXIgbj17fTtyZXR1cm4gdC5tPWUsdC5jPW4sdC5wPVwiXCIsdCgwKX0oW2Z1bmN0aW9uKGUsdCxuKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX1mdW5jdGlvbiBhKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpdC5pbmRleE9mKHIpPj0wfHxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmKG5bcl09ZVtyXSk7cmV0dXJuIG59ZnVuY3Rpb24gbyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9ZnVuY3Rpb24gaShlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4hdHx8XCJvYmplY3RcIiE9dHlwZW9mIHQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIHQ/ZTp0fWZ1bmN0aW9uIHUoZSx0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2YgdCk7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksdCYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSx0KTplLl9fcHJvdG9fXz10KX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gbiYmZSh0LnByb3RvdHlwZSxuKSxyJiZlKHQsciksdH19KCksZj1uKDEpLHA9cihmKSxsPW4oMiksZD1yKGwpLHY9bigzKSxoPXIodiksXz1uKDQpLGc9cihfKSxtPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgZSxuLHIsdTtvKHRoaXMsdCk7Zm9yKHZhciBzPWFyZ3VtZW50cy5sZW5ndGgsYz1BcnJheShzKSxmPTA7ZjxzO2YrKyljW2ZdPWFyZ3VtZW50c1tmXTtyZXR1cm4gbj1yPWkodGhpcywoZT10Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKS5jYWxsLmFwcGx5KGUsW3RoaXNdLmNvbmNhdChjKSkpLHIuX3NpZ1BhZD1udWxsLHIuX2V4Y2x1ZGVPdXJQcm9wcz1mdW5jdGlvbigpe3ZhciBlPXIucHJvcHMsdD0oZS5jYW52YXNQcm9wcyxlLmNsZWFyT25SZXNpemUsYShlLFtcImNhbnZhc1Byb3BzXCIsXCJjbGVhck9uUmVzaXplXCJdKSk7cmV0dXJuIHR9LHIuZ2V0Q2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuIHIuX2NhbnZhc30sci5nZXRUcmltbWVkQ2FudmFzPWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtyZXR1cm4gZS53aWR0aD1yLl9jYW52YXMud2lkdGgsZS5oZWlnaHQ9ci5fY2FudmFzLmhlaWdodCxlLmdldENvbnRleHQoXCIyZFwiKS5kcmF3SW1hZ2Uoci5fY2FudmFzLDAsMCksKDAsZy5kZWZhdWx0KShlKX0sci5nZXRTaWduYXR1cmVQYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gci5fc2lnUGFkfSxyLl9jaGVja0NsZWFyT25SZXNpemU9ZnVuY3Rpb24oKXtyLnByb3BzLmNsZWFyT25SZXNpemUmJnIuX3Jlc2l6ZUNhbnZhcygpfSxyLl9yZXNpemVDYW52YXM9ZnVuY3Rpb24oKXt2YXIgZT1yLnByb3BzLmNhbnZhc1Byb3BzfHx7fSx0PWUud2lkdGgsbj1lLmhlaWdodDtpZighdHx8IW4pe3ZhciBhPXIuX2NhbnZhcyxvPU1hdGgubWF4KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxLDEpO3R8fChhLndpZHRoPWEub2Zmc2V0V2lkdGgqbyksbnx8KGEuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0Km8pLGEuZ2V0Q29udGV4dChcIjJkXCIpLnNjYWxlKG8sbyksci5jbGVhcigpfX0sci5vbj1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHIuX2NoZWNrQ2xlYXJPblJlc2l6ZSksci5fc2lnUGFkLm9uKCl9LHIub2ZmPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsci5fY2hlY2tDbGVhck9uUmVzaXplKSxyLl9zaWdQYWQub2ZmKCl9LHIuY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gci5fc2lnUGFkLmNsZWFyKCl9LHIuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiByLl9zaWdQYWQuaXNFbXB0eSgpfSxyLmZyb21EYXRhVVJMPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuX3NpZ1BhZC5mcm9tRGF0YVVSTChlLHQpfSxyLnRvRGF0YVVSTD1mdW5jdGlvbihlLHQpe3JldHVybiByLl9zaWdQYWQudG9EYXRhVVJMKGUsdCl9LHIuZnJvbURhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuX3NpZ1BhZC5mcm9tRGF0YShlKX0sci50b0RhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gci5fc2lnUGFkLnRvRGF0YSgpfSx1PW4saShyLHUpfXJldHVybiB1KHQsZSksYyh0LFt7a2V5OlwiY29tcG9uZW50RGlkTW91bnRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX3NpZ1BhZD1uZXcgaC5kZWZhdWx0KHRoaXMuX2NhbnZhcyx0aGlzLl9leGNsdWRlT3VyUHJvcHMoKSksdGhpcy5fcmVzaXplQ2FudmFzKCksdGhpcy5vbigpfX0se2tleTpcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLm9mZigpfX0se2tleTpcImNvbXBvbmVudERpZFVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7T2JqZWN0LmFzc2lnbih0aGlzLl9zaWdQYWQsdGhpcy5fZXhjbHVkZU91clByb3BzKCkpfX0se2tleTpcInJlbmRlclwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMucHJvcHMuY2FudmFzUHJvcHM7cmV0dXJuIGQuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIscyh7cmVmOmZ1bmN0aW9uKHQpe2UuX2NhbnZhcz10fX0sdCkpfX1dKSx0fShsLkNvbXBvbmVudCk7bS5wcm9wVHlwZXM9e3ZlbG9jaXR5RmlsdGVyV2VpZ2h0OnAuZGVmYXVsdC5udW1iZXIsbWluV2lkdGg6cC5kZWZhdWx0Lm51bWJlcixtYXhXaWR0aDpwLmRlZmF1bHQubnVtYmVyLG1pbkRpc3RhbmNlOnAuZGVmYXVsdC5udW1iZXIsZG90U2l6ZTpwLmRlZmF1bHQub25lT2ZUeXBlKFtwLmRlZmF1bHQubnVtYmVyLHAuZGVmYXVsdC5mdW5jXSkscGVuQ29sb3I6cC5kZWZhdWx0LnN0cmluZyx0aHJvdHRsZTpwLmRlZmF1bHQubnVtYmVyLG9uRW5kOnAuZGVmYXVsdC5mdW5jLG9uQmVnaW46cC5kZWZhdWx0LmZ1bmMsY2FudmFzUHJvcHM6cC5kZWZhdWx0Lm9iamVjdCxjbGVhck9uUmVzaXplOnAuZGVmYXVsdC5ib29sfSxtLmRlZmF1bHRQcm9wcz17Y2xlYXJPblJlc2l6ZTohMH0sdC5kZWZhdWx0PW19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWV9LGZ1bmN0aW9uKGUsbil7ZS5leHBvcnRzPXR9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPW59LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXJ9XSl9KTsiLCJpbXBvcnQgeyBzdHlsZUhvb2tTaW5nbGV0b24gfSBmcm9tICcuL2hvb2snO1xuLyoqXG4gKiBjcmVhdGUgYSBDb21wb25lbnQgdG8gYWRkIHN0eWxlcyBvbiBkZW1hbmRcbiAqIC0gc3R5bGVzIGFyZSBhZGRlZCB3aGVuIGZpcnN0IGluc3RhbmNlIGlzIG1vdW50ZWRcbiAqIC0gc3R5bGVzIGFyZSByZW1vdmVkIHdoZW4gdGhlIGxhc3QgaW5zdGFuY2UgaXMgdW5tb3VudGVkXG4gKiAtIGNoYW5naW5nIHN0eWxlcyBpbiBydW50aW1lIGRvZXMgbm90aGluZyB1bmxlc3MgZHluYW1pYyBpcyBzZXQuIEJ1dCB3aXRoIG11bHRpcGxlIGNvbXBvbmVudHMgdGhhdCBjYW4gbGVhZCB0byB0aGUgdW5kZWZpbmVkIGJlaGF2aW9yXG4gKi9cbmV4cG9ydCB2YXIgc3R5bGVTaW5nbGV0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHVzZVN0eWxlID0gc3R5bGVIb29rU2luZ2xldG9uKCk7XG4gICAgdmFyIFNoZWV0ID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBzdHlsZXMgPSBfYS5zdHlsZXMsIGR5bmFtaWMgPSBfYS5keW5hbWljO1xuICAgICAgICB1c2VTdHlsZShzdHlsZXMsIGR5bmFtaWMpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBTaGVldDtcbn07XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzdHlsZXNoZWV0U2luZ2xldG9uIH0gZnJvbSAnLi9zaW5nbGV0b24nO1xuLyoqXG4gKiBjcmVhdGVzIGEgaG9vayB0byBjb250cm9sIHN0eWxlIHNpbmdsZXRvblxuICogQHNlZSB7QGxpbmsgc3R5bGVTaW5nbGV0b259IGZvciBhIHNhZmVyIGNvbXBvbmVudCB2ZXJzaW9uXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB1c2VTdHlsZSA9IHN0eWxlSG9va1NpbmdsZXRvbigpO1xuICogLy8vXG4gKiB1c2VTdHlsZSgnYm9keSB7IG92ZXJmbG93OiBoaWRkZW59Jyk7XG4gKi9cbmV4cG9ydCB2YXIgc3R5bGVIb29rU2luZ2xldG9uID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzaGVldCA9IHN0eWxlc2hlZXRTaW5nbGV0b24oKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0eWxlcywgaXNEeW5hbWljKSB7XG4gICAgICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzaGVldC5hZGQoc3R5bGVzKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2hlZXQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCBbc3R5bGVzICYmIGlzRHluYW1pY10pO1xuICAgIH07XG59O1xuIiwiZXhwb3J0IHsgc3R5bGVTaW5nbGV0b24gfSBmcm9tICcuL2NvbXBvbmVudCc7XG5leHBvcnQgeyBzdHlsZXNoZWV0U2luZ2xldG9uIH0gZnJvbSAnLi9zaW5nbGV0b24nO1xuZXhwb3J0IHsgc3R5bGVIb29rU2luZ2xldG9uIH0gZnJvbSAnLi9ob29rJztcbiIsImltcG9ydCB7IGdldE5vbmNlIH0gZnJvbSAnZ2V0LW5vbmNlJztcbmZ1bmN0aW9uIG1ha2VTdHlsZVRhZygpIHtcbiAgICBpZiAoIWRvY3VtZW50KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB2YXIgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICB0YWcudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgdmFyIG5vbmNlID0gZ2V0Tm9uY2UoKTtcbiAgICBpZiAobm9uY2UpIHtcbiAgICAgICAgdGFnLnNldEF0dHJpYnV0ZSgnbm9uY2UnLCBub25jZSk7XG4gICAgfVxuICAgIHJldHVybiB0YWc7XG59XG5mdW5jdGlvbiBpbmplY3RTdHlsZXModGFnLCBjc3MpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHRhZy5zdHlsZVNoZWV0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGFnLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnNlcnRTdHlsZVRhZyh0YWcpIHtcbiAgICB2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcbiAgICBoZWFkLmFwcGVuZENoaWxkKHRhZyk7XG59XG5leHBvcnQgdmFyIHN0eWxlc2hlZXRTaW5nbGV0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgIHZhciBzdHlsZXNoZWV0ID0gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBhZGQ6IGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgICAgICAgaWYgKGNvdW50ZXIgPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICgoc3R5bGVzaGVldCA9IG1ha2VTdHlsZVRhZygpKSkge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3RTdHlsZXMoc3R5bGVzaGVldCwgc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnRTdHlsZVRhZyhzdHlsZXNoZWV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY291bnRlci0tO1xuICAgICAgICAgICAgaWYgKCFjb3VudGVyICYmIHN0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0LnBhcmVudE5vZGUgJiYgc3R5bGVzaGVldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlc2hlZXQpO1xuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG4vLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nXG4vLyBpc3N1ZXMgaW4gREVWIGJ1aWxkcy5cblxudmFyIGVuYWJsZURlYnVnVHJhY2luZyA9IGZhbHNlOyAvLyBUcmFjayB3aGljaCBGaWJlcihzKSBzY2hlZHVsZSByZW5kZXIgd29yay5cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTsgLy8gSWYgb3VyIGNvbXBvbmVudCBmcmFtZSBpcyBsYWJlbGVkIFwiPGFub255bW91cz5cIlxuICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCBcImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW4gdG8gbWFrZSB0aGUgc3RhY2sgbW9yZSByZWFkYWJsZS5cblxuXG4gICAgICAgICAgICAgICAgaWYgKGZuLmRpc3BsYXlOYW1lICYmIF9mcmFtZS5pbmNsdWRlcygnPGFub255bW91cz4nKSkge1xuICAgICAgICAgICAgICAgICAgX2ZyYW1lID0gX2ZyYW1lLnJlcGxhY2UoJzxhbm9ueW1vdXM+JywgZm4uZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd247XG52YXIgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd247XG52YXIgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcsIHNlbGYpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBzZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBzZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSksIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAge1xuICAgIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAge1xuICAgIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmZjcy9wdWxsLzEwN1xuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqL1xuXG5mdW5jdGlvbiBqc3hERVYodHlwZSwgY29uZmlnLCBtYXliZUtleSwgc291cmNlLCBzZWxmKSB7XG4gIHtcbiAgICB2YXIgcHJvcE5hbWU7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIHZhciBrZXkgPSBudWxsO1xuICAgIHZhciByZWYgPSBudWxsOyAvLyBDdXJyZW50bHksIGtleSBjYW4gYmUgc3ByZWFkIGluIGFzIGEgcHJvcC4gVGhpcyBjYXVzZXMgYSBwb3RlbnRpYWxcbiAgICAvLyBpc3N1ZSBpZiBrZXkgaXMgYWxzbyBleHBsaWNpdGx5IGRlY2xhcmVkIChpZS4gPGRpdiB7Li4ucHJvcHN9IGtleT1cIkhpXCIgLz5cbiAgICAvLyBvciA8ZGl2IGtleT1cIkhpXCIgey4uLnByb3BzfSAvPiApLiBXZSB3YW50IHRvIGRlcHJlY2F0ZSBrZXkgc3ByZWFkLFxuICAgIC8vIGJ1dCBhcyBhbiBpbnRlcm1lZGlhcnkgc3RlcCwgd2Ugd2lsbCB1c2UganN4REVWIGZvciBldmVyeXRoaW5nIGV4Y2VwdFxuICAgIC8vIDxkaXYgey4uLnByb3BzfSBrZXk9XCJIaVwiIC8+LCBiZWNhdXNlIHdlIGFyZW4ndCBjdXJyZW50bHkgYWJsZSB0byB0ZWxsIGlmXG4gICAgLy8ga2V5IGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgdG8gYmUgdW5kZWZpbmVkIG9yIG5vdC5cblxuICAgIGlmIChtYXliZUtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWF5YmVLZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIG1heWJlS2V5O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcsIHNlbGYpO1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH0gLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG5cblxuICAgIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICAgIGZvciAocHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd247XG5cbntcbiAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSBmYWxzZTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB7XG4gICAgaWYgKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICB7XG4gICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgICAgdmFyIGxpbmVOdW1iZXIgPSBzb3VyY2UubGluZU51bWJlcjtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICogdXBkYXRlcy5cbiAqL1xuXG5cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gICAgaWYgKCFpbmZvKSB7XG4gICAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgICAgaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHRvcC1sZXZlbCByZW5kZXIgY2FsbCB1c2luZyA8XCIgKyBwYXJlbnROYW1lICsgXCI+LlwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmZvO1xuICB9XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgICAvLyBwcm9wZXJ0eSwgaXQgbWF5IGJlIHRoZSBjcmVhdG9yIG9mIHRoZSBjaGlsZCB0aGF0J3MgcmVzcG9uc2libGUgZm9yXG4gICAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gICAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQpIHtcbiAgICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgICAgY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGVsZW1lbnQuX293bmVyLnR5cGUpICsgXCIuXCI7XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgfVxufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgICAgLy8gYnV0IG5vdyB3ZSBwcmludCBhIHNlcGFyYXRlIHdhcm5pbmcgZm9yIHRoZW0gbGF0ZXIuXG4gICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgICAgdmFyIHN0ZXA7XG5cbiAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMgcHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbixcbiAqIHByb3ZpZGVkIGJ5IHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJvcFR5cGVzO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBOb3RlOiBNZW1vIG9ubHkgY2hlY2tzIG91dGVyIHByb3BzIGhlcmUuXG4gICAgLy8gSW5uZXIgcHJvcHMgYXJlIGNoZWNrZWQgaW4gdGhlIHJlY29uY2lsZXIuXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSkge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICAgIGVycm9yKCdDb21wb25lbnQgJXMgZGVjbGFyZWQgYFByb3BUeXBlc2AgaW5zdGVhZCBvZiBgcHJvcFR5cGVzYC4gRGlkIHlvdSBtaXNzcGVsbCB0aGUgcHJvcGVydHkgYXNzaWdubWVudD8nLCBfbmFtZSB8fCAnVW5rbm93bicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHlwZS5nZXREZWZhdWx0UHJvcHMgPT09ICdmdW5jdGlvbicgJiYgIXR5cGUuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIGlzIG9ubHkgdXNlZCBvbiBjbGFzc2ljIFJlYWN0LmNyZWF0ZUNsYXNzICcgKyAnZGVmaW5pdGlvbnMuIFVzZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBgZGVmYXVsdFByb3BzYCBpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhIGZyYWdtZW50LCB2YWxpZGF0ZSB0aGF0IGl0IGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdpdGggZnJhZ21lbnQgcHJvcHNcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBmcmFnbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVGcmFnbWVudFByb3BzKGZyYWdtZW50KSB7XG4gIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyYWdtZW50LnByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmIChrZXkgIT09ICdjaGlsZHJlbicgJiYga2V5ICE9PSAna2V5Jykge1xuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgICBlcnJvcignSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gJyArICdSZWFjdC5GcmFnbWVudCBjYW4gb25seSBoYXZlIGBrZXlgIGFuZCBgY2hpbGRyZW5gIHByb3BzLicsIGtleSk7XG5cbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYWdtZW50LnJlZiAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBgcmVmYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLicpO1xuXG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0S2V5U3ByZWFkID0ge307XG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywga2V5LCBpc1N0YXRpY0NoaWxkcmVuLCBzb3VyY2UsIHNlbGYpIHtcbiAge1xuICAgIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gICAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICAgIGlmICghdmFsaWRUeXBlKSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSk7XG5cbiAgICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0eXBlU3RyaW5nO1xuXG4gICAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHR5cGUpKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSBcIjxcIiArIChnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnVW5rbm93bicpICsgXCIgLz5cIjtcbiAgICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVvZiB0eXBlO1xuICAgICAgfVxuXG4gICAgICBlcnJvcignUmVhY3QuanN4OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciAnICsgJ2J1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgJyArICdjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGVTdHJpbmcsIGluZm8pO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50ID0ganN4REVWKHR5cGUsIHByb3BzLCBrZXksIHNvdXJjZSwgc2VsZik7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gICAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAgIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy5cbiAgICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gICAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pXG5cblxuICAgIGlmICh2YWxpZFR5cGUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuXG4gICAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaXNTdGF0aWNDaGlsZHJlbikge1xuICAgICAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhjaGlsZHJlbltpXSwgdHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignUmVhY3QuanN4OiBTdGF0aWMgY2hpbGRyZW4gc2hvdWxkIGFsd2F5cyBiZSBhbiBhcnJheS4gJyArICdZb3UgYXJlIGxpa2VseSBleHBsaWNpdGx5IGNhbGxpbmcgUmVhY3QuanN4cyBvciBSZWFjdC5qc3hERVYuICcgKyAnVXNlIHRoZSBCYWJlbCB0cmFuc2Zvcm0gaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW4sIHR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocHJvcHMsICdrZXknKSkge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcykuZmlsdGVyKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgcmV0dXJuIGsgIT09ICdrZXknO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGJlZm9yZUV4YW1wbGUgPSBrZXlzLmxlbmd0aCA+IDAgPyAne2tleTogc29tZUtleSwgJyArIGtleXMuam9pbignOiAuLi4sICcpICsgJzogLi4ufScgOiAne2tleTogc29tZUtleX0nO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0S2V5U3ByZWFkW2NvbXBvbmVudE5hbWUgKyBiZWZvcmVFeGFtcGxlXSkge1xuICAgICAgICAgIHZhciBhZnRlckV4YW1wbGUgPSBrZXlzLmxlbmd0aCA+IDAgPyAneycgKyBrZXlzLmpvaW4oJzogLi4uLCAnKSArICc6IC4uLn0nIDogJ3t9JztcblxuICAgICAgICAgIGVycm9yKCdBIHByb3BzIG9iamVjdCBjb250YWluaW5nIGEgXCJrZXlcIiBwcm9wIGlzIGJlaW5nIHNwcmVhZCBpbnRvIEpTWDpcXG4nICsgJyAgbGV0IHByb3BzID0gJXM7XFxuJyArICcgIDwlcyB7Li4ucHJvcHN9IC8+XFxuJyArICdSZWFjdCBrZXlzIG11c3QgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIEpTWCB3aXRob3V0IHVzaW5nIHNwcmVhZDpcXG4nICsgJyAgbGV0IHByb3BzID0gJXM7XFxuJyArICcgIDwlcyBrZXk9e3NvbWVLZXl9IHsuLi5wcm9wc30gLz4nLCBiZWZvcmVFeGFtcGxlLCBjb21wb25lbnROYW1lLCBhZnRlckV4YW1wbGUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZGlkV2FybkFib3V0S2V5U3ByZWFkW2NvbXBvbmVudE5hbWUgKyBiZWZvcmVFeGFtcGxlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufSAvLyBUaGVzZSB0d28gZnVuY3Rpb25zIGV4aXN0IHRvIHN0aWxsIGdldCBjaGlsZCB3YXJuaW5ncyBpbiBkZXZcbi8vIGV2ZW4gd2l0aCB0aGUgcHJvZCB0cmFuc2Zvcm0uIFRoaXMgbWVhbnMgdGhhdCBqc3hERVYgaXMgcHVyZWx5XG4vLyBvcHQtaW4gYmVoYXZpb3IgZm9yIGJldHRlciBtZXNzYWdlcyBidXQgdGhhdCB3ZSB3b24ndCBzdG9wXG4vLyBnaXZpbmcgeW91IHdhcm5pbmdzIGlmIHlvdSB1c2UgcHJvZHVjdGlvbiBhcGlzLlxuXG5mdW5jdGlvbiBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGpzeFdpdGhWYWxpZGF0aW9uRHluYW1pYyh0eXBlLCBwcm9wcywga2V5KSB7XG4gIHtcbiAgICByZXR1cm4ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgZmFsc2UpO1xuICB9XG59XG5cbnZhciBqc3ggPSAganN4V2l0aFZhbGlkYXRpb25EeW5hbWljIDsgLy8gd2UgbWF5IHdhbnQgdG8gc3BlY2lhbCBjYXNlIGpzeHMgaW50ZXJuYWxseSB0byB0YWtlIGFkdmFudGFnZSBvZiBzdGF0aWMgY2hpbGRyZW4uXG4vLyBmb3Igbm93IHdlIGNhbiBzaGlwIGlkZW50aWNhbCBwcm9kIGZ1bmN0aW9uc1xuXG52YXIganN4cyA9ICBqc3hXaXRoVmFsaWRhdGlvblN0YXRpYyA7XG5cbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5qc3ggPSBqc3g7XG5leHBvcnRzLmpzeHMgPSBqc3hzO1xuICB9KSgpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3RWZXJzaW9uID0gJzE4LjMuMSc7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci5cbiAqL1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBiYXRjaCdzIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyBob3cgbG9uZyBhbiB1cGRhdGVcbiAqIHNob3VsZCBzdXNwZW5kIGZvciBpZiBpdCBuZWVkcyB0by5cbiAqL1xudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0ge1xuICB0cmFuc2l0aW9uOiBudWxsXG59O1xuXG52YXIgUmVhY3RDdXJyZW50QWN0UXVldWUgPSB7XG4gIGN1cnJlbnQ6IG51bGwsXG4gIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuXG4gIGlzQmF0Y2hpbmdMZWdhY3k6IGZhbHNlLFxuICBkaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZTogZmFsc2Vcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb3duZXIuXG4gKlxuICogVGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIGNvbXBvbmVudCB3aG8gc2hvdWxkIG93biBhbnkgY29tcG9uZW50cyB0aGF0IGFyZVxuICogY3VycmVudGx5IGJlaW5nIGNvbnN0cnVjdGVkLlxuICovXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSB7fTtcbnZhciBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gbnVsbDtcbmZ1bmN0aW9uIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjaykge1xuICB7XG4gICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICB9XG59XG5cbntcbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUgPSBmdW5jdGlvbiAoc3RhY2spIHtcbiAgICB7XG4gICAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gICAgfVxuICB9OyAvLyBTdGFjayBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCBieSB0aGUgY3VycmVudCByZW5kZXJlci5cblxuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YWNrID0gJyc7IC8vIEFkZCBhbiBleHRyYSB0b3AgZnJhbWUgd2hpbGUgYW4gZWxlbWVudCBpcyBiZWluZyB2YWxpZGF0ZWRcblxuICAgIGlmIChjdXJyZW50RXh0cmFTdGFja0ZyYW1lKSB7XG4gICAgICBzdGFjayArPSBjdXJyZW50RXh0cmFTdGFja0ZyYW1lO1xuICAgIH0gLy8gRGVsZWdhdGUgdG8gdGhlIGluamVjdGVkIHJlbmRlcmVyLXNwZWNpZmljIGltcGxlbWVudGF0aW9uXG5cblxuICAgIHZhciBpbXBsID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2s7XG5cbiAgICBpZiAoaW1wbCkge1xuICAgICAgc3RhY2sgKz0gaW1wbCgpIHx8ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXJcbn07XG5cbntcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWU7XG59XG5cbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSB7fTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IF9jb25zdHJ1Y3RvciAmJiAoX2NvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IF9jb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcyc7XG4gICAgdmFyIHdhcm5pbmdLZXkgPSBjb21wb25lbnROYW1lICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVycm9yKFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlO1xuICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG5cblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG52YXIgZW1wdHlPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cblxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDsgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGVcbiAgLy8gcmVuZGVyZXIuXG5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5Db21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdvYmplY3QnICYmIHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdmdW5jdGlvbicgJiYgcGFydGlhbFN0YXRlICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgJyArICdmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJyk7XG4gIH1cblxuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xufTtcbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cblxuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuXG5cbntcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuXG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKTtcblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuXG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuXG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbnZhciBwdXJlQ29tcG9uZW50UHJvdG90eXBlID0gUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQdXJlQ29tcG9uZW50OyAvLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cblxuYXNzaWduKHB1cmVDb21wb25lbnRQcm90b3R5cGUsIENvbXBvbmVudC5wcm90b3R5cGUpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbi8vIGFuIGltbXV0YWJsZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBtdXRhYmxlIHZhbHVlXG5mdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG4gIHZhciByZWZPYmplY3QgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG5cbiAgcmV0dXJuIHJlZk9iamVjdDtcbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duLCBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBjb25maWcuX19zZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBjb25maWcuX19zZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTsgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xufVxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cbi8qKlxuICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2Nsb25lZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiICsgZWxlbWVudCArIFwiLlwiKTtcbiAgfVxuXG4gIHZhciBwcm9wTmFtZTsgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuXG4gIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjsgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cblxuICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7IC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGFcbiAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZVxuICAvLyB0cnVlIG93bmVyLlxuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7IC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG5cblxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuXG5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6Jztcbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGUoa2V5KSB7XG4gIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7XG4gIHZhciBlc2NhcGVyTG9va3VwID0ge1xuICAgICc9JzogJz0wJyxcbiAgICAnOic6ICc9MidcbiAgfTtcbiAgdmFyIGVzY2FwZWRTdHJpbmcgPSBrZXkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbiAgcmV0dXJuICckJyArIGVzY2FwZWRTdHJpbmc7XG59XG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuXG5mdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7XG59XG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBlbGVtZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGVsZW1lbnQgQSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFbGVtZW50S2V5KGVsZW1lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnICYmIGVsZW1lbnQgIT09IG51bGwgJiYgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHtcbiAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBlc2NhcGUoJycgKyBlbGVtZW50LmtleSk7XG4gIH0gLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcblxuXG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIG1hcEludG9BcnJheShjaGlsZHJlbiwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5hbWVTb0ZhciwgY2FsbGJhY2spIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIHZhciBpbnZva2VDYWxsYmFjayA9IGZhbHNlO1xuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCkge1xuICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBzd2l0Y2ggKGNoaWxkcmVuLiQkdHlwZW9mKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgaWYgKGludm9rZUNhbGxiYWNrKSB7XG4gICAgdmFyIF9jaGlsZCA9IGNoaWxkcmVuO1xuICAgIHZhciBtYXBwZWRDaGlsZCA9IGNhbGxiYWNrKF9jaGlsZCk7IC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93czpcblxuICAgIHZhciBjaGlsZEtleSA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRFbGVtZW50S2V5KF9jaGlsZCwgMCkgOiBuYW1lU29GYXI7XG5cbiAgICBpZiAoaXNBcnJheShtYXBwZWRDaGlsZCkpIHtcbiAgICAgIHZhciBlc2NhcGVkQ2hpbGRLZXkgPSAnJztcblxuICAgICAgaWYgKGNoaWxkS2V5ICE9IG51bGwpIHtcbiAgICAgICAgZXNjYXBlZENoaWxkS2V5ID0gZXNjYXBlVXNlclByb3ZpZGVkS2V5KGNoaWxkS2V5KSArICcvJztcbiAgICAgIH1cblxuICAgICAgbWFwSW50b0FycmF5KG1hcHBlZENoaWxkLCBhcnJheSwgZXNjYXBlZENoaWxkS2V5LCAnJywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHtcbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChtYXBwZWRDaGlsZCkpIHtcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBgaWZgIHN0YXRlbWVudCBoZXJlIHByZXZlbnRzIGF1dG8tZGlzYWJsaW5nIG9mIHRoZSBzYWZlXG4gICAgICAgICAgLy8gY29lcmNpb24gRVNMaW50IHJ1bGUsIHNvIHdlIG11c3QgbWFudWFsbHkgZGlzYWJsZSBpdCBiZWxvdy5cbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgICBpZiAobWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkpIHtcbiAgICAgICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWFwcGVkQ2hpbGQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICAgIGVzY2FwZWRQcmVmaXggKyAoIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICAgIGVzY2FwZVVzZXJQcm92aWRlZEtleSgnJyArIG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgICB9XG5cbiAgICAgIGFycmF5LnB1c2gobWFwcGVkQ2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkO1xuICB2YXIgbmV4dE5hbWU7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgaXRlcmFibGVDaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICB7XG4gICAgICAgIC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuICAgICAgICBpZiAoaXRlcmF0b3JGbiA9PT0gaXRlcmFibGVDaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgICB3YXJuKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoaXRlcmFibGVDaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHZhciBpaSA9IDA7XG5cbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBNYXBzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBjb3VudCA9IDA7XG4gIG1hcEludG9BcnJheShjaGlsZHJlbiwgcmVzdWx0LCAnJywgJycsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGNvdW50KyspO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmNvdW50XG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uXG4gKi9cblxuXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBuID0gMDtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBuKys7IC8vIERvbid0IHJldHVybiBhbnl0aGluZ1xuICB9KTtcbiAgcmV0dXJuIG47XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuZm9yZWFjaFxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmb3JFYWNoRnVuY1xuICogQHBhcmFtIHsqfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IGZvciBmb3JFYWNoQ29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpIHtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBmb3JFYWNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmcuXG4gIH0sIGZvckVhY2hDb250ZXh0KTtcbn1cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVudG9hcnJheVxuICovXG5cblxuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICByZXR1cm4gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZDtcbiAgfSkgfHwgW107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVub25seVxuICpcbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgc2luZ2xlIGNoaWxkIGdldHNcbiAqIHBhc3NlZCB3aXRob3V0IGEgd3JhcHBlciwgYnV0IHRoZSBwdXJwb3NlIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHRvXG4gKiBhYnN0cmFjdCBhd2F5IHRoZSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBvZiBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGNoaWxkcmVuIENoaWxkIGNvbGxlY3Rpb24gc3RydWN0dXJlLlxuICogQHJldHVybiB7UmVhY3RFbGVtZW50fSBUaGUgZmlyc3QgYW5kIG9ubHkgYFJlYWN0RWxlbWVudGAgY29udGFpbmVkIGluIHRoZVxuICogc3RydWN0dXJlLlxuICovXG5cblxuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gIGlmICghaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4nKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgLy8gVE9ETzogU2Vjb25kIGFyZ3VtZW50IHVzZWQgdG8gYmUgYW4gb3B0aW9uYWwgYGNhbGN1bGF0ZUNoYW5nZWRCaXRzYFxuICAvLyBmdW5jdGlvbi4gV2FybiB0byByZXNlcnZlIGZvciBmdXR1cmUgdXNlP1xuICB2YXIgY29udGV4dCA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgIC8vIEFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQgcmVuZGVyZXJzLCB3ZSBjYXRlZ29yaXplXG4gICAgLy8gc29tZSByZW5kZXJlcnMgYXMgcHJpbWFyeSBhbmQgb3RoZXJzIGFzIHNlY29uZGFyeS4gV2Ugb25seSBleHBlY3RcbiAgICAvLyB0aGVyZSB0byBiZSB0d28gY29uY3VycmVudCByZW5kZXJlcnMgYXQgbW9zdDogUmVhY3QgTmF0aXZlIChwcmltYXJ5KSBhbmRcbiAgICAvLyBGYWJyaWMgKHNlY29uZGFyeSk7IFJlYWN0IERPTSAocHJpbWFyeSkgYW5kIFJlYWN0IEFSVCAoc2Vjb25kYXJ5KS5cbiAgICAvLyBTZWNvbmRhcnkgcmVuZGVyZXJzIHN0b3JlIHRoZWlyIGNvbnRleHQgdmFsdWVzIG9uIHNlcGFyYXRlIGZpZWxkcy5cbiAgICBfY3VycmVudFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgX2N1cnJlbnRWYWx1ZTI6IGRlZmF1bHRWYWx1ZSxcbiAgICAvLyBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IGNvbmN1cnJlbnQgcmVuZGVyZXJzIHRoaXMgY29udGV4dCBjdXJyZW50bHlcbiAgICAvLyBzdXBwb3J0cyB3aXRoaW4gaW4gYSBzaW5nbGUgcmVuZGVyZXIuIFN1Y2ggYXMgcGFyYWxsZWwgc2VydmVyIHJlbmRlcmluZy5cbiAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgLy8gVGhlc2UgYXJlIGNpcmN1bGFyXG4gICAgUHJvdmlkZXI6IG51bGwsXG4gICAgQ29uc3VtZXI6IG51bGwsXG4gICAgLy8gQWRkIHRoZXNlIHRvIHVzZSBzYW1lIGhpZGRlbiBjbGFzcyBpbiBWTSBhcyBTZXJ2ZXJDb250ZXh0XG4gICAgX2RlZmF1bHRWYWx1ZTogbnVsbCxcbiAgICBfZ2xvYmFsTmFtZTogbnVsbFxuICB9O1xuICBjb250ZXh0LlByb3ZpZGVyID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9QUk9WSURFUl9UWVBFLFxuICAgIF9jb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gZmFsc2U7XG5cbiAge1xuICAgIC8vIEEgc2VwYXJhdGUgb2JqZWN0LCBidXQgcHJveGllcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9iamVjdCBmb3JcbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaGFzIGEgZGlmZmVyZW50ICQkdHlwZW9mLCBzbyB3ZSBjYW4gcHJvcGVybHlcbiAgICAvLyB3YXJuIGZvciB0aGUgaW5jb3JyZWN0IHVzYWdlIG9mIENvbnRleHQgYXMgYSBDb25zdW1lci5cbiAgICB2YXIgQ29uc3VtZXIgPSB7XG4gICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwge1xuICAgICAgUHJvdmlkZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLlByb3ZpZGVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LlByb3ZpZGVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LlByb3ZpZGVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfUHJvdmlkZXIpIHtcbiAgICAgICAgICBjb250ZXh0LlByb3ZpZGVyID0gX1Byb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWUyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlMikge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF90aHJlYWRDb3VudDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fdGhyZWFkQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF90aHJlYWRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuX3RocmVhZENvdW50ID0gX3RocmVhZENvdW50O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ29uc3VtZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycykge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLkNvbnN1bWVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlzcGxheU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lcikge1xuICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArIFwiWW91IHNob3VsZCBzZXQgaXQgZGlyZWN0bHkgb24gdGhlIGNvbnRleHQgd2l0aCBDb250ZXh0LmRpc3BsYXlOYW1lID0gJyVzJy5cIiwgZGlzcGxheU5hbWUpO1xuXG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvcGVydGllcyBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBkZWZpbmVQcm9wZXJ0eVxuXG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxudmFyIFVuaW5pdGlhbGl6ZWQgPSAtMTtcbnZhciBQZW5kaW5nID0gMDtcbnZhciBSZXNvbHZlZCA9IDE7XG52YXIgUmVqZWN0ZWQgPSAyO1xuXG5mdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXIocGF5bG9hZCkge1xuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgdmFyIHRoZW5hYmxlID0gY3RvcigpOyAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgIC8vIFRoaXMgbWlnaHQgdGhyb3cgZWl0aGVyIGJlY2F1c2UgaXQncyBtaXNzaW5nIG9yIHRocm93cy4gSWYgc28sIHdlIHRyZWF0IGl0XG4gICAgLy8gYXMgc3RpbGwgdW5pbml0aWFsaXplZCBhbmQgdHJ5IGFnYWluIG5leHQgdGltZS4gV2hpY2ggaXMgdGhlIHNhbWUgYXMgd2hhdFxuICAgIC8vIGhhcHBlbnMgaWYgdGhlIGN0b3Igb3IgYW55IHdyYXBwZXJzIHByb2Nlc3NpbmcgdGhlIGN0b3IgdGhyb3dzLiBUaGlzIG1pZ2h0XG4gICAgLy8gZW5kIHVwIGZpeGluZyBpdCBpZiB0aGUgcmVzb2x1dGlvbiB3YXMgYSBjb25jdXJyZW5jeSBidWcuXG5cbiAgICB0aGVuYWJsZS50aGVuKGZ1bmN0aW9uIChtb2R1bGVPYmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZXNvbHZlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlc29sdmVkLl9zdGF0dXMgPSBSZXNvbHZlZDtcbiAgICAgICAgcmVzb2x2ZWQuX3Jlc3VsdCA9IG1vZHVsZU9iamVjdDtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZWplY3RlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlamVjdGVkLl9zdGF0dXMgPSBSZWplY3RlZDtcbiAgICAgICAgcmVqZWN0ZWQuX3Jlc3VsdCA9IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgLy8gSW4gY2FzZSwgd2UncmUgc3RpbGwgdW5pbml0aWFsaXplZCwgdGhlbiB3ZSdyZSB3YWl0aW5nIGZvciB0aGUgdGhlbmFibGVcbiAgICAgIC8vIHRvIHJlc29sdmUuIFNldCBpdCBhcyBwZW5kaW5nIGluIHRoZSBtZWFudGltZS5cbiAgICAgIHZhciBwZW5kaW5nID0gcGF5bG9hZDtcbiAgICAgIHBlbmRpbmcuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgICBwZW5kaW5nLl9yZXN1bHQgPSB0aGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBSZXNvbHZlZCkge1xuICAgIHZhciBtb2R1bGVPYmplY3QgPSBwYXlsb2FkLl9yZXN1bHQ7XG5cbiAgICB7XG4gICAgICBpZiAobW9kdWxlT2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVxcblxcblwiICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHB1dCBjdXJseSBicmFjZXMgYXJvdW5kIHRoZSBpbXBvcnQ/JywgbW9kdWxlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoISgnZGVmYXVsdCcgaW4gbW9kdWxlT2JqZWN0KSkge1xuICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wJyArICdvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICdjb25zdCBNeUNvbXBvbmVudCA9IGxhenkoKCkgPT4gaW1wJyArIFwib3J0KCcuL015Q29tcG9uZW50JykpXCIsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZU9iamVjdC5kZWZhdWx0O1xuICB9IGVsc2Uge1xuICAgIHRocm93IHBheWxvYWQuX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXp5KGN0b3IpIHtcbiAgdmFyIHBheWxvYWQgPSB7XG4gICAgLy8gV2UgdXNlIHRoZXNlIGZpZWxkcyB0byBzdG9yZSB0aGUgcmVzdWx0LlxuICAgIF9zdGF0dXM6IFVuaW5pdGlhbGl6ZWQsXG4gICAgX3Jlc3VsdDogY3RvclxuICB9O1xuICB2YXIgbGF6eVR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogcGF5bG9hZCxcbiAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgZGVmYXVsdFByb3BzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9wVHlwZXM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFR5cGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgcHJvcFR5cGVzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgcHJvcFR5cGVzID0gbmV3UHJvcFR5cGVzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4gey4uLn0pO1xuICAgICAgICAvLyBUaGlzIGtpbmQgb2YgaW5uZXIgZnVuY3Rpb24gaXMgbm90IHVzZWQgZWxzZXdoZXJlIHNvIHRoZSBzaWRlIGVmZmVjdCBpcyBva2F5LlxuXG4gICAgICAgIGlmICghcmVuZGVyLm5hbWUgJiYgIXJlbmRlci5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHJlbmRlci5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7XG4gIHtcbiAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSkge1xuICAgICAgZXJyb3IoJ21lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkICcgKyAncmVjZWl2ZWQ6ICVzJywgdHlwZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB0eXBlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX01FTU9fVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGNvbXBhcmU6IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb21wYXJlXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QubWVtbygocHJvcHMpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXR5cGUubmFtZSAmJiAhdHlwZS5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICB7XG4gICAgaWYgKGRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG4gICAgfVxuICB9IC8vIFdpbGwgcmVzdWx0IGluIGEgbnVsbCBhY2Nlc3MgZXJyb3IgaWYgYWNjZXNzZWQgb3V0c2lkZSByZW5kZXIgcGhhc2UuIFdlXG4gIC8vIGludGVudGlvbmFsbHkgZG9uJ3QgdGhyb3cgb3VyIG93biBlcnJvciBiZWNhdXNlIHRoaXMgaXMgaW4gYSBob3QgcGF0aC5cbiAgLy8gQWxzbyBoZWxwcyBlbnN1cmUgdGhpcyBpcyBpbmxpbmVkLlxuXG5cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5mdW5jdGlvbiB1c2VDb250ZXh0KENvbnRleHQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuXG4gIHtcbiAgICAvLyBUT0RPOiBhZGQgYSBtb3JlIGdlbmVyaWMgd2FybmluZyBmb3IgaW52YWxpZCB2YWx1ZXMuXG4gICAgaWYgKENvbnRleHQuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlYWxDb250ZXh0ID0gQ29udGV4dC5fY29udGV4dDsgLy8gRG9uJ3QgZGVkdXBsaWNhdGUgYmVjYXVzZSB0aGlzIGxlZ2l0aW1hdGVseSBjYXVzZXMgYnVnc1xuICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLlxuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkLCBtYXkgY2F1c2UgYnVncywgYW5kIHdpbGwgYmUgJyArICdyZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH0gZWxzZSBpZiAocmVhbENvbnRleHQuUHJvdmlkZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQpO1xufVxuZnVuY3Rpb24gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbn1cbmZ1bmN0aW9uIHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG59XG5mdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVmKGluaXRpYWxWYWx1ZSk7XG59XG5mdW5jdGlvbiB1c2VFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZU1lbW8oY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTWVtbyhjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAge1xuICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb24oKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlVHJhbnNpdGlvbigpO1xufVxuZnVuY3Rpb24gdXNlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZURlZmVycmVkVmFsdWUodmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlSWQoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSWQoKTtcbn1cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICB9XG5cbiAge1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCk7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTsgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcblxuICAgICAgdmFyIF9uYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZztcblxuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG52YXIgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkpIHtcbiAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gdHJ1ZTtcblxuICAgICAgd2FybignUmVhY3QuY3JlYXRlRmFjdG9yeSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIENvbnNpZGVyIHVzaW5nIEpTWCAnICsgJ29yIHVzZSBSZWFjdC5jcmVhdGVFbGVtZW50KCkgZGlyZWN0bHkgaW5zdGVhZC4nKTtcbiAgICB9IC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcblxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbn1cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2NvcGUsIG9wdGlvbnMpIHtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzY29wZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSBmYWxzZTtcbnZhciBlbnF1ZXVlVGFza0ltcGwgPSBudWxsO1xuZnVuY3Rpb24gZW5xdWV1ZVRhc2sodGFzaykge1xuICBpZiAoZW5xdWV1ZVRhc2tJbXBsID09PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJlYWQgcmVxdWlyZSBvZmYgdGhlIG1vZHVsZSBvYmplY3QgdG8gZ2V0IGFyb3VuZCB0aGUgYnVuZGxlcnMuXG4gICAgICAvLyB3ZSBkb24ndCB3YW50IHRoZW0gdG8gZGV0ZWN0IGEgcmVxdWlyZSBhbmQgYnVuZGxlIGEgTm9kZSBwb2x5ZmlsbC5cbiAgICAgIHZhciByZXF1aXJlU3RyaW5nID0gKCdyZXF1aXJlJyArIE1hdGgucmFuZG9tKCkpLnNsaWNlKDAsIDcpO1xuICAgICAgdmFyIG5vZGVSZXF1aXJlID0gbW9kdWxlICYmIG1vZHVsZVtyZXF1aXJlU3RyaW5nXTsgLy8gYXNzdW1pbmcgd2UncmUgaW4gbm9kZSwgbGV0J3MgdHJ5IHRvIGdldCBub2RlJ3NcbiAgICAgIC8vIHZlcnNpb24gb2Ygc2V0SW1tZWRpYXRlLCBieXBhc3NpbmcgZmFrZSB0aW1lcnMgaWYgYW55LlxuXG4gICAgICBlbnF1ZXVlVGFza0ltcGwgPSBub2RlUmVxdWlyZS5jYWxsKG1vZHVsZSwgJ3RpbWVycycpLnNldEltbWVkaWF0ZTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXJcbiAgICAgIC8vIHdlIGNhbid0IHVzZSByZWd1bGFyIHRpbWVycyBiZWNhdXNlIHRoZXkgbWF5IHN0aWxsIGJlIGZha2VkXG4gICAgICAvLyBzbyB3ZSB0cnkgTWVzc2FnZUNoYW5uZWwrcG9zdE1lc3NhZ2UgaW5zdGVhZFxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdUaGlzIGJyb3dzZXIgZG9lcyBub3QgaGF2ZSBhIE1lc3NhZ2VDaGFubmVsIGltcGxlbWVudGF0aW9uLCAnICsgJ3NvIGVucXVldWluZyB0YXNrcyB2aWEgYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLikgd2lsbCBmYWlsLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMgJyArICdpZiB5b3UgZW5jb3VudGVyIHRoaXMgd2FybmluZy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKHVuZGVmaW5lZCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbnF1ZXVlVGFza0ltcGwodGFzayk7XG59XG5cbnZhciBhY3RTY29wZURlcHRoID0gMDtcbnZhciBkaWRXYXJuTm9Bd2FpdEFjdCA9IGZhbHNlO1xuZnVuY3Rpb24gYWN0KGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBgYWN0YCBjYWxscyBjYW4gYmUgbmVzdGVkLCBzbyB3ZSB0cmFjayB0aGUgZGVwdGguIFRoaXMgcmVwcmVzZW50cyB0aGVcbiAgICAvLyBudW1iZXIgb2YgYGFjdGAgc2NvcGVzIG9uIHRoZSBzdGFjay5cbiAgICB2YXIgcHJldkFjdFNjb3BlRGVwdGggPSBhY3RTY29wZURlcHRoO1xuICAgIGFjdFNjb3BlRGVwdGgrKztcblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBvdXRlcm1vc3QgYGFjdGAgc2NvcGUuIEluaXRpYWxpemUgdGhlIHF1ZXVlLiBUaGUgcmVjb25jaWxlclxuICAgICAgLy8gd2lsbCBkZXRlY3QgdGhlIHF1ZXVlIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBTY2hlZHVsZXIuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgfVxuXG4gICAgdmFyIHByZXZJc0JhdGNoaW5nTGVnYWN5ID0gUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuIE9ubHlcbiAgICAgIC8vIHNldCB0byBgdHJ1ZWAgd2hpbGUgdGhlIGdpdmVuIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBub3QgZm9yIHVwZGF0ZXNcbiAgICAgIC8vIHRyaWdnZXJlZCBkdXJpbmcgYW4gYXN5bmMgZXZlbnQsIGJlY2F1c2UgdGhpcyBpcyBob3cgdGhlIGxlZ2FjeVxuICAgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgYGFjdGAgYmVoYXZlZC5cbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gY2FsbGJhY2soKTsgLy8gUmVwbGljYXRlIGJlaGF2aW9yIG9mIG9yaWdpbmFsIGBhY3RgIGltcGxlbWVudGF0aW9uIGluIGxlZ2FjeSBtb2RlLFxuICAgICAgLy8gd2hpY2ggZmx1c2hlZCB1cGRhdGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzY29wZSBmdW5jdGlvbiBleGl0cywgZXZlblxuICAgICAgLy8gaWYgaXQncyBhbiBhc3luYyBmdW5jdGlvbi5cblxuICAgICAgaWYgKCFwcmV2SXNCYXRjaGluZ0xlZ2FjeSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSkge1xuICAgICAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSBwcmV2SXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRoZW5hYmxlUmVzdWx0ID0gcmVzdWx0OyAvLyBUaGUgY2FsbGJhY2sgaXMgYW4gYXN5bmMgZnVuY3Rpb24gKGkuZS4gcmV0dXJuZWQgYSBwcm9taXNlKS4gV2FpdFxuICAgICAgLy8gZm9yIGl0IHRvIHJlc29sdmUgYmVmb3JlIGV4aXRpbmcgdGhlIGN1cnJlbnQgc2NvcGUuXG5cbiAgICAgIHZhciB3YXNBd2FpdGVkID0gZmFsc2U7XG4gICAgICB2YXIgdGhlbmFibGUgPSB7XG4gICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICB3YXNBd2FpdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGVuYWJsZVJlc3VsdC50aGVuKGZ1bmN0aW9uIChyZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuXG4gICAgICAgICAgICBpZiAoYWN0U2NvcGVEZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAvLyBXZSd2ZSBleGl0ZWQgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZVxuICAgICAgICAgICAgICAvLyBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3IuXG4gICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB7XG4gICAgICAgIGlmICghZGlkV2Fybk5vQXdhaXRBY3QgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7fSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXdhc0F3YWl0ZWQpIHtcbiAgICAgICAgICAgICAgZGlkV2Fybk5vQXdhaXRBY3QgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdZb3UgY2FsbGVkIGFjdChhc3luYyAoKSA9PiAuLi4pIHdpdGhvdXQgYXdhaXQuICcgKyAnVGhpcyBjb3VsZCBsZWFkIHRvIHVuZXhwZWN0ZWQgdGVzdGluZyBiZWhhdmlvdXIsICcgKyAnaW50ZXJsZWF2aW5nIG11bHRpcGxlIGFjdCBjYWxscyBhbmQgbWl4aW5nIHRoZWlyICcgKyAnc2NvcGVzLiAnICsgJ1lvdSBzaG91bGQgLSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKTsnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhlbmFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIG5vdCBhbiBhc3luYyBmdW5jdGlvbi4gRXhpdCB0aGUgY3VycmVudCBzY29wZVxuICAgICAgLy8gaW1tZWRpYXRlbHksIHdpdGhvdXQgYXdhaXRpbmcuXG5cbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgLy8gRXhpdGluZyB0aGUgb3V0ZXJtb3N0IGFjdCBzY29wZS4gRmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3F1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAoX3F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShfcXVldWUpO1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9IC8vIFJldHVybiBhIHRoZW5hYmxlLiBJZiB0aGUgdXNlciBhd2FpdHMgaXQsIHdlJ2xsIGZsdXNoIGFnYWluIGluXG4gICAgICAgIC8vIGNhc2UgYWRkaXRpb25hbCB3b3JrIHdhcyBzY2hlZHVsZWQgYnkgYSBtaWNyb3Rhc2suXG5cblxuICAgICAgICB2YXIgX3RoZW5hYmxlID0ge1xuICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIC8vIENvbmZpcm0gd2UgaGF2ZW4ndCByZS1lbnRlcmVkIGFub3RoZXIgYGFjdGAgc2NvcGUsIGluIGNhc2VcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIGRvZXMgc29tZXRoaW5nIHdlaXJkIGxpa2UgYXdhaXQgdGhlIHRoZW5hYmxlXG4gICAgICAgICAgICAvLyBtdWx0aXBsZSB0aW1lcy5cbiAgICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZSBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW5jZSB3ZSdyZSBpbnNpZGUgYSBuZXN0ZWQgYGFjdGAgc2NvcGUsIHRoZSByZXR1cm5lZCB0aGVuYWJsZVxuICAgICAgICAvLyBpbW1lZGlhdGVseSByZXNvbHZlcy4gVGhlIG91dGVyIHNjb3BlIHdpbGwgZmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3RoZW5hYmxlMiA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGUyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCkge1xuICB7XG4gICAgaWYgKHByZXZBY3RTY29wZURlcHRoICE9PSBhY3RTY29wZURlcHRoIC0gMSkge1xuICAgICAgZXJyb3IoJ1lvdSBzZWVtIHRvIGhhdmUgb3ZlcmxhcHBpbmcgYWN0KCkgY2FsbHMsIHRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdCZSBzdXJlIHRvIGF3YWl0IHByZXZpb3VzIGFjdCgpIGNhbGxzIGJlZm9yZSBtYWtpbmcgYSBuZXcgb25lLiAnKTtcbiAgICB9XG5cbiAgICBhY3RTY29wZURlcHRoID0gcHJldkFjdFNjb3BlRGVwdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHtcbiAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKTtcbiAgICAgICAgZW5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkLiBGaW5pc2guXG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBLZWVwIGZsdXNoaW5nIHdvcmsgdW50aWwgdGhlcmUncyBub25lIGxlZnQuXG4gICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGlzRmx1c2hpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmx1c2hBY3RRdWV1ZShxdWV1ZSkge1xuICB7XG4gICAgaWYgKCFpc0ZsdXNoaW5nKSB7XG4gICAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgICAgaXNGbHVzaGluZyA9IHRydWU7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgICAgcXVldWUgPSBxdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgY3JlYXRlRWxlbWVudCQxID0gIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY2xvbmVFbGVtZW50JDEgPSAgY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNyZWF0ZUZhY3RvcnkgPSAgY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uIDtcbnZhciBDaGlsZHJlbiA9IHtcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgZm9yRWFjaDogZm9yRWFjaENoaWxkcmVuLFxuICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgdG9BcnJheTogdG9BcnJheSxcbiAgb25seTogb25seUNoaWxkXG59O1xuXG5leHBvcnRzLkNoaWxkcmVuID0gQ2hpbGRyZW47XG5leHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5Qcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuZXhwb3J0cy5hY3QgPSBhY3Q7XG5leHBvcnRzLmNsb25lRWxlbWVudCA9IGNsb25lRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDtcbmV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlRmFjdG9yeSA9IGNyZWF0ZUZhY3Rvcnk7XG5leHBvcnRzLmNyZWF0ZVJlZiA9IGNyZWF0ZVJlZjtcbmV4cG9ydHMuZm9yd2FyZFJlZiA9IGZvcndhcmRSZWY7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gaXNWYWxpZEVsZW1lbnQ7XG5leHBvcnRzLmxhenkgPSBsYXp5O1xuZXhwb3J0cy5tZW1vID0gbWVtbztcbmV4cG9ydHMuc3RhcnRUcmFuc2l0aW9uID0gc3RhcnRUcmFuc2l0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9hY3QgPSBhY3Q7XG5leHBvcnRzLnVzZUNhbGxiYWNrID0gdXNlQ2FsbGJhY2s7XG5leHBvcnRzLnVzZUNvbnRleHQgPSB1c2VDb250ZXh0O1xuZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gdXNlRGVidWdWYWx1ZTtcbmV4cG9ydHMudXNlRGVmZXJyZWRWYWx1ZSA9IHVzZURlZmVycmVkVmFsdWU7XG5leHBvcnRzLnVzZUVmZmVjdCA9IHVzZUVmZmVjdDtcbmV4cG9ydHMudXNlSWQgPSB1c2VJZDtcbmV4cG9ydHMudXNlSW1wZXJhdGl2ZUhhbmRsZSA9IHVzZUltcGVyYXRpdmVIYW5kbGU7XG5leHBvcnRzLnVzZUluc2VydGlvbkVmZmVjdCA9IHVzZUluc2VydGlvbkVmZmVjdDtcbmV4cG9ydHMudXNlTGF5b3V0RWZmZWN0ID0gdXNlTGF5b3V0RWZmZWN0O1xuZXhwb3J0cy51c2VNZW1vID0gdXNlTWVtbztcbmV4cG9ydHMudXNlUmVkdWNlciA9IHVzZVJlZHVjZXI7XG5leHBvcnRzLnVzZVJlZiA9IHVzZVJlZjtcbmV4cG9ydHMudXNlU3RhdGUgPSB1c2VTdGF0ZTtcbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZTtcbmV4cG9ydHMudXNlVHJhbnNpdGlvbiA9IHVzZVRyYW5zaXRpb247XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1ydW50aW1lLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQgJ2ZvY3VzLW91dGxpbmUtbWFuYWdlcic7XG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmLCBDb21wb25lbnQsIGNyZWF0ZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbiBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBzY3JvbGxTbW9vdGggZnJvbSAnc2Nyb2xsLXNtb290aCc7XG5pbXBvcnQgU2Nyb2xscGFyZW50IGZyb20gJ3Njcm9sbHBhcmVudCc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoLmRlYm91bmNlJztcbmltcG9ydCBGb2N1c0xvY2sgZnJvbSAncmVhY3QtZm9jdXMtbG9jayc7XG5pbXBvcnQgc3R5bGVkLCB7IGNyZWF0ZUdsb2JhbFN0eWxlIH0gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSc7XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIHtcbiAgKG51bGwgPT0gYSB8fCBhID4gci5sZW5ndGgpICYmIChhID0gci5sZW5ndGgpO1xuICBmb3IgKHZhciBlID0gMCwgbiA9IEFycmF5KGEpOyBlIDwgYTsgZSsrKSBuW2VdID0gcltlXTtcbiAgcmV0dXJuIG47XG59XG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMocikge1xuICBpZiAoQXJyYXkuaXNBcnJheShyKSkgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKGUpIHtcbiAgaWYgKHZvaWQgMCA9PT0gZSkgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIF9jYWxsU3VwZXIodCwgbywgZSkge1xuICByZXR1cm4gbyA9IF9nZXRQcm90b3R5cGVPZihvKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCwgX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpID8gUmVmbGVjdC5jb25zdHJ1Y3QobywgZSB8fCBbXSwgX2dldFByb3RvdHlwZU9mKHQpLmNvbnN0cnVjdG9yKSA6IG8uYXBwbHkodCwgZSkpO1xufVxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGEsIG4pIHtcbiAgaWYgKCEoYSBpbnN0YW5jZW9mIG4pKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xufVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMoZSwgcikge1xuICBmb3IgKHZhciB0ID0gMDsgdCA8IHIubGVuZ3RoOyB0KyspIHtcbiAgICB2YXIgbyA9IHJbdF07XG4gICAgby5lbnVtZXJhYmxlID0gby5lbnVtZXJhYmxlIHx8ICExLCBvLmNvbmZpZ3VyYWJsZSA9ICEwLCBcInZhbHVlXCIgaW4gbyAmJiAoby53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIF90b1Byb3BlcnR5S2V5KG8ua2V5KSwgbyk7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhlLCByLCB0KSB7XG4gIHJldHVybiByICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUucHJvdG90eXBlLCByKSwgdCAmJiBfZGVmaW5lUHJvcGVydGllcyhlLCB0KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogITFcbiAgfSksIGU7XG59XG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihyLCBlKSB7XG4gIHZhciB0ID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKCF0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocikgfHwgKHQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikpIHx8IGUgJiYgciAmJiBcIm51bWJlclwiID09IHR5cGVvZiByLmxlbmd0aCkge1xuICAgICAgdCAmJiAociA9IHQpO1xuICAgICAgdmFyIG4gPSAwLFxuICAgICAgICBGID0gZnVuY3Rpb24gKCkge307XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzOiBGLFxuICAgICAgICBuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG4gPj0gci5sZW5ndGggPyB7XG4gICAgICAgICAgICBkb25lOiAhMFxuICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICBkb25lOiAhMSxcbiAgICAgICAgICAgIHZhbHVlOiByW24rK11cbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlOiBmdW5jdGlvbiAocikge1xuICAgICAgICAgIHRocm93IHI7XG4gICAgICAgIH0sXG4gICAgICAgIGY6IEZcbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgfVxuICB2YXIgbyxcbiAgICBhID0gITAsXG4gICAgdSA9ICExO1xuICByZXR1cm4ge1xuICAgIHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHQgPSB0LmNhbGwocik7XG4gICAgfSxcbiAgICBuOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgciA9IHQubmV4dCgpO1xuICAgICAgcmV0dXJuIGEgPSByLmRvbmUsIHI7XG4gICAgfSxcbiAgICBlOiBmdW5jdGlvbiAocikge1xuICAgICAgdSA9ICEwLCBvID0gcjtcbiAgICB9LFxuICAgIGY6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGEgfHwgbnVsbCA9PSB0LnJldHVybiB8fCB0LnJldHVybigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHUpIHRocm93IG87XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHtcbiAgcmV0dXJuIChyID0gX3RvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwge1xuICAgIHZhbHVlOiB0LFxuICAgIGVudW1lcmFibGU6ICEwLFxuICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgd3JpdGFibGU6ICEwXG4gIH0pIDogZVtyXSA9IHQsIGU7XG59XG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCkge1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtcbiAgfSwgX2dldFByb3RvdHlwZU9mKHQpO1xufVxuZnVuY3Rpb24gX2luaGVyaXRzKHQsIGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSAmJiBudWxsICE9PSBlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlICYmIGUucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiB0LFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgIH1cbiAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6ICExXG4gIH0pLCBlICYmIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHQgPSAhQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sIFtdLCBmdW5jdGlvbiAoKSB7fSkpO1xuICB9IGNhdGNoICh0KSB7fVxuICByZXR1cm4gKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhdDtcbiAgfSkoKTtcbn1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBsKSB7XG4gIHZhciB0ID0gbnVsbCA9PSByID8gbnVsbCA6IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgcltcIkBAaXRlcmF0b3JcIl07XG4gIGlmIChudWxsICE9IHQpIHtcbiAgICB2YXIgZSxcbiAgICAgIG4sXG4gICAgICBpLFxuICAgICAgdSxcbiAgICAgIGEgPSBbXSxcbiAgICAgIGYgPSAhMCxcbiAgICAgIG8gPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKGkgPSAodCA9IHQuY2FsbChyKSkubmV4dCwgMCA9PT0gbCkge1xuICAgICAgICBpZiAoT2JqZWN0KHQpICE9PSB0KSByZXR1cm47XG4gICAgICAgIGYgPSAhMTtcbiAgICAgIH0gZWxzZSBmb3IgKDsgIShmID0gKGUgPSBpLmNhbGwodCkpLmRvbmUpICYmIChhLnB1c2goZS52YWx1ZSksIGEubGVuZ3RoICE9PSBsKTsgZiA9ICEwKTtcbiAgICB9IGNhdGNoIChyKSB7XG4gICAgICBvID0gITAsIG4gPSByO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWYgJiYgbnVsbCAhPSB0LnJldHVybiAmJiAodSA9IHQucmV0dXJuKCksIE9iamVjdCh1KSAhPT0gdSkpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvKSB0aHJvdyBuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxufVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikge1xuICB2YXIgdCA9IE9iamVjdC5rZXlzKGUpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtcbiAgICByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7XG4gICAgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMihlKSB7XG4gIGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7XG4gICAgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9O1xuICAgIHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7XG4gICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IG93bktleXMoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGU7XG59XG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LCBlKSB7XG4gIGlmIChlICYmIChcIm9iamVjdFwiID09IHR5cGVvZiBlIHx8IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZSkpIHJldHVybiBlO1xuICBpZiAodm9pZCAwICE9PSBlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWRcIik7XG4gIHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHQpO1xufVxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQsIGUpIHtcbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyA9IGUsIHQ7XG4gIH0sIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KHIsIGUpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQociwgZSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHIsIGUpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cbmZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoZSwgdCkge1xuICByZXR1cm4gdCB8fCAodCA9IGUuc2xpY2UoMCkpLCBPYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIHtcbiAgICByYXc6IHtcbiAgICAgIHZhbHVlOiBPYmplY3QuZnJlZXplKHQpXG4gICAgfVxuICB9KSk7XG59XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgdCB8fCAhdCkgcmV0dXJuIHQ7XG4gIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIGkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkge1xuICB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTtcbiAgcmV0dXJuIFwic3ltYm9sXCIgPT0gdHlwZW9mIGkgPyBpIDogaSArIFwiXCI7XG59XG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgYSkge1xuICBpZiAocikge1xuICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiByKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkociwgYSk7XG4gICAgdmFyIHQgPSB7fS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsIC0xKTtcbiAgICByZXR1cm4gXCJPYmplY3RcIiA9PT0gdCAmJiByLmNvbnN0cnVjdG9yICYmICh0ID0gci5jb25zdHJ1Y3Rvci5uYW1lKSwgXCJNYXBcIiA9PT0gdCB8fCBcIlNldFwiID09PSB0ID8gQXJyYXkuZnJvbShyKSA6IFwiQXJndW1lbnRzXCIgPT09IHQgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodCkgPyBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSA6IHZvaWQgMDtcbiAgfVxufVxuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDk7XG52YXIgR2xvYmFsU3R5bGUgPSBjcmVhdGVHbG9iYWxTdHlsZShfdGVtcGxhdGVPYmplY3QkOSB8fCAoX3RlbXBsYXRlT2JqZWN0JDkgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgLmZvY3VzLW91dGxpbmUtaGlkZGVuIDpmb2N1cyB7XFxuICAgICAgb3V0bGluZTogbm9uZTtcXG4gIH1cXG5cIl0pKSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkODtcbnZhciBTdmdCdXR0b24gPSBzdHlsZWQuYnV0dG9uKF90ZW1wbGF0ZU9iamVjdCQ4IHx8IChfdGVtcGxhdGVPYmplY3QkOCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBkaXNwbGF5OiBibG9jaztcXG4gIHBhZGRpbmc6IDA7XFxuICBib3JkZXI6IDA7XFxuICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgZm9udC1zaXplOiAwO1xcbiAgY3Vyc29yOiBcIiwgXCI7XFxuXCJdKSksIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuZGlzYWJsZWQgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInO1xufSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkNywgX3RlbXBsYXRlT2JqZWN0MjtcbnZhciBMYWJlbCA9IHN0eWxlZC5zcGFuKF90ZW1wbGF0ZU9iamVjdCQ3IHx8IChfdGVtcGxhdGVPYmplY3QkNyA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBmb250LXNpemU6IDEycHg7XFxuICBsaW5lLWhlaWdodDogMTtcXG5cIl0pKSk7XG5mdW5jdGlvbiBBcnJvdyhfcmVmKSB7XG4gIHZhciBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgIGludmVydGVkID0gX3JlZi5pbnZlcnRlZCxcbiAgICBsYWJlbCA9IF9yZWYubGFiZWwsXG4gICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ZnQnV0dG9uLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgb25DbGljazogb25DbGljayxcbiAgICBcImRhdGEtdG91ci1lbGVtXCI6IFwiXCIuY29uY2F0KGludmVydGVkID8gJ3JpZ2h0JyA6ICdsZWZ0JywgXCItYXJyb3dcIiksXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gIH0sIGxhYmVsID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGFiZWwsIG51bGwsIGxhYmVsKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB2aWV3Qm94OiBcIjAgMCAxOC40IDE0LjRcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IGludmVydGVkID8gJ00xNyA3LjJIMU0xMC44IDFMMTcgNy4ybC02LjIgNi4yJyA6ICdNMS40IDcuMmgxNk03LjYgMUwxLjQgNy4ybDYuMiA2LjInLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHN0cm9rZTogXCJjdXJyZW50Q29sb3JcIixcbiAgICBzdHJva2VXaWR0aDogXCIyXCIsXG4gICAgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLFxuICAgIHN0cm9rZU1pdGVybGltaXQ6IFwiMTBcIlxuICB9KSkpO1xufVxuQXJyb3cucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaW52ZXJ0ZWQ6IFByb3BUeXBlcy5ib29sLFxuICBsYWJlbDogUHJvcFR5cGVzLm5vZGUsXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbFxufTtcbnZhciBBcnJvdyQxID0gc3R5bGVkKEFycm93KShfdGVtcGxhdGVPYmplY3QyIHx8IChfdGVtcGxhdGVPYmplY3QyID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIGNvbG9yOiBcIiwgXCI7XFxuXFxuICBcIiwgXCI7XFxuICBcIiwgXCI7XFxuXFxuICAmOmhvdmVyIHtcXG4gICAgY29sb3I6IFwiLCBcIjtcXG4gIH1cXG5cIl0pKSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5kaXNhYmxlZCA/ICcjY2FjY2NlJyA6ICcjNjQ2NDY0Jztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuaW52ZXJ0ZWQgPyAnbWFyZ2luLWxlZnQ6IDI0cHg7JyA6ICdtYXJnaW4tcmlnaHQ6IDI0cHg7Jztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gIXByb3BzLmxhYmVsICYmIFwiXFxuICAgIHdpZHRoOiAxNnB4O1xcbiAgICBoZWlnaHQ6IDEycHg7XFxuICAgIGZsZXg6IDAgMCAxNnB4O1xcbiAgXCI7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmRpc2FibGVkID8gJyNjYWNjY2UnIDogJyMwMDAnO1xufSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkNjtcbmZ1bmN0aW9uIENsb3NlKF9yZWYpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2ssXG4gICAgYXJpYUxhYmVsID0gX3JlZi5hcmlhTGFiZWw7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdmdCdXR0b24sIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIFwiYXJpYS1sYWJlbFwiOiBhcmlhTGFiZWxcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHZpZXdCb3g6IFwiMCAwIDkuMSA5LjFcIixcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWUsXG4gICAgcm9sZTogXCJwcmVzZW50YXRpb25cIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgZDogXCJNNS45IDQuNWwyLjgtMi44Yy40LS40LjQtMSAwLTEuNC0uNC0uNC0xLS40LTEuNCAwTDQuNSAzLjEgMS43LjNDMS4zLS4xLjctLjEuMy4zYy0uNC40LS40IDEgMCAxLjRsMi44IDIuOEwuMyA3LjRjLS40LjQtLjQgMSAwIDEuNC4yLjIuNC4zLjcuM3MuNS0uMS43LS4zTDQuNSA2bDIuOCAyLjhjLjMuMi41LjMuOC4zcy41LS4xLjctLjNjLjQtLjQuNC0xIDAtMS40TDUuOSA0LjV6XCJcbiAgfSkpKTtcbn1cbkNsb3NlLnByb3BUeXBlcyA9IHtcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGFyaWFMYWJlbDogUHJvcFR5cGVzLnN0cmluZ1xufTtcbnZhciBTdHlsZWRDbG9zZSA9IHN0eWxlZChDbG9zZSkoX3RlbXBsYXRlT2JqZWN0JDYgfHwgKF90ZW1wbGF0ZU9iamVjdCQ2ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMjJweDtcXG4gIHJpZ2h0OiAyMnB4O1xcbiAgd2lkdGg6IDlweDtcXG4gIGhlaWdodDogOXB4O1xcbiAgY29sb3I6ICM1ZTVlNWU7XFxuICAmOmhvdmVyIHtcXG4gICAgY29sb3I6ICMwMDA7XFxuICB9XFxuXCJdKSkpO1xuXG5mdW5jdGlvbiBnZXROb2RlUmVjdChub2RlKSB7XG4gIHZhciBfbm9kZSRnZXRCb3VuZGluZ0NsaWUgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgIHRvcCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS50b3AsXG4gICAgcmlnaHQgPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUucmlnaHQsXG4gICAgYm90dG9tID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLmJvdHRvbSxcbiAgICBsZWZ0ID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLmxlZnQsXG4gICAgd2lkdGggPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUud2lkdGgsXG4gICAgaGVpZ2h0ID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLmhlaWdodDtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IHRvcCxcbiAgICByaWdodDogcmlnaHQsXG4gICAgYm90dG9tOiBib3R0b20sXG4gICAgbGVmdDogbGVmdCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldEhpZ2hsaWdodGVkUmVjdChub2RlLCBzdGVwKSB7XG4gIGlmICghc3RlcC5oaWdobGlnaHRlZFNlbGVjdG9ycykge1xuICAgIHJldHVybiBnZXROb2RlUmVjdChub2RlKTtcbiAgfVxuICB2YXIgYXR0cnMgPSBnZXROb2RlUmVjdChub2RlKTtcbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHN0ZXAuaGlnaGxpZ2h0ZWRTZWxlY3RvcnMpLFxuICAgIF9zdGVwO1xuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBfc3RlcC52YWx1ZTtcbiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZWN0ID0gZ2V0Tm9kZVJlY3QoZWxlbWVudCk7XG4gICAgICBpZiAocmVjdC50b3AgPCBhdHRycy50b3ApIHtcbiAgICAgICAgYXR0cnMudG9wID0gcmVjdC50b3A7XG4gICAgICB9XG4gICAgICBpZiAocmVjdC5yaWdodCA+IGF0dHJzLnJpZ2h0KSB7XG4gICAgICAgIGF0dHJzLnJpZ2h0ID0gcmVjdC5yaWdodDtcbiAgICAgIH1cbiAgICAgIGlmIChyZWN0LmJvdHRvbSA+IGF0dHJzLmJvdHRvbSkge1xuICAgICAgICBhdHRycy5ib3R0b20gPSByZWN0LmJvdHRvbTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWN0LmxlZnQgPCBhdHRycy5sZWZ0KSB7XG4gICAgICAgIGF0dHJzLmxlZnQgPSByZWN0LmxlZnQ7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cbiAgYXR0cnMud2lkdGggPSBhdHRycy5yaWdodCAtIGF0dHJzLmxlZnQ7XG4gIGF0dHJzLmhlaWdodCA9IGF0dHJzLmJvdHRvbSAtIGF0dHJzLnRvcDtcbiAgcmV0dXJuIGF0dHJzO1xufVxuZnVuY3Rpb24gaW5WaWV3KF9yZWYpIHtcbiAgdmFyIHRvcCA9IF9yZWYudG9wLFxuICAgIHJpZ2h0ID0gX3JlZi5yaWdodCxcbiAgICBib3R0b20gPSBfcmVmLmJvdHRvbSxcbiAgICBsZWZ0ID0gX3JlZi5sZWZ0LFxuICAgIHcgPSBfcmVmLncsXG4gICAgaCA9IF9yZWYuaCxcbiAgICBfcmVmJHRocmVzaG9sZCA9IF9yZWYudGhyZXNob2xkLFxuICAgIHRocmVzaG9sZCA9IF9yZWYkdGhyZXNob2xkID09PSB2b2lkIDAgPyAwIDogX3JlZiR0aHJlc2hvbGQ7XG4gIHJldHVybiB0b3AgPj0gMCArIHRocmVzaG9sZCAmJiBsZWZ0ID49IDAgKyB0aHJlc2hvbGQgJiYgYm90dG9tIDw9IGggLSB0aHJlc2hvbGQgJiYgcmlnaHQgPD0gdyAtIHRocmVzaG9sZDtcbn1cbmZ1bmN0aW9uIGlzQm9keShub2RlKSB7XG4gIHJldHVybiBub2RlID09PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykgfHwgbm9kZSA9PT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpO1xufVxudmFyIGlzSG9yaXogPSBmdW5jdGlvbiBpc0hvcml6KHBvcykge1xuICByZXR1cm4gLyhsZWZ0fHJpZ2h0KS8udGVzdChwb3MpO1xufTtcbnZhciBpc091dHNpZGVYID0gZnVuY3Rpb24gaXNPdXRzaWRlWCh2YWwsIHdpbmRvd1dpZHRoKSB7XG4gIHJldHVybiB2YWwgPiB3aW5kb3dXaWR0aDtcbn07XG52YXIgaXNPdXRzaWRlWSA9IGZ1bmN0aW9uIGlzT3V0c2lkZVkodmFsLCB3aW5kb3dIZWlnaHQpIHtcbiAgcmV0dXJuIHZhbCA+IHdpbmRvd0hlaWdodDtcbn07XG52YXIgc2FmZSA9IGZ1bmN0aW9uIHNhZmUoc3VtKSB7XG4gIHJldHVybiBzdW0gPCAwID8gMCA6IHN1bTtcbn07XG5mdW5jdGlvbiBiZXN0UG9zaXRpb25PZihwb3NpdGlvbnMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBvc2l0aW9ucykubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiBwLFxuICAgICAgdmFsdWU6IHBvc2l0aW9uc1twXVxuICAgIH07XG4gIH0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi52YWx1ZSAtIGEudmFsdWU7XG4gIH0pLm1hcChmdW5jdGlvbiAocCkge1xuICAgIHJldHVybiBwLnBvc2l0aW9uO1xuICB9KTtcbn1cblxudmFyIF90ZW1wbGF0ZU9iamVjdCQ1O1xudmFyIEd1aWRlID0gc3R5bGVkLmRpdihfdGVtcGxhdGVPYmplY3QkNSB8fCAoX3RlbXBsYXRlT2JqZWN0JDUgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgLS1yZWFjdG91ci1hY2NlbnQ6IFwiLCBcIjtcXG4gIFwiLCBcIlxcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3M7XFxuICB0b3A6IDA7XFxuICBsZWZ0OiAwO1xcbiAgei1pbmRleDogMTAwMDAwMDtcXG5cXG4gIHRyYW5zZm9ybTogXCIsIFwiO1xcblwiXSkpLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmFjY2VudENvbG9yO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5kZWZhdWx0U3R5bGVzID8gXCJcXG4gIG1heC13aWR0aDogMzMxcHg7XFxuICBtaW4td2lkdGg6IDE1MHB4O1xcbiAgcGFkZGluZy1yaWdodDogNDBweDtcXG4gIGJvcmRlci1yYWRpdXM6IFwiLmNvbmNhdChwcm9wcy5yb3VuZGVkLCBcInB4O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIHBhZGRpbmc6IDI0cHggMzBweDtcXG4gIGJveC1zaGFkb3c6IDAgMC41ZW0gM2VtIHJnYmEoMCwgMCwgMCwgMC4zKTtcXG4gIGNvbG9yOiBpbmhlcml0O1xcbiAgXCIpIDogJyc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIHRhcmdldFRvcCA9IHByb3BzLnRhcmdldFRvcCxcbiAgICB0YXJnZXRSaWdodCA9IHByb3BzLnRhcmdldFJpZ2h0LFxuICAgIHRhcmdldEJvdHRvbSA9IHByb3BzLnRhcmdldEJvdHRvbSxcbiAgICB0YXJnZXRMZWZ0ID0gcHJvcHMudGFyZ2V0TGVmdCxcbiAgICB3aW5kb3dXaWR0aCA9IHByb3BzLndpbmRvd1dpZHRoLFxuICAgIHdpbmRvd0hlaWdodCA9IHByb3BzLndpbmRvd0hlaWdodCxcbiAgICBoZWxwZXJXaWR0aCA9IHByb3BzLmhlbHBlcldpZHRoLFxuICAgIGhlbHBlckhlaWdodCA9IHByb3BzLmhlbHBlckhlaWdodCxcbiAgICBoZWxwZXJQb3NpdGlvbiA9IHByb3BzLmhlbHBlclBvc2l0aW9uLFxuICAgIHBhZGRpbmcgPSBwcm9wcy5wYWRkaW5nO1xuICB2YXIgYXZhaWxhYmxlID0ge1xuICAgIGxlZnQ6IHRhcmdldExlZnQsXG4gICAgcmlnaHQ6IHdpbmRvd1dpZHRoIC0gdGFyZ2V0UmlnaHQsXG4gICAgdG9wOiB0YXJnZXRUb3AsXG4gICAgYm90dG9tOiB3aW5kb3dIZWlnaHQgLSB0YXJnZXRCb3R0b21cbiAgfTtcbiAgdmFyIGNvdWxkUG9zaXRpb25BdCA9IGZ1bmN0aW9uIGNvdWxkUG9zaXRpb25BdChwb3NpdGlvbikge1xuICAgIHJldHVybiBhdmFpbGFibGVbcG9zaXRpb25dID4gKGlzSG9yaXoocG9zaXRpb24pID8gaGVscGVyV2lkdGggKyBwYWRkaW5nICogMiA6IGhlbHBlckhlaWdodCArIHBhZGRpbmcgKiAyKTtcbiAgfTtcbiAgdmFyIGF1dG9Qb3NpdGlvbiA9IGZ1bmN0aW9uIGF1dG9Qb3NpdGlvbihjb29yZHMpIHtcbiAgICB2YXIgcG9zaXRpb25zT3JkZXIgPSBiZXN0UG9zaXRpb25PZihhdmFpbGFibGUpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcG9zaXRpb25zT3JkZXIubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChjb3VsZFBvc2l0aW9uQXQocG9zaXRpb25zT3JkZXJbal0pKSB7XG4gICAgICAgIHJldHVybiBjb29yZHNbcG9zaXRpb25zT3JkZXJbal1dO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29vcmRzLmNlbnRlcjtcbiAgfTtcbiAgdmFyIHBvcyA9IGZ1bmN0aW9uIHBvcyhoZWxwZXJQb3NpdGlvbikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGhlbHBlclBvc2l0aW9uKSkge1xuICAgICAgdmFyIGlzT3V0WCA9IGlzT3V0c2lkZVgoaGVscGVyUG9zaXRpb25bMF0sIHdpbmRvd1dpZHRoKTtcbiAgICAgIHZhciBpc091dFkgPSBpc091dHNpZGVZKGhlbHBlclBvc2l0aW9uWzFdLCB3aW5kb3dIZWlnaHQpO1xuICAgICAgdmFyIHdhcm4gPSBmdW5jdGlvbiB3YXJuKGF4aXMsIG51bSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJcIi5jb25jYXQoYXhpcywgXCI6XCIpLmNvbmNhdChudW0sIFwiIGlzIG91dHNpZGUgd2luZG93LCBmYWxsaW5nIGJhY2sgdG8gY2VudGVyXCIpKTtcbiAgICAgIH07XG4gICAgICBpZiAoaXNPdXRYKSB3YXJuKCd4JywgaGVscGVyUG9zaXRpb25bMF0pO1xuICAgICAgaWYgKGlzT3V0WSkgd2FybigneScsIGhlbHBlclBvc2l0aW9uWzFdKTtcbiAgICAgIHJldHVybiBbaXNPdXRYID8gd2luZG93V2lkdGggLyAyIC0gaGVscGVyV2lkdGggLyAyIDogaGVscGVyUG9zaXRpb25bMF0sIGlzT3V0WSA/IHdpbmRvd0hlaWdodCAvIDIgLSBoZWxwZXJIZWlnaHQgLyAyIDogaGVscGVyUG9zaXRpb25bMV1dO1xuICAgIH1cbiAgICB2YXIgaFggPSBpc091dHNpZGVYKHRhcmdldExlZnQgKyBoZWxwZXJXaWR0aCwgd2luZG93V2lkdGgpID8gaXNPdXRzaWRlWCh0YXJnZXRSaWdodCArIHBhZGRpbmcsIHdpbmRvd1dpZHRoKSA/IHRhcmdldFJpZ2h0IC0gaGVscGVyV2lkdGggOiB0YXJnZXRSaWdodCAtIGhlbHBlcldpZHRoICsgcGFkZGluZyA6IHRhcmdldExlZnQgLSBwYWRkaW5nO1xuICAgIHZhciB4ID0gaFggPiBwYWRkaW5nID8gaFggOiBwYWRkaW5nO1xuICAgIHZhciBoWSA9IGlzT3V0c2lkZVkodGFyZ2V0VG9wICsgaGVscGVySGVpZ2h0LCB3aW5kb3dIZWlnaHQpID8gaXNPdXRzaWRlWSh0YXJnZXRCb3R0b20gKyBwYWRkaW5nLCB3aW5kb3dIZWlnaHQpID8gdGFyZ2V0Qm90dG9tIC0gaGVscGVySGVpZ2h0IDogdGFyZ2V0Qm90dG9tIC0gaGVscGVySGVpZ2h0ICsgcGFkZGluZyA6IHRhcmdldFRvcCAtIHBhZGRpbmc7XG4gICAgdmFyIHkgPSBoWSA+IHBhZGRpbmcgPyBoWSA6IHBhZGRpbmc7XG4gICAgdmFyIGNvb3JkcyA9IHtcbiAgICAgIHRvcDogW3gsIHRhcmdldFRvcCAtIGhlbHBlckhlaWdodCAtIHBhZGRpbmcgKiAyXSxcbiAgICAgIHJpZ2h0OiBbdGFyZ2V0UmlnaHQgKyBwYWRkaW5nICogMiwgeV0sXG4gICAgICBib3R0b206IFt4LCB0YXJnZXRCb3R0b20gKyBwYWRkaW5nICogMl0sXG4gICAgICBsZWZ0OiBbdGFyZ2V0TGVmdCAtIGhlbHBlcldpZHRoIC0gcGFkZGluZyAqIDIsIHldLFxuICAgICAgY2VudGVyOiBbd2luZG93V2lkdGggLyAyIC0gaGVscGVyV2lkdGggLyAyLCB3aW5kb3dIZWlnaHQgLyAyIC0gaGVscGVySGVpZ2h0IC8gMl1cbiAgICB9O1xuICAgIGlmIChoZWxwZXJQb3NpdGlvbiA9PT0gJ2NlbnRlcicgfHwgY291bGRQb3NpdGlvbkF0KGhlbHBlclBvc2l0aW9uKSkge1xuICAgICAgcmV0dXJuIGNvb3Jkc1toZWxwZXJQb3NpdGlvbl07XG4gICAgfVxuICAgIHJldHVybiBhdXRvUG9zaXRpb24oY29vcmRzKTtcbiAgfTtcbiAgdmFyIHAgPSBwb3MoaGVscGVyUG9zaXRpb24pO1xuICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIuY29uY2F0KE1hdGgucm91bmQocFswXSksIFwicHgsIFwiKS5jb25jYXQoTWF0aC5yb3VuZChwWzFdKSwgXCJweClcIik7XG59KTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCQ0O1xudmFyIEJhZGdlID0gc3R5bGVkLnNwYW4oX3RlbXBsYXRlT2JqZWN0JDQgfHwgKF90ZW1wbGF0ZU9iamVjdCQ0ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxuICBiYWNrZ3JvdW5kOiB2YXIoLS1yZWFjdG91ci1hY2NlbnQpO1xcbiAgYmFja2dyb3VuZDogXCIsIFwiO1xcbiAgaGVpZ2h0OiAxLjg3NWVtO1xcbiAgbGluZS1oZWlnaHQ6IDI7XFxuICBwYWRkaW5nLWxlZnQ6IDAuODEyNWVtO1xcbiAgcGFkZGluZy1yaWdodDogMC44MTI1ZW07XFxuICBmb250LXNpemU6IDFlbTtcXG4gIGJvcmRlci1yYWRpdXM6IDEuNjI1ZW07XFxuICBjb2xvcjogd2hpdGU7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBib3gtc2hhZG93OiAwIDAuMjVlbSAwLjVlbSByZ2JhKDAsIDAsIDAsIDAuMyk7XFxuICB0b3A6IC0wLjgxMjVlbTtcXG4gIGxlZnQ6IC0wLjgxMjVlbTtcXG5cIl0pKSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5hY2NlbnRDb2xvcjtcbn0pO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDM7XG52YXIgQ29udHJvbHMgPSBzdHlsZWQuZGl2KF90ZW1wbGF0ZU9iamVjdCQzIHx8IChfdGVtcGxhdGVPYmplY3QkMyA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgbWFyZ2luLXRvcDogMjRweDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG5cIl0pKSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkMjtcbnZhciBOYXZpZ2F0aW9uID0gc3R5bGVkLm5hdihfdGVtcGxhdGVPYmplY3QkMiB8fCAoX3RlbXBsYXRlT2JqZWN0JDIgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgY291bnRlci1yZXNldDogZG90O1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGZsZXgtd3JhcDogd3JhcDtcXG5cIl0pKSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkMTtcbnZhciBEb3QgPSBzdHlsZWQuYnV0dG9uKF90ZW1wbGF0ZU9iamVjdCQxIHx8IChfdGVtcGxhdGVPYmplY3QkMSA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBjb3VudGVyLWluY3JlbWVudDogZG90O1xcbiAgd2lkdGg6IDhweDtcXG4gIGhlaWdodDogOHB4O1xcbiAgYm9yZGVyOiBcIiwgXCI7XFxuXFxuICBib3JkZXItcmFkaXVzOiAxMDAlO1xcbiAgcGFkZGluZzogMDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luOiA0cHg7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MsIHRyYW5zZm9ybSAwLjNzO1xcbiAgY3Vyc29yOiBcIiwgXCI7XFxuICB0cmFuc2Zvcm06IHNjYWxlKFwiLCBcIik7XFxuXFxuICBjb2xvcjogXCIsIFwiO1xcbiAgYmFja2dyb3VuZDogXCIsIFwiO1xcblxcbiAgY29sb3I6IFwiLCBcIjtcXG4gIGJhY2tncm91bmQ6IFwiLCBcIjtcXG5cXG4gICY6YmVmb3JlIHtcXG4gICAgY29udGVudDogY291bnRlcihkb3QpO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogY2FsYygxMDAlICsgMC4yNWVtKTtcXG4gICAgbGVmdDogNTAlO1xcbiAgICBvcGFjaXR5OiAwO1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAxZW0pO1xcbiAgICB0cmFuc2l0aW9uOiAwLjNzO1xcbiAgICBkaXNwbGF5OiBcIiwgXCI7XFxuICB9XFxuXFxuICAmOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogY3VycmVudENvbG9yO1xcblxcbiAgICAmOmJlZm9yZSB7XFxuICAgICAgb3BhY2l0eTogMC41O1xcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC0ycHgpO1xcbiAgICB9XFxuICB9XFxuXCJdKSksIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuY3VycmVudCA9PT0gcHJvcHMuaW5kZXggPyAnMCcgOiAnMXB4IHNvbGlkICNjYWNjY2UnO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5kaXNhYmxlZCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcic7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmN1cnJlbnQgPT09IHByb3BzLmluZGV4ID8gMS4yNSA6IDE7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmN1cnJlbnQgPT09IHByb3BzLmluZGV4ID8gJ3ZhcigtLXJlYWN0b3VyLWFjY2VudCknIDogJyNjYWNjY2UnO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5jdXJyZW50ID09PSBwcm9wcy5pbmRleCA/ICd2YXIoLS1yZWFjdG91ci1hY2NlbnQpJyA6ICdub25lJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuY3VycmVudCA9PT0gcHJvcHMuaW5kZXggPyBwcm9wcy5hY2NlbnRDb2xvciA6ICcjY2FjY2NlJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuY3VycmVudCA9PT0gcHJvcHMuaW5kZXggPyBwcm9wcy5hY2NlbnRDb2xvciA6ICdub25lJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuc2hvd051bWJlciA/ICdibG9jaycgOiAnbm9uZSc7XG59KTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdDtcbnZhciBTdmdNYXNrV3JhcHBlciA9IHN0eWxlZC5kaXYoX3RlbXBsYXRlT2JqZWN0IHx8IChfdGVtcGxhdGVPYmplY3QgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgb3BhY2l0eTogXCIsIFwiO1xcbiAgY29sb3I6IFwiLCBcIjtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbGVmdDogMDtcXG4gIHRvcDogMDtcXG4gIGhlaWdodDogMTAwJTtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIHotaW5kZXg6IDk5OTk5O1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxuXCJdKSksIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gIXByb3BzLm1hc2tDbGFzc05hbWUgJiYgMC43O1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiAhcHJvcHMubWFza0NsYXNzTmFtZSAmJiAnIzAwMCc7XG59KTtcbmZ1bmN0aW9uIFN2Z01hc2soX3JlZikge1xuICB2YXIgd2luZG93V2lkdGggPSBfcmVmLndpbmRvd1dpZHRoLFxuICAgIHdpbmRvd0hlaWdodCA9IF9yZWYud2luZG93SGVpZ2h0LFxuICAgIHRhcmdldFdpZHRoID0gX3JlZi50YXJnZXRXaWR0aCxcbiAgICB0YXJnZXRIZWlnaHQgPSBfcmVmLnRhcmdldEhlaWdodCxcbiAgICB0YXJnZXRUb3AgPSBfcmVmLnRhcmdldFRvcCxcbiAgICB0YXJnZXRMZWZ0ID0gX3JlZi50YXJnZXRMZWZ0LFxuICAgIHBhZGRpbmcgPSBfcmVmLnBhZGRpbmcsXG4gICAgcm91bmRlZCA9IF9yZWYucm91bmRlZCxcbiAgICByb3VuZGVkU3RlcCA9IF9yZWYucm91bmRlZFN0ZXAsXG4gICAgZGlzYWJsZUludGVyYWN0aW9uID0gX3JlZi5kaXNhYmxlSW50ZXJhY3Rpb24sXG4gICAgZGlzYWJsZUludGVyYWN0aW9uQ2xhc3NOYW1lID0gX3JlZi5kaXNhYmxlSW50ZXJhY3Rpb25DbGFzc05hbWUsXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgb25DbGljayA9IF9yZWYub25DbGljayxcbiAgICBoaWdobGlnaHRlZEJvcmRlciA9IF9yZWYuaGlnaGxpZ2h0ZWRCb3JkZXI7XG4gIHZhciB3aWR0aCA9IHNhZmUodGFyZ2V0V2lkdGggKyBwYWRkaW5nICogMik7XG4gIHZhciBoZWlnaHQgPSBzYWZlKHRhcmdldEhlaWdodCArIHBhZGRpbmcgKiAyKTtcbiAgdmFyIHRvcCA9IHNhZmUodGFyZ2V0VG9wIC0gcGFkZGluZyk7XG4gIHZhciBsZWZ0ID0gc2FmZSh0YXJnZXRMZWZ0IC0gcGFkZGluZyk7XG4gIHZhciByb3VuZGVkUmFkaXVzID0gcm91bmRlZFN0ZXAgPyBNYXRoLm1pbih3aWR0aCAvIDIsIGhlaWdodCAvIDIpIDogcm91bmRlZDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN2Z01hc2tXcmFwcGVyLCB7XG4gICAgb25DbGljazogb25DbGljayxcbiAgICBtYXNrQ2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcIm1hc2tcIiwge1xuICAgIGlkOiBcIm1hc2stbWFpblwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogbGVmdCxcbiAgICB5OiB0b3AsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiBsZWZ0IC0gMSxcbiAgICB5OiB0b3AgLSAxLFxuICAgIHdpZHRoOiByb3VuZGVkUmFkaXVzLFxuICAgIGhlaWdodDogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogbGVmdCArIHJvdW5kZWRSYWRpdXMsXG4gICAgY3k6IHRvcCArIHJvdW5kZWRSYWRpdXMsXG4gICAgcjogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcImJsYWNrXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogbGVmdCArIHdpZHRoIC0gcm91bmRlZFJhZGl1cyArIDEsXG4gICAgeTogdG9wIC0gMSxcbiAgICB3aWR0aDogcm91bmRlZFJhZGl1cyxcbiAgICBoZWlnaHQ6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IGxlZnQgKyB3aWR0aCAtIHJvdW5kZWRSYWRpdXMsXG4gICAgY3k6IHRvcCArIHJvdW5kZWRSYWRpdXMsXG4gICAgcjogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcImJsYWNrXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogbGVmdCAtIDEsXG4gICAgeTogdG9wICsgaGVpZ2h0IC0gcm91bmRlZFJhZGl1cyArIDEsXG4gICAgd2lkdGg6IHJvdW5kZWRSYWRpdXMsXG4gICAgaGVpZ2h0OiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiBsZWZ0ICsgcm91bmRlZFJhZGl1cyxcbiAgICBjeTogdG9wICsgaGVpZ2h0IC0gcm91bmRlZFJhZGl1cyxcbiAgICByOiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiBsZWZ0ICsgd2lkdGggLSByb3VuZGVkUmFkaXVzICsgMSxcbiAgICB5OiB0b3AgKyBoZWlnaHQgLSByb3VuZGVkUmFkaXVzICsgMSxcbiAgICB3aWR0aDogcm91bmRlZFJhZGl1cyxcbiAgICBoZWlnaHQ6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IGxlZnQgKyB3aWR0aCAtIHJvdW5kZWRSYWRpdXMsXG4gICAgY3k6IHRvcCArIGhlaWdodCAtIHJvdW5kZWRSYWRpdXMsXG4gICAgcjogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcImJsYWNrIFwiXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjbGlwUGF0aFwiLCB7XG4gICAgaWQ6IFwiY2xpcC1wYXRoXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgd2lkdGg6IHdpbmRvd1dpZHRoLFxuICAgIGhlaWdodDogdG9wXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDAsXG4gICAgeTogdG9wLFxuICAgIHdpZHRoOiBsZWZ0LFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IHRhcmdldExlZnQgKyB0YXJnZXRXaWR0aCArIHBhZGRpbmcsXG4gICAgeTogdG9wLFxuICAgIHdpZHRoOiBzYWZlKHdpbmRvd1dpZHRoIC0gdGFyZ2V0V2lkdGggLSBsZWZ0KSxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiAwLFxuICAgIHk6IHRhcmdldFRvcCArIHRhcmdldEhlaWdodCArIHBhZGRpbmcsXG4gICAgd2lkdGg6IHdpbmRvd1dpZHRoLFxuICAgIGhlaWdodDogc2FmZSh3aW5kb3dIZWlnaHQgLSB0YXJnZXRIZWlnaHQgLSB0b3ApXG4gIH0pKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIG1hc2s6IFwidXJsKCNtYXNrLW1haW4pXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHdpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICBoZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIGNsaXBQYXRoOiBcInVybCgjY2xpcC1wYXRoKVwiLFxuICAgIHBvaW50ZXJFdmVudHM6IFwiYXV0b1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IGxlZnQsXG4gICAgeTogdG9wLFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICBwb2ludGVyRXZlbnRzOiBcImF1dG9cIixcbiAgICBmaWxsOiBcInRyYW5zcGFyZW50XCIsXG4gICAgZGlzcGxheTogZGlzYWJsZUludGVyYWN0aW9uID8gJ2Jsb2NrJyA6ICdub25lJyxcbiAgICBjbGFzc05hbWU6IGRpc2FibGVJbnRlcmFjdGlvbkNsYXNzTmFtZVxuICB9KSwgaGlnaGxpZ2h0ZWRCb3JkZXIgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiBzYWZlKGxlZnQgKyBoaWdobGlnaHRlZEJvcmRlci53aWR0aCAvIDIuMCksXG4gICAgeTogc2FmZSh0b3AgKyBoaWdobGlnaHRlZEJvcmRlci53aWR0aCAvIDIuMCksXG4gICAgd2lkdGg6IHNhZmUod2lkdGggLSBoaWdobGlnaHRlZEJvcmRlci53aWR0aCksXG4gICAgaGVpZ2h0OiBzYWZlKGhlaWdodCAtIGhpZ2hsaWdodGVkQm9yZGVyLndpZHRoKSxcbiAgICBwb2ludGVyRXZlbnRzOiBcImF1dG9cIixcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBzdHJva2VXaWR0aDogaGlnaGxpZ2h0ZWRCb3JkZXIud2lkdGgsXG4gICAgc3Ryb2tlOiBoaWdobGlnaHRlZEJvcmRlci5jb2xvcixcbiAgICByeDogcm91bmRlZFJhZGl1cyAtIDJcbiAgfSkpKTtcbn1cblN2Z01hc2sucHJvcFR5cGVzID0ge1xuICB3aW5kb3dXaWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB3aW5kb3dIZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdGFyZ2V0V2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdGFyZ2V0SGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHRhcmdldFRvcDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB0YXJnZXRMZWZ0OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHBhZGRpbmc6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcm91bmRlZDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICByb3VuZGVkU3RlcDogUHJvcFR5cGVzLmJvb2wsXG4gIGRpc2FibGVJbnRlcmFjdGlvbjogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgZGlzYWJsZUludGVyYWN0aW9uQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIGhpZ2hsaWdodGVkQm9yZGVyOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZFxuICB9KVxufTtcblxudmFyIFJlYWN0b3VyUmVzaXplT2JzZXJ2ZXIgPSAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyIHN0ZXAgPSBfcmVmLnN0ZXAsXG4gICAgcmVmcmVzaCA9IF9yZWYucmVmcmVzaDtcbiAgdmFyIF91c2VTdGF0ZSA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUsIDIpLFxuICAgIG11dGF0aW9uc0NvdW50ZXIgPSBfdXNlU3RhdGUyWzBdLFxuICAgIHNldE11dGF0aW9uc0NvdW50ZXIgPSBfdXNlU3RhdGUyWzFdO1xuXG4gIC8vIG9ubHkgdXNlIHRvIG5vdGlmeSBtYWluIGxvZ2ljIGJlbG93XG4gIC8vIHRoYXQgYSByZXNpemVPYnNlcnZhYmxlIGhhcyBiZWVuIGFkZGVkIHRvIERPTSAob3IgcmVtb3ZlZCBmcm9tIGl0KVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3RlcC5yZXNpemVPYnNlcnZhYmxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5jcmVtZW50TXV0YXRpb25zQ291bnRlcklmT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIGluY3JlbWVudE11dGF0aW9uc0NvdW50ZXJJZk9ic2VydmFibGUobm9kZXMpIHtcbiAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihub2RlcyksXG4gICAgICAgIF9zdGVwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAgICAgdmFyIG5vZGUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAoIW5vZGUuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgcmV0dXJuIDE7IC8vIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBmb3VuZCA9IHN0ZXAucmVzaXplT2JzZXJ2YWJsZXMuZmluZChmdW5jdGlvbiAob2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWF0Y2hlcyhvYnNlcnZhYmxlKSB8fCBub2RlLnF1ZXJ5U2VsZWN0b3Iob2JzZXJ2YWJsZSkgIT0gbnVsbDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIHNldE11dGF0aW9uc0NvdW50ZXIobXV0YXRpb25zQ291bnRlciArIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICBpZiAoX2xvb3AoKSkgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dGF0aW9uc0xpc3QpIHtcbiAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobXV0YXRpb25zTGlzdCksXG4gICAgICAgIF9zdGVwMjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIG11dGF0aW9uID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgIGlmICgwICE9PSBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgaW5jcmVtZW50TXV0YXRpb25zQ291bnRlcklmT2JzZXJ2YWJsZShtdXRhdGlvbi5hZGRlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDAgIT09IG11dGF0aW9uLnJlbW92ZWROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGluY3JlbWVudE11dGF0aW9uc0NvdW50ZXJJZk9ic2VydmFibGUobXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBvYnNlcnZhYmxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHk7XG4gICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIHN1YnRyZWU6IHRydWVcbiAgICB9O1xuICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShvYnNlcnZhYmxlLCBjb25maWcpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9LCBbc3RlcCwgbXV0YXRpb25zQ291bnRlcl0pO1xuXG4gIC8vIHRoZSBtYWluIGxvZ2ljIGlzIGhlcmVcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN0ZXAucmVzaXplT2JzZXJ2YWJsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgICByZWZyZXNoKCk7XG4gICAgfSk7XG4gICAgdmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzdGVwLnJlc2l6ZU9ic2VydmFibGVzKSxcbiAgICAgIF9zdGVwMztcbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IzLnMoKTsgIShfc3RlcDMgPSBfaXRlcmF0b3IzLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBfc3RlcDMudmFsdWU7XG4gICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvYnNlcnZhYmxlKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IzLmUoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX2l0ZXJhdG9yMy5mKCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfSwgW3N0ZXAsIG11dGF0aW9uc0NvdW50ZXJdKTtcbiAgcmV0dXJuIG51bGw7XG59KTtcblxudmFyIFJlYWN0b3VyTXV0YXRpb25PYnNlcnZlciA9IChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgc3RlcCA9IF9yZWYuc3RlcCxcbiAgICByZWZyZXNoID0gX3JlZi5yZWZyZXNoO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3RlcC5tdXRhdGlvbk9ic2VydmFibGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByZWZyZXNoSGlnaGxpZ2h0ZWRSZWdpb25JZk9ic2VydmFibGUgPSBmdW5jdGlvbiByZWZyZXNoSGlnaGxpZ2h0ZWRSZWdpb25JZk9ic2VydmFibGUobm9kZXMpIHtcbiAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihub2RlcyksXG4gICAgICAgIF9zdGVwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAgICAgdmFyIG5vZGUgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAoIW5vZGUuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgcmV0dXJuIDE7IC8vIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBmb3VuZCA9IHN0ZXAubXV0YXRpb25PYnNlcnZhYmxlcy5maW5kKGZ1bmN0aW9uIChvYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5tYXRjaGVzKG9ic2VydmFibGUpIHx8IG5vZGUucXVlcnlTZWxlY3RvcihvYnNlcnZhYmxlKSAhPSBudWxsO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgcmVmcmVzaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICBpZiAoX2xvb3AoKSkgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dGF0aW9uc0xpc3QpIHtcbiAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobXV0YXRpb25zTGlzdCksXG4gICAgICAgIF9zdGVwMjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIG11dGF0aW9uID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgIGlmICgwICE9PSBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVmcmVzaEhpZ2hsaWdodGVkUmVnaW9uSWZPYnNlcnZhYmxlKG11dGF0aW9uLmFkZGVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoMCAhPT0gbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVmcmVzaEhpZ2hsaWdodGVkUmVnaW9uSWZPYnNlcnZhYmxlKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IyLmYoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgb2JzZXJ2YWJsZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5O1xuICAgIHZhciBjb25maWcgPSB7XG4gICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgfTtcbiAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUob2JzZXJ2YWJsZSwgY29uZmlnKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfSwgW3N0ZXBdKTtcbiAgcmV0dXJuIG51bGw7XG59KTtcblxuZnVuY3Rpb24gUG9ydGFsKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIHJlZiA9IHVzZVJlZihudWxsKTtcbiAgaWYgKHJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgcmVmLmN1cnJlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICByZWYuY3VycmVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ19fX3JlYWN0b3VyJyk7XG4gIH1cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHJlZi5jdXJyZW50KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChyZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW3JlZl0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL2NyZWF0ZVBvcnRhbChjaGlsZHJlbiwgcmVmLmN1cnJlbnQpO1xufVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBkaXNhYmxlRm9jdXNMb2NrOiBQcm9wVHlwZXMuYm9vbCxcbiAgYmFkZ2VDb250ZW50OiBQcm9wVHlwZXMuZnVuYyxcbiAgaGlnaGxpZ2h0ZWRNYXNrQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm5vZGUsIFByb3BUeXBlcy5lbGVtZW50XSksXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2xvc2VCdXR0b25BcmlhTGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNsb3NlV2l0aE1hc2s6IFByb3BUeXBlcy5ib29sLFxuICBpblZpZXdUaHJlc2hvbGQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIGlzT3BlbjogUHJvcFR5cGVzLmJvb2wuaXNSZXF1aXJlZCxcbiAgbGFzdFN0ZXBOZXh0QnV0dG9uOiBQcm9wVHlwZXMubm9kZSxcbiAgbWFza0NsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgbWFza1NwYWNlOiBQcm9wVHlwZXMubnVtYmVyLFxuICBuZXh0QnV0dG9uOiBQcm9wVHlwZXMubm9kZSxcbiAgb25BZnRlck9wZW46IFByb3BUeXBlcy5mdW5jLFxuICBvbkJlZm9yZUNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25SZXF1ZXN0Q2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuICBwcmV2QnV0dG9uOiBQcm9wVHlwZXMubm9kZSxcbiAgc2Nyb2xsRHVyYXRpb246IFByb3BUeXBlcy5udW1iZXIsXG4gIHNjcm9sbE9mZnNldDogUHJvcFR5cGVzLm51bWJlcixcbiAgc2hvd0J1dHRvbnM6IFByb3BUeXBlcy5ib29sLFxuICBzaG93Q2xvc2VCdXR0b246IFByb3BUeXBlcy5ib29sLFxuICBzaG93TmF2aWdhdGlvbjogUHJvcFR5cGVzLmJvb2wsXG4gIHNob3dOYXZpZ2F0aW9uTnVtYmVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgc2hvd051bWJlcjogUHJvcFR5cGVzLmJvb2wsXG4gIHN0YXJ0QXQ6IFByb3BUeXBlcy5udW1iZXIsXG4gIGdvVG9TdGVwOiBQcm9wVHlwZXMubnVtYmVyLFxuICBnZXRDdXJyZW50U3RlcDogUHJvcFR5cGVzLmZ1bmMsXG4gIG5leHRTdGVwOiBQcm9wVHlwZXMuZnVuYyxcbiAgcHJldlN0ZXA6IFByb3BUeXBlcy5mdW5jLFxuICBzdGVwczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBzZWxlY3RvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjb250ZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubm9kZSwgUHJvcFR5cGVzLmVsZW1lbnQsIFByb3BUeXBlcy5mdW5jXSkuaXNSZXF1aXJlZCxcbiAgICBwb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm51bWJlciksIFByb3BUeXBlcy5vbmVPZihbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCcsICdjZW50ZXInXSldKSxcbiAgICBhY3Rpb246IFByb3BUeXBlcy5mdW5jLFxuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHN0ZXBJbnRlcmFjdGlvbjogUHJvcFR5cGVzLmJvb2wsXG4gICAgbmF2RG90QXJpYUxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHJvdW5kZWRTdGVwOiBQcm9wVHlwZXMuYm9vbFxuICB9KSksXG4gIHVwZGF0ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgdXBkYXRlRGVsYXk6IFByb3BUeXBlcy5udW1iZXIsXG4gIGRpc2FibGVJbnRlcmFjdGlvbjogUHJvcFR5cGVzLmJvb2wsXG4gIGRpc2FibGVEb3RzTmF2aWdhdGlvbjogUHJvcFR5cGVzLmJvb2wsXG4gIGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vbmVPZihbJ2VzYycsICdyaWdodCcsICdsZWZ0J10pKSwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgcm91bmRlZDogUHJvcFR5cGVzLm51bWJlcixcbiAgYWNjZW50Q29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGhpZ2hsaWdodGVkQm9yZGVyOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGNvbG9yOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZFxuICB9KVxufTtcbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGRpc2FibGVGb2N1c0xvY2s6IGZhbHNlLFxuICBzaG93TmF2aWdhdGlvbjogdHJ1ZSxcbiAgc2hvd05hdmlnYXRpb25OdW1iZXI6IHRydWUsXG4gIHNob3dCdXR0b25zOiB0cnVlLFxuICBzaG93Q2xvc2VCdXR0b246IHRydWUsXG4gIGNsb3NlQnV0dG9uQXJpYUxhYmVsOiAnQ2xvc2UnLFxuICBzaG93TnVtYmVyOiB0cnVlLFxuICBzY3JvbGxEdXJhdGlvbjogMSxcbiAgbWFza1NwYWNlOiAxMCxcbiAgdXBkYXRlRGVsYXk6IDEsXG4gIGRpc2FibGVJbnRlcmFjdGlvbjogZmFsc2UsXG4gIHJvdW5kZWQ6IDAsXG4gIGFjY2VudENvbG9yOiAnIzAwN2FmZicsXG4gIGNsb3NlV2l0aE1hc2s6IHRydWVcbn07XG5cbnZhciBDTiA9IHtcbiAgbWFzazoge1xuICAgIGJhc2U6ICdyZWFjdG91cl9fbWFzaycsXG4gICAgaXNPcGVuOiAncmVhY3RvdXJfX21hc2stLWlzLW9wZW4nLFxuICAgIGRpc2FibGVJbnRlcmFjdGlvbjogJ3JlYWN0b3VyX19tYXNrLS1kaXNhYmxlLWludGVyYWN0aW9uJ1xuICB9LFxuICBoZWxwZXI6IHtcbiAgICBiYXNlOiAncmVhY3RvdXJfX2hlbHBlcicsXG4gICAgaXNPcGVuOiAncmVhY3RvdXJfX2hlbHBlci0taXMtb3BlbidcbiAgfSxcbiAgZG90OiB7XG4gICAgYmFzZTogJ3JlYWN0b3VyX19kb3QnLFxuICAgIGFjdGl2ZTogJ3JlYWN0b3VyX19kb3QtLWlzLWFjdGl2ZSdcbiAgfVxufTtcblxudmFyIFRvdXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgZnVuY3Rpb24gVG91cigpIHtcbiAgICB2YXIgX3RoaXM7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRvdXIpO1xuICAgIF90aGlzID0gX2NhbGxTdXBlcih0aGlzLCBUb3VyKTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwidW5sb2NrRm9jdXNcIiwgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzVW5sb2NrZWQ6IHRydWVcbiAgICAgIH0sIGNhbGxiYWNrKCkpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJzaG93U3RlcFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLmhlbHBlciB8fCAhX3RoaXMuaGVscGVyLmN1cnJlbnQpIHJldHVybjtcbiAgICAgIHZhciBzdGVwcyA9IF90aGlzLnByb3BzLnN0ZXBzO1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gX3RoaXMuc3RhdGUsXG4gICAgICAgIGN1cnJlbnQgPSBfdGhpcyRzdGF0ZS5jdXJyZW50LFxuICAgICAgICBmb2N1c1VubG9ja2VkID0gX3RoaXMkc3RhdGUuZm9jdXNVbmxvY2tlZDtcbiAgICAgIGlmIChmb2N1c1VubG9ja2VkKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBmb2N1c1VubG9ja2VkOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBzdGVwID0gc3RlcHNbY3VycmVudF07XG4gICAgICB2YXIgbm9kZSA9IHN0ZXAuc2VsZWN0b3IgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHN0ZXAuc2VsZWN0b3IpIDogbnVsbDtcbiAgICAgIHZhciBzdGVwQ2FsbGJhY2sgPSBmdW5jdGlvbiBzdGVwQ2FsbGJhY2sobykge1xuICAgICAgICBpZiAoc3RlcC5hY3Rpb24gJiYgdHlwZW9mIHN0ZXAuYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgX3RoaXMudW5sb2NrRm9jdXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAuYWN0aW9uKG8pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKHN0ZXAub2JzZXJ2ZSkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzdGVwLm9ic2VydmUpO1xuICAgICAgICB2YXIgY29uZmlnID0ge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgIGlmIChwcmV2U3RhdGUub2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBwcmV2U3RhdGUub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvYnNlcnZlcjogbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dGF0aW9ucykge1xuICAgICAgICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobXV0YXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY2IgPSBmdW5jdGlvbiBjYigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXBDYWxsYmFjayhtdXRhdGlvbi5hZGRlZE5vZGVzWzBdKTtcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNhbGN1bGF0ZU5vZGUobXV0YXRpb24uYWRkZWROb2Rlc1swXSwgc3RlcCwgY2IpO1xuICAgICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIG11dGF0aW9uLnJlbW92ZWROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgX2NiID0gZnVuY3Rpb24gX2NiKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcENhbGxiYWNrKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIF90aGlzLmNhbGN1bGF0ZU5vZGUobm9kZSwgc3RlcCwgX2NiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9O1xuICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLnN0YXRlLm9ic2VydmVyLm9ic2VydmUodGFyZ2V0LCBjb25maWcpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfdGhpcy5zdGF0ZS5vYnNlcnZlcikge1xuICAgICAgICAgIF90aGlzLnN0YXRlLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBvYnNlcnZlcjogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICB2YXIgY2IgPSBmdW5jdGlvbiBjYigpIHtcbiAgICAgICAgICByZXR1cm4gc3RlcENhbGxiYWNrKG5vZGUpO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5jYWxjdWxhdGVOb2RlKG5vZGUsIHN0ZXAsIGNiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHNldE5vZGVTdGF0ZShudWxsLCBzdGVwLCBfdGhpcy5oZWxwZXIuY3VycmVudCksIHN0ZXBDYWxsYmFjayk7XG4gICAgICAgIHN0ZXAuc2VsZWN0b3IgJiYgY29uc29sZS53YXJuKFwiRG9lc24ndCBmaW5kIGEgRE9NIG5vZGUgJ1wiLmNvbmNhdChzdGVwLnNlbGVjdG9yLCBcIicuIFBsZWFzZSBjaGVjayB0aGUgJ3N0ZXBzJyBUb3VyIHByb3AgQXJyYXkgYXQgcG9zaXRpb24gXCIpLmNvbmNhdChjdXJyZW50LCBcIi5cIikpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJjYWxjdWxhdGVOb2RlXCIsIGZ1bmN0aW9uIChub2RlLCBzdGVwLCBjYikge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHNjcm9sbER1cmF0aW9uID0gX3RoaXMkcHJvcHMuc2Nyb2xsRHVyYXRpb24sXG4gICAgICAgIGluVmlld1RocmVzaG9sZCA9IF90aGlzJHByb3BzLmluVmlld1RocmVzaG9sZCxcbiAgICAgICAgc2Nyb2xsT2Zmc2V0ID0gX3RoaXMkcHJvcHMuc2Nyb2xsT2Zmc2V0O1xuICAgICAgdmFyIGF0dHJzID0gZ2V0SGlnaGxpZ2h0ZWRSZWN0KG5vZGUsIHN0ZXApO1xuICAgICAgdmFyIHcgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xuICAgICAgdmFyIGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG4gICAgICBpZiAoIWluVmlldyhfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgYXR0cnMpLCB7fSwge1xuICAgICAgICB3OiB3LFxuICAgICAgICBoOiBoLFxuICAgICAgICB0aHJlc2hvbGQ6IGluVmlld1RocmVzaG9sZFxuICAgICAgfSkpKSB7XG4gICAgICAgIHZhciBwYXJlbnRTY3JvbGwgPSBTY3JvbGxwYXJlbnQobm9kZSk7XG4gICAgICAgIHZhciBvZmZzZXQgPSBzY3JvbGxPZmZzZXQgPyBzY3JvbGxPZmZzZXQgOiBhdHRycy5oZWlnaHQgPiBoID8gLTI1IDogLShoIC8gMikgKyBhdHRycy5oZWlnaHQgLyAyO1xuICAgICAgICBzY3JvbGxTbW9vdGgudG8obm9kZSwge1xuICAgICAgICAgIGNvbnRleHQ6IGlzQm9keShwYXJlbnRTY3JvbGwpID8gd2luZG93IDogcGFyZW50U2Nyb2xsLFxuICAgICAgICAgIGR1cmF0aW9uOiBzY3JvbGxEdXJhdGlvbixcbiAgICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobmQpIHtcbiAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHNldE5vZGVTdGF0ZShuZCwgc3RlcCwgX3RoaXMuaGVscGVyLmN1cnJlbnQpLCBjYik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHNldE5vZGVTdGF0ZShub2RlLCBzdGVwLCBfdGhpcy5oZWxwZXIuY3VycmVudCksIGNiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwicmVjYWxjdWxhdGVOb2RlXCIsIGZ1bmN0aW9uIChzdGVwKSB7XG4gICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc3RlcC5zZWxlY3Rvcik7XG4gICAgICB2YXIgc3RlcENhbGxiYWNrID0gZnVuY3Rpb24gc3RlcENhbGxiYWNrKG8pIHtcbiAgICAgICAgaWYgKHN0ZXAuYWN0aW9uICYmIHR5cGVvZiBzdGVwLmFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIF90aGlzLnVubG9ja0ZvY3VzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwLmFjdGlvbihvKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIF90aGlzLmNhbGN1bGF0ZU5vZGUobm9kZSwgc3RlcCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc3RlcENhbGxiYWNrKG5vZGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcIm1hc2tDbGlja0hhbmRsZXJcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgY2xvc2VXaXRoTWFzayA9IF90aGlzJHByb3BzMi5jbG9zZVdpdGhNYXNrLFxuICAgICAgICBvblJlcXVlc3RDbG9zZSA9IF90aGlzJHByb3BzMi5vblJlcXVlc3RDbG9zZTtcbiAgICAgIGlmIChjbG9zZVdpdGhNYXNrICYmICFlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ04ubWFzay5kaXNhYmxlSW50ZXJhY3Rpb24pKSB7XG4gICAgICAgIG9uUmVxdWVzdENsb3NlKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJuZXh0U3RlcFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHN0ZXBzID0gX3RoaXMkcHJvcHMzLnN0ZXBzLFxuICAgICAgICBnZXRDdXJyZW50U3RlcCA9IF90aGlzJHByb3BzMy5nZXRDdXJyZW50U3RlcDtcbiAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgdmFyIG5leHRTdGVwID0gcHJldlN0YXRlLmN1cnJlbnQgPCBzdGVwcy5sZW5ndGggLSAxID8gcHJldlN0YXRlLmN1cnJlbnQgKyAxIDogcHJldlN0YXRlLmN1cnJlbnQ7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0Q3VycmVudFN0ZXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBnZXRDdXJyZW50U3RlcChuZXh0U3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjdXJyZW50OiBuZXh0U3RlcFxuICAgICAgICB9O1xuICAgICAgfSwgX3RoaXMuc2hvd1N0ZXApO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJwcmV2U3RlcFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZ2V0Q3VycmVudFN0ZXAgPSBfdGhpcy5wcm9wcy5nZXRDdXJyZW50U3RlcDtcbiAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgdmFyIG5leHRTdGVwID0gcHJldlN0YXRlLmN1cnJlbnQgPiAwID8gcHJldlN0YXRlLmN1cnJlbnQgLSAxIDogcHJldlN0YXRlLmN1cnJlbnQ7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0Q3VycmVudFN0ZXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBnZXRDdXJyZW50U3RlcChuZXh0U3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjdXJyZW50OiBuZXh0U3RlcFxuICAgICAgICB9O1xuICAgICAgfSwgX3RoaXMuc2hvd1N0ZXApO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJnb3RvU3RlcFwiLCBmdW5jdGlvbiAobikge1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IF90aGlzLnByb3BzLFxuICAgICAgICBzdGVwcyA9IF90aGlzJHByb3BzNC5zdGVwcyxcbiAgICAgICAgZ2V0Q3VycmVudFN0ZXAgPSBfdGhpcyRwcm9wczQuZ2V0Q3VycmVudFN0ZXA7XG4gICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBuZXh0U3RlcCA9IHN0ZXBzW25dID8gbiA6IHByZXZTdGF0ZS5jdXJyZW50O1xuICAgICAgICBpZiAodHlwZW9mIGdldEN1cnJlbnRTdGVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2V0Q3VycmVudFN0ZXAobmV4dFN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY3VycmVudDogbmV4dFN0ZXBcbiAgICAgICAgfTtcbiAgICAgIH0sIF90aGlzLnNob3dTdGVwKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwia2V5RG93bkhhbmRsZXJcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczUgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2UgPSBfdGhpcyRwcm9wczUub25SZXF1ZXN0Q2xvc2UsXG4gICAgICAgIG5leHRTdGVwID0gX3RoaXMkcHJvcHM1Lm5leHRTdGVwLFxuICAgICAgICBwcmV2U3RlcCA9IF90aGlzJHByb3BzNS5wcmV2U3RlcCxcbiAgICAgICAgZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbiA9IF90aGlzJHByb3BzNS5kaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmIChkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBpc0VzY0Rpc2FibGVkLCBpc1JpZ2h0RGlzYWJsZWQsIGlzTGVmdERpc2FibGVkO1xuICAgICAgaWYgKGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb24pIHtcbiAgICAgICAgaXNFc2NEaXNhYmxlZCA9IGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb24uaW5jbHVkZXMoJ2VzYycpO1xuICAgICAgICBpc1JpZ2h0RGlzYWJsZWQgPSBkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uLmluY2x1ZGVzKCdyaWdodCcpO1xuICAgICAgICBpc0xlZnREaXNhYmxlZCA9IGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb24uaW5jbHVkZXMoJ2xlZnQnKTtcbiAgICAgIH1cbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDI3ICYmICFpc0VzY0Rpc2FibGVkKSB7XG4gICAgICAgIC8vIGVzY1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9uUmVxdWVzdENsb3NlKCk7XG4gICAgICB9XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSAzOSAmJiAhaXNSaWdodERpc2FibGVkKSB7XG4gICAgICAgIC8vIHJpZ2h0XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdHlwZW9mIG5leHRTdGVwID09PSAnZnVuY3Rpb24nID8gbmV4dFN0ZXAoKSA6IF90aGlzLm5leHRTdGVwKCk7XG4gICAgICB9XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSAzNyAmJiAhaXNMZWZ0RGlzYWJsZWQpIHtcbiAgICAgICAgLy8gbGVmdFxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHR5cGVvZiBwcmV2U3RlcCA9PT0gJ2Z1bmN0aW9uJyA/IHByZXZTdGVwKCkgOiBfdGhpcy5wcmV2U3RlcCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgaXNPcGVuOiBmYWxzZSxcbiAgICAgIGN1cnJlbnQ6IDAsXG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIHc6IDAsXG4gICAgICBoOiAwLFxuICAgICAgaW5ET006IGZhbHNlLFxuICAgICAgb2JzZXJ2ZXI6IG51bGwsXG4gICAgICBmb2N1c1VubG9ja2VkOiBmYWxzZVxuICAgIH07XG4gICAgX3RoaXMuaGVscGVyID0gLyojX19QVVJFX18qL2NyZWF0ZVJlZigpO1xuICAgIF90aGlzLmhlbHBlckVsZW1lbnQgPSBudWxsO1xuICAgIF90aGlzLmRlYm91bmNlZFNob3dTdGVwID0gZGVib3VuY2UoX3RoaXMuc2hvd1N0ZXAsIDcwKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgX2luaGVyaXRzKFRvdXIsIF9Db21wb25lbnQpO1xuICByZXR1cm4gX2NyZWF0ZUNsYXNzKFRvdXIsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGlzT3BlbiA9IF90aGlzJHByb3BzNi5pc09wZW4sXG4gICAgICAgIHN0YXJ0QXQgPSBfdGhpcyRwcm9wczYuc3RhcnRBdDtcbiAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgdGhpcy5vcGVuKHN0YXJ0QXQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczcgPSB0aGlzLnByb3BzLFxuICAgICAgICBpc09wZW4gPSBfdGhpcyRwcm9wczcuaXNPcGVuLFxuICAgICAgICB1cGRhdGUgPSBfdGhpcyRwcm9wczcudXBkYXRlLFxuICAgICAgICB1cGRhdGVEZWxheSA9IF90aGlzJHByb3BzNy51cGRhdGVEZWxheTtcbiAgICAgIGlmICghaXNPcGVuICYmIG5leHRQcm9wcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5vcGVuKG5leHRQcm9wcy5zdGFydEF0KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPcGVuICYmICFuZXh0UHJvcHMuaXNPcGVuKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc09wZW4gJiYgdXBkYXRlICE9PSBuZXh0UHJvcHMudXBkYXRlKSB7XG4gICAgICAgIGlmIChuZXh0UHJvcHMuc3RlcHNbdGhpcy5zdGF0ZS5jdXJyZW50XSkge1xuICAgICAgICAgIHNldFRpbWVvdXQodGhpcy5zaG93U3RlcCwgdXBkYXRlRGVsYXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucHJvcHMub25SZXF1ZXN0Q2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzT3BlbiAmJiBuZXh0UHJvcHMuaXNPcGVuICYmIHRoaXMuc3RhdGUuY3VycmVudCAhPT0gbmV4dFByb3BzLmdvVG9TdGVwKSB7XG4gICAgICAgIHRoaXMuZ290b1N0ZXAobmV4dFByb3BzLmdvVG9TdGVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB2YXIgaXNPcGVuID0gdGhpcy5wcm9wcy5pc09wZW47XG4gICAgICBpZiAoaXNPcGVuKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXRlLm9ic2VydmVyKSB7XG4gICAgICAgIHRoaXMuc3RhdGUub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvcGVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9wZW4oc3RhcnRBdCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICB2YXIgb25BZnRlck9wZW4gPSB0aGlzLnByb3BzLm9uQWZ0ZXJPcGVuO1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgICAgIGN1cnJlbnQ6IHN0YXJ0QXQgIT09IHVuZGVmaW5lZCA/IHN0YXJ0QXQgOiBwcmV2U3RhdGUuY3VycmVudFxuICAgICAgICB9O1xuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRUaW1lb3V0KF90aGlzMi5zaG93U3RlcCwgMSk7XG4gICAgICAgIF90aGlzMi5oZWxwZXJFbGVtZW50ID0gX3RoaXMyLmhlbHBlci5jdXJyZW50O1xuICAgICAgICBpZiAoIV90aGlzMi5wcm9wcy5kaXNhYmxlRm9jdXNMb2NrKSBfdGhpczIuaGVscGVyLmN1cnJlbnQuZm9jdXMoKTtcbiAgICAgICAgaWYgKG9uQWZ0ZXJPcGVuKSB7XG4gICAgICAgICAgb25BZnRlck9wZW4oX3RoaXMyLmhlbHBlckVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmRlYm91bmNlZFNob3dTdGVwLCBmYWxzZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5RG93bkhhbmRsZXIsIGZhbHNlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgaWYgKHByZXZTdGF0ZS5vYnNlcnZlcikge1xuICAgICAgICAgIHByZXZTdGF0ZS5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc09wZW46IGZhbHNlLFxuICAgICAgICAgIG9ic2VydmVyOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9LCB0aGlzLm9uQmVmb3JlQ2xvc2UpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuZGVib3VuY2VkU2hvd1N0ZXApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleURvd25IYW5kbGVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25CZWZvcmVDbG9zZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkJlZm9yZUNsb3NlKCkge1xuICAgICAgdmFyIG9uQmVmb3JlQ2xvc2UgPSB0aGlzLnByb3BzLm9uQmVmb3JlQ2xvc2U7XG4gICAgICBpZiAob25CZWZvcmVDbG9zZSkge1xuICAgICAgICBvbkJlZm9yZUNsb3NlKHRoaXMuaGVscGVyRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcbiAgICAgIHZhciBfdGhpcyRwcm9wczggPSB0aGlzLnByb3BzLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczguY2xhc3NOYW1lLFxuICAgICAgICBzdGVwcyA9IF90aGlzJHByb3BzOC5zdGVwcyxcbiAgICAgICAgbWFza0NsYXNzTmFtZSA9IF90aGlzJHByb3BzOC5tYXNrQ2xhc3NOYW1lLFxuICAgICAgICBzaG93QnV0dG9ucyA9IF90aGlzJHByb3BzOC5zaG93QnV0dG9ucyxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uID0gX3RoaXMkcHJvcHM4LnNob3dDbG9zZUJ1dHRvbixcbiAgICAgICAgY2xvc2VCdXR0b25BcmlhTGFiZWwgPSBfdGhpcyRwcm9wczguY2xvc2VCdXR0b25BcmlhTGFiZWwsXG4gICAgICAgIHNob3dOYXZpZ2F0aW9uID0gX3RoaXMkcHJvcHM4LnNob3dOYXZpZ2F0aW9uLFxuICAgICAgICBzaG93TmF2aWdhdGlvbk51bWJlciA9IF90aGlzJHByb3BzOC5zaG93TmF2aWdhdGlvbk51bWJlcixcbiAgICAgICAgc2hvd051bWJlciA9IF90aGlzJHByb3BzOC5zaG93TnVtYmVyLFxuICAgICAgICBvblJlcXVlc3RDbG9zZSA9IF90aGlzJHByb3BzOC5vblJlcXVlc3RDbG9zZSxcbiAgICAgICAgbWFza1NwYWNlID0gX3RoaXMkcHJvcHM4Lm1hc2tTcGFjZSxcbiAgICAgICAgbGFzdFN0ZXBOZXh0QnV0dG9uID0gX3RoaXMkcHJvcHM4Lmxhc3RTdGVwTmV4dEJ1dHRvbixcbiAgICAgICAgbmV4dEJ1dHRvbiA9IF90aGlzJHByb3BzOC5uZXh0QnV0dG9uLFxuICAgICAgICBwcmV2QnV0dG9uID0gX3RoaXMkcHJvcHM4LnByZXZCdXR0b24sXG4gICAgICAgIGJhZGdlQ29udGVudCA9IF90aGlzJHByb3BzOC5iYWRnZUNvbnRlbnQsXG4gICAgICAgIGhpZ2hsaWdodGVkTWFza0NsYXNzTmFtZSA9IF90aGlzJHByb3BzOC5oaWdobGlnaHRlZE1hc2tDbGFzc05hbWUsXG4gICAgICAgIGRpc2FibGVJbnRlcmFjdGlvbiA9IF90aGlzJHByb3BzOC5kaXNhYmxlSW50ZXJhY3Rpb24sXG4gICAgICAgIGRpc2FibGVEb3RzTmF2aWdhdGlvbiA9IF90aGlzJHByb3BzOC5kaXNhYmxlRG90c05hdmlnYXRpb24sXG4gICAgICAgIG5leHRTdGVwID0gX3RoaXMkcHJvcHM4Lm5leHRTdGVwLFxuICAgICAgICBwcmV2U3RlcCA9IF90aGlzJHByb3BzOC5wcmV2U3RlcCxcbiAgICAgICAgcm91bmRlZCA9IF90aGlzJHByb3BzOC5yb3VuZGVkLFxuICAgICAgICBhY2NlbnRDb2xvciA9IF90aGlzJHByb3BzOC5hY2NlbnRDb2xvcixcbiAgICAgICAgQ3VzdG9tSGVscGVyID0gX3RoaXMkcHJvcHM4LkN1c3RvbUhlbHBlcixcbiAgICAgICAgZGlzYWJsZUZvY3VzTG9jayA9IF90aGlzJHByb3BzOC5kaXNhYmxlRm9jdXNMb2NrLFxuICAgICAgICBoaWdobGlnaHRlZEJvcmRlciA9IF90aGlzJHByb3BzOC5oaWdobGlnaHRlZEJvcmRlcjtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTIgPSB0aGlzLnN0YXRlLFxuICAgICAgICBpc09wZW4gPSBfdGhpcyRzdGF0ZTIuaXNPcGVuLFxuICAgICAgICBjdXJyZW50ID0gX3RoaXMkc3RhdGUyLmN1cnJlbnQsXG4gICAgICAgIGluRE9NID0gX3RoaXMkc3RhdGUyLmluRE9NLFxuICAgICAgICB0YXJnZXRUb3AgPSBfdGhpcyRzdGF0ZTIudG9wLFxuICAgICAgICB0YXJnZXRSaWdodCA9IF90aGlzJHN0YXRlMi5yaWdodCxcbiAgICAgICAgdGFyZ2V0Qm90dG9tID0gX3RoaXMkc3RhdGUyLmJvdHRvbSxcbiAgICAgICAgdGFyZ2V0TGVmdCA9IF90aGlzJHN0YXRlMi5sZWZ0LFxuICAgICAgICB0YXJnZXRXaWR0aCA9IF90aGlzJHN0YXRlMi53aWR0aCxcbiAgICAgICAgdGFyZ2V0SGVpZ2h0ID0gX3RoaXMkc3RhdGUyLmhlaWdodCxcbiAgICAgICAgd2luZG93V2lkdGggPSBfdGhpcyRzdGF0ZTIudyxcbiAgICAgICAgd2luZG93SGVpZ2h0ID0gX3RoaXMkc3RhdGUyLmgsXG4gICAgICAgIGhlbHBlcldpZHRoID0gX3RoaXMkc3RhdGUyLmhlbHBlcldpZHRoLFxuICAgICAgICBoZWxwZXJIZWlnaHQgPSBfdGhpcyRzdGF0ZTIuaGVscGVySGVpZ2h0LFxuICAgICAgICBoZWxwZXJQb3NpdGlvbiA9IF90aGlzJHN0YXRlMi5oZWxwZXJQb3NpdGlvbjtcbiAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoR2xvYmFsU3R5bGUsIG51bGwpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdG91clJlc2l6ZU9ic2VydmVyLCB7XG4gICAgICAgICAgc3RlcDogc3RlcHNbY3VycmVudF0sXG4gICAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24gcmVmcmVzaCgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMucmVjYWxjdWxhdGVOb2RlKHN0ZXBzW2N1cnJlbnRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdG91ck11dGF0aW9uT2JzZXJ2ZXIsIHtcbiAgICAgICAgICBzdGVwOiBzdGVwc1tjdXJyZW50XSxcbiAgICAgICAgICByZWZyZXNoOiBmdW5jdGlvbiByZWZyZXNoKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5yZWNhbGN1bGF0ZU5vZGUoc3RlcHNbY3VycmVudF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN2Z01hc2ssIHtcbiAgICAgICAgICBvbkNsaWNrOiB0aGlzLm1hc2tDbGlja0hhbmRsZXIsXG4gICAgICAgICAgZm9yd2FyZFJlZjogZnVuY3Rpb24gZm9yd2FyZFJlZihjKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLm1hc2sgPSBjO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgd2luZG93V2lkdGg6IHdpbmRvd1dpZHRoLFxuICAgICAgICAgIHdpbmRvd0hlaWdodDogd2luZG93SGVpZ2h0LFxuICAgICAgICAgIHRhcmdldFdpZHRoOiB0YXJnZXRXaWR0aCxcbiAgICAgICAgICB0YXJnZXRIZWlnaHQ6IHRhcmdldEhlaWdodCxcbiAgICAgICAgICB0YXJnZXRUb3A6IHRhcmdldFRvcCxcbiAgICAgICAgICB0YXJnZXRMZWZ0OiB0YXJnZXRMZWZ0LFxuICAgICAgICAgIHBhZGRpbmc6IG1hc2tTcGFjZSxcbiAgICAgICAgICByb3VuZGVkOiByb3VuZGVkLFxuICAgICAgICAgIHJvdW5kZWRTdGVwOiBzdGVwc1tjdXJyZW50XS5yb3VuZGVkU3RlcCxcbiAgICAgICAgICBjbGFzc05hbWU6IG1hc2tDbGFzc05hbWUsXG4gICAgICAgICAgZGlzYWJsZUludGVyYWN0aW9uOiBzdGVwc1tjdXJyZW50XS5zdGVwSW50ZXJhY3Rpb24gPT09IGZhbHNlIHx8IGRpc2FibGVJbnRlcmFjdGlvbiA/ICFzdGVwc1tjdXJyZW50XS5zdGVwSW50ZXJhY3Rpb24gOiBkaXNhYmxlSW50ZXJhY3Rpb24sXG4gICAgICAgICAgZGlzYWJsZUludGVyYWN0aW9uQ2xhc3NOYW1lOiBcIlwiLmNvbmNhdChDTi5tYXNrLmRpc2FibGVJbnRlcmFjdGlvbiwgXCIgXCIpLmNvbmNhdChoaWdobGlnaHRlZE1hc2tDbGFzc05hbWUpLFxuICAgICAgICAgIGhpZ2hsaWdodGVkQm9yZGVyOiBoaWdobGlnaHRlZEJvcmRlclxuICAgICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9jdXNMb2NrLCB7XG4gICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVGb2N1c0xvY2ssXG4gICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZVxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChHdWlkZSwge1xuICAgICAgICAgIHJlZjogdGhpcy5oZWxwZXIsXG4gICAgICAgICAgdGFyZ2V0SGVpZ2h0OiB0YXJnZXRIZWlnaHQsXG4gICAgICAgICAgdGFyZ2V0V2lkdGg6IHRhcmdldFdpZHRoLFxuICAgICAgICAgIHRhcmdldFRvcDogdGFyZ2V0VG9wLFxuICAgICAgICAgIHRhcmdldFJpZ2h0OiB0YXJnZXRSaWdodCxcbiAgICAgICAgICB0YXJnZXRCb3R0b206IHRhcmdldEJvdHRvbSxcbiAgICAgICAgICB0YXJnZXRMZWZ0OiB0YXJnZXRMZWZ0LFxuICAgICAgICAgIHdpbmRvd1dpZHRoOiB3aW5kb3dXaWR0aCxcbiAgICAgICAgICB3aW5kb3dIZWlnaHQ6IHdpbmRvd0hlaWdodCxcbiAgICAgICAgICBoZWxwZXJXaWR0aDogaGVscGVyV2lkdGgsXG4gICAgICAgICAgaGVscGVySGVpZ2h0OiBoZWxwZXJIZWlnaHQsXG4gICAgICAgICAgaGVscGVyUG9zaXRpb246IGhlbHBlclBvc2l0aW9uLFxuICAgICAgICAgIHBhZGRpbmc6IG1hc2tTcGFjZSxcbiAgICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgICAgY3VycmVudDogY3VycmVudCxcbiAgICAgICAgICBzdHlsZTogc3RlcHNbY3VycmVudF0uc3R5bGUgPyBzdGVwc1tjdXJyZW50XS5zdHlsZSA6IHt9LFxuICAgICAgICAgIHJvdW5kZWQ6IHJvdW5kZWQsXG4gICAgICAgICAgY2xhc3NOYW1lOiBjbihDTi5oZWxwZXIuYmFzZSwgY2xhc3NOYW1lLCBfZGVmaW5lUHJvcGVydHkoe30sIENOLmhlbHBlci5pc09wZW4sIGlzT3BlbikpLFxuICAgICAgICAgIGFjY2VudENvbG9yOiBhY2NlbnRDb2xvcixcbiAgICAgICAgICBkZWZhdWx0U3R5bGVzOiAhQ3VzdG9tSGVscGVyLFxuICAgICAgICAgIHJvbGU6IFwiZGlhbG9nXCJcbiAgICAgICAgfSwgQ3VzdG9tSGVscGVyID8gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ3VzdG9tSGVscGVyLCB7XG4gICAgICAgICAgY3VycmVudDogY3VycmVudCxcbiAgICAgICAgICB0b3RhbFN0ZXBzOiBzdGVwcy5sZW5ndGgsXG4gICAgICAgICAgZ290b1N0ZXA6IHRoaXMuZ290b1N0ZXAsXG4gICAgICAgICAgY2xvc2U6IG9uUmVxdWVzdENsb3NlLFxuICAgICAgICAgIGNvbnRlbnQ6IHN0ZXBzW2N1cnJlbnRdICYmICh0eXBlb2Ygc3RlcHNbY3VycmVudF0uY29udGVudCA9PT0gJ2Z1bmN0aW9uJyA/IHN0ZXBzW2N1cnJlbnRdLmNvbnRlbnQoe1xuICAgICAgICAgICAgY2xvc2U6IG9uUmVxdWVzdENsb3NlLFxuICAgICAgICAgICAgZ29UbzogdGhpcy5nb3RvU3RlcCxcbiAgICAgICAgICAgIGluRE9NOiBpbkRPTSxcbiAgICAgICAgICAgIHN0ZXA6IGN1cnJlbnQgKyAxXG4gICAgICAgICAgfSkgOiBzdGVwc1tjdXJyZW50XS5jb250ZW50KVxuICAgICAgICB9LCB0aGlzLnByb3BzLmNoaWxkcmVuKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCB0aGlzLnByb3BzLmNoaWxkcmVuLCBzdGVwc1tjdXJyZW50XSAmJiAodHlwZW9mIHN0ZXBzW2N1cnJlbnRdLmNvbnRlbnQgPT09ICdmdW5jdGlvbicgPyBzdGVwc1tjdXJyZW50XS5jb250ZW50KHtcbiAgICAgICAgICBjbG9zZTogb25SZXF1ZXN0Q2xvc2UsXG4gICAgICAgICAgZ29UbzogdGhpcy5nb3RvU3RlcCxcbiAgICAgICAgICBpbkRPTTogaW5ET00sXG4gICAgICAgICAgc3RlcDogY3VycmVudCArIDFcbiAgICAgICAgfSkgOiBzdGVwc1tjdXJyZW50XS5jb250ZW50KSwgc2hvd051bWJlciAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCYWRnZSwge1xuICAgICAgICAgIFwiZGF0YS10b3VyLWVsZW1cIjogXCJiYWRnZVwiLFxuICAgICAgICAgIGFjY2VudENvbG9yOiBhY2NlbnRDb2xvclxuICAgICAgICB9LCB0eXBlb2YgYmFkZ2VDb250ZW50ID09PSAnZnVuY3Rpb24nID8gYmFkZ2VDb250ZW50KGN1cnJlbnQgKyAxLCBzdGVwcy5sZW5ndGgpIDogY3VycmVudCArIDEpLCAoc2hvd0J1dHRvbnMgfHwgc2hvd05hdmlnYXRpb24pICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRyb2xzLCB7XG4gICAgICAgICAgXCJkYXRhLXRvdXItZWxlbVwiOiBcImNvbnRyb2xzXCJcbiAgICAgICAgfSwgc2hvd0J1dHRvbnMgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQXJyb3ckMSwge1xuICAgICAgICAgIG9uQ2xpY2s6IHR5cGVvZiBwcmV2U3RlcCA9PT0gJ2Z1bmN0aW9uJyA/IHByZXZTdGVwIDogdGhpcy5wcmV2U3RlcCxcbiAgICAgICAgICBkaXNhYmxlZDogY3VycmVudCA9PT0gMCxcbiAgICAgICAgICBsYWJlbDogcHJldkJ1dHRvbiA/IHByZXZCdXR0b24gOiBudWxsXG4gICAgICAgIH0pLCBzaG93TmF2aWdhdGlvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChOYXZpZ2F0aW9uLCB7XG4gICAgICAgICAgXCJkYXRhLXRvdXItZWxlbVwiOiBcIm5hdmlnYXRpb25cIlxuICAgICAgICB9LCBzdGVwcy5tYXAoZnVuY3Rpb24gKHMsIGkpIHtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRG90LCB7XG4gICAgICAgICAgICBrZXk6IFwiXCIuY29uY2F0KHMuc2VsZWN0b3IgPyBzLnNlbGVjdG9yIDogJ3VuZGVmJywgXCJfXCIpLmNvbmNhdChpKSxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczMuZ290b1N0ZXAoaSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3VycmVudDogY3VycmVudCxcbiAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgYWNjZW50Q29sb3I6IGFjY2VudENvbG9yLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGN1cnJlbnQgPT09IGkgfHwgZGlzYWJsZURvdHNOYXZpZ2F0aW9uLFxuICAgICAgICAgICAgc2hvd051bWJlcjogc2hvd05hdmlnYXRpb25OdW1iZXIsXG4gICAgICAgICAgICBcImRhdGEtdG91ci1lbGVtXCI6IFwiZG90XCIsXG4gICAgICAgICAgICBjbGFzc05hbWU6IGNuKENOLmRvdC5iYXNlLCBfZGVmaW5lUHJvcGVydHkoe30sIENOLmRvdC5hY3RpdmUsIGN1cnJlbnQgPT09IGkpKSxcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiOiBzLm5hdkRvdEFyaWFMYWJlbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSksIHNob3dCdXR0b25zICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFycm93JDEsIHtcbiAgICAgICAgICBvbkNsaWNrOiBjdXJyZW50ID09PSBzdGVwcy5sZW5ndGggLSAxID8gbGFzdFN0ZXBOZXh0QnV0dG9uID8gb25SZXF1ZXN0Q2xvc2UgOiBmdW5jdGlvbiAoKSB7fSA6IHR5cGVvZiBuZXh0U3RlcCA9PT0gJ2Z1bmN0aW9uJyA/IG5leHRTdGVwIDogdGhpcy5uZXh0U3RlcCxcbiAgICAgICAgICBkaXNhYmxlZDogIWxhc3RTdGVwTmV4dEJ1dHRvbiAmJiBjdXJyZW50ID09PSBzdGVwcy5sZW5ndGggLSAxLFxuICAgICAgICAgIGludmVydGVkOiB0cnVlLFxuICAgICAgICAgIGxhYmVsOiBsYXN0U3RlcE5leHRCdXR0b24gJiYgY3VycmVudCA9PT0gc3RlcHMubGVuZ3RoIC0gMSA/IGxhc3RTdGVwTmV4dEJ1dHRvbiA6IG5leHRCdXR0b24gPyBuZXh0QnV0dG9uIDogbnVsbFxuICAgICAgICB9KSksIHNob3dDbG9zZUJ1dHRvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdHlsZWRDbG9zZSwge1xuICAgICAgICAgIG9uQ2xpY2s6IG9uUmVxdWVzdENsb3NlLFxuICAgICAgICAgIGNsYXNzTmFtZTogXCJyZWFjdG91cl9fY2xvc2VcIixcbiAgICAgICAgICBhcmlhTGFiZWw6IGNsb3NlQnV0dG9uQXJpYUxhYmVsXG4gICAgICAgIH0pKSkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfV0pO1xufShDb21wb25lbnQpO1xudmFyIHNldE5vZGVTdGF0ZSA9IGZ1bmN0aW9uIHNldE5vZGVTdGF0ZShub2RlLCBzdGVwLCBoZWxwZXIpIHtcbiAgaWYgKCFoZWxwZXIpIHJldHVybjtcbiAgdmFyIHcgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xuICB2YXIgaCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTtcbiAgdmFyIF9oeCRnZXROb2RlUmVjdCA9IGdldE5vZGVSZWN0KGhlbHBlciksXG4gICAgaGVscGVyV2lkdGggPSBfaHgkZ2V0Tm9kZVJlY3Qud2lkdGgsXG4gICAgaGVscGVySGVpZ2h0ID0gX2h4JGdldE5vZGVSZWN0LmhlaWdodDtcbiAgdmFyIGF0dHJzID0ge1xuICAgIHRvcDogaCArIDEwLFxuICAgIHJpZ2h0OiB3IC8gMiArIDksXG4gICAgYm90dG9tOiBoIC8gMiArIDksXG4gICAgbGVmdDogdyAvIDIgLSBoZWxwZXJXaWR0aCAvIDIsXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHc6IHcsXG4gICAgaDogaCxcbiAgICBoZWxwZXJQb3NpdGlvbjogJ2NlbnRlcidcbiAgfTtcbiAgaWYgKG5vZGUpIHtcbiAgICBhdHRycyA9IGdldEhpZ2hsaWdodGVkUmVjdChub2RlLCBzdGVwKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHJldHVybiBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7XG4gICAgICB3OiB3LFxuICAgICAgaDogaCxcbiAgICAgIGhlbHBlcldpZHRoOiBoZWxwZXJXaWR0aCxcbiAgICAgIGhlbHBlckhlaWdodDogaGVscGVySGVpZ2h0LFxuICAgICAgaGVscGVyUG9zaXRpb246IHN0ZXAucG9zaXRpb25cbiAgICB9LCBhdHRycyksIHt9LCB7XG4gICAgICBpbkRPTTogbm9kZSA/IHRydWUgOiBmYWxzZVxuICAgIH0pO1xuICB9O1xufTtcblRvdXIucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuVG91ci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IFRvdXI7XG5leHBvcnQgeyBBcnJvdyQxIGFzIEFycm93LCBCYWRnZSwgU3R5bGVkQ2xvc2UgYXMgQ2xvc2UsIENvbnRyb2xzLCBEb3QsIE5hdmlnYXRpb24gfTtcbiIsIi8qIVxuICBDb3B5cmlnaHQgKGMpIDIwMTggSmVkIFdhdHNvbi5cbiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcbiAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRmdW5jdGlvbiBjbGFzc05hbWVzKCkge1xuXHRcdHZhciBjbGFzc2VzID0gW107XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGFyZyA9IGFyZ3VtZW50c1tpXTtcblx0XHRcdGlmICghYXJnKSBjb250aW51ZTtcblxuXHRcdFx0dmFyIGFyZ1R5cGUgPSB0eXBlb2YgYXJnO1xuXG5cdFx0XHRpZiAoYXJnVHlwZSA9PT0gJ3N0cmluZycgfHwgYXJnVHlwZSA9PT0gJ251bWJlcicpIHtcblx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGFyZyk7XG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuXHRcdFx0XHRpZiAoYXJnLmxlbmd0aCkge1xuXHRcdFx0XHRcdHZhciBpbm5lciA9IGNsYXNzTmFtZXMuYXBwbHkobnVsbCwgYXJnKTtcblx0XHRcdFx0XHRpZiAoaW5uZXIpIHtcblx0XHRcdFx0XHRcdGNsYXNzZXMucHVzaChpbm5lcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdGlmIChhcmcudG9TdHJpbmcgPT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcblx0XHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gYXJnKSB7XG5cdFx0XHRcdFx0XHRpZiAoaGFzT3duLmNhbGwoYXJnLCBrZXkpICYmIGFyZ1trZXldKSB7XG5cdFx0XHRcdFx0XHRcdGNsYXNzZXMucHVzaChrZXkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnLnRvU3RyaW5nKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0Y2xhc3NOYW1lcy5kZWZhdWx0ID0gY2xhc3NOYW1lcztcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuICB2YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG4gIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGdldFN0YWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKFxuICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgICAgICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgJiYgIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICcgK1xuICAgICAgICAgICAgbG9jYXRpb24gKyAnIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAnICsgdHlwZW9mIGVycm9yICsgJy4gJyArXG4gICAgICAgICAgICAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICtcbiAgICAgICAgICAgICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgICB2YXIgc3RhY2sgPSBnZXRTdGFjayA/IGdldFN0YWNrKCkgOiAnJztcblxuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdGYWlsZWQgJyArIGxvY2F0aW9uICsgJyB0eXBlOiAnICsgZXJyb3IubWVzc2FnZSArIChzdGFjayAhPSBudWxsID8gc3RhY2sgOiAnJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVzZXRzIHdhcm5pbmcgY2FjaGUgd2hlbiB0ZXN0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNoZWNrUHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlID0gZnVuY3Rpb24oKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1Byb3BUeXBlcztcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgnLi9jaGVja1Byb3BUeXBlcycpO1xuXG52YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpc1ZhbGlkRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAvKiBnbG9iYWwgU3ltYm9sICovXG4gIHZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbiAgdmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InOyAvLyBCZWZvcmUgU3ltYm9sIHNwZWMuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC5cbiAgICpcbiAgICogQmUgc3VyZSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZXJhYmxlIGFzIGNvbnRleHQ6XG4gICAqXG4gICAqICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obXlJdGVyYWJsZSk7XG4gICAqICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7XG4gICAqICAgICAgIC4uLlxuICAgKiAgICAgfVxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1heWJlSXRlcmFibGVcbiAgICogQHJldHVybiB7P2Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvckZuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyBkZWNsYXJhdGlvbiBhbmQgdmFsaWRhdGlvbiBvZiBwcm9wcyB0aGF0IGFyZVxuICAgKiBzdXBwbGllZCB0byBSZWFjdCBjb21wb25lbnRzLiBFeGFtcGxlIHVzYWdlOlxuICAgKlxuICAgKiAgIHZhciBQcm9wcyA9IHJlcXVpcmUoJ1JlYWN0UHJvcFR5cGVzJyk7XG4gICAqICAgdmFyIE15QXJ0aWNsZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgcHJvcCBuYW1lZCBcImRlc2NyaXB0aW9uXCIuXG4gICAqICAgICAgIGRlc2NyaXB0aW9uOiBQcm9wcy5zdHJpbmcsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcmVxdWlyZWQgZW51bSBwcm9wIG5hbWVkIFwiY2F0ZWdvcnlcIi5cbiAgICogICAgICAgY2F0ZWdvcnk6IFByb3BzLm9uZU9mKFsnTmV3cycsJ1Bob3RvcyddKS5pc1JlcXVpcmVkLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHByb3AgbmFtZWQgXCJkaWFsb2dcIiB0aGF0IHJlcXVpcmVzIGFuIGluc3RhbmNlIG9mIERpYWxvZy5cbiAgICogICAgICAgZGlhbG9nOiBQcm9wcy5pbnN0YW5jZU9mKERpYWxvZykuaXNSZXF1aXJlZFxuICAgKiAgICAgfSxcbiAgICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7IC4uLiB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIEEgbW9yZSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZDpcbiAgICpcbiAgICogICB0eXBlIDo9IGFycmF5fGJvb2x8ZnVuY3xvYmplY3R8bnVtYmVyfHN0cmluZ3xvbmVPZihbLi4uXSl8aW5zdGFuY2VPZiguLi4pXG4gICAqICAgZGVjbCA6PSBSZWFjdFByb3BUeXBlcy57dHlwZX0oLmlzUmVxdWlyZWQpP1xuICAgKlxuICAgKiBFYWNoIGFuZCBldmVyeSBkZWNsYXJhdGlvbiBwcm9kdWNlcyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLiBUaGlzXG4gICAqIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25zLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogIHZhciBNeUxpbmsgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBvciBVUkkgcHJvcCBuYW1lZCBcImhyZWZcIi5cbiAgICogICAgICBocmVmOiBmdW5jdGlvbihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICogICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAqICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHByb3BWYWx1ZSAhPT0gJ3N0cmluZycgJiZcbiAgICogICAgICAgICAgICAhKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFVSSSkpIHtcbiAgICogICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICogICAgICAgICAgICAnRXhwZWN0ZWQgYSBzdHJpbmcgb3IgYW4gVVJJIGZvciAnICsgcHJvcE5hbWUgKyAnIGluICcgK1xuICAgKiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICogICAgICAgICAgKTtcbiAgICogICAgICAgIH1cbiAgICogICAgICB9XG4gICAqICAgIH0sXG4gICAqICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7Li4ufVxuICAgKiAgfSk7XG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuICB2YXIgQU5PTllNT1VTID0gJzw8YW5vbnltb3VzPj4nO1xuXG4gIC8vIEltcG9ydGFudCFcbiAgLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBpbiBgLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdhcnJheScpLFxuICAgIGJvb2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdib29sZWFuJyksXG4gICAgZnVuYzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Z1bmN0aW9uJyksXG4gICAgbnVtYmVyOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignbnVtYmVyJyksXG4gICAgb2JqZWN0OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignb2JqZWN0JyksXG4gICAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3RyaW5nJyksXG4gICAgc3ltYm9sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3ltYm9sJyksXG5cbiAgICBhbnk6IGNyZWF0ZUFueVR5cGVDaGVja2VyKCksXG4gICAgYXJyYXlPZjogY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyLFxuICAgIGVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpLFxuICAgIGVsZW1lbnRUeXBlOiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCksXG4gICAgaW5zdGFuY2VPZjogY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcixcbiAgICBub2RlOiBjcmVhdGVOb2RlQ2hlY2tlcigpLFxuICAgIG9iamVjdE9mOiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyLFxuICAgIG9uZU9mOiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIsXG4gICAgb25lT2ZUeXBlOiBjcmVhdGVVbmlvblR5cGVDaGVja2VyLFxuICAgIHNoYXBlOiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyLFxuICAgIGV4YWN0OiBjcmVhdGVTdHJpY3RTaGFwZVR5cGVDaGVja2VyLFxuICB9O1xuXG4gIC8qKlxuICAgKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICAgKi9cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuICBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gICAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICAgIH1cbiAgfVxuICAvKmVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlKi9cblxuICAvKipcbiAgICogV2UgdXNlIGFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzIHBlb3BsZSBtYXkgY2FsbFxuICAgKiBQcm9wVHlwZXMgZGlyZWN0bHkgYW5kIGluc3BlY3QgdGhlaXIgb3V0cHV0LiBIb3dldmVyLCB3ZSBkb24ndCB1c2UgcmVhbFxuICAgKiBFcnJvcnMgYW55bW9yZS4gV2UgZG9uJ3QgaW5zcGVjdCB0aGVpciBzdGFjayBhbnl3YXksIGFuZCBjcmVhdGluZyB0aGVtXG4gICAqIGlzIHByb2hpYml0aXZlbHkgZXhwZW5zaXZlIGlmIHRoZXkgYXJlIGNyZWF0ZWQgdG9vIG9mdGVuLCBzdWNoIGFzIHdoYXRcbiAgICogaGFwcGVucyBpbiBvbmVPZlR5cGUoKSBmb3IgYW55IHR5cGUgYmVmb3JlIHRoZSBvbmUgdGhhdCBtYXRjaGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gUHJvcFR5cGVFcnJvcihtZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnN0YWNrID0gJyc7XG4gIH1cbiAgLy8gTWFrZSBgaW5zdGFuY2VvZiBFcnJvcmAgc3RpbGwgd29yayBmb3IgcmV0dXJuZWQgZXJyb3JzLlxuICBQcm9wVHlwZUVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZTtcblxuICBmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUgPSB7fTtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA9IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgcHJvcEZ1bGxOYW1lID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgICBpZiAoc2VjcmV0ICE9PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgICBpZiAodGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAgICAgICAgIC8vIE5ldyBiZWhhdmlvciBvbmx5IGZvciB1c2VycyBvZiBgcHJvcC10eXBlc2AgcGFja2FnZVxuICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAnVXNlIGBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKWAgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gT2xkIGJlaGF2aW9yIGZvciBwZW9wbGUgdXNpbmcgUmVhY3QuUHJvcFR5cGVzXG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gY29tcG9uZW50TmFtZSArICc6JyArIHByb3BOYW1lO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gJiZcbiAgICAgICAgICAgIC8vIEF2b2lkIHNwYW1taW5nIHRoZSBjb25zb2xlIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gbm90IGFjdGlvbmFibGUgZXhjZXB0IGZvciBsaWIgYXV0aG9yc1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPCAzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAgICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMgdmFsaWRhdGlvbiAnICtcbiAgICAgICAgICAgICAgJ2Z1bmN0aW9uIGZvciB0aGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBwcm9wIG9uIGAnICsgY29tcG9uZW50TmFtZSAgKyAnYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgK1xuICAgICAgICAgICAgICAnYW5kIHdpbGwgdGhyb3cgaW4gdGhlIHN0YW5kYWxvbmUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgICAnWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyAnICtcbiAgICAgICAgICAgICAgJ2xpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0eXBlcyAnICsgJ2ZvciBkZXRhaWxzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gPSB0cnVlO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICAgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhblxuICAgICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBhcnJheS4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnWycgKyBpICsgJ10nLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIVJlYWN0SXMuaXNWYWxpZEVsZW1lbnRUeXBlKHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50IHR5cGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyKGV4cGVjdGVkQ2xhc3MpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICAgIHZhciBleHBlY3RlZENsYXNzTmFtZSA9IGV4cGVjdGVkQ2xhc3MubmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgYWN0dWFsQ2xhc3NOYW1lICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdpbnN0YW5jZSBvZiBgJyArIGV4cGVjdGVkQ2xhc3NOYW1lICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIoZXhwZWN0ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZXMpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LCBnb3QgJyArIGFyZ3VtZW50cy5sZW5ndGggKyAnIGFyZ3VtZW50cy4gJyArXG4gICAgICAgICAgICAnQSBjb21tb24gbWlzdGFrZSBpcyB0byB3cml0ZSBvbmVPZih4LCB5LCB6KSBpbnN0ZWFkIG9mIG9uZU9mKFt4LCB5LCB6XSkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBhcnJheS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMsIGZ1bmN0aW9uIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIFN0cmluZyhwcm9wVmFsdWUpICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIG9uZSBvZiAnICsgdmFsdWVzU3RyaW5nICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIG9iamVjdC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcFZhbHVlKSB7XG4gICAgICAgIGlmIChoYXMocHJvcFZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVVbmlvblR5cGVDaGVja2VyKGFycmF5T2ZUeXBlQ2hlY2tlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2VycykpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUuIEV4cGVjdGVkIGFuIGFycmF5IG9mIGNoZWNrIGZ1bmN0aW9ucywgYnV0ICcgK1xuICAgICAgICAgICdyZWNlaXZlZCAnICsgZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKGNoZWNrZXIpICsgJyBhdCBpbmRleCAnICsgaSArICcuJ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICAgIGlmIChjaGVja2VyKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTdHJpY3RTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgICB9XG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGFsbCBrZXlzIGluIGNhc2Ugc29tZSBhcmUgcmVxdWlyZWQgYnV0IG1pc3NpbmcgZnJvbVxuICAgICAgLy8gcHJvcHMuXG4gICAgICB2YXIgYWxsS2V5cyA9IGFzc2lnbih7fSwgcHJvcHNbcHJvcE5hbWVdLCBzaGFwZVR5cGVzKTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhbGxLZXlzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAgICAgICAnSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Aga2V5IGAnICsga2V5ICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJyArXG4gICAgICAgICAgICAnXFxuQmFkIG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KHByb3BzW3Byb3BOYW1lXSwgbnVsbCwgJyAgJykgK1xuICAgICAgICAgICAgJ1xcblZhbGlkIGtleXM6ICcgKyAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoc2hhcGVUeXBlcyksIG51bGwsICcgICcpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZShwcm9wVmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wVmFsdWUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuICFwcm9wVmFsdWU7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BWYWx1ZS5ldmVyeShpc05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKHByb3BWYWx1ZSk7XG4gICAgICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKHByb3BWYWx1ZSk7XG4gICAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IHByb3BWYWx1ZS5lbnRyaWVzKSB7XG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIGlmICghaXNOb2RlKHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTm9kZShlbnRyeVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkge1xuICAgIC8vIE5hdGl2ZSBTeW1ib2wuXG4gICAgaWYgKHByb3BUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gZmFsc3kgdmFsdWUgY2FuJ3QgYmUgYSBTeW1ib2xcbiAgICBpZiAoIXByb3BWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnXG4gICAgaWYgKHByb3BWYWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zcGVjIGNvbXBsaWFudCBTeW1ib2xzIHdoaWNoIGFyZSBwb2x5ZmlsbGVkLlxuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gRXF1aXZhbGVudCBvZiBgdHlwZW9mYCBidXQgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciBhcnJheSBhbmQgcmVnZXhwLlxuICBmdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH1cbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBPbGQgd2Via2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhlciB0aGFuXG4gICAgICAvLyAnb2JqZWN0JyBmb3IgdHlwZW9mIGEgUmVnRXhwLiBXZSdsbCBub3JtYWxpemUgdGhpcyBoZXJlIHNvIHRoYXQgL2JsYS9cbiAgICAgIC8vIHBhc3NlcyBQcm9wVHlwZXMub2JqZWN0LlxuICAgICAgcmV0dXJuICdvYmplY3QnO1xuICAgIH1cbiAgICBpZiAoaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gVGhpcyBoYW5kbGVzIG1vcmUgdHlwZXMgdGhhbiBgZ2V0UHJvcFR5cGVgLiBPbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAvLyBTZWUgYGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyYC5cbiAgZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnICsgcHJvcFZhbHVlO1xuICAgIH1cbiAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgIGlmIChwcm9wVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwb3N0Zml4ZWQgdG8gYSB3YXJuaW5nIGFib3V0IGFuIGludmFsaWQgdHlwZS5cbiAgLy8gRm9yIGV4YW1wbGUsIFwidW5kZWZpbmVkXCIgb3IgXCJvZiB0eXBlIGFycmF5XCJcbiAgZnVuY3Rpb24gZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gJ2FuICcgKyB0eXBlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICAgIHJldHVybiAnYSAnICsgdHlwZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuXG4gIGZ1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHtcbiAgICBpZiAoIXByb3BWYWx1ZS5jb25zdHJ1Y3RvciB8fCAhcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpIHtcbiAgICAgIHJldHVybiBBTk9OWU1PVVM7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuXG4gIFJlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzID0gY2hlY2tQcm9wVHlwZXM7XG4gIFJlYWN0UHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlID0gY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGU7XG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKFJlYWN0SXMuaXNFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBSZWdleFBhcnNlclxuICogUGFyc2VzIGEgc3RyaW5nIGlucHV0LlxuICpcbiAqIEBuYW1lIFJlZ2V4UGFyc2VyXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgc3RyaW5nIGlucHV0IHRoYXQgc2hvdWxkIGJlIHBhcnNlZCBhcyByZWd1bGFyXG4gKiBleHByZXNzaW9uLlxuICogQHJldHVybiB7UmVnRXhwfSBUaGUgcGFyc2VkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqL1xudmFyIFJlZ2V4UGFyc2VyID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAvLyBWYWxpZGF0ZSBpbnB1dFxuICAgIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dC4gSW5wdXQgbXVzdCBiZSBhIHN0cmluZ1wiKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBpbnB1dFxuICAgIHZhciBtID0gaW5wdXQubWF0Y2goLyhcXC8/KSguKylcXDEoW2Etel0qKS9pKTtcblxuICAgIC8vIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsIHRocm93IGFuIGVycm9yXG4gICAgaWYgKCFtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZvcm1hdC5cIik7XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIHZhbGlkIGZsYWdzOiAnZycsICdpJywgJ20nLCAncycsICd1JywgYW5kICd5J1xuICAgIHZhciB2YWxpZEZsYWdzID0gQXJyYXkuZnJvbShuZXcgU2V0KG1bM10pKS5maWx0ZXIoZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgcmV0dXJuIFwiZ2ltc3V5XCIuaW5jbHVkZXMoZmxhZyk7XG4gICAgfSkuam9pbihcIlwiKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgcmVndWxhciBleHByZXNzaW9uXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAobVsyXSwgdmFsaWRGbGFncyk7XG59OyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9zY3JvbGxTbW9vdGggPSByZXF1aXJlKCcuL3Njcm9sbFNtb290aCcpO1xuXG52YXIgX3Njcm9sbFNtb290aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zY3JvbGxTbW9vdGgpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgIF9yZWYkcXVlcnkgPSBfcmVmLnF1ZXJ5LFxuICAgICAgcXVlcnkgPSBfcmVmJHF1ZXJ5ID09PSB1bmRlZmluZWQgPyAnW2hyZWZePVwiI1wiXTpub3QoW2hyZWY9XCIjXCJdJyA6IF9yZWYkcXVlcnksXG4gICAgICBfcmVmJG1hdGNoID0gX3JlZi5tYXRjaCxcbiAgICAgIG1hdGNoID0gX3JlZiRtYXRjaCA9PT0gdW5kZWZpbmVkID8gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXQuaGFzaC5zdWJzdHJpbmcoMSkpO1xuICB9IDogX3JlZiRtYXRjaCxcbiAgICAgIF9yZWYkaGFzaENoYW5nZSA9IF9yZWYuaGFzaENoYW5nZSxcbiAgICAgIGhhc2hDaGFuZ2UgPSBfcmVmJGhhc2hDaGFuZ2UgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBfcmVmJGhhc2hDaGFuZ2UsXG4gICAgICBzY3JvbGxTbW9vdGhDb25maWcgPSBfcmVmLnNjcm9sbFNtb290aENvbmZpZztcblxuICB2YXIgbGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KTtcbiAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiBoYW5kbGVyKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIGRlc3QgPSBtYXRjaChlLnRhcmdldCk7XG5cbiAgICBpZiAoIWRlc3QpIHJldHVybjtcblxuICAgIGlmIChoYXNoQ2hhbmdlKSB7XG4gICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBudWxsLCAnIycgKyBkZXN0LmlkKTtcbiAgICB9XG5cbiAgICAoMCwgX3Njcm9sbFNtb290aDIuZGVmYXVsdCkoZGVzdCwgX2V4dGVuZHMoe30sIHNjcm9sbFNtb290aENvbmZpZykpO1xuICB9O1xuXG4gIEFycmF5LmZyb20obGlua3MpLm1hcChmdW5jdGlvbiAobGluaykge1xuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyLCBmYWxzZSk7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3Njcm9sbFNtb290aCA9IHJlcXVpcmUoJy4vc2Nyb2xsU21vb3RoJyk7XG5cbnZhciBfc2Nyb2xsU21vb3RoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Njcm9sbFNtb290aCk7XG5cbnZhciBfdG9vbHMgPSByZXF1aXJlKCcuL3Rvb2xzJyk7XG5cbnZhciBfYW5jaG9yU2Nyb2xsID0gcmVxdWlyZSgnLi9hbmNob3JTY3JvbGwnKTtcblxudmFyIF9hbmNob3JTY3JvbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYW5jaG9yU2Nyb2xsKTtcblxudmFyIF9vYnNlcnZlID0gcmVxdWlyZSgnLi9vYnNlcnZlJyk7XG5cbnZhciBfb2JzZXJ2ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYnNlcnZlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICB0bzogX3Njcm9sbFNtb290aDIuZGVmYXVsdCxcbiAgY2FsY0VuZFBvaW50OiBfdG9vbHMuY2FsY0VuZFBvaW50LFxuICBhbmNob3JTY3JvbGw6IF9hbmNob3JTY3JvbGwyLmRlZmF1bHQsXG4gIG9ic2VydmU6IF9vYnNlcnZlMi5kZWZhdWx0XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sXG4gICAgICBfcmVmJGFjdGl2ZUNsYXNzID0gX3JlZi5hY3RpdmVDbGFzcyxcbiAgICAgIGFjdGl2ZUNsYXNzID0gX3JlZiRhY3RpdmVDbGFzcyA9PT0gdW5kZWZpbmVkID8gJ2FjdGl2ZScgOiBfcmVmJGFjdGl2ZUNsYXNzLFxuICAgICAgX3JlZiRxdWVyeSA9IF9yZWYucXVlcnksXG4gICAgICBxdWVyeSA9IF9yZWYkcXVlcnkgPT09IHVuZGVmaW5lZCA/ICdbaHJlZl49XCIjXCJdOm5vdChbaHJlZj1cIiNcIl0pOm5vdChbaHJlZj1cIiMwXCJdKScgOiBfcmVmJHF1ZXJ5LFxuICAgICAgX3JlZiR0aHJlc2hvbGQgPSBfcmVmLnRocmVzaG9sZCxcbiAgICAgIHRocmVzaG9sZCA9IF9yZWYkdGhyZXNob2xkID09PSB1bmRlZmluZWQgPyBbMC4yNSwgMC41LCAwLjc1XSA6IF9yZWYkdGhyZXNob2xkLFxuICAgICAgX3JlZiRkZXRlY3RUeXBlID0gX3JlZi5kZXRlY3RUeXBlLFxuICAgICAgZGV0ZWN0VHlwZSA9IF9yZWYkZGV0ZWN0VHlwZSA9PT0gdW5kZWZpbmVkID8gJ21heCcgOiBfcmVmJGRldGVjdFR5cGU7XG5cbiAgdmFyIG9wdGlvbnMgPSB7IHRocmVzaG9sZDogdGhyZXNob2xkIH07XG5cbiAgdmFyIHJlbW92ZUNsYXNzID0gZnVuY3Rpb24gcmVtb3ZlQ2xhc3Mobm9kZSkge1xuICAgIHJldHVybiBub2RlLmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlQ2xhc3MpO1xuICB9O1xuICB2YXIgYWRkQ2xhc3MgPSBmdW5jdGlvbiBhZGRDbGFzcyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzcyk7XG4gIH07XG5cbiAgdmFyIHVuc2V0QWxsQWN0aXZlcyA9IGZ1bmN0aW9uIHVuc2V0QWxsQWN0aXZlcygpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGFjdGl2ZUNsYXNzKS5mb3JFYWNoKHJlbW92ZUNsYXNzKTtcbiAgfTtcblxuICB2YXIgc2V0QWN0aXZlID0gZnVuY3Rpb24gc2V0QWN0aXZlKGFjdGl2ZU5vZGUpIHtcbiAgICB1bnNldEFsbEFjdGl2ZXMoKTtcbiAgICBhZGRDbGFzcyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhW2hyZWY9XCIjJyArIGFjdGl2ZU5vZGUuaWQgKyAnXCJdJykpO1xuICB9O1xuXG4gIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKGVudHJpZXMpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICBpZiAoZW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gPj0gTWF0aFtkZXRlY3RUeXBlXS5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkodGhyZXNob2xkKSkpIHtcbiAgICAgICAgc2V0QWN0aXZlKGVudHJ5LnRhcmdldCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChxdWVyeSk7XG4gIHZhciBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihjYWxsYmFjaywgb3B0aW9ucyk7XG4gIHZhciBvYnNlcnZlVGFyZ2V0ID0gZnVuY3Rpb24gb2JzZXJ2ZVRhcmdldChsaW5rKSB7XG4gICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgbGluay5oYXNoLnNsaWNlKDEpKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRhcmdldCk7XG4gIH07XG5cbiAgbGlua3MuZm9yRWFjaChvYnNlcnZlVGFyZ2V0KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfdG9vbHMgPSByZXF1aXJlKFwiLi90b29sc1wiKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICBfcmVmJGR1cmF0aW9uID0gX3JlZi5kdXJhdGlvbixcbiAgICAgIGR1cmF0aW9uID0gX3JlZiRkdXJhdGlvbiA9PT0gdW5kZWZpbmVkID8gNTAwIDogX3JlZiRkdXJhdGlvbixcbiAgICAgIF9yZWYkY29udGV4dCA9IF9yZWYuY29udGV4dCxcbiAgICAgIGNvbnRleHQgPSBfcmVmJGNvbnRleHQgPT09IHVuZGVmaW5lZCA/IHdpbmRvdyA6IF9yZWYkY29udGV4dCxcbiAgICAgIF9yZWYkb2Zmc2V0ID0gX3JlZi5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfcmVmJG9mZnNldCA9PT0gdW5kZWZpbmVkID8gMCA6IF9yZWYkb2Zmc2V0LFxuICAgICAgX3JlZiRlYXNlID0gX3JlZi5lYXNlLFxuICAgICAgZWFzZSA9IF9yZWYkZWFzZSA9PT0gdW5kZWZpbmVkID8gXCJlYXNlSW5PdXRDdWJpY1wiIDogX3JlZiRlYXNlLFxuICAgICAgY2FsbGJhY2sgPSBfcmVmLmNhbGxiYWNrO1xuXG4gIGlmICgodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKHdpbmRvdykpICE9PSBcIm9iamVjdFwiKSByZXR1cm47XG5cbiAgdmFyIHN0YXJ0ID0gY29udGV4dC5zY3JvbGxUb3AgIT09IG51bGwgJiYgY29udGV4dC5zY3JvbGxUb3AgIT09IHVuZGVmaW5lZCA/IGNvbnRleHQuc2Nyb2xsVG9wIDogd2luZG93LnBhZ2VZT2Zmc2V0O1xuICB2YXIgZW5kID0gKDAsIF90b29scy5jYWxjRW5kUG9pbnQpKHRhcmdldCwgY29udGV4dCwgb2Zmc2V0KTtcbiAgdmFyIGNsb2NrID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIHZhciByQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG4gIHZhciB0aWNrID0gZnVuY3Rpb24gdGljaygpIHtcbiAgICB2YXIgZWxhcHNlZCA9IHBlcmZvcm1hbmNlLm5vdygpIC0gY2xvY2s7XG4gICAgdmFyIHBvcyA9ICgwLCBfdG9vbHMuc2V0UG9zaXRpb24pKHN0YXJ0LCBlbmQsIGVsYXBzZWQsIGR1cmF0aW9uLCBlYXNlKTtcbiAgICBpZiAoY29udGV4dCAhPT0gd2luZG93KSB7XG4gICAgICBjb250ZXh0LnNjcm9sbFRvcCA9IHBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LnNjcm9sbCgwLCBwb3MpO1xuICAgIH1cblxuICAgIGlmIChlbGFwc2VkID4gZHVyYXRpb24pIHtcbiAgICAgIHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiICYmIGNhbGxiYWNrKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJBRih0aWNrKTtcbiAgICB9XG4gIH07XG5cbiAgdGljaygpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG52YXIgZWFzZUZ1bmN0aW9ucyA9IGV4cG9ydHMuZWFzZUZ1bmN0aW9ucyA9IHtcbiAgbGluZWFyOiBmdW5jdGlvbiBsaW5lYXIodCkge1xuICAgIHJldHVybiB0O1xuICB9LFxuICBlYXNlSW5RdWFkOiBmdW5jdGlvbiBlYXNlSW5RdWFkKHQpIHtcbiAgICByZXR1cm4gdCAqIHQ7XG4gIH0sXG4gIGVhc2VPdXRRdWFkOiBmdW5jdGlvbiBlYXNlT3V0UXVhZCh0KSB7XG4gICAgcmV0dXJuIHQgKiAoMiAtIHQpO1xuICB9LFxuICBlYXNlSW5PdXRRdWFkOiBmdW5jdGlvbiBlYXNlSW5PdXRRdWFkKHQpIHtcbiAgICByZXR1cm4gdCA8IC41ID8gMiAqIHQgKiB0IDogLTEgKyAoNCAtIDIgKiB0KSAqIHQ7XG4gIH0sXG4gIGVhc2VJbkN1YmljOiBmdW5jdGlvbiBlYXNlSW5DdWJpYyh0KSB7XG4gICAgcmV0dXJuIHQgKiB0ICogdDtcbiAgfSxcbiAgZWFzZU91dEN1YmljOiBmdW5jdGlvbiBlYXNlT3V0Q3ViaWModCkge1xuICAgIHJldHVybiAtLXQgKiB0ICogdCArIDE7XG4gIH0sXG4gIGVhc2VJbk91dEN1YmljOiBmdW5jdGlvbiBlYXNlSW5PdXRDdWJpYyh0KSB7XG4gICAgcmV0dXJuIHQgPCAuNSA/IDQgKiB0ICogdCAqIHQgOiAodCAtIDEpICogKDIgKiB0IC0gMikgKiAoMiAqIHQgLSAyKSArIDE7XG4gIH0sXG4gIGVhc2VJblF1YXJ0OiBmdW5jdGlvbiBlYXNlSW5RdWFydCh0KSB7XG4gICAgcmV0dXJuIHQgKiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VPdXRRdWFydDogZnVuY3Rpb24gZWFzZU91dFF1YXJ0KHQpIHtcbiAgICByZXR1cm4gMSAtIC0tdCAqIHQgKiB0ICogdDtcbiAgfSxcbiAgZWFzZUluT3V0UXVhcnQ6IGZ1bmN0aW9uIGVhc2VJbk91dFF1YXJ0KHQpIHtcbiAgICByZXR1cm4gdCA8IC41ID8gOCAqIHQgKiB0ICogdCAqIHQgOiAxIC0gOCAqIC0tdCAqIHQgKiB0ICogdDtcbiAgfSxcbiAgZWFzZUluUXVpbnQ6IGZ1bmN0aW9uIGVhc2VJblF1aW50KHQpIHtcbiAgICByZXR1cm4gdCAqIHQgKiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VPdXRRdWludDogZnVuY3Rpb24gZWFzZU91dFF1aW50KHQpIHtcbiAgICByZXR1cm4gMSArIC0tdCAqIHQgKiB0ICogdCAqIHQ7XG4gIH0sXG4gIGVhc2VJbk91dFF1aW50OiBmdW5jdGlvbiBlYXNlSW5PdXRRdWludCh0KSB7XG4gICAgcmV0dXJuIHQgPCAuNSA/IDE2ICogdCAqIHQgKiB0ICogdCAqIHQgOiAxICsgMTYgKiAtLXQgKiB0ICogdCAqIHQgKiB0O1xuICB9XG59O1xuXG52YXIgaXNOdW1lcmljID0gZXhwb3J0cy5pc051bWVyaWMgPSBmdW5jdGlvbiBpc051bWVyaWMobikge1xuICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pO1xufTtcblxudmFyIHNldFBvc2l0aW9uID0gZXhwb3J0cy5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIHNldFBvc2l0aW9uKGJlZ2luLCBlbmQsIGVsYXBzZWQsIGR1cmF0aW9uKSB7XG4gIHZhciBlYXNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAnZWFzZUluT3V0Q3ViaWMnO1xuXG4gIHJldHVybiBlbGFwc2VkID4gZHVyYXRpb24gPyBlbmQgOiBiZWdpbiArIChlbmQgLSBiZWdpbikgKiBlYXNlRnVuY3Rpb25zW2Vhc2VdKGVsYXBzZWQgLyBkdXJhdGlvbik7XG59O1xuXG52YXIgY2FsY0VuZFBvaW50ID0gZXhwb3J0cy5jYWxjRW5kUG9pbnQgPSBmdW5jdGlvbiBjYWxjRW5kUG9pbnQodGFyZ2V0KSB7XG4gIHZhciBjb250ZXh0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB3aW5kb3c7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IDA7XG5cbiAgaWYgKGlzTnVtZXJpYyh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRhcmdldCkgKyBvZmZzZXQ7XG4gIH1cblxuICB2YXIgeSA9IGNvbnRleHQgPT09IHdpbmRvdyB8fCBjb250ZXh0ID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgPyB3aW5kb3cucGFnZVlPZmZzZXQgOiBjb250ZXh0LnNjcm9sbFRvcCAtIGNvbnRleHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuXG4gIHZhciBkaXN0YW5jZSA9IHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaHRtbCcgPyAteSA6IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB5O1xuXG4gIHJldHVybiBkaXN0YW5jZSArIG9mZnNldDtcbn07IiwiKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuU2Nyb2xscGFyZW50ID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlZ2V4ID0gLyhhdXRvfHNjcm9sbCkvO1xuXG4gIHZhciBwYXJlbnRzID0gZnVuY3Rpb24gKG5vZGUsIHBzKSB7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSA9PT0gbnVsbCkgeyByZXR1cm4gcHM7IH1cblxuICAgIHJldHVybiBwYXJlbnRzKG5vZGUucGFyZW50Tm9kZSwgcHMuY29uY2F0KFtub2RlXSkpO1xuICB9O1xuXG4gIHZhciBzdHlsZSA9IGZ1bmN0aW9uIChub2RlLCBwcm9wKSB7XG4gICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKTtcbiAgfTtcblxuICB2YXIgb3ZlcmZsb3cgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBzdHlsZShub2RlLCBcIm92ZXJmbG93XCIpICsgc3R5bGUobm9kZSwgXCJvdmVyZmxvdy15XCIpICsgc3R5bGUobm9kZSwgXCJvdmVyZmxvdy14XCIpO1xuICB9O1xuXG4gIHZhciBzY3JvbGwgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgcmV0dXJuIHJlZ2V4LnRlc3Qob3ZlcmZsb3cobm9kZSkpO1xuICB9O1xuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiA7XG4gICAgfVxuXG4gICAgdmFyIHBzID0gcGFyZW50cyhub2RlLnBhcmVudE5vZGUsIFtdKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmIChzY3JvbGwocHNbaV0pKSB7XG4gICAgICAgIHJldHVybiBwc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH07XG5cbiAgcmV0dXJuIHNjcm9sbFBhcmVudDtcbn0pKTtcbiIsIi8vXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIsIGNvbXBhcmUsIGNvbXBhcmVDb250ZXh0KSB7XG4gIHZhciByZXQgPSBjb21wYXJlID8gY29tcGFyZS5jYWxsKGNvbXBhcmVDb250ZXh0LCBvYmpBLCBvYmpCKSA6IHZvaWQgMDtcblxuICBpZiAocmV0ICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gISFyZXQ7XG4gIH1cblxuICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSBcIm9iamVjdFwiIHx8ICFvYmpBIHx8IHR5cGVvZiBvYmpCICE9PSBcIm9iamVjdFwiIHx8ICFvYmpCKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBiSGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmJpbmQob2JqQik7XG5cbiAgLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cbiAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwga2V5c0EubGVuZ3RoOyBpZHgrKykge1xuICAgIHZhciBrZXkgPSBrZXlzQVtpZHhdO1xuXG4gICAgaWYgKCFiSGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZUEgPSBvYmpBW2tleV07XG4gICAgdmFyIHZhbHVlQiA9IG9iakJba2V5XTtcblxuICAgIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIHZhbHVlQSwgdmFsdWVCLCBrZXkpIDogdm9pZCAwO1xuXG4gICAgaWYgKHJldCA9PT0gZmFsc2UgfHwgKHJldCA9PT0gdm9pZCAwICYmIHZhbHVlQSAhPT0gdmFsdWVCKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3JlYWN0LWRhdGVwaWNrZXIuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3JlYWN0LWRhdGVwaWNrZXIuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9pbmRleC5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9pbmRleC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL29wZW5zaWduZHJpdmUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vb3BlbnNpZ25kcml2ZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NpZ25hdHVyZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zaWduYXR1cmUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzdHlsZXNJbkRPTSA9IFtdO1xuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuICAgIGlmIChpbmRleEJ5SWRlbnRpZmllciAhPT0gLTEpIHtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS5yZWZlcmVuY2VzKys7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0udXBkYXRlcihvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXBkYXRlciA9IGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5ieUluZGV4ID0gaTtcbiAgICAgIHN0eWxlc0luRE9NLnNwbGljZShpLCAwLCB7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IHVwZGF0ZXIsXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cbmZ1bmN0aW9uIGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpIHtcbiAgdmFyIGFwaSA9IG9wdGlvbnMuZG9tQVBJKG9wdGlvbnMpO1xuICBhcGkudXBkYXRlKG9iaik7XG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZXI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cbiAgICB2YXIgbmV3TGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKG5ld0xpc3QsIG9wdGlvbnMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcbiAgICAgIGlmIChzdHlsZXNJbkRPTVtfaW5kZXhdLnJlZmVyZW5jZXMgPT09IDApIHtcbiAgICAgICAgc3R5bGVzSW5ET01bX2luZGV4XS51cGRhdGVyKCk7XG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cbiAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRCeVNlbGVjdG9yKGluc2VydCwgc3R5bGUpIHtcbiAgdmFyIHRhcmdldCA9IGdldFRhcmdldChpbnNlcnQpO1xuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0QnlTZWxlY3RvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwiQG1lZGlhIFwiLmNvbmNhdChvYmoubWVkaWEsIFwiIHtcIik7XG4gIH1cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cbiAgY3NzICs9IG9iai5jc3M7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH1cblxuICAvLyBGb3Igb2xkIElFXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7fSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICB9O1xuICB9XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiLCJpbXBvcnR7dHlwZU9mIGFzIGUsaXNFbGVtZW50IGFzIHQsaXNWYWxpZEVsZW1lbnRUeXBlIGFzIG59ZnJvbVwicmVhY3QtaXNcIjtpbXBvcnQgcix7dXNlU3RhdGUgYXMgbyx1c2VDb250ZXh0IGFzIHMsdXNlTWVtbyBhcyBpLHVzZUVmZmVjdCBhcyBhLHVzZVJlZiBhcyBjLGNyZWF0ZUVsZW1lbnQgYXMgdSx1c2VMYXlvdXRFZmZlY3QgYXMgbH1mcm9tXCJyZWFjdFwiO2ltcG9ydCBkIGZyb21cInNoYWxsb3dlcXVhbFwiO2ltcG9ydCBoIGZyb21cIkBlbW90aW9uL3N0eWxpc1wiO2ltcG9ydCBwIGZyb21cIkBlbW90aW9uL3VuaXRsZXNzXCI7aW1wb3J0IGYgZnJvbVwiQGVtb3Rpb24vaXMtcHJvcC12YWxpZFwiO2ltcG9ydCBtIGZyb21cImhvaXN0LW5vbi1yZWFjdC1zdGF0aWNzXCI7ZnVuY3Rpb24geSgpe3JldHVybih5PU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIHY9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W2VbMF1dLHI9MCxvPXQubGVuZ3RoO3I8bztyKz0xKW4ucHVzaCh0W3JdLGVbcisxXSk7cmV0dXJuIG59LGc9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10JiZcIm9iamVjdFwiPT10eXBlb2YgdCYmXCJbb2JqZWN0IE9iamVjdF1cIj09PSh0LnRvU3RyaW5nP3QudG9TdHJpbmcoKTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpJiYhZSh0KX0sUz1PYmplY3QuZnJlZXplKFtdKSx3PU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIEUoZSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgZX1mdW5jdGlvbiBiKGUpe3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwic3RyaW5nXCI9PXR5cGVvZiBlJiZlfHxlLmRpc3BsYXlOYW1lfHxlLm5hbWV8fFwiQ29tcG9uZW50XCJ9ZnVuY3Rpb24gXyhlKXtyZXR1cm4gZSYmXCJzdHJpbmdcIj09dHlwZW9mIGUuc3R5bGVkQ29tcG9uZW50SWR9dmFyIE49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHByb2Nlc3MmJnZvaWQgMCE9PXByb2Nlc3MuZW52JiYocHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NDX0FUVFJ8fHByb2Nlc3MuZW52LlNDX0FUVFIpfHxcImRhdGEtc3R5bGVkXCIsQT1cIjUuMy4xMVwiLEM9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmXCJIVE1MRWxlbWVudFwiaW4gd2luZG93LEk9Qm9vbGVhbihcImJvb2xlYW5cIj09dHlwZW9mIFNDX0RJU0FCTEVfU1BFRURZP1NDX0RJU0FCTEVfU1BFRURZOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBwcm9jZXNzJiZ2b2lkIDAhPT1wcm9jZXNzLmVudiYmKHZvaWQgMCE9PXByb2Nlc3MuZW52LlJFQUNUX0FQUF9TQ19ESVNBQkxFX1NQRUVEWSYmXCJcIiE9PXByb2Nlc3MuZW52LlJFQUNUX0FQUF9TQ19ESVNBQkxFX1NQRUVEWT9cImZhbHNlXCIhPT1wcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfRElTQUJMRV9TUEVFRFkmJnByb2Nlc3MuZW52LlJFQUNUX0FQUF9TQ19ESVNBQkxFX1NQRUVEWTp2b2lkIDAhPT1wcm9jZXNzLmVudi5TQ19ESVNBQkxFX1NQRUVEWSYmXCJcIiE9PXByb2Nlc3MuZW52LlNDX0RJU0FCTEVfU1BFRURZP1wiZmFsc2VcIiE9PXByb2Nlc3MuZW52LlNDX0RJU0FCTEVfU1BFRURZJiZwcm9jZXNzLmVudi5TQ19ESVNBQkxFX1NQRUVEWTpcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WKSksUD17fSxPPVwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlY/ezE6XCJDYW5ub3QgY3JlYXRlIHN0eWxlZC1jb21wb25lbnQgZm9yIGNvbXBvbmVudDogJXMuXFxuXFxuXCIsMjpcIkNhbid0IGNvbGxlY3Qgc3R5bGVzIG9uY2UgeW91J3ZlIGNvbnN1bWVkIGEgYFNlcnZlclN0eWxlU2hlZXRgJ3Mgc3R5bGVzISBgU2VydmVyU3R5bGVTaGVldGAgaXMgYSBvbmUgb2ZmIGluc3RhbmNlIGZvciBlYWNoIHNlcnZlci1zaWRlIHJlbmRlciBjeWNsZS5cXG5cXG4tIEFyZSB5b3UgdHJ5aW5nIHRvIHJldXNlIGl0IGFjcm9zcyByZW5kZXJzP1xcbi0gQXJlIHlvdSBhY2NpZGVudGFsbHkgY2FsbGluZyBjb2xsZWN0U3R5bGVzIHR3aWNlP1xcblxcblwiLDM6XCJTdHJlYW1pbmcgU1NSIGlzIG9ubHkgc3VwcG9ydGVkIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudDsgUGxlYXNlIGRvIG5vdCB0cnkgdG8gY2FsbCB0aGlzIG1ldGhvZCBpbiB0aGUgYnJvd3Nlci5cXG5cXG5cIiw0OlwiVGhlIGBTdHlsZVNoZWV0TWFuYWdlcmAgZXhwZWN0cyBhIHZhbGlkIHRhcmdldCBvciBzaGVldCBwcm9wIVxcblxcbi0gRG9lcyB0aGlzIGVycm9yIG9jY3VyIG9uIHRoZSBjbGllbnQgYW5kIGlzIHlvdXIgdGFyZ2V0IGZhbHN5P1xcbi0gRG9lcyB0aGlzIGVycm9yIG9jY3VyIG9uIHRoZSBzZXJ2ZXIgYW5kIGlzIHRoZSBzaGVldCBmYWxzeT9cXG5cXG5cIiw1OlwiVGhlIGNsb25lIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCBvbiB0aGUgY2xpZW50IVxcblxcbi0gQXJlIHlvdSBydW5uaW5nIGluIGEgY2xpZW50LWxpa2UgZW52aXJvbm1lbnQgb24gdGhlIHNlcnZlcj9cXG4tIEFyZSB5b3UgdHJ5aW5nIHRvIHJ1biBTU1Igb24gdGhlIGNsaWVudD9cXG5cXG5cIiw2OlwiVHJ5aW5nIHRvIGluc2VydCBhIG5ldyBzdHlsZSB0YWcsIGJ1dCB0aGUgZ2l2ZW4gTm9kZSBpcyB1bm1vdW50ZWQhXFxuXFxuLSBBcmUgeW91IHVzaW5nIGEgY3VzdG9tIHRhcmdldCB0aGF0IGlzbid0IG1vdW50ZWQ/XFxuLSBEb2VzIHlvdXIgZG9jdW1lbnQgbm90IGhhdmUgYSB2YWxpZCBoZWFkIGVsZW1lbnQ/XFxuLSBIYXZlIHlvdSBhY2NpZGVudGFsbHkgcmVtb3ZlZCBhIHN0eWxlIHRhZyBtYW51YWxseT9cXG5cXG5cIiw3OidUaGVtZVByb3ZpZGVyOiBQbGVhc2UgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHlvdXIgXCJ0aGVtZVwiIHByb3AgZnVuY3Rpb24sIGUuZy5cXG5cXG5gYGBqc1xcbnRoZW1lPXsoKSA9PiAoe30pfVxcbmBgYFxcblxcbicsODonVGhlbWVQcm92aWRlcjogUGxlYXNlIG1ha2UgeW91ciBcInRoZW1lXCIgcHJvcCBhbiBvYmplY3QuXFxuXFxuJyw5OlwiTWlzc2luZyBkb2N1bWVudCBgPGhlYWQ+YFxcblxcblwiLDEwOlwiQ2Fubm90IGZpbmQgYSBTdHlsZVNoZWV0IGluc3RhbmNlLiBVc3VhbGx5IHRoaXMgaGFwcGVucyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29waWVzIG9mIHN0eWxlZC1jb21wb25lbnRzIGxvYWRlZCBhdCBvbmNlLiBDaGVjayBvdXQgdGhpcyBpc3N1ZSBmb3IgaG93IHRvIHRyb3VibGVzaG9vdCBhbmQgZml4IHRoZSBjb21tb24gY2FzZXMgd2hlcmUgdGhpcyBzaXR1YXRpb24gY2FuIGhhcHBlbjogaHR0cHM6Ly9naXRodWIuY29tL3N0eWxlZC1jb21wb25lbnRzL3N0eWxlZC1jb21wb25lbnRzL2lzc3Vlcy8xOTQxI2lzc3VlY29tbWVudC00MTc4NjIwMjFcXG5cXG5cIiwxMTpcIl9UaGlzIGVycm9yIHdhcyByZXBsYWNlZCB3aXRoIGEgZGV2LXRpbWUgd2FybmluZywgaXQgd2lsbCBiZSBkZWxldGVkIGZvciB2NCBmaW5hbC5fIFtjcmVhdGVHbG9iYWxTdHlsZV0gcmVjZWl2ZWQgY2hpbGRyZW4gd2hpY2ggd2lsbCBub3QgYmUgcmVuZGVyZWQuIFBsZWFzZSB1c2UgdGhlIGNvbXBvbmVudCB3aXRob3V0IHBhc3NpbmcgY2hpbGRyZW4gZWxlbWVudHMuXFxuXFxuXCIsMTI6XCJJdCBzZWVtcyB5b3UgYXJlIGludGVycG9sYXRpbmcgYSBrZXlmcmFtZSBkZWNsYXJhdGlvbiAoJXMpIGludG8gYW4gdW50YWdnZWQgc3RyaW5nLiBUaGlzIHdhcyBzdXBwb3J0ZWQgaW4gc3R5bGVkLWNvbXBvbmVudHMgdjMsIGJ1dCBpcyBub3QgbG9uZ2VyIHN1cHBvcnRlZCBpbiB2NCBhcyBrZXlmcmFtZXMgYXJlIG5vdyBpbmplY3RlZCBvbi1kZW1hbmQuIFBsZWFzZSB3cmFwIHlvdXIgc3RyaW5nIGluIHRoZSBjc3NcXFxcYFxcXFxgIGhlbHBlciB3aGljaCBlbnN1cmVzIHRoZSBzdHlsZXMgYXJlIGluamVjdGVkIGNvcnJlY3RseS4gU2VlIGh0dHBzOi8vd3d3LnN0eWxlZC1jb21wb25lbnRzLmNvbS9kb2NzL2FwaSNjc3NcXG5cXG5cIiwxMzpcIiVzIGlzIG5vdCBhIHN0eWxlZCBjb21wb25lbnQgYW5kIGNhbm5vdCBiZSByZWZlcnJlZCB0byB2aWEgY29tcG9uZW50IHNlbGVjdG9yLiBTZWUgaHR0cHM6Ly93d3cuc3R5bGVkLWNvbXBvbmVudHMuY29tL2RvY3MvYWR2YW5jZWQjcmVmZXJyaW5nLXRvLW90aGVyLWNvbXBvbmVudHMgZm9yIG1vcmUgZGV0YWlscy5cXG5cXG5cIiwxNDonVGhlbWVQcm92aWRlcjogXCJ0aGVtZVwiIHByb3AgaXMgcmVxdWlyZWQuXFxuXFxuJywxNTpcIkEgc3R5bGlzIHBsdWdpbiBoYXMgYmVlbiBzdXBwbGllZCB0aGF0IGlzIG5vdCBuYW1lZC4gV2UgbmVlZCBhIG5hbWUgZm9yIGVhY2ggcGx1Z2luIHRvIGJlIGFibGUgdG8gcHJldmVudCBzdHlsaW5nIGNvbGxpc2lvbnMgYmV0d2VlbiBkaWZmZXJlbnQgc3R5bGlzIGNvbmZpZ3VyYXRpb25zIHdpdGhpbiB0aGUgc2FtZSBhcHAuIEJlZm9yZSB5b3UgcGFzcyB5b3VyIHBsdWdpbiB0byBgPFN0eWxlU2hlZXRNYW5hZ2VyIHN0eWxpc1BsdWdpbnM9e1tdfT5gLCBwbGVhc2UgbWFrZSBzdXJlIGVhY2ggcGx1Z2luIGlzIHVuaXF1ZWx5LW5hbWVkLCBlLmcuXFxuXFxuYGBganNcXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoaW1wb3J0ZWRQbHVnaW4sICduYW1lJywgeyB2YWx1ZTogJ3NvbWUtdW5pcXVlLW5hbWUnIH0pO1xcbmBgYFxcblxcblwiLDE2OlwiUmVhY2hlZCB0aGUgbGltaXQgb2YgaG93IG1hbnkgc3R5bGVkIGNvbXBvbmVudHMgbWF5IGJlIGNyZWF0ZWQgYXQgZ3JvdXAgJXMuXFxuWW91IG1heSBvbmx5IGNyZWF0ZSB1cCB0byAxLDA3Myw3NDEsODI0IGNvbXBvbmVudHMuIElmIHlvdSdyZSBjcmVhdGluZyBjb21wb25lbnRzIGR5bmFtaWNhbGx5LFxcbmFzIGZvciBpbnN0YW5jZSBpbiB5b3VyIHJlbmRlciBtZXRob2QgdGhlbiB5b3UgbWF5IGJlIHJ1bm5pbmcgaW50byB0aGlzIGxpbWl0YXRpb24uXFxuXFxuXCIsMTc6XCJDU1NTdHlsZVNoZWV0IGNvdWxkIG5vdCBiZSBmb3VuZCBvbiBIVE1MU3R5bGVFbGVtZW50LlxcbkhhcyBzdHlsZWQtY29tcG9uZW50cycgc3R5bGUgdGFnIGJlZW4gdW5tb3VudGVkIG9yIGFsdGVyZWQgYnkgYW5vdGhlciBzY3JpcHQ/XFxuXCJ9Ont9O2Z1bmN0aW9uIFIoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aDw9MD92b2lkIDA6YXJndW1lbnRzWzBdLHQ9W10sbj0xLHI9YXJndW1lbnRzLmxlbmd0aDtuPHI7bis9MSl0LnB1c2gobjwwfHxhcmd1bWVudHMubGVuZ3RoPD1uP3ZvaWQgMDphcmd1bWVudHNbbl0pO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2U9ZS5yZXBsYWNlKC8lW2Etel0vLHQpfSkpLGV9ZnVuY3Rpb24gRChlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0PjE/dC0xOjApLHI9MTtyPHQ7cisrKW5bci0xXT1hcmd1bWVudHNbcl07dGhyb3dcInByb2R1Y3Rpb25cIj09PXByb2Nlc3MuZW52Lk5PREVfRU5WP25ldyBFcnJvcihcIkFuIGVycm9yIG9jY3VycmVkLiBTZWUgaHR0cHM6Ly9naXQuaW8vSlVJYUUjXCIrZStcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIisobi5sZW5ndGg+MD9cIiBBcmdzOiBcIituLmpvaW4oXCIsIFwiKTpcIlwiKSk6bmV3IEVycm9yKFIuYXBwbHkodm9pZCAwLFtPW2VdXS5jb25jYXQobikpLnRyaW0oKSl9dmFyIGo9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuZ3JvdXBTaXplcz1uZXcgVWludDMyQXJyYXkoNTEyKSx0aGlzLmxlbmd0aD01MTIsdGhpcy50YWc9ZX12YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5pbmRleE9mR3JvdXA9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj0wO248ZTtuKyspdCs9dGhpcy5ncm91cFNpemVzW25dO3JldHVybiB0fSx0Lmluc2VydFJ1bGVzPWZ1bmN0aW9uKGUsdCl7aWYoZT49dGhpcy5ncm91cFNpemVzLmxlbmd0aCl7Zm9yKHZhciBuPXRoaXMuZ3JvdXBTaXplcyxyPW4ubGVuZ3RoLG89cjtlPj1vOykobzw8PTEpPDAmJkQoMTYsXCJcIitlKTt0aGlzLmdyb3VwU2l6ZXM9bmV3IFVpbnQzMkFycmF5KG8pLHRoaXMuZ3JvdXBTaXplcy5zZXQobiksdGhpcy5sZW5ndGg9bztmb3IodmFyIHM9cjtzPG87cysrKXRoaXMuZ3JvdXBTaXplc1tzXT0wfWZvcih2YXIgaT10aGlzLmluZGV4T2ZHcm91cChlKzEpLGE9MCxjPXQubGVuZ3RoO2E8YzthKyspdGhpcy50YWcuaW5zZXJ0UnVsZShpLHRbYV0pJiYodGhpcy5ncm91cFNpemVzW2VdKyssaSsrKX0sdC5jbGVhckdyb3VwPWZ1bmN0aW9uKGUpe2lmKGU8dGhpcy5sZW5ndGgpe3ZhciB0PXRoaXMuZ3JvdXBTaXplc1tlXSxuPXRoaXMuaW5kZXhPZkdyb3VwKGUpLHI9bit0O3RoaXMuZ3JvdXBTaXplc1tlXT0wO2Zvcih2YXIgbz1uO288cjtvKyspdGhpcy50YWcuZGVsZXRlUnVsZShuKX19LHQuZ2V0R3JvdXA9ZnVuY3Rpb24oZSl7dmFyIHQ9XCJcIjtpZihlPj10aGlzLmxlbmd0aHx8MD09PXRoaXMuZ3JvdXBTaXplc1tlXSlyZXR1cm4gdDtmb3IodmFyIG49dGhpcy5ncm91cFNpemVzW2VdLHI9dGhpcy5pbmRleE9mR3JvdXAoZSksbz1yK24scz1yO3M8bztzKyspdCs9dGhpcy50YWcuZ2V0UnVsZShzKStcIi8qIXNjKi9cXG5cIjtyZXR1cm4gdH0sZX0oKSxUPW5ldyBNYXAseD1uZXcgTWFwLGs9MSxWPWZ1bmN0aW9uKGUpe2lmKFQuaGFzKGUpKXJldHVybiBULmdldChlKTtmb3IoO3guaGFzKGspOylrKys7dmFyIHQ9aysrO3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJigoMHx0KTwwfHx0PjE8PDMwKSYmRCgxNixcIlwiK3QpLFQuc2V0KGUsdCkseC5zZXQodCxlKSx0fSxCPWZ1bmN0aW9uKGUpe3JldHVybiB4LmdldChlKX0sej1mdW5jdGlvbihlLHQpe3Q+PWsmJihrPXQrMSksVC5zZXQoZSx0KSx4LnNldCh0LGUpfSxNPVwic3R5bGVbXCIrTisnXVtkYXRhLXN0eWxlZC12ZXJzaW9uPVwiNS4zLjExXCJdJyxHPW5ldyBSZWdFeHAoXCJeXCIrTisnXFxcXC5nKFxcXFxkKylcXFxcW2lkPVwiKFtcXFxcd1xcXFxkLV0rKVwiXFxcXF0uKj9cIihbXlwiXSopJyksTD1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByLG89bi5zcGxpdChcIixcIikscz0wLGk9by5sZW5ndGg7czxpO3MrKykocj1vW3NdKSYmZS5yZWdpc3Rlck5hbWUodCxyKX0sRj1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0odC50ZXh0Q29udGVudHx8XCJcIikuc3BsaXQoXCIvKiFzYyovXFxuXCIpLHI9W10sbz0wLHM9bi5sZW5ndGg7bzxzO28rKyl7dmFyIGk9bltvXS50cmltKCk7aWYoaSl7dmFyIGE9aS5tYXRjaChHKTtpZihhKXt2YXIgYz0wfHBhcnNlSW50KGFbMV0sMTApLHU9YVsyXTswIT09YyYmKHoodSxjKSxMKGUsdSxhWzNdKSxlLmdldFRhZygpLmluc2VydFJ1bGVzKGMscikpLHIubGVuZ3RoPTB9ZWxzZSByLnB1c2goaSl9fX0sWT1mdW5jdGlvbigpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXz9fX3dlYnBhY2tfbm9uY2VfXzpudWxsfSxxPWZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmhlYWQsbj1lfHx0LHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpLG89ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuY2hpbGROb2RlcyxuPXQubGVuZ3RoO24+PTA7bi0tKXt2YXIgcj10W25dO2lmKHImJjE9PT1yLm5vZGVUeXBlJiZyLmhhc0F0dHJpYnV0ZShOKSlyZXR1cm4gcn19KG4pLHM9dm9pZCAwIT09bz9vLm5leHRTaWJsaW5nOm51bGw7ci5zZXRBdHRyaWJ1dGUoTixcImFjdGl2ZVwiKSxyLnNldEF0dHJpYnV0ZShcImRhdGEtc3R5bGVkLXZlcnNpb25cIixcIjUuMy4xMVwiKTt2YXIgaT1ZKCk7cmV0dXJuIGkmJnIuc2V0QXR0cmlidXRlKFwibm9uY2VcIixpKSxuLmluc2VydEJlZm9yZShyLHMpLHJ9LEg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3ZhciB0PXRoaXMuZWxlbWVudD1xKGUpO3QuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIikpLHRoaXMuc2hlZXQ9ZnVuY3Rpb24oZSl7aWYoZS5zaGVldClyZXR1cm4gZS5zaGVldDtmb3IodmFyIHQ9ZG9jdW1lbnQuc3R5bGVTaGVldHMsbj0wLHI9dC5sZW5ndGg7bjxyO24rKyl7dmFyIG89dFtuXTtpZihvLm93bmVyTm9kZT09PWUpcmV0dXJuIG99RCgxNyl9KHQpLHRoaXMubGVuZ3RoPTB9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuaW5zZXJ0UnVsZT1mdW5jdGlvbihlLHQpe3RyeXtyZXR1cm4gdGhpcy5zaGVldC5pbnNlcnRSdWxlKHQsZSksdGhpcy5sZW5ndGgrKywhMH1jYXRjaChlKXtyZXR1cm4hMX19LHQuZGVsZXRlUnVsZT1mdW5jdGlvbihlKXt0aGlzLnNoZWV0LmRlbGV0ZVJ1bGUoZSksdGhpcy5sZW5ndGgtLX0sdC5nZXRSdWxlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2hlZXQuY3NzUnVsZXNbZV07cmV0dXJuIHZvaWQgMCE9PXQmJlwic3RyaW5nXCI9PXR5cGVvZiB0LmNzc1RleHQ/dC5jc3NUZXh0OlwiXCJ9LGV9KCksJD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9dGhpcy5lbGVtZW50PXEoZSk7dGhpcy5ub2Rlcz10LmNoaWxkTm9kZXMsdGhpcy5sZW5ndGg9MH12YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5pbnNlcnRSdWxlPWZ1bmN0aW9uKGUsdCl7aWYoZTw9dGhpcy5sZW5ndGgmJmU+PTApe3ZhciBuPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpLHI9dGhpcy5ub2Rlc1tlXTtyZXR1cm4gdGhpcy5lbGVtZW50Lmluc2VydEJlZm9yZShuLHJ8fG51bGwpLHRoaXMubGVuZ3RoKyssITB9cmV0dXJuITF9LHQuZGVsZXRlUnVsZT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlc1tlXSksdGhpcy5sZW5ndGgtLX0sdC5nZXRSdWxlPWZ1bmN0aW9uKGUpe3JldHVybiBlPHRoaXMubGVuZ3RoP3RoaXMubm9kZXNbZV0udGV4dENvbnRlbnQ6XCJcIn0sZX0oKSxXPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLnJ1bGVzPVtdLHRoaXMubGVuZ3RoPTB9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuaW5zZXJ0UnVsZT1mdW5jdGlvbihlLHQpe3JldHVybiBlPD10aGlzLmxlbmd0aCYmKHRoaXMucnVsZXMuc3BsaWNlKGUsMCx0KSx0aGlzLmxlbmd0aCsrLCEwKX0sdC5kZWxldGVSdWxlPWZ1bmN0aW9uKGUpe3RoaXMucnVsZXMuc3BsaWNlKGUsMSksdGhpcy5sZW5ndGgtLX0sdC5nZXRSdWxlPWZ1bmN0aW9uKGUpe3JldHVybiBlPHRoaXMubGVuZ3RoP3RoaXMucnVsZXNbZV06XCJcIn0sZX0oKSxVPUMsSj17aXNTZXJ2ZXI6IUMsdXNlQ1NTT01JbmplY3Rpb246IUl9LFg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxuKXt2b2lkIDA9PT1lJiYoZT13KSx2b2lkIDA9PT10JiYodD17fSksdGhpcy5vcHRpb25zPXkoe30sSix7fSxlKSx0aGlzLmdzPXQsdGhpcy5uYW1lcz1uZXcgTWFwKG4pLHRoaXMuc2VydmVyPSEhZS5pc1NlcnZlciwhdGhpcy5zZXJ2ZXImJkMmJlUmJihVPSExLGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKE0pLG49MCxyPXQubGVuZ3RoO248cjtuKyspe3ZhciBvPXRbbl07byYmXCJhY3RpdmVcIiE9PW8uZ2V0QXR0cmlidXRlKE4pJiYoRihlLG8pLG8ucGFyZW50Tm9kZSYmby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pKX19KHRoaXMpKX1lLnJlZ2lzdGVySWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIFYoZSl9O3ZhciB0PWUucHJvdG90eXBlO3JldHVybiB0LnJlY29uc3RydWN0V2l0aE9wdGlvbnM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49ITApLG5ldyBlKHkoe30sdGhpcy5vcHRpb25zLHt9LHQpLHRoaXMuZ3MsbiYmdGhpcy5uYW1lc3x8dm9pZCAwKX0sdC5hbGxvY2F0ZUdTSW5zdGFuY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ3NbZV09KHRoaXMuZ3NbZV18fDApKzF9LHQuZ2V0VGFnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFnfHwodGhpcy50YWc9KG49KHQ9dGhpcy5vcHRpb25zKS5pc1NlcnZlcixyPXQudXNlQ1NTT01JbmplY3Rpb24sbz10LnRhcmdldCxlPW4/bmV3IFcobyk6cj9uZXcgSChvKTpuZXcgJChvKSxuZXcgaihlKSkpO3ZhciBlLHQsbixyLG99LHQuaGFzTmFtZUZvcklkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubmFtZXMuaGFzKGUpJiZ0aGlzLm5hbWVzLmdldChlKS5oYXModCl9LHQucmVnaXN0ZXJOYW1lPWZ1bmN0aW9uKGUsdCl7aWYoVihlKSx0aGlzLm5hbWVzLmhhcyhlKSl0aGlzLm5hbWVzLmdldChlKS5hZGQodCk7ZWxzZXt2YXIgbj1uZXcgU2V0O24uYWRkKHQpLHRoaXMubmFtZXMuc2V0KGUsbil9fSx0Lmluc2VydFJ1bGVzPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnJlZ2lzdGVyTmFtZShlLHQpLHRoaXMuZ2V0VGFnKCkuaW5zZXJ0UnVsZXMoVihlKSxuKX0sdC5jbGVhck5hbWVzPWZ1bmN0aW9uKGUpe3RoaXMubmFtZXMuaGFzKGUpJiZ0aGlzLm5hbWVzLmdldChlKS5jbGVhcigpfSx0LmNsZWFyUnVsZXM9ZnVuY3Rpb24oZSl7dGhpcy5nZXRUYWcoKS5jbGVhckdyb3VwKFYoZSkpLHRoaXMuY2xlYXJOYW1lcyhlKX0sdC5jbGVhclRhZz1mdW5jdGlvbigpe3RoaXMudGFnPXZvaWQgMH0sdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5nZXRUYWcoKSxuPXQubGVuZ3RoLHI9XCJcIixvPTA7bzxuO28rKyl7dmFyIHM9QihvKTtpZih2b2lkIDAhPT1zKXt2YXIgaT1lLm5hbWVzLmdldChzKSxhPXQuZ2V0R3JvdXAobyk7aWYoaSYmYSYmaS5zaXplKXt2YXIgYz1OK1wiLmdcIitvKydbaWQ9XCInK3MrJ1wiXScsdT1cIlwiO3ZvaWQgMCE9PWkmJmkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5sZW5ndGg+MCYmKHUrPWUrXCIsXCIpfSkpLHIrPVwiXCIrYStjKyd7Y29udGVudDpcIicrdSsnXCJ9Lyohc2MqL1xcbid9fX1yZXR1cm4gcn0odGhpcyl9LGV9KCksWj0vKGEpKGQpL2dpLEs9ZnVuY3Rpb24oZSl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZSsoZT4yNT8zOTo5NykpfTtmdW5jdGlvbiBRKGUpe3ZhciB0LG49XCJcIjtmb3IodD1NYXRoLmFicyhlKTt0PjUyO3Q9dC81MnwwKW49Syh0JTUyKStuO3JldHVybihLKHQlNTIpK24pLnJlcGxhY2UoWixcIiQxLSQyXCIpfXZhciBlZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10Lmxlbmd0aDtuOyllPTMzKmVedC5jaGFyQ29kZUF0KC0tbik7cmV0dXJuIGV9LHRlPWZ1bmN0aW9uKGUpe3JldHVybiBlZSg1MzgxLGUpfTtmdW5jdGlvbiBuZShlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrPTEpe3ZhciBuPWVbdF07aWYoRShuKSYmIV8obikpcmV0dXJuITF9cmV0dXJuITB9dmFyIHJlPXRlKFwiNS4zLjExXCIpLG9lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7dGhpcy5ydWxlcz1lLHRoaXMuc3RhdGljUnVsZXNJZD1cIlwiLHRoaXMuaXNTdGF0aWM9XCJwcm9kdWN0aW9uXCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOViYmKHZvaWQgMD09PW58fG4uaXNTdGF0aWMpJiZuZShlKSx0aGlzLmNvbXBvbmVudElkPXQsdGhpcy5iYXNlSGFzaD1lZShyZSx0KSx0aGlzLmJhc2VTdHlsZT1uLFgucmVnaXN0ZXJJZCh0KX1yZXR1cm4gZS5wcm90b3R5cGUuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuY29tcG9uZW50SWQsbz1bXTtpZih0aGlzLmJhc2VTdHlsZSYmby5wdXNoKHRoaXMuYmFzZVN0eWxlLmdlbmVyYXRlQW5kSW5qZWN0U3R5bGVzKGUsdCxuKSksdGhpcy5pc1N0YXRpYyYmIW4uaGFzaClpZih0aGlzLnN0YXRpY1J1bGVzSWQmJnQuaGFzTmFtZUZvcklkKHIsdGhpcy5zdGF0aWNSdWxlc0lkKSlvLnB1c2godGhpcy5zdGF0aWNSdWxlc0lkKTtlbHNle3ZhciBzPV9lKHRoaXMucnVsZXMsZSx0LG4pLmpvaW4oXCJcIiksaT1RKGVlKHRoaXMuYmFzZUhhc2gscyk+Pj4wKTtpZighdC5oYXNOYW1lRm9ySWQocixpKSl7dmFyIGE9bihzLFwiLlwiK2ksdm9pZCAwLHIpO3QuaW5zZXJ0UnVsZXMocixpLGEpfW8ucHVzaChpKSx0aGlzLnN0YXRpY1J1bGVzSWQ9aX1lbHNle2Zvcih2YXIgYz10aGlzLnJ1bGVzLmxlbmd0aCx1PWVlKHRoaXMuYmFzZUhhc2gsbi5oYXNoKSxsPVwiXCIsZD0wO2Q8YztkKyspe3ZhciBoPXRoaXMucnVsZXNbZF07aWYoXCJzdHJpbmdcIj09dHlwZW9mIGgpbCs9aCxcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiYodT1lZSh1LGgrZCkpO2Vsc2UgaWYoaCl7dmFyIHA9X2UoaCxlLHQsbiksZj1BcnJheS5pc0FycmF5KHApP3Auam9pbihcIlwiKTpwO3U9ZWUodSxmK2QpLGwrPWZ9fWlmKGwpe3ZhciBtPVEodT4+PjApO2lmKCF0Lmhhc05hbWVGb3JJZChyLG0pKXt2YXIgeT1uKGwsXCIuXCIrbSx2b2lkIDAscik7dC5pbnNlcnRSdWxlcyhyLG0seSl9by5wdXNoKG0pfX1yZXR1cm4gby5qb2luKFwiIFwiKX0sZX0oKSxzZT0vXlxccypcXC9cXC8uKiQvZ20saWU9W1wiOlwiLFwiW1wiLFwiLlwiLFwiI1wiXTtmdW5jdGlvbiBhZShlKXt2YXIgdCxuLHIsbyxzPXZvaWQgMD09PWU/dzplLGk9cy5vcHRpb25zLGE9dm9pZCAwPT09aT93OmksYz1zLnBsdWdpbnMsdT12b2lkIDA9PT1jP1M6YyxsPW5ldyBoKGEpLGQ9W10scD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe2lmKHQpdHJ5e2UodCtcIn1cIil9Y2F0Y2goZSl7fX1yZXR1cm4gZnVuY3Rpb24obixyLG8scyxpLGEsYyx1LGwsZCl7c3dpdGNoKG4pe2Nhc2UgMTppZigwPT09bCYmNjQ9PT1yLmNoYXJDb2RlQXQoMCkpcmV0dXJuIGUocitcIjtcIiksXCJcIjticmVhaztjYXNlIDI6aWYoMD09PXUpcmV0dXJuIHIrXCIvKnwqL1wiO2JyZWFrO2Nhc2UgMzpzd2l0Y2godSl7Y2FzZSAxMDI6Y2FzZSAxMTI6cmV0dXJuIGUob1swXStyKSxcIlwiO2RlZmF1bHQ6cmV0dXJuIHIrKDA9PT1kP1wiLyp8Ki9cIjpcIlwiKX1jYXNlLTI6ci5zcGxpdChcIi8qfCovfVwiKS5mb3JFYWNoKHQpfX19KChmdW5jdGlvbihlKXtkLnB1c2goZSl9KSksZj1mdW5jdGlvbihlLHIscyl7cmV0dXJuIDA9PT1yJiYtMSE9PWllLmluZGV4T2Yoc1tuLmxlbmd0aF0pfHxzLm1hdGNoKG8pP2U6XCIuXCIrdH07ZnVuY3Rpb24gbShlLHMsaSxhKXt2b2lkIDA9PT1hJiYoYT1cIiZcIik7dmFyIGM9ZS5yZXBsYWNlKHNlLFwiXCIpLHU9cyYmaT9pK1wiIFwiK3MrXCIgeyBcIitjK1wiIH1cIjpjO3JldHVybiB0PWEsbj1zLHI9bmV3IFJlZ0V4cChcIlxcXFxcIituK1wiXFxcXGJcIixcImdcIiksbz1uZXcgUmVnRXhwKFwiKFxcXFxcIituK1wiXFxcXGIpezIsfVwiKSxsKGl8fCFzP1wiXCI6cyx1KX1yZXR1cm4gbC51c2UoW10uY29uY2F0KHUsW2Z1bmN0aW9uKGUsdCxvKXsyPT09ZSYmby5sZW5ndGgmJm9bMF0ubGFzdEluZGV4T2Yobik+MCYmKG9bMF09b1swXS5yZXBsYWNlKHIsZikpfSxwLGZ1bmN0aW9uKGUpe2lmKC0yPT09ZSl7dmFyIHQ9ZDtyZXR1cm4gZD1bXSx0fX1dKSksbS5oYXNoPXUubGVuZ3RoP3UucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiB0Lm5hbWV8fEQoMTUpLGVlKGUsdC5uYW1lKX0pLDUzODEpLnRvU3RyaW5nKCk6XCJcIixtfXZhciBjZT1yLmNyZWF0ZUNvbnRleHQoKSx1ZT1jZS5Db25zdW1lcixsZT1yLmNyZWF0ZUNvbnRleHQoKSxkZT0obGUuQ29uc3VtZXIsbmV3IFgpLGhlPWFlKCk7ZnVuY3Rpb24gcGUoKXtyZXR1cm4gcyhjZSl8fGRlfWZ1bmN0aW9uIGZlKCl7cmV0dXJuIHMobGUpfHxoZX1mdW5jdGlvbiBtZShlKXt2YXIgdD1vKGUuc3R5bGlzUGx1Z2lucyksbj10WzBdLHM9dFsxXSxjPXBlKCksdT1pKChmdW5jdGlvbigpe3ZhciB0PWM7cmV0dXJuIGUuc2hlZXQ/dD1lLnNoZWV0OmUudGFyZ2V0JiYodD10LnJlY29uc3RydWN0V2l0aE9wdGlvbnMoe3RhcmdldDplLnRhcmdldH0sITEpKSxlLmRpc2FibGVDU1NPTUluamVjdGlvbiYmKHQ9dC5yZWNvbnN0cnVjdFdpdGhPcHRpb25zKHt1c2VDU1NPTUluamVjdGlvbjohMX0pKSx0fSksW2UuZGlzYWJsZUNTU09NSW5qZWN0aW9uLGUuc2hlZXQsZS50YXJnZXRdKSxsPWkoKGZ1bmN0aW9uKCl7cmV0dXJuIGFlKHtvcHRpb25zOntwcmVmaXg6IWUuZGlzYWJsZVZlbmRvclByZWZpeGVzfSxwbHVnaW5zOm59KX0pLFtlLmRpc2FibGVWZW5kb3JQcmVmaXhlcyxuXSk7cmV0dXJuIGEoKGZ1bmN0aW9uKCl7ZChuLGUuc3R5bGlzUGx1Z2lucyl8fHMoZS5zdHlsaXNQbHVnaW5zKX0pLFtlLnN0eWxpc1BsdWdpbnNdKSxyLmNyZWF0ZUVsZW1lbnQoY2UuUHJvdmlkZXIse3ZhbHVlOnV9LHIuY3JlYXRlRWxlbWVudChsZS5Qcm92aWRlcix7dmFsdWU6bH0sXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOVj9yLkNoaWxkcmVuLm9ubHkoZS5jaGlsZHJlbik6ZS5jaGlsZHJlbikpfXZhciB5ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt2YXIgbj10aGlzO3RoaXMuaW5qZWN0PWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9aGUpO3ZhciByPW4ubmFtZSt0Lmhhc2g7ZS5oYXNOYW1lRm9ySWQobi5pZCxyKXx8ZS5pbnNlcnRSdWxlcyhuLmlkLHIsdChuLnJ1bGVzLHIsXCJAa2V5ZnJhbWVzXCIpKX0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBEKDEyLFN0cmluZyhuLm5hbWUpKX0sdGhpcy5uYW1lPWUsdGhpcy5pZD1cInNjLWtleWZyYW1lcy1cIitlLHRoaXMucnVsZXM9dH1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9aGUpLHRoaXMubmFtZStlLmhhc2h9LGV9KCksdmU9LyhbQS1aXSkvLGdlPS8oW0EtWl0pL2csU2U9L15tcy0vLHdlPWZ1bmN0aW9uKGUpe3JldHVyblwiLVwiK2UudG9Mb3dlckNhc2UoKX07ZnVuY3Rpb24gRWUoZSl7cmV0dXJuIHZlLnRlc3QoZSk/ZS5yZXBsYWNlKGdlLHdlKS5yZXBsYWNlKFNlLFwiLW1zLVwiKTplfXZhciBiZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZXx8ITE9PT1lfHxcIlwiPT09ZX07ZnVuY3Rpb24gX2UoZSxuLHIsbyl7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciBzLGk9W10sYT0wLGM9ZS5sZW5ndGg7YTxjO2ErPTEpXCJcIiE9PShzPV9lKGVbYV0sbixyLG8pKSYmKEFycmF5LmlzQXJyYXkocyk/aS5wdXNoLmFwcGx5KGkscyk6aS5wdXNoKHMpKTtyZXR1cm4gaX1pZihiZShlKSlyZXR1cm5cIlwiO2lmKF8oZSkpcmV0dXJuXCIuXCIrZS5zdHlsZWRDb21wb25lbnRJZDtpZihFKGUpKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZihsPWUpfHxsLnByb3RvdHlwZSYmbC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudHx8IW4pcmV0dXJuIGU7dmFyIHU9ZShuKTtyZXR1cm5cInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZ0KHUpJiZjb25zb2xlLndhcm4oYihlKStcIiBpcyBub3QgYSBzdHlsZWQgY29tcG9uZW50IGFuZCBjYW5ub3QgYmUgcmVmZXJyZWQgdG8gdmlhIGNvbXBvbmVudCBzZWxlY3Rvci4gU2VlIGh0dHBzOi8vd3d3LnN0eWxlZC1jb21wb25lbnRzLmNvbS9kb2NzL2FkdmFuY2VkI3JlZmVycmluZy10by1vdGhlci1jb21wb25lbnRzIGZvciBtb3JlIGRldGFpbHMuXCIpLF9lKHUsbixyLG8pfXZhciBsO3JldHVybiBlIGluc3RhbmNlb2YgeWU/cj8oZS5pbmplY3QocixvKSxlLmdldE5hbWUobykpOmU6ZyhlKT9mdW5jdGlvbiBlKHQsbil7dmFyIHIsbyxzPVtdO2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJiFiZSh0W2ldKSYmKEFycmF5LmlzQXJyYXkodFtpXSkmJnRbaV0uaXNDc3N8fEUodFtpXSk/cy5wdXNoKEVlKGkpK1wiOlwiLHRbaV0sXCI7XCIpOmcodFtpXSk/cy5wdXNoLmFwcGx5KHMsZSh0W2ldLGkpKTpzLnB1c2goRWUoaSkrXCI6IFwiKyhyPWksbnVsbD09KG89dFtpXSl8fFwiYm9vbGVhblwiPT10eXBlb2Ygb3x8XCJcIj09PW8/XCJcIjpcIm51bWJlclwiIT10eXBlb2Ygb3x8MD09PW98fHIgaW4gcHx8ci5zdGFydHNXaXRoKFwiLS1cIik/U3RyaW5nKG8pLnRyaW0oKTpvK1wicHhcIikrXCI7XCIpKTtyZXR1cm4gbj9bbitcIiB7XCJdLmNvbmNhdChzLFtcIn1cIl0pOnN9KGUpOmUudG9TdHJpbmcoKX12YXIgTmU9ZnVuY3Rpb24oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJihlLmlzQ3NzPSEwKSxlfTtmdW5jdGlvbiBBZShlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0PjE/dC0xOjApLHI9MTtyPHQ7cisrKW5bci0xXT1hcmd1bWVudHNbcl07cmV0dXJuIEUoZSl8fGcoZSk/TmUoX2UodihTLFtlXS5jb25jYXQobikpKSk6MD09PW4ubGVuZ3RoJiYxPT09ZS5sZW5ndGgmJlwic3RyaW5nXCI9PXR5cGVvZiBlWzBdP2U6TmUoX2UodihlLG4pKSl9dmFyIENlPS9pbnZhbGlkIGhvb2sgY2FsbC9pLEllPW5ldyBTZXQsUGU9ZnVuY3Rpb24oZSx0KXtpZihcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WKXt2YXIgbj1cIlRoZSBjb21wb25lbnQgXCIrZSsodD8nIHdpdGggdGhlIGlkIG9mIFwiJyt0KydcIic6XCJcIikrXCIgaGFzIGJlZW4gY3JlYXRlZCBkeW5hbWljYWxseS5cXG5Zb3UgbWF5IHNlZSB0aGlzIHdhcm5pbmcgYmVjYXVzZSB5b3UndmUgY2FsbGVkIHN0eWxlZCBpbnNpZGUgYW5vdGhlciBjb21wb25lbnQuXFxuVG8gcmVzb2x2ZSB0aGlzIG9ubHkgY3JlYXRlIG5ldyBTdHlsZWRDb21wb25lbnRzIG91dHNpZGUgb2YgYW55IHJlbmRlciBtZXRob2QgYW5kIGZ1bmN0aW9uIGNvbXBvbmVudC5cIixyPWNvbnNvbGUuZXJyb3I7dHJ5e3ZhciBvPSEwO2NvbnNvbGUuZXJyb3I9ZnVuY3Rpb24oZSl7aWYoQ2UudGVzdChlKSlvPSExLEllLmRlbGV0ZShuKTtlbHNle2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLHM9bmV3IEFycmF5KHQ+MT90LTE6MCksaT0xO2k8dDtpKyspc1tpLTFdPWFyZ3VtZW50c1tpXTtyLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KHMpKX19LGMoKSxvJiYhSWUuaGFzKG4pJiYoY29uc29sZS53YXJuKG4pLEllLmFkZChuKSl9Y2F0Y2goZSl7Q2UudGVzdChlLm1lc3NhZ2UpJiZJZS5kZWxldGUobil9ZmluYWxseXtjb25zb2xlLmVycm9yPXJ9fX0sT2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj13KSxlLnRoZW1lIT09bi50aGVtZSYmZS50aGVtZXx8dHx8bi50aGVtZX0sUmU9L1shXCIjJCUmJygpKissLi86Ozw9Pj9AW1xcXFxcXF1eYHt8fX4tXSsvZyxEZT0vKF4tfC0kKS9nO2Z1bmN0aW9uIGplKGUpe3JldHVybiBlLnJlcGxhY2UoUmUsXCItXCIpLnJlcGxhY2UoRGUsXCJcIil9dmFyIFRlPWZ1bmN0aW9uKGUpe3JldHVybiBRKHRlKGUpPj4+MCl9O2Z1bmN0aW9uIHhlKGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlJiYoXCJwcm9kdWN0aW9uXCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOVnx8ZS5jaGFyQXQoMCk9PT1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpKX12YXIga2U9ZnVuY3Rpb24oZSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgZXx8XCJvYmplY3RcIj09dHlwZW9mIGUmJm51bGwhPT1lJiYhQXJyYXkuaXNBcnJheShlKX0sVmU9ZnVuY3Rpb24oZSl7cmV0dXJuXCJfX3Byb3RvX19cIiE9PWUmJlwiY29uc3RydWN0b3JcIiE9PWUmJlwicHJvdG90eXBlXCIhPT1lfTtmdW5jdGlvbiBCZShlLHQsbil7dmFyIHI9ZVtuXTtrZSh0KSYma2Uocik/emUocix0KTplW25dPXR9ZnVuY3Rpb24gemUoZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodD4xP3QtMTowKSxyPTE7cjx0O3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2Zvcih2YXIgbz0wLHM9bjtvPHMubGVuZ3RoO28rKyl7dmFyIGk9c1tvXTtpZihrZShpKSlmb3IodmFyIGEgaW4gaSlWZShhKSYmQmUoZSxpW2FdLGEpfXJldHVybiBlfXZhciBNZT1yLmNyZWF0ZUNvbnRleHQoKSxHZT1NZS5Db25zdW1lcjtmdW5jdGlvbiBMZShlKXt2YXIgdD1zKE1lKSxuPWkoKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuIEQoMTQpO2lmKEUoZSkpe3ZhciBuPWUodCk7cmV0dXJuXCJwcm9kdWN0aW9uXCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOVnx8bnVsbCE9PW4mJiFBcnJheS5pc0FycmF5KG4pJiZcIm9iamVjdFwiPT10eXBlb2Ygbj9uOkQoNyl9cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl8fFwib2JqZWN0XCIhPXR5cGVvZiBlP0QoOCk6dD95KHt9LHQse30sZSk6ZX0oZS50aGVtZSx0KX0pLFtlLnRoZW1lLHRdKTtyZXR1cm4gZS5jaGlsZHJlbj9yLmNyZWF0ZUVsZW1lbnQoTWUuUHJvdmlkZXIse3ZhbHVlOm59LGUuY2hpbGRyZW4pOm51bGx9dmFyIEZlPXt9O2Z1bmN0aW9uIFllKGUsdCxuKXt2YXIgbz1fKGUpLGk9IXhlKGUpLGE9dC5hdHRycyxjPXZvaWQgMD09PWE/UzphLGw9dC5jb21wb25lbnRJZCxkPXZvaWQgMD09PWw/ZnVuY3Rpb24oZSx0KXt2YXIgbj1cInN0cmluZ1wiIT10eXBlb2YgZT9cInNjXCI6amUoZSk7RmVbbl09KEZlW25dfHwwKSsxO3ZhciByPW4rXCItXCIrVGUoXCI1LjMuMTFcIituK0ZlW25dKTtyZXR1cm4gdD90K1wiLVwiK3I6cn0odC5kaXNwbGF5TmFtZSx0LnBhcmVudENvbXBvbmVudElkKTpsLGg9dC5kaXNwbGF5TmFtZSxwPXZvaWQgMD09PWg/ZnVuY3Rpb24oZSl7cmV0dXJuIHhlKGUpP1wic3R5bGVkLlwiK2U6XCJTdHlsZWQoXCIrYihlKStcIilcIn0oZSk6aCx2PXQuZGlzcGxheU5hbWUmJnQuY29tcG9uZW50SWQ/amUodC5kaXNwbGF5TmFtZSkrXCItXCIrdC5jb21wb25lbnRJZDp0LmNvbXBvbmVudElkfHxkLGc9byYmZS5hdHRycz9BcnJheS5wcm90b3R5cGUuY29uY2F0KGUuYXR0cnMsYykuZmlsdGVyKEJvb2xlYW4pOmMsTj10LnNob3VsZEZvcndhcmRQcm9wO28mJmUuc2hvdWxkRm9yd2FyZFByb3AmJihOPXQuc2hvdWxkRm9yd2FyZFByb3A/ZnVuY3Rpb24obixyLG8pe3JldHVybiBlLnNob3VsZEZvcndhcmRQcm9wKG4scixvKSYmdC5zaG91bGRGb3J3YXJkUHJvcChuLHIsbyl9OmUuc2hvdWxkRm9yd2FyZFByb3ApO3ZhciBBLEM9bmV3IG9lKG4sdixvP2UuY29tcG9uZW50U3R5bGU6dm9pZCAwKSxJPUMuaXNTdGF0aWMmJjA9PT1jLmxlbmd0aCxQPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWUuYXR0cnMsaT1lLmNvbXBvbmVudFN0eWxlLGE9ZS5kZWZhdWx0UHJvcHMsYz1lLmZvbGRlZENvbXBvbmVudElkcyxsPWUuc2hvdWxkRm9yd2FyZFByb3AsZD1lLnN0eWxlZENvbXBvbmVudElkLGg9ZS50YXJnZXQscD1mdW5jdGlvbihlLHQsbil7dm9pZCAwPT09ZSYmKGU9dyk7dmFyIHI9eSh7fSx0LHt0aGVtZTplfSksbz17fTtyZXR1cm4gbi5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdCxuLHMsaT1lO2Zvcih0IGluIEUoaSkmJihpPWkocikpLGkpclt0XT1vW3RdPVwiY2xhc3NOYW1lXCI9PT10PyhuPW9bdF0scz1pW3RdLG4mJnM/bitcIiBcIitzOm58fHMpOmlbdF19KSksW3Isb119KE9lKHQscyhNZSksYSl8fHcsdCxvKSxtPXBbMF0sdj1wWzFdLGc9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89cGUoKSxzPWZlKCksaT10P2UuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXModyxvLHMpOmUuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXMobixvLHMpO3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJiF0JiZyJiZyKGkpLGl9KGkscixtLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlY/ZS53YXJuVG9vTWFueUNsYXNzZXM6dm9pZCAwKSxTPW4sYj12LiRhc3x8dC4kYXN8fHYuYXN8fHQuYXN8fGgsXz14ZShiKSxOPXYhPT10P3koe30sdCx7fSx2KTp0LEE9e307Zm9yKHZhciBDIGluIE4pXCIkXCIhPT1DWzBdJiZcImFzXCIhPT1DJiYoXCJmb3J3YXJkZWRBc1wiPT09Qz9BLmFzPU5bQ106KGw/bChDLGYsYik6IV98fGYoQykpJiYoQVtDXT1OW0NdKSk7cmV0dXJuIHQuc3R5bGUmJnYuc3R5bGUhPT10LnN0eWxlJiYoQS5zdHlsZT15KHt9LHQuc3R5bGUse30sdi5zdHlsZSkpLEEuY2xhc3NOYW1lPUFycmF5LnByb3RvdHlwZS5jb25jYXQoYyxkLGchPT1kP2c6bnVsbCx0LmNsYXNzTmFtZSx2LmNsYXNzTmFtZSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpLEEucmVmPVMsdShiLEEpfShBLGUsdCxJKX07cmV0dXJuIFAuZGlzcGxheU5hbWU9cCwoQT1yLmZvcndhcmRSZWYoUCkpLmF0dHJzPWcsQS5jb21wb25lbnRTdHlsZT1DLEEuZGlzcGxheU5hbWU9cCxBLnNob3VsZEZvcndhcmRQcm9wPU4sQS5mb2xkZWRDb21wb25lbnRJZHM9bz9BcnJheS5wcm90b3R5cGUuY29uY2F0KGUuZm9sZGVkQ29tcG9uZW50SWRzLGUuc3R5bGVkQ29tcG9uZW50SWQpOlMsQS5zdHlsZWRDb21wb25lbnRJZD12LEEudGFyZ2V0PW8/ZS50YXJnZXQ6ZSxBLndpdGhDb21wb25lbnQ9ZnVuY3Rpb24oZSl7dmFyIHI9dC5jb21wb25lbnRJZCxvPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSlyZXR1cm57fTt2YXIgbixyLG89e30scz1PYmplY3Qua2V5cyhlKTtmb3Iocj0wO3I8cy5sZW5ndGg7cisrKW49c1tyXSx0LmluZGV4T2Yobik+PTB8fChvW25dPWVbbl0pO3JldHVybiBvfSh0LFtcImNvbXBvbmVudElkXCJdKSxzPXImJnIrXCItXCIrKHhlKGUpP2U6amUoYihlKSkpO3JldHVybiBZZShlLHkoe30sbyx7YXR0cnM6Zyxjb21wb25lbnRJZDpzfSksbil9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLFwiZGVmYXVsdFByb3BzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb2xkZWREZWZhdWx0UHJvcHN9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9mb2xkZWREZWZhdWx0UHJvcHM9bz96ZSh7fSxlLmRlZmF1bHRQcm9wcyx0KTp0fX0pLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJihQZShwLHYpLEEud2FyblRvb01hbnlDbGFzc2VzPWZ1bmN0aW9uKGUsdCl7dmFyIG49e30scj0hMTtyZXR1cm4gZnVuY3Rpb24obyl7aWYoIXImJihuW29dPSEwLE9iamVjdC5rZXlzKG4pLmxlbmd0aD49MjAwKSl7dmFyIHM9dD8nIHdpdGggdGhlIGlkIG9mIFwiJyt0KydcIic6XCJcIjtjb25zb2xlLndhcm4oXCJPdmVyIDIwMCBjbGFzc2VzIHdlcmUgZ2VuZXJhdGVkIGZvciBjb21wb25lbnQgXCIrZStzK1wiLlxcbkNvbnNpZGVyIHVzaW5nIHRoZSBhdHRycyBtZXRob2QsIHRvZ2V0aGVyIHdpdGggYSBzdHlsZSBvYmplY3QgZm9yIGZyZXF1ZW50bHkgY2hhbmdlZCBzdHlsZXMuXFxuRXhhbXBsZTpcXG4gIGNvbnN0IENvbXBvbmVudCA9IHN0eWxlZC5kaXYuYXR0cnMocHJvcHMgPT4gKHtcXG4gICAgc3R5bGU6IHtcXG4gICAgICBiYWNrZ3JvdW5kOiBwcm9wcy5iYWNrZ3JvdW5kLFxcbiAgICB9LFxcbiAgfSkpYHdpZHRoOiAxMDAlO2BcXG5cXG4gIDxDb21wb25lbnQgLz5cIikscj0hMCxuPXt9fX19KHAsdikpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLFwidG9TdHJpbmdcIix7dmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cIi5cIitBLnN0eWxlZENvbXBvbmVudElkfX0pLGkmJm0oQSxlLHthdHRyczohMCxjb21wb25lbnRTdHlsZTohMCxkaXNwbGF5TmFtZTohMCxmb2xkZWRDb21wb25lbnRJZHM6ITAsc2hvdWxkRm9yd2FyZFByb3A6ITAsc3R5bGVkQ29tcG9uZW50SWQ6ITAsdGFyZ2V0OiEwLHdpdGhDb21wb25lbnQ6ITB9KSxBfXZhciBxZT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gZSh0LHIsbyl7aWYodm9pZCAwPT09byYmKG89dyksIW4ocikpcmV0dXJuIEQoMSxTdHJpbmcocikpO3ZhciBzPWZ1bmN0aW9uKCl7cmV0dXJuIHQocixvLEFlLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpKX07cmV0dXJuIHMud2l0aENvbmZpZz1mdW5jdGlvbihuKXtyZXR1cm4gZSh0LHIseSh7fSxvLHt9LG4pKX0scy5hdHRycz1mdW5jdGlvbihuKXtyZXR1cm4gZSh0LHIseSh7fSxvLHthdHRyczpBcnJheS5wcm90b3R5cGUuY29uY2F0KG8uYXR0cnMsbikuZmlsdGVyKEJvb2xlYW4pfSkpfSxzfShZZSxlKX07W1wiYVwiLFwiYWJiclwiLFwiYWRkcmVzc1wiLFwiYXJlYVwiLFwiYXJ0aWNsZVwiLFwiYXNpZGVcIixcImF1ZGlvXCIsXCJiXCIsXCJiYXNlXCIsXCJiZGlcIixcImJkb1wiLFwiYmlnXCIsXCJibG9ja3F1b3RlXCIsXCJib2R5XCIsXCJiclwiLFwiYnV0dG9uXCIsXCJjYW52YXNcIixcImNhcHRpb25cIixcImNpdGVcIixcImNvZGVcIixcImNvbFwiLFwiY29sZ3JvdXBcIixcImRhdGFcIixcImRhdGFsaXN0XCIsXCJkZFwiLFwiZGVsXCIsXCJkZXRhaWxzXCIsXCJkZm5cIixcImRpYWxvZ1wiLFwiZGl2XCIsXCJkbFwiLFwiZHRcIixcImVtXCIsXCJlbWJlZFwiLFwiZmllbGRzZXRcIixcImZpZ2NhcHRpb25cIixcImZpZ3VyZVwiLFwiZm9vdGVyXCIsXCJmb3JtXCIsXCJoMVwiLFwiaDJcIixcImgzXCIsXCJoNFwiLFwiaDVcIixcImg2XCIsXCJoZWFkXCIsXCJoZWFkZXJcIixcImhncm91cFwiLFwiaHJcIixcImh0bWxcIixcImlcIixcImlmcmFtZVwiLFwiaW1nXCIsXCJpbnB1dFwiLFwiaW5zXCIsXCJrYmRcIixcImtleWdlblwiLFwibGFiZWxcIixcImxlZ2VuZFwiLFwibGlcIixcImxpbmtcIixcIm1haW5cIixcIm1hcFwiLFwibWFya1wiLFwibWFycXVlZVwiLFwibWVudVwiLFwibWVudWl0ZW1cIixcIm1ldGFcIixcIm1ldGVyXCIsXCJuYXZcIixcIm5vc2NyaXB0XCIsXCJvYmplY3RcIixcIm9sXCIsXCJvcHRncm91cFwiLFwib3B0aW9uXCIsXCJvdXRwdXRcIixcInBcIixcInBhcmFtXCIsXCJwaWN0dXJlXCIsXCJwcmVcIixcInByb2dyZXNzXCIsXCJxXCIsXCJycFwiLFwicnRcIixcInJ1YnlcIixcInNcIixcInNhbXBcIixcInNjcmlwdFwiLFwic2VjdGlvblwiLFwic2VsZWN0XCIsXCJzbWFsbFwiLFwic291cmNlXCIsXCJzcGFuXCIsXCJzdHJvbmdcIixcInN0eWxlXCIsXCJzdWJcIixcInN1bW1hcnlcIixcInN1cFwiLFwidGFibGVcIixcInRib2R5XCIsXCJ0ZFwiLFwidGV4dGFyZWFcIixcInRmb290XCIsXCJ0aFwiLFwidGhlYWRcIixcInRpbWVcIixcInRpdGxlXCIsXCJ0clwiLFwidHJhY2tcIixcInVcIixcInVsXCIsXCJ2YXJcIixcInZpZGVvXCIsXCJ3YnJcIixcImNpcmNsZVwiLFwiY2xpcFBhdGhcIixcImRlZnNcIixcImVsbGlwc2VcIixcImZvcmVpZ25PYmplY3RcIixcImdcIixcImltYWdlXCIsXCJsaW5lXCIsXCJsaW5lYXJHcmFkaWVudFwiLFwibWFya2VyXCIsXCJtYXNrXCIsXCJwYXRoXCIsXCJwYXR0ZXJuXCIsXCJwb2x5Z29uXCIsXCJwb2x5bGluZVwiLFwicmFkaWFsR3JhZGllbnRcIixcInJlY3RcIixcInN0b3BcIixcInN2Z1wiLFwidGV4dFwiLFwidGV4dFBhdGhcIixcInRzcGFuXCJdLmZvckVhY2goKGZ1bmN0aW9uKGUpe3FlW2VdPXFlKGUpfSkpO3ZhciBIZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt0aGlzLnJ1bGVzPWUsdGhpcy5jb21wb25lbnRJZD10LHRoaXMuaXNTdGF0aWM9bmUoZSksWC5yZWdpc3RlcklkKHRoaXMuY29tcG9uZW50SWQrMSl9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuY3JlYXRlU3R5bGVzPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXIoX2UodGhpcy5ydWxlcyx0LG4scikuam9pbihcIlwiKSxcIlwiKSxzPXRoaXMuY29tcG9uZW50SWQrZTtuLmluc2VydFJ1bGVzKHMscyxvKX0sdC5yZW1vdmVTdHlsZXM9ZnVuY3Rpb24oZSx0KXt0LmNsZWFyUnVsZXModGhpcy5jb21wb25lbnRJZCtlKX0sdC5yZW5kZXJTdHlsZXM9ZnVuY3Rpb24oZSx0LG4scil7ZT4yJiZYLnJlZ2lzdGVySWQodGhpcy5jb21wb25lbnRJZCtlKSx0aGlzLnJlbW92ZVN0eWxlcyhlLG4pLHRoaXMuY3JlYXRlU3R5bGVzKGUsdCxuLHIpfSxlfSgpO2Z1bmN0aW9uICRlKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCksbz0xO288dDtvKyspbltvLTFdPWFyZ3VtZW50c1tvXTt2YXIgaT1BZS5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdChuKSksYT1cInNjLWdsb2JhbC1cIitUZShKU09OLnN0cmluZ2lmeShpKSksdT1uZXcgSGUoaSxhKTtmdW5jdGlvbiBkKGUpe3ZhciB0PXBlKCksbj1mZSgpLG89cyhNZSksZD1jKHQuYWxsb2NhdGVHU0luc3RhbmNlKGEpKS5jdXJyZW50O3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJnIuQ2hpbGRyZW4uY291bnQoZS5jaGlsZHJlbikmJmNvbnNvbGUud2FybihcIlRoZSBnbG9iYWwgc3R5bGUgY29tcG9uZW50IFwiK2ErXCIgd2FzIGdpdmVuIGNoaWxkIEpTWC4gY3JlYXRlR2xvYmFsU3R5bGUgZG9lcyBub3QgcmVuZGVyIGNoaWxkcmVuLlwiKSxcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZpLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlJiYtMSE9PWUuaW5kZXhPZihcIkBpbXBvcnRcIil9KSkmJmNvbnNvbGUud2FybihcIlBsZWFzZSBkbyBub3QgdXNlIEBpbXBvcnQgQ1NTIHN5bnRheCBpbiBjcmVhdGVHbG9iYWxTdHlsZSBhdCB0aGlzIHRpbWUsIGFzIHRoZSBDU1NPTSBBUElzIHdlIHVzZSBpbiBwcm9kdWN0aW9uIGRvIG5vdCBoYW5kbGUgaXQgd2VsbC4gSW5zdGVhZCwgd2UgcmVjb21tZW5kIHVzaW5nIGEgbGlicmFyeSBzdWNoIGFzIHJlYWN0LWhlbG1ldCB0byBpbmplY3QgYSB0eXBpY2FsIDxsaW5rPiBtZXRhIHRhZyB0byB0aGUgc3R5bGVzaGVldCwgb3Igc2ltcGx5IGVtYmVkZGluZyBpdCBtYW51YWxseSBpbiB5b3VyIGluZGV4Lmh0bWwgPGhlYWQ+IHNlY3Rpb24gZm9yIGEgc2ltcGxlciBhcHAuXCIpLHQuc2VydmVyJiZoKGQsZSx0LG8sbiksbCgoZnVuY3Rpb24oKXtpZighdC5zZXJ2ZXIpcmV0dXJuIGgoZCxlLHQsbyxuKSxmdW5jdGlvbigpe3JldHVybiB1LnJlbW92ZVN0eWxlcyhkLHQpfX0pLFtkLGUsdCxvLG5dKSxudWxsfWZ1bmN0aW9uIGgoZSx0LG4scixvKXtpZih1LmlzU3RhdGljKXUucmVuZGVyU3R5bGVzKGUsUCxuLG8pO2Vsc2V7dmFyIHM9eSh7fSx0LHt0aGVtZTpPZSh0LHIsZC5kZWZhdWx0UHJvcHMpfSk7dS5yZW5kZXJTdHlsZXMoZSxzLG4sbyl9fXJldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlBlKGEpLHIubWVtbyhkKX1mdW5jdGlvbiBXZShlKXtcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiZcIlJlYWN0TmF0aXZlXCI9PT1uYXZpZ2F0b3IucHJvZHVjdCYmY29uc29sZS53YXJuKFwiYGtleWZyYW1lc2AgY2Fubm90IGJlIHVzZWQgb24gUmVhY3ROYXRpdmUsIG9ubHkgb24gdGhlIHdlYi4gVG8gZG8gYW5pbWF0aW9uIGluIFJlYWN0TmF0aXZlIHBsZWFzZSB1c2UgQW5pbWF0ZWQuXCIpO2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCkscj0xO3I8dDtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTt2YXIgbz1BZS5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdChuKSkuam9pbihcIlwiKSxzPVRlKG8pO3JldHVybiBuZXcgeWUocyxvKX12YXIgVWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpczt0aGlzLl9lbWl0U2hlZXRDU1M9ZnVuY3Rpb24oKXt2YXIgdD1lLmluc3RhbmNlLnRvU3RyaW5nKCk7aWYoIXQpcmV0dXJuXCJcIjt2YXIgbj1ZKCk7cmV0dXJuXCI8c3R5bGUgXCIrW24mJidub25jZT1cIicrbisnXCInLE4rJz1cInRydWVcIicsJ2RhdGEtc3R5bGVkLXZlcnNpb249XCI1LjMuMTFcIiddLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKStcIj5cIit0K1wiPC9zdHlsZT5cIn0sdGhpcy5nZXRTdHlsZVRhZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gZS5zZWFsZWQ/RCgyKTplLl9lbWl0U2hlZXRDU1MoKX0sdGhpcy5nZXRTdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgdDtpZihlLnNlYWxlZClyZXR1cm4gRCgyKTt2YXIgbj0oKHQ9e30pW05dPVwiXCIsdFtcImRhdGEtc3R5bGVkLXZlcnNpb25cIl09XCI1LjMuMTFcIix0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXtfX2h0bWw6ZS5pbnN0YW5jZS50b1N0cmluZygpfSx0KSxvPVkoKTtyZXR1cm4gbyYmKG4ubm9uY2U9byksW3IuY3JlYXRlRWxlbWVudChcInN0eWxlXCIseSh7fSxuLHtrZXk6XCJzYy0wLTBcIn0pKV19LHRoaXMuc2VhbD1mdW5jdGlvbigpe2Uuc2VhbGVkPSEwfSx0aGlzLmluc3RhbmNlPW5ldyBYKHtpc1NlcnZlcjohMH0pLHRoaXMuc2VhbGVkPSExfXZhciB0PWUucHJvdG90eXBlO3JldHVybiB0LmNvbGxlY3RTdHlsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2VhbGVkP0QoMik6ci5jcmVhdGVFbGVtZW50KG1lLHtzaGVldDp0aGlzLmluc3RhbmNlfSxlKX0sdC5pbnRlcmxlYXZlV2l0aE5vZGVTdHJlYW09ZnVuY3Rpb24oZSl7cmV0dXJuIEQoMyl9LGV9KCksSmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ci5mb3J3YXJkUmVmKChmdW5jdGlvbih0LG4pe3ZhciBvPXMoTWUpLGk9ZS5kZWZhdWx0UHJvcHMsYT1PZSh0LG8saSk7cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmdm9pZCAwPT09YSYmY29uc29sZS53YXJuKCdbd2l0aFRoZW1lXSBZb3UgYXJlIG5vdCB1c2luZyBhIFRoZW1lUHJvdmlkZXIgbm9yIHBhc3NpbmcgYSB0aGVtZSBwcm9wIG9yIGEgdGhlbWUgaW4gZGVmYXVsdFByb3BzIGluIGNvbXBvbmVudCBjbGFzcyBcIicrYihlKSsnXCInKSxyLmNyZWF0ZUVsZW1lbnQoZSx5KHt9LHQse3RoZW1lOmEscmVmOm59KSl9KSk7cmV0dXJuIG0odCxlKSx0LmRpc3BsYXlOYW1lPVwiV2l0aFRoZW1lKFwiK2IoZSkrXCIpXCIsdH0sWGU9ZnVuY3Rpb24oKXtyZXR1cm4gcyhNZSl9LFplPXtTdHlsZVNoZWV0OlgsbWFzdGVyU2hlZXQ6ZGV9O1wicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBuYXZpZ2F0b3ImJlwiUmVhY3ROYXRpdmVcIj09PW5hdmlnYXRvci5wcm9kdWN0JiZjb25zb2xlLndhcm4oXCJJdCBsb29rcyBsaWtlIHlvdSd2ZSBpbXBvcnRlZCAnc3R5bGVkLWNvbXBvbmVudHMnIG9uIFJlYWN0IE5hdGl2ZS5cXG5QZXJoYXBzIHlvdSdyZSBsb29raW5nIHRvIGltcG9ydCAnc3R5bGVkLWNvbXBvbmVudHMvbmF0aXZlJz9cXG5SZWFkIG1vcmUgYWJvdXQgdGhpcyBhdCBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9iYXNpY3MjcmVhY3QtbmF0aXZlXCIpLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwidGVzdFwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3dbXCJfX3N0eWxlZC1jb21wb25lbnRzLWluaXRfX1wiXT13aW5kb3dbXCJfX3N0eWxlZC1jb21wb25lbnRzLWluaXRfX1wiXXx8MCwxPT09d2luZG93W1wiX19zdHlsZWQtY29tcG9uZW50cy1pbml0X19cIl0mJmNvbnNvbGUud2FybihcIkl0IGxvb2tzIGxpa2UgdGhlcmUgYXJlIHNldmVyYWwgaW5zdGFuY2VzIG9mICdzdHlsZWQtY29tcG9uZW50cycgaW5pdGlhbGl6ZWQgaW4gdGhpcyBhcHBsaWNhdGlvbi4gVGhpcyBtYXkgY2F1c2UgZHluYW1pYyBzdHlsZXMgdG8gbm90IHJlbmRlciBwcm9wZXJseSwgZXJyb3JzIGR1cmluZyB0aGUgcmVoeWRyYXRpb24gcHJvY2VzcywgYSBtaXNzaW5nIHRoZW1lIHByb3AsIGFuZCBtYWtlcyB5b3VyIGFwcGxpY2F0aW9uIGJpZ2dlciB3aXRob3V0IGdvb2QgcmVhc29uLlxcblxcblNlZSBodHRwczovL3MtYy5zaC8yQkFYemVkIGZvciBtb3JlIGluZm8uXCIpLHdpbmRvd1tcIl9fc3R5bGVkLWNvbXBvbmVudHMtaW5pdF9fXCJdKz0xKTtleHBvcnQgZGVmYXVsdCBxZTtleHBvcnR7VWUgYXMgU2VydmVyU3R5bGVTaGVldCx1ZSBhcyBTdHlsZVNoZWV0Q29uc3VtZXIsY2UgYXMgU3R5bGVTaGVldENvbnRleHQsbWUgYXMgU3R5bGVTaGVldE1hbmFnZXIsR2UgYXMgVGhlbWVDb25zdW1lcixNZSBhcyBUaGVtZUNvbnRleHQsTGUgYXMgVGhlbWVQcm92aWRlcixaZSBhcyBfX1BSSVZBVEVfXywkZSBhcyBjcmVhdGVHbG9iYWxTdHlsZSxBZSBhcyBjc3MsXyBhcyBpc1N0eWxlZENvbXBvbmVudCxXZSBhcyBrZXlmcmFtZXMsWGUgYXMgdXNlVGhlbWUsQSBhcyB2ZXJzaW9uLEplIGFzIHdpdGhUaGVtZX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHlsZWQtY29tcG9uZW50cy5icm93c2VyLmVzbS5qcy5tYXBcbiIsInZhciB1bml0bGVzc0tleXMgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiAxLFxuICBib3JkZXJJbWFnZU91dHNldDogMSxcbiAgYm9yZGVySW1hZ2VTbGljZTogMSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogMSxcbiAgYm94RmxleDogMSxcbiAgYm94RmxleEdyb3VwOiAxLFxuICBib3hPcmRpbmFsR3JvdXA6IDEsXG4gIGNvbHVtbkNvdW50OiAxLFxuICBjb2x1bW5zOiAxLFxuICBmbGV4OiAxLFxuICBmbGV4R3JvdzogMSxcbiAgZmxleFBvc2l0aXZlOiAxLFxuICBmbGV4U2hyaW5rOiAxLFxuICBmbGV4TmVnYXRpdmU6IDEsXG4gIGZsZXhPcmRlcjogMSxcbiAgZ3JpZFJvdzogMSxcbiAgZ3JpZFJvd0VuZDogMSxcbiAgZ3JpZFJvd1NwYW46IDEsXG4gIGdyaWRSb3dTdGFydDogMSxcbiAgZ3JpZENvbHVtbjogMSxcbiAgZ3JpZENvbHVtbkVuZDogMSxcbiAgZ3JpZENvbHVtblNwYW46IDEsXG4gIGdyaWRDb2x1bW5TdGFydDogMSxcbiAgbXNHcmlkUm93OiAxLFxuICBtc0dyaWRSb3dTcGFuOiAxLFxuICBtc0dyaWRDb2x1bW46IDEsXG4gIG1zR3JpZENvbHVtblNwYW46IDEsXG4gIGZvbnRXZWlnaHQ6IDEsXG4gIGxpbmVIZWlnaHQ6IDEsXG4gIG9wYWNpdHk6IDEsXG4gIG9yZGVyOiAxLFxuICBvcnBoYW5zOiAxLFxuICB0YWJTaXplOiAxLFxuICB3aWRvd3M6IDEsXG4gIHpJbmRleDogMSxcbiAgem9vbTogMSxcbiAgV2Via2l0TGluZUNsYW1wOiAxLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiAxLFxuICBmbG9vZE9wYWNpdHk6IDEsXG4gIHN0b3BPcGFjaXR5OiAxLFxuICBzdHJva2VEYXNoYXJyYXk6IDEsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IDEsXG4gIHN0cm9rZU1pdGVybGltaXQ6IDEsXG4gIHN0cm9rZU9wYWNpdHk6IDEsXG4gIHN0cm9rZVdpZHRoOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCB1bml0bGVzc0tleXM7XG4iLCIvKiFcbiogdGFiYmFibGUgNi4yLjBcbiogQGxpY2Vuc2UgTUlULCBodHRwczovL2dpdGh1Yi5jb20vZm9jdXMtdHJhcC90YWJiYWJsZS9ibG9iL21hc3Rlci9MSUNFTlNFXG4qL1xuLy8gTk9URTogc2VwYXJhdGUgYDpub3QoKWAgc2VsZWN0b3JzIGhhcyBicm9hZGVyIGJyb3dzZXIgc3VwcG9ydCB0aGFuIHRoZSBuZXdlclxuLy8gIGA6bm90KFtpbmVydF0sIFtpbmVydF0gKilgIChGZWIgMjAyMylcbi8vIENBUkVGVUw6IEpTRG9tIGRvZXMgbm90IHN1cHBvcnQgYDpub3QoW2luZXJ0XSAqKWAgYXMgYSBzZWxlY3RvcjsgdXNpbmcgaXQgY2F1c2VzXG4vLyAgdGhlIGVudGlyZSBxdWVyeSB0byBmYWlsLCByZXN1bHRpbmcgaW4gbm8gbm9kZXMgZm91bmQsIHdoaWNoIHdpbGwgYnJlYWsgYSBsb3Rcbi8vICBvZiB0aGluZ3MuLi4gc28gd2UgaGF2ZSB0byByZWx5IG9uIEpTIHRvIGlkZW50aWZ5IG5vZGVzIGluc2lkZSBhbiBpbmVydCBjb250YWluZXJcbnZhciBjYW5kaWRhdGVTZWxlY3RvcnMgPSBbJ2lucHV0Om5vdChbaW5lcnRdKScsICdzZWxlY3Q6bm90KFtpbmVydF0pJywgJ3RleHRhcmVhOm5vdChbaW5lcnRdKScsICdhW2hyZWZdOm5vdChbaW5lcnRdKScsICdidXR0b246bm90KFtpbmVydF0pJywgJ1t0YWJpbmRleF06bm90KHNsb3QpOm5vdChbaW5lcnRdKScsICdhdWRpb1tjb250cm9sc106bm90KFtpbmVydF0pJywgJ3ZpZGVvW2NvbnRyb2xzXTpub3QoW2luZXJ0XSknLCAnW2NvbnRlbnRlZGl0YWJsZV06bm90KFtjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiXSk6bm90KFtpbmVydF0pJywgJ2RldGFpbHM+c3VtbWFyeTpmaXJzdC1vZi10eXBlOm5vdChbaW5lcnRdKScsICdkZXRhaWxzOm5vdChbaW5lcnRdKSddO1xudmFyIGNhbmRpZGF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY2FuZGlkYXRlU2VsZWN0b3JzLmpvaW4oJywnKTtcbnZhciBOb0VsZW1lbnQgPSB0eXBlb2YgRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCc7XG52YXIgbWF0Y2hlcyA9IE5vRWxlbWVudCA/IGZ1bmN0aW9uICgpIHt9IDogRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyB8fCBFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG52YXIgZ2V0Um9vdE5vZGUgPSAhTm9FbGVtZW50ICYmIEVsZW1lbnQucHJvdG90eXBlLmdldFJvb3ROb2RlID8gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgdmFyIF9lbGVtZW50JGdldFJvb3ROb2RlO1xuICByZXR1cm4gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX2VsZW1lbnQkZ2V0Um9vdE5vZGUgPSBlbGVtZW50LmdldFJvb3ROb2RlKSA9PT0gbnVsbCB8fCBfZWxlbWVudCRnZXRSb290Tm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2VsZW1lbnQkZ2V0Um9vdE5vZGUuY2FsbChlbGVtZW50KTtcbn0gOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBub2RlIGlzIGluZXJ0IG9yIGluIGFuIGluZXJ0IGFuY2VzdG9yLlxuICogQHBhcmFtIHtFbGVtZW50fSBbbm9kZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvb2tVcF0gSWYgdHJ1ZSBhbmQgYG5vZGVgIGlzIG5vdCBpbmVydCwgbG9va3MgdXAgYXQgYW5jZXN0b3JzIHRvXG4gKiAgc2VlIGlmIGFueSBvZiB0aGVtIGFyZSBpbmVydC4gSWYgZmFsc2UsIG9ubHkgYG5vZGVgIGl0c2VsZiBpcyBjb25zaWRlcmVkLlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgaW5lcnQgaXRzZWxmIG9yIGJ5IHdheSBvZiBiZWluZyBpbiBhbiBpbmVydCBhbmNlc3Rvci5cbiAqICBGYWxzZSBpZiBgbm9kZWAgaXMgZmFsc3kuXG4gKi9cbnZhciBpc0luZXJ0ID0gZnVuY3Rpb24gaXNJbmVydChub2RlLCBsb29rVXApIHtcbiAgdmFyIF9ub2RlJGdldEF0dHJpYnV0ZTtcbiAgaWYgKGxvb2tVcCA9PT0gdm9pZCAwKSB7XG4gICAgbG9va1VwID0gdHJ1ZTtcbiAgfVxuICAvLyBDQVJFRlVMOiBKU0RvbSBkb2VzIG5vdCBzdXBwb3J0IGluZXJ0IGF0IGFsbCwgc28gd2UgY2FuJ3QgdXNlIHRoZSBgSFRNTEVsZW1lbnQuaW5lcnRgXG4gIC8vICBKUyBBUEkgcHJvcGVydHk7IHdlIGhhdmUgdG8gY2hlY2sgdGhlIGF0dHJpYnV0ZSwgd2hpY2ggY2FuIGVpdGhlciBiZSBlbXB0eSBvciAndHJ1ZSc7XG4gIC8vICBpZiBpdCdzIGBudWxsYCAobm90IHNwZWNpZmllZCkgb3IgJ2ZhbHNlJywgaXQncyBhbiBhY3RpdmUgZWxlbWVudFxuICB2YXIgaW5lcnRBdHQgPSBub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfbm9kZSRnZXRBdHRyaWJ1dGUgPSBub2RlLmdldEF0dHJpYnV0ZSkgPT09IG51bGwgfHwgX25vZGUkZ2V0QXR0cmlidXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbm9kZSRnZXRBdHRyaWJ1dGUuY2FsbChub2RlLCAnaW5lcnQnKTtcbiAgdmFyIGluZXJ0ID0gaW5lcnRBdHQgPT09ICcnIHx8IGluZXJ0QXR0ID09PSAndHJ1ZSc7XG5cbiAgLy8gTk9URTogdGhpcyBjb3VsZCBhbHNvIGJlIGhhbmRsZWQgd2l0aCBgbm9kZS5tYXRjaGVzKCdbaW5lcnRdLCA6aXMoW2luZXJ0XSAqKScpYFxuICAvLyAgaWYgaXQgd2VyZW4ndCBmb3IgYG1hdGNoZXMoKWAgbm90IGJlaW5nIGEgZnVuY3Rpb24gb24gc2hhZG93IHJvb3RzOyB0aGUgZm9sbG93aW5nXG4gIC8vICBjb2RlIHdvcmtzIGZvciBhbnkga2luZCBvZiBub2RlXG4gIC8vIENBUkVGVUw6IEpTRG9tIGRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0IGNlcnRhaW4gc2VsZWN0b3JzIGxpa2UgYDpub3QoW2luZXJ0XSAqKWBcbiAgLy8gIHNvIGl0IGxpa2VseSB3b3VsZCBub3Qgc3VwcG9ydCBgOmlzKFtpbmVydF0gKilgIGVpdGhlci4uLlxuICB2YXIgcmVzdWx0ID0gaW5lcnQgfHwgbG9va1VwICYmIG5vZGUgJiYgaXNJbmVydChub2RlLnBhcmVudE5vZGUpOyAvLyByZWN1cnNpdmVcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgbm9kZSdzIGNvbnRlbnQgaXMgZWRpdGFibGUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IFtub2RlXVxuICogQHJldHVybnMgVHJ1ZSBpZiBpdCdzIGNvbnRlbnQtZWRpdGFibGU7IGZhbHNlIGlmIGl0J3Mgbm90IG9yIGBub2RlYCBpcyBmYWxzeS5cbiAqL1xudmFyIGlzQ29udGVudEVkaXRhYmxlID0gZnVuY3Rpb24gaXNDb250ZW50RWRpdGFibGUobm9kZSkge1xuICB2YXIgX25vZGUkZ2V0QXR0cmlidXRlMjtcbiAgLy8gQ0FSRUZVTDogSlNEb20gZG9lcyBub3Qgc3VwcG9ydCB0aGUgYEhUTUxFbGVtZW50LmlzQ29udGVudEVkaXRhYmxlYCBBUEkgc28gd2UgaGF2ZVxuICAvLyAgdG8gdXNlIHRoZSBhdHRyaWJ1dGUgZGlyZWN0bHkgdG8gY2hlY2sgZm9yIHRoaXMsIHdoaWNoIGNhbiBlaXRoZXIgYmUgZW1wdHkgb3IgJ3RydWUnO1xuICAvLyAgaWYgaXQncyBgbnVsbGAgKG5vdCBzcGVjaWZpZWQpIG9yICdmYWxzZScsIGl0J3MgYSBub24tZWRpdGFibGUgZWxlbWVudFxuICB2YXIgYXR0VmFsdWUgPSBub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfbm9kZSRnZXRBdHRyaWJ1dGUyID0gbm9kZS5nZXRBdHRyaWJ1dGUpID09PSBudWxsIHx8IF9ub2RlJGdldEF0dHJpYnV0ZTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ub2RlJGdldEF0dHJpYnV0ZTIuY2FsbChub2RlLCAnY29udGVudGVkaXRhYmxlJyk7XG4gIHJldHVybiBhdHRWYWx1ZSA9PT0gJycgfHwgYXR0VmFsdWUgPT09ICd0cnVlJztcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBjb250YWluZXIgdG8gY2hlY2sgaW5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUNvbnRhaW5lciBhZGQgY29udGFpbmVyIHRvIGNoZWNrXG4gKiBAcGFyYW0geyhub2RlOiBFbGVtZW50KSA9PiBib29sZWFufSBmaWx0ZXIgZmlsdGVyIGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gKi9cbnZhciBnZXRDYW5kaWRhdGVzID0gZnVuY3Rpb24gZ2V0Q2FuZGlkYXRlcyhlbCwgaW5jbHVkZUNvbnRhaW5lciwgZmlsdGVyKSB7XG4gIC8vIGV2ZW4gaWYgYGluY2x1ZGVDb250YWluZXI9ZmFsc2VgLCB3ZSBzdGlsbCBoYXZlIHRvIGNoZWNrIGl0IGZvciBpbmVydG5lc3MgYmVjYXVzZVxuICAvLyAgaWYgaXQncyBpbmVydCwgYWxsIGl0cyBjaGlsZHJlbiBhcmUgaW5lcnRcbiAgaWYgKGlzSW5lcnQoZWwpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBjYW5kaWRhdGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGVsLnF1ZXJ5U2VsZWN0b3JBbGwoY2FuZGlkYXRlU2VsZWN0b3IpKTtcbiAgaWYgKGluY2x1ZGVDb250YWluZXIgJiYgbWF0Y2hlcy5jYWxsKGVsLCBjYW5kaWRhdGVTZWxlY3RvcikpIHtcbiAgICBjYW5kaWRhdGVzLnVuc2hpZnQoZWwpO1xuICB9XG4gIGNhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzLmZpbHRlcihmaWx0ZXIpO1xuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFNoYWRvd1Jvb3RcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCB0byBjaGVjayBmb3Igc2hhZG93IHJvb3RcbiAqIEByZXR1cm5zIHtTaGFkb3dSb290fGJvb2xlYW59IFNoYWRvd1Jvb3QgaWYgYXZhaWxhYmxlIG9yIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhIHNoYWRvd1Jvb3QgaXMgYXR0YWNoZWQgYnV0IG5vdCBhdmFpbGFibGUuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2hhZG93Um9vdEZpbHRlclxuICogQHBhcmFtIHtFbGVtZW50fSBzaGFkb3dIb3N0Tm9kZSB0aGUgZWxlbWVudCB3aGljaCBjb250YWlucyBzaGFkb3cgY29udGVudFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYSBzaGFkb3cgcm9vdCBjb3VsZCBwb3RlbnRpYWxseSBjb250YWluIHZhbGlkIGNhbmRpZGF0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDYW5kaWRhdGVTY29wZVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBzY29wZVBhcmVudCBjb250YWlucyBpbm5lciBjYW5kaWRhdGVzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gY2FuZGlkYXRlcyBsaXN0IG9mIGNhbmRpZGF0ZXMgZm91bmQgaW4gdGhlIHNjb3BlIHBhcmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSXRlcmF0aXZlT3B0aW9uc1xuICogQHByb3BlcnR5IHtHZXRTaGFkb3dSb290fGJvb2xlYW59IGdldFNoYWRvd1Jvb3QgdHJ1ZSBpZiBzaGFkb3cgc3VwcG9ydCBpcyBlbmFibGVkOyBmYWxzeSBpZiBub3Q7XG4gKiAgaWYgYSBmdW5jdGlvbiwgaW1wbGllcyBzaGFkb3cgc3VwcG9ydCBpcyBlbmFibGVkIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgc2hhZG93IHJvb3Qgb2YgYW4gZWxlbWVudFxuICogIG9yIGEgYm9vbGVhbiBzdGF0aW5nIGlmIGl0IGhhcyBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgcm9vdFxuICogQHByb3BlcnR5IHsobm9kZTogRWxlbWVudCkgPT4gYm9vbGVhbn0gZmlsdGVyIGZpbHRlciBjYW5kaWRhdGVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGZsYXR0ZW4gaWYgdHJ1ZSB0aGVuIHJlc3VsdCB3aWxsIGZsYXR0ZW4gYW55IENhbmRpZGF0ZVNjb3BlIGludG8gdGhlIHJldHVybmVkIGxpc3RcbiAqIEBwcm9wZXJ0eSB7U2hhZG93Um9vdEZpbHRlcn0gc2hhZG93Um9vdEZpbHRlciBmaWx0ZXIgc2hhZG93IHJvb3RzO1xuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50W119IGVsZW1lbnRzIGxpc3Qgb2YgZWxlbWVudCBjb250YWluZXJzIHRvIG1hdGNoIGNhbmRpZGF0ZXMgZnJvbVxuICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQ29udGFpbmVyIGFkZCBjb250YWluZXIgbGlzdCB0byBjaGVja1xuICogQHBhcmFtIHtJdGVyYXRpdmVPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJucyB7QXJyYXkuPEVsZW1lbnR8Q2FuZGlkYXRlU2NvcGU+fVxuICovXG52YXIgZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5ID0gZnVuY3Rpb24gZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5KGVsZW1lbnRzLCBpbmNsdWRlQ29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHZhciBjYW5kaWRhdGVzID0gW107XG4gIHZhciBlbGVtZW50c1RvQ2hlY2sgPSBBcnJheS5mcm9tKGVsZW1lbnRzKTtcbiAgd2hpbGUgKGVsZW1lbnRzVG9DaGVjay5sZW5ndGgpIHtcbiAgICB2YXIgZWxlbWVudCA9IGVsZW1lbnRzVG9DaGVjay5zaGlmdCgpO1xuICAgIGlmIChpc0luZXJ0KGVsZW1lbnQsIGZhbHNlKSkge1xuICAgICAgLy8gbm8gbmVlZCB0byBsb29rIHVwIHNpbmNlIHdlJ3JlIGRyaWxsaW5nIGRvd25cbiAgICAgIC8vIGFueXRoaW5nIGluc2lkZSB0aGlzIGNvbnRhaW5lciB3aWxsIGFsc28gYmUgaW5lcnRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0xPVCcpIHtcbiAgICAgIC8vIGFkZCBzaGFkb3cgZG9tIHNsb3Qgc2NvcGUgKHNsb3QgaXRzZWxmIGNhbm5vdCBiZSBmb2N1c2FibGUpXG4gICAgICB2YXIgYXNzaWduZWQgPSBlbGVtZW50LmFzc2lnbmVkRWxlbWVudHMoKTtcbiAgICAgIHZhciBjb250ZW50ID0gYXNzaWduZWQubGVuZ3RoID8gYXNzaWduZWQgOiBlbGVtZW50LmNoaWxkcmVuO1xuICAgICAgdmFyIG5lc3RlZENhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoY29udGVudCwgdHJ1ZSwgb3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5mbGF0dGVuKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaC5hcHBseShjYW5kaWRhdGVzLCBuZXN0ZWRDYW5kaWRhdGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgICAgc2NvcGVQYXJlbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgY2FuZGlkYXRlczogbmVzdGVkQ2FuZGlkYXRlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2hlY2sgY2FuZGlkYXRlIGVsZW1lbnRcbiAgICAgIHZhciB2YWxpZENhbmRpZGF0ZSA9IG1hdGNoZXMuY2FsbChlbGVtZW50LCBjYW5kaWRhdGVTZWxlY3Rvcik7XG4gICAgICBpZiAodmFsaWRDYW5kaWRhdGUgJiYgb3B0aW9ucy5maWx0ZXIoZWxlbWVudCkgJiYgKGluY2x1ZGVDb250YWluZXIgfHwgIWVsZW1lbnRzLmluY2x1ZGVzKGVsZW1lbnQpKSkge1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGl0ZXJhdGUgb3ZlciBzaGFkb3cgY29udGVudCBpZiBwb3NzaWJsZVxuICAgICAgdmFyIHNoYWRvd1Jvb3QgPSBlbGVtZW50LnNoYWRvd1Jvb3QgfHxcbiAgICAgIC8vIGNoZWNrIGZvciBhbiB1bmRpc2Nsb3NlZCBzaGFkb3dcbiAgICAgIHR5cGVvZiBvcHRpb25zLmdldFNoYWRvd1Jvb3QgPT09ICdmdW5jdGlvbicgJiYgb3B0aW9ucy5nZXRTaGFkb3dSb290KGVsZW1lbnQpO1xuXG4gICAgICAvLyBubyBpbmVydCBsb29rIHVwIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBkcmlsbGluZyBkb3duIGFuZCBjaGVja2luZyBmb3IgaW5lcnRuZXNzXG4gICAgICAvLyAgb24gdGhlIHdheSBkb3duLCBzbyBhbGwgY29udGFpbmVycyB0byB0aGlzIHJvb3Qgbm9kZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW5cbiAgICAgIC8vICB2ZXR0ZWQgYXMgbm9uLWluZXJ0XG4gICAgICB2YXIgdmFsaWRTaGFkb3dSb290ID0gIWlzSW5lcnQoc2hhZG93Um9vdCwgZmFsc2UpICYmICghb3B0aW9ucy5zaGFkb3dSb290RmlsdGVyIHx8IG9wdGlvbnMuc2hhZG93Um9vdEZpbHRlcihlbGVtZW50KSk7XG4gICAgICBpZiAoc2hhZG93Um9vdCAmJiB2YWxpZFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgLy8gYWRkIHNoYWRvdyBkb20gc2NvcGUgSUlGIGEgc2hhZG93IHJvb3Qgbm9kZSB3YXMgZ2l2ZW47IG90aGVyd2lzZSwgYW4gdW5kaXNjbG9zZWRcbiAgICAgICAgLy8gIHNoYWRvdyBleGlzdHMsIHNvIGxvb2sgYXQgbGlnaHQgZG9tIGNoaWxkcmVuIGFzIGZhbGxiYWNrIEJVVCBjcmVhdGUgYSBzY29wZSBmb3IgYW55XG4gICAgICAgIC8vICBjaGlsZCBjYW5kaWRhdGVzIGZvdW5kIGJlY2F1c2UgdGhleSdyZSBsaWtlbHkgc2xvdHRlZCBlbGVtZW50cyAoZWxlbWVudHMgdGhhdCBhcmVcbiAgICAgICAgLy8gIGNoaWxkcmVuIG9mIHRoZSB3ZWIgY29tcG9uZW50IGVsZW1lbnQgKHdoaWNoIGhhcyB0aGUgc2hhZG93KSwgaW4gdGhlIGxpZ2h0IGRvbSwgYnV0XG4gICAgICAgIC8vICBzbG90dGVkIHNvbWV3aGVyZSBfaW5zaWRlXyB0aGUgdW5kaXNjbG9zZWQgc2hhZG93KSAtLSB0aGUgc2NvcGUgaXMgY3JlYXRlZCBiZWxvdyxcbiAgICAgICAgLy8gIF9hZnRlcl8gd2UgcmV0dXJuIGZyb20gdGhpcyByZWN1cnNpdmUgY2FsbFxuICAgICAgICB2YXIgX25lc3RlZENhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoc2hhZG93Um9vdCA9PT0gdHJ1ZSA/IGVsZW1lbnQuY2hpbGRyZW4gOiBzaGFkb3dSb290LmNoaWxkcmVuLCB0cnVlLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZmxhdHRlbikge1xuICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaC5hcHBseShjYW5kaWRhdGVzLCBfbmVzdGVkQ2FuZGlkYXRlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgICAgIHNjb3BlUGFyZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgY2FuZGlkYXRlczogX25lc3RlZENhbmRpZGF0ZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlcmUncyBub3Qgc2hhZG93IHNvIGp1c3QgZGlnIGludG8gdGhlIGVsZW1lbnQncyAobGlnaHQgZG9tKSBjaGlsZHJlblxuICAgICAgICAvLyAgX193aXRob3V0X18gZ2l2aW5nIHRoZSBlbGVtZW50IHNwZWNpYWwgc2NvcGUgdHJlYXRtZW50XG4gICAgICAgIGVsZW1lbnRzVG9DaGVjay51bnNoaWZ0LmFwcGx5KGVsZW1lbnRzVG9DaGVjaywgZWxlbWVudC5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjYW5kaWRhdGVzO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogRGV0ZXJtaW5lcyBpZiB0aGUgbm9kZSBoYXMgYW4gZXhwbGljaXRseSBzcGVjaWZpZWQgYHRhYmluZGV4YCBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBzbzsgZmFsc2UgaWYgbm90LlxuICovXG52YXIgaGFzVGFiSW5kZXggPSBmdW5jdGlvbiBoYXNUYWJJbmRleChub2RlKSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VJbnQobm9kZS5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JyksIDEwKSk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB0aGUgdGFiIGluZGV4IG9mIGEgZ2l2ZW4gbm9kZS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRhYiBvcmRlciAobmVnYXRpdmUsIDAsIG9yIHBvc2l0aXZlIG51bWJlcikuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYG5vZGVgIGlzIGZhbHN5LlxuICovXG52YXIgZ2V0VGFiSW5kZXggPSBmdW5jdGlvbiBnZXRUYWJJbmRleChub2RlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gbm9kZSBwcm92aWRlZCcpO1xuICB9XG4gIGlmIChub2RlLnRhYkluZGV4IDwgMCkge1xuICAgIC8vIGluIENocm9tZSwgPGRldGFpbHMvPiwgPGF1ZGlvIGNvbnRyb2xzLz4gYW5kIDx2aWRlbyBjb250cm9scy8+IGVsZW1lbnRzIGdldCBhIGRlZmF1bHRcbiAgICAvLyBgdGFiSW5kZXhgIG9mIC0xIHdoZW4gdGhlICd0YWJpbmRleCcgYXR0cmlidXRlIGlzbid0IHNwZWNpZmllZCBpbiB0aGUgRE9NLFxuICAgIC8vIHlldCB0aGV5IGFyZSBzdGlsbCBwYXJ0IG9mIHRoZSByZWd1bGFyIHRhYiBvcmRlcjsgaW4gRkYsIHRoZXkgZ2V0IGEgZGVmYXVsdFxuICAgIC8vIGB0YWJJbmRleGAgb2YgMDsgc2luY2UgQ2hyb21lIHN0aWxsIHB1dHMgdGhvc2UgZWxlbWVudHMgaW4gdGhlIHJlZ3VsYXIgdGFiXG4gICAgLy8gb3JkZXIsIGNvbnNpZGVyIHRoZWlyIHRhYiBpbmRleCB0byBiZSAwLlxuICAgIC8vIEFsc28gYnJvd3NlcnMgZG8gbm90IHJldHVybiBgdGFiSW5kZXhgIGNvcnJlY3RseSBmb3IgY29udGVudEVkaXRhYmxlIG5vZGVzO1xuICAgIC8vIHNvIGlmIHRoZXkgZG9uJ3QgaGF2ZSBhIHRhYmluZGV4IGF0dHJpYnV0ZSBzcGVjaWZpY2FsbHkgc2V0LCBhc3N1bWUgaXQncyAwLlxuICAgIGlmICgoL14oQVVESU98VklERU98REVUQUlMUykkLy50ZXN0KG5vZGUudGFnTmFtZSkgfHwgaXNDb250ZW50RWRpdGFibGUobm9kZSkpICYmICFoYXNUYWJJbmRleChub2RlKSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG4gIHJldHVybiBub2RlLnRhYkluZGV4O1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIHRhYiBpbmRleCBvZiBhIGdpdmVuIG5vZGUgX19mb3Igc29ydCBvcmRlciBwdXJwb3Nlc19fLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtib29sZWFufSBbaXNTY29wZV0gVHJ1ZSBmb3IgYSBjdXN0b20gZWxlbWVudCB3aXRoIHNoYWRvdyByb290IG9yIHNsb3QgdGhhdCwgYnkgZGVmYXVsdCxcbiAqICBoYXMgdGFiSW5kZXggLTEsIGJ1dCBuZWVkcyB0byBiZSBzb3J0ZWQgYnkgZG9jdW1lbnQgb3JkZXIgaW4gb3JkZXIgZm9yIGl0cyBjb250ZW50IHRvIGJlXG4gKiAgaW5zZXJ0ZWQgaW50byB0aGUgY29ycmVjdCBzb3J0IHBvc2l0aW9uLlxuICogQHJldHVybnMge251bWJlcn0gVGFiIG9yZGVyIChuZWdhdGl2ZSwgMCwgb3IgcG9zaXRpdmUgbnVtYmVyKS5cbiAqL1xudmFyIGdldFNvcnRPcmRlclRhYkluZGV4ID0gZnVuY3Rpb24gZ2V0U29ydE9yZGVyVGFiSW5kZXgobm9kZSwgaXNTY29wZSkge1xuICB2YXIgdGFiSW5kZXggPSBnZXRUYWJJbmRleChub2RlKTtcbiAgaWYgKHRhYkluZGV4IDwgMCAmJiBpc1Njb3BlICYmICFoYXNUYWJJbmRleChub2RlKSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiB0YWJJbmRleDtcbn07XG52YXIgc29ydE9yZGVyZWRUYWJiYWJsZXMgPSBmdW5jdGlvbiBzb3J0T3JkZXJlZFRhYmJhYmxlcyhhLCBiKSB7XG4gIHJldHVybiBhLnRhYkluZGV4ID09PSBiLnRhYkluZGV4ID8gYS5kb2N1bWVudE9yZGVyIC0gYi5kb2N1bWVudE9yZGVyIDogYS50YWJJbmRleCAtIGIudGFiSW5kZXg7XG59O1xudmFyIGlzSW5wdXQgPSBmdW5jdGlvbiBpc0lucHV0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudGFnTmFtZSA9PT0gJ0lOUFVUJztcbn07XG52YXIgaXNIaWRkZW5JbnB1dCA9IGZ1bmN0aW9uIGlzSGlkZGVuSW5wdXQobm9kZSkge1xuICByZXR1cm4gaXNJbnB1dChub2RlKSAmJiBub2RlLnR5cGUgPT09ICdoaWRkZW4nO1xufTtcbnZhciBpc0RldGFpbHNXaXRoU3VtbWFyeSA9IGZ1bmN0aW9uIGlzRGV0YWlsc1dpdGhTdW1tYXJ5KG5vZGUpIHtcbiAgdmFyIHIgPSBub2RlLnRhZ05hbWUgPT09ICdERVRBSUxTJyAmJiBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkobm9kZS5jaGlsZHJlbikuc29tZShmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQudGFnTmFtZSA9PT0gJ1NVTU1BUlknO1xuICB9KTtcbiAgcmV0dXJuIHI7XG59O1xudmFyIGdldENoZWNrZWRSYWRpbyA9IGZ1bmN0aW9uIGdldENoZWNrZWRSYWRpbyhub2RlcywgZm9ybSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG5vZGVzW2ldLmNoZWNrZWQgJiYgbm9kZXNbaV0uZm9ybSA9PT0gZm9ybSkge1xuICAgICAgcmV0dXJuIG5vZGVzW2ldO1xuICAgIH1cbiAgfVxufTtcbnZhciBpc1RhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc1RhYmJhYmxlUmFkaW8obm9kZSkge1xuICBpZiAoIW5vZGUubmFtZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciByYWRpb1Njb3BlID0gbm9kZS5mb3JtIHx8IGdldFJvb3ROb2RlKG5vZGUpO1xuICB2YXIgcXVlcnlSYWRpb3MgPSBmdW5jdGlvbiBxdWVyeVJhZGlvcyhuYW1lKSB7XG4gICAgcmV0dXJuIHJhZGlvU2NvcGUucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cInJhZGlvXCJdW25hbWU9XCInICsgbmFtZSArICdcIl0nKTtcbiAgfTtcbiAgdmFyIHJhZGlvU2V0O1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5DU1MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuQ1NTLmVzY2FwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJhZGlvU2V0ID0gcXVlcnlSYWRpb3Mod2luZG93LkNTUy5lc2NhcGUobm9kZS5uYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHJhZGlvU2V0ID0gcXVlcnlSYWRpb3Mobm9kZS5uYW1lKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKCdMb29rcyBsaWtlIHlvdSBoYXZlIGEgcmFkaW8gYnV0dG9uIHdpdGggYSBuYW1lIGF0dHJpYnV0ZSBjb250YWluaW5nIGludmFsaWQgQ1NTIHNlbGVjdG9yIGNoYXJhY3RlcnMgYW5kIG5lZWQgdGhlIENTUy5lc2NhcGUgcG9seWZpbGw6ICVzJywgZXJyLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICB2YXIgY2hlY2tlZCA9IGdldENoZWNrZWRSYWRpbyhyYWRpb1NldCwgbm9kZS5mb3JtKTtcbiAgcmV0dXJuICFjaGVja2VkIHx8IGNoZWNrZWQgPT09IG5vZGU7XG59O1xudmFyIGlzUmFkaW8gPSBmdW5jdGlvbiBpc1JhZGlvKG5vZGUpIHtcbiAgcmV0dXJuIGlzSW5wdXQobm9kZSkgJiYgbm9kZS50eXBlID09PSAncmFkaW8nO1xufTtcbnZhciBpc05vblRhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc05vblRhYmJhYmxlUmFkaW8obm9kZSkge1xuICByZXR1cm4gaXNSYWRpbyhub2RlKSAmJiAhaXNUYWJiYWJsZVJhZGlvKG5vZGUpO1xufTtcblxuLy8gZGV0ZXJtaW5lcyBpZiBhIG5vZGUgaXMgdWx0aW1hdGVseSBhdHRhY2hlZCB0byB0aGUgd2luZG93J3MgZG9jdW1lbnRcbnZhciBpc05vZGVBdHRhY2hlZCA9IGZ1bmN0aW9uIGlzTm9kZUF0dGFjaGVkKG5vZGUpIHtcbiAgdmFyIF9ub2RlUm9vdDtcbiAgLy8gVGhlIHJvb3Qgbm9kZSBpcyB0aGUgc2hhZG93IHJvb3QgaWYgdGhlIG5vZGUgaXMgaW4gYSBzaGFkb3cgRE9NOyBzb21lIGRvY3VtZW50IG90aGVyd2lzZVxuICAvLyAgKGJ1dCBOT1QgX3RoZV8gZG9jdW1lbnQ7IHNlZSBzZWNvbmQgJ0lmJyBjb21tZW50IGJlbG93IGZvciBtb3JlKS5cbiAgLy8gSWYgcm9vdE5vZGUgaXMgc2hhZG93IHJvb3QsIGl0J2xsIGhhdmUgYSBob3N0LCB3aGljaCBpcyB0aGUgZWxlbWVudCB0byB3aGljaCB0aGUgc2hhZG93XG4gIC8vICBpcyBhdHRhY2hlZCwgYW5kIHRoZSBvbmUgd2UgbmVlZCB0byBjaGVjayBpZiBpdCdzIGluIHRoZSBkb2N1bWVudCBvciBub3QgKGJlY2F1c2UgdGhlXG4gIC8vICBzaGFkb3csIGFuZCBhbGwgbm9kZXMgaXQgY29udGFpbnMsIGlzIG5ldmVyIGNvbnNpZGVyZWQgaW4gdGhlIGRvY3VtZW50IHNpbmNlIHNoYWRvd3NcbiAgLy8gIGJlaGF2ZSBsaWtlIHNlbGYtY29udGFpbmVkIERPTXM7IGJ1dCBpZiB0aGUgc2hhZG93J3MgSE9TVCwgd2hpY2ggaXMgcGFydCBvZiB0aGUgZG9jdW1lbnQsXG4gIC8vICBpcyBoaWRkZW4sIG9yIGlzIG5vdCBpbiB0aGUgZG9jdW1lbnQgaXRzZWxmIGJ1dCBpcyBkZXRhY2hlZCwgaXQgd2lsbCBhZmZlY3QgdGhlIHNoYWRvdydzXG4gIC8vICB2aXNpYmlsaXR5LCBpbmNsdWRpbmcgYWxsIHRoZSBub2RlcyBpdCBjb250YWlucykuIFRoZSBob3N0IGNvdWxkIGJlIGFueSBub3JtYWwgbm9kZSxcbiAgLy8gIG9yIGEgY3VzdG9tIGVsZW1lbnQgKGkuZS4gd2ViIGNvbXBvbmVudCkuIEVpdGhlciB3YXksIHRoYXQncyB0aGUgb25lIHRoYXQgaXMgY29uc2lkZXJlZFxuICAvLyAgcGFydCBvZiB0aGUgZG9jdW1lbnQsIG5vdCB0aGUgc2hhZG93IHJvb3QsIG5vciBhbnkgb2YgaXRzIGNoaWxkcmVuIChpLmUuIHRoZSBub2RlIGJlaW5nXG4gIC8vICB0ZXN0ZWQpLlxuICAvLyBUbyBmdXJ0aGVyIGNvbXBsaWNhdGUgdGhpbmdzLCB3ZSBoYXZlIHRvIGxvb2sgYWxsIHRoZSB3YXkgdXAgdW50aWwgd2UgZmluZCBhIHNoYWRvdyBIT1NUXG4gIC8vICB0aGF0IGlzIGF0dGFjaGVkIChvciBmaW5kIG5vbmUpIGJlY2F1c2UgdGhlIG5vZGUgbWlnaHQgYmUgaW4gbmVzdGVkIHNoYWRvd3MuLi5cbiAgLy8gSWYgcm9vdE5vZGUgaXMgbm90IGEgc2hhZG93IHJvb3QsIGl0IHdvbid0IGhhdmUgYSBob3N0LCBhbmQgc28gcm9vdE5vZGUgc2hvdWxkIGJlIHRoZVxuICAvLyAgZG9jdW1lbnQgKHBlciB0aGUgZG9jcykgYW5kIHdoaWxlIGl0J3MgYSBEb2N1bWVudC10eXBlIG9iamVjdCwgdGhhdCBkb2N1bWVudCBkb2VzIG5vdFxuICAvLyAgYXBwZWFyIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBub2RlJ3MgYG93bmVyRG9jdW1lbnRgIGZvciBzb21lIHJlYXNvbiwgc28gaXQncyBzYWZlclxuICAvLyAgdG8gaWdub3JlIHRoZSByb290Tm9kZSBhdCB0aGlzIHBvaW50LCBhbmQgdXNlIGBub2RlLm93bmVyRG9jdW1lbnRgLiBPdGhlcndpc2UsXG4gIC8vICB1c2luZyBgcm9vdE5vZGUuY29udGFpbnMobm9kZSlgIHdpbGwgX2Fsd2F5c18gYmUgdHJ1ZSB3ZSdsbCBnZXQgZmFsc2UtcG9zaXRpdmVzIHdoZW5cbiAgLy8gIG5vZGUgaXMgYWN0dWFsbHkgZGV0YWNoZWQuXG4gIC8vIE5PVEU6IElmIGBub2RlUm9vdEhvc3RgIG9yIGBub2RlYCBoYXBwZW5zIHRvIGJlIHRoZSBgZG9jdW1lbnRgIGl0c2VsZiAod2hpY2ggaXMgcG9zc2libGVcbiAgLy8gIGlmIGEgdGFiYmFibGUvZm9jdXNhYmxlIG5vZGUgd2FzIHF1aWNrbHkgYWRkZWQgdG8gdGhlIERPTSwgZm9jdXNlZCwgYW5kIHRoZW4gcmVtb3ZlZFxuICAvLyAgZnJvbSB0aGUgRE9NIGFzIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAtcmVhY3QvaXNzdWVzLzkwNSksIHRoZW5cbiAgLy8gIGBvd25lckRvY3VtZW50YCB3aWxsIGJlIGBudWxsYCwgaGVuY2UgdGhlIG9wdGlvbmFsIGNoYWluaW5nIG9uIGl0LlxuICB2YXIgbm9kZVJvb3QgPSBub2RlICYmIGdldFJvb3ROb2RlKG5vZGUpO1xuICB2YXIgbm9kZVJvb3RIb3N0ID0gKF9ub2RlUm9vdCA9IG5vZGVSb290KSA9PT0gbnVsbCB8fCBfbm9kZVJvb3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ub2RlUm9vdC5ob3N0O1xuXG4gIC8vIGluIHNvbWUgY2FzZXMsIGEgZGV0YWNoZWQgbm9kZSB3aWxsIHJldHVybiBpdHNlbGYgYXMgdGhlIHJvb3QgaW5zdGVhZCBvZiBhIGRvY3VtZW50IG9yXG4gIC8vICBzaGFkb3cgcm9vdCBvYmplY3QsIGluIHdoaWNoIGNhc2UsIHdlIHNob3VsZG4ndCB0cnkgdG8gbG9vayBmdXJ0aGVyIHVwIHRoZSBob3N0IGNoYWluXG4gIHZhciBhdHRhY2hlZCA9IGZhbHNlO1xuICBpZiAobm9kZVJvb3QgJiYgbm9kZVJvb3QgIT09IG5vZGUpIHtcbiAgICB2YXIgX25vZGVSb290SG9zdCwgX25vZGVSb290SG9zdCRvd25lckRvLCBfbm9kZSRvd25lckRvY3VtZW50O1xuICAgIGF0dGFjaGVkID0gISEoKF9ub2RlUm9vdEhvc3QgPSBub2RlUm9vdEhvc3QpICE9PSBudWxsICYmIF9ub2RlUm9vdEhvc3QgIT09IHZvaWQgMCAmJiAoX25vZGVSb290SG9zdCRvd25lckRvID0gX25vZGVSb290SG9zdC5vd25lckRvY3VtZW50KSAhPT0gbnVsbCAmJiBfbm9kZVJvb3RIb3N0JG93bmVyRG8gIT09IHZvaWQgMCAmJiBfbm9kZVJvb3RIb3N0JG93bmVyRG8uY29udGFpbnMobm9kZVJvb3RIb3N0KSB8fCBub2RlICE9PSBudWxsICYmIG5vZGUgIT09IHZvaWQgMCAmJiAoX25vZGUkb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudCkgIT09IG51bGwgJiYgX25vZGUkb3duZXJEb2N1bWVudCAhPT0gdm9pZCAwICYmIF9ub2RlJG93bmVyRG9jdW1lbnQuY29udGFpbnMobm9kZSkpO1xuICAgIHdoaWxlICghYXR0YWNoZWQgJiYgbm9kZVJvb3RIb3N0KSB7XG4gICAgICB2YXIgX25vZGVSb290MiwgX25vZGVSb290SG9zdDIsIF9ub2RlUm9vdEhvc3QyJG93bmVyRDtcbiAgICAgIC8vIHNpbmNlIGl0J3Mgbm90IGF0dGFjaGVkIGFuZCB3ZSBoYXZlIGEgcm9vdCBob3N0LCB0aGUgbm9kZSBNVVNUIGJlIGluIGEgbmVzdGVkIHNoYWRvdyBET00sXG4gICAgICAvLyAgd2hpY2ggbWVhbnMgd2UgbmVlZCB0byBnZXQgdGhlIGhvc3QncyBob3N0IGFuZCBjaGVjayBpZiB0aGF0IHBhcmVudCBob3N0IGlzIGNvbnRhaW5lZFxuICAgICAgLy8gIGluIChpLmUuIGF0dGFjaGVkIHRvKSB0aGUgZG9jdW1lbnRcbiAgICAgIG5vZGVSb290ID0gZ2V0Um9vdE5vZGUobm9kZVJvb3RIb3N0KTtcbiAgICAgIG5vZGVSb290SG9zdCA9IChfbm9kZVJvb3QyID0gbm9kZVJvb3QpID09PSBudWxsIHx8IF9ub2RlUm9vdDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ub2RlUm9vdDIuaG9zdDtcbiAgICAgIGF0dGFjaGVkID0gISEoKF9ub2RlUm9vdEhvc3QyID0gbm9kZVJvb3RIb3N0KSAhPT0gbnVsbCAmJiBfbm9kZVJvb3RIb3N0MiAhPT0gdm9pZCAwICYmIChfbm9kZVJvb3RIb3N0MiRvd25lckQgPSBfbm9kZVJvb3RIb3N0Mi5vd25lckRvY3VtZW50KSAhPT0gbnVsbCAmJiBfbm9kZVJvb3RIb3N0MiRvd25lckQgIT09IHZvaWQgMCAmJiBfbm9kZVJvb3RIb3N0MiRvd25lckQuY29udGFpbnMobm9kZVJvb3RIb3N0KSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBhdHRhY2hlZDtcbn07XG52YXIgaXNaZXJvQXJlYSA9IGZ1bmN0aW9uIGlzWmVyb0FyZWEobm9kZSkge1xuICB2YXIgX25vZGUkZ2V0Qm91bmRpbmdDbGllID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICB3aWR0aCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS53aWR0aCxcbiAgICBoZWlnaHQgPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUuaGVpZ2h0O1xuICByZXR1cm4gd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwO1xufTtcbnZhciBpc0hpZGRlbiA9IGZ1bmN0aW9uIGlzSGlkZGVuKG5vZGUsIF9yZWYpIHtcbiAgdmFyIGRpc3BsYXlDaGVjayA9IF9yZWYuZGlzcGxheUNoZWNrLFxuICAgIGdldFNoYWRvd1Jvb3QgPSBfcmVmLmdldFNoYWRvd1Jvb3Q7XG4gIC8vIE5PVEU6IHZpc2liaWxpdHkgd2lsbCBiZSBgdW5kZWZpbmVkYCBpZiBub2RlIGlzIGRldGFjaGVkIGZyb20gdGhlIGRvY3VtZW50XG4gIC8vICAoc2VlIG5vdGVzIGFib3V0IHRoaXMgZnVydGhlciBkb3duKSwgd2hpY2ggbWVhbnMgd2Ugd2lsbCBjb25zaWRlciBpdCB2aXNpYmxlXG4gIC8vICAodGhpcyBpcyBsZWdhY3kgYmVoYXZpb3IgZnJvbSBhIHZlcnkgbG9uZyB3YXkgYmFjaylcbiAgLy8gTk9URTogd2UgY2hlY2sgdGhpcyByZWdhcmRsZXNzIG9mIGBkaXNwbGF5Q2hlY2s9XCJub25lXCJgIGJlY2F1c2UgdGhpcyBpcyBhXG4gIC8vICBfdmlzaWJpbGl0eV8gY2hlY2ssIG5vdCBhIF9kaXNwbGF5XyBjaGVja1xuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBpc0RpcmVjdFN1bW1hcnkgPSBtYXRjaGVzLmNhbGwobm9kZSwgJ2RldGFpbHM+c3VtbWFyeTpmaXJzdC1vZi10eXBlJyk7XG4gIHZhciBub2RlVW5kZXJEZXRhaWxzID0gaXNEaXJlY3RTdW1tYXJ5ID8gbm9kZS5wYXJlbnRFbGVtZW50IDogbm9kZTtcbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlVW5kZXJEZXRhaWxzLCAnZGV0YWlsczpub3QoW29wZW5dKSAqJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIWRpc3BsYXlDaGVjayB8fCBkaXNwbGF5Q2hlY2sgPT09ICdmdWxsJyB8fCBkaXNwbGF5Q2hlY2sgPT09ICdsZWdhY3ktZnVsbCcpIHtcbiAgICBpZiAodHlwZW9mIGdldFNoYWRvd1Jvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIGZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIGNvbnNpZGVyIHRoZSBub2RlIHRvIGJlIGluIGFuIHVuZGlzY2xvc2VkIHNoYWRvdyBhbmQgdXNlIHRoZVxuICAgICAgLy8gICdub24temVyby1hcmVhJyBmYWxsYmFja1xuICAgICAgdmFyIG9yaWdpbmFsTm9kZSA9IG5vZGU7XG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICB2YXIgcGFyZW50RWxlbWVudCA9IG5vZGUucGFyZW50RWxlbWVudDtcbiAgICAgICAgdmFyIHJvb3ROb2RlID0gZ2V0Um9vdE5vZGUobm9kZSk7XG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICYmICFwYXJlbnRFbGVtZW50LnNoYWRvd1Jvb3QgJiYgZ2V0U2hhZG93Um9vdChwYXJlbnRFbGVtZW50KSA9PT0gdHJ1ZSAvLyBjaGVjayBpZiB0aGVyZSdzIGFuIHVuZGlzY2xvc2VkIHNoYWRvd1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyBub2RlIGhhcyBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgd2hpY2ggbWVhbnMgd2UgY2FuIG9ubHkgdHJlYXQgaXQgYXMgYSBibGFjayBib3gsIHNvIHdlXG4gICAgICAgICAgLy8gIGZhbGwgYmFjayB0byBhIG5vbi16ZXJvLWFyZWEgdGVzdFxuICAgICAgICAgIHJldHVybiBpc1plcm9BcmVhKG5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuYXNzaWduZWRTbG90KSB7XG4gICAgICAgICAgLy8gaXRlcmF0ZSB1cCBzbG90XG4gICAgICAgICAgbm9kZSA9IG5vZGUuYXNzaWduZWRTbG90O1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXJlbnRFbGVtZW50ICYmIHJvb3ROb2RlICE9PSBub2RlLm93bmVyRG9jdW1lbnQpIHtcbiAgICAgICAgICAvLyBjcm9zcyBzaGFkb3cgYm91bmRhcnlcbiAgICAgICAgICBub2RlID0gcm9vdE5vZGUuaG9zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpdGVyYXRlIHVwIG5vcm1hbCBkb21cbiAgICAgICAgICBub2RlID0gcGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbm9kZSA9IG9yaWdpbmFsTm9kZTtcbiAgICB9XG4gICAgLy8gZWxzZSwgYGdldFNoYWRvd1Jvb3RgIG1pZ2h0IGJlIHRydWUsIGJ1dCBhbGwgdGhhdCBkb2VzIGlzIGVuYWJsZSBzaGFkb3cgRE9NIHN1cHBvcnRcbiAgICAvLyAgKGkuZS4gaXQgZG9lcyBub3QgYWxzbyBwcmVzdW1lIHRoYXQgYWxsIG5vZGVzIG1pZ2h0IGhhdmUgdW5kaXNjbG9zZWQgc2hhZG93cyk7IG9yXG4gICAgLy8gIGl0IG1pZ2h0IGJlIGEgZmFsc3kgdmFsdWUsIHdoaWNoIG1lYW5zIHNoYWRvdyBET00gc3VwcG9ydCBpcyBkaXNhYmxlZFxuXG4gICAgLy8gU2luY2Ugd2UgZGlkbid0IGZpbmQgaXQgc2l0dGluZyBpbiBhbiB1bmRpc2Nsb3NlZCBzaGFkb3cgKG9yIHNoYWRvd3MgYXJlIGRpc2FibGVkKVxuICAgIC8vICBub3cgd2UgY2FuIGp1c3QgdGVzdCB0byBzZWUgaWYgaXQgd291bGQgbm9ybWFsbHkgYmUgdmlzaWJsZSBvciBub3QsIHByb3ZpZGVkIGl0J3NcbiAgICAvLyAgYXR0YWNoZWQgdG8gdGhlIG1haW4gZG9jdW1lbnQuXG4gICAgLy8gTk9URTogV2UgbXVzdCBjb25zaWRlciBjYXNlIHdoZXJlIG5vZGUgaXMgaW5zaWRlIGEgc2hhZG93IERPTSBhbmQgZ2l2ZW4gZGlyZWN0bHkgdG9cbiAgICAvLyAgYGlzVGFiYmFibGUoKWAgb3IgYGlzRm9jdXNhYmxlKClgIC0tIHJlZ2FyZGxlc3Mgb2YgYGdldFNoYWRvd1Jvb3RgIG9wdGlvbiBzZXR0aW5nLlxuXG4gICAgaWYgKGlzTm9kZUF0dGFjaGVkKG5vZGUpKSB7XG4gICAgICAvLyB0aGlzIHdvcmtzIHdoZXJldmVyIHRoZSBub2RlIGlzOiBpZiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjbGllbnQgcmVjdCwgaXQnc1xuICAgICAgLy8gIHNvbWVob3cgZGlzcGxheWVkOyBpdCBhbHNvIGNvdmVycyB0aGUgQ1NTICdkaXNwbGF5OiBjb250ZW50cycgY2FzZSB3aGVyZSB0aGVcbiAgICAgIC8vICBub2RlIGl0c2VsZiBpcyBoaWRkZW4gaW4gcGxhY2Ugb2YgaXRzIGNvbnRlbnRzOyBhbmQgdGhlcmUncyBubyBuZWVkIHRvIHNlYXJjaFxuICAgICAgLy8gIHVwIHRoZSBoaWVyYXJjaHkgZWl0aGVyXG4gICAgICByZXR1cm4gIW5vZGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gRWxzZSwgdGhlIG5vZGUgaXNuJ3QgYXR0YWNoZWQgdG8gdGhlIGRvY3VtZW50LCB3aGljaCBtZWFucyB0aGUgYGdldENsaWVudFJlY3RzKClgXG4gICAgLy8gIEFQSSB3aWxsIF9fYWx3YXlzX18gcmV0dXJuIHplcm8gcmVjdHMgKHRoaXMgY2FuIGhhcHBlbiwgZm9yIGV4YW1wbGUsIGlmIFJlYWN0XG4gICAgLy8gIGlzIHVzZWQgdG8gcmVuZGVyIG5vZGVzIG9udG8gYSBkZXRhY2hlZCB0cmVlLCBhcyBjb25maXJtZWQgaW4gdGhpcyB0aHJlYWQ6XG4gICAgLy8gIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvOTExNyNpc3N1ZWNvbW1lbnQtMjg0MjI4ODcwKVxuICAgIC8vXG4gICAgLy8gSXQgYWxzbyBtZWFucyB0aGF0IGV2ZW4gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSkuZGlzcGxheSB3aWxsIHJldHVybiBgdW5kZWZpbmVkYFxuICAgIC8vICBiZWNhdXNlIHN0eWxlcyBhcmUgb25seSBjb21wdXRlZCBmb3Igbm9kZXMgdGhhdCBhcmUgaW4gdGhlIGRvY3VtZW50LlxuICAgIC8vXG4gICAgLy8gTk9URTogVEhJUyBIQVMgQkVFTiBUSEUgQ0FTRSBGT1IgWUVBUlMuIEl0IGlzIG5vdCBuZXcsIG5vciBpcyBpdCBjYXVzZWQgYnkgdGFiYmFibGVcbiAgICAvLyAgc29tZWhvdy4gVGhvdWdoIGl0IHdhcyBuZXZlciBzdGF0ZWQgb2ZmaWNpYWxseSwgYW55b25lIHdobyBoYXMgZXZlciB1c2VkIHRhYmJhYmxlXG4gICAgLy8gIEFQSXMgb24gbm9kZXMgaW4gZGV0YWNoZWQgY29udGFpbmVycyBoYXMgYWN0dWFsbHkgaW1wbGljaXRseSB1c2VkIHRhYmJhYmxlIGluIHdoYXRcbiAgICAvLyAgd2FzIGxhdGVyIChhcyBvZiB2NS4yLjAgb24gQXByIDksIDIwMjEpIGNhbGxlZCBgZGlzcGxheUNoZWNrPVwibm9uZVwiYCBtb2RlIC0tIGVzc2VudGlhbGx5XG4gICAgLy8gIGNvbnNpZGVyaW5nIF9fZXZlcnl0aGluZ19fIHRvIGJlIHZpc2libGUgYmVjYXVzZSBvZiB0aGUgaW5uYWJpbGl0eSB0byBkZXRlcm1pbmUgc3R5bGVzLlxuICAgIC8vXG4gICAgLy8gdjYuMC4wOiBBcyBvZiB0aGlzIG1ham9yIHJlbGVhc2UsIHRoZSBkZWZhdWx0ICdmdWxsJyBvcHRpb24gX19ubyBsb25nZXIgdHJlYXRzIGRldGFjaGVkXG4gICAgLy8gIG5vZGVzIGFzIHZpc2libGUgd2l0aCB0aGUgJ25vbmUnIGZhbGxiYWNrLl9fXG4gICAgaWYgKGRpc3BsYXlDaGVjayAhPT0gJ2xlZ2FjeS1mdWxsJykge1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGhpZGRlblxuICAgIH1cbiAgICAvLyBlbHNlLCBmYWxsYmFjayB0byAnbm9uZScgbW9kZSBhbmQgY29uc2lkZXIgdGhlIG5vZGUgdmlzaWJsZVxuICB9IGVsc2UgaWYgKGRpc3BsYXlDaGVjayA9PT0gJ25vbi16ZXJvLWFyZWEnKSB7XG4gICAgLy8gTk9URTogRXZlbiB0aG91Z2ggdGhpcyB0ZXN0cyB0aGF0IHRoZSBub2RlJ3MgY2xpZW50IHJlY3QgaXMgbm9uLXplcm8gdG8gZGV0ZXJtaW5lXG4gICAgLy8gIHdoZXRoZXIgaXQncyBkaXNwbGF5ZWQsIGFuZCB0aGF0IGEgZGV0YWNoZWQgbm9kZSB3aWxsIF9fYWx3YXlzX18gaGF2ZSBhIHplcm8tYXJlYVxuICAgIC8vICBjbGllbnQgcmVjdCwgd2UgZG9uJ3Qgc3BlY2lhbC1jYXNlIGZvciB3aGV0aGVyIHRoZSBub2RlIGlzIGF0dGFjaGVkIG9yIG5vdC4gSW5cbiAgICAvLyAgdGhpcyBtb2RlLCB3ZSBkbyB3YW50IHRvIGNvbnNpZGVyIG5vZGVzIHRoYXQgaGF2ZSBhIHplcm8gYXJlYSB0byBiZSBoaWRkZW4gYXQgYWxsXG4gICAgLy8gIHRpbWVzLCBhbmQgdGhhdCBpbmNsdWRlcyBhdHRhY2hlZCBvciBub3QuXG4gICAgcmV0dXJuIGlzWmVyb0FyZWEobm9kZSk7XG4gIH1cblxuICAvLyB2aXNpYmxlLCBhcyBmYXIgYXMgd2UgY2FuIHRlbGwsIG9yIHBlciBjdXJyZW50IGBkaXNwbGF5Q2hlY2s9bm9uZWAgbW9kZSwgd2UgYXNzdW1lXG4gIC8vICBpdCdzIHZpc2libGVcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLy8gZm9ybSBmaWVsZHMgKG5lc3RlZCkgaW5zaWRlIGEgZGlzYWJsZWQgZmllbGRzZXQgYXJlIG5vdCBmb2N1c2FibGUvdGFiYmFibGVcbi8vICB1bmxlc3MgdGhleSBhcmUgaW4gdGhlIF9maXJzdF8gPGxlZ2VuZD4gZWxlbWVudCBvZiB0aGUgdG9wLW1vc3QgZGlzYWJsZWRcbi8vICBmaWVsZHNldFxudmFyIGlzRGlzYWJsZWRGcm9tRmllbGRzZXQgPSBmdW5jdGlvbiBpc0Rpc2FibGVkRnJvbUZpZWxkc2V0KG5vZGUpIHtcbiAgaWYgKC9eKElOUFVUfEJVVFRPTnxTRUxFQ1R8VEVYVEFSRUEpJC8udGVzdChub2RlLnRhZ05hbWUpKSB7XG4gICAgdmFyIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgLy8gY2hlY2sgaWYgYG5vZGVgIGlzIGNvbnRhaW5lZCBpbiBhIGRpc2FibGVkIDxmaWVsZHNldD5cbiAgICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgICAgaWYgKHBhcmVudE5vZGUudGFnTmFtZSA9PT0gJ0ZJRUxEU0VUJyAmJiBwYXJlbnROb2RlLmRpc2FibGVkKSB7XG4gICAgICAgIC8vIGxvb2sgZm9yIHRoZSBmaXJzdCA8bGVnZW5kPiBhbW9uZyB0aGUgY2hpbGRyZW4gb2YgdGhlIGRpc2FibGVkIDxmaWVsZHNldD5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gcGFyZW50Tm9kZS5jaGlsZHJlbi5pdGVtKGkpO1xuICAgICAgICAgIC8vIHdoZW4gdGhlIGZpcnN0IDxsZWdlbmQ+IChpbiBkb2N1bWVudCBvcmRlcikgaXMgZm91bmRcbiAgICAgICAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gJ0xFR0VORCcpIHtcbiAgICAgICAgICAgIC8vIGlmIGl0cyBwYXJlbnQgPGZpZWxkc2V0PiBpcyBub3QgbmVzdGVkIGluIGFub3RoZXIgZGlzYWJsZWQgPGZpZWxkc2V0PixcbiAgICAgICAgICAgIC8vIHJldHVybiB3aGV0aGVyIGBub2RlYCBpcyBhIGRlc2NlbmRhbnQgb2YgaXRzIGZpcnN0IDxsZWdlbmQ+XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcy5jYWxsKHBhcmVudE5vZGUsICdmaWVsZHNldFtkaXNhYmxlZF0gKicpID8gdHJ1ZSA6ICFjaGlsZC5jb250YWlucyhub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIGRpc2FibGVkIDxmaWVsZHNldD4gY29udGFpbmluZyBgbm9kZWAgaGFzIG5vIDxsZWdlbmQ+XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcbiAgICB9XG4gIH1cblxuICAvLyBlbHNlLCBub2RlJ3MgdGFiYmFibGUvZm9jdXNhYmxlIHN0YXRlIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgYSBmaWVsZHNldCdzXG4gIC8vICBlbmFibGVkL2Rpc2FibGVkIHN0YXRlXG4gIHJldHVybiBmYWxzZTtcbn07XG52YXIgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZSA9IGZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUob3B0aW9ucywgbm9kZSkge1xuICBpZiAobm9kZS5kaXNhYmxlZCB8fFxuICAvLyB3ZSBtdXN0IGRvIGFuIGluZXJ0IGxvb2sgdXAgdG8gZmlsdGVyIG91dCBhbnkgZWxlbWVudHMgaW5zaWRlIGFuIGluZXJ0IGFuY2VzdG9yXG4gIC8vICBiZWNhdXNlIHdlJ3JlIGxpbWl0ZWQgaW4gdGhlIHR5cGUgb2Ygc2VsZWN0b3JzIHdlIGNhbiB1c2UgaW4gSlNEb20gKHNlZSByZWxhdGVkXG4gIC8vICBub3RlIHJlbGF0ZWQgdG8gYGNhbmRpZGF0ZVNlbGVjdG9yc2ApXG4gIGlzSW5lcnQobm9kZSkgfHwgaXNIaWRkZW5JbnB1dChub2RlKSB8fCBpc0hpZGRlbihub2RlLCBvcHRpb25zKSB8fFxuICAvLyBGb3IgYSBkZXRhaWxzIGVsZW1lbnQgd2l0aCBhIHN1bW1hcnksIHRoZSBzdW1tYXJ5IGVsZW1lbnQgZ2V0cyB0aGUgZm9jdXNcbiAgaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkgfHwgaXNEaXNhYmxlZEZyb21GaWVsZHNldChub2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlID0gZnVuY3Rpb24gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlKG9wdGlvbnMsIG5vZGUpIHtcbiAgaWYgKGlzTm9uVGFiYmFibGVSYWRpbyhub2RlKSB8fCBnZXRUYWJJbmRleChub2RlKSA8IDAgfHwgIWlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUob3B0aW9ucywgbm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGlzVmFsaWRTaGFkb3dSb290VGFiYmFibGUgPSBmdW5jdGlvbiBpc1ZhbGlkU2hhZG93Um9vdFRhYmJhYmxlKHNoYWRvd0hvc3ROb2RlKSB7XG4gIHZhciB0YWJJbmRleCA9IHBhcnNlSW50KHNoYWRvd0hvc3ROb2RlLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgMTApO1xuICBpZiAoaXNOYU4odGFiSW5kZXgpIHx8IHRhYkluZGV4ID49IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBJZiBhIGN1c3RvbSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBuZWdhdGl2ZSB0YWJpbmRleCxcbiAgLy8gYnJvd3NlcnMgd2lsbCBub3QgYWxsb3cgdGFiIHRhcmdldGluZyBzYWlkIGVsZW1lbnQncyBjaGlsZHJlbi5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5LjxFbGVtZW50fENhbmRpZGF0ZVNjb3BlPn0gY2FuZGlkYXRlc1xuICogQHJldHVybnMgRWxlbWVudFtdXG4gKi9cbnZhciBzb3J0QnlPcmRlciA9IGZ1bmN0aW9uIHNvcnRCeU9yZGVyKGNhbmRpZGF0ZXMpIHtcbiAgdmFyIHJlZ3VsYXJUYWJiYWJsZXMgPSBbXTtcbiAgdmFyIG9yZGVyZWRUYWJiYWJsZXMgPSBbXTtcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgdmFyIGlzU2NvcGUgPSAhIWl0ZW0uc2NvcGVQYXJlbnQ7XG4gICAgdmFyIGVsZW1lbnQgPSBpc1Njb3BlID8gaXRlbS5zY29wZVBhcmVudCA6IGl0ZW07XG4gICAgdmFyIGNhbmRpZGF0ZVRhYmluZGV4ID0gZ2V0U29ydE9yZGVyVGFiSW5kZXgoZWxlbWVudCwgaXNTY29wZSk7XG4gICAgdmFyIGVsZW1lbnRzID0gaXNTY29wZSA/IHNvcnRCeU9yZGVyKGl0ZW0uY2FuZGlkYXRlcykgOiBlbGVtZW50O1xuICAgIGlmIChjYW5kaWRhdGVUYWJpbmRleCA9PT0gMCkge1xuICAgICAgaXNTY29wZSA/IHJlZ3VsYXJUYWJiYWJsZXMucHVzaC5hcHBseShyZWd1bGFyVGFiYmFibGVzLCBlbGVtZW50cykgOiByZWd1bGFyVGFiYmFibGVzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9yZGVyZWRUYWJiYWJsZXMucHVzaCh7XG4gICAgICAgIGRvY3VtZW50T3JkZXI6IGksXG4gICAgICAgIHRhYkluZGV4OiBjYW5kaWRhdGVUYWJpbmRleCxcbiAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgaXNTY29wZTogaXNTY29wZSxcbiAgICAgICAgY29udGVudDogZWxlbWVudHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvcmRlcmVkVGFiYmFibGVzLnNvcnQoc29ydE9yZGVyZWRUYWJiYWJsZXMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBzb3J0YWJsZSkge1xuICAgIHNvcnRhYmxlLmlzU2NvcGUgPyBhY2MucHVzaC5hcHBseShhY2MsIHNvcnRhYmxlLmNvbnRlbnQpIDogYWNjLnB1c2goc29ydGFibGUuY29udGVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10pLmNvbmNhdChyZWd1bGFyVGFiYmFibGVzKTtcbn07XG52YXIgdGFiYmFibGUgPSBmdW5jdGlvbiB0YWJiYWJsZShjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBjYW5kaWRhdGVzO1xuICBpZiAob3B0aW9ucy5nZXRTaGFkb3dSb290KSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXNJdGVyYXRpdmVseShbY29udGFpbmVyXSwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCB7XG4gICAgICBmaWx0ZXI6IGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpLFxuICAgICAgZmxhdHRlbjogZmFsc2UsXG4gICAgICBnZXRTaGFkb3dSb290OiBvcHRpb25zLmdldFNoYWRvd1Jvb3QsXG4gICAgICBzaGFkb3dSb290RmlsdGVyOiBpc1ZhbGlkU2hhZG93Um9vdFRhYmJhYmxlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXMoY29udGFpbmVyLCBvcHRpb25zLmluY2x1ZGVDb250YWluZXIsIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgfVxuICByZXR1cm4gc29ydEJ5T3JkZXIoY2FuZGlkYXRlcyk7XG59O1xudmFyIGZvY3VzYWJsZSA9IGZ1bmN0aW9uIGZvY3VzYWJsZShjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBjYW5kaWRhdGVzO1xuICBpZiAob3B0aW9ucy5nZXRTaGFkb3dSb290KSB7XG4gICAgY2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXNJdGVyYXRpdmVseShbY29udGFpbmVyXSwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCB7XG4gICAgICBmaWx0ZXI6IGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUuYmluZChudWxsLCBvcHRpb25zKSxcbiAgICAgIGZsYXR0ZW46IHRydWUsXG4gICAgICBnZXRTaGFkb3dSb290OiBvcHRpb25zLmdldFNoYWRvd1Jvb3RcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlcyhjb250YWluZXIsIG9wdGlvbnMuaW5jbHVkZUNvbnRhaW5lciwgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG52YXIgaXNUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzVGFiYmFibGUobm9kZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlLCBjYW5kaWRhdGVTZWxlY3RvcikgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yVGFiYmFibGUob3B0aW9ucywgbm9kZSk7XG59O1xudmFyIGZvY3VzYWJsZUNhbmRpZGF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY2FuZGlkYXRlU2VsZWN0b3JzLmNvbmNhdCgnaWZyYW1lJykuam9pbignLCcpO1xudmFyIGlzRm9jdXNhYmxlID0gZnVuY3Rpb24gaXNGb2N1c2FibGUobm9kZSwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlLCBmb2N1c2FibGVDYW5kaWRhdGVTZWxlY3RvcikgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlKG9wdGlvbnMsIG5vZGUpO1xufTtcblxuZXhwb3J0IHsgZm9jdXNhYmxlLCBnZXRUYWJJbmRleCwgaXNGb2N1c2FibGUsIGlzVGFiYmFibGUsIHRhYmJhYmxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20uanMubWFwXG4iLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLnRyaW1DYW52YXM9dCgpOmUudHJpbUNhbnZhcz10KCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtpZihyW25dKXJldHVybiByW25dLmV4cG9ydHM7dmFyIG89cltuXT17ZXhwb3J0czp7fSxpZDpuLGxvYWRlZDohMX07cmV0dXJuIGVbbl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsdCksby5sb2FkZWQ9ITAsby5leHBvcnRzfXZhciByPXt9O3JldHVybiB0Lm09ZSx0LmM9cix0LnA9XCJcIix0KDApfShbZnVuY3Rpb24oZSx0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKGUpe3ZhciB0PWUuZ2V0Q29udGV4dChcIjJkXCIpLHI9ZS53aWR0aCxuPWUuaGVpZ2h0LG89dC5nZXRJbWFnZURhdGEoMCwwLHIsbikuZGF0YSxmPWEoITAscixuLG8pLGk9YSghMSxyLG4sbyksYz11KCEwLHIsbixvKSxkPXUoITEscixuLG8pLHA9ZC1jKzEsbD1pLWYrMSxzPXQuZ2V0SW1hZ2VEYXRhKGMsZixwLGwpO3JldHVybiBlLndpZHRoPXAsZS5oZWlnaHQ9bCx0LmNsZWFyUmVjdCgwLDAscCxsKSx0LnB1dEltYWdlRGF0YShzLDAsMCksZX1mdW5jdGlvbiBuKGUsdCxyLG4pe3JldHVybntyZWQ6bls0KihyKnQrZSldLGdyZWVuOm5bNCoocip0K2UpKzFdLGJsdWU6bls0KihyKnQrZSkrMl0sYWxwaGE6bls0KihyKnQrZSkrM119fWZ1bmN0aW9uIG8oZSx0LHIsbyl7cmV0dXJuIG4oZSx0LHIsbykuYWxwaGF9ZnVuY3Rpb24gYShlLHQscixuKXtmb3IodmFyIGE9ZT8xOi0xLHU9ZT8wOnItMSxmPXU7ZT9mPHI6Zj4tMTtmKz1hKWZvcih2YXIgaT0wO2k8dDtpKyspaWYobyhpLGYsdCxuKSlyZXR1cm4gZjtyZXR1cm4gbnVsbH1mdW5jdGlvbiB1KGUsdCxyLG4pe2Zvcih2YXIgYT1lPzE6LTEsdT1lPzA6dC0xLGY9dTtlP2Y8dDpmPi0xO2YrPWEpZm9yKHZhciBpPTA7aTxyO2krKylpZihvKGYsaSx0LG4pKXJldHVybiBmO3JldHVybiBudWxsfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD1yfV0pfSk7IiwiLyoqXG4gKiBBc3NpZ25zIGEgdmFsdWUgZm9yIGEgZ2l2ZW4gcmVmLCBubyBtYXR0ZXIgb2YgdGhlIHJlZiBmb3JtYXRcbiAqIEBwYXJhbSB7UmVmT2JqZWN0fSByZWYgLSBhIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIHJlZiBvYmplY3RcbiAqIEBwYXJhbSB2YWx1ZSAtIGEgbmV3IHZhbHVlXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L3VzZS1jYWxsYmFjay1yZWYjYXNzaWducmVmXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcmVmT2JqZWN0ID0gdXNlUmVmKCk7XG4gKiBjb25zdCByZWZGbiA9IChyZWYpID0+IHsuLi4ufVxuICpcbiAqIGFzc2lnblJlZihyZWZPYmplY3QsIFwicmVmVmFsdWVcIik7XG4gKiBhc3NpZ25SZWYocmVmRm4sIFwicmVmVmFsdWVcIik7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25SZWYocmVmLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlZih2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlZikge1xuICAgICAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVmO1xufVxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgYXNzaWduUmVmIH0gZnJvbSAnLi9hc3NpZ25SZWYnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tICcuL3VzZVJlZic7XG52YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0O1xudmFyIGN1cnJlbnRWYWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBNZXJnZXMgdHdvIG9yIG1vcmUgcmVmcyB0b2dldGhlciBwcm92aWRpbmcgYSBzaW5nbGUgaW50ZXJmYWNlIHRvIHNldCB0aGVpciB2YWx1ZVxuICogQHBhcmFtIHtSZWZPYmplY3R8UmVmfSByZWZzXG4gKiBAcmV0dXJucyB7TXV0YWJsZVJlZk9iamVjdH0gLSBhIG5ldyByZWYsIHdoaWNoIHRyYW5zbGF0ZXMgYWxsIGNoYW5nZXMgdG8ge3JlZnN9XG4gKlxuICogQHNlZSB7QGxpbmsgbWVyZ2VSZWZzfSBhIHZlcnNpb24gd2l0aG91dCBidWl0LWluIG1lbW9pemF0aW9uXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVLYXNoZXkvdXNlLWNhbGxiYWNrLXJlZiN1c2VtZXJnZXJlZnNcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBDb21wb25lbnQgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7XG4gKiAgIGNvbnN0IG93blJlZiA9IHVzZVJlZigpO1xuICogICBjb25zdCBkb21SZWYgPSB1c2VNZXJnZVJlZnMoW3JlZiwgb3duUmVmXSk7IC8vIPCfkYggbWVyZ2UgdG9nZXRoZXJcbiAqICAgcmV0dXJuIDxkaXYgcmVmPXtkb21SZWZ9Pi4uLjwvZGl2PlxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWVyZ2VSZWZzKHJlZnMsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHZhciBjYWxsYmFja1JlZiA9IHVzZUNhbGxiYWNrUmVmKGRlZmF1bHRWYWx1ZSB8fCBudWxsLCBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHJlZnMuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7IHJldHVybiBhc3NpZ25SZWYocmVmLCBuZXdWYWx1ZSk7IH0pO1xuICAgIH0pO1xuICAgIC8vIGhhbmRsZSByZWZzIGNoYW5nZXMgLSBhZGRlZCBvciByZW1vdmVkXG4gICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IGN1cnJlbnRWYWx1ZXMuZ2V0KGNhbGxiYWNrUmVmKTtcbiAgICAgICAgaWYgKG9sZFZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgcHJldlJlZnNfMSA9IG5ldyBTZXQob2xkVmFsdWUpO1xuICAgICAgICAgICAgdmFyIG5leHRSZWZzXzEgPSBuZXcgU2V0KHJlZnMpO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRfMSA9IGNhbGxiYWNrUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICBwcmV2UmVmc18xLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgICAgICAgICAgIGlmICghbmV4dFJlZnNfMS5oYXMocmVmKSkge1xuICAgICAgICAgICAgICAgICAgICBhc3NpZ25SZWYocmVmLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5leHRSZWZzXzEuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2UmVmc18xLmhhcyhyZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2lnblJlZihyZWYsIGN1cnJlbnRfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFZhbHVlcy5zZXQoY2FsbGJhY2tSZWYsIHJlZnMpO1xuICAgIH0sIFtyZWZzXSk7XG4gICAgcmV0dXJuIGNhbGxiYWNrUmVmO1xufVxuIiwiaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIGNyZWF0ZXMgYSBNdXRhYmxlUmVmIHdpdGggcmVmIGNoYW5nZSBjYWxsYmFja1xuICogQHBhcmFtIGluaXRpYWxWYWx1ZSAtIGluaXRpYWwgcmVmIHZhbHVlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIGEgY2FsbGJhY2sgdG8gcnVuIHdoZW4gdmFsdWUgY2hhbmdlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByZWYgPSB1c2VDYWxsYmFja1JlZigwLCAobmV3VmFsdWUsIG9sZFZhbHVlKSA9PiBjb25zb2xlLmxvZyhvbGRWYWx1ZSwgJy0+JywgbmV3VmFsdWUpO1xuICogcmVmLmN1cnJlbnQgPSAxO1xuICogLy8gcHJpbnRzIDAgLT4gMVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2hvb2tzLXJlZmVyZW5jZS5odG1sI3VzZXJlZlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L3VzZS1jYWxsYmFjay1yZWYjdXNlY2FsbGJhY2tyZWYtLS10by1yZXBsYWNlLXJlYWN0dXNlcmVmXG4gKiBAcmV0dXJucyB7TXV0YWJsZVJlZk9iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNhbGxiYWNrUmVmKGluaXRpYWxWYWx1ZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgcmVmID0gdXNlU3RhdGUoZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgLy8gdmFsdWVcbiAgICAgICAgdmFsdWU6IGluaXRpYWxWYWx1ZSxcbiAgICAgICAgLy8gbGFzdCBjYWxsYmFja1xuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgIC8vIFwibWVtb2l6ZWRcIiBwdWJsaWMgaW50ZXJmYWNlXG4gICAgICAgIGZhY2FkZToge1xuICAgICAgICAgICAgZ2V0IGN1cnJlbnQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZi52YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgY3VycmVudCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBsYXN0ID0gcmVmLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZWYudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVmLmNhbGxiYWNrKHZhbHVlLCBsYXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pOyB9KVswXTtcbiAgICAvLyB1cGRhdGUgY2FsbGJhY2tcbiAgICByZWYuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICByZXR1cm4gcmVmLmZhY2FkZTtcbn1cbiIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbnZhciBTaWRlQ2FyID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIHNpZGVDYXIgPSBfYS5zaWRlQ2FyLCByZXN0ID0gX19yZXN0KF9hLCBbXCJzaWRlQ2FyXCJdKTtcbiAgICBpZiAoIXNpZGVDYXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaWRlY2FyOiBwbGVhc2UgcHJvdmlkZSBgc2lkZUNhcmAgcHJvcGVydHkgdG8gaW1wb3J0IHRoZSByaWdodCBjYXInKTtcbiAgICB9XG4gICAgdmFyIFRhcmdldCA9IHNpZGVDYXIucmVhZCgpO1xuICAgIGlmICghVGFyZ2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2lkZWNhciBtZWRpdW0gbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFRhcmdldCwgX19hc3NpZ24oe30sIHJlc3QpKTtcbn07XG5TaWRlQ2FyLmlzU2lkZUNhckV4cG9ydCA9IHRydWU7XG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0U2lkZWNhcihtZWRpdW0sIGV4cG9ydGVkKSB7XG4gICAgbWVkaXVtLnVzZU1lZGl1bShleHBvcnRlZCk7XG4gICAgcmV0dXJuIFNpZGVDYXI7XG59XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuZnVuY3Rpb24gSXRvSShhKSB7XG4gICAgcmV0dXJuIGE7XG59XG5mdW5jdGlvbiBpbm5lckNyZWF0ZU1lZGl1bShkZWZhdWx0cywgbWlkZGxld2FyZSkge1xuICAgIGlmIChtaWRkbGV3YXJlID09PSB2b2lkIDApIHsgbWlkZGxld2FyZSA9IEl0b0k7IH1cbiAgICB2YXIgYnVmZmVyID0gW107XG4gICAgdmFyIGFzc2lnbmVkID0gZmFsc2U7XG4gICAgdmFyIG1lZGl1bSA9IHtcbiAgICAgICAgcmVhZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGFzc2lnbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaWRlY2FyOiBjb3VsZCBub3QgYHJlYWRgIGZyb20gYW4gYGFzc2lnbmVkYCBtZWRpdW0uIGByZWFkYCBjb3VsZCBiZSB1c2VkIG9ubHkgd2l0aCBgdXNlTWVkaXVtYC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgICAgIH0sXG4gICAgICAgIHVzZU1lZGl1bTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gbWlkZGxld2FyZShkYXRhLCBhc3NpZ25lZCk7XG4gICAgICAgICAgICBidWZmZXIucHVzaChpdGVtKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geCAhPT0gaXRlbTsgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBhc3NpZ25TeW5jTWVkaXVtOiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgIGFzc2lnbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlIChidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNicyA9IGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICBjYnMuZm9yRWFjaChjYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIgPSB7XG4gICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKHgpIHsgcmV0dXJuIGNiKHgpOyB9LFxuICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gYnVmZmVyOyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgYXNzaWduTWVkaXVtOiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgIGFzc2lnbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBwZW5kaW5nUXVldWUgPSBbXTtcbiAgICAgICAgICAgIGlmIChidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNicyA9IGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICBjYnMuZm9yRWFjaChjYik7XG4gICAgICAgICAgICAgICAgcGVuZGluZ1F1ZXVlID0gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGV4ZWN1dGVRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2JzID0gcGVuZGluZ1F1ZXVlO1xuICAgICAgICAgICAgICAgIHBlbmRpbmdRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgIGNicy5mb3JFYWNoKGNiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgY3ljbGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGV4ZWN1dGVRdWV1ZSk7IH07XG4gICAgICAgICAgICBjeWNsZSgpO1xuICAgICAgICAgICAgYnVmZmVyID0ge1xuICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdRdWV1ZS5wdXNoKHgpO1xuICAgICAgICAgICAgICAgICAgICBjeWNsZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmdRdWV1ZSA9IHBlbmRpbmdRdWV1ZS5maWx0ZXIoZmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBtZWRpdW07XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVkaXVtKGRlZmF1bHRzLCBtaWRkbGV3YXJlKSB7XG4gICAgaWYgKG1pZGRsZXdhcmUgPT09IHZvaWQgMCkgeyBtaWRkbGV3YXJlID0gSXRvSTsgfVxuICAgIHJldHVybiBpbm5lckNyZWF0ZU1lZGl1bShkZWZhdWx0cywgbWlkZGxld2FyZSk7XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNpZGVjYXJNZWRpdW0ob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgdmFyIG1lZGl1bSA9IGlubmVyQ3JlYXRlTWVkaXVtKG51bGwpO1xuICAgIG1lZGl1bS5vcHRpb25zID0gX19hc3NpZ24oeyBhc3luYzogdHJ1ZSwgc3NyOiBmYWxzZSB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gbWVkaXVtO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgcmV0dXJuIHggPT09IHkgJiYgKHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5KSB8fCB4ICE9PSB4ICYmIHkgIT09IHkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgO1xufVxuXG52YXIgb2JqZWN0SXMgPSB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaXM7XG5cbnZhciB1c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlO1xuXG4vLyBmb3IgQ29tbW9uSlMgaW50ZXJvcC5cblxudmFyIHVzZVJlZiA9IFJlYWN0LnVzZVJlZixcbiAgICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gICAgdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8sXG4gICAgdXNlRGVidWdWYWx1ZSA9IFJlYWN0LnVzZURlYnVnVmFsdWU7IC8vIFNhbWUgYXMgdXNlU3luY0V4dGVybmFsU3RvcmUsIGJ1dCBzdXBwb3J0cyBzZWxlY3RvciBhbmQgaXNFcXVhbCBhcmd1bWVudHMuXG5cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90LCBzZWxlY3RvciwgaXNFcXVhbCkge1xuICAvLyBVc2UgdGhpcyB0byB0cmFjayB0aGUgcmVuZGVyZWQgc25hcHNob3QuXG4gIHZhciBpbnN0UmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgaW5zdDtcblxuICBpZiAoaW5zdFJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgaW5zdCA9IHtcbiAgICAgIGhhc1ZhbHVlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBudWxsXG4gICAgfTtcbiAgICBpbnN0UmVmLmN1cnJlbnQgPSBpbnN0O1xuICB9IGVsc2Uge1xuICAgIGluc3QgPSBpbnN0UmVmLmN1cnJlbnQ7XG4gIH1cblxuICB2YXIgX3VzZU1lbW8gPSB1c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUcmFjayB0aGUgbWVtb2l6ZWQgc3RhdGUgdXNpbmcgY2xvc3VyZSB2YXJpYWJsZXMgdGhhdCBhcmUgbG9jYWwgdG8gdGhpc1xuICAgIC8vIG1lbW9pemVkIGluc3RhbmNlIG9mIGEgZ2V0U25hcHNob3QgZnVuY3Rpb24uIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGFcbiAgICAvLyB1c2VSZWYgaG9vaywgYmVjYXVzZSB0aGF0IHN0YXRlIHdvdWxkIGJlIHNoYXJlZCBhY3Jvc3MgYWxsIGNvbmN1cnJlbnRcbiAgICAvLyBjb3BpZXMgb2YgdGhlIGhvb2svY29tcG9uZW50LlxuICAgIHZhciBoYXNNZW1vID0gZmFsc2U7XG4gICAgdmFyIG1lbW9pemVkU25hcHNob3Q7XG4gICAgdmFyIG1lbW9pemVkU2VsZWN0aW9uO1xuXG4gICAgdmFyIG1lbW9pemVkU2VsZWN0b3IgPSBmdW5jdGlvbiAobmV4dFNuYXBzaG90KSB7XG4gICAgICBpZiAoIWhhc01lbW8pIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhlIGhvb2sgaXMgY2FsbGVkLCB0aGVyZSBpcyBubyBtZW1vaXplZCByZXN1bHQuXG4gICAgICAgIGhhc01lbW8gPSB0cnVlO1xuICAgICAgICBtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90O1xuXG4gICAgICAgIHZhciBfbmV4dFNlbGVjdGlvbiA9IHNlbGVjdG9yKG5leHRTbmFwc2hvdCk7XG5cbiAgICAgICAgaWYgKGlzRXF1YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEV2ZW4gaWYgdGhlIHNlbGVjdG9yIGhhcyBjaGFuZ2VkLCB0aGUgY3VycmVudGx5IHJlbmRlcmVkIHNlbGVjdGlvblxuICAgICAgICAgIC8vIG1heSBiZSBlcXVhbCB0byB0aGUgbmV3IHNlbGVjdGlvbi4gV2Ugc2hvdWxkIGF0dGVtcHQgdG8gcmV1c2UgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCB2YWx1ZSBpZiBwb3NzaWJsZSwgdG8gcHJlc2VydmUgZG93bnN0cmVhbSBtZW1vaXphdGlvbnMuXG4gICAgICAgICAgaWYgKGluc3QuaGFzVmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U2VsZWN0aW9uID0gaW5zdC52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGlzRXF1YWwoY3VycmVudFNlbGVjdGlvbiwgX25leHRTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgIG1lbW9pemVkU2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24gPSBfbmV4dFNlbGVjdGlvbjtcbiAgICAgICAgcmV0dXJuIF9uZXh0U2VsZWN0aW9uO1xuICAgICAgfSAvLyBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSB0aGUgcHJldmlvdXMgaW52b2NhdGlvbidzIHJlc3VsdC5cblxuXG4gICAgICAvLyBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSB0aGUgcHJldmlvdXMgaW52b2NhdGlvbidzIHJlc3VsdC5cbiAgICAgIHZhciBwcmV2U25hcHNob3QgPSBtZW1vaXplZFNuYXBzaG90O1xuICAgICAgdmFyIHByZXZTZWxlY3Rpb24gPSBtZW1vaXplZFNlbGVjdGlvbjtcblxuICAgICAgaWYgKG9iamVjdElzKHByZXZTbmFwc2hvdCwgbmV4dFNuYXBzaG90KSkge1xuICAgICAgICAvLyBUaGUgc25hcHNob3QgaXMgdGhlIHNhbWUgYXMgbGFzdCB0aW1lLiBSZXVzZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLlxuICAgICAgICByZXR1cm4gcHJldlNlbGVjdGlvbjtcbiAgICAgIH0gLy8gVGhlIHNuYXBzaG90IGhhcyBjaGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIGNvbXB1dGUgYSBuZXcgc2VsZWN0aW9uLlxuXG5cbiAgICAgIC8vIFRoZSBzbmFwc2hvdCBoYXMgY2hhbmdlZCwgc28gd2UgbmVlZCB0byBjb21wdXRlIGEgbmV3IHNlbGVjdGlvbi5cbiAgICAgIHZhciBuZXh0U2VsZWN0aW9uID0gc2VsZWN0b3IobmV4dFNuYXBzaG90KTsgLy8gSWYgYSBjdXN0b20gaXNFcXVhbCBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdXNlIHRoYXQgdG8gY2hlY2sgaWYgdGhlIGRhdGFcbiAgICAgIC8vIGhhcyBjaGFuZ2VkLiBJZiBpdCBoYXNuJ3QsIHJldHVybiB0aGUgcHJldmlvdXMgc2VsZWN0aW9uLiBUaGF0IHNpZ25hbHNcbiAgICAgIC8vIHRvIFJlYWN0IHRoYXQgdGhlIHNlbGVjdGlvbnMgYXJlIGNvbmNlcHR1YWxseSBlcXVhbCwgYW5kIHdlIGNhbiBiYWlsXG4gICAgICAvLyBvdXQgb2YgcmVuZGVyaW5nLlxuXG4gICAgICAvLyBJZiBhIGN1c3RvbSBpc0VxdWFsIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB1c2UgdGhhdCB0byBjaGVjayBpZiB0aGUgZGF0YVxuICAgICAgLy8gaGFzIGNoYW5nZWQuIElmIGl0IGhhc24ndCwgcmV0dXJuIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uIFRoYXQgc2lnbmFsc1xuICAgICAgLy8gdG8gUmVhY3QgdGhhdCB0aGUgc2VsZWN0aW9ucyBhcmUgY29uY2VwdHVhbGx5IGVxdWFsLCBhbmQgd2UgY2FuIGJhaWxcbiAgICAgIC8vIG91dCBvZiByZW5kZXJpbmcuXG4gICAgICBpZiAoaXNFcXVhbCAhPT0gdW5kZWZpbmVkICYmIGlzRXF1YWwocHJldlNlbGVjdGlvbiwgbmV4dFNlbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTZWxlY3Rpb247XG4gICAgICB9XG5cbiAgICAgIG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3Q7XG4gICAgICBtZW1vaXplZFNlbGVjdGlvbiA9IG5leHRTZWxlY3Rpb247XG4gICAgICByZXR1cm4gbmV4dFNlbGVjdGlvbjtcbiAgICB9OyAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0YW50IHNvIHRoYXQgRmxvdyBrbm93cyBpdCBjYW4ndCBjaGFuZ2UuXG5cblxuICAgIC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3RhbnQgc28gdGhhdCBGbG93IGtub3dzIGl0IGNhbid0IGNoYW5nZS5cbiAgICB2YXIgbWF5YmVHZXRTZXJ2ZXJTbmFwc2hvdCA9IGdldFNlcnZlclNuYXBzaG90ID09PSB1bmRlZmluZWQgPyBudWxsIDogZ2V0U2VydmVyU25hcHNob3Q7XG5cbiAgICB2YXIgZ2V0U25hcHNob3RXaXRoU2VsZWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihnZXRTbmFwc2hvdCgpKTtcbiAgICB9O1xuXG4gICAgdmFyIGdldFNlcnZlclNuYXBzaG90V2l0aFNlbGVjdG9yID0gbWF5YmVHZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZW1vaXplZFNlbGVjdG9yKG1heWJlR2V0U2VydmVyU25hcHNob3QoKSk7XG4gICAgfTtcbiAgICByZXR1cm4gW2dldFNuYXBzaG90V2l0aFNlbGVjdG9yLCBnZXRTZXJ2ZXJTbmFwc2hvdFdpdGhTZWxlY3Rvcl07XG4gIH0sIFtnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QsIHNlbGVjdG9yLCBpc0VxdWFsXSksXG4gICAgICBnZXRTZWxlY3Rpb24gPSBfdXNlTWVtb1swXSxcbiAgICAgIGdldFNlcnZlclNlbGVjdGlvbiA9IF91c2VNZW1vWzFdO1xuXG4gIHZhciB2YWx1ZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U2VsZWN0aW9uLCBnZXRTZXJ2ZXJTZWxlY3Rpb24pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGluc3QuaGFzVmFsdWUgPSB0cnVlO1xuICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgfSwgW3ZhbHVlXSk7XG4gIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXdpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNQVhcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX21heC5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5JTFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbmlsLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicGFyc2VcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3BhcnNlLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3RyaW5naWZ5XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2MVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdi5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInYxVG9WNlwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjFUb1YuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2M1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjIuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjMuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjQuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NlwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjUuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2NlRvVjFcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3Y2VG9WLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjdcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3Y2LmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidmFsaWRhdGVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3ZhbGlkYXRlLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidmVyc2lvblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdmVyc2lvbi5kZWZhdWx0O1xuICB9XG59KTtcbnZhciBfbWF4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9tYXguanNcIikpO1xudmFyIF9uaWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL25pbC5qc1wiKSk7XG52YXIgX3BhcnNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZS5qc1wiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpKTtcbnZhciBfdiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjEuanNcIikpO1xudmFyIF92MVRvViA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjFUb1Y2LmpzXCIpKTtcbnZhciBfdjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YzLmpzXCIpKTtcbnZhciBfdjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y0LmpzXCIpKTtcbnZhciBfdjQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y1LmpzXCIpKTtcbnZhciBfdjUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y2LmpzXCIpKTtcbnZhciBfdjZUb1YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y2VG9WMS5qc1wiKSk7XG52YXIgX3Y2ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92Ny5qc1wiKSk7XG52YXIgX3ZhbGlkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKSk7XG52YXIgX3ZlcnNpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3ZlcnNpb24uanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gJ2ZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZic7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEphdmFTY3JpcHQgTUQ1XG4gKlxuICogTW9kaWZpY2F0aW9uIG9mIEphdmFTY3JpcHQgTUQ1XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9KYXZhU2NyaXB0LU1ENVxuICpcbiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuXG4gKiBodHRwczovL2JsdWVpbXAubmV0XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqXG4gKiBCYXNlZCBvblxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZVxuICogRGlnZXN0IEFsZ29yaXRobSwgYXMgZGVmaW5lZCBpbiBSRkMgMTMyMS5cbiAqIFZlcnNpb24gMi4yIENvcHlyaWdodCAoQykgUGF1bCBKb2huc3RvbiAxOTk5IC0gMjAwOVxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlXG4gKiBTZWUgaHR0cDovL3BhamhvbWUub3JnLnVrL2NyeXB0L21kNSBmb3IgbW9yZSBpbmZvLlxuICovXG5mdW5jdGlvbiBtZDUoYnl0ZXMpIHtcbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KG1zZy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlc1tpXSA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWQ1VG9IZXhFbmNvZGVkQXJyYXkod29yZHNUb01kNShieXRlc1RvV29yZHMoYnl0ZXMpLCBieXRlcy5sZW5ndGggKiA4KSk7XG59XG5cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAqL1xuZnVuY3Rpb24gbWQ1VG9IZXhFbmNvZGVkQXJyYXkoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgbGVuZ3RoMzIgPSBpbnB1dC5sZW5ndGggKiAzMjtcbiAgdmFyIGhleFRhYiA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgdmFyIHggPSBpbnB1dFtpID4+IDVdID4+PiBpICUgMzIgJiAweGZmO1xuICAgIHZhciBoZXggPSBwYXJzZUludChoZXhUYWIuY2hhckF0KHggPj4+IDQgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpLCAxNik7XG4gICAgb3V0cHV0LnB1c2goaGV4KTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBvdXRwdXQgbGVuZ3RoIHdpdGggcGFkZGluZyBhbmQgYml0IGxlbmd0aFxuICovXG5mdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGg4KSB7XG4gIHJldHVybiAoaW5wdXRMZW5ndGg4ICsgNjQgPj4+IDkgPDwgNCkgKyAxNCArIDE7XG59XG5cbi8qXG4gKiBDYWxjdWxhdGUgdGhlIE1ENSBvZiBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzLCBhbmQgYSBiaXQgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiB3b3Jkc1RvTWQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4W2dldE91dHB1dExlbmd0aChsZW4pIC0gMV0gPSBsZW47XG4gIHZhciBhID0gMTczMjU4NDE5MztcbiAgdmFyIGIgPSAtMjcxNzMzODc5O1xuICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xuICB2YXIgZCA9IDI3MTczMzg3ODtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSArPSAxNikge1xuICAgIHZhciBvbGRhID0gYTtcbiAgICB2YXIgb2xkYiA9IGI7XG4gICAgdmFyIG9sZGMgPSBjO1xuICAgIHZhciBvbGRkID0gZDtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpXSwgNywgLTY4MDg3NjkzNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDFdLCAxMiwgLTM4OTU2NDU4Nik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNywgNjA2MTA1ODE5KTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgM10sIDIyLCAtMTA0NDUyNTMzMCk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA3LCAtMTc2NDE4ODk3KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgNV0sIDEyLCAxMjAwMDgwNDI2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDddLCAyMiwgLTQ1NzA1OTgzKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgOF0sIDcsIDE3NzAwMzU0MTYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA5XSwgMTIsIC0xOTU4NDE0NDE3KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNywgLTQyMDYzKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDcsIDE4MDQ2MDM2ODIpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxM10sIDEyLCAtNDAzNDExMDEpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDE1XSwgMjIsIDEyMzY1MzUzMjkpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNSwgLTE2NTc5NjUxMCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDZdLCA5LCAtMTA2OTUwMTYzMik7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTQsIDY0MzcxNzcxMyk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaV0sIDIwLCAtMzczODk3MzAyKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgNV0sIDUsIC03MDE1NTg2OTEpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxMF0sIDksIDM4MDE2MDgzKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNCwgLTY2MDQ3ODMzNSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDRdLCAyMCwgLTQwNTUzNzg0OCk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDldLCA1LCA1Njg0NDY0MzgpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAxNF0sIDksIC0xMDE5ODAzNjkwKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgM10sIDE0LCAtMTg3MzYzOTYxKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgOF0sIDIwLCAxMTYzNTMxNTAxKTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMTNdLCA1LCAtMTQ0NDY4MTQ2Nyk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDJdLCA5LCAtNTE0MDM3ODQpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTQsIDE3MzUzMjg0NzMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyAxMl0sIDIwLCAtMTkyNjYwNzczNCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA0LCAtMzc4NTU4KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgOF0sIDExLCAtMjAyMjU3NDQ2Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDExXSwgMTYsIDE4MzkwMzA1NjIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxNF0sIDIzLCAtMzUzMDk1NTYpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxXSwgNCwgLTE1MzA5OTIwNjApO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA0XSwgMTEsIDEyNzI4OTMzNTMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyA3XSwgMTYsIC0xNTU0OTc2MzIpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAxMF0sIDIzLCAtMTA5NDczMDY0MCk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNCwgNjgxMjc5MTc0KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpXSwgMTEsIC0zNTg1MzcyMjIpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTYsIC03MjI1MjE5NzkpO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyA2XSwgMjMsIDc2MDI5MTg5KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgOV0sIDQsIC02NDAzNjQ0ODcpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyAxMl0sIDExLCAtNDIxODE1ODM1KTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTVdLCAxNiwgNTMwNzQyNTIwKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMl0sIDIzLCAtOTk1MzM4NjUxKTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpXSwgNiwgLTE5ODYzMDg0NCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDddLCAxMCwgMTEyNjg5MTQxNSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgNV0sIDIxLCAtNTc0MzQwNTUpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyAxMl0sIDYsIDE3MDA0ODU1NzEpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAzXSwgMTAsIC0xODk0OTg2NjA2KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTBdLCAxNSwgLTEwNTE1MjMpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxXSwgMjEsIC0yMDU0OTIyNzk5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgOF0sIDYsIDE4NzMzMTMzNTkpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxNV0sIDEwLCAtMzA2MTE3NDQpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTUsIC0xNTYwMTk4MzgwKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMTNdLCAyMSwgMTMwOTE1MTY0OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDRdLCA2LCAtMTQ1NTIzMDcwKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTFdLCAxMCwgLTExMjAyMTAzNzkpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTUsIDcxODc4NzI1OSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDldLCAyMSwgLTM0MzQ4NTU1MSk7XG4gICAgYSA9IHNhZmVBZGQoYSwgb2xkYSk7XG4gICAgYiA9IHNhZmVBZGQoYiwgb2xkYik7XG4gICAgYyA9IHNhZmVBZGQoYywgb2xkYyk7XG4gICAgZCA9IHNhZmVBZGQoZCwgb2xkZCk7XG4gIH1cbiAgcmV0dXJuIFthLCBiLCBjLCBkXTtcbn1cblxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgYnl0ZXMgdG8gYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3Jkc1xuICogQ2hhcmFjdGVycyA+MjU1IGhhdmUgdGhlaXIgaGlnaC1ieXRlIHNpbGVudGx5IGlnbm9yZWQuXG4gKi9cbmZ1bmN0aW9uIGJ5dGVzVG9Xb3JkcyhpbnB1dCkge1xuICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBsZW5ndGg4ID0gaW5wdXQubGVuZ3RoICogODtcbiAgdmFyIG91dHB1dCA9IG5ldyBVaW50MzJBcnJheShnZXRPdXRwdXRMZW5ndGgobGVuZ3RoOCkpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDg7IGkgKz0gOCkge1xuICAgIG91dHB1dFtpID4+IDVdIHw9IChpbnB1dFtpIC8gOF0gJiAweGZmKSA8PCBpICUgMzI7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLypcbiAqIEFkZCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHlcbiAqIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG4gKi9cbmZ1bmN0aW9uIHNhZmVBZGQoeCwgeSkge1xuICB2YXIgbHN3ID0gKHggJiAweGZmZmYpICsgKHkgJiAweGZmZmYpO1xuICB2YXIgbXN3ID0gKHggPj4gMTYpICsgKHkgPj4gMTYpICsgKGxzdyA+PiAxNik7XG4gIHJldHVybiBtc3cgPDwgMTYgfCBsc3cgJiAweGZmZmY7XG59XG5cbi8qXG4gKiBCaXR3aXNlIHJvdGF0ZSBhIDMyLWJpdCBudW1iZXIgdG8gdGhlIGxlZnQuXG4gKi9cbmZ1bmN0aW9uIGJpdFJvdGF0ZUxlZnQobnVtLCBjbnQpIHtcbiAgcmV0dXJuIG51bSA8PCBjbnQgfCBudW0gPj4+IDMyIC0gY250O1xufVxuXG4vKlxuICogVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgZm91ciBiYXNpYyBvcGVyYXRpb25zIHRoZSBhbGdvcml0aG0gdXNlcy5cbiAqL1xuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5mdW5jdGlvbiBtZDVmZihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGMgfCB+YiAmIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuZnVuY3Rpb24gbWQ1Z2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBkIHwgYyAmIH5kLCBhLCBiLCB4LCBzLCB0KTtcbn1cbmZ1bmN0aW9uIG1kNWhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuZnVuY3Rpb24gbWQ1aWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGMgXiAoYiB8IH5kKSwgYSwgYiwgeCwgcywgdCk7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBtZDU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgcmFuZG9tVVVJRCA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEICYmIGNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgcmFuZG9tVVVJRFxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF92YWxpZGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdmFsaWRhdGUuanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuZnVuY3Rpb24gcGFyc2UodXVpZCkge1xuICBpZiAoISgwLCBfdmFsaWRhdGUuZGVmYXVsdCkodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG4gIHZhciB2O1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuXG4gIC8vIFBhcnNlICMjIyMjIyMjLS4uLi4tLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuICBhcnJbMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0O1xuICBhcnJbMV0gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsyXSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbM10gPSB2ICYgMHhmZjtcblxuICAvLyBQYXJzZSAuLi4uLi4uLi0jIyMjLS4uLi4tLi4uLi0uLi4uLi4uLi4uLi5cbiAgYXJyWzRdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDksIDEzKSwgMTYpKSA+Pj4gODtcbiAgYXJyWzVdID0gdiAmIDB4ZmY7XG5cbiAgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0jIyMjLS4uLi4tLi4uLi4uLi4uLi4uXG4gIGFycls2XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTgpLCAxNikpID4+PiA4O1xuICBhcnJbN10gPSB2ICYgMHhmZjtcblxuICAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLS4uLi4tIyMjIy0uLi4uLi4uLi4uLi5cbiAgYXJyWzhdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDE5LCAyMyksIDE2KSkgPj4+IDg7XG4gIGFycls5XSA9IHYgJiAweGZmO1xuXG4gIC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0uLi4uLSMjIyMjIyMjIyMjI1xuICAvLyAoVXNlIFwiL1wiIHRvIGF2b2lkIDMyLWJpdCB0cnVuY2F0aW9uIHdoZW4gYml0LXNoaWZ0aW5nIGhpZ2gtb3JkZXIgYnl0ZXMpXG4gIGFyclsxMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMjQsIDM2KSwgMTYpKSAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBhcnJbMTFdID0gdiAvIDB4MTAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzEyXSA9IHYgPj4+IDI0ICYgMHhmZjtcbiAgYXJyWzEzXSA9IHYgPj4+IDE2ICYgMHhmZjtcbiAgYXJyWzE0XSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbMTVdID0gdiAmIDB4ZmY7XG4gIHJldHVybiBhcnI7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBwYXJzZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtOF1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwfGZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZikkL2k7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBybmc7XG4vLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cblxudmFyIGdldFJhbmRvbVZhbHVlcztcbnZhciBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmZ1bmN0aW9uIHJuZygpIHtcbiAgLy8gbGF6eSBsb2FkIHNvIHRoYXQgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBwb2x5ZmlsbCBoYXZlIGEgY2hhbmNlIHRvIGRvIHNvXG4gIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gZ2V0UmFuZG9tVmFsdWVzIG5lZWRzIHRvIGJlIGludm9rZWQgaW4gYSBjb250ZXh0IHdoZXJlIFwidGhpc1wiIGlzIGEgQ3J5cHRvIGltcGxlbWVudGF0aW9uLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byk7XG4gICAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4vLyBBZGFwdGVkIGZyb20gQ2hyaXMgVmVuZXNzJyBTSEExIGNvZGUgYXRcbi8vIGh0dHA6Ly93d3cubW92YWJsZS10eXBlLmNvLnVrL3NjcmlwdHMvc2hhMS5odG1sXG5mdW5jdGlvbiBmKHMsIHgsIHksIHopIHtcbiAgc3dpdGNoIChzKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIHggJiB5IF4gfnggJiB6O1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuICB9XG59XG5mdW5jdGlvbiBST1RMKHgsIG4pIHtcbiAgcmV0dXJuIHggPDwgbiB8IHggPj4+IDMyIC0gbjtcbn1cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzLnB1c2gobXNnLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShieXRlcykpIHtcbiAgICAvLyBDb252ZXJ0IEFycmF5LWxpa2UgdG8gQXJyYXlcbiAgICBieXRlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJ5dGVzKTtcbiAgfVxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IE47ICsrX2kpIHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQzMkFycmF5KDE2KTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIGFycltqXSA9IGJ5dGVzW19pICogNjQgKyBqICogNF0gPDwgMjQgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAxXSA8PCAxNiB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDJdIDw8IDggfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAzXTtcbiAgICB9XG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cbiAgTVtOIC0gMV1bMTRdID0gKGJ5dGVzLmxlbmd0aCAtIDEpICogOCAvIE1hdGgucG93KDIsIDMyKTtcbiAgTVtOIC0gMV1bMTRdID0gTWF0aC5mbG9vcihNW04gLSAxXVsxNF0pO1xuICBNW04gLSAxXVsxNV0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4ICYgMHhmZmZmZmZmZjtcbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgTjsgKytfaTIpIHtcbiAgICB2YXIgVyA9IG5ldyBVaW50MzJBcnJheSg4MCk7XG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfdCA9IDE2OyBfdCA8IDgwOyArK190KSB7XG4gICAgICBXW190XSA9IFJPVEwoV1tfdCAtIDNdIF4gV1tfdCAtIDhdIF4gV1tfdCAtIDE0XSBeIFdbX3QgLSAxNl0sIDEpO1xuICAgIH1cbiAgICB2YXIgYSA9IEhbMF07XG4gICAgdmFyIGIgPSBIWzFdO1xuICAgIHZhciBjID0gSFsyXTtcbiAgICB2YXIgZCA9IEhbM107XG4gICAgdmFyIGUgPSBIWzRdO1xuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cbiAgICBIWzBdID0gSFswXSArIGEgPj4+IDA7XG4gICAgSFsxXSA9IEhbMV0gKyBiID4+PiAwO1xuICAgIEhbMl0gPSBIWzJdICsgYyA+Pj4gMDtcbiAgICBIWzNdID0gSFszXSArIGQgPj4+IDA7XG4gICAgSFs0XSA9IEhbNF0gKyBlID4+PiAwO1xuICB9XG4gIHJldHVybiBbSFswXSA+PiAyNCAmIDB4ZmYsIEhbMF0gPj4gMTYgJiAweGZmLCBIWzBdID4+IDggJiAweGZmLCBIWzBdICYgMHhmZiwgSFsxXSA+PiAyNCAmIDB4ZmYsIEhbMV0gPj4gMTYgJiAweGZmLCBIWzFdID4+IDggJiAweGZmLCBIWzFdICYgMHhmZiwgSFsyXSA+PiAyNCAmIDB4ZmYsIEhbMl0gPj4gMTYgJiAweGZmLCBIWzJdID4+IDggJiAweGZmLCBIWzJdICYgMHhmZiwgSFszXSA+PiAyNCAmIDB4ZmYsIEhbM10gPj4gMTYgJiAweGZmLCBIWzNdID4+IDggJiAweGZmLCBIWzNdICYgMHhmZiwgSFs0XSA+PiAyNCAmIDB4ZmYsIEhbNF0gPj4gMTYgJiAweGZmLCBIWzRdID4+IDggJiAweGZmLCBIWzRdICYgMHhmZl07XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBzaGExOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuZXhwb3J0cy51bnNhZmVTdHJpbmdpZnkgPSB1bnNhZmVTdHJpbmdpZnk7XG52YXIgX3ZhbGlkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cbnZhciBieXRlVG9IZXggPSBbXTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnNsaWNlKDEpKTtcbn1cbmZ1bmN0aW9uIHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIC8vXG4gIC8vIE5vdGUgdG8gZnV0dXJlLXNlbGY6IE5vLCB5b3UgY2FuJ3QgcmVtb3ZlIHRoZSBgdG9Mb3dlckNhc2UoKWAgY2FsbC5cbiAgLy8gUkVGOiBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC82NzcjaXNzdWVjb21tZW50LTE3NTczNTEzNTFcbiAgcmV0dXJuIChieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXSkudG9Mb3dlckNhc2UoKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgdmFyIHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpO1xuICAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG4gIGlmICghKDAsIF92YWxpZGF0ZS5kZWZhdWx0KSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cbiAgcmV0dXJuIHV1aWQ7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBzdHJpbmdpZnk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3JuZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcm5nLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcbnZhciBfY2xvY2tzZXE7XG5cbi8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwO1xuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkIGZvciBBUEkgZGV0YWlsc1xuZnVuY3Rpb24gdjEob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBBcnJheSgxNik7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbm9kZSA9IG9wdGlvbnMubm9kZTtcbiAgdmFyIGNsb2Nrc2VxID0gb3B0aW9ucy5jbG9ja3NlcTtcblxuICAvLyB2MSBvbmx5OiBVc2UgY2FjaGVkIGBub2RlYCBhbmQgYGNsb2Nrc2VxYCB2YWx1ZXNcbiAgaWYgKCFvcHRpb25zLl92Nikge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgbm9kZSA9IF9ub2RlSWQ7XG4gICAgfVxuICAgIGlmIChjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcTtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgY2FzZXMgd2hlcmUgd2UgbmVlZCBlbnRyb3B5LiAgV2UgZG8gdGhpcyBsYXppbHkgdG8gbWluaW1pemUgaXNzdWVzXG4gIC8vIHJlbGF0ZWQgdG8gaW5zdWZmaWNpZW50IHN5c3RlbSBlbnRyb3B5LiAgU2VlICMxODlcbiAgaWYgKG5vZGUgPT0gbnVsbCB8fCBjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgdmFyIHNlZWRCeXRlcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBfcm5nLmRlZmF1bHQpKCk7XG5cbiAgICAvLyBSYW5kb21pemUgbm9kZVxuICAgIGlmIChub2RlID09IG51bGwpIHtcbiAgICAgIG5vZGUgPSBbc2VlZEJ5dGVzWzBdLCBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XV07XG5cbiAgICAgIC8vIHYxIG9ubHk6IGNhY2hlIG5vZGUgdmFsdWUgZm9yIHJldXNlXG4gICAgICBpZiAoIV9ub2RlSWQgJiYgIW9wdGlvbnMuX3Y2KSB7XG4gICAgICAgIC8vIHBlciBSRkM0MTIyIDQuNTogU2V0IE1BQyBtdWx0aWNhc3QgYml0ICh2MSBvbmx5KVxuICAgICAgICBub2RlWzBdIHw9IDB4MDE7IC8vIFNldCBtdWx0aWNhc3QgYml0XG5cbiAgICAgICAgX25vZGVJZCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmFuZG9taXplIGNsb2Nrc2VxXG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgICBpZiAoX2Nsb2Nrc2VxID09PSB1bmRlZmluZWQgJiYgIW9wdGlvbnMuX3Y2KSB7XG4gICAgICAgIF9jbG9ja3NlcSA9IGNsb2Nrc2VxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHYxICYgdjYgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvIHRpbWUgaXNcbiAgLy8gaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuICB2YXIgbXNlY3MgPSBvcHRpb25zLm1zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1zZWNzIDogRGF0ZS5ub3coKTtcblxuICAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG4gIHZhciBuc2VjcyA9IG9wdGlvbnMubnNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubnNlY3MgOiBfbGFzdE5TZWNzICsgMTtcblxuICAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG4gIHZhciBkdCA9IG1zZWNzIC0gX2xhc3RNU2VjcyArIChuc2VjcyAtIF9sYXN0TlNlY3MpIC8gMTAwMDA7XG5cbiAgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuICBpZiAoZHQgPCAwICYmIG9wdGlvbnMuY2xvY2tzZXEgPT09IHVuZGVmaW5lZCkge1xuICAgIGNsb2Nrc2VxID0gY2xvY2tzZXEgKyAxICYgMHgzZmZmO1xuICB9XG5cbiAgLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuICBpZiAoKGR0IDwgMCB8fCBtc2VjcyA+IF9sYXN0TVNlY3MpICYmIG9wdGlvbnMubnNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIG5zZWNzID0gMDtcbiAgfVxuXG4gIC8vIFBlciA0LjIuMS4yIFRocm93IGVycm9yIGlmIHRvbyBtYW55IHV1aWRzIGFyZSByZXF1ZXN0ZWRcbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWNcIik7XG4gIH1cbiAgX2xhc3RNU2VjcyA9IG1zZWNzO1xuICBfbGFzdE5TZWNzID0gbnNlY3M7XG4gIF9jbG9ja3NlcSA9IGNsb2Nrc2VxO1xuXG4gIC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuICBtc2VjcyArPSAxMjIxOTI5MjgwMDAwMDtcblxuICAvLyBgdGltZV9sb3dgXG4gIHZhciB0bCA9ICgobXNlY3MgJiAweGZmZmZmZmYpICogMTAwMDAgKyBuc2VjcykgJSAweDEwMDAwMDAwMDtcbiAgYltpKytdID0gdGwgPj4+IDI0ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDE2ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bCAmIDB4ZmY7XG5cbiAgLy8gYHRpbWVfbWlkYFxuICB2YXIgdG1oID0gbXNlY3MgLyAweDEwMDAwMDAwMCAqIDEwMDAwICYgMHhmZmZmZmZmO1xuICBiW2krK10gPSB0bWggPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bWggJiAweGZmO1xuXG4gIC8vIGB0aW1lX2hpZ2hfYW5kX3ZlcnNpb25gXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMjQgJiAweGYgfCAweDEwOyAvLyBpbmNsdWRlIHZlcnNpb25cbiAgYltpKytdID0gdG1oID4+PiAxNiAmIDB4ZmY7XG5cbiAgLy8gYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgIChQZXIgNC4yLjIgLSBpbmNsdWRlIHZhcmlhbnQpXG4gIGJbaSsrXSA9IGNsb2Nrc2VxID4+PiA4IHwgMHg4MDtcblxuICAvLyBgY2xvY2tfc2VxX2xvd2BcbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmO1xuXG4gIC8vIGBub2RlYFxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuICByZXR1cm4gYnVmIHx8ICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkoYik7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2MTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHYxVG9WNjtcbnZhciBfcGFyc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuLyoqXG4gKiBDb252ZXJ0IGEgdjEgVVVJRCB0byBhIHY2IFVVSURcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xVaW50OEFycmF5fSB1dWlkIC0gVGhlIHYxIFVVSUQgdG8gY29udmVydCB0byB2NlxuICogQHJldHVybnMge3N0cmluZ3xVaW50OEFycmF5fSBUaGUgdjYgVVVJRCBhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBgdXVpZGAgYXJnXG4gKiAoc3RyaW5nIG9yIFVpbnQ4QXJyYXkpXG4gKi9cbmZ1bmN0aW9uIHYxVG9WNih1dWlkKSB7XG4gIHZhciB2MUJ5dGVzID0gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIF9wYXJzZS5kZWZhdWx0KSh1dWlkKSA6IHV1aWQ7XG4gIHZhciB2NkJ5dGVzID0gX3YxVG9WNih2MUJ5dGVzKTtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyA/ICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkodjZCeXRlcykgOiB2NkJ5dGVzO1xufVxuXG4vLyBEbyB0aGUgZmllbGQgdHJhbnNmb3JtYXRpb24gbmVlZGVkIGZvciB2MSAtPiB2NlxuZnVuY3Rpb24gX3YxVG9WNih2MUJ5dGVzLCByYW5kb21pemUgPSBmYWxzZSkge1xuICByZXR1cm4gVWludDhBcnJheS5vZigodjFCeXRlc1s2XSAmIDB4MGYpIDw8IDQgfCB2MUJ5dGVzWzddID4+IDQgJiAweDBmLCAodjFCeXRlc1s3XSAmIDB4MGYpIDw8IDQgfCAodjFCeXRlc1s0XSAmIDB4ZjApID4+IDQsICh2MUJ5dGVzWzRdICYgMHgwZikgPDwgNCB8ICh2MUJ5dGVzWzVdICYgMHhmMCkgPj4gNCwgKHYxQnl0ZXNbNV0gJiAweDBmKSA8PCA0IHwgKHYxQnl0ZXNbMF0gJiAweGYwKSA+PiA0LCAodjFCeXRlc1swXSAmIDB4MGYpIDw8IDQgfCAodjFCeXRlc1sxXSAmIDB4ZjApID4+IDQsICh2MUJ5dGVzWzFdICYgMHgwZikgPDwgNCB8ICh2MUJ5dGVzWzJdICYgMHhmMCkgPj4gNCwgMHg2MCB8IHYxQnl0ZXNbMl0gJiAweDBmLCB2MUJ5dGVzWzNdLCB2MUJ5dGVzWzhdLCB2MUJ5dGVzWzldLCB2MUJ5dGVzWzEwXSwgdjFCeXRlc1sxMV0sIHYxQnl0ZXNbMTJdLCB2MUJ5dGVzWzEzXSwgdjFCeXRlc1sxNF0sIHYxQnl0ZXNbMTVdKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfdiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjM1LmpzXCIpKTtcbnZhciBfbWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL21kNS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG52YXIgdjMgPSAoMCwgX3YuZGVmYXVsdCkoJ3YzJywgMHgzMCwgX21kLmRlZmF1bHQpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdjM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlVSTCA9IGV4cG9ydHMuRE5TID0gdm9pZCAwO1xuZXhwb3J0cy5kZWZhdWx0ID0gdjM1O1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG52YXIgX3BhcnNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuICBzdHIgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgdmFyIGJ5dGVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxudmFyIEROUyA9IGV4cG9ydHMuRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG52YXIgVVJMID0gZXhwb3J0cy5VUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmZ1bmN0aW9uIHYzNShuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICB2YXIgX25hbWVzcGFjZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lc3BhY2UgPSAoMCwgX3BhcnNlLmRlZmF1bHQpKG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGlmICgoKF9uYW1lc3BhY2UgPSBuYW1lc3BhY2UpID09PSBudWxsIHx8IF9uYW1lc3BhY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uYW1lc3BhY2UubGVuZ3RoKSAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgaGFzaCBvZiBuYW1lc3BhY2UgYW5kIHZhbHVlLCBQZXIgNC4zXG4gICAgLy8gRnV0dXJlOiBVc2Ugc3ByZWFkIHN5bnRheCB3aGVuIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBlLmcuIGBieXRlcyA9XG4gICAgLy8gaGFzaGZ1bmMoWy4uLm5hbWVzcGFjZSwgLi4uIHZhbHVlXSlgXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcbiAgICBpZiAoYnVmKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlc1tpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX3N0cmluZ2lmeS51bnNhZmVTdHJpbmdpZnkpKGJ5dGVzKTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uI25hbWUgaXMgbm90IHNldHRhYmxlIG9uIHNvbWUgcGxhdGZvcm1zICgjMjcwKVxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTtcbiAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gIC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX25hdGl2ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbmF0aXZlLmpzXCIpKTtcbnZhciBfcm5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ybmcuanNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBpZiAoX25hdGl2ZS5kZWZhdWx0LnJhbmRvbVVVSUQgJiYgIWJ1ZiAmJiAhb3B0aW9ucykge1xuICAgIHJldHVybiBfbmF0aXZlLmRlZmF1bHQucmFuZG9tVVVJRCgpO1xuICB9XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBfcm5nLmRlZmF1bHQpKCk7XG5cbiAgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwO1xuXG4gIC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xuICB9XG4gIHJldHVybiAoMCwgX3N0cmluZ2lmeS51bnNhZmVTdHJpbmdpZnkpKHJuZHMpO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdjQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YzNS5qc1wiKSk7XG52YXIgX3NoYSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc2hhMS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG52YXIgdjUgPSAoMCwgX3YuZGVmYXVsdCkoJ3Y1JywgMHg1MCwgX3NoYS5kZWZhdWx0KTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHY1OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdjY7XG52YXIgX3N0cmluZ2lmeSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbnZhciBfdiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjEuanNcIikpO1xudmFyIF92MVRvViA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjFUb1Y2LmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbmZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHsgcmV0dXJuIChyID0gX3RvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgeyB2YWx1ZTogdCwgZW51bWVyYWJsZTogITAsIGNvbmZpZ3VyYWJsZTogITAsIHdyaXRhYmxlOiAhMCB9KSA6IGVbcl0gPSB0LCBlOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSB0eXBlb2YgaSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIHQgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIGkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuLyoqXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7VWludDhBcnJheT19IGJ1ZlxuICogQHBhcmFtIHtudW1iZXI9fSBvZmZzZXRcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHY2KG9wdGlvbnMgPSB7fSwgYnVmLCBvZmZzZXQgPSAwKSB7XG4gIC8vIHY2IGlzIHYxIHdpdGggZGlmZmVyZW50IGZpZWxkIGxheW91dCwgc28gd2Ugc3RhcnQgd2l0aCBhIHYxIFVVSUQsIGFsYmVpdFxuICAvLyB3aXRoIHNsaWdodGx5IGRpZmZlcmVudCBiZWhhdmlvciBhcm91bmQgaG93IHRoZSBjbG9ja19zZXEgYW5kIG5vZGUgZmllbGRzXG4gIC8vIGFyZSByYW5kb21pemVkLCB3aGljaCBpcyB3aHkgd2UgY2FsbCB2MSB3aXRoIF92NjogdHJ1ZS5cbiAgdmFyIGJ5dGVzID0gKDAsIF92LmRlZmF1bHQpKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucyksIHt9LCB7XG4gICAgX3Y2OiB0cnVlXG4gIH0pLCBuZXcgVWludDhBcnJheSgxNikpO1xuXG4gIC8vIFJlb3JkZXIgdGhlIGZpZWxkcyB0byB2NiBsYXlvdXQuXG4gIGJ5dGVzID0gKDAsIF92MVRvVi5kZWZhdWx0KShieXRlcyk7XG5cbiAgLy8gUmV0dXJuIGFzIGEgYnl0ZSBhcnJheSBpZiByZXF1ZXN0ZWRcbiAgaWYgKGJ1Zikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cbiAgcmV0dXJuICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkoYnl0ZXMpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdjZUb1YxO1xudmFyIF9wYXJzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFyc2UuanNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG4vKipcbiAqIENvbnZlcnQgYSB2NiBVVUlEIHRvIGEgdjEgVVVJRFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfFVpbnQ4QXJyYXl9IHV1aWQgLSBUaGUgdjYgVVVJRCB0byBjb252ZXJ0IHRvIHY2XG4gKiBAcmV0dXJucyB7c3RyaW5nfFVpbnQ4QXJyYXl9IFRoZSB2MSBVVUlEIGFzIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGB1dWlkYCBhcmdcbiAqIChzdHJpbmcgb3IgVWludDhBcnJheSlcbiAqL1xuZnVuY3Rpb24gdjZUb1YxKHV1aWQpIHtcbiAgdmFyIHY2Qnl0ZXMgPSB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgPyAoMCwgX3BhcnNlLmRlZmF1bHQpKHV1aWQpIDogdXVpZDtcbiAgdmFyIHYxQnl0ZXMgPSBfdjZUb1YxKHY2Qnl0ZXMpO1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIF9zdHJpbmdpZnkudW5zYWZlU3RyaW5naWZ5KSh2MUJ5dGVzKSA6IHYxQnl0ZXM7XG59XG5cbi8vIERvIHRoZSBmaWVsZCB0cmFuc2Zvcm1hdGlvbiBuZWVkZWQgZm9yIHY2IC0+IHYxXG5mdW5jdGlvbiBfdjZUb1YxKHY2Qnl0ZXMpIHtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkub2YoKHY2Qnl0ZXNbM10gJiAweDBmKSA8PCA0IHwgdjZCeXRlc1s0XSA+PiA0ICYgMHgwZiwgKHY2Qnl0ZXNbNF0gJiAweDBmKSA8PCA0IHwgKHY2Qnl0ZXNbNV0gJiAweGYwKSA+PiA0LCAodjZCeXRlc1s1XSAmIDB4MGYpIDw8IDQgfCB2NkJ5dGVzWzZdICYgMHgwZiwgdjZCeXRlc1s3XSwgKHY2Qnl0ZXNbMV0gJiAweDBmKSA8PCA0IHwgKHY2Qnl0ZXNbMl0gJiAweGYwKSA+PiA0LCAodjZCeXRlc1syXSAmIDB4MGYpIDw8IDQgfCAodjZCeXRlc1szXSAmIDB4ZjApID4+IDQsIDB4MTAgfCAodjZCeXRlc1swXSAmIDB4ZjApID4+IDQsICh2NkJ5dGVzWzBdICYgMHgwZikgPDwgNCB8ICh2NkJ5dGVzWzFdICYgMHhmMCkgPj4gNCwgdjZCeXRlc1s4XSwgdjZCeXRlc1s5XSwgdjZCeXRlc1sxMF0sIHY2Qnl0ZXNbMTFdLCB2NkJ5dGVzWzEyXSwgdjZCeXRlc1sxM10sIHY2Qnl0ZXNbMTRdLCB2NkJ5dGVzWzE1XSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3JuZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcm5nLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuLyoqXG4gKiBVVUlEIFY3IC0gVW5peCBFcG9jaCB0aW1lLWJhc2VkIFVVSURcbiAqXG4gKiBUaGUgSUVURiBoYXMgcHVibGlzaGVkIFJGQzk1NjIsIGludHJvZHVjaW5nIDMgbmV3IFVVSUQgdmVyc2lvbnMgKDYsNyw4KS4gVGhpc1xuICogaW1wbGVtZW50YXRpb24gb2YgVjcgaXMgYmFzZWQgb24gdGhlIGFjY2VwdGVkLCB0aG91Z2ggbm90IHlldCBhcHByb3ZlZCxcbiAqIHJldmlzaW9ucy5cbiAqXG4gKiBSRkMgOTU2MjpodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTU2Mi5odG1sIFVuaXZlcnNhbGx5IFVuaXF1ZVxuICogSURlbnRpZmllcnMgKFVVSURzKVxuXG4gKlxuICogU2FtcGxlIFY3IHZhbHVlOlxuICogaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzk1NjIuaHRtbCNuYW1lLWV4YW1wbGUtb2YtYS11dWlkdjctdmFsdWVcbiAqXG4gKiBNb25vdG9uaWMgQml0IExheW91dDogUkZDIHJmYzk1NjIuNi4yIE1ldGhvZCAxLCBEZWRpY2F0ZWQgQ291bnRlciBCaXRzIHJlZjpcbiAqICAgICBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTU2Mi5odG1sI3NlY3Rpb24tNi4yLTUuMVxuICpcbiAqICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMyAwIDEgMiAzIDQgNSA2XG4gKiAgIDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDFcbiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXhfdHNfbXMgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAqICB8ICAgICAgICAgIHVuaXhfdHNfbXMgICAgICAgICAgIHwgIHZlciAgfCAgICAgICAgc2VxX2hpICAgICAgICAgfFxuICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gKiAgfHZhcnwgICAgICAgICAgICAgICBzZXFfbG93ICAgICAgICAgICAgICAgfCAgICAgICAgcmFuZCAgICAgICAgIHxcbiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAqXG4gKiBzZXEgaXMgYSAzMSBiaXQgc2VyaWFsaXplZCBjb3VudGVyOyBjb21wcmlzZWQgb2YgMTIgYml0IHNlcV9oaSBhbmQgMTkgYml0XG4gKiBzZXFfbG93LCBhbmQgcmFuZG9tbHkgaW5pdGlhbGl6ZWQgdXBvbiB0aW1lc3RhbXAgY2hhbmdlLiAzMSBiaXQgY291bnRlciBzaXplXG4gKiB3YXMgc2VsZWN0ZWQgYXMgYW55IGJpdHdpc2Ugb3BlcmF0aW9ucyBpbiBub2RlIGFyZSBkb25lIGFzIF9zaWduZWRfIDMyIGJpdFxuICogaW50cy4gd2UgZXhjbHVkZSB0aGUgc2lnbiBiaXQuXG4gKi9cblxudmFyIF9zZXFMb3cgPSBudWxsO1xudmFyIF9zZXFIaWdoID0gbnVsbDtcbnZhciBfbXNlY3MgPSAwO1xuZnVuY3Rpb24gdjcob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gaW5pdGlhbGl6ZSBidWZmZXIgYW5kIHBvaW50ZXJcbiAgdmFyIGkgPSBidWYgJiYgb2Zmc2V0IHx8IDA7XG4gIHZhciBiID0gYnVmIHx8IG5ldyBVaW50OEFycmF5KDE2KTtcblxuICAvLyBybmRzIGlzIFVpbnQ4QXJyYXkoMTYpIGZpbGxlZCB3aXRoIHJhbmRvbSBieXRlc1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBfcm5nLmRlZmF1bHQpKCk7XG5cbiAgLy8gbWlsbGlzZWNvbmRzIHNpbmNlIHVuaXggZXBvY2gsIDE5NzAtMDEtMDEgMDA6MDBcbiAgdmFyIG1zZWNzID0gb3B0aW9ucy5tc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tc2VjcyA6IERhdGUubm93KCk7XG5cbiAgLy8gc2VxIGlzIHVzZXIgcHJvdmlkZWQgMzEgYml0IGNvdW50ZXJcbiAgdmFyIHNlcSA9IG9wdGlvbnMuc2VxICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnNlcSA6IG51bGw7XG5cbiAgLy8gaW5pdGlhbGl6ZSBsb2NhbCBzZXEgaGlnaC9sb3cgcGFydHNcbiAgdmFyIHNlcUhpZ2ggPSBfc2VxSGlnaDtcbiAgdmFyIHNlcUxvdyA9IF9zZXFMb3c7XG5cbiAgLy8gY2hlY2sgaWYgY2xvY2sgaGFzIGFkdmFuY2VkIGFuZCB1c2VyIGhhcyBub3QgcHJvdmlkZWQgbXNlY3NcbiAgaWYgKG1zZWNzID4gX21zZWNzICYmIG9wdGlvbnMubXNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIF9tc2VjcyA9IG1zZWNzO1xuXG4gICAgLy8gdW5sZXNzIHVzZXIgcHJvdmlkZWQgc2VxLCByZXNldCBzZXEgcGFydHNcbiAgICBpZiAoc2VxICE9PSBudWxsKSB7XG4gICAgICBzZXFIaWdoID0gbnVsbDtcbiAgICAgIHNlcUxvdyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgd2UgaGF2ZSBhIHVzZXIgcHJvdmlkZWQgc2VxXG4gIGlmIChzZXEgIT09IG51bGwpIHtcbiAgICAvLyB0cmltIHByb3ZpZGVkIHNlcSB0byAzMSBiaXRzIG9mIHZhbHVlLCBhdm9pZGluZyBvdmVyZmxvd1xuICAgIGlmIChzZXEgPiAweDdmZmZmZmZmKSB7XG4gICAgICBzZXEgPSAweDdmZmZmZmZmO1xuICAgIH1cblxuICAgIC8vIHNwbGl0IHByb3ZpZGVkIHNlcSBpbnRvIGhpZ2gvbG93IHBhcnRzXG4gICAgc2VxSGlnaCA9IHNlcSA+Pj4gMTkgJiAweGZmZjtcbiAgICBzZXFMb3cgPSBzZXEgJiAweDdmZmZmO1xuICB9XG5cbiAgLy8gcmFuZG9tbHkgaW5pdGlhbGl6ZSBzZXFcbiAgaWYgKHNlcUhpZ2ggPT09IG51bGwgfHwgc2VxTG93ID09PSBudWxsKSB7XG4gICAgc2VxSGlnaCA9IHJuZHNbNl0gJiAweDdmO1xuICAgIHNlcUhpZ2ggPSBzZXFIaWdoIDw8IDggfCBybmRzWzddO1xuICAgIHNlcUxvdyA9IHJuZHNbOF0gJiAweDNmOyAvLyBwYWQgZm9yIHZhclxuICAgIHNlcUxvdyA9IHNlcUxvdyA8PCA4IHwgcm5kc1s5XTtcbiAgICBzZXFMb3cgPSBzZXFMb3cgPDwgNSB8IHJuZHNbMTBdID4+PiAzO1xuICB9XG5cbiAgLy8gaW5jcmVtZW50IHNlcSBpZiB3aXRoaW4gbXNlY3Mgd2luZG93XG4gIGlmIChtc2VjcyArIDEwMDAwID4gX21zZWNzICYmIHNlcSA9PT0gbnVsbCkge1xuICAgIGlmICgrK3NlcUxvdyA+IDB4N2ZmZmYpIHtcbiAgICAgIHNlcUxvdyA9IDA7XG4gICAgICBpZiAoKytzZXFIaWdoID4gMHhmZmYpIHtcbiAgICAgICAgc2VxSGlnaCA9IDA7XG5cbiAgICAgICAgLy8gaW5jcmVtZW50IGludGVybmFsIF9tc2Vjcy4gdGhpcyBhbGxvd3MgdXMgdG8gY29udGludWUgaW5jcmVtZW50aW5nXG4gICAgICAgIC8vIHdoaWxlIHN0YXlpbmcgbW9ub3RvbmljLiBOb3RlLCBvbmNlIHdlIGhpdCAxMGsgbWlsbGlzZWNvbmRzIGJleW9uZCBzeXN0ZW1cbiAgICAgICAgLy8gY2xvY2ssIHdlIHdpbGwgcmVzZXQgYnJlYWtpbmcgbW9ub3RvbmljaXR5IChhZnRlciAoMl4zMSkqMTAwMDAgZ2VuZXJhdGlvbnMpXG4gICAgICAgIF9tc2VjcysrO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyByZXNldHRpbmc7IHdlIGhhdmUgYWR2YW5jZWQgbW9yZSB0aGFuXG4gICAgLy8gMTBrIG1pbGxpc2Vjb25kcyBiZXlvbmQgc3lzdGVtIGNsb2NrXG4gICAgX21zZWNzID0gbXNlY3M7XG4gIH1cbiAgX3NlcUhpZ2ggPSBzZXFIaWdoO1xuICBfc2VxTG93ID0gc2VxTG93O1xuXG4gIC8vIFtieXRlcyAwLTVdIDQ4IGJpdHMgb2YgbG9jYWwgdGltZXN0YW1wXG4gIGJbaSsrXSA9IF9tc2VjcyAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMDAwMDAwMCAmIDB4ZmY7XG4gIGJbaSsrXSA9IF9tc2VjcyAvIDB4MTAwMDAwMCAmIDB4ZmY7XG4gIGJbaSsrXSA9IF9tc2VjcyAvIDB4MTAwMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMCAmIDB4ZmY7XG4gIGJbaSsrXSA9IF9tc2VjcyAmIDB4ZmY7XG5cbiAgLy8gW2J5dGUgNl0gLSBzZXQgNCBiaXRzIG9mIHZlcnNpb24gKDcpIHdpdGggZmlyc3QgNCBiaXRzIHNlcV9oaVxuICBiW2krK10gPSBzZXFIaWdoID4+PiA0ICYgMHgwZiB8IDB4NzA7XG5cbiAgLy8gW2J5dGUgN10gcmVtYWluaW5nIDggYml0cyBvZiBzZXFfaGlcbiAgYltpKytdID0gc2VxSGlnaCAmIDB4ZmY7XG5cbiAgLy8gW2J5dGUgOF0gLSB2YXJpYW50ICgyIGJpdHMpLCBmaXJzdCA2IGJpdHMgc2VxX2xvd1xuICBiW2krK10gPSBzZXFMb3cgPj4+IDEzICYgMHgzZiB8IDB4ODA7XG5cbiAgLy8gW2J5dGUgOV0gOCBiaXRzIHNlcV9sb3dcbiAgYltpKytdID0gc2VxTG93ID4+PiA1ICYgMHhmZjtcblxuICAvLyBbYnl0ZSAxMF0gcmVtYWluaW5nIDUgYml0cyBzZXFfbG93LCAzIGJpdHMgcmFuZG9tXG4gIGJbaSsrXSA9IHNlcUxvdyA8PCAzICYgMHhmZiB8IHJuZHNbMTBdICYgMHgwNztcblxuICAvLyBbYnl0ZXMgMTEtMTVdIGFsd2F5cyByYW5kb21cbiAgYltpKytdID0gcm5kc1sxMV07XG4gIGJbaSsrXSA9IHJuZHNbMTJdO1xuICBiW2krK10gPSBybmRzWzEzXTtcbiAgYltpKytdID0gcm5kc1sxNF07XG4gIGJbaSsrXSA9IHJuZHNbMTVdO1xuICByZXR1cm4gYnVmIHx8ICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkoYik7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2NzsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmVnZXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JlZ2V4LmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbmZ1bmN0aW9uIHZhbGlkYXRlKHV1aWQpIHtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyAmJiBfcmVnZXguZGVmYXVsdC50ZXN0KHV1aWQpO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdmFsaWRhdGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3ZhbGlkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCEoMCwgX3ZhbGlkYXRlLmRlZmF1bHQpKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIFVVSUQnKTtcbiAgfVxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTUpLCAxNik7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2ZXJzaW9uOyIsIi8qKlxuICogVGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gYHByZS1wdWJsaXNoLmpzYC5cbiAqIERvIG5vdCBtYW51YWxseSBlZGl0LlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBcImFyZWFcIjogdHJ1ZSxcbiAgXCJiYXNlXCI6IHRydWUsXG4gIFwiYnJcIjogdHJ1ZSxcbiAgXCJjb2xcIjogdHJ1ZSxcbiAgXCJlbWJlZFwiOiB0cnVlLFxuICBcImhyXCI6IHRydWUsXG4gIFwiaW1nXCI6IHRydWUsXG4gIFwiaW5wdXRcIjogdHJ1ZSxcbiAgXCJsaW5rXCI6IHRydWUsXG4gIFwibWV0YVwiOiB0cnVlLFxuICBcInBhcmFtXCI6IHRydWUsXG4gIFwic291cmNlXCI6IHRydWUsXG4gIFwidHJhY2tcIjogdHJ1ZSxcbiAgXCJ3YnJcIjogdHJ1ZVxufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgX19ERVZfXyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbic7XG5cbnZhciB3YXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKF9fREVWX18pIHtcbiAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIHByaW50V2FybmluZyhmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDEgPyBsZW4gLSAxIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMTsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAxXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgK1xuICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH1cblxuICB3YXJuaW5nID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArXG4gICAgICAgICAgJ21lc3NhZ2UgYXJndW1lbnQnXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgcHJpbnRXYXJuaW5nLmFwcGx5KG51bGwsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdhcm5pbmc7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3dzIGRvZXMgbm90IHdvcmsgaW4gdGhlIGJyb3dzZXIuIEJyb3dzZXIgY2xpZW50cyBtdXN0IHVzZSB0aGUgbmF0aXZlICcgK1xuICAgICAgJ1dlYlNvY2tldCBvYmplY3QnXG4gICk7XG59O1xuIiwiZnVuY3Rpb24gZShlLGksdCxvKXtmb3IoO2k+PXQmJiFlKFwiKG1pbi1yZXNvbHV0aW9uOiBcIitpL28rXCJkcHB4KVwiKS5tYXRjaGVzOylpLS07cmV0dXJuIGl9ZnVuY3Rpb24gaShpKXtpZih2b2lkIDA9PT1pJiYoaT13aW5kb3cpLCFpKXJldHVybiAxO2lmKHZvaWQgMCE9PWkuZGV2aWNlUGl4ZWxSYXRpbylyZXR1cm4gaS5kZXZpY2VQaXhlbFJhdGlvO3ZhciB0PWkuZG9jdW1lbnQuZnJhbWVzO3JldHVybiB2b2lkIDAhPT10P3ZvaWQgMCE9PXQuZGV2aWNlUGl4ZWxSYXRpbz90LmRldmljZVBpeGVsUmF0aW86dC5zY3JlZW4uZGV2aWNlWERQSS90LnNjcmVlbi5zeXN0ZW1YRFBJOnZvaWQgMCE9PWkubWF0Y2hNZWRpYT9mdW5jdGlvbihpKXtmb3IodmFyIHQ9aS5tYXRjaE1lZGlhLG89MTAsbj0uMSxyPTEsYT1vLGM9MDtjPDQ7YysrKW89KGE9MTAqZSh0LG8sbixyKSkrOSxuPWEscio9MTA7cmV0dXJuIGEvcn0oaSk6MX1mdW5jdGlvbiB0KGUsdCl7dmFyIG89KGUgaW5zdGFuY2VvZiBFbGVtZW50P2dldENvbXB1dGVkU3R5bGUoZSkuem9vbTplLnpvb20pfHwxO3JldHVybiBpKHQpKihcInN0cmluZ1wiPT10eXBlb2Ygbz9wYXJzZUZsb2F0KG8pOm8pfWV4cG9ydHt0IGFzIGVsZW1lbnRab29tTGV2ZWwsaSBhcyB6b29tTGV2ZWx9O1xuIiwiLyogKGlnbm9yZWQpICovIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS9mcm9tXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvaXMtYXJyYXlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9iaW5kXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZW50cmllc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2V2ZXJ5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmlsdGVyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmluZC1pbmRleFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2ZpbmRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9rZXlzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvbWFwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvcmVkdWNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc2xpY2VcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zb3J0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc3BsaWNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS92YWx1ZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9qc29uL3N0cmluZ2lmeVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL21hcFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL251bWJlci9pcy1pbnRlZ2VyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2Fzc2lnblwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9jcmVhdGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2VudHJpZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZnJlZXplXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2tleXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9wYXJzZS1pbnRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9wcm9taXNlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvc2V0LWludGVydmFsXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvc2V0LXRpbWVvdXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9zZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS93ZWFrLW1hcFwiKTsiLCJ2YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvZmVhdHVyZXMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZShcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiKTtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7XG4gIHJldHVybiAociA9IHRvUHJvcGVydHlLZXkocikpIGluIGUgPyBfT2JqZWN0JGRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHtcbiAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHtcbiAgICBcImRlZmF1bHRcIjogZVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF9TeW1ib2wkdG9QcmltaXRpdmUgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC90by1wcmltaXRpdmUuanNcIik7XG52YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuL3R5cGVvZi5qc1wiKVtcImRlZmF1bHRcIl07XG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbX1N5bWJvbCR0b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gdG9QcmltaXRpdmUsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCIuL3R5cGVvZi5qc1wiKVtcImRlZmF1bHRcIl07XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKFwiLi90b1ByaW1pdGl2ZS5qc1wiKTtcbmZ1bmN0aW9uIHRvUHJvcGVydHlLZXkodCkge1xuICB2YXIgaSA9IHRvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiO1xufVxubW9kdWxlLmV4cG9ydHMgPSB0b1Byb3BlcnR5S2V5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIF9TeW1ib2wgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC9pbmRleC5qc1wiKTtcbnZhciBfU3ltYm9sJGl0ZXJhdG9yID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9mZWF0dXJlcy9zeW1ib2wvaXRlcmF0b3IuanNcIik7XG5mdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiAobW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBfU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIF9TeW1ib2wkaXRlcmF0b3IgPyBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiB0eXBlb2YgbztcbiAgfSA6IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBfU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IF9TeW1ib2wgJiYgbyAhPT0gX1N5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cyksIF90eXBlb2Yobyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhYmxlL3N5bWJvbCcpO1xuXG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5mdW5jdGlvbi5tZXRhZGF0YScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmFzeW5jLWRpc3Bvc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5kaXNwb3NlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wubWV0YWRhdGEnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vc3RhYmxlL3N5bWJvbC9pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9zdGFibGUvc3ltYm9sL3RvLXByaW1pdGl2ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZyb20nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmZyb207XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmlzLWFycmF5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5pc0FycmF5O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5jb25jYXQnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnY29uY2F0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZW50cmllcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5ldmVyeScpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdldmVyeScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5maWx0ZXInKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZmlsdGVyJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXgnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZmluZEluZGV4Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbmQnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnZmluZCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdmb3JFYWNoJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmluZGV4LW9mJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2luZGV4T2YnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdrZXlzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5Lm1hcCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdtYXAnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3JlZHVjZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5zbGljZScpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdzbGljZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5zb3J0Jyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3NvcnQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3NwbGljZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3ZhbHVlcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0Z1bmN0aW9uJywgJ2JpbmQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9mdW5jdGlvbi92aXJ0dWFsL2JpbmQnKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuYmluZDtcbiAgcmV0dXJuIGl0ID09PSBGdW5jdGlvblByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihGdW5jdGlvblByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gRnVuY3Rpb25Qcm90b3R5cGUuYmluZCkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvY29uY2F0Jyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmNvbmNhdDtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuY29uY2F0KSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9ldmVyeScpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5ldmVyeTtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuZXZlcnkpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2ZpbHRlcicpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5maWx0ZXI7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmZpbHRlcikgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvZmluZC1pbmRleCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5maW5kSW5kZXg7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmZpbmRJbmRleCkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvZmluZCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5maW5kO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5maW5kKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgYXJyYXlNZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2luY2x1ZGVzJyk7XG52YXIgc3RyaW5nTWV0aG9kID0gcmVxdWlyZSgnLi4vc3RyaW5nL3ZpcnR1YWwvaW5jbHVkZXMnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xudmFyIFN0cmluZ1Byb3RvdHlwZSA9IFN0cmluZy5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5pbmNsdWRlcztcbiAgaWYgKGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuaW5jbHVkZXMpKSByZXR1cm4gYXJyYXlNZXRob2Q7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgfHwgaXQgPT09IFN0cmluZ1Byb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihTdHJpbmdQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IFN0cmluZ1Byb3RvdHlwZS5pbmNsdWRlcykpIHtcbiAgICByZXR1cm4gc3RyaW5nTWV0aG9kO1xuICB9IHJldHVybiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvaW5kZXgtb2YnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuaW5kZXhPZjtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuaW5kZXhPZikgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvbWFwJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0Lm1hcDtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUubWFwKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9yZWR1Y2UnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQucmVkdWNlO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5yZWR1Y2UpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL3NsaWNlJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LnNsaWNlO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5zbGljZSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvc29ydCcpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5zb3J0O1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5zb3J0KSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9zcGxpY2UnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuc3BsaWNlO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5zcGxpY2UpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9zdHJpbmcvdmlydHVhbC9zdGFydHMtd2l0aCcpO1xuXG52YXIgU3RyaW5nUHJvdG90eXBlID0gU3RyaW5nLnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LnN0YXJ0c1dpdGg7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N0cmluZycgfHwgaXQgPT09IFN0cmluZ1Byb3RvdHlwZVxuICAgIHx8IChpc1Byb3RvdHlwZU9mKFN0cmluZ1Byb3RvdHlwZSwgaXQpICYmIG93biA9PT0gU3RyaW5nUHJvdG90eXBlLnN0YXJ0c1dpdGgpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuZGF0ZS50by1qc29uJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHknKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWpzb24gLS0gc2FmZVxuaWYgKCFwYXRoLkpTT04pIHBhdGguSlNPTiA9IHsgc3RyaW5naWZ5OiBKU09OLnN0cmluZ2lmeSB9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICByZXR1cm4gYXBwbHkocGF0aC5KU09OLnN0cmluZ2lmeSwgbnVsbCwgYXJndW1lbnRzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hcCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5tYXAuZ3JvdXAtYnknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk1hcDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXInKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk51bWJlci5pc0ludGVnZXI7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24nKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5hc3NpZ247XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5jcmVhdGUnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxudmFyIE9iamVjdCA9IHBhdGguT2JqZWN0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKSB7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKFAsIEQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG52YXIgT2JqZWN0ID0gcGF0aC5PYmplY3Q7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYykge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpO1xufTtcblxuaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eS5zaGFtKSBkZWZpbmVQcm9wZXJ0eS5zaGFtID0gdHJ1ZTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5lbnRyaWVzO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZnJlZXplJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZnJlZXplO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbnZhciBPYmplY3QgPSBwYXRoLk9iamVjdDtcblxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSk7XG59O1xuXG5pZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5zaGFtKSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2hhbSA9IHRydWU7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5rZXlzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3Qua2V5cztcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucGFyc2UtaW50Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5wYXJzZUludDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYWdncmVnYXRlLWVycm9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYW55Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2Uud2l0aC1yZXNvbHZlcnMnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguUHJvbWlzZTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LmRpZmZlcmVuY2UudjInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LmludGVyc2VjdGlvbi52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuaXMtZGlzam9pbnQtZnJvbS52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuaXMtc3Vic2V0LW9mLnYyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnNldC5pcy1zdXBlcnNldC1vZi52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuc3ltbWV0cmljLWRpZmZlcmVuY2UudjInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LnVuaW9uLnYyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguU2V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnU3RyaW5nJywgJ2luY2x1ZGVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdTdHJpbmcnLCAnc3RhcnRzV2l0aCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5jb25jYXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaGFzLWluc3RhbmNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5pcy1jb25jYXQtc3ByZWFkYWJsZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC1hbGwnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnJlcGxhY2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuc3BlY2llcycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuc3BsaXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wudG8tc3RyaW5nLXRhZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wudW5zY29wYWJsZXMnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5yZWZsZWN0LnRvLXN0cmluZy10YWcnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLlN5bWJvbDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yJyk7XG52YXIgV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKCdpdGVyYXRvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5kYXRlLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wudG8tcHJpbWl0aXZlJyk7XG52YXIgV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mKCd0b1ByaW1pdGl2ZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLndlYWstbWFwJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5XZWFrTWFwO1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9mdWxsL29iamVjdC9kZWZpbmUtcHJvcGVydHknKTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vZnVsbC9zeW1ib2wnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vZnVsbC9zeW1ib2wvaXRlcmF0b3InKTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vZnVsbC9zeW1ib2wvdG8tcHJpbWl0aXZlJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vYWN0dWFsL29iamVjdC9kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vYWN0dWFsL3N5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXJlZ2lzdGVyZWQtc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtd2VsbC1rbm93bi1zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5jdXN0b20tbWF0Y2hlcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUnKTtcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtcmVnaXN0ZXJlZCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXdlbGwta25vd24nKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5tYXRjaGVyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wubWV0YWRhdGEta2V5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucGF0dGVybi1tYXRjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLnJlcGxhY2UtYWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2FjdHVhbC9zeW1ib2wvaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vYWN0dWFsL3N5bWJvbC90by1wcmltaXRpdmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IElzQ2FsbGFibGUoYXJndW1lbnQpIGlzIHRydWVgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkgaXMgdHJ1ZWBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcG9zc2libGUtcHJvdG90eXBlJyk7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc1Bvc3NpYmxlUHJvdG90eXBlKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArICRTdHJpbmcoYXJndW1lbnQpICsgJyBhcyBhIHByb3RvdHlwZScpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBQZXJmb3JtID8gUmVxdWlyZUludGVybmFsU2xvdChNLCBbW1NldERhdGFdXSlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ29iamVjdCcgJiYgJ3NpemUnIGluIGl0ICYmICdoYXMnIGluIGl0ICYmICdhZGQnIGluIGl0ICYmICdkZWxldGUnIGluIGl0ICYmICdrZXlzJyBpbiBpdCkgcmV0dXJuIGl0O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhpdCkgKyAnIGlzIG5vdCBhIHNldCcpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFByb3RvdHlwZSkge1xuICBpZiAoaXNQcm90b3R5cGVPZihQcm90b3R5cGUsIGl0KSkgcmV0dXJuIGl0O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcignSW5jb3JyZWN0IGludm9jYXRpb24nKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBBc3NlcnQ6IFR5cGUoYXJndW1lbnQpIGlzIE9iamVjdGBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc09iamVjdChhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJFN0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBGRjI2LSBidWc6IEFycmF5QnVmZmVycyBhcmUgbm9uLWV4dGVuc2libGUsIGJ1dCBPYmplY3QuaXNFeHRlbnNpYmxlIGRvZXMgbm90IHJlcG9ydCBpdFxudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyID09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNleHRlbnNpYmxlLCBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIGlmIChPYmplY3QuaXNFeHRlbnNpYmxlKGJ1ZmZlcikpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShidWZmZXIsICdhJywgeyB2YWx1ZTogOCB9KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGZvckVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZm9yRWFjaDtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcblxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdmb3JFYWNoJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG5tb2R1bGUuZXhwb3J0cyA9ICFTVFJJQ1RfTUVUSE9EID8gZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGZvckVhY2godGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LXByb3RvdHlwZS1mb3JlYWNoIC0tIHNhZmVcbn0gOiBbXS5mb3JFYWNoO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3InKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbnZhciAkQXJyYXkgPSBBcnJheTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICB2YXIgSVNfQ09OU1RSVUNUT1IgPSBpc0NvbnN0cnVjdG9yKHRoaXMpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIG1hcGZuID0gYXJndW1lbnRzTGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICBpZiAobWFwcGluZykgbWFwZm4gPSBiaW5kKG1hcGZuLCBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoTyk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3IsIG5leHQsIHZhbHVlO1xuICAvLyBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBpdGVyYWJsZSBvciBpdCdzIGFuIGFycmF5IHdpdGggdGhlIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2UgYSBzaW1wbGUgY2FzZVxuICBpZiAoaXRlcmF0b3JNZXRob2QgJiYgISh0aGlzID09PSAkQXJyYXkgJiYgaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkpIHtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKCkgOiBbXTtcbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKE8sIGl0ZXJhdG9yTWV0aG9kKTtcbiAgICBuZXh0ID0gaXRlcmF0b3IubmV4dDtcbiAgICBmb3IgKDshKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgcmVzdWx0ID0gSVNfQ09OU1RSVUNUT1IgPyBuZXcgdGhpcyhsZW5ndGgpIDogJEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIHZhbHVlID0gbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XTtcbiAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICAgIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgIGlmICgoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykgJiYgT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4gIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluZGV4b2ZcbiAgaW5kZXhPZjogY3JlYXRlTWV0aG9kKGZhbHNlKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xuXG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgZm9yRWFjaCwgbWFwLCBmaWx0ZXIsIHNvbWUsIGV2ZXJ5LCBmaW5kLCBmaW5kSW5kZXgsIGZpbHRlclJlamVjdCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PT0gNjtcbiAgdmFyIElTX0ZJTFRFUl9SRUpFQ1QgPSBUWVBFID09PSA3O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09PSA1IHx8IElTX0ZJTkRfSU5ERVg7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQsIHNwZWNpZmljQ3JlYXRlKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShzZWxmKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgdGhhdCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY3JlYXRlID0gc3BlY2lmaWNDcmVhdGUgfHwgYXJyYXlTcGVjaWVzQ3JlYXRlO1xuICAgIHZhciB0YXJnZXQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgfHwgSVNfRklMVEVSX1JFSkVDVCA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbHVlLCByZXN1bHQ7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHB1c2godGFyZ2V0LCB2YWx1ZSk7ICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBmYWxzZTsgICAgICAgICAgICAgLy8gZXZlcnlcbiAgICAgICAgICBjYXNlIDc6IHB1c2godGFyZ2V0LCB2YWx1ZSk7ICAgICAgLy8gZmlsdGVyUmVqZWN0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHRhcmdldDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5mb3JlYWNoXG4gIGZvckVhY2g6IGNyZWF0ZU1ldGhvZCgwKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5tYXBgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXBcbiAgbWFwOiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4gIGZpbHRlcjogY3JlYXRlTWV0aG9kKDIpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnNvbWVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb21lXG4gIHNvbWU6IGNyZWF0ZU1ldGhvZCgzKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5XG4gIGV2ZXJ5OiBjcmVhdGVNZXRob2QoNCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiAgZmluZDogY3JlYXRlTWV0aG9kKDUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRJbmRleFxuICBmaW5kSW5kZXg6IGNyZWF0ZU1ldGhvZCg2KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJSZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maWx0ZXJpbmdcbiAgZmlsdGVyUmVqZWN0OiBjcmVhdGVNZXRob2QoNylcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXY4LXZlcnNpb24nKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHtcbiAgLy8gV2UgY2FuJ3QgdXNlIHRoaXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzXG4gIC8vIGRlb3B0aW1pemF0aW9uIGFuZCBzZXJpb3VzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzdcbiAgcmV0dXJuIFY4X1ZFUlNJT04gPj0gNTEgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICB2YXIgY29uc3RydWN0b3IgPSBhcnJheS5jb25zdHJ1Y3RvciA9IHt9O1xuICAgIGNvbnN0cnVjdG9yW1NQRUNJRVNdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHsgZm9vOiAxIH07XG4gICAgfTtcbiAgICByZXR1cm4gYXJyYXlbTUVUSE9EX05BTUVdKEJvb2xlYW4pLmZvbyAhPT0gMTtcbiAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FLCBhcmd1bWVudCkge1xuICB2YXIgbWV0aG9kID0gW11bTUVUSE9EX05BTUVdO1xuICByZXR1cm4gISFtZXRob2QgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWNhbGwgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgICBtZXRob2QuY2FsbChudWxsLCBhcmd1bWVudCB8fCBmdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9LCAxKTtcbiAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG52YXIgUkVEVUNFX0VNUFRZID0gJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgcmVkdWNlLCByZWR1Y2VSaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX1JJR0hUKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgY2FsbGJhY2tmbiwgYXJndW1lbnRzTGVuZ3RoLCBtZW1vKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGF0KTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIGFDYWxsYWJsZShjYWxsYmFja2ZuKTtcbiAgICBpZiAobGVuZ3RoID09PSAwICYmIGFyZ3VtZW50c0xlbmd0aCA8IDIpIHRocm93IG5ldyAkVHlwZUVycm9yKFJFRFVDRV9FTVBUWSk7XG4gICAgdmFyIGluZGV4ID0gSVNfUklHSFQgPyBsZW5ndGggLSAxIDogMDtcbiAgICB2YXIgaSA9IElTX1JJR0hUID8gLTEgOiAxO1xuICAgIGlmIChhcmd1bWVudHNMZW5ndGggPCAyKSB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdO1xuICAgICAgICBpbmRleCArPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGluZGV4ICs9IGk7XG4gICAgICBpZiAoSVNfUklHSFQgPyBpbmRleCA8IDAgOiBsZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoUkVEVUNFX0VNUFRZKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICg7SVNfUklHSFQgPyBpbmRleCA+PSAwIDogbGVuZ3RoID4gaW5kZXg7IGluZGV4ICs9IGkpIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pO1xuICAgIH1cbiAgICByZXR1cm4gbWVtbztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZVxuICBsZWZ0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlcmlnaHRcbiAgcmlnaHQ6IGNyZWF0ZU1ldGhvZCh0cnVlKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gU2FmYXJpIDwgMTMgZG9lcyBub3QgdGhyb3cgYW4gZXJyb3IgaW4gdGhpcyBjYXNlXG52YXIgU0lMRU5UX09OX05PTl9XUklUQUJMRV9MRU5HVEhfU0VUID0gREVTQ1JJUFRPUlMgJiYgIWZ1bmN0aW9uICgpIHtcbiAgLy8gbWFrZXMgbm8gc2Vuc2Ugd2l0aG91dCBwcm9wZXIgc3RyaWN0IG1vZGUgc3VwcG9ydFxuICBpZiAodGhpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KS5sZW5ndGggPSAxO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiAgfVxufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNJTEVOVF9PTl9OT05fV1JJVEFCTEVfTEVOR1RIX1NFVCA/IGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiAgaWYgKGlzQXJyYXkoTykgJiYgIWdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCAnbGVuZ3RoJykud3JpdGFibGUpIHtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcignQ2Fubm90IHNldCByZWFkIG9ubHkgLmxlbmd0aCcpO1xuICB9IHJldHVybiBPLmxlbmd0aCA9IGxlbmd0aDtcbn0gOiBmdW5jdGlvbiAoTywgbGVuZ3RoKSB7XG4gIHJldHVybiBPLmxlbmd0aCA9IGxlbmd0aDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoW10uc2xpY2UpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFycmF5U2xpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2UnKTtcblxudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxudmFyIHNvcnQgPSBmdW5jdGlvbiAoYXJyYXksIGNvbXBhcmVmbikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGlmIChsZW5ndGggPCA4KSB7XG4gICAgLy8gaW5zZXJ0aW9uIHNvcnRcbiAgICB2YXIgaSA9IDE7XG4gICAgdmFyIGVsZW1lbnQsIGo7XG5cbiAgICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgICAgaiA9IGk7XG4gICAgICBlbGVtZW50ID0gYXJyYXlbaV07XG4gICAgICB3aGlsZSAoaiAmJiBjb21wYXJlZm4oYXJyYXlbaiAtIDFdLCBlbGVtZW50KSA+IDApIHtcbiAgICAgICAgYXJyYXlbal0gPSBhcnJheVstLWpdO1xuICAgICAgfVxuICAgICAgaWYgKGogIT09IGkrKykgYXJyYXlbal0gPSBlbGVtZW50O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBtZXJnZSBzb3J0XG4gICAgdmFyIG1pZGRsZSA9IGZsb29yKGxlbmd0aCAvIDIpO1xuICAgIHZhciBsZWZ0ID0gc29ydChhcnJheVNsaWNlKGFycmF5LCAwLCBtaWRkbGUpLCBjb21wYXJlZm4pO1xuICAgIHZhciByaWdodCA9IHNvcnQoYXJyYXlTbGljZShhcnJheSwgbWlkZGxlKSwgY29tcGFyZWZuKTtcbiAgICB2YXIgbGxlbmd0aCA9IGxlZnQubGVuZ3RoO1xuICAgIHZhciBybGVuZ3RoID0gcmlnaHQubGVuZ3RoO1xuICAgIHZhciBsaW5kZXggPSAwO1xuICAgIHZhciByaW5kZXggPSAwO1xuXG4gICAgd2hpbGUgKGxpbmRleCA8IGxsZW5ndGggfHwgcmluZGV4IDwgcmxlbmd0aCkge1xuICAgICAgYXJyYXlbbGluZGV4ICsgcmluZGV4XSA9IChsaW5kZXggPCBsbGVuZ3RoICYmIHJpbmRleCA8IHJsZW5ndGgpXG4gICAgICAgID8gY29tcGFyZWZuKGxlZnRbbGluZGV4XSwgcmlnaHRbcmluZGV4XSkgPD0gMCA/IGxlZnRbbGluZGV4KytdIDogcmlnaHRbcmluZGV4KytdXG4gICAgICAgIDogbGluZGV4IDwgbGxlbmd0aCA/IGxlZnRbbGluZGV4KytdIDogcmlnaHRbcmluZGV4KytdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5Jyk7XG52YXIgaXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvcicpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyICRBcnJheSA9IEFycmF5O1xuXG4vLyBhIHBhcnQgb2YgYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHtcbiAgICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmIChpc0NvbnN0cnVjdG9yKEMpICYmIChDID09PSAkQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGVsc2UgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gQyA9PT0gdW5kZWZpbmVkID8gJEFycmF5IDogQztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYXJyYXlTcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG4vLyBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5LCBsZW5ndGgpIHtcbiAgcmV0dXJuIG5ldyAoYXJyYXlTcGVjaWVzQ29uc3RydWN0b3Iob3JpZ2luYWxBcnJheSkpKGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIG51bUFyZ3MpIHtcbiAgcmV0dXJuIG51bUFyZ3MgPT09IDEgPyBmdW5jdGlvbiAob2JqZWN0LCBhcmcpIHtcbiAgICByZXR1cm4gb2JqZWN0W21ldGhvZE5hbWVdKGFyZyk7XG4gIH0gOiBmdW5jdGlvbiAob2JqZWN0LCBhcmcxLCBhcmcyKSB7XG4gICAgcmV0dXJuIG9iamVjdFttZXRob2ROYW1lXShhcmcxLCBhcmcyKTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIGNhbGxlZCA9IDA7XG4gIHZhciBpdGVyYXRvcldpdGhSZXR1cm4gPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHsgZG9uZTogISFjYWxsZWQrKyB9O1xuICAgIH0sXG4gICAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHtcbiAgICAgIFNBRkVfQ0xPU0lORyA9IHRydWU7XG4gICAgfVxuICB9O1xuICBpdGVyYXRvcldpdGhSZXR1cm5bSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktZnJvbSwgbm8tdGhyb3ctbGl0ZXJhbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICBBcnJheS5mcm9tKGl0ZXJhdG9yV2l0aFJldHVybiwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgU0tJUF9DTE9TSU5HKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFTS0lQX0NMT1NJTkcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikgeyByZXR1cm4gZmFsc2U7IH0gLy8gd29ya2Fyb3VuZCBvZiBvbGQgV2ViS2l0ICsgYGV2YWxgIGJ1Z1xuICB2YXIgSVRFUkFUSU9OX1NVUFBPUlQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgb2JqZWN0W0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiBJVEVSQVRJT05fU1VQUE9SVCA9IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4ZWMob2JqZWN0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gSVRFUkFUSU9OX1NVUFBPUlQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyh7fS50b1N0cmluZyk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBzdHJpbmdTbGljZSh0b1N0cmluZyhpdCksIDgsIC0xKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBjbGFzc29mUmF3ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcblxuLy8gZ2V0dGluZyB0YWcgZnJvbSBFUzYrIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYFxubW9kdWxlLmV4cG9ydHMgPSBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPyBjbGFzc29mUmF3IDogZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCB0YWcsIHJlc3VsdDtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gJE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09PSAnT2JqZWN0JyAmJiBpc0NhbGxhYmxlKE8uY2FsbGVlKSA/ICdBcmd1bWVudHMnIDogcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3InKTtcbnZhciBkZWZpbmVCdWlsdElucyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW5zJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUnKTtcbnZhciBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYXN0S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJykuZmFzdEtleTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIENvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgUHJvdG90eXBlKTtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBpbmRleDogY3JlYXRlKG51bGwpLFxuICAgICAgICBmaXJzdDogdW5kZWZpbmVkLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWQsXG4gICAgICAgIHNpemU6IDBcbiAgICAgIH0pO1xuICAgICAgaWYgKCFERVNDUklQVE9SUykgdGhhdC5zaXplID0gMDtcbiAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoaXRlcmFibGUpKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgeyB0aGF0OiB0aGF0LCBBU19FTlRSSUVTOiBJU19NQVAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgUHJvdG90eXBlID0gQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4gICAgdmFyIGdldEludGVybmFsU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuXG4gICAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgIHZhciBwcmV2aW91cywgaW5kZXg7XG4gICAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBlbnRyeS52YWx1ZSA9IHZhbHVlO1xuICAgICAgLy8gY3JlYXRlIG5ldyBlbnRyeVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUubGFzdCA9IGVudHJ5ID0ge1xuICAgICAgICAgIGluZGV4OiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSxcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzID0gc3RhdGUubGFzdCxcbiAgICAgICAgICBuZXh0OiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVtb3ZlZDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFzdGF0ZS5maXJzdCkgc3RhdGUuZmlyc3QgPSBlbnRyeTtcbiAgICAgICAgaWYgKHByZXZpb3VzKSBwcmV2aW91cy5uZXh0ID0gZW50cnk7XG4gICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZSsrO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSsrO1xuICAgICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHN0YXRlLmluZGV4W2luZGV4XSA9IGVudHJ5O1xuICAgICAgfSByZXR1cm4gdGhhdDtcbiAgICB9O1xuXG4gICAgdmFyIGdldEVudHJ5ID0gZnVuY3Rpb24gKHRoYXQsIGtleSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIC8vIGZhc3QgY2FzZVxuICAgICAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpO1xuICAgICAgdmFyIGVudHJ5O1xuICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiBzdGF0ZS5pbmRleFtpbmRleF07XG4gICAgICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgICAgIGZvciAoZW50cnkgPSBzdGF0ZS5maXJzdDsgZW50cnk7IGVudHJ5ID0gZW50cnkubmV4dCkge1xuICAgICAgICBpZiAoZW50cnkua2V5ID09PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZGVmaW5lQnVpbHRJbnMoUHJvdG90eXBlLCB7XG4gICAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS5jbGVhcigpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuY2xlYXJcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5jbGVhclxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmZpcnN0O1xuICAgICAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucHJldmlvdXMpIGVudHJ5LnByZXZpb3VzID0gZW50cnkucHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZmlyc3QgPSBzdGF0ZS5sYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBzdGF0ZS5pbmRleCA9IGNyZWF0ZShudWxsKTtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplID0gMDtcbiAgICAgICAgZWxzZSB0aGF0LnNpemUgPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmRlbGV0ZShrZXkpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkubmV4dDtcbiAgICAgICAgICB2YXIgcHJldiA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5pbmRleFtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHByZXYpIHByZXYubmV4dCA9IG5leHQ7XG4gICAgICAgICAgaWYgKG5leHQpIG5leHQucHJldmlvdXMgPSBwcmV2O1xuICAgICAgICAgIGlmIChzdGF0ZS5maXJzdCA9PT0gZW50cnkpIHN0YXRlLmZpcnN0ID0gbmV4dDtcbiAgICAgICAgICBpZiAoc3RhdGUubGFzdCA9PT0gZW50cnkpIHN0YXRlLmxhc3QgPSBwcmV2O1xuICAgICAgICAgIGlmIChERVNDUklQVE9SUykgc3RhdGUuc2l6ZS0tO1xuICAgICAgICAgIGVsc2UgdGhhdC5zaXplLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmZvcmVhY2hcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5mb3JlYWNoXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuZmlyc3QpIHtcbiAgICAgICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXR9LnByb3RvdHlwZS5oYXMoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmhhc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmhhc1xuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBkZWZpbmVCdWlsdElucyhQcm90b3R5cGUsIElTX01BUCA/IHtcbiAgICAgIC8vIGBNYXAucHJvdG90eXBlLmdldChrZXkpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5nZXRcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudmFsdWU7XG4gICAgICB9LFxuICAgICAgLy8gYE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5zZXRcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIC8vIGBTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmFkZFxuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zaXplO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCkge1xuICAgIHZhciBJVEVSQVRPUl9OQU1FID0gQ09OU1RSVUNUT1JfTkFNRSArICcgSXRlcmF0b3InO1xuICAgIHZhciBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgdmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoSVRFUkFUT1JfTkFNRSk7XG4gICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUueyBrZXlzLCB2YWx1ZXMsIGVudHJpZXMsIEBAaXRlcmF0b3IgfSgpYCBtZXRob2RzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmVudHJpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUua2V5c1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS52YWx1ZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUtQEBpdGVyYXRvclxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5lbnRyaWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmtleXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUudmFsdWVzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLUBAaXRlcmF0b3JcbiAgICBkZWZpbmVJdGVyYXRvcihDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgICAgdHlwZTogSVRFUkFUT1JfTkFNRSxcbiAgICAgICAgdGFyZ2V0OiBpdGVyYXRlZCxcbiAgICAgICAgc3RhdGU6IGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlKGl0ZXJhdGVkKSxcbiAgICAgICAga2luZDoga2luZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUodGhpcyk7XG4gICAgICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gICAgICB2YXIgZW50cnkgPSBzdGF0ZS5sYXN0O1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucmVtb3ZlZCkgZW50cnkgPSBlbnRyeS5wcmV2aW91cztcbiAgICAgIC8vIGdldCBuZXh0IGVudHJ5XG4gICAgICBpZiAoIXN0YXRlLnRhcmdldCB8fCAhKHN0YXRlLmxhc3QgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubmV4dCA6IHN0YXRlLnN0YXRlLmZpcnN0KSkge1xuICAgICAgICAvLyBvciBmaW5pc2ggdGhlIGl0ZXJhdGlvblxuICAgICAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PT0gJ2tleXMnKSByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdChlbnRyeS5rZXksIGZhbHNlKTtcbiAgICAgIGlmIChraW5kID09PSAndmFsdWVzJykgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QoZW50cnkudmFsdWUsIGZhbHNlKTtcbiAgICAgIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KFtlbnRyeS5rZXksIGVudHJ5LnZhbHVlXSwgZmFsc2UpO1xuICAgIH0sIElTX01BUCA/ICdlbnRyaWVzJyA6ICd2YWx1ZXMnLCAhSVNfTUFQLCB0cnVlKTtcblxuICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlW0BAc3BlY2llc11gIGFjY2Vzc29yc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LW1hcC1AQHNwZWNpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1zZXQtQEBzcGVjaWVzXG4gICAgc2V0U3BlY2llcyhDT05TVFJVQ1RPUl9OQU1FKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBkZWZpbmVCdWlsdElucyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW5zJyk7XG52YXIgZ2V0V2Vha0RhdGEgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5nZXRXZWFrRGF0YTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBBcnJheUl0ZXJhdGlvbk1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7XG52YXIgZmluZCA9IEFycmF5SXRlcmF0aW9uTW9kdWxlLmZpbmQ7XG52YXIgZmluZEluZGV4ID0gQXJyYXlJdGVyYXRpb25Nb2R1bGUuZmluZEluZGV4O1xudmFyIHNwbGljZSA9IHVuY3VycnlUaGlzKFtdLnNwbGljZSk7XG52YXIgaWQgPSAwO1xuXG4vLyBmYWxsYmFjayBmb3IgdW5jYXVnaHQgZnJvemVuIGtleXNcbnZhciB1bmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5mcm96ZW4gfHwgKHN0YXRlLmZyb3plbiA9IG5ldyBVbmNhdWdodEZyb3plblN0b3JlKCkpO1xufTtcblxudmFyIFVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW50cmllcyA9IFtdO1xufTtcblxudmFyIGZpbmRVbmNhdWdodEZyb3plbiA9IGZ1bmN0aW9uIChzdG9yZSwga2V5KSB7XG4gIHJldHVybiBmaW5kKHN0b3JlLmVudHJpZXMsIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICB9KTtcbn07XG5cblVuY2F1Z2h0RnJvemVuU3RvcmUucHJvdG90eXBlID0ge1xuICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgICBpZiAoZW50cnkpIHJldHVybiBlbnRyeVsxXTtcbiAgfSxcbiAgaGFzOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuICEhZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZW50cnkgPSBmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgICBpZiAoZW50cnkpIGVudHJ5WzFdID0gdmFsdWU7XG4gICAgZWxzZSB0aGlzLmVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9LFxuICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBpbmRleCA9IGZpbmRJbmRleCh0aGlzLmVudHJpZXMsIGZ1bmN0aW9uIChpdCkge1xuICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gICAgfSk7XG4gICAgaWYgKH5pbmRleCkgc3BsaWNlKHRoaXMuZW50cmllcywgaW5kZXgsIDEpO1xuICAgIHJldHVybiAhIX5pbmRleDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIFByb3RvdHlwZSk7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAgICAgaWQ6IGlkKyssXG4gICAgICAgIGZyb3plbjogdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoaXRlcmFibGUpKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgeyB0aGF0OiB0aGF0LCBBU19FTlRSSUVTOiBJU19NQVAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgUHJvdG90eXBlID0gQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4gICAgdmFyIGdldEludGVybmFsU3RhdGUgPSBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yKENPTlNUUlVDVE9SX05BTUUpO1xuXG4gICAgdmFyIGRlZmluZSA9IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShhbk9iamVjdChrZXkpLCB0cnVlKTtcbiAgICAgIGlmIChkYXRhID09PSB0cnVlKSB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICBlbHNlIGRhdGFbc3RhdGUuaWRdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhhdDtcbiAgICB9O1xuXG4gICAgZGVmaW5lQnVpbHRJbnMoUHJvdG90eXBlLCB7XG4gICAgICAvLyBgeyBXZWFrTWFwLCBXZWFrU2V0IH0ucHJvdG90eXBlLmRlbGV0ZShrZXkpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWttYXAucHJvdG90eXBlLmRlbGV0ZVxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrc2V0LnByb3RvdHlwZS5kZWxldGVcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmIGhhc093bihkYXRhLCBzdGF0ZS5pZCkgJiYgZGVsZXRlIGRhdGFbc3RhdGUuaWRdO1xuICAgICAgfSxcbiAgICAgIC8vIGB7IFdlYWtNYXAsIFdlYWtTZXQgfS5wcm90b3R5cGUuaGFzKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC5wcm90b3R5cGUuaGFzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWtzZXQucHJvdG90eXBlLmhhc1xuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuaGFzKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmIGhhc093bihkYXRhLCBzdGF0ZS5pZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBkZWZpbmVCdWlsdElucyhQcm90b3R5cGUsIElTX01BUCA/IHtcbiAgICAgIC8vIGBXZWFrTWFwLnByb3RvdHlwZS5nZXQoa2V5KWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWttYXAucHJvdG90eXBlLmdldFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmIChpc09iamVjdChrZXkpKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrRGF0YShrZXkpO1xuICAgICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuZ2V0KGtleSk7XG4gICAgICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhW3N0YXRlLmlkXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGBXZWFrTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLnByb3RvdHlwZS5zZXRcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IDoge1xuICAgICAgLy8gYFdlYWtTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrc2V0LnByb3RvdHlwZS5hZGRcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZvckVhY2g7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgaW50ZXJuYWxTdGF0ZUdldHRlckZvciA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FLCB3cmFwcGVyLCBjb21tb24pIHtcbiAgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xO1xuICB2YXIgSVNfV0VBSyA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignV2VhaycpICE9PSAtMTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsVGhpc1tDT05TVFJVQ1RPUl9OQU1FXTtcbiAgdmFyIE5hdGl2ZVByb3RvdHlwZSA9IE5hdGl2ZUNvbnN0cnVjdG9yICYmIE5hdGl2ZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgdmFyIGV4cG9ydGVkID0ge307XG4gIHZhciBDb25zdHJ1Y3RvcjtcblxuICBpZiAoIURFU0NSSVBUT1JTIHx8ICFpc0NhbGxhYmxlKE5hdGl2ZUNvbnN0cnVjdG9yKVxuICAgIHx8ICEoSVNfV0VBSyB8fCBOYXRpdmVQcm90b3R5cGUuZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeyBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKS5lbnRyaWVzKCkubmV4dCgpOyB9KSlcbiAgKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDb25zdHJ1Y3RvciA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKTtcbiAgICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLmVuYWJsZSgpO1xuICB9IGVsc2Uge1xuICAgIENvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAodGFyZ2V0LCBpdGVyYWJsZSkge1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZShhbkluc3RhbmNlKHRhcmdldCwgUHJvdG90eXBlKSwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBjb2xsZWN0aW9uOiBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKVxuICAgICAgfSk7XG4gICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0ZXJhYmxlKSkgaXRlcmF0ZShpdGVyYWJsZSwgdGFyZ2V0W0FEREVSXSwgeyB0aGF0OiB0YXJnZXQsIEFTX0VOVFJJRVM6IElTX01BUCB9KTtcbiAgICB9KTtcblxuICAgIHZhciBQcm90b3R5cGUgPSBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICBmb3JFYWNoKFsnYWRkJywgJ2NsZWFyJywgJ2RlbGV0ZScsICdmb3JFYWNoJywgJ2dldCcsICdoYXMnLCAnc2V0JywgJ2tleXMnLCAndmFsdWVzJywgJ2VudHJpZXMnXSwgZnVuY3Rpb24gKEtFWSkge1xuICAgICAgdmFyIElTX0FEREVSID0gS0VZID09PSAnYWRkJyB8fCBLRVkgPT09ICdzZXQnO1xuICAgICAgaWYgKEtFWSBpbiBOYXRpdmVQcm90b3R5cGUgJiYgIShJU19XRUFLICYmIEtFWSA9PT0gJ2NsZWFyJykpIHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KFByb3RvdHlwZSwgS0VZLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHZhciBjb2xsZWN0aW9uID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5jb2xsZWN0aW9uO1xuICAgICAgICAgIGlmICghSVNfQURERVIgJiYgSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkpIHJldHVybiBLRVkgPT09ICdnZXQnID8gdW5kZWZpbmVkIDogZmFsc2U7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGNvbGxlY3Rpb25bS0VZXShhID09PSAwID8gMCA6IGEsIGIpO1xuICAgICAgICAgIHJldHVybiBJU19BRERFUiA/IHRoaXMgOiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgSVNfV0VBSyB8fCBkZWZpbmVQcm9wZXJ0eShQcm90b3R5cGUsICdzaXplJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLmNvbGxlY3Rpb24uc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgZXhwb3J0ZWRbQ09OU1RSVUNUT1JfTkFNRV0gPSBDb25zdHJ1Y3RvcjtcbiAgJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIGV4cG9ydGVkKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIG93bktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb3duLWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UsIGV4Y2VwdGlvbnMpIHtcbiAgdmFyIGtleXMgPSBvd25LZXlzKHNvdXJjZSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgaWYgKCFoYXNPd24odGFyZ2V0LCBrZXkpICYmICEoZXhjZXB0aW9ucyAmJiBoYXNPd24oZXhjZXB0aW9ucywga2V5KSkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICB9XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUpIHtcbiAgdmFyIHJlZ2V4cCA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgICB9IGNhdGNoIChlcnJvcjIpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiBmYWxzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gYENyZWF0ZUl0ZXJSZXN1bHRPYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVpdGVycmVzdWx0b2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSwgZG9uZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6IGRvbmUgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W2tleV0gPSB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBwYWRTdGFydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctcGFkJykuc3RhcnQ7XG5cbnZhciAkUmFuZ2VFcnJvciA9IFJhbmdlRXJyb3I7XG52YXIgJGlzRmluaXRlID0gaXNGaW5pdGU7XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgRGF0ZVByb3RvdHlwZSA9IERhdGUucHJvdG90eXBlO1xudmFyIG5hdGl2ZURhdGVUb0lTT1N0cmluZyA9IERhdGVQcm90b3R5cGUudG9JU09TdHJpbmc7XG52YXIgdGhpc1RpbWVWYWx1ZSA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VGltZSk7XG52YXIgZ2V0VVRDRGF0ZSA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VVRDRGF0ZSk7XG52YXIgZ2V0VVRDRnVsbFllYXIgPSB1bmN1cnJ5VGhpcyhEYXRlUHJvdG90eXBlLmdldFVUQ0Z1bGxZZWFyKTtcbnZhciBnZXRVVENIb3VycyA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VVRDSG91cnMpO1xudmFyIGdldFVUQ01pbGxpc2Vjb25kcyA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VVRDTWlsbGlzZWNvbmRzKTtcbnZhciBnZXRVVENNaW51dGVzID0gdW5jdXJyeVRoaXMoRGF0ZVByb3RvdHlwZS5nZXRVVENNaW51dGVzKTtcbnZhciBnZXRVVENNb250aCA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VVRDTW9udGgpO1xudmFyIGdldFVUQ1NlY29uZHMgPSB1bmN1cnJ5VGhpcyhEYXRlUHJvdG90eXBlLmdldFVUQ1NlY29uZHMpO1xuXG4vLyBgRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1kYXRlLnByb3RvdHlwZS50b2lzb3N0cmluZ1xuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBmYWlscyBoZXJlOlxubW9kdWxlLmV4cG9ydHMgPSAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmF0aXZlRGF0ZVRvSVNPU3RyaW5nLmNhbGwobmV3IERhdGUoLTVlMTMgLSAxKSkgIT09ICcwMzg1LTA3LTI1VDA3OjA2OjM5Ljk5OVonO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgbmF0aXZlRGF0ZVRvSVNPU3RyaW5nLmNhbGwobmV3IERhdGUoTmFOKSk7XG59KSkgPyBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHtcbiAgaWYgKCEkaXNGaW5pdGUodGhpc1RpbWVWYWx1ZSh0aGlzKSkpIHRocm93IG5ldyAkUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XG4gIHZhciBkYXRlID0gdGhpcztcbiAgdmFyIHllYXIgPSBnZXRVVENGdWxsWWVhcihkYXRlKTtcbiAgdmFyIG1pbGxpc2Vjb25kcyA9IGdldFVUQ01pbGxpc2Vjb25kcyhkYXRlKTtcbiAgdmFyIHNpZ24gPSB5ZWFyIDwgMCA/ICctJyA6IHllYXIgPiA5OTk5ID8gJysnIDogJyc7XG4gIHJldHVybiBzaWduICsgcGFkU3RhcnQoYWJzKHllYXIpLCBzaWduID8gNiA6IDQsIDApICtcbiAgICAnLScgKyBwYWRTdGFydChnZXRVVENNb250aChkYXRlKSArIDEsIDIsIDApICtcbiAgICAnLScgKyBwYWRTdGFydChnZXRVVENEYXRlKGRhdGUpLCAyLCAwKSArXG4gICAgJ1QnICsgcGFkU3RhcnQoZ2V0VVRDSG91cnMoZGF0ZSksIDIsIDApICtcbiAgICAnOicgKyBwYWRTdGFydChnZXRVVENNaW51dGVzKGRhdGUpLCAyLCAwKSArXG4gICAgJzonICsgcGFkU3RhcnQoZ2V0VVRDU2Vjb25kcyhkYXRlKSwgMiwgMCkgK1xuICAgICcuJyArIHBhZFN0YXJ0KG1pbGxpc2Vjb25kcywgMywgMCkgK1xuICAgICdaJztcbn0gOiBuYXRpdmVEYXRlVG9JU09TdHJpbmc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5LmYodGFyZ2V0LCBuYW1lLCBkZXNjcmlwdG9yKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtZXJhYmxlKSB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgdmFsdWUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy51bnNhZmUgJiYgdGFyZ2V0W2tleV0pIHRhcmdldFtrZXldID0gc3JjW2tleV07XG4gICAgZWxzZSBkZWZpbmVCdWlsdEluKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIH0gcmV0dXJuIHRhcmdldDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICB0cnkge1xuICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIGtleSwgeyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsVGhpc1trZXldID0gdmFsdWU7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBQKSB7XG4gIGlmICghZGVsZXRlIE9bUF0pIHRocm93IG5ldyAkVHlwZUVycm9yKCdDYW5ub3QgZGVsZXRlIHByb3BlcnR5ICcgKyB0cnlUb1N0cmluZyhQKSArICcgb2YgJyArIHRyeVRvU3RyaW5nKE8pKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPT0gNztcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID4gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgJFR5cGVFcnJvcignTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBpdGVyYWJsZSBET00gY29sbGVjdGlvbnNcbi8vIGZsYWcgLSBgaXRlcmFibGVgIGludGVyZmFjZSAtICdlbnRyaWVzJywgJ2tleXMnLCAndmFsdWVzJywgJ2ZvckVhY2gnIG1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0ge1xuICBDU1NSdWxlTGlzdDogMCxcbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogMCxcbiAgQ1NTVmFsdWVMaXN0OiAwLFxuICBDbGllbnRSZWN0TGlzdDogMCxcbiAgRE9NUmVjdExpc3Q6IDAsXG4gIERPTVN0cmluZ0xpc3Q6IDAsXG4gIERPTVRva2VuTGlzdDogMSxcbiAgRGF0YVRyYW5zZmVySXRlbUxpc3Q6IDAsXG4gIEZpbGVMaXN0OiAwLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogMCxcbiAgSFRNTENvbGxlY3Rpb246IDAsXG4gIEhUTUxGb3JtRWxlbWVudDogMCxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsXG4gIE1lZGlhTGlzdDogMCxcbiAgTWltZVR5cGVBcnJheTogMCxcbiAgTmFtZWROb2RlTWFwOiAwLFxuICBOb2RlTGlzdDogMSxcbiAgUGFpbnRSZXF1ZXN0TGlzdDogMCxcbiAgUGx1Z2luOiAwLFxuICBQbHVnaW5BcnJheTogMCxcbiAgU1ZHTGVuZ3RoTGlzdDogMCxcbiAgU1ZHTnVtYmVyTGlzdDogMCxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IDAsXG4gIFNWR1BvaW50TGlzdDogMCxcbiAgU1ZHU3RyaW5nTGlzdDogMCxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogMCxcbiAgU291cmNlQnVmZmVyTGlzdDogMCxcbiAgU3R5bGVTaGVldExpc3Q6IDAsXG4gIFRleHRUcmFja0N1ZUxpc3Q6IDAsXG4gIFRleHRUcmFja0xpc3Q6IDAsXG4gIFRvdWNoTGlzdDogMFxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIElFOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSBbXG4gICdjb25zdHJ1Y3RvcicsXG4gICdoYXNPd25Qcm9wZXJ0eScsXG4gICdpc1Byb3RvdHlwZU9mJyxcbiAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgJ3RvU3RyaW5nJyxcbiAgJ3ZhbHVlT2YnXG5dO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50Jyk7XG5cbnZhciBmaXJlZm94ID0gdXNlckFnZW50Lm1hdGNoKC9maXJlZm94XFwvKFxcZCspL2kpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICEhZmlyZWZveCAmJiArZmlyZWZveFsxXTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBVQSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gL01TSUV8VHJpZGVudC8udGVzdChVQSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvaXBhZHxpcGhvbmV8aXBvZC9pLnRlc3QodXNlckFnZW50KSAmJiB0eXBlb2YgUGViYmxlICE9ICd1bmRlZmluZWQnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWRvcy9uby12dWxuZXJhYmxlIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gLyg/OmlwYWR8aXBob25lfGlwb2QpLiphcHBsZXdlYmtpdC9pLnRlc3QodXNlckFnZW50KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBFTlZJUk9OTUVOVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVOVklST05NRU5UID09PSAnTk9ERSc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvd2ViMHMoPyEuKmNocm9tZSkvaS50ZXN0KHVzZXJBZ2VudCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xuXG52YXIgbmF2aWdhdG9yID0gZ2xvYmFsVGhpcy5uYXZpZ2F0b3I7XG52YXIgdXNlckFnZW50ID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbm1vZHVsZS5leHBvcnRzID0gdXNlckFnZW50ID8gU3RyaW5nKHVzZXJBZ2VudCkgOiAnJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcblxudmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG52YXIgRGVubyA9IGdsb2JhbFRoaXMuRGVubztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucyB8fCBEZW5vICYmIERlbm8udmVyc2lvbjtcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICAvLyBpbiBvbGQgQ2hyb21lLCB2ZXJzaW9ucyBvZiBWOCBpc24ndCBWOCA9IENocm9tZSAvIDEwXG4gIC8vIGJ1dCB0aGVpciBjb3JyZWN0IHZlcnNpb25zIGFyZSBub3QgaW50ZXJlc3RpbmcgZm9yIHVzXG4gIHZlcnNpb24gPSBtYXRjaFswXSA+IDAgJiYgbWF0Y2hbMF0gPCA0ID8gMSA6ICsobWF0Y2hbMF0gKyBtYXRjaFsxXSk7XG59XG5cbi8vIEJyb3dzZXJGUyBOb2RlSlMgYHByb2Nlc3NgIHBvbHlmaWxsIGluY29ycmVjdGx5IHNldCBgLnY4YCB0byBgMC4wYFxuLy8gc28gY2hlY2sgYHVzZXJBZ2VudGAgZXZlbiBpZiBgLnY4YCBleGlzdHMsIGJ1dCAwXG5pZiAoIXZlcnNpb24gJiYgdXNlckFnZW50KSB7XG4gIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyk7XG4gIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHtcbiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gK21hdGNoWzFdO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdXNlci1hZ2VudCcpO1xuXG52YXIgd2Via2l0ID0gdXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFxcLyhcXGQrKVxcLi8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICEhd2Via2l0ICYmICt3ZWJraXRbMV07XG4iLCIndXNlIHN0cmljdCc7XG4vKiBnbG9iYWwgQnVuLCBEZW5vIC0tIGRldGVjdGlvbiAqL1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdXNlci1hZ2VudCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyIHVzZXJBZ2VudFN0YXJ0c1dpdGggPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHJldHVybiB1c2VyQWdlbnQuc2xpY2UoMCwgc3RyaW5nLmxlbmd0aCkgPT09IHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHtcbiAgaWYgKHVzZXJBZ2VudFN0YXJ0c1dpdGgoJ0J1bi8nKSkgcmV0dXJuICdCVU4nO1xuICBpZiAodXNlckFnZW50U3RhcnRzV2l0aCgnQ2xvdWRmbGFyZS1Xb3JrZXJzJykpIHJldHVybiAnQ0xPVURGTEFSRSc7XG4gIGlmICh1c2VyQWdlbnRTdGFydHNXaXRoKCdEZW5vLycpKSByZXR1cm4gJ0RFTk8nO1xuICBpZiAodXNlckFnZW50U3RhcnRzV2l0aCgnTm9kZS5qcy8nKSkgcmV0dXJuICdOT0RFJztcbiAgaWYgKGdsb2JhbFRoaXMuQnVuICYmIHR5cGVvZiBCdW4udmVyc2lvbiA9PSAnc3RyaW5nJykgcmV0dXJuICdCVU4nO1xuICBpZiAoZ2xvYmFsVGhpcy5EZW5vICYmIHR5cGVvZiBEZW5vLnZlcnNpb24gPT0gJ29iamVjdCcpIHJldHVybiAnREVOTyc7XG4gIGlmIChjbGFzc29mKGdsb2JhbFRoaXMucHJvY2VzcykgPT09ICdwcm9jZXNzJykgcmV0dXJuICdOT0RFJztcbiAgaWYgKGdsb2JhbFRoaXMud2luZG93ICYmIGdsb2JhbFRoaXMuZG9jdW1lbnQpIHJldHVybiAnQlJPV1NFUic7XG4gIHJldHVybiAnUkVTVCc7XG59KSgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG52YXIgJEVycm9yID0gRXJyb3I7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xuXG52YXIgVEVTVCA9IChmdW5jdGlvbiAoYXJnKSB7IHJldHVybiBTdHJpbmcobmV3ICRFcnJvcihhcmcpLnN0YWNrKTsgfSkoJ3p4Y2FzZCcpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZG9zL25vLXZ1bG5lcmFibGUgLS0gc2FmZVxudmFyIFY4X09SX0NIQUtSQV9TVEFDS19FTlRSWSA9IC9cXG5cXHMqYXQgW146XSo6W15cXG5dKi87XG52YXIgSVNfVjhfT1JfQ0hBS1JBX1NUQUNLID0gVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZLnRlc3QoVEVTVCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0YWNrLCBkcm9wRW50cmllcykge1xuICBpZiAoSVNfVjhfT1JfQ0hBS1JBX1NUQUNLICYmIHR5cGVvZiBzdGFjayA9PSAnc3RyaW5nJyAmJiAhJEVycm9yLnByZXBhcmVTdGFja1RyYWNlKSB7XG4gICAgd2hpbGUgKGRyb3BFbnRyaWVzLS0pIHN0YWNrID0gcmVwbGFjZShzdGFjaywgVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZLCAnJyk7XG4gIH0gcmV0dXJuIHN0YWNrO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgY2xlYXJFcnJvclN0YWNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyJyk7XG52YXIgRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUnKTtcblxuLy8gbm9uLXN0YW5kYXJkIFY4XG52YXIgY2FwdHVyZVN0YWNrVHJhY2UgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXJyb3IsIEMsIHN0YWNrLCBkcm9wRW50cmllcykge1xuICBpZiAoRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUpIHtcbiAgICBpZiAoY2FwdHVyZVN0YWNrVHJhY2UpIGNhcHR1cmVTdGFja1RyYWNlKGVycm9yLCBDKTtcbiAgICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywgY2xlYXJFcnJvclN0YWNrKHN0YWNrLCBkcm9wRW50cmllcykpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdhJyk7XG4gIGlmICghKCdzdGFjaycgaW4gZXJyb3IpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIDcpKTtcbiAgcmV0dXJuIGVycm9yLnN0YWNrICE9PSA3O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGFwcGx5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbi8vIGFkZCBkZWJ1Z2dpbmcgaW5mb1xucmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG52YXIgd3JhcENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKE5hdGl2ZUNvbnN0cnVjdG9yKSB7XG4gIHZhciBXcmFwcGVyID0gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFdyYXBwZXIpIHtcbiAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgTmF0aXZlQ29uc3RydWN0b3IoKTtcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKGEpO1xuICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgTmF0aXZlQ29uc3RydWN0b3IoYSwgYik7XG4gICAgICB9IHJldHVybiBuZXcgTmF0aXZlQ29uc3RydWN0b3IoYSwgYiwgYyk7XG4gICAgfSByZXR1cm4gYXBwbHkoTmF0aXZlQ29uc3RydWN0b3IsIHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG4gIFdyYXBwZXIucHJvdG90eXBlID0gTmF0aXZlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICByZXR1cm4gV3JhcHBlcjtcbn07XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAgICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMuZG9udENhbGxHZXRTZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4gIG9wdGlvbnMubmFtZSAgICAgICAgICAgLSB0aGUgLm5hbWUgb2YgdGhlIGZ1bmN0aW9uIGlmIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBrZXlcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcHRpb25zLCBzb3VyY2UpIHtcbiAgdmFyIFRBUkdFVCA9IG9wdGlvbnMudGFyZ2V0O1xuICB2YXIgR0xPQkFMID0gb3B0aW9ucy5nbG9iYWw7XG4gIHZhciBTVEFUSUMgPSBvcHRpb25zLnN0YXQ7XG4gIHZhciBQUk9UTyA9IG9wdGlvbnMucHJvdG87XG5cbiAgdmFyIG5hdGl2ZVNvdXJjZSA9IEdMT0JBTCA/IGdsb2JhbFRoaXMgOiBTVEFUSUMgPyBnbG9iYWxUaGlzW1RBUkdFVF0gOiBnbG9iYWxUaGlzW1RBUkdFVF0gJiYgZ2xvYmFsVGhpc1tUQVJHRVRdLnByb3RvdHlwZTtcblxuICB2YXIgdGFyZ2V0ID0gR0xPQkFMID8gcGF0aCA6IHBhdGhbVEFSR0VUXSB8fCBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkocGF0aCwgVEFSR0VULCB7fSlbVEFSR0VUXTtcbiAgdmFyIHRhcmdldFByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7XG5cbiAgdmFyIEZPUkNFRCwgVVNFX05BVElWRSwgVklSVFVBTF9QUk9UT1RZUEU7XG4gIHZhciBrZXksIHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSwgbmF0aXZlUHJvcGVydHksIHJlc3VsdFByb3BlcnR5LCBkZXNjcmlwdG9yO1xuXG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgVVNFX05BVElWRSA9ICFGT1JDRUQgJiYgbmF0aXZlU291cmNlICYmIGhhc093bihuYXRpdmVTb3VyY2UsIGtleSk7XG5cbiAgICB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuXG4gICAgaWYgKFVTRV9OQVRJVkUpIGlmIChvcHRpb25zLmRvbnRDYWxsR2V0U2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5hdGl2ZVNvdXJjZSwga2V5KTtcbiAgICAgIG5hdGl2ZVByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSBuYXRpdmVQcm9wZXJ0eSA9IG5hdGl2ZVNvdXJjZVtrZXldO1xuXG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBpbXBsZW1lbnRhdGlvblxuICAgIHNvdXJjZVByb3BlcnR5ID0gKFVTRV9OQVRJVkUgJiYgbmF0aXZlUHJvcGVydHkpID8gbmF0aXZlUHJvcGVydHkgOiBzb3VyY2Vba2V5XTtcblxuICAgIGlmICghRk9SQ0VEICYmICFQUk9UTyAmJiB0eXBlb2YgdGFyZ2V0UHJvcGVydHkgPT0gdHlwZW9mIHNvdXJjZVByb3BlcnR5KSBjb250aW51ZTtcblxuICAgIC8vIGJpbmQgbWV0aG9kcyB0byBnbG9iYWwgZm9yIGNhbGxpbmcgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGlmIChvcHRpb25zLmJpbmQgJiYgVVNFX05BVElWRSkgcmVzdWx0UHJvcGVydHkgPSBiaW5kKHNvdXJjZVByb3BlcnR5LCBnbG9iYWxUaGlzKTtcbiAgICAvLyB3cmFwIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHByZXZlbnQgY2hhbmdlcyBpbiB0aGlzIHZlcnNpb25cbiAgICBlbHNlIGlmIChvcHRpb25zLndyYXAgJiYgVVNFX05BVElWRSkgcmVzdWx0UHJvcGVydHkgPSB3cmFwQ29uc3RydWN0b3Ioc291cmNlUHJvcGVydHkpO1xuICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuICAgIGVsc2UgaWYgKFBST1RPICYmIGlzQ2FsbGFibGUoc291cmNlUHJvcGVydHkpKSByZXN1bHRQcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHNvdXJjZVByb3BlcnR5KTtcbiAgICAvLyBkZWZhdWx0IGNhc2VcbiAgICBlbHNlIHJlc3VsdFByb3BlcnR5ID0gc291cmNlUHJvcGVydHk7XG5cbiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gICAgaWYgKG9wdGlvbnMuc2hhbSB8fCAoc291cmNlUHJvcGVydHkgJiYgc291cmNlUHJvcGVydHkuc2hhbSkgfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkocmVzdWx0UHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRhcmdldCwga2V5LCByZXN1bHRQcm9wZXJ0eSk7XG5cbiAgICBpZiAoUFJPVE8pIHtcbiAgICAgIFZJUlRVQUxfUFJPVE9UWVBFID0gVEFSR0VUICsgJ1Byb3RvdHlwZSc7XG4gICAgICBpZiAoIWhhc093bihwYXRoLCBWSVJUVUFMX1BST1RPVFlQRSkpIHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHBhdGgsIFZJUlRVQUxfUFJPVE9UWVBFLCB7fSk7XG4gICAgICB9XG4gICAgICAvLyBleHBvcnQgdmlydHVhbCBwcm90b3R5cGUgbWV0aG9kc1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHBhdGhbVklSVFVBTF9QUk9UT1RZUEVdLCBrZXksIHNvdXJjZVByb3BlcnR5KTtcbiAgICAgIC8vIGV4cG9ydCByZWFsIHByb3RvdHlwZSBtZXRob2RzXG4gICAgICBpZiAob3B0aW9ucy5yZWFsICYmIHRhcmdldFByb3RvdHlwZSAmJiAoRk9SQ0VEIHx8ICF0YXJnZXRQcm90b3R5cGVba2V5XSkpIHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRhcmdldFByb3RvdHlwZSwga2V5LCBzb3VyY2VQcm9wZXJ0eSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNleHRlbnNpYmxlLCBlcy9uby1vYmplY3QtcHJldmVudGV4dGVuc2lvbnMgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5pc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBOQVRJVkVfQklORCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZScpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgYXBwbHkgPSBGdW5jdGlvblByb3RvdHlwZS5hcHBseTtcbnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXJlZmxlY3QgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgUmVmbGVjdCA9PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmFwcGx5IHx8IChOQVRJVkVfQklORCA/IGNhbGwuYmluZChhcHBseSkgOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYWxsLmFwcGx5KGFwcGx5LCBhcmd1bWVudHMpO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZScpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgTkFUSVZFX0JJTkQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUnKTtcblxudmFyIGJpbmQgPSB1bmN1cnJ5VGhpcyh1bmN1cnJ5VGhpcy5iaW5kKTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCkge1xuICBhQ2FsbGFibGUoZm4pO1xuICByZXR1cm4gdGhhdCA9PT0gdW5kZWZpbmVkID8gZm4gOiBOQVRJVkVfQklORCA/IGJpbmQoZm4sIHRoYXQpIDogZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tZnVuY3Rpb24tcHJvdG90eXBlLWJpbmQgLS0gc2FmZVxuICB2YXIgdGVzdCA9IChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pLmJpbmQoKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlXG4gIHJldHVybiB0eXBlb2YgdGVzdCAhPSAnZnVuY3Rpb24nIHx8IHRlc3QuaGFzT3duUHJvcGVydHkoJ3Byb3RvdHlwZScpO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGFycmF5U2xpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2UnKTtcbnZhciBOQVRJVkVfQklORCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZScpO1xuXG52YXIgJEZ1bmN0aW9uID0gRnVuY3Rpb247XG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcbnZhciBqb2luID0gdW5jdXJyeVRoaXMoW10uam9pbik7XG52YXIgZmFjdG9yaWVzID0ge307XG5cbnZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbiAoQywgYXJnc0xlbmd0aCwgYXJncykge1xuICBpZiAoIWhhc093bihmYWN0b3JpZXMsIGFyZ3NMZW5ndGgpKSB7XG4gICAgdmFyIGxpc3QgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBhcmdzTGVuZ3RoOyBpKyspIGxpc3RbaV0gPSAnYVsnICsgaSArICddJztcbiAgICBmYWN0b3JpZXNbYXJnc0xlbmd0aF0gPSAkRnVuY3Rpb24oJ0MsYScsICdyZXR1cm4gbmV3IEMoJyArIGpvaW4obGlzdCwgJywnKSArICcpJyk7XG4gIH0gcmV0dXJuIGZhY3Rvcmllc1thcmdzTGVuZ3RoXShDLCBhcmdzKTtcbn07XG5cbi8vIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tZnVuY3Rpb24tcHJvdG90eXBlLWJpbmQgLS0gZGV0ZWN0aW9uXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9CSU5EID8gJEZ1bmN0aW9uLmJpbmQgOiBmdW5jdGlvbiBiaW5kKHRoYXQgLyogLCAuLi5hcmdzICovKSB7XG4gIHZhciBGID0gYUNhbGxhYmxlKHRoaXMpO1xuICB2YXIgUHJvdG90eXBlID0gRi5wcm90b3R5cGU7XG4gIHZhciBwYXJ0QXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGJvdW5kRnVuY3Rpb24gPSBmdW5jdGlvbiBib3VuZCgvKiBhcmdzLi4uICovKSB7XG4gICAgdmFyIGFyZ3MgPSBjb25jYXQocGFydEFyZ3MsIGFycmF5U2xpY2UoYXJndW1lbnRzKSk7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBib3VuZEZ1bmN0aW9uID8gY29uc3RydWN0KEYsIGFyZ3MubGVuZ3RoLCBhcmdzKSA6IEYuYXBwbHkodGhhdCwgYXJncyk7XG4gIH07XG4gIGlmIChpc09iamVjdChQcm90b3R5cGUpKSBib3VuZEZ1bmN0aW9uLnByb3RvdHlwZSA9IFByb3RvdHlwZTtcbiAgcmV0dXJuIGJvdW5kRnVuY3Rpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX0JJTkQgPyBjYWxsLmJpbmQoY2FsbCkgOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYWxsLmFwcGx5KGNhbGwsIGFyZ3VtZW50cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldERlc2NyaXB0b3IgPSBERVNDUklQVE9SUyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG52YXIgRVhJU1RTID0gaGFzT3duKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpO1xuLy8gYWRkaXRpb25hbCBwcm90ZWN0aW9uIGZyb20gbWluaWZpZWQgLyBtYW5nbGVkIC8gZHJvcHBlZCBmdW5jdGlvbiBuYW1lc1xudmFyIFBST1BFUiA9IEVYSVNUUyAmJiAoZnVuY3Rpb24gc29tZXRoaW5nKCkgeyAvKiBlbXB0eSAqLyB9KS5uYW1lID09PSAnc29tZXRoaW5nJztcbnZhciBDT05GSUdVUkFCTEUgPSBFWElTVFMgJiYgKCFERVNDUklQVE9SUyB8fCAoREVTQ1JJUFRPUlMgJiYgZ2V0RGVzY3JpcHRvcihGdW5jdGlvblByb3RvdHlwZSwgJ25hbWUnKS5jb25maWd1cmFibGUpKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEVYSVNUUzogRVhJU1RTLFxuICBQUk9QRVI6IFBST1BFUixcbiAgQ09ORklHVVJBQkxFOiBDT05GSUdVUkFCTEVcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIG1ldGhvZCkge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbiAgICByZXR1cm4gdW5jdXJyeVRoaXMoYUNhbGxhYmxlKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBrZXkpW21ldGhvZF0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjbGFzc29mUmF3ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuKSB7XG4gIC8vIE5hc2hvcm4gYnVnOlxuICAvLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xMTI4XG4gIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzExMzBcbiAgaWYgKGNsYXNzb2ZSYXcoZm4pID09PSAnRnVuY3Rpb24nKSByZXR1cm4gdW5jdXJyeVRoaXMoZm4pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBOQVRJVkVfQklORCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZScpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgY2FsbCA9IEZ1bmN0aW9uUHJvdG90eXBlLmNhbGw7XG52YXIgdW5jdXJyeVRoaXNXaXRoQmluZCA9IE5BVElWRV9CSU5EICYmIEZ1bmN0aW9uUHJvdG90eXBlLmJpbmQuYmluZChjYWxsLCBjYWxsKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfQklORCA/IHVuY3VycnlUaGlzV2l0aEJpbmQgOiBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2FsbC5hcHBseShmbiwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUiwgTUVUSE9EKSB7XG4gIHZhciBOYW1lc3BhY2UgPSBwYXRoW0NPTlNUUlVDVE9SICsgJ1Byb3RvdHlwZSddO1xuICB2YXIgcHVyZU1ldGhvZCA9IE5hbWVzcGFjZSAmJiBOYW1lc3BhY2VbTUVUSE9EXTtcbiAgaWYgKHB1cmVNZXRob2QpIHJldHVybiBwdXJlTWV0aG9kO1xuICB2YXIgTmF0aXZlQ29uc3RydWN0b3IgPSBnbG9iYWxUaGlzW0NPTlNUUlVDVE9SXTtcbiAgdmFyIE5hdGl2ZVByb3RvdHlwZSA9IE5hdGl2ZUNvbnN0cnVjdG9yICYmIE5hdGl2ZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgcmV0dXJuIE5hdGl2ZVByb3RvdHlwZSAmJiBOYXRpdmVQcm90b3R5cGVbTUVUSE9EXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxudmFyIGFGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YXJpYWJsZSkge1xuICByZXR1cm4gaXNDYWxsYWJsZSh2YXJpYWJsZSkgPyB2YXJpYWJsZSA6IHVuZGVmaW5lZDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWV0aG9kKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihwYXRoW25hbWVzcGFjZV0pIHx8IGFGdW5jdGlvbihnbG9iYWxUaGlzW25hbWVzcGFjZV0pXG4gICAgOiBwYXRoW25hbWVzcGFjZV0gJiYgcGF0aFtuYW1lc3BhY2VdW21ldGhvZF0gfHwgZ2xvYmFsVGhpc1tuYW1lc3BhY2VdICYmIGdsb2JhbFRoaXNbbmFtZXNwYWNlXVttZXRob2RdO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGBHZXRJdGVyYXRvckRpcmVjdChvYmopYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzLyNzZWMtZ2V0aXRlcmF0b3JkaXJlY3Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4ge1xuICAgIGl0ZXJhdG9yOiBvYmosXG4gICAgbmV4dDogb2JqLm5leHQsXG4gICAgZG9uZTogZmFsc2VcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgcmV0dXJuIGdldE1ldGhvZChpdCwgSVRFUkFUT1IpXG4gICAgfHwgZ2V0TWV0aG9kKGl0LCAnQEBpdGVyYXRvcicpXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQsIHVzaW5nSXRlcmF0b3IpIHtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBnZXRJdGVyYXRvck1ldGhvZChhcmd1bWVudCkgOiB1c2luZ0l0ZXJhdG9yO1xuICBpZiAoYUNhbGxhYmxlKGl0ZXJhdG9yTWV0aG9kKSkgcmV0dXJuIGFuT2JqZWN0KGNhbGwoaXRlcmF0b3JNZXRob2QsIGFyZ3VtZW50KSk7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xuXG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyZXBsYWNlcikge1xuICBpZiAoaXNDYWxsYWJsZShyZXBsYWNlcikpIHJldHVybiByZXBsYWNlcjtcbiAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmV0dXJuO1xuICB2YXIgcmF3TGVuZ3RoID0gcmVwbGFjZXIubGVuZ3RoO1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJhd0xlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVsZW1lbnQgPSByZXBsYWNlcltpXTtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT0gJ3N0cmluZycpIHB1c2goa2V5cywgZWxlbWVudCk7XG4gICAgZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT0gJ251bWJlcicgfHwgY2xhc3NvZihlbGVtZW50KSA9PT0gJ051bWJlcicgfHwgY2xhc3NvZihlbGVtZW50KSA9PT0gJ1N0cmluZycpIHB1c2goa2V5cywgdG9TdHJpbmcoZWxlbWVudCkpO1xuICB9XG4gIHZhciBrZXlzTGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciByb290ID0gdHJ1ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgaWYgKHJvb3QpIHtcbiAgICAgIHJvb3QgPSBmYWxzZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkodGhpcykpIHJldHVybiB2YWx1ZTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXNMZW5ndGg7IGorKykgaWYgKGtleXNbal0gPT09IGtleSkgcmV0dXJuIHZhbHVlO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG5cbi8vIGBHZXRNZXRob2RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXRtZXRob2Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFYsIFApIHtcbiAgdmFyIGZ1bmMgPSBWW1BdO1xuICByZXR1cm4gaXNOdWxsT3JVbmRlZmluZWQoZnVuYykgPyB1bmRlZmluZWQgOiBhQ2FsbGFibGUoZnVuYyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG52YXIgZ2V0SXRlcmF0b3JEaXJlY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLWRpcmVjdCcpO1xuXG52YXIgSU5WQUxJRF9TSVpFID0gJ0ludmFsaWQgc2l6ZSc7XG52YXIgJFJhbmdlRXJyb3IgPSBSYW5nZUVycm9yO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG5cbnZhciBTZXRSZWNvcmQgPSBmdW5jdGlvbiAoc2V0LCBpbnRTaXplKSB7XG4gIHRoaXMuc2V0ID0gc2V0O1xuICB0aGlzLnNpemUgPSBtYXgoaW50U2l6ZSwgMCk7XG4gIHRoaXMuaGFzID0gYUNhbGxhYmxlKHNldC5oYXMpO1xuICB0aGlzLmtleXMgPSBhQ2FsbGFibGUoc2V0LmtleXMpO1xufTtcblxuU2V0UmVjb3JkLnByb3RvdHlwZSA9IHtcbiAgZ2V0SXRlcmF0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0SXRlcmF0b3JEaXJlY3QoYW5PYmplY3QoY2FsbCh0aGlzLmtleXMsIHRoaXMuc2V0KSkpO1xuICB9LFxuICBpbmNsdWRlczogZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGNhbGwodGhpcy5oYXMsIHRoaXMuc2V0LCBpdCk7XG4gIH1cbn07XG5cbi8vIGBHZXRTZXRSZWNvcmRgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLXNldC1tZXRob2RzLyNzZWMtZ2V0c2V0cmVjb3JkXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgYW5PYmplY3Qob2JqKTtcbiAgdmFyIG51bVNpemUgPSArb2JqLnNpemU7XG4gIC8vIE5PVEU6IElmIHNpemUgaXMgdW5kZWZpbmVkLCB0aGVuIG51bVNpemUgd2lsbCBiZSBOYU5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgaWYgKG51bVNpemUgIT09IG51bVNpemUpIHRocm93IG5ldyAkVHlwZUVycm9yKElOVkFMSURfU0laRSk7XG4gIHZhciBpbnRTaXplID0gdG9JbnRlZ2VyT3JJbmZpbml0eShudW1TaXplKTtcbiAgaWYgKGludFNpemUgPCAwKSB0aHJvdyBuZXcgJFJhbmdlRXJyb3IoSU5WQUxJRF9TSVpFKTtcbiAgcmV0dXJuIG5ldyBTZXRSZWNvcmQob2JqLCBpbnRTaXplKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT09IE1hdGggJiYgaXQ7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxubW9kdWxlLmV4cG9ydHMgPVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tZ2xvYmFsLXRoaXMgLS0gc2FmZVxuICBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSAnb2JqZWN0JyAmJiBnbG9iYWxUaGlzKSB8fFxuICBjaGVjayh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdykgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYpIHx8XG4gIGNoZWNrKHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsKSB8fFxuICBjaGVjayh0eXBlb2YgdGhpcyA9PSAnb2JqZWN0JyAmJiB0aGlzKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmMgLS0gZmFsbGJhY2tcbiAgKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pKCkgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcblxudmFyIGhhc093blByb3BlcnR5ID0gdW5jdXJyeVRoaXMoe30uaGFzT3duUHJvcGVydHkpO1xuXG4vLyBgSGFzT3duUHJvcGVydHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1oYXNvd25wcm9wZXJ0eVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1oYXNvd24gLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaGFzT3duIHx8IGZ1bmN0aW9uIGhhc093bihpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eSh0b09iamVjdChpdCksIGtleSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSBzYWZlXG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGNvbnNvbGUuZXJyb3IoYSkgOiBjb25zb2xlLmVycm9yKGEsIGIpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignZG9jdW1lbnQnLCAnZG9jdW1lbnRFbGVtZW50Jyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcblxuLy8gVGhhbmtzIHRvIElFOCBmb3IgaXRzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRlRWxlbWVudCgnZGl2JyksICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfVxuICB9KS5hICE9PSA3O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xuXG4vLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlXG4gIHJldHVybiAhJE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09PSAnU3RyaW5nJyA/IHNwbGl0KGl0LCAnJykgOiAkT2JqZWN0KGl0KTtcbn0gOiAkT2JqZWN0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyhGdW5jdGlvbi50b1N0cmluZyk7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgY29yZS1qc0AzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICghaXNDYWxsYWJsZShzdG9yZS5pbnNwZWN0U291cmNlKSkge1xuICBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcoaXQpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlLmluc3BlY3RTb3VyY2U7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xuXG4vLyBgSW5zdGFsbEVycm9yQ2F1c2VgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWVycm9yLWNhdXNlLyNzZWMtZXJyb3JvYmplY3RzLWluc3RhbGwtZXJyb3ItY2F1c2Vcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIG9wdGlvbnMpIHtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpICYmICdjYXVzZScgaW4gb3B0aW9ucykge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShPLCAnY2F1c2UnLCBvcHRpb25zLmNhdXNlKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWxNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMtZXh0ZXJuYWwnKTtcbnZhciBpc0V4dGVuc2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLWV4dGVuc2libGUnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgRlJFRVpJTkcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnJlZXppbmcnKTtcblxudmFyIFJFUVVJUkVEID0gZmFsc2U7XG52YXIgTUVUQURBVEEgPSB1aWQoJ21ldGEnKTtcbnZhciBpZCA9IDA7XG5cbnZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHtcbiAgICBvYmplY3RJRDogJ08nICsgaWQrKywgLy8gb2JqZWN0IElEXG4gICAgd2Vha0RhdGE6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBhIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEO1xufTtcblxudmFyIGdldFdlYWtEYXRhID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiB0aGUgc3RvcmUgb2Ygd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLndlYWtEYXRhO1xufTtcblxuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaSU5HICYmIFJFUVVJUkVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhc093bihpdCwgTUVUQURBVEEpKSBzZXRNZXRhZGF0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cbnZhciBlbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gIG1ldGEuZW5hYmxlID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuICBSRVFVSVJFRCA9IHRydWU7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mO1xuICB2YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdGVzdFtNRVRBREFUQV0gPSAxO1xuXG4gIC8vIHByZXZlbnQgZXhwb3Npbmcgb2YgbWV0YWRhdGEga2V5XG4gIGlmIChnZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QpLmxlbmd0aCkge1xuICAgIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZiA9IGZ1bmN0aW9uIChpdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocmVzdWx0W2ldID09PSBNRVRBREFUQSkge1xuICAgICAgICAgIHNwbGljZShyZXN1bHQsIGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgICQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgICAgZ2V0T3duUHJvcGVydHlOYW1lczogZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsTW9kdWxlLmZcbiAgICB9KTtcbiAgfVxufTtcblxudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZW5hYmxlOiBlbmFibGUsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWtEYXRhOiBnZXRXZWFrRGF0YSxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5oaWRkZW5LZXlzW01FVEFEQVRBXSA9IHRydWU7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlYWstbWFwLWJhc2ljLWRldGVjdGlvbicpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCA9ICdPYmplY3QgYWxyZWFkeSBpbml0aWFsaXplZCc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsVGhpcy5UeXBlRXJyb3I7XG52YXIgV2Vha01hcCA9IGdsb2JhbFRoaXMuV2Vha01hcDtcbnZhciBzZXQsIGdldCwgaGFzO1xuXG52YXIgZW5mb3JjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaGFzKGl0KSA/IGdldChpdCkgOiBzZXQoaXQsIHt9KTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIHN0YXRlO1xuICAgIGlmICghaXNPYmplY3QoaXQpIHx8IChzdGF0ZSA9IGdldChpdCkpLnR5cGUgIT09IFRZUEUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQIHx8IHNoYXJlZC5zdGF0ZSkge1xuICB2YXIgc3RvcmUgPSBzaGFyZWQuc3RhdGUgfHwgKHNoYXJlZC5zdGF0ZSA9IG5ldyBXZWFrTWFwKCkpO1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1zZWxmLWFzc2lnbiAtLSBwcm90b3R5cGUgbWV0aG9kcyBwcm90ZWN0aW9uICovXG4gIHN0b3JlLmdldCA9IHN0b3JlLmdldDtcbiAgc3RvcmUuaGFzID0gc3RvcmUuaGFzO1xuICBzdG9yZS5zZXQgPSBzdG9yZS5zZXQ7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1hc3NpZ24gLS0gcHJvdG90eXBlIG1ldGhvZHMgcHJvdGVjdGlvbiAqL1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgaWYgKHN0b3JlLmhhcyhpdCkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIHN0b3JlLnNldChpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHN0b3JlLmdldChpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBzdG9yZS5oYXMoaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAoaGFzT3duKGl0LCBTVEFURSkpIHRocm93IG5ldyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaGFzT3duKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzLFxuICBlbmZvcmNlOiBlbmZvcmNlLFxuICBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktaXNhcnJheSAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmd1bWVudCkge1xuICByZXR1cm4gY2xhc3NvZihhcmd1bWVudCkgPT09ICdBcnJheSc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1Jc0hUTUxEREEtaW50ZXJuYWwtc2xvdFxudmFyIGRvY3VtZW50QWxsID0gdHlwZW9mIGRvY3VtZW50ID09ICdvYmplY3QnICYmIGRvY3VtZW50LmFsbDtcblxuLy8gYElzQ2FsbGFibGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2NhbGxhYmxlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby10eXBlb2YtdW5kZWZpbmVkIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBkb2N1bWVudEFsbCA9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudEFsbCAhPT0gdW5kZWZpbmVkID8gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT0gJ2Z1bmN0aW9uJyB8fCBhcmd1bWVudCA9PT0gZG9jdW1lbnRBbGw7XG59IDogZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT0gJ2Z1bmN0aW9uJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG5cbnZhciBub29wID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIGNvbnN0cnVjdCA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnY29uc3RydWN0Jyk7XG52YXIgY29uc3RydWN0b3JSZWdFeHAgPSAvXlxccyooPzpjbGFzc3xmdW5jdGlvbilcXGIvO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcyhjb25zdHJ1Y3RvclJlZ0V4cC5leGVjKTtcbnZhciBJTkNPUlJFQ1RfVE9fU1RSSU5HID0gIWNvbnN0cnVjdG9yUmVnRXhwLnRlc3Qobm9vcCk7XG5cbnZhciBpc0NvbnN0cnVjdG9yTW9kZXJuID0gZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3RydWN0KG5vb3AsIFtdLCBhcmd1bWVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG52YXIgaXNDb25zdHJ1Y3RvckxlZ2FjeSA9IGZ1bmN0aW9uIGlzQ29uc3RydWN0b3IoYXJndW1lbnQpIHtcbiAgaWYgKCFpc0NhbGxhYmxlKGFyZ3VtZW50KSkgcmV0dXJuIGZhbHNlO1xuICBzd2l0Y2ggKGNsYXNzb2YoYXJndW1lbnQpKSB7XG4gICAgY2FzZSAnQXN5bmNGdW5jdGlvbic6XG4gICAgY2FzZSAnR2VuZXJhdG9yRnVuY3Rpb24nOlxuICAgIGNhc2UgJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nOiByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyB3ZSBjYW4ndCBjaGVjayAucHJvdG90eXBlIHNpbmNlIGNvbnN0cnVjdG9ycyBwcm9kdWNlZCBieSAuYmluZCBoYXZlbid0IGl0XG4gICAgLy8gYEZ1bmN0aW9uI3RvU3RyaW5nYCB0aHJvd3Mgb24gc29tZSBidWlsdC1pdCBmdW5jdGlvbiBpbiBzb21lIGxlZ2FjeSBlbmdpbmVzXG4gICAgLy8gKGZvciBleGFtcGxlLCBgRE9NUXVhZGAgYW5kIHNpbWlsYXIgaW4gRkY0MS0pXG4gICAgcmV0dXJuIElOQ09SUkVDVF9UT19TVFJJTkcgfHwgISFleGVjKGNvbnN0cnVjdG9yUmVnRXhwLCBpbnNwZWN0U291cmNlKGFyZ3VtZW50KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbmlzQ29uc3RydWN0b3JMZWdhY3kuc2hhbSA9IHRydWU7XG5cbi8vIGBJc0NvbnN0cnVjdG9yYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNjb25zdHJ1Y3RvclxubW9kdWxlLmV4cG9ydHMgPSAhY29uc3RydWN0IHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNhbGxlZDtcbiAgcmV0dXJuIGlzQ29uc3RydWN0b3JNb2Rlcm4oaXNDb25zdHJ1Y3Rvck1vZGVybi5jYWxsKVxuICAgIHx8ICFpc0NvbnN0cnVjdG9yTW9kZXJuKE9iamVjdClcbiAgICB8fCAhaXNDb25zdHJ1Y3Rvck1vZGVybihmdW5jdGlvbiAoKSB7IGNhbGxlZCA9IHRydWU7IH0pXG4gICAgfHwgY2FsbGVkO1xufSkgPyBpc0NvbnN0cnVjdG9yTGVnYWN5IDogaXNDb25zdHJ1Y3Rvck1vZGVybjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxudmFyIHJlcGxhY2VtZW50ID0gLyN8XFwucHJvdG90eXBlXFwuLztcblxudmFyIGlzRm9yY2VkID0gZnVuY3Rpb24gKGZlYXR1cmUsIGRldGVjdGlvbikge1xuICB2YXIgdmFsdWUgPSBkYXRhW25vcm1hbGl6ZShmZWF0dXJlKV07XG4gIHJldHVybiB2YWx1ZSA9PT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IGlzQ2FsbGFibGUoZGV0ZWN0aW9uKSA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgSXNJbnRlZ3JhbE51bWJlcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzaW50ZWdyYWxudW1iZXJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1udW1iZXItaXNpbnRlZ2VyIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gd2UgY2FuJ3QgdXNlIGp1c3QgYGl0ID09IG51bGxgIHNpbmNlIG9mIGBkb2N1bWVudC5hbGxgIHNwZWNpYWwgY2FzZVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1Jc0hUTUxEREEtaW50ZXJuYWwtc2xvdC1hZWNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gbnVsbCB8fCBpdCA9PT0gdW5kZWZpbmVkO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IGlzQ2FsbGFibGUoaXQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGFyZ3VtZW50KSB8fCBhcmd1bWVudCA9PT0gbnVsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHRydWU7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbi8vIGBJc1JlZ0V4cGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzcmVnZXhwXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjbGFzc29mKGl0KSA9PT0gJ1JlZ0V4cCcpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgJFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xuICByZXR1cm4gaXNDYWxsYWJsZSgkU3ltYm9sKSAmJiBpc1Byb3RvdHlwZU9mKCRTeW1ib2wucHJvdG90eXBlLCAkT2JqZWN0KGl0KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyZWNvcmQsIGZuLCBJVEVSQVRPUl9JTlNURUFEX09GX1JFQ09SRCkge1xuICB2YXIgaXRlcmF0b3IgPSBJVEVSQVRPUl9JTlNURUFEX09GX1JFQ09SRCA/IHJlY29yZCA6IHJlY29yZC5pdGVyYXRvcjtcbiAgdmFyIG5leHQgPSByZWNvcmQubmV4dDtcbiAgdmFyIHN0ZXAsIHJlc3VsdDtcbiAgd2hpbGUgKCEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lKSB7XG4gICAgcmVzdWx0ID0gZm4oc3RlcC52YWx1ZSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvcicpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG52YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkge1xuICB0aGlzLnN0b3BwZWQgPSBzdG9wcGVkO1xuICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbn07XG5cbnZhciBSZXN1bHRQcm90b3R5cGUgPSBSZXN1bHQucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgdW5ib3VuZEZ1bmN0aW9uLCBvcHRpb25zKSB7XG4gIHZhciB0aGF0ID0gb3B0aW9ucyAmJiBvcHRpb25zLnRoYXQ7XG4gIHZhciBBU19FTlRSSUVTID0gISEob3B0aW9ucyAmJiBvcHRpb25zLkFTX0VOVFJJRVMpO1xuICB2YXIgSVNfUkVDT1JEID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklTX1JFQ09SRCk7XG4gIHZhciBJU19JVEVSQVRPUiA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JU19JVEVSQVRPUik7XG4gIHZhciBJTlRFUlJVUFRFRCA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JTlRFUlJVUFRFRCk7XG4gIHZhciBmbiA9IGJpbmQodW5ib3VuZEZ1bmN0aW9uLCB0aGF0KTtcbiAgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgbmV4dCwgc3RlcDtcblxuICB2YXIgc3RvcCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHtcbiAgICBpZiAoaXRlcmF0b3IpIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICdub3JtYWwnLCBjb25kaXRpb24pO1xuICAgIHJldHVybiBuZXcgUmVzdWx0KHRydWUsIGNvbmRpdGlvbik7XG4gIH07XG5cbiAgdmFyIGNhbGxGbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmIChBU19FTlRSSUVTKSB7XG4gICAgICBhbk9iamVjdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZVswXSwgdmFsdWVbMV0sIHN0b3ApIDogZm4odmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICB9IHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlLCBzdG9wKSA6IGZuKHZhbHVlKTtcbiAgfTtcblxuICBpZiAoSVNfUkVDT1JEKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZS5pdGVyYXRvcjtcbiAgfSBlbHNlIGlmIChJU19JVEVSQVRPUikge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGU7XG4gIH0gZWxzZSB7XG4gICAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICAgIGlmICghaXRlckZuKSB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhpdGVyYWJsZSkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoaXRlcmFibGUpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKGl0ZXJhYmxlLCBpdGVyRm4pO1xuICB9XG5cbiAgbmV4dCA9IElTX1JFQ09SRCA/IGl0ZXJhYmxlLm5leHQgOiBpdGVyYXRvci5uZXh0O1xuICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gY2FsbEZuKHN0ZXAudmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdvYmplY3QnICYmIHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBraW5kLCB2YWx1ZSkge1xuICB2YXIgaW5uZXJSZXN1bHQsIGlubmVyRXJyb3I7XG4gIGFuT2JqZWN0KGl0ZXJhdG9yKTtcbiAgdHJ5IHtcbiAgICBpbm5lclJlc3VsdCA9IGdldE1ldGhvZChpdGVyYXRvciwgJ3JldHVybicpO1xuICAgIGlmICghaW5uZXJSZXN1bHQpIHtcbiAgICAgIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaW5uZXJSZXN1bHQgPSBjYWxsKGlubmVyUmVzdWx0LCBpdGVyYXRvcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW5uZXJFcnJvciA9IHRydWU7XG4gICAgaW5uZXJSZXN1bHQgPSBlcnJvcjtcbiAgfVxuICBpZiAoa2luZCA9PT0gJ3Rocm93JykgdGhyb3cgdmFsdWU7XG4gIGlmIChpbm5lckVycm9yKSB0aHJvdyBpbm5lclJlc3VsdDtcbiAgYW5PYmplY3QoaW5uZXJSZXN1bHQpO1xuICByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0LCBFTlVNRVJBQkxFX05FWFQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigrIUVOVU1FUkFCTEVfTkVYVCwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgRnVuY3Rpb25OYW1lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jcmVhdGUtY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSXRlcmF0b3JzQ29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpO1xuXG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuUFJPUEVSO1xudmFyIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FID0gRnVuY3Rpb25OYW1lLkNPTkZJR1VSQUJMRTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpIHJldHVybiBJdGVyYWJsZVByb3RvdHlwZVtLSU5EXTtcblxuICAgIHN3aXRjaCAoS0lORCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgRU5UUklFUzogcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07XG4gIH07XG5cbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSBmYWxzZTtcbiAgdmFyIEl0ZXJhYmxlUHJvdG90eXBlID0gSXRlcmFibGUucHJvdG90eXBlO1xuICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl1cbiAgICB8fCBJdGVyYWJsZVByb3RvdHlwZVsnQEBpdGVyYXRvciddXG4gICAgfHwgREVGQVVMVCAmJiBJdGVyYWJsZVByb3RvdHlwZVtERUZBVUxUXTtcbiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTtcbiAgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIGlmICghSVNfUFVSRSAmJiBnZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUpICE9PSBJdGVyYXRvclByb3RvdHlwZSkge1xuICAgICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICBzZXRQcm90b3R5cGVPZihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNDYWxsYWJsZShDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdKSkge1xuICAgICAgICAgIGRlZmluZUJ1aWx0SW4oQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICBpZiAoSVNfUFVSRSkgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgICB9XG4gIH1cblxuICAvLyBmaXggQXJyYXkucHJvdG90eXBlLnsgdmFsdWVzLCBAQGl0ZXJhdG9yIH0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChQUk9QRVJfRlVOQ1RJT05fTkFNRSAmJiBERUZBVUxUID09PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgaWYgKCFJU19QVVJFICYmIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoSXRlcmFibGVQcm90b3R5cGUsICduYW1lJywgVkFMVUVTKTtcbiAgICB9IGVsc2Uge1xuICAgICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICAgIGRlZmF1bHRJdGVyYXRvciA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIGNhbGwobmF0aXZlSXRlcmF0b3IsIHRoaXMpOyB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIGV4cG9ydCBhZGRpdGlvbmFsIG1ldGhvZHNcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBnZXRJdGVyYXRpb25NZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChFTlRSSUVTKVxuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChLRVkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIHx8ICEoS0VZIGluIEl0ZXJhYmxlUHJvdG90eXBlKSkge1xuICAgICAgICBkZWZpbmVCdWlsdEluKEl0ZXJhYmxlUHJvdG90eXBlLCBLRVksIG1ldGhvZHNbS0VZXSk7XG4gICAgICB9XG4gICAgfSBlbHNlICQoeyB0YXJnZXQ6IE5BTUUsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIH0sIG1ldGhvZHMpO1xuICB9XG5cbiAgLy8gZGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikge1xuICAgIGRlZmluZUJ1aWx0SW4oSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IsIHsgbmFtZTogREVGQVVMVCB9KTtcbiAgfVxuICBJdGVyYXRvcnNbTkFNRV0gPSBkZWZhdWx0SXRlcmF0b3I7XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWtleXMgLS0gc2FmZSAqL1xuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG52YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRSA9ICFpc09iamVjdChJdGVyYXRvclByb3RvdHlwZSkgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgdGVzdCA9IHt9O1xuICAvLyBGRjQ0LSBsZWdhY3kgaXRlcmF0b3JzIGNhc2VcbiAgcmV0dXJuIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXS5jYWxsKHRlc3QpICE9PSB0ZXN0O1xufSk7XG5cbmlmIChORVdfSVRFUkFUT1JfUFJPVE9UWVBFKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuZWxzZSBpZiAoSVNfUFVSRSkgSXRlcmF0b3JQcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1AQGl0ZXJhdG9yXG5pZiAoIWlzQ2FsbGFibGUoSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdKSkge1xuICBkZWZpbmVCdWlsdEluKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0ge307XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG5cbi8vIGBMZW5ndGhPZkFycmF5TGlrZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWxlbmd0aG9mYXJyYXlsaWtlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHRvTGVuZ3RoKG9iai5sZW5ndGgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGNhbGxlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsZXInKTtcblxudmFyIE1hcCA9IGdldEJ1aWx0SW4oJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTWFwOiBNYXAsXG4gIHNldDogY2FsbGVyKCdzZXQnLCAyKSxcbiAgZ2V0OiBjYWxsZXIoJ2dldCcsIDEpLFxuICBoYXM6IGNhbGxlcignaGFzJywgMSksXG4gIHJlbW92ZTogY2FsbGVyKCdkZWxldGUnLCAxKSxcbiAgcHJvdG86IE1hcC5wcm90b3R5cGVcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBNYXRoLnRydW5jYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWF0aC50cnVuY1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW1hdGgtdHJ1bmMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnRydW5jIHx8IGZ1bmN0aW9uIHRydW5jKHgpIHtcbiAgdmFyIG4gPSAreDtcbiAgcmV0dXJuIChuID4gMCA/IGZsb29yIDogY2VpbCkobik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBzYWZlR2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zYWZlLWdldC1idWlsdC1pbicpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgUXVldWUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcXVldWUnKTtcbnZhciBJU19JT1MgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtaW9zJyk7XG52YXIgSVNfSU9TX1BFQkJMRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1pb3MtcGViYmxlJyk7XG52YXIgSVNfV0VCT1NfV0VCS0lUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLXdlYm9zLXdlYmtpdCcpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtbm9kZScpO1xuXG52YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbFRoaXMuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWxUaGlzLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbFRoaXMuUHJvbWlzZTtcbnZhciBtaWNyb3Rhc2sgPSBzYWZlR2V0QnVpbHRJbigncXVldWVNaWNyb3Rhc2snKTtcbnZhciBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjtcblxuLy8gbW9kZXJuIGVuZ2luZXMgaGF2ZSBxdWV1ZU1pY3JvdGFzayBtZXRob2RcbmlmICghbWljcm90YXNrKSB7XG4gIHZhciBxdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChmbiA9IHF1ZXVlLmdldCgpKSB0cnkge1xuICAgICAgZm4oKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHF1ZXVlLmhlYWQpIG5vdGlmeSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgLy8gYWxzbyBleGNlcHQgV2ViT1MgV2Via2l0IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84OThcbiAgaWYgKCFJU19JT1MgJiYgIUlTX05PREUgJiYgIUlTX1dFQk9TX1dFQktJVCAmJiBNdXRhdGlvbk9ic2VydmVyICYmIGRvY3VtZW50KSB7XG4gICAgdG9nZ2xlID0gdHJ1ZTtcbiAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoIUlTX0lPU19QRUJCTEUgJiYgUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAvLyB3b3JrYXJvdW5kIG9mIFdlYktpdCB+IGlPUyBTYWZhcmkgMTAuMSBidWdcbiAgICBwcm9taXNlLmNvbnN0cnVjdG9yID0gUHJvbWlzZTtcbiAgICB0aGVuID0gYmluZChwcm9taXNlLnRoZW4sIHByb21pc2UpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIE5vZGUuanMgd2l0aG91dCBwcm9taXNlc1xuICB9IGVsc2UgaWYgKElTX05PREUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdlXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIC8vIGB3ZWJwYWNrYCBkZXYgc2VydmVyIGJ1ZyBvbiBJRSBnbG9iYWwgbWV0aG9kcyAtIHVzZSBiaW5kKGZuLCBnbG9iYWwpXG4gICAgbWFjcm90YXNrID0gYmluZChtYWNyb3Rhc2ssIGdsb2JhbFRoaXMpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG1hY3JvdGFzayhmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIG1pY3JvdGFzayA9IGZ1bmN0aW9uIChmbikge1xuICAgIGlmICghcXVldWUuaGVhZCkgbm90aWZ5KCk7XG4gICAgcXVldWUuYWRkKGZuKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtaWNyb3Rhc2s7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFDYWxsYWJsZShyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhQ2FsbGFibGUocmVqZWN0KTtcbn07XG5cbi8vIGBOZXdQcm9taXNlQ2FwYWJpbGl0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW5ld3Byb21pc2VjYXBhYmlsaXR5XG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50LCAkZGVmYXVsdCkge1xuICByZXR1cm4gYXJndW1lbnQgPT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gJycgOiAkZGVmYXVsdCA6IHRvU3RyaW5nKGFyZ3VtZW50KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcmVnZXhwJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXNSZWdFeHAoaXQpKSB7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnNcIik7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciB0cmltID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy10cmltJykudHJpbTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgJHBhcnNlSW50ID0gZ2xvYmFsVGhpcy5wYXJzZUludDtcbnZhciBTeW1ib2wgPSBnbG9iYWxUaGlzLlN5bWJvbDtcbnZhciBJVEVSQVRPUiA9IFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgaGV4ID0gL15bKy1dPzB4L2k7XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGhleC5leGVjKTtcbnZhciBGT1JDRUQgPSAkcGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMDgnKSAhPT0gOCB8fCAkcGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMHgxNicpICE9PSAyMlxuICAvLyBNUyBFZGdlIDE4LSBicm9rZW4gd2l0aCBib3hlZCBzeW1ib2xzXG4gIHx8IChJVEVSQVRPUiAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeyAkcGFyc2VJbnQoT2JqZWN0KElURVJBVE9SKSk7IH0pKTtcblxuLy8gYHBhcnNlSW50YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4XG5tb2R1bGUuZXhwb3J0cyA9IEZPUkNFRCA/IGZ1bmN0aW9uIHBhcnNlSW50KHN0cmluZywgcmFkaXgpIHtcbiAgdmFyIFMgPSB0cmltKHRvU3RyaW5nKHN0cmluZykpO1xuICByZXR1cm4gJHBhcnNlSW50KFMsIChyYWRpeCA+Pj4gMCkgfHwgKGV4ZWMoaGV4LCBTKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWFzc2lnbiAtLSBzYWZlXG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG5tb2R1bGUuZXhwb3J0cyA9ICEkYXNzaWduIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gc2hvdWxkIGhhdmUgY29ycmVjdCBvcmRlciBvZiBvcGVyYXRpb25zIChFZGdlIGJ1ZylcbiAgaWYgKERFU0NSSVBUT1JTICYmICRhc3NpZ24oeyBiOiAxIH0sICRhc3NpZ24oZGVmaW5lUHJvcGVydHkoe30sICdhJywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYicsIHtcbiAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH0pLCB7IGI6IDIgfSkpLmIgIT09IDEpIHJldHVybiB0cnVlO1xuICAvLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1ZylcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXN5bWJvbCAtLSBzYWZlXG4gIHZhciBzeW1ib2wgPSBTeW1ib2woJ2Fzc2lnbiBkZXRlY3Rpb24nKTtcbiAgdmFyIGFscGhhYmV0ID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtzeW1ib2xdID0gNztcbiAgYWxwaGFiZXQuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGNocikgeyBCW2Nocl0gPSBjaHI7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbc3ltYm9sXSAhPT0gNyB8fCBvYmplY3RLZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChvYmplY3RLZXlzKFMpLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZSwgUywga2V5KSkgVFtrZXldID0gU1trZXldO1xuICAgIH1cbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZ2xvYmFsIEFjdGl2ZVhPYmplY3QgLS0gb2xkIElFLCBXU0ggKi9cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcblxudmFyIEdUID0gJz4nO1xudmFyIExUID0gJzwnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFNDUklQVCA9ICdzY3JpcHQnO1xudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xuXG52YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxudmFyIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVggPSBmdW5jdGlvbiAoYWN0aXZlWERvY3VtZW50KSB7XG4gIGFjdGl2ZVhEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJycpKTtcbiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7XG4gIHZhciB0ZW1wID0gYWN0aXZlWERvY3VtZW50LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWFzc2lnbm1lbnQgLS0gYXZvaWQgbWVtb3J5IGxlYWtcbiAgYWN0aXZlWERvY3VtZW50ID0gbnVsbDtcbiAgcmV0dXJuIHRlbXA7XG59O1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhSUZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gZG9jdW1lbnRDcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgdmFyIEpTID0gJ2phdmEnICsgU0NSSVBUICsgJzonO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICBodG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80NzVcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhKUyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCdkb2N1bWVudC5GPU9iamVjdCcpKTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgcmV0dXJuIGlmcmFtZURvY3VtZW50LkY7XG59O1xuXG4vLyBDaGVjayBmb3IgZG9jdW1lbnQuZG9tYWluIGFuZCBhY3RpdmUgeCBzdXBwb3J0XG4vLyBObyBuZWVkIHRvIHVzZSBhY3RpdmUgeCBhcHByb2FjaCB3aGVuIGRvY3VtZW50LmRvbWFpbiBpcyBub3Qgc2V0XG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xNTBcbi8vIHZhcmlhdGlvbiBvZiBodHRwczovL2dpdGh1Yi5jb20va2l0Y2FtYnJpZGdlL2VzNS1zaGltL2NvbW1pdC80ZjczOGFjMDY2MzQ2XG4vLyBhdm9pZCBJRSBHQyBidWdcbnZhciBhY3RpdmVYRG9jdW1lbnQ7XG52YXIgTnVsbFByb3RvT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIGFjdGl2ZVhEb2N1bWVudCA9IG5ldyBBY3RpdmVYT2JqZWN0KCdodG1sZmlsZScpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBpZ25vcmUgKi8gfVxuICBOdWxsUHJvdG9PYmplY3QgPSB0eXBlb2YgZG9jdW1lbnQgIT0gJ3VuZGVmaW5lZCdcbiAgICA/IGRvY3VtZW50LmRvbWFpbiAmJiBhY3RpdmVYRG9jdW1lbnRcbiAgICAgID8gTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpIC8vIG9sZCBJRVxuICAgICAgOiBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUoKVxuICAgIDogTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpOyAvLyBXU0hcbiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSBkZWxldGUgTnVsbFByb3RvT2JqZWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbbGVuZ3RoXV07XG4gIHJldHVybiBOdWxsUHJvdG9PYmplY3QoKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcblxuLy8gYE9iamVjdC5jcmVhdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWNyZWF0ZSAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHlDb25zdHJ1Y3RvcigpO1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gTnVsbFByb3RvT2JqZWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzTW9kdWxlLmYocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1ZycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnRpZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgJiYgIVY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBwcm9wc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcbnZhciBWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1ZycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5Jyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIEVOVU1FUkFCTEUgPSAnZW51bWVyYWJsZSc7XG52YXIgQ09ORklHVVJBQkxFID0gJ2NvbmZpZ3VyYWJsZSc7XG52YXIgV1JJVEFCTEUgPSAnd3JpdGFibGUnO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAodHlwZW9mIE8gPT09ICdmdW5jdGlvbicgJiYgUCA9PT0gJ3Byb3RvdHlwZScgJiYgJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzICYmIFdSSVRBQkxFIGluIEF0dHJpYnV0ZXMgJiYgIUF0dHJpYnV0ZXNbV1JJVEFCTEVdKSB7XG4gICAgdmFyIGN1cnJlbnQgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnRbV1JJVEFCTEVdKSB7XG4gICAgICBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgICAgIEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogQ09ORklHVVJBQkxFIGluIEF0dHJpYnV0ZXMgPyBBdHRyaWJ1dGVzW0NPTkZJR1VSQUJMRV0gOiBjdXJyZW50W0NPTkZJR1VSQUJMRV0sXG4gICAgICAgIGVudW1lcmFibGU6IEVOVU1FUkFCTEUgaW4gQXR0cmlidXRlcyA/IEF0dHJpYnV0ZXNbRU5VTUVSQUJMRV0gOiBjdXJyZW50W0VOVU1FUkFCTEVdLFxuICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICB9IHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG59IDogJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXNPd24oTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIWNhbGwocHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZiwgTywgUCksIE9bUF0pO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eW5hbWVzIC0tIHNhZmUgKi9cbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKS5mO1xudmFyIGFycmF5U2xpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2UnKTtcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGFycmF5U2xpY2Uod2luZG93TmFtZXMpO1xuICB9XG59O1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgY2xhc3NvZihpdCkgPT09ICdXaW5kb3cnXG4gICAgPyBnZXRXaW5kb3dOYW1lcyhpdClcbiAgICA6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChpdCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyICRPYmplY3QgPSBPYmplY3Q7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gJE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0cHJvdG90eXBlb2Zcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0cHJvdG90eXBlb2YgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyAkT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gKE8pIHtcbiAgdmFyIG9iamVjdCA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzT3duKG9iamVjdCwgSUVfUFJPVE8pKSByZXR1cm4gb2JqZWN0W0lFX1BST1RPXTtcbiAgdmFyIGNvbnN0cnVjdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBpZiAoaXNDYWxsYWJsZShjb25zdHJ1Y3RvcikgJiYgb2JqZWN0IGluc3RhbmNlb2YgY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiAkT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1ub24tZXh0ZW5zaWJsZScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSAtLSBzYWZlXG52YXIgJGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgJGlzRXh0ZW5zaWJsZSgxKTsgfSk7XG5cbi8vIGBPYmplY3QuaXNFeHRlbnNpYmxlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmlzZXh0ZW5zaWJsZVxubW9kdWxlLmV4cG9ydHMgPSAoRkFJTFNfT05fUFJJTUlUSVZFUyB8fCBBUlJBWV9CVUZGRVJfTk9OX0VYVEVOU0lCTEUpID8gZnVuY3Rpb24gaXNFeHRlbnNpYmxlKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBUlJBWV9CVUZGRVJfTk9OX0VYVEVOU0lCTEUgJiYgY2xhc3NvZihpdCkgPT09ICdBcnJheUJ1ZmZlcicpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKGl0KSA6IHRydWU7XG59IDogJGlzRXh0ZW5zaWJsZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmN1cnJ5VGhpcyh7fS5pc1Byb3RvdHlwZU9mKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhc093bihoaWRkZW5LZXlzLCBrZXkpICYmIGhhc093bihPLCBrZXkpICYmIHB1c2gocmVzdWx0LCBrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzT3duKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHB1c2gocmVzdWx0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qta2V5cyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gTmFzaG9ybiB+IEpESzggYnVnXG52YXIgTkFTSE9STl9CVUcgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgISRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGVgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnByb3BlcnR5aXNlbnVtZXJhYmxlXG5leHBvcnRzLmYgPSBOQVNIT1JOX0JVRyA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgVik7XG4gIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlO1xufSA6ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvIC0tIHNhZmUgKi9cbnZhciB1bmN1cnJ5VGhpc0FjY2Vzc29yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3NvcicpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2Zcbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIHNldHRlciA9IHVuY3VycnlUaGlzQWNjZXNzb3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycsICdzZXQnKTtcbiAgICBzZXR0ZXIodGVzdCwgW10pO1xuICAgIENPUlJFQ1RfU0VUVEVSID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIHJlcXVpcmVPYmplY3RDb2VyY2libGUoTyk7XG4gICAgYVBvc3NpYmxlUHJvdG90eXBlKHByb3RvKTtcbiAgICBpZiAoIWlzT2JqZWN0KE8pKSByZXR1cm4gTztcbiAgICBpZiAoQ09SUkVDVF9TRVRURVIpIHNldHRlcihPLCBwcm90byk7XG4gICAgZWxzZSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgIHJldHVybiBPO1xuICB9O1xufSgpIDogdW5kZWZpbmVkKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgb2JqZWN0R2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJykuZjtcblxudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gdW5jdXJyeVRoaXMoJHByb3BlcnR5SXNFbnVtZXJhYmxlKTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbi8vIGluIHNvbWUgSUUgdmVyc2lvbnMsIGBwcm9wZXJ0eUlzRW51bWVyYWJsZWAgcmV0dXJucyBpbmNvcnJlY3QgcmVzdWx0IG9uIGludGVnZXIga2V5c1xuLy8gb2YgYG51bGxgIHByb3RvdHlwZSBvYmplY3RzXG52YXIgSUVfQlVHID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWNyZWF0ZSAtLSBzYWZlXG4gIHZhciBPID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgT1syXSA9IDI7XG4gIHJldHVybiAhcHJvcGVydHlJc0VudW1lcmFibGUoTywgMik7XG59KTtcblxuLy8gYE9iamVjdC57IGVudHJpZXMsIHZhbHVlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRPX0VOVFJJRVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KGl0KTtcbiAgICB2YXIga2V5cyA9IG9iamVjdEtleXMoTyk7XG4gICAgdmFyIElFX1dPUktBUk9VTkQgPSBJRV9CVUcgJiYgb2JqZWN0R2V0UHJvdG90eXBlT2YoTykgPT09IG51bGw7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaSkge1xuICAgICAga2V5ID0ga2V5c1tpKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCAoSUVfV09SS0FST1VORCA/IGtleSBpbiBPIDogcHJvcGVydHlJc0VudW1lcmFibGUoTywga2V5KSkpIHtcbiAgICAgICAgcHVzaChyZXN1bHQsIFRPX0VOVFJJRVMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgT2JqZWN0LmVudHJpZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4gIGVudHJpZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYE9iamVjdC52YWx1ZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXNcbiAgdmFsdWVzOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmctdGFnLXN1cHBvcnQnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYE9yZGluYXJ5VG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKHByZWYgPT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmIChpc0NhbGxhYmxlKGZuID0gaW5wdXQudmFsdWVPZikgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIGlmIChwcmVmICE9PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxudmFyIGNvbmNhdCA9IHVuY3VycnlUaGlzKFtdLmNvbmNhdCk7XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdvd25LZXlzJykgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBjb25jYXQoa2V5cywgZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0ge307XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlLCB2YWx1ZTogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIHZhbHVlOiBlcnJvciB9O1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3InKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgaW5zcGVjdFNvdXJjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEVOVklST05NRU5UID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC12OC12ZXJzaW9uJyk7XG5cbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFNVQkNMQVNTSU5HID0gZmFsc2U7XG52YXIgTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UID0gaXNDYWxsYWJsZShnbG9iYWxUaGlzLlByb21pc2VSZWplY3Rpb25FdmVudCk7XG5cbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IGlzRm9yY2VkKCdQcm9taXNlJywgZnVuY3Rpb24gKCkge1xuICB2YXIgUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UgPSBpbnNwZWN0U291cmNlKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIHZhciBHTE9CQUxfQ09SRV9KU19QUk9NSVNFID0gUFJPTUlTRV9DT05TVFJVQ1RPUl9TT1VSQ0UgIT09IFN0cmluZyhOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IpO1xuICAvLyBWOCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAvLyBXZSBjYW4ndCBkZXRlY3QgaXQgc3luY2hyb25vdXNseSwgc28ganVzdCBjaGVjayB2ZXJzaW9uc1xuICBpZiAoIUdMT0JBTF9DT1JFX0pTX1BST01JU0UgJiYgVjhfVkVSU0lPTiA9PT0gNjYpIHJldHVybiB0cnVlO1xuICAvLyBXZSBuZWVkIFByb21pc2UjeyBjYXRjaCwgZmluYWxseSB9IGluIHRoZSBwdXJlIHZlcnNpb24gZm9yIHByZXZlbnRpbmcgcHJvdG90eXBlIHBvbGx1dGlvblxuICBpZiAoSVNfUFVSRSAmJiAhKE5hdGl2ZVByb21pc2VQcm90b3R5cGVbJ2NhdGNoJ10gJiYgTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnZmluYWxseSddKSkgcmV0dXJuIHRydWU7XG4gIC8vIFdlIGNhbid0IHVzZSBAQHNwZWNpZXMgZmVhdHVyZSBkZXRlY3Rpb24gaW4gVjggc2luY2UgaXQgY2F1c2VzXG4gIC8vIGRlb3B0aW1pemF0aW9uIGFuZCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc5XG4gIGlmICghVjhfVkVSU0lPTiB8fCBWOF9WRVJTSU9OIDwgNTEgfHwgIS9uYXRpdmUgY29kZS8udGVzdChQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSkpIHtcbiAgICAvLyBEZXRlY3QgY29ycmVjdG5lc3Mgb2Ygc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gbmV3IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcihmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKDEpOyB9KTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSBmdW5jdGlvbiAoZXhlYykge1xuICAgICAgZXhlYyhmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG4gICAgfTtcbiAgICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yID0ge307XG4gICAgY29uc3RydWN0b3JbU1BFQ0lFU10gPSBGYWtlUHJvbWlzZTtcbiAgICBTVUJDTEFTU0lORyA9IHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gICAgaWYgKCFTVUJDTEFTU0lORykgcmV0dXJuIHRydWU7XG4gIC8vIFVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgfSByZXR1cm4gIUdMT0JBTF9DT1JFX0pTX1BST01JU0UgJiYgKEVOVklST05NRU5UID09PSAnQlJPV1NFUicgfHwgRU5WSVJPTk1FTlQgPT09ICdERU5PJykgJiYgIU5BVElWRV9QUk9NSVNFX1JFSkVDVElPTl9FVkVOVDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ09OU1RSVUNUT1I6IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SLFxuICBSRUpFQ1RJT05fRVZFTlQ6IE5BVElWRV9QUk9NSVNFX1JFSkVDVElPTl9FVkVOVCxcbiAgU1VCQ0xBU1NJTkc6IFNVQkNMQVNTSU5HXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnbG9iYWxUaGlzLlByb21pc2U7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvcicpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpLkNPTlNUUlVDVE9SO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIHx8ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvci5hbGwoaXRlcmFibGUpLnRoZW4odW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaGVhZCA9IG51bGw7XG4gIHRoaXMudGFpbCA9IG51bGw7XG59O1xuXG5RdWV1ZS5wcm90b3R5cGUgPSB7XG4gIGFkZDogZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgZW50cnkgPSB7IGl0ZW06IGl0ZW0sIG5leHQ6IG51bGwgfTtcbiAgICB2YXIgdGFpbCA9IHRoaXMudGFpbDtcbiAgICBpZiAodGFpbCkgdGFpbC5uZXh0ID0gZW50cnk7XG4gICAgZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgfSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5oZWFkO1xuICAgIGlmIChlbnRyeSkge1xuICAgICAgdmFyIG5leHQgPSB0aGlzLmhlYWQgPSBlbnRyeS5uZXh0O1xuICAgICAgaWYgKG5leHQgPT09IG51bGwpIHRoaXMudGFpbCA9IG51bGw7XG4gICAgICByZXR1cm4gZW50cnkuaXRlbTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUXVldWU7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIEF2b2lkIE5vZGVKUyBleHBlcmltZW50YWwgd2FybmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICBpZiAoIURFU0NSSVBUT1JTKSByZXR1cm4gZ2xvYmFsVGhpc1tuYW1lXTtcbiAgdmFyIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsVGhpcywgbmFtZSk7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBFTlZJUk9OTUVOVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudCcpO1xudmFyIFVTRVJfQUdFTlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdXNlci1hZ2VudCcpO1xudmFyIGFycmF5U2xpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2UnKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoJyk7XG5cbnZhciBGdW5jdGlvbiA9IGdsb2JhbFRoaXMuRnVuY3Rpb247XG4vLyBkaXJ0eSBJRTktIGFuZCBCdW4gMC4zLjAtIGNoZWNrc1xudmFyIFdSQVAgPSAvTVNJRSAuXFwuLy50ZXN0KFVTRVJfQUdFTlQpIHx8IEVOVklST05NRU5UID09PSAnQlVOJyAmJiAoZnVuY3Rpb24gKCkge1xuICB2YXIgdmVyc2lvbiA9IGdsb2JhbFRoaXMuQnVuLnZlcnNpb24uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIHZlcnNpb24ubGVuZ3RoIDwgMyB8fCB2ZXJzaW9uWzBdID09PSAnMCcgJiYgKHZlcnNpb25bMV0gPCAzIHx8IHZlcnNpb25bMV0gPT09ICczJyAmJiB2ZXJzaW9uWzJdID09PSAnMCcpO1xufSkoKTtcblxuLy8gSUU5LSAvIEJ1biAwLjMuMC0gc2V0VGltZW91dCAvIHNldEludGVydmFsIC8gc2V0SW1tZWRpYXRlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmaXhcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjdGltZXJzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vb3Zlbi1zaC9idW4vaXNzdWVzLzE2MzNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNjaGVkdWxlciwgaGFzVGltZUFyZykge1xuICB2YXIgZmlyc3RQYXJhbUluZGV4ID0gaGFzVGltZUFyZyA/IDIgOiAxO1xuICByZXR1cm4gV1JBUCA/IGZ1bmN0aW9uIChoYW5kbGVyLCB0aW1lb3V0IC8qICwgLi4uYXJndW1lbnRzICovKSB7XG4gICAgdmFyIGJvdW5kQXJncyA9IHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpID4gZmlyc3RQYXJhbUluZGV4O1xuICAgIHZhciBmbiA9IGlzQ2FsbGFibGUoaGFuZGxlcikgPyBoYW5kbGVyIDogRnVuY3Rpb24oaGFuZGxlcik7XG4gICAgdmFyIHBhcmFtcyA9IGJvdW5kQXJncyA/IGFycmF5U2xpY2UoYXJndW1lbnRzLCBmaXJzdFBhcmFtSW5kZXgpIDogW107XG4gICAgdmFyIGNhbGxiYWNrID0gYm91bmRBcmdzID8gZnVuY3Rpb24gKCkge1xuICAgICAgYXBwbHkoZm4sIHRoaXMsIHBhcmFtcyk7XG4gICAgfSA6IGZuO1xuICAgIHJldHVybiBoYXNUaW1lQXJnID8gc2NoZWR1bGVyKGNhbGxiYWNrLCB0aW1lb3V0KSA6IHNjaGVkdWxlcihjYWxsYmFjayk7XG4gIH0gOiBzY2hlZHVsZXI7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFNldEhlbHBlcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWhlbHBlcnMnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pdGVyYXRlJyk7XG5cbnZhciBTZXQgPSBTZXRIZWxwZXJzLlNldDtcbnZhciBhZGQgPSBTZXRIZWxwZXJzLmFkZDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0KSB7XG4gIHZhciByZXN1bHQgPSBuZXcgU2V0KCk7XG4gIGl0ZXJhdGUoc2V0LCBmdW5jdGlvbiAoaXQpIHtcbiAgICBhZGQocmVzdWx0LCBpdCk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Etc2V0Jyk7XG52YXIgU2V0SGVscGVycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaGVscGVycycpO1xudmFyIGNsb25lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1jbG9uZScpO1xudmFyIHNpemUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNpemUnKTtcbnZhciBnZXRTZXRSZWNvcmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1yZWNvcmQnKTtcbnZhciBpdGVyYXRlU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pdGVyYXRlJyk7XG52YXIgaXRlcmF0ZVNpbXBsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlLXNpbXBsZScpO1xuXG52YXIgaGFzID0gU2V0SGVscGVycy5oYXM7XG52YXIgcmVtb3ZlID0gU2V0SGVscGVycy5yZW1vdmU7XG5cbi8vIGBTZXQucHJvdG90eXBlLmRpZmZlcmVuY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlmZmVyZW5jZShvdGhlcikge1xuICB2YXIgTyA9IGFTZXQodGhpcyk7XG4gIHZhciBvdGhlclJlYyA9IGdldFNldFJlY29yZChvdGhlcik7XG4gIHZhciByZXN1bHQgPSBjbG9uZShPKTtcbiAgaWYgKHNpemUoTykgPD0gb3RoZXJSZWMuc2l6ZSkgaXRlcmF0ZVNldChPLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChvdGhlclJlYy5pbmNsdWRlcyhlKSkgcmVtb3ZlKHJlc3VsdCwgZSk7XG4gIH0pO1xuICBlbHNlIGl0ZXJhdGVTaW1wbGUob3RoZXJSZWMuZ2V0SXRlcmF0b3IoKSwgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoaGFzKE8sIGUpKSByZW1vdmUocmVzdWx0LCBlKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgY2FsbGVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGxlcicpO1xuXG52YXIgU2V0ID0gZ2V0QnVpbHRJbignU2V0Jyk7XG52YXIgU2V0UHJvdG90eXBlID0gU2V0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFNldDogU2V0LFxuICBhZGQ6IGNhbGxlcignYWRkJywgMSksXG4gIGhhczogY2FsbGVyKCdoYXMnLCAxKSxcbiAgcmVtb3ZlOiBjYWxsZXIoJ2RlbGV0ZScsIDEpLFxuICBwcm90bzogU2V0UHJvdG90eXBlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1zZXQnKTtcbnZhciBTZXRIZWxwZXJzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzJyk7XG52YXIgc2l6ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc2l6ZScpO1xudmFyIGdldFNldFJlY29yZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc2V0LXJlY29yZCcpO1xudmFyIGl0ZXJhdGVTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWl0ZXJhdGUnKTtcbnZhciBpdGVyYXRlU2ltcGxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlJyk7XG5cbnZhciBTZXQgPSBTZXRIZWxwZXJzLlNldDtcbnZhciBhZGQgPSBTZXRIZWxwZXJzLmFkZDtcbnZhciBoYXMgPSBTZXRIZWxwZXJzLmhhcztcblxuLy8gYFNldC5wcm90b3R5cGUuaW50ZXJzZWN0aW9uYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGludGVyc2VjdGlvbihvdGhlcikge1xuICB2YXIgTyA9IGFTZXQodGhpcyk7XG4gIHZhciBvdGhlclJlYyA9IGdldFNldFJlY29yZChvdGhlcik7XG4gIHZhciByZXN1bHQgPSBuZXcgU2V0KCk7XG5cbiAgaWYgKHNpemUoTykgPiBvdGhlclJlYy5zaXplKSB7XG4gICAgaXRlcmF0ZVNpbXBsZShvdGhlclJlYy5nZXRJdGVyYXRvcigpLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGhhcyhPLCBlKSkgYWRkKHJlc3VsdCwgZSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaXRlcmF0ZVNldChPLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKG90aGVyUmVjLmluY2x1ZGVzKGUpKSBhZGQocmVzdWx0LCBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1zZXQnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWhlbHBlcnMnKS5oYXM7XG52YXIgc2l6ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc2l6ZScpO1xudmFyIGdldFNldFJlY29yZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc2V0LXJlY29yZCcpO1xudmFyIGl0ZXJhdGVTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWl0ZXJhdGUnKTtcbnZhciBpdGVyYXRlU2ltcGxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlJyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pc0Rpc2pvaW50RnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldC1tZXRob2RzLyNTZXQucHJvdG90eXBlLmlzRGlzam9pbnRGcm9tXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGlzam9pbnRGcm9tKG90aGVyKSB7XG4gIHZhciBPID0gYVNldCh0aGlzKTtcbiAgdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTtcbiAgaWYgKHNpemUoTykgPD0gb3RoZXJSZWMuc2l6ZSkgcmV0dXJuIGl0ZXJhdGVTZXQoTywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAob3RoZXJSZWMuaW5jbHVkZXMoZSkpIHJldHVybiBmYWxzZTtcbiAgfSwgdHJ1ZSkgIT09IGZhbHNlO1xuICB2YXIgaXRlcmF0b3IgPSBvdGhlclJlYy5nZXRJdGVyYXRvcigpO1xuICByZXR1cm4gaXRlcmF0ZVNpbXBsZShpdGVyYXRvciwgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoaGFzKE8sIGUpKSByZXR1cm4gaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ25vcm1hbCcsIGZhbHNlKTtcbiAgfSkgIT09IGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Etc2V0Jyk7XG52YXIgc2l6ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc2l6ZScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWl0ZXJhdGUnKTtcbnZhciBnZXRTZXRSZWNvcmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1yZWNvcmQnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuaXNTdWJzZXRPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldC1tZXRob2RzLyNTZXQucHJvdG90eXBlLmlzU3Vic2V0T2Zcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNTdWJzZXRPZihvdGhlcikge1xuICB2YXIgTyA9IGFTZXQodGhpcyk7XG4gIHZhciBvdGhlclJlYyA9IGdldFNldFJlY29yZChvdGhlcik7XG4gIGlmIChzaXplKE8pID4gb3RoZXJSZWMuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gaXRlcmF0ZShPLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghb3RoZXJSZWMuaW5jbHVkZXMoZSkpIHJldHVybiBmYWxzZTtcbiAgfSwgdHJ1ZSkgIT09IGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Etc2V0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzJykuaGFzO1xudmFyIHNpemUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNpemUnKTtcbnZhciBnZXRTZXRSZWNvcmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1yZWNvcmQnKTtcbnZhciBpdGVyYXRlU2ltcGxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlJyk7XG52YXIgaXRlcmF0b3JDbG9zZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pc1N1cGVyc2V0T2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXQtbWV0aG9kcy8jU2V0LnByb3RvdHlwZS5pc1N1cGVyc2V0T2Zcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNTdXBlcnNldE9mKG90aGVyKSB7XG4gIHZhciBPID0gYVNldCh0aGlzKTtcbiAgdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTtcbiAgaWYgKHNpemUoTykgPCBvdGhlclJlYy5zaXplKSByZXR1cm4gZmFsc2U7XG4gIHZhciBpdGVyYXRvciA9IG90aGVyUmVjLmdldEl0ZXJhdG9yKCk7XG4gIHJldHVybiBpdGVyYXRlU2ltcGxlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghaGFzKE8sIGUpKSByZXR1cm4gaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ25vcm1hbCcsIGZhbHNlKTtcbiAgfSkgIT09IGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpdGVyYXRlU2ltcGxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldCwgZm4sIGludGVycnVwdGlibGUpIHtcbiAgcmV0dXJuIGludGVycnVwdGlibGUgPyBpdGVyYXRlU2ltcGxlKHNldC5rZXlzKCksIGZuLCB0cnVlKSA6IHNldC5mb3JFYWNoKGZuKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldCkge1xuICByZXR1cm4gc2V0LnNpemU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvcicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKENvbnN0cnVjdG9yLCBTUEVDSUVTLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICB9KTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhU2V0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Etc2V0Jyk7XG52YXIgU2V0SGVscGVycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaGVscGVycycpO1xudmFyIGNsb25lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1jbG9uZScpO1xudmFyIGdldFNldFJlY29yZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc2V0LXJlY29yZCcpO1xudmFyIGl0ZXJhdGVTaW1wbGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZS1zaW1wbGUnKTtcblxudmFyIGFkZCA9IFNldEhlbHBlcnMuYWRkO1xudmFyIGhhcyA9IFNldEhlbHBlcnMuaGFzO1xudmFyIHJlbW92ZSA9IFNldEhlbHBlcnMucmVtb3ZlO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5zeW1tZXRyaWNEaWZmZXJlbmNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN5bW1ldHJpY0RpZmZlcmVuY2Uob3RoZXIpIHtcbiAgdmFyIE8gPSBhU2V0KHRoaXMpO1xuICB2YXIga2V5c0l0ZXIgPSBnZXRTZXRSZWNvcmQob3RoZXIpLmdldEl0ZXJhdG9yKCk7XG4gIHZhciByZXN1bHQgPSBjbG9uZShPKTtcbiAgaXRlcmF0ZVNpbXBsZShrZXlzSXRlciwgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoaGFzKE8sIGUpKSByZW1vdmUocmVzdWx0LCBlKTtcbiAgICBlbHNlIGFkZChyZXN1bHQsIGUpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUQUcsIFNUQVRJQywgU0VUX01FVEhPRCkge1xuICB2YXIgdGFyZ2V0ID0gU1RBVElDID8gaXQgOiBpdCAmJiBpdC5wcm90b3R5cGU7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBpZiAoIWhhc093bih0YXJnZXQsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICAgIH1cbiAgICBpZiAoU0VUX01FVEhPRCAmJiAhVE9fU1RSSU5HX1RBR19TVVBQT1JUKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGFyZ2V0LCAndG9TdHJpbmcnLCB0b1N0cmluZyk7XG4gICAgfVxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1zZXQnKTtcbnZhciBhZGQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWhlbHBlcnMnKS5hZGQ7XG52YXIgY2xvbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWNsb25lJyk7XG52YXIgZ2V0U2V0UmVjb3JkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1zZXQtcmVjb3JkJyk7XG52YXIgaXRlcmF0ZVNpbXBsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlLXNpbXBsZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS51bmlvbmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB1bmlvbihvdGhlcikge1xuICB2YXIgTyA9IGFTZXQodGhpcyk7XG4gIHZhciBrZXlzSXRlciA9IGdldFNldFJlY29yZChvdGhlcikuZ2V0SXRlcmF0b3IoKTtcbiAgdmFyIHJlc3VsdCA9IGNsb25lKE8pO1xuICBpdGVyYXRlU2ltcGxlKGtleXNJdGVyLCBmdW5jdGlvbiAoaXQpIHtcbiAgICBhZGQocmVzdWx0LCBpdCk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgZGVmaW5lR2xvYmFsUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eScpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbFRoaXNbU0hBUkVEXSB8fCBkZWZpbmVHbG9iYWxQcm9wZXJ0eShTSEFSRUQsIHt9KTtcblxuKHN0b3JlLnZlcnNpb25zIHx8IChzdG9yZS52ZXJzaW9ucyA9IFtdKSkucHVzaCh7XG4gIHZlcnNpb246ICczLjM4LjAnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTQtMjAyNCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KScsXG4gIGxpY2Vuc2U6ICdodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9ibG9iL3YzLjM4LjAvTElDRU5TRScsXG4gIHNvdXJjZTogJ2h0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgc3RvcmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSB8fCB7fSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNvbnN0cnVjdG9yJyk7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYFNwZWNpZXNDb25zdHJ1Y3RvcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNwZWNpZXNjb25zdHJ1Y3RvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgZGVmYXVsdENvbnN0cnVjdG9yKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IGlzTnVsbE9yVW5kZWZpbmVkKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPyBkZWZhdWx0Q29uc3RydWN0b3IgOiBhQ29uc3RydWN0b3IoUyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbnZhciBjaGFyQXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQXQpO1xudmFyIGNoYXJDb2RlQXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQ29kZUF0KTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChDT05WRVJUX1RPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBwb3MpIHtcbiAgICB2YXIgUyA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTtcbiAgICB2YXIgcG9zaXRpb24gPSB0b0ludGVnZXJPckluZmluaXR5KHBvcyk7XG4gICAgdmFyIHNpemUgPSBTLmxlbmd0aDtcbiAgICB2YXIgZmlyc3QsIHNlY29uZDtcbiAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IHNpemUpIHJldHVybiBDT05WRVJUX1RPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGZpcnN0ID0gY2hhckNvZGVBdChTLCBwb3NpdGlvbik7XG4gICAgcmV0dXJuIGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGIHx8IHBvc2l0aW9uICsgMSA9PT0gc2l6ZVxuICAgICAgfHwgKHNlY29uZCA9IGNoYXJDb2RlQXQoUywgcG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGXG4gICAgICAgID8gQ09OVkVSVF9UT19TVFJJTkdcbiAgICAgICAgICA/IGNoYXJBdChTLCBwb3NpdGlvbilcbiAgICAgICAgICA6IGZpcnN0XG4gICAgICAgIDogQ09OVkVSVF9UT19TVFJJTkdcbiAgICAgICAgICA/IHN0cmluZ1NsaWNlKFMsIHBvc2l0aW9uLCBwb3NpdGlvbiArIDIpXG4gICAgICAgICAgOiAoZmlyc3QgLSAweEQ4MDAgPDwgMTApICsgKHNlY29uZCAtIDB4REMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmNvZGVwb2ludGF0XG4gIGNvZGVBdDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuYXRgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0XG4gIGNoYXJBdDogY3JlYXRlTWV0aG9kKHRydWUpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXBhZC1zdGFydC1lbmRcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciAkcmVwZWF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgcmVwZWF0ID0gdW5jdXJyeVRoaXMoJHJlcGVhdCk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgY2VpbCA9IE1hdGguY2VpbDtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUueyBwYWRTdGFydCwgcGFkRW5kIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfRU5EKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIG1heExlbmd0aCwgZmlsbFN0cmluZykge1xuICAgIHZhciBTID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIHZhciBpbnRNYXhMZW5ndGggPSB0b0xlbmd0aChtYXhMZW5ndGgpO1xuICAgIHZhciBzdHJpbmdMZW5ndGggPSBTLmxlbmd0aDtcbiAgICB2YXIgZmlsbFN0ciA9IGZpbGxTdHJpbmcgPT09IHVuZGVmaW5lZCA/ICcgJyA6IHRvU3RyaW5nKGZpbGxTdHJpbmcpO1xuICAgIHZhciBmaWxsTGVuLCBzdHJpbmdGaWxsZXI7XG4gICAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PT0gJycpIHJldHVybiBTO1xuICAgIGZpbGxMZW4gPSBpbnRNYXhMZW5ndGggLSBzdHJpbmdMZW5ndGg7XG4gICAgc3RyaW5nRmlsbGVyID0gcmVwZWF0KGZpbGxTdHIsIGNlaWwoZmlsbExlbiAvIGZpbGxTdHIubGVuZ3RoKSk7XG4gICAgaWYgKHN0cmluZ0ZpbGxlci5sZW5ndGggPiBmaWxsTGVuKSBzdHJpbmdGaWxsZXIgPSBzdHJpbmdTbGljZShzdHJpbmdGaWxsZXIsIDAsIGZpbGxMZW4pO1xuICAgIHJldHVybiBJU19FTkQgPyBTICsgc3RyaW5nRmlsbGVyIDogc3RyaW5nRmlsbGVyICsgUztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5wYWRzdGFydFxuICBzdGFydDogY3JlYXRlTWV0aG9kKGZhbHNlKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUucGFkRW5kYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZGVuZFxuICBlbmQ6IGNyZWF0ZU1ldGhvZCh0cnVlKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgJFJhbmdlRXJyb3IgPSBSYW5nZUVycm9yO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXRgIG1ldGhvZCBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGVhdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXBlYXQoY291bnQpIHtcbiAgdmFyIHN0ciA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBuID0gdG9JbnRlZ2VyT3JJbmZpbml0eShjb3VudCk7XG4gIGlmIChuIDwgMCB8fCBuID09PSBJbmZpbml0eSkgdGhyb3cgbmV3ICRSYW5nZUVycm9yKCdXcm9uZyBudW1iZXIgb2YgcmVwZXRpdGlvbnMnKTtcbiAgZm9yICg7biA+IDA7IChuID4+Pj0gMSkgJiYgKHN0ciArPSBzdHIpKSBpZiAobiAmIDEpIHJlc3VsdCArPSBzdHI7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXlsnICsgd2hpdGVzcGFjZXMgKyAnXSsnKTtcbnZhciBydHJpbSA9IFJlZ0V4cCgnKF58W14nICsgd2hpdGVzcGFjZXMgKyAnXSlbJyArIHdoaXRlc3BhY2VzICsgJ10rJCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcykge1xuICAgIHZhciBzdHJpbmcgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgbHRyaW0sICcnKTtcbiAgICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHJlcGxhY2Uoc3RyaW5nLCBydHJpbSwgJyQxJyk7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1MZWZ0LCB0cmltU3RhcnQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbXN0YXJ0XG4gIHN0YXJ0OiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbVJpZ2h0LCB0cmltRW5kIH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1lbmRcbiAgZW5kOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuICB0cmltOiBjcmVhdGVNZXRob2QoMylcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXY4LXZlcnNpb24nKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcblxudmFyICRTdHJpbmcgPSBnbG9iYWxUaGlzLlN0cmluZztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBzeW1ib2wgPSBTeW1ib2woJ3N5bWJvbCBkZXRlY3Rpb24nKTtcbiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb25cbiAgLy8gYGdldC1vd24tcHJvcGVydHktc3ltYm9sc2AgcG9seWZpbGwgc3ltYm9scyBjb252ZXJ0ZWQgdG8gb2JqZWN0IGFyZSBub3QgU3ltYm9sIGluc3RhbmNlc1xuICAvLyBuYjogRG8gbm90IGNhbGwgYFN0cmluZ2AgZGlyZWN0bHkgdG8gYXZvaWQgdGhpcyBiZWluZyBvcHRpbWl6ZWQgb3V0IHRvIGBzeW1ib2wrJydgIHdoaWNoIHdpbGwsXG4gIC8vIG9mIGNvdXJzZSwgZmFpbC5cbiAgcmV0dXJuICEkU3RyaW5nKHN5bWJvbCkgfHwgIShPYmplY3Qoc3ltYm9sKSBpbnN0YW5jZW9mIFN5bWJvbCkgfHxcbiAgICAvLyBDaHJvbWUgMzgtNDAgc3ltYm9scyBhcmUgbm90IGluaGVyaXRlZCBmcm9tIERPTSBjb2xsZWN0aW9ucyBwcm90b3R5cGVzIHRvIGluc3RhbmNlc1xuICAgICFTeW1ib2wuc2hhbSAmJiBWOF9WRVJTSU9OICYmIFY4X1ZFUlNJT04gPCA0MTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBTeW1ib2wgPSBnZXRCdWlsdEluKCdTeW1ib2wnKTtcbiAgdmFyIFN5bWJvbFByb3RvdHlwZSA9IFN5bWJvbCAmJiBTeW1ib2wucHJvdG90eXBlO1xuICB2YXIgdmFsdWVPZiA9IFN5bWJvbFByb3RvdHlwZSAmJiBTeW1ib2xQcm90b3R5cGUudmFsdWVPZjtcbiAgdmFyIFRPX1BSSU1JVElWRSA9IHdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTtcblxuICBpZiAoU3ltYm9sUHJvdG90eXBlICYmICFTeW1ib2xQcm90b3R5cGVbVE9fUFJJTUlUSVZFXSkge1xuICAgIC8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3ByaW1pdGl2ZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgLmxlbmd0aFxuICAgIGRlZmluZUJ1aWx0SW4oU3ltYm9sUHJvdG90eXBlLCBUT19QUklNSVRJVkUsIGZ1bmN0aW9uIChoaW50KSB7XG4gICAgICByZXR1cm4gY2FsbCh2YWx1ZU9mLCB0aGlzKTtcbiAgICB9LCB7IGFyaXR5OiAxIH0pO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbnZhciBTeW1ib2wgPSBnZXRCdWlsdEluKCdTeW1ib2wnKTtcbnZhciBrZXlGb3IgPSBTeW1ib2wua2V5Rm9yO1xudmFyIHRoaXNTeW1ib2xWYWx1ZSA9IHVuY3VycnlUaGlzKFN5bWJvbC5wcm90b3R5cGUudmFsdWVPZik7XG5cbi8vIGBTeW1ib2wuaXNSZWdpc3RlcmVkU3ltYm9sYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1zeW1ib2wtcHJlZGljYXRlcy8jc2VjLXN5bWJvbC1pc3JlZ2lzdGVyZWRzeW1ib2xcbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sLmlzUmVnaXN0ZXJlZFN5bWJvbCB8fCBmdW5jdGlvbiBpc1JlZ2lzdGVyZWRTeW1ib2wodmFsdWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4ga2V5Rm9yKHRoaXNTeW1ib2xWYWx1ZSh2YWx1ZSkpICE9PSB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJyk7XG52YXIgJGlzV2VsbEtub3duU3ltYm9sID0gU3ltYm9sLmlzV2VsbEtub3duU3ltYm9sO1xudmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBnZXRCdWlsdEluKCdPYmplY3QnLCAnZ2V0T3duUHJvcGVydHlOYW1lcycpO1xudmFyIHRoaXNTeW1ib2xWYWx1ZSA9IHVuY3VycnlUaGlzKFN5bWJvbC5wcm90b3R5cGUudmFsdWVPZik7XG52YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTtcblxuZm9yICh2YXIgaSA9IDAsIHN5bWJvbEtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzKFN5bWJvbCksIHN5bWJvbEtleXNMZW5ndGggPSBzeW1ib2xLZXlzLmxlbmd0aDsgaSA8IHN5bWJvbEtleXNMZW5ndGg7IGkrKykge1xuICAvLyBzb21lIG9sZCBlbmdpbmVzIHRocm93cyBvbiBhY2Nlc3MgdG8gc29tZSBrZXlzIGxpa2UgYGFyZ3VtZW50c2Agb3IgYGNhbGxlcmBcbiAgdHJ5IHtcbiAgICB2YXIgc3ltYm9sS2V5ID0gc3ltYm9sS2V5c1tpXTtcbiAgICBpZiAoaXNTeW1ib2woU3ltYm9sW3N5bWJvbEtleV0pKSB3ZWxsS25vd25TeW1ib2woc3ltYm9sS2V5KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufVxuXG4vLyBgU3ltYm9sLmlzV2VsbEtub3duU3ltYm9sYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1zeW1ib2wtcHJlZGljYXRlcy8jc2VjLXN5bWJvbC1pc3dlbGxrbm93bnN5bWJvbFxuLy8gV2Ugc2hvdWxkIHBhdGNoIGl0IGZvciBuZXdseSBhZGRlZCB3ZWxsLWtub3duIHN5bWJvbHMuIElmIGl0J3Mgbm90IHJlcXVpcmVkLCB0aGlzIG1vZHVsZSBqdXN0IHdpbGwgbm90IGJlIGluamVjdGVkXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzV2VsbEtub3duU3ltYm9sKHZhbHVlKSB7XG4gIGlmICgkaXNXZWxsS25vd25TeW1ib2wgJiYgJGlzV2VsbEtub3duU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgdmFyIHN5bWJvbCA9IHRoaXNTeW1ib2xWYWx1ZSh2YWx1ZSk7XG4gICAgZm9yICh2YXIgaiA9IDAsIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzKFdlbGxLbm93blN5bWJvbHNTdG9yZSksIGtleXNMZW5ndGggPSBrZXlzLmxlbmd0aDsgaiA8IGtleXNMZW5ndGg7IGorKykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcSAtLSBwb2x5ZmlsbGVkIHN5bWJvbHMgY2FzZVxuICAgICAgaWYgKFdlbGxLbm93blN5bWJvbHNTdG9yZVtrZXlzW2pdXSA9PSBzeW1ib2wpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gc2FmZSAqL1xubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MICYmICEhU3ltYm9sWydmb3InXSAmJiAhIVN5bWJvbC5rZXlGb3I7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGFwcGx5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5Jyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGFycmF5U2xpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2UnKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50Jyk7XG52YXIgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aCcpO1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1pb3MnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLW5vZGUnKTtcblxudmFyIHNldCA9IGdsb2JhbFRoaXMuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyID0gZ2xvYmFsVGhpcy5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsVGhpcy5wcm9jZXNzO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsVGhpcy5EaXNwYXRjaDtcbnZhciBGdW5jdGlvbiA9IGdsb2JhbFRoaXMuRnVuY3Rpb247XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWxUaGlzLk1lc3NhZ2VDaGFubmVsO1xudmFyIFN0cmluZyA9IGdsb2JhbFRoaXMuU3RyaW5nO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgJGxvY2F0aW9uLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcblxuZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBEZW5vIHRocm93cyBhIFJlZmVyZW5jZUVycm9yIG9uIGBsb2NhdGlvbmAgYWNjZXNzIHdpdGhvdXQgYC0tbG9jYXRpb25gIGZsYWdcbiAgJGxvY2F0aW9uID0gZ2xvYmFsVGhpcy5sb2NhdGlvbjtcbn0pO1xuXG52YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChoYXNPd24ocXVldWUsIGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG5cbnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBydW4oaWQpO1xuICB9O1xufTtcblxudmFyIGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuKGV2ZW50LmRhdGEpO1xufTtcblxudmFyIGdsb2JhbFBvc3RNZXNzYWdlRGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gb2xkIGVuZ2luZXMgaGF2ZSBub3QgbG9jYXRpb24ub3JpZ2luXG4gIGdsb2JhbFRoaXMucG9zdE1lc3NhZ2UoU3RyaW5nKGlkKSwgJGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArICRsb2NhdGlvbi5ob3N0KTtcbn07XG5cbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0IHx8ICFjbGVhcikge1xuICBzZXQgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoaGFuZGxlcikge1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBmbiA9IGlzQ2FsbGFibGUoaGFuZGxlcikgPyBoYW5kbGVyIDogRnVuY3Rpb24oaGFuZGxlcik7XG4gICAgdmFyIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGFwcGx5KGZuLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKElTX05PREUpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhydW5uZXIoaWQpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgLy8gZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82MjRcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCAmJiAhSVNfSU9TKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZXZlbnRMaXN0ZW5lcjtcbiAgICBkZWZlciA9IGJpbmQocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKFxuICAgIGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lciAmJlxuICAgIGlzQ2FsbGFibGUoZ2xvYmFsVGhpcy5wb3N0TWVzc2FnZSkgJiZcbiAgICAhZ2xvYmFsVGhpcy5pbXBvcnRTY3JpcHRzICYmXG4gICAgJGxvY2F0aW9uICYmICRsb2NhdGlvbi5wcm90b2NvbCAhPT0gJ2ZpbGU6JyAmJlxuICAgICFmYWlscyhnbG9iYWxQb3N0TWVzc2FnZURlZmVyKVxuICApIHtcbiAgICBkZWZlciA9IGdsb2JhbFBvc3RNZXNzYWdlRGVmZXI7XG4gICAgZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZiAoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bihpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHNldFRpbWVvdXQocnVubmVyKGlkKSwgMCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGNsZWFyOiBjbGVhclxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzpcbi8vIExldCBpbnRlZ2VyIGJlID8gVG9JbnRlZ2VyKGluZGV4KS5cbi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGludGVnZXIsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXQpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdHJ1bmMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWF0aC10cnVuYycpO1xuXG4vLyBgVG9JbnRlZ2VyT3JJbmZpbml0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvaW50ZWdlcm9yaW5maW5pdHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBudW1iZXIgPSArYXJndW1lbnQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gIHJldHVybiBudW1iZXIgIT09IG51bWJlciB8fCBudW1iZXIgPT09IDAgPyAwIDogdHJ1bmMobnVtYmVyKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYFRvTGVuZ3RoYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9sZW5ndGhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBsZW4gPSB0b0ludGVnZXJPckluZmluaXR5KGFyZ3VtZW50KTtcbiAgcmV0dXJuIGxlbiA+IDAgPyBtaW4obGVuLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gJE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xudmFyIGdldE1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtbWV0aG9kJyk7XG52YXIgb3JkaW5hcnlUb1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vcmRpbmFyeS10by1wcmltaXRpdmUnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgVE9fUFJJTUlUSVZFID0gd2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpO1xuXG4vLyBgVG9QcmltaXRpdmVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHtcbiAgaWYgKCFpc09iamVjdChpbnB1dCkgfHwgaXNTeW1ib2woaW5wdXQpKSByZXR1cm4gaW5wdXQ7XG4gIHZhciBleG90aWNUb1ByaW0gPSBnZXRNZXRob2QoaW5wdXQsIFRPX1BSSU1JVElWRSk7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChleG90aWNUb1ByaW0pIHtcbiAgICBpZiAocHJlZiA9PT0gdW5kZWZpbmVkKSBwcmVmID0gJ2RlZmF1bHQnO1xuICAgIHJlc3VsdCA9IGNhbGwoZXhvdGljVG9QcmltLCBpbnB1dCwgcHJlZik7XG4gICAgaWYgKCFpc09iamVjdChyZXN1bHQpIHx8IGlzU3ltYm9sKHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG4gIH1cbiAgaWYgKHByZWYgPT09IHVuZGVmaW5lZCkgcHJlZiA9ICdudW1iZXInO1xuICByZXR1cm4gb3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgcHJlZik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCcpO1xuXG4vLyBgVG9Qcm9wZXJ0eUtleWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ3N0cmluZycpO1xuICByZXR1cm4gaXNTeW1ib2woa2V5KSA/IGtleSA6IGtleSArICcnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xuXG52YXIgJFN0cmluZyA9IFN0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGNsYXNzb2YoYXJndW1lbnQpID09PSAnU3ltYm9sJykgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcnKTtcbiAgcmV0dXJuICRTdHJpbmcoYXJndW1lbnQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB0cnkge1xuICAgIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbnZhciBpZCA9IDA7XG52YXIgcG9zdGZpeCA9IE1hdGgucmFuZG9tKCk7XG52YXIgdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcygxLjAudG9TdHJpbmcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJyArIChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5KSArICcpXycgKyB0b1N0cmluZygrK2lkICsgcG9zdGZpeCwgMzYpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLXN5bWJvbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9TWU1CT0xcbiAgJiYgIVN5bWJvbC5zaGFtXG4gICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBWOCB+IENocm9tZSAzNi1cbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMzMzRcbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCAncHJvdG90eXBlJywge1xuICAgIHZhbHVlOiA0MixcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSkucHJvdG90eXBlICE9PSA0Mjtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHBhc3NlZCwgcmVxdWlyZWQpIHtcbiAgaWYgKHBhc3NlZCA8IHJlcXVpcmVkKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignTm90IGVub3VnaCBhcmd1bWVudHMnKTtcbiAgcmV0dXJuIHBhc3NlZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxudmFyIFdlYWtNYXAgPSBnbG9iYWxUaGlzLldlYWtNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNDYWxsYWJsZShXZWFrTWFwKSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoU3RyaW5nKFdlYWtNYXApKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FKSB7XG4gIHZhciBTeW1ib2wgPSBwYXRoLlN5bWJvbCB8fCAocGF0aC5TeW1ib2wgPSB7fSk7XG4gIGlmICghaGFzT3duKFN5bWJvbCwgTkFNRSkpIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgTkFNRSwge1xuICAgIHZhbHVlOiB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYoTkFNRSlcbiAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG5leHBvcnRzLmYgPSB3ZWxsS25vd25TeW1ib2w7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCcpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsVGhpcy5TeW1ib2w7XG52YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTtcbnZhciBjcmVhdGVXZWxsS25vd25TeW1ib2wgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IFN5bWJvbFsnZm9yJ10gfHwgU3ltYm9sIDogU3ltYm9sICYmIFN5bWJvbC53aXRob3V0U2V0dGVyIHx8IHVpZDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICBpZiAoIWhhc093bihXZWxsS25vd25TeW1ib2xzU3RvcmUsIG5hbWUpKSB7XG4gICAgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gTkFUSVZFX1NZTUJPTCAmJiBoYXNPd24oU3ltYm9sLCBuYW1lKVxuICAgICAgPyBTeW1ib2xbbmFtZV1cbiAgICAgIDogY3JlYXRlV2VsbEtub3duU3ltYm9sKCdTeW1ib2wuJyArIG5hbWUpO1xuICB9IHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gYSBzdHJpbmcgb2YgYWxsIHZhbGlkIHVuaWNvZGUgd2hpdGVzcGFjZXNcbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyJyArXG4gICdcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBpbnN0YWxsRXJyb3JDYXVzZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnN0YWxsLWVycm9yLWNhdXNlJyk7XG52YXIgaW5zdGFsbEVycm9yU3RhY2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbCcpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgJEVycm9yID0gRXJyb3I7XG52YXIgcHVzaCA9IFtdLnB1c2g7XG5cbnZhciAkQWdncmVnYXRlRXJyb3IgPSBmdW5jdGlvbiBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIG1lc3NhZ2UgLyogLCBvcHRpb25zICovKSB7XG4gIHZhciBpc0luc3RhbmNlID0gaXNQcm90b3R5cGVPZihBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSwgdGhpcyk7XG4gIHZhciB0aGF0O1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICB0aGF0ID0gc2V0UHJvdG90eXBlT2YobmV3ICRFcnJvcigpLCBpc0luc3RhbmNlID8gZ2V0UHJvdG90eXBlT2YodGhpcykgOiBBZ2dyZWdhdGVFcnJvclByb3RvdHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhhdCA9IGlzSW5zdGFuY2UgPyB0aGlzIDogY3JlYXRlKEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlKTtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGhhdCwgVE9fU1RSSU5HX1RBRywgJ0Vycm9yJyk7XG4gIH1cbiAgaWYgKG1lc3NhZ2UgIT09IHVuZGVmaW5lZCkgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdtZXNzYWdlJywgbm9ybWFsaXplU3RyaW5nQXJndW1lbnQobWVzc2FnZSkpO1xuICBpbnN0YWxsRXJyb3JTdGFjayh0aGF0LCAkQWdncmVnYXRlRXJyb3IsIHRoYXQuc3RhY2ssIDEpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIGluc3RhbGxFcnJvckNhdXNlKHRoYXQsIGFyZ3VtZW50c1syXSk7XG4gIHZhciBlcnJvcnNBcnJheSA9IFtdO1xuICBpdGVyYXRlKGVycm9ycywgcHVzaCwgeyB0aGF0OiBlcnJvcnNBcnJheSB9KTtcbiAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRoYXQsICdlcnJvcnMnLCBlcnJvcnNBcnJheSk7XG4gIHJldHVybiB0aGF0O1xufTtcblxuaWYgKHNldFByb3RvdHlwZU9mKSBzZXRQcm90b3R5cGVPZigkQWdncmVnYXRlRXJyb3IsICRFcnJvcik7XG5lbHNlIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoJEFnZ3JlZ2F0ZUVycm9yLCAkRXJyb3IsIHsgbmFtZTogdHJ1ZSB9KTtcblxudmFyIEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlID0gJEFnZ3JlZ2F0ZUVycm9yLnByb3RvdHlwZSA9IGNyZWF0ZSgkRXJyb3IucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJEFnZ3JlZ2F0ZUVycm9yKSxcbiAgbWVzc2FnZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsICcnKSxcbiAgbmFtZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsICdBZ2dyZWdhdGVFcnJvcicpXG59KTtcblxuLy8gYEFnZ3JlZ2F0ZUVycm9yYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hZ2dyZWdhdGUtZXJyb3ItY29uc3RydWN0b3JcbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBhcml0eTogMiB9LCB7XG4gIEFnZ3JlZ2F0ZUVycm9yOiAkQWdncmVnYXRlRXJyb3Jcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbW9kdWxlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyByZXBsYWNlZCB0byBtb2R1bGUgYmVsb3dcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYWdncmVnYXRlLWVycm9yLmNvbnN0cnVjdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2VzLW5vdC1leGNlZWQtc2FmZS1pbnRlZ2VyJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG52YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIFY4X1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdjgtdmVyc2lvbicpO1xuXG52YXIgSVNfQ09OQ0FUX1NQUkVBREFCTEUgPSB3ZWxsS25vd25TeW1ib2woJ2lzQ29uY2F0U3ByZWFkYWJsZScpO1xuXG4vLyBXZSBjYW4ndCB1c2UgdGhpcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbi8vIGRlb3B0aW1pemF0aW9uIGFuZCBzZXJpb3VzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjc5XG52YXIgSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCA9IFY4X1ZFUlNJT04gPj0gNTEgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFycmF5ID0gW107XG4gIGFycmF5W0lTX0NPTkNBVF9TUFJFQURBQkxFXSA9IGZhbHNlO1xuICByZXR1cm4gYXJyYXkuY29uY2F0KClbMF0gIT09IGFycmF5O1xufSk7XG5cbnZhciBpc0NvbmNhdFNwcmVhZGFibGUgPSBmdW5jdGlvbiAoTykge1xuICBpZiAoIWlzT2JqZWN0KE8pKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzcHJlYWRhYmxlID0gT1tJU19DT05DQVRfU1BSRUFEQUJMRV07XG4gIHJldHVybiBzcHJlYWRhYmxlICE9PSB1bmRlZmluZWQgPyAhIXNwcmVhZGFibGUgOiBpc0FycmF5KE8pO1xufTtcblxudmFyIEZPUkNFRCA9ICFJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUIHx8ICFhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdjb25jYXQnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5jb25jYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuY29uY2F0XG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAaXNDb25jYXRTcHJlYWRhYmxlIGFuZCBAQHNwZWNpZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBhcml0eTogMSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICBjb25jYXQ6IGZ1bmN0aW9uIGNvbmNhdChhcmcpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApO1xuICAgIHZhciBuID0gMDtcbiAgICB2YXIgaSwgaywgbGVuZ3RoLCBsZW4sIEU7XG4gICAgZm9yIChpID0gLTEsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgRSA9IGkgPT09IC0xID8gTyA6IGFyZ3VtZW50c1tpXTtcbiAgICAgIGlmIChpc0NvbmNhdFNwcmVhZGFibGUoRSkpIHtcbiAgICAgICAgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoRSk7XG4gICAgICAgIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlcihuICsgbGVuKTtcbiAgICAgICAgZm9yIChrID0gMDsgayA8IGxlbjsgaysrLCBuKyspIGlmIChrIGluIEUpIGNyZWF0ZVByb3BlcnR5KEEsIG4sIEVba10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyKG4gKyAxKTtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkoQSwgbisrLCBFKTtcbiAgICAgIH1cbiAgICB9XG4gICAgQS5sZW5ndGggPSBuO1xuICAgIHJldHVybiBBO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRldmVyeSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5ldmVyeTtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcblxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdldmVyeScpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5XG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhU1RSSUNUX01FVEhPRCB9LCB7XG4gIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkZXZlcnkodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRmaWx0ZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZmlsdGVyO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcblxudmFyIEhBU19TUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdmaWx0ZXInKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAc3BlY2llc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIUhBU19TUEVDSUVTX1NVUFBPUlQgfSwge1xuICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkZmlsdGVyKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZmluZEluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZpbmRJbmRleDtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xuXG52YXIgRklORF9JTkRFWCA9ICdmaW5kSW5kZXgnO1xudmFyIFNLSVBTX0hPTEVTID0gdHJ1ZTtcblxuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1wcm90b3R5cGUtZmluZGluZGV4IC0tIHRlc3RpbmdcbmlmIChGSU5EX0lOREVYIGluIFtdKSBBcnJheSgxKVtGSU5EX0lOREVYXShmdW5jdGlvbiAoKSB7IFNLSVBTX0hPTEVTID0gZmFsc2U7IH0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kaW5kZXhcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFNLSVBTX0hPTEVTIH0sIHtcbiAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmRJbmRleCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKEZJTkRfSU5ERVgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZmluZDtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xuXG52YXIgRklORCA9ICdmaW5kJztcbnZhciBTS0lQU19IT0xFUyA9IHRydWU7XG5cbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWZpbmQgLS0gdGVzdGluZ1xuaWYgKEZJTkQgaW4gW10pIEFycmF5KDEpW0ZJTkRdKGZ1bmN0aW9uICgpIHsgU0tJUFNfSE9MRVMgPSBmYWxzZTsgfSk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmluZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTS0lQU19IT0xFUyB9LCB7XG4gIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcyhGSU5EKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktZm9yLWVhY2gnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1wcm90b3R5cGUtZm9yZWFjaCAtLSBzYWZlXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBbXS5mb3JFYWNoICE9PSBmb3JFYWNoIH0sIHtcbiAgZm9yRWFjaDogZm9yRWFjaFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZyb20nKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20gLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgQXJyYXkuZnJvbShpdGVyYWJsZSk7XG59KTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5mcm9tXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICBmcm9tOiBmcm9tXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRpbmNsdWRlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluY2x1ZGVzO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcblxuLy8gRkY5OSsgYnVnXG52YXIgQlJPS0VOX09OX1NQQVJTRSA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LXByb3RvdHlwZS1pbmNsdWRlcyAtLSBkZXRlY3Rpb25cbiAgcmV0dXJuICFBcnJheSgxKS5pbmNsdWRlcygpO1xufSk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEJST0tFTl9PTl9TUEFSU0UgfSwge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuICRpbmNsdWRlcyh0aGlzLCBlbCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuYWRkVG9VbnNjb3BhYmxlcygnaW5jbHVkZXMnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLWFycmF5LXByb3RvdHlwZS1pbmRleG9mIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlJyk7XG52YXIgJGluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKS5pbmRleE9mO1xudmFyIGFycmF5TWV0aG9kSXNTdHJpY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdCcpO1xuXG52YXIgbmF0aXZlSW5kZXhPZiA9IHVuY3VycnlUaGlzKFtdLmluZGV4T2YpO1xuXG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhbmF0aXZlSW5kZXhPZiAmJiAxIC8gbmF0aXZlSW5kZXhPZihbMV0sIDEsIC0wKSA8IDA7XG52YXIgRk9SQ0VEID0gTkVHQVRJVkVfWkVSTyB8fCAhYXJyYXlNZXRob2RJc1N0cmljdCgnaW5kZXhPZicpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZlxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHZhciBmcm9tSW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gTkVHQVRJVkVfWkVST1xuICAgICAgLy8gY29udmVydCAtMCB0byArMFxuICAgICAgPyBuYXRpdmVJbmRleE9mKHRoaXMsIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCkgfHwgMFxuICAgICAgOiAkaW5kZXhPZih0aGlzLCBzZWFyY2hFbGVtZW50LCBmcm9tSW5kZXgpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcblxuLy8gYEFycmF5LmlzQXJyYXlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5pc2FycmF5XG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNBcnJheTogaXNBcnJheVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZScpO1xudmFyIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXItcmVzdWx0LW9iamVjdCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbnZhciBBUlJBWV9JVEVSQVRPUiA9ICdBcnJheSBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihBUlJBWV9JVEVSQVRPUik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5lbnRyaWVzXG4vLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUua2V5c1xuLy8gYEFycmF5LnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUudmFsdWVzXG4vLyBgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAaXRlcmF0b3Jcbi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlYXJyYXlpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVJdGVyYXRvcihBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IEFSUkFZX0lURVJBVE9SLFxuICAgIHRhcmdldDogdG9JbmRleGVkT2JqZWN0KGl0ZXJhdGVkKSwgLy8gdGFyZ2V0XG4gICAgaW5kZXg6IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gICAga2luZDoga2luZCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gIH0pO1xuLy8gYCVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWFycmF5aXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHRhcmdldCA9IHN0YXRlLnRhcmdldDtcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXgrKztcbiAgaWYgKCF0YXJnZXQgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aCkge1xuICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdCh1bmRlZmluZWQsIHRydWUpO1xuICB9XG4gIHN3aXRjaCAoc3RhdGUua2luZCkge1xuICAgIGNhc2UgJ2tleXMnOiByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdChpbmRleCwgZmFsc2UpO1xuICAgIGNhc2UgJ3ZhbHVlcyc6IHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHRhcmdldFtpbmRleF0sIGZhbHNlKTtcbiAgfSByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdChbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBmYWxzZSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGV1bm1hcHBlZGFyZ3VtZW50c29iamVjdFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3RcbnZhciB2YWx1ZXMgPSBJdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcblxuLy8gVjggfiBDaHJvbWUgNDUtIGJ1Z1xuaWYgKCFJU19QVVJFICYmIERFU0NSSVBUT1JTICYmIHZhbHVlcy5uYW1lICE9PSAndmFsdWVzJykgdHJ5IHtcbiAgZGVmaW5lUHJvcGVydHkodmFsdWVzLCAnbmFtZScsIHsgdmFsdWU6ICd2YWx1ZXMnIH0pO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJG1hcCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5tYXA7XG52YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydCcpO1xuXG52YXIgSEFTX1NQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ21hcCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLm1hcGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXBcbi8vIHdpdGggYWRkaW5nIHN1cHBvcnQgb2YgQEBzcGVjaWVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhSEFTX1NQRUNJRVNfU1VQUE9SVCB9LCB7XG4gIG1hcDogZnVuY3Rpb24gbWFwKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRtYXAodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRyZWR1Y2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktcmVkdWNlJykubGVmdDtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QnKTtcbnZhciBDSFJPTUVfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC12OC12ZXJzaW9uJyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1ub2RlJyk7XG5cbi8vIENocm9tZSA4MC04MiBoYXMgYSBjcml0aWNhbCBidWdcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwNDk5ODJcbnZhciBDSFJPTUVfQlVHID0gIUlTX05PREUgJiYgQ0hST01FX1ZFUlNJT04gPiA3OSAmJiBDSFJPTUVfVkVSU0lPTiA8IDgzO1xudmFyIEZPUkNFRCA9IENIUk9NRV9CVUcgfHwgIWFycmF5TWV0aG9kSXNTdHJpY3QoJ3JlZHVjZScpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnJlZHVjZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICByZXR1cm4gJHJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBsZW5ndGgsIGxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0Jyk7XG52YXIgbmF0aXZlU2xpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2UnKTtcblxudmFyIEhBU19TUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdzbGljZScpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyICRBcnJheSA9IEFycmF5O1xudmFyIG1heCA9IE1hdGgubWF4O1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnNsaWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNsaWNlXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2UgRVMzIHN0cmluZ3MgYW5kIERPTSBvYmplY3RzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhSEFTX1NQRUNJRVNfU1VQUE9SVCB9LCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBrID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW5ndGgpO1xuICAgIHZhciBmaW4gPSB0b0Fic29sdXRlSW5kZXgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQsIGxlbmd0aCk7XG4gICAgLy8gaW5saW5lIGBBcnJheVNwZWNpZXNDcmVhdGVgIGZvciB1c2FnZSBuYXRpdmUgYEFycmF5I3NsaWNlYCB3aGVyZSBpdCdzIHBvc3NpYmxlXG4gICAgdmFyIENvbnN0cnVjdG9yLCByZXN1bHQsIG47XG4gICAgaWYgKGlzQXJyYXkoTykpIHtcbiAgICAgIENvbnN0cnVjdG9yID0gTy5jb25zdHJ1Y3RvcjtcbiAgICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgICBpZiAoaXNDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvcikgJiYgKENvbnN0cnVjdG9yID09PSAkQXJyYXkgfHwgaXNBcnJheShDb25zdHJ1Y3Rvci5wcm90b3R5cGUpKSkge1xuICAgICAgICBDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoQ29uc3RydWN0b3IpKSB7XG4gICAgICAgIENvbnN0cnVjdG9yID0gQ29uc3RydWN0b3JbU1BFQ0lFU107XG4gICAgICAgIGlmIChDb25zdHJ1Y3RvciA9PT0gbnVsbCkgQ29uc3RydWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoQ29uc3RydWN0b3IgPT09ICRBcnJheSB8fCBDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVTbGljZShPLCBrLCBmaW4pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQgPSBuZXcgKENvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgPyAkQXJyYXkgOiBDb25zdHJ1Y3RvcikobWF4KGZpbiAtIGssIDApKTtcbiAgICBmb3IgKG4gPSAwOyBrIDwgZmluOyBrKyssIG4rKykgaWYgKGsgaW4gTykgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBuLCBPW2tdKTtcbiAgICByZXN1bHQubGVuZ3RoID0gbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBkZWxldGVQcm9wZXJ0eU9yVGhyb3cgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpbnRlcm5hbFNvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc29ydCcpO1xudmFyIGFycmF5TWV0aG9kSXNTdHJpY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdCcpO1xudmFyIEZGID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LWZmLXZlcnNpb24nKTtcbnZhciBJRV9PUl9FREdFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLWllLW9yLWVkZ2UnKTtcbnZhciBWOCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC12OC12ZXJzaW9uJyk7XG52YXIgV0VCS0lUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXdlYmtpdC12ZXJzaW9uJyk7XG5cbnZhciB0ZXN0ID0gW107XG52YXIgbmF0aXZlU29ydCA9IHVuY3VycnlUaGlzKHRlc3Quc29ydCk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKHRlc3QucHVzaCk7XG5cbi8vIElFOC1cbnZhciBGQUlMU19PTl9VTkRFRklORUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHRlc3Quc29ydCh1bmRlZmluZWQpO1xufSk7XG4vLyBWOCBidWdcbnZhciBGQUlMU19PTl9OVUxMID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICB0ZXN0LnNvcnQobnVsbCk7XG59KTtcbi8vIE9sZCBXZWJLaXRcbnZhciBTVFJJQ1RfTUVUSE9EID0gYXJyYXlNZXRob2RJc1N0cmljdCgnc29ydCcpO1xuXG52YXIgU1RBQkxFX1NPUlQgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBmZWF0dXJlIGRldGVjdGlvbiBjYW4gYmUgdG9vIHNsb3csIHNvIGNoZWNrIGVuZ2luZXMgdmVyc2lvbnNcbiAgaWYgKFY4KSByZXR1cm4gVjggPCA3MDtcbiAgaWYgKEZGICYmIEZGID4gMykgcmV0dXJuO1xuICBpZiAoSUVfT1JfRURHRSkgcmV0dXJuIHRydWU7XG4gIGlmIChXRUJLSVQpIHJldHVybiBXRUJLSVQgPCA2MDM7XG5cbiAgdmFyIHJlc3VsdCA9ICcnO1xuICB2YXIgY29kZSwgY2hyLCB2YWx1ZSwgaW5kZXg7XG5cbiAgLy8gZ2VuZXJhdGUgYW4gYXJyYXkgd2l0aCBtb3JlIDUxMiBlbGVtZW50cyAoQ2hha3JhIGFuZCBvbGQgVjggZmFpbHMgb25seSBpbiB0aGlzIGNhc2UpXG4gIGZvciAoY29kZSA9IDY1OyBjb2RlIDwgNzY7IGNvZGUrKykge1xuICAgIGNociA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7XG5cbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgNjY6IGNhc2UgNjk6IGNhc2UgNzA6IGNhc2UgNzI6IHZhbHVlID0gMzsgYnJlYWs7XG4gICAgICBjYXNlIDY4OiBjYXNlIDcxOiB2YWx1ZSA9IDQ7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogdmFsdWUgPSAyO1xuICAgIH1cblxuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDQ3OyBpbmRleCsrKSB7XG4gICAgICB0ZXN0LnB1c2goeyBrOiBjaHIgKyBpbmRleCwgdjogdmFsdWUgfSk7XG4gICAgfVxuICB9XG5cbiAgdGVzdC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBiLnYgLSBhLnY7IH0pO1xuXG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRlc3QubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY2hyID0gdGVzdFtpbmRleF0uay5jaGFyQXQoMCk7XG4gICAgaWYgKHJlc3VsdC5jaGFyQXQocmVzdWx0Lmxlbmd0aCAtIDEpICE9PSBjaHIpIHJlc3VsdCArPSBjaHI7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0ICE9PSAnREdCRUZIQUNJSksnO1xufSk7XG5cbnZhciBGT1JDRUQgPSBGQUlMU19PTl9VTkRFRklORUQgfHwgIUZBSUxTX09OX05VTEwgfHwgIVNUUklDVF9NRVRIT0QgfHwgIVNUQUJMRV9TT1JUO1xuXG52YXIgZ2V0U29ydENvbXBhcmUgPSBmdW5jdGlvbiAoY29tcGFyZWZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeCwgeSkge1xuICAgIGlmICh5ID09PSB1bmRlZmluZWQpIHJldHVybiAtMTtcbiAgICBpZiAoeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMTtcbiAgICBpZiAoY29tcGFyZWZuICE9PSB1bmRlZmluZWQpIHJldHVybiArY29tcGFyZWZuKHgsIHkpIHx8IDA7XG4gICAgcmV0dXJuIHRvU3RyaW5nKHgpID4gdG9TdHJpbmcoeSkgPyAxIDogLTE7XG4gIH07XG59O1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29ydFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHtcbiAgICBpZiAoY29tcGFyZWZuICE9PSB1bmRlZmluZWQpIGFDYWxsYWJsZShjb21wYXJlZm4pO1xuXG4gICAgdmFyIGFycmF5ID0gdG9PYmplY3QodGhpcyk7XG5cbiAgICBpZiAoU1RBQkxFX1NPUlQpIHJldHVybiBjb21wYXJlZm4gPT09IHVuZGVmaW5lZCA/IG5hdGl2ZVNvcnQoYXJyYXkpIDogbmF0aXZlU29ydChhcnJheSwgY29tcGFyZWZuKTtcblxuICAgIHZhciBpdGVtcyA9IFtdO1xuICAgIHZhciBhcnJheUxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGFycmF5KTtcbiAgICB2YXIgaXRlbXNMZW5ndGgsIGluZGV4O1xuXG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYXJyYXlMZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmIChpbmRleCBpbiBhcnJheSkgcHVzaChpdGVtcywgYXJyYXlbaW5kZXhdKTtcbiAgICB9XG5cbiAgICBpbnRlcm5hbFNvcnQoaXRlbXMsIGdldFNvcnRDb21wYXJlKGNvbXBhcmVmbikpO1xuXG4gICAgaXRlbXNMZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShpdGVtcyk7XG4gICAgaW5kZXggPSAwO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgaXRlbXNMZW5ndGgpIGFycmF5W2luZGV4XSA9IGl0ZW1zW2luZGV4KytdO1xuICAgIHdoaWxlIChpbmRleCA8IGFycmF5TGVuZ3RoKSBkZWxldGVQcm9wZXJ0eU9yVGhyb3coYXJyYXksIGluZGV4KyspO1xuXG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG52YXIgc2V0QXJyYXlMZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc2V0LWxlbmd0aCcpO1xudmFyIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2VzLW5vdC1leGNlZWQtc2FmZS1pbnRlZ2VyJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZGVsZXRlUHJvcGVydHlPclRocm93ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlbGV0ZS1wcm9wZXJ0eS1vci10aHJvdycpO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcblxudmFyIEhBU19TUEVDSUVTX1NVUFBPUlQgPSBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KCdzcGxpY2UnKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zcGxpY2Vcbi8vIHdpdGggYWRkaW5nIHN1cHBvcnQgb2YgQEBzcGVjaWVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhSEFTX1NQRUNJRVNfU1VQUE9SVCB9LCB7XG4gIHNwbGljZTogZnVuY3Rpb24gc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCAvKiAsIC4uLml0ZW1zICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIGFjdHVhbFN0YXJ0ID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW4pO1xuICAgIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBpbnNlcnRDb3VudCwgYWN0dWFsRGVsZXRlQ291bnQsIEEsIGssIGZyb20sIHRvO1xuICAgIGlmIChhcmd1bWVudHNMZW5ndGggPT09IDApIHtcbiAgICAgIGluc2VydENvdW50ID0gYWN0dWFsRGVsZXRlQ291bnQgPSAwO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzTGVuZ3RoID09PSAxKSB7XG4gICAgICBpbnNlcnRDb3VudCA9IDA7XG4gICAgICBhY3R1YWxEZWxldGVDb3VudCA9IGxlbiAtIGFjdHVhbFN0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnNlcnRDb3VudCA9IGFyZ3VtZW50c0xlbmd0aCAtIDI7XG4gICAgICBhY3R1YWxEZWxldGVDb3VudCA9IG1pbihtYXgodG9JbnRlZ2VyT3JJbmZpbml0eShkZWxldGVDb3VudCksIDApLCBsZW4gLSBhY3R1YWxTdGFydCk7XG4gICAgfVxuICAgIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlcihsZW4gKyBpbnNlcnRDb3VudCAtIGFjdHVhbERlbGV0ZUNvdW50KTtcbiAgICBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIGFjdHVhbERlbGV0ZUNvdW50KTtcbiAgICBmb3IgKGsgPSAwOyBrIDwgYWN0dWFsRGVsZXRlQ291bnQ7IGsrKykge1xuICAgICAgZnJvbSA9IGFjdHVhbFN0YXJ0ICsgaztcbiAgICAgIGlmIChmcm9tIGluIE8pIGNyZWF0ZVByb3BlcnR5KEEsIGssIE9bZnJvbV0pO1xuICAgIH1cbiAgICBBLmxlbmd0aCA9IGFjdHVhbERlbGV0ZUNvdW50O1xuICAgIGlmIChpbnNlcnRDb3VudCA8IGFjdHVhbERlbGV0ZUNvdW50KSB7XG4gICAgICBmb3IgKGsgPSBhY3R1YWxTdGFydDsgayA8IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50OyBrKyspIHtcbiAgICAgICAgZnJvbSA9IGsgKyBhY3R1YWxEZWxldGVDb3VudDtcbiAgICAgICAgdG8gPSBrICsgaW5zZXJ0Q291bnQ7XG4gICAgICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTtcbiAgICAgICAgZWxzZSBkZWxldGVQcm9wZXJ0eU9yVGhyb3coTywgdG8pO1xuICAgICAgfVxuICAgICAgZm9yIChrID0gbGVuOyBrID4gbGVuIC0gYWN0dWFsRGVsZXRlQ291bnQgKyBpbnNlcnRDb3VudDsgay0tKSBkZWxldGVQcm9wZXJ0eU9yVGhyb3coTywgayAtIDEpO1xuICAgIH0gZWxzZSBpZiAoaW5zZXJ0Q291bnQgPiBhY3R1YWxEZWxldGVDb3VudCkge1xuICAgICAgZm9yIChrID0gbGVuIC0gYWN0dWFsRGVsZXRlQ291bnQ7IGsgPiBhY3R1YWxTdGFydDsgay0tKSB7XG4gICAgICAgIGZyb20gPSBrICsgYWN0dWFsRGVsZXRlQ291bnQgLSAxO1xuICAgICAgICB0byA9IGsgKyBpbnNlcnRDb3VudCAtIDE7XG4gICAgICAgIGlmIChmcm9tIGluIE8pIE9bdG9dID0gT1tmcm9tXTtcbiAgICAgICAgZWxzZSBkZWxldGVQcm9wZXJ0eU9yVGhyb3coTywgdG8pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGsgPSAwOyBrIDwgaW5zZXJ0Q291bnQ7IGsrKykge1xuICAgICAgT1trICsgYWN0dWFsU3RhcnRdID0gYXJndW1lbnRzW2sgKyAyXTtcbiAgICB9XG4gICAgc2V0QXJyYXlMZW5ndGgoTywgbGVuIC0gYWN0dWFsRGVsZXRlQ291bnQgKyBpbnNlcnRDb3VudCk7XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgdG9JU09TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGF0ZS10by1pc28tc3RyaW5nJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgRGF0ZShOYU4pLnRvSlNPTigpICE9PSBudWxsXG4gICAgfHwgY2FsbChEYXRlLnByb3RvdHlwZS50b0pTT04sIHsgdG9JU09TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0gfSkgIT09IDE7XG59KTtcblxuLy8gYERhdGUucHJvdG90eXBlLnRvSlNPTmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWRhdGUucHJvdG90eXBlLnRvanNvblxuJCh7IHRhcmdldDogJ0RhdGUnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBwdiA9IHRvUHJpbWl0aXZlKE8sICdudW1iZXInKTtcbiAgICByZXR1cm4gdHlwZW9mIHB2ID09ICdudW1iZXInICYmICFpc0Zpbml0ZShwdikgPyBudWxsIDpcbiAgICAgICghKCd0b0lTT1N0cmluZycgaW4gTykgJiYgY2xhc3NvZihPKSA9PT0gJ0RhdGUnKSA/IGNhbGwodG9JU09TdHJpbmcsIE8pIDogTy50b0lTT1N0cmluZygpO1xuICB9XG59KTtcbiIsIi8vIGVtcHR5XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kJyk7XG5cbi8vIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tZnVuY3Rpb24tcHJvdG90eXBlLWJpbmQgLS0gZGV0ZWN0aW9uXG4kKHsgdGFyZ2V0OiAnRnVuY3Rpb24nLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGdW5jdGlvbi5iaW5kICE9PSBiaW5kIH0sIHtcbiAgYmluZDogYmluZFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGFwcGx5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xudmFyIGdldFJlcGxhY2VyRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWpzb24tcmVwbGFjZXItZnVuY3Rpb24nKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcblxudmFyICRTdHJpbmcgPSBTdHJpbmc7XG52YXIgJHN0cmluZ2lmeSA9IGdldEJ1aWx0SW4oJ0pTT04nLCAnc3RyaW5naWZ5Jyk7XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKC8uLy5leGVjKTtcbnZhciBjaGFyQXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQXQpO1xudmFyIGNoYXJDb2RlQXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQ29kZUF0KTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgbnVtYmVyVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcygxLjAudG9TdHJpbmcpO1xuXG52YXIgdGVzdGVyID0gL1tcXHVEODAwLVxcdURGRkZdL2c7XG52YXIgbG93ID0gL15bXFx1RDgwMC1cXHVEQkZGXSQvO1xudmFyIGhpID0gL15bXFx1REMwMC1cXHVERkZGXSQvO1xuXG52YXIgV1JPTkdfU1lNQk9MU19DT05WRVJTSU9OID0gIU5BVElWRV9TWU1CT0wgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgc3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJykoJ3N0cmluZ2lmeSBkZXRlY3Rpb24nKTtcbiAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgcmV0dXJuICRzdHJpbmdpZnkoW3N5bWJvbF0pICE9PSAnW251bGxdJ1xuICAgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAgIHx8ICRzdHJpbmdpZnkoeyBhOiBzeW1ib2wgfSkgIT09ICd7fSdcbiAgICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICAgIHx8ICRzdHJpbmdpZnkoT2JqZWN0KHN5bWJvbCkpICE9PSAne30nO1xufSk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXdlbGwtZm9ybWVkLXN0cmluZ2lmeVxudmFyIElMTF9GT1JNRURfVU5JQ09ERSA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICRzdHJpbmdpZnkoJ1xcdURGMDZcXHVEODM0JykgIT09ICdcIlxcXFx1ZGYwNlxcXFx1ZDgzNFwiJ1xuICAgIHx8ICRzdHJpbmdpZnkoJ1xcdURFQUQnKSAhPT0gJ1wiXFxcXHVkZWFkXCInO1xufSk7XG5cbnZhciBzdHJpbmdpZnlXaXRoU3ltYm9sc0ZpeCA9IGZ1bmN0aW9uIChpdCwgcmVwbGFjZXIpIHtcbiAgdmFyIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cyk7XG4gIHZhciAkcmVwbGFjZXIgPSBnZXRSZXBsYWNlckZ1bmN0aW9uKHJlcGxhY2VyKTtcbiAgaWYgKCFpc0NhbGxhYmxlKCRyZXBsYWNlcikgJiYgKGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gIGFyZ3NbMV0gPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIC8vIHNvbWUgb2xkIGltcGxlbWVudGF0aW9ucyAobGlrZSBXZWJLaXQpIGNvdWxkIHBhc3MgbnVtYmVycyBhcyBrZXlzXG4gICAgaWYgKGlzQ2FsbGFibGUoJHJlcGxhY2VyKSkgdmFsdWUgPSBjYWxsKCRyZXBsYWNlciwgdGhpcywgJFN0cmluZyhrZXkpLCB2YWx1ZSk7XG4gICAgaWYgKCFpc1N5bWJvbCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgfTtcbiAgcmV0dXJuIGFwcGx5KCRzdHJpbmdpZnksIG51bGwsIGFyZ3MpO1xufTtcblxudmFyIGZpeElsbEZvcm1lZCA9IGZ1bmN0aW9uIChtYXRjaCwgb2Zmc2V0LCBzdHJpbmcpIHtcbiAgdmFyIHByZXYgPSBjaGFyQXQoc3RyaW5nLCBvZmZzZXQgLSAxKTtcbiAgdmFyIG5leHQgPSBjaGFyQXQoc3RyaW5nLCBvZmZzZXQgKyAxKTtcbiAgaWYgKChleGVjKGxvdywgbWF0Y2gpICYmICFleGVjKGhpLCBuZXh0KSkgfHwgKGV4ZWMoaGksIG1hdGNoKSAmJiAhZXhlYyhsb3csIHByZXYpKSkge1xuICAgIHJldHVybiAnXFxcXHUnICsgbnVtYmVyVG9TdHJpbmcoY2hhckNvZGVBdChtYXRjaCwgMCksIDE2KTtcbiAgfSByZXR1cm4gbWF0Y2g7XG59O1xuXG5pZiAoJHN0cmluZ2lmeSkge1xuICAvLyBgSlNPTi5zdHJpbmdpZnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWpzb24uc3RyaW5naWZ5XG4gICQoeyB0YXJnZXQ6ICdKU09OJywgc3RhdDogdHJ1ZSwgYXJpdHk6IDMsIGZvcmNlZDogV1JPTkdfU1lNQk9MU19DT05WRVJTSU9OIHx8IElMTF9GT1JNRURfVU5JQ09ERSB9LCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCwgcmVwbGFjZXIsIHNwYWNlKSB7XG4gICAgICB2YXIgYXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzKTtcbiAgICAgIHZhciByZXN1bHQgPSBhcHBseShXUk9OR19TWU1CT0xTX0NPTlZFUlNJT04gPyBzdHJpbmdpZnlXaXRoU3ltYm9sc0ZpeCA6ICRzdHJpbmdpZnksIG51bGwsIGFyZ3MpO1xuICAgICAgcmV0dXJuIElMTF9GT1JNRURfVU5JQ09ERSAmJiB0eXBlb2YgcmVzdWx0ID09ICdzdHJpbmcnID8gcmVwbGFjZShyZXN1bHQsIHRlc3RlciwgZml4SWxsRm9ybWVkKSA6IHJlc3VsdDtcbiAgICB9XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xuXG4vLyBKU09OW0BAdG9TdHJpbmdUYWddIHByb3BlcnR5XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWpzb24tQEB0b3N0cmluZ3RhZ1xuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsVGhpcy5KU09OLCAnSlNPTicsIHRydWUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25TdHJvbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gYE1hcGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLW9iamVjdHNcbmNvbGxlY3Rpb24oJ01hcCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgTWFwSGVscGVycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYXAtaGVscGVycycpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBNYXAgPSBNYXBIZWxwZXJzLk1hcDtcbnZhciBoYXMgPSBNYXBIZWxwZXJzLmhhcztcbnZhciBnZXQgPSBNYXBIZWxwZXJzLmdldDtcbnZhciBzZXQgPSBNYXBIZWxwZXJzLnNldDtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbnZhciBET0VTX05PVF9XT1JLX1dJVEhfUFJJTUlUSVZFUyA9IElTX1BVUkUgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gTWFwLmdyb3VwQnkoJ2FiJywgZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGl0O1xuICB9KS5nZXQoJ2EnKS5sZW5ndGggIT09IDE7XG59KTtcblxuLy8gYE1hcC5ncm91cEJ5YCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFycmF5LWdyb3VwaW5nXG4kKHsgdGFyZ2V0OiAnTWFwJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IERPRVNfTk9UX1dPUktfV0lUSF9QUklNSVRJVkVTIH0sIHtcbiAgZ3JvdXBCeTogZnVuY3Rpb24gZ3JvdXBCeShpdGVtcywgY2FsbGJhY2tmbikge1xuICAgIHJlcXVpcmVPYmplY3RDb2VyY2libGUoaXRlbXMpO1xuICAgIGFDYWxsYWJsZShjYWxsYmFja2ZuKTtcbiAgICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICAgIHZhciBrID0gMDtcbiAgICBpdGVyYXRlKGl0ZW1zLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHZhciBrZXkgPSBjYWxsYmFja2ZuKHZhbHVlLCBrKyspO1xuICAgICAgaWYgKCFoYXMobWFwLCBrZXkpKSBzZXQobWFwLCBrZXksIFt2YWx1ZV0pO1xuICAgICAgZWxzZSBwdXNoKGdldChtYXAsIGtleSksIHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm1hcC5jb25zdHJ1Y3RvcicpO1xuIiwiLy8gZW1wdHlcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzSW50ZWdyYWxOdW1iZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyJyk7XG5cbi8vIGBOdW1iZXIuaXNJbnRlZ2VyYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzaW50ZWdlclxuJCh7IHRhcmdldDogJ051bWJlcicsIHN0YXQ6IHRydWUgfSwge1xuICBpc0ludGVnZXI6IGlzSW50ZWdyYWxOdW1iZXJcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24nKTtcblxuLy8gYE9iamVjdC5hc3NpZ25gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuYXNzaWduXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWFzc2lnbiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGFyaXR5OiAyLCBmb3JjZWQ6IE9iamVjdC5hc3NpZ24gIT09IGFzc2lnbiB9LCB7XG4gIGFzc2lnbjogYXNzaWduXG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG5cbi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZVxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIGNyZWF0ZTogY3JlYXRlXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogT2JqZWN0LmRlZmluZVByb3BlcnR5ICE9PSBkZWZpbmVQcm9wZXJ0eSwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHtcbiAgZGVmaW5lUHJvcGVydHk6IGRlZmluZVByb3BlcnR5XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRlbnRyaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1hcnJheScpLmVudHJpZXM7XG5cbi8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoTykge1xuICAgIHJldHVybiAkZW50cmllcyhPKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBGUkVFWklORyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mcmVlemluZycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgb25GcmVlemUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5vbkZyZWV6ZTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1mcmVlemUgLS0gc2FmZVxudmFyICRmcmVlemUgPSBPYmplY3QuZnJlZXplO1xudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7ICRmcmVlemUoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmZyZWV6ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5mcmVlemVcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMsIHNoYW06ICFGUkVFWklORyB9LCB7XG4gIGZyZWV6ZTogZnVuY3Rpb24gZnJlZXplKGl0KSB7XG4gICAgcmV0dXJuICRmcmVlemUgJiYgaXNPYmplY3QoaXQpID8gJGZyZWV6ZShvbkZyZWV6ZShpdCkpIDogaXQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcblxudmFyIEZPUkNFRCA9ICFERVNDUklQVE9SUyB8fCBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcigxKTsgfSk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VELCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gICAgcmV0dXJuIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcih0b0luZGV4ZWRPYmplY3QoaXQpLCBrZXkpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcblxuLy8gVjggfiBDaHJvbWUgMzggYW5kIDM5IGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBmYWlscyBvbiBwcmltaXRpdmVzXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNDQzXG52YXIgRk9SQ0VEID0gIU5BVElWRV9TWU1CT0wgfHwgZmFpbHMoZnVuY3Rpb24gKCkgeyBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZigxKTsgfSk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5c3ltYm9sc1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgICB2YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gJGdldE93blByb3BlcnR5U3ltYm9scyh0b09iamVjdChpdCkpIDogW107XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBuYXRpdmVHZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUdldFByb3RvdHlwZU9mKDEpOyB9KTtcblxuLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRwcm90b3R5cGVvZlxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUywgc2hhbTogIUNPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiB9LCB7XG4gIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiBuYXRpdmVHZXRQcm90b3R5cGVPZih0b09iamVjdChpdCkpO1xuICB9XG59KTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBuYXRpdmVLZXlzKDEpOyB9KTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMgfSwge1xuICBrZXlzOiBmdW5jdGlvbiBrZXlzKGl0KSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXModG9PYmplY3QoaXQpKTtcbiAgfVxufSk7XG4iLCIvLyBlbXB0eVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQnKTtcblxuLy8gYHBhcnNlSW50YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4XG4kKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IHBhcnNlSW50ICE9PSAkcGFyc2VJbnQgfSwge1xuICBwYXJzZUludDogJHBhcnNlSW50XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uJyk7XG5cbi8vIGBQcm9taXNlLmFsbFNldHRsZWRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbHNldHRsZWRcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGFsbFNldHRsZWQ6IGZ1bmN0aW9uIGFsbFNldHRsZWQoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgY2FsbChwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB7IHN0YXR1czogJ2Z1bGZpbGxlZCcsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdyZWplY3RlZCcsIHJlYXNvbjogZXJyb3IgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbicpO1xuXG4vLyBgUHJvbWlzZS5hbGxgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwoJHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbicpO1xuXG52YXIgUFJPTUlTRV9BTllfRVJST1IgPSAnTm8gb25lIHByb21pc2UgcmVzb2x2ZWQnO1xuXG4vLyBgUHJvbWlzZS5hbnlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFueVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgYW55OiBmdW5jdGlvbiBhbnkoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIEFnZ3JlZ2F0ZUVycm9yID0gZ2V0QnVpbHRJbignQWdncmVnYXRlRXJyb3InKTtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICB2YXIgYWxyZWFkeVJlc29sdmVkID0gZmFsc2U7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5UmVqZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwocHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlSZWplY3RlZCB8fCBhbHJlYWR5UmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5UmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgZXJyb3JzW2luZGV4XSA9IGVycm9yO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIFBST01JU0VfQU5ZX0VSUk9SKSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpLkNPTlNUUlVDVE9SO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvcicpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG5cbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmNhdGNoXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SLCByZWFsOiB0cnVlIH0sIHtcbiAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gIH1cbn0pO1xuXG4vLyBtYWtlcyBzdXJlIHRoYXQgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJcyBgUHJvbWlzZSNjYXRjaGAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG5pZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IpKSB7XG4gIHZhciBtZXRob2QgPSBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydjYXRjaCddO1xuICBpZiAoTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnY2F0Y2gnXSAhPT0gbWV0aG9kKSB7XG4gICAgZGVmaW5lQnVpbHRJbihOYXRpdmVQcm9taXNlUHJvdG90eXBlLCAnY2F0Y2gnLCBtZXRob2QsIHsgdW5zYWZlOiB0cnVlIH0pO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLW5vZGUnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3BlY2llcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWljcm90YXNrJyk7XG52YXIgaG9zdFJlcG9ydEVycm9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMnKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBRdWV1ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9xdWV1ZScpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3InKTtcbnZhciBQcm9taXNlQ29uc3RydWN0b3JEZXRlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uLkNPTlNUUlVDVE9SO1xudmFyIE5BVElWRV9QUk9NSVNFX1JFSkVDVElPTl9FVkVOVCA9IFByb21pc2VDb25zdHJ1Y3RvckRldGVjdGlvbi5SRUpFQ1RJT05fRVZFTlQ7XG52YXIgTkFUSVZFX1BST01JU0VfU1VCQ0xBU1NJTkcgPSBQcm9taXNlQ29uc3RydWN0b3JEZXRlY3Rpb24uU1VCQ0xBU1NJTkc7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcjtcbnZhciBQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZVByb3RvdHlwZTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWxUaGlzLlR5cGVFcnJvcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG5cbnZhciBESVNQQVRDSF9FVkVOVCA9ICEhKGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUV2ZW50ICYmIGdsb2JhbFRoaXMuZGlzcGF0Y2hFdmVudCk7XG52YXIgVU5IQU5ETEVEX1JFSkVDVElPTiA9ICd1bmhhbmRsZWRyZWplY3Rpb24nO1xudmFyIFJFSkVDVElPTl9IQU5ETEVEID0gJ3JlamVjdGlvbmhhbmRsZWQnO1xudmFyIFBFTkRJTkcgPSAwO1xudmFyIEZVTEZJTExFRCA9IDE7XG52YXIgUkVKRUNURUQgPSAyO1xudmFyIEhBTkRMRUQgPSAxO1xudmFyIFVOSEFORExFRCA9IDI7XG5cbnZhciBJbnRlcm5hbCwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFByb21pc2VXcmFwcGVyLCBuYXRpdmVUaGVuO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiBpc0NhbGxhYmxlKHRoZW4gPSBpdC50aGVuKSA/IHRoZW4gOiBmYWxzZTtcbn07XG5cbnZhciBjYWxsUmVhY3Rpb24gPSBmdW5jdGlvbiAocmVhY3Rpb24sIHN0YXRlKSB7XG4gIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICB2YXIgb2sgPSBzdGF0ZS5zdGF0ZSA9PT0gRlVMRklMTEVEO1xuICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7XG4gIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gIHZhciByZXN1bHQsIHRoZW4sIGV4aXRlZDtcbiAgdHJ5IHtcbiAgICBpZiAoaGFuZGxlcikge1xuICAgICAgaWYgKCFvaykge1xuICAgICAgICBpZiAoc3RhdGUucmVqZWN0aW9uID09PSBVTkhBTkRMRUQpIG9uSGFuZGxlVW5oYW5kbGVkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDtcbiAgICAgIH1cbiAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIGNhbiB0aHJvd1xuICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgIGNhbGwodGhlbiwgcmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgfVxufTtcblxudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChzdGF0ZSwgaXNSZWplY3QpIHtcbiAgaWYgKHN0YXRlLm5vdGlmaWVkKSByZXR1cm47XG4gIHN0YXRlLm5vdGlmaWVkID0gdHJ1ZTtcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVhY3Rpb25zID0gc3RhdGUucmVhY3Rpb25zO1xuICAgIHZhciByZWFjdGlvbjtcbiAgICB3aGlsZSAocmVhY3Rpb24gPSByZWFjdGlvbnMuZ2V0KCkpIHtcbiAgICAgIGNhbGxSZWFjdGlvbihyZWFjdGlvbiwgc3RhdGUpO1xuICAgIH1cbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBldmVudC5yZWFzb24gPSByZWFzb247XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICBnbG9iYWxUaGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGVsc2UgZXZlbnQgPSB7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcmVhc29uIH07XG4gIGlmICghTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UICYmIChoYW5kbGVyID0gZ2xvYmFsVGhpc1snb24nICsgbmFtZV0pKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjYWxsKHRhc2ssIGdsb2JhbFRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgSVNfVU5IQU5ETEVEID0gaXNVbmhhbmRsZWQoc3RhdGUpO1xuICAgIHZhciByZXN1bHQ7XG4gICAgaWYgKElTX1VOSEFORExFRCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChJU19OT0RFKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFVOSEFORExFRF9SRUpFQ1RJT04sIHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHN0YXRlLnJlamVjdGlvbiA9IElTX05PREUgfHwgaXNVbmhhbmRsZWQoc3RhdGUpID8gVU5IQU5ETEVEIDogSEFORExFRDtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5yZWplY3Rpb24gIT09IEhBTkRMRUQgJiYgIXN0YXRlLnBhcmVudDtcbn07XG5cbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjYWxsKHRhc2ssIGdsb2JhbFRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTtcbiAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoUkVKRUNUSU9OX0hBTkRMRUQsIHByb21pc2UsIHN0YXRlLnZhbHVlKTtcbiAgfSk7XG59O1xuXG52YXIgYmluZCA9IGZ1bmN0aW9uIChmbiwgc3RhdGUsIHVud3JhcCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgZm4oc3RhdGUsIHZhbHVlLCB1bndyYXApO1xuICB9O1xufTtcblxudmFyIGludGVybmFsUmVqZWN0ID0gZnVuY3Rpb24gKHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7XG4gIGlmIChzdGF0ZS5kb25lKSByZXR1cm47XG4gIHN0YXRlLmRvbmUgPSB0cnVlO1xuICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDtcbiAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgc3RhdGUuc3RhdGUgPSBSRUpFQ1RFRDtcbiAgbm90aWZ5KHN0YXRlLCB0cnVlKTtcbn07XG5cbnZhciBpbnRlcm5hbFJlc29sdmUgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICB0cnkge1xuICAgIGlmIChzdGF0ZS5mYWNhZGUgPT09IHZhbHVlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgdmFyIHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKTtcbiAgICBpZiAodGhlbikge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IGRvbmU6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2FsbCh0aGVuLCB2YWx1ZSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCB3cmFwcGVyLCBzdGF0ZSksXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVqZWN0LCB3cmFwcGVyLCBzdGF0ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGludGVybmFsUmVqZWN0KHdyYXBwZXIsIGVycm9yLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7XG4gICAgICBub3RpZnkoc3RhdGUsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW50ZXJuYWxSZWplY3QoeyBkb25lOiBmYWxzZSB9LCBlcnJvciwgc3RhdGUpO1xuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SKSB7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gIFByb21pc2VDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsIFByb21pc2VQcm90b3R5cGUpO1xuICAgIGFDYWxsYWJsZShleGVjdXRvcik7XG4gICAgY2FsbChJbnRlcm5hbCwgdGhpcyk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSksIGJpbmQoaW50ZXJuYWxSZWplY3QsIHN0YXRlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGludGVybmFsUmVqZWN0KHN0YXRlLCBlcnJvcik7XG4gICAgfVxuICB9O1xuXG4gIFByb21pc2VQcm90b3R5cGUgPSBQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgdHlwZTogUFJPTUlTRSxcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgbm90aWZpZWQ6IGZhbHNlLFxuICAgICAgcGFyZW50OiBmYWxzZSxcbiAgICAgIHJlYWN0aW9uczogbmV3IFF1ZXVlKCksXG4gICAgICByZWplY3Rpb246IGZhbHNlLFxuICAgICAgc3RhdGU6IFBFTkRJTkcsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH07XG5cbiAgLy8gYFByb21pc2UucHJvdG90eXBlLnRoZW5gIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLnRoZW5cbiAgSW50ZXJuYWwucHJvdG90eXBlID0gZGVmaW5lQnVpbHRJbihQcm9taXNlUHJvdG90eXBlLCAndGhlbicsIGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7XG4gICAgc3RhdGUucGFyZW50ID0gdHJ1ZTtcbiAgICByZWFjdGlvbi5vayA9IGlzQ2FsbGFibGUob25GdWxmaWxsZWQpID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgIHJlYWN0aW9uLmZhaWwgPSBpc0NhbGxhYmxlKG9uUmVqZWN0ZWQpICYmIG9uUmVqZWN0ZWQ7XG4gICAgcmVhY3Rpb24uZG9tYWluID0gSVNfTk9ERSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgIGlmIChzdGF0ZS5zdGF0ZSA9PT0gUEVORElORykgc3RhdGUucmVhY3Rpb25zLmFkZChyZWFjdGlvbik7XG4gICAgZWxzZSBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbFJlYWN0aW9uKHJlYWN0aW9uLCBzdGF0ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gIH0pO1xuXG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUocHJvbWlzZSk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpO1xuICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpO1xuICB9O1xuXG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09IFByb21pc2VDb25zdHJ1Y3RvciB8fCBDID09PSBQcm9taXNlV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xuXG4gIGlmICghSVNfUFVSRSAmJiBpc0NhbGxhYmxlKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcikgJiYgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIG5hdGl2ZVRoZW4gPSBOYXRpdmVQcm9taXNlUHJvdG90eXBlLnRoZW47XG5cbiAgICBpZiAoIU5BVElWRV9QUk9NSVNFX1NVQkNMQVNTSU5HKSB7XG4gICAgICAvLyBtYWtlIGBQcm9taXNlI3RoZW5gIHJldHVybiBhIHBvbHlmaWxsZWQgYFByb21pc2VgIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgICBkZWZpbmVCdWlsdEluKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBjYWxsKG5hdGl2ZVRoZW4sIHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY0MFxuICAgICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBgLmNvbnN0cnVjdG9yID09PSBQcm9taXNlYCB3b3JrIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgdHJ5IHtcbiAgICAgIGRlbGV0ZSBOYXRpdmVQcm9taXNlUHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxuICAgIC8vIG1ha2UgYGluc3RhbmNlb2YgUHJvbWlzZWAgd29yayBmb3IgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJc1xuICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgc2V0UHJvdG90eXBlT2YoTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgUHJvbWlzZVByb3RvdHlwZSk7XG4gICAgfVxuICB9XG59XG5cbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIH0sIHtcbiAgUHJvbWlzZTogUHJvbWlzZUNvbnN0cnVjdG9yXG59KTtcblxuc2V0VG9TdHJpbmdUYWcoUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFLCBmYWxzZSwgdHJ1ZSk7XG5zZXRTcGVjaWVzKFBST01JU0UpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG5cbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbi8vIFNhZmFyaSBidWcgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMDgyOVxudmFyIE5PTl9HRU5FUklDID0gISFOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby10aGVuYWJsZSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICBOYXRpdmVQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10uY2FsbCh7IHRoZW46IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSB9LCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGBQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuZmluYWxseVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBOT05fR0VORVJJQyB9LCB7XG4gICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGdldEJ1aWx0SW4oJ1Byb21pc2UnKSk7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSBpc0NhbGxhYmxlKG9uRmluYWxseSk7XG4gICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5LFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseVxuICAgICk7XG4gIH1cbn0pO1xuXG4vLyBtYWtlcyBzdXJlIHRoYXQgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJcyBgUHJvbWlzZSNmaW5hbGx5YCBwcm9wZXJseSB3b3JrcyB3aXRoIHBhdGNoZWQgYFByb21pc2UjdGhlbmBcbmlmICghSVNfUFVSRSAmJiBpc0NhbGxhYmxlKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcikpIHtcbiAgdmFyIG1ldGhvZCA9IGdldEJ1aWx0SW4oJ1Byb21pc2UnKS5wcm90b3R5cGVbJ2ZpbmFsbHknXTtcbiAgaWYgKE5hdGl2ZVByb21pc2VQcm90b3R5cGVbJ2ZpbmFsbHknXSAhPT0gbWV0aG9kKSB7XG4gICAgZGVmaW5lQnVpbHRJbihOYXRpdmVQcm9taXNlUHJvdG90eXBlLCAnZmluYWxseScsIG1ldGhvZCwgeyB1bnNhZmU6IHRydWUgfSk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3Mgc3BsaXQgdG8gbW9kdWxlcyBsaXN0ZWQgYmVsb3dcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZS5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFsbCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5wcm9taXNlLmNhdGNoJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UucmFjZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5wcm9taXNlLnJlamVjdCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5wcm9taXNlLnJlc29sdmUnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uJyk7XG5cbi8vIGBQcm9taXNlLnJhY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJhY2VcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICBjYWxsKCRwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpLkNPTlNUUlVDVE9SO1xuXG4vLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlamVjdFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIH0sIHtcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZih0aGlzKTtcbiAgICB2YXIgY2FwYWJpbGl0eVJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIGNhcGFiaWxpdHlSZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvcicpO1xudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uJykuQ09OU1RSVUNUT1I7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG5cbnZhciBQcm9taXNlQ29uc3RydWN0b3JXcmFwcGVyID0gZ2V0QnVpbHRJbignUHJvbWlzZScpO1xudmFyIENIRUNLX1dSQVBQRVIgPSBJU19QVVJFICYmICFGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUjtcblxuLy8gYFByb21pc2UucmVzb2x2ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVzb2x2ZVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfHwgRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfSwge1xuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQ0hFQ0tfV1JBUFBFUiAmJiB0aGlzID09PSBQcm9taXNlQ29uc3RydWN0b3JXcmFwcGVyID8gTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG4vLyBgUHJvbWlzZS53aXRoUmVzb2x2ZXJzYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2Utd2l0aC1yZXNvbHZlcnNcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gIHdpdGhSZXNvbHZlcnM6IGZ1bmN0aW9uIHdpdGhSZXNvbHZlcnMoKSB7XG4gICAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZih0aGlzKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvbWlzZTogcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZSxcbiAgICAgIHJlc29sdmU6IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmUsXG4gICAgICByZWplY3Q6IHByb21pc2VDYXBhYmlsaXR5LnJlamVjdFxuICAgIH07XG4gIH1cbn0pO1xuIiwiLy8gZW1wdHlcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2xsZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKTtcbnZhciBjb2xsZWN0aW9uU3Ryb25nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIGBTZXRgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC1vYmplY3RzXG5jb2xsZWN0aW9uKCdTZXQnLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIGNvbGxlY3Rpb25TdHJvbmcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZGlmZmVyZW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtZGlmZmVyZW5jZScpO1xudmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LW1ldGhvZC1hY2NlcHQtc2V0LWxpa2UnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuZGlmZmVyZW5jZWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdkaWZmZXJlbmNlJykgfSwge1xuICBkaWZmZXJlbmNlOiBkaWZmZXJlbmNlXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaW50ZXJzZWN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pbnRlcnNlY3Rpb24nKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlJyk7XG5cbnZhciBJTkNPUlJFQ1QgPSAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgnaW50ZXJzZWN0aW9uJykgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktZnJvbSwgZXMvbm8tc2V0IC0tIHRlc3RpbmdcbiAgcmV0dXJuIFN0cmluZyhBcnJheS5mcm9tKG5ldyBTZXQoWzEsIDIsIDNdKS5pbnRlcnNlY3Rpb24obmV3IFNldChbMywgMl0pKSkpICE9PSAnMywyJztcbn0pO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pbnRlcnNlY3Rpb25gIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1QgfSwge1xuICBpbnRlcnNlY3Rpb246IGludGVyc2VjdGlvblxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc0Rpc2pvaW50RnJvbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaXMtZGlzam9pbnQtZnJvbScpO1xudmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LW1ldGhvZC1hY2NlcHQtc2V0LWxpa2UnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuaXNEaXNqb2ludEZyb21gIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgnaXNEaXNqb2ludEZyb20nKSB9LCB7XG4gIGlzRGlzam9pbnRGcm9tOiBpc0Rpc2pvaW50RnJvbVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc1N1YnNldE9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pcy1zdWJzZXQtb2YnKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmlzU3Vic2V0T2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgnaXNTdWJzZXRPZicpIH0sIHtcbiAgaXNTdWJzZXRPZjogaXNTdWJzZXRPZlxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc1N1cGVyc2V0T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWlzLXN1cGVyc2V0LW9mJyk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtbWV0aG9kLWFjY2VwdC1zZXQtbGlrZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pc1N1cGVyc2V0T2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgnaXNTdXBlcnNldE9mJykgfSwge1xuICBpc1N1cGVyc2V0T2Y6IGlzU3VwZXJzZXRPZlxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHJlcGxhY2VkIHRvIG1vZHVsZSBiZWxvd1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zZXQuY29uc3RydWN0b3InKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHN5bW1ldHJpY0RpZmZlcmVuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXN5bW1ldHJpYy1kaWZmZXJlbmNlJyk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtbWV0aG9kLWFjY2VwdC1zZXQtbGlrZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5zeW1tZXRyaWNEaWZmZXJlbmNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ3N5bW1ldHJpY0RpZmZlcmVuY2UnKSB9LCB7XG4gIHN5bW1ldHJpY0RpZmZlcmVuY2U6IHN5bW1ldHJpY0RpZmZlcmVuY2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5pb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXVuaW9uJyk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtbWV0aG9kLWFjY2VwdC1zZXQtbGlrZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS51bmlvbmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCd1bmlvbicpIH0sIHtcbiAgdW5pb246IHVuaW9uXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIG5vdEFSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbm90LWEtcmVnZXhwJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYycpO1xuXG52YXIgc3RyaW5nSW5kZXhPZiA9IHVuY3VycnlUaGlzKCcnLmluZGV4T2YpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhY29ycmVjdElzUmVnRXhwTG9naWMoJ2luY2x1ZGVzJykgfSwge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgcmV0dXJuICEhfnN0cmluZ0luZGV4T2YoXG4gICAgICB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKSxcbiAgICAgIHRvU3RyaW5nKG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKSksXG4gICAgICBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNoYXJBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlJykuY2hhckF0O1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUnKTtcbnZhciBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QnKTtcblxudmFyIFNUUklOR19JVEVSQVRPUiA9ICdTdHJpbmcgSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU1RSSU5HX0lURVJBVE9SKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLUBAaXRlcmF0b3JcbmRlZmluZUl0ZXJhdG9yKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBTVFJJTkdfSVRFUkFUT1IsXG4gICAgc3RyaW5nOiB0b1N0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXN0cmluZ2l0ZXJhdG9ycHJvdG90eXBlJS5uZXh0XG59LCBmdW5jdGlvbiBuZXh0KCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgc3RyaW5nID0gc3RhdGUuc3RyaW5nO1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleDtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKTtcbiAgcG9pbnQgPSBjaGFyQXQoc3RyaW5nLCBpbmRleCk7XG4gIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QocG9pbnQsIGZhbHNlKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZScpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBub3RBUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcblxudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG52YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnc3RhcnRzV2l0aCcpO1xuICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTtcbn0oKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3RhcnRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyB9LCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgICBub3RBUmVnRXhwKHNlYXJjaFN0cmluZyk7XG4gICAgdmFyIGluZGV4ID0gdG9MZW5ndGgobWluKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSB0b1N0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBzdHJpbmdTbGljZSh0aGF0LCBpbmRleCwgaW5kZXggKyBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuYXN5bmNJdGVyYXRvcmAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLmFzeW5jaXRlcmF0b3JcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnYXN5bmNJdGVyYXRvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5Jyk7XG52YXIgJHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIG5hdGl2ZU9iamVjdENyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMtZXh0ZXJuYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGRlZmluZVByb3BlcnRpZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3InKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtd3JhcHBlZCcpO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcbnZhciBkZWZpbmVTeW1ib2xUb1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtZGVmaW5lLXRvLXByaW1pdGl2ZScpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyICRmb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmZvckVhY2g7XG5cbnZhciBISURERU4gPSBzaGFyZWRLZXkoJ2hpZGRlbicpO1xudmFyIFNZTUJPTCA9ICdTeW1ib2wnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTWU1CT0wpO1xuXG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0W1BST1RPVFlQRV07XG52YXIgJFN5bWJvbCA9IGdsb2JhbFRoaXMuU3ltYm9sO1xudmFyIFN5bWJvbFByb3RvdHlwZSA9ICRTeW1ib2wgJiYgJFN5bWJvbFtQUk9UT1RZUEVdO1xudmFyIFJhbmdlRXJyb3IgPSBnbG9iYWxUaGlzLlJhbmdlRXJyb3I7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsVGhpcy5UeXBlRXJyb3I7XG52YXIgUU9iamVjdCA9IGdsb2JhbFRoaXMuUU9iamVjdDtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyA9IGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbC5mO1xudmFyIG5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbnZhciBBbGxTeW1ib2xzID0gc2hhcmVkKCdzeW1ib2xzJyk7XG52YXIgT2JqZWN0UHJvdG90eXBlU3ltYm9scyA9IHNoYXJlZCgnb3Atc3ltYm9scycpO1xudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG5cbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIFVTRV9TRVRURVIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBmYWxsYmFja0RlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgdmFyIE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0UHJvdG90eXBlLCBQKTtcbiAgaWYgKE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IpIGRlbGV0ZSBPYmplY3RQcm90b3R5cGVbUF07XG4gIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICBpZiAoT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvciAmJiBPICE9PSBPYmplY3RQcm90b3R5cGUpIHtcbiAgICBuYXRpdmVEZWZpbmVQcm9wZXJ0eShPYmplY3RQcm90b3R5cGUsIFAsIE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IpO1xuICB9XG59O1xuXG52YXIgc2V0U3ltYm9sRGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdENyZWF0ZShuYXRpdmVEZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfVxuICB9KSkuYSAhPT0gNztcbn0pID8gZmFsbGJhY2tEZWZpbmVQcm9wZXJ0eSA6IG5hdGl2ZURlZmluZVByb3BlcnR5O1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcsIGRlc2NyaXB0aW9uKSB7XG4gIHZhciBzeW1ib2wgPSBBbGxTeW1ib2xzW3RhZ10gPSBuYXRpdmVPYmplY3RDcmVhdGUoU3ltYm9sUHJvdG90eXBlKTtcbiAgc2V0SW50ZXJuYWxTdGF0ZShzeW1ib2wsIHtcbiAgICB0eXBlOiBTWU1CT0wsXG4gICAgdGFnOiB0YWcsXG4gICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uXG4gIH0pO1xuICBpZiAoIURFU0NSSVBUT1JTKSBzeW1ib2wuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgcmV0dXJuIHN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGlmIChPID09PSBPYmplY3RQcm90b3R5cGUpICRkZWZpbmVQcm9wZXJ0eShPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBQLCBBdHRyaWJ1dGVzKTtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXkgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKGhhc093bihBbGxTeW1ib2xzLCBrZXkpKSB7XG4gICAgaWYgKCFBdHRyaWJ1dGVzLmVudW1lcmFibGUpIHtcbiAgICAgIGlmICghaGFzT3duKE8sIEhJRERFTikpIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIEhJRERFTiwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIG5hdGl2ZU9iamVjdENyZWF0ZShudWxsKSkpO1xuICAgICAgT1tISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGFzT3duKE8sIEhJRERFTikgJiYgT1tISURERU5dW2tleV0pIE9bSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBBdHRyaWJ1dGVzID0gbmF0aXZlT2JqZWN0Q3JlYXRlKEF0dHJpYnV0ZXMsIHsgZW51bWVyYWJsZTogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjcmlwdG9yKE8sIGtleSwgQXR0cmlidXRlcyk7XG4gIH0gcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIGtleSwgQXR0cmlidXRlcyk7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wZXJ0aWVzID0gdG9JbmRleGVkT2JqZWN0KFByb3BlcnRpZXMpO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMocHJvcGVydGllcykuY29uY2F0KCRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJvcGVydGllcykpO1xuICAkZm9yRWFjaChrZXlzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFERVNDUklQVE9SUyB8fCBjYWxsKCRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgcHJvcGVydGllcywga2V5KSkgJGRlZmluZVByb3BlcnR5KE8sIGtleSwgcHJvcGVydGllc1trZXldKTtcbiAgfSk7XG4gIHJldHVybiBPO1xufTtcblxudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gbmF0aXZlT2JqZWN0Q3JlYXRlKE8pIDogJGRlZmluZVByb3BlcnRpZXMobmF0aXZlT2JqZWN0Q3JlYXRlKE8pLCBQcm9wZXJ0aWVzKTtcbn07XG5cbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBQID0gdG9Qcm9wZXJ0eUtleShWKTtcbiAgdmFyIGVudW1lcmFibGUgPSBjYWxsKG5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlLCB0aGlzLCBQKTtcbiAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvdHlwZSAmJiBoYXNPd24oQWxsU3ltYm9scywgUCkgJiYgIWhhc093bihPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBQKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZW51bWVyYWJsZSB8fCAhaGFzT3duKHRoaXMsIFApIHx8ICFoYXNPd24oQWxsU3ltYm9scywgUCkgfHwgaGFzT3duKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW1BdXG4gICAgPyBlbnVtZXJhYmxlIDogdHJ1ZTtcbn07XG5cbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgdmFyIGl0ID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICB2YXIga2V5ID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzT3duKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhc093bihPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBrZXkpKSByZXR1cm47XG4gIHZhciBkZXNjcmlwdG9yID0gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpO1xuICBpZiAoZGVzY3JpcHRvciAmJiBoYXNPd24oQWxsU3ltYm9scywga2V5KSAmJiAhKGhhc093bihpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKSB7XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZGVzY3JpcHRvcjtcbn07XG5cbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoTykge1xuICB2YXIgbmFtZXMgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChPKSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgJGZvckVhY2gobmFtZXMsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIWhhc093bihBbGxTeW1ib2xzLCBrZXkpICYmICFoYXNPd24oaGlkZGVuS2V5cywga2V5KSkgcHVzaChyZXN1bHQsIGtleSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiAoTykge1xuICB2YXIgSVNfT0JKRUNUX1BST1RPVFlQRSA9IE8gPT09IE9iamVjdFByb3RvdHlwZTtcbiAgdmFyIG5hbWVzID0gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyhJU19PQkpFQ1RfUFJPVE9UWVBFID8gT2JqZWN0UHJvdG90eXBlU3ltYm9scyA6IHRvSW5kZXhlZE9iamVjdChPKSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgJGZvckVhY2gobmFtZXMsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoaGFzT3duKEFsbFN5bWJvbHMsIGtleSkgJiYgKCFJU19PQkpFQ1RfUFJPVE9UWVBFIHx8IGhhc093bihPYmplY3RQcm90b3R5cGUsIGtleSkpKSB7XG4gICAgICBwdXNoKHJlc3VsdCwgQWxsU3ltYm9sc1trZXldKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gYFN5bWJvbGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLWNvbnN0cnVjdG9yXG5pZiAoIU5BVElWRV9TWU1CT0wpIHtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICBpZiAoaXNQcm90b3R5cGVPZihTeW1ib2xQcm90b3R5cGUsIHRoaXMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcbiAgICB2YXIgZGVzY3JpcHRpb24gPSAhYXJndW1lbnRzLmxlbmd0aCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICR0b1N0cmluZyhhcmd1bWVudHNbMF0pO1xuICAgIHZhciB0YWcgPSB1aWQoZGVzY3JpcHRpb24pO1xuICAgIHZhciBzZXR0ZXIgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHZhciAkdGhpcyA9IHRoaXMgPT09IHVuZGVmaW5lZCA/IGdsb2JhbFRoaXMgOiB0aGlzO1xuICAgICAgaWYgKCR0aGlzID09PSBPYmplY3RQcm90b3R5cGUpIGNhbGwoc2V0dGVyLCBPYmplY3RQcm90b3R5cGVTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzT3duKCR0aGlzLCBISURERU4pICYmIGhhc093bigkdGhpc1tISURERU5dLCB0YWcpKSAkdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldFN5bWJvbERlc2NyaXB0b3IoJHRoaXMsIHRhZywgZGVzY3JpcHRvcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpKSB0aHJvdyBlcnJvcjtcbiAgICAgICAgZmFsbGJhY2tEZWZpbmVQcm9wZXJ0eSgkdGhpcywgdGFnLCBkZXNjcmlwdG9yKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChERVNDUklQVE9SUyAmJiBVU0VfU0VUVEVSKSBzZXRTeW1ib2xEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiBzZXR0ZXIgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnLCBkZXNjcmlwdGlvbik7XG4gIH07XG5cbiAgU3ltYm9sUHJvdG90eXBlID0gJFN5bWJvbFtQUk9UT1RZUEVdO1xuXG4gIGRlZmluZUJ1aWx0SW4oU3ltYm9sUHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS50YWc7XG4gIH0pO1xuXG4gIGRlZmluZUJ1aWx0SW4oJFN5bWJvbCwgJ3dpdGhvdXRTZXR0ZXInLCBmdW5jdGlvbiAoZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gd3JhcCh1aWQoZGVzY3JpcHRpb24pLCBkZXNjcmlwdGlvbik7XG4gIH0pO1xuXG4gIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gIGRlZmluZVByb3BlcnR5TW9kdWxlLmYgPSAkZGVmaW5lUHJvcGVydHk7XG4gIGRlZmluZVByb3BlcnRpZXNNb2R1bGUuZiA9ICRkZWZpbmVQcm9wZXJ0aWVzO1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZiA9IGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB3cmFwKHdlbGxLbm93blN5bWJvbChuYW1lKSwgbmFtZSk7XG4gIH07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtU3ltYm9sLWRlc2NyaXB0aW9uXG4gICAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFN5bWJvbFByb3RvdHlwZSwgJ2Rlc2NyaXB0aW9uJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykuZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFJU19QVVJFKSB7XG4gICAgICBkZWZpbmVCdWlsdEluKE9iamVjdFByb3RvdHlwZSwgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIHdyYXA6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wsIHNoYW06ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgU3ltYm9sOiAkU3ltYm9sXG59KTtcblxuJGZvckVhY2gob2JqZWN0S2V5cyhXZWxsS25vd25TeW1ib2xzU3RvcmUpLCBmdW5jdGlvbiAobmFtZSkge1xuICBkZWZpbmVXZWxsS25vd25TeW1ib2wobmFtZSk7XG59KTtcblxuJCh7IHRhcmdldDogU1lNQk9MLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbiAoKSB7IFVTRV9TRVRURVIgPSB0cnVlOyB9LFxuICB1c2VTaW1wbGU6IGZ1bmN0aW9uICgpIHsgVVNFX1NFVFRFUiA9IGZhbHNlOyB9XG59KTtcblxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIC8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXNcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yc1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Jcbn0pO1xuXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCB9LCB7XG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXNcbn0pO1xuXG4vLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3ByaW1pdGl2ZVxuZGVmaW5lU3ltYm9sVG9QcmltaXRpdmUoKTtcblxuLy8gYFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11gIHByb3BlcnR5XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3N0cmluZ3RhZ1xuc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgU1lNQk9MKTtcblxuaGlkZGVuS2V5c1tISURERU5dID0gdHJ1ZTtcbiIsIi8vIGVtcHR5XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIE5BVElWRV9TWU1CT0xfUkVHSVNUUlkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLXJlZ2lzdHJ5LWRldGVjdGlvbicpO1xuXG52YXIgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeScpO1xudmFyIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC10by1zdHJpbmctcmVnaXN0cnknKTtcblxuLy8gYFN5bWJvbC5mb3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuZm9yXG4kKHsgdGFyZ2V0OiAnU3ltYm9sJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTF9SRUdJU1RSWSB9LCB7XG4gICdmb3InOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHN0cmluZyA9IHRvU3RyaW5nKGtleSk7XG4gICAgaWYgKGhhc093bihTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5LCBzdHJpbmcpKSByZXR1cm4gU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddO1xuICAgIHZhciBzeW1ib2wgPSBnZXRCdWlsdEluKCdTeW1ib2wnKShzdHJpbmcpO1xuICAgIFN0cmluZ1RvU3ltYm9sUmVnaXN0cnlbc3RyaW5nXSA9IHN5bWJvbDtcbiAgICBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5W3N5bWJvbF0gPSBzdHJpbmc7XG4gICAgcmV0dXJuIHN5bWJvbDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLmhhc0luc3RhbmNlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuaGFzaW5zdGFuY2VcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnaGFzSW5zdGFuY2UnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuaXNjb25jYXRzcHJlYWRhYmxlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2lzQ29uY2F0U3ByZWFkYWJsZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5pdGVyYXRvcmAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLml0ZXJhdG9yXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHNwbGl0IHRvIG1vZHVsZXMgbGlzdGVkIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN5bWJvbC5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5zeW1ib2wuZm9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN5bWJvbC5rZXktZm9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBOQVRJVkVfU1lNQk9MX1JFR0lTVFJZID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1yZWdpc3RyeS1kZXRlY3Rpb24nKTtcblxudmFyIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC10by1zdHJpbmctcmVnaXN0cnknKTtcblxuLy8gYFN5bWJvbC5rZXlGb3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wua2V5Zm9yXG4kKHsgdGFyZ2V0OiAnU3ltYm9sJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTF9SRUdJU1RSWSB9LCB7XG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkge1xuICAgIGlmICghaXNTeW1ib2woc3ltKSkgdGhyb3cgbmV3IFR5cGVFcnJvcih0cnlUb1N0cmluZyhzeW0pICsgJyBpcyBub3QgYSBzeW1ib2wnKTtcbiAgICBpZiAoaGFzT3duKFN5bWJvbFRvU3RyaW5nUmVnaXN0cnksIHN5bSkpIHJldHVybiBTeW1ib2xUb1N0cmluZ1JlZ2lzdHJ5W3N5bV07XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5tYXRjaEFsbGAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLm1hdGNoYWxsXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ21hdGNoQWxsJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLm1hdGNoYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wubWF0Y2hcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wucmVwbGFjZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnJlcGxhY2VcbmRlZmluZVdlbGxLbm93blN5bWJvbCgncmVwbGFjZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5zZWFyY2hgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5zZWFyY2hcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnc2VhcmNoJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLnNwZWNpZXNgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5zcGVjaWVzXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuc3BsaXRgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5zcGxpdFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdzcGxpdCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcbnZhciBkZWZpbmVTeW1ib2xUb1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtZGVmaW5lLXRvLXByaW1pdGl2ZScpO1xuXG4vLyBgU3ltYm9sLnRvUHJpbWl0aXZlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9wcmltaXRpdmVcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTtcblxuLy8gYFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wucHJvdG90eXBlLUBAdG9wcmltaXRpdmVcbmRlZmluZVN5bWJvbFRvUHJpbWl0aXZlKCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcblxuLy8gYFN5bWJvbC50b1N0cmluZ1RhZ2Agd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnRvc3RyaW5ndGFnXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddYCBwcm9wZXJ0eVxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wucHJvdG90eXBlLUBAdG9zdHJpbmd0YWdcbnNldFRvU3RyaW5nVGFnKGdldEJ1aWx0SW4oJ1N5bWJvbCcpLCAnU3ltYm9sJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLnVuc2NvcGFibGVzYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wudW5zY29wYWJsZXNcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBGUkVFWklORyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mcmVlemluZycpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBkZWZpbmVCdWlsdElucyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW5zJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25XZWFrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24td2VhaycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJykuZW5mb3JjZTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIE5BVElWRV9XRUFLX01BUCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24nKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktaXNhcnJheSAtLSBzYWZlXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSAtLSBzYWZlXG52YXIgaXNFeHRlbnNpYmxlID0gJE9iamVjdC5pc0V4dGVuc2libGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZnJvemVuIC0tIHNhZmVcbnZhciBpc0Zyb3plbiA9ICRPYmplY3QuaXNGcm96ZW47XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzc2VhbGVkIC0tIHNhZmVcbnZhciBpc1NlYWxlZCA9ICRPYmplY3QuaXNTZWFsZWQ7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWZyZWV6ZSAtLSBzYWZlXG52YXIgZnJlZXplID0gJE9iamVjdC5mcmVlemU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LXNlYWwgLS0gc2FmZVxudmFyIHNlYWwgPSAkT2JqZWN0LnNlYWw7XG5cbnZhciBJU19JRTExID0gIWdsb2JhbFRoaXMuQWN0aXZlWE9iamVjdCAmJiAnQWN0aXZlWE9iamVjdCcgaW4gZ2xvYmFsVGhpcztcbnZhciBJbnRlcm5hbFdlYWtNYXA7XG5cbnZhciB3cmFwcGVyID0gZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtNYXAoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gIH07XG59O1xuXG4vLyBgV2Vha01hcGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC1jb25zdHJ1Y3RvclxudmFyICRXZWFrTWFwID0gY29sbGVjdGlvbignV2Vha01hcCcsIHdyYXBwZXIsIGNvbGxlY3Rpb25XZWFrKTtcbnZhciBXZWFrTWFwUHJvdG90eXBlID0gJFdlYWtNYXAucHJvdG90eXBlO1xudmFyIG5hdGl2ZVNldCA9IHVuY3VycnlUaGlzKFdlYWtNYXBQcm90b3R5cGUuc2V0KTtcblxuLy8gQ2hha3JhIEVkZ2UgYnVnOiBhZGRpbmcgZnJvemVuIGFycmF5cyB0byBXZWFrTWFwIHVuZnJlZXplIHRoZW1cbnZhciBoYXNNU0VkZ2VGcmVlemluZ0J1ZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIEZSRUVaSU5HICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZnJvemVuQXJyYXkgPSBmcmVlemUoW10pO1xuICAgIG5hdGl2ZVNldChuZXcgJFdlYWtNYXAoKSwgZnJvemVuQXJyYXksIDEpO1xuICAgIHJldHVybiAhaXNGcm96ZW4oZnJvemVuQXJyYXkpO1xuICB9KTtcbn07XG5cbi8vIElFMTEgV2Vha01hcCBmcm96ZW4ga2V5cyBmaXhcbi8vIFdlIGNhbid0IHVzZSBmZWF0dXJlIGRldGVjdGlvbiBiZWNhdXNlIGl0IGNyYXNoIHNvbWUgb2xkIElFIGJ1aWxkc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzQ4NVxuaWYgKE5BVElWRV9XRUFLX01BUCkgaWYgKElTX0lFMTEpIHtcbiAgSW50ZXJuYWxXZWFrTWFwID0gY29sbGVjdGlvbldlYWsuZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgJ1dlYWtNYXAnLCB0cnVlKTtcbiAgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZS5lbmFibGUoKTtcbiAgdmFyIG5hdGl2ZURlbGV0ZSA9IHVuY3VycnlUaGlzKFdlYWtNYXBQcm90b3R5cGVbJ2RlbGV0ZSddKTtcbiAgdmFyIG5hdGl2ZUhhcyA9IHVuY3VycnlUaGlzKFdlYWtNYXBQcm90b3R5cGUuaGFzKTtcbiAgdmFyIG5hdGl2ZUdldCA9IHVuY3VycnlUaGlzKFdlYWtNYXBQcm90b3R5cGUuZ2V0KTtcbiAgZGVmaW5lQnVpbHRJbnMoV2Vha01hcFByb3RvdHlwZSwge1xuICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVEZWxldGUodGhpcywga2V5KSB8fCBzdGF0ZS5mcm96ZW5bJ2RlbGV0ZSddKGtleSk7XG4gICAgICB9IHJldHVybiBuYXRpdmVEZWxldGUodGhpcywga2V5KTtcbiAgICB9LFxuICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlSGFzKHRoaXMsIGtleSkgfHwgc3RhdGUuZnJvemVuLmhhcyhrZXkpO1xuICAgICAgfSByZXR1cm4gbmF0aXZlSGFzKHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUhhcyh0aGlzLCBrZXkpID8gbmF0aXZlR2V0KHRoaXMsIGtleSkgOiBzdGF0ZS5mcm96ZW4uZ2V0KGtleSk7XG4gICAgICB9IHJldHVybiBuYXRpdmVHZXQodGhpcywga2V5KTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgbmF0aXZlSGFzKHRoaXMsIGtleSkgPyBuYXRpdmVTZXQodGhpcywga2V5LCB2YWx1ZSkgOiBzdGF0ZS5mcm96ZW4uc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIG5hdGl2ZVNldCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSk7XG4vLyBDaGFrcmEgRWRnZSBmcm96ZW4ga2V5cyBmaXhcbn0gZWxzZSBpZiAoaGFzTVNFZGdlRnJlZXppbmdCdWcoKSkge1xuICBkZWZpbmVCdWlsdElucyhXZWFrTWFwUHJvdG90eXBlLCB7XG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGFycmF5SW50ZWdyaXR5TGV2ZWw7XG4gICAgICBpZiAoaXNBcnJheShrZXkpKSB7XG4gICAgICAgIGlmIChpc0Zyb3plbihrZXkpKSBhcnJheUludGVncml0eUxldmVsID0gZnJlZXplO1xuICAgICAgICBlbHNlIGlmIChpc1NlYWxlZChrZXkpKSBhcnJheUludGVncml0eUxldmVsID0gc2VhbDtcbiAgICAgIH1cbiAgICAgIG5hdGl2ZVNldCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmIChhcnJheUludGVncml0eUxldmVsKSBhcnJheUludGVncml0eUxldmVsKGtleSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbW9kdWxlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyByZXBsYWNlZCB0byBtb2R1bGUgYmVsb3dcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMud2Vhay1tYXAuY29uc3RydWN0b3InKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcblxudmFyIE1FVEFEQVRBID0gd2VsbEtub3duU3ltYm9sKCdtZXRhZGF0YScpO1xudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vLyBGdW5jdGlvbi5wcm90b3R5cGVbQEBtZXRhZGF0YV1cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWRlY29yYXRvci1tZXRhZGF0YVxuaWYgKEZ1bmN0aW9uUHJvdG90eXBlW01FVEFEQVRBXSA9PT0gdW5kZWZpbmVkKSB7XG4gIGRlZmluZVByb3BlcnR5KEZ1bmN0aW9uUHJvdG90eXBlLCBNRVRBREFUQSwge1xuICAgIHZhbHVlOiBudWxsXG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5hc3luY0Rpc3Bvc2VgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hc3luYy1leHBsaWNpdC1yZXNvdXJjZS1tYW5hZ2VtZW50XG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2FzeW5jRGlzcG9zZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5jdXN0b21NYXRjaGVyYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcGF0dGVybi1tYXRjaGluZ1xuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdjdXN0b21NYXRjaGVyJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLmRpc3Bvc2VgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1leHBsaWNpdC1yZXNvdXJjZS1tYW5hZ2VtZW50XG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2Rpc3Bvc2UnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzUmVnaXN0ZXJlZFN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtaXMtcmVnaXN0ZXJlZCcpO1xuXG4vLyBgU3ltYm9sLmlzUmVnaXN0ZXJlZFN5bWJvbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtc3ltYm9sLXByZWRpY2F0ZXMvI3NlYy1zeW1ib2wtaXNyZWdpc3RlcmVkc3ltYm9sXG4kKHsgdGFyZ2V0OiAnU3ltYm9sJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzUmVnaXN0ZXJlZFN5bWJvbDogaXNSZWdpc3RlcmVkU3ltYm9sXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzUmVnaXN0ZXJlZFN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtaXMtcmVnaXN0ZXJlZCcpO1xuXG4vLyBgU3ltYm9sLmlzUmVnaXN0ZXJlZGAgbWV0aG9kXG4vLyBvYnNvbGV0ZSB2ZXJzaW9uIG9mIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1zeW1ib2wtcHJlZGljYXRlcy8jc2VjLXN5bWJvbC1pc3JlZ2lzdGVyZWRzeW1ib2xcbiQoeyB0YXJnZXQ6ICdTeW1ib2wnLCBzdGF0OiB0cnVlLCBuYW1lOiAnaXNSZWdpc3RlcmVkU3ltYm9sJyB9LCB7XG4gIGlzUmVnaXN0ZXJlZDogaXNSZWdpc3RlcmVkU3ltYm9sXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1pcy13ZWxsLWtub3duJyk7XG5cbi8vIGBTeW1ib2wuaXNXZWxsS25vd25TeW1ib2xgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLXN5bWJvbC1wcmVkaWNhdGVzLyNzZWMtc3ltYm9sLWlzd2VsbGtub3duc3ltYm9sXG4vLyBXZSBzaG91bGQgcGF0Y2ggaXQgZm9yIG5ld2x5IGFkZGVkIHdlbGwta25vd24gc3ltYm9scy4gSWYgaXQncyBub3QgcmVxdWlyZWQsIHRoaXMgbW9kdWxlIGp1c3Qgd2lsbCBub3QgYmUgaW5qZWN0ZWRcbiQoeyB0YXJnZXQ6ICdTeW1ib2wnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICBpc1dlbGxLbm93blN5bWJvbDogaXNXZWxsS25vd25TeW1ib2xcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWlzLXdlbGwta25vd24nKTtcblxuLy8gYFN5bWJvbC5pc1dlbGxLbm93bmAgbWV0aG9kXG4vLyBvYnNvbGV0ZSB2ZXJzaW9uIG9mIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1zeW1ib2wtcHJlZGljYXRlcy8jc2VjLXN5bWJvbC1pc3dlbGxrbm93bnN5bWJvbFxuLy8gV2Ugc2hvdWxkIHBhdGNoIGl0IGZvciBuZXdseSBhZGRlZCB3ZWxsLWtub3duIHN5bWJvbHMuIElmIGl0J3Mgbm90IHJlcXVpcmVkLCB0aGlzIG1vZHVsZSBqdXN0IHdpbGwgbm90IGJlIGluamVjdGVkXG4kKHsgdGFyZ2V0OiAnU3ltYm9sJywgc3RhdDogdHJ1ZSwgbmFtZTogJ2lzV2VsbEtub3duU3ltYm9sJywgZm9yY2VkOiB0cnVlIH0sIHtcbiAgaXNXZWxsS25vd246IGlzV2VsbEtub3duU3ltYm9sXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wubWF0Y2hlcmAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXBhdHRlcm4tbWF0Y2hpbmdcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnbWF0Y2hlcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wubWV0YWRhdGFLZXlgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1kZWNvcmF0b3ItbWV0YWRhdGFcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnbWV0YWRhdGFLZXknKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wubWV0YWRhdGFgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1kZWNvcmF0b3JzXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ21ldGFkYXRhJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLm9ic2VydmFibGVgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ29ic2VydmFibGUnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IHJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLnBhdHRlcm5NYXRjaGAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXBhdHRlcm4tbWF0Y2hpbmdcbmRlZmluZVdlbGxLbm93blN5bWJvbCgncGF0dGVybk1hdGNoJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiByZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdyZXBsYWNlQWxsJyk7XG4iLCIvLyBlbXB0eVxuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xudmFyIERPTUl0ZXJhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb20taXRlcmFibGVzJyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG5mb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7XG4gIHNldFRvU3RyaW5nVGFnKGdsb2JhbFRoaXNbQ09MTEVDVElPTl9OQU1FXSwgQ09MTEVDVElPTl9OQU1FKTtcbiAgSXRlcmF0b3JzW0NPTExFQ1RJT05fTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgc2NoZWR1bGVyc0ZpeCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zY2hlZHVsZXJzLWZpeCcpO1xuXG52YXIgc2V0SW50ZXJ2YWwgPSBzY2hlZHVsZXJzRml4KGdsb2JhbFRoaXMuc2V0SW50ZXJ2YWwsIHRydWUpO1xuXG4vLyBCdW4gLyBJRTktIHNldEludGVydmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmaXhcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3RpbWVycy1hbmQtdXNlci1wcm9tcHRzLmh0bWwjZG9tLXNldGludGVydmFsXG4kKHsgZ2xvYmFsOiB0cnVlLCBiaW5kOiB0cnVlLCBmb3JjZWQ6IGdsb2JhbFRoaXMuc2V0SW50ZXJ2YWwgIT09IHNldEludGVydmFsIH0sIHtcbiAgc2V0SW50ZXJ2YWw6IHNldEludGVydmFsXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBzY2hlZHVsZXJzRml4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NjaGVkdWxlcnMtZml4Jyk7XG5cbnZhciBzZXRUaW1lb3V0ID0gc2NoZWR1bGVyc0ZpeChnbG9iYWxUaGlzLnNldFRpbWVvdXQsIHRydWUpO1xuXG4vLyBCdW4gLyBJRTktIHNldFRpbWVvdXQgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZpeFxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGltZXJzLWFuZC11c2VyLXByb21wdHMuaHRtbCNkb20tc2V0dGltZW91dFxuJCh7IGdsb2JhbDogdHJ1ZSwgYmluZDogdHJ1ZSwgZm9yY2VkOiBnbG9iYWxUaGlzLnNldFRpbWVvdXQgIT09IHNldFRpbWVvdXQgfSwge1xuICBzZXRUaW1lb3V0OiBzZXRUaW1lb3V0XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3Mgc3BsaXQgdG8gbW9kdWxlcyBsaXN0ZWQgYmVsb3dcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnNldC1pbnRlcnZhbCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuc2V0LXRpbWVvdXQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9hcnJheS9mcm9tJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2FycmF5L2lzLWFycmF5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uLy4uL2VzL2FycmF5L3ZpcnR1YWwvZW50cmllcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi8uLi9lcy9hcnJheS92aXJ0dWFsL2Zvci1lYWNoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uLy4uL2VzL2FycmF5L3ZpcnR1YWwva2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi8uLi9lcy9hcnJheS92aXJ0dWFsL3ZhbHVlcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2NvbmNhdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9lbnRyaWVzJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgRE9NVG9rZW5MaXN0OiB0cnVlLFxuICBOb2RlTGlzdDogdHJ1ZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmVudHJpZXM7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmVudHJpZXMpXG4gICAgfHwgaGFzT3duKERPTUl0ZXJhYmxlcywgY2xhc3NvZihpdCkpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9ldmVyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9maWx0ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2UvZmluZC1pbmRleCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9maW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9mb3ItZWFjaCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgRE9NVG9rZW5MaXN0OiB0cnVlLFxuICBOb2RlTGlzdDogdHJ1ZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmZvckVhY2g7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmZvckVhY2gpXG4gICAgfHwgaGFzT3duKERPTUl0ZXJhYmxlcywgY2xhc3NvZihpdCkpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9pbmNsdWRlcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9pbmRleC1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9rZXlzJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgRE9NVG9rZW5MaXN0OiB0cnVlLFxuICBOb2RlTGlzdDogdHJ1ZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmtleXM7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmtleXMpXG4gICAgfHwgaGFzT3duKERPTUl0ZXJhYmxlcywgY2xhc3NvZihpdCkpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9tYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2UvcmVkdWNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL3NsaWNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL3NvcnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2Uvc3BsaWNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL3N0YXJ0cy13aXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL3ZhbHVlcycpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbnZhciBET01JdGVyYWJsZXMgPSB7XG4gIERPTVRva2VuTGlzdDogdHJ1ZSxcbiAgTm9kZUxpc3Q6IHRydWVcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC52YWx1ZXM7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLnZhbHVlcylcbiAgICB8fCBoYXNPd24oRE9NSXRlcmFibGVzLCBjbGFzc29mKGl0KSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2pzb24vc3RyaW5naWZ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL21hcCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL251bWJlci9pcy1pbnRlZ2VyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9hc3NpZ24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvb2JqZWN0L2NyZWF0ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9lbnRyaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9mcmVlemUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9vYmplY3Qva2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi9lcy9wYXJzZS1pbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvcHJvbWlzZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIudGltZXJzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5zZXRJbnRlcnZhbDtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLnRpbWVycycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguc2V0VGltZW91dDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9zZXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9zeW1ib2wvaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9zeW1ib2wvdG8tcHJpbWl0aXZlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL3dlYWstbWFwJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkge1xuICByZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHtcbiAgICB2YWx1ZTogdCxcbiAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICBjb25maWd1cmFibGU6ICEwLFxuICAgIHdyaXRhYmxlOiAhMFxuICB9KSA6IGVbcl0gPSB0LCBlO1xufVxuZXhwb3J0IHsgX2RlZmluZVByb3BlcnR5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHtcbiAgICBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykge1xuICAgICAgdmFyIHQgPSBhcmd1bWVudHNbZV07XG4gICAgICBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCB7IF9leHRlbmRzIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHQsIG8pIHtcbiAgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSwgdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSB0LCBzZXRQcm90b3R5cGVPZih0LCBvKTtcbn1cbmV4cG9ydCB7IF9pbmhlcml0c0xvb3NlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgZGVmaW5lUHJvcGVydHkgZnJvbSBcIi4vZGVmaW5lUHJvcGVydHkuanNcIjtcbmZ1bmN0aW9uIG93bktleXMoZSwgcikge1xuICB2YXIgdCA9IE9iamVjdC5rZXlzKGUpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtcbiAgICByICYmIChvID0gby5maWx0ZXIoZnVuY3Rpb24gKHIpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7XG4gICAgfSkpLCB0LnB1c2guYXBwbHkodCwgbyk7XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMihlKSB7XG4gIGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7XG4gICAgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9O1xuICAgIHIgJSAyID8gb3duS2V5cyhPYmplY3QodCksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTtcbiAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZTtcbn1cbmV4cG9ydCB7IF9vYmplY3RTcHJlYWQyIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShyLCBlKSB7XG4gIGlmIChudWxsID09IHIpIHJldHVybiB7fTtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgbiBpbiByKSBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSkge1xuICAgIGlmIChlLmluY2x1ZGVzKG4pKSBjb250aW51ZTtcbiAgICB0W25dID0gcltuXTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmV4cG9ydCB7IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCwgZSkge1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fID0gZSwgdDtcbiAgfSwgX3NldFByb3RvdHlwZU9mKHQsIGUpO1xufVxuZXhwb3J0IHsgX3NldFByb3RvdHlwZU9mIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmZ1bmN0aW9uIHRvUHJpbWl0aXZlKHQsIHIpIHtcbiAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7XG4gIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7XG59XG5leHBvcnQgeyB0b1ByaW1pdGl2ZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5pbXBvcnQgdG9QcmltaXRpdmUgZnJvbSBcIi4vdG9QcmltaXRpdmUuanNcIjtcbmZ1bmN0aW9uIHRvUHJvcGVydHlLZXkodCkge1xuICB2YXIgaSA9IHRvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiO1xufVxuZXhwb3J0IHsgdG9Qcm9wZXJ0eUtleSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvO1xuICB9IDogZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbztcbiAgfSwgX3R5cGVvZihvKTtcbn1cbmV4cG9ydCB7IF90eXBlb2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCB7IGdldFNpZGVBeGlzLCBnZXRBbGlnbm1lbnRBeGlzLCBnZXRBeGlzTGVuZ3RoLCBnZXRTaWRlLCBnZXRBbGlnbm1lbnQsIGV2YWx1YXRlLCBnZXRQYWRkaW5nT2JqZWN0LCByZWN0VG9DbGllbnRSZWN0LCBtaW4sIGNsYW1wLCBwbGFjZW1lbnRzLCBnZXRBbGlnbm1lbnRTaWRlcywgZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQsIGdldE9wcG9zaXRlUGxhY2VtZW50LCBnZXRFeHBhbmRlZFBsYWNlbWVudHMsIGdldE9wcG9zaXRlQXhpc1BsYWNlbWVudHMsIHNpZGVzLCBtYXgsIGdldE9wcG9zaXRlQXhpcyB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscyc7XG5leHBvcnQgeyByZWN0VG9DbGllbnRSZWN0IH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzJztcblxuZnVuY3Rpb24gY29tcHV0ZUNvb3Jkc0Zyb21QbGFjZW1lbnQoX3JlZiwgcGxhY2VtZW50LCBydGwpIHtcbiAgbGV0IHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmdcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHNpZGVBeGlzID0gZ2V0U2lkZUF4aXMocGxhY2VtZW50KTtcbiAgY29uc3QgYWxpZ25tZW50QXhpcyA9IGdldEFsaWdubWVudEF4aXMocGxhY2VtZW50KTtcbiAgY29uc3QgYWxpZ25MZW5ndGggPSBnZXRBeGlzTGVuZ3RoKGFsaWdubWVudEF4aXMpO1xuICBjb25zdCBzaWRlID0gZ2V0U2lkZShwbGFjZW1lbnQpO1xuICBjb25zdCBpc1ZlcnRpY2FsID0gc2lkZUF4aXMgPT09ICd5JztcbiAgY29uc3QgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGZsb2F0aW5nLndpZHRoIC8gMjtcbiAgY29uc3QgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBmbG9hdGluZy5oZWlnaHQgLyAyO1xuICBjb25zdCBjb21tb25BbGlnbiA9IHJlZmVyZW5jZVthbGlnbkxlbmd0aF0gLyAyIC0gZmxvYXRpbmdbYWxpZ25MZW5ndGhdIC8gMjtcbiAgbGV0IGNvb3JkcztcbiAgc3dpdGNoIChzaWRlKSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBmbG9hdGluZy5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgY29vcmRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICBjb29yZHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICBjb29yZHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54IC0gZmxvYXRpbmcud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgY29vcmRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnlcbiAgICAgIH07XG4gIH1cbiAgc3dpdGNoIChnZXRBbGlnbm1lbnQocGxhY2VtZW50KSkge1xuICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgIGNvb3Jkc1thbGlnbm1lbnRBeGlzXSAtPSBjb21tb25BbGlnbiAqIChydGwgJiYgaXNWZXJ0aWNhbCA/IC0xIDogMSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlbmQnOlxuICAgICAgY29vcmRzW2FsaWdubWVudEF4aXNdICs9IGNvbW1vbkFsaWduICogKHJ0bCAmJiBpc1ZlcnRpY2FsID8gLTEgOiAxKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBjb29yZHM7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIHRoYXQgd2lsbCBwbGFjZSB0aGUgZmxvYXRpbmcgZWxlbWVudFxuICogbmV4dCB0byBhIGdpdmVuIHJlZmVyZW5jZSBlbGVtZW50LlxuICpcbiAqIFRoaXMgZXhwb3J0IGRvZXMgbm90IGhhdmUgYW55IGBwbGF0Zm9ybWAgaW50ZXJmYWNlIGxvZ2ljLiBZb3Ugd2lsbCBuZWVkIHRvXG4gKiB3cml0ZSBvbmUgZm9yIHRoZSBwbGF0Zm9ybSB5b3UgYXJlIHVzaW5nIEZsb2F0aW5nIFVJIHdpdGguXG4gKi9cbmNvbnN0IGNvbXB1dGVQb3NpdGlvbiA9IGFzeW5jIChyZWZlcmVuY2UsIGZsb2F0aW5nLCBjb25maWcpID0+IHtcbiAgY29uc3Qge1xuICAgIHBsYWNlbWVudCA9ICdib3R0b20nLFxuICAgIHN0cmF0ZWd5ID0gJ2Fic29sdXRlJyxcbiAgICBtaWRkbGV3YXJlID0gW10sXG4gICAgcGxhdGZvcm1cbiAgfSA9IGNvbmZpZztcbiAgY29uc3QgdmFsaWRNaWRkbGV3YXJlID0gbWlkZGxld2FyZS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHJ0bCA9IGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZmxvYXRpbmcpKTtcbiAgbGV0IHJlY3RzID0gYXdhaXQgcGxhdGZvcm0uZ2V0RWxlbWVudFJlY3RzKHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmcsXG4gICAgc3RyYXRlZ3lcbiAgfSk7XG4gIGxldCB7XG4gICAgeCxcbiAgICB5XG4gIH0gPSBjb21wdXRlQ29vcmRzRnJvbVBsYWNlbWVudChyZWN0cywgcGxhY2VtZW50LCBydGwpO1xuICBsZXQgc3RhdGVmdWxQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XG4gIGxldCBtaWRkbGV3YXJlRGF0YSA9IHt9O1xuICBsZXQgcmVzZXRDb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRNaWRkbGV3YXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIGZuXG4gICAgfSA9IHZhbGlkTWlkZGxld2FyZVtpXTtcbiAgICBjb25zdCB7XG4gICAgICB4OiBuZXh0WCxcbiAgICAgIHk6IG5leHRZLFxuICAgICAgZGF0YSxcbiAgICAgIHJlc2V0XG4gICAgfSA9IGF3YWl0IGZuKHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgaW5pdGlhbFBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50OiBzdGF0ZWZ1bFBsYWNlbWVudCxcbiAgICAgIHN0cmF0ZWd5LFxuICAgICAgbWlkZGxld2FyZURhdGEsXG4gICAgICByZWN0cyxcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICBmbG9hdGluZ1xuICAgICAgfVxuICAgIH0pO1xuICAgIHggPSBuZXh0WCAhPSBudWxsID8gbmV4dFggOiB4O1xuICAgIHkgPSBuZXh0WSAhPSBudWxsID8gbmV4dFkgOiB5O1xuICAgIG1pZGRsZXdhcmVEYXRhID0ge1xuICAgICAgLi4ubWlkZGxld2FyZURhdGEsXG4gICAgICBbbmFtZV06IHtcbiAgICAgICAgLi4ubWlkZGxld2FyZURhdGFbbmFtZV0sXG4gICAgICAgIC4uLmRhdGFcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChyZXNldCAmJiByZXNldENvdW50IDw9IDUwKSB7XG4gICAgICByZXNldENvdW50Kys7XG4gICAgICBpZiAodHlwZW9mIHJlc2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAocmVzZXQucGxhY2VtZW50KSB7XG4gICAgICAgICAgc3RhdGVmdWxQbGFjZW1lbnQgPSByZXNldC5wbGFjZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc2V0LnJlY3RzKSB7XG4gICAgICAgICAgcmVjdHMgPSByZXNldC5yZWN0cyA9PT0gdHJ1ZSA/IGF3YWl0IHBsYXRmb3JtLmdldEVsZW1lbnRSZWN0cyh7XG4gICAgICAgICAgICByZWZlcmVuY2UsXG4gICAgICAgICAgICBmbG9hdGluZyxcbiAgICAgICAgICAgIHN0cmF0ZWd5XG4gICAgICAgICAgfSkgOiByZXNldC5yZWN0cztcbiAgICAgICAgfVxuICAgICAgICAoe1xuICAgICAgICAgIHgsXG4gICAgICAgICAgeVxuICAgICAgICB9ID0gY29tcHV0ZUNvb3Jkc0Zyb21QbGFjZW1lbnQocmVjdHMsIHN0YXRlZnVsUGxhY2VtZW50LCBydGwpKTtcbiAgICAgIH1cbiAgICAgIGkgPSAtMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHksXG4gICAgcGxhY2VtZW50OiBzdGF0ZWZ1bFBsYWNlbWVudCxcbiAgICBzdHJhdGVneSxcbiAgICBtaWRkbGV3YXJlRGF0YVxuICB9O1xufTtcblxuLyoqXG4gKiBSZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBvZiBvdmVyZmxvdyBzaWRlIG9mZnNldHMgdGhhdCBkZXRlcm1pbmUgaG93IG11Y2ggdGhlXG4gKiBlbGVtZW50IGlzIG92ZXJmbG93aW5nIGEgZ2l2ZW4gY2xpcHBpbmcgYm91bmRhcnkgb24gZWFjaCBzaWRlLlxuICogLSBwb3NpdGl2ZSA9IG92ZXJmbG93aW5nIHRoZSBib3VuZGFyeSBieSB0aGF0IG51bWJlciBvZiBwaXhlbHNcbiAqIC0gbmVnYXRpdmUgPSBob3cgbWFueSBwaXhlbHMgbGVmdCBiZWZvcmUgaXQgd2lsbCBvdmVyZmxvd1xuICogLSAwID0gbGllcyBmbHVzaCB3aXRoIHRoZSBib3VuZGFyeVxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2RldGVjdE92ZXJmbG93XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdE92ZXJmbG93KHN0YXRlLCBvcHRpb25zKSB7XG4gIHZhciBfYXdhaXQkcGxhdGZvcm0kaXNFbGU7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIHgsXG4gICAgeSxcbiAgICBwbGF0Zm9ybSxcbiAgICByZWN0cyxcbiAgICBlbGVtZW50cyxcbiAgICBzdHJhdGVneVxuICB9ID0gc3RhdGU7XG4gIGNvbnN0IHtcbiAgICBib3VuZGFyeSA9ICdjbGlwcGluZ0FuY2VzdG9ycycsXG4gICAgcm9vdEJvdW5kYXJ5ID0gJ3ZpZXdwb3J0JyxcbiAgICBlbGVtZW50Q29udGV4dCA9ICdmbG9hdGluZycsXG4gICAgYWx0Qm91bmRhcnkgPSBmYWxzZSxcbiAgICBwYWRkaW5nID0gMFxuICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuICBjb25zdCBwYWRkaW5nT2JqZWN0ID0gZ2V0UGFkZGluZ09iamVjdChwYWRkaW5nKTtcbiAgY29uc3QgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSAnZmxvYXRpbmcnID8gJ3JlZmVyZW5jZScgOiAnZmxvYXRpbmcnO1xuICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICBjb25zdCBjbGlwcGluZ0NsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KGF3YWl0IHBsYXRmb3JtLmdldENsaXBwaW5nUmVjdCh7XG4gICAgZWxlbWVudDogKChfYXdhaXQkcGxhdGZvcm0kaXNFbGUgPSBhd2FpdCAocGxhdGZvcm0uaXNFbGVtZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc0VsZW1lbnQoZWxlbWVudCkpKSAhPSBudWxsID8gX2F3YWl0JHBsYXRmb3JtJGlzRWxlIDogdHJ1ZSkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCAoYXdhaXQgKHBsYXRmb3JtLmdldERvY3VtZW50RWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnRzLmZsb2F0aW5nKSkpLFxuICAgIGJvdW5kYXJ5LFxuICAgIHJvb3RCb3VuZGFyeSxcbiAgICBzdHJhdGVneVxuICB9KSk7XG4gIGNvbnN0IHJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gJ2Zsb2F0aW5nJyA/IHtcbiAgICB4LFxuICAgIHksXG4gICAgd2lkdGg6IHJlY3RzLmZsb2F0aW5nLndpZHRoLFxuICAgIGhlaWdodDogcmVjdHMuZmxvYXRpbmcuaGVpZ2h0XG4gIH0gOiByZWN0cy5yZWZlcmVuY2U7XG4gIGNvbnN0IG9mZnNldFBhcmVudCA9IGF3YWl0IChwbGF0Zm9ybS5nZXRPZmZzZXRQYXJlbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldE9mZnNldFBhcmVudChlbGVtZW50cy5mbG9hdGluZykpO1xuICBjb25zdCBvZmZzZXRTY2FsZSA9IChhd2FpdCAocGxhdGZvcm0uaXNFbGVtZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc0VsZW1lbnQob2Zmc2V0UGFyZW50KSkpID8gKGF3YWl0IChwbGF0Zm9ybS5nZXRTY2FsZSA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0U2NhbGUob2Zmc2V0UGFyZW50KSkpIHx8IHtcbiAgICB4OiAxLFxuICAgIHk6IDFcbiAgfSA6IHtcbiAgICB4OiAxLFxuICAgIHk6IDFcbiAgfTtcbiAgY29uc3QgZWxlbWVudENsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KHBsYXRmb3JtLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0ID8gYXdhaXQgcGxhdGZvcm0uY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Qoe1xuICAgIGVsZW1lbnRzLFxuICAgIHJlY3QsXG4gICAgb2Zmc2V0UGFyZW50LFxuICAgIHN0cmF0ZWd5XG4gIH0pIDogcmVjdCk7XG4gIHJldHVybiB7XG4gICAgdG9wOiAoY2xpcHBpbmdDbGllbnRSZWN0LnRvcCAtIGVsZW1lbnRDbGllbnRSZWN0LnRvcCArIHBhZGRpbmdPYmplY3QudG9wKSAvIG9mZnNldFNjYWxlLnksXG4gICAgYm90dG9tOiAoZWxlbWVudENsaWVudFJlY3QuYm90dG9tIC0gY2xpcHBpbmdDbGllbnRSZWN0LmJvdHRvbSArIHBhZGRpbmdPYmplY3QuYm90dG9tKSAvIG9mZnNldFNjYWxlLnksXG4gICAgbGVmdDogKGNsaXBwaW5nQ2xpZW50UmVjdC5sZWZ0IC0gZWxlbWVudENsaWVudFJlY3QubGVmdCArIHBhZGRpbmdPYmplY3QubGVmdCkgLyBvZmZzZXRTY2FsZS54LFxuICAgIHJpZ2h0OiAoZWxlbWVudENsaWVudFJlY3QucmlnaHQgLSBjbGlwcGluZ0NsaWVudFJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0KSAvIG9mZnNldFNjYWxlLnhcbiAgfTtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIHBvc2l0aW9uIGFuIGlubmVyIGVsZW1lbnQgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgc28gdGhhdCBpdFxuICogYXBwZWFycyBjZW50ZXJlZCB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXJyb3dcbiAqL1xuY29uc3QgYXJyb3cgPSBvcHRpb25zID0+ICh7XG4gIG5hbWU6ICdhcnJvdycsXG4gIG9wdGlvbnMsXG4gIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICByZWN0cyxcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgZWxlbWVudHMsXG4gICAgICBtaWRkbGV3YXJlRGF0YVxuICAgIH0gPSBzdGF0ZTtcbiAgICAvLyBTaW5jZSBgZWxlbWVudGAgaXMgcmVxdWlyZWQsIHdlIGRvbid0IFBhcnRpYWw8PiB0aGUgdHlwZS5cbiAgICBjb25zdCB7XG4gICAgICBlbGVtZW50LFxuICAgICAgcGFkZGluZyA9IDBcbiAgICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpIHx8IHt9O1xuICAgIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgcGFkZGluZ09iamVjdCA9IGdldFBhZGRpbmdPYmplY3QocGFkZGluZyk7XG4gICAgY29uc3QgY29vcmRzID0ge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9O1xuICAgIGNvbnN0IGF4aXMgPSBnZXRBbGlnbm1lbnRBeGlzKHBsYWNlbWVudCk7XG4gICAgY29uc3QgbGVuZ3RoID0gZ2V0QXhpc0xlbmd0aChheGlzKTtcbiAgICBjb25zdCBhcnJvd0RpbWVuc2lvbnMgPSBhd2FpdCBwbGF0Zm9ybS5nZXREaW1lbnNpb25zKGVsZW1lbnQpO1xuICAgIGNvbnN0IGlzWUF4aXMgPSBheGlzID09PSAneSc7XG4gICAgY29uc3QgbWluUHJvcCA9IGlzWUF4aXMgPyAndG9wJyA6ICdsZWZ0JztcbiAgICBjb25zdCBtYXhQcm9wID0gaXNZQXhpcyA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgICBjb25zdCBjbGllbnRQcm9wID0gaXNZQXhpcyA/ICdjbGllbnRIZWlnaHQnIDogJ2NsaWVudFdpZHRoJztcbiAgICBjb25zdCBlbmREaWZmID0gcmVjdHMucmVmZXJlbmNlW2xlbmd0aF0gKyByZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBjb29yZHNbYXhpc10gLSByZWN0cy5mbG9hdGluZ1tsZW5ndGhdO1xuICAgIGNvbnN0IHN0YXJ0RGlmZiA9IGNvb3Jkc1theGlzXSAtIHJlY3RzLnJlZmVyZW5jZVtheGlzXTtcbiAgICBjb25zdCBhcnJvd09mZnNldFBhcmVudCA9IGF3YWl0IChwbGF0Zm9ybS5nZXRPZmZzZXRQYXJlbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldE9mZnNldFBhcmVudChlbGVtZW50KSk7XG4gICAgbGV0IGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGFycm93T2Zmc2V0UGFyZW50W2NsaWVudFByb3BdIDogMDtcblxuICAgIC8vIERPTSBwbGF0Zm9ybSBjYW4gcmV0dXJuIGB3aW5kb3dgIGFzIHRoZSBgb2Zmc2V0UGFyZW50YC5cbiAgICBpZiAoIWNsaWVudFNpemUgfHwgIShhd2FpdCAocGxhdGZvcm0uaXNFbGVtZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc0VsZW1lbnQoYXJyb3dPZmZzZXRQYXJlbnQpKSkpIHtcbiAgICAgIGNsaWVudFNpemUgPSBlbGVtZW50cy5mbG9hdGluZ1tjbGllbnRQcm9wXSB8fCByZWN0cy5mbG9hdGluZ1tsZW5ndGhdO1xuICAgIH1cbiAgICBjb25zdCBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjtcblxuICAgIC8vIElmIHRoZSBwYWRkaW5nIGlzIGxhcmdlIGVub3VnaCB0aGF0IGl0IGNhdXNlcyB0aGUgYXJyb3cgdG8gbm8gbG9uZ2VyIGJlXG4gICAgLy8gY2VudGVyZWQsIG1vZGlmeSB0aGUgcGFkZGluZyBzbyB0aGF0IGl0IGlzIGNlbnRlcmVkLlxuICAgIGNvbnN0IGxhcmdlc3RQb3NzaWJsZVBhZGRpbmcgPSBjbGllbnRTaXplIC8gMiAtIGFycm93RGltZW5zaW9uc1tsZW5ndGhdIC8gMiAtIDE7XG4gICAgY29uc3QgbWluUGFkZGluZyA9IG1pbihwYWRkaW5nT2JqZWN0W21pblByb3BdLCBsYXJnZXN0UG9zc2libGVQYWRkaW5nKTtcbiAgICBjb25zdCBtYXhQYWRkaW5nID0gbWluKHBhZGRpbmdPYmplY3RbbWF4UHJvcF0sIGxhcmdlc3RQb3NzaWJsZVBhZGRpbmcpO1xuXG4gICAgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBmbG9hdGluZyBlbGVtZW50IGlmIHRoZSBjZW50ZXJcbiAgICAvLyBwb2ludCBpcyBvdXRzaWRlIHRoZSBmbG9hdGluZyBlbGVtZW50J3MgYm91bmRzLlxuICAgIGNvbnN0IG1pbiQxID0gbWluUGFkZGluZztcbiAgICBjb25zdCBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dEaW1lbnNpb25zW2xlbmd0aF0gLSBtYXhQYWRkaW5nO1xuICAgIGNvbnN0IGNlbnRlciA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dEaW1lbnNpb25zW2xlbmd0aF0gLyAyICsgY2VudGVyVG9SZWZlcmVuY2U7XG4gICAgY29uc3Qgb2Zmc2V0ID0gY2xhbXAobWluJDEsIGNlbnRlciwgbWF4KTtcblxuICAgIC8vIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGwgZW5vdWdoIHRoYXQgdGhlIGFycm93J3MgcGFkZGluZyBjYXVzZXMgaXQgdG9cbiAgICAvLyB0byBwb2ludCB0byBub3RoaW5nIGZvciBhbiBhbGlnbmVkIHBsYWNlbWVudCwgYWRqdXN0IHRoZSBvZmZzZXQgb2YgdGhlXG4gICAgLy8gZmxvYXRpbmcgZWxlbWVudCBpdHNlbGYuIFRvIGVuc3VyZSBgc2hpZnQoKWAgY29udGludWVzIHRvIHRha2UgYWN0aW9uLFxuICAgIC8vIGEgc2luZ2xlIHJlc2V0IGlzIHBlcmZvcm1lZCB3aGVuIHRoaXMgaXMgdHJ1ZS5cbiAgICBjb25zdCBzaG91bGRBZGRPZmZzZXQgPSAhbWlkZGxld2FyZURhdGEuYXJyb3cgJiYgZ2V0QWxpZ25tZW50KHBsYWNlbWVudCkgIT0gbnVsbCAmJiBjZW50ZXIgIT09IG9mZnNldCAmJiByZWN0cy5yZWZlcmVuY2VbbGVuZ3RoXSAvIDIgLSAoY2VudGVyIDwgbWluJDEgPyBtaW5QYWRkaW5nIDogbWF4UGFkZGluZykgLSBhcnJvd0RpbWVuc2lvbnNbbGVuZ3RoXSAvIDIgPCAwO1xuICAgIGNvbnN0IGFsaWdubWVudE9mZnNldCA9IHNob3VsZEFkZE9mZnNldCA/IGNlbnRlciA8IG1pbiQxID8gY2VudGVyIC0gbWluJDEgOiBjZW50ZXIgLSBtYXggOiAwO1xuICAgIHJldHVybiB7XG4gICAgICBbYXhpc106IGNvb3Jkc1theGlzXSArIGFsaWdubWVudE9mZnNldCxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgW2F4aXNdOiBvZmZzZXQsXG4gICAgICAgIGNlbnRlck9mZnNldDogY2VudGVyIC0gb2Zmc2V0IC0gYWxpZ25tZW50T2Zmc2V0LFxuICAgICAgICAuLi4oc2hvdWxkQWRkT2Zmc2V0ICYmIHtcbiAgICAgICAgICBhbGlnbm1lbnRPZmZzZXRcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICByZXNldDogc2hvdWxkQWRkT2Zmc2V0XG4gICAgfTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGdldFBsYWNlbWVudExpc3QoYWxpZ25tZW50LCBhdXRvQWxpZ25tZW50LCBhbGxvd2VkUGxhY2VtZW50cykge1xuICBjb25zdCBhbGxvd2VkUGxhY2VtZW50c1NvcnRlZEJ5QWxpZ25tZW50ID0gYWxpZ25tZW50ID8gWy4uLmFsbG93ZWRQbGFjZW1lbnRzLmZpbHRlcihwbGFjZW1lbnQgPT4gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCkgPT09IGFsaWdubWVudCksIC4uLmFsbG93ZWRQbGFjZW1lbnRzLmZpbHRlcihwbGFjZW1lbnQgPT4gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCkgIT09IGFsaWdubWVudCldIDogYWxsb3dlZFBsYWNlbWVudHMuZmlsdGVyKHBsYWNlbWVudCA9PiBnZXRTaWRlKHBsYWNlbWVudCkgPT09IHBsYWNlbWVudCk7XG4gIHJldHVybiBhbGxvd2VkUGxhY2VtZW50c1NvcnRlZEJ5QWxpZ25tZW50LmZpbHRlcihwbGFjZW1lbnQgPT4ge1xuICAgIGlmIChhbGlnbm1lbnQpIHtcbiAgICAgIHJldHVybiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSA9PT0gYWxpZ25tZW50IHx8IChhdXRvQWxpZ25tZW50ID8gZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQocGxhY2VtZW50KSAhPT0gcGxhY2VtZW50IDogZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBjaG9vc2luZyB0aGUgcGxhY2VtZW50XG4gKiB0aGF0IGhhcyB0aGUgbW9zdCBzcGFjZSBhdmFpbGFibGUgYXV0b21hdGljYWxseSwgd2l0aG91dCBuZWVkaW5nIHRvIHNwZWNpZnkgYVxuICogcHJlZmVycmVkIHBsYWNlbWVudC4gQWx0ZXJuYXRpdmUgdG8gYGZsaXBgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2F1dG9QbGFjZW1lbnRcbiAqL1xuY29uc3QgYXV0b1BsYWNlbWVudCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnYXV0b1BsYWNlbWVudCcsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRhdXRvUCwgX21pZGRsZXdhcmVEYXRhJGF1dG9QMiwgX3BsYWNlbWVudHNUaGF0Rml0T25FO1xuICAgICAgY29uc3Qge1xuICAgICAgICByZWN0cyxcbiAgICAgICAgbWlkZGxld2FyZURhdGEsXG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGVsZW1lbnRzXG4gICAgICB9ID0gc3RhdGU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNyb3NzQXhpcyA9IGZhbHNlLFxuICAgICAgICBhbGlnbm1lbnQsXG4gICAgICAgIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cyxcbiAgICAgICAgYXV0b0FsaWdubWVudCA9IHRydWUsXG4gICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICAgICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcbiAgICAgIGNvbnN0IHBsYWNlbWVudHMkMSA9IGFsaWdubWVudCAhPT0gdW5kZWZpbmVkIHx8IGFsbG93ZWRQbGFjZW1lbnRzID09PSBwbGFjZW1lbnRzID8gZ2V0UGxhY2VtZW50TGlzdChhbGlnbm1lbnQgfHwgbnVsbCwgYXV0b0FsaWdubWVudCwgYWxsb3dlZFBsYWNlbWVudHMpIDogYWxsb3dlZFBsYWNlbWVudHM7XG4gICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gKChfbWlkZGxld2FyZURhdGEkYXV0b1AgPSBtaWRkbGV3YXJlRGF0YS5hdXRvUGxhY2VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJGF1dG9QLmluZGV4KSB8fCAwO1xuICAgICAgY29uc3QgY3VycmVudFBsYWNlbWVudCA9IHBsYWNlbWVudHMkMVtjdXJyZW50SW5kZXhdO1xuICAgICAgaWYgKGN1cnJlbnRQbGFjZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICBjb25zdCBhbGlnbm1lbnRTaWRlcyA9IGdldEFsaWdubWVudFNpZGVzKGN1cnJlbnRQbGFjZW1lbnQsIHJlY3RzLCBhd2FpdCAocGxhdGZvcm0uaXNSVEwgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzUlRMKGVsZW1lbnRzLmZsb2F0aW5nKSkpO1xuXG4gICAgICAvLyBNYWtlIGBjb21wdXRlQ29vcmRzYCBzdGFydCBmcm9tIHRoZSByaWdodCBwbGFjZS5cbiAgICAgIGlmIChwbGFjZW1lbnQgIT09IGN1cnJlbnRQbGFjZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnRzJDFbMF1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50T3ZlcmZsb3dzID0gW292ZXJmbG93W2dldFNpZGUoY3VycmVudFBsYWNlbWVudCldLCBvdmVyZmxvd1thbGlnbm1lbnRTaWRlc1swXV0sIG92ZXJmbG93W2FsaWdubWVudFNpZGVzWzFdXV07XG4gICAgICBjb25zdCBhbGxPdmVyZmxvd3MgPSBbLi4uKCgoX21pZGRsZXdhcmVEYXRhJGF1dG9QMiA9IG1pZGRsZXdhcmVEYXRhLmF1dG9QbGFjZW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkYXV0b1AyLm92ZXJmbG93cykgfHwgW10pLCB7XG4gICAgICAgIHBsYWNlbWVudDogY3VycmVudFBsYWNlbWVudCxcbiAgICAgICAgb3ZlcmZsb3dzOiBjdXJyZW50T3ZlcmZsb3dzXG4gICAgICB9XTtcbiAgICAgIGNvbnN0IG5leHRQbGFjZW1lbnQgPSBwbGFjZW1lbnRzJDFbY3VycmVudEluZGV4ICsgMV07XG5cbiAgICAgIC8vIFRoZXJlIGFyZSBtb3JlIHBsYWNlbWVudHMgdG8gY2hlY2suXG4gICAgICBpZiAobmV4dFBsYWNlbWVudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGluZGV4OiBjdXJyZW50SW5kZXggKyAxLFxuICAgICAgICAgICAgb3ZlcmZsb3dzOiBhbGxPdmVyZmxvd3NcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICBwbGFjZW1lbnQ6IG5leHRQbGFjZW1lbnRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwbGFjZW1lbnRzU29ydGVkQnlNb3N0U3BhY2UgPSBhbGxPdmVyZmxvd3MubWFwKGQgPT4ge1xuICAgICAgICBjb25zdCBhbGlnbm1lbnQgPSBnZXRBbGlnbm1lbnQoZC5wbGFjZW1lbnQpO1xuICAgICAgICByZXR1cm4gW2QucGxhY2VtZW50LCBhbGlnbm1lbnQgJiYgY3Jvc3NBeGlzID9cbiAgICAgICAgLy8gQ2hlY2sgYWxvbmcgdGhlIG1haW5BeGlzIGFuZCBtYWluIGNyb3NzQXhpcyBzaWRlLlxuICAgICAgICBkLm92ZXJmbG93cy5zbGljZSgwLCAyKS5yZWR1Y2UoKGFjYywgdikgPT4gYWNjICsgdiwgMCkgOlxuICAgICAgICAvLyBDaGVjayBvbmx5IHRoZSBtYWluQXhpcy5cbiAgICAgICAgZC5vdmVyZmxvd3NbMF0sIGQub3ZlcmZsb3dzXTtcbiAgICAgIH0pLnNvcnQoKGEsIGIpID0+IGFbMV0gLSBiWzFdKTtcbiAgICAgIGNvbnN0IHBsYWNlbWVudHNUaGF0Rml0T25FYWNoU2lkZSA9IHBsYWNlbWVudHNTb3J0ZWRCeU1vc3RTcGFjZS5maWx0ZXIoZCA9PiBkWzJdLnNsaWNlKDAsXG4gICAgICAvLyBBbGlnbmVkIHBsYWNlbWVudHMgc2hvdWxkIG5vdCBjaGVjayB0aGVpciBvcHBvc2l0ZSBjcm9zc0F4aXNcbiAgICAgIC8vIHNpZGUuXG4gICAgICBnZXRBbGlnbm1lbnQoZFswXSkgPyAyIDogMykuZXZlcnkodiA9PiB2IDw9IDApKTtcbiAgICAgIGNvbnN0IHJlc2V0UGxhY2VtZW50ID0gKChfcGxhY2VtZW50c1RoYXRGaXRPbkUgPSBwbGFjZW1lbnRzVGhhdEZpdE9uRWFjaFNpZGVbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfcGxhY2VtZW50c1RoYXRGaXRPbkVbMF0pIHx8IHBsYWNlbWVudHNTb3J0ZWRCeU1vc3RTcGFjZVswXVswXTtcbiAgICAgIGlmIChyZXNldFBsYWNlbWVudCAhPT0gcGxhY2VtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5kZXg6IGN1cnJlbnRJbmRleCArIDEsXG4gICAgICAgICAgICBvdmVyZmxvd3M6IGFsbE92ZXJmbG93c1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHBsYWNlbWVudDogcmVzZXRQbGFjZW1lbnRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgZmxpcHBpbmcgdGhlIGBwbGFjZW1lbnRgXG4gKiBpbiBvcmRlciB0byBrZWVwIGl0IGluIHZpZXcgd2hlbiB0aGUgcHJlZmVycmVkIHBsYWNlbWVudChzKSB3aWxsIG92ZXJmbG93IHRoZVxuICogY2xpcHBpbmcgYm91bmRhcnkuIEFsdGVybmF0aXZlIHRvIGBhdXRvUGxhY2VtZW50YC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9mbGlwXG4gKi9cbmNvbnN0IGZsaXAgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2ZsaXAnLFxuICAgIG9wdGlvbnMsXG4gICAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkYXJyb3csIF9taWRkbGV3YXJlRGF0YSRmbGlwO1xuICAgICAgY29uc3Qge1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG1pZGRsZXdhcmVEYXRhLFxuICAgICAgICByZWN0cyxcbiAgICAgICAgaW5pdGlhbFBsYWNlbWVudCxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGVsZW1lbnRzXG4gICAgICB9ID0gc3RhdGU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1haW5BeGlzOiBjaGVja01haW5BeGlzID0gdHJ1ZSxcbiAgICAgICAgY3Jvc3NBeGlzOiBjaGVja0Nyb3NzQXhpcyA9IHRydWUsXG4gICAgICAgIGZhbGxiYWNrUGxhY2VtZW50czogc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzLFxuICAgICAgICBmYWxsYmFja1N0cmF0ZWd5ID0gJ2Jlc3RGaXQnLFxuICAgICAgICBmYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uID0gJ25vbmUnLFxuICAgICAgICBmbGlwQWxpZ25tZW50ID0gdHJ1ZSxcbiAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuXG4gICAgICAvLyBJZiBhIHJlc2V0IGJ5IHRoZSBhcnJvdyB3YXMgY2F1c2VkIGR1ZSB0byBhbiBhbGlnbm1lbnQgb2Zmc2V0IGJlaW5nXG4gICAgICAvLyBhZGRlZCwgd2Ugc2hvdWxkIHNraXAgYW55IGxvZ2ljIG5vdyBzaW5jZSBgZmxpcCgpYCBoYXMgYWxyZWFkeSBkb25lIGl0c1xuICAgICAgLy8gd29yay5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMjU0OSNpc3N1ZWNvbW1lbnQtMTcxOTYwMTY0M1xuICAgICAgaWYgKChfbWlkZGxld2FyZURhdGEkYXJyb3cgPSBtaWRkbGV3YXJlRGF0YS5hcnJvdykgIT0gbnVsbCAmJiBfbWlkZGxld2FyZURhdGEkYXJyb3cuYWxpZ25tZW50T2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZGUgPSBnZXRTaWRlKHBsYWNlbWVudCk7XG4gICAgICBjb25zdCBpbml0aWFsU2lkZUF4aXMgPSBnZXRTaWRlQXhpcyhpbml0aWFsUGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IGlzQmFzZVBsYWNlbWVudCA9IGdldFNpZGUoaW5pdGlhbFBsYWNlbWVudCkgPT09IGluaXRpYWxQbGFjZW1lbnQ7XG4gICAgICBjb25zdCBydGwgPSBhd2FpdCAocGxhdGZvcm0uaXNSVEwgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzUlRMKGVsZW1lbnRzLmZsb2F0aW5nKSk7XG4gICAgICBjb25zdCBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcEFsaWdubWVudCA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChpbml0aWFsUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZFBsYWNlbWVudHMoaW5pdGlhbFBsYWNlbWVudCkpO1xuICAgICAgY29uc3QgaGFzRmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbiA9IGZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb24gIT09ICdub25lJztcbiAgICAgIGlmICghc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzICYmIGhhc0ZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb24pIHtcbiAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzLnB1c2goLi4uZ2V0T3Bwb3NpdGVBeGlzUGxhY2VtZW50cyhpbml0aWFsUGxhY2VtZW50LCBmbGlwQWxpZ25tZW50LCBmYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uLCBydGwpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBsYWNlbWVudHMgPSBbaW5pdGlhbFBsYWNlbWVudCwgLi4uZmFsbGJhY2tQbGFjZW1lbnRzXTtcbiAgICAgIGNvbnN0IG92ZXJmbG93ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIGRldGVjdE92ZXJmbG93T3B0aW9ucyk7XG4gICAgICBjb25zdCBvdmVyZmxvd3MgPSBbXTtcbiAgICAgIGxldCBvdmVyZmxvd3NEYXRhID0gKChfbWlkZGxld2FyZURhdGEkZmxpcCA9IG1pZGRsZXdhcmVEYXRhLmZsaXApID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkZmxpcC5vdmVyZmxvd3MpIHx8IFtdO1xuICAgICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgICAgb3ZlcmZsb3dzLnB1c2gob3ZlcmZsb3dbc2lkZV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNoZWNrQ3Jvc3NBeGlzKSB7XG4gICAgICAgIGNvbnN0IHNpZGVzID0gZ2V0QWxpZ25tZW50U2lkZXMocGxhY2VtZW50LCByZWN0cywgcnRsKTtcbiAgICAgICAgb3ZlcmZsb3dzLnB1c2gob3ZlcmZsb3dbc2lkZXNbMF1dLCBvdmVyZmxvd1tzaWRlc1sxXV0pO1xuICAgICAgfVxuICAgICAgb3ZlcmZsb3dzRGF0YSA9IFsuLi5vdmVyZmxvd3NEYXRhLCB7XG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgb3ZlcmZsb3dzXG4gICAgICB9XTtcblxuICAgICAgLy8gT25lIG9yIG1vcmUgc2lkZXMgaXMgb3ZlcmZsb3dpbmcuXG4gICAgICBpZiAoIW92ZXJmbG93cy5ldmVyeShzaWRlID0+IHNpZGUgPD0gMCkpIHtcbiAgICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRmbGlwMiwgX292ZXJmbG93c0RhdGEkZmlsdGVyO1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSAoKChfbWlkZGxld2FyZURhdGEkZmxpcDIgPSBtaWRkbGV3YXJlRGF0YS5mbGlwKSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJGZsaXAyLmluZGV4KSB8fCAwKSArIDE7XG4gICAgICAgIGNvbnN0IG5leHRQbGFjZW1lbnQgPSBwbGFjZW1lbnRzW25leHRJbmRleF07XG4gICAgICAgIGlmIChuZXh0UGxhY2VtZW50KSB7XG4gICAgICAgICAgLy8gVHJ5IG5leHQgcGxhY2VtZW50IGFuZCByZS1ydW4gdGhlIGxpZmVjeWNsZS5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBpbmRleDogbmV4dEluZGV4LFxuICAgICAgICAgICAgICBvdmVyZmxvd3M6IG92ZXJmbG93c0RhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgICBwbGFjZW1lbnQ6IG5leHRQbGFjZW1lbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QsIGZpbmQgdGhlIGNhbmRpZGF0ZXMgdGhhdCBmaXQgb24gdGhlIG1haW5BeGlzIHNpZGUgb2Ygb3ZlcmZsb3csXG4gICAgICAgIC8vIHRoZW4gZmluZCB0aGUgcGxhY2VtZW50IHRoYXQgZml0cyB0aGUgYmVzdCBvbiB0aGUgbWFpbiBjcm9zc0F4aXMgc2lkZS5cbiAgICAgICAgbGV0IHJlc2V0UGxhY2VtZW50ID0gKF9vdmVyZmxvd3NEYXRhJGZpbHRlciA9IG92ZXJmbG93c0RhdGEuZmlsdGVyKGQgPT4gZC5vdmVyZmxvd3NbMF0gPD0gMCkuc29ydCgoYSwgYikgPT4gYS5vdmVyZmxvd3NbMV0gLSBiLm92ZXJmbG93c1sxXSlbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfb3ZlcmZsb3dzRGF0YSRmaWx0ZXIucGxhY2VtZW50O1xuXG4gICAgICAgIC8vIE90aGVyd2lzZSBmYWxsYmFjay5cbiAgICAgICAgaWYgKCFyZXNldFBsYWNlbWVudCkge1xuICAgICAgICAgIHN3aXRjaCAoZmFsbGJhY2tTdHJhdGVneSkge1xuICAgICAgICAgICAgY2FzZSAnYmVzdEZpdCc6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX292ZXJmbG93c0RhdGEkZmlsdGVyMjtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSAoX292ZXJmbG93c0RhdGEkZmlsdGVyMiA9IG92ZXJmbG93c0RhdGEuZmlsdGVyKGQgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGhhc0ZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNpZGVBeGlzID0gZ2V0U2lkZUF4aXMoZC5wbGFjZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFNpZGVBeGlzID09PSBpbml0aWFsU2lkZUF4aXMgfHxcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgYmlhcyB0byB0aGUgYHlgIHNpZGUgYXhpcyBkdWUgdG8gaG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgICAgICAvLyByZWFkaW5nIGRpcmVjdGlvbnMgZmF2b3JpbmcgZ3JlYXRlciB3aWR0aC5cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNpZGVBeGlzID09PSAneSc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KS5tYXAoZCA9PiBbZC5wbGFjZW1lbnQsIGQub3ZlcmZsb3dzLmZpbHRlcihvdmVyZmxvdyA9PiBvdmVyZmxvdyA+IDApLnJlZHVjZSgoYWNjLCBvdmVyZmxvdykgPT4gYWNjICsgb3ZlcmZsb3csIDApXSkuc29ydCgoYSwgYikgPT4gYVsxXSAtIGJbMV0pWzBdKSA9PSBudWxsID8gdm9pZCAwIDogX292ZXJmbG93c0RhdGEkZmlsdGVyMlswXTtcbiAgICAgICAgICAgICAgICBpZiAocGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgICByZXNldFBsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2luaXRpYWxQbGFjZW1lbnQnOlxuICAgICAgICAgICAgICByZXNldFBsYWNlbWVudCA9IGluaXRpYWxQbGFjZW1lbnQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGxhY2VtZW50ICE9PSByZXNldFBsYWNlbWVudCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgICBwbGFjZW1lbnQ6IHJlc2V0UGxhY2VtZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0KSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiBvdmVyZmxvdy50b3AgLSByZWN0LmhlaWdodCxcbiAgICByaWdodDogb3ZlcmZsb3cucmlnaHQgLSByZWN0LndpZHRoLFxuICAgIGJvdHRvbTogb3ZlcmZsb3cuYm90dG9tIC0gcmVjdC5oZWlnaHQsXG4gICAgbGVmdDogb3ZlcmZsb3cubGVmdCAtIHJlY3Qud2lkdGhcbiAgfTtcbn1cbmZ1bmN0aW9uIGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvdmVyZmxvdykge1xuICByZXR1cm4gc2lkZXMuc29tZShzaWRlID0+IG92ZXJmbG93W3NpZGVdID49IDApO1xufVxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIGhpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaW4gYXBwbGljYWJsZSBzaXR1YXRpb25zLCBzdWNoIGFzXG4gKiB3aGVuIGl0IGlzIG5vdCBpbiB0aGUgc2FtZSBjbGlwcGluZyBjb250ZXh0IGFzIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9oaWRlXG4gKi9cbmNvbnN0IGhpZGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2hpZGUnLFxuICAgIG9wdGlvbnMsXG4gICAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcmVjdHNcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3RyYXRlZ3kgPSAncmVmZXJlbmNlSGlkZGVuJyxcbiAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuICAgICAgc3dpdGNoIChzdHJhdGVneSkge1xuICAgICAgICBjYXNlICdyZWZlcmVuY2VIaWRkZW4nOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJmbG93ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgICAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zLFxuICAgICAgICAgICAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0cy5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZUhpZGRlbk9mZnNldHM6IG9mZnNldHMsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlSGlkZGVuOiBpc0FueVNpZGVGdWxseUNsaXBwZWQob2Zmc2V0cylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2VzY2FwZWQnOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJmbG93ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgICAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zLFxuICAgICAgICAgICAgICBhbHRCb3VuZGFyeTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3RzLmZsb2F0aW5nKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBlc2NhcGVkT2Zmc2V0czogb2Zmc2V0cyxcbiAgICAgICAgICAgICAgICBlc2NhcGVkOiBpc0FueVNpZGVGdWxseUNsaXBwZWQob2Zmc2V0cylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG5mdW5jdGlvbiBnZXRCb3VuZGluZ1JlY3QocmVjdHMpIHtcbiAgY29uc3QgbWluWCA9IG1pbiguLi5yZWN0cy5tYXAocmVjdCA9PiByZWN0LmxlZnQpKTtcbiAgY29uc3QgbWluWSA9IG1pbiguLi5yZWN0cy5tYXAocmVjdCA9PiByZWN0LnRvcCkpO1xuICBjb25zdCBtYXhYID0gbWF4KC4uLnJlY3RzLm1hcChyZWN0ID0+IHJlY3QucmlnaHQpKTtcbiAgY29uc3QgbWF4WSA9IG1heCguLi5yZWN0cy5tYXAocmVjdCA9PiByZWN0LmJvdHRvbSkpO1xuICByZXR1cm4ge1xuICAgIHg6IG1pblgsXG4gICAgeTogbWluWSxcbiAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgaGVpZ2h0OiBtYXhZIC0gbWluWVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0UmVjdHNCeUxpbmUocmVjdHMpIHtcbiAgY29uc3Qgc29ydGVkUmVjdHMgPSByZWN0cy5zbGljZSgpLnNvcnQoKGEsIGIpID0+IGEueSAtIGIueSk7XG4gIGNvbnN0IGdyb3VwcyA9IFtdO1xuICBsZXQgcHJldlJlY3QgPSBudWxsO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZFJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcmVjdCA9IHNvcnRlZFJlY3RzW2ldO1xuICAgIGlmICghcHJldlJlY3QgfHwgcmVjdC55IC0gcHJldlJlY3QueSA+IHByZXZSZWN0LmhlaWdodCAvIDIpIHtcbiAgICAgIGdyb3Vwcy5wdXNoKFtyZWN0XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3Vwc1tncm91cHMubGVuZ3RoIC0gMV0ucHVzaChyZWN0KTtcbiAgICB9XG4gICAgcHJldlJlY3QgPSByZWN0O1xuICB9XG4gIHJldHVybiBncm91cHMubWFwKHJlY3QgPT4gcmVjdFRvQ2xpZW50UmVjdChnZXRCb3VuZGluZ1JlY3QocmVjdCkpKTtcbn1cbi8qKlxuICogUHJvdmlkZXMgaW1wcm92ZWQgcG9zaXRpb25pbmcgZm9yIGlubGluZSByZWZlcmVuY2UgZWxlbWVudHMgdGhhdCBjYW4gc3BhblxuICogb3ZlciBtdWx0aXBsZSBsaW5lcywgc3VjaCBhcyBoeXBlcmxpbmtzIG9yIHJhbmdlIHNlbGVjdGlvbnMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaW5saW5lXG4gKi9cbmNvbnN0IGlubGluZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnaW5saW5lJyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIHJlY3RzLFxuICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgc3RyYXRlZ3lcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIC8vIEEgTW91c2VFdmVudCdzIGNsaWVudHtYLFl9IGNvb3JkcyBjYW4gYmUgdXAgdG8gMiBwaXhlbHMgb2ZmIGFcbiAgICAgIC8vIENsaWVudFJlY3QncyBib3VuZHMsIGRlc3BpdGUgdGhlIGV2ZW50IGxpc3RlbmVyIGJlaW5nIHRyaWdnZXJlZC4gQVxuICAgICAgLy8gcGFkZGluZyBvZiAyIHNlZW1zIHRvIGhhbmRsZSB0aGlzIGlzc3VlLlxuICAgICAgY29uc3Qge1xuICAgICAgICBwYWRkaW5nID0gMixcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcbiAgICAgIGNvbnN0IG5hdGl2ZUNsaWVudFJlY3RzID0gQXJyYXkuZnJvbSgoYXdhaXQgKHBsYXRmb3JtLmdldENsaWVudFJlY3RzID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5nZXRDbGllbnRSZWN0cyhlbGVtZW50cy5yZWZlcmVuY2UpKSkgfHwgW10pO1xuICAgICAgY29uc3QgY2xpZW50UmVjdHMgPSBnZXRSZWN0c0J5TGluZShuYXRpdmVDbGllbnRSZWN0cyk7XG4gICAgICBjb25zdCBmYWxsYmFjayA9IHJlY3RUb0NsaWVudFJlY3QoZ2V0Qm91bmRpbmdSZWN0KG5hdGl2ZUNsaWVudFJlY3RzKSk7XG4gICAgICBjb25zdCBwYWRkaW5nT2JqZWN0ID0gZ2V0UGFkZGluZ09iamVjdChwYWRkaW5nKTtcbiAgICAgIGZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIHR3byByZWN0cyBhbmQgdGhleSBhcmUgZGlzam9pbmVkLlxuICAgICAgICBpZiAoY2xpZW50UmVjdHMubGVuZ3RoID09PSAyICYmIGNsaWVudFJlY3RzWzBdLmxlZnQgPiBjbGllbnRSZWN0c1sxXS5yaWdodCAmJiB4ICE9IG51bGwgJiYgeSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgcmVjdCBpbiB3aGljaCB0aGUgcG9pbnQgaXMgZnVsbHkgaW5zaWRlLlxuICAgICAgICAgIHJldHVybiBjbGllbnRSZWN0cy5maW5kKHJlY3QgPT4geCA+IHJlY3QubGVmdCAtIHBhZGRpbmdPYmplY3QubGVmdCAmJiB4IDwgcmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHQgJiYgeSA+IHJlY3QudG9wIC0gcGFkZGluZ09iamVjdC50b3AgJiYgeSA8IHJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20pIHx8IGZhbGxiYWNrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlcmUgYXJlIDIgb3IgbW9yZSBjb25uZWN0ZWQgcmVjdHMuXG4gICAgICAgIGlmIChjbGllbnRSZWN0cy5sZW5ndGggPj0gMikge1xuICAgICAgICAgIGlmIChnZXRTaWRlQXhpcyhwbGFjZW1lbnQpID09PSAneScpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0UmVjdCA9IGNsaWVudFJlY3RzWzBdO1xuICAgICAgICAgICAgY29uc3QgbGFzdFJlY3QgPSBjbGllbnRSZWN0c1tjbGllbnRSZWN0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IGlzVG9wID0gZ2V0U2lkZShwbGFjZW1lbnQpID09PSAndG9wJztcbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IGZpcnN0UmVjdC50b3A7XG4gICAgICAgICAgICBjb25zdCBib3R0b20gPSBsYXN0UmVjdC5ib3R0b207XG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gaXNUb3AgPyBmaXJzdFJlY3QubGVmdCA6IGxhc3RSZWN0LmxlZnQ7XG4gICAgICAgICAgICBjb25zdCByaWdodCA9IGlzVG9wID8gZmlyc3RSZWN0LnJpZ2h0IDogbGFzdFJlY3QucmlnaHQ7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgICAgYm90dG9tLFxuICAgICAgICAgICAgICBsZWZ0LFxuICAgICAgICAgICAgICByaWdodCxcbiAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgeDogbGVmdCxcbiAgICAgICAgICAgICAgeTogdG9wXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBpc0xlZnRTaWRlID0gZ2V0U2lkZShwbGFjZW1lbnQpID09PSAnbGVmdCc7XG4gICAgICAgICAgY29uc3QgbWF4UmlnaHQgPSBtYXgoLi4uY2xpZW50UmVjdHMubWFwKHJlY3QgPT4gcmVjdC5yaWdodCkpO1xuICAgICAgICAgIGNvbnN0IG1pbkxlZnQgPSBtaW4oLi4uY2xpZW50UmVjdHMubWFwKHJlY3QgPT4gcmVjdC5sZWZ0KSk7XG4gICAgICAgICAgY29uc3QgbWVhc3VyZVJlY3RzID0gY2xpZW50UmVjdHMuZmlsdGVyKHJlY3QgPT4gaXNMZWZ0U2lkZSA/IHJlY3QubGVmdCA9PT0gbWluTGVmdCA6IHJlY3QucmlnaHQgPT09IG1heFJpZ2h0KTtcbiAgICAgICAgICBjb25zdCB0b3AgPSBtZWFzdXJlUmVjdHNbMF0udG9wO1xuICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IG1lYXN1cmVSZWN0c1ttZWFzdXJlUmVjdHMubGVuZ3RoIC0gMV0uYm90dG9tO1xuICAgICAgICAgIGNvbnN0IGxlZnQgPSBtaW5MZWZ0O1xuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gbWF4UmlnaHQ7XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gICAgICAgICAgY29uc3QgaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICBib3R0b20sXG4gICAgICAgICAgICBsZWZ0LFxuICAgICAgICAgICAgcmlnaHQsXG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIHg6IGxlZnQsXG4gICAgICAgICAgICB5OiB0b3BcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc2V0UmVjdHMgPSBhd2FpdCBwbGF0Zm9ybS5nZXRFbGVtZW50UmVjdHMoe1xuICAgICAgICByZWZlcmVuY2U6IHtcbiAgICAgICAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3RcbiAgICAgICAgfSxcbiAgICAgICAgZmxvYXRpbmc6IGVsZW1lbnRzLmZsb2F0aW5nLFxuICAgICAgICBzdHJhdGVneVxuICAgICAgfSk7XG4gICAgICBpZiAocmVjdHMucmVmZXJlbmNlLnggIT09IHJlc2V0UmVjdHMucmVmZXJlbmNlLnggfHwgcmVjdHMucmVmZXJlbmNlLnkgIT09IHJlc2V0UmVjdHMucmVmZXJlbmNlLnkgfHwgcmVjdHMucmVmZXJlbmNlLndpZHRoICE9PSByZXNldFJlY3RzLnJlZmVyZW5jZS53aWR0aCB8fCByZWN0cy5yZWZlcmVuY2UuaGVpZ2h0ICE9PSByZXNldFJlY3RzLnJlZmVyZW5jZS5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcmVjdHM6IHJlc2V0UmVjdHNcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9O1xufTtcblxuLy8gRm9yIHR5cGUgYmFja3dhcmRzLWNvbXBhdGliaWxpdHksIHRoZSBgT2Zmc2V0T3B0aW9uc2AgdHlwZSB3YXMgYWxzb1xuLy8gRGVyaXZhYmxlLlxuXG5hc3luYyBmdW5jdGlvbiBjb252ZXJ0VmFsdWVUb0Nvb3JkcyhzdGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgcGxhY2VtZW50LFxuICAgIHBsYXRmb3JtLFxuICAgIGVsZW1lbnRzXG4gIH0gPSBzdGF0ZTtcbiAgY29uc3QgcnRsID0gYXdhaXQgKHBsYXRmb3JtLmlzUlRMID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc1JUTChlbGVtZW50cy5mbG9hdGluZykpO1xuICBjb25zdCBzaWRlID0gZ2V0U2lkZShwbGFjZW1lbnQpO1xuICBjb25zdCBhbGlnbm1lbnQgPSBnZXRBbGlnbm1lbnQocGxhY2VtZW50KTtcbiAgY29uc3QgaXNWZXJ0aWNhbCA9IGdldFNpZGVBeGlzKHBsYWNlbWVudCkgPT09ICd5JztcbiAgY29uc3QgbWFpbkF4aXNNdWx0aSA9IFsnbGVmdCcsICd0b3AnXS5pbmNsdWRlcyhzaWRlKSA/IC0xIDogMTtcbiAgY29uc3QgY3Jvc3NBeGlzTXVsdGkgPSBydGwgJiYgaXNWZXJ0aWNhbCA/IC0xIDogMTtcbiAgY29uc3QgcmF3VmFsdWUgPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBsZXQge1xuICAgIG1haW5BeGlzLFxuICAgIGNyb3NzQXhpcyxcbiAgICBhbGlnbm1lbnRBeGlzXG4gIH0gPSB0eXBlb2YgcmF3VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiByYXdWYWx1ZSxcbiAgICBjcm9zc0F4aXM6IDAsXG4gICAgYWxpZ25tZW50QXhpczogbnVsbFxuICB9IDoge1xuICAgIG1haW5BeGlzOiAwLFxuICAgIGNyb3NzQXhpczogMCxcbiAgICBhbGlnbm1lbnRBeGlzOiBudWxsLFxuICAgIC4uLnJhd1ZhbHVlXG4gIH07XG4gIGlmIChhbGlnbm1lbnQgJiYgdHlwZW9mIGFsaWdubWVudEF4aXMgPT09ICdudW1iZXInKSB7XG4gICAgY3Jvc3NBeGlzID0gYWxpZ25tZW50ID09PSAnZW5kJyA/IGFsaWdubWVudEF4aXMgKiAtMSA6IGFsaWdubWVudEF4aXM7XG4gIH1cbiAgcmV0dXJuIGlzVmVydGljYWwgPyB7XG4gICAgeDogY3Jvc3NBeGlzICogY3Jvc3NBeGlzTXVsdGksXG4gICAgeTogbWFpbkF4aXMgKiBtYWluQXhpc011bHRpXG4gIH0gOiB7XG4gICAgeDogbWFpbkF4aXMgKiBtYWluQXhpc011bHRpLFxuICAgIHk6IGNyb3NzQXhpcyAqIGNyb3NzQXhpc011bHRpXG4gIH07XG59XG5cbi8qKlxuICogTW9kaWZpZXMgdGhlIHBsYWNlbWVudCBieSB0cmFuc2xhdGluZyB0aGUgZmxvYXRpbmcgZWxlbWVudCBhbG9uZyB0aGVcbiAqIHNwZWNpZmllZCBheGVzLlxuICogQSBudW1iZXIgKHNob3J0aGFuZCBmb3IgYG1haW5BeGlzYCBvciBkaXN0YW5jZSksIG9yIGFuIGF4ZXMgY29uZmlndXJhdGlvblxuICogb2JqZWN0IG1heSBiZSBwYXNzZWQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvb2Zmc2V0XG4gKi9cbmNvbnN0IG9mZnNldCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0gMDtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgIG9wdGlvbnMsXG4gICAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkb2Zmc2UsIF9taWRkbGV3YXJlRGF0YSRhcnJvdztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBtaWRkbGV3YXJlRGF0YVxuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3QgZGlmZkNvb3JkcyA9IGF3YWl0IGNvbnZlcnRWYWx1ZVRvQ29vcmRzKHN0YXRlLCBvcHRpb25zKTtcblxuICAgICAgLy8gSWYgdGhlIHBsYWNlbWVudCBpcyB0aGUgc2FtZSBhbmQgdGhlIGFycm93IGNhdXNlZCBhbiBhbGlnbm1lbnQgb2Zmc2V0XG4gICAgICAvLyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBwb3NpdGlvbmluZyBjb29yZGluYXRlcy5cbiAgICAgIGlmIChwbGFjZW1lbnQgPT09ICgoX21pZGRsZXdhcmVEYXRhJG9mZnNlID0gbWlkZGxld2FyZURhdGEub2Zmc2V0KSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJG9mZnNlLnBsYWNlbWVudCkgJiYgKF9taWRkbGV3YXJlRGF0YSRhcnJvdyA9IG1pZGRsZXdhcmVEYXRhLmFycm93KSAhPSBudWxsICYmIF9taWRkbGV3YXJlRGF0YSRhcnJvdy5hbGlnbm1lbnRPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCArIGRpZmZDb29yZHMueCxcbiAgICAgICAgeTogeSArIGRpZmZDb29yZHMueSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIC4uLmRpZmZDb29yZHMsXG4gICAgICAgICAgcGxhY2VtZW50XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgc2hpZnRpbmcgaXQgaW4gb3JkZXIgdG9cbiAqIGtlZXAgaXQgaW4gdmlldyB3aGVuIGl0IHdpbGwgb3ZlcmZsb3cgdGhlIGNsaXBwaW5nIGJvdW5kYXJ5LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3NoaWZ0XG4gKi9cbmNvbnN0IHNoaWZ0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdzaGlmdCcsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBwbGFjZW1lbnRcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgICAgICBjcm9zc0F4aXM6IGNoZWNrQ3Jvc3NBeGlzID0gZmFsc2UsXG4gICAgICAgIGxpbWl0ZXIgPSB7XG4gICAgICAgICAgZm46IF9yZWYgPT4ge1xuICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeVxuICAgICAgICAgICAgfSA9IF9yZWY7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICB5XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuICAgICAgY29uc3QgY29vcmRzID0ge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9O1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zKTtcbiAgICAgIGNvbnN0IGNyb3NzQXhpcyA9IGdldFNpZGVBeGlzKGdldFNpZGUocGxhY2VtZW50KSk7XG4gICAgICBjb25zdCBtYWluQXhpcyA9IGdldE9wcG9zaXRlQXhpcyhjcm9zc0F4aXMpO1xuICAgICAgbGV0IG1haW5BeGlzQ29vcmQgPSBjb29yZHNbbWFpbkF4aXNdO1xuICAgICAgbGV0IGNyb3NzQXhpc0Nvb3JkID0gY29vcmRzW2Nyb3NzQXhpc107XG4gICAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgICBjb25zdCBtaW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/ICd0b3AnIDogJ2xlZnQnO1xuICAgICAgICBjb25zdCBtYXhTaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgICAgICAgY29uc3QgbWluID0gbWFpbkF4aXNDb29yZCArIG92ZXJmbG93W21pblNpZGVdO1xuICAgICAgICBjb25zdCBtYXggPSBtYWluQXhpc0Nvb3JkIC0gb3ZlcmZsb3dbbWF4U2lkZV07XG4gICAgICAgIG1haW5BeGlzQ29vcmQgPSBjbGFtcChtaW4sIG1haW5BeGlzQ29vcmQsIG1heCk7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tDcm9zc0F4aXMpIHtcbiAgICAgICAgY29uc3QgbWluU2lkZSA9IGNyb3NzQXhpcyA9PT0gJ3knID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgICAgIGNvbnN0IG1heFNpZGUgPSBjcm9zc0F4aXMgPT09ICd5JyA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgICAgICAgY29uc3QgbWluID0gY3Jvc3NBeGlzQ29vcmQgKyBvdmVyZmxvd1ttaW5TaWRlXTtcbiAgICAgICAgY29uc3QgbWF4ID0gY3Jvc3NBeGlzQ29vcmQgLSBvdmVyZmxvd1ttYXhTaWRlXTtcbiAgICAgICAgY3Jvc3NBeGlzQ29vcmQgPSBjbGFtcChtaW4sIGNyb3NzQXhpc0Nvb3JkLCBtYXgpO1xuICAgICAgfVxuICAgICAgY29uc3QgbGltaXRlZENvb3JkcyA9IGxpbWl0ZXIuZm4oe1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgW21haW5BeGlzXTogbWFpbkF4aXNDb29yZCxcbiAgICAgICAgW2Nyb3NzQXhpc106IGNyb3NzQXhpc0Nvb3JkXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmxpbWl0ZWRDb29yZHMsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB4OiBsaW1pdGVkQ29vcmRzLnggLSB4LFxuICAgICAgICAgIHk6IGxpbWl0ZWRDb29yZHMueSAtIHlcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuLyoqXG4gKiBCdWlsdC1pbiBgbGltaXRlcmAgdGhhdCB3aWxsIHN0b3AgYHNoaWZ0KClgIGF0IGEgY2VydGFpbiBwb2ludC5cbiAqL1xuY29uc3QgbGltaXRTaGlmdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBvcHRpb25zLFxuICAgIGZuKHN0YXRlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIG1pZGRsZXdhcmVEYXRhXG4gICAgICB9ID0gc3RhdGU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG9mZnNldCA9IDAsXG4gICAgICAgIG1haW5BeGlzOiBjaGVja01haW5BeGlzID0gdHJ1ZSxcbiAgICAgICAgY3Jvc3NBeGlzOiBjaGVja0Nyb3NzQXhpcyA9IHRydWVcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH07XG4gICAgICBjb25zdCBjcm9zc0F4aXMgPSBnZXRTaWRlQXhpcyhwbGFjZW1lbnQpO1xuICAgICAgY29uc3QgbWFpbkF4aXMgPSBnZXRPcHBvc2l0ZUF4aXMoY3Jvc3NBeGlzKTtcbiAgICAgIGxldCBtYWluQXhpc0Nvb3JkID0gY29vcmRzW21haW5BeGlzXTtcbiAgICAgIGxldCBjcm9zc0F4aXNDb29yZCA9IGNvb3Jkc1tjcm9zc0F4aXNdO1xuICAgICAgY29uc3QgcmF3T2Zmc2V0ID0gZXZhbHVhdGUob2Zmc2V0LCBzdGF0ZSk7XG4gICAgICBjb25zdCBjb21wdXRlZE9mZnNldCA9IHR5cGVvZiByYXdPZmZzZXQgPT09ICdudW1iZXInID8ge1xuICAgICAgICBtYWluQXhpczogcmF3T2Zmc2V0LFxuICAgICAgICBjcm9zc0F4aXM6IDBcbiAgICAgIH0gOiB7XG4gICAgICAgIG1haW5BeGlzOiAwLFxuICAgICAgICBjcm9zc0F4aXM6IDAsXG4gICAgICAgIC4uLnJhd09mZnNldFxuICAgICAgfTtcbiAgICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICAgIGNvbnN0IGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgICAgIGNvbnN0IGxpbWl0TWluID0gcmVjdHMucmVmZXJlbmNlW21haW5BeGlzXSAtIHJlY3RzLmZsb2F0aW5nW2xlbl0gKyBjb21wdXRlZE9mZnNldC5tYWluQXhpcztcbiAgICAgICAgY29uc3QgbGltaXRNYXggPSByZWN0cy5yZWZlcmVuY2VbbWFpbkF4aXNdICsgcmVjdHMucmVmZXJlbmNlW2xlbl0gLSBjb21wdXRlZE9mZnNldC5tYWluQXhpcztcbiAgICAgICAgaWYgKG1haW5BeGlzQ29vcmQgPCBsaW1pdE1pbikge1xuICAgICAgICAgIG1haW5BeGlzQ29vcmQgPSBsaW1pdE1pbjtcbiAgICAgICAgfSBlbHNlIGlmIChtYWluQXhpc0Nvb3JkID4gbGltaXRNYXgpIHtcbiAgICAgICAgICBtYWluQXhpc0Nvb3JkID0gbGltaXRNYXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjaGVja0Nyb3NzQXhpcykge1xuICAgICAgICB2YXIgX21pZGRsZXdhcmVEYXRhJG9mZnNlLCBfbWlkZGxld2FyZURhdGEkb2Zmc2UyO1xuICAgICAgICBjb25zdCBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBjb25zdCBpc09yaWdpblNpZGUgPSBbJ3RvcCcsICdsZWZ0J10uaW5jbHVkZXMoZ2V0U2lkZShwbGFjZW1lbnQpKTtcbiAgICAgICAgY29uc3QgbGltaXRNaW4gPSByZWN0cy5yZWZlcmVuY2VbY3Jvc3NBeGlzXSAtIHJlY3RzLmZsb2F0aW5nW2xlbl0gKyAoaXNPcmlnaW5TaWRlID8gKChfbWlkZGxld2FyZURhdGEkb2Zmc2UgPSBtaWRkbGV3YXJlRGF0YS5vZmZzZXQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkb2Zmc2VbY3Jvc3NBeGlzXSkgfHwgMCA6IDApICsgKGlzT3JpZ2luU2lkZSA/IDAgOiBjb21wdXRlZE9mZnNldC5jcm9zc0F4aXMpO1xuICAgICAgICBjb25zdCBsaW1pdE1heCA9IHJlY3RzLnJlZmVyZW5jZVtjcm9zc0F4aXNdICsgcmVjdHMucmVmZXJlbmNlW2xlbl0gKyAoaXNPcmlnaW5TaWRlID8gMCA6ICgoX21pZGRsZXdhcmVEYXRhJG9mZnNlMiA9IG1pZGRsZXdhcmVEYXRhLm9mZnNldCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRvZmZzZTJbY3Jvc3NBeGlzXSkgfHwgMCkgLSAoaXNPcmlnaW5TaWRlID8gY29tcHV0ZWRPZmZzZXQuY3Jvc3NBeGlzIDogMCk7XG4gICAgICAgIGlmIChjcm9zc0F4aXNDb29yZCA8IGxpbWl0TWluKSB7XG4gICAgICAgICAgY3Jvc3NBeGlzQ29vcmQgPSBsaW1pdE1pbjtcbiAgICAgICAgfSBlbHNlIGlmIChjcm9zc0F4aXNDb29yZCA+IGxpbWl0TWF4KSB7XG4gICAgICAgICAgY3Jvc3NBeGlzQ29vcmQgPSBsaW1pdE1heDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW21haW5BeGlzXTogbWFpbkF4aXNDb29yZCxcbiAgICAgICAgW2Nyb3NzQXhpc106IGNyb3NzQXhpc0Nvb3JkXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0aGF0IGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IOKAlFxuICogZm9yIGluc3RhbmNlLCBwcmV2ZW50IGl0IGZyb20gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIGJvdW5kYXJ5IG9yIG1hdGNoIHRoZVxuICogd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3NpemVcbiAqL1xuY29uc3Qgc2l6ZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnc2l6ZScsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIHJlY3RzLFxuICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgZWxlbWVudHNcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYXBwbHkgPSAoKSA9PiB7fSxcbiAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zKTtcbiAgICAgIGNvbnN0IHNpZGUgPSBnZXRTaWRlKHBsYWNlbWVudCk7XG4gICAgICBjb25zdCBhbGlnbm1lbnQgPSBnZXRBbGlnbm1lbnQocGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IGlzWUF4aXMgPSBnZXRTaWRlQXhpcyhwbGFjZW1lbnQpID09PSAneSc7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0gPSByZWN0cy5mbG9hdGluZztcbiAgICAgIGxldCBoZWlnaHRTaWRlO1xuICAgICAgbGV0IHdpZHRoU2lkZTtcbiAgICAgIGlmIChzaWRlID09PSAndG9wJyB8fCBzaWRlID09PSAnYm90dG9tJykge1xuICAgICAgICBoZWlnaHRTaWRlID0gc2lkZTtcbiAgICAgICAgd2lkdGhTaWRlID0gYWxpZ25tZW50ID09PSAoKGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKSkgPyAnc3RhcnQnIDogJ2VuZCcpID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpZHRoU2lkZSA9IHNpZGU7XG4gICAgICAgIGhlaWdodFNpZGUgPSBhbGlnbm1lbnQgPT09ICdlbmQnID8gJ3RvcCcgOiAnYm90dG9tJztcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1heGltdW1DbGlwcGluZ0hlaWdodCA9IGhlaWdodCAtIG92ZXJmbG93LnRvcCAtIG92ZXJmbG93LmJvdHRvbTtcbiAgICAgIGNvbnN0IG1heGltdW1DbGlwcGluZ1dpZHRoID0gd2lkdGggLSBvdmVyZmxvdy5sZWZ0IC0gb3ZlcmZsb3cucmlnaHQ7XG4gICAgICBjb25zdCBvdmVyZmxvd0F2YWlsYWJsZUhlaWdodCA9IG1pbihoZWlnaHQgLSBvdmVyZmxvd1toZWlnaHRTaWRlXSwgbWF4aW11bUNsaXBwaW5nSGVpZ2h0KTtcbiAgICAgIGNvbnN0IG92ZXJmbG93QXZhaWxhYmxlV2lkdGggPSBtaW4od2lkdGggLSBvdmVyZmxvd1t3aWR0aFNpZGVdLCBtYXhpbXVtQ2xpcHBpbmdXaWR0aCk7XG4gICAgICBjb25zdCBub1NoaWZ0ID0gIXN0YXRlLm1pZGRsZXdhcmVEYXRhLnNoaWZ0O1xuICAgICAgbGV0IGF2YWlsYWJsZUhlaWdodCA9IG92ZXJmbG93QXZhaWxhYmxlSGVpZ2h0O1xuICAgICAgbGV0IGF2YWlsYWJsZVdpZHRoID0gb3ZlcmZsb3dBdmFpbGFibGVXaWR0aDtcbiAgICAgIGlmIChpc1lBeGlzKSB7XG4gICAgICAgIGF2YWlsYWJsZVdpZHRoID0gYWxpZ25tZW50IHx8IG5vU2hpZnQgPyBtaW4ob3ZlcmZsb3dBdmFpbGFibGVXaWR0aCwgbWF4aW11bUNsaXBwaW5nV2lkdGgpIDogbWF4aW11bUNsaXBwaW5nV2lkdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdmFpbGFibGVIZWlnaHQgPSBhbGlnbm1lbnQgfHwgbm9TaGlmdCA/IG1pbihvdmVyZmxvd0F2YWlsYWJsZUhlaWdodCwgbWF4aW11bUNsaXBwaW5nSGVpZ2h0KSA6IG1heGltdW1DbGlwcGluZ0hlaWdodDtcbiAgICAgIH1cbiAgICAgIGlmIChub1NoaWZ0ICYmICFhbGlnbm1lbnQpIHtcbiAgICAgICAgY29uc3QgeE1pbiA9IG1heChvdmVyZmxvdy5sZWZ0LCAwKTtcbiAgICAgICAgY29uc3QgeE1heCA9IG1heChvdmVyZmxvdy5yaWdodCwgMCk7XG4gICAgICAgIGNvbnN0IHlNaW4gPSBtYXgob3ZlcmZsb3cudG9wLCAwKTtcbiAgICAgICAgY29uc3QgeU1heCA9IG1heChvdmVyZmxvdy5ib3R0b20sIDApO1xuICAgICAgICBpZiAoaXNZQXhpcykge1xuICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gd2lkdGggLSAyICogKHhNaW4gIT09IDAgfHwgeE1heCAhPT0gMCA/IHhNaW4gKyB4TWF4IDogbWF4KG92ZXJmbG93LmxlZnQsIG92ZXJmbG93LnJpZ2h0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXZhaWxhYmxlSGVpZ2h0ID0gaGVpZ2h0IC0gMiAqICh5TWluICE9PSAwIHx8IHlNYXggIT09IDAgPyB5TWluICsgeU1heCA6IG1heChvdmVyZmxvdy50b3AsIG92ZXJmbG93LmJvdHRvbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBhcHBseSh7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBhdmFpbGFibGVXaWR0aCxcbiAgICAgICAgYXZhaWxhYmxlSGVpZ2h0XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG5leHREaW1lbnNpb25zID0gYXdhaXQgcGxhdGZvcm0uZ2V0RGltZW5zaW9ucyhlbGVtZW50cy5mbG9hdGluZyk7XG4gICAgICBpZiAod2lkdGggIT09IG5leHREaW1lbnNpb25zLndpZHRoIHx8IGhlaWdodCAhPT0gbmV4dERpbWVuc2lvbnMuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHJlY3RzOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbn07XG5cbmV4cG9ydCB7IGFycm93LCBhdXRvUGxhY2VtZW50LCBjb21wdXRlUG9zaXRpb24sIGRldGVjdE92ZXJmbG93LCBmbGlwLCBoaWRlLCBpbmxpbmUsIGxpbWl0U2hpZnQsIG9mZnNldCwgc2hpZnQsIHNpemUgfTtcbiIsImltcG9ydCB7IHJlY3RUb0NsaWVudFJlY3QsIGRldGVjdE92ZXJmbG93IGFzIGRldGVjdE92ZXJmbG93JDEsIG9mZnNldCBhcyBvZmZzZXQkMSwgYXV0b1BsYWNlbWVudCBhcyBhdXRvUGxhY2VtZW50JDEsIHNoaWZ0IGFzIHNoaWZ0JDEsIGZsaXAgYXMgZmxpcCQxLCBzaXplIGFzIHNpemUkMSwgaGlkZSBhcyBoaWRlJDEsIGFycm93IGFzIGFycm93JDEsIGlubGluZSBhcyBpbmxpbmUkMSwgbGltaXRTaGlmdCBhcyBsaW1pdFNoaWZ0JDEsIGNvbXB1dGVQb3NpdGlvbiBhcyBjb21wdXRlUG9zaXRpb24kMSB9IGZyb20gJ0BmbG9hdGluZy11aS9jb3JlJztcbmltcG9ydCB7IHJvdW5kLCBjcmVhdGVDb29yZHMsIG1heCwgbWluLCBmbG9vciB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscyc7XG5pbXBvcnQgeyBnZXRDb21wdXRlZFN0eWxlLCBpc0hUTUxFbGVtZW50LCBpc0VsZW1lbnQsIGdldFdpbmRvdywgaXNXZWJLaXQsIGdldEZyYW1lRWxlbWVudCwgZ2V0RG9jdW1lbnRFbGVtZW50LCBpc1RvcExheWVyLCBnZXROb2RlTmFtZSwgaXNPdmVyZmxvd0VsZW1lbnQsIGdldE5vZGVTY3JvbGwsIGdldE92ZXJmbG93QW5jZXN0b3JzLCBnZXRQYXJlbnROb2RlLCBpc0xhc3RUcmF2ZXJzYWJsZU5vZGUsIGlzQ29udGFpbmluZ0Jsb2NrLCBpc1RhYmxlRWxlbWVudCwgZ2V0Q29udGFpbmluZ0Jsb2NrIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzL2RvbSc7XG5leHBvcnQgeyBnZXRPdmVyZmxvd0FuY2VzdG9ycyB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscy9kb20nO1xuXG5mdW5jdGlvbiBnZXRDc3NEaW1lbnNpb25zKGVsZW1lbnQpIHtcbiAgY29uc3QgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgLy8gSW4gdGVzdGluZyBlbnZpcm9ubWVudHMsIHRoZSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBwcm9wZXJ0aWVzIGFyZSBlbXB0eVxuICAvLyBzdHJpbmdzIGZvciBTVkcgZWxlbWVudHMsIHJldHVybmluZyBOYU4uIEZhbGxiYWNrIHRvIGAwYCBpbiB0aGlzIGNhc2UuXG4gIGxldCB3aWR0aCA9IHBhcnNlRmxvYXQoY3NzLndpZHRoKSB8fCAwO1xuICBsZXQgaGVpZ2h0ID0gcGFyc2VGbG9hdChjc3MuaGVpZ2h0KSB8fCAwO1xuICBjb25zdCBoYXNPZmZzZXQgPSBpc0hUTUxFbGVtZW50KGVsZW1lbnQpO1xuICBjb25zdCBvZmZzZXRXaWR0aCA9IGhhc09mZnNldCA/IGVsZW1lbnQub2Zmc2V0V2lkdGggOiB3aWR0aDtcbiAgY29uc3Qgb2Zmc2V0SGVpZ2h0ID0gaGFzT2Zmc2V0ID8gZWxlbWVudC5vZmZzZXRIZWlnaHQgOiBoZWlnaHQ7XG4gIGNvbnN0IHNob3VsZEZhbGxiYWNrID0gcm91bmQod2lkdGgpICE9PSBvZmZzZXRXaWR0aCB8fCByb3VuZChoZWlnaHQpICE9PSBvZmZzZXRIZWlnaHQ7XG4gIGlmIChzaG91bGRGYWxsYmFjaykge1xuICAgIHdpZHRoID0gb2Zmc2V0V2lkdGg7XG4gICAgaGVpZ2h0ID0gb2Zmc2V0SGVpZ2h0O1xuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgICQ6IHNob3VsZEZhbGxiYWNrXG4gIH07XG59XG5cbmZ1bmN0aW9uIHVud3JhcEVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gIWlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgOiBlbGVtZW50O1xufVxuXG5mdW5jdGlvbiBnZXRTY2FsZShlbGVtZW50KSB7XG4gIGNvbnN0IGRvbUVsZW1lbnQgPSB1bndyYXBFbGVtZW50KGVsZW1lbnQpO1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZG9tRWxlbWVudCkpIHtcbiAgICByZXR1cm4gY3JlYXRlQ29vcmRzKDEpO1xuICB9XG4gIGNvbnN0IHJlY3QgPSBkb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgICRcbiAgfSA9IGdldENzc0RpbWVuc2lvbnMoZG9tRWxlbWVudCk7XG4gIGxldCB4ID0gKCQgPyByb3VuZChyZWN0LndpZHRoKSA6IHJlY3Qud2lkdGgpIC8gd2lkdGg7XG4gIGxldCB5ID0gKCQgPyByb3VuZChyZWN0LmhlaWdodCkgOiByZWN0LmhlaWdodCkgLyBoZWlnaHQ7XG5cbiAgLy8gMCwgTmFOLCBvciBJbmZpbml0eSBzaG91bGQgYWx3YXlzIGZhbGxiYWNrIHRvIDEuXG5cbiAgaWYgKCF4IHx8ICFOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICB4ID0gMTtcbiAgfVxuICBpZiAoIXkgfHwgIU51bWJlci5pc0Zpbml0ZSh5KSkge1xuICAgIHkgPSAxO1xuICB9XG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5cbmNvbnN0IG5vT2Zmc2V0cyA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb29yZHMoMCk7XG5mdW5jdGlvbiBnZXRWaXN1YWxPZmZzZXRzKGVsZW1lbnQpIHtcbiAgY29uc3Qgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICBpZiAoIWlzV2ViS2l0KCkgfHwgIXdpbi52aXN1YWxWaWV3cG9ydCkge1xuICAgIHJldHVybiBub09mZnNldHM7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB4OiB3aW4udmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCxcbiAgICB5OiB3aW4udmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wXG4gIH07XG59XG5mdW5jdGlvbiBzaG91bGRBZGRWaXN1YWxPZmZzZXRzKGVsZW1lbnQsIGlzRml4ZWQsIGZsb2F0aW5nT2Zmc2V0UGFyZW50KSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cbiAgaWYgKCFmbG9hdGluZ09mZnNldFBhcmVudCB8fCBpc0ZpeGVkICYmIGZsb2F0aW5nT2Zmc2V0UGFyZW50ICE9PSBnZXRXaW5kb3coZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGlzRml4ZWQ7XG59XG5cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUsIGlzRml4ZWRTdHJhdGVneSwgb2Zmc2V0UGFyZW50KSB7XG4gIGlmIChpbmNsdWRlU2NhbGUgPT09IHZvaWQgMCkge1xuICAgIGluY2x1ZGVTY2FsZSA9IGZhbHNlO1xuICB9XG4gIGlmIChpc0ZpeGVkU3RyYXRlZ3kgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWRTdHJhdGVneSA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IGNsaWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBkb21FbGVtZW50ID0gdW53cmFwRWxlbWVudChlbGVtZW50KTtcbiAgbGV0IHNjYWxlID0gY3JlYXRlQ29vcmRzKDEpO1xuICBpZiAoaW5jbHVkZVNjYWxlKSB7XG4gICAgaWYgKG9mZnNldFBhcmVudCkge1xuICAgICAgaWYgKGlzRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICAgIHNjYWxlID0gZ2V0U2NhbGUob2Zmc2V0UGFyZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2NhbGUgPSBnZXRTY2FsZShlbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdmlzdWFsT2Zmc2V0cyA9IHNob3VsZEFkZFZpc3VhbE9mZnNldHMoZG9tRWxlbWVudCwgaXNGaXhlZFN0cmF0ZWd5LCBvZmZzZXRQYXJlbnQpID8gZ2V0VmlzdWFsT2Zmc2V0cyhkb21FbGVtZW50KSA6IGNyZWF0ZUNvb3JkcygwKTtcbiAgbGV0IHggPSAoY2xpZW50UmVjdC5sZWZ0ICsgdmlzdWFsT2Zmc2V0cy54KSAvIHNjYWxlLng7XG4gIGxldCB5ID0gKGNsaWVudFJlY3QudG9wICsgdmlzdWFsT2Zmc2V0cy55KSAvIHNjYWxlLnk7XG4gIGxldCB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZS54O1xuICBsZXQgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQgLyBzY2FsZS55O1xuICBpZiAoZG9tRWxlbWVudCkge1xuICAgIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhkb21FbGVtZW50KTtcbiAgICBjb25zdCBvZmZzZXRXaW4gPSBvZmZzZXRQYXJlbnQgJiYgaXNFbGVtZW50KG9mZnNldFBhcmVudCkgPyBnZXRXaW5kb3cob2Zmc2V0UGFyZW50KSA6IG9mZnNldFBhcmVudDtcbiAgICBsZXQgY3VycmVudFdpbiA9IHdpbjtcbiAgICBsZXQgY3VycmVudElGcmFtZSA9IGdldEZyYW1lRWxlbWVudChjdXJyZW50V2luKTtcbiAgICB3aGlsZSAoY3VycmVudElGcmFtZSAmJiBvZmZzZXRQYXJlbnQgJiYgb2Zmc2V0V2luICE9PSBjdXJyZW50V2luKSB7XG4gICAgICBjb25zdCBpZnJhbWVTY2FsZSA9IGdldFNjYWxlKGN1cnJlbnRJRnJhbWUpO1xuICAgICAgY29uc3QgaWZyYW1lUmVjdCA9IGN1cnJlbnRJRnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBjc3MgPSBnZXRDb21wdXRlZFN0eWxlKGN1cnJlbnRJRnJhbWUpO1xuICAgICAgY29uc3QgbGVmdCA9IGlmcmFtZVJlY3QubGVmdCArIChjdXJyZW50SUZyYW1lLmNsaWVudExlZnQgKyBwYXJzZUZsb2F0KGNzcy5wYWRkaW5nTGVmdCkpICogaWZyYW1lU2NhbGUueDtcbiAgICAgIGNvbnN0IHRvcCA9IGlmcmFtZVJlY3QudG9wICsgKGN1cnJlbnRJRnJhbWUuY2xpZW50VG9wICsgcGFyc2VGbG9hdChjc3MucGFkZGluZ1RvcCkpICogaWZyYW1lU2NhbGUueTtcbiAgICAgIHggKj0gaWZyYW1lU2NhbGUueDtcbiAgICAgIHkgKj0gaWZyYW1lU2NhbGUueTtcbiAgICAgIHdpZHRoICo9IGlmcmFtZVNjYWxlLng7XG4gICAgICBoZWlnaHQgKj0gaWZyYW1lU2NhbGUueTtcbiAgICAgIHggKz0gbGVmdDtcbiAgICAgIHkgKz0gdG9wO1xuICAgICAgY3VycmVudFdpbiA9IGdldFdpbmRvdyhjdXJyZW50SUZyYW1lKTtcbiAgICAgIGN1cnJlbnRJRnJhbWUgPSBnZXRGcmFtZUVsZW1lbnQoY3VycmVudFdpbik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWN0VG9DbGllbnRSZWN0KHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeCxcbiAgICB5XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdChfcmVmKSB7XG4gIGxldCB7XG4gICAgZWxlbWVudHMsXG4gICAgcmVjdCxcbiAgICBvZmZzZXRQYXJlbnQsXG4gICAgc3RyYXRlZ3lcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGlzRml4ZWQgPSBzdHJhdGVneSA9PT0gJ2ZpeGVkJztcbiAgY29uc3QgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIGNvbnN0IHRvcExheWVyID0gZWxlbWVudHMgPyBpc1RvcExheWVyKGVsZW1lbnRzLmZsb2F0aW5nKSA6IGZhbHNlO1xuICBpZiAob2Zmc2V0UGFyZW50ID09PSBkb2N1bWVudEVsZW1lbnQgfHwgdG9wTGF5ZXIgJiYgaXNGaXhlZCkge1xuICAgIHJldHVybiByZWN0O1xuICB9XG4gIGxldCBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgbGV0IHNjYWxlID0gY3JlYXRlQ29vcmRzKDEpO1xuICBjb25zdCBvZmZzZXRzID0gY3JlYXRlQ29vcmRzKDApO1xuICBjb25zdCBpc09mZnNldFBhcmVudEFuRWxlbWVudCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgaWYgKGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50IHx8ICFpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiAhaXNGaXhlZCkge1xuICAgIGlmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpICE9PSAnYm9keScgfHwgaXNPdmVyZmxvd0VsZW1lbnQoZG9jdW1lbnRFbGVtZW50KSkge1xuICAgICAgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChvZmZzZXRQYXJlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBjb25zdCBvZmZzZXRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCk7XG4gICAgICBzY2FsZSA9IGdldFNjYWxlKG9mZnNldFBhcmVudCk7XG4gICAgICBvZmZzZXRzLnggPSBvZmZzZXRSZWN0LnggKyBvZmZzZXRQYXJlbnQuY2xpZW50TGVmdDtcbiAgICAgIG9mZnNldHMueSA9IG9mZnNldFJlY3QueSArIG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHJlY3Qud2lkdGggKiBzY2FsZS54LFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHQgKiBzY2FsZS55LFxuICAgIHg6IHJlY3QueCAqIHNjYWxlLnggLSBzY3JvbGwuc2Nyb2xsTGVmdCAqIHNjYWxlLnggKyBvZmZzZXRzLngsXG4gICAgeTogcmVjdC55ICogc2NhbGUueSAtIHNjcm9sbC5zY3JvbGxUb3AgKiBzY2FsZS55ICsgb2Zmc2V0cy55XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldENsaWVudFJlY3RzKGVsZW1lbnQpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5nZXRDbGllbnRSZWN0cygpKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSB7XG4gIC8vIElmIDxodG1sPiBoYXMgYSBDU1Mgd2lkdGggZ3JlYXRlciB0aGFuIHRoZSB2aWV3cG9ydCwgdGhlbiB0aGlzIHdpbGwgYmVcbiAgLy8gaW5jb3JyZWN0IGZvciBSVEwuXG4gIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICsgZ2V0Tm9kZVNjcm9sbChlbGVtZW50KS5zY3JvbGxMZWZ0O1xufVxuXG4vLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlLlxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQpIHtcbiAgY29uc3QgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgY29uc3Qgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChlbGVtZW50KTtcbiAgY29uc3QgYm9keSA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5O1xuICBjb25zdCB3aWR0aCA9IG1heChodG1sLnNjcm9sbFdpZHRoLCBodG1sLmNsaWVudFdpZHRoLCBib2R5LnNjcm9sbFdpZHRoLCBib2R5LmNsaWVudFdpZHRoKTtcbiAgY29uc3QgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keS5zY3JvbGxIZWlnaHQsIGJvZHkuY2xpZW50SGVpZ2h0KTtcbiAgbGV0IHggPSAtc2Nyb2xsLnNjcm9sbExlZnQgKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpO1xuICBjb25zdCB5ID0gLXNjcm9sbC5zY3JvbGxUb3A7XG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKGJvZHkpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5LmNsaWVudFdpZHRoKSAtIHdpZHRoO1xuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCwgc3RyYXRlZ3kpIHtcbiAgY29uc3Qgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICBjb25zdCBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICBjb25zdCB2aXN1YWxWaWV3cG9ydCA9IHdpbi52aXN1YWxWaWV3cG9ydDtcbiAgbGV0IHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgbGV0IGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICBsZXQgeCA9IDA7XG4gIGxldCB5ID0gMDtcbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7XG4gICAgY29uc3QgdmlzdWFsVmlld3BvcnRCYXNlZCA9IGlzV2ViS2l0KCk7XG4gICAgaWYgKCF2aXN1YWxWaWV3cG9ydEJhc2VkIHx8IHZpc3VhbFZpZXdwb3J0QmFzZWQgJiYgc3RyYXRlZ3kgPT09ICdmaXhlZCcpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5cbi8vIFJldHVybnMgdGhlIGlubmVyIGNsaWVudCByZWN0LCBzdWJ0cmFjdGluZyBzY3JvbGxiYXJzIGlmIHByZXNlbnQuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICBjb25zdCBjbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIHRydWUsIHN0cmF0ZWd5ID09PSAnZml4ZWQnKTtcbiAgY29uc3QgdG9wID0gY2xpZW50UmVjdC50b3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgY29uc3QgbGVmdCA9IGNsaWVudFJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgY29uc3Qgc2NhbGUgPSBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0U2NhbGUoZWxlbWVudCkgOiBjcmVhdGVDb29yZHMoMSk7XG4gIGNvbnN0IHdpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aCAqIHNjYWxlLng7XG4gIGNvbnN0IGhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0ICogc2NhbGUueTtcbiAgY29uc3QgeCA9IGxlZnQgKiBzY2FsZS54O1xuICBjb25zdCB5ID0gdG9wICogc2NhbGUueTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbUNsaXBwaW5nQW5jZXN0b3IoZWxlbWVudCwgY2xpcHBpbmdBbmNlc3Rvciwgc3RyYXRlZ3kpIHtcbiAgbGV0IHJlY3Q7XG4gIGlmIChjbGlwcGluZ0FuY2VzdG9yID09PSAndmlld3BvcnQnKSB7XG4gICAgcmVjdCA9IGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSk7XG4gIH0gZWxzZSBpZiAoY2xpcHBpbmdBbmNlc3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgIHJlY3QgPSBnZXREb2N1bWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKTtcbiAgfSBlbHNlIGlmIChpc0VsZW1lbnQoY2xpcHBpbmdBbmNlc3RvcikpIHtcbiAgICByZWN0ID0gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoY2xpcHBpbmdBbmNlc3Rvciwgc3RyYXRlZ3kpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHZpc3VhbE9mZnNldHMgPSBnZXRWaXN1YWxPZmZzZXRzKGVsZW1lbnQpO1xuICAgIHJlY3QgPSB7XG4gICAgICAuLi5jbGlwcGluZ0FuY2VzdG9yLFxuICAgICAgeDogY2xpcHBpbmdBbmNlc3Rvci54IC0gdmlzdWFsT2Zmc2V0cy54LFxuICAgICAgeTogY2xpcHBpbmdBbmNlc3Rvci55IC0gdmlzdWFsT2Zmc2V0cy55XG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmVjdFRvQ2xpZW50UmVjdChyZWN0KTtcbn1cbmZ1bmN0aW9uIGhhc0ZpeGVkUG9zaXRpb25BbmNlc3RvcihlbGVtZW50LCBzdG9wTm9kZSkge1xuICBjb25zdCBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcbiAgaWYgKHBhcmVudE5vZGUgPT09IHN0b3BOb2RlIHx8ICFpc0VsZW1lbnQocGFyZW50Tm9kZSkgfHwgaXNMYXN0VHJhdmVyc2FibGVOb2RlKHBhcmVudE5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKHBhcmVudE5vZGUpLnBvc2l0aW9uID09PSAnZml4ZWQnIHx8IGhhc0ZpeGVkUG9zaXRpb25BbmNlc3RvcihwYXJlbnROb2RlLCBzdG9wTm9kZSk7XG59XG5cbi8vIEEgXCJjbGlwcGluZyBhbmNlc3RvclwiIGlzIGFuIGBvdmVyZmxvd2AgZWxlbWVudCB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgY2hpbGQgZWxlbWVudHMuIFRoaXMgcmV0dXJucyBhbGwgY2xpcHBpbmcgYW5jZXN0b3JzXG4vLyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCB1cCB0aGUgdHJlZS5cbmZ1bmN0aW9uIGdldENsaXBwaW5nRWxlbWVudEFuY2VzdG9ycyhlbGVtZW50LCBjYWNoZSkge1xuICBjb25zdCBjYWNoZWRSZXN1bHQgPSBjYWNoZS5nZXQoZWxlbWVudCk7XG4gIGlmIChjYWNoZWRSZXN1bHQpIHtcbiAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICB9XG4gIGxldCByZXN1bHQgPSBnZXRPdmVyZmxvd0FuY2VzdG9ycyhlbGVtZW50LCBbXSwgZmFsc2UpLmZpbHRlcihlbCA9PiBpc0VsZW1lbnQoZWwpICYmIGdldE5vZGVOYW1lKGVsKSAhPT0gJ2JvZHknKTtcbiAgbGV0IGN1cnJlbnRDb250YWluaW5nQmxvY2tDb21wdXRlZFN0eWxlID0gbnVsbDtcbiAgY29uc3QgZWxlbWVudElzRml4ZWQgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uID09PSAnZml4ZWQnO1xuICBsZXQgY3VycmVudE5vZGUgPSBlbGVtZW50SXNGaXhlZCA/IGdldFBhcmVudE5vZGUoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG4gIHdoaWxlIChpc0VsZW1lbnQoY3VycmVudE5vZGUpICYmICFpc0xhc3RUcmF2ZXJzYWJsZU5vZGUoY3VycmVudE5vZGUpKSB7XG4gICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpO1xuICAgIGNvbnN0IGN1cnJlbnROb2RlSXNDb250YWluaW5nID0gaXNDb250YWluaW5nQmxvY2soY3VycmVudE5vZGUpO1xuICAgIGlmICghY3VycmVudE5vZGVJc0NvbnRhaW5pbmcgJiYgY29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgY3VycmVudENvbnRhaW5pbmdCbG9ja0NvbXB1dGVkU3R5bGUgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBzaG91bGREcm9wQ3VycmVudE5vZGUgPSBlbGVtZW50SXNGaXhlZCA/ICFjdXJyZW50Tm9kZUlzQ29udGFpbmluZyAmJiAhY3VycmVudENvbnRhaW5pbmdCbG9ja0NvbXB1dGVkU3R5bGUgOiAhY3VycmVudE5vZGVJc0NvbnRhaW5pbmcgJiYgY29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycgJiYgISFjdXJyZW50Q29udGFpbmluZ0Jsb2NrQ29tcHV0ZWRTdHlsZSAmJiBbJ2Fic29sdXRlJywgJ2ZpeGVkJ10uaW5jbHVkZXMoY3VycmVudENvbnRhaW5pbmdCbG9ja0NvbXB1dGVkU3R5bGUucG9zaXRpb24pIHx8IGlzT3ZlcmZsb3dFbGVtZW50KGN1cnJlbnROb2RlKSAmJiAhY3VycmVudE5vZGVJc0NvbnRhaW5pbmcgJiYgaGFzRml4ZWRQb3NpdGlvbkFuY2VzdG9yKGVsZW1lbnQsIGN1cnJlbnROb2RlKTtcbiAgICBpZiAoc2hvdWxkRHJvcEN1cnJlbnROb2RlKSB7XG4gICAgICAvLyBEcm9wIG5vbi1jb250YWluaW5nIGJsb2Nrcy5cbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoYW5jZXN0b3IgPT4gYW5jZXN0b3IgIT09IGN1cnJlbnROb2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVjb3JkIGxhc3QgY29udGFpbmluZyBibG9jayBmb3IgbmV4dCBpdGVyYXRpb24uXG4gICAgICBjdXJyZW50Q29udGFpbmluZ0Jsb2NrQ29tcHV0ZWRTdHlsZSA9IGNvbXB1dGVkU3R5bGU7XG4gICAgfVxuICAgIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShjdXJyZW50Tm9kZSk7XG4gIH1cbiAgY2FjaGUuc2V0KGVsZW1lbnQsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIGFuY2VzdG9ycy5cbmZ1bmN0aW9uIGdldENsaXBwaW5nUmVjdChfcmVmKSB7XG4gIGxldCB7XG4gICAgZWxlbWVudCxcbiAgICBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnksXG4gICAgc3RyYXRlZ3lcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGVsZW1lbnRDbGlwcGluZ0FuY2VzdG9ycyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdBbmNlc3RvcnMnID8gaXNUb3BMYXllcihlbGVtZW50KSA/IFtdIDogZ2V0Q2xpcHBpbmdFbGVtZW50QW5jZXN0b3JzKGVsZW1lbnQsIHRoaXMuX2MpIDogW10uY29uY2F0KGJvdW5kYXJ5KTtcbiAgY29uc3QgY2xpcHBpbmdBbmNlc3RvcnMgPSBbLi4uZWxlbWVudENsaXBwaW5nQW5jZXN0b3JzLCByb290Qm91bmRhcnldO1xuICBjb25zdCBmaXJzdENsaXBwaW5nQW5jZXN0b3IgPSBjbGlwcGluZ0FuY2VzdG9yc1swXTtcbiAgY29uc3QgY2xpcHBpbmdSZWN0ID0gY2xpcHBpbmdBbmNlc3RvcnMucmVkdWNlKChhY2NSZWN0LCBjbGlwcGluZ0FuY2VzdG9yKSA9PiB7XG4gICAgY29uc3QgcmVjdCA9IGdldENsaWVudFJlY3RGcm9tQ2xpcHBpbmdBbmNlc3RvcihlbGVtZW50LCBjbGlwcGluZ0FuY2VzdG9yLCBzdHJhdGVneSk7XG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21DbGlwcGluZ0FuY2VzdG9yKGVsZW1lbnQsIGZpcnN0Q2xpcHBpbmdBbmNlc3Rvciwgc3RyYXRlZ3kpKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQsXG4gICAgaGVpZ2h0OiBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcCxcbiAgICB4OiBjbGlwcGluZ1JlY3QubGVmdCxcbiAgICB5OiBjbGlwcGluZ1JlY3QudG9wXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldERpbWVuc2lvbnMoZWxlbWVudCkge1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0gPSBnZXRDc3NEaW1lbnNpb25zKGVsZW1lbnQpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZWN0UmVsYXRpdmVUb09mZnNldFBhcmVudChlbGVtZW50LCBvZmZzZXRQYXJlbnQsIHN0cmF0ZWd5KSB7XG4gIGNvbnN0IGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICBjb25zdCBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgY29uc3QgaXNGaXhlZCA9IHN0cmF0ZWd5ID09PSAnZml4ZWQnO1xuICBjb25zdCByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIHRydWUsIGlzRml4ZWQsIG9mZnNldFBhcmVudCk7XG4gIGxldCBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgY29uc3Qgb2Zmc2V0cyA9IGNyZWF0ZUNvb3JkcygwKTtcbiAgaWYgKGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50IHx8ICFpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiAhaXNGaXhlZCkge1xuICAgIGlmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpICE9PSAnYm9keScgfHwgaXNPdmVyZmxvd0VsZW1lbnQoZG9jdW1lbnRFbGVtZW50KSkge1xuICAgICAgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChvZmZzZXRQYXJlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IG9mZnNldFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50LCB0cnVlLCBpc0ZpeGVkLCBvZmZzZXRQYXJlbnQpO1xuICAgICAgb2Zmc2V0cy54ID0gb2Zmc2V0UmVjdC54ICsgb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgPSBvZmZzZXRSZWN0LnkgKyBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHggPSByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueDtcbiAgY29uc3QgeSA9IHJlY3QudG9wICsgc2Nyb2xsLnNjcm9sbFRvcCAtIG9mZnNldHMueTtcbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc1N0YXRpY1Bvc2l0aW9uZWQoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYyc7XG59XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCwgcG9seWZpbGwpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAocG9seWZpbGwpIHtcbiAgICByZXR1cm4gcG9seWZpbGwoZWxlbWVudCk7XG4gIH1cbiAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZW50O1xufVxuXG4vLyBHZXRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHBvc2l0aW9uZWQgZWxlbWVudC4gSGFuZGxlcyBzb21lIGVkZ2UgY2FzZXMsXG4vLyBzdWNoIGFzIHRhYmxlIGFuY2VzdG9ycyBhbmQgY3Jvc3MgYnJvd3NlciBidWdzLlxuZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQsIHBvbHlmaWxsKSB7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgaWYgKGlzVG9wTGF5ZXIoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gd2luO1xuICB9XG4gIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIGxldCBzdmdPZmZzZXRQYXJlbnQgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgIHdoaWxlIChzdmdPZmZzZXRQYXJlbnQgJiYgIWlzTGFzdFRyYXZlcnNhYmxlTm9kZShzdmdPZmZzZXRQYXJlbnQpKSB7XG4gICAgICBpZiAoaXNFbGVtZW50KHN2Z09mZnNldFBhcmVudCkgJiYgIWlzU3RhdGljUG9zaXRpb25lZChzdmdPZmZzZXRQYXJlbnQpKSB7XG4gICAgICAgIHJldHVybiBzdmdPZmZzZXRQYXJlbnQ7XG4gICAgICB9XG4gICAgICBzdmdPZmZzZXRQYXJlbnQgPSBnZXRQYXJlbnROb2RlKHN2Z09mZnNldFBhcmVudCk7XG4gICAgfVxuICAgIHJldHVybiB3aW47XG4gIH1cbiAgbGV0IG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCwgcG9seWZpbGwpO1xuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgaXNTdGF0aWNQb3NpdGlvbmVkKG9mZnNldFBhcmVudCkpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KG9mZnNldFBhcmVudCwgcG9seWZpbGwpO1xuICB9XG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgaXNMYXN0VHJhdmVyc2FibGVOb2RlKG9mZnNldFBhcmVudCkgJiYgaXNTdGF0aWNQb3NpdGlvbmVkKG9mZnNldFBhcmVudCkgJiYgIWlzQ29udGFpbmluZ0Jsb2NrKG9mZnNldFBhcmVudCkpIHtcbiAgICByZXR1cm4gd2luO1xuICB9XG4gIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHx8IHdpbjtcbn1cblxuY29uc3QgZ2V0RWxlbWVudFJlY3RzID0gYXN5bmMgZnVuY3Rpb24gKGRhdGEpIHtcbiAgY29uc3QgZ2V0T2Zmc2V0UGFyZW50Rm4gPSB0aGlzLmdldE9mZnNldFBhcmVudCB8fCBnZXRPZmZzZXRQYXJlbnQ7XG4gIGNvbnN0IGdldERpbWVuc2lvbnNGbiA9IHRoaXMuZ2V0RGltZW5zaW9ucztcbiAgY29uc3QgZmxvYXRpbmdEaW1lbnNpb25zID0gYXdhaXQgZ2V0RGltZW5zaW9uc0ZuKGRhdGEuZmxvYXRpbmcpO1xuICByZXR1cm4ge1xuICAgIHJlZmVyZW5jZTogZ2V0UmVjdFJlbGF0aXZlVG9PZmZzZXRQYXJlbnQoZGF0YS5yZWZlcmVuY2UsIGF3YWl0IGdldE9mZnNldFBhcmVudEZuKGRhdGEuZmxvYXRpbmcpLCBkYXRhLnN0cmF0ZWd5KSxcbiAgICBmbG9hdGluZzoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICB3aWR0aDogZmxvYXRpbmdEaW1lbnNpb25zLndpZHRoLFxuICAgICAgaGVpZ2h0OiBmbG9hdGluZ0RpbWVuc2lvbnMuaGVpZ2h0XG4gICAgfVxuICB9O1xufTtcblxuZnVuY3Rpb24gaXNSVEwoZWxlbWVudCkge1xuICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5kaXJlY3Rpb24gPT09ICdydGwnO1xufVxuXG5jb25zdCBwbGF0Zm9ybSA9IHtcbiAgY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3QsXG4gIGdldERvY3VtZW50RWxlbWVudCxcbiAgZ2V0Q2xpcHBpbmdSZWN0LFxuICBnZXRPZmZzZXRQYXJlbnQsXG4gIGdldEVsZW1lbnRSZWN0cyxcbiAgZ2V0Q2xpZW50UmVjdHMsXG4gIGdldERpbWVuc2lvbnMsXG4gIGdldFNjYWxlLFxuICBpc0VsZW1lbnQsXG4gIGlzUlRMXG59O1xuXG4vLyBodHRwczovL3NhbXRob3IuYXUvMjAyMS9vYnNlcnZpbmctZG9tL1xuZnVuY3Rpb24gb2JzZXJ2ZU1vdmUoZWxlbWVudCwgb25Nb3ZlKSB7XG4gIGxldCBpbyA9IG51bGw7XG4gIGxldCB0aW1lb3V0SWQ7XG4gIGNvbnN0IHJvb3QgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgdmFyIF9pbztcbiAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAoX2lvID0gaW8pID09IG51bGwgfHwgX2lvLmRpc2Nvbm5lY3QoKTtcbiAgICBpbyA9IG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gcmVmcmVzaChza2lwLCB0aHJlc2hvbGQpIHtcbiAgICBpZiAoc2tpcCA9PT0gdm9pZCAwKSB7XG4gICAgICBza2lwID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aHJlc2hvbGQgPT09IHZvaWQgMCkge1xuICAgICAgdGhyZXNob2xkID0gMTtcbiAgICB9XG4gICAgY2xlYW51cCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGxlZnQsXG4gICAgICB0b3AsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmICghc2tpcCkge1xuICAgICAgb25Nb3ZlKCk7XG4gICAgfVxuICAgIGlmICghd2lkdGggfHwgIWhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnNldFRvcCA9IGZsb29yKHRvcCk7XG4gICAgY29uc3QgaW5zZXRSaWdodCA9IGZsb29yKHJvb3QuY2xpZW50V2lkdGggLSAobGVmdCArIHdpZHRoKSk7XG4gICAgY29uc3QgaW5zZXRCb3R0b20gPSBmbG9vcihyb290LmNsaWVudEhlaWdodCAtICh0b3AgKyBoZWlnaHQpKTtcbiAgICBjb25zdCBpbnNldExlZnQgPSBmbG9vcihsZWZ0KTtcbiAgICBjb25zdCByb290TWFyZ2luID0gLWluc2V0VG9wICsgXCJweCBcIiArIC1pbnNldFJpZ2h0ICsgXCJweCBcIiArIC1pbnNldEJvdHRvbSArIFwicHggXCIgKyAtaW5zZXRMZWZ0ICsgXCJweFwiO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290TWFyZ2luLFxuICAgICAgdGhyZXNob2xkOiBtYXgoMCwgbWluKDEsIHRocmVzaG9sZCkpIHx8IDFcbiAgICB9O1xuICAgIGxldCBpc0ZpcnN0VXBkYXRlID0gdHJ1ZTtcbiAgICBmdW5jdGlvbiBoYW5kbGVPYnNlcnZlKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHJhdGlvID0gZW50cmllc1swXS5pbnRlcnNlY3Rpb25SYXRpbztcbiAgICAgIGlmIChyYXRpbyAhPT0gdGhyZXNob2xkKSB7XG4gICAgICAgIGlmICghaXNGaXJzdFVwZGF0ZSkge1xuICAgICAgICAgIHJldHVybiByZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyYXRpbykge1xuICAgICAgICAgIC8vIElmIHRoZSByZWZlcmVuY2UgaXMgY2xpcHBlZCwgdGhlIHJhdGlvIGlzIDAuIFRocm90dGxlIHRoZSByZWZyZXNoXG4gICAgICAgICAgLy8gdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIG9mIHVwZGF0ZXMuXG4gICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICByZWZyZXNoKGZhbHNlLCAxZS03KTtcbiAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZyZXNoKGZhbHNlLCByYXRpbyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlzRmlyc3RVcGRhdGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBPbGRlciBicm93c2VycyBkb24ndCBzdXBwb3J0IGEgYGRvY3VtZW50YCBhcyB0aGUgcm9vdCBhbmQgd2lsbCB0aHJvdyBhblxuICAgIC8vIGVycm9yLlxuICAgIHRyeSB7XG4gICAgICBpbyA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihoYW5kbGVPYnNlcnZlLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIC8vIEhhbmRsZSA8aWZyYW1lPnNcbiAgICAgICAgcm9vdDogcm9vdC5vd25lckRvY3VtZW50XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpbyA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihoYW5kbGVPYnNlcnZlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgaW8ub2JzZXJ2ZShlbGVtZW50KTtcbiAgfVxuICByZWZyZXNoKHRydWUpO1xuICByZXR1cm4gY2xlYW51cDtcbn1cblxuLyoqXG4gKiBBdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHdoZW4gbmVjZXNzYXJ5LlxuICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXMgbW91bnRlZCBvbiB0aGUgRE9NIG9yXG4gKiB2aXNpYmxlIG9uIHRoZSBzY3JlZW4uXG4gKiBAcmV0dXJucyBjbGVhbnVwIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgd2hlbiB0aGUgZmxvYXRpbmcgZWxlbWVudCBpc1xuICogcmVtb3ZlZCBmcm9tIHRoZSBET00gb3IgaGlkZGVuIGZyb20gdGhlIHNjcmVlbi5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hdXRvVXBkYXRlXG4gKi9cbmZ1bmN0aW9uIGF1dG9VcGRhdGUocmVmZXJlbmNlLCBmbG9hdGluZywgdXBkYXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIGFuY2VzdG9yU2Nyb2xsID0gdHJ1ZSxcbiAgICBhbmNlc3RvclJlc2l6ZSA9IHRydWUsXG4gICAgZWxlbWVudFJlc2l6ZSA9IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ2Z1bmN0aW9uJyxcbiAgICBsYXlvdXRTaGlmdCA9IHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PT0gJ2Z1bmN0aW9uJyxcbiAgICBhbmltYXRpb25GcmFtZSA9IGZhbHNlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCByZWZlcmVuY2VFbCA9IHVud3JhcEVsZW1lbnQocmVmZXJlbmNlKTtcbiAgY29uc3QgYW5jZXN0b3JzID0gYW5jZXN0b3JTY3JvbGwgfHwgYW5jZXN0b3JSZXNpemUgPyBbLi4uKHJlZmVyZW5jZUVsID8gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMocmVmZXJlbmNlRWwpIDogW10pLCAuLi5nZXRPdmVyZmxvd0FuY2VzdG9ycyhmbG9hdGluZyldIDogW107XG4gIGFuY2VzdG9ycy5mb3JFYWNoKGFuY2VzdG9yID0+IHtcbiAgICBhbmNlc3RvclNjcm9sbCAmJiBhbmNlc3Rvci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGUsIHtcbiAgICAgIHBhc3NpdmU6IHRydWVcbiAgICB9KTtcbiAgICBhbmNlc3RvclJlc2l6ZSAmJiBhbmNlc3Rvci5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGUpO1xuICB9KTtcbiAgY29uc3QgY2xlYW51cElvID0gcmVmZXJlbmNlRWwgJiYgbGF5b3V0U2hpZnQgPyBvYnNlcnZlTW92ZShyZWZlcmVuY2VFbCwgdXBkYXRlKSA6IG51bGw7XG4gIGxldCByZW9ic2VydmVGcmFtZSA9IC0xO1xuICBsZXQgcmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xuICBpZiAoZWxlbWVudFJlc2l6ZSkge1xuICAgIHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKF9yZWYgPT4ge1xuICAgICAgbGV0IFtmaXJzdEVudHJ5XSA9IF9yZWY7XG4gICAgICBpZiAoZmlyc3RFbnRyeSAmJiBmaXJzdEVudHJ5LnRhcmdldCA9PT0gcmVmZXJlbmNlRWwgJiYgcmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgLy8gUHJldmVudCB1cGRhdGUgbG9vcHMgd2hlbiB1c2luZyB0aGUgYHNpemVgIG1pZGRsZXdhcmUuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMTc0MFxuICAgICAgICByZXNpemVPYnNlcnZlci51bm9ic2VydmUoZmxvYXRpbmcpO1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyZW9ic2VydmVGcmFtZSk7XG4gICAgICAgIHJlb2JzZXJ2ZUZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB2YXIgX3Jlc2l6ZU9ic2VydmVyO1xuICAgICAgICAgIChfcmVzaXplT2JzZXJ2ZXIgPSByZXNpemVPYnNlcnZlcikgPT0gbnVsbCB8fCBfcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShmbG9hdGluZyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdXBkYXRlKCk7XG4gICAgfSk7XG4gICAgaWYgKHJlZmVyZW5jZUVsICYmICFhbmltYXRpb25GcmFtZSkge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShyZWZlcmVuY2VFbCk7XG4gICAgfVxuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZmxvYXRpbmcpO1xuICB9XG4gIGxldCBmcmFtZUlkO1xuICBsZXQgcHJldlJlZlJlY3QgPSBhbmltYXRpb25GcmFtZSA/IGdldEJvdW5kaW5nQ2xpZW50UmVjdChyZWZlcmVuY2UpIDogbnVsbDtcbiAgaWYgKGFuaW1hdGlvbkZyYW1lKSB7XG4gICAgZnJhbWVMb29wKCk7XG4gIH1cbiAgZnVuY3Rpb24gZnJhbWVMb29wKCkge1xuICAgIGNvbnN0IG5leHRSZWZSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHJlZmVyZW5jZSk7XG4gICAgaWYgKHByZXZSZWZSZWN0ICYmIChuZXh0UmVmUmVjdC54ICE9PSBwcmV2UmVmUmVjdC54IHx8IG5leHRSZWZSZWN0LnkgIT09IHByZXZSZWZSZWN0LnkgfHwgbmV4dFJlZlJlY3Qud2lkdGggIT09IHByZXZSZWZSZWN0LndpZHRoIHx8IG5leHRSZWZSZWN0LmhlaWdodCAhPT0gcHJldlJlZlJlY3QuaGVpZ2h0KSkge1xuICAgICAgdXBkYXRlKCk7XG4gICAgfVxuICAgIHByZXZSZWZSZWN0ID0gbmV4dFJlZlJlY3Q7XG4gICAgZnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmcmFtZUxvb3ApO1xuICB9XG4gIHVwZGF0ZSgpO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIHZhciBfcmVzaXplT2JzZXJ2ZXIyO1xuICAgIGFuY2VzdG9ycy5mb3JFYWNoKGFuY2VzdG9yID0+IHtcbiAgICAgIGFuY2VzdG9yU2Nyb2xsICYmIGFuY2VzdG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHVwZGF0ZSk7XG4gICAgICBhbmNlc3RvclJlc2l6ZSAmJiBhbmNlc3Rvci5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGUpO1xuICAgIH0pO1xuICAgIGNsZWFudXBJbyA9PSBudWxsIHx8IGNsZWFudXBJbygpO1xuICAgIChfcmVzaXplT2JzZXJ2ZXIyID0gcmVzaXplT2JzZXJ2ZXIpID09IG51bGwgfHwgX3Jlc2l6ZU9ic2VydmVyMi5kaXNjb25uZWN0KCk7XG4gICAgcmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xuICAgIGlmIChhbmltYXRpb25GcmFtZSkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoZnJhbWVJZCk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggYW4gb2JqZWN0IG9mIG92ZXJmbG93IHNpZGUgb2Zmc2V0cyB0aGF0IGRldGVybWluZSBob3cgbXVjaCB0aGVcbiAqIGVsZW1lbnQgaXMgb3ZlcmZsb3dpbmcgYSBnaXZlbiBjbGlwcGluZyBib3VuZGFyeSBvbiBlYWNoIHNpZGUuXG4gKiAtIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGJvdW5kYXJ5IGJ5IHRoYXQgbnVtYmVyIG9mIHBpeGVsc1xuICogLSBuZWdhdGl2ZSA9IGhvdyBtYW55IHBpeGVscyBsZWZ0IGJlZm9yZSBpdCB3aWxsIG92ZXJmbG93XG4gKiAtIDAgPSBsaWVzIGZsdXNoIHdpdGggdGhlIGJvdW5kYXJ5XG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvZGV0ZWN0T3ZlcmZsb3dcbiAqL1xuY29uc3QgZGV0ZWN0T3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyQxO1xuXG4vKipcbiAqIE1vZGlmaWVzIHRoZSBwbGFjZW1lbnQgYnkgdHJhbnNsYXRpbmcgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYWxvbmcgdGhlXG4gKiBzcGVjaWZpZWQgYXhlcy5cbiAqIEEgbnVtYmVyIChzaG9ydGhhbmQgZm9yIGBtYWluQXhpc2Agb3IgZGlzdGFuY2UpLCBvciBhbiBheGVzIGNvbmZpZ3VyYXRpb25cbiAqIG9iamVjdCBtYXkgYmUgcGFzc2VkLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL29mZnNldFxuICovXG5jb25zdCBvZmZzZXQgPSBvZmZzZXQkMTtcblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgY2hvb3NpbmcgdGhlIHBsYWNlbWVudFxuICogdGhhdCBoYXMgdGhlIG1vc3Qgc3BhY2UgYXZhaWxhYmxlIGF1dG9tYXRpY2FsbHksIHdpdGhvdXQgbmVlZGluZyB0byBzcGVjaWZ5IGFcbiAqIHByZWZlcnJlZCBwbGFjZW1lbnQuIEFsdGVybmF0aXZlIHRvIGBmbGlwYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hdXRvUGxhY2VtZW50XG4gKi9cbmNvbnN0IGF1dG9QbGFjZW1lbnQgPSBhdXRvUGxhY2VtZW50JDE7XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IHNoaWZ0aW5nIGl0IGluIG9yZGVyIHRvXG4gKiBrZWVwIGl0IGluIHZpZXcgd2hlbiBpdCB3aWxsIG92ZXJmbG93IHRoZSBjbGlwcGluZyBib3VuZGFyeS5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9zaGlmdFxuICovXG5jb25zdCBzaGlmdCA9IHNoaWZ0JDE7XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IGZsaXBwaW5nIHRoZSBgcGxhY2VtZW50YFxuICogaW4gb3JkZXIgdG8ga2VlcCBpdCBpbiB2aWV3IHdoZW4gdGhlIHByZWZlcnJlZCBwbGFjZW1lbnQocykgd2lsbCBvdmVyZmxvdyB0aGVcbiAqIGNsaXBwaW5nIGJvdW5kYXJ5LiBBbHRlcm5hdGl2ZSB0byBgYXV0b1BsYWNlbWVudGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvZmxpcFxuICovXG5jb25zdCBmbGlwID0gZmxpcCQxO1xuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdGhhdCBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCDigJRcbiAqIGZvciBpbnN0YW5jZSwgcHJldmVudCBpdCBmcm9tIG92ZXJmbG93aW5nIHRoZSBjbGlwcGluZyBib3VuZGFyeSBvciBtYXRjaCB0aGVcbiAqIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9zaXplXG4gKi9cbmNvbnN0IHNpemUgPSBzaXplJDE7XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBoaWRlIHRoZSBmbG9hdGluZyBlbGVtZW50IGluIGFwcGxpY2FibGUgc2l0dWF0aW9ucywgc3VjaCBhc1xuICogd2hlbiBpdCBpcyBub3QgaW4gdGhlIHNhbWUgY2xpcHBpbmcgY29udGV4dCBhcyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaGlkZVxuICovXG5jb25zdCBoaWRlID0gaGlkZSQxO1xuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gcG9zaXRpb24gYW4gaW5uZXIgZWxlbWVudCBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBzbyB0aGF0IGl0XG4gKiBhcHBlYXJzIGNlbnRlcmVkIHRvIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hcnJvd1xuICovXG5jb25zdCBhcnJvdyA9IGFycm93JDE7XG5cbi8qKlxuICogUHJvdmlkZXMgaW1wcm92ZWQgcG9zaXRpb25pbmcgZm9yIGlubGluZSByZWZlcmVuY2UgZWxlbWVudHMgdGhhdCBjYW4gc3BhblxuICogb3ZlciBtdWx0aXBsZSBsaW5lcywgc3VjaCBhcyBoeXBlcmxpbmtzIG9yIHJhbmdlIHNlbGVjdGlvbnMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaW5saW5lXG4gKi9cbmNvbnN0IGlubGluZSA9IGlubGluZSQxO1xuXG4vKipcbiAqIEJ1aWx0LWluIGBsaW1pdGVyYCB0aGF0IHdpbGwgc3RvcCBgc2hpZnQoKWAgYXQgYSBjZXJ0YWluIHBvaW50LlxuICovXG5jb25zdCBsaW1pdFNoaWZ0ID0gbGltaXRTaGlmdCQxO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBgeGAgYW5kIGB5YCBjb29yZGluYXRlcyB0aGF0IHdpbGwgcGxhY2UgdGhlIGZsb2F0aW5nIGVsZW1lbnRcbiAqIG5leHQgdG8gYSBnaXZlbiByZWZlcmVuY2UgZWxlbWVudC5cbiAqL1xuY29uc3QgY29tcHV0ZVBvc2l0aW9uID0gKHJlZmVyZW5jZSwgZmxvYXRpbmcsIG9wdGlvbnMpID0+IHtcbiAgLy8gVGhpcyBjYWNoZXMgdGhlIGV4cGVuc2l2ZSBgZ2V0Q2xpcHBpbmdFbGVtZW50QW5jZXN0b3JzYCBmdW5jdGlvbiBzbyB0aGF0XG4gIC8vIG11bHRpcGxlIGxpZmVjeWNsZSByZXNldHMgcmUtdXNlIHRoZSBzYW1lIHJlc3VsdC4gSXQgb25seSBsaXZlcyBmb3IgYVxuICAvLyBzaW5nbGUgY2FsbC4gSWYgb3RoZXIgZnVuY3Rpb25zIGJlY29tZSBleHBlbnNpdmUsIHdlIGNhbiBhZGQgdGhlbSBhcyB3ZWxsLlxuICBjb25zdCBjYWNoZSA9IG5ldyBNYXAoKTtcbiAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHtcbiAgICBwbGF0Zm9ybSxcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIGNvbnN0IHBsYXRmb3JtV2l0aENhY2hlID0ge1xuICAgIC4uLm1lcmdlZE9wdGlvbnMucGxhdGZvcm0sXG4gICAgX2M6IGNhY2hlXG4gIH07XG4gIHJldHVybiBjb21wdXRlUG9zaXRpb24kMShyZWZlcmVuY2UsIGZsb2F0aW5nLCB7XG4gICAgLi4ubWVyZ2VkT3B0aW9ucyxcbiAgICBwbGF0Zm9ybTogcGxhdGZvcm1XaXRoQ2FjaGVcbiAgfSk7XG59O1xuXG5leHBvcnQgeyBhcnJvdywgYXV0b1BsYWNlbWVudCwgYXV0b1VwZGF0ZSwgY29tcHV0ZVBvc2l0aW9uLCBkZXRlY3RPdmVyZmxvdywgZmxpcCwgaGlkZSwgaW5saW5lLCBsaW1pdFNoaWZ0LCBvZmZzZXQsIHBsYXRmb3JtLCBzaGlmdCwgc2l6ZSB9O1xuIiwiaW1wb3J0IHsgY29tcHV0ZVBvc2l0aW9uLCBhcnJvdyBhcyBhcnJvdyQyLCBvZmZzZXQgYXMgb2Zmc2V0JDEsIHNoaWZ0IGFzIHNoaWZ0JDEsIGxpbWl0U2hpZnQgYXMgbGltaXRTaGlmdCQxLCBmbGlwIGFzIGZsaXAkMSwgc2l6ZSBhcyBzaXplJDEsIGF1dG9QbGFjZW1lbnQgYXMgYXV0b1BsYWNlbWVudCQxLCBoaWRlIGFzIGhpZGUkMSwgaW5saW5lIGFzIGlubGluZSQxIH0gZnJvbSAnQGZsb2F0aW5nLXVpL2RvbSc7XG5leHBvcnQgeyBhdXRvVXBkYXRlLCBjb21wdXRlUG9zaXRpb24sIGRldGVjdE92ZXJmbG93LCBnZXRPdmVyZmxvd0FuY2VzdG9ycywgcGxhdGZvcm0gfSBmcm9tICdAZmxvYXRpbmctdWkvZG9tJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcblxudmFyIGluZGV4ID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDtcblxuLy8gRm9yayBvZiBgZmFzdC1kZWVwLWVxdWFsYCB0aGF0IG9ubHkgZG9lcyB0aGUgY29tcGFyaXNvbnMgd2UgbmVlZCBhbmQgY29tcGFyZXNcbi8vIGZ1bmN0aW9uc1xuZnVuY3Rpb24gZGVlcEVxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJyAmJiBhLnRvU3RyaW5nKCkgPT09IGIudG9TdHJpbmcoKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGxldCBsZW5ndGg7XG4gIGxldCBpO1xuICBsZXQga2V5cztcbiAgaWYgKGEgJiYgYiAmJiB0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICAgIGlmICghZGVlcEVxdWFsKGFbaV0sIGJbaV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgIGlmICghe30uaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmIChrZXkgPT09ICdfb3duZXInICYmIGEuJCR0eXBlb2YpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2tleV0sIGJba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xufVxuXG5mdW5jdGlvbiBnZXREUFIoZWxlbWVudCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBjb25zdCB3aW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICByZXR1cm4gd2luLmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbn1cblxuZnVuY3Rpb24gcm91bmRCeURQUihlbGVtZW50LCB2YWx1ZSkge1xuICBjb25zdCBkcHIgPSBnZXREUFIoZWxlbWVudCk7XG4gIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogZHByKSAvIGRwcjtcbn1cblxuZnVuY3Rpb24gdXNlTGF0ZXN0UmVmKHZhbHVlKSB7XG4gIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZih2YWx1ZSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlZjtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIHBvc2l0aW9uIGEgZmxvYXRpbmcgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VGbG9hdGluZ1xuICovXG5mdW5jdGlvbiB1c2VGbG9hdGluZyhvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIHBsYWNlbWVudCA9ICdib3R0b20nLFxuICAgIHN0cmF0ZWd5ID0gJ2Fic29sdXRlJyxcbiAgICBtaWRkbGV3YXJlID0gW10sXG4gICAgcGxhdGZvcm0sXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIHJlZmVyZW5jZTogZXh0ZXJuYWxSZWZlcmVuY2UsXG4gICAgICBmbG9hdGluZzogZXh0ZXJuYWxGbG9hdGluZ1xuICAgIH0gPSB7fSxcbiAgICB0cmFuc2Zvcm0gPSB0cnVlLFxuICAgIHdoaWxlRWxlbWVudHNNb3VudGVkLFxuICAgIG9wZW5cbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IFtkYXRhLCBzZXREYXRhXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgc3RyYXRlZ3ksXG4gICAgcGxhY2VtZW50LFxuICAgIG1pZGRsZXdhcmVEYXRhOiB7fSxcbiAgICBpc1Bvc2l0aW9uZWQ6IGZhbHNlXG4gIH0pO1xuICBjb25zdCBbbGF0ZXN0TWlkZGxld2FyZSwgc2V0TGF0ZXN0TWlkZGxld2FyZV0gPSBSZWFjdC51c2VTdGF0ZShtaWRkbGV3YXJlKTtcbiAgaWYgKCFkZWVwRXF1YWwobGF0ZXN0TWlkZGxld2FyZSwgbWlkZGxld2FyZSkpIHtcbiAgICBzZXRMYXRlc3RNaWRkbGV3YXJlKG1pZGRsZXdhcmUpO1xuICB9XG4gIGNvbnN0IFtfcmVmZXJlbmNlLCBfc2V0UmVmZXJlbmNlXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbX2Zsb2F0aW5nLCBfc2V0RmxvYXRpbmddID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IHNldFJlZmVyZW5jZSA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIGlmIChub2RlICE9PSByZWZlcmVuY2VSZWYuY3VycmVudCkge1xuICAgICAgcmVmZXJlbmNlUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgX3NldFJlZmVyZW5jZShub2RlKTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgY29uc3Qgc2V0RmxvYXRpbmcgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBpZiAobm9kZSAhPT0gZmxvYXRpbmdSZWYuY3VycmVudCkge1xuICAgICAgZmxvYXRpbmdSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICBfc2V0RmxvYXRpbmcobm9kZSk7XG4gICAgfVxuICB9LCBbXSk7XG4gIGNvbnN0IHJlZmVyZW5jZUVsID0gZXh0ZXJuYWxSZWZlcmVuY2UgfHwgX3JlZmVyZW5jZTtcbiAgY29uc3QgZmxvYXRpbmdFbCA9IGV4dGVybmFsRmxvYXRpbmcgfHwgX2Zsb2F0aW5nO1xuICBjb25zdCByZWZlcmVuY2VSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGZsb2F0aW5nUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBkYXRhUmVmID0gUmVhY3QudXNlUmVmKGRhdGEpO1xuICBjb25zdCBoYXNXaGlsZUVsZW1lbnRzTW91bnRlZCA9IHdoaWxlRWxlbWVudHNNb3VudGVkICE9IG51bGw7XG4gIGNvbnN0IHdoaWxlRWxlbWVudHNNb3VudGVkUmVmID0gdXNlTGF0ZXN0UmVmKHdoaWxlRWxlbWVudHNNb3VudGVkKTtcbiAgY29uc3QgcGxhdGZvcm1SZWYgPSB1c2VMYXRlc3RSZWYocGxhdGZvcm0pO1xuICBjb25zdCB1cGRhdGUgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCFyZWZlcmVuY2VSZWYuY3VycmVudCB8fCAhZmxvYXRpbmdSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneSxcbiAgICAgIG1pZGRsZXdhcmU6IGxhdGVzdE1pZGRsZXdhcmVcbiAgICB9O1xuICAgIGlmIChwbGF0Zm9ybVJlZi5jdXJyZW50KSB7XG4gICAgICBjb25maWcucGxhdGZvcm0gPSBwbGF0Zm9ybVJlZi5jdXJyZW50O1xuICAgIH1cbiAgICBjb21wdXRlUG9zaXRpb24ocmVmZXJlbmNlUmVmLmN1cnJlbnQsIGZsb2F0aW5nUmVmLmN1cnJlbnQsIGNvbmZpZykudGhlbihkYXRhID0+IHtcbiAgICAgIGNvbnN0IGZ1bGxEYXRhID0ge1xuICAgICAgICAuLi5kYXRhLFxuICAgICAgICBpc1Bvc2l0aW9uZWQ6IHRydWVcbiAgICAgIH07XG4gICAgICBpZiAoaXNNb3VudGVkUmVmLmN1cnJlbnQgJiYgIWRlZXBFcXVhbChkYXRhUmVmLmN1cnJlbnQsIGZ1bGxEYXRhKSkge1xuICAgICAgICBkYXRhUmVmLmN1cnJlbnQgPSBmdWxsRGF0YTtcbiAgICAgICAgUmVhY3RET00uZmx1c2hTeW5jKCgpID0+IHtcbiAgICAgICAgICBzZXREYXRhKGZ1bGxEYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIFtsYXRlc3RNaWRkbGV3YXJlLCBwbGFjZW1lbnQsIHN0cmF0ZWd5LCBwbGF0Zm9ybVJlZl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKG9wZW4gPT09IGZhbHNlICYmIGRhdGFSZWYuY3VycmVudC5pc1Bvc2l0aW9uZWQpIHtcbiAgICAgIGRhdGFSZWYuY3VycmVudC5pc1Bvc2l0aW9uZWQgPSBmYWxzZTtcbiAgICAgIHNldERhdGEoZGF0YSA9PiAoe1xuICAgICAgICAuLi5kYXRhLFxuICAgICAgICBpc1Bvc2l0aW9uZWQ6IGZhbHNlXG4gICAgICB9KSk7XG4gICAgfVxuICB9LCBbb3Blbl0pO1xuICBjb25zdCBpc01vdW50ZWRSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaXNNb3VudGVkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpc01vdW50ZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChyZWZlcmVuY2VFbCkgcmVmZXJlbmNlUmVmLmN1cnJlbnQgPSByZWZlcmVuY2VFbDtcbiAgICBpZiAoZmxvYXRpbmdFbCkgZmxvYXRpbmdSZWYuY3VycmVudCA9IGZsb2F0aW5nRWw7XG4gICAgaWYgKHJlZmVyZW5jZUVsICYmIGZsb2F0aW5nRWwpIHtcbiAgICAgIGlmICh3aGlsZUVsZW1lbnRzTW91bnRlZFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybiB3aGlsZUVsZW1lbnRzTW91bnRlZFJlZi5jdXJyZW50KHJlZmVyZW5jZUVsLCBmbG9hdGluZ0VsLCB1cGRhdGUpO1xuICAgICAgfVxuICAgICAgdXBkYXRlKCk7XG4gICAgfVxuICB9LCBbcmVmZXJlbmNlRWwsIGZsb2F0aW5nRWwsIHVwZGF0ZSwgd2hpbGVFbGVtZW50c01vdW50ZWRSZWYsIGhhc1doaWxlRWxlbWVudHNNb3VudGVkXSk7XG4gIGNvbnN0IHJlZnMgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgcmVmZXJlbmNlOiByZWZlcmVuY2VSZWYsXG4gICAgZmxvYXRpbmc6IGZsb2F0aW5nUmVmLFxuICAgIHNldFJlZmVyZW5jZSxcbiAgICBzZXRGbG9hdGluZ1xuICB9KSwgW3NldFJlZmVyZW5jZSwgc2V0RmxvYXRpbmddKTtcbiAgY29uc3QgZWxlbWVudHMgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgcmVmZXJlbmNlOiByZWZlcmVuY2VFbCxcbiAgICBmbG9hdGluZzogZmxvYXRpbmdFbFxuICB9KSwgW3JlZmVyZW5jZUVsLCBmbG9hdGluZ0VsXSk7XG4gIGNvbnN0IGZsb2F0aW5nU3R5bGVzID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgaW5pdGlhbFN0eWxlcyA9IHtcbiAgICAgIHBvc2l0aW9uOiBzdHJhdGVneSxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDBcbiAgICB9O1xuICAgIGlmICghZWxlbWVudHMuZmxvYXRpbmcpIHtcbiAgICAgIHJldHVybiBpbml0aWFsU3R5bGVzO1xuICAgIH1cbiAgICBjb25zdCB4ID0gcm91bmRCeURQUihlbGVtZW50cy5mbG9hdGluZywgZGF0YS54KTtcbiAgICBjb25zdCB5ID0gcm91bmRCeURQUihlbGVtZW50cy5mbG9hdGluZywgZGF0YS55KTtcbiAgICBpZiAodHJhbnNmb3JtKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbml0aWFsU3R5bGVzLFxuICAgICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgpXCIsXG4gICAgICAgIC4uLihnZXREUFIoZWxlbWVudHMuZmxvYXRpbmcpID49IDEuNSAmJiB7XG4gICAgICAgICAgd2lsbENoYW5nZTogJ3RyYW5zZm9ybSdcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogc3RyYXRlZ3ksXG4gICAgICBsZWZ0OiB4LFxuICAgICAgdG9wOiB5XG4gICAgfTtcbiAgfSwgW3N0cmF0ZWd5LCB0cmFuc2Zvcm0sIGVsZW1lbnRzLmZsb2F0aW5nLCBkYXRhLngsIGRhdGEueV0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIC4uLmRhdGEsXG4gICAgdXBkYXRlLFxuICAgIHJlZnMsXG4gICAgZWxlbWVudHMsXG4gICAgZmxvYXRpbmdTdHlsZXNcbiAgfSksIFtkYXRhLCB1cGRhdGUsIHJlZnMsIGVsZW1lbnRzLCBmbG9hdGluZ1N0eWxlc10pO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gcG9zaXRpb24gYW4gaW5uZXIgZWxlbWVudCBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBzbyB0aGF0IGl0XG4gKiBhcHBlYXJzIGNlbnRlcmVkIHRvIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIFRoaXMgd3JhcHMgdGhlIGNvcmUgYGFycm93YCBtaWRkbGV3YXJlIHRvIGFsbG93IFJlYWN0IHJlZnMgYXMgdGhlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXJyb3dcbiAqL1xuY29uc3QgYXJyb3ckMSA9IG9wdGlvbnMgPT4ge1xuICBmdW5jdGlvbiBpc1JlZih2YWx1ZSkge1xuICAgIHJldHVybiB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY3VycmVudCcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2Fycm93JyxcbiAgICBvcHRpb25zLFxuICAgIGZuKHN0YXRlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHBhZGRpbmdcbiAgICAgIH0gPSB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMoc3RhdGUpIDogb3B0aW9ucztcbiAgICAgIGlmIChlbGVtZW50ICYmIGlzUmVmKGVsZW1lbnQpKSB7XG4gICAgICAgIGlmIChlbGVtZW50LmN1cnJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBhcnJvdyQyKHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQuY3VycmVudCxcbiAgICAgICAgICAgIHBhZGRpbmdcbiAgICAgICAgICB9KS5mbihzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGFycm93JDIoe1xuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgcGFkZGluZ1xuICAgICAgICB9KS5mbihzdGF0ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBNb2RpZmllcyB0aGUgcGxhY2VtZW50IGJ5IHRyYW5zbGF0aW5nIHRoZSBmbG9hdGluZyBlbGVtZW50IGFsb25nIHRoZVxuICogc3BlY2lmaWVkIGF4ZXMuXG4gKiBBIG51bWJlciAoc2hvcnRoYW5kIGZvciBgbWFpbkF4aXNgIG9yIGRpc3RhbmNlKSwgb3IgYW4gYXhlcyBjb25maWd1cmF0aW9uXG4gKiBvYmplY3QgbWF5IGJlIHBhc3NlZC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9vZmZzZXRcbiAqL1xuY29uc3Qgb2Zmc2V0ID0gKG9wdGlvbnMsIGRlcHMpID0+ICh7XG4gIC4uLm9mZnNldCQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBzaGlmdGluZyBpdCBpbiBvcmRlciB0b1xuICoga2VlcCBpdCBpbiB2aWV3IHdoZW4gaXQgd2lsbCBvdmVyZmxvdyB0aGUgY2xpcHBpbmcgYm91bmRhcnkuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2hpZnRcbiAqL1xuY29uc3Qgc2hpZnQgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4uc2hpZnQkMShvcHRpb25zKSxcbiAgb3B0aW9uczogW29wdGlvbnMsIGRlcHNdXG59KTtcblxuLyoqXG4gKiBCdWlsdC1pbiBgbGltaXRlcmAgdGhhdCB3aWxsIHN0b3AgYHNoaWZ0KClgIGF0IGEgY2VydGFpbiBwb2ludC5cbiAqL1xuY29uc3QgbGltaXRTaGlmdCA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5saW1pdFNoaWZ0JDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IGZsaXBwaW5nIHRoZSBgcGxhY2VtZW50YFxuICogaW4gb3JkZXIgdG8ga2VlcCBpdCBpbiB2aWV3IHdoZW4gdGhlIHByZWZlcnJlZCBwbGFjZW1lbnQocykgd2lsbCBvdmVyZmxvdyB0aGVcbiAqIGNsaXBwaW5nIGJvdW5kYXJ5LiBBbHRlcm5hdGl2ZSB0byBgYXV0b1BsYWNlbWVudGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvZmxpcFxuICovXG5jb25zdCBmbGlwID0gKG9wdGlvbnMsIGRlcHMpID0+ICh7XG4gIC4uLmZsaXAkMShvcHRpb25zKSxcbiAgb3B0aW9uczogW29wdGlvbnMsIGRlcHNdXG59KTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRoYXQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQg4oCUXG4gKiBmb3IgaW5zdGFuY2UsIHByZXZlbnQgaXQgZnJvbSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgYm91bmRhcnkgb3IgbWF0Y2ggdGhlXG4gKiB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2l6ZVxuICovXG5jb25zdCBzaXplID0gKG9wdGlvbnMsIGRlcHMpID0+ICh7XG4gIC4uLnNpemUkMShvcHRpb25zKSxcbiAgb3B0aW9uczogW29wdGlvbnMsIGRlcHNdXG59KTtcblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgY2hvb3NpbmcgdGhlIHBsYWNlbWVudFxuICogdGhhdCBoYXMgdGhlIG1vc3Qgc3BhY2UgYXZhaWxhYmxlIGF1dG9tYXRpY2FsbHksIHdpdGhvdXQgbmVlZGluZyB0byBzcGVjaWZ5IGFcbiAqIHByZWZlcnJlZCBwbGFjZW1lbnQuIEFsdGVybmF0aXZlIHRvIGBmbGlwYC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hdXRvUGxhY2VtZW50XG4gKi9cbmNvbnN0IGF1dG9QbGFjZW1lbnQgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4uYXV0b1BsYWNlbWVudCQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gaGlkZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBpbiBhcHBsaWNhYmxlIHNpdHVhdGlvbnMsIHN1Y2ggYXNcbiAqIHdoZW4gaXQgaXMgbm90IGluIHRoZSBzYW1lIGNsaXBwaW5nIGNvbnRleHQgYXMgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2hpZGVcbiAqL1xuY29uc3QgaGlkZSA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5oaWRlJDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogUHJvdmlkZXMgaW1wcm92ZWQgcG9zaXRpb25pbmcgZm9yIGlubGluZSByZWZlcmVuY2UgZWxlbWVudHMgdGhhdCBjYW4gc3BhblxuICogb3ZlciBtdWx0aXBsZSBsaW5lcywgc3VjaCBhcyBoeXBlcmxpbmtzIG9yIHJhbmdlIHNlbGVjdGlvbnMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaW5saW5lXG4gKi9cbmNvbnN0IGlubGluZSA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5pbmxpbmUkMShvcHRpb25zKSxcbiAgb3B0aW9uczogW29wdGlvbnMsIGRlcHNdXG59KTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIHBvc2l0aW9uIGFuIGlubmVyIGVsZW1lbnQgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgc28gdGhhdCBpdFxuICogYXBwZWFycyBjZW50ZXJlZCB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBUaGlzIHdyYXBzIHRoZSBjb3JlIGBhcnJvd2AgbWlkZGxld2FyZSB0byBhbGxvdyBSZWFjdCByZWZzIGFzIHRoZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2Fycm93XG4gKi9cbmNvbnN0IGFycm93ID0gKG9wdGlvbnMsIGRlcHMpID0+ICh7XG4gIC4uLmFycm93JDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbmV4cG9ydCB7IGFycm93LCBhdXRvUGxhY2VtZW50LCBmbGlwLCBoaWRlLCBpbmxpbmUsIGxpbWl0U2hpZnQsIG9mZnNldCwgc2hpZnQsIHNpemUsIHVzZUZsb2F0aW5nIH07XG4iLCJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QsIGlzSFRNTEVsZW1lbnQgfSBmcm9tICdAZmxvYXRpbmctdWkvdXRpbHMvZG9tJztcblxuZnVuY3Rpb24gYWN0aXZlRWxlbWVudChkb2MpIHtcbiAgbGV0IGFjdGl2ZUVsZW1lbnQgPSBkb2MuYWN0aXZlRWxlbWVudDtcbiAgd2hpbGUgKCgoX2FjdGl2ZUVsZW1lbnQgPSBhY3RpdmVFbGVtZW50KSA9PSBudWxsIHx8IChfYWN0aXZlRWxlbWVudCA9IF9hY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3QpID09IG51bGwgPyB2b2lkIDAgOiBfYWN0aXZlRWxlbWVudC5hY3RpdmVFbGVtZW50KSAhPSBudWxsKSB7XG4gICAgdmFyIF9hY3RpdmVFbGVtZW50O1xuICAgIGFjdGl2ZUVsZW1lbnQgPSBhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudDtcbiAgfVxuICByZXR1cm4gYWN0aXZlRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgaWYgKCFwYXJlbnQgfHwgIWNoaWxkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJvb3ROb2RlID0gY2hpbGQuZ2V0Um9vdE5vZGUgPT0gbnVsbCA/IHZvaWQgMCA6IGNoaWxkLmdldFJvb3ROb2RlKCk7XG5cbiAgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICBsZXQgbmV4dCA9IGNoaWxkO1xuICAgIHdoaWxlIChuZXh0KSB7XG4gICAgICBpZiAocGFyZW50ID09PSBuZXh0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgbmV4dCA9IG5leHQucGFyZW50Tm9kZSB8fCBuZXh0Lmhvc3Q7XG4gICAgfVxuICB9XG5cbiAgLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuICByZXR1cm4gZmFsc2U7XG59XG4vLyBBdm9pZCBDaHJvbWUgRGV2VG9vbHMgYmx1ZSB3YXJuaW5nLlxuZnVuY3Rpb24gZ2V0UGxhdGZvcm0oKSB7XG4gIGNvbnN0IHVhRGF0YSA9IG5hdmlnYXRvci51c2VyQWdlbnREYXRhO1xuICBpZiAodWFEYXRhICE9IG51bGwgJiYgdWFEYXRhLnBsYXRmb3JtKSB7XG4gICAgcmV0dXJuIHVhRGF0YS5wbGF0Zm9ybTtcbiAgfVxuICByZXR1cm4gbmF2aWdhdG9yLnBsYXRmb3JtO1xufVxuZnVuY3Rpb24gZ2V0VXNlckFnZW50KCkge1xuICBjb25zdCB1YURhdGEgPSBuYXZpZ2F0b3IudXNlckFnZW50RGF0YTtcbiAgaWYgKHVhRGF0YSAmJiBBcnJheS5pc0FycmF5KHVhRGF0YS5icmFuZHMpKSB7XG4gICAgcmV0dXJuIHVhRGF0YS5icmFuZHMubWFwKF9yZWYgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgYnJhbmQsXG4gICAgICAgIHZlcnNpb25cbiAgICAgIH0gPSBfcmVmO1xuICAgICAgcmV0dXJuIGJyYW5kICsgXCIvXCIgKyB2ZXJzaW9uO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfVxuICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDtcbn1cblxuLy8gTGljZW5zZTogaHR0cHM6Ly9naXRodWIuY29tL2Fkb2JlL3JlYWN0LXNwZWN0cnVtL2Jsb2IvYjM1ZDVjMDJmZTkwMGJhZGNjZDBjZjFhOGYyM2JiNTkzNDE5ZjIzOC9wYWNrYWdlcy9AcmVhY3QtYXJpYS91dGlscy9zcmMvaXNWaXJ0dWFsRXZlbnQudHNcbmZ1bmN0aW9uIGlzVmlydHVhbENsaWNrKGV2ZW50KSB7XG4gIC8vIEZJWE1FOiBGaXJlZm94IGlzIG5vdyBlbWl0dGluZyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgZm9yIGBtb3pJbnB1dFNvdXJjZWAuXG4gIC8vIFRyeSB0byBmaW5kIGEgd29ya2Fyb3VuZCBmb3IgdGhpcy4gYHJlYWN0LWFyaWFgIHNvdXJjZSBzdGlsbCBoYXMgdGhlIGNoZWNrLlxuICBpZiAoZXZlbnQubW96SW5wdXRTb3VyY2UgPT09IDAgJiYgZXZlbnQuaXNUcnVzdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGlzQW5kcm9pZCgpICYmIGV2ZW50LnBvaW50ZXJUeXBlKSB7XG4gICAgcmV0dXJuIGV2ZW50LnR5cGUgPT09ICdjbGljaycgJiYgZXZlbnQuYnV0dG9ucyA9PT0gMTtcbiAgfVxuICByZXR1cm4gZXZlbnQuZGV0YWlsID09PSAwICYmICFldmVudC5wb2ludGVyVHlwZTtcbn1cbmZ1bmN0aW9uIGlzVmlydHVhbFBvaW50ZXJFdmVudChldmVudCkge1xuICBpZiAoaXNKU0RPTSgpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAhaXNBbmRyb2lkKCkgJiYgZXZlbnQud2lkdGggPT09IDAgJiYgZXZlbnQuaGVpZ2h0ID09PSAwIHx8IGlzQW5kcm9pZCgpICYmIGV2ZW50LndpZHRoID09PSAxICYmIGV2ZW50LmhlaWdodCA9PT0gMSAmJiBldmVudC5wcmVzc3VyZSA9PT0gMCAmJiBldmVudC5kZXRhaWwgPT09IDAgJiYgZXZlbnQucG9pbnRlclR5cGUgPT09ICdtb3VzZScgfHxcbiAgLy8gaU9TIFZvaWNlT3ZlciByZXR1cm5zIDAuMzMz4oCiIGZvciB3aWR0aC9oZWlnaHQuXG4gIGV2ZW50LndpZHRoIDwgMSAmJiBldmVudC5oZWlnaHQgPCAxICYmIGV2ZW50LnByZXNzdXJlID09PSAwICYmIGV2ZW50LmRldGFpbCA9PT0gMCAmJiBldmVudC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJztcbn1cbmZ1bmN0aW9uIGlzU2FmYXJpKCkge1xuICAvLyBDaHJvbWUgRGV2VG9vbHMgZG9lcyBub3QgY29tcGxhaW4gYWJvdXQgbmF2aWdhdG9yLnZlbmRvclxuICByZXR1cm4gL2FwcGxlL2kudGVzdChuYXZpZ2F0b3IudmVuZG9yKTtcbn1cbmZ1bmN0aW9uIGlzQW5kcm9pZCgpIHtcbiAgY29uc3QgcmUgPSAvYW5kcm9pZC9pO1xuICByZXR1cm4gcmUudGVzdChnZXRQbGF0Zm9ybSgpKSB8fCByZS50ZXN0KGdldFVzZXJBZ2VudCgpKTtcbn1cbmZ1bmN0aW9uIGlzTWFjKCkge1xuICByZXR1cm4gZ2V0UGxhdGZvcm0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ21hYycpICYmICFuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM7XG59XG5mdW5jdGlvbiBpc0pTRE9NKCkge1xuICByZXR1cm4gZ2V0VXNlckFnZW50KCkuaW5jbHVkZXMoJ2pzZG9tLycpO1xufVxuZnVuY3Rpb24gaXNNb3VzZUxpa2VQb2ludGVyVHlwZShwb2ludGVyVHlwZSwgc3RyaWN0KSB7XG4gIC8vIE9uIHNvbWUgTGludXggbWFjaGluZXMgd2l0aCBDaHJvbWl1bSwgbW91c2UgaW5wdXRzIHJldHVybiBhIGBwb2ludGVyVHlwZWBcbiAgLy8gb2YgXCJwZW5cIjogaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yMDE1XG4gIGNvbnN0IHZhbHVlcyA9IFsnbW91c2UnLCAncGVuJ107XG4gIGlmICghc3RyaWN0KSB7XG4gICAgdmFsdWVzLnB1c2goJycsIHVuZGVmaW5lZCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcy5pbmNsdWRlcyhwb2ludGVyVHlwZSk7XG59XG5mdW5jdGlvbiBpc1JlYWN0RXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuICduYXRpdmVFdmVudCcgaW4gZXZlbnQ7XG59XG5mdW5jdGlvbiBpc1Jvb3RFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQubWF0Y2hlcygnaHRtbCxib2R5Jyk7XG59XG5mdW5jdGlvbiBnZXREb2N1bWVudChub2RlKSB7XG4gIHJldHVybiAobm9kZSA9PSBudWxsID8gdm9pZCAwIDogbm9kZS5vd25lckRvY3VtZW50KSB8fCBkb2N1bWVudDtcbn1cbmZ1bmN0aW9uIGlzRXZlbnRUYXJnZXRXaXRoaW4oZXZlbnQsIG5vZGUpIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoJ2NvbXBvc2VkUGF0aCcgaW4gZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMobm9kZSk7XG4gIH1cblxuICAvLyBUUyB0aGlua3MgYGV2ZW50YCBpcyBvZiB0eXBlIG5ldmVyIGFzIGl0IGFzc3VtZXMgYWxsIGJyb3dzZXJzIHN1cHBvcnQgY29tcG9zZWRQYXRoLCBidXQgYnJvd3NlcnMgd2l0aG91dCBzaGFkb3cgZG9tIGRvbid0XG4gIGNvbnN0IGUgPSBldmVudDtcbiAgcmV0dXJuIGUudGFyZ2V0ICE9IG51bGwgJiYgbm9kZS5jb250YWlucyhlLnRhcmdldCk7XG59XG5mdW5jdGlvbiBnZXRUYXJnZXQoZXZlbnQpIHtcbiAgaWYgKCdjb21wb3NlZFBhdGgnIGluIGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LmNvbXBvc2VkUGF0aCgpWzBdO1xuICB9XG5cbiAgLy8gVFMgdGhpbmtzIGBldmVudGAgaXMgb2YgdHlwZSBuZXZlciBhcyBpdCBhc3N1bWVzIGFsbCBicm93c2VycyBzdXBwb3J0XG4gIC8vIGBjb21wb3NlZFBhdGgoKWAsIGJ1dCBicm93c2VycyB3aXRob3V0IHNoYWRvdyBET00gZG9uJ3QuXG4gIHJldHVybiBldmVudC50YXJnZXQ7XG59XG5jb25zdCBUWVBFQUJMRV9TRUxFQ1RPUiA9IFwiaW5wdXQ6bm90KFt0eXBlPSdoaWRkZW4nXSk6bm90KFtkaXNhYmxlZF0pLFwiICsgXCJbY29udGVudGVkaXRhYmxlXTpub3QoW2NvbnRlbnRlZGl0YWJsZT0nZmFsc2UnXSksdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pXCI7XG5mdW5jdGlvbiBpc1R5cGVhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpICYmIGVsZW1lbnQubWF0Y2hlcyhUWVBFQUJMRV9TRUxFQ1RPUik7XG59XG5mdW5jdGlvbiBzdG9wRXZlbnQoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59XG5mdW5jdGlvbiBpc1R5cGVhYmxlQ29tYm9ib3goZWxlbWVudCkge1xuICBpZiAoIWVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdjb21ib2JveCcgJiYgaXNUeXBlYWJsZUVsZW1lbnQoZWxlbWVudCk7XG59XG5cbmV4cG9ydCB7IFRZUEVBQkxFX1NFTEVDVE9SLCBhY3RpdmVFbGVtZW50LCBjb250YWlucywgZ2V0RG9jdW1lbnQsIGdldFBsYXRmb3JtLCBnZXRUYXJnZXQsIGdldFVzZXJBZ2VudCwgaXNBbmRyb2lkLCBpc0V2ZW50VGFyZ2V0V2l0aGluLCBpc0pTRE9NLCBpc01hYywgaXNNb3VzZUxpa2VQb2ludGVyVHlwZSwgaXNSZWFjdEV2ZW50LCBpc1Jvb3RFbGVtZW50LCBpc1NhZmFyaSwgaXNUeXBlYWJsZUNvbWJvYm94LCBpc1R5cGVhYmxlRWxlbWVudCwgaXNWaXJ0dWFsQ2xpY2ssIGlzVmlydHVhbFBvaW50ZXJFdmVudCwgc3RvcEV2ZW50IH07XG4iLCJmdW5jdGlvbiBnZXROb2RlTmFtZShub2RlKSB7XG4gIGlmIChpc05vZGUobm9kZSkpIHtcbiAgICByZXR1cm4gKG5vZGUubm9kZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgLy8gTW9ja2VkIG5vZGVzIGluIHRlc3RpbmcgZW52aXJvbm1lbnRzIG1heSBub3QgYmUgaW5zdGFuY2VzIG9mIE5vZGUuIEJ5XG4gIC8vIHJldHVybmluZyBgI2RvY3VtZW50YCBhbiBpbmZpbml0ZSBsb29wIHdvbid0IG9jY3VyLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzIzMTdcbiAgcmV0dXJuICcjZG9jdW1lbnQnO1xufVxuZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgdmFyIF9ub2RlJG93bmVyRG9jdW1lbnQ7XG4gIHJldHVybiAobm9kZSA9PSBudWxsIHx8IChfbm9kZSRvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgfHwgd2luZG93O1xufVxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KG5vZGUpIHtcbiAgdmFyIF9yZWY7XG4gIHJldHVybiAoX3JlZiA9IChpc05vZGUobm9kZSkgPyBub2RlLm93bmVyRG9jdW1lbnQgOiBub2RlLmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfcmVmLmRvY3VtZW50RWxlbWVudDtcbn1cbmZ1bmN0aW9uIGlzTm9kZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBOb2RlIHx8IHZhbHVlIGluc3RhbmNlb2YgZ2V0V2luZG93KHZhbHVlKS5Ob2RlO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdmFsdWUgaW5zdGFuY2VvZiBnZXRXaW5kb3codmFsdWUpLkVsZW1lbnQ7XG59XG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHZhbHVlIGluc3RhbmNlb2YgZ2V0V2luZG93KHZhbHVlKS5IVE1MRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGlzU2hhZG93Um9vdCh2YWx1ZSkge1xuICAvLyBCcm93c2VycyB3aXRob3V0IGBTaGFkb3dSb290YCBzdXBwb3J0LlxuICBpZiAodHlwZW9mIFNoYWRvd1Jvb3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QgfHwgdmFsdWUgaW5zdGFuY2VvZiBnZXRXaW5kb3codmFsdWUpLlNoYWRvd1Jvb3Q7XG59XG5mdW5jdGlvbiBpc092ZXJmbG93RWxlbWVudChlbGVtZW50KSB7XG4gIGNvbnN0IHtcbiAgICBvdmVyZmxvdyxcbiAgICBvdmVyZmxvd1gsXG4gICAgb3ZlcmZsb3dZLFxuICAgIGRpc3BsYXlcbiAgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW58Y2xpcC8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCkgJiYgIVsnaW5saW5lJywgJ2NvbnRlbnRzJ10uaW5jbHVkZXMoZGlzcGxheSk7XG59XG5mdW5jdGlvbiBpc1RhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBbJ3RhYmxlJywgJ3RkJywgJ3RoJ10uaW5jbHVkZXMoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpO1xufVxuZnVuY3Rpb24gaXNUb3BMYXllcihlbGVtZW50KSB7XG4gIHJldHVybiBbJzpwb3BvdmVyLW9wZW4nLCAnOm1vZGFsJ10uc29tZShzZWxlY3RvciA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gaXNDb250YWluaW5nQmxvY2soZWxlbWVudE9yQ3NzKSB7XG4gIGNvbnN0IHdlYmtpdCA9IGlzV2ViS2l0KCk7XG4gIGNvbnN0IGNzcyA9IGlzRWxlbWVudChlbGVtZW50T3JDc3MpID8gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50T3JDc3MpIDogZWxlbWVudE9yQ3NzO1xuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG4gIHJldHVybiBjc3MudHJhbnNmb3JtICE9PSAnbm9uZScgfHwgY3NzLnBlcnNwZWN0aXZlICE9PSAnbm9uZScgfHwgKGNzcy5jb250YWluZXJUeXBlID8gY3NzLmNvbnRhaW5lclR5cGUgIT09ICdub3JtYWwnIDogZmFsc2UpIHx8ICF3ZWJraXQgJiYgKGNzcy5iYWNrZHJvcEZpbHRlciA/IGNzcy5iYWNrZHJvcEZpbHRlciAhPT0gJ25vbmUnIDogZmFsc2UpIHx8ICF3ZWJraXQgJiYgKGNzcy5maWx0ZXIgPyBjc3MuZmlsdGVyICE9PSAnbm9uZScgOiBmYWxzZSkgfHwgWyd0cmFuc2Zvcm0nLCAncGVyc3BlY3RpdmUnLCAnZmlsdGVyJ10uc29tZSh2YWx1ZSA9PiAoY3NzLndpbGxDaGFuZ2UgfHwgJycpLmluY2x1ZGVzKHZhbHVlKSkgfHwgWydwYWludCcsICdsYXlvdXQnLCAnc3RyaWN0JywgJ2NvbnRlbnQnXS5zb21lKHZhbHVlID0+IChjc3MuY29udGFpbiB8fCAnJykuaW5jbHVkZXModmFsdWUpKTtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIGxldCBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiAhaXNMYXN0VHJhdmVyc2FibGVOb2RlKGN1cnJlbnROb2RlKSkge1xuICAgIGlmIChpc0NvbnRhaW5pbmdCbG9jayhjdXJyZW50Tm9kZSkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9IGVsc2UgaWYgKGlzVG9wTGF5ZXIoY3VycmVudE5vZGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY3VycmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGN1cnJlbnROb2RlKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzV2ViS2l0KCkge1xuICBpZiAodHlwZW9mIENTUyA9PT0gJ3VuZGVmaW5lZCcgfHwgIUNTUy5zdXBwb3J0cykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gQ1NTLnN1cHBvcnRzKCctd2Via2l0LWJhY2tkcm9wLWZpbHRlcicsICdub25lJyk7XG59XG5mdW5jdGlvbiBpc0xhc3RUcmF2ZXJzYWJsZU5vZGUobm9kZSkge1xuICByZXR1cm4gWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5jbHVkZXMoZ2V0Tm9kZU5hbWUobm9kZSkpO1xufVxuZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSB7XG4gIHJldHVybiBnZXRXaW5kb3coZWxlbWVudCkuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbn1cbmZ1bmN0aW9uIGdldE5vZGVTY3JvbGwoZWxlbWVudCkge1xuICBpZiAoaXNFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxYLFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxZXG4gIH07XG59XG5mdW5jdGlvbiBnZXRQYXJlbnROb2RlKG5vZGUpIHtcbiAgaWYgKGdldE5vZGVOYW1lKG5vZGUpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPVxuICAvLyBTdGVwIGludG8gdGhlIHNoYWRvdyBET00gb2YgdGhlIHBhcmVudCBvZiBhIHNsb3R0ZWQgbm9kZS5cbiAgbm9kZS5hc3NpZ25lZFNsb3QgfHxcbiAgLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWQuXG4gIG5vZGUucGFyZW50Tm9kZSB8fFxuICAvLyBTaGFkb3dSb290IGRldGVjdGVkLlxuICBpc1NoYWRvd1Jvb3Qobm9kZSkgJiYgbm9kZS5ob3N0IHx8XG4gIC8vIEZhbGxiYWNrLlxuICBnZXREb2N1bWVudEVsZW1lbnQobm9kZSk7XG4gIHJldHVybiBpc1NoYWRvd1Jvb3QocmVzdWx0KSA/IHJlc3VsdC5ob3N0IDogcmVzdWx0O1xufVxuZnVuY3Rpb24gZ2V0TmVhcmVzdE92ZXJmbG93QW5jZXN0b3Iobm9kZSkge1xuICBjb25zdCBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShub2RlKTtcbiAgaWYgKGlzTGFzdFRyYXZlcnNhYmxlTm9kZShwYXJlbnROb2RlKSkge1xuICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQgPyBub2RlLm93bmVyRG9jdW1lbnQuYm9keSA6IG5vZGUuYm9keTtcbiAgfVxuICBpZiAoaXNIVE1MRWxlbWVudChwYXJlbnROb2RlKSAmJiBpc092ZXJmbG93RWxlbWVudChwYXJlbnROb2RlKSkge1xuICAgIHJldHVybiBwYXJlbnROb2RlO1xuICB9XG4gIHJldHVybiBnZXROZWFyZXN0T3ZlcmZsb3dBbmNlc3RvcihwYXJlbnROb2RlKTtcbn1cbmZ1bmN0aW9uIGdldE92ZXJmbG93QW5jZXN0b3JzKG5vZGUsIGxpc3QsIHRyYXZlcnNlSWZyYW1lcykge1xuICB2YXIgX25vZGUkb3duZXJEb2N1bWVudDI7XG4gIGlmIChsaXN0ID09PSB2b2lkIDApIHtcbiAgICBsaXN0ID0gW107XG4gIH1cbiAgaWYgKHRyYXZlcnNlSWZyYW1lcyA9PT0gdm9pZCAwKSB7XG4gICAgdHJhdmVyc2VJZnJhbWVzID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBzY3JvbGxhYmxlQW5jZXN0b3IgPSBnZXROZWFyZXN0T3ZlcmZsb3dBbmNlc3Rvcihub2RlKTtcbiAgY29uc3QgaXNCb2R5ID0gc2Nyb2xsYWJsZUFuY2VzdG9yID09PSAoKF9ub2RlJG93bmVyRG9jdW1lbnQyID0gbm9kZS5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkb3duZXJEb2N1bWVudDIuYm9keSk7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhzY3JvbGxhYmxlQW5jZXN0b3IpO1xuICBpZiAoaXNCb2R5KSB7XG4gICAgY29uc3QgZnJhbWVFbGVtZW50ID0gZ2V0RnJhbWVFbGVtZW50KHdpbik7XG4gICAgcmV0dXJuIGxpc3QuY29uY2F0KHdpbiwgd2luLnZpc3VhbFZpZXdwb3J0IHx8IFtdLCBpc092ZXJmbG93RWxlbWVudChzY3JvbGxhYmxlQW5jZXN0b3IpID8gc2Nyb2xsYWJsZUFuY2VzdG9yIDogW10sIGZyYW1lRWxlbWVudCAmJiB0cmF2ZXJzZUlmcmFtZXMgPyBnZXRPdmVyZmxvd0FuY2VzdG9ycyhmcmFtZUVsZW1lbnQpIDogW10pO1xuICB9XG4gIHJldHVybiBsaXN0LmNvbmNhdChzY3JvbGxhYmxlQW5jZXN0b3IsIGdldE92ZXJmbG93QW5jZXN0b3JzKHNjcm9sbGFibGVBbmNlc3RvciwgW10sIHRyYXZlcnNlSWZyYW1lcykpO1xufVxuZnVuY3Rpb24gZ2V0RnJhbWVFbGVtZW50KHdpbikge1xuICByZXR1cm4gd2luLnBhcmVudCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yod2luLnBhcmVudCkgPyB3aW4uZnJhbWVFbGVtZW50IDogbnVsbDtcbn1cblxuZXhwb3J0IHsgZ2V0Q29tcHV0ZWRTdHlsZSwgZ2V0Q29udGFpbmluZ0Jsb2NrLCBnZXREb2N1bWVudEVsZW1lbnQsIGdldEZyYW1lRWxlbWVudCwgZ2V0TmVhcmVzdE92ZXJmbG93QW5jZXN0b3IsIGdldE5vZGVOYW1lLCBnZXROb2RlU2Nyb2xsLCBnZXRPdmVyZmxvd0FuY2VzdG9ycywgZ2V0UGFyZW50Tm9kZSwgZ2V0V2luZG93LCBpc0NvbnRhaW5pbmdCbG9jaywgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc0xhc3RUcmF2ZXJzYWJsZU5vZGUsIGlzTm9kZSwgaXNPdmVyZmxvd0VsZW1lbnQsIGlzU2hhZG93Um9vdCwgaXNUYWJsZUVsZW1lbnQsIGlzVG9wTGF5ZXIsIGlzV2ViS2l0IH07XG4iLCIvKipcbiAqIEN1c3RvbSBwb3NpdGlvbmluZyByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy92aXJ0dWFsLWVsZW1lbnRzXG4gKi9cblxuY29uc3Qgc2lkZXMgPSBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddO1xuY29uc3QgYWxpZ25tZW50cyA9IFsnc3RhcnQnLCAnZW5kJ107XG5jb25zdCBwbGFjZW1lbnRzID0gLyojX19QVVJFX18qL3NpZGVzLnJlZHVjZSgoYWNjLCBzaWRlKSA9PiBhY2MuY29uY2F0KHNpZGUsIHNpZGUgKyBcIi1cIiArIGFsaWdubWVudHNbMF0sIHNpZGUgKyBcIi1cIiArIGFsaWdubWVudHNbMV0pLCBbXSk7XG5jb25zdCBtaW4gPSBNYXRoLm1pbjtcbmNvbnN0IG1heCA9IE1hdGgubWF4O1xuY29uc3Qgcm91bmQgPSBNYXRoLnJvdW5kO1xuY29uc3QgZmxvb3IgPSBNYXRoLmZsb29yO1xuY29uc3QgY3JlYXRlQ29vcmRzID0gdiA9PiAoe1xuICB4OiB2LFxuICB5OiB2XG59KTtcbmNvbnN0IG9wcG9zaXRlU2lkZU1hcCA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmNvbnN0IG9wcG9zaXRlQWxpZ25tZW50TWFwID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmZ1bmN0aW9uIGNsYW1wKHN0YXJ0LCB2YWx1ZSwgZW5kKSB7XG4gIHJldHVybiBtYXgoc3RhcnQsIG1pbih2YWx1ZSwgZW5kKSk7XG59XG5mdW5jdGlvbiBldmFsdWF0ZSh2YWx1ZSwgcGFyYW0pIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlKHBhcmFtKSA6IHZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0U2lkZShwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xufVxuZnVuY3Rpb24gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG59XG5mdW5jdGlvbiBnZXRPcHBvc2l0ZUF4aXMoYXhpcykge1xuICByZXR1cm4gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xufVxuZnVuY3Rpb24gZ2V0QXhpc0xlbmd0aChheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG59XG5mdW5jdGlvbiBnZXRTaWRlQXhpcyhwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluY2x1ZGVzKGdldFNpZGUocGxhY2VtZW50KSkgPyAneScgOiAneCc7XG59XG5mdW5jdGlvbiBnZXRBbGlnbm1lbnRBeGlzKHBsYWNlbWVudCkge1xuICByZXR1cm4gZ2V0T3Bwb3NpdGVBeGlzKGdldFNpZGVBeGlzKHBsYWNlbWVudCkpO1xufVxuZnVuY3Rpb24gZ2V0QWxpZ25tZW50U2lkZXMocGxhY2VtZW50LCByZWN0cywgcnRsKSB7XG4gIGlmIChydGwgPT09IHZvaWQgMCkge1xuICAgIHJ0bCA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICBjb25zdCBhbGlnbm1lbnRBeGlzID0gZ2V0QWxpZ25tZW50QXhpcyhwbGFjZW1lbnQpO1xuICBjb25zdCBsZW5ndGggPSBnZXRBeGlzTGVuZ3RoKGFsaWdubWVudEF4aXMpO1xuICBsZXQgbWFpbkFsaWdubWVudFNpZGUgPSBhbGlnbm1lbnRBeGlzID09PSAneCcgPyBhbGlnbm1lbnQgPT09IChydGwgPyAnZW5kJyA6ICdzdGFydCcpID8gJ3JpZ2h0JyA6ICdsZWZ0JyA6IGFsaWdubWVudCA9PT0gJ3N0YXJ0JyA/ICdib3R0b20nIDogJ3RvcCc7XG4gIGlmIChyZWN0cy5yZWZlcmVuY2VbbGVuZ3RoXSA+IHJlY3RzLmZsb2F0aW5nW2xlbmd0aF0pIHtcbiAgICBtYWluQWxpZ25tZW50U2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5BbGlnbm1lbnRTaWRlKTtcbiAgfVxuICByZXR1cm4gW21haW5BbGlnbm1lbnRTaWRlLCBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluQWxpZ25tZW50U2lkZSldO1xufVxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBjb25zdCBvcHBvc2l0ZVBsYWNlbWVudCA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHJldHVybiBbZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQocGxhY2VtZW50KSwgb3Bwb3NpdGVQbGFjZW1lbnQsIGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50KG9wcG9zaXRlUGxhY2VtZW50KV07XG59XG5mdW5jdGlvbiBnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9zdGFydHxlbmQvZywgYWxpZ25tZW50ID0+IG9wcG9zaXRlQWxpZ25tZW50TWFwW2FsaWdubWVudF0pO1xufVxuZnVuY3Rpb24gZ2V0U2lkZUxpc3Qoc2lkZSwgaXNTdGFydCwgcnRsKSB7XG4gIGNvbnN0IGxyID0gWydsZWZ0JywgJ3JpZ2h0J107XG4gIGNvbnN0IHJsID0gWydyaWdodCcsICdsZWZ0J107XG4gIGNvbnN0IHRiID0gWyd0b3AnLCAnYm90dG9tJ107XG4gIGNvbnN0IGJ0ID0gWydib3R0b20nLCAndG9wJ107XG4gIHN3aXRjaCAoc2lkZSkge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGlmIChydGwpIHJldHVybiBpc1N0YXJ0ID8gcmwgOiBscjtcbiAgICAgIHJldHVybiBpc1N0YXJ0ID8gbHIgOiBybDtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4gaXNTdGFydCA/IHRiIDogYnQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBbXTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVBeGlzUGxhY2VtZW50cyhwbGFjZW1lbnQsIGZsaXBBbGlnbm1lbnQsIGRpcmVjdGlvbiwgcnRsKSB7XG4gIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICBsZXQgbGlzdCA9IGdldFNpZGVMaXN0KGdldFNpZGUocGxhY2VtZW50KSwgZGlyZWN0aW9uID09PSAnc3RhcnQnLCBydGwpO1xuICBpZiAoYWxpZ25tZW50KSB7XG4gICAgbGlzdCA9IGxpc3QubWFwKHNpZGUgPT4gc2lkZSArIFwiLVwiICsgYWxpZ25tZW50KTtcbiAgICBpZiAoZmxpcEFsaWdubWVudCkge1xuICAgICAgbGlzdCA9IGxpc3QuY29uY2F0KGxpc3QubWFwKGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50KSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsaXN0O1xufVxuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIHNpZGUgPT4gb3Bwb3NpdGVTaWRlTWFwW3NpZGVdKTtcbn1cbmZ1bmN0aW9uIGV4cGFuZFBhZGRpbmdPYmplY3QocGFkZGluZykge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMCxcbiAgICAuLi5wYWRkaW5nXG4gIH07XG59XG5mdW5jdGlvbiBnZXRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IGV4cGFuZFBhZGRpbmdPYmplY3QocGFkZGluZykgOiB7XG4gICAgdG9wOiBwYWRkaW5nLFxuICAgIHJpZ2h0OiBwYWRkaW5nLFxuICAgIGJvdHRvbTogcGFkZGluZyxcbiAgICBsZWZ0OiBwYWRkaW5nXG4gIH07XG59XG5mdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgY29uc3Qge1xuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfSA9IHJlY3Q7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHRvcDogeSxcbiAgICBsZWZ0OiB4LFxuICAgIHJpZ2h0OiB4ICsgd2lkdGgsXG4gICAgYm90dG9tOiB5ICsgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9O1xufVxuXG5leHBvcnQgeyBhbGlnbm1lbnRzLCBjbGFtcCwgY3JlYXRlQ29vcmRzLCBldmFsdWF0ZSwgZXhwYW5kUGFkZGluZ09iamVjdCwgZmxvb3IsIGdldEFsaWdubWVudCwgZ2V0QWxpZ25tZW50QXhpcywgZ2V0QWxpZ25tZW50U2lkZXMsIGdldEF4aXNMZW5ndGgsIGdldEV4cGFuZGVkUGxhY2VtZW50cywgZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQsIGdldE9wcG9zaXRlQXhpcywgZ2V0T3Bwb3NpdGVBeGlzUGxhY2VtZW50cywgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQsIGdldFBhZGRpbmdPYmplY3QsIGdldFNpZGUsIGdldFNpZGVBeGlzLCBtYXgsIG1pbiwgcGxhY2VtZW50cywgcmVjdFRvQ2xpZW50UmVjdCwgcm91bmQsIHNpZGVzIH07XG4iLCIvLyBwYWNrYWdlcy9jb3JlL3ByaW1pdGl2ZS9zcmMvcHJpbWl0aXZlLnRzeFxuZnVuY3Rpb24gY29tcG9zZUV2ZW50SGFuZGxlcnMob3JpZ2luYWxFdmVudEhhbmRsZXIsIG91ckV2ZW50SGFuZGxlciwgeyBjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlIH0gPSB7fSkge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICBvcmlnaW5hbEV2ZW50SGFuZGxlcj8uKGV2ZW50KTtcbiAgICBpZiAoY2hlY2tGb3JEZWZhdWx0UHJldmVudGVkID09PSBmYWxzZSB8fCAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuIG91ckV2ZW50SGFuZGxlcj8uKGV2ZW50KTtcbiAgICB9XG4gIH07XG59XG5leHBvcnQge1xuICBjb21wb3NlRXZlbnRIYW5kbGVyc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L2Fycm93L3NyYy9BcnJvdy50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wcmltaXRpdmVcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIE5BTUUgPSBcIkFycm93XCI7XG52YXIgQXJyb3cgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgY2hpbGRyZW4sIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIC4uLmFycm93UHJvcHMgfSA9IHByb3BzO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICBQcmltaXRpdmUuc3ZnLFxuICAgIHtcbiAgICAgIC4uLmFycm93UHJvcHMsXG4gICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdmlld0JveDogXCIwIDAgMzAgMTBcIixcbiAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW86IFwibm9uZVwiLFxuICAgICAgY2hpbGRyZW46IHByb3BzLmFzQ2hpbGQgPyBjaGlsZHJlbiA6IC8qIEBfX1BVUkVfXyAqLyBqc3goXCJwb2x5Z29uXCIsIHsgcG9pbnRzOiBcIjAsMCAzMCwwIDE1LDEwXCIgfSlcbiAgICB9XG4gICk7XG59KTtcbkFycm93LmRpc3BsYXlOYW1lID0gTkFNRTtcbnZhciBSb290ID0gQXJyb3c7XG5leHBvcnQge1xuICBBcnJvdyxcbiAgUm9vdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9jb2xsZWN0aW9uL3NyYy9Db2xsZWN0aW9uLnRzeFxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dFNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3Qtc2xvdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5mdW5jdGlvbiBjcmVhdGVDb2xsZWN0aW9uKG5hbWUpIHtcbiAgY29uc3QgUFJPVklERVJfTkFNRSA9IG5hbWUgKyBcIkNvbGxlY3Rpb25Qcm92aWRlclwiO1xuICBjb25zdCBbY3JlYXRlQ29sbGVjdGlvbkNvbnRleHQsIGNyZWF0ZUNvbGxlY3Rpb25TY29wZV0gPSBjcmVhdGVDb250ZXh0U2NvcGUoUFJPVklERVJfTkFNRSk7XG4gIGNvbnN0IFtDb2xsZWN0aW9uUHJvdmlkZXJJbXBsLCB1c2VDb2xsZWN0aW9uQ29udGV4dF0gPSBjcmVhdGVDb2xsZWN0aW9uQ29udGV4dChcbiAgICBQUk9WSURFUl9OQU1FLFxuICAgIHsgY29sbGVjdGlvblJlZjogeyBjdXJyZW50OiBudWxsIH0sIGl0ZW1NYXA6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkgfVxuICApO1xuICBjb25zdCBDb2xsZWN0aW9uUHJvdmlkZXIgPSAocHJvcHMpID0+IHtcbiAgICBjb25zdCB7IHNjb3BlLCBjaGlsZHJlbiB9ID0gcHJvcHM7XG4gICAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGl0ZW1NYXAgPSBSZWFjdC51c2VSZWYoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSkuY3VycmVudDtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb2xsZWN0aW9uUHJvdmlkZXJJbXBsLCB7IHNjb3BlLCBpdGVtTWFwLCBjb2xsZWN0aW9uUmVmOiByZWYsIGNoaWxkcmVuIH0pO1xuICB9O1xuICBDb2xsZWN0aW9uUHJvdmlkZXIuZGlzcGxheU5hbWUgPSBQUk9WSURFUl9OQU1FO1xuICBjb25zdCBDT0xMRUNUSU9OX1NMT1RfTkFNRSA9IG5hbWUgKyBcIkNvbGxlY3Rpb25TbG90XCI7XG4gIGNvbnN0IENvbGxlY3Rpb25TbG90ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgICAgY29uc3QgeyBzY29wZSwgY2hpbGRyZW4gfSA9IHByb3BzO1xuICAgICAgY29uc3QgY29udGV4dCA9IHVzZUNvbGxlY3Rpb25Db250ZXh0KENPTExFQ1RJT05fU0xPVF9OQU1FLCBzY29wZSk7XG4gICAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCBjb250ZXh0LmNvbGxlY3Rpb25SZWYpO1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goU2xvdCwgeyByZWY6IGNvbXBvc2VkUmVmcywgY2hpbGRyZW4gfSk7XG4gICAgfVxuICApO1xuICBDb2xsZWN0aW9uU2xvdC5kaXNwbGF5TmFtZSA9IENPTExFQ1RJT05fU0xPVF9OQU1FO1xuICBjb25zdCBJVEVNX1NMT1RfTkFNRSA9IG5hbWUgKyBcIkNvbGxlY3Rpb25JdGVtU2xvdFwiO1xuICBjb25zdCBJVEVNX0RBVEFfQVRUUiA9IFwiZGF0YS1yYWRpeC1jb2xsZWN0aW9uLWl0ZW1cIjtcbiAgY29uc3QgQ29sbGVjdGlvbkl0ZW1TbG90ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgICAgY29uc3QgeyBzY29wZSwgY2hpbGRyZW4sIC4uLml0ZW1EYXRhIH0gPSBwcm9wcztcbiAgICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIHJlZik7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdXNlQ29sbGVjdGlvbkNvbnRleHQoSVRFTV9TTE9UX05BTUUsIHNjb3BlKTtcbiAgICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnRleHQuaXRlbU1hcC5zZXQocmVmLCB7IHJlZiwgLi4uaXRlbURhdGEgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB2b2lkIGNvbnRleHQuaXRlbU1hcC5kZWxldGUocmVmKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goU2xvdCwgeyAuLi57IFtJVEVNX0RBVEFfQVRUUl06IFwiXCIgfSwgcmVmOiBjb21wb3NlZFJlZnMsIGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgKTtcbiAgQ29sbGVjdGlvbkl0ZW1TbG90LmRpc3BsYXlOYW1lID0gSVRFTV9TTE9UX05BTUU7XG4gIGZ1bmN0aW9uIHVzZUNvbGxlY3Rpb24oc2NvcGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlQ29sbGVjdGlvbkNvbnRleHQobmFtZSArIFwiQ29sbGVjdGlvbkNvbnN1bWVyXCIsIHNjb3BlKTtcbiAgICBjb25zdCBnZXRJdGVtcyA9IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25Ob2RlID0gY29udGV4dC5jb2xsZWN0aW9uUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIWNvbGxlY3Rpb25Ob2RlKSByZXR1cm4gW107XG4gICAgICBjb25zdCBvcmRlcmVkTm9kZXMgPSBBcnJheS5mcm9tKGNvbGxlY3Rpb25Ob2RlLnF1ZXJ5U2VsZWN0b3JBbGwoYFske0lURU1fREFUQV9BVFRSfV1gKSk7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oY29udGV4dC5pdGVtTWFwLnZhbHVlcygpKTtcbiAgICAgIGNvbnN0IG9yZGVyZWRJdGVtcyA9IGl0ZW1zLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBvcmRlcmVkTm9kZXMuaW5kZXhPZihhLnJlZi5jdXJyZW50KSAtIG9yZGVyZWROb2Rlcy5pbmRleE9mKGIucmVmLmN1cnJlbnQpXG4gICAgICApO1xuICAgICAgcmV0dXJuIG9yZGVyZWRJdGVtcztcbiAgICB9LCBbY29udGV4dC5jb2xsZWN0aW9uUmVmLCBjb250ZXh0Lml0ZW1NYXBdKTtcbiAgICByZXR1cm4gZ2V0SXRlbXM7XG4gIH1cbiAgcmV0dXJuIFtcbiAgICB7IFByb3ZpZGVyOiBDb2xsZWN0aW9uUHJvdmlkZXIsIFNsb3Q6IENvbGxlY3Rpb25TbG90LCBJdGVtU2xvdDogQ29sbGVjdGlvbkl0ZW1TbG90IH0sXG4gICAgdXNlQ29sbGVjdGlvbixcbiAgICBjcmVhdGVDb2xsZWN0aW9uU2NvcGVcbiAgXTtcbn1cbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbGxlY3Rpb25cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC9jb21wb3NlLXJlZnMvc3JjL2NvbXBvc2VSZWZzLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5mdW5jdGlvbiBzZXRSZWYocmVmLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmVmKHZhbHVlKTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB2b2lkIDApIHtcbiAgICByZWYuY3VycmVudCA9IHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBjb21wb3NlUmVmcyguLi5yZWZzKSB7XG4gIHJldHVybiAobm9kZSkgPT4gcmVmcy5mb3JFYWNoKChyZWYpID0+IHNldFJlZihyZWYsIG5vZGUpKTtcbn1cbmZ1bmN0aW9uIHVzZUNvbXBvc2VkUmVmcyguLi5yZWZzKSB7XG4gIHJldHVybiBSZWFjdC51c2VDYWxsYmFjayhjb21wb3NlUmVmcyguLi5yZWZzKSwgcmVmcyk7XG59XG5leHBvcnQge1xuICBjb21wb3NlUmVmcyxcbiAgdXNlQ29tcG9zZWRSZWZzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvY29udGV4dC9zcmMvY3JlYXRlQ29udGV4dC50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0Mihyb290Q29tcG9uZW50TmFtZSwgZGVmYXVsdENvbnRleHQpIHtcbiAgY29uc3QgQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoZGVmYXVsdENvbnRleHQpO1xuICBmdW5jdGlvbiBQcm92aWRlcihwcm9wcykge1xuICAgIGNvbnN0IHsgY2hpbGRyZW4sIC4uLmNvbnRleHQgfSA9IHByb3BzO1xuICAgIGNvbnN0IHZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiBjb250ZXh0LCBPYmplY3QudmFsdWVzKGNvbnRleHQpKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlLCBjaGlsZHJlbiB9KTtcbiAgfVxuICBmdW5jdGlvbiB1c2VDb250ZXh0Mihjb25zdW1lck5hbWUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChDb250ZXh0KTtcbiAgICBpZiAoY29udGV4dCkgcmV0dXJuIGNvbnRleHQ7XG4gICAgaWYgKGRlZmF1bHRDb250ZXh0ICE9PSB2b2lkIDApIHJldHVybiBkZWZhdWx0Q29udGV4dDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYCR7Y29uc3VtZXJOYW1lfVxcYCBtdXN0IGJlIHVzZWQgd2l0aGluIFxcYCR7cm9vdENvbXBvbmVudE5hbWV9XFxgYCk7XG4gIH1cbiAgUHJvdmlkZXIuZGlzcGxheU5hbWUgPSByb290Q29tcG9uZW50TmFtZSArIFwiUHJvdmlkZXJcIjtcbiAgcmV0dXJuIFtQcm92aWRlciwgdXNlQ29udGV4dDJdO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dFNjb3BlKHNjb3BlTmFtZSwgY3JlYXRlQ29udGV4dFNjb3BlRGVwcyA9IFtdKSB7XG4gIGxldCBkZWZhdWx0Q29udGV4dHMgPSBbXTtcbiAgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDMocm9vdENvbXBvbmVudE5hbWUsIGRlZmF1bHRDb250ZXh0KSB7XG4gICAgY29uc3QgQmFzZUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KGRlZmF1bHRDb250ZXh0KTtcbiAgICBjb25zdCBpbmRleCA9IGRlZmF1bHRDb250ZXh0cy5sZW5ndGg7XG4gICAgZGVmYXVsdENvbnRleHRzID0gWy4uLmRlZmF1bHRDb250ZXh0cywgZGVmYXVsdENvbnRleHRdO1xuICAgIGZ1bmN0aW9uIFByb3ZpZGVyKHByb3BzKSB7XG4gICAgICBjb25zdCB7IHNjb3BlLCBjaGlsZHJlbiwgLi4uY29udGV4dCB9ID0gcHJvcHM7XG4gICAgICBjb25zdCBDb250ZXh0ID0gc2NvcGU/LltzY29wZU5hbWVdW2luZGV4XSB8fCBCYXNlQ29udGV4dDtcbiAgICAgIGNvbnN0IHZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiBjb250ZXh0LCBPYmplY3QudmFsdWVzKGNvbnRleHQpKTtcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWUsIGNoaWxkcmVuIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1c2VDb250ZXh0Mihjb25zdW1lck5hbWUsIHNjb3BlKSB7XG4gICAgICBjb25zdCBDb250ZXh0ID0gc2NvcGU/LltzY29wZU5hbWVdW2luZGV4XSB8fCBCYXNlQ29udGV4dDtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbnRleHQpO1xuICAgICAgaWYgKGNvbnRleHQpIHJldHVybiBjb250ZXh0O1xuICAgICAgaWYgKGRlZmF1bHRDb250ZXh0ICE9PSB2b2lkIDApIHJldHVybiBkZWZhdWx0Q29udGV4dDtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXFxgJHtjb25zdW1lck5hbWV9XFxgIG11c3QgYmUgdXNlZCB3aXRoaW4gXFxgJHtyb290Q29tcG9uZW50TmFtZX1cXGBgKTtcbiAgICB9XG4gICAgUHJvdmlkZXIuZGlzcGxheU5hbWUgPSByb290Q29tcG9uZW50TmFtZSArIFwiUHJvdmlkZXJcIjtcbiAgICByZXR1cm4gW1Byb3ZpZGVyLCB1c2VDb250ZXh0Ml07XG4gIH1cbiAgY29uc3QgY3JlYXRlU2NvcGUgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2NvcGVDb250ZXh0cyA9IGRlZmF1bHRDb250ZXh0cy5tYXAoKGRlZmF1bHRDb250ZXh0KSA9PiB7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlQ29udGV4dChkZWZhdWx0Q29udGV4dCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVzZVNjb3BlKHNjb3BlKSB7XG4gICAgICBjb25zdCBjb250ZXh0cyA9IHNjb3BlPy5bc2NvcGVOYW1lXSB8fCBzY29wZUNvbnRleHRzO1xuICAgICAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oXG4gICAgICAgICgpID0+ICh7IFtgX19zY29wZSR7c2NvcGVOYW1lfWBdOiB7IC4uLnNjb3BlLCBbc2NvcGVOYW1lXTogY29udGV4dHMgfSB9KSxcbiAgICAgICAgW3Njb3BlLCBjb250ZXh0c11cbiAgICAgICk7XG4gICAgfTtcbiAgfTtcbiAgY3JlYXRlU2NvcGUuc2NvcGVOYW1lID0gc2NvcGVOYW1lO1xuICByZXR1cm4gW2NyZWF0ZUNvbnRleHQzLCBjb21wb3NlQ29udGV4dFNjb3BlcyhjcmVhdGVTY29wZSwgLi4uY3JlYXRlQ29udGV4dFNjb3BlRGVwcyldO1xufVxuZnVuY3Rpb24gY29tcG9zZUNvbnRleHRTY29wZXMoLi4uc2NvcGVzKSB7XG4gIGNvbnN0IGJhc2VTY29wZSA9IHNjb3Blc1swXTtcbiAgaWYgKHNjb3Blcy5sZW5ndGggPT09IDEpIHJldHVybiBiYXNlU2NvcGU7XG4gIGNvbnN0IGNyZWF0ZVNjb3BlID0gKCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlSG9va3MgPSBzY29wZXMubWFwKChjcmVhdGVTY29wZTIpID0+ICh7XG4gICAgICB1c2VTY29wZTogY3JlYXRlU2NvcGUyKCksXG4gICAgICBzY29wZU5hbWU6IGNyZWF0ZVNjb3BlMi5zY29wZU5hbWVcbiAgICB9KSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVzZUNvbXBvc2VkU2NvcGVzKG92ZXJyaWRlU2NvcGVzKSB7XG4gICAgICBjb25zdCBuZXh0U2NvcGVzID0gc2NvcGVIb29rcy5yZWR1Y2UoKG5leHRTY29wZXMyLCB7IHVzZVNjb3BlLCBzY29wZU5hbWUgfSkgPT4ge1xuICAgICAgICBjb25zdCBzY29wZVByb3BzID0gdXNlU2NvcGUob3ZlcnJpZGVTY29wZXMpO1xuICAgICAgICBjb25zdCBjdXJyZW50U2NvcGUgPSBzY29wZVByb3BzW2BfX3Njb3BlJHtzY29wZU5hbWV9YF07XG4gICAgICAgIHJldHVybiB7IC4uLm5leHRTY29wZXMyLCAuLi5jdXJyZW50U2NvcGUgfTtcbiAgICAgIH0sIHt9KTtcbiAgICAgIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7IFtgX19zY29wZSR7YmFzZVNjb3BlLnNjb3BlTmFtZX1gXTogbmV4dFNjb3BlcyB9KSwgW25leHRTY29wZXNdKTtcbiAgICB9O1xuICB9O1xuICBjcmVhdGVTY29wZS5zY29wZU5hbWUgPSBiYXNlU2NvcGUuc2NvcGVOYW1lO1xuICByZXR1cm4gY3JlYXRlU2NvcGU7XG59XG5leHBvcnQge1xuICBjcmVhdGVDb250ZXh0MiBhcyBjcmVhdGVDb250ZXh0LFxuICBjcmVhdGVDb250ZXh0U2NvcGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC9kaXJlY3Rpb24vc3JjL0RpcmVjdGlvbi50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgRGlyZWN0aW9uQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQodm9pZCAwKTtcbnZhciBEaXJlY3Rpb25Qcm92aWRlciA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IGRpciwgY2hpbGRyZW4gfSA9IHByb3BzO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChEaXJlY3Rpb25Db250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBkaXIsIGNoaWxkcmVuIH0pO1xufTtcbmZ1bmN0aW9uIHVzZURpcmVjdGlvbihsb2NhbERpcikge1xuICBjb25zdCBnbG9iYWxEaXIgPSBSZWFjdC51c2VDb250ZXh0KERpcmVjdGlvbkNvbnRleHQpO1xuICByZXR1cm4gbG9jYWxEaXIgfHwgZ2xvYmFsRGlyIHx8IFwibHRyXCI7XG59XG52YXIgUHJvdmlkZXIgPSBEaXJlY3Rpb25Qcm92aWRlcjtcbmV4cG9ydCB7XG4gIERpcmVjdGlvblByb3ZpZGVyLFxuICBQcm92aWRlcixcbiAgdXNlRGlyZWN0aW9uXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L2Rpc21pc3NhYmxlLWxheWVyL3NyYy9EaXNtaXNzYWJsZUxheWVyLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjb21wb3NlRXZlbnRIYW5kbGVycyB9IGZyb20gXCJAcmFkaXgtdWkvcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUsIGRpc3BhdGNoRGlzY3JldGVDdXN0b21FdmVudCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWZcIjtcbmltcG9ydCB7IHVzZUVzY2FwZUtleWRvd24gfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1lc2NhcGUta2V5ZG93blwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgRElTTUlTU0FCTEVfTEFZRVJfTkFNRSA9IFwiRGlzbWlzc2FibGVMYXllclwiO1xudmFyIENPTlRFWFRfVVBEQVRFID0gXCJkaXNtaXNzYWJsZUxheWVyLnVwZGF0ZVwiO1xudmFyIFBPSU5URVJfRE9XTl9PVVRTSURFID0gXCJkaXNtaXNzYWJsZUxheWVyLnBvaW50ZXJEb3duT3V0c2lkZVwiO1xudmFyIEZPQ1VTX09VVFNJREUgPSBcImRpc21pc3NhYmxlTGF5ZXIuZm9jdXNPdXRzaWRlXCI7XG52YXIgb3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cztcbnZhciBEaXNtaXNzYWJsZUxheWVyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBsYXllcnM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksXG4gIGxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLFxuICBicmFuY2hlczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKVxufSk7XG52YXIgRGlzbWlzc2FibGVMYXllciA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzID0gZmFsc2UsXG4gICAgICBvbkVzY2FwZUtleURvd24sXG4gICAgICBvblBvaW50ZXJEb3duT3V0c2lkZSxcbiAgICAgIG9uRm9jdXNPdXRzaWRlLFxuICAgICAgb25JbnRlcmFjdE91dHNpZGUsXG4gICAgICBvbkRpc21pc3MsXG4gICAgICAuLi5sYXllclByb3BzXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KERpc21pc3NhYmxlTGF5ZXJDb250ZXh0KTtcbiAgICBjb25zdCBbbm9kZSwgc2V0Tm9kZV0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBvd25lckRvY3VtZW50ID0gbm9kZT8ub3duZXJEb2N1bWVudCA/PyBnbG9iYWxUaGlzPy5kb2N1bWVudDtcbiAgICBjb25zdCBbLCBmb3JjZV0gPSBSZWFjdC51c2VTdGF0ZSh7fSk7XG4gICAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgKG5vZGUyKSA9PiBzZXROb2RlKG5vZGUyKSk7XG4gICAgY29uc3QgbGF5ZXJzID0gQXJyYXkuZnJvbShjb250ZXh0LmxheWVycyk7XG4gICAgY29uc3QgW2hpZ2hlc3RMYXllcldpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkXSA9IFsuLi5jb250ZXh0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkXS5zbGljZSgtMSk7XG4gICAgY29uc3QgaGlnaGVzdExheWVyV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRJbmRleCA9IGxheWVycy5pbmRleE9mKGhpZ2hlc3RMYXllcldpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkKTtcbiAgICBjb25zdCBpbmRleCA9IG5vZGUgPyBsYXllcnMuaW5kZXhPZihub2RlKSA6IC0xO1xuICAgIGNvbnN0IGlzQm9keVBvaW50ZXJFdmVudHNEaXNhYmxlZCA9IGNvbnRleHQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZSA+IDA7XG4gICAgY29uc3QgaXNQb2ludGVyRXZlbnRzRW5hYmxlZCA9IGluZGV4ID49IGhpZ2hlc3RMYXllcldpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkSW5kZXg7XG4gICAgY29uc3QgcG9pbnRlckRvd25PdXRzaWRlID0gdXNlUG9pbnRlckRvd25PdXRzaWRlKChldmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgY29uc3QgaXNQb2ludGVyRG93bk9uQnJhbmNoID0gWy4uLmNvbnRleHQuYnJhbmNoZXNdLnNvbWUoKGJyYW5jaCkgPT4gYnJhbmNoLmNvbnRhaW5zKHRhcmdldCkpO1xuICAgICAgaWYgKCFpc1BvaW50ZXJFdmVudHNFbmFibGVkIHx8IGlzUG9pbnRlckRvd25PbkJyYW5jaCkgcmV0dXJuO1xuICAgICAgb25Qb2ludGVyRG93bk91dHNpZGU/LihldmVudCk7XG4gICAgICBvbkludGVyYWN0T3V0c2lkZT8uKGV2ZW50KTtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgb25EaXNtaXNzPy4oKTtcbiAgICB9LCBvd25lckRvY3VtZW50KTtcbiAgICBjb25zdCBmb2N1c091dHNpZGUgPSB1c2VGb2N1c091dHNpZGUoKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBjb25zdCBpc0ZvY3VzSW5CcmFuY2ggPSBbLi4uY29udGV4dC5icmFuY2hlc10uc29tZSgoYnJhbmNoKSA9PiBicmFuY2guY29udGFpbnModGFyZ2V0KSk7XG4gICAgICBpZiAoaXNGb2N1c0luQnJhbmNoKSByZXR1cm47XG4gICAgICBvbkZvY3VzT3V0c2lkZT8uKGV2ZW50KTtcbiAgICAgIG9uSW50ZXJhY3RPdXRzaWRlPy4oZXZlbnQpO1xuICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSBvbkRpc21pc3M/LigpO1xuICAgIH0sIG93bmVyRG9jdW1lbnQpO1xuICAgIHVzZUVzY2FwZUtleWRvd24oKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBpc0hpZ2hlc3RMYXllciA9IGluZGV4ID09PSBjb250ZXh0LmxheWVycy5zaXplIC0gMTtcbiAgICAgIGlmICghaXNIaWdoZXN0TGF5ZXIpIHJldHVybjtcbiAgICAgIG9uRXNjYXBlS2V5RG93bj8uKGV2ZW50KTtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiBvbkRpc21pc3MpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb25EaXNtaXNzKCk7XG4gICAgICB9XG4gICAgfSwgb3duZXJEb2N1bWVudCk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghbm9kZSkgcmV0dXJuO1xuICAgICAgaWYgKGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cykge1xuICAgICAgICBpZiAoY29udGV4dC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplID09PSAwKSB7XG4gICAgICAgICAgb3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cyA9IG93bmVyRG9jdW1lbnQuYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzO1xuICAgICAgICAgIG93bmVyRG9jdW1lbnQuYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5hZGQobm9kZSk7XG4gICAgICB9XG4gICAgICBjb250ZXh0LmxheWVycy5hZGQobm9kZSk7XG4gICAgICBkaXNwYXRjaFVwZGF0ZSgpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cyAmJiBjb250ZXh0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemUgPT09IDEpIHtcbiAgICAgICAgICBvd25lckRvY3VtZW50LmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9IG9yaWdpbmFsQm9keVBvaW50ZXJFdmVudHM7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgW25vZGUsIG93bmVyRG9jdW1lbnQsIGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50cywgY29udGV4dF0pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybjtcbiAgICAgICAgY29udGV4dC5sYXllcnMuZGVsZXRlKG5vZGUpO1xuICAgICAgICBjb250ZXh0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLmRlbGV0ZShub2RlKTtcbiAgICAgICAgZGlzcGF0Y2hVcGRhdGUoKTtcbiAgICAgIH07XG4gICAgfSwgW25vZGUsIGNvbnRleHRdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlVXBkYXRlID0gKCkgPT4gZm9yY2Uoe30pO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDT05URVhUX1VQREFURSwgaGFuZGxlVXBkYXRlKTtcbiAgICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKENPTlRFWFRfVVBEQVRFLCBoYW5kbGVVcGRhdGUpO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIFByaW1pdGl2ZS5kaXYsXG4gICAgICB7XG4gICAgICAgIC4uLmxheWVyUHJvcHMsXG4gICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHBvaW50ZXJFdmVudHM6IGlzQm9keVBvaW50ZXJFdmVudHNEaXNhYmxlZCA/IGlzUG9pbnRlckV2ZW50c0VuYWJsZWQgPyBcImF1dG9cIiA6IFwibm9uZVwiIDogdm9pZCAwLFxuICAgICAgICAgIC4uLnByb3BzLnN0eWxlXG4gICAgICAgIH0sXG4gICAgICAgIG9uRm9jdXNDYXB0dXJlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkZvY3VzQ2FwdHVyZSwgZm9jdXNPdXRzaWRlLm9uRm9jdXNDYXB0dXJlKSxcbiAgICAgICAgb25CbHVyQ2FwdHVyZTogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25CbHVyQ2FwdHVyZSwgZm9jdXNPdXRzaWRlLm9uQmx1ckNhcHR1cmUpLFxuICAgICAgICBvblBvaW50ZXJEb3duQ2FwdHVyZTogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgcHJvcHMub25Qb2ludGVyRG93bkNhcHR1cmUsXG4gICAgICAgICAgcG9pbnRlckRvd25PdXRzaWRlLm9uUG9pbnRlckRvd25DYXB0dXJlXG4gICAgICAgIClcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xuRGlzbWlzc2FibGVMYXllci5kaXNwbGF5TmFtZSA9IERJU01JU1NBQkxFX0xBWUVSX05BTUU7XG52YXIgQlJBTkNIX05BTUUgPSBcIkRpc21pc3NhYmxlTGF5ZXJCcmFuY2hcIjtcbnZhciBEaXNtaXNzYWJsZUxheWVyQnJhbmNoID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChEaXNtaXNzYWJsZUxheWVyQ29udGV4dCk7XG4gIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgcmVmKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBub2RlID0gcmVmLmN1cnJlbnQ7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIGNvbnRleHQuYnJhbmNoZXMuYWRkKG5vZGUpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29udGV4dC5icmFuY2hlcy5kZWxldGUobm9kZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2NvbnRleHQuYnJhbmNoZXNdKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUHJpbWl0aXZlLmRpdiwgeyAuLi5wcm9wcywgcmVmOiBjb21wb3NlZFJlZnMgfSk7XG59KTtcbkRpc21pc3NhYmxlTGF5ZXJCcmFuY2guZGlzcGxheU5hbWUgPSBCUkFOQ0hfTkFNRTtcbmZ1bmN0aW9uIHVzZVBvaW50ZXJEb3duT3V0c2lkZShvblBvaW50ZXJEb3duT3V0c2lkZSwgb3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXM/LmRvY3VtZW50KSB7XG4gIGNvbnN0IGhhbmRsZVBvaW50ZXJEb3duT3V0c2lkZSA9IHVzZUNhbGxiYWNrUmVmKG9uUG9pbnRlckRvd25PdXRzaWRlKTtcbiAgY29uc3QgaXNQb2ludGVySW5zaWRlUmVhY3RUcmVlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgaGFuZGxlQ2xpY2tSZWYgPSBSZWFjdC51c2VSZWYoKCkgPT4ge1xuICB9KTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVQb2ludGVyRG93biA9IChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCAmJiAhaXNQb2ludGVySW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgbGV0IGhhbmRsZUFuZERpc3BhdGNoUG9pbnRlckRvd25PdXRzaWRlRXZlbnQyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaGFuZGxlQW5kRGlzcGF0Y2hDdXN0b21FdmVudChcbiAgICAgICAgICAgIFBPSU5URVJfRE9XTl9PVVRTSURFLFxuICAgICAgICAgICAgaGFuZGxlUG9pbnRlckRvd25PdXRzaWRlLFxuICAgICAgICAgICAgZXZlbnREZXRhaWwsXG4gICAgICAgICAgICB7IGRpc2NyZXRlOiB0cnVlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaGFuZGxlQW5kRGlzcGF0Y2hQb2ludGVyRG93bk91dHNpZGVFdmVudCA9IGhhbmRsZUFuZERpc3BhdGNoUG9pbnRlckRvd25PdXRzaWRlRXZlbnQyO1xuICAgICAgICBjb25zdCBldmVudERldGFpbCA9IHsgb3JpZ2luYWxFdmVudDogZXZlbnQgfTtcbiAgICAgICAgaWYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSBcInRvdWNoXCIpIHtcbiAgICAgICAgICBvd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGlja1JlZi5jdXJyZW50KTtcbiAgICAgICAgICBoYW5kbGVDbGlja1JlZi5jdXJyZW50ID0gaGFuZGxlQW5kRGlzcGF0Y2hQb2ludGVyRG93bk91dHNpZGVFdmVudDI7XG4gICAgICAgICAgb3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2tSZWYuY3VycmVudCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhhbmRsZUFuZERpc3BhdGNoUG9pbnRlckRvd25PdXRzaWRlRXZlbnQyKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrUmVmLmN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgaXNQb2ludGVySW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICAgIGNvbnN0IHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBvd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBoYW5kbGVQb2ludGVyRG93bik7XG4gICAgfSwgMCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICBvd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBoYW5kbGVQb2ludGVyRG93bik7XG4gICAgICBvd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGlja1JlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbb3duZXJEb2N1bWVudCwgaGFuZGxlUG9pbnRlckRvd25PdXRzaWRlXSk7XG4gIHJldHVybiB7XG4gICAgLy8gZW5zdXJlcyB3ZSBjaGVjayBSZWFjdCBjb21wb25lbnQgdHJlZSAobm90IGp1c3QgRE9NIHRyZWUpXG4gICAgb25Qb2ludGVyRG93bkNhcHR1cmU6ICgpID0+IGlzUG9pbnRlckluc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50ID0gdHJ1ZVxuICB9O1xufVxuZnVuY3Rpb24gdXNlRm9jdXNPdXRzaWRlKG9uRm9jdXNPdXRzaWRlLCBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcz8uZG9jdW1lbnQpIHtcbiAgY29uc3QgaGFuZGxlRm9jdXNPdXRzaWRlID0gdXNlQ2FsbGJhY2tSZWYob25Gb2N1c091dHNpZGUpO1xuICBjb25zdCBpc0ZvY3VzSW5zaWRlUmVhY3RUcmVlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVGb2N1cyA9IChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCAmJiAhaXNGb2N1c0luc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50RGV0YWlsID0geyBvcmlnaW5hbEV2ZW50OiBldmVudCB9O1xuICAgICAgICBoYW5kbGVBbmREaXNwYXRjaEN1c3RvbUV2ZW50KEZPQ1VTX09VVFNJREUsIGhhbmRsZUZvY3VzT3V0c2lkZSwgZXZlbnREZXRhaWwsIHtcbiAgICAgICAgICBkaXNjcmV0ZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBvd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIGhhbmRsZUZvY3VzKTtcbiAgICByZXR1cm4gKCkgPT4gb3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCBoYW5kbGVGb2N1cyk7XG4gIH0sIFtvd25lckRvY3VtZW50LCBoYW5kbGVGb2N1c091dHNpZGVdKTtcbiAgcmV0dXJuIHtcbiAgICBvbkZvY3VzQ2FwdHVyZTogKCkgPT4gaXNGb2N1c0luc2lkZVJlYWN0VHJlZVJlZi5jdXJyZW50ID0gdHJ1ZSxcbiAgICBvbkJsdXJDYXB0dXJlOiAoKSA9PiBpc0ZvY3VzSW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSBmYWxzZVxuICB9O1xufVxuZnVuY3Rpb24gZGlzcGF0Y2hVcGRhdGUoKSB7XG4gIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KENPTlRFWFRfVVBEQVRFKTtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5mdW5jdGlvbiBoYW5kbGVBbmREaXNwYXRjaEN1c3RvbUV2ZW50KG5hbWUsIGhhbmRsZXIsIGRldGFpbCwgeyBkaXNjcmV0ZSB9KSB7XG4gIGNvbnN0IHRhcmdldCA9IGRldGFpbC5vcmlnaW5hbEV2ZW50LnRhcmdldDtcbiAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQobmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgZGV0YWlsIH0pO1xuICBpZiAoaGFuZGxlcikgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlciwgeyBvbmNlOiB0cnVlIH0pO1xuICBpZiAoZGlzY3JldGUpIHtcbiAgICBkaXNwYXRjaERpc2NyZXRlQ3VzdG9tRXZlbnQodGFyZ2V0LCBldmVudCk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG59XG52YXIgUm9vdCA9IERpc21pc3NhYmxlTGF5ZXI7XG52YXIgQnJhbmNoID0gRGlzbWlzc2FibGVMYXllckJyYW5jaDtcbmV4cG9ydCB7XG4gIEJyYW5jaCxcbiAgRGlzbWlzc2FibGVMYXllcixcbiAgRGlzbWlzc2FibGVMYXllckJyYW5jaCxcbiAgUm9vdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9kcm9wZG93bi1tZW51L3NyYy9Ecm9wZG93bk1lbnUudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNvbXBvc2VFdmVudEhhbmRsZXJzIH0gZnJvbSBcIkByYWRpeC11aS9wcmltaXRpdmVcIjtcbmltcG9ydCB7IGNvbXBvc2VSZWZzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHRTY29wZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29udGV4dFwiO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxhYmxlU3RhdGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jb250cm9sbGFibGUtc3RhdGVcIjtcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgKiBhcyBNZW51UHJpbWl0aXZlIGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtbWVudVwiO1xuaW1wb3J0IHsgY3JlYXRlTWVudVNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1tZW51XCI7XG5pbXBvcnQgeyB1c2VJZCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtaWRcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIERST1BET1dOX01FTlVfTkFNRSA9IFwiRHJvcGRvd25NZW51XCI7XG52YXIgW2NyZWF0ZURyb3Bkb3duTWVudUNvbnRleHQsIGNyZWF0ZURyb3Bkb3duTWVudVNjb3BlXSA9IGNyZWF0ZUNvbnRleHRTY29wZShcbiAgRFJPUERPV05fTUVOVV9OQU1FLFxuICBbY3JlYXRlTWVudVNjb3BlXVxuKTtcbnZhciB1c2VNZW51U2NvcGUgPSBjcmVhdGVNZW51U2NvcGUoKTtcbnZhciBbRHJvcGRvd25NZW51UHJvdmlkZXIsIHVzZURyb3Bkb3duTWVudUNvbnRleHRdID0gY3JlYXRlRHJvcGRvd25NZW51Q29udGV4dChEUk9QRE9XTl9NRU5VX05BTUUpO1xudmFyIERyb3Bkb3duTWVudSA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgX19zY29wZURyb3Bkb3duTWVudSxcbiAgICBjaGlsZHJlbixcbiAgICBkaXIsXG4gICAgb3Blbjogb3BlblByb3AsXG4gICAgZGVmYXVsdE9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIG1vZGFsID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgY29uc3QgdHJpZ2dlclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgW29wZW4gPSBmYWxzZSwgc2V0T3Blbl0gPSB1c2VDb250cm9sbGFibGVTdGF0ZSh7XG4gICAgcHJvcDogb3BlblByb3AsXG4gICAgZGVmYXVsdFByb3A6IGRlZmF1bHRPcGVuLFxuICAgIG9uQ2hhbmdlOiBvbk9wZW5DaGFuZ2VcbiAgfSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgIERyb3Bkb3duTWVudVByb3ZpZGVyLFxuICAgIHtcbiAgICAgIHNjb3BlOiBfX3Njb3BlRHJvcGRvd25NZW51LFxuICAgICAgdHJpZ2dlcklkOiB1c2VJZCgpLFxuICAgICAgdHJpZ2dlclJlZixcbiAgICAgIGNvbnRlbnRJZDogdXNlSWQoKSxcbiAgICAgIG9wZW4sXG4gICAgICBvbk9wZW5DaGFuZ2U6IHNldE9wZW4sXG4gICAgICBvbk9wZW5Ub2dnbGU6IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHNldE9wZW4oKHByZXZPcGVuKSA9PiAhcHJldk9wZW4pLCBbc2V0T3Blbl0pLFxuICAgICAgbW9kYWwsXG4gICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLlJvb3QsIHsgLi4ubWVudVNjb3BlLCBvcGVuLCBvbk9wZW5DaGFuZ2U6IHNldE9wZW4sIGRpciwgbW9kYWwsIGNoaWxkcmVuIH0pXG4gICAgfVxuICApO1xufTtcbkRyb3Bkb3duTWVudS5kaXNwbGF5TmFtZSA9IERST1BET1dOX01FTlVfTkFNRTtcbnZhciBUUklHR0VSX05BTUUgPSBcIkRyb3Bkb3duTWVudVRyaWdnZXJcIjtcbnZhciBEcm9wZG93bk1lbnVUcmlnZ2VyID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIGRpc2FibGVkID0gZmFsc2UsIC4uLnRyaWdnZXJQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZURyb3Bkb3duTWVudUNvbnRleHQoVFJJR0dFUl9OQU1FLCBfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5BbmNob3IsIHsgYXNDaGlsZDogdHJ1ZSwgLi4ubWVudVNjb3BlLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIFByaW1pdGl2ZS5idXR0b24sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIGlkOiBjb250ZXh0LnRyaWdnZXJJZCxcbiAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibWVudVwiLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogY29udGV4dC5vcGVuLFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjogY29udGV4dC5vcGVuID8gY29udGV4dC5jb250ZW50SWQgOiB2b2lkIDAsXG4gICAgICAgIFwiZGF0YS1zdGF0ZVwiOiBjb250ZXh0Lm9wZW4gPyBcIm9wZW5cIiA6IFwiY2xvc2VkXCIsXG4gICAgICAgIFwiZGF0YS1kaXNhYmxlZFwiOiBkaXNhYmxlZCA/IFwiXCIgOiB2b2lkIDAsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICAuLi50cmlnZ2VyUHJvcHMsXG4gICAgICAgIHJlZjogY29tcG9zZVJlZnMoZm9yd2FyZGVkUmVmLCBjb250ZXh0LnRyaWdnZXJSZWYpLFxuICAgICAgICBvblBvaW50ZXJEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vblBvaW50ZXJEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoIWRpc2FibGVkICYmIGV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBldmVudC5jdHJsS2V5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29udGV4dC5vbk9wZW5Ub2dnbGUoKTtcbiAgICAgICAgICAgIGlmICghY29udGV4dC5vcGVuKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIG9uS2V5RG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25LZXlEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICAgICAgICBpZiAoW1wiRW50ZXJcIiwgXCIgXCJdLmluY2x1ZGVzKGV2ZW50LmtleSkpIGNvbnRleHQub25PcGVuVG9nZ2xlKCk7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd0Rvd25cIikgY29udGV4dC5vbk9wZW5DaGFuZ2UodHJ1ZSk7XG4gICAgICAgICAgaWYgKFtcIkVudGVyXCIsIFwiIFwiLCBcIkFycm93RG93blwiXS5pbmNsdWRlcyhldmVudC5rZXkpKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICkgfSk7XG4gIH1cbik7XG5Ecm9wZG93bk1lbnVUcmlnZ2VyLmRpc3BsYXlOYW1lID0gVFJJR0dFUl9OQU1FO1xudmFyIFBPUlRBTF9OQU1FID0gXCJEcm9wZG93bk1lbnVQb3J0YWxcIjtcbnZhciBEcm9wZG93bk1lbnVQb3J0YWwgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5wb3J0YWxQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5Qb3J0YWwsIHsgLi4ubWVudVNjb3BlLCAuLi5wb3J0YWxQcm9wcyB9KTtcbn07XG5Ecm9wZG93bk1lbnVQb3J0YWwuZGlzcGxheU5hbWUgPSBQT1JUQUxfTkFNRTtcbnZhciBDT05URU5UX05BTUUgPSBcIkRyb3Bkb3duTWVudUNvbnRlbnRcIjtcbnZhciBEcm9wZG93bk1lbnVDb250ZW50ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLmNvbnRlbnRQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZURyb3Bkb3duTWVudUNvbnRleHQoQ09OVEVOVF9OQU1FLCBfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gICAgY29uc3QgaGFzSW50ZXJhY3RlZE91dHNpZGVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudVByaW1pdGl2ZS5Db250ZW50LFxuICAgICAge1xuICAgICAgICBpZDogY29udGV4dC5jb250ZW50SWQsXG4gICAgICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IGNvbnRleHQudHJpZ2dlcklkLFxuICAgICAgICAuLi5tZW51U2NvcGUsXG4gICAgICAgIC4uLmNvbnRlbnRQcm9wcyxcbiAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICAgIG9uQ2xvc2VBdXRvRm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uQ2xvc2VBdXRvRm9jdXMsIChldmVudCkgPT4ge1xuICAgICAgICAgIGlmICghaGFzSW50ZXJhY3RlZE91dHNpZGVSZWYuY3VycmVudCkgY29udGV4dC50cmlnZ2VyUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgICAgaGFzSW50ZXJhY3RlZE91dHNpZGVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pLFxuICAgICAgICBvbkludGVyYWN0T3V0c2lkZTogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25JbnRlcmFjdE91dHNpZGUsIChldmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRXZlbnQgPSBldmVudC5kZXRhaWwub3JpZ2luYWxFdmVudDtcbiAgICAgICAgICBjb25zdCBjdHJsTGVmdENsaWNrID0gb3JpZ2luYWxFdmVudC5idXR0b24gPT09IDAgJiYgb3JpZ2luYWxFdmVudC5jdHJsS2V5ID09PSB0cnVlO1xuICAgICAgICAgIGNvbnN0IGlzUmlnaHRDbGljayA9IG9yaWdpbmFsRXZlbnQuYnV0dG9uID09PSAyIHx8IGN0cmxMZWZ0Q2xpY2s7XG4gICAgICAgICAgaWYgKCFjb250ZXh0Lm1vZGFsIHx8IGlzUmlnaHRDbGljaykgaGFzSW50ZXJhY3RlZE91dHNpZGVSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgIH0pLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIC4uLnByb3BzLnN0eWxlLFxuICAgICAgICAgIC8vIHJlLW5hbWVzcGFjZSBleHBvc2VkIGNvbnRlbnQgY3VzdG9tIHByb3BlcnRpZXNcbiAgICAgICAgICAuLi57XG4gICAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW5cIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbilcIixcbiAgICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtYXZhaWxhYmxlLXdpZHRoXCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS13aWR0aClcIixcbiAgICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0KVwiLFxuICAgICAgICAgICAgXCItLXJhZGl4LWRyb3Bkb3duLW1lbnUtdHJpZ2dlci13aWR0aFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgpXCIsXG4gICAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS10cmlnZ2VyLWhlaWdodFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hbmNob3ItaGVpZ2h0KVwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcbkRyb3Bkb3duTWVudUNvbnRlbnQuZGlzcGxheU5hbWUgPSBDT05URU5UX05BTUU7XG52YXIgR1JPVVBfTkFNRSA9IFwiRHJvcGRvd25NZW51R3JvdXBcIjtcbnZhciBEcm9wZG93bk1lbnVHcm91cCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5ncm91cFByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5Hcm91cCwgeyAuLi5tZW51U2NvcGUsIC4uLmdyb3VwUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9XG4pO1xuRHJvcGRvd25NZW51R3JvdXAuZGlzcGxheU5hbWUgPSBHUk9VUF9OQU1FO1xudmFyIExBQkVMX05BTUUgPSBcIkRyb3Bkb3duTWVudUxhYmVsXCI7XG52YXIgRHJvcGRvd25NZW51TGFiZWwgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4ubGFiZWxQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuTGFiZWwsIHsgLi4ubWVudVNjb3BlLCAuLi5sYWJlbFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfVxuKTtcbkRyb3Bkb3duTWVudUxhYmVsLmRpc3BsYXlOYW1lID0gTEFCRUxfTkFNRTtcbnZhciBJVEVNX05BTUUgPSBcIkRyb3Bkb3duTWVudUl0ZW1cIjtcbnZhciBEcm9wZG93bk1lbnVJdGVtID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLml0ZW1Qcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuSXRlbSwgeyAuLi5tZW51U2NvcGUsIC4uLml0ZW1Qcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH1cbik7XG5Ecm9wZG93bk1lbnVJdGVtLmRpc3BsYXlOYW1lID0gSVRFTV9OQU1FO1xudmFyIENIRUNLQk9YX0lURU1fTkFNRSA9IFwiRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtXCI7XG52YXIgRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLmNoZWNrYm94SXRlbVByb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLkNoZWNrYm94SXRlbSwgeyAuLi5tZW51U2NvcGUsIC4uLmNoZWNrYm94SXRlbVByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbn0pO1xuRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtLmRpc3BsYXlOYW1lID0gQ0hFQ0tCT1hfSVRFTV9OQU1FO1xudmFyIFJBRElPX0dST1VQX05BTUUgPSBcIkRyb3Bkb3duTWVudVJhZGlvR3JvdXBcIjtcbnZhciBEcm9wZG93bk1lbnVSYWRpb0dyb3VwID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLnJhZGlvR3JvdXBQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5SYWRpb0dyb3VwLCB7IC4uLm1lbnVTY29wZSwgLi4ucmFkaW9Hcm91cFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbn0pO1xuRHJvcGRvd25NZW51UmFkaW9Hcm91cC5kaXNwbGF5TmFtZSA9IFJBRElPX0dST1VQX05BTUU7XG52YXIgUkFESU9fSVRFTV9OQU1FID0gXCJEcm9wZG93bk1lbnVSYWRpb0l0ZW1cIjtcbnZhciBEcm9wZG93bk1lbnVSYWRpb0l0ZW0gPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4ucmFkaW9JdGVtUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuUmFkaW9JdGVtLCB7IC4uLm1lbnVTY29wZSwgLi4ucmFkaW9JdGVtUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xufSk7XG5Ecm9wZG93bk1lbnVSYWRpb0l0ZW0uZGlzcGxheU5hbWUgPSBSQURJT19JVEVNX05BTUU7XG52YXIgSU5ESUNBVE9SX05BTUUgPSBcIkRyb3Bkb3duTWVudUl0ZW1JbmRpY2F0b3JcIjtcbnZhciBEcm9wZG93bk1lbnVJdGVtSW5kaWNhdG9yID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLml0ZW1JbmRpY2F0b3JQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5JdGVtSW5kaWNhdG9yLCB7IC4uLm1lbnVTY29wZSwgLi4uaXRlbUluZGljYXRvclByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbn0pO1xuRHJvcGRvd25NZW51SXRlbUluZGljYXRvci5kaXNwbGF5TmFtZSA9IElORElDQVRPUl9OQU1FO1xudmFyIFNFUEFSQVRPUl9OQU1FID0gXCJEcm9wZG93bk1lbnVTZXBhcmF0b3JcIjtcbnZhciBEcm9wZG93bk1lbnVTZXBhcmF0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4uc2VwYXJhdG9yUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuU2VwYXJhdG9yLCB7IC4uLm1lbnVTY29wZSwgLi4uc2VwYXJhdG9yUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xufSk7XG5Ecm9wZG93bk1lbnVTZXBhcmF0b3IuZGlzcGxheU5hbWUgPSBTRVBBUkFUT1JfTkFNRTtcbnZhciBBUlJPV19OQU1FID0gXCJEcm9wZG93bk1lbnVBcnJvd1wiO1xudmFyIERyb3Bkb3duTWVudUFycm93ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLmFycm93UHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLkFycm93LCB7IC4uLm1lbnVTY29wZSwgLi4uYXJyb3dQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH1cbik7XG5Ecm9wZG93bk1lbnVBcnJvdy5kaXNwbGF5TmFtZSA9IEFSUk9XX05BTUU7XG52YXIgRHJvcGRvd25NZW51U3ViID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgY2hpbGRyZW4sIG9wZW46IG9wZW5Qcm9wLCBvbk9wZW5DaGFuZ2UsIGRlZmF1bHRPcGVuIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICBjb25zdCBbb3BlbiA9IGZhbHNlLCBzZXRPcGVuXSA9IHVzZUNvbnRyb2xsYWJsZVN0YXRlKHtcbiAgICBwcm9wOiBvcGVuUHJvcCxcbiAgICBkZWZhdWx0UHJvcDogZGVmYXVsdE9wZW4sXG4gICAgb25DaGFuZ2U6IG9uT3BlbkNoYW5nZVxuICB9KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5TdWIsIHsgLi4ubWVudVNjb3BlLCBvcGVuLCBvbk9wZW5DaGFuZ2U6IHNldE9wZW4sIGNoaWxkcmVuIH0pO1xufTtcbnZhciBTVUJfVFJJR0dFUl9OQU1FID0gXCJEcm9wZG93bk1lbnVTdWJUcmlnZ2VyXCI7XG52YXIgRHJvcGRvd25NZW51U3ViVHJpZ2dlciA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5zdWJUcmlnZ2VyUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuU3ViVHJpZ2dlciwgeyAuLi5tZW51U2NvcGUsIC4uLnN1YlRyaWdnZXJQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG59KTtcbkRyb3Bkb3duTWVudVN1YlRyaWdnZXIuZGlzcGxheU5hbWUgPSBTVUJfVFJJR0dFUl9OQU1FO1xudmFyIFNVQl9DT05URU5UX05BTUUgPSBcIkRyb3Bkb3duTWVudVN1YkNvbnRlbnRcIjtcbnZhciBEcm9wZG93bk1lbnVTdWJDb250ZW50ID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLnN1YkNvbnRlbnRQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgTWVudVByaW1pdGl2ZS5TdWJDb250ZW50LFxuICAgIHtcbiAgICAgIC4uLm1lbnVTY29wZSxcbiAgICAgIC4uLnN1YkNvbnRlbnRQcm9wcyxcbiAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgLi4ucHJvcHMuc3R5bGUsXG4gICAgICAgIC8vIHJlLW5hbWVzcGFjZSBleHBvc2VkIGNvbnRlbnQgY3VzdG9tIHByb3BlcnRpZXNcbiAgICAgICAgLi4ue1xuICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtdHJhbnNmb3JtLW9yaWdpblwiOiBcInZhcigtLXJhZGl4LXBvcHBlci10cmFuc2Zvcm0tb3JpZ2luKVwiLFxuICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtYXZhaWxhYmxlLXdpZHRoXCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS13aWR0aClcIixcbiAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHRcIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLWhlaWdodClcIixcbiAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS10cmlnZ2VyLXdpZHRoXCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLWFuY2hvci13aWR0aClcIixcbiAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS10cmlnZ2VyLWhlaWdodFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hbmNob3ItaGVpZ2h0KVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICk7XG59KTtcbkRyb3Bkb3duTWVudVN1YkNvbnRlbnQuZGlzcGxheU5hbWUgPSBTVUJfQ09OVEVOVF9OQU1FO1xudmFyIFJvb3QyID0gRHJvcGRvd25NZW51O1xudmFyIFRyaWdnZXIgPSBEcm9wZG93bk1lbnVUcmlnZ2VyO1xudmFyIFBvcnRhbDIgPSBEcm9wZG93bk1lbnVQb3J0YWw7XG52YXIgQ29udGVudDIgPSBEcm9wZG93bk1lbnVDb250ZW50O1xudmFyIEdyb3VwMiA9IERyb3Bkb3duTWVudUdyb3VwO1xudmFyIExhYmVsMiA9IERyb3Bkb3duTWVudUxhYmVsO1xudmFyIEl0ZW0yID0gRHJvcGRvd25NZW51SXRlbTtcbnZhciBDaGVja2JveEl0ZW0yID0gRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtO1xudmFyIFJhZGlvR3JvdXAyID0gRHJvcGRvd25NZW51UmFkaW9Hcm91cDtcbnZhciBSYWRpb0l0ZW0yID0gRHJvcGRvd25NZW51UmFkaW9JdGVtO1xudmFyIEl0ZW1JbmRpY2F0b3IyID0gRHJvcGRvd25NZW51SXRlbUluZGljYXRvcjtcbnZhciBTZXBhcmF0b3IyID0gRHJvcGRvd25NZW51U2VwYXJhdG9yO1xudmFyIEFycm93MiA9IERyb3Bkb3duTWVudUFycm93O1xudmFyIFN1YjIgPSBEcm9wZG93bk1lbnVTdWI7XG52YXIgU3ViVHJpZ2dlcjIgPSBEcm9wZG93bk1lbnVTdWJUcmlnZ2VyO1xudmFyIFN1YkNvbnRlbnQyID0gRHJvcGRvd25NZW51U3ViQ29udGVudDtcbmV4cG9ydCB7XG4gIEFycm93MiBhcyBBcnJvdyxcbiAgQ2hlY2tib3hJdGVtMiBhcyBDaGVja2JveEl0ZW0sXG4gIENvbnRlbnQyIGFzIENvbnRlbnQsXG4gIERyb3Bkb3duTWVudSxcbiAgRHJvcGRvd25NZW51QXJyb3csXG4gIERyb3Bkb3duTWVudUNoZWNrYm94SXRlbSxcbiAgRHJvcGRvd25NZW51Q29udGVudCxcbiAgRHJvcGRvd25NZW51R3JvdXAsXG4gIERyb3Bkb3duTWVudUl0ZW0sXG4gIERyb3Bkb3duTWVudUl0ZW1JbmRpY2F0b3IsXG4gIERyb3Bkb3duTWVudUxhYmVsLFxuICBEcm9wZG93bk1lbnVQb3J0YWwsXG4gIERyb3Bkb3duTWVudVJhZGlvR3JvdXAsXG4gIERyb3Bkb3duTWVudVJhZGlvSXRlbSxcbiAgRHJvcGRvd25NZW51U2VwYXJhdG9yLFxuICBEcm9wZG93bk1lbnVTdWIsXG4gIERyb3Bkb3duTWVudVN1YkNvbnRlbnQsXG4gIERyb3Bkb3duTWVudVN1YlRyaWdnZXIsXG4gIERyb3Bkb3duTWVudVRyaWdnZXIsXG4gIEdyb3VwMiBhcyBHcm91cCxcbiAgSXRlbTIgYXMgSXRlbSxcbiAgSXRlbUluZGljYXRvcjIgYXMgSXRlbUluZGljYXRvcixcbiAgTGFiZWwyIGFzIExhYmVsLFxuICBQb3J0YWwyIGFzIFBvcnRhbCxcbiAgUmFkaW9Hcm91cDIgYXMgUmFkaW9Hcm91cCxcbiAgUmFkaW9JdGVtMiBhcyBSYWRpb0l0ZW0sXG4gIFJvb3QyIGFzIFJvb3QsXG4gIFNlcGFyYXRvcjIgYXMgU2VwYXJhdG9yLFxuICBTdWIyIGFzIFN1YixcbiAgU3ViQ29udGVudDIgYXMgU3ViQ29udGVudCxcbiAgU3ViVHJpZ2dlcjIgYXMgU3ViVHJpZ2dlcixcbiAgVHJpZ2dlcixcbiAgY3JlYXRlRHJvcGRvd25NZW51U2NvcGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvZm9jdXMtZ3VhcmRzL3NyYy9Gb2N1c0d1YXJkcy50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xudmFyIGNvdW50ID0gMDtcbmZ1bmN0aW9uIEZvY3VzR3VhcmRzKHByb3BzKSB7XG4gIHVzZUZvY3VzR3VhcmRzKCk7XG4gIHJldHVybiBwcm9wcy5jaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIHVzZUZvY3VzR3VhcmRzKCkge1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVkZ2VHdWFyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtcmFkaXgtZm9jdXMtZ3VhcmRdXCIpO1xuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBlZGdlR3VhcmRzWzBdID8/IGNyZWF0ZUZvY3VzR3VhcmQoKSk7XG4gICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJiZWZvcmVlbmRcIiwgZWRnZUd1YXJkc1sxXSA/PyBjcmVhdGVGb2N1c0d1YXJkKCkpO1xuICAgIGNvdW50Kys7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2RhdGEtcmFkaXgtZm9jdXMtZ3VhcmRdXCIpLmZvckVhY2goKG5vZGUpID0+IG5vZGUucmVtb3ZlKCkpO1xuICAgICAgfVxuICAgICAgY291bnQtLTtcbiAgICB9O1xuICB9LCBbXSk7XG59XG5mdW5jdGlvbiBjcmVhdGVGb2N1c0d1YXJkKCkge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1yYWRpeC1mb2N1cy1ndWFyZFwiLCBcIlwiKTtcbiAgZWxlbWVudC50YWJJbmRleCA9IDA7XG4gIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IFwib3V0bGluZTogbm9uZTsgb3BhY2l0eTogMDsgcG9zaXRpb246IGZpeGVkOyBwb2ludGVyLWV2ZW50czogbm9uZVwiO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbnZhciBSb290ID0gRm9jdXNHdWFyZHM7XG5leHBvcnQge1xuICBGb2N1c0d1YXJkcyxcbiAgUm9vdCxcbiAgdXNlRm9jdXNHdWFyZHNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvZm9jdXMtc2NvcGUvc3JjL0ZvY3VzU2NvcGUudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNvbXBvc2VkUmVmcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZVwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWZcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIEFVVE9GT0NVU19PTl9NT1VOVCA9IFwiZm9jdXNTY29wZS5hdXRvRm9jdXNPbk1vdW50XCI7XG52YXIgQVVUT0ZPQ1VTX09OX1VOTU9VTlQgPSBcImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Vbm1vdW50XCI7XG52YXIgRVZFTlRfT1BUSU9OUyA9IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IHRydWUgfTtcbnZhciBGT0NVU19TQ09QRV9OQU1FID0gXCJGb2N1c1Njb3BlXCI7XG52YXIgRm9jdXNTY29wZSA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIGxvb3AgPSBmYWxzZSxcbiAgICB0cmFwcGVkID0gZmFsc2UsXG4gICAgb25Nb3VudEF1dG9Gb2N1czogb25Nb3VudEF1dG9Gb2N1c1Byb3AsXG4gICAgb25Vbm1vdW50QXV0b0ZvY3VzOiBvblVubW91bnRBdXRvRm9jdXNQcm9wLFxuICAgIC4uLnNjb3BlUHJvcHNcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbY29udGFpbmVyLCBzZXRDb250YWluZXJdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IG9uTW91bnRBdXRvRm9jdXMgPSB1c2VDYWxsYmFja1JlZihvbk1vdW50QXV0b0ZvY3VzUHJvcCk7XG4gIGNvbnN0IG9uVW5tb3VudEF1dG9Gb2N1cyA9IHVzZUNhbGxiYWNrUmVmKG9uVW5tb3VudEF1dG9Gb2N1c1Byb3ApO1xuICBjb25zdCBsYXN0Rm9jdXNlZEVsZW1lbnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIChub2RlKSA9PiBzZXRDb250YWluZXIobm9kZSkpO1xuICBjb25zdCBmb2N1c1Njb3BlID0gUmVhY3QudXNlUmVmKHtcbiAgICBwYXVzZWQ6IGZhbHNlLFxuICAgIHBhdXNlKCkge1xuICAgICAgdGhpcy5wYXVzZWQgPSB0cnVlO1xuICAgIH0sXG4gICAgcmVzdW1lKCkge1xuICAgICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pLmN1cnJlbnQ7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRyYXBwZWQpIHtcbiAgICAgIGxldCBoYW5kbGVGb2N1c0luMiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGlmIChmb2N1c1Njb3BlLnBhdXNlZCB8fCAhY29udGFpbmVyKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgaWYgKGNvbnRhaW5lci5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgbGFzdEZvY3VzZWRFbGVtZW50UmVmLmN1cnJlbnQgPSB0YXJnZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9jdXMobGFzdEZvY3VzZWRFbGVtZW50UmVmLmN1cnJlbnQsIHsgc2VsZWN0OiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBoYW5kbGVGb2N1c091dDIgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBpZiAoZm9jdXNTY29wZS5wYXVzZWQgfHwgIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgICAgICAgaWYgKHJlbGF0ZWRUYXJnZXQgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKCFjb250YWluZXIuY29udGFpbnMocmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgICBmb2N1cyhsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCwgeyBzZWxlY3Q6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGhhbmRsZU11dGF0aW9uczIgPSBmdW5jdGlvbihtdXRhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZm9jdXNlZEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBpZiAoZm9jdXNlZEVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnMpIHtcbiAgICAgICAgICBpZiAobXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApIGZvY3VzKGNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgaGFuZGxlRm9jdXNJbiA9IGhhbmRsZUZvY3VzSW4yLCBoYW5kbGVGb2N1c091dCA9IGhhbmRsZUZvY3VzT3V0MiwgaGFuZGxlTXV0YXRpb25zID0gaGFuZGxlTXV0YXRpb25zMjtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIGhhbmRsZUZvY3VzSW4yKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBoYW5kbGVGb2N1c091dDIpO1xuICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGhhbmRsZU11dGF0aW9uczIpO1xuICAgICAgaWYgKGNvbnRhaW5lcikgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lciwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCBoYW5kbGVGb2N1c0luMik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBoYW5kbGVGb2N1c091dDIpO1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbdHJhcHBlZCwgY29udGFpbmVyLCBmb2N1c1Njb3BlLnBhdXNlZF0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGZvY3VzU2NvcGVzU3RhY2suYWRkKGZvY3VzU2NvcGUpO1xuICAgICAgY29uc3QgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGhhc0ZvY3VzZWRDYW5kaWRhdGUgPSBjb250YWluZXIuY29udGFpbnMocHJldmlvdXNseUZvY3VzZWRFbGVtZW50KTtcbiAgICAgIGlmICghaGFzRm9jdXNlZENhbmRpZGF0ZSkge1xuICAgICAgICBjb25zdCBtb3VudEV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEFVVE9GT0NVU19PTl9NT1VOVCwgRVZFTlRfT1BUSU9OUyk7XG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKEFVVE9GT0NVU19PTl9NT1VOVCwgb25Nb3VudEF1dG9Gb2N1cyk7XG4gICAgICAgIGNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KG1vdW50RXZlbnQpO1xuICAgICAgICBpZiAoIW1vdW50RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgIGZvY3VzRmlyc3QocmVtb3ZlTGlua3MoZ2V0VGFiYmFibGVDYW5kaWRhdGVzKGNvbnRhaW5lcikpLCB7IHNlbGVjdDogdHJ1ZSB9KTtcbiAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gcHJldmlvdXNseUZvY3VzZWRFbGVtZW50KSB7XG4gICAgICAgICAgICBmb2N1cyhjb250YWluZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoQVVUT0ZPQ1VTX09OX01PVU5ULCBvbk1vdW50QXV0b0ZvY3VzKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdW5tb3VudEV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEFVVE9GT0NVU19PTl9VTk1PVU5ULCBFVkVOVF9PUFRJT05TKTtcbiAgICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihBVVRPRk9DVVNfT05fVU5NT1VOVCwgb25Vbm1vdW50QXV0b0ZvY3VzKTtcbiAgICAgICAgICBjb250YWluZXIuZGlzcGF0Y2hFdmVudCh1bm1vdW50RXZlbnQpO1xuICAgICAgICAgIGlmICghdW5tb3VudEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIGZvY3VzKHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA/PyBkb2N1bWVudC5ib2R5LCB7IHNlbGVjdDogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoQVVUT0ZPQ1VTX09OX1VOTU9VTlQsIG9uVW5tb3VudEF1dG9Gb2N1cyk7XG4gICAgICAgICAgZm9jdXNTY29wZXNTdGFjay5yZW1vdmUoZm9jdXNTY29wZSk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtjb250YWluZXIsIG9uTW91bnRBdXRvRm9jdXMsIG9uVW5tb3VudEF1dG9Gb2N1cywgZm9jdXNTY29wZV0pO1xuICBjb25zdCBoYW5kbGVLZXlEb3duID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWxvb3AgJiYgIXRyYXBwZWQpIHJldHVybjtcbiAgICAgIGlmIChmb2N1c1Njb3BlLnBhdXNlZCkgcmV0dXJuO1xuICAgICAgY29uc3QgaXNUYWJLZXkgPSBldmVudC5rZXkgPT09IFwiVGFiXCIgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleTtcbiAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGlmIChpc1RhYktleSAmJiBmb2N1c2VkRWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIyID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBsYXN0XSA9IGdldFRhYmJhYmxlRWRnZXMoY29udGFpbmVyMik7XG4gICAgICAgIGNvbnN0IGhhc1RhYmJhYmxlRWxlbWVudHNJbnNpZGUgPSBmaXJzdCAmJiBsYXN0O1xuICAgICAgICBpZiAoIWhhc1RhYmJhYmxlRWxlbWVudHNJbnNpZGUpIHtcbiAgICAgICAgICBpZiAoZm9jdXNlZEVsZW1lbnQgPT09IGNvbnRhaW5lcjIpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiBmb2N1c2VkRWxlbWVudCA9PT0gbGFzdCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmIChsb29wKSBmb2N1cyhmaXJzdCwgeyBzZWxlY3Q6IHRydWUgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChldmVudC5zaGlmdEtleSAmJiBmb2N1c2VkRWxlbWVudCA9PT0gZmlyc3QpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAobG9vcCkgZm9jdXMobGFzdCwgeyBzZWxlY3Q6IHRydWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbbG9vcCwgdHJhcHBlZCwgZm9jdXNTY29wZS5wYXVzZWRdXG4gICk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFByaW1pdGl2ZS5kaXYsIHsgdGFiSW5kZXg6IC0xLCAuLi5zY29wZVByb3BzLCByZWY6IGNvbXBvc2VkUmVmcywgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duIH0pO1xufSk7XG5Gb2N1c1Njb3BlLmRpc3BsYXlOYW1lID0gRk9DVVNfU0NPUEVfTkFNRTtcbmZ1bmN0aW9uIGZvY3VzRmlyc3QoY2FuZGlkYXRlcywgeyBzZWxlY3QgPSBmYWxzZSB9ID0ge30pIHtcbiAgY29uc3QgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGZvY3VzKGNhbmRpZGF0ZSwgeyBzZWxlY3QgfSk7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCkgcmV0dXJuO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUYWJiYWJsZUVkZ2VzKGNvbnRhaW5lcikge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0VGFiYmFibGVDYW5kaWRhdGVzKGNvbnRhaW5lcik7XG4gIGNvbnN0IGZpcnN0ID0gZmluZFZpc2libGUoY2FuZGlkYXRlcywgY29udGFpbmVyKTtcbiAgY29uc3QgbGFzdCA9IGZpbmRWaXNpYmxlKGNhbmRpZGF0ZXMucmV2ZXJzZSgpLCBjb250YWluZXIpO1xuICByZXR1cm4gW2ZpcnN0LCBsYXN0XTtcbn1cbmZ1bmN0aW9uIGdldFRhYmJhYmxlQ2FuZGlkYXRlcyhjb250YWluZXIpIHtcbiAgY29uc3Qgbm9kZXMgPSBbXTtcbiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihjb250YWluZXIsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCB7XG4gICAgYWNjZXB0Tm9kZTogKG5vZGUpID0+IHtcbiAgICAgIGNvbnN0IGlzSGlkZGVuSW5wdXQgPSBub2RlLnRhZ05hbWUgPT09IFwiSU5QVVRcIiAmJiBub2RlLnR5cGUgPT09IFwiaGlkZGVuXCI7XG4gICAgICBpZiAobm9kZS5kaXNhYmxlZCB8fCBub2RlLmhpZGRlbiB8fCBpc0hpZGRlbklucHV0KSByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfU0tJUDtcbiAgICAgIHJldHVybiBub2RlLnRhYkluZGV4ID49IDAgPyBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQgOiBOb2RlRmlsdGVyLkZJTFRFUl9TS0lQO1xuICAgIH1cbiAgfSk7XG4gIHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSkgbm9kZXMucHVzaCh3YWxrZXIuY3VycmVudE5vZGUpO1xuICByZXR1cm4gbm9kZXM7XG59XG5mdW5jdGlvbiBmaW5kVmlzaWJsZShlbGVtZW50cywgY29udGFpbmVyKSB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGlmICghaXNIaWRkZW4oZWxlbWVudCwgeyB1cFRvOiBjb250YWluZXIgfSkpIHJldHVybiBlbGVtZW50O1xuICB9XG59XG5mdW5jdGlvbiBpc0hpZGRlbihub2RlLCB7IHVwVG8gfSkge1xuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS52aXNpYmlsaXR5ID09PSBcImhpZGRlblwiKSByZXR1cm4gdHJ1ZTtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAodXBUbyAhPT0gdm9pZCAwICYmIG5vZGUgPT09IHVwVG8pIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5kaXNwbGF5ID09PSBcIm5vbmVcIikgcmV0dXJuIHRydWU7XG4gICAgbm9kZSA9IG5vZGUucGFyZW50RWxlbWVudDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1NlbGVjdGFibGVJbnB1dChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBcInNlbGVjdFwiIGluIGVsZW1lbnQ7XG59XG5mdW5jdGlvbiBmb2N1cyhlbGVtZW50LCB7IHNlbGVjdCA9IGZhbHNlIH0gPSB7fSkge1xuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LmZvY3VzKSB7XG4gICAgY29uc3QgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICBlbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICBpZiAoZWxlbWVudCAhPT0gcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ICYmIGlzU2VsZWN0YWJsZUlucHV0KGVsZW1lbnQpICYmIHNlbGVjdClcbiAgICAgIGVsZW1lbnQuc2VsZWN0KCk7XG4gIH1cbn1cbnZhciBmb2N1c1Njb3Blc1N0YWNrID0gY3JlYXRlRm9jdXNTY29wZXNTdGFjaygpO1xuZnVuY3Rpb24gY3JlYXRlRm9jdXNTY29wZXNTdGFjaygpIHtcbiAgbGV0IHN0YWNrID0gW107XG4gIHJldHVybiB7XG4gICAgYWRkKGZvY3VzU2NvcGUpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZUZvY3VzU2NvcGUgPSBzdGFja1swXTtcbiAgICAgIGlmIChmb2N1c1Njb3BlICE9PSBhY3RpdmVGb2N1c1Njb3BlKSB7XG4gICAgICAgIGFjdGl2ZUZvY3VzU2NvcGU/LnBhdXNlKCk7XG4gICAgICB9XG4gICAgICBzdGFjayA9IGFycmF5UmVtb3ZlKHN0YWNrLCBmb2N1c1Njb3BlKTtcbiAgICAgIHN0YWNrLnVuc2hpZnQoZm9jdXNTY29wZSk7XG4gICAgfSxcbiAgICByZW1vdmUoZm9jdXNTY29wZSkge1xuICAgICAgc3RhY2sgPSBhcnJheVJlbW92ZShzdGFjaywgZm9jdXNTY29wZSk7XG4gICAgICBzdGFja1swXT8ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gYXJyYXlSZW1vdmUoYXJyYXksIGl0ZW0pIHtcbiAgY29uc3QgdXBkYXRlZEFycmF5ID0gWy4uLmFycmF5XTtcbiAgY29uc3QgaW5kZXggPSB1cGRhdGVkQXJyYXkuaW5kZXhPZihpdGVtKTtcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIHVwZGF0ZWRBcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHJldHVybiB1cGRhdGVkQXJyYXk7XG59XG5mdW5jdGlvbiByZW1vdmVMaW5rcyhpdGVtcykge1xuICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnRhZ05hbWUgIT09IFwiQVwiKTtcbn1cbnZhciBSb290ID0gRm9jdXNTY29wZTtcbmV4cG9ydCB7XG4gIEZvY3VzU2NvcGUsXG4gIFJvb3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC9pZC9zcmMvaWQudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3RcIjtcbnZhciB1c2VSZWFjdElkID0gUmVhY3RbXCJ1c2VJZFwiLnRvU3RyaW5nKCldIHx8ICgoKSA9PiB2b2lkIDApO1xudmFyIGNvdW50ID0gMDtcbmZ1bmN0aW9uIHVzZUlkKGRldGVybWluaXN0aWNJZCkge1xuICBjb25zdCBbaWQsIHNldElkXSA9IFJlYWN0LnVzZVN0YXRlKHVzZVJlYWN0SWQoKSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFkZXRlcm1pbmlzdGljSWQpIHNldElkKChyZWFjdElkKSA9PiByZWFjdElkID8/IFN0cmluZyhjb3VudCsrKSk7XG4gIH0sIFtkZXRlcm1pbmlzdGljSWRdKTtcbiAgcmV0dXJuIGRldGVybWluaXN0aWNJZCB8fCAoaWQgPyBgcmFkaXgtJHtpZH1gIDogXCJcIik7XG59XG5leHBvcnQge1xuICB1c2VJZFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9tZW51L3NyYy9NZW51LnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjb21wb3NlRXZlbnRIYW5kbGVycyB9IGZyb20gXCJAcmFkaXgtdWkvcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyBjcmVhdGVDb2xsZWN0aW9uIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb2xsZWN0aW9uXCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMsIGNvbXBvc2VSZWZzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHRTY29wZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29udGV4dFwiO1xuaW1wb3J0IHsgdXNlRGlyZWN0aW9uIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1kaXJlY3Rpb25cIjtcbmltcG9ydCB7IERpc21pc3NhYmxlTGF5ZXIgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWRpc21pc3NhYmxlLWxheWVyXCI7XG5pbXBvcnQgeyB1c2VGb2N1c0d1YXJkcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtZm9jdXMtZ3VhcmRzXCI7XG5pbXBvcnQgeyBGb2N1c1Njb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1mb2N1cy1zY29wZVwiO1xuaW1wb3J0IHsgdXNlSWQgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWlkXCI7XG5pbXBvcnQgKiBhcyBQb3BwZXJQcmltaXRpdmUgZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wb3BwZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVBvcHBlclNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wb3BwZXJcIjtcbmltcG9ydCB7IFBvcnRhbCBhcyBQb3J0YWxQcmltaXRpdmUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXBvcnRhbFwiO1xuaW1wb3J0IHsgUHJlc2VuY2UgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXByZXNlbmNlXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUsIGRpc3BhdGNoRGlzY3JldGVDdXN0b21FdmVudCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgKiBhcyBSb3ZpbmdGb2N1c0dyb3VwIGZyb20gXCJAcmFkaXgtdWkvcmVhY3Qtcm92aW5nLWZvY3VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSb3ZpbmdGb2N1c0dyb3VwU2NvcGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXJvdmluZy1mb2N1c1wiO1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3Qtc2xvdFwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWZcIjtcbmltcG9ydCB7IGhpZGVPdGhlcnMgfSBmcm9tIFwiYXJpYS1oaWRkZW5cIjtcbmltcG9ydCB7IFJlbW92ZVNjcm9sbCB9IGZyb20gXCJyZWFjdC1yZW1vdmUtc2Nyb2xsXCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBTRUxFQ1RJT05fS0VZUyA9IFtcIkVudGVyXCIsIFwiIFwiXTtcbnZhciBGSVJTVF9LRVlTID0gW1wiQXJyb3dEb3duXCIsIFwiUGFnZVVwXCIsIFwiSG9tZVwiXTtcbnZhciBMQVNUX0tFWVMgPSBbXCJBcnJvd1VwXCIsIFwiUGFnZURvd25cIiwgXCJFbmRcIl07XG52YXIgRklSU1RfTEFTVF9LRVlTID0gWy4uLkZJUlNUX0tFWVMsIC4uLkxBU1RfS0VZU107XG52YXIgU1VCX09QRU5fS0VZUyA9IHtcbiAgbHRyOiBbLi4uU0VMRUNUSU9OX0tFWVMsIFwiQXJyb3dSaWdodFwiXSxcbiAgcnRsOiBbLi4uU0VMRUNUSU9OX0tFWVMsIFwiQXJyb3dMZWZ0XCJdXG59O1xudmFyIFNVQl9DTE9TRV9LRVlTID0ge1xuICBsdHI6IFtcIkFycm93TGVmdFwiXSxcbiAgcnRsOiBbXCJBcnJvd1JpZ2h0XCJdXG59O1xudmFyIE1FTlVfTkFNRSA9IFwiTWVudVwiO1xudmFyIFtDb2xsZWN0aW9uLCB1c2VDb2xsZWN0aW9uLCBjcmVhdGVDb2xsZWN0aW9uU2NvcGVdID0gY3JlYXRlQ29sbGVjdGlvbihNRU5VX05BTUUpO1xudmFyIFtjcmVhdGVNZW51Q29udGV4dCwgY3JlYXRlTWVudVNjb3BlXSA9IGNyZWF0ZUNvbnRleHRTY29wZShNRU5VX05BTUUsIFtcbiAgY3JlYXRlQ29sbGVjdGlvblNjb3BlLFxuICBjcmVhdGVQb3BwZXJTY29wZSxcbiAgY3JlYXRlUm92aW5nRm9jdXNHcm91cFNjb3BlXG5dKTtcbnZhciB1c2VQb3BwZXJTY29wZSA9IGNyZWF0ZVBvcHBlclNjb3BlKCk7XG52YXIgdXNlUm92aW5nRm9jdXNHcm91cFNjb3BlID0gY3JlYXRlUm92aW5nRm9jdXNHcm91cFNjb3BlKCk7XG52YXIgW01lbnVQcm92aWRlciwgdXNlTWVudUNvbnRleHRdID0gY3JlYXRlTWVudUNvbnRleHQoTUVOVV9OQU1FKTtcbnZhciBbTWVudVJvb3RQcm92aWRlciwgdXNlTWVudVJvb3RDb250ZXh0XSA9IGNyZWF0ZU1lbnVDb250ZXh0KE1FTlVfTkFNRSk7XG52YXIgTWVudSA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVNZW51LCBvcGVuID0gZmFsc2UsIGNoaWxkcmVuLCBkaXIsIG9uT3BlbkNoYW5nZSwgbW9kYWwgPSB0cnVlIH0gPSBwcm9wcztcbiAgY29uc3QgcG9wcGVyU2NvcGUgPSB1c2VQb3BwZXJTY29wZShfX3Njb3BlTWVudSk7XG4gIGNvbnN0IFtjb250ZW50LCBzZXRDb250ZW50XSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBpc1VzaW5nS2V5Ym9hcmRSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBoYW5kbGVPcGVuQ2hhbmdlID0gdXNlQ2FsbGJhY2tSZWYob25PcGVuQ2hhbmdlKTtcbiAgY29uc3QgZGlyZWN0aW9uID0gdXNlRGlyZWN0aW9uKGRpcik7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9ICgpID0+IHtcbiAgICAgIGlzVXNpbmdLZXlib2FyZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBoYW5kbGVQb2ludGVyLCB7IGNhcHR1cmU6IHRydWUsIG9uY2U6IHRydWUgfSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgaGFuZGxlUG9pbnRlciwgeyBjYXB0dXJlOiB0cnVlLCBvbmNlOiB0cnVlIH0pO1xuICAgIH07XG4gICAgY29uc3QgaGFuZGxlUG9pbnRlciA9ICgpID0+IGlzVXNpbmdLZXlib2FyZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93biwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgaGFuZGxlUG9pbnRlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIGhhbmRsZVBvaW50ZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFBvcHBlclByaW1pdGl2ZS5Sb290LCB7IC4uLnBvcHBlclNjb3BlLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICBNZW51UHJvdmlkZXIsXG4gICAge1xuICAgICAgc2NvcGU6IF9fc2NvcGVNZW51LFxuICAgICAgb3BlbixcbiAgICAgIG9uT3BlbkNoYW5nZTogaGFuZGxlT3BlbkNoYW5nZSxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBvbkNvbnRlbnRDaGFuZ2U6IHNldENvbnRlbnQsXG4gICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgTWVudVJvb3RQcm92aWRlcixcbiAgICAgICAge1xuICAgICAgICAgIHNjb3BlOiBfX3Njb3BlTWVudSxcbiAgICAgICAgICBvbkNsb3NlOiBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiBoYW5kbGVPcGVuQ2hhbmdlKGZhbHNlKSwgW2hhbmRsZU9wZW5DaGFuZ2VdKSxcbiAgICAgICAgICBpc1VzaW5nS2V5Ym9hcmRSZWYsXG4gICAgICAgICAgZGlyOiBkaXJlY3Rpb24sXG4gICAgICAgICAgbW9kYWwsXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgKSB9KTtcbn07XG5NZW51LmRpc3BsYXlOYW1lID0gTUVOVV9OQU1FO1xudmFyIEFOQ0hPUl9OQU1FID0gXCJNZW51QW5jaG9yXCI7XG52YXIgTWVudUFuY2hvciA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlTWVudSwgLi4uYW5jaG9yUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IHBvcHBlclNjb3BlID0gdXNlUG9wcGVyU2NvcGUoX19zY29wZU1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFBvcHBlclByaW1pdGl2ZS5BbmNob3IsIHsgLi4ucG9wcGVyU2NvcGUsIC4uLmFuY2hvclByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfVxuKTtcbk1lbnVBbmNob3IuZGlzcGxheU5hbWUgPSBBTkNIT1JfTkFNRTtcbnZhciBQT1JUQUxfTkFNRSA9IFwiTWVudVBvcnRhbFwiO1xudmFyIFtQb3J0YWxQcm92aWRlciwgdXNlUG9ydGFsQ29udGV4dF0gPSBjcmVhdGVNZW51Q29udGV4dChQT1JUQUxfTkFNRSwge1xuICBmb3JjZU1vdW50OiB2b2lkIDBcbn0pO1xudmFyIE1lbnVQb3J0YWwgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlTWVudSwgZm9yY2VNb3VudCwgY2hpbGRyZW4sIGNvbnRhaW5lciB9ID0gcHJvcHM7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VNZW51Q29udGV4dChQT1JUQUxfTkFNRSwgX19zY29wZU1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQb3J0YWxQcm92aWRlciwgeyBzY29wZTogX19zY29wZU1lbnUsIGZvcmNlTW91bnQsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFByZXNlbmNlLCB7IHByZXNlbnQ6IGZvcmNlTW91bnQgfHwgY29udGV4dC5vcGVuLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChQb3J0YWxQcmltaXRpdmUsIHsgYXNDaGlsZDogdHJ1ZSwgY29udGFpbmVyLCBjaGlsZHJlbiB9KSB9KSB9KTtcbn07XG5NZW51UG9ydGFsLmRpc3BsYXlOYW1lID0gUE9SVEFMX05BTUU7XG52YXIgQ09OVEVOVF9OQU1FID0gXCJNZW51Q29udGVudFwiO1xudmFyIFtNZW51Q29udGVudFByb3ZpZGVyLCB1c2VNZW51Q29udGVudENvbnRleHRdID0gY3JlYXRlTWVudUNvbnRleHQoQ09OVEVOVF9OQU1FKTtcbnZhciBNZW51Q29udGVudCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgcG9ydGFsQ29udGV4dCA9IHVzZVBvcnRhbENvbnRleHQoQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3QgeyBmb3JjZU1vdW50ID0gcG9ydGFsQ29udGV4dC5mb3JjZU1vdW50LCAuLi5jb250ZW50UHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VNZW51Q29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByb290Q29udGV4dCA9IHVzZU1lbnVSb290Q29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChDb2xsZWN0aW9uLlByb3ZpZGVyLCB7IHNjb3BlOiBwcm9wcy5fX3Njb3BlTWVudSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goUHJlc2VuY2UsIHsgcHJlc2VudDogZm9yY2VNb3VudCB8fCBjb250ZXh0Lm9wZW4sIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KENvbGxlY3Rpb24uU2xvdCwgeyBzY29wZTogcHJvcHMuX19zY29wZU1lbnUsIGNoaWxkcmVuOiByb290Q29udGV4dC5tb2RhbCA/IC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVJvb3RDb250ZW50TW9kYWwsIHsgLi4uY29udGVudFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KSA6IC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVJvb3RDb250ZW50Tm9uTW9kYWwsIHsgLi4uY29udGVudFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KSB9KSB9KSB9KTtcbiAgfVxuKTtcbnZhciBNZW51Um9vdENvbnRlbnRNb2RhbCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZU1lbnVDb250ZXh0KENPTlRFTlRfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZW50ID0gcmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoY29udGVudCkgcmV0dXJuIGhpZGVPdGhlcnMoY29udGVudCk7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudUNvbnRlbnRJbXBsLFxuICAgICAge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgIHRyYXBGb2N1czogY29udGV4dC5vcGVuLFxuICAgICAgICBkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6IGNvbnRleHQub3BlbixcbiAgICAgICAgZGlzYWJsZU91dHNpZGVTY3JvbGw6IHRydWUsXG4gICAgICAgIG9uRm9jdXNPdXRzaWRlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICBwcm9wcy5vbkZvY3VzT3V0c2lkZSxcbiAgICAgICAgICAoZXZlbnQpID0+IGV2ZW50LnByZXZlbnREZWZhdWx0KCksXG4gICAgICAgICAgeyBjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlIH1cbiAgICAgICAgKSxcbiAgICAgICAgb25EaXNtaXNzOiAoKSA9PiBjb250ZXh0Lm9uT3BlbkNoYW5nZShmYWxzZSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xudmFyIE1lbnVSb290Q29udGVudE5vbk1vZGFsID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlTWVudUNvbnRleHQoQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgIE1lbnVDb250ZW50SW1wbCxcbiAgICB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgdHJhcEZvY3VzOiBmYWxzZSxcbiAgICAgIGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czogZmFsc2UsXG4gICAgICBkaXNhYmxlT3V0c2lkZVNjcm9sbDogZmFsc2UsXG4gICAgICBvbkRpc21pc3M6ICgpID0+IGNvbnRleHQub25PcGVuQ2hhbmdlKGZhbHNlKVxuICAgIH1cbiAgKTtcbn0pO1xudmFyIE1lbnVDb250ZW50SW1wbCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgX19zY29wZU1lbnUsXG4gICAgICBsb29wID0gZmFsc2UsXG4gICAgICB0cmFwRm9jdXMsXG4gICAgICBvbk9wZW5BdXRvRm9jdXMsXG4gICAgICBvbkNsb3NlQXV0b0ZvY3VzLFxuICAgICAgZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzLFxuICAgICAgb25FbnRyeUZvY3VzLFxuICAgICAgb25Fc2NhcGVLZXlEb3duLFxuICAgICAgb25Qb2ludGVyRG93bk91dHNpZGUsXG4gICAgICBvbkZvY3VzT3V0c2lkZSxcbiAgICAgIG9uSW50ZXJhY3RPdXRzaWRlLFxuICAgICAgb25EaXNtaXNzLFxuICAgICAgZGlzYWJsZU91dHNpZGVTY3JvbGwsXG4gICAgICAuLi5jb250ZW50UHJvcHNcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZU1lbnVDb250ZXh0KENPTlRFTlRfTkFNRSwgX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gdXNlTWVudVJvb3RDb250ZXh0KENPTlRFTlRfTkFNRSwgX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHBvcHBlclNjb3BlID0gdXNlUG9wcGVyU2NvcGUoX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJvdmluZ0ZvY3VzR3JvdXBTY29wZSA9IHVzZVJvdmluZ0ZvY3VzR3JvdXBTY29wZShfX3Njb3BlTWVudSk7XG4gICAgY29uc3QgZ2V0SXRlbXMgPSB1c2VDb2xsZWN0aW9uKF9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBbY3VycmVudEl0ZW1JZCwgc2V0Q3VycmVudEl0ZW1JZF0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBjb250ZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIGNvbnRlbnRSZWYsIGNvbnRleHQub25Db250ZW50Q2hhbmdlKTtcbiAgICBjb25zdCB0aW1lclJlZiA9IFJlYWN0LnVzZVJlZigwKTtcbiAgICBjb25zdCBzZWFyY2hSZWYgPSBSZWFjdC51c2VSZWYoXCJcIik7XG4gICAgY29uc3QgcG9pbnRlckdyYWNlVGltZXJSZWYgPSBSZWFjdC51c2VSZWYoMCk7XG4gICAgY29uc3QgcG9pbnRlckdyYWNlSW50ZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHBvaW50ZXJEaXJSZWYgPSBSZWFjdC51c2VSZWYoXCJyaWdodFwiKTtcbiAgICBjb25zdCBsYXN0UG9pbnRlclhSZWYgPSBSZWFjdC51c2VSZWYoMCk7XG4gICAgY29uc3QgU2Nyb2xsTG9ja1dyYXBwZXIgPSBkaXNhYmxlT3V0c2lkZVNjcm9sbCA/IFJlbW92ZVNjcm9sbCA6IFJlYWN0LkZyYWdtZW50O1xuICAgIGNvbnN0IHNjcm9sbExvY2tXcmFwcGVyUHJvcHMgPSBkaXNhYmxlT3V0c2lkZVNjcm9sbCA/IHsgYXM6IFNsb3QsIGFsbG93UGluY2hab29tOiB0cnVlIH0gOiB2b2lkIDA7XG4gICAgY29uc3QgaGFuZGxlVHlwZWFoZWFkU2VhcmNoID0gKGtleSkgPT4ge1xuICAgICAgY29uc3Qgc2VhcmNoID0gc2VhcmNoUmVmLmN1cnJlbnQgKyBrZXk7XG4gICAgICBjb25zdCBpdGVtcyA9IGdldEl0ZW1zKCkuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5kaXNhYmxlZCk7XG4gICAgICBjb25zdCBjdXJyZW50SXRlbSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBjdXJyZW50TWF0Y2ggPSBpdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLnJlZi5jdXJyZW50ID09PSBjdXJyZW50SXRlbSk/LnRleHRWYWx1ZTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS50ZXh0VmFsdWUpO1xuICAgICAgY29uc3QgbmV4dE1hdGNoID0gZ2V0TmV4dE1hdGNoKHZhbHVlcywgc2VhcmNoLCBjdXJyZW50TWF0Y2gpO1xuICAgICAgY29uc3QgbmV3SXRlbSA9IGl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0udGV4dFZhbHVlID09PSBuZXh0TWF0Y2gpPy5yZWYuY3VycmVudDtcbiAgICAgIChmdW5jdGlvbiB1cGRhdGVTZWFyY2godmFsdWUpIHtcbiAgICAgICAgc2VhcmNoUmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lclJlZi5jdXJyZW50KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBcIlwiKSB0aW1lclJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdXBkYXRlU2VhcmNoKFwiXCIpLCAxZTMpO1xuICAgICAgfSkoc2VhcmNoKTtcbiAgICAgIGlmIChuZXdJdGVtKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gbmV3SXRlbS5mb2N1cygpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICByZXR1cm4gKCkgPT4gd2luZG93LmNsZWFyVGltZW91dCh0aW1lclJlZi5jdXJyZW50KTtcbiAgICB9LCBbXSk7XG4gICAgdXNlRm9jdXNHdWFyZHMoKTtcbiAgICBjb25zdCBpc1BvaW50ZXJNb3ZpbmdUb1N1Ym1lbnUgPSBSZWFjdC51c2VDYWxsYmFjaygoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGlzTW92aW5nVG93YXJkcyA9IHBvaW50ZXJEaXJSZWYuY3VycmVudCA9PT0gcG9pbnRlckdyYWNlSW50ZW50UmVmLmN1cnJlbnQ/LnNpZGU7XG4gICAgICByZXR1cm4gaXNNb3ZpbmdUb3dhcmRzICYmIGlzUG9pbnRlckluR3JhY2VBcmVhKGV2ZW50LCBwb2ludGVyR3JhY2VJbnRlbnRSZWYuY3VycmVudD8uYXJlYSk7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudUNvbnRlbnRQcm92aWRlcixcbiAgICAgIHtcbiAgICAgICAgc2NvcGU6IF9fc2NvcGVNZW51LFxuICAgICAgICBzZWFyY2hSZWYsXG4gICAgICAgIG9uSXRlbUVudGVyOiBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1BvaW50ZXJNb3ZpbmdUb1N1Ym1lbnUoZXZlbnQpKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW2lzUG9pbnRlck1vdmluZ1RvU3VibWVudV1cbiAgICAgICAgKSxcbiAgICAgICAgb25JdGVtTGVhdmU6IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgICAgICAgIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzUG9pbnRlck1vdmluZ1RvU3VibWVudShldmVudCkpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnRlbnRSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICAgICAgICAgIHNldEN1cnJlbnRJdGVtSWQobnVsbCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbaXNQb2ludGVyTW92aW5nVG9TdWJtZW51XVxuICAgICAgICApLFxuICAgICAgICBvblRyaWdnZXJMZWF2ZTogUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNQb2ludGVyTW92aW5nVG9TdWJtZW51KGV2ZW50KSkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtpc1BvaW50ZXJNb3ZpbmdUb1N1Ym1lbnVdXG4gICAgICAgICksXG4gICAgICAgIHBvaW50ZXJHcmFjZVRpbWVyUmVmLFxuICAgICAgICBvblBvaW50ZXJHcmFjZUludGVudENoYW5nZTogUmVhY3QudXNlQ2FsbGJhY2soKGludGVudCkgPT4ge1xuICAgICAgICAgIHBvaW50ZXJHcmFjZUludGVudFJlZi5jdXJyZW50ID0gaW50ZW50O1xuICAgICAgICB9LCBbXSksXG4gICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFNjcm9sbExvY2tXcmFwcGVyLCB7IC4uLnNjcm9sbExvY2tXcmFwcGVyUHJvcHMsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgIEZvY3VzU2NvcGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXNDaGlsZDogdHJ1ZSxcbiAgICAgICAgICAgIHRyYXBwZWQ6IHRyYXBGb2N1cyxcbiAgICAgICAgICAgIG9uTW91bnRBdXRvRm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uT3BlbkF1dG9Gb2N1cywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGNvbnRlbnRSZWYuY3VycmVudD8uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBvblVubW91bnRBdXRvRm9jdXM6IG9uQ2xvc2VBdXRvRm9jdXMsXG4gICAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICAgICAgRGlzbWlzc2FibGVMYXllcixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFzQ2hpbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzLFxuICAgICAgICAgICAgICAgIG9uRXNjYXBlS2V5RG93bixcbiAgICAgICAgICAgICAgICBvblBvaW50ZXJEb3duT3V0c2lkZSxcbiAgICAgICAgICAgICAgICBvbkZvY3VzT3V0c2lkZSxcbiAgICAgICAgICAgICAgICBvbkludGVyYWN0T3V0c2lkZSxcbiAgICAgICAgICAgICAgICBvbkRpc21pc3MsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgICAgICAgICBSb3ZpbmdGb2N1c0dyb3VwLlJvb3QsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFzQ2hpbGQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIC4uLnJvdmluZ0ZvY3VzR3JvdXBTY29wZSxcbiAgICAgICAgICAgICAgICAgICAgZGlyOiByb290Q29udGV4dC5kaXIsXG4gICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiBcInZlcnRpY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgIGxvb3AsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWJTdG9wSWQ6IGN1cnJlbnRJdGVtSWQsXG4gICAgICAgICAgICAgICAgICAgIG9uQ3VycmVudFRhYlN0b3BJZENoYW5nZTogc2V0Q3VycmVudEl0ZW1JZCxcbiAgICAgICAgICAgICAgICAgICAgb25FbnRyeUZvY3VzOiBjb21wb3NlRXZlbnRIYW5kbGVycyhvbkVudHJ5Rm9jdXMsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghcm9vdENvbnRleHQuaXNVc2luZ0tleWJvYXJkUmVmLmN1cnJlbnQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsT25FbnRyeUZvY3VzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICAgICAgICAgICAgICBQb3BwZXJQcmltaXRpdmUuQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlOiBcIm1lbnVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRhdGEtc3RhdGVcIjogZ2V0T3BlblN0YXRlKGNvbnRleHQub3BlbiksXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRhdGEtcmFkaXgtbWVudS1jb250ZW50XCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXI6IHJvb3RDb250ZXh0LmRpcixcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBvcHBlclNjb3BlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29udGVudFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogeyBvdXRsaW5lOiBcIm5vbmVcIiwgLi4uY29udGVudFByb3BzLnN0eWxlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBvbktleURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKGNvbnRlbnRQcm9wcy5vbktleURvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzS2V5RG93bkluc2lkZSA9IHRhcmdldC5jbG9zZXN0KFwiW2RhdGEtcmFkaXgtbWVudS1jb250ZW50XVwiKSA9PT0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNNb2RpZmllcktleSA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50Lm1ldGFLZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ2hhcmFjdGVyS2V5ID0gZXZlbnQua2V5Lmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzS2V5RG93bkluc2lkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IFwiVGFiXCIpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc01vZGlmaWVyS2V5ICYmIGlzQ2hhcmFjdGVyS2V5KSBoYW5kbGVUeXBlYWhlYWRTZWFyY2goZXZlbnQua2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gY29udGVudFJlZi5jdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBjb250ZW50KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRklSU1RfTEFTVF9LRVlTLmluY2x1ZGVzKGV2ZW50LmtleSkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRJdGVtcygpLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uZGlzYWJsZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVOb2RlcyA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5yZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMQVNUX0tFWVMuaW5jbHVkZXMoZXZlbnQua2V5KSkgY2FuZGlkYXRlTm9kZXMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c0ZpcnN0KGNhbmRpZGF0ZU5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25CbHVyOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkJsdXIsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LmN1cnJlbnRUYXJnZXQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVmLmN1cnJlbnQgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uUG9pbnRlck1vdmU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5vblBvaW50ZXJNb3ZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuTW91c2UoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50ZXJYSGFzQ2hhbmdlZCA9IGxhc3RQb2ludGVyWFJlZi5jdXJyZW50ICE9PSBldmVudC5jbGllbnRYO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0LmNvbnRhaW5zKHRhcmdldCkgJiYgcG9pbnRlclhIYXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdEaXIgPSBldmVudC5jbGllbnRYID4gbGFzdFBvaW50ZXJYUmVmLmN1cnJlbnQgPyBcInJpZ2h0XCIgOiBcImxlZnRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJEaXJSZWYuY3VycmVudCA9IG5ld0RpcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQb2ludGVyWFJlZi5jdXJyZW50ID0gZXZlbnQuY2xpZW50WDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICApIH0pXG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcbk1lbnVDb250ZW50LmRpc3BsYXlOYW1lID0gQ09OVEVOVF9OQU1FO1xudmFyIEdST1VQX05BTUUgPSBcIk1lbnVHcm91cFwiO1xudmFyIE1lbnVHcm91cCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlTWVudSwgLi4uZ3JvdXBQcm9wcyB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUHJpbWl0aXZlLmRpdiwgeyByb2xlOiBcImdyb3VwXCIsIC4uLmdyb3VwUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9XG4pO1xuTWVudUdyb3VwLmRpc3BsYXlOYW1lID0gR1JPVVBfTkFNRTtcbnZhciBMQUJFTF9OQU1FID0gXCJNZW51TGFiZWxcIjtcbnZhciBNZW51TGFiZWwgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZU1lbnUsIC4uLmxhYmVsUHJvcHMgfSA9IHByb3BzO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFByaW1pdGl2ZS5kaXYsIHsgLi4ubGFiZWxQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH1cbik7XG5NZW51TGFiZWwuZGlzcGxheU5hbWUgPSBMQUJFTF9OQU1FO1xudmFyIElURU1fTkFNRSA9IFwiTWVudUl0ZW1cIjtcbnZhciBJVEVNX1NFTEVDVCA9IFwibWVudS5pdGVtU2VsZWN0XCI7XG52YXIgTWVudUl0ZW0gPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgZGlzYWJsZWQgPSBmYWxzZSwgb25TZWxlY3QsIC4uLml0ZW1Qcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gdXNlTWVudVJvb3RDb250ZXh0KElURU1fTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IGNvbnRlbnRDb250ZXh0ID0gdXNlTWVudUNvbnRlbnRDb250ZXh0KElURU1fTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIHJlZik7XG4gICAgY29uc3QgaXNQb2ludGVyRG93blJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gICAgY29uc3QgaGFuZGxlU2VsZWN0ID0gKCkgPT4ge1xuICAgICAgY29uc3QgbWVudUl0ZW0gPSByZWYuY3VycmVudDtcbiAgICAgIGlmICghZGlzYWJsZWQgJiYgbWVudUl0ZW0pIHtcbiAgICAgICAgY29uc3QgaXRlbVNlbGVjdEV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KElURU1fU0VMRUNULCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICAgIG1lbnVJdGVtLmFkZEV2ZW50TGlzdGVuZXIoSVRFTV9TRUxFQ1QsIChldmVudCkgPT4gb25TZWxlY3Q/LihldmVudCksIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgZGlzcGF0Y2hEaXNjcmV0ZUN1c3RvbUV2ZW50KG1lbnVJdGVtLCBpdGVtU2VsZWN0RXZlbnQpO1xuICAgICAgICBpZiAoaXRlbVNlbGVjdEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICBpc1BvaW50ZXJEb3duUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByb290Q29udGV4dC5vbkNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudUl0ZW1JbXBsLFxuICAgICAge1xuICAgICAgICAuLi5pdGVtUHJvcHMsXG4gICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgb25DbGljazogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25DbGljaywgaGFuZGxlU2VsZWN0KSxcbiAgICAgICAgb25Qb2ludGVyRG93bjogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgcHJvcHMub25Qb2ludGVyRG93bj8uKGV2ZW50KTtcbiAgICAgICAgICBpc1BvaW50ZXJEb3duUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvblBvaW50ZXJVcDogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Qb2ludGVyVXAsIChldmVudCkgPT4ge1xuICAgICAgICAgIGlmICghaXNQb2ludGVyRG93blJlZi5jdXJyZW50KSBldmVudC5jdXJyZW50VGFyZ2V0Py5jbGljaygpO1xuICAgICAgICB9KSxcbiAgICAgICAgb25LZXlEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbktleURvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzVHlwaW5nQWhlYWQgPSBjb250ZW50Q29udGV4dC5zZWFyY2hSZWYuY3VycmVudCAhPT0gXCJcIjtcbiAgICAgICAgICBpZiAoZGlzYWJsZWQgfHwgaXNUeXBpbmdBaGVhZCAmJiBldmVudC5rZXkgPT09IFwiIFwiKSByZXR1cm47XG4gICAgICAgICAgaWYgKFNFTEVDVElPTl9LRVlTLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgICAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuY2xpY2soKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5NZW51SXRlbS5kaXNwbGF5TmFtZSA9IElURU1fTkFNRTtcbnZhciBNZW51SXRlbUltcGwgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZU1lbnUsIGRpc2FibGVkID0gZmFsc2UsIHRleHRWYWx1ZSwgLi4uaXRlbVByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IHVzZU1lbnVDb250ZW50Q29udGV4dChJVEVNX05BTUUsIF9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByb3ZpbmdGb2N1c0dyb3VwU2NvcGUgPSB1c2VSb3ZpbmdGb2N1c0dyb3VwU2NvcGUoX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICAgIGNvbnN0IFtpc0ZvY3VzZWQsIHNldElzRm9jdXNlZF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW3RleHRDb250ZW50LCBzZXRUZXh0Q29udGVudF0gPSBSZWFjdC51c2VTdGF0ZShcIlwiKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgbWVudUl0ZW0gPSByZWYuY3VycmVudDtcbiAgICAgIGlmIChtZW51SXRlbSkge1xuICAgICAgICBzZXRUZXh0Q29udGVudCgobWVudUl0ZW0udGV4dENvbnRlbnQgPz8gXCJcIikudHJpbSgpKTtcbiAgICAgIH1cbiAgICB9LCBbaXRlbVByb3BzLmNoaWxkcmVuXSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBDb2xsZWN0aW9uLkl0ZW1TbG90LFxuICAgICAge1xuICAgICAgICBzY29wZTogX19zY29wZU1lbnUsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICB0ZXh0VmFsdWU6IHRleHRWYWx1ZSA/PyB0ZXh0Q29udGVudCxcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goUm92aW5nRm9jdXNHcm91cC5JdGVtLCB7IGFzQ2hpbGQ6IHRydWUsIC4uLnJvdmluZ0ZvY3VzR3JvdXBTY29wZSwgZm9jdXNhYmxlOiAhZGlzYWJsZWQsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgIFByaW1pdGl2ZS5kaXYsXG4gICAgICAgICAge1xuICAgICAgICAgICAgcm9sZTogXCJtZW51aXRlbVwiLFxuICAgICAgICAgICAgXCJkYXRhLWhpZ2hsaWdodGVkXCI6IGlzRm9jdXNlZCA/IFwiXCIgOiB2b2lkIDAsXG4gICAgICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogZGlzYWJsZWQgfHwgdm9pZCAwLFxuICAgICAgICAgICAgXCJkYXRhLWRpc2FibGVkXCI6IGRpc2FibGVkID8gXCJcIiA6IHZvaWQgMCxcbiAgICAgICAgICAgIC4uLml0ZW1Qcm9wcyxcbiAgICAgICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICAgICAgb25Qb2ludGVyTW92ZTogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgICAgIHByb3BzLm9uUG9pbnRlck1vdmUsXG4gICAgICAgICAgICAgIHdoZW5Nb3VzZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnRDb250ZXh0Lm9uSXRlbUxlYXZlKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29udGVudENvbnRleHQub25JdGVtRW50ZXIoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgb25Qb2ludGVyTGVhdmU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKFxuICAgICAgICAgICAgICBwcm9wcy5vblBvaW50ZXJMZWF2ZSxcbiAgICAgICAgICAgICAgd2hlbk1vdXNlKChldmVudCkgPT4gY29udGVudENvbnRleHQub25JdGVtTGVhdmUoZXZlbnQpKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG9uRm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uRm9jdXMsICgpID0+IHNldElzRm9jdXNlZCh0cnVlKSksXG4gICAgICAgICAgICBvbkJsdXI6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uQmx1ciwgKCkgPT4gc2V0SXNGb2N1c2VkKGZhbHNlKSlcbiAgICAgICAgICB9XG4gICAgICAgICkgfSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xudmFyIENIRUNLQk9YX0lURU1fTkFNRSA9IFwiTWVudUNoZWNrYm94SXRlbVwiO1xudmFyIE1lbnVDaGVja2JveEl0ZW0gPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgY2hlY2tlZCA9IGZhbHNlLCBvbkNoZWNrZWRDaGFuZ2UsIC4uLmNoZWNrYm94SXRlbVByb3BzIH0gPSBwcm9wcztcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChJdGVtSW5kaWNhdG9yUHJvdmlkZXIsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVNZW51LCBjaGVja2VkLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIE1lbnVJdGVtLFxuICAgICAge1xuICAgICAgICByb2xlOiBcIm1lbnVpdGVtY2hlY2tib3hcIixcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjogaXNJbmRldGVybWluYXRlKGNoZWNrZWQpID8gXCJtaXhlZFwiIDogY2hlY2tlZCxcbiAgICAgICAgLi4uY2hlY2tib3hJdGVtUHJvcHMsXG4gICAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgICBcImRhdGEtc3RhdGVcIjogZ2V0Q2hlY2tlZFN0YXRlKGNoZWNrZWQpLFxuICAgICAgICBvblNlbGVjdDogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgY2hlY2tib3hJdGVtUHJvcHMub25TZWxlY3QsXG4gICAgICAgICAgKCkgPT4gb25DaGVja2VkQ2hhbmdlPy4oaXNJbmRldGVybWluYXRlKGNoZWNrZWQpID8gdHJ1ZSA6ICFjaGVja2VkKSxcbiAgICAgICAgICB7IGNoZWNrRm9yRGVmYXVsdFByZXZlbnRlZDogZmFsc2UgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgKSB9KTtcbiAgfVxuKTtcbk1lbnVDaGVja2JveEl0ZW0uZGlzcGxheU5hbWUgPSBDSEVDS0JPWF9JVEVNX05BTUU7XG52YXIgUkFESU9fR1JPVVBfTkFNRSA9IFwiTWVudVJhZGlvR3JvdXBcIjtcbnZhciBbUmFkaW9Hcm91cFByb3ZpZGVyLCB1c2VSYWRpb0dyb3VwQ29udGV4dF0gPSBjcmVhdGVNZW51Q29udGV4dChcbiAgUkFESU9fR1JPVVBfTkFNRSxcbiAgeyB2YWx1ZTogdm9pZCAwLCBvblZhbHVlQ2hhbmdlOiAoKSA9PiB7XG4gIH0gfVxuKTtcbnZhciBNZW51UmFkaW9Hcm91cCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZSwgb25WYWx1ZUNoYW5nZSwgLi4uZ3JvdXBQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgaGFuZGxlVmFsdWVDaGFuZ2UgPSB1c2VDYWxsYmFja1JlZihvblZhbHVlQ2hhbmdlKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChSYWRpb0dyb3VwUHJvdmlkZXIsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVNZW51LCB2YWx1ZSwgb25WYWx1ZUNoYW5nZTogaGFuZGxlVmFsdWVDaGFuZ2UsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVHcm91cCwgeyAuLi5ncm91cFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KSB9KTtcbiAgfVxuKTtcbk1lbnVSYWRpb0dyb3VwLmRpc3BsYXlOYW1lID0gUkFESU9fR1JPVVBfTkFNRTtcbnZhciBSQURJT19JVEVNX05BTUUgPSBcIk1lbnVSYWRpb0l0ZW1cIjtcbnZhciBNZW51UmFkaW9JdGVtID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IHZhbHVlLCAuLi5yYWRpb0l0ZW1Qcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZVJhZGlvR3JvdXBDb250ZXh0KFJBRElPX0lURU1fTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IGNoZWNrZWQgPSB2YWx1ZSA9PT0gY29udGV4dC52YWx1ZTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChJdGVtSW5kaWNhdG9yUHJvdmlkZXIsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVNZW51LCBjaGVja2VkLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIE1lbnVJdGVtLFxuICAgICAge1xuICAgICAgICByb2xlOiBcIm1lbnVpdGVtcmFkaW9cIixcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjogY2hlY2tlZCxcbiAgICAgICAgLi4ucmFkaW9JdGVtUHJvcHMsXG4gICAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgICBcImRhdGEtc3RhdGVcIjogZ2V0Q2hlY2tlZFN0YXRlKGNoZWNrZWQpLFxuICAgICAgICBvblNlbGVjdDogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgcmFkaW9JdGVtUHJvcHMub25TZWxlY3QsXG4gICAgICAgICAgKCkgPT4gY29udGV4dC5vblZhbHVlQ2hhbmdlPy4odmFsdWUpLFxuICAgICAgICAgIHsgY2hlY2tGb3JEZWZhdWx0UHJldmVudGVkOiBmYWxzZSB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICApIH0pO1xuICB9XG4pO1xuTWVudVJhZGlvSXRlbS5kaXNwbGF5TmFtZSA9IFJBRElPX0lURU1fTkFNRTtcbnZhciBJVEVNX0lORElDQVRPUl9OQU1FID0gXCJNZW51SXRlbUluZGljYXRvclwiO1xudmFyIFtJdGVtSW5kaWNhdG9yUHJvdmlkZXIsIHVzZUl0ZW1JbmRpY2F0b3JDb250ZXh0XSA9IGNyZWF0ZU1lbnVDb250ZXh0KFxuICBJVEVNX0lORElDQVRPUl9OQU1FLFxuICB7IGNoZWNrZWQ6IGZhbHNlIH1cbik7XG52YXIgTWVudUl0ZW1JbmRpY2F0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZU1lbnUsIGZvcmNlTW91bnQsIC4uLml0ZW1JbmRpY2F0b3JQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgaW5kaWNhdG9yQ29udGV4dCA9IHVzZUl0ZW1JbmRpY2F0b3JDb250ZXh0KElURU1fSU5ESUNBVE9SX05BTUUsIF9fc2NvcGVNZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIFByZXNlbmNlLFxuICAgICAge1xuICAgICAgICBwcmVzZW50OiBmb3JjZU1vdW50IHx8IGlzSW5kZXRlcm1pbmF0ZShpbmRpY2F0b3JDb250ZXh0LmNoZWNrZWQpIHx8IGluZGljYXRvckNvbnRleHQuY2hlY2tlZCA9PT0gdHJ1ZSxcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgUHJpbWl0aXZlLnNwYW4sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uaXRlbUluZGljYXRvclByb3BzLFxuICAgICAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICAgICAgICBcImRhdGEtc3RhdGVcIjogZ2V0Q2hlY2tlZFN0YXRlKGluZGljYXRvckNvbnRleHQuY2hlY2tlZClcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xuTWVudUl0ZW1JbmRpY2F0b3IuZGlzcGxheU5hbWUgPSBJVEVNX0lORElDQVRPUl9OQU1FO1xudmFyIFNFUEFSQVRPUl9OQU1FID0gXCJNZW51U2VwYXJhdG9yXCI7XG52YXIgTWVudVNlcGFyYXRvciA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlTWVudSwgLi4uc2VwYXJhdG9yUHJvcHMgfSA9IHByb3BzO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgUHJpbWl0aXZlLmRpdixcbiAgICAgIHtcbiAgICAgICAgcm9sZTogXCJzZXBhcmF0b3JcIixcbiAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAuLi5zZXBhcmF0b3JQcm9wcyxcbiAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWZcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xuTWVudVNlcGFyYXRvci5kaXNwbGF5TmFtZSA9IFNFUEFSQVRPUl9OQU1FO1xudmFyIEFSUk9XX05BTUUgPSBcIk1lbnVBcnJvd1wiO1xudmFyIE1lbnVBcnJvdyA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlTWVudSwgLi4uYXJyb3dQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgcG9wcGVyU2NvcGUgPSB1c2VQb3BwZXJTY29wZShfX3Njb3BlTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUG9wcGVyUHJpbWl0aXZlLkFycm93LCB7IC4uLnBvcHBlclNjb3BlLCAuLi5hcnJvd1Byb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfVxuKTtcbk1lbnVBcnJvdy5kaXNwbGF5TmFtZSA9IEFSUk9XX05BTUU7XG52YXIgU1VCX05BTUUgPSBcIk1lbnVTdWJcIjtcbnZhciBbTWVudVN1YlByb3ZpZGVyLCB1c2VNZW51U3ViQ29udGV4dF0gPSBjcmVhdGVNZW51Q29udGV4dChTVUJfTkFNRSk7XG52YXIgTWVudVN1YiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVNZW51LCBjaGlsZHJlbiwgb3BlbiA9IGZhbHNlLCBvbk9wZW5DaGFuZ2UgfSA9IHByb3BzO1xuICBjb25zdCBwYXJlbnRNZW51Q29udGV4dCA9IHVzZU1lbnVDb250ZXh0KFNVQl9OQU1FLCBfX3Njb3BlTWVudSk7XG4gIGNvbnN0IHBvcHBlclNjb3BlID0gdXNlUG9wcGVyU2NvcGUoX19zY29wZU1lbnUpO1xuICBjb25zdCBbdHJpZ2dlciwgc2V0VHJpZ2dlcl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2NvbnRlbnQsIHNldENvbnRlbnRdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IGhhbmRsZU9wZW5DaGFuZ2UgPSB1c2VDYWxsYmFja1JlZihvbk9wZW5DaGFuZ2UpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwYXJlbnRNZW51Q29udGV4dC5vcGVuID09PSBmYWxzZSkgaGFuZGxlT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgcmV0dXJuICgpID0+IGhhbmRsZU9wZW5DaGFuZ2UoZmFsc2UpO1xuICB9LCBbcGFyZW50TWVudUNvbnRleHQub3BlbiwgaGFuZGxlT3BlbkNoYW5nZV0pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQb3BwZXJQcmltaXRpdmUuUm9vdCwgeyAuLi5wb3BwZXJTY29wZSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgTWVudVByb3ZpZGVyLFxuICAgIHtcbiAgICAgIHNjb3BlOiBfX3Njb3BlTWVudSxcbiAgICAgIG9wZW4sXG4gICAgICBvbk9wZW5DaGFuZ2U6IGhhbmRsZU9wZW5DaGFuZ2UsXG4gICAgICBjb250ZW50LFxuICAgICAgb25Db250ZW50Q2hhbmdlOiBzZXRDb250ZW50LFxuICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgIE1lbnVTdWJQcm92aWRlcixcbiAgICAgICAge1xuICAgICAgICAgIHNjb3BlOiBfX3Njb3BlTWVudSxcbiAgICAgICAgICBjb250ZW50SWQ6IHVzZUlkKCksXG4gICAgICAgICAgdHJpZ2dlcklkOiB1c2VJZCgpLFxuICAgICAgICAgIHRyaWdnZXIsXG4gICAgICAgICAgb25UcmlnZ2VyQ2hhbmdlOiBzZXRUcmlnZ2VyLFxuICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gICkgfSk7XG59O1xuTWVudVN1Yi5kaXNwbGF5TmFtZSA9IFNVQl9OQU1FO1xudmFyIFNVQl9UUklHR0VSX05BTUUgPSBcIk1lbnVTdWJUcmlnZ2VyXCI7XG52YXIgTWVudVN1YlRyaWdnZXIgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VNZW51Q29udGV4dChTVUJfVFJJR0dFUl9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3Qgcm9vdENvbnRleHQgPSB1c2VNZW51Um9vdENvbnRleHQoU1VCX1RSSUdHRVJfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHN1YkNvbnRleHQgPSB1c2VNZW51U3ViQ29udGV4dChTVUJfVFJJR0dFUl9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3QgY29udGVudENvbnRleHQgPSB1c2VNZW51Q29udGVudENvbnRleHQoU1VCX1RSSUdHRVJfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IG9wZW5UaW1lclJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCB7IHBvaW50ZXJHcmFjZVRpbWVyUmVmLCBvblBvaW50ZXJHcmFjZUludGVudENoYW5nZSB9ID0gY29udGVudENvbnRleHQ7XG4gICAgY29uc3Qgc2NvcGUgPSB7IF9fc2NvcGVNZW51OiBwcm9wcy5fX3Njb3BlTWVudSB9O1xuICAgIGNvbnN0IGNsZWFyT3BlblRpbWVyID0gUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgaWYgKG9wZW5UaW1lclJlZi5jdXJyZW50KSB3aW5kb3cuY2xlYXJUaW1lb3V0KG9wZW5UaW1lclJlZi5jdXJyZW50KTtcbiAgICAgIG9wZW5UaW1lclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9LCBbXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IGNsZWFyT3BlblRpbWVyLCBbY2xlYXJPcGVuVGltZXJdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgcG9pbnRlckdyYWNlVGltZXIgPSBwb2ludGVyR3JhY2VUaW1lclJlZi5jdXJyZW50O1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChwb2ludGVyR3JhY2VUaW1lcik7XG4gICAgICAgIG9uUG9pbnRlckdyYWNlSW50ZW50Q2hhbmdlKG51bGwpO1xuICAgICAgfTtcbiAgICB9LCBbcG9pbnRlckdyYWNlVGltZXJSZWYsIG9uUG9pbnRlckdyYWNlSW50ZW50Q2hhbmdlXSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudUFuY2hvciwgeyBhc0NoaWxkOiB0cnVlLCAuLi5zY29wZSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBNZW51SXRlbUltcGwsXG4gICAgICB7XG4gICAgICAgIGlkOiBzdWJDb250ZXh0LnRyaWdnZXJJZCxcbiAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibWVudVwiLFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogY29udGV4dC5vcGVuLFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjogc3ViQ29udGV4dC5jb250ZW50SWQsXG4gICAgICAgIFwiZGF0YS1zdGF0ZVwiOiBnZXRPcGVuU3RhdGUoY29udGV4dC5vcGVuKSxcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIHJlZjogY29tcG9zZVJlZnMoZm9yd2FyZGVkUmVmLCBzdWJDb250ZXh0Lm9uVHJpZ2dlckNoYW5nZSksXG4gICAgICAgIG9uQ2xpY2s6IChldmVudCkgPT4ge1xuICAgICAgICAgIHByb3BzLm9uQ2xpY2s/LihldmVudCk7XG4gICAgICAgICAgaWYgKHByb3BzLmRpc2FibGVkIHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0LmZvY3VzKCk7XG4gICAgICAgICAgaWYgKCFjb250ZXh0Lm9wZW4pIGNvbnRleHQub25PcGVuQ2hhbmdlKHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblBvaW50ZXJNb3ZlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICBwcm9wcy5vblBvaW50ZXJNb3ZlLFxuICAgICAgICAgIHdoZW5Nb3VzZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnRlbnRDb250ZXh0Lm9uSXRlbUVudGVyKGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIXByb3BzLmRpc2FibGVkICYmICFjb250ZXh0Lm9wZW4gJiYgIW9wZW5UaW1lclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnRlbnRDb250ZXh0Lm9uUG9pbnRlckdyYWNlSW50ZW50Q2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgICBvcGVuVGltZXJSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lm9uT3BlbkNoYW5nZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBjbGVhck9wZW5UaW1lcigpO1xuICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIG9uUG9pbnRlckxlYXZlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICBwcm9wcy5vblBvaW50ZXJMZWF2ZSxcbiAgICAgICAgICB3aGVuTW91c2UoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjbGVhck9wZW5UaW1lcigpO1xuICAgICAgICAgICAgY29uc3QgY29udGVudFJlY3QgPSBjb250ZXh0LmNvbnRlbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRSZWN0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNpZGUgPSBjb250ZXh0LmNvbnRlbnQ/LmRhdGFzZXQuc2lkZTtcbiAgICAgICAgICAgICAgY29uc3QgcmlnaHRTaWRlID0gc2lkZSA9PT0gXCJyaWdodFwiO1xuICAgICAgICAgICAgICBjb25zdCBibGVlZCA9IHJpZ2h0U2lkZSA/IC01IDogNTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGVudE5lYXJFZGdlID0gY29udGVudFJlY3RbcmlnaHRTaWRlID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCJdO1xuICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmFyRWRnZSA9IGNvbnRlbnRSZWN0W3JpZ2h0U2lkZSA/IFwicmlnaHRcIiA6IFwibGVmdFwiXTtcbiAgICAgICAgICAgICAgY29udGVudENvbnRleHQub25Qb2ludGVyR3JhY2VJbnRlbnRDaGFuZ2Uoe1xuICAgICAgICAgICAgICAgIGFyZWE6IFtcbiAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IGEgYmxlZWQgb24gY2xpZW50WCB0byBlbnN1cmUgdGhhdCBvdXIgZXhpdCBwb2ludCBpc1xuICAgICAgICAgICAgICAgICAgLy8gY29uc2lzdGVudGx5IHdpdGhpbiBwb2x5Z29uIGJvdW5kc1xuICAgICAgICAgICAgICAgICAgeyB4OiBldmVudC5jbGllbnRYICsgYmxlZWQsIHk6IGV2ZW50LmNsaWVudFkgfSxcbiAgICAgICAgICAgICAgICAgIHsgeDogY29udGVudE5lYXJFZGdlLCB5OiBjb250ZW50UmVjdC50b3AgfSxcbiAgICAgICAgICAgICAgICAgIHsgeDogY29udGVudEZhckVkZ2UsIHk6IGNvbnRlbnRSZWN0LnRvcCB9LFxuICAgICAgICAgICAgICAgICAgeyB4OiBjb250ZW50RmFyRWRnZSwgeTogY29udGVudFJlY3QuYm90dG9tIH0sXG4gICAgICAgICAgICAgICAgICB7IHg6IGNvbnRlbnROZWFyRWRnZSwgeTogY29udGVudFJlY3QuYm90dG9tIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHNpZGVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQocG9pbnRlckdyYWNlVGltZXJSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgIHBvaW50ZXJHcmFjZVRpbWVyUmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAoKSA9PiBjb250ZW50Q29udGV4dC5vblBvaW50ZXJHcmFjZUludGVudENoYW5nZShudWxsKSxcbiAgICAgICAgICAgICAgICAzMDBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnRlbnRDb250ZXh0Lm9uVHJpZ2dlckxlYXZlKGV2ZW50KTtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgY29udGVudENvbnRleHQub25Qb2ludGVyR3JhY2VJbnRlbnRDaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgb25LZXlEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbktleURvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzVHlwaW5nQWhlYWQgPSBjb250ZW50Q29udGV4dC5zZWFyY2hSZWYuY3VycmVudCAhPT0gXCJcIjtcbiAgICAgICAgICBpZiAocHJvcHMuZGlzYWJsZWQgfHwgaXNUeXBpbmdBaGVhZCAmJiBldmVudC5rZXkgPT09IFwiIFwiKSByZXR1cm47XG4gICAgICAgICAgaWYgKFNVQl9PUEVOX0tFWVNbcm9vdENvbnRleHQuZGlyXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgICAgICBjb250ZXh0Lm9uT3BlbkNoYW5nZSh0cnVlKTtcbiAgICAgICAgICAgIGNvbnRleHQuY29udGVudD8uZm9jdXMoKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICkgfSk7XG4gIH1cbik7XG5NZW51U3ViVHJpZ2dlci5kaXNwbGF5TmFtZSA9IFNVQl9UUklHR0VSX05BTUU7XG52YXIgU1VCX0NPTlRFTlRfTkFNRSA9IFwiTWVudVN1YkNvbnRlbnRcIjtcbnZhciBNZW51U3ViQ29udGVudCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgcG9ydGFsQ29udGV4dCA9IHVzZVBvcnRhbENvbnRleHQoQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3QgeyBmb3JjZU1vdW50ID0gcG9ydGFsQ29udGV4dC5mb3JjZU1vdW50LCAuLi5zdWJDb250ZW50UHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VNZW51Q29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByb290Q29udGV4dCA9IHVzZU1lbnVSb290Q29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBzdWJDb250ZXh0ID0gdXNlTWVudVN1YkNvbnRleHQoU1VCX0NPTlRFTlRfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbGxlY3Rpb24uUHJvdmlkZXIsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVNZW51LCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChQcmVzZW5jZSwgeyBwcmVzZW50OiBmb3JjZU1vdW50IHx8IGNvbnRleHQub3BlbiwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goQ29sbGVjdGlvbi5TbG90LCB7IHNjb3BlOiBwcm9wcy5fX3Njb3BlTWVudSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBNZW51Q29udGVudEltcGwsXG4gICAgICB7XG4gICAgICAgIGlkOiBzdWJDb250ZXh0LmNvbnRlbnRJZCxcbiAgICAgICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogc3ViQ29udGV4dC50cmlnZ2VySWQsXG4gICAgICAgIC4uLnN1YkNvbnRlbnRQcm9wcyxcbiAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgIGFsaWduOiBcInN0YXJ0XCIsXG4gICAgICAgIHNpZGU6IHJvb3RDb250ZXh0LmRpciA9PT0gXCJydGxcIiA/IFwibGVmdFwiIDogXCJyaWdodFwiLFxuICAgICAgICBkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlT3V0c2lkZVNjcm9sbDogZmFsc2UsXG4gICAgICAgIHRyYXBGb2N1czogZmFsc2UsXG4gICAgICAgIG9uT3BlbkF1dG9Gb2N1czogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKHJvb3RDb250ZXh0LmlzVXNpbmdLZXlib2FyZFJlZi5jdXJyZW50KSByZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9LFxuICAgICAgICBvbkNsb3NlQXV0b0ZvY3VzOiAoZXZlbnQpID0+IGV2ZW50LnByZXZlbnREZWZhdWx0KCksXG4gICAgICAgIG9uRm9jdXNPdXRzaWRlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkZvY3VzT3V0c2lkZSwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gc3ViQ29udGV4dC50cmlnZ2VyKSBjb250ZXh0Lm9uT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgICAgIH0pLFxuICAgICAgICBvbkVzY2FwZUtleURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uRXNjYXBlS2V5RG93biwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgcm9vdENvbnRleHQub25DbG9zZSgpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pLFxuICAgICAgICBvbktleURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uS2V5RG93biwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNLZXlEb3duSW5zaWRlID0gZXZlbnQuY3VycmVudFRhcmdldC5jb250YWlucyhldmVudC50YXJnZXQpO1xuICAgICAgICAgIGNvbnN0IGlzQ2xvc2VLZXkgPSBTVUJfQ0xPU0VfS0VZU1tyb290Q29udGV4dC5kaXJdLmluY2x1ZGVzKGV2ZW50LmtleSk7XG4gICAgICAgICAgaWYgKGlzS2V5RG93bkluc2lkZSAmJiBpc0Nsb3NlS2V5KSB7XG4gICAgICAgICAgICBjb250ZXh0Lm9uT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgICAgICAgICBzdWJDb250ZXh0LnRyaWdnZXI/LmZvY3VzKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICApIH0pIH0pIH0pO1xuICB9XG4pO1xuTWVudVN1YkNvbnRlbnQuZGlzcGxheU5hbWUgPSBTVUJfQ09OVEVOVF9OQU1FO1xuZnVuY3Rpb24gZ2V0T3BlblN0YXRlKG9wZW4pIHtcbiAgcmV0dXJuIG9wZW4gPyBcIm9wZW5cIiA6IFwiY2xvc2VkXCI7XG59XG5mdW5jdGlvbiBpc0luZGV0ZXJtaW5hdGUoY2hlY2tlZCkge1xuICByZXR1cm4gY2hlY2tlZCA9PT0gXCJpbmRldGVybWluYXRlXCI7XG59XG5mdW5jdGlvbiBnZXRDaGVja2VkU3RhdGUoY2hlY2tlZCkge1xuICByZXR1cm4gaXNJbmRldGVybWluYXRlKGNoZWNrZWQpID8gXCJpbmRldGVybWluYXRlXCIgOiBjaGVja2VkID8gXCJjaGVja2VkXCIgOiBcInVuY2hlY2tlZFwiO1xufVxuZnVuY3Rpb24gZm9jdXNGaXJzdChjYW5kaWRhdGVzKSB7XG4gIGNvbnN0IFBSRVZJT1VTTFlfRk9DVVNFRF9FTEVNRU5UID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChjYW5kaWRhdGUgPT09IFBSRVZJT1VTTFlfRk9DVVNFRF9FTEVNRU5UKSByZXR1cm47XG4gICAgY2FuZGlkYXRlLmZvY3VzKCk7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IFBSRVZJT1VTTFlfRk9DVVNFRF9FTEVNRU5UKSByZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHdyYXBBcnJheShhcnJheSwgc3RhcnRJbmRleCkge1xuICByZXR1cm4gYXJyYXkubWFwKChfLCBpbmRleCkgPT4gYXJyYXlbKHN0YXJ0SW5kZXggKyBpbmRleCkgJSBhcnJheS5sZW5ndGhdKTtcbn1cbmZ1bmN0aW9uIGdldE5leHRNYXRjaCh2YWx1ZXMsIHNlYXJjaCwgY3VycmVudE1hdGNoKSB7XG4gIGNvbnN0IGlzUmVwZWF0ZWQgPSBzZWFyY2gubGVuZ3RoID4gMSAmJiBBcnJheS5mcm9tKHNlYXJjaCkuZXZlcnkoKGNoYXIpID0+IGNoYXIgPT09IHNlYXJjaFswXSk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBpc1JlcGVhdGVkID8gc2VhcmNoWzBdIDogc2VhcmNoO1xuICBjb25zdCBjdXJyZW50TWF0Y2hJbmRleCA9IGN1cnJlbnRNYXRjaCA/IHZhbHVlcy5pbmRleE9mKGN1cnJlbnRNYXRjaCkgOiAtMTtcbiAgbGV0IHdyYXBwZWRWYWx1ZXMgPSB3cmFwQXJyYXkodmFsdWVzLCBNYXRoLm1heChjdXJyZW50TWF0Y2hJbmRleCwgMCkpO1xuICBjb25zdCBleGNsdWRlQ3VycmVudE1hdGNoID0gbm9ybWFsaXplZFNlYXJjaC5sZW5ndGggPT09IDE7XG4gIGlmIChleGNsdWRlQ3VycmVudE1hdGNoKSB3cmFwcGVkVmFsdWVzID0gd3JhcHBlZFZhbHVlcy5maWx0ZXIoKHYpID0+IHYgIT09IGN1cnJlbnRNYXRjaCk7XG4gIGNvbnN0IG5leHRNYXRjaCA9IHdyYXBwZWRWYWx1ZXMuZmluZChcbiAgICAodmFsdWUpID0+IHZhbHVlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChub3JtYWxpemVkU2VhcmNoLnRvTG93ZXJDYXNlKCkpXG4gICk7XG4gIHJldHVybiBuZXh0TWF0Y2ggIT09IGN1cnJlbnRNYXRjaCA/IG5leHRNYXRjaCA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzUG9pbnRJblBvbHlnb24ocG9pbnQsIHBvbHlnb24pIHtcbiAgY29uc3QgeyB4LCB5IH0gPSBwb2ludDtcbiAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMCwgaiA9IHBvbHlnb24ubGVuZ3RoIC0gMTsgaSA8IHBvbHlnb24ubGVuZ3RoOyBqID0gaSsrKSB7XG4gICAgY29uc3QgeGkgPSBwb2x5Z29uW2ldLng7XG4gICAgY29uc3QgeWkgPSBwb2x5Z29uW2ldLnk7XG4gICAgY29uc3QgeGogPSBwb2x5Z29uW2pdLng7XG4gICAgY29uc3QgeWogPSBwb2x5Z29uW2pdLnk7XG4gICAgY29uc3QgaW50ZXJzZWN0ID0geWkgPiB5ICE9PSB5aiA+IHkgJiYgeCA8ICh4aiAtIHhpKSAqICh5IC0geWkpIC8gKHlqIC0geWkpICsgeGk7XG4gICAgaWYgKGludGVyc2VjdCkgaW5zaWRlID0gIWluc2lkZTtcbiAgfVxuICByZXR1cm4gaW5zaWRlO1xufVxuZnVuY3Rpb24gaXNQb2ludGVySW5HcmFjZUFyZWEoZXZlbnQsIGFyZWEpIHtcbiAgaWYgKCFhcmVhKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGN1cnNvclBvcyA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9O1xuICByZXR1cm4gaXNQb2ludEluUG9seWdvbihjdXJzb3JQb3MsIGFyZWEpO1xufVxuZnVuY3Rpb24gd2hlbk1vdXNlKGhhbmRsZXIpIHtcbiAgcmV0dXJuIChldmVudCkgPT4gZXZlbnQucG9pbnRlclR5cGUgPT09IFwibW91c2VcIiA/IGhhbmRsZXIoZXZlbnQpIDogdm9pZCAwO1xufVxudmFyIFJvb3QzID0gTWVudTtcbnZhciBBbmNob3IyID0gTWVudUFuY2hvcjtcbnZhciBQb3J0YWwgPSBNZW51UG9ydGFsO1xudmFyIENvbnRlbnQyID0gTWVudUNvbnRlbnQ7XG52YXIgR3JvdXAgPSBNZW51R3JvdXA7XG52YXIgTGFiZWwgPSBNZW51TGFiZWw7XG52YXIgSXRlbTIgPSBNZW51SXRlbTtcbnZhciBDaGVja2JveEl0ZW0gPSBNZW51Q2hlY2tib3hJdGVtO1xudmFyIFJhZGlvR3JvdXAgPSBNZW51UmFkaW9Hcm91cDtcbnZhciBSYWRpb0l0ZW0gPSBNZW51UmFkaW9JdGVtO1xudmFyIEl0ZW1JbmRpY2F0b3IgPSBNZW51SXRlbUluZGljYXRvcjtcbnZhciBTZXBhcmF0b3IgPSBNZW51U2VwYXJhdG9yO1xudmFyIEFycm93MiA9IE1lbnVBcnJvdztcbnZhciBTdWIgPSBNZW51U3ViO1xudmFyIFN1YlRyaWdnZXIgPSBNZW51U3ViVHJpZ2dlcjtcbnZhciBTdWJDb250ZW50ID0gTWVudVN1YkNvbnRlbnQ7XG5leHBvcnQge1xuICBBbmNob3IyIGFzIEFuY2hvcixcbiAgQXJyb3cyIGFzIEFycm93LFxuICBDaGVja2JveEl0ZW0sXG4gIENvbnRlbnQyIGFzIENvbnRlbnQsXG4gIEdyb3VwLFxuICBJdGVtMiBhcyBJdGVtLFxuICBJdGVtSW5kaWNhdG9yLFxuICBMYWJlbCxcbiAgTWVudSxcbiAgTWVudUFuY2hvcixcbiAgTWVudUFycm93LFxuICBNZW51Q2hlY2tib3hJdGVtLFxuICBNZW51Q29udGVudCxcbiAgTWVudUdyb3VwLFxuICBNZW51SXRlbSxcbiAgTWVudUl0ZW1JbmRpY2F0b3IsXG4gIE1lbnVMYWJlbCxcbiAgTWVudVBvcnRhbCxcbiAgTWVudVJhZGlvR3JvdXAsXG4gIE1lbnVSYWRpb0l0ZW0sXG4gIE1lbnVTZXBhcmF0b3IsXG4gIE1lbnVTdWIsXG4gIE1lbnVTdWJDb250ZW50LFxuICBNZW51U3ViVHJpZ2dlcixcbiAgUG9ydGFsLFxuICBSYWRpb0dyb3VwLFxuICBSYWRpb0l0ZW0sXG4gIFJvb3QzIGFzIFJvb3QsXG4gIFNlcGFyYXRvcixcbiAgU3ViLFxuICBTdWJDb250ZW50LFxuICBTdWJUcmlnZ2VyLFxuICBjcmVhdGVNZW51U2NvcGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvcG9wcGVyL3NyYy9Qb3BwZXIudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIHVzZUZsb2F0aW5nLFxuICBhdXRvVXBkYXRlLFxuICBvZmZzZXQsXG4gIHNoaWZ0LFxuICBsaW1pdFNoaWZ0LFxuICBoaWRlLFxuICBhcnJvdyBhcyBmbG9hdGluZ1VJYXJyb3csXG4gIGZsaXAsXG4gIHNpemVcbn0gZnJvbSBcIkBmbG9hdGluZy11aS9yZWFjdC1kb21cIjtcbmltcG9ydCAqIGFzIEFycm93UHJpbWl0aXZlIGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtYXJyb3dcIjtcbmltcG9ydCB7IHVzZUNvbXBvc2VkUmVmcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzXCI7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0U2NvcGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbnRleHRcIjtcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZlwiO1xuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtbGF5b3V0LWVmZmVjdFwiO1xuaW1wb3J0IHsgdXNlU2l6ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLXNpemVcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIFNJREVfT1BUSU9OUyA9IFtcInRvcFwiLCBcInJpZ2h0XCIsIFwiYm90dG9tXCIsIFwibGVmdFwiXTtcbnZhciBBTElHTl9PUFRJT05TID0gW1wic3RhcnRcIiwgXCJjZW50ZXJcIiwgXCJlbmRcIl07XG52YXIgUE9QUEVSX05BTUUgPSBcIlBvcHBlclwiO1xudmFyIFtjcmVhdGVQb3BwZXJDb250ZXh0LCBjcmVhdGVQb3BwZXJTY29wZV0gPSBjcmVhdGVDb250ZXh0U2NvcGUoUE9QUEVSX05BTUUpO1xudmFyIFtQb3BwZXJQcm92aWRlciwgdXNlUG9wcGVyQ29udGV4dF0gPSBjcmVhdGVQb3BwZXJDb250ZXh0KFBPUFBFUl9OQU1FKTtcbnZhciBQb3BwZXIgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlUG9wcGVyLCBjaGlsZHJlbiB9ID0gcHJvcHM7XG4gIGNvbnN0IFthbmNob3IsIHNldEFuY2hvcl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUG9wcGVyUHJvdmlkZXIsIHsgc2NvcGU6IF9fc2NvcGVQb3BwZXIsIGFuY2hvciwgb25BbmNob3JDaGFuZ2U6IHNldEFuY2hvciwgY2hpbGRyZW4gfSk7XG59O1xuUG9wcGVyLmRpc3BsYXlOYW1lID0gUE9QUEVSX05BTUU7XG52YXIgQU5DSE9SX05BTUUgPSBcIlBvcHBlckFuY2hvclwiO1xudmFyIFBvcHBlckFuY2hvciA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlUG9wcGVyLCB2aXJ0dWFsUmVmLCAuLi5hbmNob3JQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZVBvcHBlckNvbnRleHQoQU5DSE9SX05BTUUsIF9fc2NvcGVQb3BwZXIpO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb250ZXh0Lm9uQW5jaG9yQ2hhbmdlKHZpcnR1YWxSZWY/LmN1cnJlbnQgfHwgcmVmLmN1cnJlbnQpO1xuICAgIH0pO1xuICAgIHJldHVybiB2aXJ0dWFsUmVmID8gbnVsbCA6IC8qIEBfX1BVUkVfXyAqLyBqc3goUHJpbWl0aXZlLmRpdiwgeyAuLi5hbmNob3JQcm9wcywgcmVmOiBjb21wb3NlZFJlZnMgfSk7XG4gIH1cbik7XG5Qb3BwZXJBbmNob3IuZGlzcGxheU5hbWUgPSBBTkNIT1JfTkFNRTtcbnZhciBDT05URU5UX05BTUUgPSBcIlBvcHBlckNvbnRlbnRcIjtcbnZhciBbUG9wcGVyQ29udGVudFByb3ZpZGVyLCB1c2VDb250ZW50Q29udGV4dF0gPSBjcmVhdGVQb3BwZXJDb250ZXh0KENPTlRFTlRfTkFNRSk7XG52YXIgUG9wcGVyQ29udGVudCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgX19zY29wZVBvcHBlcixcbiAgICAgIHNpZGUgPSBcImJvdHRvbVwiLFxuICAgICAgc2lkZU9mZnNldCA9IDAsXG4gICAgICBhbGlnbiA9IFwiY2VudGVyXCIsXG4gICAgICBhbGlnbk9mZnNldCA9IDAsXG4gICAgICBhcnJvd1BhZGRpbmcgPSAwLFxuICAgICAgYXZvaWRDb2xsaXNpb25zID0gdHJ1ZSxcbiAgICAgIGNvbGxpc2lvbkJvdW5kYXJ5ID0gW10sXG4gICAgICBjb2xsaXNpb25QYWRkaW5nOiBjb2xsaXNpb25QYWRkaW5nUHJvcCA9IDAsXG4gICAgICBzdGlja3kgPSBcInBhcnRpYWxcIixcbiAgICAgIGhpZGVXaGVuRGV0YWNoZWQgPSBmYWxzZSxcbiAgICAgIHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kgPSBcIm9wdGltaXplZFwiLFxuICAgICAgb25QbGFjZWQsXG4gICAgICAuLi5jb250ZW50UHJvcHNcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZVBvcHBlckNvbnRleHQoQ09OVEVOVF9OQU1FLCBfX3Njb3BlUG9wcGVyKTtcbiAgICBjb25zdCBbY29udGVudCwgc2V0Q29udGVudF0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCAobm9kZSkgPT4gc2V0Q29udGVudChub2RlKSk7XG4gICAgY29uc3QgW2Fycm93LCBzZXRBcnJvd10gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBhcnJvd1NpemUgPSB1c2VTaXplKGFycm93KTtcbiAgICBjb25zdCBhcnJvd1dpZHRoID0gYXJyb3dTaXplPy53aWR0aCA/PyAwO1xuICAgIGNvbnN0IGFycm93SGVpZ2h0ID0gYXJyb3dTaXplPy5oZWlnaHQgPz8gMDtcbiAgICBjb25zdCBkZXNpcmVkUGxhY2VtZW50ID0gc2lkZSArIChhbGlnbiAhPT0gXCJjZW50ZXJcIiA/IFwiLVwiICsgYWxpZ24gOiBcIlwiKTtcbiAgICBjb25zdCBjb2xsaXNpb25QYWRkaW5nID0gdHlwZW9mIGNvbGxpc2lvblBhZGRpbmdQcm9wID09PSBcIm51bWJlclwiID8gY29sbGlzaW9uUGFkZGluZ1Byb3AgOiB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMCwgLi4uY29sbGlzaW9uUGFkZGluZ1Byb3AgfTtcbiAgICBjb25zdCBib3VuZGFyeSA9IEFycmF5LmlzQXJyYXkoY29sbGlzaW9uQm91bmRhcnkpID8gY29sbGlzaW9uQm91bmRhcnkgOiBbY29sbGlzaW9uQm91bmRhcnldO1xuICAgIGNvbnN0IGhhc0V4cGxpY2l0Qm91bmRhcmllcyA9IGJvdW5kYXJ5Lmxlbmd0aCA+IDA7XG4gICAgY29uc3QgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zID0ge1xuICAgICAgcGFkZGluZzogY29sbGlzaW9uUGFkZGluZyxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeS5maWx0ZXIoaXNOb3ROdWxsKSxcbiAgICAgIC8vIHdpdGggYHN0cmF0ZWd5OiAnZml4ZWQnYCwgdGhpcyBpcyB0aGUgb25seSB3YXkgdG8gZ2V0IGl0IHRvIHJlc3BlY3QgYm91bmRhcmllc1xuICAgICAgYWx0Qm91bmRhcnk6IGhhc0V4cGxpY2l0Qm91bmRhcmllc1xuICAgIH07XG4gICAgY29uc3QgeyByZWZzLCBmbG9hdGluZ1N0eWxlcywgcGxhY2VtZW50LCBpc1Bvc2l0aW9uZWQsIG1pZGRsZXdhcmVEYXRhIH0gPSB1c2VGbG9hdGluZyh7XG4gICAgICAvLyBkZWZhdWx0IHRvIGBmaXhlZGAgc3RyYXRlZ3kgc28gdXNlcnMgZG9uJ3QgaGF2ZSB0byBwaWNrIGFuZCB3ZSBhbHNvIGF2b2lkIGZvY3VzIHNjcm9sbCBpc3N1ZXNcbiAgICAgIHN0cmF0ZWd5OiBcImZpeGVkXCIsXG4gICAgICBwbGFjZW1lbnQ6IGRlc2lyZWRQbGFjZW1lbnQsXG4gICAgICB3aGlsZUVsZW1lbnRzTW91bnRlZDogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cCA9IGF1dG9VcGRhdGUoLi4uYXJncywge1xuICAgICAgICAgIGFuaW1hdGlvbkZyYW1lOiB1cGRhdGVQb3NpdGlvblN0cmF0ZWd5ID09PSBcImFsd2F5c1wiXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2xlYW51cDtcbiAgICAgIH0sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2U6IGNvbnRleHQuYW5jaG9yXG4gICAgICB9LFxuICAgICAgbWlkZGxld2FyZTogW1xuICAgICAgICBvZmZzZXQoeyBtYWluQXhpczogc2lkZU9mZnNldCArIGFycm93SGVpZ2h0LCBhbGlnbm1lbnRBeGlzOiBhbGlnbk9mZnNldCB9KSxcbiAgICAgICAgYXZvaWRDb2xsaXNpb25zICYmIHNoaWZ0KHtcbiAgICAgICAgICBtYWluQXhpczogdHJ1ZSxcbiAgICAgICAgICBjcm9zc0F4aXM6IGZhbHNlLFxuICAgICAgICAgIGxpbWl0ZXI6IHN0aWNreSA9PT0gXCJwYXJ0aWFsXCIgPyBsaW1pdFNoaWZ0KCkgOiB2b2lkIDAsXG4gICAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgICAgIH0pLFxuICAgICAgICBhdm9pZENvbGxpc2lvbnMgJiYgZmxpcCh7IC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyB9KSxcbiAgICAgICAgc2l6ZSh7XG4gICAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zLFxuICAgICAgICAgIGFwcGx5OiAoeyBlbGVtZW50cywgcmVjdHMsIGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB3aWR0aDogYW5jaG9yV2lkdGgsIGhlaWdodDogYW5jaG9ySGVpZ2h0IH0gPSByZWN0cy5yZWZlcmVuY2U7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50U3R5bGUgPSBlbGVtZW50cy5mbG9hdGluZy5zdHlsZTtcbiAgICAgICAgICAgIGNvbnRlbnRTdHlsZS5zZXRQcm9wZXJ0eShcIi0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS13aWR0aFwiLCBgJHthdmFpbGFibGVXaWR0aH1weGApO1xuICAgICAgICAgICAgY29udGVudFN0eWxlLnNldFByb3BlcnR5KFwiLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLWhlaWdodFwiLCBgJHthdmFpbGFibGVIZWlnaHR9cHhgKTtcbiAgICAgICAgICAgIGNvbnRlbnRTdHlsZS5zZXRQcm9wZXJ0eShcIi0tcmFkaXgtcG9wcGVyLWFuY2hvci13aWR0aFwiLCBgJHthbmNob3JXaWR0aH1weGApO1xuICAgICAgICAgICAgY29udGVudFN0eWxlLnNldFByb3BlcnR5KFwiLS1yYWRpeC1wb3BwZXItYW5jaG9yLWhlaWdodFwiLCBgJHthbmNob3JIZWlnaHR9cHhgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBhcnJvdyAmJiBmbG9hdGluZ1VJYXJyb3coeyBlbGVtZW50OiBhcnJvdywgcGFkZGluZzogYXJyb3dQYWRkaW5nIH0pLFxuICAgICAgICB0cmFuc2Zvcm1PcmlnaW4oeyBhcnJvd1dpZHRoLCBhcnJvd0hlaWdodCB9KSxcbiAgICAgICAgaGlkZVdoZW5EZXRhY2hlZCAmJiBoaWRlKHsgc3RyYXRlZ3k6IFwicmVmZXJlbmNlSGlkZGVuXCIsIC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyB9KVxuICAgICAgXVxuICAgIH0pO1xuICAgIGNvbnN0IFtwbGFjZWRTaWRlLCBwbGFjZWRBbGlnbl0gPSBnZXRTaWRlQW5kQWxpZ25Gcm9tUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gICAgY29uc3QgaGFuZGxlUGxhY2VkID0gdXNlQ2FsbGJhY2tSZWYob25QbGFjZWQpO1xuICAgIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoaXNQb3NpdGlvbmVkKSB7XG4gICAgICAgIGhhbmRsZVBsYWNlZD8uKCk7XG4gICAgICB9XG4gICAgfSwgW2lzUG9zaXRpb25lZCwgaGFuZGxlUGxhY2VkXSk7XG4gICAgY29uc3QgYXJyb3dYID0gbWlkZGxld2FyZURhdGEuYXJyb3c/Lng7XG4gICAgY29uc3QgYXJyb3dZID0gbWlkZGxld2FyZURhdGEuYXJyb3c/Lnk7XG4gICAgY29uc3QgY2Fubm90Q2VudGVyQXJyb3cgPSBtaWRkbGV3YXJlRGF0YS5hcnJvdz8uY2VudGVyT2Zmc2V0ICE9PSAwO1xuICAgIGNvbnN0IFtjb250ZW50WkluZGV4LCBzZXRDb250ZW50WkluZGV4XSA9IFJlYWN0LnVzZVN0YXRlKCk7XG4gICAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgIGlmIChjb250ZW50KSBzZXRDb250ZW50WkluZGV4KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNvbnRlbnQpLnpJbmRleCk7XG4gICAgfSwgW2NvbnRlbnRdKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7XG4gICAgICAgIHJlZjogcmVmcy5zZXRGbG9hdGluZyxcbiAgICAgICAgXCJkYXRhLXJhZGl4LXBvcHBlci1jb250ZW50LXdyYXBwZXJcIjogXCJcIixcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAuLi5mbG9hdGluZ1N0eWxlcyxcbiAgICAgICAgICB0cmFuc2Zvcm06IGlzUG9zaXRpb25lZCA/IGZsb2F0aW5nU3R5bGVzLnRyYW5zZm9ybSA6IFwidHJhbnNsYXRlKDAsIC0yMDAlKVwiLFxuICAgICAgICAgIC8vIGtlZXAgb2ZmIHRoZSBwYWdlIHdoZW4gbWVhc3VyaW5nXG4gICAgICAgICAgbWluV2lkdGg6IFwibWF4LWNvbnRlbnRcIixcbiAgICAgICAgICB6SW5kZXg6IGNvbnRlbnRaSW5kZXgsXG4gICAgICAgICAgW1wiLS1yYWRpeC1wb3BwZXItdHJhbnNmb3JtLW9yaWdpblwiXTogW1xuICAgICAgICAgICAgbWlkZGxld2FyZURhdGEudHJhbnNmb3JtT3JpZ2luPy54LFxuICAgICAgICAgICAgbWlkZGxld2FyZURhdGEudHJhbnNmb3JtT3JpZ2luPy55XG4gICAgICAgICAgXS5qb2luKFwiIFwiKSxcbiAgICAgICAgICAvLyBoaWRlIHRoZSBjb250ZW50IGlmIHVzaW5nIHRoZSBoaWRlIG1pZGRsZXdhcmUgYW5kIHNob3VsZCBiZSBoaWRkZW5cbiAgICAgICAgICAvLyBzZXQgdmlzaWJpbGl0eSB0byBoaWRkZW4gYW5kIGRpc2FibGUgcG9pbnRlciBldmVudHMgc28gdGhlIFVJIGJlaGF2ZXNcbiAgICAgICAgICAvLyBhcyBpZiB0aGUgUG9wcGVyQ29udGVudCBpc24ndCB0aGVyZSBhdCBhbGxcbiAgICAgICAgICAuLi5taWRkbGV3YXJlRGF0YS5oaWRlPy5yZWZlcmVuY2VIaWRkZW4gJiYge1xuICAgICAgICAgICAgdmlzaWJpbGl0eTogXCJoaWRkZW5cIixcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkaXI6IHByb3BzLmRpcixcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgUG9wcGVyQ29udGVudFByb3ZpZGVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjb3BlOiBfX3Njb3BlUG9wcGVyLFxuICAgICAgICAgICAgcGxhY2VkU2lkZSxcbiAgICAgICAgICAgIG9uQXJyb3dDaGFuZ2U6IHNldEFycm93LFxuICAgICAgICAgICAgYXJyb3dYLFxuICAgICAgICAgICAgYXJyb3dZLFxuICAgICAgICAgICAgc2hvdWxkSGlkZUFycm93OiBjYW5ub3RDZW50ZXJBcnJvdyxcbiAgICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgICAgICBQcmltaXRpdmUuZGl2LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJkYXRhLXNpZGVcIjogcGxhY2VkU2lkZSxcbiAgICAgICAgICAgICAgICBcImRhdGEtYWxpZ25cIjogcGxhY2VkQWxpZ24sXG4gICAgICAgICAgICAgICAgLi4uY29udGVudFByb3BzLFxuICAgICAgICAgICAgICAgIHJlZjogY29tcG9zZWRSZWZzLFxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAuLi5jb250ZW50UHJvcHMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgUG9wcGVyQ29udGVudCBoYXNuJ3QgYmVlbiBwbGFjZWQgeWV0IChub3QgYWxsIG1lYXN1cmVtZW50cyBkb25lKVxuICAgICAgICAgICAgICAgICAgLy8gd2UgcHJldmVudCBhbmltYXRpb25zIHNvIHRoYXQgdXNlcnMncyBhbmltYXRpb24gZG9uJ3Qga2ljayBpbiB0b28gZWFybHkgcmVmZXJyaW5nIHdyb25nIHNpZGVzXG4gICAgICAgICAgICAgICAgICBhbmltYXRpb246ICFpc1Bvc2l0aW9uZWQgPyBcIm5vbmVcIiA6IHZvaWQgMFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5Qb3BwZXJDb250ZW50LmRpc3BsYXlOYW1lID0gQ09OVEVOVF9OQU1FO1xudmFyIEFSUk9XX05BTUUgPSBcIlBvcHBlckFycm93XCI7XG52YXIgT1BQT1NJVEVfU0lERSA9IHtcbiAgdG9wOiBcImJvdHRvbVwiLFxuICByaWdodDogXCJsZWZ0XCIsXG4gIGJvdHRvbTogXCJ0b3BcIixcbiAgbGVmdDogXCJyaWdodFwiXG59O1xudmFyIFBvcHBlckFycm93ID0gUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBQb3BwZXJBcnJvdzIocHJvcHMsIGZvcndhcmRlZFJlZikge1xuICBjb25zdCB7IF9fc2NvcGVQb3BwZXIsIC4uLmFycm93UHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBjb250ZW50Q29udGV4dCA9IHVzZUNvbnRlbnRDb250ZXh0KEFSUk9XX05BTUUsIF9fc2NvcGVQb3BwZXIpO1xuICBjb25zdCBiYXNlU2lkZSA9IE9QUE9TSVRFX1NJREVbY29udGVudENvbnRleHQucGxhY2VkU2lkZV07XG4gIHJldHVybiAoXG4gICAgLy8gd2UgaGF2ZSB0byB1c2UgYW4gZXh0cmEgd3JhcHBlciBiZWNhdXNlIGBSZXNpemVPYnNlcnZlcmAgKHVzZWQgYnkgYHVzZVNpemVgKVxuICAgIC8vIGRvZXNuJ3QgcmVwb3J0IHNpemUgYXMgd2UnZCBleHBlY3Qgb24gU1ZHIGVsZW1lbnRzLlxuICAgIC8vIGl0IHJlcG9ydHMgdGhlaXIgYm91bmRpbmcgYm94IHdoaWNoIGlzIGVmZmVjdGl2ZWx5IHRoZSBsYXJnZXN0IHBhdGggaW5zaWRlIHRoZSBTVkcuXG4gICAgLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIFwic3BhblwiLFxuICAgICAge1xuICAgICAgICByZWY6IGNvbnRlbnRDb250ZXh0Lm9uQXJyb3dDaGFuZ2UsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICBsZWZ0OiBjb250ZW50Q29udGV4dC5hcnJvd1gsXG4gICAgICAgICAgdG9wOiBjb250ZW50Q29udGV4dC5hcnJvd1ksXG4gICAgICAgICAgW2Jhc2VTaWRlXTogMCxcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46IHtcbiAgICAgICAgICAgIHRvcDogXCJcIixcbiAgICAgICAgICAgIHJpZ2h0OiBcIjAgMFwiLFxuICAgICAgICAgICAgYm90dG9tOiBcImNlbnRlciAwXCIsXG4gICAgICAgICAgICBsZWZ0OiBcIjEwMCUgMFwiXG4gICAgICAgICAgfVtjb250ZW50Q29udGV4dC5wbGFjZWRTaWRlXSxcbiAgICAgICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgICAgIHRvcDogXCJ0cmFuc2xhdGVZKDEwMCUpXCIsXG4gICAgICAgICAgICByaWdodDogXCJ0cmFuc2xhdGVZKDUwJSkgcm90YXRlKDkwZGVnKSB0cmFuc2xhdGVYKC01MCUpXCIsXG4gICAgICAgICAgICBib3R0b206IGByb3RhdGUoMTgwZGVnKWAsXG4gICAgICAgICAgICBsZWZ0OiBcInRyYW5zbGF0ZVkoNTAlKSByb3RhdGUoLTkwZGVnKSB0cmFuc2xhdGVYKDUwJSlcIlxuICAgICAgICAgIH1bY29udGVudENvbnRleHQucGxhY2VkU2lkZV0sXG4gICAgICAgICAgdmlzaWJpbGl0eTogY29udGVudENvbnRleHQuc2hvdWxkSGlkZUFycm93ID8gXCJoaWRkZW5cIiA6IHZvaWQgMFxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICBBcnJvd1ByaW1pdGl2ZS5Sb290LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmFycm93UHJvcHMsXG4gICAgICAgICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIC4uLmFycm93UHJvcHMuc3R5bGUsXG4gICAgICAgICAgICAgIC8vIGVuc3VyZXMgdGhlIGVsZW1lbnQgY2FuIGJlIG1lYXN1cmVkIGNvcnJlY3RseSAobW9zdGx5IGZvciBpZiBTVkcpXG4gICAgICAgICAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgIClcbiAgKTtcbn0pO1xuUG9wcGVyQXJyb3cuZGlzcGxheU5hbWUgPSBBUlJPV19OQU1FO1xuZnVuY3Rpb24gaXNOb3ROdWxsKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbDtcbn1cbnZhciB0cmFuc2Zvcm1PcmlnaW4gPSAob3B0aW9ucykgPT4gKHtcbiAgbmFtZTogXCJ0cmFuc2Zvcm1PcmlnaW5cIixcbiAgb3B0aW9ucyxcbiAgZm4oZGF0YSkge1xuICAgIGNvbnN0IHsgcGxhY2VtZW50LCByZWN0cywgbWlkZGxld2FyZURhdGEgfSA9IGRhdGE7XG4gICAgY29uc3QgY2Fubm90Q2VudGVyQXJyb3cgPSBtaWRkbGV3YXJlRGF0YS5hcnJvdz8uY2VudGVyT2Zmc2V0ICE9PSAwO1xuICAgIGNvbnN0IGlzQXJyb3dIaWRkZW4gPSBjYW5ub3RDZW50ZXJBcnJvdztcbiAgICBjb25zdCBhcnJvd1dpZHRoID0gaXNBcnJvd0hpZGRlbiA/IDAgOiBvcHRpb25zLmFycm93V2lkdGg7XG4gICAgY29uc3QgYXJyb3dIZWlnaHQgPSBpc0Fycm93SGlkZGVuID8gMCA6IG9wdGlvbnMuYXJyb3dIZWlnaHQ7XG4gICAgY29uc3QgW3BsYWNlZFNpZGUsIHBsYWNlZEFsaWduXSA9IGdldFNpZGVBbmRBbGlnbkZyb21QbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgICBjb25zdCBub0Fycm93QWxpZ24gPSB7IHN0YXJ0OiBcIjAlXCIsIGNlbnRlcjogXCI1MCVcIiwgZW5kOiBcIjEwMCVcIiB9W3BsYWNlZEFsaWduXTtcbiAgICBjb25zdCBhcnJvd1hDZW50ZXIgPSAobWlkZGxld2FyZURhdGEuYXJyb3c/LnggPz8gMCkgKyBhcnJvd1dpZHRoIC8gMjtcbiAgICBjb25zdCBhcnJvd1lDZW50ZXIgPSAobWlkZGxld2FyZURhdGEuYXJyb3c/LnkgPz8gMCkgKyBhcnJvd0hlaWdodCAvIDI7XG4gICAgbGV0IHggPSBcIlwiO1xuICAgIGxldCB5ID0gXCJcIjtcbiAgICBpZiAocGxhY2VkU2lkZSA9PT0gXCJib3R0b21cIikge1xuICAgICAgeCA9IGlzQXJyb3dIaWRkZW4gPyBub0Fycm93QWxpZ24gOiBgJHthcnJvd1hDZW50ZXJ9cHhgO1xuICAgICAgeSA9IGAkey1hcnJvd0hlaWdodH1weGA7XG4gICAgfSBlbHNlIGlmIChwbGFjZWRTaWRlID09PSBcInRvcFwiKSB7XG4gICAgICB4ID0gaXNBcnJvd0hpZGRlbiA/IG5vQXJyb3dBbGlnbiA6IGAke2Fycm93WENlbnRlcn1weGA7XG4gICAgICB5ID0gYCR7cmVjdHMuZmxvYXRpbmcuaGVpZ2h0ICsgYXJyb3dIZWlnaHR9cHhgO1xuICAgIH0gZWxzZSBpZiAocGxhY2VkU2lkZSA9PT0gXCJyaWdodFwiKSB7XG4gICAgICB4ID0gYCR7LWFycm93SGVpZ2h0fXB4YDtcbiAgICAgIHkgPSBpc0Fycm93SGlkZGVuID8gbm9BcnJvd0FsaWduIDogYCR7YXJyb3dZQ2VudGVyfXB4YDtcbiAgICB9IGVsc2UgaWYgKHBsYWNlZFNpZGUgPT09IFwibGVmdFwiKSB7XG4gICAgICB4ID0gYCR7cmVjdHMuZmxvYXRpbmcud2lkdGggKyBhcnJvd0hlaWdodH1weGA7XG4gICAgICB5ID0gaXNBcnJvd0hpZGRlbiA/IG5vQXJyb3dBbGlnbiA6IGAke2Fycm93WUNlbnRlcn1weGA7XG4gICAgfVxuICAgIHJldHVybiB7IGRhdGE6IHsgeCwgeSB9IH07XG4gIH1cbn0pO1xuZnVuY3Rpb24gZ2V0U2lkZUFuZEFsaWduRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgY29uc3QgW3NpZGUsIGFsaWduID0gXCJjZW50ZXJcIl0gPSBwbGFjZW1lbnQuc3BsaXQoXCItXCIpO1xuICByZXR1cm4gW3NpZGUsIGFsaWduXTtcbn1cbnZhciBSb290MiA9IFBvcHBlcjtcbnZhciBBbmNob3IgPSBQb3BwZXJBbmNob3I7XG52YXIgQ29udGVudCA9IFBvcHBlckNvbnRlbnQ7XG52YXIgQXJyb3cgPSBQb3BwZXJBcnJvdztcbmV4cG9ydCB7XG4gIEFMSUdOX09QVElPTlMsXG4gIEFuY2hvcixcbiAgQXJyb3csXG4gIENvbnRlbnQsXG4gIFBvcHBlcixcbiAgUG9wcGVyQW5jaG9yLFxuICBQb3BwZXJBcnJvdyxcbiAgUG9wcGVyQ29udGVudCxcbiAgUm9vdDIgYXMgUm9vdCxcbiAgU0lERV9PUFRJT05TLFxuICBjcmVhdGVQb3BwZXJTY29wZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9wb3J0YWwvc3JjL1BvcnRhbC50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1sYXlvdXQtZWZmZWN0XCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBQT1JUQUxfTkFNRSA9IFwiUG9ydGFsXCI7XG52YXIgUG9ydGFsID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IGNvbnRhaW5lcjogY29udGFpbmVyUHJvcCwgLi4ucG9ydGFsUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBbbW91bnRlZCwgc2V0TW91bnRlZF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiBzZXRNb3VudGVkKHRydWUpLCBbXSk7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGNvbnRhaW5lclByb3AgfHwgbW91bnRlZCAmJiBnbG9iYWxUaGlzPy5kb2N1bWVudD8uYm9keTtcbiAgcmV0dXJuIGNvbnRhaW5lciA/IFJlYWN0RE9NLmNyZWF0ZVBvcnRhbCgvKiBAX19QVVJFX18gKi8ganN4KFByaW1pdGl2ZS5kaXYsIHsgLi4ucG9ydGFsUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pLCBjb250YWluZXIpIDogbnVsbDtcbn0pO1xuUG9ydGFsLmRpc3BsYXlOYW1lID0gUE9SVEFMX05BTUU7XG52YXIgUm9vdCA9IFBvcnRhbDtcbmV4cG9ydCB7XG4gIFBvcnRhbCxcbiAgUm9vdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9wcmVzZW5jZS9zcmMvUHJlc2VuY2UudHN4XG5pbXBvcnQgKiBhcyBSZWFjdDIgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtbGF5b3V0LWVmZmVjdFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9wcmVzZW5jZS9zcmMvdXNlU3RhdGVNYWNoaW5lLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5mdW5jdGlvbiB1c2VTdGF0ZU1hY2hpbmUoaW5pdGlhbFN0YXRlLCBtYWNoaW5lKSB7XG4gIHJldHVybiBSZWFjdC51c2VSZWR1Y2VyKChzdGF0ZSwgZXZlbnQpID0+IHtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSBtYWNoaW5lW3N0YXRlXVtldmVudF07XG4gICAgcmV0dXJuIG5leHRTdGF0ZSA/PyBzdGF0ZTtcbiAgfSwgaW5pdGlhbFN0YXRlKTtcbn1cblxuLy8gcGFja2FnZXMvcmVhY3QvcHJlc2VuY2Uvc3JjL1ByZXNlbmNlLnRzeFxudmFyIFByZXNlbmNlID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgcHJlc2VudCwgY2hpbGRyZW4gfSA9IHByb3BzO1xuICBjb25zdCBwcmVzZW5jZSA9IHVzZVByZXNlbmNlKHByZXNlbnQpO1xuICBjb25zdCBjaGlsZCA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiID8gY2hpbGRyZW4oeyBwcmVzZW50OiBwcmVzZW5jZS5pc1ByZXNlbnQgfSkgOiBSZWFjdDIuQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG4gIGNvbnN0IHJlZiA9IHVzZUNvbXBvc2VkUmVmcyhwcmVzZW5jZS5yZWYsIGdldEVsZW1lbnRSZWYoY2hpbGQpKTtcbiAgY29uc3QgZm9yY2VNb3VudCA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJmdW5jdGlvblwiO1xuICByZXR1cm4gZm9yY2VNb3VudCB8fCBwcmVzZW5jZS5pc1ByZXNlbnQgPyBSZWFjdDIuY2xvbmVFbGVtZW50KGNoaWxkLCB7IHJlZiB9KSA6IG51bGw7XG59O1xuUHJlc2VuY2UuZGlzcGxheU5hbWUgPSBcIlByZXNlbmNlXCI7XG5mdW5jdGlvbiB1c2VQcmVzZW5jZShwcmVzZW50KSB7XG4gIGNvbnN0IFtub2RlLCBzZXROb2RlXSA9IFJlYWN0Mi51c2VTdGF0ZSgpO1xuICBjb25zdCBzdHlsZXNSZWYgPSBSZWFjdDIudXNlUmVmKHt9KTtcbiAgY29uc3QgcHJldlByZXNlbnRSZWYgPSBSZWFjdDIudXNlUmVmKHByZXNlbnQpO1xuICBjb25zdCBwcmV2QW5pbWF0aW9uTmFtZVJlZiA9IFJlYWN0Mi51c2VSZWYoXCJub25lXCIpO1xuICBjb25zdCBpbml0aWFsU3RhdGUgPSBwcmVzZW50ID8gXCJtb3VudGVkXCIgOiBcInVubW91bnRlZFwiO1xuICBjb25zdCBbc3RhdGUsIHNlbmRdID0gdXNlU3RhdGVNYWNoaW5lKGluaXRpYWxTdGF0ZSwge1xuICAgIG1vdW50ZWQ6IHtcbiAgICAgIFVOTU9VTlQ6IFwidW5tb3VudGVkXCIsXG4gICAgICBBTklNQVRJT05fT1VUOiBcInVubW91bnRTdXNwZW5kZWRcIlxuICAgIH0sXG4gICAgdW5tb3VudFN1c3BlbmRlZDoge1xuICAgICAgTU9VTlQ6IFwibW91bnRlZFwiLFxuICAgICAgQU5JTUFUSU9OX0VORDogXCJ1bm1vdW50ZWRcIlxuICAgIH0sXG4gICAgdW5tb3VudGVkOiB7XG4gICAgICBNT1VOVDogXCJtb3VudGVkXCJcbiAgICB9XG4gIH0pO1xuICBSZWFjdDIudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50QW5pbWF0aW9uTmFtZSA9IGdldEFuaW1hdGlvbk5hbWUoc3R5bGVzUmVmLmN1cnJlbnQpO1xuICAgIHByZXZBbmltYXRpb25OYW1lUmVmLmN1cnJlbnQgPSBzdGF0ZSA9PT0gXCJtb3VudGVkXCIgPyBjdXJyZW50QW5pbWF0aW9uTmFtZSA6IFwibm9uZVwiO1xuICB9LCBbc3RhdGVdKTtcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzdHlsZXMgPSBzdHlsZXNSZWYuY3VycmVudDtcbiAgICBjb25zdCB3YXNQcmVzZW50ID0gcHJldlByZXNlbnRSZWYuY3VycmVudDtcbiAgICBjb25zdCBoYXNQcmVzZW50Q2hhbmdlZCA9IHdhc1ByZXNlbnQgIT09IHByZXNlbnQ7XG4gICAgaWYgKGhhc1ByZXNlbnRDaGFuZ2VkKSB7XG4gICAgICBjb25zdCBwcmV2QW5pbWF0aW9uTmFtZSA9IHByZXZBbmltYXRpb25OYW1lUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBjdXJyZW50QW5pbWF0aW9uTmFtZSA9IGdldEFuaW1hdGlvbk5hbWUoc3R5bGVzKTtcbiAgICAgIGlmIChwcmVzZW50KSB7XG4gICAgICAgIHNlbmQoXCJNT1VOVFwiKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudEFuaW1hdGlvbk5hbWUgPT09IFwibm9uZVwiIHx8IHN0eWxlcz8uZGlzcGxheSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgc2VuZChcIlVOTU9VTlRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpc0FuaW1hdGluZyA9IHByZXZBbmltYXRpb25OYW1lICE9PSBjdXJyZW50QW5pbWF0aW9uTmFtZTtcbiAgICAgICAgaWYgKHdhc1ByZXNlbnQgJiYgaXNBbmltYXRpbmcpIHtcbiAgICAgICAgICBzZW5kKFwiQU5JTUFUSU9OX09VVFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZW5kKFwiVU5NT1VOVFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJldlByZXNlbnRSZWYuY3VycmVudCA9IHByZXNlbnQ7XG4gICAgfVxuICB9LCBbcHJlc2VudCwgc2VuZF0pO1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChub2RlKSB7XG4gICAgICBjb25zdCBoYW5kbGVBbmltYXRpb25FbmQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudEFuaW1hdGlvbk5hbWUgPSBnZXRBbmltYXRpb25OYW1lKHN0eWxlc1JlZi5jdXJyZW50KTtcbiAgICAgICAgY29uc3QgaXNDdXJyZW50QW5pbWF0aW9uID0gY3VycmVudEFuaW1hdGlvbk5hbWUuaW5jbHVkZXMoZXZlbnQuYW5pbWF0aW9uTmFtZSk7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IG5vZGUgJiYgaXNDdXJyZW50QW5pbWF0aW9uKSB7XG4gICAgICAgICAgUmVhY3RET00uZmx1c2hTeW5jKCgpID0+IHNlbmQoXCJBTklNQVRJT05fRU5EXCIpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGhhbmRsZUFuaW1hdGlvblN0YXJ0ID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IG5vZGUpIHtcbiAgICAgICAgICBwcmV2QW5pbWF0aW9uTmFtZVJlZi5jdXJyZW50ID0gZ2V0QW5pbWF0aW9uTmFtZShzdHlsZXNSZWYuY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbmltYXRpb25zdGFydFwiLCBoYW5kbGVBbmltYXRpb25TdGFydCk7XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJhbmltYXRpb25jYW5jZWxcIiwgaGFuZGxlQW5pbWF0aW9uRW5kKTtcbiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcImFuaW1hdGlvbmVuZFwiLCBoYW5kbGVBbmltYXRpb25FbmQpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiYW5pbWF0aW9uc3RhcnRcIiwgaGFuZGxlQW5pbWF0aW9uU3RhcnQpO1xuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhbmltYXRpb25jYW5jZWxcIiwgaGFuZGxlQW5pbWF0aW9uRW5kKTtcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiYW5pbWF0aW9uZW5kXCIsIGhhbmRsZUFuaW1hdGlvbkVuZCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kKFwiQU5JTUFUSU9OX0VORFwiKTtcbiAgICB9XG4gIH0sIFtub2RlLCBzZW5kXSk7XG4gIHJldHVybiB7XG4gICAgaXNQcmVzZW50OiBbXCJtb3VudGVkXCIsIFwidW5tb3VudFN1c3BlbmRlZFwiXS5pbmNsdWRlcyhzdGF0ZSksXG4gICAgcmVmOiBSZWFjdDIudXNlQ2FsbGJhY2soKG5vZGUyKSA9PiB7XG4gICAgICBpZiAobm9kZTIpIHN0eWxlc1JlZi5jdXJyZW50ID0gZ2V0Q29tcHV0ZWRTdHlsZShub2RlMik7XG4gICAgICBzZXROb2RlKG5vZGUyKTtcbiAgICB9LCBbXSlcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldEFuaW1hdGlvbk5hbWUoc3R5bGVzKSB7XG4gIHJldHVybiBzdHlsZXM/LmFuaW1hdGlvbk5hbWUgfHwgXCJub25lXCI7XG59XG5mdW5jdGlvbiBnZXRFbGVtZW50UmVmKGVsZW1lbnQpIHtcbiAgbGV0IGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZWxlbWVudC5wcm9wcywgXCJyZWZcIik/LmdldDtcbiAgbGV0IG1heVdhcm4gPSBnZXR0ZXIgJiYgXCJpc1JlYWN0V2FybmluZ1wiIGluIGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmc7XG4gIGlmIChtYXlXYXJuKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQucmVmO1xuICB9XG4gIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZWxlbWVudCwgXCJyZWZcIik/LmdldDtcbiAgbWF5V2FybiA9IGdldHRlciAmJiBcImlzUmVhY3RXYXJuaW5nXCIgaW4gZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZztcbiAgaWYgKG1heVdhcm4pIHtcbiAgICByZXR1cm4gZWxlbWVudC5wcm9wcy5yZWY7XG4gIH1cbiAgcmV0dXJuIGVsZW1lbnQucHJvcHMucmVmIHx8IGVsZW1lbnQucmVmO1xufVxuZXhwb3J0IHtcbiAgUHJlc2VuY2Vcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC9wcmltaXRpdmUvc3JjL1ByaW1pdGl2ZS50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3Qtc2xvdFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgTk9ERVMgPSBbXG4gIFwiYVwiLFxuICBcImJ1dHRvblwiLFxuICBcImRpdlwiLFxuICBcImZvcm1cIixcbiAgXCJoMlwiLFxuICBcImgzXCIsXG4gIFwiaW1nXCIsXG4gIFwiaW5wdXRcIixcbiAgXCJsYWJlbFwiLFxuICBcImxpXCIsXG4gIFwibmF2XCIsXG4gIFwib2xcIixcbiAgXCJwXCIsXG4gIFwic3BhblwiLFxuICBcInN2Z1wiLFxuICBcInVsXCJcbl07XG52YXIgUHJpbWl0aXZlID0gTk9ERVMucmVkdWNlKChwcmltaXRpdmUsIG5vZGUpID0+IHtcbiAgY29uc3QgTm9kZSA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IGFzQ2hpbGQsIC4uLnByaW1pdGl2ZVByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBDb21wID0gYXNDaGlsZCA/IFNsb3QgOiBub2RlO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3dbU3ltYm9sLmZvcihcInJhZGl4LXVpXCIpXSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbXAsIHsgLi4ucHJpbWl0aXZlUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9KTtcbiAgTm9kZS5kaXNwbGF5TmFtZSA9IGBQcmltaXRpdmUuJHtub2RlfWA7XG4gIHJldHVybiB7IC4uLnByaW1pdGl2ZSwgW25vZGVdOiBOb2RlIH07XG59LCB7fSk7XG5mdW5jdGlvbiBkaXNwYXRjaERpc2NyZXRlQ3VzdG9tRXZlbnQodGFyZ2V0LCBldmVudCkge1xuICBpZiAodGFyZ2V0KSBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4gdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpKTtcbn1cbnZhciBSb290ID0gUHJpbWl0aXZlO1xuZXhwb3J0IHtcbiAgUHJpbWl0aXZlLFxuICBSb290LFxuICBkaXNwYXRjaERpc2NyZXRlQ3VzdG9tRXZlbnRcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3Qvcm92aW5nLWZvY3VzL3NyYy9Sb3ZpbmdGb2N1c0dyb3VwLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjb21wb3NlRXZlbnRIYW5kbGVycyB9IGZyb20gXCJAcmFkaXgtdWkvcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyBjcmVhdGVDb2xsZWN0aW9uIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb2xsZWN0aW9uXCI7XG5pbXBvcnQgeyB1c2VDb21wb3NlZFJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dFNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VJZCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtaWRcIjtcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZlwiO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxhYmxlU3RhdGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jb250cm9sbGFibGUtc3RhdGVcIjtcbmltcG9ydCB7IHVzZURpcmVjdGlvbiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtZGlyZWN0aW9uXCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBFTlRSWV9GT0NVUyA9IFwicm92aW5nRm9jdXNHcm91cC5vbkVudHJ5Rm9jdXNcIjtcbnZhciBFVkVOVF9PUFRJT05TID0geyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSB9O1xudmFyIEdST1VQX05BTUUgPSBcIlJvdmluZ0ZvY3VzR3JvdXBcIjtcbnZhciBbQ29sbGVjdGlvbiwgdXNlQ29sbGVjdGlvbiwgY3JlYXRlQ29sbGVjdGlvblNjb3BlXSA9IGNyZWF0ZUNvbGxlY3Rpb24oR1JPVVBfTkFNRSk7XG52YXIgW2NyZWF0ZVJvdmluZ0ZvY3VzR3JvdXBDb250ZXh0LCBjcmVhdGVSb3ZpbmdGb2N1c0dyb3VwU2NvcGVdID0gY3JlYXRlQ29udGV4dFNjb3BlKFxuICBHUk9VUF9OQU1FLFxuICBbY3JlYXRlQ29sbGVjdGlvblNjb3BlXVxuKTtcbnZhciBbUm92aW5nRm9jdXNQcm92aWRlciwgdXNlUm92aW5nRm9jdXNDb250ZXh0XSA9IGNyZWF0ZVJvdmluZ0ZvY3VzR3JvdXBDb250ZXh0KEdST1VQX05BTUUpO1xudmFyIFJvdmluZ0ZvY3VzR3JvdXAgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbGxlY3Rpb24uUHJvdmlkZXIsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChDb2xsZWN0aW9uLlNsb3QsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChSb3ZpbmdGb2N1c0dyb3VwSW1wbCwgeyAuLi5wcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSkgfSkgfSk7XG4gIH1cbik7XG5Sb3ZpbmdGb2N1c0dyb3VwLmRpc3BsYXlOYW1lID0gR1JPVVBfTkFNRTtcbnZhciBSb3ZpbmdGb2N1c0dyb3VwSW1wbCA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3Qge1xuICAgIF9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwLFxuICAgIG9yaWVudGF0aW9uLFxuICAgIGxvb3AgPSBmYWxzZSxcbiAgICBkaXIsXG4gICAgY3VycmVudFRhYlN0b3BJZDogY3VycmVudFRhYlN0b3BJZFByb3AsXG4gICAgZGVmYXVsdEN1cnJlbnRUYWJTdG9wSWQsXG4gICAgb25DdXJyZW50VGFiU3RvcElkQ2hhbmdlLFxuICAgIG9uRW50cnlGb2N1cyxcbiAgICBwcmV2ZW50U2Nyb2xsT25FbnRyeUZvY3VzID0gZmFsc2UsXG4gICAgLi4uZ3JvdXBQcm9wc1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgcmVmKTtcbiAgY29uc3QgZGlyZWN0aW9uID0gdXNlRGlyZWN0aW9uKGRpcik7XG4gIGNvbnN0IFtjdXJyZW50VGFiU3RvcElkID0gbnVsbCwgc2V0Q3VycmVudFRhYlN0b3BJZF0gPSB1c2VDb250cm9sbGFibGVTdGF0ZSh7XG4gICAgcHJvcDogY3VycmVudFRhYlN0b3BJZFByb3AsXG4gICAgZGVmYXVsdFByb3A6IGRlZmF1bHRDdXJyZW50VGFiU3RvcElkLFxuICAgIG9uQ2hhbmdlOiBvbkN1cnJlbnRUYWJTdG9wSWRDaGFuZ2VcbiAgfSk7XG4gIGNvbnN0IFtpc1RhYmJpbmdCYWNrT3V0LCBzZXRJc1RhYmJpbmdCYWNrT3V0XSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgaGFuZGxlRW50cnlGb2N1cyA9IHVzZUNhbGxiYWNrUmVmKG9uRW50cnlGb2N1cyk7XG4gIGNvbnN0IGdldEl0ZW1zID0gdXNlQ29sbGVjdGlvbihfX3Njb3BlUm92aW5nRm9jdXNHcm91cCk7XG4gIGNvbnN0IGlzQ2xpY2tGb2N1c1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IFtmb2N1c2FibGVJdGVtc0NvdW50LCBzZXRGb2N1c2FibGVJdGVtc0NvdW50XSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSByZWYuY3VycmVudDtcbiAgICBpZiAobm9kZSkge1xuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKEVOVFJZX0ZPQ1VTLCBoYW5kbGVFbnRyeUZvY3VzKTtcbiAgICAgIHJldHVybiAoKSA9PiBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoRU5UUllfRk9DVVMsIGhhbmRsZUVudHJ5Rm9jdXMpO1xuICAgIH1cbiAgfSwgW2hhbmRsZUVudHJ5Rm9jdXNdKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgUm92aW5nRm9jdXNQcm92aWRlcixcbiAgICB7XG4gICAgICBzY29wZTogX19zY29wZVJvdmluZ0ZvY3VzR3JvdXAsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIGRpcjogZGlyZWN0aW9uLFxuICAgICAgbG9vcCxcbiAgICAgIGN1cnJlbnRUYWJTdG9wSWQsXG4gICAgICBvbkl0ZW1Gb2N1czogUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgICAgICh0YWJTdG9wSWQpID0+IHNldEN1cnJlbnRUYWJTdG9wSWQodGFiU3RvcElkKSxcbiAgICAgICAgW3NldEN1cnJlbnRUYWJTdG9wSWRdXG4gICAgICApLFxuICAgICAgb25JdGVtU2hpZnRUYWI6IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHNldElzVGFiYmluZ0JhY2tPdXQodHJ1ZSksIFtdKSxcbiAgICAgIG9uRm9jdXNhYmxlSXRlbUFkZDogUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgICAgICgpID0+IHNldEZvY3VzYWJsZUl0ZW1zQ291bnQoKHByZXZDb3VudCkgPT4gcHJldkNvdW50ICsgMSksXG4gICAgICAgIFtdXG4gICAgICApLFxuICAgICAgb25Gb2N1c2FibGVJdGVtUmVtb3ZlOiBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgICAgKCkgPT4gc2V0Rm9jdXNhYmxlSXRlbXNDb3VudCgocHJldkNvdW50KSA9PiBwcmV2Q291bnQgLSAxKSxcbiAgICAgICAgW11cbiAgICAgICksXG4gICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgUHJpbWl0aXZlLmRpdixcbiAgICAgICAge1xuICAgICAgICAgIHRhYkluZGV4OiBpc1RhYmJpbmdCYWNrT3V0IHx8IGZvY3VzYWJsZUl0ZW1zQ291bnQgPT09IDAgPyAtMSA6IDAsXG4gICAgICAgICAgXCJkYXRhLW9yaWVudGF0aW9uXCI6IG9yaWVudGF0aW9uLFxuICAgICAgICAgIC4uLmdyb3VwUHJvcHMsXG4gICAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgICAgc3R5bGU6IHsgb3V0bGluZTogXCJub25lXCIsIC4uLnByb3BzLnN0eWxlIH0sXG4gICAgICAgICAgb25Nb3VzZURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uTW91c2VEb3duLCAoKSA9PiB7XG4gICAgICAgICAgICBpc0NsaWNrRm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgb25Gb2N1czogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Gb2N1cywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0tleWJvYXJkRm9jdXMgPSAhaXNDbGlja0ZvY3VzUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0ICYmIGlzS2V5Ym9hcmRGb2N1cyAmJiAhaXNUYWJiaW5nQmFja091dCkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRyeUZvY3VzRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoRU5UUllfRk9DVVMsIEVWRU5UX09QVElPTlMpO1xuICAgICAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQoZW50cnlGb2N1c0V2ZW50KTtcbiAgICAgICAgICAgICAgaWYgKCFlbnRyeUZvY3VzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0SXRlbXMoKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZm9jdXNhYmxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJdGVtID0gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5hY3RpdmUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gY3VycmVudFRhYlN0b3BJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlSXRlbXMgPSBbYWN0aXZlSXRlbSwgY3VycmVudEl0ZW0sIC4uLml0ZW1zXS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICBCb29sZWFuXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVOb2RlcyA9IGNhbmRpZGF0ZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5yZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgZm9jdXNGaXJzdChjYW5kaWRhdGVOb2RlcywgcHJldmVudFNjcm9sbE9uRW50cnlGb2N1cyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzQ2xpY2tGb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgb25CbHVyOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkJsdXIsICgpID0+IHNldElzVGFiYmluZ0JhY2tPdXQoZmFsc2UpKVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICApO1xufSk7XG52YXIgSVRFTV9OQU1FID0gXCJSb3ZpbmdGb2N1c0dyb3VwSXRlbVwiO1xudmFyIFJvdmluZ0ZvY3VzR3JvdXBJdGVtID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBfX3Njb3BlUm92aW5nRm9jdXNHcm91cCxcbiAgICAgIGZvY3VzYWJsZSA9IHRydWUsXG4gICAgICBhY3RpdmUgPSBmYWxzZSxcbiAgICAgIHRhYlN0b3BJZCxcbiAgICAgIC4uLml0ZW1Qcm9wc1xuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCBhdXRvSWQgPSB1c2VJZCgpO1xuICAgIGNvbnN0IGlkID0gdGFiU3RvcElkIHx8IGF1dG9JZDtcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlUm92aW5nRm9jdXNDb250ZXh0KElURU1fTkFNRSwgX19zY29wZVJvdmluZ0ZvY3VzR3JvdXApO1xuICAgIGNvbnN0IGlzQ3VycmVudFRhYlN0b3AgPSBjb250ZXh0LmN1cnJlbnRUYWJTdG9wSWQgPT09IGlkO1xuICAgIGNvbnN0IGdldEl0ZW1zID0gdXNlQ29sbGVjdGlvbihfX3Njb3BlUm92aW5nRm9jdXNHcm91cCk7XG4gICAgY29uc3QgeyBvbkZvY3VzYWJsZUl0ZW1BZGQsIG9uRm9jdXNhYmxlSXRlbVJlbW92ZSB9ID0gY29udGV4dDtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKGZvY3VzYWJsZSkge1xuICAgICAgICBvbkZvY3VzYWJsZUl0ZW1BZGQoKTtcbiAgICAgICAgcmV0dXJuICgpID0+IG9uRm9jdXNhYmxlSXRlbVJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0sIFtmb2N1c2FibGUsIG9uRm9jdXNhYmxlSXRlbUFkZCwgb25Gb2N1c2FibGVJdGVtUmVtb3ZlXSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBDb2xsZWN0aW9uLkl0ZW1TbG90LFxuICAgICAge1xuICAgICAgICBzY29wZTogX19zY29wZVJvdmluZ0ZvY3VzR3JvdXAsXG4gICAgICAgIGlkLFxuICAgICAgICBmb2N1c2FibGUsXG4gICAgICAgIGFjdGl2ZSxcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgUHJpbWl0aXZlLnNwYW4sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFiSW5kZXg6IGlzQ3VycmVudFRhYlN0b3AgPyAwIDogLTEsXG4gICAgICAgICAgICBcImRhdGEtb3JpZW50YXRpb25cIjogY29udGV4dC5vcmllbnRhdGlvbixcbiAgICAgICAgICAgIC4uLml0ZW1Qcm9wcyxcbiAgICAgICAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgICAgICAgb25Nb3VzZURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uTW91c2VEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFmb2N1c2FibGUpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGVsc2UgY29udGV4dC5vbkl0ZW1Gb2N1cyhpZCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG9uRm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uRm9jdXMsICgpID0+IGNvbnRleHQub25JdGVtRm9jdXMoaWQpKSxcbiAgICAgICAgICAgIG9uS2V5RG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25LZXlEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIiAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25JdGVtU2hpZnRUYWIoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gZXZlbnQuY3VycmVudFRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zdCBmb2N1c0ludGVudCA9IGdldEZvY3VzSW50ZW50KGV2ZW50LCBjb250ZXh0Lm9yaWVudGF0aW9uLCBjb250ZXh0LmRpcik7XG4gICAgICAgICAgICAgIGlmIChmb2N1c0ludGVudCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQuc2hpZnRLZXkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0SXRlbXMoKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZm9jdXNhYmxlKTtcbiAgICAgICAgICAgICAgICBsZXQgY2FuZGlkYXRlTm9kZXMgPSBpdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0ucmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChmb2N1c0ludGVudCA9PT0gXCJsYXN0XCIpIGNhbmRpZGF0ZU5vZGVzLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmb2N1c0ludGVudCA9PT0gXCJwcmV2XCIgfHwgZm9jdXNJbnRlbnQgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZm9jdXNJbnRlbnQgPT09IFwicHJldlwiKSBjYW5kaWRhdGVOb2Rlcy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBjYW5kaWRhdGVOb2Rlcy5pbmRleE9mKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlTm9kZXMgPSBjb250ZXh0Lmxvb3AgPyB3cmFwQXJyYXkoY2FuZGlkYXRlTm9kZXMsIGN1cnJlbnRJbmRleCArIDEpIDogY2FuZGlkYXRlTm9kZXMuc2xpY2UoY3VycmVudEluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZm9jdXNGaXJzdChjYW5kaWRhdGVOb2RlcykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5Sb3ZpbmdGb2N1c0dyb3VwSXRlbS5kaXNwbGF5TmFtZSA9IElURU1fTkFNRTtcbnZhciBNQVBfS0VZX1RPX0ZPQ1VTX0lOVEVOVCA9IHtcbiAgQXJyb3dMZWZ0OiBcInByZXZcIixcbiAgQXJyb3dVcDogXCJwcmV2XCIsXG4gIEFycm93UmlnaHQ6IFwibmV4dFwiLFxuICBBcnJvd0Rvd246IFwibmV4dFwiLFxuICBQYWdlVXA6IFwiZmlyc3RcIixcbiAgSG9tZTogXCJmaXJzdFwiLFxuICBQYWdlRG93bjogXCJsYXN0XCIsXG4gIEVuZDogXCJsYXN0XCJcbn07XG5mdW5jdGlvbiBnZXREaXJlY3Rpb25Bd2FyZUtleShrZXksIGRpcikge1xuICBpZiAoZGlyICE9PSBcInJ0bFwiKSByZXR1cm4ga2V5O1xuICByZXR1cm4ga2V5ID09PSBcIkFycm93TGVmdFwiID8gXCJBcnJvd1JpZ2h0XCIgOiBrZXkgPT09IFwiQXJyb3dSaWdodFwiID8gXCJBcnJvd0xlZnRcIiA6IGtleTtcbn1cbmZ1bmN0aW9uIGdldEZvY3VzSW50ZW50KGV2ZW50LCBvcmllbnRhdGlvbiwgZGlyKSB7XG4gIGNvbnN0IGtleSA9IGdldERpcmVjdGlvbkF3YXJlS2V5KGV2ZW50LmtleSwgZGlyKTtcbiAgaWYgKG9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIgJiYgW1wiQXJyb3dMZWZ0XCIsIFwiQXJyb3dSaWdodFwiXS5pbmNsdWRlcyhrZXkpKSByZXR1cm4gdm9pZCAwO1xuICBpZiAob3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiICYmIFtcIkFycm93VXBcIiwgXCJBcnJvd0Rvd25cIl0uaW5jbHVkZXMoa2V5KSkgcmV0dXJuIHZvaWQgMDtcbiAgcmV0dXJuIE1BUF9LRVlfVE9fRk9DVVNfSU5URU5UW2tleV07XG59XG5mdW5jdGlvbiBmb2N1c0ZpcnN0KGNhbmRpZGF0ZXMsIHByZXZlbnRTY3JvbGwgPSBmYWxzZSkge1xuICBjb25zdCBQUkVWSU9VU0xZX0ZPQ1VTRURfRUxFTUVOVCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAoY2FuZGlkYXRlID09PSBQUkVWSU9VU0xZX0ZPQ1VTRURfRUxFTUVOVCkgcmV0dXJuO1xuICAgIGNhbmRpZGF0ZS5mb2N1cyh7IHByZXZlbnRTY3JvbGwgfSk7XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IFBSRVZJT1VTTFlfRk9DVVNFRF9FTEVNRU5UKSByZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHdyYXBBcnJheShhcnJheSwgc3RhcnRJbmRleCkge1xuICByZXR1cm4gYXJyYXkubWFwKChfLCBpbmRleCkgPT4gYXJyYXlbKHN0YXJ0SW5kZXggKyBpbmRleCkgJSBhcnJheS5sZW5ndGhdKTtcbn1cbnZhciBSb290ID0gUm92aW5nRm9jdXNHcm91cDtcbnZhciBJdGVtID0gUm92aW5nRm9jdXNHcm91cEl0ZW07XG5leHBvcnQge1xuICBJdGVtLFxuICBSb290LFxuICBSb3ZpbmdGb2N1c0dyb3VwLFxuICBSb3ZpbmdGb2N1c0dyb3VwSXRlbSxcbiAgY3JlYXRlUm92aW5nRm9jdXNHcm91cFNjb3BlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3Qvc2xvdC9zcmMvU2xvdC50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY29tcG9zZVJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgRnJhZ21lbnQsIGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIFNsb3QgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgY2hpbGRyZW4sIC4uLnNsb3RQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IGNoaWxkcmVuQXJyYXkgPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKTtcbiAgY29uc3Qgc2xvdHRhYmxlID0gY2hpbGRyZW5BcnJheS5maW5kKGlzU2xvdHRhYmxlKTtcbiAgaWYgKHNsb3R0YWJsZSkge1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBzbG90dGFibGUucHJvcHMuY2hpbGRyZW47XG4gICAgY29uc3QgbmV3Q2hpbGRyZW4gPSBjaGlsZHJlbkFycmF5Lm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZCA9PT0gc2xvdHRhYmxlKSB7XG4gICAgICAgIGlmIChSZWFjdC5DaGlsZHJlbi5jb3VudChuZXdFbGVtZW50KSA+IDEpIHJldHVybiBSZWFjdC5DaGlsZHJlbi5vbmx5KG51bGwpO1xuICAgICAgICByZXR1cm4gUmVhY3QuaXNWYWxpZEVsZW1lbnQobmV3RWxlbWVudCkgPyBuZXdFbGVtZW50LnByb3BzLmNoaWxkcmVuIDogbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChTbG90Q2xvbmUsIHsgLi4uc2xvdFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiwgY2hpbGRyZW46IFJlYWN0LmlzVmFsaWRFbGVtZW50KG5ld0VsZW1lbnQpID8gUmVhY3QuY2xvbmVFbGVtZW50KG5ld0VsZW1lbnQsIHZvaWQgMCwgbmV3Q2hpbGRyZW4pIDogbnVsbCB9KTtcbiAgfVxuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChTbG90Q2xvbmUsIHsgLi4uc2xvdFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiwgY2hpbGRyZW4gfSk7XG59KTtcblNsb3QuZGlzcGxheU5hbWUgPSBcIlNsb3RcIjtcbnZhciBTbG90Q2xvbmUgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgY2hpbGRyZW4sIC4uLnNsb3RQcm9wcyB9ID0gcHJvcHM7XG4gIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICBjb25zdCBjaGlsZHJlblJlZiA9IGdldEVsZW1lbnRSZWYoY2hpbGRyZW4pO1xuICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICAgIC4uLm1lcmdlUHJvcHMoc2xvdFByb3BzLCBjaGlsZHJlbi5wcm9wcyksXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZWY6IGZvcndhcmRlZFJlZiA/IGNvbXBvc2VSZWZzKGZvcndhcmRlZFJlZiwgY2hpbGRyZW5SZWYpIDogY2hpbGRyZW5SZWZcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pID4gMSA/IFJlYWN0LkNoaWxkcmVuLm9ubHkobnVsbCkgOiBudWxsO1xufSk7XG5TbG90Q2xvbmUuZGlzcGxheU5hbWUgPSBcIlNsb3RDbG9uZVwiO1xudmFyIFNsb3R0YWJsZSA9ICh7IGNoaWxkcmVuIH0pID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goRnJhZ21lbnQsIHsgY2hpbGRyZW4gfSk7XG59O1xuZnVuY3Rpb24gaXNTbG90dGFibGUoY2hpbGQpIHtcbiAgcmV0dXJuIFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkKSAmJiBjaGlsZC50eXBlID09PSBTbG90dGFibGU7XG59XG5mdW5jdGlvbiBtZXJnZVByb3BzKHNsb3RQcm9wcywgY2hpbGRQcm9wcykge1xuICBjb25zdCBvdmVycmlkZVByb3BzID0geyAuLi5jaGlsZFByb3BzIH07XG4gIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gY2hpbGRQcm9wcykge1xuICAgIGNvbnN0IHNsb3RQcm9wVmFsdWUgPSBzbG90UHJvcHNbcHJvcE5hbWVdO1xuICAgIGNvbnN0IGNoaWxkUHJvcFZhbHVlID0gY2hpbGRQcm9wc1twcm9wTmFtZV07XG4gICAgY29uc3QgaXNIYW5kbGVyID0gL15vbltBLVpdLy50ZXN0KHByb3BOYW1lKTtcbiAgICBpZiAoaXNIYW5kbGVyKSB7XG4gICAgICBpZiAoc2xvdFByb3BWYWx1ZSAmJiBjaGlsZFByb3BWYWx1ZSkge1xuICAgICAgICBvdmVycmlkZVByb3BzW3Byb3BOYW1lXSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgY2hpbGRQcm9wVmFsdWUoLi4uYXJncyk7XG4gICAgICAgICAgc2xvdFByb3BWYWx1ZSguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoc2xvdFByb3BWYWx1ZSkge1xuICAgICAgICBvdmVycmlkZVByb3BzW3Byb3BOYW1lXSA9IHNsb3RQcm9wVmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICBvdmVycmlkZVByb3BzW3Byb3BOYW1lXSA9IHsgLi4uc2xvdFByb3BWYWx1ZSwgLi4uY2hpbGRQcm9wVmFsdWUgfTtcbiAgICB9IGVsc2UgaWYgKHByb3BOYW1lID09PSBcImNsYXNzTmFtZVwiKSB7XG4gICAgICBvdmVycmlkZVByb3BzW3Byb3BOYW1lXSA9IFtzbG90UHJvcFZhbHVlLCBjaGlsZFByb3BWYWx1ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyAuLi5zbG90UHJvcHMsIC4uLm92ZXJyaWRlUHJvcHMgfTtcbn1cbmZ1bmN0aW9uIGdldEVsZW1lbnRSZWYoZWxlbWVudCkge1xuICBsZXQgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlbGVtZW50LnByb3BzLCBcInJlZlwiKT8uZ2V0O1xuICBsZXQgbWF5V2FybiA9IGdldHRlciAmJiBcImlzUmVhY3RXYXJuaW5nXCIgaW4gZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZztcbiAgaWYgKG1heVdhcm4pIHtcbiAgICByZXR1cm4gZWxlbWVudC5yZWY7XG4gIH1cbiAgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlbGVtZW50LCBcInJlZlwiKT8uZ2V0O1xuICBtYXlXYXJuID0gZ2V0dGVyICYmIFwiaXNSZWFjdFdhcm5pbmdcIiBpbiBnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nO1xuICBpZiAobWF5V2Fybikge1xuICAgIHJldHVybiBlbGVtZW50LnByb3BzLnJlZjtcbiAgfVxuICByZXR1cm4gZWxlbWVudC5wcm9wcy5yZWYgfHwgZWxlbWVudC5yZWY7XG59XG52YXIgUm9vdCA9IFNsb3Q7XG5leHBvcnQge1xuICBSb290LFxuICBTbG90LFxuICBTbG90dGFibGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC91c2UtY2FsbGJhY2stcmVmL3NyYy91c2VDYWxsYmFja1JlZi50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZnVuY3Rpb24gdXNlQ2FsbGJhY2tSZWYoY2FsbGJhY2spIHtcbiAgY29uc3QgY2FsbGJhY2tSZWYgPSBSZWFjdC51c2VSZWYoY2FsbGJhY2spO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNhbGxiYWNrUmVmLmN1cnJlbnQgPSBjYWxsYmFjaztcbiAgfSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICguLi5hcmdzKSA9PiBjYWxsYmFja1JlZi5jdXJyZW50Py4oLi4uYXJncyksIFtdKTtcbn1cbmV4cG9ydCB7XG4gIHVzZUNhbGxiYWNrUmVmXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvdXNlLWNvbnRyb2xsYWJsZS1zdGF0ZS9zcmMvdXNlQ29udHJvbGxhYmxlU3RhdGUudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmXCI7XG5mdW5jdGlvbiB1c2VDb250cm9sbGFibGVTdGF0ZSh7XG4gIHByb3AsXG4gIGRlZmF1bHRQcm9wLFxuICBvbkNoYW5nZSA9ICgpID0+IHtcbiAgfVxufSkge1xuICBjb25zdCBbdW5jb250cm9sbGVkUHJvcCwgc2V0VW5jb250cm9sbGVkUHJvcF0gPSB1c2VVbmNvbnRyb2xsZWRTdGF0ZSh7IGRlZmF1bHRQcm9wLCBvbkNoYW5nZSB9KTtcbiAgY29uc3QgaXNDb250cm9sbGVkID0gcHJvcCAhPT0gdm9pZCAwO1xuICBjb25zdCB2YWx1ZSA9IGlzQ29udHJvbGxlZCA/IHByb3AgOiB1bmNvbnRyb2xsZWRQcm9wO1xuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFja1JlZihvbkNoYW5nZSk7XG4gIGNvbnN0IHNldFZhbHVlID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgKG5leHRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGlzQ29udHJvbGxlZCkge1xuICAgICAgICBjb25zdCBzZXR0ZXIgPSBuZXh0VmFsdWU7XG4gICAgICAgIGNvbnN0IHZhbHVlMiA9IHR5cGVvZiBuZXh0VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHNldHRlcihwcm9wKSA6IG5leHRWYWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlMiAhPT0gcHJvcCkgaGFuZGxlQ2hhbmdlKHZhbHVlMik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRVbmNvbnRyb2xsZWRQcm9wKG5leHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbaXNDb250cm9sbGVkLCBwcm9wLCBzZXRVbmNvbnRyb2xsZWRQcm9wLCBoYW5kbGVDaGFuZ2VdXG4gICk7XG4gIHJldHVybiBbdmFsdWUsIHNldFZhbHVlXTtcbn1cbmZ1bmN0aW9uIHVzZVVuY29udHJvbGxlZFN0YXRlKHtcbiAgZGVmYXVsdFByb3AsXG4gIG9uQ2hhbmdlXG59KSB7XG4gIGNvbnN0IHVuY29udHJvbGxlZFN0YXRlID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdFByb3ApO1xuICBjb25zdCBbdmFsdWVdID0gdW5jb250cm9sbGVkU3RhdGU7XG4gIGNvbnN0IHByZXZWYWx1ZVJlZiA9IFJlYWN0LnVzZVJlZih2YWx1ZSk7XG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrUmVmKG9uQ2hhbmdlKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocHJldlZhbHVlUmVmLmN1cnJlbnQgIT09IHZhbHVlKSB7XG4gICAgICBoYW5kbGVDaGFuZ2UodmFsdWUpO1xuICAgICAgcHJldlZhbHVlUmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICB9XG4gIH0sIFt2YWx1ZSwgcHJldlZhbHVlUmVmLCBoYW5kbGVDaGFuZ2VdKTtcbiAgcmV0dXJuIHVuY29udHJvbGxlZFN0YXRlO1xufVxuZXhwb3J0IHtcbiAgdXNlQ29udHJvbGxhYmxlU3RhdGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC91c2UtZXNjYXBlLWtleWRvd24vc3JjL3VzZUVzY2FwZUtleWRvd24udHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmXCI7XG5mdW5jdGlvbiB1c2VFc2NhcGVLZXlkb3duKG9uRXNjYXBlS2V5RG93blByb3AsIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzPy5kb2N1bWVudCkge1xuICBjb25zdCBvbkVzY2FwZUtleURvd24gPSB1c2VDYWxsYmFja1JlZihvbkVzY2FwZUtleURvd25Qcm9wKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIG9uRXNjYXBlS2V5RG93bihldmVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBvd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gKCkgPT4gb3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH0sIFtvbkVzY2FwZUtleURvd24sIG93bmVyRG9jdW1lbnRdKTtcbn1cbmV4cG9ydCB7XG4gIHVzZUVzY2FwZUtleWRvd25cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC91c2UtbGF5b3V0LWVmZmVjdC9zcmMvdXNlTGF5b3V0RWZmZWN0LnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgdXNlTGF5b3V0RWZmZWN0MiA9IEJvb2xlYW4oZ2xvYmFsVGhpcz8uZG9jdW1lbnQpID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogKCkgPT4ge1xufTtcbmV4cG9ydCB7XG4gIHVzZUxheW91dEVmZmVjdDIgYXMgdXNlTGF5b3V0RWZmZWN0XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvdXNlLXNpemUvc3JjL3VzZVNpemUudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3RcIjtcbmZ1bmN0aW9uIHVzZVNpemUoZWxlbWVudCkge1xuICBjb25zdCBbc2l6ZSwgc2V0U2l6ZV0gPSBSZWFjdC51c2VTdGF0ZSh2b2lkIDApO1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBzZXRTaXplKHsgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQgfSk7XG4gICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cmllcykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbMF07XG4gICAgICAgIGxldCB3aWR0aDtcbiAgICAgICAgbGV0IGhlaWdodDtcbiAgICAgICAgaWYgKFwiYm9yZGVyQm94U2l6ZVwiIGluIGVudHJ5KSB7XG4gICAgICAgICAgY29uc3QgYm9yZGVyU2l6ZUVudHJ5ID0gZW50cnlbXCJib3JkZXJCb3hTaXplXCJdO1xuICAgICAgICAgIGNvbnN0IGJvcmRlclNpemUgPSBBcnJheS5pc0FycmF5KGJvcmRlclNpemVFbnRyeSkgPyBib3JkZXJTaXplRW50cnlbMF0gOiBib3JkZXJTaXplRW50cnk7XG4gICAgICAgICAgd2lkdGggPSBib3JkZXJTaXplW1wiaW5saW5lU2l6ZVwiXTtcbiAgICAgICAgICBoZWlnaHQgPSBib3JkZXJTaXplW1wiYmxvY2tTaXplXCJdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBzZXRTaXplKHsgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAgIH0pO1xuICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7IGJveDogXCJib3JkZXItYm94XCIgfSk7XG4gICAgICByZXR1cm4gKCkgPT4gcmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTaXplKHZvaWQgMCk7XG4gICAgfVxuICB9LCBbZWxlbWVudF0pO1xuICByZXR1cm4gc2l6ZTtcbn1cbmV4cG9ydCB7XG4gIHVzZVNpemVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMsIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovIGltcG9ydCB7IG1ha2VSZXF1ZXN0Q2FsbCwgbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyIH0gZnJvbSAnLi9tYWtlUmVxdWVzdENhbGwuanMnO1xuZXhwb3J0IGNsYXNzIEFzYXBRdWV1ZSB7XG4gICAgLy8gVXNlIHRoZSBmYXN0ZXN0IG1lYW5zIHBvc3NpYmxlIHRvIGV4ZWN1dGUgYSB0YXNrIGluIGl0cyBvd24gdHVybiwgd2l0aFxuICAgIC8vIHByaW9yaXR5IG92ZXIgb3RoZXIgZXZlbnRzIGluY2x1ZGluZyBJTywgYW5pbWF0aW9uLCByZWZsb3csIGFuZCByZWRyYXdcbiAgICAvLyBldmVudHMgaW4gYnJvd3NlcnMuXG4gICAgLy9cbiAgICAvLyBBbiBleGNlcHRpb24gdGhyb3duIGJ5IGEgdGFzayB3aWxsIHBlcm1hbmVudGx5IGludGVycnVwdCB0aGUgcHJvY2Vzc2luZyBvZlxuICAgIC8vIHN1YnNlcXVlbnQgdGFza3MuIFRoZSBoaWdoZXIgbGV2ZWwgYGFzYXBgIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCBpZiBhblxuICAgIC8vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgYSB0YXNrLCB0aGF0IHRoZSB0YXNrIHF1ZXVlIHdpbGwgY29udGludWUgZmx1c2hpbmcgYXNcbiAgICAvLyBzb29uIGFzIHBvc3NpYmxlLCBidXQgaWYgeW91IHVzZSBgcmF3QXNhcGAgZGlyZWN0bHksIHlvdSBhcmUgcmVzcG9uc2libGUgdG9cbiAgICAvLyBlaXRoZXIgZW5zdXJlIHRoYXQgbm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20geW91ciB0YXNrLCBvciB0byBtYW51YWxseVxuICAgIC8vIGNhbGwgYHJhd0FzYXAucmVxdWVzdEZsdXNoYCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLlxuICAgIGVucXVldWVUYXNrKHRhc2spIHtcbiAgICAgICAgY29uc3QgeyBxdWV1ZTogcSAsIHJlcXVlc3RGbHVzaCAgfSA9IHRoaXM7XG4gICAgICAgIGlmICghcS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlcXVlc3RGbHVzaCgpO1xuICAgICAgICAgICAgdGhpcy5mbHVzaGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXF1aXZhbGVudCB0byBwdXNoLCBidXQgYXZvaWRzIGEgZnVuY3Rpb24gY2FsbC5cbiAgICAgICAgcVtxLmxlbmd0aF0gPSB0YXNrO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgICAgIC8vIFdlIHF1ZXVlIGVycm9ycyB0byBlbnN1cmUgdGhleSBhcmUgdGhyb3duIGluIHJpZ2h0IG9yZGVyIChGSUZPKS5cbiAgICAgICAgLy8gQXJyYXktYXMtcXVldWUgaXMgZ29vZCBlbm91Z2ggaGVyZSwgc2luY2Ugd2UgYXJlIGp1c3QgZGVhbGluZyB3aXRoIGV4Y2VwdGlvbnMuXG4gICAgICAgIHRoaXMucGVuZGluZ0Vycm9ycyA9IFtdO1xuICAgICAgICAvLyBPbmNlIGEgZmx1c2ggaGFzIGJlZW4gcmVxdWVzdGVkLCBubyBmdXJ0aGVyIGNhbGxzIHRvIGByZXF1ZXN0Rmx1c2hgIGFyZVxuICAgICAgICAvLyBuZWNlc3NhcnkgdW50aWwgdGhlIG5leHQgYGZsdXNoYCBjb21wbGV0ZXMuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5mbHVzaGluZyA9IGZhbHNlO1xuICAgICAgICAvLyBUaGUgcG9zaXRpb24gb2YgdGhlIG5leHQgdGFzayB0byBleGVjdXRlIGluIHRoZSB0YXNrIHF1ZXVlLiBUaGlzIGlzXG4gICAgICAgIC8vIHByZXNlcnZlZCBiZXR3ZWVuIGNhbGxzIHRvIGBmbHVzaGAgc28gdGhhdCBpdCBjYW4gYmUgcmVzdW1lZCBpZlxuICAgICAgICAvLyBhIHRhc2sgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIC8vIElmIGEgdGFzayBzY2hlZHVsZXMgYWRkaXRpb25hbCB0YXNrcyByZWN1cnNpdmVseSwgdGhlIHRhc2sgcXVldWUgY2FuIGdyb3dcbiAgICAgICAgLy8gdW5ib3VuZGVkLiBUbyBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uLCB0aGUgdGFzayBxdWV1ZSB3aWxsIHBlcmlvZGljYWxseVxuICAgICAgICAvLyB0cnVuY2F0ZSBhbHJlYWR5LWNvbXBsZXRlZCB0YXNrcy5cbiAgICAgICAgdGhpcy5jYXBhY2l0eSA9IDEwMjQ7XG4gICAgICAgIC8vIFRoZSBmbHVzaCBmdW5jdGlvbiBwcm9jZXNzZXMgYWxsIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIHNjaGVkdWxlZCB3aXRoXG4gICAgICAgIC8vIGByYXdBc2FwYCB1bmxlc3MgYW5kIHVudGlsIG9uZSBvZiB0aG9zZSB0YXNrcyB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgICAgICAvLyBJZiBhIHRhc2sgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgYGZsdXNoYCBlbnN1cmVzIHRoYXQgaXRzIHN0YXRlIHdpbGwgcmVtYWluXG4gICAgICAgIC8vIGNvbnNpc3RlbnQgYW5kIHdpbGwgcmVzdW1lIHdoZXJlIGl0IGxlZnQgb2ZmIHdoZW4gY2FsbGVkIGFnYWluLlxuICAgICAgICAvLyBIb3dldmVyLCBgZmx1c2hgIGRvZXMgbm90IG1ha2UgYW55IGFycmFuZ2VtZW50cyB0byBiZSBjYWxsZWQgYWdhaW4gaWYgYW5cbiAgICAgICAgLy8gZXhjZXB0aW9uIGlzIHRocm93bi5cbiAgICAgICAgdGhpcy5mbHVzaCA9ICgpPT57XG4gICAgICAgICAgICBjb25zdCB7IHF1ZXVlOiBxICB9ID0gdGhpcztcbiAgICAgICAgICAgIHdoaWxlKHRoaXMuaW5kZXggPCBxLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIHRoZSBpbmRleCBiZWZvcmUgY2FsbGluZyB0aGUgdGFzay4gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbFxuICAgICAgICAgICAgICAgIC8vIGJlZ2luIGZsdXNoaW5nIG9uIHRoZSBuZXh0IHRhc2sgdGhlIHRhc2sgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgICAgICAgICBxW2N1cnJlbnRJbmRleF0uY2FsbCgpO1xuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgbGVha2luZyBtZW1vcnkgZm9yIGxvbmcgY2hhaW5zIG9mIHJlY3Vyc2l2ZSBjYWxscyB0byBgYXNhcGAuXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgY2FsbCBgYXNhcGAgd2l0aGluIHRhc2tzIHNjaGVkdWxlZCBieSBgYXNhcGAsIHRoZSBxdWV1ZSB3aWxsXG4gICAgICAgICAgICAgICAgLy8gZ3JvdywgYnV0IHRvIGF2b2lkIGFuIE8obikgd2FsayBmb3IgZXZlcnkgdGFzayB3ZSBleGVjdXRlLCB3ZSBkb24ndFxuICAgICAgICAgICAgICAgIC8vIHNoaWZ0IHRhc2tzIG9mZiB0aGUgcXVldWUgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZXhlY3V0ZWQuXG4gICAgICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2UgcGVyaW9kaWNhbGx5IHNoaWZ0IDEwMjQgdGFza3Mgb2ZmIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmRleCA+IHRoaXMuY2FwYWNpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFudWFsbHkgc2hpZnQgYWxsIHZhbHVlcyBzdGFydGluZyBhdCB0aGUgaW5kZXggYmFjayB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBzY2FuID0gMCwgbmV3TGVuZ3RoID0gcS5sZW5ndGggLSB0aGlzLmluZGV4OyBzY2FuIDwgbmV3TGVuZ3RoOyBzY2FuKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgcVtzY2FuXSA9IHFbc2NhbiArIHRoaXMuaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHEubGVuZ3RoIC09IHRoaXMuaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHEubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICAgICAgdGhpcy5mbHVzaGluZyA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICAvLyBJbiBhIHdlYiBicm93c2VyLCBleGNlcHRpb25zIGFyZSBub3QgZmF0YWwuIEhvd2V2ZXIsIHRvIGF2b2lkXG4gICAgICAgIC8vIHNsb3dpbmcgZG93biB0aGUgcXVldWUgb2YgcGVuZGluZyB0YXNrcywgd2UgcmV0aHJvdyB0aGUgZXJyb3IgaW4gYVxuICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB0dXJuLlxuICAgICAgICB0aGlzLnJlZ2lzdGVyUGVuZGluZ0Vycm9yID0gKGVycik9PntcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0Vycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RFcnJvclRocm93KCk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGByZXF1ZXN0Rmx1c2hgIHJlcXVlc3RzIHRoYXQgdGhlIGhpZ2ggcHJpb3JpdHkgZXZlbnQgcXVldWUgYmUgZmx1c2hlZCBhc1xuICAgICAgICAvLyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAvLyBUaGlzIGlzIHVzZWZ1bCB0byBwcmV2ZW50IGFuIGVycm9yIHRocm93biBpbiBhIHRhc2sgZnJvbSBzdGFsbGluZyB0aGUgZXZlbnRcbiAgICAgICAgLy8gcXVldWUgaWYgdGhlIGV4Y2VwdGlvbiBoYW5kbGVkIGJ5IE5vZGUuanPigJlzXG4gICAgICAgIC8vIGBwcm9jZXNzLm9uKFwidW5jYXVnaHRFeGNlcHRpb25cIilgIG9yIGJ5IGEgZG9tYWluLlxuICAgICAgICAvLyBgcmVxdWVzdEZsdXNoYCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHN0cmF0ZWd5IGJhc2VkIG9uIGRhdGEgY29sbGVjdGVkIGZyb21cbiAgICAgICAgLy8gZXZlcnkgYXZhaWxhYmxlIFNhdWNlTGFicyBTZWxlbml1bSB3ZWIgZHJpdmVyIHdvcmtlciBhdCB0aW1lIG9mIHdyaXRpbmcuXG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFtRy01VVlHdXA1cXhHZEVNV2toUDZCV0N6MDUzTlViMkUxUW9VVFUxNnVBL2VkaXQjZ2lkPTc4MzcyNDU5M1xuICAgICAgICB0aGlzLnJlcXVlc3RGbHVzaCA9IG1ha2VSZXF1ZXN0Q2FsbCh0aGlzLmZsdXNoKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RXJyb3JUaHJvdyA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcigoKT0+e1xuICAgICAgICAgICAgLy8gVGhyb3cgZmlyc3QgZXJyb3JcbiAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5wZW5kaW5nRXJyb3JzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn0gLy8gVGhlIG1lc3NhZ2UgY2hhbm5lbCB0ZWNobmlxdWUgd2FzIGRpc2NvdmVyZWQgYnkgTWFsdGUgVWJsIGFuZCB3YXMgdGhlXG4gLy8gb3JpZ2luYWwgZm91bmRhdGlvbiBmb3IgdGhpcyBsaWJyYXJ5LlxuIC8vIGh0dHA6Ly93d3cubm9uYmxvY2tpbmcuaW8vMjAxMS8wNi93aW5kb3duZXh0dGljay5odG1sXG4gLy8gU2FmYXJpIDYuMC41IChhdCBsZWFzdCkgaW50ZXJtaXR0ZW50bHkgZmFpbHMgdG8gY3JlYXRlIG1lc3NhZ2UgcG9ydHMgb24gYVxuIC8vIHBhZ2UncyBmaXJzdCBsb2FkLiBUaGFua2Z1bGx5LCB0aGlzIHZlcnNpb24gb2YgU2FmYXJpIHN1cHBvcnRzXG4gLy8gTXV0YXRpb25PYnNlcnZlcnMsIHNvIHdlIGRvbid0IG5lZWQgdG8gZmFsbCBiYWNrIGluIHRoYXQgY2FzZS5cbiAvLyBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tTWVzc2FnZUNoYW5uZWwoY2FsbGJhY2spIHtcbiAvLyAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAvLyAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbiAvLyAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuIC8vICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbiAvLyAgICAgfTtcbiAvLyB9XG4gLy8gRm9yIHJlYXNvbnMgZXhwbGFpbmVkIGFib3ZlLCB3ZSBhcmUgYWxzbyB1bmFibGUgdG8gdXNlIGBzZXRJbW1lZGlhdGVgXG4gLy8gdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMuXG4gLy8gRXZlbiBpZiB3ZSB3ZXJlLCB0aGVyZSBpcyBhbm90aGVyIGJ1ZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMC5cbiAvLyBJdCBpcyBub3Qgc3VmZmljaWVudCB0byBhc3NpZ24gYHNldEltbWVkaWF0ZWAgdG8gYHJlcXVlc3RGbHVzaGAgYmVjYXVzZVxuIC8vIGBzZXRJbW1lZGlhdGVgIG11c3QgYmUgY2FsbGVkICpieSBuYW1lKiBhbmQgdGhlcmVmb3JlIG11c3QgYmUgd3JhcHBlZCBpbiBhXG4gLy8gY2xvc3VyZS5cbiAvLyBOZXZlciBmb3JnZXQuXG4gLy8gZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuIC8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4gLy8gICAgICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuIC8vICAgICB9O1xuIC8vIH1cbiAvLyBTYWZhcmkgNi4wIGhhcyBhIHByb2JsZW0gd2hlcmUgdGltZXJzIHdpbGwgZ2V0IGxvc3Qgd2hpbGUgdGhlIHVzZXIgaXNcbiAvLyBzY3JvbGxpbmcuIFRoaXMgcHJvYmxlbSBkb2VzIG5vdCBpbXBhY3QgQVNBUCBiZWNhdXNlIFNhZmFyaSA2LjAgc3VwcG9ydHNcbiAvLyBtdXRhdGlvbiBvYnNlcnZlcnMsIHNvIHRoYXQgaW1wbGVtZW50YXRpb24gaXMgdXNlZCBpbnN0ZWFkLlxuIC8vIEhvd2V2ZXIsIGlmIHdlIGV2ZXIgZWxlY3QgdG8gdXNlIHRpbWVycyBpbiBTYWZhcmksIHRoZSBwcmV2YWxlbnQgd29yay1hcm91bmRcbiAvLyBpcyB0byBhZGQgYSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIgdGhhdCBjYWxscyBmb3IgYSBmbHVzaC5cbiAvLyBgc2V0VGltZW91dGAgZG9lcyBub3QgY2FsbCB0aGUgcGFzc2VkIGNhbGxiYWNrIGlmIHRoZSBkZWxheSBpcyBsZXNzIHRoYW5cbiAvLyBhcHByb3hpbWF0ZWx5IDcgaW4gd2ViIHdvcmtlcnMgaW4gRmlyZWZveCA4IHRocm91Z2ggMTgsIGFuZCBzb21ldGltZXMgbm90XG4gLy8gZXZlbiB0aGVuLlxuIC8vIFRoaXMgaXMgZm9yIGBhc2FwLmpzYCBvbmx5LlxuIC8vIEl0cyBuYW1lIHdpbGwgYmUgcGVyaW9kaWNhbGx5IHJhbmRvbWl6ZWQgdG8gYnJlYWsgYW55IGNvZGUgdGhhdCBkZXBlbmRzIG9uXG4gLy8gLy8gaXRzIGV4aXN0ZW5jZS5cbiAvLyByYXdBc2FwLm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lciA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lclxuIC8vIEFTQVAgd2FzIG9yaWdpbmFsbHkgYSBuZXh0VGljayBzaGltIGluY2x1ZGVkIGluIFEuIFRoaXMgd2FzIGZhY3RvcmVkIG91dFxuIC8vIGludG8gdGhpcyBBU0FQIHBhY2thZ2UuIEl0IHdhcyBsYXRlciBhZGFwdGVkIHRvIFJTVlAgd2hpY2ggbWFkZSBmdXJ0aGVyXG4gLy8gYW1lbmRtZW50cy4gVGhlc2UgZGVjaXNpb25zLCBwYXJ0aWN1bGFybHkgdG8gbWFyZ2luYWxpemUgTWVzc2FnZUNoYW5uZWwgYW5kXG4gLy8gdG8gY2FwdHVyZSB0aGUgTXV0YXRpb25PYnNlcnZlciBpbXBsZW1lbnRhdGlvbiBpbiBhIGNsb3N1cmUsIHdlcmUgaW50ZWdyYXRlZFxuIC8vIGJhY2sgaW50byBBU0FQIHByb3Blci5cbiAvLyBodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9yc3ZwLmpzL2Jsb2IvY2RkZjcyMzI1NDZhOWNmODU4NTI0Yjc1Y2RlNmY5ZWRmNzI2MjBhNy9saWIvcnN2cC9hc2FwLmpzXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFzYXBRdWV1ZS5qcy5tYXAiLCIvLyBgY2FsbGAsIGp1c3QgbGlrZSBhIGZ1bmN0aW9uLlxuZXhwb3J0IGNsYXNzIFJhd1Rhc2sge1xuICAgIGNhbGwoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnRhc2sgJiYgdGhpcy50YXNrKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHl7XG4gICAgICAgICAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZWxlYXNlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG9uRXJyb3IsIHJlbGVhc2Upe1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuICAgICAgICB0aGlzLnJlbGVhc2UgPSByZWxlYXNlO1xuICAgICAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmF3VGFzay5qcy5tYXAiLCJpbXBvcnQgeyBSYXdUYXNrIH0gZnJvbSAnLi9SYXdUYXNrLmpzJztcbmV4cG9ydCBjbGFzcyBUYXNrRmFjdG9yeSB7XG4gICAgY3JlYXRlKHRhc2spIHtcbiAgICAgICAgY29uc3QgdGFza3MgPSB0aGlzLmZyZWVUYXNrcztcbiAgICAgICAgY29uc3QgdDEgPSB0YXNrcy5sZW5ndGggPyB0YXNrcy5wb3AoKSA6IG5ldyBSYXdUYXNrKHRoaXMub25FcnJvciwgKHQpPT50YXNrc1t0YXNrcy5sZW5ndGhdID0gdFxuICAgICAgICApO1xuICAgICAgICB0MS50YXNrID0gdGFzaztcbiAgICAgICAgcmV0dXJuIHQxO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihvbkVycm9yKXtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gb25FcnJvcjtcbiAgICAgICAgdGhpcy5mcmVlVGFza3MgPSBbXTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhc2tGYWN0b3J5LmpzLm1hcCIsImltcG9ydCB7IEFzYXBRdWV1ZSB9IGZyb20gJy4vQXNhcFF1ZXVlLmpzJztcbmltcG9ydCB7IFRhc2tGYWN0b3J5IH0gZnJvbSAnLi9UYXNrRmFjdG9yeS5qcyc7XG5jb25zdCBhc2FwUXVldWUgPSBuZXcgQXNhcFF1ZXVlKCk7XG5jb25zdCB0YXNrRmFjdG9yeSA9IG5ldyBUYXNrRmFjdG9yeShhc2FwUXVldWUucmVnaXN0ZXJQZW5kaW5nRXJyb3IpO1xuLyoqXG4gKiBDYWxscyBhIHRhc2sgYXMgc29vbiBhcyBwb3NzaWJsZSBhZnRlciByZXR1cm5pbmcsIGluIGl0cyBvd24gZXZlbnQsIHdpdGggcHJpb3JpdHlcbiAqIG92ZXIgb3RoZXIgZXZlbnRzIGxpa2UgYW5pbWF0aW9uLCByZWZsb3csIGFuZCByZXBhaW50LiBBbiBlcnJvciB0aHJvd24gZnJvbSBhblxuICogZXZlbnQgd2lsbCBub3QgaW50ZXJydXB0LCBub3IgZXZlbiBzdWJzdGFudGlhbGx5IHNsb3cgZG93biB0aGUgcHJvY2Vzc2luZyBvZlxuICogb3RoZXIgZXZlbnRzLCBidXQgd2lsbCBiZSByYXRoZXIgcG9zdHBvbmVkIHRvIGEgbG93ZXIgcHJpb3JpdHkgZXZlbnQuXG4gKiBAcGFyYW0ge3tjYWxsfX0gdGFzayBBIGNhbGxhYmxlIG9iamVjdCwgdHlwaWNhbGx5IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBub1xuICogYXJndW1lbnRzLlxuICovIGV4cG9ydCBmdW5jdGlvbiBhc2FwKHRhc2spIHtcbiAgICBhc2FwUXVldWUuZW5xdWV1ZVRhc2sodGFza0ZhY3RvcnkuY3JlYXRlKHRhc2spKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXNhcC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL2FzYXAuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Bc2FwUXVldWUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9UYXNrRmFjdG9yeS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8gU2FmYXJpIDYgYW5kIDYuMSBmb3IgZGVza3RvcCwgaVBhZCwgYW5kIGlQaG9uZSBhcmUgdGhlIG9ubHkgYnJvd3NlcnMgdGhhdFxuLy8gaGF2ZSBXZWJLaXRNdXRhdGlvbk9ic2VydmVyIGJ1dCBub3QgdW4tcHJlZml4ZWQgTXV0YXRpb25PYnNlcnZlci5cbi8vIE11c3QgdXNlIGBnbG9iYWxgIG9yIGBzZWxmYCBpbnN0ZWFkIG9mIGB3aW5kb3dgIHRvIHdvcmsgaW4gYm90aCBmcmFtZXMgYW5kIHdlYlxuLy8gd29ya2Vycy4gYGdsb2JhbGAgaXMgYSBwcm92aXNpb24gb2YgQnJvd3NlcmlmeSwgTXIsIE1ycywgb3IgTW9wLlxuLyogZ2xvYmFscyBzZWxmICovIGNvbnN0IHNjb3BlID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiBzZWxmO1xuY29uc3QgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPSBzY29wZS5NdXRhdGlvbk9ic2VydmVyIHx8IHNjb3BlLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5leHBvcnQgZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICAvLyBXZSBkaXNwYXRjaCBhIHRpbWVvdXQgd2l0aCBhIHNwZWNpZmllZCBkZWxheSBvZiAwIGZvciBlbmdpbmVzIHRoYXRcbiAgICAgICAgLy8gY2FuIHJlbGlhYmx5IGFjY29tbW9kYXRlIHRoYXQgcmVxdWVzdC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgc25hcHBlZFxuICAgICAgICAvLyB0byBhIDQgbWlsaXNlY29uZCBkZWxheSwgYnV0IG9uY2Ugd2UncmUgZmx1c2hpbmcsIHRoZXJlJ3Mgbm8gZGVsYXlcbiAgICAgICAgLy8gYmV0d2VlbiBldmVudHMuXG4gICAgICAgIGNvbnN0IHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGhhbmRsZVRpbWVyLCAwKTtcbiAgICAgICAgLy8gSG93ZXZlciwgc2luY2UgdGhpcyB0aW1lciBnZXRzIGZyZXF1ZW50bHkgZHJvcHBlZCBpbiBGaXJlZm94XG4gICAgICAgIC8vIHdvcmtlcnMsIHdlIGVubGlzdCBhbiBpbnRlcnZhbCBoYW5kbGUgdGhhdCB3aWxsIHRyeSB0byBmaXJlXG4gICAgICAgIC8vIGFuIGV2ZW50IDIwIHRpbWVzIHBlciBzZWNvbmQgdW50aWwgaXQgc3VjY2VlZHMuXG4gICAgICAgIGNvbnN0IGludGVydmFsSGFuZGxlID0gc2V0SW50ZXJ2YWwoaGFuZGxlVGltZXIsIDUwKTtcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlVGltZXIoKSB7XG4gICAgICAgICAgICAvLyBXaGljaGV2ZXIgdGltZXIgc3VjY2VlZHMgd2lsbCBjYW5jZWwgYm90aCB0aW1lcnMgYW5kXG4gICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBjYWxsYmFjay5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxIYW5kbGUpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vLyBUbyByZXF1ZXN0IGEgaGlnaCBwcmlvcml0eSBldmVudCwgd2UgaW5kdWNlIGEgbXV0YXRpb24gb2JzZXJ2ZXIgYnkgdG9nZ2xpbmdcbi8vIHRoZSB0ZXh0IG9mIGEgdGV4dCBub2RlIGJldHdlZW4gXCIxXCIgYW5kIFwiLTFcIi5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaykge1xuICAgIGxldCB0b2dnbGUgPSAxO1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwge1xuICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICB0b2dnbGUgPSAtdG9nZ2xlO1xuICAgICAgICBub2RlLmRhdGEgPSB0b2dnbGU7XG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBtYWtlUmVxdWVzdENhbGwgPSB0eXBlb2YgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicgPyAvLyByZWxpYWJseSBldmVyeXdoZXJlIHRoZXkgYXJlIGltcGxlbWVudGVkLlxuLy8gVGhleSBhcmUgaW1wbGVtZW50ZWQgaW4gYWxsIG1vZGVybiBicm93c2Vycy5cbi8vXG4vLyAtIEFuZHJvaWQgNC00LjNcbi8vIC0gQ2hyb21lIDI2LTM0XG4vLyAtIEZpcmVmb3ggMTQtMjlcbi8vIC0gSW50ZXJuZXQgRXhwbG9yZXIgMTFcbi8vIC0gaVBhZCBTYWZhcmkgNi03LjFcbi8vIC0gaVBob25lIFNhZmFyaSA3LTcuMVxuLy8gLSBTYWZhcmkgNi03XG5tYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlciA6IC8vIHRhc2sgcXVldWUsIGFyZSBpbXBsZW1lbnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCwgU2FmYXJpIDUuMC0xLCBhbmQgT3BlcmFcbi8vIDExLTEyLCBhbmQgaW4gd2ViIHdvcmtlcnMgaW4gbWFueSBlbmdpbmVzLlxuLy8gQWx0aG91Z2ggbWVzc2FnZSBjaGFubmVscyB5aWVsZCB0byBhbnkgcXVldWVkIHJlbmRlcmluZyBhbmQgSU8gdGFza3MsIHRoZXlcbi8vIHdvdWxkIGJlIGJldHRlciB0aGFuIGltcG9zaW5nIHRoZSA0bXMgZGVsYXkgb2YgdGltZXJzLlxuLy8gSG93ZXZlciwgdGhleSBkbyBub3Qgd29yayByZWxpYWJseSBpbiBJbnRlcm5ldCBFeHBsb3JlciBvciBTYWZhcmkuXG4vLyBJbnRlcm5ldCBFeHBsb3JlciAxMCBpcyB0aGUgb25seSBicm93c2VyIHRoYXQgaGFzIHNldEltbWVkaWF0ZSBidXQgZG9lc1xuLy8gbm90IGhhdmUgTXV0YXRpb25PYnNlcnZlcnMuXG4vLyBBbHRob3VnaCBzZXRJbW1lZGlhdGUgeWllbGRzIHRvIHRoZSBicm93c2VyJ3MgcmVuZGVyZXIsIGl0IHdvdWxkIGJlXG4vLyBwcmVmZXJyYWJsZSB0byBmYWxsaW5nIGJhY2sgdG8gc2V0VGltZW91dCBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlXG4vLyB0aGUgbWluaW11bSA0bXMgcGVuYWx0eS5cbi8vIFVuZm9ydHVuYXRlbHkgdGhlcmUgYXBwZWFycyB0byBiZSBhIGJ1ZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCBNb2JpbGUgKGFuZFxuLy8gRGVza3RvcCB0byBhIGxlc3NlciBleHRlbnQpIHRoYXQgcmVuZGVycyBib3RoIHNldEltbWVkaWF0ZSBhbmRcbi8vIE1lc3NhZ2VDaGFubmVsIHVzZWxlc3MgZm9yIHRoZSBwdXJwb3NlcyBvZiBBU0FQLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL2lzc3Vlcy8zOTZcbi8vIFRpbWVycyBhcmUgaW1wbGVtZW50ZWQgdW5pdmVyc2FsbHkuXG4vLyBXZSBmYWxsIGJhY2sgdG8gdGltZXJzIGluIHdvcmtlcnMgaW4gbW9zdCBlbmdpbmVzLCBhbmQgaW4gZm9yZWdyb3VuZFxuLy8gY29udGV4dHMgaW4gdGhlIGZvbGxvd2luZyBicm93c2Vycy5cbi8vIEhvd2V2ZXIsIG5vdGUgdGhhdCBldmVuIHRoaXMgc2ltcGxlIGNhc2UgcmVxdWlyZXMgbnVhbmNlcyB0byBvcGVyYXRlIGluIGFcbi8vIGJyb2FkIHNwZWN0cnVtIG9mIGJyb3dzZXJzLlxuLy9cbi8vIC0gRmlyZWZveCAzLTEzXG4vLyAtIEludGVybmV0IEV4cGxvcmVyIDYtOVxuLy8gLSBpUGFkIFNhZmFyaSA0LjNcbi8vIC0gTHlueCAyLjguN1xubWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYWtlUmVxdWVzdENhbGwuanMubWFwIiwiZXhwb3J0IHsgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncykge1xuICAgIGlmIChpc1Byb2R1Y3Rpb24oKSkge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgKyAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhcmdJbmRleCA9IDA7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMSAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgICAgICA7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUHJvZHVjdGlvbigpIHtcbiAgICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52WydOT0RFX0VOViddID09PSAncHJvZHVjdGlvbic7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIHNyYy9pbmRleC50c1xuZXhwb3J0ICogZnJvbSBcInJlZHV4XCI7XG5pbXBvcnQgeyBwcm9kdWNlLCBjdXJyZW50IGFzIGN1cnJlbnQzLCBmcmVlemUsIG9yaWdpbmFsIGFzIG9yaWdpbmFsMiwgaXNEcmFmdCBhcyBpc0RyYWZ0NSB9IGZyb20gXCJpbW1lclwiO1xuaW1wb3J0IHsgY3JlYXRlU2VsZWN0b3IsIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvciBhcyBjcmVhdGVTZWxlY3RvckNyZWF0b3IyLCBscnVNZW1vaXplLCB3ZWFrTWFwTWVtb2l6ZSBhcyB3ZWFrTWFwTWVtb2l6ZTIgfSBmcm9tIFwicmVzZWxlY3RcIjtcblxuLy8gc3JjL2NyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yLnRzXG5pbXBvcnQgeyBjdXJyZW50LCBpc0RyYWZ0IH0gZnJvbSBcImltbWVyXCI7XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RvckNyZWF0b3IsIHdlYWtNYXBNZW1vaXplIH0gZnJvbSBcInJlc2VsZWN0XCI7XG52YXIgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JDcmVhdG9yID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgY3JlYXRlU2VsZWN0b3IyID0gY3JlYXRlU2VsZWN0b3JDcmVhdG9yKC4uLmFyZ3MpO1xuICBjb25zdCBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjIgPSBPYmplY3QuYXNzaWduKCguLi5hcmdzMikgPT4ge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IyKC4uLmFyZ3MyKTtcbiAgICBjb25zdCB3cmFwcGVkU2VsZWN0b3IgPSAodmFsdWUsIC4uLnJlc3QpID0+IHNlbGVjdG9yKGlzRHJhZnQodmFsdWUpID8gY3VycmVudCh2YWx1ZSkgOiB2YWx1ZSwgLi4ucmVzdCk7XG4gICAgT2JqZWN0LmFzc2lnbih3cmFwcGVkU2VsZWN0b3IsIHNlbGVjdG9yKTtcbiAgICByZXR1cm4gd3JhcHBlZFNlbGVjdG9yO1xuICB9LCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjJcbiAgfSk7XG4gIHJldHVybiBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcjI7XG59O1xudmFyIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yQ3JlYXRvcih3ZWFrTWFwTWVtb2l6ZSk7XG5cbi8vIHNyYy9jb25maWd1cmVTdG9yZS50c1xuaW1wb3J0IHsgYXBwbHlNaWRkbGV3YXJlLCBjcmVhdGVTdG9yZSwgY29tcG9zZSBhcyBjb21wb3NlMiwgY29tYmluZVJlZHVjZXJzLCBpc1BsYWluT2JqZWN0IGFzIGlzUGxhaW5PYmplY3QyIH0gZnJvbSBcInJlZHV4XCI7XG5cbi8vIHNyYy9kZXZ0b29sc0V4dGVuc2lvbi50c1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gXCJyZWR1eFwiO1xudmFyIGNvbXBvc2VXaXRoRGV2VG9vbHMgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18gPyB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9fIDogZnVuY3Rpb24oKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdm9pZCAwO1xuICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gXCJvYmplY3RcIikgcmV0dXJuIGNvbXBvc2U7XG4gIHJldHVybiBjb21wb3NlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59O1xudmFyIGRldlRvb2xzRW5oYW5jZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fID8gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gOiBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vb3AzKSB7XG4gICAgcmV0dXJuIG5vb3AzO1xuICB9O1xufTtcblxuLy8gc3JjL2dldERlZmF1bHRNaWRkbGV3YXJlLnRzXG5pbXBvcnQgeyB0aHVuayBhcyB0aHVua01pZGRsZXdhcmUsIHdpdGhFeHRyYUFyZ3VtZW50IH0gZnJvbSBcInJlZHV4LXRodW5rXCI7XG5cbi8vIHNyYy9jcmVhdGVBY3Rpb24udHNcbmltcG9ydCB7IGlzQWN0aW9uIH0gZnJvbSBcInJlZHV4XCI7XG5cbi8vIHNyYy90c0hlbHBlcnMudHNcbnZhciBoYXNNYXRjaEZ1bmN0aW9uID0gKHYpID0+IHtcbiAgcmV0dXJuIHYgJiYgdHlwZW9mIHYubWF0Y2ggPT09IFwiZnVuY3Rpb25cIjtcbn07XG5cbi8vIHNyYy9jcmVhdGVBY3Rpb24udHNcbmZ1bmN0aW9uIGNyZWF0ZUFjdGlvbih0eXBlLCBwcmVwYXJlQWN0aW9uKSB7XG4gIGZ1bmN0aW9uIGFjdGlvbkNyZWF0b3IoLi4uYXJncykge1xuICAgIGlmIChwcmVwYXJlQWN0aW9uKSB7XG4gICAgICBsZXQgcHJlcGFyZWQgPSBwcmVwYXJlQWN0aW9uKC4uLmFyZ3MpO1xuICAgICAgaWYgKCFwcmVwYXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgwKSA6IFwicHJlcGFyZUFjdGlvbiBkaWQgbm90IHJldHVybiBhbiBvYmplY3RcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBwYXlsb2FkOiBwcmVwYXJlZC5wYXlsb2FkLFxuICAgICAgICAuLi5cIm1ldGFcIiBpbiBwcmVwYXJlZCAmJiB7XG4gICAgICAgICAgbWV0YTogcHJlcGFyZWQubWV0YVxuICAgICAgICB9LFxuICAgICAgICAuLi5cImVycm9yXCIgaW4gcHJlcGFyZWQgJiYge1xuICAgICAgICAgIGVycm9yOiBwcmVwYXJlZC5lcnJvclxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZSxcbiAgICAgIHBheWxvYWQ6IGFyZ3NbMF1cbiAgICB9O1xuICB9XG4gIGFjdGlvbkNyZWF0b3IudG9TdHJpbmcgPSAoKSA9PiBgJHt0eXBlfWA7XG4gIGFjdGlvbkNyZWF0b3IudHlwZSA9IHR5cGU7XG4gIGFjdGlvbkNyZWF0b3IubWF0Y2ggPSAoYWN0aW9uKSA9PiBpc0FjdGlvbihhY3Rpb24pICYmIGFjdGlvbi50eXBlID09PSB0eXBlO1xuICByZXR1cm4gYWN0aW9uQ3JlYXRvcjtcbn1cbmZ1bmN0aW9uIGlzQWN0aW9uQ3JlYXRvcihhY3Rpb24pIHtcbiAgcmV0dXJuIHR5cGVvZiBhY3Rpb24gPT09IFwiZnVuY3Rpb25cIiAmJiBcInR5cGVcIiBpbiBhY3Rpb24gJiYgLy8gaGFzTWF0Y2hGdW5jdGlvbiBvbmx5IHdhbnRzIE1hdGNoZXJzIGJ1dCBJIGRvbid0IHNlZSB0aGUgcG9pbnQgaW4gcmV3cml0aW5nIGl0XG4gIGhhc01hdGNoRnVuY3Rpb24oYWN0aW9uKTtcbn1cbmZ1bmN0aW9uIGlzRlNBKGFjdGlvbikge1xuICByZXR1cm4gaXNBY3Rpb24oYWN0aW9uKSAmJiBPYmplY3Qua2V5cyhhY3Rpb24pLmV2ZXJ5KGlzVmFsaWRLZXkpO1xufVxuZnVuY3Rpb24gaXNWYWxpZEtleShrZXkpIHtcbiAgcmV0dXJuIFtcInR5cGVcIiwgXCJwYXlsb2FkXCIsIFwiZXJyb3JcIiwgXCJtZXRhXCJdLmluZGV4T2Yoa2V5KSA+IC0xO1xufVxuXG4vLyBzcmMvYWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGdldE1lc3NhZ2UodHlwZSkge1xuICBjb25zdCBzcGxpdFR5cGUgPSB0eXBlID8gYCR7dHlwZX1gLnNwbGl0KFwiL1wiKSA6IFtdO1xuICBjb25zdCBhY3Rpb25OYW1lID0gc3BsaXRUeXBlW3NwbGl0VHlwZS5sZW5ndGggLSAxXSB8fCBcImFjdGlvbkNyZWF0b3JcIjtcbiAgcmV0dXJuIGBEZXRlY3RlZCBhbiBhY3Rpb24gY3JlYXRvciB3aXRoIHR5cGUgXCIke3R5cGUgfHwgXCJ1bmtub3duXCJ9XCIgYmVpbmcgZGlzcGF0Y2hlZC4gXG5NYWtlIHN1cmUgeW91J3JlIGNhbGxpbmcgdGhlIGFjdGlvbiBjcmVhdG9yIGJlZm9yZSBkaXNwYXRjaGluZywgaS5lLiBcXGBkaXNwYXRjaCgke2FjdGlvbk5hbWV9KCkpXFxgIGluc3RlYWQgb2YgXFxgZGlzcGF0Y2goJHthY3Rpb25OYW1lfSlcXGAuIFRoaXMgaXMgbmVjZXNzYXJ5IGV2ZW4gaWYgdGhlIGFjdGlvbiBoYXMgbm8gcGF5bG9hZC5gO1xufVxuZnVuY3Rpb24gY3JlYXRlQWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUob3B0aW9ucyA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IG5leHQoYWN0aW9uKTtcbiAgfVxuICBjb25zdCB7XG4gICAgaXNBY3Rpb25DcmVhdG9yOiBpc0FjdGlvbkNyZWF0b3IyID0gaXNBY3Rpb25DcmVhdG9yXG4gIH0gPSBvcHRpb25zO1xuICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICBpZiAoaXNBY3Rpb25DcmVhdG9yMihhY3Rpb24pKSB7XG4gICAgICBjb25zb2xlLndhcm4oZ2V0TWVzc2FnZShhY3Rpb24udHlwZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICB9O1xufVxuXG4vLyBzcmMvdXRpbHMudHNcbmltcG9ydCB7IHByb2R1Y2UgYXMgY3JlYXRlTmV4dFN0YXRlLCBpc0RyYWZ0YWJsZSB9IGZyb20gXCJpbW1lclwiO1xuZnVuY3Rpb24gZ2V0VGltZU1lYXN1cmVVdGlscyhtYXhEZWxheSwgZm5OYW1lKSB7XG4gIGxldCBlbGFwc2VkID0gMDtcbiAgcmV0dXJuIHtcbiAgICBtZWFzdXJlVGltZShmbikge1xuICAgICAgY29uc3Qgc3RhcnRlZCA9IERhdGUubm93KCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkID0gRGF0ZS5ub3coKTtcbiAgICAgICAgZWxhcHNlZCArPSBmaW5pc2hlZCAtIHN0YXJ0ZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgICB3YXJuSWZFeGNlZWRlZCgpIHtcbiAgICAgIGlmIChlbGFwc2VkID4gbWF4RGVsYXkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAke2ZuTmFtZX0gdG9vayAke2VsYXBzZWR9bXMsIHdoaWNoIGlzIG1vcmUgdGhhbiB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJHttYXhEZWxheX1tcy4gXG5JZiB5b3VyIHN0YXRlIG9yIGFjdGlvbnMgYXJlIHZlcnkgbGFyZ2UsIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIHRoZSBtaWRkbGV3YXJlIGFzIGl0IG1pZ2h0IGNhdXNlIHRvbyBtdWNoIG9mIGEgc2xvd2Rvd24gaW4gZGV2ZWxvcG1lbnQgbW9kZS4gU2VlIGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2dldERlZmF1bHRNaWRkbGV3YXJlIGZvciBpbnN0cnVjdGlvbnMuXG5JdCBpcyBkaXNhYmxlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcywgc28geW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdC5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBmaW5kKGl0ZXJhYmxlLCBjb21wYXJhdG9yKSB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgaXRlcmFibGUpIHtcbiAgICBpZiAoY29tcGFyYXRvcihlbnRyeSkpIHtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbnZhciBUdXBsZSA9IGNsYXNzIF9UdXBsZSBleHRlbmRzIEFycmF5IHtcbiAgY29uc3RydWN0b3IoLi4uaXRlbXMpIHtcbiAgICBzdXBlciguLi5pdGVtcyk7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIF9UdXBsZS5wcm90b3R5cGUpO1xuICB9XG4gIHN0YXRpYyBnZXQgW1N5bWJvbC5zcGVjaWVzXSgpIHtcbiAgICByZXR1cm4gX1R1cGxlO1xuICB9XG4gIGNvbmNhdCguLi5hcnIpIHtcbiAgICByZXR1cm4gc3VwZXIuY29uY2F0LmFwcGx5KHRoaXMsIGFycik7XG4gIH1cbiAgcHJlcGVuZCguLi5hcnIpIHtcbiAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyclswXSkpIHtcbiAgICAgIHJldHVybiBuZXcgX1R1cGxlKC4uLmFyclswXS5jb25jYXQodGhpcykpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IF9UdXBsZSguLi5hcnIuY29uY2F0KHRoaXMpKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGZyZWV6ZURyYWZ0YWJsZSh2YWwpIHtcbiAgcmV0dXJuIGlzRHJhZnRhYmxlKHZhbCkgPyBjcmVhdGVOZXh0U3RhdGUodmFsLCAoKSA9PiB7XG4gIH0pIDogdmFsO1xufVxuZnVuY3Rpb24gZW1wbGFjZShtYXAsIGtleSwgaGFuZGxlcikge1xuICBpZiAobWFwLmhhcyhrZXkpKSB7XG4gICAgbGV0IHZhbHVlID0gbWFwLmdldChrZXkpO1xuICAgIGlmIChoYW5kbGVyLnVwZGF0ZSkge1xuICAgICAgdmFsdWUgPSBoYW5kbGVyLnVwZGF0ZSh2YWx1ZSwga2V5LCBtYXApO1xuICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICghaGFuZGxlci5pbnNlcnQpIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEwKSA6IFwiTm8gaW5zZXJ0IHByb3ZpZGVkIGZvciBrZXkgbm90IGFscmVhZHkgaW4gbWFwXCIpO1xuICBjb25zdCBpbnNlcnRlZCA9IGhhbmRsZXIuaW5zZXJ0KGtleSwgbWFwKTtcbiAgbWFwLnNldChrZXksIGluc2VydGVkKTtcbiAgcmV0dXJuIGluc2VydGVkO1xufVxuXG4vLyBzcmMvaW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBpc0ltbXV0YWJsZURlZmF1bHQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PSBudWxsIHx8IE9iamVjdC5pc0Zyb3plbih2YWx1ZSk7XG59XG5mdW5jdGlvbiB0cmFja0Zvck11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9iaikge1xuICBjb25zdCB0cmFja2VkUHJvcGVydGllcyA9IHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9iaik7XG4gIHJldHVybiB7XG4gICAgZGV0ZWN0TXV0YXRpb25zKCkge1xuICAgICAgcmV0dXJuIGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIHRyYWNrZWRQcm9wZXJ0aWVzLCBvYmopO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMgPSBbXSwgb2JqLCBwYXRoID0gXCJcIiwgY2hlY2tlZE9iamVjdHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSB7XG4gIGNvbnN0IHRyYWNrZWQgPSB7XG4gICAgdmFsdWU6IG9ialxuICB9O1xuICBpZiAoIWlzSW1tdXRhYmxlKG9iaikgJiYgIWNoZWNrZWRPYmplY3RzLmhhcyhvYmopKSB7XG4gICAgY2hlY2tlZE9iamVjdHMuYWRkKG9iaik7XG4gICAgdHJhY2tlZC5jaGlsZHJlbiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aCA/IHBhdGggKyBcIi5cIiArIGtleSA6IGtleTtcbiAgICAgIGlmIChpZ25vcmVQYXRocy5sZW5ndGggJiYgaWdub3JlUGF0aHMuaW5kZXhPZihjaGlsZFBhdGgpICE9PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRyYWNrZWQuY2hpbGRyZW5ba2V5XSA9IHRyYWNrUHJvcGVydGllcyhpc0ltbXV0YWJsZSwgaWdub3JlUGF0aHMsIG9ialtrZXldLCBjaGlsZFBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJhY2tlZDtcbn1cbmZ1bmN0aW9uIGRldGVjdE11dGF0aW9ucyhpc0ltbXV0YWJsZSwgaWdub3JlZFBhdGhzID0gW10sIHRyYWNrZWRQcm9wZXJ0eSwgb2JqLCBzYW1lUGFyZW50UmVmID0gZmFsc2UsIHBhdGggPSBcIlwiKSB7XG4gIGNvbnN0IHByZXZPYmogPSB0cmFja2VkUHJvcGVydHkgPyB0cmFja2VkUHJvcGVydHkudmFsdWUgOiB2b2lkIDA7XG4gIGNvbnN0IHNhbWVSZWYgPSBwcmV2T2JqID09PSBvYmo7XG4gIGlmIChzYW1lUGFyZW50UmVmICYmICFzYW1lUmVmICYmICFOdW1iZXIuaXNOYU4ob2JqKSkge1xuICAgIHJldHVybiB7XG4gICAgICB3YXNNdXRhdGVkOiB0cnVlLFxuICAgICAgcGF0aFxuICAgIH07XG4gIH1cbiAgaWYgKGlzSW1tdXRhYmxlKHByZXZPYmopIHx8IGlzSW1tdXRhYmxlKG9iaikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2FzTXV0YXRlZDogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNvbnN0IGtleXNUb0RldGVjdCA9IHt9O1xuICBmb3IgKGxldCBrZXkgaW4gdHJhY2tlZFByb3BlcnR5LmNoaWxkcmVuKSB7XG4gICAga2V5c1RvRGV0ZWN0W2tleV0gPSB0cnVlO1xuICB9XG4gIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICBrZXlzVG9EZXRlY3Rba2V5XSA9IHRydWU7XG4gIH1cbiAgY29uc3QgaGFzSWdub3JlZFBhdGhzID0gaWdub3JlZFBhdGhzLmxlbmd0aCA+IDA7XG4gIGZvciAobGV0IGtleSBpbiBrZXlzVG9EZXRlY3QpIHtcbiAgICBjb25zdCBuZXN0ZWRQYXRoID0gcGF0aCA/IHBhdGggKyBcIi5cIiArIGtleSA6IGtleTtcbiAgICBpZiAoaGFzSWdub3JlZFBhdGhzKSB7XG4gICAgICBjb25zdCBoYXNNYXRjaGVzID0gaWdub3JlZFBhdGhzLnNvbWUoKGlnbm9yZWQpID0+IHtcbiAgICAgICAgaWYgKGlnbm9yZWQgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICByZXR1cm4gaWdub3JlZC50ZXN0KG5lc3RlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXN0ZWRQYXRoID09PSBpZ25vcmVkO1xuICAgICAgfSk7XG4gICAgICBpZiAoaGFzTWF0Y2hlcykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZGV0ZWN0TXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVkUGF0aHMsIHRyYWNrZWRQcm9wZXJ0eS5jaGlsZHJlbltrZXldLCBvYmpba2V5XSwgc2FtZVJlZiwgbmVzdGVkUGF0aCk7XG4gICAgaWYgKHJlc3VsdC53YXNNdXRhdGVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHdhc011dGF0ZWQ6IGZhbHNlXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUob3B0aW9ucyA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IG5leHQoYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgc3RyaW5naWZ5MiA9IGZ1bmN0aW9uKG9iaiwgc2VyaWFsaXplciwgaW5kZW50LCBkZWN5Y2xlcikge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgZ2V0U2VyaWFsaXplMihzZXJpYWxpemVyLCBkZWN5Y2xlciksIGluZGVudCk7XG4gICAgfSwgZ2V0U2VyaWFsaXplMiA9IGZ1bmN0aW9uKHNlcmlhbGl6ZXIsIGRlY3ljbGVyKSB7XG4gICAgICBsZXQgc3RhY2sgPSBbXSwga2V5cyA9IFtdO1xuICAgICAgaWYgKCFkZWN5Y2xlcikgZGVjeWNsZXIgPSBmdW5jdGlvbihfLCB2YWx1ZSkge1xuICAgICAgICBpZiAoc3RhY2tbMF0gPT09IHZhbHVlKSByZXR1cm4gXCJbQ2lyY3VsYXIgfl1cIjtcbiAgICAgICAgcmV0dXJuIFwiW0NpcmN1bGFyIH4uXCIgKyBrZXlzLnNsaWNlKDAsIHN0YWNrLmluZGV4T2YodmFsdWUpKS5qb2luKFwiLlwiKSArIFwiXVwiO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIHRoaXNQb3MgPSBzdGFjay5pbmRleE9mKHRoaXMpO1xuICAgICAgICAgIH50aGlzUG9zID8gc3RhY2suc3BsaWNlKHRoaXNQb3MgKyAxKSA6IHN0YWNrLnB1c2godGhpcyk7XG4gICAgICAgICAgfnRoaXNQb3MgPyBrZXlzLnNwbGljZSh0aGlzUG9zLCBJbmZpbml0eSwga2V5KSA6IGtleXMucHVzaChrZXkpO1xuICAgICAgICAgIGlmICh+c3RhY2suaW5kZXhPZih2YWx1ZSkpIHZhbHVlID0gZGVjeWNsZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHN0YWNrLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplciA9PSBudWxsID8gdmFsdWUgOiBzZXJpYWxpemVyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICB9O1xuICAgIH07XG4gICAgdmFyIHN0cmluZ2lmeSA9IHN0cmluZ2lmeTIsIGdldFNlcmlhbGl6ZSA9IGdldFNlcmlhbGl6ZTI7XG4gICAgbGV0IHtcbiAgICAgIGlzSW1tdXRhYmxlID0gaXNJbW11dGFibGVEZWZhdWx0LFxuICAgICAgaWdub3JlZFBhdGhzLFxuICAgICAgd2FybkFmdGVyID0gMzJcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB0cmFjayA9IHRyYWNrRm9yTXV0YXRpb25zLmJpbmQobnVsbCwgaXNJbW11dGFibGUsIGlnbm9yZWRQYXRocyk7XG4gICAgcmV0dXJuICh7XG4gICAgICBnZXRTdGF0ZVxuICAgIH0pID0+IHtcbiAgICAgIGxldCBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICBsZXQgdHJhY2tlciA9IHRyYWNrKHN0YXRlKTtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICByZXR1cm4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgbWVhc3VyZVV0aWxzID0gZ2V0VGltZU1lYXN1cmVVdGlscyh3YXJuQWZ0ZXIsIFwiSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlXCIpO1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgICByZXN1bHQgPSB0cmFja2VyLmRldGVjdE11dGF0aW9ucygpO1xuICAgICAgICAgIHRyYWNrZXIgPSB0cmFjayhzdGF0ZSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC53YXNNdXRhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxOSkgOiBgQSBzdGF0ZSBtdXRhdGlvbiB3YXMgZGV0ZWN0ZWQgYmV0d2VlbiBkaXNwYXRjaGVzLCBpbiB0aGUgcGF0aCAnJHtyZXN1bHQucGF0aCB8fCBcIlwifScuICBUaGlzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IuIChodHRwczovL3JlZHV4LmpzLm9yZy9zdHlsZS1ndWlkZS9zdHlsZS1ndWlkZSNkby1ub3QtbXV0YXRlLXN0YXRlKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZWRBY3Rpb24gPSBuZXh0KGFjdGlvbik7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgIHJlc3VsdCA9IHRyYWNrZXIuZGV0ZWN0TXV0YXRpb25zKCk7XG4gICAgICAgICAgdHJhY2tlciA9IHRyYWNrKHN0YXRlKTtcbiAgICAgICAgICBpZiAocmVzdWx0Lndhc011dGF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIwKSA6IGBBIHN0YXRlIG11dGF0aW9uIHdhcyBkZXRlY3RlZCBpbnNpZGUgYSBkaXNwYXRjaCwgaW4gdGhlIHBhdGg6ICR7cmVzdWx0LnBhdGggfHwgXCJcIn0uIFRha2UgYSBsb29rIGF0IHRoZSByZWR1Y2VyKHMpIGhhbmRsaW5nIHRoZSBhY3Rpb24gJHtzdHJpbmdpZnkyKGFjdGlvbil9LiAoaHR0cHM6Ly9yZWR1eC5qcy5vcmcvc3R5bGUtZ3VpZGUvc3R5bGUtZ3VpZGUjZG8tbm90LW11dGF0ZS1zdGF0ZSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtZWFzdXJlVXRpbHMud2FybklmRXhjZWVkZWQoKTtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoZWRBY3Rpb247XG4gICAgICB9O1xuICAgIH07XG4gIH1cbn1cblxuLy8gc3JjL3NlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZS50c1xuaW1wb3J0IHsgaXNBY3Rpb24gYXMgaXNBY3Rpb24yLCBpc1BsYWluT2JqZWN0IH0gZnJvbSBcInJlZHV4XCI7XG5mdW5jdGlvbiBpc1BsYWluKHZhbCkge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgcmV0dXJuIHZhbCA9PSBudWxsIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgfHwgdHlwZSA9PT0gXCJudW1iZXJcIiB8fCBBcnJheS5pc0FycmF5KHZhbCkgfHwgaXNQbGFpbk9iamVjdCh2YWwpO1xufVxuZnVuY3Rpb24gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKHZhbHVlLCBwYXRoID0gXCJcIiwgaXNTZXJpYWxpemFibGUgPSBpc1BsYWluLCBnZXRFbnRyaWVzLCBpZ25vcmVkUGF0aHMgPSBbXSwgY2FjaGUpIHtcbiAgbGV0IGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlO1xuICBpZiAoIWlzU2VyaWFsaXphYmxlKHZhbHVlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBrZXlQYXRoOiBwYXRoIHx8IFwiPHJvb3Q+XCIsXG4gICAgICB2YWx1ZVxuICAgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoY2FjaGU/Lmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZW50cmllcyA9IGdldEVudHJpZXMgIT0gbnVsbCA/IGdldEVudHJpZXModmFsdWUpIDogT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICBjb25zdCBoYXNJZ25vcmVkUGF0aHMgPSBpZ25vcmVkUGF0aHMubGVuZ3RoID4gMDtcbiAgZm9yIChjb25zdCBba2V5LCBuZXN0ZWRWYWx1ZV0gb2YgZW50cmllcykge1xuICAgIGNvbnN0IG5lc3RlZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xuICAgIGlmIChoYXNJZ25vcmVkUGF0aHMpIHtcbiAgICAgIGNvbnN0IGhhc01hdGNoZXMgPSBpZ25vcmVkUGF0aHMuc29tZSgoaWdub3JlZCkgPT4ge1xuICAgICAgICBpZiAoaWdub3JlZCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgIHJldHVybiBpZ25vcmVkLnRlc3QobmVzdGVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5lc3RlZFBhdGggPT09IGlnbm9yZWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChoYXNNYXRjaGVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzU2VyaWFsaXphYmxlKG5lc3RlZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5UGF0aDogbmVzdGVkUGF0aCxcbiAgICAgICAgdmFsdWU6IG5lc3RlZFZhbHVlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5lc3RlZFZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShuZXN0ZWRWYWx1ZSwgbmVzdGVkUGF0aCwgaXNTZXJpYWxpemFibGUsIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocywgY2FjaGUpO1xuICAgICAgaWYgKGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZE5lc3RlZFNlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGNhY2hlICYmIGlzTmVzdGVkRnJvemVuKHZhbHVlKSkgY2FjaGUuYWRkKHZhbHVlKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNOZXN0ZWRGcm96ZW4odmFsdWUpIHtcbiAgaWYgKCFPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgbmVzdGVkVmFsdWUgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICBpZiAodHlwZW9mIG5lc3RlZFZhbHVlICE9PSBcIm9iamVjdFwiIHx8IG5lc3RlZFZhbHVlID09PSBudWxsKSBjb250aW51ZTtcbiAgICBpZiAoIWlzTmVzdGVkRnJvemVuKG5lc3RlZFZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKG9wdGlvbnMgPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgcmV0dXJuICgpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiBuZXh0KGFjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNTZXJpYWxpemFibGUgPSBpc1BsYWluLFxuICAgICAgZ2V0RW50cmllcyxcbiAgICAgIGlnbm9yZWRBY3Rpb25zID0gW10sXG4gICAgICBpZ25vcmVkQWN0aW9uUGF0aHMgPSBbXCJtZXRhLmFyZ1wiLCBcIm1ldGEuYmFzZVF1ZXJ5TWV0YVwiXSxcbiAgICAgIGlnbm9yZWRQYXRocyA9IFtdLFxuICAgICAgd2FybkFmdGVyID0gMzIsXG4gICAgICBpZ25vcmVTdGF0ZSA9IGZhbHNlLFxuICAgICAgaWdub3JlQWN0aW9ucyA9IGZhbHNlLFxuICAgICAgZGlzYWJsZUNhY2hlID0gZmFsc2VcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjYWNoZSA9ICFkaXNhYmxlQ2FjaGUgJiYgV2Vha1NldCA/IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpIDogdm9pZCAwO1xuICAgIHJldHVybiAoc3RvcmVBUEkpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIWlzQWN0aW9uMihhY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXh0KGFjdGlvbik7XG4gICAgICBjb25zdCBtZWFzdXJlVXRpbHMgPSBnZXRUaW1lTWVhc3VyZVV0aWxzKHdhcm5BZnRlciwgXCJTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmVcIik7XG4gICAgICBpZiAoIWlnbm9yZUFjdGlvbnMgJiYgIShpZ25vcmVkQWN0aW9ucy5sZW5ndGggJiYgaWdub3JlZEFjdGlvbnMuaW5kZXhPZihhY3Rpb24udHlwZSkgIT09IC0xKSkge1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvdW5kQWN0aW9uTm9uU2VyaWFsaXphYmxlVmFsdWUgPSBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUoYWN0aW9uLCBcIlwiLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZEFjdGlvblBhdGhzLCBjYWNoZSk7XG4gICAgICAgICAgaWYgKGZvdW5kQWN0aW9uTm9uU2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAga2V5UGF0aCxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0gPSBmb3VuZEFjdGlvbk5vblNlcmlhbGl6YWJsZVZhbHVlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQSBub24tc2VyaWFsaXphYmxlIHZhbHVlIHdhcyBkZXRlY3RlZCBpbiBhbiBhY3Rpb24sIGluIHRoZSBwYXRoOiBcXGAke2tleVBhdGh9XFxgLiBWYWx1ZTpgLCB2YWx1ZSwgXCJcXG5UYWtlIGEgbG9vayBhdCB0aGUgbG9naWMgdGhhdCBkaXNwYXRjaGVkIHRoaXMgYWN0aW9uOiBcIiwgYWN0aW9uLCBcIlxcbihTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvZmFxL2FjdGlvbnMjd2h5LXNob3VsZC10eXBlLWJlLWEtc3RyaW5nLW9yLWF0LWxlYXN0LXNlcmlhbGl6YWJsZS13aHktc2hvdWxkLW15LWFjdGlvbi10eXBlcy1iZS1jb25zdGFudHMpXCIsIFwiXFxuKFRvIGFsbG93IG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIHNlZTogaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy91c2FnZS91c2FnZS1ndWlkZSN3b3JraW5nLXdpdGgtbm9uLXNlcmlhbGl6YWJsZS1kYXRhKVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFpZ25vcmVTdGF0ZSkge1xuICAgICAgICBtZWFzdXJlVXRpbHMubWVhc3VyZVRpbWUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gc3RvcmVBUEkuZ2V0U3RhdGUoKTtcbiAgICAgICAgICBjb25zdCBmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWUgPSBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUoc3RhdGUsIFwiXCIsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkUGF0aHMsIGNhY2hlKTtcbiAgICAgICAgICBpZiAoZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGtleVBhdGgsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9ID0gZm91bmRTdGF0ZU5vblNlcmlhbGl6YWJsZVZhbHVlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQSBub24tc2VyaWFsaXphYmxlIHZhbHVlIHdhcyBkZXRlY3RlZCBpbiB0aGUgc3RhdGUsIGluIHRoZSBwYXRoOiBcXGAke2tleVBhdGh9XFxgLiBWYWx1ZTpgLCB2YWx1ZSwgYFxuVGFrZSBhIGxvb2sgYXQgdGhlIHJlZHVjZXIocykgaGFuZGxpbmcgdGhpcyBhY3Rpb24gdHlwZTogJHthY3Rpb24udHlwZX0uXG4oU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2ZhcS9vcmdhbml6aW5nLXN0YXRlI2Nhbi1pLXB1dC1mdW5jdGlvbnMtcHJvbWlzZXMtb3Itb3RoZXItbm9uLXNlcmlhbGl6YWJsZS1pdGVtcy1pbi1teS1zdG9yZS1zdGF0ZSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtZWFzdXJlVXRpbHMud2FybklmRXhjZWVkZWQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxufVxuXG4vLyBzcmMvZ2V0RGVmYXVsdE1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGlzQm9vbGVhbih4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJib29sZWFuXCI7XG59XG52YXIgYnVpbGRHZXREZWZhdWx0TWlkZGxld2FyZSA9ICgpID0+IGZ1bmN0aW9uIGdldERlZmF1bHRNaWRkbGV3YXJlKG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIHRodW5rID0gdHJ1ZSxcbiAgICBpbW11dGFibGVDaGVjayA9IHRydWUsXG4gICAgc2VyaWFsaXphYmxlQ2hlY2sgPSB0cnVlLFxuICAgIGFjdGlvbkNyZWF0b3JDaGVjayA9IHRydWVcbiAgfSA9IG9wdGlvbnMgPz8ge307XG4gIGxldCBtaWRkbGV3YXJlQXJyYXkgPSBuZXcgVHVwbGUoKTtcbiAgaWYgKHRodW5rKSB7XG4gICAgaWYgKGlzQm9vbGVhbih0aHVuaykpIHtcbiAgICAgIG1pZGRsZXdhcmVBcnJheS5wdXNoKHRodW5rTWlkZGxld2FyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pZGRsZXdhcmVBcnJheS5wdXNoKHdpdGhFeHRyYUFyZ3VtZW50KHRodW5rLmV4dHJhQXJndW1lbnQpKTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmIChpbW11dGFibGVDaGVjaykge1xuICAgICAgbGV0IGltbXV0YWJsZU9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghaXNCb29sZWFuKGltbXV0YWJsZUNoZWNrKSkge1xuICAgICAgICBpbW11dGFibGVPcHRpb25zID0gaW1tdXRhYmxlQ2hlY2s7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlQXJyYXkudW5zaGlmdChjcmVhdGVJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUoaW1tdXRhYmxlT3B0aW9ucykpO1xuICAgIH1cbiAgICBpZiAoc2VyaWFsaXphYmxlQ2hlY2spIHtcbiAgICAgIGxldCBzZXJpYWxpemFibGVPcHRpb25zID0ge307XG4gICAgICBpZiAoIWlzQm9vbGVhbihzZXJpYWxpemFibGVDaGVjaykpIHtcbiAgICAgICAgc2VyaWFsaXphYmxlT3B0aW9ucyA9IHNlcmlhbGl6YWJsZUNoZWNrO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2goY3JlYXRlU2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlKHNlcmlhbGl6YWJsZU9wdGlvbnMpKTtcbiAgICB9XG4gICAgaWYgKGFjdGlvbkNyZWF0b3JDaGVjaykge1xuICAgICAgbGV0IGFjdGlvbkNyZWF0b3JPcHRpb25zID0ge307XG4gICAgICBpZiAoIWlzQm9vbGVhbihhY3Rpb25DcmVhdG9yQ2hlY2spKSB7XG4gICAgICAgIGFjdGlvbkNyZWF0b3JPcHRpb25zID0gYWN0aW9uQ3JlYXRvckNoZWNrO1xuICAgICAgfVxuICAgICAgbWlkZGxld2FyZUFycmF5LnVuc2hpZnQoY3JlYXRlQWN0aW9uQ3JlYXRvckludmFyaWFudE1pZGRsZXdhcmUoYWN0aW9uQ3JlYXRvck9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pZGRsZXdhcmVBcnJheTtcbn07XG5cbi8vIHNyYy9hdXRvQmF0Y2hFbmhhbmNlci50c1xudmFyIFNIT1VMRF9BVVRPQkFUQ0ggPSBcIlJUS19hdXRvQmF0Y2hcIjtcbnZhciBwcmVwYXJlQXV0b0JhdGNoZWQgPSAoKSA9PiAocGF5bG9hZCkgPT4gKHtcbiAgcGF5bG9hZCxcbiAgbWV0YToge1xuICAgIFtTSE9VTERfQVVUT0JBVENIXTogdHJ1ZVxuICB9XG59KTtcbnZhciBjcmVhdGVRdWV1ZVdpdGhUaW1lciA9ICh0aW1lb3V0KSA9PiB7XG4gIHJldHVybiAobm90aWZ5KSA9PiB7XG4gICAgc2V0VGltZW91dChub3RpZnksIHRpbWVvdXQpO1xuICB9O1xufTtcbnZhciByQUYgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIDogY3JlYXRlUXVldWVXaXRoVGltZXIoMTApO1xudmFyIGF1dG9CYXRjaEVuaGFuY2VyID0gKG9wdGlvbnMgPSB7XG4gIHR5cGU6IFwicmFmXCJcbn0pID0+IChuZXh0KSA9PiAoLi4uYXJncykgPT4ge1xuICBjb25zdCBzdG9yZSA9IG5leHQoLi4uYXJncyk7XG4gIGxldCBub3RpZnlpbmcgPSB0cnVlO1xuICBsZXQgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSBmYWxzZTtcbiAgbGV0IG5vdGlmaWNhdGlvblF1ZXVlZCA9IGZhbHNlO1xuICBjb25zdCBsaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBxdWV1ZUNhbGxiYWNrID0gb3B0aW9ucy50eXBlID09PSBcInRpY2tcIiA/IHF1ZXVlTWljcm90YXNrIDogb3B0aW9ucy50eXBlID09PSBcInJhZlwiID8gckFGIDogb3B0aW9ucy50eXBlID09PSBcImNhbGxiYWNrXCIgPyBvcHRpb25zLnF1ZXVlTm90aWZpY2F0aW9uIDogY3JlYXRlUXVldWVXaXRoVGltZXIob3B0aW9ucy50aW1lb3V0KTtcbiAgY29uc3Qgbm90aWZ5TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgIG5vdGlmaWNhdGlvblF1ZXVlZCA9IGZhbHNlO1xuICAgIGlmIChzaG91bGROb3RpZnlBdEVuZE9mVGljaykge1xuICAgICAgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSBmYWxzZTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChsKSA9PiBsKCkpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0b3JlLCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgYHN0b3JlLnN1YnNjcmliZWAgbWV0aG9kIHRvIGtlZXAgb3JpZ2luYWwgbGlzdGVuZXJzXG4gICAgLy8gZnJvbSBydW5uaW5nIGlmIHdlJ3JlIGRlbGF5aW5nIG5vdGlmaWNhdGlvbnNcbiAgICBzdWJzY3JpYmUobGlzdGVuZXIyKSB7XG4gICAgICBjb25zdCB3cmFwcGVkTGlzdGVuZXIgPSAoKSA9PiBub3RpZnlpbmcgJiYgbGlzdGVuZXIyKCk7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHN0b3JlLnN1YnNjcmliZSh3cmFwcGVkTGlzdGVuZXIpO1xuICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcjIpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcjIpO1xuICAgICAgfTtcbiAgICB9LFxuICAgIC8vIE92ZXJyaWRlIHRoZSBiYXNlIGBzdG9yZS5kaXNwYXRjaGAgbWV0aG9kIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGFjdGlvbnNcbiAgICAvLyBmb3IgdGhlIGBzaG91bGRBdXRvQmF0Y2hgIGZsYWcgYW5kIGRldGVybWluZSBpZiBiYXRjaGluZyBpcyBhY3RpdmVcbiAgICBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5vdGlmeWluZyA9ICFhY3Rpb24/Lm1ldGE/LltTSE9VTERfQVVUT0JBVENIXTtcbiAgICAgICAgc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2sgPSAhbm90aWZ5aW5nO1xuICAgICAgICBpZiAoc2hvdWxkTm90aWZ5QXRFbmRPZlRpY2spIHtcbiAgICAgICAgICBpZiAoIW5vdGlmaWNhdGlvblF1ZXVlZCkge1xuICAgICAgICAgICAgbm90aWZpY2F0aW9uUXVldWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHF1ZXVlQ2FsbGJhY2sobm90aWZ5TGlzdGVuZXJzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoKGFjdGlvbik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBub3RpZnlpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vLyBzcmMvZ2V0RGVmYXVsdEVuaGFuY2Vycy50c1xudmFyIGJ1aWxkR2V0RGVmYXVsdEVuaGFuY2VycyA9IChtaWRkbGV3YXJlRW5oYW5jZXIpID0+IGZ1bmN0aW9uIGdldERlZmF1bHRFbmhhbmNlcnMob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgYXV0b0JhdGNoID0gdHJ1ZVxuICB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgbGV0IGVuaGFuY2VyQXJyYXkgPSBuZXcgVHVwbGUobWlkZGxld2FyZUVuaGFuY2VyKTtcbiAgaWYgKGF1dG9CYXRjaCkge1xuICAgIGVuaGFuY2VyQXJyYXkucHVzaChhdXRvQmF0Y2hFbmhhbmNlcih0eXBlb2YgYXV0b0JhdGNoID09PSBcIm9iamVjdFwiID8gYXV0b0JhdGNoIDogdm9pZCAwKSk7XG4gIH1cbiAgcmV0dXJuIGVuaGFuY2VyQXJyYXk7XG59O1xuXG4vLyBzcmMvY29uZmlndXJlU3RvcmUudHNcbmZ1bmN0aW9uIGNvbmZpZ3VyZVN0b3JlKG9wdGlvbnMpIHtcbiAgY29uc3QgZ2V0RGVmYXVsdE1pZGRsZXdhcmUgPSBidWlsZEdldERlZmF1bHRNaWRkbGV3YXJlKCk7XG4gIGNvbnN0IHtcbiAgICByZWR1Y2VyID0gdm9pZCAwLFxuICAgIG1pZGRsZXdhcmUsXG4gICAgZGV2VG9vbHMgPSB0cnVlLFxuICAgIHByZWxvYWRlZFN0YXRlID0gdm9pZCAwLFxuICAgIGVuaGFuY2VycyA9IHZvaWQgMFxuICB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgbGV0IHJvb3RSZWR1Y2VyO1xuICBpZiAodHlwZW9mIHJlZHVjZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJvb3RSZWR1Y2VyID0gcmVkdWNlcjtcbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0MihyZWR1Y2VyKSkge1xuICAgIHJvb3RSZWR1Y2VyID0gY29tYmluZVJlZHVjZXJzKHJlZHVjZXIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEpIDogXCJgcmVkdWNlcmAgaXMgYSByZXF1aXJlZCBhcmd1bWVudCwgYW5kIG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgb2YgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBjb21iaW5lUmVkdWNlcnNcIik7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBtaWRkbGV3YXJlICYmIHR5cGVvZiBtaWRkbGV3YXJlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSA6IFwiYG1pZGRsZXdhcmVgIGZpZWxkIG11c3QgYmUgYSBjYWxsYmFja1wiKTtcbiAgfVxuICBsZXQgZmluYWxNaWRkbGV3YXJlO1xuICBpZiAodHlwZW9mIG1pZGRsZXdhcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZpbmFsTWlkZGxld2FyZSA9IG1pZGRsZXdhcmUoZ2V0RGVmYXVsdE1pZGRsZXdhcmUpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIUFycmF5LmlzQXJyYXkoZmluYWxNaWRkbGV3YXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMykgOiBcIndoZW4gdXNpbmcgYSBtaWRkbGV3YXJlIGJ1aWxkZXIgZnVuY3Rpb24sIGFuIGFycmF5IG9mIG1pZGRsZXdhcmUgbXVzdCBiZSByZXR1cm5lZFwiKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmluYWxNaWRkbGV3YXJlID0gZ2V0RGVmYXVsdE1pZGRsZXdhcmUoKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGZpbmFsTWlkZGxld2FyZS5zb21lKChpdGVtKSA9PiB0eXBlb2YgaXRlbSAhPT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQpIDogXCJlYWNoIG1pZGRsZXdhcmUgcHJvdmlkZWQgdG8gY29uZmlndXJlU3RvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG4gIGxldCBmaW5hbENvbXBvc2UgPSBjb21wb3NlMjtcbiAgaWYgKGRldlRvb2xzKSB7XG4gICAgZmluYWxDb21wb3NlID0gY29tcG9zZVdpdGhEZXZUb29scyh7XG4gICAgICAvLyBFbmFibGUgY2FwdHVyZSBvZiBzdGFjayB0cmFjZXMgZm9yIGRpc3BhdGNoZWQgUmVkdXggYWN0aW9uc1xuICAgICAgdHJhY2U6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIixcbiAgICAgIC4uLnR5cGVvZiBkZXZUb29scyA9PT0gXCJvYmplY3RcIiAmJiBkZXZUb29sc1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IG1pZGRsZXdhcmVFbmhhbmNlciA9IGFwcGx5TWlkZGxld2FyZSguLi5maW5hbE1pZGRsZXdhcmUpO1xuICBjb25zdCBnZXREZWZhdWx0RW5oYW5jZXJzID0gYnVpbGRHZXREZWZhdWx0RW5oYW5jZXJzKG1pZGRsZXdhcmVFbmhhbmNlcik7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZW5oYW5jZXJzICYmIHR5cGVvZiBlbmhhbmNlcnMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUpIDogXCJgZW5oYW5jZXJzYCBmaWVsZCBtdXN0IGJlIGEgY2FsbGJhY2tcIik7XG4gIH1cbiAgbGV0IHN0b3JlRW5oYW5jZXJzID0gdHlwZW9mIGVuaGFuY2VycyA9PT0gXCJmdW5jdGlvblwiID8gZW5oYW5jZXJzKGdldERlZmF1bHRFbmhhbmNlcnMpIDogZ2V0RGVmYXVsdEVuaGFuY2VycygpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFBcnJheS5pc0FycmF5KHN0b3JlRW5oYW5jZXJzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogXCJgZW5oYW5jZXJzYCBjYWxsYmFjayBtdXN0IHJldHVybiBhbiBhcnJheVwiKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIHN0b3JlRW5oYW5jZXJzLnNvbWUoKGl0ZW0pID0+IHR5cGVvZiBpdGVtICE9PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNykgOiBcImVhY2ggZW5oYW5jZXIgcHJvdmlkZWQgdG8gY29uZmlndXJlU3RvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZmluYWxNaWRkbGV3YXJlLmxlbmd0aCAmJiAhc3RvcmVFbmhhbmNlcnMuaW5jbHVkZXMobWlkZGxld2FyZUVuaGFuY2VyKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJtaWRkbGV3YXJlcyB3ZXJlIHByb3ZpZGVkLCBidXQgbWlkZGxld2FyZSBlbmhhbmNlciB3YXMgbm90IGluY2x1ZGVkIGluIGZpbmFsIGVuaGFuY2VycyAtIG1ha2Ugc3VyZSB0byBjYWxsIGBnZXREZWZhdWx0RW5oYW5jZXJzYFwiKTtcbiAgfVxuICBjb25zdCBjb21wb3NlZEVuaGFuY2VyID0gZmluYWxDb21wb3NlKC4uLnN0b3JlRW5oYW5jZXJzKTtcbiAgcmV0dXJuIGNyZWF0ZVN0b3JlKHJvb3RSZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgY29tcG9zZWRFbmhhbmNlcik7XG59XG5cbi8vIHNyYy9jcmVhdGVSZWR1Y2VyLnRzXG5pbXBvcnQgeyBwcm9kdWNlIGFzIGNyZWF0ZU5leHRTdGF0ZTIsIGlzRHJhZnQgYXMgaXNEcmFmdDIsIGlzRHJhZnRhYmxlIGFzIGlzRHJhZnRhYmxlMiB9IGZyb20gXCJpbW1lclwiO1xuXG4vLyBzcmMvbWFwQnVpbGRlcnMudHNcbmZ1bmN0aW9uIGV4ZWN1dGVSZWR1Y2VyQnVpbGRlckNhbGxiYWNrKGJ1aWxkZXJDYWxsYmFjaykge1xuICBjb25zdCBhY3Rpb25zTWFwID0ge307XG4gIGNvbnN0IGFjdGlvbk1hdGNoZXJzID0gW107XG4gIGxldCBkZWZhdWx0Q2FzZVJlZHVjZXI7XG4gIGNvbnN0IGJ1aWxkZXIgPSB7XG4gICAgYWRkQ2FzZSh0eXBlT3JBY3Rpb25DcmVhdG9yLCByZWR1Y2VyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChhY3Rpb25NYXRjaGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjYpIDogXCJgYnVpbGRlci5hZGRDYXNlYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYGJ1aWxkZXIuYWRkTWF0Y2hlcmBcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI3KSA6IFwiYGJ1aWxkZXIuYWRkQ2FzZWAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZERlZmF1bHRDYXNlYFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB0eXBlT3JBY3Rpb25DcmVhdG9yID09PSBcInN0cmluZ1wiID8gdHlwZU9yQWN0aW9uQ3JlYXRvciA6IHR5cGVPckFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyOCkgOiBcImBidWlsZGVyLmFkZENhc2VgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBhbiBlbXB0eSBhY3Rpb24gdHlwZVwiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlIGluIGFjdGlvbnNNYXApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjkpIDogYFxcYGJ1aWxkZXIuYWRkQ2FzZVxcYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggdHdvIHJlZHVjZXJzIGZvciB0aGUgc2FtZSBhY3Rpb24gdHlwZSAnJHt0eXBlfSdgKTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbnNNYXBbdHlwZV0gPSByZWR1Y2VyO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfSxcbiAgICBhZGRNYXRjaGVyKG1hdGNoZXIsIHJlZHVjZXIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMwKSA6IFwiYGJ1aWxkZXIuYWRkTWF0Y2hlcmAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGBidWlsZGVyLmFkZERlZmF1bHRDYXNlYFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYWN0aW9uTWF0Y2hlcnMucHVzaCh7XG4gICAgICAgIG1hdGNoZXIsXG4gICAgICAgIHJlZHVjZXJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfSxcbiAgICBhZGREZWZhdWx0Q2FzZShyZWR1Y2VyKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzMSkgOiBcImBidWlsZGVyLmFkZERlZmF1bHRDYXNlYCBjYW4gb25seSBiZSBjYWxsZWQgb25jZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVmYXVsdENhc2VSZWR1Y2VyID0gcmVkdWNlcjtcbiAgICAgIHJldHVybiBidWlsZGVyO1xuICAgIH1cbiAgfTtcbiAgYnVpbGRlckNhbGxiYWNrKGJ1aWxkZXIpO1xuICByZXR1cm4gW2FjdGlvbnNNYXAsIGFjdGlvbk1hdGNoZXJzLCBkZWZhdWx0Q2FzZVJlZHVjZXJdO1xufVxuXG4vLyBzcmMvY3JlYXRlUmVkdWNlci50c1xuZnVuY3Rpb24gaXNTdGF0ZUZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWR1Y2VyKGluaXRpYWxTdGF0ZSwgbWFwT3JCdWlsZGVyQ2FsbGJhY2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICh0eXBlb2YgbWFwT3JCdWlsZGVyQ2FsbGJhY2sgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDgpIDogXCJUaGUgb2JqZWN0IG5vdGF0aW9uIGZvciBgY3JlYXRlUmVkdWNlcmAgaGFzIGJlZW4gcmVtb3ZlZC4gUGxlYXNlIHVzZSB0aGUgJ2J1aWxkZXIgY2FsbGJhY2snIG5vdGF0aW9uIGluc3RlYWQ6IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2NyZWF0ZVJlZHVjZXJcIik7XG4gICAgfVxuICB9XG4gIGxldCBbYWN0aW9uc01hcCwgZmluYWxBY3Rpb25NYXRjaGVycywgZmluYWxEZWZhdWx0Q2FzZVJlZHVjZXJdID0gZXhlY3V0ZVJlZHVjZXJCdWlsZGVyQ2FsbGJhY2sobWFwT3JCdWlsZGVyQ2FsbGJhY2spO1xuICBsZXQgZ2V0SW5pdGlhbFN0YXRlO1xuICBpZiAoaXNTdGF0ZUZ1bmN0aW9uKGluaXRpYWxTdGF0ZSkpIHtcbiAgICBnZXRJbml0aWFsU3RhdGUgPSAoKSA9PiBmcmVlemVEcmFmdGFibGUoaW5pdGlhbFN0YXRlKCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGZyb3plbkluaXRpYWxTdGF0ZSA9IGZyZWV6ZURyYWZ0YWJsZShpbml0aWFsU3RhdGUpO1xuICAgIGdldEluaXRpYWxTdGF0ZSA9ICgpID0+IGZyb3plbkluaXRpYWxTdGF0ZTtcbiAgfVxuICBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlKCksIGFjdGlvbikge1xuICAgIGxldCBjYXNlUmVkdWNlcnMgPSBbYWN0aW9uc01hcFthY3Rpb24udHlwZV0sIC4uLmZpbmFsQWN0aW9uTWF0Y2hlcnMuZmlsdGVyKCh7XG4gICAgICBtYXRjaGVyXG4gICAgfSkgPT4gbWF0Y2hlcihhY3Rpb24pKS5tYXAoKHtcbiAgICAgIHJlZHVjZXI6IHJlZHVjZXIyXG4gICAgfSkgPT4gcmVkdWNlcjIpXTtcbiAgICBpZiAoY2FzZVJlZHVjZXJzLmZpbHRlcigoY3IpID0+ICEhY3IpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FzZVJlZHVjZXJzID0gW2ZpbmFsRGVmYXVsdENhc2VSZWR1Y2VyXTtcbiAgICB9XG4gICAgcmV0dXJuIGNhc2VSZWR1Y2Vycy5yZWR1Y2UoKHByZXZpb3VzU3RhdGUsIGNhc2VSZWR1Y2VyKSA9PiB7XG4gICAgICBpZiAoY2FzZVJlZHVjZXIpIHtcbiAgICAgICAgaWYgKGlzRHJhZnQyKHByZXZpb3VzU3RhdGUpKSB7XG4gICAgICAgICAgY29uc3QgZHJhZnQgPSBwcmV2aW91c1N0YXRlO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhc2VSZWR1Y2VyKGRyYWZ0LCBhY3Rpb24pO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzRHJhZnRhYmxlMihwcmV2aW91c1N0YXRlKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhc2VSZWR1Y2VyKHByZXZpb3VzU3RhdGUsIGFjdGlvbik7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNTdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDkpIDogXCJBIGNhc2UgcmVkdWNlciBvbiBhIG5vbi1kcmFmdGFibGUgdmFsdWUgbXVzdCBub3QgcmV0dXJuIHVuZGVmaW5lZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlTmV4dFN0YXRlMihwcmV2aW91c1N0YXRlLCAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYXNlUmVkdWNlcihkcmFmdCwgYWN0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByZXZpb3VzU3RhdGU7XG4gICAgfSwgc3RhdGUpO1xuICB9XG4gIHJlZHVjZXIuZ2V0SW5pdGlhbFN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlO1xuICByZXR1cm4gcmVkdWNlcjtcbn1cblxuLy8gc3JjL21hdGNoZXJzLnRzXG52YXIgbWF0Y2hlcyA9IChtYXRjaGVyLCBhY3Rpb24pID0+IHtcbiAgaWYgKGhhc01hdGNoRnVuY3Rpb24obWF0Y2hlcikpIHtcbiAgICByZXR1cm4gbWF0Y2hlci5tYXRjaChhY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBtYXRjaGVyKGFjdGlvbik7XG4gIH1cbn07XG5mdW5jdGlvbiBpc0FueU9mKC4uLm1hdGNoZXJzKSB7XG4gIHJldHVybiAoYWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuIG1hdGNoZXJzLnNvbWUoKG1hdGNoZXIpID0+IG1hdGNoZXMobWF0Y2hlciwgYWN0aW9uKSk7XG4gIH07XG59XG5mdW5jdGlvbiBpc0FsbE9mKC4uLm1hdGNoZXJzKSB7XG4gIHJldHVybiAoYWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuIG1hdGNoZXJzLmV2ZXJ5KChtYXRjaGVyKSA9PiBtYXRjaGVzKG1hdGNoZXIsIGFjdGlvbikpO1xuICB9O1xufVxuZnVuY3Rpb24gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCB2YWxpZFN0YXR1cykge1xuICBpZiAoIWFjdGlvbiB8fCAhYWN0aW9uLm1ldGEpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaGFzVmFsaWRSZXF1ZXN0SWQgPSB0eXBlb2YgYWN0aW9uLm1ldGEucmVxdWVzdElkID09PSBcInN0cmluZ1wiO1xuICBjb25zdCBoYXNWYWxpZFJlcXVlc3RTdGF0dXMgPSB2YWxpZFN0YXR1cy5pbmRleE9mKGFjdGlvbi5tZXRhLnJlcXVlc3RTdGF0dXMpID4gLTE7XG4gIHJldHVybiBoYXNWYWxpZFJlcXVlc3RJZCAmJiBoYXNWYWxpZFJlcXVlc3RTdGF0dXM7XG59XG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtBcnJheShhKSB7XG4gIHJldHVybiB0eXBlb2YgYVswXSA9PT0gXCJmdW5jdGlvblwiICYmIFwicGVuZGluZ1wiIGluIGFbMF0gJiYgXCJmdWxmaWxsZWRcIiBpbiBhWzBdICYmIFwicmVqZWN0ZWRcIiBpbiBhWzBdO1xufVxuZnVuY3Rpb24gaXNQZW5kaW5nKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJwZW5kaW5nXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc1BlbmRpbmcoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQW55T2YoLi4uYXN5bmNUaHVua3MubWFwKChhc3luY1RodW5rKSA9PiBhc3luY1RodW5rLnBlbmRpbmcpKTtcbn1cbmZ1bmN0aW9uIGlzUmVqZWN0ZWQoLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcInJlamVjdGVkXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc1JlamVjdGVkKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLm1hcCgoYXN5bmNUaHVuaykgPT4gYXN5bmNUaHVuay5yZWplY3RlZCkpO1xufVxuZnVuY3Rpb24gaXNSZWplY3RlZFdpdGhWYWx1ZSguLi5hc3luY1RodW5rcykge1xuICBjb25zdCBoYXNGbGFnID0gKGFjdGlvbikgPT4ge1xuICAgIHJldHVybiBhY3Rpb24gJiYgYWN0aW9uLm1ldGEgJiYgYWN0aW9uLm1ldGEucmVqZWN0ZWRXaXRoVmFsdWU7XG4gIH07XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaXNBbGxPZihpc1JlamVjdGVkKC4uLmFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNSZWplY3RlZFdpdGhWYWx1ZSgpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbGxPZihpc1JlamVjdGVkKC4uLmFzeW5jVGh1bmtzKSwgaGFzRmxhZyk7XG59XG5mdW5jdGlvbiBpc0Z1bGZpbGxlZCguLi5hc3luY1RodW5rcykge1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhY3Rpb24pID0+IGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wiZnVsZmlsbGVkXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc0Z1bGZpbGxlZCgpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5tYXAoKGFzeW5jVGh1bmspID0+IGFzeW5jVGh1bmsuZnVsZmlsbGVkKSk7XG59XG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtBY3Rpb24oLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcInBlbmRpbmdcIiwgXCJmdWxmaWxsZWRcIiwgXCJyZWplY3RlZFwiXSk7XG4gIH1cbiAgaWYgKCFpc0FzeW5jVGh1bmtBcnJheShhc3luY1RodW5rcykpIHtcbiAgICByZXR1cm4gaXNBc3luY1RodW5rQWN0aW9uKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLmZsYXRNYXAoKGFzeW5jVGh1bmspID0+IFthc3luY1RodW5rLnBlbmRpbmcsIGFzeW5jVGh1bmsucmVqZWN0ZWQsIGFzeW5jVGh1bmsuZnVsZmlsbGVkXSkpO1xufVxuXG4vLyBzcmMvbmFub2lkLnRzXG52YXIgdXJsQWxwaGFiZXQgPSBcIk1vZHVsZVN5bWJoYXNPd25Qci0wMTIzNDU2Nzg5QUJDREVGR0hOUlZmZ2N0aVV2el9LcVlUSmtMeHBaWElqUVdcIjtcbnZhciBuYW5vaWQgPSAoc2l6ZSA9IDIxKSA9PiB7XG4gIGxldCBpZCA9IFwiXCI7XG4gIGxldCBpID0gc2l6ZTtcbiAgd2hpbGUgKGktLSkge1xuICAgIGlkICs9IHVybEFscGhhYmV0W01hdGgucmFuZG9tKCkgKiA2NCB8IDBdO1xuICB9XG4gIHJldHVybiBpZDtcbn07XG5cbi8vIHNyYy9jcmVhdGVBc3luY1RodW5rLnRzXG52YXIgY29tbW9uUHJvcGVydGllcyA9IFtcIm5hbWVcIiwgXCJtZXNzYWdlXCIsIFwic3RhY2tcIiwgXCJjb2RlXCJdO1xudmFyIFJlamVjdFdpdGhWYWx1ZSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IocGF5bG9hZCwgbWV0YSkge1xuICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgdGhpcy5tZXRhID0gbWV0YTtcbiAgfVxuICAvKlxuICB0eXBlLW9ubHkgcHJvcGVydHkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBSZWplY3RXaXRoVmFsdWUgYW5kIEZ1bGZpbGxXaXRoTWV0YVxuICBkb2VzIG5vdCBleGlzdCBhdCBydW50aW1lXG4gICovXG4gIF90eXBlO1xufTtcbnZhciBGdWxmaWxsV2l0aE1ldGEgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHBheWxvYWQsIG1ldGEpIHtcbiAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgIHRoaXMubWV0YSA9IG1ldGE7XG4gIH1cbiAgLypcbiAgdHlwZS1vbmx5IHByb3BlcnR5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gUmVqZWN0V2l0aFZhbHVlIGFuZCBGdWxmaWxsV2l0aE1ldGFcbiAgZG9lcyBub3QgZXhpc3QgYXQgcnVudGltZVxuICAqL1xuICBfdHlwZTtcbn07XG52YXIgbWluaVNlcmlhbGl6ZUVycm9yID0gKHZhbHVlKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBjb25zdCBzaW1wbGVFcnJvciA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgY29tbW9uUHJvcGVydGllcykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZVtwcm9wZXJ0eV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgc2ltcGxlRXJyb3JbcHJvcGVydHldID0gdmFsdWVbcHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2ltcGxlRXJyb3I7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiBTdHJpbmcodmFsdWUpXG4gIH07XG59O1xudmFyIGNyZWF0ZUFzeW5jVGh1bmsgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcbiAgZnVuY3Rpb24gY3JlYXRlQXN5bmNUaHVuazIodHlwZVByZWZpeCwgcGF5bG9hZENyZWF0b3IsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmdWxmaWxsZWQgPSBjcmVhdGVBY3Rpb24odHlwZVByZWZpeCArIFwiL2Z1bGZpbGxlZFwiLCAocGF5bG9hZCwgcmVxdWVzdElkLCBhcmcsIG1ldGEpID0+ICh7XG4gICAgICBwYXlsb2FkLFxuICAgICAgbWV0YToge1xuICAgICAgICAuLi5tZXRhIHx8IHt9LFxuICAgICAgICBhcmcsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgcmVxdWVzdFN0YXR1czogXCJmdWxmaWxsZWRcIlxuICAgICAgfVxuICAgIH0pKTtcbiAgICBjb25zdCBwZW5kaW5nID0gY3JlYXRlQWN0aW9uKHR5cGVQcmVmaXggKyBcIi9wZW5kaW5nXCIsIChyZXF1ZXN0SWQsIGFyZywgbWV0YSkgPT4gKHtcbiAgICAgIHBheWxvYWQ6IHZvaWQgMCxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgLi4ubWV0YSB8fCB7fSxcbiAgICAgICAgYXJnLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHJlcXVlc3RTdGF0dXM6IFwicGVuZGluZ1wiXG4gICAgICB9XG4gICAgfSkpO1xuICAgIGNvbnN0IHJlamVjdGVkID0gY3JlYXRlQWN0aW9uKHR5cGVQcmVmaXggKyBcIi9yZWplY3RlZFwiLCAoZXJyb3IsIHJlcXVlc3RJZCwgYXJnLCBwYXlsb2FkLCBtZXRhKSA9PiAoe1xuICAgICAgcGF5bG9hZCxcbiAgICAgIGVycm9yOiAob3B0aW9ucyAmJiBvcHRpb25zLnNlcmlhbGl6ZUVycm9yIHx8IG1pbmlTZXJpYWxpemVFcnJvcikoZXJyb3IgfHwgXCJSZWplY3RlZFwiKSxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgLi4ubWV0YSB8fCB7fSxcbiAgICAgICAgYXJnLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIHJlamVjdGVkV2l0aFZhbHVlOiAhIXBheWxvYWQsXG4gICAgICAgIHJlcXVlc3RTdGF0dXM6IFwicmVqZWN0ZWRcIixcbiAgICAgICAgYWJvcnRlZDogZXJyb3I/Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiLFxuICAgICAgICBjb25kaXRpb246IGVycm9yPy5uYW1lID09PSBcIkNvbmRpdGlvbkVycm9yXCJcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgZnVuY3Rpb24gYWN0aW9uQ3JlYXRvcihhcmcpIHtcbiAgICAgIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYSkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBvcHRpb25zPy5pZEdlbmVyYXRvciA/IG9wdGlvbnMuaWRHZW5lcmF0b3IoYXJnKSA6IG5hbm9pZCgpO1xuICAgICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGxldCBhYm9ydEhhbmRsZXI7XG4gICAgICAgIGxldCBhYm9ydFJlYXNvbjtcbiAgICAgICAgZnVuY3Rpb24gYWJvcnQocmVhc29uKSB7XG4gICAgICAgICAgYWJvcnRSZWFzb24gPSByZWFzb247XG4gICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxldCBmaW5hbEFjdGlvbjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGNvbmRpdGlvblJlc3VsdCA9IG9wdGlvbnM/LmNvbmRpdGlvbj8uKGFyZywge1xuICAgICAgICAgICAgICBnZXRTdGF0ZSxcbiAgICAgICAgICAgICAgZXh0cmFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGlzVGhlbmFibGUoY29uZGl0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICBjb25kaXRpb25SZXN1bHQgPSBhd2FpdCBjb25kaXRpb25SZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uUmVzdWx0ID09PSBmYWxzZSB8fCBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29uZGl0aW9uRXJyb3JcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkFib3J0ZWQgZHVlIHRvIGNvbmRpdGlvbiBjYWxsYmFjayByZXR1cm5pbmcgZmFsc2UuXCJcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFib3J0ZWRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBhYm9ydEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQWJvcnRFcnJvclwiLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYWJvcnRSZWFzb24gfHwgXCJBYm9ydGVkXCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRIYW5kbGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGlzcGF0Y2gocGVuZGluZyhyZXF1ZXN0SWQsIGFyZywgb3B0aW9ucz8uZ2V0UGVuZGluZ01ldGE/Lih7XG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGdldFN0YXRlLFxuICAgICAgICAgICAgICBleHRyYVxuICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gYXdhaXQgUHJvbWlzZS5yYWNlKFthYm9ydGVkUHJvbWlzZSwgUHJvbWlzZS5yZXNvbHZlKHBheWxvYWRDcmVhdG9yKGFyZywge1xuICAgICAgICAgICAgICBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgZ2V0U3RhdGUsXG4gICAgICAgICAgICAgIGV4dHJhLFxuICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgYWJvcnQsXG4gICAgICAgICAgICAgIHJlamVjdFdpdGhWYWx1ZTogKHZhbHVlLCBtZXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWplY3RXaXRoVmFsdWUodmFsdWUsIG1ldGEpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdWxmaWxsV2l0aFZhbHVlOiAodmFsdWUsIG1ldGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bGZpbGxXaXRoTWV0YSh2YWx1ZSwgbWV0YSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlamVjdFdpdGhWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRnVsZmlsbFdpdGhNZXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bGZpbGxlZChyZXN1bHQucGF5bG9hZCwgcmVxdWVzdElkLCBhcmcsIHJlc3VsdC5tZXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZnVsZmlsbGVkKHJlc3VsdCwgcmVxdWVzdElkLCBhcmcpO1xuICAgICAgICAgICAgfSldKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGZpbmFsQWN0aW9uID0gZXJyIGluc3RhbmNlb2YgUmVqZWN0V2l0aFZhbHVlID8gcmVqZWN0ZWQobnVsbCwgcmVxdWVzdElkLCBhcmcsIGVyci5wYXlsb2FkLCBlcnIubWV0YSkgOiByZWplY3RlZChlcnIsIHJlcXVlc3RJZCwgYXJnKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKGFib3J0SGFuZGxlcikge1xuICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBza2lwRGlzcGF0Y2ggPSBvcHRpb25zICYmICFvcHRpb25zLmRpc3BhdGNoQ29uZGl0aW9uUmVqZWN0aW9uICYmIHJlamVjdGVkLm1hdGNoKGZpbmFsQWN0aW9uKSAmJiBmaW5hbEFjdGlvbi5tZXRhLmNvbmRpdGlvbjtcbiAgICAgICAgICBpZiAoIXNraXBEaXNwYXRjaCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goZmluYWxBY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmluYWxBY3Rpb247XG4gICAgICAgIH0oKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocHJvbWlzZSwge1xuICAgICAgICAgIGFib3J0LFxuICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICBhcmcsXG4gICAgICAgICAgdW53cmFwKCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbih1bndyYXBSZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY3Rpb25DcmVhdG9yLCB7XG4gICAgICBwZW5kaW5nLFxuICAgICAgcmVqZWN0ZWQsXG4gICAgICBmdWxmaWxsZWQsXG4gICAgICBzZXR0bGVkOiBpc0FueU9mKHJlamVjdGVkLCBmdWxmaWxsZWQpLFxuICAgICAgdHlwZVByZWZpeFxuICAgIH0pO1xuICB9XG4gIGNyZWF0ZUFzeW5jVGh1bmsyLndpdGhUeXBlcyA9ICgpID0+IGNyZWF0ZUFzeW5jVGh1bmsyO1xuICByZXR1cm4gY3JlYXRlQXN5bmNUaHVuazI7XG59KSgpO1xuZnVuY3Rpb24gdW53cmFwUmVzdWx0KGFjdGlvbikge1xuICBpZiAoYWN0aW9uLm1ldGEgJiYgYWN0aW9uLm1ldGEucmVqZWN0ZWRXaXRoVmFsdWUpIHtcbiAgICB0aHJvdyBhY3Rpb24ucGF5bG9hZDtcbiAgfVxuICBpZiAoYWN0aW9uLmVycm9yKSB7XG4gICAgdGhyb3cgYWN0aW9uLmVycm9yO1xuICB9XG4gIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGlzVGhlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vLyBzcmMvY3JlYXRlU2xpY2UudHNcbnZhciBhc3luY1RodW5rU3ltYm9sID0gLyogQF9fUFVSRV9fICovIFN5bWJvbC5mb3IoXCJydGstc2xpY2UtY3JlYXRlYXN5bmN0aHVua1wiKTtcbnZhciBhc3luY1RodW5rQ3JlYXRvciA9IHtcbiAgW2FzeW5jVGh1bmtTeW1ib2xdOiBjcmVhdGVBc3luY1RodW5rXG59O1xudmFyIFJlZHVjZXJUeXBlID0gLyogQF9fUFVSRV9fICovICgoUmVkdWNlclR5cGUyKSA9PiB7XG4gIFJlZHVjZXJUeXBlMltcInJlZHVjZXJcIl0gPSBcInJlZHVjZXJcIjtcbiAgUmVkdWNlclR5cGUyW1wicmVkdWNlcldpdGhQcmVwYXJlXCJdID0gXCJyZWR1Y2VyV2l0aFByZXBhcmVcIjtcbiAgUmVkdWNlclR5cGUyW1wiYXN5bmNUaHVua1wiXSA9IFwiYXN5bmNUaHVua1wiO1xuICByZXR1cm4gUmVkdWNlclR5cGUyO1xufSkoUmVkdWNlclR5cGUgfHwge30pO1xuZnVuY3Rpb24gZ2V0VHlwZShzbGljZSwgYWN0aW9uS2V5KSB7XG4gIHJldHVybiBgJHtzbGljZX0vJHthY3Rpb25LZXl9YDtcbn1cbmZ1bmN0aW9uIGJ1aWxkQ3JlYXRlU2xpY2Uoe1xuICBjcmVhdG9yc1xufSA9IHt9KSB7XG4gIGNvbnN0IGNBVCA9IGNyZWF0b3JzPy5hc3luY1RodW5rPy5bYXN5bmNUaHVua1N5bWJvbF07XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVTbGljZTIob3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICByZWR1Y2VyUGF0aCA9IG5hbWVcbiAgICB9ID0gb3B0aW9ucztcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IFwiYG5hbWVgIGlzIGEgcmVxdWlyZWQgb3B0aW9uIGZvciBjcmVhdGVTbGljZVwiKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgIGlmIChvcHRpb25zLmluaXRpYWxTdGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJZb3UgbXVzdCBwcm92aWRlIGFuIGBpbml0aWFsU3RhdGVgIHZhbHVlIHRoYXQgaXMgbm90IGB1bmRlZmluZWRgLiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBgaW5pdGlhbFN0YXRlYFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVkdWNlcnMgPSAodHlwZW9mIG9wdGlvbnMucmVkdWNlcnMgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMucmVkdWNlcnMoYnVpbGRSZWR1Y2VyQ3JlYXRvcnMoKSkgOiBvcHRpb25zLnJlZHVjZXJzKSB8fCB7fTtcbiAgICBjb25zdCByZWR1Y2VyTmFtZXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lOiB7fSxcbiAgICAgIHNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlOiB7fSxcbiAgICAgIGFjdGlvbkNyZWF0b3JzOiB7fSxcbiAgICAgIHNsaWNlTWF0Y2hlcnM6IFtdXG4gICAgfTtcbiAgICBjb25zdCBjb250ZXh0TWV0aG9kcyA9IHtcbiAgICAgIGFkZENhc2UodHlwZU9yQWN0aW9uQ3JlYXRvciwgcmVkdWNlcjIpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB0eXBlT3JBY3Rpb25DcmVhdG9yID09PSBcInN0cmluZ1wiID8gdHlwZU9yQWN0aW9uQ3JlYXRvciA6IHR5cGVPckFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogXCJgY29udGV4dC5hZGRDYXNlYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYW4gZW1wdHkgYWN0aW9uIHR5cGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgaW4gY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IFwiYGNvbnRleHQuYWRkQ2FzZWAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIHR3byByZWR1Y2VycyBmb3IgdGhlIHNhbWUgYWN0aW9uIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZVt0eXBlXSA9IHJlZHVjZXIyO1xuICAgICAgICByZXR1cm4gY29udGV4dE1ldGhvZHM7XG4gICAgICB9LFxuICAgICAgYWRkTWF0Y2hlcihtYXRjaGVyLCByZWR1Y2VyMikge1xuICAgICAgICBjb250ZXh0LnNsaWNlTWF0Y2hlcnMucHVzaCh7XG4gICAgICAgICAgbWF0Y2hlcixcbiAgICAgICAgICByZWR1Y2VyOiByZWR1Y2VyMlxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfSxcbiAgICAgIGV4cG9zZUFjdGlvbihuYW1lMiwgYWN0aW9uQ3JlYXRvcikge1xuICAgICAgICBjb250ZXh0LmFjdGlvbkNyZWF0b3JzW25hbWUyXSA9IGFjdGlvbkNyZWF0b3I7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH0sXG4gICAgICBleHBvc2VDYXNlUmVkdWNlcihuYW1lMiwgcmVkdWNlcjIpIHtcbiAgICAgICAgY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5TmFtZVtuYW1lMl0gPSByZWR1Y2VyMjtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVkdWNlck5hbWVzLmZvckVhY2goKHJlZHVjZXJOYW1lKSA9PiB7XG4gICAgICBjb25zdCByZWR1Y2VyRGVmaW5pdGlvbiA9IHJlZHVjZXJzW3JlZHVjZXJOYW1lXTtcbiAgICAgIGNvbnN0IHJlZHVjZXJEZXRhaWxzID0ge1xuICAgICAgICByZWR1Y2VyTmFtZSxcbiAgICAgICAgdHlwZTogZ2V0VHlwZShuYW1lLCByZWR1Y2VyTmFtZSksXG4gICAgICAgIGNyZWF0ZU5vdGF0aW9uOiB0eXBlb2Ygb3B0aW9ucy5yZWR1Y2VycyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICB9O1xuICAgICAgaWYgKGlzQXN5bmNUaHVua1NsaWNlUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRlZmluaXRpb24pKSB7XG4gICAgICAgIGhhbmRsZVRodW5rQ2FzZVJlZHVjZXJEZWZpbml0aW9uKHJlZHVjZXJEZXRhaWxzLCByZWR1Y2VyRGVmaW5pdGlvbiwgY29udGV4dE1ldGhvZHMsIGNBVCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYW5kbGVOb3JtYWxSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGV0YWlscywgcmVkdWNlckRlZmluaXRpb24sIGNvbnRleHRNZXRob2RzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmdW5jdGlvbiBidWlsZFJlZHVjZXIoKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5leHRyYVJlZHVjZXJzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogXCJUaGUgb2JqZWN0IG5vdGF0aW9uIGZvciBgY3JlYXRlU2xpY2UuZXh0cmFSZWR1Y2Vyc2AgaGFzIGJlZW4gcmVtb3ZlZC4gUGxlYXNlIHVzZSB0aGUgJ2J1aWxkZXIgY2FsbGJhY2snIG5vdGF0aW9uIGluc3RlYWQ6IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvYXBpL2NyZWF0ZVNsaWNlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBbZXh0cmFSZWR1Y2VycyA9IHt9LCBhY3Rpb25NYXRjaGVycyA9IFtdLCBkZWZhdWx0Q2FzZVJlZHVjZXIgPSB2b2lkIDBdID0gdHlwZW9mIG9wdGlvbnMuZXh0cmFSZWR1Y2VycyA9PT0gXCJmdW5jdGlvblwiID8gZXhlY3V0ZVJlZHVjZXJCdWlsZGVyQ2FsbGJhY2sob3B0aW9ucy5leHRyYVJlZHVjZXJzKSA6IFtvcHRpb25zLmV4dHJhUmVkdWNlcnNdO1xuICAgICAgY29uc3QgZmluYWxDYXNlUmVkdWNlcnMgPSB7XG4gICAgICAgIC4uLmV4dHJhUmVkdWNlcnMsXG4gICAgICAgIC4uLmNvbnRleHQuc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGVcbiAgICAgIH07XG4gICAgICByZXR1cm4gY3JlYXRlUmVkdWNlcihvcHRpb25zLmluaXRpYWxTdGF0ZSwgKGJ1aWxkZXIpID0+IHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGZpbmFsQ2FzZVJlZHVjZXJzKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGRDYXNlKGtleSwgZmluYWxDYXNlUmVkdWNlcnNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgc00gb2YgY29udGV4dC5zbGljZU1hdGNoZXJzKSB7XG4gICAgICAgICAgYnVpbGRlci5hZGRNYXRjaGVyKHNNLm1hdGNoZXIsIHNNLnJlZHVjZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG0gb2YgYWN0aW9uTWF0Y2hlcnMpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZE1hdGNoZXIobS5tYXRjaGVyLCBtLnJlZHVjZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0Q2FzZVJlZHVjZXIpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZERlZmF1bHRDYXNlKGRlZmF1bHRDYXNlUmVkdWNlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RTZWxmID0gKHN0YXRlKSA9PiBzdGF0ZTtcbiAgICBjb25zdCBpbmplY3RlZFNlbGVjdG9yQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGxldCBfcmVkdWNlcjtcbiAgICBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgICAgIGlmICghX3JlZHVjZXIpIF9yZWR1Y2VyID0gYnVpbGRSZWR1Y2VyKCk7XG4gICAgICByZXR1cm4gX3JlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgIGlmICghX3JlZHVjZXIpIF9yZWR1Y2VyID0gYnVpbGRSZWR1Y2VyKCk7XG4gICAgICByZXR1cm4gX3JlZHVjZXIuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1ha2VTZWxlY3RvclByb3BzKHJlZHVjZXJQYXRoMiwgaW5qZWN0ZWQgPSBmYWxzZSkge1xuICAgICAgZnVuY3Rpb24gc2VsZWN0U2xpY2Uoc3RhdGUpIHtcbiAgICAgICAgbGV0IHNsaWNlU3RhdGUgPSBzdGF0ZVtyZWR1Y2VyUGF0aDJdO1xuICAgICAgICBpZiAodHlwZW9mIHNsaWNlU3RhdGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgICAgIHNsaWNlU3RhdGUgPSBnZXRJbml0aWFsU3RhdGUoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTUpIDogXCJzZWxlY3RTbGljZSByZXR1cm5lZCB1bmRlZmluZWQgZm9yIGFuIHVuaW5qZWN0ZWQgc2xpY2UgcmVkdWNlclwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNsaWNlU3RhdGU7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBnZXRTZWxlY3RvcnMoc2VsZWN0U3RhdGUgPSBzZWxlY3RTZWxmKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yQ2FjaGUgPSBlbXBsYWNlKGluamVjdGVkU2VsZWN0b3JDYWNoZSwgaW5qZWN0ZWQsIHtcbiAgICAgICAgICBpbnNlcnQ6ICgpID0+IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZW1wbGFjZShzZWxlY3RvckNhY2hlLCBzZWxlY3RTdGF0ZSwge1xuICAgICAgICAgIGluc2VydDogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWFwID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtuYW1lMiwgc2VsZWN0b3JdIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuc2VsZWN0b3JzID8/IHt9KSkge1xuICAgICAgICAgICAgICBtYXBbbmFtZTJdID0gd3JhcFNlbGVjdG9yKHNlbGVjdG9yLCBzZWxlY3RTdGF0ZSwgZ2V0SW5pdGlhbFN0YXRlLCBpbmplY3RlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWR1Y2VyUGF0aDogcmVkdWNlclBhdGgyLFxuICAgICAgICBnZXRTZWxlY3RvcnMsXG4gICAgICAgIGdldCBzZWxlY3RvcnMoKSB7XG4gICAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9ycyhzZWxlY3RTbGljZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdFNsaWNlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzbGljZSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICByZWR1Y2VyLFxuICAgICAgYWN0aW9uczogY29udGV4dC5hY3Rpb25DcmVhdG9ycyxcbiAgICAgIGNhc2VSZWR1Y2VyczogY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5TmFtZSxcbiAgICAgIGdldEluaXRpYWxTdGF0ZSxcbiAgICAgIC4uLm1ha2VTZWxlY3RvclByb3BzKHJlZHVjZXJQYXRoKSxcbiAgICAgIGluamVjdEludG8oaW5qZWN0YWJsZSwge1xuICAgICAgICByZWR1Y2VyUGF0aDogcGF0aE9wdCxcbiAgICAgICAgLi4uY29uZmlnXG4gICAgICB9ID0ge30pIHtcbiAgICAgICAgY29uc3QgbmV3UmVkdWNlclBhdGggPSBwYXRoT3B0ID8/IHJlZHVjZXJQYXRoO1xuICAgICAgICBpbmplY3RhYmxlLmluamVjdCh7XG4gICAgICAgICAgcmVkdWNlclBhdGg6IG5ld1JlZHVjZXJQYXRoLFxuICAgICAgICAgIHJlZHVjZXJcbiAgICAgICAgfSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zbGljZSxcbiAgICAgICAgICAuLi5tYWtlU2VsZWN0b3JQcm9wcyhuZXdSZWR1Y2VyUGF0aCwgdHJ1ZSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBzbGljZTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHdyYXBTZWxlY3RvcihzZWxlY3Rvciwgc2VsZWN0U3RhdGUsIGdldEluaXRpYWxTdGF0ZSwgaW5qZWN0ZWQpIHtcbiAgZnVuY3Rpb24gd3JhcHBlcihyb290U3RhdGUsIC4uLmFyZ3MpIHtcbiAgICBsZXQgc2xpY2VTdGF0ZSA9IHNlbGVjdFN0YXRlKHJvb3RTdGF0ZSk7XG4gICAgaWYgKHR5cGVvZiBzbGljZVN0YXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgICAgc2xpY2VTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogXCJzZWxlY3RTdGF0ZSByZXR1cm5lZCB1bmRlZmluZWQgZm9yIGFuIHVuaW5qZWN0ZWQgc2xpY2UgcmVkdWNlclwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdG9yKHNsaWNlU3RhdGUsIC4uLmFyZ3MpO1xuICB9XG4gIHdyYXBwZXIudW53cmFwcGVkID0gc2VsZWN0b3I7XG4gIHJldHVybiB3cmFwcGVyO1xufVxudmFyIGNyZWF0ZVNsaWNlID0gLyogQF9fUFVSRV9fICovIGJ1aWxkQ3JlYXRlU2xpY2UoKTtcbmZ1bmN0aW9uIGJ1aWxkUmVkdWNlckNyZWF0b3JzKCkge1xuICBmdW5jdGlvbiBhc3luY1RodW5rKHBheWxvYWRDcmVhdG9yLCBjb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX3JlZHVjZXJEZWZpbml0aW9uVHlwZTogXCJhc3luY1RodW5rXCIgLyogYXN5bmNUaHVuayAqLyxcbiAgICAgIHBheWxvYWRDcmVhdG9yLFxuICAgICAgLi4uY29uZmlnXG4gICAgfTtcbiAgfVxuICBhc3luY1RodW5rLndpdGhUeXBlcyA9ICgpID0+IGFzeW5jVGh1bms7XG4gIHJldHVybiB7XG4gICAgcmVkdWNlcihjYXNlUmVkdWNlcikge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAvLyBoYWNrIHNvIHRoZSB3cmFwcGluZyBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNvIHRoZSBgcmVkdWNlckRlZmluaXRpb25UeXBlYCBpcyBub3QgYXNzaWduZWQgdG8gdGhlIG9yaWdpbmFsXG4gICAgICAgIFtjYXNlUmVkdWNlci5uYW1lXSguLi5hcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGNhc2VSZWR1Y2VyKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9W2Nhc2VSZWR1Y2VyLm5hbWVdLCB7XG4gICAgICAgIF9yZWR1Y2VyRGVmaW5pdGlvblR5cGU6IFwicmVkdWNlclwiIC8qIHJlZHVjZXIgKi9cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlcGFyZWRSZWR1Y2VyKHByZXBhcmUsIHJlZHVjZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9yZWR1Y2VyRGVmaW5pdGlvblR5cGU6IFwicmVkdWNlcldpdGhQcmVwYXJlXCIgLyogcmVkdWNlcldpdGhQcmVwYXJlICovLFxuICAgICAgICBwcmVwYXJlLFxuICAgICAgICByZWR1Y2VyXG4gICAgICB9O1xuICAgIH0sXG4gICAgYXN5bmNUaHVua1xuICB9O1xufVxuZnVuY3Rpb24gaGFuZGxlTm9ybWFsUmVkdWNlckRlZmluaXRpb24oe1xuICB0eXBlLFxuICByZWR1Y2VyTmFtZSxcbiAgY3JlYXRlTm90YXRpb25cbn0sIG1heWJlUmVkdWNlcldpdGhQcmVwYXJlLCBjb250ZXh0KSB7XG4gIGxldCBjYXNlUmVkdWNlcjtcbiAgbGV0IHByZXBhcmVDYWxsYmFjaztcbiAgaWYgKFwicmVkdWNlclwiIGluIG1heWJlUmVkdWNlcldpdGhQcmVwYXJlKSB7XG4gICAgaWYgKGNyZWF0ZU5vdGF0aW9uICYmICFpc0Nhc2VSZWR1Y2VyV2l0aFByZXBhcmVEZWZpbml0aW9uKG1heWJlUmVkdWNlcldpdGhQcmVwYXJlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTcpIDogXCJQbGVhc2UgdXNlIHRoZSBgY3JlYXRlLnByZXBhcmVkUmVkdWNlcmAgbm90YXRpb24gZm9yIHByZXBhcmVkIGFjdGlvbiBjcmVhdG9ycyB3aXRoIHRoZSBgY3JlYXRlYCBub3RhdGlvbi5cIik7XG4gICAgfVxuICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUucmVkdWNlcjtcbiAgICBwcmVwYXJlQ2FsbGJhY2sgPSBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZS5wcmVwYXJlO1xuICB9IGVsc2Uge1xuICAgIGNhc2VSZWR1Y2VyID0gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmU7XG4gIH1cbiAgY29udGV4dC5hZGRDYXNlKHR5cGUsIGNhc2VSZWR1Y2VyKS5leHBvc2VDYXNlUmVkdWNlcihyZWR1Y2VyTmFtZSwgY2FzZVJlZHVjZXIpLmV4cG9zZUFjdGlvbihyZWR1Y2VyTmFtZSwgcHJlcGFyZUNhbGxiYWNrID8gY3JlYXRlQWN0aW9uKHR5cGUsIHByZXBhcmVDYWxsYmFjaykgOiBjcmVhdGVBY3Rpb24odHlwZSkpO1xufVxuZnVuY3Rpb24gaXNBc3luY1RodW5rU2xpY2VSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGVmaW5pdGlvbikge1xuICByZXR1cm4gcmVkdWNlckRlZmluaXRpb24uX3JlZHVjZXJEZWZpbml0aW9uVHlwZSA9PT0gXCJhc3luY1RodW5rXCIgLyogYXN5bmNUaHVuayAqLztcbn1cbmZ1bmN0aW9uIGlzQ2FzZVJlZHVjZXJXaXRoUHJlcGFyZURlZmluaXRpb24ocmVkdWNlckRlZmluaXRpb24pIHtcbiAgcmV0dXJuIHJlZHVjZXJEZWZpbml0aW9uLl9yZWR1Y2VyRGVmaW5pdGlvblR5cGUgPT09IFwicmVkdWNlcldpdGhQcmVwYXJlXCIgLyogcmVkdWNlcldpdGhQcmVwYXJlICovO1xufVxuZnVuY3Rpb24gaGFuZGxlVGh1bmtDYXNlUmVkdWNlckRlZmluaXRpb24oe1xuICB0eXBlLFxuICByZWR1Y2VyTmFtZVxufSwgcmVkdWNlckRlZmluaXRpb24sIGNvbnRleHQsIGNBVCkge1xuICBpZiAoIWNBVCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE4KSA6IFwiQ2Fubm90IHVzZSBgY3JlYXRlLmFzeW5jVGh1bmtgIGluIHRoZSBidWlsdC1pbiBgY3JlYXRlU2xpY2VgLiBVc2UgYGJ1aWxkQ3JlYXRlU2xpY2UoeyBjcmVhdG9yczogeyBhc3luY1RodW5rOiBhc3luY1RodW5rQ3JlYXRvciB9IH0pYCB0byBjcmVhdGUgYSBjdXN0b21pc2VkIHZlcnNpb24gb2YgYGNyZWF0ZVNsaWNlYC5cIik7XG4gIH1cbiAgY29uc3Qge1xuICAgIHBheWxvYWRDcmVhdG9yLFxuICAgIGZ1bGZpbGxlZCxcbiAgICBwZW5kaW5nLFxuICAgIHJlamVjdGVkLFxuICAgIHNldHRsZWQsXG4gICAgb3B0aW9uc1xuICB9ID0gcmVkdWNlckRlZmluaXRpb247XG4gIGNvbnN0IHRodW5rID0gY0FUKHR5cGUsIHBheWxvYWRDcmVhdG9yLCBvcHRpb25zKTtcbiAgY29udGV4dC5leHBvc2VBY3Rpb24ocmVkdWNlck5hbWUsIHRodW5rKTtcbiAgaWYgKGZ1bGZpbGxlZCkge1xuICAgIGNvbnRleHQuYWRkQ2FzZSh0aHVuay5mdWxmaWxsZWQsIGZ1bGZpbGxlZCk7XG4gIH1cbiAgaWYgKHBlbmRpbmcpIHtcbiAgICBjb250ZXh0LmFkZENhc2UodGh1bmsucGVuZGluZywgcGVuZGluZyk7XG4gIH1cbiAgaWYgKHJlamVjdGVkKSB7XG4gICAgY29udGV4dC5hZGRDYXNlKHRodW5rLnJlamVjdGVkLCByZWplY3RlZCk7XG4gIH1cbiAgaWYgKHNldHRsZWQpIHtcbiAgICBjb250ZXh0LmFkZE1hdGNoZXIodGh1bmsuc2V0dGxlZCwgc2V0dGxlZCk7XG4gIH1cbiAgY29udGV4dC5leHBvc2VDYXNlUmVkdWNlcihyZWR1Y2VyTmFtZSwge1xuICAgIGZ1bGZpbGxlZDogZnVsZmlsbGVkIHx8IG5vb3AsXG4gICAgcGVuZGluZzogcGVuZGluZyB8fCBub29wLFxuICAgIHJlamVjdGVkOiByZWplY3RlZCB8fCBub29wLFxuICAgIHNldHRsZWQ6IHNldHRsZWQgfHwgbm9vcFxuICB9KTtcbn1cbmZ1bmN0aW9uIG5vb3AoKSB7XG59XG5cbi8vIHNyYy9lbnRpdGllcy9lbnRpdHlfc3RhdGUudHNcbmZ1bmN0aW9uIGdldEluaXRpYWxFbnRpdHlTdGF0ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBpZHM6IFtdLFxuICAgIGVudGl0aWVzOiB7fVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW5pdGlhbFN0YXRlRmFjdG9yeShzdGF0ZUFkYXB0ZXIpIHtcbiAgZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKGFkZGl0aW9uYWxTdGF0ZSA9IHt9LCBlbnRpdGllcykge1xuICAgIGNvbnN0IHN0YXRlID0gT2JqZWN0LmFzc2lnbihnZXRJbml0aWFsRW50aXR5U3RhdGUoKSwgYWRkaXRpb25hbFN0YXRlKTtcbiAgICByZXR1cm4gZW50aXRpZXMgPyBzdGF0ZUFkYXB0ZXIuc2V0QWxsKHN0YXRlLCBlbnRpdGllcykgOiBzdGF0ZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldEluaXRpYWxTdGF0ZVxuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvc3RhdGVfc2VsZWN0b3JzLnRzXG5mdW5jdGlvbiBjcmVhdGVTZWxlY3RvcnNGYWN0b3J5KCkge1xuICBmdW5jdGlvbiBnZXRTZWxlY3RvcnMoc2VsZWN0U3RhdGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNyZWF0ZVNlbGVjdG9yOiBjcmVhdGVTZWxlY3RvcjIgPSBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvclxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHNlbGVjdElkcyA9IChzdGF0ZSkgPT4gc3RhdGUuaWRzO1xuICAgIGNvbnN0IHNlbGVjdEVudGl0aWVzID0gKHN0YXRlKSA9PiBzdGF0ZS5lbnRpdGllcztcbiAgICBjb25zdCBzZWxlY3RBbGwgPSBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0SWRzLCBzZWxlY3RFbnRpdGllcywgKGlkcywgZW50aXRpZXMpID0+IGlkcy5tYXAoKGlkKSA9PiBlbnRpdGllc1tpZF0pKTtcbiAgICBjb25zdCBzZWxlY3RJZCA9IChfLCBpZCkgPT4gaWQ7XG4gICAgY29uc3Qgc2VsZWN0QnlJZCA9IChlbnRpdGllcywgaWQpID0+IGVudGl0aWVzW2lkXTtcbiAgICBjb25zdCBzZWxlY3RUb3RhbCA9IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RJZHMsIChpZHMpID0+IGlkcy5sZW5ndGgpO1xuICAgIGlmICghc2VsZWN0U3RhdGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdElkcyxcbiAgICAgICAgc2VsZWN0RW50aXRpZXMsXG4gICAgICAgIHNlbGVjdEFsbCxcbiAgICAgICAgc2VsZWN0VG90YWwsXG4gICAgICAgIHNlbGVjdEJ5SWQ6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RFbnRpdGllcywgc2VsZWN0SWQsIHNlbGVjdEJ5SWQpXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RHbG9iYWxpemVkRW50aXRpZXMgPSBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdEVudGl0aWVzKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0SWRzOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdElkcyksXG4gICAgICBzZWxlY3RFbnRpdGllczogc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLFxuICAgICAgc2VsZWN0QWxsOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdEFsbCksXG4gICAgICBzZWxlY3RUb3RhbDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdFN0YXRlLCBzZWxlY3RUb3RhbCksXG4gICAgICBzZWxlY3RCeUlkOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0R2xvYmFsaXplZEVudGl0aWVzLCBzZWxlY3RJZCwgc2VsZWN0QnlJZClcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2V0U2VsZWN0b3JzXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9zdGF0ZV9hZGFwdGVyLnRzXG5pbXBvcnQgeyBwcm9kdWNlIGFzIGNyZWF0ZU5leHRTdGF0ZTMsIGlzRHJhZnQgYXMgaXNEcmFmdDMgfSBmcm9tIFwiaW1tZXJcIjtcbnZhciBpc0RyYWZ0VHlwZWQgPSBpc0RyYWZ0MztcbmZ1bmN0aW9uIGNyZWF0ZVNpbmdsZUFyZ3VtZW50U3RhdGVPcGVyYXRvcihtdXRhdG9yKSB7XG4gIGNvbnN0IG9wZXJhdG9yID0gY3JlYXRlU3RhdGVPcGVyYXRvcigoXywgc3RhdGUpID0+IG11dGF0b3Ioc3RhdGUpKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9wZXJhdGlvbihzdGF0ZSkge1xuICAgIHJldHVybiBvcGVyYXRvcihzdGF0ZSwgdm9pZCAwKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRlT3BlcmF0b3IobXV0YXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gb3BlcmF0aW9uKHN0YXRlLCBhcmcpIHtcbiAgICBmdW5jdGlvbiBpc1BheWxvYWRBY3Rpb25Bcmd1bWVudChhcmcyKSB7XG4gICAgICByZXR1cm4gaXNGU0EoYXJnMik7XG4gICAgfVxuICAgIGNvbnN0IHJ1bk11dGF0b3IgPSAoZHJhZnQpID0+IHtcbiAgICAgIGlmIChpc1BheWxvYWRBY3Rpb25Bcmd1bWVudChhcmcpKSB7XG4gICAgICAgIG11dGF0b3IoYXJnLnBheWxvYWQsIGRyYWZ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11dGF0b3IoYXJnLCBkcmFmdCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoaXNEcmFmdFR5cGVkKHN0YXRlKSkge1xuICAgICAgcnVuTXV0YXRvcihzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVOZXh0U3RhdGUzKHN0YXRlLCBydW5NdXRhdG9yKTtcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3V0aWxzLnRzXG5pbXBvcnQgeyBjdXJyZW50IGFzIGN1cnJlbnQyLCBpc0RyYWZ0IGFzIGlzRHJhZnQ0IH0gZnJvbSBcImltbWVyXCI7XG5mdW5jdGlvbiBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpIHtcbiAgY29uc3Qga2V5ID0gc2VsZWN0SWQoZW50aXR5KTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBrZXkgPT09IHZvaWQgMCkge1xuICAgIGNvbnNvbGUud2FybihcIlRoZSBlbnRpdHkgcGFzc2VkIHRvIHRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uIHJldHVybmVkIHVuZGVmaW5lZC5cIiwgXCJZb3Ugc2hvdWxkIHByb2JhYmx5IHByb3ZpZGUgeW91ciBvd24gYHNlbGVjdElkYCBpbXBsZW1lbnRhdGlvbi5cIiwgXCJUaGUgZW50aXR5IHRoYXQgd2FzIHBhc3NlZDpcIiwgZW50aXR5LCBcIlRoZSBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uOlwiLCBzZWxlY3RJZC50b1N0cmluZygpKTtcbiAgfVxuICByZXR1cm4ga2V5O1xufVxuZnVuY3Rpb24gZW5zdXJlRW50aXRpZXNBcnJheShlbnRpdGllcykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZW50aXRpZXMpKSB7XG4gICAgZW50aXRpZXMgPSBPYmplY3QudmFsdWVzKGVudGl0aWVzKTtcbiAgfVxuICByZXR1cm4gZW50aXRpZXM7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50KHZhbHVlKSB7XG4gIHJldHVybiBpc0RyYWZ0NCh2YWx1ZSkgPyBjdXJyZW50Mih2YWx1ZSkgOiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNwbGl0QWRkZWRVcGRhdGVkRW50aXRpZXMobmV3RW50aXRpZXMsIHNlbGVjdElkLCBzdGF0ZSkge1xuICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICBjb25zdCBleGlzdGluZ0lkc0FycmF5ID0gZ2V0Q3VycmVudChzdGF0ZS5pZHMpO1xuICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQoZXhpc3RpbmdJZHNBcnJheSk7XG4gIGNvbnN0IGFkZGVkID0gW107XG4gIGNvbnN0IHVwZGF0ZWQgPSBbXTtcbiAgZm9yIChjb25zdCBlbnRpdHkgb2YgbmV3RW50aXRpZXMpIHtcbiAgICBjb25zdCBpZCA9IHNlbGVjdElkVmFsdWUoZW50aXR5LCBzZWxlY3RJZCk7XG4gICAgaWYgKGV4aXN0aW5nSWRzLmhhcyhpZCkpIHtcbiAgICAgIHVwZGF0ZWQucHVzaCh7XG4gICAgICAgIGlkLFxuICAgICAgICBjaGFuZ2VzOiBlbnRpdHlcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRlZC5wdXNoKGVudGl0eSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbYWRkZWQsIHVwZGF0ZWQsIGV4aXN0aW5nSWRzQXJyYXldO1xufVxuXG4vLyBzcmMvZW50aXRpZXMvdW5zb3J0ZWRfc3RhdGVfYWRhcHRlci50c1xuZnVuY3Rpb24gY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpIHtcbiAgZnVuY3Rpb24gYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgY29uc3Qga2V5ID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcbiAgICBpZiAoa2V5IGluIHN0YXRlLmVudGl0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlLmlkcy5wdXNoKGtleSk7XG4gICAgc3RhdGUuZW50aXRpZXNba2V5XSA9IGVudGl0eTtcbiAgfVxuICBmdW5jdGlvbiBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIG5ld0VudGl0aWVzKSB7XG4gICAgICBhZGRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICBjb25zdCBrZXkgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xuICAgIGlmICghKGtleSBpbiBzdGF0ZS5lbnRpdGllcykpIHtcbiAgICAgIHN0YXRlLmlkcy5wdXNoKGtleSk7XG4gICAgfVxuICAgIDtcbiAgICBzdGF0ZS5lbnRpdGllc1trZXldID0gZW50aXR5O1xuICB9XG4gIGZ1bmN0aW9uIHNldE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgbmV3RW50aXRpZXMpIHtcbiAgICAgIHNldE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldEFsbE11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBzdGF0ZS5pZHMgPSBbXTtcbiAgICBzdGF0ZS5lbnRpdGllcyA9IHt9O1xuICAgIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlT25lTXV0YWJseShrZXksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHJlbW92ZU1hbnlNdXRhYmx5KFtrZXldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlTWFueU11dGFibHkoa2V5cywgc3RhdGUpIHtcbiAgICBsZXQgZGlkTXV0YXRlID0gZmFsc2U7XG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkgaW4gc3RhdGUuZW50aXRpZXMpIHtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW2tleV07XG4gICAgICAgIGRpZE11dGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGRpZE11dGF0ZSkge1xuICAgICAgc3RhdGUuaWRzID0gc3RhdGUuaWRzLmZpbHRlcigoaWQpID0+IGlkIGluIHN0YXRlLmVudGl0aWVzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlQWxsTXV0YWJseShzdGF0ZSkge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsIHtcbiAgICAgIGlkczogW10sXG4gICAgICBlbnRpdGllczoge31cbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiB0YWtlTmV3S2V5KGtleXMsIHVwZGF0ZSwgc3RhdGUpIHtcbiAgICBjb25zdCBvcmlnaW5hbDMgPSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xuICAgIGlmIChvcmlnaW5hbDMgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkID0gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWwzLCB1cGRhdGUuY2hhbmdlcyk7XG4gICAgY29uc3QgbmV3S2V5ID0gc2VsZWN0SWRWYWx1ZSh1cGRhdGVkLCBzZWxlY3RJZCk7XG4gICAgY29uc3QgaGFzTmV3S2V5ID0gbmV3S2V5ICE9PSB1cGRhdGUuaWQ7XG4gICAgaWYgKGhhc05ld0tleSkge1xuICAgICAga2V5c1t1cGRhdGUuaWRdID0gbmV3S2V5O1xuICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgfVxuICAgIDtcbiAgICBzdGF0ZS5lbnRpdGllc1tuZXdLZXldID0gdXBkYXRlZDtcbiAgICByZXR1cm4gaGFzTmV3S2V5O1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZU9uZU11dGFibHkodXBkYXRlLCBzdGF0ZSkge1xuICAgIHJldHVybiB1cGRhdGVNYW55TXV0YWJseShbdXBkYXRlXSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZU1hbnlNdXRhYmx5KHVwZGF0ZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgbmV3S2V5cyA9IHt9O1xuICAgIGNvbnN0IHVwZGF0ZXNQZXJFbnRpdHkgPSB7fTtcbiAgICB1cGRhdGVzLmZvckVhY2goKHVwZGF0ZSkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZS5pZCBpbiBzdGF0ZS5lbnRpdGllcykge1xuICAgICAgICB1cGRhdGVzUGVyRW50aXR5W3VwZGF0ZS5pZF0gPSB7XG4gICAgICAgICAgaWQ6IHVwZGF0ZS5pZCxcbiAgICAgICAgICAvLyBTcHJlYWRzIGlnbm9yZSBmYWxzeSB2YWx1ZXMsIHNvIHRoaXMgd29ya3MgZXZlbiBpZiB0aGVyZSBpc24ndFxuICAgICAgICAgIC8vIGFuIGV4aXN0aW5nIHVwZGF0ZSBhbHJlYWR5IGF0IHRoaXMga2V5XG4gICAgICAgICAgY2hhbmdlczoge1xuICAgICAgICAgICAgLi4udXBkYXRlc1BlckVudGl0eVt1cGRhdGUuaWRdPy5jaGFuZ2VzLFxuICAgICAgICAgICAgLi4udXBkYXRlLmNoYW5nZXNcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgdXBkYXRlcyA9IE9iamVjdC52YWx1ZXModXBkYXRlc1BlckVudGl0eSk7XG4gICAgY29uc3QgZGlkTXV0YXRlRW50aXRpZXMgPSB1cGRhdGVzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGRpZE11dGF0ZUVudGl0aWVzKSB7XG4gICAgICBjb25zdCBkaWRNdXRhdGVJZHMgPSB1cGRhdGVzLmZpbHRlcigodXBkYXRlKSA9PiB0YWtlTmV3S2V5KG5ld0tleXMsIHVwZGF0ZSwgc3RhdGUpKS5sZW5ndGggPiAwO1xuICAgICAgaWYgKGRpZE11dGF0ZUlkcykge1xuICAgICAgICBzdGF0ZS5pZHMgPSBPYmplY3QudmFsdWVzKHN0YXRlLmVudGl0aWVzKS5tYXAoKGUpID0+IHNlbGVjdElkVmFsdWUoZSwgc2VsZWN0SWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwc2VydE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgW2FkZGVkLCB1cGRhdGVkXSA9IHNwbGl0QWRkZWRVcGRhdGVkRW50aXRpZXMobmV3RW50aXRpZXMsIHNlbGVjdElkLCBzdGF0ZSk7XG4gICAgdXBkYXRlTWFueU11dGFibHkodXBkYXRlZCwgc3RhdGUpO1xuICAgIGFkZE1hbnlNdXRhYmx5KGFkZGVkLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW1vdmVBbGw6IGNyZWF0ZVNpbmdsZUFyZ3VtZW50U3RhdGVPcGVyYXRvcihyZW1vdmVBbGxNdXRhYmx5KSxcbiAgICBhZGRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkT25lTXV0YWJseSksXG4gICAgYWRkTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRNYW55TXV0YWJseSksXG4gICAgc2V0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE9uZU11dGFibHkpLFxuICAgIHNldE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0TWFueU11dGFibHkpLFxuICAgIHNldEFsbDogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRBbGxNdXRhYmx5KSxcbiAgICB1cGRhdGVPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlT25lTXV0YWJseSksXG4gICAgdXBkYXRlTWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVNYW55TXV0YWJseSksXG4gICAgdXBzZXJ0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE9uZU11dGFibHkpLFxuICAgIHVwc2VydE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0TWFueU11dGFibHkpLFxuICAgIHJlbW92ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihyZW1vdmVPbmVNdXRhYmx5KSxcbiAgICByZW1vdmVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHJlbW92ZU1hbnlNdXRhYmx5KVxuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvc29ydGVkX3N0YXRlX2FkYXB0ZXIudHNcbmZ1bmN0aW9uIGZpbmRJbnNlcnRJbmRleChzb3J0ZWRJdGVtcywgaXRlbSwgY29tcGFyaXNvbkZ1bmN0aW9uKSB7XG4gIGxldCBsb3dJbmRleCA9IDA7XG4gIGxldCBoaWdoSW5kZXggPSBzb3J0ZWRJdGVtcy5sZW5ndGg7XG4gIHdoaWxlIChsb3dJbmRleCA8IGhpZ2hJbmRleCkge1xuICAgIGxldCBtaWRkbGVJbmRleCA9IGxvd0luZGV4ICsgaGlnaEluZGV4ID4+PiAxO1xuICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gc29ydGVkSXRlbXNbbWlkZGxlSW5kZXhdO1xuICAgIGNvbnN0IHJlcyA9IGNvbXBhcmlzb25GdW5jdGlvbihpdGVtLCBjdXJyZW50SXRlbSk7XG4gICAgaWYgKHJlcyA+PSAwKSB7XG4gICAgICBsb3dJbmRleCA9IG1pZGRsZUluZGV4ICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGlnaEluZGV4ID0gbWlkZGxlSW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiBsb3dJbmRleDtcbn1cbmZ1bmN0aW9uIGluc2VydChzb3J0ZWRJdGVtcywgaXRlbSwgY29tcGFyaXNvbkZ1bmN0aW9uKSB7XG4gIGNvbnN0IGluc2VydEF0SW5kZXggPSBmaW5kSW5zZXJ0SW5kZXgoc29ydGVkSXRlbXMsIGl0ZW0sIGNvbXBhcmlzb25GdW5jdGlvbik7XG4gIHNvcnRlZEl0ZW1zLnNwbGljZShpbnNlcnRBdEluZGV4LCAwLCBpdGVtKTtcbiAgcmV0dXJuIHNvcnRlZEl0ZW1zO1xufVxuZnVuY3Rpb24gY3JlYXRlU29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkLCBjb21wYXJlcikge1xuICBjb25zdCB7XG4gICAgcmVtb3ZlT25lLFxuICAgIHJlbW92ZU1hbnksXG4gICAgcmVtb3ZlQWxsXG4gIH0gPSBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCk7XG4gIGZ1bmN0aW9uIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIHJldHVybiBhZGRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSwgZXhpc3RpbmdJZHMpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IG5ldyBTZXQoZXhpc3RpbmdJZHMgPz8gZ2V0Q3VycmVudChzdGF0ZS5pZHMpKTtcbiAgICBjb25zdCBtb2RlbHMgPSBuZXdFbnRpdGllcy5maWx0ZXIoKG1vZGVsKSA9PiAhZXhpc3RpbmdLZXlzLmhhcyhzZWxlY3RJZFZhbHVlKG1vZGVsLCBzZWxlY3RJZCkpKTtcbiAgICBpZiAobW9kZWxzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgbWVyZ2VGdW5jdGlvbihzdGF0ZSwgbW9kZWxzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHNldE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBpZiAobmV3RW50aXRpZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3RW50aXRpZXMpIHtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW3NlbGVjdElkKGl0ZW0pXTtcbiAgICAgIH1cbiAgICAgIG1lcmdlRnVuY3Rpb24oc3RhdGUsIG5ld0VudGl0aWVzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0QWxsTXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIHN0YXRlLmVudGl0aWVzID0ge307XG4gICAgc3RhdGUuaWRzID0gW107XG4gICAgYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlLCBbXSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlT25lTXV0YWJseSh1cGRhdGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU1hbnlNdXRhYmx5KFt1cGRhdGVdLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlTWFueU11dGFibHkodXBkYXRlcywgc3RhdGUpIHtcbiAgICBsZXQgYXBwbGllZFVwZGF0ZXMgPSBmYWxzZTtcbiAgICBsZXQgcmVwbGFjZWRJZHMgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB1cGRhdGUgb2YgdXBkYXRlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICAgIGlmICghZW50aXR5KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXBwbGllZFVwZGF0ZXMgPSB0cnVlO1xuICAgICAgT2JqZWN0LmFzc2lnbihlbnRpdHksIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICAgIGNvbnN0IG5ld0lkID0gc2VsZWN0SWQoZW50aXR5KTtcbiAgICAgIGlmICh1cGRhdGUuaWQgIT09IG5ld0lkKSB7XG4gICAgICAgIHJlcGxhY2VkSWRzID0gdHJ1ZTtcbiAgICAgICAgZGVsZXRlIHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gc3RhdGUuaWRzLmluZGV4T2YodXBkYXRlLmlkKTtcbiAgICAgICAgc3RhdGUuaWRzW29sZEluZGV4XSA9IG5ld0lkO1xuICAgICAgICBzdGF0ZS5lbnRpdGllc1tuZXdJZF0gPSBlbnRpdHk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcHBsaWVkVXBkYXRlcykge1xuICAgICAgbWVyZ2VGdW5jdGlvbihzdGF0ZSwgW10sIGFwcGxpZWRVcGRhdGVzLCByZXBsYWNlZElkcyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHVwc2VydE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIHJldHVybiB1cHNlcnRNYW55TXV0YWJseShbZW50aXR5XSwgc3RhdGUpO1xuICB9XG4gIGZ1bmN0aW9uIHVwc2VydE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIGNvbnN0IFthZGRlZCwgdXBkYXRlZCwgZXhpc3RpbmdJZHNBcnJheV0gPSBzcGxpdEFkZGVkVXBkYXRlZEVudGl0aWVzKG5ld0VudGl0aWVzLCBzZWxlY3RJZCwgc3RhdGUpO1xuICAgIGlmICh1cGRhdGVkLmxlbmd0aCkge1xuICAgICAgdXBkYXRlTWFueU11dGFibHkodXBkYXRlZCwgc3RhdGUpO1xuICAgIH1cbiAgICBpZiAoYWRkZWQubGVuZ3RoKSB7XG4gICAgICBhZGRNYW55TXV0YWJseShhZGRlZCwgc3RhdGUsIGV4aXN0aW5nSWRzQXJyYXkpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhcmVBcnJheXNFcXVhbChhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldID09PSBiW2ldKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBtZXJnZUZ1bmN0aW9uID0gKHN0YXRlLCBhZGRlZEl0ZW1zLCBhcHBsaWVkVXBkYXRlcywgcmVwbGFjZWRJZHMpID0+IHtcbiAgICBjb25zdCBjdXJyZW50RW50aXRpZXMgPSBnZXRDdXJyZW50KHN0YXRlLmVudGl0aWVzKTtcbiAgICBjb25zdCBjdXJyZW50SWRzID0gZ2V0Q3VycmVudChzdGF0ZS5pZHMpO1xuICAgIGNvbnN0IHN0YXRlRW50aXRpZXMgPSBzdGF0ZS5lbnRpdGllcztcbiAgICBsZXQgaWRzID0gY3VycmVudElkcztcbiAgICBpZiAocmVwbGFjZWRJZHMpIHtcbiAgICAgIGlkcyA9IG5ldyBTZXQoY3VycmVudElkcyk7XG4gICAgfVxuICAgIGxldCBzb3J0ZWRFbnRpdGllcyA9IFtdO1xuICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBjdXJyZW50RW50aXRpZXNbaWRdO1xuICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICBzb3J0ZWRFbnRpdGllcy5wdXNoKGVudGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHdhc1ByZXZpb3VzbHlFbXB0eSA9IHNvcnRlZEVudGl0aWVzLmxlbmd0aCA9PT0gMDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYWRkZWRJdGVtcykge1xuICAgICAgc3RhdGVFbnRpdGllc1tzZWxlY3RJZChpdGVtKV0gPSBpdGVtO1xuICAgICAgaWYgKCF3YXNQcmV2aW91c2x5RW1wdHkpIHtcbiAgICAgICAgaW5zZXJ0KHNvcnRlZEVudGl0aWVzLCBpdGVtLCBjb21wYXJlcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3YXNQcmV2aW91c2x5RW1wdHkpIHtcbiAgICAgIHNvcnRlZEVudGl0aWVzID0gYWRkZWRJdGVtcy5zbGljZSgpLnNvcnQoY29tcGFyZXIpO1xuICAgIH0gZWxzZSBpZiAoYXBwbGllZFVwZGF0ZXMpIHtcbiAgICAgIHNvcnRlZEVudGl0aWVzLnNvcnQoY29tcGFyZXIpO1xuICAgIH1cbiAgICBjb25zdCBuZXdTb3J0ZWRJZHMgPSBzb3J0ZWRFbnRpdGllcy5tYXAoc2VsZWN0SWQpO1xuICAgIGlmICghYXJlQXJyYXlzRXF1YWwoY3VycmVudElkcywgbmV3U29ydGVkSWRzKSkge1xuICAgICAgc3RhdGUuaWRzID0gbmV3U29ydGVkSWRzO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICByZW1vdmVPbmUsXG4gICAgcmVtb3ZlTWFueSxcbiAgICByZW1vdmVBbGwsXG4gICAgYWRkT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE9uZU11dGFibHkpLFxuICAgIHVwZGF0ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVPbmVNdXRhYmx5KSxcbiAgICB1cHNlcnRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0T25lTXV0YWJseSksXG4gICAgc2V0T25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldE9uZU11dGFibHkpLFxuICAgIHNldE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0TWFueU11dGFibHkpLFxuICAgIHNldEFsbDogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRBbGxNdXRhYmx5KSxcbiAgICBhZGRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE1hbnlNdXRhYmx5KSxcbiAgICB1cGRhdGVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU1hbnlNdXRhYmx5KSxcbiAgICB1cHNlcnRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwc2VydE1hbnlNdXRhYmx5KVxuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvY3JlYXRlX2FkYXB0ZXIudHNcbmZ1bmN0aW9uIGNyZWF0ZUVudGl0eUFkYXB0ZXIob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBzZWxlY3RJZCxcbiAgICBzb3J0Q29tcGFyZXJcbiAgfSA9IHtcbiAgICBzb3J0Q29tcGFyZXI6IGZhbHNlLFxuICAgIHNlbGVjdElkOiAoaW5zdGFuY2UpID0+IGluc3RhbmNlLmlkLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgY29uc3Qgc3RhdGVBZGFwdGVyID0gc29ydENvbXBhcmVyID8gY3JlYXRlU29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkLCBzb3J0Q29tcGFyZXIpIDogY3JlYXRlVW5zb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQpO1xuICBjb25zdCBzdGF0ZUZhY3RvcnkgPSBjcmVhdGVJbml0aWFsU3RhdGVGYWN0b3J5KHN0YXRlQWRhcHRlcik7XG4gIGNvbnN0IHNlbGVjdG9yc0ZhY3RvcnkgPSBjcmVhdGVTZWxlY3RvcnNGYWN0b3J5KCk7XG4gIHJldHVybiB7XG4gICAgc2VsZWN0SWQsXG4gICAgc29ydENvbXBhcmVyLFxuICAgIC4uLnN0YXRlRmFjdG9yeSxcbiAgICAuLi5zZWxlY3RvcnNGYWN0b3J5LFxuICAgIC4uLnN0YXRlQWRhcHRlclxuICB9O1xufVxuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL2luZGV4LnRzXG5pbXBvcnQgeyBpc0FjdGlvbiBhcyBpc0FjdGlvbjMgfSBmcm9tIFwicmVkdXhcIjtcblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS9leGNlcHRpb25zLnRzXG52YXIgdGFzayA9IFwidGFza1wiO1xudmFyIGxpc3RlbmVyID0gXCJsaXN0ZW5lclwiO1xudmFyIGNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG52YXIgY2FuY2VsbGVkID0gXCJjYW5jZWxsZWRcIjtcbnZhciB0YXNrQ2FuY2VsbGVkID0gYHRhc2stJHtjYW5jZWxsZWR9YDtcbnZhciB0YXNrQ29tcGxldGVkID0gYHRhc2stJHtjb21wbGV0ZWR9YDtcbnZhciBsaXN0ZW5lckNhbmNlbGxlZCA9IGAke2xpc3RlbmVyfS0ke2NhbmNlbGxlZH1gO1xudmFyIGxpc3RlbmVyQ29tcGxldGVkID0gYCR7bGlzdGVuZXJ9LSR7Y29tcGxldGVkfWA7XG52YXIgVGFza0Fib3J0RXJyb3IgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvZGUpIHtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIHRoaXMubWVzc2FnZSA9IGAke3Rhc2t9ICR7Y2FuY2VsbGVkfSAocmVhc29uOiAke2NvZGV9KWA7XG4gIH1cbiAgbmFtZSA9IFwiVGFza0Fib3J0RXJyb3JcIjtcbiAgbWVzc2FnZTtcbn07XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvdXRpbHMudHNcbnZhciBhc3NlcnRGdW5jdGlvbiA9IChmdW5jLCBleHBlY3RlZCkgPT4ge1xuICBpZiAodHlwZW9mIGZ1bmMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMyKSA6IGAke2V4cGVjdGVkfSBpcyBub3QgYSBmdW5jdGlvbmApO1xuICB9XG59O1xudmFyIG5vb3AyID0gKCkgPT4ge1xufTtcbnZhciBjYXRjaFJlamVjdGlvbiA9IChwcm9taXNlLCBvbkVycm9yID0gbm9vcDIpID0+IHtcbiAgcHJvbWlzZS5jYXRjaChvbkVycm9yKTtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xudmFyIGFkZEFib3J0U2lnbmFsTGlzdGVuZXIgPSAoYWJvcnRTaWduYWwsIGNhbGxiYWNrKSA9PiB7XG4gIGFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBjYWxsYmFjaywge1xuICAgIG9uY2U6IHRydWVcbiAgfSk7XG4gIHJldHVybiAoKSA9PiBhYm9ydFNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgY2FsbGJhY2spO1xufTtcbnZhciBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uID0gKGFib3J0Q29udHJvbGxlciwgcmVhc29uKSA9PiB7XG4gIGNvbnN0IHNpZ25hbCA9IGFib3J0Q29udHJvbGxlci5zaWduYWw7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIShcInJlYXNvblwiIGluIHNpZ25hbCkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2lnbmFsLCBcInJlYXNvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHJlYXNvbixcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgO1xuICBhYm9ydENvbnRyb2xsZXIuYWJvcnQocmVhc29uKTtcbn07XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvdGFzay50c1xudmFyIHZhbGlkYXRlQWN0aXZlID0gKHNpZ25hbCkgPT4ge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICBjb25zdCB7XG4gICAgICByZWFzb25cbiAgICB9ID0gc2lnbmFsO1xuICAgIHRocm93IG5ldyBUYXNrQWJvcnRFcnJvcihyZWFzb24pO1xuICB9XG59O1xuZnVuY3Rpb24gcmFjZVdpdGhTaWduYWwoc2lnbmFsLCBwcm9taXNlKSB7XG4gIGxldCBjbGVhbnVwID0gbm9vcDI7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgbm90aWZ5UmVqZWN0aW9uID0gKCkgPT4gcmVqZWN0KG5ldyBUYXNrQWJvcnRFcnJvcihzaWduYWwucmVhc29uKSk7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBub3RpZnlSZWplY3Rpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2xlYW51cCA9IGFkZEFib3J0U2lnbmFsTGlzdGVuZXIoc2lnbmFsLCBub3RpZnlSZWplY3Rpb24pO1xuICAgIHByb21pc2UuZmluYWxseSgoKSA9PiBjbGVhbnVwKCkpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgY2xlYW51cCA9IG5vb3AyO1xuICB9KTtcbn1cbnZhciBydW5UYXNrID0gYXN5bmMgKHRhc2syLCBjbGVhblVwKSA9PiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0YXNrMigpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIHZhbHVlXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBlcnJvciBpbnN0YW5jZW9mIFRhc2tBYm9ydEVycm9yID8gXCJjYW5jZWxsZWRcIiA6IFwicmVqZWN0ZWRcIixcbiAgICAgIGVycm9yXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhblVwPy4oKTtcbiAgfVxufTtcbnZhciBjcmVhdGVQYXVzZSA9IChzaWduYWwpID0+IHtcbiAgcmV0dXJuIChwcm9taXNlKSA9PiB7XG4gICAgcmV0dXJuIGNhdGNoUmVqZWN0aW9uKHJhY2VXaXRoU2lnbmFsKHNpZ25hbCwgcHJvbWlzZSkudGhlbigob3V0cHV0KSA9PiB7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShzaWduYWwpO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KSk7XG4gIH07XG59O1xudmFyIGNyZWF0ZURlbGF5ID0gKHNpZ25hbCkgPT4ge1xuICBjb25zdCBwYXVzZSA9IGNyZWF0ZVBhdXNlKHNpZ25hbCk7XG4gIHJldHVybiAodGltZW91dE1zKSA9PiB7XG4gICAgcmV0dXJuIHBhdXNlKG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcykpKTtcbiAgfTtcbn07XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvaW5kZXgudHNcbnZhciB7XG4gIGFzc2lnblxufSA9IE9iamVjdDtcbnZhciBJTlRFUk5BTF9OSUxfVE9LRU4gPSB7fTtcbnZhciBhbG0gPSBcImxpc3RlbmVyTWlkZGxld2FyZVwiO1xudmFyIGNyZWF0ZUZvcmsgPSAocGFyZW50QWJvcnRTaWduYWwsIHBhcmVudEJsb2NraW5nUHJvbWlzZXMpID0+IHtcbiAgY29uc3QgbGlua0NvbnRyb2xsZXJzID0gKGNvbnRyb2xsZXIpID0+IGFkZEFib3J0U2lnbmFsTGlzdGVuZXIocGFyZW50QWJvcnRTaWduYWwsICgpID0+IGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY29udHJvbGxlciwgcGFyZW50QWJvcnRTaWduYWwucmVhc29uKSk7XG4gIHJldHVybiAodGFza0V4ZWN1dG9yLCBvcHRzKSA9PiB7XG4gICAgYXNzZXJ0RnVuY3Rpb24odGFza0V4ZWN1dG9yLCBcInRhc2tFeGVjdXRvclwiKTtcbiAgICBjb25zdCBjaGlsZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBsaW5rQ29udHJvbGxlcnMoY2hpbGRBYm9ydENvbnRyb2xsZXIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJ1blRhc2soYXN5bmMgKCkgPT4ge1xuICAgICAgdmFsaWRhdGVBY3RpdmUocGFyZW50QWJvcnRTaWduYWwpO1xuICAgICAgdmFsaWRhdGVBY3RpdmUoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIGNvbnN0IHJlc3VsdDIgPSBhd2FpdCB0YXNrRXhlY3V0b3Ioe1xuICAgICAgICBwYXVzZTogY3JlYXRlUGF1c2UoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgZGVsYXk6IGNyZWF0ZURlbGF5KGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgIHNpZ25hbDogY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKGNoaWxkQWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICByZXR1cm4gcmVzdWx0MjtcbiAgICB9LCAoKSA9PiBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNoaWxkQWJvcnRDb250cm9sbGVyLCB0YXNrQ29tcGxldGVkKSk7XG4gICAgaWYgKG9wdHM/LmF1dG9Kb2luKSB7XG4gICAgICBwYXJlbnRCbG9ja2luZ1Byb21pc2VzLnB1c2gocmVzdWx0LmNhdGNoKG5vb3AyKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZXN1bHQ6IGNyZWF0ZVBhdXNlKHBhcmVudEFib3J0U2lnbmFsKShyZXN1bHQpLFxuICAgICAgY2FuY2VsKCkge1xuICAgICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNoaWxkQWJvcnRDb250cm9sbGVyLCB0YXNrQ2FuY2VsbGVkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xufTtcbnZhciBjcmVhdGVUYWtlUGF0dGVybiA9IChzdGFydExpc3RlbmluZywgc2lnbmFsKSA9PiB7XG4gIGNvbnN0IHRha2UgPSBhc3luYyAocHJlZGljYXRlLCB0aW1lb3V0KSA9PiB7XG4gICAgdmFsaWRhdGVBY3RpdmUoc2lnbmFsKTtcbiAgICBsZXQgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgfTtcbiAgICBjb25zdCB0dXBsZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc3RvcExpc3RlbmluZyA9IHN0YXJ0TGlzdGVuaW5nKHtcbiAgICAgICAgcHJlZGljYXRlLFxuICAgICAgICBlZmZlY3Q6IChhY3Rpb24sIGxpc3RlbmVyQXBpKSA9PiB7XG4gICAgICAgICAgbGlzdGVuZXJBcGkudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICByZXNvbHZlKFthY3Rpb24sIGxpc3RlbmVyQXBpLmdldFN0YXRlKCksIGxpc3RlbmVyQXBpLmdldE9yaWdpbmFsU3RhdGUoKV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICBzdG9wTGlzdGVuaW5nKCk7XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFt0dXBsZVByb21pc2VdO1xuICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dCwgbnVsbCkpKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHJhY2VXaXRoU2lnbmFsKHNpZ25hbCwgUHJvbWlzZS5yYWNlKHByb21pc2VzKSk7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShzaWduYWwpO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAocHJlZGljYXRlLCB0aW1lb3V0KSA9PiBjYXRjaFJlamVjdGlvbih0YWtlKHByZWRpY2F0ZSwgdGltZW91dCkpO1xufTtcbnZhciBnZXRMaXN0ZW5lckVudHJ5UHJvcHNGcm9tID0gKG9wdGlvbnMpID0+IHtcbiAgbGV0IHtcbiAgICB0eXBlLFxuICAgIGFjdGlvbkNyZWF0b3IsXG4gICAgbWF0Y2hlcixcbiAgICBwcmVkaWNhdGUsXG4gICAgZWZmZWN0XG4gIH0gPSBvcHRpb25zO1xuICBpZiAodHlwZSkge1xuICAgIHByZWRpY2F0ZSA9IGNyZWF0ZUFjdGlvbih0eXBlKS5tYXRjaDtcbiAgfSBlbHNlIGlmIChhY3Rpb25DcmVhdG9yKSB7XG4gICAgdHlwZSA9IGFjdGlvbkNyZWF0b3IudHlwZTtcbiAgICBwcmVkaWNhdGUgPSBhY3Rpb25DcmVhdG9yLm1hdGNoO1xuICB9IGVsc2UgaWYgKG1hdGNoZXIpIHtcbiAgICBwcmVkaWNhdGUgPSBtYXRjaGVyO1xuICB9IGVsc2UgaWYgKHByZWRpY2F0ZSkge1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIxKSA6IFwiQ3JlYXRpbmcgb3IgcmVtb3ZpbmcgYSBsaXN0ZW5lciByZXF1aXJlcyBvbmUgb2YgdGhlIGtub3duIGZpZWxkcyBmb3IgbWF0Y2hpbmcgYW4gYWN0aW9uXCIpO1xuICB9XG4gIGFzc2VydEZ1bmN0aW9uKGVmZmVjdCwgXCJvcHRpb25zLmxpc3RlbmVyXCIpO1xuICByZXR1cm4ge1xuICAgIHByZWRpY2F0ZSxcbiAgICB0eXBlLFxuICAgIGVmZmVjdFxuICB9O1xufTtcbnZhciBjcmVhdGVMaXN0ZW5lckVudHJ5ID0gLyogQF9fUFVSRV9fICovIGFzc2lnbigob3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICBwcmVkaWNhdGUsXG4gICAgZWZmZWN0XG4gIH0gPSBnZXRMaXN0ZW5lckVudHJ5UHJvcHNGcm9tKG9wdGlvbnMpO1xuICBjb25zdCBpZCA9IG5hbm9pZCgpO1xuICBjb25zdCBlbnRyeSA9IHtcbiAgICBpZCxcbiAgICBlZmZlY3QsXG4gICAgdHlwZSxcbiAgICBwcmVkaWNhdGUsXG4gICAgcGVuZGluZzogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjIpIDogXCJVbnN1YnNjcmliZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICB9O1xuICByZXR1cm4gZW50cnk7XG59LCB7XG4gIHdpdGhUeXBlczogKCkgPT4gY3JlYXRlTGlzdGVuZXJFbnRyeVxufSk7XG52YXIgY2FuY2VsQWN0aXZlTGlzdGVuZXJzID0gKGVudHJ5KSA9PiB7XG4gIGVudHJ5LnBlbmRpbmcuZm9yRWFjaCgoY29udHJvbGxlcikgPT4ge1xuICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY29udHJvbGxlciwgbGlzdGVuZXJDYW5jZWxsZWQpO1xuICB9KTtcbn07XG52YXIgY3JlYXRlQ2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUgPSAobGlzdGVuZXJNYXApID0+IHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBsaXN0ZW5lck1hcC5mb3JFYWNoKGNhbmNlbEFjdGl2ZUxpc3RlbmVycyk7XG4gICAgbGlzdGVuZXJNYXAuY2xlYXIoKTtcbiAgfTtcbn07XG52YXIgc2FmZWx5Tm90aWZ5RXJyb3IgPSAoZXJyb3JIYW5kbGVyLCBlcnJvclRvTm90aWZ5LCBlcnJvckluZm8pID0+IHtcbiAgdHJ5IHtcbiAgICBlcnJvckhhbmRsZXIoZXJyb3JUb05vdGlmeSwgZXJyb3JJbmZvKTtcbiAgfSBjYXRjaCAoZXJyb3JIYW5kbGVyRXJyb3IpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRocm93IGVycm9ySGFuZGxlckVycm9yO1xuICAgIH0sIDApO1xuICB9XG59O1xudmFyIGFkZExpc3RlbmVyID0gLyogQF9fUFVSRV9fICovIGFzc2lnbigvKiBAX19QVVJFX18gKi8gY3JlYXRlQWN0aW9uKGAke2FsbX0vYWRkYCksIHtcbiAgd2l0aFR5cGVzOiAoKSA9PiBhZGRMaXN0ZW5lclxufSk7XG52YXIgY2xlYXJBbGxMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlQWN0aW9uKGAke2FsbX0vcmVtb3ZlQWxsYCk7XG52YXIgcmVtb3ZlTGlzdGVuZXIgPSAvKiBAX19QVVJFX18gKi8gYXNzaWduKC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBY3Rpb24oYCR7YWxtfS9yZW1vdmVgKSwge1xuICB3aXRoVHlwZXM6ICgpID0+IHJlbW92ZUxpc3RlbmVyXG59KTtcbnZhciBkZWZhdWx0RXJyb3JIYW5kbGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc29sZS5lcnJvcihgJHthbG19L2Vycm9yYCwgLi4uYXJncyk7XG59O1xudmFyIGNyZWF0ZUxpc3RlbmVyTWlkZGxld2FyZSA9IChtaWRkbGV3YXJlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IGxpc3RlbmVyTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3Qge1xuICAgIGV4dHJhLFxuICAgIG9uRXJyb3IgPSBkZWZhdWx0RXJyb3JIYW5kbGVyXG4gIH0gPSBtaWRkbGV3YXJlT3B0aW9ucztcbiAgYXNzZXJ0RnVuY3Rpb24ob25FcnJvciwgXCJvbkVycm9yXCIpO1xuICBjb25zdCBpbnNlcnRFbnRyeSA9IChlbnRyeSkgPT4ge1xuICAgIGVudHJ5LnVuc3Vic2NyaWJlID0gKCkgPT4gbGlzdGVuZXJNYXAuZGVsZXRlKGVudHJ5LmlkKTtcbiAgICBsaXN0ZW5lck1hcC5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICByZXR1cm4gKGNhbmNlbE9wdGlvbnMpID0+IHtcbiAgICAgIGVudHJ5LnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAoY2FuY2VsT3B0aW9ucz8uY2FuY2VsQWN0aXZlKSB7XG4gICAgICAgIGNhbmNlbEFjdGl2ZUxpc3RlbmVycyhlbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgY29uc3Qgc3RhcnRMaXN0ZW5pbmcgPSAob3B0aW9ucykgPT4ge1xuICAgIGxldCBlbnRyeSA9IGZpbmQoQXJyYXkuZnJvbShsaXN0ZW5lck1hcC52YWx1ZXMoKSksIChleGlzdGluZ0VudHJ5KSA9PiBleGlzdGluZ0VudHJ5LmVmZmVjdCA9PT0gb3B0aW9ucy5lZmZlY3QpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIGVudHJ5ID0gY3JlYXRlTGlzdGVuZXJFbnRyeShvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc2VydEVudHJ5KGVudHJ5KTtcbiAgfTtcbiAgYXNzaWduKHN0YXJ0TGlzdGVuaW5nLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBzdGFydExpc3RlbmluZ1xuICB9KTtcbiAgY29uc3Qgc3RvcExpc3RlbmluZyA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZSxcbiAgICAgIGVmZmVjdCxcbiAgICAgIHByZWRpY2F0ZVxuICAgIH0gPSBnZXRMaXN0ZW5lckVudHJ5UHJvcHNGcm9tKG9wdGlvbnMpO1xuICAgIGNvbnN0IGVudHJ5ID0gZmluZChBcnJheS5mcm9tKGxpc3RlbmVyTWFwLnZhbHVlcygpKSwgKGVudHJ5MikgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hQcmVkaWNhdGVPclR5cGUgPSB0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIiA/IGVudHJ5Mi50eXBlID09PSB0eXBlIDogZW50cnkyLnByZWRpY2F0ZSA9PT0gcHJlZGljYXRlO1xuICAgICAgcmV0dXJuIG1hdGNoUHJlZGljYXRlT3JUeXBlICYmIGVudHJ5Mi5lZmZlY3QgPT09IGVmZmVjdDtcbiAgICB9KTtcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGVudHJ5LnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAob3B0aW9ucy5jYW5jZWxBY3RpdmUpIHtcbiAgICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICEhZW50cnk7XG4gIH07XG4gIGFzc2lnbihzdG9wTGlzdGVuaW5nLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBzdG9wTGlzdGVuaW5nXG4gIH0pO1xuICBjb25zdCBub3RpZnlMaXN0ZW5lciA9IGFzeW5jIChlbnRyeSwgYWN0aW9uLCBhcGksIGdldE9yaWdpbmFsU3RhdGUpID0+IHtcbiAgICBjb25zdCBpbnRlcm5hbFRhc2tDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHRha2UgPSBjcmVhdGVUYWtlUGF0dGVybihzdGFydExpc3RlbmluZywgaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpO1xuICAgIGNvbnN0IGF1dG9Kb2luUHJvbWlzZXMgPSBbXTtcbiAgICB0cnkge1xuICAgICAgZW50cnkucGVuZGluZy5hZGQoaW50ZXJuYWxUYXNrQ29udHJvbGxlcik7XG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoZW50cnkuZWZmZWN0KFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIC8vIFVzZSBhc3NpZ24oKSByYXRoZXIgdGhhbiAuLi4gdG8gYXZvaWQgZXh0cmEgaGVscGVyIGZ1bmN0aW9ucyBhZGRlZCB0byBidW5kbGVcbiAgICAgICAgYXNzaWduKHt9LCBhcGksIHtcbiAgICAgICAgICBnZXRPcmlnaW5hbFN0YXRlLFxuICAgICAgICAgIGNvbmRpdGlvbjogKHByZWRpY2F0ZSwgdGltZW91dCkgPT4gdGFrZShwcmVkaWNhdGUsIHRpbWVvdXQpLnRoZW4oQm9vbGVhbiksXG4gICAgICAgICAgdGFrZSxcbiAgICAgICAgICBkZWxheTogY3JlYXRlRGVsYXkoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpLFxuICAgICAgICAgIHBhdXNlOiBjcmVhdGVQYXVzZShpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgICAgZXh0cmEsXG4gICAgICAgICAgc2lnbmFsOiBpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICBmb3JrOiBjcmVhdGVGb3JrKGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsLCBhdXRvSm9pblByb21pc2VzKSxcbiAgICAgICAgICB1bnN1YnNjcmliZTogZW50cnkudW5zdWJzY3JpYmUsXG4gICAgICAgICAgc3Vic2NyaWJlOiAoKSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lck1hcC5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNhbmNlbEFjdGl2ZUxpc3RlbmVyczogKCkgPT4ge1xuICAgICAgICAgICAgZW50cnkucGVuZGluZy5mb3JFYWNoKChjb250cm9sbGVyLCBfLCBzZXQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT09IGludGVybmFsVGFza0NvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGNvbnRyb2xsZXIsIGxpc3RlbmVyQ2FuY2VsbGVkKTtcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNhbmNlbDogKCkgPT4ge1xuICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihpbnRlcm5hbFRhc2tDb250cm9sbGVyLCBsaXN0ZW5lckNhbmNlbGxlZCk7XG4gICAgICAgICAgICBlbnRyeS5wZW5kaW5nLmRlbGV0ZShpbnRlcm5hbFRhc2tDb250cm9sbGVyKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRocm93SWZDYW5jZWxsZWQ6ICgpID0+IHtcbiAgICAgICAgICAgIHZhbGlkYXRlQWN0aXZlKGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9IGNhdGNoIChsaXN0ZW5lckVycm9yKSB7XG4gICAgICBpZiAoIShsaXN0ZW5lckVycm9yIGluc3RhbmNlb2YgVGFza0Fib3J0RXJyb3IpKSB7XG4gICAgICAgIHNhZmVseU5vdGlmeUVycm9yKG9uRXJyb3IsIGxpc3RlbmVyRXJyb3IsIHtcbiAgICAgICAgICByYWlzZWRCeTogXCJlZmZlY3RcIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYXV0b0pvaW5Qcm9taXNlcyk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGludGVybmFsVGFza0NvbnRyb2xsZXIsIGxpc3RlbmVyQ29tcGxldGVkKTtcbiAgICAgIGVudHJ5LnBlbmRpbmcuZGVsZXRlKGludGVybmFsVGFza0NvbnRyb2xsZXIpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgY2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUgPSBjcmVhdGVDbGVhckxpc3RlbmVyTWlkZGxld2FyZShsaXN0ZW5lck1hcCk7XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAoYXBpKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmICghaXNBY3Rpb24zKGFjdGlvbikpIHtcbiAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgfVxuICAgIGlmIChhZGRMaXN0ZW5lci5tYXRjaChhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gc3RhcnRMaXN0ZW5pbmcoYWN0aW9uLnBheWxvYWQpO1xuICAgIH1cbiAgICBpZiAoY2xlYXJBbGxMaXN0ZW5lcnMubWF0Y2goYWN0aW9uKSkge1xuICAgICAgY2xlYXJMaXN0ZW5lck1pZGRsZXdhcmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlbW92ZUxpc3RlbmVyLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIHJldHVybiBzdG9wTGlzdGVuaW5nKGFjdGlvbi5wYXlsb2FkKTtcbiAgICB9XG4gICAgbGV0IG9yaWdpbmFsU3RhdGUgPSBhcGkuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBnZXRPcmlnaW5hbFN0YXRlID0gKCkgPT4ge1xuICAgICAgaWYgKG9yaWdpbmFsU3RhdGUgPT09IElOVEVSTkFMX05JTF9UT0tFTikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyMykgOiBgJHthbG19OiBnZXRPcmlnaW5hbFN0YXRlIGNhbiBvbmx5IGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luYWxTdGF0ZTtcbiAgICB9O1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IG5leHQoYWN0aW9uKTtcbiAgICAgIGlmIChsaXN0ZW5lck1hcC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBhcGkuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJFbnRyaWVzID0gQXJyYXkuZnJvbShsaXN0ZW5lck1hcC52YWx1ZXMoKSk7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgbGlzdGVuZXJFbnRyaWVzKSB7XG4gICAgICAgICAgbGV0IHJ1bkxpc3RlbmVyID0gZmFsc2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJ1bkxpc3RlbmVyID0gZW50cnkucHJlZGljYXRlKGFjdGlvbiwgY3VycmVudFN0YXRlLCBvcmlnaW5hbFN0YXRlKTtcbiAgICAgICAgICB9IGNhdGNoIChwcmVkaWNhdGVFcnJvcikge1xuICAgICAgICAgICAgcnVuTGlzdGVuZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIHNhZmVseU5vdGlmeUVycm9yKG9uRXJyb3IsIHByZWRpY2F0ZUVycm9yLCB7XG4gICAgICAgICAgICAgIHJhaXNlZEJ5OiBcInByZWRpY2F0ZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFydW5MaXN0ZW5lcikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKGVudHJ5LCBhY3Rpb24sIGFwaSwgZ2V0T3JpZ2luYWxTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgb3JpZ2luYWxTdGF0ZSA9IElOVEVSTkFMX05JTF9UT0tFTjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtaWRkbGV3YXJlLFxuICAgIHN0YXJ0TGlzdGVuaW5nLFxuICAgIHN0b3BMaXN0ZW5pbmcsXG4gICAgY2xlYXJMaXN0ZW5lcnM6IGNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlXG4gIH07XG59O1xuXG4vLyBzcmMvZHluYW1pY01pZGRsZXdhcmUvaW5kZXgudHNcbmltcG9ydCB7IGNvbXBvc2UgYXMgY29tcG9zZTMgfSBmcm9tIFwicmVkdXhcIjtcbnZhciBjcmVhdGVNaWRkbGV3YXJlRW50cnkgPSAobWlkZGxld2FyZSkgPT4gKHtcbiAgaWQ6IG5hbm9pZCgpLFxuICBtaWRkbGV3YXJlLFxuICBhcHBsaWVkOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpXG59KTtcbnZhciBtYXRjaEluc3RhbmNlID0gKGluc3RhbmNlSWQpID0+IChhY3Rpb24pID0+IGFjdGlvbj8ubWV0YT8uaW5zdGFuY2VJZCA9PT0gaW5zdGFuY2VJZDtcbnZhciBjcmVhdGVEeW5hbWljTWlkZGxld2FyZSA9ICgpID0+IHtcbiAgY29uc3QgaW5zdGFuY2VJZCA9IG5hbm9pZCgpO1xuICBjb25zdCBtaWRkbGV3YXJlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3Qgd2l0aE1pZGRsZXdhcmUgPSBPYmplY3QuYXNzaWduKGNyZWF0ZUFjdGlvbihcImR5bmFtaWNNaWRkbGV3YXJlL2FkZFwiLCAoLi4ubWlkZGxld2FyZXMpID0+ICh7XG4gICAgcGF5bG9hZDogbWlkZGxld2FyZXMsXG4gICAgbWV0YToge1xuICAgICAgaW5zdGFuY2VJZFxuICAgIH1cbiAgfSkpLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiB3aXRoTWlkZGxld2FyZVxuICB9KTtcbiAgY29uc3QgYWRkTWlkZGxld2FyZSA9IE9iamVjdC5hc3NpZ24oZnVuY3Rpb24gYWRkTWlkZGxld2FyZTIoLi4ubWlkZGxld2FyZXMpIHtcbiAgICBtaWRkbGV3YXJlcy5mb3JFYWNoKChtaWRkbGV3YXJlMikgPT4ge1xuICAgICAgbGV0IGVudHJ5ID0gZmluZChBcnJheS5mcm9tKG1pZGRsZXdhcmVNYXAudmFsdWVzKCkpLCAoZW50cnkyKSA9PiBlbnRyeTIubWlkZGxld2FyZSA9PT0gbWlkZGxld2FyZTIpO1xuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICBlbnRyeSA9IGNyZWF0ZU1pZGRsZXdhcmVFbnRyeShtaWRkbGV3YXJlMik7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlTWFwLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgIH0pO1xuICB9LCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBhZGRNaWRkbGV3YXJlXG4gIH0pO1xuICBjb25zdCBnZXRGaW5hbE1pZGRsZXdhcmUgPSAoYXBpKSA9PiB7XG4gICAgY29uc3QgYXBwbGllZE1pZGRsZXdhcmUgPSBBcnJheS5mcm9tKG1pZGRsZXdhcmVNYXAudmFsdWVzKCkpLm1hcCgoZW50cnkpID0+IGVtcGxhY2UoZW50cnkuYXBwbGllZCwgYXBpLCB7XG4gICAgICBpbnNlcnQ6ICgpID0+IGVudHJ5Lm1pZGRsZXdhcmUoYXBpKVxuICAgIH0pKTtcbiAgICByZXR1cm4gY29tcG9zZTMoLi4uYXBwbGllZE1pZGRsZXdhcmUpO1xuICB9O1xuICBjb25zdCBpc1dpdGhNaWRkbGV3YXJlID0gaXNBbGxPZih3aXRoTWlkZGxld2FyZSwgbWF0Y2hJbnN0YW5jZShpbnN0YW5jZUlkKSk7XG4gIGNvbnN0IG1pZGRsZXdhcmUgPSAoYXBpKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmIChpc1dpdGhNaWRkbGV3YXJlKGFjdGlvbikpIHtcbiAgICAgIGFkZE1pZGRsZXdhcmUoLi4uYWN0aW9uLnBheWxvYWQpO1xuICAgICAgcmV0dXJuIGFwaS5kaXNwYXRjaDtcbiAgICB9XG4gICAgcmV0dXJuIGdldEZpbmFsTWlkZGxld2FyZShhcGkpKG5leHQpKGFjdGlvbik7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWlkZGxld2FyZSxcbiAgICBhZGRNaWRkbGV3YXJlLFxuICAgIHdpdGhNaWRkbGV3YXJlLFxuICAgIGluc3RhbmNlSWRcbiAgfTtcbn07XG5cbi8vIHNyYy9jb21iaW5lU2xpY2VzLnRzXG5pbXBvcnQgeyBjb21iaW5lUmVkdWNlcnMgYXMgY29tYmluZVJlZHVjZXJzMiB9IGZyb20gXCJyZWR1eFwiO1xudmFyIGlzU2xpY2VMaWtlID0gKG1heWJlU2xpY2VMaWtlKSA9PiBcInJlZHVjZXJQYXRoXCIgaW4gbWF5YmVTbGljZUxpa2UgJiYgdHlwZW9mIG1heWJlU2xpY2VMaWtlLnJlZHVjZXJQYXRoID09PSBcInN0cmluZ1wiO1xudmFyIGdldFJlZHVjZXJzID0gKHNsaWNlcykgPT4gc2xpY2VzLmZsYXRNYXAoKHNsaWNlT3JNYXApID0+IGlzU2xpY2VMaWtlKHNsaWNlT3JNYXApID8gW1tzbGljZU9yTWFwLnJlZHVjZXJQYXRoLCBzbGljZU9yTWFwLnJlZHVjZXJdXSA6IE9iamVjdC5lbnRyaWVzKHNsaWNlT3JNYXApKTtcbnZhciBPUklHSU5BTF9TVEFURSA9IFN5bWJvbC5mb3IoXCJydGstc3RhdGUtcHJveHktb3JpZ2luYWxcIik7XG52YXIgaXNTdGF0ZVByb3h5ID0gKHZhbHVlKSA9PiAhIXZhbHVlICYmICEhdmFsdWVbT1JJR0lOQUxfU1RBVEVdO1xudmFyIHN0YXRlUHJveHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBjcmVhdGVTdGF0ZVByb3h5ID0gKHN0YXRlLCByZWR1Y2VyTWFwKSA9PiBlbXBsYWNlKHN0YXRlUHJveHlNYXAsIHN0YXRlLCB7XG4gIGluc2VydDogKCkgPT4gbmV3IFByb3h5KHN0YXRlLCB7XG4gICAgZ2V0OiAodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgPT4ge1xuICAgICAgaWYgKHByb3AgPT09IE9SSUdJTkFMX1NUQVRFKSByZXR1cm4gdGFyZ2V0O1xuICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb25zdCByZWR1Y2VyID0gcmVkdWNlck1hcFtwcm9wLnRvU3RyaW5nKCldO1xuICAgICAgICBpZiAocmVkdWNlcikge1xuICAgICAgICAgIGNvbnN0IHJlZHVjZXJSZXN1bHQgPSByZWR1Y2VyKHZvaWQgMCwge1xuICAgICAgICAgICAgdHlwZTogbmFub2lkKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlZHVjZXJSZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI0KSA6IGBUaGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtwcm9wLnRvU3RyaW5nKCl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gY2FsbGVkIGZvciBzZWxlY3RvcigpLiBJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCB5b3UgY2FuIHVzZSBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVkdWNlclJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0pXG59KTtcbnZhciBvcmlnaW5hbCA9IChzdGF0ZSkgPT4ge1xuICBpZiAoIWlzU3RhdGVQcm94eShzdGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyNSkgOiBcIm9yaWdpbmFsIG11c3QgYmUgdXNlZCBvbiBzdGF0ZSBQcm94eVwiKTtcbiAgfVxuICByZXR1cm4gc3RhdGVbT1JJR0lOQUxfU1RBVEVdO1xufTtcbnZhciBub29wUmVkdWNlciA9IChzdGF0ZSA9IHt9KSA9PiBzdGF0ZTtcbmZ1bmN0aW9uIGNvbWJpbmVTbGljZXMoLi4uc2xpY2VzKSB7XG4gIGNvbnN0IHJlZHVjZXJNYXAgPSBPYmplY3QuZnJvbUVudHJpZXMoZ2V0UmVkdWNlcnMoc2xpY2VzKSk7XG4gIGNvbnN0IGdldFJlZHVjZXIgPSAoKSA9PiBPYmplY3Qua2V5cyhyZWR1Y2VyTWFwKS5sZW5ndGggPyBjb21iaW5lUmVkdWNlcnMyKHJlZHVjZXJNYXApIDogbm9vcFJlZHVjZXI7XG4gIGxldCByZWR1Y2VyID0gZ2V0UmVkdWNlcigpO1xuICBmdW5jdGlvbiBjb21iaW5lZFJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAgIHJldHVybiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICB9XG4gIGNvbWJpbmVkUmVkdWNlci53aXRoTGF6eUxvYWRlZFNsaWNlcyA9ICgpID0+IGNvbWJpbmVkUmVkdWNlcjtcbiAgY29uc3QgaW5qZWN0ID0gKHNsaWNlLCBjb25maWcgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlZHVjZXJQYXRoLFxuICAgICAgcmVkdWNlcjogcmVkdWNlclRvSW5qZWN0XG4gICAgfSA9IHNsaWNlO1xuICAgIGNvbnN0IGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlck1hcFtyZWR1Y2VyUGF0aF07XG4gICAgaWYgKCFjb25maWcub3ZlcnJpZGVFeGlzdGluZyAmJiBjdXJyZW50UmVkdWNlciAmJiBjdXJyZW50UmVkdWNlciAhPT0gcmVkdWNlclRvSW5qZWN0KSB7XG4gICAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBjYWxsZWQgXFxgaW5qZWN0XFxgIHRvIG92ZXJyaWRlIGFscmVhZHktZXhpc3RpbmcgcmVkdWNlciAke3JlZHVjZXJQYXRofSB3aXRob3V0IHNwZWNpZnlpbmcgXFxgb3ZlcnJpZGVFeGlzdGluZzogdHJ1ZVxcYGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWJpbmVkUmVkdWNlcjtcbiAgICB9XG4gICAgcmVkdWNlck1hcFtyZWR1Y2VyUGF0aF0gPSByZWR1Y2VyVG9JbmplY3Q7XG4gICAgcmVkdWNlciA9IGdldFJlZHVjZXIoKTtcbiAgICByZXR1cm4gY29tYmluZWRSZWR1Y2VyO1xuICB9O1xuICBjb25zdCBzZWxlY3RvciA9IE9iamVjdC5hc3NpZ24oZnVuY3Rpb24gbWFrZVNlbGVjdG9yKHNlbGVjdG9yRm4sIHNlbGVjdFN0YXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHNlbGVjdG9yMihzdGF0ZSwgLi4uYXJncykge1xuICAgICAgcmV0dXJuIHNlbGVjdG9yRm4oY3JlYXRlU3RhdGVQcm94eShzZWxlY3RTdGF0ZSA/IHNlbGVjdFN0YXRlKHN0YXRlLCAuLi5hcmdzKSA6IHN0YXRlLCByZWR1Y2VyTWFwKSwgLi4uYXJncyk7XG4gICAgfTtcbiAgfSwge1xuICAgIG9yaWdpbmFsXG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihjb21iaW5lZFJlZHVjZXIsIHtcbiAgICBpbmplY3QsXG4gICAgc2VsZWN0b3JcbiAgfSk7XG59XG5cbi8vIHNyYy9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlLnRzXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIGBNaW5pZmllZCBSZWR1eCBUb29sa2l0IGVycm9yICMke2NvZGV9OyB2aXNpdCBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL0Vycm9ycz9jb2RlPSR7Y29kZX0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycy4gYDtcbn1cbmV4cG9ydCB7XG4gIFJlZHVjZXJUeXBlLFxuICBTSE9VTERfQVVUT0JBVENILFxuICBUYXNrQWJvcnRFcnJvcixcbiAgVHVwbGUsXG4gIGFkZExpc3RlbmVyLFxuICBhc3luY1RodW5rQ3JlYXRvcixcbiAgYXV0b0JhdGNoRW5oYW5jZXIsXG4gIGJ1aWxkQ3JlYXRlU2xpY2UsXG4gIGNsZWFyQWxsTGlzdGVuZXJzLFxuICBjb21iaW5lU2xpY2VzLFxuICBjb25maWd1cmVTdG9yZSxcbiAgY3JlYXRlQWN0aW9uLFxuICBjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZSxcbiAgY3JlYXRlQXN5bmNUaHVuayxcbiAgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IsXG4gIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yQ3JlYXRvcixcbiAgY3JlYXRlRHluYW1pY01pZGRsZXdhcmUsXG4gIGNyZWF0ZUVudGl0eUFkYXB0ZXIsXG4gIGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSxcbiAgY3JlYXRlTGlzdGVuZXJNaWRkbGV3YXJlLFxuICBwcm9kdWNlIGFzIGNyZWF0ZU5leHRTdGF0ZSxcbiAgY3JlYXRlUmVkdWNlcixcbiAgY3JlYXRlU2VsZWN0b3IsXG4gIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcjIgYXMgY3JlYXRlU2VsZWN0b3JDcmVhdG9yLFxuICBjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUsXG4gIGNyZWF0ZVNsaWNlLFxuICBjdXJyZW50MyBhcyBjdXJyZW50LFxuICBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUsXG4gIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UsXG4gIGZyZWV6ZSxcbiAgaXNBY3Rpb25DcmVhdG9yLFxuICBpc0FsbE9mLFxuICBpc0FueU9mLFxuICBpc0FzeW5jVGh1bmtBY3Rpb24sXG4gIGlzRHJhZnQ1IGFzIGlzRHJhZnQsXG4gIGlzRlNBIGFzIGlzRmx1eFN0YW5kYXJkQWN0aW9uLFxuICBpc0Z1bGZpbGxlZCxcbiAgaXNJbW11dGFibGVEZWZhdWx0LFxuICBpc1BlbmRpbmcsXG4gIGlzUGxhaW4sXG4gIGlzUmVqZWN0ZWQsXG4gIGlzUmVqZWN0ZWRXaXRoVmFsdWUsXG4gIGxydU1lbW9pemUsXG4gIG1pbmlTZXJpYWxpemVFcnJvcixcbiAgbmFub2lkLFxuICBvcmlnaW5hbDIgYXMgb3JpZ2luYWwsXG4gIHByZXBhcmVBdXRvQmF0Y2hlZCxcbiAgcmVtb3ZlTGlzdGVuZXIsXG4gIHVud3JhcFJlc3VsdCxcbiAgd2Vha01hcE1lbW9pemUyIGFzIHdlYWtNYXBNZW1vaXplXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVkdXgtdG9vbGtpdC5tb2Rlcm4ubWpzLm1hcCIsImltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgaHR0cEFkYXB0ZXIgZnJvbSAnLi9odHRwLmpzJztcbmltcG9ydCB4aHJBZGFwdGVyIGZyb20gJy4veGhyLmpzJztcbmltcG9ydCBmZXRjaEFkYXB0ZXIgZnJvbSAnLi9mZXRjaC5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5cbmNvbnN0IGtub3duQWRhcHRlcnMgPSB7XG4gIGh0dHA6IGh0dHBBZGFwdGVyLFxuICB4aHI6IHhockFkYXB0ZXIsXG4gIGZldGNoOiBmZXRjaEFkYXB0ZXJcbn1cblxudXRpbHMuZm9yRWFjaChrbm93bkFkYXB0ZXJzLCAoZm4sIHZhbHVlKSA9PiB7XG4gIGlmIChmbikge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge3ZhbHVlfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2FkYXB0ZXJOYW1lJywge3ZhbHVlfSk7XG4gIH1cbn0pO1xuXG5jb25zdCByZW5kZXJSZWFzb24gPSAocmVhc29uKSA9PiBgLSAke3JlYXNvbn1gO1xuXG5jb25zdCBpc1Jlc29sdmVkSGFuZGxlID0gKGFkYXB0ZXIpID0+IHV0aWxzLmlzRnVuY3Rpb24oYWRhcHRlcikgfHwgYWRhcHRlciA9PT0gbnVsbCB8fCBhZGFwdGVyID09PSBmYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBnZXRBZGFwdGVyOiAoYWRhcHRlcnMpID0+IHtcbiAgICBhZGFwdGVycyA9IHV0aWxzLmlzQXJyYXkoYWRhcHRlcnMpID8gYWRhcHRlcnMgOiBbYWRhcHRlcnNdO1xuXG4gICAgY29uc3Qge2xlbmd0aH0gPSBhZGFwdGVycztcbiAgICBsZXQgbmFtZU9yQWRhcHRlcjtcbiAgICBsZXQgYWRhcHRlcjtcblxuICAgIGNvbnN0IHJlamVjdGVkUmVhc29ucyA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbmFtZU9yQWRhcHRlciA9IGFkYXB0ZXJzW2ldO1xuICAgICAgbGV0IGlkO1xuXG4gICAgICBhZGFwdGVyID0gbmFtZU9yQWRhcHRlcjtcblxuICAgICAgaWYgKCFpc1Jlc29sdmVkSGFuZGxlKG5hbWVPckFkYXB0ZXIpKSB7XG4gICAgICAgIGFkYXB0ZXIgPSBrbm93bkFkYXB0ZXJzWyhpZCA9IFN0cmluZyhuYW1lT3JBZGFwdGVyKSkudG9Mb3dlckNhc2UoKV07XG5cbiAgICAgICAgaWYgKGFkYXB0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKGBVbmtub3duIGFkYXB0ZXIgJyR7aWR9J2ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZWplY3RlZFJlYXNvbnNbaWQgfHwgJyMnICsgaV0gPSBhZGFwdGVyO1xuICAgIH1cblxuICAgIGlmICghYWRhcHRlcikge1xuXG4gICAgICBjb25zdCByZWFzb25zID0gT2JqZWN0LmVudHJpZXMocmVqZWN0ZWRSZWFzb25zKVxuICAgICAgICAubWFwKChbaWQsIHN0YXRlXSkgPT4gYGFkYXB0ZXIgJHtpZH0gYCArXG4gICAgICAgICAgKHN0YXRlID09PSBmYWxzZSA/ICdpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBlbnZpcm9ubWVudCcgOiAnaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnVpbGQnKVxuICAgICAgICApO1xuXG4gICAgICBsZXQgcyA9IGxlbmd0aCA/XG4gICAgICAgIChyZWFzb25zLmxlbmd0aCA+IDEgPyAnc2luY2UgOlxcbicgKyByZWFzb25zLm1hcChyZW5kZXJSZWFzb24pLmpvaW4oJ1xcbicpIDogJyAnICsgcmVuZGVyUmVhc29uKHJlYXNvbnNbMF0pKSA6XG4gICAgICAgICdhcyBubyBhZGFwdGVyIHNwZWNpZmllZCc7XG5cbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBgVGhlcmUgaXMgbm8gc3VpdGFibGUgYWRhcHRlciB0byBkaXNwYXRjaCB0aGUgcmVxdWVzdCBgICsgcyxcbiAgICAgICAgJ0VSUl9OT1RfU1VQUE9SVCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkYXB0ZXI7XG4gIH0sXG4gIGFkYXB0ZXJzOiBrbm93bkFkYXB0ZXJzXG59XG4iLCJpbXBvcnQgcGxhdGZvcm0gZnJvbSBcIi4uL3BsYXRmb3JtL2luZGV4LmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5pbXBvcnQgY29tcG9zZVNpZ25hbHMgZnJvbSBcIi4uL2hlbHBlcnMvY29tcG9zZVNpZ25hbHMuanNcIjtcbmltcG9ydCB7dHJhY2tTdHJlYW19IGZyb20gXCIuLi9oZWxwZXJzL3RyYWNrU3RyZWFtLmpzXCI7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuLi9jb3JlL0F4aW9zSGVhZGVycy5qc1wiO1xuaW1wb3J0IHtwcm9ncmVzc0V2ZW50UmVkdWNlciwgcHJvZ3Jlc3NFdmVudERlY29yYXRvciwgYXN5bmNEZWNvcmF0b3J9IGZyb20gXCIuLi9oZWxwZXJzL3Byb2dyZXNzRXZlbnRSZWR1Y2VyLmpzXCI7XG5pbXBvcnQgcmVzb2x2ZUNvbmZpZyBmcm9tIFwiLi4vaGVscGVycy9yZXNvbHZlQ29uZmlnLmpzXCI7XG5pbXBvcnQgc2V0dGxlIGZyb20gXCIuLi9jb3JlL3NldHRsZS5qc1wiO1xuXG5jb25zdCBpc0ZldGNoU3VwcG9ydGVkID0gdHlwZW9mIGZldGNoID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBSZXF1ZXN0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBSZXNwb25zZSA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgPSBpc0ZldGNoU3VwcG9ydGVkICYmIHR5cGVvZiBSZWFkYWJsZVN0cmVhbSA9PT0gJ2Z1bmN0aW9uJztcblxuLy8gdXNlZCBvbmx5IGluc2lkZSB0aGUgZmV0Y2ggYWRhcHRlclxuY29uc3QgZW5jb2RlVGV4dCA9IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgKHR5cGVvZiBUZXh0RW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgKChlbmNvZGVyKSA9PiAoc3RyKSA9PiBlbmNvZGVyLmVuY29kZShzdHIpKShuZXcgVGV4dEVuY29kZXIoKSkgOlxuICAgIGFzeW5jIChzdHIpID0+IG5ldyBVaW50OEFycmF5KGF3YWl0IG5ldyBSZXNwb25zZShzdHIpLmFycmF5QnVmZmVyKCkpXG4pO1xuXG5jb25zdCB0ZXN0ID0gKGZuLCAuLi5hcmdzKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZm4oLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5jb25zdCBzdXBwb3J0c1JlcXVlc3RTdHJlYW0gPSBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkICYmIHRlc3QoKCkgPT4ge1xuICBsZXQgZHVwbGV4QWNjZXNzZWQgPSBmYWxzZTtcblxuICBjb25zdCBoYXNDb250ZW50VHlwZSA9IG5ldyBSZXF1ZXN0KHBsYXRmb3JtLm9yaWdpbiwge1xuICAgIGJvZHk6IG5ldyBSZWFkYWJsZVN0cmVhbSgpLFxuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGdldCBkdXBsZXgoKSB7XG4gICAgICBkdXBsZXhBY2Nlc3NlZCA9IHRydWU7XG4gICAgICByZXR1cm4gJ2hhbGYnO1xuICAgIH0sXG4gIH0pLmhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKTtcblxuICByZXR1cm4gZHVwbGV4QWNjZXNzZWQgJiYgIWhhc0NvbnRlbnRUeXBlO1xufSk7XG5cbmNvbnN0IERFRkFVTFRfQ0hVTktfU0laRSA9IDY0ICogMTAyNDtcblxuY29uc3Qgc3VwcG9ydHNSZXNwb25zZVN0cmVhbSA9IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgJiZcbiAgdGVzdCgoKSA9PiB1dGlscy5pc1JlYWRhYmxlU3RyZWFtKG5ldyBSZXNwb25zZSgnJykuYm9keSkpO1xuXG5cbmNvbnN0IHJlc29sdmVycyA9IHtcbiAgc3RyZWFtOiBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmICgocmVzKSA9PiByZXMuYm9keSlcbn07XG5cbmlzRmV0Y2hTdXBwb3J0ZWQgJiYgKCgocmVzKSA9PiB7XG4gIFsndGV4dCcsICdhcnJheUJ1ZmZlcicsICdibG9iJywgJ2Zvcm1EYXRhJywgJ3N0cmVhbSddLmZvckVhY2godHlwZSA9PiB7XG4gICAgIXJlc29sdmVyc1t0eXBlXSAmJiAocmVzb2x2ZXJzW3R5cGVdID0gdXRpbHMuaXNGdW5jdGlvbihyZXNbdHlwZV0pID8gKHJlcykgPT4gcmVzW3R5cGVdKCkgOlxuICAgICAgKF8sIGNvbmZpZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgUmVzcG9uc2UgdHlwZSAnJHt0eXBlfScgaXMgbm90IHN1cHBvcnRlZGAsIEF4aW9zRXJyb3IuRVJSX05PVF9TVVBQT1JULCBjb25maWcpO1xuICAgICAgfSlcbiAgfSk7XG59KShuZXcgUmVzcG9uc2UpKTtcblxuY29uc3QgZ2V0Qm9keUxlbmd0aCA9IGFzeW5jIChib2R5KSA9PiB7XG4gIGlmIChib2R5ID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmKHV0aWxzLmlzQmxvYihib2R5KSkge1xuICAgIHJldHVybiBib2R5LnNpemU7XG4gIH1cblxuICBpZih1dGlscy5pc1NwZWNDb21wbGlhbnRGb3JtKGJvZHkpKSB7XG4gICAgcmV0dXJuIChhd2FpdCBuZXcgUmVxdWVzdChib2R5KS5hcnJheUJ1ZmZlcigpKS5ieXRlTGVuZ3RoO1xuICB9XG5cbiAgaWYodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkgfHwgdXRpbHMuaXNBcnJheUJ1ZmZlcihib2R5KSkge1xuICAgIHJldHVybiBib2R5LmJ5dGVMZW5ndGg7XG4gIH1cblxuICBpZih1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhib2R5KSkge1xuICAgIGJvZHkgPSBib2R5ICsgJyc7XG4gIH1cblxuICBpZih1dGlscy5pc1N0cmluZyhib2R5KSkge1xuICAgIHJldHVybiAoYXdhaXQgZW5jb2RlVGV4dChib2R5KSkuYnl0ZUxlbmd0aDtcbiAgfVxufVxuXG5jb25zdCByZXNvbHZlQm9keUxlbmd0aCA9IGFzeW5jIChoZWFkZXJzLCBib2R5KSA9PiB7XG4gIGNvbnN0IGxlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICByZXR1cm4gbGVuZ3RoID09IG51bGwgPyBnZXRCb2R5TGVuZ3RoKGJvZHkpIDogbGVuZ3RoO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0ZldGNoU3VwcG9ydGVkICYmIChhc3luYyAoY29uZmlnKSA9PiB7XG4gIGxldCB7XG4gICAgdXJsLFxuICAgIG1ldGhvZCxcbiAgICBkYXRhLFxuICAgIHNpZ25hbCxcbiAgICBjYW5jZWxUb2tlbixcbiAgICB0aW1lb3V0LFxuICAgIG9uRG93bmxvYWRQcm9ncmVzcyxcbiAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgIHJlc3BvbnNlVHlwZSxcbiAgICBoZWFkZXJzLFxuICAgIHdpdGhDcmVkZW50aWFscyA9ICdzYW1lLW9yaWdpbicsXG4gICAgZmV0Y2hPcHRpb25zXG4gIH0gPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG5cbiAgcmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlID8gKHJlc3BvbnNlVHlwZSArICcnKS50b0xvd2VyQ2FzZSgpIDogJ3RleHQnO1xuXG4gIGxldCBbY29tcG9zZWRTaWduYWwsIHN0b3BUaW1lb3V0XSA9IChzaWduYWwgfHwgY2FuY2VsVG9rZW4gfHwgdGltZW91dCkgP1xuICAgIGNvbXBvc2VTaWduYWxzKFtzaWduYWwsIGNhbmNlbFRva2VuXSwgdGltZW91dCkgOiBbXTtcblxuICBsZXQgZmluaXNoZWQsIHJlcXVlc3Q7XG5cbiAgY29uc3Qgb25GaW5pc2ggPSAoKSA9PiB7XG4gICAgIWZpbmlzaGVkICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29tcG9zZWRTaWduYWwgJiYgY29tcG9zZWRTaWduYWwudW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcblxuICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGxldCByZXF1ZXN0Q29udGVudExlbmd0aDtcblxuICB0cnkge1xuICAgIGlmIChcbiAgICAgIG9uVXBsb2FkUHJvZ3Jlc3MgJiYgc3VwcG9ydHNSZXF1ZXN0U3RyZWFtICYmIG1ldGhvZCAhPT0gJ2dldCcgJiYgbWV0aG9kICE9PSAnaGVhZCcgJiZcbiAgICAgIChyZXF1ZXN0Q29udGVudExlbmd0aCA9IGF3YWl0IHJlc29sdmVCb2R5TGVuZ3RoKGhlYWRlcnMsIGRhdGEpKSAhPT0gMFxuICAgICkge1xuICAgICAgbGV0IF9yZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICBkdXBsZXg6IFwiaGFsZlwiXG4gICAgICB9KTtcblxuICAgICAgbGV0IGNvbnRlbnRUeXBlSGVhZGVyO1xuXG4gICAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSAmJiAoY29udGVudFR5cGVIZWFkZXIgPSBfcmVxdWVzdC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVIZWFkZXIpXG4gICAgICB9XG5cbiAgICAgIGlmIChfcmVxdWVzdC5ib2R5KSB7XG4gICAgICAgIGNvbnN0IFtvblByb2dyZXNzLCBmbHVzaF0gPSBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yKFxuICAgICAgICAgIHJlcXVlc3RDb250ZW50TGVuZ3RoLFxuICAgICAgICAgIHByb2dyZXNzRXZlbnRSZWR1Y2VyKGFzeW5jRGVjb3JhdG9yKG9uVXBsb2FkUHJvZ3Jlc3MpKVxuICAgICAgICApO1xuXG4gICAgICAgIGRhdGEgPSB0cmFja1N0cmVhbShfcmVxdWVzdC5ib2R5LCBERUZBVUxUX0NIVU5LX1NJWkUsIG9uUHJvZ3Jlc3MsIGZsdXNoLCBlbmNvZGVUZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXV0aWxzLmlzU3RyaW5nKHdpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHdpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdvbWl0JztcbiAgICB9XG5cbiAgICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgdGhyb3dzIHdoZW4gY3JlZGVudGlhbHMgYXJlIGRlZmluZWRcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkZmxhcmUvd29ya2VyZC9pc3N1ZXMvOTAyXG4gICAgY29uc3QgaXNDcmVkZW50aWFsc1N1cHBvcnRlZCA9IFwiY3JlZGVudGlhbHNcIiBpbiBSZXF1ZXN0LnByb3RvdHlwZTsgXG4gICAgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgLi4uZmV0Y2hPcHRpb25zLFxuICAgICAgc2lnbmFsOiBjb21wb3NlZFNpZ25hbCxcbiAgICAgIG1ldGhvZDogbWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLm5vcm1hbGl6ZSgpLnRvSlNPTigpLFxuICAgICAgYm9keTogZGF0YSxcbiAgICAgIGR1cGxleDogXCJoYWxmXCIsXG4gICAgICBjcmVkZW50aWFsczogaXNDcmVkZW50aWFsc1N1cHBvcnRlZCA/IHdpdGhDcmVkZW50aWFscyA6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG5cbiAgICBjb25zdCBpc1N0cmVhbVJlc3BvbnNlID0gc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAocmVzcG9uc2VUeXBlID09PSAnc3RyZWFtJyB8fCByZXNwb25zZVR5cGUgPT09ICdyZXNwb25zZScpO1xuXG4gICAgaWYgKHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gJiYgKG9uRG93bmxvYWRQcm9ncmVzcyB8fCBpc1N0cmVhbVJlc3BvbnNlKSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuXG4gICAgICBbJ3N0YXR1cycsICdzdGF0dXNUZXh0JywgJ2hlYWRlcnMnXS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICBvcHRpb25zW3Byb3BdID0gcmVzcG9uc2VbcHJvcF07XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2VDb250ZW50TGVuZ3RoID0gdXRpbHMudG9GaW5pdGVOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykpO1xuXG4gICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gb25Eb3dubG9hZFByb2dyZXNzICYmIHByb2dyZXNzRXZlbnREZWNvcmF0b3IoXG4gICAgICAgIHJlc3BvbnNlQ29udGVudExlbmd0aCxcbiAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25Eb3dubG9hZFByb2dyZXNzKSwgdHJ1ZSlcbiAgICAgICkgfHwgW107XG5cbiAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKFxuICAgICAgICB0cmFja1N0cmVhbShyZXNwb25zZS5ib2R5LCBERUZBVUxUX0NIVU5LX1NJWkUsIG9uUHJvZ3Jlc3MsICgpID0+IHtcbiAgICAgICAgICBmbHVzaCAmJiBmbHVzaCgpO1xuICAgICAgICAgIGlzU3RyZWFtUmVzcG9uc2UgJiYgb25GaW5pc2goKTtcbiAgICAgICAgfSwgZW5jb2RlVGV4dCksXG4gICAgICAgIG9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlIHx8ICd0ZXh0JztcblxuICAgIGxldCByZXNwb25zZURhdGEgPSBhd2FpdCByZXNvbHZlcnNbdXRpbHMuZmluZEtleShyZXNvbHZlcnMsIHJlc3BvbnNlVHlwZSkgfHwgJ3RleHQnXShyZXNwb25zZSwgY29uZmlnKTtcblxuICAgICFpc1N0cmVhbVJlc3BvbnNlICYmIG9uRmluaXNoKCk7XG5cbiAgICBzdG9wVGltZW91dCAmJiBzdG9wVGltZW91dCgpO1xuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICBoZWFkZXJzOiBBeGlvc0hlYWRlcnMuZnJvbShyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfSlcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBvbkZpbmlzaCgpO1xuXG4gICAgaWYgKGVyciAmJiBlcnIubmFtZSA9PT0gJ1R5cGVFcnJvcicgJiYgL2ZldGNoL2kudGVzdChlcnIubWVzc2FnZSkpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24oXG4gICAgICAgIG5ldyBBeGlvc0Vycm9yKCdOZXR3b3JrIEVycm9yJywgQXhpb3NFcnJvci5FUlJfTkVUV09SSywgY29uZmlnLCByZXF1ZXN0KSxcbiAgICAgICAge1xuICAgICAgICAgIGNhdXNlOiBlcnIuY2F1c2UgfHwgZXJyXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG5cbiAgICB0aHJvdyBBeGlvc0Vycm9yLmZyb20oZXJyLCBlcnIgJiYgZXJyLmNvZGUsIGNvbmZpZywgcmVxdWVzdCk7XG4gIH1cbn0pO1xuXG5cbiIsImltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBzZXR0bGUgZnJvbSAnLi8uLi9jb3JlL3NldHRsZS5qcyc7XG5pbXBvcnQgdHJhbnNpdGlvbmFsRGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMvdHJhbnNpdGlvbmFsLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tICcuLi9jYW5jZWwvQ2FuY2VsZWRFcnJvci5qcyc7XG5pbXBvcnQgcGFyc2VQcm90b2NvbCBmcm9tICcuLi9oZWxwZXJzL3BhcnNlUHJvdG9jb2wuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSAnLi4vY29yZS9BeGlvc0hlYWRlcnMuanMnO1xuaW1wb3J0IHtwcm9ncmVzc0V2ZW50UmVkdWNlcn0gZnJvbSAnLi4vaGVscGVycy9wcm9ncmVzc0V2ZW50UmVkdWNlci5qcyc7XG5pbXBvcnQgcmVzb2x2ZUNvbmZpZyBmcm9tIFwiLi4vaGVscGVycy9yZXNvbHZlQ29uZmlnLmpzXCI7XG5cbmNvbnN0IGlzWEhSQWRhcHRlclN1cHBvcnRlZCA9IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGlzWEhSQWRhcHRlclN1cHBvcnRlZCAmJiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBkaXNwYXRjaFhoclJlcXVlc3QocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgY29uc3QgX2NvbmZpZyA9IHJlc29sdmVDb25maWcoY29uZmlnKTtcbiAgICBsZXQgcmVxdWVzdERhdGEgPSBfY29uZmlnLmRhdGE7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShfY29uZmlnLmhlYWRlcnMpLm5vcm1hbGl6ZSgpO1xuICAgIGxldCB7cmVzcG9uc2VUeXBlLCBvblVwbG9hZFByb2dyZXNzLCBvbkRvd25sb2FkUHJvZ3Jlc3N9ID0gX2NvbmZpZztcbiAgICBsZXQgb25DYW5jZWxlZDtcbiAgICBsZXQgdXBsb2FkVGhyb3R0bGVkLCBkb3dubG9hZFRocm90dGxlZDtcbiAgICBsZXQgZmx1c2hVcGxvYWQsIGZsdXNoRG93bmxvYWQ7XG5cbiAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgZmx1c2hVcGxvYWQgJiYgZmx1c2hVcGxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG4gICAgICBmbHVzaERvd25sb2FkICYmIGZsdXNoRG93bmxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG5cbiAgICAgIF9jb25maWcuY2FuY2VsVG9rZW4gJiYgX2NvbmZpZy5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShvbkNhbmNlbGVkKTtcblxuICAgICAgX2NvbmZpZy5zaWduYWwgJiYgX2NvbmZpZy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vcGVuKF9jb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIF9jb25maWcudXJsLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gX2NvbmZpZy50aW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gb25sb2FkZW5kKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShcbiAgICAgICAgJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCAmJiByZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gIXJlc3BvbnNlVHlwZSB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyB8fCByZXNwb25zZVR5cGUgPT09ICdqc29uJyA/XG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH07XG5cbiAgICAgIHNldHRsZShmdW5jdGlvbiBfcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgZnVuY3Rpb24gX3JlamVjdChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIHJlc3BvbnNlKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCdvbmxvYWRlbmQnIGluIHJlcXVlc3QpIHtcbiAgICAgIC8vIFVzZSBvbmxvYWRlbmQgaWYgYXZhaWxhYmxlXG4gICAgICByZXF1ZXN0Lm9ubG9hZGVuZCA9IG9ubG9hZGVuZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGlzdGVuIGZvciByZWFkeSBzdGF0ZSB0byBlbXVsYXRlIG9ubG9hZGVuZFxuICAgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVMb2FkKCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QgfHwgcmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHJlcXVlc3QgZXJyb3JlZCBvdXQgYW5kIHdlIGRpZG4ndCBnZXQgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlXG4gICAgICAgIC8vIGhhbmRsZWQgYnkgb25lcnJvciBpbnN0ZWFkXG4gICAgICAgIC8vIFdpdGggb25lIGV4Y2VwdGlvbjogcmVxdWVzdCB0aGF0IHVzaW5nIGZpbGU6IHByb3RvY29sLCBtb3N0IGJyb3dzZXJzXG4gICAgICAgIC8vIHdpbGwgcmV0dXJuIHN0YXR1cyBhcyAwIGV2ZW4gdGhvdWdoIGl0J3MgYSBzdWNjZXNzZnVsIHJlcXVlc3RcbiAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAwICYmICEocmVxdWVzdC5yZXNwb25zZVVSTCAmJiByZXF1ZXN0LnJlc3BvbnNlVVJMLmluZGV4T2YoJ2ZpbGU6JykgPT09IDApKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlYWR5c3RhdGUgaGFuZGxlciBpcyBjYWxsaW5nIGJlZm9yZSBvbmVycm9yIG9yIG9udGltZW91dCBoYW5kbGVycyxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGNhbGwgb25sb2FkZW5kIG9uIHRoZSBuZXh0ICd0aWNrJ1xuICAgICAgICBzZXRUaW1lb3V0KG9ubG9hZGVuZCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBicm93c2VyIHJlcXVlc3QgY2FuY2VsbGF0aW9uIChhcyBvcHBvc2VkIHRvIGEgbWFudWFsIGNhbmNlbGxhdGlvbilcbiAgICByZXF1ZXN0Lm9uYWJvcnQgPSBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignUmVxdWVzdCBhYm9ydGVkJywgQXhpb3NFcnJvci5FQ09OTkFCT1JURUQsIGNvbmZpZywgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuICAgICAgLy8gUmVhbCBlcnJvcnMgYXJlIGhpZGRlbiBmcm9tIHVzIGJ5IHRoZSBicm93c2VyXG4gICAgICAvLyBvbmVycm9yIHNob3VsZCBvbmx5IGZpcmUgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignTmV0d29yayBFcnJvcicsIEF4aW9zRXJyb3IuRVJSX05FVFdPUkssIGNvbmZpZywgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHRpbWVvdXRcbiAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7XG4gICAgICBsZXQgdGltZW91dEVycm9yTWVzc2FnZSA9IF9jb25maWcudGltZW91dCA/ICd0aW1lb3V0IG9mICcgKyBfY29uZmlnLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnIDogJ3RpbWVvdXQgZXhjZWVkZWQnO1xuICAgICAgY29uc3QgdHJhbnNpdGlvbmFsID0gX2NvbmZpZy50cmFuc2l0aW9uYWwgfHwgdHJhbnNpdGlvbmFsRGVmYXVsdHM7XG4gICAgICBpZiAoX2NvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBfY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2U7XG4gICAgICB9XG4gICAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAgIHRpbWVvdXRFcnJvck1lc3NhZ2UsXG4gICAgICAgIHRyYW5zaXRpb25hbC5jbGFyaWZ5VGltZW91dEVycm9yID8gQXhpb3NFcnJvci5FVElNRURPVVQgOiBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgcmVxdWVzdERhdGEgPT09IHVuZGVmaW5lZCAmJiByZXF1ZXN0SGVhZGVycy5zZXRDb250ZW50VHlwZShudWxsKTtcblxuICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG4gICAgaWYgKCdzZXRSZXF1ZXN0SGVhZGVyJyBpbiByZXF1ZXN0KSB7XG4gICAgICB1dGlscy5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLnRvSlNPTigpLCBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHZhbCwga2V5KSB7XG4gICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChfY29uZmlnLndpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFfY29uZmlnLndpdGhDcmVkZW50aWFscztcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKHJlc3BvbnNlVHlwZSAmJiByZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBfY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKG9uRG93bmxvYWRQcm9ncmVzcykge1xuICAgICAgKFtkb3dubG9hZFRocm90dGxlZCwgZmx1c2hEb3dubG9hZF0gPSBwcm9ncmVzc0V2ZW50UmVkdWNlcihvbkRvd25sb2FkUHJvZ3Jlc3MsIHRydWUpKTtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBkb3dubG9hZFRocm90dGxlZCk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAob25VcGxvYWRQcm9ncmVzcyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgKFt1cGxvYWRUaHJvdHRsZWQsIGZsdXNoVXBsb2FkXSA9IHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uVXBsb2FkUHJvZ3Jlc3MpKTtcblxuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCB1cGxvYWRUaHJvdHRsZWQpO1xuXG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZW5kJywgZmx1c2hVcGxvYWQpO1xuICAgIH1cblxuICAgIGlmIChfY29uZmlnLmNhbmNlbFRva2VuIHx8IF9jb25maWcuc2lnbmFsKSB7XG4gICAgICAvLyBIYW5kbGUgY2FuY2VsbGF0aW9uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgb25DYW5jZWxlZCA9IGNhbmNlbCA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoIWNhbmNlbCB8fCBjYW5jZWwudHlwZSA/IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZywgcmVxdWVzdCkgOiBjYW5jZWwpO1xuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgX2NvbmZpZy5jYW5jZWxUb2tlbiAmJiBfY29uZmlnLmNhbmNlbFRva2VuLnN1YnNjcmliZShvbkNhbmNlbGVkKTtcbiAgICAgIGlmIChfY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBfY29uZmlnLnNpZ25hbC5hYm9ydGVkID8gb25DYW5jZWxlZCgpIDogX2NvbmZpZy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm90b2NvbCA9IHBhcnNlUHJvdG9jb2woX2NvbmZpZy51cmwpO1xuXG4gICAgaWYgKHByb3RvY29sICYmIHBsYXRmb3JtLnByb3RvY29scy5pbmRleE9mKHByb3RvY29sKSA9PT0gLTEpIHtcbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJyArIHByb3RvY29sICsgJzonLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgY29uZmlnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgcmVxdWVzdC5zZW5kKHJlcXVlc3REYXRhIHx8IG51bGwpO1xuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IGJpbmQgZnJvbSAnLi9oZWxwZXJzL2JpbmQuanMnO1xuaW1wb3J0IEF4aW9zIGZyb20gJy4vY29yZS9BeGlvcy5qcyc7XG5pbXBvcnQgbWVyZ2VDb25maWcgZnJvbSAnLi9jb3JlL21lcmdlQ29uZmlnLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2RlZmF1bHRzL2luZGV4LmpzJztcbmltcG9ydCBmb3JtRGF0YVRvSlNPTiBmcm9tICcuL2hlbHBlcnMvZm9ybURhdGFUb0pTT04uanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi9jYW5jZWwvQ2FuY2VsZWRFcnJvci5qcyc7XG5pbXBvcnQgQ2FuY2VsVG9rZW4gZnJvbSAnLi9jYW5jZWwvQ2FuY2VsVG9rZW4uanMnO1xuaW1wb3J0IGlzQ2FuY2VsIGZyb20gJy4vY2FuY2VsL2lzQ2FuY2VsLmpzJztcbmltcG9ydCB7VkVSU0lPTn0gZnJvbSAnLi9lbnYvZGF0YS5qcyc7XG5pbXBvcnQgdG9Gb3JtRGF0YSBmcm9tICcuL2hlbHBlcnMvdG9Gb3JtRGF0YS5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgc3ByZWFkIGZyb20gJy4vaGVscGVycy9zcHJlYWQuanMnO1xuaW1wb3J0IGlzQXhpb3NFcnJvciBmcm9tICcuL2hlbHBlcnMvaXNBeGlvc0Vycm9yLmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSBcIi4vY29yZS9BeGlvc0hlYWRlcnMuanNcIjtcbmltcG9ydCBhZGFwdGVycyBmcm9tICcuL2FkYXB0ZXJzL2FkYXB0ZXJzLmpzJztcbmltcG9ydCBIdHRwU3RhdHVzQ29kZSBmcm9tICcuL2hlbHBlcnMvSHR0cFN0YXR1c0NvZGUuanMnO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0Q29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKlxuICogQHJldHVybnMge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShkZWZhdWx0Q29uZmlnKSB7XG4gIGNvbnN0IGNvbnRleHQgPSBuZXcgQXhpb3MoZGVmYXVsdENvbmZpZyk7XG4gIGNvbnN0IGluc3RhbmNlID0gYmluZChBeGlvcy5wcm90b3R5cGUucmVxdWVzdCwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBheGlvcy5wcm90b3R5cGUgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBBeGlvcy5wcm90b3R5cGUsIGNvbnRleHQsIHthbGxPd25LZXlzOiB0cnVlfSk7XG5cbiAgLy8gQ29weSBjb250ZXh0IHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCwgbnVsbCwge2FsbE93bktleXM6IHRydWV9KTtcblxuICAvLyBGYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzXG4gIGluc3RhbmNlLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpbnN0YW5jZUNvbmZpZykge1xuICAgIHJldHVybiBjcmVhdGVJbnN0YW5jZShtZXJnZUNvbmZpZyhkZWZhdWx0Q29uZmlnLCBpbnN0YW5jZUNvbmZpZykpO1xuICB9O1xuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuLy8gQ3JlYXRlIHRoZSBkZWZhdWx0IGluc3RhbmNlIHRvIGJlIGV4cG9ydGVkXG5jb25zdCBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzKTtcblxuLy8gRXhwb3NlIEF4aW9zIGNsYXNzIHRvIGFsbG93IGNsYXNzIGluaGVyaXRhbmNlXG5heGlvcy5BeGlvcyA9IEF4aW9zO1xuXG4vLyBFeHBvc2UgQ2FuY2VsICYgQ2FuY2VsVG9rZW5cbmF4aW9zLkNhbmNlbGVkRXJyb3IgPSBDYW5jZWxlZEVycm9yO1xuYXhpb3MuQ2FuY2VsVG9rZW4gPSBDYW5jZWxUb2tlbjtcbmF4aW9zLmlzQ2FuY2VsID0gaXNDYW5jZWw7XG5heGlvcy5WRVJTSU9OID0gVkVSU0lPTjtcbmF4aW9zLnRvRm9ybURhdGEgPSB0b0Zvcm1EYXRhO1xuXG4vLyBFeHBvc2UgQXhpb3NFcnJvciBjbGFzc1xuYXhpb3MuQXhpb3NFcnJvciA9IEF4aW9zRXJyb3I7XG5cbi8vIGFsaWFzIGZvciBDYW5jZWxlZEVycm9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5heGlvcy5DYW5jZWwgPSBheGlvcy5DYW5jZWxlZEVycm9yO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuXG5heGlvcy5zcHJlYWQgPSBzcHJlYWQ7XG5cbi8vIEV4cG9zZSBpc0F4aW9zRXJyb3JcbmF4aW9zLmlzQXhpb3NFcnJvciA9IGlzQXhpb3NFcnJvcjtcblxuLy8gRXhwb3NlIG1lcmdlQ29uZmlnXG5heGlvcy5tZXJnZUNvbmZpZyA9IG1lcmdlQ29uZmlnO1xuXG5heGlvcy5BeGlvc0hlYWRlcnMgPSBBeGlvc0hlYWRlcnM7XG5cbmF4aW9zLmZvcm1Ub0pTT04gPSB0aGluZyA9PiBmb3JtRGF0YVRvSlNPTih1dGlscy5pc0hUTUxGb3JtKHRoaW5nKSA/IG5ldyBGb3JtRGF0YSh0aGluZykgOiB0aGluZyk7XG5cbmF4aW9zLmdldEFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyO1xuXG5heGlvcy5IdHRwU3RhdHVzQ29kZSA9IEh0dHBTdGF0dXNDb2RlO1xuXG5heGlvcy5kZWZhdWx0ID0gYXhpb3M7XG5cbi8vIHRoaXMgbW9kdWxlIHNob3VsZCBvbmx5IGhhdmUgYSBkZWZhdWx0IGV4cG9ydFxuZXhwb3J0IGRlZmF1bHQgYXhpb3NcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi9DYW5jZWxlZEVycm9yLmpzJztcblxuLyoqXG4gKiBBIGBDYW5jZWxUb2tlbmAgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsVG9rZW59XG4gKi9cbmNsYXNzIENhbmNlbFRva2VuIHtcbiAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVQcm9taXNlO1xuXG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUV4ZWN1dG9yKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHRva2VuID0gdGhpcztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4oY2FuY2VsID0+IHtcbiAgICAgIGlmICghdG9rZW4uX2xpc3RlbmVycykgcmV0dXJuO1xuXG4gICAgICBsZXQgaSA9IHRva2VuLl9saXN0ZW5lcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaS0tID4gMCkge1xuICAgICAgICB0b2tlbi5fbGlzdGVuZXJzW2ldKGNhbmNlbCk7XG4gICAgICB9XG4gICAgICB0b2tlbi5fbGlzdGVuZXJzID0gbnVsbDtcbiAgICB9KTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgdGhpcy5wcm9taXNlLnRoZW4gPSBvbmZ1bGZpbGxlZCA9PiB7XG4gICAgICBsZXQgX3Jlc29sdmU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICB0b2tlbi5zdWJzY3JpYmUocmVzb2x2ZSk7XG4gICAgICAgIF9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIH0pLnRoZW4ob25mdWxmaWxsZWQpO1xuXG4gICAgICBwcm9taXNlLmNhbmNlbCA9IGZ1bmN0aW9uIHJlamVjdCgpIHtcbiAgICAgICAgdG9rZW4udW5zdWJzY3JpYmUoX3Jlc29sdmUpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgICAgIGlmICh0b2tlbi5yZWFzb24pIHtcbiAgICAgICAgLy8gQ2FuY2VsbGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gICAqL1xuICB0aHJvd0lmUmVxdWVzdGVkKCkge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgdGhyb3cgdGhpcy5yZWFzb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aGUgY2FuY2VsIHNpZ25hbFxuICAgKi9cblxuICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIGxpc3RlbmVyKHRoaXMucmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIGZyb20gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgdW5zdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICAgKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICAgKi9cbiAgc3RhdGljIHNvdXJjZSgpIHtcbiAgICBsZXQgY2FuY2VsO1xuICAgIGNvbnN0IHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICAgIGNhbmNlbCA9IGM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuLFxuICAgICAgY2FuY2VsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYW5jZWxUb2tlbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5cbi8qKlxuICogQSBgQ2FuY2VsZWRFcnJvcmAgaXMgYW4gb2JqZWN0IHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGNhbmNlbGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbWVzc2FnZSBUaGUgbWVzc2FnZS5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdD19IHJlcXVlc3QgVGhlIHJlcXVlc3QuXG4gKlxuICogQHJldHVybnMge0NhbmNlbGVkRXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5mdW5jdGlvbiBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgQXhpb3NFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UgPT0gbnVsbCA/ICdjYW5jZWxlZCcgOiBtZXNzYWdlLCBBeGlvc0Vycm9yLkVSUl9DQU5DRUxFRCwgY29uZmlnLCByZXF1ZXN0KTtcbiAgdGhpcy5uYW1lID0gJ0NhbmNlbGVkRXJyb3InO1xufVxuXG51dGlscy5pbmhlcml0cyhDYW5jZWxlZEVycm9yLCBBeGlvc0Vycm9yLCB7XG4gIF9fQ0FOQ0VMX186IHRydWVcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBDYW5jZWxlZEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBidWlsZFVSTCBmcm9tICcuLi9oZWxwZXJzL2J1aWxkVVJMLmpzJztcbmltcG9ydCBJbnRlcmNlcHRvck1hbmFnZXIgZnJvbSAnLi9JbnRlcmNlcHRvck1hbmFnZXIuanMnO1xuaW1wb3J0IGRpc3BhdGNoUmVxdWVzdCBmcm9tICcuL2Rpc3BhdGNoUmVxdWVzdC5qcyc7XG5pbXBvcnQgbWVyZ2VDb25maWcgZnJvbSAnLi9tZXJnZUNvbmZpZy5qcyc7XG5pbXBvcnQgYnVpbGRGdWxsUGF0aCBmcm9tICcuL2J1aWxkRnVsbFBhdGguanMnO1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcuLi9oZWxwZXJzL3ZhbGlkYXRvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4vQXhpb3NIZWFkZXJzLmpzJztcblxuY29uc3QgdmFsaWRhdG9ycyA9IHZhbGlkYXRvci52YWxpZGF0b3JzO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5jbGFzcyBBeGlvcyB7XG4gIGNvbnN0cnVjdG9yKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IGluc3RhbmNlQ29uZmlnO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpLFxuICAgICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gY29uZmlnT3JVcmwgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxuICAgKiBAcGFyYW0gez9PYmplY3R9IGNvbmZpZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gICAqL1xuICBhc3luYyByZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgbGV0IGR1bW15O1xuXG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID8gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZHVtbXkgPSB7fSkgOiAoZHVtbXkgPSBuZXcgRXJyb3IoKSk7XG5cbiAgICAgICAgLy8gc2xpY2Ugb2ZmIHRoZSBFcnJvcjogLi4uIGxpbmVcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBkdW1teS5zdGFjayA/IGR1bW15LnN0YWNrLnJlcGxhY2UoL14uK1xcbi8sICcnKSA6ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghZXJyLnN0YWNrKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgICAgIC8vIG1hdGNoIHdpdGhvdXQgdGhlIDIgdG9wIHN0YWNrIGxpbmVzXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFjayAmJiAhU3RyaW5nKGVyci5zdGFjaykuZW5kc1dpdGgoc3RhY2sucmVwbGFjZSgvXi4rXFxuLitcXG4vLCAnJykpKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgKz0gJ1xcbicgKyBzdGFja1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGUgY2FzZSB3aGVyZSBcInN0YWNrXCIgaXMgYW4gdW4td3JpdGFibGUgcHJvcGVydHlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgICBpZiAodHlwZW9mIGNvbmZpZ09yVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgY29uZmlnLnVybCA9IGNvbmZpZ09yVXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcgPSBjb25maWdPclVybCB8fCB7fTtcbiAgICB9XG5cbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuXG4gICAgY29uc3Qge3RyYW5zaXRpb25hbCwgcGFyYW1zU2VyaWFsaXplciwgaGVhZGVyc30gPSBjb25maWc7XG5cbiAgICBpZiAodHJhbnNpdGlvbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHRyYW5zaXRpb25hbCwge1xuICAgICAgICBzaWxlbnRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgZm9yY2VkSlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbilcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zU2VyaWFsaXplciAhPSBudWxsKSB7XG4gICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJhbXNTZXJpYWxpemVyKSkge1xuICAgICAgICBjb25maWcucGFyYW1zU2VyaWFsaXplciA9IHtcbiAgICAgICAgICBzZXJpYWxpemU6IHBhcmFtc1NlcmlhbGl6ZXJcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnMocGFyYW1zU2VyaWFsaXplciwge1xuICAgICAgICAgIGVuY29kZTogdmFsaWRhdG9ycy5mdW5jdGlvbixcbiAgICAgICAgICBzZXJpYWxpemU6IHZhbGlkYXRvcnMuZnVuY3Rpb25cbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGNvbmZpZy5tZXRob2RcbiAgICBjb25maWcubWV0aG9kID0gKGNvbmZpZy5tZXRob2QgfHwgdGhpcy5kZWZhdWx0cy5tZXRob2QgfHwgJ2dldCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBGbGF0dGVuIGhlYWRlcnNcbiAgICBsZXQgY29udGV4dEhlYWRlcnMgPSBoZWFkZXJzICYmIHV0aWxzLm1lcmdlKFxuICAgICAgaGVhZGVycy5jb21tb24sXG4gICAgICBoZWFkZXJzW2NvbmZpZy5tZXRob2RdXG4gICAgKTtcblxuICAgIGhlYWRlcnMgJiYgdXRpbHMuZm9yRWFjaChcbiAgICAgIFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ2NvbW1vbiddLFxuICAgICAgKG1ldGhvZCkgPT4ge1xuICAgICAgICBkZWxldGUgaGVhZGVyc1ttZXRob2RdO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5jb25jYXQoY29udGV4dEhlYWRlcnMsIGhlYWRlcnMpO1xuXG4gICAgLy8gZmlsdGVyIG91dCBza2lwcGVkIGludGVyY2VwdG9yc1xuICAgIGNvbnN0IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgbGV0IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHRydWU7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICBpZiAodHlwZW9mIGludGVyY2VwdG9yLnJ1bldoZW4gPT09ICdmdW5jdGlvbicgJiYgaW50ZXJjZXB0b3IucnVuV2hlbihjb25maWcpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvci5zeW5jaHJvbm91cztcblxuICAgICAgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbiA9IFtdO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gcHVzaFJlc3BvbnNlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgICByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4ucHVzaChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgICB9KTtcblxuICAgIGxldCBwcm9taXNlO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgbGVuO1xuXG4gICAgaWYgKCFzeW5jaHJvbm91c1JlcXVlc3RJbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN0IGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdC5iaW5kKHRoaXMpLCB1bmRlZmluZWRdO1xuICAgICAgY2hhaW4udW5zaGlmdC5hcHBseShjaGFpbiwgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4pO1xuICAgICAgY2hhaW4ucHVzaC5hcHBseShjaGFpbiwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluKTtcbiAgICAgIGxlbiA9IGNoYWluLmxlbmd0aDtcblxuICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjb25maWcpO1xuXG4gICAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNoYWluW2krK10sIGNoYWluW2krK10pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICBsZW4gPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5sZW5ndGg7XG5cbiAgICBsZXQgbmV3Q29uZmlnID0gY29uZmlnO1xuXG4gICAgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgY29uc3Qgb25GdWxmaWxsZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbltpKytdO1xuICAgICAgY29uc3Qgb25SZWplY3RlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICB0cnkge1xuICAgICAgICBuZXdDb25maWcgPSBvbkZ1bGZpbGxlZChuZXdDb25maWcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgb25SZWplY3RlZC5jYWxsKHRoaXMsIGVycm9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2UgPSBkaXNwYXRjaFJlcXVlc3QuY2FsbCh0aGlzLCBuZXdDb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cblxuICAgIGkgPSAwO1xuICAgIGxlbiA9IHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluW2krK10pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgZ2V0VXJpKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcbiAgICByZXR1cm4gYnVpbGRVUkwoZnVsbFBhdGgsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcbiAgfVxufVxuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIGRhdGE6IChjb25maWcgfHwge30pLmRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cblxuICBmdW5jdGlvbiBnZW5lcmF0ZUhUVFBNZXRob2QoaXNGb3JtKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGh0dHBNZXRob2QodXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogaXNGb3JtID8ge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSdcbiAgICAgICAgfSA6IHt9LFxuICAgICAgICB1cmwsXG4gICAgICAgIGRhdGFcbiAgICAgIH0pKTtcbiAgICB9O1xuICB9XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBnZW5lcmF0ZUhUVFBNZXRob2QoKTtcblxuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kICsgJ0Zvcm0nXSA9IGdlbmVyYXRlSFRUUE1ldGhvZCh0cnVlKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvcztcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtjb25maWddIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdH0gW3JlcXVlc3RdIFRoZSByZXF1ZXN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIEF4aW9zRXJyb3IobWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xuICB9XG5cbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgdGhpcy5uYW1lID0gJ0F4aW9zRXJyb3InO1xuICBjb2RlICYmICh0aGlzLmNvZGUgPSBjb2RlKTtcbiAgY29uZmlnICYmICh0aGlzLmNvbmZpZyA9IGNvbmZpZyk7XG4gIHJlcXVlc3QgJiYgKHRoaXMucmVxdWVzdCA9IHJlcXVlc3QpO1xuICBpZiAocmVzcG9uc2UpIHtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXMgPyByZXNwb25zZS5zdGF0dXMgOiBudWxsO1xuICB9XG59XG5cbnV0aWxzLmluaGVyaXRzKEF4aW9zRXJyb3IsIEVycm9yLCB7XG4gIHRvSlNPTjogZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBTdGFuZGFyZFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgLy8gTWljcm9zb2Z0XG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIG51bWJlcjogdGhpcy5udW1iZXIsXG4gICAgICAvLyBNb3ppbGxhXG4gICAgICBmaWxlTmFtZTogdGhpcy5maWxlTmFtZSxcbiAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcbiAgICAgIGNvbHVtbk51bWJlcjogdGhpcy5jb2x1bW5OdW1iZXIsXG4gICAgICBzdGFjazogdGhpcy5zdGFjayxcbiAgICAgIC8vIEF4aW9zXG4gICAgICBjb25maWc6IHV0aWxzLnRvSlNPTk9iamVjdCh0aGlzLmNvbmZpZyksXG4gICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzXG4gICAgfTtcbiAgfVxufSk7XG5cbmNvbnN0IHByb3RvdHlwZSA9IEF4aW9zRXJyb3IucHJvdG90eXBlO1xuY29uc3QgZGVzY3JpcHRvcnMgPSB7fTtcblxuW1xuICAnRVJSX0JBRF9PUFRJT05fVkFMVUUnLFxuICAnRVJSX0JBRF9PUFRJT04nLFxuICAnRUNPTk5BQk9SVEVEJyxcbiAgJ0VUSU1FRE9VVCcsXG4gICdFUlJfTkVUV09SSycsXG4gICdFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTJyxcbiAgJ0VSUl9ERVBSRUNBVEVEJyxcbiAgJ0VSUl9CQURfUkVTUE9OU0UnLFxuICAnRVJSX0JBRF9SRVFVRVNUJyxcbiAgJ0VSUl9DQU5DRUxFRCcsXG4gICdFUlJfTk9UX1NVUFBPUlQnLFxuICAnRVJSX0lOVkFMSURfVVJMJ1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbl0uZm9yRWFjaChjb2RlID0+IHtcbiAgZGVzY3JpcHRvcnNbY29kZV0gPSB7dmFsdWU6IGNvZGV9O1xufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEF4aW9zRXJyb3IsIGRlc2NyaXB0b3JzKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUsICdpc0F4aW9zRXJyb3InLCB7dmFsdWU6IHRydWV9KTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbkF4aW9zRXJyb3IuZnJvbSA9IChlcnJvciwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSwgY3VzdG9tUHJvcHMpID0+IHtcbiAgY29uc3QgYXhpb3NFcnJvciA9IE9iamVjdC5jcmVhdGUocHJvdG90eXBlKTtcblxuICB1dGlscy50b0ZsYXRPYmplY3QoZXJyb3IsIGF4aW9zRXJyb3IsIGZ1bmN0aW9uIGZpbHRlcihvYmopIHtcbiAgICByZXR1cm4gb2JqICE9PSBFcnJvci5wcm90b3R5cGU7XG4gIH0sIHByb3AgPT4ge1xuICAgIHJldHVybiBwcm9wICE9PSAnaXNBeGlvc0Vycm9yJztcbiAgfSk7XG5cbiAgQXhpb3NFcnJvci5jYWxsKGF4aW9zRXJyb3IsIGVycm9yLm1lc3NhZ2UsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UpO1xuXG4gIGF4aW9zRXJyb3IuY2F1c2UgPSBlcnJvcjtcblxuICBheGlvc0Vycm9yLm5hbWUgPSBlcnJvci5uYW1lO1xuXG4gIGN1c3RvbVByb3BzICYmIE9iamVjdC5hc3NpZ24oYXhpb3NFcnJvciwgY3VzdG9tUHJvcHMpO1xuXG4gIHJldHVybiBheGlvc0Vycm9yO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3NFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBwYXJzZUhlYWRlcnMgZnJvbSAnLi4vaGVscGVycy9wYXJzZUhlYWRlcnMuanMnO1xuXG5jb25zdCAkaW50ZXJuYWxzID0gU3ltYm9sKCdpbnRlcm5hbHMnKTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyKGhlYWRlcikge1xuICByZXR1cm4gaGVhZGVyICYmIFN0cmluZyhoZWFkZXIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdXRpbHMuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAobm9ybWFsaXplVmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUb2tlbnMoc3RyKSB7XG4gIGNvbnN0IHRva2VucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGNvbnN0IHRva2Vuc1JFID0gLyhbXlxccyw7PV0rKVxccyooPzo9XFxzKihbXiw7XSspKT8vZztcbiAgbGV0IG1hdGNoO1xuXG4gIHdoaWxlICgobWF0Y2ggPSB0b2tlbnNSRS5leGVjKHN0cikpKSB7XG4gICAgdG9rZW5zW21hdGNoWzFdXSA9IG1hdGNoWzJdO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuY29uc3QgaXNWYWxpZEhlYWRlck5hbWUgPSAoc3RyKSA9PiAvXlstX2EtekEtWjAtOV5gfH4sISMkJSYnKisuXSskLy50ZXN0KHN0ci50cmltKCkpO1xuXG5mdW5jdGlvbiBtYXRjaEhlYWRlclZhbHVlKGNvbnRleHQsIHZhbHVlLCBoZWFkZXIsIGZpbHRlciwgaXNIZWFkZXJOYW1lRmlsdGVyKSB7XG4gIGlmICh1dGlscy5pc0Z1bmN0aW9uKGZpbHRlcikpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcywgdmFsdWUsIGhlYWRlcik7XG4gIH1cblxuICBpZiAoaXNIZWFkZXJOYW1lRmlsdGVyKSB7XG4gICAgdmFsdWUgPSBoZWFkZXI7XG4gIH1cblxuICBpZiAoIXV0aWxzLmlzU3RyaW5nKHZhbHVlKSkgcmV0dXJuO1xuXG4gIGlmICh1dGlscy5pc1N0cmluZyhmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmluZGV4T2YoZmlsdGVyKSAhPT0gLTE7XG4gIH1cblxuICBpZiAodXRpbHMuaXNSZWdFeHAoZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIudGVzdCh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0SGVhZGVyKGhlYWRlcikge1xuICByZXR1cm4gaGVhZGVyLnRyaW0oKVxuICAgIC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyhbYS16XFxkXSkoXFx3KikvZywgKHcsIGNoYXIsIHN0cikgPT4ge1xuICAgICAgcmV0dXJuIGNoYXIudG9VcHBlckNhc2UoKSArIHN0cjtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBY2Nlc3NvcnMob2JqLCBoZWFkZXIpIHtcbiAgY29uc3QgYWNjZXNzb3JOYW1lID0gdXRpbHMudG9DYW1lbENhc2UoJyAnICsgaGVhZGVyKTtcblxuICBbJ2dldCcsICdzZXQnLCAnaGFzJ10uZm9yRWFjaChtZXRob2ROYW1lID0+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBtZXRob2ROYW1lICsgYWNjZXNzb3JOYW1lLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24oYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgICByZXR1cm4gdGhpc1ttZXRob2ROYW1lXS5jYWxsKHRoaXMsIGhlYWRlciwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xufVxuXG5jbGFzcyBBeGlvc0hlYWRlcnMge1xuICBjb25zdHJ1Y3RvcihoZWFkZXJzKSB7XG4gICAgaGVhZGVycyAmJiB0aGlzLnNldChoZWFkZXJzKTtcbiAgfVxuXG4gIHNldChoZWFkZXIsIHZhbHVlT3JSZXdyaXRlLCByZXdyaXRlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFsSGVhZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaGVhZGVyIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleShzZWxmLCBsSGVhZGVyKTtcblxuICAgICAgaWYoIWtleSB8fCBzZWxmW2tleV0gPT09IHVuZGVmaW5lZCB8fCBfcmV3cml0ZSA9PT0gdHJ1ZSB8fCAoX3Jld3JpdGUgPT09IHVuZGVmaW5lZCAmJiBzZWxmW2tleV0gIT09IGZhbHNlKSkge1xuICAgICAgICBzZWxmW2tleSB8fCBfaGVhZGVyXSA9IG5vcm1hbGl6ZVZhbHVlKF92YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0SGVhZGVycyA9IChoZWFkZXJzLCBfcmV3cml0ZSkgPT5cbiAgICAgIHV0aWxzLmZvckVhY2goaGVhZGVycywgKF92YWx1ZSwgX2hlYWRlcikgPT4gc2V0SGVhZGVyKF92YWx1ZSwgX2hlYWRlciwgX3Jld3JpdGUpKTtcblxuICAgIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KGhlYWRlcikgfHwgaGVhZGVyIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcikge1xuICAgICAgc2V0SGVhZGVycyhoZWFkZXIsIHZhbHVlT3JSZXdyaXRlKVxuICAgIH0gZWxzZSBpZih1dGlscy5pc1N0cmluZyhoZWFkZXIpICYmIChoZWFkZXIgPSBoZWFkZXIudHJpbSgpKSAmJiAhaXNWYWxpZEhlYWRlck5hbWUoaGVhZGVyKSkge1xuICAgICAgc2V0SGVhZGVycyhwYXJzZUhlYWRlcnMoaGVhZGVyKSwgdmFsdWVPclJld3JpdGUpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNIZWFkZXJzKGhlYWRlcikpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGhlYWRlci5lbnRyaWVzKCkpIHtcbiAgICAgICAgc2V0SGVhZGVyKHZhbHVlLCBrZXksIHJld3JpdGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXIgIT0gbnVsbCAmJiBzZXRIZWFkZXIodmFsdWVPclJld3JpdGUsIGhlYWRlciwgcmV3cml0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXQoaGVhZGVyLCBwYXJzZXIpIHtcbiAgICBoZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoaGVhZGVyKTtcblxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkodGhpcywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XTtcblxuICAgICAgICBpZiAoIXBhcnNlcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJzZXIgPT09IHRydWUpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VUb2tlbnModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzRnVuY3Rpb24ocGFyc2VyKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZXIuY2FsbCh0aGlzLCB2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscy5pc1JlZ0V4cChwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5leGVjKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhcnNlciBtdXN0IGJlIGJvb2xlYW58cmVnZXhwfGZ1bmN0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFzKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICByZXR1cm4gISEoa2V5ICYmIHRoaXNba2V5XSAhPT0gdW5kZWZpbmVkICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHRoaXMsIHRoaXNba2V5XSwga2V5LCBtYXRjaGVyKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGRlbGV0ZShoZWFkZXIsIG1hdGNoZXIpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gZGVsZXRlSGVhZGVyKF9oZWFkZXIpIHtcbiAgICAgIF9oZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmIChfaGVhZGVyKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkoc2VsZiwgX2hlYWRlcik7XG5cbiAgICAgICAgaWYgKGtleSAmJiAoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZShzZWxmLCBzZWxmW2tleV0sIGtleSwgbWF0Y2hlcikpKSB7XG4gICAgICAgICAgZGVsZXRlIHNlbGZba2V5XTtcblxuICAgICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQXJyYXkoaGVhZGVyKSkge1xuICAgICAgaGVhZGVyLmZvckVhY2goZGVsZXRlSGVhZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlSGVhZGVyKGhlYWRlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBjbGVhcihtYXRjaGVyKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpO1xuICAgIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZighbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHRoaXMsIHRoaXNba2V5XSwga2V5LCBtYXRjaGVyLCB0cnVlKSkge1xuICAgICAgICBkZWxldGUgdGhpc1trZXldO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIG5vcm1hbGl6ZShmb3JtYXQpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBoZWFkZXJzID0ge307XG5cbiAgICB1dGlscy5mb3JFYWNoKHRoaXMsICh2YWx1ZSwgaGVhZGVyKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KGhlYWRlcnMsIGhlYWRlcik7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgc2VsZltrZXldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICAgICAgICBkZWxldGUgc2VsZltoZWFkZXJdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmb3JtYXQgPyBmb3JtYXRIZWFkZXIoaGVhZGVyKSA6IFN0cmluZyhoZWFkZXIpLnRyaW0oKTtcblxuICAgICAgaWYgKG5vcm1hbGl6ZWQgIT09IGhlYWRlcikge1xuICAgICAgICBkZWxldGUgc2VsZltoZWFkZXJdO1xuICAgICAgfVxuXG4gICAgICBzZWxmW25vcm1hbGl6ZWRdID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuXG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWRdID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29uY2F0KC4uLnRhcmdldHMpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb25jYXQodGhpcywgLi4udGFyZ2V0cyk7XG4gIH1cblxuICB0b0pTT04oYXNTdHJpbmdzKSB7XG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHV0aWxzLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09IGZhbHNlICYmIChvYmpbaGVhZGVyXSA9IGFzU3RyaW5ncyAmJiB1dGlscy5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmpvaW4oJywgJykgOiB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKS5tYXAoKFtoZWFkZXIsIHZhbHVlXSkgPT4gaGVhZGVyICsgJzogJyArIHZhbHVlKS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0F4aW9zSGVhZGVycyc7XG4gIH1cblxuICBzdGF0aWMgZnJvbSh0aGluZykge1xuICAgIHJldHVybiB0aGluZyBpbnN0YW5jZW9mIHRoaXMgPyB0aGluZyA6IG5ldyB0aGlzKHRoaW5nKTtcbiAgfVxuXG4gIHN0YXRpYyBjb25jYXQoZmlyc3QsIC4uLnRhcmdldHMpIHtcbiAgICBjb25zdCBjb21wdXRlZCA9IG5ldyB0aGlzKGZpcnN0KTtcblxuICAgIHRhcmdldHMuZm9yRWFjaCgodGFyZ2V0KSA9PiBjb21wdXRlZC5zZXQodGFyZ2V0KSk7XG5cbiAgICByZXR1cm4gY29tcHV0ZWQ7XG4gIH1cblxuICBzdGF0aWMgYWNjZXNzb3IoaGVhZGVyKSB7XG4gICAgY29uc3QgaW50ZXJuYWxzID0gdGhpc1skaW50ZXJuYWxzXSA9ICh0aGlzWyRpbnRlcm5hbHNdID0ge1xuICAgICAgYWNjZXNzb3JzOiB7fVxuICAgIH0pO1xuXG4gICAgY29uc3QgYWNjZXNzb3JzID0gaW50ZXJuYWxzLmFjY2Vzc29ycztcbiAgICBjb25zdCBwcm90b3R5cGUgPSB0aGlzLnByb3RvdHlwZTtcblxuICAgIGZ1bmN0aW9uIGRlZmluZUFjY2Vzc29yKF9oZWFkZXIpIHtcbiAgICAgIGNvbnN0IGxIZWFkZXIgPSBub3JtYWxpemVIZWFkZXIoX2hlYWRlcik7XG5cbiAgICAgIGlmICghYWNjZXNzb3JzW2xIZWFkZXJdKSB7XG4gICAgICAgIGJ1aWxkQWNjZXNzb3JzKHByb3RvdHlwZSwgX2hlYWRlcik7XG4gICAgICAgIGFjY2Vzc29yc1tsSGVhZGVyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXRpbHMuaXNBcnJheShoZWFkZXIpID8gaGVhZGVyLmZvckVhY2goZGVmaW5lQWNjZXNzb3IpIDogZGVmaW5lQWNjZXNzb3IoaGVhZGVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbkF4aW9zSGVhZGVycy5hY2Nlc3NvcihbJ0NvbnRlbnQtVHlwZScsICdDb250ZW50LUxlbmd0aCcsICdBY2NlcHQnLCAnQWNjZXB0LUVuY29kaW5nJywgJ1VzZXItQWdlbnQnLCAnQXV0aG9yaXphdGlvbiddKTtcblxuLy8gcmVzZXJ2ZWQgbmFtZXMgaG90Zml4XG51dGlscy5yZWR1Y2VEZXNjcmlwdG9ycyhBeGlvc0hlYWRlcnMucHJvdG90eXBlLCAoe3ZhbHVlfSwga2V5KSA9PiB7XG4gIGxldCBtYXBwZWQgPSBrZXlbMF0udG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKTsgLy8gbWFwIGBzZXRgID0+IGBTZXRgXG4gIHJldHVybiB7XG4gICAgZ2V0OiAoKSA9PiB2YWx1ZSxcbiAgICBzZXQoaGVhZGVyVmFsdWUpIHtcbiAgICAgIHRoaXNbbWFwcGVkXSA9IGhlYWRlclZhbHVlO1xuICAgIH1cbiAgfVxufSk7XG5cbnV0aWxzLmZyZWV6ZU1ldGhvZHMoQXhpb3NIZWFkZXJzKTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3NIZWFkZXJzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbmNsYXNzIEludGVyY2VwdG9yTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICAgKi9cbiAgdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmhhbmRsZXJzLnB1c2goe1xuICAgICAgZnVsZmlsbGVkLFxuICAgICAgcmVqZWN0ZWQsXG4gICAgICBzeW5jaHJvbm91czogb3B0aW9ucyA/IG9wdGlvbnMuc3luY2hyb25vdXMgOiBmYWxzZSxcbiAgICAgIHJ1bldoZW46IG9wdGlvbnMgPyBvcHRpb25zLnJ1bldoZW4gOiBudWxsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICAgKlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBpbnRlcmNlcHRvciB3YXMgcmVtb3ZlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG4gIGVqZWN0KGlkKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBpbnRlcmNlcHRvcnMgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVycykge1xuICAgICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICAgKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmb3JFYWNoKGZuKSB7XG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgICBmbihoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcmNlcHRvck1hbmFnZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBpc0Fic29sdXRlVVJMIGZyb20gJy4uL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcyc7XG5pbXBvcnQgY29tYmluZVVSTHMgZnJvbSAnLi4vaGVscGVycy9jb21iaW5lVVJMcy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBiYXNlVVJMIHdpdGggdGhlIHJlcXVlc3RlZFVSTCxcbiAqIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVkVVJMIGlzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTC5cbiAqIElmIHRoZSByZXF1ZXN0VVJMIGlzIGFic29sdXRlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVlc3RlZFVSTCB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdGVkVVJMIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBjb21iaW5lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIGZ1bGwgcGF0aFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZEZ1bGxQYXRoKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCkge1xuICBpZiAoYmFzZVVSTCAmJiAhaXNBYnNvbHV0ZVVSTChyZXF1ZXN0ZWRVUkwpKSB7XG4gICAgcmV0dXJuIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCk7XG4gIH1cbiAgcmV0dXJuIHJlcXVlc3RlZFVSTDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHRyYW5zZm9ybURhdGEgZnJvbSAnLi90cmFuc2Zvcm1EYXRhLmpzJztcbmltcG9ydCBpc0NhbmNlbCBmcm9tICcuLi9jYW5jZWwvaXNDYW5jZWwuanMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2RlZmF1bHRzL2luZGV4LmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4uL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSAnLi4vY29yZS9BeGlvc0hlYWRlcnMuanMnO1xuaW1wb3J0IGFkYXB0ZXJzIGZyb20gXCIuLi9hZGFwdGVycy9hZGFwdGVycy5qc1wiO1xuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKSB7XG4gIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICBjb25maWcuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5zaWduYWwgJiYgY29uZmlnLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IENhbmNlbGVkRXJyb3IobnVsbCwgY29uZmlnKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdChjb25maWcpIHtcbiAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gIGNvbmZpZy5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oY29uZmlnLmhlYWRlcnMpO1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgY29uZmlnLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgaWYgKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXS5pbmRleE9mKGNvbmZpZy5tZXRob2QpICE9PSAtMSkge1xuICAgIGNvbmZpZy5oZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLCBmYWxzZSk7XG4gIH1cblxuICBjb25zdCBhZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcihjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cy5hZGFwdGVyKTtcblxuICByZXR1cm4gYWRhcHRlcihjb25maWcpLnRoZW4oZnVuY3Rpb24gb25BZGFwdGVyUmVzb2x1dGlvbihyZXNwb25zZSkge1xuICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgcmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgIGNvbmZpZyxcbiAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZSxcbiAgICAgIHJlc3BvbnNlXG4gICAgKTtcblxuICAgIHJlc3BvbnNlLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShyZXNwb25zZS5oZWFkZXJzKTtcblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSwgZnVuY3Rpb24gb25BZGFwdGVyUmVqZWN0aW9uKHJlYXNvbikge1xuICAgIGlmICghaXNDYW5jZWwocmVhc29uKSkge1xuICAgICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgICAgaWYgKHJlYXNvbiAmJiByZWFzb24ucmVzcG9uc2UpIHtcbiAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZSxcbiAgICAgICAgICByZWFzb24ucmVzcG9uc2VcbiAgICAgICAgKTtcbiAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShyZWFzb24ucmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi9BeGlvc0hlYWRlcnMuanNcIjtcblxuY29uc3QgaGVhZGVyc1RvT2JqZWN0ID0gKHRoaW5nKSA9PiB0aGluZyBpbnN0YW5jZW9mIEF4aW9zSGVhZGVycyA/IHsgLi4udGhpbmcgfSA6IHRoaW5nO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBOZXcgb2JqZWN0IHJlc3VsdGluZyBmcm9tIG1lcmdpbmcgY29uZmlnMiB0byBjb25maWcxXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQ29uZmlnKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGNvbmZpZzIgPSBjb25maWcyIHx8IHt9O1xuICBjb25zdCBjb25maWcgPSB7fTtcblxuICBmdW5jdGlvbiBnZXRNZXJnZWRWYWx1ZSh0YXJnZXQsIHNvdXJjZSwgY2FzZWxlc3MpIHtcbiAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdCh0YXJnZXQpICYmIHV0aWxzLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHV0aWxzLm1lcmdlLmNhbGwoe2Nhc2VsZXNzfSwgdGFyZ2V0LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2Uoe30sIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURlZXBQcm9wZXJ0aWVzKGEsIGIsIGNhc2VsZXNzKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIsIGNhc2VsZXNzKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChhKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSwgY2FzZWxlc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiB2YWx1ZUZyb21Db25maWcyKGEsIGIpIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gZGVmYXVsdFRvQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURpcmVjdEtleXMoYSwgYiwgcHJvcCkge1xuICAgIGlmIChwcm9wIGluIGNvbmZpZzIpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiKTtcbiAgICB9IGVsc2UgaWYgKHByb3AgaW4gY29uZmlnMSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWVyZ2VNYXAgPSB7XG4gICAgdXJsOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIG1ldGhvZDogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBkYXRhOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGJhc2VVUkw6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNmb3JtUmVxdWVzdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBwYXJhbXNTZXJpYWxpemVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRpbWVvdXQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dE1lc3NhZ2U6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aENyZWRlbnRpYWxzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHdpdGhYU1JGVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgYWRhcHRlcjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZVR5cGU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgeHNyZkNvb2tpZU5hbWU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgeHNyZkhlYWRlck5hbWU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgb25VcGxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgZGVjb21wcmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBtYXhDb250ZW50TGVuZ3RoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heEJvZHlMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgYmVmb3JlUmVkaXJlY3Q6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNwb3J0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBBZ2VudDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBodHRwc0FnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGNhbmNlbFRva2VuOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHNvY2tldFBhdGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcmVzcG9uc2VFbmNvZGluZzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB2YWxpZGF0ZVN0YXR1czogbWVyZ2VEaXJlY3RLZXlzLFxuICAgIGhlYWRlcnM6IChhLCBiKSA9PiBtZXJnZURlZXBQcm9wZXJ0aWVzKGhlYWRlcnNUb09iamVjdChhKSwgaGVhZGVyc1RvT2JqZWN0KGIpLCB0cnVlKVxuICB9O1xuXG4gIHV0aWxzLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnMSwgY29uZmlnMikpLCBmdW5jdGlvbiBjb21wdXRlQ29uZmlnVmFsdWUocHJvcCkge1xuICAgIGNvbnN0IG1lcmdlID0gbWVyZ2VNYXBbcHJvcF0gfHwgbWVyZ2VEZWVwUHJvcGVydGllcztcbiAgICBjb25zdCBjb25maWdWYWx1ZSA9IG1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0sIHByb3ApO1xuICAgICh1dGlscy5pc1VuZGVmaW5lZChjb25maWdWYWx1ZSkgJiYgbWVyZ2UgIT09IG1lcmdlRGlyZWN0S2V5cykgfHwgKGNvbmZpZ1twcm9wXSA9IGNvbmZpZ1ZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi9BeGlvc0Vycm9yLmpzJztcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBUaGUgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IHZhbGlkYXRlU3RhdHVzID0gcmVzcG9uc2UuY29uZmlnLnZhbGlkYXRlU3RhdHVzO1xuICBpZiAoIXJlc3BvbnNlLnN0YXR1cyB8fCAhdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICBbQXhpb3NFcnJvci5FUlJfQkFEX1JFUVVFU1QsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihyZXNwb25zZS5zdGF0dXMgLyAxMDApIC0gNF0sXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7P09iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShmbnMsIHJlc3BvbnNlKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHRoaXMgfHwgZGVmYXVsdHM7XG4gIGNvbnN0IGNvbnRleHQgPSByZXNwb25zZSB8fCBjb25maWc7XG4gIGNvbnN0IGhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShjb250ZXh0LmhlYWRlcnMpO1xuICBsZXQgZGF0YSA9IGNvbnRleHQuZGF0YTtcblxuICB1dGlscy5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuLmNhbGwoY29uZmlnLCBkYXRhLCBoZWFkZXJzLm5vcm1hbGl6ZSgpLCByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGhlYWRlcnMubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIGRhdGE7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHRyYW5zaXRpb25hbERlZmF1bHRzIGZyb20gJy4vdHJhbnNpdGlvbmFsLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4uL2hlbHBlcnMvdG9Gb3JtRGF0YS5qcyc7XG5pbXBvcnQgdG9VUkxFbmNvZGVkRm9ybSBmcm9tICcuLi9oZWxwZXJzL3RvVVJMRW5jb2RlZEZvcm0uanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcbmltcG9ydCBmb3JtRGF0YVRvSlNPTiBmcm9tICcuLi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzJztcblxuLyoqXG4gKiBJdCB0YWtlcyBhIHN0cmluZywgdHJpZXMgdG8gcGFyc2UgaXQsIGFuZCBpZiBpdCBmYWlscywgaXQgcmV0dXJucyB0aGUgc3RyaW5naWZpZWQgdmVyc2lvblxuICogb2YgdGhlIGlucHV0XG4gKlxuICogQHBhcmFtIHthbnl9IHJhd1ZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHN0cmluZ2lmaWVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyc2VyIC0gQSBmdW5jdGlvbiB0aGF0IHBhcnNlcyBhIHN0cmluZyBpbnRvIGEgSmF2YVNjcmlwdCBvYmplY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmNvZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgdmFsdWUgYW5kIHJldHVybnMgYSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gQSBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIHRoZSByYXdWYWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5U2FmZWx5KHJhd1ZhbHVlLCBwYXJzZXIsIGVuY29kZXIpIHtcbiAgaWYgKHV0aWxzLmlzU3RyaW5nKHJhd1ZhbHVlKSkge1xuICAgIHRyeSB7XG4gICAgICAocGFyc2VyIHx8IEpTT04ucGFyc2UpKHJhd1ZhbHVlKTtcbiAgICAgIHJldHVybiB1dGlscy50cmltKHJhd1ZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5uYW1lICE9PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChlbmNvZGVyIHx8IEpTT04uc3RyaW5naWZ5KShyYXdWYWx1ZSk7XG59XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuXG4gIHRyYW5zaXRpb25hbDogdHJhbnNpdGlvbmFsRGVmYXVsdHMsXG5cbiAgYWRhcHRlcjogWyd4aHInLCAnaHR0cCcsICdmZXRjaCddLFxuXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKSB8fCAnJztcbiAgICBjb25zdCBoYXNKU09OQ29udGVudFR5cGUgPSBjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi9qc29uJykgPiAtMTtcbiAgICBjb25zdCBpc09iamVjdFBheWxvYWQgPSB1dGlscy5pc09iamVjdChkYXRhKTtcblxuICAgIGlmIChpc09iamVjdFBheWxvYWQgJiYgdXRpbHMuaXNIVE1MRm9ybShkYXRhKSkge1xuICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0Zvcm1EYXRhID0gdXRpbHMuaXNGb3JtRGF0YShkYXRhKTtcblxuICAgIGlmIChpc0Zvcm1EYXRhKSB7XG4gICAgICByZXR1cm4gaGFzSlNPTkNvbnRlbnRUeXBlID8gSlNPTi5zdHJpbmdpZnkoZm9ybURhdGFUb0pTT04oZGF0YSkpIDogZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzU3RyZWFtKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0ZpbGUoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQmxvYihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNSZWFkYWJsZVN0cmVhbShkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04JywgZmFsc2UpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBsZXQgaXNGaWxlTGlzdDtcblxuICAgIGlmIChpc09iamVjdFBheWxvYWQpIHtcbiAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIHRoaXMuZm9ybVNlcmlhbGl6ZXIpLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoaXNGaWxlTGlzdCA9IHV0aWxzLmlzRmlsZUxpc3QoZGF0YSkpIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoJ211bHRpcGFydC9mb3JtLWRhdGEnKSA+IC0xKSB7XG4gICAgICAgIGNvbnN0IF9Gb3JtRGF0YSA9IHRoaXMuZW52ICYmIHRoaXMuZW52LkZvcm1EYXRhO1xuXG4gICAgICAgIHJldHVybiB0b0Zvcm1EYXRhKFxuICAgICAgICAgIGlzRmlsZUxpc3QgPyB7J2ZpbGVzW10nOiBkYXRhfSA6IGRhdGEsXG4gICAgICAgICAgX0Zvcm1EYXRhICYmIG5ldyBfRm9ybURhdGEoKSxcbiAgICAgICAgICB0aGlzLmZvcm1TZXJpYWxpemVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCB8fCBoYXNKU09OQ29udGVudFR5cGUgKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi9qc29uJywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmeVNhZmVseShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgY29uc3QgdHJhbnNpdGlvbmFsID0gdGhpcy50cmFuc2l0aW9uYWwgfHwgZGVmYXVsdHMudHJhbnNpdGlvbmFsO1xuICAgIGNvbnN0IGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcbiAgICBjb25zdCBKU09OUmVxdWVzdGVkID0gdGhpcy5yZXNwb25zZVR5cGUgPT09ICdqc29uJztcblxuICAgIGlmICh1dGlscy5pc1Jlc3BvbnNlKGRhdGEpIHx8IHV0aWxzLmlzUmVhZGFibGVTdHJlYW0oZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGlmIChkYXRhICYmIHV0aWxzLmlzU3RyaW5nKGRhdGEpICYmICgoZm9yY2VkSlNPTlBhcnNpbmcgJiYgIXRoaXMucmVzcG9uc2VUeXBlKSB8fCBKU09OUmVxdWVzdGVkKSkge1xuICAgICAgY29uc3Qgc2lsZW50SlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLnNpbGVudEpTT05QYXJzaW5nO1xuICAgICAgY29uc3Qgc3RyaWN0SlNPTlBhcnNpbmcgPSAhc2lsZW50SlNPTlBhcnNpbmcgJiYgSlNPTlJlcXVlc3RlZDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChzdHJpY3RKU09OUGFyc2luZykge1xuICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0UsIHRoaXMsIG51bGwsIHRoaXMucmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIC8qKlxuICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFib3J0IGEgcmVxdWVzdC4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGFcbiAgICogdGltZW91dCBpcyBub3QgY3JlYXRlZC5cbiAgICovXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxuICBtYXhCb2R5TGVuZ3RoOiAtMSxcblxuICBlbnY6IHtcbiAgICBGb3JtRGF0YTogcGxhdGZvcm0uY2xhc3Nlcy5Gb3JtRGF0YSxcbiAgICBCbG9iOiBwbGF0Zm9ybS5jbGFzc2VzLkJsb2JcbiAgfSxcblxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xuICB9LFxuXG4gIGhlYWRlcnM6IHtcbiAgICBjb21tb246IHtcbiAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyxcbiAgICAgICdDb250ZW50LVR5cGUnOiB1bmRlZmluZWRcbiAgICB9XG4gIH1cbn07XG5cbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgKG1ldGhvZCkgPT4ge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB7fTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0cztcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzaWxlbnRKU09OUGFyc2luZzogdHJ1ZSxcbiAgZm9yY2VkSlNPTlBhcnNpbmc6IHRydWUsXG4gIGNsYXJpZnlUaW1lb3V0RXJyb3I6IGZhbHNlXG59O1xuIiwiZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIjEuNy41XCI7IiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdG9Gb3JtRGF0YSBmcm9tICcuL3RvRm9ybURhdGEuanMnO1xuXG4vKipcbiAqIEl0IGVuY29kZXMgYSBzdHJpbmcgYnkgcmVwbGFjaW5nIGFsbCBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBpbiB0aGUgdW5yZXNlcnZlZCBzZXQgd2l0aFxuICogdGhlaXIgcGVyY2VudC1lbmNvZGVkIGVxdWl2YWxlbnRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBzdHJpbmcgdG8gZW5jb2RlLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlbmNvZGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlKHN0cikge1xuICBjb25zdCBjaGFyTWFwID0ge1xuICAgICchJzogJyUyMScsXG4gICAgXCInXCI6ICclMjcnLFxuICAgICcoJzogJyUyOCcsXG4gICAgJyknOiAnJTI5JyxcbiAgICAnfic6ICclN0UnLFxuICAgICclMjAnOiAnKycsXG4gICAgJyUwMCc6ICdcXHgwMCdcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpfl18JTIwfCUwMC9nLCBmdW5jdGlvbiByZXBsYWNlcihtYXRjaCkge1xuICAgIHJldHVybiBjaGFyTWFwW21hdGNoXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXJhbXMgb2JqZWN0IGFuZCBjb252ZXJ0cyBpdCB0byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gYmUgY29udmVydGVkIHRvIGEgRm9ybURhdGEgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0IHBhc3NlZCB0byB0aGUgQXhpb3MgY29uc3RydWN0b3IuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIEF4aW9zVVJMU2VhcmNoUGFyYW1zKHBhcmFtcywgb3B0aW9ucykge1xuICB0aGlzLl9wYWlycyA9IFtdO1xuXG4gIHBhcmFtcyAmJiB0b0Zvcm1EYXRhKHBhcmFtcywgdGhpcywgb3B0aW9ucyk7XG59XG5cbmNvbnN0IHByb3RvdHlwZSA9IEF4aW9zVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcblxucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZChuYW1lLCB2YWx1ZSkge1xuICB0aGlzLl9wYWlycy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xufTtcblxucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoZW5jb2Rlcikge1xuICBjb25zdCBfZW5jb2RlID0gZW5jb2RlciA/IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVuY29kZXIuY2FsbCh0aGlzLCB2YWx1ZSwgZW5jb2RlKTtcbiAgfSA6IGVuY29kZTtcblxuICByZXR1cm4gdGhpcy5fcGFpcnMubWFwKGZ1bmN0aW9uIGVhY2gocGFpcikge1xuICAgIHJldHVybiBfZW5jb2RlKHBhaXJbMF0pICsgJz0nICsgX2VuY29kZShwYWlyWzFdKTtcbiAgfSwgJycpLmpvaW4oJyYnKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEF4aW9zVVJMU2VhcmNoUGFyYW1zO1xuIiwiY29uc3QgSHR0cFN0YXR1c0NvZGUgPSB7XG4gIENvbnRpbnVlOiAxMDAsXG4gIFN3aXRjaGluZ1Byb3RvY29sczogMTAxLFxuICBQcm9jZXNzaW5nOiAxMDIsXG4gIEVhcmx5SGludHM6IDEwMyxcbiAgT2s6IDIwMCxcbiAgQ3JlYXRlZDogMjAxLFxuICBBY2NlcHRlZDogMjAyLFxuICBOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb246IDIwMyxcbiAgTm9Db250ZW50OiAyMDQsXG4gIFJlc2V0Q29udGVudDogMjA1LFxuICBQYXJ0aWFsQ29udGVudDogMjA2LFxuICBNdWx0aVN0YXR1czogMjA3LFxuICBBbHJlYWR5UmVwb3J0ZWQ6IDIwOCxcbiAgSW1Vc2VkOiAyMjYsXG4gIE11bHRpcGxlQ2hvaWNlczogMzAwLFxuICBNb3ZlZFBlcm1hbmVudGx5OiAzMDEsXG4gIEZvdW5kOiAzMDIsXG4gIFNlZU90aGVyOiAzMDMsXG4gIE5vdE1vZGlmaWVkOiAzMDQsXG4gIFVzZVByb3h5OiAzMDUsXG4gIFVudXNlZDogMzA2LFxuICBUZW1wb3JhcnlSZWRpcmVjdDogMzA3LFxuICBQZXJtYW5lbnRSZWRpcmVjdDogMzA4LFxuICBCYWRSZXF1ZXN0OiA0MDAsXG4gIFVuYXV0aG9yaXplZDogNDAxLFxuICBQYXltZW50UmVxdWlyZWQ6IDQwMixcbiAgRm9yYmlkZGVuOiA0MDMsXG4gIE5vdEZvdW5kOiA0MDQsXG4gIE1ldGhvZE5vdEFsbG93ZWQ6IDQwNSxcbiAgTm90QWNjZXB0YWJsZTogNDA2LFxuICBQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6IDQwNyxcbiAgUmVxdWVzdFRpbWVvdXQ6IDQwOCxcbiAgQ29uZmxpY3Q6IDQwOSxcbiAgR29uZTogNDEwLFxuICBMZW5ndGhSZXF1aXJlZDogNDExLFxuICBQcmVjb25kaXRpb25GYWlsZWQ6IDQxMixcbiAgUGF5bG9hZFRvb0xhcmdlOiA0MTMsXG4gIFVyaVRvb0xvbmc6IDQxNCxcbiAgVW5zdXBwb3J0ZWRNZWRpYVR5cGU6IDQxNSxcbiAgUmFuZ2VOb3RTYXRpc2ZpYWJsZTogNDE2LFxuICBFeHBlY3RhdGlvbkZhaWxlZDogNDE3LFxuICBJbUFUZWFwb3Q6IDQxOCxcbiAgTWlzZGlyZWN0ZWRSZXF1ZXN0OiA0MjEsXG4gIFVucHJvY2Vzc2FibGVFbnRpdHk6IDQyMixcbiAgTG9ja2VkOiA0MjMsXG4gIEZhaWxlZERlcGVuZGVuY3k6IDQyNCxcbiAgVG9vRWFybHk6IDQyNSxcbiAgVXBncmFkZVJlcXVpcmVkOiA0MjYsXG4gIFByZWNvbmRpdGlvblJlcXVpcmVkOiA0MjgsXG4gIFRvb01hbnlSZXF1ZXN0czogNDI5LFxuICBSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6IDQzMSxcbiAgVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnM6IDQ1MSxcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvcjogNTAwLFxuICBOb3RJbXBsZW1lbnRlZDogNTAxLFxuICBCYWRHYXRld2F5OiA1MDIsXG4gIFNlcnZpY2VVbmF2YWlsYWJsZTogNTAzLFxuICBHYXRld2F5VGltZW91dDogNTA0LFxuICBIdHRwVmVyc2lvbk5vdFN1cHBvcnRlZDogNTA1LFxuICBWYXJpYW50QWxzb05lZ290aWF0ZXM6IDUwNixcbiAgSW5zdWZmaWNpZW50U3RvcmFnZTogNTA3LFxuICBMb29wRGV0ZWN0ZWQ6IDUwOCxcbiAgTm90RXh0ZW5kZWQ6IDUxMCxcbiAgTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6IDUxMSxcbn07XG5cbk9iamVjdC5lbnRyaWVzKEh0dHBTdGF0dXNDb2RlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgSHR0cFN0YXR1c0NvZGVbdmFsdWVdID0ga2V5O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEh0dHBTdGF0dXNDb2RlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKCkge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmd1bWVudHMpO1xuICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4uL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMnO1xuXG4vKipcbiAqIEl0IHJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGNoYXJhY3RlcnMgYDpgLCBgJGAsIGAsYCwgYCtgLCBgW2AsIGFuZCBgXWAgd2l0aCB0aGVpclxuICogVVJJIGVuY29kZWQgY291bnRlcnBhcnRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCBUaGUgdmFsdWUgdG8gYmUgZW5jb2RlZC5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEBwYXJhbSB7P29iamVjdH0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkVVJMKHVybCwgcGFyYW1zLCBvcHRpb25zKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICBpZiAoIXBhcmFtcykge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgXG4gIGNvbnN0IF9lbmNvZGUgPSBvcHRpb25zICYmIG9wdGlvbnMuZW5jb2RlIHx8IGVuY29kZTtcblxuICBjb25zdCBzZXJpYWxpemVGbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5zZXJpYWxpemU7XG5cbiAgbGV0IHNlcmlhbGl6ZWRQYXJhbXM7XG5cbiAgaWYgKHNlcmlhbGl6ZUZuKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHNlcmlhbGl6ZUZuKHBhcmFtcywgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKHBhcmFtcykgP1xuICAgICAgcGFyYW1zLnRvU3RyaW5nKCkgOlxuICAgICAgbmV3IEF4aW9zVVJMU2VhcmNoUGFyYW1zKHBhcmFtcywgb3B0aW9ucykudG9TdHJpbmcoX2VuY29kZSk7XG4gIH1cblxuICBpZiAoc2VyaWFsaXplZFBhcmFtcykge1xuICAgIGNvbnN0IGhhc2htYXJrSW5kZXggPSB1cmwuaW5kZXhPZihcIiNcIik7XG5cbiAgICBpZiAoaGFzaG1hcmtJbmRleCAhPT0gLTEpIHtcbiAgICAgIHVybCA9IHVybC5zbGljZSgwLCBoYXNobWFya0luZGV4KTtcbiAgICB9XG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIHNwZWNpZmllZCBVUkxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVVUkwgVGhlIHJlbGF0aXZlIFVSTFxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXG4gICAgPyBiYXNlVVJMLnJlcGxhY2UoL1xcLz9cXC8kLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICA6IGJhc2VVUkw7XG59XG4iLCJpbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tIFwiLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanNcIjtcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gXCIuLi9jb3JlL0F4aW9zRXJyb3IuanNcIjtcblxuY29uc3QgY29tcG9zZVNpZ25hbHMgPSAoc2lnbmFscywgdGltZW91dCkgPT4ge1xuICBsZXQgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBsZXQgYWJvcnRlZDtcblxuICBjb25zdCBvbmFib3J0ID0gZnVuY3Rpb24gKGNhbmNlbCkge1xuICAgIGlmICghYWJvcnRlZCkge1xuICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgY29uc3QgZXJyID0gY2FuY2VsIGluc3RhbmNlb2YgRXJyb3IgPyBjYW5jZWwgOiB0aGlzLnJlYXNvbjtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZXJyIGluc3RhbmNlb2YgQXhpb3NFcnJvciA/IGVyciA6IG5ldyBDYW5jZWxlZEVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnIpKTtcbiAgICB9XG4gIH1cblxuICBsZXQgdGltZXIgPSB0aW1lb3V0ICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIG9uYWJvcnQobmV3IEF4aW9zRXJyb3IoYHRpbWVvdXQgJHt0aW1lb3V0fSBvZiBtcyBleGNlZWRlZGAsIEF4aW9zRXJyb3IuRVRJTUVET1VUKSlcbiAgfSwgdGltZW91dClcblxuICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICBpZiAoc2lnbmFscykge1xuICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgIHNpZ25hbHMuZm9yRWFjaChzaWduYWwgPT4ge1xuICAgICAgICBzaWduYWwgJiZcbiAgICAgICAgKHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyID8gc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCkgOiBzaWduYWwudW5zdWJzY3JpYmUob25hYm9ydCkpO1xuICAgICAgfSk7XG4gICAgICBzaWduYWxzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4gc2lnbmFsICYmIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICYmIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uYWJvcnQpKTtcblxuICBjb25zdCB7c2lnbmFsfSA9IGNvbnRyb2xsZXI7XG5cbiAgc2lnbmFsLnVuc3Vic2NyaWJlID0gdW5zdWJzY3JpYmU7XG5cbiAgcmV0dXJuIFtzaWduYWwsICgpID0+IHtcbiAgICB0aW1lciAmJiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIHRpbWVyID0gbnVsbDtcbiAgfV07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvc2VTaWduYWxzO1xuIiwiaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52ID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgc3VwcG9ydCBkb2N1bWVudC5jb29raWVcbiAge1xuICAgIHdyaXRlKG5hbWUsIHZhbHVlLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZSkge1xuICAgICAgY29uc3QgY29va2llID0gW25hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpXTtcblxuICAgICAgdXRpbHMuaXNOdW1iZXIoZXhwaXJlcykgJiYgY29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuXG4gICAgICB1dGlscy5pc1N0cmluZyhwYXRoKSAmJiBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG5cbiAgICAgIHV0aWxzLmlzU3RyaW5nKGRvbWFpbikgJiYgY29va2llLnB1c2goJ2RvbWFpbj0nICsgZG9tYWluKTtcblxuICAgICAgc2VjdXJlID09PSB0cnVlICYmIGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcblxuICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XG4gICAgfSxcblxuICAgIHJlYWQobmFtZSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58O1xcXFxzKikoJyArIG5hbWUgKyAnKT0oW147XSopJykpO1xuICAgICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcbiAgICB9LFxuXG4gICAgcmVtb3ZlKG5hbWUpIHtcbiAgICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG4gICAgfVxuICB9XG5cbiAgOlxuXG4gIC8vIE5vbi1zdGFuZGFyZCBicm93c2VyIGVudiAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAge1xuICAgIHdyaXRlKCkge30sXG4gICAgcmVhZCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcmVtb3ZlKCkge31cbiAgfTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nIGxpa2UgYGZvb1t4XVt5XVt6XWAgYW5kIHJldHVybnMgYW4gYXJyYXkgbGlrZSBgWydmb28nLCAneCcsICd5JywgJ3onXVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5mdW5jdGlvbiBwYXJzZVByb3BQYXRoKG5hbWUpIHtcbiAgLy8gZm9vW3hdW3ldW3pdXG4gIC8vIGZvby54LnkuelxuICAvLyBmb28teC15LXpcbiAgLy8gZm9vIHggeSB6XG4gIHJldHVybiB1dGlscy5tYXRjaEFsbCgvXFx3K3xcXFsoXFx3KildL2csIG5hbWUpLm1hcChtYXRjaCA9PiB7XG4gICAgcmV0dXJuIG1hdGNoWzBdID09PSAnW10nID8gJycgOiBtYXRjaFsxXSB8fCBtYXRjaFswXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBhcnJheSB0byBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY29udmVydCB0byBhbiBvYmplY3QuXG4gKlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzIGFzIHRoZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlUb09iamVjdChhcnIpIHtcbiAgY29uc3Qgb2JqID0ge307XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcnIpO1xuICBsZXQgaTtcbiAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGg7XG4gIGxldCBrZXk7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGtleSA9IGtleXNbaV07XG4gICAgb2JqW2tleV0gPSBhcnJba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgRm9ybURhdGEgb2JqZWN0IGFuZCByZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgVGhlIEZvcm1EYXRhIG9iamVjdCB0byBjb252ZXJ0IHRvIEpTT04uXG4gKlxuICogQHJldHVybnMge09iamVjdDxzdHJpbmcsIGFueT4gfCBudWxsfSBUaGUgY29udmVydGVkIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZm9ybURhdGFUb0pTT04oZm9ybURhdGEpIHtcbiAgZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXQsIGluZGV4KSB7XG4gICAgbGV0IG5hbWUgPSBwYXRoW2luZGV4KytdO1xuXG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGlzTnVtZXJpY0tleSA9IE51bWJlci5pc0Zpbml0ZSgrbmFtZSk7XG4gICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPj0gcGF0aC5sZW5ndGg7XG4gICAgbmFtZSA9ICFuYW1lICYmIHV0aWxzLmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5sZW5ndGggOiBuYW1lO1xuXG4gICAgaWYgKGlzTGFzdCkge1xuICAgICAgaWYgKHV0aWxzLmhhc093blByb3AodGFyZ2V0LCBuYW1lKSkge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSBbdGFyZ2V0W25hbWVdLCB2YWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRbbmFtZV0gfHwgIXV0aWxzLmlzT2JqZWN0KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0W25hbWVdLCBpbmRleCk7XG5cbiAgICBpZiAocmVzdWx0ICYmIHV0aWxzLmlzQXJyYXkodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gYXJyYXlUb09iamVjdCh0YXJnZXRbbmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICB9XG5cbiAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZm9ybURhdGEpICYmIHV0aWxzLmlzRnVuY3Rpb24oZm9ybURhdGEuZW50cmllcykpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcblxuICAgIHV0aWxzLmZvckVhY2hFbnRyeShmb3JtRGF0YSwgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBidWlsZFBhdGgocGFyc2VQcm9wUGF0aChuYW1lKSwgdmFsdWUsIG9iaiwgMCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZvcm1EYXRhVG9KU09OO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zXG4gKlxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNBeGlvc0Vycm9yKHBheWxvYWQpIHtcbiAgcmV0dXJuIHV0aWxzLmlzT2JqZWN0KHBheWxvYWQpICYmIChwYXlsb2FkLmlzQXhpb3NFcnJvciA9PT0gdHJ1ZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiA/XG5cbi8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBoYXZlIGZ1bGwgc3VwcG9ydCBvZiB0aGUgQVBJcyBuZWVkZWQgdG8gdGVzdFxuLy8gd2hldGhlciB0aGUgcmVxdWVzdCBVUkwgaXMgb2YgdGhlIHNhbWUgb3JpZ2luIGFzIGN1cnJlbnQgbG9jYXRpb24uXG4gIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgY29uc3QgbXNpZSA9IHBsYXRmb3JtLm5hdmlnYXRvciAmJiAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KHBsYXRmb3JtLm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIGNvbnN0IHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGxldCBvcmlnaW5VUkw7XG5cbiAgICAvKipcbiAgICAqIFBhcnNlIGEgVVJMIHRvIGRpc2NvdmVyIGl0cyBjb21wb25lbnRzXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHBhcnNlZFxuICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc29sdmVVUkwodXJsKSB7XG4gICAgICBsZXQgaHJlZiA9IHVybDtcblxuICAgICAgaWYgKG1zaWUpIHtcbiAgICAgICAgLy8gSUUgbmVlZHMgYXR0cmlidXRlIHNldCB0d2ljZSB0byBub3JtYWxpemUgcHJvcGVydGllc1xuICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcbiAgICAgICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XG4gICAgICB9XG5cbiAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuXG4gICAgICAvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG4gICAgICByZXR1cm4ge1xuICAgICAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLFxuICAgICAgICBwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLFxuICAgICAgICBob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LFxuICAgICAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpIDogJycsXG4gICAgICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsXG4gICAgICAgIGhvc3RuYW1lOiB1cmxQYXJzaW5nTm9kZS5ob3N0bmFtZSxcbiAgICAgICAgcG9ydDogdXJsUGFyc2luZ05vZGUucG9ydCxcbiAgICAgICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgP1xuICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lIDpcbiAgICAgICAgICAnLycgKyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBvcmlnaW5VUkwgPSByZXNvbHZlVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcblxuICAgIC8qKlxuICAgICogRGV0ZXJtaW5lIGlmIGEgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGN1cnJlbnQgbG9jYXRpb25cbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdFVSTCBUaGUgVVJMIHRvIHRlc3RcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luLCBvdGhlcndpc2UgZmFsc2VcbiAgICAqL1xuICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4ocmVxdWVzdFVSTCkge1xuICAgICAgY29uc3QgcGFyc2VkID0gKHV0aWxzLmlzU3RyaW5nKHJlcXVlc3RVUkwpKSA/IHJlc29sdmVVUkwocmVxdWVzdFVSTCkgOiByZXF1ZXN0VVJMO1xuICAgICAgcmV0dXJuIChwYXJzZWQucHJvdG9jb2wgPT09IG9yaWdpblVSTC5wcm90b2NvbCAmJlxuICAgICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VUkwuaG9zdCk7XG4gICAgfTtcbiAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52cyAod2ViIHdvcmtlcnMsIHJlYWN0LW5hdGl2ZSkgbGFjayBuZWVkZWQgc3VwcG9ydC5cbiAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfSkoKTtcbiIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdHJpY3RcbmV4cG9ydCBkZWZhdWx0IG51bGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuLy8gUmF3QXhpb3NIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xuY29uc3QgaWdub3JlRHVwbGljYXRlT2YgPSB1dGlscy50b09iamVjdFNldChbXG4gICdhZ2UnLCAnYXV0aG9yaXphdGlvbicsICdjb250ZW50LWxlbmd0aCcsICdjb250ZW50LXR5cGUnLCAnZXRhZycsXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcbiAgJ2xhc3QtbW9kaWZpZWQnLCAnbG9jYXRpb24nLCAnbWF4LWZvcndhcmRzJywgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAncmVmZXJlcicsICdyZXRyeS1hZnRlcicsICd1c2VyLWFnZW50J1xuXSk7XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByYXdIZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5leHBvcnQgZGVmYXVsdCByYXdIZWFkZXJzID0+IHtcbiAgY29uc3QgcGFyc2VkID0ge307XG4gIGxldCBrZXk7XG4gIGxldCB2YWw7XG4gIGxldCBpO1xuXG4gIHJhd0hlYWRlcnMgJiYgcmF3SGVhZGVycy5zcGxpdCgnXFxuJykuZm9yRWFjaChmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSBsaW5lLnN1YnN0cmluZygwLCBpKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSBsaW5lLnN1YnN0cmluZyhpICsgMSkudHJpbSgpO1xuXG4gICAgaWYgKCFrZXkgfHwgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mW2tleV0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0pIHtcbiAgICAgICAgcGFyc2VkW2tleV0ucHVzaCh2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBbdmFsXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZVByb3RvY29sKHVybCkge1xuICBjb25zdCBtYXRjaCA9IC9eKFstK1xcd117MSwyNX0pKDo/XFwvXFwvfDopLy5leGVjKHVybCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbn1cbiIsImltcG9ydCBzcGVlZG9tZXRlciBmcm9tIFwiLi9zcGVlZG9tZXRlci5qc1wiO1xuaW1wb3J0IHRocm90dGxlIGZyb20gXCIuL3Rocm90dGxlLmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBwcm9ncmVzc0V2ZW50UmVkdWNlciA9IChsaXN0ZW5lciwgaXNEb3dubG9hZFN0cmVhbSwgZnJlcSA9IDMpID0+IHtcbiAgbGV0IGJ5dGVzTm90aWZpZWQgPSAwO1xuICBjb25zdCBfc3BlZWRvbWV0ZXIgPSBzcGVlZG9tZXRlcig1MCwgMjUwKTtcblxuICByZXR1cm4gdGhyb3R0bGUoZSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gZS5sb2FkZWQ7XG4gICAgY29uc3QgdG90YWwgPSBlLmxlbmd0aENvbXB1dGFibGUgPyBlLnRvdGFsIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb2dyZXNzQnl0ZXMgPSBsb2FkZWQgLSBieXRlc05vdGlmaWVkO1xuICAgIGNvbnN0IHJhdGUgPSBfc3BlZWRvbWV0ZXIocHJvZ3Jlc3NCeXRlcyk7XG4gICAgY29uc3QgaW5SYW5nZSA9IGxvYWRlZCA8PSB0b3RhbDtcblxuICAgIGJ5dGVzTm90aWZpZWQgPSBsb2FkZWQ7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbG9hZGVkLFxuICAgICAgdG90YWwsXG4gICAgICBwcm9ncmVzczogdG90YWwgPyAobG9hZGVkIC8gdG90YWwpIDogdW5kZWZpbmVkLFxuICAgICAgYnl0ZXM6IHByb2dyZXNzQnl0ZXMsXG4gICAgICByYXRlOiByYXRlID8gcmF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIGVzdGltYXRlZDogcmF0ZSAmJiB0b3RhbCAmJiBpblJhbmdlID8gKHRvdGFsIC0gbG9hZGVkKSAvIHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBldmVudDogZSxcbiAgICAgIGxlbmd0aENvbXB1dGFibGU6IHRvdGFsICE9IG51bGwsXG4gICAgICBbaXNEb3dubG9hZFN0cmVhbSA/ICdkb3dubG9hZCcgOiAndXBsb2FkJ106IHRydWVcbiAgICB9O1xuXG4gICAgbGlzdGVuZXIoZGF0YSk7XG4gIH0sIGZyZXEpO1xufVxuXG5leHBvcnQgY29uc3QgcHJvZ3Jlc3NFdmVudERlY29yYXRvciA9ICh0b3RhbCwgdGhyb3R0bGVkKSA9PiB7XG4gIGNvbnN0IGxlbmd0aENvbXB1dGFibGUgPSB0b3RhbCAhPSBudWxsO1xuXG4gIHJldHVybiBbKGxvYWRlZCkgPT4gdGhyb3R0bGVkWzBdKHtcbiAgICBsZW5ndGhDb21wdXRhYmxlLFxuICAgIHRvdGFsLFxuICAgIGxvYWRlZFxuICB9KSwgdGhyb3R0bGVkWzFdXTtcbn1cblxuZXhwb3J0IGNvbnN0IGFzeW5jRGVjb3JhdG9yID0gKGZuKSA9PiAoLi4uYXJncykgPT4gdXRpbHMuYXNhcCgoKSA9PiBmbiguLi5hcmdzKSk7XG4iLCJpbXBvcnQgcGxhdGZvcm0gZnJvbSBcIi4uL3BsYXRmb3JtL2luZGV4LmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgaXNVUkxTYW1lT3JpZ2luIGZyb20gXCIuL2lzVVJMU2FtZU9yaWdpbi5qc1wiO1xuaW1wb3J0IGNvb2tpZXMgZnJvbSBcIi4vY29va2llcy5qc1wiO1xuaW1wb3J0IGJ1aWxkRnVsbFBhdGggZnJvbSBcIi4uL2NvcmUvYnVpbGRGdWxsUGF0aC5qc1wiO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gXCIuLi9jb3JlL21lcmdlQ29uZmlnLmpzXCI7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuLi9jb3JlL0F4aW9zSGVhZGVycy5qc1wiO1xuaW1wb3J0IGJ1aWxkVVJMIGZyb20gXCIuL2J1aWxkVVJMLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChjb25maWcpID0+IHtcbiAgY29uc3QgbmV3Q29uZmlnID0gbWVyZ2VDb25maWcoe30sIGNvbmZpZyk7XG5cbiAgbGV0IHtkYXRhLCB3aXRoWFNSRlRva2VuLCB4c3JmSGVhZGVyTmFtZSwgeHNyZkNvb2tpZU5hbWUsIGhlYWRlcnMsIGF1dGh9ID0gbmV3Q29uZmlnO1xuXG4gIG5ld0NvbmZpZy5oZWFkZXJzID0gaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGhlYWRlcnMpO1xuXG4gIG5ld0NvbmZpZy51cmwgPSBidWlsZFVSTChidWlsZEZ1bGxQYXRoKG5ld0NvbmZpZy5iYXNlVVJMLCBuZXdDb25maWcudXJsKSwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpO1xuXG4gIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgaWYgKGF1dGgpIHtcbiAgICBoZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCYXNpYyAnICtcbiAgICAgIGJ0b2EoKGF1dGgudXNlcm5hbWUgfHwgJycpICsgJzonICsgKGF1dGgucGFzc3dvcmQgPyB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYXV0aC5wYXNzd29yZCkpIDogJycpKVxuICAgICk7XG4gIH1cblxuICBsZXQgY29udGVudFR5cGU7XG5cbiAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkpIHtcbiAgICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52IHx8IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudikge1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSh1bmRlZmluZWQpOyAvLyBMZXQgdGhlIGJyb3dzZXIgc2V0IGl0XG4gICAgfSBlbHNlIGlmICgoY29udGVudFR5cGUgPSBoZWFkZXJzLmdldENvbnRlbnRUeXBlKCkpICE9PSBmYWxzZSkge1xuICAgICAgLy8gZml4IHNlbWljb2xvbiBkdXBsaWNhdGlvbiBpc3N1ZSBmb3IgUmVhY3ROYXRpdmUgRm9ybURhdGEgaW1wbGVtZW50YXRpb25cbiAgICAgIGNvbnN0IFt0eXBlLCAuLi50b2tlbnNdID0gY29udGVudFR5cGUgPyBjb250ZW50VHlwZS5zcGxpdCgnOycpLm1hcCh0b2tlbiA9PiB0b2tlbi50cmltKCkpLmZpbHRlcihCb29sZWFuKSA6IFtdO1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZShbdHlwZSB8fCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsIC4uLnRva2Vuc10uam9pbignOyAnKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gIC8vIFRoaXMgaXMgb25seSBkb25lIGlmIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIGVudmlyb25tZW50LlxuICAvLyBTcGVjaWZpY2FsbHkgbm90IGlmIHdlJ3JlIGluIGEgd2ViIHdvcmtlciwgb3IgcmVhY3QtbmF0aXZlLlxuXG4gIGlmIChwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYpIHtcbiAgICB3aXRoWFNSRlRva2VuICYmIHV0aWxzLmlzRnVuY3Rpb24od2l0aFhTUkZUb2tlbikgJiYgKHdpdGhYU1JGVG9rZW4gPSB3aXRoWFNSRlRva2VuKG5ld0NvbmZpZykpO1xuXG4gICAgaWYgKHdpdGhYU1JGVG9rZW4gfHwgKHdpdGhYU1JGVG9rZW4gIT09IGZhbHNlICYmIGlzVVJMU2FtZU9yaWdpbihuZXdDb25maWcudXJsKSkpIHtcbiAgICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgICAgY29uc3QgeHNyZlZhbHVlID0geHNyZkhlYWRlck5hbWUgJiYgeHNyZkNvb2tpZU5hbWUgJiYgY29va2llcy5yZWFkKHhzcmZDb29raWVOYW1lKTtcblxuICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICBoZWFkZXJzLnNldCh4c3JmSGVhZGVyTmFtZSwgeHNyZlZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3Q29uZmlnO1xufVxuXG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRhdGEgbWF4UmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtzYW1wbGVzQ291bnQ9IDEwXVxuICogQHBhcmFtIHtOdW1iZXJ9IFttaW49IDEwMDBdXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHNwZWVkb21ldGVyKHNhbXBsZXNDb3VudCwgbWluKSB7XG4gIHNhbXBsZXNDb3VudCA9IHNhbXBsZXNDb3VudCB8fCAxMDtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgY29uc3QgdGltZXN0YW1wcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBsZXQgaGVhZCA9IDA7XG4gIGxldCB0YWlsID0gMDtcbiAgbGV0IGZpcnN0U2FtcGxlVFM7XG5cbiAgbWluID0gbWluICE9PSB1bmRlZmluZWQgPyBtaW4gOiAxMDAwO1xuXG4gIHJldHVybiBmdW5jdGlvbiBwdXNoKGNodW5rTGVuZ3RoKSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHRpbWVzdGFtcHNbdGFpbF07XG5cbiAgICBpZiAoIWZpcnN0U2FtcGxlVFMpIHtcbiAgICAgIGZpcnN0U2FtcGxlVFMgPSBub3c7XG4gICAgfVxuXG4gICAgYnl0ZXNbaGVhZF0gPSBjaHVua0xlbmd0aDtcbiAgICB0aW1lc3RhbXBzW2hlYWRdID0gbm93O1xuXG4gICAgbGV0IGkgPSB0YWlsO1xuICAgIGxldCBieXRlc0NvdW50ID0gMDtcblxuICAgIHdoaWxlIChpICE9PSBoZWFkKSB7XG4gICAgICBieXRlc0NvdW50ICs9IGJ5dGVzW2krK107XG4gICAgICBpID0gaSAlIHNhbXBsZXNDb3VudDtcbiAgICB9XG5cbiAgICBoZWFkID0gKGhlYWQgKyAxKSAlIHNhbXBsZXNDb3VudDtcblxuICAgIGlmIChoZWFkID09PSB0YWlsKSB7XG4gICAgICB0YWlsID0gKHRhaWwgKyAxKSAlIHNhbXBsZXNDb3VudDtcbiAgICB9XG5cbiAgICBpZiAobm93IC0gZmlyc3RTYW1wbGVUUyA8IG1pbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhc3NlZCA9IHN0YXJ0ZWRBdCAmJiBub3cgLSBzdGFydGVkQXQ7XG5cbiAgICByZXR1cm4gcGFzc2VkID8gTWF0aC5yb3VuZChieXRlc0NvdW50ICogMTAwMCAvIHBhc3NlZCkgOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNwZWVkb21ldGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gKlxuICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAqXG4gKiAgYGBganNcbiAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XG4gKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAqICBgYGBcbiAqXG4gKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAqXG4gKiAgYGBganNcbiAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gKiAgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcChhcnIpIHtcbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCwgYXJyKTtcbiAgfTtcbn1cbiIsIi8qKlxuICogVGhyb3R0bGUgZGVjb3JhdG9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtOdW1iZXJ9IGZyZXFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmbiwgZnJlcSkge1xuICBsZXQgdGltZXN0YW1wID0gMDtcbiAgbGV0IHRocmVzaG9sZCA9IDEwMDAgLyBmcmVxO1xuICBsZXQgbGFzdEFyZ3M7XG4gIGxldCB0aW1lcjtcblxuICBjb25zdCBpbnZva2UgPSAoYXJncywgbm93ID0gRGF0ZS5ub3coKSkgPT4ge1xuICAgIHRpbWVzdGFtcCA9IG5vdztcbiAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgaWYgKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgIH1cbiAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgfVxuXG4gIGNvbnN0IHRocm90dGxlZCA9ICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBwYXNzZWQgPSBub3cgLSB0aW1lc3RhbXA7XG4gICAgaWYgKCBwYXNzZWQgPj0gdGhyZXNob2xkKSB7XG4gICAgICBpbnZva2UoYXJncywgbm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgICAgaWYgKCF0aW1lcikge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICBpbnZva2UobGFzdEFyZ3MpXG4gICAgICAgIH0sIHRocmVzaG9sZCAtIHBhc3NlZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZmx1c2ggPSAoKSA9PiBsYXN0QXJncyAmJiBpbnZva2UobGFzdEFyZ3MpO1xuXG4gIHJldHVybiBbdGhyb3R0bGVkLCBmbHVzaF07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRocm90dGxlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbi8vIHRlbXBvcmFyeSBob3RmaXggdG8gYXZvaWQgY2lyY3VsYXIgcmVmZXJlbmNlcyB1bnRpbCBBeGlvc1VSTFNlYXJjaFBhcmFtcyBpcyByZWZhY3RvcmVkXG5pbXBvcnQgUGxhdGZvcm1Gb3JtRGF0YSBmcm9tICcuLi9wbGF0Zm9ybS9ub2RlL2NsYXNzZXMvRm9ybURhdGEuanMnO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHRoaW5nIGlzIGEgYXJyYXkgb3IganMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aGluZyAtIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gYmUgdmlzaXRlZC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNWaXNpdGFibGUodGhpbmcpIHtcbiAgcmV0dXJuIHV0aWxzLmlzUGxhaW5PYmplY3QodGhpbmcpIHx8IHV0aWxzLmlzQXJyYXkodGhpbmcpO1xufVxuXG4vKipcbiAqIEl0IHJlbW92ZXMgdGhlIGJyYWNrZXRzIGZyb20gdGhlIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBwYXJhbWV0ZXIuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGtleSB3aXRob3V0IHRoZSBicmFja2V0cy5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQnJhY2tldHMoa2V5KSB7XG4gIHJldHVybiB1dGlscy5lbmRzV2l0aChrZXksICdbXScpID8ga2V5LnNsaWNlKDAsIC0yKSA6IGtleTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhdGgsIGEga2V5LCBhbmQgYSBib29sZWFuLCBhbmQgcmV0dXJucyBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGJlaW5nIGl0ZXJhdGVkIG92ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZG90cyAtIElmIHRydWUsIHRoZSBrZXkgd2lsbCBiZSByZW5kZXJlZCB3aXRoIGRvdHMgaW5zdGVhZCBvZiBicmFja2V0cy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCB0byB0aGUgY3VycmVudCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4ga2V5O1xuICByZXR1cm4gcGF0aC5jb25jYXQoa2V5KS5tYXAoZnVuY3Rpb24gZWFjaCh0b2tlbiwgaSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIHRva2VuID0gcmVtb3ZlQnJhY2tldHModG9rZW4pO1xuICAgIHJldHVybiAhZG90cyAmJiBpID8gJ1snICsgdG9rZW4gKyAnXScgOiB0b2tlbjtcbiAgfSkuam9pbihkb3RzID8gJy4nIDogJycpO1xufVxuXG4vKipcbiAqIElmIHRoZSBhcnJheSBpcyBhbiBhcnJheSBhbmQgbm9uZSBvZiBpdHMgZWxlbWVudHMgYXJlIHZpc2l0YWJsZSwgdGhlbiBpdCdzIGEgZmxhdCBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZsYXRBcnJheShhcnIpIHtcbiAgcmV0dXJuIHV0aWxzLmlzQXJyYXkoYXJyKSAmJiAhYXJyLnNvbWUoaXNWaXNpdGFibGUpO1xufVxuXG5jb25zdCBwcmVkaWNhdGVzID0gdXRpbHMudG9GbGF0T2JqZWN0KHV0aWxzLCB7fSwgbnVsbCwgZnVuY3Rpb24gZmlsdGVyKHByb3ApIHtcbiAgcmV0dXJuIC9eaXNbQS1aXS8udGVzdChwcm9wKTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSBkYXRhIG9iamVjdCB0byBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7P09iamVjdH0gW2Zvcm1EYXRhXVxuICogQHBhcmFtIHs/T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZpc2l0b3JdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1ldGFUb2tlbnMgPSB0cnVlXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kb3RzID0gZmFsc2VdXG4gKiBAcGFyYW0gez9Cb29sZWFufSBbb3B0aW9ucy5pbmRleGVzID0gZmFsc2VdXG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqKi9cblxuLyoqXG4gKiBJdCBjb252ZXJ0cyBhbiBvYmplY3QgaW50byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIGZvcm0gZGF0YS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSAtIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zXG4gKlxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gdG9Gb3JtRGF0YShvYmosIGZvcm1EYXRhLCBvcHRpb25zKSB7XG4gIGlmICghdXRpbHMuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RhcmdldCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGZvcm1EYXRhID0gZm9ybURhdGEgfHwgbmV3IChQbGF0Zm9ybUZvcm1EYXRhIHx8IEZvcm1EYXRhKSgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBvcHRpb25zID0gdXRpbHMudG9GbGF0T2JqZWN0KG9wdGlvbnMsIHtcbiAgICBtZXRhVG9rZW5zOiB0cnVlLFxuICAgIGRvdHM6IGZhbHNlLFxuICAgIGluZGV4ZXM6IGZhbHNlXG4gIH0sIGZhbHNlLCBmdW5jdGlvbiBkZWZpbmVkKG9wdGlvbiwgc291cmNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gICAgcmV0dXJuICF1dGlscy5pc1VuZGVmaW5lZChzb3VyY2Vbb3B0aW9uXSk7XG4gIH0pO1xuXG4gIGNvbnN0IG1ldGFUb2tlbnMgPSBvcHRpb25zLm1ldGFUb2tlbnM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICBjb25zdCB2aXNpdG9yID0gb3B0aW9ucy52aXNpdG9yIHx8IGRlZmF1bHRWaXNpdG9yO1xuICBjb25zdCBkb3RzID0gb3B0aW9ucy5kb3RzO1xuICBjb25zdCBpbmRleGVzID0gb3B0aW9ucy5pbmRleGVzO1xuICBjb25zdCBfQmxvYiA9IG9wdGlvbnMuQmxvYiB8fCB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgQmxvYjtcbiAgY29uc3QgdXNlQmxvYiA9IF9CbG9iICYmIHV0aWxzLmlzU3BlY0NvbXBsaWFudEZvcm0oZm9ybURhdGEpO1xuXG4gIGlmICghdXRpbHMuaXNGdW5jdGlvbih2aXNpdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Zpc2l0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBmdW5jdGlvbiBjb252ZXJ0VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAnJztcblxuICAgIGlmICh1dGlscy5pc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZUJsb2IgJiYgdXRpbHMuaXNCbG9iKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ0Jsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIodmFsdWUpIHx8IHV0aWxzLmlzVHlwZWRBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1c2VCbG9iICYmIHR5cGVvZiBCbG9iID09PSAnZnVuY3Rpb24nID8gbmV3IEJsb2IoW3ZhbHVlXSkgOiBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmlzaXRvci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IGtleVxuICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZ3xOdW1iZXI+fSBwYXRoXG4gICAqIEB0aGlzIHtGb3JtRGF0YX1cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHJldHVybiB0cnVlIHRvIHZpc2l0IHRoZSBlYWNoIHByb3Agb2YgdGhlIHZhbHVlIHJlY3Vyc2l2ZWx5XG4gICAqL1xuICBmdW5jdGlvbiBkZWZhdWx0VmlzaXRvcih2YWx1ZSwga2V5LCBwYXRoKSB7XG4gICAgbGV0IGFyciA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmICFwYXRoICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh1dGlscy5lbmRzV2l0aChrZXksICd7fScpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSBtZXRhVG9rZW5zID8ga2V5IDoga2V5LnNsaWNlKDAsIC0yKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKHV0aWxzLmlzQXJyYXkodmFsdWUpICYmIGlzRmxhdEFycmF5KHZhbHVlKSkgfHxcbiAgICAgICAgKCh1dGlscy5pc0ZpbGVMaXN0KHZhbHVlKSB8fCB1dGlscy5lbmRzV2l0aChrZXksICdbXScpKSAmJiAoYXJyID0gdXRpbHMudG9BcnJheSh2YWx1ZSkpXG4gICAgICAgICkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGtleSA9IHJlbW92ZUJyYWNrZXRzKGtleSk7XG5cbiAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gZWFjaChlbCwgaW5kZXgpIHtcbiAgICAgICAgICAhKHV0aWxzLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5XG4gICAgICAgICAgICBpbmRleGVzID09PSB0cnVlID8gcmVuZGVyS2V5KFtrZXldLCBpbmRleCwgZG90cykgOiAoaW5kZXhlcyA9PT0gbnVsbCA/IGtleSA6IGtleSArICdbXScpLFxuICAgICAgICAgICAgY29udmVydFZhbHVlKGVsKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVmlzaXRhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9ybURhdGEuYXBwZW5kKHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpLCBjb252ZXJ0VmFsdWUodmFsdWUpKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHN0YWNrID0gW107XG5cbiAgY29uc3QgZXhwb3NlZEhlbHBlcnMgPSBPYmplY3QuYXNzaWduKHByZWRpY2F0ZXMsIHtcbiAgICBkZWZhdWx0VmlzaXRvcixcbiAgICBjb252ZXJ0VmFsdWUsXG4gICAgaXNWaXNpdGFibGVcbiAgfSk7XG5cbiAgZnVuY3Rpb24gYnVpbGQodmFsdWUsIHBhdGgpIHtcbiAgICBpZiAodXRpbHMuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47XG5cbiAgICBpZiAoc3RhY2suaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICcgKyBwYXRoLmpvaW4oJy4nKSk7XG4gICAgfVxuXG4gICAgc3RhY2sucHVzaCh2YWx1ZSk7XG5cbiAgICB1dGlscy5mb3JFYWNoKHZhbHVlLCBmdW5jdGlvbiBlYWNoKGVsLCBrZXkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9ICEodXRpbHMuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJiB2aXNpdG9yLmNhbGwoXG4gICAgICAgIGZvcm1EYXRhLCBlbCwgdXRpbHMuaXNTdHJpbmcoa2V5KSA/IGtleS50cmltKCkgOiBrZXksIHBhdGgsIGV4cG9zZWRIZWxwZXJzXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGJ1aWxkKGVsLCBwYXRoID8gcGF0aC5jb25jYXQoa2V5KSA6IFtrZXldKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0YWNrLnBvcCgpO1xuICB9XG5cbiAgaWYgKCF1dGlscy5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZGF0YSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG5cbiAgYnVpbGQob2JqKTtcblxuICByZXR1cm4gZm9ybURhdGE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvRm9ybURhdGE7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgdG9Gb3JtRGF0YSBmcm9tICcuL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCBvcHRpb25zKSB7XG4gIHJldHVybiB0b0Zvcm1EYXRhKGRhdGEsIG5ldyBwbGF0Zm9ybS5jbGFzc2VzLlVSTFNlYXJjaFBhcmFtcygpLCBPYmplY3QuYXNzaWduKHtcbiAgICB2aXNpdG9yOiBmdW5jdGlvbih2YWx1ZSwga2V5LCBwYXRoLCBoZWxwZXJzKSB7XG4gICAgICBpZiAocGxhdGZvcm0uaXNOb2RlICYmIHV0aWxzLmlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgICB0aGlzLmFwcGVuZChrZXksIHZhbHVlLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhlbHBlcnMuZGVmYXVsdFZpc2l0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH0sIG9wdGlvbnMpKTtcbn1cbiIsIlxuZXhwb3J0IGNvbnN0IHN0cmVhbUNodW5rID0gZnVuY3Rpb24qIChjaHVuaywgY2h1bmtTaXplKSB7XG4gIGxldCBsZW4gPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gIGlmICghY2h1bmtTaXplIHx8IGxlbiA8IGNodW5rU2l6ZSkge1xuICAgIHlpZWxkIGNodW5rO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwb3MgPSAwO1xuICBsZXQgZW5kO1xuXG4gIHdoaWxlIChwb3MgPCBsZW4pIHtcbiAgICBlbmQgPSBwb3MgKyBjaHVua1NpemU7XG4gICAgeWllbGQgY2h1bmsuc2xpY2UocG9zLCBlbmQpO1xuICAgIHBvcyA9IGVuZDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVhZEJ5dGVzID0gYXN5bmMgZnVuY3Rpb24qIChpdGVyYWJsZSwgY2h1bmtTaXplLCBlbmNvZGUpIHtcbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBpdGVyYWJsZSkge1xuICAgIHlpZWxkKiBzdHJlYW1DaHVuayhBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspID8gY2h1bmsgOiAoYXdhaXQgZW5jb2RlKFN0cmluZyhjaHVuaykpKSwgY2h1bmtTaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdHJhY2tTdHJlYW0gPSAoc3RyZWFtLCBjaHVua1NpemUsIG9uUHJvZ3Jlc3MsIG9uRmluaXNoLCBlbmNvZGUpID0+IHtcbiAgY29uc3QgaXRlcmF0b3IgPSByZWFkQnl0ZXMoc3RyZWFtLCBjaHVua1NpemUsIGVuY29kZSk7XG5cbiAgbGV0IGJ5dGVzID0gMDtcbiAgbGV0IGRvbmU7XG4gIGxldCBfb25GaW5pc2ggPSAoZSkgPT4ge1xuICAgIGlmICghZG9uZSkge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBvbkZpbmlzaCAmJiBvbkZpbmlzaChlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHtkb25lLCB2YWx1ZX0gPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgIF9vbkZpbmlzaCgpO1xuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGVuID0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICAgICAgaWYgKG9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICBsZXQgbG9hZGVkQnl0ZXMgPSBieXRlcyArPSBsZW47XG4gICAgICAgICAgb25Qcm9ncmVzcyhsb2FkZWRCeXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX29uRmluaXNoKGVycik7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNhbmNlbChyZWFzb24pIHtcbiAgICAgIF9vbkZpbmlzaChyZWFzb24pO1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yLnJldHVybigpO1xuICAgIH1cbiAgfSwge1xuICAgIGhpZ2hXYXRlck1hcms6IDJcbiAgfSlcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHtWRVJTSU9OfSBmcm9tICcuLi9lbnYvZGF0YS5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuXG5jb25zdCB2YWxpZGF0b3JzID0ge307XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5bJ29iamVjdCcsICdib29sZWFuJywgJ251bWJlcicsICdmdW5jdGlvbicsICdzdHJpbmcnLCAnc3ltYm9sJ10uZm9yRWFjaCgodHlwZSwgaSkgPT4ge1xuICB2YWxpZGF0b3JzW3R5cGVdID0gZnVuY3Rpb24gdmFsaWRhdG9yKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gdHlwZSB8fCAnYScgKyAoaSA8IDEgPyAnbiAnIDogJyAnKSArIHR5cGU7XG4gIH07XG59KTtcblxuY29uc3QgZGVwcmVjYXRlZFdhcm5pbmdzID0ge307XG5cbi8qKlxuICogVHJhbnNpdGlvbmFsIG9wdGlvbiB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufGJvb2xlYW4/fSB2YWxpZGF0b3IgLSBzZXQgdG8gZmFsc2UgaWYgdGhlIHRyYW5zaXRpb25hbCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZFxuICogQHBhcmFtIHtzdHJpbmc/fSB2ZXJzaW9uIC0gZGVwcmVjYXRlZCB2ZXJzaW9uIC8gcmVtb3ZlZCBzaW5jZSB2ZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZz99IG1lc3NhZ2UgLSBzb21lIG1lc3NhZ2Ugd2l0aCBhZGRpdGlvbmFsIGluZm9cbiAqXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKi9cbnZhbGlkYXRvcnMudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xuICBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG9wdCwgZGVzYykge1xuICAgIHJldHVybiAnW0F4aW9zIHYnICsgVkVSU0lPTiArICddIFRyYW5zaXRpb25hbCBvcHRpb24gXFwnJyArIG9wdCArICdcXCcnICsgZGVzYyArIChtZXNzYWdlID8gJy4gJyArIG1lc3NhZ2UgOiAnJyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gKHZhbHVlLCBvcHQsIG9wdHMpID0+IHtcbiAgICBpZiAodmFsaWRhdG9yID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgIGZvcm1hdE1lc3NhZ2Uob3B0LCAnIGhhcyBiZWVuIHJlbW92ZWQnICsgKHZlcnNpb24gPyAnIGluICcgKyB2ZXJzaW9uIDogJycpKSxcbiAgICAgICAgQXhpb3NFcnJvci5FUlJfREVQUkVDQVRFRFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiAmJiAhZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0pIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgb3B0LFxuICAgICAgICAgICcgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2JyArIHZlcnNpb24gKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IgPyB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0cykgOiB0cnVlO1xuICB9O1xufTtcblxuLyoqXG4gKiBBc3NlcnQgb2JqZWN0J3MgcHJvcGVydGllcyB0eXBlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWFcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGFsbG93VW5rbm93blxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gYXNzZXJ0T3B0aW9ucyhvcHRpb25zLCBzY2hlbWEsIGFsbG93VW5rbm93bikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnLCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgY29uc3Qgb3B0ID0ga2V5c1tpXTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBzY2hlbWFbb3B0XTtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbb3B0XTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9uICcgKyBvcHQgKyAnIG11c3QgYmUgJyArIHJlc3VsdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFsbG93VW5rbm93biAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ1Vua25vd24gb3B0aW9uICcgKyBvcHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT04pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFzc2VydE9wdGlvbnMsXG4gIHZhbGlkYXRvcnNcbn07XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnID8gQmxvYiA6IG51bGxcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyA/IEZvcm1EYXRhIDogbnVsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IEF4aW9zVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMnO1xuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgPyBVUkxTZWFyY2hQYXJhbXMgOiBBeGlvc1VSTFNlYXJjaFBhcmFtcztcbiIsImltcG9ydCBVUkxTZWFyY2hQYXJhbXMgZnJvbSAnLi9jbGFzc2VzL1VSTFNlYXJjaFBhcmFtcy5qcydcbmltcG9ydCBGb3JtRGF0YSBmcm9tICcuL2NsYXNzZXMvRm9ybURhdGEuanMnXG5pbXBvcnQgQmxvYiBmcm9tICcuL2NsYXNzZXMvQmxvYi5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpc0Jyb3dzZXI6IHRydWUsXG4gIGNsYXNzZXM6IHtcbiAgICBVUkxTZWFyY2hQYXJhbXMsXG4gICAgRm9ybURhdGEsXG4gICAgQmxvYlxuICB9LFxuICBwcm90b2NvbHM6IFsnaHR0cCcsICdodHRwcycsICdmaWxlJywgJ2Jsb2InLCAndXJsJywgJ2RhdGEnXVxufTtcbiIsImNvbnN0IGhhc0Jyb3dzZXJFbnYgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG5jb25zdCBfbmF2aWdhdG9yID0gdHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiYgbmF2aWdhdG9yIHx8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlckVudiA9IGhhc0Jyb3dzZXJFbnYgJiZcbiAgKCFfbmF2aWdhdG9yIHx8IFsnUmVhY3ROYXRpdmUnLCAnTmF0aXZlU2NyaXB0JywgJ05TJ10uaW5kZXhPZihfbmF2aWdhdG9yLnByb2R1Y3QpIDwgMCk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBzdGFuZGFyZCBicm93c2VyIHdlYldvcmtlciBlbnZpcm9ubWVudFxuICpcbiAqIEFsdGhvdWdoIHRoZSBgaXNTdGFuZGFyZEJyb3dzZXJFbnZgIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdFxuICogYGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyYCwgdGhlIFdlYldvcmtlciB3aWxsIHN0aWxsIGJlXG4gKiBmaWx0ZXJlZCBvdXQgZHVlIHRvIGl0cyBqdWRnbWVudCBzdGFuZGFyZFxuICogYHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdgLlxuICogVGhpcyBsZWFkcyB0byBhIHByb2JsZW0gd2hlbiBheGlvcyBwb3N0IGBGb3JtRGF0YWAgaW4gd2ViV29ya2VyXG4gKi9cbmNvbnN0IGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudiA9ICgoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSAmJlxuICAgIHR5cGVvZiBzZWxmLmltcG9ydFNjcmlwdHMgPT09ICdmdW5jdGlvbidcbiAgKTtcbn0pKCk7XG5cbmNvbnN0IG9yaWdpbiA9IGhhc0Jyb3dzZXJFbnYgJiYgd2luZG93LmxvY2F0aW9uLmhyZWYgfHwgJ2h0dHA6Ly9sb2NhbGhvc3QnO1xuXG5leHBvcnQge1xuICBoYXNCcm93c2VyRW52LFxuICBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlckVudixcbiAgX25hdmlnYXRvciBhcyBuYXZpZ2F0b3IsXG4gIG9yaWdpblxufVxuIiwiaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4vbm9kZS9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL2NvbW1vbi91dGlscy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLi4udXRpbHMsXG4gIC4uLnBsYXRmb3JtXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBiaW5kIGZyb20gJy4vaGVscGVycy9iaW5kLmpzJztcblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxuY29uc3Qge3RvU3RyaW5nfSA9IE9iamVjdC5wcm90b3R5cGU7XG5jb25zdCB7Z2V0UHJvdG90eXBlT2Z9ID0gT2JqZWN0O1xuXG5jb25zdCBraW5kT2YgPSAoY2FjaGUgPT4gdGhpbmcgPT4ge1xuICAgIGNvbnN0IHN0ciA9IHRvU3RyaW5nLmNhbGwodGhpbmcpO1xuICAgIHJldHVybiBjYWNoZVtzdHJdIHx8IChjYWNoZVtzdHJdID0gc3RyLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpKTtcbn0pKE9iamVjdC5jcmVhdGUobnVsbCkpO1xuXG5jb25zdCBraW5kT2ZUZXN0ID0gKHR5cGUpID0+IHtcbiAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuICh0aGluZykgPT4ga2luZE9mKHRoaW5nKSA9PT0gdHlwZVxufVxuXG5jb25zdCB0eXBlT2ZUZXN0ID0gdHlwZSA9PiB0aGluZyA9PiB0eXBlb2YgdGhpbmcgPT09IHR5cGU7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCB7aXNBcnJheX0gPSBBcnJheTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VuZGVmaW5lZCA9IHR5cGVPZlRlc3QoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwpICYmIHZhbC5jb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsLmNvbnN0cnVjdG9yKVxuICAgICYmIGlzRnVuY3Rpb24odmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKSAmJiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIodmFsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0FycmF5QnVmZmVyID0ga2luZE9mVGVzdCgnQXJyYXlCdWZmZXInKTtcblxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIGxldCByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKGlzQXJyYXlCdWZmZXIodmFsLmJ1ZmZlcikpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJpbmcgPSB0eXBlT2ZUZXN0KCdzdHJpbmcnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Z1bmN0aW9uID0gdHlwZU9mVGVzdCgnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBOdW1iZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc051bWJlciA9IHR5cGVPZlRlc3QoJ251bWJlcicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJvb2xlYW5cbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJvb2xlYW4sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jvb2xlYW4gPSB0aGluZyA9PiB0aGluZyA9PT0gdHJ1ZSB8fCB0aGluZyA9PT0gZmFsc2U7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2YWwpID0+IHtcbiAgaWYgKGtpbmRPZih2YWwpICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNEYXRlID0ga2luZE9mVGVzdCgnRGF0ZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlID0ga2luZE9mVGVzdCgnRmlsZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZUxpc3QgPSBraW5kT2ZUZXN0KCdGaWxlTGlzdCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyZWFtID0gKHZhbCkgPT4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGb3JtRGF0YSA9ICh0aGluZykgPT4ge1xuICBsZXQga2luZDtcbiAgcmV0dXJuIHRoaW5nICYmIChcbiAgICAodHlwZW9mIEZvcm1EYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaW5nIGluc3RhbmNlb2YgRm9ybURhdGEpIHx8IChcbiAgICAgIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiAoXG4gICAgICAgIChraW5kID0ga2luZE9mKHRoaW5nKSkgPT09ICdmb3JtZGF0YScgfHxcbiAgICAgICAgLy8gZGV0ZWN0IGZvcm0tZGF0YSBpbnN0YW5jZVxuICAgICAgICAoa2luZCA9PT0gJ29iamVjdCcgJiYgaXNGdW5jdGlvbih0aGluZy50b1N0cmluZykgJiYgdGhpbmcudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJylcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0ga2luZE9mVGVzdCgnVVJMU2VhcmNoUGFyYW1zJyk7XG5cbmNvbnN0IFtpc1JlYWRhYmxlU3RyZWFtLCBpc1JlcXVlc3QsIGlzUmVzcG9uc2UsIGlzSGVhZGVyc10gPSBbJ1JlYWRhYmxlU3RyZWFtJywgJ1JlcXVlc3QnLCAnUmVzcG9uc2UnLCAnSGVhZGVycyddLm1hcChraW5kT2ZUZXN0KTtcblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAqL1xuY29uc3QgdHJpbSA9IChzdHIpID0+IHN0ci50cmltID9cbiAgc3RyLnRyaW0oKSA6IHN0ci5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywgJycpO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5cyA9IGZhbHNlXVxuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuLCB7YWxsT3duS2V5cyA9IGZhbHNlfSA9IHt9KSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGk7XG4gIGxldCBsO1xuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG4gICAgZm9yIChpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBjb25zdCBrZXlzID0gYWxsT3duS2V5cyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikgOiBPYmplY3Qua2V5cyhvYmopO1xuICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBrZXk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRLZXkob2JqLCBrZXkpIHtcbiAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICBsZXQgX2tleTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBfa2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoa2V5ID09PSBfa2V5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBfa2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgX2dsb2JhbCA9ICgoKSA9PiB7XG4gIC8qZXNsaW50IG5vLXVuZGVmOjAqL1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBnbG9iYWxUaGlzO1xuICByZXR1cm4gdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsKVxufSkoKTtcblxuY29uc3QgaXNDb250ZXh0RGVmaW5lZCA9IChjb250ZXh0KSA9PiAhaXNVbmRlZmluZWQoY29udGV4dCkgJiYgY29udGV4dCAhPT0gX2dsb2JhbDtcblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKlxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICBjb25zdCB7Y2FzZWxlc3N9ID0gaXNDb250ZXh0RGVmaW5lZCh0aGlzKSAmJiB0aGlzIHx8IHt9O1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgY29uc3QgYXNzaWduVmFsdWUgPSAodmFsLCBrZXkpID0+IHtcbiAgICBjb25zdCB0YXJnZXRLZXkgPSBjYXNlbGVzcyAmJiBmaW5kS2V5KHJlc3VsdCwga2V5KSB8fCBrZXk7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QocmVzdWx0W3RhcmdldEtleV0pICYmIGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZShyZXN1bHRbdGFyZ2V0S2V5XSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZSh7fSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWwuc2xpY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgYXJndW1lbnRzW2ldICYmIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXNdXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmNvbnN0IGV4dGVuZCA9IChhLCBiLCB0aGlzQXJnLCB7YWxsT3duS2V5c309IHt9KSA9PiB7XG4gIGZvckVhY2goYiwgKHZhbCwga2V5KSA9PiB7XG4gICAgaWYgKHRoaXNBcmcgJiYgaXNGdW5jdGlvbih2YWwpKSB7XG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0sIHthbGxPd25LZXlzfSk7XG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIFJlbW92ZSBieXRlIG9yZGVyIG1hcmtlci4gVGhpcyBjYXRjaGVzIEVGIEJCIEJGICh0aGUgVVRGLTggQk9NKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IHdpdGggQk9NXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gY29udGVudCB2YWx1ZSB3aXRob3V0IEJPTVxuICovXG5jb25zdCBzdHJpcEJPTSA9IChjb250ZW50KSA9PiB7XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlclxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdXG4gKiBAcGFyYW0ge29iamVjdH0gW2Rlc2NyaXB0b3JzXVxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBpbmhlcml0cyA9IChjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvciwgcHJvcHMsIGRlc2NyaXB0b3JzKSA9PiB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGRlc2NyaXB0b3JzKTtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25zdHJ1Y3RvciwgJ3N1cGVyJywge1xuICAgIHZhbHVlOiBzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZVxuICB9KTtcbiAgcHJvcHMgJiYgT2JqZWN0LmFzc2lnbihjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3BzKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9iamVjdCB3aXRoIGRlZXAgcHJvdG90eXBlIGNoYWluIHRvIGEgZmxhdCBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VPYmogc291cmNlIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IFtkZXN0T2JqXVxuICogQHBhcmFtIHtGdW5jdGlvbnxCb29sZWFufSBbZmlsdGVyXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Byb3BGaWx0ZXJdXG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuY29uc3QgdG9GbGF0T2JqZWN0ID0gKHNvdXJjZU9iaiwgZGVzdE9iaiwgZmlsdGVyLCBwcm9wRmlsdGVyKSA9PiB7XG4gIGxldCBwcm9wcztcbiAgbGV0IGk7XG4gIGxldCBwcm9wO1xuICBjb25zdCBtZXJnZWQgPSB7fTtcblxuICBkZXN0T2JqID0gZGVzdE9iaiB8fCB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gIGlmIChzb3VyY2VPYmogPT0gbnVsbCkgcmV0dXJuIGRlc3RPYmo7XG5cbiAgZG8ge1xuICAgIHByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc291cmNlT2JqKTtcbiAgICBpID0gcHJvcHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICBwcm9wID0gcHJvcHNbaV07XG4gICAgICBpZiAoKCFwcm9wRmlsdGVyIHx8IHByb3BGaWx0ZXIocHJvcCwgc291cmNlT2JqLCBkZXN0T2JqKSkgJiYgIW1lcmdlZFtwcm9wXSkge1xuICAgICAgICBkZXN0T2JqW3Byb3BdID0gc291cmNlT2JqW3Byb3BdO1xuICAgICAgICBtZXJnZWRbcHJvcF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3VyY2VPYmogPSBmaWx0ZXIgIT09IGZhbHNlICYmIGdldFByb3RvdHlwZU9mKHNvdXJjZU9iaik7XG4gIH0gd2hpbGUgKHNvdXJjZU9iaiAmJiAoIWZpbHRlciB8fCBmaWx0ZXIoc291cmNlT2JqLCBkZXN0T2JqKSkgJiYgc291cmNlT2JqICE9PSBPYmplY3QucHJvdG90eXBlKTtcblxuICByZXR1cm4gZGVzdE9iajtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBjaGFyYWN0ZXJzIG9mIGEgc3BlY2lmaWVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWFyY2hTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb249IDBdXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGVuZHNXaXRoID0gKHN0ciwgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbikgPT4ge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPiBzdHIubGVuZ3RoKSB7XG4gICAgcG9zaXRpb24gPSBzdHIubGVuZ3RoO1xuICB9XG4gIHBvc2l0aW9uIC09IHNlYXJjaFN0cmluZy5sZW5ndGg7XG4gIGNvbnN0IGxhc3RJbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0cmluZywgcG9zaXRpb24pO1xuICByZXR1cm4gbGFzdEluZGV4ICE9PSAtMSAmJiBsYXN0SW5kZXggPT09IHBvc2l0aW9uO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBuZXcgYXJyYXkgZnJvbSBhcnJheSBsaWtlIG9iamVjdCBvciBudWxsIGlmIGZhaWxlZFxuICpcbiAqIEBwYXJhbSB7Kn0gW3RoaW5nXVxuICpcbiAqIEByZXR1cm5zIHs/QXJyYXl9XG4gKi9cbmNvbnN0IHRvQXJyYXkgPSAodGhpbmcpID0+IHtcbiAgaWYgKCF0aGluZykgcmV0dXJuIG51bGw7XG4gIGlmIChpc0FycmF5KHRoaW5nKSkgcmV0dXJuIHRoaW5nO1xuICBsZXQgaSA9IHRoaW5nLmxlbmd0aDtcbiAgaWYgKCFpc051bWJlcihpKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFyciA9IG5ldyBBcnJheShpKTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBhcnJbaV0gPSB0aGluZ1tpXTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG4vKipcbiAqIENoZWNraW5nIGlmIHRoZSBVaW50OEFycmF5IGV4aXN0cyBhbmQgaWYgaXQgZG9lcywgaXQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZVxuICogdGhpbmcgcGFzc2VkIGluIGlzIGFuIGluc3RhbmNlIG9mIFVpbnQ4QXJyYXlcbiAqXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9XG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuY29uc3QgaXNUeXBlZEFycmF5ID0gKFR5cGVkQXJyYXkgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gdGhpbmcgPT4ge1xuICAgIHJldHVybiBUeXBlZEFycmF5ICYmIHRoaW5nIGluc3RhbmNlb2YgVHlwZWRBcnJheTtcbiAgfTtcbn0pKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5KSk7XG5cbi8qKlxuICogRm9yIGVhY2ggZW50cnkgaW4gdGhlIG9iamVjdCwgY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUga2V5IGFuZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgZm9yRWFjaEVudHJ5ID0gKG9iaiwgZm4pID0+IHtcbiAgY29uc3QgZ2VuZXJhdG9yID0gb2JqICYmIG9ialtTeW1ib2wuaXRlcmF0b3JdO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZ2VuZXJhdG9yLmNhbGwob2JqKTtcblxuICBsZXQgcmVzdWx0O1xuXG4gIHdoaWxlICgocmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpKSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICBjb25zdCBwYWlyID0gcmVzdWx0LnZhbHVlO1xuICAgIGZuLmNhbGwob2JqLCBwYWlyWzBdLCBwYWlyWzFdKTtcbiAgfVxufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBhIHN0cmluZywgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtYXRjaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8Ym9vbGVhbj59XG4gKi9cbmNvbnN0IG1hdGNoQWxsID0gKHJlZ0V4cCwgc3RyKSA9PiB7XG4gIGxldCBtYXRjaGVzO1xuICBjb25zdCBhcnIgPSBbXTtcblxuICB3aGlsZSAoKG1hdGNoZXMgPSByZWdFeHAuZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKG1hdGNoZXMpO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn1cblxuLyogQ2hlY2tpbmcgaWYgdGhlIGtpbmRPZlRlc3QgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIGFuIEhUTUxGb3JtRWxlbWVudC4gKi9cbmNvbnN0IGlzSFRNTEZvcm0gPSBraW5kT2ZUZXN0KCdIVE1MRm9ybUVsZW1lbnQnKTtcblxuY29uc3QgdG9DYW1lbENhc2UgPSBzdHIgPT4ge1xuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXFxzXShbYS16XFxkXSkoXFx3KikvZyxcbiAgICBmdW5jdGlvbiByZXBsYWNlcihtLCBwMSwgcDIpIHtcbiAgICAgIHJldHVybiBwMS50b1VwcGVyQ2FzZSgpICsgcDI7XG4gICAgfVxuICApO1xufTtcblxuLyogQ3JlYXRpbmcgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2hlY2sgaWYgYW4gb2JqZWN0IGhhcyBhIHByb3BlcnR5LiAqL1xuY29uc3QgaGFzT3duUHJvcGVydHkgPSAoKHtoYXNPd25Qcm9wZXJ0eX0pID0+IChvYmosIHByb3ApID0+IGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkoT2JqZWN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1JlZ0V4cCA9IGtpbmRPZlRlc3QoJ1JlZ0V4cCcpO1xuXG5jb25zdCByZWR1Y2VEZXNjcmlwdG9ycyA9IChvYmosIHJlZHVjZXIpID0+IHtcbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopO1xuICBjb25zdCByZWR1Y2VkRGVzY3JpcHRvcnMgPSB7fTtcblxuICBmb3JFYWNoKGRlc2NyaXB0b3JzLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIGxldCByZXQ7XG4gICAgaWYgKChyZXQgPSByZWR1Y2VyKGRlc2NyaXB0b3IsIG5hbWUsIG9iaikpICE9PSBmYWxzZSkge1xuICAgICAgcmVkdWNlZERlc2NyaXB0b3JzW25hbWVdID0gcmV0IHx8IGRlc2NyaXB0b3I7XG4gICAgfVxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHJlZHVjZWREZXNjcmlwdG9ycyk7XG59XG5cbi8qKlxuICogTWFrZXMgYWxsIG1ldGhvZHMgcmVhZC1vbmx5XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKi9cblxuY29uc3QgZnJlZXplTWV0aG9kcyA9IChvYmopID0+IHtcbiAgcmVkdWNlRGVzY3JpcHRvcnMob2JqLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIC8vIHNraXAgcmVzdHJpY3RlZCBwcm9wcyBpbiBzdHJpY3QgbW9kZVxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikgJiYgWydhcmd1bWVudHMnLCAnY2FsbGVyJywgJ2NhbGxlZSddLmluZGV4T2YobmFtZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpbbmFtZV07XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24odmFsdWUpKSByZXR1cm47XG5cbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBmYWxzZTtcblxuICAgIGlmICgnd3JpdGFibGUnIGluIGRlc2NyaXB0b3IpIHtcbiAgICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICBkZXNjcmlwdG9yLnNldCA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kIFxcJycgKyBuYW1lICsgJ1xcJycpO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCB0b09iamVjdFNldCA9IChhcnJheU9yU3RyaW5nLCBkZWxpbWl0ZXIpID0+IHtcbiAgY29uc3Qgb2JqID0ge307XG5cbiAgY29uc3QgZGVmaW5lID0gKGFycikgPT4ge1xuICAgIGFyci5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIG9ialt2YWx1ZV0gPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgaXNBcnJheShhcnJheU9yU3RyaW5nKSA/IGRlZmluZShhcnJheU9yU3RyaW5nKSA6IGRlZmluZShTdHJpbmcoYXJyYXlPclN0cmluZykuc3BsaXQoZGVsaW1pdGVyKSk7XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbmNvbnN0IHRvRmluaXRlTnVtYmVyID0gKHZhbHVlLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlID0gK3ZhbHVlKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlO1xufVxuXG5jb25zdCBBTFBIQSA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidcblxuY29uc3QgRElHSVQgPSAnMDEyMzQ1Njc4OSc7XG5cbmNvbnN0IEFMUEhBQkVUID0ge1xuICBESUdJVCxcbiAgQUxQSEEsXG4gIEFMUEhBX0RJR0lUOiBBTFBIQSArIEFMUEhBLnRvVXBwZXJDYXNlKCkgKyBESUdJVFxufVxuXG5jb25zdCBnZW5lcmF0ZVN0cmluZyA9IChzaXplID0gMTYsIGFscGhhYmV0ID0gQUxQSEFCRVQuQUxQSEFfRElHSVQpID0+IHtcbiAgbGV0IHN0ciA9ICcnO1xuICBjb25zdCB7bGVuZ3RofSA9IGFscGhhYmV0O1xuICB3aGlsZSAoc2l6ZS0tKSB7XG4gICAgc3RyICs9IGFscGhhYmV0W01hdGgucmFuZG9tKCkgKiBsZW5ndGh8MF1cbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogSWYgdGhlIHRoaW5nIGlzIGEgRm9ybURhdGEgb2JqZWN0LCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHRoaW5nIC0gVGhlIHRoaW5nIHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1NwZWNDb21wbGlhbnRGb3JtKHRoaW5nKSB7XG4gIHJldHVybiAhISh0aGluZyAmJiBpc0Z1bmN0aW9uKHRoaW5nLmFwcGVuZCkgJiYgdGhpbmdbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0Zvcm1EYXRhJyAmJiB0aGluZ1tTeW1ib2wuaXRlcmF0b3JdKTtcbn1cblxuY29uc3QgdG9KU09OT2JqZWN0ID0gKG9iaikgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBBcnJheSgxMCk7XG5cbiAgY29uc3QgdmlzaXQgPSAoc291cmNlLCBpKSA9PiB7XG5cbiAgICBpZiAoaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgaWYgKHN0YWNrLmluZGV4T2Yoc291cmNlKSA+PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYoISgndG9KU09OJyBpbiBzb3VyY2UpKSB7XG4gICAgICAgIHN0YWNrW2ldID0gc291cmNlO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBpc0FycmF5KHNvdXJjZSkgPyBbXSA6IHt9O1xuXG4gICAgICAgIGZvckVhY2goc291cmNlLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlZHVjZWRWYWx1ZSA9IHZpc2l0KHZhbHVlLCBpICsgMSk7XG4gICAgICAgICAgIWlzVW5kZWZpbmVkKHJlZHVjZWRWYWx1ZSkgJiYgKHRhcmdldFtrZXldID0gcmVkdWNlZFZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3RhY2tbaV0gPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgcmV0dXJuIHZpc2l0KG9iaiwgMCk7XG59XG5cbmNvbnN0IGlzQXN5bmNGbiA9IGtpbmRPZlRlc3QoJ0FzeW5jRnVuY3Rpb24nKTtcblxuY29uc3QgaXNUaGVuYWJsZSA9ICh0aGluZykgPT5cbiAgdGhpbmcgJiYgKGlzT2JqZWN0KHRoaW5nKSB8fCBpc0Z1bmN0aW9uKHRoaW5nKSkgJiYgaXNGdW5jdGlvbih0aGluZy50aGVuKSAmJiBpc0Z1bmN0aW9uKHRoaW5nLmNhdGNoKTtcblxuLy8gb3JpZ2luYWwgY29kZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0RpZ2l0YWxCcmFpbkpTL0F4aW9zUHJvbWlzZS9ibG9iLzE2ZGVhYjEzNzEwZWMwOTc3OTkyMjEzMWYzZmE1OTU0MzIwZjgzYWIvbGliL3V0aWxzLmpzI0wxMS1MMzRcblxuY29uc3QgX3NldEltbWVkaWF0ZSA9ICgoc2V0SW1tZWRpYXRlU3VwcG9ydGVkLCBwb3N0TWVzc2FnZVN1cHBvcnRlZCkgPT4ge1xuICBpZiAoc2V0SW1tZWRpYXRlU3VwcG9ydGVkKSB7XG4gICAgcmV0dXJuIHNldEltbWVkaWF0ZTtcbiAgfVxuXG4gIHJldHVybiBwb3N0TWVzc2FnZVN1cHBvcnRlZCA/ICgodG9rZW4sIGNhbGxiYWNrcykgPT4ge1xuICAgIF9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKHtzb3VyY2UsIGRhdGF9KSA9PiB7XG4gICAgICBpZiAoc291cmNlID09PSBfZ2xvYmFsICYmIGRhdGEgPT09IHRva2VuKSB7XG4gICAgICAgIGNhbGxiYWNrcy5sZW5ndGggJiYgY2FsbGJhY2tzLnNoaWZ0KCkoKTtcbiAgICAgIH1cbiAgICB9LCBmYWxzZSk7XG5cbiAgICByZXR1cm4gKGNiKSA9PiB7XG4gICAgICBjYWxsYmFja3MucHVzaChjYik7XG4gICAgICBfZ2xvYmFsLnBvc3RNZXNzYWdlKHRva2VuLCBcIipcIik7XG4gICAgfVxuICB9KShgYXhpb3NAJHtNYXRoLnJhbmRvbSgpfWAsIFtdKSA6IChjYikgPT4gc2V0VGltZW91dChjYik7XG59KShcbiAgdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJyxcbiAgaXNGdW5jdGlvbihfZ2xvYmFsLnBvc3RNZXNzYWdlKVxuKTtcblxuY29uc3QgYXNhcCA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayAhPT0gJ3VuZGVmaW5lZCcgP1xuICBxdWV1ZU1pY3JvdGFzay5iaW5kKF9nbG9iYWwpIDogKCB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5uZXh0VGljayB8fCBfc2V0SW1tZWRpYXRlKTtcblxuLy8gKioqKioqKioqKioqKioqKioqKioqXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaXNBcnJheSxcbiAgaXNBcnJheUJ1ZmZlcixcbiAgaXNCdWZmZXIsXG4gIGlzRm9ybURhdGEsXG4gIGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZyxcbiAgaXNOdW1iZXIsXG4gIGlzQm9vbGVhbixcbiAgaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzUmVhZGFibGVTdHJlYW0sXG4gIGlzUmVxdWVzdCxcbiAgaXNSZXNwb25zZSxcbiAgaXNIZWFkZXJzLFxuICBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlLFxuICBpc0ZpbGUsXG4gIGlzQmxvYixcbiAgaXNSZWdFeHAsXG4gIGlzRnVuY3Rpb24sXG4gIGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNUeXBlZEFycmF5LFxuICBpc0ZpbGVMaXN0LFxuICBmb3JFYWNoLFxuICBtZXJnZSxcbiAgZXh0ZW5kLFxuICB0cmltLFxuICBzdHJpcEJPTSxcbiAgaW5oZXJpdHMsXG4gIHRvRmxhdE9iamVjdCxcbiAga2luZE9mLFxuICBraW5kT2ZUZXN0LFxuICBlbmRzV2l0aCxcbiAgdG9BcnJheSxcbiAgZm9yRWFjaEVudHJ5LFxuICBtYXRjaEFsbCxcbiAgaXNIVE1MRm9ybSxcbiAgaGFzT3duUHJvcGVydHksXG4gIGhhc093blByb3A6IGhhc093blByb3BlcnR5LCAvLyBhbiBhbGlhcyB0byBhdm9pZCBFU0xpbnQgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIGRldGVjdGlvblxuICByZWR1Y2VEZXNjcmlwdG9ycyxcbiAgZnJlZXplTWV0aG9kcyxcbiAgdG9PYmplY3RTZXQsXG4gIHRvQ2FtZWxDYXNlLFxuICBub29wLFxuICB0b0Zpbml0ZU51bWJlcixcbiAgZmluZEtleSxcbiAgZ2xvYmFsOiBfZ2xvYmFsLFxuICBpc0NvbnRleHREZWZpbmVkLFxuICBBTFBIQUJFVCxcbiAgZ2VuZXJhdGVTdHJpbmcsXG4gIGlzU3BlY0NvbXBsaWFudEZvcm0sXG4gIHRvSlNPTk9iamVjdCxcbiAgaXNBc3luY0ZuLFxuICBpc1RoZW5hYmxlLFxuICBzZXRJbW1lZGlhdGU6IF9zZXRJbW1lZGlhdGUsXG4gIGFzYXBcbn07XG4iLCJmdW5jdGlvbiByKGUpe3ZhciB0LGYsbj1cIlwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZSluKz1lO2Vsc2UgaWYoXCJvYmplY3RcIj09dHlwZW9mIGUpaWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIG89ZS5sZW5ndGg7Zm9yKHQ9MDt0PG87dCsrKWVbdF0mJihmPXIoZVt0XSkpJiYobiYmKG4rPVwiIFwiKSxuKz1mKX1lbHNlIGZvcihmIGluIGUpZVtmXSYmKG4mJihuKz1cIiBcIiksbis9Zik7cmV0dXJuIG59ZXhwb3J0IGZ1bmN0aW9uIGNsc3goKXtmb3IodmFyIGUsdCxmPTAsbj1cIlwiLG89YXJndW1lbnRzLmxlbmd0aDtmPG87ZisrKShlPWFyZ3VtZW50c1tmXSkmJih0PXIoZSkpJiYobiYmKG4rPVwiIFwiKSxuKz10KTtyZXR1cm4gbn1leHBvcnQgZGVmYXVsdCBjbHN4OyIsInZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBmaW5kKGl0ZXIsIHRhciwga2V5KSB7XG5cdGZvciAoa2V5IG9mIGl0ZXIua2V5cygpKSB7XG5cdFx0aWYgKGRlcXVhbChrZXksIHRhcikpIHJldHVybiBrZXk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlcXVhbChmb28sIGJhcikge1xuXHR2YXIgY3RvciwgbGVuLCB0bXA7XG5cdGlmIChmb28gPT09IGJhcikgcmV0dXJuIHRydWU7XG5cblx0aWYgKGZvbyAmJiBiYXIgJiYgKGN0b3I9Zm9vLmNvbnN0cnVjdG9yKSA9PT0gYmFyLmNvbnN0cnVjdG9yKSB7XG5cdFx0aWYgKGN0b3IgPT09IERhdGUpIHJldHVybiBmb28uZ2V0VGltZSgpID09PSBiYXIuZ2V0VGltZSgpO1xuXHRcdGlmIChjdG9yID09PSBSZWdFeHApIHJldHVybiBmb28udG9TdHJpbmcoKSA9PT0gYmFyLnRvU3RyaW5nKCk7XG5cblx0XHRpZiAoY3RvciA9PT0gQXJyYXkpIHtcblx0XHRcdGlmICgobGVuPWZvby5sZW5ndGgpID09PSBiYXIubGVuZ3RoKSB7XG5cdFx0XHRcdHdoaWxlIChsZW4tLSAmJiBkZXF1YWwoZm9vW2xlbl0sIGJhcltsZW5dKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbGVuID09PSAtMTtcblx0XHR9XG5cblx0XHRpZiAoY3RvciA9PT0gU2V0KSB7XG5cdFx0XHRpZiAoZm9vLnNpemUgIT09IGJhci5zaXplKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGZvciAobGVuIG9mIGZvbykge1xuXHRcdFx0XHR0bXAgPSBsZW47XG5cdFx0XHRcdGlmICh0bXAgJiYgdHlwZW9mIHRtcCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHR0bXAgPSBmaW5kKGJhciwgdG1wKTtcblx0XHRcdFx0XHRpZiAoIXRtcCkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghYmFyLmhhcyh0bXApKSByZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoY3RvciA9PT0gTWFwKSB7XG5cdFx0XHRpZiAoZm9vLnNpemUgIT09IGJhci5zaXplKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGZvciAobGVuIG9mIGZvbykge1xuXHRcdFx0XHR0bXAgPSBsZW5bMF07XG5cdFx0XHRcdGlmICh0bXAgJiYgdHlwZW9mIHRtcCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHR0bXAgPSBmaW5kKGJhciwgdG1wKTtcblx0XHRcdFx0XHRpZiAoIXRtcCkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghZGVxdWFsKGxlblsxXSwgYmFyLmdldCh0bXApKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGN0b3IgPT09IEFycmF5QnVmZmVyKSB7XG5cdFx0XHRmb28gPSBuZXcgVWludDhBcnJheShmb28pO1xuXHRcdFx0YmFyID0gbmV3IFVpbnQ4QXJyYXkoYmFyKTtcblx0XHR9IGVsc2UgaWYgKGN0b3IgPT09IERhdGFWaWV3KSB7XG5cdFx0XHRpZiAoKGxlbj1mb28uYnl0ZUxlbmd0aCkgPT09IGJhci5ieXRlTGVuZ3RoKSB7XG5cdFx0XHRcdHdoaWxlIChsZW4tLSAmJiBmb28uZ2V0SW50OChsZW4pID09PSBiYXIuZ2V0SW50OChsZW4pKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBsZW4gPT09IC0xO1xuXHRcdH1cblxuXHRcdGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZm9vKSkge1xuXHRcdFx0aWYgKChsZW49Zm9vLmJ5dGVMZW5ndGgpID09PSBiYXIuYnl0ZUxlbmd0aCkge1xuXHRcdFx0XHR3aGlsZSAobGVuLS0gJiYgZm9vW2xlbl0gPT09IGJhcltsZW5dKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBsZW4gPT09IC0xO1xuXHRcdH1cblxuXHRcdGlmICghY3RvciB8fCB0eXBlb2YgZm9vID09PSAnb2JqZWN0Jykge1xuXHRcdFx0bGVuID0gMDtcblx0XHRcdGZvciAoY3RvciBpbiBmb28pIHtcblx0XHRcdFx0aWYgKGhhcy5jYWxsKGZvbywgY3RvcikgJiYgKytsZW4gJiYgIWhhcy5jYWxsKGJhciwgY3RvcikpIHJldHVybiBmYWxzZTtcblx0XHRcdFx0aWYgKCEoY3RvciBpbiBiYXIpIHx8ICFkZXF1YWwoZm9vW2N0b3JdLCBiYXJbY3Rvcl0pKSByZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmtleXMoYmFyKS5sZW5ndGggPT09IGxlbjtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZm9vICE9PSBmb28gJiYgYmFyICE9PSBiYXI7XG59XG4iLCJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAcmVhY3QtZG5kL2ludmFyaWFudCc7XG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJy4uLy4uL3V0aWxzL2pzX3V0aWxzLmpzJztcbmltcG9ydCB7IHNldENsaWVudE9mZnNldCB9IGZyb20gJy4vbG9jYWwvc2V0Q2xpZW50T2Zmc2V0LmpzJztcbmltcG9ydCB7IEJFR0lOX0RSQUcsIElOSVRfQ09PUkRTIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5jb25zdCBSZXNldENvb3JkaW5hdGVzQWN0aW9uID0ge1xuICAgIHR5cGU6IElOSVRfQ09PUkRTLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgICAgY2xpZW50T2Zmc2V0OiBudWxsLFxuICAgICAgICBzb3VyY2VDbGllbnRPZmZzZXQ6IG51bGxcbiAgICB9XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJlZ2luRHJhZyhtYW5hZ2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGJlZ2luRHJhZyhzb3VyY2VJZHMgPSBbXSwgb3B0aW9ucyA9IHtcbiAgICAgICAgcHVibGlzaFNvdXJjZTogdHJ1ZVxuICAgIH0pIHtcbiAgICAgICAgY29uc3QgeyBwdWJsaXNoU291cmNlID10cnVlICwgY2xpZW50T2Zmc2V0ICwgZ2V0U291cmNlQ2xpZW50T2Zmc2V0ICwgIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yKCk7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gbWFuYWdlci5nZXRSZWdpc3RyeSgpO1xuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBjb29yZGluYXRlcyB1c2luZyB0aGUgY2xpZW50IG9mZnNldFxuICAgICAgICBtYW5hZ2VyLmRpc3BhdGNoKHNldENsaWVudE9mZnNldChjbGllbnRPZmZzZXQpKTtcbiAgICAgICAgdmVyaWZ5SW52YXJpYW50cyhzb3VyY2VJZHMsIG1vbml0b3IsIHJlZ2lzdHJ5KTtcbiAgICAgICAgLy8gR2V0IHRoZSBkcmFnZ2FibGUgc291cmNlXG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gZ2V0RHJhZ2dhYmxlU291cmNlKHNvdXJjZUlkcywgbW9uaXRvcik7XG4gICAgICAgIGlmIChzb3VyY2VJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBtYW5hZ2VyLmRpc3BhdGNoKFJlc2V0Q29vcmRpbmF0ZXNBY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCB0aGUgc291cmNlIGNsaWVudCBvZmZzZXRcbiAgICAgICAgbGV0IHNvdXJjZUNsaWVudE9mZnNldCA9IG51bGw7XG4gICAgICAgIGlmIChjbGllbnRPZmZzZXQpIHtcbiAgICAgICAgICAgIGlmICghZ2V0U291cmNlQ2xpZW50T2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRTb3VyY2VDbGllbnRPZmZzZXQgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2ZXJpZnlHZXRTb3VyY2VDbGllbnRPZmZzZXRJc0Z1bmN0aW9uKGdldFNvdXJjZUNsaWVudE9mZnNldCk7XG4gICAgICAgICAgICBzb3VyY2VDbGllbnRPZmZzZXQgPSBnZXRTb3VyY2VDbGllbnRPZmZzZXQoc291cmNlSWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZ1bGwgY29vcmRpbmF0ZXNcbiAgICAgICAgbWFuYWdlci5kaXNwYXRjaChzZXRDbGllbnRPZmZzZXQoY2xpZW50T2Zmc2V0LCBzb3VyY2VDbGllbnRPZmZzZXQpKTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gcmVnaXN0cnkuZ2V0U291cmNlKHNvdXJjZUlkKTtcbiAgICAgICAgY29uc3QgaXRlbSA9IHNvdXJjZS5iZWdpbkRyYWcobW9uaXRvciwgc291cmNlSWQpO1xuICAgICAgICAvLyBJZiBzb3VyY2UuYmVnaW5EcmFnIHJldHVybnMgbnVsbCwgdGhpcyBpcyBhbiBpbmRpY2F0b3IgdG8gY2FuY2VsIHRoZSBkcmFnXG4gICAgICAgIGlmIChpdGVtID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmVyaWZ5SXRlbUlzT2JqZWN0KGl0ZW0pO1xuICAgICAgICByZWdpc3RyeS5waW5Tb3VyY2Uoc291cmNlSWQpO1xuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHJlZ2lzdHJ5LmdldFNvdXJjZVR5cGUoc291cmNlSWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogQkVHSU5fRFJBRyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSxcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIHNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIGNsaWVudE9mZnNldDogY2xpZW50T2Zmc2V0IHx8IG51bGwsXG4gICAgICAgICAgICAgICAgc291cmNlQ2xpZW50T2Zmc2V0OiBzb3VyY2VDbGllbnRPZmZzZXQgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBpc1NvdXJjZVB1YmxpYzogISFwdWJsaXNoU291cmNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHZlcmlmeUludmFyaWFudHMoc291cmNlSWRzLCBtb25pdG9yLCByZWdpc3RyeSkge1xuICAgIGludmFyaWFudCghbW9uaXRvci5pc0RyYWdnaW5nKCksICdDYW5ub3QgY2FsbCBiZWdpbkRyYWcgd2hpbGUgZHJhZ2dpbmcuJyk7XG4gICAgc291cmNlSWRzLmZvckVhY2goZnVuY3Rpb24oc291cmNlSWQpIHtcbiAgICAgICAgaW52YXJpYW50KHJlZ2lzdHJ5LmdldFNvdXJjZShzb3VyY2VJZCksICdFeHBlY3RlZCBzb3VyY2VJZHMgdG8gYmUgcmVnaXN0ZXJlZC4nKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHZlcmlmeUdldFNvdXJjZUNsaWVudE9mZnNldElzRnVuY3Rpb24oZ2V0U291cmNlQ2xpZW50T2Zmc2V0KSB7XG4gICAgaW52YXJpYW50KHR5cGVvZiBnZXRTb3VyY2VDbGllbnRPZmZzZXQgPT09ICdmdW5jdGlvbicsICdXaGVuIGNsaWVudE9mZnNldCBpcyBwcm92aWRlZCwgZ2V0U291cmNlQ2xpZW50T2Zmc2V0IG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbn1cbmZ1bmN0aW9uIHZlcmlmeUl0ZW1Jc09iamVjdChpdGVtKSB7XG4gICAgaW52YXJpYW50KGlzT2JqZWN0KGl0ZW0pLCAnSXRlbSBtdXN0IGJlIGFuIG9iamVjdC4nKTtcbn1cbmZ1bmN0aW9uIGdldERyYWdnYWJsZVNvdXJjZShzb3VyY2VJZHMsIG1vbml0b3IpIHtcbiAgICBsZXQgc291cmNlSWQgPSBudWxsO1xuICAgIGZvcihsZXQgaSA9IHNvdXJjZUlkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG4gICAgICAgIGlmIChtb25pdG9yLmNhbkRyYWdTb3VyY2Uoc291cmNlSWRzW2ldKSkge1xuICAgICAgICAgICAgc291cmNlSWQgPSBzb3VyY2VJZHNbaV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc291cmNlSWQ7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJlZ2luRHJhZy5qcy5tYXAiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gICAgZm9yKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgICAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnQHJlYWN0LWRuZC9pbnZhcmlhbnQnO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuLi8uLi91dGlscy9qc191dGlscy5qcyc7XG5pbXBvcnQgeyBEUk9QIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRHJvcChtYW5hZ2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGRyb3Aob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3IoKTtcbiAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBtYW5hZ2VyLmdldFJlZ2lzdHJ5KCk7XG4gICAgICAgIHZlcmlmeUludmFyaWFudHMobW9uaXRvcik7XG4gICAgICAgIGNvbnN0IHRhcmdldElkcyA9IGdldERyb3BwYWJsZVRhcmdldHMobW9uaXRvcik7XG4gICAgICAgIC8vIE11bHRpcGxlIGFjdGlvbnMgYXJlIGRpc3BhdGNoZWQgaGVyZSwgd2hpY2ggaXMgd2h5IHRoaXMgZG9lc24ndCByZXR1cm4gYW4gYWN0aW9uXG4gICAgICAgIHRhcmdldElkcy5mb3JFYWNoKCh0YXJnZXRJZCwgaW5kZXgpPT57XG4gICAgICAgICAgICBjb25zdCBkcm9wUmVzdWx0ID0gZGV0ZXJtaW5lRHJvcFJlc3VsdCh0YXJnZXRJZCwgaW5kZXgsIHJlZ2lzdHJ5LCBtb25pdG9yKTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBEUk9QLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgZHJvcFJlc3VsdDogX29iamVjdFNwcmVhZCh7fSwgb3B0aW9ucywgZHJvcFJlc3VsdClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWFuYWdlci5kaXNwYXRjaChhY3Rpb24pO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdmVyaWZ5SW52YXJpYW50cyhtb25pdG9yKSB7XG4gICAgaW52YXJpYW50KG1vbml0b3IuaXNEcmFnZ2luZygpLCAnQ2Fubm90IGNhbGwgZHJvcCB3aGlsZSBub3QgZHJhZ2dpbmcuJyk7XG4gICAgaW52YXJpYW50KCFtb25pdG9yLmRpZERyb3AoKSwgJ0Nhbm5vdCBjYWxsIGRyb3AgdHdpY2UgZHVyaW5nIG9uZSBkcmFnIG9wZXJhdGlvbi4nKTtcbn1cbmZ1bmN0aW9uIGRldGVybWluZURyb3BSZXN1bHQodGFyZ2V0SWQsIGluZGV4LCByZWdpc3RyeSwgbW9uaXRvcikge1xuICAgIGNvbnN0IHRhcmdldCA9IHJlZ2lzdHJ5LmdldFRhcmdldCh0YXJnZXRJZCk7XG4gICAgbGV0IGRyb3BSZXN1bHQgPSB0YXJnZXQgPyB0YXJnZXQuZHJvcChtb25pdG9yLCB0YXJnZXRJZCkgOiB1bmRlZmluZWQ7XG4gICAgdmVyaWZ5RHJvcFJlc3VsdFR5cGUoZHJvcFJlc3VsdCk7XG4gICAgaWYgKHR5cGVvZiBkcm9wUmVzdWx0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkcm9wUmVzdWx0ID0gaW5kZXggPT09IDAgPyB7fSA6IG1vbml0b3IuZ2V0RHJvcFJlc3VsdCgpO1xuICAgIH1cbiAgICByZXR1cm4gZHJvcFJlc3VsdDtcbn1cbmZ1bmN0aW9uIHZlcmlmeURyb3BSZXN1bHRUeXBlKGRyb3BSZXN1bHQpIHtcbiAgICBpbnZhcmlhbnQodHlwZW9mIGRyb3BSZXN1bHQgPT09ICd1bmRlZmluZWQnIHx8IGlzT2JqZWN0KGRyb3BSZXN1bHQpLCAnRHJvcCByZXN1bHQgbXVzdCBlaXRoZXIgYmUgYW4gb2JqZWN0IG9yIHVuZGVmaW5lZC4nKTtcbn1cbmZ1bmN0aW9uIGdldERyb3BwYWJsZVRhcmdldHMobW9uaXRvcikge1xuICAgIGNvbnN0IHRhcmdldElkcyA9IG1vbml0b3IuZ2V0VGFyZ2V0SWRzKCkuZmlsdGVyKG1vbml0b3IuY2FuRHJvcE9uVGFyZ2V0LCBtb25pdG9yKTtcbiAgICB0YXJnZXRJZHMucmV2ZXJzZSgpO1xuICAgIHJldHVybiB0YXJnZXRJZHM7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRyb3AuanMubWFwIiwiaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnQHJlYWN0LWRuZC9pbnZhcmlhbnQnO1xuaW1wb3J0IHsgRU5EX0RSQUcgfSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbmREcmFnKG1hbmFnZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZW5kRHJhZygpIHtcbiAgICAgICAgY29uc3QgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvcigpO1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IG1hbmFnZXIuZ2V0UmVnaXN0cnkoKTtcbiAgICAgICAgdmVyaWZ5SXNEcmFnZ2luZyhtb25pdG9yKTtcbiAgICAgICAgY29uc3Qgc291cmNlSWQgPSBtb25pdG9yLmdldFNvdXJjZUlkKCk7XG4gICAgICAgIGlmIChzb3VyY2VJZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSByZWdpc3RyeS5nZXRTb3VyY2Uoc291cmNlSWQsIHRydWUpO1xuICAgICAgICAgICAgc291cmNlLmVuZERyYWcobW9uaXRvciwgc291cmNlSWQpO1xuICAgICAgICAgICAgcmVnaXN0cnkudW5waW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogRU5EX0RSQUdcbiAgICAgICAgfTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdmVyaWZ5SXNEcmFnZ2luZyhtb25pdG9yKSB7XG4gICAgaW52YXJpYW50KG1vbml0b3IuaXNEcmFnZ2luZygpLCAnQ2Fubm90IGNhbGwgZW5kRHJhZyB3aGlsZSBub3QgZHJhZ2dpbmcuJyk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVuZERyYWcuanMubWFwIiwiaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnQHJlYWN0LWRuZC9pbnZhcmlhbnQnO1xuaW1wb3J0IHsgbWF0Y2hlc1R5cGUgfSBmcm9tICcuLi8uLi91dGlscy9tYXRjaGVzVHlwZS5qcyc7XG5pbXBvcnQgeyBIT1ZFUiB9IGZyb20gJy4vdHlwZXMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvdmVyKG1hbmFnZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaG92ZXIodGFyZ2V0SWRzQXJnLCB7IGNsaWVudE9mZnNldCAgfSA9IHt9KSB7XG4gICAgICAgIHZlcmlmeVRhcmdldElkc0lzQXJyYXkodGFyZ2V0SWRzQXJnKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0SWRzID0gdGFyZ2V0SWRzQXJnLnNsaWNlKDApO1xuICAgICAgICBjb25zdCBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yKCk7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gbWFuYWdlci5nZXRSZWdpc3RyeSgpO1xuICAgICAgICBjb25zdCBkcmFnZ2VkSXRlbVR5cGUgPSBtb25pdG9yLmdldEl0ZW1UeXBlKCk7XG4gICAgICAgIHJlbW92ZU5vbk1hdGNoaW5nVGFyZ2V0SWRzKHRhcmdldElkcywgcmVnaXN0cnksIGRyYWdnZWRJdGVtVHlwZSk7XG4gICAgICAgIGNoZWNrSW52YXJpYW50cyh0YXJnZXRJZHMsIG1vbml0b3IsIHJlZ2lzdHJ5KTtcbiAgICAgICAgaG92ZXJBbGxUYXJnZXRzKHRhcmdldElkcywgbW9uaXRvciwgcmVnaXN0cnkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogSE9WRVIsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0SWRzLFxuICAgICAgICAgICAgICAgIGNsaWVudE9mZnNldDogY2xpZW50T2Zmc2V0IHx8IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdmVyaWZ5VGFyZ2V0SWRzSXNBcnJheSh0YXJnZXRJZHNBcmcpIHtcbiAgICBpbnZhcmlhbnQoQXJyYXkuaXNBcnJheSh0YXJnZXRJZHNBcmcpLCAnRXhwZWN0ZWQgdGFyZ2V0SWRzIHRvIGJlIGFuIGFycmF5LicpO1xufVxuZnVuY3Rpb24gY2hlY2tJbnZhcmlhbnRzKHRhcmdldElkcywgbW9uaXRvciwgcmVnaXN0cnkpIHtcbiAgICBpbnZhcmlhbnQobW9uaXRvci5pc0RyYWdnaW5nKCksICdDYW5ub3QgY2FsbCBob3ZlciB3aGlsZSBub3QgZHJhZ2dpbmcuJyk7XG4gICAgaW52YXJpYW50KCFtb25pdG9yLmRpZERyb3AoKSwgJ0Nhbm5vdCBjYWxsIGhvdmVyIGFmdGVyIGRyb3AuJyk7XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHRhcmdldElkcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGNvbnN0IHRhcmdldElkID0gdGFyZ2V0SWRzW2ldO1xuICAgICAgICBpbnZhcmlhbnQodGFyZ2V0SWRzLmxhc3RJbmRleE9mKHRhcmdldElkKSA9PT0gaSwgJ0V4cGVjdGVkIHRhcmdldElkcyB0byBiZSB1bmlxdWUgaW4gdGhlIHBhc3NlZCBhcnJheS4nKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcmVnaXN0cnkuZ2V0VGFyZ2V0KHRhcmdldElkKTtcbiAgICAgICAgaW52YXJpYW50KHRhcmdldCwgJ0V4cGVjdGVkIHRhcmdldElkcyB0byBiZSByZWdpc3RlcmVkLicpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZU5vbk1hdGNoaW5nVGFyZ2V0SWRzKHRhcmdldElkcywgcmVnaXN0cnksIGRyYWdnZWRJdGVtVHlwZSkge1xuICAgIC8vIFJlbW92ZSB0aG9zZSB0YXJnZXRJZHMgdGhhdCBkb24ndCBtYXRjaCB0aGUgdGFyZ2V0VHlwZS4gIFRoaXNcbiAgICAvLyBmaXhlcyBzaGFsbG93IGlzT3ZlciB3aGljaCB3b3VsZCBvbmx5IGJlIG5vbi1zaGFsbG93IGJlY2F1c2Ugb2ZcbiAgICAvLyBub24tbWF0Y2hpbmcgdGFyZ2V0cy5cbiAgICBmb3IobGV0IGkgPSB0YXJnZXRJZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuICAgICAgICBjb25zdCB0YXJnZXRJZCA9IHRhcmdldElkc1tpXTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VHlwZSA9IHJlZ2lzdHJ5LmdldFRhcmdldFR5cGUodGFyZ2V0SWQpO1xuICAgICAgICBpZiAoIW1hdGNoZXNUeXBlKHRhcmdldFR5cGUsIGRyYWdnZWRJdGVtVHlwZSkpIHtcbiAgICAgICAgICAgIHRhcmdldElkcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBob3ZlckFsbFRhcmdldHModGFyZ2V0SWRzLCBtb25pdG9yLCByZWdpc3RyeSkge1xuICAgIC8vIEZpbmFsbHkgY2FsbCBob3ZlciBvbiBhbGwgbWF0Y2hpbmcgdGFyZ2V0cy5cbiAgICB0YXJnZXRJZHMuZm9yRWFjaChmdW5jdGlvbih0YXJnZXRJZCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSByZWdpc3RyeS5nZXRUYXJnZXQodGFyZ2V0SWQpO1xuICAgICAgICB0YXJnZXQuaG92ZXIobW9uaXRvciwgdGFyZ2V0SWQpO1xuICAgIH0pO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1ob3Zlci5qcy5tYXAiLCJpbXBvcnQgeyBjcmVhdGVCZWdpbkRyYWcgfSBmcm9tICcuL2JlZ2luRHJhZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVEcm9wIH0gZnJvbSAnLi9kcm9wLmpzJztcbmltcG9ydCB7IGNyZWF0ZUVuZERyYWcgfSBmcm9tICcuL2VuZERyYWcuanMnO1xuaW1wb3J0IHsgY3JlYXRlSG92ZXIgfSBmcm9tICcuL2hvdmVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZVB1Ymxpc2hEcmFnU291cmNlIH0gZnJvbSAnLi9wdWJsaXNoRHJhZ1NvdXJjZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEcmFnRHJvcEFjdGlvbnMobWFuYWdlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGJlZ2luRHJhZzogY3JlYXRlQmVnaW5EcmFnKG1hbmFnZXIpLFxuICAgICAgICBwdWJsaXNoRHJhZ1NvdXJjZTogY3JlYXRlUHVibGlzaERyYWdTb3VyY2UobWFuYWdlciksXG4gICAgICAgIGhvdmVyOiBjcmVhdGVIb3ZlcihtYW5hZ2VyKSxcbiAgICAgICAgZHJvcDogY3JlYXRlRHJvcChtYW5hZ2VyKSxcbiAgICAgICAgZW5kRHJhZzogY3JlYXRlRW5kRHJhZyhtYW5hZ2VyKVxuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IElOSVRfQ09PUkRTIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHNldENsaWVudE9mZnNldChjbGllbnRPZmZzZXQsIHNvdXJjZUNsaWVudE9mZnNldCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IElOSVRfQ09PUkRTLFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBzb3VyY2VDbGllbnRPZmZzZXQ6IHNvdXJjZUNsaWVudE9mZnNldCB8fCBudWxsLFxuICAgICAgICAgICAgY2xpZW50T2Zmc2V0OiBjbGllbnRPZmZzZXQgfHwgbnVsbFxuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2V0Q2xpZW50T2Zmc2V0LmpzLm1hcCIsImltcG9ydCB7IFBVQkxJU0hfRFJBR19TT1VSQ0UgfSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQdWJsaXNoRHJhZ1NvdXJjZShtYW5hZ2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHB1Ymxpc2hEcmFnU291cmNlKCkge1xuICAgICAgICBjb25zdCBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yKCk7XG4gICAgICAgIGlmIChtb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBQVUJMSVNIX0RSQUdfU09VUkNFXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1wdWJsaXNoRHJhZ1NvdXJjZS5qcy5tYXAiLCJleHBvcnQgY29uc3QgSU5JVF9DT09SRFMgPSAnZG5kLWNvcmUvSU5JVF9DT09SRFMnO1xuZXhwb3J0IGNvbnN0IEJFR0lOX0RSQUcgPSAnZG5kLWNvcmUvQkVHSU5fRFJBRyc7XG5leHBvcnQgY29uc3QgUFVCTElTSF9EUkFHX1NPVVJDRSA9ICdkbmQtY29yZS9QVUJMSVNIX0RSQUdfU09VUkNFJztcbmV4cG9ydCBjb25zdCBIT1ZFUiA9ICdkbmQtY29yZS9IT1ZFUic7XG5leHBvcnQgY29uc3QgRFJPUCA9ICdkbmQtY29yZS9EUk9QJztcbmV4cG9ydCBjb25zdCBFTkRfRFJBRyA9ICdkbmQtY29yZS9FTkRfRFJBRyc7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCIsImV4cG9ydCBjb25zdCBBRERfU09VUkNFID0gJ2RuZC1jb3JlL0FERF9TT1VSQ0UnO1xuZXhwb3J0IGNvbnN0IEFERF9UQVJHRVQgPSAnZG5kLWNvcmUvQUREX1RBUkdFVCc7XG5leHBvcnQgY29uc3QgUkVNT1ZFX1NPVVJDRSA9ICdkbmQtY29yZS9SRU1PVkVfU09VUkNFJztcbmV4cG9ydCBjb25zdCBSRU1PVkVfVEFSR0VUID0gJ2RuZC1jb3JlL1JFTU9WRV9UQVJHRVQnO1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFNvdXJjZShzb3VyY2VJZCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IEFERF9TT1VSQ0UsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIHNvdXJjZUlkXG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRhcmdldCh0YXJnZXRJZCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IEFERF9UQVJHRVQsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIHRhcmdldElkXG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVNvdXJjZShzb3VyY2VJZCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFJFTU9WRV9TT1VSQ0UsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIHNvdXJjZUlkXG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRhcmdldCh0YXJnZXRJZCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFJFTU9WRV9UQVJHRVQsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIHRhcmdldElkXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWdpc3RyeS5qcy5tYXAiLCJpbXBvcnQgeyBjcmVhdGVEcmFnRHJvcEFjdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2RyYWdEcm9wL2luZGV4LmpzJztcbmV4cG9ydCBjbGFzcyBEcmFnRHJvcE1hbmFnZXJJbXBsIHtcbiAgICByZWNlaXZlQmFja2VuZChiYWNrZW5kKSB7XG4gICAgICAgIHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgfVxuICAgIGdldE1vbml0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbml0b3I7XG4gICAgfVxuICAgIGdldEJhY2tlbmQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhY2tlbmQ7XG4gICAgfVxuICAgIGdldFJlZ2lzdHJ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb25pdG9yLnJlZ2lzdHJ5O1xuICAgIH1cbiAgICBnZXRBY3Rpb25zKCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXMgKi8gY29uc3QgbWFuYWdlciA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgZGlzcGF0Y2ggIH0gPSB0aGlzLnN0b3JlO1xuICAgICAgICBmdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gKC4uLmFyZ3MpPT57XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gYWN0aW9uQ3JlYXRvci5hcHBseShtYW5hZ2VyLCBhcmdzKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goYWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSBjcmVhdGVEcmFnRHJvcEFjdGlvbnModGhpcyk7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhY3Rpb25zKS5yZWR1Y2UoKGJvdW5kQWN0aW9ucywga2V5KT0+e1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gYWN0aW9uc1trZXldO1xuICAgICAgICAgICAgYm91bmRBY3Rpb25zW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGJvdW5kQWN0aW9ucztcbiAgICAgICAgfSwge30pO1xuICAgIH1cbiAgICBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChhY3Rpb24pO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihzdG9yZSwgbW9uaXRvcil7XG4gICAgICAgIHRoaXMuaXNTZXRVcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhhbmRsZVJlZkNvdW50Q2hhbmdlID0gKCk9PntcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFNldFVwID0gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLnJlZkNvdW50ID4gMDtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhY2tlbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2V0VXAgJiYgIXRoaXMuaXNTZXRVcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2tlbmQuc2V0dXAoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NldFVwID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzaG91bGRTZXRVcCAmJiB0aGlzLmlzU2V0VXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kLnRlYXJkb3duKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZXRVcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgICAgICB0aGlzLm1vbml0b3IgPSBtb25pdG9yO1xuICAgICAgICBzdG9yZS5zdWJzY3JpYmUodGhpcy5oYW5kbGVSZWZDb3VudENoYW5nZSk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EcmFnRHJvcE1hbmFnZXJJbXBsLmpzLm1hcCIsImltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0ByZWFjdC1kbmQvaW52YXJpYW50JztcbmltcG9ydCB7IGdldERpZmZlcmVuY2VGcm9tSW5pdGlhbE9mZnNldCwgZ2V0U291cmNlQ2xpZW50T2Zmc2V0IH0gZnJvbSAnLi4vdXRpbHMvY29vcmRzLmpzJztcbmltcG9ydCB7IGFyZURpcnR5IH0gZnJvbSAnLi4vdXRpbHMvZGlydGluZXNzLmpzJztcbmltcG9ydCB7IG1hdGNoZXNUeXBlIH0gZnJvbSAnLi4vdXRpbHMvbWF0Y2hlc1R5cGUuanMnO1xuZXhwb3J0IGNsYXNzIERyYWdEcm9wTW9uaXRvckltcGwge1xuICAgIHN1YnNjcmliZVRvU3RhdGVDaGFuZ2UobGlzdGVuZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGhhbmRsZXJJZHMgIH0gPSBvcHRpb25zO1xuICAgICAgICBpbnZhcmlhbnQodHlwZW9mIGxpc3RlbmVyID09PSAnZnVuY3Rpb24nLCAnbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgICAgICBpbnZhcmlhbnQodHlwZW9mIGhhbmRsZXJJZHMgPT09ICd1bmRlZmluZWQnIHx8IEFycmF5LmlzQXJyYXkoaGFuZGxlcklkcyksICdoYW5kbGVySWRzLCB3aGVuIHNwZWNpZmllZCwgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLicpO1xuICAgICAgICBsZXQgcHJldlN0YXRlSWQgPSB0aGlzLnN0b3JlLmdldFN0YXRlKCkuc3RhdGVJZDtcbiAgICAgICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKCk9PntcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlSWQgPSBzdGF0ZS5zdGF0ZUlkO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYW5Ta2lwTGlzdGVuZXIgPSBjdXJyZW50U3RhdGVJZCA9PT0gcHJldlN0YXRlSWQgfHwgY3VycmVudFN0YXRlSWQgPT09IHByZXZTdGF0ZUlkICsgMSAmJiAhYXJlRGlydHkoc3RhdGUuZGlydHlIYW5kbGVySWRzLCBoYW5kbGVySWRzKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNhblNraXBMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgICAgICBwcmV2U3RhdGVJZCA9IGN1cnJlbnRTdGF0ZUlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5zdWJzY3JpYmUoaGFuZGxlQ2hhbmdlKTtcbiAgICB9XG4gICAgc3Vic2NyaWJlVG9PZmZzZXRDaGFuZ2UobGlzdGVuZXIpIHtcbiAgICAgICAgaW52YXJpYW50KHR5cGVvZiBsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJywgJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICAgICAgbGV0IHByZXZpb3VzU3RhdGUgPSB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldDtcbiAgICAgICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKCk9PntcbiAgICAgICAgICAgIGNvbnN0IG5leHRTdGF0ZSA9IHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT2Zmc2V0O1xuICAgICAgICAgICAgaWYgKG5leHRTdGF0ZSA9PT0gcHJldmlvdXNTdGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzU3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgICAgICAgICBsaXN0ZW5lcigpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5zdWJzY3JpYmUoaGFuZGxlQ2hhbmdlKTtcbiAgICB9XG4gICAgY2FuRHJhZ1NvdXJjZShzb3VyY2VJZCkge1xuICAgICAgICBpZiAoIXNvdXJjZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5yZWdpc3RyeS5nZXRTb3VyY2Uoc291cmNlSWQpO1xuICAgICAgICBpbnZhcmlhbnQoc291cmNlLCBgRXhwZWN0ZWQgdG8gZmluZCBhIHZhbGlkIHNvdXJjZS4gc291cmNlSWQ9JHtzb3VyY2VJZH1gKTtcbiAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZS5jYW5EcmFnKHRoaXMsIHNvdXJjZUlkKTtcbiAgICB9XG4gICAgY2FuRHJvcE9uVGFyZ2V0KHRhcmdldElkKSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCBvbiBpbml0aWFsIHJlbmRlclxuICAgICAgICBpZiAoIXRhcmdldElkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZWdpc3RyeS5nZXRUYXJnZXQodGFyZ2V0SWQpO1xuICAgICAgICBpbnZhcmlhbnQodGFyZ2V0LCBgRXhwZWN0ZWQgdG8gZmluZCBhIHZhbGlkIHRhcmdldC4gdGFyZ2V0SWQ9JHt0YXJnZXRJZH1gKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcoKSB8fCB0aGlzLmRpZERyb3AoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldFR5cGUgPSB0aGlzLnJlZ2lzdHJ5LmdldFRhcmdldFR5cGUodGFyZ2V0SWQpO1xuICAgICAgICBjb25zdCBkcmFnZ2VkSXRlbVR5cGUgPSB0aGlzLmdldEl0ZW1UeXBlKCk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzVHlwZSh0YXJnZXRUeXBlLCBkcmFnZ2VkSXRlbVR5cGUpICYmIHRhcmdldC5jYW5Ecm9wKHRoaXMsIHRhcmdldElkKTtcbiAgICB9XG4gICAgaXNEcmFnZ2luZygpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5nZXRJdGVtVHlwZSgpKTtcbiAgICB9XG4gICAgaXNEcmFnZ2luZ1NvdXJjZShzb3VyY2VJZCkge1xuICAgICAgICAvLyB1bmRlZmluZWQgb24gaW5pdGlhbCByZW5kZXJcbiAgICAgICAgaWYgKCFzb3VyY2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMucmVnaXN0cnkuZ2V0U291cmNlKHNvdXJjZUlkLCB0cnVlKTtcbiAgICAgICAgaW52YXJpYW50KHNvdXJjZSwgYEV4cGVjdGVkIHRvIGZpbmQgYSB2YWxpZCBzb3VyY2UuIHNvdXJjZUlkPSR7c291cmNlSWR9YCk7XG4gICAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKCkgfHwgIXRoaXMuaXNTb3VyY2VQdWJsaWMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSB0aGlzLnJlZ2lzdHJ5LmdldFNvdXJjZVR5cGUoc291cmNlSWQpO1xuICAgICAgICBjb25zdCBkcmFnZ2VkSXRlbVR5cGUgPSB0aGlzLmdldEl0ZW1UeXBlKCk7XG4gICAgICAgIGlmIChzb3VyY2VUeXBlICE9PSBkcmFnZ2VkSXRlbVR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlLmlzRHJhZ2dpbmcodGhpcywgc291cmNlSWQpO1xuICAgIH1cbiAgICBpc092ZXJUYXJnZXQodGFyZ2V0SWQsIG9wdGlvbnMgPSB7XG4gICAgICAgIHNoYWxsb3c6IGZhbHNlXG4gICAgfSkge1xuICAgICAgICAvLyB1bmRlZmluZWQgb24gaW5pdGlhbCByZW5kZXJcbiAgICAgICAgaWYgKCF0YXJnZXRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc2hhbGxvdyAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXRUeXBlID0gdGhpcy5yZWdpc3RyeS5nZXRUYXJnZXRUeXBlKHRhcmdldElkKTtcbiAgICAgICAgY29uc3QgZHJhZ2dlZEl0ZW1UeXBlID0gdGhpcy5nZXRJdGVtVHlwZSgpO1xuICAgICAgICBpZiAoZHJhZ2dlZEl0ZW1UeXBlICYmICFtYXRjaGVzVHlwZSh0YXJnZXRUeXBlLCBkcmFnZ2VkSXRlbVR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFyZ2V0SWRzID0gdGhpcy5nZXRUYXJnZXRJZHMoKTtcbiAgICAgICAgaWYgKCF0YXJnZXRJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSB0YXJnZXRJZHMuaW5kZXhPZih0YXJnZXRJZCk7XG4gICAgICAgIGlmIChzaGFsbG93KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXggPT09IHRhcmdldElkcy5sZW5ndGggLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGluZGV4ID4gLTE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0SXRlbVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09wZXJhdGlvbi5pdGVtVHlwZTtcbiAgICB9XG4gICAgZ2V0SXRlbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT3BlcmF0aW9uLml0ZW07XG4gICAgfVxuICAgIGdldFNvdXJjZUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPcGVyYXRpb24uc291cmNlSWQ7XG4gICAgfVxuICAgIGdldFRhcmdldElkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT3BlcmF0aW9uLnRhcmdldElkcztcbiAgICB9XG4gICAgZ2V0RHJvcFJlc3VsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT3BlcmF0aW9uLmRyb3BSZXN1bHQ7XG4gICAgfVxuICAgIGRpZERyb3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09wZXJhdGlvbi5kaWREcm9wO1xuICAgIH1cbiAgICBpc1NvdXJjZVB1YmxpYygpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPcGVyYXRpb24uaXNTb3VyY2VQdWJsaWMpO1xuICAgIH1cbiAgICBnZXRJbml0aWFsQ2xpZW50T2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPZmZzZXQuaW5pdGlhbENsaWVudE9mZnNldDtcbiAgICB9XG4gICAgZ2V0SW5pdGlhbFNvdXJjZUNsaWVudE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT2Zmc2V0LmluaXRpYWxTb3VyY2VDbGllbnRPZmZzZXQ7XG4gICAgfVxuICAgIGdldENsaWVudE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT2Zmc2V0LmNsaWVudE9mZnNldDtcbiAgICB9XG4gICAgZ2V0U291cmNlQ2xpZW50T2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gZ2V0U291cmNlQ2xpZW50T2Zmc2V0KHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0RGlmZmVyZW5jZUZyb21Jbml0aWFsT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gZ2V0RGlmZmVyZW5jZUZyb21Jbml0aWFsT2Zmc2V0KHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT2Zmc2V0KTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc3RvcmUsIHJlZ2lzdHJ5KXtcbiAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EcmFnRHJvcE1vbml0b3JJbXBsLmpzLm1hcCIsImltcG9ydCB7IGFzYXAgfSBmcm9tICdAcmVhY3QtZG5kL2FzYXAnO1xuaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnQHJlYWN0LWRuZC9pbnZhcmlhbnQnO1xuaW1wb3J0IHsgYWRkU291cmNlLCBhZGRUYXJnZXQsIHJlbW92ZVNvdXJjZSwgcmVtb3ZlVGFyZ2V0IH0gZnJvbSAnLi4vYWN0aW9ucy9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVNvdXJjZUNvbnRyYWN0LCB2YWxpZGF0ZVRhcmdldENvbnRyYWN0LCB2YWxpZGF0ZVR5cGUgfSBmcm9tICcuLi9jb250cmFjdHMuanMnO1xuaW1wb3J0IHsgSGFuZGxlclJvbGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzLmpzJztcbmltcG9ydCB7IGdldE5leHRVbmlxdWVJZCB9IGZyb20gJy4uL3V0aWxzL2dldE5leHRVbmlxdWVJZC5qcyc7XG5mdW5jdGlvbiBnZXROZXh0SGFuZGxlcklkKHJvbGUpIHtcbiAgICBjb25zdCBpZCA9IGdldE5leHRVbmlxdWVJZCgpLnRvU3RyaW5nKCk7XG4gICAgc3dpdGNoKHJvbGUpe1xuICAgICAgICBjYXNlIEhhbmRsZXJSb2xlLlNPVVJDRTpcbiAgICAgICAgICAgIHJldHVybiBgUyR7aWR9YDtcbiAgICAgICAgY2FzZSBIYW5kbGVyUm9sZS5UQVJHRVQ6XG4gICAgICAgICAgICByZXR1cm4gYFQke2lkfWA7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSGFuZGxlciBSb2xlOiAke3JvbGV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VSb2xlRnJvbUhhbmRsZXJJZChoYW5kbGVySWQpIHtcbiAgICBzd2l0Y2goaGFuZGxlcklkWzBdKXtcbiAgICAgICAgY2FzZSAnUyc6XG4gICAgICAgICAgICByZXR1cm4gSGFuZGxlclJvbGUuU09VUkNFO1xuICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgIHJldHVybiBIYW5kbGVyUm9sZS5UQVJHRVQ7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSBoYW5kbGVyIElEOiAke2hhbmRsZXJJZH1gKTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYXBDb250YWluc1ZhbHVlKG1hcCwgc2VhcmNoVmFsdWUpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gbWFwLmVudHJpZXMoKTtcbiAgICBsZXQgaXNEb25lID0gZmFsc2U7XG4gICAgZG8ge1xuICAgICAgICBjb25zdCB7IGRvbmUgLCB2YWx1ZTogWywgdmFsdWVdICwgIH0gPSBlbnRyaWVzLm5leHQoKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBzZWFyY2hWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaXNEb25lID0gISFkb25lO1xuICAgIH13aGlsZSAoIWlzRG9uZSlcbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgY2xhc3MgSGFuZGxlclJlZ2lzdHJ5SW1wbCB7XG4gICAgYWRkU291cmNlKHR5cGUsIHNvdXJjZSkge1xuICAgICAgICB2YWxpZGF0ZVR5cGUodHlwZSk7XG4gICAgICAgIHZhbGlkYXRlU291cmNlQ29udHJhY3Qoc291cmNlKTtcbiAgICAgICAgY29uc3Qgc291cmNlSWQgPSB0aGlzLmFkZEhhbmRsZXIoSGFuZGxlclJvbGUuU09VUkNFLCB0eXBlLCBzb3VyY2UpO1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGFkZFNvdXJjZShzb3VyY2VJZCkpO1xuICAgICAgICByZXR1cm4gc291cmNlSWQ7XG4gICAgfVxuICAgIGFkZFRhcmdldCh0eXBlLCB0YXJnZXQpIHtcbiAgICAgICAgdmFsaWRhdGVUeXBlKHR5cGUsIHRydWUpO1xuICAgICAgICB2YWxpZGF0ZVRhcmdldENvbnRyYWN0KHRhcmdldCk7XG4gICAgICAgIGNvbnN0IHRhcmdldElkID0gdGhpcy5hZGRIYW5kbGVyKEhhbmRsZXJSb2xlLlRBUkdFVCwgdHlwZSwgdGFyZ2V0KTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChhZGRUYXJnZXQodGFyZ2V0SWQpKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldElkO1xuICAgIH1cbiAgICBjb250YWluc0hhbmRsZXIoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gbWFwQ29udGFpbnNWYWx1ZSh0aGlzLmRyYWdTb3VyY2VzLCBoYW5kbGVyKSB8fCBtYXBDb250YWluc1ZhbHVlKHRoaXMuZHJvcFRhcmdldHMsIGhhbmRsZXIpO1xuICAgIH1cbiAgICBnZXRTb3VyY2Uoc291cmNlSWQsIGluY2x1ZGVQaW5uZWQgPSBmYWxzZSkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1NvdXJjZUlkKHNvdXJjZUlkKSwgJ0V4cGVjdGVkIGEgdmFsaWQgc291cmNlIElELicpO1xuICAgICAgICBjb25zdCBpc1Bpbm5lZCA9IGluY2x1ZGVQaW5uZWQgJiYgc291cmNlSWQgPT09IHRoaXMucGlubmVkU291cmNlSWQ7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGlzUGlubmVkID8gdGhpcy5waW5uZWRTb3VyY2UgOiB0aGlzLmRyYWdTb3VyY2VzLmdldChzb3VyY2VJZCk7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuICAgIGdldFRhcmdldCh0YXJnZXRJZCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1RhcmdldElkKHRhcmdldElkKSwgJ0V4cGVjdGVkIGEgdmFsaWQgdGFyZ2V0IElELicpO1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wVGFyZ2V0cy5nZXQodGFyZ2V0SWQpO1xuICAgIH1cbiAgICBnZXRTb3VyY2VUeXBlKHNvdXJjZUlkKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzU291cmNlSWQoc291cmNlSWQpLCAnRXhwZWN0ZWQgYSB2YWxpZCBzb3VyY2UgSUQuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVzLmdldChzb3VyY2VJZCk7XG4gICAgfVxuICAgIGdldFRhcmdldFR5cGUodGFyZ2V0SWQpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNUYXJnZXRJZCh0YXJnZXRJZCksICdFeHBlY3RlZCBhIHZhbGlkIHRhcmdldCBJRC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZXMuZ2V0KHRhcmdldElkKTtcbiAgICB9XG4gICAgaXNTb3VyY2VJZChoYW5kbGVySWQpIHtcbiAgICAgICAgY29uc3Qgcm9sZSA9IHBhcnNlUm9sZUZyb21IYW5kbGVySWQoaGFuZGxlcklkKTtcbiAgICAgICAgcmV0dXJuIHJvbGUgPT09IEhhbmRsZXJSb2xlLlNPVVJDRTtcbiAgICB9XG4gICAgaXNUYXJnZXRJZChoYW5kbGVySWQpIHtcbiAgICAgICAgY29uc3Qgcm9sZSA9IHBhcnNlUm9sZUZyb21IYW5kbGVySWQoaGFuZGxlcklkKTtcbiAgICAgICAgcmV0dXJuIHJvbGUgPT09IEhhbmRsZXJSb2xlLlRBUkdFVDtcbiAgICB9XG4gICAgcmVtb3ZlU291cmNlKHNvdXJjZUlkKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmdldFNvdXJjZShzb3VyY2VJZCksICdFeHBlY3RlZCBhbiBleGlzdGluZyBzb3VyY2UuJyk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gocmVtb3ZlU291cmNlKHNvdXJjZUlkKSk7XG4gICAgICAgIGFzYXAoKCk9PntcbiAgICAgICAgICAgIHRoaXMuZHJhZ1NvdXJjZXMuZGVsZXRlKHNvdXJjZUlkKTtcbiAgICAgICAgICAgIHRoaXMudHlwZXMuZGVsZXRlKHNvdXJjZUlkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZVRhcmdldCh0YXJnZXRJZCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5nZXRUYXJnZXQodGFyZ2V0SWQpLCAnRXhwZWN0ZWQgYW4gZXhpc3RpbmcgdGFyZ2V0LicpO1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJlbW92ZVRhcmdldCh0YXJnZXRJZCkpO1xuICAgICAgICB0aGlzLmRyb3BUYXJnZXRzLmRlbGV0ZSh0YXJnZXRJZCk7XG4gICAgICAgIHRoaXMudHlwZXMuZGVsZXRlKHRhcmdldElkKTtcbiAgICB9XG4gICAgcGluU291cmNlKHNvdXJjZUlkKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKHNvdXJjZUlkKTtcbiAgICAgICAgaW52YXJpYW50KHNvdXJjZSwgJ0V4cGVjdGVkIGFuIGV4aXN0aW5nIHNvdXJjZS4nKTtcbiAgICAgICAgdGhpcy5waW5uZWRTb3VyY2VJZCA9IHNvdXJjZUlkO1xuICAgICAgICB0aGlzLnBpbm5lZFNvdXJjZSA9IHNvdXJjZTtcbiAgICB9XG4gICAgdW5waW5Tb3VyY2UoKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLnBpbm5lZFNvdXJjZSwgJ05vIHNvdXJjZSBpcyBwaW5uZWQgYXQgdGhlIHRpbWUuJyk7XG4gICAgICAgIHRoaXMucGlubmVkU291cmNlSWQgPSBudWxsO1xuICAgICAgICB0aGlzLnBpbm5lZFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIGFkZEhhbmRsZXIocm9sZSwgdHlwZSwgaGFuZGxlcikge1xuICAgICAgICBjb25zdCBpZCA9IGdldE5leHRIYW5kbGVySWQocm9sZSk7XG4gICAgICAgIHRoaXMudHlwZXMuc2V0KGlkLCB0eXBlKTtcbiAgICAgICAgaWYgKHJvbGUgPT09IEhhbmRsZXJSb2xlLlNPVVJDRSkge1xuICAgICAgICAgICAgdGhpcy5kcmFnU291cmNlcy5zZXQoaWQsIGhhbmRsZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJvbGUgPT09IEhhbmRsZXJSb2xlLlRBUkdFVCkge1xuICAgICAgICAgICAgdGhpcy5kcm9wVGFyZ2V0cy5zZXQoaWQsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc3RvcmUpe1xuICAgICAgICB0aGlzLnR5cGVzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2VzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmRyb3BUYXJnZXRzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnBpbm5lZFNvdXJjZUlkID0gbnVsbDtcbiAgICAgICAgdGhpcy5waW5uZWRTb3VyY2UgPSBudWxsO1xuICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1IYW5kbGVyUmVnaXN0cnlJbXBsLmpzLm1hcCIsImltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0ByZWFjdC1kbmQvaW52YXJpYW50JztcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNvdXJjZUNvbnRyYWN0KHNvdXJjZSkge1xuICAgIGludmFyaWFudCh0eXBlb2Ygc291cmNlLmNhbkRyYWcgPT09ICdmdW5jdGlvbicsICdFeHBlY3RlZCBjYW5EcmFnIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgaW52YXJpYW50KHR5cGVvZiBzb3VyY2UuYmVnaW5EcmFnID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgYmVnaW5EcmFnIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgaW52YXJpYW50KHR5cGVvZiBzb3VyY2UuZW5kRHJhZyA9PT0gJ2Z1bmN0aW9uJywgJ0V4cGVjdGVkIGVuZERyYWcgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRhcmdldENvbnRyYWN0KHRhcmdldCkge1xuICAgIGludmFyaWFudCh0eXBlb2YgdGFyZ2V0LmNhbkRyb3AgPT09ICdmdW5jdGlvbicsICdFeHBlY3RlZCBjYW5Ecm9wIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgaW52YXJpYW50KHR5cGVvZiB0YXJnZXQuaG92ZXIgPT09ICdmdW5jdGlvbicsICdFeHBlY3RlZCBob3ZlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIGludmFyaWFudCh0eXBlb2YgdGFyZ2V0LmRyb3AgPT09ICdmdW5jdGlvbicsICdFeHBlY3RlZCBiZWdpbkRyYWcgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVR5cGUodHlwZSwgYWxsb3dBcnJheSkge1xuICAgIGlmIChhbGxvd0FycmF5ICYmIEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgICAgdHlwZS5mb3JFYWNoKCh0KT0+dmFsaWRhdGVUeXBlKHQsIGZhbHNlKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGludmFyaWFudCh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdzeW1ib2wnLCBhbGxvd0FycmF5ID8gJ1R5cGUgY2FuIG9ubHkgYmUgYSBzdHJpbmcsIGEgc3ltYm9sLCBvciBhbiBhcnJheSBvZiBlaXRoZXIuJyA6ICdUeXBlIGNhbiBvbmx5IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sLicpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250cmFjdHMuanMubWFwIiwiaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgeyBEcmFnRHJvcE1hbmFnZXJJbXBsIH0gZnJvbSAnLi9jbGFzc2VzL0RyYWdEcm9wTWFuYWdlckltcGwuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BNb25pdG9ySW1wbCB9IGZyb20gJy4vY2xhc3Nlcy9EcmFnRHJvcE1vbml0b3JJbXBsLmpzJztcbmltcG9ydCB7IEhhbmRsZXJSZWdpc3RyeUltcGwgfSBmcm9tICcuL2NsYXNzZXMvSGFuZGxlclJlZ2lzdHJ5SW1wbC5qcyc7XG5pbXBvcnQgeyByZWR1Y2UgfSBmcm9tICcuL3JlZHVjZXJzL2luZGV4LmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEcmFnRHJvcE1hbmFnZXIoYmFja2VuZEZhY3RvcnksIGdsb2JhbENvbnRleHQgPSB1bmRlZmluZWQsIGJhY2tlbmRPcHRpb25zID0ge30sIGRlYnVnTW9kZSA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBtYWtlU3RvcmVJbnN0YW5jZShkZWJ1Z01vZGUpO1xuICAgIGNvbnN0IG1vbml0b3IgPSBuZXcgRHJhZ0Ryb3BNb25pdG9ySW1wbChzdG9yZSwgbmV3IEhhbmRsZXJSZWdpc3RyeUltcGwoc3RvcmUpKTtcbiAgICBjb25zdCBtYW5hZ2VyID0gbmV3IERyYWdEcm9wTWFuYWdlckltcGwoc3RvcmUsIG1vbml0b3IpO1xuICAgIGNvbnN0IGJhY2tlbmQgPSBiYWNrZW5kRmFjdG9yeShtYW5hZ2VyLCBnbG9iYWxDb250ZXh0LCBiYWNrZW5kT3B0aW9ucyk7XG4gICAgbWFuYWdlci5yZWNlaXZlQmFja2VuZChiYWNrZW5kKTtcbiAgICByZXR1cm4gbWFuYWdlcjtcbn1cbmZ1bmN0aW9uIG1ha2VTdG9yZUluc3RhbmNlKGRlYnVnTW9kZSkge1xuICAgIC8vIFRPRE86IGlmIHdlIGV2ZXIgbWFrZSBhIHJlYWN0LW5hdGl2ZSB2ZXJzaW9uIG9mIHRoaXMsXG4gICAgLy8gd2UnbGwgbmVlZCB0byBjb25zaWRlciBob3cgdG8gcHVsbCBvZmYgZGV2LXRvb2xpbmdcbiAgICBjb25zdCByZWR1eERldlRvb2xzID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX187XG4gICAgcmV0dXJuIGNyZWF0ZVN0b3JlKHJlZHVjZSwgZGVidWdNb2RlICYmIHJlZHV4RGV2VG9vbHMgJiYgcmVkdXhEZXZUb29scyh7XG4gICAgICAgIG5hbWU6ICdkbmQtY29yZScsXG4gICAgICAgIGluc3RhbmNlSWQ6ICdkbmQtY29yZSdcbiAgICB9KSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNyZWF0ZURyYWdEcm9wTWFuYWdlci5qcy5tYXAiLCJleHBvcnQgdmFyIEhhbmRsZXJSb2xlO1xuKGZ1bmN0aW9uKEhhbmRsZXJSb2xlKSB7XG4gICAgSGFuZGxlclJvbGVbXCJTT1VSQ0VcIl0gPSBcIlNPVVJDRVwiO1xuICAgIEhhbmRsZXJSb2xlW1wiVEFSR0VUXCJdID0gXCJUQVJHRVRcIjtcbn0pKEhhbmRsZXJSb2xlIHx8IChIYW5kbGVyUm9sZSA9IHt9KSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludGVyZmFjZXMuanMubWFwIiwiaW1wb3J0IHsgQkVHSU5fRFJBRywgRFJPUCwgRU5EX0RSQUcsIEhPVkVSLCBQVUJMSVNIX0RSQUdfU09VUkNFIH0gZnJvbSAnLi4vYWN0aW9ucy9kcmFnRHJvcC9pbmRleC5qcyc7XG5pbXBvcnQgeyBBRERfU09VUkNFLCBBRERfVEFSR0VULCBSRU1PVkVfU09VUkNFLCBSRU1PVkVfVEFSR0VUIH0gZnJvbSAnLi4vYWN0aW9ucy9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBBTEwsIE5PTkUgfSBmcm9tICcuLi91dGlscy9kaXJ0aW5lc3MuanMnO1xuaW1wb3J0IHsgYXJlQXJyYXlzRXF1YWwgfSBmcm9tICcuLi91dGlscy9lcXVhbGl0eS5qcyc7XG5pbXBvcnQgeyB4b3IgfSBmcm9tICcuLi91dGlscy9qc191dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbl9zdGF0ZSA9IE5PTkUsIGFjdGlvbikge1xuICAgIHN3aXRjaChhY3Rpb24udHlwZSl7XG4gICAgICAgIGNhc2UgSE9WRVI6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBRERfU09VUkNFOlxuICAgICAgICBjYXNlIEFERF9UQVJHRVQ6XG4gICAgICAgIGNhc2UgUkVNT1ZFX1RBUkdFVDpcbiAgICAgICAgY2FzZSBSRU1PVkVfU09VUkNFOlxuICAgICAgICAgICAgcmV0dXJuIE5PTkU7XG4gICAgICAgIGNhc2UgQkVHSU5fRFJBRzpcbiAgICAgICAgY2FzZSBQVUJMSVNIX0RSQUdfU09VUkNFOlxuICAgICAgICBjYXNlIEVORF9EUkFHOlxuICAgICAgICBjYXNlIERST1A6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gQUxMO1xuICAgIH1cbiAgICBjb25zdCB7IHRhcmdldElkcyA9W10gLCBwcmV2VGFyZ2V0SWRzID1bXSAgfSA9IGFjdGlvbi5wYXlsb2FkO1xuICAgIGNvbnN0IHJlc3VsdCA9IHhvcih0YXJnZXRJZHMsIHByZXZUYXJnZXRJZHMpO1xuICAgIGNvbnN0IGRpZENoYW5nZSA9IHJlc3VsdC5sZW5ndGggPiAwIHx8ICFhcmVBcnJheXNFcXVhbCh0YXJnZXRJZHMsIHByZXZUYXJnZXRJZHMpO1xuICAgIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgICAgIHJldHVybiBOT05FO1xuICAgIH1cbiAgICAvLyBDaGVjayB0aGUgdGFyZ2V0IGlkcyBhdCB0aGUgaW5uZXJtb3N0IHBvc2l0aW9uLiBJZiB0aGV5IGFyZSB2YWxpZCwgYWRkIHRoZW1cbiAgICAvLyB0byB0aGUgcmVzdWx0XG4gICAgY29uc3QgcHJldklubmVybW9zdFRhcmdldElkID0gcHJldlRhcmdldElkc1twcmV2VGFyZ2V0SWRzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGlubmVybW9zdFRhcmdldElkID0gdGFyZ2V0SWRzW3RhcmdldElkcy5sZW5ndGggLSAxXTtcbiAgICBpZiAocHJldklubmVybW9zdFRhcmdldElkICE9PSBpbm5lcm1vc3RUYXJnZXRJZCkge1xuICAgICAgICBpZiAocHJldklubmVybW9zdFRhcmdldElkKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChwcmV2SW5uZXJtb3N0VGFyZ2V0SWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbm5lcm1vc3RUYXJnZXRJZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5uZXJtb3N0VGFyZ2V0SWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpcnR5SGFuZGxlcklkcy5qcy5tYXAiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gICAgZm9yKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgICAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuaW1wb3J0IHsgQkVHSU5fRFJBRywgRFJPUCwgRU5EX0RSQUcsIEhPVkVSLCBJTklUX0NPT1JEUyB9IGZyb20gJy4uL2FjdGlvbnMvZHJhZ0Ryb3AvaW5kZXguanMnO1xuaW1wb3J0IHsgYXJlQ29vcmRzRXF1YWwgfSBmcm9tICcuLi91dGlscy9lcXVhbGl0eS5qcyc7XG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgaW5pdGlhbFNvdXJjZUNsaWVudE9mZnNldDogbnVsbCxcbiAgICBpbml0aWFsQ2xpZW50T2Zmc2V0OiBudWxsLFxuICAgIGNsaWVudE9mZnNldDogbnVsbFxufTtcbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2Uoc3RhdGUgPSBpbml0aWFsU3RhdGUsIGFjdGlvbikge1xuICAgIGNvbnN0IHsgcGF5bG9hZCAgfSA9IGFjdGlvbjtcbiAgICBzd2l0Y2goYWN0aW9uLnR5cGUpe1xuICAgICAgICBjYXNlIElOSVRfQ09PUkRTOlxuICAgICAgICBjYXNlIEJFR0lOX0RSQUc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGluaXRpYWxTb3VyY2VDbGllbnRPZmZzZXQ6IHBheWxvYWQuc291cmNlQ2xpZW50T2Zmc2V0LFxuICAgICAgICAgICAgICAgIGluaXRpYWxDbGllbnRPZmZzZXQ6IHBheWxvYWQuY2xpZW50T2Zmc2V0LFxuICAgICAgICAgICAgICAgIGNsaWVudE9mZnNldDogcGF5bG9hZC5jbGllbnRPZmZzZXRcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgSE9WRVI6XG4gICAgICAgICAgICBpZiAoYXJlQ29vcmRzRXF1YWwoc3RhdGUuY2xpZW50T2Zmc2V0LCBwYXlsb2FkLmNsaWVudE9mZnNldCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHtcbiAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXQ6IHBheWxvYWQuY2xpZW50T2Zmc2V0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBFTkRfRFJBRzpcbiAgICAgICAgY2FzZSBEUk9QOlxuICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRyYWdPZmZzZXQuanMubWFwIiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICAgICAgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uKHN5bSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmltcG9ydCB7IEJFR0lOX0RSQUcsIERST1AsIEVORF9EUkFHLCBIT1ZFUiwgUFVCTElTSF9EUkFHX1NPVVJDRSB9IGZyb20gJy4uL2FjdGlvbnMvZHJhZ0Ryb3AvaW5kZXguanMnO1xuaW1wb3J0IHsgUkVNT1ZFX1RBUkdFVCB9IGZyb20gJy4uL2FjdGlvbnMvcmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgd2l0aG91dCB9IGZyb20gJy4uL3V0aWxzL2pzX3V0aWxzLmpzJztcbmNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICBpdGVtVHlwZTogbnVsbCxcbiAgICBpdGVtOiBudWxsLFxuICAgIHNvdXJjZUlkOiBudWxsLFxuICAgIHRhcmdldElkczogW10sXG4gICAgZHJvcFJlc3VsdDogbnVsbCxcbiAgICBkaWREcm9wOiBmYWxzZSxcbiAgICBpc1NvdXJjZVB1YmxpYzogbnVsbFxufTtcbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2Uoc3RhdGUgPSBpbml0aWFsU3RhdGUsIGFjdGlvbikge1xuICAgIGNvbnN0IHsgcGF5bG9hZCAgfSA9IGFjdGlvbjtcbiAgICBzd2l0Y2goYWN0aW9uLnR5cGUpe1xuICAgICAgICBjYXNlIEJFR0lOX0RSQUc6XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZTogcGF5bG9hZC5pdGVtVHlwZSxcbiAgICAgICAgICAgICAgICBpdGVtOiBwYXlsb2FkLml0ZW0sXG4gICAgICAgICAgICAgICAgc291cmNlSWQ6IHBheWxvYWQuc291cmNlSWQsXG4gICAgICAgICAgICAgICAgaXNTb3VyY2VQdWJsaWM6IHBheWxvYWQuaXNTb3VyY2VQdWJsaWMsXG4gICAgICAgICAgICAgICAgZHJvcFJlc3VsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBkaWREcm9wOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgUFVCTElTSF9EUkFHX1NPVVJDRTpcbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICAgICAgICAgIGlzU291cmNlUHVibGljOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBIT1ZFUjpcbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICAgICAgICAgIHRhcmdldElkczogcGF5bG9hZC50YXJnZXRJZHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFJFTU9WRV9UQVJHRVQ6XG4gICAgICAgICAgICBpZiAoc3RhdGUudGFyZ2V0SWRzLmluZGV4T2YocGF5bG9hZC50YXJnZXRJZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0SWRzOiB3aXRob3V0KHN0YXRlLnRhcmdldElkcywgcGF5bG9hZC50YXJnZXRJZClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIERST1A6XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHtcbiAgICAgICAgICAgICAgICBkcm9wUmVzdWx0OiBwYXlsb2FkLmRyb3BSZXN1bHQsXG4gICAgICAgICAgICAgICAgZGlkRHJvcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0YXJnZXRJZHM6IFtdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBFTkRfRFJBRzpcbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiBudWxsLFxuICAgICAgICAgICAgICAgIGl0ZW06IG51bGwsXG4gICAgICAgICAgICAgICAgc291cmNlSWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgZHJvcFJlc3VsdDogbnVsbCxcbiAgICAgICAgICAgICAgICBkaWREcm9wOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1NvdXJjZVB1YmxpYzogbnVsbCxcbiAgICAgICAgICAgICAgICB0YXJnZXRJZHM6IFtdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRyYWdPcGVyYXRpb24uanMubWFwIiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICAgICAgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uKHN5bSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmltcG9ydCB7IGdldCB9IGZyb20gJy4uL3V0aWxzL2pzX3V0aWxzLmpzJztcbmltcG9ydCB7IHJlZHVjZSBhcyBkaXJ0eUhhbmRsZXJJZHMgfSBmcm9tICcuL2RpcnR5SGFuZGxlcklkcy5qcyc7XG5pbXBvcnQgeyByZWR1Y2UgYXMgZHJhZ09mZnNldCB9IGZyb20gJy4vZHJhZ09mZnNldC5qcyc7XG5pbXBvcnQgeyByZWR1Y2UgYXMgZHJhZ09wZXJhdGlvbiB9IGZyb20gJy4vZHJhZ09wZXJhdGlvbi5qcyc7XG5pbXBvcnQgeyByZWR1Y2UgYXMgcmVmQ291bnQgfSBmcm9tICcuL3JlZkNvdW50LmpzJztcbmltcG9ydCB7IHJlZHVjZSBhcyBzdGF0ZUlkIH0gZnJvbSAnLi9zdGF0ZUlkLmpzJztcbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2Uoc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGlydHlIYW5kbGVySWRzOiBkaXJ0eUhhbmRsZXJJZHMoc3RhdGUuZGlydHlIYW5kbGVySWRzLCB7XG4gICAgICAgICAgICB0eXBlOiBhY3Rpb24udHlwZSxcbiAgICAgICAgICAgIHBheWxvYWQ6IF9vYmplY3RTcHJlYWQoe30sIGFjdGlvbi5wYXlsb2FkLCB7XG4gICAgICAgICAgICAgICAgcHJldlRhcmdldElkczogZ2V0KHN0YXRlLCAnZHJhZ09wZXJhdGlvbi50YXJnZXRJZHMnLCBbXSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pLFxuICAgICAgICBkcmFnT2Zmc2V0OiBkcmFnT2Zmc2V0KHN0YXRlLmRyYWdPZmZzZXQsIGFjdGlvbiksXG4gICAgICAgIHJlZkNvdW50OiByZWZDb3VudChzdGF0ZS5yZWZDb3VudCwgYWN0aW9uKSxcbiAgICAgICAgZHJhZ09wZXJhdGlvbjogZHJhZ09wZXJhdGlvbihzdGF0ZS5kcmFnT3BlcmF0aW9uLCBhY3Rpb24pLFxuICAgICAgICBzdGF0ZUlkOiBzdGF0ZUlkKHN0YXRlLnN0YXRlSWQpXG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgQUREX1NPVVJDRSwgQUREX1RBUkdFVCwgUkVNT1ZFX1NPVVJDRSwgUkVNT1ZFX1RBUkdFVCB9IGZyb20gJy4uL2FjdGlvbnMvcmVnaXN0cnkuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZShzdGF0ZSA9IDAsIGFjdGlvbikge1xuICAgIHN3aXRjaChhY3Rpb24udHlwZSl7XG4gICAgICAgIGNhc2UgQUREX1NPVVJDRTpcbiAgICAgICAgY2FzZSBBRERfVEFSR0VUOlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlICsgMTtcbiAgICAgICAgY2FzZSBSRU1PVkVfU09VUkNFOlxuICAgICAgICBjYXNlIFJFTU9WRV9UQVJHRVQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUgLSAxO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVmQ291bnQuanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZShzdGF0ZSA9IDApIHtcbiAgICByZXR1cm4gc3RhdGUgKyAxO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGF0ZUlkLmpzLm1hcCIsIi8qKlxuICogQ29vcmRpbmF0ZSBhZGRpdGlvblxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgY29vcmRpbmF0ZVxuICovIGV4cG9ydCBmdW5jdGlvbiBhZGQoYSwgYikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGEueCArIGIueCxcbiAgICAgICAgeTogYS55ICsgYi55XG4gICAgfTtcbn1cbi8qKlxuICogQ29vcmRpbmF0ZSBzdWJ0cmFjdGlvblxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgY29vcmRpbmF0ZVxuICovIGV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChhLCBiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogYS54IC0gYi54LFxuICAgICAgICB5OiBhLnkgLSBiLnlcbiAgICB9O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjYXJ0ZXNpYW4gZGlzdGFuY2Ugb2YgdGhlIGRyYWcgc291cmNlIGNvbXBvbmVudCdzIHBvc2l0aW9uLCBiYXNlZCBvbiBpdHMgcG9zaXRpb25cbiAqIGF0IHRoZSB0aW1lIHdoZW4gdGhlIGN1cnJlbnQgZHJhZyBvcGVyYXRpb24gaGFzIHN0YXJ0ZWQsIGFuZCB0aGUgbW92ZW1lbnQgZGlmZmVyZW5jZS5cbiAqXG4gKiBSZXR1cm5zIG51bGwgaWYgbm8gaXRlbSBpcyBiZWluZyBkcmFnZ2VkLlxuICpcbiAqIEBwYXJhbSBzdGF0ZSBUaGUgb2Zmc2V0IHN0YXRlIHRvIGNvbXB1dGUgZnJvbVxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VDbGllbnRPZmZzZXQoc3RhdGUpIHtcbiAgICBjb25zdCB7IGNsaWVudE9mZnNldCAsIGluaXRpYWxDbGllbnRPZmZzZXQgLCBpbml0aWFsU291cmNlQ2xpZW50T2Zmc2V0ICB9ID0gc3RhdGU7XG4gICAgaWYgKCFjbGllbnRPZmZzZXQgfHwgIWluaXRpYWxDbGllbnRPZmZzZXQgfHwgIWluaXRpYWxTb3VyY2VDbGllbnRPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBzdWJ0cmFjdChhZGQoY2xpZW50T2Zmc2V0LCBpbml0aWFsU291cmNlQ2xpZW50T2Zmc2V0KSwgaW5pdGlhbENsaWVudE9mZnNldCk7XG59XG4vKipcbiAqIERldGVybWluZXMgdGhlIHgseSBvZmZzZXQgYmV0d2VlbiB0aGUgY2xpZW50IG9mZnNldCBhbmQgdGhlIGluaXRpYWwgY2xpZW50IG9mZnNldFxuICpcbiAqIEBwYXJhbSBzdGF0ZSBUaGUgb2Zmc2V0IHN0YXRlIHRvIGNvbXB1dGUgZnJvbVxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXREaWZmZXJlbmNlRnJvbUluaXRpYWxPZmZzZXQoc3RhdGUpIHtcbiAgICBjb25zdCB7IGNsaWVudE9mZnNldCAsIGluaXRpYWxDbGllbnRPZmZzZXQgIH0gPSBzdGF0ZTtcbiAgICBpZiAoIWNsaWVudE9mZnNldCB8fCAhaW5pdGlhbENsaWVudE9mZnNldCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHN1YnRyYWN0KGNsaWVudE9mZnNldCwgaW5pdGlhbENsaWVudE9mZnNldCk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvb3Jkcy5qcy5tYXAiLCJpbXBvcnQgeyBpbnRlcnNlY3Rpb24gfSBmcm9tICcuL2pzX3V0aWxzLmpzJztcbmV4cG9ydCBjb25zdCBOT05FID0gW107XG5leHBvcnQgY29uc3QgQUxMID0gW107XG5OT05FLl9fSVNfTk9ORV9fID0gdHJ1ZTtcbkFMTC5fX0lTX0FMTF9fID0gdHJ1ZTtcbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gaGFuZGxlciBJRHMgYXJlIGRpcnR5IG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gZGlydHlJZHMgVGhlIHNldCBvZiBkaXJ0eSBoYW5kbGVyIGlkc1xuICogQHBhcmFtIGhhbmRsZXJJZHMgVGhlIHNldCBvZiBoYW5kbGVyIGlkcyB0byBjaGVja1xuICovIGV4cG9ydCBmdW5jdGlvbiBhcmVEaXJ0eShkaXJ0eUlkcywgaGFuZGxlcklkcykge1xuICAgIGlmIChkaXJ0eUlkcyA9PT0gTk9ORSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChkaXJ0eUlkcyA9PT0gQUxMIHx8IHR5cGVvZiBoYW5kbGVySWRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY29tbW9uSWRzID0gaW50ZXJzZWN0aW9uKGhhbmRsZXJJZHMsIGRpcnR5SWRzKTtcbiAgICByZXR1cm4gY29tbW9uSWRzLmxlbmd0aCA+IDA7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpcnRpbmVzcy5qcy5tYXAiLCJleHBvcnQgY29uc3Qgc3RyaWN0RXF1YWxpdHkgPSAoYSwgYik9PmEgPT09IGJcbjtcbi8qKlxuICogRGV0ZXJtaW5lIGlmIHR3byBjYXJ0ZXNpYW4gY29vcmRpbmF0ZSBvZmZzZXRzIGFyZSBlcXVhbFxuICogQHBhcmFtIG9mZnNldEFcbiAqIEBwYXJhbSBvZmZzZXRCXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGFyZUNvb3Jkc0VxdWFsKG9mZnNldEEsIG9mZnNldEIpIHtcbiAgICBpZiAoIW9mZnNldEEgJiYgIW9mZnNldEIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICghb2Zmc2V0QSB8fCAhb2Zmc2V0Qikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG9mZnNldEEueCA9PT0gb2Zmc2V0Qi54ICYmIG9mZnNldEEueSA9PT0gb2Zmc2V0Qi55O1xuICAgIH1cbn1cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0d28gYXJyYXlzIG9mIGl0ZW1zIGFyZSBlcXVhbFxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGFycmF5IG9mIGl0ZW1zXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGFycmF5IG9mIGl0ZW1zXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGFyZUFycmF5c0VxdWFsKGEsIGIsIGlzRXF1YWwgPSBzdHJpY3RFcXVhbGl0eSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSl7XG4gICAgICAgIGlmICghaXNFcXVhbChhW2ldLCBiW2ldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcXVhbGl0eS5qcy5tYXAiLCJsZXQgbmV4dFVuaXF1ZUlkID0gMDtcbmV4cG9ydCBmdW5jdGlvbiBnZXROZXh0VW5pcXVlSWQoKSB7XG4gICAgcmV0dXJuIG5leHRVbmlxdWVJZCsrO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXROZXh0VW5pcXVlSWQuanMubWFwIiwiLy8gY2hlYXAgbG9kYXNoIHJlcGxhY2VtZW50c1xuLyoqXG4gKiBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBfLmdldFxuICogQHBhcmFtIG9ialxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWVcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0KG9iaiwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKGEsIGMpPT5hICYmIGFbY10gPyBhW2NdIDogZGVmYXVsdFZhbHVlIHx8IG51bGxcbiAgICAsIG9iaik7XG59XG4vKipcbiAqIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIF8ud2l0aG91dFxuICovIGV4cG9ydCBmdW5jdGlvbiB3aXRob3V0KGl0ZW1zLCBpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaSk9PmkgIT09IGl0ZW1cbiAgICApO1xufVxuLyoqXG4gKiBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBfLmlzU3RyaW5nXG4gKiBAcGFyYW0gaW5wdXRcbiAqLyBleHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcoaW5wdXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJztcbn1cbi8qKlxuICogZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgXy5pc1N0cmluZ1xuICogQHBhcmFtIGlucHV0XG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCc7XG59XG4vKipcbiAqIHJlcGxhY2VtZW50IGZvciBfLnhvclxuICogQHBhcmFtIGl0ZW1zQVxuICogQHBhcmFtIGl0ZW1zQlxuICovIGV4cG9ydCBmdW5jdGlvbiB4b3IoaXRlbXNBLCBpdGVtc0IpIHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgaW5zZXJ0SXRlbSA9IChpdGVtKT0+e1xuICAgICAgICBtYXAuc2V0KGl0ZW0sIG1hcC5oYXMoaXRlbSkgPyBtYXAuZ2V0KGl0ZW0pICsgMSA6IDEpO1xuICAgIH07XG4gICAgaXRlbXNBLmZvckVhY2goaW5zZXJ0SXRlbSk7XG4gICAgaXRlbXNCLmZvckVhY2goaW5zZXJ0SXRlbSk7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbWFwLmZvckVhY2goKGNvdW50LCBrZXkpPT57XG4gICAgICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIHJlcGxhY2VtZW50IGZvciBfLmludGVyc2VjdGlvblxuICogQHBhcmFtIGl0ZW1zQVxuICogQHBhcmFtIGl0ZW1zQlxuICovIGV4cG9ydCBmdW5jdGlvbiBpbnRlcnNlY3Rpb24oaXRlbXNBLCBpdGVtc0IpIHtcbiAgICByZXR1cm4gaXRlbXNBLmZpbHRlcigodCk9Pml0ZW1zQi5pbmRleE9mKHQpID4gLTFcbiAgICApO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1qc191dGlscy5qcy5tYXAiLCJleHBvcnQgZnVuY3Rpb24gbWF0Y2hlc1R5cGUodGFyZ2V0VHlwZSwgZHJhZ2dlZEl0ZW1UeXBlKSB7XG4gICAgaWYgKGRyYWdnZWRJdGVtVHlwZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0VHlwZSA9PT0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0VHlwZSkgPyB0YXJnZXRUeXBlLnNvbWUoKHQpPT50ID09PSBkcmFnZ2VkSXRlbVR5cGVcbiAgICApIDogdGFyZ2V0VHlwZSA9PT0gZHJhZ2dlZEl0ZW1UeXBlO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXRjaGVzVHlwZS5qcy5tYXAiLCJjb25zdCB7XG4gIHNsaWNlLFxuICBmb3JFYWNoXG59ID0gW107XG5mdW5jdGlvbiBkZWZhdWx0cyhvYmopIHtcbiAgZm9yRWFjaC5jYWxsKHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgc291cmNlID0+IHtcbiAgICBpZiAoc291cmNlKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChvYmpbcHJvcF0gPT09IHVuZGVmaW5lZCkgb2JqW3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG5jb25zdCBmaWVsZENvbnRlbnRSZWdFeHAgPSAvXltcXHUwMDA5XFx1MDAyMC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXSskLztcbmNvbnN0IHNlcmlhbGl6ZUNvb2tpZSA9IChuYW1lLCB2YWwsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgb3B0ID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0LnBhdGggPSBvcHQucGF0aCB8fCAnLyc7XG4gIGNvbnN0IHZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCk7XG4gIGxldCBzdHIgPSBgJHtuYW1lfT0ke3ZhbHVlfWA7XG4gIGlmIChvcHQubWF4QWdlID4gMCkge1xuICAgIGNvbnN0IG1heEFnZSA9IG9wdC5tYXhBZ2UgLSAwO1xuICAgIGlmIChOdW1iZXIuaXNOYU4obWF4QWdlKSkgdGhyb3cgbmV3IEVycm9yKCdtYXhBZ2Ugc2hvdWxkIGJlIGEgTnVtYmVyJyk7XG4gICAgc3RyICs9IGA7IE1heC1BZ2U9JHtNYXRoLmZsb29yKG1heEFnZSl9YDtcbiAgfVxuICBpZiAob3B0LmRvbWFpbikge1xuICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LmRvbWFpbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBkb21haW4gaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICBzdHIgKz0gYDsgRG9tYWluPSR7b3B0LmRvbWFpbn1gO1xuICB9XG4gIGlmIChvcHQucGF0aCkge1xuICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LnBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gcGF0aCBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICAgIHN0ciArPSBgOyBQYXRoPSR7b3B0LnBhdGh9YDtcbiAgfVxuICBpZiAob3B0LmV4cGlyZXMpIHtcbiAgICBpZiAodHlwZW9mIG9wdC5leHBpcmVzLnRvVVRDU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gZXhwaXJlcyBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICAgIHN0ciArPSBgOyBFeHBpcmVzPSR7b3B0LmV4cGlyZXMudG9VVENTdHJpbmcoKX1gO1xuICB9XG4gIGlmIChvcHQuaHR0cE9ubHkpIHN0ciArPSAnOyBIdHRwT25seSc7XG4gIGlmIChvcHQuc2VjdXJlKSBzdHIgKz0gJzsgU2VjdXJlJztcbiAgaWYgKG9wdC5zYW1lU2l0ZSkge1xuICAgIGNvbnN0IHNhbWVTaXRlID0gdHlwZW9mIG9wdC5zYW1lU2l0ZSA9PT0gJ3N0cmluZycgPyBvcHQuc2FtZVNpdGUudG9Mb3dlckNhc2UoKSA6IG9wdC5zYW1lU2l0ZTtcbiAgICBzd2l0Y2ggKHNhbWVTaXRlKSB7XG4gICAgICBjYXNlIHRydWU6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1TdHJpY3QnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xheCc6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1MYXgnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0cmljdCc6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1TdHJpY3QnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9Tm9uZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHNhbWVTaXRlIGlzIGludmFsaWQnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5jb25zdCBjb29raWUgPSB7XG4gIGNyZWF0ZShuYW1lLCB2YWx1ZSwgbWludXRlcywgZG9tYWluKSB7XG4gICAgbGV0IGNvb2tpZU9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHtcbiAgICAgIHBhdGg6ICcvJyxcbiAgICAgIHNhbWVTaXRlOiAnc3RyaWN0J1xuICAgIH07XG4gICAgaWYgKG1pbnV0ZXMpIHtcbiAgICAgIGNvb2tpZU9wdGlvbnMuZXhwaXJlcyA9IG5ldyBEYXRlKCk7XG4gICAgICBjb29raWVPcHRpb25zLmV4cGlyZXMuc2V0VGltZShjb29raWVPcHRpb25zLmV4cGlyZXMuZ2V0VGltZSgpICsgbWludXRlcyAqIDYwICogMTAwMCk7XG4gICAgfVxuICAgIGlmIChkb21haW4pIGNvb2tpZU9wdGlvbnMuZG9tYWluID0gZG9tYWluO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IHNlcmlhbGl6ZUNvb2tpZShuYW1lLCBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLCBjb29raWVPcHRpb25zKTtcbiAgfSxcbiAgcmVhZChuYW1lKSB7XG4gICAgY29uc3QgbmFtZUVRID0gYCR7bmFtZX09YDtcbiAgICBjb25zdCBjYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2EubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjID0gY2FbaV07XG4gICAgICB3aGlsZSAoYy5jaGFyQXQoMCkgPT09ICcgJykgYyA9IGMuc3Vic3RyaW5nKDEsIGMubGVuZ3RoKTtcbiAgICAgIGlmIChjLmluZGV4T2YobmFtZUVRKSA9PT0gMCkgcmV0dXJuIGMuc3Vic3RyaW5nKG5hbWVFUS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIHJlbW92ZShuYW1lKSB7XG4gICAgdGhpcy5jcmVhdGUobmFtZSwgJycsIC0xKTtcbiAgfVxufTtcbnZhciBjb29raWUkMSA9IHtcbiAgbmFtZTogJ2Nvb2tpZScsXG4gIC8vIERlY29uc3RydWN0IHRoZSBvcHRpb25zIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgbG9va3VwQ29va2llIHByb3BlcnR5XG4gIGxvb2t1cChfcmVmKSB7XG4gICAgbGV0IHtcbiAgICAgIGxvb2t1cENvb2tpZVxuICAgIH0gPSBfcmVmO1xuICAgIGlmIChsb29rdXBDb29raWUgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGNvb2tpZS5yZWFkKGxvb2t1cENvb2tpZSkgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LFxuICAvLyBEZWNvbnN0cnVjdCB0aGUgb3B0aW9ucyBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIGxvb2t1cENvb2tpZSwgY29va2llTWludXRlcywgY29va2llRG9tYWluLCBhbmQgY29va2llT3B0aW9ucyBwcm9wZXJ0aWVzXG4gIGNhY2hlVXNlckxhbmd1YWdlKGxuZywgX3JlZjIpIHtcbiAgICBsZXQge1xuICAgICAgbG9va3VwQ29va2llLFxuICAgICAgY29va2llTWludXRlcyxcbiAgICAgIGNvb2tpZURvbWFpbixcbiAgICAgIGNvb2tpZU9wdGlvbnNcbiAgICB9ID0gX3JlZjI7XG4gICAgaWYgKGxvb2t1cENvb2tpZSAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb29raWUuY3JlYXRlKGxvb2t1cENvb2tpZSwgbG5nLCBjb29raWVNaW51dGVzLCBjb29raWVEb21haW4sIGNvb2tpZU9wdGlvbnMpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIHF1ZXJ5c3RyaW5nID0ge1xuICBuYW1lOiAncXVlcnlzdHJpbmcnLFxuICAvLyBEZWNvbnN0cnVjdCB0aGUgb3B0aW9ucyBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIGxvb2t1cFF1ZXJ5c3RyaW5nIHByb3BlcnR5XG4gIGxvb2t1cChfcmVmKSB7XG4gICAgbGV0IHtcbiAgICAgIGxvb2t1cFF1ZXJ5c3RyaW5nXG4gICAgfSA9IF9yZWY7XG4gICAgbGV0IGZvdW5kO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IHtcbiAgICAgICAgc2VhcmNoXG4gICAgICB9ID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgaWYgKCF3aW5kb3cubG9jYXRpb24uc2VhcmNoICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoPy5pbmRleE9mKCc/JykgPiAtMSkge1xuICAgICAgICBzZWFyY2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaC5zdWJzdHJpbmcod2luZG93LmxvY2F0aW9uLmhhc2guaW5kZXhPZignPycpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHF1ZXJ5ID0gc2VhcmNoLnN1YnN0cmluZygxKTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHF1ZXJ5LnNwbGl0KCcmJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwb3MgPSBwYXJhbXNbaV0uaW5kZXhPZignPScpO1xuICAgICAgICBpZiAocG9zID4gMCkge1xuICAgICAgICAgIGNvbnN0IGtleSA9IHBhcmFtc1tpXS5zdWJzdHJpbmcoMCwgcG9zKTtcbiAgICAgICAgICBpZiAoa2V5ID09PSBsb29rdXBRdWVyeXN0cmluZykge1xuICAgICAgICAgICAgZm91bmQgPSBwYXJhbXNbaV0uc3Vic3RyaW5nKHBvcyArIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cbn07XG5cbmxldCBoYXNMb2NhbFN0b3JhZ2VTdXBwb3J0ID0gbnVsbDtcbmNvbnN0IGxvY2FsU3RvcmFnZUF2YWlsYWJsZSA9ICgpID0+IHtcbiAgaWYgKGhhc0xvY2FsU3RvcmFnZVN1cHBvcnQgIT09IG51bGwpIHJldHVybiBoYXNMb2NhbFN0b3JhZ2VTdXBwb3J0O1xuICB0cnkge1xuICAgIGhhc0xvY2FsU3RvcmFnZVN1cHBvcnQgPSB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UgIT09IG51bGw7XG4gICAgY29uc3QgdGVzdEtleSA9ICdpMThuZXh0LnRyYW5zbGF0ZS5ib28nO1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0S2V5LCAnZm9vJyk7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3RLZXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaGFzTG9jYWxTdG9yYWdlU3VwcG9ydCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiBoYXNMb2NhbFN0b3JhZ2VTdXBwb3J0O1xufTtcbnZhciBsb2NhbFN0b3JhZ2UgPSB7XG4gIG5hbWU6ICdsb2NhbFN0b3JhZ2UnLFxuICAvLyBEZWNvbnN0cnVjdCB0aGUgb3B0aW9ucyBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIGxvb2t1cExvY2FsU3RvcmFnZSBwcm9wZXJ0eVxuICBsb29rdXAoX3JlZikge1xuICAgIGxldCB7XG4gICAgICBsb29rdXBMb2NhbFN0b3JhZ2VcbiAgICB9ID0gX3JlZjtcbiAgICBpZiAobG9va3VwTG9jYWxTdG9yYWdlICYmIGxvY2FsU3RvcmFnZUF2YWlsYWJsZSgpKSB7XG4gICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGxvb2t1cExvY2FsU3RvcmFnZSkgfHwgdW5kZWZpbmVkOyAvLyBVbmRlZmluZWQgZW5zdXJlcyB0eXBlIGNvbnNpc3RlbmN5IHdpdGggdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvblxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sXG4gIC8vIERlY29uc3RydWN0IHRoZSBvcHRpb25zIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgbG9va3VwTG9jYWxTdG9yYWdlIHByb3BlcnR5XG4gIGNhY2hlVXNlckxhbmd1YWdlKGxuZywgX3JlZjIpIHtcbiAgICBsZXQge1xuICAgICAgbG9va3VwTG9jYWxTdG9yYWdlXG4gICAgfSA9IF9yZWYyO1xuICAgIGlmIChsb29rdXBMb2NhbFN0b3JhZ2UgJiYgbG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkpIHtcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShsb29rdXBMb2NhbFN0b3JhZ2UsIGxuZyk7XG4gICAgfVxuICB9XG59O1xuXG5sZXQgaGFzU2Vzc2lvblN0b3JhZ2VTdXBwb3J0ID0gbnVsbDtcbmNvbnN0IHNlc3Npb25TdG9yYWdlQXZhaWxhYmxlID0gKCkgPT4ge1xuICBpZiAoaGFzU2Vzc2lvblN0b3JhZ2VTdXBwb3J0ICE9PSBudWxsKSByZXR1cm4gaGFzU2Vzc2lvblN0b3JhZ2VTdXBwb3J0O1xuICB0cnkge1xuICAgIGhhc1Nlc3Npb25TdG9yYWdlU3VwcG9ydCA9IHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnNlc3Npb25TdG9yYWdlICE9PSBudWxsO1xuICAgIGNvbnN0IHRlc3RLZXkgPSAnaTE4bmV4dC50cmFuc2xhdGUuYm9vJztcbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0ZXN0S2V5LCAnZm9vJyk7XG4gICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0odGVzdEtleSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYXNTZXNzaW9uU3RvcmFnZVN1cHBvcnQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gaGFzU2Vzc2lvblN0b3JhZ2VTdXBwb3J0O1xufTtcbnZhciBzZXNzaW9uU3RvcmFnZSA9IHtcbiAgbmFtZTogJ3Nlc3Npb25TdG9yYWdlJyxcbiAgbG9va3VwKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgbG9va3VwU2Vzc2lvblN0b3JhZ2VcbiAgICB9ID0gX3JlZjtcbiAgICBpZiAobG9va3VwU2Vzc2lvblN0b3JhZ2UgJiYgc2Vzc2lvblN0b3JhZ2VBdmFpbGFibGUoKSkge1xuICAgICAgcmV0dXJuIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGxvb2t1cFNlc3Npb25TdG9yYWdlKSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sXG4gIGNhY2hlVXNlckxhbmd1YWdlKGxuZywgX3JlZjIpIHtcbiAgICBsZXQge1xuICAgICAgbG9va3VwU2Vzc2lvblN0b3JhZ2VcbiAgICB9ID0gX3JlZjI7XG4gICAgaWYgKGxvb2t1cFNlc3Npb25TdG9yYWdlICYmIHNlc3Npb25TdG9yYWdlQXZhaWxhYmxlKCkpIHtcbiAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGxvb2t1cFNlc3Npb25TdG9yYWdlLCBsbmcpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIG5hdmlnYXRvciQxID0ge1xuICBuYW1lOiAnbmF2aWdhdG9yJyxcbiAgbG9va3VwKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmb3VuZCA9IFtdO1xuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBsYW5ndWFnZXMsXG4gICAgICAgIHVzZXJMYW5ndWFnZSxcbiAgICAgICAgbGFuZ3VhZ2VcbiAgICAgIH0gPSBuYXZpZ2F0b3I7XG4gICAgICBpZiAobGFuZ3VhZ2VzKSB7XG4gICAgICAgIC8vIGNocm9tZSBvbmx5OyBub3QgYW4gYXJyYXksIHNvIGNhbid0IHVzZSAucHVzaC5hcHBseSBpbnN0ZWFkIG9mIGl0ZXJhdGluZ1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhbmd1YWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGZvdW5kLnB1c2gobGFuZ3VhZ2VzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHVzZXJMYW5ndWFnZSkge1xuICAgICAgICBmb3VuZC5wdXNoKHVzZXJMYW5ndWFnZSk7XG4gICAgICB9XG4gICAgICBpZiAobGFuZ3VhZ2UpIHtcbiAgICAgICAgZm91bmQucHVzaChsYW5ndWFnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZC5sZW5ndGggPiAwID8gZm91bmQgOiB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbnZhciBodG1sVGFnID0ge1xuICBuYW1lOiAnaHRtbFRhZycsXG4gIC8vIERlY29uc3RydWN0IHRoZSBvcHRpb25zIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgaHRtbFRhZyBwcm9wZXJ0eVxuICBsb29rdXAoX3JlZikge1xuICAgIGxldCB7XG4gICAgICBodG1sVGFnXG4gICAgfSA9IF9yZWY7XG4gICAgbGV0IGZvdW5kO1xuICAgIGNvbnN0IGludGVybmFsSHRtbFRhZyA9IGh0bWxUYWcgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgOiBudWxsKTtcbiAgICBpZiAoaW50ZXJuYWxIdG1sVGFnICYmIHR5cGVvZiBpbnRlcm5hbEh0bWxUYWcuZ2V0QXR0cmlidXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmb3VuZCA9IGludGVybmFsSHRtbFRhZy5nZXRBdHRyaWJ1dGUoJ2xhbmcnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG59O1xuXG52YXIgcGF0aCA9IHtcbiAgbmFtZTogJ3BhdGgnLFxuICAvLyBEZWNvbnN0cnVjdCB0aGUgb3B0aW9ucyBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIGxvb2t1cEZyb21QYXRoSW5kZXggcHJvcGVydHlcbiAgbG9va3VwKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgbG9va3VwRnJvbVBhdGhJbmRleFxuICAgIH0gPSBfcmVmO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBsYW5ndWFnZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXFwvKFthLXpBLVotXSopL2cpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShsYW5ndWFnZSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaW5kZXggPSB0eXBlb2YgbG9va3VwRnJvbVBhdGhJbmRleCA9PT0gJ251bWJlcicgPyBsb29rdXBGcm9tUGF0aEluZGV4IDogMDtcbiAgICByZXR1cm4gbGFuZ3VhZ2VbaW5kZXhdPy5yZXBsYWNlKCcvJywgJycpO1xuICB9XG59O1xuXG52YXIgc3ViZG9tYWluID0ge1xuICBuYW1lOiAnc3ViZG9tYWluJyxcbiAgbG9va3VwKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgbG9va3VwRnJvbVN1YmRvbWFpbkluZGV4XG4gICAgfSA9IF9yZWY7XG4gICAgLy8gSWYgZ2l2ZW4gZ2V0IHRoZSBzdWJkb21haW4gaW5kZXggZWxzZSAxXG4gICAgY29uc3QgaW50ZXJuYWxMb29rdXBGcm9tU3ViZG9tYWluSW5kZXggPSB0eXBlb2YgbG9va3VwRnJvbVN1YmRvbWFpbkluZGV4ID09PSAnbnVtYmVyJyA/IGxvb2t1cEZyb21TdWJkb21haW5JbmRleCArIDEgOiAxO1xuICAgIC8vIGdldCBhbGwgbWF0Y2hlcyBpZiB3aW5kb3cubG9jYXRpb24uIGlzIGV4aXN0aW5nXG4gICAgLy8gZmlyc3QgaXRlbSBvZiBtYXRjaCBpcyB0aGUgbWF0Y2ggaXRzZWxmIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBmaXJzdCBncm91cCBtYXRjaCB3aGljaCBzaG91bGQgYmUgdGhlIGZpcnN0IHN1YmRvbWFpbiBtYXRjaFxuICAgIC8vIGlzIHRoZSBob3N0bmFtZSBubyBwdWJsaWMgZG9tYWluIGdldCB0aGUgb3Igb3B0aW9uIG9mIGxvY2FsaG9zdFxuICAgIGNvbnN0IGxhbmd1YWdlID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmxvY2F0aW9uPy5ob3N0bmFtZT8ubWF0Y2goL14oXFx3ezIsNX0pXFwuKChbYS16MC05LV17MSw2M31cXC5bYS16XXsyLDZ9KXxsb2NhbGhvc3QpL2kpO1xuXG4gICAgLy8gaWYgdGhlcmUgaXMgbm8gbWF0Y2ggKG51bGwpIHJldHVybiB1bmRlZmluZWRcbiAgICBpZiAoIWxhbmd1YWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIC8vIHJldHVybiB0aGUgZ2l2ZW4gZ3JvdXAgbWF0Y2hcbiAgICByZXR1cm4gbGFuZ3VhZ2VbaW50ZXJuYWxMb29rdXBGcm9tU3ViZG9tYWluSW5kZXhdO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0cygpIHtcbiAgcmV0dXJuIHtcbiAgICBvcmRlcjogWydxdWVyeXN0cmluZycsICdjb29raWUnLCAnbG9jYWxTdG9yYWdlJywgJ3Nlc3Npb25TdG9yYWdlJywgJ25hdmlnYXRvcicsICdodG1sVGFnJ10sXG4gICAgbG9va3VwUXVlcnlzdHJpbmc6ICdsbmcnLFxuICAgIGxvb2t1cENvb2tpZTogJ2kxOG5leHQnLFxuICAgIGxvb2t1cExvY2FsU3RvcmFnZTogJ2kxOG5leHRMbmcnLFxuICAgIGxvb2t1cFNlc3Npb25TdG9yYWdlOiAnaTE4bmV4dExuZycsXG4gICAgLy8gY2FjaGUgdXNlciBsYW5ndWFnZVxuICAgIGNhY2hlczogWydsb2NhbFN0b3JhZ2UnXSxcbiAgICBleGNsdWRlQ2FjaGVGb3I6IFsnY2ltb2RlJ10sXG4gICAgLy8gY29va2llTWludXRlczogMTAsXG4gICAgLy8gY29va2llRG9tYWluOiAnbXlEb21haW4nXG5cbiAgICBjb252ZXJ0RGV0ZWN0ZWRMYW5ndWFnZTogbCA9PiBsXG4gIH07XG59XG5jbGFzcyBCcm93c2VyIHtcbiAgY29uc3RydWN0b3Ioc2VydmljZXMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgdGhpcy50eXBlID0gJ2xhbmd1YWdlRGV0ZWN0b3InO1xuICAgIHRoaXMuZGV0ZWN0b3JzID0ge307XG4gICAgdGhpcy5pbml0KHNlcnZpY2VzLCBvcHRpb25zKTtcbiAgfVxuICBpbml0KHNlcnZpY2VzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGxldCBpMThuT3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdGhpcy5zZXJ2aWNlcyA9IHNlcnZpY2VzIHx8IHtcbiAgICAgIGxhbmd1YWdlVXRpbHM6IHt9XG4gICAgfTsgLy8gdGhpcyB3YXkgdGhlIGxhbmd1YWdlIGRldGVjdG9yIGNhbiBiZSB1c2VkIHdpdGhvdXQgaTE4bmV4dFxuICAgIHRoaXMub3B0aW9ucyA9IGRlZmF1bHRzKG9wdGlvbnMsIHRoaXMub3B0aW9ucyB8fCB7fSwgZ2V0RGVmYXVsdHMoKSk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuY29udmVydERldGVjdGVkTGFuZ3VhZ2UgPT09ICdzdHJpbmcnICYmIHRoaXMub3B0aW9ucy5jb252ZXJ0RGV0ZWN0ZWRMYW5ndWFnZS5pbmRleE9mKCcxNTg5NycpID4gLTEpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5jb252ZXJ0RGV0ZWN0ZWRMYW5ndWFnZSA9IGwgPT4gbC5yZXBsYWNlKCctJywgJ18nKTtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIGlmICh0aGlzLm9wdGlvbnMubG9va3VwRnJvbVVybEluZGV4KSB0aGlzLm9wdGlvbnMubG9va3VwRnJvbVBhdGhJbmRleCA9IHRoaXMub3B0aW9ucy5sb29rdXBGcm9tVXJsSW5kZXg7XG4gICAgdGhpcy5pMThuT3B0aW9ucyA9IGkxOG5PcHRpb25zO1xuICAgIHRoaXMuYWRkRGV0ZWN0b3IoY29va2llJDEpO1xuICAgIHRoaXMuYWRkRGV0ZWN0b3IocXVlcnlzdHJpbmcpO1xuICAgIHRoaXMuYWRkRGV0ZWN0b3IobG9jYWxTdG9yYWdlKTtcbiAgICB0aGlzLmFkZERldGVjdG9yKHNlc3Npb25TdG9yYWdlKTtcbiAgICB0aGlzLmFkZERldGVjdG9yKG5hdmlnYXRvciQxKTtcbiAgICB0aGlzLmFkZERldGVjdG9yKGh0bWxUYWcpO1xuICAgIHRoaXMuYWRkRGV0ZWN0b3IocGF0aCk7XG4gICAgdGhpcy5hZGREZXRlY3RvcihzdWJkb21haW4pO1xuICB9XG4gIGFkZERldGVjdG9yKGRldGVjdG9yKSB7XG4gICAgdGhpcy5kZXRlY3RvcnNbZGV0ZWN0b3IubmFtZV0gPSBkZXRlY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBkZXRlY3QoZGV0ZWN0aW9uT3JkZXIpIHtcbiAgICBpZiAoIWRldGVjdGlvbk9yZGVyKSBkZXRlY3Rpb25PcmRlciA9IHRoaXMub3B0aW9ucy5vcmRlcjtcbiAgICBsZXQgZGV0ZWN0ZWQgPSBbXTtcbiAgICBkZXRlY3Rpb25PcmRlci5mb3JFYWNoKGRldGVjdG9yTmFtZSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXRlY3RvcnNbZGV0ZWN0b3JOYW1lXSkge1xuICAgICAgICBsZXQgbG9va3VwID0gdGhpcy5kZXRlY3RvcnNbZGV0ZWN0b3JOYW1lXS5sb29rdXAodGhpcy5vcHRpb25zKTtcbiAgICAgICAgaWYgKGxvb2t1cCAmJiB0eXBlb2YgbG9va3VwID09PSAnc3RyaW5nJykgbG9va3VwID0gW2xvb2t1cF07XG4gICAgICAgIGlmIChsb29rdXApIGRldGVjdGVkID0gZGV0ZWN0ZWQuY29uY2F0KGxvb2t1cCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGV0ZWN0ZWQgPSBkZXRlY3RlZC5tYXAoZCA9PiB0aGlzLm9wdGlvbnMuY29udmVydERldGVjdGVkTGFuZ3VhZ2UoZCkpO1xuICAgIGlmICh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKSByZXR1cm4gZGV0ZWN0ZWQ7IC8vIG5ldyBpMThuZXh0IHYxOS41LjBcbiAgICByZXR1cm4gZGV0ZWN0ZWQubGVuZ3RoID4gMCA/IGRldGVjdGVkWzBdIDogbnVsbDsgLy8gYSBsaXR0bGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICB9XG5cbiAgY2FjaGVVc2VyTGFuZ3VhZ2UobG5nLCBjYWNoZXMpIHtcbiAgICBpZiAoIWNhY2hlcykgY2FjaGVzID0gdGhpcy5vcHRpb25zLmNhY2hlcztcbiAgICBpZiAoIWNhY2hlcykgcmV0dXJuO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZXhjbHVkZUNhY2hlRm9yICYmIHRoaXMub3B0aW9ucy5leGNsdWRlQ2FjaGVGb3IuaW5kZXhPZihsbmcpID4gLTEpIHJldHVybjtcbiAgICBjYWNoZXMuZm9yRWFjaChjYWNoZU5hbWUgPT4ge1xuICAgICAgaWYgKHRoaXMuZGV0ZWN0b3JzW2NhY2hlTmFtZV0pIHRoaXMuZGV0ZWN0b3JzW2NhY2hlTmFtZV0uY2FjaGVVc2VyTGFuZ3VhZ2UobG5nLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG59XG5Ccm93c2VyLnR5cGUgPSAnbGFuZ3VhZ2VEZXRlY3Rvcic7XG5cbmV4cG9ydCB7IEJyb3dzZXIgYXMgZGVmYXVsdCB9O1xuIiwiY29uc3QgY29uc29sZUxvZ2dlciA9IHtcbiAgdHlwZTogJ2xvZ2dlcicsXG4gIGxvZyhhcmdzKSB7XG4gICAgdGhpcy5vdXRwdXQoJ2xvZycsIGFyZ3MpO1xuICB9LFxuICB3YXJuKGFyZ3MpIHtcbiAgICB0aGlzLm91dHB1dCgnd2FybicsIGFyZ3MpO1xuICB9LFxuICBlcnJvcihhcmdzKSB7XG4gICAgdGhpcy5vdXRwdXQoJ2Vycm9yJywgYXJncyk7XG4gIH0sXG4gIG91dHB1dCh0eXBlLCBhcmdzKSB7XG4gICAgaWYgKGNvbnNvbGUgJiYgY29uc29sZVt0eXBlXSkgY29uc29sZVt0eXBlXS5hcHBseShjb25zb2xlLCBhcmdzKTtcbiAgfVxufTtcbmNsYXNzIExvZ2dlciB7XG4gIGNvbnN0cnVjdG9yKGNvbmNyZXRlTG9nZ2VyKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHRoaXMuaW5pdChjb25jcmV0ZUxvZ2dlciwgb3B0aW9ucyk7XG4gIH1cbiAgaW5pdChjb25jcmV0ZUxvZ2dlcikge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB0aGlzLnByZWZpeCA9IG9wdGlvbnMucHJlZml4IHx8ICdpMThuZXh0Oic7XG4gICAgdGhpcy5sb2dnZXIgPSBjb25jcmV0ZUxvZ2dlciB8fCBjb25zb2xlTG9nZ2VyO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG4gIH1cbiAgbG9nKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9yd2FyZChhcmdzLCAnbG9nJywgJycsIHRydWUpO1xuICB9XG4gIHdhcm4oKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcndhcmQoYXJncywgJ3dhcm4nLCAnJywgdHJ1ZSk7XG4gIH1cbiAgZXJyb3IoKSB7XG4gICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICBhcmdzW19rZXkzXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZvcndhcmQoYXJncywgJ2Vycm9yJywgJycpO1xuICB9XG4gIGRlcHJlY2F0ZSgpIHtcbiAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9yd2FyZChhcmdzLCAnd2FybicsICdXQVJOSU5HIERFUFJFQ0FURUQ6ICcsIHRydWUpO1xuICB9XG4gIGZvcndhcmQoYXJncywgbHZsLCBwcmVmaXgsIGRlYnVnT25seSkge1xuICAgIGlmIChkZWJ1Z09ubHkgJiYgIXRoaXMuZGVidWcpIHJldHVybiBudWxsO1xuICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpIGFyZ3NbMF0gPSBgJHtwcmVmaXh9JHt0aGlzLnByZWZpeH0gJHthcmdzWzBdfWA7XG4gICAgcmV0dXJuIHRoaXMubG9nZ2VyW2x2bF0oYXJncyk7XG4gIH1cbiAgY3JlYXRlKG1vZHVsZU5hbWUpIHtcbiAgICByZXR1cm4gbmV3IExvZ2dlcih0aGlzLmxvZ2dlciwge1xuICAgICAgLi4ue1xuICAgICAgICBwcmVmaXg6IGAke3RoaXMucHJlZml4fToke21vZHVsZU5hbWV9OmBcbiAgICAgIH0sXG4gICAgICAuLi50aGlzLm9wdGlvbnNcbiAgICB9KTtcbiAgfVxuICBjbG9uZShvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5vcHRpb25zO1xuICAgIG9wdGlvbnMucHJlZml4ID0gb3B0aW9ucy5wcmVmaXggfHwgdGhpcy5wcmVmaXg7XG4gICAgcmV0dXJuIG5ldyBMb2dnZXIodGhpcy5sb2dnZXIsIG9wdGlvbnMpO1xuICB9XG59XG52YXIgYmFzZUxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcblxuY2xhc3MgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5vYnNlcnZlcnMgPSB7fTtcbiAgfVxuICBvbihldmVudHMsIGxpc3RlbmVyKSB7XG4gICAgZXZlbnRzLnNwbGl0KCcgJykuZm9yRWFjaChldmVudCA9PiB7XG4gICAgICBpZiAoIXRoaXMub2JzZXJ2ZXJzW2V2ZW50XSkgdGhpcy5vYnNlcnZlcnNbZXZlbnRdID0gbmV3IE1hcCgpO1xuICAgICAgY29uc3QgbnVtTGlzdGVuZXJzID0gdGhpcy5vYnNlcnZlcnNbZXZlbnRdLmdldChsaXN0ZW5lcikgfHwgMDtcbiAgICAgIHRoaXMub2JzZXJ2ZXJzW2V2ZW50XS5zZXQobGlzdGVuZXIsIG51bUxpc3RlbmVycyArIDEpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIG9mZihldmVudCwgbGlzdGVuZXIpIHtcbiAgICBpZiAoIXRoaXMub2JzZXJ2ZXJzW2V2ZW50XSkgcmV0dXJuO1xuICAgIGlmICghbGlzdGVuZXIpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9ic2VydmVyc1tldmVudF07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub2JzZXJ2ZXJzW2V2ZW50XS5kZWxldGUobGlzdGVuZXIpO1xuICB9XG4gIGVtaXQoZXZlbnQpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXJzW2V2ZW50XSkge1xuICAgICAgY29uc3QgY2xvbmVkID0gQXJyYXkuZnJvbSh0aGlzLm9ic2VydmVyc1tldmVudF0uZW50cmllcygpKTtcbiAgICAgIGNsb25lZC5mb3JFYWNoKF9yZWYgPT4ge1xuICAgICAgICBsZXQgW29ic2VydmVyLCBudW1UaW1lc0FkZGVkXSA9IF9yZWY7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVGltZXNBZGRlZDsgaSsrKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5vYnNlcnZlcnNbJyonXSkge1xuICAgICAgY29uc3QgY2xvbmVkID0gQXJyYXkuZnJvbSh0aGlzLm9ic2VydmVyc1snKiddLmVudHJpZXMoKSk7XG4gICAgICBjbG9uZWQuZm9yRWFjaChfcmVmMiA9PiB7XG4gICAgICAgIGxldCBbb2JzZXJ2ZXIsIG51bVRpbWVzQWRkZWRdID0gX3JlZjI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVGltZXNBZGRlZDsgaSsrKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIuYXBwbHkob2JzZXJ2ZXIsIFtldmVudCwgLi4uYXJnc10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgZGVmZXIgPSAoKSA9PiB7XG4gIGxldCByZXM7XG4gIGxldCByZWo7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVzID0gcmVzb2x2ZTtcbiAgICByZWogPSByZWplY3Q7XG4gIH0pO1xuICBwcm9taXNlLnJlc29sdmUgPSByZXM7XG4gIHByb21pc2UucmVqZWN0ID0gcmVqO1xuICByZXR1cm4gcHJvbWlzZTtcbn07XG5jb25zdCBtYWtlU3RyaW5nID0gb2JqZWN0ID0+IHtcbiAgaWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gJyc7XG4gIHJldHVybiAnJyArIG9iamVjdDtcbn07XG5jb25zdCBjb3B5ID0gKGEsIHMsIHQpID0+IHtcbiAgYS5mb3JFYWNoKG0gPT4ge1xuICAgIGlmIChzW21dKSB0W21dID0gc1ttXTtcbiAgfSk7XG59O1xuY29uc3QgbGFzdE9mUGF0aFNlcGFyYXRvclJlZ0V4cCA9IC8jIyMvZztcbmNvbnN0IGNsZWFuS2V5ID0ga2V5ID0+IGtleSAmJiBrZXkuaW5kZXhPZignIyMjJykgPiAtMSA/IGtleS5yZXBsYWNlKGxhc3RPZlBhdGhTZXBhcmF0b3JSZWdFeHAsICcuJykgOiBrZXk7XG5jb25zdCBjYW5Ob3RUcmF2ZXJzZURlZXBlciA9IG9iamVjdCA9PiAhb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnO1xuY29uc3QgZ2V0TGFzdE9mUGF0aCA9IChvYmplY3QsIHBhdGgsIEVtcHR5KSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnID8gcGF0aCA6IHBhdGguc3BsaXQoJy4nKTtcbiAgbGV0IHN0YWNrSW5kZXggPSAwO1xuICB3aGlsZSAoc3RhY2tJbmRleCA8IHN0YWNrLmxlbmd0aCAtIDEpIHtcbiAgICBpZiAoY2FuTm90VHJhdmVyc2VEZWVwZXIob2JqZWN0KSkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IGtleSA9IGNsZWFuS2V5KHN0YWNrW3N0YWNrSW5kZXhdKTtcbiAgICBpZiAoIW9iamVjdFtrZXldICYmIEVtcHR5KSBvYmplY3Rba2V5XSA9IG5ldyBFbXB0eSgpO1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqZWN0ID0ge307XG4gICAgfVxuICAgICsrc3RhY2tJbmRleDtcbiAgfVxuICBpZiAoY2FuTm90VHJhdmVyc2VEZWVwZXIob2JqZWN0KSkgcmV0dXJuIHt9O1xuICByZXR1cm4ge1xuICAgIG9iajogb2JqZWN0LFxuICAgIGs6IGNsZWFuS2V5KHN0YWNrW3N0YWNrSW5kZXhdKVxuICB9O1xufTtcbmNvbnN0IHNldFBhdGggPSAob2JqZWN0LCBwYXRoLCBuZXdWYWx1ZSkgPT4ge1xuICBjb25zdCB7XG4gICAgb2JqLFxuICAgIGtcbiAgfSA9IGdldExhc3RPZlBhdGgob2JqZWN0LCBwYXRoLCBPYmplY3QpO1xuICBpZiAob2JqICE9PSB1bmRlZmluZWQgfHwgcGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICBvYmpba10gPSBuZXdWYWx1ZTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gIGxldCBwID0gcGF0aC5zbGljZSgwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICBsZXQgbGFzdCA9IGdldExhc3RPZlBhdGgob2JqZWN0LCBwLCBPYmplY3QpO1xuICB3aGlsZSAobGFzdC5vYmogPT09IHVuZGVmaW5lZCAmJiBwLmxlbmd0aCkge1xuICAgIGUgPSBgJHtwW3AubGVuZ3RoIC0gMV19LiR7ZX1gO1xuICAgIHAgPSBwLnNsaWNlKDAsIHAubGVuZ3RoIC0gMSk7XG4gICAgbGFzdCA9IGdldExhc3RPZlBhdGgob2JqZWN0LCBwLCBPYmplY3QpO1xuICAgIGlmIChsYXN0ICYmIGxhc3Qub2JqICYmIHR5cGVvZiBsYXN0Lm9ialtgJHtsYXN0Lmt9LiR7ZX1gXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxhc3Qub2JqID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICBsYXN0Lm9ialtgJHtsYXN0Lmt9LiR7ZX1gXSA9IG5ld1ZhbHVlO1xufTtcbmNvbnN0IHB1c2hQYXRoID0gKG9iamVjdCwgcGF0aCwgbmV3VmFsdWUsIGNvbmNhdCkgPT4ge1xuICBjb25zdCB7XG4gICAgb2JqLFxuICAgIGtcbiAgfSA9IGdldExhc3RPZlBhdGgob2JqZWN0LCBwYXRoLCBPYmplY3QpO1xuICBvYmpba10gPSBvYmpba10gfHwgW107XG4gIG9ialtrXS5wdXNoKG5ld1ZhbHVlKTtcbn07XG5jb25zdCBnZXRQYXRoID0gKG9iamVjdCwgcGF0aCkgPT4ge1xuICBjb25zdCB7XG4gICAgb2JqLFxuICAgIGtcbiAgfSA9IGdldExhc3RPZlBhdGgob2JqZWN0LCBwYXRoKTtcbiAgaWYgKCFvYmopIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBvYmpba107XG59O1xuY29uc3QgZ2V0UGF0aFdpdGhEZWZhdWx0cyA9IChkYXRhLCBkZWZhdWx0RGF0YSwga2V5KSA9PiB7XG4gIGNvbnN0IHZhbHVlID0gZ2V0UGF0aChkYXRhLCBrZXkpO1xuICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZ2V0UGF0aChkZWZhdWx0RGF0YSwga2V5KTtcbn07XG5jb25zdCBkZWVwRXh0ZW5kID0gKHRhcmdldCwgc291cmNlLCBvdmVyd3JpdGUpID0+IHtcbiAgZm9yIChjb25zdCBwcm9wIGluIHNvdXJjZSkge1xuICAgIGlmIChwcm9wICE9PSAnX19wcm90b19fJyAmJiBwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICBpZiAocHJvcCBpbiB0YXJnZXQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbcHJvcF0gPT09ICdzdHJpbmcnIHx8IHRhcmdldFtwcm9wXSBpbnN0YW5jZW9mIFN0cmluZyB8fCB0eXBlb2Ygc291cmNlW3Byb3BdID09PSAnc3RyaW5nJyB8fCBzb3VyY2VbcHJvcF0gaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgICBpZiAob3ZlcndyaXRlKSB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVlcEV4dGVuZCh0YXJnZXRbcHJvcF0sIHNvdXJjZVtwcm9wXSwgb3ZlcndyaXRlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufTtcbmNvbnN0IHJlZ2V4RXNjYXBlID0gc3RyID0+IHN0ci5yZXBsYWNlKC9bXFwtXFxbXFxdXFwvXFx7XFx9XFwoXFwpXFwqXFwrXFw/XFwuXFxcXFxcXlxcJFxcfF0vZywgJ1xcXFwkJicpO1xudmFyIF9lbnRpdHlNYXAgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmIzM5OycsXG4gICcvJzogJyYjeDJGOydcbn07XG5jb25zdCBlc2NhcGUgPSBkYXRhID0+IHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkYXRhLnJlcGxhY2UoL1smPD5cIidcXC9dL2csIHMgPT4gX2VudGl0eU1hcFtzXSk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59O1xuY2xhc3MgUmVnRXhwQ2FjaGUge1xuICBjb25zdHJ1Y3RvcihjYXBhY2l0eSkge1xuICAgIHRoaXMuY2FwYWNpdHkgPSBjYXBhY2l0eTtcbiAgICB0aGlzLnJlZ0V4cE1hcCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnJlZ0V4cFF1ZXVlID0gW107XG4gIH1cbiAgZ2V0UmVnRXhwKHBhdHRlcm4pIHtcbiAgICBjb25zdCByZWdFeHBGcm9tQ2FjaGUgPSB0aGlzLnJlZ0V4cE1hcC5nZXQocGF0dGVybik7XG4gICAgaWYgKHJlZ0V4cEZyb21DYWNoZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVnRXhwRnJvbUNhY2hlO1xuICAgIH1cbiAgICBjb25zdCByZWdFeHBOZXcgPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xuICAgIGlmICh0aGlzLnJlZ0V4cFF1ZXVlLmxlbmd0aCA9PT0gdGhpcy5jYXBhY2l0eSkge1xuICAgICAgdGhpcy5yZWdFeHBNYXAuZGVsZXRlKHRoaXMucmVnRXhwUXVldWUuc2hpZnQoKSk7XG4gICAgfVxuICAgIHRoaXMucmVnRXhwTWFwLnNldChwYXR0ZXJuLCByZWdFeHBOZXcpO1xuICAgIHRoaXMucmVnRXhwUXVldWUucHVzaChwYXR0ZXJuKTtcbiAgICByZXR1cm4gcmVnRXhwTmV3O1xuICB9XG59XG5jb25zdCBjaGFycyA9IFsnICcsICcsJywgJz8nLCAnIScsICc7J107XG5jb25zdCBsb29rc0xpa2VPYmplY3RQYXRoUmVnRXhwQ2FjaGUgPSBuZXcgUmVnRXhwQ2FjaGUoMjApO1xuY29uc3QgbG9va3NMaWtlT2JqZWN0UGF0aCA9IChrZXksIG5zU2VwYXJhdG9yLCBrZXlTZXBhcmF0b3IpID0+IHtcbiAgbnNTZXBhcmF0b3IgPSBuc1NlcGFyYXRvciB8fCAnJztcbiAga2V5U2VwYXJhdG9yID0ga2V5U2VwYXJhdG9yIHx8ICcnO1xuICBjb25zdCBwb3NzaWJsZUNoYXJzID0gY2hhcnMuZmlsdGVyKGMgPT4gbnNTZXBhcmF0b3IuaW5kZXhPZihjKSA8IDAgJiYga2V5U2VwYXJhdG9yLmluZGV4T2YoYykgPCAwKTtcbiAgaWYgKHBvc3NpYmxlQ2hhcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgciA9IGxvb2tzTGlrZU9iamVjdFBhdGhSZWdFeHBDYWNoZS5nZXRSZWdFeHAoYCgke3Bvc3NpYmxlQ2hhcnMubWFwKGMgPT4gYyA9PT0gJz8nID8gJ1xcXFw/JyA6IGMpLmpvaW4oJ3wnKX0pYCk7XG4gIGxldCBtYXRjaGVkID0gIXIudGVzdChrZXkpO1xuICBpZiAoIW1hdGNoZWQpIHtcbiAgICBjb25zdCBraSA9IGtleS5pbmRleE9mKGtleVNlcGFyYXRvcik7XG4gICAgaWYgKGtpID4gMCAmJiAhci50ZXN0KGtleS5zdWJzdHJpbmcoMCwga2kpKSkge1xuICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXRjaGVkO1xufTtcbmNvbnN0IGRlZXBGaW5kID0gZnVuY3Rpb24gKG9iaiwgcGF0aCkge1xuICBsZXQga2V5U2VwYXJhdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAnLic7XG4gIGlmICghb2JqKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAob2JqW3BhdGhdKSByZXR1cm4gb2JqW3BhdGhdO1xuICBjb25zdCB0b2tlbnMgPSBwYXRoLnNwbGl0KGtleVNlcGFyYXRvcik7XG4gIGxldCBjdXJyZW50ID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7KSB7XG4gICAgaWYgKCFjdXJyZW50IHx8IHR5cGVvZiBjdXJyZW50ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGV0IG5leHQ7XG4gICAgbGV0IG5leHRQYXRoID0gJyc7XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCB0b2tlbnMubGVuZ3RoOyArK2opIHtcbiAgICAgIGlmIChqICE9PSBpKSB7XG4gICAgICAgIG5leHRQYXRoICs9IGtleVNlcGFyYXRvcjtcbiAgICAgIH1cbiAgICAgIG5leHRQYXRoICs9IHRva2Vuc1tqXTtcbiAgICAgIG5leHQgPSBjdXJyZW50W25leHRQYXRoXTtcbiAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKFsnc3RyaW5nJywgJ251bWJlcicsICdib29sZWFuJ10uaW5kZXhPZih0eXBlb2YgbmV4dCkgPiAtMSAmJiBqIDwgdG9rZW5zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpICs9IGogLSBpICsgMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGN1cnJlbnQgPSBuZXh0O1xuICB9XG4gIHJldHVybiBjdXJyZW50O1xufTtcbmNvbnN0IGdldENsZWFuZWRDb2RlID0gY29kZSA9PiB7XG4gIGlmIChjb2RlICYmIGNvZGUuaW5kZXhPZignXycpID4gMCkgcmV0dXJuIGNvZGUucmVwbGFjZSgnXycsICctJyk7XG4gIHJldHVybiBjb2RlO1xufTtcblxuY2xhc3MgUmVzb3VyY2VTdG9yZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgICAgbnM6IFsndHJhbnNsYXRpb24nXSxcbiAgICAgIGRlZmF1bHROUzogJ3RyYW5zbGF0aW9uJ1xuICAgIH07XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRhdGEgPSBkYXRhIHx8IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvciA9ICcuJztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgYWRkTmFtZXNwYWNlcyhucykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubnMuaW5kZXhPZihucykgPCAwKSB7XG4gICAgICB0aGlzLm9wdGlvbnMubnMucHVzaChucyk7XG4gICAgfVxuICB9XG4gIHJlbW92ZU5hbWVzcGFjZXMobnMpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub3B0aW9ucy5ucy5pbmRleE9mKG5zKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5vcHRpb25zLm5zLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG4gIGdldFJlc291cmNlKGxuZywgbnMsIGtleSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICBjb25zdCBrZXlTZXBhcmF0b3IgPSBvcHRpb25zLmtleVNlcGFyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5rZXlTZXBhcmF0b3IgOiB0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO1xuICAgIGNvbnN0IGlnbm9yZUpTT05TdHJ1Y3R1cmUgPSBvcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSA6IHRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlO1xuICAgIGxldCBwYXRoO1xuICAgIGlmIChsbmcuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgIHBhdGggPSBsbmcuc3BsaXQoJy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCA9IFtsbmcsIG5zXTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgIHBhdGgucHVzaCguLi5rZXkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleVNlcGFyYXRvcikge1xuICAgICAgICAgIHBhdGgucHVzaCguLi5rZXkuc3BsaXQoa2V5U2VwYXJhdG9yKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0aC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZ2V0UGF0aCh0aGlzLmRhdGEsIHBhdGgpO1xuICAgIGlmICghcmVzdWx0ICYmICFucyAmJiAha2V5ICYmIGxuZy5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgbG5nID0gcGF0aFswXTtcbiAgICAgIG5zID0gcGF0aFsxXTtcbiAgICAgIGtleSA9IHBhdGguc2xpY2UoMikuam9pbignLicpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0IHx8ICFpZ25vcmVKU09OU3RydWN0dXJlIHx8IHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiBkZWVwRmluZCh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhW2xuZ10gJiYgdGhpcy5kYXRhW2xuZ11bbnNdLCBrZXksIGtleVNlcGFyYXRvcik7XG4gIH1cbiAgYWRkUmVzb3VyY2UobG5nLCBucywga2V5LCB2YWx1ZSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB7XG4gICAgICBzaWxlbnQ6IGZhbHNlXG4gICAgfTtcbiAgICBjb25zdCBrZXlTZXBhcmF0b3IgPSBvcHRpb25zLmtleVNlcGFyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5rZXlTZXBhcmF0b3IgOiB0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO1xuICAgIGxldCBwYXRoID0gW2xuZywgbnNdO1xuICAgIGlmIChrZXkpIHBhdGggPSBwYXRoLmNvbmNhdChrZXlTZXBhcmF0b3IgPyBrZXkuc3BsaXQoa2V5U2VwYXJhdG9yKSA6IGtleSk7XG4gICAgaWYgKGxuZy5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgcGF0aCA9IGxuZy5zcGxpdCgnLicpO1xuICAgICAgdmFsdWUgPSBucztcbiAgICAgIG5zID0gcGF0aFsxXTtcbiAgICB9XG4gICAgdGhpcy5hZGROYW1lc3BhY2VzKG5zKTtcbiAgICBzZXRQYXRoKHRoaXMuZGF0YSwgcGF0aCwgdmFsdWUpO1xuICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHRoaXMuZW1pdCgnYWRkZWQnLCBsbmcsIG5zLCBrZXksIHZhbHVlKTtcbiAgfVxuICBhZGRSZXNvdXJjZXMobG5nLCBucywgcmVzb3VyY2VzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHtcbiAgICAgIHNpbGVudDogZmFsc2VcbiAgICB9O1xuICAgIGZvciAoY29uc3QgbSBpbiByZXNvdXJjZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVzb3VyY2VzW21dID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KHJlc291cmNlc1ttXSkpIHRoaXMuYWRkUmVzb3VyY2UobG5nLCBucywgbSwgcmVzb3VyY2VzW21dLCB7XG4gICAgICAgIHNpbGVudDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHRoaXMuZW1pdCgnYWRkZWQnLCBsbmcsIG5zLCByZXNvdXJjZXMpO1xuICB9XG4gIGFkZFJlc291cmNlQnVuZGxlKGxuZywgbnMsIHJlc291cmNlcywgZGVlcCwgb3ZlcndyaXRlKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHtcbiAgICAgIHNpbGVudDogZmFsc2UsXG4gICAgICBza2lwQ29weTogZmFsc2VcbiAgICB9O1xuICAgIGxldCBwYXRoID0gW2xuZywgbnNdO1xuICAgIGlmIChsbmcuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgIHBhdGggPSBsbmcuc3BsaXQoJy4nKTtcbiAgICAgIGRlZXAgPSByZXNvdXJjZXM7XG4gICAgICByZXNvdXJjZXMgPSBucztcbiAgICAgIG5zID0gcGF0aFsxXTtcbiAgICB9XG4gICAgdGhpcy5hZGROYW1lc3BhY2VzKG5zKTtcbiAgICBsZXQgcGFjayA9IGdldFBhdGgodGhpcy5kYXRhLCBwYXRoKSB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMuc2tpcENvcHkpIHJlc291cmNlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzb3VyY2VzKSk7XG4gICAgaWYgKGRlZXApIHtcbiAgICAgIGRlZXBFeHRlbmQocGFjaywgcmVzb3VyY2VzLCBvdmVyd3JpdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYWNrID0ge1xuICAgICAgICAuLi5wYWNrLFxuICAgICAgICAuLi5yZXNvdXJjZXNcbiAgICAgIH07XG4gICAgfVxuICAgIHNldFBhdGgodGhpcy5kYXRhLCBwYXRoLCBwYWNrKTtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB0aGlzLmVtaXQoJ2FkZGVkJywgbG5nLCBucywgcmVzb3VyY2VzKTtcbiAgfVxuICByZW1vdmVSZXNvdXJjZUJ1bmRsZShsbmcsIG5zKSB7XG4gICAgaWYgKHRoaXMuaGFzUmVzb3VyY2VCdW5kbGUobG5nLCBucykpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRhdGFbbG5nXVtuc107XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlTmFtZXNwYWNlcyhucyk7XG4gICAgdGhpcy5lbWl0KCdyZW1vdmVkJywgbG5nLCBucyk7XG4gIH1cbiAgaGFzUmVzb3VyY2VCdW5kbGUobG5nLCBucykge1xuICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlKGxuZywgbnMpICE9PSB1bmRlZmluZWQ7XG4gIH1cbiAgZ2V0UmVzb3VyY2VCdW5kbGUobG5nLCBucykge1xuICAgIGlmICghbnMpIG5zID0gdGhpcy5vcHRpb25zLmRlZmF1bHROUztcbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkgPT09ICd2MScpIHJldHVybiB7XG4gICAgICAuLi57fSxcbiAgICAgIC4uLnRoaXMuZ2V0UmVzb3VyY2UobG5nLCBucylcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlKGxuZywgbnMpO1xuICB9XG4gIGdldERhdGFCeUxhbmd1YWdlKGxuZykge1xuICAgIHJldHVybiB0aGlzLmRhdGFbbG5nXTtcbiAgfVxuICBoYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMobG5nKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGF0YUJ5TGFuZ3VhZ2UobG5nKTtcbiAgICBjb25zdCBuID0gZGF0YSAmJiBPYmplY3Qua2V5cyhkYXRhKSB8fCBbXTtcbiAgICByZXR1cm4gISFuLmZpbmQodiA9PiBkYXRhW3ZdICYmIE9iamVjdC5rZXlzKGRhdGFbdl0pLmxlbmd0aCA+IDApO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG59XG5cbnZhciBwb3N0UHJvY2Vzc29yID0ge1xuICBwcm9jZXNzb3JzOiB7fSxcbiAgYWRkUG9zdFByb2Nlc3Nvcihtb2R1bGUpIHtcbiAgICB0aGlzLnByb2Nlc3NvcnNbbW9kdWxlLm5hbWVdID0gbW9kdWxlO1xuICB9LFxuICBoYW5kbGUocHJvY2Vzc29ycywgdmFsdWUsIGtleSwgb3B0aW9ucywgdHJhbnNsYXRvcikge1xuICAgIHByb2Nlc3NvcnMuZm9yRWFjaChwcm9jZXNzb3IgPT4ge1xuICAgICAgaWYgKHRoaXMucHJvY2Vzc29yc1twcm9jZXNzb3JdKSB2YWx1ZSA9IHRoaXMucHJvY2Vzc29yc1twcm9jZXNzb3JdLnByb2Nlc3ModmFsdWUsIGtleSwgb3B0aW9ucywgdHJhbnNsYXRvcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5jb25zdCBjaGVja2VkTG9hZGVkRm9yID0ge307XG5jbGFzcyBUcmFuc2xhdG9yIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3Ioc2VydmljZXMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgc3VwZXIoKTtcbiAgICBjb3B5KFsncmVzb3VyY2VTdG9yZScsICdsYW5ndWFnZVV0aWxzJywgJ3BsdXJhbFJlc29sdmVyJywgJ2ludGVycG9sYXRvcicsICdiYWNrZW5kQ29ubmVjdG9yJywgJ2kxOG5Gb3JtYXQnLCAndXRpbHMnXSwgc2VydmljZXMsIHRoaXMpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvciA9ICcuJztcbiAgICB9XG4gICAgdGhpcy5sb2dnZXIgPSBiYXNlTG9nZ2VyLmNyZWF0ZSgndHJhbnNsYXRvcicpO1xuICB9XG4gIGNoYW5nZUxhbmd1YWdlKGxuZykge1xuICAgIGlmIChsbmcpIHRoaXMubGFuZ3VhZ2UgPSBsbmc7XG4gIH1cbiAgZXhpc3RzKGtleSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgICBpbnRlcnBvbGF0aW9uOiB7fVxuICAgIH07XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZShrZXksIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXNvbHZlZCAmJiByZXNvbHZlZC5yZXMgIT09IHVuZGVmaW5lZDtcbiAgfVxuICBleHRyYWN0RnJvbUtleShrZXksIG9wdGlvbnMpIHtcbiAgICBsZXQgbnNTZXBhcmF0b3IgPSBvcHRpb25zLm5zU2VwYXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5zU2VwYXJhdG9yIDogdGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO1xuICAgIGlmIChuc1NlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSBuc1NlcGFyYXRvciA9ICc6JztcbiAgICBjb25zdCBrZXlTZXBhcmF0b3IgPSBvcHRpb25zLmtleVNlcGFyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5rZXlTZXBhcmF0b3IgOiB0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO1xuICAgIGxldCBuYW1lc3BhY2VzID0gb3B0aW9ucy5ucyB8fCB0aGlzLm9wdGlvbnMuZGVmYXVsdE5TIHx8IFtdO1xuICAgIGNvbnN0IHdvdWxkQ2hlY2tGb3JOc0luS2V5ID0gbnNTZXBhcmF0b3IgJiYga2V5LmluZGV4T2YobnNTZXBhcmF0b3IpID4gLTE7XG4gICAgY29uc3Qgc2VlbXNOYXR1cmFsTGFuZ3VhZ2UgPSAhdGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yICYmICFvcHRpb25zLmtleVNlcGFyYXRvciAmJiAhdGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkTnNTZXBhcmF0b3IgJiYgIW9wdGlvbnMubnNTZXBhcmF0b3IgJiYgIWxvb2tzTGlrZU9iamVjdFBhdGgoa2V5LCBuc1NlcGFyYXRvciwga2V5U2VwYXJhdG9yKTtcbiAgICBpZiAod291bGRDaGVja0Zvck5zSW5LZXkgJiYgIXNlZW1zTmF0dXJhbExhbmd1YWdlKSB7XG4gICAgICBjb25zdCBtID0ga2V5Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO1xuICAgICAgaWYgKG0gJiYgbS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWVzcGFjZXNcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcnRzID0ga2V5LnNwbGl0KG5zU2VwYXJhdG9yKTtcbiAgICAgIGlmIChuc1NlcGFyYXRvciAhPT0ga2V5U2VwYXJhdG9yIHx8IG5zU2VwYXJhdG9yID09PSBrZXlTZXBhcmF0b3IgJiYgdGhpcy5vcHRpb25zLm5zLmluZGV4T2YocGFydHNbMF0pID4gLTEpIG5hbWVzcGFjZXMgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAga2V5ID0gcGFydHMuam9pbihrZXlTZXBhcmF0b3IpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnKSBuYW1lc3BhY2VzID0gW25hbWVzcGFjZXNdO1xuICAgIHJldHVybiB7XG4gICAgICBrZXksXG4gICAgICBuYW1lc3BhY2VzXG4gICAgfTtcbiAgfVxuICB0cmFuc2xhdGUoa2V5cywgb3B0aW9ucywgbGFzdEtleSkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcgJiYgdGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKSB7XG4gICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIG9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgICBpZiAoa2V5cyA9PT0gdW5kZWZpbmVkIHx8IGtleXMgPT09IG51bGwpIHJldHVybiAnJztcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5cykpIGtleXMgPSBbU3RyaW5nKGtleXMpXTtcbiAgICBjb25zdCByZXR1cm5EZXRhaWxzID0gb3B0aW9ucy5yZXR1cm5EZXRhaWxzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnJldHVybkRldGFpbHMgOiB0aGlzLm9wdGlvbnMucmV0dXJuRGV0YWlscztcbiAgICBjb25zdCBrZXlTZXBhcmF0b3IgPSBvcHRpb25zLmtleVNlcGFyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5rZXlTZXBhcmF0b3IgOiB0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yO1xuICAgIGNvbnN0IHtcbiAgICAgIGtleSxcbiAgICAgIG5hbWVzcGFjZXNcbiAgICB9ID0gdGhpcy5leHRyYWN0RnJvbUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0sIG9wdGlvbnMpO1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IG5hbWVzcGFjZXNbbmFtZXNwYWNlcy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBsbmcgPSBvcHRpb25zLmxuZyB8fCB0aGlzLmxhbmd1YWdlO1xuICAgIGNvbnN0IGFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlID0gb3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZSB8fCB0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7XG4gICAgaWYgKGxuZyAmJiBsbmcudG9Mb3dlckNhc2UoKSA9PT0gJ2NpbW9kZScpIHtcbiAgICAgIGlmIChhcHBlbmROYW1lc3BhY2VUb0NJTW9kZSkge1xuICAgICAgICBjb25zdCBuc1NlcGFyYXRvciA9IG9wdGlvbnMubnNTZXBhcmF0b3IgfHwgdGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO1xuICAgICAgICBpZiAocmV0dXJuRGV0YWlscykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXM6IGAke25hbWVzcGFjZX0ke25zU2VwYXJhdG9yfSR7a2V5fWAsXG4gICAgICAgICAgICB1c2VkS2V5OiBrZXksXG4gICAgICAgICAgICBleGFjdFVzZWRLZXk6IGtleSxcbiAgICAgICAgICAgIHVzZWRMbmc6IGxuZyxcbiAgICAgICAgICAgIHVzZWROUzogbmFtZXNwYWNlLFxuICAgICAgICAgICAgdXNlZFBhcmFtczogdGhpcy5nZXRVc2VkUGFyYW1zRGV0YWlscyhvcHRpb25zKVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke25hbWVzcGFjZX0ke25zU2VwYXJhdG9yfSR7a2V5fWA7XG4gICAgICB9XG4gICAgICBpZiAocmV0dXJuRGV0YWlscykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlczoga2V5LFxuICAgICAgICAgIHVzZWRLZXk6IGtleSxcbiAgICAgICAgICBleGFjdFVzZWRLZXk6IGtleSxcbiAgICAgICAgICB1c2VkTG5nOiBsbmcsXG4gICAgICAgICAgdXNlZE5TOiBuYW1lc3BhY2UsXG4gICAgICAgICAgdXNlZFBhcmFtczogdGhpcy5nZXRVc2VkUGFyYW1zRGV0YWlscyhvcHRpb25zKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmUoa2V5cywgb3B0aW9ucyk7XG4gICAgbGV0IHJlcyA9IHJlc29sdmVkICYmIHJlc29sdmVkLnJlcztcbiAgICBjb25zdCByZXNVc2VkS2V5ID0gcmVzb2x2ZWQgJiYgcmVzb2x2ZWQudXNlZEtleSB8fCBrZXk7XG4gICAgY29uc3QgcmVzRXhhY3RVc2VkS2V5ID0gcmVzb2x2ZWQgJiYgcmVzb2x2ZWQuZXhhY3RVc2VkS2V5IHx8IGtleTtcbiAgICBjb25zdCByZXNUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShyZXMpO1xuICAgIGNvbnN0IG5vT2JqZWN0ID0gWydbb2JqZWN0IE51bWJlcl0nLCAnW29iamVjdCBGdW5jdGlvbl0nLCAnW29iamVjdCBSZWdFeHBdJ107XG4gICAgY29uc3Qgam9pbkFycmF5cyA9IG9wdGlvbnMuam9pbkFycmF5cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5qb2luQXJyYXlzIDogdGhpcy5vcHRpb25zLmpvaW5BcnJheXM7XG4gICAgY29uc3QgaGFuZGxlQXNPYmplY3RJbkkxOG5Gb3JtYXQgPSAhdGhpcy5pMThuRm9ybWF0IHx8IHRoaXMuaTE4bkZvcm1hdC5oYW5kbGVBc09iamVjdDtcbiAgICBjb25zdCBoYW5kbGVBc09iamVjdCA9IHR5cGVvZiByZXMgIT09ICdzdHJpbmcnICYmIHR5cGVvZiByZXMgIT09ICdib29sZWFuJyAmJiB0eXBlb2YgcmVzICE9PSAnbnVtYmVyJztcbiAgICBpZiAoaGFuZGxlQXNPYmplY3RJbkkxOG5Gb3JtYXQgJiYgcmVzICYmIGhhbmRsZUFzT2JqZWN0ICYmIG5vT2JqZWN0LmluZGV4T2YocmVzVHlwZSkgPCAwICYmICEodHlwZW9mIGpvaW5BcnJheXMgPT09ICdzdHJpbmcnICYmIEFycmF5LmlzQXJyYXkocmVzKSkpIHtcbiAgICAgIGlmICghb3B0aW9ucy5yZXR1cm5PYmplY3RzICYmICF0aGlzLm9wdGlvbnMucmV0dXJuT2JqZWN0cykge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByID0gdGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlciA/IHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIocmVzVXNlZEtleSwgcmVzLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICBuczogbmFtZXNwYWNlc1xuICAgICAgICB9KSA6IGBrZXkgJyR7a2V5fSAoJHt0aGlzLmxhbmd1YWdlfSknIHJldHVybmVkIGFuIG9iamVjdCBpbnN0ZWFkIG9mIHN0cmluZy5gO1xuICAgICAgICBpZiAocmV0dXJuRGV0YWlscykge1xuICAgICAgICAgIHJlc29sdmVkLnJlcyA9IHI7XG4gICAgICAgICAgcmVzb2x2ZWQudXNlZFBhcmFtcyA9IHRoaXMuZ2V0VXNlZFBhcmFtc0RldGFpbHMob3B0aW9ucyk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuICAgICAgaWYgKGtleVNlcGFyYXRvcikge1xuICAgICAgICBjb25zdCByZXNUeXBlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkocmVzKTtcbiAgICAgICAgY29uc3QgY29weSA9IHJlc1R5cGVJc0FycmF5ID8gW10gOiB7fTtcbiAgICAgICAgY29uc3QgbmV3S2V5VG9Vc2UgPSByZXNUeXBlSXNBcnJheSA/IHJlc0V4YWN0VXNlZEtleSA6IHJlc1VzZWRLZXk7XG4gICAgICAgIGZvciAoY29uc3QgbSBpbiByZXMpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlcywgbSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZXBLZXkgPSBgJHtuZXdLZXlUb1VzZX0ke2tleVNlcGFyYXRvcn0ke219YDtcbiAgICAgICAgICAgIGNvcHlbbV0gPSB0aGlzLnRyYW5zbGF0ZShkZWVwS2V5LCB7XG4gICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgIC4uLntcbiAgICAgICAgICAgICAgICBqb2luQXJyYXlzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBuczogbmFtZXNwYWNlc1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjb3B5W21dID09PSBkZWVwS2V5KSBjb3B5W21dID0gcmVzW21dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXMgPSBjb3B5O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGFuZGxlQXNPYmplY3RJbkkxOG5Gb3JtYXQgJiYgdHlwZW9mIGpvaW5BcnJheXMgPT09ICdzdHJpbmcnICYmIEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgcmVzID0gcmVzLmpvaW4oam9pbkFycmF5cyk7XG4gICAgICBpZiAocmVzKSByZXMgPSB0aGlzLmV4dGVuZFRyYW5zbGF0aW9uKHJlcywga2V5cywgb3B0aW9ucywgbGFzdEtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB1c2VkRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgbGV0IHVzZWRLZXkgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG5lZWRzUGx1cmFsSGFuZGxpbmcgPSBvcHRpb25zLmNvdW50ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuY291bnQgIT09ICdzdHJpbmcnO1xuICAgICAgY29uc3QgaGFzRGVmYXVsdFZhbHVlID0gVHJhbnNsYXRvci5oYXNEZWZhdWx0VmFsdWUob3B0aW9ucyk7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWVTdWZmaXggPSBuZWVkc1BsdXJhbEhhbmRsaW5nID8gdGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgobG5nLCBvcHRpb25zLmNvdW50LCBvcHRpb25zKSA6ICcnO1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlU3VmZml4T3JkaW5hbEZhbGxiYWNrID0gb3B0aW9ucy5vcmRpbmFsICYmIG5lZWRzUGx1cmFsSGFuZGxpbmcgPyB0aGlzLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChsbmcsIG9wdGlvbnMuY291bnQsIHtcbiAgICAgICAgb3JkaW5hbDogZmFsc2VcbiAgICAgIH0pIDogJyc7XG4gICAgICBjb25zdCBuZWVkc1plcm9TdWZmaXhMb29rdXAgPSBuZWVkc1BsdXJhbEhhbmRsaW5nICYmICFvcHRpb25zLm9yZGluYWwgJiYgb3B0aW9ucy5jb3VudCA9PT0gMCAmJiB0aGlzLnBsdXJhbFJlc29sdmVyLnNob3VsZFVzZUludGxBcGkoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IG5lZWRzWmVyb1N1ZmZpeExvb2t1cCAmJiBvcHRpb25zW2BkZWZhdWx0VmFsdWUke3RoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3J9emVyb2BdIHx8IG9wdGlvbnNbYGRlZmF1bHRWYWx1ZSR7ZGVmYXVsdFZhbHVlU3VmZml4fWBdIHx8IG9wdGlvbnNbYGRlZmF1bHRWYWx1ZSR7ZGVmYXVsdFZhbHVlU3VmZml4T3JkaW5hbEZhbGxiYWNrfWBdIHx8IG9wdGlvbnMuZGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRMb29rdXAocmVzKSAmJiBoYXNEZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgdXNlZERlZmF1bHQgPSB0cnVlO1xuICAgICAgICByZXMgPSBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZExvb2t1cChyZXMpKSB7XG4gICAgICAgIHVzZWRLZXkgPSB0cnVlO1xuICAgICAgICByZXMgPSBrZXk7XG4gICAgICB9XG4gICAgICBjb25zdCBtaXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkgPSBvcHRpb25zLm1pc3NpbmdLZXlOb1ZhbHVlRmFsbGJhY2tUb0tleSB8fCB0aGlzLm9wdGlvbnMubWlzc2luZ0tleU5vVmFsdWVGYWxsYmFja1RvS2V5O1xuICAgICAgY29uc3QgcmVzRm9yTWlzc2luZyA9IG1pc3NpbmdLZXlOb1ZhbHVlRmFsbGJhY2tUb0tleSAmJiB1c2VkS2V5ID8gdW5kZWZpbmVkIDogcmVzO1xuICAgICAgY29uc3QgdXBkYXRlTWlzc2luZyA9IGhhc0RlZmF1bHRWYWx1ZSAmJiBkZWZhdWx0VmFsdWUgIT09IHJlcyAmJiB0aGlzLm9wdGlvbnMudXBkYXRlTWlzc2luZztcbiAgICAgIGlmICh1c2VkS2V5IHx8IHVzZWREZWZhdWx0IHx8IHVwZGF0ZU1pc3NpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKHVwZGF0ZU1pc3NpbmcgPyAndXBkYXRlS2V5JyA6ICdtaXNzaW5nS2V5JywgbG5nLCBuYW1lc3BhY2UsIGtleSwgdXBkYXRlTWlzc2luZyA/IGRlZmF1bHRWYWx1ZSA6IHJlcyk7XG4gICAgICAgIGlmIChrZXlTZXBhcmF0b3IpIHtcbiAgICAgICAgICBjb25zdCBmayA9IHRoaXMucmVzb2x2ZShrZXksIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBrZXlTZXBhcmF0b3I6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGZrICYmIGZrLnJlcykgdGhpcy5sb2dnZXIud2FybignU2VlbXMgdGhlIGxvYWRlZCB0cmFuc2xhdGlvbnMgd2VyZSBpbiBmbGF0IEpTT04gZm9ybWF0IGluc3RlYWQgb2YgbmVzdGVkLiBFaXRoZXIgc2V0IGtleVNlcGFyYXRvcjogZmFsc2Ugb24gaW5pdCBvciBtYWtlIHN1cmUgeW91ciB0cmFuc2xhdGlvbnMgYXJlIHB1Ymxpc2hlZCBpbiBuZXN0ZWQgZm9ybWF0LicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsbmdzID0gW107XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrTG5ncyA9IHRoaXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZywgb3B0aW9ucy5sbmcgfHwgdGhpcy5sYW5ndWFnZSk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbyA9PT0gJ2ZhbGxiYWNrJyAmJiBmYWxsYmFja0xuZ3MgJiYgZmFsbGJhY2tMbmdzWzBdKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmYWxsYmFja0xuZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxuZ3MucHVzaChmYWxsYmFja0xuZ3NbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbyA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBsbmdzID0gdGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvcHRpb25zLmxuZyB8fCB0aGlzLmxhbmd1YWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsbmdzLnB1c2gob3B0aW9ucy5sbmcgfHwgdGhpcy5sYW5ndWFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VuZCA9IChsLCBrLCBzcGVjaWZpY0RlZmF1bHRWYWx1ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRGb3JNaXNzaW5nID0gaGFzRGVmYXVsdFZhbHVlICYmIHNwZWNpZmljRGVmYXVsdFZhbHVlICE9PSByZXMgPyBzcGVjaWZpY0RlZmF1bHRWYWx1ZSA6IHJlc0Zvck1pc3Npbmc7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKGwsIG5hbWVzcGFjZSwgaywgZGVmYXVsdEZvck1pc3NpbmcsIHVwZGF0ZU1pc3NpbmcsIG9wdGlvbnMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5iYWNrZW5kQ29ubmVjdG9yICYmIHRoaXMuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZykge1xuICAgICAgICAgICAgdGhpcy5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKGwsIG5hbWVzcGFjZSwgaywgZGVmYXVsdEZvck1pc3NpbmcsIHVwZGF0ZU1pc3NpbmcsIG9wdGlvbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmVtaXQoJ21pc3NpbmdLZXknLCBsLCBuYW1lc3BhY2UsIGssIHJlcyk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmcpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nUGx1cmFscyAmJiBuZWVkc1BsdXJhbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICBsbmdzLmZvckVhY2gobGFuZ3VhZ2UgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzdWZmaXhlcyA9IHRoaXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4ZXMobGFuZ3VhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICBpZiAobmVlZHNaZXJvU3VmZml4TG9va3VwICYmIG9wdGlvbnNbYGRlZmF1bHRWYWx1ZSR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn16ZXJvYF0gJiYgc3VmZml4ZXMuaW5kZXhPZihgJHt0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yfXplcm9gKSA8IDApIHtcbiAgICAgICAgICAgICAgICBzdWZmaXhlcy5wdXNoKGAke3RoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3J9emVyb2ApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN1ZmZpeGVzLmZvckVhY2goc3VmZml4ID0+IHtcbiAgICAgICAgICAgICAgICBzZW5kKFtsYW5ndWFnZV0sIGtleSArIHN1ZmZpeCwgb3B0aW9uc1tgZGVmYXVsdFZhbHVlJHtzdWZmaXh9YF0gfHwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VuZChsbmdzLCBrZXksIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXMgPSB0aGlzLmV4dGVuZFRyYW5zbGF0aW9uKHJlcywga2V5cywgb3B0aW9ucywgcmVzb2x2ZWQsIGxhc3RLZXkpO1xuICAgICAgaWYgKHVzZWRLZXkgJiYgcmVzID09PSBrZXkgJiYgdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSkgcmVzID0gYCR7bmFtZXNwYWNlfToke2tleX1gO1xuICAgICAgaWYgKCh1c2VkS2V5IHx8IHVzZWREZWZhdWx0KSAmJiB0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcikge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkgIT09ICd2MScpIHtcbiAgICAgICAgICByZXMgPSB0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcih0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5ID8gYCR7bmFtZXNwYWNlfToke2tleX1gIDoga2V5LCB1c2VkRGVmYXVsdCA/IHJlcyA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzID0gdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIocmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmV0dXJuRGV0YWlscykge1xuICAgICAgcmVzb2x2ZWQucmVzID0gcmVzO1xuICAgICAgcmVzb2x2ZWQudXNlZFBhcmFtcyA9IHRoaXMuZ2V0VXNlZFBhcmFtc0RldGFpbHMob3B0aW9ucyk7XG4gICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgZXh0ZW5kVHJhbnNsYXRpb24ocmVzLCBrZXksIG9wdGlvbnMsIHJlc29sdmVkLCBsYXN0S2V5KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBpZiAodGhpcy5pMThuRm9ybWF0ICYmIHRoaXMuaTE4bkZvcm1hdC5wYXJzZSkge1xuICAgICAgcmVzID0gdGhpcy5pMThuRm9ybWF0LnBhcnNlKHJlcywge1xuICAgICAgICAuLi50aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9LCBvcHRpb25zLmxuZyB8fCB0aGlzLmxhbmd1YWdlIHx8IHJlc29sdmVkLnVzZWRMbmcsIHJlc29sdmVkLnVzZWROUywgcmVzb2x2ZWQudXNlZEtleSwge1xuICAgICAgICByZXNvbHZlZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghb3B0aW9ucy5za2lwSW50ZXJwb2xhdGlvbikge1xuICAgICAgaWYgKG9wdGlvbnMuaW50ZXJwb2xhdGlvbikgdGhpcy5pbnRlcnBvbGF0b3IuaW5pdCh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIC4uLntcbiAgICAgICAgICBpbnRlcnBvbGF0aW9uOiB7XG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICAgIC4uLm9wdGlvbnMuaW50ZXJwb2xhdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBza2lwT25WYXJpYWJsZXMgPSB0eXBlb2YgcmVzID09PSAnc3RyaW5nJyAmJiAob3B0aW9ucyAmJiBvcHRpb25zLmludGVycG9sYXRpb24gJiYgb3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyA6IHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyk7XG4gICAgICBsZXQgbmVzdEJlZjtcbiAgICAgIGlmIChza2lwT25WYXJpYWJsZXMpIHtcbiAgICAgICAgY29uc3QgbmIgPSByZXMubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7XG4gICAgICAgIG5lc3RCZWYgPSBuYiAmJiBuYi5sZW5ndGg7XG4gICAgICB9XG4gICAgICBsZXQgZGF0YSA9IG9wdGlvbnMucmVwbGFjZSAmJiB0eXBlb2Ygb3B0aW9ucy5yZXBsYWNlICE9PSAnc3RyaW5nJyA/IG9wdGlvbnMucmVwbGFjZSA6IG9wdGlvbnM7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcykgZGF0YSA9IHtcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyxcbiAgICAgICAgLi4uZGF0YVxuICAgICAgfTtcbiAgICAgIHJlcyA9IHRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKHJlcywgZGF0YSwgb3B0aW9ucy5sbmcgfHwgdGhpcy5sYW5ndWFnZSB8fCByZXNvbHZlZC51c2VkTG5nLCBvcHRpb25zKTtcbiAgICAgIGlmIChza2lwT25WYXJpYWJsZXMpIHtcbiAgICAgICAgY29uc3QgbmEgPSByZXMubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7XG4gICAgICAgIGNvbnN0IG5lc3RBZnQgPSBuYSAmJiBuYS5sZW5ndGg7XG4gICAgICAgIGlmIChuZXN0QmVmIDwgbmVzdEFmdCkgb3B0aW9ucy5uZXN0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIW9wdGlvbnMubG5nICYmIHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJICE9PSAndjEnICYmIHJlc29sdmVkICYmIHJlc29sdmVkLnJlcykgb3B0aW9ucy5sbmcgPSB0aGlzLmxhbmd1YWdlIHx8IHJlc29sdmVkLnVzZWRMbmc7XG4gICAgICBpZiAob3B0aW9ucy5uZXN0ICE9PSBmYWxzZSkgcmVzID0gdGhpcy5pbnRlcnBvbGF0b3IubmVzdChyZXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdEtleSAmJiBsYXN0S2V5WzBdID09PSBhcmdzWzBdICYmICFvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICBfdGhpcy5sb2dnZXIud2FybihgSXQgc2VlbXMgeW91IGFyZSBuZXN0aW5nIHJlY3Vyc2l2ZWx5IGtleTogJHthcmdzWzBdfSBpbiBrZXk6ICR7a2V5WzBdfWApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcy50cmFuc2xhdGUoLi4uYXJncywga2V5KTtcbiAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgaWYgKG9wdGlvbnMuaW50ZXJwb2xhdGlvbikgdGhpcy5pbnRlcnBvbGF0b3IucmVzZXQoKTtcbiAgICB9XG4gICAgY29uc3QgcG9zdFByb2Nlc3MgPSBvcHRpb25zLnBvc3RQcm9jZXNzIHx8IHRoaXMub3B0aW9ucy5wb3N0UHJvY2VzcztcbiAgICBjb25zdCBwb3N0UHJvY2Vzc29yTmFtZXMgPSB0eXBlb2YgcG9zdFByb2Nlc3MgPT09ICdzdHJpbmcnID8gW3Bvc3RQcm9jZXNzXSA6IHBvc3RQcm9jZXNzO1xuICAgIGlmIChyZXMgIT09IHVuZGVmaW5lZCAmJiByZXMgIT09IG51bGwgJiYgcG9zdFByb2Nlc3Nvck5hbWVzICYmIHBvc3RQcm9jZXNzb3JOYW1lcy5sZW5ndGggJiYgb3B0aW9ucy5hcHBseVBvc3RQcm9jZXNzb3IgIT09IGZhbHNlKSB7XG4gICAgICByZXMgPSBwb3N0UHJvY2Vzc29yLmhhbmRsZShwb3N0UHJvY2Vzc29yTmFtZXMsIHJlcywga2V5LCB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkID8ge1xuICAgICAgICBpMThuUmVzb2x2ZWQ6IHtcbiAgICAgICAgICAuLi5yZXNvbHZlZCxcbiAgICAgICAgICB1c2VkUGFyYW1zOiB0aGlzLmdldFVzZWRQYXJhbXNEZXRhaWxzKG9wdGlvbnMpXG4gICAgICAgIH0sXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICAgIH0gOiBvcHRpb25zLCB0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICByZXNvbHZlKGtleXMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgbGV0IGZvdW5kO1xuICAgIGxldCB1c2VkS2V5O1xuICAgIGxldCBleGFjdFVzZWRLZXk7XG4gICAgbGV0IHVzZWRMbmc7XG4gICAgbGV0IHVzZWROUztcbiAgICBpZiAodHlwZW9mIGtleXMgPT09ICdzdHJpbmcnKSBrZXlzID0gW2tleXNdO1xuICAgIGtleXMuZm9yRWFjaChrID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVmFsaWRMb29rdXAoZm91bmQpKSByZXR1cm47XG4gICAgICBjb25zdCBleHRyYWN0ZWQgPSB0aGlzLmV4dHJhY3RGcm9tS2V5KGssIG9wdGlvbnMpO1xuICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdGVkLmtleTtcbiAgICAgIHVzZWRLZXkgPSBrZXk7XG4gICAgICBsZXQgbmFtZXNwYWNlcyA9IGV4dHJhY3RlZC5uYW1lc3BhY2VzO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWxsYmFja05TKSBuYW1lc3BhY2VzID0gbmFtZXNwYWNlcy5jb25jYXQodGhpcy5vcHRpb25zLmZhbGxiYWNrTlMpO1xuICAgICAgY29uc3QgbmVlZHNQbHVyYWxIYW5kbGluZyA9IG9wdGlvbnMuY291bnQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5jb3VudCAhPT0gJ3N0cmluZyc7XG4gICAgICBjb25zdCBuZWVkc1plcm9TdWZmaXhMb29rdXAgPSBuZWVkc1BsdXJhbEhhbmRsaW5nICYmICFvcHRpb25zLm9yZGluYWwgJiYgb3B0aW9ucy5jb3VudCA9PT0gMCAmJiB0aGlzLnBsdXJhbFJlc29sdmVyLnNob3VsZFVzZUludGxBcGkoKTtcbiAgICAgIGNvbnN0IG5lZWRzQ29udGV4dEhhbmRsaW5nID0gb3B0aW9ucy5jb250ZXh0ICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdudW1iZXInKSAmJiBvcHRpb25zLmNvbnRleHQgIT09ICcnO1xuICAgICAgY29uc3QgY29kZXMgPSBvcHRpb25zLmxuZ3MgPyBvcHRpb25zLmxuZ3MgOiB0aGlzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2UsIG9wdGlvbnMuZmFsbGJhY2tMbmcpO1xuICAgICAgbmFtZXNwYWNlcy5mb3JFYWNoKG5zID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNWYWxpZExvb2t1cChmb3VuZCkpIHJldHVybjtcbiAgICAgICAgdXNlZE5TID0gbnM7XG4gICAgICAgIGlmICghY2hlY2tlZExvYWRlZEZvcltgJHtjb2Rlc1swXX0tJHtuc31gXSAmJiB0aGlzLnV0aWxzICYmIHRoaXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlICYmICF0aGlzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSh1c2VkTlMpKSB7XG4gICAgICAgICAgY2hlY2tlZExvYWRlZEZvcltgJHtjb2Rlc1swXX0tJHtuc31gXSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2Fybihga2V5IFwiJHt1c2VkS2V5fVwiIGZvciBsYW5ndWFnZXMgXCIke2NvZGVzLmpvaW4oJywgJyl9XCIgd29uJ3QgZ2V0IHJlc29sdmVkIGFzIG5hbWVzcGFjZSBcIiR7dXNlZE5TfVwiIHdhcyBub3QgeWV0IGxvYWRlZGAsICdUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEnKTtcbiAgICAgICAgfVxuICAgICAgICBjb2Rlcy5mb3JFYWNoKGNvZGUgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRMb29rdXAoZm91bmQpKSByZXR1cm47XG4gICAgICAgICAgdXNlZExuZyA9IGNvZGU7XG4gICAgICAgICAgY29uc3QgZmluYWxLZXlzID0gW2tleV07XG4gICAgICAgICAgaWYgKHRoaXMuaTE4bkZvcm1hdCAmJiB0aGlzLmkxOG5Gb3JtYXQuYWRkTG9va3VwS2V5cykge1xuICAgICAgICAgICAgdGhpcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMoZmluYWxLZXlzLCBrZXksIGNvZGUsIG5zLCBvcHRpb25zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBsdXJhbFN1ZmZpeDtcbiAgICAgICAgICAgIGlmIChuZWVkc1BsdXJhbEhhbmRsaW5nKSBwbHVyYWxTdWZmaXggPSB0aGlzLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChjb2RlLCBvcHRpb25zLmNvdW50LCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IHplcm9TdWZmaXggPSBgJHt0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yfXplcm9gO1xuICAgICAgICAgICAgY29uc3Qgb3JkaW5hbFByZWZpeCA9IGAke3RoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3J9b3JkaW5hbCR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn1gO1xuICAgICAgICAgICAgaWYgKG5lZWRzUGx1cmFsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goa2V5ICsgcGx1cmFsU3VmZml4KTtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub3JkaW5hbCAmJiBwbHVyYWxTdWZmaXguaW5kZXhPZihvcmRpbmFsUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGZpbmFsS2V5cy5wdXNoKGtleSArIHBsdXJhbFN1ZmZpeC5yZXBsYWNlKG9yZGluYWxQcmVmaXgsIHRoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobmVlZHNaZXJvU3VmZml4TG9va3VwKSB7XG4gICAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goa2V5ICsgemVyb1N1ZmZpeCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZWVkc0NvbnRleHRIYW5kbGluZykge1xuICAgICAgICAgICAgICBjb25zdCBjb250ZXh0S2V5ID0gYCR7a2V5fSR7dGhpcy5vcHRpb25zLmNvbnRleHRTZXBhcmF0b3J9JHtvcHRpb25zLmNvbnRleHR9YDtcbiAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goY29udGV4dEtleSk7XG4gICAgICAgICAgICAgIGlmIChuZWVkc1BsdXJhbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goY29udGV4dEtleSArIHBsdXJhbFN1ZmZpeCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub3JkaW5hbCAmJiBwbHVyYWxTdWZmaXguaW5kZXhPZihvcmRpbmFsUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goY29udGV4dEtleSArIHBsdXJhbFN1ZmZpeC5yZXBsYWNlKG9yZGluYWxQcmVmaXgsIHRoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzWmVyb1N1ZmZpeExvb2t1cCkge1xuICAgICAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goY29udGV4dEtleSArIHplcm9TdWZmaXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgcG9zc2libGVLZXk7XG4gICAgICAgICAgd2hpbGUgKHBvc3NpYmxlS2V5ID0gZmluYWxLZXlzLnBvcCgpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZExvb2t1cChmb3VuZCkpIHtcbiAgICAgICAgICAgICAgZXhhY3RVc2VkS2V5ID0gcG9zc2libGVLZXk7XG4gICAgICAgICAgICAgIGZvdW5kID0gdGhpcy5nZXRSZXNvdXJjZShjb2RlLCBucywgcG9zc2libGVLZXksIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzOiBmb3VuZCxcbiAgICAgIHVzZWRLZXksXG4gICAgICBleGFjdFVzZWRLZXksXG4gICAgICB1c2VkTG5nLFxuICAgICAgdXNlZE5TXG4gICAgfTtcbiAgfVxuICBpc1ZhbGlkTG9va3VwKHJlcykge1xuICAgIHJldHVybiByZXMgIT09IHVuZGVmaW5lZCAmJiAhKCF0aGlzLm9wdGlvbnMucmV0dXJuTnVsbCAmJiByZXMgPT09IG51bGwpICYmICEoIXRoaXMub3B0aW9ucy5yZXR1cm5FbXB0eVN0cmluZyAmJiByZXMgPT09ICcnKTtcbiAgfVxuICBnZXRSZXNvdXJjZShjb2RlLCBucywga2V5KSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIGlmICh0aGlzLmkxOG5Gb3JtYXQgJiYgdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKSByZXR1cm4gdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKGNvZGUsIG5zLCBrZXksIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UoY29kZSwgbnMsIGtleSwgb3B0aW9ucyk7XG4gIH1cbiAgZ2V0VXNlZFBhcmFtc0RldGFpbHMoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNvbnN0IG9wdGlvbnNLZXlzID0gWydkZWZhdWx0VmFsdWUnLCAnb3JkaW5hbCcsICdjb250ZXh0JywgJ3JlcGxhY2UnLCAnbG5nJywgJ2xuZ3MnLCAnZmFsbGJhY2tMbmcnLCAnbnMnLCAna2V5U2VwYXJhdG9yJywgJ25zU2VwYXJhdG9yJywgJ3JldHVybk9iamVjdHMnLCAncmV0dXJuRGV0YWlscycsICdqb2luQXJyYXlzJywgJ3Bvc3RQcm9jZXNzJywgJ2ludGVycG9sYXRpb24nXTtcbiAgICBjb25zdCB1c2VPcHRpb25zUmVwbGFjZUZvckRhdGEgPSBvcHRpb25zLnJlcGxhY2UgJiYgdHlwZW9mIG9wdGlvbnMucmVwbGFjZSAhPT0gJ3N0cmluZyc7XG4gICAgbGV0IGRhdGEgPSB1c2VPcHRpb25zUmVwbGFjZUZvckRhdGEgPyBvcHRpb25zLnJlcGxhY2UgOiBvcHRpb25zO1xuICAgIGlmICh1c2VPcHRpb25zUmVwbGFjZUZvckRhdGEgJiYgdHlwZW9mIG9wdGlvbnMuY291bnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBkYXRhLmNvdW50ID0gb3B0aW9ucy5jb3VudDtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpIHtcbiAgICAgIGRhdGEgPSB7XG4gICAgICAgIC4uLnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsXG4gICAgICAgIC4uLmRhdGFcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICghdXNlT3B0aW9uc1JlcGxhY2VGb3JEYXRhKSB7XG4gICAgICBkYXRhID0ge1xuICAgICAgICAuLi5kYXRhXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Ygb3B0aW9uc0tleXMpIHtcbiAgICAgICAgZGVsZXRlIGRhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgc3RhdGljIGhhc0RlZmF1bHRWYWx1ZShvcHRpb25zKSB7XG4gICAgY29uc3QgcHJlZml4ID0gJ2RlZmF1bHRWYWx1ZSc7XG4gICAgZm9yIChjb25zdCBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCBvcHRpb24pICYmIHByZWZpeCA9PT0gb3B0aW9uLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSAmJiB1bmRlZmluZWQgIT09IG9wdGlvbnNbb3B0aW9uXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmNvbnN0IGNhcGl0YWxpemUgPSBzdHJpbmcgPT4gc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpO1xuY2xhc3MgTGFuZ3VhZ2VVdGlsIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zdXBwb3J0ZWRMbmdzID0gdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MgfHwgZmFsc2U7XG4gICAgdGhpcy5sb2dnZXIgPSBiYXNlTG9nZ2VyLmNyZWF0ZSgnbGFuZ3VhZ2VVdGlscycpO1xuICB9XG4gIGdldFNjcmlwdFBhcnRGcm9tQ29kZShjb2RlKSB7XG4gICAgY29kZSA9IGdldENsZWFuZWRDb2RlKGNvZGUpO1xuICAgIGlmICghY29kZSB8fCBjb2RlLmluZGV4T2YoJy0nKSA8IDApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHAgPSBjb2RlLnNwbGl0KCctJyk7XG4gICAgaWYgKHAubGVuZ3RoID09PSAyKSByZXR1cm4gbnVsbDtcbiAgICBwLnBvcCgpO1xuICAgIGlmIChwW3AubGVuZ3RoIC0gMV0udG9Mb3dlckNhc2UoKSA9PT0gJ3gnKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUocC5qb2luKCctJykpO1xuICB9XG4gIGdldExhbmd1YWdlUGFydEZyb21Db2RlKGNvZGUpIHtcbiAgICBjb2RlID0gZ2V0Q2xlYW5lZENvZGUoY29kZSk7XG4gICAgaWYgKCFjb2RlIHx8IGNvZGUuaW5kZXhPZignLScpIDwgMCkgcmV0dXJuIGNvZGU7XG4gICAgY29uc3QgcCA9IGNvZGUuc3BsaXQoJy0nKTtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUocFswXSk7XG4gIH1cbiAgZm9ybWF0TGFuZ3VhZ2VDb2RlKGNvZGUpIHtcbiAgICBpZiAodHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIGNvZGUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgIGNvbnN0IHNwZWNpYWxDYXNlcyA9IFsnaGFucycsICdoYW50JywgJ2xhdG4nLCAnY3lybCcsICdjYW5zJywgJ21vbmcnLCAnYXJhYiddO1xuICAgICAgbGV0IHAgPSBjb2RlLnNwbGl0KCctJyk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZykge1xuICAgICAgICBwID0gcC5tYXAocGFydCA9PiBwYXJ0LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfSBlbHNlIGlmIChwLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBwWzBdID0gcFswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBwWzFdID0gcFsxXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoc3BlY2lhbENhc2VzLmluZGV4T2YocFsxXS50b0xvd2VyQ2FzZSgpKSA+IC0xKSBwWzFdID0gY2FwaXRhbGl6ZShwWzFdLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfSBlbHNlIGlmIChwLmxlbmd0aCA9PT0gMykge1xuICAgICAgICBwWzBdID0gcFswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocFsxXS5sZW5ndGggPT09IDIpIHBbMV0gPSBwWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGlmIChwWzBdICE9PSAnc2duJyAmJiBwWzJdLmxlbmd0aCA9PT0gMikgcFsyXSA9IHBbMl0udG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKHNwZWNpYWxDYXNlcy5pbmRleE9mKHBbMV0udG9Mb3dlckNhc2UoKSkgPiAtMSkgcFsxXSA9IGNhcGl0YWxpemUocFsxXS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKHNwZWNpYWxDYXNlcy5pbmRleE9mKHBbMl0udG9Mb3dlckNhc2UoKSkgPiAtMSkgcFsyXSA9IGNhcGl0YWxpemUocFsyXS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwLmpvaW4oJy0nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jbGVhbkNvZGUgfHwgdGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZyA/IGNvZGUudG9Mb3dlckNhc2UoKSA6IGNvZGU7XG4gIH1cbiAgaXNTdXBwb3J0ZWRDb2RlKGNvZGUpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvYWQgPT09ICdsYW5ndWFnZU9ubHknIHx8IHRoaXMub3B0aW9ucy5ub25FeHBsaWNpdFN1cHBvcnRlZExuZ3MpIHtcbiAgICAgIGNvZGUgPSB0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGNvZGUpO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuc3VwcG9ydGVkTG5ncyB8fCAhdGhpcy5zdXBwb3J0ZWRMbmdzLmxlbmd0aCB8fCB0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZihjb2RlKSA+IC0xO1xuICB9XG4gIGdldEJlc3RNYXRjaEZyb21Db2Rlcyhjb2Rlcykge1xuICAgIGlmICghY29kZXMpIHJldHVybiBudWxsO1xuICAgIGxldCBmb3VuZDtcbiAgICBjb2Rlcy5mb3JFYWNoKGNvZGUgPT4ge1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgICBjb25zdCBjbGVhbmVkTG5nID0gdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoY29kZSk7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzIHx8IHRoaXMuaXNTdXBwb3J0ZWRDb2RlKGNsZWFuZWRMbmcpKSBmb3VuZCA9IGNsZWFuZWRMbmc7XG4gICAgfSk7XG4gICAgaWYgKCFmb3VuZCAmJiB0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncykge1xuICAgICAgY29kZXMuZm9yRWFjaChjb2RlID0+IHtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGxuZ09ubHkgPSB0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGNvZGUpO1xuICAgICAgICBpZiAodGhpcy5pc1N1cHBvcnRlZENvZGUobG5nT25seSkpIHJldHVybiBmb3VuZCA9IGxuZ09ubHk7XG4gICAgICAgIGZvdW5kID0gdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MuZmluZChzdXBwb3J0ZWRMbmcgPT4ge1xuICAgICAgICAgIGlmIChzdXBwb3J0ZWRMbmcgPT09IGxuZ09ubHkpIHJldHVybiBzdXBwb3J0ZWRMbmc7XG4gICAgICAgICAgaWYgKHN1cHBvcnRlZExuZy5pbmRleE9mKCctJykgPCAwICYmIGxuZ09ubHkuaW5kZXhPZignLScpIDwgMCkgcmV0dXJuO1xuICAgICAgICAgIGlmIChzdXBwb3J0ZWRMbmcuaW5kZXhPZignLScpID4gMCAmJiBsbmdPbmx5LmluZGV4T2YoJy0nKSA8IDAgJiYgc3VwcG9ydGVkTG5nLnN1YnN0cmluZygwLCBzdXBwb3J0ZWRMbmcuaW5kZXhPZignLScpKSA9PT0gbG5nT25seSkgcmV0dXJuIHN1cHBvcnRlZExuZztcbiAgICAgICAgICBpZiAoc3VwcG9ydGVkTG5nLmluZGV4T2YobG5nT25seSkgPT09IDAgJiYgbG5nT25seS5sZW5ndGggPiAxKSByZXR1cm4gc3VwcG9ydGVkTG5nO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIWZvdW5kKSBmb3VuZCA9IHRoaXMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpWzBdO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuICBnZXRGYWxsYmFja0NvZGVzKGZhbGxiYWNrcywgY29kZSkge1xuICAgIGlmICghZmFsbGJhY2tzKSByZXR1cm4gW107XG4gICAgaWYgKHR5cGVvZiBmYWxsYmFja3MgPT09ICdmdW5jdGlvbicpIGZhbGxiYWNrcyA9IGZhbGxiYWNrcyhjb2RlKTtcbiAgICBpZiAodHlwZW9mIGZhbGxiYWNrcyA9PT0gJ3N0cmluZycpIGZhbGxiYWNrcyA9IFtmYWxsYmFja3NdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZhbGxiYWNrcykpIHJldHVybiBmYWxsYmFja3M7XG4gICAgaWYgKCFjb2RlKSByZXR1cm4gZmFsbGJhY2tzLmRlZmF1bHQgfHwgW107XG4gICAgbGV0IGZvdW5kID0gZmFsbGJhY2tzW2NvZGVdO1xuICAgIGlmICghZm91bmQpIGZvdW5kID0gZmFsbGJhY2tzW3RoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKGNvZGUpXTtcbiAgICBpZiAoIWZvdW5kKSBmb3VuZCA9IGZhbGxiYWNrc1t0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShjb2RlKV07XG4gICAgaWYgKCFmb3VuZCkgZm91bmQgPSBmYWxsYmFja3NbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShjb2RlKV07XG4gICAgaWYgKCFmb3VuZCkgZm91bmQgPSBmYWxsYmFja3MuZGVmYXVsdDtcbiAgICByZXR1cm4gZm91bmQgfHwgW107XG4gIH1cbiAgdG9SZXNvbHZlSGllcmFyY2h5KGNvZGUsIGZhbGxiYWNrQ29kZSkge1xuICAgIGNvbnN0IGZhbGxiYWNrQ29kZXMgPSB0aGlzLmdldEZhbGxiYWNrQ29kZXMoZmFsbGJhY2tDb2RlIHx8IHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyB8fCBbXSwgY29kZSk7XG4gICAgY29uc3QgY29kZXMgPSBbXTtcbiAgICBjb25zdCBhZGRDb2RlID0gYyA9PiB7XG4gICAgICBpZiAoIWMpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLmlzU3VwcG9ydGVkQ29kZShjKSkge1xuICAgICAgICBjb2Rlcy5wdXNoKGMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgcmVqZWN0aW5nIGxhbmd1YWdlIGNvZGUgbm90IGZvdW5kIGluIHN1cHBvcnRlZExuZ3M6ICR7Y31gKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICh0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycgJiYgKGNvZGUuaW5kZXhPZignLScpID4gLTEgfHwgY29kZS5pbmRleE9mKCdfJykgPiAtMSkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9hZCAhPT0gJ2xhbmd1YWdlT25seScpIGFkZENvZGUodGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoY29kZSkpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkICE9PSAnbGFuZ3VhZ2VPbmx5JyAmJiB0aGlzLm9wdGlvbnMubG9hZCAhPT0gJ2N1cnJlbnRPbmx5JykgYWRkQ29kZSh0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZShjb2RlKSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmxvYWQgIT09ICdjdXJyZW50T25seScpIGFkZENvZGUodGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShjb2RlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGFkZENvZGUodGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoY29kZSkpO1xuICAgIH1cbiAgICBmYWxsYmFja0NvZGVzLmZvckVhY2goZmMgPT4ge1xuICAgICAgaWYgKGNvZGVzLmluZGV4T2YoZmMpIDwgMCkgYWRkQ29kZSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShmYykpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb2RlcztcbiAgfVxufVxuXG5sZXQgc2V0cyA9IFt7XG4gIGxuZ3M6IFsnYWNoJywgJ2FrJywgJ2FtJywgJ2FybicsICdicicsICdmaWwnLCAnZ3VuJywgJ2xuJywgJ21mZScsICdtZycsICdtaScsICdvYycsICdwdCcsICdwdC1CUicsICd0ZycsICd0bCcsICd0aScsICd0cicsICd1eicsICd3YSddLFxuICBucjogWzEsIDJdLFxuICBmYzogMVxufSwge1xuICBsbmdzOiBbJ2FmJywgJ2FuJywgJ2FzdCcsICdheicsICdiZycsICdibicsICdjYScsICdkYScsICdkZScsICdkZXYnLCAnZWwnLCAnZW4nLCAnZW8nLCAnZXMnLCAnZXQnLCAnZXUnLCAnZmknLCAnZm8nLCAnZnVyJywgJ2Z5JywgJ2dsJywgJ2d1JywgJ2hhJywgJ2hpJywgJ2h1JywgJ2h5JywgJ2lhJywgJ2l0JywgJ2trJywgJ2tuJywgJ2t1JywgJ2xiJywgJ21haScsICdtbCcsICdtbicsICdtcicsICduYWgnLCAnbmFwJywgJ25iJywgJ25lJywgJ25sJywgJ25uJywgJ25vJywgJ25zbycsICdwYScsICdwYXAnLCAncG1zJywgJ3BzJywgJ3B0LVBUJywgJ3JtJywgJ3NjbycsICdzZScsICdzaScsICdzbycsICdzb24nLCAnc3EnLCAnc3YnLCAnc3cnLCAndGEnLCAndGUnLCAndGsnLCAndXInLCAneW8nXSxcbiAgbnI6IFsxLCAyXSxcbiAgZmM6IDJcbn0sIHtcbiAgbG5nczogWydheScsICdibycsICdjZ2cnLCAnZmEnLCAnaHQnLCAnaWQnLCAnamEnLCAnamJvJywgJ2thJywgJ2ttJywgJ2tvJywgJ2t5JywgJ2xvJywgJ21zJywgJ3NhaCcsICdzdScsICd0aCcsICd0dCcsICd1ZycsICd2aScsICd3bycsICd6aCddLFxuICBucjogWzFdLFxuICBmYzogM1xufSwge1xuICBsbmdzOiBbJ2JlJywgJ2JzJywgJ2NucicsICdkeicsICdocicsICdydScsICdzcicsICd1ayddLFxuICBucjogWzEsIDIsIDVdLFxuICBmYzogNFxufSwge1xuICBsbmdzOiBbJ2FyJ10sXG4gIG5yOiBbMCwgMSwgMiwgMywgMTEsIDEwMF0sXG4gIGZjOiA1XG59LCB7XG4gIGxuZ3M6IFsnY3MnLCAnc2snXSxcbiAgbnI6IFsxLCAyLCA1XSxcbiAgZmM6IDZcbn0sIHtcbiAgbG5nczogWydjc2InLCAncGwnXSxcbiAgbnI6IFsxLCAyLCA1XSxcbiAgZmM6IDdcbn0sIHtcbiAgbG5nczogWydjeSddLFxuICBucjogWzEsIDIsIDMsIDhdLFxuICBmYzogOFxufSwge1xuICBsbmdzOiBbJ2ZyJ10sXG4gIG5yOiBbMSwgMl0sXG4gIGZjOiA5XG59LCB7XG4gIGxuZ3M6IFsnZ2EnXSxcbiAgbnI6IFsxLCAyLCAzLCA3LCAxMV0sXG4gIGZjOiAxMFxufSwge1xuICBsbmdzOiBbJ2dkJ10sXG4gIG5yOiBbMSwgMiwgMywgMjBdLFxuICBmYzogMTFcbn0sIHtcbiAgbG5nczogWydpcyddLFxuICBucjogWzEsIDJdLFxuICBmYzogMTJcbn0sIHtcbiAgbG5nczogWydqdiddLFxuICBucjogWzAsIDFdLFxuICBmYzogMTNcbn0sIHtcbiAgbG5nczogWydrdyddLFxuICBucjogWzEsIDIsIDMsIDRdLFxuICBmYzogMTRcbn0sIHtcbiAgbG5nczogWydsdCddLFxuICBucjogWzEsIDIsIDEwXSxcbiAgZmM6IDE1XG59LCB7XG4gIGxuZ3M6IFsnbHYnXSxcbiAgbnI6IFsxLCAyLCAwXSxcbiAgZmM6IDE2XG59LCB7XG4gIGxuZ3M6IFsnbWsnXSxcbiAgbnI6IFsxLCAyXSxcbiAgZmM6IDE3XG59LCB7XG4gIGxuZ3M6IFsnbW5rJ10sXG4gIG5yOiBbMCwgMSwgMl0sXG4gIGZjOiAxOFxufSwge1xuICBsbmdzOiBbJ210J10sXG4gIG5yOiBbMSwgMiwgMTEsIDIwXSxcbiAgZmM6IDE5XG59LCB7XG4gIGxuZ3M6IFsnb3InXSxcbiAgbnI6IFsyLCAxXSxcbiAgZmM6IDJcbn0sIHtcbiAgbG5nczogWydybyddLFxuICBucjogWzEsIDIsIDIwXSxcbiAgZmM6IDIwXG59LCB7XG4gIGxuZ3M6IFsnc2wnXSxcbiAgbnI6IFs1LCAxLCAyLCAzXSxcbiAgZmM6IDIxXG59LCB7XG4gIGxuZ3M6IFsnaGUnLCAnaXcnXSxcbiAgbnI6IFsxLCAyLCAyMCwgMjFdLFxuICBmYzogMjJcbn1dO1xubGV0IF9ydWxlc1BsdXJhbHNUeXBlcyA9IHtcbiAgMTogbiA9PiBOdW1iZXIobiA+IDEpLFxuICAyOiBuID0+IE51bWJlcihuICE9IDEpLFxuICAzOiBuID0+IDAsXG4gIDQ6IG4gPT4gTnVtYmVyKG4gJSAxMCA9PSAxICYmIG4gJSAxMDAgIT0gMTEgPyAwIDogbiAlIDEwID49IDIgJiYgbiAlIDEwIDw9IDQgJiYgKG4gJSAxMDAgPCAxMCB8fCBuICUgMTAwID49IDIwKSA/IDEgOiAyKSxcbiAgNTogbiA9PiBOdW1iZXIobiA9PSAwID8gMCA6IG4gPT0gMSA/IDEgOiBuID09IDIgPyAyIDogbiAlIDEwMCA+PSAzICYmIG4gJSAxMDAgPD0gMTAgPyAzIDogbiAlIDEwMCA+PSAxMSA/IDQgOiA1KSxcbiAgNjogbiA9PiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPj0gMiAmJiBuIDw9IDQgPyAxIDogMiksXG4gIDc6IG4gPT4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuICUgMTAgPj0gMiAmJiBuICUgMTAgPD0gNCAmJiAobiAlIDEwMCA8IDEwIHx8IG4gJSAxMDAgPj0gMjApID8gMSA6IDIpLFxuICA4OiBuID0+IE51bWJlcihuID09IDEgPyAwIDogbiA9PSAyID8gMSA6IG4gIT0gOCAmJiBuICE9IDExID8gMiA6IDMpLFxuICA5OiBuID0+IE51bWJlcihuID49IDIpLFxuICAxMDogbiA9PiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPT0gMiA/IDEgOiBuIDwgNyA/IDIgOiBuIDwgMTEgPyAzIDogNCksXG4gIDExOiBuID0+IE51bWJlcihuID09IDEgfHwgbiA9PSAxMSA/IDAgOiBuID09IDIgfHwgbiA9PSAxMiA/IDEgOiBuID4gMiAmJiBuIDwgMjAgPyAyIDogMyksXG4gIDEyOiBuID0+IE51bWJlcihuICUgMTAgIT0gMSB8fCBuICUgMTAwID09IDExKSxcbiAgMTM6IG4gPT4gTnVtYmVyKG4gIT09IDApLFxuICAxNDogbiA9PiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPT0gMiA/IDEgOiBuID09IDMgPyAyIDogMyksXG4gIDE1OiBuID0+IE51bWJlcihuICUgMTAgPT0gMSAmJiBuICUgMTAwICE9IDExID8gMCA6IG4gJSAxMCA+PSAyICYmIChuICUgMTAwIDwgMTAgfHwgbiAlIDEwMCA+PSAyMCkgPyAxIDogMiksXG4gIDE2OiBuID0+IE51bWJlcihuICUgMTAgPT0gMSAmJiBuICUgMTAwICE9IDExID8gMCA6IG4gIT09IDAgPyAxIDogMiksXG4gIDE3OiBuID0+IE51bWJlcihuID09IDEgfHwgbiAlIDEwID09IDEgJiYgbiAlIDEwMCAhPSAxMSA/IDAgOiAxKSxcbiAgMTg6IG4gPT4gTnVtYmVyKG4gPT0gMCA/IDAgOiBuID09IDEgPyAxIDogMiksXG4gIDE5OiBuID0+IE51bWJlcihuID09IDEgPyAwIDogbiA9PSAwIHx8IG4gJSAxMDAgPiAxICYmIG4gJSAxMDAgPCAxMSA/IDEgOiBuICUgMTAwID4gMTAgJiYgbiAlIDEwMCA8IDIwID8gMiA6IDMpLFxuICAyMDogbiA9PiBOdW1iZXIobiA9PSAxID8gMCA6IG4gPT0gMCB8fCBuICUgMTAwID4gMCAmJiBuICUgMTAwIDwgMjAgPyAxIDogMiksXG4gIDIxOiBuID0+IE51bWJlcihuICUgMTAwID09IDEgPyAxIDogbiAlIDEwMCA9PSAyID8gMiA6IG4gJSAxMDAgPT0gMyB8fCBuICUgMTAwID09IDQgPyAzIDogMCksXG4gIDIyOiBuID0+IE51bWJlcihuID09IDEgPyAwIDogbiA9PSAyID8gMSA6IChuIDwgMCB8fCBuID4gMTApICYmIG4gJSAxMCA9PSAwID8gMiA6IDMpXG59O1xuY29uc3Qgbm9uSW50bFZlcnNpb25zID0gWyd2MScsICd2MicsICd2MyddO1xuY29uc3QgaW50bFZlcnNpb25zID0gWyd2NCddO1xuY29uc3Qgc3VmZml4ZXNPcmRlciA9IHtcbiAgemVybzogMCxcbiAgb25lOiAxLFxuICB0d286IDIsXG4gIGZldzogMyxcbiAgbWFueTogNCxcbiAgb3RoZXI6IDVcbn07XG5jb25zdCBjcmVhdGVSdWxlcyA9ICgpID0+IHtcbiAgY29uc3QgcnVsZXMgPSB7fTtcbiAgc2V0cy5mb3JFYWNoKHNldCA9PiB7XG4gICAgc2V0LmxuZ3MuZm9yRWFjaChsID0+IHtcbiAgICAgIHJ1bGVzW2xdID0ge1xuICAgICAgICBudW1iZXJzOiBzZXQubnIsXG4gICAgICAgIHBsdXJhbHM6IF9ydWxlc1BsdXJhbHNUeXBlc1tzZXQuZmNdXG4gICAgICB9O1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHJ1bGVzO1xufTtcbmNsYXNzIFBsdXJhbFJlc29sdmVyIHtcbiAgY29uc3RydWN0b3IobGFuZ3VhZ2VVdGlscykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB0aGlzLmxhbmd1YWdlVXRpbHMgPSBsYW5ndWFnZVV0aWxzO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2dnZXIgPSBiYXNlTG9nZ2VyLmNyZWF0ZSgncGx1cmFsUmVzb2x2ZXInKTtcbiAgICBpZiAoKCF0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04gfHwgaW50bFZlcnNpb25zLmluY2x1ZGVzKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTikpICYmICh0eXBlb2YgSW50bCA9PT0gJ3VuZGVmaW5lZCcgfHwgIUludGwuUGx1cmFsUnVsZXMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04gPSAndjMnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1lvdXIgZW52aXJvbm1lbnQgc2VlbXMgbm90IHRvIGJlIEludGwgQVBJIGNvbXBhdGlibGUsIHVzZSBhbiBJbnRsLlBsdXJhbFJ1bGVzIHBvbHlmaWxsLiBXaWxsIGZhbGxiYWNrIHRvIHRoZSBjb21wYXRpYmlsaXR5SlNPTiB2MyBmb3JtYXQgaGFuZGxpbmcuJyk7XG4gICAgfVxuICAgIHRoaXMucnVsZXMgPSBjcmVhdGVSdWxlcygpO1xuICAgIHRoaXMucGx1cmFsUnVsZXNDYWNoZSA9IHt9O1xuICB9XG4gIGFkZFJ1bGUobG5nLCBvYmopIHtcbiAgICB0aGlzLnJ1bGVzW2xuZ10gPSBvYmo7XG4gIH1cbiAgY2xlYXJDYWNoZSgpIHtcbiAgICB0aGlzLnBsdXJhbFJ1bGVzQ2FjaGUgPSB7fTtcbiAgfVxuICBnZXRSdWxlKGNvZGUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgaWYgKHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjbGVhbmVkQ29kZSA9IGdldENsZWFuZWRDb2RlKGNvZGUgPT09ICdkZXYnID8gJ2VuJyA6IGNvZGUpO1xuICAgICAgICBjb25zdCB0eXBlID0gb3B0aW9ucy5vcmRpbmFsID8gJ29yZGluYWwnIDogJ2NhcmRpbmFsJztcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY2xlYW5lZENvZGUsXG4gICAgICAgICAgdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhY2hlS2V5IGluIHRoaXMucGx1cmFsUnVsZXNDYWNoZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnBsdXJhbFJ1bGVzQ2FjaGVbY2FjaGVLZXldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGUgPSBuZXcgSW50bC5QbHVyYWxSdWxlcyhjbGVhbmVkQ29kZSwge1xuICAgICAgICAgIHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGx1cmFsUnVsZXNDYWNoZVtjYWNoZUtleV0gPSBydWxlO1xuICAgICAgICByZXR1cm4gcnVsZTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJ1bGVzW2NvZGVdIHx8IHRoaXMucnVsZXNbdGhpcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGNvZGUpXTtcbiAgfVxuICBuZWVkc1BsdXJhbChjb2RlKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmdldFJ1bGUoY29kZSwgb3B0aW9ucyk7XG4gICAgaWYgKHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpKSB7XG4gICAgICByZXR1cm4gcnVsZSAmJiBydWxlLnJlc29sdmVkT3B0aW9ucygpLnBsdXJhbENhdGVnb3JpZXMubGVuZ3RoID4gMTtcbiAgICB9XG4gICAgcmV0dXJuIHJ1bGUgJiYgcnVsZS5udW1iZXJzLmxlbmd0aCA+IDE7XG4gIH1cbiAgZ2V0UGx1cmFsRm9ybXNPZktleShjb2RlLCBrZXkpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3VmZml4ZXMoY29kZSwgb3B0aW9ucykubWFwKHN1ZmZpeCA9PiBgJHtrZXl9JHtzdWZmaXh9YCk7XG4gIH1cbiAgZ2V0U3VmZml4ZXMoY29kZSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjb25zdCBydWxlID0gdGhpcy5nZXRSdWxlKGNvZGUsIG9wdGlvbnMpO1xuICAgIGlmICghcnVsZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG91bGRVc2VJbnRsQXBpKCkpIHtcbiAgICAgIHJldHVybiBydWxlLnJlc29sdmVkT3B0aW9ucygpLnBsdXJhbENhdGVnb3JpZXMuc29ydCgocGx1cmFsQ2F0ZWdvcnkxLCBwbHVyYWxDYXRlZ29yeTIpID0+IHN1ZmZpeGVzT3JkZXJbcGx1cmFsQ2F0ZWdvcnkxXSAtIHN1ZmZpeGVzT3JkZXJbcGx1cmFsQ2F0ZWdvcnkyXSkubWFwKHBsdXJhbENhdGVnb3J5ID0+IGAke3RoaXMub3B0aW9ucy5wcmVwZW5kfSR7b3B0aW9ucy5vcmRpbmFsID8gYG9yZGluYWwke3RoaXMub3B0aW9ucy5wcmVwZW5kfWAgOiAnJ30ke3BsdXJhbENhdGVnb3J5fWApO1xuICAgIH1cbiAgICByZXR1cm4gcnVsZS5udW1iZXJzLm1hcChudW1iZXIgPT4gdGhpcy5nZXRTdWZmaXgoY29kZSwgbnVtYmVyLCBvcHRpb25zKSk7XG4gIH1cbiAgZ2V0U3VmZml4KGNvZGUsIGNvdW50KSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmdldFJ1bGUoY29kZSwgb3B0aW9ucyk7XG4gICAgaWYgKHJ1bGUpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFVzZUludGxBcGkoKSkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5vcHRpb25zLnByZXBlbmR9JHtvcHRpb25zLm9yZGluYWwgPyBgb3JkaW5hbCR7dGhpcy5vcHRpb25zLnByZXBlbmR9YCA6ICcnfSR7cnVsZS5zZWxlY3QoY291bnQpfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5nZXRTdWZmaXhSZXRyb0NvbXBhdGlibGUocnVsZSwgY291bnQpO1xuICAgIH1cbiAgICB0aGlzLmxvZ2dlci53YXJuKGBubyBwbHVyYWwgcnVsZSBmb3VuZCBmb3I6ICR7Y29kZX1gKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlKHJ1bGUsIGNvdW50KSB7XG4gICAgY29uc3QgaWR4ID0gcnVsZS5ub0FicyA/IHJ1bGUucGx1cmFscyhjb3VudCkgOiBydWxlLnBsdXJhbHMoTWF0aC5hYnMoY291bnQpKTtcbiAgICBsZXQgc3VmZml4ID0gcnVsZS5udW1iZXJzW2lkeF07XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCAmJiBydWxlLm51bWJlcnMubGVuZ3RoID09PSAyICYmIHJ1bGUubnVtYmVyc1swXSA9PT0gMSkge1xuICAgICAgaWYgKHN1ZmZpeCA9PT0gMikge1xuICAgICAgICBzdWZmaXggPSAncGx1cmFsJztcbiAgICAgIH0gZWxzZSBpZiAoc3VmZml4ID09PSAxKSB7XG4gICAgICAgIHN1ZmZpeCA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXR1cm5TdWZmaXggPSAoKSA9PiB0aGlzLm9wdGlvbnMucHJlcGVuZCAmJiBzdWZmaXgudG9TdHJpbmcoKSA/IHRoaXMub3B0aW9ucy5wcmVwZW5kICsgc3VmZml4LnRvU3RyaW5nKCkgOiBzdWZmaXgudG9TdHJpbmcoKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OID09PSAndjEnKSB7XG4gICAgICBpZiAoc3VmZml4ID09PSAxKSByZXR1cm4gJyc7XG4gICAgICBpZiAodHlwZW9mIHN1ZmZpeCA9PT0gJ251bWJlcicpIHJldHVybiBgX3BsdXJhbF8ke3N1ZmZpeC50b1N0cmluZygpfWA7XG4gICAgICByZXR1cm4gcmV0dXJuU3VmZml4KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04gPT09ICd2MicpIHtcbiAgICAgIHJldHVybiByZXR1cm5TdWZmaXgoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCAmJiBydWxlLm51bWJlcnMubGVuZ3RoID09PSAyICYmIHJ1bGUubnVtYmVyc1swXSA9PT0gMSkge1xuICAgICAgcmV0dXJuIHJldHVyblN1ZmZpeCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnByZXBlbmQgJiYgaWR4LnRvU3RyaW5nKCkgPyB0aGlzLm9wdGlvbnMucHJlcGVuZCArIGlkeC50b1N0cmluZygpIDogaWR4LnRvU3RyaW5nKCk7XG4gIH1cbiAgc2hvdWxkVXNlSW50bEFwaSgpIHtcbiAgICByZXR1cm4gIW5vbkludGxWZXJzaW9ucy5pbmNsdWRlcyh0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04pO1xuICB9XG59XG5cbmNvbnN0IGRlZXBGaW5kV2l0aERlZmF1bHRzID0gZnVuY3Rpb24gKGRhdGEsIGRlZmF1bHREYXRhLCBrZXkpIHtcbiAgbGV0IGtleVNlcGFyYXRvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogJy4nO1xuICBsZXQgaWdub3JlSlNPTlN0cnVjdHVyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgbGV0IHBhdGggPSBnZXRQYXRoV2l0aERlZmF1bHRzKGRhdGEsIGRlZmF1bHREYXRhLCBrZXkpO1xuICBpZiAoIXBhdGggJiYgaWdub3JlSlNPTlN0cnVjdHVyZSAmJiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgIHBhdGggPSBkZWVwRmluZChkYXRhLCBrZXksIGtleVNlcGFyYXRvcik7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcGF0aCA9IGRlZXBGaW5kKGRlZmF1bHREYXRhLCBrZXksIGtleVNlcGFyYXRvcik7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59O1xuY29uc3QgcmVnZXhTYWZlID0gdmFsID0+IHZhbC5yZXBsYWNlKC9cXCQvZywgJyQkJCQnKTtcbmNsYXNzIEludGVycG9sYXRvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICB0aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXIuY3JlYXRlKCdpbnRlcnBvbGF0b3InKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuZm9ybWF0ID0gb3B0aW9ucy5pbnRlcnBvbGF0aW9uICYmIG9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQgfHwgKHZhbHVlID0+IHZhbHVlKTtcbiAgICB0aGlzLmluaXQob3B0aW9ucyk7XG4gIH1cbiAgaW5pdCgpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgaWYgKCFvcHRpb25zLmludGVycG9sYXRpb24pIG9wdGlvbnMuaW50ZXJwb2xhdGlvbiA9IHtcbiAgICAgIGVzY2FwZVZhbHVlOiB0cnVlXG4gICAgfTtcbiAgICBjb25zdCB7XG4gICAgICBlc2NhcGU6IGVzY2FwZSQxLFxuICAgICAgZXNjYXBlVmFsdWUsXG4gICAgICB1c2VSYXdWYWx1ZVRvRXNjYXBlLFxuICAgICAgcHJlZml4LFxuICAgICAgcHJlZml4RXNjYXBlZCxcbiAgICAgIHN1ZmZpeCxcbiAgICAgIHN1ZmZpeEVzY2FwZWQsXG4gICAgICBmb3JtYXRTZXBhcmF0b3IsXG4gICAgICB1bmVzY2FwZVN1ZmZpeCxcbiAgICAgIHVuZXNjYXBlUHJlZml4LFxuICAgICAgbmVzdGluZ1ByZWZpeCxcbiAgICAgIG5lc3RpbmdQcmVmaXhFc2NhcGVkLFxuICAgICAgbmVzdGluZ1N1ZmZpeCxcbiAgICAgIG5lc3RpbmdTdWZmaXhFc2NhcGVkLFxuICAgICAgbmVzdGluZ09wdGlvbnNTZXBhcmF0b3IsXG4gICAgICBtYXhSZXBsYWNlcyxcbiAgICAgIGFsd2F5c0Zvcm1hdFxuICAgIH0gPSBvcHRpb25zLmludGVycG9sYXRpb247XG4gICAgdGhpcy5lc2NhcGUgPSBlc2NhcGUkMSAhPT0gdW5kZWZpbmVkID8gZXNjYXBlJDEgOiBlc2NhcGU7XG4gICAgdGhpcy5lc2NhcGVWYWx1ZSA9IGVzY2FwZVZhbHVlICE9PSB1bmRlZmluZWQgPyBlc2NhcGVWYWx1ZSA6IHRydWU7XG4gICAgdGhpcy51c2VSYXdWYWx1ZVRvRXNjYXBlID0gdXNlUmF3VmFsdWVUb0VzY2FwZSAhPT0gdW5kZWZpbmVkID8gdXNlUmF3VmFsdWVUb0VzY2FwZSA6IGZhbHNlO1xuICAgIHRoaXMucHJlZml4ID0gcHJlZml4ID8gcmVnZXhFc2NhcGUocHJlZml4KSA6IHByZWZpeEVzY2FwZWQgfHwgJ3t7JztcbiAgICB0aGlzLnN1ZmZpeCA9IHN1ZmZpeCA/IHJlZ2V4RXNjYXBlKHN1ZmZpeCkgOiBzdWZmaXhFc2NhcGVkIHx8ICd9fSc7XG4gICAgdGhpcy5mb3JtYXRTZXBhcmF0b3IgPSBmb3JtYXRTZXBhcmF0b3IgfHwgJywnO1xuICAgIHRoaXMudW5lc2NhcGVQcmVmaXggPSB1bmVzY2FwZVN1ZmZpeCA/ICcnIDogdW5lc2NhcGVQcmVmaXggfHwgJy0nO1xuICAgIHRoaXMudW5lc2NhcGVTdWZmaXggPSB0aGlzLnVuZXNjYXBlUHJlZml4ID8gJycgOiB1bmVzY2FwZVN1ZmZpeCB8fCAnJztcbiAgICB0aGlzLm5lc3RpbmdQcmVmaXggPSBuZXN0aW5nUHJlZml4ID8gcmVnZXhFc2NhcGUobmVzdGluZ1ByZWZpeCkgOiBuZXN0aW5nUHJlZml4RXNjYXBlZCB8fCByZWdleEVzY2FwZSgnJHQoJyk7XG4gICAgdGhpcy5uZXN0aW5nU3VmZml4ID0gbmVzdGluZ1N1ZmZpeCA/IHJlZ2V4RXNjYXBlKG5lc3RpbmdTdWZmaXgpIDogbmVzdGluZ1N1ZmZpeEVzY2FwZWQgfHwgcmVnZXhFc2NhcGUoJyknKTtcbiAgICB0aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yID0gbmVzdGluZ09wdGlvbnNTZXBhcmF0b3IgfHwgJywnO1xuICAgIHRoaXMubWF4UmVwbGFjZXMgPSBtYXhSZXBsYWNlcyB8fCAxMDAwO1xuICAgIHRoaXMuYWx3YXlzRm9ybWF0ID0gYWx3YXlzRm9ybWF0ICE9PSB1bmRlZmluZWQgPyBhbHdheXNGb3JtYXQgOiBmYWxzZTtcbiAgICB0aGlzLnJlc2V0UmVnRXhwKCk7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucykgdGhpcy5pbml0KHRoaXMub3B0aW9ucyk7XG4gIH1cbiAgcmVzZXRSZWdFeHAoKSB7XG4gICAgY29uc3QgZ2V0T3JSZXNldFJlZ0V4cCA9IChleGlzdGluZ1JlZ0V4cCwgcGF0dGVybikgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nUmVnRXhwICYmIGV4aXN0aW5nUmVnRXhwLnNvdXJjZSA9PT0gcGF0dGVybikge1xuICAgICAgICBleGlzdGluZ1JlZ0V4cC5sYXN0SW5kZXggPSAwO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdSZWdFeHA7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLCAnZycpO1xuICAgIH07XG4gICAgdGhpcy5yZWdleHAgPSBnZXRPclJlc2V0UmVnRXhwKHRoaXMucmVnZXhwLCBgJHt0aGlzLnByZWZpeH0oLis/KSR7dGhpcy5zdWZmaXh9YCk7XG4gICAgdGhpcy5yZWdleHBVbmVzY2FwZSA9IGdldE9yUmVzZXRSZWdFeHAodGhpcy5yZWdleHBVbmVzY2FwZSwgYCR7dGhpcy5wcmVmaXh9JHt0aGlzLnVuZXNjYXBlUHJlZml4fSguKz8pJHt0aGlzLnVuZXNjYXBlU3VmZml4fSR7dGhpcy5zdWZmaXh9YCk7XG4gICAgdGhpcy5uZXN0aW5nUmVnZXhwID0gZ2V0T3JSZXNldFJlZ0V4cCh0aGlzLm5lc3RpbmdSZWdleHAsIGAke3RoaXMubmVzdGluZ1ByZWZpeH0oLis/KSR7dGhpcy5uZXN0aW5nU3VmZml4fWApO1xuICB9XG4gIGludGVycG9sYXRlKHN0ciwgZGF0YSwgbG5nLCBvcHRpb25zKSB7XG4gICAgbGV0IG1hdGNoO1xuICAgIGxldCB2YWx1ZTtcbiAgICBsZXQgcmVwbGFjZXM7XG4gICAgY29uc3QgZGVmYXVsdERhdGEgPSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24gJiYgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyB8fCB7fTtcbiAgICBjb25zdCBoYW5kbGVGb3JtYXQgPSBrZXkgPT4ge1xuICAgICAgaWYgKGtleS5pbmRleE9mKHRoaXMuZm9ybWF0U2VwYXJhdG9yKSA8IDApIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGRlZXBGaW5kV2l0aERlZmF1bHRzKGRhdGEsIGRlZmF1bHREYXRhLCBrZXksIHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsIHRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWx3YXlzRm9ybWF0ID8gdGhpcy5mb3JtYXQocGF0aCwgdW5kZWZpbmVkLCBsbmcsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgaW50ZXJwb2xhdGlvbmtleToga2V5XG4gICAgICAgIH0pIDogcGF0aDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHAgPSBrZXkuc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpO1xuICAgICAgY29uc3QgayA9IHAuc2hpZnQoKS50cmltKCk7XG4gICAgICBjb25zdCBmID0gcC5qb2luKHRoaXMuZm9ybWF0U2VwYXJhdG9yKS50cmltKCk7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXQoZGVlcEZpbmRXaXRoRGVmYXVsdHMoZGF0YSwgZGVmYXVsdERhdGEsIGssIHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsIHRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlKSwgZiwgbG5nLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIGludGVycG9sYXRpb25rZXk6IGtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy5yZXNldFJlZ0V4cCgpO1xuICAgIGNvbnN0IG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIgfHwgdGhpcy5vcHRpb25zLm1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjtcbiAgICBjb25zdCBza2lwT25WYXJpYWJsZXMgPSBvcHRpb25zICYmIG9wdGlvbnMuaW50ZXJwb2xhdGlvbiAmJiBvcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzIDogdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO1xuICAgIGNvbnN0IHRvZG9zID0gW3tcbiAgICAgIHJlZ2V4OiB0aGlzLnJlZ2V4cFVuZXNjYXBlLFxuICAgICAgc2FmZVZhbHVlOiB2YWwgPT4gcmVnZXhTYWZlKHZhbClcbiAgICB9LCB7XG4gICAgICByZWdleDogdGhpcy5yZWdleHAsXG4gICAgICBzYWZlVmFsdWU6IHZhbCA9PiB0aGlzLmVzY2FwZVZhbHVlID8gcmVnZXhTYWZlKHRoaXMuZXNjYXBlKHZhbCkpIDogcmVnZXhTYWZlKHZhbClcbiAgICB9XTtcbiAgICB0b2Rvcy5mb3JFYWNoKHRvZG8gPT4ge1xuICAgICAgcmVwbGFjZXMgPSAwO1xuICAgICAgd2hpbGUgKG1hdGNoID0gdG9kby5yZWdleC5leGVjKHN0cikpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZFZhciA9IG1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgdmFsdWUgPSBoYW5kbGVGb3JtYXQobWF0Y2hlZFZhcik7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBtaXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBtaXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIoc3RyLCBtYXRjaCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHR5cGVvZiB0ZW1wID09PSAnc3RyaW5nJyA/IHRlbXAgOiAnJztcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsIG1hdGNoZWRWYXIpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc2tpcE9uVmFyaWFibGVzKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYG1pc3NlZCB0byBwYXNzIGluIHZhcmlhYmxlICR7bWF0Y2hlZFZhcn0gZm9yIGludGVycG9sYXRpbmcgJHtzdHJ9YCk7XG4gICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICYmICF0aGlzLnVzZVJhd1ZhbHVlVG9Fc2NhcGUpIHtcbiAgICAgICAgICB2YWx1ZSA9IG1ha2VTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNhZmVWYWx1ZSA9IHRvZG8uc2FmZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UobWF0Y2hbMF0sIHNhZmVWYWx1ZSk7XG4gICAgICAgIGlmIChza2lwT25WYXJpYWJsZXMpIHtcbiAgICAgICAgICB0b2RvLnJlZ2V4Lmxhc3RJbmRleCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgdG9kby5yZWdleC5sYXN0SW5kZXggLT0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvZG8ucmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXBsYWNlcysrO1xuICAgICAgICBpZiAocmVwbGFjZXMgPj0gdGhpcy5tYXhSZXBsYWNlcykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBuZXN0KHN0ciwgZmMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgbGV0IG1hdGNoO1xuICAgIGxldCB2YWx1ZTtcbiAgICBsZXQgY2xvbmVkT3B0aW9ucztcbiAgICBjb25zdCBoYW5kbGVIYXNPcHRpb25zID0gKGtleSwgaW5oZXJpdGVkT3B0aW9ucykgPT4ge1xuICAgICAgY29uc3Qgc2VwID0gdGhpcy5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjtcbiAgICAgIGlmIChrZXkuaW5kZXhPZihzZXApIDwgMCkgcmV0dXJuIGtleTtcbiAgICAgIGNvbnN0IGMgPSBrZXkuc3BsaXQobmV3IFJlZ0V4cChgJHtzZXB9WyBdKntgKSk7XG4gICAgICBsZXQgb3B0aW9uc1N0cmluZyA9IGB7JHtjWzFdfWA7XG4gICAgICBrZXkgPSBjWzBdO1xuICAgICAgb3B0aW9uc1N0cmluZyA9IHRoaXMuaW50ZXJwb2xhdGUob3B0aW9uc1N0cmluZywgY2xvbmVkT3B0aW9ucyk7XG4gICAgICBjb25zdCBtYXRjaGVkU2luZ2xlUXVvdGVzID0gb3B0aW9uc1N0cmluZy5tYXRjaCgvJy9nKTtcbiAgICAgIGNvbnN0IG1hdGNoZWREb3VibGVRdW90ZXMgPSBvcHRpb25zU3RyaW5nLm1hdGNoKC9cIi9nKTtcbiAgICAgIGlmIChtYXRjaGVkU2luZ2xlUXVvdGVzICYmIG1hdGNoZWRTaW5nbGVRdW90ZXMubGVuZ3RoICUgMiA9PT0gMCAmJiAhbWF0Y2hlZERvdWJsZVF1b3RlcyB8fCBtYXRjaGVkRG91YmxlUXVvdGVzLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAgICAgb3B0aW9uc1N0cmluZyA9IG9wdGlvbnNTdHJpbmcucmVwbGFjZSgvJy9nLCAnXCInKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNsb25lZE9wdGlvbnMgPSBKU09OLnBhcnNlKG9wdGlvbnNTdHJpbmcpO1xuICAgICAgICBpZiAoaW5oZXJpdGVkT3B0aW9ucykgY2xvbmVkT3B0aW9ucyA9IHtcbiAgICAgICAgICAuLi5pbmhlcml0ZWRPcHRpb25zLFxuICAgICAgICAgIC4uLmNsb25lZE9wdGlvbnNcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICR7a2V5fWAsIGUpO1xuICAgICAgICByZXR1cm4gYCR7a2V5fSR7c2VwfSR7b3B0aW9uc1N0cmluZ31gO1xuICAgICAgfVxuICAgICAgaWYgKGNsb25lZE9wdGlvbnMuZGVmYXVsdFZhbHVlICYmIGNsb25lZE9wdGlvbnMuZGVmYXVsdFZhbHVlLmluZGV4T2YodGhpcy5wcmVmaXgpID4gLTEpIGRlbGV0ZSBjbG9uZWRPcHRpb25zLmRlZmF1bHRWYWx1ZTtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfTtcbiAgICB3aGlsZSAobWF0Y2ggPSB0aGlzLm5lc3RpbmdSZWdleHAuZXhlYyhzdHIpKSB7XG4gICAgICBsZXQgZm9ybWF0dGVycyA9IFtdO1xuICAgICAgY2xvbmVkT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgfTtcbiAgICAgIGNsb25lZE9wdGlvbnMgPSBjbG9uZWRPcHRpb25zLnJlcGxhY2UgJiYgdHlwZW9mIGNsb25lZE9wdGlvbnMucmVwbGFjZSAhPT0gJ3N0cmluZycgPyBjbG9uZWRPcHRpb25zLnJlcGxhY2UgOiBjbG9uZWRPcHRpb25zO1xuICAgICAgY2xvbmVkT3B0aW9ucy5hcHBseVBvc3RQcm9jZXNzb3IgPSBmYWxzZTtcbiAgICAgIGRlbGV0ZSBjbG9uZWRPcHRpb25zLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGxldCBkb1JlZHVjZSA9IGZhbHNlO1xuICAgICAgaWYgKG1hdGNoWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpICE9PSAtMSAmJiAhL3suKn0vLnRlc3QobWF0Y2hbMV0pKSB7XG4gICAgICAgIGNvbnN0IHIgPSBtYXRjaFsxXS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikubWFwKGVsZW0gPT4gZWxlbS50cmltKCkpO1xuICAgICAgICBtYXRjaFsxXSA9IHIuc2hpZnQoKTtcbiAgICAgICAgZm9ybWF0dGVycyA9IHI7XG4gICAgICAgIGRvUmVkdWNlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gZmMoaGFuZGxlSGFzT3B0aW9ucy5jYWxsKHRoaXMsIG1hdGNoWzFdLnRyaW0oKSwgY2xvbmVkT3B0aW9ucyksIGNsb25lZE9wdGlvbnMpO1xuICAgICAgaWYgKHZhbHVlICYmIG1hdGNoWzBdID09PSBzdHIgJiYgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHZhbHVlID0gbWFrZVN0cmluZyh2YWx1ZSk7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYG1pc3NlZCB0byByZXNvbHZlICR7bWF0Y2hbMV19IGZvciBuZXN0aW5nICR7c3RyfWApO1xuICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgfVxuICAgICAgaWYgKGRvUmVkdWNlKSB7XG4gICAgICAgIHZhbHVlID0gZm9ybWF0dGVycy5yZWR1Y2UoKHYsIGYpID0+IHRoaXMuZm9ybWF0KHYsIGYsIG9wdGlvbnMubG5nLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICBpbnRlcnBvbGF0aW9ua2V5OiBtYXRjaFsxXS50cmltKClcbiAgICAgICAgfSksIHZhbHVlLnRyaW0oKSk7XG4gICAgICB9XG4gICAgICBzdHIgPSBzdHIucmVwbGFjZShtYXRjaFswXSwgdmFsdWUpO1xuICAgICAgdGhpcy5yZWdleHAubGFzdEluZGV4ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5jb25zdCBwYXJzZUZvcm1hdFN0ciA9IGZvcm1hdFN0ciA9PiB7XG4gIGxldCBmb3JtYXROYW1lID0gZm9ybWF0U3RyLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICBjb25zdCBmb3JtYXRPcHRpb25zID0ge307XG4gIGlmIChmb3JtYXRTdHIuaW5kZXhPZignKCcpID4gLTEpIHtcbiAgICBjb25zdCBwID0gZm9ybWF0U3RyLnNwbGl0KCcoJyk7XG4gICAgZm9ybWF0TmFtZSA9IHBbMF0udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3Qgb3B0U3RyID0gcFsxXS5zdWJzdHJpbmcoMCwgcFsxXS5sZW5ndGggLSAxKTtcbiAgICBpZiAoZm9ybWF0TmFtZSA9PT0gJ2N1cnJlbmN5JyAmJiBvcHRTdHIuaW5kZXhPZignOicpIDwgMCkge1xuICAgICAgaWYgKCFmb3JtYXRPcHRpb25zLmN1cnJlbmN5KSBmb3JtYXRPcHRpb25zLmN1cnJlbmN5ID0gb3B0U3RyLnRyaW0oKTtcbiAgICB9IGVsc2UgaWYgKGZvcm1hdE5hbWUgPT09ICdyZWxhdGl2ZXRpbWUnICYmIG9wdFN0ci5pbmRleE9mKCc6JykgPCAwKSB7XG4gICAgICBpZiAoIWZvcm1hdE9wdGlvbnMucmFuZ2UpIGZvcm1hdE9wdGlvbnMucmFuZ2UgPSBvcHRTdHIudHJpbSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcHRzID0gb3B0U3RyLnNwbGl0KCc7Jyk7XG4gICAgICBvcHRzLmZvckVhY2gob3B0ID0+IHtcbiAgICAgICAgaWYgKG9wdCkge1xuICAgICAgICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gb3B0LnNwbGl0KCc6Jyk7XG4gICAgICAgICAgY29uc3QgdmFsID0gcmVzdC5qb2luKCc6JykudHJpbSgpLnJlcGxhY2UoL14nK3wnKyQvZywgJycpO1xuICAgICAgICAgIGNvbnN0IHRyaW1tZWRLZXkgPSBrZXkudHJpbSgpO1xuICAgICAgICAgIGlmICghZm9ybWF0T3B0aW9uc1t0cmltbWVkS2V5XSkgZm9ybWF0T3B0aW9uc1t0cmltbWVkS2V5XSA9IHZhbDtcbiAgICAgICAgICBpZiAodmFsID09PSAnZmFsc2UnKSBmb3JtYXRPcHRpb25zW3RyaW1tZWRLZXldID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHZhbCA9PT0gJ3RydWUnKSBmb3JtYXRPcHRpb25zW3RyaW1tZWRLZXldID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoIWlzTmFOKHZhbCkpIGZvcm1hdE9wdGlvbnNbdHJpbW1lZEtleV0gPSBwYXJzZUludCh2YWwsIDEwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZm9ybWF0TmFtZSxcbiAgICBmb3JtYXRPcHRpb25zXG4gIH07XG59O1xuY29uc3QgY3JlYXRlQ2FjaGVkRm9ybWF0dGVyID0gZm4gPT4ge1xuICBjb25zdCBjYWNoZSA9IHt9O1xuICByZXR1cm4gKHZhbCwgbG5nLCBvcHRpb25zKSA9PiB7XG4gICAgbGV0IG9wdEZvckNhY2hlID0gb3B0aW9ucztcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmludGVycG9sYXRpb25rZXkgJiYgb3B0aW9ucy5mb3JtYXRQYXJhbXMgJiYgb3B0aW9ucy5mb3JtYXRQYXJhbXNbb3B0aW9ucy5pbnRlcnBvbGF0aW9ua2V5XSAmJiBvcHRpb25zW29wdGlvbnMuaW50ZXJwb2xhdGlvbmtleV0pIHtcbiAgICAgIG9wdEZvckNhY2hlID0ge1xuICAgICAgICAuLi5vcHRGb3JDYWNoZSxcbiAgICAgICAgW29wdGlvbnMuaW50ZXJwb2xhdGlvbmtleV06IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gbG5nICsgSlNPTi5zdHJpbmdpZnkob3B0Rm9yQ2FjaGUpO1xuICAgIGxldCBmb3JtYXR0ZXIgPSBjYWNoZVtrZXldO1xuICAgIGlmICghZm9ybWF0dGVyKSB7XG4gICAgICBmb3JtYXR0ZXIgPSBmbihnZXRDbGVhbmVkQ29kZShsbmcpLCBvcHRpb25zKTtcbiAgICAgIGNhY2hlW2tleV0gPSBmb3JtYXR0ZXI7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXR0ZXIodmFsKTtcbiAgfTtcbn07XG5jbGFzcyBGb3JtYXR0ZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdGhpcy5sb2dnZXIgPSBiYXNlTG9nZ2VyLmNyZWF0ZSgnZm9ybWF0dGVyJyk7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmZvcm1hdHMgPSB7XG4gICAgICBudW1iZXI6IGNyZWF0ZUNhY2hlZEZvcm1hdHRlcigobG5nLCBvcHQpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxuZywge1xuICAgICAgICAgIC4uLm9wdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZhbCA9PiBmb3JtYXR0ZXIuZm9ybWF0KHZhbCk7XG4gICAgICB9KSxcbiAgICAgIGN1cnJlbmN5OiBjcmVhdGVDYWNoZWRGb3JtYXR0ZXIoKGxuZywgb3B0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsbmcsIHtcbiAgICAgICAgICAuLi5vcHQsXG4gICAgICAgICAgc3R5bGU6ICdjdXJyZW5jeSdcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWwgPT4gZm9ybWF0dGVyLmZvcm1hdCh2YWwpO1xuICAgICAgfSksXG4gICAgICBkYXRldGltZTogY3JlYXRlQ2FjaGVkRm9ybWF0dGVyKChsbmcsIG9wdCkgPT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsbmcsIHtcbiAgICAgICAgICAuLi5vcHRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWwgPT4gZm9ybWF0dGVyLmZvcm1hdCh2YWwpO1xuICAgICAgfSksXG4gICAgICByZWxhdGl2ZXRpbWU6IGNyZWF0ZUNhY2hlZEZvcm1hdHRlcigobG5nLCBvcHQpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0KGxuZywge1xuICAgICAgICAgIC4uLm9wdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZhbCA9PiBmb3JtYXR0ZXIuZm9ybWF0KHZhbCwgb3B0LnJhbmdlIHx8ICdkYXknKTtcbiAgICAgIH0pLFxuICAgICAgbGlzdDogY3JlYXRlQ2FjaGVkRm9ybWF0dGVyKChsbmcsIG9wdCkgPT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSW50bC5MaXN0Rm9ybWF0KGxuZywge1xuICAgICAgICAgIC4uLm9wdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZhbCA9PiBmb3JtYXR0ZXIuZm9ybWF0KHZhbCk7XG4gICAgICB9KVxuICAgIH07XG4gICAgdGhpcy5pbml0KG9wdGlvbnMpO1xuICB9XG4gIGluaXQoc2VydmljZXMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge1xuICAgICAgaW50ZXJwb2xhdGlvbjoge31cbiAgICB9O1xuICAgIGNvbnN0IGlPcHRzID0gb3B0aW9ucy5pbnRlcnBvbGF0aW9uO1xuICAgIHRoaXMuZm9ybWF0U2VwYXJhdG9yID0gaU9wdHMuZm9ybWF0U2VwYXJhdG9yID8gaU9wdHMuZm9ybWF0U2VwYXJhdG9yIDogaU9wdHMuZm9ybWF0U2VwYXJhdG9yIHx8ICcsJztcbiAgfVxuICBhZGQobmFtZSwgZmMpIHtcbiAgICB0aGlzLmZvcm1hdHNbbmFtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKV0gPSBmYztcbiAgfVxuICBhZGRDYWNoZWQobmFtZSwgZmMpIHtcbiAgICB0aGlzLmZvcm1hdHNbbmFtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKV0gPSBjcmVhdGVDYWNoZWRGb3JtYXR0ZXIoZmMpO1xuICB9XG4gIGZvcm1hdCh2YWx1ZSwgZm9ybWF0LCBsbmcpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgY29uc3QgZm9ybWF0cyA9IGZvcm1hdC5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcik7XG4gICAgaWYgKGZvcm1hdHMubGVuZ3RoID4gMSAmJiBmb3JtYXRzWzBdLmluZGV4T2YoJygnKSA+IDEgJiYgZm9ybWF0c1swXS5pbmRleE9mKCcpJykgPCAwICYmIGZvcm1hdHMuZmluZChmID0+IGYuaW5kZXhPZignKScpID4gLTEpKSB7XG4gICAgICBjb25zdCBsYXN0SW5kZXggPSBmb3JtYXRzLmZpbmRJbmRleChmID0+IGYuaW5kZXhPZignKScpID4gLTEpO1xuICAgICAgZm9ybWF0c1swXSA9IFtmb3JtYXRzWzBdLCAuLi5mb3JtYXRzLnNwbGljZSgxLCBsYXN0SW5kZXgpXS5qb2luKHRoaXMuZm9ybWF0U2VwYXJhdG9yKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZm9ybWF0cy5yZWR1Y2UoKG1lbSwgZikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmb3JtYXROYW1lLFxuICAgICAgICBmb3JtYXRPcHRpb25zXG4gICAgICB9ID0gcGFyc2VGb3JtYXRTdHIoZik7XG4gICAgICBpZiAodGhpcy5mb3JtYXRzW2Zvcm1hdE5hbWVdKSB7XG4gICAgICAgIGxldCBmb3JtYXR0ZWQgPSBtZW07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdmFsT3B0aW9ucyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5mb3JtYXRQYXJhbXMgJiYgb3B0aW9ucy5mb3JtYXRQYXJhbXNbb3B0aW9ucy5pbnRlcnBvbGF0aW9ua2V5XSB8fCB7fTtcbiAgICAgICAgICBjb25zdCBsID0gdmFsT3B0aW9ucy5sb2NhbGUgfHwgdmFsT3B0aW9ucy5sbmcgfHwgb3B0aW9ucy5sb2NhbGUgfHwgb3B0aW9ucy5sbmcgfHwgbG5nO1xuICAgICAgICAgIGZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0c1tmb3JtYXROYW1lXShtZW0sIGwsIHtcbiAgICAgICAgICAgIC4uLmZvcm1hdE9wdGlvbnMsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgLi4udmFsT3B0aW9uc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGB0aGVyZSB3YXMgbm8gZm9ybWF0IGZ1bmN0aW9uIGZvciAke2Zvcm1hdE5hbWV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVtO1xuICAgIH0sIHZhbHVlKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmNvbnN0IHJlbW92ZVBlbmRpbmcgPSAocSwgbmFtZSkgPT4ge1xuICBpZiAocS5wZW5kaW5nW25hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWxldGUgcS5wZW5kaW5nW25hbWVdO1xuICAgIHEucGVuZGluZ0NvdW50LS07XG4gIH1cbn07XG5jbGFzcyBDb25uZWN0b3IgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvcihiYWNrZW5kLCBzdG9yZSwgc2VydmljZXMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJhY2tlbmQgPSBiYWNrZW5kO1xuICAgIHRoaXMuc3RvcmUgPSBzdG9yZTtcbiAgICB0aGlzLnNlcnZpY2VzID0gc2VydmljZXM7XG4gICAgdGhpcy5sYW5ndWFnZVV0aWxzID0gc2VydmljZXMubGFuZ3VhZ2VVdGlscztcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMubG9nZ2VyID0gYmFzZUxvZ2dlci5jcmVhdGUoJ2JhY2tlbmRDb25uZWN0b3InKTtcbiAgICB0aGlzLndhaXRpbmdSZWFkcyA9IFtdO1xuICAgIHRoaXMubWF4UGFyYWxsZWxSZWFkcyA9IG9wdGlvbnMubWF4UGFyYWxsZWxSZWFkcyB8fCAxMDtcbiAgICB0aGlzLnJlYWRpbmdDYWxscyA9IDA7XG4gICAgdGhpcy5tYXhSZXRyaWVzID0gb3B0aW9ucy5tYXhSZXRyaWVzID49IDAgPyBvcHRpb25zLm1heFJldHJpZXMgOiA1O1xuICAgIHRoaXMucmV0cnlUaW1lb3V0ID0gb3B0aW9ucy5yZXRyeVRpbWVvdXQgPj0gMSA/IG9wdGlvbnMucmV0cnlUaW1lb3V0IDogMzUwO1xuICAgIHRoaXMuc3RhdGUgPSB7fTtcbiAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgaWYgKHRoaXMuYmFja2VuZCAmJiB0aGlzLmJhY2tlbmQuaW5pdCkge1xuICAgICAgdGhpcy5iYWNrZW5kLmluaXQoc2VydmljZXMsIG9wdGlvbnMuYmFja2VuZCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIHF1ZXVlTG9hZChsYW5ndWFnZXMsIG5hbWVzcGFjZXMsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdG9Mb2FkID0ge307XG4gICAgY29uc3QgcGVuZGluZyA9IHt9O1xuICAgIGNvbnN0IHRvTG9hZExhbmd1YWdlcyA9IHt9O1xuICAgIGNvbnN0IHRvTG9hZE5hbWVzcGFjZXMgPSB7fTtcbiAgICBsYW5ndWFnZXMuZm9yRWFjaChsbmcgPT4ge1xuICAgICAgbGV0IGhhc0FsbE5hbWVzcGFjZXMgPSB0cnVlO1xuICAgICAgbmFtZXNwYWNlcy5mb3JFYWNoKG5zID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGAke2xuZ318JHtuc31gO1xuICAgICAgICBpZiAoIW9wdGlvbnMucmVsb2FkICYmIHRoaXMuc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUobG5nLCBucykpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlW25hbWVdID0gMjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlW25hbWVdIDwgMCkgOyBlbHNlIGlmICh0aGlzLnN0YXRlW25hbWVdID09PSAxKSB7XG4gICAgICAgICAgaWYgKHBlbmRpbmdbbmFtZV0gPT09IHVuZGVmaW5lZCkgcGVuZGluZ1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVtuYW1lXSA9IDE7XG4gICAgICAgICAgaGFzQWxsTmFtZXNwYWNlcyA9IGZhbHNlO1xuICAgICAgICAgIGlmIChwZW5kaW5nW25hbWVdID09PSB1bmRlZmluZWQpIHBlbmRpbmdbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgIGlmICh0b0xvYWRbbmFtZV0gPT09IHVuZGVmaW5lZCkgdG9Mb2FkW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodG9Mb2FkTmFtZXNwYWNlc1tuc10gPT09IHVuZGVmaW5lZCkgdG9Mb2FkTmFtZXNwYWNlc1tuc10gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghaGFzQWxsTmFtZXNwYWNlcykgdG9Mb2FkTGFuZ3VhZ2VzW2xuZ10gPSB0cnVlO1xuICAgIH0pO1xuICAgIGlmIChPYmplY3Qua2V5cyh0b0xvYWQpLmxlbmd0aCB8fCBPYmplY3Qua2V5cyhwZW5kaW5nKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMucXVldWUucHVzaCh7XG4gICAgICAgIHBlbmRpbmcsXG4gICAgICAgIHBlbmRpbmdDb3VudDogT2JqZWN0LmtleXMocGVuZGluZykubGVuZ3RoLFxuICAgICAgICBsb2FkZWQ6IHt9LFxuICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICBjYWxsYmFja1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0b0xvYWQ6IE9iamVjdC5rZXlzKHRvTG9hZCksXG4gICAgICBwZW5kaW5nOiBPYmplY3Qua2V5cyhwZW5kaW5nKSxcbiAgICAgIHRvTG9hZExhbmd1YWdlczogT2JqZWN0LmtleXModG9Mb2FkTGFuZ3VhZ2VzKSxcbiAgICAgIHRvTG9hZE5hbWVzcGFjZXM6IE9iamVjdC5rZXlzKHRvTG9hZE5hbWVzcGFjZXMpXG4gICAgfTtcbiAgfVxuICBsb2FkZWQobmFtZSwgZXJyLCBkYXRhKSB7XG4gICAgY29uc3QgcyA9IG5hbWUuc3BsaXQoJ3wnKTtcbiAgICBjb25zdCBsbmcgPSBzWzBdO1xuICAgIGNvbnN0IG5zID0gc1sxXTtcbiAgICBpZiAoZXJyKSB0aGlzLmVtaXQoJ2ZhaWxlZExvYWRpbmcnLCBsbmcsIG5zLCBlcnIpO1xuICAgIGlmICghZXJyICYmIGRhdGEpIHtcbiAgICAgIHRoaXMuc3RvcmUuYWRkUmVzb3VyY2VCdW5kbGUobG5nLCBucywgZGF0YSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcbiAgICAgICAgc2tpcENvcHk6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlW25hbWVdID0gZXJyID8gLTEgOiAyO1xuICAgIGlmIChlcnIgJiYgZGF0YSkgdGhpcy5zdGF0ZVtuYW1lXSA9IDA7XG4gICAgY29uc3QgbG9hZGVkID0ge307XG4gICAgdGhpcy5xdWV1ZS5mb3JFYWNoKHEgPT4ge1xuICAgICAgcHVzaFBhdGgocS5sb2FkZWQsIFtsbmddLCBucyk7XG4gICAgICByZW1vdmVQZW5kaW5nKHEsIG5hbWUpO1xuICAgICAgaWYgKGVycikgcS5lcnJvcnMucHVzaChlcnIpO1xuICAgICAgaWYgKHEucGVuZGluZ0NvdW50ID09PSAwICYmICFxLmRvbmUpIHtcbiAgICAgICAgT2JqZWN0LmtleXMocS5sb2FkZWQpLmZvckVhY2gobCA9PiB7XG4gICAgICAgICAgaWYgKCFsb2FkZWRbbF0pIGxvYWRlZFtsXSA9IHt9O1xuICAgICAgICAgIGNvbnN0IGxvYWRlZEtleXMgPSBxLmxvYWRlZFtsXTtcbiAgICAgICAgICBpZiAobG9hZGVkS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvYWRlZEtleXMuZm9yRWFjaChuID0+IHtcbiAgICAgICAgICAgICAgaWYgKGxvYWRlZFtsXVtuXSA9PT0gdW5kZWZpbmVkKSBsb2FkZWRbbF1bbl0gPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcS5kb25lID0gdHJ1ZTtcbiAgICAgICAgaWYgKHEuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgIHEuY2FsbGJhY2socS5lcnJvcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHEuY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZW1pdCgnbG9hZGVkJywgbG9hZGVkKTtcbiAgICB0aGlzLnF1ZXVlID0gdGhpcy5xdWV1ZS5maWx0ZXIocSA9PiAhcS5kb25lKTtcbiAgfVxuICByZWFkKGxuZywgbnMsIGZjTmFtZSkge1xuICAgIGxldCB0cmllZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogMDtcbiAgICBsZXQgd2FpdCA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdGhpcy5yZXRyeVRpbWVvdXQ7XG4gICAgbGV0IGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgPyBhcmd1bWVudHNbNV0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFsbmcubGVuZ3RoKSByZXR1cm4gY2FsbGJhY2sobnVsbCwge30pO1xuICAgIGlmICh0aGlzLnJlYWRpbmdDYWxscyA+PSB0aGlzLm1heFBhcmFsbGVsUmVhZHMpIHtcbiAgICAgIHRoaXMud2FpdGluZ1JlYWRzLnB1c2goe1xuICAgICAgICBsbmcsXG4gICAgICAgIG5zLFxuICAgICAgICBmY05hbWUsXG4gICAgICAgIHRyaWVkLFxuICAgICAgICB3YWl0LFxuICAgICAgICBjYWxsYmFja1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVhZGluZ0NhbGxzKys7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICB0aGlzLnJlYWRpbmdDYWxscy0tO1xuICAgICAgaWYgKHRoaXMud2FpdGluZ1JlYWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMud2FpdGluZ1JlYWRzLnNoaWZ0KCk7XG4gICAgICAgIHRoaXMucmVhZChuZXh0LmxuZywgbmV4dC5ucywgbmV4dC5mY05hbWUsIG5leHQudHJpZWQsIG5leHQud2FpdCwgbmV4dC5jYWxsYmFjayk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyICYmIGRhdGEgJiYgdHJpZWQgPCB0aGlzLm1heFJldHJpZXMpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWFkLmNhbGwodGhpcywgbG5nLCBucywgZmNOYW1lLCB0cmllZCArIDEsIHdhaXQgKiAyLCBjYWxsYmFjayk7XG4gICAgICAgIH0sIHdhaXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICAgIH07XG4gICAgY29uc3QgZmMgPSB0aGlzLmJhY2tlbmRbZmNOYW1lXS5iaW5kKHRoaXMuYmFja2VuZCk7XG4gICAgaWYgKGZjLmxlbmd0aCA9PT0gMikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgciA9IGZjKGxuZywgbnMpO1xuICAgICAgICBpZiAociAmJiB0eXBlb2Ygci50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgci50aGVuKGRhdGEgPT4gcmVzb2x2ZXIobnVsbCwgZGF0YSkpLmNhdGNoKHJlc29sdmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlcihudWxsLCByKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlc29sdmVyKGVycik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBmYyhsbmcsIG5zLCByZXNvbHZlcik7XG4gIH1cbiAgcHJlcGFyZUxvYWRpbmcobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIGxldCBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogdW5kZWZpbmVkO1xuICAgIGlmICghdGhpcy5iYWNrZW5kKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdObyBiYWNrZW5kIHdhcyBhZGRlZCB2aWEgaTE4bmV4dC51c2UuIFdpbGwgbm90IGxvYWQgcmVzb3VyY2VzLicpO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGFuZ3VhZ2VzID09PSAnc3RyaW5nJykgbGFuZ3VhZ2VzID0gdGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShsYW5ndWFnZXMpO1xuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycpIG5hbWVzcGFjZXMgPSBbbmFtZXNwYWNlc107XG4gICAgY29uc3QgdG9Mb2FkID0gdGhpcy5xdWV1ZUxvYWQobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgaWYgKCF0b0xvYWQudG9Mb2FkLmxlbmd0aCkge1xuICAgICAgaWYgKCF0b0xvYWQucGVuZGluZy5sZW5ndGgpIGNhbGxiYWNrKCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdG9Mb2FkLnRvTG9hZC5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgdGhpcy5sb2FkT25lKG5hbWUpO1xuICAgIH0pO1xuICB9XG4gIGxvYWQobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzLCBjYWxsYmFjaykge1xuICAgIHRoaXMucHJlcGFyZUxvYWRpbmcobGFuZ3VhZ2VzLCBuYW1lc3BhY2VzLCB7fSwgY2FsbGJhY2spO1xuICB9XG4gIHJlbG9hZChsYW5ndWFnZXMsIG5hbWVzcGFjZXMsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5wcmVwYXJlTG9hZGluZyhsYW5ndWFnZXMsIG5hbWVzcGFjZXMsIHtcbiAgICAgIHJlbG9hZDogdHJ1ZVxuICAgIH0sIGNhbGxiYWNrKTtcbiAgfVxuICBsb2FkT25lKG5hbWUpIHtcbiAgICBsZXQgcHJlZml4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJztcbiAgICBjb25zdCBzID0gbmFtZS5zcGxpdCgnfCcpO1xuICAgIGNvbnN0IGxuZyA9IHNbMF07XG4gICAgY29uc3QgbnMgPSBzWzFdO1xuICAgIHRoaXMucmVhZChsbmcsIG5zLCAncmVhZCcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICBpZiAoZXJyKSB0aGlzLmxvZ2dlci53YXJuKGAke3ByZWZpeH1sb2FkaW5nIG5hbWVzcGFjZSAke25zfSBmb3IgbGFuZ3VhZ2UgJHtsbmd9IGZhaWxlZGAsIGVycik7XG4gICAgICBpZiAoIWVyciAmJiBkYXRhKSB0aGlzLmxvZ2dlci5sb2coYCR7cHJlZml4fWxvYWRlZCBuYW1lc3BhY2UgJHtuc30gZm9yIGxhbmd1YWdlICR7bG5nfWAsIGRhdGEpO1xuICAgICAgdGhpcy5sb2FkZWQobmFtZSwgZXJyLCBkYXRhKTtcbiAgICB9KTtcbiAgfVxuICBzYXZlTWlzc2luZyhsYW5ndWFnZXMsIG5hbWVzcGFjZSwga2V5LCBmYWxsYmFja1ZhbHVlLCBpc1VwZGF0ZSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiB7fTtcbiAgICBsZXQgY2xiID0gYXJndW1lbnRzLmxlbmd0aCA+IDYgJiYgYXJndW1lbnRzWzZdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNl0gOiAoKSA9PiB7fTtcbiAgICBpZiAodGhpcy5zZXJ2aWNlcy51dGlscyAmJiB0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSAmJiAhdGhpcy5zZXJ2aWNlcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UobmFtZXNwYWNlKSkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihgZGlkIG5vdCBzYXZlIGtleSBcIiR7a2V5fVwiIGFzIHRoZSBuYW1lc3BhY2UgXCIke25hbWVzcGFjZX1cIiB3YXMgbm90IHlldCBsb2FkZWRgLCAnVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IG51bGwgfHwga2V5ID09PSAnJykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmJhY2tlbmQgJiYgdGhpcy5iYWNrZW5kLmNyZWF0ZSkge1xuICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaXNVcGRhdGVcbiAgICAgIH07XG4gICAgICBjb25zdCBmYyA9IHRoaXMuYmFja2VuZC5jcmVhdGUuYmluZCh0aGlzLmJhY2tlbmQpO1xuICAgICAgaWYgKGZjLmxlbmd0aCA8IDYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgcjtcbiAgICAgICAgICBpZiAoZmMubGVuZ3RoID09PSA1KSB7XG4gICAgICAgICAgICByID0gZmMobGFuZ3VhZ2VzLCBuYW1lc3BhY2UsIGtleSwgZmFsbGJhY2tWYWx1ZSwgb3B0cyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHIgPSBmYyhsYW5ndWFnZXMsIG5hbWVzcGFjZSwga2V5LCBmYWxsYmFja1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHIgJiYgdHlwZW9mIHIudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgci50aGVuKGRhdGEgPT4gY2xiKG51bGwsIGRhdGEpKS5jYXRjaChjbGIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGIobnVsbCwgcik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjbGIoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmMobGFuZ3VhZ2VzLCBuYW1lc3BhY2UsIGtleSwgZmFsbGJhY2tWYWx1ZSwgY2xiLCBvcHRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFsYW5ndWFnZXMgfHwgIWxhbmd1YWdlc1swXSkgcmV0dXJuO1xuICAgIHRoaXMuc3RvcmUuYWRkUmVzb3VyY2UobGFuZ3VhZ2VzWzBdLCBuYW1lc3BhY2UsIGtleSwgZmFsbGJhY2tWYWx1ZSk7XG4gIH1cbn1cblxuY29uc3QgZ2V0ID0gKCkgPT4gKHtcbiAgZGVidWc6IGZhbHNlLFxuICBpbml0SW1tZWRpYXRlOiB0cnVlLFxuICBuczogWyd0cmFuc2xhdGlvbiddLFxuICBkZWZhdWx0TlM6IFsndHJhbnNsYXRpb24nXSxcbiAgZmFsbGJhY2tMbmc6IFsnZGV2J10sXG4gIGZhbGxiYWNrTlM6IGZhbHNlLFxuICBzdXBwb3J0ZWRMbmdzOiBmYWxzZSxcbiAgbm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzOiBmYWxzZSxcbiAgbG9hZDogJ2FsbCcsXG4gIHByZWxvYWQ6IGZhbHNlLFxuICBzaW1wbGlmeVBsdXJhbFN1ZmZpeDogdHJ1ZSxcbiAga2V5U2VwYXJhdG9yOiAnLicsXG4gIG5zU2VwYXJhdG9yOiAnOicsXG4gIHBsdXJhbFNlcGFyYXRvcjogJ18nLFxuICBjb250ZXh0U2VwYXJhdG9yOiAnXycsXG4gIHBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzOiBmYWxzZSxcbiAgc2F2ZU1pc3Npbmc6IGZhbHNlLFxuICB1cGRhdGVNaXNzaW5nOiBmYWxzZSxcbiAgc2F2ZU1pc3NpbmdUbzogJ2ZhbGxiYWNrJyxcbiAgc2F2ZU1pc3NpbmdQbHVyYWxzOiB0cnVlLFxuICBtaXNzaW5nS2V5SGFuZGxlcjogZmFsc2UsXG4gIG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjogZmFsc2UsXG4gIHBvc3RQcm9jZXNzOiBmYWxzZSxcbiAgcG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ6IGZhbHNlLFxuICByZXR1cm5OdWxsOiBmYWxzZSxcbiAgcmV0dXJuRW1wdHlTdHJpbmc6IHRydWUsXG4gIHJldHVybk9iamVjdHM6IGZhbHNlLFxuICBqb2luQXJyYXlzOiBmYWxzZSxcbiAgcmV0dXJuZWRPYmplY3RIYW5kbGVyOiBmYWxzZSxcbiAgcGFyc2VNaXNzaW5nS2V5SGFuZGxlcjogZmFsc2UsXG4gIGFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleTogZmFsc2UsXG4gIGFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlOiBmYWxzZSxcbiAgb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6IGFyZ3MgPT4ge1xuICAgIGxldCByZXQgPSB7fTtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMV0gPT09ICdvYmplY3QnKSByZXQgPSBhcmdzWzFdO1xuICAgIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gJ3N0cmluZycpIHJldC5kZWZhdWx0VmFsdWUgPSBhcmdzWzFdO1xuICAgIGlmICh0eXBlb2YgYXJnc1syXSA9PT0gJ3N0cmluZycpIHJldC50RGVzY3JpcHRpb24gPSBhcmdzWzJdO1xuICAgIGlmICh0eXBlb2YgYXJnc1syXSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGFyZ3NbM10gPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gYXJnc1szXSB8fCBhcmdzWzJdO1xuICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICByZXRba2V5XSA9IG9wdGlvbnNba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICBpbnRlcnBvbGF0aW9uOiB7XG4gICAgZXNjYXBlVmFsdWU6IHRydWUsXG4gICAgZm9ybWF0OiB2YWx1ZSA9PiB2YWx1ZSxcbiAgICBwcmVmaXg6ICd7eycsXG4gICAgc3VmZml4OiAnfX0nLFxuICAgIGZvcm1hdFNlcGFyYXRvcjogJywnLFxuICAgIHVuZXNjYXBlUHJlZml4OiAnLScsXG4gICAgbmVzdGluZ1ByZWZpeDogJyR0KCcsXG4gICAgbmVzdGluZ1N1ZmZpeDogJyknLFxuICAgIG5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOiAnLCcsXG4gICAgbWF4UmVwbGFjZXM6IDEwMDAsXG4gICAgc2tpcE9uVmFyaWFibGVzOiB0cnVlXG4gIH1cbn0pO1xuY29uc3QgdHJhbnNmb3JtT3B0aW9ucyA9IG9wdGlvbnMgPT4ge1xuICBpZiAodHlwZW9mIG9wdGlvbnMubnMgPT09ICdzdHJpbmcnKSBvcHRpb25zLm5zID0gW29wdGlvbnMubnNdO1xuICBpZiAodHlwZW9mIG9wdGlvbnMuZmFsbGJhY2tMbmcgPT09ICdzdHJpbmcnKSBvcHRpb25zLmZhbGxiYWNrTG5nID0gW29wdGlvbnMuZmFsbGJhY2tMbmddO1xuICBpZiAodHlwZW9mIG9wdGlvbnMuZmFsbGJhY2tOUyA9PT0gJ3N0cmluZycpIG9wdGlvbnMuZmFsbGJhY2tOUyA9IFtvcHRpb25zLmZhbGxiYWNrTlNdO1xuICBpZiAob3B0aW9ucy5zdXBwb3J0ZWRMbmdzICYmIG9wdGlvbnMuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCdjaW1vZGUnKSA8IDApIHtcbiAgICBvcHRpb25zLnN1cHBvcnRlZExuZ3MgPSBvcHRpb25zLnN1cHBvcnRlZExuZ3MuY29uY2F0KFsnY2ltb2RlJ10pO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufTtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuY29uc3QgYmluZE1lbWJlckZ1bmN0aW9ucyA9IGluc3QgPT4ge1xuICBjb25zdCBtZW1zID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT2JqZWN0LmdldFByb3RvdHlwZU9mKGluc3QpKTtcbiAgbWVtcy5mb3JFYWNoKG1lbSA9PiB7XG4gICAgaWYgKHR5cGVvZiBpbnN0W21lbV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluc3RbbWVtXSA9IGluc3RbbWVtXS5iaW5kKGluc3QpO1xuICAgIH1cbiAgfSk7XG59O1xuY2xhc3MgSTE4biBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBsZXQgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMub3B0aW9ucyA9IHRyYW5zZm9ybU9wdGlvbnMob3B0aW9ucyk7XG4gICAgdGhpcy5zZXJ2aWNlcyA9IHt9O1xuICAgIHRoaXMubG9nZ2VyID0gYmFzZUxvZ2dlcjtcbiAgICB0aGlzLm1vZHVsZXMgPSB7XG4gICAgICBleHRlcm5hbDogW11cbiAgICB9O1xuICAgIGJpbmRNZW1iZXJGdW5jdGlvbnModGhpcyk7XG4gICAgaWYgKGNhbGxiYWNrICYmICF0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgIW9wdGlvbnMuaXNDbG9uZSkge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaW5pdEltbWVkaWF0ZSkge1xuICAgICAgICB0aGlzLmluaXQob3B0aW9ucywgY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXQob3B0aW9ucywgY2FsbGJhY2spO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG4gIGluaXQoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgbGV0IGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5pc0luaXRpYWxpemluZyA9IHRydWU7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5kZWZhdWx0TlMgJiYgb3B0aW9ucy5kZWZhdWx0TlMgIT09IGZhbHNlICYmIG9wdGlvbnMubnMpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb3B0aW9ucy5kZWZhdWx0TlMgPSBvcHRpb25zLm5zO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm5zLmluZGV4T2YoJ3RyYW5zbGF0aW9uJykgPCAwKSB7XG4gICAgICAgIG9wdGlvbnMuZGVmYXVsdE5TID0gb3B0aW9ucy5uc1swXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGVmT3B0cyA9IGdldCgpO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIC4uLmRlZk9wdHMsXG4gICAgICAuLi50aGlzLm9wdGlvbnMsXG4gICAgICAuLi50cmFuc2Zvcm1PcHRpb25zKG9wdGlvbnMpXG4gICAgfTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkgIT09ICd2MScpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uID0ge1xuICAgICAgICAuLi5kZWZPcHRzLmludGVycG9sYXRpb24sXG4gICAgICAgIC4uLnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5rZXlTZXBhcmF0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yID0gb3B0aW9ucy5rZXlTZXBhcmF0b3I7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm5zU2VwYXJhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy51c2VyRGVmaW5lZE5zU2VwYXJhdG9yID0gb3B0aW9ucy5uc1NlcGFyYXRvcjtcbiAgICB9XG4gICAgY29uc3QgY3JlYXRlQ2xhc3NPbkRlbWFuZCA9IENsYXNzT3JPYmplY3QgPT4ge1xuICAgICAgaWYgKCFDbGFzc09yT2JqZWN0KSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgQ2xhc3NPck9iamVjdCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5ldyBDbGFzc09yT2JqZWN0KCk7XG4gICAgICByZXR1cm4gQ2xhc3NPck9iamVjdDtcbiAgICB9O1xuICAgIGlmICghdGhpcy5vcHRpb25zLmlzQ2xvbmUpIHtcbiAgICAgIGlmICh0aGlzLm1vZHVsZXMubG9nZ2VyKSB7XG4gICAgICAgIGJhc2VMb2dnZXIuaW5pdChjcmVhdGVDbGFzc09uRGVtYW5kKHRoaXMubW9kdWxlcy5sb2dnZXIpLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmFzZUxvZ2dlci5pbml0KG51bGwsIHRoaXMub3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBsZXQgZm9ybWF0dGVyO1xuICAgICAgaWYgKHRoaXMubW9kdWxlcy5mb3JtYXR0ZXIpIHtcbiAgICAgICAgZm9ybWF0dGVyID0gdGhpcy5tb2R1bGVzLmZvcm1hdHRlcjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEludGwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGZvcm1hdHRlciA9IEZvcm1hdHRlcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGx1ID0gbmV3IExhbmd1YWdlVXRpbCh0aGlzLm9wdGlvbnMpO1xuICAgICAgdGhpcy5zdG9yZSA9IG5ldyBSZXNvdXJjZVN0b3JlKHRoaXMub3B0aW9ucy5yZXNvdXJjZXMsIHRoaXMub3B0aW9ucyk7XG4gICAgICBjb25zdCBzID0gdGhpcy5zZXJ2aWNlcztcbiAgICAgIHMubG9nZ2VyID0gYmFzZUxvZ2dlcjtcbiAgICAgIHMucmVzb3VyY2VTdG9yZSA9IHRoaXMuc3RvcmU7XG4gICAgICBzLmxhbmd1YWdlVXRpbHMgPSBsdTtcbiAgICAgIHMucGx1cmFsUmVzb2x2ZXIgPSBuZXcgUGx1cmFsUmVzb2x2ZXIobHUsIHtcbiAgICAgICAgcHJlcGVuZDogdGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcixcbiAgICAgICAgY29tcGF0aWJpbGl0eUpTT046IHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixcbiAgICAgICAgc2ltcGxpZnlQbHVyYWxTdWZmaXg6IHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeFxuICAgICAgfSk7XG4gICAgICBpZiAoZm9ybWF0dGVyICYmICghdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0IHx8IHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCA9PT0gZGVmT3B0cy5pbnRlcnBvbGF0aW9uLmZvcm1hdCkpIHtcbiAgICAgICAgcy5mb3JtYXR0ZXIgPSBjcmVhdGVDbGFzc09uRGVtYW5kKGZvcm1hdHRlcik7XG4gICAgICAgIHMuZm9ybWF0dGVyLmluaXQocywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0ID0gcy5mb3JtYXR0ZXIuZm9ybWF0LmJpbmQocy5mb3JtYXR0ZXIpO1xuICAgICAgfVxuICAgICAgcy5pbnRlcnBvbGF0b3IgPSBuZXcgSW50ZXJwb2xhdG9yKHRoaXMub3B0aW9ucyk7XG4gICAgICBzLnV0aWxzID0ge1xuICAgICAgICBoYXNMb2FkZWROYW1lc3BhY2U6IHRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcylcbiAgICAgIH07XG4gICAgICBzLmJhY2tlbmRDb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yKGNyZWF0ZUNsYXNzT25EZW1hbmQodGhpcy5tb2R1bGVzLmJhY2tlbmQpLCBzLnJlc291cmNlU3RvcmUsIHMsIHRoaXMub3B0aW9ucyk7XG4gICAgICBzLmJhY2tlbmRDb25uZWN0b3Iub24oJyonLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpIHtcbiAgICAgICAgcy5sYW5ndWFnZURldGVjdG9yID0gY3JlYXRlQ2xhc3NPbkRlbWFuZCh0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcik7XG4gICAgICAgIGlmIChzLmxhbmd1YWdlRGV0ZWN0b3IuaW5pdCkgcy5sYW5ndWFnZURldGVjdG9yLmluaXQocywgdGhpcy5vcHRpb25zLmRldGVjdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCkge1xuICAgICAgICBzLmkxOG5Gb3JtYXQgPSBjcmVhdGVDbGFzc09uRGVtYW5kKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0KTtcbiAgICAgICAgaWYgKHMuaTE4bkZvcm1hdC5pbml0KSBzLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudHJhbnNsYXRvciA9IG5ldyBUcmFuc2xhdG9yKHRoaXMuc2VydmljZXMsIHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnRyYW5zbGF0b3Iub24oJyonLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChtID0+IHtcbiAgICAgICAgaWYgKG0uaW5pdCkgbS5pbml0KHRoaXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZm9ybWF0ID0gdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0O1xuICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gbm9vcDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nICYmICF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IgJiYgIXRoaXMub3B0aW9ucy5sbmcpIHtcbiAgICAgIGNvbnN0IGNvZGVzID0gdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtcbiAgICAgIGlmIChjb2Rlcy5sZW5ndGggPiAwICYmIGNvZGVzWzBdICE9PSAnZGV2JykgdGhpcy5vcHRpb25zLmxuZyA9IGNvZGVzWzBdO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciAmJiAhdGhpcy5vcHRpb25zLmxuZykge1xuICAgICAgdGhpcy5sb2dnZXIud2FybignaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCcpO1xuICAgIH1cbiAgICBjb25zdCBzdG9yZUFwaSA9IFsnZ2V0UmVzb3VyY2UnLCAnaGFzUmVzb3VyY2VCdW5kbGUnLCAnZ2V0UmVzb3VyY2VCdW5kbGUnLCAnZ2V0RGF0YUJ5TGFuZ3VhZ2UnXTtcbiAgICBzdG9yZUFwaS5mb3JFYWNoKGZjTmFtZSA9PiB7XG4gICAgICB0aGlzW2ZjTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5zdG9yZVtmY05hbWVdKC4uLmFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHN0b3JlQXBpQ2hhaW5lZCA9IFsnYWRkUmVzb3VyY2UnLCAnYWRkUmVzb3VyY2VzJywgJ2FkZFJlc291cmNlQnVuZGxlJywgJ3JlbW92ZVJlc291cmNlQnVuZGxlJ107XG4gICAgc3RvcmVBcGlDaGFpbmVkLmZvckVhY2goZmNOYW1lID0+IHtcbiAgICAgIHRoaXNbZmNOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuc3RvcmVbZmNOYW1lXSguLi5hcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICBjb25zdCBsb2FkID0gKCkgPT4ge1xuICAgICAgY29uc3QgZmluaXNoID0gKGVyciwgdCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6aW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgIXRoaXMuaW5pdGlhbGl6ZWRTdG9yZU9uY2UpIHRoaXMubG9nZ2VyLndhcm4oJ2luaXQ6IGkxOG5leHQgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4gWW91IHNob3VsZCBjYWxsIGluaXQganVzdCBvbmNlIScpO1xuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pc0Nsb25lKSB0aGlzLmxvZ2dlci5sb2coJ2luaXRpYWxpemVkJywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbWl0KCdpbml0aWFsaXplZCcsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIGRlZmVycmVkLnJlc29sdmUodCk7XG4gICAgICAgIGNhbGxiYWNrKGVyciwgdCk7XG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMubGFuZ3VhZ2VzICYmIHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJICE9PSAndjEnICYmICF0aGlzLmlzSW5pdGlhbGl6ZWQpIHJldHVybiBmaW5pc2gobnVsbCwgdGhpcy50LmJpbmQodGhpcykpO1xuICAgICAgdGhpcy5jaGFuZ2VMYW5ndWFnZSh0aGlzLm9wdGlvbnMubG5nLCBmaW5pc2gpO1xuICAgIH07XG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXNvdXJjZXMgfHwgIXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlKSB7XG4gICAgICBsb2FkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQobG9hZCwgMCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZlcnJlZDtcbiAgfVxuICBsb2FkUmVzb3VyY2VzKGxhbmd1YWdlKSB7XG4gICAgbGV0IGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBub29wO1xuICAgIGxldCB1c2VkQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICBjb25zdCB1c2VkTG5nID0gdHlwZW9mIGxhbmd1YWdlID09PSAnc3RyaW5nJyA/IGxhbmd1YWdlIDogdGhpcy5sYW5ndWFnZTtcbiAgICBpZiAodHlwZW9mIGxhbmd1YWdlID09PSAnZnVuY3Rpb24nKSB1c2VkQ2FsbGJhY2sgPSBsYW5ndWFnZTtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5yZXNvdXJjZXMgfHwgdGhpcy5vcHRpb25zLnBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzKSB7XG4gICAgICBpZiAodXNlZExuZyAmJiB1c2VkTG5nLnRvTG93ZXJDYXNlKCkgPT09ICdjaW1vZGUnICYmICghdGhpcy5vcHRpb25zLnByZWxvYWQgfHwgdGhpcy5vcHRpb25zLnByZWxvYWQubGVuZ3RoID09PSAwKSkgcmV0dXJuIHVzZWRDYWxsYmFjaygpO1xuICAgICAgY29uc3QgdG9Mb2FkID0gW107XG4gICAgICBjb25zdCBhcHBlbmQgPSBsbmcgPT4ge1xuICAgICAgICBpZiAoIWxuZykgcmV0dXJuO1xuICAgICAgICBpZiAobG5nID09PSAnY2ltb2RlJykgcmV0dXJuO1xuICAgICAgICBjb25zdCBsbmdzID0gdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShsbmcpO1xuICAgICAgICBsbmdzLmZvckVhY2gobCA9PiB7XG4gICAgICAgICAgaWYgKGwgPT09ICdjaW1vZGUnKSByZXR1cm47XG4gICAgICAgICAgaWYgKHRvTG9hZC5pbmRleE9mKGwpIDwgMCkgdG9Mb2FkLnB1c2gobCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGlmICghdXNlZExuZykge1xuICAgICAgICBjb25zdCBmYWxsYmFja3MgPSB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpO1xuICAgICAgICBmYWxsYmFja3MuZm9yRWFjaChsID0+IGFwcGVuZChsKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcHBlbmQodXNlZExuZyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnByZWxvYWQpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnByZWxvYWQuZm9yRWFjaChsID0+IGFwcGVuZChsKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZCh0b0xvYWQsIHRoaXMub3B0aW9ucy5ucywgZSA9PiB7XG4gICAgICAgIGlmICghZSAmJiAhdGhpcy5yZXNvbHZlZExhbmd1YWdlICYmIHRoaXMubGFuZ3VhZ2UpIHRoaXMuc2V0UmVzb2x2ZWRMYW5ndWFnZSh0aGlzLmxhbmd1YWdlKTtcbiAgICAgICAgdXNlZENhbGxiYWNrKGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVzZWRDYWxsYmFjayhudWxsKTtcbiAgICB9XG4gIH1cbiAgcmVsb2FkUmVzb3VyY2VzKGxuZ3MsIG5zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICBpZiAodHlwZW9mIGxuZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gbG5ncztcbiAgICAgIGxuZ3MgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gbnM7XG4gICAgICBucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCFsbmdzKSBsbmdzID0gdGhpcy5sYW5ndWFnZXM7XG4gICAgaWYgKCFucykgbnMgPSB0aGlzLm9wdGlvbnMubnM7XG4gICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBub29wO1xuICAgIHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5yZWxvYWQobG5ncywgbnMsIGVyciA9PiB7XG4gICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0pO1xuICAgIHJldHVybiBkZWZlcnJlZDtcbiAgfVxuICB1c2UobW9kdWxlKSB7XG4gICAgaWYgKCFtb2R1bGUpIHRocm93IG5ldyBFcnJvcignWW91IGFyZSBwYXNzaW5nIGFuIHVuZGVmaW5lZCBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpJyk7XG4gICAgaWYgKCFtb2R1bGUudHlwZSkgdGhyb3cgbmV3IEVycm9yKCdZb3UgYXJlIHBhc3NpbmcgYSB3cm9uZyBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpJyk7XG4gICAgaWYgKG1vZHVsZS50eXBlID09PSAnYmFja2VuZCcpIHtcbiAgICAgIHRoaXMubW9kdWxlcy5iYWNrZW5kID0gbW9kdWxlO1xuICAgIH1cbiAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdsb2dnZXInIHx8IG1vZHVsZS5sb2cgJiYgbW9kdWxlLndhcm4gJiYgbW9kdWxlLmVycm9yKSB7XG4gICAgICB0aGlzLm1vZHVsZXMubG9nZ2VyID0gbW9kdWxlO1xuICAgIH1cbiAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdsYW5ndWFnZURldGVjdG9yJykge1xuICAgICAgdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IgPSBtb2R1bGU7XG4gICAgfVxuICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJ2kxOG5Gb3JtYXQnKSB7XG4gICAgICB0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCA9IG1vZHVsZTtcbiAgICB9XG4gICAgaWYgKG1vZHVsZS50eXBlID09PSAncG9zdFByb2Nlc3NvcicpIHtcbiAgICAgIHBvc3RQcm9jZXNzb3IuYWRkUG9zdFByb2Nlc3Nvcihtb2R1bGUpO1xuICAgIH1cbiAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdmb3JtYXR0ZXInKSB7XG4gICAgICB0aGlzLm1vZHVsZXMuZm9ybWF0dGVyID0gbW9kdWxlO1xuICAgIH1cbiAgICBpZiAobW9kdWxlLnR5cGUgPT09ICczcmRQYXJ0eScpIHtcbiAgICAgIHRoaXMubW9kdWxlcy5leHRlcm5hbC5wdXNoKG1vZHVsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHNldFJlc29sdmVkTGFuZ3VhZ2UobCkge1xuICAgIGlmICghbCB8fCAhdGhpcy5sYW5ndWFnZXMpIHJldHVybjtcbiAgICBpZiAoWydjaW1vZGUnLCAnZGV2J10uaW5kZXhPZihsKSA+IC0xKSByZXR1cm47XG4gICAgZm9yIChsZXQgbGkgPSAwOyBsaSA8IHRoaXMubGFuZ3VhZ2VzLmxlbmd0aDsgbGkrKykge1xuICAgICAgY29uc3QgbG5nSW5MbmdzID0gdGhpcy5sYW5ndWFnZXNbbGldO1xuICAgICAgaWYgKFsnY2ltb2RlJywgJ2RldiddLmluZGV4T2YobG5nSW5MbmdzKSA+IC0xKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLnN0b3JlLmhhc0xhbmd1YWdlU29tZVRyYW5zbGF0aW9ucyhsbmdJbkxuZ3MpKSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZWRMYW5ndWFnZSA9IGxuZ0luTG5ncztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNoYW5nZUxhbmd1YWdlKGxuZywgY2FsbGJhY2spIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICB0aGlzLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvID0gbG5nO1xuICAgIGNvbnN0IGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICB0aGlzLmVtaXQoJ2xhbmd1YWdlQ2hhbmdpbmcnLCBsbmcpO1xuICAgIGNvbnN0IHNldExuZ1Byb3BzID0gbCA9PiB7XG4gICAgICB0aGlzLmxhbmd1YWdlID0gbDtcbiAgICAgIHRoaXMubGFuZ3VhZ2VzID0gdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShsKTtcbiAgICAgIHRoaXMucmVzb2x2ZWRMYW5ndWFnZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc2V0UmVzb2x2ZWRMYW5ndWFnZShsKTtcbiAgICB9O1xuICAgIGNvbnN0IGRvbmUgPSAoZXJyLCBsKSA9PiB7XG4gICAgICBpZiAobCkge1xuICAgICAgICBzZXRMbmdQcm9wcyhsKTtcbiAgICAgICAgdGhpcy50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKGwpO1xuICAgICAgICB0aGlzLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmVtaXQoJ2xhbmd1YWdlQ2hhbmdlZCcsIGwpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coJ2xhbmd1YWdlQ2hhbmdlZCcsIGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGRlZmVycmVkLnJlc29sdmUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLnQoLi4uYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi50KC4uLmFyZ3VtZW50cyk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHNldExuZyA9IGxuZ3MgPT4ge1xuICAgICAgaWYgKCFsbmcgJiYgIWxuZ3MgJiYgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yKSBsbmdzID0gW107XG4gICAgICBjb25zdCBsID0gdHlwZW9mIGxuZ3MgPT09ICdzdHJpbmcnID8gbG5ncyA6IHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRCZXN0TWF0Y2hGcm9tQ29kZXMobG5ncyk7XG4gICAgICBpZiAobCkge1xuICAgICAgICBpZiAoIXRoaXMubGFuZ3VhZ2UpIHtcbiAgICAgICAgICBzZXRMbmdQcm9wcyhsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJhbnNsYXRvci5sYW5ndWFnZSkgdGhpcy50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKGwpO1xuICAgICAgICBpZiAodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yICYmIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5jYWNoZVVzZXJMYW5ndWFnZSkgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2FkUmVzb3VyY2VzKGwsIGVyciA9PiB7XG4gICAgICAgIGRvbmUoZXJyLCBsKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaWYgKCFsbmcgJiYgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yICYmICF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmMpIHtcbiAgICAgIHNldExuZyh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KCkpO1xuICAgIH0gZWxzZSBpZiAoIWxuZyAmJiB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IgJiYgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jKSB7XG4gICAgICBpZiAodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdCgpLnRoZW4oc2V0TG5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3Qoc2V0TG5nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0TG5nKGxuZyk7XG4gICAgfVxuICAgIHJldHVybiBkZWZlcnJlZDtcbiAgfVxuICBnZXRGaXhlZFQobG5nLCBucywga2V5UHJlZml4KSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG4gICAgY29uc3QgZml4ZWRUID0gZnVuY3Rpb24gKGtleSwgb3B0cykge1xuICAgICAgbGV0IG9wdGlvbnM7XG4gICAgICBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuMyA+IDIgPyBfbGVuMyAtIDIgOiAwKSwgX2tleTMgPSAyOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICAgICAgcmVzdFtfa2V5MyAtIDJdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zID0gX3RoaXMzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXIoW2tleSwgb3B0c10uY29uY2F0KHJlc3QpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgLi4ub3B0c1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgb3B0aW9ucy5sbmcgPSBvcHRpb25zLmxuZyB8fCBmaXhlZFQubG5nO1xuICAgICAgb3B0aW9ucy5sbmdzID0gb3B0aW9ucy5sbmdzIHx8IGZpeGVkVC5sbmdzO1xuICAgICAgb3B0aW9ucy5ucyA9IG9wdGlvbnMubnMgfHwgZml4ZWRULm5zO1xuICAgICAgaWYgKG9wdGlvbnMua2V5UHJlZml4ICE9PSAnJykgb3B0aW9ucy5rZXlQcmVmaXggPSBvcHRpb25zLmtleVByZWZpeCB8fCBrZXlQcmVmaXggfHwgZml4ZWRULmtleVByZWZpeDtcbiAgICAgIGNvbnN0IGtleVNlcGFyYXRvciA9IF90aGlzMy5vcHRpb25zLmtleVNlcGFyYXRvciB8fCAnLic7XG4gICAgICBsZXQgcmVzdWx0S2V5O1xuICAgICAgaWYgKG9wdGlvbnMua2V5UHJlZml4ICYmIEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgICByZXN1bHRLZXkgPSBrZXkubWFwKGsgPT4gYCR7b3B0aW9ucy5rZXlQcmVmaXh9JHtrZXlTZXBhcmF0b3J9JHtrfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0S2V5ID0gb3B0aW9ucy5rZXlQcmVmaXggPyBgJHtvcHRpb25zLmtleVByZWZpeH0ke2tleVNlcGFyYXRvcn0ke2tleX1gIDoga2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIF90aGlzMy50KHJlc3VsdEtleSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIGxuZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZpeGVkVC5sbmcgPSBsbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpeGVkVC5sbmdzID0gbG5nO1xuICAgIH1cbiAgICBmaXhlZFQubnMgPSBucztcbiAgICBmaXhlZFQua2V5UHJlZml4ID0ga2V5UHJlZml4O1xuICAgIHJldHVybiBmaXhlZFQ7XG4gIH1cbiAgdCgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdG9yICYmIHRoaXMudHJhbnNsYXRvci50cmFuc2xhdGUoLi4uYXJndW1lbnRzKTtcbiAgfVxuICBleGlzdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRvciAmJiB0aGlzLnRyYW5zbGF0b3IuZXhpc3RzKC4uLmFyZ3VtZW50cyk7XG4gIH1cbiAgc2V0RGVmYXVsdE5hbWVzcGFjZShucykge1xuICAgIHRoaXMub3B0aW9ucy5kZWZhdWx0TlMgPSBucztcbiAgfVxuICBoYXNMb2FkZWROYW1lc3BhY2UobnMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ2hhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkJywgdGhpcy5sYW5ndWFnZXMpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubGFuZ3VhZ2VzIHx8ICF0aGlzLmxhbmd1YWdlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ2hhc0xvYWRlZE5hbWVzcGFjZTogaTE4bi5sYW5ndWFnZXMgd2VyZSB1bmRlZmluZWQgb3IgZW1wdHknLCB0aGlzLmxhbmd1YWdlcyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGxuZyA9IG9wdGlvbnMubG5nIHx8IHRoaXMucmVzb2x2ZWRMYW5ndWFnZSB8fCB0aGlzLmxhbmd1YWdlc1swXTtcbiAgICBjb25zdCBmYWxsYmFja0xuZyA9IHRoaXMub3B0aW9ucyA/IHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyA6IGZhbHNlO1xuICAgIGNvbnN0IGxhc3RMbmcgPSB0aGlzLmxhbmd1YWdlc1t0aGlzLmxhbmd1YWdlcy5sZW5ndGggLSAxXTtcbiAgICBpZiAobG5nLnRvTG93ZXJDYXNlKCkgPT09ICdjaW1vZGUnKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBsb2FkTm90UGVuZGluZyA9IChsLCBuKSA9PiB7XG4gICAgICBjb25zdCBsb2FkU3RhdGUgPSB0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3Iuc3RhdGVbYCR7bH18JHtufWBdO1xuICAgICAgcmV0dXJuIGxvYWRTdGF0ZSA9PT0gLTEgfHwgbG9hZFN0YXRlID09PSAwIHx8IGxvYWRTdGF0ZSA9PT0gMjtcbiAgICB9O1xuICAgIGlmIChvcHRpb25zLnByZWNoZWNrKSB7XG4gICAgICBjb25zdCBwcmVSZXN1bHQgPSBvcHRpb25zLnByZWNoZWNrKHRoaXMsIGxvYWROb3RQZW5kaW5nKTtcbiAgICAgIGlmIChwcmVSZXN1bHQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHByZVJlc3VsdDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzUmVzb3VyY2VCdW5kbGUobG5nLCBucykpIHJldHVybiB0cnVlO1xuICAgIGlmICghdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmJhY2tlbmQgfHwgdGhpcy5vcHRpb25zLnJlc291cmNlcyAmJiAhdGhpcy5vcHRpb25zLnBhcnRpYWxCdW5kbGVkTGFuZ3VhZ2VzKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobG9hZE5vdFBlbmRpbmcobG5nLCBucykgJiYgKCFmYWxsYmFja0xuZyB8fCBsb2FkTm90UGVuZGluZyhsYXN0TG5nLCBucykpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbG9hZE5hbWVzcGFjZXMobnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIGlmICghdGhpcy5vcHRpb25zLm5zKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbnMgPT09ICdzdHJpbmcnKSBucyA9IFtuc107XG4gICAgbnMuZm9yRWFjaChuID0+IHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubnMuaW5kZXhPZihuKSA8IDApIHRoaXMub3B0aW9ucy5ucy5wdXNoKG4pO1xuICAgIH0pO1xuICAgIHRoaXMubG9hZFJlc291cmNlcyhlcnIgPT4ge1xuICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIpO1xuICAgIH0pO1xuICAgIHJldHVybiBkZWZlcnJlZDtcbiAgfVxuICBsb2FkTGFuZ3VhZ2VzKGxuZ3MsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIGlmICh0eXBlb2YgbG5ncyA9PT0gJ3N0cmluZycpIGxuZ3MgPSBbbG5nc107XG4gICAgY29uc3QgcHJlbG9hZGVkID0gdGhpcy5vcHRpb25zLnByZWxvYWQgfHwgW107XG4gICAgY29uc3QgbmV3TG5ncyA9IGxuZ3MuZmlsdGVyKGxuZyA9PiBwcmVsb2FkZWQuaW5kZXhPZihsbmcpIDwgMCAmJiB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuaXNTdXBwb3J0ZWRDb2RlKGxuZykpO1xuICAgIGlmICghbmV3TG5ncy5sZW5ndGgpIHtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zLnByZWxvYWQgPSBwcmVsb2FkZWQuY29uY2F0KG5ld0xuZ3MpO1xuICAgIHRoaXMubG9hZFJlc291cmNlcyhlcnIgPT4ge1xuICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIpO1xuICAgIH0pO1xuICAgIHJldHVybiBkZWZlcnJlZDtcbiAgfVxuICBkaXIobG5nKSB7XG4gICAgaWYgKCFsbmcpIGxuZyA9IHRoaXMucmVzb2x2ZWRMYW5ndWFnZSB8fCAodGhpcy5sYW5ndWFnZXMgJiYgdGhpcy5sYW5ndWFnZXMubGVuZ3RoID4gMCA/IHRoaXMubGFuZ3VhZ2VzWzBdIDogdGhpcy5sYW5ndWFnZSk7XG4gICAgaWYgKCFsbmcpIHJldHVybiAncnRsJztcbiAgICBjb25zdCBydGxMbmdzID0gWydhcicsICdzaHUnLCAnc3FyJywgJ3NzaCcsICd4YWEnLCAneWhkJywgJ3l1ZCcsICdhYW8nLCAnYWJoJywgJ2FidicsICdhY20nLCAnYWNxJywgJ2FjdycsICdhY3gnLCAnYWN5JywgJ2FkZicsICdhZHMnLCAnYWViJywgJ2FlYycsICdhZmInLCAnYWpwJywgJ2FwYycsICdhcGQnLCAnYXJiJywgJ2FycScsICdhcnMnLCAnYXJ5JywgJ2FyeicsICdhdXonLCAnYXZsJywgJ2F5aCcsICdheWwnLCAnYXluJywgJ2F5cCcsICdiYnonLCAncGdhJywgJ2hlJywgJ2l3JywgJ3BzJywgJ3BidCcsICdwYnUnLCAncHN0JywgJ3BycCcsICdwcmQnLCAndWcnLCAndXInLCAneWRkJywgJ3lkcycsICd5aWgnLCAnamknLCAneWknLCAnaGJvJywgJ21lbicsICd4bW4nLCAnZmEnLCAnanByJywgJ3BlbycsICdwZXMnLCAncHJzJywgJ2R2JywgJ3NhbScsICdja2InXTtcbiAgICBjb25zdCBsYW5ndWFnZVV0aWxzID0gdGhpcy5zZXJ2aWNlcyAmJiB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMgfHwgbmV3IExhbmd1YWdlVXRpbChnZXQoKSk7XG4gICAgcmV0dXJuIHJ0bExuZ3MuaW5kZXhPZihsYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGxuZykpID4gLTEgfHwgbG5nLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignLWFyYWInKSA+IDEgPyAncnRsJyA6ICdsdHInO1xuICB9XG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZSgpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgbGV0IGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG5ldyBJMThuKG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgfVxuICBjbG9uZUluc3RhbmNlKCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBsZXQgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG5vb3A7XG4gICAgY29uc3QgZm9ya1Jlc291cmNlU3RvcmUgPSBvcHRpb25zLmZvcmtSZXNvdXJjZVN0b3JlO1xuICAgIGlmIChmb3JrUmVzb3VyY2VTdG9yZSkgZGVsZXRlIG9wdGlvbnMuZm9ya1Jlc291cmNlU3RvcmU7XG4gICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHtcbiAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAuLi57XG4gICAgICAgIGlzQ2xvbmU6IHRydWVcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGNsb25lID0gbmV3IEkxOG4obWVyZ2VkT3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuZGVidWcgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbG9uZS5sb2dnZXIgPSBjbG9uZS5sb2dnZXIuY2xvbmUob3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbnN0IG1lbWJlcnNUb0NvcHkgPSBbJ3N0b3JlJywgJ3NlcnZpY2VzJywgJ2xhbmd1YWdlJ107XG4gICAgbWVtYmVyc1RvQ29weS5mb3JFYWNoKG0gPT4ge1xuICAgICAgY2xvbmVbbV0gPSB0aGlzW21dO1xuICAgIH0pO1xuICAgIGNsb25lLnNlcnZpY2VzID0ge1xuICAgICAgLi4udGhpcy5zZXJ2aWNlc1xuICAgIH07XG4gICAgY2xvbmUuc2VydmljZXMudXRpbHMgPSB7XG4gICAgICBoYXNMb2FkZWROYW1lc3BhY2U6IGNsb25lLmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKGNsb25lKVxuICAgIH07XG4gICAgaWYgKGZvcmtSZXNvdXJjZVN0b3JlKSB7XG4gICAgICBjbG9uZS5zdG9yZSA9IG5ldyBSZXNvdXJjZVN0b3JlKHRoaXMuc3RvcmUuZGF0YSwgbWVyZ2VkT3B0aW9ucyk7XG4gICAgICBjbG9uZS5zZXJ2aWNlcy5yZXNvdXJjZVN0b3JlID0gY2xvbmUuc3RvcmU7XG4gICAgfVxuICAgIGNsb25lLnRyYW5zbGF0b3IgPSBuZXcgVHJhbnNsYXRvcihjbG9uZS5zZXJ2aWNlcywgbWVyZ2VkT3B0aW9ucyk7XG4gICAgY2xvbmUudHJhbnNsYXRvci5vbignKicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW40ID4gMSA/IF9sZW40IC0gMSA6IDApLCBfa2V5NCA9IDE7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgICAgYXJnc1tfa2V5NCAtIDFdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgICAgIH1cbiAgICAgIGNsb25lLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgIH0pO1xuICAgIGNsb25lLmluaXQobWVyZ2VkT3B0aW9ucywgY2FsbGJhY2spO1xuICAgIGNsb25lLnRyYW5zbGF0b3Iub3B0aW9ucyA9IG1lcmdlZE9wdGlvbnM7XG4gICAgY2xvbmUudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzID0ge1xuICAgICAgaGFzTG9hZGVkTmFtZXNwYWNlOiBjbG9uZS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChjbG9uZSlcbiAgICB9O1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIHN0b3JlOiB0aGlzLnN0b3JlLFxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICBsYW5ndWFnZXM6IHRoaXMubGFuZ3VhZ2VzLFxuICAgICAgcmVzb2x2ZWRMYW5ndWFnZTogdGhpcy5yZXNvbHZlZExhbmd1YWdlXG4gICAgfTtcbiAgfVxufVxuY29uc3QgaW5zdGFuY2UgPSBJMThuLmNyZWF0ZUluc3RhbmNlKCk7XG5pbnN0YW5jZS5jcmVhdGVJbnN0YW5jZSA9IEkxOG4uY3JlYXRlSW5zdGFuY2U7XG5cbmNvbnN0IGNyZWF0ZUluc3RhbmNlID0gaW5zdGFuY2UuY3JlYXRlSW5zdGFuY2U7XG5jb25zdCBkaXIgPSBpbnN0YW5jZS5kaXI7XG5jb25zdCBpbml0ID0gaW5zdGFuY2UuaW5pdDtcbmNvbnN0IGxvYWRSZXNvdXJjZXMgPSBpbnN0YW5jZS5sb2FkUmVzb3VyY2VzO1xuY29uc3QgcmVsb2FkUmVzb3VyY2VzID0gaW5zdGFuY2UucmVsb2FkUmVzb3VyY2VzO1xuY29uc3QgdXNlID0gaW5zdGFuY2UudXNlO1xuY29uc3QgY2hhbmdlTGFuZ3VhZ2UgPSBpbnN0YW5jZS5jaGFuZ2VMYW5ndWFnZTtcbmNvbnN0IGdldEZpeGVkVCA9IGluc3RhbmNlLmdldEZpeGVkVDtcbmNvbnN0IHQgPSBpbnN0YW5jZS50O1xuY29uc3QgZXhpc3RzID0gaW5zdGFuY2UuZXhpc3RzO1xuY29uc3Qgc2V0RGVmYXVsdE5hbWVzcGFjZSA9IGluc3RhbmNlLnNldERlZmF1bHROYW1lc3BhY2U7XG5jb25zdCBoYXNMb2FkZWROYW1lc3BhY2UgPSBpbnN0YW5jZS5oYXNMb2FkZWROYW1lc3BhY2U7XG5jb25zdCBsb2FkTmFtZXNwYWNlcyA9IGluc3RhbmNlLmxvYWROYW1lc3BhY2VzO1xuY29uc3QgbG9hZExhbmd1YWdlcyA9IGluc3RhbmNlLmxvYWRMYW5ndWFnZXM7XG5cbmV4cG9ydCB7IGNoYW5nZUxhbmd1YWdlLCBjcmVhdGVJbnN0YW5jZSwgaW5zdGFuY2UgYXMgZGVmYXVsdCwgZGlyLCBleGlzdHMsIGdldEZpeGVkVCwgaGFzTG9hZGVkTmFtZXNwYWNlLCBpbml0LCBsb2FkTGFuZ3VhZ2VzLCBsb2FkTmFtZXNwYWNlcywgbG9hZFJlc291cmNlcywgcmVsb2FkUmVzb3VyY2VzLCBzZXREZWZhdWx0TmFtZXNwYWNlLCB0LCB1c2UgfTtcbiIsImZ1bmN0aW9uIHByb21pc2lmeVJlcXVlc3QocmVxdWVzdCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgLSBmaWxlIHNpemUgaGFja3NcbiAgICAgICAgcmVxdWVzdC5vbmNvbXBsZXRlID0gcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHJlcXVlc3QucmVzdWx0KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSAtIGZpbGUgc2l6ZSBoYWNrc1xuICAgICAgICByZXF1ZXN0Lm9uYWJvcnQgPSByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVTdG9yZShkYk5hbWUsIHN0b3JlTmFtZSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihkYk5hbWUpO1xuICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4gcmVxdWVzdC5yZXN1bHQuY3JlYXRlT2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICBjb25zdCBkYnAgPSBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QpO1xuICAgIHJldHVybiAodHhNb2RlLCBjYWxsYmFjaykgPT4gZGJwLnRoZW4oKGRiKSA9PiBjYWxsYmFjayhkYi50cmFuc2FjdGlvbihzdG9yZU5hbWUsIHR4TW9kZSkub2JqZWN0U3RvcmUoc3RvcmVOYW1lKSkpO1xufVxubGV0IGRlZmF1bHRHZXRTdG9yZUZ1bmM7XG5mdW5jdGlvbiBkZWZhdWx0R2V0U3RvcmUoKSB7XG4gICAgaWYgKCFkZWZhdWx0R2V0U3RvcmVGdW5jKSB7XG4gICAgICAgIGRlZmF1bHRHZXRTdG9yZUZ1bmMgPSBjcmVhdGVTdG9yZSgna2V5dmFsLXN0b3JlJywgJ2tleXZhbCcpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEdldFN0b3JlRnVuYztcbn1cbi8qKlxuICogR2V0IGEgdmFsdWUgYnkgaXRzIGtleS5cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gZ2V0KGtleSwgY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZG9ubHknLCAoc3RvcmUpID0+IHByb21pc2lmeVJlcXVlc3Qoc3RvcmUuZ2V0KGtleSkpKTtcbn1cbi8qKlxuICogU2V0IGEgdmFsdWUgd2l0aCBhIGtleS5cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSwgY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICAgIHN0b3JlLnB1dCh2YWx1ZSwga2V5KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUudHJhbnNhY3Rpb24pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBTZXQgbXVsdGlwbGUgdmFsdWVzIGF0IG9uY2UuIFRoaXMgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBzZXQoKSBtdWx0aXBsZSB0aW1lcy5cbiAqIEl0J3MgYWxzbyBhdG9taWMg4oCTIGlmIG9uZSBvZiB0aGUgcGFpcnMgY2FuJ3QgYmUgYWRkZWQsIG5vbmUgd2lsbCBiZSBhZGRlZC5cbiAqXG4gKiBAcGFyYW0gZW50cmllcyBBcnJheSBvZiBlbnRyaWVzLCB3aGVyZSBlYWNoIGVudHJ5IGlzIGFuIGFycmF5IG9mIGBba2V5LCB2YWx1ZV1gLlxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIHNldE1hbnkoZW50cmllcywgY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHN0b3JlLnB1dChlbnRyeVsxXSwgZW50cnlbMF0pKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUudHJhbnNhY3Rpb24pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBHZXQgbXVsdGlwbGUgdmFsdWVzIGJ5IHRoZWlyIGtleXNcbiAqXG4gKiBAcGFyYW0ga2V5c1xuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIGdldE1hbnkoa2V5cywgY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZG9ubHknLCAoc3RvcmUpID0+IFByb21pc2UuYWxsKGtleXMubWFwKChrZXkpID0+IHByb21pc2lmeVJlcXVlc3Qoc3RvcmUuZ2V0KGtleSkpKSkpO1xufVxuLyoqXG4gKiBVcGRhdGUgYSB2YWx1ZS4gVGhpcyBsZXRzIHlvdSBzZWUgdGhlIG9sZCB2YWx1ZSBhbmQgdXBkYXRlIGl0IGFzIGFuIGF0b21pYyBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIHVwZGF0ZXIgQSBjYWxsYmFjayB0aGF0IHRha2VzIHRoZSBvbGQgdmFsdWUgYW5kIHJldHVybnMgYSBuZXcgdmFsdWUuXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlKGtleSwgdXBkYXRlciwgY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBcbiAgICAvLyBOZWVkIHRvIGNyZWF0ZSB0aGUgcHJvbWlzZSBtYW51YWxseS5cbiAgICAvLyBJZiBJIHRyeSB0byBjaGFpbiBwcm9taXNlcywgdGhlIHRyYW5zYWN0aW9uIGNsb3NlcyBpbiBicm93c2Vyc1xuICAgIC8vIHRoYXQgdXNlIGEgcHJvbWlzZSBwb2x5ZmlsbCAoSUUxMC8xMSkuXG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBzdG9yZS5nZXQoa2V5KS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0b3JlLnB1dCh1cGRhdGVyKHRoaXMucmVzdWx0KSwga2V5KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHByb21pc2lmeVJlcXVlc3Qoc3RvcmUudHJhbnNhY3Rpb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KSk7XG59XG4vKipcbiAqIERlbGV0ZSBhIHBhcnRpY3VsYXIga2V5IGZyb20gdGhlIHN0b3JlLlxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBkZWwoa2V5LCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgICAgc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLnRyYW5zYWN0aW9uKTtcbiAgICB9KTtcbn1cbi8qKlxuICogRGVsZXRlIG11bHRpcGxlIGtleXMgYXQgb25jZS5cbiAqXG4gKiBAcGFyYW0ga2V5cyBMaXN0IG9mIGtleXMgdG8gZGVsZXRlLlxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIGRlbE1hbnkoa2V5cywgY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiBzdG9yZS5kZWxldGUoa2V5KSk7XG4gICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLnRyYW5zYWN0aW9uKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ2xlYXIgYWxsIHZhbHVlcyBpbiB0aGUgc3RvcmUuXG4gKlxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIGNsZWFyKGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4ge1xuICAgICAgICBzdG9yZS5jbGVhcigpO1xuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS50cmFuc2FjdGlvbik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBlYWNoQ3Vyc29yKHN0b3JlLCBjYWxsYmFjaykge1xuICAgIHN0b3JlLm9wZW5DdXJzb3IoKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXN1bHQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhbGxiYWNrKHRoaXMucmVzdWx0KTtcbiAgICAgICAgdGhpcy5yZXN1bHQuY29udGludWUoKTtcbiAgICB9O1xuICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLnRyYW5zYWN0aW9uKTtcbn1cbi8qKlxuICogR2V0IGFsbCBrZXlzIGluIHRoZSBzdG9yZS5cbiAqXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24ga2V5cyhjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkb25seScsIChzdG9yZSkgPT4ge1xuICAgICAgICAvLyBGYXN0IHBhdGggZm9yIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpZiAoc3RvcmUuZ2V0QWxsS2V5cykge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUuZ2V0QWxsS2V5cygpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICByZXR1cm4gZWFjaEN1cnNvcihzdG9yZSwgKGN1cnNvcikgPT4gaXRlbXMucHVzaChjdXJzb3Iua2V5KSkudGhlbigoKSA9PiBpdGVtcyk7XG4gICAgfSk7XG59XG4vKipcbiAqIEdldCBhbGwgdmFsdWVzIGluIHRoZSBzdG9yZS5cbiAqXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gdmFsdWVzKGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWRvbmx5JywgKHN0b3JlKSA9PiB7XG4gICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGlmIChzdG9yZS5nZXRBbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLmdldEFsbCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICByZXR1cm4gZWFjaEN1cnNvcihzdG9yZSwgKGN1cnNvcikgPT4gaXRlbXMucHVzaChjdXJzb3IudmFsdWUpKS50aGVuKCgpID0+IGl0ZW1zKTtcbiAgICB9KTtcbn1cbi8qKlxuICogR2V0IGFsbCBlbnRyaWVzIGluIHRoZSBzdG9yZS4gRWFjaCBlbnRyeSBpcyBhbiBhcnJheSBvZiBgW2tleSwgdmFsdWVdYC5cbiAqXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gZW50cmllcyhjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkb25seScsIChzdG9yZSkgPT4ge1xuICAgICAgICAvLyBGYXN0IHBhdGggZm9yIG1vZGVybiBicm93c2Vyc1xuICAgICAgICAvLyAoYWx0aG91Z2gsIGhvcGVmdWxseSB3ZSdsbCBnZXQgYSBzaW1wbGVyIHBhdGggc29tZSBkYXkpXG4gICAgICAgIGlmIChzdG9yZS5nZXRBbGwgJiYgc3RvcmUuZ2V0QWxsS2V5cykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLmdldEFsbEtleXMoKSksXG4gICAgICAgICAgICAgICAgcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS5nZXRBbGwoKSksXG4gICAgICAgICAgICBdKS50aGVuKChba2V5cywgdmFsdWVzXSkgPT4ga2V5cy5tYXAoKGtleSwgaSkgPT4gW2tleSwgdmFsdWVzW2ldXSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZG9ubHknLCAoc3RvcmUpID0+IGVhY2hDdXJzb3Ioc3RvcmUsIChjdXJzb3IpID0+IGl0ZW1zLnB1c2goW2N1cnNvci5rZXksIGN1cnNvci52YWx1ZV0pKS50aGVuKCgpID0+IGl0ZW1zKSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCB7IGNsZWFyLCBjcmVhdGVTdG9yZSwgZGVsLCBkZWxNYW55LCBlbnRyaWVzLCBnZXQsIGdldE1hbnksIGtleXMsIHByb21pc2lmeVJlcXVlc3QsIHNldCwgc2V0TWFueSwgdXBkYXRlLCB2YWx1ZXMgfTtcbiIsIi8vIHNyYy91dGlscy9lbnYudHNcbnZhciBOT1RISU5HID0gU3ltYm9sLmZvcihcImltbWVyLW5vdGhpbmdcIik7XG52YXIgRFJBRlRBQkxFID0gU3ltYm9sLmZvcihcImltbWVyLWRyYWZ0YWJsZVwiKTtcbnZhciBEUkFGVF9TVEFURSA9IFN5bWJvbC5mb3IoXCJpbW1lci1zdGF0ZVwiKTtcblxuLy8gc3JjL3V0aWxzL2Vycm9ycy50c1xudmFyIGVycm9ycyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFtcbiAgLy8gQWxsIGVycm9yIGNvZGVzLCBzdGFydGluZyBieSAwOlxuICBmdW5jdGlvbihwbHVnaW4pIHtcbiAgICByZXR1cm4gYFRoZSBwbHVnaW4gZm9yICcke3BsdWdpbn0nIGhhcyBub3QgYmVlbiBsb2FkZWQgaW50byBJbW1lci4gVG8gZW5hYmxlIHRoZSBwbHVnaW4sIGltcG9ydCBhbmQgY2FsbCBcXGBlbmFibGUke3BsdWdpbn0oKVxcYCB3aGVuIGluaXRpYWxpemluZyB5b3VyIGFwcGxpY2F0aW9uLmA7XG4gIH0sXG4gIGZ1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIGBwcm9kdWNlIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiB0aGluZ3MgdGhhdCBhcmUgZHJhZnRhYmxlOiBwbGFpbiBvYmplY3RzLCBhcnJheXMsIE1hcCwgU2V0IG9yIGNsYXNzZXMgdGhhdCBhcmUgbWFya2VkIHdpdGggJ1tpbW1lcmFibGVdOiB0cnVlJy4gR290ICcke3RoaW5nfSdgO1xuICB9LFxuICBcIlRoaXMgb2JqZWN0IGhhcyBiZWVuIGZyb3plbiBhbmQgc2hvdWxkIG5vdCBiZSBtdXRhdGVkXCIsXG4gIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICByZXR1cm4gXCJDYW5ub3QgdXNlIGEgcHJveHkgdGhhdCBoYXMgYmVlbiByZXZva2VkLiBEaWQgeW91IHBhc3MgYW4gb2JqZWN0IGZyb20gaW5zaWRlIGFuIGltbWVyIGZ1bmN0aW9uIHRvIGFuIGFzeW5jIHByb2Nlc3M/IFwiICsgZGF0YTtcbiAgfSxcbiAgXCJBbiBpbW1lciBwcm9kdWNlciByZXR1cm5lZCBhIG5ldyB2YWx1ZSAqYW5kKiBtb2RpZmllZCBpdHMgZHJhZnQuIEVpdGhlciByZXR1cm4gYSBuZXcgdmFsdWUgKm9yKiBtb2RpZnkgdGhlIGRyYWZ0LlwiLFxuICBcIkltbWVyIGZvcmJpZHMgY2lyY3VsYXIgcmVmZXJlbmNlc1wiLFxuICBcIlRoZSBmaXJzdCBvciBzZWNvbmQgYXJndW1lbnQgdG8gYHByb2R1Y2VgIG11c3QgYmUgYSBmdW5jdGlvblwiLFxuICBcIlRoZSB0aGlyZCBhcmd1bWVudCB0byBgcHJvZHVjZWAgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIHVuZGVmaW5lZFwiLFxuICBcIkZpcnN0IGFyZ3VtZW50IHRvIGBjcmVhdGVEcmFmdGAgbXVzdCBiZSBhIHBsYWluIG9iamVjdCwgYW4gYXJyYXksIG9yIGFuIGltbWVyYWJsZSBvYmplY3RcIixcbiAgXCJGaXJzdCBhcmd1bWVudCB0byBgZmluaXNoRHJhZnRgIG11c3QgYmUgYSBkcmFmdCByZXR1cm5lZCBieSBgY3JlYXRlRHJhZnRgXCIsXG4gIGZ1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIGAnY3VycmVudCcgZXhwZWN0cyBhIGRyYWZ0LCBnb3Q6ICR7dGhpbmd9YDtcbiAgfSxcbiAgXCJPYmplY3QuZGVmaW5lUHJvcGVydHkoKSBjYW5ub3QgYmUgdXNlZCBvbiBhbiBJbW1lciBkcmFmdFwiLFxuICBcIk9iamVjdC5zZXRQcm90b3R5cGVPZigpIGNhbm5vdCBiZSB1c2VkIG9uIGFuIEltbWVyIGRyYWZ0XCIsXG4gIFwiSW1tZXIgb25seSBzdXBwb3J0cyBkZWxldGluZyBhcnJheSBpbmRpY2VzXCIsXG4gIFwiSW1tZXIgb25seSBzdXBwb3J0cyBzZXR0aW5nIGFycmF5IGluZGljZXMgYW5kIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eVwiLFxuICBmdW5jdGlvbih0aGluZykge1xuICAgIHJldHVybiBgJ29yaWdpbmFsJyBleHBlY3RzIGEgZHJhZnQsIGdvdDogJHt0aGluZ31gO1xuICB9XG4gIC8vIE5vdGU6IGlmIG1vcmUgZXJyb3JzIGFyZSBhZGRlZCwgdGhlIGVycm9yT2Zmc2V0IGluIFBhdGNoZXMudHMgc2hvdWxkIGJlIGluY3JlYXNlZFxuICAvLyBTZWUgUGF0Y2hlcy50cyBmb3IgYWRkaXRpb25hbCBlcnJvcnNcbl0gOiBbXTtcbmZ1bmN0aW9uIGRpZShlcnJvciwgLi4uYXJncykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc3QgZSA9IGVycm9yc1tlcnJvcl07XG4gICAgY29uc3QgbXNnID0gdHlwZW9mIGUgPT09IFwiZnVuY3Rpb25cIiA/IGUuYXBwbHkobnVsbCwgYXJncykgOiBlO1xuICAgIHRocm93IG5ldyBFcnJvcihgW0ltbWVyXSAke21zZ31gKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFtJbW1lcl0gbWluaWZpZWQgZXJyb3IgbnI6ICR7ZXJyb3J9LiBGdWxsIGVycm9yIGF0OiBodHRwczovL2JpdC5seS8zY1hFS1dmYFxuICApO1xufVxuXG4vLyBzcmMvdXRpbHMvY29tbW9uLnRzXG52YXIgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5mdW5jdGlvbiBpc0RyYWZ0KHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmICEhdmFsdWVbRFJBRlRfU1RBVEVdO1xufVxuZnVuY3Rpb24gaXNEcmFmdGFibGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHZhbHVlKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSB8fCAhIXZhbHVlW0RSQUZUQUJMRV0gfHwgISF2YWx1ZS5jb25zdHJ1Y3Rvcj8uW0RSQUZUQUJMRV0gfHwgaXNNYXAodmFsdWUpIHx8IGlzU2V0KHZhbHVlKTtcbn1cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci50b1N0cmluZygpO1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBDdG9yID0gT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwocHJvdG8sIFwiY29uc3RydWN0b3JcIikgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIGlmIChDdG9yID09PSBPYmplY3QpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PSBcImZ1bmN0aW9uXCIgJiYgRnVuY3Rpb24udG9TdHJpbmcuY2FsbChDdG9yKSA9PT0gb2JqZWN0Q3RvclN0cmluZztcbn1cbmZ1bmN0aW9uIG9yaWdpbmFsKHZhbHVlKSB7XG4gIGlmICghaXNEcmFmdCh2YWx1ZSkpXG4gICAgZGllKDE1LCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZVtEUkFGVF9TVEFURV0uYmFzZV87XG59XG5mdW5jdGlvbiBlYWNoKG9iaiwgaXRlcikge1xuICBpZiAoZ2V0QXJjaHR5cGUob2JqKSA9PT0gMCAvKiBPYmplY3QgKi8pIHtcbiAgICBSZWZsZWN0Lm93bktleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGl0ZXIoa2V5LCBvYmpba2V5XSwgb2JqKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmouZm9yRWFjaCgoZW50cnksIGluZGV4KSA9PiBpdGVyKGluZGV4LCBlbnRyeSwgb2JqKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEFyY2h0eXBlKHRoaW5nKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpbmdbRFJBRlRfU1RBVEVdO1xuICByZXR1cm4gc3RhdGUgPyBzdGF0ZS50eXBlXyA6IEFycmF5LmlzQXJyYXkodGhpbmcpID8gMSAvKiBBcnJheSAqLyA6IGlzTWFwKHRoaW5nKSA/IDIgLyogTWFwICovIDogaXNTZXQodGhpbmcpID8gMyAvKiBTZXQgKi8gOiAwIC8qIE9iamVjdCAqLztcbn1cbmZ1bmN0aW9uIGhhcyh0aGluZywgcHJvcCkge1xuICByZXR1cm4gZ2V0QXJjaHR5cGUodGhpbmcpID09PSAyIC8qIE1hcCAqLyA/IHRoaW5nLmhhcyhwcm9wKSA6IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGluZywgcHJvcCk7XG59XG5mdW5jdGlvbiBnZXQodGhpbmcsIHByb3ApIHtcbiAgcmV0dXJuIGdldEFyY2h0eXBlKHRoaW5nKSA9PT0gMiAvKiBNYXAgKi8gPyB0aGluZy5nZXQocHJvcCkgOiB0aGluZ1twcm9wXTtcbn1cbmZ1bmN0aW9uIHNldCh0aGluZywgcHJvcE9yT2xkVmFsdWUsIHZhbHVlKSB7XG4gIGNvbnN0IHQgPSBnZXRBcmNodHlwZSh0aGluZyk7XG4gIGlmICh0ID09PSAyIC8qIE1hcCAqLylcbiAgICB0aGluZy5zZXQocHJvcE9yT2xkVmFsdWUsIHZhbHVlKTtcbiAgZWxzZSBpZiAodCA9PT0gMyAvKiBTZXQgKi8pIHtcbiAgICB0aGluZy5hZGQodmFsdWUpO1xuICB9IGVsc2VcbiAgICB0aGluZ1twcm9wT3JPbGRWYWx1ZV0gPSB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgaWYgKHggPT09IHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuZnVuY3Rpb24gaXNNYXAodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBNYXA7XG59XG5mdW5jdGlvbiBpc1NldCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIFNldDtcbn1cbmZ1bmN0aW9uIGxhdGVzdChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuY29weV8gfHwgc3RhdGUuYmFzZV87XG59XG5mdW5jdGlvbiBzaGFsbG93Q29weShiYXNlLCBzdHJpY3QpIHtcbiAgaWYgKGlzTWFwKGJhc2UpKSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoYmFzZSk7XG4gIH1cbiAgaWYgKGlzU2V0KGJhc2UpKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoYmFzZSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYmFzZSkpXG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJhc2UpO1xuICBjb25zdCBpc1BsYWluID0gaXNQbGFpbk9iamVjdChiYXNlKTtcbiAgaWYgKHN0cmljdCA9PT0gdHJ1ZSB8fCBzdHJpY3QgPT09IFwiY2xhc3Nfb25seVwiICYmICFpc1BsYWluKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhiYXNlKTtcbiAgICBkZWxldGUgZGVzY3JpcHRvcnNbRFJBRlRfU1RBVEVdO1xuICAgIGxldCBrZXlzID0gUmVmbGVjdC5vd25LZXlzKGRlc2NyaXB0b3JzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBjb25zdCBkZXNjID0gZGVzY3JpcHRvcnNba2V5XTtcbiAgICAgIGlmIChkZXNjLndyaXRhYmxlID09PSBmYWxzZSkge1xuICAgICAgICBkZXNjLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgZGVzYy5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KVxuICAgICAgICBkZXNjcmlwdG9yc1trZXldID0ge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAvLyBjb3VsZCBsaXZlIHdpdGggISFkZXNjLnNldCBhcyB3ZWxsIGhlcmUuLi5cbiAgICAgICAgICBlbnVtZXJhYmxlOiBkZXNjLmVudW1lcmFibGUsXG4gICAgICAgICAgdmFsdWU6IGJhc2Vba2V5XVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShnZXRQcm90b3R5cGVPZihiYXNlKSwgZGVzY3JpcHRvcnMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YoYmFzZSk7XG4gICAgaWYgKHByb3RvICE9PSBudWxsICYmIGlzUGxhaW4pIHtcbiAgICAgIHJldHVybiB7IC4uLmJhc2UgfTtcbiAgICB9XG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShwcm90byk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24ob2JqLCBiYXNlKTtcbiAgfVxufVxuZnVuY3Rpb24gZnJlZXplKG9iaiwgZGVlcCA9IGZhbHNlKSB7XG4gIGlmIChpc0Zyb3plbihvYmopIHx8IGlzRHJhZnQob2JqKSB8fCAhaXNEcmFmdGFibGUob2JqKSlcbiAgICByZXR1cm4gb2JqO1xuICBpZiAoZ2V0QXJjaHR5cGUob2JqKSA+IDEpIHtcbiAgICBvYmouc2V0ID0gb2JqLmFkZCA9IG9iai5jbGVhciA9IG9iai5kZWxldGUgPSBkb250TXV0YXRlRnJvemVuQ29sbGVjdGlvbnM7XG4gIH1cbiAgT2JqZWN0LmZyZWV6ZShvYmopO1xuICBpZiAoZGVlcClcbiAgICBPYmplY3QuZW50cmllcyhvYmopLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gZnJlZXplKHZhbHVlLCB0cnVlKSk7XG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBkb250TXV0YXRlRnJvemVuQ29sbGVjdGlvbnMoKSB7XG4gIGRpZSgyKTtcbn1cbmZ1bmN0aW9uIGlzRnJvemVuKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmlzRnJvemVuKG9iaik7XG59XG5cbi8vIHNyYy91dGlscy9wbHVnaW5zLnRzXG52YXIgcGx1Z2lucyA9IHt9O1xuZnVuY3Rpb24gZ2V0UGx1Z2luKHBsdWdpbktleSkge1xuICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zW3BsdWdpbktleV07XG4gIGlmICghcGx1Z2luKSB7XG4gICAgZGllKDAsIHBsdWdpbktleSk7XG4gIH1cbiAgcmV0dXJuIHBsdWdpbjtcbn1cbmZ1bmN0aW9uIGxvYWRQbHVnaW4ocGx1Z2luS2V5LCBpbXBsZW1lbnRhdGlvbikge1xuICBpZiAoIXBsdWdpbnNbcGx1Z2luS2V5XSlcbiAgICBwbHVnaW5zW3BsdWdpbktleV0gPSBpbXBsZW1lbnRhdGlvbjtcbn1cblxuLy8gc3JjL2NvcmUvc2NvcGUudHNcbnZhciBjdXJyZW50U2NvcGU7XG5mdW5jdGlvbiBnZXRDdXJyZW50U2NvcGUoKSB7XG4gIHJldHVybiBjdXJyZW50U2NvcGU7XG59XG5mdW5jdGlvbiBjcmVhdGVTY29wZShwYXJlbnRfLCBpbW1lcl8pIHtcbiAgcmV0dXJuIHtcbiAgICBkcmFmdHNfOiBbXSxcbiAgICBwYXJlbnRfLFxuICAgIGltbWVyXyxcbiAgICAvLyBXaGVuZXZlciB0aGUgbW9kaWZpZWQgZHJhZnQgY29udGFpbnMgYSBkcmFmdCBmcm9tIGFub3RoZXIgc2NvcGUsIHdlXG4gICAgLy8gbmVlZCB0byBwcmV2ZW50IGF1dG8tZnJlZXppbmcgc28gdGhlIHVub3duZWQgZHJhZnQgY2FuIGJlIGZpbmFsaXplZC5cbiAgICBjYW5BdXRvRnJlZXplXzogdHJ1ZSxcbiAgICB1bmZpbmFsaXplZERyYWZ0c186IDBcbiAgfTtcbn1cbmZ1bmN0aW9uIHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKSB7XG4gIGlmIChwYXRjaExpc3RlbmVyKSB7XG4gICAgZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKTtcbiAgICBzY29wZS5wYXRjaGVzXyA9IFtdO1xuICAgIHNjb3BlLmludmVyc2VQYXRjaGVzXyA9IFtdO1xuICAgIHNjb3BlLnBhdGNoTGlzdGVuZXJfID0gcGF0Y2hMaXN0ZW5lcjtcbiAgfVxufVxuZnVuY3Rpb24gcmV2b2tlU2NvcGUoc2NvcGUpIHtcbiAgbGVhdmVTY29wZShzY29wZSk7XG4gIHNjb3BlLmRyYWZ0c18uZm9yRWFjaChyZXZva2VEcmFmdCk7XG4gIHNjb3BlLmRyYWZ0c18gPSBudWxsO1xufVxuZnVuY3Rpb24gbGVhdmVTY29wZShzY29wZSkge1xuICBpZiAoc2NvcGUgPT09IGN1cnJlbnRTY29wZSkge1xuICAgIGN1cnJlbnRTY29wZSA9IHNjb3BlLnBhcmVudF87XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGVyU2NvcGUoaW1tZXIyKSB7XG4gIHJldHVybiBjdXJyZW50U2NvcGUgPSBjcmVhdGVTY29wZShjdXJyZW50U2NvcGUsIGltbWVyMik7XG59XG5mdW5jdGlvbiByZXZva2VEcmFmdChkcmFmdCkge1xuICBjb25zdCBzdGF0ZSA9IGRyYWZ0W0RSQUZUX1NUQVRFXTtcbiAgaWYgKHN0YXRlLnR5cGVfID09PSAwIC8qIE9iamVjdCAqLyB8fCBzdGF0ZS50eXBlXyA9PT0gMSAvKiBBcnJheSAqLylcbiAgICBzdGF0ZS5yZXZva2VfKCk7XG4gIGVsc2VcbiAgICBzdGF0ZS5yZXZva2VkXyA9IHRydWU7XG59XG5cbi8vIHNyYy9jb3JlL2ZpbmFsaXplLnRzXG5mdW5jdGlvbiBwcm9jZXNzUmVzdWx0KHJlc3VsdCwgc2NvcGUpIHtcbiAgc2NvcGUudW5maW5hbGl6ZWREcmFmdHNfID0gc2NvcGUuZHJhZnRzXy5sZW5ndGg7XG4gIGNvbnN0IGJhc2VEcmFmdCA9IHNjb3BlLmRyYWZ0c19bMF07XG4gIGNvbnN0IGlzUmVwbGFjZWQgPSByZXN1bHQgIT09IHZvaWQgMCAmJiByZXN1bHQgIT09IGJhc2VEcmFmdDtcbiAgaWYgKGlzUmVwbGFjZWQpIHtcbiAgICBpZiAoYmFzZURyYWZ0W0RSQUZUX1NUQVRFXS5tb2RpZmllZF8pIHtcbiAgICAgIHJldm9rZVNjb3BlKHNjb3BlKTtcbiAgICAgIGRpZSg0KTtcbiAgICB9XG4gICAgaWYgKGlzRHJhZnRhYmxlKHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdCA9IGZpbmFsaXplKHNjb3BlLCByZXN1bHQpO1xuICAgICAgaWYgKCFzY29wZS5wYXJlbnRfKVxuICAgICAgICBtYXliZUZyZWV6ZShzY29wZSwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKHNjb3BlLnBhdGNoZXNfKSB7XG4gICAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyhcbiAgICAgICAgYmFzZURyYWZ0W0RSQUZUX1NUQVRFXS5iYXNlXyxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBzY29wZS5wYXRjaGVzXyxcbiAgICAgICAgc2NvcGUuaW52ZXJzZVBhdGNoZXNfXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBmaW5hbGl6ZShzY29wZSwgYmFzZURyYWZ0LCBbXSk7XG4gIH1cbiAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICBpZiAoc2NvcGUucGF0Y2hlc18pIHtcbiAgICBzY29wZS5wYXRjaExpc3RlbmVyXyhzY29wZS5wYXRjaGVzXywgc2NvcGUuaW52ZXJzZVBhdGNoZXNfKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0ICE9PSBOT1RISU5HID8gcmVzdWx0IDogdm9pZCAwO1xufVxuZnVuY3Rpb24gZmluYWxpemUocm9vdFNjb3BlLCB2YWx1ZSwgcGF0aCkge1xuICBpZiAoaXNGcm96ZW4odmFsdWUpKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgY29uc3Qgc3RhdGUgPSB2YWx1ZVtEUkFGVF9TVEFURV07XG4gIGlmICghc3RhdGUpIHtcbiAgICBlYWNoKFxuICAgICAgdmFsdWUsXG4gICAgICAoa2V5LCBjaGlsZFZhbHVlKSA9PiBmaW5hbGl6ZVByb3BlcnR5KHJvb3RTY29wZSwgc3RhdGUsIHZhbHVlLCBrZXksIGNoaWxkVmFsdWUsIHBhdGgpXG4gICAgKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKHN0YXRlLnNjb3BlXyAhPT0gcm9vdFNjb3BlKVxuICAgIHJldHVybiB2YWx1ZTtcbiAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pIHtcbiAgICBtYXliZUZyZWV6ZShyb290U2NvcGUsIHN0YXRlLmJhc2VfLCB0cnVlKTtcbiAgICByZXR1cm4gc3RhdGUuYmFzZV87XG4gIH1cbiAgaWYgKCFzdGF0ZS5maW5hbGl6ZWRfKSB7XG4gICAgc3RhdGUuZmluYWxpemVkXyA9IHRydWU7XG4gICAgc3RhdGUuc2NvcGVfLnVuZmluYWxpemVkRHJhZnRzXy0tO1xuICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLmNvcHlfO1xuICAgIGxldCByZXN1bHRFYWNoID0gcmVzdWx0O1xuICAgIGxldCBpc1NldDIgPSBmYWxzZTtcbiAgICBpZiAoc3RhdGUudHlwZV8gPT09IDMgLyogU2V0ICovKSB7XG4gICAgICByZXN1bHRFYWNoID0gbmV3IFNldChyZXN1bHQpO1xuICAgICAgcmVzdWx0LmNsZWFyKCk7XG4gICAgICBpc1NldDIgPSB0cnVlO1xuICAgIH1cbiAgICBlYWNoKFxuICAgICAgcmVzdWx0RWFjaCxcbiAgICAgIChrZXksIGNoaWxkVmFsdWUpID0+IGZpbmFsaXplUHJvcGVydHkocm9vdFNjb3BlLCBzdGF0ZSwgcmVzdWx0LCBrZXksIGNoaWxkVmFsdWUsIHBhdGgsIGlzU2V0MilcbiAgICApO1xuICAgIG1heWJlRnJlZXplKHJvb3RTY29wZSwgcmVzdWx0LCBmYWxzZSk7XG4gICAgaWYgKHBhdGggJiYgcm9vdFNjb3BlLnBhdGNoZXNfKSB7XG4gICAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmdlbmVyYXRlUGF0Y2hlc18oXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwYXRoLFxuICAgICAgICByb290U2NvcGUucGF0Y2hlc18sXG4gICAgICAgIHJvb3RTY29wZS5pbnZlcnNlUGF0Y2hlc19cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGF0ZS5jb3B5Xztcbn1cbmZ1bmN0aW9uIGZpbmFsaXplUHJvcGVydHkocm9vdFNjb3BlLCBwYXJlbnRTdGF0ZSwgdGFyZ2V0T2JqZWN0LCBwcm9wLCBjaGlsZFZhbHVlLCByb290UGF0aCwgdGFyZ2V0SXNTZXQpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBjaGlsZFZhbHVlID09PSB0YXJnZXRPYmplY3QpXG4gICAgZGllKDUpO1xuICBpZiAoaXNEcmFmdChjaGlsZFZhbHVlKSkge1xuICAgIGNvbnN0IHBhdGggPSByb290UGF0aCAmJiBwYXJlbnRTdGF0ZSAmJiBwYXJlbnRTdGF0ZS50eXBlXyAhPT0gMyAvKiBTZXQgKi8gJiYgLy8gU2V0IG9iamVjdHMgYXJlIGF0b21pYyBzaW5jZSB0aGV5IGhhdmUgbm8ga2V5cy5cbiAgICAhaGFzKHBhcmVudFN0YXRlLmFzc2lnbmVkXywgcHJvcCkgPyByb290UGF0aC5jb25jYXQocHJvcCkgOiB2b2lkIDA7XG4gICAgY29uc3QgcmVzID0gZmluYWxpemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlLCBwYXRoKTtcbiAgICBzZXQodGFyZ2V0T2JqZWN0LCBwcm9wLCByZXMpO1xuICAgIGlmIChpc0RyYWZ0KHJlcykpIHtcbiAgICAgIHJvb3RTY29wZS5jYW5BdXRvRnJlZXplXyA9IGZhbHNlO1xuICAgIH0gZWxzZVxuICAgICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKHRhcmdldElzU2V0KSB7XG4gICAgdGFyZ2V0T2JqZWN0LmFkZChjaGlsZFZhbHVlKTtcbiAgfVxuICBpZiAoaXNEcmFmdGFibGUoY2hpbGRWYWx1ZSkgJiYgIWlzRnJvemVuKGNoaWxkVmFsdWUpKSB7XG4gICAgaWYgKCFyb290U2NvcGUuaW1tZXJfLmF1dG9GcmVlemVfICYmIHJvb3RTY29wZS51bmZpbmFsaXplZERyYWZ0c18gPCAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpbmFsaXplKHJvb3RTY29wZSwgY2hpbGRWYWx1ZSk7XG4gICAgaWYgKCghcGFyZW50U3RhdGUgfHwgIXBhcmVudFN0YXRlLnNjb3BlXy5wYXJlbnRfKSAmJiB0eXBlb2YgcHJvcCAhPT0gXCJzeW1ib2xcIiAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodGFyZ2V0T2JqZWN0LCBwcm9wKSlcbiAgICAgIG1heWJlRnJlZXplKHJvb3RTY29wZSwgY2hpbGRWYWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG1heWJlRnJlZXplKHNjb3BlLCB2YWx1ZSwgZGVlcCA9IGZhbHNlKSB7XG4gIGlmICghc2NvcGUucGFyZW50XyAmJiBzY29wZS5pbW1lcl8uYXV0b0ZyZWV6ZV8gJiYgc2NvcGUuY2FuQXV0b0ZyZWV6ZV8pIHtcbiAgICBmcmVlemUodmFsdWUsIGRlZXApO1xuICB9XG59XG5cbi8vIHNyYy9jb3JlL3Byb3h5LnRzXG5mdW5jdGlvbiBjcmVhdGVQcm94eVByb3h5KGJhc2UsIHBhcmVudCkge1xuICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShiYXNlKTtcbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgdHlwZV86IGlzQXJyYXkgPyAxIC8qIEFycmF5ICovIDogMCAvKiBPYmplY3QgKi8sXG4gICAgLy8gVHJhY2sgd2hpY2ggcHJvZHVjZSBjYWxsIHRoaXMgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgIHNjb3BlXzogcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpLFxuICAgIC8vIFRydWUgZm9yIGJvdGggc2hhbGxvdyBhbmQgZGVlcCBjaGFuZ2VzLlxuICAgIG1vZGlmaWVkXzogZmFsc2UsXG4gICAgLy8gVXNlZCBkdXJpbmcgZmluYWxpemF0aW9uLlxuICAgIGZpbmFsaXplZF86IGZhbHNlLFxuICAgIC8vIFRyYWNrIHdoaWNoIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGFzc2lnbmVkICh0cnVlKSBvciBkZWxldGVkIChmYWxzZSkuXG4gICAgYXNzaWduZWRfOiB7fSxcbiAgICAvLyBUaGUgcGFyZW50IGRyYWZ0IHN0YXRlLlxuICAgIHBhcmVudF86IHBhcmVudCxcbiAgICAvLyBUaGUgYmFzZSBzdGF0ZS5cbiAgICBiYXNlXzogYmFzZSxcbiAgICAvLyBUaGUgYmFzZSBwcm94eS5cbiAgICBkcmFmdF86IG51bGwsXG4gICAgLy8gc2V0IGJlbG93XG4gICAgLy8gVGhlIGJhc2UgY29weSB3aXRoIGFueSB1cGRhdGVkIHZhbHVlcy5cbiAgICBjb3B5XzogbnVsbCxcbiAgICAvLyBDYWxsZWQgYnkgdGhlIGBwcm9kdWNlYCBmdW5jdGlvbi5cbiAgICByZXZva2VfOiBudWxsLFxuICAgIGlzTWFudWFsXzogZmFsc2VcbiAgfTtcbiAgbGV0IHRhcmdldCA9IHN0YXRlO1xuICBsZXQgdHJhcHMgPSBvYmplY3RUcmFwcztcbiAgaWYgKGlzQXJyYXkpIHtcbiAgICB0YXJnZXQgPSBbc3RhdGVdO1xuICAgIHRyYXBzID0gYXJyYXlUcmFwcztcbiAgfVxuICBjb25zdCB7IHJldm9rZSwgcHJveHkgfSA9IFByb3h5LnJldm9jYWJsZSh0YXJnZXQsIHRyYXBzKTtcbiAgc3RhdGUuZHJhZnRfID0gcHJveHk7XG4gIHN0YXRlLnJldm9rZV8gPSByZXZva2U7XG4gIHJldHVybiBwcm94eTtcbn1cbnZhciBvYmplY3RUcmFwcyA9IHtcbiAgZ2V0KHN0YXRlLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgPT09IERSQUZUX1NUQVRFKVxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIGNvbnN0IHNvdXJjZSA9IGxhdGVzdChzdGF0ZSk7XG4gICAgaWYgKCFoYXMoc291cmNlLCBwcm9wKSkge1xuICAgICAgcmV0dXJuIHJlYWRQcm9wRnJvbVByb3RvKHN0YXRlLCBzb3VyY2UsIHByb3ApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtwcm9wXTtcbiAgICBpZiAoc3RhdGUuZmluYWxpemVkXyB8fCAhaXNEcmFmdGFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gcGVlayhzdGF0ZS5iYXNlXywgcHJvcCkpIHtcbiAgICAgIHByZXBhcmVDb3B5KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5X1twcm9wXSA9IGNyZWF0ZVByb3h5KHZhbHVlLCBzdGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgaGFzKHN0YXRlLCBwcm9wKSB7XG4gICAgcmV0dXJuIHByb3AgaW4gbGF0ZXN0KHN0YXRlKTtcbiAgfSxcbiAgb3duS2V5cyhzdGF0ZSkge1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMobGF0ZXN0KHN0YXRlKSk7XG4gIH0sXG4gIHNldChzdGF0ZSwgcHJvcCwgdmFsdWUpIHtcbiAgICBjb25zdCBkZXNjID0gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhsYXRlc3Qoc3RhdGUpLCBwcm9wKTtcbiAgICBpZiAoZGVzYz8uc2V0KSB7XG4gICAgICBkZXNjLnNldC5jYWxsKHN0YXRlLmRyYWZ0XywgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgICBjb25zdCBjdXJyZW50MiA9IHBlZWsobGF0ZXN0KHN0YXRlKSwgcHJvcCk7XG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBjdXJyZW50Mj8uW0RSQUZUX1NUQVRFXTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUgJiYgY3VycmVudFN0YXRlLmJhc2VfID09PSB2YWx1ZSkge1xuICAgICAgICBzdGF0ZS5jb3B5X1twcm9wXSA9IHZhbHVlO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXModmFsdWUsIGN1cnJlbnQyKSAmJiAodmFsdWUgIT09IHZvaWQgMCB8fCBoYXMoc3RhdGUuYmFzZV8sIHByb3ApKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBwcmVwYXJlQ29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3B5X1twcm9wXSA9PT0gdmFsdWUgJiYgLy8gc3BlY2lhbCBjYXNlOiBoYW5kbGUgbmV3IHByb3BzIHdpdGggdmFsdWUgJ3VuZGVmaW5lZCdcbiAgICAodmFsdWUgIT09IHZvaWQgMCB8fCBwcm9wIGluIHN0YXRlLmNvcHlfKSB8fCAvLyBzcGVjaWFsIGNhc2U6IE5hTlxuICAgIE51bWJlci5pc05hTih2YWx1ZSkgJiYgTnVtYmVyLmlzTmFOKHN0YXRlLmNvcHlfW3Byb3BdKSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHN0YXRlLmNvcHlfW3Byb3BdID0gdmFsdWU7XG4gICAgc3RhdGUuYXNzaWduZWRfW3Byb3BdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgZGVsZXRlUHJvcGVydHkoc3RhdGUsIHByb3ApIHtcbiAgICBpZiAocGVlayhzdGF0ZS5iYXNlXywgcHJvcCkgIT09IHZvaWQgMCB8fCBwcm9wIGluIHN0YXRlLmJhc2VfKSB7XG4gICAgICBzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSBmYWxzZTtcbiAgICAgIHByZXBhcmVDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHN0YXRlLmFzc2lnbmVkX1twcm9wXTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcHlfKSB7XG4gICAgICBkZWxldGUgc3RhdGUuY29weV9bcHJvcF07XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvLyBOb3RlOiBXZSBuZXZlciBjb2VyY2UgYGRlc2MudmFsdWVgIGludG8gYW4gSW1tZXIgZHJhZnQsIGJlY2F1c2Ugd2UgY2FuJ3QgbWFrZVxuICAvLyB0aGUgc2FtZSBndWFyYW50ZWUgaW4gRVM1IG1vZGUuXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdGF0ZSwgcHJvcCkge1xuICAgIGNvbnN0IG93bmVyID0gbGF0ZXN0KHN0YXRlKTtcbiAgICBjb25zdCBkZXNjID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob3duZXIsIHByb3ApO1xuICAgIGlmICghZGVzYylcbiAgICAgIHJldHVybiBkZXNjO1xuICAgIHJldHVybiB7XG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogc3RhdGUudHlwZV8gIT09IDEgLyogQXJyYXkgKi8gfHwgcHJvcCAhPT0gXCJsZW5ndGhcIixcbiAgICAgIGVudW1lcmFibGU6IGRlc2MuZW51bWVyYWJsZSxcbiAgICAgIHZhbHVlOiBvd25lcltwcm9wXVxuICAgIH07XG4gIH0sXG4gIGRlZmluZVByb3BlcnR5KCkge1xuICAgIGRpZSgxMSk7XG4gIH0sXG4gIGdldFByb3RvdHlwZU9mKHN0YXRlKSB7XG4gICAgcmV0dXJuIGdldFByb3RvdHlwZU9mKHN0YXRlLmJhc2VfKTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoKSB7XG4gICAgZGllKDEyKTtcbiAgfVxufTtcbnZhciBhcnJheVRyYXBzID0ge307XG5lYWNoKG9iamVjdFRyYXBzLCAoa2V5LCBmbikgPT4ge1xuICBhcnJheVRyYXBzW2tleV0gPSBmdW5jdGlvbigpIHtcbiAgICBhcmd1bWVudHNbMF0gPSBhcmd1bWVudHNbMF1bMF07XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59KTtcbmFycmF5VHJhcHMuZGVsZXRlUHJvcGVydHkgPSBmdW5jdGlvbihzdGF0ZSwgcHJvcCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGlzTmFOKHBhcnNlSW50KHByb3ApKSlcbiAgICBkaWUoMTMpO1xuICByZXR1cm4gYXJyYXlUcmFwcy5zZXQuY2FsbCh0aGlzLCBzdGF0ZSwgcHJvcCwgdm9pZCAwKTtcbn07XG5hcnJheVRyYXBzLnNldCA9IGZ1bmN0aW9uKHN0YXRlLCBwcm9wLCB2YWx1ZSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIHByb3AgIT09IFwibGVuZ3RoXCIgJiYgaXNOYU4ocGFyc2VJbnQocHJvcCkpKVxuICAgIGRpZSgxNCk7XG4gIHJldHVybiBvYmplY3RUcmFwcy5zZXQuY2FsbCh0aGlzLCBzdGF0ZVswXSwgcHJvcCwgdmFsdWUsIHN0YXRlWzBdKTtcbn07XG5mdW5jdGlvbiBwZWVrKGRyYWZ0LCBwcm9wKSB7XG4gIGNvbnN0IHN0YXRlID0gZHJhZnRbRFJBRlRfU1RBVEVdO1xuICBjb25zdCBzb3VyY2UgPSBzdGF0ZSA/IGxhdGVzdChzdGF0ZSkgOiBkcmFmdDtcbiAgcmV0dXJuIHNvdXJjZVtwcm9wXTtcbn1cbmZ1bmN0aW9uIHJlYWRQcm9wRnJvbVByb3RvKHN0YXRlLCBzb3VyY2UsIHByb3ApIHtcbiAgY29uc3QgZGVzYyA9IGdldERlc2NyaXB0b3JGcm9tUHJvdG8oc291cmNlLCBwcm9wKTtcbiAgcmV0dXJuIGRlc2MgPyBgdmFsdWVgIGluIGRlc2MgPyBkZXNjLnZhbHVlIDogKFxuICAgIC8vIFRoaXMgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZSwgaWYgdGhlIHByb3AgaXMgYSBnZXR0ZXIgZGVmaW5lZCBieSB0aGVcbiAgICAvLyBwcm90b3R5cGUsIHdlIHNob3VsZCBpbnZva2UgaXQgd2l0aCB0aGUgZHJhZnQgYXMgY29udGV4dCFcbiAgICBkZXNjLmdldD8uY2FsbChzdGF0ZS5kcmFmdF8pXG4gICkgOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBnZXREZXNjcmlwdG9yRnJvbVByb3RvKHNvdXJjZSwgcHJvcCkge1xuICBpZiAoIShwcm9wIGluIHNvdXJjZSkpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgbGV0IHByb3RvID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlKTtcbiAgd2hpbGUgKHByb3RvKSB7XG4gICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIHByb3ApO1xuICAgIGlmIChkZXNjKVxuICAgICAgcmV0dXJuIGRlc2M7XG4gICAgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIHZvaWQgMDtcbn1cbmZ1bmN0aW9uIG1hcmtDaGFuZ2VkKHN0YXRlKSB7XG4gIGlmICghc3RhdGUubW9kaWZpZWRfKSB7XG4gICAgc3RhdGUubW9kaWZpZWRfID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUucGFyZW50Xykge1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUucGFyZW50Xyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlQ29weShzdGF0ZSkge1xuICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgc3RhdGUuY29weV8gPSBzaGFsbG93Q29weShcbiAgICAgIHN0YXRlLmJhc2VfLFxuICAgICAgc3RhdGUuc2NvcGVfLmltbWVyXy51c2VTdHJpY3RTaGFsbG93Q29weV9cbiAgICApO1xuICB9XG59XG5cbi8vIHNyYy9jb3JlL2ltbWVyQ2xhc3MudHNcbnZhciBJbW1lcjIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHRoaXMuYXV0b0ZyZWV6ZV8gPSB0cnVlO1xuICAgIHRoaXMudXNlU3RyaWN0U2hhbGxvd0NvcHlfID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGBwcm9kdWNlYCBmdW5jdGlvbiB0YWtlcyBhIHZhbHVlIGFuZCBhIFwicmVjaXBlIGZ1bmN0aW9uXCIgKHdob3NlXG4gICAgICogcmV0dXJuIHZhbHVlIG9mdGVuIGRlcGVuZHMgb24gdGhlIGJhc2Ugc3RhdGUpLiBUaGUgcmVjaXBlIGZ1bmN0aW9uIGlzXG4gICAgICogZnJlZSB0byBtdXRhdGUgaXRzIGZpcnN0IGFyZ3VtZW50IGhvd2V2ZXIgaXQgd2FudHMuIEFsbCBtdXRhdGlvbnMgYXJlXG4gICAgICogb25seSBldmVyIGFwcGxpZWQgdG8gYSBfX2NvcHlfXyBvZiB0aGUgYmFzZSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIFBhc3Mgb25seSBhIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFwiY3VycmllZCBwcm9kdWNlclwiIHdoaWNoIHJlbGlldmVzIHlvdVxuICAgICAqIGZyb20gcGFzc2luZyB0aGUgcmVjaXBlIGZ1bmN0aW9uIGV2ZXJ5IHRpbWUuXG4gICAgICpcbiAgICAgKiBPbmx5IHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyBhcmUgbWFkZSBtdXRhYmxlLiBBbGwgb3RoZXIgb2JqZWN0cyBhcmVcbiAgICAgKiBjb25zaWRlcmVkIHVuY29weWFibGUuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIF9fYm91bmRfXyB0byBpdHMgYEltbWVyYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7YW55fSBiYXNlIC0gdGhlIGluaXRpYWwgc3RhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWNpcGUgLSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGEgcHJveHkgb2YgdGhlIGJhc2Ugc3RhdGUgYXMgZmlyc3QgYXJndW1lbnQgYW5kIHdoaWNoIGNhbiBiZSBmcmVlbHkgbW9kaWZpZWRcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXRjaExpc3RlbmVyIC0gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFsbCB0aGUgcGF0Y2hlcyBwcm9kdWNlZCBoZXJlXG4gICAgICogQHJldHVybnMge2FueX0gYSBuZXcgc3RhdGUsIG9yIHRoZSBpbml0aWFsIHN0YXRlIGlmIG5vdGhpbmcgd2FzIG1vZGlmaWVkXG4gICAgICovXG4gICAgdGhpcy5wcm9kdWNlID0gKGJhc2UsIHJlY2lwZSwgcGF0Y2hMaXN0ZW5lcikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBiYXNlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHJlY2lwZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRCYXNlID0gcmVjaXBlO1xuICAgICAgICByZWNpcGUgPSBiYXNlO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGN1cnJpZWRQcm9kdWNlKGJhc2UyID0gZGVmYXVsdEJhc2UsIC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5wcm9kdWNlKGJhc2UyLCAoZHJhZnQpID0+IHJlY2lwZS5jYWxsKHRoaXMsIGRyYWZ0LCAuLi5hcmdzKSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJlY2lwZSAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBkaWUoNik7XG4gICAgICBpZiAocGF0Y2hMaXN0ZW5lciAhPT0gdm9pZCAwICYmIHR5cGVvZiBwYXRjaExpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGRpZSg3KTtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICBpZiAoaXNEcmFmdGFibGUoYmFzZSkpIHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBlbnRlclNjb3BlKHRoaXMpO1xuICAgICAgICBjb25zdCBwcm94eSA9IGNyZWF0ZVByb3h5KGJhc2UsIHZvaWQgMCk7XG4gICAgICAgIGxldCBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVjaXBlKHByb3h5KTtcbiAgICAgICAgICBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChoYXNFcnJvcilcbiAgICAgICAgICAgIHJldm9rZVNjb3BlKHNjb3BlKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZWF2ZVNjb3BlKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICB1c2VQYXRjaGVzSW5TY29wZShzY29wZSwgcGF0Y2hMaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBwcm9jZXNzUmVzdWx0KHJlc3VsdCwgc2NvcGUpO1xuICAgICAgfSBlbHNlIGlmICghYmFzZSB8fCB0eXBlb2YgYmFzZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXN1bHQgPSByZWNpcGUoYmFzZSk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMClcbiAgICAgICAgICByZXN1bHQgPSBiYXNlO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBOT1RISU5HKVxuICAgICAgICAgIHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0ZyZWV6ZV8pXG4gICAgICAgICAgZnJlZXplKHJlc3VsdCwgdHJ1ZSk7XG4gICAgICAgIGlmIChwYXRjaExpc3RlbmVyKSB7XG4gICAgICAgICAgY29uc3QgcCA9IFtdO1xuICAgICAgICAgIGNvbnN0IGlwID0gW107XG4gICAgICAgICAgZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5nZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc18oYmFzZSwgcmVzdWx0LCBwLCBpcCk7XG4gICAgICAgICAgcGF0Y2hMaXN0ZW5lcihwLCBpcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gZWxzZVxuICAgICAgICBkaWUoMSwgYmFzZSk7XG4gICAgfTtcbiAgICB0aGlzLnByb2R1Y2VXaXRoUGF0Y2hlcyA9IChiYXNlLCByZWNpcGUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgYmFzZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiAoc3RhdGUsIC4uLmFyZ3MpID0+IHRoaXMucHJvZHVjZVdpdGhQYXRjaGVzKHN0YXRlLCAoZHJhZnQpID0+IGJhc2UoZHJhZnQsIC4uLmFyZ3MpKTtcbiAgICAgIH1cbiAgICAgIGxldCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucHJvZHVjZShiYXNlLCByZWNpcGUsIChwLCBpcCkgPT4ge1xuICAgICAgICBwYXRjaGVzID0gcDtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMgPSBpcDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtyZXN1bHQsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzXTtcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgY29uZmlnPy5hdXRvRnJlZXplID09PSBcImJvb2xlYW5cIilcbiAgICAgIHRoaXMuc2V0QXV0b0ZyZWV6ZShjb25maWcuYXV0b0ZyZWV6ZSk7XG4gICAgaWYgKHR5cGVvZiBjb25maWc/LnVzZVN0cmljdFNoYWxsb3dDb3B5ID09PSBcImJvb2xlYW5cIilcbiAgICAgIHRoaXMuc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkoY29uZmlnLnVzZVN0cmljdFNoYWxsb3dDb3B5KTtcbiAgfVxuICBjcmVhdGVEcmFmdChiYXNlKSB7XG4gICAgaWYgKCFpc0RyYWZ0YWJsZShiYXNlKSlcbiAgICAgIGRpZSg4KTtcbiAgICBpZiAoaXNEcmFmdChiYXNlKSlcbiAgICAgIGJhc2UgPSBjdXJyZW50KGJhc2UpO1xuICAgIGNvbnN0IHNjb3BlID0gZW50ZXJTY29wZSh0aGlzKTtcbiAgICBjb25zdCBwcm94eSA9IGNyZWF0ZVByb3h5KGJhc2UsIHZvaWQgMCk7XG4gICAgcHJveHlbRFJBRlRfU1RBVEVdLmlzTWFudWFsXyA9IHRydWU7XG4gICAgbGVhdmVTY29wZShzY29wZSk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG4gIGZpbmlzaERyYWZ0KGRyYWZ0LCBwYXRjaExpc3RlbmVyKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBkcmFmdCAmJiBkcmFmdFtEUkFGVF9TVEFURV07XG4gICAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuaXNNYW51YWxfKVxuICAgICAgZGllKDkpO1xuICAgIGNvbnN0IHsgc2NvcGVfOiBzY29wZSB9ID0gc3RhdGU7XG4gICAgdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpO1xuICAgIHJldHVybiBwcm9jZXNzUmVzdWx0KHZvaWQgMCwgc2NvcGUpO1xuICB9XG4gIC8qKlxuICAgKiBQYXNzIHRydWUgdG8gYXV0b21hdGljYWxseSBmcmVlemUgYWxsIGNvcGllcyBjcmVhdGVkIGJ5IEltbWVyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhdXRvLWZyZWV6aW5nIGlzIGVuYWJsZWQuXG4gICAqL1xuICBzZXRBdXRvRnJlZXplKHZhbHVlKSB7XG4gICAgdGhpcy5hdXRvRnJlZXplXyA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBQYXNzIHRydWUgdG8gZW5hYmxlIHN0cmljdCBzaGFsbG93IGNvcHkuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGltbWVyIGRvZXMgbm90IGNvcHkgdGhlIG9iamVjdCBkZXNjcmlwdG9ycyBzdWNoIGFzIGdldHRlciwgc2V0dGVyIGFuZCBub24tZW51bXJhYmxlIHByb3BlcnRpZXMuXG4gICAqL1xuICBzZXRVc2VTdHJpY3RTaGFsbG93Q29weSh2YWx1ZSkge1xuICAgIHRoaXMudXNlU3RyaWN0U2hhbGxvd0NvcHlfID0gdmFsdWU7XG4gIH1cbiAgYXBwbHlQYXRjaGVzKGJhc2UsIHBhdGNoZXMpIHtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSBwYXRjaGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBwYXRjaCA9IHBhdGNoZXNbaV07XG4gICAgICBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDAgJiYgcGF0Y2gub3AgPT09IFwicmVwbGFjZVwiKSB7XG4gICAgICAgIGJhc2UgPSBwYXRjaC52YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpID4gLTEpIHtcbiAgICAgIHBhdGNoZXMgPSBwYXRjaGVzLnNsaWNlKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3QgYXBwbHlQYXRjaGVzSW1wbCA9IGdldFBsdWdpbihcIlBhdGNoZXNcIikuYXBwbHlQYXRjaGVzXztcbiAgICBpZiAoaXNEcmFmdChiYXNlKSkge1xuICAgICAgcmV0dXJuIGFwcGx5UGF0Y2hlc0ltcGwoYmFzZSwgcGF0Y2hlcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByb2R1Y2UoXG4gICAgICBiYXNlLFxuICAgICAgKGRyYWZ0KSA9PiBhcHBseVBhdGNoZXNJbXBsKGRyYWZ0LCBwYXRjaGVzKVxuICAgICk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVQcm94eSh2YWx1ZSwgcGFyZW50KSB7XG4gIGNvbnN0IGRyYWZ0ID0gaXNNYXAodmFsdWUpID8gZ2V0UGx1Z2luKFwiTWFwU2V0XCIpLnByb3h5TWFwXyh2YWx1ZSwgcGFyZW50KSA6IGlzU2V0KHZhbHVlKSA/IGdldFBsdWdpbihcIk1hcFNldFwiKS5wcm94eVNldF8odmFsdWUsIHBhcmVudCkgOiBjcmVhdGVQcm94eVByb3h5KHZhbHVlLCBwYXJlbnQpO1xuICBjb25zdCBzY29wZSA9IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKTtcbiAgc2NvcGUuZHJhZnRzXy5wdXNoKGRyYWZ0KTtcbiAgcmV0dXJuIGRyYWZ0O1xufVxuXG4vLyBzcmMvY29yZS9jdXJyZW50LnRzXG5mdW5jdGlvbiBjdXJyZW50KHZhbHVlKSB7XG4gIGlmICghaXNEcmFmdCh2YWx1ZSkpXG4gICAgZGllKDEwLCB2YWx1ZSk7XG4gIHJldHVybiBjdXJyZW50SW1wbCh2YWx1ZSk7XG59XG5mdW5jdGlvbiBjdXJyZW50SW1wbCh2YWx1ZSkge1xuICBpZiAoIWlzRHJhZnRhYmxlKHZhbHVlKSB8fCBpc0Zyb3plbih2YWx1ZSkpXG4gICAgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBzdGF0ZSA9IHZhbHVlW0RSQUZUX1NUQVRFXTtcbiAgbGV0IGNvcHk7XG4gIGlmIChzdGF0ZSkge1xuICAgIGlmICghc3RhdGUubW9kaWZpZWRfKVxuICAgICAgcmV0dXJuIHN0YXRlLmJhc2VfO1xuICAgIHN0YXRlLmZpbmFsaXplZF8gPSB0cnVlO1xuICAgIGNvcHkgPSBzaGFsbG93Q29weSh2YWx1ZSwgc3RhdGUuc2NvcGVfLmltbWVyXy51c2VTdHJpY3RTaGFsbG93Q29weV8pO1xuICB9IGVsc2Uge1xuICAgIGNvcHkgPSBzaGFsbG93Q29weSh2YWx1ZSwgdHJ1ZSk7XG4gIH1cbiAgZWFjaChjb3B5LCAoa2V5LCBjaGlsZFZhbHVlKSA9PiB7XG4gICAgc2V0KGNvcHksIGtleSwgY3VycmVudEltcGwoY2hpbGRWYWx1ZSkpO1xuICB9KTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgc3RhdGUuZmluYWxpemVkXyA9IGZhbHNlO1xuICB9XG4gIHJldHVybiBjb3B5O1xufVxuXG4vLyBzcmMvcGx1Z2lucy9wYXRjaGVzLnRzXG5mdW5jdGlvbiBlbmFibGVQYXRjaGVzKCkge1xuICBjb25zdCBlcnJvck9mZnNldCA9IDE2O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgZXJyb3JzLnB1c2goXG4gICAgICAnU2V0cyBjYW5ub3QgaGF2ZSBcInJlcGxhY2VcIiBwYXRjaGVzLicsXG4gICAgICBmdW5jdGlvbihvcCkge1xuICAgICAgICByZXR1cm4gXCJVbnN1cHBvcnRlZCBwYXRjaCBvcGVyYXRpb246IFwiICsgb3A7XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gXCJDYW5ub3QgYXBwbHkgcGF0Y2gsIHBhdGggZG9lc24ndCByZXNvbHZlOiBcIiArIHBhdGg7XG4gICAgICB9LFxuICAgICAgXCJQYXRjaGluZyByZXNlcnZlZCBhdHRyaWJ1dGVzIGxpa2UgX19wcm90b19fLCBwcm90b3R5cGUgYW5kIGNvbnN0cnVjdG9yIGlzIG5vdCBhbGxvd2VkXCJcbiAgICApO1xuICB9XG4gIGNvbnN0IFJFUExBQ0UgPSBcInJlcGxhY2VcIjtcbiAgY29uc3QgQUREID0gXCJhZGRcIjtcbiAgY29uc3QgUkVNT1ZFID0gXCJyZW1vdmVcIjtcbiAgZnVuY3Rpb24gZ2VuZXJhdGVQYXRjaGVzXyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgc3dpdGNoIChzdGF0ZS50eXBlXykge1xuICAgICAgY2FzZSAwIC8qIE9iamVjdCAqLzpcbiAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZVBhdGNoZXNGcm9tQXNzaWduZWQoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgYmFzZVBhdGgsXG4gICAgICAgICAgcGF0Y2hlcyxcbiAgICAgICAgICBpbnZlcnNlUGF0Y2hlc1xuICAgICAgICApO1xuICAgICAgY2FzZSAxIC8qIEFycmF5ICovOlxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVBcnJheVBhdGNoZXMoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcyk7XG4gICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVTZXRQYXRjaGVzKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGJhc2VQYXRoLFxuICAgICAgICAgIHBhdGNoZXMsXG4gICAgICAgICAgaW52ZXJzZVBhdGNoZXNcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVBcnJheVBhdGNoZXMoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIGxldCB7IGJhc2VfLCBhc3NpZ25lZF8gfSA9IHN0YXRlO1xuICAgIGxldCBjb3B5XyA9IHN0YXRlLmNvcHlfO1xuICAgIGlmIChjb3B5Xy5sZW5ndGggPCBiYXNlXy5sZW5ndGgpIHtcbiAgICAgIDtcbiAgICAgIFtiYXNlXywgY29weV9dID0gW2NvcHlfLCBiYXNlX107XG4gICAgICBbcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXNdID0gW2ludmVyc2VQYXRjaGVzLCBwYXRjaGVzXTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXNlXy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFzc2lnbmVkX1tpXSAmJiBjb3B5X1tpXSAhPT0gYmFzZV9baV0pIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgLy8gTmVlZCB0byBtYXliZSBjbG9uZSBpdCwgYXMgaXQgY2FuIGluIGZhY3QgYmUgdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgICAgICAgLy8gZHVlIHRvIHRoZSBiYXNlL2NvcHkgaW52ZXJzaW9uIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgICAgICAgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKGNvcHlfW2ldKVxuICAgICAgICB9KTtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoYmFzZV9baV0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gYmFzZV8ubGVuZ3RoOyBpIDwgY29weV8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgIG9wOiBBREQsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIC8vIE5lZWQgdG8gbWF5YmUgY2xvbmUgaXQsIGFzIGl0IGNhbiBpbiBmYWN0IGJlIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICAvLyBkdWUgdG8gdGhlIGJhc2UvY29weSBpbnZlcnNpb24gYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKGNvcHlfW2ldKVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBjb3B5Xy5sZW5ndGggLSAxOyBiYXNlXy5sZW5ndGggPD0gaTsgLS1pKSB7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgb3A6IFJFTU9WRSxcbiAgICAgICAgcGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlUGF0Y2hlc0Zyb21Bc3NpZ25lZChzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgY29uc3QgeyBiYXNlXywgY29weV8gfSA9IHN0YXRlO1xuICAgIGVhY2goc3RhdGUuYXNzaWduZWRfLCAoa2V5LCBhc3NpZ25lZFZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcmlnVmFsdWUgPSBnZXQoYmFzZV8sIGtleSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdldChjb3B5Xywga2V5KTtcbiAgICAgIGNvbnN0IG9wID0gIWFzc2lnbmVkVmFsdWUgPyBSRU1PVkUgOiBoYXMoYmFzZV8sIGtleSkgPyBSRVBMQUNFIDogQUREO1xuICAgICAgaWYgKG9yaWdWYWx1ZSA9PT0gdmFsdWUgJiYgb3AgPT09IFJFUExBQ0UpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoa2V5KTtcbiAgICAgIHBhdGNoZXMucHVzaChvcCA9PT0gUkVNT1ZFID8geyBvcCwgcGF0aCB9IDogeyBvcCwgcGF0aCwgdmFsdWUgfSk7XG4gICAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKFxuICAgICAgICBvcCA9PT0gQUREID8geyBvcDogUkVNT1ZFLCBwYXRoIH0gOiBvcCA9PT0gUkVNT1ZFID8geyBvcDogQURELCBwYXRoLCB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob3JpZ1ZhbHVlKSB9IDogeyBvcDogUkVQTEFDRSwgcGF0aCwgdmFsdWU6IGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKG9yaWdWYWx1ZSkgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZVNldFBhdGNoZXMoc3RhdGUsIGJhc2VQYXRoLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIGxldCB7IGJhc2VfLCBjb3B5XyB9ID0gc3RhdGU7XG4gICAgbGV0IGkgPSAwO1xuICAgIGJhc2VfLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWNvcHlfLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBSRU1PVkUsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMudW5zaGlmdCh7XG4gICAgICAgICAgb3A6IEFERCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH0pO1xuICAgIGkgPSAwO1xuICAgIGNvcHlfLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWJhc2VfLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgIG9wOiBBREQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaW52ZXJzZVBhdGNoZXMudW5zaGlmdCh7XG4gICAgICAgICAgb3A6IFJFTU9WRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyhiYXNlVmFsdWUsIHJlcGxhY2VtZW50LCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlcykge1xuICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogUkVQTEFDRSxcbiAgICAgIHBhdGg6IFtdLFxuICAgICAgdmFsdWU6IHJlcGxhY2VtZW50ID09PSBOT1RISU5HID8gdm9pZCAwIDogcmVwbGFjZW1lbnRcbiAgICB9KTtcbiAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgcGF0aDogW10sXG4gICAgICB2YWx1ZTogYmFzZVZhbHVlXG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gYXBwbHlQYXRjaGVzXyhkcmFmdCwgcGF0Y2hlcykge1xuICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcbiAgICAgIGNvbnN0IHsgcGF0aCwgb3AgfSA9IHBhdGNoO1xuICAgICAgbGV0IGJhc2UgPSBkcmFmdDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFyZW50VHlwZSA9IGdldEFyY2h0eXBlKGJhc2UpO1xuICAgICAgICBsZXQgcCA9IHBhdGhbaV07XG4gICAgICAgIGlmICh0eXBlb2YgcCAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgcCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHAgPSBcIlwiICsgcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHBhcmVudFR5cGUgPT09IDAgLyogT2JqZWN0ICovIHx8IHBhcmVudFR5cGUgPT09IDEgLyogQXJyYXkgKi8pICYmIChwID09PSBcIl9fcHJvdG9fX1wiIHx8IHAgPT09IFwiY29uc3RydWN0b3JcIikpXG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMyk7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZSA9PT0gXCJmdW5jdGlvblwiICYmIHAgPT09IFwicHJvdG90eXBlXCIpXG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMyk7XG4gICAgICAgIGJhc2UgPSBnZXQoYmFzZSwgcCk7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZSAhPT0gXCJvYmplY3RcIilcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAyLCBwYXRoLmpvaW4oXCIvXCIpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRBcmNodHlwZShiYXNlKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGVlcENsb25lUGF0Y2hWYWx1ZShwYXRjaC52YWx1ZSk7XG4gICAgICBjb25zdCBrZXkgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICAgIGNhc2UgUkVQTEFDRTpcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgICAgICAgIGRpZShlcnJvck9mZnNldCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIEFERDpcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMSAvKiBBcnJheSAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGtleSA9PT0gXCItXCIgPyBiYXNlLnB1c2godmFsdWUpIDogYmFzZS5zcGxpY2Uoa2V5LCAwLCB2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5hZGQodmFsdWUpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Vba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBSRU1PVkU6XG4gICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDEgLyogQXJyYXkgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLnNwbGljZShrZXksIDEpO1xuICAgICAgICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBjYXNlIDMgLyogU2V0ICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5kZWxldGUocGF0Y2gudmFsdWUpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZSBiYXNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDEsIG9wKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZHJhZnQ7XG4gIH1cbiAgZnVuY3Rpb24gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmopIHtcbiAgICBpZiAoIWlzRHJhZnRhYmxlKG9iaikpXG4gICAgICByZXR1cm4gb2JqO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpXG4gICAgICByZXR1cm4gb2JqLm1hcChkZWVwQ2xvbmVQYXRjaFZhbHVlKTtcbiAgICBpZiAoaXNNYXAob2JqKSlcbiAgICAgIHJldHVybiBuZXcgTWFwKFxuICAgICAgICBBcnJheS5mcm9tKG9iai5lbnRyaWVzKCkpLm1hcCgoW2ssIHZdKSA9PiBbaywgZGVlcENsb25lUGF0Y2hWYWx1ZSh2KV0pXG4gICAgICApO1xuICAgIGlmIChpc1NldChvYmopKVxuICAgICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuZnJvbShvYmopLm1hcChkZWVwQ2xvbmVQYXRjaFZhbHVlKSk7XG4gICAgY29uc3QgY2xvbmVkID0gT2JqZWN0LmNyZWF0ZShnZXRQcm90b3R5cGVPZihvYmopKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopXG4gICAgICBjbG9uZWRba2V5XSA9IGRlZXBDbG9uZVBhdGNoVmFsdWUob2JqW2tleV0pO1xuICAgIGlmIChoYXMob2JqLCBEUkFGVEFCTEUpKVxuICAgICAgY2xvbmVkW0RSQUZUQUJMRV0gPSBvYmpbRFJBRlRBQkxFXTtcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG4gIGZ1bmN0aW9uIGNsb25lUGF0Y2hWYWx1ZUlmTmVlZGVkKG9iaikge1xuICAgIGlmIChpc0RyYWZ0KG9iaikpIHtcbiAgICAgIHJldHVybiBkZWVwQ2xvbmVQYXRjaFZhbHVlKG9iaik7XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm4gb2JqO1xuICB9XG4gIGxvYWRQbHVnaW4oXCJQYXRjaGVzXCIsIHtcbiAgICBhcHBseVBhdGNoZXNfLFxuICAgIGdlbmVyYXRlUGF0Y2hlc18sXG4gICAgZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfXG4gIH0pO1xufVxuXG4vLyBzcmMvcGx1Z2lucy9tYXBzZXQudHNcbmZ1bmN0aW9uIGVuYWJsZU1hcFNldCgpIHtcbiAgY2xhc3MgRHJhZnRNYXAgZXh0ZW5kcyBNYXAge1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgcGFyZW50KSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpc1tEUkFGVF9TVEFURV0gPSB7XG4gICAgICAgIHR5cGVfOiAyIC8qIE1hcCAqLyxcbiAgICAgICAgcGFyZW50XzogcGFyZW50LFxuICAgICAgICBzY29wZV86IHBhcmVudCA/IHBhcmVudC5zY29wZV8gOiBnZXRDdXJyZW50U2NvcGUoKSxcbiAgICAgICAgbW9kaWZpZWRfOiBmYWxzZSxcbiAgICAgICAgZmluYWxpemVkXzogZmFsc2UsXG4gICAgICAgIGNvcHlfOiB2b2lkIDAsXG4gICAgICAgIGFzc2lnbmVkXzogdm9pZCAwLFxuICAgICAgICBiYXNlXzogdGFyZ2V0LFxuICAgICAgICBkcmFmdF86IHRoaXMsXG4gICAgICAgIGlzTWFudWFsXzogZmFsc2UsXG4gICAgICAgIHJldm9rZWRfOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5zaXplO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5oYXMoa2V5KTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKCFsYXRlc3Qoc3RhdGUpLmhhcyhrZXkpIHx8IGxhdGVzdChzdGF0ZSkuZ2V0KGtleSkgIT09IHZhbHVlKSB7XG4gICAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLnNldChrZXksIHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgIGlmICghdGhpcy5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZS5iYXNlXy5oYXMoa2V5KSkge1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAgc3RhdGUuY29weV8uZGVsZXRlKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmIChsYXRlc3Qoc3RhdGUpLnNpemUpIHtcbiAgICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICAgIGVhY2goc3RhdGUuYmFzZV8sIChrZXkpID0+IHtcbiAgICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RhdGUuY29weV8uY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yRWFjaChjYiwgdGhpc0FyZykge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGxhdGVzdChzdGF0ZSkuZm9yRWFjaCgoX3ZhbHVlLCBrZXksIF9tYXApID0+IHtcbiAgICAgICAgY2IuY2FsbCh0aGlzQXJnLCB0aGlzLmdldChrZXkpLCBrZXksIHRoaXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGdldChrZXkpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgY29uc3QgdmFsdWUgPSBsYXRlc3Qoc3RhdGUpLmdldChrZXkpO1xuICAgICAgaWYgKHN0YXRlLmZpbmFsaXplZF8gfHwgIWlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgIT09IHN0YXRlLmJhc2VfLmdldChrZXkpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRyYWZ0ID0gY3JlYXRlUHJveHkodmFsdWUsIHN0YXRlKTtcbiAgICAgIHByZXBhcmVNYXBDb3B5KHN0YXRlKTtcbiAgICAgIHN0YXRlLmNvcHlfLnNldChrZXksIGRyYWZ0KTtcbiAgICAgIHJldHVybiBkcmFmdDtcbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLmtleXMoKTtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLmtleXMoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB0aGlzLnZhbHVlcygpLFxuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgciA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoci5kb25lKVxuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChyLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMua2V5cygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHRoaXMuZW50cmllcygpLFxuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgciA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoci5kb25lKVxuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChyLnZhbHVlKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogW3IudmFsdWUsIHZhbHVlXVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIFsoRFJBRlRfU1RBVEUsIFN5bWJvbC5pdGVyYXRvcildKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBwcm94eU1hcF8odGFyZ2V0LCBwYXJlbnQpIHtcbiAgICByZXR1cm4gbmV3IERyYWZ0TWFwKHRhcmdldCwgcGFyZW50KTtcbiAgfVxuICBmdW5jdGlvbiBwcmVwYXJlTWFwQ29weShzdGF0ZSkge1xuICAgIGlmICghc3RhdGUuY29weV8pIHtcbiAgICAgIHN0YXRlLmFzc2lnbmVkXyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICBzdGF0ZS5jb3B5XyA9IG5ldyBNYXAoc3RhdGUuYmFzZV8pO1xuICAgIH1cbiAgfVxuICBjbGFzcyBEcmFmdFNldCBleHRlbmRzIFNldCB7XG4gICAgY29uc3RydWN0b3IodGFyZ2V0LCBwYXJlbnQpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzW0RSQUZUX1NUQVRFXSA9IHtcbiAgICAgICAgdHlwZV86IDMgLyogU2V0ICovLFxuICAgICAgICBwYXJlbnRfOiBwYXJlbnQsXG4gICAgICAgIHNjb3BlXzogcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpLFxuICAgICAgICBtb2RpZmllZF86IGZhbHNlLFxuICAgICAgICBmaW5hbGl6ZWRfOiBmYWxzZSxcbiAgICAgICAgY29weV86IHZvaWQgMCxcbiAgICAgICAgYmFzZV86IHRhcmdldCxcbiAgICAgICAgZHJhZnRfOiB0aGlzLFxuICAgICAgICBkcmFmdHNfOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLFxuICAgICAgICByZXZva2VkXzogZmFsc2UsXG4gICAgICAgIGlzTWFudWFsXzogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkuc2l6ZTtcbiAgICB9XG4gICAgaGFzKHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghc3RhdGUuY29weV8pIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmJhc2VfLmhhcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuY29weV8uaGFzKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoc3RhdGUuZHJhZnRzXy5oYXModmFsdWUpICYmIHN0YXRlLmNvcHlfLmhhcyhzdGF0ZS5kcmFmdHNfLmdldCh2YWx1ZSkpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmICghdGhpcy5oYXModmFsdWUpKSB7XG4gICAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5hZGQodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbGV0ZSh2YWx1ZSkge1xuICAgICAgaWYgKCF0aGlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGUuY29weV8uZGVsZXRlKHZhbHVlKSB8fCAoc3RhdGUuZHJhZnRzXy5oYXModmFsdWUpID8gc3RhdGUuY29weV8uZGVsZXRlKHN0YXRlLmRyYWZ0c18uZ2V0KHZhbHVlKSkgOiAoXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGZhbHNlXG4gICAgICApKTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIGlmIChsYXRlc3Qoc3RhdGUpLnNpemUpIHtcbiAgICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhbHVlcygpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfLnZhbHVlcygpO1xuICAgIH1cbiAgICBlbnRyaWVzKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGUuY29weV8uZW50cmllcygpO1xuICAgIH1cbiAgICBrZXlzKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCk7XG4gICAgfVxuICAgIFsoRFJBRlRfU1RBVEUsIFN5bWJvbC5pdGVyYXRvcildKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCk7XG4gICAgfVxuICAgIGZvckVhY2goY2IsIHRoaXNBcmcpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgIGxldCByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgIGNiLmNhbGwodGhpc0FyZywgcmVzdWx0LnZhbHVlLCByZXN1bHQudmFsdWUsIHRoaXMpO1xuICAgICAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHByb3h5U2V0Xyh0YXJnZXQsIHBhcmVudCkge1xuICAgIHJldHVybiBuZXcgRHJhZnRTZXQodGFyZ2V0LCBwYXJlbnQpO1xuICB9XG4gIGZ1bmN0aW9uIHByZXBhcmVTZXRDb3B5KHN0YXRlKSB7XG4gICAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgICAgc3RhdGUuY29weV8gPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgICAgc3RhdGUuYmFzZV8uZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlzRHJhZnRhYmxlKHZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IGRyYWZ0ID0gY3JlYXRlUHJveHkodmFsdWUsIHN0YXRlKTtcbiAgICAgICAgICBzdGF0ZS5kcmFmdHNfLnNldCh2YWx1ZSwgZHJhZnQpO1xuICAgICAgICAgIHN0YXRlLmNvcHlfLmFkZChkcmFmdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUuY29weV8uYWRkKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFzc2VydFVucmV2b2tlZChzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5yZXZva2VkXylcbiAgICAgIGRpZSgzLCBKU09OLnN0cmluZ2lmeShsYXRlc3Qoc3RhdGUpKSk7XG4gIH1cbiAgbG9hZFBsdWdpbihcIk1hcFNldFwiLCB7IHByb3h5TWFwXywgcHJveHlTZXRfIH0pO1xufVxuXG4vLyBzcmMvaW1tZXIudHNcbnZhciBpbW1lciA9IG5ldyBJbW1lcjIoKTtcbnZhciBwcm9kdWNlID0gaW1tZXIucHJvZHVjZTtcbnZhciBwcm9kdWNlV2l0aFBhdGNoZXMgPSBpbW1lci5wcm9kdWNlV2l0aFBhdGNoZXMuYmluZChcbiAgaW1tZXJcbik7XG52YXIgc2V0QXV0b0ZyZWV6ZSA9IGltbWVyLnNldEF1dG9GcmVlemUuYmluZChpbW1lcik7XG52YXIgc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHkgPSBpbW1lci5zZXRVc2VTdHJpY3RTaGFsbG93Q29weS5iaW5kKGltbWVyKTtcbnZhciBhcHBseVBhdGNoZXMgPSBpbW1lci5hcHBseVBhdGNoZXMuYmluZChpbW1lcik7XG52YXIgY3JlYXRlRHJhZnQgPSBpbW1lci5jcmVhdGVEcmFmdC5iaW5kKGltbWVyKTtcbnZhciBmaW5pc2hEcmFmdCA9IGltbWVyLmZpbmlzaERyYWZ0LmJpbmQoaW1tZXIpO1xuZnVuY3Rpb24gY2FzdERyYWZ0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNhc3RJbW11dGFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IHtcbiAgSW1tZXIyIGFzIEltbWVyLFxuICBhcHBseVBhdGNoZXMsXG4gIGNhc3REcmFmdCxcbiAgY2FzdEltbXV0YWJsZSxcbiAgY3JlYXRlRHJhZnQsXG4gIGN1cnJlbnQsXG4gIGVuYWJsZU1hcFNldCxcbiAgZW5hYmxlUGF0Y2hlcyxcbiAgZmluaXNoRHJhZnQsXG4gIGZyZWV6ZSxcbiAgRFJBRlRBQkxFIGFzIGltbWVyYWJsZSxcbiAgaXNEcmFmdCxcbiAgaXNEcmFmdGFibGUsXG4gIE5PVEhJTkcgYXMgbm90aGluZyxcbiAgb3JpZ2luYWwsXG4gIHByb2R1Y2UsXG4gIHByb2R1Y2VXaXRoUGF0Y2hlcyxcbiAgc2V0QXV0b0ZyZWV6ZSxcbiAgc2V0VXNlU3RyaWN0U2hhbGxvd0NvcHlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbW1lci5tanMubWFwIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWFrZUNhbmNlbGxhYmxlUHJvbWlzZShwcm9taXNlKSB7XG4gICAgdmFyIGlzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgdmFyIHdyYXBwZWRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBwcm9taXNlXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuICFpc0NhbmNlbGxlZCAmJiByZXNvbHZlKHZhbHVlKTsgfSlcbiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuICFpc0NhbmNlbGxlZCAmJiByZWplY3QoZXJyb3IpOyB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlOiB3cmFwcGVkUHJvbWlzZSxcbiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiIsInZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbi8vIEFzIGRlZmluZWQgb24gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGV2ZW50czogaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2V2ZW50cy5odG1sXG5leHBvcnQgdmFyIGNsaXBib2FyZEV2ZW50cyA9IFsnb25Db3B5JywgJ29uQ3V0JywgJ29uUGFzdGUnXTtcbmV4cG9ydCB2YXIgY29tcG9zaXRpb25FdmVudHMgPSBbXG4gICAgJ29uQ29tcG9zaXRpb25FbmQnLFxuICAgICdvbkNvbXBvc2l0aW9uU3RhcnQnLFxuICAgICdvbkNvbXBvc2l0aW9uVXBkYXRlJyxcbl07XG5leHBvcnQgdmFyIGZvY3VzRXZlbnRzID0gWydvbkZvY3VzJywgJ29uQmx1ciddO1xuZXhwb3J0IHZhciBmb3JtRXZlbnRzID0gWydvbklucHV0JywgJ29uSW52YWxpZCcsICdvblJlc2V0JywgJ29uU3VibWl0J107XG5leHBvcnQgdmFyIGltYWdlRXZlbnRzID0gWydvbkxvYWQnLCAnb25FcnJvciddO1xuZXhwb3J0IHZhciBrZXlib2FyZEV2ZW50cyA9IFsnb25LZXlEb3duJywgJ29uS2V5UHJlc3MnLCAnb25LZXlVcCddO1xuZXhwb3J0IHZhciBtZWRpYUV2ZW50cyA9IFtcbiAgICAnb25BYm9ydCcsXG4gICAgJ29uQ2FuUGxheScsXG4gICAgJ29uQ2FuUGxheVRocm91Z2gnLFxuICAgICdvbkR1cmF0aW9uQ2hhbmdlJyxcbiAgICAnb25FbXB0aWVkJyxcbiAgICAnb25FbmNyeXB0ZWQnLFxuICAgICdvbkVuZGVkJyxcbiAgICAnb25FcnJvcicsXG4gICAgJ29uTG9hZGVkRGF0YScsXG4gICAgJ29uTG9hZGVkTWV0YWRhdGEnLFxuICAgICdvbkxvYWRTdGFydCcsXG4gICAgJ29uUGF1c2UnLFxuICAgICdvblBsYXknLFxuICAgICdvblBsYXlpbmcnLFxuICAgICdvblByb2dyZXNzJyxcbiAgICAnb25SYXRlQ2hhbmdlJyxcbiAgICAnb25TZWVrZWQnLFxuICAgICdvblNlZWtpbmcnLFxuICAgICdvblN0YWxsZWQnLFxuICAgICdvblN1c3BlbmQnLFxuICAgICdvblRpbWVVcGRhdGUnLFxuICAgICdvblZvbHVtZUNoYW5nZScsXG4gICAgJ29uV2FpdGluZycsXG5dO1xuZXhwb3J0IHZhciBtb3VzZUV2ZW50cyA9IFtcbiAgICAnb25DbGljaycsXG4gICAgJ29uQ29udGV4dE1lbnUnLFxuICAgICdvbkRvdWJsZUNsaWNrJyxcbiAgICAnb25Nb3VzZURvd24nLFxuICAgICdvbk1vdXNlRW50ZXInLFxuICAgICdvbk1vdXNlTGVhdmUnLFxuICAgICdvbk1vdXNlTW92ZScsXG4gICAgJ29uTW91c2VPdXQnLFxuICAgICdvbk1vdXNlT3ZlcicsXG4gICAgJ29uTW91c2VVcCcsXG5dO1xuZXhwb3J0IHZhciBkcmFnRXZlbnRzID0gW1xuICAgICdvbkRyYWcnLFxuICAgICdvbkRyYWdFbmQnLFxuICAgICdvbkRyYWdFbnRlcicsXG4gICAgJ29uRHJhZ0V4aXQnLFxuICAgICdvbkRyYWdMZWF2ZScsXG4gICAgJ29uRHJhZ092ZXInLFxuICAgICdvbkRyYWdTdGFydCcsXG4gICAgJ29uRHJvcCcsXG5dO1xuZXhwb3J0IHZhciBzZWxlY3Rpb25FdmVudHMgPSBbJ29uU2VsZWN0J107XG5leHBvcnQgdmFyIHRvdWNoRXZlbnRzID0gWydvblRvdWNoQ2FuY2VsJywgJ29uVG91Y2hFbmQnLCAnb25Ub3VjaE1vdmUnLCAnb25Ub3VjaFN0YXJ0J107XG5leHBvcnQgdmFyIHBvaW50ZXJFdmVudHMgPSBbXG4gICAgJ29uUG9pbnRlckRvd24nLFxuICAgICdvblBvaW50ZXJNb3ZlJyxcbiAgICAnb25Qb2ludGVyVXAnLFxuICAgICdvblBvaW50ZXJDYW5jZWwnLFxuICAgICdvbkdvdFBvaW50ZXJDYXB0dXJlJyxcbiAgICAnb25Mb3N0UG9pbnRlckNhcHR1cmUnLFxuICAgICdvblBvaW50ZXJFbnRlcicsXG4gICAgJ29uUG9pbnRlckxlYXZlJyxcbiAgICAnb25Qb2ludGVyT3ZlcicsXG4gICAgJ29uUG9pbnRlck91dCcsXG5dO1xuZXhwb3J0IHZhciB1aUV2ZW50cyA9IFsnb25TY3JvbGwnXTtcbmV4cG9ydCB2YXIgd2hlZWxFdmVudHMgPSBbJ29uV2hlZWwnXTtcbmV4cG9ydCB2YXIgYW5pbWF0aW9uRXZlbnRzID0gW1xuICAgICdvbkFuaW1hdGlvblN0YXJ0JyxcbiAgICAnb25BbmltYXRpb25FbmQnLFxuICAgICdvbkFuaW1hdGlvbkl0ZXJhdGlvbicsXG5dO1xuZXhwb3J0IHZhciB0cmFuc2l0aW9uRXZlbnRzID0gWydvblRyYW5zaXRpb25FbmQnXTtcbmV4cG9ydCB2YXIgb3RoZXJFdmVudHMgPSBbJ29uVG9nZ2xlJ107XG5leHBvcnQgdmFyIGNoYW5nZUV2ZW50cyA9IFsnb25DaGFuZ2UnXTtcbmV4cG9ydCB2YXIgYWxsRXZlbnRzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIGNsaXBib2FyZEV2ZW50cywgdHJ1ZSksIGNvbXBvc2l0aW9uRXZlbnRzLCB0cnVlKSwgZm9jdXNFdmVudHMsIHRydWUpLCBmb3JtRXZlbnRzLCB0cnVlKSwgaW1hZ2VFdmVudHMsIHRydWUpLCBrZXlib2FyZEV2ZW50cywgdHJ1ZSksIG1lZGlhRXZlbnRzLCB0cnVlKSwgbW91c2VFdmVudHMsIHRydWUpLCBkcmFnRXZlbnRzLCB0cnVlKSwgc2VsZWN0aW9uRXZlbnRzLCB0cnVlKSwgdG91Y2hFdmVudHMsIHRydWUpLCBwb2ludGVyRXZlbnRzLCB0cnVlKSwgdWlFdmVudHMsIHRydWUpLCB3aGVlbEV2ZW50cywgdHJ1ZSksIGFuaW1hdGlvbkV2ZW50cywgdHJ1ZSksIHRyYW5zaXRpb25FdmVudHMsIHRydWUpLCBjaGFuZ2VFdmVudHMsIHRydWUpLCBvdGhlckV2ZW50cywgdHJ1ZSk7XG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggb24tZXZlbnQgY2FsbGJhY2sgcHJvcHMgY3VycmllZCB3aXRoIHByb3ZpZGVkIGFyZ3MuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgUHJvcHMgcGFzc2VkIHRvIGEgY29tcG9uZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbj19IGdldEFyZ3MgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYXJndW1lbnQocykgb24tZXZlbnQgY2FsbGJhY2tzXG4gKiAgIHNoYWxsIGJlIGN1cnJpZWQgd2l0aC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWFrZUV2ZW50UHJvcHMocHJvcHMsIGdldEFyZ3MpIHtcbiAgICB2YXIgZXZlbnRQcm9wcyA9IHt9O1xuICAgIGFsbEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgdmFyIGV2ZW50SGFuZGxlciA9IHByb3BzW2V2ZW50TmFtZV07XG4gICAgICAgIGlmICghZXZlbnRIYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldEFyZ3MpIHtcbiAgICAgICAgICAgIGV2ZW50UHJvcHNbZXZlbnROYW1lXSA9IChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyKGV2ZW50LCBnZXRBcmdzKGV2ZW50TmFtZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBldmVudFByb3BzW2V2ZW50TmFtZV0gPSBldmVudEhhbmRsZXI7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZXZlbnRQcm9wcztcbn1cbiIsIi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IG1lcmdlcyBSZWFjdCByZWZzIGludG8gb25lLlxuICogU3VwcG9ydHMgYm90aCBmdW5jdGlvbnMgYW5kIHJlZiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgY3JlYXRlUmVmKCkgYW5kIHVzZVJlZigpLlxuICpcbiAqIFVzYWdlOlxuICogYGBgdHN4XG4gKiA8ZGl2IHJlZj17bWVyZ2VSZWZzKHJlZjEsIHJlZjIsIHJlZjMpfSAvPlxuICogYGBgXG4gKlxuICogQHBhcmFtIHsoUmVhY3QuUmVmPFQ+IHwgdW5kZWZpbmVkKVtdfSBpbnB1dFJlZnMgQXJyYXkgb2YgcmVmc1xuICogQHJldHVybnMge1JlYWN0LlJlZjxUPiB8IFJlYWN0LlJlZkNhbGxiYWNrPFQ+fSBNZXJnZWQgcmVmc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZVJlZnMoKSB7XG4gICAgdmFyIGlucHV0UmVmcyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGlucHV0UmVmc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgZmlsdGVyZWRJbnB1dFJlZnMgPSBpbnB1dFJlZnMuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChmaWx0ZXJlZElucHV0UmVmcy5sZW5ndGggPD0gMSkge1xuICAgICAgICB2YXIgZmlyc3RSZWYgPSBmaWx0ZXJlZElucHV0UmVmc1swXTtcbiAgICAgICAgcmV0dXJuIGZpcnN0UmVmIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWRSZWZzKHJlZikge1xuICAgICAgICBmaWx0ZXJlZElucHV0UmVmcy5mb3JFYWNoKGZ1bmN0aW9uIChpbnB1dFJlZikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGlucHV0UmVmKHJlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpbnB1dFJlZikge1xuICAgICAgICAgICAgICAgIGlucHV0UmVmLmN1cnJlbnQgPSByZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG59XG4iLCIvKipcbiAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZVxuICogSmF2YVNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZVxuICpcbiAqIENvcHlyaWdodCAyMDIzIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGVcbiAqIEphdmFTY3JpcHQgY29kZSBpbiB0aGlzIHBhZ2VcbiAqL1xuXG4vKioqKioqLyAvLyBUaGUgcmVxdWlyZSBzY29wZVxuLyoqKioqKi8gdmFyIF9fd2VicGFja19yZXF1aXJlX18gPSB7fTtcbi8qKioqKiovIFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIC8qIHdlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyAqL1xuLyoqKioqKi8gKCgpID0+IHtcbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuLyoqKioqKi8gXHRcdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuLyoqKioqKi8gXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovIH0pKCk7XG4vKioqKioqLyBcbi8qKioqKiovIC8qIHdlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQgKi9cbi8qKioqKiovICgoKSA9PiB7XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSlcbi8qKioqKiovIH0pKCk7XG4vKioqKioqLyBcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IGdsb2JhbFRoaXMucGRmanNMaWIgPSB7fTtcblxuLy8gRVhQT1JUU1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHtcbiAgQWJvcnRFeGNlcHRpb246ICgpID0+ICgvKiByZWV4cG9ydCAqLyBBYm9ydEV4Y2VwdGlvbiksXG4gIEFubm90YXRpb25FZGl0b3JMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIEFubm90YXRpb25FZGl0b3JMYXllciksXG4gIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUpLFxuICBBbm5vdGF0aW9uRWRpdG9yVHlwZTogKCkgPT4gKC8qIHJlZXhwb3J0ICovIEFubm90YXRpb25FZGl0b3JUeXBlKSxcbiAgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIpLFxuICBBbm5vdGF0aW9uTGF5ZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBBbm5vdGF0aW9uTGF5ZXIpLFxuICBBbm5vdGF0aW9uTW9kZTogKCkgPT4gKC8qIHJlZXhwb3J0ICovIEFubm90YXRpb25Nb2RlKSxcbiAgQ01hcENvbXByZXNzaW9uVHlwZTogKCkgPT4gKC8qIHJlZXhwb3J0ICovIENNYXBDb21wcmVzc2lvblR5cGUpLFxuICBDb2xvclBpY2tlcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIENvbG9yUGlja2VyKSxcbiAgRE9NU1ZHRmFjdG9yeTogKCkgPT4gKC8qIHJlZXhwb3J0ICovIERPTVNWR0ZhY3RvcnkpLFxuICBEcmF3TGF5ZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBEcmF3TGF5ZXIpLFxuICBGZWF0dXJlVGVzdDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIHV0aWxfRmVhdHVyZVRlc3QpLFxuICBHbG9iYWxXb3JrZXJPcHRpb25zOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gR2xvYmFsV29ya2VyT3B0aW9ucyksXG4gIEltYWdlS2luZDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIHV0aWxfSW1hZ2VLaW5kKSxcbiAgSW52YWxpZFBERkV4Y2VwdGlvbjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIEludmFsaWRQREZFeGNlcHRpb24pLFxuICBNaXNzaW5nUERGRXhjZXB0aW9uOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gTWlzc2luZ1BERkV4Y2VwdGlvbiksXG4gIE9QUzogKCkgPT4gKC8qIHJlZXhwb3J0ICovIE9QUyksXG4gIE91dGxpbmVyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gT3V0bGluZXIpLFxuICBQREZEYXRhUmFuZ2VUcmFuc3BvcnQ6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBQREZEYXRhUmFuZ2VUcmFuc3BvcnQpLFxuICBQREZEYXRlU3RyaW5nOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gUERGRGF0ZVN0cmluZyksXG4gIFBERldvcmtlcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFBERldvcmtlciksXG4gIFBhc3N3b3JkUmVzcG9uc2VzOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gUGFzc3dvcmRSZXNwb25zZXMpLFxuICBQZXJtaXNzaW9uRmxhZzogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFBlcm1pc3Npb25GbGFnKSxcbiAgUGl4ZWxzUGVySW5jaDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFBpeGVsc1BlckluY2gpLFxuICBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb246ICgpID0+ICgvKiByZWV4cG9ydCAqLyBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pLFxuICBUZXh0TGF5ZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBUZXh0TGF5ZXIpLFxuICBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb246ICgpID0+ICgvKiByZWV4cG9ydCAqLyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24pLFxuICBVdGlsOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gVXRpbCksXG4gIFZlcmJvc2l0eUxldmVsOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gVmVyYm9zaXR5TGV2ZWwpLFxuICBYZmFMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFhmYUxheWVyKSxcbiAgYnVpbGQ6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBidWlsZCksXG4gIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmw6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBjcmVhdGVWYWxpZEFic29sdXRlVXJsKSxcbiAgZmV0Y2hEYXRhOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gZmV0Y2hEYXRhKSxcbiAgZ2V0RG9jdW1lbnQ6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBnZXREb2N1bWVudCksXG4gIGdldEZpbGVuYW1lRnJvbVVybDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGdldEZpbGVuYW1lRnJvbVVybCksXG4gIGdldFBkZkZpbGVuYW1lRnJvbVVybDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGdldFBkZkZpbGVuYW1lRnJvbVVybCksXG4gIGdldFhmYVBhZ2VWaWV3cG9ydDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGdldFhmYVBhZ2VWaWV3cG9ydCksXG4gIGlzRGF0YVNjaGVtZTogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGlzRGF0YVNjaGVtZSksXG4gIGlzUGRmRmlsZTogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGlzUGRmRmlsZSksXG4gIG5vQ29udGV4dE1lbnU6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBub0NvbnRleHRNZW51KSxcbiAgbm9ybWFsaXplVW5pY29kZTogKCkgPT4gKC8qIHJlZXhwb3J0ICovIG5vcm1hbGl6ZVVuaWNvZGUpLFxuICByZW5kZXJUZXh0TGF5ZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyByZW5kZXJUZXh0TGF5ZXIpLFxuICBzZXRMYXllckRpbWVuc2lvbnM6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBzZXRMYXllckRpbWVuc2lvbnMpLFxuICBzaGFkb3c6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBzaGFkb3cpLFxuICB1cGRhdGVUZXh0TGF5ZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyB1cGRhdGVUZXh0TGF5ZXIpLFxuICB2ZXJzaW9uOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gdmVyc2lvbilcbn0pO1xuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvc2hhcmVkL3V0aWwuanNcbmNvbnN0IGlzTm9kZUpTID0gdHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgcHJvY2VzcyArIFwiXCIgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiICYmICFwcm9jZXNzLnZlcnNpb25zLm53ICYmICEocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgcHJvY2Vzcy50eXBlICE9PSBcImJyb3dzZXJcIik7XG5jb25zdCBJREVOVElUWV9NQVRSSVggPSBbMSwgMCwgMCwgMSwgMCwgMF07XG5jb25zdCBGT05UX0lERU5USVRZX01BVFJJWCA9IFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdO1xuY29uc3QgTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEUgPSAxMGU2O1xuY29uc3QgTElORV9GQUNUT1IgPSAxLjM1O1xuY29uc3QgTElORV9ERVNDRU5UX0ZBQ1RPUiA9IDAuMzU7XG5jb25zdCBCQVNFTElORV9GQUNUT1IgPSBMSU5FX0RFU0NFTlRfRkFDVE9SIC8gTElORV9GQUNUT1I7XG5jb25zdCBSZW5kZXJpbmdJbnRlbnRGbGFnID0ge1xuICBBTlk6IDB4MDEsXG4gIERJU1BMQVk6IDB4MDIsXG4gIFBSSU5UOiAweDA0LFxuICBTQVZFOiAweDA4LFxuICBBTk5PVEFUSU9OU19GT1JNUzogMHgxMCxcbiAgQU5OT1RBVElPTlNfU1RPUkFHRTogMHgyMCxcbiAgQU5OT1RBVElPTlNfRElTQUJMRTogMHg0MCxcbiAgT1BMSVNUOiAweDEwMFxufTtcbmNvbnN0IEFubm90YXRpb25Nb2RlID0ge1xuICBESVNBQkxFOiAwLFxuICBFTkFCTEU6IDEsXG4gIEVOQUJMRV9GT1JNUzogMixcbiAgRU5BQkxFX1NUT1JBR0U6IDNcbn07XG5jb25zdCBBbm5vdGF0aW9uRWRpdG9yUHJlZml4ID0gXCJwZGZqc19pbnRlcm5hbF9lZGl0b3JfXCI7XG5jb25zdCBBbm5vdGF0aW9uRWRpdG9yVHlwZSA9IHtcbiAgRElTQUJMRTogLTEsXG4gIE5PTkU6IDAsXG4gIEZSRUVURVhUOiAzLFxuICBISUdITElHSFQ6IDksXG4gIFNUQU1QOiAxMyxcbiAgSU5LOiAxNVxufTtcbmNvbnN0IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlID0ge1xuICBSRVNJWkU6IDEsXG4gIENSRUFURTogMixcbiAgRlJFRVRFWFRfU0laRTogMTEsXG4gIEZSRUVURVhUX0NPTE9SOiAxMixcbiAgRlJFRVRFWFRfT1BBQ0lUWTogMTMsXG4gIElOS19DT0xPUjogMjEsXG4gIElOS19USElDS05FU1M6IDIyLFxuICBJTktfT1BBQ0lUWTogMjMsXG4gIEhJR0hMSUdIVF9DT0xPUjogMzEsXG4gIEhJR0hMSUdIVF9ERUZBVUxUX0NPTE9SOiAzMixcbiAgSElHSExJR0hUX1RISUNLTkVTUzogMzMsXG4gIEhJR0hMSUdIVF9GUkVFOiAzNCxcbiAgSElHSExJR0hUX1NIT1dfQUxMOiAzNVxufTtcbmNvbnN0IFBlcm1pc3Npb25GbGFnID0ge1xuICBQUklOVDogMHgwNCxcbiAgTU9ESUZZX0NPTlRFTlRTOiAweDA4LFxuICBDT1BZOiAweDEwLFxuICBNT0RJRllfQU5OT1RBVElPTlM6IDB4MjAsXG4gIEZJTExfSU5URVJBQ1RJVkVfRk9STVM6IDB4MTAwLFxuICBDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZOiAweDIwMCxcbiAgQVNTRU1CTEU6IDB4NDAwLFxuICBQUklOVF9ISUdIX1FVQUxJVFk6IDB4ODAwXG59O1xuY29uc3QgVGV4dFJlbmRlcmluZ01vZGUgPSB7XG4gIEZJTEw6IDAsXG4gIFNUUk9LRTogMSxcbiAgRklMTF9TVFJPS0U6IDIsXG4gIElOVklTSUJMRTogMyxcbiAgRklMTF9BRERfVE9fUEFUSDogNCxcbiAgU1RST0tFX0FERF9UT19QQVRIOiA1LFxuICBGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDogNixcbiAgQUREX1RPX1BBVEg6IDcsXG4gIEZJTExfU1RST0tFX01BU0s6IDMsXG4gIEFERF9UT19QQVRIX0ZMQUc6IDRcbn07XG5jb25zdCB1dGlsX0ltYWdlS2luZCA9IHtcbiAgR1JBWVNDQUxFXzFCUFA6IDEsXG4gIFJHQl8yNEJQUDogMixcbiAgUkdCQV8zMkJQUDogM1xufTtcbmNvbnN0IEFubm90YXRpb25UeXBlID0ge1xuICBURVhUOiAxLFxuICBMSU5LOiAyLFxuICBGUkVFVEVYVDogMyxcbiAgTElORTogNCxcbiAgU1FVQVJFOiA1LFxuICBDSVJDTEU6IDYsXG4gIFBPTFlHT046IDcsXG4gIFBPTFlMSU5FOiA4LFxuICBISUdITElHSFQ6IDksXG4gIFVOREVSTElORTogMTAsXG4gIFNRVUlHR0xZOiAxMSxcbiAgU1RSSUtFT1VUOiAxMixcbiAgU1RBTVA6IDEzLFxuICBDQVJFVDogMTQsXG4gIElOSzogMTUsXG4gIFBPUFVQOiAxNixcbiAgRklMRUFUVEFDSE1FTlQ6IDE3LFxuICBTT1VORDogMTgsXG4gIE1PVklFOiAxOSxcbiAgV0lER0VUOiAyMCxcbiAgU0NSRUVOOiAyMSxcbiAgUFJJTlRFUk1BUks6IDIyLFxuICBUUkFQTkVUOiAyMyxcbiAgV0FURVJNQVJLOiAyNCxcbiAgVEhSRUVEOiAyNSxcbiAgUkVEQUNUOiAyNlxufTtcbmNvbnN0IEFubm90YXRpb25SZXBseVR5cGUgPSB7XG4gIEdST1VQOiBcIkdyb3VwXCIsXG4gIFJFUExZOiBcIlJcIlxufTtcbmNvbnN0IEFubm90YXRpb25GbGFnID0ge1xuICBJTlZJU0lCTEU6IDB4MDEsXG4gIEhJRERFTjogMHgwMixcbiAgUFJJTlQ6IDB4MDQsXG4gIE5PWk9PTTogMHgwOCxcbiAgTk9ST1RBVEU6IDB4MTAsXG4gIE5PVklFVzogMHgyMCxcbiAgUkVBRE9OTFk6IDB4NDAsXG4gIExPQ0tFRDogMHg4MCxcbiAgVE9HR0xFTk9WSUVXOiAweDEwMCxcbiAgTE9DS0VEQ09OVEVOVFM6IDB4MjAwXG59O1xuY29uc3QgQW5ub3RhdGlvbkZpZWxkRmxhZyA9IHtcbiAgUkVBRE9OTFk6IDB4MDAwMDAwMSxcbiAgUkVRVUlSRUQ6IDB4MDAwMDAwMixcbiAgTk9FWFBPUlQ6IDB4MDAwMDAwNCxcbiAgTVVMVElMSU5FOiAweDAwMDEwMDAsXG4gIFBBU1NXT1JEOiAweDAwMDIwMDAsXG4gIE5PVE9HR0xFVE9PRkY6IDB4MDAwNDAwMCxcbiAgUkFESU86IDB4MDAwODAwMCxcbiAgUFVTSEJVVFRPTjogMHgwMDEwMDAwLFxuICBDT01CTzogMHgwMDIwMDAwLFxuICBFRElUOiAweDAwNDAwMDAsXG4gIFNPUlQ6IDB4MDA4MDAwMCxcbiAgRklMRVNFTEVDVDogMHgwMTAwMDAwLFxuICBNVUxUSVNFTEVDVDogMHgwMjAwMDAwLFxuICBET05PVFNQRUxMQ0hFQ0s6IDB4MDQwMDAwMCxcbiAgRE9OT1RTQ1JPTEw6IDB4MDgwMDAwMCxcbiAgQ09NQjogMHgxMDAwMDAwLFxuICBSSUNIVEVYVDogMHgyMDAwMDAwLFxuICBSQURJT1NJTlVOSVNPTjogMHgyMDAwMDAwLFxuICBDT01NSVRPTlNFTENIQU5HRTogMHg0MDAwMDAwXG59O1xuY29uc3QgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IHtcbiAgU09MSUQ6IDEsXG4gIERBU0hFRDogMixcbiAgQkVWRUxFRDogMyxcbiAgSU5TRVQ6IDQsXG4gIFVOREVSTElORTogNVxufTtcbmNvbnN0IEFubm90YXRpb25BY3Rpb25FdmVudFR5cGUgPSB7XG4gIEU6IFwiTW91c2UgRW50ZXJcIixcbiAgWDogXCJNb3VzZSBFeGl0XCIsXG4gIEQ6IFwiTW91c2UgRG93blwiLFxuICBVOiBcIk1vdXNlIFVwXCIsXG4gIEZvOiBcIkZvY3VzXCIsXG4gIEJsOiBcIkJsdXJcIixcbiAgUE86IFwiUGFnZU9wZW5cIixcbiAgUEM6IFwiUGFnZUNsb3NlXCIsXG4gIFBWOiBcIlBhZ2VWaXNpYmxlXCIsXG4gIFBJOiBcIlBhZ2VJbnZpc2libGVcIixcbiAgSzogXCJLZXlzdHJva2VcIixcbiAgRjogXCJGb3JtYXRcIixcbiAgVjogXCJWYWxpZGF0ZVwiLFxuICBDOiBcIkNhbGN1bGF0ZVwiXG59O1xuY29uc3QgRG9jdW1lbnRBY3Rpb25FdmVudFR5cGUgPSB7XG4gIFdDOiBcIldpbGxDbG9zZVwiLFxuICBXUzogXCJXaWxsU2F2ZVwiLFxuICBEUzogXCJEaWRTYXZlXCIsXG4gIFdQOiBcIldpbGxQcmludFwiLFxuICBEUDogXCJEaWRQcmludFwiXG59O1xuY29uc3QgUGFnZUFjdGlvbkV2ZW50VHlwZSA9IHtcbiAgTzogXCJQYWdlT3BlblwiLFxuICBDOiBcIlBhZ2VDbG9zZVwiXG59O1xuY29uc3QgVmVyYm9zaXR5TGV2ZWwgPSB7XG4gIEVSUk9SUzogMCxcbiAgV0FSTklOR1M6IDEsXG4gIElORk9TOiA1XG59O1xuY29uc3QgQ01hcENvbXByZXNzaW9uVHlwZSA9IHtcbiAgTk9ORTogMCxcbiAgQklOQVJZOiAxXG59O1xuY29uc3QgT1BTID0ge1xuICBkZXBlbmRlbmN5OiAxLFxuICBzZXRMaW5lV2lkdGg6IDIsXG4gIHNldExpbmVDYXA6IDMsXG4gIHNldExpbmVKb2luOiA0LFxuICBzZXRNaXRlckxpbWl0OiA1LFxuICBzZXREYXNoOiA2LFxuICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsXG4gIHNldEZsYXRuZXNzOiA4LFxuICBzZXRHU3RhdGU6IDksXG4gIHNhdmU6IDEwLFxuICByZXN0b3JlOiAxMSxcbiAgdHJhbnNmb3JtOiAxMixcbiAgbW92ZVRvOiAxMyxcbiAgbGluZVRvOiAxNCxcbiAgY3VydmVUbzogMTUsXG4gIGN1cnZlVG8yOiAxNixcbiAgY3VydmVUbzM6IDE3LFxuICBjbG9zZVBhdGg6IDE4LFxuICByZWN0YW5nbGU6IDE5LFxuICBzdHJva2U6IDIwLFxuICBjbG9zZVN0cm9rZTogMjEsXG4gIGZpbGw6IDIyLFxuICBlb0ZpbGw6IDIzLFxuICBmaWxsU3Ryb2tlOiAyNCxcbiAgZW9GaWxsU3Ryb2tlOiAyNSxcbiAgY2xvc2VGaWxsU3Ryb2tlOiAyNixcbiAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LFxuICBlbmRQYXRoOiAyOCxcbiAgY2xpcDogMjksXG4gIGVvQ2xpcDogMzAsXG4gIGJlZ2luVGV4dDogMzEsXG4gIGVuZFRleHQ6IDMyLFxuICBzZXRDaGFyU3BhY2luZzogMzMsXG4gIHNldFdvcmRTcGFjaW5nOiAzNCxcbiAgc2V0SFNjYWxlOiAzNSxcbiAgc2V0TGVhZGluZzogMzYsXG4gIHNldEZvbnQ6IDM3LFxuICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsXG4gIHNldFRleHRSaXNlOiAzOSxcbiAgbW92ZVRleHQ6IDQwLFxuICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLFxuICBzZXRUZXh0TWF0cml4OiA0MixcbiAgbmV4dExpbmU6IDQzLFxuICBzaG93VGV4dDogNDQsXG4gIHNob3dTcGFjZWRUZXh0OiA0NSxcbiAgbmV4dExpbmVTaG93VGV4dDogNDYsXG4gIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NyxcbiAgc2V0Q2hhcldpZHRoOiA0OCxcbiAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSxcbiAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsXG4gIHNldEZpbGxDb2xvclNwYWNlOiA1MSxcbiAgc2V0U3Ryb2tlQ29sb3I6IDUyLFxuICBzZXRTdHJva2VDb2xvck46IDUzLFxuICBzZXRGaWxsQ29sb3I6IDU0LFxuICBzZXRGaWxsQ29sb3JOOiA1NSxcbiAgc2V0U3Ryb2tlR3JheTogNTYsXG4gIHNldEZpbGxHcmF5OiA1NyxcbiAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LFxuICBzZXRGaWxsUkdCQ29sb3I6IDU5LFxuICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLFxuICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSxcbiAgc2hhZGluZ0ZpbGw6IDYyLFxuICBiZWdpbklubGluZUltYWdlOiA2MyxcbiAgYmVnaW5JbWFnZURhdGE6IDY0LFxuICBlbmRJbmxpbmVJbWFnZTogNjUsXG4gIHBhaW50WE9iamVjdDogNjYsXG4gIG1hcmtQb2ludDogNjcsXG4gIG1hcmtQb2ludFByb3BzOiA2OCxcbiAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSxcbiAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLFxuICBlbmRNYXJrZWRDb250ZW50OiA3MSxcbiAgYmVnaW5Db21wYXQ6IDcyLFxuICBlbmRDb21wYXQ6IDczLFxuICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LFxuICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSxcbiAgYmVnaW5Hcm91cDogNzYsXG4gIGVuZEdyb3VwOiA3NyxcbiAgYmVnaW5Bbm5vdGF0aW9uOiA4MCxcbiAgZW5kQW5ub3RhdGlvbjogODEsXG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogODMsXG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOiA4NCxcbiAgcGFpbnRJbWFnZVhPYmplY3Q6IDg1LFxuICBwYWludElubGluZUltYWdlWE9iamVjdDogODYsXG4gIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6IDg3LFxuICBwYWludEltYWdlWE9iamVjdFJlcGVhdDogODgsXG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDogODksXG4gIHBhaW50U29saWRDb2xvckltYWdlTWFzazogOTAsXG4gIGNvbnN0cnVjdFBhdGg6IDkxXG59O1xuY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7XG4gIE5FRURfUEFTU1dPUkQ6IDEsXG4gIElOQ09SUkVDVF9QQVNTV09SRDogMlxufTtcbmxldCB2ZXJib3NpdHkgPSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUztcbmZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKGxldmVsKSB7XG4gIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGxldmVsKSkge1xuICAgIHZlcmJvc2l0eSA9IGxldmVsO1xuICB9XG59XG5mdW5jdGlvbiBnZXRWZXJib3NpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIHZlcmJvc2l0eTtcbn1cbmZ1bmN0aW9uIGluZm8obXNnKSB7XG4gIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuSU5GT1MpIHtcbiAgICBjb25zb2xlLmxvZyhgSW5mbzogJHttc2d9YCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1MpIHtcbiAgICBjb25zb2xlLmxvZyhgV2FybmluZzogJHttc2d9YCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVucmVhY2hhYmxlKG1zZykge1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn1cbmZ1bmN0aW9uIGFzc2VydChjb25kLCBtc2cpIHtcbiAgaWYgKCFjb25kKSB7XG4gICAgdW5yZWFjaGFibGUobXNnKTtcbiAgfVxufVxuZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh1cmwpIHtcbiAgc3dpdGNoICh1cmw/LnByb3RvY29sKSB7XG4gICAgY2FzZSBcImh0dHA6XCI6XG4gICAgY2FzZSBcImh0dHBzOlwiOlxuICAgIGNhc2UgXCJmdHA6XCI6XG4gICAgY2FzZSBcIm1haWx0bzpcIjpcbiAgICBjYXNlIFwidGVsOlwiOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGJhc2VVcmwgPSBudWxsLCBvcHRpb25zID0gbnVsbCkge1xuICBpZiAoIXVybCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKG9wdGlvbnMuYWRkRGVmYXVsdFByb3RvY29sICYmIHVybC5zdGFydHNXaXRoKFwid3d3LlwiKSkge1xuICAgICAgICBjb25zdCBkb3RzID0gdXJsLm1hdGNoKC9cXC4vZyk7XG4gICAgICAgIGlmIChkb3RzPy5sZW5ndGggPj0gMikge1xuICAgICAgICAgIHVybCA9IGBodHRwOi8vJHt1cmx9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMudHJ5Q29udmVydEVuY29kaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdXJsID0gc3RyaW5nVG9VVEY4U3RyaW5nKHVybCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYWJzb2x1dGVVcmwgPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpO1xuICAgIGlmIChfaXNWYWxpZFByb3RvY29sKGFic29sdXRlVXJsKSkge1xuICAgICAgcmV0dXJuIGFic29sdXRlVXJsO1xuICAgIH1cbiAgfSBjYXRjaCB7fVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHNoYWRvdyhvYmosIHByb3AsIHZhbHVlLCBub25TZXJpYWxpemFibGUgPSBmYWxzZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7XG4gICAgdmFsdWUsXG4gICAgZW51bWVyYWJsZTogIW5vblNlcmlhbGl6YWJsZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCBCYXNlRXhjZXB0aW9uID0gZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbkNsb3N1cmUoKSB7XG4gIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSwgbmFtZSkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRXhjZXB0aW9uKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uXCIpO1xuICAgIH1cbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbiAgQmFzZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcbiAgQmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciA9IEJhc2VFeGNlcHRpb247XG4gIHJldHVybiBCYXNlRXhjZXB0aW9uO1xufSgpO1xuY2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnLCBjb2RlKSB7XG4gICAgc3VwZXIobXNnLCBcIlBhc3N3b3JkRXhjZXB0aW9uXCIpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbmNsYXNzIFVua25vd25FcnJvckV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIGRldGFpbHMpIHtcbiAgICBzdXBlcihtc2csIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCIpO1xuICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7XG4gIH1cbn1cbmNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIobXNnLCBcIkludmFsaWRQREZFeGNlcHRpb25cIik7XG4gIH1cbn1cbmNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIobXNnLCBcIk1pc3NpbmdQREZFeGNlcHRpb25cIik7XG4gIH1cbn1cbmNsYXNzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIHN0YXR1cykge1xuICAgIHN1cGVyKG1zZywgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIik7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gIH1cbn1cbmNsYXNzIEZvcm1hdEVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZykge1xuICAgIHN1cGVyKG1zZywgXCJGb3JtYXRFcnJvclwiKTtcbiAgfVxufVxuY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIobXNnLCBcIkFib3J0RXhjZXB0aW9uXCIpO1xuICB9XG59XG5mdW5jdGlvbiBieXRlc1RvU3RyaW5nKGJ5dGVzKSB7XG4gIGlmICh0eXBlb2YgYnl0ZXMgIT09IFwib2JqZWN0XCIgfHwgYnl0ZXM/Lmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdW5yZWFjaGFibGUoXCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nXCIpO1xuICB9XG4gIGNvbnN0IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcbiAgY29uc3QgTUFYX0FSR1VNRU5UX0NPVU5UID0gODE5MjtcbiAgaWYgKGxlbmd0aCA8IE1BWF9BUkdVTUVOVF9DT1VOVCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJ5dGVzKTtcbiAgfVxuICBjb25zdCBzdHJCdWYgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gTUFYX0FSR1VNRU5UX0NPVU5UKSB7XG4gICAgY29uc3QgY2h1bmtFbmQgPSBNYXRoLm1pbihpICsgTUFYX0FSR1VNRU5UX0NPVU5ULCBsZW5ndGgpO1xuICAgIGNvbnN0IGNodW5rID0gYnl0ZXMuc3ViYXJyYXkoaSwgY2h1bmtFbmQpO1xuICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTtcbiAgfVxuICByZXR1cm4gc3RyQnVmLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgIHVucmVhY2hhYmxlKFwiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlc1wiKTtcbiAgfVxuICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoO1xuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBieXRlc1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZjtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5mdW5jdGlvbiBzdHJpbmczMih2YWx1ZSkge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7XG59XG5mdW5jdGlvbiBvYmplY3RTaXplKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGg7XG59XG5mdW5jdGlvbiBvYmplY3RGcm9tTWFwKG1hcCkge1xuICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBtYXApIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpIHtcbiAgY29uc3QgYnVmZmVyOCA9IG5ldyBVaW50OEFycmF5KDQpO1xuICBidWZmZXI4WzBdID0gMTtcbiAgY29uc3QgdmlldzMyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcjguYnVmZmVyLCAwLCAxKTtcbiAgcmV0dXJuIHZpZXczMlswXSA9PT0gMTtcbn1cbmZ1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpIHtcbiAgdHJ5IHtcbiAgICBuZXcgRnVuY3Rpb24oXCJcIik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuY2xhc3MgdXRpbF9GZWF0dXJlVGVzdCB7XG4gIHN0YXRpYyBnZXQgaXNMaXR0bGVFbmRpYW4oKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzTGl0dGxlRW5kaWFuXCIsIGlzTGl0dGxlRW5kaWFuKCkpO1xuICB9XG4gIHN0YXRpYyBnZXQgaXNFdmFsU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc0V2YWxTdXBwb3J0ZWRcIiwgaXNFdmFsU3VwcG9ydGVkKCkpO1xuICB9XG4gIHN0YXRpYyBnZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkXCIsIHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09IFwidW5kZWZpbmVkXCIpO1xuICB9XG4gIHN0YXRpYyBnZXQgcGxhdGZvcm0oKSB7XG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIG5hdmlnYXRvcj8ucGxhdGZvcm0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJwbGF0Zm9ybVwiLCB7XG4gICAgICAgIGlzTWFjOiBuYXZpZ2F0b3IucGxhdGZvcm0uaW5jbHVkZXMoXCJNYWNcIilcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicGxhdGZvcm1cIiwge1xuICAgICAgaXNNYWM6IGZhbHNlXG4gICAgfSk7XG4gIH1cbiAgc3RhdGljIGdldCBpc0NTU1JvdW5kU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc0NTU1JvdW5kU3VwcG9ydGVkXCIsIGdsb2JhbFRoaXMuQ1NTPy5zdXBwb3J0cz8uKFwid2lkdGg6IHJvdW5kKDEuNXB4LCAxcHgpXCIpKTtcbiAgfVxufVxuY29uc3QgaGV4TnVtYmVycyA9IEFycmF5LmZyb20oQXJyYXkoMjU2KS5rZXlzKCksIG4gPT4gbi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKTtcbmNsYXNzIFV0aWwge1xuICBzdGF0aWMgbWFrZUhleENvbG9yKHIsIGcsIGIpIHtcbiAgICByZXR1cm4gYCMke2hleE51bWJlcnNbcl19JHtoZXhOdW1iZXJzW2ddfSR7aGV4TnVtYmVyc1tiXX1gO1xuICB9XG4gIHN0YXRpYyBzY2FsZU1pbk1heCh0cmFuc2Zvcm0sIG1pbk1heCkge1xuICAgIGxldCB0ZW1wO1xuICAgIGlmICh0cmFuc2Zvcm1bMF0pIHtcbiAgICAgIGlmICh0cmFuc2Zvcm1bMF0gPCAwKSB7XG4gICAgICAgIHRlbXAgPSBtaW5NYXhbMF07XG4gICAgICAgIG1pbk1heFswXSA9IG1pbk1heFsyXTtcbiAgICAgICAgbWluTWF4WzJdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIG1pbk1heFswXSAqPSB0cmFuc2Zvcm1bMF07XG4gICAgICBtaW5NYXhbMl0gKj0gdHJhbnNmb3JtWzBdO1xuICAgICAgaWYgKHRyYW5zZm9ybVszXSA8IDApIHtcbiAgICAgICAgdGVtcCA9IG1pbk1heFsxXTtcbiAgICAgICAgbWluTWF4WzFdID0gbWluTWF4WzNdO1xuICAgICAgICBtaW5NYXhbM10gPSB0ZW1wO1xuICAgICAgfVxuICAgICAgbWluTWF4WzFdICo9IHRyYW5zZm9ybVszXTtcbiAgICAgIG1pbk1heFszXSAqPSB0cmFuc2Zvcm1bM107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlbXAgPSBtaW5NYXhbMF07XG4gICAgICBtaW5NYXhbMF0gPSBtaW5NYXhbMV07XG4gICAgICBtaW5NYXhbMV0gPSB0ZW1wO1xuICAgICAgdGVtcCA9IG1pbk1heFsyXTtcbiAgICAgIG1pbk1heFsyXSA9IG1pbk1heFszXTtcbiAgICAgIG1pbk1heFszXSA9IHRlbXA7XG4gICAgICBpZiAodHJhbnNmb3JtWzFdIDwgMCkge1xuICAgICAgICB0ZW1wID0gbWluTWF4WzFdO1xuICAgICAgICBtaW5NYXhbMV0gPSBtaW5NYXhbM107XG4gICAgICAgIG1pbk1heFszXSA9IHRlbXA7XG4gICAgICB9XG4gICAgICBtaW5NYXhbMV0gKj0gdHJhbnNmb3JtWzFdO1xuICAgICAgbWluTWF4WzNdICo9IHRyYW5zZm9ybVsxXTtcbiAgICAgIGlmICh0cmFuc2Zvcm1bMl0gPCAwKSB7XG4gICAgICAgIHRlbXAgPSBtaW5NYXhbMF07XG4gICAgICAgIG1pbk1heFswXSA9IG1pbk1heFsyXTtcbiAgICAgICAgbWluTWF4WzJdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIG1pbk1heFswXSAqPSB0cmFuc2Zvcm1bMl07XG4gICAgICBtaW5NYXhbMl0gKj0gdHJhbnNmb3JtWzJdO1xuICAgIH1cbiAgICBtaW5NYXhbMF0gKz0gdHJhbnNmb3JtWzRdO1xuICAgIG1pbk1heFsxXSArPSB0cmFuc2Zvcm1bNV07XG4gICAgbWluTWF4WzJdICs9IHRyYW5zZm9ybVs0XTtcbiAgICBtaW5NYXhbM10gKz0gdHJhbnNmb3JtWzVdO1xuICB9XG4gIHN0YXRpYyB0cmFuc2Zvcm0obTEsIG0yKSB7XG4gICAgcmV0dXJuIFttMVswXSAqIG0yWzBdICsgbTFbMl0gKiBtMlsxXSwgbTFbMV0gKiBtMlswXSArIG0xWzNdICogbTJbMV0sIG0xWzBdICogbTJbMl0gKyBtMVsyXSAqIG0yWzNdLCBtMVsxXSAqIG0yWzJdICsgbTFbM10gKiBtMlszXSwgbTFbMF0gKiBtMls0XSArIG0xWzJdICogbTJbNV0gKyBtMVs0XSwgbTFbMV0gKiBtMls0XSArIG0xWzNdICogbTJbNV0gKyBtMVs1XV07XG4gIH1cbiAgc3RhdGljIGFwcGx5VHJhbnNmb3JtKHAsIG0pIHtcbiAgICBjb25zdCB4dCA9IHBbMF0gKiBtWzBdICsgcFsxXSAqIG1bMl0gKyBtWzRdO1xuICAgIGNvbnN0IHl0ID0gcFswXSAqIG1bMV0gKyBwWzFdICogbVszXSArIG1bNV07XG4gICAgcmV0dXJuIFt4dCwgeXRdO1xuICB9XG4gIHN0YXRpYyBhcHBseUludmVyc2VUcmFuc2Zvcm0ocCwgbSkge1xuICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdO1xuICAgIGNvbnN0IHh0ID0gKHBbMF0gKiBtWzNdIC0gcFsxXSAqIG1bMl0gKyBtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQ7XG4gICAgY29uc3QgeXQgPSAoLXBbMF0gKiBtWzFdICsgcFsxXSAqIG1bMF0gKyBtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQ7XG4gICAgcmV0dXJuIFt4dCwgeXRdO1xuICB9XG4gIHN0YXRpYyBnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChyLCBtKSB7XG4gICAgY29uc3QgcDEgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKHIsIG0pO1xuICAgIGNvbnN0IHAyID0gdGhpcy5hcHBseVRyYW5zZm9ybShyLnNsaWNlKDIsIDQpLCBtKTtcbiAgICBjb25zdCBwMyA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0oW3JbMF0sIHJbM11dLCBtKTtcbiAgICBjb25zdCBwNCA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0oW3JbMl0sIHJbMV1dLCBtKTtcbiAgICByZXR1cm4gW01hdGgubWluKHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5taW4ocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pLCBNYXRoLm1heChwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWF4KHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKV07XG4gIH1cbiAgc3RhdGljIGludmVyc2VUcmFuc2Zvcm0obSkge1xuICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdO1xuICAgIHJldHVybiBbbVszXSAvIGQsIC1tWzFdIC8gZCwgLW1bMl0gLyBkLCBtWzBdIC8gZCwgKG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZCwgKG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZF07XG4gIH1cbiAgc3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG0pIHtcbiAgICBjb25zdCB0cmFuc3Bvc2UgPSBbbVswXSwgbVsyXSwgbVsxXSwgbVszXV07XG4gICAgY29uc3QgYSA9IG1bMF0gKiB0cmFuc3Bvc2VbMF0gKyBtWzFdICogdHJhbnNwb3NlWzJdO1xuICAgIGNvbnN0IGIgPSBtWzBdICogdHJhbnNwb3NlWzFdICsgbVsxXSAqIHRyYW5zcG9zZVszXTtcbiAgICBjb25zdCBjID0gbVsyXSAqIHRyYW5zcG9zZVswXSArIG1bM10gKiB0cmFuc3Bvc2VbMl07XG4gICAgY29uc3QgZCA9IG1bMl0gKiB0cmFuc3Bvc2VbMV0gKyBtWzNdICogdHJhbnNwb3NlWzNdO1xuICAgIGNvbnN0IGZpcnN0ID0gKGEgKyBkKSAvIDI7XG4gICAgY29uc3Qgc2Vjb25kID0gTWF0aC5zcXJ0KChhICsgZCkgKiogMiAtIDQgKiAoYSAqIGQgLSBjICogYikpIC8gMjtcbiAgICBjb25zdCBzeCA9IGZpcnN0ICsgc2Vjb25kIHx8IDE7XG4gICAgY29uc3Qgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxO1xuICAgIHJldHVybiBbTWF0aC5zcXJ0KHN4KSwgTWF0aC5zcXJ0KHN5KV07XG4gIH1cbiAgc3RhdGljIG5vcm1hbGl6ZVJlY3QocmVjdCkge1xuICAgIGNvbnN0IHIgPSByZWN0LnNsaWNlKDApO1xuICAgIGlmIChyZWN0WzBdID4gcmVjdFsyXSkge1xuICAgICAgclswXSA9IHJlY3RbMl07XG4gICAgICByWzJdID0gcmVjdFswXTtcbiAgICB9XG4gICAgaWYgKHJlY3RbMV0gPiByZWN0WzNdKSB7XG4gICAgICByWzFdID0gcmVjdFszXTtcbiAgICAgIHJbM10gPSByZWN0WzFdO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICBzdGF0aWMgaW50ZXJzZWN0KHJlY3QxLCByZWN0Mikge1xuICAgIGNvbnN0IHhMb3cgPSBNYXRoLm1heChNYXRoLm1pbihyZWN0MVswXSwgcmVjdDFbMl0pLCBNYXRoLm1pbihyZWN0MlswXSwgcmVjdDJbMl0pKTtcbiAgICBjb25zdCB4SGlnaCA9IE1hdGgubWluKE1hdGgubWF4KHJlY3QxWzBdLCByZWN0MVsyXSksIE1hdGgubWF4KHJlY3QyWzBdLCByZWN0MlsyXSkpO1xuICAgIGlmICh4TG93ID4geEhpZ2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB5TG93ID0gTWF0aC5tYXgoTWF0aC5taW4ocmVjdDFbMV0sIHJlY3QxWzNdKSwgTWF0aC5taW4ocmVjdDJbMV0sIHJlY3QyWzNdKSk7XG4gICAgY29uc3QgeUhpZ2ggPSBNYXRoLm1pbihNYXRoLm1heChyZWN0MVsxXSwgcmVjdDFbM10pLCBNYXRoLm1heChyZWN0MlsxXSwgcmVjdDJbM10pKTtcbiAgICBpZiAoeUxvdyA+IHlIaWdoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIFt4TG93LCB5TG93LCB4SGlnaCwgeUhpZ2hdO1xuICB9XG4gIHN0YXRpYyAjZ2V0RXh0cmVtdW1PbkN1cnZlKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgdCwgbWluTWF4KSB7XG4gICAgaWYgKHQgPD0gMCB8fCB0ID49IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbXQgPSAxIC0gdDtcbiAgICBjb25zdCB0dCA9IHQgKiB0O1xuICAgIGNvbnN0IHR0dCA9IHR0ICogdDtcbiAgICBjb25zdCB4ID0gbXQgKiAobXQgKiAobXQgKiB4MCArIDMgKiB0ICogeDEpICsgMyAqIHR0ICogeDIpICsgdHR0ICogeDM7XG4gICAgY29uc3QgeSA9IG10ICogKG10ICogKG10ICogeTAgKyAzICogdCAqIHkxKSArIDMgKiB0dCAqIHkyKSArIHR0dCAqIHkzO1xuICAgIG1pbk1heFswXSA9IE1hdGgubWluKG1pbk1heFswXSwgeCk7XG4gICAgbWluTWF4WzFdID0gTWF0aC5taW4obWluTWF4WzFdLCB5KTtcbiAgICBtaW5NYXhbMl0gPSBNYXRoLm1heChtaW5NYXhbMl0sIHgpO1xuICAgIG1pbk1heFszXSA9IE1hdGgubWF4KG1pbk1heFszXSwgeSk7XG4gIH1cbiAgc3RhdGljICNnZXRFeHRyZW11bSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIGEsIGIsIGMsIG1pbk1heCkge1xuICAgIGlmIChNYXRoLmFicyhhKSA8IDFlLTEyKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoYikgPj0gMWUtMTIpIHtcbiAgICAgICAgdGhpcy4jZ2V0RXh0cmVtdW1PbkN1cnZlKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgLWMgLyBiLCBtaW5NYXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZWx0YSA9IGIgKiogMiAtIDQgKiBjICogYTtcbiAgICBpZiAoZGVsdGEgPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNxcnREZWx0YSA9IE1hdGguc3FydChkZWx0YSk7XG4gICAgY29uc3QgYTIgPSAyICogYTtcbiAgICB0aGlzLiNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCAoLWIgKyBzcXJ0RGVsdGEpIC8gYTIsIG1pbk1heCk7XG4gICAgdGhpcy4jZ2V0RXh0cmVtdW1PbkN1cnZlKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgKC1iIC0gc3FydERlbHRhKSAvIGEyLCBtaW5NYXgpO1xuICB9XG4gIHN0YXRpYyBiZXppZXJCb3VuZGluZ0JveCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIG1pbk1heCkge1xuICAgIGlmIChtaW5NYXgpIHtcbiAgICAgIG1pbk1heFswXSA9IE1hdGgubWluKG1pbk1heFswXSwgeDAsIHgzKTtcbiAgICAgIG1pbk1heFsxXSA9IE1hdGgubWluKG1pbk1heFsxXSwgeTAsIHkzKTtcbiAgICAgIG1pbk1heFsyXSA9IE1hdGgubWF4KG1pbk1heFsyXSwgeDAsIHgzKTtcbiAgICAgIG1pbk1heFszXSA9IE1hdGgubWF4KG1pbk1heFszXSwgeTAsIHkzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWluTWF4ID0gW01hdGgubWluKHgwLCB4MyksIE1hdGgubWluKHkwLCB5MyksIE1hdGgubWF4KHgwLCB4MyksIE1hdGgubWF4KHkwLCB5MyldO1xuICAgIH1cbiAgICB0aGlzLiNnZXRFeHRyZW11bSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIDMgKiAoLXgwICsgMyAqICh4MSAtIHgyKSArIHgzKSwgNiAqICh4MCAtIDIgKiB4MSArIHgyKSwgMyAqICh4MSAtIHgwKSwgbWluTWF4KTtcbiAgICB0aGlzLiNnZXRFeHRyZW11bSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIDMgKiAoLXkwICsgMyAqICh5MSAtIHkyKSArIHkzKSwgNiAqICh5MCAtIDIgKiB5MSArIHkyKSwgMyAqICh5MSAtIHkwKSwgbWluTWF4KTtcbiAgICByZXR1cm4gbWluTWF4O1xuICB9XG59XG5jb25zdCBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZSA9ICgvKiB1bnVzZWQgcHVyZSBleHByZXNzaW9uIG9yIHN1cGVyICovIG51bGwgJiYgKFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDJkOCwgMHgyYzcsIDB4MmM2LCAweDJkOSwgMHgyZGQsIDB4MmRiLCAweDJkYSwgMHgyZGMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LCAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNhLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFlLCAweDIwMWMsIDB4MjAxZCwgMHgyMDE4LCAweDIwMTksIDB4MjAxYSwgMHgyMTIyLCAweGZiMDEsIDB4ZmIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCwgMHgxNzgsIDB4MTdkLCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN2UsIDAsIDB4MjBhY10pKTtcbmZ1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHN0cikge1xuICBpZiAoc3RyWzBdID49IFwiXFx4RUZcIikge1xuICAgIGxldCBlbmNvZGluZztcbiAgICBpZiAoc3RyWzBdID09PSBcIlxceEZFXCIgJiYgc3RyWzFdID09PSBcIlxceEZGXCIpIHtcbiAgICAgIGVuY29kaW5nID0gXCJ1dGYtMTZiZVwiO1xuICAgICAgaWYgKHN0ci5sZW5ndGggJSAyID09PSAxKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zbGljZSgwLCAtMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdHJbMF0gPT09IFwiXFx4RkZcIiAmJiBzdHJbMV0gPT09IFwiXFx4RkVcIikge1xuICAgICAgZW5jb2RpbmcgPSBcInV0Zi0xNmxlXCI7XG4gICAgICBpZiAoc3RyLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0clswXSA9PT0gXCJcXHhFRlwiICYmIHN0clsxXSA9PT0gXCJcXHhCQlwiICYmIHN0clsyXSA9PT0gXCJcXHhCRlwiKSB7XG4gICAgICBlbmNvZGluZyA9IFwidXRmLThcIjtcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nLCB7XG4gICAgICAgICAgZmF0YWw6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmluZ1RvQnl0ZXMoc3RyKTtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlcik7XG4gICAgICAgIGlmICghZGVjb2RlZC5pbmNsdWRlcyhcIlxceDFiXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlY29kZWQucmVwbGFjZUFsbCgvXFx4MWJbXlxceDFiXSooPzpcXHgxYnwkKS9nLCBcIlwiKTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIHdhcm4oYHN0cmluZ1RvUERGU3RyaW5nOiBcIiR7ZXh9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHN0ckJ1ZiA9IFtdO1xuICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgIGNvbnN0IGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGNoYXJDb2RlID09PSAweDFiKSB7XG4gICAgICB3aGlsZSAoKytpIDwgaWkgJiYgc3RyLmNoYXJDb2RlQXQoaSkgIT09IDB4MWIpIHt9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY29kZSA9IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlW2NoYXJDb2RlXTtcbiAgICBzdHJCdWYucHVzaChjb2RlID8gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSA6IHN0ci5jaGFyQXQoaSkpO1xuICB9XG4gIHJldHVybiBzdHJCdWYuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyhzdHIpIHtcbiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3RyKSk7XG59XG5mdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcoc3RyKSB7XG4gIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG59XG5mdW5jdGlvbiBpc0FycmF5RXF1YWwoYXJyMSwgYXJyMikge1xuICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAwLCBpaSA9IGFycjEubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgIGlmIChhcnIxW2ldICE9PSBhcnIyW2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZShkYXRlID0gbmV3IERhdGUoKSkge1xuICBjb25zdCBidWZmZXIgPSBbZGF0ZS5nZXRVVENGdWxsWWVhcigpLnRvU3RyaW5nKCksIChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgZGF0ZS5nZXRVVENEYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksIGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgZGF0ZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksIGRhdGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpXTtcbiAgcmV0dXJuIGJ1ZmZlci5qb2luKFwiXCIpO1xufVxubGV0IE5vcm1hbGl6ZVJlZ2V4ID0gbnVsbDtcbmxldCBOb3JtYWxpemF0aW9uTWFwID0gbnVsbDtcbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaWNvZGUoc3RyKSB7XG4gIGlmICghTm9ybWFsaXplUmVnZXgpIHtcbiAgICBOb3JtYWxpemVSZWdleCA9IC8oW1xcdTAwYTBcXHUwMGI1XFx1MDM3ZVxcdTBlYjNcXHUyMDAwLVxcdTIwMGFcXHUyMDJmXFx1MjEyNlxcdWZiMDAtXFx1ZmIwNFxcdWZiMDZcXHVmYjIwLVxcdWZiMzZcXHVmYjM4LVxcdWZiM2NcXHVmYjNlXFx1ZmI0MC1cXHVmYjQxXFx1ZmI0My1cXHVmYjQ0XFx1ZmI0Ni1cXHVmYmExXFx1ZmJhNC1cXHVmYmE5XFx1ZmJhZS1cXHVmYmIxXFx1ZmJkMy1cXHVmYmRjXFx1ZmJkZS1cXHVmYmU3XFx1ZmJlYS1cXHVmYmY4XFx1ZmJmYy1cXHVmYmZkXFx1ZmMwMC1cXHVmYzVkXFx1ZmM2NC1cXHVmY2YxXFx1ZmNmNS1cXHVmZDNkXFx1ZmQ4OFxcdWZkZjRcXHVmZGZhLVxcdWZkZmJcXHVmZTcxXFx1ZmU3N1xcdWZlNzlcXHVmZTdiXFx1ZmU3ZF0rKXwoXFx1ZmIwNSspL2d1O1xuICAgIE5vcm1hbGl6YXRpb25NYXAgPSBuZXcgTWFwKFtbXCLvrIVcIiwgXCLFv3RcIl1dKTtcbiAgfVxuICByZXR1cm4gc3RyLnJlcGxhY2VBbGwoTm9ybWFsaXplUmVnZXgsIChfLCBwMSwgcDIpID0+IHAxID8gcDEubm9ybWFsaXplKFwiTkZLQ1wiKSA6IE5vcm1hbGl6YXRpb25NYXAuZ2V0KHAyKSk7XG59XG5mdW5jdGlvbiBnZXRVdWlkKCkge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgY3J5cHRvPy5yYW5kb21VVUlEID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfVxuICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheSgzMik7XG4gIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjcnlwdG8/LmdldFJhbmRvbVZhbHVlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhidWYpO1xuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzI7IGkrKykge1xuICAgICAgYnVmW2ldID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU1KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoYnVmKTtcbn1cbmNvbnN0IEFubm90YXRpb25QcmVmaXggPSBcInBkZmpzX2ludGVybmFsX2lkX1wiO1xuY29uc3QgRm9udFJlbmRlck9wcyA9IHtcbiAgQkVaSUVSX0NVUlZFX1RPOiAwLFxuICBNT1ZFX1RPOiAxLFxuICBMSU5FX1RPOiAyLFxuICBRVUFEUkFUSUNfQ1VSVkVfVE86IDMsXG4gIFJFU1RPUkU6IDQsXG4gIFNBVkU6IDUsXG4gIFNDQUxFOiA2LFxuICBUUkFOU0ZPUk06IDcsXG4gIFRSQU5TTEFURTogOFxufTtcblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvYmFzZV9mYWN0b3J5LmpzXG5cbmNsYXNzIEJhc2VGaWx0ZXJGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VGaWx0ZXJGYWN0b3J5KSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VGaWx0ZXJGYWN0b3J5LlwiKTtcbiAgICB9XG4gIH1cbiAgYWRkRmlsdGVyKG1hcHMpIHtcbiAgICByZXR1cm4gXCJub25lXCI7XG4gIH1cbiAgYWRkSENNRmlsdGVyKGZnQ29sb3IsIGJnQ29sb3IpIHtcbiAgICByZXR1cm4gXCJub25lXCI7XG4gIH1cbiAgYWRkQWxwaGFGaWx0ZXIobWFwKSB7XG4gICAgcmV0dXJuIFwibm9uZVwiO1xuICB9XG4gIGFkZEx1bWlub3NpdHlGaWx0ZXIobWFwKSB7XG4gICAgcmV0dXJuIFwibm9uZVwiO1xuICB9XG4gIGFkZEhpZ2hsaWdodEhDTUZpbHRlcihmaWx0ZXJOYW1lLCBmZ0NvbG9yLCBiZ0NvbG9yLCBuZXdGZ0NvbG9yLCBuZXdCZ0NvbG9yKSB7XG4gICAgcmV0dXJuIFwibm9uZVwiO1xuICB9XG4gIGRlc3Ryb3koa2VlcEhDTSA9IGZhbHNlKSB7fVxufVxuY2xhc3MgQmFzZUNhbnZhc0ZhY3Rvcnkge1xuICAjZW5hYmxlSFdBID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBlbmFibGVIV0EgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUNhbnZhc0ZhY3RvcnkpIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUNhbnZhc0ZhY3RvcnkuXCIpO1xuICAgIH1cbiAgICB0aGlzLiNlbmFibGVIV0EgPSBlbmFibGVIV0E7XG4gIH1cbiAgY3JlYXRlKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjYW52YXMgc2l6ZVwiKTtcbiAgICB9XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5fY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuICAgIHJldHVybiB7XG4gICAgICBjYW52YXMsXG4gICAgICBjb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIsIHtcbiAgICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiAhdGhpcy4jZW5hYmxlSFdBXG4gICAgICB9KVxuICAgIH07XG4gIH1cbiAgcmVzZXQoY2FudmFzQW5kQ29udGV4dCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGlmICghY2FudmFzQW5kQ29udGV4dC5jYW52YXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbnZhcyBpcyBub3Qgc3BlY2lmaWVkXCIpO1xuICAgIH1cbiAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjYW52YXMgc2l6ZVwiKTtcbiAgICB9XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbiAgZGVzdHJveShjYW52YXNBbmRDb250ZXh0KSB7XG4gICAgaWYgKCFjYW52YXNBbmRDb250ZXh0LmNhbnZhcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWRcIik7XG4gICAgfVxuICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLndpZHRoID0gMDtcbiAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSAwO1xuICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzID0gbnVsbDtcbiAgICBjYW52YXNBbmRDb250ZXh0LmNvbnRleHQgPSBudWxsO1xuICB9XG4gIF9jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBfY3JlYXRlQ2FudmFzYCBjYWxsZWQuXCIpO1xuICB9XG59XG5jbGFzcyBCYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgYmFzZVVybCA9IG51bGwsXG4gICAgaXNDb21wcmVzc2VkID0gdHJ1ZVxuICB9KSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VDTWFwUmVhZGVyRmFjdG9yeSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlQ01hcFJlYWRlckZhY3RvcnkuXCIpO1xuICAgIH1cbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuICAgIHRoaXMuaXNDb21wcmVzc2VkID0gaXNDb21wcmVzc2VkO1xuICB9XG4gIGFzeW5jIGZldGNoKHtcbiAgICBuYW1lXG4gIH0pIHtcbiAgICBpZiAoIXRoaXMuYmFzZVVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQ01hcCBcImJhc2VVcmxcIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0ICcgKyAndGhlIFwiY01hcFVybFwiIGFuZCBcImNNYXBQYWNrZWRcIiBBUEkgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQuJyk7XG4gICAgfVxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ01hcCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLlwiKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy5iYXNlVXJsICsgbmFtZSArICh0aGlzLmlzQ29tcHJlc3NlZCA/IFwiLmJjbWFwXCIgOiBcIlwiKTtcbiAgICBjb25zdCBjb21wcmVzc2lvblR5cGUgPSB0aGlzLmlzQ29tcHJlc3NlZCA/IENNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZIDogQ01hcENvbXByZXNzaW9uVHlwZS5OT05FO1xuICAgIHJldHVybiB0aGlzLl9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkICR7dGhpcy5pc0NvbXByZXNzZWQgPyBcImJpbmFyeSBcIiA6IFwiXCJ9Q01hcCBhdDogJHt1cmx9YCk7XG4gICAgfSk7XG4gIH1cbiAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBfZmV0Y2hEYXRhYCBjYWxsZWQuXCIpO1xuICB9XG59XG5jbGFzcyBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgYmFzZVVybCA9IG51bGxcbiAgfSkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkpIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5LlwiKTtcbiAgICB9XG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybDtcbiAgfVxuICBhc3luYyBmZXRjaCh7XG4gICAgZmlsZW5hbWVcbiAgfSkge1xuICAgIGlmICghdGhpcy5iYXNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzdGFuZGFyZCBmb250IFwiYmFzZVVybFwiIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCwgZW5zdXJlIHRoYXQgJyArICd0aGUgXCJzdGFuZGFyZEZvbnREYXRhVXJsXCIgQVBJIHBhcmFtZXRlciBpcyBwcm92aWRlZC4nKTtcbiAgICB9XG4gICAgaWYgKCFmaWxlbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRm9udCBmaWxlbmFtZSBtdXN0IGJlIHNwZWNpZmllZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYmFzZVVybH0ke2ZpbGVuYW1lfWA7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoRGF0YSh1cmwpLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZvbnQgZGF0YSBhdDogJHt1cmx9YCk7XG4gICAgfSk7XG4gIH1cbiAgX2ZldGNoRGF0YSh1cmwpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLlwiKTtcbiAgfVxufVxuY2xhc3MgQmFzZVNWR0ZhY3Rvcnkge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVNWR0ZhY3RvcnkpIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNWR0ZhY3RvcnkuXCIpO1xuICAgIH1cbiAgfVxuICBjcmVhdGUod2lkdGgsIGhlaWdodCwgc2tpcERpbWVuc2lvbnMgPSBmYWxzZSkge1xuICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNWRyBkaW1lbnNpb25zXCIpO1xuICAgIH1cbiAgICBjb25zdCBzdmcgPSB0aGlzLl9jcmVhdGVTVkcoXCJzdmc6c3ZnXCIpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICAgIGlmICghc2tpcERpbWVuc2lvbnMpIHtcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1weGApO1xuICAgICAgc3ZnLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHR9cHhgKTtcbiAgICB9XG4gICAgc3ZnLnNldEF0dHJpYnV0ZShcInByZXNlcnZlQXNwZWN0UmF0aW9cIiwgXCJub25lXCIpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gICAgcmV0dXJuIHN2ZztcbiAgfVxuICBjcmVhdGVFbGVtZW50KHR5cGUpIHtcbiAgICBpZiAodHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgU1ZHIGVsZW1lbnQgdHlwZVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVNWRyh0eXBlKTtcbiAgfVxuICBfY3JlYXRlU1ZHKHR5cGUpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgX2NyZWF0ZVNWR2AgY2FsbGVkLlwiKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9kaXNwbGF5X3V0aWxzLmpzXG5cblxuY29uc3QgU1ZHX05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuY2xhc3MgUGl4ZWxzUGVySW5jaCB7XG4gIHN0YXRpYyBDU1MgPSA5Ni4wO1xuICBzdGF0aWMgUERGID0gNzIuMDtcbiAgc3RhdGljIFBERl9UT19DU1NfVU5JVFMgPSB0aGlzLkNTUyAvIHRoaXMuUERGO1xufVxuY2xhc3MgRE9NRmlsdGVyRmFjdG9yeSBleHRlbmRzIEJhc2VGaWx0ZXJGYWN0b3J5IHtcbiAgI19jYWNoZTtcbiAgI19kZWZzO1xuICAjZG9jSWQ7XG4gICNkb2N1bWVudDtcbiAgI19oY21DYWNoZTtcbiAgI2lkID0gMDtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGRvY0lkLFxuICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50XG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jZG9jSWQgPSBkb2NJZDtcbiAgICB0aGlzLiNkb2N1bWVudCA9IG93bmVyRG9jdW1lbnQ7XG4gIH1cbiAgZ2V0ICNjYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NhY2hlIHx8PSBuZXcgTWFwKCk7XG4gIH1cbiAgZ2V0ICNoY21DYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jX2hjbUNhY2hlIHx8PSBuZXcgTWFwKCk7XG4gIH1cbiAgZ2V0ICNkZWZzKCkge1xuICAgIGlmICghdGhpcy4jX2RlZnMpIHtcbiAgICAgIGNvbnN0IGRpdiA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0eWxlXG4gICAgICB9ID0gZGl2O1xuICAgICAgc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICBzdHlsZS5jb250YWluID0gXCJzdHJpY3RcIjtcbiAgICAgIHN0eWxlLndpZHRoID0gc3R5bGUuaGVpZ2h0ID0gMDtcbiAgICAgIHN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgc3R5bGUudG9wID0gc3R5bGUubGVmdCA9IDA7XG4gICAgICBzdHlsZS56SW5kZXggPSAtMTtcbiAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICAgICAgc3ZnLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIDApO1xuICAgICAgc3ZnLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCAwKTtcbiAgICAgIHRoaXMuI19kZWZzID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJkZWZzXCIpO1xuICAgICAgZGl2LmFwcGVuZChzdmcpO1xuICAgICAgc3ZnLmFwcGVuZCh0aGlzLiNfZGVmcyk7XG4gICAgICB0aGlzLiNkb2N1bWVudC5ib2R5LmFwcGVuZChkaXYpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jX2RlZnM7XG4gIH1cbiAgI2NyZWF0ZVRhYmxlcyhtYXBzKSB7XG4gICAgaWYgKG1hcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBtYXBSID0gbWFwc1swXTtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheSgyNTYpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICAgICAgICBidWZmZXJbaV0gPSBtYXBSW2ldIC8gMjU1O1xuICAgICAgfVxuICAgICAgY29uc3QgdGFibGUgPSBidWZmZXIuam9pbihcIixcIik7XG4gICAgICByZXR1cm4gW3RhYmxlLCB0YWJsZSwgdGFibGVdO1xuICAgIH1cbiAgICBjb25zdCBbbWFwUiwgbWFwRywgbWFwQl0gPSBtYXBzO1xuICAgIGNvbnN0IGJ1ZmZlclIgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICBjb25zdCBidWZmZXJHID0gbmV3IEFycmF5KDI1Nik7XG4gICAgY29uc3QgYnVmZmVyQiA9IG5ldyBBcnJheSgyNTYpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgICAgIGJ1ZmZlclJbaV0gPSBtYXBSW2ldIC8gMjU1O1xuICAgICAgYnVmZmVyR1tpXSA9IG1hcEdbaV0gLyAyNTU7XG4gICAgICBidWZmZXJCW2ldID0gbWFwQltpXSAvIDI1NTtcbiAgICB9XG4gICAgcmV0dXJuIFtidWZmZXJSLmpvaW4oXCIsXCIpLCBidWZmZXJHLmpvaW4oXCIsXCIpLCBidWZmZXJCLmpvaW4oXCIsXCIpXTtcbiAgfVxuICBhZGRGaWx0ZXIobWFwcykge1xuICAgIGlmICghbWFwcykge1xuICAgICAgcmV0dXJuIFwibm9uZVwiO1xuICAgIH1cbiAgICBsZXQgdmFsdWUgPSB0aGlzLiNjYWNoZS5nZXQobWFwcyk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IFt0YWJsZVIsIHRhYmxlRywgdGFibGVCXSA9IHRoaXMuI2NyZWF0ZVRhYmxlcyhtYXBzKTtcbiAgICBjb25zdCBrZXkgPSBtYXBzLmxlbmd0aCA9PT0gMSA/IHRhYmxlUiA6IGAke3RhYmxlUn0ke3RhYmxlR30ke3RhYmxlQn1gO1xuICAgIHZhbHVlID0gdGhpcy4jY2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLiNjYWNoZS5zZXQobWFwcywgdmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGBnXyR7dGhpcy4jZG9jSWR9X3RyYW5zZmVyX21hcF8ke3RoaXMuI2lkKyt9YDtcbiAgICBjb25zdCB1cmwgPSBgdXJsKCMke2lkfSlgO1xuICAgIHRoaXMuI2NhY2hlLnNldChtYXBzLCB1cmwpO1xuICAgIHRoaXMuI2NhY2hlLnNldChrZXksIHVybCk7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy4jY3JlYXRlRmlsdGVyKGlkKTtcbiAgICB0aGlzLiNhZGRUcmFuc2Zlck1hcENvbnZlcnNpb24odGFibGVSLCB0YWJsZUcsIHRhYmxlQiwgZmlsdGVyKTtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIGFkZEhDTUZpbHRlcihmZ0NvbG9yLCBiZ0NvbG9yKSB7XG4gICAgY29uc3Qga2V5ID0gYCR7ZmdDb2xvcn0tJHtiZ0NvbG9yfWA7XG4gICAgY29uc3QgZmlsdGVyTmFtZSA9IFwiYmFzZVwiO1xuICAgIGxldCBpbmZvID0gdGhpcy4jaGNtQ2FjaGUuZ2V0KGZpbHRlck5hbWUpO1xuICAgIGlmIChpbmZvPy5rZXkgPT09IGtleSkge1xuICAgICAgcmV0dXJuIGluZm8udXJsO1xuICAgIH1cbiAgICBpZiAoaW5mbykge1xuICAgICAgaW5mby5maWx0ZXI/LnJlbW92ZSgpO1xuICAgICAgaW5mby5rZXkgPSBrZXk7XG4gICAgICBpbmZvLnVybCA9IFwibm9uZVwiO1xuICAgICAgaW5mby5maWx0ZXIgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmZvID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIHVybDogXCJub25lXCIsXG4gICAgICAgIGZpbHRlcjogbnVsbFxuICAgICAgfTtcbiAgICAgIHRoaXMuI2hjbUNhY2hlLnNldChmaWx0ZXJOYW1lLCBpbmZvKTtcbiAgICB9XG4gICAgaWYgKCFmZ0NvbG9yIHx8ICFiZ0NvbG9yKSB7XG4gICAgICByZXR1cm4gaW5mby51cmw7XG4gICAgfVxuICAgIGNvbnN0IGZnUkdCID0gdGhpcy4jZ2V0UkdCKGZnQ29sb3IpO1xuICAgIGZnQ29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5mZ1JHQik7XG4gICAgY29uc3QgYmdSR0IgPSB0aGlzLiNnZXRSR0IoYmdDb2xvcik7XG4gICAgYmdDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKC4uLmJnUkdCKTtcbiAgICB0aGlzLiNkZWZzLnN0eWxlLmNvbG9yID0gXCJcIjtcbiAgICBpZiAoZmdDb2xvciA9PT0gXCIjMDAwMDAwXCIgJiYgYmdDb2xvciA9PT0gXCIjZmZmZmZmXCIgfHwgZmdDb2xvciA9PT0gYmdDb2xvcikge1xuICAgICAgcmV0dXJuIGluZm8udXJsO1xuICAgIH1cbiAgICBjb25zdCBtYXAgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAyNTU7IGkrKykge1xuICAgICAgY29uc3QgeCA9IGkgLyAyNTU7XG4gICAgICBtYXBbaV0gPSB4IDw9IDAuMDM5MjggPyB4IC8gMTIuOTIgOiAoKHggKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40O1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IG1hcC5qb2luKFwiLFwiKTtcbiAgICBjb25zdCBpZCA9IGBnXyR7dGhpcy4jZG9jSWR9X2hjbV9maWx0ZXJgO1xuICAgIGNvbnN0IGZpbHRlciA9IGluZm8uZmlsdGVyID0gdGhpcy4jY3JlYXRlRmlsdGVyKGlkKTtcbiAgICB0aGlzLiNhZGRUcmFuc2Zlck1hcENvbnZlcnNpb24odGFibGUsIHRhYmxlLCB0YWJsZSwgZmlsdGVyKTtcbiAgICB0aGlzLiNhZGRHcmF5Q29udmVyc2lvbihmaWx0ZXIpO1xuICAgIGNvbnN0IGdldFN0ZXBzID0gKGMsIG4pID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gZmdSR0JbY10gLyAyNTU7XG4gICAgICBjb25zdCBlbmQgPSBiZ1JHQltjXSAvIDI1NTtcbiAgICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShuICsgMSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBuOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gc3RhcnQgKyBpIC8gbiAqIChlbmQgLSBzdGFydCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyLmpvaW4oXCIsXCIpO1xuICAgIH07XG4gICAgdGhpcy4jYWRkVHJhbnNmZXJNYXBDb252ZXJzaW9uKGdldFN0ZXBzKDAsIDUpLCBnZXRTdGVwcygxLCA1KSwgZ2V0U3RlcHMoMiwgNSksIGZpbHRlcik7XG4gICAgaW5mby51cmwgPSBgdXJsKCMke2lkfSlgO1xuICAgIHJldHVybiBpbmZvLnVybDtcbiAgfVxuICBhZGRBbHBoYUZpbHRlcihtYXApIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLiNjYWNoZS5nZXQobWFwKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgW3RhYmxlQV0gPSB0aGlzLiNjcmVhdGVUYWJsZXMoW21hcF0pO1xuICAgIGNvbnN0IGtleSA9IGBhbHBoYV8ke3RhYmxlQX1gO1xuICAgIHZhbHVlID0gdGhpcy4jY2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLiNjYWNoZS5zZXQobWFwLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1fYWxwaGFfbWFwXyR7dGhpcy4jaWQrK31gO1xuICAgIGNvbnN0IHVybCA9IGB1cmwoIyR7aWR9KWA7XG4gICAgdGhpcy4jY2FjaGUuc2V0KG1hcCwgdXJsKTtcbiAgICB0aGlzLiNjYWNoZS5zZXQoa2V5LCB1cmwpO1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuI2NyZWF0ZUZpbHRlcihpZCk7XG4gICAgdGhpcy4jYWRkVHJhbnNmZXJNYXBBbHBoYUNvbnZlcnNpb24odGFibGVBLCBmaWx0ZXIpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgYWRkTHVtaW5vc2l0eUZpbHRlcihtYXApIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLiNjYWNoZS5nZXQobWFwIHx8IFwibHVtaW5vc2l0eVwiKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgbGV0IHRhYmxlQSwga2V5O1xuICAgIGlmIChtYXApIHtcbiAgICAgIFt0YWJsZUFdID0gdGhpcy4jY3JlYXRlVGFibGVzKFttYXBdKTtcbiAgICAgIGtleSA9IGBsdW1pbm9zaXR5XyR7dGFibGVBfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleSA9IFwibHVtaW5vc2l0eVwiO1xuICAgIH1cbiAgICB2YWx1ZSA9IHRoaXMuI2NhY2hlLmdldChrZXkpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy4jY2FjaGUuc2V0KG1hcCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGBnXyR7dGhpcy4jZG9jSWR9X2x1bWlub3NpdHlfbWFwXyR7dGhpcy4jaWQrK31gO1xuICAgIGNvbnN0IHVybCA9IGB1cmwoIyR7aWR9KWA7XG4gICAgdGhpcy4jY2FjaGUuc2V0KG1hcCwgdXJsKTtcbiAgICB0aGlzLiNjYWNoZS5zZXQoa2V5LCB1cmwpO1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuI2NyZWF0ZUZpbHRlcihpZCk7XG4gICAgdGhpcy4jYWRkTHVtaW5vc2l0eUNvbnZlcnNpb24oZmlsdGVyKTtcbiAgICBpZiAobWFwKSB7XG4gICAgICB0aGlzLiNhZGRUcmFuc2Zlck1hcEFscGhhQ29udmVyc2lvbih0YWJsZUEsIGZpbHRlcik7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0SENNRmlsdGVyKGZpbHRlck5hbWUsIGZnQ29sb3IsIGJnQ29sb3IsIG5ld0ZnQ29sb3IsIG5ld0JnQ29sb3IpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtmZ0NvbG9yfS0ke2JnQ29sb3J9LSR7bmV3RmdDb2xvcn0tJHtuZXdCZ0NvbG9yfWA7XG4gICAgbGV0IGluZm8gPSB0aGlzLiNoY21DYWNoZS5nZXQoZmlsdGVyTmFtZSk7XG4gICAgaWYgKGluZm8/LmtleSA9PT0ga2V5KSB7XG4gICAgICByZXR1cm4gaW5mby51cmw7XG4gICAgfVxuICAgIGlmIChpbmZvKSB7XG4gICAgICBpbmZvLmZpbHRlcj8ucmVtb3ZlKCk7XG4gICAgICBpbmZvLmtleSA9IGtleTtcbiAgICAgIGluZm8udXJsID0gXCJub25lXCI7XG4gICAgICBpbmZvLmZpbHRlciA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZm8gPSB7XG4gICAgICAgIGtleSxcbiAgICAgICAgdXJsOiBcIm5vbmVcIixcbiAgICAgICAgZmlsdGVyOiBudWxsXG4gICAgICB9O1xuICAgICAgdGhpcy4jaGNtQ2FjaGUuc2V0KGZpbHRlck5hbWUsIGluZm8pO1xuICAgIH1cbiAgICBpZiAoIWZnQ29sb3IgfHwgIWJnQ29sb3IpIHtcbiAgICAgIHJldHVybiBpbmZvLnVybDtcbiAgICB9XG4gICAgY29uc3QgW2ZnUkdCLCBiZ1JHQl0gPSBbZmdDb2xvciwgYmdDb2xvcl0ubWFwKHRoaXMuI2dldFJHQi5iaW5kKHRoaXMpKTtcbiAgICBsZXQgZmdHcmF5ID0gTWF0aC5yb3VuZCgwLjIxMjYgKiBmZ1JHQlswXSArIDAuNzE1MiAqIGZnUkdCWzFdICsgMC4wNzIyICogZmdSR0JbMl0pO1xuICAgIGxldCBiZ0dyYXkgPSBNYXRoLnJvdW5kKDAuMjEyNiAqIGJnUkdCWzBdICsgMC43MTUyICogYmdSR0JbMV0gKyAwLjA3MjIgKiBiZ1JHQlsyXSk7XG4gICAgbGV0IFtuZXdGZ1JHQiwgbmV3QmdSR0JdID0gW25ld0ZnQ29sb3IsIG5ld0JnQ29sb3JdLm1hcCh0aGlzLiNnZXRSR0IuYmluZCh0aGlzKSk7XG4gICAgaWYgKGJnR3JheSA8IGZnR3JheSkge1xuICAgICAgW2ZnR3JheSwgYmdHcmF5LCBuZXdGZ1JHQiwgbmV3QmdSR0JdID0gW2JnR3JheSwgZmdHcmF5LCBuZXdCZ1JHQiwgbmV3RmdSR0JdO1xuICAgIH1cbiAgICB0aGlzLiNkZWZzLnN0eWxlLmNvbG9yID0gXCJcIjtcbiAgICBjb25zdCBnZXRTdGVwcyA9IChmZywgYmcsIG4pID0+IHtcbiAgICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheSgyNTYpO1xuICAgICAgY29uc3Qgc3RlcCA9IChiZ0dyYXkgLSBmZ0dyYXkpIC8gbjtcbiAgICAgIGNvbnN0IG5ld1N0YXJ0ID0gZmcgLyAyNTU7XG4gICAgICBjb25zdCBuZXdTdGVwID0gKGJnIC0gZmcpIC8gKDI1NSAqIG4pO1xuICAgICAgbGV0IHByZXYgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGsgPSBNYXRoLnJvdW5kKGZnR3JheSArIGkgKiBzdGVwKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXdTdGFydCArIGkgKiBuZXdTdGVwO1xuICAgICAgICBmb3IgKGxldCBqID0gcHJldjsgaiA8PSBrOyBqKyspIHtcbiAgICAgICAgICBhcnJbal0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2ID0gayArIDE7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gcHJldjsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IGFycltwcmV2IC0gMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyLmpvaW4oXCIsXCIpO1xuICAgIH07XG4gICAgY29uc3QgaWQgPSBgZ18ke3RoaXMuI2RvY0lkfV9oY21fJHtmaWx0ZXJOYW1lfV9maWx0ZXJgO1xuICAgIGNvbnN0IGZpbHRlciA9IGluZm8uZmlsdGVyID0gdGhpcy4jY3JlYXRlRmlsdGVyKGlkKTtcbiAgICB0aGlzLiNhZGRHcmF5Q29udmVyc2lvbihmaWx0ZXIpO1xuICAgIHRoaXMuI2FkZFRyYW5zZmVyTWFwQ29udmVyc2lvbihnZXRTdGVwcyhuZXdGZ1JHQlswXSwgbmV3QmdSR0JbMF0sIDUpLCBnZXRTdGVwcyhuZXdGZ1JHQlsxXSwgbmV3QmdSR0JbMV0sIDUpLCBnZXRTdGVwcyhuZXdGZ1JHQlsyXSwgbmV3QmdSR0JbMl0sIDUpLCBmaWx0ZXIpO1xuICAgIGluZm8udXJsID0gYHVybCgjJHtpZH0pYDtcbiAgICByZXR1cm4gaW5mby51cmw7XG4gIH1cbiAgZGVzdHJveShrZWVwSENNID0gZmFsc2UpIHtcbiAgICBpZiAoa2VlcEhDTSAmJiB0aGlzLiNoY21DYWNoZS5zaXplICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiNfZGVmcykge1xuICAgICAgdGhpcy4jX2RlZnMucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZSgpO1xuICAgICAgdGhpcy4jX2RlZnMgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy4jX2NhY2hlKSB7XG4gICAgICB0aGlzLiNfY2FjaGUuY2xlYXIoKTtcbiAgICAgIHRoaXMuI19jYWNoZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuI2lkID0gMDtcbiAgfVxuICAjYWRkTHVtaW5vc2l0eUNvbnZlcnNpb24oZmlsdGVyKSB7XG4gICAgY29uc3QgZmVDb2xvck1hdHJpeCA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmVDb2xvck1hdHJpeFwiKTtcbiAgICBmZUNvbG9yTWF0cml4LnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJtYXRyaXhcIik7XG4gICAgZmVDb2xvck1hdHJpeC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZXNcIiwgXCIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwLjMgMC41OSAwLjExIDAgMFwiKTtcbiAgICBmaWx0ZXIuYXBwZW5kKGZlQ29sb3JNYXRyaXgpO1xuICB9XG4gICNhZGRHcmF5Q29udmVyc2lvbihmaWx0ZXIpIHtcbiAgICBjb25zdCBmZUNvbG9yTWF0cml4ID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJmZUNvbG9yTWF0cml4XCIpO1xuICAgIGZlQ29sb3JNYXRyaXguc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcIm1hdHJpeFwiKTtcbiAgICBmZUNvbG9yTWF0cml4LnNldEF0dHJpYnV0ZShcInZhbHVlc1wiLCBcIjAuMjEyNiAwLjcxNTIgMC4wNzIyIDAgMCAwLjIxMjYgMC43MTUyIDAuMDcyMiAwIDAgMC4yMTI2IDAuNzE1MiAwLjA3MjIgMCAwIDAgMCAwIDEgMFwiKTtcbiAgICBmaWx0ZXIuYXBwZW5kKGZlQ29sb3JNYXRyaXgpO1xuICB9XG4gICNjcmVhdGVGaWx0ZXIoaWQpIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZpbHRlclwiKTtcbiAgICBmaWx0ZXIuc2V0QXR0cmlidXRlKFwiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzXCIsIFwic1JHQlwiKTtcbiAgICBmaWx0ZXIuc2V0QXR0cmlidXRlKFwiaWRcIiwgaWQpO1xuICAgIHRoaXMuI2RlZnMuYXBwZW5kKGZpbHRlcik7XG4gICAgcmV0dXJuIGZpbHRlcjtcbiAgfVxuICAjYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIGZ1bmMsIHRhYmxlKSB7XG4gICAgY29uc3QgZmVGdW5jID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgZnVuYyk7XG4gICAgZmVGdW5jLnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJkaXNjcmV0ZVwiKTtcbiAgICBmZUZ1bmMuc2V0QXR0cmlidXRlKFwidGFibGVWYWx1ZXNcIiwgdGFibGUpO1xuICAgIGZlQ29tcG9uZW50VHJhbnNmZXIuYXBwZW5kKGZlRnVuYyk7XG4gIH1cbiAgI2FkZFRyYW5zZmVyTWFwQ29udmVyc2lvbihyVGFibGUsIGdUYWJsZSwgYlRhYmxlLCBmaWx0ZXIpIHtcbiAgICBjb25zdCBmZUNvbXBvbmVudFRyYW5zZmVyID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJmZUNvbXBvbmVudFRyYW5zZmVyXCIpO1xuICAgIGZpbHRlci5hcHBlbmQoZmVDb21wb25lbnRUcmFuc2Zlcik7XG4gICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jUlwiLCByVGFibGUpO1xuICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY0dcIiwgZ1RhYmxlKTtcbiAgICB0aGlzLiNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgXCJmZUZ1bmNCXCIsIGJUYWJsZSk7XG4gIH1cbiAgI2FkZFRyYW5zZmVyTWFwQWxwaGFDb252ZXJzaW9uKGFUYWJsZSwgZmlsdGVyKSB7XG4gICAgY29uc3QgZmVDb21wb25lbnRUcmFuc2ZlciA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmVDb21wb25lbnRUcmFuc2ZlclwiKTtcbiAgICBmaWx0ZXIuYXBwZW5kKGZlQ29tcG9uZW50VHJhbnNmZXIpO1xuICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY0FcIiwgYVRhYmxlKTtcbiAgfVxuICAjZ2V0UkdCKGNvbG9yKSB7XG4gICAgdGhpcy4jZGVmcy5zdHlsZS5jb2xvciA9IGNvbG9yO1xuICAgIHJldHVybiBnZXRSR0IoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLiNkZWZzKS5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sb3JcIikpO1xuICB9XG59XG5jbGFzcyBET01DYW52YXNGYWN0b3J5IGV4dGVuZHMgQmFzZUNhbnZhc0ZhY3Rvcnkge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgb3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnQsXG4gICAgZW5hYmxlSFdBID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgZW5hYmxlSFdBXG4gICAgfSk7XG4gICAgdGhpcy5fZG9jdW1lbnQgPSBvd25lckRvY3VtZW50O1xuICB9XG4gIF9jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICByZXR1cm4gY2FudmFzO1xuICB9XG59XG5hc3luYyBmdW5jdGlvbiBmZXRjaERhdGEodXJsLCB0eXBlID0gXCJ0ZXh0XCIpIHtcbiAgaWYgKGlzVmFsaWRGZXRjaFVybCh1cmwsIGRvY3VtZW50LmJhc2VVUkkpKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuYmxvYigpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbiAgfVxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICByZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgdXJsLCB0cnVlKTtcbiAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IHR5cGU7XG4gICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSBYTUxIdHRwUmVxdWVzdC5ET05FKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwIHx8IHJlcXVlc3Quc3RhdHVzID09PSAwKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJhcnJheWJ1ZmZlclwiOlxuICAgICAgICAgIGNhc2UgXCJibG9iXCI6XG4gICAgICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXNwb25zZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlamVjdChuZXcgRXJyb3IocmVxdWVzdC5zdGF0dXNUZXh0KSk7XG4gICAgfTtcbiAgICByZXF1ZXN0LnNlbmQobnVsbCk7XG4gIH0pO1xufVxuY2xhc3MgRE9NQ01hcFJlYWRlckZhY3RvcnkgZXh0ZW5kcyBCYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuICBfZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKSB7XG4gICAgcmV0dXJuIGZldGNoRGF0YSh1cmwsIHRoaXMuaXNDb21wcmVzc2VkID8gXCJhcnJheWJ1ZmZlclwiIDogXCJ0ZXh0XCIpLnRoZW4oZGF0YSA9PiAoe1xuICAgICAgY01hcERhdGE6IGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IG5ldyBVaW50OEFycmF5KGRhdGEpIDogc3RyaW5nVG9CeXRlcyhkYXRhKSxcbiAgICAgIGNvbXByZXNzaW9uVHlwZVxuICAgIH0pKTtcbiAgfVxufVxuY2xhc3MgRE9NU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgZXh0ZW5kcyBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkge1xuICBfZmV0Y2hEYXRhKHVybCkge1xuICAgIHJldHVybiBmZXRjaERhdGEodXJsLCBcImFycmF5YnVmZmVyXCIpLnRoZW4oZGF0YSA9PiBuZXcgVWludDhBcnJheShkYXRhKSk7XG4gIH1cbn1cbmNsYXNzIERPTVNWR0ZhY3RvcnkgZXh0ZW5kcyBCYXNlU1ZHRmFjdG9yeSB7XG4gIF9jcmVhdGVTVkcodHlwZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCB0eXBlKTtcbiAgfVxufVxuY2xhc3MgUGFnZVZpZXdwb3J0IHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHZpZXdCb3gsXG4gICAgc2NhbGUsXG4gICAgcm90YXRpb24sXG4gICAgb2Zmc2V0WCA9IDAsXG4gICAgb2Zmc2V0WSA9IDAsXG4gICAgZG9udEZsaXAgPSBmYWxzZVxuICB9KSB7XG4gICAgdGhpcy52aWV3Qm94ID0gdmlld0JveDtcbiAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgdGhpcy5yb3RhdGlvbiA9IHJvdGF0aW9uO1xuICAgIHRoaXMub2Zmc2V0WCA9IG9mZnNldFg7XG4gICAgdGhpcy5vZmZzZXRZID0gb2Zmc2V0WTtcbiAgICBjb25zdCBjZW50ZXJYID0gKHZpZXdCb3hbMl0gKyB2aWV3Qm94WzBdKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh2aWV3Qm94WzNdICsgdmlld0JveFsxXSkgLyAyO1xuICAgIGxldCByb3RhdGVBLCByb3RhdGVCLCByb3RhdGVDLCByb3RhdGVEO1xuICAgIHJvdGF0aW9uICU9IDM2MDtcbiAgICBpZiAocm90YXRpb24gPCAwKSB7XG4gICAgICByb3RhdGlvbiArPSAzNjA7XG4gICAgfVxuICAgIHN3aXRjaCAocm90YXRpb24pIHtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByb3RhdGVBID0gLTE7XG4gICAgICAgIHJvdGF0ZUIgPSAwO1xuICAgICAgICByb3RhdGVDID0gMDtcbiAgICAgICAgcm90YXRlRCA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcm90YXRlQSA9IDA7XG4gICAgICAgIHJvdGF0ZUIgPSAxO1xuICAgICAgICByb3RhdGVDID0gMTtcbiAgICAgICAgcm90YXRlRCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJvdGF0ZUEgPSAwO1xuICAgICAgICByb3RhdGVCID0gLTE7XG4gICAgICAgIHJvdGF0ZUMgPSAtMTtcbiAgICAgICAgcm90YXRlRCA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAwOlxuICAgICAgICByb3RhdGVBID0gMTtcbiAgICAgICAgcm90YXRlQiA9IDA7XG4gICAgICAgIHJvdGF0ZUMgPSAwO1xuICAgICAgICByb3RhdGVEID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFnZVZpZXdwb3J0OiBJbnZhbGlkIHJvdGF0aW9uLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOTAgZGVncmVlcy5cIik7XG4gICAgfVxuICAgIGlmIChkb250RmxpcCkge1xuICAgICAgcm90YXRlQyA9IC1yb3RhdGVDO1xuICAgICAgcm90YXRlRCA9IC1yb3RhdGVEO1xuICAgIH1cbiAgICBsZXQgb2Zmc2V0Q2FudmFzWCwgb2Zmc2V0Q2FudmFzWTtcbiAgICBsZXQgd2lkdGgsIGhlaWdodDtcbiAgICBpZiAocm90YXRlQSA9PT0gMCkge1xuICAgICAgb2Zmc2V0Q2FudmFzWCA9IE1hdGguYWJzKGNlbnRlclkgLSB2aWV3Qm94WzFdKSAqIHNjYWxlICsgb2Zmc2V0WDtcbiAgICAgIG9mZnNldENhbnZhc1kgPSBNYXRoLmFicyhjZW50ZXJYIC0gdmlld0JveFswXSkgKiBzY2FsZSArIG9mZnNldFk7XG4gICAgICB3aWR0aCA9ICh2aWV3Qm94WzNdIC0gdmlld0JveFsxXSkgKiBzY2FsZTtcbiAgICAgIGhlaWdodCA9ICh2aWV3Qm94WzJdIC0gdmlld0JveFswXSkgKiBzY2FsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0Q2FudmFzWCA9IE1hdGguYWJzKGNlbnRlclggLSB2aWV3Qm94WzBdKSAqIHNjYWxlICsgb2Zmc2V0WDtcbiAgICAgIG9mZnNldENhbnZhc1kgPSBNYXRoLmFicyhjZW50ZXJZIC0gdmlld0JveFsxXSkgKiBzY2FsZSArIG9mZnNldFk7XG4gICAgICB3aWR0aCA9ICh2aWV3Qm94WzJdIC0gdmlld0JveFswXSkgKiBzY2FsZTtcbiAgICAgIGhlaWdodCA9ICh2aWV3Qm94WzNdIC0gdmlld0JveFsxXSkgKiBzY2FsZTtcbiAgICB9XG4gICAgdGhpcy50cmFuc2Zvcm0gPSBbcm90YXRlQSAqIHNjYWxlLCByb3RhdGVCICogc2NhbGUsIHJvdGF0ZUMgKiBzY2FsZSwgcm90YXRlRCAqIHNjYWxlLCBvZmZzZXRDYW52YXNYIC0gcm90YXRlQSAqIHNjYWxlICogY2VudGVyWCAtIHJvdGF0ZUMgKiBzY2FsZSAqIGNlbnRlclksIG9mZnNldENhbnZhc1kgLSByb3RhdGVCICogc2NhbGUgKiBjZW50ZXJYIC0gcm90YXRlRCAqIHNjYWxlICogY2VudGVyWV07XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG4gIGdldCByYXdEaW1zKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHZpZXdCb3hcbiAgICB9ID0gdGhpcztcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicmF3RGltc1wiLCB7XG4gICAgICBwYWdlV2lkdGg6IHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdLFxuICAgICAgcGFnZUhlaWdodDogdmlld0JveFszXSAtIHZpZXdCb3hbMV0sXG4gICAgICBwYWdlWDogdmlld0JveFswXSxcbiAgICAgIHBhZ2VZOiB2aWV3Qm94WzFdXG4gICAgfSk7XG4gIH1cbiAgY2xvbmUoe1xuICAgIHNjYWxlID0gdGhpcy5zY2FsZSxcbiAgICByb3RhdGlvbiA9IHRoaXMucm90YXRpb24sXG4gICAgb2Zmc2V0WCA9IHRoaXMub2Zmc2V0WCxcbiAgICBvZmZzZXRZID0gdGhpcy5vZmZzZXRZLFxuICAgIGRvbnRGbGlwID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQYWdlVmlld3BvcnQoe1xuICAgICAgdmlld0JveDogdGhpcy52aWV3Qm94LnNsaWNlKCksXG4gICAgICBzY2FsZSxcbiAgICAgIHJvdGF0aW9uLFxuICAgICAgb2Zmc2V0WCxcbiAgICAgIG9mZnNldFksXG4gICAgICBkb250RmxpcFxuICAgIH0pO1xuICB9XG4gIGNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQoeCwgeSkge1xuICAgIHJldHVybiBVdGlsLmFwcGx5VHJhbnNmb3JtKFt4LCB5XSwgdGhpcy50cmFuc2Zvcm0pO1xuICB9XG4gIGNvbnZlcnRUb1ZpZXdwb3J0UmVjdGFuZ2xlKHJlY3QpIHtcbiAgICBjb25zdCB0b3BMZWZ0ID0gVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFswXSwgcmVjdFsxXV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgICBjb25zdCBib3R0b21SaWdodCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JlY3RbMl0sIHJlY3RbM11dLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgcmV0dXJuIFt0b3BMZWZ0WzBdLCB0b3BMZWZ0WzFdLCBib3R0b21SaWdodFswXSwgYm90dG9tUmlnaHRbMV1dO1xuICB9XG4gIGNvbnZlcnRUb1BkZlBvaW50KHgsIHkpIHtcbiAgICByZXR1cm4gVXRpbC5hcHBseUludmVyc2VUcmFuc2Zvcm0oW3gsIHldLCB0aGlzLnRyYW5zZm9ybSk7XG4gIH1cbn1cbmNsYXNzIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIGV4dHJhRGVsYXkgPSAwKSB7XG4gICAgc3VwZXIobXNnLCBcIlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvblwiKTtcbiAgICB0aGlzLmV4dHJhRGVsYXkgPSBleHRyYURlbGF5O1xuICB9XG59XG5mdW5jdGlvbiBpc0RhdGFTY2hlbWUodXJsKSB7XG4gIGNvbnN0IGlpID0gdXJsLmxlbmd0aDtcbiAgbGV0IGkgPSAwO1xuICB3aGlsZSAoaSA8IGlpICYmIHVybFtpXS50cmltKCkgPT09IFwiXCIpIHtcbiAgICBpKys7XG4gIH1cbiAgcmV0dXJuIHVybC5zdWJzdHJpbmcoaSwgaSArIDUpLnRvTG93ZXJDYXNlKCkgPT09IFwiZGF0YTpcIjtcbn1cbmZ1bmN0aW9uIGlzUGRmRmlsZShmaWxlbmFtZSkge1xuICByZXR1cm4gdHlwZW9mIGZpbGVuYW1lID09PSBcInN0cmluZ1wiICYmIC9cXC5wZGYkL2kudGVzdChmaWxlbmFtZSk7XG59XG5mdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21VcmwodXJsKSB7XG4gIFt1cmxdID0gdXJsLnNwbGl0KC9bIz9dLywgMSk7XG4gIHJldHVybiB1cmwuc3Vic3RyaW5nKHVybC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcbn1cbmZ1bmN0aW9uIGdldFBkZkZpbGVuYW1lRnJvbVVybCh1cmwsIGRlZmF1bHRGaWxlbmFtZSA9IFwiZG9jdW1lbnQucGRmXCIpIHtcbiAgaWYgKHR5cGVvZiB1cmwgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZGVmYXVsdEZpbGVuYW1lO1xuICB9XG4gIGlmIChpc0RhdGFTY2hlbWUodXJsKSkge1xuICAgIHdhcm4oJ2dldFBkZkZpbGVuYW1lRnJvbVVybDogaWdub3JlIFwiZGF0YTpcIi1VUkwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuJyk7XG4gICAgcmV0dXJuIGRlZmF1bHRGaWxlbmFtZTtcbiAgfVxuICBjb25zdCByZVVSSSA9IC9eKD86KD86W146XSs6KT9cXC9cXC9bXi9dKyk/KFtePyNdKikoXFw/W14jXSopPygjLiopPyQvO1xuICBjb25zdCByZUZpbGVuYW1lID0gL1teLz8jPV0rXFwucGRmXFxiKD8hLipcXC5wZGZcXGIpL2k7XG4gIGNvbnN0IHNwbGl0VVJJID0gcmVVUkkuZXhlYyh1cmwpO1xuICBsZXQgc3VnZ2VzdGVkRmlsZW5hbWUgPSByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbMV0pIHx8IHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVsyXSkgfHwgcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzNdKTtcbiAgaWYgKHN1Z2dlc3RlZEZpbGVuYW1lKSB7XG4gICAgc3VnZ2VzdGVkRmlsZW5hbWUgPSBzdWdnZXN0ZWRGaWxlbmFtZVswXTtcbiAgICBpZiAoc3VnZ2VzdGVkRmlsZW5hbWUuaW5jbHVkZXMoXCIlXCIpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdWdnZXN0ZWRGaWxlbmFtZSA9IHJlRmlsZW5hbWUuZXhlYyhkZWNvZGVVUklDb21wb25lbnQoc3VnZ2VzdGVkRmlsZW5hbWUpKVswXTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1Z2dlc3RlZEZpbGVuYW1lIHx8IGRlZmF1bHRGaWxlbmFtZTtcbn1cbmNsYXNzIFN0YXRUaW1lciB7XG4gIHN0YXJ0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0aW1lcyA9IFtdO1xuICB0aW1lKG5hbWUpIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgIHdhcm4oYFRpbWVyIGlzIGFscmVhZHkgcnVubmluZyBmb3IgJHtuYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0ZWRbbmFtZV0gPSBEYXRlLm5vdygpO1xuICB9XG4gIHRpbWVFbmQobmFtZSkge1xuICAgIGlmICghKG5hbWUgaW4gdGhpcy5zdGFydGVkKSkge1xuICAgICAgd2FybihgVGltZXIgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy50aW1lcy5wdXNoKHtcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydDogdGhpcy5zdGFydGVkW25hbWVdLFxuICAgICAgZW5kOiBEYXRlLm5vdygpXG4gICAgfSk7XG4gICAgZGVsZXRlIHRoaXMuc3RhcnRlZFtuYW1lXTtcbiAgfVxuICB0b1N0cmluZygpIHtcbiAgICBjb25zdCBvdXRCdWYgPSBbXTtcbiAgICBsZXQgbG9uZ2VzdCA9IDA7XG4gICAgZm9yIChjb25zdCB7XG4gICAgICBuYW1lXG4gICAgfSBvZiB0aGlzLnRpbWVzKSB7XG4gICAgICBsb25nZXN0ID0gTWF0aC5tYXgobmFtZS5sZW5ndGgsIGxvbmdlc3QpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZFxuICAgIH0gb2YgdGhpcy50aW1lcykge1xuICAgICAgb3V0QnVmLnB1c2goYCR7bmFtZS5wYWRFbmQobG9uZ2VzdCl9ICR7ZW5kIC0gc3RhcnR9bXNcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dEJ1Zi5qb2luKFwiXCIpO1xuICB9XG59XG5mdW5jdGlvbiBpc1ZhbGlkRmV0Y2hVcmwodXJsLCBiYXNlVXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJvdG9jb2xcbiAgICB9ID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gcHJvdG9jb2wgPT09IFwiaHR0cDpcIiB8fCBwcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBub0NvbnRleHRNZW51KGUpIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xufVxuZnVuY3Rpb24gZGVwcmVjYXRlZChkZXRhaWxzKSB7XG4gIGNvbnNvbGUubG9nKFwiRGVwcmVjYXRlZCBBUEkgdXNhZ2U6IFwiICsgZGV0YWlscyk7XG59XG5sZXQgcGRmRGF0ZVN0cmluZ1JlZ2V4O1xuY2xhc3MgUERGRGF0ZVN0cmluZyB7XG4gIHN0YXRpYyB0b0RhdGVPYmplY3QoaW5wdXQpIHtcbiAgICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHBkZkRhdGVTdHJpbmdSZWdleCB8fD0gbmV3IFJlZ0V4cChcIl5EOlwiICsgXCIoXFxcXGR7NH0pXCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihbWnwrfC1dKT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiJz9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiJz9cIik7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHBkZkRhdGVTdHJpbmdSZWdleC5leGVjKGlucHV0KTtcbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApO1xuICAgIGxldCBtb250aCA9IHBhcnNlSW50KG1hdGNoZXNbMl0sIDEwKTtcbiAgICBtb250aCA9IG1vbnRoID49IDEgJiYgbW9udGggPD0gMTIgPyBtb250aCAtIDEgOiAwO1xuICAgIGxldCBkYXkgPSBwYXJzZUludChtYXRjaGVzWzNdLCAxMCk7XG4gICAgZGF5ID0gZGF5ID49IDEgJiYgZGF5IDw9IDMxID8gZGF5IDogMTtcbiAgICBsZXQgaG91ciA9IHBhcnNlSW50KG1hdGNoZXNbNF0sIDEwKTtcbiAgICBob3VyID0gaG91ciA+PSAwICYmIGhvdXIgPD0gMjMgPyBob3VyIDogMDtcbiAgICBsZXQgbWludXRlID0gcGFyc2VJbnQobWF0Y2hlc1s1XSwgMTApO1xuICAgIG1pbnV0ZSA9IG1pbnV0ZSA+PSAwICYmIG1pbnV0ZSA8PSA1OSA/IG1pbnV0ZSA6IDA7XG4gICAgbGV0IHNlY29uZCA9IHBhcnNlSW50KG1hdGNoZXNbNl0sIDEwKTtcbiAgICBzZWNvbmQgPSBzZWNvbmQgPj0gMCAmJiBzZWNvbmQgPD0gNTkgPyBzZWNvbmQgOiAwO1xuICAgIGNvbnN0IHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9IG1hdGNoZXNbN10gfHwgXCJaXCI7XG4gICAgbGV0IG9mZnNldEhvdXIgPSBwYXJzZUludChtYXRjaGVzWzhdLCAxMCk7XG4gICAgb2Zmc2V0SG91ciA9IG9mZnNldEhvdXIgPj0gMCAmJiBvZmZzZXRIb3VyIDw9IDIzID8gb2Zmc2V0SG91ciA6IDA7XG4gICAgbGV0IG9mZnNldE1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbOV0sIDEwKSB8fCAwO1xuICAgIG9mZnNldE1pbnV0ZSA9IG9mZnNldE1pbnV0ZSA+PSAwICYmIG9mZnNldE1pbnV0ZSA8PSA1OSA/IG9mZnNldE1pbnV0ZSA6IDA7XG4gICAgaWYgKHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9PT0gXCItXCIpIHtcbiAgICAgIGhvdXIgKz0gb2Zmc2V0SG91cjtcbiAgICAgIG1pbnV0ZSArPSBvZmZzZXRNaW51dGU7XG4gICAgfSBlbHNlIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09IFwiK1wiKSB7XG4gICAgICBob3VyIC09IG9mZnNldEhvdXI7XG4gICAgICBtaW51dGUgLT0gb2Zmc2V0TWludXRlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0WGZhUGFnZVZpZXdwb3J0KHhmYVBhZ2UsIHtcbiAgc2NhbGUgPSAxLFxuICByb3RhdGlvbiA9IDBcbn0pIHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodFxuICB9ID0geGZhUGFnZS5hdHRyaWJ1dGVzLnN0eWxlO1xuICBjb25zdCB2aWV3Qm94ID0gWzAsIDAsIHBhcnNlSW50KHdpZHRoKSwgcGFyc2VJbnQoaGVpZ2h0KV07XG4gIHJldHVybiBuZXcgUGFnZVZpZXdwb3J0KHtcbiAgICB2aWV3Qm94LFxuICAgIHNjYWxlLFxuICAgIHJvdGF0aW9uXG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0UkdCKGNvbG9yKSB7XG4gIGlmIChjb2xvci5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgIGNvbnN0IGNvbG9yUkdCID0gcGFyc2VJbnQoY29sb3Iuc2xpY2UoMSksIDE2KTtcbiAgICByZXR1cm4gWyhjb2xvclJHQiAmIDB4ZmYwMDAwKSA+PiAxNiwgKGNvbG9yUkdCICYgMHgwMGZmMDApID4+IDgsIGNvbG9yUkdCICYgMHgwMDAwZmZdO1xuICB9XG4gIGlmIChjb2xvci5zdGFydHNXaXRoKFwicmdiKFwiKSkge1xuICAgIHJldHVybiBjb2xvci5zbGljZSg0LCAtMSkuc3BsaXQoXCIsXCIpLm1hcCh4ID0+IHBhcnNlSW50KHgpKTtcbiAgfVxuICBpZiAoY29sb3Iuc3RhcnRzV2l0aChcInJnYmEoXCIpKSB7XG4gICAgcmV0dXJuIGNvbG9yLnNsaWNlKDUsIC0xKS5zcGxpdChcIixcIikubWFwKHggPT4gcGFyc2VJbnQoeCkpLnNsaWNlKDAsIDMpO1xuICB9XG4gIHdhcm4oYE5vdCBhIHZhbGlkIGNvbG9yIGZvcm1hdDogXCIke2NvbG9yfVwiYCk7XG4gIHJldHVybiBbMCwgMCwgMF07XG59XG5mdW5jdGlvbiBnZXRDb2xvclZhbHVlcyhjb2xvcnMpIHtcbiAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZChzcGFuKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGNvbG9ycy5rZXlzKCkpIHtcbiAgICBzcGFuLnN0eWxlLmNvbG9yID0gbmFtZTtcbiAgICBjb25zdCBjb21wdXRlZENvbG9yID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc3BhbikuY29sb3I7XG4gICAgY29sb3JzLnNldChuYW1lLCBnZXRSR0IoY29tcHV0ZWRDb2xvcikpO1xuICB9XG4gIHNwYW4ucmVtb3ZlKCk7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCkge1xuICBjb25zdCB7XG4gICAgYSxcbiAgICBiLFxuICAgIGMsXG4gICAgZCxcbiAgICBlLFxuICAgIGZcbiAgfSA9IGN0eC5nZXRUcmFuc2Zvcm0oKTtcbiAgcmV0dXJuIFthLCBiLCBjLCBkLCBlLCBmXTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCkge1xuICBjb25zdCB7XG4gICAgYSxcbiAgICBiLFxuICAgIGMsXG4gICAgZCxcbiAgICBlLFxuICAgIGZcbiAgfSA9IGN0eC5nZXRUcmFuc2Zvcm0oKS5pbnZlcnRTZWxmKCk7XG4gIHJldHVybiBbYSwgYiwgYywgZCwgZSwgZl07XG59XG5mdW5jdGlvbiBzZXRMYXllckRpbWVuc2lvbnMoZGl2LCB2aWV3cG9ydCwgbXVzdEZsaXAgPSBmYWxzZSwgbXVzdFJvdGF0ZSA9IHRydWUpIHtcbiAgaWYgKHZpZXdwb3J0IGluc3RhbmNlb2YgUGFnZVZpZXdwb3J0KSB7XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVdpZHRoLFxuICAgICAgcGFnZUhlaWdodFxuICAgIH0gPSB2aWV3cG9ydC5yYXdEaW1zO1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IGRpdjtcbiAgICBjb25zdCB1c2VSb3VuZCA9IHV0aWxfRmVhdHVyZVRlc3QuaXNDU1NSb3VuZFN1cHBvcnRlZDtcbiAgICBjb25zdCB3ID0gYHZhcigtLXNjYWxlLWZhY3RvcikgKiAke3BhZ2VXaWR0aH1weGAsXG4gICAgICBoID0gYHZhcigtLXNjYWxlLWZhY3RvcikgKiAke3BhZ2VIZWlnaHR9cHhgO1xuICAgIGNvbnN0IHdpZHRoU3RyID0gdXNlUm91bmQgPyBgcm91bmQoJHt3fSwgMXB4KWAgOiBgY2FsYygke3d9KWAsXG4gICAgICBoZWlnaHRTdHIgPSB1c2VSb3VuZCA/IGByb3VuZCgke2h9LCAxcHgpYCA6IGBjYWxjKCR7aH0pYDtcbiAgICBpZiAoIW11c3RGbGlwIHx8IHZpZXdwb3J0LnJvdGF0aW9uICUgMTgwID09PSAwKSB7XG4gICAgICBzdHlsZS53aWR0aCA9IHdpZHRoU3RyO1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0U3RyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZS53aWR0aCA9IGhlaWdodFN0cjtcbiAgICAgIHN0eWxlLmhlaWdodCA9IHdpZHRoU3RyO1xuICAgIH1cbiAgfVxuICBpZiAobXVzdFJvdGF0ZSkge1xuICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLW1haW4tcm90YXRpb25cIiwgdmlld3BvcnQucm90YXRpb24pO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci90b29sYmFyLmpzXG5cbmNsYXNzIEVkaXRvclRvb2xiYXIge1xuICAjdG9vbGJhciA9IG51bGw7XG4gICNjb2xvclBpY2tlciA9IG51bGw7XG4gICNlZGl0b3I7XG4gICNidXR0b25zID0gbnVsbDtcbiAgY29uc3RydWN0b3IoZWRpdG9yKSB7XG4gICAgdGhpcy4jZWRpdG9yID0gZWRpdG9yO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBlZGl0VG9vbGJhciA9IHRoaXMuI3Rvb2xiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGVkaXRUb29sYmFyLmNsYXNzTmFtZSA9IFwiZWRpdFRvb2xiYXJcIjtcbiAgICBlZGl0VG9vbGJhci5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwidG9vbGJhclwiKTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGVkaXRUb29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBlZGl0VG9vbGJhci5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgRWRpdG9yVG9vbGJhci4jcG9pbnRlckRvd24sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGNvbnN0IGJ1dHRvbnMgPSB0aGlzLiNidXR0b25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBidXR0b25zLmNsYXNzTmFtZSA9IFwiYnV0dG9uc1wiO1xuICAgIGVkaXRUb29sYmFyLmFwcGVuZChidXR0b25zKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuI2VkaXRvci50b29sYmFyUG9zaXRpb247XG4gICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0eWxlXG4gICAgICB9ID0gZWRpdFRvb2xiYXI7XG4gICAgICBjb25zdCB4ID0gdGhpcy4jZWRpdG9yLl91aU1hbmFnZXIuZGlyZWN0aW9uID09PSBcImx0clwiID8gMSAtIHBvc2l0aW9uWzBdIDogcG9zaXRpb25bMF07XG4gICAgICBzdHlsZS5pbnNldElubGluZUVuZCA9IGAkezEwMCAqIHh9JWA7XG4gICAgICBzdHlsZS50b3AgPSBgY2FsYygkezEwMCAqIHBvc2l0aW9uWzFdfSUgKyB2YXIoLS1lZGl0b3ItdG9vbGJhci12ZXJ0LW9mZnNldCkpYDtcbiAgICB9XG4gICAgdGhpcy4jYWRkRGVsZXRlQnV0dG9uKCk7XG4gICAgcmV0dXJuIGVkaXRUb29sYmFyO1xuICB9XG4gIHN0YXRpYyAjcG9pbnRlckRvd24oZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgI2ZvY3VzSW4oZSkge1xuICAgIHRoaXMuI2VkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gZmFsc2U7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgI2ZvY3VzT3V0KGUpIHtcbiAgICB0aGlzLiNlZGl0b3IuX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IHRydWU7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgI2FkZExpc3RlbmVyc1RvRWxlbWVudChlbGVtZW50KSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy4jZWRpdG9yLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIHRoaXMuI2ZvY3VzSW4uYmluZCh0aGlzKSwge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2ZvY3VzT3V0LmJpbmQodGhpcyksIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICBoaWRlKCkge1xuICAgIHRoaXMuI3Rvb2xiYXIuY2xhc3NMaXN0LmFkZChcImhpZGRlblwiKTtcbiAgICB0aGlzLiNjb2xvclBpY2tlcj8uaGlkZURyb3Bkb3duKCk7XG4gIH1cbiAgc2hvdygpIHtcbiAgICB0aGlzLiN0b29sYmFyLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG4gIH1cbiAgI2FkZERlbGV0ZUJ1dHRvbigpIHtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbi5jbGFzc05hbWUgPSBcImRlbGV0ZVwiO1xuICAgIGJ1dHRvbi50YWJJbmRleCA9IDA7XG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBgcGRmanMtZWRpdG9yLXJlbW92ZS0ke3RoaXMuI2VkaXRvci5lZGl0b3JUeXBlfS1idXR0b25gKTtcbiAgICB0aGlzLiNhZGRMaXN0ZW5lcnNUb0VsZW1lbnQoYnV0dG9uKTtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGUgPT4ge1xuICAgICAgdGhpcy4jZWRpdG9yLl91aU1hbmFnZXIuZGVsZXRlKCk7XG4gICAgfSwge1xuICAgICAgc2lnbmFsOiB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5fc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy4jYnV0dG9ucy5hcHBlbmQoYnV0dG9uKTtcbiAgfVxuICBnZXQgI2RpdmlkZXIoKSB7XG4gICAgY29uc3QgZGl2aWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2aWRlci5jbGFzc05hbWUgPSBcImRpdmlkZXJcIjtcbiAgICByZXR1cm4gZGl2aWRlcjtcbiAgfVxuICBhZGRBbHRUZXh0QnV0dG9uKGJ1dHRvbikge1xuICAgIHRoaXMuI2FkZExpc3RlbmVyc1RvRWxlbWVudChidXR0b24pO1xuICAgIHRoaXMuI2J1dHRvbnMucHJlcGVuZChidXR0b24sIHRoaXMuI2RpdmlkZXIpO1xuICB9XG4gIGFkZENvbG9yUGlja2VyKGNvbG9yUGlja2VyKSB7XG4gICAgdGhpcy4jY29sb3JQaWNrZXIgPSBjb2xvclBpY2tlcjtcbiAgICBjb25zdCBidXR0b24gPSBjb2xvclBpY2tlci5yZW5kZXJCdXR0b24oKTtcbiAgICB0aGlzLiNhZGRMaXN0ZW5lcnNUb0VsZW1lbnQoYnV0dG9uKTtcbiAgICB0aGlzLiNidXR0b25zLnByZXBlbmQoYnV0dG9uLCB0aGlzLiNkaXZpZGVyKTtcbiAgfVxuICByZW1vdmUoKSB7XG4gICAgdGhpcy4jdG9vbGJhci5yZW1vdmUoKTtcbiAgICB0aGlzLiNjb2xvclBpY2tlcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuI2NvbG9yUGlja2VyID0gbnVsbDtcbiAgfVxufVxuY2xhc3MgSGlnaGxpZ2h0VG9vbGJhciB7XG4gICNidXR0b25zID0gbnVsbDtcbiAgI3Rvb2xiYXIgPSBudWxsO1xuICAjdWlNYW5hZ2VyO1xuICBjb25zdHJ1Y3Rvcih1aU1hbmFnZXIpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIgPSB1aU1hbmFnZXI7XG4gIH1cbiAgI3JlbmRlcigpIHtcbiAgICBjb25zdCBlZGl0VG9vbGJhciA9IHRoaXMuI3Rvb2xiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGVkaXRUb29sYmFyLmNsYXNzTmFtZSA9IFwiZWRpdFRvb2xiYXJcIjtcbiAgICBlZGl0VG9vbGJhci5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwidG9vbGJhclwiKTtcbiAgICBlZGl0VG9vbGJhci5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsOiB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbFxuICAgIH0pO1xuICAgIGNvbnN0IGJ1dHRvbnMgPSB0aGlzLiNidXR0b25zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBidXR0b25zLmNsYXNzTmFtZSA9IFwiYnV0dG9uc1wiO1xuICAgIGVkaXRUb29sYmFyLmFwcGVuZChidXR0b25zKTtcbiAgICB0aGlzLiNhZGRIaWdobGlnaHRCdXR0b24oKTtcbiAgICByZXR1cm4gZWRpdFRvb2xiYXI7XG4gIH1cbiAgI2dldExhc3RQb2ludChib3hlcywgaXNMVFIpIHtcbiAgICBsZXQgbGFzdFkgPSAwO1xuICAgIGxldCBsYXN0WCA9IDA7XG4gICAgZm9yIChjb25zdCBib3ggb2YgYm94ZXMpIHtcbiAgICAgIGNvbnN0IHkgPSBib3gueSArIGJveC5oZWlnaHQ7XG4gICAgICBpZiAoeSA8IGxhc3RZKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgeCA9IGJveC54ICsgKGlzTFRSID8gYm94LndpZHRoIDogMCk7XG4gICAgICBpZiAoeSA+IGxhc3RZKSB7XG4gICAgICAgIGxhc3RYID0geDtcbiAgICAgICAgbGFzdFkgPSB5O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0xUUikge1xuICAgICAgICBpZiAoeCA+IGxhc3RYKSB7XG4gICAgICAgICAgbGFzdFggPSB4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHggPCBsYXN0WCkge1xuICAgICAgICBsYXN0WCA9IHg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbaXNMVFIgPyAxIC0gbGFzdFggOiBsYXN0WCwgbGFzdFldO1xuICB9XG4gIHNob3cocGFyZW50LCBib3hlcywgaXNMVFIpIHtcbiAgICBjb25zdCBbeCwgeV0gPSB0aGlzLiNnZXRMYXN0UG9pbnQoYm94ZXMsIGlzTFRSKTtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLiN0b29sYmFyIHx8PSB0aGlzLiNyZW5kZXIoKTtcbiAgICBwYXJlbnQuYXBwZW5kKHRoaXMuI3Rvb2xiYXIpO1xuICAgIHN0eWxlLmluc2V0SW5saW5lRW5kID0gYCR7MTAwICogeH0lYDtcbiAgICBzdHlsZS50b3AgPSBgY2FsYygkezEwMCAqIHl9JSArIHZhcigtLWVkaXRvci10b29sYmFyLXZlcnQtb2Zmc2V0KSlgO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgdGhpcy4jdG9vbGJhci5yZW1vdmUoKTtcbiAgfVxuICAjYWRkSGlnaGxpZ2h0QnV0dG9uKCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uLmNsYXNzTmFtZSA9IFwiaGlnaGxpZ2h0QnV0dG9uXCI7XG4gICAgYnV0dG9uLnRhYkluZGV4ID0gMDtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIGBwZGZqcy1oaWdobGlnaHQtZmxvYXRpbmctYnV0dG9uMWApO1xuICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBidXR0b24uYXBwZW5kKHNwYW4pO1xuICAgIHNwYW4uY2xhc3NOYW1lID0gXCJ2aXN1YWxseUhpZGRlblwiO1xuICAgIHNwYW4uc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtaGlnaGxpZ2h0LWZsb2F0aW5nLWJ1dHRvbi1sYWJlbFwiKTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbDtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgdGhpcy4jdWlNYW5hZ2VyLmhpZ2hsaWdodFNlbGVjdGlvbihcImZsb2F0aW5nX2J1dHRvblwiKTtcbiAgICB9LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLiNidXR0b25zLmFwcGVuZChidXR0b24pO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci90b29scy5qc1xuXG5cblxuZnVuY3Rpb24gYmluZEV2ZW50cyhvYmosIGVsZW1lbnQsIG5hbWVzKSB7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBvYmpbbmFtZV0uYmluZChvYmopKTtcbiAgfVxufVxuZnVuY3Rpb24gb3BhY2l0eVRvSGV4KG9wYWNpdHkpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoTWF0aC5taW4oMjU1LCBNYXRoLm1heCgxLCAyNTUgKiBvcGFjaXR5KSkpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIik7XG59XG5jbGFzcyBJZE1hbmFnZXIge1xuICAjaWQgPSAwO1xuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIGAke0Fubm90YXRpb25FZGl0b3JQcmVmaXh9JHt0aGlzLiNpZCsrfWA7XG4gIH1cbn1cbmNsYXNzIEltYWdlTWFuYWdlciB7XG4gICNiYXNlSWQgPSBnZXRVdWlkKCk7XG4gICNpZCA9IDA7XG4gICNjYWNoZSA9IG51bGw7XG4gIHN0YXRpYyBnZXQgX2lzU1ZHRml0dGluZ0NhbnZhcygpIHtcbiAgICBjb25zdCBzdmcgPSBgZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9VVRGLTgsPHN2ZyB2aWV3Qm94PVwiMCAwIDEgMVwiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHJlY3Qgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMVwiIHN0eWxlPVwiZmlsbDpyZWQ7XCIvPjwvc3ZnPmA7XG4gICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcygxLCAzKTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIsIHtcbiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgaW1hZ2Uuc3JjID0gc3ZnO1xuICAgIGNvbnN0IHByb21pc2UgPSBpbWFnZS5kZWNvZGUoKS50aGVuKCgpID0+IHtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDMpO1xuICAgICAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpLmRhdGEuYnVmZmVyKVswXSA9PT0gMDtcbiAgICB9KTtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2lzU1ZHRml0dGluZ0NhbnZhc1wiLCBwcm9taXNlKTtcbiAgfVxuICBhc3luYyAjZ2V0KGtleSwgcmF3RGF0YSkge1xuICAgIHRoaXMuI2NhY2hlIHx8PSBuZXcgTWFwKCk7XG4gICAgbGV0IGRhdGEgPSB0aGlzLiNjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChkYXRhPy5iaXRtYXApIHtcbiAgICAgIGRhdGEucmVmQ291bnRlciArPSAxO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBkYXRhIHx8PSB7XG4gICAgICAgIGJpdG1hcDogbnVsbCxcbiAgICAgICAgaWQ6IGBpbWFnZV8ke3RoaXMuI2Jhc2VJZH1fJHt0aGlzLiNpZCsrfWAsXG4gICAgICAgIHJlZkNvdW50ZXI6IDAsXG4gICAgICAgIGlzU3ZnOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIGxldCBpbWFnZTtcbiAgICAgIGlmICh0eXBlb2YgcmF3RGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBkYXRhLnVybCA9IHJhd0RhdGE7XG4gICAgICAgIGltYWdlID0gYXdhaXQgZmV0Y2hEYXRhKHJhd0RhdGEsIFwiYmxvYlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltYWdlID0gZGF0YS5maWxlID0gcmF3RGF0YTtcbiAgICAgIH1cbiAgICAgIGlmIChpbWFnZS50eXBlID09PSBcImltYWdlL3N2Zyt4bWxcIikge1xuICAgICAgICBjb25zdCBtdXN0UmVtb3ZlQXNwZWN0UmF0aW9Qcm9taXNlID0gSW1hZ2VNYW5hZ2VyLl9pc1NWR0ZpdHRpbmdDYW52YXM7XG4gICAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgY29uc3QgaW1hZ2VQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGltYWdlRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICBkYXRhLmJpdG1hcCA9IGltYWdlRWxlbWVudDtcbiAgICAgICAgICAgIGRhdGEuaXNTdmcgPSB0cnVlO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBkYXRhLnN2Z1VybCA9IGZpbGVSZWFkZXIucmVzdWx0O1xuICAgICAgICAgICAgaW1hZ2VFbGVtZW50LnNyYyA9IChhd2FpdCBtdXN0UmVtb3ZlQXNwZWN0UmF0aW9Qcm9taXNlKSA/IGAke3VybH0jc3ZnVmlldyhwcmVzZXJ2ZUFzcGVjdFJhdGlvKG5vbmUpKWAgOiB1cmw7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpbWFnZUVsZW1lbnQub25lcnJvciA9IGZpbGVSZWFkZXIub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChpbWFnZSk7XG4gICAgICAgIGF3YWl0IGltYWdlUHJvbWlzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEuYml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoaW1hZ2UpO1xuICAgICAgfVxuICAgICAgZGF0YS5yZWZDb3VudGVyID0gMTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgZGF0YSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuI2NhY2hlLnNldChrZXksIGRhdGEpO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLiNjYWNoZS5zZXQoZGF0YS5pZCwgZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGFzeW5jIGdldEZyb21GaWxlKGZpbGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBsYXN0TW9kaWZpZWQsXG4gICAgICBuYW1lLFxuICAgICAgc2l6ZSxcbiAgICAgIHR5cGVcbiAgICB9ID0gZmlsZTtcbiAgICByZXR1cm4gdGhpcy4jZ2V0KGAke2xhc3RNb2RpZmllZH1fJHtuYW1lfV8ke3NpemV9XyR7dHlwZX1gLCBmaWxlKTtcbiAgfVxuICBhc3luYyBnZXRGcm9tVXJsKHVybCkge1xuICAgIHJldHVybiB0aGlzLiNnZXQodXJsLCB1cmwpO1xuICB9XG4gIGFzeW5jIGdldEZyb21JZChpZCkge1xuICAgIHRoaXMuI2NhY2hlIHx8PSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuI2NhY2hlLmdldChpZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGRhdGEuYml0bWFwKSB7XG4gICAgICBkYXRhLnJlZkNvdW50ZXIgKz0gMTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAoZGF0YS5maWxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRGcm9tRmlsZShkYXRhLmZpbGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRGcm9tVXJsKGRhdGEudXJsKTtcbiAgfVxuICBnZXRTdmdVcmwoaWQpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy4jY2FjaGUuZ2V0KGlkKTtcbiAgICBpZiAoIWRhdGE/LmlzU3ZnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEuc3ZnVXJsO1xuICB9XG4gIGRlbGV0ZUlkKGlkKSB7XG4gICAgdGhpcy4jY2FjaGUgfHw9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy4jY2FjaGUuZ2V0KGlkKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGF0YS5yZWZDb3VudGVyIC09IDE7XG4gICAgaWYgKGRhdGEucmVmQ291bnRlciAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYXRhLmJpdG1hcCA9IG51bGw7XG4gIH1cbiAgaXNWYWxpZElkKGlkKSB7XG4gICAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoYGltYWdlXyR7dGhpcy4jYmFzZUlkfV9gKTtcbiAgfVxufVxuY2xhc3MgQ29tbWFuZE1hbmFnZXIge1xuICAjY29tbWFuZHMgPSBbXTtcbiAgI2xvY2tlZCA9IGZhbHNlO1xuICAjbWF4U2l6ZTtcbiAgI3Bvc2l0aW9uID0gLTE7XG4gIGNvbnN0cnVjdG9yKG1heFNpemUgPSAxMjgpIHtcbiAgICB0aGlzLiNtYXhTaXplID0gbWF4U2l6ZTtcbiAgfVxuICBhZGQoe1xuICAgIGNtZCxcbiAgICB1bmRvLFxuICAgIHBvc3QsXG4gICAgbXVzdEV4ZWMsXG4gICAgdHlwZSA9IE5hTixcbiAgICBvdmVyd3JpdGVJZlNhbWVUeXBlID0gZmFsc2UsXG4gICAga2VlcFVuZG8gPSBmYWxzZVxuICB9KSB7XG4gICAgaWYgKG11c3RFeGVjKSB7XG4gICAgICBjbWQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2xvY2tlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzYXZlID0ge1xuICAgICAgY21kLFxuICAgICAgdW5kbyxcbiAgICAgIHBvc3QsXG4gICAgICB0eXBlXG4gICAgfTtcbiAgICBpZiAodGhpcy4jcG9zaXRpb24gPT09IC0xKSB7XG4gICAgICBpZiAodGhpcy4jY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLiNjb21tYW5kcy5sZW5ndGggPSAwO1xuICAgICAgfVxuICAgICAgdGhpcy4jcG9zaXRpb24gPSAwO1xuICAgICAgdGhpcy4jY29tbWFuZHMucHVzaChzYXZlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG92ZXJ3cml0ZUlmU2FtZVR5cGUgJiYgdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgIGlmIChrZWVwVW5kbykge1xuICAgICAgICBzYXZlLnVuZG8gPSB0aGlzLiNjb21tYW5kc1t0aGlzLiNwb3NpdGlvbl0udW5kbztcbiAgICAgIH1cbiAgICAgIHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXSA9IHNhdmU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSB0aGlzLiNwb3NpdGlvbiArIDE7XG4gICAgaWYgKG5leHQgPT09IHRoaXMuI21heFNpemUpIHtcbiAgICAgIHRoaXMuI2NvbW1hbmRzLnNwbGljZSgwLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jcG9zaXRpb24gPSBuZXh0O1xuICAgICAgaWYgKG5leHQgPCB0aGlzLiNjb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy4jY29tbWFuZHMuc3BsaWNlKG5leHQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNjb21tYW5kcy5wdXNoKHNhdmUpO1xuICB9XG4gIHVuZG8oKSB7XG4gICAgaWYgKHRoaXMuI3Bvc2l0aW9uID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNsb2NrZWQgPSB0cnVlO1xuICAgIGNvbnN0IHtcbiAgICAgIHVuZG8sXG4gICAgICBwb3N0XG4gICAgfSA9IHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXTtcbiAgICB1bmRvKCk7XG4gICAgcG9zdD8uKCk7XG4gICAgdGhpcy4jbG9ja2VkID0gZmFsc2U7XG4gICAgdGhpcy4jcG9zaXRpb24gLT0gMTtcbiAgfVxuICByZWRvKCkge1xuICAgIGlmICh0aGlzLiNwb3NpdGlvbiA8IHRoaXMuI2NvbW1hbmRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuI3Bvc2l0aW9uICs9IDE7XG4gICAgICB0aGlzLiNsb2NrZWQgPSB0cnVlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjbWQsXG4gICAgICAgIHBvc3RcbiAgICAgIH0gPSB0aGlzLiNjb21tYW5kc1t0aGlzLiNwb3NpdGlvbl07XG4gICAgICBjbWQoKTtcbiAgICAgIHBvc3Q/LigpO1xuICAgICAgdGhpcy4jbG9ja2VkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGhhc1NvbWV0aGluZ1RvVW5kbygpIHtcbiAgICByZXR1cm4gdGhpcy4jcG9zaXRpb24gIT09IC0xO1xuICB9XG4gIGhhc1NvbWV0aGluZ1RvUmVkbygpIHtcbiAgICByZXR1cm4gdGhpcy4jcG9zaXRpb24gPCB0aGlzLiNjb21tYW5kcy5sZW5ndGggLSAxO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4jY29tbWFuZHMgPSBudWxsO1xuICB9XG59XG5jbGFzcyBLZXlib2FyZE1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFja3MpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuYWxsS2V5cyA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGZvciAoY29uc3QgW2tleXMsIGNhbGxiYWNrLCBvcHRpb25zID0ge31dIG9mIGNhbGxiYWNrcykge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBjb25zdCBpc01hY0tleSA9IGtleS5zdGFydHNXaXRoKFwibWFjK1wiKTtcbiAgICAgICAgaWYgKGlzTWFjICYmIGlzTWFjS2V5KSB7XG4gICAgICAgICAgdGhpcy5jYWxsYmFja3Muc2V0KGtleS5zbGljZSg0KSwge1xuICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5hbGxLZXlzLmFkZChrZXkuc3BsaXQoXCIrXCIpLmF0KC0xKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzTWFjICYmICFpc01hY0tleSkge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLnNldChrZXksIHtcbiAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuYWxsS2V5cy5hZGQoa2V5LnNwbGl0KFwiK1wiKS5hdCgtMSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gICNzZXJpYWxpemUoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICB0aGlzLmJ1ZmZlci5wdXNoKFwiYWx0XCIpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgICAgdGhpcy5idWZmZXIucHVzaChcImN0cmxcIik7XG4gICAgfVxuICAgIGlmIChldmVudC5tZXRhS2V5KSB7XG4gICAgICB0aGlzLmJ1ZmZlci5wdXNoKFwibWV0YVwiKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICB0aGlzLmJ1ZmZlci5wdXNoKFwic2hpZnRcIik7XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyLnB1c2goZXZlbnQua2V5KTtcbiAgICBjb25zdCBzdHIgPSB0aGlzLmJ1ZmZlci5qb2luKFwiK1wiKTtcbiAgICB0aGlzLmJ1ZmZlci5sZW5ndGggPSAwO1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgZXhlYyhzZWxmLCBldmVudCkge1xuICAgIGlmICghdGhpcy5hbGxLZXlzLmhhcyhldmVudC5rZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZm8gPSB0aGlzLmNhbGxiYWNrcy5nZXQodGhpcy4jc2VyaWFsaXplKGV2ZW50KSk7XG4gICAgaWYgKCFpbmZvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBidWJibGVzID0gZmFsc2UsXG4gICAgICAgIGFyZ3MgPSBbXSxcbiAgICAgICAgY2hlY2tlciA9IG51bGxcbiAgICAgIH1cbiAgICB9ID0gaW5mbztcbiAgICBpZiAoY2hlY2tlciAmJiAhY2hlY2tlcihzZWxmLCBldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbGJhY2suYmluZChzZWxmLCAuLi5hcmdzLCBldmVudCkoKTtcbiAgICBpZiAoIWJ1YmJsZXMpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIENvbG9yTWFuYWdlciB7XG4gIHN0YXRpYyBfY29sb3JzTWFwcGluZyA9IG5ldyBNYXAoW1tcIkNhbnZhc1RleHRcIiwgWzAsIDAsIDBdXSwgW1wiQ2FudmFzXCIsIFsyNTUsIDI1NSwgMjU1XV1dKTtcbiAgZ2V0IF9jb2xvcnMoKSB7XG4gICAgY29uc3QgY29sb3JzID0gbmV3IE1hcChbW1wiQ2FudmFzVGV4dFwiLCBudWxsXSwgW1wiQ2FudmFzXCIsIG51bGxdXSk7XG4gICAgZ2V0Q29sb3JWYWx1ZXMoY29sb3JzKTtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2NvbG9yc1wiLCBjb2xvcnMpO1xuICB9XG4gIGNvbnZlcnQoY29sb3IpIHtcbiAgICBjb25zdCByZ2IgPSBnZXRSR0IoY29sb3IpO1xuICAgIGlmICghd2luZG93Lm1hdGNoTWVkaWEoXCIoZm9yY2VkLWNvbG9yczogYWN0aXZlKVwiKS5tYXRjaGVzKSB7XG4gICAgICByZXR1cm4gcmdiO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBSR0JdIG9mIHRoaXMuX2NvbG9ycykge1xuICAgICAgaWYgKFJHQi5ldmVyeSgoeCwgaSkgPT4geCA9PT0gcmdiW2ldKSkge1xuICAgICAgICByZXR1cm4gQ29sb3JNYW5hZ2VyLl9jb2xvcnNNYXBwaW5nLmdldChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJnYjtcbiAgfVxuICBnZXRIZXhDb2RlKG5hbWUpIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLl9jb2xvcnMuZ2V0KG5hbWUpO1xuICAgIGlmICghcmdiKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIFV0aWwubWFrZUhleENvbG9yKC4uLnJnYik7XG4gIH1cbn1cbmNsYXNzIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIge1xuICAjYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAjYWN0aXZlRWRpdG9yID0gbnVsbDtcbiAgI2FsbEVkaXRvcnMgPSBuZXcgTWFwKCk7XG4gICNhbGxMYXllcnMgPSBuZXcgTWFwKCk7XG4gICNhbHRUZXh0TWFuYWdlciA9IG51bGw7XG4gICNhbm5vdGF0aW9uU3RvcmFnZSA9IG51bGw7XG4gICNjaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9ucyA9IG51bGw7XG4gICNjb21tYW5kTWFuYWdlciA9IG5ldyBDb21tYW5kTWFuYWdlcigpO1xuICAjY3VycmVudFBhZ2VJbmRleCA9IDA7XG4gICNkZWxldGVkQW5ub3RhdGlvbnNFbGVtZW50SWRzID0gbmV3IFNldCgpO1xuICAjZHJhZ2dpbmdFZGl0b3JzID0gbnVsbDtcbiAgI2VkaXRvclR5cGVzID0gbnVsbDtcbiAgI2VkaXRvcnNUb1Jlc2NhbGUgPSBuZXcgU2V0KCk7XG4gICNlbmFibGVIaWdobGlnaHRGbG9hdGluZ0J1dHRvbiA9IGZhbHNlO1xuICAjZmlsdGVyRmFjdG9yeSA9IG51bGw7XG4gICNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQgPSBudWxsO1xuICAjaGlnaGxpZ2h0Q29sb3JzID0gbnVsbDtcbiAgI2hpZ2hsaWdodFdoZW5TaGlmdFVwID0gZmFsc2U7XG4gICNoaWdobGlnaHRUb29sYmFyID0gbnVsbDtcbiAgI2lkTWFuYWdlciA9IG5ldyBJZE1hbmFnZXIoKTtcbiAgI2lzRW5hYmxlZCA9IGZhbHNlO1xuICAjaXNXYWl0aW5nID0gZmFsc2U7XG4gICNsYXN0QWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICNtYWluSGlnaGxpZ2h0Q29sb3JQaWNrZXIgPSBudWxsO1xuICAjbWxNYW5hZ2VyID0gbnVsbDtcbiAgI21vZGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FO1xuICAjc2VsZWN0ZWRFZGl0b3JzID0gbmV3IFNldCgpO1xuICAjc2VsZWN0ZWRUZXh0Tm9kZSA9IG51bGw7XG4gICNwYWdlQ29sb3JzID0gbnVsbDtcbiAgI3Nob3dBbGxTdGF0ZXMgPSBudWxsO1xuICAjYm91bmRCbHVyID0gdGhpcy5ibHVyLmJpbmQodGhpcyk7XG4gICNib3VuZEZvY3VzID0gdGhpcy5mb2N1cy5iaW5kKHRoaXMpO1xuICAjYm91bmRDb3B5ID0gdGhpcy5jb3B5LmJpbmQodGhpcyk7XG4gICNib3VuZEN1dCA9IHRoaXMuY3V0LmJpbmQodGhpcyk7XG4gICNib3VuZFBhc3RlID0gdGhpcy5wYXN0ZS5iaW5kKHRoaXMpO1xuICAjYm91bmRLZXlkb3duID0gdGhpcy5rZXlkb3duLmJpbmQodGhpcyk7XG4gICNib3VuZEtleXVwID0gdGhpcy5rZXl1cC5iaW5kKHRoaXMpO1xuICAjYm91bmRPbkVkaXRpbmdBY3Rpb24gPSB0aGlzLm9uRWRpdGluZ0FjdGlvbi5iaW5kKHRoaXMpO1xuICAjYm91bmRPblBhZ2VDaGFuZ2luZyA9IHRoaXMub25QYWdlQ2hhbmdpbmcuYmluZCh0aGlzKTtcbiAgI2JvdW5kT25TY2FsZUNoYW5naW5nID0gdGhpcy5vblNjYWxlQ2hhbmdpbmcuYmluZCh0aGlzKTtcbiAgI2JvdW5kT25Sb3RhdGlvbkNoYW5naW5nID0gdGhpcy5vblJvdGF0aW9uQ2hhbmdpbmcuYmluZCh0aGlzKTtcbiAgI3ByZXZpb3VzU3RhdGVzID0ge1xuICAgIGlzRWRpdGluZzogZmFsc2UsXG4gICAgaXNFbXB0eTogdHJ1ZSxcbiAgICBoYXNTb21ldGhpbmdUb1VuZG86IGZhbHNlLFxuICAgIGhhc1NvbWV0aGluZ1RvUmVkbzogZmFsc2UsXG4gICAgaGFzU2VsZWN0ZWRFZGl0b3I6IGZhbHNlLFxuICAgIGhhc1NlbGVjdGVkVGV4dDogZmFsc2VcbiAgfTtcbiAgI3RyYW5zbGF0aW9uID0gWzAsIDBdO1xuICAjdHJhbnNsYXRpb25UaW1lb3V0SWQgPSBudWxsO1xuICAjY29udGFpbmVyID0gbnVsbDtcbiAgI3ZpZXdlciA9IG51bGw7XG4gIHN0YXRpYyBUUkFOU0xBVEVfU01BTEwgPSAxO1xuICBzdGF0aWMgVFJBTlNMQVRFX0JJRyA9IDEwO1xuICBzdGF0aWMgZ2V0IF9rZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgY29uc3QgcHJvdG8gPSBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLnByb3RvdHlwZTtcbiAgICBjb25zdCBhcnJvd0NoZWNrZXIgPSBzZWxmID0+IHNlbGYuI2NvbnRhaW5lci5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LnRhZ05hbWUgIT09IFwiQlVUVE9OXCIgJiYgc2VsZi5oYXNTb21ldGhpbmdUb0NvbnRyb2woKTtcbiAgICBjb25zdCB0ZXh0SW5wdXRDaGVja2VyID0gKF9zZWxmLCB7XG4gICAgICB0YXJnZXQ6IGVsXG4gICAgfSkgPT4ge1xuICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdHlwZVxuICAgICAgICB9ID0gZWw7XG4gICAgICAgIHJldHVybiB0eXBlICE9PSBcInRleHRcIiAmJiB0eXBlICE9PSBcIm51bWJlclwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBjb25zdCBzbWFsbCA9IHRoaXMuVFJBTlNMQVRFX1NNQUxMO1xuICAgIGNvbnN0IGJpZyA9IHRoaXMuVFJBTlNMQVRFX0JJRztcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiY3RybCthXCIsIFwibWFjK21ldGErYVwiXSwgcHJvdG8uc2VsZWN0QWxsLCB7XG4gICAgICBjaGVja2VyOiB0ZXh0SW5wdXRDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK3pcIiwgXCJtYWMrbWV0YSt6XCJdLCBwcm90by51bmRvLCB7XG4gICAgICBjaGVja2VyOiB0ZXh0SW5wdXRDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK3lcIiwgXCJjdHJsK3NoaWZ0K3pcIiwgXCJtYWMrbWV0YStzaGlmdCt6XCIsIFwiY3RybCtzaGlmdCtaXCIsIFwibWFjK21ldGErc2hpZnQrWlwiXSwgcHJvdG8ucmVkbywge1xuICAgICAgY2hlY2tlcjogdGV4dElucHV0Q2hlY2tlclxuICAgIH1dLCBbW1wiQmFja3NwYWNlXCIsIFwiYWx0K0JhY2tzcGFjZVwiLCBcImN0cmwrQmFja3NwYWNlXCIsIFwic2hpZnQrQmFja3NwYWNlXCIsIFwibWFjK0JhY2tzcGFjZVwiLCBcIm1hYythbHQrQmFja3NwYWNlXCIsIFwibWFjK2N0cmwrQmFja3NwYWNlXCIsIFwiRGVsZXRlXCIsIFwiY3RybCtEZWxldGVcIiwgXCJzaGlmdCtEZWxldGVcIiwgXCJtYWMrRGVsZXRlXCJdLCBwcm90by5kZWxldGUsIHtcbiAgICAgIGNoZWNrZXI6IHRleHRJbnB1dENoZWNrZXJcbiAgICB9XSwgW1tcIkVudGVyXCIsIFwibWFjK0VudGVyXCJdLCBwcm90by5hZGROZXdFZGl0b3JGcm9tS2V5Ym9hcmQsIHtcbiAgICAgIGNoZWNrZXI6IChzZWxmLCB7XG4gICAgICAgIHRhcmdldDogZWxcbiAgICAgIH0pID0+ICEoZWwgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCkgJiYgc2VsZi4jY29udGFpbmVyLmNvbnRhaW5zKGVsKSAmJiAhc2VsZi5pc0VudGVySGFuZGxlZFxuICAgIH1dLCBbW1wiIFwiLCBcIm1hYysgXCJdLCBwcm90by5hZGROZXdFZGl0b3JGcm9tS2V5Ym9hcmQsIHtcbiAgICAgIGNoZWNrZXI6IChzZWxmLCB7XG4gICAgICAgIHRhcmdldDogZWxcbiAgICAgIH0pID0+ICEoZWwgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCkgJiYgc2VsZi4jY29udGFpbmVyLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpXG4gICAgfV0sIFtbXCJFc2NhcGVcIiwgXCJtYWMrRXNjYXBlXCJdLCBwcm90by51bnNlbGVjdEFsbF0sIFtbXCJBcnJvd0xlZnRcIiwgXCJtYWMrQXJyb3dMZWZ0XCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFstc21hbGwsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93TGVmdFwiLCBcIm1hYytzaGlmdCtBcnJvd0xlZnRcIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogWy1iaWcsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJBcnJvd1JpZ2h0XCIsIFwibWFjK0Fycm93UmlnaHRcIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogW3NtYWxsLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd1JpZ2h0XCIsIFwibWFjK3NoaWZ0K0Fycm93UmlnaHRcIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogW2JpZywgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93VXBcIiwgXCJtYWMrQXJyb3dVcFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbMCwgLXNtYWxsXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd1VwXCIsIFwibWFjK3NoaWZ0K0Fycm93VXBcIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogWzAsIC1iaWddLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJBcnJvd0Rvd25cIiwgXCJtYWMrQXJyb3dEb3duXCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFswLCBzbWFsbF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dEb3duXCIsIFwibWFjK3NoaWZ0K0Fycm93RG93blwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbMCwgYmlnXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dXSkpO1xuICB9XG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgdmlld2VyLCBhbHRUZXh0TWFuYWdlciwgZXZlbnRCdXMsIHBkZkRvY3VtZW50LCBwYWdlQ29sb3JzLCBoaWdobGlnaHRDb2xvcnMsIGVuYWJsZUhpZ2hsaWdodEZsb2F0aW5nQnV0dG9uLCBtbE1hbmFnZXIpIHtcbiAgICB0aGlzLl9zaWduYWwgPSB0aGlzLiNhYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICAgIHRoaXMuI2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLiN2aWV3ZXIgPSB2aWV3ZXI7XG4gICAgdGhpcy4jYWx0VGV4dE1hbmFnZXIgPSBhbHRUZXh0TWFuYWdlcjtcbiAgICB0aGlzLl9ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vbihcImVkaXRpbmdhY3Rpb25cIiwgdGhpcy4jYm91bmRPbkVkaXRpbmdBY3Rpb24pO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vbihcInBhZ2VjaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uUGFnZUNoYW5naW5nKTtcbiAgICB0aGlzLl9ldmVudEJ1cy5fb24oXCJzY2FsZWNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25TY2FsZUNoYW5naW5nKTtcbiAgICB0aGlzLl9ldmVudEJ1cy5fb24oXCJyb3RhdGlvbmNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25Sb3RhdGlvbkNoYW5naW5nKTtcbiAgICB0aGlzLiNhZGRTZWxlY3Rpb25MaXN0ZW5lcigpO1xuICAgIHRoaXMuI2FkZERyYWdBbmREcm9wTGlzdGVuZXJzKCk7XG4gICAgdGhpcy4jYWRkS2V5Ym9hcmRNYW5hZ2VyKCk7XG4gICAgdGhpcy4jYW5ub3RhdGlvblN0b3JhZ2UgPSBwZGZEb2N1bWVudC5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICB0aGlzLiNmaWx0ZXJGYWN0b3J5ID0gcGRmRG9jdW1lbnQuZmlsdGVyRmFjdG9yeTtcbiAgICB0aGlzLiNwYWdlQ29sb3JzID0gcGFnZUNvbG9ycztcbiAgICB0aGlzLiNoaWdobGlnaHRDb2xvcnMgPSBoaWdobGlnaHRDb2xvcnMgfHwgbnVsbDtcbiAgICB0aGlzLiNlbmFibGVIaWdobGlnaHRGbG9hdGluZ0J1dHRvbiA9IGVuYWJsZUhpZ2hsaWdodEZsb2F0aW5nQnV0dG9uO1xuICAgIHRoaXMuI21sTWFuYWdlciA9IG1sTWFuYWdlciB8fCBudWxsO1xuICAgIHRoaXMudmlld1BhcmFtZXRlcnMgPSB7XG4gICAgICByZWFsU2NhbGU6IFBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyxcbiAgICAgIHJvdGF0aW9uOiAwXG4gICAgfTtcbiAgICB0aGlzLmlzU2hpZnRLZXlEb3duID0gZmFsc2U7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLiNhYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy4jYWJvcnRDb250cm9sbGVyID0gbnVsbDtcbiAgICB0aGlzLl9zaWduYWwgPSBudWxsO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vZmYoXCJlZGl0aW5nYWN0aW9uXCIsIHRoaXMuI2JvdW5kT25FZGl0aW5nQWN0aW9uKTtcbiAgICB0aGlzLl9ldmVudEJ1cy5fb2ZmKFwicGFnZWNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25QYWdlQ2hhbmdpbmcpO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vZmYoXCJzY2FsZWNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25TY2FsZUNoYW5naW5nKTtcbiAgICB0aGlzLl9ldmVudEJ1cy5fb2ZmKFwicm90YXRpb25jaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uUm90YXRpb25DaGFuZ2luZyk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgIGxheWVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy4jYWxsTGF5ZXJzLmNsZWFyKCk7XG4gICAgdGhpcy4jYWxsRWRpdG9ycy5jbGVhcigpO1xuICAgIHRoaXMuI2VkaXRvcnNUb1Jlc2NhbGUuY2xlYXIoKTtcbiAgICB0aGlzLiNhY3RpdmVFZGl0b3IgPSBudWxsO1xuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5jbGVhcigpO1xuICAgIHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICB0aGlzLiNhbHRUZXh0TWFuYWdlcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuI2hpZ2hsaWdodFRvb2xiYXI/LmhpZGUoKTtcbiAgICB0aGlzLiNoaWdobGlnaHRUb29sYmFyID0gbnVsbDtcbiAgICBpZiAodGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkKTtcbiAgICAgIHRoaXMuI2ZvY3VzTWFpbkNvbnRhaW5lclRpbWVvdXRJZCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLiN0cmFuc2xhdGlvblRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkKTtcbiAgICAgIHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgYXN5bmMgbWxHdWVzcyhkYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMuI21sTWFuYWdlcj8uZ3Vlc3MoZGF0YSkgfHwgbnVsbDtcbiAgfVxuICBnZXQgaGFzTUxNYW5hZ2VyKCkge1xuICAgIHJldHVybiAhIXRoaXMuI21sTWFuYWdlcjtcbiAgfVxuICBnZXQgaGNtRmlsdGVyKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJoY21GaWx0ZXJcIiwgdGhpcy4jcGFnZUNvbG9ycyA/IHRoaXMuI2ZpbHRlckZhY3RvcnkuYWRkSENNRmlsdGVyKHRoaXMuI3BhZ2VDb2xvcnMuZm9yZWdyb3VuZCwgdGhpcy4jcGFnZUNvbG9ycy5iYWNrZ3JvdW5kKSA6IFwibm9uZVwiKTtcbiAgfVxuICBnZXQgZGlyZWN0aW9uKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJkaXJlY3Rpb25cIiwgZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLiNjb250YWluZXIpLmRpcmVjdGlvbik7XG4gIH1cbiAgZ2V0IGhpZ2hsaWdodENvbG9ycygpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaGlnaGxpZ2h0Q29sb3JzXCIsIHRoaXMuI2hpZ2hsaWdodENvbG9ycyA/IG5ldyBNYXAodGhpcy4jaGlnaGxpZ2h0Q29sb3JzLnNwbGl0KFwiLFwiKS5tYXAocGFpciA9PiBwYWlyLnNwbGl0KFwiPVwiKS5tYXAoeCA9PiB4LnRyaW0oKSkpKSA6IG51bGwpO1xuICB9XG4gIGdldCBoaWdobGlnaHRDb2xvck5hbWVzKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJoaWdobGlnaHRDb2xvck5hbWVzXCIsIHRoaXMuaGlnaGxpZ2h0Q29sb3JzID8gbmV3IE1hcChBcnJheS5mcm9tKHRoaXMuaGlnaGxpZ2h0Q29sb3JzLCBlID0+IGUucmV2ZXJzZSgpKSkgOiBudWxsKTtcbiAgfVxuICBzZXRNYWluSGlnaGxpZ2h0Q29sb3JQaWNrZXIoY29sb3JQaWNrZXIpIHtcbiAgICB0aGlzLiNtYWluSGlnaGxpZ2h0Q29sb3JQaWNrZXIgPSBjb2xvclBpY2tlcjtcbiAgfVxuICBlZGl0QWx0VGV4dChlZGl0b3IpIHtcbiAgICB0aGlzLiNhbHRUZXh0TWFuYWdlcj8uZWRpdEFsdFRleHQodGhpcywgZWRpdG9yKTtcbiAgfVxuICBvblBhZ2VDaGFuZ2luZyh7XG4gICAgcGFnZU51bWJlclxuICB9KSB7XG4gICAgdGhpcy4jY3VycmVudFBhZ2VJbmRleCA9IHBhZ2VOdW1iZXIgLSAxO1xuICB9XG4gIGZvY3VzTWFpbkNvbnRhaW5lcigpIHtcbiAgICB0aGlzLiNjb250YWluZXIuZm9jdXMoKTtcbiAgfVxuICBmaW5kUGFyZW50KHgsIHkpIHtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4OiBsYXllclgsXG4gICAgICAgIHk6IGxheWVyWSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgfSA9IGxheWVyLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmICh4ID49IGxheWVyWCAmJiB4IDw9IGxheWVyWCArIHdpZHRoICYmIHkgPj0gbGF5ZXJZICYmIHkgPD0gbGF5ZXJZICsgaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZGlzYWJsZVVzZXJTZWxlY3QodmFsdWUgPSBmYWxzZSkge1xuICAgIHRoaXMuI3ZpZXdlci5jbGFzc0xpc3QudG9nZ2xlKFwibm9Vc2VyU2VsZWN0XCIsIHZhbHVlKTtcbiAgfVxuICBhZGRTaG91bGRSZXNjYWxlKGVkaXRvcikge1xuICAgIHRoaXMuI2VkaXRvcnNUb1Jlc2NhbGUuYWRkKGVkaXRvcik7XG4gIH1cbiAgcmVtb3ZlU2hvdWxkUmVzY2FsZShlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3JzVG9SZXNjYWxlLmRlbGV0ZShlZGl0b3IpO1xuICB9XG4gIG9uU2NhbGVDaGFuZ2luZyh7XG4gICAgc2NhbGVcbiAgfSkge1xuICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICB0aGlzLnZpZXdQYXJhbWV0ZXJzLnJlYWxTY2FsZSA9IHNjYWxlICogUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnNUb1Jlc2NhbGUpIHtcbiAgICAgIGVkaXRvci5vblNjYWxlQ2hhbmdpbmcoKTtcbiAgICB9XG4gIH1cbiAgb25Sb3RhdGlvbkNoYW5naW5nKHtcbiAgICBwYWdlc1JvdGF0aW9uXG4gIH0pIHtcbiAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgdGhpcy52aWV3UGFyYW1ldGVycy5yb3RhdGlvbiA9IHBhZ2VzUm90YXRpb247XG4gIH1cbiAgI2dldEFuY2hvckVsZW1lbnRGb3JTZWxlY3Rpb24oe1xuICAgIGFuY2hvck5vZGVcbiAgfSkge1xuICAgIHJldHVybiBhbmNob3JOb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSA/IGFuY2hvck5vZGUucGFyZW50RWxlbWVudCA6IGFuY2hvck5vZGU7XG4gIH1cbiAgaGlnaGxpZ2h0U2VsZWN0aW9uKG1ldGhvZE9mQ3JlYXRpb24gPSBcIlwiKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLmlzQ29sbGFwc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldFxuICAgIH0gPSBzZWxlY3Rpb247XG4gICAgY29uc3QgdGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xuICAgIGNvbnN0IGFuY2hvckVsZW1lbnQgPSB0aGlzLiNnZXRBbmNob3JFbGVtZW50Rm9yU2VsZWN0aW9uKHNlbGVjdGlvbik7XG4gICAgY29uc3QgdGV4dExheWVyID0gYW5jaG9yRWxlbWVudC5jbG9zZXN0KFwiLnRleHRMYXllclwiKTtcbiAgICBjb25zdCBib3hlcyA9IHRoaXMuZ2V0U2VsZWN0aW9uQm94ZXModGV4dExheWVyKTtcbiAgICBpZiAoIWJveGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlbGVjdGlvbi5lbXB0eSgpO1xuICAgIGlmICh0aGlzLiNtb2RlID09PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FKSB7XG4gICAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaChcInNob3dhbm5vdGF0aW9uZWRpdG9ydWlcIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIG1vZGU6IEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNob3dBbGxFZGl0b3JzKFwiaGlnaGxpZ2h0XCIsIHRydWUsIHRydWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKGxheWVyLmhhc1RleHRMYXllcih0ZXh0TGF5ZXIpKSB7XG4gICAgICAgIGxheWVyLmNyZWF0ZUFuZEFkZE5ld0VkaXRvcih7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0sIGZhbHNlLCB7XG4gICAgICAgICAgbWV0aG9kT2ZDcmVhdGlvbixcbiAgICAgICAgICBib3hlcyxcbiAgICAgICAgICBhbmNob3JOb2RlLFxuICAgICAgICAgIGFuY2hvck9mZnNldCxcbiAgICAgICAgICBmb2N1c05vZGUsXG4gICAgICAgICAgZm9jdXNPZmZzZXQsXG4gICAgICAgICAgdGV4dFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gICNkaXNwbGF5SGlnaGxpZ2h0VG9vbGJhcigpIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24uaXNDb2xsYXBzZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYW5jaG9yRWxlbWVudCA9IHRoaXMuI2dldEFuY2hvckVsZW1lbnRGb3JTZWxlY3Rpb24oc2VsZWN0aW9uKTtcbiAgICBjb25zdCB0ZXh0TGF5ZXIgPSBhbmNob3JFbGVtZW50LmNsb3Nlc3QoXCIudGV4dExheWVyXCIpO1xuICAgIGNvbnN0IGJveGVzID0gdGhpcy5nZXRTZWxlY3Rpb25Cb3hlcyh0ZXh0TGF5ZXIpO1xuICAgIGlmICghYm94ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaGlnaGxpZ2h0VG9vbGJhciB8fD0gbmV3IEhpZ2hsaWdodFRvb2xiYXIodGhpcyk7XG4gICAgdGhpcy4jaGlnaGxpZ2h0VG9vbGJhci5zaG93KHRleHRMYXllciwgYm94ZXMsIHRoaXMuZGlyZWN0aW9uID09PSBcImx0clwiKTtcbiAgfVxuICBhZGRUb0Fubm90YXRpb25TdG9yYWdlKGVkaXRvcikge1xuICAgIGlmICghZWRpdG9yLmlzRW1wdHkoKSAmJiB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZSAmJiAhdGhpcy4jYW5ub3RhdGlvblN0b3JhZ2UuaGFzKGVkaXRvci5pZCkpIHtcbiAgICAgIHRoaXMuI2Fubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKGVkaXRvci5pZCwgZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgI3NlbGVjdGlvbkNoYW5nZSgpIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24uaXNDb2xsYXBzZWQpIHtcbiAgICAgIGlmICh0aGlzLiNzZWxlY3RlZFRleHROb2RlKSB7XG4gICAgICAgIHRoaXMuI2hpZ2hsaWdodFRvb2xiYXI/LmhpZGUoKTtcbiAgICAgICAgdGhpcy4jc2VsZWN0ZWRUZXh0Tm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgICAgICBoYXNTZWxlY3RlZFRleHQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBhbmNob3JOb2RlXG4gICAgfSA9IHNlbGVjdGlvbjtcbiAgICBpZiAoYW5jaG9yTm9kZSA9PT0gdGhpcy4jc2VsZWN0ZWRUZXh0Tm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbmNob3JFbGVtZW50ID0gdGhpcy4jZ2V0QW5jaG9yRWxlbWVudEZvclNlbGVjdGlvbihzZWxlY3Rpb24pO1xuICAgIGNvbnN0IHRleHRMYXllciA9IGFuY2hvckVsZW1lbnQuY2xvc2VzdChcIi50ZXh0TGF5ZXJcIik7XG4gICAgaWYgKCF0ZXh0TGF5ZXIpIHtcbiAgICAgIGlmICh0aGlzLiNzZWxlY3RlZFRleHROb2RlKSB7XG4gICAgICAgIHRoaXMuI2hpZ2hsaWdodFRvb2xiYXI/LmhpZGUoKTtcbiAgICAgICAgdGhpcy4jc2VsZWN0ZWRUZXh0Tm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgICAgICBoYXNTZWxlY3RlZFRleHQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNoaWdobGlnaHRUb29sYmFyPy5oaWRlKCk7XG4gICAgdGhpcy4jc2VsZWN0ZWRUZXh0Tm9kZSA9IGFuY2hvck5vZGU7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU2VsZWN0ZWRUZXh0OiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKHRoaXMuI21vZGUgIT09IEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVCAmJiB0aGlzLiNtb2RlICE9PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiNtb2RlID09PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5ISUdITElHSFQpIHtcbiAgICAgIHRoaXMuc2hvd0FsbEVkaXRvcnMoXCJoaWdobGlnaHRcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuI2hpZ2hsaWdodFdoZW5TaGlmdFVwID0gdGhpcy5pc1NoaWZ0S2V5RG93bjtcbiAgICBpZiAoIXRoaXMuaXNTaGlmdEtleURvd24pIHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3NpZ25hbDtcbiAgICAgIGNvbnN0IHBvaW50ZXJ1cCA9IGUgPT4ge1xuICAgICAgICBpZiAoZS50eXBlID09PSBcInBvaW50ZXJ1cFwiICYmIGUuYnV0dG9uICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJ1cCk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVydXApO1xuICAgICAgICBpZiAoZS50eXBlID09PSBcInBvaW50ZXJ1cFwiKSB7XG4gICAgICAgICAgdGhpcy4jb25TZWxlY3RFbmQoXCJtYWluX3Rvb2xiYXJcIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBwb2ludGVydXAsIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVydXAsIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgI29uU2VsZWN0RW5kKG1ldGhvZE9mQ3JlYXRpb24gPSBcIlwiKSB7XG4gICAgaWYgKHRoaXMuI21vZGUgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVCkge1xuICAgICAgdGhpcy5oaWdobGlnaHRTZWxlY3Rpb24obWV0aG9kT2ZDcmVhdGlvbik7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNlbmFibGVIaWdobGlnaHRGbG9hdGluZ0J1dHRvbikge1xuICAgICAgdGhpcy4jZGlzcGxheUhpZ2hsaWdodFRvb2xiYXIoKTtcbiAgICB9XG4gIH1cbiAgI2FkZFNlbGVjdGlvbkxpc3RlbmVyKCkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdGhpcy4jc2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcyksIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgI2FkZEZvY3VzTWFuYWdlcigpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl9zaWduYWw7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNib3VuZEZvY3VzLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy4jYm91bmRCbHVyLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICAjcmVtb3ZlRm9jdXNNYW5hZ2VyKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy4jYm91bmRGb2N1cyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI2JvdW5kQmx1cik7XG4gIH1cbiAgYmx1cigpIHtcbiAgICB0aGlzLmlzU2hpZnRLZXlEb3duID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuI2hpZ2hsaWdodFdoZW5TaGlmdFVwKSB7XG4gICAgICB0aGlzLiNoaWdobGlnaHRXaGVuU2hpZnRVcCA9IGZhbHNlO1xuICAgICAgdGhpcy4jb25TZWxlY3RFbmQoXCJtYWluX3Rvb2xiYXJcIik7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYWN0aXZlRWxlbWVudFxuICAgIH0gPSBkb2N1bWVudDtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGlmIChlZGl0b3IuZGl2LmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuI2xhc3RBY3RpdmVFbGVtZW50ID0gW2VkaXRvciwgYWN0aXZlRWxlbWVudF07XG4gICAgICAgIGVkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb2N1cygpIHtcbiAgICBpZiAoIXRoaXMuI2xhc3RBY3RpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtsYXN0RWRpdG9yLCBsYXN0QWN0aXZlRWxlbWVudF0gPSB0aGlzLiNsYXN0QWN0aXZlRWxlbWVudDtcbiAgICB0aGlzLiNsYXN0QWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgbGFzdEFjdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgKCkgPT4ge1xuICAgICAgbGFzdEVkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gdHJ1ZTtcbiAgICB9LCB7XG4gICAgICBvbmNlOiB0cnVlLFxuICAgICAgc2lnbmFsOiB0aGlzLl9zaWduYWxcbiAgICB9KTtcbiAgICBsYXN0QWN0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG4gICNhZGRLZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fc2lnbmFsO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleWRvd24sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgdGhpcy4jYm91bmRLZXl1cCwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgI3JlbW92ZUtleWJvYXJkTWFuYWdlcigpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlkb3duKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHRoaXMuI2JvdW5kS2V5dXApO1xuICB9XG4gICNhZGRDb3B5UGFzdGVMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fc2lnbmFsO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb3B5XCIsIHRoaXMuI2JvdW5kQ29weSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImN1dFwiLCB0aGlzLiNib3VuZEN1dCwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBhc3RlXCIsIHRoaXMuI2JvdW5kUGFzdGUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gICNyZW1vdmVDb3B5UGFzdGVMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgdGhpcy4jYm91bmRDb3B5KTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY3V0XCIsIHRoaXMuI2JvdW5kQ3V0KTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgdGhpcy4jYm91bmRQYXN0ZSk7XG4gIH1cbiAgI2FkZERyYWdBbmREcm9wTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3NpZ25hbDtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ292ZXJcIiwgdGhpcy5kcmFnT3Zlci5iaW5kKHRoaXMpLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZHJvcFwiLCB0aGlzLmRyb3AuYmluZCh0aGlzKSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgYWRkRWRpdExpc3RlbmVycygpIHtcbiAgICB0aGlzLiNhZGRLZXlib2FyZE1hbmFnZXIoKTtcbiAgICB0aGlzLiNhZGRDb3B5UGFzdGVMaXN0ZW5lcnMoKTtcbiAgfVxuICByZW1vdmVFZGl0TGlzdGVuZXJzKCkge1xuICAgIHRoaXMuI3JlbW92ZUtleWJvYXJkTWFuYWdlcigpO1xuICAgIHRoaXMuI3JlbW92ZUNvcHlQYXN0ZUxpc3RlbmVycygpO1xuICB9XG4gIGRyYWdPdmVyKGV2ZW50KSB7XG4gICAgZm9yIChjb25zdCB7XG4gICAgICB0eXBlXG4gICAgfSBvZiBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXMpIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yVHlwZSBvZiB0aGlzLiNlZGl0b3JUeXBlcykge1xuICAgICAgICBpZiAoZWRpdG9yVHlwZS5pc0hhbmRsaW5nTWltZUZvclBhc3RpbmcodHlwZSkpIHtcbiAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IFwiY29weVwiO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGRyb3AoZXZlbnQpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zKSB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgdGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgICAgaWYgKGVkaXRvclR5cGUuaXNIYW5kbGluZ01pbWVGb3JQYXN0aW5nKGl0ZW0udHlwZSkpIHtcbiAgICAgICAgICBlZGl0b3JUeXBlLnBhc3RlKGl0ZW0sIHRoaXMuY3VycmVudExheWVyKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb3B5KGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLiNhY3RpdmVFZGl0b3I/LmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlZGl0b3JzID0gW107XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICBjb25zdCBzZXJpYWxpemVkID0gZWRpdG9yLnNlcmlhbGl6ZSh0cnVlKTtcbiAgICAgIGlmIChzZXJpYWxpemVkKSB7XG4gICAgICAgIGVkaXRvcnMucHVzaChzZXJpYWxpemVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVkaXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LmNsaXBib2FyZERhdGEuc2V0RGF0YShcImFwcGxpY2F0aW9uL3BkZmpzXCIsIEpTT04uc3RyaW5naWZ5KGVkaXRvcnMpKTtcbiAgfVxuICBjdXQoZXZlbnQpIHtcbiAgICB0aGlzLmNvcHkoZXZlbnQpO1xuICAgIHRoaXMuZGVsZXRlKCk7XG4gIH1cbiAgcGFzdGUoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNsaXBib2FyZERhdGFcbiAgICB9ID0gZXZlbnQ7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGNsaXBib2FyZERhdGEuaXRlbXMpIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yVHlwZSBvZiB0aGlzLiNlZGl0b3JUeXBlcykge1xuICAgICAgICBpZiAoZWRpdG9yVHlwZS5pc0hhbmRsaW5nTWltZUZvclBhc3RpbmcoaXRlbS50eXBlKSkge1xuICAgICAgICAgIGVkaXRvclR5cGUucGFzdGUoaXRlbSwgdGhpcy5jdXJyZW50TGF5ZXIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgZGF0YSA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YShcImFwcGxpY2F0aW9uL3BkZmpzXCIpO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHdhcm4oYHBhc3RlOiBcIiR7ZXgubWVzc2FnZX1cIi5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcbiAgICBjb25zdCBsYXllciA9IHRoaXMuY3VycmVudExheWVyO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBuZXdFZGl0b3JzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBkYXRhKSB7XG4gICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZEVkaXRvciA9IGxheWVyLmRlc2VyaWFsaXplKGVkaXRvcik7XG4gICAgICAgIGlmICghZGVzZXJpYWxpemVkRWRpdG9yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5ld0VkaXRvcnMucHVzaChkZXNlcmlhbGl6ZWRFZGl0b3IpO1xuICAgICAgfVxuICAgICAgY29uc3QgY21kID0gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBuZXdFZGl0b3JzKSB7XG4gICAgICAgICAgdGhpcy4jYWRkRWRpdG9yVG9MYXllcihlZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3NlbGVjdEVkaXRvcnMobmV3RWRpdG9ycyk7XG4gICAgICB9O1xuICAgICAgY29uc3QgdW5kbyA9ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgbmV3RWRpdG9ycykge1xuICAgICAgICAgIGVkaXRvci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICBjbWQsXG4gICAgICAgIHVuZG8sXG4gICAgICAgIG11c3RFeGVjOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgd2FybihgcGFzdGU6IFwiJHtleC5tZXNzYWdlfVwiLmApO1xuICAgIH1cbiAgfVxuICBrZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzU2hpZnRLZXlEb3duICYmIGV2ZW50LmtleSA9PT0gXCJTaGlmdFwiKSB7XG4gICAgICB0aGlzLmlzU2hpZnRLZXlEb3duID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI21vZGUgIT09IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUgJiYgIXRoaXMuaXNFZGl0b3JIYW5kbGluZ0tleWJvYXJkKSB7XG4gICAgICBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCBldmVudCk7XG4gICAgfVxuICB9XG4gIGtleXVwKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNTaGlmdEtleURvd24gJiYgZXZlbnQua2V5ID09PSBcIlNoaWZ0XCIpIHtcbiAgICAgIHRoaXMuaXNTaGlmdEtleURvd24gPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLiNoaWdobGlnaHRXaGVuU2hpZnRVcCkge1xuICAgICAgICB0aGlzLiNoaWdobGlnaHRXaGVuU2hpZnRVcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNvblNlbGVjdEVuZChcIm1haW5fdG9vbGJhclwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgb25FZGl0aW5nQWN0aW9uKHtcbiAgICBuYW1lXG4gIH0pIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgXCJ1bmRvXCI6XG4gICAgICBjYXNlIFwicmVkb1wiOlxuICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgY2FzZSBcInNlbGVjdEFsbFwiOlxuICAgICAgICB0aGlzW25hbWVdKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImhpZ2hsaWdodFNlbGVjdGlvblwiOlxuICAgICAgICB0aGlzLmhpZ2hsaWdodFNlbGVjdGlvbihcImNvbnRleHRfbWVudVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gICNkaXNwYXRjaFVwZGF0ZVN0YXRlcyhkZXRhaWxzKSB7XG4gICAgY29uc3QgaGFzQ2hhbmdlZCA9IE9iamVjdC5lbnRyaWVzKGRldGFpbHMpLnNvbWUoKFtrZXksIHZhbHVlXSkgPT4gdGhpcy4jcHJldmlvdXNTdGF0ZXNba2V5XSAhPT0gdmFsdWUpO1xuICAgIGlmIChoYXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaChcImFubm90YXRpb25lZGl0b3JzdGF0ZXNjaGFuZ2VkXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBkZXRhaWxzOiBPYmplY3QuYXNzaWduKHRoaXMuI3ByZXZpb3VzU3RhdGVzLCBkZXRhaWxzKVxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy4jbW9kZSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUICYmIGRldGFpbHMuaGFzU2VsZWN0ZWRFZGl0b3IgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoW1tBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfRlJFRSwgdHJ1ZV1dKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI2Rpc3BhdGNoVXBkYXRlVUkoZGV0YWlscykge1xuICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKFwiYW5ub3RhdGlvbmVkaXRvcnBhcmFtc2NoYW5nZWRcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgZGV0YWlsc1xuICAgIH0pO1xuICB9XG4gIHNldEVkaXRpbmdTdGF0ZShpc0VkaXRpbmcpIHtcbiAgICBpZiAoaXNFZGl0aW5nKSB7XG4gICAgICB0aGlzLiNhZGRGb2N1c01hbmFnZXIoKTtcbiAgICAgIHRoaXMuI2FkZENvcHlQYXN0ZUxpc3RlbmVycygpO1xuICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgICBpc0VkaXRpbmc6IHRoaXMuI21vZGUgIT09IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUsXG4gICAgICAgIGlzRW1wdHk6IHRoaXMuI2lzRW1wdHkoKSxcbiAgICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiB0aGlzLiNjb21tYW5kTWFuYWdlci5oYXNTb21ldGhpbmdUb1VuZG8oKSxcbiAgICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiB0aGlzLiNjb21tYW5kTWFuYWdlci5oYXNTb21ldGhpbmdUb1JlZG8oKSxcbiAgICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jcmVtb3ZlRm9jdXNNYW5hZ2VyKCk7XG4gICAgICB0aGlzLiNyZW1vdmVDb3B5UGFzdGVMaXN0ZW5lcnMoKTtcbiAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgICAgaXNFZGl0aW5nOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpc2FibGVVc2VyU2VsZWN0KGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgcmVnaXN0ZXJFZGl0b3JUeXBlcyh0eXBlcykge1xuICAgIGlmICh0aGlzLiNlZGl0b3JUeXBlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNlZGl0b3JUeXBlcyA9IHR5cGVzO1xuICAgIGZvciAoY29uc3QgZWRpdG9yVHlwZSBvZiB0aGlzLiNlZGl0b3JUeXBlcykge1xuICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3JUeXBlLmRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgIH1cbiAgfVxuICBnZXRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jaWRNYW5hZ2VyLmlkO1xuICB9XG4gIGdldCBjdXJyZW50TGF5ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2FsbExheWVycy5nZXQodGhpcy4jY3VycmVudFBhZ2VJbmRleCk7XG4gIH1cbiAgZ2V0TGF5ZXIocGFnZUluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuI2FsbExheWVycy5nZXQocGFnZUluZGV4KTtcbiAgfVxuICBnZXQgY3VycmVudFBhZ2VJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudFBhZ2VJbmRleDtcbiAgfVxuICBhZGRMYXllcihsYXllcikge1xuICAgIHRoaXMuI2FsbExheWVycy5zZXQobGF5ZXIucGFnZUluZGV4LCBsYXllcik7XG4gICAgaWYgKHRoaXMuI2lzRW5hYmxlZCkge1xuICAgICAgbGF5ZXIuZW5hYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlTGF5ZXIobGF5ZXIpIHtcbiAgICB0aGlzLiNhbGxMYXllcnMuZGVsZXRlKGxheWVyLnBhZ2VJbmRleCk7XG4gIH1cbiAgdXBkYXRlTW9kZShtb2RlLCBlZGl0SWQgPSBudWxsLCBpc0Zyb21LZXlib2FyZCA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuI21vZGUgPT09IG1vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jbW9kZSA9IG1vZGU7XG4gICAgaWYgKG1vZGUgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUpIHtcbiAgICAgIHRoaXMuc2V0RWRpdGluZ1N0YXRlKGZhbHNlKTtcbiAgICAgIHRoaXMuI2Rpc2FibGVBbGwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRFZGl0aW5nU3RhdGUodHJ1ZSk7XG4gICAgdGhpcy4jZW5hYmxlQWxsKCk7XG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG4gICAgICBsYXllci51cGRhdGVNb2RlKG1vZGUpO1xuICAgIH1cbiAgICBpZiAoIWVkaXRJZCAmJiBpc0Zyb21LZXlib2FyZCkge1xuICAgICAgdGhpcy5hZGROZXdFZGl0b3JGcm9tS2V5Ym9hcmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFlZGl0SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jYWxsRWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkID09PSBlZGl0SWQpIHtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZChlZGl0b3IpO1xuICAgICAgICBlZGl0b3IuZW50ZXJJbkVkaXRNb2RlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBhZGROZXdFZGl0b3JGcm9tS2V5Ym9hcmQoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudExheWVyLmNhbkNyZWF0ZU5ld0VtcHR5RWRpdG9yKCkpIHtcbiAgICAgIHRoaXMuY3VycmVudExheWVyLmFkZE5ld0VkaXRvcigpO1xuICAgIH1cbiAgfVxuICB1cGRhdGVUb29sYmFyKG1vZGUpIHtcbiAgICBpZiAobW9kZSA9PT0gdGhpcy4jbW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaChcInN3aXRjaGFubm90YXRpb25lZGl0b3Jtb2RlXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIG1vZGVcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHtcbiAgICBpZiAoIXRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5DUkVBVEU6XG4gICAgICAgIHRoaXMuY3VycmVudExheWVyLmFkZE5ld0VkaXRvcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9ERUZBVUxUX0NPTE9SOlxuICAgICAgICB0aGlzLiNtYWluSGlnaGxpZ2h0Q29sb3JQaWNrZXI/LnVwZGF0ZUNvbG9yKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9TSE9XX0FMTDpcbiAgICAgICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJyZXBvcnR0ZWxlbWV0cnlcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgICB0eXBlOiBcImVkaXRpbmdcIixcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJoaWdobGlnaHRcIixcbiAgICAgICAgICAgICAgYWN0aW9uOiBcInRvZ2dsZV92aXNpYmlsaXR5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAodGhpcy4jc2hvd0FsbFN0YXRlcyB8fD0gbmV3IE1hcCgpKS5zZXQodHlwZSwgdmFsdWUpO1xuICAgICAgICB0aGlzLnNob3dBbGxFZGl0b3JzKFwiaGlnaGxpZ2h0XCIsIHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgZWRpdG9yLnVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWRpdG9yVHlwZSBvZiB0aGlzLiNlZGl0b3JUeXBlcykge1xuICAgICAgZWRpdG9yVHlwZS51cGRhdGVEZWZhdWx0UGFyYW1zKHR5cGUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgc2hvd0FsbEVkaXRvcnModHlwZSwgdmlzaWJsZSwgdXBkYXRlQnV0dG9uID0gZmFsc2UpIHtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZWRpdG9yLmVkaXRvclR5cGUgPT09IHR5cGUpIHtcbiAgICAgICAgZWRpdG9yLnNob3codmlzaWJsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy4jc2hvd0FsbFN0YXRlcz8uZ2V0KEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9TSE9XX0FMTCkgPz8gdHJ1ZTtcbiAgICBpZiAoc3RhdGUgIT09IHZpc2libGUpIHtcbiAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoW1tBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfU0hPV19BTEwsIHZpc2libGVdXSk7XG4gICAgfVxuICB9XG4gIGVuYWJsZVdhaXRpbmcobXVzdFdhaXQgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLiNpc1dhaXRpbmcgPT09IG11c3RXYWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2lzV2FpdGluZyA9IG11c3RXYWl0O1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG4gICAgICBpZiAobXVzdFdhaXQpIHtcbiAgICAgICAgbGF5ZXIuZGlzYWJsZUNsaWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXllci5lbmFibGVDbGljaygpO1xuICAgICAgfVxuICAgICAgbGF5ZXIuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJ3YWl0aW5nXCIsIG11c3RXYWl0KTtcbiAgICB9XG4gIH1cbiAgI2VuYWJsZUFsbCgpIHtcbiAgICBpZiAoIXRoaXMuI2lzRW5hYmxlZCkge1xuICAgICAgdGhpcy4jaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG4gICAgICAgIGxheWVyLmVuYWJsZSgpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jYWxsRWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgICBlZGl0b3IuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gICNkaXNhYmxlQWxsKCkge1xuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcbiAgICBpZiAodGhpcy4jaXNFbmFibGVkKSB7XG4gICAgICB0aGlzLiNpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG4gICAgICAgIGxheWVyLmRpc2FibGUoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgICAgZWRpdG9yLmRpc2FibGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0RWRpdG9ycyhwYWdlSW5kZXgpIHtcbiAgICBjb25zdCBlZGl0b3JzID0gW107XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jYWxsRWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVkaXRvci5wYWdlSW5kZXggPT09IHBhZ2VJbmRleCkge1xuICAgICAgICBlZGl0b3JzLnB1c2goZWRpdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVkaXRvcnM7XG4gIH1cbiAgZ2V0RWRpdG9yKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuI2FsbEVkaXRvcnMuZ2V0KGlkKTtcbiAgfVxuICBhZGRFZGl0b3IoZWRpdG9yKSB7XG4gICAgdGhpcy4jYWxsRWRpdG9ycy5zZXQoZWRpdG9yLmlkLCBlZGl0b3IpO1xuICB9XG4gIHJlbW92ZUVkaXRvcihlZGl0b3IpIHtcbiAgICBpZiAoZWRpdG9yLmRpdi5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgaWYgKHRoaXMuI2ZvY3VzTWFpbkNvbnRhaW5lclRpbWVvdXRJZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI2ZvY3VzTWFpbkNvbnRhaW5lclRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmZvY3VzTWFpbkNvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICAgIHRoaXMuI2FsbEVkaXRvcnMuZGVsZXRlKGVkaXRvci5pZCk7XG4gICAgdGhpcy51bnNlbGVjdChlZGl0b3IpO1xuICAgIGlmICghZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQgfHwgIXRoaXMuI2RlbGV0ZWRBbm5vdGF0aW9uc0VsZW1lbnRJZHMuaGFzKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKSkge1xuICAgICAgdGhpcy4jYW5ub3RhdGlvblN0b3JhZ2U/LnJlbW92ZShlZGl0b3IuaWQpO1xuICAgIH1cbiAgfVxuICBhZGREZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZWRpdG9yKSB7XG4gICAgdGhpcy4jZGVsZXRlZEFubm90YXRpb25zRWxlbWVudElkcy5hZGQoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpO1xuICAgIHRoaXMuYWRkQ2hhbmdlZEV4aXN0aW5nQW5ub3RhdGlvbihlZGl0b3IpO1xuICAgIGVkaXRvci5kZWxldGVkID0gdHJ1ZTtcbiAgfVxuICBpc0RlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWRBbm5vdGF0aW9uc0VsZW1lbnRJZHMuaGFzKGFubm90YXRpb25FbGVtZW50SWQpO1xuICB9XG4gIHJlbW92ZURlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IpIHtcbiAgICB0aGlzLiNkZWxldGVkQW5ub3RhdGlvbnNFbGVtZW50SWRzLmRlbGV0ZShlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCk7XG4gICAgdGhpcy5yZW1vdmVDaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9uKGVkaXRvcik7XG4gICAgZWRpdG9yLmRlbGV0ZWQgPSBmYWxzZTtcbiAgfVxuICAjYWRkRWRpdG9yVG9MYXllcihlZGl0b3IpIHtcbiAgICBjb25zdCBsYXllciA9IHRoaXMuI2FsbExheWVycy5nZXQoZWRpdG9yLnBhZ2VJbmRleCk7XG4gICAgaWYgKGxheWVyKSB7XG4gICAgICBsYXllci5hZGRPclJlYnVpbGQoZWRpdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRFZGl0b3IoZWRpdG9yKTtcbiAgICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZShlZGl0b3IpO1xuICAgIH1cbiAgfVxuICBzZXRBY3RpdmVFZGl0b3IoZWRpdG9yKSB7XG4gICAgaWYgKHRoaXMuI2FjdGl2ZUVkaXRvciA9PT0gZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FjdGl2ZUVkaXRvciA9IGVkaXRvcjtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKGVkaXRvci5wcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgIH1cbiAgfVxuICBnZXQgI2xhc3RTZWxlY3RlZEVkaXRvcigpIHtcbiAgICBsZXQgZWQgPSBudWxsO1xuICAgIGZvciAoZWQgb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7fVxuICAgIHJldHVybiBlZDtcbiAgfVxuICB1cGRhdGVVSShlZGl0b3IpIHtcbiAgICBpZiAodGhpcy4jbGFzdFNlbGVjdGVkRWRpdG9yID09PSBlZGl0b3IpIHtcbiAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoZWRpdG9yLnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgfVxuICB9XG4gIHRvZ2dsZVNlbGVjdGVkKGVkaXRvcikge1xuICAgIGlmICh0aGlzLiNzZWxlY3RlZEVkaXRvcnMuaGFzKGVkaXRvcikpIHtcbiAgICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5kZWxldGUoZWRpdG9yKTtcbiAgICAgIGVkaXRvci51bnNlbGVjdCgpO1xuICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgICBoYXNTZWxlY3RlZEVkaXRvcjogdGhpcy5oYXNTZWxlY3Rpb25cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuYWRkKGVkaXRvcik7XG4gICAgZWRpdG9yLnNlbGVjdCgpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoZWRpdG9yLnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRydWVcbiAgICB9KTtcbiAgfVxuICBzZXRTZWxlY3RlZChlZGl0b3IpIHtcbiAgICBmb3IgKGNvbnN0IGVkIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgaWYgKGVkICE9PSBlZGl0b3IpIHtcbiAgICAgICAgZWQudW5zZWxlY3QoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmNsZWFyKCk7XG4gICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmFkZChlZGl0b3IpO1xuICAgIGVkaXRvci5zZWxlY3QoKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKGVkaXRvci5wcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgaXNTZWxlY3RlZChlZGl0b3IpIHtcbiAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmhhcyhlZGl0b3IpO1xuICB9XG4gIGdldCBmaXJzdFNlbGVjdGVkRWRpdG9yKCkge1xuICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xuICB9XG4gIHVuc2VsZWN0KGVkaXRvcikge1xuICAgIGVkaXRvci51bnNlbGVjdCgpO1xuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5kZWxldGUoZWRpdG9yKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTZWxlY3RlZEVkaXRvcjogdGhpcy5oYXNTZWxlY3Rpb25cbiAgICB9KTtcbiAgfVxuICBnZXQgaGFzU2VsZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuc2l6ZSAhPT0gMDtcbiAgfVxuICBnZXQgaXNFbnRlckhhbmRsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5zaXplID09PSAxICYmIHRoaXMuZmlyc3RTZWxlY3RlZEVkaXRvci5pc0VudGVySGFuZGxlZDtcbiAgfVxuICB1bmRvKCkge1xuICAgIHRoaXMuI2NvbW1hbmRNYW5hZ2VyLnVuZG8oKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTb21ldGhpbmdUb1VuZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvVW5kbygpLFxuICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiB0cnVlLFxuICAgICAgaXNFbXB0eTogdGhpcy4jaXNFbXB0eSgpXG4gICAgfSk7XG4gIH1cbiAgcmVkbygpIHtcbiAgICB0aGlzLiNjb21tYW5kTWFuYWdlci5yZWRvKCk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiB0cnVlLFxuICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiB0aGlzLiNjb21tYW5kTWFuYWdlci5oYXNTb21ldGhpbmdUb1JlZG8oKSxcbiAgICAgIGlzRW1wdHk6IHRoaXMuI2lzRW1wdHkoKVxuICAgIH0pO1xuICB9XG4gIGFkZENvbW1hbmRzKHBhcmFtcykge1xuICAgIHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmFkZChwYXJhbXMpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogdHJ1ZSxcbiAgICAgIGhhc1NvbWV0aGluZ1RvUmVkbzogZmFsc2UsXG4gICAgICBpc0VtcHR5OiB0aGlzLiNpc0VtcHR5KClcbiAgICB9KTtcbiAgfVxuICAjaXNFbXB0eSgpIHtcbiAgICBpZiAodGhpcy4jYWxsRWRpdG9ycy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2FsbEVkaXRvcnMuc2l6ZSA9PT0gMSkge1xuICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jYWxsRWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgICByZXR1cm4gZWRpdG9yLmlzRW1wdHkoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGRlbGV0ZSgpIHtcbiAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlZGl0b3JzID0gWy4uLnRoaXMuI3NlbGVjdGVkRWRpdG9yc107XG4gICAgY29uc3QgY21kID0gKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZWRpdG9ycykge1xuICAgICAgICBlZGl0b3IucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB1bmRvID0gKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZWRpdG9ycykge1xuICAgICAgICB0aGlzLiNhZGRFZGl0b3JUb0xheWVyKGVkaXRvcik7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZCxcbiAgICAgIHVuZG8sXG4gICAgICBtdXN0RXhlYzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIGNvbW1pdE9yUmVtb3ZlKCkge1xuICAgIHRoaXMuI2FjdGl2ZUVkaXRvcj8uY29tbWl0T3JSZW1vdmUoKTtcbiAgfVxuICBoYXNTb21ldGhpbmdUb0NvbnRyb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuI2FjdGl2ZUVkaXRvciB8fCB0aGlzLmhhc1NlbGVjdGlvbjtcbiAgfVxuICAjc2VsZWN0RWRpdG9ycyhlZGl0b3JzKSB7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICBlZGl0b3IudW5zZWxlY3QoKTtcbiAgICB9XG4gICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZWRpdG9ycykge1xuICAgICAgaWYgKGVkaXRvci5pc0VtcHR5KCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuYWRkKGVkaXRvcik7XG4gICAgICBlZGl0b3Iuc2VsZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0aGlzLmhhc1NlbGVjdGlvblxuICAgIH0pO1xuICB9XG4gIHNlbGVjdEFsbCgpIHtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGVkaXRvci5jb21taXQoKTtcbiAgICB9XG4gICAgdGhpcy4jc2VsZWN0RWRpdG9ycyh0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKTtcbiAgfVxuICB1bnNlbGVjdEFsbCgpIHtcbiAgICBpZiAodGhpcy4jYWN0aXZlRWRpdG9yKSB7XG4gICAgICB0aGlzLiNhY3RpdmVFZGl0b3IuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgIGlmICh0aGlzLiNtb2RlICE9PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGVkaXRvci51bnNlbGVjdCgpO1xuICAgIH1cbiAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuY2xlYXIoKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTZWxlY3RlZEVkaXRvcjogZmFsc2VcbiAgICB9KTtcbiAgfVxuICB0cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMoeCwgeSwgbm9Db21taXQgPSBmYWxzZSkge1xuICAgIGlmICghbm9Db21taXQpIHtcbiAgICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiN0cmFuc2xhdGlvblswXSArPSB4O1xuICAgIHRoaXMuI3RyYW5zbGF0aW9uWzFdICs9IHk7XG4gICAgY29uc3QgW3RvdGFsWCwgdG90YWxZXSA9IHRoaXMuI3RyYW5zbGF0aW9uO1xuICAgIGNvbnN0IGVkaXRvcnMgPSBbLi4udGhpcy4jc2VsZWN0ZWRFZGl0b3JzXTtcbiAgICBjb25zdCBUSU1FX1RPX1dBSVQgPSAxMDAwO1xuICAgIGlmICh0aGlzLiN0cmFuc2xhdGlvblRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkKTtcbiAgICB9XG4gICAgdGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkID0gbnVsbDtcbiAgICAgIHRoaXMuI3RyYW5zbGF0aW9uWzBdID0gdGhpcy4jdHJhbnNsYXRpb25bMV0gPSAwO1xuICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhbGxFZGl0b3JzLmhhcyhlZGl0b3IuaWQpKSB7XG4gICAgICAgICAgICAgIGVkaXRvci50cmFuc2xhdGVJblBhZ2UodG90YWxYLCB0b3RhbFkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhbGxFZGl0b3JzLmhhcyhlZGl0b3IuaWQpKSB7XG4gICAgICAgICAgICAgIGVkaXRvci50cmFuc2xhdGVJblBhZ2UoLXRvdGFsWCwgLXRvdGFsWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtdXN0RXhlYzogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0sIFRJTUVfVE9fV0FJVCk7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZWRpdG9ycykge1xuICAgICAgZWRpdG9yLnRyYW5zbGF0ZUluUGFnZSh4LCB5KTtcbiAgICB9XG4gIH1cbiAgc2V0VXBEcmFnU2Vzc2lvbigpIHtcbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZVVzZXJTZWxlY3QodHJ1ZSk7XG4gICAgdGhpcy4jZHJhZ2dpbmdFZGl0b3JzID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgdGhpcy4jZHJhZ2dpbmdFZGl0b3JzLnNldChlZGl0b3IsIHtcbiAgICAgICAgc2F2ZWRYOiBlZGl0b3IueCxcbiAgICAgICAgc2F2ZWRZOiBlZGl0b3IueSxcbiAgICAgICAgc2F2ZWRQYWdlSW5kZXg6IGVkaXRvci5wYWdlSW5kZXgsXG4gICAgICAgIG5ld1g6IDAsXG4gICAgICAgIG5ld1k6IDAsXG4gICAgICAgIG5ld1BhZ2VJbmRleDogLTFcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBlbmREcmFnU2Vzc2lvbigpIHtcbiAgICBpZiAoIXRoaXMuI2RyYWdnaW5nRWRpdG9ycykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVVc2VyU2VsZWN0KGZhbHNlKTtcbiAgICBjb25zdCBtYXAgPSB0aGlzLiNkcmFnZ2luZ0VkaXRvcnM7XG4gICAgdGhpcy4jZHJhZ2dpbmdFZGl0b3JzID0gbnVsbDtcbiAgICBsZXQgbXVzdEJlQWRkZWRJblVuZG9TdGFjayA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgW3tcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgcGFnZUluZGV4XG4gICAgfSwgdmFsdWVdIG9mIG1hcCkge1xuICAgICAgdmFsdWUubmV3WCA9IHg7XG4gICAgICB2YWx1ZS5uZXdZID0geTtcbiAgICAgIHZhbHVlLm5ld1BhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICAgIG11c3RCZUFkZGVkSW5VbmRvU3RhY2sgfHw9IHggIT09IHZhbHVlLnNhdmVkWCB8fCB5ICE9PSB2YWx1ZS5zYXZlZFkgfHwgcGFnZUluZGV4ICE9PSB2YWx1ZS5zYXZlZFBhZ2VJbmRleDtcbiAgICB9XG4gICAgaWYgKCFtdXN0QmVBZGRlZEluVW5kb1N0YWNrKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG1vdmUgPSAoZWRpdG9yLCB4LCB5LCBwYWdlSW5kZXgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNhbGxFZGl0b3JzLmhhcyhlZGl0b3IuaWQpKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuI2FsbExheWVycy5nZXQocGFnZUluZGV4KTtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgIGVkaXRvci5fc2V0UGFyZW50QW5kUG9zaXRpb24ocGFyZW50LCB4LCB5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGl0b3IucGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgICAgICAgIGVkaXRvci54ID0geDtcbiAgICAgICAgICBlZGl0b3IueSA9IHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2VkaXRvciwge1xuICAgICAgICAgIG5ld1gsXG4gICAgICAgICAgbmV3WSxcbiAgICAgICAgICBuZXdQYWdlSW5kZXhcbiAgICAgICAgfV0gb2YgbWFwKSB7XG4gICAgICAgICAgbW92ZShlZGl0b3IsIG5ld1gsIG5ld1ksIG5ld1BhZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2VkaXRvciwge1xuICAgICAgICAgIHNhdmVkWCxcbiAgICAgICAgICBzYXZlZFksXG4gICAgICAgICAgc2F2ZWRQYWdlSW5kZXhcbiAgICAgICAgfV0gb2YgbWFwKSB7XG4gICAgICAgICAgbW92ZShlZGl0b3IsIHNhdmVkWCwgc2F2ZWRZLCBzYXZlZFBhZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBtdXN0RXhlYzogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGRyYWdTZWxlY3RlZEVkaXRvcnModHgsIHR5KSB7XG4gICAgaWYgKCF0aGlzLiNkcmFnZ2luZ0VkaXRvcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZHJhZ2dpbmdFZGl0b3JzLmtleXMoKSkge1xuICAgICAgZWRpdG9yLmRyYWcodHgsIHR5KTtcbiAgICB9XG4gIH1cbiAgcmVidWlsZChlZGl0b3IpIHtcbiAgICBpZiAoZWRpdG9yLnBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5nZXRMYXllcihlZGl0b3IucGFnZUluZGV4KTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcGFyZW50LmNoYW5nZVBhcmVudChlZGl0b3IpO1xuICAgICAgICBwYXJlbnQuYWRkT3JSZWJ1aWxkKGVkaXRvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkZEVkaXRvcihlZGl0b3IpO1xuICAgICAgICB0aGlzLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoZWRpdG9yKTtcbiAgICAgICAgZWRpdG9yLnJlYnVpbGQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdG9yLnBhcmVudC5hZGRPclJlYnVpbGQoZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGlzRWRpdG9ySGFuZGxpbmdLZXlib2FyZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmUoKT8uc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKSB8fCB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuc2l6ZSA9PT0gMSAmJiB0aGlzLmZpcnN0U2VsZWN0ZWRFZGl0b3Iuc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKTtcbiAgfVxuICBpc0FjdGl2ZShlZGl0b3IpIHtcbiAgICByZXR1cm4gdGhpcy4jYWN0aXZlRWRpdG9yID09PSBlZGl0b3I7XG4gIH1cbiAgZ2V0QWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLiNhY3RpdmVFZGl0b3I7XG4gIH1cbiAgZ2V0TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbW9kZTtcbiAgfVxuICBnZXQgaW1hZ2VNYW5hZ2VyKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpbWFnZU1hbmFnZXJcIiwgbmV3IEltYWdlTWFuYWdlcigpKTtcbiAgfVxuICBnZXRTZWxlY3Rpb25Cb3hlcyh0ZXh0TGF5ZXIpIHtcbiAgICBpZiAoIXRleHRMYXllcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNlbGVjdGlvbi5yYW5nZUNvdW50OyBpIDwgaWk7IGkrKykge1xuICAgICAgaWYgKCF0ZXh0TGF5ZXIuY29udGFpbnMoc2VsZWN0aW9uLmdldFJhbmdlQXQoaSkuY29tbW9uQW5jZXN0b3JDb250YWluZXIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICB4OiBsYXllclgsXG4gICAgICB5OiBsYXllclksXG4gICAgICB3aWR0aDogcGFyZW50V2lkdGgsXG4gICAgICBoZWlnaHQ6IHBhcmVudEhlaWdodFxuICAgIH0gPSB0ZXh0TGF5ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHJvdGF0b3I7XG4gICAgc3dpdGNoICh0ZXh0TGF5ZXIuZ2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIpKSB7XG4gICAgICBjYXNlIFwiOTBcIjpcbiAgICAgICAgcm90YXRvciA9ICh4LCB5LCB3LCBoKSA9PiAoe1xuICAgICAgICAgIHg6ICh5IC0gbGF5ZXJZKSAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICB5OiAxIC0gKHggKyB3IC0gbGF5ZXJYKSAvIHBhcmVudFdpZHRoLFxuICAgICAgICAgIHdpZHRoOiBoIC8gcGFyZW50SGVpZ2h0LFxuICAgICAgICAgIGhlaWdodDogdyAvIHBhcmVudFdpZHRoXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCIxODBcIjpcbiAgICAgICAgcm90YXRvciA9ICh4LCB5LCB3LCBoKSA9PiAoe1xuICAgICAgICAgIHg6IDEgLSAoeCArIHcgLSBsYXllclgpIC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgeTogMSAtICh5ICsgaCAtIGxheWVyWSkgLyBwYXJlbnRIZWlnaHQsXG4gICAgICAgICAgd2lkdGg6IHcgLyBwYXJlbnRXaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGggLyBwYXJlbnRIZWlnaHRcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIjI3MFwiOlxuICAgICAgICByb3RhdG9yID0gKHgsIHksIHcsIGgpID0+ICh7XG4gICAgICAgICAgeDogMSAtICh5ICsgaCAtIGxheWVyWSkgLyBwYXJlbnRIZWlnaHQsXG4gICAgICAgICAgeTogKHggLSBsYXllclgpIC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgd2lkdGg6IGggLyBwYXJlbnRIZWlnaHQsXG4gICAgICAgICAgaGVpZ2h0OiB3IC8gcGFyZW50V2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcm90YXRvciA9ICh4LCB5LCB3LCBoKSA9PiAoe1xuICAgICAgICAgIHg6ICh4IC0gbGF5ZXJYKSAvIHBhcmVudFdpZHRoLFxuICAgICAgICAgIHk6ICh5IC0gbGF5ZXJZKSAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICB3aWR0aDogdyAvIHBhcmVudFdpZHRoLFxuICAgICAgICAgIGhlaWdodDogaCAvIHBhcmVudEhlaWdodFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IGJveGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc2VsZWN0aW9uLnJhbmdlQ291bnQ7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpO1xuICAgICAgaWYgKHJhbmdlLmNvbGxhcHNlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9IG9mIHJhbmdlLmdldENsaWVudFJlY3RzKCkpIHtcbiAgICAgICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJveGVzLnB1c2gocm90YXRvcih4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBib3hlcy5sZW5ndGggPT09IDAgPyBudWxsIDogYm94ZXM7XG4gIH1cbiAgYWRkQ2hhbmdlZEV4aXN0aW5nQW5ub3RhdGlvbih7XG4gICAgYW5ub3RhdGlvbkVsZW1lbnRJZCxcbiAgICBpZFxuICB9KSB7XG4gICAgKHRoaXMuI2NoYW5nZWRFeGlzdGluZ0Fubm90YXRpb25zIHx8PSBuZXcgTWFwKCkpLnNldChhbm5vdGF0aW9uRWxlbWVudElkLCBpZCk7XG4gIH1cbiAgcmVtb3ZlQ2hhbmdlZEV4aXN0aW5nQW5ub3RhdGlvbih7XG4gICAgYW5ub3RhdGlvbkVsZW1lbnRJZFxuICB9KSB7XG4gICAgdGhpcy4jY2hhbmdlZEV4aXN0aW5nQW5ub3RhdGlvbnM/LmRlbGV0ZShhbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgfVxuICByZW5kZXJBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uKSB7XG4gICAgY29uc3QgZWRpdG9ySWQgPSB0aGlzLiNjaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9ucz8uZ2V0KGFubm90YXRpb24uZGF0YS5pZCk7XG4gICAgaWYgKCFlZGl0b3JJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZS5nZXRSYXdWYWx1ZShlZGl0b3JJZCk7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI21vZGUgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUgJiYgIWVkaXRvci5oYXNCZWVuTW9kaWZpZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWRpdG9yLnJlbmRlckFubm90YXRpb25FbGVtZW50KGFubm90YXRpb24pO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9hbHRfdGV4dC5qc1xuXG5jbGFzcyBBbHRUZXh0IHtcbiAgI2FsdFRleHQgPSBcIlwiO1xuICAjYWx0VGV4dERlY29yYXRpdmUgPSBmYWxzZTtcbiAgI2FsdFRleHRCdXR0b24gPSBudWxsO1xuICAjYWx0VGV4dFRvb2x0aXAgPSBudWxsO1xuICAjYWx0VGV4dFRvb2x0aXBUaW1lb3V0ID0gbnVsbDtcbiAgI2FsdFRleHRXYXNGcm9tS2V5Qm9hcmQgPSBmYWxzZTtcbiAgI2VkaXRvciA9IG51bGw7XG4gIHN0YXRpYyBfbDEwblByb21pc2UgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3IgPSBlZGl0b3I7XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwblByb21pc2UpIHtcbiAgICBBbHRUZXh0Ll9sMTBuUHJvbWlzZSB8fD0gbDEwblByb21pc2U7XG4gIH1cbiAgYXN5bmMgcmVuZGVyKCkge1xuICAgIGNvbnN0IGFsdFRleHQgPSB0aGlzLiNhbHRUZXh0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICBhbHRUZXh0LmNsYXNzTmFtZSA9IFwiYWx0VGV4dFwiO1xuICAgIGNvbnN0IG1zZyA9IGF3YWl0IEFsdFRleHQuX2wxMG5Qcm9taXNlLmdldChcInBkZmpzLWVkaXRvci1hbHQtdGV4dC1idXR0b24tbGFiZWxcIik7XG4gICAgYWx0VGV4dC50ZXh0Q29udGVudCA9IG1zZztcbiAgICBhbHRUZXh0LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgbXNnKTtcbiAgICBhbHRUZXh0LnRhYkluZGV4ID0gXCIwXCI7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy4jZWRpdG9yLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICBhbHRUZXh0LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBhbHRUZXh0LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBldmVudCA9PiBldmVudC5zdG9wUHJvcGFnYXRpb24oKSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgY29uc3Qgb25DbGljayA9IGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5lZGl0QWx0VGV4dCh0aGlzLiNlZGl0b3IpO1xuICAgIH07XG4gICAgYWx0VGV4dC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgb25DbGljaywge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGFsdFRleHQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gYWx0VGV4dCAmJiBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xuICAgICAgICB0aGlzLiNhbHRUZXh0V2FzRnJvbUtleUJvYXJkID0gdHJ1ZTtcbiAgICAgICAgb25DbGljayhldmVudCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy4jc2V0U3RhdGUoKTtcbiAgICByZXR1cm4gYWx0VGV4dDtcbiAgfVxuICBmaW5pc2goKSB7XG4gICAgaWYgKCF0aGlzLiNhbHRUZXh0QnV0dG9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FsdFRleHRCdXR0b24uZm9jdXMoe1xuICAgICAgZm9jdXNWaXNpYmxlOiB0aGlzLiNhbHRUZXh0V2FzRnJvbUtleUJvYXJkXG4gICAgfSk7XG4gICAgdGhpcy4jYWx0VGV4dFdhc0Zyb21LZXlCb2FyZCA9IGZhbHNlO1xuICB9XG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuICF0aGlzLiNhbHRUZXh0ICYmICF0aGlzLiNhbHRUZXh0RGVjb3JhdGl2ZTtcbiAgfVxuICBnZXQgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWx0VGV4dDogdGhpcy4jYWx0VGV4dCxcbiAgICAgIGRlY29yYXRpdmU6IHRoaXMuI2FsdFRleHREZWNvcmF0aXZlXG4gICAgfTtcbiAgfVxuICBzZXQgZGF0YSh7XG4gICAgYWx0VGV4dCxcbiAgICBkZWNvcmF0aXZlXG4gIH0pIHtcbiAgICBpZiAodGhpcy4jYWx0VGV4dCA9PT0gYWx0VGV4dCAmJiB0aGlzLiNhbHRUZXh0RGVjb3JhdGl2ZSA9PT0gZGVjb3JhdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhbHRUZXh0ID0gYWx0VGV4dDtcbiAgICB0aGlzLiNhbHRUZXh0RGVjb3JhdGl2ZSA9IGRlY29yYXRpdmU7XG4gICAgdGhpcy4jc2V0U3RhdGUoKTtcbiAgfVxuICB0b2dnbGUoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgaWYgKCF0aGlzLiNhbHRUZXh0QnV0dG9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZW5hYmxlZCAmJiB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQpO1xuICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy4jYWx0VGV4dEJ1dHRvbi5kaXNhYmxlZCA9ICFlbmFibGVkO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4jYWx0VGV4dEJ1dHRvbj8ucmVtb3ZlKCk7XG4gICAgdGhpcy4jYWx0VGV4dEJ1dHRvbiA9IG51bGw7XG4gICAgdGhpcy4jYWx0VGV4dFRvb2x0aXAgPSBudWxsO1xuICB9XG4gIGFzeW5jICNzZXRTdGF0ZSgpIHtcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLiNhbHRUZXh0QnV0dG9uO1xuICAgIGlmICghYnV0dG9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jYWx0VGV4dCAmJiAhdGhpcy4jYWx0VGV4dERlY29yYXRpdmUpIHtcbiAgICAgIGJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwiZG9uZVwiKTtcbiAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwPy5yZW1vdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJkb25lXCIpO1xuICAgIEFsdFRleHQuX2wxMG5Qcm9taXNlLmdldChcInBkZmpzLWVkaXRvci1hbHQtdGV4dC1lZGl0LWJ1dHRvbi1sYWJlbFwiKS50aGVuKG1zZyA9PiB7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBtc2cpO1xuICAgIH0pO1xuICAgIGxldCB0b29sdGlwID0gdGhpcy4jYWx0VGV4dFRvb2x0aXA7XG4gICAgaWYgKCF0b29sdGlwKSB7XG4gICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcCA9IHRvb2x0aXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIHRvb2x0aXAuY2xhc3NOYW1lID0gXCJ0b29sdGlwXCI7XG4gICAgICB0b29sdGlwLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0b29sdGlwXCIpO1xuICAgICAgY29uc3QgaWQgPSB0b29sdGlwLmlkID0gYGFsdC10ZXh0LXRvb2x0aXAtJHt0aGlzLiNlZGl0b3IuaWR9YDtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIsIGlkKTtcbiAgICAgIGNvbnN0IERFTEFZX1RPX1NIT1dfVE9PTFRJUCA9IDEwMDtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCk7XG4gICAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCA9IG51bGw7XG4gICAgICB9LCB7XG4gICAgICAgIG9uY2U6IHRydWVcbiAgICAgIH0pO1xuICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcC5jbGFzc0xpc3QuYWRkKFwic2hvd1wiKTtcbiAgICAgICAgICB0aGlzLiNlZGl0b3IuX3JlcG9ydFRlbGVtZXRyeSh7XG4gICAgICAgICAgICBhY3Rpb246IFwiYWx0X3RleHRfdG9vbHRpcFwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIERFTEFZX1RPX1NIT1dfVE9PTFRJUCk7XG4gICAgICB9LCB7XG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0KSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCk7XG4gICAgICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcD8uY2xhc3NMaXN0LnJlbW92ZShcInNob3dcIik7XG4gICAgICB9LCB7XG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRvb2x0aXAuaW5uZXJUZXh0ID0gdGhpcy4jYWx0VGV4dERlY29yYXRpdmUgPyBhd2FpdCBBbHRUZXh0Ll9sMTBuUHJvbWlzZS5nZXQoXCJwZGZqcy1lZGl0b3ItYWx0LXRleHQtZGVjb3JhdGl2ZS10b29sdGlwXCIpIDogdGhpcy4jYWx0VGV4dDtcbiAgICBpZiAoIXRvb2x0aXAucGFyZW50Tm9kZSkge1xuICAgICAgYnV0dG9uLmFwcGVuZCh0b29sdGlwKTtcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuI2VkaXRvci5nZXRJbWFnZUZvckFsdFRleHQoKTtcbiAgICBlbGVtZW50Py5zZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIsIHRvb2x0aXAuaWQpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9lZGl0b3IuanNcblxuXG5cblxuXG5jbGFzcyBBbm5vdGF0aW9uRWRpdG9yIHtcbiAgI2FjY2Vzc2liaWxpdHlEYXRhID0gbnVsbDtcbiAgI2FsbFJlc2l6ZXJEaXZzID0gbnVsbDtcbiAgI2FsdFRleHQgPSBudWxsO1xuICAjZGlzYWJsZWQgPSBmYWxzZTtcbiAgI2tlZXBBc3BlY3RSYXRpbyA9IGZhbHNlO1xuICAjcmVzaXplcnNEaXYgPSBudWxsO1xuICAjc2F2ZWREaW1lbnNpb25zID0gbnVsbDtcbiAgI2JvdW5kRm9jdXNpbiA9IHRoaXMuZm9jdXNpbi5iaW5kKHRoaXMpO1xuICAjYm91bmRGb2N1c291dCA9IHRoaXMuZm9jdXNvdXQuYmluZCh0aGlzKTtcbiAgI2VkaXRUb29sYmFyID0gbnVsbDtcbiAgI2ZvY3VzZWRSZXNpemVyTmFtZSA9IFwiXCI7XG4gICNoYXNCZWVuQ2xpY2tlZCA9IGZhbHNlO1xuICAjaW5pdGlhbFBvc2l0aW9uID0gbnVsbDtcbiAgI2lzRWRpdGluZyA9IGZhbHNlO1xuICAjaXNJbkVkaXRNb2RlID0gZmFsc2U7XG4gICNpc1Jlc2l6ZXJFbmFibGVkRm9yS2V5Ym9hcmQgPSBmYWxzZTtcbiAgI21vdmVJbkRPTVRpbWVvdXQgPSBudWxsO1xuICAjcHJldkRyYWdYID0gMDtcbiAgI3ByZXZEcmFnWSA9IDA7XG4gICN0ZWxlbWV0cnlUaW1lb3V0cyA9IG51bGw7XG4gIF9pbml0aWFsT3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIF9pc1Zpc2libGUgPSB0cnVlO1xuICBfdWlNYW5hZ2VyID0gbnVsbDtcbiAgX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IHRydWU7XG4gIF9sMTBuUHJvbWlzZSA9IG51bGw7XG4gICNpc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAjekluZGV4ID0gQW5ub3RhdGlvbkVkaXRvci5fekluZGV4Kys7XG4gIHN0YXRpYyBfYm9yZGVyTGluZVdpZHRoID0gLTE7XG4gIHN0YXRpYyBfY29sb3JNYW5hZ2VyID0gbmV3IENvbG9yTWFuYWdlcigpO1xuICBzdGF0aWMgX3pJbmRleCA9IDE7XG4gIHN0YXRpYyBfdGVsZW1ldHJ5VGltZW91dCA9IDEwMDA7XG4gIHN0YXRpYyBnZXQgX3Jlc2l6ZXJLZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgY29uc3QgcmVzaXplID0gQW5ub3RhdGlvbkVkaXRvci5wcm90b3R5cGUuX3Jlc2l6ZVdpdGhLZXlib2FyZDtcbiAgICBjb25zdCBzbWFsbCA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuVFJBTlNMQVRFX1NNQUxMO1xuICAgIGNvbnN0IGJpZyA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuVFJBTlNMQVRFX0JJRztcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX3Jlc2l6ZXJLZXlib2FyZE1hbmFnZXJcIiwgbmV3IEtleWJvYXJkTWFuYWdlcihbW1tcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogWy1zbWFsbCwgMF1cbiAgICB9XSwgW1tcImN0cmwrQXJyb3dMZWZ0XCIsIFwibWFjK3NoaWZ0K0Fycm93TGVmdFwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbLWJpZywgMF1cbiAgICB9XSwgW1tcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbc21hbGwsIDBdXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93UmlnaHRcIiwgXCJtYWMrc2hpZnQrQXJyb3dSaWdodFwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbYmlnLCAwXVxuICAgIH1dLCBbW1wiQXJyb3dVcFwiLCBcIm1hYytBcnJvd1VwXCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFswLCAtc21hbGxdXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93VXBcIiwgXCJtYWMrc2hpZnQrQXJyb3dVcFwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbMCwgLWJpZ11cbiAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogWzAsIHNtYWxsXVxuICAgIH1dLCBbW1wiY3RybCtBcnJvd0Rvd25cIiwgXCJtYWMrc2hpZnQrQXJyb3dEb3duXCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFswLCBiaWddXG4gICAgfV0sIFtbXCJFc2NhcGVcIiwgXCJtYWMrRXNjYXBlXCJdLCBBbm5vdGF0aW9uRWRpdG9yLnByb3RvdHlwZS5fc3RvcFJlc2l6aW5nV2l0aEtleWJvYXJkXV0pKTtcbiAgfVxuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEFubm90YXRpb25FZGl0b3IpIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQW5ub3RhdGlvbkVkaXRvci5cIik7XG4gICAgfVxuICAgIHRoaXMucGFyZW50ID0gcGFyYW1ldGVycy5wYXJlbnQ7XG4gICAgdGhpcy5pZCA9IHBhcmFtZXRlcnMuaWQ7XG4gICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gbnVsbDtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IHBhcmFtZXRlcnMucGFyZW50LnBhZ2VJbmRleDtcbiAgICB0aGlzLm5hbWUgPSBwYXJhbWV0ZXJzLm5hbWU7XG4gICAgdGhpcy5kaXYgPSBudWxsO1xuICAgIHRoaXMuX3VpTWFuYWdlciA9IHBhcmFtZXRlcnMudWlNYW5hZ2VyO1xuICAgIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCA9IG51bGw7XG4gICAgdGhpcy5fd2lsbEtlZXBBc3BlY3RSYXRpbyA9IGZhbHNlO1xuICAgIHRoaXMuX2luaXRpYWxPcHRpb25zLmlzQ2VudGVyZWQgPSBwYXJhbWV0ZXJzLmlzQ2VudGVyZWQ7XG4gICAgdGhpcy5fc3RydWN0VHJlZVBhcmVudElkID0gbnVsbDtcbiAgICBjb25zdCB7XG4gICAgICByb3RhdGlvbixcbiAgICAgIHJhd0RpbXM6IHtcbiAgICAgICAgcGFnZVdpZHRoLFxuICAgICAgICBwYWdlSGVpZ2h0LFxuICAgICAgICBwYWdlWCxcbiAgICAgICAgcGFnZVlcbiAgICAgIH1cbiAgICB9ID0gdGhpcy5wYXJlbnQudmlld3BvcnQ7XG4gICAgdGhpcy5yb3RhdGlvbiA9IHJvdGF0aW9uO1xuICAgIHRoaXMucGFnZVJvdGF0aW9uID0gKDM2MCArIHJvdGF0aW9uIC0gdGhpcy5fdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uKSAlIDM2MDtcbiAgICB0aGlzLnBhZ2VEaW1lbnNpb25zID0gW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF07XG4gICAgdGhpcy5wYWdlVHJhbnNsYXRpb24gPSBbcGFnZVgsIHBhZ2VZXTtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy54ID0gcGFyYW1ldGVycy54IC8gd2lkdGg7XG4gICAgdGhpcy55ID0gcGFyYW1ldGVycy55IC8gaGVpZ2h0O1xuICAgIHRoaXMuaXNBdHRhY2hlZFRvRE9NID0gZmFsc2U7XG4gICAgdGhpcy5kZWxldGVkID0gZmFsc2U7XG4gIH1cbiAgZ2V0IGVkaXRvclR5cGUoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvci5fdHlwZTtcbiAgfVxuICBzdGF0aWMgZ2V0IF9kZWZhdWx0TGluZUNvbG9yKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfZGVmYXVsdExpbmVDb2xvclwiLCB0aGlzLl9jb2xvck1hbmFnZXIuZ2V0SGV4Q29kZShcIkNhbnZhc1RleHRcIikpO1xuICB9XG4gIHN0YXRpYyBkZWxldGVBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IpIHtcbiAgICBjb25zdCBmYWtlRWRpdG9yID0gbmV3IEZha2VFZGl0b3Ioe1xuICAgICAgaWQ6IGVkaXRvci5wYXJlbnQuZ2V0TmV4dElkKCksXG4gICAgICBwYXJlbnQ6IGVkaXRvci5wYXJlbnQsXG4gICAgICB1aU1hbmFnZXI6IGVkaXRvci5fdWlNYW5hZ2VyXG4gICAgfSk7XG4gICAgZmFrZUVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkID0gZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQ7XG4gICAgZmFrZUVkaXRvci5kZWxldGVkID0gdHJ1ZTtcbiAgICBmYWtlRWRpdG9yLl91aU1hbmFnZXIuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZShmYWtlRWRpdG9yKTtcbiAgfVxuICBzdGF0aWMgaW5pdGlhbGl6ZShsMTBuLCBfdWlNYW5hZ2VyLCBvcHRpb25zKSB7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5fbDEwblByb21pc2UgfHw9IG5ldyBNYXAoW1wicGRmanMtZWRpdG9yLWFsdC10ZXh0LWJ1dHRvbi1sYWJlbFwiLCBcInBkZmpzLWVkaXRvci1hbHQtdGV4dC1lZGl0LWJ1dHRvbi1sYWJlbFwiLCBcInBkZmpzLWVkaXRvci1hbHQtdGV4dC1kZWNvcmF0aXZlLXRvb2x0aXBcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC10b3BMZWZ0XCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtdG9wTWlkZGxlXCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtdG9wUmlnaHRcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC1taWRkbGVSaWdodFwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLWJvdHRvbVJpZ2h0XCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtYm90dG9tTWlkZGxlXCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtYm90dG9tTGVmdFwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLW1pZGRsZUxlZnRcIl0ubWFwKHN0ciA9PiBbc3RyLCBsMTBuLmdldChzdHIucmVwbGFjZUFsbCgvKFtBLVpdKS9nLCBjID0+IGAtJHtjLnRvTG93ZXJDYXNlKCl9YCkpXSkpO1xuICAgIGlmIChvcHRpb25zPy5zdHJpbmdzKSB7XG4gICAgICBmb3IgKGNvbnN0IHN0ciBvZiBvcHRpb25zLnN0cmluZ3MpIHtcbiAgICAgICAgQW5ub3RhdGlvbkVkaXRvci5fbDEwblByb21pc2Uuc2V0KHN0ciwgbDEwbi5nZXQoc3RyKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChBbm5vdGF0aW9uRWRpdG9yLl9ib3JkZXJMaW5lV2lkdGggIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgIEFubm90YXRpb25FZGl0b3IuX2JvcmRlckxpbmVXaWR0aCA9IHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi0tb3V0bGluZS13aWR0aFwiKSkgfHwgMDtcbiAgfVxuICBzdGF0aWMgdXBkYXRlRGVmYXVsdFBhcmFtcyhfdHlwZSwgX3ZhbHVlKSB7fVxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHN0YXRpYyBpc0hhbmRsaW5nTWltZUZvclBhc3RpbmcobWltZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGF0aWMgcGFzdGUoaXRlbSwgcGFyZW50KSB7XG4gICAgdW5yZWFjaGFibGUoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgZ2V0IF9pc0RyYWdnYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jaXNEcmFnZ2FibGU7XG4gIH1cbiAgc2V0IF9pc0RyYWdnYWJsZSh2YWx1ZSkge1xuICAgIHRoaXMuI2lzRHJhZ2dhYmxlID0gdmFsdWU7XG4gICAgdGhpcy5kaXY/LmNsYXNzTGlzdC50b2dnbGUoXCJkcmFnZ2FibGVcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBpc0VudGVySGFuZGxlZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjZW50ZXIoKSB7XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgIHN3aXRjaCAodGhpcy5wYXJlbnRSb3RhdGlvbikge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgdGhpcy54IC09IHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodCAvIChwYWdlV2lkdGggKiAyKTtcbiAgICAgICAgdGhpcy55ICs9IHRoaXMud2lkdGggKiBwYWdlV2lkdGggLyAocGFnZUhlaWdodCAqIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICB0aGlzLnggKz0gdGhpcy53aWR0aCAvIDI7XG4gICAgICAgIHRoaXMueSArPSB0aGlzLmhlaWdodCAvIDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHRoaXMueCArPSB0aGlzLmhlaWdodCAqIHBhZ2VIZWlnaHQgLyAocGFnZVdpZHRoICogMik7XG4gICAgICAgIHRoaXMueSAtPSB0aGlzLndpZHRoICogcGFnZVdpZHRoIC8gKHBhZ2VIZWlnaHQgKiAyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLnggLT0gdGhpcy53aWR0aCAvIDI7XG4gICAgICAgIHRoaXMueSAtPSB0aGlzLmhlaWdodCAvIDI7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gIH1cbiAgYWRkQ29tbWFuZHMocGFyYW1zKSB7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLmFkZENvbW1hbmRzKHBhcmFtcyk7XG4gIH1cbiAgZ2V0IGN1cnJlbnRMYXllcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdWlNYW5hZ2VyLmN1cnJlbnRMYXllcjtcbiAgfVxuICBzZXRJbkJhY2tncm91bmQoKSB7XG4gICAgdGhpcy5kaXYuc3R5bGUuekluZGV4ID0gMDtcbiAgfVxuICBzZXRJbkZvcmVncm91bmQoKSB7XG4gICAgdGhpcy5kaXYuc3R5bGUuekluZGV4ID0gdGhpcy4jekluZGV4O1xuICB9XG4gIHNldFBhcmVudChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IHBhcmVudC5wYWdlSW5kZXg7XG4gICAgICB0aGlzLnBhZ2VEaW1lbnNpb25zID0gcGFyZW50LnBhZ2VEaW1lbnNpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNzdG9wUmVzaXppbmcoKTtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIH1cbiAgZm9jdXNpbihldmVudCkge1xuICAgIGlmICghdGhpcy5fZm9jdXNFdmVudHNBbGxvd2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jaGFzQmVlbkNsaWNrZWQpIHtcbiAgICAgIHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNoYXNCZWVuQ2xpY2tlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBmb2N1c291dChldmVudCkge1xuICAgIGlmICghdGhpcy5fZm9jdXNFdmVudHNBbGxvd2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgICBpZiAodGFyZ2V0Py5jbG9zZXN0KGAjJHt0aGlzLmlkfWApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0aGlzLnBhcmVudD8uaXNNdWx0aXBsZVNlbGVjdGlvbikge1xuICAgICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuICAgIH1cbiAgfVxuICBjb21taXRPclJlbW92ZSgpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tbWl0KCk7XG4gICAgfVxuICB9XG4gIGNvbW1pdCgpIHtcbiAgICB0aGlzLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoKTtcbiAgfVxuICBhZGRUb0Fubm90YXRpb25TdG9yYWdlKCkge1xuICAgIHRoaXMuX3VpTWFuYWdlci5hZGRUb0Fubm90YXRpb25TdG9yYWdlKHRoaXMpO1xuICB9XG4gIHNldEF0KHgsIHksIHR4LCB0eSkge1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBbdHgsIHR5XSA9IHRoaXMuc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24odHgsIHR5KTtcbiAgICB0aGlzLnggPSAoeCArIHR4KSAvIHdpZHRoO1xuICAgIHRoaXMueSA9ICh5ICsgdHkpIC8gaGVpZ2h0O1xuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICAjdHJhbnNsYXRlKFt3aWR0aCwgaGVpZ2h0XSwgeCwgeSkge1xuICAgIFt4LCB5XSA9IHRoaXMuc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24oeCwgeSk7XG4gICAgdGhpcy54ICs9IHggLyB3aWR0aDtcbiAgICB0aGlzLnkgKz0geSAvIGhlaWdodDtcbiAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gIH1cbiAgdHJhbnNsYXRlKHgsIHkpIHtcbiAgICB0aGlzLiN0cmFuc2xhdGUodGhpcy5wYXJlbnREaW1lbnNpb25zLCB4LCB5KTtcbiAgfVxuICB0cmFuc2xhdGVJblBhZ2UoeCwgeSkge1xuICAgIHRoaXMuI2luaXRpYWxQb3NpdGlvbiB8fD0gW3RoaXMueCwgdGhpcy55XTtcbiAgICB0aGlzLiN0cmFuc2xhdGUodGhpcy5wYWdlRGltZW5zaW9ucywgeCwgeSk7XG4gICAgdGhpcy5kaXYuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgYmxvY2s6IFwibmVhcmVzdFwiXG4gICAgfSk7XG4gIH1cbiAgZHJhZyh0eCwgdHkpIHtcbiAgICB0aGlzLiNpbml0aWFsUG9zaXRpb24gfHw9IFt0aGlzLngsIHRoaXMueV07XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMueCArPSB0eCAvIHBhcmVudFdpZHRoO1xuICAgIHRoaXMueSArPSB0eSAvIHBhcmVudEhlaWdodDtcbiAgICBpZiAodGhpcy5wYXJlbnQgJiYgKHRoaXMueCA8IDAgfHwgdGhpcy54ID4gMSB8fCB0aGlzLnkgPCAwIHx8IHRoaXMueSA+IDEpKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSB0aGlzLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmICh0aGlzLnBhcmVudC5maW5kTmV3UGFyZW50KHRoaXMsIHgsIHkpKSB7XG4gICAgICAgIHRoaXMueCAtPSBNYXRoLmZsb29yKHRoaXMueCk7XG4gICAgICAgIHRoaXMueSAtPSBNYXRoLmZsb29yKHRoaXMueSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IFtieCwgYnldID0gdGhpcy5nZXRCYXNlVHJhbnNsYXRpb24oKTtcbiAgICB4ICs9IGJ4O1xuICAgIHkgKz0gYnk7XG4gICAgdGhpcy5kaXYuc3R5bGUubGVmdCA9IGAkeygxMDAgKiB4KS50b0ZpeGVkKDIpfSVgO1xuICAgIHRoaXMuZGl2LnN0eWxlLnRvcCA9IGAkeygxMDAgKiB5KS50b0ZpeGVkKDIpfSVgO1xuICAgIHRoaXMuZGl2LnNjcm9sbEludG9WaWV3KHtcbiAgICAgIGJsb2NrOiBcIm5lYXJlc3RcIlxuICAgIH0pO1xuICB9XG4gIGdldCBfaGFzQmVlbk1vdmVkKCkge1xuICAgIHJldHVybiAhIXRoaXMuI2luaXRpYWxQb3NpdGlvbiAmJiAodGhpcy4jaW5pdGlhbFBvc2l0aW9uWzBdICE9PSB0aGlzLnggfHwgdGhpcy4jaW5pdGlhbFBvc2l0aW9uWzFdICE9PSB0aGlzLnkpO1xuICB9XG4gIGdldEJhc2VUcmFuc2xhdGlvbigpIHtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgY29uc3Qge1xuICAgICAgX2JvcmRlckxpbmVXaWR0aFxuICAgIH0gPSBBbm5vdGF0aW9uRWRpdG9yO1xuICAgIGNvbnN0IHggPSBfYm9yZGVyTGluZVdpZHRoIC8gcGFyZW50V2lkdGg7XG4gICAgY29uc3QgeSA9IF9ib3JkZXJMaW5lV2lkdGggLyBwYXJlbnRIZWlnaHQ7XG4gICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICByZXR1cm4gWy14LCB5XTtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByZXR1cm4gW3gsIHldO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJldHVybiBbeCwgLXldO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFsteCwgLXldO1xuICAgIH1cbiAgfVxuICBnZXQgX211c3RGaXhQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmaXhBbmRTZXRQb3NpdGlvbihyb3RhdGlvbiA9IHRoaXMucm90YXRpb24pIHtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgbGV0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gdGhpcztcbiAgICB3aWR0aCAqPSBwYWdlV2lkdGg7XG4gICAgaGVpZ2h0ICo9IHBhZ2VIZWlnaHQ7XG4gICAgeCAqPSBwYWdlV2lkdGg7XG4gICAgeSAqPSBwYWdlSGVpZ2h0O1xuICAgIGlmICh0aGlzLl9tdXN0Rml4UG9zaXRpb24pIHtcbiAgICAgIHN3aXRjaCAocm90YXRpb24pIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwYWdlV2lkdGggLSB3aWR0aCwgeCkpO1xuICAgICAgICAgIHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwYWdlSGVpZ2h0IC0gaGVpZ2h0LCB5KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTA6XG4gICAgICAgICAgeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VXaWR0aCAtIGhlaWdodCwgeCkpO1xuICAgICAgICAgIHkgPSBNYXRoLm1pbihwYWdlSGVpZ2h0LCBNYXRoLm1heCh3aWR0aCwgeSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICB4ID0gTWF0aC5taW4ocGFnZVdpZHRoLCBNYXRoLm1heCh3aWR0aCwgeCkpO1xuICAgICAgICAgIHkgPSBNYXRoLm1pbihwYWdlSGVpZ2h0LCBNYXRoLm1heChoZWlnaHQsIHkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgeCA9IE1hdGgubWluKHBhZ2VXaWR0aCwgTWF0aC5tYXgoaGVpZ2h0LCB4KSk7XG4gICAgICAgICAgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VIZWlnaHQgLSB3aWR0aCwgeSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnggPSB4IC89IHBhZ2VXaWR0aDtcbiAgICB0aGlzLnkgPSB5IC89IHBhZ2VIZWlnaHQ7XG4gICAgY29uc3QgW2J4LCBieV0gPSB0aGlzLmdldEJhc2VUcmFuc2xhdGlvbigpO1xuICAgIHggKz0gYng7XG4gICAgeSArPSBieTtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLmRpdjtcbiAgICBzdHlsZS5sZWZ0ID0gYCR7KDEwMCAqIHgpLnRvRml4ZWQoMil9JWA7XG4gICAgc3R5bGUudG9wID0gYCR7KDEwMCAqIHkpLnRvRml4ZWQoMil9JWA7XG4gICAgdGhpcy5tb3ZlSW5ET00oKTtcbiAgfVxuICBzdGF0aWMgI3JvdGF0ZVBvaW50KHgsIHksIGFuZ2xlKSB7XG4gICAgc3dpdGNoIChhbmdsZSkge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIFt5LCAteF07XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIFsteCwgLXldO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJldHVybiBbLXksIHhdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG4gIH1cbiAgc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24oeCwgeSkge1xuICAgIHJldHVybiBBbm5vdGF0aW9uRWRpdG9yLiNyb3RhdGVQb2ludCh4LCB5LCB0aGlzLnBhcmVudFJvdGF0aW9uKTtcbiAgfVxuICBwYWdlVHJhbnNsYXRpb25Ub1NjcmVlbih4LCB5KSB7XG4gICAgcmV0dXJuIEFubm90YXRpb25FZGl0b3IuI3JvdGF0ZVBvaW50KHgsIHksIDM2MCAtIHRoaXMucGFyZW50Um90YXRpb24pO1xuICB9XG4gICNnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbikge1xuICAgIHN3aXRjaCAocm90YXRpb24pIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgICAgICAgcmV0dXJuIFswLCAtcGFnZVdpZHRoIC8gcGFnZUhlaWdodCwgcGFnZUhlaWdodCAvIHBhZ2VXaWR0aCwgMF07XG4gICAgICAgIH1cbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByZXR1cm4gWy0xLCAwLCAwLCAtMV07XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICByZXR1cm4gWzAsIHBhZ2VXaWR0aCAvIHBhZ2VIZWlnaHQsIC1wYWdlSGVpZ2h0IC8gcGFnZVdpZHRoLCAwXTtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFsxLCAwLCAwLCAxXTtcbiAgICB9XG4gIH1cbiAgZ2V0IHBhcmVudFNjYWxlKCkge1xuICAgIHJldHVybiB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucmVhbFNjYWxlO1xuICB9XG4gIGdldCBwYXJlbnRSb3RhdGlvbigpIHtcbiAgICByZXR1cm4gKHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycy5yb3RhdGlvbiArIHRoaXMucGFnZVJvdGF0aW9uKSAlIDM2MDtcbiAgfVxuICBnZXQgcGFyZW50RGltZW5zaW9ucygpIHtcbiAgICBjb25zdCB7XG4gICAgICBwYXJlbnRTY2FsZSxcbiAgICAgIHBhZ2VEaW1lbnNpb25zOiBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IHNjYWxlZFdpZHRoID0gcGFnZVdpZHRoICogcGFyZW50U2NhbGU7XG4gICAgY29uc3Qgc2NhbGVkSGVpZ2h0ID0gcGFnZUhlaWdodCAqIHBhcmVudFNjYWxlO1xuICAgIHJldHVybiB1dGlsX0ZlYXR1cmVUZXN0LmlzQ1NTUm91bmRTdXBwb3J0ZWQgPyBbTWF0aC5yb3VuZChzY2FsZWRXaWR0aCksIE1hdGgucm91bmQoc2NhbGVkSGVpZ2h0KV0gOiBbc2NhbGVkV2lkdGgsIHNjYWxlZEhlaWdodF07XG4gIH1cbiAgc2V0RGltcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMuZGl2LnN0eWxlLndpZHRoID0gYCR7KDEwMCAqIHdpZHRoIC8gcGFyZW50V2lkdGgpLnRvRml4ZWQoMil9JWA7XG4gICAgaWYgKCF0aGlzLiNrZWVwQXNwZWN0UmF0aW8pIHtcbiAgICAgIHRoaXMuZGl2LnN0eWxlLmhlaWdodCA9IGAkeygxMDAgKiBoZWlnaHQgLyBwYXJlbnRIZWlnaHQpLnRvRml4ZWQoMil9JWA7XG4gICAgfVxuICB9XG4gIGZpeERpbXMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy5kaXY7XG4gICAgY29uc3Qge1xuICAgICAgaGVpZ2h0LFxuICAgICAgd2lkdGhcbiAgICB9ID0gc3R5bGU7XG4gICAgY29uc3Qgd2lkdGhQZXJjZW50ID0gd2lkdGguZW5kc1dpdGgoXCIlXCIpO1xuICAgIGNvbnN0IGhlaWdodFBlcmNlbnQgPSAhdGhpcy4ja2VlcEFzcGVjdFJhdGlvICYmIGhlaWdodC5lbmRzV2l0aChcIiVcIik7XG4gICAgaWYgKHdpZHRoUGVyY2VudCAmJiBoZWlnaHRQZXJjZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBpZiAoIXdpZHRoUGVyY2VudCkge1xuICAgICAgc3R5bGUud2lkdGggPSBgJHsoMTAwICogcGFyc2VGbG9hdCh3aWR0aCkgLyBwYXJlbnRXaWR0aCkudG9GaXhlZCgyKX0lYDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNrZWVwQXNwZWN0UmF0aW8gJiYgIWhlaWdodFBlcmNlbnQpIHtcbiAgICAgIHN0eWxlLmhlaWdodCA9IGAkeygxMDAgKiBwYXJzZUZsb2F0KGhlaWdodCkgLyBwYXJlbnRIZWlnaHQpLnRvRml4ZWQoMil9JWA7XG4gICAgfVxuICB9XG4gIGdldEluaXRpYWxUcmFuc2xhdGlvbigpIHtcbiAgICByZXR1cm4gWzAsIDBdO1xuICB9XG4gICNjcmVhdGVSZXNpemVycygpIHtcbiAgICBpZiAodGhpcy4jcmVzaXplcnNEaXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jcmVzaXplcnNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuI3Jlc2l6ZXJzRGl2LmNsYXNzTGlzdC5hZGQoXCJyZXNpemVyc1wiKTtcbiAgICBjb25zdCBjbGFzc2VzID0gdGhpcy5fd2lsbEtlZXBBc3BlY3RSYXRpbyA/IFtcInRvcExlZnRcIiwgXCJ0b3BSaWdodFwiLCBcImJvdHRvbVJpZ2h0XCIsIFwiYm90dG9tTGVmdFwiXSA6IFtcInRvcExlZnRcIiwgXCJ0b3BNaWRkbGVcIiwgXCJ0b3BSaWdodFwiLCBcIm1pZGRsZVJpZ2h0XCIsIFwiYm90dG9tUmlnaHRcIiwgXCJib3R0b21NaWRkbGVcIiwgXCJib3R0b21MZWZ0XCIsIFwibWlkZGxlTGVmdFwiXTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY2xhc3Nlcykge1xuICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHRoaXMuI3Jlc2l6ZXJzRGl2LmFwcGVuZChkaXYpO1xuICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoXCJyZXNpemVyXCIsIG5hbWUpO1xuICAgICAgZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtcmVzaXplci1uYW1lXCIsIG5hbWUpO1xuICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNyZXNpemVyUG9pbnRlcmRvd24uYmluZCh0aGlzLCBuYW1lKSwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG4gICAgICBkaXYudGFiSW5kZXggPSAtMTtcbiAgICB9XG4gICAgdGhpcy5kaXYucHJlcGVuZCh0aGlzLiNyZXNpemVyc0Rpdik7XG4gIH1cbiAgI3Jlc2l6ZXJQb2ludGVyZG93bihuYW1lLCBldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gdXRpbF9GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8IGV2ZW50LmN0cmxLZXkgJiYgaXNNYWMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYWx0VGV4dD8udG9nZ2xlKGZhbHNlKTtcbiAgICBjb25zdCBib3VuZFJlc2l6ZXJQb2ludGVybW92ZSA9IHRoaXMuI3Jlc2l6ZXJQb2ludGVybW92ZS5iaW5kKHRoaXMsIG5hbWUpO1xuICAgIGNvbnN0IHNhdmVkRHJhZ2dhYmxlID0gdGhpcy5faXNEcmFnZ2FibGU7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICBjb25zdCBwb2ludGVyTW92ZU9wdGlvbnMgPSB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIHNpZ25hbFxuICAgIH07XG4gICAgdGhpcy5wYXJlbnQudG9nZ2xlUG9pbnRlckV2ZW50cyhmYWxzZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBib3VuZFJlc2l6ZXJQb2ludGVybW92ZSwgcG9pbnRlck1vdmVPcHRpb25zKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGNvbnN0IHNhdmVkWCA9IHRoaXMueDtcbiAgICBjb25zdCBzYXZlZFkgPSB0aGlzLnk7XG4gICAgY29uc3Qgc2F2ZWRXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgY29uc3Qgc2F2ZWRIZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICBjb25zdCBzYXZlZFBhcmVudEN1cnNvciA9IHRoaXMucGFyZW50LmRpdi5zdHlsZS5jdXJzb3I7XG4gICAgY29uc3Qgc2F2ZWRDdXJzb3IgPSB0aGlzLmRpdi5zdHlsZS5jdXJzb3I7XG4gICAgdGhpcy5kaXYuc3R5bGUuY3Vyc29yID0gdGhpcy5wYXJlbnQuZGl2LnN0eWxlLmN1cnNvciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGV2ZW50LnRhcmdldCkuY3Vyc29yO1xuICAgIGNvbnN0IHBvaW50ZXJVcENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5wYXJlbnQudG9nZ2xlUG9pbnRlckV2ZW50cyh0cnVlKTtcbiAgICAgIHRoaXMuI2FsdFRleHQ/LnRvZ2dsZSh0cnVlKTtcbiAgICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gc2F2ZWREcmFnZ2FibGU7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBwb2ludGVyVXBDYWxsYmFjayk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgcG9pbnRlclVwQ2FsbGJhY2spO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBib3VuZFJlc2l6ZXJQb2ludGVybW92ZSwgcG9pbnRlck1vdmVPcHRpb25zKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSk7XG4gICAgICB0aGlzLnBhcmVudC5kaXYuc3R5bGUuY3Vyc29yID0gc2F2ZWRQYXJlbnRDdXJzb3I7XG4gICAgICB0aGlzLmRpdi5zdHlsZS5jdXJzb3IgPSBzYXZlZEN1cnNvcjtcbiAgICAgIHRoaXMuI2FkZFJlc2l6ZVRvVW5kb1N0YWNrKHNhdmVkWCwgc2F2ZWRZLCBzYXZlZFdpZHRoLCBzYXZlZEhlaWdodCk7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBwb2ludGVyVXBDYWxsYmFjaywge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJVcENhbGxiYWNrLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICAjYWRkUmVzaXplVG9VbmRvU3RhY2soc2F2ZWRYLCBzYXZlZFksIHNhdmVkV2lkdGgsIHNhdmVkSGVpZ2h0KSB7XG4gICAgY29uc3QgbmV3WCA9IHRoaXMueDtcbiAgICBjb25zdCBuZXdZID0gdGhpcy55O1xuICAgIGNvbnN0IG5ld1dpZHRoID0gdGhpcy53aWR0aDtcbiAgICBjb25zdCBuZXdIZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICBpZiAobmV3WCA9PT0gc2F2ZWRYICYmIG5ld1kgPT09IHNhdmVkWSAmJiBuZXdXaWR0aCA9PT0gc2F2ZWRXaWR0aCAmJiBuZXdIZWlnaHQgPT09IHNhdmVkSGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiAoKSA9PiB7XG4gICAgICAgIHRoaXMud2lkdGggPSBuZXdXaWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICAgIHRoaXMueCA9IG5ld1g7XG4gICAgICAgIHRoaXMueSA9IG5ld1k7XG4gICAgICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgdGhpcy5zZXREaW1zKHBhcmVudFdpZHRoICogbmV3V2lkdGgsIHBhcmVudEhlaWdodCAqIG5ld0hlaWdodCk7XG4gICAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICAgIH0sXG4gICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgIHRoaXMud2lkdGggPSBzYXZlZFdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHNhdmVkSGVpZ2h0O1xuICAgICAgICB0aGlzLnggPSBzYXZlZFg7XG4gICAgICAgIHRoaXMueSA9IHNhdmVkWTtcbiAgICAgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICB0aGlzLnNldERpbXMocGFyZW50V2lkdGggKiBzYXZlZFdpZHRoLCBwYXJlbnRIZWlnaHQgKiBzYXZlZEhlaWdodCk7XG4gICAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICAgIH0sXG4gICAgICBtdXN0RXhlYzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gICNyZXNpemVyUG9pbnRlcm1vdmUobmFtZSwgZXZlbnQpIHtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgY29uc3Qgc2F2ZWRYID0gdGhpcy54O1xuICAgIGNvbnN0IHNhdmVkWSA9IHRoaXMueTtcbiAgICBjb25zdCBzYXZlZFdpZHRoID0gdGhpcy53aWR0aDtcbiAgICBjb25zdCBzYXZlZEhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgIGNvbnN0IG1pbldpZHRoID0gQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSAvIHBhcmVudFdpZHRoO1xuICAgIGNvbnN0IG1pbkhlaWdodCA9IEFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUgLyBwYXJlbnRIZWlnaHQ7XG4gICAgY29uc3Qgcm91bmQgPSB4ID0+IE1hdGgucm91bmQoeCAqIDEwMDAwKSAvIDEwMDAwO1xuICAgIGNvbnN0IHJvdGF0aW9uTWF0cml4ID0gdGhpcy4jZ2V0Um90YXRpb25NYXRyaXgodGhpcy5yb3RhdGlvbik7XG4gICAgY29uc3QgdHJhbnNmID0gKHgsIHkpID0+IFtyb3RhdGlvbk1hdHJpeFswXSAqIHggKyByb3RhdGlvbk1hdHJpeFsyXSAqIHksIHJvdGF0aW9uTWF0cml4WzFdICogeCArIHJvdGF0aW9uTWF0cml4WzNdICogeV07XG4gICAgY29uc3QgaW52Um90YXRpb25NYXRyaXggPSB0aGlzLiNnZXRSb3RhdGlvbk1hdHJpeCgzNjAgLSB0aGlzLnJvdGF0aW9uKTtcbiAgICBjb25zdCBpbnZUcmFuc2YgPSAoeCwgeSkgPT4gW2ludlJvdGF0aW9uTWF0cml4WzBdICogeCArIGludlJvdGF0aW9uTWF0cml4WzJdICogeSwgaW52Um90YXRpb25NYXRyaXhbMV0gKiB4ICsgaW52Um90YXRpb25NYXRyaXhbM10gKiB5XTtcbiAgICBsZXQgZ2V0UG9pbnQ7XG4gICAgbGV0IGdldE9wcG9zaXRlO1xuICAgIGxldCBpc0RpYWdvbmFsID0gZmFsc2U7XG4gICAgbGV0IGlzSG9yaXpvbnRhbCA9IGZhbHNlO1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSBcInRvcExlZnRcIjpcbiAgICAgICAgaXNEaWFnb25hbCA9IHRydWU7XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFswLCAwXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gW3csIGhdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b3BNaWRkbGVcIjpcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gW3cgLyAyLCAwXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gW3cgLyAyLCBoXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidG9wUmlnaHRcIjpcbiAgICAgICAgaXNEaWFnb25hbCA9IHRydWU7XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFt3LCAwXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gWzAsIGhdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJtaWRkbGVSaWdodFwiOlxuICAgICAgICBpc0hvcml6b250YWwgPSB0cnVlO1xuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbdywgaCAvIDJdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbMCwgaCAvIDJdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJib3R0b21SaWdodFwiOlxuICAgICAgICBpc0RpYWdvbmFsID0gdHJ1ZTtcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gW3csIGhdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbMCwgMF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJvdHRvbU1pZGRsZVwiOlxuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbdyAvIDIsIGhdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbdyAvIDIsIDBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJib3R0b21MZWZ0XCI6XG4gICAgICAgIGlzRGlhZ29uYWwgPSB0cnVlO1xuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbMCwgaF07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFt3LCAwXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWlkZGxlTGVmdFwiOlxuICAgICAgICBpc0hvcml6b250YWwgPSB0cnVlO1xuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbMCwgaCAvIDJdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbdywgaCAvIDJdO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgcG9pbnQgPSBnZXRQb2ludChzYXZlZFdpZHRoLCBzYXZlZEhlaWdodCk7XG4gICAgY29uc3Qgb3Bwb3NpdGVQb2ludCA9IGdldE9wcG9zaXRlKHNhdmVkV2lkdGgsIHNhdmVkSGVpZ2h0KTtcbiAgICBsZXQgdHJhbnNmT3Bwb3NpdGVQb2ludCA9IHRyYW5zZiguLi5vcHBvc2l0ZVBvaW50KTtcbiAgICBjb25zdCBvcHBvc2l0ZVggPSByb3VuZChzYXZlZFggKyB0cmFuc2ZPcHBvc2l0ZVBvaW50WzBdKTtcbiAgICBjb25zdCBvcHBvc2l0ZVkgPSByb3VuZChzYXZlZFkgKyB0cmFuc2ZPcHBvc2l0ZVBvaW50WzFdKTtcbiAgICBsZXQgcmF0aW9YID0gMTtcbiAgICBsZXQgcmF0aW9ZID0gMTtcbiAgICBsZXQgW2RlbHRhWCwgZGVsdGFZXSA9IHRoaXMuc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24oZXZlbnQubW92ZW1lbnRYLCBldmVudC5tb3ZlbWVudFkpO1xuICAgIFtkZWx0YVgsIGRlbHRhWV0gPSBpbnZUcmFuc2YoZGVsdGFYIC8gcGFyZW50V2lkdGgsIGRlbHRhWSAvIHBhcmVudEhlaWdodCk7XG4gICAgaWYgKGlzRGlhZ29uYWwpIHtcbiAgICAgIGNvbnN0IG9sZERpYWcgPSBNYXRoLmh5cG90KHNhdmVkV2lkdGgsIHNhdmVkSGVpZ2h0KTtcbiAgICAgIHJhdGlvWCA9IHJhdGlvWSA9IE1hdGgubWF4KE1hdGgubWluKE1hdGguaHlwb3Qob3Bwb3NpdGVQb2ludFswXSAtIHBvaW50WzBdIC0gZGVsdGFYLCBvcHBvc2l0ZVBvaW50WzFdIC0gcG9pbnRbMV0gLSBkZWx0YVkpIC8gb2xkRGlhZywgMSAvIHNhdmVkV2lkdGgsIDEgLyBzYXZlZEhlaWdodCksIG1pbldpZHRoIC8gc2F2ZWRXaWR0aCwgbWluSGVpZ2h0IC8gc2F2ZWRIZWlnaHQpO1xuICAgIH0gZWxzZSBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICByYXRpb1ggPSBNYXRoLm1heChtaW5XaWR0aCwgTWF0aC5taW4oMSwgTWF0aC5hYnMob3Bwb3NpdGVQb2ludFswXSAtIHBvaW50WzBdIC0gZGVsdGFYKSkpIC8gc2F2ZWRXaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmF0aW9ZID0gTWF0aC5tYXgobWluSGVpZ2h0LCBNYXRoLm1pbigxLCBNYXRoLmFicyhvcHBvc2l0ZVBvaW50WzFdIC0gcG9pbnRbMV0gLSBkZWx0YVkpKSkgLyBzYXZlZEhlaWdodDtcbiAgICB9XG4gICAgY29uc3QgbmV3V2lkdGggPSByb3VuZChzYXZlZFdpZHRoICogcmF0aW9YKTtcbiAgICBjb25zdCBuZXdIZWlnaHQgPSByb3VuZChzYXZlZEhlaWdodCAqIHJhdGlvWSk7XG4gICAgdHJhbnNmT3Bwb3NpdGVQb2ludCA9IHRyYW5zZiguLi5nZXRPcHBvc2l0ZShuZXdXaWR0aCwgbmV3SGVpZ2h0KSk7XG4gICAgY29uc3QgbmV3WCA9IG9wcG9zaXRlWCAtIHRyYW5zZk9wcG9zaXRlUG9pbnRbMF07XG4gICAgY29uc3QgbmV3WSA9IG9wcG9zaXRlWSAtIHRyYW5zZk9wcG9zaXRlUG9pbnRbMV07XG4gICAgdGhpcy53aWR0aCA9IG5ld1dpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gbmV3SGVpZ2h0O1xuICAgIHRoaXMueCA9IG5ld1g7XG4gICAgdGhpcy55ID0gbmV3WTtcbiAgICB0aGlzLnNldERpbXMocGFyZW50V2lkdGggKiBuZXdXaWR0aCwgcGFyZW50SGVpZ2h0ICogbmV3SGVpZ2h0KTtcbiAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gIH1cbiAgYWx0VGV4dEZpbmlzaCgpIHtcbiAgICB0aGlzLiNhbHRUZXh0Py5maW5pc2goKTtcbiAgfVxuICBhc3luYyBhZGRFZGl0VG9vbGJhcigpIHtcbiAgICBpZiAodGhpcy4jZWRpdFRvb2xiYXIgfHwgdGhpcy4jaXNJbkVkaXRNb2RlKSB7XG4gICAgICByZXR1cm4gdGhpcy4jZWRpdFRvb2xiYXI7XG4gICAgfVxuICAgIHRoaXMuI2VkaXRUb29sYmFyID0gbmV3IEVkaXRvclRvb2xiYXIodGhpcyk7XG4gICAgdGhpcy5kaXYuYXBwZW5kKHRoaXMuI2VkaXRUb29sYmFyLnJlbmRlcigpKTtcbiAgICBpZiAodGhpcy4jYWx0VGV4dCkge1xuICAgICAgdGhpcy4jZWRpdFRvb2xiYXIuYWRkQWx0VGV4dEJ1dHRvbihhd2FpdCB0aGlzLiNhbHRUZXh0LnJlbmRlcigpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI2VkaXRUb29sYmFyO1xuICB9XG4gIHJlbW92ZUVkaXRUb29sYmFyKCkge1xuICAgIGlmICghdGhpcy4jZWRpdFRvb2xiYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jZWRpdFRvb2xiYXIucmVtb3ZlKCk7XG4gICAgdGhpcy4jZWRpdFRvb2xiYXIgPSBudWxsO1xuICAgIHRoaXMuI2FsdFRleHQ/LmRlc3Ryb3koKTtcbiAgfVxuICBnZXRDbGllbnREaW1lbnNpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfVxuICBhc3luYyBhZGRBbHRUZXh0QnV0dG9uKCkge1xuICAgIGlmICh0aGlzLiNhbHRUZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEFsdFRleHQuaW5pdGlhbGl6ZShBbm5vdGF0aW9uRWRpdG9yLl9sMTBuUHJvbWlzZSk7XG4gICAgdGhpcy4jYWx0VGV4dCA9IG5ldyBBbHRUZXh0KHRoaXMpO1xuICAgIGlmICh0aGlzLiNhY2Nlc3NpYmlsaXR5RGF0YSkge1xuICAgICAgdGhpcy4jYWx0VGV4dC5kYXRhID0gdGhpcy4jYWNjZXNzaWJpbGl0eURhdGE7XG4gICAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5RGF0YSA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuYWRkRWRpdFRvb2xiYXIoKTtcbiAgfVxuICBnZXQgYWx0VGV4dERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2FsdFRleHQ/LmRhdGE7XG4gIH1cbiAgc2V0IGFsdFRleHREYXRhKGRhdGEpIHtcbiAgICBpZiAoIXRoaXMuI2FsdFRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYWx0VGV4dC5kYXRhID0gZGF0YTtcbiAgfVxuICBoYXNBbHRUZXh0KCkge1xuICAgIHJldHVybiAhdGhpcy4jYWx0VGV4dD8uaXNFbXB0eSgpO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1lZGl0b3Itcm90YXRpb25cIiwgKDM2MCAtIHRoaXMucm90YXRpb24pICUgMzYwKTtcbiAgICB0aGlzLmRpdi5jbGFzc05hbWUgPSB0aGlzLm5hbWU7XG4gICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiaWRcIiwgdGhpcy5pZCk7XG4gICAgdGhpcy5kaXYudGFiSW5kZXggPSB0aGlzLiNkaXNhYmxlZCA/IC0xIDogMDtcbiAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZSkge1xuICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImhpZGRlblwiKTtcbiAgICB9XG4gICAgdGhpcy5zZXRJbkZvcmVncm91bmQoKTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICB0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCB0aGlzLiNib3VuZEZvY3VzaW4sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCB0aGlzLiNib3VuZEZvY3Vzb3V0LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgaWYgKHRoaXMucGFyZW50Um90YXRpb24gJSAxODAgIT09IDApIHtcbiAgICAgIHRoaXMuZGl2LnN0eWxlLm1heFdpZHRoID0gYCR7KDEwMCAqIHBhcmVudEhlaWdodCAvIHBhcmVudFdpZHRoKS50b0ZpeGVkKDIpfSVgO1xuICAgICAgdGhpcy5kaXYuc3R5bGUubWF4SGVpZ2h0ID0gYCR7KDEwMCAqIHBhcmVudFdpZHRoIC8gcGFyZW50SGVpZ2h0KS50b0ZpeGVkKDIpfSVgO1xuICAgIH1cbiAgICBjb25zdCBbdHgsIHR5XSA9IHRoaXMuZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCk7XG4gICAgdGhpcy50cmFuc2xhdGUodHgsIHR5KTtcbiAgICBiaW5kRXZlbnRzKHRoaXMsIHRoaXMuZGl2LCBbXCJwb2ludGVyZG93blwiXSk7XG4gICAgcmV0dXJuIHRoaXMuZGl2O1xuICB9XG4gIHBvaW50ZXJkb3duKGV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gdXRpbF9GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8IGV2ZW50LmN0cmxLZXkgJiYgaXNNYWMpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2hhc0JlZW5DbGlja2VkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5faXNEcmFnZ2FibGUpIHtcbiAgICAgIHRoaXMuI3NldFVwRHJhZ1Nlc3Npb24oZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNzZWxlY3RPblBvaW50ZXJFdmVudChldmVudCk7XG4gIH1cbiAgI3NlbGVjdE9uUG9pbnRlckV2ZW50KGV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gdXRpbF9GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICBpZiAoZXZlbnQuY3RybEtleSAmJiAhaXNNYWMgfHwgZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQubWV0YUtleSAmJiBpc01hYykge1xuICAgICAgdGhpcy5wYXJlbnQudG9nZ2xlU2VsZWN0ZWQodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgIH1cbiAgfVxuICAjc2V0VXBEcmFnU2Vzc2lvbihldmVudCkge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLl91aU1hbmFnZXIuaXNTZWxlY3RlZCh0aGlzKTtcbiAgICB0aGlzLl91aU1hbmFnZXIuc2V0VXBEcmFnU2Vzc2lvbigpO1xuICAgIGxldCBwb2ludGVyTW92ZU9wdGlvbnMsIHBvaW50ZXJNb3ZlQ2FsbGJhY2s7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJtb3ZpbmdcIik7XG4gICAgICBwb2ludGVyTW92ZU9wdGlvbnMgPSB7XG4gICAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICAgIHNpZ25hbFxuICAgICAgfTtcbiAgICAgIHRoaXMuI3ByZXZEcmFnWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLiNwcmV2RHJhZ1kgPSBldmVudC5jbGllbnRZO1xuICAgICAgcG9pbnRlck1vdmVDYWxsYmFjayA9IGUgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgY2xpZW50WDogeCxcbiAgICAgICAgICBjbGllbnRZOiB5XG4gICAgICAgIH0gPSBlO1xuICAgICAgICBjb25zdCBbdHgsIHR5XSA9IHRoaXMuc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24oeCAtIHRoaXMuI3ByZXZEcmFnWCwgeSAtIHRoaXMuI3ByZXZEcmFnWSk7XG4gICAgICAgIHRoaXMuI3ByZXZEcmFnWCA9IHg7XG4gICAgICAgIHRoaXMuI3ByZXZEcmFnWSA9IHk7XG4gICAgICAgIHRoaXMuX3VpTWFuYWdlci5kcmFnU2VsZWN0ZWRFZGl0b3JzKHR4LCB0eSk7XG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBwb2ludGVyTW92ZUNhbGxiYWNrLCBwb2ludGVyTW92ZU9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBwb2ludGVyVXBDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJVcENhbGxiYWNrKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVyVXBDYWxsYmFjayk7XG4gICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICB0aGlzLmRpdi5jbGFzc0xpc3QucmVtb3ZlKFwibW92aW5nXCIpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHBvaW50ZXJNb3ZlQ2FsbGJhY2ssIHBvaW50ZXJNb3ZlT3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aGlzLiNoYXNCZWVuQ2xpY2tlZCA9IGZhbHNlO1xuICAgICAgaWYgKCF0aGlzLl91aU1hbmFnZXIuZW5kRHJhZ1Nlc3Npb24oKSkge1xuICAgICAgICB0aGlzLiNzZWxlY3RPblBvaW50ZXJFdmVudChldmVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBwb2ludGVyVXBDYWxsYmFjaywge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJVcENhbGxiYWNrLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICBtb3ZlSW5ET00oKSB7XG4gICAgaWYgKHRoaXMuI21vdmVJbkRPTVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNtb3ZlSW5ET01UaW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy4jbW92ZUluRE9NVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy4jbW92ZUluRE9NVGltZW91dCA9IG51bGw7XG4gICAgICB0aGlzLnBhcmVudD8ubW92ZUVkaXRvckluRE9NKHRoaXMpO1xuICAgIH0sIDApO1xuICB9XG4gIF9zZXRQYXJlbnRBbmRQb3NpdGlvbihwYXJlbnQsIHgsIHkpIHtcbiAgICBwYXJlbnQuY2hhbmdlUGFyZW50KHRoaXMpO1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gIH1cbiAgZ2V0UmVjdCh0eCwgdHksIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbikge1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5wYXJlbnRTY2FsZTtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgY29uc3QgW3BhZ2VYLCBwYWdlWV0gPSB0aGlzLnBhZ2VUcmFuc2xhdGlvbjtcbiAgICBjb25zdCBzaGlmdFggPSB0eCAvIHNjYWxlO1xuICAgIGNvbnN0IHNoaWZ0WSA9IHR5IC8gc2NhbGU7XG4gICAgY29uc3QgeCA9IHRoaXMueCAqIHBhZ2VXaWR0aDtcbiAgICBjb25zdCB5ID0gdGhpcy55ICogcGFnZUhlaWdodDtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGggKiBwYWdlV2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKiBwYWdlSGVpZ2h0O1xuICAgIHN3aXRjaCAocm90YXRpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIFt4ICsgc2hpZnRYICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5IC0gc2hpZnRZIC0gaGVpZ2h0ICsgcGFnZVksIHggKyBzaGlmdFggKyB3aWR0aCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSAtIHNoaWZ0WSArIHBhZ2VZXTtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJldHVybiBbeCArIHNoaWZ0WSArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSArIHNoaWZ0WCArIHBhZ2VZLCB4ICsgc2hpZnRZICsgaGVpZ2h0ICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5ICsgc2hpZnRYICsgd2lkdGggKyBwYWdlWV07XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIFt4IC0gc2hpZnRYIC0gd2lkdGggKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgKyBzaGlmdFkgKyBwYWdlWSwgeCAtIHNoaWZ0WCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSArIHNoaWZ0WSArIGhlaWdodCArIHBhZ2VZXTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4gW3ggLSBzaGlmdFkgLSBoZWlnaHQgKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgLSBzaGlmdFggLSB3aWR0aCArIHBhZ2VZLCB4IC0gc2hpZnRZICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5IC0gc2hpZnRYICsgcGFnZVldO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcbiAgICB9XG4gIH1cbiAgZ2V0UmVjdEluQ3VycmVudENvb3JkcyhyZWN0LCBwYWdlSGVpZ2h0KSB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IHJlY3Q7XG4gICAgY29uc3Qgd2lkdGggPSB4MiAtIHgxO1xuICAgIGNvbnN0IGhlaWdodCA9IHkyIC0geTE7XG4gICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBbeDEsIHBhZ2VIZWlnaHQgLSB5Miwgd2lkdGgsIGhlaWdodF07XG4gICAgICBjYXNlIDkwOlxuICAgICAgICByZXR1cm4gW3gxLCBwYWdlSGVpZ2h0IC0geTEsIGhlaWdodCwgd2lkdGhdO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiBbeDIsIHBhZ2VIZWlnaHQgLSB5MSwgd2lkdGgsIGhlaWdodF07XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgcmV0dXJuIFt4MiwgcGFnZUhlaWdodCAtIHkyLCBoZWlnaHQsIHdpZHRoXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG4gICAgfVxuICB9XG4gIG9uY2VBZGRlZCgpIHt9XG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGVuYWJsZUVkaXRNb2RlKCkge1xuICAgIHRoaXMuI2lzSW5FZGl0TW9kZSA9IHRydWU7XG4gIH1cbiAgZGlzYWJsZUVkaXRNb2RlKCkge1xuICAgIHRoaXMuI2lzSW5FZGl0TW9kZSA9IGZhbHNlO1xuICB9XG4gIGlzSW5FZGl0TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jaXNJbkVkaXRNb2RlO1xuICB9XG4gIHNob3VsZEdldEtleWJvYXJkRXZlbnRzKCkge1xuICAgIHJldHVybiB0aGlzLiNpc1Jlc2l6ZXJFbmFibGVkRm9yS2V5Ym9hcmQ7XG4gIH1cbiAgbmVlZHNUb0JlUmVidWlsdCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXYgJiYgIXRoaXMuaXNBdHRhY2hlZFRvRE9NO1xuICB9XG4gIHJlYnVpbGQoKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgdGhpcy5kaXY/LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIHRoaXMuI2JvdW5kRm9jdXNpbiwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5kaXY/LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCB0aGlzLiNib3VuZEZvY3Vzb3V0LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICByb3RhdGUoX2FuZ2xlKSB7fVxuICBzZXJpYWxpemUoaXNGb3JDb3B5aW5nID0gZmFsc2UsIGNvbnRleHQgPSBudWxsKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBbiBlZGl0b3IgbXVzdCBiZSBzZXJpYWxpemFibGVcIik7XG4gIH1cbiAgc3RhdGljIGRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKSB7XG4gICAgY29uc3QgZWRpdG9yID0gbmV3IHRoaXMucHJvdG90eXBlLmNvbnN0cnVjdG9yKHtcbiAgICAgIHBhcmVudCxcbiAgICAgIGlkOiBwYXJlbnQuZ2V0TmV4dElkKCksXG4gICAgICB1aU1hbmFnZXJcbiAgICB9KTtcbiAgICBlZGl0b3Iucm90YXRpb24gPSBkYXRhLnJvdGF0aW9uO1xuICAgIGVkaXRvci4jYWNjZXNzaWJpbGl0eURhdGEgPSBkYXRhLmFjY2Vzc2liaWxpdHlEYXRhO1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gZWRpdG9yLnBhZ2VEaW1lbnNpb25zO1xuICAgIGNvbnN0IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSA9IGVkaXRvci5nZXRSZWN0SW5DdXJyZW50Q29vcmRzKGRhdGEucmVjdCwgcGFnZUhlaWdodCk7XG4gICAgZWRpdG9yLnggPSB4IC8gcGFnZVdpZHRoO1xuICAgIGVkaXRvci55ID0geSAvIHBhZ2VIZWlnaHQ7XG4gICAgZWRpdG9yLndpZHRoID0gd2lkdGggLyBwYWdlV2lkdGg7XG4gICAgZWRpdG9yLmhlaWdodCA9IGhlaWdodCAvIHBhZ2VIZWlnaHQ7XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICBnZXQgaGFzQmVlbk1vZGlmaWVkKCkge1xuICAgIHJldHVybiAhIXRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCAmJiAodGhpcy5kZWxldGVkIHx8IHRoaXMuc2VyaWFsaXplKCkgIT09IG51bGwpO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLmRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCB0aGlzLiNib3VuZEZvY3VzaW4pO1xuICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCB0aGlzLiNib3VuZEZvY3Vzb3V0KTtcbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLmNvbW1pdCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50LnJlbW92ZSh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLnJlbW92ZUVkaXRvcih0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI21vdmVJbkRPTVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNtb3ZlSW5ET01UaW1lb3V0KTtcbiAgICAgIHRoaXMuI21vdmVJbkRPTVRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLiNzdG9wUmVzaXppbmcoKTtcbiAgICB0aGlzLnJlbW92ZUVkaXRUb29sYmFyKCk7XG4gICAgaWYgKHRoaXMuI3RlbGVtZXRyeVRpbWVvdXRzKSB7XG4gICAgICBmb3IgKGNvbnN0IHRpbWVvdXQgb2YgdGhpcy4jdGVsZW1ldHJ5VGltZW91dHMudmFsdWVzKCkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgdGhpcy4jdGVsZW1ldHJ5VGltZW91dHMgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gIH1cbiAgZ2V0IGlzUmVzaXphYmxlKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBtYWtlUmVzaXphYmxlKCkge1xuICAgIGlmICh0aGlzLmlzUmVzaXphYmxlKSB7XG4gICAgICB0aGlzLiNjcmVhdGVSZXNpemVycygpO1xuICAgICAgdGhpcy4jcmVzaXplcnNEaXYuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgIGJpbmRFdmVudHModGhpcywgdGhpcy5kaXYsIFtcImtleWRvd25cIl0pO1xuICAgIH1cbiAgfVxuICBnZXQgdG9vbGJhclBvc2l0aW9uKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGtleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNSZXNpemFibGUgfHwgZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmRpdiB8fCBldmVudC5rZXkgIT09IFwiRW50ZXJcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl91aU1hbmFnZXIuc2V0U2VsZWN0ZWQodGhpcyk7XG4gICAgdGhpcy4jc2F2ZWREaW1lbnNpb25zID0ge1xuICAgICAgc2F2ZWRYOiB0aGlzLngsXG4gICAgICBzYXZlZFk6IHRoaXMueSxcbiAgICAgIHNhdmVkV2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBzYXZlZEhlaWdodDogdGhpcy5oZWlnaHRcbiAgICB9O1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy4jcmVzaXplcnNEaXYuY2hpbGRyZW47XG4gICAgaWYgKCF0aGlzLiNhbGxSZXNpemVyRGl2cykge1xuICAgICAgdGhpcy4jYWxsUmVzaXplckRpdnMgPSBBcnJheS5mcm9tKGNoaWxkcmVuKTtcbiAgICAgIGNvbnN0IGJvdW5kUmVzaXplcktleWRvd24gPSB0aGlzLiNyZXNpemVyS2V5ZG93bi5iaW5kKHRoaXMpO1xuICAgICAgY29uc3QgYm91bmRSZXNpemVyQmx1ciA9IHRoaXMuI3Jlc2l6ZXJCbHVyLmJpbmQodGhpcyk7XG4gICAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICAgIGZvciAoY29uc3QgZGl2IG9mIHRoaXMuI2FsbFJlc2l6ZXJEaXZzKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBkaXYuZ2V0QXR0cmlidXRlKFwiZGF0YS1yZXNpemVyLW5hbWVcIik7XG4gICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwic3BpbmJ1dHRvblwiKTtcbiAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGJvdW5kUmVzaXplcktleWRvd24sIHtcbiAgICAgICAgICBzaWduYWxcbiAgICAgICAgfSk7XG4gICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBib3VuZFJlc2l6ZXJCbHVyLCB7XG4gICAgICAgICAgc2lnbmFsXG4gICAgICAgIH0pO1xuICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI3Jlc2l6ZXJGb2N1cy5iaW5kKHRoaXMsIG5hbWUpLCB7XG4gICAgICAgICAgc2lnbmFsXG4gICAgICAgIH0pO1xuICAgICAgICBBbm5vdGF0aW9uRWRpdG9yLl9sMTBuUHJvbWlzZS5nZXQoYHBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLSR7bmFtZX1gKS50aGVuKG1zZyA9PiBkaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBtc2cpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZmlyc3QgPSB0aGlzLiNhbGxSZXNpemVyRGl2c1swXTtcbiAgICBsZXQgZmlyc3RQb3NpdGlvbiA9IDA7XG4gICAgZm9yIChjb25zdCBkaXYgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmIChkaXYgPT09IGZpcnN0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZmlyc3RQb3NpdGlvbisrO1xuICAgIH1cbiAgICBjb25zdCBuZXh0Rmlyc3RQb3NpdGlvbiA9ICgzNjAgLSB0aGlzLnJvdGF0aW9uICsgdGhpcy5wYXJlbnRSb3RhdGlvbikgJSAzNjAgLyA5MCAqICh0aGlzLiNhbGxSZXNpemVyRGl2cy5sZW5ndGggLyA0KTtcbiAgICBpZiAobmV4dEZpcnN0UG9zaXRpb24gIT09IGZpcnN0UG9zaXRpb24pIHtcbiAgICAgIGlmIChuZXh0Rmlyc3RQb3NpdGlvbiA8IGZpcnN0UG9zaXRpb24pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdFBvc2l0aW9uIC0gbmV4dEZpcnN0UG9zaXRpb247IGkrKykge1xuICAgICAgICAgIHRoaXMuI3Jlc2l6ZXJzRGl2LmFwcGVuZCh0aGlzLiNyZXNpemVyc0Rpdi5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChuZXh0Rmlyc3RQb3NpdGlvbiA+IGZpcnN0UG9zaXRpb24pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXh0Rmlyc3RQb3NpdGlvbiAtIGZpcnN0UG9zaXRpb247IGkrKykge1xuICAgICAgICAgIHRoaXMuI3Jlc2l6ZXJzRGl2LmZpcnN0Q2hpbGQuYmVmb3JlKHRoaXMuI3Jlc2l6ZXJzRGl2Lmxhc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZGl2ID0gdGhpcy4jYWxsUmVzaXplckRpdnNbaSsrXTtcbiAgICAgICAgY29uc3QgbmFtZSA9IGRpdi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXJlc2l6ZXItbmFtZVwiKTtcbiAgICAgICAgQW5ub3RhdGlvbkVkaXRvci5fbDEwblByb21pc2UuZ2V0KGBwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC0ke25hbWV9YCkudGhlbihtc2cgPT4gY2hpbGQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBtc2cpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jc2V0UmVzaXplclRhYkluZGV4KDApO1xuICAgIHRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZCA9IHRydWU7XG4gICAgdGhpcy4jcmVzaXplcnNEaXYuZmlyc3RDaGlsZC5mb2N1cyh7XG4gICAgICBmb2N1c1Zpc2libGU6IHRydWVcbiAgICB9KTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9XG4gICNyZXNpemVyS2V5ZG93bihldmVudCkge1xuICAgIEFubm90YXRpb25FZGl0b3IuX3Jlc2l6ZXJLZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCBldmVudCk7XG4gIH1cbiAgI3Jlc2l6ZXJCbHVyKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0Py5wYXJlbnROb2RlICE9PSB0aGlzLiNyZXNpemVyc0Rpdikge1xuICAgICAgdGhpcy4jc3RvcFJlc2l6aW5nKCk7XG4gICAgfVxuICB9XG4gICNyZXNpemVyRm9jdXMobmFtZSkge1xuICAgIHRoaXMuI2ZvY3VzZWRSZXNpemVyTmFtZSA9IHRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZCA/IG5hbWUgOiBcIlwiO1xuICB9XG4gICNzZXRSZXNpemVyVGFiSW5kZXgodmFsdWUpIHtcbiAgICBpZiAoIXRoaXMuI2FsbFJlc2l6ZXJEaXZzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGl2IG9mIHRoaXMuI2FsbFJlc2l6ZXJEaXZzKSB7XG4gICAgICBkaXYudGFiSW5kZXggPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgX3Jlc2l6ZVdpdGhLZXlib2FyZCh4LCB5KSB7XG4gICAgaWYgKCF0aGlzLiNpc1Jlc2l6ZXJFbmFibGVkRm9yS2V5Ym9hcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jcmVzaXplclBvaW50ZXJtb3ZlKHRoaXMuI2ZvY3VzZWRSZXNpemVyTmFtZSwge1xuICAgICAgbW92ZW1lbnRYOiB4LFxuICAgICAgbW92ZW1lbnRZOiB5XG4gICAgfSk7XG4gIH1cbiAgI3N0b3BSZXNpemluZygpIHtcbiAgICB0aGlzLiNpc1Jlc2l6ZXJFbmFibGVkRm9yS2V5Ym9hcmQgPSBmYWxzZTtcbiAgICB0aGlzLiNzZXRSZXNpemVyVGFiSW5kZXgoLTEpO1xuICAgIGlmICh0aGlzLiNzYXZlZERpbWVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2F2ZWRYLFxuICAgICAgICBzYXZlZFksXG4gICAgICAgIHNhdmVkV2lkdGgsXG4gICAgICAgIHNhdmVkSGVpZ2h0XG4gICAgICB9ID0gdGhpcy4jc2F2ZWREaW1lbnNpb25zO1xuICAgICAgdGhpcy4jYWRkUmVzaXplVG9VbmRvU3RhY2soc2F2ZWRYLCBzYXZlZFksIHNhdmVkV2lkdGgsIHNhdmVkSGVpZ2h0KTtcbiAgICAgIHRoaXMuI3NhdmVkRGltZW5zaW9ucyA9IG51bGw7XG4gICAgfVxuICB9XG4gIF9zdG9wUmVzaXppbmdXaXRoS2V5Ym9hcmQoKSB7XG4gICAgdGhpcy4jc3RvcFJlc2l6aW5nKCk7XG4gICAgdGhpcy5kaXYuZm9jdXMoKTtcbiAgfVxuICBzZWxlY3QoKSB7XG4gICAgdGhpcy5tYWtlUmVzaXphYmxlKCk7XG4gICAgdGhpcy5kaXY/LmNsYXNzTGlzdC5hZGQoXCJzZWxlY3RlZEVkaXRvclwiKTtcbiAgICBpZiAoIXRoaXMuI2VkaXRUb29sYmFyKSB7XG4gICAgICB0aGlzLmFkZEVkaXRUb29sYmFyKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRpdj8uY2xhc3NMaXN0LmNvbnRhaW5zKFwic2VsZWN0ZWRFZGl0b3JcIikpIHtcbiAgICAgICAgICB0aGlzLiNlZGl0VG9vbGJhcj8uc2hvdygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jZWRpdFRvb2xiYXI/LnNob3coKTtcbiAgfVxuICB1bnNlbGVjdCgpIHtcbiAgICB0aGlzLiNyZXNpemVyc0Rpdj8uY2xhc3NMaXN0LmFkZChcImhpZGRlblwiKTtcbiAgICB0aGlzLmRpdj8uY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgIGlmICh0aGlzLmRpdj8uY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5jdXJyZW50TGF5ZXIuZGl2LmZvY3VzKHtcbiAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuI2VkaXRUb29sYmFyPy5oaWRlKCk7XG4gIH1cbiAgdXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKSB7fVxuICBkaXNhYmxlRWRpdGluZygpIHt9XG4gIGVuYWJsZUVkaXRpbmcoKSB7fVxuICBlbnRlckluRWRpdE1vZGUoKSB7fVxuICBnZXRJbWFnZUZvckFsdFRleHQoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0IGNvbnRlbnREaXYoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2O1xuICB9XG4gIGdldCBpc0VkaXRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lzRWRpdGluZztcbiAgfVxuICBzZXQgaXNFZGl0aW5nKHZhbHVlKSB7XG4gICAgdGhpcy4jaXNFZGl0aW5nID0gdmFsdWU7XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgICAgdGhpcy5wYXJlbnQuc2V0QWN0aXZlRWRpdG9yKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmVudC5zZXRBY3RpdmVFZGl0b3IobnVsbCk7XG4gICAgfVxuICB9XG4gIHNldEFzcGVjdFJhdGlvKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB0aGlzLiNrZWVwQXNwZWN0UmF0aW8gPSB0cnVlO1xuICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy5kaXY7XG4gICAgc3R5bGUuYXNwZWN0UmF0aW8gPSBhc3BlY3RSYXRpbztcbiAgICBzdHlsZS5oZWlnaHQgPSBcImF1dG9cIjtcbiAgfVxuICBzdGF0aWMgZ2V0IE1JTl9TSVpFKCkge1xuICAgIHJldHVybiAxNjtcbiAgfVxuICBzdGF0aWMgY2FuQ3JlYXRlTmV3RW1wdHlFZGl0b3IoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZ2V0IHRlbGVtZXRyeUluaXRpYWxEYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiYWRkZWRcIlxuICAgIH07XG4gIH1cbiAgZ2V0IHRlbGVtZXRyeUZpbmFsRGF0YSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBfcmVwb3J0VGVsZW1ldHJ5KGRhdGEsIG11c3RXYWl0ID0gZmFsc2UpIHtcbiAgICBpZiAobXVzdFdhaXQpIHtcbiAgICAgIHRoaXMuI3RlbGVtZXRyeVRpbWVvdXRzIHx8PSBuZXcgTWFwKCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFjdGlvblxuICAgICAgfSA9IGRhdGE7XG4gICAgICBsZXQgdGltZW91dCA9IHRoaXMuI3RlbGVtZXRyeVRpbWVvdXRzLmdldChhY3Rpb24pO1xuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9yZXBvcnRUZWxlbWV0cnkoZGF0YSk7XG4gICAgICAgIHRoaXMuI3RlbGVtZXRyeVRpbWVvdXRzLmRlbGV0ZShhY3Rpb24pO1xuICAgICAgICBpZiAodGhpcy4jdGVsZW1ldHJ5VGltZW91dHMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuI3RlbGVtZXRyeVRpbWVvdXRzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSwgQW5ub3RhdGlvbkVkaXRvci5fdGVsZW1ldHJ5VGltZW91dCk7XG4gICAgICB0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cy5zZXQoYWN0aW9uLCB0aW1lb3V0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGF0YS50eXBlIHx8PSB0aGlzLmVkaXRvclR5cGU7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLl9ldmVudEJ1cy5kaXNwYXRjaChcInJlcG9ydHRlbGVtZXRyeVwiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBkZXRhaWxzOiB7XG4gICAgICAgIHR5cGU6IFwiZWRpdGluZ1wiLFxuICAgICAgICBkYXRhXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgc2hvdyh2aXNpYmxlID0gdGhpcy5faXNWaXNpYmxlKSB7XG4gICAgdGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImhpZGRlblwiLCAhdmlzaWJsZSk7XG4gICAgdGhpcy5faXNWaXNpYmxlID0gdmlzaWJsZTtcbiAgfVxuICBlbmFibGUoKSB7XG4gICAgaWYgKHRoaXMuZGl2KSB7XG4gICAgICB0aGlzLmRpdi50YWJJbmRleCA9IDA7XG4gICAgfVxuICAgIHRoaXMuI2Rpc2FibGVkID0gZmFsc2U7XG4gIH1cbiAgZGlzYWJsZSgpIHtcbiAgICBpZiAodGhpcy5kaXYpIHtcbiAgICAgIHRoaXMuZGl2LnRhYkluZGV4ID0gLTE7XG4gICAgfVxuICAgIHRoaXMuI2Rpc2FibGVkID0gdHJ1ZTtcbiAgfVxuICByZW5kZXJBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBhbm5vdGF0aW9uLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiLmFubm90YXRpb25Db250ZW50XCIpO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoXCJhbm5vdGF0aW9uQ29udGVudFwiLCB0aGlzLmVkaXRvclR5cGUpO1xuICAgICAgYW5ub3RhdGlvbi5jb250YWluZXIucHJlcGVuZChjb250ZW50KTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnQubm9kZU5hbWUgPT09IFwiQ0FOVkFTXCIpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGNvbnRlbnQ7XG4gICAgICBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcImFubm90YXRpb25Db250ZW50XCIsIHRoaXMuZWRpdG9yVHlwZSk7XG4gICAgICBjYW52YXMuYmVmb3JlKGNvbnRlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICByZXNldEFubm90YXRpb25FbGVtZW50KGFubm90YXRpb24pIHtcbiAgICBjb25zdCB7XG4gICAgICBmaXJzdENoaWxkXG4gICAgfSA9IGFubm90YXRpb24uY29udGFpbmVyO1xuICAgIGlmIChmaXJzdENoaWxkLm5vZGVOYW1lID09PSBcIkRJVlwiICYmIGZpcnN0Q2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYW5ub3RhdGlvbkNvbnRlbnRcIikpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmVtb3ZlKCk7XG4gICAgfVxuICB9XG59XG5jbGFzcyBGYWtlRWRpdG9yIGV4dGVuZHMgQW5ub3RhdGlvbkVkaXRvciB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcyk7XG4gICAgdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkID0gcGFyYW1zLmFubm90YXRpb25FbGVtZW50SWQ7XG4gICAgdGhpcy5kZWxldGVkID0gdHJ1ZTtcbiAgfVxuICBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmFubm90YXRpb25FbGVtZW50SWQsXG4gICAgICBkZWxldGVkOiB0cnVlLFxuICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleFxuICAgIH07XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3NoYXJlZC9tdXJtdXJoYXNoMy5qc1xuY29uc3QgU0VFRCA9IDB4YzNkMmUxZjA7XG5jb25zdCBNQVNLX0hJR0ggPSAweGZmZmYwMDAwO1xuY29uc3QgTUFTS19MT1cgPSAweGZmZmY7XG5jbGFzcyBNdXJtdXJIYXNoM182NCB7XG4gIGNvbnN0cnVjdG9yKHNlZWQpIHtcbiAgICB0aGlzLmgxID0gc2VlZCA/IHNlZWQgJiAweGZmZmZmZmZmIDogU0VFRDtcbiAgICB0aGlzLmgyID0gc2VlZCA/IHNlZWQgJiAweGZmZmZmZmZmIDogU0VFRDtcbiAgfVxuICB1cGRhdGUoaW5wdXQpIHtcbiAgICBsZXQgZGF0YSwgbGVuZ3RoO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGggKiAyKTtcbiAgICAgIGxlbmd0aCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbnB1dC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoY29kZSA8PSAweGZmKSB7XG4gICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSA+Pj4gODtcbiAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGUgJiAweGZmO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoaW5wdXQpKSB7XG4gICAgICBkYXRhID0gaW5wdXQuc2xpY2UoKTtcbiAgICAgIGxlbmd0aCA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRhIGZvcm1hdCwgbXVzdCBiZSBhIHN0cmluZyBvciBUeXBlZEFycmF5LlwiKTtcbiAgICB9XG4gICAgY29uc3QgYmxvY2tDb3VudHMgPSBsZW5ndGggPj4gMjtcbiAgICBjb25zdCB0YWlsTGVuZ3RoID0gbGVuZ3RoIC0gYmxvY2tDb3VudHMgKiA0O1xuICAgIGNvbnN0IGRhdGFVaW50MzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIsIDAsIGJsb2NrQ291bnRzKTtcbiAgICBsZXQgazEgPSAwLFxuICAgICAgazIgPSAwO1xuICAgIGxldCBoMSA9IHRoaXMuaDEsXG4gICAgICBoMiA9IHRoaXMuaDI7XG4gICAgY29uc3QgQzEgPSAweGNjOWUyZDUxLFxuICAgICAgQzIgPSAweDFiODczNTkzO1xuICAgIGNvbnN0IEMxX0xPVyA9IEMxICYgTUFTS19MT1csXG4gICAgICBDMl9MT1cgPSBDMiAmIE1BU0tfTE9XO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tDb3VudHM7IGkrKykge1xuICAgICAgaWYgKGkgJiAxKSB7XG4gICAgICAgIGsxID0gZGF0YVVpbnQzMltpXTtcbiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgazEgPSBrMSA8PCAxNSB8IGsxID4+PiAxNztcbiAgICAgICAgazEgPSBrMSAqIEMyICYgTUFTS19ISUdIIHwgazEgKiBDMl9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgaDEgXj0gazE7XG4gICAgICAgIGgxID0gaDEgPDwgMTMgfCBoMSA+Pj4gMTk7XG4gICAgICAgIGgxID0gaDEgKiA1ICsgMHhlNjU0NmI2NDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGsyID0gZGF0YVVpbnQzMltpXTtcbiAgICAgICAgazIgPSBrMiAqIEMxICYgTUFTS19ISUdIIHwgazIgKiBDMV9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgazIgPSBrMiA8PCAxNSB8IGsyID4+PiAxNztcbiAgICAgICAgazIgPSBrMiAqIEMyICYgTUFTS19ISUdIIHwgazIgKiBDMl9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgaDIgXj0gazI7XG4gICAgICAgIGgyID0gaDIgPDwgMTMgfCBoMiA+Pj4gMTk7XG4gICAgICAgIGgyID0gaDIgKiA1ICsgMHhlNjU0NmI2NDtcbiAgICAgIH1cbiAgICB9XG4gICAgazEgPSAwO1xuICAgIHN3aXRjaCAodGFpbExlbmd0aCkge1xuICAgICAgY2FzZSAzOlxuICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDJdIDw8IDE2O1xuICAgICAgY2FzZSAyOlxuICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDFdIDw8IDg7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0XTtcbiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgazEgPSBrMSA8PCAxNSB8IGsxID4+PiAxNztcbiAgICAgICAgazEgPSBrMSAqIEMyICYgTUFTS19ISUdIIHwgazEgKiBDMl9MT1cgJiBNQVNLX0xPVztcbiAgICAgICAgaWYgKGJsb2NrQ291bnRzICYgMSkge1xuICAgICAgICAgIGgxIF49IGsxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGgyIF49IGsxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMuaDEgPSBoMTtcbiAgICB0aGlzLmgyID0gaDI7XG4gIH1cbiAgaGV4ZGlnZXN0KCkge1xuICAgIGxldCBoMSA9IHRoaXMuaDEsXG4gICAgICBoMiA9IHRoaXMuaDI7XG4gICAgaDEgXj0gaDIgPj4+IDE7XG4gICAgaDEgPSBoMSAqIDB4ZWQ1NThjY2QgJiBNQVNLX0hJR0ggfCBoMSAqIDB4OGNjZCAmIE1BU0tfTE9XO1xuICAgIGgyID0gaDIgKiAweGZmNTFhZmQ3ICYgTUFTS19ISUdIIHwgKChoMiA8PCAxNiB8IGgxID4+PiAxNikgKiAweGFmZDdlZDU1ICYgTUFTS19ISUdIKSA+Pj4gMTY7XG4gICAgaDEgXj0gaDIgPj4+IDE7XG4gICAgaDEgPSBoMSAqIDB4MWE4NWVjNTMgJiBNQVNLX0hJR0ggfCBoMSAqIDB4ZWM1MyAmIE1BU0tfTE9XO1xuICAgIGgyID0gaDIgKiAweGM0Y2ViOWZlICYgTUFTS19ISUdIIHwgKChoMiA8PCAxNiB8IGgxID4+PiAxNikgKiAweGI5ZmUxYTg1ICYgTUFTS19ISUdIKSA+Pj4gMTY7XG4gICAgaDEgXj0gaDIgPj4+IDE7XG4gICAgcmV0dXJuIChoMSA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsIFwiMFwiKSArIChoMiA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsIFwiMFwiKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9hbm5vdGF0aW9uX3N0b3JhZ2UuanNcblxuXG5cbmNvbnN0IFNlcmlhbGl6YWJsZUVtcHR5ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIG1hcDogbnVsbCxcbiAgaGFzaDogXCJcIixcbiAgdHJhbnNmZXI6IHVuZGVmaW5lZFxufSk7XG5jbGFzcyBBbm5vdGF0aW9uU3RvcmFnZSB7XG4gICNtb2RpZmllZCA9IGZhbHNlO1xuICAjc3RvcmFnZSA9IG5ldyBNYXAoKTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5vblNldE1vZGlmaWVkID0gbnVsbDtcbiAgICB0aGlzLm9uUmVzZXRNb2RpZmllZCA9IG51bGw7XG4gICAgdGhpcy5vbkFubm90YXRpb25FZGl0b3IgPSBudWxsO1xuICB9XG4gIGdldFZhbHVlKGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLiNzdG9yYWdlLmdldChrZXkpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0VmFsdWUsIHZhbHVlKTtcbiAgfVxuICBnZXRSYXdWYWx1ZShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RvcmFnZS5nZXQoa2V5KTtcbiAgfVxuICByZW1vdmUoa2V5KSB7XG4gICAgdGhpcy4jc3RvcmFnZS5kZWxldGUoa2V5KTtcbiAgICBpZiAodGhpcy4jc3RvcmFnZS5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLnJlc2V0TW9kaWZpZWQoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9uQW5ub3RhdGlvbkVkaXRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMuI3N0b3JhZ2UudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQW5ub3RhdGlvbkVkaXRvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5vbkFubm90YXRpb25FZGl0b3IobnVsbCk7XG4gICAgfVxuICB9XG4gIHNldFZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLiNzdG9yYWdlLmdldChrZXkpO1xuICAgIGxldCBtb2RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChvYmogIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBbZW50cnksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgIGlmIChvYmpbZW50cnldICE9PSB2YWwpIHtcbiAgICAgICAgICBtb2RpZmllZCA9IHRydWU7XG4gICAgICAgICAgb2JqW2VudHJ5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtb2RpZmllZCA9IHRydWU7XG4gICAgICB0aGlzLiNzdG9yYWdlLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKG1vZGlmaWVkKSB7XG4gICAgICB0aGlzLiNzZXRNb2RpZmllZCgpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uRWRpdG9yICYmIHR5cGVvZiB0aGlzLm9uQW5ub3RhdGlvbkVkaXRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLm9uQW5ub3RhdGlvbkVkaXRvcih2YWx1ZS5jb25zdHJ1Y3Rvci5fdHlwZSk7XG4gICAgfVxuICB9XG4gIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RvcmFnZS5oYXMoa2V5KTtcbiAgfVxuICBnZXRBbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0b3JhZ2Uuc2l6ZSA+IDAgPyBvYmplY3RGcm9tTWFwKHRoaXMuI3N0b3JhZ2UpIDogbnVsbDtcbiAgfVxuICBzZXRBbGwob2JqKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUoa2V5LCB2YWwpO1xuICAgIH1cbiAgfVxuICBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RvcmFnZS5zaXplO1xuICB9XG4gICNzZXRNb2RpZmllZCgpIHtcbiAgICBpZiAoIXRoaXMuI21vZGlmaWVkKSB7XG4gICAgICB0aGlzLiNtb2RpZmllZCA9IHRydWU7XG4gICAgICBpZiAodHlwZW9mIHRoaXMub25TZXRNb2RpZmllZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRoaXMub25TZXRNb2RpZmllZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXNldE1vZGlmaWVkKCkge1xuICAgIGlmICh0aGlzLiNtb2RpZmllZCkge1xuICAgICAgdGhpcy4jbW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vblJlc2V0TW9kaWZpZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aGlzLm9uUmVzZXRNb2RpZmllZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgcHJpbnQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcmludEFubm90YXRpb25TdG9yYWdlKHRoaXMpO1xuICB9XG4gIGdldCBzZXJpYWxpemFibGUoKSB7XG4gICAgaWYgKHRoaXMuI3N0b3JhZ2Uuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFNlcmlhbGl6YWJsZUVtcHR5O1xuICAgIH1cbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCksXG4gICAgICBoYXNoID0gbmV3IE11cm11ckhhc2gzXzY0KCksXG4gICAgICB0cmFuc2ZlciA9IFtdO1xuICAgIGNvbnN0IGNvbnRleHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBoYXNCaXRtYXAgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcy4jc3RvcmFnZSkge1xuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHZhbCBpbnN0YW5jZW9mIEFubm90YXRpb25FZGl0b3IgPyB2YWwuc2VyaWFsaXplKGZhbHNlLCBjb250ZXh0KSA6IHZhbDtcbiAgICAgIGlmIChzZXJpYWxpemVkKSB7XG4gICAgICAgIG1hcC5zZXQoa2V5LCBzZXJpYWxpemVkKTtcbiAgICAgICAgaGFzaC51cGRhdGUoYCR7a2V5fToke0pTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpfWApO1xuICAgICAgICBoYXNCaXRtYXAgfHw9ICEhc2VyaWFsaXplZC5iaXRtYXA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNCaXRtYXApIHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbWFwLnZhbHVlcygpKSB7XG4gICAgICAgIGlmICh2YWx1ZS5iaXRtYXApIHtcbiAgICAgICAgICB0cmFuc2Zlci5wdXNoKHZhbHVlLmJpdG1hcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcC5zaXplID4gMCA/IHtcbiAgICAgIG1hcCxcbiAgICAgIGhhc2g6IGhhc2guaGV4ZGlnZXN0KCksXG4gICAgICB0cmFuc2ZlclxuICAgIH0gOiBTZXJpYWxpemFibGVFbXB0eTtcbiAgfVxuICBnZXQgZWRpdG9yU3RhdHMoKSB7XG4gICAgbGV0IHN0YXRzID0gbnVsbDtcbiAgICBjb25zdCB0eXBlVG9FZGl0b3IgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLiNzdG9yYWdlLnZhbHVlcygpKSB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEFubm90YXRpb25FZGl0b3IpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZWRpdG9yU3RhdHMgPSB2YWx1ZS50ZWxlbWV0cnlGaW5hbERhdGE7XG4gICAgICBpZiAoIWVkaXRvclN0YXRzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICB0eXBlXG4gICAgICB9ID0gZWRpdG9yU3RhdHM7XG4gICAgICBpZiAoIXR5cGVUb0VkaXRvci5oYXModHlwZSkpIHtcbiAgICAgICAgdHlwZVRvRWRpdG9yLnNldCh0eXBlLCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpLmNvbnN0cnVjdG9yKTtcbiAgICAgIH1cbiAgICAgIHN0YXRzIHx8PSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgY29uc3QgbWFwID0gc3RhdHNbdHlwZV0gfHw9IG5ldyBNYXAoKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhlZGl0b3JTdGF0cykpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0eXBlXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY291bnRlcnMgPSBtYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghY291bnRlcnMpIHtcbiAgICAgICAgICBjb3VudGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICBtYXAuc2V0KGtleSwgY291bnRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdW50ID0gY291bnRlcnMuZ2V0KHZhbCkgPz8gMDtcbiAgICAgICAgY291bnRlcnMuc2V0KHZhbCwgY291bnQgKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbdHlwZSwgZWRpdG9yXSBvZiB0eXBlVG9FZGl0b3IpIHtcbiAgICAgIHN0YXRzW3R5cGVdID0gZWRpdG9yLmNvbXB1dGVUZWxlbWV0cnlGaW5hbERhdGEoc3RhdHNbdHlwZV0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdHM7XG4gIH1cbn1cbmNsYXNzIFByaW50QW5ub3RhdGlvblN0b3JhZ2UgZXh0ZW5kcyBBbm5vdGF0aW9uU3RvcmFnZSB7XG4gICNzZXJpYWxpemFibGU7XG4gIGNvbnN0cnVjdG9yKHBhcmVudCkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3Qge1xuICAgICAgbWFwLFxuICAgICAgaGFzaCxcbiAgICAgIHRyYW5zZmVyXG4gICAgfSA9IHBhcmVudC5zZXJpYWxpemFibGU7XG4gICAgY29uc3QgY2xvbmUgPSBzdHJ1Y3R1cmVkQ2xvbmUobWFwLCB0cmFuc2ZlciA/IHtcbiAgICAgIHRyYW5zZmVyXG4gICAgfSA6IG51bGwpO1xuICAgIHRoaXMuI3NlcmlhbGl6YWJsZSA9IHtcbiAgICAgIG1hcDogY2xvbmUsXG4gICAgICBoYXNoLFxuICAgICAgdHJhbnNmZXJcbiAgICB9O1xuICB9XG4gIGdldCBwcmludCgpIHtcbiAgICB1bnJlYWNoYWJsZShcIlNob3VsZCBub3QgY2FsbCBQcmludEFubm90YXRpb25TdG9yYWdlLnByaW50XCIpO1xuICB9XG4gIGdldCBzZXJpYWxpemFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NlcmlhbGl6YWJsZTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9mb250X2xvYWRlci5qc1xuXG5jbGFzcyBGb250TG9hZGVyIHtcbiAgI3N5c3RlbUZvbnRzID0gbmV3IFNldCgpO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgb3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnQsXG4gICAgc3R5bGVFbGVtZW50ID0gbnVsbFxuICB9KSB7XG4gICAgdGhpcy5fZG9jdW1lbnQgPSBvd25lckRvY3VtZW50O1xuICAgIHRoaXMubmF0aXZlRm9udEZhY2VzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLmxvYWRpbmdSZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMubG9hZFRlc3RGb250SWQgPSAwO1xuICB9XG4gIGFkZE5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKSB7XG4gICAgdGhpcy5uYXRpdmVGb250RmFjZXMuYWRkKG5hdGl2ZUZvbnRGYWNlKTtcbiAgICB0aGlzLl9kb2N1bWVudC5mb250cy5hZGQobmF0aXZlRm9udEZhY2UpO1xuICB9XG4gIHJlbW92ZU5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKSB7XG4gICAgdGhpcy5uYXRpdmVGb250RmFjZXMuZGVsZXRlKG5hdGl2ZUZvbnRGYWNlKTtcbiAgICB0aGlzLl9kb2N1bWVudC5mb250cy5kZWxldGUobmF0aXZlRm9udEZhY2UpO1xuICB9XG4gIGluc2VydFJ1bGUocnVsZSkge1xuICAgIGlmICghdGhpcy5zdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICAgICAgdGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXS5hcHBlbmQodGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgICBjb25zdCBzdHlsZVNoZWV0ID0gdGhpcy5zdHlsZUVsZW1lbnQuc2hlZXQ7XG4gICAgc3R5bGVTaGVldC5pbnNlcnRSdWxlKHJ1bGUsIHN0eWxlU2hlZXQuY3NzUnVsZXMubGVuZ3RoKTtcbiAgfVxuICBjbGVhcigpIHtcbiAgICBmb3IgKGNvbnN0IG5hdGl2ZUZvbnRGYWNlIG9mIHRoaXMubmF0aXZlRm9udEZhY2VzKSB7XG4gICAgICB0aGlzLl9kb2N1bWVudC5mb250cy5kZWxldGUobmF0aXZlRm9udEZhY2UpO1xuICAgIH1cbiAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5jbGVhcigpO1xuICAgIHRoaXMuI3N5c3RlbUZvbnRzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgYXN5bmMgbG9hZFN5c3RlbUZvbnQoe1xuICAgIHN5c3RlbUZvbnRJbmZvOiBpbmZvLFxuICAgIF9pbnNwZWN0Rm9udFxuICB9KSB7XG4gICAgaWYgKCFpbmZvIHx8IHRoaXMuI3N5c3RlbUZvbnRzLmhhcyhpbmZvLmxvYWRlZE5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFzc2VydCghdGhpcy5kaXNhYmxlRm9udEZhY2UsIFwibG9hZFN5c3RlbUZvbnQgc2hvdWxkbid0IGJlIGNhbGxlZCB3aGVuIGBkaXNhYmxlRm9udEZhY2VgIGlzIHNldC5cIik7XG4gICAgaWYgKHRoaXMuaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBsb2FkZWROYW1lLFxuICAgICAgICBzcmMsXG4gICAgICAgIHN0eWxlXG4gICAgICB9ID0gaW5mbztcbiAgICAgIGNvbnN0IGZvbnRGYWNlID0gbmV3IEZvbnRGYWNlKGxvYWRlZE5hbWUsIHNyYywgc3R5bGUpO1xuICAgICAgdGhpcy5hZGROYXRpdmVGb250RmFjZShmb250RmFjZSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmb250RmFjZS5sb2FkKCk7XG4gICAgICAgIHRoaXMuI3N5c3RlbUZvbnRzLmFkZChsb2FkZWROYW1lKTtcbiAgICAgICAgX2luc3BlY3RGb250Py4oaW5mbyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgd2FybihgQ2Fubm90IGxvYWQgc3lzdGVtIGZvbnQ6ICR7aW5mby5iYXNlRm9udE5hbWV9LCBpbnN0YWxsaW5nIGl0IGNvdWxkIGhlbHAgdG8gaW1wcm92ZSBQREYgcmVuZGVyaW5nLmApO1xuICAgICAgICB0aGlzLnJlbW92ZU5hdGl2ZUZvbnRGYWNlKGZvbnRGYWNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdW5yZWFjaGFibGUoXCJOb3QgaW1wbGVtZW50ZWQ6IGxvYWRTeXN0ZW1Gb250IHdpdGhvdXQgdGhlIEZvbnQgTG9hZGluZyBBUEkuXCIpO1xuICB9XG4gIGFzeW5jIGJpbmQoZm9udCkge1xuICAgIGlmIChmb250LmF0dGFjaGVkIHx8IGZvbnQubWlzc2luZ0ZpbGUgJiYgIWZvbnQuc3lzdGVtRm9udEluZm8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9udC5hdHRhY2hlZCA9IHRydWU7XG4gICAgaWYgKGZvbnQuc3lzdGVtRm9udEluZm8pIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZFN5c3RlbUZvbnQoZm9udCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQpIHtcbiAgICAgIGNvbnN0IG5hdGl2ZUZvbnRGYWNlID0gZm9udC5jcmVhdGVOYXRpdmVGb250RmFjZSgpO1xuICAgICAgaWYgKG5hdGl2ZUZvbnRGYWNlKSB7XG4gICAgICAgIHRoaXMuYWRkTmF0aXZlRm9udEZhY2UobmF0aXZlRm9udEZhY2UpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG5hdGl2ZUZvbnRGYWNlLmxvYWRlZDtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICB3YXJuKGBGYWlsZWQgdG8gbG9hZCBmb250ICcke25hdGl2ZUZvbnRGYWNlLmZhbWlseX0nOiAnJHtleH0nLmApO1xuICAgICAgICAgIGZvbnQuZGlzYWJsZUZvbnRGYWNlID0gdHJ1ZTtcbiAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBydWxlID0gZm9udC5jcmVhdGVGb250RmFjZVJ1bGUoKTtcbiAgICBpZiAocnVsZSkge1xuICAgICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpO1xuICAgICAgaWYgKHRoaXMuaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9xdWV1ZUxvYWRpbmdDYWxsYmFjayhyZXNvbHZlKTtcbiAgICAgICAgdGhpcy5fcHJlcGFyZUZvbnRMb2FkRXZlbnQoZm9udCwgcmVxdWVzdCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZ2V0IGlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQoKSB7XG4gICAgY29uc3QgaGFzRm9udHMgPSAhIXRoaXMuX2RvY3VtZW50Py5mb250cztcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZFwiLCBoYXNGb250cyk7XG4gIH1cbiAgZ2V0IGlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkKCkge1xuICAgIGxldCBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNOb2RlSlMpIHtcbiAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBuYXZpZ2F0b3I/LnVzZXJBZ2VudCA9PT0gXCJzdHJpbmdcIiAmJiAvTW96aWxsYVxcLzUuMC4qP3J2OlxcZCsuKj8gR2Vja28vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZFwiLCBzdXBwb3J0ZWQpO1xuICB9XG4gIF9xdWV1ZUxvYWRpbmdDYWxsYmFjayhjYWxsYmFjaykge1xuICAgIGZ1bmN0aW9uIGNvbXBsZXRlUmVxdWVzdCgpIHtcbiAgICAgIGFzc2VydCghcmVxdWVzdC5kb25lLCBcImNvbXBsZXRlUmVxdWVzdCgpIGNhbm5vdCBiZSBjYWxsZWQgdHdpY2UuXCIpO1xuICAgICAgcmVxdWVzdC5kb25lID0gdHJ1ZTtcbiAgICAgIHdoaWxlIChsb2FkaW5nUmVxdWVzdHMubGVuZ3RoID4gMCAmJiBsb2FkaW5nUmVxdWVzdHNbMF0uZG9uZSkge1xuICAgICAgICBjb25zdCBvdGhlclJlcXVlc3QgPSBsb2FkaW5nUmVxdWVzdHMuc2hpZnQoKTtcbiAgICAgICAgc2V0VGltZW91dChvdGhlclJlcXVlc3QuY2FsbGJhY2ssIDApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBsb2FkaW5nUmVxdWVzdHNcbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICBjb21wbGV0ZTogY29tcGxldGVSZXF1ZXN0LFxuICAgICAgY2FsbGJhY2tcbiAgICB9O1xuICAgIGxvYWRpbmdSZXF1ZXN0cy5wdXNoKHJlcXVlc3QpO1xuICAgIHJldHVybiByZXF1ZXN0O1xuICB9XG4gIGdldCBfbG9hZFRlc3RGb250KCkge1xuICAgIGNvbnN0IHRlc3RGb250ID0gYXRvYihcIlQxUlVUd0FMQUlBQUF3QXdRMFpHSURIdFpnNEFBQU9ZQUFBQWdVWkdWRTFsa3pad0FBQUVIQUFBQUJ4SFJFVkdBQlFBXCIgKyBcIkZRQUFCRGdBQUFBZVQxTXZNbFlOWXdrQUFBRWdBQUFBWUdOdFlYQUJEUUxVQUFBQ05BQUFBVUpvWldGay94VkZEUUFBXCIgKyBcIkFMd0FBQUEyYUdobFlRZGtBK29BQUFEMEFBQUFKR2h0ZEhnRDZBQUFBQUFFV0FBQUFBWnRZWGh3QUFKUUFBQUFBUmdBXCIgKyBcIkFBQUdibUZ0WlZqbWRINEFBQUdBQUFBQXNYQnZjM1QvaGdBekFBQURlQUFBQUNBQUFRQUFBQUVBQUxaUkZzUmZEenoxXCIgKyBcIkFBc0Q2QUFBQUFET0JPVExBQUFBQU00S0hEd0FBQUFBQStnRElRQUFBQWdBQWdBQUFBQUFBQUFCQUFBRElRQUFBRm9EXCIgKyBcIjZBQUFBQUFENkFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQVVBQUFBZ0FBQUFRRDZBSDBBQVVBQUFLS0Fyd0FBQUNNXCIgKyBcIkFvb0N2QUFBQWVBQU1RRUNBQUFDQUFZSkFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBRkJtUldRQXdBQXVBQzREXCIgKyBcIklQODRBRm9ESVFBQUFBQUFBUUFBQUFBQUFBQUFBQ0FBSUFBQkFBQUFEZ0N1QUFFQUFBQUFBQUFBQVFBQUFBRUFBQUFBXCIgKyBcIkFBRUFBUUFBQUFFQUFBQUFBQUlBQVFBQUFBRUFBQUFBQUFNQUFRQUFBQUVBQUFBQUFBUUFBUUFBQUFFQUFBQUFBQVVBXCIgKyBcIkFRQUFBQUVBQUFBQUFBWUFBUUFBQUFNQUFRUUpBQUFBQWdBQkFBTUFBUVFKQUFFQUFnQUJBQU1BQVFRSkFBSUFBZ0FCXCIgKyBcIkFBTUFBUVFKQUFNQUFnQUJBQU1BQVFRSkFBUUFBZ0FCQUFNQUFRUUpBQVVBQWdBQkFBTUFBUVFKQUFZQUFnQUJXQUJZXCIgKyBcIkFBQUFBQUFBQXdBQUFBTUFBQUFjQUFFQUFBQUFBRHdBQXdBQkFBQUFIQUFFQUNBQUFBQUVBQVFBQVFBQUFDNy8vd0FBXCIgKyBcIkFDNy8vLy9UQUFFQUFBQUFBQUFCQmdBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1BQUFBQUFBRC9nd0F5QUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUJBQVFFQUFFQkFRSllBQUVCQVNINER3RDRHd0hFQXZnY0EvZ1hCSXdNQVl1TCtuejV0UVhrRDVqM0NCTG5FUUFDXCIgKyBcIkFRRUJJVmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWUFBQUJBUUFBRHdBQ0FRRUVFL3QzXCIgKyBcIkRvdjZmQUg2ZkFUK2ZQcDgrbndIRG9zTUN2bTFDdm0xREF6NmZCUUFBQUFBQUFBQkFBQUFBTW1KYnpFQUFBQUF6Z1RqXCIgKyBcIkZRQUFBQURPQk9RcEFBRUFBQUFBQUFBQURBQVVBQVFBQUFBQkFBQUFBZ0FCQUFBQUFBQUFBQUFENkFBQUFBQUFBQT09XCIpO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfbG9hZFRlc3RGb250XCIsIHRlc3RGb250KTtcbiAgfVxuICBfcHJlcGFyZUZvbnRMb2FkRXZlbnQoZm9udCwgcmVxdWVzdCkge1xuICAgIGZ1bmN0aW9uIGludDMyKGRhdGEsIG9mZnNldCkge1xuICAgICAgcmV0dXJuIGRhdGEuY2hhckNvZGVBdChvZmZzZXQpIDw8IDI0IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDEpIDw8IDE2IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDIpIDw8IDggfCBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0ICsgMykgJiAweGZmO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzcGxpY2VTdHJpbmcocywgb2Zmc2V0LCByZW1vdmUsIGluc2VydCkge1xuICAgICAgY29uc3QgY2h1bmsxID0gcy5zdWJzdHJpbmcoMCwgb2Zmc2V0KTtcbiAgICAgIGNvbnN0IGNodW5rMiA9IHMuc3Vic3RyaW5nKG9mZnNldCArIHJlbW92ZSk7XG4gICAgICByZXR1cm4gY2h1bmsxICsgaW5zZXJ0ICsgY2h1bmsyO1xuICAgIH1cbiAgICBsZXQgaSwgaWk7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSAxO1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgbGV0IGNhbGxlZCA9IDA7XG4gICAgZnVuY3Rpb24gaXNGb250UmVhZHkobmFtZSwgY2FsbGJhY2spIHtcbiAgICAgIGlmICgrK2NhbGxlZCA+IDMwKSB7XG4gICAgICAgIHdhcm4oXCJMb2FkIHRlc3QgZm9udCBuZXZlciBsb2FkZWQuXCIpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdHguZm9udCA9IFwiMzBweCBcIiArIG5hbWU7XG4gICAgICBjdHguZmlsbFRleHQoXCIuXCIsIDAsIDIwKTtcbiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSk7XG4gICAgICBpZiAoaW1hZ2VEYXRhLmRhdGFbM10gPiAwKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoaXNGb250UmVhZHkuYmluZChudWxsLCBuYW1lLCBjYWxsYmFjaykpO1xuICAgIH1cbiAgICBjb25zdCBsb2FkVGVzdEZvbnRJZCA9IGBsdCR7RGF0ZS5ub3coKX0ke3RoaXMubG9hZFRlc3RGb250SWQrK31gO1xuICAgIGxldCBkYXRhID0gdGhpcy5fbG9hZFRlc3RGb250O1xuICAgIGNvbnN0IENPTU1FTlRfT0ZGU0VUID0gOTc2O1xuICAgIGRhdGEgPSBzcGxpY2VTdHJpbmcoZGF0YSwgQ09NTUVOVF9PRkZTRVQsIGxvYWRUZXN0Rm9udElkLmxlbmd0aCwgbG9hZFRlc3RGb250SWQpO1xuICAgIGNvbnN0IENGRl9DSEVDS1NVTV9PRkZTRVQgPSAxNjtcbiAgICBjb25zdCBYWFhYX1ZBTFVFID0gMHg1ODU4NTg1ODtcbiAgICBsZXQgY2hlY2tzdW0gPSBpbnQzMihkYXRhLCBDRkZfQ0hFQ0tTVU1fT0ZGU0VUKTtcbiAgICBmb3IgKGkgPSAwLCBpaSA9IGxvYWRUZXN0Rm9udElkLmxlbmd0aCAtIDM7IGkgPCBpaTsgaSArPSA0KSB7XG4gICAgICBjaGVja3N1bSA9IGNoZWNrc3VtIC0gWFhYWF9WQUxVRSArIGludDMyKGxvYWRUZXN0Rm9udElkLCBpKSB8IDA7XG4gICAgfVxuICAgIGlmIChpIDwgbG9hZFRlc3RGb250SWQubGVuZ3RoKSB7XG4gICAgICBjaGVja3N1bSA9IGNoZWNrc3VtIC0gWFhYWF9WQUxVRSArIGludDMyKGxvYWRUZXN0Rm9udElkICsgXCJYWFhcIiwgaSkgfCAwO1xuICAgIH1cbiAgICBkYXRhID0gc3BsaWNlU3RyaW5nKGRhdGEsIENGRl9DSEVDS1NVTV9PRkZTRVQsIDQsIHN0cmluZzMyKGNoZWNrc3VtKSk7XG4gICAgY29uc3QgdXJsID0gYHVybChkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LCR7YnRvYShkYXRhKX0pO2A7XG4gICAgY29uc3QgcnVsZSA9IGBAZm9udC1mYWNlIHtmb250LWZhbWlseTpcIiR7bG9hZFRlc3RGb250SWR9XCI7c3JjOiR7dXJsfX1gO1xuICAgIHRoaXMuaW5zZXJ0UnVsZShydWxlKTtcbiAgICBjb25zdCBkaXYgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRpdi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICBkaXYuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUuaGVpZ2h0ID0gXCIxMHB4XCI7XG4gICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgIGRpdi5zdHlsZS50b3AgPSBkaXYuc3R5bGUubGVmdCA9IFwiMHB4XCI7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIFtmb250LmxvYWRlZE5hbWUsIGxvYWRUZXN0Rm9udElkXSkge1xuICAgICAgY29uc3Qgc3BhbiA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IFwiSGlcIjtcbiAgICAgIHNwYW4uc3R5bGUuZm9udEZhbWlseSA9IG5hbWU7XG4gICAgICBkaXYuYXBwZW5kKHNwYW4pO1xuICAgIH1cbiAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFwcGVuZChkaXYpO1xuICAgIGlzRm9udFJlYWR5KGxvYWRUZXN0Rm9udElkLCAoKSA9PiB7XG4gICAgICBkaXYucmVtb3ZlKCk7XG4gICAgICByZXF1ZXN0LmNvbXBsZXRlKCk7XG4gICAgfSk7XG4gIH1cbn1cbmNsYXNzIEZvbnRGYWNlT2JqZWN0IHtcbiAgY29uc3RydWN0b3IodHJhbnNsYXRlZERhdGEsIHtcbiAgICBkaXNhYmxlRm9udEZhY2UgPSBmYWxzZSxcbiAgICBpbnNwZWN0Rm9udCA9IG51bGxcbiAgfSkge1xuICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAoY29uc3QgaSBpbiB0cmFuc2xhdGVkRGF0YSkge1xuICAgICAgdGhpc1tpXSA9IHRyYW5zbGF0ZWREYXRhW2ldO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVGb250RmFjZSA9IGRpc2FibGVGb250RmFjZSA9PT0gdHJ1ZTtcbiAgICB0aGlzLl9pbnNwZWN0Rm9udCA9IGluc3BlY3RGb250O1xuICB9XG4gIGNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCkge1xuICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGlzYWJsZUZvbnRGYWNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IG5hdGl2ZUZvbnRGYWNlO1xuICAgIGlmICghdGhpcy5jc3NGb250SW5mbykge1xuICAgICAgbmF0aXZlRm9udEZhY2UgPSBuZXcgRm9udEZhY2UodGhpcy5sb2FkZWROYW1lLCB0aGlzLmRhdGEsIHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3NzID0ge1xuICAgICAgICB3ZWlnaHQ6IHRoaXMuY3NzRm9udEluZm8uZm9udFdlaWdodFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlKSB7XG4gICAgICAgIGNzcy5zdHlsZSA9IGBvYmxpcXVlICR7dGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZX1kZWdgO1xuICAgICAgfVxuICAgICAgbmF0aXZlRm9udEZhY2UgPSBuZXcgRm9udEZhY2UodGhpcy5jc3NGb250SW5mby5mb250RmFtaWx5LCB0aGlzLmRhdGEsIGNzcyk7XG4gICAgfVxuICAgIHRoaXMuX2luc3BlY3RGb250Py4odGhpcyk7XG4gICAgcmV0dXJuIG5hdGl2ZUZvbnRGYWNlO1xuICB9XG4gIGNyZWF0ZUZvbnRGYWNlUnVsZSgpIHtcbiAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRpc2FibGVGb250RmFjZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSBieXRlc1RvU3RyaW5nKHRoaXMuZGF0YSk7XG4gICAgY29uc3QgdXJsID0gYHVybChkYXRhOiR7dGhpcy5taW1ldHlwZX07YmFzZTY0LCR7YnRvYShkYXRhKX0pO2A7XG4gICAgbGV0IHJ1bGU7XG4gICAgaWYgKCF0aGlzLmNzc0ZvbnRJbmZvKSB7XG4gICAgICBydWxlID0gYEBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OlwiJHt0aGlzLmxvYWRlZE5hbWV9XCI7c3JjOiR7dXJsfX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY3NzID0gYGZvbnQtd2VpZ2h0OiAke3RoaXMuY3NzRm9udEluZm8uZm9udFdlaWdodH07YDtcbiAgICAgIGlmICh0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlKSB7XG4gICAgICAgIGNzcyArPSBgZm9udC1zdHlsZTogb2JsaXF1ZSAke3RoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGV9ZGVnO2A7XG4gICAgICB9XG4gICAgICBydWxlID0gYEBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OlwiJHt0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHl9XCI7JHtjc3N9c3JjOiR7dXJsfX1gO1xuICAgIH1cbiAgICB0aGlzLl9pbnNwZWN0Rm9udD8uKHRoaXMsIHVybCk7XG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cbiAgZ2V0UGF0aEdlbmVyYXRvcihvYmpzLCBjaGFyYWN0ZXIpIHtcbiAgICBpZiAodGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl07XG4gICAgfVxuICAgIGxldCBjbWRzO1xuICAgIHRyeSB7XG4gICAgICBjbWRzID0gb2Jqcy5nZXQodGhpcy5sb2FkZWROYW1lICsgXCJfcGF0aF9cIiArIGNoYXJhY3Rlcik7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHdhcm4oYGdldFBhdGhHZW5lcmF0b3IgLSBpZ25vcmluZyBjaGFyYWN0ZXI6IFwiJHtleH1cIi5gKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNtZHMpIHx8IGNtZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdID0gZnVuY3Rpb24gKGMsIHNpemUpIHt9O1xuICAgIH1cbiAgICBjb25zdCBjb21tYW5kcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNtZHMubGVuZ3RoOyBpIDwgaWk7KSB7XG4gICAgICBzd2l0Y2ggKGNtZHNbaSsrXSkge1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuQkVaSUVSX0NVUlZFX1RPOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IFthLCBiLCBjLCBkLCBlLCBmXSA9IGNtZHMuc2xpY2UoaSwgaSArIDYpO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChjdHggPT4gY3R4LmJlemllckN1cnZlVG8oYSwgYiwgYywgZCwgZSwgZikpO1xuICAgICAgICAgICAgaSArPSA2O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGb250UmVuZGVyT3BzLk1PVkVfVE86XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgW2EsIGJdID0gY21kcy5zbGljZShpLCBpICsgMik7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHgubW92ZVRvKGEsIGIpKTtcbiAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5MSU5FX1RPOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IFthLCBiXSA9IGNtZHMuc2xpY2UoaSwgaSArIDIpO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChjdHggPT4gY3R4LmxpbmVUbyhhLCBiKSk7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuUVVBRFJBVElDX0NVUlZFX1RPOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IFthLCBiLCBjLCBkXSA9IGNtZHMuc2xpY2UoaSwgaSArIDQpO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChjdHggPT4gY3R4LnF1YWRyYXRpY0N1cnZlVG8oYSwgYiwgYywgZCkpO1xuICAgICAgICAgICAgaSArPSA0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGb250UmVuZGVyT3BzLlJFU1RPUkU6XG4gICAgICAgICAgY29tbWFuZHMucHVzaChjdHggPT4gY3R4LnJlc3RvcmUoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5TQVZFOlxuICAgICAgICAgIGNvbW1hbmRzLnB1c2goY3R4ID0+IGN0eC5zYXZlKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuU0NBTEU6XG4gICAgICAgICAgYXNzZXJ0KGNvbW1hbmRzLmxlbmd0aCA9PT0gMiwgXCJTY2FsZSBjb21tYW5kIGlzIG9ubHkgdmFsaWQgYXQgdGhlIHRoaXJkIHBvc2l0aW9uLlwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGb250UmVuZGVyT3BzLlRSQU5TRk9STTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBbYSwgYiwgYywgZCwgZSwgZl0gPSBjbWRzLnNsaWNlKGksIGkgKyA2KTtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goY3R4ID0+IGN0eC50cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikpO1xuICAgICAgICAgICAgaSArPSA2O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGb250UmVuZGVyT3BzLlRSQU5TTEFURTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBbYSwgYl0gPSBjbWRzLnNsaWNlKGksIGkgKyAyKTtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goY3R4ID0+IGN0eC50cmFuc2xhdGUoYSwgYikpO1xuICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXSA9IGZ1bmN0aW9uIGdseXBoRHJhd2VyKGN0eCwgc2l6ZSkge1xuICAgICAgY29tbWFuZHNbMF0oY3R4KTtcbiAgICAgIGNvbW1hbmRzWzFdKGN0eCk7XG4gICAgICBjdHguc2NhbGUoc2l6ZSwgLXNpemUpO1xuICAgICAgZm9yIChsZXQgaSA9IDIsIGlpID0gY29tbWFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICBjb21tYW5kc1tpXShjdHgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvbm9kZV91dGlscy5qc1xuXG5cbmlmIChpc05vZGVKUykge1xuICB2YXIgcGFja2FnZUNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgdmFyIHBhY2thZ2VNYXAgPSBudWxsO1xuICBjb25zdCBsb2FkUGFja2FnZXMgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoIC8qd2VicGFja0lnbm9yZTogdHJ1ZSovXCJmc1wiKSxcbiAgICAgIGh0dHAgPSBhd2FpdCBpbXBvcnQoIC8qd2VicGFja0lnbm9yZTogdHJ1ZSovXCJodHRwXCIpLFxuICAgICAgaHR0cHMgPSBhd2FpdCBpbXBvcnQoIC8qd2VicGFja0lnbm9yZTogdHJ1ZSovXCJodHRwc1wiKSxcbiAgICAgIHVybCA9IGF3YWl0IGltcG9ydCggLyp3ZWJwYWNrSWdub3JlOiB0cnVlKi9cInVybFwiKTtcbiAgICBsZXQgY2FudmFzLCBwYXRoMmQ7XG4gICAgcmV0dXJuIG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoe1xuICAgICAgZnMsXG4gICAgICBodHRwLFxuICAgICAgaHR0cHMsXG4gICAgICB1cmwsXG4gICAgICBjYW52YXMsXG4gICAgICBwYXRoMmRcbiAgICB9KSk7XG4gIH07XG4gIGxvYWRQYWNrYWdlcygpLnRoZW4obWFwID0+IHtcbiAgICBwYWNrYWdlTWFwID0gbWFwO1xuICAgIHBhY2thZ2VDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgfSwgcmVhc29uID0+IHtcbiAgICB3YXJuKGBsb2FkUGFja2FnZXM6ICR7cmVhc29ufWApO1xuICAgIHBhY2thZ2VNYXAgPSBuZXcgTWFwKCk7XG4gICAgcGFja2FnZUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9KTtcbn1cbmNsYXNzIE5vZGVQYWNrYWdlcyB7XG4gIHN0YXRpYyBnZXQgcHJvbWlzZSgpIHtcbiAgICByZXR1cm4gcGFja2FnZUNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBzdGF0aWMgZ2V0KG5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZU1hcD8uZ2V0KG5hbWUpO1xuICB9XG59XG5jb25zdCBub2RlX3V0aWxzX2ZldGNoRGF0YSA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgY29uc3QgZnMgPSBOb2RlUGFja2FnZXMuZ2V0KFwiZnNcIik7XG4gIHJldHVybiBmcy5wcm9taXNlcy5yZWFkRmlsZSh1cmwpLnRoZW4oZGF0YSA9PiBuZXcgVWludDhBcnJheShkYXRhKSk7XG59O1xuY2xhc3MgTm9kZUZpbHRlckZhY3RvcnkgZXh0ZW5kcyBCYXNlRmlsdGVyRmFjdG9yeSB7fVxuY2xhc3MgTm9kZUNhbnZhc0ZhY3RvcnkgZXh0ZW5kcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gIF9jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IGNhbnZhcyA9IE5vZGVQYWNrYWdlcy5nZXQoXCJjYW52YXNcIik7XG4gICAgcmV0dXJuIGNhbnZhcy5jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gIH1cbn1cbmNsYXNzIE5vZGVDTWFwUmVhZGVyRmFjdG9yeSBleHRlbmRzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHtcbiAgICByZXR1cm4gbm9kZV91dGlsc19mZXRjaERhdGEodXJsKS50aGVuKGRhdGEgPT4gKHtcbiAgICAgIGNNYXBEYXRhOiBkYXRhLFxuICAgICAgY29tcHJlc3Npb25UeXBlXG4gICAgfSkpO1xuICB9XG59XG5jbGFzcyBOb2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgZXh0ZW5kcyBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkge1xuICBfZmV0Y2hEYXRhKHVybCkge1xuICAgIHJldHVybiBub2RlX3V0aWxzX2ZldGNoRGF0YSh1cmwpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L3BhdHRlcm5faGVscGVyLmpzXG5cblxuY29uc3QgUGF0aFR5cGUgPSB7XG4gIEZJTEw6IFwiRmlsbFwiLFxuICBTVFJPS0U6IFwiU3Ryb2tlXCIsXG4gIFNIQURJTkc6IFwiU2hhZGluZ1wiXG59O1xuZnVuY3Rpb24gYXBwbHlCb3VuZGluZ0JveChjdHgsIGJib3gpIHtcbiAgaWYgKCFiYm94KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHdpZHRoID0gYmJveFsyXSAtIGJib3hbMF07XG4gIGNvbnN0IGhlaWdodCA9IGJib3hbM10gLSBiYm94WzFdO1xuICBjb25zdCByZWdpb24gPSBuZXcgUGF0aDJEKCk7XG4gIHJlZ2lvbi5yZWN0KGJib3hbMF0sIGJib3hbMV0sIHdpZHRoLCBoZWlnaHQpO1xuICBjdHguY2xpcChyZWdpb24pO1xufVxuY2xhc3MgQmFzZVNoYWRpbmdQYXR0ZXJuIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VTaGFkaW5nUGF0dGVybikge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU2hhZGluZ1BhdHRlcm4uXCIpO1xuICAgIH1cbiAgfVxuICBnZXRQYXR0ZXJuKCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBnZXRQYXR0ZXJuYCBjYWxsZWQuXCIpO1xuICB9XG59XG5jbGFzcyBSYWRpYWxBeGlhbFNoYWRpbmdQYXR0ZXJuIGV4dGVuZHMgQmFzZVNoYWRpbmdQYXR0ZXJuIHtcbiAgY29uc3RydWN0b3IoSVIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3R5cGUgPSBJUlsxXTtcbiAgICB0aGlzLl9iYm94ID0gSVJbMl07XG4gICAgdGhpcy5fY29sb3JTdG9wcyA9IElSWzNdO1xuICAgIHRoaXMuX3AwID0gSVJbNF07XG4gICAgdGhpcy5fcDEgPSBJUls1XTtcbiAgICB0aGlzLl9yMCA9IElSWzZdO1xuICAgIHRoaXMuX3IxID0gSVJbN107XG4gICAgdGhpcy5tYXRyaXggPSBudWxsO1xuICB9XG4gIF9jcmVhdGVHcmFkaWVudChjdHgpIHtcbiAgICBsZXQgZ3JhZDtcbiAgICBpZiAodGhpcy5fdHlwZSA9PT0gXCJheGlhbFwiKSB7XG4gICAgICBncmFkID0gY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KHRoaXMuX3AwWzBdLCB0aGlzLl9wMFsxXSwgdGhpcy5fcDFbMF0sIHRoaXMuX3AxWzFdKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3R5cGUgPT09IFwicmFkaWFsXCIpIHtcbiAgICAgIGdyYWQgPSBjdHguY3JlYXRlUmFkaWFsR3JhZGllbnQodGhpcy5fcDBbMF0sIHRoaXMuX3AwWzFdLCB0aGlzLl9yMCwgdGhpcy5fcDFbMF0sIHRoaXMuX3AxWzFdLCB0aGlzLl9yMSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgY29sb3JTdG9wIG9mIHRoaXMuX2NvbG9yU3RvcHMpIHtcbiAgICAgIGdyYWQuYWRkQ29sb3JTdG9wKGNvbG9yU3RvcFswXSwgY29sb3JTdG9wWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGdyYWQ7XG4gIH1cbiAgZ2V0UGF0dGVybihjdHgsIG93bmVyLCBpbnZlcnNlLCBwYXRoVHlwZSkge1xuICAgIGxldCBwYXR0ZXJuO1xuICAgIGlmIChwYXRoVHlwZSA9PT0gUGF0aFR5cGUuU1RST0tFIHx8IHBhdGhUeXBlID09PSBQYXRoVHlwZS5GSUxMKSB7XG4gICAgICBjb25zdCBvd25lckJCb3ggPSBvd25lci5jdXJyZW50LmdldENsaXBwZWRQYXRoQm91bmRpbmdCb3gocGF0aFR5cGUsIGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KSkgfHwgWzAsIDAsIDAsIDBdO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLmNlaWwob3duZXJCQm94WzJdIC0gb3duZXJCQm94WzBdKSB8fCAxO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5jZWlsKG93bmVyQkJveFszXSAtIG93bmVyQkJveFsxXSkgfHwgMTtcbiAgICAgIGNvbnN0IHRtcENhbnZhcyA9IG93bmVyLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcInBhdHRlcm5cIiwgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG4gICAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICAgIHRtcEN0eC5jbGVhclJlY3QoMCwgMCwgdG1wQ3R4LmNhbnZhcy53aWR0aCwgdG1wQ3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgICAgdG1wQ3R4LmJlZ2luUGF0aCgpO1xuICAgICAgdG1wQ3R4LnJlY3QoMCwgMCwgdG1wQ3R4LmNhbnZhcy53aWR0aCwgdG1wQ3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgICAgdG1wQ3R4LnRyYW5zbGF0ZSgtb3duZXJCQm94WzBdLCAtb3duZXJCQm94WzFdKTtcbiAgICAgIGludmVyc2UgPSBVdGlsLnRyYW5zZm9ybShpbnZlcnNlLCBbMSwgMCwgMCwgMSwgb3duZXJCQm94WzBdLCBvd25lckJCb3hbMV1dKTtcbiAgICAgIHRtcEN0eC50cmFuc2Zvcm0oLi4ub3duZXIuYmFzZVRyYW5zZm9ybSk7XG4gICAgICBpZiAodGhpcy5tYXRyaXgpIHtcbiAgICAgICAgdG1wQ3R4LnRyYW5zZm9ybSguLi50aGlzLm1hdHJpeCk7XG4gICAgICB9XG4gICAgICBhcHBseUJvdW5kaW5nQm94KHRtcEN0eCwgdGhpcy5fYmJveCk7XG4gICAgICB0bXBDdHguZmlsbFN0eWxlID0gdGhpcy5fY3JlYXRlR3JhZGllbnQodG1wQ3R4KTtcbiAgICAgIHRtcEN0eC5maWxsKCk7XG4gICAgICBwYXR0ZXJuID0gY3R4LmNyZWF0ZVBhdHRlcm4odG1wQ2FudmFzLmNhbnZhcywgXCJuby1yZXBlYXRcIik7XG4gICAgICBjb25zdCBkb21NYXRyaXggPSBuZXcgRE9NTWF0cml4KGludmVyc2UpO1xuICAgICAgcGF0dGVybi5zZXRUcmFuc2Zvcm0oZG9tTWF0cml4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwbHlCb3VuZGluZ0JveChjdHgsIHRoaXMuX2Jib3gpO1xuICAgICAgcGF0dGVybiA9IHRoaXMuX2NyZWF0ZUdyYWRpZW50KGN0eCk7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG59XG5mdW5jdGlvbiBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcDEsIHAyLCBwMywgYzEsIGMyLCBjMykge1xuICBjb25zdCBjb29yZHMgPSBjb250ZXh0LmNvb3JkcyxcbiAgICBjb2xvcnMgPSBjb250ZXh0LmNvbG9ycztcbiAgY29uc3QgYnl0ZXMgPSBkYXRhLmRhdGEsXG4gICAgcm93U2l6ZSA9IGRhdGEud2lkdGggKiA0O1xuICBsZXQgdG1wO1xuICBpZiAoY29vcmRzW3AxICsgMV0gPiBjb29yZHNbcDIgKyAxXSkge1xuICAgIHRtcCA9IHAxO1xuICAgIHAxID0gcDI7XG4gICAgcDIgPSB0bXA7XG4gICAgdG1wID0gYzE7XG4gICAgYzEgPSBjMjtcbiAgICBjMiA9IHRtcDtcbiAgfVxuICBpZiAoY29vcmRzW3AyICsgMV0gPiBjb29yZHNbcDMgKyAxXSkge1xuICAgIHRtcCA9IHAyO1xuICAgIHAyID0gcDM7XG4gICAgcDMgPSB0bXA7XG4gICAgdG1wID0gYzI7XG4gICAgYzIgPSBjMztcbiAgICBjMyA9IHRtcDtcbiAgfVxuICBpZiAoY29vcmRzW3AxICsgMV0gPiBjb29yZHNbcDIgKyAxXSkge1xuICAgIHRtcCA9IHAxO1xuICAgIHAxID0gcDI7XG4gICAgcDIgPSB0bXA7XG4gICAgdG1wID0gYzE7XG4gICAgYzEgPSBjMjtcbiAgICBjMiA9IHRtcDtcbiAgfVxuICBjb25zdCB4MSA9IChjb29yZHNbcDFdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYO1xuICBjb25zdCB5MSA9IChjb29yZHNbcDEgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTtcbiAgY29uc3QgeDIgPSAoY29vcmRzW3AyXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDtcbiAgY29uc3QgeTIgPSAoY29vcmRzW3AyICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7XG4gIGNvbnN0IHgzID0gKGNvb3Jkc1twM10gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7XG4gIGNvbnN0IHkzID0gKGNvb3Jkc1twMyArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZO1xuICBpZiAoeTEgPj0geTMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgYzFyID0gY29sb3JzW2MxXSxcbiAgICBjMWcgPSBjb2xvcnNbYzEgKyAxXSxcbiAgICBjMWIgPSBjb2xvcnNbYzEgKyAyXTtcbiAgY29uc3QgYzJyID0gY29sb3JzW2MyXSxcbiAgICBjMmcgPSBjb2xvcnNbYzIgKyAxXSxcbiAgICBjMmIgPSBjb2xvcnNbYzIgKyAyXTtcbiAgY29uc3QgYzNyID0gY29sb3JzW2MzXSxcbiAgICBjM2cgPSBjb2xvcnNbYzMgKyAxXSxcbiAgICBjM2IgPSBjb2xvcnNbYzMgKyAyXTtcbiAgY29uc3QgbWluWSA9IE1hdGgucm91bmQoeTEpLFxuICAgIG1heFkgPSBNYXRoLnJvdW5kKHkzKTtcbiAgbGV0IHhhLCBjYXIsIGNhZywgY2FiO1xuICBsZXQgeGIsIGNiciwgY2JnLCBjYmI7XG4gIGZvciAobGV0IHkgPSBtaW5ZOyB5IDw9IG1heFk7IHkrKykge1xuICAgIGlmICh5IDwgeTIpIHtcbiAgICAgIGNvbnN0IGsgPSB5IDwgeTEgPyAwIDogKHkxIC0geSkgLyAoeTEgLSB5Mik7XG4gICAgICB4YSA9IHgxIC0gKHgxIC0geDIpICogaztcbiAgICAgIGNhciA9IGMxciAtIChjMXIgLSBjMnIpICogaztcbiAgICAgIGNhZyA9IGMxZyAtIChjMWcgLSBjMmcpICogaztcbiAgICAgIGNhYiA9IGMxYiAtIChjMWIgLSBjMmIpICogaztcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGs7XG4gICAgICBpZiAoeSA+IHkzKSB7XG4gICAgICAgIGsgPSAxO1xuICAgICAgfSBlbHNlIGlmICh5MiA9PT0geTMpIHtcbiAgICAgICAgayA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrID0gKHkyIC0geSkgLyAoeTIgLSB5Myk7XG4gICAgICB9XG4gICAgICB4YSA9IHgyIC0gKHgyIC0geDMpICogaztcbiAgICAgIGNhciA9IGMyciAtIChjMnIgLSBjM3IpICogaztcbiAgICAgIGNhZyA9IGMyZyAtIChjMmcgLSBjM2cpICogaztcbiAgICAgIGNhYiA9IGMyYiAtIChjMmIgLSBjM2IpICogaztcbiAgICB9XG4gICAgbGV0IGs7XG4gICAgaWYgKHkgPCB5MSkge1xuICAgICAgayA9IDA7XG4gICAgfSBlbHNlIGlmICh5ID4geTMpIHtcbiAgICAgIGsgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBrID0gKHkxIC0geSkgLyAoeTEgLSB5Myk7XG4gICAgfVxuICAgIHhiID0geDEgLSAoeDEgLSB4MykgKiBrO1xuICAgIGNiciA9IGMxciAtIChjMXIgLSBjM3IpICogaztcbiAgICBjYmcgPSBjMWcgLSAoYzFnIC0gYzNnKSAqIGs7XG4gICAgY2JiID0gYzFiIC0gKGMxYiAtIGMzYikgKiBrO1xuICAgIGNvbnN0IHgxXyA9IE1hdGgucm91bmQoTWF0aC5taW4oeGEsIHhiKSk7XG4gICAgY29uc3QgeDJfID0gTWF0aC5yb3VuZChNYXRoLm1heCh4YSwgeGIpKTtcbiAgICBsZXQgaiA9IHJvd1NpemUgKiB5ICsgeDFfICogNDtcbiAgICBmb3IgKGxldCB4ID0geDFfOyB4IDw9IHgyXzsgeCsrKSB7XG4gICAgICBrID0gKHhhIC0geCkgLyAoeGEgLSB4Yik7XG4gICAgICBpZiAoayA8IDApIHtcbiAgICAgICAgayA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGsgPiAxKSB7XG4gICAgICAgIGsgPSAxO1xuICAgICAgfVxuICAgICAgYnl0ZXNbaisrXSA9IGNhciAtIChjYXIgLSBjYnIpICogayB8IDA7XG4gICAgICBieXRlc1tqKytdID0gY2FnIC0gKGNhZyAtIGNiZykgKiBrIHwgMDtcbiAgICAgIGJ5dGVzW2orK10gPSBjYWIgLSAoY2FiIC0gY2JiKSAqIGsgfCAwO1xuICAgICAgYnl0ZXNbaisrXSA9IDI1NTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRyYXdGaWd1cmUoZGF0YSwgZmlndXJlLCBjb250ZXh0KSB7XG4gIGNvbnN0IHBzID0gZmlndXJlLmNvb3JkcztcbiAgY29uc3QgY3MgPSBmaWd1cmUuY29sb3JzO1xuICBsZXQgaSwgaWk7XG4gIHN3aXRjaCAoZmlndXJlLnR5cGUpIHtcbiAgICBjYXNlIFwibGF0dGljZVwiOlxuICAgICAgY29uc3QgdmVydGljZXNQZXJSb3cgPSBmaWd1cmUudmVydGljZXNQZXJSb3c7XG4gICAgICBjb25zdCByb3dzID0gTWF0aC5mbG9vcihwcy5sZW5ndGggLyB2ZXJ0aWNlc1BlclJvdykgLSAxO1xuICAgICAgY29uc3QgY29scyA9IHZlcnRpY2VzUGVyUm93IC0gMTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgICAgbGV0IHEgPSBpICogdmVydGljZXNQZXJSb3c7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrLCBxKyspIHtcbiAgICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbcV0sIHBzW3EgKyAxXSwgcHNbcSArIHZlcnRpY2VzUGVyUm93XSwgY3NbcV0sIGNzW3EgKyAxXSwgY3NbcSArIHZlcnRpY2VzUGVyUm93XSk7XG4gICAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBwc1txICsgMV0sIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBjc1txICsgMV0sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwidHJpYW5nbGVzXCI6XG4gICAgICBmb3IgKGkgPSAwLCBpaSA9IHBzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDMpIHtcbiAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW2ldLCBwc1tpICsgMV0sIHBzW2kgKyAyXSwgY3NbaV0sIGNzW2kgKyAxXSwgY3NbaSArIDJdKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGZpZ3VyZVwiKTtcbiAgfVxufVxuY2xhc3MgTWVzaFNoYWRpbmdQYXR0ZXJuIGV4dGVuZHMgQmFzZVNoYWRpbmdQYXR0ZXJuIHtcbiAgY29uc3RydWN0b3IoSVIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2Nvb3JkcyA9IElSWzJdO1xuICAgIHRoaXMuX2NvbG9ycyA9IElSWzNdO1xuICAgIHRoaXMuX2ZpZ3VyZXMgPSBJUls0XTtcbiAgICB0aGlzLl9ib3VuZHMgPSBJUls1XTtcbiAgICB0aGlzLl9iYm94ID0gSVJbN107XG4gICAgdGhpcy5fYmFja2dyb3VuZCA9IElSWzhdO1xuICAgIHRoaXMubWF0cml4ID0gbnVsbDtcbiAgfVxuICBfY3JlYXRlTWVzaENhbnZhcyhjb21iaW5lZFNjYWxlLCBiYWNrZ3JvdW5kQ29sb3IsIGNhY2hlZENhbnZhc2VzKSB7XG4gICAgY29uc3QgRVhQRUNURURfU0NBTEUgPSAxLjE7XG4gICAgY29uc3QgTUFYX1BBVFRFUk5fU0laRSA9IDMwMDA7XG4gICAgY29uc3QgQk9SREVSX1NJWkUgPSAyO1xuICAgIGNvbnN0IG9mZnNldFggPSBNYXRoLmZsb29yKHRoaXMuX2JvdW5kc1swXSk7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IodGhpcy5fYm91bmRzWzFdKTtcbiAgICBjb25zdCBib3VuZHNXaWR0aCA9IE1hdGguY2VpbCh0aGlzLl9ib3VuZHNbMl0pIC0gb2Zmc2V0WDtcbiAgICBjb25zdCBib3VuZHNIZWlnaHQgPSBNYXRoLmNlaWwodGhpcy5fYm91bmRzWzNdKSAtIG9mZnNldFk7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihNYXRoLmNlaWwoTWF0aC5hYnMoYm91bmRzV2lkdGggKiBjb21iaW5lZFNjYWxlWzBdICogRVhQRUNURURfU0NBTEUpKSwgTUFYX1BBVFRFUk5fU0laRSk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGJvdW5kc0hlaWdodCAqIGNvbWJpbmVkU2NhbGVbMV0gKiBFWFBFQ1RFRF9TQ0FMRSkpLCBNQVhfUEFUVEVSTl9TSVpFKTtcbiAgICBjb25zdCBzY2FsZVggPSBib3VuZHNXaWR0aCAvIHdpZHRoO1xuICAgIGNvbnN0IHNjYWxlWSA9IGJvdW5kc0hlaWdodCAvIGhlaWdodDtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgY29vcmRzOiB0aGlzLl9jb29yZHMsXG4gICAgICBjb2xvcnM6IHRoaXMuX2NvbG9ycyxcbiAgICAgIG9mZnNldFg6IC1vZmZzZXRYLFxuICAgICAgb2Zmc2V0WTogLW9mZnNldFksXG4gICAgICBzY2FsZVg6IDEgLyBzY2FsZVgsXG4gICAgICBzY2FsZVk6IDEgLyBzY2FsZVlcbiAgICB9O1xuICAgIGNvbnN0IHBhZGRlZFdpZHRoID0gd2lkdGggKyBCT1JERVJfU0laRSAqIDI7XG4gICAgY29uc3QgcGFkZGVkSGVpZ2h0ID0gaGVpZ2h0ICsgQk9SREVSX1NJWkUgKiAyO1xuICAgIGNvbnN0IHRtcENhbnZhcyA9IGNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcIm1lc2hcIiwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCwgZmFsc2UpO1xuICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgIGNvbnN0IGRhdGEgPSB0bXBDdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gZGF0YS5kYXRhO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnl0ZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkge1xuICAgICAgICBieXRlc1tpXSA9IGJhY2tncm91bmRDb2xvclswXTtcbiAgICAgICAgYnl0ZXNbaSArIDFdID0gYmFja2dyb3VuZENvbG9yWzFdO1xuICAgICAgICBieXRlc1tpICsgMl0gPSBiYWNrZ3JvdW5kQ29sb3JbMl07XG4gICAgICAgIGJ5dGVzW2kgKyAzXSA9IDI1NTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWd1cmUgb2YgdGhpcy5fZmlndXJlcykge1xuICAgICAgZHJhd0ZpZ3VyZShkYXRhLCBmaWd1cmUsIGNvbnRleHQpO1xuICAgIH1cbiAgICB0bXBDdHgucHV0SW1hZ2VEYXRhKGRhdGEsIEJPUkRFUl9TSVpFLCBCT1JERVJfU0laRSk7XG4gICAgY29uc3QgY2FudmFzID0gdG1wQ2FudmFzLmNhbnZhcztcbiAgICByZXR1cm4ge1xuICAgICAgY2FudmFzLFxuICAgICAgb2Zmc2V0WDogb2Zmc2V0WCAtIEJPUkRFUl9TSVpFICogc2NhbGVYLFxuICAgICAgb2Zmc2V0WTogb2Zmc2V0WSAtIEJPUkRFUl9TSVpFICogc2NhbGVZLFxuICAgICAgc2NhbGVYLFxuICAgICAgc2NhbGVZXG4gICAgfTtcbiAgfVxuICBnZXRQYXR0ZXJuKGN0eCwgb3duZXIsIGludmVyc2UsIHBhdGhUeXBlKSB7XG4gICAgYXBwbHlCb3VuZGluZ0JveChjdHgsIHRoaXMuX2Jib3gpO1xuICAgIGxldCBzY2FsZTtcbiAgICBpZiAocGF0aFR5cGUgPT09IFBhdGhUeXBlLlNIQURJTkcpIHtcbiAgICAgIHNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2FsZSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUob3duZXIuYmFzZVRyYW5zZm9ybSk7XG4gICAgICBpZiAodGhpcy5tYXRyaXgpIHtcbiAgICAgICAgY29uc3QgbWF0cml4U2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMubWF0cml4KTtcbiAgICAgICAgc2NhbGUgPSBbc2NhbGVbMF0gKiBtYXRyaXhTY2FsZVswXSwgc2NhbGVbMV0gKiBtYXRyaXhTY2FsZVsxXV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRlbXBvcmFyeVBhdHRlcm5DYW52YXMgPSB0aGlzLl9jcmVhdGVNZXNoQ2FudmFzKHNjYWxlLCBwYXRoVHlwZSA9PT0gUGF0aFR5cGUuU0hBRElORyA/IG51bGwgOiB0aGlzLl9iYWNrZ3JvdW5kLCBvd25lci5jYWNoZWRDYW52YXNlcyk7XG4gICAgaWYgKHBhdGhUeXBlICE9PSBQYXRoVHlwZS5TSEFESU5HKSB7XG4gICAgICBjdHguc2V0VHJhbnNmb3JtKC4uLm93bmVyLmJhc2VUcmFuc2Zvcm0pO1xuICAgICAgaWYgKHRoaXMubWF0cml4KSB7XG4gICAgICAgIGN0eC50cmFuc2Zvcm0oLi4udGhpcy5tYXRyaXgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjdHgudHJhbnNsYXRlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WCwgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRZKTtcbiAgICBjdHguc2NhbGUodGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5zY2FsZVgsIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVZKTtcbiAgICByZXR1cm4gY3R4LmNyZWF0ZVBhdHRlcm4odGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5jYW52YXMsIFwibm8tcmVwZWF0XCIpO1xuICB9XG59XG5jbGFzcyBEdW1teVNoYWRpbmdQYXR0ZXJuIGV4dGVuZHMgQmFzZVNoYWRpbmdQYXR0ZXJuIHtcbiAgZ2V0UGF0dGVybigpIHtcbiAgICByZXR1cm4gXCJob3RwaW5rXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFNoYWRpbmdQYXR0ZXJuKElSKSB7XG4gIHN3aXRjaCAoSVJbMF0pIHtcbiAgICBjYXNlIFwiUmFkaWFsQXhpYWxcIjpcbiAgICAgIHJldHVybiBuZXcgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybihJUik7XG4gICAgY2FzZSBcIk1lc2hcIjpcbiAgICAgIHJldHVybiBuZXcgTWVzaFNoYWRpbmdQYXR0ZXJuKElSKTtcbiAgICBjYXNlIFwiRHVtbXlcIjpcbiAgICAgIHJldHVybiBuZXcgRHVtbXlTaGFkaW5nUGF0dGVybigpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBJUiB0eXBlOiAke0lSWzBdfWApO1xufVxuY29uc3QgUGFpbnRUeXBlID0ge1xuICBDT0xPUkVEOiAxLFxuICBVTkNPTE9SRUQ6IDJcbn07XG5jbGFzcyBUaWxpbmdQYXR0ZXJuIHtcbiAgc3RhdGljIE1BWF9QQVRURVJOX1NJWkUgPSAzMDAwO1xuICBjb25zdHJ1Y3RvcihJUiwgY29sb3IsIGN0eCwgY2FudmFzR3JhcGhpY3NGYWN0b3J5LCBiYXNlVHJhbnNmb3JtKSB7XG4gICAgdGhpcy5vcGVyYXRvckxpc3QgPSBJUlsyXTtcbiAgICB0aGlzLm1hdHJpeCA9IElSWzNdO1xuICAgIHRoaXMuYmJveCA9IElSWzRdO1xuICAgIHRoaXMueHN0ZXAgPSBJUls1XTtcbiAgICB0aGlzLnlzdGVwID0gSVJbNl07XG4gICAgdGhpcy5wYWludFR5cGUgPSBJUls3XTtcbiAgICB0aGlzLnRpbGluZ1R5cGUgPSBJUls4XTtcbiAgICB0aGlzLmNvbG9yID0gY29sb3I7XG4gICAgdGhpcy5jdHggPSBjdHg7XG4gICAgdGhpcy5jYW52YXNHcmFwaGljc0ZhY3RvcnkgPSBjYW52YXNHcmFwaGljc0ZhY3Rvcnk7XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gYmFzZVRyYW5zZm9ybTtcbiAgfVxuICBjcmVhdGVQYXR0ZXJuQ2FudmFzKG93bmVyKSB7XG4gICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gdGhpcy5vcGVyYXRvckxpc3Q7XG4gICAgY29uc3QgYmJveCA9IHRoaXMuYmJveDtcbiAgICBjb25zdCB4c3RlcCA9IHRoaXMueHN0ZXA7XG4gICAgY29uc3QgeXN0ZXAgPSB0aGlzLnlzdGVwO1xuICAgIGNvbnN0IHBhaW50VHlwZSA9IHRoaXMucGFpbnRUeXBlO1xuICAgIGNvbnN0IHRpbGluZ1R5cGUgPSB0aGlzLnRpbGluZ1R5cGU7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yO1xuICAgIGNvbnN0IGNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IHRoaXMuY2FudmFzR3JhcGhpY3NGYWN0b3J5O1xuICAgIGluZm8oXCJUaWxpbmdUeXBlOiBcIiArIHRpbGluZ1R5cGUpO1xuICAgIGNvbnN0IHgwID0gYmJveFswXSxcbiAgICAgIHkwID0gYmJveFsxXSxcbiAgICAgIHgxID0gYmJveFsyXSxcbiAgICAgIHkxID0gYmJveFszXTtcbiAgICBjb25zdCBtYXRyaXhTY2FsZSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5tYXRyaXgpO1xuICAgIGNvbnN0IGN1ck1hdHJpeFNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLmJhc2VUcmFuc2Zvcm0pO1xuICAgIGNvbnN0IGNvbWJpbmVkU2NhbGUgPSBbbWF0cml4U2NhbGVbMF0gKiBjdXJNYXRyaXhTY2FsZVswXSwgbWF0cml4U2NhbGVbMV0gKiBjdXJNYXRyaXhTY2FsZVsxXV07XG4gICAgY29uc3QgZGlteCA9IHRoaXMuZ2V0U2l6ZUFuZFNjYWxlKHhzdGVwLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIGNvbWJpbmVkU2NhbGVbMF0pO1xuICAgIGNvbnN0IGRpbXkgPSB0aGlzLmdldFNpemVBbmRTY2FsZSh5c3RlcCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCwgY29tYmluZWRTY2FsZVsxXSk7XG4gICAgY29uc3QgdG1wQ2FudmFzID0gb3duZXIuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwicGF0dGVyblwiLCBkaW14LnNpemUsIGRpbXkuc2l6ZSwgdHJ1ZSk7XG4gICAgY29uc3QgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgY29uc3QgZ3JhcGhpY3MgPSBjYW52YXNHcmFwaGljc0ZhY3RvcnkuY3JlYXRlQ2FudmFzR3JhcGhpY3ModG1wQ3R4KTtcbiAgICBncmFwaGljcy5ncm91cExldmVsID0gb3duZXIuZ3JvdXBMZXZlbDtcbiAgICB0aGlzLnNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChncmFwaGljcywgcGFpbnRUeXBlLCBjb2xvcik7XG4gICAgbGV0IGFkanVzdGVkWDAgPSB4MDtcbiAgICBsZXQgYWRqdXN0ZWRZMCA9IHkwO1xuICAgIGxldCBhZGp1c3RlZFgxID0geDE7XG4gICAgbGV0IGFkanVzdGVkWTEgPSB5MTtcbiAgICBpZiAoeDAgPCAwKSB7XG4gICAgICBhZGp1c3RlZFgwID0gMDtcbiAgICAgIGFkanVzdGVkWDEgKz0gTWF0aC5hYnMoeDApO1xuICAgIH1cbiAgICBpZiAoeTAgPCAwKSB7XG4gICAgICBhZGp1c3RlZFkwID0gMDtcbiAgICAgIGFkanVzdGVkWTEgKz0gTWF0aC5hYnMoeTApO1xuICAgIH1cbiAgICB0bXBDdHgudHJhbnNsYXRlKC0oZGlteC5zY2FsZSAqIGFkanVzdGVkWDApLCAtKGRpbXkuc2NhbGUgKiBhZGp1c3RlZFkwKSk7XG4gICAgZ3JhcGhpY3MudHJhbnNmb3JtKGRpbXguc2NhbGUsIDAsIDAsIGRpbXkuc2NhbGUsIDAsIDApO1xuICAgIHRtcEN0eC5zYXZlKCk7XG4gICAgdGhpcy5jbGlwQmJveChncmFwaGljcywgYWRqdXN0ZWRYMCwgYWRqdXN0ZWRZMCwgYWRqdXN0ZWRYMSwgYWRqdXN0ZWRZMSk7XG4gICAgZ3JhcGhpY3MuYmFzZVRyYW5zZm9ybSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0oZ3JhcGhpY3MuY3R4KTtcbiAgICBncmFwaGljcy5leGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCk7XG4gICAgZ3JhcGhpY3MuZW5kRHJhd2luZygpO1xuICAgIHJldHVybiB7XG4gICAgICBjYW52YXM6IHRtcENhbnZhcy5jYW52YXMsXG4gICAgICBzY2FsZVg6IGRpbXguc2NhbGUsXG4gICAgICBzY2FsZVk6IGRpbXkuc2NhbGUsXG4gICAgICBvZmZzZXRYOiBhZGp1c3RlZFgwLFxuICAgICAgb2Zmc2V0WTogYWRqdXN0ZWRZMFxuICAgIH07XG4gIH1cbiAgZ2V0U2l6ZUFuZFNjYWxlKHN0ZXAsIHJlYWxPdXRwdXRTaXplLCBzY2FsZSkge1xuICAgIHN0ZXAgPSBNYXRoLmFicyhzdGVwKTtcbiAgICBjb25zdCBtYXhTaXplID0gTWF0aC5tYXgoVGlsaW5nUGF0dGVybi5NQVhfUEFUVEVSTl9TSVpFLCByZWFsT3V0cHV0U2l6ZSk7XG4gICAgbGV0IHNpemUgPSBNYXRoLmNlaWwoc3RlcCAqIHNjYWxlKTtcbiAgICBpZiAoc2l6ZSA+PSBtYXhTaXplKSB7XG4gICAgICBzaXplID0gbWF4U2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NhbGUgPSBzaXplIC8gc3RlcDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjYWxlLFxuICAgICAgc2l6ZVxuICAgIH07XG4gIH1cbiAgY2xpcEJib3goZ3JhcGhpY3MsIHgwLCB5MCwgeDEsIHkxKSB7XG4gICAgY29uc3QgYmJveFdpZHRoID0geDEgLSB4MDtcbiAgICBjb25zdCBiYm94SGVpZ2h0ID0geTEgLSB5MDtcbiAgICBncmFwaGljcy5jdHgucmVjdCh4MCwgeTAsIGJib3hXaWR0aCwgYmJveEhlaWdodCk7XG4gICAgZ3JhcGhpY3MuY3VycmVudC51cGRhdGVSZWN0TWluTWF4KGdldEN1cnJlbnRUcmFuc2Zvcm0oZ3JhcGhpY3MuY3R4KSwgW3gwLCB5MCwgeDEsIHkxXSk7XG4gICAgZ3JhcGhpY3MuY2xpcCgpO1xuICAgIGdyYXBoaWNzLmVuZFBhdGgoKTtcbiAgfVxuICBzZXRGaWxsQW5kU3Ryb2tlU3R5bGVUb0NvbnRleHQoZ3JhcGhpY3MsIHBhaW50VHlwZSwgY29sb3IpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gZ3JhcGhpY3MuY3R4LFxuICAgICAgY3VycmVudCA9IGdyYXBoaWNzLmN1cnJlbnQ7XG4gICAgc3dpdGNoIChwYWludFR5cGUpIHtcbiAgICAgIGNhc2UgUGFpbnRUeXBlLkNPTE9SRUQ6XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGN0eC5maWxsU3R5bGU7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBjdHguc3Ryb2tlU3R5bGU7XG4gICAgICAgIGN1cnJlbnQuZmlsbENvbG9yID0gY3R4LmZpbGxTdHlsZTtcbiAgICAgICAgY3VycmVudC5zdHJva2VDb2xvciA9IGN0eC5zdHJva2VTdHlsZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBhaW50VHlwZS5VTkNPTE9SRUQ6XG4gICAgICAgIGNvbnN0IGNzc0NvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSk7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY3NzQ29sb3I7XG4gICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBjc3NDb2xvcjtcbiAgICAgICAgY3VycmVudC5maWxsQ29sb3IgPSBjc3NDb2xvcjtcbiAgICAgICAgY3VycmVudC5zdHJva2VDb2xvciA9IGNzc0NvbG9yO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5zdXBwb3J0ZWQgcGFpbnQgdHlwZTogJHtwYWludFR5cGV9YCk7XG4gICAgfVxuICB9XG4gIGdldFBhdHRlcm4oY3R4LCBvd25lciwgaW52ZXJzZSwgcGF0aFR5cGUpIHtcbiAgICBsZXQgbWF0cml4ID0gaW52ZXJzZTtcbiAgICBpZiAocGF0aFR5cGUgIT09IFBhdGhUeXBlLlNIQURJTkcpIHtcbiAgICAgIG1hdHJpeCA9IFV0aWwudHJhbnNmb3JtKG1hdHJpeCwgb3duZXIuYmFzZVRyYW5zZm9ybSk7XG4gICAgICBpZiAodGhpcy5tYXRyaXgpIHtcbiAgICAgICAgbWF0cml4ID0gVXRpbC50cmFuc2Zvcm0obWF0cml4LCB0aGlzLm1hdHJpeCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHRlbXBvcmFyeVBhdHRlcm5DYW52YXMgPSB0aGlzLmNyZWF0ZVBhdHRlcm5DYW52YXMob3duZXIpO1xuICAgIGxldCBkb21NYXRyaXggPSBuZXcgRE9NTWF0cml4KG1hdHJpeCk7XG4gICAgZG9tTWF0cml4ID0gZG9tTWF0cml4LnRyYW5zbGF0ZSh0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLm9mZnNldFgsIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WSk7XG4gICAgZG9tTWF0cml4ID0gZG9tTWF0cml4LnNjYWxlKDEgLyB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWCwgMSAvIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVZKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gY3R4LmNyZWF0ZVBhdHRlcm4odGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5jYW52YXMsIFwicmVwZWF0XCIpO1xuICAgIHBhdHRlcm4uc2V0VHJhbnNmb3JtKGRvbU1hdHJpeCk7XG4gICAgcmV0dXJuIHBhdHRlcm47XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3NoYXJlZC9pbWFnZV91dGlscy5qc1xuXG5mdW5jdGlvbiBjb252ZXJ0VG9SR0JBKHBhcmFtcykge1xuICBzd2l0Y2ggKHBhcmFtcy5raW5kKSB7XG4gICAgY2FzZSBJbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA6XG4gICAgICByZXR1cm4gY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEocGFyYW1zKTtcbiAgICBjYXNlIEltYWdlS2luZC5SR0JfMjRCUFA6XG4gICAgICByZXR1cm4gY29udmVydFJHQlRvUkdCQShwYXJhbXMpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEoe1xuICBzcmMsXG4gIHNyY1BvcyA9IDAsXG4gIGRlc3QsXG4gIHdpZHRoLFxuICBoZWlnaHQsXG4gIG5vbkJsYWNrQ29sb3IgPSAweGZmZmZmZmZmLFxuICBpbnZlcnNlRGVjb2RlID0gZmFsc2Vcbn0pIHtcbiAgY29uc3QgYmxhY2sgPSB1dGlsX0ZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8gMHhmZjAwMDAwMCA6IDB4MDAwMDAwZmY7XG4gIGNvbnN0IFt6ZXJvTWFwcGluZywgb25lTWFwcGluZ10gPSBpbnZlcnNlRGVjb2RlID8gW25vbkJsYWNrQ29sb3IsIGJsYWNrXSA6IFtibGFjaywgbm9uQmxhY2tDb2xvcl07XG4gIGNvbnN0IHdpZHRoSW5Tb3VyY2UgPSB3aWR0aCA+PiAzO1xuICBjb25zdCB3aWR0aFJlbWFpbmRlciA9IHdpZHRoICYgNztcbiAgY29uc3Qgc3JjTGVuZ3RoID0gc3JjLmxlbmd0aDtcbiAgZGVzdCA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7XG4gIGxldCBkZXN0UG9zID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1xuICAgIGZvciAoY29uc3QgbWF4ID0gc3JjUG9zICsgd2lkdGhJblNvdXJjZTsgc3JjUG9zIDwgbWF4OyBzcmNQb3MrKykge1xuICAgICAgY29uc3QgZWxlbSA9IHNyY1BvcyA8IHNyY0xlbmd0aCA/IHNyY1tzcmNQb3NdIDogMjU1O1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgIH1cbiAgICBpZiAod2lkdGhSZW1haW5kZXIgPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBlbGVtID0gc3JjUG9zIDwgc3JjTGVuZ3RoID8gc3JjW3NyY1BvcysrXSA6IDI1NTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHdpZHRoUmVtYWluZGVyOyBqKyspIHtcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAxIDw8IDcgLSBqID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHNyY1BvcyxcbiAgICBkZXN0UG9zXG4gIH07XG59XG5mdW5jdGlvbiBjb252ZXJ0UkdCVG9SR0JBKHtcbiAgc3JjLFxuICBzcmNQb3MgPSAwLFxuICBkZXN0LFxuICBkZXN0UG9zID0gMCxcbiAgd2lkdGgsXG4gIGhlaWdodFxufSkge1xuICBsZXQgaSA9IDA7XG4gIGNvbnN0IGxlbjMyID0gc3JjLmxlbmd0aCA+PiAyO1xuICBjb25zdCBzcmMzMiA9IG5ldyBVaW50MzJBcnJheShzcmMuYnVmZmVyLCBzcmNQb3MsIGxlbjMyKTtcbiAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7XG4gICAgZm9yICg7IGkgPCBsZW4zMiAtIDI7IGkgKz0gMywgZGVzdFBvcyArPSA0KSB7XG4gICAgICBjb25zdCBzMSA9IHNyYzMyW2ldO1xuICAgICAgY29uc3QgczIgPSBzcmMzMltpICsgMV07XG4gICAgICBjb25zdCBzMyA9IHNyYzMyW2kgKyAyXTtcbiAgICAgIGRlc3RbZGVzdFBvc10gPSBzMSB8IDB4ZmYwMDAwMDA7XG4gICAgICBkZXN0W2Rlc3RQb3MgKyAxXSA9IHMxID4+PiAyNCB8IHMyIDw8IDggfCAweGZmMDAwMDAwO1xuICAgICAgZGVzdFtkZXN0UG9zICsgMl0gPSBzMiA+Pj4gMTYgfCBzMyA8PCAxNiB8IDB4ZmYwMDAwMDA7XG4gICAgICBkZXN0W2Rlc3RQb3MgKyAzXSA9IHMzID4+PiA4IHwgMHhmZjAwMDAwMDtcbiAgICB9XG4gICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyYy5sZW5ndGg7IGogPCBqajsgaiArPSAzKSB7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbal0gfCBzcmNbaiArIDFdIDw8IDggfCBzcmNbaiArIDJdIDw8IDE2IHwgMHhmZjAwMDAwMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICg7IGkgPCBsZW4zMiAtIDI7IGkgKz0gMywgZGVzdFBvcyArPSA0KSB7XG4gICAgICBjb25zdCBzMSA9IHNyYzMyW2ldO1xuICAgICAgY29uc3QgczIgPSBzcmMzMltpICsgMV07XG4gICAgICBjb25zdCBzMyA9IHNyYzMyW2kgKyAyXTtcbiAgICAgIGRlc3RbZGVzdFBvc10gPSBzMSB8IDB4ZmY7XG4gICAgICBkZXN0W2Rlc3RQb3MgKyAxXSA9IHMxIDw8IDI0IHwgczIgPj4+IDggfCAweGZmO1xuICAgICAgZGVzdFtkZXN0UG9zICsgMl0gPSBzMiA8PCAxNiB8IHMzID4+PiAxNiB8IDB4ZmY7XG4gICAgICBkZXN0W2Rlc3RQb3MgKyAzXSA9IHMzIDw8IDggfCAweGZmO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gaSAqIDQsIGpqID0gc3JjLmxlbmd0aDsgaiA8IGpqOyBqICs9IDMpIHtcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tqXSA8PCAyNCB8IHNyY1tqICsgMV0gPDwgMTYgfCBzcmNbaiArIDJdIDw8IDggfCAweGZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHNyY1BvcyxcbiAgICBkZXN0UG9zXG4gIH07XG59XG5mdW5jdGlvbiBncmF5VG9SR0JBKHNyYywgZGVzdCkge1xuICBpZiAoRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pIHtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgZGVzdFtpXSA9IHNyY1tpXSAqIDB4MTAxMDEgfCAweGZmMDAwMDAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgZGVzdFtpXSA9IHNyY1tpXSAqIDB4MTAxMDEwMCB8IDB4MDAwMDAwZmY7XG4gICAgfVxuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2NhbnZhcy5qc1xuXG5cblxuXG5jb25zdCBNSU5fRk9OVF9TSVpFID0gMTY7XG5jb25zdCBNQVhfRk9OVF9TSVpFID0gMTAwO1xuY29uc3QgRVhFQ1VUSU9OX1RJTUUgPSAxNTtcbmNvbnN0IEVYRUNVVElPTl9TVEVQUyA9IDEwO1xuY29uc3QgTUFYX1NJWkVfVE9fQ09NUElMRSA9IDEwMDA7XG5jb25zdCBGVUxMX0NIVU5LX0hFSUdIVCA9IDE2O1xuZnVuY3Rpb24gbWlycm9yQ29udGV4dE9wZXJhdGlvbnMoY3R4LCBkZXN0Q3R4KSB7XG4gIGlmIChjdHguX3JlbW92ZU1pcnJvcmluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgaXMgYWxyZWFkeSBmb3J3YXJkaW5nIG9wZXJhdGlvbnMuXCIpO1xuICB9XG4gIGN0eC5fX29yaWdpbmFsU2F2ZSA9IGN0eC5zYXZlO1xuICBjdHguX19vcmlnaW5hbFJlc3RvcmUgPSBjdHgucmVzdG9yZTtcbiAgY3R4Ll9fb3JpZ2luYWxSb3RhdGUgPSBjdHgucm90YXRlO1xuICBjdHguX19vcmlnaW5hbFNjYWxlID0gY3R4LnNjYWxlO1xuICBjdHguX19vcmlnaW5hbFRyYW5zbGF0ZSA9IGN0eC50cmFuc2xhdGU7XG4gIGN0eC5fX29yaWdpbmFsVHJhbnNmb3JtID0gY3R4LnRyYW5zZm9ybTtcbiAgY3R4Ll9fb3JpZ2luYWxTZXRUcmFuc2Zvcm0gPSBjdHguc2V0VHJhbnNmb3JtO1xuICBjdHguX19vcmlnaW5hbFJlc2V0VHJhbnNmb3JtID0gY3R4LnJlc2V0VHJhbnNmb3JtO1xuICBjdHguX19vcmlnaW5hbENsaXAgPSBjdHguY2xpcDtcbiAgY3R4Ll9fb3JpZ2luYWxNb3ZlVG8gPSBjdHgubW92ZVRvO1xuICBjdHguX19vcmlnaW5hbExpbmVUbyA9IGN0eC5saW5lVG87XG4gIGN0eC5fX29yaWdpbmFsQmV6aWVyQ3VydmVUbyA9IGN0eC5iZXppZXJDdXJ2ZVRvO1xuICBjdHguX19vcmlnaW5hbFJlY3QgPSBjdHgucmVjdDtcbiAgY3R4Ll9fb3JpZ2luYWxDbG9zZVBhdGggPSBjdHguY2xvc2VQYXRoO1xuICBjdHguX19vcmlnaW5hbEJlZ2luUGF0aCA9IGN0eC5iZWdpblBhdGg7XG4gIGN0eC5fcmVtb3ZlTWlycm9yaW5nID0gKCkgPT4ge1xuICAgIGN0eC5zYXZlID0gY3R4Ll9fb3JpZ2luYWxTYXZlO1xuICAgIGN0eC5yZXN0b3JlID0gY3R4Ll9fb3JpZ2luYWxSZXN0b3JlO1xuICAgIGN0eC5yb3RhdGUgPSBjdHguX19vcmlnaW5hbFJvdGF0ZTtcbiAgICBjdHguc2NhbGUgPSBjdHguX19vcmlnaW5hbFNjYWxlO1xuICAgIGN0eC50cmFuc2xhdGUgPSBjdHguX19vcmlnaW5hbFRyYW5zbGF0ZTtcbiAgICBjdHgudHJhbnNmb3JtID0gY3R4Ll9fb3JpZ2luYWxUcmFuc2Zvcm07XG4gICAgY3R4LnNldFRyYW5zZm9ybSA9IGN0eC5fX29yaWdpbmFsU2V0VHJhbnNmb3JtO1xuICAgIGN0eC5yZXNldFRyYW5zZm9ybSA9IGN0eC5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm07XG4gICAgY3R4LmNsaXAgPSBjdHguX19vcmlnaW5hbENsaXA7XG4gICAgY3R4Lm1vdmVUbyA9IGN0eC5fX29yaWdpbmFsTW92ZVRvO1xuICAgIGN0eC5saW5lVG8gPSBjdHguX19vcmlnaW5hbExpbmVUbztcbiAgICBjdHguYmV6aWVyQ3VydmVUbyA9IGN0eC5fX29yaWdpbmFsQmV6aWVyQ3VydmVUbztcbiAgICBjdHgucmVjdCA9IGN0eC5fX29yaWdpbmFsUmVjdDtcbiAgICBjdHguY2xvc2VQYXRoID0gY3R4Ll9fb3JpZ2luYWxDbG9zZVBhdGg7XG4gICAgY3R4LmJlZ2luUGF0aCA9IGN0eC5fX29yaWdpbmFsQmVnaW5QYXRoO1xuICAgIGRlbGV0ZSBjdHguX3JlbW92ZU1pcnJvcmluZztcbiAgfTtcbiAgY3R4LnNhdmUgPSBmdW5jdGlvbiBjdHhTYXZlKCkge1xuICAgIGRlc3RDdHguc2F2ZSgpO1xuICAgIHRoaXMuX19vcmlnaW5hbFNhdmUoKTtcbiAgfTtcbiAgY3R4LnJlc3RvcmUgPSBmdW5jdGlvbiBjdHhSZXN0b3JlKCkge1xuICAgIGRlc3RDdHgucmVzdG9yZSgpO1xuICAgIHRoaXMuX19vcmlnaW5hbFJlc3RvcmUoKTtcbiAgfTtcbiAgY3R4LnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIGN0eFRyYW5zbGF0ZSh4LCB5KSB7XG4gICAgZGVzdEN0eC50cmFuc2xhdGUoeCwgeSk7XG4gICAgdGhpcy5fX29yaWdpbmFsVHJhbnNsYXRlKHgsIHkpO1xuICB9O1xuICBjdHguc2NhbGUgPSBmdW5jdGlvbiBjdHhTY2FsZSh4LCB5KSB7XG4gICAgZGVzdEN0eC5zY2FsZSh4LCB5KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxTY2FsZSh4LCB5KTtcbiAgfTtcbiAgY3R4LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIGN0eFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgZGVzdEN0eC50cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG4gICAgdGhpcy5fX29yaWdpbmFsVHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuICB9O1xuICBjdHguc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4U2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICBkZXN0Q3R4LnNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxTZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG4gIH07XG4gIGN0eC5yZXNldFRyYW5zZm9ybSA9IGZ1bmN0aW9uIGN0eFJlc2V0VHJhbnNmb3JtKCkge1xuICAgIGRlc3RDdHgucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybSgpO1xuICB9O1xuICBjdHgucm90YXRlID0gZnVuY3Rpb24gY3R4Um90YXRlKGFuZ2xlKSB7XG4gICAgZGVzdEN0eC5yb3RhdGUoYW5nbGUpO1xuICAgIHRoaXMuX19vcmlnaW5hbFJvdGF0ZShhbmdsZSk7XG4gIH07XG4gIGN0eC5jbGlwID0gZnVuY3Rpb24gY3R4Um90YXRlKHJ1bGUpIHtcbiAgICBkZXN0Q3R4LmNsaXAocnVsZSk7XG4gICAgdGhpcy5fX29yaWdpbmFsQ2xpcChydWxlKTtcbiAgfTtcbiAgY3R4Lm1vdmVUbyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgZGVzdEN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgdGhpcy5fX29yaWdpbmFsTW92ZVRvKHgsIHkpO1xuICB9O1xuICBjdHgubGluZVRvID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICBkZXN0Q3R4LmxpbmVUbyh4LCB5KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxMaW5lVG8oeCwgeSk7XG4gIH07XG4gIGN0eC5iZXppZXJDdXJ2ZVRvID0gZnVuY3Rpb24gKGNwMXgsIGNwMXksIGNwMngsIGNwMnksIHgsIHkpIHtcbiAgICBkZXN0Q3R4LmJlemllckN1cnZlVG8oY3AxeCwgY3AxeSwgY3AyeCwgY3AyeSwgeCwgeSk7XG4gICAgdGhpcy5fX29yaWdpbmFsQmV6aWVyQ3VydmVUbyhjcDF4LCBjcDF5LCBjcDJ4LCBjcDJ5LCB4LCB5KTtcbiAgfTtcbiAgY3R4LnJlY3QgPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgIGRlc3RDdHgucmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICB9O1xuICBjdHguY2xvc2VQYXRoID0gZnVuY3Rpb24gKCkge1xuICAgIGRlc3RDdHguY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5fX29yaWdpbmFsQ2xvc2VQYXRoKCk7XG4gIH07XG4gIGN0eC5iZWdpblBhdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgZGVzdEN0eC5iZWdpblBhdGgoKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxCZWdpblBhdGgoKTtcbiAgfTtcbn1cbmNsYXNzIENhY2hlZENhbnZhc2VzIHtcbiAgY29uc3RydWN0b3IoY2FudmFzRmFjdG9yeSkge1xuICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7XG4gICAgdGhpcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgZ2V0Q2FudmFzKGlkLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgbGV0IGNhbnZhc0VudHJ5O1xuICAgIGlmICh0aGlzLmNhY2hlW2lkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYW52YXNFbnRyeSA9IHRoaXMuY2FjaGVbaWRdO1xuICAgICAgdGhpcy5jYW52YXNGYWN0b3J5LnJlc2V0KGNhbnZhc0VudHJ5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FudmFzRW50cnkgPSB0aGlzLmNhbnZhc0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5jYWNoZVtpZF0gPSBjYW52YXNFbnRyeTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbnZhc0VudHJ5O1xuICB9XG4gIGRlbGV0ZShpZCkge1xuICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcbiAgfVxuICBjbGVhcigpIHtcbiAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuY2FjaGUpIHtcbiAgICAgIGNvbnN0IGNhbnZhc0VudHJ5ID0gdGhpcy5jYWNoZVtpZF07XG4gICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkuZGVzdHJveShjYW52YXNFbnRyeSk7XG4gICAgICBkZWxldGUgdGhpcy5jYWNoZVtpZF07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoY3R4LCBzcmNJbWcsIHNyY1gsIHNyY1ksIHNyY1csIHNyY0gsIGRlc3RYLCBkZXN0WSwgZGVzdFcsIGRlc3RIKSB7XG4gIGNvbnN0IFthLCBiLCBjLCBkLCB0eCwgdHldID0gZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpO1xuICBpZiAoYiA9PT0gMCAmJiBjID09PSAwKSB7XG4gICAgY29uc3QgdGxYID0gZGVzdFggKiBhICsgdHg7XG4gICAgY29uc3QgclRsWCA9IE1hdGgucm91bmQodGxYKTtcbiAgICBjb25zdCB0bFkgPSBkZXN0WSAqIGQgKyB0eTtcbiAgICBjb25zdCByVGxZID0gTWF0aC5yb3VuZCh0bFkpO1xuICAgIGNvbnN0IGJyWCA9IChkZXN0WCArIGRlc3RXKSAqIGEgKyB0eDtcbiAgICBjb25zdCByV2lkdGggPSBNYXRoLmFicyhNYXRoLnJvdW5kKGJyWCkgLSByVGxYKSB8fCAxO1xuICAgIGNvbnN0IGJyWSA9IChkZXN0WSArIGRlc3RIKSAqIGQgKyB0eTtcbiAgICBjb25zdCBySGVpZ2h0ID0gTWF0aC5hYnMoTWF0aC5yb3VuZChiclkpIC0gclRsWSkgfHwgMTtcbiAgICBjdHguc2V0VHJhbnNmb3JtKE1hdGguc2lnbihhKSwgMCwgMCwgTWF0aC5zaWduKGQpLCByVGxYLCByVGxZKTtcbiAgICBjdHguZHJhd0ltYWdlKHNyY0ltZywgc3JjWCwgc3JjWSwgc3JjVywgc3JjSCwgMCwgMCwgcldpZHRoLCBySGVpZ2h0KTtcbiAgICBjdHguc2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIHR4LCB0eSk7XG4gICAgcmV0dXJuIFtyV2lkdGgsIHJIZWlnaHRdO1xuICB9XG4gIGlmIChhID09PSAwICYmIGQgPT09IDApIHtcbiAgICBjb25zdCB0bFggPSBkZXN0WSAqIGMgKyB0eDtcbiAgICBjb25zdCByVGxYID0gTWF0aC5yb3VuZCh0bFgpO1xuICAgIGNvbnN0IHRsWSA9IGRlc3RYICogYiArIHR5O1xuICAgIGNvbnN0IHJUbFkgPSBNYXRoLnJvdW5kKHRsWSk7XG4gICAgY29uc3QgYnJYID0gKGRlc3RZICsgZGVzdEgpICogYyArIHR4O1xuICAgIGNvbnN0IHJXaWR0aCA9IE1hdGguYWJzKE1hdGgucm91bmQoYnJYKSAtIHJUbFgpIHx8IDE7XG4gICAgY29uc3QgYnJZID0gKGRlc3RYICsgZGVzdFcpICogYiArIHR5O1xuICAgIGNvbnN0IHJIZWlnaHQgPSBNYXRoLmFicyhNYXRoLnJvdW5kKGJyWSkgLSByVGxZKSB8fCAxO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMCwgTWF0aC5zaWduKGIpLCBNYXRoLnNpZ24oYyksIDAsIHJUbFgsIHJUbFkpO1xuICAgIGN0eC5kcmF3SW1hZ2Uoc3JjSW1nLCBzcmNYLCBzcmNZLCBzcmNXLCBzcmNILCAwLCAwLCBySGVpZ2h0LCByV2lkdGgpO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgdHgsIHR5KTtcbiAgICByZXR1cm4gW3JIZWlnaHQsIHJXaWR0aF07XG4gIH1cbiAgY3R4LmRyYXdJbWFnZShzcmNJbWcsIHNyY1gsIHNyY1ksIHNyY1csIHNyY0gsIGRlc3RYLCBkZXN0WSwgZGVzdFcsIGRlc3RIKTtcbiAgY29uc3Qgc2NhbGVYID0gTWF0aC5oeXBvdChhLCBiKTtcbiAgY29uc3Qgc2NhbGVZID0gTWF0aC5oeXBvdChjLCBkKTtcbiAgcmV0dXJuIFtzY2FsZVggKiBkZXN0Vywgc2NhbGVZICogZGVzdEhdO1xufVxuZnVuY3Rpb24gY29tcGlsZVR5cGUzR2x5cGgoaW1nRGF0YSkge1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0gPSBpbWdEYXRhO1xuICBpZiAod2lkdGggPiBNQVhfU0laRV9UT19DT01QSUxFIHx8IGhlaWdodCA+IE1BWF9TSVpFX1RPX0NPTVBJTEUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBQT0lOVF9UT19QUk9DRVNTX0xJTUlUID0gMTAwMDtcbiAgY29uc3QgUE9JTlRfVFlQRVMgPSBuZXcgVWludDhBcnJheShbMCwgMiwgNCwgMCwgMSwgMCwgNSwgNCwgOCwgMTAsIDAsIDgsIDAsIDIsIDEsIDBdKTtcbiAgY29uc3Qgd2lkdGgxID0gd2lkdGggKyAxO1xuICBsZXQgcG9pbnRzID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgxICogKGhlaWdodCArIDEpKTtcbiAgbGV0IGksIGosIGowO1xuICBjb25zdCBsaW5lU2l6ZSA9IHdpZHRoICsgNyAmIH43O1xuICBsZXQgZGF0YSA9IG5ldyBVaW50OEFycmF5KGxpbmVTaXplICogaGVpZ2h0KSxcbiAgICBwb3MgPSAwO1xuICBmb3IgKGNvbnN0IGVsZW0gb2YgaW1nRGF0YS5kYXRhKSB7XG4gICAgbGV0IG1hc2sgPSAxMjg7XG4gICAgd2hpbGUgKG1hc2sgPiAwKSB7XG4gICAgICBkYXRhW3BvcysrXSA9IGVsZW0gJiBtYXNrID8gMCA6IDI1NTtcbiAgICAgIG1hc2sgPj49IDE7XG4gICAgfVxuICB9XG4gIGxldCBjb3VudCA9IDA7XG4gIHBvcyA9IDA7XG4gIGlmIChkYXRhW3Bvc10gIT09IDApIHtcbiAgICBwb2ludHNbMF0gPSAxO1xuICAgICsrY291bnQ7XG4gIH1cbiAgZm9yIChqID0gMTsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICBpZiAoZGF0YVtwb3NdICE9PSBkYXRhW3BvcyArIDFdKSB7XG4gICAgICBwb2ludHNbal0gPSBkYXRhW3Bvc10gPyAyIDogMTtcbiAgICAgICsrY291bnQ7XG4gICAgfVxuICAgIHBvcysrO1xuICB9XG4gIGlmIChkYXRhW3Bvc10gIT09IDApIHtcbiAgICBwb2ludHNbal0gPSAyO1xuICAgICsrY291bnQ7XG4gIH1cbiAgZm9yIChpID0gMTsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgcG9zID0gaSAqIGxpbmVTaXplO1xuICAgIGowID0gaSAqIHdpZHRoMTtcbiAgICBpZiAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gIT09IGRhdGFbcG9zXSkge1xuICAgICAgcG9pbnRzW2owXSA9IGRhdGFbcG9zXSA/IDEgOiA4O1xuICAgICAgKytjb3VudDtcbiAgICB9XG4gICAgbGV0IHN1bSA9IChkYXRhW3Bvc10gPyA0IDogMCkgKyAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gPyA4IDogMCk7XG4gICAgZm9yIChqID0gMTsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICAgIHN1bSA9IChzdW0gPj4gMikgKyAoZGF0YVtwb3MgKyAxXSA/IDQgOiAwKSArIChkYXRhW3BvcyAtIGxpbmVTaXplICsgMV0gPyA4IDogMCk7XG4gICAgICBpZiAoUE9JTlRfVFlQRVNbc3VtXSkge1xuICAgICAgICBwb2ludHNbajAgKyBqXSA9IFBPSU5UX1RZUEVTW3N1bV07XG4gICAgICAgICsrY291bnQ7XG4gICAgICB9XG4gICAgICBwb3MrKztcbiAgICB9XG4gICAgaWYgKGRhdGFbcG9zIC0gbGluZVNpemVdICE9PSBkYXRhW3Bvc10pIHtcbiAgICAgIHBvaW50c1tqMCArIGpdID0gZGF0YVtwb3NdID8gMiA6IDQ7XG4gICAgICArK2NvdW50O1xuICAgIH1cbiAgICBpZiAoY291bnQgPiBQT0lOVF9UT19QUk9DRVNTX0xJTUlUKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcG9zID0gbGluZVNpemUgKiAoaGVpZ2h0IC0gMSk7XG4gIGowID0gaSAqIHdpZHRoMTtcbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1tqMF0gPSA4O1xuICAgICsrY291bnQ7XG4gIH1cbiAgZm9yIChqID0gMTsgaiA8IHdpZHRoOyBqKyspIHtcbiAgICBpZiAoZGF0YVtwb3NdICE9PSBkYXRhW3BvcyArIDFdKSB7XG4gICAgICBwb2ludHNbajAgKyBqXSA9IGRhdGFbcG9zXSA/IDQgOiA4O1xuICAgICAgKytjb3VudDtcbiAgICB9XG4gICAgcG9zKys7XG4gIH1cbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1tqMCArIGpdID0gNDtcbiAgICArK2NvdW50O1xuICB9XG4gIGlmIChjb3VudCA+IFBPSU5UX1RPX1BST0NFU1NfTElNSVQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBzdGVwcyA9IG5ldyBJbnQzMkFycmF5KFswLCB3aWR0aDEsIC0xLCAwLCAtd2lkdGgxLCAwLCAwLCAwLCAxXSk7XG4gIGNvbnN0IHBhdGggPSBuZXcgUGF0aDJEKCk7XG4gIGZvciAoaSA9IDA7IGNvdW50ICYmIGkgPD0gaGVpZ2h0OyBpKyspIHtcbiAgICBsZXQgcCA9IGkgKiB3aWR0aDE7XG4gICAgY29uc3QgZW5kID0gcCArIHdpZHRoO1xuICAgIHdoaWxlIChwIDwgZW5kICYmICFwb2ludHNbcF0pIHtcbiAgICAgIHArKztcbiAgICB9XG4gICAgaWYgKHAgPT09IGVuZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHBhdGgubW92ZVRvKHAgJSB3aWR0aDEsIGkpO1xuICAgIGNvbnN0IHAwID0gcDtcbiAgICBsZXQgdHlwZSA9IHBvaW50c1twXTtcbiAgICBkbyB7XG4gICAgICBjb25zdCBzdGVwID0gc3RlcHNbdHlwZV07XG4gICAgICBkbyB7XG4gICAgICAgIHAgKz0gc3RlcDtcbiAgICAgIH0gd2hpbGUgKCFwb2ludHNbcF0pO1xuICAgICAgY29uc3QgcHAgPSBwb2ludHNbcF07XG4gICAgICBpZiAocHAgIT09IDUgJiYgcHAgIT09IDEwKSB7XG4gICAgICAgIHR5cGUgPSBwcDtcbiAgICAgICAgcG9pbnRzW3BdID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSBwcCAmIDB4MzMgKiB0eXBlID4+IDQ7XG4gICAgICAgIHBvaW50c1twXSAmPSB0eXBlID4+IDIgfCB0eXBlIDw8IDI7XG4gICAgICB9XG4gICAgICBwYXRoLmxpbmVUbyhwICUgd2lkdGgxLCBwIC8gd2lkdGgxIHwgMCk7XG4gICAgICBpZiAoIXBvaW50c1twXSkge1xuICAgICAgICAtLWNvdW50O1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHAwICE9PSBwKTtcbiAgICAtLWk7XG4gIH1cbiAgZGF0YSA9IG51bGw7XG4gIHBvaW50cyA9IG51bGw7XG4gIGNvbnN0IGRyYXdPdXRsaW5lID0gZnVuY3Rpb24gKGMpIHtcbiAgICBjLnNhdmUoKTtcbiAgICBjLnNjYWxlKDEgLyB3aWR0aCwgLTEgLyBoZWlnaHQpO1xuICAgIGMudHJhbnNsYXRlKDAsIC1oZWlnaHQpO1xuICAgIGMuZmlsbChwYXRoKTtcbiAgICBjLmJlZ2luUGF0aCgpO1xuICAgIGMucmVzdG9yZSgpO1xuICB9O1xuICByZXR1cm4gZHJhd091dGxpbmU7XG59XG5jbGFzcyBDYW52YXNFeHRyYVN0YXRlIHtcbiAgY29uc3RydWN0b3Iod2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMuYWxwaGFJc1NoYXBlID0gZmFsc2U7XG4gICAgdGhpcy5mb250U2l6ZSA9IDA7XG4gICAgdGhpcy5mb250U2l6ZVNjYWxlID0gMTtcbiAgICB0aGlzLnRleHRNYXRyaXggPSBJREVOVElUWV9NQVRSSVg7XG4gICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgIHRoaXMuZm9udE1hdHJpeCA9IEZPTlRfSURFTlRJVFlfTUFUUklYO1xuICAgIHRoaXMubGVhZGluZyA9IDA7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICAgIHRoaXMubGluZVggPSAwO1xuICAgIHRoaXMubGluZVkgPSAwO1xuICAgIHRoaXMuY2hhclNwYWNpbmcgPSAwO1xuICAgIHRoaXMud29yZFNwYWNpbmcgPSAwO1xuICAgIHRoaXMudGV4dEhTY2FsZSA9IDE7XG4gICAgdGhpcy50ZXh0UmVuZGVyaW5nTW9kZSA9IFRleHRSZW5kZXJpbmdNb2RlLkZJTEw7XG4gICAgdGhpcy50ZXh0UmlzZSA9IDA7XG4gICAgdGhpcy5maWxsQ29sb3IgPSBcIiMwMDAwMDBcIjtcbiAgICB0aGlzLnN0cm9rZUNvbG9yID0gXCIjMDAwMDAwXCI7XG4gICAgdGhpcy5wYXR0ZXJuRmlsbCA9IGZhbHNlO1xuICAgIHRoaXMuZmlsbEFscGhhID0gMTtcbiAgICB0aGlzLnN0cm9rZUFscGhhID0gMTtcbiAgICB0aGlzLmxpbmVXaWR0aCA9IDE7XG4gICAgdGhpcy5hY3RpdmVTTWFzayA9IG51bGw7XG4gICAgdGhpcy50cmFuc2Zlck1hcHMgPSBcIm5vbmVcIjtcbiAgICB0aGlzLnN0YXJ0TmV3UGF0aEFuZENsaXBCb3goWzAsIDAsIHdpZHRoLCBoZWlnaHRdKTtcbiAgfVxuICBjbG9uZSgpIHtcbiAgICBjb25zdCBjbG9uZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgY2xvbmUuY2xpcEJveCA9IHRoaXMuY2xpcEJveC5zbGljZSgpO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuICBzZXRDdXJyZW50UG9pbnQoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxuICB1cGRhdGVQYXRoTWluTWF4KHRyYW5zZm9ybSwgeCwgeSkge1xuICAgIFt4LCB5XSA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3gsIHldLCB0cmFuc2Zvcm0pO1xuICAgIHRoaXMubWluWCA9IE1hdGgubWluKHRoaXMubWluWCwgeCk7XG4gICAgdGhpcy5taW5ZID0gTWF0aC5taW4odGhpcy5taW5ZLCB5KTtcbiAgICB0aGlzLm1heFggPSBNYXRoLm1heCh0aGlzLm1heFgsIHgpO1xuICAgIHRoaXMubWF4WSA9IE1hdGgubWF4KHRoaXMubWF4WSwgeSk7XG4gIH1cbiAgdXBkYXRlUmVjdE1pbk1heCh0cmFuc2Zvcm0sIHJlY3QpIHtcbiAgICBjb25zdCBwMSA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0ocmVjdCwgdHJhbnNmb3JtKTtcbiAgICBjb25zdCBwMiA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0ocmVjdC5zbGljZSgyKSwgdHJhbnNmb3JtKTtcbiAgICBjb25zdCBwMyA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JlY3RbMF0sIHJlY3RbM11dLCB0cmFuc2Zvcm0pO1xuICAgIGNvbnN0IHA0ID0gVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFsyXSwgcmVjdFsxXV0sIHRyYW5zZm9ybSk7XG4gICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSk7XG4gICAgdGhpcy5taW5ZID0gTWF0aC5taW4odGhpcy5taW5ZLCBwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSk7XG4gICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCBwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSk7XG4gICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSk7XG4gIH1cbiAgdXBkYXRlU2NhbGluZ1BhdGhNaW5NYXgodHJhbnNmb3JtLCBtaW5NYXgpIHtcbiAgICBVdGlsLnNjYWxlTWluTWF4KHRyYW5zZm9ybSwgbWluTWF4KTtcbiAgICB0aGlzLm1pblggPSBNYXRoLm1pbih0aGlzLm1pblgsIG1pbk1heFswXSk7XG4gICAgdGhpcy5taW5ZID0gTWF0aC5taW4odGhpcy5taW5ZLCBtaW5NYXhbMV0pO1xuICAgIHRoaXMubWF4WCA9IE1hdGgubWF4KHRoaXMubWF4WCwgbWluTWF4WzJdKTtcbiAgICB0aGlzLm1heFkgPSBNYXRoLm1heCh0aGlzLm1heFksIG1pbk1heFszXSk7XG4gIH1cbiAgdXBkYXRlQ3VydmVQYXRoTWluTWF4KHRyYW5zZm9ybSwgeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCBtaW5NYXgpIHtcbiAgICBjb25zdCBib3ggPSBVdGlsLmJlemllckJvdW5kaW5nQm94KHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgbWluTWF4KTtcbiAgICBpZiAobWluTWF4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXBkYXRlUmVjdE1pbk1heCh0cmFuc2Zvcm0sIGJveCk7XG4gIH1cbiAgZ2V0UGF0aEJvdW5kaW5nQm94KHBhdGhUeXBlID0gUGF0aFR5cGUuRklMTCwgdHJhbnNmb3JtID0gbnVsbCkge1xuICAgIGNvbnN0IGJveCA9IFt0aGlzLm1pblgsIHRoaXMubWluWSwgdGhpcy5tYXhYLCB0aGlzLm1heFldO1xuICAgIGlmIChwYXRoVHlwZSA9PT0gUGF0aFR5cGUuU1RST0tFKSB7XG4gICAgICBpZiAoIXRyYW5zZm9ybSkge1xuICAgICAgICB1bnJlYWNoYWJsZShcIlN0cm9rZSBib3VuZGluZyBib3ggbXVzdCBpbmNsdWRlIHRyYW5zZm9ybS5cIik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY2FsZSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodHJhbnNmb3JtKTtcbiAgICAgIGNvbnN0IHhTdHJva2VQYWQgPSBzY2FsZVswXSAqIHRoaXMubGluZVdpZHRoIC8gMjtcbiAgICAgIGNvbnN0IHlTdHJva2VQYWQgPSBzY2FsZVsxXSAqIHRoaXMubGluZVdpZHRoIC8gMjtcbiAgICAgIGJveFswXSAtPSB4U3Ryb2tlUGFkO1xuICAgICAgYm94WzFdIC09IHlTdHJva2VQYWQ7XG4gICAgICBib3hbMl0gKz0geFN0cm9rZVBhZDtcbiAgICAgIGJveFszXSArPSB5U3Ryb2tlUGFkO1xuICAgIH1cbiAgICByZXR1cm4gYm94O1xuICB9XG4gIHVwZGF0ZUNsaXBGcm9tUGF0aCgpIHtcbiAgICBjb25zdCBpbnRlcnNlY3QgPSBVdGlsLmludGVyc2VjdCh0aGlzLmNsaXBCb3gsIHRoaXMuZ2V0UGF0aEJvdW5kaW5nQm94KCkpO1xuICAgIHRoaXMuc3RhcnROZXdQYXRoQW5kQ2xpcEJveChpbnRlcnNlY3QgfHwgWzAsIDAsIDAsIDBdKTtcbiAgfVxuICBpc0VtcHR5Q2xpcCgpIHtcbiAgICByZXR1cm4gdGhpcy5taW5YID09PSBJbmZpbml0eTtcbiAgfVxuICBzdGFydE5ld1BhdGhBbmRDbGlwQm94KGJveCkge1xuICAgIHRoaXMuY2xpcEJveCA9IGJveDtcbiAgICB0aGlzLm1pblggPSBJbmZpbml0eTtcbiAgICB0aGlzLm1pblkgPSBJbmZpbml0eTtcbiAgICB0aGlzLm1heFggPSAwO1xuICAgIHRoaXMubWF4WSA9IDA7XG4gIH1cbiAgZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveChwYXRoVHlwZSA9IFBhdGhUeXBlLkZJTEwsIHRyYW5zZm9ybSA9IG51bGwpIHtcbiAgICByZXR1cm4gVXRpbC5pbnRlcnNlY3QodGhpcy5jbGlwQm94LCB0aGlzLmdldFBhdGhCb3VuZGluZ0JveChwYXRoVHlwZSwgdHJhbnNmb3JtKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1dEJpbmFyeUltYWdlRGF0YShjdHgsIGltZ0RhdGEpIHtcbiAgaWYgKHR5cGVvZiBJbWFnZURhdGEgIT09IFwidW5kZWZpbmVkXCIgJiYgaW1nRGF0YSBpbnN0YW5jZW9mIEltYWdlRGF0YSkge1xuICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nRGF0YSwgMCwgMCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0LFxuICAgIHdpZHRoID0gaW1nRGF0YS53aWR0aDtcbiAgY29uc3QgcGFydGlhbENodW5rSGVpZ2h0ID0gaGVpZ2h0ICUgRlVMTF9DSFVOS19IRUlHSFQ7XG4gIGNvbnN0IGZ1bGxDaHVua3MgPSAoaGVpZ2h0IC0gcGFydGlhbENodW5rSGVpZ2h0KSAvIEZVTExfQ0hVTktfSEVJR0hUO1xuICBjb25zdCB0b3RhbENodW5rcyA9IHBhcnRpYWxDaHVua0hlaWdodCA9PT0gMCA/IGZ1bGxDaHVua3MgOiBmdWxsQ2h1bmtzICsgMTtcbiAgY29uc3QgY2h1bmtJbWdEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgRlVMTF9DSFVOS19IRUlHSFQpO1xuICBsZXQgc3JjUG9zID0gMCxcbiAgICBkZXN0UG9zO1xuICBjb25zdCBzcmMgPSBpbWdEYXRhLmRhdGE7XG4gIGNvbnN0IGRlc3QgPSBjaHVua0ltZ0RhdGEuZGF0YTtcbiAgbGV0IGksIGosIHRoaXNDaHVua0hlaWdodCwgZWxlbXNJblRoaXNDaHVuaztcbiAgaWYgKGltZ0RhdGEua2luZCA9PT0gdXRpbF9JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFApIHtcbiAgICBjb25zdCBzcmNMZW5ndGggPSBzcmMuYnl0ZUxlbmd0aDtcbiAgICBjb25zdCBkZXN0MzIgPSBuZXcgVWludDMyQXJyYXkoZGVzdC5idWZmZXIsIDAsIGRlc3QuYnl0ZUxlbmd0aCA+PiAyKTtcbiAgICBjb25zdCBkZXN0MzJEYXRhTGVuZ3RoID0gZGVzdDMyLmxlbmd0aDtcbiAgICBjb25zdCBmdWxsU3JjRGlmZiA9IHdpZHRoICsgNyA+PiAzO1xuICAgIGNvbnN0IHdoaXRlID0gMHhmZmZmZmZmZjtcbiAgICBjb25zdCBibGFjayA9IHV0aWxfRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweGZmMDAwMDAwIDogMHgwMDAwMDBmZjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykge1xuICAgICAgdGhpc0NodW5rSGVpZ2h0ID0gaSA8IGZ1bGxDaHVua3MgPyBGVUxMX0NIVU5LX0hFSUdIVCA6IHBhcnRpYWxDaHVua0hlaWdodDtcbiAgICAgIGRlc3RQb3MgPSAwO1xuICAgICAgZm9yIChqID0gMDsgaiA8IHRoaXNDaHVua0hlaWdodDsgaisrKSB7XG4gICAgICAgIGNvbnN0IHNyY0RpZmYgPSBzcmNMZW5ndGggLSBzcmNQb3M7XG4gICAgICAgIGxldCBrID0gMDtcbiAgICAgICAgY29uc3Qga0VuZCA9IHNyY0RpZmYgPiBmdWxsU3JjRGlmZiA/IHdpZHRoIDogc3JjRGlmZiAqIDggLSA3O1xuICAgICAgICBjb25zdCBrRW5kVW5yb2xsZWQgPSBrRW5kICYgfjc7XG4gICAgICAgIGxldCBtYXNrID0gMDtcbiAgICAgICAgbGV0IHNyY0J5dGUgPSAwO1xuICAgICAgICBmb3IgKDsgayA8IGtFbmRVbnJvbGxlZDsgayArPSA4KSB7XG4gICAgICAgICAgc3JjQnl0ZSA9IHNyY1tzcmNQb3MrK107XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMTI4ID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiA2NCA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMzIgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDE2ID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiA4ID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiA0ID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAyID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgayA8IGtFbmQ7IGsrKykge1xuICAgICAgICAgIGlmIChtYXNrID09PSAwKSB7XG4gICAgICAgICAgICBzcmNCeXRlID0gc3JjW3NyY1BvcysrXTtcbiAgICAgICAgICAgIG1hc2sgPSAxMjg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIG1hc2sgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIG1hc2sgPj49IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChkZXN0UG9zIDwgZGVzdDMyRGF0YUxlbmd0aCkge1xuICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IDA7XG4gICAgICB9XG4gICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaW1nRGF0YS5raW5kID09PSB1dGlsX0ltYWdlS2luZC5SR0JBXzMyQlBQKSB7XG4gICAgaiA9IDA7XG4gICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogRlVMTF9DSFVOS19IRUlHSFQgKiA0O1xuICAgIGZvciAoaSA9IDA7IGkgPCBmdWxsQ2h1bmtzOyBpKyspIHtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNQb3MsIHNyY1BvcyArIGVsZW1zSW5UaGlzQ2h1bmspKTtcbiAgICAgIHNyY1BvcyArPSBlbGVtc0luVGhpc0NodW5rO1xuICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGopO1xuICAgICAgaiArPSBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgICB9XG4gICAgaWYgKGkgPCB0b3RhbENodW5rcykge1xuICAgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogcGFydGlhbENodW5rSGVpZ2h0ICogNDtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNQb3MsIHNyY1BvcyArIGVsZW1zSW5UaGlzQ2h1bmspKTtcbiAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBqKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaW1nRGF0YS5raW5kID09PSB1dGlsX0ltYWdlS2luZC5SR0JfMjRCUFApIHtcbiAgICB0aGlzQ2h1bmtIZWlnaHQgPSBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiB0aGlzQ2h1bmtIZWlnaHQ7XG4gICAgZm9yIChpID0gMDsgaSA8IHRvdGFsQ2h1bmtzOyBpKyspIHtcbiAgICAgIGlmIChpID49IGZ1bGxDaHVua3MpIHtcbiAgICAgICAgdGhpc0NodW5rSGVpZ2h0ID0gcGFydGlhbENodW5rSGVpZ2h0O1xuICAgICAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiB0aGlzQ2h1bmtIZWlnaHQ7XG4gICAgICB9XG4gICAgICBkZXN0UG9zID0gMDtcbiAgICAgIGZvciAoaiA9IGVsZW1zSW5UaGlzQ2h1bms7IGotLTspIHtcbiAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW3NyY1BvcysrXTtcbiAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW3NyY1BvcysrXTtcbiAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW3NyY1BvcysrXTtcbiAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gMjU1O1xuICAgICAgfVxuICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGkgKiBGVUxMX0NIVU5LX0hFSUdIVCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgYmFkIGltYWdlIGtpbmQ6ICR7aW1nRGF0YS5raW5kfWApO1xuICB9XG59XG5mdW5jdGlvbiBwdXRCaW5hcnlJbWFnZU1hc2soY3R4LCBpbWdEYXRhKSB7XG4gIGlmIChpbWdEYXRhLmJpdG1hcCkge1xuICAgIGN0eC5kcmF3SW1hZ2UoaW1nRGF0YS5iaXRtYXAsIDAsIDApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodCxcbiAgICB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG4gIGNvbnN0IHBhcnRpYWxDaHVua0hlaWdodCA9IGhlaWdodCAlIEZVTExfQ0hVTktfSEVJR0hUO1xuICBjb25zdCBmdWxsQ2h1bmtzID0gKGhlaWdodCAtIHBhcnRpYWxDaHVua0hlaWdodCkgLyBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgY29uc3QgdG90YWxDaHVua3MgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQgPT09IDAgPyBmdWxsQ2h1bmtzIDogZnVsbENodW5rcyArIDE7XG4gIGNvbnN0IGNodW5rSW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgbGV0IHNyY1BvcyA9IDA7XG4gIGNvbnN0IHNyYyA9IGltZ0RhdGEuZGF0YTtcbiAgY29uc3QgZGVzdCA9IGNodW5rSW1nRGF0YS5kYXRhO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsQ2h1bmtzOyBpKyspIHtcbiAgICBjb25zdCB0aGlzQ2h1bmtIZWlnaHQgPSBpIDwgZnVsbENodW5rcyA/IEZVTExfQ0hVTktfSEVJR0hUIDogcGFydGlhbENodW5rSGVpZ2h0O1xuICAgICh7XG4gICAgICBzcmNQb3NcbiAgICB9ID0gY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEoe1xuICAgICAgc3JjLFxuICAgICAgc3JjUG9zLFxuICAgICAgZGVzdCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzQ2h1bmtIZWlnaHQsXG4gICAgICBub25CbGFja0NvbG9yOiAwXG4gICAgfSkpO1xuICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpO1xuICB9XG59XG5mdW5jdGlvbiBjb3B5Q3R4U3RhdGUoc291cmNlQ3R4LCBkZXN0Q3R4KSB7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBbXCJzdHJva2VTdHlsZVwiLCBcImZpbGxTdHlsZVwiLCBcImZpbGxSdWxlXCIsIFwiZ2xvYmFsQWxwaGFcIiwgXCJsaW5lV2lkdGhcIiwgXCJsaW5lQ2FwXCIsIFwibGluZUpvaW5cIiwgXCJtaXRlckxpbWl0XCIsIFwiZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uXCIsIFwiZm9udFwiLCBcImZpbHRlclwiXTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHNvdXJjZUN0eFtwcm9wZXJ0eV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdEN0eFtwcm9wZXJ0eV0gPSBzb3VyY2VDdHhbcHJvcGVydHldO1xuICAgIH1cbiAgfVxuICBpZiAoc291cmNlQ3R4LnNldExpbmVEYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZXN0Q3R4LnNldExpbmVEYXNoKHNvdXJjZUN0eC5nZXRMaW5lRGFzaCgpKTtcbiAgICBkZXN0Q3R4LmxpbmVEYXNoT2Zmc2V0ID0gc291cmNlQ3R4LmxpbmVEYXNoT2Zmc2V0O1xuICB9XG59XG5mdW5jdGlvbiByZXNldEN0eFRvRGVmYXVsdChjdHgpIHtcbiAgY3R4LnN0cm9rZVN0eWxlID0gY3R4LmZpbGxTdHlsZSA9IFwiIzAwMDAwMFwiO1xuICBjdHguZmlsbFJ1bGUgPSBcIm5vbnplcm9cIjtcbiAgY3R4Lmdsb2JhbEFscGhhID0gMTtcbiAgY3R4LmxpbmVXaWR0aCA9IDE7XG4gIGN0eC5saW5lQ2FwID0gXCJidXR0XCI7XG4gIGN0eC5saW5lSm9pbiA9IFwibWl0ZXJcIjtcbiAgY3R4Lm1pdGVyTGltaXQgPSAxMDtcbiAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcbiAgY3R4LmZvbnQgPSBcIjEwcHggc2Fucy1zZXJpZlwiO1xuICBpZiAoY3R4LnNldExpbmVEYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICBjdHguc2V0TGluZURhc2goW10pO1xuICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IDA7XG4gIH1cbiAgaWYgKCFpc05vZGVKUykge1xuICAgIGNvbnN0IHtcbiAgICAgIGZpbHRlclxuICAgIH0gPSBjdHg7XG4gICAgaWYgKGZpbHRlciAhPT0gXCJub25lXCIgJiYgZmlsdGVyICE9PSBcIlwiKSB7XG4gICAgICBjdHguZmlsdGVyID0gXCJub25lXCI7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQodHJhbnNmb3JtLCBpbnRlcnBvbGF0ZSkge1xuICBpZiAoaW50ZXJwb2xhdGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBzY2FsZSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodHJhbnNmb3JtKTtcbiAgc2NhbGVbMF0gPSBNYXRoLmZyb3VuZChzY2FsZVswXSk7XG4gIHNjYWxlWzFdID0gTWF0aC5mcm91bmQoc2NhbGVbMV0pO1xuICBjb25zdCBhY3R1YWxTY2FsZSA9IE1hdGguZnJvdW5kKChnbG9iYWxUaGlzLmRldmljZVBpeGVsUmF0aW8gfHwgMSkgKiBQaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFMpO1xuICByZXR1cm4gc2NhbGVbMF0gPD0gYWN0dWFsU2NhbGUgJiYgc2NhbGVbMV0gPD0gYWN0dWFsU2NhbGU7XG59XG5jb25zdCBMSU5FX0NBUF9TVFlMRVMgPSBbXCJidXR0XCIsIFwicm91bmRcIiwgXCJzcXVhcmVcIl07XG5jb25zdCBMSU5FX0pPSU5fU1RZTEVTID0gW1wibWl0ZXJcIiwgXCJyb3VuZFwiLCBcImJldmVsXCJdO1xuY29uc3QgTk9STUFMX0NMSVAgPSB7fTtcbmNvbnN0IEVPX0NMSVAgPSB7fTtcbmNsYXNzIENhbnZhc0dyYXBoaWNzIHtcbiAgY29uc3RydWN0b3IoY2FudmFzQ3R4LCBjb21tb25PYmpzLCBvYmpzLCBjYW52YXNGYWN0b3J5LCBmaWx0ZXJGYWN0b3J5LCB7XG4gICAgb3B0aW9uYWxDb250ZW50Q29uZmlnLFxuICAgIG1hcmtlZENvbnRlbnRTdGFjayA9IG51bGxcbiAgfSwgYW5ub3RhdGlvbkNhbnZhc01hcCwgcGFnZUNvbG9ycykge1xuICAgIHRoaXMuY3R4ID0gY2FudmFzQ3R4O1xuICAgIHRoaXMuY3VycmVudCA9IG5ldyBDYW52YXNFeHRyYVN0YXRlKHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5zdGF0ZVN0YWNrID0gW107XG4gICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gZmFsc2U7XG4gICAgdGhpcy5yZXMgPSBudWxsO1xuICAgIHRoaXMueG9ianMgPSBudWxsO1xuICAgIHRoaXMuY29tbW9uT2JqcyA9IGNvbW1vbk9ianM7XG4gICAgdGhpcy5vYmpzID0gb2JqcztcbiAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBjYW52YXNGYWN0b3J5O1xuICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IGZpbHRlckZhY3Rvcnk7XG4gICAgdGhpcy5ncm91cFN0YWNrID0gW107XG4gICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBudWxsO1xuICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IG51bGw7XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sgPSBbXTtcbiAgICB0aGlzLmdyb3VwTGV2ZWwgPSAwO1xuICAgIHRoaXMuc21hc2tTdGFjayA9IFtdO1xuICAgIHRoaXMuc21hc2tDb3VudGVyID0gMDtcbiAgICB0aGlzLnRlbXBTTWFzayA9IG51bGw7XG4gICAgdGhpcy5zdXNwZW5kZWRDdHggPSBudWxsO1xuICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0cnVlO1xuICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrID0gbWFya2VkQ29udGVudFN0YWNrIHx8IFtdO1xuICAgIHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnID0gb3B0aW9uYWxDb250ZW50Q29uZmlnO1xuICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMgPSBuZXcgQ2FjaGVkQ2FudmFzZXModGhpcy5jYW52YXNGYWN0b3J5KTtcbiAgICB0aGlzLmNhY2hlZFBhdHRlcm5zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCA9IGFubm90YXRpb25DYW52YXNNYXA7XG4gICAgdGhpcy52aWV3cG9ydFNjYWxlID0gMTtcbiAgICB0aGlzLm91dHB1dFNjYWxlWCA9IDE7XG4gICAgdGhpcy5vdXRwdXRTY2FsZVkgPSAxO1xuICAgIHRoaXMucGFnZUNvbG9ycyA9IHBhZ2VDb2xvcnM7XG4gICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZyA9IFstMSwgMF07XG4gICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7XG4gICAgdGhpcy5fY2FjaGVkQml0bWFwc01hcCA9IG5ldyBNYXAoKTtcbiAgfVxuICBnZXRPYmplY3QoZGF0YSwgZmFsbGJhY2sgPSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZGF0YS5zdGFydHNXaXRoKFwiZ19cIikgPyB0aGlzLmNvbW1vbk9ianMuZ2V0KGRhdGEpIDogdGhpcy5vYmpzLmdldChkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbGxiYWNrO1xuICB9XG4gIGJlZ2luRHJhd2luZyh7XG4gICAgdHJhbnNmb3JtLFxuICAgIHZpZXdwb3J0LFxuICAgIHRyYW5zcGFyZW5jeSA9IGZhbHNlLFxuICAgIGJhY2tncm91bmQgPSBudWxsXG4gIH0pIHtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuY3R4LmNhbnZhcy53aWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0O1xuICAgIGNvbnN0IHNhdmVkRmlsbFN0eWxlID0gdGhpcy5jdHguZmlsbFN0eWxlO1xuICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmQgfHwgXCIjZmZmZmZmXCI7XG4gICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gc2F2ZWRGaWxsU3R5bGU7XG4gICAgaWYgKHRyYW5zcGFyZW5jeSkge1xuICAgICAgY29uc3QgdHJhbnNwYXJlbnRDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcInRyYW5zcGFyZW50XCIsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5jb21wb3NpdGVDdHggPSB0aGlzLmN0eDtcbiAgICAgIHRoaXMudHJhbnNwYXJlbnRDYW52YXMgPSB0cmFuc3BhcmVudENhbnZhcy5jYW52YXM7XG4gICAgICB0aGlzLmN0eCA9IHRyYW5zcGFyZW50Q2FudmFzLmNvbnRleHQ7XG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oLi4uZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLmNvbXBvc2l0ZUN0eCkpO1xuICAgIH1cbiAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi50cmFuc2Zvcm0pO1xuICAgICAgdGhpcy5vdXRwdXRTY2FsZVggPSB0cmFuc2Zvcm1bMF07XG4gICAgICB0aGlzLm91dHB1dFNjYWxlWSA9IHRyYW5zZm9ybVswXTtcbiAgICB9XG4gICAgdGhpcy5jdHgudHJhbnNmb3JtKC4uLnZpZXdwb3J0LnRyYW5zZm9ybSk7XG4gICAgdGhpcy52aWV3cG9ydFNjYWxlID0gdmlld3BvcnQuc2NhbGU7XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLmN0eCk7XG4gIH1cbiAgZXhlY3V0ZU9wZXJhdG9yTGlzdChvcGVyYXRvckxpc3QsIGV4ZWN1dGlvblN0YXJ0SWR4LCBjb250aW51ZUNhbGxiYWNrLCBzdGVwcGVyKSB7XG4gICAgY29uc3QgYXJnc0FycmF5ID0gb3BlcmF0b3JMaXN0LmFyZ3NBcnJheTtcbiAgICBjb25zdCBmbkFycmF5ID0gb3BlcmF0b3JMaXN0LmZuQXJyYXk7XG4gICAgbGV0IGkgPSBleGVjdXRpb25TdGFydElkeCB8fCAwO1xuICAgIGNvbnN0IGFyZ3NBcnJheUxlbiA9IGFyZ3NBcnJheS5sZW5ndGg7XG4gICAgaWYgKGFyZ3NBcnJheUxlbiA9PT0gaSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rT3BlcmF0aW9ucyA9IGFyZ3NBcnJheUxlbiAtIGkgPiBFWEVDVVRJT05fU1RFUFMgJiYgdHlwZW9mIGNvbnRpbnVlQ2FsbGJhY2sgPT09IFwiZnVuY3Rpb25cIjtcbiAgICBjb25zdCBlbmRUaW1lID0gY2h1bmtPcGVyYXRpb25zID8gRGF0ZS5ub3coKSArIEVYRUNVVElPTl9USU1FIDogMDtcbiAgICBsZXQgc3RlcHMgPSAwO1xuICAgIGNvbnN0IGNvbW1vbk9ianMgPSB0aGlzLmNvbW1vbk9ianM7XG4gICAgY29uc3Qgb2JqcyA9IHRoaXMub2JqcztcbiAgICBsZXQgZm5JZDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHN0ZXBwZXIgIT09IHVuZGVmaW5lZCAmJiBpID09PSBzdGVwcGVyLm5leHRCcmVha1BvaW50KSB7XG4gICAgICAgIHN0ZXBwZXIuYnJlYWtJdChpLCBjb250aW51ZUNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgICBmbklkID0gZm5BcnJheVtpXTtcbiAgICAgIGlmIChmbklkICE9PSBPUFMuZGVwZW5kZW5jeSkge1xuICAgICAgICB0aGlzW2ZuSWRdLmFwcGx5KHRoaXMsIGFyZ3NBcnJheVtpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGRlcE9iaklkIG9mIGFyZ3NBcnJheVtpXSkge1xuICAgICAgICAgIGNvbnN0IG9ianNQb29sID0gZGVwT2JqSWQuc3RhcnRzV2l0aChcImdfXCIpID8gY29tbW9uT2JqcyA6IG9ianM7XG4gICAgICAgICAgaWYgKCFvYmpzUG9vbC5oYXMoZGVwT2JqSWQpKSB7XG4gICAgICAgICAgICBvYmpzUG9vbC5nZXQoZGVwT2JqSWQsIGNvbnRpbnVlQ2FsbGJhY2spO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgICBpZiAoaSA9PT0gYXJnc0FycmF5TGVuKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgICAgaWYgKGNodW5rT3BlcmF0aW9ucyAmJiArK3N0ZXBzID4gRVhFQ1VUSU9OX1NURVBTKSB7XG4gICAgICAgIGlmIChEYXRlLm5vdygpID4gZW5kVGltZSkge1xuICAgICAgICAgIGNvbnRpbnVlQ2FsbGJhY2soKTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwcyA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG4gICNyZXN0b3JlSW5pdGlhbFN0YXRlKCkge1xuICAgIHdoaWxlICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoIHx8IHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgIH1cbiAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgaWYgKHRoaXMudHJhbnNwYXJlbnRDYW52YXMpIHtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5jb21wb3NpdGVDdHg7XG4gICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy50cmFuc3BhcmVudENhbnZhcywgMCwgMCk7XG4gICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgZW5kRHJhd2luZygpIHtcbiAgICB0aGlzLiNyZXN0b3JlSW5pdGlhbFN0YXRlKCk7XG4gICAgdGhpcy5jYWNoZWRDYW52YXNlcy5jbGVhcigpO1xuICAgIHRoaXMuY2FjaGVkUGF0dGVybnMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGNhY2hlIG9mIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAudmFsdWVzKCkpIHtcbiAgICAgIGZvciAoY29uc3QgY2FudmFzIG9mIGNhY2hlLnZhbHVlcygpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgY2FudmFzIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHtcbiAgICAgICAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5fY2FjaGVkQml0bWFwc01hcC5jbGVhcigpO1xuICAgIHRoaXMuI2RyYXdGaWx0ZXIoKTtcbiAgfVxuICAjZHJhd0ZpbHRlcigpIHtcbiAgICBpZiAodGhpcy5wYWdlQ29sb3JzKSB7XG4gICAgICBjb25zdCBoY21GaWx0ZXJJZCA9IHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRIQ01GaWx0ZXIodGhpcy5wYWdlQ29sb3JzLmZvcmVncm91bmQsIHRoaXMucGFnZUNvbG9ycy5iYWNrZ3JvdW5kKTtcbiAgICAgIGlmIChoY21GaWx0ZXJJZCAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWRGaWx0ZXIgPSB0aGlzLmN0eC5maWx0ZXI7XG4gICAgICAgIHRoaXMuY3R4LmZpbHRlciA9IGhjbUZpbHRlcklkO1xuICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy5jdHguY2FudmFzLCAwLCAwKTtcbiAgICAgICAgdGhpcy5jdHguZmlsdGVyID0gc2F2ZWRGaWx0ZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9zY2FsZUltYWdlKGltZywgaW52ZXJzZVRyYW5zZm9ybSkge1xuICAgIGNvbnN0IHdpZHRoID0gaW1nLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgbGV0IHdpZHRoU2NhbGUgPSBNYXRoLm1heChNYXRoLmh5cG90KGludmVyc2VUcmFuc2Zvcm1bMF0sIGludmVyc2VUcmFuc2Zvcm1bMV0pLCAxKTtcbiAgICBsZXQgaGVpZ2h0U2NhbGUgPSBNYXRoLm1heChNYXRoLmh5cG90KGludmVyc2VUcmFuc2Zvcm1bMl0sIGludmVyc2VUcmFuc2Zvcm1bM10pLCAxKTtcbiAgICBsZXQgcGFpbnRXaWR0aCA9IHdpZHRoLFxuICAgICAgcGFpbnRIZWlnaHQgPSBoZWlnaHQ7XG4gICAgbGV0IHRtcENhbnZhc0lkID0gXCJwcmVzY2FsZTFcIjtcbiAgICBsZXQgdG1wQ2FudmFzLCB0bXBDdHg7XG4gICAgd2hpbGUgKHdpZHRoU2NhbGUgPiAyICYmIHBhaW50V2lkdGggPiAxIHx8IGhlaWdodFNjYWxlID4gMiAmJiBwYWludEhlaWdodCA+IDEpIHtcbiAgICAgIGxldCBuZXdXaWR0aCA9IHBhaW50V2lkdGgsXG4gICAgICAgIG5ld0hlaWdodCA9IHBhaW50SGVpZ2h0O1xuICAgICAgaWYgKHdpZHRoU2NhbGUgPiAyICYmIHBhaW50V2lkdGggPiAxKSB7XG4gICAgICAgIG5ld1dpZHRoID0gcGFpbnRXaWR0aCA+PSAxNjM4NCA/IE1hdGguZmxvb3IocGFpbnRXaWR0aCAvIDIpIC0gMSB8fCAxIDogTWF0aC5jZWlsKHBhaW50V2lkdGggLyAyKTtcbiAgICAgICAgd2lkdGhTY2FsZSAvPSBwYWludFdpZHRoIC8gbmV3V2lkdGg7XG4gICAgICB9XG4gICAgICBpZiAoaGVpZ2h0U2NhbGUgPiAyICYmIHBhaW50SGVpZ2h0ID4gMSkge1xuICAgICAgICBuZXdIZWlnaHQgPSBwYWludEhlaWdodCA+PSAxNjM4NCA/IE1hdGguZmxvb3IocGFpbnRIZWlnaHQgLyAyKSAtIDEgfHwgMSA6IE1hdGguY2VpbChwYWludEhlaWdodCkgLyAyO1xuICAgICAgICBoZWlnaHRTY2FsZSAvPSBwYWludEhlaWdodCAvIG5ld0hlaWdodDtcbiAgICAgIH1cbiAgICAgIHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKHRtcENhbnZhc0lkLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgdG1wQ3R4LmNsZWFyUmVjdCgwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgIHRtcEN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBwYWludFdpZHRoLCBwYWludEhlaWdodCwgMCwgMCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7XG4gICAgICBpbWcgPSB0bXBDYW52YXMuY2FudmFzO1xuICAgICAgcGFpbnRXaWR0aCA9IG5ld1dpZHRoO1xuICAgICAgcGFpbnRIZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICB0bXBDYW52YXNJZCA9IHRtcENhbnZhc0lkID09PSBcInByZXNjYWxlMVwiID8gXCJwcmVzY2FsZTJcIiA6IFwicHJlc2NhbGUxXCI7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBpbWcsXG4gICAgICBwYWludFdpZHRoLFxuICAgICAgcGFpbnRIZWlnaHRcbiAgICB9O1xuICB9XG4gIF9jcmVhdGVNYXNrQ2FudmFzKGltZykge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGltZztcbiAgICBjb25zdCBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgIGNvbnN0IGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7XG4gICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KTtcbiAgICBsZXQgY2FjaGUsIGNhY2hlS2V5LCBzY2FsZWQsIG1hc2tDYW52YXM7XG4gICAgaWYgKChpbWcuYml0bWFwIHx8IGltZy5kYXRhKSAmJiBpbWcuY291bnQgPiAxKSB7XG4gICAgICBjb25zdCBtYWluS2V5ID0gaW1nLmJpdG1hcCB8fCBpbWcuZGF0YS5idWZmZXI7XG4gICAgICBjYWNoZUtleSA9IEpTT04uc3RyaW5naWZ5KGlzUGF0dGVybkZpbGwgPyBjdXJyZW50VHJhbnNmb3JtIDogW2N1cnJlbnRUcmFuc2Zvcm0uc2xpY2UoMCwgNCksIGZpbGxDb2xvcl0pO1xuICAgICAgY2FjaGUgPSB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLmdldChtYWluS2V5KTtcbiAgICAgIGlmICghY2FjaGUpIHtcbiAgICAgICAgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAuc2V0KG1haW5LZXksIGNhY2hlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNhY2hlZEltYWdlID0gY2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmIChjYWNoZWRJbWFnZSAmJiAhaXNQYXR0ZXJuRmlsbCkge1xuICAgICAgICBjb25zdCBvZmZzZXRYID0gTWF0aC5yb3VuZChNYXRoLm1pbihjdXJyZW50VHJhbnNmb3JtWzBdLCBjdXJyZW50VHJhbnNmb3JtWzJdKSArIGN1cnJlbnRUcmFuc2Zvcm1bNF0pO1xuICAgICAgICBjb25zdCBvZmZzZXRZID0gTWF0aC5yb3VuZChNYXRoLm1pbihjdXJyZW50VHJhbnNmb3JtWzFdLCBjdXJyZW50VHJhbnNmb3JtWzNdKSArIGN1cnJlbnRUcmFuc2Zvcm1bNV0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNhbnZhczogY2FjaGVkSW1hZ2UsXG4gICAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgICBvZmZzZXRZXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBzY2FsZWQgPSBjYWNoZWRJbWFnZTtcbiAgICB9XG4gICAgaWYgKCFzY2FsZWQpIHtcbiAgICAgIG1hc2tDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcIm1hc2tDYW52YXNcIiwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBwdXRCaW5hcnlJbWFnZU1hc2sobWFza0NhbnZhcy5jb250ZXh0LCBpbWcpO1xuICAgIH1cbiAgICBsZXQgbWFza1RvQ2FudmFzID0gVXRpbC50cmFuc2Zvcm0oY3VycmVudFRyYW5zZm9ybSwgWzEgLyB3aWR0aCwgMCwgMCwgLTEgLyBoZWlnaHQsIDAsIDBdKTtcbiAgICBtYXNrVG9DYW52YXMgPSBVdGlsLnRyYW5zZm9ybShtYXNrVG9DYW52YXMsIFsxLCAwLCAwLCAxLCAwLCAtaGVpZ2h0XSk7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgd2lkdGgsIGhlaWdodF0sIG1hc2tUb0NhbnZhcyk7XG4gICAgY29uc3QgZHJhd25XaWR0aCA9IE1hdGgucm91bmQobWF4WCAtIG1pblgpIHx8IDE7XG4gICAgY29uc3QgZHJhd25IZWlnaHQgPSBNYXRoLnJvdW5kKG1heFkgLSBtaW5ZKSB8fCAxO1xuICAgIGNvbnN0IGZpbGxDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImZpbGxDYW52YXNcIiwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHQpO1xuICAgIGNvbnN0IGZpbGxDdHggPSBmaWxsQ2FudmFzLmNvbnRleHQ7XG4gICAgY29uc3Qgb2Zmc2V0WCA9IG1pblg7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IG1pblk7XG4gICAgZmlsbEN0eC50cmFuc2xhdGUoLW9mZnNldFgsIC1vZmZzZXRZKTtcbiAgICBmaWxsQ3R4LnRyYW5zZm9ybSguLi5tYXNrVG9DYW52YXMpO1xuICAgIGlmICghc2NhbGVkKSB7XG4gICAgICBzY2FsZWQgPSB0aGlzLl9zY2FsZUltYWdlKG1hc2tDYW52YXMuY2FudmFzLCBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShmaWxsQ3R4KSk7XG4gICAgICBzY2FsZWQgPSBzY2FsZWQuaW1nO1xuICAgICAgaWYgKGNhY2hlICYmIGlzUGF0dGVybkZpbGwpIHtcbiAgICAgICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBzY2FsZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBmaWxsQ3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGdldEltYWdlU21vb3RoaW5nRW5hYmxlZChnZXRDdXJyZW50VHJhbnNmb3JtKGZpbGxDdHgpLCBpbWcuaW50ZXJwb2xhdGUpO1xuICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhmaWxsQ3R4LCBzY2FsZWQsIDAsIDAsIHNjYWxlZC53aWR0aCwgc2NhbGVkLmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgZmlsbEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuICAgIGNvbnN0IGludmVyc2UgPSBVdGlsLnRyYW5zZm9ybShnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShmaWxsQ3R4KSwgWzEsIDAsIDAsIDEsIC1vZmZzZXRYLCAtb2Zmc2V0WV0pO1xuICAgIGZpbGxDdHguZmlsbFN0eWxlID0gaXNQYXR0ZXJuRmlsbCA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgaW52ZXJzZSwgUGF0aFR5cGUuRklMTCkgOiBmaWxsQ29sb3I7XG4gICAgZmlsbEN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAoY2FjaGUgJiYgIWlzUGF0dGVybkZpbGwpIHtcbiAgICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMuZGVsZXRlKFwiZmlsbENhbnZhc1wiKTtcbiAgICAgIGNhY2hlLnNldChjYWNoZUtleSwgZmlsbENhbnZhcy5jYW52YXMpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY2FudmFzOiBmaWxsQ2FudmFzLmNhbnZhcyxcbiAgICAgIG9mZnNldFg6IE1hdGgucm91bmQob2Zmc2V0WCksXG4gICAgICBvZmZzZXRZOiBNYXRoLnJvdW5kKG9mZnNldFkpXG4gICAgfTtcbiAgfVxuICBzZXRMaW5lV2lkdGgod2lkdGgpIHtcbiAgICBpZiAod2lkdGggIT09IHRoaXMuY3VycmVudC5saW5lV2lkdGgpIHtcbiAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPSAtMTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50LmxpbmVXaWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuY3R4LmxpbmVXaWR0aCA9IHdpZHRoO1xuICB9XG4gIHNldExpbmVDYXAoc3R5bGUpIHtcbiAgICB0aGlzLmN0eC5saW5lQ2FwID0gTElORV9DQVBfU1RZTEVTW3N0eWxlXTtcbiAgfVxuICBzZXRMaW5lSm9pbihzdHlsZSkge1xuICAgIHRoaXMuY3R4LmxpbmVKb2luID0gTElORV9KT0lOX1NUWUxFU1tzdHlsZV07XG4gIH1cbiAgc2V0TWl0ZXJMaW1pdChsaW1pdCkge1xuICAgIHRoaXMuY3R4Lm1pdGVyTGltaXQgPSBsaW1pdDtcbiAgfVxuICBzZXREYXNoKGRhc2hBcnJheSwgZGFzaFBoYXNlKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgaWYgKGN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjdHguc2V0TGluZURhc2goZGFzaEFycmF5KTtcbiAgICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IGRhc2hQaGFzZTtcbiAgICB9XG4gIH1cbiAgc2V0UmVuZGVyaW5nSW50ZW50KGludGVudCkge31cbiAgc2V0RmxhdG5lc3MoZmxhdG5lc3MpIHt9XG4gIHNldEdTdGF0ZShzdGF0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzdGF0ZXMpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgXCJMV1wiOlxuICAgICAgICAgIHRoaXMuc2V0TGluZVdpZHRoKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkxDXCI6XG4gICAgICAgICAgdGhpcy5zZXRMaW5lQ2FwKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkxKXCI6XG4gICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbih2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJNTFwiOlxuICAgICAgICAgIHRoaXMuc2V0TWl0ZXJMaW1pdCh2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgICAgdGhpcy5zZXREYXNoKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJSSVwiOlxuICAgICAgICAgIHRoaXMuc2V0UmVuZGVyaW5nSW50ZW50KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkZMXCI6XG4gICAgICAgICAgdGhpcy5zZXRGbGF0bmVzcyh2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJGb250XCI6XG4gICAgICAgICAgdGhpcy5zZXRGb250KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJDQVwiOlxuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VBbHBoYSA9IHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiY2FcIjpcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSB2YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkJNXCI6XG4gICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJTTWFza1wiOlxuICAgICAgICAgIHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayA9IHZhbHVlID8gdGhpcy50ZW1wU01hc2sgOiBudWxsO1xuICAgICAgICAgIHRoaXMudGVtcFNNYXNrID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNoZWNrU01hc2tTdGF0ZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiVFJcIjpcbiAgICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzID0gdGhpcy5maWx0ZXJGYWN0b3J5LmFkZEZpbHRlcih2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBpblNNYXNrTW9kZSgpIHtcbiAgICByZXR1cm4gISF0aGlzLnN1c3BlbmRlZEN0eDtcbiAgfVxuICBjaGVja1NNYXNrU3RhdGUoKSB7XG4gICAgY29uc3QgaW5TTWFza01vZGUgPSB0aGlzLmluU01hc2tNb2RlO1xuICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgJiYgIWluU01hc2tNb2RlKSB7XG4gICAgICB0aGlzLmJlZ2luU01hc2tNb2RlKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrICYmIGluU01hc2tNb2RlKSB7XG4gICAgICB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuICAgIH1cbiAgfVxuICBiZWdpblNNYXNrTW9kZSgpIHtcbiAgICBpZiAodGhpcy5pblNNYXNrTW9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmVnaW5TTWFza01vZGUgY2FsbGVkIHdoaWxlIGFscmVhZHkgaW4gc21hc2sgbW9kZVwiKTtcbiAgICB9XG4gICAgY29uc3QgZHJhd25XaWR0aCA9IHRoaXMuY3R4LmNhbnZhcy53aWR0aDtcbiAgICBjb25zdCBkcmF3bkhlaWdodCA9IHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQ7XG4gICAgY29uc3QgY2FjaGVJZCA9IFwic21hc2tHcm91cEF0XCIgKyB0aGlzLmdyb3VwTGV2ZWw7XG4gICAgY29uc3Qgc2NyYXRjaENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKGNhY2hlSWQsIGRyYXduV2lkdGgsIGRyYXduSGVpZ2h0KTtcbiAgICB0aGlzLnN1c3BlbmRlZEN0eCA9IHRoaXMuY3R4O1xuICAgIHRoaXMuY3R4ID0gc2NyYXRjaENhbnZhcy5jb250ZXh0O1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oLi4uZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLnN1c3BlbmRlZEN0eCkpO1xuICAgIGNvcHlDdHhTdGF0ZSh0aGlzLnN1c3BlbmRlZEN0eCwgY3R4KTtcbiAgICBtaXJyb3JDb250ZXh0T3BlcmF0aW9ucyhjdHgsIHRoaXMuc3VzcGVuZGVkQ3R4KTtcbiAgICB0aGlzLnNldEdTdGF0ZShbW1wiQk1cIiwgXCJzb3VyY2Utb3ZlclwiXSwgW1wiY2FcIiwgMV0sIFtcIkNBXCIsIDFdXSk7XG4gIH1cbiAgZW5kU01hc2tNb2RlKCkge1xuICAgIGlmICghdGhpcy5pblNNYXNrTW9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZW5kU01hc2tNb2RlIGNhbGxlZCB3aGlsZSBub3QgaW4gc21hc2sgbW9kZVwiKTtcbiAgICB9XG4gICAgdGhpcy5jdHguX3JlbW92ZU1pcnJvcmluZygpO1xuICAgIGNvcHlDdHhTdGF0ZSh0aGlzLmN0eCwgdGhpcy5zdXNwZW5kZWRDdHgpO1xuICAgIHRoaXMuY3R4ID0gdGhpcy5zdXNwZW5kZWRDdHg7XG4gICAgdGhpcy5zdXNwZW5kZWRDdHggPSBudWxsO1xuICB9XG4gIGNvbXBvc2UoZGlydHlCb3gpIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudC5hY3RpdmVTTWFzaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRpcnR5Qm94KSB7XG4gICAgICBkaXJ0eUJveCA9IFswLCAwLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXJ0eUJveFswXSA9IE1hdGguZmxvb3IoZGlydHlCb3hbMF0pO1xuICAgICAgZGlydHlCb3hbMV0gPSBNYXRoLmZsb29yKGRpcnR5Qm94WzFdKTtcbiAgICAgIGRpcnR5Qm94WzJdID0gTWF0aC5jZWlsKGRpcnR5Qm94WzJdKTtcbiAgICAgIGRpcnR5Qm94WzNdID0gTWF0aC5jZWlsKGRpcnR5Qm94WzNdKTtcbiAgICB9XG4gICAgY29uc3Qgc21hc2sgPSB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2s7XG4gICAgY29uc3Qgc3VzcGVuZGVkQ3R4ID0gdGhpcy5zdXNwZW5kZWRDdHg7XG4gICAgdGhpcy5jb21wb3NlU01hc2soc3VzcGVuZGVkQ3R4LCBzbWFzaywgdGhpcy5jdHgsIGRpcnR5Qm94KTtcbiAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgfVxuICBjb21wb3NlU01hc2soY3R4LCBzbWFzaywgbGF5ZXJDdHgsIGxheWVyQm94KSB7XG4gICAgY29uc3QgbGF5ZXJPZmZzZXRYID0gbGF5ZXJCb3hbMF07XG4gICAgY29uc3QgbGF5ZXJPZmZzZXRZID0gbGF5ZXJCb3hbMV07XG4gICAgY29uc3QgbGF5ZXJXaWR0aCA9IGxheWVyQm94WzJdIC0gbGF5ZXJPZmZzZXRYO1xuICAgIGNvbnN0IGxheWVySGVpZ2h0ID0gbGF5ZXJCb3hbM10gLSBsYXllck9mZnNldFk7XG4gICAgaWYgKGxheWVyV2lkdGggPT09IDAgfHwgbGF5ZXJIZWlnaHQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5nZW5lcmljQ29tcG9zZVNNYXNrKHNtYXNrLmNvbnRleHQsIGxheWVyQ3R4LCBsYXllcldpZHRoLCBsYXllckhlaWdodCwgc21hc2suc3VidHlwZSwgc21hc2suYmFja2Ryb3AsIHNtYXNrLnRyYW5zZmVyTWFwLCBsYXllck9mZnNldFgsIGxheWVyT2Zmc2V0WSwgc21hc2sub2Zmc2V0WCwgc21hc2sub2Zmc2V0WSk7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguZ2xvYmFsQWxwaGEgPSAxO1xuICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1vdmVyXCI7XG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBjdHguZHJhd0ltYWdlKGxheWVyQ3R4LmNhbnZhcywgMCwgMCk7XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxuICBnZW5lcmljQ29tcG9zZVNNYXNrKG1hc2tDdHgsIGxheWVyQ3R4LCB3aWR0aCwgaGVpZ2h0LCBzdWJ0eXBlLCBiYWNrZHJvcCwgdHJhbnNmZXJNYXAsIGxheWVyT2Zmc2V0WCwgbGF5ZXJPZmZzZXRZLCBtYXNrT2Zmc2V0WCwgbWFza09mZnNldFkpIHtcbiAgICBsZXQgbWFza0NhbnZhcyA9IG1hc2tDdHguY2FudmFzO1xuICAgIGxldCBtYXNrWCA9IGxheWVyT2Zmc2V0WCAtIG1hc2tPZmZzZXRYO1xuICAgIGxldCBtYXNrWSA9IGxheWVyT2Zmc2V0WSAtIG1hc2tPZmZzZXRZO1xuICAgIGlmIChiYWNrZHJvcCkge1xuICAgICAgaWYgKG1hc2tYIDwgMCB8fCBtYXNrWSA8IDAgfHwgbWFza1ggKyB3aWR0aCA+IG1hc2tDYW52YXMud2lkdGggfHwgbWFza1kgKyBoZWlnaHQgPiBtYXNrQ2FudmFzLmhlaWdodCkge1xuICAgICAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcIm1hc2tFeHRlbnNpb25cIiwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5jb250ZXh0O1xuICAgICAgICBjdHguZHJhd0ltYWdlKG1hc2tDYW52YXMsIC1tYXNrWCwgLW1hc2tZKTtcbiAgICAgICAgaWYgKGJhY2tkcm9wLnNvbWUoYyA9PiBjICE9PSAwKSkge1xuICAgICAgICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcImRlc3RpbmF0aW9uLWF0b3BcIjtcbiAgICAgICAgICBjdHguZmlsbFN0eWxlID0gVXRpbC5tYWtlSGV4Q29sb3IoLi4uYmFja2Ryb3ApO1xuICAgICAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2Utb3ZlclwiO1xuICAgICAgICB9XG4gICAgICAgIG1hc2tDYW52YXMgPSBjYW52YXMuY2FudmFzO1xuICAgICAgICBtYXNrWCA9IG1hc2tZID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoYmFja2Ryb3Auc29tZShjID0+IGMgIT09IDApKSB7XG4gICAgICAgIG1hc2tDdHguc2F2ZSgpO1xuICAgICAgICBtYXNrQ3R4Lmdsb2JhbEFscGhhID0gMTtcbiAgICAgICAgbWFza0N0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICAgIGNvbnN0IGNsaXAgPSBuZXcgUGF0aDJEKCk7XG4gICAgICAgIGNsaXAucmVjdChtYXNrWCwgbWFza1ksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBtYXNrQ3R4LmNsaXAoY2xpcCk7XG4gICAgICAgIG1hc2tDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJkZXN0aW5hdGlvbi1hdG9wXCI7XG4gICAgICAgIG1hc2tDdHguZmlsbFN0eWxlID0gVXRpbC5tYWtlSGV4Q29sb3IoLi4uYmFja2Ryb3ApO1xuICAgICAgICBtYXNrQ3R4LmZpbGxSZWN0KG1hc2tYLCBtYXNrWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIG1hc2tDdHgucmVzdG9yZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBsYXllckN0eC5zYXZlKCk7XG4gICAgbGF5ZXJDdHguZ2xvYmFsQWxwaGEgPSAxO1xuICAgIGxheWVyQ3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBpZiAoc3VidHlwZSA9PT0gXCJBbHBoYVwiICYmIHRyYW5zZmVyTWFwKSB7XG4gICAgICBsYXllckN0eC5maWx0ZXIgPSB0aGlzLmZpbHRlckZhY3RvcnkuYWRkQWxwaGFGaWx0ZXIodHJhbnNmZXJNYXApO1xuICAgIH0gZWxzZSBpZiAoc3VidHlwZSA9PT0gXCJMdW1pbm9zaXR5XCIpIHtcbiAgICAgIGxheWVyQ3R4LmZpbHRlciA9IHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRMdW1pbm9zaXR5RmlsdGVyKHRyYW5zZmVyTWFwKTtcbiAgICB9XG4gICAgY29uc3QgY2xpcCA9IG5ldyBQYXRoMkQoKTtcbiAgICBjbGlwLnJlY3QobGF5ZXJPZmZzZXRYLCBsYXllck9mZnNldFksIHdpZHRoLCBoZWlnaHQpO1xuICAgIGxheWVyQ3R4LmNsaXAoY2xpcCk7XG4gICAgbGF5ZXJDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJkZXN0aW5hdGlvbi1pblwiO1xuICAgIGxheWVyQ3R4LmRyYXdJbWFnZShtYXNrQ2FudmFzLCBtYXNrWCwgbWFza1ksIHdpZHRoLCBoZWlnaHQsIGxheWVyT2Zmc2V0WCwgbGF5ZXJPZmZzZXRZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBsYXllckN0eC5yZXN0b3JlKCk7XG4gIH1cbiAgc2F2ZSgpIHtcbiAgICBpZiAodGhpcy5pblNNYXNrTW9kZSkge1xuICAgICAgY29weUN0eFN0YXRlKHRoaXMuY3R4LCB0aGlzLnN1c3BlbmRlZEN0eCk7XG4gICAgICB0aGlzLnN1c3BlbmRlZEN0eC5zYXZlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICB9XG4gICAgY29uc3Qgb2xkID0gdGhpcy5jdXJyZW50O1xuICAgIHRoaXMuc3RhdGVTdGFjay5wdXNoKG9sZCk7XG4gICAgdGhpcy5jdXJyZW50ID0gb2xkLmNsb25lKCk7XG4gIH1cbiAgcmVzdG9yZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5zdGF0ZVN0YWNrLnBvcCgpO1xuICAgICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgICAgdGhpcy5zdXNwZW5kZWRDdHgucmVzdG9yZSgpO1xuICAgICAgICBjb3B5Q3R4U3RhdGUodGhpcy5zdXNwZW5kZWRDdHgsIHRoaXMuY3R4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hlY2tTTWFza1N0YXRlKCk7XG4gICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPSAtMTtcbiAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgIH1cbiAgfVxuICB0cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikge1xuICAgIHRoaXMuY3R4LnRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcbiAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdID0gLTE7XG4gICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7XG4gIH1cbiAgY29uc3RydWN0UGF0aChvcHMsIGFyZ3MsIG1pbk1heCkge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgbGV0IHggPSBjdXJyZW50LngsXG4gICAgICB5ID0gY3VycmVudC55O1xuICAgIGxldCBzdGFydFgsIHN0YXJ0WTtcbiAgICBjb25zdCBjdXJyZW50VHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpO1xuICAgIGNvbnN0IGlzU2NhbGluZ01hdHJpeCA9IGN1cnJlbnRUcmFuc2Zvcm1bMF0gPT09IDAgJiYgY3VycmVudFRyYW5zZm9ybVszXSA9PT0gMCB8fCBjdXJyZW50VHJhbnNmb3JtWzFdID09PSAwICYmIGN1cnJlbnRUcmFuc2Zvcm1bMl0gPT09IDA7XG4gICAgY29uc3QgbWluTWF4Rm9yQmV6aWVyID0gaXNTY2FsaW5nTWF0cml4ID8gbWluTWF4LnNsaWNlKDApIDogbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGlpID0gb3BzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHN3aXRjaCAob3BzW2ldIHwgMCkge1xuICAgICAgICBjYXNlIE9QUy5yZWN0YW5nbGU6XG4gICAgICAgICAgeCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuICAgICAgICAgIGNvbnN0IHdpZHRoID0gYXJnc1tqKytdO1xuICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICBjb25zdCB4dyA9IHggKyB3aWR0aDtcbiAgICAgICAgICBjb25zdCB5aCA9IHkgKyBoZWlnaHQ7XG4gICAgICAgICAgY3R4Lm1vdmVUbyh4LCB5KTtcbiAgICAgICAgICBpZiAod2lkdGggPT09IDAgfHwgaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgICBjdHgubGluZVRvKHh3LCB5aCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHkpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4dywgeWgpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNTY2FsaW5nTWF0cml4KSB7XG4gICAgICAgICAgICBjdXJyZW50LnVwZGF0ZVJlY3RNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgW3gsIHksIHh3LCB5aF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT1BTLm1vdmVUbzpcbiAgICAgICAgICB4ID0gYXJnc1tqKytdO1xuICAgICAgICAgIHkgPSBhcmdzW2orK107XG4gICAgICAgICAgY3R4Lm1vdmVUbyh4LCB5KTtcbiAgICAgICAgICBpZiAoIWlzU2NhbGluZ01hdHJpeCkge1xuICAgICAgICAgICAgY3VycmVudC51cGRhdGVQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIHgsIHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPUFMubGluZVRvOlxuICAgICAgICAgIHggPSBhcmdzW2orK107XG4gICAgICAgICAgeSA9IGFyZ3NbaisrXTtcbiAgICAgICAgICBjdHgubGluZVRvKHgsIHkpO1xuICAgICAgICAgIGlmICghaXNTY2FsaW5nTWF0cml4KSB7XG4gICAgICAgICAgICBjdXJyZW50LnVwZGF0ZVBhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9QUy5jdXJ2ZVRvOlxuICAgICAgICAgIHN0YXJ0WCA9IHg7XG4gICAgICAgICAgc3RhcnRZID0geTtcbiAgICAgICAgICB4ID0gYXJnc1tqICsgNF07XG4gICAgICAgICAgeSA9IGFyZ3NbaiArIDVdO1xuICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCBhcmdzW2ogKyAyXSwgYXJnc1tqICsgM10sIHgsIHkpO1xuICAgICAgICAgIGN1cnJlbnQudXBkYXRlQ3VydmVQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIHN0YXJ0WCwgc3RhcnRZLCBhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdLCB4LCB5LCBtaW5NYXhGb3JCZXppZXIpO1xuICAgICAgICAgIGogKz0gNjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPUFMuY3VydmVUbzI6XG4gICAgICAgICAgc3RhcnRYID0geDtcbiAgICAgICAgICBzdGFydFkgPSB5O1xuICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKHgsIHksIGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCBhcmdzW2ogKyAyXSwgYXJnc1tqICsgM10pO1xuICAgICAgICAgIGN1cnJlbnQudXBkYXRlQ3VydmVQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIHN0YXJ0WCwgc3RhcnRZLCB4LCB5LCBhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdLCBtaW5NYXhGb3JCZXppZXIpO1xuICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTtcbiAgICAgICAgICB5ID0gYXJnc1tqICsgM107XG4gICAgICAgICAgaiArPSA0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9QUy5jdXJ2ZVRvMzpcbiAgICAgICAgICBzdGFydFggPSB4O1xuICAgICAgICAgIHN0YXJ0WSA9IHk7XG4gICAgICAgICAgeCA9IGFyZ3NbaiArIDJdO1xuICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTtcbiAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyhhcmdzW2pdLCBhcmdzW2ogKyAxXSwgeCwgeSwgeCwgeSk7XG4gICAgICAgICAgY3VycmVudC51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgc3RhcnRYLCBzdGFydFksIGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCB4LCB5LCB4LCB5LCBtaW5NYXhGb3JCZXppZXIpO1xuICAgICAgICAgIGogKz0gNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPUFMuY2xvc2VQYXRoOlxuICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzU2NhbGluZ01hdHJpeCkge1xuICAgICAgY3VycmVudC51cGRhdGVTY2FsaW5nUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBtaW5NYXhGb3JCZXppZXIpO1xuICAgIH1cbiAgICBjdXJyZW50LnNldEN1cnJlbnRQb2ludCh4LCB5KTtcbiAgfVxuICBjbG9zZVBhdGgoKSB7XG4gICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG4gIH1cbiAgc3Ryb2tlKGNvbnN1bWVQYXRoID0gdHJ1ZSkge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yO1xuICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5zdHJva2VBbHBoYTtcbiAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgaWYgKHR5cGVvZiBzdHJva2VDb2xvciA9PT0gXCJvYmplY3RcIiAmJiBzdHJva2VDb2xvcj8uZ2V0UGF0dGVybikge1xuICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2VDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoY3R4KSwgUGF0aFR5cGUuU1RST0tFKTtcbiAgICAgICAgdGhpcy5yZXNjYWxlQW5kU3Ryb2tlKGZhbHNlKTtcbiAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzY2FsZUFuZFN0cm9rZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbnN1bWVQYXRoKSB7XG4gICAgICB0aGlzLmNvbnN1bWVQYXRoKHRoaXMuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KCkpO1xuICAgIH1cbiAgICBjdHguZ2xvYmFsQWxwaGEgPSB0aGlzLmN1cnJlbnQuZmlsbEFscGhhO1xuICB9XG4gIGNsb3NlU3Ryb2tlKCkge1xuICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5zdHJva2UoKTtcbiAgfVxuICBmaWxsKGNvbnN1bWVQYXRoID0gdHJ1ZSkge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG4gICAgY29uc3QgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDtcbiAgICBsZXQgbmVlZFJlc3RvcmUgPSBmYWxzZTtcbiAgICBpZiAoaXNQYXR0ZXJuRmlsbCkge1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMsIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCksIFBhdGhUeXBlLkZJTEwpO1xuICAgICAgbmVlZFJlc3RvcmUgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBpbnRlcnNlY3QgPSB0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpO1xuICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlICYmIGludGVyc2VjdCAhPT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMucGVuZGluZ0VPRmlsbCkge1xuICAgICAgICBjdHguZmlsbChcImV2ZW5vZGRcIik7XG4gICAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5lZWRSZXN0b3JlKSB7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbiAgICBpZiAoY29uc3VtZVBhdGgpIHtcbiAgICAgIHRoaXMuY29uc3VtZVBhdGgoaW50ZXJzZWN0KTtcbiAgICB9XG4gIH1cbiAgZW9GaWxsKCkge1xuICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IHRydWU7XG4gICAgdGhpcy5maWxsKCk7XG4gIH1cbiAgZmlsbFN0cm9rZSgpIHtcbiAgICB0aGlzLmZpbGwoZmFsc2UpO1xuICAgIHRoaXMuc3Ryb2tlKGZhbHNlKTtcbiAgICB0aGlzLmNvbnN1bWVQYXRoKCk7XG4gIH1cbiAgZW9GaWxsU3Ryb2tlKCkge1xuICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IHRydWU7XG4gICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gIH1cbiAgY2xvc2VGaWxsU3Ryb2tlKCkge1xuICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gIH1cbiAgY2xvc2VFT0ZpbGxTdHJva2UoKSB7XG4gICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcbiAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICB9XG4gIGVuZFBhdGgoKSB7XG4gICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuICB9XG4gIGNsaXAoKSB7XG4gICAgdGhpcy5wZW5kaW5nQ2xpcCA9IE5PUk1BTF9DTElQO1xuICB9XG4gIGVvQ2xpcCgpIHtcbiAgICB0aGlzLnBlbmRpbmdDbGlwID0gRU9fQ0xJUDtcbiAgfVxuICBiZWdpblRleHQoKSB7XG4gICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXggPSBJREVOVElUWV9NQVRSSVg7XG4gICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IDE7XG4gICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggPSAwO1xuICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZID0gMDtcbiAgfVxuICBlbmRUZXh0KCkge1xuICAgIGNvbnN0IHBhdGhzID0gdGhpcy5wZW5kaW5nVGV4dFBhdGhzO1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGlmIChwYXRocyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgY3R4LnNldFRyYW5zZm9ybSguLi5wYXRoLnRyYW5zZm9ybSk7XG4gICAgICBjdHgudHJhbnNsYXRlKHBhdGgueCwgcGF0aC55KTtcbiAgICAgIHBhdGguYWRkVG9QYXRoKGN0eCwgcGF0aC5mb250U2l6ZSk7XG4gICAgfVxuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgY3R4LmNsaXAoKTtcbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgZGVsZXRlIHRoaXMucGVuZGluZ1RleHRQYXRocztcbiAgfVxuICBzZXRDaGFyU3BhY2luZyhzcGFjaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nID0gc3BhY2luZztcbiAgfVxuICBzZXRXb3JkU3BhY2luZyhzcGFjaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50LndvcmRTcGFjaW5nID0gc3BhY2luZztcbiAgfVxuICBzZXRIU2NhbGUoc2NhbGUpIHtcbiAgICB0aGlzLmN1cnJlbnQudGV4dEhTY2FsZSA9IHNjYWxlIC8gMTAwO1xuICB9XG4gIHNldExlYWRpbmcobGVhZGluZykge1xuICAgIHRoaXMuY3VycmVudC5sZWFkaW5nID0gLWxlYWRpbmc7XG4gIH1cbiAgc2V0Rm9udChmb250UmVmTmFtZSwgc2l6ZSkge1xuICAgIGNvbnN0IGZvbnRPYmogPSB0aGlzLmNvbW1vbk9ianMuZ2V0KGZvbnRSZWZOYW1lKTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgIGlmICghZm9udE9iaikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBmaW5kIGZvbnQgZm9yICR7Zm9udFJlZk5hbWV9YCk7XG4gICAgfVxuICAgIGN1cnJlbnQuZm9udE1hdHJpeCA9IGZvbnRPYmouZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDtcbiAgICBpZiAoY3VycmVudC5mb250TWF0cml4WzBdID09PSAwIHx8IGN1cnJlbnQuZm9udE1hdHJpeFszXSA9PT0gMCkge1xuICAgICAgd2FybihcIkludmFsaWQgZm9udCBtYXRyaXggZm9yIGZvbnQgXCIgKyBmb250UmVmTmFtZSk7XG4gICAgfVxuICAgIGlmIChzaXplIDwgMCkge1xuICAgICAgc2l6ZSA9IC1zaXplO1xuICAgICAgY3VycmVudC5mb250RGlyZWN0aW9uID0gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IDE7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudC5mb250ID0gZm9udE9iajtcbiAgICB0aGlzLmN1cnJlbnQuZm9udFNpemUgPSBzaXplO1xuICAgIGlmIChmb250T2JqLmlzVHlwZTNGb250KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBmb250T2JqLmxvYWRlZE5hbWUgfHwgXCJzYW5zLXNlcmlmXCI7XG4gICAgY29uc3QgdHlwZWZhY2UgPSBmb250T2JqLnN5c3RlbUZvbnRJbmZvPy5jc3MgfHwgYFwiJHtuYW1lfVwiLCAke2ZvbnRPYmouZmFsbGJhY2tOYW1lfWA7XG4gICAgbGV0IGJvbGQgPSBcIm5vcm1hbFwiO1xuICAgIGlmIChmb250T2JqLmJsYWNrKSB7XG4gICAgICBib2xkID0gXCI5MDBcIjtcbiAgICB9IGVsc2UgaWYgKGZvbnRPYmouYm9sZCkge1xuICAgICAgYm9sZCA9IFwiYm9sZFwiO1xuICAgIH1cbiAgICBjb25zdCBpdGFsaWMgPSBmb250T2JqLml0YWxpYyA/IFwiaXRhbGljXCIgOiBcIm5vcm1hbFwiO1xuICAgIGxldCBicm93c2VyRm9udFNpemUgPSBzaXplO1xuICAgIGlmIChzaXplIDwgTUlOX0ZPTlRfU0laRSkge1xuICAgICAgYnJvd3NlckZvbnRTaXplID0gTUlOX0ZPTlRfU0laRTtcbiAgICB9IGVsc2UgaWYgKHNpemUgPiBNQVhfRk9OVF9TSVpFKSB7XG4gICAgICBicm93c2VyRm9udFNpemUgPSBNQVhfRk9OVF9TSVpFO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQuZm9udFNpemVTY2FsZSA9IHNpemUgLyBicm93c2VyRm9udFNpemU7XG4gICAgdGhpcy5jdHguZm9udCA9IGAke2l0YWxpY30gJHtib2xkfSAke2Jyb3dzZXJGb250U2l6ZX1weCAke3R5cGVmYWNlfWA7XG4gIH1cbiAgc2V0VGV4dFJlbmRlcmluZ01vZGUobW9kZSkge1xuICAgIHRoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9IG1vZGU7XG4gIH1cbiAgc2V0VGV4dFJpc2UocmlzZSkge1xuICAgIHRoaXMuY3VycmVudC50ZXh0UmlzZSA9IHJpc2U7XG4gIH1cbiAgbW92ZVRleHQoeCwgeSkge1xuICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYICs9IHg7XG4gICAgdGhpcy5jdXJyZW50LnkgPSB0aGlzLmN1cnJlbnQubGluZVkgKz0geTtcbiAgfVxuICBzZXRMZWFkaW5nTW92ZVRleHQoeCwgeSkge1xuICAgIHRoaXMuc2V0TGVhZGluZygteSk7XG4gICAgdGhpcy5tb3ZlVGV4dCh4LCB5KTtcbiAgfVxuICBzZXRUZXh0TWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeCA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gTWF0aC5oeXBvdChhLCBiKTtcbiAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCA9IDA7XG4gICAgdGhpcy5jdXJyZW50LnkgPSB0aGlzLmN1cnJlbnQubGluZVkgPSAwO1xuICB9XG4gIG5leHRMaW5lKCkge1xuICAgIHRoaXMubW92ZVRleHQoMCwgdGhpcy5jdXJyZW50LmxlYWRpbmcpO1xuICB9XG4gIHBhaW50Q2hhcihjaGFyYWN0ZXIsIHgsIHksIHBhdHRlcm5UcmFuc2Zvcm0pIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgIGNvbnN0IGZvbnQgPSBjdXJyZW50LmZvbnQ7XG4gICAgY29uc3QgdGV4dFJlbmRlcmluZ01vZGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlO1xuICAgIGNvbnN0IGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZSAvIGN1cnJlbnQuZm9udFNpemVTY2FsZTtcbiAgICBjb25zdCBmaWxsU3Ryb2tlTW9kZSA9IHRleHRSZW5kZXJpbmdNb2RlICYgVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcbiAgICBjb25zdCBpc0FkZFRvUGF0aFNldCA9ICEhKHRleHRSZW5kZXJpbmdNb2RlICYgVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBRyk7XG4gICAgY29uc3QgcGF0dGVybkZpbGwgPSBjdXJyZW50LnBhdHRlcm5GaWxsICYmICFmb250Lm1pc3NpbmdGaWxlO1xuICAgIGxldCBhZGRUb1BhdGg7XG4gICAgaWYgKGZvbnQuZGlzYWJsZUZvbnRGYWNlIHx8IGlzQWRkVG9QYXRoU2V0IHx8IHBhdHRlcm5GaWxsKSB7XG4gICAgICBhZGRUb1BhdGggPSBmb250LmdldFBhdGhHZW5lcmF0b3IodGhpcy5jb21tb25PYmpzLCBjaGFyYWN0ZXIpO1xuICAgIH1cbiAgICBpZiAoZm9udC5kaXNhYmxlRm9udEZhY2UgfHwgcGF0dGVybkZpbGwpIHtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjdHgudHJhbnNsYXRlKHgsIHkpO1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgYWRkVG9QYXRoKGN0eCwgZm9udFNpemUpO1xuICAgICAgaWYgKHBhdHRlcm5UcmFuc2Zvcm0pIHtcbiAgICAgICAgY3R4LnNldFRyYW5zZm9ybSguLi5wYXR0ZXJuVHJhbnNmb3JtKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICB9XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTEwgfHwgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG4gICAgICAgIGN0eC5maWxsVGV4dChjaGFyYWN0ZXIsIHgsIHkpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG4gICAgICAgIGN0eC5zdHJva2VUZXh0KGNoYXJhY3RlciwgeCwgeSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0FkZFRvUGF0aFNldCkge1xuICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLnBlbmRpbmdUZXh0UGF0aHMgfHw9IFtdO1xuICAgICAgcGF0aHMucHVzaCh7XG4gICAgICAgIHRyYW5zZm9ybTogZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgYWRkVG9QYXRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZ2V0IGlzRm9udFN1YnBpeGVsQUFFbmFibGVkKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRleHQ6IGN0eFxuICAgIH0gPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlzRm9udFN1YnBpeGVsQUFFbmFibGVkXCIsIDEwLCAxMCk7XG4gICAgY3R4LnNjYWxlKDEuNSwgMSk7XG4gICAgY3R4LmZpbGxUZXh0KFwiSVwiLCAwLCAxMCk7XG4gICAgY29uc3QgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMTAsIDEwKS5kYXRhO1xuICAgIGxldCBlbmFibGVkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDM7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICBpZiAoZGF0YVtpXSA+IDAgJiYgZGF0YVtpXSA8IDI1NSkge1xuICAgICAgICBlbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZFwiLCBlbmFibGVkKTtcbiAgfVxuICBzaG93VGV4dChnbHlwaHMpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuICAgIGNvbnN0IGZvbnQgPSBjdXJyZW50LmZvbnQ7XG4gICAgaWYgKGZvbnQuaXNUeXBlM0ZvbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3dUeXBlM1RleHQoZ2x5cGhzKTtcbiAgICB9XG4gICAgY29uc3QgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplO1xuICAgIGlmIChmb250U2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZm9udFNpemVTY2FsZSA9IGN1cnJlbnQuZm9udFNpemVTY2FsZTtcbiAgICBjb25zdCBjaGFyU3BhY2luZyA9IGN1cnJlbnQuY2hhclNwYWNpbmc7XG4gICAgY29uc3Qgd29yZFNwYWNpbmcgPSBjdXJyZW50LndvcmRTcGFjaW5nO1xuICAgIGNvbnN0IGZvbnREaXJlY3Rpb24gPSBjdXJyZW50LmZvbnREaXJlY3Rpb247XG4gICAgY29uc3QgdGV4dEhTY2FsZSA9IGN1cnJlbnQudGV4dEhTY2FsZSAqIGZvbnREaXJlY3Rpb247XG4gICAgY29uc3QgZ2x5cGhzTGVuZ3RoID0gZ2x5cGhzLmxlbmd0aDtcbiAgICBjb25zdCB2ZXJ0aWNhbCA9IGZvbnQudmVydGljYWw7XG4gICAgY29uc3Qgc3BhY2luZ0RpciA9IHZlcnRpY2FsID8gMSA6IC0xO1xuICAgIGNvbnN0IGRlZmF1bHRWTWV0cmljcyA9IGZvbnQuZGVmYXVsdFZNZXRyaWNzO1xuICAgIGNvbnN0IHdpZHRoQWR2YW5jZVNjYWxlID0gZm9udFNpemUgKiBjdXJyZW50LmZvbnRNYXRyaXhbMF07XG4gICAgY29uc3Qgc2ltcGxlRmlsbFRleHQgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMICYmICFmb250LmRpc2FibGVGb250RmFjZSAmJiAhY3VycmVudC5wYXR0ZXJuRmlsbDtcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC50cmFuc2Zvcm0oLi4uY3VycmVudC50ZXh0TWF0cml4KTtcbiAgICBjdHgudHJhbnNsYXRlKGN1cnJlbnQueCwgY3VycmVudC55ICsgY3VycmVudC50ZXh0UmlzZSk7XG4gICAgaWYgKGZvbnREaXJlY3Rpb24gPiAwKSB7XG4gICAgICBjdHguc2NhbGUodGV4dEhTY2FsZSwgLTEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdHguc2NhbGUodGV4dEhTY2FsZSwgMSk7XG4gICAgfVxuICAgIGxldCBwYXR0ZXJuVHJhbnNmb3JtO1xuICAgIGlmIChjdXJyZW50LnBhdHRlcm5GaWxsKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY29uc3QgcGF0dGVybiA9IGN1cnJlbnQuZmlsbENvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzLCBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShjdHgpLCBQYXRoVHlwZS5GSUxMKTtcbiAgICAgIHBhdHRlcm5UcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCk7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IHBhdHRlcm47XG4gICAgfVxuICAgIGxldCBsaW5lV2lkdGggPSBjdXJyZW50LmxpbmVXaWR0aDtcbiAgICBjb25zdCBzY2FsZSA9IGN1cnJlbnQudGV4dE1hdHJpeFNjYWxlO1xuICAgIGlmIChzY2FsZSA9PT0gMCB8fCBsaW5lV2lkdGggPT09IDApIHtcbiAgICAgIGNvbnN0IGZpbGxTdHJva2VNb2RlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSAmIFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7XG4gICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgbGluZVdpZHRoID0gdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVXaWR0aCAvPSBzY2FsZTtcbiAgICB9XG4gICAgaWYgKGZvbnRTaXplU2NhbGUgIT09IDEuMCkge1xuICAgICAgY3R4LnNjYWxlKGZvbnRTaXplU2NhbGUsIGZvbnRTaXplU2NhbGUpO1xuICAgICAgbGluZVdpZHRoIC89IGZvbnRTaXplU2NhbGU7XG4gICAgfVxuICAgIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgaWYgKGZvbnQuaXNJbnZhbGlkUERGanNGb250KSB7XG4gICAgICBjb25zdCBjaGFycyA9IFtdO1xuICAgICAgbGV0IHdpZHRoID0gMDtcbiAgICAgIGZvciAoY29uc3QgZ2x5cGggb2YgZ2x5cGhzKSB7XG4gICAgICAgIGNoYXJzLnB1c2goZ2x5cGgudW5pY29kZSk7XG4gICAgICAgIHdpZHRoICs9IGdseXBoLndpZHRoO1xuICAgICAgfVxuICAgICAgY3R4LmZpbGxUZXh0KGNoYXJzLmpvaW4oXCJcIiksIDAsIDApO1xuICAgICAgY3VycmVudC54ICs9IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgKiB0ZXh0SFNjYWxlO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgIHRoaXMuY29tcG9zZSgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGV0IHggPSAwLFxuICAgICAgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZ2x5cGhzTGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGdseXBoID0gZ2x5cGhzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBnbHlwaCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICB4ICs9IHNwYWNpbmdEaXIgKiBnbHlwaCAqIGZvbnRTaXplIC8gMTAwMDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgcmVzdG9yZU5lZWRlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc3BhY2luZyA9IChnbHlwaC5pc1NwYWNlID8gd29yZFNwYWNpbmcgOiAwKSArIGNoYXJTcGFjaW5nO1xuICAgICAgY29uc3QgY2hhcmFjdGVyID0gZ2x5cGguZm9udENoYXI7XG4gICAgICBjb25zdCBhY2NlbnQgPSBnbHlwaC5hY2NlbnQ7XG4gICAgICBsZXQgc2NhbGVkWCwgc2NhbGVkWTtcbiAgICAgIGxldCB3aWR0aCA9IGdseXBoLndpZHRoO1xuICAgICAgaWYgKHZlcnRpY2FsKSB7XG4gICAgICAgIGNvbnN0IHZtZXRyaWMgPSBnbHlwaC52bWV0cmljIHx8IGRlZmF1bHRWTWV0cmljcztcbiAgICAgICAgY29uc3QgdnggPSAtKGdseXBoLnZtZXRyaWMgPyB2bWV0cmljWzFdIDogd2lkdGggKiAwLjUpICogd2lkdGhBZHZhbmNlU2NhbGU7XG4gICAgICAgIGNvbnN0IHZ5ID0gdm1ldHJpY1syXSAqIHdpZHRoQWR2YW5jZVNjYWxlO1xuICAgICAgICB3aWR0aCA9IHZtZXRyaWMgPyAtdm1ldHJpY1swXSA6IHdpZHRoO1xuICAgICAgICBzY2FsZWRYID0gdnggLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICBzY2FsZWRZID0gKHggKyB2eSkgLyBmb250U2l6ZVNjYWxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NhbGVkWCA9IHggLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICBzY2FsZWRZID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChmb250LnJlbWVhc3VyZSAmJiB3aWR0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbWVhc3VyZWRXaWR0aCA9IGN0eC5tZWFzdXJlVGV4dChjaGFyYWN0ZXIpLndpZHRoICogMTAwMCAvIGZvbnRTaXplICogZm9udFNpemVTY2FsZTtcbiAgICAgICAgaWYgKHdpZHRoIDwgbWVhc3VyZWRXaWR0aCAmJiB0aGlzLmlzRm9udFN1YnBpeGVsQUFFbmFibGVkKSB7XG4gICAgICAgICAgY29uc3QgY2hhcmFjdGVyU2NhbGVYID0gd2lkdGggLyBtZWFzdXJlZFdpZHRoO1xuICAgICAgICAgIHJlc3RvcmVOZWVkZWQgPSB0cnVlO1xuICAgICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgICAgY3R4LnNjYWxlKGNoYXJhY3RlclNjYWxlWCwgMSk7XG4gICAgICAgICAgc2NhbGVkWCAvPSBjaGFyYWN0ZXJTY2FsZVg7XG4gICAgICAgIH0gZWxzZSBpZiAod2lkdGggIT09IG1lYXN1cmVkV2lkdGgpIHtcbiAgICAgICAgICBzY2FsZWRYICs9ICh3aWR0aCAtIG1lYXN1cmVkV2lkdGgpIC8gMjAwMCAqIGZvbnRTaXplIC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUgJiYgKGdseXBoLmlzSW5Gb250IHx8IGZvbnQubWlzc2luZ0ZpbGUpKSB7XG4gICAgICAgIGlmIChzaW1wbGVGaWxsVGV4dCAmJiAhYWNjZW50KSB7XG4gICAgICAgICAgY3R4LmZpbGxUZXh0KGNoYXJhY3Rlciwgc2NhbGVkWCwgc2NhbGVkWSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wYWludENoYXIoY2hhcmFjdGVyLCBzY2FsZWRYLCBzY2FsZWRZLCBwYXR0ZXJuVHJhbnNmb3JtKTtcbiAgICAgICAgICBpZiAoYWNjZW50KSB7XG4gICAgICAgICAgICBjb25zdCBzY2FsZWRBY2NlbnRYID0gc2NhbGVkWCArIGZvbnRTaXplICogYWNjZW50Lm9mZnNldC54IC8gZm9udFNpemVTY2FsZTtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlZEFjY2VudFkgPSBzY2FsZWRZIC0gZm9udFNpemUgKiBhY2NlbnQub2Zmc2V0LnkgLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICAgICAgdGhpcy5wYWludENoYXIoYWNjZW50LmZvbnRDaGFyLCBzY2FsZWRBY2NlbnRYLCBzY2FsZWRBY2NlbnRZLCBwYXR0ZXJuVHJhbnNmb3JtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoYXJXaWR0aCA9IHZlcnRpY2FsID8gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSAtIHNwYWNpbmcgKiBmb250RGlyZWN0aW9uIDogd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSArIHNwYWNpbmcgKiBmb250RGlyZWN0aW9uO1xuICAgICAgeCArPSBjaGFyV2lkdGg7XG4gICAgICBpZiAocmVzdG9yZU5lZWRlZCkge1xuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmVydGljYWwpIHtcbiAgICAgIGN1cnJlbnQueSAtPSB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50LnggKz0geCAqIHRleHRIU2NhbGU7XG4gICAgfVxuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBzaG93VHlwZTNUZXh0KGdseXBocykge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgY29uc3QgZm9udCA9IGN1cnJlbnQuZm9udDtcbiAgICBjb25zdCBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemU7XG4gICAgY29uc3QgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjtcbiAgICBjb25zdCBzcGFjaW5nRGlyID0gZm9udC52ZXJ0aWNhbCA/IDEgOiAtMTtcbiAgICBjb25zdCBjaGFyU3BhY2luZyA9IGN1cnJlbnQuY2hhclNwYWNpbmc7XG4gICAgY29uc3Qgd29yZFNwYWNpbmcgPSBjdXJyZW50LndvcmRTcGFjaW5nO1xuICAgIGNvbnN0IHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uO1xuICAgIGNvbnN0IGZvbnRNYXRyaXggPSBjdXJyZW50LmZvbnRNYXRyaXggfHwgRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgY29uc3QgZ2x5cGhzTGVuZ3RoID0gZ2x5cGhzLmxlbmd0aDtcbiAgICBjb25zdCBpc1RleHRJbnZpc2libGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5JTlZJU0lCTEU7XG4gICAgbGV0IGksIGdseXBoLCB3aWR0aCwgc3BhY2luZ0xlbmd0aDtcbiAgICBpZiAoaXNUZXh0SW52aXNpYmxlIHx8IGZvbnRTaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPSAtMTtcbiAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC50cmFuc2Zvcm0oLi4uY3VycmVudC50ZXh0TWF0cml4KTtcbiAgICBjdHgudHJhbnNsYXRlKGN1cnJlbnQueCwgY3VycmVudC55KTtcbiAgICBjdHguc2NhbGUodGV4dEhTY2FsZSwgZm9udERpcmVjdGlvbik7XG4gICAgZm9yIChpID0gMDsgaSA8IGdseXBoc0xlbmd0aDsgKytpKSB7XG4gICAgICBnbHlwaCA9IGdseXBoc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgZ2x5cGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgc3BhY2luZ0xlbmd0aCA9IHNwYWNpbmdEaXIgKiBnbHlwaCAqIGZvbnRTaXplIC8gMTAwMDtcbiAgICAgICAgdGhpcy5jdHgudHJhbnNsYXRlKHNwYWNpbmdMZW5ndGgsIDApO1xuICAgICAgICBjdXJyZW50LnggKz0gc3BhY2luZ0xlbmd0aCAqIHRleHRIU2NhbGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3BhY2luZyA9IChnbHlwaC5pc1NwYWNlID8gd29yZFNwYWNpbmcgOiAwKSArIGNoYXJTcGFjaW5nO1xuICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gZm9udC5jaGFyUHJvY09wZXJhdG9yTGlzdFtnbHlwaC5vcGVyYXRvckxpc3RJZF07XG4gICAgICBpZiAoIW9wZXJhdG9yTGlzdCkge1xuICAgICAgICB3YXJuKGBUeXBlMyBjaGFyYWN0ZXIgXCIke2dseXBoLm9wZXJhdG9yTGlzdElkfVwiIGlzIG5vdCBhdmFpbGFibGUuYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBnbHlwaDtcbiAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAgIGN0eC5zY2FsZShmb250U2l6ZSwgZm9udFNpemUpO1xuICAgICAgICBjdHgudHJhbnNmb3JtKC4uLmZvbnRNYXRyaXgpO1xuICAgICAgICB0aGlzLmV4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0KTtcbiAgICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW2dseXBoLndpZHRoLCAwXSwgZm9udE1hdHJpeCk7XG4gICAgICB3aWR0aCA9IHRyYW5zZm9ybWVkWzBdICogZm9udFNpemUgKyBzcGFjaW5nO1xuICAgICAgY3R4LnRyYW5zbGF0ZSh3aWR0aCwgMCk7XG4gICAgICBjdXJyZW50LnggKz0gd2lkdGggKiB0ZXh0SFNjYWxlO1xuICAgIH1cbiAgICBjdHgucmVzdG9yZSgpO1xuICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gbnVsbDtcbiAgfVxuICBzZXRDaGFyV2lkdGgoeFdpZHRoLCB5V2lkdGgpIHt9XG4gIHNldENoYXJXaWR0aEFuZEJvdW5kcyh4V2lkdGgsIHlXaWR0aCwgbGx4LCBsbHksIHVyeCwgdXJ5KSB7XG4gICAgdGhpcy5jdHgucmVjdChsbHgsIGxseSwgdXJ4IC0gbGx4LCB1cnkgLSBsbHkpO1xuICAgIHRoaXMuY3R4LmNsaXAoKTtcbiAgICB0aGlzLmVuZFBhdGgoKTtcbiAgfVxuICBnZXRDb2xvck5fUGF0dGVybihJUikge1xuICAgIGxldCBwYXR0ZXJuO1xuICAgIGlmIChJUlswXSA9PT0gXCJUaWxpbmdQYXR0ZXJuXCIpIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gSVJbMV07XG4gICAgICBjb25zdCBiYXNlVHJhbnNmb3JtID0gdGhpcy5iYXNlVHJhbnNmb3JtIHx8IGdldEN1cnJlbnRUcmFuc2Zvcm0odGhpcy5jdHgpO1xuICAgICAgY29uc3QgY2FudmFzR3JhcGhpY3NGYWN0b3J5ID0ge1xuICAgICAgICBjcmVhdGVDYW52YXNHcmFwaGljczogY3R4ID0+IG5ldyBDYW52YXNHcmFwaGljcyhjdHgsIHRoaXMuY29tbW9uT2JqcywgdGhpcy5vYmpzLCB0aGlzLmNhbnZhc0ZhY3RvcnksIHRoaXMuZmlsdGVyRmFjdG9yeSwge1xuICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcsXG4gICAgICAgICAgbWFya2VkQ29udGVudFN0YWNrOiB0aGlzLm1hcmtlZENvbnRlbnRTdGFja1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICAgIHBhdHRlcm4gPSBuZXcgVGlsaW5nUGF0dGVybihJUiwgY29sb3IsIHRoaXMuY3R4LCBjYW52YXNHcmFwaGljc0ZhY3RvcnksIGJhc2VUcmFuc2Zvcm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXR0ZXJuID0gdGhpcy5fZ2V0UGF0dGVybihJUlsxXSwgSVJbMl0pO1xuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybjtcbiAgfVxuICBzZXRTdHJva2VDb2xvck4oKSB7XG4gICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gdGhpcy5nZXRDb2xvck5fUGF0dGVybihhcmd1bWVudHMpO1xuICB9XG4gIHNldEZpbGxDb2xvck4oKSB7XG4gICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IHRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTtcbiAgICB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwgPSB0cnVlO1xuICB9XG4gIHNldFN0cm9rZVJHQkNvbG9yKHIsIGcsIGIpIHtcbiAgICBjb25zdCBjb2xvciA9IFV0aWwubWFrZUhleENvbG9yKHIsIGcsIGIpO1xuICAgIHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG4gICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gY29sb3I7XG4gIH1cbiAgc2V0RmlsbFJHQkNvbG9yKHIsIGcsIGIpIHtcbiAgICBjb25zdCBjb2xvciA9IFV0aWwubWFrZUhleENvbG9yKHIsIGcsIGIpO1xuICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IGNvbG9yO1xuICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSBjb2xvcjtcbiAgICB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwgPSBmYWxzZTtcbiAgfVxuICBfZ2V0UGF0dGVybihvYmpJZCwgbWF0cml4ID0gbnVsbCkge1xuICAgIGxldCBwYXR0ZXJuO1xuICAgIGlmICh0aGlzLmNhY2hlZFBhdHRlcm5zLmhhcyhvYmpJZCkpIHtcbiAgICAgIHBhdHRlcm4gPSB0aGlzLmNhY2hlZFBhdHRlcm5zLmdldChvYmpJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdHRlcm4gPSBnZXRTaGFkaW5nUGF0dGVybih0aGlzLmdldE9iamVjdChvYmpJZCkpO1xuICAgICAgdGhpcy5jYWNoZWRQYXR0ZXJucy5zZXQob2JqSWQsIHBhdHRlcm4pO1xuICAgIH1cbiAgICBpZiAobWF0cml4KSB7XG4gICAgICBwYXR0ZXJuLm1hdHJpeCA9IG1hdHJpeDtcbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm47XG4gIH1cbiAgc2hhZGluZ0ZpbGwob2JqSWQpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuX2dldFBhdHRlcm4ob2JqSWQpO1xuICAgIGN0eC5maWxsU3R5bGUgPSBwYXR0ZXJuLmdldFBhdHRlcm4oY3R4LCB0aGlzLCBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShjdHgpLCBQYXRoVHlwZS5TSEFESU5HKTtcbiAgICBjb25zdCBpbnYgPSBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShjdHgpO1xuICAgIGlmIChpbnYpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgfSA9IGN0eC5jYW52YXM7XG4gICAgICBjb25zdCBbeDAsIHkwLCB4MSwgeTFdID0gVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgd2lkdGgsIGhlaWdodF0sIGludik7XG4gICAgICB0aGlzLmN0eC5maWxsUmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN0eC5maWxsUmVjdCgtMWUxMCwgLTFlMTAsIDJlMTAsIDJlMTApO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvc2UodGhpcy5jdXJyZW50LmdldENsaXBwZWRQYXRoQm91bmRpbmdCb3goKSk7XG4gICAgdGhpcy5yZXN0b3JlKCk7XG4gIH1cbiAgYmVnaW5JbmxpbmVJbWFnZSgpIHtcbiAgICB1bnJlYWNoYWJsZShcIlNob3VsZCBub3QgY2FsbCBiZWdpbklubGluZUltYWdlXCIpO1xuICB9XG4gIGJlZ2luSW1hZ2VEYXRhKCkge1xuICAgIHVucmVhY2hhYmxlKFwiU2hvdWxkIG5vdCBjYWxsIGJlZ2luSW1hZ2VEYXRhXCIpO1xuICB9XG4gIHBhaW50Rm9ybVhPYmplY3RCZWdpbihtYXRyaXgsIGJib3gpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLmJhc2VUcmFuc2Zvcm0pO1xuICAgIGlmIChtYXRyaXgpIHtcbiAgICAgIHRoaXMudHJhbnNmb3JtKC4uLm1hdHJpeCk7XG4gICAgfVxuICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0odGhpcy5jdHgpO1xuICAgIGlmIChiYm94KSB7XG4gICAgICBjb25zdCB3aWR0aCA9IGJib3hbMl0gLSBiYm94WzBdO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gYmJveFszXSAtIGJib3hbMV07XG4gICAgICB0aGlzLmN0eC5yZWN0KGJib3hbMF0sIGJib3hbMV0sIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5jdXJyZW50LnVwZGF0ZVJlY3RNaW5NYXgoZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLmN0eCksIGJib3gpO1xuICAgICAgdGhpcy5jbGlwKCk7XG4gICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICB9XG4gIH1cbiAgcGFpbnRGb3JtWE9iamVjdEVuZCgpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucG9wKCk7XG4gIH1cbiAgYmVnaW5Hcm91cChncm91cCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNhdmUoKTtcbiAgICBpZiAodGhpcy5pblNNYXNrTW9kZSkge1xuICAgICAgdGhpcy5lbmRTTWFza01vZGUoKTtcbiAgICAgIHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRDdHggPSB0aGlzLmN0eDtcbiAgICBpZiAoIWdyb3VwLmlzb2xhdGVkKSB7XG4gICAgICBpbmZvKFwiVE9ETzogU3VwcG9ydCBub24taXNvbGF0ZWQgZ3JvdXBzLlwiKTtcbiAgICB9XG4gICAgaWYgKGdyb3VwLmtub2Nrb3V0KSB7XG4gICAgICB3YXJuKFwiS25vY2tvdXQgZ3JvdXBzIG5vdCBzdXBwb3J0ZWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50VHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybShjdXJyZW50Q3R4KTtcbiAgICBpZiAoZ3JvdXAubWF0cml4KSB7XG4gICAgICBjdXJyZW50Q3R4LnRyYW5zZm9ybSguLi5ncm91cC5tYXRyaXgpO1xuICAgIH1cbiAgICBpZiAoIWdyb3VwLmJib3gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkJvdW5kaW5nIGJveCBpcyByZXF1aXJlZC5cIik7XG4gICAgfVxuICAgIGxldCBib3VuZHMgPSBVdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KGdyb3VwLmJib3gsIGdldEN1cnJlbnRUcmFuc2Zvcm0oY3VycmVudEN0eCkpO1xuICAgIGNvbnN0IGNhbnZhc0JvdW5kcyA9IFswLCAwLCBjdXJyZW50Q3R4LmNhbnZhcy53aWR0aCwgY3VycmVudEN0eC5jYW52YXMuaGVpZ2h0XTtcbiAgICBib3VuZHMgPSBVdGlsLmludGVyc2VjdChib3VuZHMsIGNhbnZhc0JvdW5kcykgfHwgWzAsIDAsIDAsIDBdO1xuICAgIGNvbnN0IG9mZnNldFggPSBNYXRoLmZsb29yKGJvdW5kc1swXSk7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IoYm91bmRzWzFdKTtcbiAgICBjb25zdCBkcmF3bldpZHRoID0gTWF0aC5tYXgoTWF0aC5jZWlsKGJvdW5kc1syXSkgLSBvZmZzZXRYLCAxKTtcbiAgICBjb25zdCBkcmF3bkhlaWdodCA9IE1hdGgubWF4KE1hdGguY2VpbChib3VuZHNbM10pIC0gb2Zmc2V0WSwgMSk7XG4gICAgdGhpcy5jdXJyZW50LnN0YXJ0TmV3UGF0aEFuZENsaXBCb3goWzAsIDAsIGRyYXduV2lkdGgsIGRyYXduSGVpZ2h0XSk7XG4gICAgbGV0IGNhY2hlSWQgPSBcImdyb3VwQXRcIiArIHRoaXMuZ3JvdXBMZXZlbDtcbiAgICBpZiAoZ3JvdXAuc21hc2spIHtcbiAgICAgIGNhY2hlSWQgKz0gXCJfc21hc2tfXCIgKyB0aGlzLnNtYXNrQ291bnRlcisrICUgMjtcbiAgICB9XG4gICAgY29uc3Qgc2NyYXRjaENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKGNhY2hlSWQsIGRyYXduV2lkdGgsIGRyYXduSGVpZ2h0KTtcbiAgICBjb25zdCBncm91cEN0eCA9IHNjcmF0Y2hDYW52YXMuY29udGV4dDtcbiAgICBncm91cEN0eC50cmFuc2xhdGUoLW9mZnNldFgsIC1vZmZzZXRZKTtcbiAgICBncm91cEN0eC50cmFuc2Zvcm0oLi4uY3VycmVudFRyYW5zZm9ybSk7XG4gICAgaWYgKGdyb3VwLnNtYXNrKSB7XG4gICAgICB0aGlzLnNtYXNrU3RhY2sucHVzaCh7XG4gICAgICAgIGNhbnZhczogc2NyYXRjaENhbnZhcy5jYW52YXMsXG4gICAgICAgIGNvbnRleHQ6IGdyb3VwQ3R4LFxuICAgICAgICBvZmZzZXRYLFxuICAgICAgICBvZmZzZXRZLFxuICAgICAgICBzdWJ0eXBlOiBncm91cC5zbWFzay5zdWJ0eXBlLFxuICAgICAgICBiYWNrZHJvcDogZ3JvdXAuc21hc2suYmFja2Ryb3AsXG4gICAgICAgIHRyYW5zZmVyTWFwOiBncm91cC5zbWFzay50cmFuc2Zlck1hcCB8fCBudWxsLFxuICAgICAgICBzdGFydFRyYW5zZm9ybUludmVyc2U6IG51bGxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Q3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIGN1cnJlbnRDdHgudHJhbnNsYXRlKG9mZnNldFgsIG9mZnNldFkpO1xuICAgICAgY3VycmVudEN0eC5zYXZlKCk7XG4gICAgfVxuICAgIGNvcHlDdHhTdGF0ZShjdXJyZW50Q3R4LCBncm91cEN0eCk7XG4gICAgdGhpcy5jdHggPSBncm91cEN0eDtcbiAgICB0aGlzLnNldEdTdGF0ZShbW1wiQk1cIiwgXCJzb3VyY2Utb3ZlclwiXSwgW1wiY2FcIiwgMV0sIFtcIkNBXCIsIDFdXSk7XG4gICAgdGhpcy5ncm91cFN0YWNrLnB1c2goY3VycmVudEN0eCk7XG4gICAgdGhpcy5ncm91cExldmVsKys7XG4gIH1cbiAgZW5kR3JvdXAoZ3JvdXApIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ncm91cExldmVsLS07XG4gICAgY29uc3QgZ3JvdXBDdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBjdHggPSB0aGlzLmdyb3VwU3RhY2sucG9wKCk7XG4gICAgdGhpcy5jdHggPSBjdHg7XG4gICAgdGhpcy5jdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgaWYgKGdyb3VwLnNtYXNrKSB7XG4gICAgICB0aGlzLnRlbXBTTWFzayA9IHRoaXMuc21hc2tTdGFjay5wb3AoKTtcbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICBjb25zdCBjdXJyZW50TXR4ID0gZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLmN0eCk7XG4gICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSguLi5jdXJyZW50TXR4KTtcbiAgICAgIGNvbnN0IGRpcnR5Qm94ID0gVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgZ3JvdXBDdHguY2FudmFzLndpZHRoLCBncm91cEN0eC5jYW52YXMuaGVpZ2h0XSwgY3VycmVudE10eCk7XG4gICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UoZ3JvdXBDdHguY2FudmFzLCAwLCAwKTtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIHRoaXMuY29tcG9zZShkaXJ0eUJveCk7XG4gICAgfVxuICB9XG4gIGJlZ2luQW5ub3RhdGlvbihpZCwgcmVjdCwgdHJhbnNmb3JtLCBtYXRyaXgsIGhhc093bkNhbnZhcykge1xuICAgIHRoaXMuI3Jlc3RvcmVJbml0aWFsU3RhdGUoKTtcbiAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG4gICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGlmICh0aGlzLmJhc2VUcmFuc2Zvcm0pIHtcbiAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSguLi50aGlzLmJhc2VUcmFuc2Zvcm0pO1xuICAgIH1cbiAgICBpZiAocmVjdCkge1xuICAgICAgY29uc3Qgd2lkdGggPSByZWN0WzJdIC0gcmVjdFswXTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IHJlY3RbM10gLSByZWN0WzFdO1xuICAgICAgaWYgKGhhc093bkNhbnZhcyAmJiB0aGlzLmFubm90YXRpb25DYW52YXNNYXApIHtcbiAgICAgICAgdHJhbnNmb3JtID0gdHJhbnNmb3JtLnNsaWNlKCk7XG4gICAgICAgIHRyYW5zZm9ybVs0XSAtPSByZWN0WzBdO1xuICAgICAgICB0cmFuc2Zvcm1bNV0gLT0gcmVjdFsxXTtcbiAgICAgICAgcmVjdCA9IHJlY3Quc2xpY2UoKTtcbiAgICAgICAgcmVjdFswXSA9IHJlY3RbMV0gPSAwO1xuICAgICAgICByZWN0WzJdID0gd2lkdGg7XG4gICAgICAgIHJlY3RbM10gPSBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IFtzY2FsZVgsIHNjYWxlWV0gPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGdldEN1cnJlbnRUcmFuc2Zvcm0odGhpcy5jdHgpKTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHZpZXdwb3J0U2NhbGVcbiAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gTWF0aC5jZWlsKHdpZHRoICogdGhpcy5vdXRwdXRTY2FsZVggKiB2aWV3cG9ydFNjYWxlKTtcbiAgICAgICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gTWF0aC5jZWlsKGhlaWdodCAqIHRoaXMub3V0cHV0U2NhbGVZICogdmlld3BvcnRTY2FsZSk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhcyA9IHRoaXMuY2FudmFzRmFjdG9yeS5jcmVhdGUoY2FudmFzV2lkdGgsIGNhbnZhc0hlaWdodCk7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBjYW52YXMsXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICB9ID0gdGhpcy5hbm5vdGF0aW9uQ2FudmFzO1xuICAgICAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAuc2V0KGlkLCBjYW52YXMpO1xuICAgICAgICB0aGlzLmFubm90YXRpb25DYW52YXMuc2F2ZWRDdHggPSB0aGlzLmN0eDtcbiAgICAgICAgdGhpcy5jdHggPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybShzY2FsZVgsIDAsIDAsIC1zY2FsZVksIDAsIGhlaWdodCAqIHNjYWxlWSk7XG4gICAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICAgICAgdGhpcy5jdHgucmVjdChyZWN0WzBdLCByZWN0WzFdLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5jdHguY2xpcCgpO1xuICAgICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLnRyYW5zZm9ybSguLi50cmFuc2Zvcm0pO1xuICAgIHRoaXMudHJhbnNmb3JtKC4uLm1hdHJpeCk7XG4gIH1cbiAgZW5kQW5ub3RhdGlvbigpIHtcbiAgICBpZiAodGhpcy5hbm5vdGF0aW9uQ2FudmFzKSB7XG4gICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICB0aGlzLiNkcmF3RmlsdGVyKCk7XG4gICAgICB0aGlzLmN0eCA9IHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eDtcbiAgICAgIGRlbGV0ZSB0aGlzLmFubm90YXRpb25DYW52YXMuc2F2ZWRDdHg7XG4gICAgICBkZWxldGUgdGhpcy5hbm5vdGF0aW9uQ2FudmFzO1xuICAgIH1cbiAgfVxuICBwYWludEltYWdlTWFza1hPYmplY3QoaW1nKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvdW50ID0gaW1nLmNvdW50O1xuICAgIGltZyA9IHRoaXMuZ2V0T2JqZWN0KGltZy5kYXRhLCBpbWcpO1xuICAgIGltZy5jb3VudCA9IGNvdW50O1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGdseXBoID0gdGhpcy5wcm9jZXNzaW5nVHlwZTM7XG4gICAgaWYgKGdseXBoKSB7XG4gICAgICBpZiAoZ2x5cGguY29tcGlsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBnbHlwaC5jb21waWxlZCA9IGNvbXBpbGVUeXBlM0dseXBoKGltZyk7XG4gICAgICB9XG4gICAgICBpZiAoZ2x5cGguY29tcGlsZWQpIHtcbiAgICAgICAgZ2x5cGguY29tcGlsZWQoY3R4KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtYXNrID0gdGhpcy5fY3JlYXRlTWFza0NhbnZhcyhpbWcpO1xuICAgIGNvbnN0IG1hc2tDYW52YXMgPSBtYXNrLmNhbnZhcztcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgY3R4LmRyYXdJbWFnZShtYXNrQ2FudmFzLCBtYXNrLm9mZnNldFgsIG1hc2sub2Zmc2V0WSk7XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgICB0aGlzLmNvbXBvc2UoKTtcbiAgfVxuICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQoaW1nLCBzY2FsZVgsIHNrZXdYID0gMCwgc2tld1kgPSAwLCBzY2FsZVksIHBvc2l0aW9ucykge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbWcgPSB0aGlzLmdldE9iamVjdChpbWcuZGF0YSwgaW1nKTtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjdHguc2F2ZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCk7XG4gICAgY3R4LnRyYW5zZm9ybShzY2FsZVgsIHNrZXdYLCBza2V3WSwgc2NhbGVZLCAwLCAwKTtcbiAgICBjb25zdCBtYXNrID0gdGhpcy5fY3JlYXRlTWFza0NhbnZhcyhpbWcpO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgbWFzay5vZmZzZXRYIC0gY3VycmVudFRyYW5zZm9ybVs0XSwgbWFzay5vZmZzZXRZIC0gY3VycmVudFRyYW5zZm9ybVs1XSk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIGNvbnN0IHRyYW5zID0gVXRpbC50cmFuc2Zvcm0oY3VycmVudFRyYW5zZm9ybSwgW3NjYWxlWCwgc2tld1gsIHNrZXdZLCBzY2FsZVksIHBvc2l0aW9uc1tpXSwgcG9zaXRpb25zW2kgKyAxXV0pO1xuICAgICAgY29uc3QgW3gsIHldID0gVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgMF0sIHRyYW5zKTtcbiAgICAgIGN0eC5kcmF3SW1hZ2UobWFzay5jYW52YXMsIHgsIHkpO1xuICAgIH1cbiAgICBjdHgucmVzdG9yZSgpO1xuICAgIHRoaXMuY29tcG9zZSgpO1xuICB9XG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwKGltYWdlcykge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgIGNvbnN0IGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7XG4gICAgZm9yIChjb25zdCBpbWFnZSBvZiBpbWFnZXMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YSxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgdHJhbnNmb3JtXG4gICAgICB9ID0gaW1hZ2U7XG4gICAgICBjb25zdCBtYXNrQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJtYXNrQ2FudmFzXCIsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3QgbWFza0N0eCA9IG1hc2tDYW52YXMuY29udGV4dDtcbiAgICAgIG1hc2tDdHguc2F2ZSgpO1xuICAgICAgY29uc3QgaW1nID0gdGhpcy5nZXRPYmplY3QoZGF0YSwgaW1hZ2UpO1xuICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKG1hc2tDdHgsIGltZyk7XG4gICAgICBtYXNrQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLWluXCI7XG4gICAgICBtYXNrQ3R4LmZpbGxTdHlsZSA9IGlzUGF0dGVybkZpbGwgPyBmaWxsQ29sb3IuZ2V0UGF0dGVybihtYXNrQ3R4LCB0aGlzLCBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShjdHgpLCBQYXRoVHlwZS5GSUxMKSA6IGZpbGxDb2xvcjtcbiAgICAgIG1hc2tDdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBtYXNrQ3R4LnJlc3RvcmUoKTtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjdHgudHJhbnNmb3JtKC4uLnRyYW5zZm9ybSk7XG4gICAgICBjdHguc2NhbGUoMSwgLTEpO1xuICAgICAgZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKGN0eCwgbWFza0NhbnZhcy5jYW52YXMsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIC0xLCAxLCAxKTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9zZSgpO1xuICB9XG4gIHBhaW50SW1hZ2VYT2JqZWN0KG9iaklkKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGltZ0RhdGEgPSB0aGlzLmdldE9iamVjdChvYmpJZCk7XG4gICAgaWYgKCFpbWdEYXRhKSB7XG4gICAgICB3YXJuKFwiRGVwZW5kZW50IGltYWdlIGlzbid0IHJlYWR5IHlldFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhKTtcbiAgfVxuICBwYWludEltYWdlWE9iamVjdFJlcGVhdChvYmpJZCwgc2NhbGVYLCBzY2FsZVksIHBvc2l0aW9ucykge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbWdEYXRhID0gdGhpcy5nZXRPYmplY3Qob2JqSWQpO1xuICAgIGlmICghaW1nRGF0YSkge1xuICAgICAgd2FybihcIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHdpZHRoID0gaW1nRGF0YS53aWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDtcbiAgICBjb25zdCBtYXAgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgbWFwLnB1c2goe1xuICAgICAgICB0cmFuc2Zvcm06IFtzY2FsZVgsIDAsIDAsIHNjYWxlWSwgcG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdXSxcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgdzogd2lkdGgsXG4gICAgICAgIGg6IGhlaWdodFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cChpbWdEYXRhLCBtYXApO1xuICB9XG4gIGFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXMoY3R4KSB7XG4gICAgaWYgKHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgIT09IFwibm9uZVwiKSB7XG4gICAgICBjdHguZmlsdGVyID0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcztcbiAgICAgIGN0eC5kcmF3SW1hZ2UoY3R4LmNhbnZhcywgMCwgMCk7XG4gICAgICBjdHguZmlsdGVyID0gXCJub25lXCI7XG4gICAgfVxuICAgIHJldHVybiBjdHguY2FudmFzO1xuICB9XG4gIGFwcGx5VHJhbnNmZXJNYXBzVG9CaXRtYXAoaW1nRGF0YSkge1xuICAgIGlmICh0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzID09PSBcIm5vbmVcIikge1xuICAgICAgcmV0dXJuIGltZ0RhdGEuYml0bWFwO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBiaXRtYXAsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBpbWdEYXRhO1xuICAgIGNvbnN0IHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgd2lkdGgsIGhlaWdodCk7XG4gICAgY29uc3QgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgdG1wQ3R4LmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHM7XG4gICAgdG1wQ3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApO1xuICAgIHRtcEN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICByZXR1cm4gdG1wQ2FudmFzLmNhbnZhcztcbiAgfVxuICBwYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHdpZHRoID0gaW1nRGF0YS53aWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICB0aGlzLnNhdmUoKTtcbiAgICBpZiAoIWlzTm9kZUpTKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZpbHRlclxuICAgICAgfSA9IGN0eDtcbiAgICAgIGlmIChmaWx0ZXIgIT09IFwibm9uZVwiICYmIGZpbHRlciAhPT0gXCJcIikge1xuICAgICAgICBjdHguZmlsdGVyID0gXCJub25lXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGN0eC5zY2FsZSgxIC8gd2lkdGgsIC0xIC8gaGVpZ2h0KTtcbiAgICBsZXQgaW1nVG9QYWludDtcbiAgICBpZiAoaW1nRGF0YS5iaXRtYXApIHtcbiAgICAgIGltZ1RvUGFpbnQgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9CaXRtYXAoaW1nRGF0YSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgPT09IFwiZnVuY3Rpb25cIiAmJiBpbWdEYXRhIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgIWltZ0RhdGEuZGF0YSkge1xuICAgICAgaW1nVG9QYWludCA9IGltZ0RhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICAgIHB1dEJpbmFyeUltYWdlRGF0YSh0bXBDdHgsIGltZ0RhdGEpO1xuICAgICAgaW1nVG9QYWludCA9IHRoaXMuYXBwbHlUcmFuc2Zlck1hcHNUb0NhbnZhcyh0bXBDdHgpO1xuICAgIH1cbiAgICBjb25zdCBzY2FsZWQgPSB0aGlzLl9zY2FsZUltYWdlKGltZ1RvUGFpbnQsIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCkpO1xuICAgIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpLCBpbWdEYXRhLmludGVycG9sYXRlKTtcbiAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoY3R4LCBzY2FsZWQuaW1nLCAwLCAwLCBzY2FsZWQucGFpbnRXaWR0aCwgc2NhbGVkLnBhaW50SGVpZ2h0LCAwLCAtaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgfVxuICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKGltZ0RhdGEsIG1hcCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBsZXQgaW1nVG9QYWludDtcbiAgICBpZiAoaW1nRGF0YS5iaXRtYXApIHtcbiAgICAgIGltZ1RvUGFpbnQgPSBpbWdEYXRhLmJpdG1hcDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdyA9IGltZ0RhdGEud2lkdGg7XG4gICAgICBjb25zdCBoID0gaW1nRGF0YS5oZWlnaHQ7XG4gICAgICBjb25zdCB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlubGluZUltYWdlXCIsIHcsIGgpO1xuICAgICAgY29uc3QgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgICBwdXRCaW5hcnlJbWFnZURhdGEodG1wQ3R4LCBpbWdEYXRhKTtcbiAgICAgIGltZ1RvUGFpbnQgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXModG1wQ3R4KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBtYXApIHtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjdHgudHJhbnNmb3JtKC4uLmVudHJ5LnRyYW5zZm9ybSk7XG4gICAgICBjdHguc2NhbGUoMSwgLTEpO1xuICAgICAgZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKGN0eCwgaW1nVG9QYWludCwgZW50cnkueCwgZW50cnkueSwgZW50cnkudywgZW50cnkuaCwgMCwgLTEsIDEsIDEpO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gIH1cbiAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTtcbiAgICB0aGlzLmNvbXBvc2UoKTtcbiAgfVxuICBtYXJrUG9pbnQodGFnKSB7fVxuICBtYXJrUG9pbnRQcm9wcyh0YWcsIHByb3BlcnRpZXMpIHt9XG4gIGJlZ2luTWFya2VkQ29udGVudCh0YWcpIHtcbiAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHtcbiAgICAgIHZpc2libGU6IHRydWVcbiAgICB9KTtcbiAgfVxuICBiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyh0YWcsIHByb3BlcnRpZXMpIHtcbiAgICBpZiAodGFnID09PSBcIk9DXCIpIHtcbiAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe1xuICAgICAgICB2aXNpYmxlOiB0aGlzLm9wdGlvbmFsQ29udGVudENvbmZpZy5pc1Zpc2libGUocHJvcGVydGllcylcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHtcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcbiAgfVxuICBlbmRNYXJrZWRDb250ZW50KCkge1xuICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnBvcCgpO1xuICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcbiAgfVxuICBiZWdpbkNvbXBhdCgpIHt9XG4gIGVuZENvbXBhdCgpIHt9XG4gIGNvbnN1bWVQYXRoKGNsaXBCb3gpIHtcbiAgICBjb25zdCBpc0VtcHR5ID0gdGhpcy5jdXJyZW50LmlzRW1wdHlDbGlwKCk7XG4gICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgIHRoaXMuY3VycmVudC51cGRhdGVDbGlwRnJvbVBhdGgoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICB0aGlzLmNvbXBvc2UoY2xpcEJveCk7XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICBpZiAoIWlzRW1wdHkpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXAgPT09IEVPX0NMSVApIHtcbiAgICAgICAgICBjdHguY2xpcChcImV2ZW5vZGRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3R4LmNsaXAoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudC5zdGFydE5ld1BhdGhBbmRDbGlwQm94KHRoaXMuY3VycmVudC5jbGlwQm94KTtcbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gIH1cbiAgZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpIHtcbiAgICBpZiAoIXRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGgpIHtcbiAgICAgIGNvbnN0IG0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY3R4KTtcbiAgICAgIGlmIChtWzFdID09PSAwICYmIG1bMl0gPT09IDApIHtcbiAgICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IDEgLyBNYXRoLm1pbihNYXRoLmFicyhtWzBdKSwgTWF0aC5hYnMobVszXSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYWJzRGV0ID0gTWF0aC5hYnMobVswXSAqIG1bM10gLSBtWzJdICogbVsxXSk7XG4gICAgICAgIGNvbnN0IG5vcm1YID0gTWF0aC5oeXBvdChtWzBdLCBtWzJdKTtcbiAgICAgICAgY29uc3Qgbm9ybVkgPSBNYXRoLmh5cG90KG1bMV0sIG1bM10pO1xuICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gTWF0aC5tYXgobm9ybVgsIG5vcm1ZKSAvIGFic0RldDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg7XG4gIH1cbiAgZ2V0U2NhbGVGb3JTdHJva2luZygpIHtcbiAgICBpZiAodGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9PT0gLTEpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGluZVdpZHRoXG4gICAgICB9ID0gdGhpcy5jdXJyZW50O1xuICAgICAgY29uc3Qge1xuICAgICAgICBhLFxuICAgICAgICBiLFxuICAgICAgICBjLFxuICAgICAgICBkXG4gICAgICB9ID0gdGhpcy5jdHguZ2V0VHJhbnNmb3JtKCk7XG4gICAgICBsZXQgc2NhbGVYLCBzY2FsZVk7XG4gICAgICBpZiAoYiA9PT0gMCAmJiBjID09PSAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1YID0gTWF0aC5hYnMoYSk7XG4gICAgICAgIGNvbnN0IG5vcm1ZID0gTWF0aC5hYnMoZCk7XG4gICAgICAgIGlmIChub3JtWCA9PT0gbm9ybVkpIHtcbiAgICAgICAgICBpZiAobGluZVdpZHRoID09PSAwKSB7XG4gICAgICAgICAgICBzY2FsZVggPSBzY2FsZVkgPSAxIC8gbm9ybVg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlZExpbmVXaWR0aCA9IG5vcm1YICogbGluZVdpZHRoO1xuICAgICAgICAgICAgc2NhbGVYID0gc2NhbGVZID0gc2NhbGVkTGluZVdpZHRoIDwgMSA/IDEgLyBzY2FsZWRMaW5lV2lkdGggOiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChsaW5lV2lkdGggPT09IDApIHtcbiAgICAgICAgICBzY2FsZVggPSAxIC8gbm9ybVg7XG4gICAgICAgICAgc2NhbGVZID0gMSAvIG5vcm1ZO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjYWxlZFhMaW5lV2lkdGggPSBub3JtWCAqIGxpbmVXaWR0aDtcbiAgICAgICAgICBjb25zdCBzY2FsZWRZTGluZVdpZHRoID0gbm9ybVkgKiBsaW5lV2lkdGg7XG4gICAgICAgICAgc2NhbGVYID0gc2NhbGVkWExpbmVXaWR0aCA8IDEgPyAxIC8gc2NhbGVkWExpbmVXaWR0aCA6IDE7XG4gICAgICAgICAgc2NhbGVZID0gc2NhbGVkWUxpbmVXaWR0aCA8IDEgPyAxIC8gc2NhbGVkWUxpbmVXaWR0aCA6IDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFic0RldCA9IE1hdGguYWJzKGEgKiBkIC0gYiAqIGMpO1xuICAgICAgICBjb25zdCBub3JtWCA9IE1hdGguaHlwb3QoYSwgYik7XG4gICAgICAgIGNvbnN0IG5vcm1ZID0gTWF0aC5oeXBvdChjLCBkKTtcbiAgICAgICAgaWYgKGxpbmVXaWR0aCA9PT0gMCkge1xuICAgICAgICAgIHNjYWxlWCA9IG5vcm1ZIC8gYWJzRGV0O1xuICAgICAgICAgIHNjYWxlWSA9IG5vcm1YIC8gYWJzRGV0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGJhc2VBcmVhID0gbGluZVdpZHRoICogYWJzRGV0O1xuICAgICAgICAgIHNjYWxlWCA9IG5vcm1ZID4gYmFzZUFyZWEgPyBub3JtWSAvIGJhc2VBcmVhIDogMTtcbiAgICAgICAgICBzY2FsZVkgPSBub3JtWCA+IGJhc2VBcmVhID8gbm9ybVggLyBiYXNlQXJlYSA6IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPSBzY2FsZVg7XG4gICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzFdID0gc2NhbGVZO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZztcbiAgfVxuICByZXNjYWxlQW5kU3Ryb2tlKHNhdmVSZXN0b3JlKSB7XG4gICAgY29uc3Qge1xuICAgICAgY3R4XG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qge1xuICAgICAgbGluZVdpZHRoXG4gICAgfSA9IHRoaXMuY3VycmVudDtcbiAgICBjb25zdCBbc2NhbGVYLCBzY2FsZVldID0gdGhpcy5nZXRTY2FsZUZvclN0cm9raW5nKCk7XG4gICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aCB8fCAxO1xuICAgIGlmIChzY2FsZVggPT09IDEgJiYgc2NhbGVZID09PSAxKSB7XG4gICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRhc2hlcyA9IGN0eC5nZXRMaW5lRGFzaCgpO1xuICAgIGlmIChzYXZlUmVzdG9yZSkge1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICB9XG4gICAgY3R4LnNjYWxlKHNjYWxlWCwgc2NhbGVZKTtcbiAgICBpZiAoZGFzaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5tYXgoc2NhbGVYLCBzY2FsZVkpO1xuICAgICAgY3R4LnNldExpbmVEYXNoKGRhc2hlcy5tYXAoeCA9PiB4IC8gc2NhbGUpKTtcbiAgICAgIGN0eC5saW5lRGFzaE9mZnNldCAvPSBzY2FsZTtcbiAgICB9XG4gICAgY3R4LnN0cm9rZSgpO1xuICAgIGlmIChzYXZlUmVzdG9yZSkge1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gIH1cbiAgaXNDb250ZW50VmlzaWJsZSgpIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5tYXJrZWRDb250ZW50U3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICghdGhpcy5tYXJrZWRDb250ZW50U3RhY2tbaV0udmlzaWJsZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5mb3IgKGNvbnN0IG9wIGluIE9QUykge1xuICBpZiAoQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW29wXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW09QU1tvcF1dID0gQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW29wXTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS93b3JrZXJfb3B0aW9ucy5qc1xuY2xhc3MgR2xvYmFsV29ya2VyT3B0aW9ucyB7XG4gIHN0YXRpYyAjcG9ydCA9IG51bGw7XG4gIHN0YXRpYyAjc3JjID0gXCJcIjtcbiAgc3RhdGljIGdldCB3b3JrZXJQb3J0KCkge1xuICAgIHJldHVybiB0aGlzLiNwb3J0O1xuICB9XG4gIHN0YXRpYyBzZXQgd29ya2VyUG9ydCh2YWwpIHtcbiAgICBpZiAoISh0eXBlb2YgV29ya2VyICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbCBpbnN0YW5jZW9mIFdvcmtlcikgJiYgdmFsICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGB3b3JrZXJQb3J0YCB0eXBlLlwiKTtcbiAgICB9XG4gICAgdGhpcy4jcG9ydCA9IHZhbDtcbiAgfVxuICBzdGF0aWMgZ2V0IHdvcmtlclNyYygpIHtcbiAgICByZXR1cm4gdGhpcy4jc3JjO1xuICB9XG4gIHN0YXRpYyBzZXQgd29ya2VyU3JjKHZhbCkge1xuICAgIGlmICh0eXBlb2YgdmFsICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGB3b3JrZXJTcmNgIHR5cGUuXCIpO1xuICAgIH1cbiAgICB0aGlzLiNzcmMgPSB2YWw7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3NoYXJlZC9tZXNzYWdlX2hhbmRsZXIuanNcblxuY29uc3QgQ2FsbGJhY2tLaW5kID0ge1xuICBVTktOT1dOOiAwLFxuICBEQVRBOiAxLFxuICBFUlJPUjogMlxufTtcbmNvbnN0IFN0cmVhbUtpbmQgPSB7XG4gIFVOS05PV046IDAsXG4gIENBTkNFTDogMSxcbiAgQ0FOQ0VMX0NPTVBMRVRFOiAyLFxuICBDTE9TRTogMyxcbiAgRU5RVUVVRTogNCxcbiAgRVJST1I6IDUsXG4gIFBVTEw6IDYsXG4gIFBVTExfQ09NUExFVEU6IDcsXG4gIFNUQVJUX0NPTVBMRVRFOiA4XG59O1xuZnVuY3Rpb24gd3JhcFJlYXNvbihyZWFzb24pIHtcbiAgaWYgKCEocmVhc29uIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIHJlYXNvbiA9PT0gXCJvYmplY3RcIiAmJiByZWFzb24gIT09IG51bGwpKSB7XG4gICAgdW5yZWFjaGFibGUoJ3dyYXBSZWFzb246IEV4cGVjdGVkIFwicmVhc29uXCIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nKTtcbiAgfVxuICBzd2l0Y2ggKHJlYXNvbi5uYW1lKSB7XG4gICAgY2FzZSBcIkFib3J0RXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IEFib3J0RXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKTtcbiAgICBjYXNlIFwiTWlzc2luZ1BERkV4Y2VwdGlvblwiOlxuICAgICAgcmV0dXJuIG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKTtcbiAgICBjYXNlIFwiUGFzc3dvcmRFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgUGFzc3dvcmRFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5jb2RlKTtcbiAgICBjYXNlIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLnN0YXR1cyk7XG4gICAgY2FzZSBcIlVua25vd25FcnJvckV4Y2VwdGlvblwiOlxuICAgICAgcmV0dXJuIG5ldyBVbmtub3duRXJyb3JFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5kZXRhaWxzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG5ldyBVbmtub3duRXJyb3JFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi50b1N0cmluZygpKTtcbiAgfVxufVxuY2xhc3MgTWVzc2FnZUhhbmRsZXIge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2VOYW1lLCB0YXJnZXROYW1lLCBjb21PYmopIHtcbiAgICB0aGlzLnNvdXJjZU5hbWUgPSBzb3VyY2VOYW1lO1xuICAgIHRoaXMudGFyZ2V0TmFtZSA9IHRhcmdldE5hbWU7XG4gICAgdGhpcy5jb21PYmogPSBjb21PYmo7XG4gICAgdGhpcy5jYWxsYmFja0lkID0gMTtcbiAgICB0aGlzLnN0cmVhbUlkID0gMTtcbiAgICB0aGlzLnN0cmVhbVNpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLmFjdGlvbkhhbmRsZXIgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGE7XG4gICAgICBpZiAoZGF0YS50YXJnZXROYW1lICE9PSB0aGlzLnNvdXJjZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuc3RyZWFtKSB7XG4gICAgICAgIHRoaXMuI3Byb2Nlc3NTdHJlYW1NZXNzYWdlKGRhdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5jYWxsYmFjaykge1xuICAgICAgICBjb25zdCBjYWxsYmFja0lkID0gZGF0YS5jYWxsYmFja0lkO1xuICAgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTtcbiAgICAgICAgaWYgKCFjYXBhYmlsaXR5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVzb2x2ZSBjYWxsYmFjayAke2NhbGxiYWNrSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07XG4gICAgICAgIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuREFUQSkge1xuICAgICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZShkYXRhLmRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5FUlJPUikge1xuICAgICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2VcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5hY3Rpb25IYW5kbGVyW2RhdGEuYWN0aW9uXTtcbiAgICAgIGlmICghYWN0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhY3Rpb24gZnJvbSB3b3JrZXI6ICR7ZGF0YS5hY3Rpb259YCk7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5jYWxsYmFja0lkKSB7XG4gICAgICAgIGNvbnN0IGNiU291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZTtcbiAgICAgICAgY29uc3QgY2JUYXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lO1xuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSkpO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLFxuICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5EQVRBLFxuICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLFxuICAgICAgICAgICAgZGF0YTogcmVzdWx0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLFxuICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5FUlJPUixcbiAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGRhdGEuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5zdHJlYW1JZCkge1xuICAgICAgICB0aGlzLiNjcmVhdGVTdHJlYW1TaW5rKGRhdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhY3Rpb24oZGF0YS5kYXRhKTtcbiAgICB9O1xuICAgIGNvbU9iai5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSk7XG4gIH1cbiAgb24oYWN0aW9uTmFtZSwgaGFuZGxlcikge1xuICAgIGNvbnN0IGFoID0gdGhpcy5hY3Rpb25IYW5kbGVyO1xuICAgIGlmIChhaFthY3Rpb25OYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFjdGlvbk5hbWUgY2FsbGVkIFwiJHthY3Rpb25OYW1lfVwiYCk7XG4gICAgfVxuICAgIGFoW2FjdGlvbk5hbWVdID0gaGFuZGxlcjtcbiAgfVxuICBzZW5kKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykge1xuICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSxcbiAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSxcbiAgICAgIGRhdGFcbiAgICB9LCB0cmFuc2ZlcnMpO1xuICB9XG4gIHNlbmRXaXRoUHJvbWlzZShhY3Rpb25OYW1lLCBkYXRhLCB0cmFuc2ZlcnMpIHtcbiAgICBjb25zdCBjYWxsYmFja0lkID0gdGhpcy5jYWxsYmFja0lkKys7XG4gICAgY29uc3QgY2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF0gPSBjYXBhYmlsaXR5O1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSxcbiAgICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLFxuICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsXG4gICAgICAgIGNhbGxiYWNrSWQsXG4gICAgICAgIGRhdGFcbiAgICAgIH0sIHRyYW5zZmVycyk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGNhcGFiaWxpdHkucmVqZWN0KGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBzZW5kV2l0aFN0cmVhbShhY3Rpb25OYW1lLCBkYXRhLCBxdWV1ZWluZ1N0cmF0ZWd5LCB0cmFuc2ZlcnMpIHtcbiAgICBjb25zdCBzdHJlYW1JZCA9IHRoaXMuc3RyZWFtSWQrKyxcbiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICB0YXJnZXROYW1lID0gdGhpcy50YXJnZXROYW1lLFxuICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7XG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICBzdGFydDogY29udHJvbGxlciA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSA9IHtcbiAgICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICAgIHN0YXJ0Q2FsbDogc3RhcnRDYXBhYmlsaXR5LFxuICAgICAgICAgIHB1bGxDYWxsOiBudWxsLFxuICAgICAgICAgIGNhbmNlbENhbGw6IG51bGwsXG4gICAgICAgICAgaXNDbG9zZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplXG4gICAgICAgIH0sIHRyYW5zZmVycyk7XG4gICAgICAgIHJldHVybiBzdGFydENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBwdWxsOiBjb250cm9sbGVyID0+IHtcbiAgICAgICAgY29uc3QgcHVsbENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwgPSBwdWxsQ2FwYWJpbGl0eTtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTEwsXG4gICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwdWxsQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgfSxcbiAgICAgIGNhbmNlbDogcmVhc29uID0+IHtcbiAgICAgICAgYXNzZXJ0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCBcImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb25cIik7XG4gICAgICAgIGNvbnN0IGNhbmNlbENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbCA9IGNhbmNlbENhcGFiaWxpdHk7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTCxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNhbmNlbENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgIH1cbiAgICB9LCBxdWV1ZWluZ1N0cmF0ZWd5KTtcbiAgfVxuICAjY3JlYXRlU3RyZWFtU2luayhkYXRhKSB7XG4gICAgY29uc3Qgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkLFxuICAgICAgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSxcbiAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsXG4gICAgICBjb21PYmogPSB0aGlzLmNvbU9iajtcbiAgICBjb25zdCBzZWxmID0gdGhpcyxcbiAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07XG4gICAgY29uc3Qgc3RyZWFtU2luayA9IHtcbiAgICAgIGVucXVldWUoY2h1bmssIHNpemUgPSAxLCB0cmFuc2ZlcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFzdERlc2lyZWRTaXplID0gdGhpcy5kZXNpcmVkU2l6ZTtcbiAgICAgICAgdGhpcy5kZXNpcmVkU2l6ZSAtPSBzaXplO1xuICAgICAgICBpZiAobGFzdERlc2lyZWRTaXplID4gMCAmJiB0aGlzLmRlc2lyZWRTaXplIDw9IDApIHtcbiAgICAgICAgICB0aGlzLnNpbmtDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICAgICAgdGhpcy5yZWFkeSA9IHRoaXMuc2lua0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRU5RVUVVRSxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICBjaHVua1xuICAgICAgICB9LCB0cmFuc2ZlcnMpO1xuICAgICAgfSxcbiAgICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNMT1NFLFxuICAgICAgICAgIHN0cmVhbUlkXG4gICAgICAgIH0pO1xuICAgICAgICBkZWxldGUgc2VsZi5zdHJlYW1TaW5rc1tzdHJlYW1JZF07XG4gICAgICB9LFxuICAgICAgZXJyb3IocmVhc29uKSB7XG4gICAgICAgIGFzc2VydChyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgXCJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb25cIik7XG4gICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRVJST1IsXG4gICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgc2lua0NhcGFiaWxpdHk6IFByb21pc2Uud2l0aFJlc29sdmVycygpLFxuICAgICAgb25QdWxsOiBudWxsLFxuICAgICAgb25DYW5jZWw6IG51bGwsXG4gICAgICBpc0NhbmNlbGxlZDogZmFsc2UsXG4gICAgICBkZXNpcmVkU2l6ZTogZGF0YS5kZXNpcmVkU2l6ZSxcbiAgICAgIHJlYWR5OiBudWxsXG4gICAgfTtcbiAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICBzdHJlYW1TaW5rLnJlYWR5ID0gc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdID0gc3RyZWFtU2luaztcbiAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhLCBzdHJlYW1TaW5rKSk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsXG4gICAgICAgIHN0cmVhbUlkLFxuICAgICAgICBzdWNjZXNzOiB0cnVlXG4gICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsXG4gICAgICAgIHN0cmVhbUlkLFxuICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgI3Byb2Nlc3NTdHJlYW1NZXNzYWdlKGRhdGEpIHtcbiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsXG4gICAgICBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZSxcbiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqO1xuICAgIGNvbnN0IHN0cmVhbUNvbnRyb2xsZXIgPSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSxcbiAgICAgIHN0cmVhbVNpbmsgPSB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTtcbiAgICBzd2l0Y2ggKGRhdGEuc3RyZWFtKSB7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEU6XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnN0YXJ0Q2FsbC5yZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5zdGFydENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFOlxuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5wdWxsQ2FsbC5yZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5wdWxsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTEw6XG4gICAgICAgIGlmICghc3RyZWFtU2luaykge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLFxuICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cmVhbVNpbmsuZGVzaXJlZFNpemUgPD0gMCAmJiBkYXRhLmRlc2lyZWRTaXplID4gMCkge1xuICAgICAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbVNpbmsuZGVzaXJlZFNpemUgPSBkYXRhLmRlc2lyZWRTaXplO1xuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlc29sdmUoc3RyZWFtU2luay5vblB1bGw/LigpKTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLFxuICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuRU5RVUVVRTpcbiAgICAgICAgYXNzZXJ0KHN0cmVhbUNvbnRyb2xsZXIsIFwiZW5xdWV1ZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiKTtcbiAgICAgICAgaWYgKHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuZW5xdWV1ZShkYXRhLmNodW5rKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuQ0xPU0U6XG4gICAgICAgIGFzc2VydChzdHJlYW1Db250cm9sbGVyLCBcImNsb3NlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyXCIpO1xuICAgICAgICBpZiAoc3RyZWFtQ29udHJvbGxlci5pc0Nsb3NlZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgdGhpcy4jZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1Db250cm9sbGVyLCBzdHJlYW1JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkVSUk9SOlxuICAgICAgICBhc3NlcnQoc3RyZWFtQ29udHJvbGxlciwgXCJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiKTtcbiAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jb250cm9sbGVyLmVycm9yKHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcbiAgICAgICAgdGhpcy4jZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1Db250cm9sbGVyLCBzdHJlYW1JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURTpcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbC5yZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jYW5jZWxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1Db250cm9sbGVyLCBzdHJlYW1JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTDpcbiAgICAgICAgaWYgKCFzdHJlYW1TaW5rKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKHN0cmVhbVNpbmsub25DYW5jZWw/Lih3cmFwUmVhc29uKGRhdGEucmVhc29uKSkpO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLFxuICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLFxuICAgICAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICBzdHJlYW1TaW5rLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2VcIik7XG4gICAgfVxuICB9XG4gIGFzeW5jICNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtzdHJlYW1Db250cm9sbGVyLnN0YXJ0Q2FsbD8ucHJvbWlzZSwgc3RyZWFtQ29udHJvbGxlci5wdWxsQ2FsbD8ucHJvbWlzZSwgc3RyZWFtQ29udHJvbGxlci5jYW5jZWxDYWxsPy5wcm9taXNlXSk7XG4gICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5jb21PYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L21ldGFkYXRhLmpzXG5cbmNsYXNzIE1ldGFkYXRhIHtcbiAgI21ldGFkYXRhTWFwO1xuICAjZGF0YTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHBhcnNlZERhdGEsXG4gICAgcmF3RGF0YVxuICB9KSB7XG4gICAgdGhpcy4jbWV0YWRhdGFNYXAgPSBwYXJzZWREYXRhO1xuICAgIHRoaXMuI2RhdGEgPSByYXdEYXRhO1xuICB9XG4gIGdldFJhdygpIHtcbiAgICByZXR1cm4gdGhpcy4jZGF0YTtcbiAgfVxuICBnZXQobmFtZSkge1xuICAgIHJldHVybiB0aGlzLiNtZXRhZGF0YU1hcC5nZXQobmFtZSkgPz8gbnVsbDtcbiAgfVxuICBnZXRBbGwoKSB7XG4gICAgcmV0dXJuIG9iamVjdEZyb21NYXAodGhpcy4jbWV0YWRhdGFNYXApO1xuICB9XG4gIGhhcyhuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuI21ldGFkYXRhTWFwLmhhcyhuYW1lKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9vcHRpb25hbF9jb250ZW50X2NvbmZpZy5qc1xuXG5cbmNvbnN0IElOVEVSTkFMID0gU3ltYm9sKFwiSU5URVJOQUxcIik7XG5jbGFzcyBPcHRpb25hbENvbnRlbnRHcm91cCB7XG4gICNpc0Rpc3BsYXkgPSBmYWxzZTtcbiAgI2lzUHJpbnQgPSBmYWxzZTtcbiAgI3VzZXJTZXQgPSBmYWxzZTtcbiAgI3Zpc2libGUgPSB0cnVlO1xuICBjb25zdHJ1Y3RvcihyZW5kZXJpbmdJbnRlbnQsIHtcbiAgICBuYW1lLFxuICAgIGludGVudCxcbiAgICB1c2FnZVxuICB9KSB7XG4gICAgdGhpcy4jaXNEaXNwbGF5ID0gISEocmVuZGVyaW5nSW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZKTtcbiAgICB0aGlzLiNpc1ByaW50ID0gISEocmVuZGVyaW5nSW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCk7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmludGVudCA9IGludGVudDtcbiAgICB0aGlzLnVzYWdlID0gdXNhZ2U7XG4gIH1cbiAgZ2V0IHZpc2libGUoKSB7XG4gICAgaWYgKHRoaXMuI3VzZXJTZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLiN2aXNpYmxlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI3Zpc2libGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgcHJpbnQsXG4gICAgICB2aWV3XG4gICAgfSA9IHRoaXMudXNhZ2U7XG4gICAgaWYgKHRoaXMuI2lzRGlzcGxheSkge1xuICAgICAgcmV0dXJuIHZpZXc/LnZpZXdTdGF0ZSAhPT0gXCJPRkZcIjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2lzUHJpbnQpIHtcbiAgICAgIHJldHVybiBwcmludD8ucHJpbnRTdGF0ZSAhPT0gXCJPRkZcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgX3NldFZpc2libGUoaW50ZXJuYWwsIHZpc2libGUsIHVzZXJTZXQgPSBmYWxzZSkge1xuICAgIGlmIChpbnRlcm5hbCAhPT0gSU5URVJOQUwpIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiSW50ZXJuYWwgbWV0aG9kIGBfc2V0VmlzaWJsZWAgY2FsbGVkLlwiKTtcbiAgICB9XG4gICAgdGhpcy4jdXNlclNldCA9IHVzZXJTZXQ7XG4gICAgdGhpcy4jdmlzaWJsZSA9IHZpc2libGU7XG4gIH1cbn1cbmNsYXNzIE9wdGlvbmFsQ29udGVudENvbmZpZyB7XG4gICNjYWNoZWRHZXRIYXNoID0gbnVsbDtcbiAgI2dyb3VwcyA9IG5ldyBNYXAoKTtcbiAgI2luaXRpYWxIYXNoID0gbnVsbDtcbiAgI29yZGVyID0gbnVsbDtcbiAgY29uc3RydWN0b3IoZGF0YSwgcmVuZGVyaW5nSW50ZW50ID0gUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZKSB7XG4gICAgdGhpcy5yZW5kZXJpbmdJbnRlbnQgPSByZW5kZXJpbmdJbnRlbnQ7XG4gICAgdGhpcy5uYW1lID0gbnVsbDtcbiAgICB0aGlzLmNyZWF0b3IgPSBudWxsO1xuICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmNyZWF0b3IgPSBkYXRhLmNyZWF0b3I7XG4gICAgdGhpcy4jb3JkZXIgPSBkYXRhLm9yZGVyO1xuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZGF0YS5ncm91cHMpIHtcbiAgICAgIHRoaXMuI2dyb3Vwcy5zZXQoZ3JvdXAuaWQsIG5ldyBPcHRpb25hbENvbnRlbnRHcm91cChyZW5kZXJpbmdJbnRlbnQsIGdyb3VwKSk7XG4gICAgfVxuICAgIGlmIChkYXRhLmJhc2VTdGF0ZSA9PT0gXCJPRkZcIikge1xuICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLiNncm91cHMudmFsdWVzKCkpIHtcbiAgICAgICAgZ3JvdXAuX3NldFZpc2libGUoSU5URVJOQUwsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBvbiBvZiBkYXRhLm9uKSB7XG4gICAgICB0aGlzLiNncm91cHMuZ2V0KG9uKS5fc2V0VmlzaWJsZShJTlRFUk5BTCwgdHJ1ZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb2ZmIG9mIGRhdGEub2ZmKSB7XG4gICAgICB0aGlzLiNncm91cHMuZ2V0KG9mZikuX3NldFZpc2libGUoSU5URVJOQUwsIGZhbHNlKTtcbiAgICB9XG4gICAgdGhpcy4jaW5pdGlhbEhhc2ggPSB0aGlzLmdldEhhc2goKTtcbiAgfVxuICAjZXZhbHVhdGVWaXNpYmlsaXR5RXhwcmVzc2lvbihhcnJheSkge1xuICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdG9yID0gYXJyYXlbMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2ldO1xuICAgICAgbGV0IHN0YXRlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICAgICAgc3RhdGUgPSB0aGlzLiNldmFsdWF0ZVZpc2liaWxpdHlFeHByZXNzaW9uKGVsZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLiNncm91cHMuaGFzKGVsZW1lbnQpKSB7XG4gICAgICAgIHN0YXRlID0gdGhpcy4jZ3JvdXBzLmdldChlbGVtZW50KS52aXNpYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7ZWxlbWVudH1gKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgXCJBbmRcIjpcbiAgICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiT3JcIjpcbiAgICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk5vdFwiOlxuICAgICAgICAgIHJldHVybiAhc3RhdGU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcGVyYXRvciA9PT0gXCJBbmRcIjtcbiAgfVxuICBpc1Zpc2libGUoZ3JvdXApIHtcbiAgICBpZiAodGhpcy4jZ3JvdXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWdyb3VwKSB7XG4gICAgICBpbmZvKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZGVmaW5lZC5cIik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGdyb3VwLnR5cGUgPT09IFwiT0NHXCIpIHtcbiAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmhhcyhncm91cC5pZCkpIHtcbiAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7Z3JvdXAuaWR9YCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuI2dyb3Vwcy5nZXQoZ3JvdXAuaWQpLnZpc2libGU7XG4gICAgfSBlbHNlIGlmIChncm91cC50eXBlID09PSBcIk9DTURcIikge1xuICAgICAgaWYgKGdyb3VwLmV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V2YWx1YXRlVmlzaWJpbGl0eUV4cHJlc3Npb24oZ3JvdXAuZXhwcmVzc2lvbik7XG4gICAgICB9XG4gICAgICBpZiAoIWdyb3VwLnBvbGljeSB8fCBncm91cC5wb2xpY3kgPT09IFwiQW55T25cIikge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdyb3VwLmlkcykge1xuICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLiNncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09IFwiQWxsT25cIikge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdyb3VwLmlkcykge1xuICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmdldChpZCkudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSBcIkFueU9mZlwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09IFwiQWxsT2ZmXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy4jZ3JvdXBzLmdldChpZCkudmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHdhcm4oYFVua25vd24gb3B0aW9uYWwgY29udGVudCBwb2xpY3kgJHtncm91cC5wb2xpY3l9LmApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHdhcm4oYFVua25vd24gZ3JvdXAgdHlwZSAke2dyb3VwLnR5cGV9LmApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldFZpc2liaWxpdHkoaWQsIHZpc2libGUgPSB0cnVlKSB7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLiNncm91cHMuZ2V0KGlkKTtcbiAgICBpZiAoIWdyb3VwKSB7XG4gICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ3JvdXAuX3NldFZpc2libGUoSU5URVJOQUwsICEhdmlzaWJsZSwgdHJ1ZSk7XG4gICAgdGhpcy4jY2FjaGVkR2V0SGFzaCA9IG51bGw7XG4gIH1cbiAgc2V0T0NHU3RhdGUoe1xuICAgIHN0YXRlLFxuICAgIHByZXNlcnZlUkJcbiAgfSkge1xuICAgIGxldCBvcGVyYXRvcjtcbiAgICBmb3IgKGNvbnN0IGVsZW0gb2Ygc3RhdGUpIHtcbiAgICAgIHN3aXRjaCAoZWxlbSkge1xuICAgICAgICBjYXNlIFwiT05cIjpcbiAgICAgICAgY2FzZSBcIk9GRlwiOlxuICAgICAgICBjYXNlIFwiVG9nZ2xlXCI6XG4gICAgICAgICAgb3BlcmF0b3IgPSBlbGVtO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLiNncm91cHMuZ2V0KGVsZW0pO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSBcIk9OXCI6XG4gICAgICAgICAgZ3JvdXAuX3NldFZpc2libGUoSU5URVJOQUwsIHRydWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiT0ZGXCI6XG4gICAgICAgICAgZ3JvdXAuX3NldFZpc2libGUoSU5URVJOQUwsIGZhbHNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlRvZ2dsZVwiOlxuICAgICAgICAgIGdyb3VwLl9zZXRWaXNpYmxlKElOVEVSTkFMLCAhZ3JvdXAudmlzaWJsZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI2NhY2hlZEdldEhhc2ggPSBudWxsO1xuICB9XG4gIGdldCBoYXNJbml0aWFsVmlzaWJpbGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5pdGlhbEhhc2ggPT09IG51bGwgfHwgdGhpcy5nZXRIYXNoKCkgPT09IHRoaXMuI2luaXRpYWxIYXNoO1xuICB9XG4gIGdldE9yZGVyKCkge1xuICAgIGlmICghdGhpcy4jZ3JvdXBzLnNpemUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy4jb3JkZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLiNvcmRlci5zbGljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLnRoaXMuI2dyb3Vwcy5rZXlzKCldO1xuICB9XG4gIGdldEdyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy4jZ3JvdXBzLnNpemUgPiAwID8gb2JqZWN0RnJvbU1hcCh0aGlzLiNncm91cHMpIDogbnVsbDtcbiAgfVxuICBnZXRHcm91cChpZCkge1xuICAgIHJldHVybiB0aGlzLiNncm91cHMuZ2V0KGlkKSB8fCBudWxsO1xuICB9XG4gIGdldEhhc2goKSB7XG4gICAgaWYgKHRoaXMuI2NhY2hlZEdldEhhc2ggIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLiNjYWNoZWRHZXRIYXNoO1xuICAgIH1cbiAgICBjb25zdCBoYXNoID0gbmV3IE11cm11ckhhc2gzXzY0KCk7XG4gICAgZm9yIChjb25zdCBbaWQsIGdyb3VwXSBvZiB0aGlzLiNncm91cHMpIHtcbiAgICAgIGhhc2gudXBkYXRlKGAke2lkfToke2dyb3VwLnZpc2libGV9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNjYWNoZWRHZXRIYXNoID0gaGFzaC5oZXhkaWdlc3QoKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS90cmFuc3BvcnRfc3RyZWFtLmpzXG5cblxuY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKHBkZkRhdGFSYW5nZVRyYW5zcG9ydCwge1xuICAgIGRpc2FibGVSYW5nZSA9IGZhbHNlLFxuICAgIGRpc2FibGVTdHJlYW0gPSBmYWxzZVxuICB9KSB7XG4gICAgYXNzZXJ0KHBkZkRhdGFSYW5nZVRyYW5zcG9ydCwgJ1BERkRhdGFUcmFuc3BvcnRTdHJlYW0gLSBtaXNzaW5nIHJlcXVpcmVkIFwicGRmRGF0YVJhbmdlVHJhbnNwb3J0XCIgYXJndW1lbnQuJyk7XG4gICAgY29uc3Qge1xuICAgICAgbGVuZ3RoLFxuICAgICAgaW5pdGlhbERhdGEsXG4gICAgICBwcm9ncmVzc2l2ZURvbmUsXG4gICAgICBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZVxuICAgIH0gPSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQ7XG4gICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gW107XG4gICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gcHJvZ3Jlc3NpdmVEb25lO1xuICAgIHRoaXMuX2NvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU7XG4gICAgaWYgKGluaXRpYWxEYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBpbml0aWFsRGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgaW5pdGlhbERhdGEuYnl0ZUxlbmd0aCA9PT0gaW5pdGlhbERhdGEuYnVmZmVyLmJ5dGVMZW5ndGggPyBpbml0aWFsRGF0YS5idWZmZXIgOiBuZXcgVWludDhBcnJheShpbml0aWFsRGF0YSkuYnVmZmVyO1xuICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2goYnVmZmVyKTtcbiAgICB9XG4gICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0ID0gcGRmRGF0YVJhbmdlVHJhbnNwb3J0O1xuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIWRpc2FibGVTdHJlYW07XG4gICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFkaXNhYmxlUmFuZ2U7XG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IGxlbmd0aDtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fcmFuZ2VSZWFkZXJzID0gW107XG4gICAgcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFJhbmdlTGlzdGVuZXIoKGJlZ2luLCBjaHVuaykgPT4ge1xuICAgICAgdGhpcy5fb25SZWNlaXZlRGF0YSh7XG4gICAgICAgIGJlZ2luLFxuICAgICAgICBjaHVua1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzTGlzdGVuZXIoKGxvYWRlZCwgdG90YWwpID0+IHtcbiAgICAgIHRoaXMuX29uUHJvZ3Jlc3Moe1xuICAgICAgICBsb2FkZWQsXG4gICAgICAgIHRvdGFsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIoY2h1bmsgPT4ge1xuICAgICAgdGhpcy5fb25SZWNlaXZlRGF0YSh7XG4gICAgICAgIGNodW5rXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIoKCkgPT4ge1xuICAgICAgdGhpcy5fb25Qcm9ncmVzc2l2ZURvbmUoKTtcbiAgICB9KTtcbiAgICBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQudHJhbnNwb3J0UmVhZHkoKTtcbiAgfVxuICBfb25SZWNlaXZlRGF0YSh7XG4gICAgYmVnaW4sXG4gICAgY2h1bmtcbiAgfSkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGNodW5rIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBjaHVuay5ieXRlTGVuZ3RoID09PSBjaHVuay5idWZmZXIuYnl0ZUxlbmd0aCA/IGNodW5rLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KGNodW5rKS5idWZmZXI7XG4gICAgaWYgKGJlZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikge1xuICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5fZW5xdWV1ZShidWZmZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2goYnVmZmVyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZm91bmQgPSB0aGlzLl9yYW5nZVJlYWRlcnMuc29tZShmdW5jdGlvbiAocmFuZ2VSZWFkZXIpIHtcbiAgICAgICAgaWYgKHJhbmdlUmVhZGVyLl9iZWdpbiAhPT0gYmVnaW4pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmFuZ2VSZWFkZXIuX2VucXVldWUoYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICAgIGFzc2VydChmb3VuZCwgXCJfb25SZWNlaXZlRGF0YSAtIG5vIGBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXJgIGluc3RhbmNlIGZvdW5kLlwiKTtcbiAgICB9XG4gIH1cbiAgZ2V0IF9wcm9ncmVzc2l2ZURhdGFMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5fbG9hZGVkID8/IDA7XG4gIH1cbiAgX29uUHJvZ3Jlc3MoZXZ0KSB7XG4gICAgaWYgKGV2dC50b3RhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9yYW5nZVJlYWRlcnNbMF0/Lm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5vblByb2dyZXNzPy4oe1xuICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsXG4gICAgICAgIHRvdGFsOiBldnQudG90YWxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBfb25Qcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LnByb2dyZXNzaXZlRG9uZSgpO1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSA9IHRydWU7XG4gIH1cbiAgX3JlbW92ZVJhbmdlUmVhZGVyKHJlYWRlcikge1xuICAgIGNvbnN0IGkgPSB0aGlzLl9yYW5nZVJlYWRlcnMuaW5kZXhPZihyZWFkZXIpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX3JhbmdlUmVhZGVycy5zcGxpY2UoaSwgMSk7XG4gICAgfVxuICB9XG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZEYXRhVHJhbnNwb3J0U3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgIGNvbnN0IHF1ZXVlZENodW5rcyA9IHRoaXMuX3F1ZXVlZENodW5rcztcbiAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBudWxsO1xuICAgIHJldHVybiBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlcih0aGlzLCBxdWV1ZWRDaHVua3MsIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSwgdGhpcy5fY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUpO1xuICB9XG4gIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHtcbiAgICBpZiAoZW5kIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgYmVnaW4sIGVuZCk7XG4gICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LnJlcXVlc3REYXRhUmFuZ2UoYmVnaW4sIGVuZCk7XG4gICAgdGhpcy5fcmFuZ2VSZWFkZXJzLnB1c2gocmVhZGVyKTtcbiAgICByZXR1cm4gcmVhZGVyO1xuICB9XG4gIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5jYW5jZWwocmVhc29uKTtcbiAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiB0aGlzLl9yYW5nZVJlYWRlcnMuc2xpY2UoMCkpIHtcbiAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFib3J0KCk7XG4gIH1cbn1cbmNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0sIHF1ZXVlZENodW5rcywgcHJvZ3Jlc3NpdmVEb25lID0gZmFsc2UsIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gbnVsbCkge1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9kb25lID0gcHJvZ3Jlc3NpdmVEb25lIHx8IGZhbHNlO1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gaXNQZGZGaWxlKGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKSA/IGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lIDogbnVsbDtcbiAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBxdWV1ZWRDaHVua3MgfHwgW107XG4gICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHRoaXMuX3F1ZXVlZENodW5rcykge1xuICAgICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgdGhpcy5faGVhZGVyc1JlYWR5ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgc3RyZWFtLl9mdWxsUmVxdWVzdFJlYWRlciA9IHRoaXM7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuICBfZW5xdWV1ZShjaHVuaykge1xuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGNodW5rKTtcbiAgICB9XG4gICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gIH1cbiAgZ2V0IGhlYWRlcnNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGVyc1JlYWR5O1xuICB9XG4gIGdldCBmaWxlbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gIH1cbiAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmVhbS5faXNSYW5nZVN1cHBvcnRlZDtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmVhbS5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gIH1cbiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmVhbS5fY29udGVudExlbmd0aDtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGlmICh0aGlzLl9xdWV1ZWRDaHVua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVua3Muc2hpZnQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpO1xuICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gIH1cbiAgcHJvZ3Jlc3NpdmVEb25lKCkge1xuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICB9XG59XG5jbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0sIGJlZ2luLCBlbmQpIHtcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5fYmVnaW4gPSBiZWdpbjtcbiAgICB0aGlzLl9lbmQgPSBlbmQ7XG4gICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cbiAgX2VucXVldWUoY2h1bmspIHtcbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IGNodW5rO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXF1ZXN0c0NhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgcmVxdWVzdHNDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgdGhpcy5fc3RyZWFtLl9yZW1vdmVSYW5nZVJlYWRlcih0aGlzKTtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3F1ZXVlZENodW5rO1xuICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG4gICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2NvbnRlbnRfZGlzcG9zaXRpb24uanNcblxuZnVuY3Rpb24gZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyKGNvbnRlbnREaXNwb3NpdGlvbikge1xuICBsZXQgbmVlZHNFbmNvZGluZ0ZpeHVwID0gdHJ1ZTtcbiAgbGV0IHRtcCA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVxcXFwqXCIsIFwiaVwiKS5leGVjKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gIGlmICh0bXApIHtcbiAgICB0bXAgPSB0bXBbMV07XG4gICAgbGV0IGZpbGVuYW1lID0gcmZjMjYxNnVucXVvdGUodG1wKTtcbiAgICBmaWxlbmFtZSA9IHVuZXNjYXBlKGZpbGVuYW1lKTtcbiAgICBmaWxlbmFtZSA9IHJmYzU5ODdkZWNvZGUoZmlsZW5hbWUpO1xuICAgIGZpbGVuYW1lID0gcmZjMjA0N2RlY29kZShmaWxlbmFtZSk7XG4gICAgcmV0dXJuIGZpeHVwRW5jb2RpbmcoZmlsZW5hbWUpO1xuICB9XG4gIHRtcCA9IHJmYzIyMzFnZXRwYXJhbShjb250ZW50RGlzcG9zaXRpb24pO1xuICBpZiAodG1wKSB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKHRtcCk7XG4gICAgcmV0dXJuIGZpeHVwRW5jb2RpbmcoZmlsZW5hbWUpO1xuICB9XG4gIHRtcCA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVwiLCBcImlcIikuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pO1xuICBpZiAodG1wKSB7XG4gICAgdG1wID0gdG1wWzFdO1xuICAgIGxldCBmaWxlbmFtZSA9IHJmYzI2MTZ1bnF1b3RlKHRtcCk7XG4gICAgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKGZpbGVuYW1lKTtcbiAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7XG4gIH1cbiAgZnVuY3Rpb24gdG9QYXJhbVJlZ0V4cChhdHRyaWJ1dGVQYXR0ZXJuLCBmbGFncykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFwiKD86Xnw7KVxcXFxzKlwiICsgYXR0cmlidXRlUGF0dGVybiArIFwiXFxcXHMqPVxcXFxzKlwiICsgXCIoXCIgKyAnW15cIjtcXFxcc11bXjtcXFxcc10qJyArIFwifFwiICsgJ1wiKD86W15cIlxcXFxcXFxcXXxcXFxcXFxcXFwiPykrXCI/JyArIFwiKVwiLCBmbGFncyk7XG4gIH1cbiAgZnVuY3Rpb24gdGV4dGRlY29kZShlbmNvZGluZywgdmFsdWUpIHtcbiAgICBpZiAoZW5jb2RpbmcpIHtcbiAgICAgIGlmICghL15bXFx4MDAtXFx4RkZdKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcsIHtcbiAgICAgICAgICBmYXRhbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyaW5nVG9CeXRlcyh2YWx1ZSk7XG4gICAgICAgIHZhbHVlID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKTtcbiAgICAgICAgbmVlZHNFbmNvZGluZ0ZpeHVwID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiBmaXh1cEVuY29kaW5nKHZhbHVlKSB7XG4gICAgaWYgKG5lZWRzRW5jb2RpbmdGaXh1cCAmJiAvW1xceDgwLVxceGZmXS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdGV4dGRlY29kZShcInV0Zi04XCIsIHZhbHVlKTtcbiAgICAgIGlmIChuZWVkc0VuY29kaW5nRml4dXApIHtcbiAgICAgICAgdmFsdWUgPSB0ZXh0ZGVjb2RlKFwiaXNvLTg4NTktMVwiLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiByZmMyMjMxZ2V0cGFyYW0oY29udGVudERpc3Bvc2l0aW9uU3RyKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICAgIGxldCBtYXRjaDtcbiAgICBjb25zdCBpdGVyID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXFxcXCooKD8hMFxcXFxkKVxcXFxkKykoXFxcXCo/KVwiLCBcImlnXCIpO1xuICAgIHdoaWxlICgobWF0Y2ggPSBpdGVyLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uU3RyKSkgIT09IG51bGwpIHtcbiAgICAgIGxldCBbLCBuLCBxdW90LCBwYXJ0XSA9IG1hdGNoO1xuICAgICAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgICAgIGlmIChuIGluIG1hdGNoZXMpIHtcbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1hdGNoZXNbbl0gPSBbcXVvdCwgcGFydF07XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCBtYXRjaGVzLmxlbmd0aDsgKytuKSB7XG4gICAgICBpZiAoIShuIGluIG1hdGNoZXMpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbGV0IFtxdW90LCBwYXJ0XSA9IG1hdGNoZXNbbl07XG4gICAgICBwYXJ0ID0gcmZjMjYxNnVucXVvdGUocGFydCk7XG4gICAgICBpZiAocXVvdCkge1xuICAgICAgICBwYXJ0ID0gdW5lc2NhcGUocGFydCk7XG4gICAgICAgIGlmIChuID09PSAwKSB7XG4gICAgICAgICAgcGFydCA9IHJmYzU5ODdkZWNvZGUocGFydCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhcnRzLnB1c2gocGFydCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cy5qb2luKFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzI2MTZ1bnF1b3RlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc2xpY2UoMSkuc3BsaXQoJ1xcXFxcIicpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBxdW90aW5kZXggPSBwYXJ0c1tpXS5pbmRleE9mKCdcIicpO1xuICAgICAgICBpZiAocXVvdGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIHBhcnRzW2ldID0gcGFydHNbaV0uc2xpY2UoMCwgcXVvdGluZGV4KTtcbiAgICAgICAgICBwYXJ0cy5sZW5ndGggPSBpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0c1tpXSA9IHBhcnRzW2ldLnJlcGxhY2VBbGwoL1xcXFwoLikvZywgXCIkMVwiKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gcGFydHMuam9pbignXCInKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzU5ODdkZWNvZGUoZXh0dmFsdWUpIHtcbiAgICBjb25zdCBlbmNvZGluZ2VuZCA9IGV4dHZhbHVlLmluZGV4T2YoXCInXCIpO1xuICAgIGlmIChlbmNvZGluZ2VuZCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBleHR2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgZW5jb2RpbmcgPSBleHR2YWx1ZS5zbGljZSgwLCBlbmNvZGluZ2VuZCk7XG4gICAgY29uc3QgbGFuZ3ZhbHVlID0gZXh0dmFsdWUuc2xpY2UoZW5jb2RpbmdlbmQgKyAxKTtcbiAgICBjb25zdCB2YWx1ZSA9IGxhbmd2YWx1ZS5yZXBsYWNlKC9eW14nXSonLywgXCJcIik7XG4gICAgcmV0dXJuIHRleHRkZWNvZGUoZW5jb2RpbmcsIHZhbHVlKTtcbiAgfVxuICBmdW5jdGlvbiByZmMyMDQ3ZGVjb2RlKHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKFwiPT9cIikgfHwgL1tcXHgwMC1cXHgxOVxceDgwLVxceGZmXS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoLz1cXD8oW1xcdy1dKilcXD8oW1FxQmJdKVxcPygoPzpbXj9dfFxcPyg/IT0pKSopXFw/PS9nLCBmdW5jdGlvbiAobWF0Y2hlcywgY2hhcnNldCwgZW5jb2RpbmcsIHRleHQpIHtcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gXCJxXCIgfHwgZW5jb2RpbmcgPT09IFwiUVwiKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2VBbGwoXCJfXCIsIFwiIFwiKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZUFsbCgvPShbMC05YS1mQS1GXXsyfSkvZywgZnVuY3Rpb24gKG1hdGNoLCBoZXgpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGV4dGRlY29kZShjaGFyc2V0LCB0ZXh0KTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHRleHQgPSBhdG9iKHRleHQpO1xuICAgICAgfSBjYXRjaCB7fVxuICAgICAgcmV0dXJuIHRleHRkZWNvZGUoY2hhcnNldCwgdGV4dCk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L25ldHdvcmtfdXRpbHMuanNcblxuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHtcbiAgZ2V0UmVzcG9uc2VIZWFkZXIsXG4gIGlzSHR0cCxcbiAgcmFuZ2VDaHVua1NpemUsXG4gIGRpc2FibGVSYW5nZVxufSkge1xuICBjb25zdCByZXR1cm5WYWx1ZXMgPSB7XG4gICAgYWxsb3dSYW5nZVJlcXVlc3RzOiBmYWxzZSxcbiAgICBzdWdnZXN0ZWRMZW5ndGg6IHVuZGVmaW5lZFxuICB9O1xuICBjb25zdCBsZW5ndGggPSBwYXJzZUludChnZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIpLCAxMCk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihsZW5ndGgpKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuICByZXR1cm5WYWx1ZXMuc3VnZ2VzdGVkTGVuZ3RoID0gbGVuZ3RoO1xuICBpZiAobGVuZ3RoIDw9IDIgKiByYW5nZUNodW5rU2l6ZSkge1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH1cbiAgaWYgKGRpc2FibGVSYW5nZSB8fCAhaXNIdHRwKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuICBpZiAoZ2V0UmVzcG9uc2VIZWFkZXIoXCJBY2NlcHQtUmFuZ2VzXCIpICE9PSBcImJ5dGVzXCIpIHtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuICB9XG4gIGNvbnN0IGNvbnRlbnRFbmNvZGluZyA9IGdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1FbmNvZGluZ1wiKSB8fCBcImlkZW50aXR5XCI7XG4gIGlmIChjb250ZW50RW5jb2RpbmcgIT09IFwiaWRlbnRpdHlcIikge1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH1cbiAgcmV0dXJuVmFsdWVzLmFsbG93UmFuZ2VSZXF1ZXN0cyA9IHRydWU7XG4gIHJldHVybiByZXR1cm5WYWx1ZXM7XG59XG5mdW5jdGlvbiBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKGdldFJlc3BvbnNlSGVhZGVyKSB7XG4gIGNvbnN0IGNvbnRlbnREaXNwb3NpdGlvbiA9IGdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1EaXNwb3NpdGlvblwiKTtcbiAgaWYgKGNvbnRlbnREaXNwb3NpdGlvbikge1xuICAgIGxldCBmaWxlbmFtZSA9IGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcihjb250ZW50RGlzcG9zaXRpb24pO1xuICAgIGlmIChmaWxlbmFtZS5pbmNsdWRlcyhcIiVcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbGVuYW1lID0gZGVjb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gICAgaWYgKGlzUGRmRmlsZShmaWxlbmFtZSkpIHtcbiAgICAgIHJldHVybiBmaWxlbmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKHN0YXR1cywgdXJsKSB7XG4gIGlmIChzdGF0dXMgPT09IDQwNCB8fCBzdGF0dXMgPT09IDAgJiYgdXJsLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkge1xuICAgIHJldHVybiBuZXcgTWlzc2luZ1BERkV4Y2VwdGlvbignTWlzc2luZyBQREYgXCInICsgdXJsICsgJ1wiLicpO1xuICB9XG4gIHJldHVybiBuZXcgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKGBVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZSAoJHtzdGF0dXN9KSB3aGlsZSByZXRyaWV2aW5nIFBERiBcIiR7dXJsfVwiLmAsIHN0YXR1cyk7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHN0YXR1cykge1xuICByZXR1cm4gc3RhdHVzID09PSAyMDAgfHwgc3RhdHVzID09PSAyMDY7XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2ZldGNoX3N0cmVhbS5qc1xuXG5cbmZ1bmN0aW9uIGNyZWF0ZUZldGNoT3B0aW9ucyhoZWFkZXJzLCB3aXRoQ3JlZGVudGlhbHMsIGFib3J0Q29udHJvbGxlcikge1xuICByZXR1cm4ge1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICBoZWFkZXJzLFxuICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICBtb2RlOiBcImNvcnNcIixcbiAgICBjcmVkZW50aWFsczogd2l0aENyZWRlbnRpYWxzID8gXCJpbmNsdWRlXCIgOiBcInNhbWUtb3JpZ2luXCIsXG4gICAgcmVkaXJlY3Q6IFwiZm9sbG93XCJcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhlYWRlcnMoaHR0cEhlYWRlcnMpIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gIGZvciAoY29uc3QgcHJvcGVydHkgaW4gaHR0cEhlYWRlcnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0dHBIZWFkZXJzW3Byb3BlcnR5XTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGhlYWRlcnMuYXBwZW5kKHByb3BlcnR5LCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5mdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcih2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICByZXR1cm4gdmFsLmJ1ZmZlcjtcbiAgfVxuICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHdhcm4oYGdldEFycmF5QnVmZmVyIC0gdW5leHBlY3RlZCBkYXRhIGZvcm1hdDogJHt2YWx9YCk7XG4gIHJldHVybiBuZXcgVWludDhBcnJheSh2YWwpLmJ1ZmZlcjtcbn1cbmNsYXNzIFBERkZldGNoU3RyZWFtIHtcbiAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5pc0h0dHAgPSAvXmh0dHBzPzovaS50ZXN0KHNvdXJjZS51cmwpO1xuICAgIHRoaXMuaHR0cEhlYWRlcnMgPSB0aGlzLmlzSHR0cCAmJiBzb3VyY2UuaHR0cEhlYWRlcnMgfHwge307XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgfVxuICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/Ll9sb2FkZWQgPz8gMDtcbiAgfVxuICBnZXRGdWxsUmVhZGVyKCkge1xuICAgIGFzc2VydCghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGRmV0Y2hTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SZWFkZXIodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICB9XG4gIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHtcbiAgICBpZiAoZW5kIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIGJlZ2luLCBlbmQpO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyZWFkZXIpO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH1cbiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkpIHtcbiAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFBERkZldGNoU3RyZWFtUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG4gICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcbiAgICB0aGlzLl93aXRoQ3JlZGVudGlhbHMgPSBzb3VyY2Uud2l0aENyZWRlbnRpYWxzIHx8IGZhbHNlO1xuICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTtcbiAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTtcbiAgICBpZiAoIXRoaXMuX3JhbmdlQ2h1bmtTaXplICYmICF0aGlzLl9kaXNhYmxlUmFuZ2UpIHtcbiAgICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcbiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlUmFuZ2U7XG4gICAgdGhpcy5faGVhZGVycyA9IGNyZWF0ZUhlYWRlcnModGhpcy5fc3RyZWFtLmh0dHBIZWFkZXJzKTtcbiAgICBjb25zdCB1cmwgPSBzb3VyY2UudXJsO1xuICAgIGZldGNoKHVybCwgY3JlYXRlRmV0Y2hPcHRpb25zKHRoaXMuX2hlYWRlcnMsIHRoaXMuX3dpdGhDcmVkZW50aWFscywgdGhpcy5fYWJvcnRDb250cm9sbGVyKSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAoIXZhbGlkYXRlUmVzcG9uc2VTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICB0aHJvdyBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKHJlc3BvbnNlLnN0YXR1cywgdXJsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICBjb25zdCBnZXRSZXNwb25zZUhlYWRlciA9IG5hbWUgPT4gcmVzcG9uc2UuaGVhZGVycy5nZXQobmFtZSk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cyxcbiAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoXG4gICAgICB9ID0gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoe1xuICAgICAgICBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgaXNIdHRwOiB0aGlzLl9zdHJlYW0uaXNIdHRwLFxuICAgICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsXG4gICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBhbGxvd1JhbmdlUmVxdWVzdHM7XG4gICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICB0aGlzLl9maWxlbmFtZSA9IGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIoZ2V0UmVzcG9uc2VIZWFkZXIpO1xuICAgICAgaWYgKCF0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCAmJiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICAgIHRoaXMuY2FuY2VsKG5ldyBBYm9ydEV4Y2VwdGlvbihcIlN0cmVhbWluZyBpcyBkaXNhYmxlZC5cIikpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGdldCBmaWxlbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gIH1cbiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gIH1cbiAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGF3YWl0IHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgY29uc3Qge1xuICAgICAgdmFsdWUsXG4gICAgICBkb25lXG4gICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBkb25lXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCxcbiAgICAgIHRvdGFsOiB0aGlzLl9jb250ZW50TGVuZ3RoXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBnZXRBcnJheUJ1ZmZlcih2YWx1ZSksXG4gICAgICBkb25lOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX3JlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG4gICAgdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIH1cbn1cbmNsYXNzIFBERkZldGNoU3RyZWFtUmFuZ2VSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0sIGJlZ2luLCBlbmQpIHtcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG4gICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gc291cmNlLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtO1xuICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpO1xuICAgIHRoaXMuX2hlYWRlcnMuYXBwZW5kKFwiUmFuZ2VcIiwgYGJ5dGVzPSR7YmVnaW59LSR7ZW5kIC0gMX1gKTtcbiAgICBjb25zdCB1cmwgPSBzb3VyY2UudXJsO1xuICAgIGZldGNoKHVybCwgY3JlYXRlRmV0Y2hPcHRpb25zKHRoaXMuX2hlYWRlcnMsIHRoaXMuX3dpdGhDcmVkZW50aWFscywgdGhpcy5fYWJvcnRDb250cm9sbGVyKSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAoIXZhbGlkYXRlUmVzcG9uc2VTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICB0aHJvdyBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKHJlc3BvbnNlLnN0YXR1cywgdXJsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgIHRoaXMuX3JlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgfSkuY2F0Y2godGhpcy5fcmVhZENhcGFiaWxpdHkucmVqZWN0KTtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIGNvbnN0IHtcbiAgICAgIHZhbHVlLFxuICAgICAgZG9uZVxuICAgIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZG9uZVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5fbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgdGhpcy5vblByb2dyZXNzPy4oe1xuICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWRcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGdldEFycmF5QnVmZmVyKHZhbHVlKSxcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fcmVhZGVyPy5jYW5jZWwocmVhc29uKTtcbiAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9uZXR3b3JrLmpzXG5cblxuY29uc3QgT0tfUkVTUE9OU0UgPSAyMDA7XG5jb25zdCBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0UgPSAyMDY7XG5mdW5jdGlvbiBuZXR3b3JrX2dldEFycmF5QnVmZmVyKHhocikge1xuICBjb25zdCBkYXRhID0geGhyLnJlc3BvbnNlO1xuICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICByZXR1cm4gc3RyaW5nVG9CeXRlcyhkYXRhKS5idWZmZXI7XG59XG5jbGFzcyBOZXR3b3JrTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKHVybCwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gICAgdGhpcy5pc0h0dHAgPSAvXmh0dHBzPzovaS50ZXN0KHVybCk7XG4gICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIGFyZ3MuaHR0cEhlYWRlcnMgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IGFyZ3Mud2l0aENyZWRlbnRpYWxzIHx8IGZhbHNlO1xuICAgIHRoaXMuY3VyclhocklkID0gMDtcbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQsIGxpc3RlbmVycykge1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICBiZWdpbixcbiAgICAgIGVuZFxuICAgIH07XG4gICAgZm9yIChjb25zdCBwcm9wIGluIGxpc3RlbmVycykge1xuICAgICAgYXJnc1twcm9wXSA9IGxpc3RlbmVyc1twcm9wXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChhcmdzKTtcbiAgfVxuICByZXF1ZXN0RnVsbChsaXN0ZW5lcnMpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGxpc3RlbmVycyk7XG4gIH1cbiAgcmVxdWVzdChhcmdzKSB7XG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgY29uc3QgeGhySWQgPSB0aGlzLmN1cnJYaHJJZCsrO1xuICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdID0ge1xuICAgICAgeGhyXG4gICAgfTtcbiAgICB4aHIub3BlbihcIkdFVFwiLCB0aGlzLnVybCk7XG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRoaXMud2l0aENyZWRlbnRpYWxzO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5odHRwSGVhZGVycykge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmh0dHBIZWFkZXJzW3Byb3BlcnR5XTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIocHJvcGVydHksIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNIdHRwICYmIFwiYmVnaW5cIiBpbiBhcmdzICYmIFwiZW5kXCIgaW4gYXJncykge1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJSYW5nZVwiLCBgYnl0ZXM9JHthcmdzLmJlZ2lufS0ke2FyZ3MuZW5kIC0gMX1gKTtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzID0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFO1xuICAgIH0gZWxzZSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9IE9LX1JFU1BPTlNFO1xuICAgIH1cbiAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuICAgIGlmIChhcmdzLm9uRXJyb3IpIHtcbiAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICBhcmdzLm9uRXJyb3IoeGhyLnN0YXR1cyk7XG4gICAgICB9O1xuICAgIH1cbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5vblN0YXRlQ2hhbmdlLmJpbmQodGhpcywgeGhySWQpO1xuICAgIHhoci5vbnByb2dyZXNzID0gdGhpcy5vblByb2dyZXNzLmJpbmQodGhpcywgeGhySWQpO1xuICAgIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkID0gYXJncy5vbkhlYWRlcnNSZWNlaXZlZDtcbiAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUgPSBhcmdzLm9uRG9uZTtcbiAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yID0gYXJncy5vbkVycm9yO1xuICAgIHBlbmRpbmdSZXF1ZXN0Lm9uUHJvZ3Jlc3MgPSBhcmdzLm9uUHJvZ3Jlc3M7XG4gICAgeGhyLnNlbmQobnVsbCk7XG4gICAgcmV0dXJuIHhocklkO1xuICB9XG4gIG9uUHJvZ3Jlc3MoeGhySWQsIGV2dCkge1xuICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuICAgIGlmICghcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGVuZGluZ1JlcXVlc3Qub25Qcm9ncmVzcz8uKGV2dCk7XG4gIH1cbiAgb25TdGF0ZUNoYW5nZSh4aHJJZCwgZXZ0KSB7XG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG4gICAgaWYgKCFwZW5kaW5nUmVxdWVzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB4aHIgPSBwZW5kaW5nUmVxdWVzdC54aHI7XG4gICAgaWYgKHhoci5yZWFkeVN0YXRlID49IDIgJiYgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQpIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkKCk7XG4gICAgICBkZWxldGUgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQ7XG4gICAgfVxuICAgIGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gNCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoISh4aHJJZCBpbiB0aGlzLnBlbmRpbmdSZXF1ZXN0cykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTtcbiAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMCAmJiB0aGlzLmlzSHR0cCkge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcj8uKHhoci5zdGF0dXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB4aHJTdGF0dXMgPSB4aHIuc3RhdHVzIHx8IE9LX1JFU1BPTlNFO1xuICAgIGNvbnN0IG9rX3Jlc3BvbnNlX29uX3JhbmdlX3JlcXVlc3QgPSB4aHJTdGF0dXMgPT09IE9LX1JFU1BPTlNFICYmIHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzID09PSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0U7XG4gICAgaWYgKCFva19yZXNwb25zZV9vbl9yYW5nZV9yZXF1ZXN0ICYmIHhoclN0YXR1cyAhPT0gcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMpIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3I/Lih4aHIuc3RhdHVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2h1bmsgPSBuZXR3b3JrX2dldEFycmF5QnVmZmVyKHhocik7XG4gICAgaWYgKHhoclN0YXR1cyA9PT0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFKSB7XG4gICAgICBjb25zdCByYW5nZUhlYWRlciA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtUmFuZ2VcIik7XG4gICAgICBjb25zdCBtYXRjaGVzID0gL2J5dGVzIChcXGQrKS0oXFxkKylcXC8oXFxkKykvLmV4ZWMocmFuZ2VIZWFkZXIpO1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lKHtcbiAgICAgICAgYmVnaW46IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKSxcbiAgICAgICAgY2h1bmtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY2h1bmspIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRG9uZSh7XG4gICAgICAgIGJlZ2luOiAwLFxuICAgICAgICBjaHVua1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3I/Lih4aHIuc3RhdHVzKTtcbiAgICB9XG4gIH1cbiAgZ2V0UmVxdWVzdFhocih4aHJJZCkge1xuICAgIHJldHVybiB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF0ueGhyO1xuICB9XG4gIGlzUGVuZGluZ1JlcXVlc3QoeGhySWQpIHtcbiAgICByZXR1cm4geGhySWQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHM7XG4gIH1cbiAgYWJvcnRSZXF1ZXN0KHhocklkKSB7XG4gICAgY29uc3QgeGhyID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdLnhocjtcbiAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuICAgIHhoci5hYm9ydCgpO1xuICB9XG59XG5jbGFzcyBQREZOZXR3b3JrU3RyZWFtIHtcbiAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgdGhpcy5fc291cmNlID0gc291cmNlO1xuICAgIHRoaXMuX21hbmFnZXIgPSBuZXcgTmV0d29ya01hbmFnZXIoc291cmNlLnVybCwge1xuICAgICAgaHR0cEhlYWRlcnM6IHNvdXJjZS5odHRwSGVhZGVycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogc291cmNlLndpdGhDcmVkZW50aWFsc1xuICAgIH0pO1xuICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107XG4gIH1cbiAgX29uUmFuZ2VSZXF1ZXN0UmVhZGVyQ2xvc2VkKHJlYWRlcikge1xuICAgIGNvbnN0IGkgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLmluZGV4T2YocmVhZGVyKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cbiAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICBhc3NlcnQoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERk5ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVyKHRoaXMuX21hbmFnZXIsIHRoaXMuX3NvdXJjZSk7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICB9XG4gIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGTmV0d29ya1N0cmVhbVJhbmdlUmVxdWVzdFJlYWRlcih0aGlzLl9tYW5hZ2VyLCBiZWdpbiwgZW5kKTtcbiAgICByZWFkZXIub25DbG9zZWQgPSB0aGlzLl9vblJhbmdlUmVxdWVzdFJlYWRlckNsb3NlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyZWFkZXIpO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH1cbiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkpIHtcbiAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKG1hbmFnZXIsIHNvdXJjZSkge1xuICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICBvbkhlYWRlcnNSZWNlaXZlZDogdGhpcy5fb25IZWFkZXJzUmVjZWl2ZWQuYmluZCh0aGlzKSxcbiAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksXG4gICAgICBvbkVycm9yOiB0aGlzLl9vbkVycm9yLmJpbmQodGhpcyksXG4gICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcylcbiAgICB9O1xuICAgIHRoaXMuX3VybCA9IHNvdXJjZS51cmw7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RJZCA9IG1hbmFnZXIucmVxdWVzdEZ1bGwoYXJncyk7XG4gICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHNvdXJjZS5kaXNhYmxlUmFuZ2UgfHwgZmFsc2U7XG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG4gICAgaWYgKCF0aGlzLl9yYW5nZUNodW5rU2l6ZSAmJiAhdGhpcy5fZGlzYWJsZVJhbmdlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jYWNoZWRDaHVua3MgPSBbXTtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuICBfb25IZWFkZXJzUmVjZWl2ZWQoKSB7XG4gICAgY29uc3QgZnVsbFJlcXVlc3RYaHJJZCA9IHRoaXMuX2Z1bGxSZXF1ZXN0SWQ7XG4gICAgY29uc3QgZnVsbFJlcXVlc3RYaHIgPSB0aGlzLl9tYW5hZ2VyLmdldFJlcXVlc3RYaHIoZnVsbFJlcXVlc3RYaHJJZCk7XG4gICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IGZ1bGxSZXF1ZXN0WGhyLmdldFJlc3BvbnNlSGVhZGVyKG5hbWUpO1xuICAgIGNvbnN0IHtcbiAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cyxcbiAgICAgIHN1Z2dlc3RlZExlbmd0aFxuICAgIH0gPSB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyh7XG4gICAgICBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgIGlzSHR0cDogdGhpcy5fbWFuYWdlci5pc0h0dHAsXG4gICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsXG4gICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZVxuICAgIH0pO1xuICAgIGlmIChhbGxvd1JhbmdlUmVxdWVzdHMpIHtcbiAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgdGhpcy5fZmlsZW5hbWUgPSBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKGdldFJlc3BvbnNlSGVhZGVyKTtcbiAgICBpZiAodGhpcy5faXNSYW5nZVN1cHBvcnRlZCkge1xuICAgICAgdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QoZnVsbFJlcXVlc3RYaHJJZCk7XG4gICAgfVxuICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9XG4gIF9vbkRvbmUoZGF0YSkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICAgIHZhbHVlOiBkYXRhLmNodW5rLFxuICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY2FjaGVkQ2h1bmtzLnB1c2goZGF0YS5jaHVuayk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gIH1cbiAgX29uRXJyb3Ioc3RhdHVzKSB7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKHN0YXR1cywgdGhpcy5fdXJsKTtcbiAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVqZWN0KHRoaXMuX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID0gMDtcbiAgfVxuICBfb25Qcm9ncmVzcyhldnQpIHtcbiAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsXG4gICAgICB0b3RhbDogZXZ0Lmxlbmd0aENvbXB1dGFibGUgPyBldnQudG90YWwgOiB0aGlzLl9jb250ZW50TGVuZ3RoXG4gICAgfSk7XG4gIH1cbiAgZ2V0IGZpbGVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgfVxuICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICB9XG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jYWNoZWRDaHVua3Muc2hpZnQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpO1xuICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICBpZiAodGhpcy5fbWFuYWdlci5pc1BlbmRpbmdSZXF1ZXN0KHRoaXMuX2Z1bGxSZXF1ZXN0SWQpKSB7XG4gICAgICB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKTtcbiAgICB9XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICB9XG59XG5jbGFzcyBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyIHtcbiAgY29uc3RydWN0b3IobWFuYWdlciwgYmVnaW4sIGVuZCkge1xuICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICBvbkRvbmU6IHRoaXMuX29uRG9uZS5iaW5kKHRoaXMpLFxuICAgICAgb25FcnJvcjogdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpLFxuICAgICAgb25Qcm9ncmVzczogdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpXG4gICAgfTtcbiAgICB0aGlzLl91cmwgPSBtYW5hZ2VyLnVybDtcbiAgICB0aGlzLl9yZXF1ZXN0SWQgPSBtYW5hZ2VyLnJlcXVlc3RSYW5nZShiZWdpbiwgZW5kLCBhcmdzKTtcbiAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICB0aGlzLm9uQ2xvc2VkID0gbnVsbDtcbiAgfVxuICBfY2xvc2UoKSB7XG4gICAgdGhpcy5vbkNsb3NlZD8uKHRoaXMpO1xuICB9XG4gIF9vbkRvbmUoZGF0YSkge1xuICAgIGNvbnN0IGNodW5rID0gZGF0YS5jaHVuaztcbiAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IGNodW5rO1xuICAgIH1cbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fY2xvc2UoKTtcbiAgfVxuICBfb25FcnJvcihzdGF0dXMpIHtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3Ioc3RhdHVzLCB0aGlzLl91cmwpO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICB9XG4gIF9vblByb2dyZXNzKGV2dCkge1xuICAgIGlmICghdGhpcy5pc1N0cmVhbWluZ1N1cHBvcnRlZCkge1xuICAgICAgdGhpcy5vblByb2dyZXNzPy4oe1xuICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3F1ZXVlZENodW5rO1xuICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG4gICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICBpZiAodGhpcy5fbWFuYWdlci5pc1BlbmRpbmdSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCkpIHtcbiAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHRoaXMuX2Nsb3NlKCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvbm9kZV9zdHJlYW0uanNcblxuXG5cbmNvbnN0IGZpbGVVcmlSZWdleCA9IC9eZmlsZTpcXC9cXC9cXC9bYS16QS1aXTpcXC8vO1xuZnVuY3Rpb24gcGFyc2VVcmwoc291cmNlVXJsKSB7XG4gIGNvbnN0IHVybCA9IE5vZGVQYWNrYWdlcy5nZXQoXCJ1cmxcIik7XG4gIGNvbnN0IHBhcnNlZFVybCA9IHVybC5wYXJzZShzb3VyY2VVcmwpO1xuICBpZiAocGFyc2VkVXJsLnByb3RvY29sID09PSBcImZpbGU6XCIgfHwgcGFyc2VkVXJsLmhvc3QpIHtcbiAgICByZXR1cm4gcGFyc2VkVXJsO1xuICB9XG4gIGlmICgvXlthLXpdOlsvXFxcXF0vaS50ZXN0KHNvdXJjZVVybCkpIHtcbiAgICByZXR1cm4gdXJsLnBhcnNlKGBmaWxlOi8vLyR7c291cmNlVXJsfWApO1xuICB9XG4gIGlmICghcGFyc2VkVXJsLmhvc3QpIHtcbiAgICBwYXJzZWRVcmwucHJvdG9jb2wgPSBcImZpbGU6XCI7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZFVybDtcbn1cbmNsYXNzIFBERk5vZGVTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLnVybCA9IHBhcnNlVXJsKHNvdXJjZS51cmwpO1xuICAgIHRoaXMuaXNIdHRwID0gdGhpcy51cmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIiB8fCB0aGlzLnVybC5wcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbiAgICB0aGlzLmlzRnNVcmwgPSB0aGlzLnVybC5wcm90b2NvbCA9PT0gXCJmaWxlOlwiO1xuICAgIHRoaXMuaHR0cEhlYWRlcnMgPSB0aGlzLmlzSHR0cCAmJiBzb3VyY2UuaHR0cEhlYWRlcnMgfHwge307XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgfVxuICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/Ll9sb2FkZWQgPz8gMDtcbiAgfVxuICBnZXRGdWxsUmVhZGVyKCkge1xuICAgIGFzc2VydCghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGTm9kZVN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IHRoaXMuaXNGc1VybCA/IG5ldyBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyKHRoaXMpIDogbmV3IFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjtcbiAgfVxuICBnZXRSYW5nZVJlYWRlcihzdGFydCwgZW5kKSB7XG4gICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMuaXNGc1VybCA/IG5ldyBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlcih0aGlzLCBzdGFydCwgZW5kKSA6IG5ldyBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgc3RhcnQsIGVuZCk7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJhbmdlUmVhZGVyKTtcbiAgICByZXR1cm4gcmFuZ2VSZWFkZXI7XG4gIH1cbiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkpIHtcbiAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIEJhc2VGdWxsUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcbiAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlO1xuICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG4gICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVJhbmdlO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gbnVsbDtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gIH1cbiAgZ2V0IGhlYWRlcnNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuICB9XG4gIGdldCBjb250ZW50TGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICB9XG4gIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkO1xuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgIH1cbiAgICBjb25zdCBjaHVuayA9IHRoaXMuX3JlYWRhYmxlU3RyZWFtLnJlYWQoKTtcbiAgICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkKCk7XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5sZW5ndGg7XG4gICAgdGhpcy5vblByb2dyZXNzPy4oe1xuICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQsXG4gICAgICB0b3RhbDogdGhpcy5fY29udGVudExlbmd0aFxuICAgIH0pO1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGNodW5rKS5idWZmZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBidWZmZXIsXG4gICAgICBkb25lOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdHJlYW0pIHtcbiAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTtcbiAgfVxuICBfZXJyb3IocmVhc29uKSB7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9XG4gIF9zZXRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gcmVhZGFibGVTdHJlYW07XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJyZWFkYWJsZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgcmVhZGFibGVTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcbiAgICB9KTtcbiAgICBpZiAoIXRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkICYmIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgIHRoaXMuX2Vycm9yKG5ldyBBYm9ydEV4Y2VwdGlvbihcInN0cmVhbWluZyBpcyBkaXNhYmxlZFwiKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICB9XG59XG5jbGFzcyBCYXNlUmFuZ2VSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICB0aGlzLl91cmwgPSBzdHJlYW0udXJsO1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IG51bGw7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gbnVsbDtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcmVhZGFibGVTdHJlYW0ucmVhZCgpO1xuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoKTtcbiAgICB9XG4gICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmxlbmd0aDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZFxuICAgIH0pO1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGNodW5rKS5idWZmZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBidWZmZXIsXG4gICAgICBkb25lOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIGlmICghdGhpcy5fcmVhZGFibGVTdHJlYW0pIHtcbiAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTtcbiAgfVxuICBfZXJyb3IocmVhc29uKSB7XG4gICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9XG4gIF9zZXRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gcmVhZGFibGVTdHJlYW07XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJyZWFkYWJsZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgcmVhZGFibGVTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcmVhZGFibGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kodGhpcy5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlUmVxdWVzdE9wdGlvbnMocGFyc2VkVXJsLCBoZWFkZXJzKSB7XG4gIHJldHVybiB7XG4gICAgcHJvdG9jb2w6IHBhcnNlZFVybC5wcm90b2NvbCxcbiAgICBhdXRoOiBwYXJzZWRVcmwuYXV0aCxcbiAgICBob3N0OiBwYXJzZWRVcmwuaG9zdG5hbWUsXG4gICAgcG9ydDogcGFyc2VkVXJsLnBvcnQsXG4gICAgcGF0aDogcGFyc2VkVXJsLnBhdGgsXG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIGhlYWRlcnNcbiAgfTtcbn1cbmNsYXNzIFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICBzdXBlcihzdHJlYW0pO1xuICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gcmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKGBNaXNzaW5nIFBERiBcIiR7dGhpcy5fdXJsfVwiLmApO1xuICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yO1xuICAgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShyZXNwb25zZSk7XG4gICAgICBjb25zdCBnZXRSZXNwb25zZUhlYWRlciA9IG5hbWUgPT4gdGhpcy5fcmVhZGFibGVTdHJlYW0uaGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgY29uc3Qge1xuICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHMsXG4gICAgICAgIHN1Z2dlc3RlZExlbmd0aFxuICAgICAgfSA9IHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHtcbiAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIsXG4gICAgICAgIGlzSHR0cDogc3RyZWFtLmlzSHR0cCxcbiAgICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuICAgICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZVxuICAgICAgfSk7XG4gICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gYWxsb3dSYW5nZVJlcXVlc3RzO1xuICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICAgICAgdGhpcy5fZmlsZW5hbWUgPSBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKGdldFJlc3BvbnNlSGVhZGVyKTtcbiAgICB9O1xuICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgIGlmICh0aGlzLl91cmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIikge1xuICAgICAgY29uc3QgaHR0cCA9IE5vZGVQYWNrYWdlcy5nZXQoXCJodHRwXCIpO1xuICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHAucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHN0cmVhbS5odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaHR0cHMgPSBOb2RlUGFja2FnZXMuZ2V0KFwiaHR0cHNcIik7XG4gICAgICB0aGlzLl9yZXF1ZXN0ID0gaHR0cHMucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHN0cmVhbS5odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgIH0pO1xuICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7XG4gIH1cbn1cbmNsYXNzIFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlciBleHRlbmRzIEJhc2VSYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgc3RhcnQsIGVuZCkge1xuICAgIHN1cGVyKHN0cmVhbSk7XG4gICAgdGhpcy5faHR0cEhlYWRlcnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHN0cmVhbS5odHRwSGVhZGVycykge1xuICAgICAgY29uc3QgdmFsdWUgPSBzdHJlYW0uaHR0cEhlYWRlcnNbcHJvcGVydHldO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9odHRwSGVhZGVyc1twcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5faHR0cEhlYWRlcnMuUmFuZ2UgPSBgYnl0ZXM9JHtzdGFydH0tJHtlbmQgLSAxfWA7XG4gICAgY29uc3QgaGFuZGxlUmVzcG9uc2UgPSByZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGIFwiJHt0aGlzLl91cmx9XCIuYCk7XG4gICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHJlc3BvbnNlKTtcbiAgICB9O1xuICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgIGlmICh0aGlzLl91cmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIikge1xuICAgICAgY29uc3QgaHR0cCA9IE5vZGVQYWNrYWdlcy5nZXQoXCJodHRwXCIpO1xuICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHAucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHRoaXMuX2h0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBodHRwcyA9IE5vZGVQYWNrYWdlcy5nZXQoXCJodHRwc1wiKTtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgdGhpcy5faHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3Qub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG4gICAgfSk7XG4gICAgdGhpcy5fcmVxdWVzdC5lbmQoKTtcbiAgfVxufVxuY2xhc3MgUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlciBleHRlbmRzIEJhc2VGdWxsUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG4gICAgc3VwZXIoc3RyZWFtKTtcbiAgICBsZXQgcGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLl91cmwucGF0aCk7XG4gICAgaWYgKGZpbGVVcmlSZWdleC50ZXN0KHRoaXMuX3VybC5ocmVmKSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlxcLy8sIFwiXCIpO1xuICAgIH1cbiAgICBjb25zdCBmcyA9IE5vZGVQYWNrYWdlcy5nZXQoXCJmc1wiKTtcbiAgICBmcy5wcm9taXNlcy5sc3RhdChwYXRoKS50aGVuKHN0YXQgPT4ge1xuICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN0YXQuc2l6ZTtcbiAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKGZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aCkpO1xuICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIGlmIChlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIGVycm9yID0gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGIFwiJHtwYXRofVwiLmApO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBlcnJvcjtcbiAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gIH1cbn1cbmNsYXNzIFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyIGV4dGVuZHMgQmFzZVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtLCBzdGFydCwgZW5kKSB7XG4gICAgc3VwZXIoc3RyZWFtKTtcbiAgICBsZXQgcGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLl91cmwucGF0aCk7XG4gICAgaWYgKGZpbGVVcmlSZWdleC50ZXN0KHRoaXMuX3VybC5ocmVmKSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlxcLy8sIFwiXCIpO1xuICAgIH1cbiAgICBjb25zdCBmcyA9IE5vZGVQYWNrYWdlcy5nZXQoXCJmc1wiKTtcbiAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGgsIHtcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kOiBlbmQgLSAxXG4gICAgfSkpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L3RleHRfbGF5ZXIuanNcblxuXG5jb25zdCBNQVhfVEVYVF9ESVZTX1RPX1JFTkRFUiA9IDEwMDAwMDtcbmNvbnN0IERFRkFVTFRfRk9OVF9TSVpFID0gMzA7XG5jb25zdCBERUZBVUxUX0ZPTlRfQVNDRU5UID0gMC44O1xuY2xhc3MgVGV4dExheWVyIHtcbiAgI2NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgI2NvbnRhaW5lciA9IG51bGw7XG4gICNkaXNhYmxlUHJvY2Vzc0l0ZW1zID0gZmFsc2U7XG4gICNmb250SW5zcGVjdG9yRW5hYmxlZCA9ICEhZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yPy5lbmFibGVkO1xuICAjbGFuZyA9IG51bGw7XG4gICNsYXlvdXRUZXh0UGFyYW1zID0gbnVsbDtcbiAgI3BhZ2VIZWlnaHQgPSAwO1xuICAjcGFnZVdpZHRoID0gMDtcbiAgI3JlYWRlciA9IG51bGw7XG4gICNyb290Q29udGFpbmVyID0gbnVsbDtcbiAgI3JvdGF0aW9uID0gMDtcbiAgI3NjYWxlID0gMDtcbiAgI3N0eWxlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAjdGV4dENvbnRlbnRJdGVtc1N0ciA9IFtdO1xuICAjdGV4dENvbnRlbnRTb3VyY2UgPSBudWxsO1xuICAjdGV4dERpdnMgPSBbXTtcbiAgI3RleHREaXZQcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcbiAgI3RyYW5zZm9ybSA9IG51bGw7XG4gIHN0YXRpYyAjYXNjZW50Q2FjaGUgPSBuZXcgTWFwKCk7XG4gIHN0YXRpYyAjY2FudmFzQ29udGV4dHMgPSBuZXcgTWFwKCk7XG4gIHN0YXRpYyAjbWluRm9udFNpemUgPSBudWxsO1xuICBzdGF0aWMgI3BlbmRpbmdUZXh0TGF5ZXJzID0gbmV3IFNldCgpO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgdGV4dENvbnRlbnRTb3VyY2UsXG4gICAgY29udGFpbmVyLFxuICAgIHZpZXdwb3J0XG4gIH0pIHtcbiAgICBpZiAodGV4dENvbnRlbnRTb3VyY2UgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkge1xuICAgICAgdGhpcy4jdGV4dENvbnRlbnRTb3VyY2UgPSB0ZXh0Q29udGVudFNvdXJjZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0ZXh0Q29udGVudFNvdXJjZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy4jdGV4dENvbnRlbnRTb3VyY2UgPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHRleHRDb250ZW50U291cmNlKTtcbiAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFwidGV4dENvbnRlbnRTb3VyY2VcIiBwYXJhbWV0ZXIgc3BlY2lmaWVkLicpO1xuICAgIH1cbiAgICB0aGlzLiNjb250YWluZXIgPSB0aGlzLiNyb290Q29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuI3NjYWxlID0gdmlld3BvcnQuc2NhbGUgKiAoZ2xvYmFsVGhpcy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpO1xuICAgIHRoaXMuI3JvdGF0aW9uID0gdmlld3BvcnQucm90YXRpb247XG4gICAgdGhpcy4jbGF5b3V0VGV4dFBhcmFtcyA9IHtcbiAgICAgIHByZXZGb250U2l6ZTogbnVsbCxcbiAgICAgIHByZXZGb250RmFtaWx5OiBudWxsLFxuICAgICAgZGl2OiBudWxsLFxuICAgICAgcHJvcGVydGllczogbnVsbCxcbiAgICAgIGN0eDogbnVsbFxuICAgIH07XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVdpZHRoLFxuICAgICAgcGFnZUhlaWdodCxcbiAgICAgIHBhZ2VYLFxuICAgICAgcGFnZVlcbiAgICB9ID0gdmlld3BvcnQucmF3RGltcztcbiAgICB0aGlzLiN0cmFuc2Zvcm0gPSBbMSwgMCwgMCwgLTEsIC1wYWdlWCwgcGFnZVkgKyBwYWdlSGVpZ2h0XTtcbiAgICB0aGlzLiNwYWdlV2lkdGggPSBwYWdlV2lkdGg7XG4gICAgdGhpcy4jcGFnZUhlaWdodCA9IHBhZ2VIZWlnaHQ7XG4gICAgVGV4dExheWVyLiNlbnN1cmVNaW5Gb250U2l6ZUNvbXB1dGVkKCk7XG4gICAgc2V0TGF5ZXJEaW1lbnNpb25zKGNvbnRhaW5lciwgdmlld3BvcnQpO1xuICAgIHRoaXMuI2NhcGFiaWxpdHkucHJvbWlzZS5jYXRjaCgoKSA9PiB7fSkudGhlbigoKSA9PiB7XG4gICAgICBUZXh0TGF5ZXIuI3BlbmRpbmdUZXh0TGF5ZXJzLmRlbGV0ZSh0aGlzKTtcbiAgICAgIHRoaXMuI2xheW91dFRleHRQYXJhbXMgPSBudWxsO1xuICAgICAgdGhpcy4jc3R5bGVDYWNoZSA9IG51bGw7XG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHB1bXAgPSAoKSA9PiB7XG4gICAgICB0aGlzLiNyZWFkZXIucmVhZCgpLnRoZW4oKHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGRvbmVcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICB0aGlzLiNjYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jbGFuZyA/Pz0gdmFsdWUubGFuZztcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLiNzdHlsZUNhY2hlLCB2YWx1ZS5zdHlsZXMpO1xuICAgICAgICB0aGlzLiNwcm9jZXNzSXRlbXModmFsdWUuaXRlbXMpO1xuICAgICAgICBwdW1wKCk7XG4gICAgICB9LCB0aGlzLiNjYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgfTtcbiAgICB0aGlzLiNyZWFkZXIgPSB0aGlzLiN0ZXh0Q29udGVudFNvdXJjZS5nZXRSZWFkZXIoKTtcbiAgICBUZXh0TGF5ZXIuI3BlbmRpbmdUZXh0TGF5ZXJzLmFkZCh0aGlzKTtcbiAgICBwdW1wKCk7XG4gICAgcmV0dXJuIHRoaXMuI2NhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICB1cGRhdGUoe1xuICAgIHZpZXdwb3J0LFxuICAgIG9uQmVmb3JlID0gbnVsbFxuICB9KSB7XG4gICAgY29uc3Qgc2NhbGUgPSB2aWV3cG9ydC5zY2FsZSAqIChnbG9iYWxUaGlzLmRldmljZVBpeGVsUmF0aW8gfHwgMSk7XG4gICAgY29uc3Qgcm90YXRpb24gPSB2aWV3cG9ydC5yb3RhdGlvbjtcbiAgICBpZiAocm90YXRpb24gIT09IHRoaXMuI3JvdGF0aW9uKSB7XG4gICAgICBvbkJlZm9yZT8uKCk7XG4gICAgICB0aGlzLiNyb3RhdGlvbiA9IHJvdGF0aW9uO1xuICAgICAgc2V0TGF5ZXJEaW1lbnNpb25zKHRoaXMuI3Jvb3RDb250YWluZXIsIHtcbiAgICAgICAgcm90YXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2NhbGUgIT09IHRoaXMuI3NjYWxlKSB7XG4gICAgICBvbkJlZm9yZT8uKCk7XG4gICAgICB0aGlzLiNzY2FsZSA9IHNjYWxlO1xuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICBwcmV2Rm9udFNpemU6IG51bGwsXG4gICAgICAgIHByZXZGb250RmFtaWx5OiBudWxsLFxuICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgIHByb3BlcnRpZXM6IG51bGwsXG4gICAgICAgIGN0eDogVGV4dExheWVyLiNnZXRDdHgodGhpcy4jbGFuZylcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IGRpdiBvZiB0aGlzLiN0ZXh0RGl2cykge1xuICAgICAgICBwYXJhbXMucHJvcGVydGllcyA9IHRoaXMuI3RleHREaXZQcm9wZXJ0aWVzLmdldChkaXYpO1xuICAgICAgICBwYXJhbXMuZGl2ID0gZGl2O1xuICAgICAgICB0aGlzLiNsYXlvdXQocGFyYW1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY2FuY2VsKCkge1xuICAgIGNvbnN0IGFib3J0RXggPSBuZXcgQWJvcnRFeGNlcHRpb24oXCJUZXh0TGF5ZXIgdGFzayBjYW5jZWxsZWQuXCIpO1xuICAgIHRoaXMuI3JlYWRlcj8uY2FuY2VsKGFib3J0RXgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB0aGlzLiNyZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuI2NhcGFiaWxpdHkucmVqZWN0KGFib3J0RXgpO1xuICB9XG4gIGdldCB0ZXh0RGl2cygpIHtcbiAgICByZXR1cm4gdGhpcy4jdGV4dERpdnM7XG4gIH1cbiAgZ2V0IHRleHRDb250ZW50SXRlbXNTdHIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RleHRDb250ZW50SXRlbXNTdHI7XG4gIH1cbiAgI3Byb2Nlc3NJdGVtcyhpdGVtcykge1xuICAgIGlmICh0aGlzLiNkaXNhYmxlUHJvY2Vzc0l0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2xheW91dFRleHRQYXJhbXMuY3R4ID8/PSBUZXh0TGF5ZXIuI2dldEN0eCh0aGlzLiNsYW5nKTtcbiAgICBjb25zdCB0ZXh0RGl2cyA9IHRoaXMuI3RleHREaXZzLFxuICAgICAgdGV4dENvbnRlbnRJdGVtc1N0ciA9IHRoaXMuI3RleHRDb250ZW50SXRlbXNTdHI7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAodGV4dERpdnMubGVuZ3RoID4gTUFYX1RFWFRfRElWU19UT19SRU5ERVIpIHtcbiAgICAgICAgd2FybihcIklnbm9yaW5nIGFkZGl0aW9uYWwgdGV4dERpdnMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuXCIpO1xuICAgICAgICB0aGlzLiNkaXNhYmxlUHJvY2Vzc0l0ZW1zID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uc3RyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJiZWdpbk1hcmtlZENvbnRlbnRQcm9wc1wiIHx8IGl0ZW0udHlwZSA9PT0gXCJiZWdpbk1hcmtlZENvbnRlbnRcIikge1xuICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuI2NvbnRhaW5lcjtcbiAgICAgICAgICB0aGlzLiNjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgICB0aGlzLiNjb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcmtlZENvbnRlbnRcIik7XG4gICAgICAgICAgaWYgKGl0ZW0uaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBgJHtpdGVtLmlkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJlbnQuYXBwZW5kKHRoaXMuI2NvbnRhaW5lcik7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSBcImVuZE1hcmtlZENvbnRlbnRcIikge1xuICAgICAgICAgIHRoaXMuI2NvbnRhaW5lciA9IHRoaXMuI2NvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGV4dENvbnRlbnRJdGVtc1N0ci5wdXNoKGl0ZW0uc3RyKTtcbiAgICAgIHRoaXMuI2FwcGVuZFRleHQoaXRlbSk7XG4gICAgfVxuICB9XG4gICNhcHBlbmRUZXh0KGdlb20pIHtcbiAgICBjb25zdCB0ZXh0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgY29uc3QgdGV4dERpdlByb3BlcnRpZXMgPSB7XG4gICAgICBhbmdsZTogMCxcbiAgICAgIGNhbnZhc1dpZHRoOiAwLFxuICAgICAgaGFzVGV4dDogZ2VvbS5zdHIgIT09IFwiXCIsXG4gICAgICBoYXNFT0w6IGdlb20uaGFzRU9MLFxuICAgICAgZm9udFNpemU6IDBcbiAgICB9O1xuICAgIHRoaXMuI3RleHREaXZzLnB1c2godGV4dERpdik7XG4gICAgY29uc3QgdHggPSBVdGlsLnRyYW5zZm9ybSh0aGlzLiN0cmFuc2Zvcm0sIGdlb20udHJhbnNmb3JtKTtcbiAgICBsZXQgYW5nbGUgPSBNYXRoLmF0YW4yKHR4WzFdLCB0eFswXSk7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLiNzdHlsZUNhY2hlW2dlb20uZm9udE5hbWVdO1xuICAgIGlmIChzdHlsZS52ZXJ0aWNhbCkge1xuICAgICAgYW5nbGUgKz0gTWF0aC5QSSAvIDI7XG4gICAgfVxuICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLiNmb250SW5zcGVjdG9yRW5hYmxlZCAmJiBzdHlsZS5mb250U3Vic3RpdHV0aW9uIHx8IHN0eWxlLmZvbnRGYW1pbHk7XG4gICAgY29uc3QgZm9udEhlaWdodCA9IE1hdGguaHlwb3QodHhbMl0sIHR4WzNdKTtcbiAgICBjb25zdCBmb250QXNjZW50ID0gZm9udEhlaWdodCAqIFRleHRMYXllci4jZ2V0QXNjZW50KGZvbnRGYW1pbHksIHRoaXMuI2xhbmcpO1xuICAgIGxldCBsZWZ0LCB0b3A7XG4gICAgaWYgKGFuZ2xlID09PSAwKSB7XG4gICAgICBsZWZ0ID0gdHhbNF07XG4gICAgICB0b3AgPSB0eFs1XSAtIGZvbnRBc2NlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlZnQgPSB0eFs0XSArIGZvbnRBc2NlbnQgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgICB0b3AgPSB0eFs1XSAtIGZvbnRBc2NlbnQgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgfVxuICAgIGNvbnN0IHNjYWxlRmFjdG9yU3RyID0gXCJjYWxjKHZhcigtLXNjYWxlLWZhY3RvcikqXCI7XG4gICAgY29uc3QgZGl2U3R5bGUgPSB0ZXh0RGl2LnN0eWxlO1xuICAgIGlmICh0aGlzLiNjb250YWluZXIgPT09IHRoaXMuI3Jvb3RDb250YWluZXIpIHtcbiAgICAgIGRpdlN0eWxlLmxlZnQgPSBgJHsoMTAwICogbGVmdCAvIHRoaXMuI3BhZ2VXaWR0aCkudG9GaXhlZCgyKX0lYDtcbiAgICAgIGRpdlN0eWxlLnRvcCA9IGAkeygxMDAgKiB0b3AgLyB0aGlzLiNwYWdlSGVpZ2h0KS50b0ZpeGVkKDIpfSVgO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXZTdHlsZS5sZWZ0ID0gYCR7c2NhbGVGYWN0b3JTdHJ9JHtsZWZ0LnRvRml4ZWQoMil9cHgpYDtcbiAgICAgIGRpdlN0eWxlLnRvcCA9IGAke3NjYWxlRmFjdG9yU3RyfSR7dG9wLnRvRml4ZWQoMil9cHgpYDtcbiAgICB9XG4gICAgZGl2U3R5bGUuZm9udFNpemUgPSBgJHtzY2FsZUZhY3RvclN0cn0keyhUZXh0TGF5ZXIuI21pbkZvbnRTaXplICogZm9udEhlaWdodCkudG9GaXhlZCgyKX1weClgO1xuICAgIGRpdlN0eWxlLmZvbnRGYW1pbHkgPSBmb250RmFtaWx5O1xuICAgIHRleHREaXZQcm9wZXJ0aWVzLmZvbnRTaXplID0gZm9udEhlaWdodDtcbiAgICB0ZXh0RGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJwcmVzZW50YXRpb25cIik7XG4gICAgdGV4dERpdi50ZXh0Q29udGVudCA9IGdlb20uc3RyO1xuICAgIHRleHREaXYuZGlyID0gZ2VvbS5kaXI7XG4gICAgaWYgKHRoaXMuI2ZvbnRJbnNwZWN0b3JFbmFibGVkKSB7XG4gICAgICB0ZXh0RGl2LmRhdGFzZXQuZm9udE5hbWUgPSBzdHlsZS5mb250U3Vic3RpdHV0aW9uTG9hZGVkTmFtZSB8fCBnZW9tLmZvbnROYW1lO1xuICAgIH1cbiAgICBpZiAoYW5nbGUgIT09IDApIHtcbiAgICAgIHRleHREaXZQcm9wZXJ0aWVzLmFuZ2xlID0gYW5nbGUgKiAoMTgwIC8gTWF0aC5QSSk7XG4gICAgfVxuICAgIGxldCBzaG91bGRTY2FsZVRleHQgPSBmYWxzZTtcbiAgICBpZiAoZ2VvbS5zdHIubGVuZ3RoID4gMSkge1xuICAgICAgc2hvdWxkU2NhbGVUZXh0ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGdlb20uc3RyICE9PSBcIiBcIiAmJiBnZW9tLnRyYW5zZm9ybVswXSAhPT0gZ2VvbS50cmFuc2Zvcm1bM10pIHtcbiAgICAgIGNvbnN0IGFic1NjYWxlWCA9IE1hdGguYWJzKGdlb20udHJhbnNmb3JtWzBdKSxcbiAgICAgICAgYWJzU2NhbGVZID0gTWF0aC5hYnMoZ2VvbS50cmFuc2Zvcm1bM10pO1xuICAgICAgaWYgKGFic1NjYWxlWCAhPT0gYWJzU2NhbGVZICYmIE1hdGgubWF4KGFic1NjYWxlWCwgYWJzU2NhbGVZKSAvIE1hdGgubWluKGFic1NjYWxlWCwgYWJzU2NhbGVZKSA+IDEuNSkge1xuICAgICAgICBzaG91bGRTY2FsZVRleHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkU2NhbGVUZXh0KSB7XG4gICAgICB0ZXh0RGl2UHJvcGVydGllcy5jYW52YXNXaWR0aCA9IHN0eWxlLnZlcnRpY2FsID8gZ2VvbS5oZWlnaHQgOiBnZW9tLndpZHRoO1xuICAgIH1cbiAgICB0aGlzLiN0ZXh0RGl2UHJvcGVydGllcy5zZXQodGV4dERpdiwgdGV4dERpdlByb3BlcnRpZXMpO1xuICAgIHRoaXMuI2xheW91dFRleHRQYXJhbXMuZGl2ID0gdGV4dERpdjtcbiAgICB0aGlzLiNsYXlvdXRUZXh0UGFyYW1zLnByb3BlcnRpZXMgPSB0ZXh0RGl2UHJvcGVydGllcztcbiAgICB0aGlzLiNsYXlvdXQodGhpcy4jbGF5b3V0VGV4dFBhcmFtcyk7XG4gICAgaWYgKHRleHREaXZQcm9wZXJ0aWVzLmhhc1RleHQpIHtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5hcHBlbmQodGV4dERpdik7XG4gICAgfVxuICAgIGlmICh0ZXh0RGl2UHJvcGVydGllcy5oYXNFT0wpIHtcbiAgICAgIGNvbnN0IGJyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpO1xuICAgICAgYnIuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInByZXNlbnRhdGlvblwiKTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5hcHBlbmQoYnIpO1xuICAgIH1cbiAgfVxuICAjbGF5b3V0KHBhcmFtcykge1xuICAgIGNvbnN0IHtcbiAgICAgIGRpdixcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICBjdHgsXG4gICAgICBwcmV2Rm9udFNpemUsXG4gICAgICBwcmV2Rm9udEZhbWlseVxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gZGl2O1xuICAgIGxldCB0cmFuc2Zvcm0gPSBcIlwiO1xuICAgIGlmIChUZXh0TGF5ZXIuI21pbkZvbnRTaXplID4gMSkge1xuICAgICAgdHJhbnNmb3JtID0gYHNjYWxlKCR7MSAvIFRleHRMYXllci4jbWluRm9udFNpemV9KWA7XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0aWVzLmNhbnZhc1dpZHRoICE9PSAwICYmIHByb3BlcnRpZXMuaGFzVGV4dCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmb250RmFtaWx5XG4gICAgICB9ID0gc3R5bGU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNhbnZhc1dpZHRoLFxuICAgICAgICBmb250U2l6ZVxuICAgICAgfSA9IHByb3BlcnRpZXM7XG4gICAgICBpZiAocHJldkZvbnRTaXplICE9PSBmb250U2l6ZSB8fCBwcmV2Rm9udEZhbWlseSAhPT0gZm9udEZhbWlseSkge1xuICAgICAgICBjdHguZm9udCA9IGAke2ZvbnRTaXplICogdGhpcy4jc2NhbGV9cHggJHtmb250RmFtaWx5fWA7XG4gICAgICAgIHBhcmFtcy5wcmV2Rm9udFNpemUgPSBmb250U2l6ZTtcbiAgICAgICAgcGFyYW1zLnByZXZGb250RmFtaWx5ID0gZm9udEZhbWlseTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGhcbiAgICAgIH0gPSBjdHgubWVhc3VyZVRleHQoZGl2LnRleHRDb250ZW50KTtcbiAgICAgIGlmICh3aWR0aCA+IDApIHtcbiAgICAgICAgdHJhbnNmb3JtID0gYHNjYWxlWCgke2NhbnZhc1dpZHRoICogdGhpcy4jc2NhbGUgLyB3aWR0aH0pICR7dHJhbnNmb3JtfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0aWVzLmFuZ2xlICE9PSAwKSB7XG4gICAgICB0cmFuc2Zvcm0gPSBgcm90YXRlKCR7cHJvcGVydGllcy5hbmdsZX1kZWcpICR7dHJhbnNmb3JtfWA7XG4gICAgfVxuICAgIGlmICh0cmFuc2Zvcm0ubGVuZ3RoID4gMCkge1xuICAgICAgc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgY2xlYW51cCgpIHtcbiAgICBpZiAodGhpcy4jcGVuZGluZ1RleHRMYXllcnMuc2l6ZSA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYXNjZW50Q2FjaGUuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIGNhbnZhc1xuICAgIH0gb2YgdGhpcy4jY2FudmFzQ29udGV4dHMudmFsdWVzKCkpIHtcbiAgICAgIGNhbnZhcy5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy4jY2FudmFzQ29udGV4dHMuY2xlYXIoKTtcbiAgfVxuICBzdGF0aWMgI2dldEN0eChsYW5nID0gbnVsbCkge1xuICAgIGxldCBjYW52YXNDb250ZXh0ID0gdGhpcy4jY2FudmFzQ29udGV4dHMuZ2V0KGxhbmcgfHw9IFwiXCIpO1xuICAgIGlmICghY2FudmFzQ29udGV4dCkge1xuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgIGNhbnZhcy5jbGFzc05hbWUgPSBcImhpZGRlbkNhbnZhc0VsZW1lbnRcIjtcbiAgICAgIGNhbnZhcy5sYW5nID0gbGFuZztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGNhbnZhcyk7XG4gICAgICBjYW52YXNDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiLCB7XG4gICAgICAgIGFscGhhOiBmYWxzZSxcbiAgICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuI2NhbnZhc0NvbnRleHRzLnNldChsYW5nLCBjYW52YXNDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbnZhc0NvbnRleHQ7XG4gIH1cbiAgc3RhdGljICNlbnN1cmVNaW5Gb250U2l6ZUNvbXB1dGVkKCkge1xuICAgIGlmICh0aGlzLiNtaW5Gb250U2l6ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRpdi5zdHlsZS5vcGFjaXR5ID0gMDtcbiAgICBkaXYuc3R5bGUubGluZUhlaWdodCA9IDE7XG4gICAgZGl2LnN0eWxlLmZvbnRTaXplID0gXCIxcHhcIjtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBcIlhcIjtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChkaXYpO1xuICAgIHRoaXMuI21pbkZvbnRTaXplID0gZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBkaXYucmVtb3ZlKCk7XG4gIH1cbiAgc3RhdGljICNnZXRBc2NlbnQoZm9udEZhbWlseSwgbGFuZykge1xuICAgIGNvbnN0IGNhY2hlZEFzY2VudCA9IHRoaXMuI2FzY2VudENhY2hlLmdldChmb250RmFtaWx5KTtcbiAgICBpZiAoY2FjaGVkQXNjZW50KSB7XG4gICAgICByZXR1cm4gY2FjaGVkQXNjZW50O1xuICAgIH1cbiAgICBjb25zdCBjdHggPSB0aGlzLiNnZXRDdHgobGFuZyk7XG4gICAgY29uc3Qgc2F2ZWRGb250ID0gY3R4LmZvbnQ7XG4gICAgY3R4LmNhbnZhcy53aWR0aCA9IGN0eC5jYW52YXMuaGVpZ2h0ID0gREVGQVVMVF9GT05UX1NJWkU7XG4gICAgY3R4LmZvbnQgPSBgJHtERUZBVUxUX0ZPTlRfU0laRX1weCAke2ZvbnRGYW1pbHl9YDtcbiAgICBjb25zdCBtZXRyaWNzID0gY3R4Lm1lYXN1cmVUZXh0KFwiXCIpO1xuICAgIGxldCBhc2NlbnQgPSBtZXRyaWNzLmZvbnRCb3VuZGluZ0JveEFzY2VudDtcbiAgICBsZXQgZGVzY2VudCA9IE1hdGguYWJzKG1ldHJpY3MuZm9udEJvdW5kaW5nQm94RGVzY2VudCk7XG4gICAgaWYgKGFzY2VudCkge1xuICAgICAgY29uc3QgcmF0aW8gPSBhc2NlbnQgLyAoYXNjZW50ICsgZGVzY2VudCk7XG4gICAgICB0aGlzLiNhc2NlbnRDYWNoZS5zZXQoZm9udEZhbWlseSwgcmF0aW8pO1xuICAgICAgY3R4LmNhbnZhcy53aWR0aCA9IGN0eC5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICAgIGN0eC5mb250ID0gc2F2ZWRGb250O1xuICAgICAgcmV0dXJuIHJhdGlvO1xuICAgIH1cbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBcInJlZFwiO1xuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgREVGQVVMVF9GT05UX1NJWkUsIERFRkFVTFRfRk9OVF9TSVpFKTtcbiAgICBjdHguc3Ryb2tlVGV4dChcImdcIiwgMCwgMCk7XG4gICAgbGV0IHBpeGVscyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgREVGQVVMVF9GT05UX1NJWkUsIERFRkFVTFRfRk9OVF9TSVpFKS5kYXRhO1xuICAgIGRlc2NlbnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSBwaXhlbHMubGVuZ3RoIC0gMSAtIDM7IGkgPj0gMDsgaSAtPSA0KSB7XG4gICAgICBpZiAocGl4ZWxzW2ldID4gMCkge1xuICAgICAgICBkZXNjZW50ID0gTWF0aC5jZWlsKGkgLyA0IC8gREVGQVVMVF9GT05UX1NJWkUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9GT05UX1NJWkUpO1xuICAgIGN0eC5zdHJva2VUZXh0KFwiQVwiLCAwLCBERUZBVUxUX0ZPTlRfU0laRSk7XG4gICAgcGl4ZWxzID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9GT05UX1NJWkUpLmRhdGE7XG4gICAgYXNjZW50ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwaXhlbHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkge1xuICAgICAgaWYgKHBpeGVsc1tpXSA+IDApIHtcbiAgICAgICAgYXNjZW50ID0gREVGQVVMVF9GT05UX1NJWkUgLSBNYXRoLmZsb29yKGkgLyA0IC8gREVGQVVMVF9GT05UX1NJWkUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY3R4LmNhbnZhcy53aWR0aCA9IGN0eC5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICBjdHguZm9udCA9IHNhdmVkRm9udDtcbiAgICBjb25zdCByYXRpbyA9IGFzY2VudCA/IGFzY2VudCAvIChhc2NlbnQgKyBkZXNjZW50KSA6IERFRkFVTFRfRk9OVF9BU0NFTlQ7XG4gICAgdGhpcy4jYXNjZW50Q2FjaGUuc2V0KGZvbnRGYW1pbHksIHJhdGlvKTtcbiAgICByZXR1cm4gcmF0aW87XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlclRleHRMYXllcigpIHtcbiAgZGVwcmVjYXRlZChcImByZW5kZXJUZXh0TGF5ZXJgLCBwbGVhc2UgdXNlIGBUZXh0TGF5ZXJgIGluc3RlYWQuXCIpO1xuICBjb25zdCB7XG4gICAgdGV4dENvbnRlbnRTb3VyY2UsXG4gICAgY29udGFpbmVyLFxuICAgIHZpZXdwb3J0LFxuICAgIC4uLnJlc3RcbiAgfSA9IGFyZ3VtZW50c1swXTtcbiAgY29uc3QgcmVzdEtleXMgPSBPYmplY3Qua2V5cyhyZXN0KTtcbiAgaWYgKHJlc3RLZXlzLmxlbmd0aCA+IDApIHtcbiAgICB3YXJuKFwiSWdub3JpbmcgYHJlbmRlclRleHRMYXllcmAgcGFyYW1ldGVyczogXCIgKyByZXN0S2V5cy5qb2luKFwiLCBcIikpO1xuICB9XG4gIGNvbnN0IHRleHRMYXllciA9IG5ldyBUZXh0TGF5ZXIoe1xuICAgIHRleHRDb250ZW50U291cmNlLFxuICAgIGNvbnRhaW5lcixcbiAgICB2aWV3cG9ydFxuICB9KTtcbiAgY29uc3Qge1xuICAgIHRleHREaXZzLFxuICAgIHRleHRDb250ZW50SXRlbXNTdHJcbiAgfSA9IHRleHRMYXllcjtcbiAgY29uc3QgcHJvbWlzZSA9IHRleHRMYXllci5yZW5kZXIoKTtcbiAgcmV0dXJuIHtcbiAgICBwcm9taXNlLFxuICAgIHRleHREaXZzLFxuICAgIHRleHRDb250ZW50SXRlbXNTdHJcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVRleHRMYXllcigpIHtcbiAgZGVwcmVjYXRlZChcImB1cGRhdGVUZXh0TGF5ZXJgLCBwbGVhc2UgdXNlIGBUZXh0TGF5ZXJgIGluc3RlYWQuXCIpO1xufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS94ZmFfdGV4dC5qc1xuY2xhc3MgWGZhVGV4dCB7XG4gIHN0YXRpYyB0ZXh0Q29udGVudCh4ZmEpIHtcbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGNvbnN0IG91dHB1dCA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgc3R5bGVzOiBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgfTtcbiAgICBmdW5jdGlvbiB3YWxrKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgc3RyID0gbnVsbDtcbiAgICAgIGNvbnN0IG5hbWUgPSBub2RlLm5hbWU7XG4gICAgICBpZiAobmFtZSA9PT0gXCIjdGV4dFwiKSB7XG4gICAgICAgIHN0ciA9IG5vZGUudmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKCFYZmFUZXh0LnNob3VsZEJ1aWxkVGV4dChuYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKG5vZGU/LmF0dHJpYnV0ZXM/LnRleHRDb250ZW50KSB7XG4gICAgICAgIHN0ciA9IG5vZGUuYXR0cmlidXRlcy50ZXh0Q29udGVudDtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgICBzdHIgPSBub2RlLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHN0ciAhPT0gbnVsbCkge1xuICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICBzdHJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIHdhbGsoY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICB3YWxrKHhmYSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuICBzdGF0aWMgc2hvdWxkQnVpbGRUZXh0KG5hbWUpIHtcbiAgICByZXR1cm4gIShuYW1lID09PSBcInRleHRhcmVhXCIgfHwgbmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5hbWUgPT09IFwib3B0aW9uXCIgfHwgbmFtZSA9PT0gXCJzZWxlY3RcIik7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvYXBpLmpzXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IERFRkFVTFRfUkFOR0VfQ0hVTktfU0laRSA9IDY1NTM2O1xuY29uc3QgUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUID0gMTAwO1xuY29uc3QgREVMQVlFRF9DTEVBTlVQX1RJTUVPVVQgPSA1MDAwO1xuY29uc3QgRGVmYXVsdENhbnZhc0ZhY3RvcnkgPSBpc05vZGVKUyA/IE5vZGVDYW52YXNGYWN0b3J5IDogRE9NQ2FudmFzRmFjdG9yeTtcbmNvbnN0IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeSA9IGlzTm9kZUpTID8gTm9kZUNNYXBSZWFkZXJGYWN0b3J5IDogRE9NQ01hcFJlYWRlckZhY3Rvcnk7XG5jb25zdCBEZWZhdWx0RmlsdGVyRmFjdG9yeSA9IGlzTm9kZUpTID8gTm9kZUZpbHRlckZhY3RvcnkgOiBET01GaWx0ZXJGYWN0b3J5O1xuY29uc3QgRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gaXNOb2RlSlMgPyBOb2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgOiBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcbmZ1bmN0aW9uIGdldERvY3VtZW50KHNyYyA9IHt9KSB7XG4gIGlmICh0eXBlb2Ygc3JjID09PSBcInN0cmluZ1wiIHx8IHNyYyBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHNyYyA9IHtcbiAgICAgIHVybDogc3JjXG4gICAgfTtcbiAgfSBlbHNlIGlmIChzcmMgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcoc3JjKSkge1xuICAgIHNyYyA9IHtcbiAgICAgIGRhdGE6IHNyY1xuICAgIH07XG4gIH1cbiAgY29uc3QgdGFzayA9IG5ldyBQREZEb2N1bWVudExvYWRpbmdUYXNrKCk7XG4gIGNvbnN0IHtcbiAgICBkb2NJZFxuICB9ID0gdGFzaztcbiAgY29uc3QgdXJsID0gc3JjLnVybCA/IGdldFVybFByb3Aoc3JjLnVybCkgOiBudWxsO1xuICBjb25zdCBkYXRhID0gc3JjLmRhdGEgPyBnZXREYXRhUHJvcChzcmMuZGF0YSkgOiBudWxsO1xuICBjb25zdCBodHRwSGVhZGVycyA9IHNyYy5odHRwSGVhZGVycyB8fCBudWxsO1xuICBjb25zdCB3aXRoQ3JlZGVudGlhbHMgPSBzcmMud2l0aENyZWRlbnRpYWxzID09PSB0cnVlO1xuICBjb25zdCBwYXNzd29yZCA9IHNyYy5wYXNzd29yZCA/PyBudWxsO1xuICBjb25zdCByYW5nZVRyYW5zcG9ydCA9IHNyYy5yYW5nZSBpbnN0YW5jZW9mIFBERkRhdGFSYW5nZVRyYW5zcG9ydCA/IHNyYy5yYW5nZSA6IG51bGw7XG4gIGNvbnN0IHJhbmdlQ2h1bmtTaXplID0gTnVtYmVyLmlzSW50ZWdlcihzcmMucmFuZ2VDaHVua1NpemUpICYmIHNyYy5yYW5nZUNodW5rU2l6ZSA+IDAgPyBzcmMucmFuZ2VDaHVua1NpemUgOiBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkU7XG4gIGxldCB3b3JrZXIgPSBzcmMud29ya2VyIGluc3RhbmNlb2YgUERGV29ya2VyID8gc3JjLndvcmtlciA6IG51bGw7XG4gIGNvbnN0IHZlcmJvc2l0eSA9IHNyYy52ZXJib3NpdHk7XG4gIGNvbnN0IGRvY0Jhc2VVcmwgPSB0eXBlb2Ygc3JjLmRvY0Jhc2VVcmwgPT09IFwic3RyaW5nXCIgJiYgIWlzRGF0YVNjaGVtZShzcmMuZG9jQmFzZVVybCkgPyBzcmMuZG9jQmFzZVVybCA6IG51bGw7XG4gIGNvbnN0IGNNYXBVcmwgPSB0eXBlb2Ygc3JjLmNNYXBVcmwgPT09IFwic3RyaW5nXCIgPyBzcmMuY01hcFVybCA6IG51bGw7XG4gIGNvbnN0IGNNYXBQYWNrZWQgPSBzcmMuY01hcFBhY2tlZCAhPT0gZmFsc2U7XG4gIGNvbnN0IENNYXBSZWFkZXJGYWN0b3J5ID0gc3JjLkNNYXBSZWFkZXJGYWN0b3J5IHx8IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeTtcbiAgY29uc3Qgc3RhbmRhcmRGb250RGF0YVVybCA9IHR5cGVvZiBzcmMuc3RhbmRhcmRGb250RGF0YVVybCA9PT0gXCJzdHJpbmdcIiA/IHNyYy5zdGFuZGFyZEZvbnREYXRhVXJsIDogbnVsbDtcbiAgY29uc3QgU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBzcmMuU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgfHwgRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuICBjb25zdCBpZ25vcmVFcnJvcnMgPSBzcmMuc3RvcEF0RXJyb3JzICE9PSB0cnVlO1xuICBjb25zdCBtYXhJbWFnZVNpemUgPSBOdW1iZXIuaXNJbnRlZ2VyKHNyYy5tYXhJbWFnZVNpemUpICYmIHNyYy5tYXhJbWFnZVNpemUgPiAtMSA/IHNyYy5tYXhJbWFnZVNpemUgOiAtMTtcbiAgY29uc3QgaXNFdmFsU3VwcG9ydGVkID0gc3JjLmlzRXZhbFN1cHBvcnRlZCAhPT0gZmFsc2U7XG4gIGNvbnN0IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gdHlwZW9mIHNyYy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9PT0gXCJib29sZWFuXCIgPyBzcmMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgOiAhaXNOb2RlSlM7XG4gIGNvbnN0IGNhbnZhc01heEFyZWFJbkJ5dGVzID0gTnVtYmVyLmlzSW50ZWdlcihzcmMuY2FudmFzTWF4QXJlYUluQnl0ZXMpID8gc3JjLmNhbnZhc01heEFyZWFJbkJ5dGVzIDogLTE7XG4gIGNvbnN0IGRpc2FibGVGb250RmFjZSA9IHR5cGVvZiBzcmMuZGlzYWJsZUZvbnRGYWNlID09PSBcImJvb2xlYW5cIiA/IHNyYy5kaXNhYmxlRm9udEZhY2UgOiBpc05vZGVKUztcbiAgY29uc3QgZm9udEV4dHJhUHJvcGVydGllcyA9IHNyYy5mb250RXh0cmFQcm9wZXJ0aWVzID09PSB0cnVlO1xuICBjb25zdCBlbmFibGVYZmEgPSBzcmMuZW5hYmxlWGZhID09PSB0cnVlO1xuICBjb25zdCBvd25lckRvY3VtZW50ID0gc3JjLm93bmVyRG9jdW1lbnQgfHwgZ2xvYmFsVGhpcy5kb2N1bWVudDtcbiAgY29uc3QgZGlzYWJsZVJhbmdlID0gc3JjLmRpc2FibGVSYW5nZSA9PT0gdHJ1ZTtcbiAgY29uc3QgZGlzYWJsZVN0cmVhbSA9IHNyYy5kaXNhYmxlU3RyZWFtID09PSB0cnVlO1xuICBjb25zdCBkaXNhYmxlQXV0b0ZldGNoID0gc3JjLmRpc2FibGVBdXRvRmV0Y2ggPT09IHRydWU7XG4gIGNvbnN0IHBkZkJ1ZyA9IHNyYy5wZGZCdWcgPT09IHRydWU7XG4gIGNvbnN0IGVuYWJsZUhXQSA9IHNyYy5lbmFibGVIV0EgPT09IHRydWU7XG4gIGNvbnN0IGxlbmd0aCA9IHJhbmdlVHJhbnNwb3J0ID8gcmFuZ2VUcmFuc3BvcnQubGVuZ3RoIDogc3JjLmxlbmd0aCA/PyBOYU47XG4gIGNvbnN0IHVzZVN5c3RlbUZvbnRzID0gdHlwZW9mIHNyYy51c2VTeXN0ZW1Gb250cyA9PT0gXCJib29sZWFuXCIgPyBzcmMudXNlU3lzdGVtRm9udHMgOiAhaXNOb2RlSlMgJiYgIWRpc2FibGVGb250RmFjZTtcbiAgY29uc3QgdXNlV29ya2VyRmV0Y2ggPSB0eXBlb2Ygc3JjLnVzZVdvcmtlckZldGNoID09PSBcImJvb2xlYW5cIiA/IHNyYy51c2VXb3JrZXJGZXRjaCA6IENNYXBSZWFkZXJGYWN0b3J5ID09PSBET01DTWFwUmVhZGVyRmFjdG9yeSAmJiBTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9PT0gRE9NU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgJiYgY01hcFVybCAmJiBzdGFuZGFyZEZvbnREYXRhVXJsICYmIGlzVmFsaWRGZXRjaFVybChjTWFwVXJsLCBkb2N1bWVudC5iYXNlVVJJKSAmJiBpc1ZhbGlkRmV0Y2hVcmwoc3RhbmRhcmRGb250RGF0YVVybCwgZG9jdW1lbnQuYmFzZVVSSSk7XG4gIGNvbnN0IGNhbnZhc0ZhY3RvcnkgPSBzcmMuY2FudmFzRmFjdG9yeSB8fCBuZXcgRGVmYXVsdENhbnZhc0ZhY3Rvcnkoe1xuICAgIG93bmVyRG9jdW1lbnQsXG4gICAgZW5hYmxlSFdBXG4gIH0pO1xuICBjb25zdCBmaWx0ZXJGYWN0b3J5ID0gc3JjLmZpbHRlckZhY3RvcnkgfHwgbmV3IERlZmF1bHRGaWx0ZXJGYWN0b3J5KHtcbiAgICBkb2NJZCxcbiAgICBvd25lckRvY3VtZW50XG4gIH0pO1xuICBjb25zdCBzdHlsZUVsZW1lbnQgPSBudWxsO1xuICBzZXRWZXJib3NpdHlMZXZlbCh2ZXJib3NpdHkpO1xuICBjb25zdCB0cmFuc3BvcnRGYWN0b3J5ID0ge1xuICAgIGNhbnZhc0ZhY3RvcnksXG4gICAgZmlsdGVyRmFjdG9yeVxuICB9O1xuICBpZiAoIXVzZVdvcmtlckZldGNoKSB7XG4gICAgdHJhbnNwb3J0RmFjdG9yeS5jTWFwUmVhZGVyRmFjdG9yeSA9IG5ldyBDTWFwUmVhZGVyRmFjdG9yeSh7XG4gICAgICBiYXNlVXJsOiBjTWFwVXJsLFxuICAgICAgaXNDb21wcmVzc2VkOiBjTWFwUGFja2VkXG4gICAgfSk7XG4gICAgdHJhbnNwb3J0RmFjdG9yeS5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IG5ldyBTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSh7XG4gICAgICBiYXNlVXJsOiBzdGFuZGFyZEZvbnREYXRhVXJsXG4gICAgfSk7XG4gIH1cbiAgaWYgKCF3b3JrZXIpIHtcbiAgICBjb25zdCB3b3JrZXJQYXJhbXMgPSB7XG4gICAgICB2ZXJib3NpdHksXG4gICAgICBwb3J0OiBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnRcbiAgICB9O1xuICAgIHdvcmtlciA9IHdvcmtlclBhcmFtcy5wb3J0ID8gUERGV29ya2VyLmZyb21Qb3J0KHdvcmtlclBhcmFtcykgOiBuZXcgUERGV29ya2VyKHdvcmtlclBhcmFtcyk7XG4gICAgdGFzay5fd29ya2VyID0gd29ya2VyO1xuICB9XG4gIGNvbnN0IGRvY1BhcmFtcyA9IHtcbiAgICBkb2NJZCxcbiAgICBhcGlWZXJzaW9uOiBcIjQuNC4xNjhcIixcbiAgICBkYXRhLFxuICAgIHBhc3N3b3JkLFxuICAgIGRpc2FibGVBdXRvRmV0Y2gsXG4gICAgcmFuZ2VDaHVua1NpemUsXG4gICAgbGVuZ3RoLFxuICAgIGRvY0Jhc2VVcmwsXG4gICAgZW5hYmxlWGZhLFxuICAgIGV2YWx1YXRvck9wdGlvbnM6IHtcbiAgICAgIG1heEltYWdlU2l6ZSxcbiAgICAgIGRpc2FibGVGb250RmFjZSxcbiAgICAgIGlnbm9yZUVycm9ycyxcbiAgICAgIGlzRXZhbFN1cHBvcnRlZCxcbiAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkLFxuICAgICAgY2FudmFzTWF4QXJlYUluQnl0ZXMsXG4gICAgICBmb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgICAgdXNlU3lzdGVtRm9udHMsXG4gICAgICBjTWFwVXJsOiB1c2VXb3JrZXJGZXRjaCA/IGNNYXBVcmwgOiBudWxsLFxuICAgICAgc3RhbmRhcmRGb250RGF0YVVybDogdXNlV29ya2VyRmV0Y2ggPyBzdGFuZGFyZEZvbnREYXRhVXJsIDogbnVsbFxuICAgIH1cbiAgfTtcbiAgY29uc3QgdHJhbnNwb3J0UGFyYW1zID0ge1xuICAgIGRpc2FibGVGb250RmFjZSxcbiAgICBmb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgIG93bmVyRG9jdW1lbnQsXG4gICAgcGRmQnVnLFxuICAgIHN0eWxlRWxlbWVudCxcbiAgICBsb2FkaW5nUGFyYW1zOiB7XG4gICAgICBkaXNhYmxlQXV0b0ZldGNoLFxuICAgICAgZW5hYmxlWGZhXG4gICAgfVxuICB9O1xuICB3b3JrZXIucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGFzay5kZXN0cm95ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkxvYWRpbmcgYWJvcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlci5kZXN0cm95ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpO1xuICAgIH1cbiAgICBjb25zdCB3b3JrZXJJZFByb21pc2UgPSB3b3JrZXIubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RG9jUmVxdWVzdFwiLCBkb2NQYXJhbXMsIGRhdGEgPyBbZGF0YS5idWZmZXJdIDogbnVsbCk7XG4gICAgbGV0IG5ldHdvcmtTdHJlYW07XG4gICAgaWYgKHJhbmdlVHJhbnNwb3J0KSB7XG4gICAgICBuZXR3b3JrU3RyZWFtID0gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW0ocmFuZ2VUcmFuc3BvcnQsIHtcbiAgICAgICAgZGlzYWJsZVJhbmdlLFxuICAgICAgICBkaXNhYmxlU3RyZWFtXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCFkYXRhKSB7XG4gICAgICBpZiAoIXVybCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJnZXREb2N1bWVudCAtIG5vIGB1cmxgIHBhcmFtZXRlciBwcm92aWRlZC5cIik7XG4gICAgICB9XG4gICAgICBjb25zdCBjcmVhdGVQREZOZXR3b3JrU3RyZWFtID0gcGFyYW1zID0+IHtcbiAgICAgICAgaWYgKGlzTm9kZUpTKSB7XG4gICAgICAgICAgY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZmV0Y2ggIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIFJlc3BvbnNlICE9PSBcInVuZGVmaW5lZFwiICYmIFwiYm9keVwiIGluIFJlc3BvbnNlLnByb3RvdHlwZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBpc0ZldGNoU3VwcG9ydGVkKCkgJiYgaXNWYWxpZEZldGNoVXJsKHBhcmFtcy51cmwpID8gbmV3IFBERkZldGNoU3RyZWFtKHBhcmFtcykgOiBuZXcgUERGTm9kZVN0cmVhbShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1ZhbGlkRmV0Y2hVcmwocGFyYW1zLnVybCkgPyBuZXcgUERGRmV0Y2hTdHJlYW0ocGFyYW1zKSA6IG5ldyBQREZOZXR3b3JrU3RyZWFtKHBhcmFtcyk7XG4gICAgICB9O1xuICAgICAgbmV0d29ya1N0cmVhbSA9IGNyZWF0ZVBERk5ldHdvcmtTdHJlYW0oe1xuICAgICAgICB1cmwsXG4gICAgICAgIGxlbmd0aCxcbiAgICAgICAgaHR0cEhlYWRlcnMsXG4gICAgICAgIHdpdGhDcmVkZW50aWFscyxcbiAgICAgICAgcmFuZ2VDaHVua1NpemUsXG4gICAgICAgIGRpc2FibGVSYW5nZSxcbiAgICAgICAgZGlzYWJsZVN0cmVhbVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB3b3JrZXJJZFByb21pc2UudGhlbih3b3JrZXJJZCA9PiB7XG4gICAgICBpZiAodGFzay5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHdvcmtlci5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihkb2NJZCwgd29ya2VySWQsIHdvcmtlci5wb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBXb3JrZXJUcmFuc3BvcnQobWVzc2FnZUhhbmRsZXIsIHRhc2ssIG5ldHdvcmtTdHJlYW0sIHRyYW5zcG9ydFBhcmFtcywgdHJhbnNwb3J0RmFjdG9yeSk7XG4gICAgICB0YXNrLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKFwiUmVhZHlcIiwgbnVsbCk7XG4gICAgfSk7XG4gIH0pLmNhdGNoKHRhc2suX2NhcGFiaWxpdHkucmVqZWN0KTtcbiAgcmV0dXJuIHRhc2s7XG59XG5mdW5jdGlvbiBnZXRVcmxQcm9wKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgcmV0dXJuIHZhbC5ocmVmO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwodmFsLCB3aW5kb3cubG9jYXRpb24pLmhyZWY7XG4gIH0gY2F0Y2gge1xuICAgIGlmIChpc05vZGVKUyAmJiB0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFBERiB1cmwgZGF0YTogXCIgKyBcImVpdGhlciBzdHJpbmcgb3IgVVJMLW9iamVjdCBpcyBleHBlY3RlZCBpbiB0aGUgdXJsIHByb3BlcnR5LlwiKTtcbn1cbmZ1bmN0aW9uIGdldERhdGFQcm9wKHZhbCkge1xuICBpZiAoaXNOb2RlSlMgJiYgdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWwgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2UgcHJvdmlkZSBiaW5hcnkgZGF0YSBhcyBgVWludDhBcnJheWAsIHJhdGhlciB0aGFuIGBCdWZmZXJgLlwiKTtcbiAgfVxuICBpZiAodmFsIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiB2YWwuYnl0ZUxlbmd0aCA9PT0gdmFsLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBzdHJpbmdUb0J5dGVzKHZhbCk7XG4gIH1cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpIHx8IHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgJiYgIWlzTmFOKHZhbD8ubGVuZ3RoKSkge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheSh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgUERGIGJpbmFyeSBkYXRhOiBlaXRoZXIgVHlwZWRBcnJheSwgXCIgKyBcInN0cmluZywgb3IgYXJyYXktbGlrZSBvYmplY3QgaXMgZXhwZWN0ZWQgaW4gdGhlIGRhdGEgcHJvcGVydHkuXCIpO1xufVxuZnVuY3Rpb24gaXNSZWZQcm94eShyZWYpIHtcbiAgcmV0dXJuIHR5cGVvZiByZWYgPT09IFwib2JqZWN0XCIgJiYgTnVtYmVyLmlzSW50ZWdlcihyZWY/Lm51bSkgJiYgcmVmLm51bSA+PSAwICYmIE51bWJlci5pc0ludGVnZXIocmVmPy5nZW4pICYmIHJlZi5nZW4gPj0gMDtcbn1cbmNsYXNzIFBERkRvY3VtZW50TG9hZGluZ1Rhc2sge1xuICBzdGF0aWMgI2RvY0lkID0gMDtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fY2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuX3RyYW5zcG9ydCA9IG51bGw7XG4gICAgdGhpcy5fd29ya2VyID0gbnVsbDtcbiAgICB0aGlzLmRvY0lkID0gYGQke1BERkRvY3VtZW50TG9hZGluZ1Rhc2suI2RvY0lkKyt9YDtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMub25QYXNzd29yZCA9IG51bGw7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuICBnZXQgcHJvbWlzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5fd29ya2VyPy5wb3J0KSB7XG4gICAgICAgIHRoaXMuX3dvcmtlci5fcGVuZGluZ0Rlc3Ryb3kgPSB0cnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5fdHJhbnNwb3J0Py5kZXN0cm95KCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmICh0aGlzLl93b3JrZXI/LnBvcnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3dvcmtlci5fcGVuZGluZ0Rlc3Ryb3k7XG4gICAgICB9XG4gICAgICB0aHJvdyBleDtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNwb3J0ID0gbnVsbDtcbiAgICBpZiAodGhpcy5fd29ya2VyKSB7XG4gICAgICB0aGlzLl93b3JrZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFBERkRhdGFSYW5nZVRyYW5zcG9ydCB7XG4gIGNvbnN0cnVjdG9yKGxlbmd0aCwgaW5pdGlhbERhdGEsIHByb2dyZXNzaXZlRG9uZSA9IGZhbHNlLCBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IG51bGwpIHtcbiAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICB0aGlzLmluaXRpYWxEYXRhID0gaW5pdGlhbERhdGE7XG4gICAgdGhpcy5wcm9ncmVzc2l2ZURvbmUgPSBwcm9ncmVzc2l2ZURvbmU7XG4gICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lO1xuICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzID0gW107XG4gICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgfVxuICBhZGRSYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fcmFuZ2VMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cbiAgYWRkUHJvZ3Jlc3NMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG4gIGFkZFByb2dyZXNzaXZlUmVhZExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG4gIGFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICB9XG4gIG9uRGF0YVJhbmdlKGJlZ2luLCBjaHVuaykge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fcmFuZ2VMaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVyKGJlZ2luLCBjaHVuayk7XG4gICAgfVxuICB9XG4gIG9uRGF0YVByb2dyZXNzKGxvYWRlZCwgdG90YWwpIHtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMpIHtcbiAgICAgICAgbGlzdGVuZXIobG9hZGVkLCB0b3RhbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgb25EYXRhUHJvZ3Jlc3NpdmVSZWFkKGNodW5rKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycykge1xuICAgICAgICBsaXN0ZW5lcihjaHVuayk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgb25EYXRhUHJvZ3Jlc3NpdmVEb25lKCkge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMpIHtcbiAgICAgICAgbGlzdGVuZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICB0cmFuc3BvcnRSZWFkeSgpIHtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9XG4gIHJlcXVlc3REYXRhUmFuZ2UoYmVnaW4sIGVuZCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIFBERkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlXCIpO1xuICB9XG4gIGFib3J0KCkge31cbn1cbmNsYXNzIFBERkRvY3VtZW50UHJveHkge1xuICBjb25zdHJ1Y3RvcihwZGZJbmZvLCB0cmFuc3BvcnQpIHtcbiAgICB0aGlzLl9wZGZJbmZvID0gcGRmSW5mbztcbiAgICB0aGlzLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gIH1cbiAgZ2V0IGFubm90YXRpb25TdG9yYWdlKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuYW5ub3RhdGlvblN0b3JhZ2U7XG4gIH1cbiAgZ2V0IGZpbHRlckZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5maWx0ZXJGYWN0b3J5O1xuICB9XG4gIGdldCBudW1QYWdlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcGRmSW5mby5udW1QYWdlcztcbiAgfVxuICBnZXQgZmluZ2VycHJpbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9wZGZJbmZvLmZpbmdlcnByaW50cztcbiAgfVxuICBnZXQgaXNQdXJlWGZhKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc1B1cmVYZmFcIiwgISF0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpO1xuICB9XG4gIGdldCBhbGxYZmFIdG1sKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmE7XG4gIH1cbiAgZ2V0UGFnZShwYWdlTnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlKHBhZ2VOdW1iZXIpO1xuICB9XG4gIGdldFBhZ2VJbmRleChyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VJbmRleChyZWYpO1xuICB9XG4gIGdldERlc3RpbmF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERlc3RpbmF0aW9ucygpO1xuICB9XG4gIGdldERlc3RpbmF0aW9uKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbihpZCk7XG4gIH1cbiAgZ2V0UGFnZUxhYmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYWJlbHMoKTtcbiAgfVxuICBnZXRQYWdlTGF5b3V0KCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxheW91dCgpO1xuICB9XG4gIGdldFBhZ2VNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZU1vZGUoKTtcbiAgfVxuICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFZpZXdlclByZWZlcmVuY2VzKCk7XG4gIH1cbiAgZ2V0T3BlbkFjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wZW5BY3Rpb24oKTtcbiAgfVxuICBnZXRBdHRhY2htZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEF0dGFjaG1lbnRzKCk7XG4gIH1cbiAgZ2V0SlNBY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RG9jSlNBY3Rpb25zKCk7XG4gIH1cbiAgZ2V0T3V0bGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE91dGxpbmUoKTtcbiAgfVxuICBnZXRPcHRpb25hbENvbnRlbnRDb25maWcoe1xuICAgIGludGVudCA9IFwiZGlzcGxheVwiXG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlbmRlcmluZ0ludGVudFxuICAgIH0gPSB0aGlzLl90cmFuc3BvcnQuZ2V0UmVuZGVyaW5nSW50ZW50KGludGVudCk7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcocmVuZGVyaW5nSW50ZW50KTtcbiAgfVxuICBnZXRQZXJtaXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBlcm1pc3Npb25zKCk7XG4gIH1cbiAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNZXRhZGF0YSgpO1xuICB9XG4gIGdldE1hcmtJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0TWFya0luZm8oKTtcbiAgfVxuICBnZXREYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGF0YSgpO1xuICB9XG4gIHNhdmVEb2N1bWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LnNhdmVEb2N1bWVudCgpO1xuICB9XG4gIGdldERvd25sb2FkSW5mbygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmRvd25sb2FkSW5mb0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBjbGVhbnVwKGtlZXBMb2FkZWRGb250cyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zdGFydENsZWFudXAoa2VlcExvYWRlZEZvbnRzIHx8IHRoaXMuaXNQdXJlWGZhKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdUYXNrLmRlc3Ryb3koKTtcbiAgfVxuICBjYWNoZWRQYWdlTnVtYmVyKHJlZikge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuY2FjaGVkUGFnZU51bWJlcihyZWYpO1xuICB9XG4gIGdldCBsb2FkaW5nUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubG9hZGluZ1BhcmFtcztcbiAgfVxuICBnZXQgbG9hZGluZ1Rhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nVGFzaztcbiAgfVxuICBnZXRGaWVsZE9iamVjdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRGaWVsZE9iamVjdHMoKTtcbiAgfVxuICBoYXNKU0FjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5oYXNKU0FjdGlvbnMoKTtcbiAgfVxuICBnZXRDYWxjdWxhdGlvbk9yZGVySWRzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0Q2FsY3VsYXRpb25PcmRlcklkcygpO1xuICB9XG59XG5jbGFzcyBQREZQYWdlUHJveHkge1xuICAjZGVsYXllZENsZWFudXBUaW1lb3V0ID0gbnVsbDtcbiAgI3BlbmRpbmdDbGVhbnVwID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHBhZ2VJbmRleCwgcGFnZUluZm8sIHRyYW5zcG9ydCwgcGRmQnVnID0gZmFsc2UpIHtcbiAgICB0aGlzLl9wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgdGhpcy5fcGFnZUluZm8gPSBwYWdlSW5mbztcbiAgICB0aGlzLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgdGhpcy5fc3RhdHMgPSBwZGZCdWcgPyBuZXcgU3RhdFRpbWVyKCkgOiBudWxsO1xuICAgIHRoaXMuX3BkZkJ1ZyA9IHBkZkJ1ZztcbiAgICB0aGlzLmNvbW1vbk9ianMgPSB0cmFuc3BvcnQuY29tbW9uT2JqcztcbiAgICB0aGlzLm9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuICAgIHRoaXMuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyID0gZmFsc2U7XG4gICAgdGhpcy5faW50ZW50U3RhdGVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gIH1cbiAgZ2V0IHBhZ2VOdW1iZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmRleCArIDE7XG4gIH1cbiAgZ2V0IHJvdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucm90YXRlO1xuICB9XG4gIGdldCByZWYoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJlZjtcbiAgfVxuICBnZXQgdXNlclVuaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnVzZXJVbml0O1xuICB9XG4gIGdldCB2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby52aWV3O1xuICB9XG4gIGdldFZpZXdwb3J0KHtcbiAgICBzY2FsZSxcbiAgICByb3RhdGlvbiA9IHRoaXMucm90YXRlLFxuICAgIG9mZnNldFggPSAwLFxuICAgIG9mZnNldFkgPSAwLFxuICAgIGRvbnRGbGlwID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQYWdlVmlld3BvcnQoe1xuICAgICAgdmlld0JveDogdGhpcy52aWV3LFxuICAgICAgc2NhbGUsXG4gICAgICByb3RhdGlvbixcbiAgICAgIG9mZnNldFgsXG4gICAgICBvZmZzZXRZLFxuICAgICAgZG9udEZsaXBcbiAgICB9KTtcbiAgfVxuICBnZXRBbm5vdGF0aW9ucyh7XG4gICAgaW50ZW50ID0gXCJkaXNwbGF5XCJcbiAgfSA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgcmVuZGVyaW5nSW50ZW50XG4gICAgfSA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KTtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEFubm90YXRpb25zKHRoaXMuX3BhZ2VJbmRleCwgcmVuZGVyaW5nSW50ZW50KTtcbiAgfVxuICBnZXRKU0FjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSlNBY3Rpb25zKHRoaXMuX3BhZ2VJbmRleCk7XG4gIH1cbiAgZ2V0IGZpbHRlckZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5maWx0ZXJGYWN0b3J5O1xuICB9XG4gIGdldCBpc1B1cmVYZmEoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzUHVyZVhmYVwiLCAhIXRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSk7XG4gIH1cbiAgYXN5bmMgZ2V0WGZhKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmE/LmNoaWxkcmVuW3RoaXMuX3BhZ2VJbmRleF0gfHwgbnVsbDtcbiAgfVxuICByZW5kZXIoe1xuICAgIGNhbnZhc0NvbnRleHQsXG4gICAgdmlld3BvcnQsXG4gICAgaW50ZW50ID0gXCJkaXNwbGF5XCIsXG4gICAgYW5ub3RhdGlvbk1vZGUgPSBBbm5vdGF0aW9uTW9kZS5FTkFCTEUsXG4gICAgdHJhbnNmb3JtID0gbnVsbCxcbiAgICBiYWNrZ3JvdW5kID0gbnVsbCxcbiAgICBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gbnVsbCxcbiAgICBhbm5vdGF0aW9uQ2FudmFzTWFwID0gbnVsbCxcbiAgICBwYWdlQ29sb3JzID0gbnVsbCxcbiAgICBwcmludEFubm90YXRpb25TdG9yYWdlID0gbnVsbFxuICB9KSB7XG4gICAgdGhpcy5fc3RhdHM/LnRpbWUoXCJPdmVyYWxsXCIpO1xuICAgIGNvbnN0IGludGVudEFyZ3MgPSB0aGlzLl90cmFuc3BvcnQuZ2V0UmVuZGVyaW5nSW50ZW50KGludGVudCwgYW5ub3RhdGlvbk1vZGUsIHByaW50QW5ub3RhdGlvblN0b3JhZ2UpO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlbmRlcmluZ0ludGVudCxcbiAgICAgIGNhY2hlS2V5XG4gICAgfSA9IGludGVudEFyZ3M7XG4gICAgdGhpcy4jcGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcbiAgICB0aGlzLiNhYm9ydERlbGF5ZWRDbGVhbnVwKCk7XG4gICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSB8fD0gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZyhyZW5kZXJpbmdJbnRlbnQpO1xuICAgIGxldCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoY2FjaGVLZXkpO1xuICAgIGlmICghaW50ZW50U3RhdGUpIHtcbiAgICAgIGludGVudFN0YXRlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5zZXQoY2FjaGVLZXksIGludGVudFN0YXRlKTtcbiAgICB9XG4gICAgaWYgKGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcbiAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCBpbnRlbnRQcmludCA9ICEhKHJlbmRlcmluZ0ludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQpO1xuICAgIGlmICghaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSkge1xuICAgICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0ID0ge1xuICAgICAgICBmbkFycmF5OiBbXSxcbiAgICAgICAgYXJnc0FycmF5OiBbXSxcbiAgICAgICAgbGFzdENodW5rOiBmYWxzZSxcbiAgICAgICAgc2VwYXJhdGVBbm5vdHM6IG51bGxcbiAgICAgIH07XG4gICAgICB0aGlzLl9zdGF0cz8udGltZShcIlBhZ2UgUmVxdWVzdFwiKTtcbiAgICAgIHRoaXMuX3B1bXBPcGVyYXRvckxpc3QoaW50ZW50QXJncyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbXBsZXRlID0gZXJyb3IgPT4ge1xuICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MuZGVsZXRlKGludGVybmFsUmVuZGVyVGFzayk7XG4gICAgICBpZiAodGhpcy5fbWF5YmVDbGVhbnVwQWZ0ZXJSZW5kZXIgfHwgaW50ZW50UHJpbnQpIHtcbiAgICAgICAgdGhpcy4jcGVuZGluZ0NsZWFudXAgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy4jdHJ5Q2xlYW51cCghaW50ZW50UHJpbnQpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnJlamVjdChlcnJvcik7XG4gICAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZSxcbiAgICAgICAgICByZWFzb246IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihlcnJvcilcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fc3RhdHMpIHtcbiAgICAgICAgdGhpcy5fc3RhdHMudGltZUVuZChcIlJlbmRlcmluZ1wiKTtcbiAgICAgICAgdGhpcy5fc3RhdHMudGltZUVuZChcIk92ZXJhbGxcIik7XG4gICAgICAgIGlmIChnbG9iYWxUaGlzLlN0YXRzPy5lbmFibGVkKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5TdGF0cy5hZGQodGhpcy5wYWdlTnVtYmVyLCB0aGlzLl9zdGF0cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGludGVybmFsUmVuZGVyVGFzayA9IG5ldyBJbnRlcm5hbFJlbmRlclRhc2soe1xuICAgICAgY2FsbGJhY2s6IGNvbXBsZXRlLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGNhbnZhc0NvbnRleHQsXG4gICAgICAgIHZpZXdwb3J0LFxuICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgIGJhY2tncm91bmRcbiAgICAgIH0sXG4gICAgICBvYmpzOiB0aGlzLm9ianMsXG4gICAgICBjb21tb25PYmpzOiB0aGlzLmNvbW1vbk9ianMsXG4gICAgICBhbm5vdGF0aW9uQ2FudmFzTWFwLFxuICAgICAgb3BlcmF0b3JMaXN0OiBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QsXG4gICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCxcbiAgICAgIGNhbnZhc0ZhY3Rvcnk6IHRoaXMuX3RyYW5zcG9ydC5jYW52YXNGYWN0b3J5LFxuICAgICAgZmlsdGVyRmFjdG9yeTogdGhpcy5fdHJhbnNwb3J0LmZpbHRlckZhY3RvcnksXG4gICAgICB1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWU6ICFpbnRlbnRQcmludCxcbiAgICAgIHBkZkJ1ZzogdGhpcy5fcGRmQnVnLFxuICAgICAgcGFnZUNvbG9yc1xuICAgIH0pO1xuICAgIChpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcyB8fD0gbmV3IFNldCgpKS5hZGQoaW50ZXJuYWxSZW5kZXJUYXNrKTtcbiAgICBjb25zdCByZW5kZXJUYXNrID0gaW50ZXJuYWxSZW5kZXJUYXNrLnRhc2s7XG4gICAgUHJvbWlzZS5hbGwoW2ludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkucHJvbWlzZSwgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZV0pLnRoZW4oKFt0cmFuc3BhcmVuY3ksIG9wdGlvbmFsQ29udGVudENvbmZpZ10pID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICBjb21wbGV0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGF0cz8udGltZShcIlJlbmRlcmluZ1wiKTtcbiAgICAgIGlmICghKG9wdGlvbmFsQ29udGVudENvbmZpZy5yZW5kZXJpbmdJbnRlbnQgJiByZW5kZXJpbmdJbnRlbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgdXNlIHRoZSBzYW1lIGBpbnRlbnRgLWFyZ3VtZW50IHdoZW4gY2FsbGluZyB0aGUgYFBERlBhZ2VQcm94eS5yZW5kZXJgIFwiICsgXCJhbmQgYFBERkRvY3VtZW50UHJveHkuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnYCBtZXRob2RzLlwiKTtcbiAgICAgIH1cbiAgICAgIGludGVybmFsUmVuZGVyVGFzay5pbml0aWFsaXplR3JhcGhpY3Moe1xuICAgICAgICB0cmFuc3BhcmVuY3ksXG4gICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1xuICAgICAgfSk7XG4gICAgICBpbnRlcm5hbFJlbmRlclRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuICAgIH0pLmNhdGNoKGNvbXBsZXRlKTtcbiAgICByZXR1cm4gcmVuZGVyVGFzaztcbiAgfVxuICBnZXRPcGVyYXRvckxpc3Qoe1xuICAgIGludGVudCA9IFwiZGlzcGxheVwiLFxuICAgIGFubm90YXRpb25Nb2RlID0gQW5ub3RhdGlvbk1vZGUuRU5BQkxFLFxuICAgIHByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsXG4gIH0gPSB7fSkge1xuICAgIGZ1bmN0aW9uIG9wZXJhdG9yTGlzdENoYW5nZWQoKSB7XG4gICAgICBpZiAoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuaykge1xuICAgICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCk7XG4gICAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzLmRlbGV0ZShvcExpc3RUYXNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaW50ZW50QXJncyA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50LCBhbm5vdGF0aW9uTW9kZSwgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSwgdHJ1ZSk7XG4gICAgbGV0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChpbnRlbnRBcmdzLmNhY2hlS2V5KTtcbiAgICBpZiAoIWludGVudFN0YXRlKSB7XG4gICAgICBpbnRlbnRTdGF0ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KGludGVudEFyZ3MuY2FjaGVLZXksIGludGVudFN0YXRlKTtcbiAgICB9XG4gICAgbGV0IG9wTGlzdFRhc2s7XG4gICAgaWYgKCFpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSkge1xuICAgICAgb3BMaXN0VGFzayA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBvcExpc3RUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQgPSBvcGVyYXRvckxpc3RDaGFuZ2VkO1xuICAgICAgaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgIChpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcyB8fD0gbmV3IFNldCgpKS5hZGQob3BMaXN0VGFzayk7XG4gICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QgPSB7XG4gICAgICAgIGZuQXJyYXk6IFtdLFxuICAgICAgICBhcmdzQXJyYXk6IFtdLFxuICAgICAgICBsYXN0Q2h1bms6IGZhbHNlLFxuICAgICAgICBzZXBhcmF0ZUFubm90czogbnVsbFxuICAgICAgfTtcbiAgICAgIHRoaXMuX3N0YXRzPy50aW1lKFwiUGFnZSBSZXF1ZXN0XCIpO1xuICAgICAgdGhpcy5fcHVtcE9wZXJhdG9yTGlzdChpbnRlbnRBcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgc3RyZWFtVGV4dENvbnRlbnQoe1xuICAgIGluY2x1ZGVNYXJrZWRDb250ZW50ID0gZmFsc2UsXG4gICAgZGlzYWJsZU5vcm1hbGl6YXRpb24gPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICBjb25zdCBURVhUX0NPTlRFTlRfQ0hVTktfU0laRSA9IDEwMDtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Lm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKFwiR2V0VGV4dENvbnRlbnRcIiwge1xuICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICBpbmNsdWRlTWFya2VkQ29udGVudDogaW5jbHVkZU1hcmtlZENvbnRlbnQgPT09IHRydWUsXG4gICAgICBkaXNhYmxlTm9ybWFsaXphdGlvbjogZGlzYWJsZU5vcm1hbGl6YXRpb24gPT09IHRydWVcbiAgICB9LCB7XG4gICAgICBoaWdoV2F0ZXJNYXJrOiBURVhUX0NPTlRFTlRfQ0hVTktfU0laRSxcbiAgICAgIHNpemUodGV4dENvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRleHRDb250ZW50Lml0ZW1zLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBnZXRUZXh0Q29udGVudChwYXJhbXMgPSB7fSkge1xuICAgIGlmICh0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFhmYSgpLnRoZW4oeGZhID0+IFhmYVRleHQudGV4dENvbnRlbnQoeGZhKSk7XG4gICAgfVxuICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5zdHJlYW1UZXh0Q29udGVudChwYXJhbXMpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBwdW1wKCkge1xuICAgICAgICByZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBkb25lXG4gICAgICAgIH0pIHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmVzb2x2ZSh0ZXh0Q29udGVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRleHRDb250ZW50LmxhbmcgPz89IHZhbHVlLmxhbmc7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0ZXh0Q29udGVudC5zdHlsZXMsIHZhbHVlLnN0eWxlcyk7XG4gICAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCguLi52YWx1ZS5pdGVtcyk7XG4gICAgICAgICAgcHVtcCgpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHtcbiAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgIGxhbmc6IG51bGxcbiAgICAgIH07XG4gICAgICBwdW1wKCk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0U3RydWN0VHJlZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFN0cnVjdFRyZWUodGhpcy5fcGFnZUluZGV4KTtcbiAgfVxuICBfZGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgY29uc3Qgd2FpdE9uID0gW107XG4gICAgZm9yIChjb25zdCBpbnRlbnRTdGF0ZSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHtcbiAgICAgICAgaW50ZW50U3RhdGUsXG4gICAgICAgIHJlYXNvbjogbmV3IEVycm9yKFwiUGFnZSB3YXMgZGVzdHJveWVkLlwiKSxcbiAgICAgICAgZm9yY2U6IHRydWVcbiAgICAgIH0pO1xuICAgICAgaWYgKGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBpbnRlcm5hbFJlbmRlclRhc2sgb2YgaW50ZW50U3RhdGUucmVuZGVyVGFza3MpIHtcbiAgICAgICAgd2FpdE9uLnB1c2goaW50ZXJuYWxSZW5kZXJUYXNrLmNvbXBsZXRlZCk7XG4gICAgICAgIGludGVybmFsUmVuZGVyVGFzay5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vYmpzLmNsZWFyKCk7XG4gICAgdGhpcy4jcGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcbiAgICB0aGlzLiNhYm9ydERlbGF5ZWRDbGVhbnVwKCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHdhaXRPbik7XG4gIH1cbiAgY2xlYW51cChyZXNldFN0YXRzID0gZmFsc2UpIHtcbiAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IHRydWU7XG4gICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuI3RyeUNsZWFudXAoZmFsc2UpO1xuICAgIGlmIChyZXNldFN0YXRzICYmIHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuX3N0YXRzICYmPSBuZXcgU3RhdFRpbWVyKCk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9XG4gICN0cnlDbGVhbnVwKGRlbGF5ZWQgPSBmYWxzZSkge1xuICAgIHRoaXMuI2Fib3J0RGVsYXllZENsZWFudXAoKTtcbiAgICBpZiAoIXRoaXMuI3BlbmRpbmdDbGVhbnVwIHx8IHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChkZWxheWVkKSB7XG4gICAgICB0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy4jZGVsYXllZENsZWFudXBUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy4jdHJ5Q2xlYW51cChmYWxzZSk7XG4gICAgICB9LCBERUxBWUVEX0NMRUFOVVBfVElNRU9VVCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3Qge1xuICAgICAgcmVuZGVyVGFza3MsXG4gICAgICBvcGVyYXRvckxpc3RcbiAgICB9IG9mIHRoaXMuX2ludGVudFN0YXRlcy52YWx1ZXMoKSkge1xuICAgICAgaWYgKHJlbmRlclRhc2tzLnNpemUgPiAwIHx8ICFvcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faW50ZW50U3RhdGVzLmNsZWFyKCk7XG4gICAgdGhpcy5vYmpzLmNsZWFyKCk7XG4gICAgdGhpcy4jcGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAjYWJvcnREZWxheWVkQ2xlYW51cCgpIHtcbiAgICBpZiAodGhpcy4jZGVsYXllZENsZWFudXBUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jZGVsYXllZENsZWFudXBUaW1lb3V0KTtcbiAgICAgIHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9XG4gIF9zdGFydFJlbmRlclBhZ2UodHJhbnNwYXJlbmN5LCBjYWNoZUtleSkge1xuICAgIGNvbnN0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChjYWNoZUtleSk7XG4gICAgaWYgKCFpbnRlbnRTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0cz8udGltZUVuZChcIlBhZ2UgUmVxdWVzdFwiKTtcbiAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5Py5yZXNvbHZlKHRyYW5zcGFyZW5jeSk7XG4gIH1cbiAgX3JlbmRlclBhZ2VDaHVuayhvcGVyYXRvckxpc3RDaHVuaywgaW50ZW50U3RhdGUpIHtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBvcGVyYXRvckxpc3RDaHVuay5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QuZm5BcnJheS5wdXNoKG9wZXJhdG9yTGlzdENodW5rLmZuQXJyYXlbaV0pO1xuICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5wdXNoKG9wZXJhdG9yTGlzdENodW5rLmFyZ3NBcnJheVtpXSk7XG4gICAgfVxuICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSBvcGVyYXRvckxpc3RDaHVuay5sYXN0Q2h1bms7XG4gICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LnNlcGFyYXRlQW5ub3RzID0gb3BlcmF0b3JMaXN0Q2h1bmsuc2VwYXJhdGVBbm5vdHM7XG4gICAgZm9yIChjb25zdCBpbnRlcm5hbFJlbmRlclRhc2sgb2YgaW50ZW50U3RhdGUucmVuZGVyVGFza3MpIHtcbiAgICAgIGludGVybmFsUmVuZGVyVGFzay5vcGVyYXRvckxpc3RDaGFuZ2VkKCk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRvckxpc3RDaHVuay5sYXN0Q2h1bmspIHtcbiAgICAgIHRoaXMuI3RyeUNsZWFudXAodHJ1ZSk7XG4gICAgfVxuICB9XG4gIF9wdW1wT3BlcmF0b3JMaXN0KHtcbiAgICByZW5kZXJpbmdJbnRlbnQsXG4gICAgY2FjaGVLZXksXG4gICAgYW5ub3RhdGlvblN0b3JhZ2VTZXJpYWxpemFibGVcbiAgfSkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1hcCxcbiAgICAgIHRyYW5zZmVyXG4gICAgfSA9IGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlO1xuICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fdHJhbnNwb3J0Lm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKFwiR2V0T3BlcmF0b3JMaXN0XCIsIHtcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuICAgICAgaW50ZW50OiByZW5kZXJpbmdJbnRlbnQsXG4gICAgICBjYWNoZUtleSxcbiAgICAgIGFubm90YXRpb25TdG9yYWdlOiBtYXBcbiAgICB9LCB0cmFuc2Zlcik7XG4gICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgY29uc3QgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGNhY2hlS2V5KTtcbiAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSByZWFkZXI7XG4gICAgY29uc3QgcHVtcCA9ICgpID0+IHtcbiAgICAgIHJlYWRlci5yZWFkKCkudGhlbigoe1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZG9uZVxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbmRlclBhZ2VDaHVuayh2YWx1ZSwgaW50ZW50U3RhdGUpO1xuICAgICAgICBwdW1wKCk7XG4gICAgICB9LCByZWFzb24gPT4ge1xuICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0LmRlc3Ryb3llZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0KSB7XG4gICAgICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuayA9IHRydWU7XG4gICAgICAgICAgZm9yIChjb25zdCBpbnRlcm5hbFJlbmRlclRhc2sgb2YgaW50ZW50U3RhdGUucmVuZGVyVGFza3MpIHtcbiAgICAgICAgICAgIGludGVybmFsUmVuZGVyVGFzay5vcGVyYXRvckxpc3RDaGFuZ2VkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuI3RyeUNsZWFudXAodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpIHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG4gICAgICAgICAgaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHB1bXAoKTtcbiAgfVxuICBfYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgIGludGVudFN0YXRlLFxuICAgIHJlYXNvbixcbiAgICBmb3JjZSA9IGZhbHNlXG4gIH0pIHtcbiAgICBpZiAoIWludGVudFN0YXRlLnN0cmVhbVJlYWRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpO1xuICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIGlmICghZm9yY2UpIHtcbiAgICAgIGlmIChpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5zaXplID4gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKSB7XG4gICAgICAgIGxldCBkZWxheSA9IFJFTkRFUklOR19DQU5DRUxMRURfVElNRU9VVDtcbiAgICAgICAgaWYgKHJlYXNvbi5leHRyYURlbGF5ID4gMCAmJiByZWFzb24uZXh0cmFEZWxheSA8IDEwMDApIHtcbiAgICAgICAgICBkZWxheSArPSByZWFzb24uZXh0cmFEZWxheTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgICAgaW50ZW50U3RhdGUsXG4gICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICBmb3JjZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyLmNhbmNlbChuZXcgQWJvcnRFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDtcbiAgICBpZiAodGhpcy5fdHJhbnNwb3J0LmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtjdXJDYWNoZUtleSwgY3VySW50ZW50U3RhdGVdIG9mIHRoaXMuX2ludGVudFN0YXRlcykge1xuICAgICAgaWYgKGN1ckludGVudFN0YXRlID09PSBpbnRlbnRTdGF0ZSkge1xuICAgICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuZGVsZXRlKGN1ckNhY2hlS2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2xlYW51cCgpO1xuICB9XG4gIGdldCBzdGF0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHM7XG4gIH1cbn1cbmNsYXNzIExvb3BiYWNrUG9ydCB7XG4gICNsaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gICNkZWZlcnJlZCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICBwb3N0TWVzc2FnZShvYmosIHRyYW5zZmVyKSB7XG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBkYXRhOiBzdHJ1Y3R1cmVkQ2xvbmUob2JqLCB0cmFuc2ZlciA/IHtcbiAgICAgICAgdHJhbnNmZXJcbiAgICAgIH0gOiBudWxsKVxuICAgIH07XG4gICAgdGhpcy4jZGVmZXJyZWQudGhlbigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuI2xpc3RlbmVycykge1xuICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhZGRFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy4jbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gIH1cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcikge1xuICAgIHRoaXMuI2xpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9XG4gIHRlcm1pbmF0ZSgpIHtcbiAgICB0aGlzLiNsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgfVxufVxuY29uc3QgUERGV29ya2VyVXRpbCA9IHtcbiAgaXNXb3JrZXJEaXNhYmxlZDogZmFsc2UsXG4gIGZha2VXb3JrZXJJZDogMFxufTtcbntcbiAgaWYgKGlzTm9kZUpTKSB7XG4gICAgUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkID0gdHJ1ZTtcbiAgICBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyB8fD0gXCIuL3BkZi53b3JrZXIubWpzXCI7XG4gIH1cbiAgUERGV29ya2VyVXRpbC5pc1NhbWVPcmlnaW4gPSBmdW5jdGlvbiAoYmFzZVVybCwgb3RoZXJVcmwpIHtcbiAgICBsZXQgYmFzZTtcbiAgICB0cnkge1xuICAgICAgYmFzZSA9IG5ldyBVUkwoYmFzZVVybCk7XG4gICAgICBpZiAoIWJhc2Uub3JpZ2luIHx8IGJhc2Uub3JpZ2luID09PSBcIm51bGxcIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG90aGVyID0gbmV3IFVSTChvdGhlclVybCwgYmFzZSk7XG4gICAgcmV0dXJuIGJhc2Uub3JpZ2luID09PSBvdGhlci5vcmlnaW47XG4gIH07XG4gIFBERldvcmtlclV0aWwuY3JlYXRlQ0ROV3JhcHBlciA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICBjb25zdCB3cmFwcGVyID0gYGF3YWl0IGltcG9ydChcIiR7dXJsfVwiKTtgO1xuICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt3cmFwcGVyXSwge1xuICAgICAgdHlwZTogXCJ0ZXh0L2phdmFzY3JpcHRcIlxuICAgIH0pKTtcbiAgfTtcbn1cbmNsYXNzIFBERldvcmtlciB7XG4gIHN0YXRpYyAjd29ya2VyUG9ydHM7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBuYW1lID0gbnVsbCxcbiAgICBwb3J0ID0gbnVsbCxcbiAgICB2ZXJib3NpdHkgPSBnZXRWZXJib3NpdHlMZXZlbCgpXG4gIH0gPSB7fSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnZlcmJvc2l0eSA9IHZlcmJvc2l0eTtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9wb3J0ID0gbnVsbDtcbiAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsO1xuICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbnVsbDtcbiAgICBpZiAocG9ydCkge1xuICAgICAgaWYgKFBERldvcmtlci4jd29ya2VyUG9ydHM/Lmhhcyhwb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXNlIG1vcmUgdGhhbiBvbmUgUERGV29ya2VyIHBlciBwb3J0LlwiKTtcbiAgICAgIH1cbiAgICAgIChQREZXb3JrZXIuI3dvcmtlclBvcnRzIHx8PSBuZXcgV2Vha01hcCgpKS5zZXQocG9ydCwgdGhpcyk7XG4gICAgICB0aGlzLl9pbml0aWFsaXplRnJvbVBvcnQocG9ydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxpemUoKTtcbiAgfVxuICBnZXQgcHJvbWlzZSgpIHtcbiAgICBpZiAoaXNOb2RlSlMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChbTm9kZVBhY2thZ2VzLnByb21pc2UsIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICAjcmVzb2x2ZSgpIHtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLnNlbmQoXCJjb25maWd1cmVcIiwge1xuICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eVxuICAgIH0pO1xuICB9XG4gIGdldCBwb3J0KCkge1xuICAgIHJldHVybiB0aGlzLl9wb3J0O1xuICB9XG4gIGdldCBtZXNzYWdlSGFuZGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUhhbmRsZXI7XG4gIH1cbiAgX2luaXRpYWxpemVGcm9tUG9ydChwb3J0KSB7XG4gICAgdGhpcy5fcG9ydCA9IHBvcnQ7XG4gICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoXCJtYWluXCIsIFwid29ya2VyXCIsIHBvcnQpO1xuICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLm9uKFwicmVhZHlcIiwgZnVuY3Rpb24gKCkge30pO1xuICAgIHRoaXMuI3Jlc29sdmUoKTtcbiAgfVxuICBfaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkIHx8IFBERldvcmtlci4jbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHtcbiAgICAgIHdvcmtlclNyY1xuICAgIH0gPSBQREZXb3JrZXI7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghUERGV29ya2VyVXRpbC5pc1NhbWVPcmlnaW4od2luZG93LmxvY2F0aW9uLmhyZWYsIHdvcmtlclNyYykpIHtcbiAgICAgICAgd29ya2VyU3JjID0gUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyKG5ldyBVUkwod29ya2VyU3JjLCB3aW5kb3cubG9jYXRpb24pLmhyZWYpO1xuICAgICAgfVxuICAgICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJTcmMsIHtcbiAgICAgICAgdHlwZTogXCJtb2R1bGVcIlxuICAgICAgfSk7XG4gICAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihcIm1haW5cIiwgXCJ3b3JrZXJcIiwgd29ya2VyKTtcbiAgICAgIGNvbnN0IHRlcm1pbmF0ZUVhcmx5ID0gKCkgPT4ge1xuICAgICAgICBhYy5hYm9ydCgpO1xuICAgICAgICBtZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX3dlYldvcmtlcikge1xuICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgc2lnbmFsOiBhYy5zaWduYWxcbiAgICAgIH0pO1xuICAgICAgbWVzc2FnZUhhbmRsZXIub24oXCJ0ZXN0XCIsIGRhdGEgPT4ge1xuICAgICAgICBhYy5hYm9ydCgpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQgfHwgIWRhdGEpIHtcbiAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyO1xuICAgICAgICB0aGlzLl9wb3J0ID0gd29ya2VyO1xuICAgICAgICB0aGlzLl93ZWJXb3JrZXIgPSB3b3JrZXI7XG4gICAgICAgIHRoaXMuI3Jlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgbWVzc2FnZUhhbmRsZXIub24oXCJyZWFkeVwiLCBkYXRhID0+IHtcbiAgICAgICAgYWMuYWJvcnQoKTtcbiAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgdGVybWluYXRlRWFybHkoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZW5kVGVzdCgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBzZW5kVGVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdE9iaiA9IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIG1lc3NhZ2VIYW5kbGVyLnNlbmQoXCJ0ZXN0XCIsIHRlc3RPYmosIFt0ZXN0T2JqLmJ1ZmZlcl0pO1xuICAgICAgfTtcbiAgICAgIHNlbmRUZXN0KCk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCB7XG4gICAgICBpbmZvKFwiVGhlIHdvcmtlciBoYXMgYmVlbiBkaXNhYmxlZC5cIik7XG4gICAgfVxuICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuICB9XG4gIF9zZXR1cEZha2VXb3JrZXIoKSB7XG4gICAgaWYgKCFQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQpIHtcbiAgICAgIHdhcm4oXCJTZXR0aW5nIHVwIGZha2Ugd29ya2VyLlwiKTtcbiAgICAgIFBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIFBERldvcmtlci5fc2V0dXBGYWtlV29ya2VyR2xvYmFsLnRoZW4oV29ya2VyTWVzc2FnZUhhbmRsZXIgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwb3J0ID0gbmV3IExvb3BiYWNrUG9ydCgpO1xuICAgICAgdGhpcy5fcG9ydCA9IHBvcnQ7XG4gICAgICBjb25zdCBpZCA9IGBmYWtlJHtQREZXb3JrZXJVdGlsLmZha2VXb3JrZXJJZCsrfWA7XG4gICAgICBjb25zdCB3b3JrZXJIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKGlkICsgXCJfd29ya2VyXCIsIGlkLCBwb3J0KTtcbiAgICAgIFdvcmtlck1lc3NhZ2VIYW5kbGVyLnNldHVwKHdvcmtlckhhbmRsZXIsIHBvcnQpO1xuICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoaWQsIGlkICsgXCJfd29ya2VyXCIsIHBvcnQpO1xuICAgICAgdGhpcy4jcmVzb2x2ZSgpO1xuICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihgU2V0dGluZyB1cCBmYWtlIHdvcmtlciBmYWlsZWQ6IFwiJHtyZWFzb24ubWVzc2FnZX1cIi5gKSk7XG4gICAgfSk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuX3dlYldvcmtlcikge1xuICAgICAgdGhpcy5fd2ViV29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgdGhpcy5fd2ViV29ya2VyID0gbnVsbDtcbiAgICB9XG4gICAgUERGV29ya2VyLiN3b3JrZXJQb3J0cz8uZGVsZXRlKHRoaXMuX3BvcnQpO1xuICAgIHRoaXMuX3BvcnQgPSBudWxsO1xuICAgIGlmICh0aGlzLl9tZXNzYWdlSGFuZGxlcikge1xuICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZnJvbVBvcnQocGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXM/LnBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBERldvcmtlci5mcm9tUG9ydCAtIGludmFsaWQgbWV0aG9kIHNpZ25hdHVyZS5cIik7XG4gICAgfVxuICAgIGNvbnN0IGNhY2hlZFBvcnQgPSB0aGlzLiN3b3JrZXJQb3J0cz8uZ2V0KHBhcmFtcy5wb3J0KTtcbiAgICBpZiAoY2FjaGVkUG9ydCkge1xuICAgICAgaWYgKGNhY2hlZFBvcnQuX3BlbmRpbmdEZXN0cm95KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBERldvcmtlci5mcm9tUG9ydCAtIHRoZSB3b3JrZXIgaXMgYmVpbmcgZGVzdHJveWVkLlxcblwiICsgXCJQbGVhc2UgcmVtZW1iZXIgdG8gYXdhaXQgYFBERkRvY3VtZW50TG9hZGluZ1Rhc2suZGVzdHJveSgpYC1jYWxscy5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FjaGVkUG9ydDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQREZXb3JrZXIocGFyYW1zKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHdvcmtlclNyYygpIHtcbiAgICBpZiAoR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMpIHtcbiAgICAgIHJldHVybiBHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYztcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBcIkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjXCIgc3BlY2lmaWVkLicpO1xuICB9XG4gIHN0YXRpYyBnZXQgI21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcigpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGdsb2JhbFRoaXMucGRmanNXb3JrZXI/Lldvcmtlck1lc3NhZ2VIYW5kbGVyIHx8IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGdldCBfc2V0dXBGYWtlV29ya2VyR2xvYmFsKCkge1xuICAgIGNvbnN0IGxvYWRlciA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNtYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IGltcG9ydCggLyp3ZWJwYWNrSWdub3JlOiB0cnVlKi90aGlzLndvcmtlclNyYyk7XG4gICAgICByZXR1cm4gd29ya2VyLldvcmtlck1lc3NhZ2VIYW5kbGVyO1xuICAgIH07XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9zZXR1cEZha2VXb3JrZXJHbG9iYWxcIiwgbG9hZGVyKCkpO1xuICB9XG59XG5jbGFzcyBXb3JrZXJUcmFuc3BvcnQge1xuICAjbWV0aG9kUHJvbWlzZXMgPSBuZXcgTWFwKCk7XG4gICNwYWdlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICNwYWdlUHJvbWlzZXMgPSBuZXcgTWFwKCk7XG4gICNwYWdlUmVmQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICNwYXNzd29yZENhcGFiaWxpdHkgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlSGFuZGxlciwgbG9hZGluZ1Rhc2ssIG5ldHdvcmtTdHJlYW0sIHBhcmFtcywgZmFjdG9yeSkge1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjtcbiAgICB0aGlzLmxvYWRpbmdUYXNrID0gbG9hZGluZ1Rhc2s7XG4gICAgdGhpcy5jb21tb25PYmpzID0gbmV3IFBERk9iamVjdHMoKTtcbiAgICB0aGlzLmZvbnRMb2FkZXIgPSBuZXcgRm9udExvYWRlcih7XG4gICAgICBvd25lckRvY3VtZW50OiBwYXJhbXMub3duZXJEb2N1bWVudCxcbiAgICAgIHN0eWxlRWxlbWVudDogcGFyYW1zLnN0eWxlRWxlbWVudFxuICAgIH0pO1xuICAgIHRoaXMubG9hZGluZ1BhcmFtcyA9IHBhcmFtcy5sb2FkaW5nUGFyYW1zO1xuICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBmYWN0b3J5LmNhbnZhc0ZhY3Rvcnk7XG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gZmFjdG9yeS5maWx0ZXJGYWN0b3J5O1xuICAgIHRoaXMuY01hcFJlYWRlckZhY3RvcnkgPSBmYWN0b3J5LmNNYXBSZWFkZXJGYWN0b3J5O1xuICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBmYWN0b3J5LnN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9IG51bGw7XG4gICAgdGhpcy5fbmV0d29ya1N0cmVhbSA9IG5ldHdvcmtTdHJlYW07XG4gICAgdGhpcy5fZnVsbFJlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fbGFzdFByb2dyZXNzID0gbnVsbDtcbiAgICB0aGlzLmRvd25sb2FkSW5mb0NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLnNldHVwTWVzc2FnZUhhbmRsZXIoKTtcbiAgfVxuICAjY2FjaGVTaW1wbGVNZXRob2QobmFtZSwgZGF0YSA9IG51bGwpIHtcbiAgICBjb25zdCBjYWNoZWRQcm9taXNlID0gdGhpcy4jbWV0aG9kUHJvbWlzZXMuZ2V0KG5hbWUpO1xuICAgIGlmIChjYWNoZWRQcm9taXNlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkUHJvbWlzZTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKG5hbWUsIGRhdGEpO1xuICAgIHRoaXMuI21ldGhvZFByb21pc2VzLnNldChuYW1lLCBwcm9taXNlKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuICBnZXQgYW5ub3RhdGlvblN0b3JhZ2UoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImFubm90YXRpb25TdG9yYWdlXCIsIG5ldyBBbm5vdGF0aW9uU3RvcmFnZSgpKTtcbiAgfVxuICBnZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50LCBhbm5vdGF0aW9uTW9kZSA9IEFubm90YXRpb25Nb2RlLkVOQUJMRSwgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IG51bGwsIGlzT3BMaXN0ID0gZmFsc2UpIHtcbiAgICBsZXQgcmVuZGVyaW5nSW50ZW50ID0gUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZO1xuICAgIGxldCBhbm5vdGF0aW9uU3RvcmFnZVNlcmlhbGl6YWJsZSA9IFNlcmlhbGl6YWJsZUVtcHR5O1xuICAgIHN3aXRjaCAoaW50ZW50KSB7XG4gICAgICBjYXNlIFwiYW55XCI6XG4gICAgICAgIHJlbmRlcmluZ0ludGVudCA9IFJlbmRlcmluZ0ludGVudEZsYWcuQU5ZO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJkaXNwbGF5XCI6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaW50XCI6XG4gICAgICAgIHJlbmRlcmluZ0ludGVudCA9IFJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgd2FybihgZ2V0UmVuZGVyaW5nSW50ZW50IC0gaW52YWxpZCBpbnRlbnQ6ICR7aW50ZW50fWApO1xuICAgIH1cbiAgICBzd2l0Y2ggKGFubm90YXRpb25Nb2RlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25Nb2RlLkRJU0FCTEU6XG4gICAgICAgIHJlbmRlcmluZ0ludGVudCArPSBSZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0RJU0FCTEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uTW9kZS5FTkFCTEU6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uTW9kZS5FTkFCTEVfRk9STVM6XG4gICAgICAgIHJlbmRlcmluZ0ludGVudCArPSBSZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0ZPUk1TO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbk1vZGUuRU5BQkxFX1NUT1JBR0U6XG4gICAgICAgIHJlbmRlcmluZ0ludGVudCArPSBSZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX1NUT1JBR0U7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25TdG9yYWdlID0gcmVuZGVyaW5nSW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCAmJiBwcmludEFubm90YXRpb25TdG9yYWdlIGluc3RhbmNlb2YgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA/IHByaW50QW5ub3RhdGlvblN0b3JhZ2UgOiB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZVNlcmlhbGl6YWJsZSA9IGFubm90YXRpb25TdG9yYWdlLnNlcmlhbGl6YWJsZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB3YXJuKGBnZXRSZW5kZXJpbmdJbnRlbnQgLSBpbnZhbGlkIGFubm90YXRpb25Nb2RlOiAke2Fubm90YXRpb25Nb2RlfWApO1xuICAgIH1cbiAgICBpZiAoaXNPcExpc3QpIHtcbiAgICAgIHJlbmRlcmluZ0ludGVudCArPSBSZW5kZXJpbmdJbnRlbnRGbGFnLk9QTElTVDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbmRlcmluZ0ludGVudCxcbiAgICAgIGNhY2hlS2V5OiBgJHtyZW5kZXJpbmdJbnRlbnR9XyR7YW5ub3RhdGlvblN0b3JhZ2VTZXJpYWxpemFibGUuaGFzaH1gLFxuICAgICAgYW5ub3RhdGlvblN0b3JhZ2VTZXJpYWxpemFibGVcbiAgICB9O1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZGVzdHJveUNhcGFiaWxpdHkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgfVxuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5Py5yZWplY3QobmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWQgZHVyaW5nIG9uUGFzc3dvcmQgY2FsbGJhY2tcIikpO1xuICAgIGNvbnN0IHdhaXRPbiA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLiNwYWdlQ2FjaGUudmFsdWVzKCkpIHtcbiAgICAgIHdhaXRPbi5wdXNoKHBhZ2UuX2Rlc3Ryb3koKSk7XG4gICAgfVxuICAgIHRoaXMuI3BhZ2VDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuI3BhZ2VQcm9taXNlcy5jbGVhcigpO1xuICAgIHRoaXMuI3BhZ2VSZWZDYWNoZS5jbGVhcigpO1xuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KFwiYW5ub3RhdGlvblN0b3JhZ2VcIikpIHtcbiAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpO1xuICAgIH1cbiAgICBjb25zdCB0ZXJtaW5hdGVkID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJUZXJtaW5hdGVcIiwgbnVsbCk7XG4gICAgd2FpdE9uLnB1c2godGVybWluYXRlZCk7XG4gICAgUHJvbWlzZS5hbGwod2FpdE9uKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuY29tbW9uT2Jqcy5jbGVhcigpO1xuICAgICAgdGhpcy5mb250TG9hZGVyLmNsZWFyKCk7XG4gICAgICB0aGlzLiNtZXRob2RQcm9taXNlcy5jbGVhcigpO1xuICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5LmRlc3Ryb3koKTtcbiAgICAgIFRleHRMYXllci5jbGVhbnVwKCk7XG4gICAgICB0aGlzLl9uZXR3b3JrU3RyZWFtPy5jYW5jZWxBbGxSZXF1ZXN0cyhuZXcgQWJvcnRFeGNlcHRpb24oXCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuXCIpKTtcbiAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIH0sIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVqZWN0KTtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIHNldHVwTWVzc2FnZUhhbmRsZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVzc2FnZUhhbmRsZXIsXG4gICAgICBsb2FkaW5nVGFza1xuICAgIH0gPSB0aGlzO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiR2V0UmVhZGVyXCIsIChkYXRhLCBzaW5rKSA9PiB7XG4gICAgICBhc3NlcnQodGhpcy5fbmV0d29ya1N0cmVhbSwgXCJHZXRSZWFkZXIgLSBubyBgSVBERlN0cmVhbWAgaW5zdGFuY2UgYXZhaWxhYmxlLlwiKTtcbiAgICAgIHRoaXMuX2Z1bGxSZWFkZXIgPSB0aGlzLl9uZXR3b3JrU3RyZWFtLmdldEZ1bGxSZWFkZXIoKTtcbiAgICAgIHRoaXMuX2Z1bGxSZWFkZXIub25Qcm9ncmVzcyA9IGV2dCA9PiB7XG4gICAgICAgIHRoaXMuX2xhc3RQcm9ncmVzcyA9IHtcbiAgICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsXG4gICAgICAgICAgdG90YWw6IGV2dC50b3RhbFxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHNpbmsub25QdWxsID0gKCkgPT4ge1xuICAgICAgICB0aGlzLl9mdWxsUmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uICh7XG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgZG9uZVxuICAgICAgICB9KSB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHNpbmsuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXJ0KHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsIFwiR2V0UmVhZGVyIC0gZXhwZWN0ZWQgYW4gQXJyYXlCdWZmZXIuXCIpO1xuICAgICAgICAgIHNpbmsuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSksIDEsIFt2YWx1ZV0pO1xuICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgc2luay5vbkNhbmNlbCA9IHJlYXNvbiA9PiB7XG4gICAgICAgIHRoaXMuX2Z1bGxSZWFkZXIuY2FuY2VsKHJlYXNvbik7XG4gICAgICAgIHNpbmsucmVhZHkuY2F0Y2gocmVhZHlSZWFzb24gPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyByZWFkeVJlYXNvbjtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiUmVhZGVySGVhZGVyc1JlYWR5XCIsIGRhdGEgPT4ge1xuICAgICAgY29uc3QgaGVhZGVyc0NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgIGNvbnN0IGZ1bGxSZWFkZXIgPSB0aGlzLl9mdWxsUmVhZGVyO1xuICAgICAgZnVsbFJlYWRlci5oZWFkZXJzUmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICghZnVsbFJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCB8fCAhZnVsbFJlYWRlci5pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2xhc3RQcm9ncmVzcykge1xuICAgICAgICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcz8uKHRoaXMuX2xhc3RQcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZ1bGxSZWFkZXIub25Qcm9ncmVzcyA9IGV2dCA9PiB7XG4gICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzPy4oe1xuICAgICAgICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsXG4gICAgICAgICAgICAgIHRvdGFsOiBldnQudG90YWxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgICAgaXNTdHJlYW1pbmdTdXBwb3J0ZWQ6IGZ1bGxSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQsXG4gICAgICAgICAgaXNSYW5nZVN1cHBvcnRlZDogZnVsbFJlYWRlci5pc1JhbmdlU3VwcG9ydGVkLFxuICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGZ1bGxSZWFkZXIuY29udGVudExlbmd0aFxuICAgICAgICB9KTtcbiAgICAgIH0sIGhlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgICByZXR1cm4gaGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkdldFJhbmdlUmVhZGVyXCIsIChkYXRhLCBzaW5rKSA9PiB7XG4gICAgICBhc3NlcnQodGhpcy5fbmV0d29ya1N0cmVhbSwgXCJHZXRSYW5nZVJlYWRlciAtIG5vIGBJUERGU3RyZWFtYCBpbnN0YW5jZSBhdmFpbGFibGUuXCIpO1xuICAgICAgY29uc3QgcmFuZ2VSZWFkZXIgPSB0aGlzLl9uZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKGRhdGEuYmVnaW4sIGRhdGEuZW5kKTtcbiAgICAgIGlmICghcmFuZ2VSZWFkZXIpIHtcbiAgICAgICAgc2luay5jbG9zZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaW5rLm9uUHVsbCA9ICgpID0+IHtcbiAgICAgICAgcmFuZ2VSZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBkb25lXG4gICAgICAgIH0pIHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgc2luay5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NlcnQodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciwgXCJHZXRSYW5nZVJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLlwiKTtcbiAgICAgICAgICBzaW5rLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpLCAxLCBbdmFsdWVdKTtcbiAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHNpbmsub25DYW5jZWwgPSByZWFzb24gPT4ge1xuICAgICAgICByYW5nZVJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICAgICAgc2luay5yZWFkeS5jYXRjaChyZWFkeVJlYXNvbiA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHJlYWR5UmVhc29uO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJHZXREb2NcIiwgKHtcbiAgICAgIHBkZkluZm9cbiAgICB9KSA9PiB7XG4gICAgICB0aGlzLl9udW1QYWdlcyA9IHBkZkluZm8ubnVtUGFnZXM7XG4gICAgICB0aGlzLl9odG1sRm9yWGZhID0gcGRmSW5mby5odG1sRm9yWGZhO1xuICAgICAgZGVsZXRlIHBkZkluZm8uaHRtbEZvclhmYTtcbiAgICAgIGxvYWRpbmdUYXNrLl9jYXBhYmlsaXR5LnJlc29sdmUobmV3IFBERkRvY3VtZW50UHJveHkocGRmSW5mbywgdGhpcykpO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRG9jRXhjZXB0aW9uXCIsIGZ1bmN0aW9uIChleCkge1xuICAgICAgbGV0IHJlYXNvbjtcbiAgICAgIHN3aXRjaCAoZXgubmFtZSkge1xuICAgICAgICBjYXNlIFwiUGFzc3dvcmRFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgUGFzc3dvcmRFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguY29kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJJbnZhbGlkUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgcmVhc29uID0gbmV3IEludmFsaWRQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgcmVhc29uID0gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LnN0YXR1cyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgVW5rbm93bkVycm9yRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmRldGFpbHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHVucmVhY2hhYmxlKFwiRG9jRXhjZXB0aW9uIC0gZXhwZWN0ZWQgYSB2YWxpZCBFcnJvci5cIik7XG4gICAgICB9XG4gICAgICBsb2FkaW5nVGFzay5fY2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIlBhc3N3b3JkUmVxdWVzdFwiLCBleGNlcHRpb24gPT4ge1xuICAgICAgdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICBpZiAobG9hZGluZ1Rhc2sub25QYXNzd29yZCkge1xuICAgICAgICBjb25zdCB1cGRhdGVQYXNzd29yZCA9IHBhc3N3b3JkID0+IHtcbiAgICAgICAgICBpZiAocGFzc3dvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChwYXNzd29yZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgcGFzc3dvcmRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2FkaW5nVGFzay5vblBhc3N3b3JkKHVwZGF0ZVBhc3N3b3JkLCBleGNlcHRpb24uY29kZSk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChleCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QobmV3IFBhc3N3b3JkRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlLCBleGNlcHRpb24uY29kZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuI3Bhc3N3b3JkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRGF0YUxvYWRlZFwiLCBkYXRhID0+IHtcbiAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIGxvYWRlZDogZGF0YS5sZW5ndGgsXG4gICAgICAgIHRvdGFsOiBkYXRhLmxlbmd0aFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRvd25sb2FkSW5mb0NhcGFiaWxpdHkucmVzb2x2ZShkYXRhKTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIlN0YXJ0UmVuZGVyUGFnZVwiLCBkYXRhID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwYWdlID0gdGhpcy4jcGFnZUNhY2hlLmdldChkYXRhLnBhZ2VJbmRleCk7XG4gICAgICBwYWdlLl9zdGFydFJlbmRlclBhZ2UoZGF0YS50cmFuc3BhcmVuY3ksIGRhdGEuY2FjaGVLZXkpO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiY29tbW9ub2JqXCIsIChbaWQsIHR5cGUsIGV4cG9ydGVkRGF0YV0pID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbW1vbk9ianMuaGFzKGlkKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiRm9udFwiOlxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGRpc2FibGVGb250RmFjZSxcbiAgICAgICAgICAgIGZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgICAgICAgICBwZGZCdWdcbiAgICAgICAgICB9ID0gdGhpcy5fcGFyYW1zO1xuICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gZXhwb3J0ZWREYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBleHBvcnRlZEVycm9yID0gZXhwb3J0ZWREYXRhLmVycm9yO1xuICAgICAgICAgICAgd2FybihgRXJyb3IgZHVyaW5nIGZvbnQgbG9hZGluZzogJHtleHBvcnRlZEVycm9yfWApO1xuICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUoaWQsIGV4cG9ydGVkRXJyb3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGluc3BlY3RGb250ID0gcGRmQnVnICYmIGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvcj8uZW5hYmxlZCA/IChmb250LCB1cmwpID0+IGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5mb250QWRkZWQoZm9udCwgdXJsKSA6IG51bGw7XG4gICAgICAgICAgY29uc3QgZm9udCA9IG5ldyBGb250RmFjZU9iamVjdChleHBvcnRlZERhdGEsIHtcbiAgICAgICAgICAgIGRpc2FibGVGb250RmFjZSxcbiAgICAgICAgICAgIGluc3BlY3RGb250XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5mb250TG9hZGVyLmJpbmQoZm9udCkuY2F0Y2goKCkgPT4gbWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiRm9udEZhbGxiYWNrXCIsIHtcbiAgICAgICAgICAgIGlkXG4gICAgICAgICAgfSkpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmb250RXh0cmFQcm9wZXJ0aWVzICYmIGZvbnQuZGF0YSkge1xuICAgICAgICAgICAgICBmb250LmRhdGEgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUoaWQsIGZvbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQ29weUxvY2FsSW1hZ2VcIjpcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpbWFnZVJlZlxuICAgICAgICAgIH0gPSBleHBvcnRlZERhdGE7XG4gICAgICAgICAgYXNzZXJ0KGltYWdlUmVmLCBcIlRoZSBpbWFnZVJlZiBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICAgIGZvciAoY29uc3QgcGFnZVByb3h5IG9mIHRoaXMuI3BhZ2VDYWNoZS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbLCBkYXRhXSBvZiBwYWdlUHJveHkub2Jqcykge1xuICAgICAgICAgICAgICBpZiAoZGF0YT8ucmVmICE9PSBpbWFnZVJlZikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghZGF0YS5kYXRhTGVuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUoaWQsIHN0cnVjdHVyZWRDbG9uZShkYXRhKSk7XG4gICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFMZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRm9udFBhdGhcIjpcbiAgICAgICAgY2FzZSBcIkltYWdlXCI6XG4gICAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG4gICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUoaWQsIGV4cG9ydGVkRGF0YSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHb3QgdW5rbm93biBjb21tb24gb2JqZWN0IHR5cGUgJHt0eXBlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJvYmpcIiwgKFtpZCwgcGFnZUluZGV4LCB0eXBlLCBpbWFnZURhdGFdKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFnZVByb3h5ID0gdGhpcy4jcGFnZUNhY2hlLmdldChwYWdlSW5kZXgpO1xuICAgICAgaWYgKHBhZ2VQcm94eS5vYmpzLmhhcyhpZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHBhZ2VQcm94eS5faW50ZW50U3RhdGVzLnNpemUgPT09IDApIHtcbiAgICAgICAgaW1hZ2VEYXRhPy5iaXRtYXA/LmNsb3NlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiSW1hZ2VcIjpcbiAgICAgICAgICBwYWdlUHJveHkub2Jqcy5yZXNvbHZlKGlkLCBpbWFnZURhdGEpO1xuICAgICAgICAgIGlmIChpbWFnZURhdGE/LmRhdGFMZW4gPiBNQVhfSU1BR0VfU0laRV9UT19DQUNIRSkge1xuICAgICAgICAgICAgcGFnZVByb3h5Ll9tYXliZUNsZWFudXBBZnRlclJlbmRlciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuICAgICAgICAgIHBhZ2VQcm94eS5vYmpzLnJlc29sdmUoaWQsIGltYWdlRGF0YSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHb3QgdW5rbm93biBvYmplY3QgdHlwZSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJEb2NQcm9ncmVzc1wiLCBkYXRhID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzPy4oe1xuICAgICAgICBsb2FkZWQ6IGRhdGEubG9hZGVkLFxuICAgICAgICB0b3RhbDogZGF0YS50b3RhbFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJGZXRjaEJ1aWx0SW5DTWFwXCIsIGRhdGEgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZC5cIikpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmNNYXBSZWFkZXJGYWN0b3J5KSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJDTWFwUmVhZGVyRmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQsIHNlZSB0aGUgYHVzZVdvcmtlckZldGNoYCBwYXJhbWV0ZXIuXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmNNYXBSZWFkZXJGYWN0b3J5LmZldGNoKGRhdGEpO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRmV0Y2hTdGFuZGFyZEZvbnREYXRhXCIsIGRhdGEgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZC5cIikpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnN0YW5kYXJkRm9udERhdGFGYWN0b3J5KSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQsIHNlZSB0aGUgYHVzZVdvcmtlckZldGNoYCBwYXJhbWV0ZXIuXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnN0YW5kYXJkRm9udERhdGFGYWN0b3J5LmZldGNoKGRhdGEpO1xuICAgIH0pO1xuICB9XG4gIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RGF0YVwiLCBudWxsKTtcbiAgfVxuICBzYXZlRG9jdW1lbnQoKSB7XG4gICAgaWYgKHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2l6ZSA8PSAwKSB7XG4gICAgICB3YXJuKFwic2F2ZURvY3VtZW50IGNhbGxlZCB3aGlsZSBgYW5ub3RhdGlvblN0b3JhZ2VgIGlzIGVtcHR5LCBcIiArIFwicGxlYXNlIHVzZSB0aGUgZ2V0RGF0YS1tZXRob2QgaW5zdGVhZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIG1hcCxcbiAgICAgIHRyYW5zZmVyXG4gICAgfSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2VyaWFsaXphYmxlO1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIlNhdmVEb2N1bWVudFwiLCB7XG4gICAgICBpc1B1cmVYZmE6ICEhdGhpcy5faHRtbEZvclhmYSxcbiAgICAgIG51bVBhZ2VzOiB0aGlzLl9udW1QYWdlcyxcbiAgICAgIGFubm90YXRpb25TdG9yYWdlOiBtYXAsXG4gICAgICBmaWxlbmFtZTogdGhpcy5fZnVsbFJlYWRlcj8uZmlsZW5hbWUgPz8gbnVsbFxuICAgIH0sIHRyYW5zZmVyKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpO1xuICAgIH0pO1xuICB9XG4gIGdldFBhZ2UocGFnZU51bWJlcikge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYWdlTnVtYmVyKSB8fCBwYWdlTnVtYmVyIDw9IDAgfHwgcGFnZU51bWJlciA+IHRoaXMuX251bVBhZ2VzKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBwYWdlIHJlcXVlc3QuXCIpKTtcbiAgICB9XG4gICAgY29uc3QgcGFnZUluZGV4ID0gcGFnZU51bWJlciAtIDEsXG4gICAgICBjYWNoZWRQcm9taXNlID0gdGhpcy4jcGFnZVByb21pc2VzLmdldChwYWdlSW5kZXgpO1xuICAgIGlmIChjYWNoZWRQcm9taXNlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkUHJvbWlzZTtcbiAgICB9XG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZVwiLCB7XG4gICAgICBwYWdlSW5kZXhcbiAgICB9KS50aGVuKHBhZ2VJbmZvID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmFuc3BvcnQgZGVzdHJveWVkXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHBhZ2VJbmZvLnJlZlN0cikge1xuICAgICAgICB0aGlzLiNwYWdlUmVmQ2FjaGUuc2V0KHBhZ2VJbmZvLnJlZlN0ciwgcGFnZU51bWJlcik7XG4gICAgICB9XG4gICAgICBjb25zdCBwYWdlID0gbmV3IFBERlBhZ2VQcm94eShwYWdlSW5kZXgsIHBhZ2VJbmZvLCB0aGlzLCB0aGlzLl9wYXJhbXMucGRmQnVnKTtcbiAgICAgIHRoaXMuI3BhZ2VDYWNoZS5zZXQocGFnZUluZGV4LCBwYWdlKTtcbiAgICAgIHJldHVybiBwYWdlO1xuICAgIH0pO1xuICAgIHRoaXMuI3BhZ2VQcm9taXNlcy5zZXQocGFnZUluZGV4LCBwcm9taXNlKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuICBnZXRQYWdlSW5kZXgocmVmKSB7XG4gICAgaWYgKCFpc1JlZlByb3h5KHJlZikpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZ2VJbmRleCByZXF1ZXN0LlwiKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VJbmRleFwiLCB7XG4gICAgICBudW06IHJlZi5udW0sXG4gICAgICBnZW46IHJlZi5nZW5cbiAgICB9KTtcbiAgfVxuICBnZXRBbm5vdGF0aW9ucyhwYWdlSW5kZXgsIGludGVudCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldEFubm90YXRpb25zXCIsIHtcbiAgICAgIHBhZ2VJbmRleCxcbiAgICAgIGludGVudFxuICAgIH0pO1xuICB9XG4gIGdldEZpZWxkT2JqZWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY2FjaGVTaW1wbGVNZXRob2QoXCJHZXRGaWVsZE9iamVjdHNcIik7XG4gIH1cbiAgaGFzSlNBY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLiNjYWNoZVNpbXBsZU1ldGhvZChcIkhhc0pTQWN0aW9uc1wiKTtcbiAgfVxuICBnZXRDYWxjdWxhdGlvbk9yZGVySWRzKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldENhbGN1bGF0aW9uT3JkZXJJZHNcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0RGVzdGluYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERlc3RpbmF0aW9uc1wiLCBudWxsKTtcbiAgfVxuICBnZXREZXN0aW5hdGlvbihpZCkge1xuICAgIGlmICh0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIGRlc3RpbmF0aW9uIHJlcXVlc3QuXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RGVzdGluYXRpb25cIiwge1xuICAgICAgaWRcbiAgICB9KTtcbiAgfVxuICBnZXRQYWdlTGFiZWxzKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VMYWJlbHNcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0UGFnZUxheW91dCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTGF5b3V0XCIsIG51bGwpO1xuICB9XG4gIGdldFBhZ2VNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VNb2RlXCIsIG51bGwpO1xuICB9XG4gIGdldFZpZXdlclByZWZlcmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFZpZXdlclByZWZlcmVuY2VzXCIsIG51bGwpO1xuICB9XG4gIGdldE9wZW5BY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3BlbkFjdGlvblwiLCBudWxsKTtcbiAgfVxuICBnZXRBdHRhY2htZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRBdHRhY2htZW50c1wiLCBudWxsKTtcbiAgfVxuICBnZXREb2NKU0FjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlU2ltcGxlTWV0aG9kKFwiR2V0RG9jSlNBY3Rpb25zXCIpO1xuICB9XG4gIGdldFBhZ2VKU0FjdGlvbnMocGFnZUluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUpTQWN0aW9uc1wiLCB7XG4gICAgICBwYWdlSW5kZXhcbiAgICB9KTtcbiAgfVxuICBnZXRTdHJ1Y3RUcmVlKHBhZ2VJbmRleCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFN0cnVjdFRyZWVcIiwge1xuICAgICAgcGFnZUluZGV4XG4gICAgfSk7XG4gIH1cbiAgZ2V0T3V0bGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRPdXRsaW5lXCIsIG51bGwpO1xuICB9XG4gIGdldE9wdGlvbmFsQ29udGVudENvbmZpZyhyZW5kZXJpbmdJbnRlbnQpIHtcbiAgICByZXR1cm4gdGhpcy4jY2FjaGVTaW1wbGVNZXRob2QoXCJHZXRPcHRpb25hbENvbnRlbnRDb25maWdcIikudGhlbihkYXRhID0+IG5ldyBPcHRpb25hbENvbnRlbnRDb25maWcoZGF0YSwgcmVuZGVyaW5nSW50ZW50KSk7XG4gIH1cbiAgZ2V0UGVybWlzc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGVybWlzc2lvbnNcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgY29uc3QgbmFtZSA9IFwiR2V0TWV0YWRhdGFcIixcbiAgICAgIGNhY2hlZFByb21pc2UgPSB0aGlzLiNtZXRob2RQcm9taXNlcy5nZXQobmFtZSk7XG4gICAgaWYgKGNhY2hlZFByb21pc2UpIHtcbiAgICAgIHJldHVybiBjYWNoZWRQcm9taXNlO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UobmFtZSwgbnVsbCkudGhlbihyZXN1bHRzID0+ICh7XG4gICAgICBpbmZvOiByZXN1bHRzWzBdLFxuICAgICAgbWV0YWRhdGE6IHJlc3VsdHNbMV0gPyBuZXcgTWV0YWRhdGEocmVzdWx0c1sxXSkgOiBudWxsLFxuICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU6IHRoaXMuX2Z1bGxSZWFkZXI/LmZpbGVuYW1lID8/IG51bGwsXG4gICAgICBjb250ZW50TGVuZ3RoOiB0aGlzLl9mdWxsUmVhZGVyPy5jb250ZW50TGVuZ3RoID8/IG51bGxcbiAgICB9KSk7XG4gICAgdGhpcy4jbWV0aG9kUHJvbWlzZXMuc2V0KG5hbWUsIHByb21pc2UpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG4gIGdldE1hcmtJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE1hcmtJbmZvXCIsIG51bGwpO1xuICB9XG4gIGFzeW5jIHN0YXJ0Q2xlYW51cChrZWVwTG9hZGVkRm9udHMgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkNsZWFudXBcIiwgbnVsbCk7XG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMuI3BhZ2VDYWNoZS52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgY2xlYW51cFN1Y2Nlc3NmdWwgPSBwYWdlLmNsZWFudXAoKTtcbiAgICAgIGlmICghY2xlYW51cFN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdGFydENsZWFudXA6IFBhZ2UgJHtwYWdlLnBhZ2VOdW1iZXJ9IGlzIGN1cnJlbnRseSByZW5kZXJpbmcuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29tbW9uT2Jqcy5jbGVhcigpO1xuICAgIGlmICgha2VlcExvYWRlZEZvbnRzKSB7XG4gICAgICB0aGlzLmZvbnRMb2FkZXIuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy4jbWV0aG9kUHJvbWlzZXMuY2xlYXIoKTtcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkuZGVzdHJveSh0cnVlKTtcbiAgICBUZXh0TGF5ZXIuY2xlYW51cCgpO1xuICB9XG4gIGNhY2hlZFBhZ2VOdW1iZXIocmVmKSB7XG4gICAgaWYgKCFpc1JlZlByb3h5KHJlZikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByZWZTdHIgPSByZWYuZ2VuID09PSAwID8gYCR7cmVmLm51bX1SYCA6IGAke3JlZi5udW19UiR7cmVmLmdlbn1gO1xuICAgIHJldHVybiB0aGlzLiNwYWdlUmVmQ2FjaGUuZ2V0KHJlZlN0cikgPz8gbnVsbDtcbiAgfVxufVxuY29uc3QgSU5JVElBTF9EQVRBID0gU3ltYm9sKFwiSU5JVElBTF9EQVRBXCIpO1xuY2xhc3MgUERGT2JqZWN0cyB7XG4gICNvYmpzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgI2Vuc3VyZU9iaihvYmpJZCkge1xuICAgIHJldHVybiB0aGlzLiNvYmpzW29iaklkXSB8fD0ge1xuICAgICAgLi4uUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCksXG4gICAgICBkYXRhOiBJTklUSUFMX0RBVEFcbiAgICB9O1xuICB9XG4gIGdldChvYmpJZCwgY2FsbGJhY2sgPSBudWxsKSB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjb25zdCBvYmogPSB0aGlzLiNlbnN1cmVPYmoob2JqSWQpO1xuICAgICAgb2JqLnByb21pc2UudGhlbigoKSA9PiBjYWxsYmFjayhvYmouZGF0YSkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG9iaiA9IHRoaXMuI29ianNbb2JqSWRdO1xuICAgIGlmICghb2JqIHx8IG9iai5kYXRhID09PSBJTklUSUFMX0RBVEEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdGluZyBvYmplY3QgdGhhdCBpc24ndCByZXNvbHZlZCB5ZXQgJHtvYmpJZH0uYCk7XG4gICAgfVxuICAgIHJldHVybiBvYmouZGF0YTtcbiAgfVxuICBoYXMob2JqSWQpIHtcbiAgICBjb25zdCBvYmogPSB0aGlzLiNvYmpzW29iaklkXTtcbiAgICByZXR1cm4gISFvYmogJiYgb2JqLmRhdGEgIT09IElOSVRJQUxfREFUQTtcbiAgfVxuICByZXNvbHZlKG9iaklkLCBkYXRhID0gbnVsbCkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuI2Vuc3VyZU9iaihvYmpJZCk7XG4gICAgb2JqLmRhdGEgPSBkYXRhO1xuICAgIG9iai5yZXNvbHZlKCk7XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgZm9yIChjb25zdCBvYmpJZCBpbiB0aGlzLiNvYmpzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRhdGFcbiAgICAgIH0gPSB0aGlzLiNvYmpzW29iaklkXTtcbiAgICAgIGRhdGE/LmJpdG1hcD8uY2xvc2UoKTtcbiAgICB9XG4gICAgdGhpcy4jb2JqcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIGZvciAoY29uc3Qgb2JqSWQgaW4gdGhpcy4jb2Jqcykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhXG4gICAgICB9ID0gdGhpcy4jb2Jqc1tvYmpJZF07XG4gICAgICBpZiAoZGF0YSA9PT0gSU5JVElBTF9EQVRBKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgeWllbGQgW29iaklkLCBkYXRhXTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIFJlbmRlclRhc2sge1xuICAjaW50ZXJuYWxSZW5kZXJUYXNrID0gbnVsbDtcbiAgY29uc3RydWN0b3IoaW50ZXJuYWxSZW5kZXJUYXNrKSB7XG4gICAgdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrID0gaW50ZXJuYWxSZW5kZXJUYXNrO1xuICAgIHRoaXMub25Db250aW51ZSA9IG51bGw7XG4gIH1cbiAgZ2V0IHByb21pc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKGV4dHJhRGVsYXkgPSAwKSB7XG4gICAgdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrLmNhbmNlbChudWxsLCBleHRyYURlbGF5KTtcbiAgfVxuICBnZXQgc2VwYXJhdGVBbm5vdHMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2VwYXJhdGVBbm5vdHNcbiAgICB9ID0gdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdDtcbiAgICBpZiAoIXNlcGFyYXRlQW5ub3RzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFubm90YXRpb25DYW52YXNNYXBcbiAgICB9ID0gdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrO1xuICAgIHJldHVybiBzZXBhcmF0ZUFubm90cy5mb3JtIHx8IHNlcGFyYXRlQW5ub3RzLmNhbnZhcyAmJiBhbm5vdGF0aW9uQ2FudmFzTWFwPy5zaXplID4gMDtcbiAgfVxufVxuY2xhc3MgSW50ZXJuYWxSZW5kZXJUYXNrIHtcbiAgI3JBRiA9IG51bGw7XG4gIHN0YXRpYyAjY2FudmFzSW5Vc2UgPSBuZXcgV2Vha1NldCgpO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgY2FsbGJhY2ssXG4gICAgcGFyYW1zLFxuICAgIG9ianMsXG4gICAgY29tbW9uT2JqcyxcbiAgICBhbm5vdGF0aW9uQ2FudmFzTWFwLFxuICAgIG9wZXJhdG9yTGlzdCxcbiAgICBwYWdlSW5kZXgsXG4gICAgY2FudmFzRmFjdG9yeSxcbiAgICBmaWx0ZXJGYWN0b3J5LFxuICAgIHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGZhbHNlLFxuICAgIHBkZkJ1ZyA9IGZhbHNlLFxuICAgIHBhZ2VDb2xvcnMgPSBudWxsXG4gIH0pIHtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5vYmpzID0gb2JqcztcbiAgICB0aGlzLmNvbW1vbk9ianMgPSBjb21tb25PYmpzO1xuICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCA9IGFubm90YXRpb25DYW52YXNNYXA7XG4gICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSBudWxsO1xuICAgIHRoaXMub3BlcmF0b3JMaXN0ID0gb3BlcmF0b3JMaXN0O1xuICAgIHRoaXMuX3BhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBjYW52YXNGYWN0b3J5O1xuICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IGZpbHRlckZhY3Rvcnk7XG4gICAgdGhpcy5fcGRmQnVnID0gcGRmQnVnO1xuICAgIHRoaXMucGFnZUNvbG9ycyA9IHBhZ2VDb2xvcnM7XG4gICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuZ3JhcGhpY3NSZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuX3VzZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gdHJ1ZSAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIHRoaXMuY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgdGhpcy5jYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy50YXNrID0gbmV3IFJlbmRlclRhc2sodGhpcyk7XG4gICAgdGhpcy5fY2FuY2VsQm91bmQgPSB0aGlzLmNhbmNlbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2NvbnRpbnVlQm91bmQgPSB0aGlzLl9jb250aW51ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3NjaGVkdWxlTmV4dEJvdW5kID0gdGhpcy5fc2NoZWR1bGVOZXh0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fbmV4dEJvdW5kID0gdGhpcy5fbmV4dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2NhbnZhcyA9IHBhcmFtcy5jYW52YXNDb250ZXh0LmNhbnZhcztcbiAgfVxuICBnZXQgY29tcGxldGVkKCkge1xuICAgIHJldHVybiB0aGlzLmNhcGFiaWxpdHkucHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gIH1cbiAgaW5pdGlhbGl6ZUdyYXBoaWNzKHtcbiAgICB0cmFuc3BhcmVuY3kgPSBmYWxzZSxcbiAgICBvcHRpb25hbENvbnRlbnRDb25maWdcbiAgfSkge1xuICAgIGlmICh0aGlzLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2FudmFzKSB7XG4gICAgICBpZiAoSW50ZXJuYWxSZW5kZXJUYXNrLiNjYW52YXNJblVzZS5oYXModGhpcy5fY2FudmFzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXNlIHRoZSBzYW1lIGNhbnZhcyBkdXJpbmcgbXVsdGlwbGUgcmVuZGVyKCkgb3BlcmF0aW9ucy4gXCIgKyBcIlVzZSBkaWZmZXJlbnQgY2FudmFzIG9yIGVuc3VyZSBwcmV2aW91cyBvcGVyYXRpb25zIHdlcmUgXCIgKyBcImNhbmNlbGxlZCBvciBjb21wbGV0ZWQuXCIpO1xuICAgICAgfVxuICAgICAgSW50ZXJuYWxSZW5kZXJUYXNrLiNjYW52YXNJblVzZS5hZGQodGhpcy5fY2FudmFzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3BkZkJ1ZyAmJiBnbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyPy5lbmFibGVkKSB7XG4gICAgICB0aGlzLnN0ZXBwZXIgPSBnbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyLmNyZWF0ZSh0aGlzLl9wYWdlSW5kZXgpO1xuICAgICAgdGhpcy5zdGVwcGVyLmluaXQodGhpcy5vcGVyYXRvckxpc3QpO1xuICAgICAgdGhpcy5zdGVwcGVyLm5leHRCcmVha1BvaW50ID0gdGhpcy5zdGVwcGVyLmdldE5leHRCcmVha1BvaW50KCk7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGNhbnZhc0NvbnRleHQsXG4gICAgICB2aWV3cG9ydCxcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIGJhY2tncm91bmRcbiAgICB9ID0gdGhpcy5wYXJhbXM7XG4gICAgdGhpcy5nZnggPSBuZXcgQ2FudmFzR3JhcGhpY3MoY2FudmFzQ29udGV4dCwgdGhpcy5jb21tb25PYmpzLCB0aGlzLm9ianMsIHRoaXMuY2FudmFzRmFjdG9yeSwgdGhpcy5maWx0ZXJGYWN0b3J5LCB7XG4gICAgICBvcHRpb25hbENvbnRlbnRDb25maWdcbiAgICB9LCB0aGlzLmFubm90YXRpb25DYW52YXNNYXAsIHRoaXMucGFnZUNvbG9ycyk7XG4gICAgdGhpcy5nZnguYmVnaW5EcmF3aW5nKHtcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIHZpZXdwb3J0LFxuICAgICAgdHJhbnNwYXJlbmN5LFxuICAgICAgYmFja2dyb3VuZFxuICAgIH0pO1xuICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gMDtcbiAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSB0cnVlO1xuICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrPy4oKTtcbiAgfVxuICBjYW5jZWwoZXJyb3IgPSBudWxsLCBleHRyYURlbGF5ID0gMCkge1xuICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB0aGlzLmdmeD8uZW5kRHJhd2luZygpO1xuICAgIGlmICh0aGlzLiNyQUYpIHtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLiNyQUYpO1xuICAgICAgdGhpcy4jckFGID0gbnVsbDtcbiAgICB9XG4gICAgSW50ZXJuYWxSZW5kZXJUYXNrLiNjYW52YXNJblVzZS5kZWxldGUodGhpcy5fY2FudmFzKTtcbiAgICB0aGlzLmNhbGxiYWNrKGVycm9yIHx8IG5ldyBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24oYFJlbmRlcmluZyBjYW5jZWxsZWQsIHBhZ2UgJHt0aGlzLl9wYWdlSW5kZXggKyAxfWAsIGV4dHJhRGVsYXkpKTtcbiAgfVxuICBvcGVyYXRvckxpc3RDaGFuZ2VkKCkge1xuICAgIGlmICghdGhpcy5ncmFwaGljc1JlYWR5KSB7XG4gICAgICB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjayB8fD0gdGhpcy5fY29udGludWVCb3VuZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdGVwcGVyPy51cGRhdGVPcGVyYXRvckxpc3QodGhpcy5vcGVyYXRvckxpc3QpO1xuICAgIGlmICh0aGlzLnJ1bm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29udGludWUoKTtcbiAgfVxuICBfY29udGludWUoKSB7XG4gICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFzay5vbkNvbnRpbnVlKSB7XG4gICAgICB0aGlzLnRhc2sub25Db250aW51ZSh0aGlzLl9zY2hlZHVsZU5leHRCb3VuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlTmV4dCgpO1xuICAgIH1cbiAgfVxuICBfc2NoZWR1bGVOZXh0KCkge1xuICAgIGlmICh0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHRoaXMuI3JBRiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLiNyQUYgPSBudWxsO1xuICAgICAgICB0aGlzLl9uZXh0Qm91bmQoKS5jYXRjaCh0aGlzLl9jYW5jZWxCb3VuZCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbih0aGlzLl9uZXh0Qm91bmQpLmNhdGNoKHRoaXMuX2NhbmNlbEJvdW5kKTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgX25leHQoKSB7XG4gICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gdGhpcy5nZnguZXhlY3V0ZU9wZXJhdG9yTGlzdCh0aGlzLm9wZXJhdG9yTGlzdCwgdGhpcy5vcGVyYXRvckxpc3RJZHgsIHRoaXMuX2NvbnRpbnVlQm91bmQsIHRoaXMuc3RlcHBlcik7XG4gICAgaWYgKHRoaXMub3BlcmF0b3JMaXN0SWR4ID09PSB0aGlzLm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHtcbiAgICAgICAgdGhpcy5nZnguZW5kRHJhd2luZygpO1xuICAgICAgICBJbnRlcm5hbFJlbmRlclRhc2suI2NhbnZhc0luVXNlLmRlbGV0ZSh0aGlzLl9jYW52YXMpO1xuICAgICAgICB0aGlzLmNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5jb25zdCB2ZXJzaW9uID0gXCI0LjQuMTY4XCI7XG5jb25zdCBidWlsZCA9IFwiMTlmYmM4OTk4XCI7XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9zaGFyZWQvc2NyaXB0aW5nX3V0aWxzLmpzXG5mdW5jdGlvbiBtYWtlQ29sb3JDb21wKG4pIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgbikpICogMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpO1xufVxuZnVuY3Rpb24gc2NhbGVBbmRDbGFtcCh4KSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIDI1NSAqIHgpKTtcbn1cbmNsYXNzIENvbG9yQ29udmVydGVycyB7XG4gIHN0YXRpYyBDTVlLX0coW2MsIHksIG0sIGtdKSB7XG4gICAgcmV0dXJuIFtcIkdcIiwgMSAtIE1hdGgubWluKDEsIDAuMyAqIGMgKyAwLjU5ICogbSArIDAuMTEgKiB5ICsgayldO1xuICB9XG4gIHN0YXRpYyBHX0NNWUsoW2ddKSB7XG4gICAgcmV0dXJuIFtcIkNNWUtcIiwgMCwgMCwgMCwgMSAtIGddO1xuICB9XG4gIHN0YXRpYyBHX1JHQihbZ10pIHtcbiAgICByZXR1cm4gW1wiUkdCXCIsIGcsIGcsIGddO1xuICB9XG4gIHN0YXRpYyBHX3JnYihbZ10pIHtcbiAgICBnID0gc2NhbGVBbmRDbGFtcChnKTtcbiAgICByZXR1cm4gW2csIGcsIGddO1xuICB9XG4gIHN0YXRpYyBHX0hUTUwoW2ddKSB7XG4gICAgY29uc3QgRyA9IG1ha2VDb2xvckNvbXAoZyk7XG4gICAgcmV0dXJuIGAjJHtHfSR7R30ke0d9YDtcbiAgfVxuICBzdGF0aWMgUkdCX0coW3IsIGcsIGJdKSB7XG4gICAgcmV0dXJuIFtcIkdcIiwgMC4zICogciArIDAuNTkgKiBnICsgMC4xMSAqIGJdO1xuICB9XG4gIHN0YXRpYyBSR0JfcmdiKGNvbG9yKSB7XG4gICAgcmV0dXJuIGNvbG9yLm1hcChzY2FsZUFuZENsYW1wKTtcbiAgfVxuICBzdGF0aWMgUkdCX0hUTUwoY29sb3IpIHtcbiAgICByZXR1cm4gYCMke2NvbG9yLm1hcChtYWtlQ29sb3JDb21wKS5qb2luKFwiXCIpfWA7XG4gIH1cbiAgc3RhdGljIFRfSFRNTCgpIHtcbiAgICByZXR1cm4gXCIjMDAwMDAwMDBcIjtcbiAgfVxuICBzdGF0aWMgVF9yZ2IoKSB7XG4gICAgcmV0dXJuIFtudWxsXTtcbiAgfVxuICBzdGF0aWMgQ01ZS19SR0IoW2MsIHksIG0sIGtdKSB7XG4gICAgcmV0dXJuIFtcIlJHQlwiLCAxIC0gTWF0aC5taW4oMSwgYyArIGspLCAxIC0gTWF0aC5taW4oMSwgbSArIGspLCAxIC0gTWF0aC5taW4oMSwgeSArIGspXTtcbiAgfVxuICBzdGF0aWMgQ01ZS19yZ2IoW2MsIHksIG0sIGtdKSB7XG4gICAgcmV0dXJuIFtzY2FsZUFuZENsYW1wKDEgLSBNYXRoLm1pbigxLCBjICsgaykpLCBzY2FsZUFuZENsYW1wKDEgLSBNYXRoLm1pbigxLCBtICsgaykpLCBzY2FsZUFuZENsYW1wKDEgLSBNYXRoLm1pbigxLCB5ICsgaykpXTtcbiAgfVxuICBzdGF0aWMgQ01ZS19IVE1MKGNvbXBvbmVudHMpIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLkNNWUtfUkdCKGNvbXBvbmVudHMpLnNsaWNlKDEpO1xuICAgIHJldHVybiB0aGlzLlJHQl9IVE1MKHJnYik7XG4gIH1cbiAgc3RhdGljIFJHQl9DTVlLKFtyLCBnLCBiXSkge1xuICAgIGNvbnN0IGMgPSAxIC0gcjtcbiAgICBjb25zdCBtID0gMSAtIGc7XG4gICAgY29uc3QgeSA9IDEgLSBiO1xuICAgIGNvbnN0IGsgPSBNYXRoLm1pbihjLCBtLCB5KTtcbiAgICByZXR1cm4gW1wiQ01ZS1wiLCBjLCBtLCB5LCBrXTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS94ZmFfbGF5ZXIuanNcblxuY2xhc3MgWGZhTGF5ZXIge1xuICBzdGF0aWMgc2V0dXBTdG9yYWdlKGh0bWwsIGlkLCBlbGVtZW50LCBzdG9yYWdlLCBpbnRlbnQpIHtcbiAgICBjb25zdCBzdG9yZWREYXRhID0gc3RvcmFnZS5nZXRWYWx1ZShpZCwge1xuICAgICAgdmFsdWU6IG51bGxcbiAgICB9KTtcbiAgICBzd2l0Y2ggKGVsZW1lbnQubmFtZSkge1xuICAgICAgY2FzZSBcInRleHRhcmVhXCI6XG4gICAgICAgIGlmIChzdG9yZWREYXRhLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgaHRtbC50ZXh0Q29udGVudCA9IHN0b3JlZERhdGEudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVudCA9PT0gXCJwcmludFwiKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgIHZhbHVlOiBldmVudC50YXJnZXQudmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgIGlmIChlbGVtZW50LmF0dHJpYnV0ZXMudHlwZSA9PT0gXCJyYWRpb1wiIHx8IGVsZW1lbnQuYXR0cmlidXRlcy50eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZSA9PT0gZWxlbWVudC5hdHRyaWJ1dGVzLnhmYU9uKSB7XG4gICAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgdHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdG9yZWREYXRhLnZhbHVlID09PSBlbGVtZW50LmF0dHJpYnV0ZXMueGZhT2ZmKSB7XG4gICAgICAgICAgICBodG1sLnJlbW92ZUF0dHJpYnV0ZShcImNoZWNrZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbnRlbnQgPT09IFwicHJpbnRcIikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGh0bWwuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBldmVudCA9PiB7XG4gICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBldmVudC50YXJnZXQuY2hlY2tlZCA/IGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ4ZmFPblwiKSA6IGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ4ZmFPZmZcIilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzdG9yZWREYXRhLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShcInZhbHVlXCIsIHN0b3JlZERhdGEudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaW50ZW50ID09PSBcInByaW50XCIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG4gICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBldmVudC50YXJnZXQudmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgc3RvcmVkRGF0YS52YWx1ZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZWxlbWVudC5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5hdHRyaWJ1dGVzLnZhbHVlID09PSBzdG9yZWREYXRhLnZhbHVlKSB7XG4gICAgICAgICAgICAgIG9wdGlvbi5hdHRyaWJ1dGVzLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoXCJzZWxlY3RlZFwiKSkge1xuICAgICAgICAgICAgICBkZWxldGUgb3B0aW9uLmF0dHJpYnV0ZXMuc2VsZWN0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bWwuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gZXZlbnQudGFyZ2V0Lm9wdGlvbnM7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnNlbGVjdGVkSW5kZXggPT09IC0xID8gXCJcIiA6IG9wdGlvbnNbb3B0aW9ucy5zZWxlY3RlZEluZGV4XS52YWx1ZTtcbiAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBzZXRBdHRyaWJ1dGVzKHtcbiAgICBodG1sLFxuICAgIGVsZW1lbnQsXG4gICAgc3RvcmFnZSA9IG51bGwsXG4gICAgaW50ZW50LFxuICAgIGxpbmtTZXJ2aWNlXG4gIH0pIHtcbiAgICBjb25zdCB7XG4gICAgICBhdHRyaWJ1dGVzXG4gICAgfSA9IGVsZW1lbnQ7XG4gICAgY29uc3QgaXNIVE1MQW5jaG9yRWxlbWVudCA9IGh0bWwgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICBpZiAoYXR0cmlidXRlcy50eXBlID09PSBcInJhZGlvXCIpIHtcbiAgICAgIGF0dHJpYnV0ZXMubmFtZSA9IGAke2F0dHJpYnV0ZXMubmFtZX0tJHtpbnRlbnR9YDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcImNsYXNzXCI6XG4gICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGF0YUlkXCI6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJpZFwiOlxuICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihodG1sLnN0eWxlLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ0ZXh0Q29udGVudFwiOlxuICAgICAgICAgIGh0bWwudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoIWlzSFRNTEFuY2hvckVsZW1lbnQgfHwga2V5ICE9PSBcImhyZWZcIiAmJiBrZXkgIT09IFwibmV3V2luZG93XCIpIHtcbiAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICAgIGxpbmtTZXJ2aWNlLmFkZExpbmtBdHRyaWJ1dGVzKGh0bWwsIGF0dHJpYnV0ZXMuaHJlZiwgYXR0cmlidXRlcy5uZXdXaW5kb3cpO1xuICAgIH1cbiAgICBpZiAoc3RvcmFnZSAmJiBhdHRyaWJ1dGVzLmRhdGFJZCkge1xuICAgICAgdGhpcy5zZXR1cFN0b3JhZ2UoaHRtbCwgYXR0cmlidXRlcy5kYXRhSWQsIGVsZW1lbnQsIHN0b3JhZ2UpO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgcmVuZGVyKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBzdG9yYWdlID0gcGFyYW1ldGVycy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBjb25zdCBsaW5rU2VydmljZSA9IHBhcmFtZXRlcnMubGlua1NlcnZpY2U7XG4gICAgY29uc3Qgcm9vdCA9IHBhcmFtZXRlcnMueGZhSHRtbDtcbiAgICBjb25zdCBpbnRlbnQgPSBwYXJhbWV0ZXJzLmludGVudCB8fCBcImRpc3BsYXlcIjtcbiAgICBjb25zdCByb290SHRtbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocm9vdC5uYW1lKTtcbiAgICBpZiAocm9vdC5hdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICBodG1sOiByb290SHRtbCxcbiAgICAgICAgZWxlbWVudDogcm9vdCxcbiAgICAgICAgaW50ZW50LFxuICAgICAgICBsaW5rU2VydmljZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGlzTm90Rm9yUmljaFRleHQgPSBpbnRlbnQgIT09IFwicmljaFRleHRcIjtcbiAgICBjb25zdCByb290RGl2ID0gcGFyYW1ldGVycy5kaXY7XG4gICAgcm9vdERpdi5hcHBlbmQocm9vdEh0bWwpO1xuICAgIGlmIChwYXJhbWV0ZXJzLnZpZXdwb3J0KSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm0gPSBgbWF0cml4KCR7cGFyYW1ldGVycy52aWV3cG9ydC50cmFuc2Zvcm0uam9pbihcIixcIil9KWA7XG4gICAgICByb290RGl2LnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICB9XG4gICAgaWYgKGlzTm90Rm9yUmljaFRleHQpIHtcbiAgICAgIHJvb3REaXYuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJ4ZmFMYXllciB4ZmFGb250XCIpO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0RGl2cyA9IFtdO1xuICAgIGlmIChyb290LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHJvb3QudmFsdWUpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHJvb3QudmFsdWUpO1xuICAgICAgICByb290SHRtbC5hcHBlbmQobm9kZSk7XG4gICAgICAgIGlmIChpc05vdEZvclJpY2hUZXh0ICYmIFhmYVRleHQuc2hvdWxkQnVpbGRUZXh0KHJvb3QubmFtZSkpIHtcbiAgICAgICAgICB0ZXh0RGl2cy5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0RGl2c1xuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc3RhY2sgPSBbW3Jvb3QsIC0xLCByb290SHRtbF1dO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbcGFyZW50LCBpLCBodG1sXSA9IHN0YWNrLmF0KC0xKTtcbiAgICAgIGlmIChpICsgMSA9PT0gcGFyZW50LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGlsZCA9IHBhcmVudC5jaGlsZHJlblsrK3N0YWNrLmF0KC0xKVsxXV07XG4gICAgICBpZiAoY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWVcbiAgICAgIH0gPSBjaGlsZDtcbiAgICAgIGlmIChuYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkLnZhbHVlKTtcbiAgICAgICAgdGV4dERpdnMucHVzaChub2RlKTtcbiAgICAgICAgaHRtbC5hcHBlbmQobm9kZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hpbGRIdG1sID0gY2hpbGQ/LmF0dHJpYnV0ZXM/LnhtbG5zID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGNoaWxkLmF0dHJpYnV0ZXMueG1sbnMsIG5hbWUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTtcbiAgICAgIGh0bWwuYXBwZW5kKGNoaWxkSHRtbCk7XG4gICAgICBpZiAoY2hpbGQuYXR0cmlidXRlcykge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIGh0bWw6IGNoaWxkSHRtbCxcbiAgICAgICAgICBlbGVtZW50OiBjaGlsZCxcbiAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgIGludGVudCxcbiAgICAgICAgICBsaW5rU2VydmljZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZC5jaGlsZHJlbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdGFjay5wdXNoKFtjaGlsZCwgLTEsIGNoaWxkSHRtbF0pO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZC52YWx1ZSkge1xuICAgICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQudmFsdWUpO1xuICAgICAgICBpZiAoaXNOb3RGb3JSaWNoVGV4dCAmJiBYZmFUZXh0LnNob3VsZEJ1aWxkVGV4dChuYW1lKSkge1xuICAgICAgICAgIHRleHREaXZzLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRIdG1sLmFwcGVuZChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBlbCBvZiByb290RGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCIueGZhTm9uSW50ZXJhY3RpdmUgaW5wdXQsIC54ZmFOb25JbnRlcmFjdGl2ZSB0ZXh0YXJlYVwiKSkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKFwicmVhZE9ubHlcIiwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0RGl2c1xuICAgIH07XG4gIH1cbiAgc3RhdGljIHVwZGF0ZShwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gYG1hdHJpeCgke3BhcmFtZXRlcnMudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oXCIsXCIpfSlgO1xuICAgIHBhcmFtZXRlcnMuZGl2LnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICBwYXJhbWV0ZXJzLmRpdi5oaWRkZW4gPSBmYWxzZTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9hbm5vdGF0aW9uX2xheWVyLmpzXG5cblxuXG5cblxuY29uc3QgREVGQVVMVF9UQUJfSU5ERVggPSAxMDAwO1xuY29uc3QgYW5ub3RhdGlvbl9sYXllcl9ERUZBVUxUX0ZPTlRfU0laRSA9IDk7XG5jb25zdCBHZXRFbGVtZW50c0J5TmFtZVNldCA9IG5ldyBXZWFrU2V0KCk7XG5mdW5jdGlvbiBnZXRSZWN0RGltcyhyZWN0KSB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHJlY3RbMl0gLSByZWN0WzBdLFxuICAgIGhlaWdodDogcmVjdFszXSAtIHJlY3RbMV1cbiAgfTtcbn1cbmNsYXNzIEFubm90YXRpb25FbGVtZW50RmFjdG9yeSB7XG4gIHN0YXRpYyBjcmVhdGUocGFyYW1ldGVycykge1xuICAgIGNvbnN0IHN1YnR5cGUgPSBwYXJhbWV0ZXJzLmRhdGEuYW5ub3RhdGlvblR5cGU7XG4gICAgc3dpdGNoIChzdWJ0eXBlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkxJTks6XG4gICAgICAgIHJldHVybiBuZXcgTGlua0Fubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5URVhUOlxuICAgICAgICByZXR1cm4gbmV3IFRleHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuV0lER0VUOlxuICAgICAgICBjb25zdCBmaWVsZFR5cGUgPSBwYXJhbWV0ZXJzLmRhdGEuZmllbGRUeXBlO1xuICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJUeFwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICAgICAgY2FzZSBcIkJ0blwiOlxuICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMuZGF0YS5yYWRpb0J1dHRvbikge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMuZGF0YS5jaGVja0JveCkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICBjYXNlIFwiQ2hcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICAgICAgY2FzZSBcIlNpZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5QT1BVUDpcbiAgICAgICAgcmV0dXJuIG5ldyBQb3B1cEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5GUkVFVEVYVDpcbiAgICAgICAgcmV0dXJuIG5ldyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5MSU5FOlxuICAgICAgICByZXR1cm4gbmV3IExpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuU1FVQVJFOlxuICAgICAgICByZXR1cm4gbmV3IFNxdWFyZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5DSVJDTEU6XG4gICAgICAgIHJldHVybiBuZXcgQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlBPTFlMSU5FOlxuICAgICAgICByZXR1cm4gbmV3IFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkNBUkVUOlxuICAgICAgICByZXR1cm4gbmV3IENhcmV0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLklOSzpcbiAgICAgICAgcmV0dXJuIG5ldyBJbmtBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuUE9MWUdPTjpcbiAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkhJR0hMSUdIVDpcbiAgICAgICAgcmV0dXJuIG5ldyBIaWdobGlnaHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOlxuICAgICAgICByZXR1cm4gbmV3IFVuZGVybGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5TUVVJR0dMWTpcbiAgICAgICAgcmV0dXJuIG5ldyBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5TVFJJS0VPVVQ6XG4gICAgICAgIHJldHVybiBuZXcgU3RyaWtlT3V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNUQU1QOlxuICAgICAgICByZXR1cm4gbmV3IFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkZJTEVBVFRBQ0hNRU5UOlxuICAgICAgICByZXR1cm4gbmV3IEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjdXBkYXRlcyA9IG51bGw7XG4gICNoYXNCb3JkZXIgPSBmYWxzZTtcbiAgI3BvcHVwRWxlbWVudCA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMsIHtcbiAgICBpc1JlbmRlcmFibGUgPSBmYWxzZSxcbiAgICBpZ25vcmVCb3JkZXIgPSBmYWxzZSxcbiAgICBjcmVhdGVRdWFkcmlsYXRlcmFscyA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIHRoaXMuaXNSZW5kZXJhYmxlID0gaXNSZW5kZXJhYmxlO1xuICAgIHRoaXMuZGF0YSA9IHBhcmFtZXRlcnMuZGF0YTtcbiAgICB0aGlzLmxheWVyID0gcGFyYW1ldGVycy5sYXllcjtcbiAgICB0aGlzLmxpbmtTZXJ2aWNlID0gcGFyYW1ldGVycy5saW5rU2VydmljZTtcbiAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IHBhcmFtZXRlcnMuZG93bmxvYWRNYW5hZ2VyO1xuICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gcGFyYW1ldGVycy5pbWFnZVJlc291cmNlc1BhdGg7XG4gICAgdGhpcy5yZW5kZXJGb3JtcyA9IHBhcmFtZXRlcnMucmVuZGVyRm9ybXM7XG4gICAgdGhpcy5zdmdGYWN0b3J5ID0gcGFyYW1ldGVycy5zdmdGYWN0b3J5O1xuICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UgPSBwYXJhbWV0ZXJzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIHRoaXMuZW5hYmxlU2NyaXB0aW5nID0gcGFyYW1ldGVycy5lbmFibGVTY3JpcHRpbmc7XG4gICAgdGhpcy5oYXNKU0FjdGlvbnMgPSBwYXJhbWV0ZXJzLmhhc0pTQWN0aW9ucztcbiAgICB0aGlzLl9maWVsZE9iamVjdHMgPSBwYXJhbWV0ZXJzLmZpZWxkT2JqZWN0cztcbiAgICB0aGlzLnBhcmVudCA9IHBhcmFtZXRlcnMucGFyZW50O1xuICAgIGlmIChpc1JlbmRlcmFibGUpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5fY3JlYXRlQ29udGFpbmVyKGlnbm9yZUJvcmRlcik7XG4gICAgfVxuICAgIGlmIChjcmVhdGVRdWFkcmlsYXRlcmFscykge1xuICAgICAgdGhpcy5fY3JlYXRlUXVhZHJpbGF0ZXJhbHMoKTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIF9oYXNQb3B1cERhdGEoe1xuICAgIHRpdGxlT2JqLFxuICAgIGNvbnRlbnRzT2JqLFxuICAgIHJpY2hUZXh0XG4gIH0pIHtcbiAgICByZXR1cm4gISEodGl0bGVPYmo/LnN0ciB8fCBjb250ZW50c09iaj8uc3RyIHx8IHJpY2hUZXh0Py5zdHIpO1xuICB9XG4gIGdldCBoYXNQb3B1cERhdGEoKSB7XG4gICAgcmV0dXJuIEFubm90YXRpb25FbGVtZW50Ll9oYXNQb3B1cERhdGEodGhpcy5kYXRhKTtcbiAgfVxuICB1cGRhdGVFZGl0ZWQocGFyYW1zKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiN1cGRhdGVzIHx8PSB7XG4gICAgICByZWN0OiB0aGlzLmRhdGEucmVjdC5zbGljZSgwKVxuICAgIH07XG4gICAgY29uc3Qge1xuICAgICAgcmVjdFxuICAgIH0gPSBwYXJhbXM7XG4gICAgaWYgKHJlY3QpIHtcbiAgICAgIHRoaXMuI3NldFJlY3RFZGl0ZWQocmVjdCk7XG4gICAgfVxuICAgIHRoaXMuI3BvcHVwRWxlbWVudD8ucG9wdXAudXBkYXRlRWRpdGVkKHBhcmFtcyk7XG4gIH1cbiAgcmVzZXRFZGl0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLiN1cGRhdGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3NldFJlY3RFZGl0ZWQodGhpcy4jdXBkYXRlcy5yZWN0KTtcbiAgICB0aGlzLiNwb3B1cEVsZW1lbnQ/LnBvcHVwLnJlc2V0RWRpdGVkKCk7XG4gICAgdGhpcy4jdXBkYXRlcyA9IG51bGw7XG4gIH1cbiAgI3NldFJlY3RFZGl0ZWQocmVjdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRhaW5lcjoge1xuICAgICAgICBzdHlsZVxuICAgICAgfSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcmVjdDogY3VycmVudFJlY3QsXG4gICAgICAgIHJvdGF0aW9uXG4gICAgICB9LFxuICAgICAgcGFyZW50OiB7XG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgcmF3RGltczoge1xuICAgICAgICAgICAgcGFnZVdpZHRoLFxuICAgICAgICAgICAgcGFnZUhlaWdodCxcbiAgICAgICAgICAgIHBhZ2VYLFxuICAgICAgICAgICAgcGFnZVlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9ID0gdGhpcztcbiAgICBjdXJyZW50UmVjdD8uc3BsaWNlKDAsIDQsIC4uLnJlY3QpO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKHJlY3QpO1xuICAgIHN0eWxlLmxlZnQgPSBgJHsxMDAgKiAocmVjdFswXSAtIHBhZ2VYKSAvIHBhZ2VXaWR0aH0lYDtcbiAgICBzdHlsZS50b3AgPSBgJHsxMDAgKiAocGFnZUhlaWdodCAtIHJlY3RbM10gKyBwYWdlWSkgLyBwYWdlSGVpZ2h0fSVgO1xuICAgIGlmIChyb3RhdGlvbiA9PT0gMCkge1xuICAgICAgc3R5bGUud2lkdGggPSBgJHsxMDAgKiB3aWR0aCAvIHBhZ2VXaWR0aH0lYDtcbiAgICAgIHN0eWxlLmhlaWdodCA9IGAkezEwMCAqIGhlaWdodCAvIHBhZ2VIZWlnaHR9JWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0Um90YXRpb24ocm90YXRpb24pO1xuICAgIH1cbiAgfVxuICBfY3JlYXRlQ29udGFpbmVyKGlnbm9yZUJvcmRlcikge1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGEsXG4gICAgICBwYXJlbnQ6IHtcbiAgICAgICAgcGFnZSxcbiAgICAgICAgdmlld3BvcnRcbiAgICAgIH1cbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VjdGlvblwiKTtcbiAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS1hbm5vdGF0aW9uLWlkXCIsIGRhdGEuaWQpO1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCkpIHtcbiAgICAgIGNvbnRhaW5lci50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSBjb250YWluZXI7XG4gICAgc3R5bGUuekluZGV4ID0gdGhpcy5wYXJlbnQuekluZGV4Kys7XG4gICAgaWYgKGRhdGEucG9wdXBSZWYpIHtcbiAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIsIFwiZGlhbG9nXCIpO1xuICAgIH1cbiAgICBpZiAoZGF0YS5hbHRlcm5hdGl2ZVRleHQpIHtcbiAgICAgIGNvbnRhaW5lci50aXRsZSA9IGRhdGEuYWx0ZXJuYXRpdmVUZXh0O1xuICAgIH1cbiAgICBpZiAoZGF0YS5ub1JvdGF0ZSkge1xuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJub3JvdGF0ZVwiKTtcbiAgICB9XG4gICAgaWYgKCFkYXRhLnJlY3QgfHwgdGhpcyBpbnN0YW5jZW9mIFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcm90YXRpb25cbiAgICAgIH0gPSBkYXRhO1xuICAgICAgaWYgKCFkYXRhLmhhc093bkNhbnZhcyAmJiByb3RhdGlvbiAhPT0gMCkge1xuICAgICAgICB0aGlzLnNldFJvdGF0aW9uKHJvdGF0aW9uLCBjb250YWluZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXMoZGF0YS5yZWN0KTtcbiAgICBpZiAoIWlnbm9yZUJvcmRlciAmJiBkYXRhLmJvcmRlclN0eWxlLndpZHRoID4gMCkge1xuICAgICAgc3R5bGUuYm9yZGVyV2lkdGggPSBgJHtkYXRhLmJvcmRlclN0eWxlLndpZHRofXB4YDtcbiAgICAgIGNvbnN0IGhvcml6b250YWxSYWRpdXMgPSBkYXRhLmJvcmRlclN0eWxlLmhvcml6b250YWxDb3JuZXJSYWRpdXM7XG4gICAgICBjb25zdCB2ZXJ0aWNhbFJhZGl1cyA9IGRhdGEuYm9yZGVyU3R5bGUudmVydGljYWxDb3JuZXJSYWRpdXM7XG4gICAgICBpZiAoaG9yaXpvbnRhbFJhZGl1cyA+IDAgfHwgdmVydGljYWxSYWRpdXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IGBjYWxjKCR7aG9yaXpvbnRhbFJhZGl1c31weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpIC8gY2FsYygke3ZlcnRpY2FsUmFkaXVzfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO1xuICAgICAgICBzdHlsZS5ib3JkZXJSYWRpdXMgPSByYWRpdXM7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IGBjYWxjKCR7d2lkdGh9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSAvIGNhbGMoJHtoZWlnaHR9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG4gICAgICAgIHN0eWxlLmJvcmRlclJhZGl1cyA9IHJhZGl1cztcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZGF0YS5ib3JkZXJTdHlsZS5zdHlsZSkge1xuICAgICAgICBjYXNlIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ6XG4gICAgICAgICAgc3R5bGUuYm9yZGVyU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ6XG4gICAgICAgICAgc3R5bGUuYm9yZGVyU3R5bGUgPSBcImRhc2hlZFwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuQkVWRUxFRDpcbiAgICAgICAgICB3YXJuKFwiVW5pbXBsZW1lbnRlZCBib3JkZXIgc3R5bGU6IGJldmVsZWRcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDpcbiAgICAgICAgICB3YXJuKFwiVW5pbXBsZW1lbnRlZCBib3JkZXIgc3R5bGU6IGluc2V0XCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FOlxuICAgICAgICAgIHN0eWxlLmJvcmRlckJvdHRvbVN0eWxlID0gXCJzb2xpZFwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29uc3QgYm9yZGVyQ29sb3IgPSBkYXRhLmJvcmRlckNvbG9yIHx8IG51bGw7XG4gICAgICBpZiAoYm9yZGVyQ29sb3IpIHtcbiAgICAgICAgdGhpcy4jaGFzQm9yZGVyID0gdHJ1ZTtcbiAgICAgICAgc3R5bGUuYm9yZGVyQ29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvcihib3JkZXJDb2xvclswXSB8IDAsIGJvcmRlckNvbG9yWzFdIHwgMCwgYm9yZGVyQ29sb3JbMl0gfCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlLmJvcmRlcldpZHRoID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IFV0aWwubm9ybWFsaXplUmVjdChbZGF0YS5yZWN0WzBdLCBwYWdlLnZpZXdbM10gLSBkYXRhLnJlY3RbMV0gKyBwYWdlLnZpZXdbMV0sIGRhdGEucmVjdFsyXSwgcGFnZS52aWV3WzNdIC0gZGF0YS5yZWN0WzNdICsgcGFnZS52aWV3WzFdXSk7XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVdpZHRoLFxuICAgICAgcGFnZUhlaWdodCxcbiAgICAgIHBhZ2VYLFxuICAgICAgcGFnZVlcbiAgICB9ID0gdmlld3BvcnQucmF3RGltcztcbiAgICBzdHlsZS5sZWZ0ID0gYCR7MTAwICogKHJlY3RbMF0gLSBwYWdlWCkgLyBwYWdlV2lkdGh9JWA7XG4gICAgc3R5bGUudG9wID0gYCR7MTAwICogKHJlY3RbMV0gLSBwYWdlWSkgLyBwYWdlSGVpZ2h0fSVgO1xuICAgIGNvbnN0IHtcbiAgICAgIHJvdGF0aW9uXG4gICAgfSA9IGRhdGE7XG4gICAgaWYgKGRhdGEuaGFzT3duQ2FudmFzIHx8IHJvdGF0aW9uID09PSAwKSB7XG4gICAgICBzdHlsZS53aWR0aCA9IGAkezEwMCAqIHdpZHRoIC8gcGFnZVdpZHRofSVgO1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gYCR7MTAwICogaGVpZ2h0IC8gcGFnZUhlaWdodH0lYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRSb3RhdGlvbihyb3RhdGlvbiwgY29udGFpbmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuICBzZXRSb3RhdGlvbihhbmdsZSwgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIpIHtcbiAgICBpZiAoIXRoaXMuZGF0YS5yZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHBhZ2VXaWR0aCxcbiAgICAgIHBhZ2VIZWlnaHRcbiAgICB9ID0gdGhpcy5wYXJlbnQudmlld3BvcnQucmF3RGltcztcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyh0aGlzLmRhdGEucmVjdCk7XG4gICAgbGV0IGVsZW1lbnRXaWR0aCwgZWxlbWVudEhlaWdodDtcbiAgICBpZiAoYW5nbGUgJSAxODAgPT09IDApIHtcbiAgICAgIGVsZW1lbnRXaWR0aCA9IDEwMCAqIHdpZHRoIC8gcGFnZVdpZHRoO1xuICAgICAgZWxlbWVudEhlaWdodCA9IDEwMCAqIGhlaWdodCAvIHBhZ2VIZWlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRXaWR0aCA9IDEwMCAqIGhlaWdodCAvIHBhZ2VXaWR0aDtcbiAgICAgIGVsZW1lbnRIZWlnaHQgPSAxMDAgKiB3aWR0aCAvIHBhZ2VIZWlnaHQ7XG4gICAgfVxuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IGAke2VsZW1lbnRXaWR0aH0lYDtcbiAgICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7ZWxlbWVudEhlaWdodH0lYDtcbiAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsICgzNjAgLSBhbmdsZSkgJSAzNjApO1xuICB9XG4gIGdldCBfY29tbW9uQWN0aW9ucygpIHtcbiAgICBjb25zdCBzZXRDb2xvciA9IChqc05hbWUsIHN0eWxlTmFtZSwgZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGNvbG9yID0gZXZlbnQuZGV0YWlsW2pzTmFtZV07XG4gICAgICBjb25zdCBjb2xvclR5cGUgPSBjb2xvclswXTtcbiAgICAgIGNvbnN0IGNvbG9yQXJyYXkgPSBjb2xvci5zbGljZSgxKTtcbiAgICAgIGV2ZW50LnRhcmdldC5zdHlsZVtzdHlsZU5hbWVdID0gQ29sb3JDb252ZXJ0ZXJzW2Ake2NvbG9yVHlwZX1fSFRNTGBdKGNvbG9yQXJyYXkpO1xuICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcbiAgICAgICAgW3N0eWxlTmFtZV06IENvbG9yQ29udmVydGVyc1tgJHtjb2xvclR5cGV9X3JnYmBdKGNvbG9yQXJyYXkpXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfY29tbW9uQWN0aW9uc1wiLCB7XG4gICAgICBkaXNwbGF5OiBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBkaXNwbGF5XG4gICAgICAgIH0gPSBldmVudC5kZXRhaWw7XG4gICAgICAgIGNvbnN0IGhpZGRlbiA9IGRpc3BsYXkgJSAyID09PSAxO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gaGlkZGVuID8gXCJoaWRkZW5cIiA6IFwidmlzaWJsZVwiO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgIG5vVmlldzogaGlkZGVuLFxuICAgICAgICAgIG5vUHJpbnQ6IGRpc3BsYXkgPT09IDEgfHwgZGlzcGxheSA9PT0gMlxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBwcmludDogZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgIG5vUHJpbnQ6ICFldmVudC5kZXRhaWwucHJpbnRcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgaGlkZGVuOiBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBoaWRkZW5cbiAgICAgICAgfSA9IGV2ZW50LmRldGFpbDtcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9IGhpZGRlbiA/IFwiaGlkZGVuXCIgOiBcInZpc2libGVcIjtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcbiAgICAgICAgICBub1ByaW50OiBoaWRkZW4sXG4gICAgICAgICAgbm9WaWV3OiBoaWRkZW5cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZm9jdXM6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBldmVudC50YXJnZXQuZm9jdXMoe1xuICAgICAgICAgIHByZXZlbnRTY3JvbGw6IGZhbHNlXG4gICAgICAgIH0pLCAwKTtcbiAgICAgIH0sXG4gICAgICB1c2VyTmFtZTogZXZlbnQgPT4ge1xuICAgICAgICBldmVudC50YXJnZXQudGl0bGUgPSBldmVudC5kZXRhaWwudXNlck5hbWU7XG4gICAgICB9LFxuICAgICAgcmVhZG9ubHk6IGV2ZW50ID0+IHtcbiAgICAgICAgZXZlbnQudGFyZ2V0LmRpc2FibGVkID0gZXZlbnQuZGV0YWlsLnJlYWRvbmx5O1xuICAgICAgfSxcbiAgICAgIHJlcXVpcmVkOiBldmVudCA9PiB7XG4gICAgICAgIHRoaXMuX3NldFJlcXVpcmVkKGV2ZW50LnRhcmdldCwgZXZlbnQuZGV0YWlsLnJlcXVpcmVkKTtcbiAgICAgIH0sXG4gICAgICBiZ0NvbG9yOiBldmVudCA9PiB7XG4gICAgICAgIHNldENvbG9yKFwiYmdDb2xvclwiLCBcImJhY2tncm91bmRDb2xvclwiLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgZmlsbENvbG9yOiBldmVudCA9PiB7XG4gICAgICAgIHNldENvbG9yKFwiZmlsbENvbG9yXCIsIFwiYmFja2dyb3VuZENvbG9yXCIsIGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICBmZ0NvbG9yOiBldmVudCA9PiB7XG4gICAgICAgIHNldENvbG9yKFwiZmdDb2xvclwiLCBcImNvbG9yXCIsIGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICB0ZXh0Q29sb3I6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0Q29sb3IoXCJ0ZXh0Q29sb3JcIiwgXCJjb2xvclwiLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgYm9yZGVyQ29sb3I6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0Q29sb3IoXCJib3JkZXJDb2xvclwiLCBcImJvcmRlckNvbG9yXCIsIGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICBzdHJva2VDb2xvcjogZXZlbnQgPT4ge1xuICAgICAgICBzZXRDb2xvcihcInN0cm9rZUNvbG9yXCIsIFwiYm9yZGVyQ29sb3JcIiwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIHJvdGF0aW9uOiBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGFuZ2xlID0gZXZlbnQuZGV0YWlsLnJvdGF0aW9uO1xuICAgICAgICB0aGlzLnNldFJvdGF0aW9uKGFuZ2xlKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcbiAgICAgICAgICByb3RhdGlvbjogYW5nbGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChhY3Rpb25zLCBqc0V2ZW50KSB7XG4gICAgY29uc3QgY29tbW9uQWN0aW9ucyA9IHRoaXMuX2NvbW1vbkFjdGlvbnM7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGpzRXZlbnQuZGV0YWlsKSkge1xuICAgICAgY29uc3QgYWN0aW9uID0gYWN0aW9uc1tuYW1lXSB8fCBjb21tb25BY3Rpb25zW25hbWVdO1xuICAgICAgYWN0aW9uPy4oanNFdmVudCk7XG4gICAgfVxuICB9XG4gIF9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhlbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZVNjcmlwdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdG9yZWREYXRhID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5nZXRSYXdWYWx1ZSh0aGlzLmRhdGEuaWQpO1xuICAgIGlmICghc3RvcmVkRGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb21tb25BY3Rpb25zID0gdGhpcy5fY29tbW9uQWN0aW9ucztcbiAgICBmb3IgKGNvbnN0IFthY3Rpb25OYW1lLCBkZXRhaWxdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlZERhdGEpKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBjb21tb25BY3Rpb25zW2FjdGlvbk5hbWVdO1xuICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICBjb25zdCBldmVudFByb3h5ID0ge1xuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgW2FjdGlvbk5hbWVdOiBkZXRhaWxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRhcmdldDogZWxlbWVudFxuICAgICAgICB9O1xuICAgICAgICBhY3Rpb24oZXZlbnRQcm94eSk7XG4gICAgICAgIGRlbGV0ZSBzdG9yZWREYXRhW2FjdGlvbk5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBfY3JlYXRlUXVhZHJpbGF0ZXJhbHMoKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBxdWFkUG9pbnRzXG4gICAgfSA9IHRoaXMuZGF0YTtcbiAgICBpZiAoIXF1YWRQb2ludHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW3JlY3RCbFgsIHJlY3RCbFksIHJlY3RUclgsIHJlY3RUclldID0gdGhpcy5kYXRhLnJlY3QubWFwKHggPT4gTWF0aC5mcm91bmQoeCkpO1xuICAgIGlmIChxdWFkUG9pbnRzLmxlbmd0aCA9PT0gOCkge1xuICAgICAgY29uc3QgW3RyWCwgdHJZLCBibFgsIGJsWV0gPSBxdWFkUG9pbnRzLnN1YmFycmF5KDIsIDYpO1xuICAgICAgaWYgKHJlY3RUclggPT09IHRyWCAmJiByZWN0VHJZID09PSB0clkgJiYgcmVjdEJsWCA9PT0gYmxYICYmIHJlY3RCbFkgPT09IGJsWSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuY29udGFpbmVyO1xuICAgIGxldCBzdmdCdWZmZXI7XG4gICAgaWYgKHRoaXMuI2hhc0JvcmRlcikge1xuICAgICAgY29uc3Qge1xuICAgICAgICBib3JkZXJDb2xvcixcbiAgICAgICAgYm9yZGVyV2lkdGhcbiAgICAgIH0gPSBzdHlsZTtcbiAgICAgIHN0eWxlLmJvcmRlcldpZHRoID0gMDtcbiAgICAgIHN2Z0J1ZmZlciA9IFtcInVybCgnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsXCIsIGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcImAsIGAgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDEgMVwiPmAsIGA8ZyBmaWxsPVwidHJhbnNwYXJlbnRcIiBzdHJva2U9XCIke2JvcmRlckNvbG9yfVwiIHN0cm9rZS13aWR0aD1cIiR7Ym9yZGVyV2lkdGh9XCI+YF07XG4gICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGFzQm9yZGVyXCIpO1xuICAgIH1cbiAgICBjb25zdCB3aWR0aCA9IHJlY3RUclggLSByZWN0QmxYO1xuICAgIGNvbnN0IGhlaWdodCA9IHJlY3RUclkgLSByZWN0QmxZO1xuICAgIGNvbnN0IHtcbiAgICAgIHN2Z0ZhY3RvcnlcbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCBzdmcgPSBzdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIik7XG4gICAgc3ZnLmNsYXNzTGlzdC5hZGQoXCJxdWFkcmlsYXRlcmFsc0NvbnRhaW5lclwiKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgMCk7XG4gICAgc3ZnLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCAwKTtcbiAgICBjb25zdCBkZWZzID0gc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwiZGVmc1wiKTtcbiAgICBzdmcuYXBwZW5kKGRlZnMpO1xuICAgIGNvbnN0IGNsaXBQYXRoID0gc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwiY2xpcFBhdGhcIik7XG4gICAgY29uc3QgaWQgPSBgY2xpcHBhdGhfJHt0aGlzLmRhdGEuaWR9YDtcbiAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBpZCk7XG4gICAgY2xpcFBhdGguc2V0QXR0cmlidXRlKFwiY2xpcFBhdGhVbml0c1wiLCBcIm9iamVjdEJvdW5kaW5nQm94XCIpO1xuICAgIGRlZnMuYXBwZW5kKGNsaXBQYXRoKTtcbiAgICBmb3IgKGxldCBpID0gMiwgaWkgPSBxdWFkUG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDgpIHtcbiAgICAgIGNvbnN0IHRyWCA9IHF1YWRQb2ludHNbaV07XG4gICAgICBjb25zdCB0clkgPSBxdWFkUG9pbnRzW2kgKyAxXTtcbiAgICAgIGNvbnN0IGJsWCA9IHF1YWRQb2ludHNbaSArIDJdO1xuICAgICAgY29uc3QgYmxZID0gcXVhZFBvaW50c1tpICsgM107XG4gICAgICBjb25zdCByZWN0ID0gc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwicmVjdFwiKTtcbiAgICAgIGNvbnN0IHggPSAoYmxYIC0gcmVjdEJsWCkgLyB3aWR0aDtcbiAgICAgIGNvbnN0IHkgPSAocmVjdFRyWSAtIHRyWSkgLyBoZWlnaHQ7XG4gICAgICBjb25zdCByZWN0V2lkdGggPSAodHJYIC0gYmxYKSAvIHdpZHRoO1xuICAgICAgY29uc3QgcmVjdEhlaWdodCA9ICh0clkgLSBibFkpIC8gaGVpZ2h0O1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ4XCIsIHgpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIHkpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCByZWN0V2lkdGgpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgcmVjdEhlaWdodCk7XG4gICAgICBjbGlwUGF0aC5hcHBlbmQocmVjdCk7XG4gICAgICBzdmdCdWZmZXI/LnB1c2goYDxyZWN0IHZlY3Rvci1lZmZlY3Q9XCJub24tc2NhbGluZy1zdHJva2VcIiB4PVwiJHt4fVwiIHk9XCIke3l9XCIgd2lkdGg9XCIke3JlY3RXaWR0aH1cIiBoZWlnaHQ9XCIke3JlY3RIZWlnaHR9XCIvPmApO1xuICAgIH1cbiAgICBpZiAodGhpcy4jaGFzQm9yZGVyKSB7XG4gICAgICBzdmdCdWZmZXIucHVzaChgPC9nPjwvc3ZnPicpYCk7XG4gICAgICBzdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBzdmdCdWZmZXIuam9pbihcIlwiKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG4gICAgdGhpcy5jb250YWluZXIuc3R5bGUuY2xpcFBhdGggPSBgdXJsKCMke2lkfSlgO1xuICB9XG4gIF9jcmVhdGVQb3B1cCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb250YWluZXIsXG4gICAgICBkYXRhXG4gICAgfSA9IHRoaXM7XG4gICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIiwgXCJkaWFsb2dcIik7XG4gICAgY29uc3QgcG9wdXAgPSB0aGlzLiNwb3B1cEVsZW1lbnQgPSBuZXcgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCh7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGNvbG9yOiBkYXRhLmNvbG9yLFxuICAgICAgICB0aXRsZU9iajogZGF0YS50aXRsZU9iaixcbiAgICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogZGF0YS5tb2RpZmljYXRpb25EYXRlLFxuICAgICAgICBjb250ZW50c09iajogZGF0YS5jb250ZW50c09iaixcbiAgICAgICAgcmljaFRleHQ6IGRhdGEucmljaFRleHQsXG4gICAgICAgIHBhcmVudFJlY3Q6IGRhdGEucmVjdCxcbiAgICAgICAgYm9yZGVyU3R5bGU6IDAsXG4gICAgICAgIGlkOiBgcG9wdXBfJHtkYXRhLmlkfWAsXG4gICAgICAgIHJvdGF0aW9uOiBkYXRhLnJvdGF0aW9uXG4gICAgICB9LFxuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGVsZW1lbnRzOiBbdGhpc11cbiAgICB9KTtcbiAgICB0aGlzLnBhcmVudC5kaXYuYXBwZW5kKHBvcHVwLnJlbmRlcigpKTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYEFubm90YXRpb25FbGVtZW50LnJlbmRlcmAgY2FsbGVkXCIpO1xuICB9XG4gIF9nZXRFbGVtZW50c0J5TmFtZShuYW1lLCBza2lwSWQgPSBudWxsKSB7XG4gICAgY29uc3QgZmllbGRzID0gW107XG4gICAgaWYgKHRoaXMuX2ZpZWxkT2JqZWN0cykge1xuICAgICAgY29uc3QgZmllbGRPYmogPSB0aGlzLl9maWVsZE9iamVjdHNbbmFtZV07XG4gICAgICBpZiAoZmllbGRPYmopIHtcbiAgICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgICAgcGFnZSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBleHBvcnRWYWx1ZXNcbiAgICAgICAgfSBvZiBmaWVsZE9iaikge1xuICAgICAgICAgIGlmIChwYWdlID09PSAtMSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpZCA9PT0gc2tpcElkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZXhwb3J0VmFsdWUgPSB0eXBlb2YgZXhwb3J0VmFsdWVzID09PSBcInN0cmluZ1wiID8gZXhwb3J0VmFsdWVzIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtZWxlbWVudC1pZD1cIiR7aWR9XCJdYCk7XG4gICAgICAgICAgaWYgKGRvbUVsZW1lbnQgJiYgIUdldEVsZW1lbnRzQnlOYW1lU2V0Lmhhcyhkb21FbGVtZW50KSkge1xuICAgICAgICAgICAgd2FybihgX2dldEVsZW1lbnRzQnlOYW1lIC0gZWxlbWVudCBub3QgYWxsb3dlZDogJHtpZH1gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZHMucHVzaCh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGV4cG9ydFZhbHVlLFxuICAgICAgICAgICAgZG9tRWxlbWVudFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmllbGRzO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRvbUVsZW1lbnQgb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUobmFtZSkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZXhwb3J0VmFsdWVcbiAgICAgIH0gPSBkb21FbGVtZW50O1xuICAgICAgY29uc3QgaWQgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiKTtcbiAgICAgIGlmIChpZCA9PT0gc2tpcElkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFHZXRFbGVtZW50c0J5TmFtZVNldC5oYXMoZG9tRWxlbWVudCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmaWVsZHMucHVzaCh7XG4gICAgICAgIGlkLFxuICAgICAgICBleHBvcnRWYWx1ZSxcbiAgICAgICAgZG9tRWxlbWVudFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmhpZGRlbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnBvcHVwPy5tYXliZVNob3coKTtcbiAgfVxuICBoaWRlKCkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgdGhpcy5jb250YWluZXIuaGlkZGVuID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5wb3B1cD8uZm9yY2VIaWRlKCk7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IHRoaXMuZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRyaWdnZXJzKSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRyaWdnZXJzKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJzLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICAgIH1cbiAgfVxuICBnZXQgX2lzRWRpdGFibGUoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIF9lZGl0T25Eb3VibGVDbGljaygpIHtcbiAgICBpZiAoIXRoaXMuX2lzRWRpdGFibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYW5ub3RhdGlvbkVkaXRvclR5cGU6IG1vZGUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGlkOiBlZGl0SWRcbiAgICAgIH1cbiAgICB9ID0gdGhpcztcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwiZGJsY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJzd2l0Y2hhbm5vdGF0aW9uZWRpdG9ybW9kZVwiLCB7XG4gICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgbW9kZSxcbiAgICAgICAgZWRpdElkXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgTGlua0Fubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzLCBvcHRpb25zID0gbnVsbCkge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogISFvcHRpb25zPy5pZ25vcmVCb3JkZXIsXG4gICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuaXNUb29sdGlwT25seSA9IHBhcmFtZXRlcnMuZGF0YS5pc1Rvb2x0aXBPbmx5O1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBkYXRhLFxuICAgICAgbGlua1NlcnZpY2VcbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgbGluay5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgZGF0YS5pZCk7XG4gICAgbGV0IGlzQm91bmQgPSBmYWxzZTtcbiAgICBpZiAoZGF0YS51cmwpIHtcbiAgICAgIGxpbmtTZXJ2aWNlLmFkZExpbmtBdHRyaWJ1dGVzKGxpbmssIGRhdGEudXJsLCBkYXRhLm5ld1dpbmRvdyk7XG4gICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEuYWN0aW9uKSB7XG4gICAgICB0aGlzLl9iaW5kTmFtZWRBY3Rpb24obGluaywgZGF0YS5hY3Rpb24pO1xuICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkYXRhLmF0dGFjaG1lbnQpIHtcbiAgICAgIHRoaXMuI2JpbmRBdHRhY2htZW50KGxpbmssIGRhdGEuYXR0YWNobWVudCwgZGF0YS5hdHRhY2htZW50RGVzdCk7XG4gICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEuc2V0T0NHU3RhdGUpIHtcbiAgICAgIHRoaXMuI2JpbmRTZXRPQ0dTdGF0ZShsaW5rLCBkYXRhLnNldE9DR1N0YXRlKTtcbiAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5kZXN0KSB7XG4gICAgICB0aGlzLl9iaW5kTGluayhsaW5rLCBkYXRhLmRlc3QpO1xuICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkYXRhLmFjdGlvbnMgJiYgKGRhdGEuYWN0aW9ucy5BY3Rpb24gfHwgZGF0YS5hY3Rpb25zW1wiTW91c2UgVXBcIl0gfHwgZGF0YS5hY3Rpb25zW1wiTW91c2UgRG93blwiXSkgJiYgdGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fYmluZEpTQWN0aW9uKGxpbmssIGRhdGEpO1xuICAgICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnJlc2V0Rm9ybSkge1xuICAgICAgICB0aGlzLl9iaW5kUmVzZXRGb3JtQWN0aW9uKGxpbmssIGRhdGEucmVzZXRGb3JtKTtcbiAgICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUb29sdGlwT25seSAmJiAhaXNCb3VuZCkge1xuICAgICAgICB0aGlzLl9iaW5kTGluayhsaW5rLCBcIlwiKTtcbiAgICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJsaW5rQW5ub3RhdGlvblwiKTtcbiAgICBpZiAoaXNCb3VuZCkge1xuICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGxpbmspO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgI3NldEludGVybmFsTGluaygpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWludGVybmFsLWxpbmtcIiwgXCJcIik7XG4gIH1cbiAgX2JpbmRMaW5rKGxpbmssIGRlc3RpbmF0aW9uKSB7XG4gICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXREZXN0aW5hdGlvbkhhc2goZGVzdGluYXRpb24pO1xuICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmIChkZXN0aW5hdGlvbikge1xuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmdvVG9EZXN0aW5hdGlvbihkZXN0aW5hdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBpZiAoZGVzdGluYXRpb24gfHwgZGVzdGluYXRpb24gPT09IFwiXCIpIHtcbiAgICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuICAgIH1cbiAgfVxuICBfYmluZE5hbWVkQWN0aW9uKGxpbmssIGFjdGlvbikge1xuICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcbiAgICAgIHRoaXMubGlua1NlcnZpY2UuZXhlY3V0ZU5hbWVkQWN0aW9uKGFjdGlvbik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcbiAgfVxuICAjYmluZEF0dGFjaG1lbnQobGluaywgYXR0YWNobWVudCwgZGVzdCA9IG51bGwpIHtcbiAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcbiAgICBpZiAoYXR0YWNobWVudC5kZXNjcmlwdGlvbikge1xuICAgICAgbGluay50aXRsZSA9IGF0dGFjaG1lbnQuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcbiAgICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyPy5vcGVuT3JEb3dubG9hZERhdGEoYXR0YWNobWVudC5jb250ZW50LCBhdHRhY2htZW50LmZpbGVuYW1lLCBkZXN0KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuICB9XG4gICNiaW5kU2V0T0NHU3RhdGUobGluaywgYWN0aW9uKSB7XG4gICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5saW5rU2VydmljZS5leGVjdXRlU2V0T0NHU3RhdGUoYWN0aW9uKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuICB9XG4gIF9iaW5kSlNBY3Rpb24obGluaywgZGF0YSkge1xuICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoW1tcIkFjdGlvblwiLCBcIm9uY2xpY2tcIl0sIFtcIk1vdXNlIFVwXCIsIFwib25tb3VzZXVwXCJdLCBbXCJNb3VzZSBEb3duXCIsIFwib25tb3VzZWRvd25cIl1dKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGF0YS5hY3Rpb25zKSkge1xuICAgICAgY29uc3QganNOYW1lID0gbWFwLmdldChuYW1lKTtcbiAgICAgIGlmICghanNOYW1lKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGlua1tqc05hbWVdID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICghbGluay5vbmNsaWNrKSB7XG4gICAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG4gIH1cbiAgX2JpbmRSZXNldEZvcm1BY3Rpb24obGluaywgcmVzZXRGb3JtKSB7XG4gICAgY29uc3Qgb3RoZXJDbGlja0FjdGlvbiA9IGxpbmsub25jbGljaztcbiAgICBpZiAoIW90aGVyQ2xpY2tBY3Rpb24pIHtcbiAgICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcbiAgICBpZiAoIXRoaXMuX2ZpZWxkT2JqZWN0cykge1xuICAgICAgd2FybihgX2JpbmRSZXNldEZvcm1BY3Rpb24gLSBcInJlc2V0Rm9ybVwiIGFjdGlvbiBub3Qgc3VwcG9ydGVkLCBgICsgXCJlbnN1cmUgdGhhdCB0aGUgYGZpZWxkT2JqZWN0c2AgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLlwiKTtcbiAgICAgIGlmICghb3RoZXJDbGlja0FjdGlvbikge1xuICAgICAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgb3RoZXJDbGlja0FjdGlvbj8uKCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZpZWxkczogcmVzZXRGb3JtRmllbGRzLFxuICAgICAgICByZWZzOiByZXNldEZvcm1SZWZzLFxuICAgICAgICBpbmNsdWRlXG4gICAgICB9ID0gcmVzZXRGb3JtO1xuICAgICAgY29uc3QgYWxsRmllbGRzID0gW107XG4gICAgICBpZiAocmVzZXRGb3JtRmllbGRzLmxlbmd0aCAhPT0gMCB8fCByZXNldEZvcm1SZWZzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBjb25zdCBmaWVsZElkcyA9IG5ldyBTZXQocmVzZXRGb3JtUmVmcyk7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGROYW1lIG9mIHJlc2V0Rm9ybUZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuX2ZpZWxkT2JqZWN0c1tmaWVsZE5hbWVdIHx8IFtdO1xuICAgICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgICAgaWRcbiAgICAgICAgICB9IG9mIGZpZWxkcykge1xuICAgICAgICAgICAgZmllbGRJZHMuYWRkKGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmaWVsZHMgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9maWVsZE9iamVjdHMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZElkcy5oYXMoZmllbGQuaWQpID09PSBpbmNsdWRlKSB7XG4gICAgICAgICAgICAgIGFsbEZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGRzIG9mIE9iamVjdC52YWx1ZXModGhpcy5fZmllbGRPYmplY3RzKSkge1xuICAgICAgICAgIGFsbEZpZWxkcy5wdXNoKC4uLmZpZWxkcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgICAgY29uc3QgYWxsSWRzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGFsbEZpZWxkcykge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSA9IGZpZWxkO1xuICAgICAgICBhbGxJZHMucHVzaChpZCk7XG4gICAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQuZGVmYXVsdFZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgY2FzZSBcInJhZGlvYnV0dG9uXCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQuZGVmYXVsdFZhbHVlID09PSBmaWVsZC5leHBvcnRWYWx1ZXM7XG4gICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImNvbWJvYm94XCI6XG4gICAgICAgICAgY2FzZSBcImxpc3Rib3hcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWVsZW1lbnQtaWQ9XCIke2lkfVwiXWApO1xuICAgICAgICBpZiAoIWRvbUVsZW1lbnQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmICghR2V0RWxlbWVudHNCeU5hbWVTZXQuaGFzKGRvbUVsZW1lbnQpKSB7XG4gICAgICAgICAgd2FybihgX2JpbmRSZXNldEZvcm1BY3Rpb24gLSBlbGVtZW50IG5vdCBhbGxvd2VkOiAke2lkfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGRvbUVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJyZXNldGZvcm1cIikpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nKSB7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaWQ6IFwiYXBwXCIsXG4gICAgICAgICAgICBpZHM6IGFsbElkcyxcbiAgICAgICAgICAgIG5hbWU6IFwiUmVzZXRGb3JtXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH1cbn1cbmNsYXNzIFRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dEFubm90YXRpb25cIik7XG4gICAgY29uc3QgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgIGltYWdlLnNyYyA9IHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoICsgXCJhbm5vdGF0aW9uLVwiICsgdGhpcy5kYXRhLm5hbWUudG9Mb3dlckNhc2UoKSArIFwiLnN2Z1wiO1xuICAgIGltYWdlLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLXRleHQtYW5ub3RhdGlvbi10eXBlXCIpO1xuICAgIGltYWdlLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1hcmdzXCIsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHR5cGU6IHRoaXMuZGF0YS5uYW1lXG4gICAgfSkpO1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoaW1hZ2UpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgc2hvd0VsZW1lbnRBbmRIaWRlQ2FudmFzKGVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5kYXRhLmhhc093bkNhbnZhcykge1xuICAgICAgaWYgKGVsZW1lbnQucHJldmlvdXNTaWJsaW5nPy5ub2RlTmFtZSA9PT0gXCJDQU5WQVNcIikge1xuICAgICAgICBlbGVtZW50LnByZXZpb3VzU2libGluZy5oaWRkZW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5oaWRkZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgX2dldEtleU1vZGlmaWVyKGV2ZW50KSB7XG4gICAgcmV0dXJuIHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm0uaXNNYWMgPyBldmVudC5tZXRhS2V5IDogZXZlbnQuY3RybEtleTtcbiAgfVxuICBfc2V0RXZlbnRMaXN0ZW5lcihlbGVtZW50LCBlbGVtZW50RGF0YSwgYmFzZU5hbWUsIGV2ZW50TmFtZSwgdmFsdWVHZXR0ZXIpIHtcbiAgICBpZiAoYmFzZU5hbWUuaW5jbHVkZXMoXCJtb3VzZVwiKSkge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJhc2VOYW1lLCBldmVudCA9PiB7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcbiAgICAgICAgICAgIG5hbWU6IGV2ZW50TmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZUdldHRlcihldmVudCksXG4gICAgICAgICAgICBzaGlmdDogZXZlbnQuc2hpZnRLZXksXG4gICAgICAgICAgICBtb2RpZmllcjogdGhpcy5fZ2V0S2V5TW9kaWZpZXIoZXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYmFzZU5hbWUsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKGJhc2VOYW1lID09PSBcImJsdXJcIikge1xuICAgICAgICAgIGlmICghZWxlbWVudERhdGEuZm9jdXNlZCB8fCAhZXZlbnQucmVsYXRlZFRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50RGF0YS5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoYmFzZU5hbWUgPT09IFwiZm9jdXNcIikge1xuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5mb2N1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnREYXRhLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsdWVHZXR0ZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBpZDogdGhpcy5kYXRhLmlkLFxuICAgICAgICAgICAgbmFtZTogZXZlbnROYW1lLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlR2V0dGVyKGV2ZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgX3NldEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIGVsZW1lbnREYXRhLCBuYW1lcywgZ2V0dGVyKSB7XG4gICAgZm9yIChjb25zdCBbYmFzZU5hbWUsIGV2ZW50TmFtZV0gb2YgbmFtZXMpIHtcbiAgICAgIGlmIChldmVudE5hbWUgPT09IFwiQWN0aW9uXCIgfHwgdGhpcy5kYXRhLmFjdGlvbnM/LltldmVudE5hbWVdKSB7XG4gICAgICAgIGlmIChldmVudE5hbWUgPT09IFwiRm9jdXNcIiB8fCBldmVudE5hbWUgPT09IFwiQmx1clwiKSB7XG4gICAgICAgICAgZWxlbWVudERhdGEgfHw9IHtcbiAgICAgICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGVsZW1lbnREYXRhLCBiYXNlTmFtZSwgZXZlbnROYW1lLCBnZXR0ZXIpO1xuICAgICAgICBpZiAoZXZlbnROYW1lID09PSBcIkZvY3VzXCIgJiYgIXRoaXMuZGF0YS5hY3Rpb25zPy5CbHVyKSB7XG4gICAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcihlbGVtZW50LCBlbGVtZW50RGF0YSwgXCJibHVyXCIsIFwiQmx1clwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudE5hbWUgPT09IFwiQmx1clwiICYmICF0aGlzLmRhdGEuYWN0aW9ucz8uRm9jdXMpIHtcbiAgICAgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGVsZW1lbnREYXRhLCBcImZvY3VzXCIsIFwiRm9jdXNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX3NldEJhY2tncm91bmRDb2xvcihlbGVtZW50KSB7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yIHx8IG51bGw7XG4gICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvciA9PT0gbnVsbCA/IFwidHJhbnNwYXJlbnRcIiA6IFV0aWwubWFrZUhleENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuICB9XG4gIF9zZXRUZXh0U3R5bGUoZWxlbWVudCkge1xuICAgIGNvbnN0IFRFWFRfQUxJR05NRU5UID0gW1wibGVmdFwiLCBcImNlbnRlclwiLCBcInJpZ2h0XCJdO1xuICAgIGNvbnN0IHtcbiAgICAgIGZvbnRDb2xvclxuICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhO1xuICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250U2l6ZSB8fCBhbm5vdGF0aW9uX2xheWVyX0RFRkFVTFRfRk9OVF9TSVpFO1xuICAgIGNvbnN0IHN0eWxlID0gZWxlbWVudC5zdHlsZTtcbiAgICBsZXQgY29tcHV0ZWRGb250U2l6ZTtcbiAgICBjb25zdCBCT1JERVJfU0laRSA9IDI7XG4gICAgY29uc3Qgcm91bmRUb09uZURlY2ltYWwgPSB4ID0+IE1hdGgucm91bmQoMTAgKiB4KSAvIDEwO1xuICAgIGlmICh0aGlzLmRhdGEubXVsdGlMaW5lKSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmFicyh0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdIC0gQk9SREVSX1NJWkUpO1xuICAgICAgY29uc3QgbnVtYmVyT2ZMaW5lcyA9IE1hdGgucm91bmQoaGVpZ2h0IC8gKExJTkVfRkFDVE9SICogZm9udFNpemUpKSB8fCAxO1xuICAgICAgY29uc3QgbGluZUhlaWdodCA9IGhlaWdodCAvIG51bWJlck9mTGluZXM7XG4gICAgICBjb21wdXRlZEZvbnRTaXplID0gTWF0aC5taW4oZm9udFNpemUsIHJvdW5kVG9PbmVEZWNpbWFsKGxpbmVIZWlnaHQgLyBMSU5FX0ZBQ1RPUikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmFicyh0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdIC0gQk9SREVSX1NJWkUpO1xuICAgICAgY29tcHV0ZWRGb250U2l6ZSA9IE1hdGgubWluKGZvbnRTaXplLCByb3VuZFRvT25lRGVjaW1hbChoZWlnaHQgLyBMSU5FX0ZBQ1RPUikpO1xuICAgIH1cbiAgICBzdHlsZS5mb250U2l6ZSA9IGBjYWxjKCR7Y29tcHV0ZWRGb250U2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcbiAgICBzdHlsZS5jb2xvciA9IFV0aWwubWFrZUhleENvbG9yKGZvbnRDb2xvclswXSwgZm9udENvbG9yWzFdLCBmb250Q29sb3JbMl0pO1xuICAgIGlmICh0aGlzLmRhdGEudGV4dEFsaWdubWVudCAhPT0gbnVsbCkge1xuICAgICAgc3R5bGUudGV4dEFsaWduID0gVEVYVF9BTElHTk1FTlRbdGhpcy5kYXRhLnRleHRBbGlnbm1lbnRdO1xuICAgIH1cbiAgfVxuICBfc2V0UmVxdWlyZWQoZWxlbWVudCwgaXNSZXF1aXJlZCkge1xuICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcInJlcXVpcmVkXCIpO1xuICAgIH1cbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtcmVxdWlyZWRcIiwgaXNSZXF1aXJlZCk7XG4gIH1cbn1cbmNsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9IHBhcmFtZXRlcnMucmVuZGVyRm9ybXMgfHwgcGFyYW1ldGVycy5kYXRhLmhhc093bkNhbnZhcyB8fCAhcGFyYW1ldGVycy5kYXRhLmhhc0FwcGVhcmFuY2UgJiYgISFwYXJhbWV0ZXJzLmRhdGEuZmllbGRWYWx1ZTtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGVcbiAgICB9KTtcbiAgfVxuICBzZXRQcm9wZXJ0eU9uU2libGluZ3MoYmFzZSwga2V5LCB2YWx1ZSwga2V5SW5TdG9yYWdlKSB7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKGJhc2UubmFtZSwgYmFzZS5pZCkpIHtcbiAgICAgIGlmIChlbGVtZW50LmRvbUVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5kb21FbGVtZW50W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoZWxlbWVudC5pZCwge1xuICAgICAgICBba2V5SW5TdG9yYWdlXTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgY29uc3QgaWQgPSB0aGlzLmRhdGEuaWQ7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInRleHRXaWRnZXRBbm5vdGF0aW9uXCIpO1xuICAgIGxldCBlbGVtZW50ID0gbnVsbDtcbiAgICBpZiAodGhpcy5yZW5kZXJGb3Jtcykge1xuICAgICAgY29uc3Qgc3RvcmVkRGF0YSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlXG4gICAgICB9KTtcbiAgICAgIGxldCB0ZXh0Q29udGVudCA9IHN0b3JlZERhdGEudmFsdWUgfHwgXCJcIjtcbiAgICAgIGNvbnN0IG1heExlbiA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgICAgY2hhckxpbWl0OiB0aGlzLmRhdGEubWF4TGVuXG4gICAgICB9KS5jaGFyTGltaXQ7XG4gICAgICBpZiAobWF4TGVuICYmIHRleHRDb250ZW50Lmxlbmd0aCA+IG1heExlbikge1xuICAgICAgICB0ZXh0Q29udGVudCA9IHRleHRDb250ZW50LnNsaWNlKDAsIG1heExlbik7XG4gICAgICB9XG4gICAgICBsZXQgZmllbGRGb3JtYXR0ZWRWYWx1ZXMgPSBzdG9yZWREYXRhLmZvcm1hdHRlZFZhbHVlIHx8IHRoaXMuZGF0YS50ZXh0Q29udGVudD8uam9pbihcIlxcblwiKSB8fCBudWxsO1xuICAgICAgaWYgKGZpZWxkRm9ybWF0dGVkVmFsdWVzICYmIHRoaXMuZGF0YS5jb21iKSB7XG4gICAgICAgIGZpZWxkRm9ybWF0dGVkVmFsdWVzID0gZmllbGRGb3JtYXR0ZWRWYWx1ZXMucmVwbGFjZUFsbCgvXFxzKy9nLCBcIlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnREYXRhID0ge1xuICAgICAgICB1c2VyVmFsdWU6IHRleHRDb250ZW50LFxuICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogZmllbGRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgICAgIGxhc3RDb21taXR0ZWRWYWx1ZTogbnVsbCxcbiAgICAgICAgY29tbWl0S2V5OiAxLFxuICAgICAgICBmb2N1c2VkOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmRhdGEubXVsdGlMaW5lKSB7XG4gICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBmaWVsZEZvcm1hdHRlZFZhbHVlcyA/PyB0ZXh0Q29udGVudDtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5kb05vdFNjcm9sbCkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gXCJoaWRkZW5cIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgZWxlbWVudC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgZmllbGRGb3JtYXR0ZWRWYWx1ZXMgPz8gdGV4dENvbnRlbnQpO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmRvTm90U2Nyb2xsKSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBcImhpZGRlblwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kYXRhLmhhc093bkNhbnZhcykge1xuICAgICAgICBlbGVtZW50LmhpZGRlbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBHZXRFbGVtZW50c0J5TmFtZVNldC5hZGQoZWxlbWVudCk7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBpZCk7XG4gICAgICBlbGVtZW50LmRpc2FibGVkID0gdGhpcy5kYXRhLnJlYWRPbmx5O1xuICAgICAgZWxlbWVudC5uYW1lID0gdGhpcy5kYXRhLmZpZWxkTmFtZTtcbiAgICAgIGVsZW1lbnQudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcbiAgICAgIHRoaXMuX3NldFJlcXVpcmVkKGVsZW1lbnQsIHRoaXMuZGF0YS5yZXF1aXJlZCk7XG4gICAgICBpZiAobWF4TGVuKSB7XG4gICAgICAgIGVsZW1lbnQubWF4TGVuZ3RoID0gbWF4TGVuO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgdmFsdWU6IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eU9uU2libGluZ3MoZWxlbWVudCwgXCJ2YWx1ZVwiLCBldmVudC50YXJnZXQudmFsdWUsIFwidmFsdWVcIik7XG4gICAgICAgIGVsZW1lbnREYXRhLmZvcm1hdHRlZFZhbHVlID0gbnVsbDtcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwicmVzZXRmb3JtXCIsIGV2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlID8/IFwiXCI7XG4gICAgICAgIGVsZW1lbnQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIGVsZW1lbnREYXRhLmZvcm1hdHRlZFZhbHVlID0gbnVsbDtcbiAgICAgIH0pO1xuICAgICAgbGV0IGJsdXJMaXN0ZW5lciA9IGV2ZW50ID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGZvcm1hdHRlZFZhbHVlXG4gICAgICAgIH0gPSBlbGVtZW50RGF0YTtcbiAgICAgICAgaWYgKGZvcm1hdHRlZFZhbHVlICE9PSBudWxsICYmIGZvcm1hdHRlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC50YXJnZXQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZm9jdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB0YXJnZXRcbiAgICAgICAgICB9ID0gZXZlbnQ7XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnVzZXJWYWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnZhbHVlID0gZWxlbWVudERhdGEudXNlclZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50RGF0YS5sYXN0Q29tbWl0dGVkVmFsdWUgPSB0YXJnZXQudmFsdWU7XG4gICAgICAgICAgZWxlbWVudERhdGEuY29tbWl0S2V5ID0gMTtcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5hY3Rpb25zPy5Gb2N1cykge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZm9jdXNlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwganNFdmVudCA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93RWxlbWVudEFuZEhpZGVDYW52YXMoanNFdmVudC50YXJnZXQpO1xuICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSB7XG4gICAgICAgICAgICB2YWx1ZShldmVudCkge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS51c2VyVmFsdWUgPSBldmVudC5kZXRhaWwudmFsdWUgPz8gXCJcIjtcbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBlbGVtZW50RGF0YS51c2VyVmFsdWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZWxlbWVudERhdGEudXNlclZhbHVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlKGV2ZW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZVxuICAgICAgICAgICAgICB9ID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS5mb3JtYXR0ZWRWYWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgIT09IG51bGwgJiYgZm9ybWF0dGVkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBldmVudC50YXJnZXQgIT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VsUmFuZ2UoZXZlbnQpIHtcbiAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKC4uLmV2ZW50LmRldGFpbC5zZWxSYW5nZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hhckxpbWl0OiBldmVudCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBjaGFyTGltaXRcbiAgICAgICAgICAgICAgfSA9IGV2ZW50LmRldGFpbDtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgICAgICB9ID0gZXZlbnQ7XG4gICAgICAgICAgICAgIGlmIChjaGFyTGltaXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwibWF4TGVuZ3RoXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwibWF4TGVuZ3RoXCIsIGNoYXJMaW1pdCk7XG4gICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGVsZW1lbnREYXRhLnVzZXJWYWx1ZTtcbiAgICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPD0gY2hhckxpbWl0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgY2hhckxpbWl0KTtcbiAgICAgICAgICAgICAgdGFyZ2V0LnZhbHVlID0gZWxlbWVudERhdGEudXNlclZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgIHdpbGxDb21taXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBjb21taXRLZXk6IDEsXG4gICAgICAgICAgICAgICAgICBzZWxTdGFydDogdGFyZ2V0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgc2VsRW5kOiB0YXJnZXQuc2VsZWN0aW9uRW5kXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChhY3Rpb25zLCBqc0V2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZXZlbnQgPT4ge1xuICAgICAgICAgIGVsZW1lbnREYXRhLmNvbW1pdEtleSA9IDE7XG4gICAgICAgICAgbGV0IGNvbW1pdEtleSA9IC0xO1xuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgICAgIGNvbW1pdEtleSA9IDA7XG4gICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IFwiRW50ZXJcIiAmJiAhdGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgICAgICAgY29tbWl0S2V5ID0gMjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIikge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuY29tbWl0S2V5ID0gMztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbW1pdEtleSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5sYXN0Q29tbWl0dGVkVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICB3aWxsQ29tbWl0OiB0cnVlLFxuICAgICAgICAgICAgICBjb21taXRLZXksXG4gICAgICAgICAgICAgIHNlbFN0YXJ0OiBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgIHNlbEVuZDogZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgX2JsdXJMaXN0ZW5lciA9IGJsdXJMaXN0ZW5lcjtcbiAgICAgICAgYmx1ckxpc3RlbmVyID0gbnVsbDtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS5mb2N1c2VkIHx8ICFldmVudC5yZWxhdGVkVGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy5kYXRhLmFjdGlvbnM/LkJsdXIpIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgIGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5sYXN0Q29tbWl0dGVkVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgd2lsbENvbW1pdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb21taXRLZXk6IGVsZW1lbnREYXRhLmNvbW1pdEtleSxcbiAgICAgICAgICAgICAgICBzZWxTdGFydDogZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICAgICAgIHNlbEVuZDogZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2JsdXJMaXN0ZW5lcihldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmFjdGlvbnM/LktleXN0cm9rZSkge1xuICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgICAgfSA9IGV2ZW50O1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgIHNlbGVjdGlvbkVuZFxuICAgICAgICAgICAgfSA9IHRhcmdldDtcbiAgICAgICAgICAgIGxldCBzZWxTdGFydCA9IHNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICAgICBzZWxFbmQgPSBzZWxlY3Rpb25FbmQ7XG4gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmlucHV0VHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlV29yZEJhY2t3YXJkXCI6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5zdWJzdHJpbmcoMCwgc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9cXHcqW15cXHddKiQvKTtcbiAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxTdGFydCAtPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVXb3JkRm9yd2FyZFwiOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdmFsdWUuc3Vic3RyaW5nKHNlbGVjdGlvblN0YXJ0KS5tYXRjaCgvXlteXFx3XSpcXHcqLyk7XG4gICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsRW5kICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZUNvbnRlbnRCYWNrd2FyZFwiOlxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA9PT0gc2VsZWN0aW9uRW5kKSB7XG4gICAgICAgICAgICAgICAgICBzZWxTdGFydCAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID09PSBzZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgICAgICAgICAgIHNlbEVuZCArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgY2hhbmdlOiBkYXRhIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgd2lsbENvbW1pdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VsU3RhcnQsXG4gICAgICAgICAgICAgICAgc2VsRW5kXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIGVsZW1lbnREYXRhLCBbW1wiZm9jdXNcIiwgXCJGb2N1c1wiXSwgW1wiYmx1clwiLCBcIkJsdXJcIl0sIFtcIm1vdXNlZG93blwiLCBcIk1vdXNlIERvd25cIl0sIFtcIm1vdXNlZW50ZXJcIiwgXCJNb3VzZSBFbnRlclwiXSwgW1wibW91c2VsZWF2ZVwiLCBcIk1vdXNlIEV4aXRcIl0sIFtcIm1vdXNldXBcIiwgXCJNb3VzZSBVcFwiXV0sIGV2ZW50ID0+IGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoYmx1ckxpc3RlbmVyKSB7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgYmx1ckxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRhdGEuY29tYikge1xuICAgICAgICBjb25zdCBmaWVsZFdpZHRoID0gdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXTtcbiAgICAgICAgY29uc3QgY29tYldpZHRoID0gZmllbGRXaWR0aCAvIG1heExlbjtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiY29tYlwiKTtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZXR0ZXJTcGFjaW5nID0gYGNhbGMoJHtjb21iV2lkdGh9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpIC0gMWNoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuZGF0YS5maWVsZFZhbHVlO1xuICAgICAgZWxlbWVudC5zdHlsZS52ZXJ0aWNhbEFsaWduID0gXCJtaWRkbGVcIjtcbiAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwidGFibGUtY2VsbFwiO1xuICAgICAgaWYgKHRoaXMuZGF0YS5oYXNPd25DYW52YXMpIHtcbiAgICAgICAgZWxlbWVudC5oaWRkZW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zZXRUZXh0U3R5bGUoZWxlbWVudCk7XG4gICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKGVsZW1lbnQpO1xuICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGVsZW1lbnQpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChlbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFNpZ25hdHVyZVdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiAhIXBhcmFtZXRlcnMuZGF0YS5oYXNPd25DYW52YXNcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogcGFyYW1ldGVycy5yZW5kZXJGb3Jtc1xuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IGlkID0gZGF0YS5pZDtcbiAgICBsZXQgdmFsdWUgPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG4gICAgICB2YWx1ZTogZGF0YS5leHBvcnRWYWx1ZSA9PT0gZGF0YS5maWVsZFZhbHVlXG4gICAgfSkudmFsdWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFsdWUgPSB2YWx1ZSAhPT0gXCJPZmZcIjtcbiAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvblwiLCBcImNoZWNrQm94XCIpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgR2V0RWxlbWVudHNCeU5hbWVTZXQuYWRkKGVsZW1lbnQpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGlkKTtcbiAgICBlbGVtZW50LmRpc2FibGVkID0gZGF0YS5yZWFkT25seTtcbiAgICB0aGlzLl9zZXRSZXF1aXJlZChlbGVtZW50LCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuICAgIGVsZW1lbnQudHlwZSA9IFwiY2hlY2tib3hcIjtcbiAgICBlbGVtZW50Lm5hbWUgPSBkYXRhLmZpZWxkTmFtZTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB0cnVlKTtcbiAgICB9XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJleHBvcnRWYWx1ZVwiLCBkYXRhLmV4cG9ydFZhbHVlKTtcbiAgICBlbGVtZW50LnRhYkluZGV4ID0gREVGQVVMVF9UQUJfSU5ERVg7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgY2hlY2tlZFxuICAgICAgfSA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGZvciAoY29uc3QgY2hlY2tib3ggb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUobmFtZSwgaWQpKSB7XG4gICAgICAgIGNvbnN0IGN1ckNoZWNrZWQgPSBjaGVja2VkICYmIGNoZWNrYm94LmV4cG9ydFZhbHVlID09PSBkYXRhLmV4cG9ydFZhbHVlO1xuICAgICAgICBpZiAoY2hlY2tib3guZG9tRWxlbWVudCkge1xuICAgICAgICAgIGNoZWNrYm94LmRvbUVsZW1lbnQuY2hlY2tlZCA9IGN1ckNoZWNrZWQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShjaGVja2JveC5pZCwge1xuICAgICAgICAgIHZhbHVlOiBjdXJDaGVja2VkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZTogY2hlY2tlZFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwicmVzZXRmb3JtXCIsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgfHwgXCJPZmZcIjtcbiAgICAgIGV2ZW50LnRhcmdldC5jaGVja2VkID0gZGVmYXVsdFZhbHVlID09PSBkYXRhLmV4cG9ydFZhbHVlO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwganNFdmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSB7XG4gICAgICAgICAgdmFsdWUoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC5jaGVja2VkID0gZXZlbnQuZGV0YWlsLnZhbHVlICE9PSBcIk9mZlwiO1xuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LmNoZWNrZWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGFjdGlvbnMsIGpzRXZlbnQpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVycyhlbGVtZW50LCBudWxsLCBbW1wiY2hhbmdlXCIsIFwiVmFsaWRhdGVcIl0sIFtcImNoYW5nZVwiLCBcIkFjdGlvblwiXSwgW1wiZm9jdXNcIiwgXCJGb2N1c1wiXSwgW1wiYmx1clwiLCBcIkJsdXJcIl0sIFtcIm1vdXNlZG93blwiLCBcIk1vdXNlIERvd25cIl0sIFtcIm1vdXNlZW50ZXJcIiwgXCJNb3VzZSBFbnRlclwiXSwgW1wibW91c2VsZWF2ZVwiLCBcIk1vdXNlIEV4aXRcIl0sIFtcIm1vdXNldXBcIiwgXCJNb3VzZSBVcFwiXV0sIGV2ZW50ID0+IGV2ZW50LnRhcmdldC5jaGVja2VkKTtcbiAgICB9XG4gICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKGVsZW1lbnQpO1xuICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGVsZW1lbnQpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChlbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHBhcmFtZXRlcnMucmVuZGVyRm9ybXNcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImJ1dHRvbldpZGdldEFubm90YXRpb25cIiwgXCJyYWRpb0J1dHRvblwiKTtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IGlkID0gZGF0YS5pZDtcbiAgICBsZXQgdmFsdWUgPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG4gICAgICB2YWx1ZTogZGF0YS5maWVsZFZhbHVlID09PSBkYXRhLmJ1dHRvblZhbHVlXG4gICAgfSkudmFsdWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFsdWUgPSB2YWx1ZSAhPT0gZGF0YS5idXR0b25WYWx1ZTtcbiAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGZvciAoY29uc3QgcmFkaW8gb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoZGF0YS5maWVsZE5hbWUsIGlkKSkge1xuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKHJhZGlvLmlkLCB7XG4gICAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgIEdldEVsZW1lbnRzQnlOYW1lU2V0LmFkZChlbGVtZW50KTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBpZCk7XG4gICAgZWxlbWVudC5kaXNhYmxlZCA9IGRhdGEucmVhZE9ubHk7XG4gICAgdGhpcy5fc2V0UmVxdWlyZWQoZWxlbWVudCwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICBlbGVtZW50LnR5cGUgPSBcInJhZGlvXCI7XG4gICAgZWxlbWVudC5uYW1lID0gZGF0YS5maWVsZE5hbWU7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgdHJ1ZSk7XG4gICAgfVxuICAgIGVsZW1lbnQudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZXZlbnQgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lLFxuICAgICAgICBjaGVja2VkXG4gICAgICB9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgZm9yIChjb25zdCByYWRpbyBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShuYW1lLCBpZCkpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShyYWRpby5pZCwge1xuICAgICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgdmFsdWU6IGNoZWNrZWRcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkYXRhLmRlZmF1bHRGaWVsZFZhbHVlO1xuICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWQgPSBkZWZhdWx0VmFsdWUgIT09IG51bGwgJiYgZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgZGVmYXVsdFZhbHVlID09PSBkYXRhLmJ1dHRvblZhbHVlO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgY29uc3QgcGRmQnV0dG9uVmFsdWUgPSBkYXRhLmJ1dHRvblZhbHVlO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwganNFdmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSB7XG4gICAgICAgICAgdmFsdWU6IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSBwZGZCdXR0b25WYWx1ZSA9PT0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgICAgICAgICAgZm9yIChjb25zdCByYWRpbyBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShldmVudC50YXJnZXQubmFtZSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgY3VyQ2hlY2tlZCA9IGNoZWNrZWQgJiYgcmFkaW8uaWQgPT09IGlkO1xuICAgICAgICAgICAgICBpZiAocmFkaW8uZG9tRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJhZGlvLmRvbUVsZW1lbnQuY2hlY2tlZCA9IGN1ckNoZWNrZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShyYWRpby5pZCwge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBjdXJDaGVja2VkXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGFjdGlvbnMsIGpzRXZlbnQpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVycyhlbGVtZW50LCBudWxsLCBbW1wiY2hhbmdlXCIsIFwiVmFsaWRhdGVcIl0sIFtcImNoYW5nZVwiLCBcIkFjdGlvblwiXSwgW1wiZm9jdXNcIiwgXCJGb2N1c1wiXSwgW1wiYmx1clwiLCBcIkJsdXJcIl0sIFtcIm1vdXNlZG93blwiLCBcIk1vdXNlIERvd25cIl0sIFtcIm1vdXNlZW50ZXJcIiwgXCJNb3VzZSBFbnRlclwiXSwgW1wibW91c2VsZWF2ZVwiLCBcIk1vdXNlIEV4aXRcIl0sIFtcIm1vdXNldXBcIiwgXCJNb3VzZSBVcFwiXV0sIGV2ZW50ID0+IGV2ZW50LnRhcmdldC5jaGVja2VkKTtcbiAgICB9XG4gICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKGVsZW1lbnQpO1xuICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGVsZW1lbnQpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChlbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIExpbmtBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpZ25vcmVCb3JkZXI6IHBhcmFtZXRlcnMuZGF0YS5oYXNBcHBlYXJhbmNlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHN1cGVyLnJlbmRlcigpO1xuICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvblwiLCBcInB1c2hCdXR0b25cIik7XG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBjb250YWluZXIubGFzdENoaWxkO1xuICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucyAmJiBsaW5rRWxlbWVudCkge1xuICAgICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMobGlua0VsZW1lbnQpO1xuICAgICAgbGlua0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGpzRXZlbnQgPT4ge1xuICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goe30sIGpzRXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjaG9pY2VXaWRnZXRBbm5vdGF0aW9uXCIpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhLmlkO1xuICAgIGNvbnN0IHN0b3JlZERhdGEgPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG4gICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWVcbiAgICB9KTtcbiAgICBjb25zdCBzZWxlY3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcbiAgICBHZXRFbGVtZW50c0J5TmFtZVNldC5hZGQoc2VsZWN0RWxlbWVudCk7XG4gICAgc2VsZWN0RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgaWQpO1xuICAgIHNlbGVjdEVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgdGhpcy5fc2V0UmVxdWlyZWQoc2VsZWN0RWxlbWVudCwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICBzZWxlY3RFbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgIHNlbGVjdEVsZW1lbnQudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcbiAgICBsZXQgYWRkQW5FbXB0eUVudHJ5ID0gdGhpcy5kYXRhLmNvbWJvICYmIHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aCA+IDA7XG4gICAgaWYgKCF0aGlzLmRhdGEuY29tYm8pIHtcbiAgICAgIHNlbGVjdEVsZW1lbnQuc2l6ZSA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDtcbiAgICAgIGlmICh0aGlzLmRhdGEubXVsdGlTZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0RWxlbWVudC5tdWx0aXBsZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWU7XG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBzZWxlY3RFbGVtZW50Lm9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gb3B0aW9uLnZhbHVlID09PSBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5kYXRhLm9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbi5kaXNwbGF5VmFsdWU7XG4gICAgICBvcHRpb25FbGVtZW50LnZhbHVlID0gb3B0aW9uLmV4cG9ydFZhbHVlO1xuICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUuaW5jbHVkZXMob3B0aW9uLmV4cG9ydFZhbHVlKSkge1xuICAgICAgICBvcHRpb25FbGVtZW50LnNldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIsIHRydWUpO1xuICAgICAgICBhZGRBbkVtcHR5RW50cnkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kKG9wdGlvbkVsZW1lbnQpO1xuICAgIH1cbiAgICBsZXQgcmVtb3ZlRW1wdHlFbnRyeSA9IG51bGw7XG4gICAgaWYgKGFkZEFuRW1wdHlFbnRyeSkge1xuICAgICAgY29uc3Qgbm9uZU9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgbm9uZU9wdGlvbkVsZW1lbnQudmFsdWUgPSBcIiBcIjtcbiAgICAgIG5vbmVPcHRpb25FbGVtZW50LnNldEF0dHJpYnV0ZShcImhpZGRlblwiLCB0cnVlKTtcbiAgICAgIG5vbmVPcHRpb25FbGVtZW50LnNldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIsIHRydWUpO1xuICAgICAgc2VsZWN0RWxlbWVudC5wcmVwZW5kKG5vbmVPcHRpb25FbGVtZW50KTtcbiAgICAgIHJlbW92ZUVtcHR5RW50cnkgPSAoKSA9PiB7XG4gICAgICAgIG5vbmVPcHRpb25FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICBzZWxlY3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCByZW1vdmVFbXB0eUVudHJ5KTtcbiAgICAgICAgcmVtb3ZlRW1wdHlFbnRyeSA9IG51bGw7XG4gICAgICB9O1xuICAgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgcmVtb3ZlRW1wdHlFbnRyeSk7XG4gICAgfVxuICAgIGNvbnN0IGdldFZhbHVlID0gaXNFeHBvcnQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGlzRXhwb3J0ID8gXCJ2YWx1ZVwiIDogXCJ0ZXh0Q29udGVudFwiO1xuICAgICAgY29uc3Qge1xuICAgICAgICBvcHRpb25zLFxuICAgICAgICBtdWx0aXBsZVxuICAgICAgfSA9IHNlbGVjdEVsZW1lbnQ7XG4gICAgICBpZiAoIW11bHRpcGxlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnNlbGVjdGVkSW5kZXggPT09IC0xID8gbnVsbCA6IG9wdGlvbnNbb3B0aW9ucy5zZWxlY3RlZEluZGV4XVtuYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwob3B0aW9ucywgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCkubWFwKG9wdGlvbiA9PiBvcHRpb25bbmFtZV0pO1xuICAgIH07XG4gICAgbGV0IHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgIGNvbnN0IGdldEl0ZW1zID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGV2ZW50LnRhcmdldC5vcHRpb25zO1xuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChvcHRpb25zLCBvcHRpb24gPT4gKHtcbiAgICAgICAgZGlzcGxheVZhbHVlOiBvcHRpb24udGV4dENvbnRlbnQsXG4gICAgICAgIGV4cG9ydFZhbHVlOiBvcHRpb24udmFsdWVcbiAgICAgIH0pKTtcbiAgICB9O1xuICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwganNFdmVudCA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSB7XG4gICAgICAgICAgdmFsdWUoZXZlbnQpIHtcbiAgICAgICAgICAgIHJlbW92ZUVtcHR5RW50cnk/LigpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBldmVudC5kZXRhaWwudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBuZXcgU2V0KEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHNlbGVjdEVsZW1lbnQub3B0aW9ucykge1xuICAgICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB2YWx1ZXMuaGFzKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSh0cnVlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG11bHRpcGxlU2VsZWN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBzZWxlY3RFbGVtZW50Lm11bHRpcGxlID0gdHJ1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlbW92ZShldmVudCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHNlbGVjdEVsZW1lbnQub3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZXZlbnQuZGV0YWlsLnJlbW92ZTtcbiAgICAgICAgICAgIG9wdGlvbnNbaW5kZXhdLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBzZWxlY3RFbGVtZW50LnJlbW92ZShpbmRleCk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGkgPSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4LmNhbGwob3B0aW9ucywgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgICAgICAgICAgIGlmIChpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSh0cnVlKSxcbiAgICAgICAgICAgICAgaXRlbXM6IGdldEl0ZW1zKGV2ZW50KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsZWFyKGV2ZW50KSB7XG4gICAgICAgICAgICB3aGlsZSAoc2VsZWN0RWxlbWVudC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5yZW1vdmUoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICBpdGVtczogW11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbnNlcnQoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSxcbiAgICAgICAgICAgICAgZXhwb3J0VmFsdWVcbiAgICAgICAgICAgIH0gPSBldmVudC5kZXRhaWwuaW5zZXJ0O1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0Q2hpbGQgPSBzZWxlY3RFbGVtZW50LmNoaWxkcmVuW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IGRpc3BsYXlWYWx1ZTtcbiAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQudmFsdWUgPSBleHBvcnRWYWx1ZTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RDaGlsZCkge1xuICAgICAgICAgICAgICBzZWxlY3RDaGlsZC5iZWZvcmUob3B0aW9uRWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LmFwcGVuZChvcHRpb25FbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpLFxuICAgICAgICAgICAgICBpdGVtczogZ2V0SXRlbXMoZXZlbnQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaXRlbXMoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgaXRlbXNcbiAgICAgICAgICAgIH0gPSBldmVudC5kZXRhaWw7XG4gICAgICAgICAgICB3aGlsZSAoc2VsZWN0RWxlbWVudC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5yZW1vdmUoMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSxcbiAgICAgICAgICAgICAgICBleHBvcnRWYWx1ZVxuICAgICAgICAgICAgICB9ID0gaXRlbTtcbiAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQudGV4dENvbnRlbnQgPSBkaXNwbGF5VmFsdWU7XG4gICAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQudmFsdWUgPSBleHBvcnRWYWx1ZTtcbiAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5hcHBlbmQob3B0aW9uRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VsZWN0RWxlbWVudC5vcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5vcHRpb25zWzBdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpLFxuICAgICAgICAgICAgICBpdGVtczogZ2V0SXRlbXMoZXZlbnQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5kaWNlcyhldmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5kaWNlcyA9IG5ldyBTZXQoZXZlbnQuZGV0YWlsLmluZGljZXMpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZXZlbnQudGFyZ2V0Lm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gaW5kaWNlcy5oYXMob3B0aW9uLmluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZWRpdGFibGUoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC5kaXNhYmxlZCA9ICFldmVudC5kZXRhaWwuZWRpdGFibGU7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCk7XG4gICAgICB9KTtcbiAgICAgIHNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgZXhwb3J0VmFsdWUgPSBnZXRWYWx1ZSh0cnVlKTtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgdmFsdWU6IGV4cG9ydFZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFZhbHVlcyxcbiAgICAgICAgICAgIGNoYW5nZSxcbiAgICAgICAgICAgIGNoYW5nZUV4OiBleHBvcnRWYWx1ZSxcbiAgICAgICAgICAgIHdpbGxDb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgY29tbWl0S2V5OiAxLFxuICAgICAgICAgICAga2V5RG93bjogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVycyhzZWxlY3RFbGVtZW50LCBudWxsLCBbW1wiZm9jdXNcIiwgXCJGb2N1c1wiXSwgW1wiYmx1clwiLCBcIkJsdXJcIl0sIFtcIm1vdXNlZG93blwiLCBcIk1vdXNlIERvd25cIl0sIFtcIm1vdXNlZW50ZXJcIiwgXCJNb3VzZSBFbnRlclwiXSwgW1wibW91c2VsZWF2ZVwiLCBcIk1vdXNlIEV4aXRcIl0sIFtcIm1vdXNldXBcIiwgXCJNb3VzZSBVcFwiXSwgW1wiaW5wdXRcIiwgXCJBY3Rpb25cIl0sIFtcImlucHV0XCIsIFwiVmFsaWRhdGVcIl1dLCBldmVudCA9PiBldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSh0cnVlKVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhLmNvbWJvKSB7XG4gICAgICB0aGlzLl9zZXRUZXh0U3R5bGUoc2VsZWN0RWxlbWVudCk7XG4gICAgfSBlbHNlIHt9XG4gICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKHNlbGVjdEVsZW1lbnQpO1xuICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKHNlbGVjdEVsZW1lbnQpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzZWxlY3RFbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBkYXRhLFxuICAgICAgZWxlbWVudHNcbiAgICB9ID0gcGFyYW1ldGVycztcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IEFubm90YXRpb25FbGVtZW50Ll9oYXNQb3B1cERhdGEoZGF0YSlcbiAgICB9KTtcbiAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgdGhpcy5wb3B1cCA9IG51bGw7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJwb3B1cEFubm90YXRpb25cIik7XG4gICAgY29uc3QgcG9wdXAgPSB0aGlzLnBvcHVwID0gbmV3IFBvcHVwRWxlbWVudCh7XG4gICAgICBjb250YWluZXI6IHRoaXMuY29udGFpbmVyLFxuICAgICAgY29sb3I6IHRoaXMuZGF0YS5jb2xvcixcbiAgICAgIHRpdGxlT2JqOiB0aGlzLmRhdGEudGl0bGVPYmosXG4gICAgICBtb2RpZmljYXRpb25EYXRlOiB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSxcbiAgICAgIGNvbnRlbnRzT2JqOiB0aGlzLmRhdGEuY29udGVudHNPYmosXG4gICAgICByaWNoVGV4dDogdGhpcy5kYXRhLnJpY2hUZXh0LFxuICAgICAgcmVjdDogdGhpcy5kYXRhLnJlY3QsXG4gICAgICBwYXJlbnRSZWN0OiB0aGlzLmRhdGEucGFyZW50UmVjdCB8fCBudWxsLFxuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGVsZW1lbnRzOiB0aGlzLmVsZW1lbnRzLFxuICAgICAgb3BlbjogdGhpcy5kYXRhLm9wZW5cbiAgICB9KTtcbiAgICBjb25zdCBlbGVtZW50SWRzID0gW107XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgIGVsZW1lbnQucG9wdXAgPSBwb3B1cDtcbiAgICAgIGVsZW1lbnRJZHMucHVzaChlbGVtZW50LmRhdGEuaWQpO1xuICAgICAgZWxlbWVudC5hZGRIaWdobGlnaHRBcmVhKCk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIiwgZWxlbWVudElkcy5tYXAoaWQgPT4gYCR7QW5ub3RhdGlvblByZWZpeH0ke2lkfWApLmpvaW4oXCIsXCIpKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFBvcHVwRWxlbWVudCB7XG4gICNib3VuZEtleURvd24gPSB0aGlzLiNrZXlEb3duLmJpbmQodGhpcyk7XG4gICNib3VuZEhpZGUgPSB0aGlzLiNoaWRlLmJpbmQodGhpcyk7XG4gICNib3VuZFNob3cgPSB0aGlzLiNzaG93LmJpbmQodGhpcyk7XG4gICNib3VuZFRvZ2dsZSA9IHRoaXMuI3RvZ2dsZS5iaW5kKHRoaXMpO1xuICAjY29sb3IgPSBudWxsO1xuICAjY29udGFpbmVyID0gbnVsbDtcbiAgI2NvbnRlbnRzT2JqID0gbnVsbDtcbiAgI2RhdGVPYmogPSBudWxsO1xuICAjZWxlbWVudHMgPSBudWxsO1xuICAjcGFyZW50ID0gbnVsbDtcbiAgI3BhcmVudFJlY3QgPSBudWxsO1xuICAjcGlubmVkID0gZmFsc2U7XG4gICNwb3B1cCA9IG51bGw7XG4gICNwb3NpdGlvbiA9IG51bGw7XG4gICNyZWN0ID0gbnVsbDtcbiAgI3JpY2hUZXh0ID0gbnVsbDtcbiAgI3RpdGxlT2JqID0gbnVsbDtcbiAgI3VwZGF0ZXMgPSBudWxsO1xuICAjd2FzVmlzaWJsZSA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgY29udGFpbmVyLFxuICAgIGNvbG9yLFxuICAgIGVsZW1lbnRzLFxuICAgIHRpdGxlT2JqLFxuICAgIG1vZGlmaWNhdGlvbkRhdGUsXG4gICAgY29udGVudHNPYmosXG4gICAgcmljaFRleHQsXG4gICAgcGFyZW50LFxuICAgIHJlY3QsXG4gICAgcGFyZW50UmVjdCxcbiAgICBvcGVuXG4gIH0pIHtcbiAgICB0aGlzLiNjb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy4jdGl0bGVPYmogPSB0aXRsZU9iajtcbiAgICB0aGlzLiNjb250ZW50c09iaiA9IGNvbnRlbnRzT2JqO1xuICAgIHRoaXMuI3JpY2hUZXh0ID0gcmljaFRleHQ7XG4gICAgdGhpcy4jcGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMuI2NvbG9yID0gY29sb3I7XG4gICAgdGhpcy4jcmVjdCA9IHJlY3Q7XG4gICAgdGhpcy4jcGFyZW50UmVjdCA9IHBhcmVudFJlY3Q7XG4gICAgdGhpcy4jZWxlbWVudHMgPSBlbGVtZW50cztcbiAgICB0aGlzLiNkYXRlT2JqID0gUERGRGF0ZVN0cmluZy50b0RhdGVPYmplY3QobW9kaWZpY2F0aW9uRGF0ZSk7XG4gICAgdGhpcy50cmlnZ2VyID0gZWxlbWVudHMuZmxhdE1hcChlID0+IGUuZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpKTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy50cmlnZ2VyKSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLiNib3VuZFRvZ2dsZSk7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIHRoaXMuI2JvdW5kU2hvdyk7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIHRoaXMuI2JvdW5kSGlkZSk7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJwb3B1cFRyaWdnZXJBcmVhXCIpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgIGVsZW1lbnQuY29udGFpbmVyPy5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleURvd24pO1xuICAgIH1cbiAgICB0aGlzLiNjb250YWluZXIuaGlkZGVuID0gdHJ1ZTtcbiAgICBpZiAob3Blbikge1xuICAgICAgdGhpcy4jdG9nZ2xlKCk7XG4gICAgfVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy4jcG9wdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcG9wdXAgPSB0aGlzLiNwb3B1cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgcG9wdXAuY2xhc3NOYW1lID0gXCJwb3B1cFwiO1xuICAgIGlmICh0aGlzLiNjb2xvcikge1xuICAgICAgY29uc3QgYmFzZUNvbG9yID0gcG9wdXAuc3R5bGUub3V0bGluZUNvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoLi4udGhpcy4jY29sb3IpO1xuICAgICAgaWYgKENTUy5zdXBwb3J0cyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJjb2xvci1taXgoaW4gc3JnYiwgcmVkIDMwJSwgd2hpdGUpXCIpKSB7XG4gICAgICAgIHBvcHVwLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGBjb2xvci1taXgoaW4gc3JnYiwgJHtiYXNlQ29sb3J9IDMwJSwgd2hpdGUpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IEJBQ0tHUk9VTkRfRU5MSUdIVCA9IDAuNztcbiAgICAgICAgcG9wdXAuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoLi4udGhpcy4jY29sb3IubWFwKGMgPT4gTWF0aC5mbG9vcihCQUNLR1JPVU5EX0VOTElHSFQgKiAoMjU1IC0gYykgKyBjKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBoZWFkZXIuY2xhc3NOYW1lID0gXCJoZWFkZXJcIjtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoMVwiKTtcbiAgICBoZWFkZXIuYXBwZW5kKHRpdGxlKTtcbiAgICAoe1xuICAgICAgZGlyOiB0aXRsZS5kaXIsXG4gICAgICBzdHI6IHRpdGxlLnRleHRDb250ZW50XG4gICAgfSA9IHRoaXMuI3RpdGxlT2JqKTtcbiAgICBwb3B1cC5hcHBlbmQoaGVhZGVyKTtcbiAgICBpZiAodGhpcy4jZGF0ZU9iaikge1xuICAgICAgY29uc3QgbW9kaWZpY2F0aW9uRGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5jbGFzc0xpc3QuYWRkKFwicG9wdXBEYXRlXCIpO1xuICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1hbm5vdGF0aW9uLWRhdGUtc3RyaW5nXCIpO1xuICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4tYXJnc1wiLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGRhdGU6IHRoaXMuI2RhdGVPYmoudG9Mb2NhbGVEYXRlU3RyaW5nKCksXG4gICAgICAgIHRpbWU6IHRoaXMuI2RhdGVPYmoudG9Mb2NhbGVUaW1lU3RyaW5nKClcbiAgICAgIH0pKTtcbiAgICAgIGhlYWRlci5hcHBlbmQobW9kaWZpY2F0aW9uRGF0ZSk7XG4gICAgfVxuICAgIGNvbnN0IGh0bWwgPSB0aGlzLiNodG1sO1xuICAgIGlmIChodG1sKSB7XG4gICAgICBYZmFMYXllci5yZW5kZXIoe1xuICAgICAgICB4ZmFIdG1sOiBodG1sLFxuICAgICAgICBpbnRlbnQ6IFwicmljaFRleHRcIixcbiAgICAgICAgZGl2OiBwb3B1cFxuICAgICAgfSk7XG4gICAgICBwb3B1cC5sYXN0Q2hpbGQuY2xhc3NMaXN0LmFkZChcInJpY2hUZXh0XCIsIFwicG9wdXBDb250ZW50XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb250ZW50cyA9IHRoaXMuX2Zvcm1hdENvbnRlbnRzKHRoaXMuI2NvbnRlbnRzT2JqKTtcbiAgICAgIHBvcHVwLmFwcGVuZChjb250ZW50cyk7XG4gICAgfVxuICAgIHRoaXMuI2NvbnRhaW5lci5hcHBlbmQocG9wdXApO1xuICB9XG4gIGdldCAjaHRtbCgpIHtcbiAgICBjb25zdCByaWNoVGV4dCA9IHRoaXMuI3JpY2hUZXh0O1xuICAgIGNvbnN0IGNvbnRlbnRzT2JqID0gdGhpcy4jY29udGVudHNPYmo7XG4gICAgaWYgKHJpY2hUZXh0Py5zdHIgJiYgKCFjb250ZW50c09iaj8uc3RyIHx8IGNvbnRlbnRzT2JqLnN0ciA9PT0gcmljaFRleHQuc3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuI3JpY2hUZXh0Lmh0bWwgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0ICNmb250U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jaHRtbD8uYXR0cmlidXRlcz8uc3R5bGU/LmZvbnRTaXplIHx8IDA7XG4gIH1cbiAgZ2V0ICNmb250Q29sb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2h0bWw/LmF0dHJpYnV0ZXM/LnN0eWxlPy5jb2xvciB8fCBudWxsO1xuICB9XG4gICNtYWtlUG9wdXBDb250ZW50KHRleHQpIHtcbiAgICBjb25zdCBwb3B1cExpbmVzID0gW107XG4gICAgY29uc3QgcG9wdXBDb250ZW50ID0ge1xuICAgICAgc3RyOiB0ZXh0LFxuICAgICAgaHRtbDoge1xuICAgICAgICBuYW1lOiBcImRpdlwiLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgZGlyOiBcImF1dG9cIlxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogW3tcbiAgICAgICAgICBuYW1lOiBcInBcIixcbiAgICAgICAgICBjaGlsZHJlbjogcG9wdXBMaW5lc1xuICAgICAgICB9XVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgbGluZUF0dHJpYnV0ZXMgPSB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBjb2xvcjogdGhpcy4jZm9udENvbG9yLFxuICAgICAgICBmb250U2l6ZTogdGhpcy4jZm9udFNpemUgPyBgY2FsYygke3RoaXMuI2ZvbnRTaXplfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgIDogXCJcIlxuICAgICAgfVxuICAgIH07XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHRleHQuc3BsaXQoXCJcXG5cIikpIHtcbiAgICAgIHBvcHVwTGluZXMucHVzaCh7XG4gICAgICAgIG5hbWU6IFwic3BhblwiLFxuICAgICAgICB2YWx1ZTogbGluZSxcbiAgICAgICAgYXR0cmlidXRlczogbGluZUF0dHJpYnV0ZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcG9wdXBDb250ZW50O1xuICB9XG4gIF9mb3JtYXRDb250ZW50cyh7XG4gICAgc3RyLFxuICAgIGRpclxuICB9KSB7XG4gICAgY29uc3QgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xuICAgIHAuY2xhc3NMaXN0LmFkZChcInBvcHVwQ29udGVudFwiKTtcbiAgICBwLmRpciA9IGRpcjtcbiAgICBjb25zdCBsaW5lcyA9IHN0ci5zcGxpdCgvKD86XFxyXFxuP3xcXG4pLyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgcC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGluZSkpO1xuICAgICAgaWYgKGkgPCBpaSAtIDEpIHtcbiAgICAgICAgcC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH1cbiAgI2tleURvd24oZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuYWx0S2V5IHx8IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIgfHwgZXZlbnQua2V5ID09PSBcIkVzY2FwZVwiICYmIHRoaXMuI3Bpbm5lZCkge1xuICAgICAgdGhpcy4jdG9nZ2xlKCk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZUVkaXRlZCh7XG4gICAgcmVjdCxcbiAgICBwb3B1cENvbnRlbnRcbiAgfSkge1xuICAgIHRoaXMuI3VwZGF0ZXMgfHw9IHtcbiAgICAgIGNvbnRlbnRzT2JqOiB0aGlzLiNjb250ZW50c09iaixcbiAgICAgIHJpY2hUZXh0OiB0aGlzLiNyaWNoVGV4dFxuICAgIH07XG4gICAgaWYgKHJlY3QpIHtcbiAgICAgIHRoaXMuI3Bvc2l0aW9uID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHBvcHVwQ29udGVudCkge1xuICAgICAgdGhpcy4jcmljaFRleHQgPSB0aGlzLiNtYWtlUG9wdXBDb250ZW50KHBvcHVwQ29udGVudCk7XG4gICAgICB0aGlzLiNjb250ZW50c09iaiA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuI3BvcHVwPy5yZW1vdmUoKTtcbiAgICB0aGlzLiNwb3B1cCA9IG51bGw7XG4gIH1cbiAgcmVzZXRFZGl0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLiN1cGRhdGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICh7XG4gICAgICBjb250ZW50c09iajogdGhpcy4jY29udGVudHNPYmosXG4gICAgICByaWNoVGV4dDogdGhpcy4jcmljaFRleHRcbiAgICB9ID0gdGhpcy4jdXBkYXRlcyk7XG4gICAgdGhpcy4jdXBkYXRlcyA9IG51bGw7XG4gICAgdGhpcy4jcG9wdXA/LnJlbW92ZSgpO1xuICAgIHRoaXMuI3BvcHVwID0gbnVsbDtcbiAgICB0aGlzLiNwb3NpdGlvbiA9IG51bGw7XG4gIH1cbiAgI3NldFBvc2l0aW9uKCkge1xuICAgIGlmICh0aGlzLiNwb3NpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBwYWdlOiB7XG4gICAgICAgIHZpZXdcbiAgICAgIH0sXG4gICAgICB2aWV3cG9ydDoge1xuICAgICAgICByYXdEaW1zOiB7XG4gICAgICAgICAgcGFnZVdpZHRoLFxuICAgICAgICAgIHBhZ2VIZWlnaHQsXG4gICAgICAgICAgcGFnZVgsXG4gICAgICAgICAgcGFnZVlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gPSB0aGlzLiNwYXJlbnQ7XG4gICAgbGV0IHVzZVBhcmVudFJlY3QgPSAhIXRoaXMuI3BhcmVudFJlY3Q7XG4gICAgbGV0IHJlY3QgPSB1c2VQYXJlbnRSZWN0ID8gdGhpcy4jcGFyZW50UmVjdCA6IHRoaXMuI3JlY3Q7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuI2VsZW1lbnRzKSB7XG4gICAgICBpZiAoIXJlY3QgfHwgVXRpbC5pbnRlcnNlY3QoZWxlbWVudC5kYXRhLnJlY3QsIHJlY3QpICE9PSBudWxsKSB7XG4gICAgICAgIHJlY3QgPSBlbGVtZW50LmRhdGEucmVjdDtcbiAgICAgICAgdXNlUGFyZW50UmVjdCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkUmVjdCA9IFV0aWwubm9ybWFsaXplUmVjdChbcmVjdFswXSwgdmlld1szXSAtIHJlY3RbMV0gKyB2aWV3WzFdLCByZWN0WzJdLCB2aWV3WzNdIC0gcmVjdFszXSArIHZpZXdbMV1dKTtcbiAgICBjb25zdCBIT1JJWk9OVEFMX1NQQUNFX0FGVEVSX0FOTk9UQVRJT04gPSA1O1xuICAgIGNvbnN0IHBhcmVudFdpZHRoID0gdXNlUGFyZW50UmVjdCA/IHJlY3RbMl0gLSByZWN0WzBdICsgSE9SSVpPTlRBTF9TUEFDRV9BRlRFUl9BTk5PVEFUSU9OIDogMDtcbiAgICBjb25zdCBwb3B1cExlZnQgPSBub3JtYWxpemVkUmVjdFswXSArIHBhcmVudFdpZHRoO1xuICAgIGNvbnN0IHBvcHVwVG9wID0gbm9ybWFsaXplZFJlY3RbMV07XG4gICAgdGhpcy4jcG9zaXRpb24gPSBbMTAwICogKHBvcHVwTGVmdCAtIHBhZ2VYKSAvIHBhZ2VXaWR0aCwgMTAwICogKHBvcHVwVG9wIC0gcGFnZVkpIC8gcGFnZUhlaWdodF07XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy4jY29udGFpbmVyO1xuICAgIHN0eWxlLmxlZnQgPSBgJHt0aGlzLiNwb3NpdGlvblswXX0lYDtcbiAgICBzdHlsZS50b3AgPSBgJHt0aGlzLiNwb3NpdGlvblsxXX0lYDtcbiAgfVxuICAjdG9nZ2xlKCkge1xuICAgIHRoaXMuI3Bpbm5lZCA9ICF0aGlzLiNwaW5uZWQ7XG4gICAgaWYgKHRoaXMuI3Bpbm5lZCkge1xuICAgICAgdGhpcy4jc2hvdygpO1xuICAgICAgdGhpcy4jY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLiNib3VuZFRvZ2dsZSk7XG4gICAgICB0aGlzLiNjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlEb3duKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jaGlkZSgpO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLiNib3VuZFRvZ2dsZSk7XG4gICAgICB0aGlzLiNjb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlEb3duKTtcbiAgICB9XG4gIH1cbiAgI3Nob3coKSB7XG4gICAgaWYgKCF0aGlzLiNwb3B1cCkge1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgdGhpcy4jc2V0UG9zaXRpb24oKTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5oaWRkZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS56SW5kZXggPSBwYXJzZUludCh0aGlzLiNjb250YWluZXIuc3R5bGUuekluZGV4KSArIDEwMDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNwaW5uZWQpIHtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZm9jdXNlZFwiKTtcbiAgICB9XG4gIH1cbiAgI2hpZGUoKSB7XG4gICAgdGhpcy4jY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJmb2N1c2VkXCIpO1xuICAgIGlmICh0aGlzLiNwaW5uZWQgfHwgIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2NvbnRhaW5lci5oaWRkZW4gPSB0cnVlO1xuICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS56SW5kZXggPSBwYXJzZUludCh0aGlzLiNjb250YWluZXIuc3R5bGUuekluZGV4KSAtIDEwMDA7XG4gIH1cbiAgZm9yY2VIaWRlKCkge1xuICAgIHRoaXMuI3dhc1Zpc2libGUgPSB0aGlzLmlzVmlzaWJsZTtcbiAgICBpZiAoIXRoaXMuI3dhc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLmhpZGRlbiA9IHRydWU7XG4gIH1cbiAgbWF5YmVTaG93KCkge1xuICAgIGlmICghdGhpcy4jd2FzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI3BvcHVwKSB7XG4gICAgICB0aGlzLiNzaG93KCk7XG4gICAgfVxuICAgIHRoaXMuI3dhc1Zpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLiNjb250YWluZXIuaGlkZGVuID0gZmFsc2U7XG4gIH1cbiAgZ2V0IGlzVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jY29udGFpbmVyLmhpZGRlbiA9PT0gZmFsc2U7XG4gIH1cbn1cbmNsYXNzIEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gcGFyYW1ldGVycy5kYXRhLnRleHRDb250ZW50O1xuICAgIHRoaXMudGV4dFBvc2l0aW9uID0gcGFyYW1ldGVycy5kYXRhLnRleHRQb3NpdGlvbjtcbiAgICB0aGlzLmFubm90YXRpb25FZGl0b3JUeXBlID0gQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJmcmVlVGV4dEFubm90YXRpb25cIik7XG4gICAgaWYgKHRoaXMudGV4dENvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKFwiYW5ub3RhdGlvblRleHRDb250ZW50XCIpO1xuICAgICAgY29udGVudC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwiY29tbWVudFwiKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiB0aGlzLnRleHRDb250ZW50KSB7XG4gICAgICAgIGNvbnN0IGxpbmVTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIGxpbmVTcGFuLnRleHRDb250ZW50ID0gbGluZTtcbiAgICAgICAgY29udGVudC5hcHBlbmQobGluZVNwYW4pO1xuICAgICAgfVxuICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGNvbnRlbnQpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgdGhpcy5fZWRpdE9uRG91YmxlQ2xpY2soKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0IF9pc0VkaXRhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuaGFzT3duQ2FudmFzO1xuICB9XG59XG5jbGFzcyBMaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICNsaW5lID0gbnVsbDtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibGluZUFubm90YXRpb25cIik7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG4gICAgY29uc3QgbGluZSA9IHRoaXMuI2xpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpsaW5lXCIpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwieDFcIiwgZGF0YS5yZWN0WzJdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbMF0pO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwieTFcIiwgZGF0YS5yZWN0WzNdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbMV0pO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwieDJcIiwgZGF0YS5yZWN0WzJdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbMl0pO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwieTJcIiwgZGF0YS5yZWN0WzNdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbM10pO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBzdmcuYXBwZW5kKGxpbmUpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuICAgIGlmICghZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xpbmU7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgfVxufVxuY2xhc3MgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICNzcXVhcmUgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzcXVhcmVBbm5vdGF0aW9uXCIpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXMoZGF0YS5yZWN0KTtcbiAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuICAgIGNvbnN0IGJvcmRlcldpZHRoID0gZGF0YS5ib3JkZXJTdHlsZS53aWR0aDtcbiAgICBjb25zdCBzcXVhcmUgPSB0aGlzLiNzcXVhcmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJ4XCIsIGJvcmRlcldpZHRoIC8gMik7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInlcIiwgYm9yZGVyV2lkdGggLyAyKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgd2lkdGggLSBib3JkZXJXaWR0aCk7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBoZWlnaHQgLSBib3JkZXJXaWR0aCk7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBib3JkZXJXaWR0aCB8fCAxKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBzdmcuYXBwZW5kKHNxdWFyZSk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG4gICAgaWYgKCFkYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3F1YXJlO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbn1cbmNsYXNzIENpcmNsZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjY2lyY2xlID0gbnVsbDtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY2lyY2xlQW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcbiAgICBjb25zdCBib3JkZXJXaWR0aCA9IGRhdGEuYm9yZGVyU3R5bGUud2lkdGg7XG4gICAgY29uc3QgY2lyY2xlID0gdGhpcy4jY2lyY2xlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6ZWxsaXBzZVwiKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwiY3hcIiwgd2lkdGggLyAyKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwiY3lcIiwgaGVpZ2h0IC8gMik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInJ4XCIsIHdpZHRoIC8gMiAtIGJvcmRlcldpZHRoIC8gMik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInJ5XCIsIGhlaWdodCAvIDIgLSBib3JkZXJXaWR0aCAvIDIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgYm9yZGVyV2lkdGggfHwgMSk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgc3ZnLmFwcGVuZChjaXJjbGUpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuICAgIGlmICghZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NpcmNsZTtcbiAgfVxuICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICB9XG59XG5jbGFzcyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjcG9seWxpbmUgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcInBvbHlsaW5lQW5ub3RhdGlvblwiO1xuICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5bGluZVwiO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lKTtcbiAgICBjb25zdCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlY3QsXG4gICAgICAgIHZlcnRpY2VzLFxuICAgICAgICBib3JkZXJTdHlsZSxcbiAgICAgICAgcG9wdXBSZWZcbiAgICAgIH1cbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIXZlcnRpY2VzKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKHJlY3QpO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG4gICAgbGV0IHBvaW50cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIGNvbnN0IHggPSB2ZXJ0aWNlc1tpXSAtIHJlY3RbMF07XG4gICAgICBjb25zdCB5ID0gcmVjdFszXSAtIHZlcnRpY2VzW2kgKyAxXTtcbiAgICAgIHBvaW50cy5wdXNoKGAke3h9LCR7eX1gKTtcbiAgICB9XG4gICAgcG9pbnRzID0gcG9pbnRzLmpvaW4oXCIgXCIpO1xuICAgIGNvbnN0IHBvbHlsaW5lID0gdGhpcy4jcG9seWxpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKTtcbiAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJwb2ludHNcIiwgcG9pbnRzKTtcbiAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7XG4gICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIHN2Zy5hcHBlbmQocG9seWxpbmUpO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuICAgIGlmICghcG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgIHJldHVybiB0aGlzLiNwb2x5bGluZTtcbiAgfVxuICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICB9XG59XG5jbGFzcyBQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gXCJwb2x5Z29uQW5ub3RhdGlvblwiO1xuICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5Z29uXCI7XG4gIH1cbn1cbmNsYXNzIENhcmV0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImNhcmV0QW5ub3RhdGlvblwiKTtcbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBJbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgI3BvbHlsaW5lcyA9IFtdO1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcImlua0Fubm90YXRpb25cIjtcbiAgICB0aGlzLnN2Z0VsZW1lbnROYW1lID0gXCJzdmc6cG9seWxpbmVcIjtcbiAgICB0aGlzLmFubm90YXRpb25FZGl0b3JUeXBlID0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lKTtcbiAgICBjb25zdCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHJlY3QsXG4gICAgICAgIGlua0xpc3RzLFxuICAgICAgICBib3JkZXJTdHlsZSxcbiAgICAgICAgcG9wdXBSZWZcbiAgICAgIH1cbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhyZWN0KTtcbiAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuICAgIGZvciAoY29uc3QgaW5rTGlzdCBvZiBpbmtMaXN0cykge1xuICAgICAgbGV0IHBvaW50cyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5rTGlzdC5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgIGNvbnN0IHggPSBpbmtMaXN0W2ldIC0gcmVjdFswXTtcbiAgICAgICAgY29uc3QgeSA9IHJlY3RbM10gLSBpbmtMaXN0W2kgKyAxXTtcbiAgICAgICAgcG9pbnRzLnB1c2goYCR7eH0sJHt5fWApO1xuICAgICAgfVxuICAgICAgcG9pbnRzID0gcG9pbnRzLmpvaW4oXCIgXCIpO1xuICAgICAgY29uc3QgcG9seWxpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKTtcbiAgICAgIHRoaXMuI3BvbHlsaW5lcy5wdXNoKHBvbHlsaW5lKTtcbiAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInBvaW50c1wiLCBwb2ludHMpO1xuICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGJvcmRlclN0eWxlLndpZHRoIHx8IDEpO1xuICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICBpZiAoIXBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICB9XG4gICAgICBzdmcuYXBwZW5kKHBvbHlsaW5lKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3BvbHlsaW5lcztcbiAgfVxuICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICB9XG59XG5jbGFzcyBIaWdobGlnaHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZSxcbiAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QW5ub3RhdGlvblwiKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFVuZGVybGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ1bmRlcmxpbmVBbm5vdGF0aW9uXCIpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZSxcbiAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3F1aWdnbHlBbm5vdGF0aW9uXCIpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgU3RyaWtlT3V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWUsXG4gICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInN0cmlrZW91dEFubm90YXRpb25cIik7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBTdGFtcEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzdGFtcEFubm90YXRpb25cIik7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgI3RyaWdnZXIgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgZmlsZVxuICAgIH0gPSB0aGlzLmRhdGE7XG4gICAgdGhpcy5maWxlbmFtZSA9IGZpbGUuZmlsZW5hbWU7XG4gICAgdGhpcy5jb250ZW50ID0gZmlsZS5jb250ZW50O1xuICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZmlsZWF0dGFjaG1lbnRhbm5vdGF0aW9uXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIC4uLmZpbGVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImZpbGVBdHRhY2htZW50QW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCB7XG4gICAgICBjb250YWluZXIsXG4gICAgICBkYXRhXG4gICAgfSA9IHRoaXM7XG4gICAgbGV0IHRyaWdnZXI7XG4gICAgaWYgKGRhdGEuaGFzQXBwZWFyYW5jZSB8fCBkYXRhLmZpbGxBbHBoYSA9PT0gMCkge1xuICAgICAgdHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgdHJpZ2dlci5zcmMgPSBgJHt0aGlzLmltYWdlUmVzb3VyY2VzUGF0aH1hbm5vdGF0aW9uLSR7L3BhcGVyY2xpcC9pLnRlc3QoZGF0YS5uYW1lKSA/IFwicGFwZXJjbGlwXCIgOiBcInB1c2hwaW5cIn0uc3ZnYDtcbiAgICAgIGlmIChkYXRhLmZpbGxBbHBoYSAmJiBkYXRhLmZpbGxBbHBoYSA8IDEpIHtcbiAgICAgICAgdHJpZ2dlci5zdHlsZSA9IGBmaWx0ZXI6IG9wYWNpdHkoJHtNYXRoLnJvdW5kKGRhdGEuZmlsbEFscGhhICogMTAwKX0lKTtgO1xuICAgICAgfVxuICAgIH1cbiAgICB0cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCB0aGlzLiNkb3dubG9hZC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLiN0cmlnZ2VyID0gdHJpZ2dlcjtcbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBldnQgPT4ge1xuICAgICAgaWYgKGV2dC5rZXkgPT09IFwiRW50ZXJcIiAmJiAoaXNNYWMgPyBldnQubWV0YUtleSA6IGV2dC5jdHJsS2V5KSkge1xuICAgICAgICB0aGlzLiNkb3dubG9hZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlci5jbGFzc0xpc3QuYWRkKFwicG9wdXBUcmlnZ2VyQXJlYVwiKTtcbiAgICB9XG4gICAgY29udGFpbmVyLmFwcGVuZCh0cmlnZ2VyKTtcbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RyaWdnZXI7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgfVxuICAjZG93bmxvYWQoKSB7XG4gICAgdGhpcy5kb3dubG9hZE1hbmFnZXI/Lm9wZW5PckRvd25sb2FkRGF0YSh0aGlzLmNvbnRlbnQsIHRoaXMuZmlsZW5hbWUpO1xuICB9XG59XG5jbGFzcyBBbm5vdGF0aW9uTGF5ZXIge1xuICAjYWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBudWxsO1xuICAjYW5ub3RhdGlvbkNhbnZhc01hcCA9IG51bGw7XG4gICNlZGl0YWJsZUFubm90YXRpb25zID0gbmV3IE1hcCgpO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgZGl2LFxuICAgIGFjY2Vzc2liaWxpdHlNYW5hZ2VyLFxuICAgIGFubm90YXRpb25DYW52YXNNYXAsXG4gICAgYW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcixcbiAgICBwYWdlLFxuICAgIHZpZXdwb3J0XG4gIH0pIHtcbiAgICB0aGlzLmRpdiA9IGRpdjtcbiAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlciA9IGFjY2Vzc2liaWxpdHlNYW5hZ2VyO1xuICAgIHRoaXMuI2Fubm90YXRpb25DYW52YXNNYXAgPSBhbm5vdGF0aW9uQ2FudmFzTWFwO1xuICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIHRoaXMuekluZGV4ID0gMDtcbiAgICB0aGlzLl9hbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyID0gYW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcjtcbiAgfVxuICAjYXBwZW5kRWxlbWVudChlbGVtZW50LCBpZCkge1xuICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZWxlbWVudC5maXJzdENoaWxkIHx8IGVsZW1lbnQ7XG4gICAgY29udGVudEVsZW1lbnQuaWQgPSBgJHtBbm5vdGF0aW9uUHJlZml4fSR7aWR9YDtcbiAgICB0aGlzLmRpdi5hcHBlbmQoZWxlbWVudCk7XG4gICAgdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXI/Lm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsIGVsZW1lbnQsIGNvbnRlbnRFbGVtZW50LCBmYWxzZSk7XG4gIH1cbiAgYXN5bmMgcmVuZGVyKHBhcmFtcykge1xuICAgIGNvbnN0IHtcbiAgICAgIGFubm90YXRpb25zXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCBsYXllciA9IHRoaXMuZGl2O1xuICAgIHNldExheWVyRGltZW5zaW9ucyhsYXllciwgdGhpcy52aWV3cG9ydCk7XG4gICAgY29uc3QgcG9wdXBUb0VsZW1lbnRzID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGVsZW1lbnRQYXJhbXMgPSB7XG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgbGF5ZXIsXG4gICAgICBsaW5rU2VydmljZTogcGFyYW1zLmxpbmtTZXJ2aWNlLFxuICAgICAgZG93bmxvYWRNYW5hZ2VyOiBwYXJhbXMuZG93bmxvYWRNYW5hZ2VyLFxuICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoOiBwYXJhbXMuaW1hZ2VSZXNvdXJjZXNQYXRoIHx8IFwiXCIsXG4gICAgICByZW5kZXJGb3JtczogcGFyYW1zLnJlbmRlckZvcm1zICE9PSBmYWxzZSxcbiAgICAgIHN2Z0ZhY3Rvcnk6IG5ldyBET01TVkdGYWN0b3J5KCksXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZTogcGFyYW1zLmFubm90YXRpb25TdG9yYWdlIHx8IG5ldyBBbm5vdGF0aW9uU3RvcmFnZSgpLFxuICAgICAgZW5hYmxlU2NyaXB0aW5nOiBwYXJhbXMuZW5hYmxlU2NyaXB0aW5nID09PSB0cnVlLFxuICAgICAgaGFzSlNBY3Rpb25zOiBwYXJhbXMuaGFzSlNBY3Rpb25zLFxuICAgICAgZmllbGRPYmplY3RzOiBwYXJhbXMuZmllbGRPYmplY3RzLFxuICAgICAgcGFyZW50OiB0aGlzLFxuICAgICAgZWxlbWVudHM6IG51bGxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgZGF0YSBvZiBhbm5vdGF0aW9ucykge1xuICAgICAgaWYgKGRhdGEubm9IVE1MKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaXNQb3B1cEFubm90YXRpb24gPSBkYXRhLmFubm90YXRpb25UeXBlID09PSBBbm5vdGF0aW9uVHlwZS5QT1BVUDtcbiAgICAgIGlmICghaXNQb3B1cEFubm90YXRpb24pIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodFxuICAgICAgICB9ID0gZ2V0UmVjdERpbXMoZGF0YS5yZWN0KTtcbiAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBwb3B1cFRvRWxlbWVudHMuZ2V0KGRhdGEuaWQpO1xuICAgICAgICBpZiAoIWVsZW1lbnRzKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudFBhcmFtcy5lbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgICAgfVxuICAgICAgZWxlbWVudFBhcmFtcy5kYXRhID0gZGF0YTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBBbm5vdGF0aW9uRWxlbWVudEZhY3RvcnkuY3JlYXRlKGVsZW1lbnRQYXJhbXMpO1xuICAgICAgaWYgKCFlbGVtZW50LmlzUmVuZGVyYWJsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNQb3B1cEFubm90YXRpb24gJiYgZGF0YS5wb3B1cFJlZikge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHBvcHVwVG9FbGVtZW50cy5nZXQoZGF0YS5wb3B1cFJlZik7XG4gICAgICAgIGlmICghZWxlbWVudHMpIHtcbiAgICAgICAgICBwb3B1cFRvRWxlbWVudHMuc2V0KGRhdGEucG9wdXBSZWYsIFtlbGVtZW50XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcmVuZGVyZWQgPSBlbGVtZW50LnJlbmRlcigpO1xuICAgICAgaWYgKGRhdGEuaGlkZGVuKSB7XG4gICAgICAgIHJlbmRlcmVkLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgfVxuICAgICAgdGhpcy4jYXBwZW5kRWxlbWVudChyZW5kZXJlZCwgZGF0YS5pZCk7XG4gICAgICBpZiAoZWxlbWVudC5hbm5vdGF0aW9uRWRpdG9yVHlwZSA+IDApIHtcbiAgICAgICAgdGhpcy4jZWRpdGFibGVBbm5vdGF0aW9ucy5zZXQoZWxlbWVudC5kYXRhLmlkLCBlbGVtZW50KTtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcj8ucmVuZGVyQW5ub3RhdGlvbkVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI3NldEFubm90YXRpb25DYW52YXNNYXAoKTtcbiAgfVxuICB1cGRhdGUoe1xuICAgIHZpZXdwb3J0XG4gIH0pIHtcbiAgICBjb25zdCBsYXllciA9IHRoaXMuZGl2O1xuICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICBzZXRMYXllckRpbWVuc2lvbnMobGF5ZXIsIHtcbiAgICAgIHJvdGF0aW9uOiB2aWV3cG9ydC5yb3RhdGlvblxuICAgIH0pO1xuICAgIHRoaXMuI3NldEFubm90YXRpb25DYW52YXNNYXAoKTtcbiAgICBsYXllci5oaWRkZW4gPSBmYWxzZTtcbiAgfVxuICAjc2V0QW5ub3RhdGlvbkNhbnZhc01hcCgpIHtcbiAgICBpZiAoIXRoaXMuI2Fubm90YXRpb25DYW52YXNNYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLmRpdjtcbiAgICBmb3IgKGNvbnN0IFtpZCwgY2FudmFzXSBvZiB0aGlzLiNhbm5vdGF0aW9uQ2FudmFzTWFwKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gbGF5ZXIucXVlcnlTZWxlY3RvcihgW2RhdGEtYW5ub3RhdGlvbi1pZD1cIiR7aWR9XCJdYCk7XG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYW52YXMuY2xhc3NOYW1lID0gXCJhbm5vdGF0aW9uQ29udGVudFwiO1xuICAgICAgY29uc3Qge1xuICAgICAgICBmaXJzdENoaWxkXG4gICAgICB9ID0gZWxlbWVudDtcbiAgICAgIGlmICghZmlyc3RDaGlsZCkge1xuICAgICAgICBlbGVtZW50LmFwcGVuZChjYW52YXMpO1xuICAgICAgfSBlbHNlIGlmIChmaXJzdENoaWxkLm5vZGVOYW1lID09PSBcIkNBTlZBU1wiKSB7XG4gICAgICAgIGZpcnN0Q2hpbGQucmVwbGFjZVdpdGgoY2FudmFzKTtcbiAgICAgIH0gZWxzZSBpZiAoIWZpcnN0Q2hpbGQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYW5ub3RhdGlvbkNvbnRlbnRcIikpIHtcbiAgICAgICAgZmlyc3RDaGlsZC5iZWZvcmUoY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpcnN0Q2hpbGQuYWZ0ZXIoY2FudmFzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jYW5ub3RhdGlvbkNhbnZhc01hcC5jbGVhcigpO1xuICB9XG4gIGdldEVkaXRhYmxlQW5ub3RhdGlvbnMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy4jZWRpdGFibGVBbm5vdGF0aW9ucy52YWx1ZXMoKSk7XG4gIH1cbiAgZ2V0RWRpdGFibGVBbm5vdGF0aW9uKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuI2VkaXRhYmxlQW5ub3RhdGlvbnMuZ2V0KGlkKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3IvZnJlZXRleHQuanNcblxuXG5cblxuY29uc3QgRU9MX1BBVFRFUk4gPSAvXFxyXFxuP3xcXG4vZztcbmNsYXNzIEZyZWVUZXh0RWRpdG9yIGV4dGVuZHMgQW5ub3RhdGlvbkVkaXRvciB7XG4gICNib3VuZEVkaXRvckRpdkJsdXIgPSB0aGlzLmVkaXRvckRpdkJsdXIuYmluZCh0aGlzKTtcbiAgI2JvdW5kRWRpdG9yRGl2Rm9jdXMgPSB0aGlzLmVkaXRvckRpdkZvY3VzLmJpbmQodGhpcyk7XG4gICNib3VuZEVkaXRvckRpdklucHV0ID0gdGhpcy5lZGl0b3JEaXZJbnB1dC5iaW5kKHRoaXMpO1xuICAjYm91bmRFZGl0b3JEaXZLZXlkb3duID0gdGhpcy5lZGl0b3JEaXZLZXlkb3duLmJpbmQodGhpcyk7XG4gICNib3VuZEVkaXRvckRpdlBhc3RlID0gdGhpcy5lZGl0b3JEaXZQYXN0ZS5iaW5kKHRoaXMpO1xuICAjY29sb3I7XG4gICNjb250ZW50ID0gXCJcIjtcbiAgI2VkaXRvckRpdklkID0gYCR7dGhpcy5pZH0tZWRpdG9yYDtcbiAgI2ZvbnRTaXplO1xuICAjaW5pdGlhbERhdGEgPSBudWxsO1xuICBzdGF0aWMgX2ZyZWVUZXh0RGVmYXVsdENvbnRlbnQgPSBcIlwiO1xuICBzdGF0aWMgX2ludGVybmFsUGFkZGluZyA9IDA7XG4gIHN0YXRpYyBfZGVmYXVsdENvbG9yID0gbnVsbDtcbiAgc3RhdGljIF9kZWZhdWx0Rm9udFNpemUgPSAxMDtcbiAgc3RhdGljIGdldCBfa2V5Ym9hcmRNYW5hZ2VyKCkge1xuICAgIGNvbnN0IHByb3RvID0gRnJlZVRleHRFZGl0b3IucHJvdG90eXBlO1xuICAgIGNvbnN0IGFycm93Q2hlY2tlciA9IHNlbGYgPT4gc2VsZi5pc0VtcHR5KCk7XG4gICAgY29uc3Qgc21hbGwgPSBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLlRSQU5TTEFURV9TTUFMTDtcbiAgICBjb25zdCBiaWcgPSBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLlRSQU5TTEFURV9CSUc7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9rZXlib2FyZE1hbmFnZXJcIiwgbmV3IEtleWJvYXJkTWFuYWdlcihbW1tcImN0cmwrc1wiLCBcIm1hYyttZXRhK3NcIiwgXCJjdHJsK3BcIiwgXCJtYWMrbWV0YStwXCJdLCBwcm90by5jb21taXRPclJlbW92ZSwge1xuICAgICAgYnViYmxlczogdHJ1ZVxuICAgIH1dLCBbW1wiY3RybCtFbnRlclwiLCBcIm1hYyttZXRhK0VudGVyXCIsIFwiRXNjYXBlXCIsIFwibWFjK0VzY2FwZVwiXSwgcHJvdG8uY29tbWl0T3JSZW1vdmVdLCBbW1wiQXJyb3dMZWZ0XCIsIFwibWFjK0Fycm93TGVmdFwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbLXNtYWxsLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd0xlZnRcIiwgXCJtYWMrc2hpZnQrQXJyb3dMZWZ0XCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFstYmlnLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiQXJyb3dSaWdodFwiLCBcIm1hYytBcnJvd1JpZ2h0XCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFtzbWFsbCwgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dSaWdodFwiLCBcIm1hYytzaGlmdCtBcnJvd1JpZ2h0XCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFtiaWcsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJBcnJvd1VwXCIsIFwibWFjK0Fycm93VXBcIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogWzAsIC1zbWFsbF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dVcFwiLCBcIm1hYytzaGlmdCtBcnJvd1VwXCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFswLCAtYmlnXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiQXJyb3dEb3duXCIsIFwibWFjK0Fycm93RG93blwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbMCwgc21hbGxdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93RG93blwiLCBcIm1hYytzaGlmdCtBcnJvd0Rvd25cIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogWzAsIGJpZ10sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XV0pKTtcbiAgfVxuICBzdGF0aWMgX3R5cGUgPSBcImZyZWV0ZXh0XCI7XG4gIHN0YXRpYyBfZWRpdG9yVHlwZSA9IEFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUO1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBuYW1lOiBcImZyZWVUZXh0RWRpdG9yXCJcbiAgICB9KTtcbiAgICB0aGlzLiNjb2xvciA9IHBhcmFtcy5jb2xvciB8fCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdENvbG9yIHx8IEFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3I7XG4gICAgdGhpcy4jZm9udFNpemUgPSBwYXJhbXMuZm9udFNpemUgfHwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRGb250U2l6ZTtcbiAgfVxuICBzdGF0aWMgaW5pdGlhbGl6ZShsMTBuLCB1aU1hbmFnZXIpIHtcbiAgICBBbm5vdGF0aW9uRWRpdG9yLmluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyLCB7XG4gICAgICBzdHJpbmdzOiBbXCJwZGZqcy1mcmVlLXRleHQtZGVmYXVsdC1jb250ZW50XCJdXG4gICAgfSk7XG4gICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgdGhpcy5faW50ZXJuYWxQYWRkaW5nID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1mcmVldGV4dC1wYWRkaW5nXCIpKTtcbiAgfVxuICBzdGF0aWMgdXBkYXRlRGVmYXVsdFBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFOlxuICAgICAgICBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUjpcbiAgICAgICAgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvciA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkU6XG4gICAgICAgIHRoaXMuI3VwZGF0ZUZvbnRTaXplKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX0NPTE9SOlxuICAgICAgICB0aGlzLiN1cGRhdGVDb2xvcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgcmV0dXJuIFtbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRSwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRGb250U2l6ZV0sIFtBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUiwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBBbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yXV07XG4gIH1cbiAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW1tBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLCB0aGlzLiNmb250U2l6ZV0sIFtBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUiwgdGhpcy4jY29sb3JdXTtcbiAgfVxuICAjdXBkYXRlRm9udFNpemUoZm9udFNpemUpIHtcbiAgICBjb25zdCBzZXRGb250c2l6ZSA9IHNpemUgPT4ge1xuICAgICAgdGhpcy5lZGl0b3JEaXYuc3R5bGUuZm9udFNpemUgPSBgY2FsYygke3NpemV9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG4gICAgICB0aGlzLnRyYW5zbGF0ZSgwLCAtKHNpemUgLSB0aGlzLiNmb250U2l6ZSkgKiB0aGlzLnBhcmVudFNjYWxlKTtcbiAgICAgIHRoaXMuI2ZvbnRTaXplID0gc2l6ZTtcbiAgICAgIHRoaXMuI3NldEVkaXRvckRpbWVuc2lvbnMoKTtcbiAgICB9O1xuICAgIGNvbnN0IHNhdmVkRm9udHNpemUgPSB0aGlzLiNmb250U2l6ZTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogc2V0Rm9udHNpemUuYmluZCh0aGlzLCBmb250U2l6ZSksXG4gICAgICB1bmRvOiBzZXRGb250c2l6ZS5iaW5kKHRoaXMsIHNhdmVkRm9udHNpemUpLFxuICAgICAgcG9zdDogdGhpcy5fdWlNYW5hZ2VyLnVwZGF0ZVVJLmJpbmQodGhpcy5fdWlNYW5hZ2VyLCB0aGlzKSxcbiAgICAgIG11c3RFeGVjOiB0cnVlLFxuICAgICAgdHlwZTogQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRSxcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gICN1cGRhdGVDb2xvcihjb2xvcikge1xuICAgIGNvbnN0IHNldENvbG9yID0gY29sID0+IHtcbiAgICAgIHRoaXMuI2NvbG9yID0gdGhpcy5lZGl0b3JEaXYuc3R5bGUuY29sb3IgPSBjb2w7XG4gICAgfTtcbiAgICBjb25zdCBzYXZlZENvbG9yID0gdGhpcy4jY29sb3I7XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6IHNldENvbG9yLmJpbmQodGhpcywgY29sb3IpLFxuICAgICAgdW5kbzogc2V0Q29sb3IuYmluZCh0aGlzLCBzYXZlZENvbG9yKSxcbiAgICAgIHBvc3Q6IHRoaXMuX3VpTWFuYWdlci51cGRhdGVVSS5iaW5kKHRoaXMuX3VpTWFuYWdlciwgdGhpcyksXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX0NPTE9SLFxuICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogdHJ1ZSxcbiAgICAgIGtlZXBVbmRvOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgX3RyYW5zbGF0ZUVtcHR5KHgsIHkpIHtcbiAgICB0aGlzLl91aU1hbmFnZXIudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzKHgsIHksIHRydWUpO1xuICB9XG4gIGdldEluaXRpYWxUcmFuc2xhdGlvbigpIHtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMucGFyZW50U2NhbGU7XG4gICAgcmV0dXJuIFstRnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyAqIHNjYWxlLCAtKEZyZWVUZXh0RWRpdG9yLl9pbnRlcm5hbFBhZGRpbmcgKyB0aGlzLiNmb250U2l6ZSkgKiBzY2FsZV07XG4gIH1cbiAgcmVidWlsZCgpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLnJlYnVpbGQoKTtcbiAgICBpZiAodGhpcy5kaXYgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgdGhpcy5wYXJlbnQuYWRkKHRoaXMpO1xuICAgIH1cbiAgfVxuICBlbmFibGVFZGl0TW9kZSgpIHtcbiAgICBpZiAodGhpcy5pc0luRWRpdE1vZGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUoZmFsc2UpO1xuICAgIHRoaXMucGFyZW50LnVwZGF0ZVRvb2xiYXIoQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQpO1xuICAgIHN1cGVyLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJlbmFibGVkXCIpO1xuICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLmRpdi5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZLZXlkb3duLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZGb2N1cywge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZCbHVyLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZJbnB1dCwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBhc3RlXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2UGFzdGUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gIGRpc2FibGVFZGl0TW9kZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNJbkVkaXRNb2RlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQuc2V0RWRpdGluZ1N0YXRlKHRydWUpO1xuICAgIHN1cGVyLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKFwiZW5hYmxlZFwiKTtcbiAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgdGhpcy4jZWRpdG9yRGl2SWQpO1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEVkaXRvckRpdktleWRvd24pO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNib3VuZEVkaXRvckRpdkZvY3VzKTtcbiAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNib3VuZEVkaXRvckRpdkJsdXIpO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB0aGlzLiNib3VuZEVkaXRvckRpdklucHV0KTtcbiAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZQYXN0ZSk7XG4gICAgdGhpcy5kaXYuZm9jdXMoe1xuICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wYXJlbnQuZGl2LmNsYXNzTGlzdC5hZGQoXCJmcmVldGV4dEVkaXRpbmdcIik7XG4gIH1cbiAgZm9jdXNpbihldmVudCkge1xuICAgIGlmICghdGhpcy5fZm9jdXNFdmVudHNBbGxvd2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmZvY3VzaW4oZXZlbnQpO1xuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuZWRpdG9yRGl2KSB7XG4gICAgICB0aGlzLmVkaXRvckRpdi5mb2N1cygpO1xuICAgIH1cbiAgfVxuICBvbmNlQWRkZWQoKSB7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gICAgaWYgKHRoaXMuX2luaXRpYWxPcHRpb25zPy5pc0NlbnRlcmVkKSB7XG4gICAgICB0aGlzLmNlbnRlcigpO1xuICAgIH1cbiAgICB0aGlzLl9pbml0aWFsT3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gIXRoaXMuZWRpdG9yRGl2IHx8IHRoaXMuZWRpdG9yRGl2LmlubmVyVGV4dC50cmltKCkgPT09IFwiXCI7XG4gIH1cbiAgcmVtb3ZlKCkge1xuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUodHJ1ZSk7XG4gICAgICB0aGlzLnBhcmVudC5kaXYuY2xhc3NMaXN0LmFkZChcImZyZWV0ZXh0RWRpdGluZ1wiKTtcbiAgICB9XG4gICAgc3VwZXIucmVtb3ZlKCk7XG4gIH1cbiAgI2V4dHJhY3RUZXh0KCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IFtdO1xuICAgIHRoaXMuZWRpdG9yRGl2Lm5vcm1hbGl6ZSgpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5lZGl0b3JEaXYuY2hpbGROb2Rlcykge1xuICAgICAgYnVmZmVyLnB1c2goRnJlZVRleHRFZGl0b3IuI2dldE5vZGVDb250ZW50KGNoaWxkKSk7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXIuam9pbihcIlxcblwiKTtcbiAgfVxuICAjc2V0RWRpdG9yRGltZW5zaW9ucygpIHtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgbGV0IHJlY3Q7XG4gICAgaWYgKHRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICByZWN0ID0gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY3VycmVudExheWVyLFxuICAgICAgICBkaXZcbiAgICAgIH0gPSB0aGlzO1xuICAgICAgY29uc3Qgc2F2ZWREaXNwbGF5ID0gZGl2LnN0eWxlLmRpc3BsYXk7XG4gICAgICBjb25zdCBzYXZlZFZpc2liaWxpdHkgPSBkaXYuY2xhc3NMaXN0LmNvbnRhaW5zKFwiaGlkZGVuXCIpO1xuICAgICAgZGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG4gICAgICBkaXYuc3R5bGUuZGlzcGxheSA9IFwiaGlkZGVuXCI7XG4gICAgICBjdXJyZW50TGF5ZXIuZGl2LmFwcGVuZCh0aGlzLmRpdik7XG4gICAgICByZWN0ID0gZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgZGl2LnJlbW92ZSgpO1xuICAgICAgZGl2LnN0eWxlLmRpc3BsYXkgPSBzYXZlZERpc3BsYXk7XG4gICAgICBkaXYuY2xhc3NMaXN0LnRvZ2dsZShcImhpZGRlblwiLCBzYXZlZFZpc2liaWxpdHkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yb3RhdGlvbiAlIDE4MCA9PT0gdGhpcy5wYXJlbnRSb3RhdGlvbiAlIDE4MCkge1xuICAgICAgdGhpcy53aWR0aCA9IHJlY3Qud2lkdGggLyBwYXJlbnRXaWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gcmVjdC5oZWlnaHQgLyBwYXJlbnRIZWlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud2lkdGggPSByZWN0LmhlaWdodCAvIHBhcmVudFdpZHRoO1xuICAgICAgdGhpcy5oZWlnaHQgPSByZWN0LndpZHRoIC8gcGFyZW50SGVpZ2h0O1xuICAgIH1cbiAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gIH1cbiAgY29tbWl0KCkge1xuICAgIGlmICghdGhpcy5pc0luRWRpdE1vZGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5jb21taXQoKTtcbiAgICB0aGlzLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgIGNvbnN0IHNhdmVkVGV4dCA9IHRoaXMuI2NvbnRlbnQ7XG4gICAgY29uc3QgbmV3VGV4dCA9IHRoaXMuI2NvbnRlbnQgPSB0aGlzLiNleHRyYWN0VGV4dCgpLnRyaW1FbmQoKTtcbiAgICBpZiAoc2F2ZWRUZXh0ID09PSBuZXdUZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNldFRleHQgPSB0ZXh0ID0+IHtcbiAgICAgIHRoaXMuI2NvbnRlbnQgPSB0ZXh0O1xuICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3NldENvbnRlbnQoKTtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5yZWJ1aWxkKHRoaXMpO1xuICAgICAgdGhpcy4jc2V0RWRpdG9yRGltZW5zaW9ucygpO1xuICAgIH07XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgc2V0VGV4dChuZXdUZXh0KTtcbiAgICAgIH0sXG4gICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgIHNldFRleHQoc2F2ZWRUZXh0KTtcbiAgICAgIH0sXG4gICAgICBtdXN0RXhlYzogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLiNzZXRFZGl0b3JEaW1lbnNpb25zKCk7XG4gIH1cbiAgc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbkVkaXRNb2RlKCk7XG4gIH1cbiAgZW50ZXJJbkVkaXRNb2RlKCkge1xuICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICB0aGlzLmVkaXRvckRpdi5mb2N1cygpO1xuICB9XG4gIGRibGNsaWNrKGV2ZW50KSB7XG4gICAgdGhpcy5lbnRlckluRWRpdE1vZGUoKTtcbiAgfVxuICBrZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5kaXYgJiYgZXZlbnQua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgIHRoaXMuZW50ZXJJbkVkaXRNb2RlKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuICBlZGl0b3JEaXZLZXlkb3duKGV2ZW50KSB7XG4gICAgRnJlZVRleHRFZGl0b3IuX2tleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIGV2ZW50KTtcbiAgfVxuICBlZGl0b3JEaXZGb2N1cyhldmVudCkge1xuICAgIHRoaXMuaXNFZGl0aW5nID0gdHJ1ZTtcbiAgfVxuICBlZGl0b3JEaXZCbHVyKGV2ZW50KSB7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgfVxuICBlZGl0b3JEaXZJbnB1dChldmVudCkge1xuICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiZnJlZXRleHRFZGl0aW5nXCIsIHRoaXMuaXNFbXB0eSgpKTtcbiAgfVxuICBkaXNhYmxlRWRpdGluZygpIHtcbiAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwiY29tbWVudFwiKTtcbiAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLW11bHRpbGluZVwiKTtcbiAgfVxuICBlbmFibGVFZGl0aW5nKCkge1xuICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0ZXh0Ym94XCIpO1xuICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImFyaWEtbXVsdGlsaW5lXCIsIHRydWUpO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5kaXYpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpdjtcbiAgICB9XG4gICAgbGV0IGJhc2VYLCBiYXNlWTtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgYmFzZVggPSB0aGlzLng7XG4gICAgICBiYXNlWSA9IHRoaXMueTtcbiAgICB9XG4gICAgc3VwZXIucmVuZGVyKCk7XG4gICAgdGhpcy5lZGl0b3JEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuZWRpdG9yRGl2LmNsYXNzTmFtZSA9IFwiaW50ZXJuYWxcIjtcbiAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLiNlZGl0b3JEaXZJZCk7XG4gICAgdGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtZnJlZS10ZXh0XCIpO1xuICAgIHRoaXMuZW5hYmxlRWRpdGluZygpO1xuICAgIEFubm90YXRpb25FZGl0b3IuX2wxMG5Qcm9taXNlLmdldChcInBkZmpzLWZyZWUtdGV4dC1kZWZhdWx0LWNvbnRlbnRcIikudGhlbihtc2cgPT4gdGhpcy5lZGl0b3JEaXY/LnNldEF0dHJpYnV0ZShcImRlZmF1bHQtY29udGVudFwiLCBtc2cpKTtcbiAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuZWRpdG9yRGl2O1xuICAgIHN0eWxlLmZvbnRTaXplID0gYGNhbGMoJHt0aGlzLiNmb250U2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcbiAgICBzdHlsZS5jb2xvciA9IHRoaXMuI2NvbG9yO1xuICAgIHRoaXMuZGl2LmFwcGVuZCh0aGlzLmVkaXRvckRpdik7XG4gICAgdGhpcy5vdmVybGF5RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LmFkZChcIm92ZXJsYXlcIiwgXCJlbmFibGVkXCIpO1xuICAgIHRoaXMuZGl2LmFwcGVuZCh0aGlzLm92ZXJsYXlEaXYpO1xuICAgIGJpbmRFdmVudHModGhpcywgdGhpcy5kaXYsIFtcImRibGNsaWNrXCIsIFwia2V5ZG93blwiXSk7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgIGlmICh0aGlzLmFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHBvc2l0aW9uXG4gICAgICAgIH0gPSB0aGlzLiNpbml0aWFsRGF0YTtcbiAgICAgICAgbGV0IFt0eCwgdHldID0gdGhpcy5nZXRJbml0aWFsVHJhbnNsYXRpb24oKTtcbiAgICAgICAgW3R4LCB0eV0gPSB0aGlzLnBhZ2VUcmFuc2xhdGlvblRvU2NyZWVuKHR4LCB0eSk7XG4gICAgICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgY29uc3QgW3BhZ2VYLCBwYWdlWV0gPSB0aGlzLnBhZ2VUcmFuc2xhdGlvbjtcbiAgICAgICAgbGV0IHBvc1gsIHBvc1k7XG4gICAgICAgIHN3aXRjaCAodGhpcy5yb3RhdGlvbikge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHBvc1ggPSBiYXNlWCArIChwb3NpdGlvblswXSAtIHBhZ2VYKSAvIHBhZ2VXaWR0aDtcbiAgICAgICAgICAgIHBvc1kgPSBiYXNlWSArIHRoaXMuaGVpZ2h0IC0gKHBvc2l0aW9uWzFdIC0gcGFnZVkpIC8gcGFnZUhlaWdodDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgOTA6XG4gICAgICAgICAgICBwb3NYID0gYmFzZVggKyAocG9zaXRpb25bMF0gLSBwYWdlWCkgLyBwYWdlV2lkdGg7XG4gICAgICAgICAgICBwb3NZID0gYmFzZVkgLSAocG9zaXRpb25bMV0gLSBwYWdlWSkgLyBwYWdlSGVpZ2h0O1xuICAgICAgICAgICAgW3R4LCB0eV0gPSBbdHksIC10eF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgIHBvc1ggPSBiYXNlWCAtIHRoaXMud2lkdGggKyAocG9zaXRpb25bMF0gLSBwYWdlWCkgLyBwYWdlV2lkdGg7XG4gICAgICAgICAgICBwb3NZID0gYmFzZVkgLSAocG9zaXRpb25bMV0gLSBwYWdlWSkgLyBwYWdlSGVpZ2h0O1xuICAgICAgICAgICAgW3R4LCB0eV0gPSBbLXR4LCAtdHldO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgICBwb3NYID0gYmFzZVggKyAocG9zaXRpb25bMF0gLSBwYWdlWCAtIHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodCkgLyBwYWdlV2lkdGg7XG4gICAgICAgICAgICBwb3NZID0gYmFzZVkgKyAocG9zaXRpb25bMV0gLSBwYWdlWSAtIHRoaXMud2lkdGggKiBwYWdlV2lkdGgpIC8gcGFnZUhlaWdodDtcbiAgICAgICAgICAgIFt0eCwgdHldID0gWy10eSwgdHhdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRBdChwb3NYICogcGFyZW50V2lkdGgsIHBvc1kgKiBwYXJlbnRIZWlnaHQsIHR4LCB0eSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldEF0KGJhc2VYICogcGFyZW50V2lkdGgsIGJhc2VZICogcGFyZW50SGVpZ2h0LCB0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3NldENvbnRlbnQoKTtcbiAgICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGl2O1xuICB9XG4gIHN0YXRpYyAjZ2V0Tm9kZUNvbnRlbnQobm9kZSkge1xuICAgIHJldHVybiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgPyBub2RlLm5vZGVWYWx1ZSA6IG5vZGUuaW5uZXJUZXh0KS5yZXBsYWNlQWxsKEVPTF9QQVRURVJOLCBcIlwiKTtcbiAgfVxuICBlZGl0b3JEaXZQYXN0ZShldmVudCkge1xuICAgIGNvbnN0IGNsaXBib2FyZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhIHx8IHdpbmRvdy5jbGlwYm9hcmREYXRhO1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGVzXG4gICAgfSA9IGNsaXBib2FyZERhdGE7XG4gICAgaWYgKHR5cGVzLmxlbmd0aCA9PT0gMSAmJiB0eXBlc1swXSA9PT0gXCJ0ZXh0L3BsYWluXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBwYXN0ZSA9IEZyZWVUZXh0RWRpdG9yLiNkZXNlcmlhbGl6ZUNvbnRlbnQoY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dFwiKSB8fCBcIlwiKS5yZXBsYWNlQWxsKEVPTF9QQVRURVJOLCBcIlxcblwiKTtcbiAgICBpZiAoIXBhc3RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZWRpdG9yRGl2Lm5vcm1hbGl6ZSgpO1xuICAgIHNlbGVjdGlvbi5kZWxldGVGcm9tRG9jdW1lbnQoKTtcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgIGlmICghcGFzdGUuaW5jbHVkZXMoXCJcXG5cIikpIHtcbiAgICAgIHJhbmdlLmluc2VydE5vZGUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFzdGUpKTtcbiAgICAgIHRoaXMuZWRpdG9yRGl2Lm5vcm1hbGl6ZSgpO1xuICAgICAgc2VsZWN0aW9uLmNvbGxhcHNlVG9TdGFydCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBzdGFydENvbnRhaW5lcixcbiAgICAgIHN0YXJ0T2Zmc2V0XG4gICAgfSA9IHJhbmdlO1xuICAgIGNvbnN0IGJ1ZmZlckJlZm9yZSA9IFtdO1xuICAgIGNvbnN0IGJ1ZmZlckFmdGVyID0gW107XG4gICAgaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gc3RhcnRDb250YWluZXIucGFyZW50RWxlbWVudDtcbiAgICAgIGJ1ZmZlckFmdGVyLnB1c2goc3RhcnRDb250YWluZXIubm9kZVZhbHVlLnNsaWNlKHN0YXJ0T2Zmc2V0KS5yZXBsYWNlQWxsKEVPTF9QQVRURVJOLCBcIlwiKSk7XG4gICAgICBpZiAocGFyZW50ICE9PSB0aGlzLmVkaXRvckRpdikge1xuICAgICAgICBsZXQgYnVmZmVyID0gYnVmZmVyQmVmb3JlO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuZWRpdG9yRGl2LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgICBpZiAoY2hpbGQgPT09IHBhcmVudCkge1xuICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyQWZ0ZXI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyLnB1c2goRnJlZVRleHRFZGl0b3IuI2dldE5vZGVDb250ZW50KGNoaWxkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJ1ZmZlckJlZm9yZS5wdXNoKHN0YXJ0Q29udGFpbmVyLm5vZGVWYWx1ZS5zbGljZSgwLCBzdGFydE9mZnNldCkucmVwbGFjZUFsbChFT0xfUEFUVEVSTiwgXCJcIikpO1xuICAgIH0gZWxzZSBpZiAoc3RhcnRDb250YWluZXIgPT09IHRoaXMuZWRpdG9yRGl2KSB7XG4gICAgICBsZXQgYnVmZmVyID0gYnVmZmVyQmVmb3JlO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmVkaXRvckRpdi5jaGlsZE5vZGVzKSB7XG4gICAgICAgIGlmIChpKysgPT09IHN0YXJ0T2Zmc2V0KSB7XG4gICAgICAgICAgYnVmZmVyID0gYnVmZmVyQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLnB1c2goRnJlZVRleHRFZGl0b3IuI2dldE5vZGVDb250ZW50KGNoaWxkKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI2NvbnRlbnQgPSBgJHtidWZmZXJCZWZvcmUuam9pbihcIlxcblwiKX0ke3Bhc3RlfSR7YnVmZmVyQWZ0ZXIuam9pbihcIlxcblwiKX1gO1xuICAgIHRoaXMuI3NldENvbnRlbnQoKTtcbiAgICBjb25zdCBuZXdSYW5nZSA9IG5ldyBSYW5nZSgpO1xuICAgIGxldCBiZWZvcmVMZW5ndGggPSBidWZmZXJCZWZvcmUucmVkdWNlKChhY2MsIGxpbmUpID0+IGFjYyArIGxpbmUubGVuZ3RoLCAwKTtcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIGZpcnN0Q2hpbGRcbiAgICB9IG9mIHRoaXMuZWRpdG9yRGl2LmNoaWxkTm9kZXMpIHtcbiAgICAgIGlmIChmaXJzdENoaWxkLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBmaXJzdENoaWxkLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgICAgIGlmIChiZWZvcmVMZW5ndGggPD0gbGVuZ3RoKSB7XG4gICAgICAgICAgbmV3UmFuZ2Uuc2V0U3RhcnQoZmlyc3RDaGlsZCwgYmVmb3JlTGVuZ3RoKTtcbiAgICAgICAgICBuZXdSYW5nZS5zZXRFbmQoZmlyc3RDaGlsZCwgYmVmb3JlTGVuZ3RoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBiZWZvcmVMZW5ndGggLT0gbGVuZ3RoO1xuICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKG5ld1JhbmdlKTtcbiAgfVxuICAjc2V0Q29udGVudCgpIHtcbiAgICB0aGlzLmVkaXRvckRpdi5yZXBsYWNlQ2hpbGRyZW4oKTtcbiAgICBpZiAoIXRoaXMuI2NvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMuI2NvbnRlbnQuc3BsaXQoXCJcXG5cIikpIHtcbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBkaXYuYXBwZW5kKGxpbmUgPyBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XG4gICAgICB0aGlzLmVkaXRvckRpdi5hcHBlbmQoZGl2KTtcbiAgICB9XG4gIH1cbiAgI3NlcmlhbGl6ZUNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbnRlbnQucmVwbGFjZUFsbChcIlxceGEwXCIsIFwiIFwiKTtcbiAgfVxuICBzdGF0aWMgI2Rlc2VyaWFsaXplQ29udGVudChjb250ZW50KSB7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUFsbChcIiBcIiwgXCJcXHhhMFwiKTtcbiAgfVxuICBnZXQgY29udGVudERpdigpIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JEaXY7XG4gIH1cbiAgc3RhdGljIGRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKSB7XG4gICAgbGV0IGluaXRpYWxEYXRhID0gbnVsbDtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGRlZmF1bHRBcHBlYXJhbmNlRGF0YToge1xuICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICBmb250Q29sb3JcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlY3QsXG4gICAgICAgICAgcm90YXRpb24sXG4gICAgICAgICAgaWRcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dENvbnRlbnQsXG4gICAgICAgIHRleHRQb3NpdGlvbixcbiAgICAgICAgcGFyZW50OiB7XG4gICAgICAgICAgcGFnZToge1xuICAgICAgICAgICAgcGFnZU51bWJlclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSA9IGRhdGE7XG4gICAgICBpZiAoIXRleHRDb250ZW50IHx8IHRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGluaXRpYWxEYXRhID0gZGF0YSA9IHtcbiAgICAgICAgYW5ub3RhdGlvblR5cGU6IEFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhULFxuICAgICAgICBjb2xvcjogQXJyYXkuZnJvbShmb250Q29sb3IpLFxuICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgdmFsdWU6IHRleHRDb250ZW50LmpvaW4oXCJcXG5cIiksXG4gICAgICAgIHBvc2l0aW9uOiB0ZXh0UG9zaXRpb24sXG4gICAgICAgIHBhZ2VJbmRleDogcGFnZU51bWJlciAtIDEsXG4gICAgICAgIHJlY3Q6IHJlY3Quc2xpY2UoMCksXG4gICAgICAgIHJvdGF0aW9uLFxuICAgICAgICBpZCxcbiAgICAgICAgZGVsZXRlZDogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvciA9IHN1cGVyLmRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKTtcbiAgICBlZGl0b3IuI2ZvbnRTaXplID0gZGF0YS5mb250U2l6ZTtcbiAgICBlZGl0b3IuI2NvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoLi4uZGF0YS5jb2xvcik7XG4gICAgZWRpdG9yLiNjb250ZW50ID0gRnJlZVRleHRFZGl0b3IuI2Rlc2VyaWFsaXplQ29udGVudChkYXRhLnZhbHVlKTtcbiAgICBlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCA9IGRhdGEuaWQgfHwgbnVsbDtcbiAgICBlZGl0b3IuI2luaXRpYWxEYXRhID0gaW5pdGlhbERhdGE7XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICBzZXJpYWxpemUoaXNGb3JDb3B5aW5nID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWxldGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgICBpZDogdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkLFxuICAgICAgICBkZWxldGVkOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwYWRkaW5nID0gRnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyAqIHRoaXMucGFyZW50U2NhbGU7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0UmVjdChwYWRkaW5nLCBwYWRkaW5nKTtcbiAgICBjb25zdCBjb2xvciA9IEFubm90YXRpb25FZGl0b3IuX2NvbG9yTWFuYWdlci5jb252ZXJ0KHRoaXMuaXNBdHRhY2hlZFRvRE9NID8gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVkaXRvckRpdikuY29sb3IgOiB0aGlzLiNjb2xvcik7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHtcbiAgICAgIGFubm90YXRpb25UeXBlOiBBbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVCxcbiAgICAgIGNvbG9yLFxuICAgICAgZm9udFNpemU6IHRoaXMuI2ZvbnRTaXplLFxuICAgICAgdmFsdWU6IHRoaXMuI3NlcmlhbGl6ZUNvbnRlbnQoKSxcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICByZWN0LFxuICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sXG4gICAgICBzdHJ1Y3RUcmVlUGFyZW50SWQ6IHRoaXMuX3N0cnVjdFRyZWVQYXJlbnRJZFxuICAgIH07XG4gICAgaWYgKGlzRm9yQ29weWluZykge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmFubm90YXRpb25FbGVtZW50SWQgJiYgIXRoaXMuI2hhc0VsZW1lbnRDaGFuZ2VkKHNlcmlhbGl6ZWQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2VyaWFsaXplZC5pZCA9IHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZDtcbiAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgfVxuICAjaGFzRWxlbWVudENoYW5nZWQoc2VyaWFsaXplZCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHZhbHVlLFxuICAgICAgZm9udFNpemUsXG4gICAgICBjb2xvcixcbiAgICAgIHBhZ2VJbmRleFxuICAgIH0gPSB0aGlzLiNpbml0aWFsRGF0YTtcbiAgICByZXR1cm4gdGhpcy5faGFzQmVlbk1vdmVkIHx8IHNlcmlhbGl6ZWQudmFsdWUgIT09IHZhbHVlIHx8IHNlcmlhbGl6ZWQuZm9udFNpemUgIT09IGZvbnRTaXplIHx8IHNlcmlhbGl6ZWQuY29sb3Iuc29tZSgoYywgaSkgPT4gYyAhPT0gY29sb3JbaV0pIHx8IHNlcmlhbGl6ZWQucGFnZUluZGV4ICE9PSBwYWdlSW5kZXg7XG4gIH1cbiAgcmVuZGVyQW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbikge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBzdXBlci5yZW5kZXJBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uKTtcbiAgICBpZiAodGhpcy5kZWxldGVkKSB7XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gY29udGVudDtcbiAgICBzdHlsZS5mb250U2l6ZSA9IGBjYWxjKCR7dGhpcy4jZm9udFNpemV9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG4gICAgc3R5bGUuY29sb3IgPSB0aGlzLiNjb2xvcjtcbiAgICBjb250ZW50LnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiB0aGlzLiNjb250ZW50LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZGl2LmFwcGVuZChsaW5lID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGluZSkgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xuICAgICAgY29udGVudC5hcHBlbmQoZGl2KTtcbiAgICB9XG4gICAgY29uc3QgcGFkZGluZyA9IEZyZWVUZXh0RWRpdG9yLl9pbnRlcm5hbFBhZGRpbmcgKiB0aGlzLnBhcmVudFNjYWxlO1xuICAgIGFubm90YXRpb24udXBkYXRlRWRpdGVkKHtcbiAgICAgIHJlY3Q6IHRoaXMuZ2V0UmVjdChwYWRkaW5nLCBwYWRkaW5nKSxcbiAgICAgIHBvcHVwQ29udGVudDogdGhpcy4jY29udGVudFxuICAgIH0pO1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIHJlc2V0QW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbikge1xuICAgIHN1cGVyLnJlc2V0QW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbik7XG4gICAgYW5ub3RhdGlvbi5yZXNldEVkaXRlZCgpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9vdXRsaW5lci5qc1xuXG5jbGFzcyBPdXRsaW5lciB7XG4gICNib3g7XG4gICN2ZXJ0aWNhbEVkZ2VzID0gW107XG4gICNpbnRlcnZhbHMgPSBbXTtcbiAgY29uc3RydWN0b3IoYm94ZXMsIGJvcmRlcldpZHRoID0gMCwgaW5uZXJNYXJnaW4gPSAwLCBpc0xUUiA9IHRydWUpIHtcbiAgICBsZXQgbWluWCA9IEluZmluaXR5O1xuICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG4gICAgY29uc3QgTlVNQkVSX09GX0RJR0lUUyA9IDQ7XG4gICAgY29uc3QgRVBTSUxPTiA9IDEwICoqIC1OVU1CRVJfT0ZfRElHSVRTO1xuICAgIGZvciAoY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gb2YgYm94ZXMpIHtcbiAgICAgIGNvbnN0IHgxID0gTWF0aC5mbG9vcigoeCAtIGJvcmRlcldpZHRoKSAvIEVQU0lMT04pICogRVBTSUxPTjtcbiAgICAgIGNvbnN0IHgyID0gTWF0aC5jZWlsKCh4ICsgd2lkdGggKyBib3JkZXJXaWR0aCkgLyBFUFNJTE9OKSAqIEVQU0lMT047XG4gICAgICBjb25zdCB5MSA9IE1hdGguZmxvb3IoKHkgLSBib3JkZXJXaWR0aCkgLyBFUFNJTE9OKSAqIEVQU0lMT047XG4gICAgICBjb25zdCB5MiA9IE1hdGguY2VpbCgoeSArIGhlaWdodCArIGJvcmRlcldpZHRoKSAvIEVQU0lMT04pICogRVBTSUxPTjtcbiAgICAgIGNvbnN0IGxlZnQgPSBbeDEsIHkxLCB5MiwgdHJ1ZV07XG4gICAgICBjb25zdCByaWdodCA9IFt4MiwgeTEsIHkyLCBmYWxzZV07XG4gICAgICB0aGlzLiN2ZXJ0aWNhbEVkZ2VzLnB1c2gobGVmdCwgcmlnaHQpO1xuICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHgxKTtcbiAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4Mik7XG4gICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeTEpO1xuICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkyKTtcbiAgICB9XG4gICAgY29uc3QgYmJveFdpZHRoID0gbWF4WCAtIG1pblggKyAyICogaW5uZXJNYXJnaW47XG4gICAgY29uc3QgYmJveEhlaWdodCA9IG1heFkgLSBtaW5ZICsgMiAqIGlubmVyTWFyZ2luO1xuICAgIGNvbnN0IHNoaWZ0ZWRNaW5YID0gbWluWCAtIGlubmVyTWFyZ2luO1xuICAgIGNvbnN0IHNoaWZ0ZWRNaW5ZID0gbWluWSAtIGlubmVyTWFyZ2luO1xuICAgIGNvbnN0IGxhc3RFZGdlID0gdGhpcy4jdmVydGljYWxFZGdlcy5hdChpc0xUUiA/IC0xIDogLTIpO1xuICAgIGNvbnN0IGxhc3RQb2ludCA9IFtsYXN0RWRnZVswXSwgbGFzdEVkZ2VbMl1dO1xuICAgIGZvciAoY29uc3QgZWRnZSBvZiB0aGlzLiN2ZXJ0aWNhbEVkZ2VzKSB7XG4gICAgICBjb25zdCBbeCwgeTEsIHkyXSA9IGVkZ2U7XG4gICAgICBlZGdlWzBdID0gKHggLSBzaGlmdGVkTWluWCkgLyBiYm94V2lkdGg7XG4gICAgICBlZGdlWzFdID0gKHkxIC0gc2hpZnRlZE1pblkpIC8gYmJveEhlaWdodDtcbiAgICAgIGVkZ2VbMl0gPSAoeTIgLSBzaGlmdGVkTWluWSkgLyBiYm94SGVpZ2h0O1xuICAgIH1cbiAgICB0aGlzLiNib3ggPSB7XG4gICAgICB4OiBzaGlmdGVkTWluWCxcbiAgICAgIHk6IHNoaWZ0ZWRNaW5ZLFxuICAgICAgd2lkdGg6IGJib3hXaWR0aCxcbiAgICAgIGhlaWdodDogYmJveEhlaWdodCxcbiAgICAgIGxhc3RQb2ludFxuICAgIH07XG4gIH1cbiAgZ2V0T3V0bGluZXMoKSB7XG4gICAgdGhpcy4jdmVydGljYWxFZGdlcy5zb3J0KChhLCBiKSA9PiBhWzBdIC0gYlswXSB8fCBhWzFdIC0gYlsxXSB8fCBhWzJdIC0gYlsyXSk7XG4gICAgY29uc3Qgb3V0bGluZVZlcnRpY2FsRWRnZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVkZ2Ugb2YgdGhpcy4jdmVydGljYWxFZGdlcykge1xuICAgICAgaWYgKGVkZ2VbM10pIHtcbiAgICAgICAgb3V0bGluZVZlcnRpY2FsRWRnZXMucHVzaCguLi50aGlzLiNicmVha0VkZ2UoZWRnZSkpO1xuICAgICAgICB0aGlzLiNpbnNlcnQoZWRnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiNyZW1vdmUoZWRnZSk7XG4gICAgICAgIG91dGxpbmVWZXJ0aWNhbEVkZ2VzLnB1c2goLi4udGhpcy4jYnJlYWtFZGdlKGVkZ2UpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI2dldE91dGxpbmVzKG91dGxpbmVWZXJ0aWNhbEVkZ2VzKTtcbiAgfVxuICAjZ2V0T3V0bGluZXMob3V0bGluZVZlcnRpY2FsRWRnZXMpIHtcbiAgICBjb25zdCBlZGdlcyA9IFtdO1xuICAgIGNvbnN0IGFsbEVkZ2VzID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3QgZWRnZSBvZiBvdXRsaW5lVmVydGljYWxFZGdlcykge1xuICAgICAgY29uc3QgW3gsIHkxLCB5Ml0gPSBlZGdlO1xuICAgICAgZWRnZXMucHVzaChbeCwgeTEsIGVkZ2VdLCBbeCwgeTIsIGVkZ2VdKTtcbiAgICB9XG4gICAgZWRnZXMuc29ydCgoYSwgYikgPT4gYVsxXSAtIGJbMV0gfHwgYVswXSAtIGJbMF0pO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGVkZ2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIGNvbnN0IGVkZ2UxID0gZWRnZXNbaV1bMl07XG4gICAgICBjb25zdCBlZGdlMiA9IGVkZ2VzW2kgKyAxXVsyXTtcbiAgICAgIGVkZ2UxLnB1c2goZWRnZTIpO1xuICAgICAgZWRnZTIucHVzaChlZGdlMSk7XG4gICAgICBhbGxFZGdlcy5hZGQoZWRnZTEpO1xuICAgICAgYWxsRWRnZXMuYWRkKGVkZ2UyKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0bGluZXMgPSBbXTtcbiAgICBsZXQgb3V0bGluZTtcbiAgICB3aGlsZSAoYWxsRWRnZXMuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSBhbGxFZGdlcy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBsZXQgW3gsIHkxLCB5MiwgZWRnZTEsIGVkZ2UyXSA9IGVkZ2U7XG4gICAgICBhbGxFZGdlcy5kZWxldGUoZWRnZSk7XG4gICAgICBsZXQgbGFzdFBvaW50WCA9IHg7XG4gICAgICBsZXQgbGFzdFBvaW50WSA9IHkxO1xuICAgICAgb3V0bGluZSA9IFt4LCB5Ml07XG4gICAgICBvdXRsaW5lcy5wdXNoKG91dGxpbmUpO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgbGV0IGU7XG4gICAgICAgIGlmIChhbGxFZGdlcy5oYXMoZWRnZTEpKSB7XG4gICAgICAgICAgZSA9IGVkZ2UxO1xuICAgICAgICB9IGVsc2UgaWYgKGFsbEVkZ2VzLmhhcyhlZGdlMikpIHtcbiAgICAgICAgICBlID0gZWRnZTI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgYWxsRWRnZXMuZGVsZXRlKGUpO1xuICAgICAgICBbeCwgeTEsIHkyLCBlZGdlMSwgZWRnZTJdID0gZTtcbiAgICAgICAgaWYgKGxhc3RQb2ludFggIT09IHgpIHtcbiAgICAgICAgICBvdXRsaW5lLnB1c2gobGFzdFBvaW50WCwgbGFzdFBvaW50WSwgeCwgbGFzdFBvaW50WSA9PT0geTEgPyB5MSA6IHkyKTtcbiAgICAgICAgICBsYXN0UG9pbnRYID0geDtcbiAgICAgICAgfVxuICAgICAgICBsYXN0UG9pbnRZID0gbGFzdFBvaW50WSA9PT0geTEgPyB5MiA6IHkxO1xuICAgICAgfVxuICAgICAgb3V0bGluZS5wdXNoKGxhc3RQb2ludFgsIGxhc3RQb2ludFkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEhpZ2hsaWdodE91dGxpbmUob3V0bGluZXMsIHRoaXMuI2JveCk7XG4gIH1cbiAgI2JpbmFyeVNlYXJjaCh5KSB7XG4gICAgY29uc3QgYXJyYXkgPSB0aGlzLiNpbnRlcnZhbHM7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgZW5kID0gYXJyYXkubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7XG4gICAgICBjb25zdCBtaWRkbGUgPSBzdGFydCArIGVuZCA+PiAxO1xuICAgICAgY29uc3QgeTEgPSBhcnJheVttaWRkbGVdWzBdO1xuICAgICAgaWYgKHkxID09PSB5KSB7XG4gICAgICAgIHJldHVybiBtaWRkbGU7XG4gICAgICB9XG4gICAgICBpZiAoeTEgPCB5KSB7XG4gICAgICAgIHN0YXJ0ID0gbWlkZGxlICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCA9IG1pZGRsZSAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbmQgKyAxO1xuICB9XG4gICNpbnNlcnQoWywgeTEsIHkyXSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy4jYmluYXJ5U2VhcmNoKHkxKTtcbiAgICB0aGlzLiNpbnRlcnZhbHMuc3BsaWNlKGluZGV4LCAwLCBbeTEsIHkyXSk7XG4gIH1cbiAgI3JlbW92ZShbLCB5MSwgeTJdKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNiaW5hcnlTZWFyY2goeTEpO1xuICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IHRoaXMuI2ludGVydmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy4jaW50ZXJ2YWxzW2ldO1xuICAgICAgaWYgKHN0YXJ0ICE9PSB5MSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA9PT0geTEgJiYgZW5kID09PSB5Mikge1xuICAgICAgICB0aGlzLiNpbnRlcnZhbHMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBpbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLiNpbnRlcnZhbHNbaV07XG4gICAgICBpZiAoc3RhcnQgIT09IHkxKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ID09PSB5MSAmJiBlbmQgPT09IHkyKSB7XG4gICAgICAgIHRoaXMuI2ludGVydmFscy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI2JyZWFrRWRnZShlZGdlKSB7XG4gICAgY29uc3QgW3gsIHkxLCB5Ml0gPSBlZGdlO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbW3gsIHkxLCB5Ml1dO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy4jYmluYXJ5U2VhcmNoKHkyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuI2ludGVydmFsc1tpXTtcbiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJlc3VsdHMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICBjb25zdCBbLCB5MywgeTRdID0gcmVzdWx0c1tqXTtcbiAgICAgICAgaWYgKGVuZCA8PSB5MyB8fCB5NCA8PSBzdGFydCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5MyA+PSBzdGFydCkge1xuICAgICAgICAgIGlmICh5NCA+IGVuZCkge1xuICAgICAgICAgICAgcmVzdWx0c1tqXVsxXSA9IGVuZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGpqID09PSAxKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdHMuc3BsaWNlKGosIDEpO1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgamotLTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0c1tqXVsyXSA9IHN0YXJ0O1xuICAgICAgICBpZiAoeTQgPiBlbmQpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goW3gsIGVuZCwgeTRdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuY2xhc3MgT3V0bGluZSB7XG4gIHRvU1ZHUGF0aCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN0cmFjdCBtZXRob2QgYHRvU1ZHUGF0aGAgbXVzdCBiZSBpbXBsZW1lbnRlZC5cIik7XG4gIH1cbiAgZ2V0IGJveCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN0cmFjdCBnZXR0ZXIgYGJveGAgbXVzdCBiZSBpbXBsZW1lbnRlZC5cIik7XG4gIH1cbiAgc2VyaWFsaXplKF9iYm94LCBfcm90YXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN0cmFjdCBtZXRob2QgYHNlcmlhbGl6ZWAgbXVzdCBiZSBpbXBsZW1lbnRlZC5cIik7XG4gIH1cbiAgZ2V0IGZyZWUoKSB7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBGcmVlSGlnaGxpZ2h0T3V0bGluZTtcbiAgfVxufVxuY2xhc3MgSGlnaGxpZ2h0T3V0bGluZSBleHRlbmRzIE91dGxpbmUge1xuICAjYm94O1xuICAjb3V0bGluZXM7XG4gIGNvbnN0cnVjdG9yKG91dGxpbmVzLCBib3gpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI291dGxpbmVzID0gb3V0bGluZXM7XG4gICAgdGhpcy4jYm94ID0gYm94O1xuICB9XG4gIHRvU1ZHUGF0aCgpIHtcbiAgICBjb25zdCBidWZmZXIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBvbHlnb24gb2YgdGhpcy4jb3V0bGluZXMpIHtcbiAgICAgIGxldCBbcHJldlgsIHByZXZZXSA9IHBvbHlnb247XG4gICAgICBidWZmZXIucHVzaChgTSR7cHJldlh9ICR7cHJldll9YCk7XG4gICAgICBmb3IgKGxldCBpID0gMjsgaSA8IHBvbHlnb24ubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgY29uc3QgeCA9IHBvbHlnb25baV07XG4gICAgICAgIGNvbnN0IHkgPSBwb2x5Z29uW2kgKyAxXTtcbiAgICAgICAgaWYgKHggPT09IHByZXZYKSB7XG4gICAgICAgICAgYnVmZmVyLnB1c2goYFYke3l9YCk7XG4gICAgICAgICAgcHJldlkgPSB5O1xuICAgICAgICB9IGVsc2UgaWYgKHkgPT09IHByZXZZKSB7XG4gICAgICAgICAgYnVmZmVyLnB1c2goYEgke3h9YCk7XG4gICAgICAgICAgcHJldlggPSB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBidWZmZXIucHVzaChcIlpcIik7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXIuam9pbihcIiBcIik7XG4gIH1cbiAgc2VyaWFsaXplKFtibFgsIGJsWSwgdHJYLCB0clldLCBfcm90YXRpb24pIHtcbiAgICBjb25zdCBvdXRsaW5lcyA9IFtdO1xuICAgIGNvbnN0IHdpZHRoID0gdHJYIC0gYmxYO1xuICAgIGNvbnN0IGhlaWdodCA9IHRyWSAtIGJsWTtcbiAgICBmb3IgKGNvbnN0IG91dGxpbmUgb2YgdGhpcy4jb3V0bGluZXMpIHtcbiAgICAgIGNvbnN0IHBvaW50cyA9IG5ldyBBcnJheShvdXRsaW5lLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dGxpbmUubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgcG9pbnRzW2ldID0gYmxYICsgb3V0bGluZVtpXSAqIHdpZHRoO1xuICAgICAgICBwb2ludHNbaSArIDFdID0gdHJZIC0gb3V0bGluZVtpICsgMV0gKiBoZWlnaHQ7XG4gICAgICB9XG4gICAgICBvdXRsaW5lcy5wdXNoKHBvaW50cyk7XG4gICAgfVxuICAgIHJldHVybiBvdXRsaW5lcztcbiAgfVxuICBnZXQgYm94KCkge1xuICAgIHJldHVybiB0aGlzLiNib3g7XG4gIH1cbn1cbmNsYXNzIEZyZWVPdXRsaW5lciB7XG4gICNib3g7XG4gICNib3R0b20gPSBbXTtcbiAgI2lubmVyTWFyZ2luO1xuICAjaXNMVFI7XG4gICN0b3AgPSBbXTtcbiAgI2xhc3QgPSBuZXcgRmxvYXQ2NEFycmF5KDE4KTtcbiAgI2xhc3RYO1xuICAjbGFzdFk7XG4gICNtaW47XG4gICNtaW5fZGlzdDtcbiAgI3NjYWxlRmFjdG9yO1xuICAjdGhpY2tuZXNzO1xuICAjcG9pbnRzID0gW107XG4gIHN0YXRpYyAjTUlOX0RJU1QgPSA4O1xuICBzdGF0aWMgI01JTl9ESUZGID0gMjtcbiAgc3RhdGljICNNSU4gPSBGcmVlT3V0bGluZXIuI01JTl9ESVNUICsgRnJlZU91dGxpbmVyLiNNSU5fRElGRjtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHgsXG4gICAgeVxuICB9LCBib3gsIHNjYWxlRmFjdG9yLCB0aGlja25lc3MsIGlzTFRSLCBpbm5lck1hcmdpbiA9IDApIHtcbiAgICB0aGlzLiNib3ggPSBib3g7XG4gICAgdGhpcy4jdGhpY2tuZXNzID0gdGhpY2tuZXNzICogc2NhbGVGYWN0b3I7XG4gICAgdGhpcy4jaXNMVFIgPSBpc0xUUjtcbiAgICB0aGlzLiNsYXN0LnNldChbTmFOLCBOYU4sIE5hTiwgTmFOLCB4LCB5XSwgNik7XG4gICAgdGhpcy4jaW5uZXJNYXJnaW4gPSBpbm5lck1hcmdpbjtcbiAgICB0aGlzLiNtaW5fZGlzdCA9IEZyZWVPdXRsaW5lci4jTUlOX0RJU1QgKiBzY2FsZUZhY3RvcjtcbiAgICB0aGlzLiNtaW4gPSBGcmVlT3V0bGluZXIuI01JTiAqIHNjYWxlRmFjdG9yO1xuICAgIHRoaXMuI3NjYWxlRmFjdG9yID0gc2NhbGVGYWN0b3I7XG4gICAgdGhpcy4jcG9pbnRzLnB1c2goeCwgeSk7XG4gIH1cbiAgZ2V0IGZyZWUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gaXNOYU4odGhpcy4jbGFzdFs4XSk7XG4gIH1cbiAgI2dldExhc3RDb29yZHMoKSB7XG4gICAgY29uc3QgbGFzdFRvcCA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoNCwgNik7XG4gICAgY29uc3QgbGFzdEJvdHRvbSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoMTYsIDE4KTtcbiAgICBjb25zdCBbeCwgeSwgd2lkdGgsIGhlaWdodF0gPSB0aGlzLiNib3g7XG4gICAgcmV0dXJuIFsodGhpcy4jbGFzdFggKyAobGFzdFRvcFswXSAtIGxhc3RCb3R0b21bMF0pIC8gMiAtIHgpIC8gd2lkdGgsICh0aGlzLiNsYXN0WSArIChsYXN0VG9wWzFdIC0gbGFzdEJvdHRvbVsxXSkgLyAyIC0geSkgLyBoZWlnaHQsICh0aGlzLiNsYXN0WCArIChsYXN0Qm90dG9tWzBdIC0gbGFzdFRvcFswXSkgLyAyIC0geCkgLyB3aWR0aCwgKHRoaXMuI2xhc3RZICsgKGxhc3RCb3R0b21bMV0gLSBsYXN0VG9wWzFdKSAvIDIgLSB5KSAvIGhlaWdodF07XG4gIH1cbiAgYWRkKHtcbiAgICB4LFxuICAgIHlcbiAgfSkge1xuICAgIHRoaXMuI2xhc3RYID0geDtcbiAgICB0aGlzLiNsYXN0WSA9IHk7XG4gICAgY29uc3QgW2xheWVyWCwgbGF5ZXJZLCBsYXllcldpZHRoLCBsYXllckhlaWdodF0gPSB0aGlzLiNib3g7XG4gICAgbGV0IFt4MSwgeTEsIHgyLCB5Ml0gPSB0aGlzLiNsYXN0LnN1YmFycmF5KDgsIDEyKTtcbiAgICBjb25zdCBkaWZmWCA9IHggLSB4MjtcbiAgICBjb25zdCBkaWZmWSA9IHkgLSB5MjtcbiAgICBjb25zdCBkID0gTWF0aC5oeXBvdChkaWZmWCwgZGlmZlkpO1xuICAgIGlmIChkIDwgdGhpcy4jbWluKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGRpZmZEID0gZCAtIHRoaXMuI21pbl9kaXN0O1xuICAgIGNvbnN0IEsgPSBkaWZmRCAvIGQ7XG4gICAgY29uc3Qgc2hpZnRYID0gSyAqIGRpZmZYO1xuICAgIGNvbnN0IHNoaWZ0WSA9IEsgKiBkaWZmWTtcbiAgICBsZXQgeDAgPSB4MTtcbiAgICBsZXQgeTAgPSB5MTtcbiAgICB4MSA9IHgyO1xuICAgIHkxID0geTI7XG4gICAgeDIgKz0gc2hpZnRYO1xuICAgIHkyICs9IHNoaWZ0WTtcbiAgICB0aGlzLiNwb2ludHM/LnB1c2goeCwgeSk7XG4gICAgY29uc3QgblggPSAtc2hpZnRZIC8gZGlmZkQ7XG4gICAgY29uc3QgblkgPSBzaGlmdFggLyBkaWZmRDtcbiAgICBjb25zdCB0aFggPSBuWCAqIHRoaXMuI3RoaWNrbmVzcztcbiAgICBjb25zdCB0aFkgPSBuWSAqIHRoaXMuI3RoaWNrbmVzcztcbiAgICB0aGlzLiNsYXN0LnNldCh0aGlzLiNsYXN0LnN1YmFycmF5KDIsIDgpLCAwKTtcbiAgICB0aGlzLiNsYXN0LnNldChbeDIgKyB0aFgsIHkyICsgdGhZXSwgNCk7XG4gICAgdGhpcy4jbGFzdC5zZXQodGhpcy4jbGFzdC5zdWJhcnJheSgxNCwgMTgpLCAxMik7XG4gICAgdGhpcy4jbGFzdC5zZXQoW3gyIC0gdGhYLCB5MiAtIHRoWV0sIDE2KTtcbiAgICBpZiAoaXNOYU4odGhpcy4jbGFzdFs2XSkpIHtcbiAgICAgIGlmICh0aGlzLiN0b3AubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuI2xhc3Quc2V0KFt4MSArIHRoWCwgeTEgKyB0aFldLCAyKTtcbiAgICAgICAgdGhpcy4jdG9wLnB1c2goTmFOLCBOYU4sIE5hTiwgTmFOLCAoeDEgKyB0aFggLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKHkxICsgdGhZIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0KTtcbiAgICAgICAgdGhpcy4jbGFzdC5zZXQoW3gxIC0gdGhYLCB5MSAtIHRoWV0sIDE0KTtcbiAgICAgICAgdGhpcy4jYm90dG9tLnB1c2goTmFOLCBOYU4sIE5hTiwgTmFOLCAoeDEgLSB0aFggLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKHkxIC0gdGhZIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI2xhc3Quc2V0KFt4MCwgeTAsIHgxLCB5MSwgeDIsIHkyXSwgNik7XG4gICAgICByZXR1cm4gIXRoaXMuaXNFbXB0eSgpO1xuICAgIH1cbiAgICB0aGlzLiNsYXN0LnNldChbeDAsIHkwLCB4MSwgeTEsIHgyLCB5Ml0sIDYpO1xuICAgIGNvbnN0IGFuZ2xlID0gTWF0aC5hYnMoTWF0aC5hdGFuMih5MCAtIHkxLCB4MCAtIHgxKSAtIE1hdGguYXRhbjIoc2hpZnRZLCBzaGlmdFgpKTtcbiAgICBpZiAoYW5nbGUgPCBNYXRoLlBJIC8gMikge1xuICAgICAgW3gxLCB5MSwgeDIsIHkyXSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoMiwgNik7XG4gICAgICB0aGlzLiN0b3AucHVzaChOYU4sIE5hTiwgTmFOLCBOYU4sICgoeDEgKyB4MikgLyAyIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICgoeTEgKyB5MikgLyAyIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0KTtcbiAgICAgIFt4MSwgeTEsIHgwLCB5MF0gPSB0aGlzLiNsYXN0LnN1YmFycmF5KDE0LCAxOCk7XG4gICAgICB0aGlzLiNib3R0b20ucHVzaChOYU4sIE5hTiwgTmFOLCBOYU4sICgoeDAgKyB4MSkgLyAyIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICgoeTAgKyB5MSkgLyAyIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBbeDAsIHkwLCB4MSwgeTEsIHgyLCB5Ml0gPSB0aGlzLiNsYXN0LnN1YmFycmF5KDAsIDYpO1xuICAgIHRoaXMuI3RvcC5wdXNoKCgoeDAgKyA1ICogeDEpIC8gNiAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoKHkwICsgNSAqIHkxKSAvIDYgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQsICgoNSAqIHgxICsgeDIpIC8gNiAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoKDUgKiB5MSArIHkyKSAvIDYgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQsICgoeDEgKyB4MikgLyAyIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICgoeTEgKyB5MikgLyAyIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0KTtcbiAgICBbeDIsIHkyLCB4MSwgeTEsIHgwLCB5MF0gPSB0aGlzLiNsYXN0LnN1YmFycmF5KDEyLCAxOCk7XG4gICAgdGhpcy4jYm90dG9tLnB1c2goKCh4MCArIDUgKiB4MSkgLyA2IC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICgoeTAgKyA1ICogeTEpIC8gNiAtIGxheWVyWSkgLyBsYXllckhlaWdodCwgKCg1ICogeDEgKyB4MikgLyA2IC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICgoNSAqIHkxICsgeTIpIC8gNiAtIGxheWVyWSkgLyBsYXllckhlaWdodCwgKCh4MSArIHgyKSAvIDIgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCh5MSArIHkyKSAvIDIgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRvU1ZHUGF0aCgpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCB0b3AgPSB0aGlzLiN0b3A7XG4gICAgY29uc3QgYm90dG9tID0gdGhpcy4jYm90dG9tO1xuICAgIGNvbnN0IGxhc3RUb3AgPSB0aGlzLiNsYXN0LnN1YmFycmF5KDQsIDYpO1xuICAgIGNvbnN0IGxhc3RCb3R0b20gPSB0aGlzLiNsYXN0LnN1YmFycmF5KDE2LCAxOCk7XG4gICAgY29uc3QgW3gsIHksIHdpZHRoLCBoZWlnaHRdID0gdGhpcy4jYm94O1xuICAgIGNvbnN0IFtsYXN0VG9wWCwgbGFzdFRvcFksIGxhc3RCb3R0b21YLCBsYXN0Qm90dG9tWV0gPSB0aGlzLiNnZXRMYXN0Q29vcmRzKCk7XG4gICAgaWYgKGlzTmFOKHRoaXMuI2xhc3RbNl0pICYmICF0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIGBNJHsodGhpcy4jbGFzdFsyXSAtIHgpIC8gd2lkdGh9ICR7KHRoaXMuI2xhc3RbM10gLSB5KSAvIGhlaWdodH0gTCR7KHRoaXMuI2xhc3RbNF0gLSB4KSAvIHdpZHRofSAkeyh0aGlzLiNsYXN0WzVdIC0geSkgLyBoZWlnaHR9IEwke2xhc3RUb3BYfSAke2xhc3RUb3BZfSBMJHtsYXN0Qm90dG9tWH0gJHtsYXN0Qm90dG9tWX0gTCR7KHRoaXMuI2xhc3RbMTZdIC0geCkgLyB3aWR0aH0gJHsodGhpcy4jbGFzdFsxN10gLSB5KSAvIGhlaWdodH0gTCR7KHRoaXMuI2xhc3RbMTRdIC0geCkgLyB3aWR0aH0gJHsodGhpcy4jbGFzdFsxNV0gLSB5KSAvIGhlaWdodH0gWmA7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZmZlciA9IFtdO1xuICAgIGJ1ZmZlci5wdXNoKGBNJHt0b3BbNF19ICR7dG9wWzVdfWApO1xuICAgIGZvciAobGV0IGkgPSA2OyBpIDwgdG9wLmxlbmd0aDsgaSArPSA2KSB7XG4gICAgICBpZiAoaXNOYU4odG9wW2ldKSkge1xuICAgICAgICBidWZmZXIucHVzaChgTCR7dG9wW2kgKyA0XX0gJHt0b3BbaSArIDVdfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyLnB1c2goYEMke3RvcFtpXX0gJHt0b3BbaSArIDFdfSAke3RvcFtpICsgMl19ICR7dG9wW2kgKyAzXX0gJHt0b3BbaSArIDRdfSAke3RvcFtpICsgNV19YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGJ1ZmZlci5wdXNoKGBMJHsobGFzdFRvcFswXSAtIHgpIC8gd2lkdGh9ICR7KGxhc3RUb3BbMV0gLSB5KSAvIGhlaWdodH0gTCR7bGFzdFRvcFh9ICR7bGFzdFRvcFl9IEwke2xhc3RCb3R0b21YfSAke2xhc3RCb3R0b21ZfSBMJHsobGFzdEJvdHRvbVswXSAtIHgpIC8gd2lkdGh9ICR7KGxhc3RCb3R0b21bMV0gLSB5KSAvIGhlaWdodH1gKTtcbiAgICBmb3IgKGxldCBpID0gYm90dG9tLmxlbmd0aCAtIDY7IGkgPj0gNjsgaSAtPSA2KSB7XG4gICAgICBpZiAoaXNOYU4oYm90dG9tW2ldKSkge1xuICAgICAgICBidWZmZXIucHVzaChgTCR7Ym90dG9tW2kgKyA0XX0gJHtib3R0b21baSArIDVdfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyLnB1c2goYEMke2JvdHRvbVtpXX0gJHtib3R0b21baSArIDFdfSAke2JvdHRvbVtpICsgMl19ICR7Ym90dG9tW2kgKyAzXX0gJHtib3R0b21baSArIDRdfSAke2JvdHRvbVtpICsgNV19YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGJ1ZmZlci5wdXNoKGBMJHtib3R0b21bNF19ICR7Ym90dG9tWzVdfSBaYCk7XG4gICAgcmV0dXJuIGJ1ZmZlci5qb2luKFwiIFwiKTtcbiAgfVxuICBnZXRPdXRsaW5lcygpIHtcbiAgICBjb25zdCB0b3AgPSB0aGlzLiN0b3A7XG4gICAgY29uc3QgYm90dG9tID0gdGhpcy4jYm90dG9tO1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLiNsYXN0O1xuICAgIGNvbnN0IGxhc3RUb3AgPSBsYXN0LnN1YmFycmF5KDQsIDYpO1xuICAgIGNvbnN0IGxhc3RCb3R0b20gPSBsYXN0LnN1YmFycmF5KDE2LCAxOCk7XG4gICAgY29uc3QgW2xheWVyWCwgbGF5ZXJZLCBsYXllcldpZHRoLCBsYXllckhlaWdodF0gPSB0aGlzLiNib3g7XG4gICAgY29uc3QgcG9pbnRzID0gbmV3IEZsb2F0NjRBcnJheSgodGhpcy4jcG9pbnRzPy5sZW5ndGggPz8gMCkgKyAyKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoIC0gMjsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIHBvaW50c1tpXSA9ICh0aGlzLiNwb2ludHNbaV0gLSBsYXllclgpIC8gbGF5ZXJXaWR0aDtcbiAgICAgIHBvaW50c1tpICsgMV0gPSAodGhpcy4jcG9pbnRzW2kgKyAxXSAtIGxheWVyWSkgLyBsYXllckhlaWdodDtcbiAgICB9XG4gICAgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAyXSA9ICh0aGlzLiNsYXN0WCAtIGxheWVyWCkgLyBsYXllcldpZHRoO1xuICAgIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV0gPSAodGhpcy4jbGFzdFkgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQ7XG4gICAgY29uc3QgW2xhc3RUb3BYLCBsYXN0VG9wWSwgbGFzdEJvdHRvbVgsIGxhc3RCb3R0b21ZXSA9IHRoaXMuI2dldExhc3RDb29yZHMoKTtcbiAgICBpZiAoaXNOYU4obGFzdFs2XSkgJiYgIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICBjb25zdCBvdXRsaW5lID0gbmV3IEZsb2F0NjRBcnJheSgzNik7XG4gICAgICBvdXRsaW5lLnNldChbTmFOLCBOYU4sIE5hTiwgTmFOLCAobGFzdFsyXSAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAobGFzdFszXSAtIGxheWVyWSkgLyBsYXllckhlaWdodCwgTmFOLCBOYU4sIE5hTiwgTmFOLCAobGFzdFs0XSAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAobGFzdFs1XSAtIGxheWVyWSkgLyBsYXllckhlaWdodCwgTmFOLCBOYU4sIE5hTiwgTmFOLCBsYXN0VG9wWCwgbGFzdFRvcFksIE5hTiwgTmFOLCBOYU4sIE5hTiwgbGFzdEJvdHRvbVgsIGxhc3RCb3R0b21ZLCBOYU4sIE5hTiwgTmFOLCBOYU4sIChsYXN0WzE2XSAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAobGFzdFsxN10gLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQsIE5hTiwgTmFOLCBOYU4sIE5hTiwgKGxhc3RbMTRdIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsIChsYXN0WzE1XSAtIGxheWVyWSkgLyBsYXllckhlaWdodF0sIDApO1xuICAgICAgcmV0dXJuIG5ldyBGcmVlSGlnaGxpZ2h0T3V0bGluZShvdXRsaW5lLCBwb2ludHMsIHRoaXMuI2JveCwgdGhpcy4jc2NhbGVGYWN0b3IsIHRoaXMuI2lubmVyTWFyZ2luLCB0aGlzLiNpc0xUUik7XG4gICAgfVxuICAgIGNvbnN0IG91dGxpbmUgPSBuZXcgRmxvYXQ2NEFycmF5KHRoaXMuI3RvcC5sZW5ndGggKyAyNCArIHRoaXMuI2JvdHRvbS5sZW5ndGgpO1xuICAgIGxldCBOID0gdG9wLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE47IGkgKz0gMikge1xuICAgICAgaWYgKGlzTmFOKHRvcFtpXSkpIHtcbiAgICAgICAgb3V0bGluZVtpXSA9IG91dGxpbmVbaSArIDFdID0gTmFOO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG91dGxpbmVbaV0gPSB0b3BbaV07XG4gICAgICBvdXRsaW5lW2kgKyAxXSA9IHRvcFtpICsgMV07XG4gICAgfVxuICAgIG91dGxpbmUuc2V0KFtOYU4sIE5hTiwgTmFOLCBOYU4sIChsYXN0VG9wWzBdIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsIChsYXN0VG9wWzFdIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCBOYU4sIE5hTiwgTmFOLCBOYU4sIGxhc3RUb3BYLCBsYXN0VG9wWSwgTmFOLCBOYU4sIE5hTiwgTmFOLCBsYXN0Qm90dG9tWCwgbGFzdEJvdHRvbVksIE5hTiwgTmFOLCBOYU4sIE5hTiwgKGxhc3RCb3R0b21bMF0gLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKGxhc3RCb3R0b21bMV0gLSBsYXllclkpIC8gbGF5ZXJIZWlnaHRdLCBOKTtcbiAgICBOICs9IDI0O1xuICAgIGZvciAobGV0IGkgPSBib3R0b20ubGVuZ3RoIC0gNjsgaSA+PSA2OyBpIC09IDYpIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNjsgaiArPSAyKSB7XG4gICAgICAgIGlmIChpc05hTihib3R0b21baSArIGpdKSkge1xuICAgICAgICAgIG91dGxpbmVbTl0gPSBvdXRsaW5lW04gKyAxXSA9IE5hTjtcbiAgICAgICAgICBOICs9IDI7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgb3V0bGluZVtOXSA9IGJvdHRvbVtpICsgal07XG4gICAgICAgIG91dGxpbmVbTiArIDFdID0gYm90dG9tW2kgKyBqICsgMV07XG4gICAgICAgIE4gKz0gMjtcbiAgICAgIH1cbiAgICB9XG4gICAgb3V0bGluZS5zZXQoW05hTiwgTmFOLCBOYU4sIE5hTiwgYm90dG9tWzRdLCBib3R0b21bNV1dLCBOKTtcbiAgICByZXR1cm4gbmV3IEZyZWVIaWdobGlnaHRPdXRsaW5lKG91dGxpbmUsIHBvaW50cywgdGhpcy4jYm94LCB0aGlzLiNzY2FsZUZhY3RvciwgdGhpcy4jaW5uZXJNYXJnaW4sIHRoaXMuI2lzTFRSKTtcbiAgfVxufVxuY2xhc3MgRnJlZUhpZ2hsaWdodE91dGxpbmUgZXh0ZW5kcyBPdXRsaW5lIHtcbiAgI2JveDtcbiAgI2Jib3ggPSBudWxsO1xuICAjaW5uZXJNYXJnaW47XG4gICNpc0xUUjtcbiAgI3BvaW50cztcbiAgI3NjYWxlRmFjdG9yO1xuICAjb3V0bGluZTtcbiAgY29uc3RydWN0b3Iob3V0bGluZSwgcG9pbnRzLCBib3gsIHNjYWxlRmFjdG9yLCBpbm5lck1hcmdpbiwgaXNMVFIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI291dGxpbmUgPSBvdXRsaW5lO1xuICAgIHRoaXMuI3BvaW50cyA9IHBvaW50cztcbiAgICB0aGlzLiNib3ggPSBib3g7XG4gICAgdGhpcy4jc2NhbGVGYWN0b3IgPSBzY2FsZUZhY3RvcjtcbiAgICB0aGlzLiNpbm5lck1hcmdpbiA9IGlubmVyTWFyZ2luO1xuICAgIHRoaXMuI2lzTFRSID0gaXNMVFI7XG4gICAgdGhpcy4jY29tcHV0ZU1pbk1heChpc0xUUik7XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSB0aGlzLiNiYm94O1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG91dGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgb3V0bGluZVtpXSA9IChvdXRsaW5lW2ldIC0geCkgLyB3aWR0aDtcbiAgICAgIG91dGxpbmVbaSArIDFdID0gKG91dGxpbmVbaSArIDFdIC0geSkgLyBoZWlnaHQ7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBwb2ludHNbaV0gPSAocG9pbnRzW2ldIC0geCkgLyB3aWR0aDtcbiAgICAgIHBvaW50c1tpICsgMV0gPSAocG9pbnRzW2kgKyAxXSAtIHkpIC8gaGVpZ2h0O1xuICAgIH1cbiAgfVxuICB0b1NWR1BhdGgoKSB7XG4gICAgY29uc3QgYnVmZmVyID0gW2BNJHt0aGlzLiNvdXRsaW5lWzRdfSAke3RoaXMuI291dGxpbmVbNV19YF07XG4gICAgZm9yIChsZXQgaSA9IDYsIGlpID0gdGhpcy4jb3V0bGluZS5sZW5ndGg7IGkgPCBpaTsgaSArPSA2KSB7XG4gICAgICBpZiAoaXNOYU4odGhpcy4jb3V0bGluZVtpXSkpIHtcbiAgICAgICAgYnVmZmVyLnB1c2goYEwke3RoaXMuI291dGxpbmVbaSArIDRdfSAke3RoaXMuI291dGxpbmVbaSArIDVdfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJ1ZmZlci5wdXNoKGBDJHt0aGlzLiNvdXRsaW5lW2ldfSAke3RoaXMuI291dGxpbmVbaSArIDFdfSAke3RoaXMuI291dGxpbmVbaSArIDJdfSAke3RoaXMuI291dGxpbmVbaSArIDNdfSAke3RoaXMuI291dGxpbmVbaSArIDRdfSAke3RoaXMuI291dGxpbmVbaSArIDVdfWApO1xuICAgIH1cbiAgICBidWZmZXIucHVzaChcIlpcIik7XG4gICAgcmV0dXJuIGJ1ZmZlci5qb2luKFwiIFwiKTtcbiAgfVxuICBzZXJpYWxpemUoW2JsWCwgYmxZLCB0clgsIHRyWV0sIHJvdGF0aW9uKSB7XG4gICAgY29uc3Qgd2lkdGggPSB0clggLSBibFg7XG4gICAgY29uc3QgaGVpZ2h0ID0gdHJZIC0gYmxZO1xuICAgIGxldCBvdXRsaW5lO1xuICAgIGxldCBwb2ludHM7XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBvdXRsaW5lID0gdGhpcy4jcmVzY2FsZSh0aGlzLiNvdXRsaW5lLCBibFgsIHRyWSwgd2lkdGgsIC1oZWlnaHQpO1xuICAgICAgICBwb2ludHMgPSB0aGlzLiNyZXNjYWxlKHRoaXMuI3BvaW50cywgYmxYLCB0clksIHdpZHRoLCAtaGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICBvdXRsaW5lID0gdGhpcy4jcmVzY2FsZUFuZFN3YXAodGhpcy4jb3V0bGluZSwgYmxYLCBibFksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBwb2ludHMgPSB0aGlzLiNyZXNjYWxlQW5kU3dhcCh0aGlzLiNwb2ludHMsIGJsWCwgYmxZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgb3V0bGluZSA9IHRoaXMuI3Jlc2NhbGUodGhpcy4jb3V0bGluZSwgdHJYLCBibFksIC13aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgcG9pbnRzID0gdGhpcy4jcmVzY2FsZSh0aGlzLiNwb2ludHMsIHRyWCwgYmxZLCAtd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIG91dGxpbmUgPSB0aGlzLiNyZXNjYWxlQW5kU3dhcCh0aGlzLiNvdXRsaW5lLCB0clgsIHRyWSwgLXdpZHRoLCAtaGVpZ2h0KTtcbiAgICAgICAgcG9pbnRzID0gdGhpcy4jcmVzY2FsZUFuZFN3YXAodGhpcy4jcG9pbnRzLCB0clgsIHRyWSwgLXdpZHRoLCAtaGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBvdXRsaW5lOiBBcnJheS5mcm9tKG91dGxpbmUpLFxuICAgICAgcG9pbnRzOiBbQXJyYXkuZnJvbShwb2ludHMpXVxuICAgIH07XG4gIH1cbiAgI3Jlc2NhbGUoc3JjLCB0eCwgdHksIHN4LCBzeSkge1xuICAgIGNvbnN0IGRlc3QgPSBuZXcgRmxvYXQ2NEFycmF5KHNyYy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBkZXN0W2ldID0gdHggKyBzcmNbaV0gKiBzeDtcbiAgICAgIGRlc3RbaSArIDFdID0gdHkgKyBzcmNbaSArIDFdICogc3k7XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xuICB9XG4gICNyZXNjYWxlQW5kU3dhcChzcmMsIHR4LCB0eSwgc3gsIHN5KSB7XG4gICAgY29uc3QgZGVzdCA9IG5ldyBGbG9hdDY0QXJyYXkoc3JjLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIGRlc3RbaV0gPSB0eCArIHNyY1tpICsgMV0gKiBzeDtcbiAgICAgIGRlc3RbaSArIDFdID0gdHkgKyBzcmNbaV0gKiBzeTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG4gIH1cbiAgI2NvbXB1dGVNaW5NYXgoaXNMVFIpIHtcbiAgICBjb25zdCBvdXRsaW5lID0gdGhpcy4jb3V0bGluZTtcbiAgICBsZXQgbGFzdFggPSBvdXRsaW5lWzRdO1xuICAgIGxldCBsYXN0WSA9IG91dGxpbmVbNV07XG4gICAgbGV0IG1pblggPSBsYXN0WDtcbiAgICBsZXQgbWluWSA9IGxhc3RZO1xuICAgIGxldCBtYXhYID0gbGFzdFg7XG4gICAgbGV0IG1heFkgPSBsYXN0WTtcbiAgICBsZXQgbGFzdFBvaW50WCA9IGxhc3RYO1xuICAgIGxldCBsYXN0UG9pbnRZID0gbGFzdFk7XG4gICAgY29uc3QgbHRyQ2FsbGJhY2sgPSBpc0xUUiA/IE1hdGgubWF4IDogTWF0aC5taW47XG4gICAgZm9yIChsZXQgaSA9IDYsIGlpID0gb3V0bGluZS5sZW5ndGg7IGkgPCBpaTsgaSArPSA2KSB7XG4gICAgICBpZiAoaXNOYU4ob3V0bGluZVtpXSkpIHtcbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIG91dGxpbmVbaSArIDRdKTtcbiAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIG91dGxpbmVbaSArIDVdKTtcbiAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIG91dGxpbmVbaSArIDRdKTtcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIG91dGxpbmVbaSArIDVdKTtcbiAgICAgICAgaWYgKGxhc3RQb2ludFkgPCBvdXRsaW5lW2kgKyA1XSkge1xuICAgICAgICAgIGxhc3RQb2ludFggPSBvdXRsaW5lW2kgKyA0XTtcbiAgICAgICAgICBsYXN0UG9pbnRZID0gb3V0bGluZVtpICsgNV07XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdFBvaW50WSA9PT0gb3V0bGluZVtpICsgNV0pIHtcbiAgICAgICAgICBsYXN0UG9pbnRYID0gbHRyQ2FsbGJhY2sobGFzdFBvaW50WCwgb3V0bGluZVtpICsgNF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBiYm94ID0gVXRpbC5iZXppZXJCb3VuZGluZ0JveChsYXN0WCwgbGFzdFksIC4uLm91dGxpbmUuc2xpY2UoaSwgaSArIDYpKTtcbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIGJib3hbMF0pO1xuICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgYmJveFsxXSk7XG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBiYm94WzJdKTtcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGJib3hbM10pO1xuICAgICAgICBpZiAobGFzdFBvaW50WSA8IGJib3hbM10pIHtcbiAgICAgICAgICBsYXN0UG9pbnRYID0gYmJveFsyXTtcbiAgICAgICAgICBsYXN0UG9pbnRZID0gYmJveFszXTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0UG9pbnRZID09PSBiYm94WzNdKSB7XG4gICAgICAgICAgbGFzdFBvaW50WCA9IGx0ckNhbGxiYWNrKGxhc3RQb2ludFgsIGJib3hbMl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsYXN0WCA9IG91dGxpbmVbaSArIDRdO1xuICAgICAgbGFzdFkgPSBvdXRsaW5lW2kgKyA1XTtcbiAgICB9XG4gICAgY29uc3QgeCA9IG1pblggLSB0aGlzLiNpbm5lck1hcmdpbixcbiAgICAgIHkgPSBtaW5ZIC0gdGhpcy4jaW5uZXJNYXJnaW4sXG4gICAgICB3aWR0aCA9IG1heFggLSBtaW5YICsgMiAqIHRoaXMuI2lubmVyTWFyZ2luLFxuICAgICAgaGVpZ2h0ID0gbWF4WSAtIG1pblkgKyAyICogdGhpcy4jaW5uZXJNYXJnaW47XG4gICAgdGhpcy4jYmJveCA9IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBsYXN0UG9pbnQ6IFtsYXN0UG9pbnRYLCBsYXN0UG9pbnRZXVxuICAgIH07XG4gIH1cbiAgZ2V0IGJveCgpIHtcbiAgICByZXR1cm4gdGhpcy4jYmJveDtcbiAgfVxuICBnZXROZXdPdXRsaW5lKHRoaWNrbmVzcywgaW5uZXJNYXJnaW4pIHtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IHRoaXMuI2Jib3g7XG4gICAgY29uc3QgW2xheWVyWCwgbGF5ZXJZLCBsYXllcldpZHRoLCBsYXllckhlaWdodF0gPSB0aGlzLiNib3g7XG4gICAgY29uc3Qgc3ggPSB3aWR0aCAqIGxheWVyV2lkdGg7XG4gICAgY29uc3Qgc3kgPSBoZWlnaHQgKiBsYXllckhlaWdodDtcbiAgICBjb25zdCB0eCA9IHggKiBsYXllcldpZHRoICsgbGF5ZXJYO1xuICAgIGNvbnN0IHR5ID0geSAqIGxheWVySGVpZ2h0ICsgbGF5ZXJZO1xuICAgIGNvbnN0IG91dGxpbmVyID0gbmV3IEZyZWVPdXRsaW5lcih7XG4gICAgICB4OiB0aGlzLiNwb2ludHNbMF0gKiBzeCArIHR4LFxuICAgICAgeTogdGhpcy4jcG9pbnRzWzFdICogc3kgKyB0eVxuICAgIH0sIHRoaXMuI2JveCwgdGhpcy4jc2NhbGVGYWN0b3IsIHRoaWNrbmVzcywgdGhpcy4jaXNMVFIsIGlubmVyTWFyZ2luID8/IHRoaXMuI2lubmVyTWFyZ2luKTtcbiAgICBmb3IgKGxldCBpID0gMjsgaSA8IHRoaXMuI3BvaW50cy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgb3V0bGluZXIuYWRkKHtcbiAgICAgICAgeDogdGhpcy4jcG9pbnRzW2ldICogc3ggKyB0eCxcbiAgICAgICAgeTogdGhpcy4jcG9pbnRzW2kgKyAxXSAqIHN5ICsgdHlcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0bGluZXIuZ2V0T3V0bGluZXMoKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3IvY29sb3JfcGlja2VyLmpzXG5cblxuXG5jbGFzcyBDb2xvclBpY2tlciB7XG4gICNib3VuZEtleURvd24gPSB0aGlzLiNrZXlEb3duLmJpbmQodGhpcyk7XG4gICNib3VuZFBvaW50ZXJEb3duID0gdGhpcy4jcG9pbnRlckRvd24uYmluZCh0aGlzKTtcbiAgI2J1dHRvbiA9IG51bGw7XG4gICNidXR0b25Td2F0Y2ggPSBudWxsO1xuICAjZGVmYXVsdENvbG9yO1xuICAjZHJvcGRvd24gPSBudWxsO1xuICAjZHJvcGRvd25XYXNGcm9tS2V5Ym9hcmQgPSBmYWxzZTtcbiAgI2lzTWFpbkNvbG9yUGlja2VyID0gZmFsc2U7XG4gICNlZGl0b3IgPSBudWxsO1xuICAjZXZlbnRCdXM7XG4gICN1aU1hbmFnZXIgPSBudWxsO1xuICAjdHlwZTtcbiAgc3RhdGljIGdldCBfa2V5Ym9hcmRNYW5hZ2VyKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfa2V5Ym9hcmRNYW5hZ2VyXCIsIG5ldyBLZXlib2FyZE1hbmFnZXIoW1tbXCJFc2NhcGVcIiwgXCJtYWMrRXNjYXBlXCJdLCBDb2xvclBpY2tlci5wcm90b3R5cGUuX2hpZGVEcm9wZG93bkZyb21LZXlib2FyZF0sIFtbXCIgXCIsIFwibWFjKyBcIl0sIENvbG9yUGlja2VyLnByb3RvdHlwZS5fY29sb3JTZWxlY3RGcm9tS2V5Ym9hcmRdLCBbW1wiQXJyb3dEb3duXCIsIFwiQXJyb3dSaWdodFwiLCBcIm1hYytBcnJvd0Rvd25cIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgQ29sb3JQaWNrZXIucHJvdG90eXBlLl9tb3ZlVG9OZXh0XSwgW1tcIkFycm93VXBcIiwgXCJBcnJvd0xlZnRcIiwgXCJtYWMrQXJyb3dVcFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIENvbG9yUGlja2VyLnByb3RvdHlwZS5fbW92ZVRvUHJldmlvdXNdLCBbW1wiSG9tZVwiLCBcIm1hYytIb21lXCJdLCBDb2xvclBpY2tlci5wcm90b3R5cGUuX21vdmVUb0JlZ2lubmluZ10sIFtbXCJFbmRcIiwgXCJtYWMrRW5kXCJdLCBDb2xvclBpY2tlci5wcm90b3R5cGUuX21vdmVUb0VuZF1dKSk7XG4gIH1cbiAgY29uc3RydWN0b3Ioe1xuICAgIGVkaXRvciA9IG51bGwsXG4gICAgdWlNYW5hZ2VyID0gbnVsbFxuICB9KSB7XG4gICAgaWYgKGVkaXRvcikge1xuICAgICAgdGhpcy4jaXNNYWluQ29sb3JQaWNrZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuI3R5cGUgPSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfQ09MT1I7XG4gICAgICB0aGlzLiNlZGl0b3IgPSBlZGl0b3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2lzTWFpbkNvbG9yUGlja2VyID0gdHJ1ZTtcbiAgICAgIHRoaXMuI3R5cGUgPSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfREVGQVVMVF9DT0xPUjtcbiAgICB9XG4gICAgdGhpcy4jdWlNYW5hZ2VyID0gZWRpdG9yPy5fdWlNYW5hZ2VyIHx8IHVpTWFuYWdlcjtcbiAgICB0aGlzLiNldmVudEJ1cyA9IHRoaXMuI3VpTWFuYWdlci5fZXZlbnRCdXM7XG4gICAgdGhpcy4jZGVmYXVsdENvbG9yID0gZWRpdG9yPy5jb2xvciB8fCB0aGlzLiN1aU1hbmFnZXI/LmhpZ2hsaWdodENvbG9ycy52YWx1ZXMoKS5uZXh0KCkudmFsdWUgfHwgXCIjRkZGRjk4XCI7XG4gIH1cbiAgcmVuZGVyQnV0dG9uKCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuI2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uLmNsYXNzTmFtZSA9IFwiY29sb3JQaWNrZXJcIjtcbiAgICBidXR0b24udGFiSW5kZXggPSBcIjBcIjtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtZWRpdG9yLWNvbG9ycGlja2VyLWJ1dHRvblwiKTtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiLCB0cnVlKTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbDtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuI29wZW5Ecm9wZG93bi5iaW5kKHRoaXMpLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlEb3duLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBjb25zdCBzd2F0Y2ggPSB0aGlzLiNidXR0b25Td2F0Y2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBzd2F0Y2guY2xhc3NOYW1lID0gXCJzd2F0Y2hcIjtcbiAgICBzd2F0Y2guc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgdHJ1ZSk7XG4gICAgc3dhdGNoLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuI2RlZmF1bHRDb2xvcjtcbiAgICBidXR0b24uYXBwZW5kKHN3YXRjaCk7XG4gICAgcmV0dXJuIGJ1dHRvbjtcbiAgfVxuICByZW5kZXJNYWluRHJvcGRvd24oKSB7XG4gICAgY29uc3QgZHJvcGRvd24gPSB0aGlzLiNkcm9wZG93biA9IHRoaXMuI2dldERyb3Bkb3duUm9vdCgpO1xuICAgIGRyb3Bkb3duLnNldEF0dHJpYnV0ZShcImFyaWEtb3JpZW50YXRpb25cIiwgXCJob3Jpem9udGFsXCIpO1xuICAgIGRyb3Bkb3duLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiLCBcImhpZ2hsaWdodENvbG9yUGlja2VyTGFiZWxcIik7XG4gICAgcmV0dXJuIGRyb3Bkb3duO1xuICB9XG4gICNnZXREcm9wZG93blJvb3QoKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbDtcbiAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGRpdi5jbGFzc05hbWUgPSBcImRyb3Bkb3duXCI7XG4gICAgZGl2LnJvbGUgPSBcImxpc3Rib3hcIjtcbiAgICBkaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgZmFsc2UpO1xuICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwidmVydGljYWxcIik7XG4gICAgZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLWVkaXRvci1jb2xvcnBpY2tlci1kcm9wZG93blwiKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb2xvcl0gb2YgdGhpcy4jdWlNYW5hZ2VyLmhpZ2hsaWdodENvbG9ycykge1xuICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgIGJ1dHRvbi50YWJJbmRleCA9IFwiMFwiO1xuICAgICAgYnV0dG9uLnJvbGUgPSBcIm9wdGlvblwiO1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImRhdGEtY29sb3JcIiwgY29sb3IpO1xuICAgICAgYnV0dG9uLnRpdGxlID0gbmFtZTtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgYHBkZmpzLWVkaXRvci1jb2xvcnBpY2tlci0ke25hbWV9YCk7XG4gICAgICBjb25zdCBzd2F0Y2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIGJ1dHRvbi5hcHBlbmQoc3dhdGNoKTtcbiAgICAgIHN3YXRjaC5jbGFzc05hbWUgPSBcInN3YXRjaFwiO1xuICAgICAgc3dhdGNoLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIiwgY29sb3IgPT09IHRoaXMuI2RlZmF1bHRDb2xvcik7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuI2NvbG9yU2VsZWN0LmJpbmQodGhpcywgY29sb3IpLCB7XG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG4gICAgICBkaXYuYXBwZW5kKGJ1dHRvbik7XG4gICAgfVxuICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleURvd24sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHJldHVybiBkaXY7XG4gIH1cbiAgI2NvbG9yU2VsZWN0KGNvbG9yLCBldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuI2V2ZW50QnVzLmRpc3BhdGNoKFwic3dpdGNoYW5ub3RhdGlvbmVkaXRvcnBhcmFtc1wiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICB0eXBlOiB0aGlzLiN0eXBlLFxuICAgICAgdmFsdWU6IGNvbG9yXG4gICAgfSk7XG4gIH1cbiAgX2NvbG9yU2VsZWN0RnJvbUtleWJvYXJkKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy4jYnV0dG9uKSB7XG4gICAgICB0aGlzLiNvcGVuRHJvcGRvd24oZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb2xvciA9IGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbG9yXCIpO1xuICAgIGlmICghY29sb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jY29sb3JTZWxlY3QoY29sb3IsIGV2ZW50KTtcbiAgfVxuICBfbW92ZVRvTmV4dChldmVudCkge1xuICAgIGlmICghdGhpcy4jaXNEcm9wZG93blZpc2libGUpIHtcbiAgICAgIHRoaXMuI29wZW5Ecm9wZG93bihldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuI2J1dHRvbikge1xuICAgICAgdGhpcy4jZHJvcGRvd24uZmlyc3RDaGlsZD8uZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQudGFyZ2V0Lm5leHRTaWJsaW5nPy5mb2N1cygpO1xuICB9XG4gIF9tb3ZlVG9QcmV2aW91cyhldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuI2Ryb3Bkb3duPy5maXJzdENoaWxkIHx8IGV2ZW50LnRhcmdldCA9PT0gdGhpcy4jYnV0dG9uKSB7XG4gICAgICBpZiAodGhpcy4jaXNEcm9wZG93blZpc2libGUpIHtcbiAgICAgICAgdGhpcy5faGlkZURyb3Bkb3duRnJvbUtleWJvYXJkKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jaXNEcm9wZG93blZpc2libGUpIHtcbiAgICAgIHRoaXMuI29wZW5Ecm9wZG93bihldmVudCk7XG4gICAgfVxuICAgIGV2ZW50LnRhcmdldC5wcmV2aW91c1NpYmxpbmc/LmZvY3VzKCk7XG4gIH1cbiAgX21vdmVUb0JlZ2lubmluZyhldmVudCkge1xuICAgIGlmICghdGhpcy4jaXNEcm9wZG93blZpc2libGUpIHtcbiAgICAgIHRoaXMuI29wZW5Ecm9wZG93bihldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2Ryb3Bkb3duLmZpcnN0Q2hpbGQ/LmZvY3VzKCk7XG4gIH1cbiAgX21vdmVUb0VuZChldmVudCkge1xuICAgIGlmICghdGhpcy4jaXNEcm9wZG93blZpc2libGUpIHtcbiAgICAgIHRoaXMuI29wZW5Ecm9wZG93bihldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2Ryb3Bkb3duLmxhc3RDaGlsZD8uZm9jdXMoKTtcbiAgfVxuICAja2V5RG93bihldmVudCkge1xuICAgIENvbG9yUGlja2VyLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCBldmVudCk7XG4gIH1cbiAgI29wZW5Ecm9wZG93bihldmVudCkge1xuICAgIGlmICh0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgdGhpcy5oaWRlRHJvcGRvd24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jZHJvcGRvd25XYXNGcm9tS2V5Ym9hcmQgPSBldmVudC5kZXRhaWwgPT09IDA7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZFBvaW50ZXJEb3duLCB7XG4gICAgICBzaWduYWw6IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMuI2Ryb3Bkb3duKSB7XG4gICAgICB0aGlzLiNkcm9wZG93bi5jbGFzc0xpc3QucmVtb3ZlKFwiaGlkZGVuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb290ID0gdGhpcy4jZHJvcGRvd24gPSB0aGlzLiNnZXREcm9wZG93blJvb3QoKTtcbiAgICB0aGlzLiNidXR0b24uYXBwZW5kKHJvb3QpO1xuICB9XG4gICNwb2ludGVyRG93bihldmVudCkge1xuICAgIGlmICh0aGlzLiNkcm9wZG93bj8uY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhpZGVEcm9wZG93bigpO1xuICB9XG4gIGhpZGVEcm9wZG93bigpIHtcbiAgICB0aGlzLiNkcm9wZG93bj8uY2xhc3NMaXN0LmFkZChcImhpZGRlblwiKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kUG9pbnRlckRvd24pO1xuICB9XG4gIGdldCAjaXNEcm9wZG93blZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Ryb3Bkb3duICYmICF0aGlzLiNkcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoXCJoaWRkZW5cIik7XG4gIH1cbiAgX2hpZGVEcm9wZG93bkZyb21LZXlib2FyZCgpIHtcbiAgICBpZiAodGhpcy4jaXNNYWluQ29sb3JQaWNrZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgdGhpcy4jZWRpdG9yPy51bnNlbGVjdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhpZGVEcm9wZG93bigpO1xuICAgIHRoaXMuI2J1dHRvbi5mb2N1cyh7XG4gICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlLFxuICAgICAgZm9jdXNWaXNpYmxlOiB0aGlzLiNkcm9wZG93bldhc0Zyb21LZXlib2FyZFxuICAgIH0pO1xuICB9XG4gIHVwZGF0ZUNvbG9yKGNvbG9yKSB7XG4gICAgaWYgKHRoaXMuI2J1dHRvblN3YXRjaCkge1xuICAgICAgdGhpcy4jYnV0dG9uU3dhdGNoLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2Ryb3Bkb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGkgPSB0aGlzLiN1aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JzLnZhbHVlcygpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy4jZHJvcGRvd24uY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIiwgaS5uZXh0KCkudmFsdWUgPT09IGNvbG9yKTtcbiAgICB9XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLiNidXR0b24/LnJlbW92ZSgpO1xuICAgIHRoaXMuI2J1dHRvbiA9IG51bGw7XG4gICAgdGhpcy4jYnV0dG9uU3dhdGNoID0gbnVsbDtcbiAgICB0aGlzLiNkcm9wZG93bj8ucmVtb3ZlKCk7XG4gICAgdGhpcy4jZHJvcGRvd24gPSBudWxsO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9oaWdobGlnaHQuanNcblxuXG5cblxuXG5cbmNsYXNzIEhpZ2hsaWdodEVkaXRvciBleHRlbmRzIEFubm90YXRpb25FZGl0b3Ige1xuICAjYW5jaG9yTm9kZSA9IG51bGw7XG4gICNhbmNob3JPZmZzZXQgPSAwO1xuICAjYm94ZXM7XG4gICNjbGlwUGF0aElkID0gbnVsbDtcbiAgI2NvbG9yUGlja2VyID0gbnVsbDtcbiAgI2ZvY3VzT3V0bGluZXMgPSBudWxsO1xuICAjZm9jdXNOb2RlID0gbnVsbDtcbiAgI2ZvY3VzT2Zmc2V0ID0gMDtcbiAgI2hpZ2hsaWdodERpdiA9IG51bGw7XG4gICNoaWdobGlnaHRPdXRsaW5lcyA9IG51bGw7XG4gICNpZCA9IG51bGw7XG4gICNpc0ZyZWVIaWdobGlnaHQgPSBmYWxzZTtcbiAgI2JvdW5kS2V5ZG93biA9IHRoaXMuI2tleWRvd24uYmluZCh0aGlzKTtcbiAgI2xhc3RQb2ludCA9IG51bGw7XG4gICNvcGFjaXR5O1xuICAjb3V0bGluZUlkID0gbnVsbDtcbiAgI3RleHQgPSBcIlwiO1xuICAjdGhpY2tuZXNzO1xuICAjbWV0aG9kT2ZDcmVhdGlvbiA9IFwiXCI7XG4gIHN0YXRpYyBfZGVmYXVsdENvbG9yID0gbnVsbDtcbiAgc3RhdGljIF9kZWZhdWx0T3BhY2l0eSA9IDE7XG4gIHN0YXRpYyBfZGVmYXVsdFRoaWNrbmVzcyA9IDEyO1xuICBzdGF0aWMgX2wxMG5Qcm9taXNlO1xuICBzdGF0aWMgX3R5cGUgPSBcImhpZ2hsaWdodFwiO1xuICBzdGF0aWMgX2VkaXRvclR5cGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5ISUdITElHSFQ7XG4gIHN0YXRpYyBfZnJlZUhpZ2hsaWdodElkID0gLTE7XG4gIHN0YXRpYyBfZnJlZUhpZ2hsaWdodCA9IG51bGw7XG4gIHN0YXRpYyBfZnJlZUhpZ2hsaWdodENsaXBJZCA9IFwiXCI7XG4gIHN0YXRpYyBnZXQgX2tleWJvYXJkTWFuYWdlcigpIHtcbiAgICBjb25zdCBwcm90byA9IEhpZ2hsaWdodEVkaXRvci5wcm90b3R5cGU7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9rZXlib2FyZE1hbmFnZXJcIiwgbmV3IEtleWJvYXJkTWFuYWdlcihbW1tcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIHByb3RvLl9tb3ZlQ2FyZXQsIHtcbiAgICAgIGFyZ3M6IFswXVxuICAgIH1dLCBbW1wiQXJyb3dSaWdodFwiLCBcIm1hYytBcnJvd1JpZ2h0XCJdLCBwcm90by5fbW92ZUNhcmV0LCB7XG4gICAgICBhcmdzOiBbMV1cbiAgICB9XSwgW1tcIkFycm93VXBcIiwgXCJtYWMrQXJyb3dVcFwiXSwgcHJvdG8uX21vdmVDYXJldCwge1xuICAgICAgYXJnczogWzJdXG4gICAgfV0sIFtbXCJBcnJvd0Rvd25cIiwgXCJtYWMrQXJyb3dEb3duXCJdLCBwcm90by5fbW92ZUNhcmV0LCB7XG4gICAgICBhcmdzOiBbM11cbiAgICB9XV0pKTtcbiAgfVxuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBuYW1lOiBcImhpZ2hsaWdodEVkaXRvclwiXG4gICAgfSk7XG4gICAgdGhpcy5jb2xvciA9IHBhcmFtcy5jb2xvciB8fCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRDb2xvcjtcbiAgICB0aGlzLiN0aGlja25lc3MgPSBwYXJhbXMudGhpY2tuZXNzIHx8IEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdFRoaWNrbmVzcztcbiAgICB0aGlzLiNvcGFjaXR5ID0gcGFyYW1zLm9wYWNpdHkgfHwgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0T3BhY2l0eTtcbiAgICB0aGlzLiNib3hlcyA9IHBhcmFtcy5ib3hlcyB8fCBudWxsO1xuICAgIHRoaXMuI21ldGhvZE9mQ3JlYXRpb24gPSBwYXJhbXMubWV0aG9kT2ZDcmVhdGlvbiB8fCBcIlwiO1xuICAgIHRoaXMuI3RleHQgPSBwYXJhbXMudGV4dCB8fCBcIlwiO1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgaWYgKHBhcmFtcy5oaWdobGlnaHRJZCA+IC0xKSB7XG4gICAgICB0aGlzLiNpc0ZyZWVIaWdobGlnaHQgPSB0cnVlO1xuICAgICAgdGhpcy4jY3JlYXRlRnJlZU91dGxpbmVzKHBhcmFtcyk7XG4gICAgICB0aGlzLiNhZGRUb0RyYXdMYXllcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNhbmNob3JOb2RlID0gcGFyYW1zLmFuY2hvck5vZGU7XG4gICAgICB0aGlzLiNhbmNob3JPZmZzZXQgPSBwYXJhbXMuYW5jaG9yT2Zmc2V0O1xuICAgICAgdGhpcy4jZm9jdXNOb2RlID0gcGFyYW1zLmZvY3VzTm9kZTtcbiAgICAgIHRoaXMuI2ZvY3VzT2Zmc2V0ID0gcGFyYW1zLmZvY3VzT2Zmc2V0O1xuICAgICAgdGhpcy4jY3JlYXRlT3V0bGluZXMoKTtcbiAgICAgIHRoaXMuI2FkZFRvRHJhd0xheWVyKCk7XG4gICAgICB0aGlzLnJvdGF0ZSh0aGlzLnJvdGF0aW9uKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHRlbGVtZXRyeUluaXRpYWxEYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiYWRkZWRcIixcbiAgICAgIHR5cGU6IHRoaXMuI2lzRnJlZUhpZ2hsaWdodCA/IFwiZnJlZV9oaWdobGlnaHRcIiA6IFwiaGlnaGxpZ2h0XCIsXG4gICAgICBjb2xvcjogdGhpcy5fdWlNYW5hZ2VyLmhpZ2hsaWdodENvbG9yTmFtZXMuZ2V0KHRoaXMuY29sb3IpLFxuICAgICAgdGhpY2tuZXNzOiB0aGlzLiN0aGlja25lc3MsXG4gICAgICBtZXRob2RPZkNyZWF0aW9uOiB0aGlzLiNtZXRob2RPZkNyZWF0aW9uXG4gICAgfTtcbiAgfVxuICBnZXQgdGVsZW1ldHJ5RmluYWxEYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImhpZ2hsaWdodFwiLFxuICAgICAgY29sb3I6IHRoaXMuX3VpTWFuYWdlci5oaWdobGlnaHRDb2xvck5hbWVzLmdldCh0aGlzLmNvbG9yKVxuICAgIH07XG4gIH1cbiAgc3RhdGljIGNvbXB1dGVUZWxlbWV0cnlGaW5hbERhdGEoZGF0YSkge1xuICAgIHJldHVybiB7XG4gICAgICBudW1iZXJPZkNvbG9yczogZGF0YS5nZXQoXCJjb2xvclwiKS5zaXplXG4gICAgfTtcbiAgfVxuICAjY3JlYXRlT3V0bGluZXMoKSB7XG4gICAgY29uc3Qgb3V0bGluZXIgPSBuZXcgT3V0bGluZXIodGhpcy4jYm94ZXMsIDAuMDAxKTtcbiAgICB0aGlzLiNoaWdobGlnaHRPdXRsaW5lcyA9IG91dGxpbmVyLmdldE91dGxpbmVzKCk7XG4gICAgKHtcbiAgICAgIHg6IHRoaXMueCxcbiAgICAgIHk6IHRoaXMueSxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodFxuICAgIH0gPSB0aGlzLiNoaWdobGlnaHRPdXRsaW5lcy5ib3gpO1xuICAgIGNvbnN0IG91dGxpbmVyRm9yT3V0bGluZSA9IG5ldyBPdXRsaW5lcih0aGlzLiNib3hlcywgMC4wMDI1LCAwLjAwMSwgdGhpcy5fdWlNYW5hZ2VyLmRpcmVjdGlvbiA9PT0gXCJsdHJcIik7XG4gICAgdGhpcy4jZm9jdXNPdXRsaW5lcyA9IG91dGxpbmVyRm9yT3V0bGluZS5nZXRPdXRsaW5lcygpO1xuICAgIGNvbnN0IHtcbiAgICAgIGxhc3RQb2ludFxuICAgIH0gPSB0aGlzLiNmb2N1c091dGxpbmVzLmJveDtcbiAgICB0aGlzLiNsYXN0UG9pbnQgPSBbKGxhc3RQb2ludFswXSAtIHRoaXMueCkgLyB0aGlzLndpZHRoLCAobGFzdFBvaW50WzFdIC0gdGhpcy55KSAvIHRoaXMuaGVpZ2h0XTtcbiAgfVxuICAjY3JlYXRlRnJlZU91dGxpbmVzKHtcbiAgICBoaWdobGlnaHRPdXRsaW5lcyxcbiAgICBoaWdobGlnaHRJZCxcbiAgICBjbGlwUGF0aElkXG4gIH0pIHtcbiAgICB0aGlzLiNoaWdobGlnaHRPdXRsaW5lcyA9IGhpZ2hsaWdodE91dGxpbmVzO1xuICAgIGNvbnN0IGV4dHJhVGhpY2tuZXNzID0gMS41O1xuICAgIHRoaXMuI2ZvY3VzT3V0bGluZXMgPSBoaWdobGlnaHRPdXRsaW5lcy5nZXROZXdPdXRsaW5lKHRoaXMuI3RoaWNrbmVzcyAvIDIgKyBleHRyYVRoaWNrbmVzcywgMC4wMDI1KTtcbiAgICBpZiAoaGlnaGxpZ2h0SWQgPj0gMCkge1xuICAgICAgdGhpcy4jaWQgPSBoaWdobGlnaHRJZDtcbiAgICAgIHRoaXMuI2NsaXBQYXRoSWQgPSBjbGlwUGF0aElkO1xuICAgICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLmZpbmFsaXplTGluZShoaWdobGlnaHRJZCwgaGlnaGxpZ2h0T3V0bGluZXMpO1xuICAgICAgdGhpcy4jb3V0bGluZUlkID0gdGhpcy5wYXJlbnQuZHJhd0xheWVyLmhpZ2hsaWdodE91dGxpbmUodGhpcy4jZm9jdXNPdXRsaW5lcyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgY29uc3QgYW5nbGUgPSB0aGlzLnBhcmVudC52aWV3cG9ydC5yb3RhdGlvbjtcbiAgICAgIHRoaXMucGFyZW50LmRyYXdMYXllci51cGRhdGVMaW5lKHRoaXMuI2lkLCBoaWdobGlnaHRPdXRsaW5lcyk7XG4gICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIudXBkYXRlQm94KHRoaXMuI2lkLCBIaWdobGlnaHRFZGl0b3IuI3JvdGF0ZUJib3godGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMuYm94LCAoYW5nbGUgLSB0aGlzLnJvdGF0aW9uICsgMzYwKSAlIDM2MCkpO1xuICAgICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnVwZGF0ZUxpbmUodGhpcy4jb3V0bGluZUlkLCB0aGlzLiNmb2N1c091dGxpbmVzKTtcbiAgICAgIHRoaXMucGFyZW50LmRyYXdMYXllci51cGRhdGVCb3godGhpcy4jb3V0bGluZUlkLCBIaWdobGlnaHRFZGl0b3IuI3JvdGF0ZUJib3godGhpcy4jZm9jdXNPdXRsaW5lcy5ib3gsIGFuZ2xlKSk7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gaGlnaGxpZ2h0T3V0bGluZXMuYm94O1xuICAgIHN3aXRjaCAodGhpcy5yb3RhdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICB0aGlzLnggPSB5O1xuICAgICAgICAgIHRoaXMueSA9IDEgLSB4O1xuICAgICAgICAgIHRoaXMud2lkdGggPSB3aWR0aCAqIHBhZ2VIZWlnaHQgLyBwYWdlV2lkdGg7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgKiBwYWdlV2lkdGggLyBwYWdlSGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgdGhpcy54ID0gMSAtIHg7XG4gICAgICAgIHRoaXMueSA9IDEgLSB5O1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgICAgdGhpcy54ID0gMSAtIHk7XG4gICAgICAgICAgdGhpcy55ID0geDtcbiAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggKiBwYWdlSGVpZ2h0IC8gcGFnZVdpZHRoO1xuICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0ICogcGFnZVdpZHRoIC8gcGFnZUhlaWdodDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBsYXN0UG9pbnRcbiAgICB9ID0gdGhpcy4jZm9jdXNPdXRsaW5lcy5ib3g7XG4gICAgdGhpcy4jbGFzdFBvaW50ID0gWyhsYXN0UG9pbnRbMF0gLSB4KSAvIHdpZHRoLCAobGFzdFBvaW50WzFdIC0geSkgLyBoZWlnaHRdO1xuICB9XG4gIHN0YXRpYyBpbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcikge1xuICAgIEFubm90YXRpb25FZGl0b3IuaW5pdGlhbGl6ZShsMTBuLCB1aU1hbmFnZXIpO1xuICAgIEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdENvbG9yIHx8PSB1aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JzPy52YWx1ZXMoKS5uZXh0KCkudmFsdWUgfHwgXCIjZmZmMDY2XCI7XG4gIH1cbiAgc3RhdGljIHVwZGF0ZURlZmF1bHRQYXJhbXModHlwZSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0RFRkFVTFRfQ09MT1I6XG4gICAgICAgIEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdENvbG9yID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfVEhJQ0tORVNTOlxuICAgICAgICBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRUaGlja25lc3MgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRyYW5zbGF0ZUluUGFnZSh4LCB5KSB7fVxuICBnZXQgdG9vbGJhclBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNsYXN0UG9pbnQ7XG4gIH1cbiAgdXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9DT0xPUjpcbiAgICAgICAgdGhpcy4jdXBkYXRlQ29sb3IodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX1RISUNLTkVTUzpcbiAgICAgICAgdGhpcy4jdXBkYXRlVGhpY2tuZXNzKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW1tBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfREVGQVVMVF9DT0xPUiwgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0Q29sb3JdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX1RISUNLTkVTUywgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzXV07XG4gIH1cbiAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW1tBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfQ09MT1IsIHRoaXMuY29sb3IgfHwgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0Q29sb3JdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX1RISUNLTkVTUywgdGhpcy4jdGhpY2tuZXNzIHx8IEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdFRoaWNrbmVzc10sIFtBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfRlJFRSwgdGhpcy4jaXNGcmVlSGlnaGxpZ2h0XV07XG4gIH1cbiAgI3VwZGF0ZUNvbG9yKGNvbG9yKSB7XG4gICAgY29uc3Qgc2V0Q29sb3IgPSBjb2wgPT4ge1xuICAgICAgdGhpcy5jb2xvciA9IGNvbDtcbiAgICAgIHRoaXMucGFyZW50Py5kcmF3TGF5ZXIuY2hhbmdlQ29sb3IodGhpcy4jaWQsIGNvbCk7XG4gICAgICB0aGlzLiNjb2xvclBpY2tlcj8udXBkYXRlQ29sb3IoY29sKTtcbiAgICB9O1xuICAgIGNvbnN0IHNhdmVkQ29sb3IgPSB0aGlzLmNvbG9yO1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiBzZXRDb2xvci5iaW5kKHRoaXMsIGNvbG9yKSxcbiAgICAgIHVuZG86IHNldENvbG9yLmJpbmQodGhpcywgc2F2ZWRDb2xvciksXG4gICAgICBwb3N0OiB0aGlzLl91aU1hbmFnZXIudXBkYXRlVUkuYmluZCh0aGlzLl91aU1hbmFnZXIsIHRoaXMpLFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfQ09MT1IsXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLl9yZXBvcnRUZWxlbWV0cnkoe1xuICAgICAgYWN0aW9uOiBcImNvbG9yX2NoYW5nZWRcIixcbiAgICAgIGNvbG9yOiB0aGlzLl91aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JOYW1lcy5nZXQoY29sb3IpXG4gICAgfSwgdHJ1ZSk7XG4gIH1cbiAgI3VwZGF0ZVRoaWNrbmVzcyh0aGlja25lc3MpIHtcbiAgICBjb25zdCBzYXZlZFRoaWNrbmVzcyA9IHRoaXMuI3RoaWNrbmVzcztcbiAgICBjb25zdCBzZXRUaGlja25lc3MgPSB0aCA9PiB7XG4gICAgICB0aGlzLiN0aGlja25lc3MgPSB0aDtcbiAgICAgIHRoaXMuI2NoYW5nZVRoaWNrbmVzcyh0aCk7XG4gICAgfTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogc2V0VGhpY2tuZXNzLmJpbmQodGhpcywgdGhpY2tuZXNzKSxcbiAgICAgIHVuZG86IHNldFRoaWNrbmVzcy5iaW5kKHRoaXMsIHNhdmVkVGhpY2tuZXNzKSxcbiAgICAgIHBvc3Q6IHRoaXMuX3VpTWFuYWdlci51cGRhdGVVSS5iaW5kKHRoaXMuX3VpTWFuYWdlciwgdGhpcyksXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1MsXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLl9yZXBvcnRUZWxlbWV0cnkoe1xuICAgICAgYWN0aW9uOiBcInRoaWNrbmVzc19jaGFuZ2VkXCIsXG4gICAgICB0aGlja25lc3NcbiAgICB9LCB0cnVlKTtcbiAgfVxuICBhc3luYyBhZGRFZGl0VG9vbGJhcigpIHtcbiAgICBjb25zdCB0b29sYmFyID0gYXdhaXQgc3VwZXIuYWRkRWRpdFRvb2xiYXIoKTtcbiAgICBpZiAoIXRvb2xiYXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdWlNYW5hZ2VyLmhpZ2hsaWdodENvbG9ycykge1xuICAgICAgdGhpcy4jY29sb3JQaWNrZXIgPSBuZXcgQ29sb3JQaWNrZXIoe1xuICAgICAgICBlZGl0b3I6IHRoaXNcbiAgICAgIH0pO1xuICAgICAgdG9vbGJhci5hZGRDb2xvclBpY2tlcih0aGlzLiNjb2xvclBpY2tlcik7XG4gICAgfVxuICAgIHJldHVybiB0b29sYmFyO1xuICB9XG4gIGRpc2FibGVFZGl0aW5nKCkge1xuICAgIHN1cGVyLmRpc2FibGVFZGl0aW5nKCk7XG4gICAgdGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImRpc2FibGVkXCIsIHRydWUpO1xuICB9XG4gIGVuYWJsZUVkaXRpbmcoKSB7XG4gICAgc3VwZXIuZW5hYmxlRWRpdGluZygpO1xuICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG4gIH1cbiAgZml4QW5kU2V0UG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHN1cGVyLmZpeEFuZFNldFBvc2l0aW9uKHRoaXMuI2dldFJvdGF0aW9uKCkpO1xuICB9XG4gIGdldEJhc2VUcmFuc2xhdGlvbigpIHtcbiAgICByZXR1cm4gWzAsIDBdO1xuICB9XG4gIGdldFJlY3QodHgsIHR5KSB7XG4gICAgcmV0dXJuIHN1cGVyLmdldFJlY3QodHgsIHR5LCB0aGlzLiNnZXRSb3RhdGlvbigpKTtcbiAgfVxuICBvbmNlQWRkZWQoKSB7XG4gICAgdGhpcy5wYXJlbnQuYWRkVW5kb2FibGVFZGl0b3IodGhpcyk7XG4gICAgdGhpcy5kaXYuZm9jdXMoKTtcbiAgfVxuICByZW1vdmUoKSB7XG4gICAgdGhpcy4jY2xlYW5EcmF3TGF5ZXIoKTtcbiAgICB0aGlzLl9yZXBvcnRUZWxlbWV0cnkoe1xuICAgICAgYWN0aW9uOiBcImRlbGV0ZWRcIlxuICAgIH0pO1xuICAgIHN1cGVyLnJlbW92ZSgpO1xuICB9XG4gIHJlYnVpbGQoKSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgaWYgKHRoaXMuZGl2ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FkZFRvRHJhd0xheWVyKCk7XG4gICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgdGhpcy5wYXJlbnQuYWRkKHRoaXMpO1xuICAgIH1cbiAgfVxuICBzZXRQYXJlbnQocGFyZW50KSB7XG4gICAgbGV0IG11c3RCZVNlbGVjdGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMucGFyZW50ICYmICFwYXJlbnQpIHtcbiAgICAgIHRoaXMuI2NsZWFuRHJhd0xheWVyKCk7XG4gICAgfSBlbHNlIGlmIChwYXJlbnQpIHtcbiAgICAgIHRoaXMuI2FkZFRvRHJhd0xheWVyKHBhcmVudCk7XG4gICAgICBtdXN0QmVTZWxlY3RlZCA9ICF0aGlzLnBhcmVudCAmJiB0aGlzLmRpdj8uY2xhc3NMaXN0LmNvbnRhaW5zKFwic2VsZWN0ZWRFZGl0b3JcIik7XG4gICAgfVxuICAgIHN1cGVyLnNldFBhcmVudChwYXJlbnQpO1xuICAgIHRoaXMuc2hvdyh0aGlzLl9pc1Zpc2libGUpO1xuICAgIGlmIChtdXN0QmVTZWxlY3RlZCkge1xuICAgICAgdGhpcy5zZWxlY3QoKTtcbiAgICB9XG4gIH1cbiAgI2NoYW5nZVRoaWNrbmVzcyh0aGlja25lc3MpIHtcbiAgICBpZiAoIXRoaXMuI2lzRnJlZUhpZ2hsaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNjcmVhdGVGcmVlT3V0bGluZXMoe1xuICAgICAgaGlnaGxpZ2h0T3V0bGluZXM6IHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzLmdldE5ld091dGxpbmUodGhpY2tuZXNzIC8gMilcbiAgICB9KTtcbiAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMuc2V0RGltcyh0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcbiAgfVxuICAjY2xlYW5EcmF3TGF5ZXIoKSB7XG4gICAgaWYgKHRoaXMuI2lkID09PSBudWxsIHx8ICF0aGlzLnBhcmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIucmVtb3ZlKHRoaXMuI2lkKTtcbiAgICB0aGlzLiNpZCA9IG51bGw7XG4gICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnJlbW92ZSh0aGlzLiNvdXRsaW5lSWQpO1xuICAgIHRoaXMuI291dGxpbmVJZCA9IG51bGw7XG4gIH1cbiAgI2FkZFRvRHJhd0xheWVyKHBhcmVudCA9IHRoaXMucGFyZW50KSB7XG4gICAgaWYgKHRoaXMuI2lkICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgICh7XG4gICAgICBpZDogdGhpcy4jaWQsXG4gICAgICBjbGlwUGF0aElkOiB0aGlzLiNjbGlwUGF0aElkXG4gICAgfSA9IHBhcmVudC5kcmF3TGF5ZXIuaGlnaGxpZ2h0KHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzLCB0aGlzLmNvbG9yLCB0aGlzLiNvcGFjaXR5KSk7XG4gICAgdGhpcy4jb3V0bGluZUlkID0gcGFyZW50LmRyYXdMYXllci5oaWdobGlnaHRPdXRsaW5lKHRoaXMuI2ZvY3VzT3V0bGluZXMpO1xuICAgIGlmICh0aGlzLiNoaWdobGlnaHREaXYpIHtcbiAgICAgIHRoaXMuI2hpZ2hsaWdodERpdi5zdHlsZS5jbGlwUGF0aCA9IHRoaXMuI2NsaXBQYXRoSWQ7XG4gICAgfVxuICB9XG4gIHN0YXRpYyAjcm90YXRlQmJveCh7XG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodFxuICB9LCBhbmdsZSkge1xuICAgIHN3aXRjaCAoYW5nbGUpIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogMSAtIHkgLSBoZWlnaHQsXG4gICAgICAgICAgeTogeCxcbiAgICAgICAgICB3aWR0aDogaGVpZ2h0LFxuICAgICAgICAgIGhlaWdodDogd2lkdGhcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IDEgLSB4IC0gd2lkdGgsXG4gICAgICAgICAgeTogMSAtIHkgLSBoZWlnaHQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB5LFxuICAgICAgICAgIHk6IDEgLSB4IC0gd2lkdGgsXG4gICAgICAgICAgd2lkdGg6IGhlaWdodCxcbiAgICAgICAgICBoZWlnaHQ6IHdpZHRoXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfTtcbiAgfVxuICByb3RhdGUoYW5nbGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBkcmF3TGF5ZXJcbiAgICB9ID0gdGhpcy5wYXJlbnQ7XG4gICAgbGV0IGJveDtcbiAgICBpZiAodGhpcy4jaXNGcmVlSGlnaGxpZ2h0KSB7XG4gICAgICBhbmdsZSA9IChhbmdsZSAtIHRoaXMucm90YXRpb24gKyAzNjApICUgMzYwO1xuICAgICAgYm94ID0gSGlnaGxpZ2h0RWRpdG9yLiNyb3RhdGVCYm94KHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzLmJveCwgYW5nbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3ggPSBIaWdobGlnaHRFZGl0b3IuI3JvdGF0ZUJib3godGhpcywgYW5nbGUpO1xuICAgIH1cbiAgICBkcmF3TGF5ZXIucm90YXRlKHRoaXMuI2lkLCBhbmdsZSk7XG4gICAgZHJhd0xheWVyLnJvdGF0ZSh0aGlzLiNvdXRsaW5lSWQsIGFuZ2xlKTtcbiAgICBkcmF3TGF5ZXIudXBkYXRlQm94KHRoaXMuI2lkLCBib3gpO1xuICAgIGRyYXdMYXllci51cGRhdGVCb3godGhpcy4jb3V0bGluZUlkLCBIaWdobGlnaHRFZGl0b3IuI3JvdGF0ZUJib3godGhpcy4jZm9jdXNPdXRsaW5lcy5ib3gsIGFuZ2xlKSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLmRpdikge1xuICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgIH1cbiAgICBjb25zdCBkaXYgPSBzdXBlci5yZW5kZXIoKTtcbiAgICBpZiAodGhpcy4jdGV4dCkge1xuICAgICAgZGl2LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdGhpcy4jdGV4dCk7XG4gICAgICBkaXYuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcIm1hcmtcIik7XG4gICAgfVxuICAgIGlmICh0aGlzLiNpc0ZyZWVIaWdobGlnaHQpIHtcbiAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKFwiZnJlZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlkb3duLCB7XG4gICAgICAgIHNpZ25hbDogdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBoaWdobGlnaHREaXYgPSB0aGlzLiNoaWdobGlnaHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRpdi5hcHBlbmQoaGlnaGxpZ2h0RGl2KTtcbiAgICBoaWdobGlnaHREaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgIGhpZ2hsaWdodERpdi5jbGFzc05hbWUgPSBcImludGVybmFsXCI7XG4gICAgaGlnaGxpZ2h0RGl2LnN0eWxlLmNsaXBQYXRoID0gdGhpcy4jY2xpcFBhdGhJZDtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy5zZXREaW1zKHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgIGJpbmRFdmVudHModGhpcywgdGhpcy4jaGlnaGxpZ2h0RGl2LCBbXCJwb2ludGVyb3ZlclwiLCBcInBvaW50ZXJsZWF2ZVwiXSk7XG4gICAgdGhpcy5lbmFibGVFZGl0aW5nKCk7XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuICBwb2ludGVyb3ZlcigpIHtcbiAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuYWRkQ2xhc3ModGhpcy4jb3V0bGluZUlkLCBcImhvdmVyZWRcIik7XG4gIH1cbiAgcG9pbnRlcmxlYXZlKCkge1xuICAgIHRoaXMucGFyZW50LmRyYXdMYXllci5yZW1vdmVDbGFzcyh0aGlzLiNvdXRsaW5lSWQsIFwiaG92ZXJlZFwiKTtcbiAgfVxuICAja2V5ZG93bihldmVudCkge1xuICAgIEhpZ2hsaWdodEVkaXRvci5fa2V5Ym9hcmRNYW5hZ2VyLmV4ZWModGhpcywgZXZlbnQpO1xuICB9XG4gIF9tb3ZlQ2FyZXQoZGlyZWN0aW9uKSB7XG4gICAgdGhpcy5wYXJlbnQudW5zZWxlY3QodGhpcyk7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdGhpcy4jc2V0Q2FyZXQodHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgY2FzZSAzOlxuICAgICAgICB0aGlzLiNzZXRDYXJldChmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAjc2V0Q2FyZXQoc3RhcnQpIHtcbiAgICBpZiAoIXRoaXMuI2FuY2hvck5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmIChzdGFydCkge1xuICAgICAgc2VsZWN0aW9uLnNldFBvc2l0aW9uKHRoaXMuI2FuY2hvck5vZGUsIHRoaXMuI2FuY2hvck9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGlvbi5zZXRQb3NpdGlvbih0aGlzLiNmb2N1c05vZGUsIHRoaXMuI2ZvY3VzT2Zmc2V0KTtcbiAgICB9XG4gIH1cbiAgc2VsZWN0KCkge1xuICAgIHN1cGVyLnNlbGVjdCgpO1xuICAgIGlmICghdGhpcy4jb3V0bGluZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50Py5kcmF3TGF5ZXIucmVtb3ZlQ2xhc3ModGhpcy4jb3V0bGluZUlkLCBcImhvdmVyZWRcIik7XG4gICAgdGhpcy5wYXJlbnQ/LmRyYXdMYXllci5hZGRDbGFzcyh0aGlzLiNvdXRsaW5lSWQsIFwic2VsZWN0ZWRcIik7XG4gIH1cbiAgdW5zZWxlY3QoKSB7XG4gICAgc3VwZXIudW5zZWxlY3QoKTtcbiAgICBpZiAoIXRoaXMuI291dGxpbmVJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudD8uZHJhd0xheWVyLnJlbW92ZUNsYXNzKHRoaXMuI291dGxpbmVJZCwgXCJzZWxlY3RlZFwiKTtcbiAgICBpZiAoIXRoaXMuI2lzRnJlZUhpZ2hsaWdodCkge1xuICAgICAgdGhpcy4jc2V0Q2FyZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuICBnZXQgX211c3RGaXhQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gIXRoaXMuI2lzRnJlZUhpZ2hsaWdodDtcbiAgfVxuICBzaG93KHZpc2libGUgPSB0aGlzLl9pc1Zpc2libGUpIHtcbiAgICBzdXBlci5zaG93KHZpc2libGUpO1xuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnNob3codGhpcy4jaWQsIHZpc2libGUpO1xuICAgICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnNob3codGhpcy4jb3V0bGluZUlkLCB2aXNpYmxlKTtcbiAgICB9XG4gIH1cbiAgI2dldFJvdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNpc0ZyZWVIaWdobGlnaHQgPyB0aGlzLnJvdGF0aW9uIDogMDtcbiAgfVxuICAjc2VyaWFsaXplQm94ZXMoKSB7XG4gICAgaWYgKHRoaXMuI2lzRnJlZUhpZ2hsaWdodCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICBjb25zdCBib3hlcyA9IHRoaXMuI2JveGVzO1xuICAgIGNvbnN0IHF1YWRQb2ludHMgPSBuZXcgRmxvYXQzMkFycmF5KGJveGVzLmxlbmd0aCAqIDgpO1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9IG9mIGJveGVzKSB7XG4gICAgICBjb25zdCBzeCA9IHggKiBwYWdlV2lkdGg7XG4gICAgICBjb25zdCBzeSA9ICgxIC0geSAtIGhlaWdodCkgKiBwYWdlSGVpZ2h0O1xuICAgICAgcXVhZFBvaW50c1tpXSA9IHF1YWRQb2ludHNbaSArIDRdID0gc3g7XG4gICAgICBxdWFkUG9pbnRzW2kgKyAxXSA9IHF1YWRQb2ludHNbaSArIDNdID0gc3k7XG4gICAgICBxdWFkUG9pbnRzW2kgKyAyXSA9IHF1YWRQb2ludHNbaSArIDZdID0gc3ggKyB3aWR0aCAqIHBhZ2VXaWR0aDtcbiAgICAgIHF1YWRQb2ludHNbaSArIDVdID0gcXVhZFBvaW50c1tpICsgN10gPSBzeSArIGhlaWdodCAqIHBhZ2VIZWlnaHQ7XG4gICAgICBpICs9IDg7XG4gICAgfVxuICAgIHJldHVybiBxdWFkUG9pbnRzO1xuICB9XG4gICNzZXJpYWxpemVPdXRsaW5lcyhyZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzLnNlcmlhbGl6ZShyZWN0LCB0aGlzLiNnZXRSb3RhdGlvbigpKTtcbiAgfVxuICBzdGF0aWMgc3RhcnRIaWdobGlnaHRpbmcocGFyZW50LCBpc0xUUiwge1xuICAgIHRhcmdldDogdGV4dExheWVyLFxuICAgIHgsXG4gICAgeVxuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgeDogbGF5ZXJYLFxuICAgICAgeTogbGF5ZXJZLFxuICAgICAgd2lkdGg6IHBhcmVudFdpZHRoLFxuICAgICAgaGVpZ2h0OiBwYXJlbnRIZWlnaHRcbiAgICB9ID0gdGV4dExheWVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBvaW50ZXJNb3ZlID0gZSA9PiB7XG4gICAgICB0aGlzLiNoaWdobGlnaHRNb3ZlKHBhcmVudCwgZSk7XG4gICAgfTtcbiAgICBjb25zdCBzaWduYWwgPSBwYXJlbnQuX3NpZ25hbDtcbiAgICBjb25zdCBwb2ludGVyRG93bk9wdGlvbnMgPSB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICBzaWduYWxcbiAgICB9O1xuICAgIGNvbnN0IHBvaW50ZXJEb3duID0gZSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gICAgY29uc3QgcG9pbnRlclVwQ2FsbGJhY2sgPSBlID0+IHtcbiAgICAgIHRleHRMYXllci5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgcG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJVcENhbGxiYWNrKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJVcENhbGxiYWNrKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgcG9pbnRlckRvd24sIHBvaW50ZXJEb3duT3B0aW9ucyk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUpO1xuICAgICAgdGhpcy4jZW5kSGlnaGxpZ2h0KHBhcmVudCwgZSk7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgcG9pbnRlclVwQ2FsbGJhY2ssIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJVcENhbGxiYWNrLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHBvaW50ZXJEb3duLCBwb2ludGVyRG93bk9wdGlvbnMpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGV4dExheWVyLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBwb2ludGVyTW92ZSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5fZnJlZUhpZ2hsaWdodCA9IG5ldyBGcmVlT3V0bGluZXIoe1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9LCBbbGF5ZXJYLCBsYXllclksIHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdLCBwYXJlbnQuc2NhbGUsIHRoaXMuX2RlZmF1bHRUaGlja25lc3MgLyAyLCBpc0xUUiwgMC4wMDEpO1xuICAgICh7XG4gICAgICBpZDogdGhpcy5fZnJlZUhpZ2hsaWdodElkLFxuICAgICAgY2xpcFBhdGhJZDogdGhpcy5fZnJlZUhpZ2hsaWdodENsaXBJZFxuICAgIH0gPSBwYXJlbnQuZHJhd0xheWVyLmhpZ2hsaWdodCh0aGlzLl9mcmVlSGlnaGxpZ2h0LCB0aGlzLl9kZWZhdWx0Q29sb3IsIHRoaXMuX2RlZmF1bHRPcGFjaXR5LCB0cnVlKSk7XG4gIH1cbiAgc3RhdGljICNoaWdobGlnaHRNb3ZlKHBhcmVudCwgZXZlbnQpIHtcbiAgICBpZiAodGhpcy5fZnJlZUhpZ2hsaWdodC5hZGQoZXZlbnQpKSB7XG4gICAgICBwYXJlbnQuZHJhd0xheWVyLnVwZGF0ZVBhdGgodGhpcy5fZnJlZUhpZ2hsaWdodElkLCB0aGlzLl9mcmVlSGlnaGxpZ2h0KTtcbiAgICB9XG4gIH1cbiAgc3RhdGljICNlbmRIaWdobGlnaHQocGFyZW50LCBldmVudCkge1xuICAgIGlmICghdGhpcy5fZnJlZUhpZ2hsaWdodC5pc0VtcHR5KCkpIHtcbiAgICAgIHBhcmVudC5jcmVhdGVBbmRBZGROZXdFZGl0b3IoZXZlbnQsIGZhbHNlLCB7XG4gICAgICAgIGhpZ2hsaWdodElkOiB0aGlzLl9mcmVlSGlnaGxpZ2h0SWQsXG4gICAgICAgIGhpZ2hsaWdodE91dGxpbmVzOiB0aGlzLl9mcmVlSGlnaGxpZ2h0LmdldE91dGxpbmVzKCksXG4gICAgICAgIGNsaXBQYXRoSWQ6IHRoaXMuX2ZyZWVIaWdobGlnaHRDbGlwSWQsXG4gICAgICAgIG1ldGhvZE9mQ3JlYXRpb246IFwibWFpbl90b29sYmFyXCJcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnQuZHJhd0xheWVyLnJlbW92ZUZyZWVIaWdobGlnaHQodGhpcy5fZnJlZUhpZ2hsaWdodElkKTtcbiAgICB9XG4gICAgdGhpcy5fZnJlZUhpZ2hsaWdodElkID0gLTE7XG4gICAgdGhpcy5fZnJlZUhpZ2hsaWdodCA9IG51bGw7XG4gICAgdGhpcy5fZnJlZUhpZ2hsaWdodENsaXBJZCA9IFwiXCI7XG4gIH1cbiAgc3RhdGljIGRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKSB7XG4gICAgY29uc3QgZWRpdG9yID0gc3VwZXIuZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlY3Q6IFtibFgsIGJsWSwgdHJYLCB0clldLFxuICAgICAgY29sb3IsXG4gICAgICBxdWFkUG9pbnRzXG4gICAgfSA9IGRhdGE7XG4gICAgZWRpdG9yLmNvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoLi4uY29sb3IpO1xuICAgIGVkaXRvci4jb3BhY2l0eSA9IGRhdGEub3BhY2l0eTtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IGVkaXRvci5wYWdlRGltZW5zaW9ucztcbiAgICBlZGl0b3Iud2lkdGggPSAodHJYIC0gYmxYKSAvIHBhZ2VXaWR0aDtcbiAgICBlZGl0b3IuaGVpZ2h0ID0gKHRyWSAtIGJsWSkgLyBwYWdlSGVpZ2h0O1xuICAgIGNvbnN0IGJveGVzID0gZWRpdG9yLiNib3hlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVhZFBvaW50cy5sZW5ndGg7IGkgKz0gOCkge1xuICAgICAgYm94ZXMucHVzaCh7XG4gICAgICAgIHg6IChxdWFkUG9pbnRzWzRdIC0gdHJYKSAvIHBhZ2VXaWR0aCxcbiAgICAgICAgeTogKHRyWSAtICgxIC0gcXVhZFBvaW50c1tpICsgNV0pKSAvIHBhZ2VIZWlnaHQsXG4gICAgICAgIHdpZHRoOiAocXVhZFBvaW50c1tpICsgMl0gLSBxdWFkUG9pbnRzW2ldKSAvIHBhZ2VXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiAocXVhZFBvaW50c1tpICsgNV0gLSBxdWFkUG9pbnRzW2kgKyAxXSkgLyBwYWdlSGVpZ2h0XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWRpdG9yLiNjcmVhdGVPdXRsaW5lcygpO1xuICAgIHJldHVybiBlZGl0b3I7XG4gIH1cbiAgc2VyaWFsaXplKGlzRm9yQ29weWluZyA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpIHx8IGlzRm9yQ29weWluZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdldFJlY3QoMCwgMCk7XG4gICAgY29uc3QgY29sb3IgPSBBbm5vdGF0aW9uRWRpdG9yLl9jb2xvck1hbmFnZXIuY29udmVydCh0aGlzLmNvbG9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5ub3RhdGlvblR5cGU6IEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVCxcbiAgICAgIGNvbG9yLFxuICAgICAgb3BhY2l0eTogdGhpcy4jb3BhY2l0eSxcbiAgICAgIHRoaWNrbmVzczogdGhpcy4jdGhpY2tuZXNzLFxuICAgICAgcXVhZFBvaW50czogdGhpcy4jc2VyaWFsaXplQm94ZXMoKSxcbiAgICAgIG91dGxpbmVzOiB0aGlzLiNzZXJpYWxpemVPdXRsaW5lcyhyZWN0KSxcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICByZWN0LFxuICAgICAgcm90YXRpb246IHRoaXMuI2dldFJvdGF0aW9uKCksXG4gICAgICBzdHJ1Y3RUcmVlUGFyZW50SWQ6IHRoaXMuX3N0cnVjdFRyZWVQYXJlbnRJZFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGNhbkNyZWF0ZU5ld0VtcHR5RWRpdG9yKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3IvaW5rLmpzXG5cblxuXG5cblxuY2xhc3MgSW5rRWRpdG9yIGV4dGVuZHMgQW5ub3RhdGlvbkVkaXRvciB7XG4gICNiYXNlSGVpZ2h0ID0gMDtcbiAgI2Jhc2VXaWR0aCA9IDA7XG4gICNib3VuZENhbnZhc1BvaW50ZXJtb3ZlID0gdGhpcy5jYW52YXNQb2ludGVybW92ZS5iaW5kKHRoaXMpO1xuICAjYm91bmRDYW52YXNQb2ludGVybGVhdmUgPSB0aGlzLmNhbnZhc1BvaW50ZXJsZWF2ZS5iaW5kKHRoaXMpO1xuICAjYm91bmRDYW52YXNQb2ludGVydXAgPSB0aGlzLmNhbnZhc1BvaW50ZXJ1cC5iaW5kKHRoaXMpO1xuICAjYm91bmRDYW52YXNQb2ludGVyZG93biA9IHRoaXMuY2FudmFzUG9pbnRlcmRvd24uYmluZCh0aGlzKTtcbiAgI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkID0gbnVsbDtcbiAgI2N1cnJlbnRQYXRoMkQgPSBuZXcgUGF0aDJEKCk7XG4gICNkaXNhYmxlRWRpdGluZyA9IGZhbHNlO1xuICAjaGFzU29tZXRoaW5nVG9EcmF3ID0gZmFsc2U7XG4gICNpc0NhbnZhc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICNvYnNlcnZlciA9IG51bGw7XG4gICNyZWFsV2lkdGggPSAwO1xuICAjcmVhbEhlaWdodCA9IDA7XG4gICNyZXF1ZXN0RnJhbWVDYWxsYmFjayA9IG51bGw7XG4gIHN0YXRpYyBfZGVmYXVsdENvbG9yID0gbnVsbDtcbiAgc3RhdGljIF9kZWZhdWx0T3BhY2l0eSA9IDE7XG4gIHN0YXRpYyBfZGVmYXVsdFRoaWNrbmVzcyA9IDE7XG4gIHN0YXRpYyBfdHlwZSA9IFwiaW5rXCI7XG4gIHN0YXRpYyBfZWRpdG9yVHlwZSA9IEFubm90YXRpb25FZGl0b3JUeXBlLklOSztcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgbmFtZTogXCJpbmtFZGl0b3JcIlxuICAgIH0pO1xuICAgIHRoaXMuY29sb3IgPSBwYXJhbXMuY29sb3IgfHwgbnVsbDtcbiAgICB0aGlzLnRoaWNrbmVzcyA9IHBhcmFtcy50aGlja25lc3MgfHwgbnVsbDtcbiAgICB0aGlzLm9wYWNpdHkgPSBwYXJhbXMub3BhY2l0eSB8fCBudWxsO1xuICAgIHRoaXMucGF0aHMgPSBbXTtcbiAgICB0aGlzLmJlemllclBhdGgyRCA9IFtdO1xuICAgIHRoaXMuYWxsUmF3UGF0aHMgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRQYXRoID0gW107XG4gICAgdGhpcy5zY2FsZUZhY3RvciA9IDE7XG4gICAgdGhpcy50cmFuc2xhdGlvblggPSB0aGlzLnRyYW5zbGF0aW9uWSA9IDA7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICAgIHRoaXMuX3dpbGxLZWVwQXNwZWN0UmF0aW8gPSB0cnVlO1xuICB9XG4gIHN0YXRpYyBpbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcikge1xuICAgIEFubm90YXRpb25FZGl0b3IuaW5pdGlhbGl6ZShsMTBuLCB1aU1hbmFnZXIpO1xuICB9XG4gIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1M6XG4gICAgICAgIElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzcyA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SOlxuICAgICAgICBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFk6XG4gICAgICAgIElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkgPSB2YWx1ZSAvIDEwMDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTOlxuICAgICAgICB0aGlzLiN1cGRhdGVUaGlja25lc3ModmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SOlxuICAgICAgICB0aGlzLiN1cGRhdGVDb2xvcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWTpcbiAgICAgICAgdGhpcy4jdXBkYXRlT3BhY2l0eSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgcmV0dXJuIFtbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX1RISUNLTkVTUywgSW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUiwgSW5rRWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcl0sIFtBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWSwgTWF0aC5yb3VuZChJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5ICogMTAwKV1dO1xuICB9XG4gIGdldCBwcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgcmV0dXJuIFtbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX1RISUNLTkVTUywgdGhpcy50aGlja25lc3MgfHwgSW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUiwgdGhpcy5jb2xvciB8fCBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBBbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZLCBNYXRoLnJvdW5kKDEwMCAqICh0aGlzLm9wYWNpdHkgPz8gSW5rRWRpdG9yLl9kZWZhdWx0T3BhY2l0eSkpXV07XG4gIH1cbiAgI3VwZGF0ZVRoaWNrbmVzcyh0aGlja25lc3MpIHtcbiAgICBjb25zdCBzZXRUaGlja25lc3MgPSB0aCA9PiB7XG4gICAgICB0aGlzLnRoaWNrbmVzcyA9IHRoO1xuICAgICAgdGhpcy4jZml0VG9Db250ZW50KCk7XG4gICAgfTtcbiAgICBjb25zdCBzYXZlZFRoaWNrbmVzcyA9IHRoaXMudGhpY2tuZXNzO1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiBzZXRUaGlja25lc3MuYmluZCh0aGlzLCB0aGlja25lc3MpLFxuICAgICAgdW5kbzogc2V0VGhpY2tuZXNzLmJpbmQodGhpcywgc2F2ZWRUaGlja25lc3MpLFxuICAgICAgcG9zdDogdGhpcy5fdWlNYW5hZ2VyLnVwZGF0ZVVJLmJpbmQodGhpcy5fdWlNYW5hZ2VyLCB0aGlzKSxcbiAgICAgIG11c3RFeGVjOiB0cnVlLFxuICAgICAgdHlwZTogQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX1RISUNLTkVTUyxcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gICN1cGRhdGVDb2xvcihjb2xvcikge1xuICAgIGNvbnN0IHNldENvbG9yID0gY29sID0+IHtcbiAgICAgIHRoaXMuY29sb3IgPSBjb2w7XG4gICAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICB9O1xuICAgIGNvbnN0IHNhdmVkQ29sb3IgPSB0aGlzLmNvbG9yO1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiBzZXRDb2xvci5iaW5kKHRoaXMsIGNvbG9yKSxcbiAgICAgIHVuZG86IHNldENvbG9yLmJpbmQodGhpcywgc2F2ZWRDb2xvciksXG4gICAgICBwb3N0OiB0aGlzLl91aU1hbmFnZXIudXBkYXRlVUkuYmluZCh0aGlzLl91aU1hbmFnZXIsIHRoaXMpLFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1IsXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgfVxuICAjdXBkYXRlT3BhY2l0eShvcGFjaXR5KSB7XG4gICAgY29uc3Qgc2V0T3BhY2l0eSA9IG9wID0+IHtcbiAgICAgIHRoaXMub3BhY2l0eSA9IG9wO1xuICAgICAgdGhpcy4jcmVkcmF3KCk7XG4gICAgfTtcbiAgICBvcGFjaXR5IC89IDEwMDtcbiAgICBjb25zdCBzYXZlZE9wYWNpdHkgPSB0aGlzLm9wYWNpdHk7XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6IHNldE9wYWNpdHkuYmluZCh0aGlzLCBvcGFjaXR5KSxcbiAgICAgIHVuZG86IHNldE9wYWNpdHkuYmluZCh0aGlzLCBzYXZlZE9wYWNpdHkpLFxuICAgICAgcG9zdDogdGhpcy5fdWlNYW5hZ2VyLnVwZGF0ZVVJLmJpbmQodGhpcy5fdWlNYW5hZ2VyLCB0aGlzKSxcbiAgICAgIG11c3RFeGVjOiB0cnVlLFxuICAgICAgdHlwZTogQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFksXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgfVxuICByZWJ1aWxkKCkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIucmVidWlsZCgpO1xuICAgIGlmICh0aGlzLmRpdiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2FudmFzKSB7XG4gICAgICB0aGlzLiNjcmVhdGVDYW52YXMoKTtcbiAgICAgIHRoaXMuI2NyZWF0ZU9ic2VydmVyKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHRoaXMucGFyZW50LmFkZCh0aGlzKTtcbiAgICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcbiAgICB9XG4gICAgdGhpcy4jZml0VG9Db250ZW50KCk7XG4gIH1cbiAgcmVtb3ZlKCkge1xuICAgIGlmICh0aGlzLmNhbnZhcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLmNvbW1pdCgpO1xuICAgIH1cbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgdGhpcy5jYW52YXMucmVtb3ZlKCk7XG4gICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIGlmICh0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkKTtcbiAgICAgIHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy4jb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLiNvYnNlcnZlciA9IG51bGw7XG4gICAgc3VwZXIucmVtb3ZlKCk7XG4gIH1cbiAgc2V0UGFyZW50KHBhcmVudCkge1xuICAgIGlmICghdGhpcy5wYXJlbnQgJiYgcGFyZW50KSB7XG4gICAgICB0aGlzLl91aU1hbmFnZXIucmVtb3ZlU2hvdWxkUmVzY2FsZSh0aGlzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGFyZW50ICYmIHBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmFkZFNob3VsZFJlc2NhbGUodGhpcyk7XG4gICAgfVxuICAgIHN1cGVyLnNldFBhcmVudChwYXJlbnQpO1xuICB9XG4gIG9uU2NhbGVDaGFuZ2luZygpIHtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLndpZHRoICogcGFyZW50V2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQ7XG4gICAgdGhpcy5zZXREaW1lbnNpb25zKHdpZHRoLCBoZWlnaHQpO1xuICB9XG4gIGVuYWJsZUVkaXRNb2RlKCkge1xuICAgIGlmICh0aGlzLiNkaXNhYmxlRWRpdGluZyB8fCB0aGlzLmNhbnZhcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5lbmFibGVFZGl0TW9kZSgpO1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmRvd24sIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWxcbiAgICB9KTtcbiAgfVxuICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpIHx8IHRoaXMuY2FudmFzID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gIXRoaXMuaXNFbXB0eSgpO1xuICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJlZGl0aW5nXCIpO1xuICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJkb3duKTtcbiAgfVxuICBvbmNlQWRkZWQoKSB7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSAhdGhpcy5pc0VtcHR5KCk7XG4gIH1cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXRocy5sZW5ndGggPT09IDAgfHwgdGhpcy5wYXRocy5sZW5ndGggPT09IDEgJiYgdGhpcy5wYXRoc1swXS5sZW5ndGggPT09IDA7XG4gIH1cbiAgI2dldEluaXRpYWxCQm94KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHBhcmVudFJvdGF0aW9uLFxuICAgICAgcGFyZW50RGltZW5zaW9uczogW3dpZHRoLCBoZWlnaHRdXG4gICAgfSA9IHRoaXM7XG4gICAgc3dpdGNoIChwYXJlbnRSb3RhdGlvbikge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIFswLCBoZWlnaHQsIGhlaWdodCwgd2lkdGhdO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiBbd2lkdGgsIGhlaWdodCwgd2lkdGgsIGhlaWdodF07XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgcmV0dXJuIFt3aWR0aCwgMCwgaGVpZ2h0LCB3aWR0aF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gWzAsIDAsIHdpZHRoLCBoZWlnaHRdO1xuICAgIH1cbiAgfVxuICAjc2V0U3Ryb2tlKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGN0eCxcbiAgICAgIGNvbG9yLFxuICAgICAgb3BhY2l0eSxcbiAgICAgIHRoaWNrbmVzcyxcbiAgICAgIHBhcmVudFNjYWxlLFxuICAgICAgc2NhbGVGYWN0b3JcbiAgICB9ID0gdGhpcztcbiAgICBjdHgubGluZVdpZHRoID0gdGhpY2tuZXNzICogcGFyZW50U2NhbGUgLyBzY2FsZUZhY3RvcjtcbiAgICBjdHgubGluZUNhcCA9IFwicm91bmRcIjtcbiAgICBjdHgubGluZUpvaW4gPSBcInJvdW5kXCI7XG4gICAgY3R4Lm1pdGVyTGltaXQgPSAxMDtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBgJHtjb2xvcn0ke29wYWNpdHlUb0hleChvcGFjaXR5KX1gO1xuICB9XG4gICNzdGFydERyYXdpbmcoeCwgeSkge1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmxlYXZlXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmxlYXZlLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVybW92ZSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJ1cCwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmRvd24pO1xuICAgIHRoaXMuaXNFZGl0aW5nID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuI2lzQ2FudmFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuI2lzQ2FudmFzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgdGhpcy4jc2V0Q2FudmFzRGltcygpO1xuICAgICAgdGhpcy50aGlja25lc3MgfHw9IElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzcztcbiAgICAgIHRoaXMuY29sb3IgfHw9IElua0VkaXRvci5fZGVmYXVsdENvbG9yIHx8IEFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3I7XG4gICAgICB0aGlzLm9wYWNpdHkgPz89IElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFBhdGgucHVzaChbeCwgeV0pO1xuICAgIHRoaXMuI2hhc1NvbWV0aGluZ1RvRHJhdyA9IGZhbHNlO1xuICAgIHRoaXMuI3NldFN0cm9rZSgpO1xuICAgIHRoaXMuI3JlcXVlc3RGcmFtZUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy4jZHJhd1BvaW50cygpO1xuICAgICAgaWYgKHRoaXMuI3JlcXVlc3RGcmFtZUNhbGxiYWNrKSB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH07XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLiNyZXF1ZXN0RnJhbWVDYWxsYmFjayk7XG4gIH1cbiAgI2RyYXcoeCwgeSkge1xuICAgIGNvbnN0IFtsYXN0WCwgbGFzdFldID0gdGhpcy5jdXJyZW50UGF0aC5hdCgtMSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhdGgubGVuZ3RoID4gMSAmJiB4ID09PSBsYXN0WCAmJiB5ID09PSBsYXN0WSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHRoaXMuY3VycmVudFBhdGg7XG4gICAgbGV0IHBhdGgyRCA9IHRoaXMuI2N1cnJlbnRQYXRoMkQ7XG4gICAgY3VycmVudFBhdGgucHVzaChbeCwgeV0pO1xuICAgIHRoaXMuI2hhc1NvbWV0aGluZ1RvRHJhdyA9IHRydWU7XG4gICAgaWYgKGN1cnJlbnRQYXRoLmxlbmd0aCA8PSAyKSB7XG4gICAgICBwYXRoMkQubW92ZVRvKC4uLmN1cnJlbnRQYXRoWzBdKTtcbiAgICAgIHBhdGgyRC5saW5lVG8oeCwgeSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50UGF0aC5sZW5ndGggPT09IDMpIHtcbiAgICAgIHRoaXMuI2N1cnJlbnRQYXRoMkQgPSBwYXRoMkQgPSBuZXcgUGF0aDJEKCk7XG4gICAgICBwYXRoMkQubW92ZVRvKC4uLmN1cnJlbnRQYXRoWzBdKTtcbiAgICB9XG4gICAgdGhpcy4jbWFrZUJlemllckN1cnZlKHBhdGgyRCwgLi4uY3VycmVudFBhdGguYXQoLTMpLCAuLi5jdXJyZW50UGF0aC5hdCgtMiksIHgsIHkpO1xuICB9XG4gICNlbmRQYXRoKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0UG9pbnQgPSB0aGlzLmN1cnJlbnRQYXRoLmF0KC0xKTtcbiAgICB0aGlzLiNjdXJyZW50UGF0aDJELmxpbmVUbyguLi5sYXN0UG9pbnQpO1xuICB9XG4gICNzdG9wRHJhd2luZyh4LCB5KSB7XG4gICAgdGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2sgPSBudWxsO1xuICAgIHggPSBNYXRoLm1pbihNYXRoLm1heCh4LCAwKSwgdGhpcy5jYW52YXMud2lkdGgpO1xuICAgIHkgPSBNYXRoLm1pbihNYXRoLm1heCh5LCAwKSwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLiNkcmF3KHgsIHkpO1xuICAgIHRoaXMuI2VuZFBhdGgoKTtcbiAgICBsZXQgYmV6aWVyO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCAhPT0gMSkge1xuICAgICAgYmV6aWVyID0gdGhpcy4jZ2VuZXJhdGVCZXppZXJQb2ludHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeHkgPSBbeCwgeV07XG4gICAgICBiZXppZXIgPSBbW3h5LCB4eS5zbGljZSgpLCB4eS5zbGljZSgpLCB4eV1dO1xuICAgIH1cbiAgICBjb25zdCBwYXRoMkQgPSB0aGlzLiNjdXJyZW50UGF0aDJEO1xuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gdGhpcy5jdXJyZW50UGF0aDtcbiAgICB0aGlzLmN1cnJlbnRQYXRoID0gW107XG4gICAgdGhpcy4jY3VycmVudFBhdGgyRCA9IG5ldyBQYXRoMkQoKTtcbiAgICBjb25zdCBjbWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmFsbFJhd1BhdGhzLnB1c2goY3VycmVudFBhdGgpO1xuICAgICAgdGhpcy5wYXRocy5wdXNoKGJlemllcik7XG4gICAgICB0aGlzLmJlemllclBhdGgyRC5wdXNoKHBhdGgyRCk7XG4gICAgICB0aGlzLl91aU1hbmFnZXIucmVidWlsZCh0aGlzKTtcbiAgICB9O1xuICAgIGNvbnN0IHVuZG8gPSAoKSA9PiB7XG4gICAgICB0aGlzLmFsbFJhd1BhdGhzLnBvcCgpO1xuICAgICAgdGhpcy5wYXRocy5wb3AoKTtcbiAgICAgIHRoaXMuYmV6aWVyUGF0aDJELnBvcCgpO1xuICAgICAgaWYgKHRoaXMucGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgdGhpcy4jY3JlYXRlQ2FudmFzKCk7XG4gICAgICAgICAgdGhpcy4jY3JlYXRlT2JzZXJ2ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmaXRUb0NvbnRlbnQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kLFxuICAgICAgdW5kbyxcbiAgICAgIG11c3RFeGVjOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgI2RyYXdQb2ludHMoKSB7XG4gICAgaWYgKCF0aGlzLiNoYXNTb21ldGhpbmdUb0RyYXcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaGFzU29tZXRoaW5nVG9EcmF3ID0gZmFsc2U7XG4gICAgY29uc3QgdGhpY2tuZXNzID0gTWF0aC5jZWlsKHRoaXMudGhpY2tuZXNzICogdGhpcy5wYXJlbnRTY2FsZSk7XG4gICAgY29uc3QgbGFzdFBvaW50cyA9IHRoaXMuY3VycmVudFBhdGguc2xpY2UoLTMpO1xuICAgIGNvbnN0IHggPSBsYXN0UG9pbnRzLm1hcCh4eSA9PiB4eVswXSk7XG4gICAgY29uc3QgeSA9IGxhc3RQb2ludHMubWFwKHh5ID0+IHh5WzFdKTtcbiAgICBjb25zdCB4TWluID0gTWF0aC5taW4oLi4ueCkgLSB0aGlja25lc3M7XG4gICAgY29uc3QgeE1heCA9IE1hdGgubWF4KC4uLngpICsgdGhpY2tuZXNzO1xuICAgIGNvbnN0IHlNaW4gPSBNYXRoLm1pbiguLi55KSAtIHRoaWNrbmVzcztcbiAgICBjb25zdCB5TWF4ID0gTWF0aC5tYXgoLi4ueSkgKyB0aGlja25lc3M7XG4gICAgY29uc3Qge1xuICAgICAgY3R4XG4gICAgfSA9IHRoaXM7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLmJlemllclBhdGgyRCkge1xuICAgICAgY3R4LnN0cm9rZShwYXRoKTtcbiAgICB9XG4gICAgY3R4LnN0cm9rZSh0aGlzLiNjdXJyZW50UGF0aDJEKTtcbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG4gICNtYWtlQmV6aWVyQ3VydmUocGF0aDJELCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgY29uc3QgcHJldlggPSAoeDAgKyB4MSkgLyAyO1xuICAgIGNvbnN0IHByZXZZID0gKHkwICsgeTEpIC8gMjtcbiAgICBjb25zdCB4MyA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgeTMgPSAoeTEgKyB5MikgLyAyO1xuICAgIHBhdGgyRC5iZXppZXJDdXJ2ZVRvKHByZXZYICsgMiAqICh4MSAtIHByZXZYKSAvIDMsIHByZXZZICsgMiAqICh5MSAtIHByZXZZKSAvIDMsIHgzICsgMiAqICh4MSAtIHgzKSAvIDMsIHkzICsgMiAqICh5MSAtIHkzKSAvIDMsIHgzLCB5Myk7XG4gIH1cbiAgI2dlbmVyYXRlQmV6aWVyUG9pbnRzKCkge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgIGlmIChwYXRoLmxlbmd0aCA8PSAyKSB7XG4gICAgICByZXR1cm4gW1twYXRoWzBdLCBwYXRoWzBdLCBwYXRoLmF0KC0xKSwgcGF0aC5hdCgtMSldXTtcbiAgICB9XG4gICAgY29uc3QgYmV6aWVyUG9pbnRzID0gW107XG4gICAgbGV0IGk7XG4gICAgbGV0IFt4MCwgeTBdID0gcGF0aFswXTtcbiAgICBmb3IgKGkgPSAxOyBpIDwgcGF0aC5sZW5ndGggLSAyOyBpKyspIHtcbiAgICAgIGNvbnN0IFt4MSwgeTFdID0gcGF0aFtpXTtcbiAgICAgIGNvbnN0IFt4MiwgeTJdID0gcGF0aFtpICsgMV07XG4gICAgICBjb25zdCB4MyA9ICh4MSArIHgyKSAvIDI7XG4gICAgICBjb25zdCB5MyA9ICh5MSArIHkyKSAvIDI7XG4gICAgICBjb25zdCBjb250cm9sMSA9IFt4MCArIDIgKiAoeDEgLSB4MCkgLyAzLCB5MCArIDIgKiAoeTEgLSB5MCkgLyAzXTtcbiAgICAgIGNvbnN0IGNvbnRyb2wyID0gW3gzICsgMiAqICh4MSAtIHgzKSAvIDMsIHkzICsgMiAqICh5MSAtIHkzKSAvIDNdO1xuICAgICAgYmV6aWVyUG9pbnRzLnB1c2goW1t4MCwgeTBdLCBjb250cm9sMSwgY29udHJvbDIsIFt4MywgeTNdXSk7XG4gICAgICBbeDAsIHkwXSA9IFt4MywgeTNdO1xuICAgIH1cbiAgICBjb25zdCBbeDEsIHkxXSA9IHBhdGhbaV07XG4gICAgY29uc3QgW3gyLCB5Ml0gPSBwYXRoW2kgKyAxXTtcbiAgICBjb25zdCBjb250cm9sMSA9IFt4MCArIDIgKiAoeDEgLSB4MCkgLyAzLCB5MCArIDIgKiAoeTEgLSB5MCkgLyAzXTtcbiAgICBjb25zdCBjb250cm9sMiA9IFt4MiArIDIgKiAoeDEgLSB4MikgLyAzLCB5MiArIDIgKiAoeTEgLSB5MikgLyAzXTtcbiAgICBiZXppZXJQb2ludHMucHVzaChbW3gwLCB5MF0sIGNvbnRyb2wxLCBjb250cm9sMiwgW3gyLCB5Ml1dKTtcbiAgICByZXR1cm4gYmV6aWVyUG9pbnRzO1xuICB9XG4gICNyZWRyYXcoKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLiN1cGRhdGVUcmFuc2Zvcm0oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jc2V0U3Ryb2tlKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2FudmFzLFxuICAgICAgY3R4XG4gICAgfSA9IHRoaXM7XG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy4jdXBkYXRlVHJhbnNmb3JtKCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHRoaXMuYmV6aWVyUGF0aDJEKSB7XG4gICAgICBjdHguc3Ryb2tlKHBhdGgpO1xuICAgIH1cbiAgfVxuICBjb21taXQoKSB7XG4gICAgaWYgKHRoaXMuI2Rpc2FibGVFZGl0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmNvbW1pdCgpO1xuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICB0aGlzLnNldEluRm9yZWdyb3VuZCgpO1xuICAgIHRoaXMuI2Rpc2FibGVFZGl0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWRcIik7XG4gICAgdGhpcy4jZml0VG9Db250ZW50KHRydWUpO1xuICAgIHRoaXMuc2VsZWN0KCk7XG4gICAgdGhpcy5wYXJlbnQuYWRkSW5rRWRpdG9ySWZOZWVkZWQodHJ1ZSk7XG4gICAgdGhpcy5tb3ZlSW5ET00oKTtcbiAgICB0aGlzLmRpdi5mb2N1cyh7XG4gICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgZm9jdXNpbihldmVudCkge1xuICAgIGlmICghdGhpcy5fZm9jdXNFdmVudHNBbGxvd2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmZvY3VzaW4oZXZlbnQpO1xuICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgfVxuICBjYW52YXNQb2ludGVyZG93bihldmVudCkge1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgIXRoaXMuaXNJbkVkaXRNb2RlKCkgfHwgdGhpcy4jZGlzYWJsZUVkaXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRJbkZvcmVncm91bmQoKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghdGhpcy5kaXYuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIHRoaXMuZGl2LmZvY3VzKHtcbiAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuI3N0YXJ0RHJhd2luZyhldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgfVxuICBjYW52YXNQb2ludGVybW92ZShldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy4jZHJhdyhldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgfVxuICBjYW52YXNQb2ludGVydXAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuI2VuZERyYXdpbmcoZXZlbnQpO1xuICB9XG4gIGNhbnZhc1BvaW50ZXJsZWF2ZShldmVudCkge1xuICAgIHRoaXMuI2VuZERyYXdpbmcoZXZlbnQpO1xuICB9XG4gICNlbmREcmF3aW5nKGV2ZW50KSB7XG4gICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJsZWF2ZVwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJsZWF2ZSk7XG4gICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcm1vdmUpO1xuICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVydXApO1xuICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJkb3duLCB7XG4gICAgICBzaWduYWw6IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQpO1xuICAgIH1cbiAgICB0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy4jY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUpO1xuICAgIH0sIDEwKTtcbiAgICB0aGlzLiNzdG9wRHJhd2luZyhldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgICB0aGlzLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoKTtcbiAgICB0aGlzLnNldEluQmFja2dyb3VuZCgpO1xuICB9XG4gICNjcmVhdGVDYW52YXMoKSB7XG4gICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICB0aGlzLmNhbnZhcy5jbGFzc05hbWUgPSBcImlua0VkaXRvckNhbnZhc1wiO1xuICAgIHRoaXMuY2FudmFzLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLWluay1jYW52YXNcIik7XG4gICAgdGhpcy5kaXYuYXBwZW5kKHRoaXMuY2FudmFzKTtcbiAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgfVxuICAjY3JlYXRlT2JzZXJ2ZXIoKSB7XG4gICAgdGhpcy4jb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gZW50cmllc1swXS5jb250ZW50UmVjdDtcbiAgICAgIGlmIChyZWN0LndpZHRoICYmIHJlY3QuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuc2V0RGltZW5zaW9ucyhyZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy4jb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmRpdik7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHtcbiAgICAgIHRoaXMuI29ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLiNvYnNlcnZlciA9IG51bGw7XG4gICAgfSwge1xuICAgICAgb25jZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIGdldCBpc1Jlc2l6YWJsZSgpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNFbXB0eSgpICYmIHRoaXMuI2Rpc2FibGVFZGl0aW5nO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5kaXYpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpdjtcbiAgICB9XG4gICAgbGV0IGJhc2VYLCBiYXNlWTtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgYmFzZVggPSB0aGlzLng7XG4gICAgICBiYXNlWSA9IHRoaXMueTtcbiAgICB9XG4gICAgc3VwZXIucmVuZGVyKCk7XG4gICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtaW5rXCIpO1xuICAgIGNvbnN0IFt4LCB5LCB3LCBoXSA9IHRoaXMuI2dldEluaXRpYWxCQm94KCk7XG4gICAgdGhpcy5zZXRBdCh4LCB5LCAwLCAwKTtcbiAgICB0aGlzLnNldERpbXModywgaCk7XG4gICAgdGhpcy4jY3JlYXRlQ2FudmFzKCk7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgIHRoaXMuc2V0QXNwZWN0UmF0aW8odGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgICB0aGlzLnNldEF0KGJhc2VYICogcGFyZW50V2lkdGgsIGJhc2VZICogcGFyZW50SGVpZ2h0LCB0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcbiAgICAgIHRoaXMuI2lzQ2FudmFzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgdGhpcy4jc2V0Q2FudmFzRGltcygpO1xuICAgICAgdGhpcy5zZXREaW1zKHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgICAgdGhpcy4jcmVkcmF3KCk7XG4gICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJlZGl0aW5nXCIpO1xuICAgICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuICAgIH1cbiAgICB0aGlzLiNjcmVhdGVPYnNlcnZlcigpO1xuICAgIHJldHVybiB0aGlzLmRpdjtcbiAgfVxuICAjc2V0Q2FudmFzRGltcygpIHtcbiAgICBpZiAoIXRoaXMuI2lzQ2FudmFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gTWF0aC5jZWlsKHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCk7XG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gTWF0aC5jZWlsKHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcbiAgICB0aGlzLiN1cGRhdGVUcmFuc2Zvcm0oKTtcbiAgfVxuICBzZXREaW1lbnNpb25zKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCByb3VuZGVkV2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoKTtcbiAgICBjb25zdCByb3VuZGVkSGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuICAgIGlmICh0aGlzLiNyZWFsV2lkdGggPT09IHJvdW5kZWRXaWR0aCAmJiB0aGlzLiNyZWFsSGVpZ2h0ID09PSByb3VuZGVkSGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3JlYWxXaWR0aCA9IHJvdW5kZWRXaWR0aDtcbiAgICB0aGlzLiNyZWFsSGVpZ2h0ID0gcm91bmRlZEhlaWdodDtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoIC8gcGFyZW50V2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgLyBwYXJlbnRIZWlnaHQ7XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgIGlmICh0aGlzLiNkaXNhYmxlRWRpdGluZykge1xuICAgICAgdGhpcy4jc2V0U2NhbGVGYWN0b3Iod2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcbiAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG4gICAgdGhpcy5maXhEaW1zKCk7XG4gIH1cbiAgI3NldFNjYWxlRmFjdG9yKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy4jZ2V0UGFkZGluZygpO1xuICAgIGNvbnN0IHNjYWxlRmFjdG9yVyA9ICh3aWR0aCAtIHBhZGRpbmcpIC8gdGhpcy4jYmFzZVdpZHRoO1xuICAgIGNvbnN0IHNjYWxlRmFjdG9ySCA9IChoZWlnaHQgLSBwYWRkaW5nKSAvIHRoaXMuI2Jhc2VIZWlnaHQ7XG4gICAgdGhpcy5zY2FsZUZhY3RvciA9IE1hdGgubWluKHNjYWxlRmFjdG9yVywgc2NhbGVGYWN0b3JIKTtcbiAgfVxuICAjdXBkYXRlVHJhbnNmb3JtKCkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLiNnZXRQYWRkaW5nKCkgLyAyO1xuICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSh0aGlzLnNjYWxlRmFjdG9yLCAwLCAwLCB0aGlzLnNjYWxlRmFjdG9yLCB0aGlzLnRyYW5zbGF0aW9uWCAqIHRoaXMuc2NhbGVGYWN0b3IgKyBwYWRkaW5nLCB0aGlzLnRyYW5zbGF0aW9uWSAqIHRoaXMuc2NhbGVGYWN0b3IgKyBwYWRkaW5nKTtcbiAgfVxuICBzdGF0aWMgI2J1aWxkUGF0aDJEKGJlemllcikge1xuICAgIGNvbnN0IHBhdGgyRCA9IG5ldyBQYXRoMkQoKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBiZXppZXIubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3QgW2ZpcnN0LCBjb250cm9sMSwgY29udHJvbDIsIHNlY29uZF0gPSBiZXppZXJbaV07XG4gICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICBwYXRoMkQubW92ZVRvKC4uLmZpcnN0KTtcbiAgICAgIH1cbiAgICAgIHBhdGgyRC5iZXppZXJDdXJ2ZVRvKGNvbnRyb2wxWzBdLCBjb250cm9sMVsxXSwgY29udHJvbDJbMF0sIGNvbnRyb2wyWzFdLCBzZWNvbmRbMF0sIHNlY29uZFsxXSk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoMkQ7XG4gIH1cbiAgc3RhdGljICN0b1BERkNvb3JkaW5hdGVzKHBvaW50cywgcmVjdCwgcm90YXRpb24pIHtcbiAgICBjb25zdCBbYmxYLCBibFksIHRyWCwgdHJZXSA9IHJlY3Q7XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIHBvaW50c1tpXSArPSBibFg7XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSA9IHRyWSAtIHBvaW50c1tpICsgMV07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIGNvbnN0IHggPSBwb2ludHNbaV07XG4gICAgICAgICAgcG9pbnRzW2ldID0gcG9pbnRzW2kgKyAxXSArIGJsWDtcbiAgICAgICAgICBwb2ludHNbaSArIDFdID0geCArIGJsWTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIHBvaW50c1tpXSA9IHRyWCAtIHBvaW50c1tpXTtcbiAgICAgICAgICBwb2ludHNbaSArIDFdICs9IGJsWTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgICAgIGNvbnN0IHggPSBwb2ludHNbaV07XG4gICAgICAgICAgcG9pbnRzW2ldID0gdHJYIC0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgICBwb2ludHNbaSArIDFdID0gdHJZIC0geDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHM7XG4gIH1cbiAgc3RhdGljICNmcm9tUERGQ29vcmRpbmF0ZXMocG9pbnRzLCByZWN0LCByb3RhdGlvbikge1xuICAgIGNvbnN0IFtibFgsIGJsWSwgdHJYLCB0clldID0gcmVjdDtcbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgcG9pbnRzW2ldIC09IGJsWDtcbiAgICAgICAgICBwb2ludHNbaSArIDFdID0gdHJZIC0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgY29uc3QgeCA9IHBvaW50c1tpXTtcbiAgICAgICAgICBwb2ludHNbaV0gPSBwb2ludHNbaSArIDFdIC0gYmxZO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gPSB4IC0gYmxYO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgcG9pbnRzW2ldID0gdHJYIC0gcG9pbnRzW2ldO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gLT0gYmxZO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgY29uc3QgeCA9IHBvaW50c1tpXTtcbiAgICAgICAgICBwb2ludHNbaV0gPSB0clkgLSBwb2ludHNbaSArIDFdO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gPSB0clggLSB4O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuICAjc2VyaWFsaXplUGF0aHMocywgdHgsIHR5LCByZWN0KSB7XG4gICAgY29uc3QgcGF0aHMgPSBbXTtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy50aGlja25lc3MgLyAyO1xuICAgIGNvbnN0IHNoaWZ0WCA9IHMgKiB0eCArIHBhZGRpbmc7XG4gICAgY29uc3Qgc2hpZnRZID0gcyAqIHR5ICsgcGFkZGluZztcbiAgICBmb3IgKGNvbnN0IGJlemllciBvZiB0aGlzLnBhdGhzKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBbXTtcbiAgICAgIGNvbnN0IHBvaW50cyA9IFtdO1xuICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gYmV6aWVyLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBjb250cm9sMSwgY29udHJvbDIsIHNlY29uZF0gPSBiZXppZXJbal07XG4gICAgICAgIGlmIChmaXJzdFswXSA9PT0gc2Vjb25kWzBdICYmIGZpcnN0WzFdID09PSBzZWNvbmRbMV0gJiYgamogPT09IDEpIHtcbiAgICAgICAgICBjb25zdCBwMCA9IHMgKiBmaXJzdFswXSArIHNoaWZ0WDtcbiAgICAgICAgICBjb25zdCBwMSA9IHMgKiBmaXJzdFsxXSArIHNoaWZ0WTtcbiAgICAgICAgICBidWZmZXIucHVzaChwMCwgcDEpO1xuICAgICAgICAgIHBvaW50cy5wdXNoKHAwLCBwMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcDEwID0gcyAqIGZpcnN0WzBdICsgc2hpZnRYO1xuICAgICAgICBjb25zdCBwMTEgPSBzICogZmlyc3RbMV0gKyBzaGlmdFk7XG4gICAgICAgIGNvbnN0IHAyMCA9IHMgKiBjb250cm9sMVswXSArIHNoaWZ0WDtcbiAgICAgICAgY29uc3QgcDIxID0gcyAqIGNvbnRyb2wxWzFdICsgc2hpZnRZO1xuICAgICAgICBjb25zdCBwMzAgPSBzICogY29udHJvbDJbMF0gKyBzaGlmdFg7XG4gICAgICAgIGNvbnN0IHAzMSA9IHMgKiBjb250cm9sMlsxXSArIHNoaWZ0WTtcbiAgICAgICAgY29uc3QgcDQwID0gcyAqIHNlY29uZFswXSArIHNoaWZ0WDtcbiAgICAgICAgY29uc3QgcDQxID0gcyAqIHNlY29uZFsxXSArIHNoaWZ0WTtcbiAgICAgICAgaWYgKGogPT09IDApIHtcbiAgICAgICAgICBidWZmZXIucHVzaChwMTAsIHAxMSk7XG4gICAgICAgICAgcG9pbnRzLnB1c2gocDEwLCBwMTEpO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlci5wdXNoKHAyMCwgcDIxLCBwMzAsIHAzMSwgcDQwLCBwNDEpO1xuICAgICAgICBwb2ludHMucHVzaChwMjAsIHAyMSk7XG4gICAgICAgIGlmIChqID09PSBqaiAtIDEpIHtcbiAgICAgICAgICBwb2ludHMucHVzaChwNDAsIHA0MSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhdGhzLnB1c2goe1xuICAgICAgICBiZXppZXI6IElua0VkaXRvci4jdG9QREZDb29yZGluYXRlcyhidWZmZXIsIHJlY3QsIHRoaXMucm90YXRpb24pLFxuICAgICAgICBwb2ludHM6IElua0VkaXRvci4jdG9QREZDb29yZGluYXRlcyhwb2ludHMsIHJlY3QsIHRoaXMucm90YXRpb24pXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhzO1xuICB9XG4gICNnZXRCYm94KCkge1xuICAgIGxldCB4TWluID0gSW5maW5pdHk7XG4gICAgbGV0IHhNYXggPSAtSW5maW5pdHk7XG4gICAgbGV0IHlNaW4gPSBJbmZpbml0eTtcbiAgICBsZXQgeU1heCA9IC1JbmZpbml0eTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5wYXRocykge1xuICAgICAgZm9yIChjb25zdCBbZmlyc3QsIGNvbnRyb2wxLCBjb250cm9sMiwgc2Vjb25kXSBvZiBwYXRoKSB7XG4gICAgICAgIGNvbnN0IGJib3ggPSBVdGlsLmJlemllckJvdW5kaW5nQm94KC4uLmZpcnN0LCAuLi5jb250cm9sMSwgLi4uY29udHJvbDIsIC4uLnNlY29uZCk7XG4gICAgICAgIHhNaW4gPSBNYXRoLm1pbih4TWluLCBiYm94WzBdKTtcbiAgICAgICAgeU1pbiA9IE1hdGgubWluKHlNaW4sIGJib3hbMV0pO1xuICAgICAgICB4TWF4ID0gTWF0aC5tYXgoeE1heCwgYmJveFsyXSk7XG4gICAgICAgIHlNYXggPSBNYXRoLm1heCh5TWF4LCBiYm94WzNdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFt4TWluLCB5TWluLCB4TWF4LCB5TWF4XTtcbiAgfVxuICAjZ2V0UGFkZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jZGlzYWJsZUVkaXRpbmcgPyBNYXRoLmNlaWwodGhpcy50aGlja25lc3MgKiB0aGlzLnBhcmVudFNjYWxlKSA6IDA7XG4gIH1cbiAgI2ZpdFRvQ29udGVudChmaXJzdFRpbWUgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2Rpc2FibGVFZGl0aW5nKSB7XG4gICAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYmJveCA9IHRoaXMuI2dldEJib3goKTtcbiAgICBjb25zdCBwYWRkaW5nID0gdGhpcy4jZ2V0UGFkZGluZygpO1xuICAgIHRoaXMuI2Jhc2VXaWR0aCA9IE1hdGgubWF4KEFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUsIGJib3hbMl0gLSBiYm94WzBdKTtcbiAgICB0aGlzLiNiYXNlSGVpZ2h0ID0gTWF0aC5tYXgoQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgYmJveFszXSAtIGJib3hbMV0pO1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKHBhZGRpbmcgKyB0aGlzLiNiYXNlV2lkdGggKiB0aGlzLnNjYWxlRmFjdG9yKTtcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmNlaWwocGFkZGluZyArIHRoaXMuI2Jhc2VIZWlnaHQgKiB0aGlzLnNjYWxlRmFjdG9yKTtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoIC8gcGFyZW50V2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgLyBwYXJlbnRIZWlnaHQ7XG4gICAgdGhpcy5zZXRBc3BlY3RSYXRpbyh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCBwcmV2VHJhbnNsYXRpb25YID0gdGhpcy50cmFuc2xhdGlvblg7XG4gICAgY29uc3QgcHJldlRyYW5zbGF0aW9uWSA9IHRoaXMudHJhbnNsYXRpb25ZO1xuICAgIHRoaXMudHJhbnNsYXRpb25YID0gLWJib3hbMF07XG4gICAgdGhpcy50cmFuc2xhdGlvblkgPSAtYmJveFsxXTtcbiAgICB0aGlzLiNzZXRDYW52YXNEaW1zKCk7XG4gICAgdGhpcy4jcmVkcmF3KCk7XG4gICAgdGhpcy4jcmVhbFdpZHRoID0gd2lkdGg7XG4gICAgdGhpcy4jcmVhbEhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLnNldERpbXMod2lkdGgsIGhlaWdodCk7XG4gICAgY29uc3QgdW5zY2FsZWRQYWRkaW5nID0gZmlyc3RUaW1lID8gcGFkZGluZyAvIHRoaXMuc2NhbGVGYWN0b3IgLyAyIDogMDtcbiAgICB0aGlzLnRyYW5zbGF0ZShwcmV2VHJhbnNsYXRpb25YIC0gdGhpcy50cmFuc2xhdGlvblggLSB1bnNjYWxlZFBhZGRpbmcsIHByZXZUcmFuc2xhdGlvblkgLSB0aGlzLnRyYW5zbGF0aW9uWSAtIHVuc2NhbGVkUGFkZGluZyk7XG4gIH1cbiAgc3RhdGljIGRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKSB7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBJbmtBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvciA9IHN1cGVyLmRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKTtcbiAgICBlZGl0b3IudGhpY2tuZXNzID0gZGF0YS50aGlja25lc3M7XG4gICAgZWRpdG9yLmNvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoLi4uZGF0YS5jb2xvcik7XG4gICAgZWRpdG9yLm9wYWNpdHkgPSBkYXRhLm9wYWNpdHk7XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSBlZGl0b3IucGFnZURpbWVuc2lvbnM7XG4gICAgY29uc3Qgd2lkdGggPSBlZGl0b3Iud2lkdGggKiBwYWdlV2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWRpdG9yLmhlaWdodCAqIHBhZ2VIZWlnaHQ7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3IgPSBlZGl0b3IucGFyZW50U2NhbGU7XG4gICAgY29uc3QgcGFkZGluZyA9IGRhdGEudGhpY2tuZXNzIC8gMjtcbiAgICBlZGl0b3IuI2Rpc2FibGVFZGl0aW5nID0gdHJ1ZTtcbiAgICBlZGl0b3IuI3JlYWxXaWR0aCA9IE1hdGgucm91bmQod2lkdGgpO1xuICAgIGVkaXRvci4jcmVhbEhlaWdodCA9IE1hdGgucm91bmQoaGVpZ2h0KTtcbiAgICBjb25zdCB7XG4gICAgICBwYXRocyxcbiAgICAgIHJlY3QsXG4gICAgICByb3RhdGlvblxuICAgIH0gPSBkYXRhO1xuICAgIGZvciAobGV0IHtcbiAgICAgIGJlemllclxuICAgIH0gb2YgcGF0aHMpIHtcbiAgICAgIGJlemllciA9IElua0VkaXRvci4jZnJvbVBERkNvb3JkaW5hdGVzKGJlemllciwgcmVjdCwgcm90YXRpb24pO1xuICAgICAgY29uc3QgcGF0aCA9IFtdO1xuICAgICAgZWRpdG9yLnBhdGhzLnB1c2gocGF0aCk7XG4gICAgICBsZXQgcDAgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbMF0gLSBwYWRkaW5nKTtcbiAgICAgIGxldCBwMSA9IHNjYWxlRmFjdG9yICogKGJlemllclsxXSAtIHBhZGRpbmcpO1xuICAgICAgZm9yIChsZXQgaSA9IDIsIGlpID0gYmV6aWVyLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHtcbiAgICAgICAgY29uc3QgcDEwID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2ldIC0gcGFkZGluZyk7XG4gICAgICAgIGNvbnN0IHAxMSA9IHNjYWxlRmFjdG9yICogKGJlemllcltpICsgMV0gLSBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgcDIwID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2kgKyAyXSAtIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCBwMjEgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaSArIDNdIC0gcGFkZGluZyk7XG4gICAgICAgIGNvbnN0IHAzMCA9IHNjYWxlRmFjdG9yICogKGJlemllcltpICsgNF0gLSBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgcDMxID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2kgKyA1XSAtIHBhZGRpbmcpO1xuICAgICAgICBwYXRoLnB1c2goW1twMCwgcDFdLCBbcDEwLCBwMTFdLCBbcDIwLCBwMjFdLCBbcDMwLCBwMzFdXSk7XG4gICAgICAgIHAwID0gcDMwO1xuICAgICAgICBwMSA9IHAzMTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGgyRCA9IHRoaXMuI2J1aWxkUGF0aDJEKHBhdGgpO1xuICAgICAgZWRpdG9yLmJlemllclBhdGgyRC5wdXNoKHBhdGgyRCk7XG4gICAgfVxuICAgIGNvbnN0IGJib3ggPSBlZGl0b3IuI2dldEJib3goKTtcbiAgICBlZGl0b3IuI2Jhc2VXaWR0aCA9IE1hdGgubWF4KEFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUsIGJib3hbMl0gLSBiYm94WzBdKTtcbiAgICBlZGl0b3IuI2Jhc2VIZWlnaHQgPSBNYXRoLm1heChBbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFLCBiYm94WzNdIC0gYmJveFsxXSk7XG4gICAgZWRpdG9yLiNzZXRTY2FsZUZhY3Rvcih3aWR0aCwgaGVpZ2h0KTtcbiAgICByZXR1cm4gZWRpdG9yO1xuICB9XG4gIHNlcmlhbGl6ZSgpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRSZWN0KDAsIDApO1xuICAgIGNvbnN0IGNvbG9yID0gQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5jdHguc3Ryb2tlU3R5bGUpO1xuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uVHlwZTogQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LLFxuICAgICAgY29sb3IsXG4gICAgICB0aGlja25lc3M6IHRoaXMudGhpY2tuZXNzLFxuICAgICAgb3BhY2l0eTogdGhpcy5vcGFjaXR5LFxuICAgICAgcGF0aHM6IHRoaXMuI3NlcmlhbGl6ZVBhdGhzKHRoaXMuc2NhbGVGYWN0b3IgLyB0aGlzLnBhcmVudFNjYWxlLCB0aGlzLnRyYW5zbGF0aW9uWCwgdGhpcy50cmFuc2xhdGlvblksIHJlY3QpLFxuICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgIHJlY3QsXG4gICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbixcbiAgICAgIHN0cnVjdFRyZWVQYXJlbnRJZDogdGhpcy5fc3RydWN0VHJlZVBhcmVudElkXG4gICAgfTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9lZGl0b3Ivc3RhbXAuanNcblxuXG5cblxuY2xhc3MgU3RhbXBFZGl0b3IgZXh0ZW5kcyBBbm5vdGF0aW9uRWRpdG9yIHtcbiAgI2JpdG1hcCA9IG51bGw7XG4gICNiaXRtYXBJZCA9IG51bGw7XG4gICNiaXRtYXBQcm9taXNlID0gbnVsbDtcbiAgI2JpdG1hcFVybCA9IG51bGw7XG4gICNiaXRtYXBGaWxlID0gbnVsbDtcbiAgI2JpdG1hcEZpbGVOYW1lID0gXCJcIjtcbiAgI2NhbnZhcyA9IG51bGw7XG4gICNvYnNlcnZlciA9IG51bGw7XG4gICNyZXNpemVUaW1lb3V0SWQgPSBudWxsO1xuICAjaXNTdmcgPSBmYWxzZTtcbiAgI2hhc0JlZW5BZGRlZEluVW5kb1N0YWNrID0gZmFsc2U7XG4gIHN0YXRpYyBfdHlwZSA9IFwic3RhbXBcIjtcbiAgc3RhdGljIF9lZGl0b3JUeXBlID0gQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVA7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIG5hbWU6IFwic3RhbXBFZGl0b3JcIlxuICAgIH0pO1xuICAgIHRoaXMuI2JpdG1hcFVybCA9IHBhcmFtcy5iaXRtYXBVcmw7XG4gICAgdGhpcy4jYml0bWFwRmlsZSA9IHBhcmFtcy5iaXRtYXBGaWxlO1xuICB9XG4gIHN0YXRpYyBpbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcikge1xuICAgIEFubm90YXRpb25FZGl0b3IuaW5pdGlhbGl6ZShsMTBuLCB1aU1hbmFnZXIpO1xuICB9XG4gIHN0YXRpYyBnZXQgc3VwcG9ydGVkVHlwZXMoKSB7XG4gICAgY29uc3QgdHlwZXMgPSBbXCJhcG5nXCIsIFwiYXZpZlwiLCBcImJtcFwiLCBcImdpZlwiLCBcImpwZWdcIiwgXCJwbmdcIiwgXCJzdmcreG1sXCIsIFwid2VicFwiLCBcIngtaWNvblwiXTtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwic3VwcG9ydGVkVHlwZXNcIiwgdHlwZXMubWFwKHR5cGUgPT4gYGltYWdlLyR7dHlwZX1gKSk7XG4gIH1cbiAgc3RhdGljIGdldCBzdXBwb3J0ZWRUeXBlc1N0cigpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwic3VwcG9ydGVkVHlwZXNTdHJcIiwgdGhpcy5zdXBwb3J0ZWRUeXBlcy5qb2luKFwiLFwiKSk7XG4gIH1cbiAgc3RhdGljIGlzSGFuZGxpbmdNaW1lRm9yUGFzdGluZyhtaW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcG9ydGVkVHlwZXMuaW5jbHVkZXMobWltZSk7XG4gIH1cbiAgc3RhdGljIHBhc3RlKGl0ZW0sIHBhcmVudCkge1xuICAgIHBhcmVudC5wYXN0ZUVkaXRvcihBbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUCwge1xuICAgICAgYml0bWFwRmlsZTogaXRlbS5nZXRBc0ZpbGUoKVxuICAgIH0pO1xuICB9XG4gICNnZXRCaXRtYXBGZXRjaGVkKGRhdGEsIGZyb21JZCA9IGZhbHNlKSB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNiaXRtYXAgPSBkYXRhLmJpdG1hcDtcbiAgICBpZiAoIWZyb21JZCkge1xuICAgICAgdGhpcy4jYml0bWFwSWQgPSBkYXRhLmlkO1xuICAgICAgdGhpcy4jaXNTdmcgPSBkYXRhLmlzU3ZnO1xuICAgIH1cbiAgICBpZiAoZGF0YS5maWxlKSB7XG4gICAgICB0aGlzLiNiaXRtYXBGaWxlTmFtZSA9IGRhdGEuZmlsZS5uYW1lO1xuICAgIH1cbiAgICB0aGlzLiNjcmVhdGVDYW52YXMoKTtcbiAgfVxuICAjZ2V0Qml0bWFwRG9uZSgpIHtcbiAgICB0aGlzLiNiaXRtYXBQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLl91aU1hbmFnZXIuZW5hYmxlV2FpdGluZyhmYWxzZSk7XG4gICAgaWYgKHRoaXMuI2NhbnZhcykge1xuICAgICAgdGhpcy5kaXYuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgI2dldEJpdG1hcCgpIHtcbiAgICBpZiAodGhpcy4jYml0bWFwSWQpIHtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5lbmFibGVXYWl0aW5nKHRydWUpO1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tSWQodGhpcy4jYml0bWFwSWQpLnRoZW4oZGF0YSA9PiB0aGlzLiNnZXRCaXRtYXBGZXRjaGVkKGRhdGEsIHRydWUpKS5maW5hbGx5KCgpID0+IHRoaXMuI2dldEJpdG1hcERvbmUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiNiaXRtYXBVcmwpIHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuI2JpdG1hcFVybDtcbiAgICAgIHRoaXMuI2JpdG1hcFVybCA9IG51bGw7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuZW5hYmxlV2FpdGluZyh0cnVlKTtcbiAgICAgIHRoaXMuI2JpdG1hcFByb21pc2UgPSB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmdldEZyb21VcmwodXJsKS50aGVuKGRhdGEgPT4gdGhpcy4jZ2V0Qml0bWFwRmV0Y2hlZChkYXRhKSkuZmluYWxseSgoKSA9PiB0aGlzLiNnZXRCaXRtYXBEb25lKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jYml0bWFwRmlsZSkge1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMuI2JpdG1hcEZpbGU7XG4gICAgICB0aGlzLiNiaXRtYXBGaWxlID0gbnVsbDtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5lbmFibGVXYWl0aW5nKHRydWUpO1xuICAgICAgdGhpcy4jYml0bWFwUHJvbWlzZSA9IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0RnJvbUZpbGUoZmlsZSkudGhlbihkYXRhID0+IHRoaXMuI2dldEJpdG1hcEZldGNoZWQoZGF0YSkpLmZpbmFsbHkoKCkgPT4gdGhpcy4jZ2V0Qml0bWFwRG9uZSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiZmlsZVwiO1xuICAgIGlucHV0LmFjY2VwdCA9IFN0YW1wRWRpdG9yLnN1cHBvcnRlZFR5cGVzU3RyO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIHRoaXMuI2JpdG1hcFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIWlucHV0LmZpbGVzIHx8IGlucHV0LmZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdWlNYW5hZ2VyLmVuYWJsZVdhaXRpbmcodHJ1ZSk7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0RnJvbUZpbGUoaW5wdXQuZmlsZXNbMF0pO1xuICAgICAgICAgIHRoaXMuI2dldEJpdG1hcEZldGNoZWQoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICB9KS5maW5hbGx5KCgpID0+IHRoaXMuI2dldEJpdG1hcERvbmUoKSk7XG4gICAgaW5wdXQuY2xpY2soKTtcbiAgfVxuICByZW1vdmUoKSB7XG4gICAgaWYgKHRoaXMuI2JpdG1hcElkKSB7XG4gICAgICB0aGlzLiNiaXRtYXAgPSBudWxsO1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5kZWxldGVJZCh0aGlzLiNiaXRtYXBJZCk7XG4gICAgICB0aGlzLiNjYW52YXM/LnJlbW92ZSgpO1xuICAgICAgdGhpcy4jY2FudmFzID0gbnVsbDtcbiAgICAgIHRoaXMuI29ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLiNvYnNlcnZlciA9IG51bGw7XG4gICAgICBpZiAodGhpcy4jcmVzaXplVGltZW91dElkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNyZXNpemVUaW1lb3V0SWQpO1xuICAgICAgICB0aGlzLiNyZXNpemVUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci5yZW1vdmUoKTtcbiAgfVxuICByZWJ1aWxkKCkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIGlmICh0aGlzLiNiaXRtYXBJZCkge1xuICAgICAgICB0aGlzLiNnZXRCaXRtYXAoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIucmVidWlsZCgpO1xuICAgIGlmICh0aGlzLmRpdiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jYml0bWFwSWQgJiYgdGhpcy4jY2FudmFzID09PSBudWxsKSB7XG4gICAgICB0aGlzLiNnZXRCaXRtYXAoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgdGhpcy5wYXJlbnQuYWRkKHRoaXMpO1xuICAgIH1cbiAgfVxuICBvbmNlQWRkZWQoKSB7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgIHRoaXMuZGl2LmZvY3VzKCk7XG4gIH1cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gISh0aGlzLiNiaXRtYXBQcm9taXNlIHx8IHRoaXMuI2JpdG1hcCB8fCB0aGlzLiNiaXRtYXBVcmwgfHwgdGhpcy4jYml0bWFwRmlsZSB8fCB0aGlzLiNiaXRtYXBJZCk7XG4gIH1cbiAgZ2V0IGlzUmVzaXphYmxlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5kaXYpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpdjtcbiAgICB9XG4gICAgbGV0IGJhc2VYLCBiYXNlWTtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgYmFzZVggPSB0aGlzLng7XG4gICAgICBiYXNlWSA9IHRoaXMueTtcbiAgICB9XG4gICAgc3VwZXIucmVuZGVyKCk7XG4gICAgdGhpcy5kaXYuaGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLmFkZEFsdFRleHRCdXR0b24oKTtcbiAgICBpZiAodGhpcy4jYml0bWFwKSB7XG4gICAgICB0aGlzLiNjcmVhdGVDYW52YXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZ2V0Qml0bWFwKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICB0aGlzLnNldEF0KGJhc2VYICogcGFyZW50V2lkdGgsIGJhc2VZICogcGFyZW50SGVpZ2h0LCB0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGl2O1xuICB9XG4gICNjcmVhdGVDYW52YXMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGl2XG4gICAgfSA9IHRoaXM7XG4gICAgbGV0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IHRoaXMuI2JpdG1hcDtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgY29uc3QgTUFYX1JBVElPID0gMC43NTtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgd2lkdGggPSB0aGlzLndpZHRoICogcGFnZVdpZHRoO1xuICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKiBwYWdlSGVpZ2h0O1xuICAgIH0gZWxzZSBpZiAod2lkdGggPiBNQVhfUkFUSU8gKiBwYWdlV2lkdGggfHwgaGVpZ2h0ID4gTUFYX1JBVElPICogcGFnZUhlaWdodCkge1xuICAgICAgY29uc3QgZmFjdG9yID0gTWF0aC5taW4oTUFYX1JBVElPICogcGFnZVdpZHRoIC8gd2lkdGgsIE1BWF9SQVRJTyAqIHBhZ2VIZWlnaHQgLyBoZWlnaHQpO1xuICAgICAgd2lkdGggKj0gZmFjdG9yO1xuICAgICAgaGVpZ2h0ICo9IGZhY3RvcjtcbiAgICB9XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIHRoaXMuc2V0RGltcyh3aWR0aCAqIHBhcmVudFdpZHRoIC8gcGFnZVdpZHRoLCBoZWlnaHQgKiBwYXJlbnRIZWlnaHQgLyBwYWdlSGVpZ2h0KTtcbiAgICB0aGlzLl91aU1hbmFnZXIuZW5hYmxlV2FpdGluZyhmYWxzZSk7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy4jY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBkaXYuYXBwZW5kKGNhbnZhcyk7XG4gICAgZGl2LmhpZGRlbiA9IGZhbHNlO1xuICAgIHRoaXMuI2RyYXdCaXRtYXAod2lkdGgsIGhlaWdodCk7XG4gICAgdGhpcy4jY3JlYXRlT2JzZXJ2ZXIoKTtcbiAgICBpZiAoIXRoaXMuI2hhc0JlZW5BZGRlZEluVW5kb1N0YWNrKSB7XG4gICAgICB0aGlzLnBhcmVudC5hZGRVbmRvYWJsZUVkaXRvcih0aGlzKTtcbiAgICAgIHRoaXMuI2hhc0JlZW5BZGRlZEluVW5kb1N0YWNrID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fcmVwb3J0VGVsZW1ldHJ5KHtcbiAgICAgIGFjdGlvbjogXCJpbnNlcnRlZF9pbWFnZVwiXG4gICAgfSk7XG4gICAgaWYgKHRoaXMuI2JpdG1hcEZpbGVOYW1lKSB7XG4gICAgICBjYW52YXMuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0aGlzLiNiaXRtYXBGaWxlTmFtZSk7XG4gICAgfVxuICB9XG4gICNzZXREaW1lbnNpb25zKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoIC8gcGFyZW50V2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgLyBwYXJlbnRIZWlnaHQ7XG4gICAgdGhpcy5zZXREaW1zKHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmICh0aGlzLl9pbml0aWFsT3B0aW9ucz8uaXNDZW50ZXJlZCkge1xuICAgICAgdGhpcy5jZW50ZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLl9pbml0aWFsT3B0aW9ucyA9IG51bGw7XG4gICAgaWYgKHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCk7XG4gICAgfVxuICAgIGNvbnN0IFRJTUVfVE9fV0FJVCA9IDIwMDtcbiAgICB0aGlzLiNyZXNpemVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCA9IG51bGw7XG4gICAgICB0aGlzLiNkcmF3Qml0bWFwKHdpZHRoLCBoZWlnaHQpO1xuICAgIH0sIFRJTUVfVE9fV0FJVCk7XG4gIH1cbiAgI3NjYWxlQml0bWFwKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aDogYml0bWFwV2lkdGgsXG4gICAgICBoZWlnaHQ6IGJpdG1hcEhlaWdodFxuICAgIH0gPSB0aGlzLiNiaXRtYXA7XG4gICAgbGV0IG5ld1dpZHRoID0gYml0bWFwV2lkdGg7XG4gICAgbGV0IG5ld0hlaWdodCA9IGJpdG1hcEhlaWdodDtcbiAgICBsZXQgYml0bWFwID0gdGhpcy4jYml0bWFwO1xuICAgIHdoaWxlIChuZXdXaWR0aCA+IDIgKiB3aWR0aCB8fCBuZXdIZWlnaHQgPiAyICogaGVpZ2h0KSB7XG4gICAgICBjb25zdCBwcmV2V2lkdGggPSBuZXdXaWR0aDtcbiAgICAgIGNvbnN0IHByZXZIZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICBpZiAobmV3V2lkdGggPiAyICogd2lkdGgpIHtcbiAgICAgICAgbmV3V2lkdGggPSBuZXdXaWR0aCA+PSAxNjM4NCA/IE1hdGguZmxvb3IobmV3V2lkdGggLyAyKSAtIDEgOiBNYXRoLmNlaWwobmV3V2lkdGggLyAyKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdIZWlnaHQgPiAyICogaGVpZ2h0KSB7XG4gICAgICAgIG5ld0hlaWdodCA9IG5ld0hlaWdodCA+PSAxNjM4NCA/IE1hdGguZmxvb3IobmV3SGVpZ2h0IC8gMikgLSAxIDogTWF0aC5jZWlsKG5ld0hlaWdodCAvIDIpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgIGNvbnN0IGN0eCA9IG9mZnNjcmVlbi5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCwgcHJldldpZHRoLCBwcmV2SGVpZ2h0LCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgIGJpdG1hcCA9IG9mZnNjcmVlbi50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIGJpdG1hcDtcbiAgfVxuICAjZHJhd0JpdG1hcCh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgd2lkdGggPSBNYXRoLmNlaWwod2lkdGgpO1xuICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuI2NhbnZhcztcbiAgICBpZiAoIWNhbnZhcyB8fCBjYW52YXMud2lkdGggPT09IHdpZHRoICYmIGNhbnZhcy5oZWlnaHQgPT09IGhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGNvbnN0IGJpdG1hcCA9IHRoaXMuI2lzU3ZnID8gdGhpcy4jYml0bWFwIDogdGhpcy4jc2NhbGVCaXRtYXAod2lkdGgsIGhlaWdodCk7XG4gICAgaWYgKHRoaXMuX3VpTWFuYWdlci5oYXNNTE1hbmFnZXIgJiYgIXRoaXMuaGFzQWx0VGV4dCgpKSB7XG4gICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3QgY3R4ID0gb2Zmc2NyZWVuLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwLCBiaXRtYXAud2lkdGgsIGJpdG1hcC5oZWlnaHQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLm1sR3Vlc3Moe1xuICAgICAgICBzZXJ2aWNlOiBcImltYWdlLXRvLXRleHRcIixcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIGRhdGE6IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCkuZGF0YSxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgY2hhbm5lbHM6IDRcbiAgICAgICAgfVxuICAgICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIGNvbnN0IGFsdFRleHQgPSByZXNwb25zZT8ub3V0cHV0IHx8IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCAmJiBhbHRUZXh0ICYmICF0aGlzLmhhc0FsdFRleHQoKSkge1xuICAgICAgICAgIHRoaXMuYWx0VGV4dERhdGEgPSB7XG4gICAgICAgICAgICBhbHRUZXh0LFxuICAgICAgICAgICAgZGVjb3JhdGl2ZTogZmFsc2VcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBjdHguZmlsdGVyID0gdGhpcy5fdWlNYW5hZ2VyLmhjbUZpbHRlcjtcbiAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCwgYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgfVxuICBnZXRJbWFnZUZvckFsdFRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhbnZhcztcbiAgfVxuICAjc2VyaWFsaXplQml0bWFwKHRvVXJsKSB7XG4gICAgaWYgKHRvVXJsKSB7XG4gICAgICBpZiAodGhpcy4jaXNTdmcpIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRTdmdVcmwodGhpcy4jYml0bWFwSWQpO1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICh7XG4gICAgICAgIHdpZHRoOiBjYW52YXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogY2FudmFzLmhlaWdodFxuICAgICAgfSA9IHRoaXMuI2JpdG1hcCk7XG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY3R4LmRyYXdJbWFnZSh0aGlzLiNiaXRtYXAsIDAsIDApO1xuICAgICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2lzU3ZnKSB7XG4gICAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGgucm91bmQodGhpcy53aWR0aCAqIHBhZ2VXaWR0aCAqIFBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyk7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodCAqIFBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyk7XG4gICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3QgY3R4ID0gb2Zmc2NyZWVuLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGN0eC5kcmF3SW1hZ2UodGhpcy4jYml0bWFwLCAwLCAwLCB0aGlzLiNiaXRtYXAud2lkdGgsIHRoaXMuI2JpdG1hcC5oZWlnaHQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgcmV0dXJuIG9mZnNjcmVlbi50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZSh0aGlzLiNiaXRtYXApO1xuICB9XG4gICNjcmVhdGVPYnNlcnZlcigpIHtcbiAgICBpZiAoIXRoaXMuX3VpTWFuYWdlci5fc2lnbmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI29ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgY29uc3QgcmVjdCA9IGVudHJpZXNbMF0uY29udGVudFJlY3Q7XG4gICAgICBpZiAocmVjdC53aWR0aCAmJiByZWN0LmhlaWdodCkge1xuICAgICAgICB0aGlzLiNzZXREaW1lbnNpb25zKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLiNvYnNlcnZlci5vYnNlcnZlKHRoaXMuZGl2KTtcbiAgICB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4ge1xuICAgICAgdGhpcy4jb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuI29ic2VydmVyID0gbnVsbDtcbiAgICB9LCB7XG4gICAgICBvbmNlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgc3RhdGljIGRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKSB7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBTdGFtcEFubm90YXRpb25FbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZWRpdG9yID0gc3VwZXIuZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlY3QsXG4gICAgICBiaXRtYXBVcmwsXG4gICAgICBiaXRtYXBJZCxcbiAgICAgIGlzU3ZnLFxuICAgICAgYWNjZXNzaWJpbGl0eURhdGFcbiAgICB9ID0gZGF0YTtcbiAgICBpZiAoYml0bWFwSWQgJiYgdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5pc1ZhbGlkSWQoYml0bWFwSWQpKSB7XG4gICAgICBlZGl0b3IuI2JpdG1hcElkID0gYml0bWFwSWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVkaXRvci4jYml0bWFwVXJsID0gYml0bWFwVXJsO1xuICAgIH1cbiAgICBlZGl0b3IuI2lzU3ZnID0gaXNTdmc7XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gZWRpdG9yLnBhZ2VEaW1lbnNpb25zO1xuICAgIGVkaXRvci53aWR0aCA9IChyZWN0WzJdIC0gcmVjdFswXSkgLyBwYXJlbnRXaWR0aDtcbiAgICBlZGl0b3IuaGVpZ2h0ID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIHBhcmVudEhlaWdodDtcbiAgICBpZiAoYWNjZXNzaWJpbGl0eURhdGEpIHtcbiAgICAgIGVkaXRvci5hbHRUZXh0RGF0YSA9IGFjY2Vzc2liaWxpdHlEYXRhO1xuICAgIH1cbiAgICByZXR1cm4gZWRpdG9yO1xuICB9XG4gIHNlcmlhbGl6ZShpc0ZvckNvcHlpbmcgPSBmYWxzZSwgY29udGV4dCA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkID0ge1xuICAgICAgYW5ub3RhdGlvblR5cGU6IEFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QLFxuICAgICAgYml0bWFwSWQ6IHRoaXMuI2JpdG1hcElkLFxuICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgIHJlY3Q6IHRoaXMuZ2V0UmVjdCgwLCAwKSxcbiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuICAgICAgaXNTdmc6IHRoaXMuI2lzU3ZnLFxuICAgICAgc3RydWN0VHJlZVBhcmVudElkOiB0aGlzLl9zdHJ1Y3RUcmVlUGFyZW50SWRcbiAgICB9O1xuICAgIGlmIChpc0ZvckNvcHlpbmcpIHtcbiAgICAgIHNlcmlhbGl6ZWQuYml0bWFwVXJsID0gdGhpcy4jc2VyaWFsaXplQml0bWFwKHRydWUpO1xuICAgICAgc2VyaWFsaXplZC5hY2Nlc3NpYmlsaXR5RGF0YSA9IHRoaXMuYWx0VGV4dERhdGE7XG4gICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgZGVjb3JhdGl2ZSxcbiAgICAgIGFsdFRleHRcbiAgICB9ID0gdGhpcy5hbHRUZXh0RGF0YTtcbiAgICBpZiAoIWRlY29yYXRpdmUgJiYgYWx0VGV4dCkge1xuICAgICAgc2VyaWFsaXplZC5hY2Nlc3NpYmlsaXR5RGF0YSA9IHtcbiAgICAgICAgdHlwZTogXCJGaWd1cmVcIixcbiAgICAgICAgYWx0OiBhbHRUZXh0XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoY29udGV4dCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxuICAgIGNvbnRleHQuc3RhbXBzIHx8PSBuZXcgTWFwKCk7XG4gICAgY29uc3QgYXJlYSA9IHRoaXMuI2lzU3ZnID8gKHNlcmlhbGl6ZWQucmVjdFsyXSAtIHNlcmlhbGl6ZWQucmVjdFswXSkgKiAoc2VyaWFsaXplZC5yZWN0WzNdIC0gc2VyaWFsaXplZC5yZWN0WzFdKSA6IG51bGw7XG4gICAgaWYgKCFjb250ZXh0LnN0YW1wcy5oYXModGhpcy4jYml0bWFwSWQpKSB7XG4gICAgICBjb250ZXh0LnN0YW1wcy5zZXQodGhpcy4jYml0bWFwSWQsIHtcbiAgICAgICAgYXJlYSxcbiAgICAgICAgc2VyaWFsaXplZFxuICAgICAgfSk7XG4gICAgICBzZXJpYWxpemVkLmJpdG1hcCA9IHRoaXMuI3NlcmlhbGl6ZUJpdG1hcChmYWxzZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNpc1N2Zykge1xuICAgICAgY29uc3QgcHJldkRhdGEgPSBjb250ZXh0LnN0YW1wcy5nZXQodGhpcy4jYml0bWFwSWQpO1xuICAgICAgaWYgKGFyZWEgPiBwcmV2RGF0YS5hcmVhKSB7XG4gICAgICAgIHByZXZEYXRhLmFyZWEgPSBhcmVhO1xuICAgICAgICBwcmV2RGF0YS5zZXJpYWxpemVkLmJpdG1hcC5jbG9zZSgpO1xuICAgICAgICBwcmV2RGF0YS5zZXJpYWxpemVkLmJpdG1hcCA9IHRoaXMuI3NlcmlhbGl6ZUJpdG1hcChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZXJpYWxpemVkO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9hbm5vdGF0aW9uX2VkaXRvcl9sYXllci5qc1xuXG5cblxuXG5cblxuXG5jbGFzcyBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIge1xuICAjYWNjZXNzaWJpbGl0eU1hbmFnZXI7XG4gICNhbGxvd0NsaWNrID0gZmFsc2U7XG4gICNhbm5vdGF0aW9uTGF5ZXIgPSBudWxsO1xuICAjYm91bmRQb2ludGVydXAgPSBudWxsO1xuICAjYm91bmRQb2ludGVyZG93biA9IG51bGw7XG4gICNib3VuZFRleHRMYXllclBvaW50ZXJEb3duID0gbnVsbDtcbiAgI2VkaXRvckZvY3VzVGltZW91dElkID0gbnVsbDtcbiAgI2VkaXRvcnMgPSBuZXcgTWFwKCk7XG4gICNoYWRQb2ludGVyRG93biA9IGZhbHNlO1xuICAjaXNDbGVhbmluZ1VwID0gZmFsc2U7XG4gICNpc0Rpc2FibGluZyA9IGZhbHNlO1xuICAjdGV4dExheWVyID0gbnVsbDtcbiAgI3VpTWFuYWdlcjtcbiAgc3RhdGljIF9pbml0aWFsaXplZCA9IGZhbHNlO1xuICBzdGF0aWMgI2VkaXRvclR5cGVzID0gbmV3IE1hcChbRnJlZVRleHRFZGl0b3IsIElua0VkaXRvciwgU3RhbXBFZGl0b3IsIEhpZ2hsaWdodEVkaXRvcl0ubWFwKHR5cGUgPT4gW3R5cGUuX2VkaXRvclR5cGUsIHR5cGVdKSk7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICB1aU1hbmFnZXIsXG4gICAgcGFnZUluZGV4LFxuICAgIGRpdixcbiAgICBhY2Nlc3NpYmlsaXR5TWFuYWdlcixcbiAgICBhbm5vdGF0aW9uTGF5ZXIsXG4gICAgZHJhd0xheWVyLFxuICAgIHRleHRMYXllcixcbiAgICB2aWV3cG9ydCxcbiAgICBsMTBuXG4gIH0pIHtcbiAgICBjb25zdCBlZGl0b3JUeXBlcyA9IFsuLi5Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIuI2VkaXRvclR5cGVzLnZhbHVlcygpXTtcbiAgICBpZiAoIUFubm90YXRpb25FZGl0b3JMYXllci5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIEFubm90YXRpb25FZGl0b3JMYXllci5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIGVkaXRvclR5cGVzKSB7XG4gICAgICAgIGVkaXRvclR5cGUuaW5pdGlhbGl6ZShsMTBuLCB1aU1hbmFnZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICB1aU1hbmFnZXIucmVnaXN0ZXJFZGl0b3JUeXBlcyhlZGl0b3JUeXBlcyk7XG4gICAgdGhpcy4jdWlNYW5hZ2VyID0gdWlNYW5hZ2VyO1xuICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgIHRoaXMuZGl2ID0gZGl2O1xuICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlNYW5hZ2VyID0gYWNjZXNzaWJpbGl0eU1hbmFnZXI7XG4gICAgdGhpcy4jYW5ub3RhdGlvbkxheWVyID0gYW5ub3RhdGlvbkxheWVyO1xuICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICB0aGlzLiN0ZXh0TGF5ZXIgPSB0ZXh0TGF5ZXI7XG4gICAgdGhpcy5kcmF3TGF5ZXIgPSBkcmF3TGF5ZXI7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLmFkZExheWVyKHRoaXMpO1xuICB9XG4gIGdldCBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLiNlZGl0b3JzLnNpemUgPT09IDA7XG4gIH1cbiAgZ2V0IGlzSW52aXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLmlzRW1wdHkgJiYgdGhpcy4jdWlNYW5hZ2VyLmdldE1vZGUoKSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORTtcbiAgfVxuICB1cGRhdGVUb29sYmFyKG1vZGUpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIudXBkYXRlVG9vbGJhcihtb2RlKTtcbiAgfVxuICB1cGRhdGVNb2RlKG1vZGUgPSB0aGlzLiN1aU1hbmFnZXIuZ2V0TW9kZSgpKSB7XG4gICAgdGhpcy4jY2xlYW51cCgpO1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FOlxuICAgICAgICB0aGlzLmRpc2FibGVUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlUG9pbnRlckV2ZW50cyhmYWxzZSk7XG4gICAgICAgIHRoaXMudG9nZ2xlQW5ub3RhdGlvbkxheWVyUG9pbnRlckV2ZW50cyh0cnVlKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlQ2xpY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks6XG4gICAgICAgIHRoaXMuYWRkSW5rRWRpdG9ySWZOZWVkZWQoZmFsc2UpO1xuICAgICAgICB0aGlzLmRpc2FibGVUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlUG9pbnRlckV2ZW50cyh0cnVlKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlQ2xpY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVDpcbiAgICAgICAgdGhpcy5lbmFibGVUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlUG9pbnRlckV2ZW50cyhmYWxzZSk7XG4gICAgICAgIHRoaXMuZGlzYWJsZUNsaWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5kaXNhYmxlVGV4dFNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLnRvZ2dsZVBvaW50ZXJFdmVudHModHJ1ZSk7XG4gICAgICAgIHRoaXMuZW5hYmxlQ2xpY2soKTtcbiAgICB9XG4gICAgdGhpcy50b2dnbGVBbm5vdGF0aW9uTGF5ZXJQb2ludGVyRXZlbnRzKGZhbHNlKTtcbiAgICBjb25zdCB7XG4gICAgICBjbGFzc0xpc3RcbiAgICB9ID0gdGhpcy5kaXY7XG4gICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIEFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMudmFsdWVzKCkpIHtcbiAgICAgIGNsYXNzTGlzdC50b2dnbGUoYCR7ZWRpdG9yVHlwZS5fdHlwZX1FZGl0aW5nYCwgbW9kZSA9PT0gZWRpdG9yVHlwZS5fZWRpdG9yVHlwZSk7XG4gICAgfVxuICAgIHRoaXMuZGl2LmhpZGRlbiA9IGZhbHNlO1xuICB9XG4gIGhhc1RleHRMYXllcih0ZXh0TGF5ZXIpIHtcbiAgICByZXR1cm4gdGV4dExheWVyID09PSB0aGlzLiN0ZXh0TGF5ZXI/LmRpdjtcbiAgfVxuICBhZGRJbmtFZGl0b3JJZk5lZWRlZChpc0NvbW1pdHRpbmcpIHtcbiAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmdldE1vZGUoKSAhPT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNDb21taXR0aW5nKSB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICAgIGlmIChlZGl0b3IuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgZWRpdG9yLnNldEluQmFja2dyb3VuZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmNyZWF0ZUFuZEFkZE5ld0VkaXRvcih7XG4gICAgICBvZmZzZXRYOiAwLFxuICAgICAgb2Zmc2V0WTogMFxuICAgIH0sIGZhbHNlKTtcbiAgICBlZGl0b3Iuc2V0SW5CYWNrZ3JvdW5kKCk7XG4gIH1cbiAgc2V0RWRpdGluZ1N0YXRlKGlzRWRpdGluZykge1xuICAgIHRoaXMuI3VpTWFuYWdlci5zZXRFZGl0aW5nU3RhdGUoaXNFZGl0aW5nKTtcbiAgfVxuICBhZGRDb21tYW5kcyhwYXJhbXMpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIuYWRkQ29tbWFuZHMocGFyYW1zKTtcbiAgfVxuICB0b2dnbGVQb2ludGVyRXZlbnRzKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJkaXNhYmxlZFwiLCAhZW5hYmxlZCk7XG4gIH1cbiAgdG9nZ2xlQW5ub3RhdGlvbkxheWVyUG9pbnRlckV2ZW50cyhlbmFibGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLiNhbm5vdGF0aW9uTGF5ZXI/LmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiZGlzYWJsZWRcIiwgIWVuYWJsZWQpO1xuICB9XG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLmRpdi50YWJJbmRleCA9IDA7XG4gICAgdGhpcy50b2dnbGVQb2ludGVyRXZlbnRzKHRydWUpO1xuICAgIGNvbnN0IGFubm90YXRpb25FbGVtZW50SWRzID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgIGVkaXRvci5lbmFibGVFZGl0aW5nKCk7XG4gICAgICBlZGl0b3Iuc2hvdyh0cnVlKTtcbiAgICAgIGlmIChlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgICAgICB0aGlzLiN1aU1hbmFnZXIucmVtb3ZlQ2hhbmdlZEV4aXN0aW5nQW5ub3RhdGlvbihlZGl0b3IpO1xuICAgICAgICBhbm5vdGF0aW9uRWxlbWVudElkcy5hZGQoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuI2Fubm90YXRpb25MYXllcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlZGl0YWJsZXMgPSB0aGlzLiNhbm5vdGF0aW9uTGF5ZXIuZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpO1xuICAgIGZvciAoY29uc3QgZWRpdGFibGUgb2YgZWRpdGFibGVzKSB7XG4gICAgICBlZGl0YWJsZS5oaWRlKCk7XG4gICAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRhYmxlLmRhdGEuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFubm90YXRpb25FbGVtZW50SWRzLmhhcyhlZGl0YWJsZS5kYXRhLmlkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZGVzZXJpYWxpemUoZWRpdGFibGUpO1xuICAgICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZE9yUmVidWlsZChlZGl0b3IpO1xuICAgICAgZWRpdG9yLmVuYWJsZUVkaXRpbmcoKTtcbiAgICB9XG4gIH1cbiAgZGlzYWJsZSgpIHtcbiAgICB0aGlzLiNpc0Rpc2FibGluZyA9IHRydWU7XG4gICAgdGhpcy5kaXYudGFiSW5kZXggPSAtMTtcbiAgICB0aGlzLnRvZ2dsZVBvaW50ZXJFdmVudHMoZmFsc2UpO1xuICAgIGNvbnN0IGNoYW5nZWRBbm5vdGF0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCByZXNldEFubm90YXRpb25zID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgIGVkaXRvci5kaXNhYmxlRWRpdGluZygpO1xuICAgICAgaWYgKCFlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlZGl0b3Iuc2VyaWFsaXplKCkgIT09IG51bGwpIHtcbiAgICAgICAgY2hhbmdlZEFubm90YXRpb25zLnNldChlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCwgZWRpdG9yKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldEFubm90YXRpb25zLnNldChlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCwgZWRpdG9yKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0RWRpdGFibGVBbm5vdGF0aW9uKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKT8uc2hvdygpO1xuICAgICAgZWRpdG9yLnJlbW92ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jYW5ub3RhdGlvbkxheWVyKSB7XG4gICAgICBjb25zdCBlZGl0YWJsZXMgPSB0aGlzLiNhbm5vdGF0aW9uTGF5ZXIuZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpO1xuICAgICAgZm9yIChjb25zdCBlZGl0YWJsZSBvZiBlZGl0YWJsZXMpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGlkXG4gICAgICAgIH0gPSBlZGl0YWJsZS5kYXRhO1xuICAgICAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGlkKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlZGl0b3IgPSByZXNldEFubm90YXRpb25zLmdldChpZCk7XG4gICAgICAgIGlmIChlZGl0b3IpIHtcbiAgICAgICAgICBlZGl0b3IucmVzZXRBbm5vdGF0aW9uRWxlbWVudChlZGl0YWJsZSk7XG4gICAgICAgICAgZWRpdG9yLnNob3coZmFsc2UpO1xuICAgICAgICAgIGVkaXRhYmxlLnNob3coKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlZGl0b3IgPSBjaGFuZ2VkQW5ub3RhdGlvbnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGVkaXRvcikge1xuICAgICAgICAgIHRoaXMuI3VpTWFuYWdlci5hZGRDaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9uKGVkaXRvcik7XG4gICAgICAgICAgZWRpdG9yLnJlbmRlckFubm90YXRpb25FbGVtZW50KGVkaXRhYmxlKTtcbiAgICAgICAgICBlZGl0b3Iuc2hvdyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWRpdGFibGUuc2hvdygpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNjbGVhbnVwKCk7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSkge1xuICAgICAgdGhpcy5kaXYuaGlkZGVuID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgY2xhc3NMaXN0XG4gICAgfSA9IHRoaXMuZGl2O1xuICAgIGZvciAoY29uc3QgZWRpdG9yVHlwZSBvZiBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuI2VkaXRvclR5cGVzLnZhbHVlcygpKSB7XG4gICAgICBjbGFzc0xpc3QucmVtb3ZlKGAke2VkaXRvclR5cGUuX3R5cGV9RWRpdGluZ2ApO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVUZXh0U2VsZWN0aW9uKCk7XG4gICAgdGhpcy50b2dnbGVBbm5vdGF0aW9uTGF5ZXJQb2ludGVyRXZlbnRzKHRydWUpO1xuICAgIHRoaXMuI2lzRGlzYWJsaW5nID0gZmFsc2U7XG4gIH1cbiAgZ2V0RWRpdGFibGVBbm5vdGF0aW9uKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Fubm90YXRpb25MYXllcj8uZ2V0RWRpdGFibGVBbm5vdGF0aW9uKGlkKSB8fCBudWxsO1xuICB9XG4gIHNldEFjdGl2ZUVkaXRvcihlZGl0b3IpIHtcbiAgICBjb25zdCBjdXJyZW50QWN0aXZlID0gdGhpcy4jdWlNYW5hZ2VyLmdldEFjdGl2ZSgpO1xuICAgIGlmIChjdXJyZW50QWN0aXZlID09PSBlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnNldEFjdGl2ZUVkaXRvcihlZGl0b3IpO1xuICB9XG4gIGVuYWJsZVRleHRTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5kaXYudGFiSW5kZXggPSAtMTtcbiAgICBpZiAodGhpcy4jdGV4dExheWVyPy5kaXYgJiYgIXRoaXMuI2JvdW5kVGV4dExheWVyUG9pbnRlckRvd24pIHtcbiAgICAgIHRoaXMuI2JvdW5kVGV4dExheWVyUG9pbnRlckRvd24gPSB0aGlzLiN0ZXh0TGF5ZXJQb2ludGVyRG93bi5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy4jdGV4dExheWVyLmRpdi5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRUZXh0TGF5ZXJQb2ludGVyRG93biwge1xuICAgICAgICBzaWduYWw6IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuI3RleHRMYXllci5kaXYuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodGluZ1wiKTtcbiAgICB9XG4gIH1cbiAgZGlzYWJsZVRleHRTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5kaXYudGFiSW5kZXggPSAwO1xuICAgIGlmICh0aGlzLiN0ZXh0TGF5ZXI/LmRpdiAmJiB0aGlzLiNib3VuZFRleHRMYXllclBvaW50ZXJEb3duKSB7XG4gICAgICB0aGlzLiN0ZXh0TGF5ZXIuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZFRleHRMYXllclBvaW50ZXJEb3duKTtcbiAgICAgIHRoaXMuI2JvdW5kVGV4dExheWVyUG9pbnRlckRvd24gPSBudWxsO1xuICAgICAgdGhpcy4jdGV4dExheWVyLmRpdi5jbGFzc0xpc3QucmVtb3ZlKFwiaGlnaGxpZ2h0aW5nXCIpO1xuICAgIH1cbiAgfVxuICAjdGV4dExheWVyUG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIudW5zZWxlY3RBbGwoKTtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLiN0ZXh0TGF5ZXIuZGl2KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGlzTWFjXG4gICAgICB9ID0gdXRpbF9GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgZXZlbnQuY3RybEtleSAmJiBpc01hYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLiN1aU1hbmFnZXIuc2hvd0FsbEVkaXRvcnMoXCJoaWdobGlnaHRcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICB0aGlzLiN0ZXh0TGF5ZXIuZGl2LmNsYXNzTGlzdC5hZGQoXCJmcmVlXCIpO1xuICAgICAgSGlnaGxpZ2h0RWRpdG9yLnN0YXJ0SGlnaGxpZ2h0aW5nKHRoaXMsIHRoaXMuI3VpTWFuYWdlci5kaXJlY3Rpb24gPT09IFwibHRyXCIsIGV2ZW50KTtcbiAgICAgIHRoaXMuI3RleHRMYXllci5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuI3RleHRMYXllci5kaXYuY2xhc3NMaXN0LnJlbW92ZShcImZyZWVcIik7XG4gICAgICB9LCB7XG4gICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgIHNpZ25hbDogdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWxcbiAgICAgIH0pO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbiAgZW5hYmxlQ2xpY2soKSB7XG4gICAgaWYgKHRoaXMuI2JvdW5kUG9pbnRlcmRvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgdGhpcy4jYm91bmRQb2ludGVyZG93biA9IHRoaXMucG9pbnRlcmRvd24uYmluZCh0aGlzKTtcbiAgICB0aGlzLiNib3VuZFBvaW50ZXJ1cCA9IHRoaXMucG9pbnRlcnVwLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kUG9pbnRlcmRvd24sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy4jYm91bmRQb2ludGVydXAsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gIGRpc2FibGVDbGljaygpIHtcbiAgICBpZiAoIXRoaXMuI2JvdW5kUG9pbnRlcmRvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kUG9pbnRlcmRvd24pO1xuICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy4jYm91bmRQb2ludGVydXApO1xuICAgIHRoaXMuI2JvdW5kUG9pbnRlcmRvd24gPSBudWxsO1xuICAgIHRoaXMuI2JvdW5kUG9pbnRlcnVwID0gbnVsbDtcbiAgfVxuICBhdHRhY2goZWRpdG9yKSB7XG4gICAgdGhpcy4jZWRpdG9ycy5zZXQoZWRpdG9yLmlkLCBlZGl0b3IpO1xuICAgIGNvbnN0IHtcbiAgICAgIGFubm90YXRpb25FbGVtZW50SWRcbiAgICB9ID0gZWRpdG9yO1xuICAgIGlmIChhbm5vdGF0aW9uRWxlbWVudElkICYmIHRoaXMuI3VpTWFuYWdlci5pc0RlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uRWxlbWVudElkKSkge1xuICAgICAgdGhpcy4jdWlNYW5hZ2VyLnJlbW92ZURlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IpO1xuICAgIH1cbiAgfVxuICBkZXRhY2goZWRpdG9yKSB7XG4gICAgdGhpcy4jZWRpdG9ycy5kZWxldGUoZWRpdG9yLmlkKTtcbiAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlcj8ucmVtb3ZlUG9pbnRlckluVGV4dExheWVyKGVkaXRvci5jb250ZW50RGl2KTtcbiAgICBpZiAoIXRoaXMuI2lzRGlzYWJsaW5nICYmIGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgICB0aGlzLiN1aU1hbmFnZXIuYWRkRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRvcik7XG4gICAgfVxuICB9XG4gIHJlbW92ZShlZGl0b3IpIHtcbiAgICB0aGlzLmRldGFjaChlZGl0b3IpO1xuICAgIHRoaXMuI3VpTWFuYWdlci5yZW1vdmVFZGl0b3IoZWRpdG9yKTtcbiAgICBlZGl0b3IuZGl2LnJlbW92ZSgpO1xuICAgIGVkaXRvci5pc0F0dGFjaGVkVG9ET00gPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuI2lzQ2xlYW5pbmdVcCkge1xuICAgICAgdGhpcy5hZGRJbmtFZGl0b3JJZk5lZWRlZChmYWxzZSk7XG4gICAgfVxuICB9XG4gIGNoYW5nZVBhcmVudChlZGl0b3IpIHtcbiAgICBpZiAoZWRpdG9yLnBhcmVudCA9PT0gdGhpcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZWRpdG9yLnBhcmVudCAmJiBlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgICAgdGhpcy4jdWlNYW5hZ2VyLmFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCk7XG4gICAgICBBbm5vdGF0aW9uRWRpdG9yLmRlbGV0ZUFubm90YXRpb25FbGVtZW50KGVkaXRvcik7XG4gICAgICBlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuYXR0YWNoKGVkaXRvcik7XG4gICAgZWRpdG9yLnBhcmVudD8uZGV0YWNoKGVkaXRvcik7XG4gICAgZWRpdG9yLnNldFBhcmVudCh0aGlzKTtcbiAgICBpZiAoZWRpdG9yLmRpdiAmJiBlZGl0b3IuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICBlZGl0b3IuZGl2LnJlbW92ZSgpO1xuICAgICAgdGhpcy5kaXYuYXBwZW5kKGVkaXRvci5kaXYpO1xuICAgIH1cbiAgfVxuICBhZGQoZWRpdG9yKSB7XG4gICAgaWYgKGVkaXRvci5wYXJlbnQgPT09IHRoaXMgJiYgZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZVBhcmVudChlZGl0b3IpO1xuICAgIHRoaXMuI3VpTWFuYWdlci5hZGRFZGl0b3IoZWRpdG9yKTtcbiAgICB0aGlzLmF0dGFjaChlZGl0b3IpO1xuICAgIGlmICghZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgY29uc3QgZGl2ID0gZWRpdG9yLnJlbmRlcigpO1xuICAgICAgdGhpcy5kaXYuYXBwZW5kKGRpdik7XG4gICAgICBlZGl0b3IuaXNBdHRhY2hlZFRvRE9NID0gdHJ1ZTtcbiAgICB9XG4gICAgZWRpdG9yLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgZWRpdG9yLm9uY2VBZGRlZCgpO1xuICAgIHRoaXMuI3VpTWFuYWdlci5hZGRUb0Fubm90YXRpb25TdG9yYWdlKGVkaXRvcik7XG4gICAgZWRpdG9yLl9yZXBvcnRUZWxlbWV0cnkoZWRpdG9yLnRlbGVtZXRyeUluaXRpYWxEYXRhKTtcbiAgfVxuICBtb3ZlRWRpdG9ySW5ET00oZWRpdG9yKSB7XG4gICAgaWYgKCFlZGl0b3IuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFjdGl2ZUVsZW1lbnRcbiAgICB9ID0gZG9jdW1lbnQ7XG4gICAgaWYgKGVkaXRvci5kaXYuY29udGFpbnMoYWN0aXZlRWxlbWVudCkgJiYgIXRoaXMuI2VkaXRvckZvY3VzVGltZW91dElkKSB7XG4gICAgICBlZGl0b3IuX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgdGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgICBpZiAoIWVkaXRvci5kaXYuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICBlZGl0b3IuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsICgpID0+IHtcbiAgICAgICAgICAgIGVkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICAgICAgc2lnbmFsOiB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGl0b3IuX2ZvY3VzRXZlbnRzQWxsb3dlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgICBlZGl0b3IuX3N0cnVjdFRyZWVQYXJlbnRJZCA9IHRoaXMuI2FjY2Vzc2liaWxpdHlNYW5hZ2VyPy5tb3ZlRWxlbWVudEluRE9NKHRoaXMuZGl2LCBlZGl0b3IuZGl2LCBlZGl0b3IuY29udGVudERpdiwgdHJ1ZSk7XG4gIH1cbiAgYWRkT3JSZWJ1aWxkKGVkaXRvcikge1xuICAgIGlmIChlZGl0b3IubmVlZHNUb0JlUmVidWlsdCgpKSB7XG4gICAgICBlZGl0b3IucGFyZW50IHx8PSB0aGlzO1xuICAgICAgZWRpdG9yLnJlYnVpbGQoKTtcbiAgICAgIGVkaXRvci5zaG93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkKGVkaXRvcik7XG4gICAgfVxuICB9XG4gIGFkZFVuZG9hYmxlRWRpdG9yKGVkaXRvcikge1xuICAgIGNvbnN0IGNtZCA9ICgpID0+IGVkaXRvci5fdWlNYW5hZ2VyLnJlYnVpbGQoZWRpdG9yKTtcbiAgICBjb25zdCB1bmRvID0gKCkgPT4ge1xuICAgICAgZWRpdG9yLnJlbW92ZSgpO1xuICAgIH07XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQsXG4gICAgICB1bmRvLFxuICAgICAgbXVzdEV4ZWM6IGZhbHNlXG4gICAgfSk7XG4gIH1cbiAgZ2V0TmV4dElkKCkge1xuICAgIHJldHVybiB0aGlzLiN1aU1hbmFnZXIuZ2V0SWQoKTtcbiAgfVxuICBnZXQgI2N1cnJlbnRFZGl0b3JUeXBlKCkge1xuICAgIHJldHVybiBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuI2VkaXRvclR5cGVzLmdldCh0aGlzLiN1aU1hbmFnZXIuZ2V0TW9kZSgpKTtcbiAgfVxuICBnZXQgX3NpZ25hbCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWw7XG4gIH1cbiAgI2NyZWF0ZU5ld0VkaXRvcihwYXJhbXMpIHtcbiAgICBjb25zdCBlZGl0b3JUeXBlID0gdGhpcy4jY3VycmVudEVkaXRvclR5cGU7XG4gICAgcmV0dXJuIGVkaXRvclR5cGUgPyBuZXcgZWRpdG9yVHlwZS5wcm90b3R5cGUuY29uc3RydWN0b3IocGFyYW1zKSA6IG51bGw7XG4gIH1cbiAgY2FuQ3JlYXRlTmV3RW1wdHlFZGl0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRFZGl0b3JUeXBlPy5jYW5DcmVhdGVOZXdFbXB0eUVkaXRvcigpO1xuICB9XG4gIHBhc3RlRWRpdG9yKG1vZGUsIHBhcmFtcykge1xuICAgIHRoaXMuI3VpTWFuYWdlci51cGRhdGVUb29sYmFyKG1vZGUpO1xuICAgIHRoaXMuI3VpTWFuYWdlci51cGRhdGVNb2RlKG1vZGUpO1xuICAgIGNvbnN0IHtcbiAgICAgIG9mZnNldFgsXG4gICAgICBvZmZzZXRZXG4gICAgfSA9IHRoaXMuI2dldENlbnRlclBvaW50KCk7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldE5leHRJZCgpO1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuI2NyZWF0ZU5ld0VkaXRvcih7XG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICBpZCxcbiAgICAgIHg6IG9mZnNldFgsXG4gICAgICB5OiBvZmZzZXRZLFxuICAgICAgdWlNYW5hZ2VyOiB0aGlzLiN1aU1hbmFnZXIsXG4gICAgICBpc0NlbnRlcmVkOiB0cnVlLFxuICAgICAgLi4ucGFyYW1zXG4gICAgfSk7XG4gICAgaWYgKGVkaXRvcikge1xuICAgICAgdGhpcy5hZGQoZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgZGVzZXJpYWxpemUoZGF0YSkge1xuICAgIHJldHVybiBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuI2VkaXRvclR5cGVzLmdldChkYXRhLmFubm90YXRpb25UeXBlID8/IGRhdGEuYW5ub3RhdGlvbkVkaXRvclR5cGUpPy5kZXNlcmlhbGl6ZShkYXRhLCB0aGlzLCB0aGlzLiN1aU1hbmFnZXIpIHx8IG51bGw7XG4gIH1cbiAgY3JlYXRlQW5kQWRkTmV3RWRpdG9yKGV2ZW50LCBpc0NlbnRlcmVkLCBkYXRhID0ge30pIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0TmV4dElkKCk7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy4jY3JlYXRlTmV3RWRpdG9yKHtcbiAgICAgIHBhcmVudDogdGhpcyxcbiAgICAgIGlkLFxuICAgICAgeDogZXZlbnQub2Zmc2V0WCxcbiAgICAgIHk6IGV2ZW50Lm9mZnNldFksXG4gICAgICB1aU1hbmFnZXI6IHRoaXMuI3VpTWFuYWdlcixcbiAgICAgIGlzQ2VudGVyZWQsXG4gICAgICAuLi5kYXRhXG4gICAgfSk7XG4gICAgaWYgKGVkaXRvcikge1xuICAgICAgdGhpcy5hZGQoZWRpdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICAjZ2V0Q2VudGVyUG9pbnQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSB0aGlzLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0bFggPSBNYXRoLm1heCgwLCB4KTtcbiAgICBjb25zdCB0bFkgPSBNYXRoLm1heCgwLCB5KTtcbiAgICBjb25zdCBiclggPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCwgeCArIHdpZHRoKTtcbiAgICBjb25zdCBiclkgPSBNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQsIHkgKyBoZWlnaHQpO1xuICAgIGNvbnN0IGNlbnRlclggPSAodGxYICsgYnJYKSAvIDIgLSB4O1xuICAgIGNvbnN0IGNlbnRlclkgPSAodGxZICsgYnJZKSAvIDIgLSB5O1xuICAgIGNvbnN0IFtvZmZzZXRYLCBvZmZzZXRZXSA9IHRoaXMudmlld3BvcnQucm90YXRpb24gJSAxODAgPT09IDAgPyBbY2VudGVyWCwgY2VudGVyWV0gOiBbY2VudGVyWSwgY2VudGVyWF07XG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldFgsXG4gICAgICBvZmZzZXRZXG4gICAgfTtcbiAgfVxuICBhZGROZXdFZGl0b3IoKSB7XG4gICAgdGhpcy5jcmVhdGVBbmRBZGROZXdFZGl0b3IodGhpcy4jZ2V0Q2VudGVyUG9pbnQoKSwgdHJ1ZSk7XG4gIH1cbiAgc2V0U2VsZWN0ZWQoZWRpdG9yKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnNldFNlbGVjdGVkKGVkaXRvcik7XG4gIH1cbiAgdG9nZ2xlU2VsZWN0ZWQoZWRpdG9yKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnRvZ2dsZVNlbGVjdGVkKGVkaXRvcik7XG4gIH1cbiAgaXNTZWxlY3RlZChlZGl0b3IpIHtcbiAgICByZXR1cm4gdGhpcy4jdWlNYW5hZ2VyLmlzU2VsZWN0ZWQoZWRpdG9yKTtcbiAgfVxuICB1bnNlbGVjdChlZGl0b3IpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIudW5zZWxlY3QoZWRpdG9yKTtcbiAgfVxuICBwb2ludGVydXAoZXZlbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgZXZlbnQuY3RybEtleSAmJiBpc01hYykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmRpdikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2hhZFBvaW50ZXJEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2hhZFBvaW50ZXJEb3duID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLiNhbGxvd0NsaWNrKSB7XG4gICAgICB0aGlzLiNhbGxvd0NsaWNrID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QKSB7XG4gICAgICB0aGlzLiN1aU1hbmFnZXIudW5zZWxlY3RBbGwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVBbmRBZGROZXdFZGl0b3IoZXZlbnQsIGZhbHNlKTtcbiAgfVxuICBwb2ludGVyZG93bihldmVudCkge1xuICAgIGlmICh0aGlzLiN1aU1hbmFnZXIuZ2V0TW9kZSgpID09PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5ISUdITElHSFQpIHtcbiAgICAgIHRoaXMuZW5hYmxlVGV4dFNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jaGFkUG9pbnRlckRvd24pIHtcbiAgICAgIHRoaXMuI2hhZFBvaW50ZXJEb3duID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGlzTWFjXG4gICAgfSA9IHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5jdHJsS2V5ICYmIGlzTWFjKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuZGl2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2hhZFBvaW50ZXJEb3duID0gdHJ1ZTtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLiN1aU1hbmFnZXIuZ2V0QWN0aXZlKCk7XG4gICAgdGhpcy4jYWxsb3dDbGljayA9ICFlZGl0b3IgfHwgZWRpdG9yLmlzRW1wdHkoKTtcbiAgfVxuICBmaW5kTmV3UGFyZW50KGVkaXRvciwgeCwgeSkge1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy4jdWlNYW5hZ2VyLmZpbmRQYXJlbnQoeCwgeSk7XG4gICAgaWYgKGxheWVyID09PSBudWxsIHx8IGxheWVyID09PSB0aGlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxheWVyLmNoYW5nZVBhcmVudChlZGl0b3IpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuI3VpTWFuYWdlci5nZXRBY3RpdmUoKT8ucGFyZW50ID09PSB0aGlzKSB7XG4gICAgICB0aGlzLiN1aU1hbmFnZXIuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci5zZXRBY3RpdmVFZGl0b3IobnVsbCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNlZGl0b3JGb2N1c1RpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2VkaXRvckZvY3VzVGltZW91dElkKTtcbiAgICAgIHRoaXMuI2VkaXRvckZvY3VzVGltZW91dElkID0gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXI/LnJlbW92ZVBvaW50ZXJJblRleHRMYXllcihlZGl0b3IuY29udGVudERpdik7XG4gICAgICBlZGl0b3Iuc2V0UGFyZW50KG51bGwpO1xuICAgICAgZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSA9IGZhbHNlO1xuICAgICAgZWRpdG9yLmRpdi5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy5kaXYgPSBudWxsO1xuICAgIHRoaXMuI2VkaXRvcnMuY2xlYXIoKTtcbiAgICB0aGlzLiN1aU1hbmFnZXIucmVtb3ZlTGF5ZXIodGhpcyk7XG4gIH1cbiAgI2NsZWFudXAoKSB7XG4gICAgdGhpcy4jaXNDbGVhbmluZ1VwID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZWRpdG9yLmlzRW1wdHkoKSkge1xuICAgICAgICBlZGl0b3IucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI2lzQ2xlYW5pbmdVcCA9IGZhbHNlO1xuICB9XG4gIHJlbmRlcih7XG4gICAgdmlld3BvcnRcbiAgfSkge1xuICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICBzZXRMYXllckRpbWVuc2lvbnModGhpcy5kaXYsIHZpZXdwb3J0KTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiN1aU1hbmFnZXIuZ2V0RWRpdG9ycyh0aGlzLnBhZ2VJbmRleCkpIHtcbiAgICAgIHRoaXMuYWRkKGVkaXRvcik7XG4gICAgICBlZGl0b3IucmVidWlsZCgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZU1vZGUoKTtcbiAgfVxuICB1cGRhdGUoe1xuICAgIHZpZXdwb3J0XG4gIH0pIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIuY29tbWl0T3JSZW1vdmUoKTtcbiAgICB0aGlzLiNjbGVhbnVwKCk7XG4gICAgY29uc3Qgb2xkUm90YXRpb24gPSB0aGlzLnZpZXdwb3J0LnJvdGF0aW9uO1xuICAgIGNvbnN0IHJvdGF0aW9uID0gdmlld3BvcnQucm90YXRpb247XG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIHNldExheWVyRGltZW5zaW9ucyh0aGlzLmRpdiwge1xuICAgICAgcm90YXRpb25cbiAgICB9KTtcbiAgICBpZiAob2xkUm90YXRpb24gIT09IHJvdGF0aW9uKSB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICAgIGVkaXRvci5yb3RhdGUocm90YXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZElua0VkaXRvcklmTmVlZGVkKGZhbHNlKTtcbiAgfVxuICBnZXQgcGFnZURpbWVuc2lvbnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVdpZHRoLFxuICAgICAgcGFnZUhlaWdodFxuICAgIH0gPSB0aGlzLnZpZXdwb3J0LnJhd0RpbXM7XG4gICAgcmV0dXJuIFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdO1xuICB9XG4gIGdldCBzY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLnJlYWxTY2FsZTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9kcmF3X2xheWVyLmpzXG5cblxuY2xhc3MgRHJhd0xheWVyIHtcbiAgI3BhcmVudCA9IG51bGw7XG4gICNpZCA9IDA7XG4gICNtYXBwaW5nID0gbmV3IE1hcCgpO1xuICAjdG9VcGRhdGUgPSBuZXcgTWFwKCk7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwYWdlSW5kZXhcbiAgfSkge1xuICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICB9XG4gIHNldFBhcmVudChwYXJlbnQpIHtcbiAgICBpZiAoIXRoaXMuI3BhcmVudCkge1xuICAgICAgdGhpcy4jcGFyZW50ID0gcGFyZW50O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jcGFyZW50ICE9PSBwYXJlbnQpIHtcbiAgICAgIGlmICh0aGlzLiNtYXBwaW5nLnNpemUgPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiB0aGlzLiNtYXBwaW5nLnZhbHVlcygpKSB7XG4gICAgICAgICAgcm9vdC5yZW1vdmUoKTtcbiAgICAgICAgICBwYXJlbnQuYXBwZW5kKHJvb3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLiNwYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgX3N2Z0ZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9zdmdGYWN0b3J5XCIsIG5ldyBET01TVkdGYWN0b3J5KCkpO1xuICB9XG4gIHN0YXRpYyAjc2V0Qm94KGVsZW1lbnQsIHtcbiAgICB4ID0gMCxcbiAgICB5ID0gMCxcbiAgICB3aWR0aCA9IDEsXG4gICAgaGVpZ2h0ID0gMVxuICB9ID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSBlbGVtZW50O1xuICAgIHN0eWxlLnRvcCA9IGAkezEwMCAqIHl9JWA7XG4gICAgc3R5bGUubGVmdCA9IGAkezEwMCAqIHh9JWA7XG4gICAgc3R5bGUud2lkdGggPSBgJHsxMDAgKiB3aWR0aH0lYDtcbiAgICBzdHlsZS5oZWlnaHQgPSBgJHsxMDAgKiBoZWlnaHR9JWA7XG4gIH1cbiAgI2NyZWF0ZVNWRyhib3gpIHtcbiAgICBjb25zdCBzdmcgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlKDEsIDEsIHRydWUpO1xuICAgIHRoaXMuI3BhcmVudC5hcHBlbmQoc3ZnKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgdHJ1ZSk7XG4gICAgRHJhd0xheWVyLiNzZXRCb3goc3ZnLCBib3gpO1xuICAgIHJldHVybiBzdmc7XG4gIH1cbiAgI2NyZWF0ZUNsaXBQYXRoKGRlZnMsIHBhdGhJZCkge1xuICAgIGNvbnN0IGNsaXBQYXRoID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJjbGlwUGF0aFwiKTtcbiAgICBkZWZzLmFwcGVuZChjbGlwUGF0aCk7XG4gICAgY29uc3QgY2xpcFBhdGhJZCA9IGBjbGlwXyR7cGF0aElkfWA7XG4gICAgY2xpcFBhdGguc2V0QXR0cmlidXRlKFwiaWRcIiwgY2xpcFBhdGhJZCk7XG4gICAgY2xpcFBhdGguc2V0QXR0cmlidXRlKFwiY2xpcFBhdGhVbml0c1wiLCBcIm9iamVjdEJvdW5kaW5nQm94XCIpO1xuICAgIGNvbnN0IGNsaXBQYXRoVXNlID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJ1c2VcIik7XG4gICAgY2xpcFBhdGguYXBwZW5kKGNsaXBQYXRoVXNlKTtcbiAgICBjbGlwUGF0aFVzZS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGAjJHtwYXRoSWR9YCk7XG4gICAgY2xpcFBhdGhVc2UuY2xhc3NMaXN0LmFkZChcImNsaXBcIik7XG4gICAgcmV0dXJuIGNsaXBQYXRoSWQ7XG4gIH1cbiAgaGlnaGxpZ2h0KG91dGxpbmVzLCBjb2xvciwgb3BhY2l0eSwgaXNQYXRoVXBkYXRhYmxlID0gZmFsc2UpIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuI2lkKys7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuI2NyZWF0ZVNWRyhvdXRsaW5lcy5ib3gpO1xuICAgIHJvb3QuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodFwiKTtcbiAgICBpZiAob3V0bGluZXMuZnJlZSkge1xuICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKFwiZnJlZVwiKTtcbiAgICB9XG4gICAgY29uc3QgZGVmcyA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwiZGVmc1wiKTtcbiAgICByb290LmFwcGVuZChkZWZzKTtcbiAgICBjb25zdCBwYXRoID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIpO1xuICAgIGRlZnMuYXBwZW5kKHBhdGgpO1xuICAgIGNvbnN0IHBhdGhJZCA9IGBwYXRoX3Ake3RoaXMucGFnZUluZGV4fV8ke2lkfWA7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBwYXRoSWQpO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKFwiZFwiLCBvdXRsaW5lcy50b1NWR1BhdGgoKSk7XG4gICAgaWYgKGlzUGF0aFVwZGF0YWJsZSkge1xuICAgICAgdGhpcy4jdG9VcGRhdGUuc2V0KGlkLCBwYXRoKTtcbiAgICB9XG4gICAgY29uc3QgY2xpcFBhdGhJZCA9IHRoaXMuI2NyZWF0ZUNsaXBQYXRoKGRlZnMsIHBhdGhJZCk7XG4gICAgY29uc3QgdXNlID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJ1c2VcIik7XG4gICAgcm9vdC5hcHBlbmQodXNlKTtcbiAgICByb290LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgY29sb3IpO1xuICAgIHJvb3Quc2V0QXR0cmlidXRlKFwiZmlsbC1vcGFjaXR5XCIsIG9wYWNpdHkpO1xuICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGAjJHtwYXRoSWR9YCk7XG4gICAgdGhpcy4jbWFwcGluZy5zZXQoaWQsIHJvb3QpO1xuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIGNsaXBQYXRoSWQ6IGB1cmwoIyR7Y2xpcFBhdGhJZH0pYFxuICAgIH07XG4gIH1cbiAgaGlnaGxpZ2h0T3V0bGluZShvdXRsaW5lcykge1xuICAgIGNvbnN0IGlkID0gdGhpcy4jaWQrKztcbiAgICBjb25zdCByb290ID0gdGhpcy4jY3JlYXRlU1ZHKG91dGxpbmVzLmJveCk7XG4gICAgcm9vdC5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0T3V0bGluZVwiKTtcbiAgICBjb25zdCBkZWZzID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIpO1xuICAgIHJvb3QuYXBwZW5kKGRlZnMpO1xuICAgIGNvbnN0IHBhdGggPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInBhdGhcIik7XG4gICAgZGVmcy5hcHBlbmQocGF0aCk7XG4gICAgY29uc3QgcGF0aElkID0gYHBhdGhfcCR7dGhpcy5wYWdlSW5kZXh9XyR7aWR9YDtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcImlkXCIsIHBhdGhJZCk7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIG91dGxpbmVzLnRvU1ZHUGF0aCgpKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcInZlY3Rvci1lZmZlY3RcIiwgXCJub24tc2NhbGluZy1zdHJva2VcIik7XG4gICAgbGV0IG1hc2tJZDtcbiAgICBpZiAob3V0bGluZXMuZnJlZSkge1xuICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKFwiZnJlZVwiKTtcbiAgICAgIGNvbnN0IG1hc2sgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcIm1hc2tcIik7XG4gICAgICBkZWZzLmFwcGVuZChtYXNrKTtcbiAgICAgIG1hc2tJZCA9IGBtYXNrX3Ake3RoaXMucGFnZUluZGV4fV8ke2lkfWA7XG4gICAgICBtYXNrLnNldEF0dHJpYnV0ZShcImlkXCIsIG1hc2tJZCk7XG4gICAgICBtYXNrLnNldEF0dHJpYnV0ZShcIm1hc2tVbml0c1wiLCBcIm9iamVjdEJvdW5kaW5nQm94XCIpO1xuICAgICAgY29uc3QgcmVjdCA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwicmVjdFwiKTtcbiAgICAgIG1hc2suYXBwZW5kKHJlY3QpO1xuICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBcIjFcIik7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjFcIik7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ3aGl0ZVwiKTtcbiAgICAgIGNvbnN0IHVzZSA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwidXNlXCIpO1xuICAgICAgbWFzay5hcHBlbmQodXNlKTtcbiAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGAjJHtwYXRoSWR9YCk7XG4gICAgICB1c2Uuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwibm9uZVwiKTtcbiAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwiYmxhY2tcIik7XG4gICAgICB1c2Uuc2V0QXR0cmlidXRlKFwiZmlsbC1ydWxlXCIsIFwibm9uemVyb1wiKTtcbiAgICAgIHVzZS5jbGFzc0xpc3QuYWRkKFwibWFza1wiKTtcbiAgICB9XG4gICAgY29uc3QgdXNlMSA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwidXNlXCIpO1xuICAgIHJvb3QuYXBwZW5kKHVzZTEpO1xuICAgIHVzZTEuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBgIyR7cGF0aElkfWApO1xuICAgIGlmIChtYXNrSWQpIHtcbiAgICAgIHVzZTEuc2V0QXR0cmlidXRlKFwibWFza1wiLCBgdXJsKCMke21hc2tJZH0pYCk7XG4gICAgfVxuICAgIGNvbnN0IHVzZTIgPSB1c2UxLmNsb25lTm9kZSgpO1xuICAgIHJvb3QuYXBwZW5kKHVzZTIpO1xuICAgIHVzZTEuY2xhc3NMaXN0LmFkZChcIm1haW5PdXRsaW5lXCIpO1xuICAgIHVzZTIuY2xhc3NMaXN0LmFkZChcInNlY29uZGFyeU91dGxpbmVcIik7XG4gICAgdGhpcy4jbWFwcGluZy5zZXQoaWQsIHJvb3QpO1xuICAgIHJldHVybiBpZDtcbiAgfVxuICBmaW5hbGl6ZUxpbmUoaWQsIGxpbmUpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy4jdG9VcGRhdGUuZ2V0KGlkKTtcbiAgICB0aGlzLiN0b1VwZGF0ZS5kZWxldGUoaWQpO1xuICAgIHRoaXMudXBkYXRlQm94KGlkLCBsaW5lLmJveCk7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIGxpbmUudG9TVkdQYXRoKCkpO1xuICB9XG4gIHVwZGF0ZUxpbmUoaWQsIGxpbmUpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy4jbWFwcGluZy5nZXQoaWQpO1xuICAgIGNvbnN0IGRlZnMgPSByb290LmZpcnN0Q2hpbGQ7XG4gICAgY29uc3QgcGF0aCA9IGRlZnMuZmlyc3RDaGlsZDtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcImRcIiwgbGluZS50b1NWR1BhdGgoKSk7XG4gIH1cbiAgcmVtb3ZlRnJlZUhpZ2hsaWdodChpZCkge1xuICAgIHRoaXMucmVtb3ZlKGlkKTtcbiAgICB0aGlzLiN0b1VwZGF0ZS5kZWxldGUoaWQpO1xuICB9XG4gIHVwZGF0ZVBhdGgoaWQsIGxpbmUpIHtcbiAgICB0aGlzLiN0b1VwZGF0ZS5nZXQoaWQpLnNldEF0dHJpYnV0ZShcImRcIiwgbGluZS50b1NWR1BhdGgoKSk7XG4gIH1cbiAgdXBkYXRlQm94KGlkLCBib3gpIHtcbiAgICBEcmF3TGF5ZXIuI3NldEJveCh0aGlzLiNtYXBwaW5nLmdldChpZCksIGJveCk7XG4gIH1cbiAgc2hvdyhpZCwgdmlzaWJsZSkge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5jbGFzc0xpc3QudG9nZ2xlKFwiaGlkZGVuXCIsICF2aXNpYmxlKTtcbiAgfVxuICByb3RhdGUoaWQsIGFuZ2xlKSB7XG4gICAgdGhpcy4jbWFwcGluZy5nZXQoaWQpLnNldEF0dHJpYnV0ZShcImRhdGEtbWFpbi1yb3RhdGlvblwiLCBhbmdsZSk7XG4gIH1cbiAgY2hhbmdlQ29sb3IoaWQsIGNvbG9yKSB7XG4gICAgdGhpcy4jbWFwcGluZy5nZXQoaWQpLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgY29sb3IpO1xuICB9XG4gIGNoYW5nZU9wYWNpdHkoaWQsIG9wYWNpdHkpIHtcbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkuc2V0QXR0cmlidXRlKFwiZmlsbC1vcGFjaXR5XCIsIG9wYWNpdHkpO1xuICB9XG4gIGFkZENsYXNzKGlkLCBjbGFzc05hbWUpIHtcbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICB9XG4gIHJlbW92ZUNsYXNzKGlkLCBjbGFzc05hbWUpIHtcbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICB9XG4gIHJlbW92ZShpZCkge1xuICAgIGlmICh0aGlzLiNwYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jbWFwcGluZy5nZXQoaWQpLnJlbW92ZSgpO1xuICAgIHRoaXMuI21hcHBpbmcuZGVsZXRlKGlkKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuI3BhcmVudCA9IG51bGw7XG4gICAgZm9yIChjb25zdCByb290IG9mIHRoaXMuI21hcHBpbmcudmFsdWVzKCkpIHtcbiAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgfVxuICAgIHRoaXMuI21hcHBpbmcuY2xlYXIoKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvcGRmLmpzXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBwZGZqc1ZlcnNpb24gPSBcIjQuNC4xNjhcIjtcbmNvbnN0IHBkZmpzQnVpbGQgPSBcIjE5ZmJjODk5OFwiO1xuXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0Fib3J0RXhjZXB0aW9uID0gX193ZWJwYWNrX2V4cG9ydHNfXy5BYm9ydEV4Y2VwdGlvbjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvckxheWVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5Bbm5vdGF0aW9uRWRpdG9yTGF5ZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlID0gX193ZWJwYWNrX2V4cG9ydHNfXy5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvclR5cGUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25FZGl0b3JUeXBlO1xudmFyIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5Bbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uTGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25MYXllcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbk1vZGUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25Nb2RlO1xudmFyIF9fd2VicGFja19leHBvcnRzX19DTWFwQ29tcHJlc3Npb25UeXBlID0gX193ZWJwYWNrX2V4cG9ydHNfXy5DTWFwQ29tcHJlc3Npb25UeXBlO1xudmFyIF9fd2VicGFja19leHBvcnRzX19Db2xvclBpY2tlciA9IF9fd2VicGFja19leHBvcnRzX18uQ29sb3JQaWNrZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0RPTVNWR0ZhY3RvcnkgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkRPTVNWR0ZhY3Rvcnk7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0RyYXdMYXllciA9IF9fd2VicGFja19leHBvcnRzX18uRHJhd0xheWVyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19GZWF0dXJlVGVzdCA9IF9fd2VicGFja19leHBvcnRzX18uRmVhdHVyZVRlc3Q7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0dsb2JhbFdvcmtlck9wdGlvbnMgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkdsb2JhbFdvcmtlck9wdGlvbnM7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0ltYWdlS2luZCA9IF9fd2VicGFja19leHBvcnRzX18uSW1hZ2VLaW5kO1xudmFyIF9fd2VicGFja19leHBvcnRzX19JbnZhbGlkUERGRXhjZXB0aW9uID0gX193ZWJwYWNrX2V4cG9ydHNfXy5JbnZhbGlkUERGRXhjZXB0aW9uO1xudmFyIF9fd2VicGFja19leHBvcnRzX19NaXNzaW5nUERGRXhjZXB0aW9uID0gX193ZWJwYWNrX2V4cG9ydHNfXy5NaXNzaW5nUERGRXhjZXB0aW9uO1xudmFyIF9fd2VicGFja19leHBvcnRzX19PUFMgPSBfX3dlYnBhY2tfZXhwb3J0c19fLk9QUztcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fT3V0bGluZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLk91dGxpbmVyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19QREZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlBERkRhdGFSYW5nZVRyYW5zcG9ydDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fUERGRGF0ZVN0cmluZyA9IF9fd2VicGFja19leHBvcnRzX18uUERGRGF0ZVN0cmluZztcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fUERGV29ya2VyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5QREZXb3JrZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1Bhc3N3b3JkUmVzcG9uc2VzID0gX193ZWJwYWNrX2V4cG9ydHNfXy5QYXNzd29yZFJlc3BvbnNlcztcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fUGVybWlzc2lvbkZsYWcgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlBlcm1pc3Npb25GbGFnO1xudmFyIF9fd2VicGFja19leHBvcnRzX19QaXhlbHNQZXJJbmNoID0gX193ZWJwYWNrX2V4cG9ydHNfXy5QaXhlbHNQZXJJbmNoO1xudmFyIF9fd2VicGFja19leHBvcnRzX19SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fVGV4dExheWVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5UZXh0TGF5ZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1VuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiA9IF9fd2VicGFja19leHBvcnRzX18uVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uO1xudmFyIF9fd2VicGFja19leHBvcnRzX19VdGlsID0gX193ZWJwYWNrX2V4cG9ydHNfXy5VdGlsO1xudmFyIF9fd2VicGFja19leHBvcnRzX19WZXJib3NpdHlMZXZlbCA9IF9fd2VicGFja19leHBvcnRzX18uVmVyYm9zaXR5TGV2ZWw7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1hmYUxheWVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5YZmFMYXllcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fYnVpbGQgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmJ1aWxkO1xudmFyIF9fd2VicGFja19leHBvcnRzX19jcmVhdGVWYWxpZEFic29sdXRlVXJsID0gX193ZWJwYWNrX2V4cG9ydHNfXy5jcmVhdGVWYWxpZEFic29sdXRlVXJsO1xudmFyIF9fd2VicGFja19leHBvcnRzX19mZXRjaERhdGEgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmZldGNoRGF0YTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0RG9jdW1lbnQgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmdldERvY3VtZW50O1xudmFyIF9fd2VicGFja19leHBvcnRzX19nZXRGaWxlbmFtZUZyb21VcmwgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmdldEZpbGVuYW1lRnJvbVVybDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0UGRmRmlsZW5hbWVGcm9tVXJsID0gX193ZWJwYWNrX2V4cG9ydHNfXy5nZXRQZGZGaWxlbmFtZUZyb21Vcmw7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2dldFhmYVBhZ2VWaWV3cG9ydCA9IF9fd2VicGFja19leHBvcnRzX18uZ2V0WGZhUGFnZVZpZXdwb3J0O1xudmFyIF9fd2VicGFja19leHBvcnRzX19pc0RhdGFTY2hlbWUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmlzRGF0YVNjaGVtZTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19faXNQZGZGaWxlID0gX193ZWJwYWNrX2V4cG9ydHNfXy5pc1BkZkZpbGU7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX25vQ29udGV4dE1lbnUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLm5vQ29udGV4dE1lbnU7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX25vcm1hbGl6ZVVuaWNvZGUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLm5vcm1hbGl6ZVVuaWNvZGU7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX3JlbmRlclRleHRMYXllciA9IF9fd2VicGFja19leHBvcnRzX18ucmVuZGVyVGV4dExheWVyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19zZXRMYXllckRpbWVuc2lvbnMgPSBfX3dlYnBhY2tfZXhwb3J0c19fLnNldExheWVyRGltZW5zaW9ucztcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fc2hhZG93ID0gX193ZWJwYWNrX2V4cG9ydHNfXy5zaGFkb3c7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX3VwZGF0ZVRleHRMYXllciA9IF9fd2VicGFja19leHBvcnRzX18udXBkYXRlVGV4dExheWVyO1xudmFyIF9fd2VicGFja19leHBvcnRzX192ZXJzaW9uID0gX193ZWJwYWNrX2V4cG9ydHNfXy52ZXJzaW9uO1xuZXhwb3J0IHsgX193ZWJwYWNrX2V4cG9ydHNfX0Fib3J0RXhjZXB0aW9uIGFzIEFib3J0RXhjZXB0aW9uLCBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvckxheWVyIGFzIEFubm90YXRpb25FZGl0b3JMYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlIGFzIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLCBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvclR5cGUgYXMgQW5ub3RhdGlvbkVkaXRvclR5cGUsIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyIGFzIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIsIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uTGF5ZXIgYXMgQW5ub3RhdGlvbkxheWVyLCBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbk1vZGUgYXMgQW5ub3RhdGlvbk1vZGUsIF9fd2VicGFja19leHBvcnRzX19DTWFwQ29tcHJlc3Npb25UeXBlIGFzIENNYXBDb21wcmVzc2lvblR5cGUsIF9fd2VicGFja19leHBvcnRzX19Db2xvclBpY2tlciBhcyBDb2xvclBpY2tlciwgX193ZWJwYWNrX2V4cG9ydHNfX0RPTVNWR0ZhY3RvcnkgYXMgRE9NU1ZHRmFjdG9yeSwgX193ZWJwYWNrX2V4cG9ydHNfX0RyYXdMYXllciBhcyBEcmF3TGF5ZXIsIF9fd2VicGFja19leHBvcnRzX19GZWF0dXJlVGVzdCBhcyBGZWF0dXJlVGVzdCwgX193ZWJwYWNrX2V4cG9ydHNfX0dsb2JhbFdvcmtlck9wdGlvbnMgYXMgR2xvYmFsV29ya2VyT3B0aW9ucywgX193ZWJwYWNrX2V4cG9ydHNfX0ltYWdlS2luZCBhcyBJbWFnZUtpbmQsIF9fd2VicGFja19leHBvcnRzX19JbnZhbGlkUERGRXhjZXB0aW9uIGFzIEludmFsaWRQREZFeGNlcHRpb24sIF9fd2VicGFja19leHBvcnRzX19NaXNzaW5nUERGRXhjZXB0aW9uIGFzIE1pc3NpbmdQREZFeGNlcHRpb24sIF9fd2VicGFja19leHBvcnRzX19PUFMgYXMgT1BTLCBfX3dlYnBhY2tfZXhwb3J0c19fT3V0bGluZXIgYXMgT3V0bGluZXIsIF9fd2VicGFja19leHBvcnRzX19QREZEYXRhUmFuZ2VUcmFuc3BvcnQgYXMgUERGRGF0YVJhbmdlVHJhbnNwb3J0LCBfX3dlYnBhY2tfZXhwb3J0c19fUERGRGF0ZVN0cmluZyBhcyBQREZEYXRlU3RyaW5nLCBfX3dlYnBhY2tfZXhwb3J0c19fUERGV29ya2VyIGFzIFBERldvcmtlciwgX193ZWJwYWNrX2V4cG9ydHNfX1Bhc3N3b3JkUmVzcG9uc2VzIGFzIFBhc3N3b3JkUmVzcG9uc2VzLCBfX3dlYnBhY2tfZXhwb3J0c19fUGVybWlzc2lvbkZsYWcgYXMgUGVybWlzc2lvbkZsYWcsIF9fd2VicGFja19leHBvcnRzX19QaXhlbHNQZXJJbmNoIGFzIFBpeGVsc1BlckluY2gsIF9fd2VicGFja19leHBvcnRzX19SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24gYXMgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uLCBfX3dlYnBhY2tfZXhwb3J0c19fVGV4dExheWVyIGFzIFRleHRMYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX1VuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiBhcyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24sIF9fd2VicGFja19leHBvcnRzX19VdGlsIGFzIFV0aWwsIF9fd2VicGFja19leHBvcnRzX19WZXJib3NpdHlMZXZlbCBhcyBWZXJib3NpdHlMZXZlbCwgX193ZWJwYWNrX2V4cG9ydHNfX1hmYUxheWVyIGFzIFhmYUxheWVyLCBfX3dlYnBhY2tfZXhwb3J0c19fYnVpbGQgYXMgYnVpbGQsIF9fd2VicGFja19leHBvcnRzX19jcmVhdGVWYWxpZEFic29sdXRlVXJsIGFzIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwsIF9fd2VicGFja19leHBvcnRzX19mZXRjaERhdGEgYXMgZmV0Y2hEYXRhLCBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0RG9jdW1lbnQgYXMgZ2V0RG9jdW1lbnQsIF9fd2VicGFja19leHBvcnRzX19nZXRGaWxlbmFtZUZyb21VcmwgYXMgZ2V0RmlsZW5hbWVGcm9tVXJsLCBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0UGRmRmlsZW5hbWVGcm9tVXJsIGFzIGdldFBkZkZpbGVuYW1lRnJvbVVybCwgX193ZWJwYWNrX2V4cG9ydHNfX2dldFhmYVBhZ2VWaWV3cG9ydCBhcyBnZXRYZmFQYWdlVmlld3BvcnQsIF9fd2VicGFja19leHBvcnRzX19pc0RhdGFTY2hlbWUgYXMgaXNEYXRhU2NoZW1lLCBfX3dlYnBhY2tfZXhwb3J0c19faXNQZGZGaWxlIGFzIGlzUGRmRmlsZSwgX193ZWJwYWNrX2V4cG9ydHNfX25vQ29udGV4dE1lbnUgYXMgbm9Db250ZXh0TWVudSwgX193ZWJwYWNrX2V4cG9ydHNfX25vcm1hbGl6ZVVuaWNvZGUgYXMgbm9ybWFsaXplVW5pY29kZSwgX193ZWJwYWNrX2V4cG9ydHNfX3JlbmRlclRleHRMYXllciBhcyByZW5kZXJUZXh0TGF5ZXIsIF9fd2VicGFja19leHBvcnRzX19zZXRMYXllckRpbWVuc2lvbnMgYXMgc2V0TGF5ZXJEaW1lbnNpb25zLCBfX3dlYnBhY2tfZXhwb3J0c19fc2hhZG93IGFzIHNoYWRvdywgX193ZWJwYWNrX2V4cG9ydHNfX3VwZGF0ZVRleHRMYXllciBhcyB1cGRhdGVUZXh0TGF5ZXIsIF9fd2VicGFja19leHBvcnRzX192ZXJzaW9uIGFzIHZlcnNpb24gfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGRmLm1qcy5tYXAiLCJpbXBvcnQgeyBtZW1vaXplIH0gZnJvbSAnLi91dGlscy9qc191dGlscy5qcyc7XG5leHBvcnQgY29uc3QgaXNGaXJlZm94ID0gbWVtb2l6ZSgoKT0+L2ZpcmVmb3gvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG4pO1xuZXhwb3J0IGNvbnN0IGlzU2FmYXJpID0gbWVtb2l6ZSgoKT0+Qm9vbGVhbih3aW5kb3cuc2FmYXJpKVxuKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckRldGVjdG9yLmpzLm1hcCIsImltcG9ydCB7IHVuaW9uLCB3aXRob3V0IH0gZnJvbSAnLi91dGlscy9qc191dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgRW50ZXJMZWF2ZUNvdW50ZXIge1xuICAgIGVudGVyKGVudGVyaW5nTm9kZSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c0xlbmd0aCA9IHRoaXMuZW50ZXJlZC5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGlzTm9kZUVudGVyZWQgPSAobm9kZSk9PnRoaXMuaXNOb2RlSW5Eb2N1bWVudChub2RlKSAmJiAoIW5vZGUuY29udGFpbnMgfHwgbm9kZS5jb250YWlucyhlbnRlcmluZ05vZGUpKVxuICAgICAgICA7XG4gICAgICAgIHRoaXMuZW50ZXJlZCA9IHVuaW9uKHRoaXMuZW50ZXJlZC5maWx0ZXIoaXNOb2RlRW50ZXJlZCksIFtcbiAgICAgICAgICAgIGVudGVyaW5nTm9kZVxuICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzTGVuZ3RoID09PSAwICYmIHRoaXMuZW50ZXJlZC5sZW5ndGggPiAwO1xuICAgIH1cbiAgICBsZWF2ZShsZWF2aW5nTm9kZSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c0xlbmd0aCA9IHRoaXMuZW50ZXJlZC5sZW5ndGg7XG4gICAgICAgIHRoaXMuZW50ZXJlZCA9IHdpdGhvdXQodGhpcy5lbnRlcmVkLmZpbHRlcih0aGlzLmlzTm9kZUluRG9jdW1lbnQpLCBsZWF2aW5nTm9kZSk7XG4gICAgICAgIHJldHVybiBwcmV2aW91c0xlbmd0aCA+IDAgJiYgdGhpcy5lbnRlcmVkLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuZW50ZXJlZCA9IFtdO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcihpc05vZGVJbkRvY3VtZW50KXtcbiAgICAgICAgdGhpcy5lbnRlcmVkID0gW107XG4gICAgICAgIHRoaXMuaXNOb2RlSW5Eb2N1bWVudCA9IGlzTm9kZUluRG9jdW1lbnQ7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRlckxlYXZlQ291bnRlci5qcy5tYXAiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gICAgZm9yKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgICAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuaW1wb3J0IHsgRW50ZXJMZWF2ZUNvdW50ZXIgfSBmcm9tICcuL0VudGVyTGVhdmVDb3VudGVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZU5hdGl2ZURyYWdTb3VyY2UsIG1hdGNoTmF0aXZlSXRlbVR5cGUgfSBmcm9tICcuL05hdGl2ZURyYWdTb3VyY2VzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIE5hdGl2ZVR5cGVzIGZyb20gJy4vTmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0RHJhZ1ByZXZpZXdPZmZzZXQsIGdldEV2ZW50Q2xpZW50T2Zmc2V0LCBnZXROb2RlQ2xpZW50T2Zmc2V0IH0gZnJvbSAnLi9PZmZzZXRVdGlscy5qcyc7XG5pbXBvcnQgeyBPcHRpb25zUmVhZGVyIH0gZnJvbSAnLi9PcHRpb25zUmVhZGVyLmpzJztcbmV4cG9ydCBjbGFzcyBIVE1MNUJhY2tlbmRJbXBsIHtcbiAgICAvKipcblx0ICogR2VuZXJhdGUgcHJvZmlsaW5nIHN0YXRpc3RpY3MgZm9yIHRoZSBIVE1MNUJhY2tlbmQuXG5cdCAqLyBwcm9maWxlKCkge1xuICAgICAgICB2YXIgcmVmLCByZWYxO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc291cmNlUHJldmlld05vZGVzOiB0aGlzLnNvdXJjZVByZXZpZXdOb2Rlcy5zaXplLFxuICAgICAgICAgICAgc291cmNlUHJldmlld05vZGVPcHRpb25zOiB0aGlzLnNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucy5zaXplLFxuICAgICAgICAgICAgc291cmNlTm9kZU9wdGlvbnM6IHRoaXMuc291cmNlTm9kZU9wdGlvbnMuc2l6ZSxcbiAgICAgICAgICAgIHNvdXJjZU5vZGVzOiB0aGlzLnNvdXJjZU5vZGVzLnNpemUsXG4gICAgICAgICAgICBkcmFnU3RhcnRTb3VyY2VJZHM6ICgocmVmID0gdGhpcy5kcmFnU3RhcnRTb3VyY2VJZHMpID09PSBudWxsIHx8IHJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmLmxlbmd0aCkgfHwgMCxcbiAgICAgICAgICAgIGRyb3BUYXJnZXRJZHM6IHRoaXMuZHJvcFRhcmdldElkcy5sZW5ndGgsXG4gICAgICAgICAgICBkcmFnRW50ZXJUYXJnZXRJZHM6IHRoaXMuZHJhZ0VudGVyVGFyZ2V0SWRzLmxlbmd0aCxcbiAgICAgICAgICAgIGRyYWdPdmVyVGFyZ2V0SWRzOiAoKHJlZjEgPSB0aGlzLmRyYWdPdmVyVGFyZ2V0SWRzKSA9PT0gbnVsbCB8fCByZWYxID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYxLmxlbmd0aCkgfHwgMFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBwdWJsaWMgZm9yIHRlc3RcbiAgICBnZXQgd2luZG93KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLndpbmRvdztcbiAgICB9XG4gICAgZ2V0IGRvY3VtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRvY3VtZW50O1xuICAgIH1cbiAgICAvKipcblx0ICogR2V0IHRoZSByb290IGVsZW1lbnQgdG8gdXNlIGZvciBldmVudCBzdWJzY3JpcHRpb25zXG5cdCAqLyBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMucm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIHNldHVwKCkge1xuICAgICAgICBjb25zdCByb290ID0gdGhpcy5yb290RWxlbWVudDtcbiAgICAgICAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb290Ll9faXNSZWFjdERuZEJhY2tlbmRTZXRVcCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgaGF2ZSB0d28gSFRNTDUgYmFja2VuZHMgYXQgdGhlIHNhbWUgdGltZS4nKTtcbiAgICAgICAgfVxuICAgICAgICByb290Ll9faXNSZWFjdERuZEJhY2tlbmRTZXRVcCA9IHRydWU7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMocm9vdCk7XG4gICAgfVxuICAgIHRlYXJkb3duKCkge1xuICAgICAgICBjb25zdCByb290ID0gdGhpcy5yb290RWxlbWVudDtcbiAgICAgICAgaWYgKHJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QuX19pc1JlYWN0RG5kQmFja2VuZFNldFVwID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5yb290RWxlbWVudCk7XG4gICAgICAgIHRoaXMuY2xlYXJDdXJyZW50RHJhZ1NvdXJjZU5vZGUoKTtcbiAgICAgICAgaWYgKHRoaXMuYXN5bmNFbmREcmFnRnJhbWVJZCkge1xuICAgICAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgICAgIChyZWYgPSB0aGlzLndpbmRvdykgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hc3luY0VuZERyYWdGcmFtZUlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25uZWN0RHJhZ1ByZXZpZXcoc291cmNlSWQsIG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMuc2V0KHNvdXJjZUlkLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZXMuc2V0KHNvdXJjZUlkLCBub2RlKTtcbiAgICAgICAgcmV0dXJuICgpPT57XG4gICAgICAgICAgICB0aGlzLnNvdXJjZVByZXZpZXdOb2Rlcy5kZWxldGUoc291cmNlSWQpO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMuZGVsZXRlKHNvdXJjZUlkKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29ubmVjdERyYWdTb3VyY2Uoc291cmNlSWQsIG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VOb2Rlcy5zZXQoc291cmNlSWQsIG5vZGUpO1xuICAgICAgICB0aGlzLnNvdXJjZU5vZGVPcHRpb25zLnNldChzb3VyY2VJZCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGhhbmRsZURyYWdTdGFydCA9IChlKT0+dGhpcy5oYW5kbGVEcmFnU3RhcnQoZSwgc291cmNlSWQpXG4gICAgICAgIDtcbiAgICAgICAgY29uc3QgaGFuZGxlU2VsZWN0U3RhcnQgPSAoZSk9PnRoaXMuaGFuZGxlU2VsZWN0U3RhcnQoZSlcbiAgICAgICAgO1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBoYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0JywgaGFuZGxlU2VsZWN0U3RhcnQpO1xuICAgICAgICByZXR1cm4gKCk9PntcbiAgICAgICAgICAgIHRoaXMuc291cmNlTm9kZXMuZGVsZXRlKHNvdXJjZUlkKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlTm9kZU9wdGlvbnMuZGVsZXRlKHNvdXJjZUlkKTtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBoYW5kbGVTZWxlY3RTdGFydCk7XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZHJhZ2dhYmxlJywgJ2ZhbHNlJyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbm5lY3REcm9wVGFyZ2V0KHRhcmdldElkLCBub2RlKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZURyYWdFbnRlciA9IChlKT0+dGhpcy5oYW5kbGVEcmFnRW50ZXIoZSwgdGFyZ2V0SWQpXG4gICAgICAgIDtcbiAgICAgICAgY29uc3QgaGFuZGxlRHJhZ092ZXIgPSAoZSk9PnRoaXMuaGFuZGxlRHJhZ092ZXIoZSwgdGFyZ2V0SWQpXG4gICAgICAgIDtcbiAgICAgICAgY29uc3QgaGFuZGxlRHJvcCA9IChlKT0+dGhpcy5oYW5kbGVEcm9wKGUsIHRhcmdldElkKVxuICAgICAgICA7XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgaGFuZGxlRHJhZ0VudGVyKTtcbiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIGhhbmRsZURyYWdPdmVyKTtcbiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgaGFuZGxlRHJvcCk7XG4gICAgICAgIHJldHVybiAoKT0+e1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCBoYW5kbGVEcmFnRW50ZXIpO1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIGhhbmRsZURyYWdPdmVyKTtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIGhhbmRsZURyb3ApO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBhZGRFdmVudExpc3RlbmVycyh0YXJnZXQpIHtcbiAgICAgICAgLy8gU1NSIEZpeCAoaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRuZC9yZWFjdC1kbmQvcHVsbC84MTNcbiAgICAgICAgaWYgKCF0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZVRvcERyYWdTdGFydCk7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZVRvcERyYWdTdGFydENhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlVG9wRHJhZ0VuZENhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5oYW5kbGVUb3BEcmFnRW50ZXIpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5oYW5kbGVUb3BEcmFnRW50ZXJDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMuaGFuZGxlVG9wRHJhZ0xlYXZlQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlVG9wRHJhZ092ZXIpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZVRvcERyYWdPdmVyQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5oYW5kbGVUb3BEcm9wKTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmhhbmRsZVRvcERyb3BDYXB0dXJlLCB0cnVlKTtcbiAgICB9XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGFyZ2V0KSB7XG4gICAgICAgIC8vIFNTUiBGaXggKGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kbmQvcmVhY3QtZG5kL3B1bGwvODEzXG4gICAgICAgIGlmICghdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVUb3BEcmFnU3RhcnQpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVUb3BEcmFnU3RhcnRDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLmhhbmRsZVRvcERyYWdFbmRDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuaGFuZGxlVG9wRHJhZ0VudGVyKTtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuaGFuZGxlVG9wRHJhZ0VudGVyQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLmhhbmRsZVRvcERyYWdMZWF2ZUNhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZVRvcERyYWdPdmVyKTtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5oYW5kbGVUb3BEcmFnT3ZlckNhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuaGFuZGxlVG9wRHJvcCk7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5oYW5kbGVUb3BEcm9wQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGdldEN1cnJlbnRTb3VyY2VOb2RlT3B0aW9ucygpIHtcbiAgICAgICAgY29uc3Qgc291cmNlSWQgPSB0aGlzLm1vbml0b3IuZ2V0U291cmNlSWQoKTtcbiAgICAgICAgY29uc3Qgc291cmNlTm9kZU9wdGlvbnMgPSB0aGlzLnNvdXJjZU5vZGVPcHRpb25zLmdldChzb3VyY2VJZCk7XG4gICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICAgIGRyb3BFZmZlY3Q6IHRoaXMuYWx0S2V5UHJlc3NlZCA/ICdjb3B5JyA6ICdtb3ZlJ1xuICAgICAgICB9LCBzb3VyY2VOb2RlT3B0aW9ucyB8fCB7fSk7XG4gICAgfVxuICAgIGdldEN1cnJlbnREcm9wRWZmZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAvLyBJdCBtYWtlcyBtb3JlIHNlbnNlIHRvIGRlZmF1bHQgdG8gJ2NvcHknIGZvciBuYXRpdmUgcmVzb3VyY2VzXG4gICAgICAgICAgICByZXR1cm4gJ2NvcHknO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRTb3VyY2VOb2RlT3B0aW9ucygpLmRyb3BFZmZlY3Q7XG4gICAgfVxuICAgIGdldEN1cnJlbnRTb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gdGhpcy5tb25pdG9yLmdldFNvdXJjZUlkKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucyA9IHRoaXMuc291cmNlUHJldmlld05vZGVPcHRpb25zLmdldChzb3VyY2VJZCk7XG4gICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICAgIGFuY2hvclg6IDAuNSxcbiAgICAgICAgICAgIGFuY2hvclk6IDAuNSxcbiAgICAgICAgICAgIGNhcHR1cmVEcmFnZ2luZ1N0YXRlOiBmYWxzZVxuICAgICAgICB9LCBzb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMgfHwge30pO1xuICAgIH1cbiAgICBpc0RyYWdnaW5nTmF0aXZlSXRlbSgpIHtcbiAgICAgICAgY29uc3QgaXRlbVR5cGUgPSB0aGlzLm1vbml0b3IuZ2V0SXRlbVR5cGUoKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKE5hdGl2ZVR5cGVzKS5zb21lKChrZXkpPT5OYXRpdmVUeXBlc1trZXldID09PSBpdGVtVHlwZVxuICAgICAgICApO1xuICAgIH1cbiAgICBiZWdpbkRyYWdOYXRpdmVJdGVtKHR5cGUsIGRhdGFUcmFuc2Zlcikge1xuICAgICAgICB0aGlzLmNsZWFyQ3VycmVudERyYWdTb3VyY2VOb2RlKCk7XG4gICAgICAgIHRoaXMuY3VycmVudE5hdGl2ZVNvdXJjZSA9IGNyZWF0ZU5hdGl2ZURyYWdTb3VyY2UodHlwZSwgZGF0YVRyYW5zZmVyKTtcbiAgICAgICAgdGhpcy5jdXJyZW50TmF0aXZlSGFuZGxlID0gdGhpcy5yZWdpc3RyeS5hZGRTb3VyY2UodHlwZSwgdGhpcy5jdXJyZW50TmF0aXZlU291cmNlKTtcbiAgICAgICAgdGhpcy5hY3Rpb25zLmJlZ2luRHJhZyhbXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnROYXRpdmVIYW5kbGVcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIHNldEN1cnJlbnREcmFnU291cmNlTm9kZShub2RlKSB7XG4gICAgICAgIHRoaXMuY2xlYXJDdXJyZW50RHJhZ1NvdXJjZU5vZGUoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50RHJhZ1NvdXJjZU5vZGUgPSBub2RlO1xuICAgICAgICAvLyBBIHRpbWVvdXQgb2YgPiAwIGlzIG5lY2Vzc2FyeSB0byByZXNvbHZlIEZpcmVmb3ggaXNzdWUgcmVmZXJlbmNlZFxuICAgICAgICAvLyBTZWU6XG4gICAgICAgIC8vICAgKiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZG5kL3JlYWN0LWRuZC9wdWxsLzkyOFxuICAgICAgICAvLyAgICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRuZC9yZWFjdC1kbmQvaXNzdWVzLzg2OVxuICAgICAgICBjb25zdCBNT1VTRV9NT1ZFX1RJTUVPVVQgPSAxMDAwO1xuICAgICAgICAvLyBSZWNlaXZpbmcgYSBtb3VzZSBldmVudCBpbiB0aGUgbWlkZGxlIG9mIGEgZHJhZ2dpbmcgb3BlcmF0aW9uXG4gICAgICAgIC8vIG1lYW5zIGl0IGhhcyBlbmRlZCBhbmQgdGhlIGRyYWcgc291cmNlIG5vZGUgZGlzYXBwZWFyZWQgZnJvbSBET00sXG4gICAgICAgIC8vIHNvIHRoZSBicm93c2VyIGRpZG4ndCBkaXNwYXRjaCB0aGUgZHJhZ2VuZCBldmVudC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0IGJlZm9yZSB3ZSBzdGFydCBsaXN0ZW5pbmcgZm9yIG1vdXNlbW92ZSBldmVudHMuXG4gICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGRyYWcgcHJldmlldyBuZWVkcyB0byBiZSBkcmF3biBvciBlbHNlIGl0IGZpcmVzIGFuICdtb3VzZW1vdmUnIGV2ZW50XG4gICAgICAgIC8vIGltbWVkaWF0ZWx5IGluIHNvbWUgYnJvd3NlcnMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlZTpcbiAgICAgICAgLy8gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kbmQvcmVhY3QtZG5kL3B1bGwvOTI4XG4gICAgICAgIC8vICAgKiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZG5kL3JlYWN0LWRuZC9pc3N1ZXMvODY5XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMubW91c2VNb3ZlVGltZW91dFRpbWVyID0gc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgICAgIHJldHVybiAocmVmID0gdGhpcy5yb290RWxlbWVudCkgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5lbmREcmFnSWZTb3VyY2VXYXNSZW1vdmVkRnJvbURPTSwgdHJ1ZSk7XG4gICAgICAgIH0sIE1PVVNFX01PVkVfVElNRU9VVCk7XG4gICAgfVxuICAgIGNsZWFyQ3VycmVudERyYWdTb3VyY2VOb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50RHJhZ1NvdXJjZU5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudERyYWdTb3VyY2VOb2RlID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgICAgICAgICAocmVmID0gdGhpcy53aW5kb3cpID09PSBudWxsIHx8IHJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmLmNsZWFyVGltZW91dCh0aGlzLm1vdXNlTW92ZVRpbWVvdXRUaW1lciB8fCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5lbmREcmFnSWZTb3VyY2VXYXNSZW1vdmVkRnJvbURPTSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1vdXNlTW92ZVRpbWVvdXRUaW1lciA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhbmRsZURyYWdTdGFydChlLCBzb3VyY2VJZCkge1xuICAgICAgICBpZiAoZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmRyYWdTdGFydFNvdXJjZUlkcykge1xuICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnRTb3VyY2VJZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyYWdTdGFydFNvdXJjZUlkcy51bnNoaWZ0KHNvdXJjZUlkKTtcbiAgICB9XG4gICAgaGFuZGxlRHJhZ0VudGVyKF9lLCB0YXJnZXRJZCkge1xuICAgICAgICB0aGlzLmRyYWdFbnRlclRhcmdldElkcy51bnNoaWZ0KHRhcmdldElkKTtcbiAgICB9XG4gICAgaGFuZGxlRHJhZ092ZXIoX2UsIHRhcmdldElkKSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdPdmVyVGFyZ2V0SWRzID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdPdmVyVGFyZ2V0SWRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcmFnT3ZlclRhcmdldElkcy51bnNoaWZ0KHRhcmdldElkKTtcbiAgICB9XG4gICAgaGFuZGxlRHJvcChfZSwgdGFyZ2V0SWQpIHtcbiAgICAgICAgdGhpcy5kcm9wVGFyZ2V0SWRzLnVuc2hpZnQodGFyZ2V0SWQpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihtYW5hZ2VyLCBnbG9iYWxDb250ZXh0LCBvcHRpb25zKXtcbiAgICAgICAgdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc291cmNlUHJldmlld05vZGVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnNvdXJjZU5vZGVzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnNvdXJjZU5vZGVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmRyYWdTdGFydFNvdXJjZUlkcyA9IG51bGw7XG4gICAgICAgIHRoaXMuZHJvcFRhcmdldElkcyA9IFtdO1xuICAgICAgICB0aGlzLmRyYWdFbnRlclRhcmdldElkcyA9IFtdO1xuICAgICAgICB0aGlzLmN1cnJlbnROYXRpdmVTb3VyY2UgPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnJlbnROYXRpdmVIYW5kbGUgPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnJlbnREcmFnU291cmNlTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYWx0S2V5UHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vdXNlTW92ZVRpbWVvdXRUaW1lciA9IG51bGw7XG4gICAgICAgIHRoaXMuYXN5bmNFbmREcmFnRnJhbWVJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuZHJhZ092ZXJUYXJnZXRJZHMgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RDbGllbnRPZmZzZXQgPSBudWxsO1xuICAgICAgICB0aGlzLmhvdmVyUmFmSWQgPSBudWxsO1xuICAgICAgICB0aGlzLmdldFNvdXJjZUNsaWVudE9mZnNldCA9IChzb3VyY2VJZCk9PntcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlTm9kZXMuZ2V0KHNvdXJjZUlkKTtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2UgJiYgZ2V0Tm9kZUNsaWVudE9mZnNldChzb3VyY2UpIHx8IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZW5kRHJhZ05hdGl2ZUl0ZW0gPSAoKT0+e1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFjdGlvbnMuZW5kRHJhZygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE5hdGl2ZUhhbmRsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0cnkucmVtb3ZlU291cmNlKHRoaXMuY3VycmVudE5hdGl2ZUhhbmRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnROYXRpdmVIYW5kbGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50TmF0aXZlU291cmNlID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5pc05vZGVJbkRvY3VtZW50ID0gKG5vZGUpPT57XG4gICAgICAgICAgICAvLyBDaGVjayB0aGUgbm9kZSBlaXRoZXIgaW4gdGhlIG1haW4gZG9jdW1lbnQgb3IgaW4gdGhlIGN1cnJlbnQgY29udGV4dFxuICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4obm9kZSAmJiB0aGlzLmRvY3VtZW50ICYmIHRoaXMuZG9jdW1lbnQuYm9keSAmJiB0aGlzLmRvY3VtZW50LmJvZHkuY29udGFpbnMobm9kZSkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVuZERyYWdJZlNvdXJjZVdhc1JlbW92ZWRGcm9tRE9NID0gKCk9PntcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnREcmFnU291cmNlTm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlID09IG51bGwgfHwgdGhpcy5pc05vZGVJbkRvY3VtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2xlYXJDdXJyZW50RHJhZ1NvdXJjZU5vZGUoKSAmJiB0aGlzLm1vbml0b3IuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmVuZERyYWcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FuY2VsSG92ZXIoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZUhvdmVyID0gKGRyYWdPdmVyVGFyZ2V0SWRzKT0+e1xuICAgICAgICAgICAgaWYgKHRoaXMuaG92ZXJSYWZJZCA9PT0gbnVsbCAmJiB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmhvdmVyKGRyYWdPdmVyVGFyZ2V0SWRzIHx8IFtdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50T2Zmc2V0OiB0aGlzLmxhc3RDbGllbnRPZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJSYWZJZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2FuY2VsSG92ZXIgPSAoKT0+e1xuICAgICAgICAgICAgaWYgKHRoaXMuaG92ZXJSYWZJZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5ob3ZlclJhZklkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvdmVyUmFmSWQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdTdGFydENhcHR1cmUgPSAoKT0+e1xuICAgICAgICAgICAgdGhpcy5jbGVhckN1cnJlbnREcmFnU291cmNlTm9kZSgpO1xuICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnRTb3VyY2VJZHMgPSBbXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3BEcmFnU3RhcnQgPSAoZSk9PntcbiAgICAgICAgICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRyYWdTdGFydFNvdXJjZUlkcyAgfSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmRyYWdTdGFydFNvdXJjZUlkcyA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBjbGllbnRPZmZzZXQgPSBnZXRFdmVudENsaWVudE9mZnNldChlKTtcbiAgICAgICAgICAgIC8vIEF2b2lkIGNyYXNoaW5nIGlmIHdlIG1pc3NlZCBhIGRyb3AgZXZlbnQgb3Igb3VyIHByZXZpb3VzIGRyYWcgZGllZFxuICAgICAgICAgICAgaWYgKHRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuZW5kRHJhZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsSG92ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERvbid0IHB1Ymxpc2ggdGhlIHNvdXJjZSBqdXN0IHlldCAoc2VlIHdoeSBiZWxvdylcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5iZWdpbkRyYWcoZHJhZ1N0YXJ0U291cmNlSWRzIHx8IFtdLCB7XG4gICAgICAgICAgICAgICAgcHVibGlzaFNvdXJjZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZ2V0U291cmNlQ2xpZW50T2Zmc2V0OiB0aGlzLmdldFNvdXJjZUNsaWVudE9mZnNldCxcbiAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhVHJhbnNmZXIgIH0gPSBlO1xuICAgICAgICAgICAgY29uc3QgbmF0aXZlVHlwZSA9IG1hdGNoTmF0aXZlSXRlbVR5cGUoZGF0YVRyYW5zZmVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1vbml0b3IuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFUcmFuc2ZlciAmJiB0eXBlb2YgZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY3VzdG9tIGRyYWcgaW1hZ2UgaWYgdXNlciBzcGVjaWZpZXMgaXQuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGNoaWxkIGRyYWcgc291cmNlIHJlZnVzZXMgZHJhZyBidXQgcGFyZW50IGFncmVlcyxcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHBhcmVudCdzIG5vZGUgYXMgZHJhZyBpbWFnZS4gTmVpdGhlciB3b3JrcyBpbiBJRSB0aG91Z2guXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUlkID0gdGhpcy5tb25pdG9yLmdldFNvdXJjZUlkKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSB0aGlzLnNvdXJjZU5vZGVzLmdldChzb3VyY2VJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdQcmV2aWV3ID0gdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZXMuZ2V0KHNvdXJjZUlkKSB8fCBzb3VyY2VOb2RlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZHJhZ1ByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgYW5jaG9yWCAsIGFuY2hvclkgLCBvZmZzZXRYICwgb2Zmc2V0WSAgfSA9IHRoaXMuZ2V0Q3VycmVudFNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yUG9pbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yWCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JZXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0UG9pbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRZXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJhZ1ByZXZpZXdPZmZzZXQgPSBnZXREcmFnUHJldmlld09mZnNldChzb3VyY2VOb2RlLCBkcmFnUHJldmlldywgY2xpZW50T2Zmc2V0LCBhbmNob3JQb2ludCwgb2Zmc2V0UG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShkcmFnUHJldmlldywgZHJhZ1ByZXZpZXdPZmZzZXQueCwgZHJhZ1ByZXZpZXdPZmZzZXQueSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmlyZWZveCB3b24ndCBkcmFnIHdpdGhvdXQgc2V0dGluZyBkYXRhXG4gICAgICAgICAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9PT0gbnVsbCB8fCBkYXRhVHJhbnNmZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGFUcmFuc2Zlci5zZXREYXRhKCdhcHBsaWNhdGlvbi9qc29uJywge30pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIElFIGRvZXNuJ3Qgc3VwcG9ydCBNSU1FIHR5cGVzIGluIHNldERhdGFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU3RvcmUgZHJhZyBzb3VyY2Ugbm9kZSBzbyB3ZSBjYW4gY2hlY2sgd2hldGhlclxuICAgICAgICAgICAgICAgIC8vIGl0IGlzIHJlbW92ZWQgZnJvbSBET00gYW5kIHRyaWdnZXIgZW5kRHJhZyBtYW51YWxseS5cbiAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnJlbnREcmFnU291cmNlTm9kZShlLnRhcmdldCk7XG4gICAgICAgICAgICAgICAgLy8gTm93IHdlIGFyZSByZWFkeSB0byBwdWJsaXNoIHRoZSBkcmFnIHNvdXJjZS4uIG9yIGFyZSB3ZSBub3Q/XG4gICAgICAgICAgICAgICAgY29uc3QgeyBjYXB0dXJlRHJhZ2dpbmdTdGF0ZSAgfSA9IHRoaXMuZ2V0Q3VycmVudFNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucygpO1xuICAgICAgICAgICAgICAgIGlmICghY2FwdHVyZURyYWdnaW5nU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVXN1YWxseSB3ZSB3YW50IHRvIHB1Ymxpc2ggaXQgaW4gdGhlIG5leHQgdGljayBzbyB0aGF0IGJyb3dzZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gaXMgYWJsZSB0byBzY3JlZW5zaG90IHRoZSBjdXJyZW50IChub3QgeWV0IGRyYWdnaW5nKSBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gSXQgYWxzbyBuZWF0bHkgYXZvaWRzIGEgc2l0dWF0aW9uIHdoZXJlIHJlbmRlcigpIHJldHVybnMgbnVsbFxuICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgc2FtZSB0aWNrIGZvciB0aGUgc291cmNlIGVsZW1lbnQsIGFuZCBicm93c2VyIGZyZWFrcyBvdXQuXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PnRoaXMuYWN0aW9ucy5wdWJsaXNoRHJhZ1NvdXJjZSgpXG4gICAgICAgICAgICAgICAgICAgICwgMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgdXNlciBtYXkgd2FudCB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yLCBlLmcuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIHdvcmsgYXJvdW5kIElFIG5vdCBzdXBwb3J0aW5nIGN1c3RvbSBkcmFnIHByZXZpZXdzLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIGEgY3VzdG9tIGRyYWcgbGF5ZXIsIHRoZSBvbmx5IHdheSB0byBwcmV2ZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IGRyYWcgcHJldmlldyBmcm9tIGRyYXdpbmcgaW4gSUUgaXMgdG8gc2NyZWVuc2hvdFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZHJhZ2dpbmcgc3RhdGUgaW4gd2hpY2ggdGhlIG5vZGUgaXRzZWxmIGhhcyB6ZXJvIG9wYWNpdHlcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGhlaWdodC4gSW4gdGhpcyBjYXNlLCB0aG91Z2gsIHJldHVybmluZyBudWxsIGZyb20gcmVuZGVyKClcbiAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBhYnJ1cHRseSBlbmQgdGhlIGRyYWdnaW5nLCB3aGljaCBpcyBub3Qgb2J2aW91cy5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcmVhc29uIHN1Y2ggYmVoYXZpb3IgaXMgc3RyaWN0bHkgb3B0LWluLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMucHVibGlzaERyYWdTb3VyY2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5hdGl2ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyBBIG5hdGl2ZSBpdGVtIChzdWNoIGFzIFVSTCkgZHJhZ2dlZCBmcm9tIGluc2lkZSB0aGUgZG9jdW1lbnRcbiAgICAgICAgICAgICAgICB0aGlzLmJlZ2luRHJhZ05hdGl2ZUl0ZW0obmF0aXZlVHlwZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUcmFuc2ZlciAmJiAhZGF0YVRyYW5zZmVyLnR5cGVzICYmIChlLnRhcmdldCAmJiAhZS50YXJnZXQuaGFzQXR0cmlidXRlIHx8ICFlLnRhcmdldC5oYXNBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpKSkge1xuICAgICAgICAgICAgICAgIC8vIExvb2tzIGxpa2UgYSBTYWZhcmkgYnVnOiBkYXRhVHJhbnNmZXIudHlwZXMgaXMgbnVsbCwgYnV0IHRoZXJlIHdhcyBubyBkcmFnZ2FibGUuXG4gICAgICAgICAgICAgICAgLy8gSnVzdCBsZXQgaXQgZHJhZy4gSXQncyBhIG5hdGl2ZSB0eXBlIChVUkwgb3IgdGV4dCkgYW5kIHdpbGwgYmUgcGlja2VkIHVwIGluXG4gICAgICAgICAgICAgICAgLy8gZHJhZ2VudGVyIGhhbmRsZXIuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBieSB0aGlzIHRpbWUgbm8gZHJhZyBzb3VyY2UgcmVhY3RlZCwgdGVsbCBicm93c2VyIG5vdCB0byBkcmFnLlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3BEcmFnRW5kQ2FwdHVyZSA9ICgpPT57XG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhckN1cnJlbnREcmFnU291cmNlTm9kZSgpICYmIHRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGNhbiBkaXNwYXRjaCB0aGlzIGV2ZW50IGluIGFuIGluZmluaXRlIGxvb3BcbiAgICAgICAgICAgICAgICAvLyBpZiBkcmFnZW5kIGhhbmRsZXIgZG9lcyBzb21ldGhpbmcgbGlrZSBzaG93aW5nIGFuIGFsZXJ0LlxuICAgICAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VlZCBpZiB3ZSBoYXZlIG5vdCBoYW5kbGVkIGl0IGFscmVhZHkuXG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmVuZERyYWcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FuY2VsSG92ZXIoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3BEcmFnRW50ZXJDYXB0dXJlID0gKGUpPT57XG4gICAgICAgICAgICB0aGlzLmRyYWdFbnRlclRhcmdldElkcyA9IFtdO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZ05hdGl2ZUl0ZW0oKSkge1xuICAgICAgICAgICAgICAgIHZhciByZWY7XG4gICAgICAgICAgICAgICAgKHJlZiA9IHRoaXMuY3VycmVudE5hdGl2ZVNvdXJjZSkgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYubG9hZERhdGFUcmFuc2ZlcihlLmRhdGFUcmFuc2Zlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc0ZpcnN0RW50ZXIgPSB0aGlzLmVudGVyTGVhdmVDb3VudGVyLmVudGVyKGUudGFyZ2V0KTtcbiAgICAgICAgICAgIGlmICghaXNGaXJzdEVudGVyIHx8IHRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGRhdGFUcmFuc2ZlciAgfSA9IGU7XG4gICAgICAgICAgICBjb25zdCBuYXRpdmVUeXBlID0gbWF0Y2hOYXRpdmVJdGVtVHlwZShkYXRhVHJhbnNmZXIpO1xuICAgICAgICAgICAgaWYgKG5hdGl2ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyBBIG5hdGl2ZSBpdGVtIChzdWNoIGFzIGZpbGUgb3IgVVJMKSBkcmFnZ2VkIGZyb20gb3V0c2lkZSB0aGUgZG9jdW1lbnRcbiAgICAgICAgICAgICAgICB0aGlzLmJlZ2luRHJhZ05hdGl2ZUl0ZW0obmF0aXZlVHlwZSwgZGF0YVRyYW5zZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3BEcmFnRW50ZXIgPSAoZSk9PntcbiAgICAgICAgICAgIGNvbnN0IHsgZHJhZ0VudGVyVGFyZ2V0SWRzICB9ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VudGVyVGFyZ2V0SWRzID0gW107XG4gICAgICAgICAgICBpZiAoIXRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGEgbmF0aXZlIGl0ZW0gdHlwZSB3ZSBkb24ndCB1bmRlcnN0YW5kLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWx0S2V5UHJlc3NlZCA9IGUuYWx0S2V5O1xuICAgICAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBjaGFuZ2VzIHBvc2l0aW9uIGFzIHRoZSByZXN1bHQgb2YgYGRyYWdlbnRlcmAsIGBkcmFnb3ZlcmAgbWlnaHQgc3RpbGxcbiAgICAgICAgICAgIC8vIGdldCBkaXNwYXRjaGVkIGRlc3BpdGUgdGFyZ2V0IGJlaW5nIG5vIGxvbmdlciB0aGVyZS4gVGhlIGVhc3kgc29sdXRpb24gaXMgdG8gY2hlY2tcbiAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlcmUgYWN0dWFsbHkgaXMgYSB0YXJnZXQgYmVmb3JlIGZpcmluZyBgaG92ZXJgLlxuICAgICAgICAgICAgaWYgKGRyYWdFbnRlclRhcmdldElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmhvdmVyKGRyYWdFbnRlclRhcmdldElkcywge1xuICAgICAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXQ6IGdldEV2ZW50Q2xpZW50T2Zmc2V0KGUpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjYW5Ecm9wID0gZHJhZ0VudGVyVGFyZ2V0SWRzLnNvbWUoKHRhcmdldElkKT0+dGhpcy5tb25pdG9yLmNhbkRyb3BPblRhcmdldCh0YXJnZXRJZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY2FuRHJvcCkge1xuICAgICAgICAgICAgICAgIC8vIElFIHJlcXVpcmVzIHRoaXMgdG8gZmlyZSBkcmFnb3ZlciBldmVudHNcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGUuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSB0aGlzLmdldEN1cnJlbnREcm9wRWZmZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdPdmVyQ2FwdHVyZSA9IChlKT0+e1xuICAgICAgICAgICAgdGhpcy5kcmFnT3ZlclRhcmdldElkcyA9IFtdO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZ05hdGl2ZUl0ZW0oKSkge1xuICAgICAgICAgICAgICAgIHZhciByZWY7XG4gICAgICAgICAgICAgICAgKHJlZiA9IHRoaXMuY3VycmVudE5hdGl2ZVNvdXJjZSkgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYubG9hZERhdGFUcmFuc2ZlcihlLmRhdGFUcmFuc2Zlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJhZ092ZXIgPSAoZSk9PntcbiAgICAgICAgICAgIGNvbnN0IHsgZHJhZ092ZXJUYXJnZXRJZHMgIH0gPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5kcmFnT3ZlclRhcmdldElkcyA9IFtdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1vbml0b3IuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSBhIG5hdGl2ZSBpdGVtIHR5cGUgd2UgZG9uJ3QgdW5kZXJzdGFuZC5cbiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGRlZmF1bHQgXCJkcm9wIGFuZCBibG93IGF3YXkgdGhlIHdob2xlIGRvY3VtZW50XCIgYWN0aW9uLlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hbHRLZXlQcmVzc2VkID0gZS5hbHRLZXk7XG4gICAgICAgICAgICB0aGlzLmxhc3RDbGllbnRPZmZzZXQgPSBnZXRFdmVudENsaWVudE9mZnNldChlKTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVIb3ZlcihkcmFnT3ZlclRhcmdldElkcyk7XG4gICAgICAgICAgICBjb25zdCBjYW5Ecm9wID0gKGRyYWdPdmVyVGFyZ2V0SWRzIHx8IFtdKS5zb21lKCh0YXJnZXRJZCk9PnRoaXMubW9uaXRvci5jYW5Ecm9wT25UYXJnZXQodGFyZ2V0SWQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNhbkRyb3ApIHtcbiAgICAgICAgICAgICAgICAvLyBTaG93IHVzZXItc3BlY2lmaWVkIGRyb3AgZWZmZWN0LlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IHRoaXMuZ2V0Q3VycmVudERyb3BFZmZlY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNEcmFnZ2luZ05hdGl2ZUl0ZW0oKSkge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IHNob3cgYSBuaWNlIGN1cnNvciBidXQgc3RpbGwgcHJldmVudCBkZWZhdWx0XG4gICAgICAgICAgICAgICAgLy8gXCJkcm9wIGFuZCBibG93IGF3YXkgdGhlIHdob2xlIGRvY3VtZW50XCIgYWN0aW9uLlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlcikge1xuICAgICAgICAgICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3BEcmFnTGVhdmVDYXB0dXJlID0gKGUpPT57XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXNMYXN0TGVhdmUgPSB0aGlzLmVudGVyTGVhdmVDb3VudGVyLmxlYXZlKGUudGFyZ2V0KTtcbiAgICAgICAgICAgIGlmICghaXNMYXN0TGVhdmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKT0+dGhpcy5lbmREcmFnTmF0aXZlSXRlbSgpXG4gICAgICAgICAgICAgICAgLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FuY2VsSG92ZXIoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3BEcm9wQ2FwdHVyZSA9IChlKT0+e1xuICAgICAgICAgICAgdGhpcy5kcm9wVGFyZ2V0SWRzID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgKHJlZiA9IHRoaXMuY3VycmVudE5hdGl2ZVNvdXJjZSkgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYubG9hZERhdGFUcmFuc2ZlcihlLmRhdGFUcmFuc2Zlcik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoTmF0aXZlSXRlbVR5cGUoZS5kYXRhVHJhbnNmZXIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRHJhZ2dpbmcgc29tZSBlbGVtZW50cywgbGlrZSA8YT4gYW5kIDxpbWc+IG1heSBzdGlsbCBiZWhhdmUgbGlrZSBhIG5hdGl2ZSBkcmFnIGV2ZW50LFxuICAgICAgICAgICAgICAgIC8vIGV2ZW4gaWYgdGhlIGN1cnJlbnQgZHJhZyBldmVudCBtYXRjaGVzIGEgdXNlci1kZWZpbmVkIHR5cGUuXG4gICAgICAgICAgICAgICAgLy8gU3RvcCB0aGUgZGVmYXVsdCBiZWhhdmlvciB3aGVuIHdlJ3JlIG5vdCBleHBlY3RpbmcgYSBuYXRpdmUgaXRlbSB0byBiZSBkcm9wcGVkLlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW50ZXJMZWF2ZUNvdW50ZXIucmVzZXQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3BEcm9wID0gKGUpPT57XG4gICAgICAgICAgICBjb25zdCB7IGRyb3BUYXJnZXRJZHMgIH0gPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5kcm9wVGFyZ2V0SWRzID0gW107XG4gICAgICAgICAgICB0aGlzLmFjdGlvbnMuaG92ZXIoZHJvcFRhcmdldElkcywge1xuICAgICAgICAgICAgICAgIGNsaWVudE9mZnNldDogZ2V0RXZlbnRDbGllbnRPZmZzZXQoZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmRyb3Aoe1xuICAgICAgICAgICAgICAgIGRyb3BFZmZlY3Q6IHRoaXMuZ2V0Q3VycmVudERyb3BFZmZlY3QoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmREcmFnTmF0aXZlSXRlbSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vbml0b3IuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmVuZERyYWcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FuY2VsSG92ZXIoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3RTdGFydCA9IChlKT0+e1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAvLyBPbmx5IElFIHJlcXVpcmVzIHVzIHRvIGV4cGxpY2l0bHkgc2F5XG4gICAgICAgICAgICAvLyB3ZSB3YW50IGRyYWcgZHJvcCBvcGVyYXRpb24gdG8gc3RhcnRcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LmRyYWdEcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW5wdXRzIGFuZCB0ZXh0YXJlYXMgc2hvdWxkIGJlIHNlbGVjdGFibGVcbiAgICAgICAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1NFTEVDVCcgfHwgdGFyZ2V0LnRhZ05hbWUgPT09ICdURVhUQVJFQScgfHwgdGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9yIG90aGVyIHRhcmdldHMsIGFzayBJRVxuICAgICAgICAgICAgLy8gdG8gZW5hYmxlIGRyYWcgYW5kIGRyb3BcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRhcmdldC5kcmFnRHJvcCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBuZXcgT3B0aW9uc1JlYWRlcihnbG9iYWxDb250ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5hY3Rpb25zID0gbWFuYWdlci5nZXRBY3Rpb25zKCk7XG4gICAgICAgIHRoaXMubW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvcigpO1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5ID0gbWFuYWdlci5nZXRSZWdpc3RyeSgpO1xuICAgICAgICB0aGlzLmVudGVyTGVhdmVDb3VudGVyID0gbmV3IEVudGVyTGVhdmVDb3VudGVyKHRoaXMuaXNOb2RlSW5Eb2N1bWVudCk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1IVE1MNUJhY2tlbmRJbXBsLmpzLm1hcCIsImV4cG9ydCBjbGFzcyBNb25vdG9uaWNJbnRlcnBvbGFudCB7XG4gICAgaW50ZXJwb2xhdGUoeCkge1xuICAgICAgICBjb25zdCB7IHhzICwgeXMgLCBjMXMgLCBjMnMgLCBjM3MgIH0gPSB0aGlzO1xuICAgICAgICAvLyBUaGUgcmlnaHRtb3N0IHBvaW50IGluIHRoZSBkYXRhc2V0IHNob3VsZCBnaXZlIGFuIGV4YWN0IHJlc3VsdFxuICAgICAgICBsZXQgaSA9IHhzLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmICh4ID09PSB4c1tpXSkge1xuICAgICAgICAgICAgcmV0dXJuIHlzW2ldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGludGVydmFsIHggaXMgaW4sIHJldHVybmluZyB0aGUgY29ycmVzcG9uZGluZyB5IGlmIHggaXMgb25lIG9mIHRoZSBvcmlnaW5hbCB4c1xuICAgICAgICBsZXQgbG93ID0gMDtcbiAgICAgICAgbGV0IGhpZ2ggPSBjM3MubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IG1pZDtcbiAgICAgICAgd2hpbGUobG93IDw9IGhpZ2gpe1xuICAgICAgICAgICAgbWlkID0gTWF0aC5mbG9vcigwLjUgKiAobG93ICsgaGlnaCkpO1xuICAgICAgICAgICAgY29uc3QgeEhlcmUgPSB4c1ttaWRdO1xuICAgICAgICAgICAgaWYgKHhIZXJlIDwgeCkge1xuICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHhIZXJlID4geCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geXNbbWlkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpID0gTWF0aC5tYXgoMCwgaGlnaCk7XG4gICAgICAgIC8vIEludGVycG9sYXRlXG4gICAgICAgIGNvbnN0IGRpZmYgPSB4IC0geHNbaV07XG4gICAgICAgIGNvbnN0IGRpZmZTcSA9IGRpZmYgKiBkaWZmO1xuICAgICAgICByZXR1cm4geXNbaV0gKyBjMXNbaV0gKiBkaWZmICsgYzJzW2ldICogZGlmZlNxICsgYzNzW2ldICogZGlmZiAqIGRpZmZTcTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoeHMsIHlzKXtcbiAgICAgICAgY29uc3QgeyBsZW5ndGggIH0gPSB4cztcbiAgICAgICAgLy8gUmVhcnJhbmdlIHhzIGFuZCB5cyBzbyB0aGF0IHhzIGlzIHNvcnRlZFxuICAgICAgICBjb25zdCBpbmRleGVzID0gW107XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXhlcy5zb3J0KChhLCBiKT0+eHNbYV0gPCB4c1tiXSA/IC0xIDogMVxuICAgICAgICApO1xuICAgICAgICAvLyBHZXQgY29uc2VjdXRpdmUgZGlmZmVyZW5jZXMgYW5kIHNsb3Blc1xuICAgICAgICBjb25zdCBkeXMgPSBbXTtcbiAgICAgICAgY29uc3QgZHhzID0gW107XG4gICAgICAgIGNvbnN0IG1zID0gW107XG4gICAgICAgIGxldCBkeDtcbiAgICAgICAgbGV0IGR5O1xuICAgICAgICBmb3IobGV0IGkxID0gMDsgaTEgPCBsZW5ndGggLSAxOyBpMSsrKXtcbiAgICAgICAgICAgIGR4ID0geHNbaTEgKyAxXSAtIHhzW2kxXTtcbiAgICAgICAgICAgIGR5ID0geXNbaTEgKyAxXSAtIHlzW2kxXTtcbiAgICAgICAgICAgIGR4cy5wdXNoKGR4KTtcbiAgICAgICAgICAgIGR5cy5wdXNoKGR5KTtcbiAgICAgICAgICAgIG1zLnB1c2goZHkgLyBkeCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2V0IGRlZ3JlZS0xIGNvZWZmaWNpZW50c1xuICAgICAgICBjb25zdCBjMXMgPSBbXG4gICAgICAgICAgICBtc1swXVxuICAgICAgICBdO1xuICAgICAgICBmb3IobGV0IGkyID0gMDsgaTIgPCBkeHMubGVuZ3RoIC0gMTsgaTIrKyl7XG4gICAgICAgICAgICBjb25zdCBtMiA9IG1zW2kyXTtcbiAgICAgICAgICAgIGNvbnN0IG1OZXh0ID0gbXNbaTIgKyAxXTtcbiAgICAgICAgICAgIGlmIChtMiAqIG1OZXh0IDw9IDApIHtcbiAgICAgICAgICAgICAgICBjMXMucHVzaCgwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHggPSBkeHNbaTJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGR4TmV4dCA9IGR4c1tpMiArIDFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1vbiA9IGR4ICsgZHhOZXh0O1xuICAgICAgICAgICAgICAgIGMxcy5wdXNoKDMgKiBjb21tb24gLyAoKGNvbW1vbiArIGR4TmV4dCkgLyBtMiArIChjb21tb24gKyBkeCkgLyBtTmV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGMxcy5wdXNoKG1zW21zLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgLy8gR2V0IGRlZ3JlZS0yIGFuZCBkZWdyZWUtMyBjb2VmZmljaWVudHNcbiAgICAgICAgY29uc3QgYzJzID0gW107XG4gICAgICAgIGNvbnN0IGMzcyA9IFtdO1xuICAgICAgICBsZXQgbTtcbiAgICAgICAgZm9yKGxldCBpMyA9IDA7IGkzIDwgYzFzLmxlbmd0aCAtIDE7IGkzKyspe1xuICAgICAgICAgICAgbSA9IG1zW2kzXTtcbiAgICAgICAgICAgIGNvbnN0IGMxID0gYzFzW2kzXTtcbiAgICAgICAgICAgIGNvbnN0IGludkR4ID0gMSAvIGR4c1tpM107XG4gICAgICAgICAgICBjb25zdCBjb21tb24gPSBjMSArIGMxc1tpMyArIDFdIC0gbSAtIG07XG4gICAgICAgICAgICBjMnMucHVzaCgobSAtIGMxIC0gY29tbW9uKSAqIGludkR4KTtcbiAgICAgICAgICAgIGMzcy5wdXNoKGNvbW1vbiAqIGludkR4ICogaW52RHgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMueHMgPSB4cztcbiAgICAgICAgdGhpcy55cyA9IHlzO1xuICAgICAgICB0aGlzLmMxcyA9IGMxcztcbiAgICAgICAgdGhpcy5jMnMgPSBjMnM7XG4gICAgICAgIHRoaXMuYzNzID0gYzNzO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW9ub3RvbmljSW50ZXJwb2xhbnQuanMubWFwIiwiZXhwb3J0IGNsYXNzIE5hdGl2ZURyYWdTb3VyY2Uge1xuICAgIGluaXRpYWxpemVFeHBvc2VkUHJvcGVydGllcygpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5jb25maWcuZXhwb3NlUHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHkpPT57XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5pdGVtLCBwcm9wZXJ0eSwge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQnJvd3NlciBkb2Vzbid0IGFsbG93IHJlYWRpbmcgXCIke3Byb3BlcnR5fVwiIHVudGlsIHRoZSBkcm9wIGV2ZW50LmApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxvYWREYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIGlmIChkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Byb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmV4cG9zZVByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5KT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5Rm4gPSB0aGlzLmNvbmZpZy5leHBvc2VQcm9wZXJ0aWVzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlGbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXNbcHJvcGVydHldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHByb3BlcnR5Rm4oZGF0YVRyYW5zZmVyLCB0aGlzLmNvbmZpZy5tYXRjaGVzVHlwZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcy5pdGVtLCBuZXdQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYW5EcmFnKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYmVnaW5EcmFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtO1xuICAgIH1cbiAgICBpc0RyYWdnaW5nKG1vbml0b3IsIGhhbmRsZSkge1xuICAgICAgICByZXR1cm4gaGFuZGxlID09PSBtb25pdG9yLmdldFNvdXJjZUlkKCk7XG4gICAgfVxuICAgIGVuZERyYWcoKSB7XG4gICAgLy8gZW1wdHlcbiAgICB9XG4gICAgY29uc3RydWN0b3IoY29uZmlnKXtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuaXRlbSA9IHt9O1xuICAgICAgICB0aGlzLmluaXRpYWxpemVFeHBvc2VkUHJvcGVydGllcygpO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmF0aXZlRHJhZ1NvdXJjZS5qcy5tYXAiLCJleHBvcnQgZnVuY3Rpb24gZ2V0RGF0YUZyb21EYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyLCB0eXBlc1RvVHJ5LCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0eXBlc1RvVHJ5LnJlZHVjZSgocmVzdWx0U29GYXIsIHR5cGVUb1RyeSk9PnJlc3VsdFNvRmFyIHx8IGRhdGFUcmFuc2Zlci5nZXREYXRhKHR5cGVUb1RyeSlcbiAgICAsICcnKTtcbiAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiBkZWZhdWx0VmFsdWU7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldERhdGFGcm9tRGF0YVRyYW5zZmVyLmpzLm1hcCIsImltcG9ydCB7IE5hdGl2ZURyYWdTb3VyY2UgfSBmcm9tICcuL05hdGl2ZURyYWdTb3VyY2UuanMnO1xuaW1wb3J0IHsgbmF0aXZlVHlwZXNDb25maWcgfSBmcm9tICcuL25hdGl2ZVR5cGVzQ29uZmlnLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOYXRpdmVEcmFnU291cmNlKHR5cGUsIGRhdGFUcmFuc2Zlcikge1xuICAgIGNvbnN0IGNvbmZpZyA9IG5hdGl2ZVR5cGVzQ29uZmlnW3R5cGVdO1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgbmF0aXZlIHR5cGUgJHt0eXBlfSBoYXMgbm8gY29uZmlndXJhdGlvbmApO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTmF0aXZlRHJhZ1NvdXJjZShjb25maWcpO1xuICAgIHJlc3VsdC5sb2FkRGF0YVRyYW5zZmVyKGRhdGFUcmFuc2Zlcik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaE5hdGl2ZUl0ZW1UeXBlKGRhdGFUcmFuc2Zlcikge1xuICAgIGlmICghZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBkYXRhVHJhbnNmZXJUeXBlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRhdGFUcmFuc2Zlci50eXBlcyB8fCBbXSk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG5hdGl2ZVR5cGVzQ29uZmlnKS5maWx0ZXIoKG5hdGl2ZUl0ZW1UeXBlKT0+e1xuICAgICAgICBjb25zdCB0eXBlQ29uZmlnID0gbmF0aXZlVHlwZXNDb25maWdbbmF0aXZlSXRlbVR5cGVdO1xuICAgICAgICBpZiAoISh0eXBlQ29uZmlnID09PSBudWxsIHx8IHR5cGVDb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHR5cGVDb25maWcubWF0Y2hlc1R5cGVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlQ29uZmlnLm1hdGNoZXNUeXBlcy5zb21lKCh0KT0+ZGF0YVRyYW5zZmVyVHlwZXMuaW5kZXhPZih0KSA+IC0xXG4gICAgICAgICk7XG4gICAgfSlbMF0gfHwgbnVsbDtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0ICogYXMgTmF0aXZlVHlwZXMgZnJvbSAnLi4vTmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0RGF0YUZyb21EYXRhVHJhbnNmZXIgfSBmcm9tICcuL2dldERhdGFGcm9tRGF0YVRyYW5zZmVyLmpzJztcbmV4cG9ydCBjb25zdCBuYXRpdmVUeXBlc0NvbmZpZyA9IHtcbiAgICBbTmF0aXZlVHlwZXMuRklMRV06IHtcbiAgICAgICAgZXhwb3NlUHJvcGVydGllczoge1xuICAgICAgICAgICAgZmlsZXM6IChkYXRhVHJhbnNmZXIpPT5BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkYXRhVHJhbnNmZXIuZmlsZXMpXG4gICAgICAgICAgICAsXG4gICAgICAgICAgICBpdGVtczogKGRhdGFUcmFuc2Zlcik9PmRhdGFUcmFuc2Zlci5pdGVtc1xuICAgICAgICAgICAgLFxuICAgICAgICAgICAgZGF0YVRyYW5zZmVyOiAoZGF0YVRyYW5zZmVyKT0+ZGF0YVRyYW5zZmVyXG4gICAgICAgIH0sXG4gICAgICAgIG1hdGNoZXNUeXBlczogW1xuICAgICAgICAgICAgJ0ZpbGVzJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBbTmF0aXZlVHlwZXMuSFRNTF06IHtcbiAgICAgICAgZXhwb3NlUHJvcGVydGllczoge1xuICAgICAgICAgICAgaHRtbDogKGRhdGFUcmFuc2ZlciwgbWF0Y2hlc1R5cGVzKT0+Z2V0RGF0YUZyb21EYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyLCBtYXRjaGVzVHlwZXMsICcnKVxuICAgICAgICAgICAgLFxuICAgICAgICAgICAgZGF0YVRyYW5zZmVyOiAoZGF0YVRyYW5zZmVyKT0+ZGF0YVRyYW5zZmVyXG4gICAgICAgIH0sXG4gICAgICAgIG1hdGNoZXNUeXBlczogW1xuICAgICAgICAgICAgJ0h0bWwnLFxuICAgICAgICAgICAgJ3RleHQvaHRtbCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgW05hdGl2ZVR5cGVzLlVSTF06IHtcbiAgICAgICAgZXhwb3NlUHJvcGVydGllczoge1xuICAgICAgICAgICAgdXJsczogKGRhdGFUcmFuc2ZlciwgbWF0Y2hlc1R5cGVzKT0+Z2V0RGF0YUZyb21EYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyLCBtYXRjaGVzVHlwZXMsICcnKS5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgICxcbiAgICAgICAgICAgIGRhdGFUcmFuc2ZlcjogKGRhdGFUcmFuc2Zlcik9PmRhdGFUcmFuc2ZlclxuICAgICAgICB9LFxuICAgICAgICBtYXRjaGVzVHlwZXM6IFtcbiAgICAgICAgICAgICdVcmwnLFxuICAgICAgICAgICAgJ3RleHQvdXJpLWxpc3QnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIFtOYXRpdmVUeXBlcy5URVhUXToge1xuICAgICAgICBleHBvc2VQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB0ZXh0OiAoZGF0YVRyYW5zZmVyLCBtYXRjaGVzVHlwZXMpPT5nZXREYXRhRnJvbURhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXIsIG1hdGNoZXNUeXBlcywgJycpXG4gICAgICAgICAgICAsXG4gICAgICAgICAgICBkYXRhVHJhbnNmZXI6IChkYXRhVHJhbnNmZXIpPT5kYXRhVHJhbnNmZXJcbiAgICAgICAgfSxcbiAgICAgICAgbWF0Y2hlc1R5cGVzOiBbXG4gICAgICAgICAgICAnVGV4dCcsXG4gICAgICAgICAgICAndGV4dC9wbGFpbidcbiAgICAgICAgXVxuICAgIH1cbn07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5hdGl2ZVR5cGVzQ29uZmlnLmpzLm1hcCIsImV4cG9ydCBjb25zdCBGSUxFID0gJ19fTkFUSVZFX0ZJTEVfXyc7XG5leHBvcnQgY29uc3QgVVJMID0gJ19fTkFUSVZFX1VSTF9fJztcbmV4cG9ydCBjb25zdCBURVhUID0gJ19fTkFUSVZFX1RFWFRfXyc7XG5leHBvcnQgY29uc3QgSFRNTCA9ICdfX05BVElWRV9IVE1MX18nO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYXRpdmVUeXBlcy5qcy5tYXAiLCJpbXBvcnQgeyBpc0ZpcmVmb3gsIGlzU2FmYXJpIH0gZnJvbSAnLi9Ccm93c2VyRGV0ZWN0b3IuanMnO1xuaW1wb3J0IHsgTW9ub3RvbmljSW50ZXJwb2xhbnQgfSBmcm9tICcuL01vbm90b25pY0ludGVycG9sYW50LmpzJztcbmNvbnN0IEVMRU1FTlRfTk9ERSA9IDE7XG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZUNsaWVudE9mZnNldChub2RlKSB7XG4gICAgY29uc3QgZWwgPSBub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgPyBub2RlIDogbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHsgdG9wICwgbGVmdCAgfSA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGxlZnQsXG4gICAgICAgIHk6IHRvcFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRDbGllbnRPZmZzZXQoZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGUuY2xpZW50WCxcbiAgICAgICAgeTogZS5jbGllbnRZXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGlzSW1hZ2VOb2RlKG5vZGUpIHtcbiAgICB2YXIgcmVmO1xuICAgIHJldHVybiBub2RlLm5vZGVOYW1lID09PSAnSU1HJyAmJiAoaXNGaXJlZm94KCkgfHwgISgocmVmID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5jb250YWlucyhub2RlKSkpO1xufVxuZnVuY3Rpb24gZ2V0RHJhZ1ByZXZpZXdTaXplKGlzSW1hZ2UsIGRyYWdQcmV2aWV3LCBzb3VyY2VXaWR0aCwgc291cmNlSGVpZ2h0KSB7XG4gICAgbGV0IGRyYWdQcmV2aWV3V2lkdGggPSBpc0ltYWdlID8gZHJhZ1ByZXZpZXcud2lkdGggOiBzb3VyY2VXaWR0aDtcbiAgICBsZXQgZHJhZ1ByZXZpZXdIZWlnaHQgPSBpc0ltYWdlID8gZHJhZ1ByZXZpZXcuaGVpZ2h0IDogc291cmNlSGVpZ2h0O1xuICAgIC8vIFdvcmsgYXJvdW5kIEAyeCBjb29yZGluYXRlIGRpc2NyZXBhbmNpZXMgaW4gYnJvd3NlcnNcbiAgICBpZiAoaXNTYWZhcmkoKSAmJiBpc0ltYWdlKSB7XG4gICAgICAgIGRyYWdQcmV2aWV3SGVpZ2h0IC89IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICBkcmFnUHJldmlld1dpZHRoIC89IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBkcmFnUHJldmlld1dpZHRoLFxuICAgICAgICBkcmFnUHJldmlld0hlaWdodFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RHJhZ1ByZXZpZXdPZmZzZXQoc291cmNlTm9kZSwgZHJhZ1ByZXZpZXcsIGNsaWVudE9mZnNldCwgYW5jaG9yUG9pbnQsIG9mZnNldFBvaW50KSB7XG4gICAgLy8gVGhlIGJyb3dzZXJzIHdpbGwgdXNlIHRoZSBpbWFnZSBpbnRyaW5zaWMgc2l6ZSB1bmRlciBkaWZmZXJlbnQgY29uZGl0aW9ucy5cbiAgICAvLyBGaXJlZm94IG9ubHkgY2FyZXMgaWYgaXQncyBhbiBpbWFnZSwgYnV0IFdlYktpdCBhbHNvIHdhbnRzIGl0IHRvIGJlIGRldGFjaGVkLlxuICAgIGNvbnN0IGlzSW1hZ2UgPSBpc0ltYWdlTm9kZShkcmFnUHJldmlldyk7XG4gICAgY29uc3QgZHJhZ1ByZXZpZXdOb2RlID0gaXNJbWFnZSA/IHNvdXJjZU5vZGUgOiBkcmFnUHJldmlldztcbiAgICBjb25zdCBkcmFnUHJldmlld05vZGVPZmZzZXRGcm9tQ2xpZW50ID0gZ2V0Tm9kZUNsaWVudE9mZnNldChkcmFnUHJldmlld05vZGUpO1xuICAgIGNvbnN0IG9mZnNldEZyb21EcmFnUHJldmlldyA9IHtcbiAgICAgICAgeDogY2xpZW50T2Zmc2V0LnggLSBkcmFnUHJldmlld05vZGVPZmZzZXRGcm9tQ2xpZW50LngsXG4gICAgICAgIHk6IGNsaWVudE9mZnNldC55IC0gZHJhZ1ByZXZpZXdOb2RlT2Zmc2V0RnJvbUNsaWVudC55XG4gICAgfTtcbiAgICBjb25zdCB7IG9mZnNldFdpZHRoOiBzb3VyY2VXaWR0aCAsIG9mZnNldEhlaWdodDogc291cmNlSGVpZ2h0ICB9ID0gc291cmNlTm9kZTtcbiAgICBjb25zdCB7IGFuY2hvclggLCBhbmNob3JZICB9ID0gYW5jaG9yUG9pbnQ7XG4gICAgY29uc3QgeyBkcmFnUHJldmlld1dpZHRoICwgZHJhZ1ByZXZpZXdIZWlnaHQgIH0gPSBnZXREcmFnUHJldmlld1NpemUoaXNJbWFnZSwgZHJhZ1ByZXZpZXcsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQpO1xuICAgIGNvbnN0IGNhbGN1bGF0ZVlPZmZzZXQgPSAoKT0+e1xuICAgICAgICBjb25zdCBpbnRlcnBvbGFudFkgPSBuZXcgTW9ub3RvbmljSW50ZXJwb2xhbnQoW1xuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAuNSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgXSwgW1xuICAgICAgICAgICAgLy8gRG9jayB0byB0aGUgdG9wXG4gICAgICAgICAgICBvZmZzZXRGcm9tRHJhZ1ByZXZpZXcueSxcbiAgICAgICAgICAgIC8vIEFsaWduIGF0IHRoZSBjZW50ZXJcbiAgICAgICAgICAgIChvZmZzZXRGcm9tRHJhZ1ByZXZpZXcueSAvIHNvdXJjZUhlaWdodCkgKiBkcmFnUHJldmlld0hlaWdodCxcbiAgICAgICAgICAgIC8vIERvY2sgdG8gdGhlIGJvdHRvbVxuICAgICAgICAgICAgb2Zmc2V0RnJvbURyYWdQcmV2aWV3LnkgKyBkcmFnUHJldmlld0hlaWdodCAtIHNvdXJjZUhlaWdodCwgXG4gICAgICAgIF0pO1xuICAgICAgICBsZXQgeSA9IGludGVycG9sYW50WS5pbnRlcnBvbGF0ZShhbmNob3JZKTtcbiAgICAgICAgLy8gV29yayBhcm91bmQgU2FmYXJpIDggcG9zaXRpb25pbmcgYnVnXG4gICAgICAgIGlmIChpc1NhZmFyaSgpICYmIGlzSW1hZ2UpIHtcbiAgICAgICAgICAgIC8vIFdlJ2xsIGhhdmUgdG8gd2FpdCBmb3IgQDN4IHRvIHNlZSBpZiB0aGlzIGlzIGVudGlyZWx5IGNvcnJlY3RcbiAgICAgICAgICAgIHkgKz0gKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIC0gMSkgKiBkcmFnUHJldmlld0hlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geTtcbiAgICB9O1xuICAgIGNvbnN0IGNhbGN1bGF0ZVhPZmZzZXQgPSAoKT0+e1xuICAgICAgICAvLyBJbnRlcnBvbGF0ZSBjb29yZGluYXRlcyBkZXBlbmRpbmcgb24gYW5jaG9yIHBvaW50XG4gICAgICAgIC8vIElmIHlvdSBrbm93IGEgc2ltcGxlciB3YXkgdG8gZG8gdGhpcywgbGV0IG1lIGtub3dcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhbnRYID0gbmV3IE1vbm90b25pY0ludGVycG9sYW50KFtcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLjUsXG4gICAgICAgICAgICAxXG4gICAgICAgIF0sIFtcbiAgICAgICAgICAgIC8vIERvY2sgdG8gdGhlIGxlZnRcbiAgICAgICAgICAgIG9mZnNldEZyb21EcmFnUHJldmlldy54LFxuICAgICAgICAgICAgLy8gQWxpZ24gYXQgdGhlIGNlbnRlclxuICAgICAgICAgICAgKG9mZnNldEZyb21EcmFnUHJldmlldy54IC8gc291cmNlV2lkdGgpICogZHJhZ1ByZXZpZXdXaWR0aCxcbiAgICAgICAgICAgIC8vIERvY2sgdG8gdGhlIHJpZ2h0XG4gICAgICAgICAgICBvZmZzZXRGcm9tRHJhZ1ByZXZpZXcueCArIGRyYWdQcmV2aWV3V2lkdGggLSBzb3VyY2VXaWR0aCwgXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gaW50ZXJwb2xhbnRYLmludGVycG9sYXRlKGFuY2hvclgpO1xuICAgIH07XG4gICAgLy8gRm9yY2Ugb2Zmc2V0cyBpZiBzcGVjaWZpZWQgaW4gdGhlIG9wdGlvbnMuXG4gICAgY29uc3QgeyBvZmZzZXRYICwgb2Zmc2V0WSAgfSA9IG9mZnNldFBvaW50O1xuICAgIGNvbnN0IGlzTWFudWFsT2Zmc2V0WCA9IG9mZnNldFggPT09IDAgfHwgb2Zmc2V0WDtcbiAgICBjb25zdCBpc01hbnVhbE9mZnNldFkgPSBvZmZzZXRZID09PSAwIHx8IG9mZnNldFk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogaXNNYW51YWxPZmZzZXRYID8gb2Zmc2V0WCA6IGNhbGN1bGF0ZVhPZmZzZXQoKSxcbiAgICAgICAgeTogaXNNYW51YWxPZmZzZXRZID8gb2Zmc2V0WSA6IGNhbGN1bGF0ZVlPZmZzZXQoKVxuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9mZnNldFV0aWxzLmpzLm1hcCIsImV4cG9ydCBjbGFzcyBPcHRpb25zUmVhZGVyIHtcbiAgICBnZXQgd2luZG93KCkge1xuICAgICAgICBpZiAodGhpcy5nbG9iYWxDb250ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxDb250ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBkb2N1bWVudCgpIHtcbiAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgaWYgKChyZWYgPSB0aGlzLmdsb2JhbENvbnRleHQpID09PSBudWxsIHx8IHJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmLmRvY3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxDb250ZXh0LmRvY3VtZW50O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2luZG93KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53aW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgcmV0dXJuICgocmVmID0gdGhpcy5vcHRpb25zQXJncykgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYucm9vdEVsZW1lbnQpIHx8IHRoaXMud2luZG93O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihnbG9iYWxDb250ZXh0LCBvcHRpb25zKXtcbiAgICAgICAgdGhpcy5vd25lckRvY3VtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5nbG9iYWxDb250ZXh0ID0gZ2xvYmFsQ29udGV4dDtcbiAgICAgICAgdGhpcy5vcHRpb25zQXJncyA9IG9wdGlvbnM7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1PcHRpb25zUmVhZGVyLmpzLm1hcCIsImxldCBlbXB0eUltYWdlO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVtcHR5SW1hZ2UoKSB7XG4gICAgaWYgKCFlbXB0eUltYWdlKSB7XG4gICAgICAgIGVtcHR5SW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgZW1wdHlJbWFnZS5zcmMgPSAnZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT0nO1xuICAgIH1cbiAgICByZXR1cm4gZW1wdHlJbWFnZTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0RW1wdHlJbWFnZS5qcy5tYXAiLCJpbXBvcnQgeyBIVE1MNUJhY2tlbmRJbXBsIH0gZnJvbSAnLi9IVE1MNUJhY2tlbmRJbXBsLmpzJztcbmltcG9ydCAqIGFzIF9OYXRpdmVUeXBlcyBmcm9tICcuL05hdGl2ZVR5cGVzLmpzJztcbmV4cG9ydCB7IGdldEVtcHR5SW1hZ2UgfSBmcm9tICcuL2dldEVtcHR5SW1hZ2UuanMnO1xuZXhwb3J0IHsgX05hdGl2ZVR5cGVzIGFzIE5hdGl2ZVR5cGVzIH07XG5leHBvcnQgY29uc3QgSFRNTDVCYWNrZW5kID0gZnVuY3Rpb24gY3JlYXRlQmFja2VuZChtYW5hZ2VyLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBIVE1MNUJhY2tlbmRJbXBsKG1hbmFnZXIsIGNvbnRleHQsIG9wdGlvbnMpO1xufTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8gY2hlYXAgbG9kYXNoIHJlcGxhY2VtZW50c1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9pemUoZm4pIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBjb25zdCBtZW1vaXplZCA9ICgpPT57XG4gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZm4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIG1lbW9pemVkO1xufVxuLyoqXG4gKiBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBfLndpdGhvdXRcbiAqLyBleHBvcnQgZnVuY3Rpb24gd2l0aG91dChpdGVtcywgaXRlbSkge1xuICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGkpPT5pICE9PSBpdGVtXG4gICAgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bmlvbihpdGVtc0EsIGl0ZW1zQikge1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBpbnNlcnRJdGVtID0gKGl0ZW0pPT5zZXQuYWRkKGl0ZW0pXG4gICAgO1xuICAgIGl0ZW1zQS5mb3JFYWNoKGluc2VydEl0ZW0pO1xuICAgIGl0ZW1zQi5mb3JFYWNoKGluc2VydEl0ZW0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIHNldC5mb3JFYWNoKChrZXkpPT5yZXN1bHQucHVzaChrZXkpXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1qc191dGlscy5qcy5tYXAiLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBDcmVhdGUgdGhlIFJlYWN0IENvbnRleHRcbiAqLyBleHBvcnQgY29uc3QgRG5kQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoe1xuICAgIGRyYWdEcm9wTWFuYWdlcjogdW5kZWZpbmVkXG59KTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RG5kQ29udGV4dC5qcy5tYXAiLCJmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkge1xuICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICAgIHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTtcbiAgICB2YXIga2V5LCBpO1xuICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICAgIHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpO1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07XG4gICAgICAgICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgICB2YXIgdGFyZ2V0ID0ge307XG4gICAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgIHZhciBrZXksIGk7XG4gICAgZm9yKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgY3JlYXRlRHJhZ0Ryb3BNYW5hZ2VyIH0gZnJvbSAnZG5kLWNvcmUnO1xuaW1wb3J0IHsgbWVtbywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRG5kQ29udGV4dCB9IGZyb20gJy4vRG5kQ29udGV4dC5qcyc7XG5sZXQgcmVmQ291bnQgPSAwO1xuY29uc3QgSU5TVEFOQ0VfU1lNID0gU3ltYm9sLmZvcignX19SRUFDVF9ETkRfQ09OVEVYVF9JTlNUQU5DRV9fJyk7XG52YXIgRG5kUHJvdmlkZXIgPSAvKiNfX1BVUkVfXyovIG1lbW8oZnVuY3Rpb24gRG5kUHJvdmlkZXIoX3BhcmFtKSB7XG4gICAgdmFyIHsgY2hpbGRyZW4gIH0gPSBfcGFyYW0sIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wYXJhbSwgW1xuICAgICAgICBcImNoaWxkcmVuXCJcbiAgICBdKTtcbiAgICBjb25zdCBbbWFuYWdlciwgaXNHbG9iYWxJbnN0YW5jZV0gPSBnZXREbmRDb250ZXh0VmFsdWUocHJvcHMpIC8vIG1lbW9pemVkIGZyb20gcHJvcHNcbiAgICA7XG4gICAgLyoqXG5cdFx0ICogSWYgdGhlIGdsb2JhbCBjb250ZXh0IHdhcyB1c2VkIHRvIHN0b3JlIHRoZSBETkQgY29udGV4dFxuXHRcdCAqIHRoZW4gd2hlcmUgdGhlcmVzIG5vIG1vcmUgcmVmZXJlbmNlcyB0byBpdCB3ZSBzaG91bGRcblx0XHQgKiBjbGVhbiBpdCB1cCB0byBhdm9pZCBtZW1vcnkgbGVha3Ncblx0XHQgKi8gdXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGlmIChpc0dsb2JhbEluc3RhbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0R2xvYmFsQ29udGV4dCgpO1xuICAgICAgICAgICAgKytyZWZDb3VudDtcbiAgICAgICAgICAgIHJldHVybiAoKT0+e1xuICAgICAgICAgICAgICAgIGlmICgtLXJlZkNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRbSU5TVEFOQ0VfU1lNXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfSwgW10pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovIF9qc3goRG5kQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogbWFuYWdlcixcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgfSk7XG59KTtcbi8qKlxuICogQSBSZWFjdCBjb21wb25lbnQgdGhhdCBwcm92aWRlcyB0aGUgUmVhY3QtRG5EIGNvbnRleHRcbiAqLyBleHBvcnQgeyBEbmRQcm92aWRlciwgIH07XG5mdW5jdGlvbiBnZXREbmRDb250ZXh0VmFsdWUocHJvcHMpIHtcbiAgICBpZiAoJ21hbmFnZXInIGluIHByb3BzKSB7XG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSB7XG4gICAgICAgICAgICBkcmFnRHJvcE1hbmFnZXI6IHByb3BzLm1hbmFnZXJcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG1hbmFnZXIsXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICBdO1xuICAgIH1cbiAgICBjb25zdCBtYW5hZ2VyID0gY3JlYXRlU2luZ2xldG9uRG5kQ29udGV4dChwcm9wcy5iYWNrZW5kLCBwcm9wcy5jb250ZXh0LCBwcm9wcy5vcHRpb25zLCBwcm9wcy5kZWJ1Z01vZGUpO1xuICAgIGNvbnN0IGlzR2xvYmFsSW5zdGFuY2UgPSAhcHJvcHMuY29udGV4dDtcbiAgICByZXR1cm4gW1xuICAgICAgICBtYW5hZ2VyLFxuICAgICAgICBpc0dsb2JhbEluc3RhbmNlXG4gICAgXTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNpbmdsZXRvbkRuZENvbnRleHQoYmFja2VuZCwgY29udGV4dCA9IGdldEdsb2JhbENvbnRleHQoKSwgb3B0aW9ucywgZGVidWdNb2RlKSB7XG4gICAgY29uc3QgY3R4ID0gY29udGV4dDtcbiAgICBpZiAoIWN0eFtJTlNUQU5DRV9TWU1dKSB7XG4gICAgICAgIGN0eFtJTlNUQU5DRV9TWU1dID0ge1xuICAgICAgICAgICAgZHJhZ0Ryb3BNYW5hZ2VyOiBjcmVhdGVEcmFnRHJvcE1hbmFnZXIoYmFja2VuZCwgY29udGV4dCwgb3B0aW9ucywgZGVidWdNb2RlKVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gY3R4W0lOU1RBTkNFX1NZTV07XG59XG5mdW5jdGlvbiBnZXRHbG9iYWxDb250ZXh0KCkge1xuICAgIHJldHVybiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdztcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RG5kUHJvdmlkZXIuanMubWFwIiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEkxOG5Db250ZXh0IH0gZnJvbSAnLi9jb250ZXh0LmpzJztcbmV4cG9ydCBmdW5jdGlvbiBJMThuZXh0UHJvdmlkZXIoe1xuICBpMThuLFxuICBkZWZhdWx0TlMsXG4gIGNoaWxkcmVuXG59KSB7XG4gIGNvbnN0IHZhbHVlID0gdXNlTWVtbygoKSA9PiAoe1xuICAgIGkxOG4sXG4gICAgZGVmYXVsdE5TXG4gIH0pLCBbaTE4biwgZGVmYXVsdE5TXSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KEkxOG5Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWVcbiAgfSwgY2hpbGRyZW4pO1xufSIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBub2Rlc1RvU3RyaW5nLCBUcmFucyBhcyBUcmFuc1dpdGhvdXRDb250ZXh0IH0gZnJvbSAnLi9UcmFuc1dpdGhvdXRDb250ZXh0LmpzJztcbmltcG9ydCB7IGdldEkxOG4sIEkxOG5Db250ZXh0IH0gZnJvbSAnLi9jb250ZXh0LmpzJztcbmV4cG9ydCB7IG5vZGVzVG9TdHJpbmcgfTtcbmV4cG9ydCBmdW5jdGlvbiBUcmFucyh7XG4gIGNoaWxkcmVuLFxuICBjb3VudCxcbiAgcGFyZW50LFxuICBpMThuS2V5LFxuICBjb250ZXh0LFxuICB0T3B0aW9ucyA9IHt9LFxuICB2YWx1ZXMsXG4gIGRlZmF1bHRzLFxuICBjb21wb25lbnRzLFxuICBucyxcbiAgaTE4bjogaTE4bkZyb21Qcm9wcyxcbiAgdDogdEZyb21Qcm9wcyxcbiAgc2hvdWxkVW5lc2NhcGUsXG4gIC4uLmFkZGl0aW9uYWxQcm9wc1xufSkge1xuICBjb25zdCB7XG4gICAgaTE4bjogaTE4bkZyb21Db250ZXh0LFxuICAgIGRlZmF1bHROUzogZGVmYXVsdE5TRnJvbUNvbnRleHRcbiAgfSA9IHVzZUNvbnRleHQoSTE4bkNvbnRleHQpIHx8IHt9O1xuICBjb25zdCBpMThuID0gaTE4bkZyb21Qcm9wcyB8fCBpMThuRnJvbUNvbnRleHQgfHwgZ2V0STE4bigpO1xuICBjb25zdCB0ID0gdEZyb21Qcm9wcyB8fCBpMThuPy50LmJpbmQoaTE4bik7XG4gIHJldHVybiBUcmFuc1dpdGhvdXRDb250ZXh0KHtcbiAgICBjaGlsZHJlbixcbiAgICBjb3VudCxcbiAgICBwYXJlbnQsXG4gICAgaTE4bktleSxcbiAgICBjb250ZXh0LFxuICAgIHRPcHRpb25zLFxuICAgIHZhbHVlcyxcbiAgICBkZWZhdWx0cyxcbiAgICBjb21wb25lbnRzLFxuICAgIG5zOiBucyB8fCB0Py5ucyB8fCBkZWZhdWx0TlNGcm9tQ29udGV4dCB8fCBpMThuPy5vcHRpb25zPy5kZWZhdWx0TlMsXG4gICAgaTE4bixcbiAgICB0OiB0RnJvbVByb3BzLFxuICAgIHNob3VsZFVuZXNjYXBlLFxuICAgIC4uLmFkZGl0aW9uYWxQcm9wc1xuICB9KTtcbn0iLCJpbXBvcnQgeyBGcmFnbWVudCwgaXNWYWxpZEVsZW1lbnQsIGNsb25lRWxlbWVudCwgY3JlYXRlRWxlbWVudCwgQ2hpbGRyZW4gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgSFRNTCBmcm9tICdodG1sLXBhcnNlLXN0cmluZ2lmeSc7XG5pbXBvcnQgeyBpc09iamVjdCwgaXNTdHJpbmcsIHdhcm4sIHdhcm5PbmNlIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBnZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMuanMnO1xuaW1wb3J0IHsgZ2V0STE4biB9IGZyb20gJy4vaTE4bkluc3RhbmNlLmpzJztcbmNvbnN0IGhhc0NoaWxkcmVuID0gKG5vZGUsIGNoZWNrTGVuZ3RoKSA9PiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBiYXNlID0gbm9kZS5wcm9wcz8uY2hpbGRyZW4gPz8gbm9kZS5jaGlsZHJlbjtcbiAgaWYgKGNoZWNrTGVuZ3RoKSByZXR1cm4gYmFzZS5sZW5ndGggPiAwO1xuICByZXR1cm4gISFiYXNlO1xufTtcbmNvbnN0IGdldENoaWxkcmVuID0gbm9kZSA9PiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIFtdO1xuICBjb25zdCBjaGlsZHJlbiA9IG5vZGUucHJvcHM/LmNoaWxkcmVuID8/IG5vZGUuY2hpbGRyZW47XG4gIHJldHVybiBub2RlLnByb3BzPy5pMThuSXNEeW5hbWljTGlzdCA/IGdldEFzQXJyYXkoY2hpbGRyZW4pIDogY2hpbGRyZW47XG59O1xuY29uc3QgaGFzVmFsaWRSZWFjdENoaWxkcmVuID0gY2hpbGRyZW4gPT4gQXJyYXkuaXNBcnJheShjaGlsZHJlbikgJiYgY2hpbGRyZW4uZXZlcnkoaXNWYWxpZEVsZW1lbnQpO1xuY29uc3QgZ2V0QXNBcnJheSA9IGRhdGEgPT4gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV07XG5jb25zdCBtZXJnZVByb3BzID0gKHNvdXJjZSwgdGFyZ2V0KSA9PiB7XG4gIGNvbnN0IG5ld1RhcmdldCA9IHtcbiAgICAuLi50YXJnZXRcbiAgfTtcbiAgbmV3VGFyZ2V0LnByb3BzID0gT2JqZWN0LmFzc2lnbihzb3VyY2UucHJvcHMsIHRhcmdldC5wcm9wcyk7XG4gIHJldHVybiBuZXdUYXJnZXQ7XG59O1xuZXhwb3J0IGNvbnN0IG5vZGVzVG9TdHJpbmcgPSAoY2hpbGRyZW4sIGkxOG5PcHRpb25zKSA9PiB7XG4gIGlmICghY2hpbGRyZW4pIHJldHVybiAnJztcbiAgbGV0IHN0cmluZ05vZGUgPSAnJztcbiAgY29uc3QgY2hpbGRyZW5BcnJheSA9IGdldEFzQXJyYXkoY2hpbGRyZW4pO1xuICBjb25zdCBrZWVwQXJyYXkgPSBpMThuT3B0aW9ucz8udHJhbnNTdXBwb3J0QmFzaWNIdG1sTm9kZXMgPyBpMThuT3B0aW9ucy50cmFuc0tlZXBCYXNpY0h0bWxOb2Rlc0ZvciA/PyBbXSA6IFtdO1xuICBjaGlsZHJlbkFycmF5LmZvckVhY2goKGNoaWxkLCBjaGlsZEluZGV4KSA9PiB7XG4gICAgaWYgKGlzU3RyaW5nKGNoaWxkKSkge1xuICAgICAgc3RyaW5nTm9kZSArPSBgJHtjaGlsZH1gO1xuICAgIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHByb3BzLFxuICAgICAgICB0eXBlXG4gICAgICB9ID0gY2hpbGQ7XG4gICAgICBjb25zdCBjaGlsZFByb3BzQ291bnQgPSBPYmplY3Qua2V5cyhwcm9wcykubGVuZ3RoO1xuICAgICAgY29uc3Qgc2hvdWxkS2VlcENoaWxkID0ga2VlcEFycmF5LmluZGV4T2YodHlwZSkgPiAtMTtcbiAgICAgIGNvbnN0IGNoaWxkQ2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIGlmICghY2hpbGRDaGlsZHJlbiAmJiBzaG91bGRLZWVwQ2hpbGQgJiYgIWNoaWxkUHJvcHNDb3VudCkge1xuICAgICAgICBzdHJpbmdOb2RlICs9IGA8JHt0eXBlfS8+YDtcbiAgICAgIH0gZWxzZSBpZiAoIWNoaWxkQ2hpbGRyZW4gJiYgKCFzaG91bGRLZWVwQ2hpbGQgfHwgY2hpbGRQcm9wc0NvdW50KSB8fCBwcm9wcy5pMThuSXNEeW5hbWljTGlzdCkge1xuICAgICAgICBzdHJpbmdOb2RlICs9IGA8JHtjaGlsZEluZGV4fT48LyR7Y2hpbGRJbmRleH0+YDtcbiAgICAgIH0gZWxzZSBpZiAoc2hvdWxkS2VlcENoaWxkICYmIGNoaWxkUHJvcHNDb3VudCA9PT0gMSAmJiBpc1N0cmluZyhjaGlsZENoaWxkcmVuKSkge1xuICAgICAgICBzdHJpbmdOb2RlICs9IGA8JHt0eXBlfT4ke2NoaWxkQ2hpbGRyZW59PC8ke3R5cGV9PmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gbm9kZXNUb1N0cmluZyhjaGlsZENoaWxkcmVuLCBpMThuT3B0aW9ucyk7XG4gICAgICAgIHN0cmluZ05vZGUgKz0gYDwke2NoaWxkSW5kZXh9PiR7Y29udGVudH08LyR7Y2hpbGRJbmRleH0+YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoaWxkID09PSBudWxsKSB7XG4gICAgICB3YXJuKGBUcmFuczogdGhlIHBhc3NlZCBpbiB2YWx1ZSBpcyBpbnZhbGlkIC0gc2VlbXMgeW91IHBhc3NlZCBpbiBhIG51bGwgY2hpbGQuYCk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChjaGlsZCkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICAuLi5jbG9uZVxuICAgICAgfSA9IGNoaWxkO1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNsb25lKTtcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1hdCA/IGAke2tleXNbMF19LCAke2Zvcm1hdH1gIDoga2V5c1swXTtcbiAgICAgICAgc3RyaW5nTm9kZSArPSBge3ske3ZhbHVlfX19YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oYHJlYWN0LWkxOG5leHQ6IHRoZSBwYXNzZWQgaW4gb2JqZWN0IGNvbnRhaW5lZCBtb3JlIHRoYW4gb25lIHZhcmlhYmxlIC0gdGhlIG9iamVjdCBzaG91bGQgbG9vayBsaWtlIHt7IHZhbHVlLCBmb3JtYXQgfX0gd2hlcmUgZm9ybWF0IGlzIG9wdGlvbmFsLmAsIGNoaWxkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd2FybihgVHJhbnM6IHRoZSBwYXNzZWQgaW4gdmFsdWUgaXMgaW52YWxpZCAtIHNlZW1zIHlvdSBwYXNzZWQgaW4gYSB2YXJpYWJsZSBsaWtlIHtudW1iZXJ9IC0gcGxlYXNlIHBhc3MgaW4gdmFyaWFibGVzIGZvciBpbnRlcnBvbGF0aW9uIGFzIGZ1bGwgb2JqZWN0cyBsaWtlIHt7bnVtYmVyfX0uYCwgY2hpbGQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzdHJpbmdOb2RlO1xufTtcbmNvbnN0IHJlbmRlck5vZGVzID0gKGNoaWxkcmVuLCB0YXJnZXRTdHJpbmcsIGkxOG4sIGkxOG5PcHRpb25zLCBjb21iaW5lZFRPcHRzLCBzaG91bGRVbmVzY2FwZSkgPT4ge1xuICBpZiAodGFyZ2V0U3RyaW5nID09PSAnJykgcmV0dXJuIFtdO1xuICBjb25zdCBrZWVwQXJyYXkgPSBpMThuT3B0aW9ucy50cmFuc0tlZXBCYXNpY0h0bWxOb2Rlc0ZvciB8fCBbXTtcbiAgY29uc3QgZW1wdHlDaGlsZHJlbkJ1dE5lZWRzSGFuZGxpbmcgPSB0YXJnZXRTdHJpbmcgJiYgbmV3IFJlZ0V4cChrZWVwQXJyYXkubWFwKGtlZXAgPT4gYDwke2tlZXB9YCkuam9pbignfCcpKS50ZXN0KHRhcmdldFN0cmluZyk7XG4gIGlmICghY2hpbGRyZW4gJiYgIWVtcHR5Q2hpbGRyZW5CdXROZWVkc0hhbmRsaW5nICYmICFzaG91bGRVbmVzY2FwZSkgcmV0dXJuIFt0YXJnZXRTdHJpbmddO1xuICBjb25zdCBkYXRhID0ge307XG4gIGNvbnN0IGdldERhdGEgPSBjaGlsZHMgPT4ge1xuICAgIGNvbnN0IGNoaWxkcmVuQXJyYXkgPSBnZXRBc0FycmF5KGNoaWxkcyk7XG4gICAgY2hpbGRyZW5BcnJheS5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmIChpc1N0cmluZyhjaGlsZCkpIHJldHVybjtcbiAgICAgIGlmIChoYXNDaGlsZHJlbihjaGlsZCkpIGdldERhdGEoZ2V0Q2hpbGRyZW4oY2hpbGQpKTtlbHNlIGlmIChpc09iamVjdChjaGlsZCkgJiYgIWlzVmFsaWRFbGVtZW50KGNoaWxkKSkgT2JqZWN0LmFzc2lnbihkYXRhLCBjaGlsZCk7XG4gICAgfSk7XG4gIH07XG4gIGdldERhdGEoY2hpbGRyZW4pO1xuICBjb25zdCBhc3QgPSBIVE1MLnBhcnNlKGA8MD4ke3RhcmdldFN0cmluZ308LzA+YCk7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgLi4uZGF0YSxcbiAgICAuLi5jb21iaW5lZFRPcHRzXG4gIH07XG4gIGNvbnN0IHJlbmRlcklubmVyID0gKGNoaWxkLCBub2RlLCByb290UmVhY3ROb2RlKSA9PiB7XG4gICAgY29uc3QgY2hpbGRzID0gZ2V0Q2hpbGRyZW4oY2hpbGQpO1xuICAgIGNvbnN0IG1hcHBlZENoaWxkcmVuID0gbWFwQVNUKGNoaWxkcywgbm9kZS5jaGlsZHJlbiwgcm9vdFJlYWN0Tm9kZSk7XG4gICAgcmV0dXJuIGhhc1ZhbGlkUmVhY3RDaGlsZHJlbihjaGlsZHMpICYmIG1hcHBlZENoaWxkcmVuLmxlbmd0aCA9PT0gMCB8fCBjaGlsZC5wcm9wcz8uaTE4bklzRHluYW1pY0xpc3QgPyBjaGlsZHMgOiBtYXBwZWRDaGlsZHJlbjtcbiAgfTtcbiAgY29uc3QgcHVzaFRyYW5zbGF0ZWRKU1ggPSAoY2hpbGQsIGlubmVyLCBtZW0sIGksIGlzVm9pZCkgPT4ge1xuICAgIGlmIChjaGlsZC5kdW1teSkge1xuICAgICAgY2hpbGQuY2hpbGRyZW4gPSBpbm5lcjtcbiAgICAgIG1lbS5wdXNoKGNsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgICBrZXk6IGlcbiAgICAgIH0sIGlzVm9pZCA/IHVuZGVmaW5lZCA6IGlubmVyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lbS5wdXNoKC4uLkNoaWxkcmVuLm1hcChbY2hpbGRdLCBjID0+IHtcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgICAgLi4uYy5wcm9wc1xuICAgICAgICB9O1xuICAgICAgICBkZWxldGUgcHJvcHMuaTE4bklzRHluYW1pY0xpc3Q7XG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KGMudHlwZSwge1xuICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgIGtleTogaSxcbiAgICAgICAgICByZWY6IGMucmVmXG4gICAgICAgIH0sIGlzVm9pZCA/IG51bGwgOiBpbm5lcik7XG4gICAgICB9KSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBtYXBBU1QgPSAocmVhY3ROb2RlLCBhc3ROb2RlLCByb290UmVhY3ROb2RlKSA9PiB7XG4gICAgY29uc3QgcmVhY3ROb2RlcyA9IGdldEFzQXJyYXkocmVhY3ROb2RlKTtcbiAgICBjb25zdCBhc3ROb2RlcyA9IGdldEFzQXJyYXkoYXN0Tm9kZSk7XG4gICAgcmV0dXJuIGFzdE5vZGVzLnJlZHVjZSgobWVtLCBub2RlLCBpKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbkNvbnRlbnQgPSBub2RlLmNoaWxkcmVuPy5bMF0/LmNvbnRlbnQgJiYgaTE4bi5zZXJ2aWNlcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUobm9kZS5jaGlsZHJlblswXS5jb250ZW50LCBvcHRzLCBpMThuLmxhbmd1YWdlKTtcbiAgICAgIGlmIChub2RlLnR5cGUgPT09ICd0YWcnKSB7XG4gICAgICAgIGxldCB0bXAgPSByZWFjdE5vZGVzW3BhcnNlSW50KG5vZGUubmFtZSwgMTApXTtcbiAgICAgICAgaWYgKHJvb3RSZWFjdE5vZGUubGVuZ3RoID09PSAxICYmICF0bXApIHRtcCA9IHJvb3RSZWFjdE5vZGVbMF1bbm9kZS5uYW1lXTtcbiAgICAgICAgaWYgKCF0bXApIHRtcCA9IHt9O1xuICAgICAgICBjb25zdCBjaGlsZCA9IE9iamVjdC5rZXlzKG5vZGUuYXR0cnMpLmxlbmd0aCAhPT0gMCA/IG1lcmdlUHJvcHMoe1xuICAgICAgICAgIHByb3BzOiBub2RlLmF0dHJzXG4gICAgICAgIH0sIHRtcCkgOiB0bXA7XG4gICAgICAgIGNvbnN0IGlzRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50KGNoaWxkKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZFRyYW5zbGF0aW9uV2l0aENoaWxkcmVuID0gaXNFbGVtZW50ICYmIGhhc0NoaWxkcmVuKG5vZGUsIHRydWUpICYmICFub2RlLnZvaWRFbGVtZW50O1xuICAgICAgICBjb25zdCBpc0VtcHR5VHJhbnNXaXRoSFRNTCA9IGVtcHR5Q2hpbGRyZW5CdXROZWVkc0hhbmRsaW5nICYmIGlzT2JqZWN0KGNoaWxkKSAmJiBjaGlsZC5kdW1teSAmJiAhaXNFbGVtZW50O1xuICAgICAgICBjb25zdCBpc0tub3duQ29tcG9uZW50ID0gaXNPYmplY3QoY2hpbGRyZW4pICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNoaWxkcmVuLCBub2RlLm5hbWUpO1xuICAgICAgICBpZiAoaXNTdHJpbmcoY2hpbGQpKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBpMThuLnNlcnZpY2VzLmludGVycG9sYXRvci5pbnRlcnBvbGF0ZShjaGlsZCwgb3B0cywgaTE4bi5sYW5ndWFnZSk7XG4gICAgICAgICAgbWVtLnB1c2godmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhc0NoaWxkcmVuKGNoaWxkKSB8fCBpc1ZhbGlkVHJhbnNsYXRpb25XaXRoQ2hpbGRyZW4pIHtcbiAgICAgICAgICBjb25zdCBpbm5lciA9IHJlbmRlcklubmVyKGNoaWxkLCBub2RlLCByb290UmVhY3ROb2RlKTtcbiAgICAgICAgICBwdXNoVHJhbnNsYXRlZEpTWChjaGlsZCwgaW5uZXIsIG1lbSwgaSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNFbXB0eVRyYW5zV2l0aEhUTUwpIHtcbiAgICAgICAgICBjb25zdCBpbm5lciA9IG1hcEFTVChyZWFjdE5vZGVzLCBub2RlLmNoaWxkcmVuLCByb290UmVhY3ROb2RlKTtcbiAgICAgICAgICBwdXNoVHJhbnNsYXRlZEpTWChjaGlsZCwgaW5uZXIsIG1lbSwgaSk7XG4gICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlRmxvYXQobm9kZS5uYW1lKSkpIHtcbiAgICAgICAgICBpZiAoaXNLbm93bkNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5uZXIgPSByZW5kZXJJbm5lcihjaGlsZCwgbm9kZSwgcm9vdFJlYWN0Tm9kZSk7XG4gICAgICAgICAgICBwdXNoVHJhbnNsYXRlZEpTWChjaGlsZCwgaW5uZXIsIG1lbSwgaSwgbm9kZS52b2lkRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpMThuT3B0aW9ucy50cmFuc1N1cHBvcnRCYXNpY0h0bWxOb2RlcyAmJiBrZWVwQXJyYXkuaW5kZXhPZihub2RlLm5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgIGlmIChub2RlLnZvaWRFbGVtZW50KSB7XG4gICAgICAgICAgICAgIG1lbS5wdXNoKGNyZWF0ZUVsZW1lbnQobm9kZS5uYW1lLCB7XG4gICAgICAgICAgICAgICAga2V5OiBgJHtub2RlLm5hbWV9LSR7aX1gXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlubmVyID0gbWFwQVNUKHJlYWN0Tm9kZXMsIG5vZGUuY2hpbGRyZW4sIHJvb3RSZWFjdE5vZGUpO1xuICAgICAgICAgICAgICBtZW0ucHVzaChjcmVhdGVFbGVtZW50KG5vZGUubmFtZSwge1xuICAgICAgICAgICAgICAgIGtleTogYCR7bm9kZS5uYW1lfS0ke2l9YFxuICAgICAgICAgICAgICB9LCBpbm5lcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS52b2lkRWxlbWVudCkge1xuICAgICAgICAgICAgbWVtLnB1c2goYDwke25vZGUubmFtZX0gLz5gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5uZXIgPSBtYXBBU1QocmVhY3ROb2Rlcywgbm9kZS5jaGlsZHJlbiwgcm9vdFJlYWN0Tm9kZSk7XG4gICAgICAgICAgICBtZW0ucHVzaChgPCR7bm9kZS5uYW1lfT4ke2lubmVyfTwvJHtub2RlLm5hbWV9PmApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChjaGlsZCkgJiYgIWlzRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBub2RlLmNoaWxkcmVuWzBdID8gdHJhbnNsYXRpb25Db250ZW50IDogbnVsbDtcbiAgICAgICAgICBpZiAoY29udGVudCkgbWVtLnB1c2goY29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaFRyYW5zbGF0ZWRKU1goY2hpbGQsIHRyYW5zbGF0aW9uQ29udGVudCwgbWVtLCBpLCBub2RlLmNoaWxkcmVuLmxlbmd0aCAhPT0gMSB8fCAhdHJhbnNsYXRpb25Db250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICBjb25zdCB3cmFwVGV4dE5vZGVzID0gaTE4bk9wdGlvbnMudHJhbnNXcmFwVGV4dE5vZGVzO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gc2hvdWxkVW5lc2NhcGUgPyBpMThuT3B0aW9ucy51bmVzY2FwZShpMThuLnNlcnZpY2VzLmludGVycG9sYXRvci5pbnRlcnBvbGF0ZShub2RlLmNvbnRlbnQsIG9wdHMsIGkxOG4ubGFuZ3VhZ2UpKSA6IGkxOG4uc2VydmljZXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKG5vZGUuY29udGVudCwgb3B0cywgaTE4bi5sYW5ndWFnZSk7XG4gICAgICAgIGlmICh3cmFwVGV4dE5vZGVzKSB7XG4gICAgICAgICAgbWVtLnB1c2goY3JlYXRlRWxlbWVudCh3cmFwVGV4dE5vZGVzLCB7XG4gICAgICAgICAgICBrZXk6IGAke25vZGUubmFtZX0tJHtpfWBcbiAgICAgICAgICB9LCBjb250ZW50KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWVtLnB1c2goY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtZW07XG4gICAgfSwgW10pO1xuICB9O1xuICBjb25zdCByZXN1bHQgPSBtYXBBU1QoW3tcbiAgICBkdW1teTogdHJ1ZSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4gfHwgW11cbiAgfV0sIGFzdCwgZ2V0QXNBcnJheShjaGlsZHJlbiB8fCBbXSkpO1xuICByZXR1cm4gZ2V0Q2hpbGRyZW4ocmVzdWx0WzBdKTtcbn07XG5leHBvcnQgZnVuY3Rpb24gVHJhbnMoe1xuICBjaGlsZHJlbixcbiAgY291bnQsXG4gIHBhcmVudCxcbiAgaTE4bktleSxcbiAgY29udGV4dCxcbiAgdE9wdGlvbnMgPSB7fSxcbiAgdmFsdWVzLFxuICBkZWZhdWx0cyxcbiAgY29tcG9uZW50cyxcbiAgbnMsXG4gIGkxOG46IGkxOG5Gcm9tUHJvcHMsXG4gIHQ6IHRGcm9tUHJvcHMsXG4gIHNob3VsZFVuZXNjYXBlLFxuICAuLi5hZGRpdGlvbmFsUHJvcHNcbn0pIHtcbiAgY29uc3QgaTE4biA9IGkxOG5Gcm9tUHJvcHMgfHwgZ2V0STE4bigpO1xuICBpZiAoIWkxOG4pIHtcbiAgICB3YXJuT25jZSgnWW91IHdpbGwgbmVlZCB0byBwYXNzIGluIGFuIGkxOG5leHQgaW5zdGFuY2UgYnkgdXNpbmcgaTE4bmV4dFJlYWN0TW9kdWxlJyk7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIGNvbnN0IHQgPSB0RnJvbVByb3BzIHx8IGkxOG4udC5iaW5kKGkxOG4pIHx8IChrID0+IGspO1xuICBjb25zdCByZWFjdEkxOG5leHRPcHRpb25zID0ge1xuICAgIC4uLmdldERlZmF1bHRzKCksXG4gICAgLi4uaTE4bi5vcHRpb25zPy5yZWFjdFxuICB9O1xuICBsZXQgbmFtZXNwYWNlcyA9IG5zIHx8IHQubnMgfHwgaTE4bi5vcHRpb25zPy5kZWZhdWx0TlM7XG4gIG5hbWVzcGFjZXMgPSBpc1N0cmluZyhuYW1lc3BhY2VzKSA/IFtuYW1lc3BhY2VzXSA6IG5hbWVzcGFjZXMgfHwgWyd0cmFuc2xhdGlvbiddO1xuICBjb25zdCBub2RlQXNTdHJpbmcgPSBub2Rlc1RvU3RyaW5nKGNoaWxkcmVuLCByZWFjdEkxOG5leHRPcHRpb25zKTtcbiAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGVmYXVsdHMgfHwgbm9kZUFzU3RyaW5nIHx8IHJlYWN0STE4bmV4dE9wdGlvbnMudHJhbnNFbXB0eU5vZGVWYWx1ZSB8fCBpMThuS2V5O1xuICBjb25zdCB7XG4gICAgaGFzaFRyYW5zS2V5XG4gIH0gPSByZWFjdEkxOG5leHRPcHRpb25zO1xuICBjb25zdCBrZXkgPSBpMThuS2V5IHx8IChoYXNoVHJhbnNLZXkgPyBoYXNoVHJhbnNLZXkobm9kZUFzU3RyaW5nIHx8IGRlZmF1bHRWYWx1ZSkgOiBub2RlQXNTdHJpbmcgfHwgZGVmYXVsdFZhbHVlKTtcbiAgaWYgKGkxOG4ub3B0aW9ucz8uaW50ZXJwb2xhdGlvbj8uZGVmYXVsdFZhcmlhYmxlcykge1xuICAgIHZhbHVlcyA9IHZhbHVlcyAmJiBPYmplY3Qua2V5cyh2YWx1ZXMpLmxlbmd0aCA+IDAgPyB7XG4gICAgICAuLi52YWx1ZXMsXG4gICAgICAuLi5pMThuLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzXG4gICAgfSA6IHtcbiAgICAgIC4uLmkxOG4ub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXNcbiAgICB9O1xuICB9XG4gIGNvbnN0IGludGVycG9sYXRpb25PdmVycmlkZSA9IHZhbHVlcyB8fCBjb3VudCAhPT0gdW5kZWZpbmVkIHx8ICFjaGlsZHJlbiA/IHRPcHRpb25zLmludGVycG9sYXRpb24gOiB7XG4gICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgLi4udE9wdGlvbnMuaW50ZXJwb2xhdGlvbixcbiAgICAgIHByZWZpeDogJyMkPycsXG4gICAgICBzdWZmaXg6ICc/JCMnXG4gICAgfVxuICB9O1xuICBjb25zdCBjb21iaW5lZFRPcHRzID0ge1xuICAgIC4uLnRPcHRpb25zLFxuICAgIGNvbnRleHQ6IGNvbnRleHQgfHwgdE9wdGlvbnMuY29udGV4dCxcbiAgICBjb3VudCxcbiAgICAuLi52YWx1ZXMsXG4gICAgLi4uaW50ZXJwb2xhdGlvbk92ZXJyaWRlLFxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBuczogbmFtZXNwYWNlc1xuICB9O1xuICBjb25zdCB0cmFuc2xhdGlvbiA9IGtleSA/IHQoa2V5LCBjb21iaW5lZFRPcHRzKSA6IGRlZmF1bHRWYWx1ZTtcbiAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5mb3JFYWNoKGMgPT4ge1xuICAgICAgY29uc3QgY29tcCA9IGNvbXBvbmVudHNbY107XG4gICAgICBpZiAodHlwZW9mIGNvbXAudHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAhY29tcC5wcm9wcyB8fCAhY29tcC5wcm9wcy5jaGlsZHJlbiB8fCB0cmFuc2xhdGlvbi5pbmRleE9mKGAke2N9Lz5gKSA8IDAgJiYgdHJhbnNsYXRpb24uaW5kZXhPZihgJHtjfSAvPmApIDwgMCkgcmV0dXJuO1xuICAgICAgZnVuY3Rpb24gQ29tcG9uZW50aXplZCgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoRnJhZ21lbnQsIG51bGwsIGNvbXApO1xuICAgICAgfVxuICAgICAgY29tcG9uZW50c1tjXSA9IGNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50aXplZCk7XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgY29udGVudCA9IHJlbmRlck5vZGVzKGNvbXBvbmVudHMgfHwgY2hpbGRyZW4sIHRyYW5zbGF0aW9uLCBpMThuLCByZWFjdEkxOG5leHRPcHRpb25zLCBjb21iaW5lZFRPcHRzLCBzaG91bGRVbmVzY2FwZSk7XG4gIGNvbnN0IHVzZUFzUGFyZW50ID0gcGFyZW50ID8/IHJlYWN0STE4bmV4dE9wdGlvbnMuZGVmYXVsdFRyYW5zUGFyZW50O1xuICByZXR1cm4gdXNlQXNQYXJlbnQgPyBjcmVhdGVFbGVtZW50KHVzZUFzUGFyZW50LCBhZGRpdGlvbmFsUHJvcHMsIGNvbnRlbnQpIDogY29udGVudDtcbn0iLCJpbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJy4vdXNlVHJhbnNsYXRpb24uanMnO1xuZXhwb3J0IGNvbnN0IFRyYW5zbGF0aW9uID0gKHtcbiAgbnMsXG4gIGNoaWxkcmVuLFxuICAuLi5vcHRpb25zXG59KSA9PiB7XG4gIGNvbnN0IFt0LCBpMThuLCByZWFkeV0gPSB1c2VUcmFuc2xhdGlvbihucywgb3B0aW9ucyk7XG4gIHJldHVybiBjaGlsZHJlbih0LCB7XG4gICAgaTE4bixcbiAgICBsbmc6IGkxOG4ubGFuZ3VhZ2VcbiAgfSwgcmVhZHkpO1xufTsiLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdHMsIHNldERlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy5qcyc7XG5pbXBvcnQgeyBnZXRJMThuLCBzZXRJMThuIH0gZnJvbSAnLi9pMThuSW5zdGFuY2UuanMnO1xuaW1wb3J0IHsgaW5pdFJlYWN0STE4bmV4dCB9IGZyb20gJy4vaW5pdFJlYWN0STE4bmV4dC5qcyc7XG5leHBvcnQgeyBnZXREZWZhdWx0cywgc2V0RGVmYXVsdHMsIGdldEkxOG4sIHNldEkxOG4sIGluaXRSZWFjdEkxOG5leHQgfTtcbmV4cG9ydCBjb25zdCBJMThuQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbmV4cG9ydCBjbGFzcyBSZXBvcnROYW1lc3BhY2VzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy51c2VkTmFtZXNwYWNlcyA9IHt9O1xuICB9XG4gIGFkZFVzZWROYW1lc3BhY2VzKG5hbWVzcGFjZXMpIHtcbiAgICBuYW1lc3BhY2VzLmZvckVhY2gobnMgPT4ge1xuICAgICAgdGhpcy51c2VkTmFtZXNwYWNlc1tuc10gPz89IHRydWU7XG4gICAgfSk7XG4gIH1cbiAgZ2V0VXNlZE5hbWVzcGFjZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudXNlZE5hbWVzcGFjZXMpO1xuICB9XG59XG5leHBvcnQgY29uc3QgY29tcG9zZUluaXRpYWxQcm9wcyA9IEZvckNvbXBvbmVudCA9PiBhc3luYyBjdHggPT4ge1xuICBjb25zdCBjb21wb25lbnRzSW5pdGlhbFByb3BzID0gKGF3YWl0IEZvckNvbXBvbmVudC5nZXRJbml0aWFsUHJvcHM/LihjdHgpKSA/PyB7fTtcbiAgY29uc3QgaTE4bkluaXRpYWxQcm9wcyA9IGdldEluaXRpYWxQcm9wcygpO1xuICByZXR1cm4ge1xuICAgIC4uLmNvbXBvbmVudHNJbml0aWFsUHJvcHMsXG4gICAgLi4uaTE4bkluaXRpYWxQcm9wc1xuICB9O1xufTtcbmV4cG9ydCBjb25zdCBnZXRJbml0aWFsUHJvcHMgPSAoKSA9PiB7XG4gIGNvbnN0IGkxOG4gPSBnZXRJMThuKCk7XG4gIGNvbnN0IG5hbWVzcGFjZXMgPSBpMThuLnJlcG9ydE5hbWVzcGFjZXM/LmdldFVzZWROYW1lc3BhY2VzKCkgPz8gW107XG4gIGNvbnN0IHJldCA9IHt9O1xuICBjb25zdCBpbml0aWFsSTE4blN0b3JlID0ge307XG4gIGkxOG4ubGFuZ3VhZ2VzLmZvckVhY2gobCA9PiB7XG4gICAgaW5pdGlhbEkxOG5TdG9yZVtsXSA9IHt9O1xuICAgIG5hbWVzcGFjZXMuZm9yRWFjaChucyA9PiB7XG4gICAgICBpbml0aWFsSTE4blN0b3JlW2xdW25zXSA9IGkxOG4uZ2V0UmVzb3VyY2VCdW5kbGUobCwgbnMpIHx8IHt9O1xuICAgIH0pO1xuICB9KTtcbiAgcmV0LmluaXRpYWxJMThuU3RvcmUgPSBpbml0aWFsSTE4blN0b3JlO1xuICByZXQuaW5pdGlhbExhbmd1YWdlID0gaTE4bi5sYW5ndWFnZTtcbiAgcmV0dXJuIHJldDtcbn07IiwiaW1wb3J0IHsgdW5lc2NhcGUgfSBmcm9tICcuL3VuZXNjYXBlLmpzJztcbmxldCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgYmluZEkxOG46ICdsYW5ndWFnZUNoYW5nZWQnLFxuICBiaW5kSTE4blN0b3JlOiAnJyxcbiAgdHJhbnNFbXB0eU5vZGVWYWx1ZTogJycsXG4gIHRyYW5zU3VwcG9ydEJhc2ljSHRtbE5vZGVzOiB0cnVlLFxuICB0cmFuc1dyYXBUZXh0Tm9kZXM6ICcnLFxuICB0cmFuc0tlZXBCYXNpY0h0bWxOb2Rlc0ZvcjogWydicicsICdzdHJvbmcnLCAnaScsICdwJ10sXG4gIHVzZVN1c3BlbnNlOiB0cnVlLFxuICB1bmVzY2FwZVxufTtcbmV4cG9ydCBjb25zdCBzZXREZWZhdWx0cyA9IChvcHRpb25zID0ge30pID0+IHtcbiAgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xufTtcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0cyA9ICgpID0+IGRlZmF1bHRPcHRpb25zOyIsImxldCBpMThuSW5zdGFuY2U7XG5leHBvcnQgY29uc3Qgc2V0STE4biA9IGluc3RhbmNlID0+IHtcbiAgaTE4bkluc3RhbmNlID0gaW5zdGFuY2U7XG59O1xuZXhwb3J0IGNvbnN0IGdldEkxOG4gPSAoKSA9PiBpMThuSW5zdGFuY2U7IiwiZXhwb3J0IHsgVHJhbnMgfSBmcm9tICcuL1RyYW5zLmpzJztcbmV4cG9ydCB7IFRyYW5zIGFzIFRyYW5zV2l0aG91dENvbnRleHQgfSBmcm9tICcuL1RyYW5zV2l0aG91dENvbnRleHQuanMnO1xuZXhwb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuL3VzZVRyYW5zbGF0aW9uLmpzJztcbmV4cG9ydCB7IHdpdGhUcmFuc2xhdGlvbiB9IGZyb20gJy4vd2l0aFRyYW5zbGF0aW9uLmpzJztcbmV4cG9ydCB7IFRyYW5zbGF0aW9uIH0gZnJvbSAnLi9UcmFuc2xhdGlvbi5qcyc7XG5leHBvcnQgeyBJMThuZXh0UHJvdmlkZXIgfSBmcm9tICcuL0kxOG5leHRQcm92aWRlci5qcyc7XG5leHBvcnQgeyB3aXRoU1NSIH0gZnJvbSAnLi93aXRoU1NSLmpzJztcbmV4cG9ydCB7IHVzZVNTUiB9IGZyb20gJy4vdXNlU1NSLmpzJztcbmV4cG9ydCB7IGluaXRSZWFjdEkxOG5leHQgfSBmcm9tICcuL2luaXRSZWFjdEkxOG5leHQuanMnO1xuZXhwb3J0IHsgc2V0RGVmYXVsdHMsIGdldERlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy5qcyc7XG5leHBvcnQgeyBzZXRJMThuLCBnZXRJMThuIH0gZnJvbSAnLi9pMThuSW5zdGFuY2UuanMnO1xuZXhwb3J0IHsgSTE4bkNvbnRleHQsIGNvbXBvc2VJbml0aWFsUHJvcHMsIGdldEluaXRpYWxQcm9wcyB9IGZyb20gJy4vY29udGV4dC5qcyc7XG5leHBvcnQgY29uc3QgZGF0ZSA9ICgpID0+ICcnO1xuZXhwb3J0IGNvbnN0IHRpbWUgPSAoKSA9PiAnJztcbmV4cG9ydCBjb25zdCBudW1iZXIgPSAoKSA9PiAnJztcbmV4cG9ydCBjb25zdCBzZWxlY3QgPSAoKSA9PiAnJztcbmV4cG9ydCBjb25zdCBwbHVyYWwgPSAoKSA9PiAnJztcbmV4cG9ydCBjb25zdCBzZWxlY3RPcmRpbmFsID0gKCkgPT4gJyc7IiwiaW1wb3J0IHsgc2V0RGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLmpzJztcbmltcG9ydCB7IHNldEkxOG4gfSBmcm9tICcuL2kxOG5JbnN0YW5jZS5qcyc7XG5leHBvcnQgY29uc3QgaW5pdFJlYWN0STE4bmV4dCA9IHtcbiAgdHlwZTogJzNyZFBhcnR5JyxcbiAgaW5pdChpbnN0YW5jZSkge1xuICAgIHNldERlZmF1bHRzKGluc3RhbmNlLm9wdGlvbnMucmVhY3QpO1xuICAgIHNldEkxOG4oaW5zdGFuY2UpO1xuICB9XG59OyIsImNvbnN0IG1hdGNoSHRtbEVudGl0eSA9IC8mKD86YW1wfCMzOHxsdHwjNjB8Z3R8IzYyfGFwb3N8IzM5fHF1b3R8IzM0fG5ic3B8IzE2MHxjb3B5fCMxNjl8cmVnfCMxNzR8aGVsbGlwfCM4MjMwfCN4MkZ8IzQ3KTsvZztcbmNvbnN0IGh0bWxFbnRpdGllcyA9IHtcbiAgJyZhbXA7JzogJyYnLFxuICAnJiMzODsnOiAnJicsXG4gICcmbHQ7JzogJzwnLFxuICAnJiM2MDsnOiAnPCcsXG4gICcmZ3Q7JzogJz4nLFxuICAnJiM2MjsnOiAnPicsXG4gICcmYXBvczsnOiBcIidcIixcbiAgJyYjMzk7JzogXCInXCIsXG4gICcmcXVvdDsnOiAnXCInLFxuICAnJiMzNDsnOiAnXCInLFxuICAnJm5ic3A7JzogJyAnLFxuICAnJiMxNjA7JzogJyAnLFxuICAnJmNvcHk7JzogJ8KpJyxcbiAgJyYjMTY5Oyc6ICfCqScsXG4gICcmcmVnOyc6ICfCricsXG4gICcmIzE3NDsnOiAnwq4nLFxuICAnJmhlbGxpcDsnOiAn4oCmJyxcbiAgJyYjODIzMDsnOiAn4oCmJyxcbiAgJyYjeDJGOyc6ICcvJyxcbiAgJyYjNDc7JzogJy8nXG59O1xuY29uc3QgdW5lc2NhcGVIdG1sRW50aXR5ID0gbSA9PiBodG1sRW50aXRpZXNbbV07XG5leHBvcnQgY29uc3QgdW5lc2NhcGUgPSB0ZXh0ID0+IHRleHQucmVwbGFjZShtYXRjaEh0bWxFbnRpdHksIHVuZXNjYXBlSHRtbEVudGl0eSk7IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEkxOG4sIEkxOG5Db250ZXh0IH0gZnJvbSAnLi9jb250ZXh0LmpzJztcbmV4cG9ydCBjb25zdCB1c2VTU1IgPSAoaW5pdGlhbEkxOG5TdG9yZSwgaW5pdGlhbExhbmd1YWdlLCBwcm9wcyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBpMThuOiBpMThuRnJvbVByb3BzXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIGkxOG46IGkxOG5Gcm9tQ29udGV4dFxuICB9ID0gdXNlQ29udGV4dChJMThuQ29udGV4dCkgfHwge307XG4gIGNvbnN0IGkxOG4gPSBpMThuRnJvbVByb3BzIHx8IGkxOG5Gcm9tQ29udGV4dCB8fCBnZXRJMThuKCk7XG4gIGlmIChpMThuLm9wdGlvbnM/LmlzQ2xvbmUpIHJldHVybjtcbiAgaWYgKGluaXRpYWxJMThuU3RvcmUgJiYgIWkxOG4uaW5pdGlhbGl6ZWRTdG9yZU9uY2UpIHtcbiAgICBpMThuLnNlcnZpY2VzLnJlc291cmNlU3RvcmUuZGF0YSA9IGluaXRpYWxJMThuU3RvcmU7XG4gICAgaTE4bi5vcHRpb25zLm5zID0gT2JqZWN0LnZhbHVlcyhpbml0aWFsSTE4blN0b3JlKS5yZWR1Y2UoKG1lbSwgbG5nUmVzb3VyY2VzKSA9PiB7XG4gICAgICBPYmplY3Qua2V5cyhsbmdSZXNvdXJjZXMpLmZvckVhY2gobnMgPT4ge1xuICAgICAgICBpZiAobWVtLmluZGV4T2YobnMpIDwgMCkgbWVtLnB1c2gobnMpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWVtO1xuICAgIH0sIGkxOG4ub3B0aW9ucy5ucyk7XG4gICAgaTE4bi5pbml0aWFsaXplZFN0b3JlT25jZSA9IHRydWU7XG4gICAgaTE4bi5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuICBpZiAoaW5pdGlhbExhbmd1YWdlICYmICFpMThuLmluaXRpYWxpemVkTGFuZ3VhZ2VPbmNlKSB7XG4gICAgaTE4bi5jaGFuZ2VMYW5ndWFnZShpbml0aWFsTGFuZ3VhZ2UpO1xuICAgIGkxOG4uaW5pdGlhbGl6ZWRMYW5ndWFnZU9uY2UgPSB0cnVlO1xuICB9XG59OyIsImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNvbnRleHQsIHVzZVJlZiwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRJMThuLCBnZXREZWZhdWx0cywgUmVwb3J0TmFtZXNwYWNlcywgSTE4bkNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQuanMnO1xuaW1wb3J0IHsgd2Fybk9uY2UsIGxvYWROYW1lc3BhY2VzLCBsb2FkTGFuZ3VhZ2VzLCBoYXNMb2FkZWROYW1lc3BhY2UsIGlzU3RyaW5nLCBpc09iamVjdCB9IGZyb20gJy4vdXRpbHMuanMnO1xuY29uc3QgdXNlUHJldmlvdXMgPSAodmFsdWUsIGlnbm9yZSkgPT4ge1xuICBjb25zdCByZWYgPSB1c2VSZWYoKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICByZWYuY3VycmVudCA9IGlnbm9yZSA/IHJlZi5jdXJyZW50IDogdmFsdWU7XG4gIH0sIFt2YWx1ZSwgaWdub3JlXSk7XG4gIHJldHVybiByZWYuY3VycmVudDtcbn07XG5jb25zdCBhbHdheXNOZXdUID0gKGkxOG4sIGxhbmd1YWdlLCBuYW1lc3BhY2UsIGtleVByZWZpeCkgPT4gaTE4bi5nZXRGaXhlZFQobGFuZ3VhZ2UsIG5hbWVzcGFjZSwga2V5UHJlZml4KTtcbmNvbnN0IHVzZU1lbW9pemVkVCA9IChpMThuLCBsYW5ndWFnZSwgbmFtZXNwYWNlLCBrZXlQcmVmaXgpID0+IHVzZUNhbGxiYWNrKGFsd2F5c05ld1QoaTE4biwgbGFuZ3VhZ2UsIG5hbWVzcGFjZSwga2V5UHJlZml4KSwgW2kxOG4sIGxhbmd1YWdlLCBuYW1lc3BhY2UsIGtleVByZWZpeF0pO1xuZXhwb3J0IGNvbnN0IHVzZVRyYW5zbGF0aW9uID0gKG5zLCBwcm9wcyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBpMThuOiBpMThuRnJvbVByb3BzXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIGkxOG46IGkxOG5Gcm9tQ29udGV4dCxcbiAgICBkZWZhdWx0TlM6IGRlZmF1bHROU0Zyb21Db250ZXh0XG4gIH0gPSB1c2VDb250ZXh0KEkxOG5Db250ZXh0KSB8fCB7fTtcbiAgY29uc3QgaTE4biA9IGkxOG5Gcm9tUHJvcHMgfHwgaTE4bkZyb21Db250ZXh0IHx8IGdldEkxOG4oKTtcbiAgaWYgKGkxOG4gJiYgIWkxOG4ucmVwb3J0TmFtZXNwYWNlcykgaTE4bi5yZXBvcnROYW1lc3BhY2VzID0gbmV3IFJlcG9ydE5hbWVzcGFjZXMoKTtcbiAgaWYgKCFpMThuKSB7XG4gICAgd2Fybk9uY2UoJ1lvdSB3aWxsIG5lZWQgdG8gcGFzcyBpbiBhbiBpMThuZXh0IGluc3RhbmNlIGJ5IHVzaW5nIGluaXRSZWFjdEkxOG5leHQnKTtcbiAgICBjb25zdCBub3RSZWFkeVQgPSAoaywgb3B0c09yRGVmYXVsdFZhbHVlKSA9PiB7XG4gICAgICBpZiAoaXNTdHJpbmcob3B0c09yRGVmYXVsdFZhbHVlKSkgcmV0dXJuIG9wdHNPckRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChpc09iamVjdChvcHRzT3JEZWZhdWx0VmFsdWUpICYmIGlzU3RyaW5nKG9wdHNPckRlZmF1bHRWYWx1ZS5kZWZhdWx0VmFsdWUpKSByZXR1cm4gb3B0c09yRGVmYXVsdFZhbHVlLmRlZmF1bHRWYWx1ZTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGspID8ga1trLmxlbmd0aCAtIDFdIDogaztcbiAgICB9O1xuICAgIGNvbnN0IHJldE5vdFJlYWR5ID0gW25vdFJlYWR5VCwge30sIGZhbHNlXTtcbiAgICByZXROb3RSZWFkeS50ID0gbm90UmVhZHlUO1xuICAgIHJldE5vdFJlYWR5LmkxOG4gPSB7fTtcbiAgICByZXROb3RSZWFkeS5yZWFkeSA9IGZhbHNlO1xuICAgIHJldHVybiByZXROb3RSZWFkeTtcbiAgfVxuICBpZiAoaTE4bi5vcHRpb25zLnJlYWN0Py53YWl0KSB3YXJuT25jZSgnSXQgc2VlbXMgeW91IGFyZSBzdGlsbCB1c2luZyB0aGUgb2xkIHdhaXQgb3B0aW9uLCB5b3UgbWF5IG1pZ3JhdGUgdG8gdGhlIG5ldyB1c2VTdXNwZW5zZSBiZWhhdmlvdXIuJyk7XG4gIGNvbnN0IGkxOG5PcHRpb25zID0ge1xuICAgIC4uLmdldERlZmF1bHRzKCksXG4gICAgLi4uaTE4bi5vcHRpb25zLnJlYWN0LFxuICAgIC4uLnByb3BzXG4gIH07XG4gIGNvbnN0IHtcbiAgICB1c2VTdXNwZW5zZSxcbiAgICBrZXlQcmVmaXhcbiAgfSA9IGkxOG5PcHRpb25zO1xuICBsZXQgbmFtZXNwYWNlcyA9IG5zIHx8IGRlZmF1bHROU0Zyb21Db250ZXh0IHx8IGkxOG4ub3B0aW9ucz8uZGVmYXVsdE5TO1xuICBuYW1lc3BhY2VzID0gaXNTdHJpbmcobmFtZXNwYWNlcykgPyBbbmFtZXNwYWNlc10gOiBuYW1lc3BhY2VzIHx8IFsndHJhbnNsYXRpb24nXTtcbiAgaTE4bi5yZXBvcnROYW1lc3BhY2VzLmFkZFVzZWROYW1lc3BhY2VzPy4obmFtZXNwYWNlcyk7XG4gIGNvbnN0IHJlYWR5ID0gKGkxOG4uaXNJbml0aWFsaXplZCB8fCBpMThuLmluaXRpYWxpemVkU3RvcmVPbmNlKSAmJiBuYW1lc3BhY2VzLmV2ZXJ5KG4gPT4gaGFzTG9hZGVkTmFtZXNwYWNlKG4sIGkxOG4sIGkxOG5PcHRpb25zKSk7XG4gIGNvbnN0IG1lbW9HZXRUID0gdXNlTWVtb2l6ZWRUKGkxOG4sIHByb3BzLmxuZyB8fCBudWxsLCBpMThuT3B0aW9ucy5uc01vZGUgPT09ICdmYWxsYmFjaycgPyBuYW1lc3BhY2VzIDogbmFtZXNwYWNlc1swXSwga2V5UHJlZml4KTtcbiAgY29uc3QgZ2V0VCA9ICgpID0+IG1lbW9HZXRUO1xuICBjb25zdCBnZXROZXdUID0gKCkgPT4gYWx3YXlzTmV3VChpMThuLCBwcm9wcy5sbmcgfHwgbnVsbCwgaTE4bk9wdGlvbnMubnNNb2RlID09PSAnZmFsbGJhY2snID8gbmFtZXNwYWNlcyA6IG5hbWVzcGFjZXNbMF0sIGtleVByZWZpeCk7XG4gIGNvbnN0IFt0LCBzZXRUXSA9IHVzZVN0YXRlKGdldFQpO1xuICBsZXQgam9pbmVkTlMgPSBuYW1lc3BhY2VzLmpvaW4oKTtcbiAgaWYgKHByb3BzLmxuZykgam9pbmVkTlMgPSBgJHtwcm9wcy5sbmd9JHtqb2luZWROU31gO1xuICBjb25zdCBwcmV2aW91c0pvaW5lZE5TID0gdXNlUHJldmlvdXMoam9pbmVkTlMpO1xuICBjb25zdCBpc01vdW50ZWQgPSB1c2VSZWYodHJ1ZSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgYmluZEkxOG4sXG4gICAgICBiaW5kSTE4blN0b3JlXG4gICAgfSA9IGkxOG5PcHRpb25zO1xuICAgIGlzTW91bnRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICBpZiAoIXJlYWR5ICYmICF1c2VTdXNwZW5zZSkge1xuICAgICAgaWYgKHByb3BzLmxuZykge1xuICAgICAgICBsb2FkTGFuZ3VhZ2VzKGkxOG4sIHByb3BzLmxuZywgbmFtZXNwYWNlcywgKCkgPT4ge1xuICAgICAgICAgIGlmIChpc01vdW50ZWQuY3VycmVudCkgc2V0VChnZXROZXdUKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkTmFtZXNwYWNlcyhpMThuLCBuYW1lc3BhY2VzLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKGlzTW91bnRlZC5jdXJyZW50KSBzZXRUKGdldE5ld1QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlYWR5ICYmIHByZXZpb3VzSm9pbmVkTlMgJiYgcHJldmlvdXNKb2luZWROUyAhPT0gam9pbmVkTlMgJiYgaXNNb3VudGVkLmN1cnJlbnQpIHtcbiAgICAgIHNldFQoZ2V0TmV3VCk7XG4gICAgfVxuICAgIGNvbnN0IGJvdW5kUmVzZXQgPSAoKSA9PiB7XG4gICAgICBpZiAoaXNNb3VudGVkLmN1cnJlbnQpIHNldFQoZ2V0TmV3VCk7XG4gICAgfTtcbiAgICBpZiAoYmluZEkxOG4pIGkxOG4/Lm9uKGJpbmRJMThuLCBib3VuZFJlc2V0KTtcbiAgICBpZiAoYmluZEkxOG5TdG9yZSkgaTE4bj8uc3RvcmUub24oYmluZEkxOG5TdG9yZSwgYm91bmRSZXNldCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlzTW91bnRlZC5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBpZiAoaTE4bikgYmluZEkxOG4/LnNwbGl0KCcgJykuZm9yRWFjaChlID0+IGkxOG4ub2ZmKGUsIGJvdW5kUmVzZXQpKTtcbiAgICAgIGlmIChiaW5kSTE4blN0b3JlICYmIGkxOG4pIGJpbmRJMThuU3RvcmUuc3BsaXQoJyAnKS5mb3JFYWNoKGUgPT4gaTE4bi5zdG9yZS5vZmYoZSwgYm91bmRSZXNldCkpO1xuICAgIH07XG4gIH0sIFtpMThuLCBqb2luZWROU10pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc01vdW50ZWQuY3VycmVudCAmJiByZWFkeSkge1xuICAgICAgc2V0VChnZXRUKTtcbiAgICB9XG4gIH0sIFtpMThuLCBrZXlQcmVmaXgsIHJlYWR5XSk7XG4gIGNvbnN0IHJldCA9IFt0LCBpMThuLCByZWFkeV07XG4gIHJldC50ID0gdDtcbiAgcmV0LmkxOG4gPSBpMThuO1xuICByZXQucmVhZHkgPSByZWFkeTtcbiAgaWYgKHJlYWR5KSByZXR1cm4gcmV0O1xuICBpZiAoIXJlYWR5ICYmICF1c2VTdXNwZW5zZSkgcmV0dXJuIHJldDtcbiAgdGhyb3cgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgaWYgKHByb3BzLmxuZykge1xuICAgICAgbG9hZExhbmd1YWdlcyhpMThuLCBwcm9wcy5sbmcsIG5hbWVzcGFjZXMsICgpID0+IHJlc29sdmUoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWROYW1lc3BhY2VzKGkxOG4sIG5hbWVzcGFjZXMsICgpID0+IHJlc29sdmUoKSk7XG4gICAgfVxuICB9KTtcbn07IiwiZXhwb3J0IGNvbnN0IHdhcm4gPSAoLi4uYXJncykgPT4ge1xuICBpZiAoY29uc29sZT8ud2Fybikge1xuICAgIGlmIChpc1N0cmluZyhhcmdzWzBdKSkgYXJnc1swXSA9IGByZWFjdC1pMThuZXh0OjogJHthcmdzWzBdfWA7XG4gICAgY29uc29sZS53YXJuKC4uLmFyZ3MpO1xuICB9XG59O1xuY29uc3QgYWxyZWFkeVdhcm5lZCA9IHt9O1xuZXhwb3J0IGNvbnN0IHdhcm5PbmNlID0gKC4uLmFyZ3MpID0+IHtcbiAgaWYgKGlzU3RyaW5nKGFyZ3NbMF0pICYmIGFscmVhZHlXYXJuZWRbYXJnc1swXV0pIHJldHVybjtcbiAgaWYgKGlzU3RyaW5nKGFyZ3NbMF0pKSBhbHJlYWR5V2FybmVkW2FyZ3NbMF1dID0gbmV3IERhdGUoKTtcbiAgd2FybiguLi5hcmdzKTtcbn07XG5jb25zdCBsb2FkZWRDbGIgPSAoaTE4biwgY2IpID0+ICgpID0+IHtcbiAgaWYgKGkxOG4uaXNJbml0aWFsaXplZCkge1xuICAgIGNiKCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaW5pdGlhbGl6ZWQgPSAoKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaTE4bi5vZmYoJ2luaXRpYWxpemVkJywgaW5pdGlhbGl6ZWQpO1xuICAgICAgfSwgMCk7XG4gICAgICBjYigpO1xuICAgIH07XG4gICAgaTE4bi5vbignaW5pdGlhbGl6ZWQnLCBpbml0aWFsaXplZCk7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgbG9hZE5hbWVzcGFjZXMgPSAoaTE4biwgbnMsIGNiKSA9PiB7XG4gIGkxOG4ubG9hZE5hbWVzcGFjZXMobnMsIGxvYWRlZENsYihpMThuLCBjYikpO1xufTtcbmV4cG9ydCBjb25zdCBsb2FkTGFuZ3VhZ2VzID0gKGkxOG4sIGxuZywgbnMsIGNiKSA9PiB7XG4gIGlmIChpc1N0cmluZyhucykpIG5zID0gW25zXTtcbiAgbnMuZm9yRWFjaChuID0+IHtcbiAgICBpZiAoaTE4bi5vcHRpb25zLm5zLmluZGV4T2YobikgPCAwKSBpMThuLm9wdGlvbnMubnMucHVzaChuKTtcbiAgfSk7XG4gIGkxOG4ubG9hZExhbmd1YWdlcyhsbmcsIGxvYWRlZENsYihpMThuLCBjYikpO1xufTtcbmV4cG9ydCBjb25zdCBoYXNMb2FkZWROYW1lc3BhY2UgPSAobnMsIGkxOG4sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoIWkxOG4ubGFuZ3VhZ2VzIHx8ICFpMThuLmxhbmd1YWdlcy5sZW5ndGgpIHtcbiAgICB3YXJuT25jZSgnaTE4bi5sYW5ndWFnZXMgd2VyZSB1bmRlZmluZWQgb3IgZW1wdHknLCBpMThuLmxhbmd1YWdlcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGkxOG4uaGFzTG9hZGVkTmFtZXNwYWNlKG5zLCB7XG4gICAgbG5nOiBvcHRpb25zLmxuZyxcbiAgICBwcmVjaGVjazogKGkxOG5JbnN0YW5jZSwgbG9hZE5vdFBlbmRpbmcpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLmJpbmRJMThuPy5pbmRleE9mKCdsYW5ndWFnZUNoYW5naW5nJykgPiAtMSAmJiBpMThuSW5zdGFuY2Uuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5iYWNrZW5kICYmIGkxOG5JbnN0YW5jZS5pc0xhbmd1YWdlQ2hhbmdpbmdUbyAmJiAhbG9hZE5vdFBlbmRpbmcoaTE4bkluc3RhbmNlLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvLCBucykpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xufTtcbmV4cG9ydCBjb25zdCBnZXREaXNwbGF5TmFtZSA9IENvbXBvbmVudCA9PiBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgKGlzU3RyaW5nKENvbXBvbmVudCkgJiYgQ29tcG9uZW50Lmxlbmd0aCA+IDAgPyBDb21wb25lbnQgOiAnVW5rbm93bicpO1xuZXhwb3J0IGNvbnN0IGlzU3RyaW5nID0gb2JqID0+IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnO1xuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gb2JqID0+IHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbDsiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU1NSIH0gZnJvbSAnLi91c2VTU1IuanMnO1xuaW1wb3J0IHsgY29tcG9zZUluaXRpYWxQcm9wcyB9IGZyb20gJy4vY29udGV4dC5qcyc7XG5pbXBvcnQgeyBnZXREaXNwbGF5TmFtZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuZXhwb3J0IGNvbnN0IHdpdGhTU1IgPSAoKSA9PiBmdW5jdGlvbiBFeHRlbmQoV3JhcHBlZENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBJMThuZXh0V2l0aFNTUih7XG4gICAgaW5pdGlhbEkxOG5TdG9yZSxcbiAgICBpbml0aWFsTGFuZ3VhZ2UsXG4gICAgLi4ucmVzdFxuICB9KSB7XG4gICAgdXNlU1NSKGluaXRpYWxJMThuU3RvcmUsIGluaXRpYWxMYW5ndWFnZSk7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwge1xuICAgICAgLi4ucmVzdFxuICAgIH0pO1xuICB9XG4gIEkxOG5leHRXaXRoU1NSLmdldEluaXRpYWxQcm9wcyA9IGNvbXBvc2VJbml0aWFsUHJvcHMoV3JhcHBlZENvbXBvbmVudCk7XG4gIEkxOG5leHRXaXRoU1NSLmRpc3BsYXlOYW1lID0gYHdpdGhJMThuZXh0U1NSKCR7Z2V0RGlzcGxheU5hbWUoV3JhcHBlZENvbXBvbmVudCl9KWA7XG4gIEkxOG5leHRXaXRoU1NSLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICByZXR1cm4gSTE4bmV4dFdpdGhTU1I7XG59OyIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQsIGZvcndhcmRSZWYgYXMgZm9yd2FyZFJlZlJlYWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuL3VzZVRyYW5zbGF0aW9uLmpzJztcbmltcG9ydCB7IGdldERpc3BsYXlOYW1lIH0gZnJvbSAnLi91dGlscy5qcyc7XG5leHBvcnQgY29uc3Qgd2l0aFRyYW5zbGF0aW9uID0gKG5zLCBvcHRpb25zID0ge30pID0+IGZ1bmN0aW9uIEV4dGVuZChXcmFwcGVkQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIEkxOG5leHRXaXRoVHJhbnNsYXRpb24oe1xuICAgIGZvcndhcmRlZFJlZixcbiAgICAuLi5yZXN0XG4gIH0pIHtcbiAgICBjb25zdCBbdCwgaTE4biwgcmVhZHldID0gdXNlVHJhbnNsYXRpb24obnMsIHtcbiAgICAgIC4uLnJlc3QsXG4gICAgICBrZXlQcmVmaXg6IG9wdGlvbnMua2V5UHJlZml4XG4gICAgfSk7XG4gICAgY29uc3QgcGFzc0Rvd25Qcm9wcyA9IHtcbiAgICAgIC4uLnJlc3QsXG4gICAgICB0LFxuICAgICAgaTE4bixcbiAgICAgIHRSZWFkeTogcmVhZHlcbiAgICB9O1xuICAgIGlmIChvcHRpb25zLndpdGhSZWYgJiYgZm9yd2FyZGVkUmVmKSB7XG4gICAgICBwYXNzRG93blByb3BzLnJlZiA9IGZvcndhcmRlZFJlZjtcbiAgICB9IGVsc2UgaWYgKCFvcHRpb25zLndpdGhSZWYgJiYgZm9yd2FyZGVkUmVmKSB7XG4gICAgICBwYXNzRG93blByb3BzLmZvcndhcmRlZFJlZiA9IGZvcndhcmRlZFJlZjtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwgcGFzc0Rvd25Qcm9wcyk7XG4gIH1cbiAgSTE4bmV4dFdpdGhUcmFuc2xhdGlvbi5kaXNwbGF5TmFtZSA9IGB3aXRoSTE4bmV4dFRyYW5zbGF0aW9uKCR7Z2V0RGlzcGxheU5hbWUoV3JhcHBlZENvbXBvbmVudCl9KWA7XG4gIEkxOG5leHRXaXRoVHJhbnNsYXRpb24uV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG4gIGNvbnN0IGZvcndhcmRSZWYgPSAocHJvcHMsIHJlZikgPT4gY3JlYXRlRWxlbWVudChJMThuZXh0V2l0aFRyYW5zbGF0aW9uLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGZvcndhcmRlZFJlZjogcmVmXG4gIH0pKTtcbiAgcmV0dXJuIG9wdGlvbnMud2l0aFJlZiA/IGZvcndhcmRSZWZSZWFjdChmb3J3YXJkUmVmKSA6IEkxOG5leHRXaXRoVHJhbnNsYXRpb247XG59OyIsIid1c2UgY2xpZW50JztcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGZvcndhcmRSZWYsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtYWtlRXZlbnRQcm9wcyBmcm9tICdtYWtlLWV2ZW50LXByb3BzJztcbmltcG9ydCBtYWtlQ2FuY2VsbGFibGUgZnJvbSAnbWFrZS1jYW5jZWxsYWJsZS1wcm9taXNlJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCB7IGRlcXVhbCB9IGZyb20gJ2RlcXVhbCc7XG5pbXBvcnQgKiBhcyBwZGZqcyBmcm9tICdwZGZqcy1kaXN0JztcbmltcG9ydCBEb2N1bWVudENvbnRleHQgZnJvbSAnLi9Eb2N1bWVudENvbnRleHQuanMnO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSAnLi9NZXNzYWdlLmpzJztcbmltcG9ydCBMaW5rU2VydmljZSBmcm9tICcuL0xpbmtTZXJ2aWNlLmpzJztcbmltcG9ydCBQYXNzd29yZFJlc3BvbnNlcyBmcm9tICcuL1Bhc3N3b3JkUmVzcG9uc2VzLmpzJztcbmltcG9ydCB7IGNhbmNlbFJ1bm5pbmdUYXNrLCBkYXRhVVJJdG9CeXRlU3RyaW5nLCBkaXNwbGF5Q09SU1dhcm5pbmcsIGlzQXJyYXlCdWZmZXIsIGlzQmxvYiwgaXNCcm93c2VyLCBpc0RhdGFVUkksIGxvYWRGcm9tRmlsZSwgfSBmcm9tICcuL3NoYXJlZC91dGlscy5qcyc7XG5pbXBvcnQgdXNlUmVzb2x2ZXIgZnJvbSAnLi9zaGFyZWQvaG9va3MvdXNlUmVzb2x2ZXIuanMnO1xuY29uc3QgeyBQREZEYXRhUmFuZ2VUcmFuc3BvcnQgfSA9IHBkZmpzO1xuY29uc3QgZGVmYXVsdE9uUGFzc3dvcmQgPSAoY2FsbGJhY2ssIHJlYXNvbikgPT4ge1xuICAgIHN3aXRjaCAocmVhc29uKSB7XG4gICAgICAgIGNhc2UgUGFzc3dvcmRSZXNwb25zZXMuTkVFRF9QQVNTV09SRDoge1xuICAgICAgICAgICAgY29uc3QgcGFzc3dvcmQgPSBwcm9tcHQoJ0VudGVyIHRoZSBwYXNzd29yZCB0byBvcGVuIHRoaXMgUERGIGZpbGUuJyk7XG4gICAgICAgICAgICBjYWxsYmFjayhwYXNzd29yZCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRDoge1xuICAgICAgICAgICAgY29uc3QgcGFzc3dvcmQgPSBwcm9tcHQoJ0ludmFsaWQgcGFzc3dvcmQuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgICAgICAgICBjYWxsYmFjayhwYXNzd29yZCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgIH1cbn07XG5mdW5jdGlvbiBpc1BhcmFtZXRlck9iamVjdChmaWxlKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgZmlsZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgZmlsZSAhPT0gbnVsbCAmJlxuICAgICAgICAoJ2RhdGEnIGluIGZpbGUgfHwgJ3JhbmdlJyBpbiBmaWxlIHx8ICd1cmwnIGluIGZpbGUpKTtcbn1cbi8qKlxuICogTG9hZHMgYSBkb2N1bWVudCBwYXNzZWQgdXNpbmcgYGZpbGVgIHByb3AuXG4gKi9cbmNvbnN0IERvY3VtZW50ID0gZm9yd2FyZFJlZihmdW5jdGlvbiBEb2N1bWVudChfYSwgcmVmKSB7XG4gICAgdmFyIHsgY2hpbGRyZW4sIGNsYXNzTmFtZSwgZXJyb3IgPSAnRmFpbGVkIHRvIGxvYWQgUERGIGZpbGUuJywgZXh0ZXJuYWxMaW5rUmVsLCBleHRlcm5hbExpbmtUYXJnZXQsIGZpbGUsIGlucHV0UmVmLCBpbWFnZVJlc291cmNlc1BhdGgsIGxvYWRpbmcgPSAnTG9hZGluZyBQREbigKYnLCBub0RhdGEgPSAnTm8gUERGIGZpbGUgc3BlY2lmaWVkLicsIG9uSXRlbUNsaWNrLCBvbkxvYWRFcnJvcjogb25Mb2FkRXJyb3JQcm9wcywgb25Mb2FkUHJvZ3Jlc3MsIG9uTG9hZFN1Y2Nlc3M6IG9uTG9hZFN1Y2Nlc3NQcm9wcywgb25QYXNzd29yZCA9IGRlZmF1bHRPblBhc3N3b3JkLCBvblNvdXJjZUVycm9yOiBvblNvdXJjZUVycm9yUHJvcHMsIG9uU291cmNlU3VjY2Vzczogb25Tb3VyY2VTdWNjZXNzUHJvcHMsIG9wdGlvbnMsIHJlbmRlck1vZGUsIHJvdGF0ZSB9ID0gX2EsIG90aGVyUHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiZXJyb3JcIiwgXCJleHRlcm5hbExpbmtSZWxcIiwgXCJleHRlcm5hbExpbmtUYXJnZXRcIiwgXCJmaWxlXCIsIFwiaW5wdXRSZWZcIiwgXCJpbWFnZVJlc291cmNlc1BhdGhcIiwgXCJsb2FkaW5nXCIsIFwibm9EYXRhXCIsIFwib25JdGVtQ2xpY2tcIiwgXCJvbkxvYWRFcnJvclwiLCBcIm9uTG9hZFByb2dyZXNzXCIsIFwib25Mb2FkU3VjY2Vzc1wiLCBcIm9uUGFzc3dvcmRcIiwgXCJvblNvdXJjZUVycm9yXCIsIFwib25Tb3VyY2VTdWNjZXNzXCIsIFwib3B0aW9uc1wiLCBcInJlbmRlck1vZGVcIiwgXCJyb3RhdGVcIl0pO1xuICAgIGNvbnN0IFtzb3VyY2VTdGF0ZSwgc291cmNlRGlzcGF0Y2hdID0gdXNlUmVzb2x2ZXIoKTtcbiAgICBjb25zdCB7IHZhbHVlOiBzb3VyY2UsIGVycm9yOiBzb3VyY2VFcnJvciB9ID0gc291cmNlU3RhdGU7XG4gICAgY29uc3QgW3BkZlN0YXRlLCBwZGZEaXNwYXRjaF0gPSB1c2VSZXNvbHZlcigpO1xuICAgIGNvbnN0IHsgdmFsdWU6IHBkZiwgZXJyb3I6IHBkZkVycm9yIH0gPSBwZGZTdGF0ZTtcbiAgICBjb25zdCBsaW5rU2VydmljZSA9IHVzZVJlZihuZXcgTGlua1NlcnZpY2UoKSk7XG4gICAgY29uc3QgcGFnZXMgPSB1c2VSZWYoW10pO1xuICAgIGNvbnN0IHByZXZGaWxlID0gdXNlUmVmKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcHJldk9wdGlvbnMgPSB1c2VSZWYodW5kZWZpbmVkKTtcbiAgICBpZiAoZmlsZSAmJiBmaWxlICE9PSBwcmV2RmlsZS5jdXJyZW50ICYmIGlzUGFyYW1ldGVyT2JqZWN0KGZpbGUpKSB7XG4gICAgICAgIHdhcm5pbmcoIWRlcXVhbChmaWxlLCBwcmV2RmlsZS5jdXJyZW50KSwgYEZpbGUgcHJvcCBwYXNzZWQgdG8gPERvY3VtZW50IC8+IGNoYW5nZWQsIGJ1dCBpdCdzIGVxdWFsIHRvIHByZXZpb3VzIG9uZS4gVGhpcyBtaWdodCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgcmVsb2Fkcy4gQ29uc2lkZXIgbWVtb2l6aW5nIHRoZSB2YWx1ZSBwYXNzZWQgdG8gXCJmaWxlXCIgcHJvcC5gKTtcbiAgICAgICAgcHJldkZpbGUuY3VycmVudCA9IGZpbGU7XG4gICAgfVxuICAgIC8vIERldGVjdCBub24tbWVtb2l6ZWQgY2hhbmdlcyBpbiBvcHRpb25zIHByb3BcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zICE9PSBwcmV2T3B0aW9ucy5jdXJyZW50KSB7XG4gICAgICAgIHdhcm5pbmcoIWRlcXVhbChvcHRpb25zLCBwcmV2T3B0aW9ucy5jdXJyZW50KSwgYE9wdGlvbnMgcHJvcCBwYXNzZWQgdG8gPERvY3VtZW50IC8+IGNoYW5nZWQsIGJ1dCBpdCdzIGVxdWFsIHRvIHByZXZpb3VzIG9uZS4gVGhpcyBtaWdodCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgcmVsb2Fkcy4gQ29uc2lkZXIgbWVtb2l6aW5nIHRoZSB2YWx1ZSBwYXNzZWQgdG8gXCJvcHRpb25zXCIgcHJvcC5gKTtcbiAgICAgICAgcHJldk9wdGlvbnMuY3VycmVudCA9IG9wdGlvbnM7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdlciA9IHVzZVJlZih7XG4gICAgICAgIC8vIEhhbmRsaW5nIGp1bXBpbmcgdG8gaW50ZXJuYWwgbGlua3MgdGFyZ2V0XG4gICAgICAgIHNjcm9sbFBhZ2VJbnRvVmlldzogKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGVzdCwgcGFnZU51bWJlciwgcGFnZUluZGV4ID0gcGFnZU51bWJlciAtIDEgfSA9IGFyZ3M7XG4gICAgICAgICAgICAvLyBGaXJzdCwgY2hlY2sgaWYgY3VzdG9tIGhhbmRsaW5nIG9mIG9uSXRlbUNsaWNrIHdhcyBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKG9uSXRlbUNsaWNrKSB7XG4gICAgICAgICAgICAgICAgb25JdGVtQ2xpY2soeyBkZXN0LCBwYWdlSW5kZXgsIHBhZ2VOdW1iZXIgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm90LCB0cnkgdG8gbG9vayBmb3IgdGFyZ2V0IHBhZ2Ugd2l0aGluIHRoZSA8RG9jdW1lbnQ+LlxuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHBhZ2VzLmN1cnJlbnRbcGFnZUluZGV4XTtcbiAgICAgICAgICAgIGlmIChwYWdlKSB7XG4gICAgICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBwYWdlIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAgICAgICBwYWdlLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2FybmluZyhmYWxzZSwgYEFuIGludGVybmFsIGxpbmsgbGVhZGluZyB0byBwYWdlICR7cGFnZU51bWJlcn0gd2FzIGNsaWNrZWQsIGJ1dCBuZWl0aGVyIDxEb2N1bWVudD4gd2FzIHByb3ZpZGVkIHdpdGggb25JdGVtQ2xpY2sgbm9yIGl0IHdhcyBhYmxlIHRvIGZpbmQgdGhlIHBhZ2Ugd2l0aGluIGl0c2VsZi4gRWl0aGVyIHByb3ZpZGUgb25JdGVtQ2xpY2sgdG8gPERvY3VtZW50PiBhbmQgaGFuZGxlIG5hdmlnYXRpbmcgYnkgeW91cnNlbGYgb3IgZW5zdXJlIHRoYXQgYWxsIHBhZ2VzIGFyZSByZW5kZXJlZCB3aXRoaW4gPERvY3VtZW50Pi5gKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHtcbiAgICAgICAgbGlua1NlcnZpY2UsXG4gICAgICAgIHBhZ2VzLFxuICAgICAgICB2aWV3ZXIsXG4gICAgfSksIFtdKTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIGRvY3VtZW50IHNvdXJjZSBpcyByZXNvbHZlZCBjb3JyZWN0bHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvblNvdXJjZVN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmIChvblNvdXJjZVN1Y2Nlc3NQcm9wcykge1xuICAgICAgICAgICAgb25Tb3VyY2VTdWNjZXNzUHJvcHMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIGRvY3VtZW50IHNvdXJjZSBmYWlsZWQgdG8gYmUgcmVzb2x2ZWQgY29ycmVjdGx5XG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Tb3VyY2VFcnJvcigpIHtcbiAgICAgICAgaWYgKCFzb3VyY2VFcnJvcikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKGZhbHNlLCBzb3VyY2VFcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKG9uU291cmNlRXJyb3JQcm9wcykge1xuICAgICAgICAgICAgb25Tb3VyY2VFcnJvclByb3BzKHNvdXJjZUVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZXNldFNvdXJjZSgpIHtcbiAgICAgICAgc291cmNlRGlzcGF0Y2goeyB0eXBlOiAnUkVTRVQnIH0pO1xuICAgIH1cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Jpb21lanMvYmlvbWUvaXNzdWVzLzMwODBcbiAgICB1c2VFZmZlY3QocmVzZXRTb3VyY2UsIFtmaWxlLCBzb3VyY2VEaXNwYXRjaF0pO1xuICAgIGNvbnN0IGZpbmREb2N1bWVudFNvdXJjZSA9IHVzZUNhbGxiYWNrKCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxlIGlzIGEgc3RyaW5nXG4gICAgICAgIGlmICh0eXBlb2YgZmlsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChpc0RhdGFVUkkoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlQnl0ZVN0cmluZyA9IGRhdGFVUkl0b0J5dGVTdHJpbmcoZmlsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogZmlsZUJ5dGVTdHJpbmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BsYXlDT1JTV2FybmluZygpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdXJsOiBmaWxlIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlsZSBpcyBQREZEYXRhUmFuZ2VUcmFuc3BvcnRcbiAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJhbmdlOiBmaWxlIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlsZSBpcyBhbiBBcnJheUJ1ZmZlclxuICAgICAgICBpZiAoaXNBcnJheUJ1ZmZlcihmaWxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogZmlsZSB9O1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgY2FzZXMgYmVsb3cgYXJlIGJyb3dzZXItb25seS5cbiAgICAgICAgICogSWYgeW91J3JlIHJ1bm5pbmcgb24gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCwgdGhlc2UgY2FzZXMgd2lsbCBiZSBvZiBubyB1c2UuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoaXNCcm93c2VyKSB7XG4gICAgICAgICAgICAvLyBGaWxlIGlzIGEgQmxvYlxuICAgICAgICAgICAgaWYgKGlzQmxvYihmaWxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB5aWVsZCBsb2FkRnJvbUZpbGUoZmlsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGZpbGUgbXVzdCBiZSBhbiBvYmplY3RcbiAgICAgICAgaW52YXJpYW50KHR5cGVvZiBmaWxlID09PSAnb2JqZWN0JywgJ0ludmFsaWQgcGFyYW1ldGVyIGluIGZpbGUsIG5lZWQgZWl0aGVyIFVpbnQ4QXJyYXksIHN0cmluZyBvciBhIHBhcmFtZXRlciBvYmplY3QnKTtcbiAgICAgICAgaW52YXJpYW50KGlzUGFyYW1ldGVyT2JqZWN0KGZpbGUpLCAnSW52YWxpZCBwYXJhbWV0ZXIgb2JqZWN0OiBuZWVkIGVpdGhlciAuZGF0YSwgLnJhbmdlIG9yIC51cmwnKTtcbiAgICAgICAgLy8gRmlsZSAudXJsIGlzIGEgc3RyaW5nXG4gICAgICAgIGlmICgndXJsJyBpbiBmaWxlICYmIHR5cGVvZiBmaWxlLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChpc0RhdGFVUkkoZmlsZS51cmwpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB1cmwgfSA9IGZpbGUsIG90aGVyUGFyYW1zID0gX19yZXN0KGZpbGUsIFtcInVybFwiXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZUJ5dGVTdHJpbmcgPSBkYXRhVVJJdG9CeXRlU3RyaW5nKHVybCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBkYXRhOiBmaWxlQnl0ZVN0cmluZyB9LCBvdGhlclBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwbGF5Q09SU1dhcm5pbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICB9KSwgW2ZpbGVdKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBjYW5jZWxsYWJsZSA9IG1ha2VDYW5jZWxsYWJsZShmaW5kRG9jdW1lbnRTb3VyY2UoKSk7XG4gICAgICAgIGNhbmNlbGxhYmxlLnByb21pc2VcbiAgICAgICAgICAgIC50aGVuKChuZXh0U291cmNlKSA9PiB7XG4gICAgICAgICAgICBzb3VyY2VEaXNwYXRjaCh7IHR5cGU6ICdSRVNPTFZFJywgdmFsdWU6IG5leHRTb3VyY2UgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBzb3VyY2VEaXNwYXRjaCh7IHR5cGU6ICdSRUpFQ1QnLCBlcnJvciB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjYW5jZWxSdW5uaW5nVGFzayhjYW5jZWxsYWJsZSk7XG4gICAgICAgIH07XG4gICAgfSwgW2ZpbmREb2N1bWVudFNvdXJjZSwgc291cmNlRGlzcGF0Y2hdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBPbW1pdHRlZCBjYWxsYmFja3Mgc28gdGhleSBhcmUgbm90IGNhbGxlZCBldmVyeSB0aW1lIHRoZXkgY2hhbmdlXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG9uU291cmNlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvblNvdXJjZVN1Y2Nlc3MoKTtcbiAgICB9LCBbc291cmNlXSk7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBkb2N1bWVudCBpcyByZWFkIHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTG9hZFN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmICghcGRmKSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbkxvYWRTdWNjZXNzUHJvcHMpIHtcbiAgICAgICAgICAgIG9uTG9hZFN1Y2Nlc3NQcm9wcyhwZGYpO1xuICAgICAgICB9XG4gICAgICAgIHBhZ2VzLmN1cnJlbnQgPSBuZXcgQXJyYXkocGRmLm51bVBhZ2VzKTtcbiAgICAgICAgbGlua1NlcnZpY2UuY3VycmVudC5zZXREb2N1bWVudChwZGYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIGRvY3VtZW50IGZhaWxlZCB0byByZWFkIHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTG9hZEVycm9yKCkge1xuICAgICAgICBpZiAoIXBkZkVycm9yKSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsIHBkZkVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAob25Mb2FkRXJyb3JQcm9wcykge1xuICAgICAgICAgICAgb25Mb2FkRXJyb3JQcm9wcyhwZGZFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdXNlRWZmZWN0IGludGVudGlvbmFsbHkgdHJpZ2dlcmVkIG9uIHNvdXJjZSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gcmVzZXREb2N1bWVudCgpIHtcbiAgICAgICAgcGRmRGlzcGF0Y2goeyB0eXBlOiAnUkVTRVQnIH0pO1xuICAgIH0sIFtwZGZEaXNwYXRjaCwgc291cmNlXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiBsb2FkRG9jdW1lbnQoKSB7XG4gICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jdW1lbnRJbml0UGFyYW1zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UpLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZGVzdHJveWFibGUgPSBwZGZqcy5nZXREb2N1bWVudChkb2N1bWVudEluaXRQYXJhbXMpO1xuICAgICAgICBpZiAob25Mb2FkUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIGRlc3Ryb3lhYmxlLm9uUHJvZ3Jlc3MgPSBvbkxvYWRQcm9ncmVzcztcbiAgICAgICAgfVxuICAgICAgICBpZiAob25QYXNzd29yZCkge1xuICAgICAgICAgICAgZGVzdHJveWFibGUub25QYXNzd29yZCA9IG9uUGFzc3dvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbG9hZGluZ1Rhc2sgPSBkZXN0cm95YWJsZTtcbiAgICAgICAgbG9hZGluZ1Rhc2sucHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKG5leHRQZGYpID0+IHtcbiAgICAgICAgICAgIHBkZkRpc3BhdGNoKHsgdHlwZTogJ1JFU09MVkUnLCB2YWx1ZTogbmV4dFBkZiB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChsb2FkaW5nVGFzay5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwZGZEaXNwYXRjaCh7IHR5cGU6ICdSRUpFQ1QnLCBlcnJvciB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBsb2FkaW5nVGFzay5kZXN0cm95KCk7XG4gICAgICAgIH07XG4gICAgfSwgW29wdGlvbnMsIHBkZkRpc3BhdGNoLCBzb3VyY2VdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBPbW1pdHRlZCBjYWxsYmFja3Mgc28gdGhleSBhcmUgbm90IGNhbGxlZCBldmVyeSB0aW1lIHRoZXkgY2hhbmdlXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwZGYgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBkZiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG9uTG9hZEVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb25Mb2FkU3VjY2VzcygpO1xuICAgIH0sIFtwZGZdKTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gc2V0dXBMaW5rU2VydmljZSgpIHtcbiAgICAgICAgbGlua1NlcnZpY2UuY3VycmVudC5zZXRWaWV3ZXIodmlld2VyLmN1cnJlbnQpO1xuICAgICAgICBsaW5rU2VydmljZS5jdXJyZW50LnNldEV4dGVybmFsTGlua1JlbChleHRlcm5hbExpbmtSZWwpO1xuICAgICAgICBsaW5rU2VydmljZS5jdXJyZW50LnNldEV4dGVybmFsTGlua1RhcmdldChleHRlcm5hbExpbmtUYXJnZXQpO1xuICAgIH0sIFtleHRlcm5hbExpbmtSZWwsIGV4dGVybmFsTGlua1RhcmdldF0pO1xuICAgIGNvbnN0IHJlZ2lzdGVyUGFnZSA9IHVzZUNhbGxiYWNrKChwYWdlSW5kZXgsIHJlZikgPT4ge1xuICAgICAgICBwYWdlcy5jdXJyZW50W3BhZ2VJbmRleF0gPSByZWY7XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IHVucmVnaXN0ZXJQYWdlID0gdXNlQ2FsbGJhY2soKHBhZ2VJbmRleCkgPT4ge1xuICAgICAgICBkZWxldGUgcGFnZXMuY3VycmVudFtwYWdlSW5kZXhdO1xuICAgIH0sIFtdKTtcbiAgICBjb25zdCBjaGlsZENvbnRleHQgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgICAgIGltYWdlUmVzb3VyY2VzUGF0aCxcbiAgICAgICAgbGlua1NlcnZpY2U6IGxpbmtTZXJ2aWNlLmN1cnJlbnQsXG4gICAgICAgIG9uSXRlbUNsaWNrLFxuICAgICAgICBwZGYsXG4gICAgICAgIHJlZ2lzdGVyUGFnZSxcbiAgICAgICAgcmVuZGVyTW9kZSxcbiAgICAgICAgcm90YXRlLFxuICAgICAgICB1bnJlZ2lzdGVyUGFnZSxcbiAgICB9KSwgW2ltYWdlUmVzb3VyY2VzUGF0aCwgb25JdGVtQ2xpY2ssIHBkZiwgcmVnaXN0ZXJQYWdlLCByZW5kZXJNb2RlLCByb3RhdGUsIHVucmVnaXN0ZXJQYWdlXSk7XG4gICAgY29uc3QgZXZlbnRQcm9wcyA9IHVzZU1lbW8oKCkgPT4gbWFrZUV2ZW50UHJvcHMob3RoZXJQcm9wcywgKCkgPT4gcGRmKSwgXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogRklYTUVcbiAgICBbb3RoZXJQcm9wcywgcGRmXSk7XG4gICAgZnVuY3Rpb24gcmVuZGVyQ2hpbGRyZW4oKSB7XG4gICAgICAgIHJldHVybiBfanN4KERvY3VtZW50Q29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogY2hpbGRDb250ZXh0LCBjaGlsZHJlbjogY2hpbGRyZW4gfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoKSB7XG4gICAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9qc3goTWVzc2FnZSwgeyB0eXBlOiBcIm5vLWRhdGFcIiwgY2hpbGRyZW46IHR5cGVvZiBub0RhdGEgPT09ICdmdW5jdGlvbicgPyBub0RhdGEoKSA6IG5vRGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGRmID09PSB1bmRlZmluZWQgfHwgcGRmID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gKF9qc3goTWVzc2FnZSwgeyB0eXBlOiBcImxvYWRpbmdcIiwgY2hpbGRyZW46IHR5cGVvZiBsb2FkaW5nID09PSAnZnVuY3Rpb24nID8gbG9hZGluZygpIDogbG9hZGluZyB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBkZiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBfanN4KE1lc3NhZ2UsIHsgdHlwZTogXCJlcnJvclwiLCBjaGlsZHJlbjogdHlwZW9mIGVycm9yID09PSAnZnVuY3Rpb24nID8gZXJyb3IoKSA6IGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZW5kZXJDaGlsZHJlbigpO1xuICAgIH1cbiAgICByZXR1cm4gKF9qc3goXCJkaXZcIiwgT2JqZWN0LmFzc2lnbih7IGNsYXNzTmFtZTogY2xzeCgncmVhY3QtcGRmX19Eb2N1bWVudCcsIGNsYXNzTmFtZSksIFxuICAgICAgICAvLyBBc3NlcnRpb24gaXMgbmVlZGVkIGZvciBSZWFjdCAxOCBjb21wYXRpYmlsaXR5XG4gICAgICAgIHJlZjogaW5wdXRSZWYsIHN0eWxlOiB7XG4gICAgICAgICAgICBbJy0tc2NhbGUtZmFjdG9yJ106ICcxJyxcbiAgICAgICAgfSB9LCBldmVudFByb3BzLCB7IGNoaWxkcmVuOiByZW5kZXJDb250ZW50KCkgfSkpKTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgRG9jdW1lbnQ7XG4iLCIndXNlIGNsaWVudCc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuY29uc3QgZG9jdW1lbnRDb250ZXh0ID0gY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBkZWZhdWx0IGRvY3VtZW50Q29udGV4dDtcbiIsIi8qIENvcHlyaWdodCAyMDE1IE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5jb25zdCBERUZBVUxUX0xJTktfUkVMID0gJ25vb3BlbmVyIG5vcmVmZXJyZXIgbm9mb2xsb3cnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlua1NlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmV4dGVybmFsTGlua0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmV4dGVybmFsTGlua1JlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5leHRlcm5hbExpbmtUYXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wZGZEb2N1bWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wZGZWaWV3ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHNldERvY3VtZW50KHBkZkRvY3VtZW50KSB7XG4gICAgICAgIHRoaXMucGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDtcbiAgICB9XG4gICAgc2V0Vmlld2VyKHBkZlZpZXdlcikge1xuICAgICAgICB0aGlzLnBkZlZpZXdlciA9IHBkZlZpZXdlcjtcbiAgICB9XG4gICAgc2V0RXh0ZXJuYWxMaW5rUmVsKGV4dGVybmFsTGlua1JlbCkge1xuICAgICAgICB0aGlzLmV4dGVybmFsTGlua1JlbCA9IGV4dGVybmFsTGlua1JlbDtcbiAgICB9XG4gICAgc2V0RXh0ZXJuYWxMaW5rVGFyZ2V0KGV4dGVybmFsTGlua1RhcmdldCkge1xuICAgICAgICB0aGlzLmV4dGVybmFsTGlua1RhcmdldCA9IGV4dGVybmFsTGlua1RhcmdldDtcbiAgICB9XG4gICAgc2V0SGlzdG9yeSgpIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIH1cbiAgICBnZXQgcGFnZXNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQgPyB0aGlzLnBkZkRvY3VtZW50Lm51bVBhZ2VzIDogMDtcbiAgICB9XG4gICAgZ2V0IHBhZ2UoKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLnBkZlZpZXdlciwgJ1BERiB2aWV3ZXIgaXMgbm90IGluaXRpYWxpemVkLicpO1xuICAgICAgICByZXR1cm4gdGhpcy5wZGZWaWV3ZXIuY3VycmVudFBhZ2VOdW1iZXIgfHwgMDtcbiAgICB9XG4gICAgc2V0IHBhZ2UodmFsdWUpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMucGRmVmlld2VyLCAnUERGIHZpZXdlciBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIHRoaXMucGRmVmlld2VyLmN1cnJlbnRQYWdlTnVtYmVyID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCByb3RhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHNldCByb3RhdGlvbih2YWx1ZSkge1xuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGVtcHR5XG4gICAgfVxuICAgIGdvVG9EZXN0aW5hdGlvbihkZXN0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaW52YXJpYW50KHRoaXMucGRmRG9jdW1lbnQsICdQREYgZG9jdW1lbnQgbm90IGxvYWRlZC4nKTtcbiAgICAgICAgICAgIGludmFyaWFudChkZXN0LCAnRGVzdGluYXRpb24gaXMgbm90IHNwZWNpZmllZC4nKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBkZkRvY3VtZW50LmdldERlc3RpbmF0aW9uKGRlc3QpLnRoZW4ocmVzb2x2ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRlc3QpKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlc3QudGhlbihyZXNvbHZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbigoZXhwbGljaXREZXN0KSA9PiB7XG4gICAgICAgICAgICBpbnZhcmlhbnQoQXJyYXkuaXNBcnJheShleHBsaWNpdERlc3QpLCBgXCIke2V4cGxpY2l0RGVzdH1cIiBpcyBub3QgYSB2YWxpZCBkZXN0aW5hdGlvbiBhcnJheS5gKTtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RSZWYgPSBleHBsaWNpdERlc3RbMF07XG4gICAgICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGludmFyaWFudCh0aGlzLnBkZkRvY3VtZW50LCAnUERGIGRvY3VtZW50IG5vdCBsb2FkZWQuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3RSZWYgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZGZEb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhZ2VJbmRleChkZXN0UmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHBhZ2VJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShwYWdlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmFyaWFudChmYWxzZSwgYFwiJHtkZXN0UmVmfVwiIGlzIG5vdCBhIHZhbGlkIHBhZ2UgcmVmZXJlbmNlLmApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlc3RSZWYgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdFJlZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbnZhcmlhbnQoZmFsc2UsIGBcIiR7ZGVzdFJlZn1cIiBpcyBub3QgYSB2YWxpZCBkZXN0aW5hdGlvbiByZWZlcmVuY2UuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkudGhlbigocGFnZUluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZU51bWJlciA9IHBhZ2VJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgaW52YXJpYW50KHRoaXMucGRmVmlld2VyLCAnUERGIHZpZXdlciBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgICAgICAgICAgaW52YXJpYW50KHBhZ2VOdW1iZXIgPj0gMSAmJiBwYWdlTnVtYmVyIDw9IHRoaXMucGFnZXNDb3VudCwgYFwiJHtwYWdlTnVtYmVyfVwiIGlzIG5vdCBhIHZhbGlkIHBhZ2UgbnVtYmVyLmApO1xuICAgICAgICAgICAgICAgIHRoaXMucGRmVmlld2VyLnNjcm9sbFBhZ2VJbnRvVmlldyh7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Q6IGV4cGxpY2l0RGVzdCxcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuYXZpZ2F0ZVRvKGRlc3QpIHtcbiAgICAgICAgdGhpcy5nb1RvRGVzdGluYXRpb24oZGVzdCk7XG4gICAgfVxuICAgIGdvVG9QYWdlKHBhZ2VOdW1iZXIpIHtcbiAgICAgICAgY29uc3QgcGFnZUluZGV4ID0gcGFnZU51bWJlciAtIDE7XG4gICAgICAgIGludmFyaWFudCh0aGlzLnBkZlZpZXdlciwgJ1BERiB2aWV3ZXIgaXMgbm90IGluaXRpYWxpemVkLicpO1xuICAgICAgICBpbnZhcmlhbnQocGFnZU51bWJlciA+PSAxICYmIHBhZ2VOdW1iZXIgPD0gdGhpcy5wYWdlc0NvdW50LCBgXCIke3BhZ2VOdW1iZXJ9XCIgaXMgbm90IGEgdmFsaWQgcGFnZSBudW1iZXIuYCk7XG4gICAgICAgIHRoaXMucGRmVmlld2VyLnNjcm9sbFBhZ2VJbnRvVmlldyh7XG4gICAgICAgICAgICBwYWdlSW5kZXgsXG4gICAgICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkTGlua0F0dHJpYnV0ZXMobGluaywgdXJsLCBuZXdXaW5kb3cpIHtcbiAgICAgICAgbGluay5ocmVmID0gdXJsO1xuICAgICAgICBsaW5rLnJlbCA9IHRoaXMuZXh0ZXJuYWxMaW5rUmVsIHx8IERFRkFVTFRfTElOS19SRUw7XG4gICAgICAgIGxpbmsudGFyZ2V0ID0gbmV3V2luZG93ID8gJ19ibGFuaycgOiB0aGlzLmV4dGVybmFsTGlua1RhcmdldCB8fCAnJztcbiAgICB9XG4gICAgZ2V0RGVzdGluYXRpb25IYXNoKCkge1xuICAgICAgICByZXR1cm4gJyMnO1xuICAgIH1cbiAgICBnZXRBbmNob3JVcmwoKSB7XG4gICAgICAgIHJldHVybiAnIyc7XG4gICAgfVxuICAgIHNldEhhc2goKSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgZW1wdHlcbiAgICB9XG4gICAgZXhlY3V0ZU5hbWVkQWN0aW9uKCkge1xuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGVtcHR5XG4gICAgfVxuICAgIGNhY2hlUGFnZVJlZigpIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIH1cbiAgICBpc1BhZ2VWaXNpYmxlKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaXNQYWdlQ2FjaGVkKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZXhlY3V0ZVNldE9DR1N0YXRlKCkge1xuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGVtcHR5XG4gICAgfVxufVxuIiwiaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1lc3NhZ2UoeyBjaGlsZHJlbiwgdHlwZSB9KSB7XG4gICAgcmV0dXJuIF9qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IGByZWFjdC1wZGZfX21lc3NhZ2UgcmVhY3QtcGRmX19tZXNzYWdlLS0ke3R5cGV9YCwgY2hpbGRyZW46IGNoaWxkcmVuIH0pO1xufVxuIiwiJ3VzZSBjbGllbnQnO1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1ha2VDYW5jZWxsYWJsZSBmcm9tICdtYWtlLWNhbmNlbGxhYmxlLXByb21pc2UnO1xuaW1wb3J0IG1ha2VFdmVudFByb3BzIGZyb20gJ21ha2UtZXZlbnQtcHJvcHMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgbWVyZ2VSZWZzIGZyb20gJ21lcmdlLXJlZnMnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCBQYWdlQ29udGV4dCBmcm9tICcuL1BhZ2VDb250ZXh0LmpzJztcbmltcG9ydCBNZXNzYWdlIGZyb20gJy4vTWVzc2FnZS5qcyc7XG5pbXBvcnQgQ2FudmFzIGZyb20gJy4vUGFnZS9DYW52YXMuanMnO1xuaW1wb3J0IFRleHRMYXllciBmcm9tICcuL1BhZ2UvVGV4dExheWVyLmpzJztcbmltcG9ydCBBbm5vdGF0aW9uTGF5ZXIgZnJvbSAnLi9QYWdlL0Fubm90YXRpb25MYXllci5qcyc7XG5pbXBvcnQgeyBjYW5jZWxSdW5uaW5nVGFzaywgaXNQcm92aWRlZCwgbWFrZVBhZ2VDYWxsYmFjayB9IGZyb20gJy4vc2hhcmVkL3V0aWxzLmpzJztcbmltcG9ydCB1c2VEb2N1bWVudENvbnRleHQgZnJvbSAnLi9zaGFyZWQvaG9va3MvdXNlRG9jdW1lbnRDb250ZXh0LmpzJztcbmltcG9ydCB1c2VSZXNvbHZlciBmcm9tICcuL3NoYXJlZC9ob29rcy91c2VSZXNvbHZlci5qcyc7XG5jb25zdCBkZWZhdWx0U2NhbGUgPSAxO1xuLyoqXG4gKiBEaXNwbGF5cyBhIHBhZ2UuXG4gKlxuICogU2hvdWxkIGJlIHBsYWNlZCBpbnNpZGUgYDxEb2N1bWVudCAvPmAuIEFsdGVybmF0aXZlbHksIGl0IGNhbiBoYXZlIGBwZGZgIHByb3AgcGFzc2VkLCB3aGljaCBjYW4gYmUgb2J0YWluZWQgZnJvbSBgPERvY3VtZW50IC8+YCdzIGBvbkxvYWRTdWNjZXNzYCBjYWxsYmFjayBmdW5jdGlvbiwgaG93ZXZlciBzb21lIGFkdmFuY2VkIGZ1bmN0aW9ucyBsaWtlIGxpbmtpbmcgYmV0d2VlbiBwYWdlcyBpbnNpZGUgYSBkb2N1bWVudCBtYXkgbm90IGJlIHdvcmtpbmcgY29ycmVjdGx5LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQYWdlKHByb3BzKSB7XG4gICAgY29uc3QgZG9jdW1lbnRDb250ZXh0ID0gdXNlRG9jdW1lbnRDb250ZXh0KCk7XG4gICAgY29uc3QgbWVyZ2VkUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRvY3VtZW50Q29udGV4dCksIHByb3BzKTtcbiAgICBjb25zdCB7IF9jbGFzc05hbWUgPSAncmVhY3QtcGRmX19QYWdlJywgX2VuYWJsZVJlZ2lzdGVyVW5yZWdpc3RlclBhZ2UgPSB0cnVlLCBjYW52YXNCYWNrZ3JvdW5kLCBjYW52YXNSZWYsIGNoaWxkcmVuLCBjbGFzc05hbWUsIGN1c3RvbVJlbmRlcmVyOiBDdXN0b21SZW5kZXJlciwgY3VzdG9tVGV4dFJlbmRlcmVyLCBkZXZpY2VQaXhlbFJhdGlvLCBlcnJvciA9ICdGYWlsZWQgdG8gbG9hZCB0aGUgcGFnZS4nLCBoZWlnaHQsIGlucHV0UmVmLCBsb2FkaW5nID0gJ0xvYWRpbmcgcGFnZeKApicsIG5vRGF0YSA9ICdObyBwYWdlIHNwZWNpZmllZC4nLCBvbkdldEFubm90YXRpb25zRXJyb3I6IG9uR2V0QW5ub3RhdGlvbnNFcnJvclByb3BzLCBvbkdldEFubm90YXRpb25zU3VjY2Vzczogb25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3NQcm9wcywgb25HZXRTdHJ1Y3RUcmVlRXJyb3I6IG9uR2V0U3RydWN0VHJlZUVycm9yUHJvcHMsIG9uR2V0U3RydWN0VHJlZVN1Y2Nlc3M6IG9uR2V0U3RydWN0VHJlZVN1Y2Nlc3NQcm9wcywgb25HZXRUZXh0RXJyb3I6IG9uR2V0VGV4dEVycm9yUHJvcHMsIG9uR2V0VGV4dFN1Y2Nlc3M6IG9uR2V0VGV4dFN1Y2Nlc3NQcm9wcywgb25Mb2FkRXJyb3I6IG9uTG9hZEVycm9yUHJvcHMsIG9uTG9hZFN1Y2Nlc3M6IG9uTG9hZFN1Y2Nlc3NQcm9wcywgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvcjogb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvclByb3BzLCBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3M6IG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyU3VjY2Vzc1Byb3BzLCBvblJlbmRlckVycm9yOiBvblJlbmRlckVycm9yUHJvcHMsIG9uUmVuZGVyU3VjY2Vzczogb25SZW5kZXJTdWNjZXNzUHJvcHMsIG9uUmVuZGVyVGV4dExheWVyRXJyb3I6IG9uUmVuZGVyVGV4dExheWVyRXJyb3JQcm9wcywgb25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzOiBvblJlbmRlclRleHRMYXllclN1Y2Nlc3NQcm9wcywgcGFnZUluZGV4OiBwYWdlSW5kZXhQcm9wcywgcGFnZU51bWJlcjogcGFnZU51bWJlclByb3BzLCBwZGYsIHJlZ2lzdGVyUGFnZSwgcmVuZGVyQW5ub3RhdGlvbkxheWVyOiByZW5kZXJBbm5vdGF0aW9uTGF5ZXJQcm9wcyA9IHRydWUsIHJlbmRlckZvcm1zID0gZmFsc2UsIHJlbmRlck1vZGUgPSAnY2FudmFzJywgcmVuZGVyVGV4dExheWVyOiByZW5kZXJUZXh0TGF5ZXJQcm9wcyA9IHRydWUsIHJvdGF0ZTogcm90YXRlUHJvcHMsIHNjYWxlOiBzY2FsZVByb3BzID0gZGVmYXVsdFNjYWxlLCB1bnJlZ2lzdGVyUGFnZSwgd2lkdGggfSA9IG1lcmdlZFByb3BzLCBvdGhlclByb3BzID0gX19yZXN0KG1lcmdlZFByb3BzLCBbXCJfY2xhc3NOYW1lXCIsIFwiX2VuYWJsZVJlZ2lzdGVyVW5yZWdpc3RlclBhZ2VcIiwgXCJjYW52YXNCYWNrZ3JvdW5kXCIsIFwiY2FudmFzUmVmXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjdXN0b21SZW5kZXJlclwiLCBcImN1c3RvbVRleHRSZW5kZXJlclwiLCBcImRldmljZVBpeGVsUmF0aW9cIiwgXCJlcnJvclwiLCBcImhlaWdodFwiLCBcImlucHV0UmVmXCIsIFwibG9hZGluZ1wiLCBcIm5vRGF0YVwiLCBcIm9uR2V0QW5ub3RhdGlvbnNFcnJvclwiLCBcIm9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzXCIsIFwib25HZXRTdHJ1Y3RUcmVlRXJyb3JcIiwgXCJvbkdldFN0cnVjdFRyZWVTdWNjZXNzXCIsIFwib25HZXRUZXh0RXJyb3JcIiwgXCJvbkdldFRleHRTdWNjZXNzXCIsIFwib25Mb2FkRXJyb3JcIiwgXCJvbkxvYWRTdWNjZXNzXCIsIFwib25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvclwiLCBcIm9uUmVuZGVyQW5ub3RhdGlvbkxheWVyU3VjY2Vzc1wiLCBcIm9uUmVuZGVyRXJyb3JcIiwgXCJvblJlbmRlclN1Y2Nlc3NcIiwgXCJvblJlbmRlclRleHRMYXllckVycm9yXCIsIFwib25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzXCIsIFwicGFnZUluZGV4XCIsIFwicGFnZU51bWJlclwiLCBcInBkZlwiLCBcInJlZ2lzdGVyUGFnZVwiLCBcInJlbmRlckFubm90YXRpb25MYXllclwiLCBcInJlbmRlckZvcm1zXCIsIFwicmVuZGVyTW9kZVwiLCBcInJlbmRlclRleHRMYXllclwiLCBcInJvdGF0ZVwiLCBcInNjYWxlXCIsIFwidW5yZWdpc3RlclBhZ2VcIiwgXCJ3aWR0aFwiXSk7XG4gICAgY29uc3QgW3BhZ2VTdGF0ZSwgcGFnZURpc3BhdGNoXSA9IHVzZVJlc29sdmVyKCk7XG4gICAgY29uc3QgeyB2YWx1ZTogcGFnZSwgZXJyb3I6IHBhZ2VFcnJvciB9ID0gcGFnZVN0YXRlO1xuICAgIGNvbnN0IHBhZ2VFbGVtZW50ID0gdXNlUmVmKG51bGwpO1xuICAgIGludmFyaWFudChwZGYsICdBdHRlbXB0ZWQgdG8gbG9hZCBhIHBhZ2UsIGJ1dCBubyBkb2N1bWVudCB3YXMgc3BlY2lmaWVkLiBXcmFwIDxQYWdlIC8+IGluIGEgPERvY3VtZW50IC8+IG9yIHBhc3MgZXhwbGljaXQgYHBkZmAgcHJvcC4nKTtcbiAgICBjb25zdCBwYWdlSW5kZXggPSBpc1Byb3ZpZGVkKHBhZ2VOdW1iZXJQcm9wcykgPyBwYWdlTnVtYmVyUHJvcHMgLSAxIDogcGFnZUluZGV4UHJvcHMgIT09IG51bGwgJiYgcGFnZUluZGV4UHJvcHMgIT09IHZvaWQgMCA/IHBhZ2VJbmRleFByb3BzIDogbnVsbDtcbiAgICBjb25zdCBwYWdlTnVtYmVyID0gcGFnZU51bWJlclByb3BzICE9PSBudWxsICYmIHBhZ2VOdW1iZXJQcm9wcyAhPT0gdm9pZCAwID8gcGFnZU51bWJlclByb3BzIDogKGlzUHJvdmlkZWQocGFnZUluZGV4UHJvcHMpID8gcGFnZUluZGV4UHJvcHMgKyAxIDogbnVsbCk7XG4gICAgY29uc3Qgcm90YXRlID0gcm90YXRlUHJvcHMgIT09IG51bGwgJiYgcm90YXRlUHJvcHMgIT09IHZvaWQgMCA/IHJvdGF0ZVByb3BzIDogKHBhZ2UgPyBwYWdlLnJvdGF0ZSA6IG51bGwpO1xuICAgIGNvbnN0IHNjYWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQmUgZGVmYXVsdCwgd2UnbGwgcmVuZGVyIHBhZ2UgYXQgMTAwJSAqIHNjYWxlIHdpZHRoLlxuICAgICAgICBsZXQgcGFnZVNjYWxlID0gMTtcbiAgICAgICAgLy8gUGFzc2luZyBzY2FsZSBleHBsaWNpdGx5IG51bGwgd291bGQgY2F1c2UgdGhlIHBhZ2Ugbm90IHRvIHJlbmRlclxuICAgICAgICBjb25zdCBzY2FsZVdpdGhEZWZhdWx0ID0gc2NhbGVQcm9wcyAhPT0gbnVsbCAmJiBzY2FsZVByb3BzICE9PSB2b2lkIDAgPyBzY2FsZVByb3BzIDogZGVmYXVsdFNjYWxlO1xuICAgICAgICAvLyBJZiB3aWR0aC9oZWlnaHQgaXMgZGVmaW5lZCwgY2FsY3VsYXRlIHRoZSBzY2FsZSBvZiB0aGUgcGFnZSBzbyBpdCBjb3VsZCBiZSBvZiBkZXNpcmVkIHdpZHRoLlxuICAgICAgICBpZiAod2lkdGggfHwgaGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZTogMSwgcm90YXRpb246IHJvdGF0ZSB9KTtcbiAgICAgICAgICAgIGlmICh3aWR0aCkge1xuICAgICAgICAgICAgICAgIHBhZ2VTY2FsZSA9IHdpZHRoIC8gdmlld3BvcnQud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBwYWdlU2NhbGUgPSBoZWlnaHQgLyB2aWV3cG9ydC5oZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjYWxlV2l0aERlZmF1bHQgKiBwYWdlU2NhbGU7XG4gICAgfSwgW2hlaWdodCwgcGFnZSwgcm90YXRlLCBzY2FsZVByb3BzLCB3aWR0aF0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IHVzZUVmZmVjdCBpbnRlbnRpb25hbGx5IHRyaWdnZXJlZCBvbiBwZGYgY2hhbmdlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIGhvb2soKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzUHJvdmlkZWQocGFnZUluZGV4KSkge1xuICAgICAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF9lbmFibGVSZWdpc3RlclVucmVnaXN0ZXJQYWdlICYmIHVucmVnaXN0ZXJQYWdlKSB7XG4gICAgICAgICAgICAgICAgdW5yZWdpc3RlclBhZ2UocGFnZUluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LCBbX2VuYWJsZVJlZ2lzdGVyVW5yZWdpc3RlclBhZ2UsIHBkZiwgcGFnZUluZGV4LCB1bnJlZ2lzdGVyUGFnZV0pO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgcGFnZSBpcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Mb2FkU3VjY2VzcygpIHtcbiAgICAgICAgaWYgKG9uTG9hZFN1Y2Nlc3NQcm9wcykge1xuICAgICAgICAgICAgaWYgKCFwYWdlIHx8ICFzY2FsZSkge1xuICAgICAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25Mb2FkU3VjY2Vzc1Byb3BzKG1ha2VQYWdlQ2FsbGJhY2socGFnZSwgc2NhbGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2VuYWJsZVJlZ2lzdGVyVW5yZWdpc3RlclBhZ2UgJiYgcmVnaXN0ZXJQYWdlKSB7XG4gICAgICAgICAgICBpZiAoIWlzUHJvdmlkZWQocGFnZUluZGV4KSB8fCAhcGFnZUVsZW1lbnQuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVnaXN0ZXJQYWdlKHBhZ2VJbmRleCwgcGFnZUVsZW1lbnQuY3VycmVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBwYWdlIGZhaWxlZCB0byBsb2FkXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Mb2FkRXJyb3IoKSB7XG4gICAgICAgIGlmICghcGFnZUVycm9yKSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsIHBhZ2VFcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKG9uTG9hZEVycm9yUHJvcHMpIHtcbiAgICAgICAgICAgIG9uTG9hZEVycm9yUHJvcHMocGFnZUVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiB1c2VFZmZlY3QgaW50ZW50aW9uYWxseSB0cmlnZ2VyZWQgb24gcGRmIGFuZCBwYWdlSW5kZXggY2hhbmdlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIHJlc2V0UGFnZSgpIHtcbiAgICAgICAgcGFnZURpc3BhdGNoKHsgdHlwZTogJ1JFU0VUJyB9KTtcbiAgICB9LCBbcGFnZURpc3BhdGNoLCBwZGYsIHBhZ2VJbmRleF0pO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiBsb2FkUGFnZSgpIHtcbiAgICAgICAgaWYgKCFwZGYgfHwgIXBhZ2VOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5jZWxsYWJsZSA9IG1ha2VDYW5jZWxsYWJsZShwZGYuZ2V0UGFnZShwYWdlTnVtYmVyKSk7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmdUYXNrID0gY2FuY2VsbGFibGU7XG4gICAgICAgIGNhbmNlbGxhYmxlLnByb21pc2VcbiAgICAgICAgICAgIC50aGVuKChuZXh0UGFnZSkgPT4ge1xuICAgICAgICAgICAgcGFnZURpc3BhdGNoKHsgdHlwZTogJ1JFU09MVkUnLCB2YWx1ZTogbmV4dFBhZ2UgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBwYWdlRGlzcGF0Y2goeyB0eXBlOiAnUkVKRUNUJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2FuY2VsUnVubmluZ1Rhc2socnVubmluZ1Rhc2spO1xuICAgIH0sIFtwYWdlRGlzcGF0Y2gsIHBkZiwgcGFnZU51bWJlcl0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAocGFnZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvbkxvYWRFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uTG9hZFN1Y2Nlc3MoKTtcbiAgICB9LCBbcGFnZSwgc2NhbGVdKTtcbiAgICBjb25zdCBjaGlsZENvbnRleHQgPSB1c2VNZW1vKCgpID0+IFxuICAgIC8vIFRlY2huaWNhbGx5IHRoZXJlIGNhbm5vdCBiZSBwYWdlIHdpdGhvdXQgcGFnZUluZGV4LCBwYWdlTnVtYmVyLCByb3RhdGUgYW5kIHNjYWxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgIHBhZ2UgJiYgaXNQcm92aWRlZChwYWdlSW5kZXgpICYmIHBhZ2VOdW1iZXIgJiYgaXNQcm92aWRlZChyb3RhdGUpICYmIGlzUHJvdmlkZWQoc2NhbGUpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgX2NsYXNzTmFtZSxcbiAgICAgICAgICAgIGNhbnZhc0JhY2tncm91bmQsXG4gICAgICAgICAgICBjdXN0b21UZXh0UmVuZGVyZXIsXG4gICAgICAgICAgICBkZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgb25HZXRBbm5vdGF0aW9uc0Vycm9yOiBvbkdldEFubm90YXRpb25zRXJyb3JQcm9wcyxcbiAgICAgICAgICAgIG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzOiBvbkdldEFubm90YXRpb25zU3VjY2Vzc1Byb3BzLFxuICAgICAgICAgICAgb25HZXRTdHJ1Y3RUcmVlRXJyb3I6IG9uR2V0U3RydWN0VHJlZUVycm9yUHJvcHMsXG4gICAgICAgICAgICBvbkdldFN0cnVjdFRyZWVTdWNjZXNzOiBvbkdldFN0cnVjdFRyZWVTdWNjZXNzUHJvcHMsXG4gICAgICAgICAgICBvbkdldFRleHRFcnJvcjogb25HZXRUZXh0RXJyb3JQcm9wcyxcbiAgICAgICAgICAgIG9uR2V0VGV4dFN1Y2Nlc3M6IG9uR2V0VGV4dFN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgICAgIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3I6IG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3JQcm9wcyxcbiAgICAgICAgICAgIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyU3VjY2Vzczogb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzUHJvcHMsXG4gICAgICAgICAgICBvblJlbmRlckVycm9yOiBvblJlbmRlckVycm9yUHJvcHMsXG4gICAgICAgICAgICBvblJlbmRlclN1Y2Nlc3M6IG9uUmVuZGVyU3VjY2Vzc1Byb3BzLFxuICAgICAgICAgICAgb25SZW5kZXJUZXh0TGF5ZXJFcnJvcjogb25SZW5kZXJUZXh0TGF5ZXJFcnJvclByb3BzLFxuICAgICAgICAgICAgb25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzOiBvblJlbmRlclRleHRMYXllclN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICBwYWdlSW5kZXgsXG4gICAgICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICAgICAgcmVuZGVyRm9ybXMsXG4gICAgICAgICAgICByZW5kZXJUZXh0TGF5ZXI6IHJlbmRlclRleHRMYXllclByb3BzLFxuICAgICAgICAgICAgcm90YXRlLFxuICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgIH1cbiAgICAgICAgOiBudWxsLCBbXG4gICAgICAgIF9jbGFzc05hbWUsXG4gICAgICAgIGNhbnZhc0JhY2tncm91bmQsXG4gICAgICAgIGN1c3RvbVRleHRSZW5kZXJlcixcbiAgICAgICAgZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgb25HZXRBbm5vdGF0aW9uc0Vycm9yUHJvcHMsXG4gICAgICAgIG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzUHJvcHMsXG4gICAgICAgIG9uR2V0U3RydWN0VHJlZUVycm9yUHJvcHMsXG4gICAgICAgIG9uR2V0U3RydWN0VHJlZVN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgb25HZXRUZXh0RXJyb3JQcm9wcyxcbiAgICAgICAgb25HZXRUZXh0U3VjY2Vzc1Byb3BzLFxuICAgICAgICBvblJlbmRlckFubm90YXRpb25MYXllckVycm9yUHJvcHMsXG4gICAgICAgIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyU3VjY2Vzc1Byb3BzLFxuICAgICAgICBvblJlbmRlckVycm9yUHJvcHMsXG4gICAgICAgIG9uUmVuZGVyU3VjY2Vzc1Byb3BzLFxuICAgICAgICBvblJlbmRlclRleHRMYXllckVycm9yUHJvcHMsXG4gICAgICAgIG9uUmVuZGVyVGV4dExheWVyU3VjY2Vzc1Byb3BzLFxuICAgICAgICBwYWdlLFxuICAgICAgICBwYWdlSW5kZXgsXG4gICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgIHJlbmRlckZvcm1zLFxuICAgICAgICByZW5kZXJUZXh0TGF5ZXJQcm9wcyxcbiAgICAgICAgcm90YXRlLFxuICAgICAgICBzY2FsZSxcbiAgICBdKTtcbiAgICBjb25zdCBldmVudFByb3BzID0gdXNlTWVtbygoKSA9PiBtYWtlRXZlbnRQcm9wcyhvdGhlclByb3BzLCAoKSA9PiBwYWdlID8gKHNjYWxlID8gbWFrZVBhZ2VDYWxsYmFjayhwYWdlLCBzY2FsZSkgOiB1bmRlZmluZWQpIDogcGFnZSksIFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IEZJWE1FXG4gICAgW290aGVyUHJvcHMsIHBhZ2UsIHNjYWxlXSk7XG4gICAgY29uc3QgcGFnZUtleSA9IGAke3BhZ2VJbmRleH1AJHtzY2FsZX0vJHtyb3RhdGV9YDtcbiAgICBmdW5jdGlvbiByZW5kZXJNYWluTGF5ZXIoKSB7XG4gICAgICAgIHN3aXRjaCAocmVuZGVyTW9kZSkge1xuICAgICAgICAgICAgY2FzZSAnY3VzdG9tJzoge1xuICAgICAgICAgICAgICAgIGludmFyaWFudChDdXN0b21SZW5kZXJlciwgYHJlbmRlck1vZGUgd2FzIHNldCB0byBcImN1c3RvbVwiLCBidXQgbm8gY3VzdG9tUmVuZGVyZXIgd2FzIHBhc3NlZC5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2pzeChDdXN0b21SZW5kZXJlciwge30sIGAke3BhZ2VLZXl9X2N1c3RvbWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjYXNlICdjYW52YXMnOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2pzeChDYW52YXMsIHsgY2FudmFzUmVmOiBjYW52YXNSZWYgfSwgYCR7cGFnZUtleX1fY2FudmFzYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyKCkge1xuICAgICAgICBpZiAoIXJlbmRlclRleHRMYXllclByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX2pzeChUZXh0TGF5ZXIsIHt9LCBgJHtwYWdlS2V5fV90ZXh0YCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbmRlckFubm90YXRpb25MYXllcigpIHtcbiAgICAgICAgaWYgKCFyZW5kZXJBbm5vdGF0aW9uTGF5ZXJQcm9wcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIG9mIG5vdywgUERGLmpzIDIuMC45NDMgcmV0dXJucyB3YXJuaW5ncyBvbiB1bmltcGxlbWVudGVkIGFubm90YXRpb25zIGluIFNWRyBtb2RlLlxuICAgICAgICAgKiBUaGVyZWZvcmUsIGFzIGEgZmFsbGJhY2ssIHdlIHJlbmRlciBcInRyYWRpdGlvbmFsXCIgQW5ub3RhdGlvbkxheWVyIGNvbXBvbmVudC5cbiAgICAgICAgICovXG4gICAgICAgIHJldHVybiBfanN4KEFubm90YXRpb25MYXllciwge30sIGAke3BhZ2VLZXl9X2Fubm90YXRpb25zYCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbmRlckNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gKF9qc3hzKFBhZ2VDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBjaGlsZENvbnRleHQsIGNoaWxkcmVuOiBbcmVuZGVyTWFpbkxheWVyKCksIHJlbmRlclRleHRMYXllcigpLCByZW5kZXJBbm5vdGF0aW9uTGF5ZXIoKSwgY2hpbGRyZW5dIH0pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVuZGVyQ29udGVudCgpIHtcbiAgICAgICAgaWYgKCFwYWdlTnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gX2pzeChNZXNzYWdlLCB7IHR5cGU6IFwibm8tZGF0YVwiLCBjaGlsZHJlbjogdHlwZW9mIG5vRGF0YSA9PT0gJ2Z1bmN0aW9uJyA/IG5vRGF0YSgpIDogbm9EYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZGYgPT09IG51bGwgfHwgcGFnZSA9PT0gdW5kZWZpbmVkIHx8IHBhZ2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAoX2pzeChNZXNzYWdlLCB7IHR5cGU6IFwibG9hZGluZ1wiLCBjaGlsZHJlbjogdHlwZW9mIGxvYWRpbmcgPT09ICdmdW5jdGlvbicgPyBsb2FkaW5nKCkgOiBsb2FkaW5nIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGRmID09PSBmYWxzZSB8fCBwYWdlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9qc3goTWVzc2FnZSwgeyB0eXBlOiBcImVycm9yXCIsIGNoaWxkcmVuOiB0eXBlb2YgZXJyb3IgPT09ICdmdW5jdGlvbicgPyBlcnJvcigpIDogZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlckNoaWxkcmVuKCk7XG4gICAgfVxuICAgIHJldHVybiAoX2pzeChcImRpdlwiLCBPYmplY3QuYXNzaWduKHsgY2xhc3NOYW1lOiBjbHN4KF9jbGFzc05hbWUsIGNsYXNzTmFtZSksIFwiZGF0YS1wYWdlLW51bWJlclwiOiBwYWdlTnVtYmVyLCBcbiAgICAgICAgLy8gQXNzZXJ0aW9uIGlzIG5lZWRlZCBmb3IgUmVhY3QgMTggY29tcGF0aWJpbGl0eVxuICAgICAgICByZWY6IG1lcmdlUmVmcyhpbnB1dFJlZiwgcGFnZUVsZW1lbnQpLCBzdHlsZToge1xuICAgICAgICAgICAgWyctLXNjYWxlLWZhY3RvciddOiBgJHtzY2FsZX1gLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBjYW52YXNCYWNrZ3JvdW5kIHx8ICd3aGl0ZScsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgIG1pbldpZHRoOiAnbWluLWNvbnRlbnQnLFxuICAgICAgICAgICAgbWluSGVpZ2h0OiAnbWluLWNvbnRlbnQnLFxuICAgICAgICB9IH0sIGV2ZW50UHJvcHMsIHsgY2hpbGRyZW46IHJlbmRlckNvbnRlbnQoKSB9KSkpO1xufVxuIiwiJ3VzZSBjbGllbnQnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmNvbnN0IHBhZ2VDb250ZXh0ID0gY3JlYXRlQ29udGV4dChudWxsKTtcbmV4cG9ydCBkZWZhdWx0IHBhZ2VDb250ZXh0O1xuIiwiJ3VzZSBjbGllbnQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1ha2VDYW5jZWxsYWJsZSBmcm9tICdtYWtlLWNhbmNlbGxhYmxlLXByb21pc2UnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ3RpbnktaW52YXJpYW50JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0ICogYXMgcGRmanMgZnJvbSAncGRmanMtZGlzdCc7XG5pbXBvcnQgdXNlRG9jdW1lbnRDb250ZXh0IGZyb20gJy4uL3NoYXJlZC9ob29rcy91c2VEb2N1bWVudENvbnRleHQuanMnO1xuaW1wb3J0IHVzZVBhZ2VDb250ZXh0IGZyb20gJy4uL3NoYXJlZC9ob29rcy91c2VQYWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdXNlUmVzb2x2ZXIgZnJvbSAnLi4vc2hhcmVkL2hvb2tzL3VzZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IGNhbmNlbFJ1bm5pbmdUYXNrIH0gZnJvbSAnLi4vc2hhcmVkL3V0aWxzLmpzJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFubm90YXRpb25MYXllcigpIHtcbiAgICBjb25zdCBkb2N1bWVudENvbnRleHQgPSB1c2VEb2N1bWVudENvbnRleHQoKTtcbiAgICBjb25zdCBwYWdlQ29udGV4dCA9IHVzZVBhZ2VDb250ZXh0KCk7XG4gICAgaW52YXJpYW50KHBhZ2VDb250ZXh0LCAnVW5hYmxlIHRvIGZpbmQgUGFnZSBjb250ZXh0LicpO1xuICAgIGNvbnN0IG1lcmdlZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkb2N1bWVudENvbnRleHQpLCBwYWdlQ29udGV4dCk7XG4gICAgY29uc3QgeyBpbWFnZVJlc291cmNlc1BhdGgsIGxpbmtTZXJ2aWNlLCBvbkdldEFubm90YXRpb25zRXJyb3I6IG9uR2V0QW5ub3RhdGlvbnNFcnJvclByb3BzLCBvbkdldEFubm90YXRpb25zU3VjY2Vzczogb25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3NQcm9wcywgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvcjogb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvclByb3BzLCBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3M6IG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyU3VjY2Vzc1Byb3BzLCBwYWdlLCBwZGYsIHJlbmRlckZvcm1zLCByb3RhdGUsIHNjYWxlID0gMSwgfSA9IG1lcmdlZFByb3BzO1xuICAgIGludmFyaWFudChwZGYsICdBdHRlbXB0ZWQgdG8gbG9hZCBwYWdlIGFubm90YXRpb25zLCBidXQgbm8gZG9jdW1lbnQgd2FzIHNwZWNpZmllZC4gV3JhcCA8UGFnZSAvPiBpbiBhIDxEb2N1bWVudCAvPiBvciBwYXNzIGV4cGxpY2l0IGBwZGZgIHByb3AuJyk7XG4gICAgaW52YXJpYW50KHBhZ2UsICdBdHRlbXB0ZWQgdG8gbG9hZCBwYWdlIGFubm90YXRpb25zLCBidXQgbm8gcGFnZSB3YXMgc3BlY2lmaWVkLicpO1xuICAgIGludmFyaWFudChsaW5rU2VydmljZSwgJ0F0dGVtcHRlZCB0byBsb2FkIHBhZ2UgYW5ub3RhdGlvbnMsIGJ1dCBubyBsaW5rU2VydmljZSB3YXMgc3BlY2lmaWVkLicpO1xuICAgIGNvbnN0IFthbm5vdGF0aW9uc1N0YXRlLCBhbm5vdGF0aW9uc0Rpc3BhdGNoXSA9IHVzZVJlc29sdmVyKCk7XG4gICAgY29uc3QgeyB2YWx1ZTogYW5ub3RhdGlvbnMsIGVycm9yOiBhbm5vdGF0aW9uc0Vycm9yIH0gPSBhbm5vdGF0aW9uc1N0YXRlO1xuICAgIGNvbnN0IGxheWVyRWxlbWVudCA9IHVzZVJlZihudWxsKTtcbiAgICB3YXJuaW5nKE51bWJlci5wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXJlYWN0LXBkZi1hbm5vdGF0aW9uLWxheWVyJyksIDEwKSA9PT0gMSwgJ0Fubm90YXRpb25MYXllciBzdHlsZXMgbm90IGZvdW5kLiBSZWFkIG1vcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS93b2p0ZWttYWovcmVhY3QtcGRmI3N1cHBvcnQtZm9yLWFubm90YXRpb25zJyk7XG4gICAgZnVuY3Rpb24gb25Mb2FkU3VjY2VzcygpIHtcbiAgICAgICAgaWYgKCFhbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3NQcm9wcykge1xuICAgICAgICAgICAgb25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3NQcm9wcyhhbm5vdGF0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25Mb2FkRXJyb3IoKSB7XG4gICAgICAgIGlmICghYW5ub3RhdGlvbnNFcnJvcikge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKGZhbHNlLCBhbm5vdGF0aW9uc0Vycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAob25HZXRBbm5vdGF0aW9uc0Vycm9yUHJvcHMpIHtcbiAgICAgICAgICAgIG9uR2V0QW5ub3RhdGlvbnNFcnJvclByb3BzKGFubm90YXRpb25zRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IHVzZUVmZmVjdCBpbnRlbnRpb25hbGx5IHRyaWdnZXJlZCBvbiBwYWdlIGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiByZXNldEFubm90YXRpb25zKCkge1xuICAgICAgICBhbm5vdGF0aW9uc0Rpc3BhdGNoKHsgdHlwZTogJ1JFU0VUJyB9KTtcbiAgICB9LCBbYW5ub3RhdGlvbnNEaXNwYXRjaCwgcGFnZV0pO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiBsb2FkQW5ub3RhdGlvbnMoKSB7XG4gICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbmNlbGxhYmxlID0gbWFrZUNhbmNlbGxhYmxlKHBhZ2UuZ2V0QW5ub3RhdGlvbnMoKSk7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmdUYXNrID0gY2FuY2VsbGFibGU7XG4gICAgICAgIGNhbmNlbGxhYmxlLnByb21pc2VcbiAgICAgICAgICAgIC50aGVuKChuZXh0QW5ub3RhdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGFubm90YXRpb25zRGlzcGF0Y2goeyB0eXBlOiAnUkVTT0xWRScsIHZhbHVlOiBuZXh0QW5ub3RhdGlvbnMgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uc0Rpc3BhdGNoKHsgdHlwZTogJ1JFSkVDVCcsIGVycm9yIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNhbmNlbFJ1bm5pbmdUYXNrKHJ1bm5pbmdUYXNrKTtcbiAgICAgICAgfTtcbiAgICB9LCBbYW5ub3RhdGlvbnNEaXNwYXRjaCwgcGFnZV0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoYW5ub3RhdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG9uTG9hZEVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb25Mb2FkU3VjY2VzcygpO1xuICAgIH0sIFthbm5vdGF0aW9uc10pO1xuICAgIGZ1bmN0aW9uIG9uUmVuZGVyU3VjY2VzcygpIHtcbiAgICAgICAgaWYgKG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyU3VjY2Vzc1Byb3BzKSB7XG4gICAgICAgICAgICBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NQcm9wcygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uUmVuZGVyRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgd2FybmluZyhmYWxzZSwgYCR7ZXJyb3J9YCk7XG4gICAgICAgIGlmIChvblJlbmRlckFubm90YXRpb25MYXllckVycm9yUHJvcHMpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3JQcm9wcyhlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgdmlld3BvcnQgPSB1c2VNZW1vKCgpID0+IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZSwgcm90YXRpb246IHJvdGF0ZSB9KSwgW3BhZ2UsIHJvdGF0ZSwgc2NhbGVdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBPbW1pdHRlZCBjYWxsYmFja3Mgc28gdGhleSBhcmUgbm90IGNhbGxlZCBldmVyeSB0aW1lIHRoZXkgY2hhbmdlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIHJlbmRlckFubm90YXRpb25MYXllcigpIHtcbiAgICAgICAgaWYgKCFwZGYgfHwgIXBhZ2UgfHwgIWxpbmtTZXJ2aWNlIHx8ICFhbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgY3VycmVudDogbGF5ZXIgfSA9IGxheWVyRWxlbWVudDtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsb25lZFZpZXdwb3J0ID0gdmlld3BvcnQuY2xvbmUoeyBkb250RmxpcDogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvbkxheWVyUGFyYW1ldGVycyA9IHtcbiAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlNYW5hZ2VyOiBudWxsLCAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpc1xuICAgICAgICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcDogbnVsbCwgLy8gVE9ETzogSW1wbGVtZW50IHRoaXNcbiAgICAgICAgICAgIGFubm90YXRpb25FZGl0b3JVSU1hbmFnZXI6IG51bGwsIC8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgICAgICAgICBkaXY6IGxheWVyLFxuICAgICAgICAgICAgbDEwbjogbnVsbCwgLy8gVE9ETzogSW1wbGVtZW50IHRoaXNcbiAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICB2aWV3cG9ydDogY2xvbmVkVmlld3BvcnQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlbmRlclBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9ucyxcbiAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBwZGYuYW5ub3RhdGlvblN0b3JhZ2UsXG4gICAgICAgICAgICBkaXY6IGxheWVyLFxuICAgICAgICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoLFxuICAgICAgICAgICAgbGlua1NlcnZpY2UsXG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgcmVuZGVyRm9ybXMsXG4gICAgICAgICAgICB2aWV3cG9ydDogY2xvbmVkVmlld3BvcnQsXG4gICAgICAgIH07XG4gICAgICAgIGxheWVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmV3IHBkZmpzLkFubm90YXRpb25MYXllcihhbm5vdGF0aW9uTGF5ZXJQYXJhbWV0ZXJzKS5yZW5kZXIocmVuZGVyUGFyYW1ldGVycyk7XG4gICAgICAgICAgICAvLyBJbnRlbnRpb25hbCBpbW1lZGlhdGUgY2FsbGJhY2tcbiAgICAgICAgICAgIG9uUmVuZGVyU3VjY2VzcygpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgb25SZW5kZXJFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRPRE86IENhbmNlbCBydW5uaW5nIHRhc2s/XG4gICAgICAgIH07XG4gICAgfSwgW2Fubm90YXRpb25zLCBpbWFnZVJlc291cmNlc1BhdGgsIGxpbmtTZXJ2aWNlLCBwYWdlLCBwZGYsIHJlbmRlckZvcm1zLCB2aWV3cG9ydF0pO1xuICAgIHJldHVybiAoX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xzeCgncmVhY3QtcGRmX19QYWdlX19hbm5vdGF0aW9ucycsICdhbm5vdGF0aW9uTGF5ZXInKSwgcmVmOiBsYXllckVsZW1lbnQgfSkpO1xufVxuIiwiJ3VzZSBjbGllbnQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtZXJnZVJlZnMgZnJvbSAnbWVyZ2UtcmVmcyc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ3RpbnktaW52YXJpYW50JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0ICogYXMgcGRmanMgZnJvbSAncGRmanMtZGlzdCc7XG5pbXBvcnQgU3RydWN0VHJlZSBmcm9tICcuLi9TdHJ1Y3RUcmVlLmpzJztcbmltcG9ydCB1c2VQYWdlQ29udGV4dCBmcm9tICcuLi9zaGFyZWQvaG9va3MvdXNlUGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgY2FuY2VsUnVubmluZ1Rhc2ssIGdldERldmljZVBpeGVsUmF0aW8sIGlzQ2FuY2VsRXhjZXB0aW9uLCBtYWtlUGFnZUNhbGxiYWNrLCB9IGZyb20gJy4uL3NoYXJlZC91dGlscy5qcyc7XG5jb25zdCBBTk5PVEFUSU9OX01PREUgPSBwZGZqcy5Bbm5vdGF0aW9uTW9kZTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENhbnZhcyhwcm9wcykge1xuICAgIGNvbnN0IHBhZ2VDb250ZXh0ID0gdXNlUGFnZUNvbnRleHQoKTtcbiAgICBpbnZhcmlhbnQocGFnZUNvbnRleHQsICdVbmFibGUgdG8gZmluZCBQYWdlIGNvbnRleHQuJyk7XG4gICAgY29uc3QgbWVyZ2VkUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhZ2VDb250ZXh0KSwgcHJvcHMpO1xuICAgIGNvbnN0IHsgX2NsYXNzTmFtZSwgY2FudmFzQmFja2dyb3VuZCwgZGV2aWNlUGl4ZWxSYXRpbyA9IGdldERldmljZVBpeGVsUmF0aW8oKSwgb25SZW5kZXJFcnJvcjogb25SZW5kZXJFcnJvclByb3BzLCBvblJlbmRlclN1Y2Nlc3M6IG9uUmVuZGVyU3VjY2Vzc1Byb3BzLCBwYWdlLCByZW5kZXJGb3JtcywgcmVuZGVyVGV4dExheWVyLCByb3RhdGUsIHNjYWxlLCB9ID0gbWVyZ2VkUHJvcHM7XG4gICAgY29uc3QgeyBjYW52YXNSZWYgfSA9IHByb3BzO1xuICAgIGludmFyaWFudChwYWdlLCAnQXR0ZW1wdGVkIHRvIHJlbmRlciBwYWdlIGNhbnZhcywgYnV0IG5vIHBhZ2Ugd2FzIHNwZWNpZmllZC4nKTtcbiAgICBjb25zdCBjYW52YXNFbGVtZW50ID0gdXNlUmVmKG51bGwpO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgcGFnZSBpcyByZW5kZXJlZCBzdWNjZXNzZnVsbHkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25SZW5kZXJTdWNjZXNzKCkge1xuICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uUmVuZGVyU3VjY2Vzc1Byb3BzKSB7XG4gICAgICAgICAgICBvblJlbmRlclN1Y2Nlc3NQcm9wcyhtYWtlUGFnZUNhbGxiYWNrKHBhZ2UsIHNjYWxlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBwYWdlIGZhaWxzIHRvIHJlbmRlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvblJlbmRlckVycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChpc0NhbmNlbEV4Y2VwdGlvbihlcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKGZhbHNlLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKG9uUmVuZGVyRXJyb3JQcm9wcykge1xuICAgICAgICAgICAgb25SZW5kZXJFcnJvclByb3BzKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZW5kZXJWaWV3cG9ydCA9IHVzZU1lbW8oKCkgPT4gcGFnZS5nZXRWaWV3cG9ydCh7IHNjYWxlOiBzY2FsZSAqIGRldmljZVBpeGVsUmF0aW8sIHJvdGF0aW9uOiByb3RhdGUgfSksIFtkZXZpY2VQaXhlbFJhdGlvLCBwYWdlLCByb3RhdGUsIHNjYWxlXSk7XG4gICAgY29uc3Qgdmlld3BvcnQgPSB1c2VNZW1vKCgpID0+IHBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZSwgcm90YXRpb246IHJvdGF0ZSB9KSwgW3BhZ2UsIHJvdGF0ZSwgc2NhbGVdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBPbW1pdHRlZCBjYWxsYmFja3Mgc28gdGhleSBhcmUgbm90IGNhbGxlZCBldmVyeSB0aW1lIHRoZXkgY2hhbmdlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIGRyYXdQYWdlT25DYW52YXMoKSB7XG4gICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZXMgdGhlIGNhbnZhcyB3aWxsIGJlIHJlLXJlbmRlcmVkIGZyb20gc2NyYXRjaC4gT3RoZXJ3aXNlIGFsbCBmb3JtIGRhdGEgd2lsbCBzdGF5LlxuICAgICAgICBwYWdlLmNsZWFudXAoKTtcbiAgICAgICAgY29uc3QgeyBjdXJyZW50OiBjYW52YXMgfSA9IGNhbnZhc0VsZW1lbnQ7XG4gICAgICAgIGlmICghY2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FudmFzLndpZHRoID0gcmVuZGVyVmlld3BvcnQud2lkdGg7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSByZW5kZXJWaWV3cG9ydC5oZWlnaHQ7XG4gICAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IGAke01hdGguZmxvb3Iodmlld3BvcnQud2lkdGgpfXB4YDtcbiAgICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke01hdGguZmxvb3Iodmlld3BvcnQuaGVpZ2h0KX1weGA7XG4gICAgICAgIGNhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uTW9kZTogcmVuZGVyRm9ybXMgPyBBTk5PVEFUSU9OX01PREUuRU5BQkxFX0ZPUk1TIDogQU5OT1RBVElPTl9NT0RFLkVOQUJMRSxcbiAgICAgICAgICAgIGNhbnZhc0NvbnRleHQ6IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgYWxwaGE6IGZhbHNlIH0pLFxuICAgICAgICAgICAgdmlld3BvcnQ6IHJlbmRlclZpZXdwb3J0LFxuICAgICAgICB9O1xuICAgICAgICBpZiAoY2FudmFzQmFja2dyb3VuZCkge1xuICAgICAgICAgICAgcmVuZGVyQ29udGV4dC5iYWNrZ3JvdW5kID0gY2FudmFzQmFja2dyb3VuZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5jZWxsYWJsZSA9IHBhZ2UucmVuZGVyKHJlbmRlckNvbnRleHQpO1xuICAgICAgICBjb25zdCBydW5uaW5nVGFzayA9IGNhbmNlbGxhYmxlO1xuICAgICAgICBjYW5jZWxsYWJsZS5wcm9taXNlXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjYW52YXMuc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgICAgICAgb25SZW5kZXJTdWNjZXNzKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2gob25SZW5kZXJFcnJvcik7XG4gICAgICAgIHJldHVybiAoKSA9PiBjYW5jZWxSdW5uaW5nVGFzayhydW5uaW5nVGFzayk7XG4gICAgfSwgW2NhbnZhc0JhY2tncm91bmQsIHBhZ2UsIHJlbmRlckZvcm1zLCByZW5kZXJWaWV3cG9ydCwgdmlld3BvcnRdKTtcbiAgICBjb25zdCBjbGVhbnVwID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnQ6IGNhbnZhcyB9ID0gY2FudmFzRWxlbWVudDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFplcm9pbmcgdGhlIHdpZHRoIGFuZCBoZWlnaHQgY2F1c2UgbW9zdCBicm93c2VycyB0byByZWxlYXNlIGdyYXBoaWNzXG4gICAgICAgICAqIHJlc291cmNlcyBpbW1lZGlhdGVseSwgd2hpY2ggY2FuIGdyZWF0bHkgcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChjYW52YXMpIHtcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IDA7XG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4gY2xlYW51cCwgW2NsZWFudXBdKTtcbiAgICByZXR1cm4gKF9qc3goXCJjYW52YXNcIiwgeyBjbGFzc05hbWU6IGAke19jbGFzc05hbWV9X19jYW52YXNgLCBkaXI6IFwibHRyXCIsIHJlZjogbWVyZ2VSZWZzKGNhbnZhc1JlZiwgY2FudmFzRWxlbWVudCksIHN0eWxlOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgICB9LCBjaGlsZHJlbjogcmVuZGVyVGV4dExheWVyID8gX2pzeChTdHJ1Y3RUcmVlLCB7fSkgOiBudWxsIH0pKTtcbn1cbiIsIid1c2UgY2xpZW50JztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtYWtlQ2FuY2VsbGFibGUgZnJvbSAnbWFrZS1jYW5jZWxsYWJsZS1wcm9taXNlJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCAqIGFzIHBkZmpzIGZyb20gJ3BkZmpzLWRpc3QnO1xuaW1wb3J0IHVzZVBhZ2VDb250ZXh0IGZyb20gJy4uL3NoYXJlZC9ob29rcy91c2VQYWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdXNlUmVzb2x2ZXIgZnJvbSAnLi4vc2hhcmVkL2hvb2tzL3VzZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IGNhbmNlbFJ1bm5pbmdUYXNrIH0gZnJvbSAnLi4vc2hhcmVkL3V0aWxzLmpzJztcbmZ1bmN0aW9uIGlzVGV4dEl0ZW0oaXRlbSkge1xuICAgIHJldHVybiAnc3RyJyBpbiBpdGVtO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVGV4dExheWVyKCkge1xuICAgIGNvbnN0IHBhZ2VDb250ZXh0ID0gdXNlUGFnZUNvbnRleHQoKTtcbiAgICBpbnZhcmlhbnQocGFnZUNvbnRleHQsICdVbmFibGUgdG8gZmluZCBQYWdlIGNvbnRleHQuJyk7XG4gICAgY29uc3QgeyBjdXN0b21UZXh0UmVuZGVyZXIsIG9uR2V0VGV4dEVycm9yLCBvbkdldFRleHRTdWNjZXNzLCBvblJlbmRlclRleHRMYXllckVycm9yLCBvblJlbmRlclRleHRMYXllclN1Y2Nlc3MsIHBhZ2UsIHBhZ2VJbmRleCwgcGFnZU51bWJlciwgcm90YXRlLCBzY2FsZSwgfSA9IHBhZ2VDb250ZXh0O1xuICAgIGludmFyaWFudChwYWdlLCAnQXR0ZW1wdGVkIHRvIGxvYWQgcGFnZSB0ZXh0IGNvbnRlbnQsIGJ1dCBubyBwYWdlIHdhcyBzcGVjaWZpZWQuJyk7XG4gICAgY29uc3QgW3RleHRDb250ZW50U3RhdGUsIHRleHRDb250ZW50RGlzcGF0Y2hdID0gdXNlUmVzb2x2ZXIoKTtcbiAgICBjb25zdCB7IHZhbHVlOiB0ZXh0Q29udGVudCwgZXJyb3I6IHRleHRDb250ZW50RXJyb3IgfSA9IHRleHRDb250ZW50U3RhdGU7XG4gICAgY29uc3QgbGF5ZXJFbGVtZW50ID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGVuZEVsZW1lbnQgPSB1c2VSZWYodW5kZWZpbmVkKTtcbiAgICB3YXJuaW5nKE51bWJlci5wYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCctLXJlYWN0LXBkZi10ZXh0LWxheWVyJyksIDEwKSA9PT0gMSwgJ1RleHRMYXllciBzdHlsZXMgbm90IGZvdW5kLiBSZWFkIG1vcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS93b2p0ZWttYWovcmVhY3QtcGRmI3N1cHBvcnQtZm9yLXRleHQtbGF5ZXInKTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHBhZ2UgdGV4dCBjb250ZW50IGlzIHJlYWQgc3VjY2Vzc2Z1bGx5XG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Mb2FkU3VjY2VzcygpIHtcbiAgICAgICAgaWYgKCF0ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25HZXRUZXh0U3VjY2Vzcykge1xuICAgICAgICAgICAgb25HZXRUZXh0U3VjY2Vzcyh0ZXh0Q29udGVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBwYWdlIHRleHQgY29udGVudCBmYWlsZWQgdG8gcmVhZCBzdWNjZXNzZnVsbHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbkxvYWRFcnJvcigpIHtcbiAgICAgICAgaWYgKCF0ZXh0Q29udGVudEVycm9yKSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsIHRleHRDb250ZW50RXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvbkdldFRleHRFcnJvcikge1xuICAgICAgICAgICAgb25HZXRUZXh0RXJyb3IodGV4dENvbnRlbnRFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdXNlRWZmZWN0IGludGVudGlvbmFsbHkgdHJpZ2dlcmVkIG9uIHBhZ2UgY2hhbmdlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIHJlc2V0VGV4dENvbnRlbnQoKSB7XG4gICAgICAgIHRleHRDb250ZW50RGlzcGF0Y2goeyB0eXBlOiAnUkVTRVQnIH0pO1xuICAgIH0sIFtwYWdlLCB0ZXh0Q29udGVudERpc3BhdGNoXSk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIGxvYWRUZXh0Q29udGVudCgpIHtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FuY2VsbGFibGUgPSBtYWtlQ2FuY2VsbGFibGUocGFnZS5nZXRUZXh0Q29udGVudCgpKTtcbiAgICAgICAgY29uc3QgcnVubmluZ1Rhc2sgPSBjYW5jZWxsYWJsZTtcbiAgICAgICAgY2FuY2VsbGFibGUucHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKG5leHRUZXh0Q29udGVudCkgPT4ge1xuICAgICAgICAgICAgdGV4dENvbnRlbnREaXNwYXRjaCh7IHR5cGU6ICdSRVNPTFZFJywgdmFsdWU6IG5leHRUZXh0Q29udGVudCB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRleHRDb250ZW50RGlzcGF0Y2goeyB0eXBlOiAnUkVKRUNUJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2FuY2VsUnVubmluZ1Rhc2socnVubmluZ1Rhc2spO1xuICAgIH0sIFtwYWdlLCB0ZXh0Q29udGVudERpc3BhdGNoXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICh0ZXh0Q29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRleHRDb250ZW50ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgb25Mb2FkRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvbkxvYWRTdWNjZXNzKCk7XG4gICAgfSwgW3RleHRDb250ZW50XSk7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSB0ZXh0IGxheWVyIGlzIHJlbmRlcmVkIHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIGNvbnN0IG9uUmVuZGVyU3VjY2VzcyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgaWYgKG9uUmVuZGVyVGV4dExheWVyU3VjY2Vzcykge1xuICAgICAgICAgICAgb25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzKCk7XG4gICAgICAgIH1cbiAgICB9LCBbb25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzXSk7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSB0ZXh0IGxheWVyIGZhaWxlZCB0byByZW5kZXIgc3VjY2Vzc2Z1bGx5XG4gICAgICovXG4gICAgY29uc3Qgb25SZW5kZXJFcnJvciA9IHVzZUNhbGxiYWNrKChlcnJvcikgPT4ge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCBlcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKG9uUmVuZGVyVGV4dExheWVyRXJyb3IpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyVGV4dExheWVyRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfSwgW29uUmVuZGVyVGV4dExheWVyRXJyb3JdKTtcbiAgICBmdW5jdGlvbiBvbk1vdXNlRG93bigpIHtcbiAgICAgICAgY29uc3QgZW5kID0gZW5kRWxlbWVudC5jdXJyZW50O1xuICAgICAgICBpZiAoIWVuZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVuZC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb25Nb3VzZVVwKCkge1xuICAgICAgICBjb25zdCBlbmQgPSBlbmRFbGVtZW50LmN1cnJlbnQ7XG4gICAgICAgIGlmICghZW5kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZW5kLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgIH1cbiAgICBjb25zdCB2aWV3cG9ydCA9IHVzZU1lbW8oKCkgPT4gcGFnZS5nZXRWaWV3cG9ydCh7IHNjYWxlLCByb3RhdGlvbjogcm90YXRlIH0pLCBbcGFnZSwgcm90YXRlLCBzY2FsZV0pO1xuICAgIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiByZW5kZXJUZXh0TGF5ZXIoKSB7XG4gICAgICAgIGlmICghcGFnZSB8fCAhdGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGN1cnJlbnQ6IGxheWVyIH0gPSBsYXllckVsZW1lbnQ7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsYXllci5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgY29uc3QgdGV4dENvbnRlbnRTb3VyY2UgPSBwYWdlLnN0cmVhbVRleHRDb250ZW50KHsgaW5jbHVkZU1hcmtlZENvbnRlbnQ6IHRydWUgfSk7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICBjb250YWluZXI6IGxheWVyLFxuICAgICAgICAgICAgdGV4dENvbnRlbnRTb3VyY2UsXG4gICAgICAgICAgICB2aWV3cG9ydCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2FuY2VsbGFibGUgPSBuZXcgcGRmanMuVGV4dExheWVyKHBhcmFtZXRlcnMpO1xuICAgICAgICBjb25zdCBydW5uaW5nVGFzayA9IGNhbmNlbGxhYmxlO1xuICAgICAgICBjYW5jZWxsYWJsZVxuICAgICAgICAgICAgLnJlbmRlcigpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGVuZC5jbGFzc05hbWUgPSAnZW5kT2ZDb250ZW50JztcbiAgICAgICAgICAgIGxheWVyLmFwcGVuZChlbmQpO1xuICAgICAgICAgICAgZW5kRWxlbWVudC5jdXJyZW50ID0gZW5kO1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJDaGlsZHJlbiA9IGxheWVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tyb2xlPVwicHJlc2VudGF0aW9uXCJdJyk7XG4gICAgICAgICAgICBpZiAoY3VzdG9tVGV4dFJlbmRlcmVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudC5pdGVtcy5mb3JFYWNoKChpdGVtLCBpdGVtSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RleHRJdGVtKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBsYXllckNoaWxkcmVuW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBjdXN0b21UZXh0UmVuZGVyZXIoT2JqZWN0LmFzc2lnbih7IHBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtSW5kZXggfSwgaXRlbSkpO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpbmRleCArPSBpdGVtLnN0ciAmJiBpdGVtLmhhc0VPTCA/IDIgOiAxO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW50ZW50aW9uYWwgaW1tZWRpYXRlIGNhbGxiYWNrXG4gICAgICAgICAgICBvblJlbmRlclN1Y2Nlc3MoKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChvblJlbmRlckVycm9yKTtcbiAgICAgICAgcmV0dXJuICgpID0+IGNhbmNlbFJ1bm5pbmdUYXNrKHJ1bm5pbmdUYXNrKTtcbiAgICB9LCBbXG4gICAgICAgIGN1c3RvbVRleHRSZW5kZXJlcixcbiAgICAgICAgb25SZW5kZXJFcnJvcixcbiAgICAgICAgb25SZW5kZXJTdWNjZXNzLFxuICAgICAgICBwYWdlLFxuICAgICAgICBwYWdlSW5kZXgsXG4gICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgIHRleHRDb250ZW50LFxuICAgICAgICB2aWV3cG9ydCxcbiAgICBdKTtcbiAgICByZXR1cm4gKF9qc3goXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsc3goJ3JlYWN0LXBkZl9fUGFnZV9fdGV4dENvbnRlbnQnLCAndGV4dExheWVyJyksIG9uTW91c2VVcDogb25Nb3VzZVVwLCBvbk1vdXNlRG93bjogb25Nb3VzZURvd24sIHJlZjogbGF5ZXJFbGVtZW50IH0pKTtcbn1cbiIsIi8vIEFzIGRlZmluZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcGRmLmpzL2Jsb2IvZDlmYWMzNDU5NjA5YTgwN2JlNjUwNmZiMzQ0MWI1ZGE0YjE1NGQxNC9zcmMvc2hhcmVkL3V0aWwuanMjTDM3MS1MMzc0XG5jb25zdCBQYXNzd29yZFJlc3BvbnNlcyA9IHtcbiAgICBORUVEX1BBU1NXT1JEOiAxLFxuICAgIElOQ09SUkVDVF9QQVNTV09SRDogMixcbn07XG5leHBvcnQgZGVmYXVsdCBQYXNzd29yZFJlc3BvbnNlcztcbiIsImltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFrZUNhbmNlbGxhYmxlIGZyb20gJ21ha2UtY2FuY2VsbGFibGUtcHJvbWlzZSc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ3RpbnktaW52YXJpYW50JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0IFN0cnVjdFRyZWVJdGVtIGZyb20gJy4vU3RydWN0VHJlZUl0ZW0uanMnO1xuaW1wb3J0IHVzZVBhZ2VDb250ZXh0IGZyb20gJy4vc2hhcmVkL2hvb2tzL3VzZVBhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB1c2VSZXNvbHZlciBmcm9tICcuL3NoYXJlZC9ob29rcy91c2VSZXNvbHZlci5qcyc7XG5pbXBvcnQgeyBjYW5jZWxSdW5uaW5nVGFzayB9IGZyb20gJy4vc2hhcmVkL3V0aWxzLmpzJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFN0cnVjdFRyZWUoKSB7XG4gICAgY29uc3QgcGFnZUNvbnRleHQgPSB1c2VQYWdlQ29udGV4dCgpO1xuICAgIGludmFyaWFudChwYWdlQ29udGV4dCwgJ1VuYWJsZSB0byBmaW5kIFBhZ2UgY29udGV4dC4nKTtcbiAgICBjb25zdCB7IG9uR2V0U3RydWN0VHJlZUVycm9yOiBvbkdldFN0cnVjdFRyZWVFcnJvclByb3BzLCBvbkdldFN0cnVjdFRyZWVTdWNjZXNzOiBvbkdldFN0cnVjdFRyZWVTdWNjZXNzUHJvcHMsIH0gPSBwYWdlQ29udGV4dDtcbiAgICBjb25zdCBbc3RydWN0VHJlZVN0YXRlLCBzdHJ1Y3RUcmVlRGlzcGF0Y2hdID0gdXNlUmVzb2x2ZXIoKTtcbiAgICBjb25zdCB7IHZhbHVlOiBzdHJ1Y3RUcmVlLCBlcnJvcjogc3RydWN0VHJlZUVycm9yIH0gPSBzdHJ1Y3RUcmVlU3RhdGU7XG4gICAgY29uc3QgeyBjdXN0b21UZXh0UmVuZGVyZXIsIHBhZ2UgfSA9IHBhZ2VDb250ZXh0O1xuICAgIGZ1bmN0aW9uIG9uTG9hZFN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmICghc3RydWN0VHJlZSkge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25HZXRTdHJ1Y3RUcmVlU3VjY2Vzc1Byb3BzKSB7XG4gICAgICAgICAgICBvbkdldFN0cnVjdFRyZWVTdWNjZXNzUHJvcHMoc3RydWN0VHJlZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25Mb2FkRXJyb3IoKSB7XG4gICAgICAgIGlmICghc3RydWN0VHJlZUVycm9yKSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsIHN0cnVjdFRyZWVFcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKG9uR2V0U3RydWN0VHJlZUVycm9yUHJvcHMpIHtcbiAgICAgICAgICAgIG9uR2V0U3RydWN0VHJlZUVycm9yUHJvcHMoc3RydWN0VHJlZUVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiB1c2VFZmZlY3QgaW50ZW50aW9uYWxseSB0cmlnZ2VyZWQgb24gcGFnZSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gcmVzZXRTdHJ1Y3RUcmVlKCkge1xuICAgICAgICBzdHJ1Y3RUcmVlRGlzcGF0Y2goeyB0eXBlOiAnUkVTRVQnIH0pO1xuICAgIH0sIFtzdHJ1Y3RUcmVlRGlzcGF0Y2gsIHBhZ2VdKTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gbG9hZFN0cnVjdFRyZWUoKSB7XG4gICAgICAgIGlmIChjdXN0b21UZXh0UmVuZGVyZXIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IERvY3VtZW50IHdoeSB0aGlzIGlzIG5lY2Vzc2FyeVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbmNlbGxhYmxlID0gbWFrZUNhbmNlbGxhYmxlKHBhZ2UuZ2V0U3RydWN0VHJlZSgpKTtcbiAgICAgICAgY29uc3QgcnVubmluZ1Rhc2sgPSBjYW5jZWxsYWJsZTtcbiAgICAgICAgY2FuY2VsbGFibGUucHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKG5leHRTdHJ1Y3RUcmVlKSA9PiB7XG4gICAgICAgICAgICBzdHJ1Y3RUcmVlRGlzcGF0Y2goeyB0eXBlOiAnUkVTT0xWRScsIHZhbHVlOiBuZXh0U3RydWN0VHJlZSB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHN0cnVjdFRyZWVEaXNwYXRjaCh7IHR5cGU6ICdSRUpFQ1QnLCBlcnJvciB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiBjYW5jZWxSdW5uaW5nVGFzayhydW5uaW5nVGFzayk7XG4gICAgfSwgW2N1c3RvbVRleHRSZW5kZXJlciwgcGFnZSwgc3RydWN0VHJlZURpc3BhdGNoXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChzdHJ1Y3RUcmVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RydWN0VHJlZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG9uTG9hZEVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb25Mb2FkU3VjY2VzcygpO1xuICAgIH0sIFtzdHJ1Y3RUcmVlXSk7XG4gICAgaWYgKCFzdHJ1Y3RUcmVlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gX2pzeChTdHJ1Y3RUcmVlSXRlbSwgeyBjbGFzc05hbWU6IFwicmVhY3QtcGRmX19QYWdlX19zdHJ1Y3RUcmVlIHN0cnVjdFRyZWVcIiwgbm9kZTogc3RydWN0VHJlZSB9KTtcbn1cbiIsImltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0QXR0cmlidXRlcywgaXNTdHJ1Y3RUcmVlTm9kZSwgaXNTdHJ1Y3RUcmVlTm9kZVdpdGhPbmx5Q29udGVudENoaWxkLCB9IGZyb20gJy4vc2hhcmVkL3N0cnVjdFRyZWVVdGlscy5qcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTdHJ1Y3RUcmVlSXRlbSh7IGNsYXNzTmFtZSwgbm9kZSwgfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB1c2VNZW1vKCgpID0+IGdldEF0dHJpYnV0ZXMobm9kZSksIFtub2RlXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogTG9va3MgbGlrZSBhIEJpb21lIGVycm9yXG4gICAgY29uc3QgY2hpbGRyZW4gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKCFpc1N0cnVjdFRyZWVOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdHJ1Y3RUcmVlTm9kZVdpdGhPbmx5Q29udGVudENoaWxkKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9BcnJheUluZGV4S2V5OiBpbmRleCBpcyBzdGFibGUgaGVyZVxuICAgICAgICAgICAgX2pzeChTdHJ1Y3RUcmVlSXRlbSwgeyBub2RlOiBjaGlsZCB9LCBpbmRleCkpO1xuICAgICAgICB9KTtcbiAgICB9LCBbbm9kZV0pO1xuICAgIHJldHVybiAoX2pzeChcInNwYW5cIiwgT2JqZWN0LmFzc2lnbih7IGNsYXNzTmFtZTogY2xhc3NOYW1lIH0sIGF0dHJpYnV0ZXMsIHsgY2hpbGRyZW46IGNoaWxkcmVuIH0pKSk7XG59XG4iLCIvLyBGcm9tIHBkZmpzLWRpc3QvbGliL3dlYi9zdHJ1Y3RfdHJlZV9sYXllcl9idWlsZGVyLmpzXG5leHBvcnQgY29uc3QgUERGX1JPTEVfVE9fSFRNTF9ST0xFID0ge1xuICAgIC8vIERvY3VtZW50IGxldmVsIHN0cnVjdHVyZSB0eXBlc1xuICAgIERvY3VtZW50OiBudWxsLCAvLyBUaGVyZSdzIGEgXCJkb2N1bWVudFwiIHJvbGUsIGJ1dCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgaGVyZS5cbiAgICBEb2N1bWVudEZyYWdtZW50OiBudWxsLFxuICAgIC8vIEdyb3VwaW5nIGxldmVsIHN0cnVjdHVyZSB0eXBlc1xuICAgIFBhcnQ6ICdncm91cCcsXG4gICAgU2VjdDogJ2dyb3VwJywgLy8gWFhYOiBUaGVyZSdzIGEgXCJzZWN0aW9uXCIgcm9sZSwgYnV0IGl0J3MgYWJzdHJhY3QuXG4gICAgRGl2OiAnZ3JvdXAnLFxuICAgIEFzaWRlOiAnbm90ZScsXG4gICAgTm9uU3RydWN0OiAnbm9uZScsXG4gICAgLy8gQmxvY2sgbGV2ZWwgc3RydWN0dXJlIHR5cGVzXG4gICAgUDogbnVsbCxcbiAgICAvLyBIPG4+LFxuICAgIEg6ICdoZWFkaW5nJyxcbiAgICBUaXRsZTogbnVsbCxcbiAgICBGRU5vdGU6ICdub3RlJyxcbiAgICAvLyBTdWItYmxvY2sgbGV2ZWwgc3RydWN0dXJlIHR5cGVcbiAgICBTdWI6ICdncm91cCcsXG4gICAgLy8gR2VuZXJhbCBpbmxpbmUgbGV2ZWwgc3RydWN0dXJlIHR5cGVzXG4gICAgTGJsOiBudWxsLFxuICAgIFNwYW46IG51bGwsXG4gICAgRW06IG51bGwsXG4gICAgU3Ryb25nOiBudWxsLFxuICAgIExpbms6ICdsaW5rJyxcbiAgICBBbm5vdDogJ25vdGUnLFxuICAgIEZvcm06ICdmb3JtJyxcbiAgICAvLyBSdWJ5IGFuZCBXYXJpY2h1IHN0cnVjdHVyZSB0eXBlc1xuICAgIFJ1Ynk6IG51bGwsXG4gICAgUkI6IG51bGwsXG4gICAgUlQ6IG51bGwsXG4gICAgUlA6IG51bGwsXG4gICAgV2FyaWNodTogbnVsbCxcbiAgICBXVDogbnVsbCxcbiAgICBXUDogbnVsbCxcbiAgICAvLyBMaXN0IHN0YW5kYXJkIHN0cnVjdHVyZSB0eXBlc1xuICAgIEw6ICdsaXN0JyxcbiAgICBMSTogJ2xpc3RpdGVtJyxcbiAgICBMQm9keTogbnVsbCxcbiAgICAvLyBUYWJsZSBzdGFuZGFyZCBzdHJ1Y3R1cmUgdHlwZXNcbiAgICBUYWJsZTogJ3RhYmxlJyxcbiAgICBUUjogJ3JvdycsXG4gICAgVEg6ICdjb2x1bW5oZWFkZXInLFxuICAgIFREOiAnY2VsbCcsXG4gICAgVEhlYWQ6ICdjb2x1bW5oZWFkZXInLFxuICAgIFRCb2R5OiBudWxsLFxuICAgIFRGb290OiBudWxsLFxuICAgIC8vIFN0YW5kYXJkIHN0cnVjdHVyZSB0eXBlIENhcHRpb25cbiAgICBDYXB0aW9uOiBudWxsLFxuICAgIC8vIFN0YW5kYXJkIHN0cnVjdHVyZSB0eXBlIEZpZ3VyZVxuICAgIEZpZ3VyZTogJ2ZpZ3VyZScsXG4gICAgLy8gU3RhbmRhcmQgc3RydWN0dXJlIHR5cGUgRm9ybXVsYVxuICAgIEZvcm11bGE6IG51bGwsXG4gICAgLy8gc3RhbmRhcmQgc3RydWN0dXJlIHR5cGUgQXJ0aWZhY3RcbiAgICBBcnRpZmFjdDogbnVsbCxcbn07XG5leHBvcnQgY29uc3QgSEVBRElOR19QQVRURVJOID0gL15IKFxcZCspJC87XG4iLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IERvY3VtZW50Q29udGV4dCBmcm9tICcuLi8uLi9Eb2N1bWVudENvbnRleHQuanMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRG9jdW1lbnRDb250ZXh0KCkge1xuICAgIHJldHVybiB1c2VDb250ZXh0KERvY3VtZW50Q29udGV4dCk7XG59XG4iLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFBhZ2VDb250ZXh0IGZyb20gJy4uLy4uL1BhZ2VDb250ZXh0LmpzJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVBhZ2VDb250ZXh0KCkge1xuICAgIHJldHVybiB1c2VDb250ZXh0KFBhZ2VDb250ZXh0KTtcbn1cbiIsImltcG9ydCB7IHVzZVJlZHVjZXIgfSBmcm9tICdyZWFjdCc7XG5mdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1JFU09MVkUnOlxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGFjdGlvbi52YWx1ZSwgZXJyb3I6IHVuZGVmaW5lZCB9O1xuICAgICAgICBjYXNlICdSRUpFQ1QnOlxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGZhbHNlLCBlcnJvcjogYWN0aW9uLmVycm9yIH07XG4gICAgICAgIGNhc2UgJ1JFU0VUJzpcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGVycm9yOiB1bmRlZmluZWQgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VSZXNvbHZlcigpIHtcbiAgICByZXR1cm4gdXNlUmVkdWNlcigocmVkdWNlciksIHsgdmFsdWU6IHVuZGVmaW5lZCwgZXJyb3I6IHVuZGVmaW5lZCB9KTtcbn1cbiIsImltcG9ydCB7IEhFQURJTkdfUEFUVEVSTiwgUERGX1JPTEVfVE9fSFRNTF9ST0xFIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGRmUm9sZShyb2xlKSB7XG4gICAgcmV0dXJuIHJvbGUgaW4gUERGX1JPTEVfVE9fSFRNTF9ST0xFO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RydWN0VHJlZU5vZGUobm9kZSkge1xuICAgIHJldHVybiAnY2hpbGRyZW4nIGluIG5vZGU7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJ1Y3RUcmVlTm9kZVdpdGhPbmx5Q29udGVudENoaWxkKG5vZGUpIHtcbiAgICBpZiAoIWlzU3RydWN0VHJlZU5vZGUobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgMCBpbiBub2RlLmNoaWxkcmVuICYmICdpZCcgaW4gbm9kZS5jaGlsZHJlblswXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb2xlQXR0cmlidXRlcyhub2RlKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHt9O1xuICAgIGlmIChpc1N0cnVjdFRyZWVOb2RlKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHsgcm9sZSB9ID0gbm9kZTtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHJvbGUubWF0Y2goSEVBRElOR19QQVRURVJOKTtcbiAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMucm9sZSA9ICdoZWFkaW5nJztcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNbJ2FyaWEtbGV2ZWwnXSA9IE51bWJlcihtYXRjaGVzWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BkZlJvbGUocm9sZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0bWxSb2xlID0gUERGX1JPTEVfVE9fSFRNTF9ST0xFW3JvbGVdO1xuICAgICAgICAgICAgaWYgKGh0bWxSb2xlKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5yb2xlID0gaHRtbFJvbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFzZUF0dHJpYnV0ZXMobm9kZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcbiAgICBpZiAoaXNTdHJ1Y3RUcmVlTm9kZShub2RlKSkge1xuICAgICAgICBpZiAobm9kZS5hbHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXR0cmlidXRlc1snYXJpYS1sYWJlbCddID0gbm9kZS5hbHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubGFuZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmxhbmcgPSBub2RlLmxhbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU3RydWN0VHJlZU5vZGVXaXRoT25seUNvbnRlbnRDaGlsZChub2RlKSkge1xuICAgICAgICAgICAgY29uc3QgW2NoaWxkXSA9IG5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEF0dHJpYnV0ZXMgPSBnZXRCYXNlQXR0cmlidXRlcyhjaGlsZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYXR0cmlidXRlcyksIGNoaWxkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICgnaWQnIGluIG5vZGUpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNbJ2FyaWEtb3ducyddID0gbm9kZS5pZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVzKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGdldFJvbGVBdHRyaWJ1dGVzKG5vZGUpKSwgZ2V0QmFzZUF0dHJpYnV0ZXMobm9kZSkpO1xufVxuIiwiaW1wb3J0IGludmFyaWFudCBmcm9tICd0aW55LWludmFyaWFudCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbi8qKlxuICogQ2hlY2tzIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSBicm93c2VyIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgd2UncmUgcnVubmluZyBmcm9tIGEgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBpc0xvY2FsRmlsZVN5c3RlbSA9IGlzQnJvd3NlciAmJiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdmaWxlOic7XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFyaWFibGUgaXMgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0geyp9IHZhcmlhYmxlIFZhcmlhYmxlIHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlZmluZWQodmFyaWFibGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhcmlhYmxlICE9PSAndW5kZWZpbmVkJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC5cbiAqXG4gKiBAcGFyYW0geyp9IHZhcmlhYmxlIFZhcmlhYmxlIHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3ZpZGVkKHZhcmlhYmxlKSB7XG4gICAgcmV0dXJuIGlzRGVmaW5lZCh2YXJpYWJsZSkgJiYgdmFyaWFibGUgIT09IG51bGw7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFyaWFibGUgcHJvdmlkZWQgaXMgYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHsqfSB2YXJpYWJsZSBWYXJpYWJsZSB0byBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFyaWFibGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhcmlhYmxlID09PSAnc3RyaW5nJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YXJpYWJsZSBwcm92aWRlZCBpcyBhbiBBcnJheUJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0geyp9IHZhcmlhYmxlIFZhcmlhYmxlIHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhcmlhYmxlKSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFyaWFibGUgcHJvdmlkZWQgaXMgYSBCbG9iLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFyaWFibGUgVmFyaWFibGUgdG8gY2hlY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmxvYih2YXJpYWJsZSkge1xuICAgIGludmFyaWFudChpc0Jyb3dzZXIsICdpc0Jsb2IgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQnKTtcbiAgICByZXR1cm4gdmFyaWFibGUgaW5zdGFuY2VvZiBCbG9iO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhcmlhYmxlIHByb3ZpZGVkIGlzIGEgZGF0YSBVUkkuXG4gKlxuICogQHBhcmFtIHsqfSB2YXJpYWJsZSBTdHJpbmcgdG8gY2hlY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YVVSSSh2YXJpYWJsZSkge1xuICAgIHJldHVybiBpc1N0cmluZyh2YXJpYWJsZSkgJiYgL15kYXRhOi8udGVzdCh2YXJpYWJsZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGF0YVVSSXRvQnl0ZVN0cmluZyhkYXRhVVJJKSB7XG4gICAgaW52YXJpYW50KGlzRGF0YVVSSShkYXRhVVJJKSwgJ0ludmFsaWQgZGF0YSBVUkkuJyk7XG4gICAgY29uc3QgW2hlYWRlcnNTdHJpbmcgPSAnJywgZGF0YVN0cmluZyA9ICcnXSA9IGRhdGFVUkkuc3BsaXQoJywnKTtcbiAgICBjb25zdCBoZWFkZXJzID0gaGVhZGVyc1N0cmluZy5zcGxpdCgnOycpO1xuICAgIGlmIChoZWFkZXJzLmluZGV4T2YoJ2Jhc2U2NCcpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gYXRvYihkYXRhU3RyaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZXNjYXBlKGRhdGFTdHJpbmcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldERldmljZVBpeGVsUmF0aW8oKSB7XG4gICAgcmV0dXJuIChpc0Jyb3dzZXIgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8pIHx8IDE7XG59XG5jb25zdCBhbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZXNUaXAgPSAnT24gQ2hyb21pdW0gYmFzZWQgYnJvd3NlcnMsIHlvdSBjYW4gdXNlIC0tYWxsb3ctZmlsZS1hY2Nlc3MtZnJvbS1maWxlcyBmbGFnIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuJztcbmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5Q09SU1dhcm5pbmcoKSB7XG4gICAgd2FybmluZyghaXNMb2NhbEZpbGVTeXN0ZW0sIGBMb2FkaW5nIFBERiBhcyBiYXNlNjQgc3RyaW5ncy9VUkxzIG1heSBub3Qgd29yayBvbiBwcm90b2NvbHMgb3RoZXIgdGhhbiBIVFRQL0hUVFBTLiAke2FsbG93RmlsZUFjY2Vzc0Zyb21GaWxlc1RpcH1gKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5V29ya2VyV2FybmluZygpIHtcbiAgICB3YXJuaW5nKCFpc0xvY2FsRmlsZVN5c3RlbSwgYExvYWRpbmcgUERGLmpzIHdvcmtlciBtYXkgbm90IHdvcmsgb24gcHJvdG9jb2xzIG90aGVyIHRoYW4gSFRUUC9IVFRQUy4gJHthbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZXNUaXB9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gY2FuY2VsUnVubmluZ1Rhc2socnVubmluZ1Rhc2spIHtcbiAgICBpZiAocnVubmluZ1Rhc2sgPT09IG51bGwgfHwgcnVubmluZ1Rhc2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJ1bm5pbmdUYXNrLmNhbmNlbClcbiAgICAgICAgcnVubmluZ1Rhc2suY2FuY2VsKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWFrZVBhZ2VDYWxsYmFjayhwYWdlLCBzY2FsZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYWdlLCAnd2lkdGgnLCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZXdbMl0gKiBzY2FsZTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYWdlLCAnaGVpZ2h0Jywge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3WzNdICogc2NhbGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFnZSwgJ29yaWdpbmFsV2lkdGgnLCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZXdbMl07XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFnZSwgJ29yaWdpbmFsSGVpZ2h0Jywge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aWV3WzNdO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHBhZ2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDYW5jZWxFeGNlcHRpb24oZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IubmFtZSA9PT0gJ1JlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbic7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9hZEZyb21GaWxlKGZpbGUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZWFkZXIucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIHdoaWxlIHJlYWRpbmcgYSBmaWxlLicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdCk7XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdFcnJvciB3aGlsZSByZWFkaW5nIGEgZmlsZS4nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGVycm9yIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIHdoaWxlIHJlYWRpbmcgYSBmaWxlLicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN3aXRjaCAoZXJyb3IuY29kZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgZXJyb3IuTk9UX0ZPVU5EX0VSUjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIHdoaWxlIHJlYWRpbmcgYSBmaWxlOiBGaWxlIG5vdCBmb3VuZC4nKSk7XG4gICAgICAgICAgICAgICAgY2FzZSBlcnJvci5TRUNVUklUWV9FUlI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdFcnJvciB3aGlsZSByZWFkaW5nIGEgZmlsZTogU2VjdXJpdHkgZXJyb3IuJykpO1xuICAgICAgICAgICAgICAgIGNhc2UgZXJyb3IuQUJPUlRfRVJSOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignRXJyb3Igd2hpbGUgcmVhZGluZyBhIGZpbGU6IEFib3J0ZWQuJykpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdFcnJvciB3aGlsZSByZWFkaW5nIGEgZmlsZS4nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICB9KTtcbn1cbiIsIi8vIHNyYy9pbmRleC50c1xuaW1wb3J0ICogYXMgUmVhY3QyIGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IgYXMgdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IyIH0gZnJvbSBcInVzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3dpdGgtc2VsZWN0b3IuanNcIjtcblxuLy8gc3JjL3V0aWxzL3JlYWN0LnRzXG5pbXBvcnQgKiBhcyBSZWFjdE9yaWdpbmFsIGZyb20gXCJyZWFjdFwiO1xudmFyIFJlYWN0ID0gKFxuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgLy8gQHRzLWlnbm9yZVxuICBcImRlZmF1bHRcIiBpbiBSZWFjdE9yaWdpbmFsID8gUmVhY3RPcmlnaW5hbFtcImRlZmF1bHRcIl0gOiBSZWFjdE9yaWdpbmFsXG4pO1xuXG4vLyBzcmMvY29tcG9uZW50cy9Db250ZXh0LnRzXG52YXIgQ29udGV4dEtleSA9IFN5bWJvbC5mb3IoYHJlYWN0LXJlZHV4LWNvbnRleHRgKTtcbnZhciBnVCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsVGhpcyA6IChcbiAgLyogZmFsbCBiYWNrIHRvIGEgcGVyLW1vZHVsZSBzY29wZSAocHJlLTguMSBiZWhhdmlvdXIpIGlmIGBnbG9iYWxUaGlzYCBpcyBub3QgYXZhaWxhYmxlICovXG4gIHt9XG4pO1xuZnVuY3Rpb24gZ2V0Q29udGV4dCgpIHtcbiAgaWYgKCFSZWFjdC5jcmVhdGVDb250ZXh0KVxuICAgIHJldHVybiB7fTtcbiAgY29uc3QgY29udGV4dE1hcCA9IGdUW0NvbnRleHRLZXldID8/IChnVFtDb250ZXh0S2V5XSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpO1xuICBsZXQgcmVhbENvbnRleHQgPSBjb250ZXh0TWFwLmdldChSZWFjdC5jcmVhdGVDb250ZXh0KTtcbiAgaWYgKCFyZWFsQ29udGV4dCkge1xuICAgIHJlYWxDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChcbiAgICAgIG51bGxcbiAgICApO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHJlYWxDb250ZXh0LmRpc3BsYXlOYW1lID0gXCJSZWFjdFJlZHV4XCI7XG4gICAgfVxuICAgIGNvbnRleHRNYXAuc2V0KFJlYWN0LmNyZWF0ZUNvbnRleHQsIHJlYWxDb250ZXh0KTtcbiAgfVxuICByZXR1cm4gcmVhbENvbnRleHQ7XG59XG52YXIgUmVhY3RSZWR1eENvbnRleHQgPSAvKiBAX19QVVJFX18gKi8gZ2V0Q29udGV4dCgpO1xuXG4vLyBzcmMvdXRpbHMvdXNlU3luY0V4dGVybmFsU3RvcmUudHNcbnZhciBub3RJbml0aWFsaXplZCA9ICgpID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKFwidVNFUyBub3QgaW5pdGlhbGl6ZWQhXCIpO1xufTtcblxuLy8gc3JjL2hvb2tzL3VzZVJlZHV4Q29udGV4dC50c1xuZnVuY3Rpb24gY3JlYXRlUmVkdXhDb250ZXh0SG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZVJlZHV4Q29udGV4dDIoKSB7XG4gICAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlQ29udGV4dChjb250ZXh0KTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFjb250ZXh0VmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJjb3VsZCBub3QgZmluZCByZWFjdC1yZWR1eCBjb250ZXh0IHZhbHVlOyBwbGVhc2UgZW5zdXJlIHRoZSBjb21wb25lbnQgaXMgd3JhcHBlZCBpbiBhIDxQcm92aWRlcj5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHRWYWx1ZTtcbiAgfTtcbn1cbnZhciB1c2VSZWR1eENvbnRleHQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlUmVkdXhDb250ZXh0SG9vaygpO1xuXG4vLyBzcmMvaG9va3MvdXNlU2VsZWN0b3IudHNcbnZhciB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IG5vdEluaXRpYWxpemVkO1xudmFyIGluaXRpYWxpemVVc2VTZWxlY3RvciA9IChmbikgPT4ge1xuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IGZuO1xufTtcbnZhciByZWZFcXVhbGl0eSA9IChhLCBiKSA9PiBhID09PSBiO1xuZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JIb29rKGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dCkge1xuICBjb25zdCB1c2VSZWR1eENvbnRleHQyID0gY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VSZWR1eENvbnRleHQgOiBjcmVhdGVSZWR1eENvbnRleHRIb29rKGNvbnRleHQpO1xuICBjb25zdCB1c2VTZWxlY3RvcjIgPSAoc2VsZWN0b3IsIGVxdWFsaXR5Rm5Pck9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgZXF1YWxpdHlGbiA9IHJlZkVxdWFsaXR5LCBkZXZNb2RlQ2hlY2tzID0ge30gfSA9IHR5cGVvZiBlcXVhbGl0eUZuT3JPcHRpb25zID09PSBcImZ1bmN0aW9uXCIgPyB7IGVxdWFsaXR5Rm46IGVxdWFsaXR5Rm5Pck9wdGlvbnMgfSA6IGVxdWFsaXR5Rm5Pck9wdGlvbnM7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFlvdSBtdXN0IHBhc3MgYSBzZWxlY3RvciB0byB1c2VTZWxlY3RvcmApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBzZWxlY3RvciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGEgc2VsZWN0b3IgdG8gdXNlU2VsZWN0b3JgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZXF1YWxpdHlGbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgWW91IG11c3QgcGFzcyBhIGZ1bmN0aW9uIGFzIGFuIGVxdWFsaXR5IGZ1bmN0aW9uIHRvIHVzZVNlbGVjdG9yYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBzdG9yZSxcbiAgICAgIHN1YnNjcmlwdGlvbixcbiAgICAgIGdldFNlcnZlclN0YXRlLFxuICAgICAgc3RhYmlsaXR5Q2hlY2ssXG4gICAgICBpZGVudGl0eUZ1bmN0aW9uQ2hlY2tcbiAgICB9ID0gdXNlUmVkdXhDb250ZXh0MigpO1xuICAgIGNvbnN0IGZpcnN0UnVuID0gUmVhY3QudXNlUmVmKHRydWUpO1xuICAgIGNvbnN0IHdyYXBwZWRTZWxlY3RvciA9IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgICAge1xuICAgICAgICBbc2VsZWN0b3IubmFtZV0oc3RhdGUpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHNlbGVjdG9yKHN0YXRlKTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGlkZW50aXR5RnVuY3Rpb25DaGVjazogZmluYWxJZGVudGl0eUZ1bmN0aW9uQ2hlY2ssXG4gICAgICAgICAgICAgIHN0YWJpbGl0eUNoZWNrOiBmaW5hbFN0YWJpbGl0eUNoZWNrXG4gICAgICAgICAgICB9ID0ge1xuICAgICAgICAgICAgICBzdGFiaWxpdHlDaGVjayxcbiAgICAgICAgICAgICAgaWRlbnRpdHlGdW5jdGlvbkNoZWNrLFxuICAgICAgICAgICAgICAuLi5kZXZNb2RlQ2hlY2tzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGZpbmFsU3RhYmlsaXR5Q2hlY2sgPT09IFwiYWx3YXlzXCIgfHwgZmluYWxTdGFiaWxpdHlDaGVjayA9PT0gXCJvbmNlXCIgJiYgZmlyc3RSdW4uY3VycmVudCkge1xuICAgICAgICAgICAgICBjb25zdCB0b0NvbXBhcmUgPSBzZWxlY3RvcihzdGF0ZSk7XG4gICAgICAgICAgICAgIGlmICghZXF1YWxpdHlGbihzZWxlY3RlZCwgdG9Db21wYXJlKSkge1xuICAgICAgICAgICAgICAgIGxldCBzdGFjayA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgICAgKHsgc3RhY2sgfSA9IGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBcIlNlbGVjdG9yIFwiICsgKHNlbGVjdG9yLm5hbWUgfHwgXCJ1bmtub3duXCIpICsgXCIgcmV0dXJuZWQgYSBkaWZmZXJlbnQgcmVzdWx0IHdoZW4gY2FsbGVkIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycy4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSByZXJlbmRlcnMuXFxuU2VsZWN0b3JzIHRoYXQgcmV0dXJuIGEgbmV3IHJlZmVyZW5jZSAoc3VjaCBhcyBhbiBvYmplY3Qgb3IgYW4gYXJyYXkpIHNob3VsZCBiZSBtZW1vaXplZDogaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdXNhZ2UvZGVyaXZpbmctZGF0YS1zZWxlY3RvcnMjb3B0aW1pemluZy1zZWxlY3RvcnMtd2l0aC1tZW1vaXphdGlvblwiLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkMjogdG9Db21wYXJlLFxuICAgICAgICAgICAgICAgICAgICBzdGFja1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaW5hbElkZW50aXR5RnVuY3Rpb25DaGVjayA9PT0gXCJhbHdheXNcIiB8fCBmaW5hbElkZW50aXR5RnVuY3Rpb25DaGVjayA9PT0gXCJvbmNlXCIgJiYgZmlyc3RSdW4uY3VycmVudCkge1xuICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgPT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YWNrID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgICAoeyBzdGFjayB9ID0gZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIFwiU2VsZWN0b3IgXCIgKyAoc2VsZWN0b3IubmFtZSB8fCBcInVua25vd25cIikgKyBcIiByZXR1cm5lZCB0aGUgcm9vdCBzdGF0ZSB3aGVuIGNhbGxlZC4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSByZXJlbmRlcnMuXFxuU2VsZWN0b3JzIHRoYXQgcmV0dXJuIHRoZSBlbnRpcmUgc3RhdGUgYXJlIGFsbW9zdCBjZXJ0YWlubHkgYSBtaXN0YWtlLCBhcyB0aGV5IHdpbGwgY2F1c2UgYSByZXJlbmRlciB3aGVuZXZlciAqYW55dGhpbmcqIGluIHN0YXRlIGNoYW5nZXMuXCIsXG4gICAgICAgICAgICAgICAgICB7IHN0YWNrIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3RSdW4uY3VycmVudClcbiAgICAgICAgICAgICAgZmlyc3RSdW4uY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1bc2VsZWN0b3IubmFtZV0sXG4gICAgICBbc2VsZWN0b3IsIHN0YWJpbGl0eUNoZWNrLCBkZXZNb2RlQ2hlY2tzLnN0YWJpbGl0eUNoZWNrXVxuICAgICk7XG4gICAgY29uc3Qgc2VsZWN0ZWRTdGF0ZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKFxuICAgICAgc3Vic2NyaXB0aW9uLmFkZE5lc3RlZFN1YixcbiAgICAgIHN0b3JlLmdldFN0YXRlLFxuICAgICAgZ2V0U2VydmVyU3RhdGUgfHwgc3RvcmUuZ2V0U3RhdGUsXG4gICAgICB3cmFwcGVkU2VsZWN0b3IsXG4gICAgICBlcXVhbGl0eUZuXG4gICAgKTtcbiAgICBSZWFjdC51c2VEZWJ1Z1ZhbHVlKHNlbGVjdGVkU3RhdGUpO1xuICAgIHJldHVybiBzZWxlY3RlZFN0YXRlO1xuICB9O1xuICBPYmplY3QuYXNzaWduKHVzZVNlbGVjdG9yMiwge1xuICAgIHdpdGhUeXBlczogKCkgPT4gdXNlU2VsZWN0b3IyXG4gIH0pO1xuICByZXR1cm4gdXNlU2VsZWN0b3IyO1xufVxudmFyIHVzZVNlbGVjdG9yID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZVNlbGVjdG9ySG9vaygpO1xuXG4vLyBzcmMvdXRpbHMvcmVhY3QtaXMudHNcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIik7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIik7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKTtcbnZhciBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnNlcnZlcl9jb250ZXh0XCIpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIik7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5vZmZzY3JlZW5cIik7XG52YXIgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jbGllbnQucmVmZXJlbmNlXCIpO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIGNvbnN0ICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOiB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBvYmplY3QudHlwZTtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc3QgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9TRVJWRVJfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6IHtcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cblxuLy8gc3JjL3V0aWxzL3dhcm5pbmcudHNcbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgdHJ5IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxufVxuXG4vLyBzcmMvY29ubmVjdC92ZXJpZnlTdWJzZWxlY3RvcnMudHNcbmZ1bmN0aW9uIHZlcmlmeShzZWxlY3RvciwgbWV0aG9kTmFtZSkge1xuICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciAke21ldGhvZE5hbWV9IGluIGNvbm5lY3QuYCk7XG4gIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gXCJtYXBTdGF0ZVRvUHJvcHNcIiB8fCBtZXRob2ROYW1lID09PSBcIm1hcERpc3BhdGNoVG9Qcm9wc1wiKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2VsZWN0b3IsIFwiZGVwZW5kc09uT3duUHJvcHNcIikpIHtcbiAgICAgIHdhcm5pbmcoXG4gICAgICAgIGBUaGUgc2VsZWN0b3IgZm9yICR7bWV0aG9kTmFtZX0gb2YgY29ubmVjdCBkaWQgbm90IHNwZWNpZnkgYSB2YWx1ZSBmb3IgZGVwZW5kc09uT3duUHJvcHMuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHZlcmlmeVN1YnNlbGVjdG9ycyhtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcykge1xuICB2ZXJpZnkobWFwU3RhdGVUb1Byb3BzLCBcIm1hcFN0YXRlVG9Qcm9wc1wiKTtcbiAgdmVyaWZ5KG1hcERpc3BhdGNoVG9Qcm9wcywgXCJtYXBEaXNwYXRjaFRvUHJvcHNcIik7XG4gIHZlcmlmeShtZXJnZVByb3BzLCBcIm1lcmdlUHJvcHNcIik7XG59XG5cbi8vIHNyYy9jb25uZWN0L3NlbGVjdG9yRmFjdG9yeS50c1xuZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCB7XG4gIGFyZVN0YXRlc0VxdWFsLFxuICBhcmVPd25Qcm9wc0VxdWFsLFxuICBhcmVTdGF0ZVByb3BzRXF1YWxcbn0pIHtcbiAgbGV0IGhhc1J1bkF0TGVhc3RPbmNlID0gZmFsc2U7XG4gIGxldCBzdGF0ZTtcbiAgbGV0IG93blByb3BzO1xuICBsZXQgc3RhdGVQcm9wcztcbiAgbGV0IGRpc3BhdGNoUHJvcHM7XG4gIGxldCBtZXJnZWRQcm9wcztcbiAgZnVuY3Rpb24gaGFuZGxlRmlyc3RDYWxsKGZpcnN0U3RhdGUsIGZpcnN0T3duUHJvcHMpIHtcbiAgICBzdGF0ZSA9IGZpcnN0U3RhdGU7XG4gICAgb3duUHJvcHMgPSBmaXJzdE93blByb3BzO1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICBoYXNSdW5BdExlYXN0T25jZSA9IHRydWU7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKSB7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGlmIChtYXBEaXNwYXRjaFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpXG4gICAgICBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlTmV3UHJvcHMoKSB7XG4gICAgaWYgKG1hcFN0YXRlVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcylcbiAgICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKVxuICAgICAgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1N0YXRlKCkge1xuICAgIGNvbnN0IG5leHRTdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgY29uc3Qgc3RhdGVQcm9wc0NoYW5nZWQgPSAhYXJlU3RhdGVQcm9wc0VxdWFsKG5leHRTdGF0ZVByb3BzLCBzdGF0ZVByb3BzKTtcbiAgICBzdGF0ZVByb3BzID0gbmV4dFN0YXRlUHJvcHM7XG4gICAgaWYgKHN0YXRlUHJvcHNDaGFuZ2VkKVxuICAgICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgY29uc3QgcHJvcHNDaGFuZ2VkID0gIWFyZU93blByb3BzRXF1YWwobmV4dE93blByb3BzLCBvd25Qcm9wcyk7XG4gICAgY29uc3Qgc3RhdGVDaGFuZ2VkID0gIWFyZVN0YXRlc0VxdWFsKFxuICAgICAgbmV4dFN0YXRlLFxuICAgICAgc3RhdGUsXG4gICAgICBuZXh0T3duUHJvcHMsXG4gICAgICBvd25Qcm9wc1xuICAgICk7XG4gICAgc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgb3duUHJvcHMgPSBuZXh0T3duUHJvcHM7XG4gICAgaWYgKHByb3BzQ2hhbmdlZCAmJiBzdGF0ZUNoYW5nZWQpXG4gICAgICByZXR1cm4gaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSgpO1xuICAgIGlmIChwcm9wc0NoYW5nZWQpXG4gICAgICByZXR1cm4gaGFuZGxlTmV3UHJvcHMoKTtcbiAgICBpZiAoc3RhdGVDaGFuZ2VkKVxuICAgICAgcmV0dXJuIGhhbmRsZU5ld1N0YXRlKCk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgcmV0dXJuIGhhc1J1bkF0TGVhc3RPbmNlID8gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSA6IGhhbmRsZUZpcnN0Q2FsbChuZXh0U3RhdGUsIG5leHRPd25Qcm9wcyk7XG4gIH07XG59XG5mdW5jdGlvbiBmaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KGRpc3BhdGNoLCB7XG4gIGluaXRNYXBTdGF0ZVRvUHJvcHMsXG4gIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gIGluaXRNZXJnZVByb3BzLFxuICAuLi5vcHRpb25zXG59KSB7XG4gIGNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IGluaXRNYXBTdGF0ZVRvUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICBjb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgY29uc3QgbWVyZ2VQcm9wcyA9IGluaXRNZXJnZVByb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHZlcmlmeVN1YnNlbGVjdG9ycyhtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcyk7XG4gIH1cbiAgcmV0dXJuIHB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCwgb3B0aW9ucyk7XG59XG5cbi8vIHNyYy91dGlscy9iaW5kQWN0aW9uQ3JlYXRvcnMudHNcbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9ycyhhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpIHtcbiAgY29uc3QgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIGNvbnN0IGFjdGlvbkNyZWF0b3IgPSBhY3Rpb25DcmVhdG9yc1trZXldO1xuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSAoLi4uYXJncykgPT4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvciguLi5hcmdzKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufVxuXG4vLyBzcmMvdXRpbHMvaXNQbGFpbk9iamVjdC50c1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgb2JqID09PSBudWxsKVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgaWYgKHByb3RvID09PSBudWxsKVxuICAgIHJldHVybiB0cnVlO1xuICBsZXQgYmFzZVByb3RvID0gcHJvdG87XG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YoYmFzZVByb3RvKSAhPT0gbnVsbCkge1xuICAgIGJhc2VQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pO1xuICB9XG4gIHJldHVybiBwcm90byA9PT0gYmFzZVByb3RvO1xufVxuXG4vLyBzcmMvdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QudHNcbmZ1bmN0aW9uIHZlcmlmeVBsYWluT2JqZWN0KHZhbHVlLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgd2FybmluZyhcbiAgICAgIGAke21ldGhvZE5hbWV9KCkgaW4gJHtkaXNwbGF5TmFtZX0gbXVzdCByZXR1cm4gYSBwbGFpbiBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQgJHt2YWx1ZX0uYFxuICAgICk7XG4gIH1cbn1cblxuLy8gc3JjL2Nvbm5lY3Qvd3JhcE1hcFRvUHJvcHMudHNcbmZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZ2V0Q29uc3RhbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRDb25zdGFudFNlbGVjdG9yKGRpc3BhdGNoKSB7XG4gICAgY29uc3QgY29uc3RhbnQgPSBnZXRDb25zdGFudChkaXNwYXRjaCk7XG4gICAgZnVuY3Rpb24gY29uc3RhbnRTZWxlY3RvcigpIHtcbiAgICAgIHJldHVybiBjb25zdGFudDtcbiAgICB9XG4gICAgY29uc3RhbnRTZWxlY3Rvci5kZXBlbmRzT25Pd25Qcm9wcyA9IGZhbHNlO1xuICAgIHJldHVybiBjb25zdGFudFNlbGVjdG9yO1xuICB9O1xufVxuZnVuY3Rpb24gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcykge1xuICByZXR1cm4gbWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcyA/IEJvb2xlYW4obWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgOiBtYXBUb1Byb3BzLmxlbmd0aCAhPT0gMTtcbn1cbmZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzRnVuYyhtYXBUb1Byb3BzLCBtZXRob2ROYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0UHJveHlTZWxlY3RvcihkaXNwYXRjaCwgeyBkaXNwbGF5TmFtZSB9KSB7XG4gICAgY29uc3QgcHJveHkgPSBmdW5jdGlvbiBtYXBUb1Byb3BzUHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykge1xuICAgICAgcmV0dXJuIHByb3h5LmRlcGVuZHNPbk93blByb3BzID8gcHJveHkubWFwVG9Qcm9wcyhzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSA6IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoLCB2b2lkIDApO1xuICAgIH07XG4gICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSB0cnVlO1xuICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBmdW5jdGlvbiBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBtYXBUb1Byb3BzO1xuICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKTtcbiAgICAgIGxldCBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBwcm9wcztcbiAgICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhwcm9wcyk7XG4gICAgICAgIHByb3BzID0gcHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgICB9XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKVxuICAgICAgICB2ZXJpZnlQbGFpbk9iamVjdChwcm9wcywgZGlzcGxheU5hbWUsIG1ldGhvZE5hbWUpO1xuICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH07XG4gICAgcmV0dXJuIHByb3h5O1xuICB9O1xufVxuXG4vLyBzcmMvY29ubmVjdC9pbnZhbGlkQXJnRmFjdG9yeS50c1xuZnVuY3Rpb24gY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkoYXJnLCBuYW1lKSB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIG9wdGlvbnMpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCB2YWx1ZSBvZiB0eXBlICR7dHlwZW9mIGFyZ30gZm9yICR7bmFtZX0gYXJndW1lbnQgd2hlbiBjb25uZWN0aW5nIGNvbXBvbmVudCAke29wdGlvbnMud3JhcHBlZENvbXBvbmVudE5hbWV9LmBcbiAgICApO1xuICB9O1xufVxuXG4vLyBzcmMvY29ubmVjdC9tYXBEaXNwYXRjaFRvUHJvcHMudHNcbmZ1bmN0aW9uIG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcnkobWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBEaXNwYXRjaFRvUHJvcHMgJiYgdHlwZW9mIG1hcERpc3BhdGNoVG9Qcm9wcyA9PT0gXCJvYmplY3RcIiA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoXG4gICAgKGRpc3BhdGNoKSA9PiAoXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBiaW5kQWN0aW9uQ3JlYXRvcnMobWFwRGlzcGF0Y2hUb1Byb3BzLCBkaXNwYXRjaClcbiAgICApXG4gICkgOiAhbWFwRGlzcGF0Y2hUb1Byb3BzID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudCgoZGlzcGF0Y2gpID0+ICh7XG4gICAgZGlzcGF0Y2hcbiAgfSkpIDogdHlwZW9mIG1hcERpc3BhdGNoVG9Qcm9wcyA9PT0gXCJmdW5jdGlvblwiID8gKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3cmFwTWFwVG9Qcm9wc0Z1bmMobWFwRGlzcGF0Y2hUb1Byb3BzLCBcIm1hcERpc3BhdGNoVG9Qcm9wc1wiKVxuICApIDogY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkobWFwRGlzcGF0Y2hUb1Byb3BzLCBcIm1hcERpc3BhdGNoVG9Qcm9wc1wiKTtcbn1cblxuLy8gc3JjL2Nvbm5lY3QvbWFwU3RhdGVUb1Byb3BzLnRzXG5mdW5jdGlvbiBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcykge1xuICByZXR1cm4gIW1hcFN0YXRlVG9Qcm9wcyA/IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoKCkgPT4gKHt9KSkgOiB0eXBlb2YgbWFwU3RhdGVUb1Byb3BzID09PSBcImZ1bmN0aW9uXCIgPyAoXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdyYXBNYXBUb1Byb3BzRnVuYyhtYXBTdGF0ZVRvUHJvcHMsIFwibWFwU3RhdGVUb1Byb3BzXCIpXG4gICkgOiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIFwibWFwU3RhdGVUb1Byb3BzXCIpO1xufVxuXG4vLyBzcmMvY29ubmVjdC9tZXJnZVByb3BzLnRzXG5mdW5jdGlvbiBkZWZhdWx0TWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICByZXR1cm4geyAuLi5vd25Qcm9wcywgLi4uc3RhdGVQcm9wcywgLi4uZGlzcGF0Y2hQcm9wcyB9O1xufVxuZnVuY3Rpb24gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRNZXJnZVByb3BzUHJveHkoZGlzcGF0Y2gsIHsgZGlzcGxheU5hbWUsIGFyZU1lcmdlZFByb3BzRXF1YWwgfSkge1xuICAgIGxldCBoYXNSdW5PbmNlID0gZmFsc2U7XG4gICAgbGV0IG1lcmdlZFByb3BzO1xuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZVByb3BzUHJveHkoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgICAgIGNvbnN0IG5leHRNZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgICAgaWYgKGhhc1J1bk9uY2UpIHtcbiAgICAgICAgaWYgKCFhcmVNZXJnZWRQcm9wc0VxdWFsKG5leHRNZXJnZWRQcm9wcywgbWVyZ2VkUHJvcHMpKVxuICAgICAgICAgIG1lcmdlZFByb3BzID0gbmV4dE1lcmdlZFByb3BzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFzUnVuT25jZSA9IHRydWU7XG4gICAgICAgIG1lcmdlZFByb3BzID0gbmV4dE1lcmdlZFByb3BzO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKVxuICAgICAgICAgIHZlcmlmeVBsYWluT2JqZWN0KG1lcmdlZFByb3BzLCBkaXNwbGF5TmFtZSwgXCJtZXJnZVByb3BzXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICAgIH07XG4gIH07XG59XG5mdW5jdGlvbiBtZXJnZVByb3BzRmFjdG9yeShtZXJnZVByb3BzKSB7XG4gIHJldHVybiAhbWVyZ2VQcm9wcyA/ICgpID0+IGRlZmF1bHRNZXJnZVByb3BzIDogdHlwZW9mIG1lcmdlUHJvcHMgPT09IFwiZnVuY3Rpb25cIiA/IHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSA6IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KG1lcmdlUHJvcHMsIFwibWVyZ2VQcm9wc1wiKTtcbn1cblxuLy8gc3JjL3V0aWxzL2JhdGNoLnRzXG5mdW5jdGlvbiBkZWZhdWx0Tm9vcEJhdGNoKGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKCk7XG59XG5cbi8vIHNyYy91dGlscy9TdWJzY3JpcHRpb24udHNcbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpIHtcbiAgbGV0IGZpcnN0ID0gbnVsbDtcbiAgbGV0IGxhc3QgPSBudWxsO1xuICByZXR1cm4ge1xuICAgIGNsZWFyKCkge1xuICAgICAgZmlyc3QgPSBudWxsO1xuICAgICAgbGFzdCA9IG51bGw7XG4gICAgfSxcbiAgICBub3RpZnkoKSB7XG4gICAgICBkZWZhdWx0Tm9vcEJhdGNoKCgpID0+IHtcbiAgICAgICAgbGV0IGxpc3RlbmVyID0gZmlyc3Q7XG4gICAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICAgIGxpc3RlbmVyLmNhbGxiYWNrKCk7XG4gICAgICAgICAgbGlzdGVuZXIgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldCgpIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVycyA9IFtdO1xuICAgICAgbGV0IGxpc3RlbmVyID0gZmlyc3Q7XG4gICAgICB3aGlsZSAobGlzdGVuZXIpIHtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdGVuZXJzO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICBsZXQgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gbGFzdCA9IHtcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgIG5leHQ6IG51bGwsXG4gICAgICAgIHByZXY6IGxhc3RcbiAgICAgIH07XG4gICAgICBpZiAobGlzdGVuZXIucHJldikge1xuICAgICAgICBsaXN0ZW5lci5wcmV2Lm5leHQgPSBsaXN0ZW5lcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpcnN0ID0gbGlzdGVuZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICghaXNTdWJzY3JpYmVkIHx8IGZpcnN0ID09PSBudWxsKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICAgIGlmIChsaXN0ZW5lci5uZXh0KSB7XG4gICAgICAgICAgbGlzdGVuZXIubmV4dC5wcmV2ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0ID0gbGlzdGVuZXIucHJldjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGlzdGVuZXIucHJldikge1xuICAgICAgICAgIGxpc3RlbmVyLnByZXYubmV4dCA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlyc3QgPSBsaXN0ZW5lci5uZXh0O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cbnZhciBudWxsTGlzdGVuZXJzID0ge1xuICBub3RpZnkoKSB7XG4gIH0sXG4gIGdldDogKCkgPT4gW11cbn07XG5mdW5jdGlvbiBjcmVhdGVTdWJzY3JpcHRpb24oc3RvcmUsIHBhcmVudFN1Yikge1xuICBsZXQgdW5zdWJzY3JpYmU7XG4gIGxldCBsaXN0ZW5lcnMgPSBudWxsTGlzdGVuZXJzO1xuICBsZXQgc3Vic2NyaXB0aW9uc0Ftb3VudCA9IDA7XG4gIGxldCBzZWxmU3Vic2NyaWJlZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBhZGROZXN0ZWRTdWIobGlzdGVuZXIpIHtcbiAgICB0cnlTdWJzY3JpYmUoKTtcbiAgICBjb25zdCBjbGVhbnVwTGlzdGVuZXIgPSBsaXN0ZW5lcnMuc3Vic2NyaWJlKGxpc3RlbmVyKTtcbiAgICBsZXQgcmVtb3ZlZCA9IGZhbHNlO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgICAgcmVtb3ZlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXBMaXN0ZW5lcigpO1xuICAgICAgICB0cnlVbnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gbm90aWZ5TmVzdGVkU3VicygpIHtcbiAgICBsaXN0ZW5lcnMubm90aWZ5KCk7XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlQ2hhbmdlV3JhcHBlcigpIHtcbiAgICBpZiAoc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UpIHtcbiAgICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlKCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGlzU3Vic2NyaWJlZCgpIHtcbiAgICByZXR1cm4gc2VsZlN1YnNjcmliZWQ7XG4gIH1cbiAgZnVuY3Rpb24gdHJ5U3Vic2NyaWJlKCkge1xuICAgIHN1YnNjcmlwdGlvbnNBbW91bnQrKztcbiAgICBpZiAoIXVuc3Vic2NyaWJlKSB7XG4gICAgICB1bnN1YnNjcmliZSA9IHBhcmVudFN1YiA/IHBhcmVudFN1Yi5hZGROZXN0ZWRTdWIoaGFuZGxlQ2hhbmdlV3JhcHBlcikgOiBzdG9yZS5zdWJzY3JpYmUoaGFuZGxlQ2hhbmdlV3JhcHBlcik7XG4gICAgICBsaXN0ZW5lcnMgPSBjcmVhdGVMaXN0ZW5lckNvbGxlY3Rpb24oKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdHJ5VW5zdWJzY3JpYmUoKSB7XG4gICAgc3Vic2NyaXB0aW9uc0Ftb3VudC0tO1xuICAgIGlmICh1bnN1YnNjcmliZSAmJiBzdWJzY3JpcHRpb25zQW1vdW50ID09PSAwKSB7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgdW5zdWJzY3JpYmUgPSB2b2lkIDA7XG4gICAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIGxpc3RlbmVycyA9IG51bGxMaXN0ZW5lcnM7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHRyeVN1YnNjcmliZVNlbGYoKSB7XG4gICAgaWYgKCFzZWxmU3Vic2NyaWJlZCkge1xuICAgICAgc2VsZlN1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgdHJ5U3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHRyeVVuc3Vic2NyaWJlU2VsZigpIHtcbiAgICBpZiAoc2VsZlN1YnNjcmliZWQpIHtcbiAgICAgIHNlbGZTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICB0cnlVbnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuICBjb25zdCBzdWJzY3JpcHRpb24gPSB7XG4gICAgYWRkTmVzdGVkU3ViLFxuICAgIG5vdGlmeU5lc3RlZFN1YnMsXG4gICAgaGFuZGxlQ2hhbmdlV3JhcHBlcixcbiAgICBpc1N1YnNjcmliZWQsXG4gICAgdHJ5U3Vic2NyaWJlOiB0cnlTdWJzY3JpYmVTZWxmLFxuICAgIHRyeVVuc3Vic2NyaWJlOiB0cnlVbnN1YnNjcmliZVNlbGYsXG4gICAgZ2V0TGlzdGVuZXJzOiAoKSA9PiBsaXN0ZW5lcnNcbiAgfTtcbiAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbn1cblxuLy8gc3JjL3V0aWxzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QudHNcbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiKTtcbnZhciBpc1JlYWN0TmF0aXZlID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gXCJSZWFjdE5hdGl2ZVwiO1xudmFyIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSBjYW5Vc2VET00gfHwgaXNSZWFjdE5hdGl2ZSA/IFJlYWN0LnVzZUxheW91dEVmZmVjdCA6IFJlYWN0LnVzZUVmZmVjdDtcblxuLy8gc3JjL3V0aWxzL3NoYWxsb3dFcXVhbC50c1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IHkgIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKHR5cGVvZiBvYmpBICE9PSBcIm9iamVjdFwiIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09IFwib2JqZWN0XCIgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBzcmMvdXRpbHMvaG9pc3RTdGF0aWNzLnRzXG52YXIgUkVBQ1RfU1RBVElDUyA9IHtcbiAgY2hpbGRDb250ZXh0VHlwZXM6IHRydWUsXG4gIGNvbnRleHRUeXBlOiB0cnVlLFxuICBjb250ZXh0VHlwZXM6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIGdldERlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM6IHRydWUsXG4gIG1peGluczogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIEtOT1dOX1NUQVRJQ1MgPSB7XG4gIG5hbWU6IHRydWUsXG4gIGxlbmd0aDogdHJ1ZSxcbiAgcHJvdG90eXBlOiB0cnVlLFxuICBjYWxsZXI6IHRydWUsXG4gIGNhbGxlZTogdHJ1ZSxcbiAgYXJndW1lbnRzOiB0cnVlLFxuICBhcml0eTogdHJ1ZVxufTtcbnZhciBGT1JXQVJEX1JFRl9TVEFUSUNTID0ge1xuICAkJHR5cGVvZjogdHJ1ZSxcbiAgcmVuZGVyOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWVcbn07XG52YXIgTUVNT19TVEFUSUNTID0ge1xuICAkJHR5cGVvZjogdHJ1ZSxcbiAgY29tcGFyZTogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIFRZUEVfU1RBVElDUyA9IHtcbiAgW0ZvcndhcmRSZWZdOiBGT1JXQVJEX1JFRl9TVEFUSUNTLFxuICBbTWVtb106IE1FTU9fU1RBVElDU1xufTtcbmZ1bmN0aW9uIGdldFN0YXRpY3MoY29tcG9uZW50KSB7XG4gIGlmIChpc01lbW8oY29tcG9uZW50KSkge1xuICAgIHJldHVybiBNRU1PX1NUQVRJQ1M7XG4gIH1cbiAgcmV0dXJuIFRZUEVfU1RBVElDU1tjb21wb25lbnRbXCIkJHR5cGVvZlwiXV0gfHwgUkVBQ1RfU1RBVElDUztcbn1cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xudmFyIG9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5mdW5jdGlvbiBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIHNvdXJjZUNvbXBvbmVudCkge1xuICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudCAhPT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgIGNvbnN0IGluaGVyaXRlZENvbXBvbmVudCA9IGdldFByb3RvdHlwZU9mKHNvdXJjZUNvbXBvbmVudCk7XG4gICAgICBpZiAoaW5oZXJpdGVkQ29tcG9uZW50ICYmIGluaGVyaXRlZENvbXBvbmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgaW5oZXJpdGVkQ29tcG9uZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZUNvbXBvbmVudCk7XG4gICAgaWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAga2V5cyA9IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0U3RhdGljcyA9IGdldFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50KTtcbiAgICBjb25zdCBzb3VyY2VTdGF0aWNzID0gZ2V0U3RhdGljcyhzb3VyY2VDb21wb25lbnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmICghS05PV05fU1RBVElDU1trZXldICYmICEoc291cmNlU3RhdGljcyAmJiBzb3VyY2VTdGF0aWNzW2tleV0pICYmICEodGFyZ2V0U3RhdGljcyAmJiB0YXJnZXRTdGF0aWNzW2tleV0pKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlQ29tcG9uZW50LCBrZXkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldENvbXBvbmVudCwga2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59XG5cbi8vIHNyYy9jb21wb25lbnRzL2Nvbm5lY3QudHN4XG52YXIgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBub3RJbml0aWFsaXplZDtcbnZhciBpbml0aWFsaXplQ29ubmVjdCA9IChmbikgPT4ge1xuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IGZuO1xufTtcbnZhciBOT19TVUJTQ1JJUFRJT05fQVJSQVkgPSBbbnVsbCwgbnVsbF07XG52YXIgc3RyaW5naWZ5Q29tcG9uZW50ID0gKENvbXApID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoQ29tcCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBTdHJpbmcoQ29tcCk7XG4gIH1cbn07XG5mdW5jdGlvbiB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3MoZWZmZWN0RnVuYywgZWZmZWN0QXJncywgZGVwZW5kZW5jaWVzKSB7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4gZWZmZWN0RnVuYyguLi5lZmZlY3RBcmdzKSwgZGVwZW5kZW5jaWVzKTtcbn1cbmZ1bmN0aW9uIGNhcHR1cmVXcmFwcGVyUHJvcHMobGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCB3cmFwcGVyUHJvcHMsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMpIHtcbiAgbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50ID0gd3JhcHBlclByb3BzO1xuICByZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50ID0gZmFsc2U7XG4gIGlmIChjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQpIHtcbiAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSBudWxsO1xuICAgIG5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgfVxufVxuZnVuY3Rpb24gc3Vic2NyaWJlVXBkYXRlcyhzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsIHN0b3JlLCBzdWJzY3JpcHRpb24sIGNoaWxkUHJvcHNTZWxlY3RvciwgbGFzdFdyYXBwZXJQcm9wcywgbGFzdENoaWxkUHJvcHMsIHJlbmRlcklzU2NoZWR1bGVkLCBpc01vdW50ZWQsIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsIG5vdGlmeU5lc3RlZFN1YnMsIGFkZGl0aW9uYWxTdWJzY3JpYmVMaXN0ZW5lcikge1xuICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcylcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgIH07XG4gIGxldCBkaWRVbnN1YnNjcmliZSA9IGZhbHNlO1xuICBsZXQgbGFzdFRocm93bkVycm9yID0gbnVsbDtcbiAgY29uc3QgY2hlY2tGb3JVcGRhdGVzID0gKCkgPT4ge1xuICAgIGlmIChkaWRVbnN1YnNjcmliZSB8fCAhaXNNb3VudGVkLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGF0ZXN0U3RvcmVTdGF0ZSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgbGV0IG5ld0NoaWxkUHJvcHMsIGVycm9yO1xuICAgIHRyeSB7XG4gICAgICBuZXdDaGlsZFByb3BzID0gY2hpbGRQcm9wc1NlbGVjdG9yKFxuICAgICAgICBsYXRlc3RTdG9yZVN0YXRlLFxuICAgICAgICBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnRcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3IgPSBlO1xuICAgICAgbGFzdFRocm93bkVycm9yID0gZTtcbiAgICB9XG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgbGFzdFRocm93bkVycm9yID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKG5ld0NoaWxkUHJvcHMgPT09IGxhc3RDaGlsZFByb3BzLmN1cnJlbnQpIHtcbiAgICAgIGlmICghcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCkge1xuICAgICAgICBub3RpZnlOZXN0ZWRTdWJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RDaGlsZFByb3BzLmN1cnJlbnQgPSBuZXdDaGlsZFByb3BzO1xuICAgICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gbmV3Q2hpbGRQcm9wcztcbiAgICAgIHJlbmRlcklzU2NoZWR1bGVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgYWRkaXRpb25hbFN1YnNjcmliZUxpc3RlbmVyKCk7XG4gICAgfVxuICB9O1xuICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IGNoZWNrRm9yVXBkYXRlcztcbiAgc3Vic2NyaXB0aW9uLnRyeVN1YnNjcmliZSgpO1xuICBjaGVja0ZvclVwZGF0ZXMoKTtcbiAgY29uc3QgdW5zdWJzY3JpYmVXcmFwcGVyID0gKCkgPT4ge1xuICAgIGRpZFVuc3Vic2NyaWJlID0gdHJ1ZTtcbiAgICBzdWJzY3JpcHRpb24udHJ5VW5zdWJzY3JpYmUoKTtcbiAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IG51bGw7XG4gICAgaWYgKGxhc3RUaHJvd25FcnJvcikge1xuICAgICAgdGhyb3cgbGFzdFRocm93bkVycm9yO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHVuc3Vic2NyaWJlV3JhcHBlcjtcbn1cbmZ1bmN0aW9uIHN0cmljdEVxdWFsKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT09IGI7XG59XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbiA9IGZhbHNlO1xuZnVuY3Rpb24gY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywge1xuICAvLyBUaGUgYHB1cmVgIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLCBzbyBUUyBkb2Vzbid0IGxpa2UgdXMgZGVzdHJ1Y3R1cmluZyB0aGlzIHRvIGNoZWNrIGl0cyBleGlzdGVuY2UuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVyZSxcbiAgYXJlU3RhdGVzRXF1YWwgPSBzdHJpY3RFcXVhbCxcbiAgYXJlT3duUHJvcHNFcXVhbCA9IHNoYWxsb3dFcXVhbCxcbiAgYXJlU3RhdGVQcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICBhcmVNZXJnZWRQcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICAvLyB1c2UgUmVhY3QncyBmb3J3YXJkUmVmIHRvIGV4cG9zZSBhIHJlZiBvZiB0aGUgd3JhcHBlZCBjb21wb25lbnRcbiAgZm9yd2FyZFJlZiA9IGZhbHNlLFxuICAvLyB0aGUgY29udGV4dCBjb25zdW1lciB0byB1c2VcbiAgY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0XG59ID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmIChwdXJlICE9PSB2b2lkIDAgJiYgIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZFB1cmVPcHRpb24pIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZFB1cmVPcHRpb24gPSB0cnVlO1xuICAgICAgd2FybmluZyhcbiAgICAgICAgJ1RoZSBgcHVyZWAgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQuIGBjb25uZWN0YCBpcyBub3cgYWx3YXlzIGEgXCJwdXJlL21lbW9pemVkXCIgY29tcG9uZW50J1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgQ29udGV4dCA9IGNvbnRleHQ7XG4gIGNvbnN0IGluaXRNYXBTdGF0ZVRvUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcyk7XG4gIGNvbnN0IGluaXRNYXBEaXNwYXRjaFRvUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3J5KG1hcERpc3BhdGNoVG9Qcm9wcyk7XG4gIGNvbnN0IGluaXRNZXJnZVByb3BzID0gbWVyZ2VQcm9wc0ZhY3RvcnkobWVyZ2VQcm9wcyk7XG4gIGNvbnN0IHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyA9IEJvb2xlYW4obWFwU3RhdGVUb1Byb3BzKTtcbiAgY29uc3Qgd3JhcFdpdGhDb25uZWN0ID0gKFdyYXBwZWRDb21wb25lbnQpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gLyogQF9fUFVSRV9fICovIGlzVmFsaWRFbGVtZW50VHlwZShXcmFwcGVkQ29tcG9uZW50KTtcbiAgICAgIGlmICghaXNWYWxpZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBZb3UgbXVzdCBwYXNzIGEgY29tcG9uZW50IHRvIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSBjb25uZWN0LiBJbnN0ZWFkIHJlY2VpdmVkICR7c3RyaW5naWZ5Q29tcG9uZW50KFxuICAgICAgICAgICAgV3JhcHBlZENvbXBvbmVudFxuICAgICAgICAgICl9YFxuICAgICAgICApO1xuICAgIH1cbiAgICBjb25zdCB3cmFwcGVkQ29tcG9uZW50TmFtZSA9IFdyYXBwZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgV3JhcHBlZENvbXBvbmVudC5uYW1lIHx8IFwiQ29tcG9uZW50XCI7XG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBgQ29ubmVjdCgke3dyYXBwZWRDb21wb25lbnROYW1lfSlgO1xuICAgIGNvbnN0IHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMgPSB7XG4gICAgICBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsXG4gICAgICBkaXNwbGF5TmFtZSxcbiAgICAgIHdyYXBwZWRDb21wb25lbnROYW1lLFxuICAgICAgV3JhcHBlZENvbXBvbmVudCxcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGluaXRNYXBTdGF0ZVRvUHJvcHMsXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzLFxuICAgICAgaW5pdE1lcmdlUHJvcHMsXG4gICAgICBhcmVTdGF0ZXNFcXVhbCxcbiAgICAgIGFyZVN0YXRlUHJvcHNFcXVhbCxcbiAgICAgIGFyZU93blByb3BzRXF1YWwsXG4gICAgICBhcmVNZXJnZWRQcm9wc0VxdWFsXG4gICAgfTtcbiAgICBmdW5jdGlvbiBDb25uZWN0RnVuY3Rpb24ocHJvcHMpIHtcbiAgICAgIGNvbnN0IFtwcm9wc0NvbnRleHQsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYsIHdyYXBwZXJQcm9wc10gPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgY29uc3QgeyByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmOiByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmMiwgLi4ud3JhcHBlclByb3BzMiB9ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBbcHJvcHMuY29udGV4dCwgcmVhY3RSZWR1eEZvcndhcmRlZFJlZjIsIHdyYXBwZXJQcm9wczJdO1xuICAgICAgfSwgW3Byb3BzXSk7XG4gICAgICBjb25zdCBDb250ZXh0VG9Vc2UgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgbGV0IFJlc3VsdENvbnRleHQgPSBDb250ZXh0O1xuICAgICAgICBpZiAocHJvcHNDb250ZXh0Py5Db25zdW1lcikge1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSAvKiBAX19QVVJFX18gKi8gaXNDb250ZXh0Q29uc3VtZXIoXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQocHJvcHNDb250ZXh0LkNvbnN1bWVyLCBudWxsKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJZb3UgbXVzdCBwYXNzIGEgdmFsaWQgUmVhY3QgY29udGV4dCBjb25zdW1lciBhcyBgcHJvcHMuY29udGV4dGBcIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUmVzdWx0Q29udGV4dCA9IHByb3BzQ29udGV4dDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlc3VsdENvbnRleHQ7XG4gICAgICB9LCBbcHJvcHNDb250ZXh0LCBDb250ZXh0XSk7XG4gICAgICBjb25zdCBjb250ZXh0VmFsdWUgPSBSZWFjdC51c2VDb250ZXh0KENvbnRleHRUb1VzZSk7XG4gICAgICBjb25zdCBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPSBCb29sZWFuKHByb3BzLnN0b3JlKSAmJiBCb29sZWFuKHByb3BzLnN0b3JlLmdldFN0YXRlKSAmJiBCb29sZWFuKHByb3BzLnN0b3JlLmRpc3BhdGNoKTtcbiAgICAgIGNvbnN0IGRpZFN0b3JlQ29tZUZyb21Db250ZXh0ID0gQm9vbGVhbihjb250ZXh0VmFsdWUpICYmIEJvb2xlYW4oY29udGV4dFZhbHVlLnN0b3JlKTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIWRpZFN0b3JlQ29tZUZyb21Qcm9wcyAmJiAhZGlkU3RvcmVDb21lRnJvbUNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBcInN0b3JlXCIgaW4gdGhlIGNvbnRleHQgb2YgXCIke2Rpc3BsYXlOYW1lfVwiLiBFaXRoZXIgd3JhcCB0aGUgcm9vdCBjb21wb25lbnQgaW4gYSA8UHJvdmlkZXI+LCBvciBwYXNzIGEgY3VzdG9tIFJlYWN0IGNvbnRleHQgcHJvdmlkZXIgdG8gPFByb3ZpZGVyPiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgUmVhY3QgY29udGV4dCBjb25zdW1lciB0byAke2Rpc3BsYXlOYW1lfSBpbiBjb25uZWN0IG9wdGlvbnMuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RvcmUgPSBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPyBwcm9wcy5zdG9yZSA6IGNvbnRleHRWYWx1ZS5zdG9yZTtcbiAgICAgIGNvbnN0IGdldFNlcnZlclN0YXRlID0gZGlkU3RvcmVDb21lRnJvbUNvbnRleHQgPyBjb250ZXh0VmFsdWUuZ2V0U2VydmVyU3RhdGUgOiBzdG9yZS5nZXRTdGF0ZTtcbiAgICAgIGNvbnN0IGNoaWxkUHJvcHNTZWxlY3RvciA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICByZXR1cm4gZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShzdG9yZS5kaXNwYXRjaCwgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyk7XG4gICAgICB9LCBbc3RvcmVdKTtcbiAgICAgIGNvbnN0IFtzdWJzY3JpcHRpb24sIG5vdGlmeU5lc3RlZFN1YnNdID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmICghc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKVxuICAgICAgICAgIHJldHVybiBOT19TVUJTQ1JJUFRJT05fQVJSQVk7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbjIgPSBjcmVhdGVTdWJzY3JpcHRpb24oXG4gICAgICAgICAgc3RvcmUsXG4gICAgICAgICAgZGlkU3RvcmVDb21lRnJvbVByb3BzID8gdm9pZCAwIDogY29udGV4dFZhbHVlLnN1YnNjcmlwdGlvblxuICAgICAgICApO1xuICAgICAgICBjb25zdCBub3RpZnlOZXN0ZWRTdWJzMiA9IHN1YnNjcmlwdGlvbjIubm90aWZ5TmVzdGVkU3Vicy5iaW5kKHN1YnNjcmlwdGlvbjIpO1xuICAgICAgICByZXR1cm4gW3N1YnNjcmlwdGlvbjIsIG5vdGlmeU5lc3RlZFN1YnMyXTtcbiAgICAgIH0sIFtzdG9yZSwgZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWVdKTtcbiAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKGRpZFN0b3JlQ29tZUZyb21Qcm9wcykge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb250ZXh0VmFsdWUsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uXG4gICAgICAgIH07XG4gICAgICB9LCBbZGlkU3RvcmVDb21lRnJvbVByb3BzLCBjb250ZXh0VmFsdWUsIHN1YnNjcmlwdGlvbl0pO1xuICAgICAgY29uc3QgbGFzdENoaWxkUHJvcHMgPSBSZWFjdC51c2VSZWYodm9pZCAwKTtcbiAgICAgIGNvbnN0IGxhc3RXcmFwcGVyUHJvcHMgPSBSZWFjdC51c2VSZWYod3JhcHBlclByb3BzKTtcbiAgICAgIGNvbnN0IGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUgPSBSZWFjdC51c2VSZWYodm9pZCAwKTtcbiAgICAgIGNvbnN0IHJlbmRlcklzU2NoZWR1bGVkID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgICAgIGNvbnN0IGlzTW91bnRlZCA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gICAgICBjb25zdCBsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yID0gUmVhY3QudXNlUmVmKFxuICAgICAgICB2b2lkIDBcbiAgICAgICk7XG4gICAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgICAgaXNNb3VudGVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGlzTW91bnRlZC5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICB9LCBbXSk7XG4gICAgICBjb25zdCBhY3R1YWxDaGlsZFByb3BzU2VsZWN0b3IgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCAmJiB3cmFwcGVyUHJvcHMgPT09IGxhc3RXcmFwcGVyUHJvcHMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHNTZWxlY3RvcihzdG9yZS5nZXRTdGF0ZSgpLCB3cmFwcGVyUHJvcHMpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gc2VsZWN0b3I7XG4gICAgICB9LCBbc3RvcmUsIHdyYXBwZXJQcm9wc10pO1xuICAgICAgY29uc3Qgc3Vic2NyaWJlRm9yUmVhY3QgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlID0gKHJlYWN0TGlzdGVuZXIpID0+IHtcbiAgICAgICAgICBpZiAoIXN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVVcGRhdGVzKFxuICAgICAgICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLFxuICAgICAgICAgICAgc3RvcmUsXG4gICAgICAgICAgICBzdWJzY3JpcHRpb24sXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjaGlsZFByb3BzU2VsZWN0b3IsXG4gICAgICAgICAgICBsYXN0V3JhcHBlclByb3BzLFxuICAgICAgICAgICAgbGFzdENoaWxkUHJvcHMsXG4gICAgICAgICAgICByZW5kZXJJc1NjaGVkdWxlZCxcbiAgICAgICAgICAgIGlzTW91bnRlZCxcbiAgICAgICAgICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUsXG4gICAgICAgICAgICBub3RpZnlOZXN0ZWRTdWJzLFxuICAgICAgICAgICAgcmVhY3RMaXN0ZW5lclxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmU7XG4gICAgICB9LCBbc3Vic2NyaXB0aW9uXSk7XG4gICAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0V2l0aEFyZ3MoY2FwdHVyZVdyYXBwZXJQcm9wcywgW1xuICAgICAgICBsYXN0V3JhcHBlclByb3BzLFxuICAgICAgICBsYXN0Q2hpbGRQcm9wcyxcbiAgICAgICAgcmVuZGVySXNTY2hlZHVsZWQsXG4gICAgICAgIHdyYXBwZXJQcm9wcyxcbiAgICAgICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSxcbiAgICAgICAgbm90aWZ5TmVzdGVkU3Vic1xuICAgICAgXSk7XG4gICAgICBsZXQgYWN0dWFsQ2hpbGRQcm9wcztcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjdHVhbENoaWxkUHJvcHMgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICAgICAgICAvLyBUT0RPIFdlJ3JlIHBhc3NpbmcgdGhyb3VnaCBhIGJpZyB3cmFwcGVyIHRoYXQgZG9lcyBhIGJ1bmNoIG9mIGV4dHJhIHNpZGUgZWZmZWN0cyBiZXNpZGVzIHN1YnNjcmliaW5nXG4gICAgICAgICAgc3Vic2NyaWJlRm9yUmVhY3QsXG4gICAgICAgICAgLy8gVE9ETyBUaGlzIGlzIGluY3JlZGlibHkgaGFja3kuIFdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoZSBzdG9yZSB1cGRhdGUgYW5kIGNhbGN1bGF0ZWQgbmV3IGNoaWxkIHByb3BzLFxuICAgICAgICAgIC8vIFRPRE8gYW5kIHdlJ3JlIGp1c3QgcGFzc2luZyB0aGF0IHRocm91Z2ggc28gaXQgdHJpZ2dlcnMgYSByZS1yZW5kZXIgZm9yIHVzIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gYHVTRVNgLlxuICAgICAgICAgIGFjdHVhbENoaWxkUHJvcHNTZWxlY3RvcixcbiAgICAgICAgICBnZXRTZXJ2ZXJTdGF0ZSA/ICgpID0+IGNoaWxkUHJvcHNTZWxlY3RvcihnZXRTZXJ2ZXJTdGF0ZSgpLCB3cmFwcGVyUHJvcHMpIDogYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudCkge1xuICAgICAgICAgIDtcbiAgICAgICAgICBlcnIubWVzc2FnZSArPSBgXG5UaGUgZXJyb3IgbWF5IGJlIGNvcnJlbGF0ZWQgd2l0aCB0aGlzIHByZXZpb3VzIGVycm9yOlxuJHtsYXRlc3RTdWJzY3JpcHRpb25DYWxsYmFja0Vycm9yLmN1cnJlbnQuc3RhY2t9XG5cbmA7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudCA9IHZvaWQgMDtcbiAgICAgICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ID0gdm9pZCAwO1xuICAgICAgICBsYXN0Q2hpbGRQcm9wcy5jdXJyZW50ID0gYWN0dWFsQ2hpbGRQcm9wcztcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50ID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgV3JhcHBlZENvbXBvbmVudCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4uYWN0dWFsQ2hpbGRQcm9wcyxcbiAgICAgICAgICAgICAgcmVmOiByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSwgW3JlYWN0UmVkdXhGb3J3YXJkZWRSZWYsIFdyYXBwZWRDb21wb25lbnQsIGFjdHVhbENoaWxkUHJvcHNdKTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykge1xuICAgICAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0VG9Vc2UuUHJvdmlkZXIsIHsgdmFsdWU6IG92ZXJyaWRkZW5Db250ZXh0VmFsdWUgfSwgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50O1xuICAgICAgfSwgW0NvbnRleHRUb1VzZSwgcmVuZGVyZWRXcmFwcGVkQ29tcG9uZW50LCBvdmVycmlkZGVuQ29udGV4dFZhbHVlXSk7XG4gICAgICByZXR1cm4gcmVuZGVyZWRDaGlsZDtcbiAgICB9XG4gICAgY29uc3QgX0Nvbm5lY3QgPSBSZWFjdC5tZW1vKENvbm5lY3RGdW5jdGlvbik7XG4gICAgY29uc3QgQ29ubmVjdCA9IF9Db25uZWN0O1xuICAgIENvbm5lY3QuV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG4gICAgQ29ubmVjdC5kaXNwbGF5TmFtZSA9IENvbm5lY3RGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgIGlmIChmb3J3YXJkUmVmKSB7XG4gICAgICBjb25zdCBfZm9yd2FyZGVkID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgICAgICAgZnVuY3Rpb24gZm9yd2FyZENvbm5lY3RSZWYocHJvcHMsIHJlZikge1xuICAgICAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChDb25uZWN0LCB7IC4uLnByb3BzLCByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmOiByZWYgfSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBjb25zdCBmb3J3YXJkZWQgPSBfZm9yd2FyZGVkO1xuICAgICAgZm9yd2FyZGVkLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgICBmb3J3YXJkZWQuV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKGZvcndhcmRlZCwgV3JhcHBlZENvbXBvbmVudCk7XG4gICAgfVxuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gaG9pc3ROb25SZWFjdFN0YXRpY3MoQ29ubmVjdCwgV3JhcHBlZENvbXBvbmVudCk7XG4gIH07XG4gIHJldHVybiB3cmFwV2l0aENvbm5lY3Q7XG59XG52YXIgY29ubmVjdF9kZWZhdWx0ID0gY29ubmVjdDtcblxuLy8gc3JjL2NvbXBvbmVudHMvUHJvdmlkZXIudHN4XG5mdW5jdGlvbiBQcm92aWRlcih7XG4gIHN0b3JlLFxuICBjb250ZXh0LFxuICBjaGlsZHJlbixcbiAgc2VydmVyU3RhdGUsXG4gIHN0YWJpbGl0eUNoZWNrID0gXCJvbmNlXCIsXG4gIGlkZW50aXR5RnVuY3Rpb25DaGVjayA9IFwib25jZVwiXG59KSB7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGNyZWF0ZVN1YnNjcmlwdGlvbihzdG9yZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0b3JlLFxuICAgICAgc3Vic2NyaXB0aW9uLFxuICAgICAgZ2V0U2VydmVyU3RhdGU6IHNlcnZlclN0YXRlID8gKCkgPT4gc2VydmVyU3RhdGUgOiB2b2lkIDAsXG4gICAgICBzdGFiaWxpdHlDaGVjayxcbiAgICAgIGlkZW50aXR5RnVuY3Rpb25DaGVja1xuICAgIH07XG4gIH0sIFtzdG9yZSwgc2VydmVyU3RhdGUsIHN0YWJpbGl0eUNoZWNrLCBpZGVudGl0eUZ1bmN0aW9uQ2hlY2tdKTtcbiAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gc3RvcmUuZ2V0U3RhdGUoKSwgW3N0b3JlXSk7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHsgc3Vic2NyaXB0aW9uIH0gPSBjb250ZXh0VmFsdWU7XG4gICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSBzdWJzY3JpcHRpb24ubm90aWZ5TmVzdGVkU3VicztcbiAgICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7XG4gICAgaWYgKHByZXZpb3VzU3RhdGUgIT09IHN0b3JlLmdldFN0YXRlKCkpIHtcbiAgICAgIHN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzKCk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udHJ5VW5zdWJzY3JpYmUoKTtcbiAgICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gdm9pZCAwO1xuICAgIH07XG4gIH0sIFtjb250ZXh0VmFsdWUsIHByZXZpb3VzU3RhdGVdKTtcbiAgY29uc3QgQ29udGV4dCA9IGNvbnRleHQgfHwgUmVhY3RSZWR1eENvbnRleHQ7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBjb250ZXh0VmFsdWUgfSwgY2hpbGRyZW4pO1xufVxudmFyIFByb3ZpZGVyX2RlZmF1bHQgPSBQcm92aWRlcjtcblxuLy8gc3JjL2hvb2tzL3VzZVN0b3JlLnRzXG5mdW5jdGlvbiBjcmVhdGVTdG9yZUhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVJlZHV4Q29udGV4dDIgPSBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZVJlZHV4Q29udGV4dCA6IChcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY3JlYXRlUmVkdXhDb250ZXh0SG9vayhjb250ZXh0KVxuICApO1xuICBjb25zdCB1c2VTdG9yZTIgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzdG9yZSB9ID0gdXNlUmVkdXhDb250ZXh0MigpO1xuICAgIHJldHVybiBzdG9yZTtcbiAgfTtcbiAgT2JqZWN0LmFzc2lnbih1c2VTdG9yZTIsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHVzZVN0b3JlMlxuICB9KTtcbiAgcmV0dXJuIHVzZVN0b3JlMjtcbn1cbnZhciB1c2VTdG9yZSA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVTdG9yZUhvb2soKTtcblxuLy8gc3JjL2hvb2tzL3VzZURpc3BhdGNoLnRzXG5mdW5jdGlvbiBjcmVhdGVEaXNwYXRjaEhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVN0b3JlMiA9IGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlU3RvcmUgOiBjcmVhdGVTdG9yZUhvb2soY29udGV4dCk7XG4gIGNvbnN0IHVzZURpc3BhdGNoMiA9ICgpID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlMigpO1xuICAgIHJldHVybiBzdG9yZS5kaXNwYXRjaDtcbiAgfTtcbiAgT2JqZWN0LmFzc2lnbih1c2VEaXNwYXRjaDIsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHVzZURpc3BhdGNoMlxuICB9KTtcbiAgcmV0dXJuIHVzZURpc3BhdGNoMjtcbn1cbnZhciB1c2VEaXNwYXRjaCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEaXNwYXRjaEhvb2soKTtcblxuLy8gc3JjL2V4cG9ydHMudHNcbnZhciBiYXRjaCA9IGRlZmF1bHROb29wQmF0Y2g7XG5cbi8vIHNyYy9pbmRleC50c1xuaW5pdGlhbGl6ZVVzZVNlbGVjdG9yKHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yMik7XG5pbml0aWFsaXplQ29ubmVjdChSZWFjdDIudXNlU3luY0V4dGVybmFsU3RvcmUpO1xuZXhwb3J0IHtcbiAgUHJvdmlkZXJfZGVmYXVsdCBhcyBQcm92aWRlcixcbiAgUmVhY3RSZWR1eENvbnRleHQsXG4gIGJhdGNoLFxuICBjb25uZWN0X2RlZmF1bHQgYXMgY29ubmVjdCxcbiAgY3JlYXRlRGlzcGF0Y2hIb29rLFxuICBjcmVhdGVTZWxlY3Rvckhvb2ssXG4gIGNyZWF0ZVN0b3JlSG9vayxcbiAgc2hhbGxvd0VxdWFsLFxuICB1c2VEaXNwYXRjaCxcbiAgdXNlU2VsZWN0b3IsXG4gIHVzZVN0b3JlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVhY3QtcmVkdXgubWpzLm1hcCIsIi8vIHNyYy9pbmRleC50c1xuZnVuY3Rpb24gY3JlYXRlVGh1bmtNaWRkbGV3YXJlKGV4dHJhQXJndW1lbnQpIHtcbiAgY29uc3QgbWlkZGxld2FyZSA9ICh7IGRpc3BhdGNoLCBnZXRTdGF0ZSB9KSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmICh0eXBlb2YgYWN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgfTtcbiAgcmV0dXJuIG1pZGRsZXdhcmU7XG59XG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTtcbnZhciB3aXRoRXh0cmFBcmd1bWVudCA9IGNyZWF0ZVRodW5rTWlkZGxld2FyZTtcbmV4cG9ydCB7XG4gIHRodW5rLFxuICB3aXRoRXh0cmFBcmd1bWVudFxufTtcbiIsIi8vIHNyYy91dGlscy9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlLnRzXG5mdW5jdGlvbiBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKGNvZGUpIHtcbiAgcmV0dXJuIGBNaW5pZmllZCBSZWR1eCBlcnJvciAjJHtjb2RlfTsgdmlzaXQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvRXJyb3JzP2NvZGU9JHtjb2RlfSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiBgO1xufVxuXG4vLyBzcmMvdXRpbHMvc3ltYm9sLW9ic2VydmFibGUudHNcbnZhciAkJG9ic2VydmFibGUgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCBcIkBAb2JzZXJ2YWJsZVwiKSgpO1xudmFyIHN5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHQgPSAkJG9ic2VydmFibGU7XG5cbi8vIHNyYy91dGlscy9hY3Rpb25UeXBlcy50c1xudmFyIHJhbmRvbVN0cmluZyA9ICgpID0+IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KS5zcGxpdChcIlwiKS5qb2luKFwiLlwiKTtcbnZhciBBY3Rpb25UeXBlcyA9IHtcbiAgSU5JVDogYEBAcmVkdXgvSU5JVCR7LyogQF9fUFVSRV9fICovIHJhbmRvbVN0cmluZygpfWAsXG4gIFJFUExBQ0U6IGBAQHJlZHV4L1JFUExBQ0Ukey8qIEBfX1BVUkVfXyAqLyByYW5kb21TdHJpbmcoKX1gLFxuICBQUk9CRV9VTktOT1dOX0FDVElPTjogKCkgPT4gYEBAcmVkdXgvUFJPQkVfVU5LTk9XTl9BQ1RJT04ke3JhbmRvbVN0cmluZygpfWBcbn07XG52YXIgYWN0aW9uVHlwZXNfZGVmYXVsdCA9IEFjdGlvblR5cGVzO1xuXG4vLyBzcmMvdXRpbHMvaXNQbGFpbk9iamVjdC50c1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgb2JqID09PSBudWxsKVxuICAgIHJldHVybiBmYWxzZTtcbiAgbGV0IHByb3RvID0gb2JqO1xuICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSAhPT0gbnVsbCkge1xuICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBudWxsO1xufVxuXG4vLyBzcmMvdXRpbHMva2luZE9mLnRzXG5mdW5jdGlvbiBtaW5pS2luZE9mKHZhbCkge1xuICBpZiAodmFsID09PSB2b2lkIDApXG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gIGlmICh2YWwgPT09IG51bGwpXG4gICAgcmV0dXJuIFwibnVsbFwiO1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjoge1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgaWYgKGlzRGF0ZSh2YWwpKVxuICAgIHJldHVybiBcImRhdGVcIjtcbiAgaWYgKGlzRXJyb3IodmFsKSlcbiAgICByZXR1cm4gXCJlcnJvclwiO1xuICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSBjdG9yTmFtZSh2YWwpO1xuICBzd2l0Y2ggKGNvbnN0cnVjdG9yTmFtZSkge1xuICAgIGNhc2UgXCJTeW1ib2xcIjpcbiAgICBjYXNlIFwiUHJvbWlzZVwiOlxuICAgIGNhc2UgXCJXZWFrTWFwXCI6XG4gICAgY2FzZSBcIldlYWtTZXRcIjpcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgY2FzZSBcIlNldFwiOlxuICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzL2csIFwiXCIpO1xufVxuZnVuY3Rpb24gY3Rvck5hbWUodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIgPyB2YWwuY29uc3RydWN0b3IubmFtZSA6IG51bGw7XG59XG5mdW5jdGlvbiBpc0Vycm9yKHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIHZhbC5tZXNzYWdlID09PSBcInN0cmluZ1wiICYmIHZhbC5jb25zdHJ1Y3RvciAmJiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yLnN0YWNrVHJhY2VMaW1pdCA9PT0gXCJudW1iZXJcIjtcbn1cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpXG4gICAgcmV0dXJuIHRydWU7XG4gIHJldHVybiB0eXBlb2YgdmFsLnRvRGF0ZVN0cmluZyA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiB2YWwuZ2V0RGF0ZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiB2YWwuc2V0RGF0ZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24ga2luZE9mKHZhbCkge1xuICBsZXQgdHlwZU9mVmFsID0gdHlwZW9mIHZhbDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHR5cGVPZlZhbCA9IG1pbmlLaW5kT2YodmFsKTtcbiAgfVxuICByZXR1cm4gdHlwZU9mVmFsO1xufVxuXG4vLyBzcmMvY3JlYXRlU3RvcmUudHNcbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICBpZiAodHlwZW9mIHJlZHVjZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIpIDogYEV4cGVjdGVkIHRoZSByb290IHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihyZWR1Y2VyKX0nYCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBlbmhhbmNlciA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBhcmd1bWVudHNbM10gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogXCJJdCBsb29rcyBsaWtlIHlvdSBhcmUgcGFzc2luZyBzZXZlcmFsIHN0b3JlIGVuaGFuY2VycyB0byBjcmVhdGVTdG9yZSgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIEluc3RlYWQsIGNvbXBvc2UgdGhlbSB0b2dldGhlciB0byBhIHNpbmdsZSBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI2NyZWF0aW5nLWEtc3RvcmUtd2l0aC1lbmhhbmNlcnMgZm9yIGFuIGV4YW1wbGUuXCIpO1xuICB9XG4gIGlmICh0eXBlb2YgcHJlbG9hZGVkU3RhdGUgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgZW5oYW5jZXIgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdm9pZCAwO1xuICB9XG4gIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEpIDogYEV4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKGVuaGFuY2VyKX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG4gIGxldCBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIGxldCBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgbGV0IGN1cnJlbnRMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIGxldCBsaXN0ZW5lcklkQ291bnRlciA9IDA7XG4gIGxldCBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKG5leHRMaXN0ZW5lcnMgPT09IGN1cnJlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIG5leHRMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgY3VycmVudExpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lciwga2V5KSA9PiB7XG4gICAgICAgIG5leHRMaXN0ZW5lcnMuc2V0KGtleSwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzKSA6IFwiWW91IG1heSBub3QgY2FsbCBzdG9yZS5nZXRTdGF0ZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gVGhlIHJlZHVjZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHN0YXRlIGFzIGFuIGFyZ3VtZW50LiBQYXNzIGl0IGRvd24gZnJvbSB0aGUgdG9wIHJlZHVjZXIgaW5zdGVhZCBvZiByZWFkaW5nIGl0IGZyb20gdGhlIHN0b3JlLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgfVxuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDQpIDogYEV4cGVjdGVkIHRoZSBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKGxpc3RlbmVyKX0nYCk7XG4gICAgfVxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg1KSA6IFwiWW91IG1heSBub3QgY2FsbCBzdG9yZS5zdWJzY3JpYmUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuIElmIHlvdSB3b3VsZCBsaWtlIHRvIGJlIG5vdGlmaWVkIGFmdGVyIHRoZSBzdG9yZSBoYXMgYmVlbiB1cGRhdGVkLCBzdWJzY3JpYmUgZnJvbSBhIGNvbXBvbmVudCBhbmQgaW52b2tlIHN0b3JlLmdldFN0YXRlKCkgaW4gdGhlIGNhbGxiYWNrIHRvIGFjY2VzcyB0aGUgbGF0ZXN0IHN0YXRlLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuXCIpO1xuICAgIH1cbiAgICBsZXQgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgY29uc3QgbGlzdGVuZXJJZCA9IGxpc3RlbmVySWRDb3VudGVyKys7XG4gICAgbmV4dExpc3RlbmVycy5zZXQobGlzdGVuZXJJZCwgbGlzdGVuZXIpO1xuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgIGlmICghaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDYpIDogXCJZb3UgbWF5IG5vdCB1bnN1YnNjcmliZSBmcm9tIGEgc3RvcmUgbGlzdGVuZXIgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuXCIpO1xuICAgICAgfVxuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgICBuZXh0TGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcklkKTtcbiAgICAgIGN1cnJlbnRMaXN0ZW5lcnMgPSBudWxsO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpIDogYEFjdGlvbnMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLiBJbnN0ZWFkLCB0aGUgYWN0dWFsIHR5cGUgd2FzOiAnJHtraW5kT2YoYWN0aW9uKX0nLiBZb3UgbWF5IG5lZWQgdG8gYWRkIG1pZGRsZXdhcmUgdG8geW91ciBzdG9yZSBzZXR1cCB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgb3RoZXIgdmFsdWVzLCBzdWNoIGFzICdyZWR1eC10aHVuaycgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIGZ1bmN0aW9ucy4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI21pZGRsZXdhcmUgYW5kIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC02LWFzeW5jLWxvZ2ljI3VzaW5nLXRoZS1yZWR1eC10aHVuay1taWRkbGV3YXJlIGZvciBleGFtcGxlcy5gKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiAnQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiBZb3UgbWF5IGhhdmUgbWlzc3BlbGxlZCBhbiBhY3Rpb24gdHlwZSBzdHJpbmcgY29uc3RhbnQuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE3KSA6IGBBY3Rpb24gXCJ0eXBlXCIgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZy4gSW5zdGVhZCwgdGhlIGFjdHVhbCB0eXBlIHdhczogJyR7a2luZE9mKGFjdGlvbi50eXBlKX0nLiBWYWx1ZSB3YXM6ICcke2FjdGlvbi50eXBlfScgKHN0cmluZ2lmaWVkKWApO1xuICAgIH1cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOSkgOiBcIlJlZHVjZXJzIG1heSBub3QgZGlzcGF0Y2ggYWN0aW9ucy5cIik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRSZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzID0gbmV4dExpc3RlbmVycztcbiAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuICBmdW5jdGlvbiByZXBsYWNlUmVkdWNlcihuZXh0UmVkdWNlcikge1xuICAgIGlmICh0eXBlb2YgbmV4dFJlZHVjZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTApIDogYEV4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKG5leHRSZWR1Y2VyKX1gKTtcbiAgICB9XG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LlJFUExBQ0VcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBvYnNlcnZhYmxlKCkge1xuICAgIGNvbnN0IG91dGVyU3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBtaW5pbWFsIG9ic2VydmFibGUgc3Vic2NyaXB0aW9uIG1ldGhvZC5cbiAgICAgICAqIEBwYXJhbSBvYnNlcnZlciBBbnkgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gb2JzZXJ2ZXIuXG4gICAgICAgKiBUaGUgb2JzZXJ2ZXIgb2JqZWN0IHNob3VsZCBoYXZlIGEgYG5leHRgIG1ldGhvZC5cbiAgICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGFuIGB1bnN1YnNjcmliZWAgbWV0aG9kIHRoYXQgY2FuXG4gICAgICAgKiBiZSB1c2VkIHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIGZyb20gdGhlIHN0b3JlLCBhbmQgcHJldmVudCBmdXJ0aGVyXG4gICAgICAgKiBlbWlzc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgb2JzZXJ2YWJsZS5cbiAgICAgICAqL1xuICAgICAgc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09IFwib2JqZWN0XCIgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMSkgOiBgRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICcke2tpbmRPZihvYnNlcnZlcil9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG9ic2VydmVTdGF0ZSgpIHtcbiAgICAgICAgICBjb25zdCBvYnNlcnZlckFzT2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXJBc09ic2VydmVyLm5leHQpIHtcbiAgICAgICAgICAgIG9ic2VydmVyQXNPYnNlcnZlci5uZXh0KGdldFN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvYnNlcnZlU3RhdGUoKTtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBvdXRlclN1YnNjcmliZShvYnNlcnZlU3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVuc3Vic2NyaWJlXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgW3N5bWJvbF9vYnNlcnZhYmxlX2RlZmF1bHRdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGRpc3BhdGNoKHtcbiAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LklOSVRcbiAgfSk7XG4gIGNvbnN0IHN0b3JlID0ge1xuICAgIGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZSxcbiAgICBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcixcbiAgICBbc3ltYm9sX29ic2VydmFibGVfZGVmYXVsdF06IG9ic2VydmFibGVcbiAgfTtcbiAgcmV0dXJuIHN0b3JlO1xufVxuZnVuY3Rpb24gbGVnYWN5X2NyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICByZXR1cm4gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKTtcbn1cblxuLy8gc3JjL3V0aWxzL3dhcm5pbmcudHNcbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgdHJ5IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxufVxuXG4vLyBzcmMvY29tYmluZVJlZHVjZXJzLnRzXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICBjb25zdCByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgY29uc3QgYXJndW1lbnROYW1lID0gYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBhY3Rpb25UeXBlc19kZWZhdWx0LklOSVQgPyBcInByZWxvYWRlZFN0YXRlIGFyZ3VtZW50IHBhc3NlZCB0byBjcmVhdGVTdG9yZVwiIDogXCJwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlclwiO1xuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIGNvbWJpbmVSZWR1Y2VycyBpcyBhbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSByZWR1Y2Vycy5cIjtcbiAgfVxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gYFRoZSAke2FyZ3VtZW50TmFtZX0gaGFzIHVuZXhwZWN0ZWQgdHlwZSBvZiBcIiR7a2luZE9mKGlucHV0U3RhdGUpfVwiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGtleXM6IFwiJHtyZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKX1cImA7XG4gIH1cbiAgY29uc3QgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoKGtleSkgPT4gIXJlZHVjZXJzLmhhc093blByb3BlcnR5KGtleSkgJiYgIXVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldKTtcbiAgdW5leHBlY3RlZEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlW2tleV0gPSB0cnVlO1xuICB9KTtcbiAgaWYgKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gYWN0aW9uVHlwZXNfZGVmYXVsdC5SRVBMQUNFKVxuICAgIHJldHVybjtcbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYFVuZXhwZWN0ZWQgJHt1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAxID8gXCJrZXlzXCIgOiBcImtleVwifSBcIiR7dW5leHBlY3RlZEtleXMuam9pbignXCIsIFwiJyl9XCIgZm91bmQgaW4gJHthcmd1bWVudE5hbWV9LiBFeHBlY3RlZCB0byBmaW5kIG9uZSBvZiB0aGUga25vd24gcmVkdWNlciBrZXlzIGluc3RlYWQ6IFwiJHtyZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKX1cIi4gVW5leHBlY3RlZCBrZXlzIHdpbGwgYmUgaWdub3JlZC5gO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2hhcGUocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IHJlZHVjZXIgPSByZWR1Y2Vyc1trZXldO1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodm9pZCAwLCB7XG4gICAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LklOSVRcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTIpIDogYFRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke2tleX1cIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCB5b3UgY2FuIHVzZSBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLmApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZHVjZXIodm9pZCAwLCB7XG4gICAgICB0eXBlOiBhY3Rpb25UeXBlc19kZWZhdWx0LlBST0JFX1VOS05PV05fQUNUSU9OKClcbiAgICB9KSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogYFRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke2tleX1cIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiBEb24ndCB0cnkgdG8gaGFuZGxlICcke2FjdGlvblR5cGVzX2RlZmF1bHQuSU5JVH0nIG9yIG90aGVyIGFjdGlvbnMgaW4gXCJyZWR1eC8qXCIgbmFtZXNwYWNlLiBUaGV5IGFyZSBjb25zaWRlcmVkIHByaXZhdGUuIEluc3RlYWQsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYW55IHVua25vd24gYWN0aW9ucywgdW5sZXNzIGl0IGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdGlvbiB0eXBlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZCwgYnV0IGNhbiBiZSBudWxsLmApO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpIHtcbiAgY29uc3QgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIGNvbnN0IGZpbmFsUmVkdWNlcnMgPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IHJlZHVjZXJLZXlzW2ldO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB3YXJuaW5nKGBObyByZWR1Y2VyIHByb3ZpZGVkIGZvciBrZXkgXCIke2tleX1cImApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpO1xuICBsZXQgdW5leHBlY3RlZEtleUNhY2hlO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cbiAgbGV0IHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UmVkdWNlclNoYXBlKGZpbmFsUmVkdWNlcnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2hhcGVBc3NlcnRpb25FcnJvciA9IGU7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbWJpbmF0aW9uKHN0YXRlID0ge30sIGFjdGlvbikge1xuICAgIGlmIChzaGFwZUFzc2VydGlvbkVycm9yKSB7XG4gICAgICB0aHJvdyBzaGFwZUFzc2VydGlvbkVycm9yO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2Uoc3RhdGUsIGZpbmFsUmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKTtcbiAgICAgIGlmICh3YXJuaW5nTWVzc2FnZSkge1xuICAgICAgICB3YXJuaW5nKHdhcm5pbmdNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGZpbmFsUmVkdWNlcktleXNbaV07XG4gICAgICBjb25zdCByZWR1Y2VyID0gZmluYWxSZWR1Y2Vyc1trZXldO1xuICAgICAgY29uc3QgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW2tleV07XG4gICAgICBjb25zdCBuZXh0U3RhdGVGb3JLZXkgPSByZWR1Y2VyKHByZXZpb3VzU3RhdGVGb3JLZXksIGFjdGlvbik7XG4gICAgICBpZiAodHlwZW9mIG5leHRTdGF0ZUZvcktleSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBjb25zdCBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBgV2hlbiBjYWxsZWQgd2l0aCBhbiBhY3Rpb24gb2YgdHlwZSAke2FjdGlvblR5cGUgPyBgXCIke1N0cmluZyhhY3Rpb25UeXBlKX1cImAgOiBcIih1bmtub3duIHR5cGUpXCJ9LCB0aGUgc2xpY2UgcmVkdWNlciBmb3Iga2V5IFwiJHtrZXl9XCIgcmV0dXJuZWQgdW5kZWZpbmVkLiBUbyBpZ25vcmUgYW4gYWN0aW9uLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgcHJldmlvdXMgc3RhdGUuIElmIHlvdSB3YW50IHRoaXMgcmVkdWNlciB0byBob2xkIG5vIHZhbHVlLCB5b3UgY2FuIHJldHVybiBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLmApO1xuICAgICAgfVxuICAgICAgbmV4dFN0YXRlW2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzdGF0ZSkubGVuZ3RoO1xuICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV4dFN0YXRlIDogc3RhdGU7XG4gIH07XG59XG5cbi8vIHNyYy9iaW5kQWN0aW9uQ3JlYXRvcnMudHNcbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IuYXBwbHkodGhpcywgYXJncykpO1xuICB9O1xufVxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKTtcbiAgfVxuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzICE9PSBcIm9iamVjdFwiIHx8IGFjdGlvbkNyZWF0b3JzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTYpIDogYGJpbmRBY3Rpb25DcmVhdG9ycyBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwgYnV0IGluc3RlYWQgcmVjZWl2ZWQ6ICcke2tpbmRPZihhY3Rpb25DcmVhdG9ycyl9Jy4gRGlkIHlvdSB3cml0ZSBcImltcG9ydCBBY3Rpb25DcmVhdG9ycyBmcm9tXCIgaW5zdGVhZCBvZiBcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cIj9gKTtcbiAgfVxuICBjb25zdCBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgY29uc3QgYWN0aW9uQ3JlYXRvciA9IGFjdGlvbkNyZWF0b3JzW2tleV07XG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGJvdW5kQWN0aW9uQ3JlYXRvcnNba2V5XSA9IGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8vIHNyYy9jb21wb3NlLnRzXG5mdW5jdGlvbiBjb21wb3NlKC4uLmZ1bmNzKSB7XG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFyZykgPT4gYXJnO1xuICB9XG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZnVuY3NbMF07XG4gIH1cbiAgcmV0dXJuIGZ1bmNzLnJlZHVjZSgoYSwgYikgPT4gKC4uLmFyZ3MpID0+IGEoYiguLi5hcmdzKSkpO1xufVxuXG4vLyBzcmMvYXBwbHlNaWRkbGV3YXJlLnRzXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoLi4ubWlkZGxld2FyZXMpIHtcbiAgcmV0dXJuIChjcmVhdGVTdG9yZTIpID0+IChyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHN0b3JlID0gY3JlYXRlU3RvcmUyKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgICBsZXQgZGlzcGF0Y2ggPSAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNSkgOiBcIkRpc3BhdGNoaW5nIHdoaWxlIGNvbnN0cnVjdGluZyB5b3VyIG1pZGRsZXdhcmUgaXMgbm90IGFsbG93ZWQuIE90aGVyIG1pZGRsZXdhcmUgd291bGQgbm90IGJlIGFwcGxpZWQgdG8gdGhpcyBkaXNwYXRjaC5cIik7XG4gICAgfTtcbiAgICBjb25zdCBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgZGlzcGF0Y2g6IChhY3Rpb24sIC4uLmFyZ3MpID0+IGRpc3BhdGNoKGFjdGlvbiwgLi4uYXJncylcbiAgICB9O1xuICAgIGNvbnN0IGNoYWluID0gbWlkZGxld2FyZXMubWFwKChtaWRkbGV3YXJlKSA9PiBtaWRkbGV3YXJlKG1pZGRsZXdhcmVBUEkpKTtcbiAgICBkaXNwYXRjaCA9IGNvbXBvc2UoLi4uY2hhaW4pKHN0b3JlLmRpc3BhdGNoKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RvcmUsXG4gICAgICBkaXNwYXRjaFxuICAgIH07XG4gIH07XG59XG5cbi8vIHNyYy91dGlscy9pc0FjdGlvbi50c1xuZnVuY3Rpb24gaXNBY3Rpb24oYWN0aW9uKSB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KGFjdGlvbikgJiYgXCJ0eXBlXCIgaW4gYWN0aW9uICYmIHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gXCJzdHJpbmdcIjtcbn1cbmV4cG9ydCB7XG4gIGFjdGlvblR5cGVzX2RlZmF1bHQgYXMgX19ET19OT1RfVVNFX19BY3Rpb25UeXBlcyxcbiAgYXBwbHlNaWRkbGV3YXJlLFxuICBiaW5kQWN0aW9uQ3JlYXRvcnMsXG4gIGNvbWJpbmVSZWR1Y2VycyxcbiAgY29tcG9zZSxcbiAgY3JlYXRlU3RvcmUsXG4gIGlzQWN0aW9uLFxuICBpc1BsYWluT2JqZWN0LFxuICBsZWdhY3lfY3JlYXRlU3RvcmVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1eC5tanMubWFwIiwiLy8gc3JjL2Rldk1vZGVDaGVja3MvaWRlbnRpdHlGdW5jdGlvbkNoZWNrLnRzXG52YXIgcnVuSWRlbnRpdHlGdW5jdGlvbkNoZWNrID0gKHJlc3VsdEZ1bmMsIGlucHV0U2VsZWN0b3JzUmVzdWx0cywgb3V0cHV0U2VsZWN0b3JSZXN1bHQpID0+IHtcbiAgaWYgKGlucHV0U2VsZWN0b3JzUmVzdWx0cy5sZW5ndGggPT09IDEgJiYgaW5wdXRTZWxlY3RvcnNSZXN1bHRzWzBdID09PSBvdXRwdXRTZWxlY3RvclJlc3VsdCkge1xuICAgIGxldCBpc0lucHV0U2FtZUFzT3V0cHV0ID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVtcHR5T2JqZWN0ID0ge307XG4gICAgICBpZiAocmVzdWx0RnVuYyhlbXB0eU9iamVjdCkgPT09IGVtcHR5T2JqZWN0KVxuICAgICAgICBpc0lucHV0U2FtZUFzT3V0cHV0ID0gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICB9XG4gICAgaWYgKGlzSW5wdXRTYW1lQXNPdXRwdXQpIHtcbiAgICAgIGxldCBzdGFjayA9IHZvaWQgMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICA7XG4gICAgICAgICh7IHN0YWNrIH0gPSBlKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJUaGUgcmVzdWx0IGZ1bmN0aW9uIHJldHVybmVkIGl0cyBvd24gaW5wdXRzIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiBlLmdcXG5gY3JlYXRlU2VsZWN0b3IoW3N0YXRlID0+IHN0YXRlLnRvZG9zXSwgdG9kb3MgPT4gdG9kb3MpYFxcblRoaXMgY291bGQgbGVhZCB0byBpbmVmZmljaWVudCBtZW1vaXphdGlvbiBhbmQgdW5uZWNlc3NhcnkgcmUtcmVuZGVycy5cXG5FbnN1cmUgdHJhbnNmb3JtYXRpb24gbG9naWMgaXMgaW4gdGhlIHJlc3VsdCBmdW5jdGlvbiwgYW5kIGV4dHJhY3Rpb24gbG9naWMgaXMgaW4gdGhlIGlucHV0IHNlbGVjdG9ycy5cIixcbiAgICAgICAgeyBzdGFjayB9XG4gICAgICApO1xuICAgIH1cbiAgfVxufTtcblxuLy8gc3JjL2Rldk1vZGVDaGVja3MvaW5wdXRTdGFiaWxpdHlDaGVjay50c1xudmFyIHJ1bklucHV0U3RhYmlsaXR5Q2hlY2sgPSAoaW5wdXRTZWxlY3RvclJlc3VsdHNPYmplY3QsIG9wdGlvbnMsIGlucHV0U2VsZWN0b3JBcmdzKSA9PiB7XG4gIGNvbnN0IHsgbWVtb2l6ZSwgbWVtb2l6ZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHsgaW5wdXRTZWxlY3RvclJlc3VsdHMsIGlucHV0U2VsZWN0b3JSZXN1bHRzQ29weSB9ID0gaW5wdXRTZWxlY3RvclJlc3VsdHNPYmplY3Q7XG4gIGNvbnN0IGNyZWF0ZUFuRW1wdHlPYmplY3QgPSBtZW1vaXplKCgpID0+ICh7fSksIC4uLm1lbW9pemVPcHRpb25zKTtcbiAgY29uc3QgYXJlSW5wdXRTZWxlY3RvclJlc3VsdHNFcXVhbCA9IGNyZWF0ZUFuRW1wdHlPYmplY3QuYXBwbHkobnVsbCwgaW5wdXRTZWxlY3RvclJlc3VsdHMpID09PSBjcmVhdGVBbkVtcHR5T2JqZWN0LmFwcGx5KG51bGwsIGlucHV0U2VsZWN0b3JSZXN1bHRzQ29weSk7XG4gIGlmICghYXJlSW5wdXRTZWxlY3RvclJlc3VsdHNFcXVhbCkge1xuICAgIGxldCBzdGFjayA9IHZvaWQgMDtcbiAgICB0cnkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgO1xuICAgICAgKHsgc3RhY2sgfSA9IGUpO1xuICAgIH1cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIkFuIGlucHV0IHNlbGVjdG9yIHJldHVybmVkIGEgZGlmZmVyZW50IHJlc3VsdCB3aGVuIHBhc3NlZCBzYW1lIGFyZ3VtZW50cy5cXG5UaGlzIG1lYW5zIHlvdXIgb3V0cHV0IHNlbGVjdG9yIHdpbGwgbGlrZWx5IHJ1biBtb3JlIGZyZXF1ZW50bHkgdGhhbiBpbnRlbmRlZC5cXG5Bdm9pZCByZXR1cm5pbmcgYSBuZXcgcmVmZXJlbmNlIGluc2lkZSB5b3VyIGlucHV0IHNlbGVjdG9yLCBlLmcuXFxuYGNyZWF0ZVNlbGVjdG9yKFtzdGF0ZSA9PiBzdGF0ZS50b2Rvcy5tYXAodG9kbyA9PiB0b2RvLmlkKV0sIHRvZG9JZHMgPT4gdG9kb0lkcy5sZW5ndGgpYFwiLFxuICAgICAge1xuICAgICAgICBhcmd1bWVudHM6IGlucHV0U2VsZWN0b3JBcmdzLFxuICAgICAgICBmaXJzdElucHV0czogaW5wdXRTZWxlY3RvclJlc3VsdHMsXG4gICAgICAgIHNlY29uZElucHV0czogaW5wdXRTZWxlY3RvclJlc3VsdHNDb3B5LFxuICAgICAgICBzdGFja1xuICAgICAgfVxuICAgICk7XG4gIH1cbn07XG5cbi8vIHNyYy9kZXZNb2RlQ2hlY2tzL3NldEdsb2JhbERldk1vZGVDaGVja3MudHNcbnZhciBnbG9iYWxEZXZNb2RlQ2hlY2tzID0ge1xuICBpbnB1dFN0YWJpbGl0eUNoZWNrOiBcIm9uY2VcIixcbiAgaWRlbnRpdHlGdW5jdGlvbkNoZWNrOiBcIm9uY2VcIlxufTtcbnZhciBzZXRHbG9iYWxEZXZNb2RlQ2hlY2tzID0gKGRldk1vZGVDaGVja3MpID0+IHtcbiAgT2JqZWN0LmFzc2lnbihnbG9iYWxEZXZNb2RlQ2hlY2tzLCBkZXZNb2RlQ2hlY2tzKTtcbn07XG5cbi8vIHNyYy91dGlscy50c1xudmFyIE5PVF9GT1VORCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2woXCJOT1RfRk9VTkRcIik7XG5mdW5jdGlvbiBhc3NlcnRJc0Z1bmN0aW9uKGZ1bmMsIGVycm9yTWVzc2FnZSA9IGBleHBlY3RlZCBhIGZ1bmN0aW9uLCBpbnN0ZWFkIHJlY2VpdmVkICR7dHlwZW9mIGZ1bmN9YCkge1xuICBpZiAodHlwZW9mIGZ1bmMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0SXNPYmplY3Qob2JqZWN0LCBlcnJvck1lc3NhZ2UgPSBgZXhwZWN0ZWQgYW4gb2JqZWN0LCBpbnN0ZWFkIHJlY2VpdmVkICR7dHlwZW9mIG9iamVjdH1gKSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJvck1lc3NhZ2UpO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnRJc0FycmF5T2ZGdW5jdGlvbnMoYXJyYXksIGVycm9yTWVzc2FnZSA9IGBleHBlY3RlZCBhbGwgaXRlbXMgdG8gYmUgZnVuY3Rpb25zLCBpbnN0ZWFkIHJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgdHlwZXM6IGApIHtcbiAgaWYgKCFhcnJheS5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICBjb25zdCBpdGVtVHlwZXMgPSBhcnJheS5tYXAoXG4gICAgICAoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09IFwiZnVuY3Rpb25cIiA/IGBmdW5jdGlvbiAke2l0ZW0ubmFtZSB8fCBcInVubmFtZWRcIn0oKWAgOiB0eXBlb2YgaXRlbVxuICAgICkuam9pbihcIiwgXCIpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZXJyb3JNZXNzYWdlfVske2l0ZW1UeXBlc31dYCk7XG4gIH1cbn1cbnZhciBlbnN1cmVJc0FycmF5ID0gKGl0ZW0pID0+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtIDogW2l0ZW1dO1xufTtcbmZ1bmN0aW9uIGdldERlcGVuZGVuY2llcyhjcmVhdGVTZWxlY3RvckFyZ3MpIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gQXJyYXkuaXNBcnJheShjcmVhdGVTZWxlY3RvckFyZ3NbMF0pID8gY3JlYXRlU2VsZWN0b3JBcmdzWzBdIDogY3JlYXRlU2VsZWN0b3JBcmdzO1xuICBhc3NlcnRJc0FycmF5T2ZGdW5jdGlvbnMoXG4gICAgZGVwZW5kZW5jaWVzLFxuICAgIGBjcmVhdGVTZWxlY3RvciBleHBlY3RzIGFsbCBpbnB1dC1zZWxlY3RvcnMgdG8gYmUgZnVuY3Rpb25zLCBidXQgcmVjZWl2ZWQgdGhlIGZvbGxvd2luZyB0eXBlczogYFxuICApO1xuICByZXR1cm4gZGVwZW5kZW5jaWVzO1xufVxuZnVuY3Rpb24gY29sbGVjdElucHV0U2VsZWN0b3JSZXN1bHRzKGRlcGVuZGVuY2llcywgaW5wdXRTZWxlY3RvckFyZ3MpIHtcbiAgY29uc3QgaW5wdXRTZWxlY3RvclJlc3VsdHMgPSBbXTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGRlcGVuZGVuY2llcztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlucHV0U2VsZWN0b3JSZXN1bHRzLnB1c2goZGVwZW5kZW5jaWVzW2ldLmFwcGx5KG51bGwsIGlucHV0U2VsZWN0b3JBcmdzKSk7XG4gIH1cbiAgcmV0dXJuIGlucHV0U2VsZWN0b3JSZXN1bHRzO1xufVxudmFyIGdldERldk1vZGVDaGVja3NFeGVjdXRpb25JbmZvID0gKGZpcnN0UnVuLCBkZXZNb2RlQ2hlY2tzKSA9PiB7XG4gIGNvbnN0IHsgaWRlbnRpdHlGdW5jdGlvbkNoZWNrLCBpbnB1dFN0YWJpbGl0eUNoZWNrIH0gPSB7XG4gICAgLi4uZ2xvYmFsRGV2TW9kZUNoZWNrcyxcbiAgICAuLi5kZXZNb2RlQ2hlY2tzXG4gIH07XG4gIHJldHVybiB7XG4gICAgaWRlbnRpdHlGdW5jdGlvbkNoZWNrOiB7XG4gICAgICBzaG91bGRSdW46IGlkZW50aXR5RnVuY3Rpb25DaGVjayA9PT0gXCJhbHdheXNcIiB8fCBpZGVudGl0eUZ1bmN0aW9uQ2hlY2sgPT09IFwib25jZVwiICYmIGZpcnN0UnVuLFxuICAgICAgcnVuOiBydW5JZGVudGl0eUZ1bmN0aW9uQ2hlY2tcbiAgICB9LFxuICAgIGlucHV0U3RhYmlsaXR5Q2hlY2s6IHtcbiAgICAgIHNob3VsZFJ1bjogaW5wdXRTdGFiaWxpdHlDaGVjayA9PT0gXCJhbHdheXNcIiB8fCBpbnB1dFN0YWJpbGl0eUNoZWNrID09PSBcIm9uY2VcIiAmJiBmaXJzdFJ1bixcbiAgICAgIHJ1bjogcnVuSW5wdXRTdGFiaWxpdHlDaGVja1xuICAgIH1cbiAgfTtcbn07XG5cbi8vIHNyYy9hdXRvdHJhY2tNZW1vaXplL2F1dG90cmFja2luZy50c1xudmFyICRSRVZJU0lPTiA9IDA7XG52YXIgQ1VSUkVOVF9UUkFDS0VSID0gbnVsbDtcbnZhciBDZWxsID0gY2xhc3Mge1xuICByZXZpc2lvbiA9ICRSRVZJU0lPTjtcbiAgX3ZhbHVlO1xuICBfbGFzdFZhbHVlO1xuICBfaXNFcXVhbCA9IHRyaXBsZUVxO1xuICBjb25zdHJ1Y3Rvcihpbml0aWFsVmFsdWUsIGlzRXF1YWwgPSB0cmlwbGVFcSkge1xuICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fbGFzdFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgIHRoaXMuX2lzRXF1YWwgPSBpc0VxdWFsO1xuICB9XG4gIC8vIFdoZW5ldmVyIGEgc3RvcmFnZSB2YWx1ZSBpcyByZWFkLCBpdCdsbCBhZGQgaXRzZWxmIHRvIHRoZSBjdXJyZW50IHRyYWNrZXIgaWZcbiAgLy8gb25lIGV4aXN0cywgZW50YW5nbGluZyBpdHMgc3RhdGUgd2l0aCB0aGF0IGNhY2hlLlxuICBnZXQgdmFsdWUoKSB7XG4gICAgQ1VSUkVOVF9UUkFDS0VSPy5hZGQodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIC8vIFdoZW5ldmVyIGEgc3RvcmFnZSB2YWx1ZSBpcyB1cGRhdGVkLCB3ZSBidW1wIHRoZSBnbG9iYWwgcmV2aXNpb24gY2xvY2ssXG4gIC8vIGFzc2lnbiB0aGUgcmV2aXNpb24gZm9yIHRoaXMgc3RvcmFnZSB0byB0aGUgbmV3IHZhbHVlLCBfYW5kXyB3ZSBzY2hlZHVsZSBhXG4gIC8vIHJlcmVuZGVyLiBUaGlzIGlzIGltcG9ydGFudCwgYW5kIGl0J3Mgd2hhdCBtYWtlcyBhdXRvdHJhY2tpbmcgIF9wdWxsX1xuICAvLyBiYXNlZC4gV2UgZG9uJ3QgYWN0aXZlbHkgdGVsbCB0aGUgY2FjaGVzIHdoaWNoIGRlcGVuZCBvbiB0aGUgc3RvcmFnZSB0aGF0XG4gIC8vIGFueXRoaW5nIGhhcyBoYXBwZW5lZC4gSW5zdGVhZCwgd2UgcmVjb21wdXRlIHRoZSBjYWNoZXMgd2hlbiBuZWVkZWQuXG4gIHNldCB2YWx1ZShuZXdWYWx1ZSkge1xuICAgIGlmICh0aGlzLnZhbHVlID09PSBuZXdWYWx1ZSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMucmV2aXNpb24gPSArKyRSRVZJU0lPTjtcbiAgfVxufTtcbmZ1bmN0aW9uIHRyaXBsZUVxKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT09IGI7XG59XG52YXIgVHJhY2tpbmdDYWNoZSA9IGNsYXNzIHtcbiAgX2NhY2hlZFZhbHVlO1xuICBfY2FjaGVkUmV2aXNpb24gPSAtMTtcbiAgX2RlcHMgPSBbXTtcbiAgaGl0cyA9IDA7XG4gIGZuO1xuICBjb25zdHJ1Y3Rvcihmbikge1xuICAgIHRoaXMuZm4gPSBmbjtcbiAgfVxuICBjbGVhcigpIHtcbiAgICB0aGlzLl9jYWNoZWRWYWx1ZSA9IHZvaWQgMDtcbiAgICB0aGlzLl9jYWNoZWRSZXZpc2lvbiA9IC0xO1xuICAgIHRoaXMuX2RlcHMgPSBbXTtcbiAgICB0aGlzLmhpdHMgPSAwO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICBpZiAodGhpcy5yZXZpc2lvbiA+IHRoaXMuX2NhY2hlZFJldmlzaW9uKSB7XG4gICAgICBjb25zdCB7IGZuIH0gPSB0aGlzO1xuICAgICAgY29uc3QgY3VycmVudFRyYWNrZXIgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgICAgY29uc3QgcHJldlRyYWNrZXIgPSBDVVJSRU5UX1RSQUNLRVI7XG4gICAgICBDVVJSRU5UX1RSQUNLRVIgPSBjdXJyZW50VHJhY2tlcjtcbiAgICAgIHRoaXMuX2NhY2hlZFZhbHVlID0gZm4oKTtcbiAgICAgIENVUlJFTlRfVFJBQ0tFUiA9IHByZXZUcmFja2VyO1xuICAgICAgdGhpcy5oaXRzKys7XG4gICAgICB0aGlzLl9kZXBzID0gQXJyYXkuZnJvbShjdXJyZW50VHJhY2tlcik7XG4gICAgICB0aGlzLl9jYWNoZWRSZXZpc2lvbiA9IHRoaXMucmV2aXNpb247XG4gICAgfVxuICAgIENVUlJFTlRfVFJBQ0tFUj8uYWRkKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl9jYWNoZWRWYWx1ZTtcbiAgfVxuICBnZXQgcmV2aXNpb24oKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLnRoaXMuX2RlcHMubWFwKChkKSA9PiBkLnJldmlzaW9uKSwgMCk7XG4gIH1cbn07XG5mdW5jdGlvbiBnZXRWYWx1ZShjZWxsKSB7XG4gIGlmICghKGNlbGwgaW5zdGFuY2VvZiBDZWxsKSkge1xuICAgIGNvbnNvbGUud2FybihcIk5vdCBhIHZhbGlkIGNlbGwhIFwiLCBjZWxsKTtcbiAgfVxuICByZXR1cm4gY2VsbC52YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldFZhbHVlKHN0b3JhZ2UsIHZhbHVlKSB7XG4gIGlmICghKHN0b3JhZ2UgaW5zdGFuY2VvZiBDZWxsKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcInNldFZhbHVlIG11c3QgYmUgcGFzc2VkIGEgdHJhY2tlZCBzdG9yZSBjcmVhdGVkIHdpdGggYGNyZWF0ZVN0b3JhZ2VgLlwiXG4gICAgKTtcbiAgfVxuICBzdG9yYWdlLnZhbHVlID0gc3RvcmFnZS5fbGFzdFZhbHVlID0gdmFsdWU7XG59XG5mdW5jdGlvbiBjcmVhdGVDZWxsKGluaXRpYWxWYWx1ZSwgaXNFcXVhbCA9IHRyaXBsZUVxKSB7XG4gIHJldHVybiBuZXcgQ2VsbChpbml0aWFsVmFsdWUsIGlzRXF1YWwpO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoZm4pIHtcbiAgYXNzZXJ0SXNGdW5jdGlvbihcbiAgICBmbixcbiAgICBcInRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gYGNyZWF0ZUNhY2hlYCBtdXN0IGJlIGEgZnVuY3Rpb25cIlxuICApO1xuICByZXR1cm4gbmV3IFRyYWNraW5nQ2FjaGUoZm4pO1xufVxuXG4vLyBzcmMvYXV0b3RyYWNrTWVtb2l6ZS90cmFja2luZy50c1xudmFyIG5ldmVyRXEgPSAoYSwgYikgPT4gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVUYWcoKSB7XG4gIHJldHVybiBjcmVhdGVDZWxsKG51bGwsIG5ldmVyRXEpO1xufVxuZnVuY3Rpb24gZGlydHlUYWcodGFnLCB2YWx1ZSkge1xuICBzZXRWYWx1ZSh0YWcsIHZhbHVlKTtcbn1cbnZhciBjb25zdW1lQ29sbGVjdGlvbiA9IChub2RlKSA9PiB7XG4gIGxldCB0YWcgPSBub2RlLmNvbGxlY3Rpb25UYWc7XG4gIGlmICh0YWcgPT09IG51bGwpIHtcbiAgICB0YWcgPSBub2RlLmNvbGxlY3Rpb25UYWcgPSBjcmVhdGVUYWcoKTtcbiAgfVxuICBnZXRWYWx1ZSh0YWcpO1xufTtcbnZhciBkaXJ0eUNvbGxlY3Rpb24gPSAobm9kZSkgPT4ge1xuICBjb25zdCB0YWcgPSBub2RlLmNvbGxlY3Rpb25UYWc7XG4gIGlmICh0YWcgIT09IG51bGwpIHtcbiAgICBkaXJ0eVRhZyh0YWcsIG51bGwpO1xuICB9XG59O1xuXG4vLyBzcmMvYXV0b3RyYWNrTWVtb2l6ZS9wcm94eS50c1xudmFyIFJFRFVYX1BST1hZX0xBQkVMID0gU3ltYm9sKCk7XG52YXIgbmV4dElkID0gMDtcbnZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih7fSk7XG52YXIgT2JqZWN0VHJlZU5vZGUgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnRhZy52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIHByb3h5ID0gbmV3IFByb3h5KHRoaXMsIG9iamVjdFByb3h5SGFuZGxlcik7XG4gIHRhZyA9IGNyZWF0ZVRhZygpO1xuICB0YWdzID0ge307XG4gIGNoaWxkcmVuID0ge307XG4gIGNvbGxlY3Rpb25UYWcgPSBudWxsO1xuICBpZCA9IG5leHRJZCsrO1xufTtcbnZhciBvYmplY3RQcm94eUhhbmRsZXIgPSB7XG4gIGdldChub2RlLCBrZXkpIHtcbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVSZXN1bHQoKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBub2RlO1xuICAgICAgY29uc3QgY2hpbGRWYWx1ZSA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBrZXkpO1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkVmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoa2V5IGluIHByb3RvKSB7XG4gICAgICAgIHJldHVybiBjaGlsZFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjaGlsZFZhbHVlID09PSBcIm9iamVjdFwiICYmIGNoaWxkVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IGNoaWxkTm9kZSA9IG5vZGUuY2hpbGRyZW5ba2V5XTtcbiAgICAgICAgaWYgKGNoaWxkTm9kZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY2hpbGROb2RlID0gbm9kZS5jaGlsZHJlbltrZXldID0gY3JlYXRlTm9kZShjaGlsZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGROb2RlLnRhZykge1xuICAgICAgICAgIGdldFZhbHVlKGNoaWxkTm9kZS50YWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGUucHJveHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgdGFnID0gbm9kZS50YWdzW2tleV07XG4gICAgICAgIGlmICh0YWcgPT09IHZvaWQgMCkge1xuICAgICAgICAgIHRhZyA9IG5vZGUudGFnc1trZXldID0gY3JlYXRlVGFnKCk7XG4gICAgICAgICAgdGFnLnZhbHVlID0gY2hpbGRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBnZXRWYWx1ZSh0YWcpO1xuICAgICAgICByZXR1cm4gY2hpbGRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzID0gY2FsY3VsYXRlUmVzdWx0KCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfSxcbiAgb3duS2V5cyhub2RlKSB7XG4gICAgY29uc3VtZUNvbGxlY3Rpb24obm9kZSk7XG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhub2RlLnZhbHVlKTtcbiAgfSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUsIHByb3ApIHtcbiAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS52YWx1ZSwgcHJvcCk7XG4gIH0sXG4gIGhhcyhub2RlLCBwcm9wKSB7XG4gICAgcmV0dXJuIFJlZmxlY3QuaGFzKG5vZGUudmFsdWUsIHByb3ApO1xuICB9XG59O1xudmFyIEFycmF5VHJlZU5vZGUgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnRhZy52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIHByb3h5ID0gbmV3IFByb3h5KFt0aGlzXSwgYXJyYXlQcm94eUhhbmRsZXIpO1xuICB0YWcgPSBjcmVhdGVUYWcoKTtcbiAgdGFncyA9IHt9O1xuICBjaGlsZHJlbiA9IHt9O1xuICBjb2xsZWN0aW9uVGFnID0gbnVsbDtcbiAgaWQgPSBuZXh0SWQrKztcbn07XG52YXIgYXJyYXlQcm94eUhhbmRsZXIgPSB7XG4gIGdldChbbm9kZV0sIGtleSkge1xuICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgIGNvbnN1bWVDb2xsZWN0aW9uKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0UHJveHlIYW5kbGVyLmdldChub2RlLCBrZXkpO1xuICB9LFxuICBvd25LZXlzKFtub2RlXSkge1xuICAgIHJldHVybiBvYmplY3RQcm94eUhhbmRsZXIub3duS2V5cyhub2RlKTtcbiAgfSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFtub2RlXSwgcHJvcCkge1xuICAgIHJldHVybiBvYmplY3RQcm94eUhhbmRsZXIuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUsIHByb3ApO1xuICB9LFxuICBoYXMoW25vZGVdLCBwcm9wKSB7XG4gICAgcmV0dXJuIG9iamVjdFByb3h5SGFuZGxlci5oYXMobm9kZSwgcHJvcCk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVOb2RlKHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBuZXcgQXJyYXlUcmVlTm9kZSh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBPYmplY3RUcmVlTm9kZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB1cGRhdGVOb2RlKG5vZGUsIG5ld1ZhbHVlKSB7XG4gIGNvbnN0IHsgdmFsdWUsIHRhZ3MsIGNoaWxkcmVuIH0gPSBub2RlO1xuICBub2RlLnZhbHVlID0gbmV3VmFsdWU7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggIT09IG5ld1ZhbHVlLmxlbmd0aCkge1xuICAgIGRpcnR5Q29sbGVjdGlvbihub2RlKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICBsZXQgb2xkS2V5c1NpemUgPSAwO1xuICAgICAgbGV0IG5ld0tleXNTaXplID0gMDtcbiAgICAgIGxldCBhbnlLZXlzQWRkZWQgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgX2tleSBpbiB2YWx1ZSkge1xuICAgICAgICBvbGRLZXlzU2l6ZSsrO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmV3VmFsdWUpIHtcbiAgICAgICAgbmV3S2V5c1NpemUrKztcbiAgICAgICAgaWYgKCEoa2V5IGluIHZhbHVlKSkge1xuICAgICAgICAgIGFueUtleXNBZGRlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzRGlmZmVyZW50ID0gYW55S2V5c0FkZGVkIHx8IG9sZEtleXNTaXplICE9PSBuZXdLZXlzU2l6ZTtcbiAgICAgIGlmIChpc0RpZmZlcmVudCkge1xuICAgICAgICBkaXJ0eUNvbGxlY3Rpb24obm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIHRhZ3MpIHtcbiAgICBjb25zdCBjaGlsZFZhbHVlID0gdmFsdWVba2V5XTtcbiAgICBjb25zdCBuZXdDaGlsZFZhbHVlID0gbmV3VmFsdWVba2V5XTtcbiAgICBpZiAoY2hpbGRWYWx1ZSAhPT0gbmV3Q2hpbGRWYWx1ZSkge1xuICAgICAgZGlydHlDb2xsZWN0aW9uKG5vZGUpO1xuICAgICAgZGlydHlUYWcodGFnc1trZXldLCBuZXdDaGlsZFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZFZhbHVlID09PSBcIm9iamVjdFwiICYmIG5ld0NoaWxkVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSB0YWdzW2tleV07XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIGNoaWxkcmVuKSB7XG4gICAgY29uc3QgY2hpbGROb2RlID0gY2hpbGRyZW5ba2V5XTtcbiAgICBjb25zdCBuZXdDaGlsZFZhbHVlID0gbmV3VmFsdWVba2V5XTtcbiAgICBjb25zdCBjaGlsZFZhbHVlID0gY2hpbGROb2RlLnZhbHVlO1xuICAgIGlmIChjaGlsZFZhbHVlID09PSBuZXdDaGlsZFZhbHVlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXdDaGlsZFZhbHVlID09PSBcIm9iamVjdFwiICYmIG5ld0NoaWxkVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHVwZGF0ZU5vZGUoY2hpbGROb2RlLCBuZXdDaGlsZFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlTm9kZShjaGlsZE5vZGUpO1xuICAgICAgZGVsZXRlIGNoaWxkcmVuW2tleV07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkZWxldGVOb2RlKG5vZGUpIHtcbiAgaWYgKG5vZGUudGFnKSB7XG4gICAgZGlydHlUYWcobm9kZS50YWcsIG51bGwpO1xuICB9XG4gIGRpcnR5Q29sbGVjdGlvbihub2RlKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gbm9kZS50YWdzKSB7XG4gICAgZGlydHlUYWcobm9kZS50YWdzW2tleV0sIG51bGwpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG5vZGUuY2hpbGRyZW4pIHtcbiAgICBkZWxldGVOb2RlKG5vZGUuY2hpbGRyZW5ba2V5XSk7XG4gIH1cbn1cblxuLy8gc3JjL2xydU1lbW9pemUudHNcbmZ1bmN0aW9uIGNyZWF0ZVNpbmdsZXRvbkNhY2hlKGVxdWFscykge1xuICBsZXQgZW50cnk7XG4gIHJldHVybiB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgaWYgKGVudHJ5ICYmIGVxdWFscyhlbnRyeS5rZXksIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE5PVF9GT1VORDtcbiAgICB9LFxuICAgIHB1dChrZXksIHZhbHVlKSB7XG4gICAgICBlbnRyeSA9IHsga2V5LCB2YWx1ZSB9O1xuICAgIH0sXG4gICAgZ2V0RW50cmllcygpIHtcbiAgICAgIHJldHVybiBlbnRyeSA/IFtlbnRyeV0gOiBbXTtcbiAgICB9LFxuICAgIGNsZWFyKCkge1xuICAgICAgZW50cnkgPSB2b2lkIDA7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlTHJ1Q2FjaGUobWF4U2l6ZSwgZXF1YWxzKSB7XG4gIGxldCBlbnRyaWVzID0gW107XG4gIGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICBjb25zdCBjYWNoZUluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoKGVudHJ5KSA9PiBlcXVhbHMoa2V5LCBlbnRyeS5rZXkpKTtcbiAgICBpZiAoY2FjaGVJbmRleCA+IC0xKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbY2FjaGVJbmRleF07XG4gICAgICBpZiAoY2FjaGVJbmRleCA+IDApIHtcbiAgICAgICAgZW50cmllcy5zcGxpY2UoY2FjaGVJbmRleCwgMSk7XG4gICAgICAgIGVudHJpZXMudW5zaGlmdChlbnRyeSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnkudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBOT1RfRk9VTkQ7XG4gIH1cbiAgZnVuY3Rpb24gcHV0KGtleSwgdmFsdWUpIHtcbiAgICBpZiAoZ2V0KGtleSkgPT09IE5PVF9GT1VORCkge1xuICAgICAgZW50cmllcy51bnNoaWZ0KHsga2V5LCB2YWx1ZSB9KTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IG1heFNpemUpIHtcbiAgICAgICAgZW50cmllcy5wb3AoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0RW50cmllcygpIHtcbiAgICByZXR1cm4gZW50cmllcztcbiAgfVxuICBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICBlbnRyaWVzID0gW107XG4gIH1cbiAgcmV0dXJuIHsgZ2V0LCBwdXQsIGdldEVudHJpZXMsIGNsZWFyIH07XG59XG52YXIgcmVmZXJlbmNlRXF1YWxpdHlDaGVjayA9IChhLCBiKSA9PiBhID09PSBiO1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGVLZXlDb21wYXJhdG9yKGVxdWFsaXR5Q2hlY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFyZUFyZ3VtZW50c1NoYWxsb3dseUVxdWFsKHByZXYsIG5leHQpIHtcbiAgICBpZiAocHJldiA9PT0gbnVsbCB8fCBuZXh0ID09PSBudWxsIHx8IHByZXYubGVuZ3RoICE9PSBuZXh0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB7IGxlbmd0aCB9ID0gcHJldjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWVxdWFsaXR5Q2hlY2socHJldltpXSwgbmV4dFtpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGxydU1lbW9pemUoZnVuYywgZXF1YWxpdHlDaGVja09yT3B0aW9ucykge1xuICBjb25zdCBwcm92aWRlZE9wdGlvbnMgPSB0eXBlb2YgZXF1YWxpdHlDaGVja09yT3B0aW9ucyA9PT0gXCJvYmplY3RcIiA/IGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMgOiB7IGVxdWFsaXR5Q2hlY2s6IGVxdWFsaXR5Q2hlY2tPck9wdGlvbnMgfTtcbiAgY29uc3Qge1xuICAgIGVxdWFsaXR5Q2hlY2sgPSByZWZlcmVuY2VFcXVhbGl0eUNoZWNrLFxuICAgIG1heFNpemUgPSAxLFxuICAgIHJlc3VsdEVxdWFsaXR5Q2hlY2tcbiAgfSA9IHByb3ZpZGVkT3B0aW9ucztcbiAgY29uc3QgY29tcGFyYXRvciA9IGNyZWF0ZUNhY2hlS2V5Q29tcGFyYXRvcihlcXVhbGl0eUNoZWNrKTtcbiAgbGV0IHJlc3VsdHNDb3VudCA9IDA7XG4gIGNvbnN0IGNhY2hlID0gbWF4U2l6ZSA8PSAxID8gY3JlYXRlU2luZ2xldG9uQ2FjaGUoY29tcGFyYXRvcikgOiBjcmVhdGVMcnVDYWNoZShtYXhTaXplLCBjb21wYXJhdG9yKTtcbiAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7XG4gICAgbGV0IHZhbHVlID0gY2FjaGUuZ2V0KGFyZ3VtZW50cyk7XG4gICAgaWYgKHZhbHVlID09PSBOT1RfRk9VTkQpIHtcbiAgICAgIHZhbHVlID0gZnVuYy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgcmVzdWx0c0NvdW50Kys7XG4gICAgICBpZiAocmVzdWx0RXF1YWxpdHlDaGVjaykge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gY2FjaGUuZ2V0RW50cmllcygpO1xuICAgICAgICBjb25zdCBtYXRjaGluZ0VudHJ5ID0gZW50cmllcy5maW5kKFxuICAgICAgICAgIChlbnRyeSkgPT4gcmVzdWx0RXF1YWxpdHlDaGVjayhlbnRyeS52YWx1ZSwgdmFsdWUpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaGluZ0VudHJ5KSB7XG4gICAgICAgICAgdmFsdWUgPSBtYXRjaGluZ0VudHJ5LnZhbHVlO1xuICAgICAgICAgIHJlc3VsdHNDb3VudCAhPT0gMCAmJiByZXN1bHRzQ291bnQtLTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FjaGUucHV0KGFyZ3VtZW50cywgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgbWVtb2l6ZWQuY2xlYXJDYWNoZSA9ICgpID0+IHtcbiAgICBjYWNoZS5jbGVhcigpO1xuICAgIG1lbW9pemVkLnJlc2V0UmVzdWx0c0NvdW50KCk7XG4gIH07XG4gIG1lbW9pemVkLnJlc3VsdHNDb3VudCA9ICgpID0+IHJlc3VsdHNDb3VudDtcbiAgbWVtb2l6ZWQucmVzZXRSZXN1bHRzQ291bnQgPSAoKSA9PiB7XG4gICAgcmVzdWx0c0NvdW50ID0gMDtcbiAgfTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBzcmMvYXV0b3RyYWNrTWVtb2l6ZS9hdXRvdHJhY2tNZW1vaXplLnRzXG5mdW5jdGlvbiBhdXRvdHJhY2tNZW1vaXplKGZ1bmMpIHtcbiAgY29uc3Qgbm9kZSA9IGNyZWF0ZU5vZGUoXG4gICAgW11cbiAgKTtcbiAgbGV0IGxhc3RBcmdzID0gbnVsbDtcbiAgY29uc3Qgc2hhbGxvd0VxdWFsID0gY3JlYXRlQ2FjaGVLZXlDb21wYXJhdG9yKHJlZmVyZW5jZUVxdWFsaXR5Q2hlY2spO1xuICBjb25zdCBjYWNoZSA9IGNyZWF0ZUNhY2hlKCgpID0+IHtcbiAgICBjb25zdCByZXMgPSBmdW5jLmFwcGx5KG51bGwsIG5vZGUucHJveHkpO1xuICAgIHJldHVybiByZXM7XG4gIH0pO1xuICBmdW5jdGlvbiBtZW1vaXplZCgpIHtcbiAgICBpZiAoIXNoYWxsb3dFcXVhbChsYXN0QXJncywgYXJndW1lbnRzKSkge1xuICAgICAgdXBkYXRlTm9kZShub2RlLCBhcmd1bWVudHMpO1xuICAgICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZS52YWx1ZTtcbiAgfVxuICBtZW1vaXplZC5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIHJldHVybiBjYWNoZS5jbGVhcigpO1xuICB9O1xuICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vIHNyYy93ZWFrTWFwTWVtb2l6ZS50c1xudmFyIFN0cm9uZ1JlZiA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbiAgZGVyZWYoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn07XG52YXIgUmVmID0gdHlwZW9mIFdlYWtSZWYgIT09IFwidW5kZWZpbmVkXCIgPyBXZWFrUmVmIDogU3Ryb25nUmVmO1xudmFyIFVOVEVSTUlOQVRFRCA9IDA7XG52YXIgVEVSTUlOQVRFRCA9IDE7XG5mdW5jdGlvbiBjcmVhdGVDYWNoZU5vZGUoKSB7XG4gIHJldHVybiB7XG4gICAgczogVU5URVJNSU5BVEVELFxuICAgIHY6IHZvaWQgMCxcbiAgICBvOiBudWxsLFxuICAgIHA6IG51bGxcbiAgfTtcbn1cbmZ1bmN0aW9uIHdlYWtNYXBNZW1vaXplKGZ1bmMsIG9wdGlvbnMgPSB7fSkge1xuICBsZXQgZm5Ob2RlID0gY3JlYXRlQ2FjaGVOb2RlKCk7XG4gIGNvbnN0IHsgcmVzdWx0RXF1YWxpdHlDaGVjayB9ID0gb3B0aW9ucztcbiAgbGV0IGxhc3RSZXN1bHQ7XG4gIGxldCByZXN1bHRzQ291bnQgPSAwO1xuICBmdW5jdGlvbiBtZW1vaXplZCgpIHtcbiAgICBsZXQgY2FjaGVOb2RlID0gZm5Ob2RlO1xuICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBhcmd1bWVudHM7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNvbnN0IGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIGFyZyA9PT0gXCJvYmplY3RcIiAmJiBhcmcgIT09IG51bGwpIHtcbiAgICAgICAgbGV0IG9iamVjdENhY2hlID0gY2FjaGVOb2RlLm87XG4gICAgICAgIGlmIChvYmplY3RDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGNhY2hlTm9kZS5vID0gb2JqZWN0Q2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYmplY3ROb2RlID0gb2JqZWN0Q2FjaGUuZ2V0KGFyZyk7XG4gICAgICAgIGlmIChvYmplY3ROb2RlID09PSB2b2lkIDApIHtcbiAgICAgICAgICBjYWNoZU5vZGUgPSBjcmVhdGVDYWNoZU5vZGUoKTtcbiAgICAgICAgICBvYmplY3RDYWNoZS5zZXQoYXJnLCBjYWNoZU5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhY2hlTm9kZSA9IG9iamVjdE5vZGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBwcmltaXRpdmVDYWNoZSA9IGNhY2hlTm9kZS5wO1xuICAgICAgICBpZiAocHJpbWl0aXZlQ2FjaGUgPT09IG51bGwpIHtcbiAgICAgICAgICBjYWNoZU5vZGUucCA9IHByaW1pdGl2ZUNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmltaXRpdmVOb2RlID0gcHJpbWl0aXZlQ2FjaGUuZ2V0KGFyZyk7XG4gICAgICAgIGlmIChwcmltaXRpdmVOb2RlID09PSB2b2lkIDApIHtcbiAgICAgICAgICBjYWNoZU5vZGUgPSBjcmVhdGVDYWNoZU5vZGUoKTtcbiAgICAgICAgICBwcmltaXRpdmVDYWNoZS5zZXQoYXJnLCBjYWNoZU5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhY2hlTm9kZSA9IHByaW1pdGl2ZU5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdGVybWluYXRlZE5vZGUgPSBjYWNoZU5vZGU7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoY2FjaGVOb2RlLnMgPT09IFRFUk1JTkFURUQpIHtcbiAgICAgIHJlc3VsdCA9IGNhY2hlTm9kZS52O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICByZXN1bHRzQ291bnQrKztcbiAgICAgIGlmIChyZXN1bHRFcXVhbGl0eUNoZWNrKSB7XG4gICAgICAgIGNvbnN0IGxhc3RSZXN1bHRWYWx1ZSA9IGxhc3RSZXN1bHQ/LmRlcmVmPy4oKSA/PyBsYXN0UmVzdWx0O1xuICAgICAgICBpZiAobGFzdFJlc3VsdFZhbHVlICE9IG51bGwgJiYgcmVzdWx0RXF1YWxpdHlDaGVjayhsYXN0UmVzdWx0VmFsdWUsIHJlc3VsdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSBsYXN0UmVzdWx0VmFsdWU7XG4gICAgICAgICAgcmVzdWx0c0NvdW50ICE9PSAwICYmIHJlc3VsdHNDb3VudC0tO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5lZWRzV2Vha1JlZiA9IHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgJiYgcmVzdWx0ICE9PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgbGFzdFJlc3VsdCA9IG5lZWRzV2Vha1JlZiA/IG5ldyBSZWYocmVzdWx0KSA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGVybWluYXRlZE5vZGUucyA9IFRFUk1JTkFURUQ7XG4gICAgdGVybWluYXRlZE5vZGUudiA9IHJlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIG1lbW9pemVkLmNsZWFyQ2FjaGUgPSAoKSA9PiB7XG4gICAgZm5Ob2RlID0gY3JlYXRlQ2FjaGVOb2RlKCk7XG4gICAgbWVtb2l6ZWQucmVzZXRSZXN1bHRzQ291bnQoKTtcbiAgfTtcbiAgbWVtb2l6ZWQucmVzdWx0c0NvdW50ID0gKCkgPT4gcmVzdWx0c0NvdW50O1xuICBtZW1vaXplZC5yZXNldFJlc3VsdHNDb3VudCA9ICgpID0+IHtcbiAgICByZXN1bHRzQ291bnQgPSAwO1xuICB9O1xuICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vIHNyYy9jcmVhdGVTZWxlY3RvckNyZWF0b3IudHNcbmZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcihtZW1vaXplT3JPcHRpb25zLCAuLi5tZW1vaXplT3B0aW9uc0Zyb21BcmdzKSB7XG4gIGNvbnN0IGNyZWF0ZVNlbGVjdG9yQ3JlYXRvck9wdGlvbnMgPSB0eXBlb2YgbWVtb2l6ZU9yT3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiID8ge1xuICAgIG1lbW9pemU6IG1lbW9pemVPck9wdGlvbnMsXG4gICAgbWVtb2l6ZU9wdGlvbnM6IG1lbW9pemVPcHRpb25zRnJvbUFyZ3NcbiAgfSA6IG1lbW9pemVPck9wdGlvbnM7XG4gIGNvbnN0IGNyZWF0ZVNlbGVjdG9yMiA9ICguLi5jcmVhdGVTZWxlY3RvckFyZ3MpID0+IHtcbiAgICBsZXQgcmVjb21wdXRhdGlvbnMgPSAwO1xuICAgIGxldCBkZXBlbmRlbmN5UmVjb21wdXRhdGlvbnMgPSAwO1xuICAgIGxldCBsYXN0UmVzdWx0O1xuICAgIGxldCBkaXJlY3RseVBhc3NlZE9wdGlvbnMgPSB7fTtcbiAgICBsZXQgcmVzdWx0RnVuYyA9IGNyZWF0ZVNlbGVjdG9yQXJncy5wb3AoKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdEZ1bmMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGRpcmVjdGx5UGFzc2VkT3B0aW9ucyA9IHJlc3VsdEZ1bmM7XG4gICAgICByZXN1bHRGdW5jID0gY3JlYXRlU2VsZWN0b3JBcmdzLnBvcCgpO1xuICAgIH1cbiAgICBhc3NlcnRJc0Z1bmN0aW9uKFxuICAgICAgcmVzdWx0RnVuYyxcbiAgICAgIGBjcmVhdGVTZWxlY3RvciBleHBlY3RzIGFuIG91dHB1dCBmdW5jdGlvbiBhZnRlciB0aGUgaW5wdXRzLCBidXQgcmVjZWl2ZWQ6IFske3R5cGVvZiByZXN1bHRGdW5jfV1gXG4gICAgKTtcbiAgICBjb25zdCBjb21iaW5lZE9wdGlvbnMgPSB7XG4gICAgICAuLi5jcmVhdGVTZWxlY3RvckNyZWF0b3JPcHRpb25zLFxuICAgICAgLi4uZGlyZWN0bHlQYXNzZWRPcHRpb25zXG4gICAgfTtcbiAgICBjb25zdCB7XG4gICAgICBtZW1vaXplLFxuICAgICAgbWVtb2l6ZU9wdGlvbnMgPSBbXSxcbiAgICAgIGFyZ3NNZW1vaXplID0gd2Vha01hcE1lbW9pemUsXG4gICAgICBhcmdzTWVtb2l6ZU9wdGlvbnMgPSBbXSxcbiAgICAgIGRldk1vZGVDaGVja3MgPSB7fVxuICAgIH0gPSBjb21iaW5lZE9wdGlvbnM7XG4gICAgY29uc3QgZmluYWxNZW1vaXplT3B0aW9ucyA9IGVuc3VyZUlzQXJyYXkobWVtb2l6ZU9wdGlvbnMpO1xuICAgIGNvbnN0IGZpbmFsQXJnc01lbW9pemVPcHRpb25zID0gZW5zdXJlSXNBcnJheShhcmdzTWVtb2l6ZU9wdGlvbnMpO1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGdldERlcGVuZGVuY2llcyhjcmVhdGVTZWxlY3RvckFyZ3MpO1xuICAgIGNvbnN0IG1lbW9pemVkUmVzdWx0RnVuYyA9IG1lbW9pemUoZnVuY3Rpb24gcmVjb21wdXRhdGlvbldyYXBwZXIoKSB7XG4gICAgICByZWNvbXB1dGF0aW9ucysrO1xuICAgICAgcmV0dXJuIHJlc3VsdEZ1bmMuYXBwbHkoXG4gICAgICAgIG51bGwsXG4gICAgICAgIGFyZ3VtZW50c1xuICAgICAgKTtcbiAgICB9LCAuLi5maW5hbE1lbW9pemVPcHRpb25zKTtcbiAgICBsZXQgZmlyc3RSdW4gPSB0cnVlO1xuICAgIGNvbnN0IHNlbGVjdG9yID0gYXJnc01lbW9pemUoZnVuY3Rpb24gZGVwZW5kZW5jaWVzQ2hlY2tlcigpIHtcbiAgICAgIGRlcGVuZGVuY3lSZWNvbXB1dGF0aW9ucysrO1xuICAgICAgY29uc3QgaW5wdXRTZWxlY3RvclJlc3VsdHMgPSBjb2xsZWN0SW5wdXRTZWxlY3RvclJlc3VsdHMoXG4gICAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICAgYXJndW1lbnRzXG4gICAgICApO1xuICAgICAgbGFzdFJlc3VsdCA9IG1lbW9pemVkUmVzdWx0RnVuYy5hcHBseShudWxsLCBpbnB1dFNlbGVjdG9yUmVzdWx0cyk7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHsgaWRlbnRpdHlGdW5jdGlvbkNoZWNrLCBpbnB1dFN0YWJpbGl0eUNoZWNrIH0gPSBnZXREZXZNb2RlQ2hlY2tzRXhlY3V0aW9uSW5mbyhmaXJzdFJ1biwgZGV2TW9kZUNoZWNrcyk7XG4gICAgICAgIGlmIChpZGVudGl0eUZ1bmN0aW9uQ2hlY2suc2hvdWxkUnVuKSB7XG4gICAgICAgICAgaWRlbnRpdHlGdW5jdGlvbkNoZWNrLnJ1bihcbiAgICAgICAgICAgIHJlc3VsdEZ1bmMsXG4gICAgICAgICAgICBpbnB1dFNlbGVjdG9yUmVzdWx0cyxcbiAgICAgICAgICAgIGxhc3RSZXN1bHRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dFN0YWJpbGl0eUNoZWNrLnNob3VsZFJ1bikge1xuICAgICAgICAgIGNvbnN0IGlucHV0U2VsZWN0b3JSZXN1bHRzQ29weSA9IGNvbGxlY3RJbnB1dFNlbGVjdG9yUmVzdWx0cyhcbiAgICAgICAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICAgICAgIGFyZ3VtZW50c1xuICAgICAgICAgICk7XG4gICAgICAgICAgaW5wdXRTdGFiaWxpdHlDaGVjay5ydW4oXG4gICAgICAgICAgICB7IGlucHV0U2VsZWN0b3JSZXN1bHRzLCBpbnB1dFNlbGVjdG9yUmVzdWx0c0NvcHkgfSxcbiAgICAgICAgICAgIHsgbWVtb2l6ZSwgbWVtb2l6ZU9wdGlvbnM6IGZpbmFsTWVtb2l6ZU9wdGlvbnMgfSxcbiAgICAgICAgICAgIGFyZ3VtZW50c1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpcnN0UnVuKVxuICAgICAgICAgIGZpcnN0UnVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGFzdFJlc3VsdDtcbiAgICB9LCAuLi5maW5hbEFyZ3NNZW1vaXplT3B0aW9ucyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc2VsZWN0b3IsIHtcbiAgICAgIHJlc3VsdEZ1bmMsXG4gICAgICBtZW1vaXplZFJlc3VsdEZ1bmMsXG4gICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICBkZXBlbmRlbmN5UmVjb21wdXRhdGlvbnM6ICgpID0+IGRlcGVuZGVuY3lSZWNvbXB1dGF0aW9ucyxcbiAgICAgIHJlc2V0RGVwZW5kZW5jeVJlY29tcHV0YXRpb25zOiAoKSA9PiB7XG4gICAgICAgIGRlcGVuZGVuY3lSZWNvbXB1dGF0aW9ucyA9IDA7XG4gICAgICB9LFxuICAgICAgbGFzdFJlc3VsdDogKCkgPT4gbGFzdFJlc3VsdCxcbiAgICAgIHJlY29tcHV0YXRpb25zOiAoKSA9PiByZWNvbXB1dGF0aW9ucyxcbiAgICAgIHJlc2V0UmVjb21wdXRhdGlvbnM6ICgpID0+IHtcbiAgICAgICAgcmVjb21wdXRhdGlvbnMgPSAwO1xuICAgICAgfSxcbiAgICAgIG1lbW9pemUsXG4gICAgICBhcmdzTWVtb2l6ZVxuICAgIH0pO1xuICB9O1xuICBPYmplY3QuYXNzaWduKGNyZWF0ZVNlbGVjdG9yMiwge1xuICAgIHdpdGhUeXBlczogKCkgPT4gY3JlYXRlU2VsZWN0b3IyXG4gIH0pO1xuICByZXR1cm4gY3JlYXRlU2VsZWN0b3IyO1xufVxudmFyIGNyZWF0ZVNlbGVjdG9yID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcih3ZWFrTWFwTWVtb2l6ZSk7XG5cbi8vIHNyYy9jcmVhdGVTdHJ1Y3R1cmVkU2VsZWN0b3IudHNcbnZhciBjcmVhdGVTdHJ1Y3R1cmVkU2VsZWN0b3IgPSBPYmplY3QuYXNzaWduKFxuICAoaW5wdXRTZWxlY3RvcnNPYmplY3QsIHNlbGVjdG9yQ3JlYXRvciA9IGNyZWF0ZVNlbGVjdG9yKSA9PiB7XG4gICAgYXNzZXJ0SXNPYmplY3QoXG4gICAgICBpbnB1dFNlbGVjdG9yc09iamVjdCxcbiAgICAgIGBjcmVhdGVTdHJ1Y3R1cmVkU2VsZWN0b3IgZXhwZWN0cyBmaXJzdCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2hlcmUgZWFjaCBwcm9wZXJ0eSBpcyBhIHNlbGVjdG9yLCBpbnN0ZWFkIHJlY2VpdmVkIGEgJHt0eXBlb2YgaW5wdXRTZWxlY3RvcnNPYmplY3R9YFxuICAgICk7XG4gICAgY29uc3QgaW5wdXRTZWxlY3RvcktleXMgPSBPYmplY3Qua2V5cyhpbnB1dFNlbGVjdG9yc09iamVjdCk7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gaW5wdXRTZWxlY3RvcktleXMubWFwKFxuICAgICAgKGtleSkgPT4gaW5wdXRTZWxlY3RvcnNPYmplY3Rba2V5XVxuICAgICk7XG4gICAgY29uc3Qgc3RydWN0dXJlZFNlbGVjdG9yID0gc2VsZWN0b3JDcmVhdG9yKFxuICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgKC4uLmlucHV0U2VsZWN0b3JSZXN1bHRzKSA9PiB7XG4gICAgICAgIHJldHVybiBpbnB1dFNlbGVjdG9yUmVzdWx0cy5yZWR1Y2UoKGNvbXBvc2l0aW9uLCB2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb21wb3NpdGlvbltpbnB1dFNlbGVjdG9yS2V5c1tpbmRleF1dID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIGNvbXBvc2l0aW9uO1xuICAgICAgICB9LCB7fSk7XG4gICAgICB9XG4gICAgKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZFNlbGVjdG9yO1xuICB9LFxuICB7IHdpdGhUeXBlczogKCkgPT4gY3JlYXRlU3RydWN0dXJlZFNlbGVjdG9yIH1cbik7XG5leHBvcnQge1xuICBjcmVhdGVTZWxlY3RvcixcbiAgY3JlYXRlU2VsZWN0b3JDcmVhdG9yLFxuICBjcmVhdGVTdHJ1Y3R1cmVkU2VsZWN0b3IsXG4gIGxydU1lbW9pemUsXG4gIHJlZmVyZW5jZUVxdWFsaXR5Q2hlY2ssXG4gIHNldEdsb2JhbERldk1vZGVDaGVja3MsXG4gIGF1dG90cmFja01lbW9pemUgYXMgdW5zdGFibGVfYXV0b3RyYWNrTWVtb2l6ZSxcbiAgd2Vha01hcE1lbW9pemVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXNlbGVjdC5tanMubWFwIiwiLyohXG4gKiBTaWduYXR1cmUgUGFkIHYyLjMuMlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9zaWduYXR1cmVfcGFkXG4gKlxuICogQ29weXJpZ2h0IDIwMTcgU3p5bW9uIE5vd2FrXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqXG4gKiBUaGUgbWFpbiBpZGVhIGFuZCBzb21lIHBhcnRzIG9mIHRoZSBjb2RlIChlLmcuIGRyYXdpbmcgdmFyaWFibGUgd2lkdGggQsOpemllciBjdXJ2ZSkgYXJlIHRha2VuIGZyb206XG4gKiBodHRwOi8vY29ybmVyLnNxdWFyZXVwLmNvbS8yMDEyLzA3L3Ntb290aGVyLXNpZ25hdHVyZXMuaHRtbFxuICpcbiAqIEltcGxlbWVudGF0aW9uIG9mIGludGVycG9sYXRpb24gdXNpbmcgY3ViaWMgQsOpemllciBjdXJ2ZXMgaXMgdGFrZW4gZnJvbTpcbiAqIGh0dHA6Ly9iZW5rbm93c2NvZGUud29yZHByZXNzLmNvbS8yMDEyLzA5LzE0L3BhdGgtaW50ZXJwb2xhdGlvbi11c2luZy1jdWJpYy1iZXppZXItYW5kLWNvbnRyb2wtcG9pbnQtZXN0aW1hdGlvbi1pbi1qYXZhc2NyaXB0XG4gKlxuICogQWxnb3JpdGhtIGZvciBhcHByb3hpbWF0ZWQgbGVuZ3RoIG9mIGEgQsOpemllciBjdXJ2ZSBpcyB0YWtlbiBmcm9tOlxuICogaHR0cDovL3d3dy5sZW1vZGEubmV0L21hdGhzL2Jlemllci1sZW5ndGgvaW5kZXguaHRtbFxuICpcbiAqL1xuXG5mdW5jdGlvbiBQb2ludCh4LCB5LCB0aW1lKSB7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMueSA9IHk7XG4gIHRoaXMudGltZSA9IHRpbWUgfHwgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG59XG5cblBvaW50LnByb3RvdHlwZS52ZWxvY2l0eUZyb20gPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgcmV0dXJuIHRoaXMudGltZSAhPT0gc3RhcnQudGltZSA/IHRoaXMuZGlzdGFuY2VUbyhzdGFydCkgLyAodGhpcy50aW1lIC0gc3RhcnQudGltZSkgOiAxO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRpc3RhbmNlVG8gPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0aGlzLnggLSBzdGFydC54LCAyKSArIE1hdGgucG93KHRoaXMueSAtIHN0YXJ0LnksIDIpKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMueCA9PT0gb3RoZXIueCAmJiB0aGlzLnkgPT09IG90aGVyLnkgJiYgdGhpcy50aW1lID09PSBvdGhlci50aW1lO1xufTtcblxuZnVuY3Rpb24gQmV6aWVyKHN0YXJ0UG9pbnQsIGNvbnRyb2wxLCBjb250cm9sMiwgZW5kUG9pbnQpIHtcbiAgdGhpcy5zdGFydFBvaW50ID0gc3RhcnRQb2ludDtcbiAgdGhpcy5jb250cm9sMSA9IGNvbnRyb2wxO1xuICB0aGlzLmNvbnRyb2wyID0gY29udHJvbDI7XG4gIHRoaXMuZW5kUG9pbnQgPSBlbmRQb2ludDtcbn1cblxuLy8gUmV0dXJucyBhcHByb3hpbWF0ZWQgbGVuZ3RoLlxuQmV6aWVyLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGVwcyA9IDEwO1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgdmFyIHB4ID0gdm9pZCAwO1xuICB2YXIgcHkgPSB2b2lkIDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gc3RlcHM7IGkgKz0gMSkge1xuICAgIHZhciB0ID0gaSAvIHN0ZXBzO1xuICAgIHZhciBjeCA9IHRoaXMuX3BvaW50KHQsIHRoaXMuc3RhcnRQb2ludC54LCB0aGlzLmNvbnRyb2wxLngsIHRoaXMuY29udHJvbDIueCwgdGhpcy5lbmRQb2ludC54KTtcbiAgICB2YXIgY3kgPSB0aGlzLl9wb2ludCh0LCB0aGlzLnN0YXJ0UG9pbnQueSwgdGhpcy5jb250cm9sMS55LCB0aGlzLmNvbnRyb2wyLnksIHRoaXMuZW5kUG9pbnQueSk7XG4gICAgaWYgKGkgPiAwKSB7XG4gICAgICB2YXIgeGRpZmYgPSBjeCAtIHB4O1xuICAgICAgdmFyIHlkaWZmID0gY3kgLSBweTtcbiAgICAgIGxlbmd0aCArPSBNYXRoLnNxcnQoeGRpZmYgKiB4ZGlmZiArIHlkaWZmICogeWRpZmYpO1xuICAgIH1cbiAgICBweCA9IGN4O1xuICAgIHB5ID0gY3k7XG4gIH1cblxuICByZXR1cm4gbGVuZ3RoO1xufTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tbXVsdGktc3BhY2VzLCBzcGFjZS1pbi1wYXJlbnMgKi9cbkJlemllci5wcm90b3R5cGUuX3BvaW50ID0gZnVuY3Rpb24gKHQsIHN0YXJ0LCBjMSwgYzIsIGVuZCkge1xuICByZXR1cm4gc3RhcnQgKiAoMS4wIC0gdCkgKiAoMS4wIC0gdCkgKiAoMS4wIC0gdCkgKyAzLjAgKiBjMSAqICgxLjAgLSB0KSAqICgxLjAgLSB0KSAqIHQgKyAzLjAgKiBjMiAqICgxLjAgLSB0KSAqIHQgKiB0ICsgZW5kICogdCAqIHQgKiB0O1xufTtcblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjcwNzg0MDEvODE1NTA3XG5mdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gIHZhciB0aW1lb3V0ID0gbnVsbDtcbiAgdmFyIHByZXZpb3VzID0gMDtcbiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gIHZhciBsYXRlciA9IGZ1bmN0aW9uIGxhdGVyKCkge1xuICAgIHByZXZpb3VzID0gb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSA/IDAgOiBEYXRlLm5vdygpO1xuICAgIHRpbWVvdXQgPSBudWxsO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gIH07XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKCFwcmV2aW91cyAmJiBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlKSBwcmV2aW91cyA9IG5vdztcbiAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgY29udGV4dCA9IHRoaXM7XG4gICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gd2FpdCkge1xuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzID0gbm93O1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoIXRpbWVvdXQgJiYgb3B0aW9ucy50cmFpbGluZyAhPT0gZmFsc2UpIHtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5mdW5jdGlvbiBTaWduYXR1cmVQYWQoY2FudmFzLCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHRoaXMudmVsb2NpdHlGaWx0ZXJXZWlnaHQgPSBvcHRzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0IHx8IDAuNztcbiAgdGhpcy5taW5XaWR0aCA9IG9wdHMubWluV2lkdGggfHwgMC41O1xuICB0aGlzLm1heFdpZHRoID0gb3B0cy5tYXhXaWR0aCB8fCAyLjU7XG4gIHRoaXMudGhyb3R0bGUgPSAndGhyb3R0bGUnIGluIG9wdHMgPyBvcHRzLnRocm90dGxlIDogMTY7IC8vIGluIG1pbGlzZWNvbmRzXG4gIHRoaXMubWluRGlzdGFuY2UgPSAnbWluRGlzdGFuY2UnIGluIG9wdHMgPyBvcHRzLm1pbkRpc3RhbmNlIDogNTtcblxuICBpZiAodGhpcy50aHJvdHRsZSkge1xuICAgIHRoaXMuX3N0cm9rZU1vdmVVcGRhdGUgPSB0aHJvdHRsZShTaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VVcGRhdGUsIHRoaXMudGhyb3R0bGUpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX3N0cm9rZU1vdmVVcGRhdGUgPSBTaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VVcGRhdGU7XG4gIH1cblxuICB0aGlzLmRvdFNpemUgPSBvcHRzLmRvdFNpemUgfHwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAodGhpcy5taW5XaWR0aCArIHRoaXMubWF4V2lkdGgpIC8gMjtcbiAgfTtcbiAgdGhpcy5wZW5Db2xvciA9IG9wdHMucGVuQ29sb3IgfHwgJ2JsYWNrJztcbiAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBvcHRzLmJhY2tncm91bmRDb2xvciB8fCAncmdiYSgwLDAsMCwwKSc7XG4gIHRoaXMub25CZWdpbiA9IG9wdHMub25CZWdpbjtcbiAgdGhpcy5vbkVuZCA9IG9wdHMub25FbmQ7XG5cbiAgdGhpcy5fY2FudmFzID0gY2FudmFzO1xuICB0aGlzLl9jdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgdGhpcy5jbGVhcigpO1xuXG4gIC8vIFdlIG5lZWQgYWRkIHRoZXNlIGlubGluZSBzbyB0aGV5IGFyZSBhdmFpbGFibGUgdG8gdW5iaW5kIHdoaWxlIHN0aWxsIGhhdmluZ1xuICAvLyBhY2Nlc3MgdG8gJ3NlbGYnIHdlIGNvdWxkIHVzZSBfLmJpbmQgYnV0IGl0J3Mgbm90IHdvcnRoIGFkZGluZyBhIGRlcGVuZGVuY3kuXG4gIHRoaXMuX2hhbmRsZU1vdXNlRG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC53aGljaCA9PT0gMSkge1xuICAgICAgc2VsZi5fbW91c2VCdXR0b25Eb3duID0gdHJ1ZTtcbiAgICAgIHNlbGYuX3N0cm9rZUJlZ2luKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKHNlbGYuX21vdXNlQnV0dG9uRG93bikge1xuICAgICAgc2VsZi5fc3Ryb2tlTW92ZVVwZGF0ZShldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuX2hhbmRsZU1vdXNlVXAgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDEgJiYgc2VsZi5fbW91c2VCdXR0b25Eb3duKSB7XG4gICAgICBzZWxmLl9tb3VzZUJ1dHRvbkRvd24gPSBmYWxzZTtcbiAgICAgIHNlbGYuX3N0cm9rZUVuZChldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuX2hhbmRsZVRvdWNoU3RhcnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0VG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdO1xuICAgICAgc2VsZi5fc3Ryb2tlQmVnaW4odG91Y2gpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLl9oYW5kbGVUb3VjaE1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBQcmV2ZW50IHNjcm9sbGluZy5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdmFyIHRvdWNoID0gZXZlbnQudGFyZ2V0VG91Y2hlc1swXTtcbiAgICBzZWxmLl9zdHJva2VNb3ZlVXBkYXRlKHRvdWNoKTtcbiAgfTtcblxuICB0aGlzLl9oYW5kbGVUb3VjaEVuZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciB3YXNDYW52YXNUb3VjaGVkID0gZXZlbnQudGFyZ2V0ID09PSBzZWxmLl9jYW52YXM7XG4gICAgaWYgKHdhc0NhbnZhc1RvdWNoZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZWxmLl9zdHJva2VFbmQoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICAvLyBFbmFibGUgbW91c2UgYW5kIHRvdWNoIGV2ZW50IGhhbmRsZXJzXG4gIHRoaXMub24oKTtcbn1cblxuLy8gUHVibGljIG1ldGhvZHNcblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gIHZhciBjYW52YXMgPSB0aGlzLl9jYW52YXM7XG5cbiAgY3R4LmZpbGxTdHlsZSA9IHRoaXMuYmFja2dyb3VuZENvbG9yO1xuICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gIGN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuXG4gIHRoaXMuX2RhdGEgPSBbXTtcbiAgdGhpcy5fcmVzZXQoKTtcbiAgdGhpcy5faXNFbXB0eSA9IHRydWU7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmZyb21EYXRhVVJMID0gZnVuY3Rpb24gKGRhdGFVcmwpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XG4gIHZhciByYXRpbyA9IG9wdGlvbnMucmF0aW8gfHwgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgdmFyIHdpZHRoID0gb3B0aW9ucy53aWR0aCB8fCB0aGlzLl9jYW52YXMud2lkdGggLyByYXRpbztcbiAgdmFyIGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0IHx8IHRoaXMuX2NhbnZhcy5oZWlnaHQgLyByYXRpbztcblxuICB0aGlzLl9yZXNldCgpO1xuICBpbWFnZS5zcmMgPSBkYXRhVXJsO1xuICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMuX2N0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICB9O1xuICB0aGlzLl9pc0VtcHR5ID0gZmFsc2U7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLnRvRGF0YVVSTCA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHZhciBfY2FudmFzO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2ltYWdlL3N2Zyt4bWwnOlxuICAgICAgcmV0dXJuIHRoaXMuX3RvU1ZHKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBvcHRpb25zID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBvcHRpb25zW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChfY2FudmFzID0gdGhpcy5fY2FudmFzKS50b0RhdGFVUkwuYXBwbHkoX2NhbnZhcywgW3R5cGVdLmNvbmNhdChvcHRpb25zKSk7XG4gIH1cbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2hhbmRsZU1vdXNlRXZlbnRzKCk7XG4gIHRoaXMuX2hhbmRsZVRvdWNoRXZlbnRzKCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX2hhbmRsZU1vdXNlRG93bik7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVNb3VzZU1vdmUpO1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5faGFuZGxlTW91c2VVcCk7XG5cbiAgdGhpcy5fY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0KTtcbiAgdGhpcy5fY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX2hhbmRsZVRvdWNoTW92ZSk7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2hhbmRsZVRvdWNoRW5kKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX2lzRW1wdHk7XG59O1xuXG4vLyBQcml2YXRlIG1ldGhvZHNcblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3N0cm9rZUJlZ2luID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHRoaXMuX2RhdGEucHVzaChbXSk7XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuX3N0cm9rZVVwZGF0ZShldmVudCk7XG5cbiAgaWYgKHR5cGVvZiB0aGlzLm9uQmVnaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLm9uQmVnaW4oZXZlbnQpO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VVcGRhdGUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIHggPSBldmVudC5jbGllbnRYO1xuICB2YXIgeSA9IGV2ZW50LmNsaWVudFk7XG5cbiAgdmFyIHBvaW50ID0gdGhpcy5fY3JlYXRlUG9pbnQoeCwgeSk7XG4gIHZhciBsYXN0UG9pbnRHcm91cCA9IHRoaXMuX2RhdGFbdGhpcy5fZGF0YS5sZW5ndGggLSAxXTtcbiAgdmFyIGxhc3RQb2ludCA9IGxhc3RQb2ludEdyb3VwICYmIGxhc3RQb2ludEdyb3VwW2xhc3RQb2ludEdyb3VwLmxlbmd0aCAtIDFdO1xuICB2YXIgaXNMYXN0UG9pbnRUb29DbG9zZSA9IGxhc3RQb2ludCAmJiBwb2ludC5kaXN0YW5jZVRvKGxhc3RQb2ludCkgPCB0aGlzLm1pbkRpc3RhbmNlO1xuXG4gIC8vIFNraXAgdGhpcyBwb2ludCBpZiBpdCdzIHRvbyBjbG9zZSB0byB0aGUgcHJldmlvdXMgb25lXG4gIGlmICghKGxhc3RQb2ludCAmJiBpc0xhc3RQb2ludFRvb0Nsb3NlKSkge1xuICAgIHZhciBfYWRkUG9pbnQgPSB0aGlzLl9hZGRQb2ludChwb2ludCksXG4gICAgICAgIGN1cnZlID0gX2FkZFBvaW50LmN1cnZlLFxuICAgICAgICB3aWR0aHMgPSBfYWRkUG9pbnQud2lkdGhzO1xuXG4gICAgaWYgKGN1cnZlICYmIHdpZHRocykge1xuICAgICAgdGhpcy5fZHJhd0N1cnZlKGN1cnZlLCB3aWR0aHMuc3RhcnQsIHdpZHRocy5lbmQpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGFbdGhpcy5fZGF0YS5sZW5ndGggLSAxXS5wdXNoKHtcbiAgICAgIHg6IHBvaW50LngsXG4gICAgICB5OiBwb2ludC55LFxuICAgICAgdGltZTogcG9pbnQudGltZSxcbiAgICAgIGNvbG9yOiB0aGlzLnBlbkNvbG9yXG4gICAgfSk7XG4gIH1cbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3N0cm9rZUVuZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICB2YXIgY2FuRHJhd0N1cnZlID0gdGhpcy5wb2ludHMubGVuZ3RoID4gMjtcbiAgdmFyIHBvaW50ID0gdGhpcy5wb2ludHNbMF07IC8vIFBvaW50IGluc3RhbmNlXG5cbiAgaWYgKCFjYW5EcmF3Q3VydmUgJiYgcG9pbnQpIHtcbiAgICB0aGlzLl9kcmF3RG90KHBvaW50KTtcbiAgfVxuXG4gIGlmIChwb2ludCkge1xuICAgIHZhciBsYXN0UG9pbnRHcm91cCA9IHRoaXMuX2RhdGFbdGhpcy5fZGF0YS5sZW5ndGggLSAxXTtcbiAgICB2YXIgbGFzdFBvaW50ID0gbGFzdFBvaW50R3JvdXBbbGFzdFBvaW50R3JvdXAubGVuZ3RoIC0gMV07IC8vIHBsYWluIG9iamVjdFxuXG4gICAgLy8gV2hlbiBkcmF3aW5nIGEgZG90LCB0aGVyZSdzIG9ubHkgb25lIHBvaW50IGluIGEgZ3JvdXAsIHNvIHdpdGhvdXQgdGhpcyBjaGVja1xuICAgIC8vIHN1Y2ggZ3JvdXAgd291bGQgZW5kIHVwIHdpdGggZXhhY3RseSB0aGUgc2FtZSAyIHBvaW50cy5cbiAgICBpZiAoIXBvaW50LmVxdWFscyhsYXN0UG9pbnQpKSB7XG4gICAgICBsYXN0UG9pbnRHcm91cC5wdXNoKHtcbiAgICAgICAgeDogcG9pbnQueCxcbiAgICAgICAgeTogcG9pbnQueSxcbiAgICAgICAgdGltZTogcG9pbnQudGltZSxcbiAgICAgICAgY29sb3I6IHRoaXMucGVuQ29sb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdGhpcy5vbkVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMub25FbmQoZXZlbnQpO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9oYW5kbGVNb3VzZUV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fbW91c2VCdXR0b25Eb3duID0gZmFsc2U7XG5cbiAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX2hhbmRsZU1vdXNlRG93bik7XG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVNb3VzZU1vdmUpO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5faGFuZGxlTW91c2VVcCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9oYW5kbGVUb3VjaEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gUGFzcyB0b3VjaCBldmVudHMgdG8gY2FudmFzIGVsZW1lbnQgb24gbW9iaWxlIElFMTEgYW5kIEVkZ2UuXG4gIHRoaXMuX2NhbnZhcy5zdHlsZS5tc1RvdWNoQWN0aW9uID0gJ25vbmUnO1xuICB0aGlzLl9jYW52YXMuc3R5bGUudG91Y2hBY3Rpb24gPSAnbm9uZSc7XG5cbiAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0KTtcbiAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX2hhbmRsZVRvdWNoTW92ZSk7XG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2hhbmRsZVRvdWNoRW5kKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3Jlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnBvaW50cyA9IFtdO1xuICB0aGlzLl9sYXN0VmVsb2NpdHkgPSAwO1xuICB0aGlzLl9sYXN0V2lkdGggPSAodGhpcy5taW5XaWR0aCArIHRoaXMubWF4V2lkdGgpIC8gMjtcbiAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9IHRoaXMucGVuQ29sb3I7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9jcmVhdGVQb2ludCA9IGZ1bmN0aW9uICh4LCB5LCB0aW1lKSB7XG4gIHZhciByZWN0ID0gdGhpcy5fY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIHJldHVybiBuZXcgUG9pbnQoeCAtIHJlY3QubGVmdCwgeSAtIHJlY3QudG9wLCB0aW1lIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2FkZFBvaW50ID0gZnVuY3Rpb24gKHBvaW50KSB7XG4gIHZhciBwb2ludHMgPSB0aGlzLnBvaW50cztcbiAgdmFyIHRtcCA9IHZvaWQgMDtcblxuICBwb2ludHMucHVzaChwb2ludCk7XG5cbiAgaWYgKHBvaW50cy5sZW5ndGggPiAyKSB7XG4gICAgLy8gVG8gcmVkdWNlIHRoZSBpbml0aWFsIGxhZyBtYWtlIGl0IHdvcmsgd2l0aCAzIHBvaW50c1xuICAgIC8vIGJ5IGNvcHlpbmcgdGhlIGZpcnN0IHBvaW50IHRvIHRoZSBiZWdpbm5pbmcuXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDMpIHBvaW50cy51bnNoaWZ0KHBvaW50c1swXSk7XG5cbiAgICB0bXAgPSB0aGlzLl9jYWxjdWxhdGVDdXJ2ZUNvbnRyb2xQb2ludHMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSk7XG4gICAgdmFyIGMyID0gdG1wLmMyO1xuICAgIHRtcCA9IHRoaXMuX2NhbGN1bGF0ZUN1cnZlQ29udHJvbFBvaW50cyhwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdKTtcbiAgICB2YXIgYzMgPSB0bXAuYzE7XG4gICAgdmFyIGN1cnZlID0gbmV3IEJlemllcihwb2ludHNbMV0sIGMyLCBjMywgcG9pbnRzWzJdKTtcbiAgICB2YXIgd2lkdGhzID0gdGhpcy5fY2FsY3VsYXRlQ3VydmVXaWR0aHMoY3VydmUpO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGxpc3QsXG4gICAgLy8gc28gdGhhdCB3ZSBhbHdheXMgaGF2ZSBubyBtb3JlIHRoYW4gNCBwb2ludHMgaW4gcG9pbnRzIGFycmF5LlxuICAgIHBvaW50cy5zaGlmdCgpO1xuXG4gICAgcmV0dXJuIHsgY3VydmU6IGN1cnZlLCB3aWR0aHM6IHdpZHRocyB9O1xuICB9XG5cbiAgcmV0dXJuIHt9O1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fY2FsY3VsYXRlQ3VydmVDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKHMxLCBzMiwgczMpIHtcbiAgdmFyIGR4MSA9IHMxLnggLSBzMi54O1xuICB2YXIgZHkxID0gczEueSAtIHMyLnk7XG4gIHZhciBkeDIgPSBzMi54IC0gczMueDtcbiAgdmFyIGR5MiA9IHMyLnkgLSBzMy55O1xuXG4gIHZhciBtMSA9IHsgeDogKHMxLnggKyBzMi54KSAvIDIuMCwgeTogKHMxLnkgKyBzMi55KSAvIDIuMCB9O1xuICB2YXIgbTIgPSB7IHg6IChzMi54ICsgczMueCkgLyAyLjAsIHk6IChzMi55ICsgczMueSkgLyAyLjAgfTtcblxuICB2YXIgbDEgPSBNYXRoLnNxcnQoZHgxICogZHgxICsgZHkxICogZHkxKTtcbiAgdmFyIGwyID0gTWF0aC5zcXJ0KGR4MiAqIGR4MiArIGR5MiAqIGR5Mik7XG5cbiAgdmFyIGR4bSA9IG0xLnggLSBtMi54O1xuICB2YXIgZHltID0gbTEueSAtIG0yLnk7XG5cbiAgdmFyIGsgPSBsMiAvIChsMSArIGwyKTtcbiAgdmFyIGNtID0geyB4OiBtMi54ICsgZHhtICogaywgeTogbTIueSArIGR5bSAqIGsgfTtcblxuICB2YXIgdHggPSBzMi54IC0gY20ueDtcbiAgdmFyIHR5ID0gczIueSAtIGNtLnk7XG5cbiAgcmV0dXJuIHtcbiAgICBjMTogbmV3IFBvaW50KG0xLnggKyB0eCwgbTEueSArIHR5KSxcbiAgICBjMjogbmV3IFBvaW50KG0yLnggKyB0eCwgbTIueSArIHR5KVxuICB9O1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fY2FsY3VsYXRlQ3VydmVXaWR0aHMgPSBmdW5jdGlvbiAoY3VydmUpIHtcbiAgdmFyIHN0YXJ0UG9pbnQgPSBjdXJ2ZS5zdGFydFBvaW50O1xuICB2YXIgZW5kUG9pbnQgPSBjdXJ2ZS5lbmRQb2ludDtcbiAgdmFyIHdpZHRocyA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuXG4gIHZhciB2ZWxvY2l0eSA9IHRoaXMudmVsb2NpdHlGaWx0ZXJXZWlnaHQgKiBlbmRQb2ludC52ZWxvY2l0eUZyb20oc3RhcnRQb2ludCkgKyAoMSAtIHRoaXMudmVsb2NpdHlGaWx0ZXJXZWlnaHQpICogdGhpcy5fbGFzdFZlbG9jaXR5O1xuXG4gIHZhciBuZXdXaWR0aCA9IHRoaXMuX3N0cm9rZVdpZHRoKHZlbG9jaXR5KTtcblxuICB3aWR0aHMuc3RhcnQgPSB0aGlzLl9sYXN0V2lkdGg7XG4gIHdpZHRocy5lbmQgPSBuZXdXaWR0aDtcblxuICB0aGlzLl9sYXN0VmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgdGhpcy5fbGFzdFdpZHRoID0gbmV3V2lkdGg7XG5cbiAgcmV0dXJuIHdpZHRocztcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3N0cm9rZVdpZHRoID0gZnVuY3Rpb24gKHZlbG9jaXR5KSB7XG4gIHJldHVybiBNYXRoLm1heCh0aGlzLm1heFdpZHRoIC8gKHZlbG9jaXR5ICsgMSksIHRoaXMubWluV2lkdGgpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fZHJhd1BvaW50ID0gZnVuY3Rpb24gKHgsIHksIHNpemUpIHtcbiAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcblxuICBjdHgubW92ZVRvKHgsIHkpO1xuICBjdHguYXJjKHgsIHksIHNpemUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7XG4gIHRoaXMuX2lzRW1wdHkgPSBmYWxzZTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2RyYXdDdXJ2ZSA9IGZ1bmN0aW9uIChjdXJ2ZSwgc3RhcnRXaWR0aCwgZW5kV2lkdGgpIHtcbiAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcbiAgdmFyIHdpZHRoRGVsdGEgPSBlbmRXaWR0aCAtIHN0YXJ0V2lkdGg7XG4gIHZhciBkcmF3U3RlcHMgPSBNYXRoLmZsb29yKGN1cnZlLmxlbmd0aCgpKTtcblxuICBjdHguYmVnaW5QYXRoKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkcmF3U3RlcHM7IGkgKz0gMSkge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgQmV6aWVyICh4LCB5KSBjb29yZGluYXRlIGZvciB0aGlzIHN0ZXAuXG4gICAgdmFyIHQgPSBpIC8gZHJhd1N0ZXBzO1xuICAgIHZhciB0dCA9IHQgKiB0O1xuICAgIHZhciB0dHQgPSB0dCAqIHQ7XG4gICAgdmFyIHUgPSAxIC0gdDtcbiAgICB2YXIgdXUgPSB1ICogdTtcbiAgICB2YXIgdXV1ID0gdXUgKiB1O1xuXG4gICAgdmFyIHggPSB1dXUgKiBjdXJ2ZS5zdGFydFBvaW50Lng7XG4gICAgeCArPSAzICogdXUgKiB0ICogY3VydmUuY29udHJvbDEueDtcbiAgICB4ICs9IDMgKiB1ICogdHQgKiBjdXJ2ZS5jb250cm9sMi54O1xuICAgIHggKz0gdHR0ICogY3VydmUuZW5kUG9pbnQueDtcblxuICAgIHZhciB5ID0gdXV1ICogY3VydmUuc3RhcnRQb2ludC55O1xuICAgIHkgKz0gMyAqIHV1ICogdCAqIGN1cnZlLmNvbnRyb2wxLnk7XG4gICAgeSArPSAzICogdSAqIHR0ICogY3VydmUuY29udHJvbDIueTtcbiAgICB5ICs9IHR0dCAqIGN1cnZlLmVuZFBvaW50Lnk7XG5cbiAgICB2YXIgd2lkdGggPSBzdGFydFdpZHRoICsgdHR0ICogd2lkdGhEZWx0YTtcbiAgICB0aGlzLl9kcmF3UG9pbnQoeCwgeSwgd2lkdGgpO1xuICB9XG5cbiAgY3R4LmNsb3NlUGF0aCgpO1xuICBjdHguZmlsbCgpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fZHJhd0RvdCA9IGZ1bmN0aW9uIChwb2ludCkge1xuICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuICB2YXIgd2lkdGggPSB0eXBlb2YgdGhpcy5kb3RTaXplID09PSAnZnVuY3Rpb24nID8gdGhpcy5kb3RTaXplKCkgOiB0aGlzLmRvdFNpemU7XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuICB0aGlzLl9kcmF3UG9pbnQocG9pbnQueCwgcG9pbnQueSwgd2lkdGgpO1xuICBjdHguY2xvc2VQYXRoKCk7XG4gIGN0eC5maWxsKCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9mcm9tRGF0YSA9IGZ1bmN0aW9uIChwb2ludEdyb3VwcywgZHJhd0N1cnZlLCBkcmF3RG90KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRHcm91cHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgZ3JvdXAgPSBwb2ludEdyb3Vwc1tpXTtcblxuICAgIGlmIChncm91cC5sZW5ndGggPiAxKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdyb3VwLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIHZhciByYXdQb2ludCA9IGdyb3VwW2pdO1xuICAgICAgICB2YXIgcG9pbnQgPSBuZXcgUG9pbnQocmF3UG9pbnQueCwgcmF3UG9pbnQueSwgcmF3UG9pbnQudGltZSk7XG4gICAgICAgIHZhciBjb2xvciA9IHJhd1BvaW50LmNvbG9yO1xuXG4gICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgLy8gRmlyc3QgcG9pbnQgaW4gYSBncm91cC4gTm90aGluZyB0byBkcmF3IHlldC5cblxuICAgICAgICAgIC8vIEFsbCBwb2ludHMgaW4gdGhlIGdyb3VwIGhhdmUgdGhlIHNhbWUgY29sb3IsIHNvIGl0J3MgZW5vdWdoIHRvIHNldFxuICAgICAgICAgIC8vIHBlbkNvbG9yIGp1c3QgYXQgdGhlIGJlZ2lubmluZy5cbiAgICAgICAgICB0aGlzLnBlbkNvbG9yID0gY29sb3I7XG4gICAgICAgICAgdGhpcy5fcmVzZXQoKTtcblxuICAgICAgICAgIHRoaXMuX2FkZFBvaW50KHBvaW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChqICE9PSBncm91cC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgLy8gTWlkZGxlIHBvaW50IGluIGEgZ3JvdXAuXG4gICAgICAgICAgdmFyIF9hZGRQb2ludDIgPSB0aGlzLl9hZGRQb2ludChwb2ludCksXG4gICAgICAgICAgICAgIGN1cnZlID0gX2FkZFBvaW50Mi5jdXJ2ZSxcbiAgICAgICAgICAgICAgd2lkdGhzID0gX2FkZFBvaW50Mi53aWR0aHM7XG5cbiAgICAgICAgICBpZiAoY3VydmUgJiYgd2lkdGhzKSB7XG4gICAgICAgICAgICBkcmF3Q3VydmUoY3VydmUsIHdpZHRocywgY29sb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBMYXN0IHBvaW50IGluIGEgZ3JvdXAuIERvIG5vdGhpbmcuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVzZXQoKTtcbiAgICAgIHZhciBfcmF3UG9pbnQgPSBncm91cFswXTtcbiAgICAgIGRyYXdEb3QoX3Jhd1BvaW50KTtcbiAgICB9XG4gIH1cbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3RvU1ZHID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3RoaXMyID0gdGhpcztcblxuICB2YXIgcG9pbnRHcm91cHMgPSB0aGlzLl9kYXRhO1xuICB2YXIgY2FudmFzID0gdGhpcy5fY2FudmFzO1xuICB2YXIgcmF0aW8gPSBNYXRoLm1heCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxLCAxKTtcbiAgdmFyIG1pblggPSAwO1xuICB2YXIgbWluWSA9IDA7XG4gIHZhciBtYXhYID0gY2FudmFzLndpZHRoIC8gcmF0aW87XG4gIHZhciBtYXhZID0gY2FudmFzLmhlaWdodCAvIHJhdGlvO1xuICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcblxuICBzdmcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3dpZHRoJywgY2FudmFzLndpZHRoKTtcbiAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICdoZWlnaHQnLCBjYW52YXMuaGVpZ2h0KTtcblxuICB0aGlzLl9mcm9tRGF0YShwb2ludEdyb3VwcywgZnVuY3Rpb24gKGN1cnZlLCB3aWR0aHMsIGNvbG9yKSB7XG4gICAgdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwYXRoJyk7XG5cbiAgICAvLyBOZWVkIHRvIGNoZWNrIGN1cnZlIGZvciBOYU4gdmFsdWVzLCB0aGVzZSBwb3AgdXAgd2hlbiBkcmF3aW5nXG4gICAgLy8gbGluZXMgb24gdGhlIGNhbnZhcyB0aGF0IGFyZSBub3QgY29udGludW91cy4gRS5nLiBTaGFycCBjb3JuZXJzXG4gICAgLy8gb3Igc3RvcHBpbmcgbWlkLXN0cm9rZSBhbmQgdGhhbiBjb250aW51aW5nIHdpdGhvdXQgbGlmdGluZyBtb3VzZS5cbiAgICBpZiAoIWlzTmFOKGN1cnZlLmNvbnRyb2wxLngpICYmICFpc05hTihjdXJ2ZS5jb250cm9sMS55KSAmJiAhaXNOYU4oY3VydmUuY29udHJvbDIueCkgJiYgIWlzTmFOKGN1cnZlLmNvbnRyb2wyLnkpKSB7XG4gICAgICB2YXIgYXR0ciA9ICdNICcgKyBjdXJ2ZS5zdGFydFBvaW50LngudG9GaXhlZCgzKSArICcsJyArIGN1cnZlLnN0YXJ0UG9pbnQueS50b0ZpeGVkKDMpICsgJyAnICsgKCdDICcgKyBjdXJ2ZS5jb250cm9sMS54LnRvRml4ZWQoMykgKyAnLCcgKyBjdXJ2ZS5jb250cm9sMS55LnRvRml4ZWQoMykgKyAnICcpICsgKGN1cnZlLmNvbnRyb2wyLngudG9GaXhlZCgzKSArICcsJyArIGN1cnZlLmNvbnRyb2wyLnkudG9GaXhlZCgzKSArICcgJykgKyAoY3VydmUuZW5kUG9pbnQueC50b0ZpeGVkKDMpICsgJywnICsgY3VydmUuZW5kUG9pbnQueS50b0ZpeGVkKDMpKTtcblxuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ2QnLCBhdHRyKTtcbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAod2lkdGhzLmVuZCAqIDIuMjUpLnRvRml4ZWQoMykpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWNhcCcsICdyb3VuZCcpO1xuXG4gICAgICBzdmcuYXBwZW5kQ2hpbGQocGF0aCk7XG4gICAgfVxuICB9LCBmdW5jdGlvbiAocmF3UG9pbnQpIHtcbiAgICB2YXIgY2lyY2xlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2lyY2xlJyk7XG4gICAgdmFyIGRvdFNpemUgPSB0eXBlb2YgX3RoaXMyLmRvdFNpemUgPT09ICdmdW5jdGlvbicgPyBfdGhpczIuZG90U2l6ZSgpIDogX3RoaXMyLmRvdFNpemU7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgncicsIGRvdFNpemUpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N4JywgcmF3UG9pbnQueCk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnY3knLCByYXdQb2ludC55KTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCdmaWxsJywgcmF3UG9pbnQuY29sb3IpO1xuXG4gICAgc3ZnLmFwcGVuZENoaWxkKGNpcmNsZSk7XG4gIH0pO1xuXG4gIHZhciBwcmVmaXggPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwnO1xuICB2YXIgaGVhZGVyID0gJzxzdmcnICsgJyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCInICsgJyB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIicgKyAoJyB2aWV3Qm94PVwiJyArIG1pblggKyAnICcgKyBtaW5ZICsgJyAnICsgbWF4WCArICcgJyArIG1heFkgKyAnXCInKSArICgnIHdpZHRoPVwiJyArIG1heFggKyAnXCInKSArICgnIGhlaWdodD1cIicgKyBtYXhZICsgJ1wiJykgKyAnPic7XG4gIHZhciBib2R5ID0gc3ZnLmlubmVySFRNTDtcblxuICAvLyBJRSBoYWNrIGZvciBtaXNzaW5nIGlubmVySFRNTCBwcm9wZXJ0eSBvbiBTVkdFbGVtZW50XG4gIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkdW1teScpO1xuICAgIHZhciBub2RlcyA9IHN2Zy5jaGlsZE5vZGVzO1xuICAgIGR1bW15LmlubmVySFRNTCA9ICcnO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgZHVtbXkuYXBwZW5kQ2hpbGQobm9kZXNbaV0uY2xvbmVOb2RlKHRydWUpKTtcbiAgICB9XG5cbiAgICBib2R5ID0gZHVtbXkuaW5uZXJIVE1MO1xuICB9XG5cbiAgdmFyIGZvb3RlciA9ICc8L3N2Zz4nO1xuICB2YXIgZGF0YSA9IGhlYWRlciArIGJvZHkgKyBmb290ZXI7XG5cbiAgcmV0dXJuIHByZWZpeCArIGJ0b2EoZGF0YSk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmZyb21EYXRhID0gZnVuY3Rpb24gKHBvaW50R3JvdXBzKSB7XG4gIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gIHRoaXMuY2xlYXIoKTtcblxuICB0aGlzLl9mcm9tRGF0YShwb2ludEdyb3VwcywgZnVuY3Rpb24gKGN1cnZlLCB3aWR0aHMpIHtcbiAgICByZXR1cm4gX3RoaXMzLl9kcmF3Q3VydmUoY3VydmUsIHdpZHRocy5zdGFydCwgd2lkdGhzLmVuZCk7XG4gIH0sIGZ1bmN0aW9uIChyYXdQb2ludCkge1xuICAgIHJldHVybiBfdGhpczMuX2RyYXdEb3QocmF3UG9pbnQpO1xuICB9KTtcblxuICB0aGlzLl9kYXRhID0gcG9pbnRHcm91cHM7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLnRvRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX2RhdGE7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTaWduYXR1cmVQYWQ7XG4iLCJ2YXIgaXNQcm9kdWN0aW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJztcbnZhciBwcmVmaXggPSAnSW52YXJpYW50IGZhaWxlZCc7XG5mdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBtZXNzYWdlKSB7XG4gICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1Byb2R1Y3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByZWZpeCk7XG4gICAgfVxuICAgIHZhciBwcm92aWRlZCA9IHR5cGVvZiBtZXNzYWdlID09PSAnZnVuY3Rpb24nID8gbWVzc2FnZSgpIDogbWVzc2FnZTtcbiAgICB2YXIgdmFsdWUgPSBwcm92aWRlZCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCI6IFwiKS5jb25jYXQocHJvdmlkZWQpIDogcHJlZml4O1xuICAgIHRocm93IG5ldyBFcnJvcih2YWx1ZSk7XG59XG5cbmV4cG9ydCB7IGludmFyaWFudCBhcyBkZWZhdWx0IH07XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wgKi9cblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XG4gIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICB9XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgfVxuICB9XG4gIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgZG9uZSA9IHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgfVxuICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XG4gICAgaWYgKGFzeW5jKSB7XG4gICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xuICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gIH1cbiAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xuICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgfVxuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgZmFpbChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICB9XG4gIHJldHVybiBuZXh0KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgX19leHRlbmRzLFxuICBfX2Fzc2lnbixcbiAgX19yZXN0LFxuICBfX2RlY29yYXRlLFxuICBfX3BhcmFtLFxuICBfX21ldGFkYXRhLFxuICBfX2F3YWl0ZXIsXG4gIF9fZ2VuZXJhdG9yLFxuICBfX2NyZWF0ZUJpbmRpbmcsXG4gIF9fZXhwb3J0U3RhcixcbiAgX192YWx1ZXMsXG4gIF9fcmVhZCxcbiAgX19zcHJlYWQsXG4gIF9fc3ByZWFkQXJyYXlzLFxuICBfX3NwcmVhZEFycmF5LFxuICBfX2F3YWl0LFxuICBfX2FzeW5jR2VuZXJhdG9yLFxuICBfX2FzeW5jRGVsZWdhdG9yLFxuICBfX2FzeW5jVmFsdWVzLFxuICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcbiAgX19pbXBvcnRTdGFyLFxuICBfX2ltcG9ydERlZmF1bHQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRJbixcbiAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXG4gIF9fZGlzcG9zZVJlc291cmNlcyxcbn07XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHRsb2FkZWQ6IGZhbHNlLFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcblx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCJ2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgPyAob2JqKSA9PiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikpIDogKG9iaikgPT4gKG9iai5fX3Byb3RvX18pO1xudmFyIGxlYWZQcm90b3R5cGVzO1xuLy8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4vLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbi8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLy8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4vLyBtb2RlICYgMTY6IHJldHVybiB2YWx1ZSB3aGVuIGl0J3MgUHJvbWlzZS1saWtlXG4vLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuXHRpZihtb2RlICYgMSkgdmFsdWUgPSB0aGlzKHZhbHVlKTtcblx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcblx0aWYodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSkge1xuXHRcdGlmKChtb2RlICYgNCkgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuXHRcdGlmKChtb2RlICYgMTYpICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSByZXR1cm4gdmFsdWU7XG5cdH1cblx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcblx0dmFyIGRlZiA9IHt9O1xuXHRsZWFmUHJvdG90eXBlcyA9IGxlYWZQcm90b3R5cGVzIHx8IFtudWxsLCBnZXRQcm90byh7fSksIGdldFByb3RvKFtdKSwgZ2V0UHJvdG8oZ2V0UHJvdG8pXTtcblx0Zm9yKHZhciBjdXJyZW50ID0gbW9kZSAmIDIgJiYgdmFsdWU7IHR5cGVvZiBjdXJyZW50ID09ICdvYmplY3QnICYmICF+bGVhZlByb3RvdHlwZXMuaW5kZXhPZihjdXJyZW50KTsgY3VycmVudCA9IGdldFByb3RvKGN1cnJlbnQpKSB7XG5cdFx0T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3VycmVudCkuZm9yRWFjaCgoa2V5KSA9PiAoZGVmW2tleV0gPSAoKSA9PiAodmFsdWVba2V5XSkpKTtcblx0fVxuXHRkZWZbJ2RlZmF1bHQnXSA9ICgpID0+ICh2YWx1ZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChucywgZGVmKTtcblx0cmV0dXJuIG5zO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5tZCA9IChtb2R1bGUpID0+IHtcblx0bW9kdWxlLnBhdGhzID0gW107XG5cdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0cmV0dXJuIG1vZHVsZTtcbn07IiwidmFyIHNjcmlwdFVybDtcbmlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLmcuaW1wb3J0U2NyaXB0cykgc2NyaXB0VXJsID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2F0aW9uICsgXCJcIjtcbnZhciBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5kb2N1bWVudDtcbmlmICghc2NyaXB0VXJsICYmIGRvY3VtZW50KSB7XG5cdGlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnU0NSSVBUJylcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYztcblx0aWYgKCFzY3JpcHRVcmwpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGlmKHNjcmlwdHMubGVuZ3RoKSB7XG5cdFx0XHR2YXIgaSA9IHNjcmlwdHMubGVuZ3RoIC0gMTtcblx0XHRcdHdoaWxlIChpID4gLTEgJiYgKCFzY3JpcHRVcmwgfHwgIS9eaHR0cChzPyk6Ly50ZXN0KHNjcmlwdFVybCkpKSBzY3JpcHRVcmwgPSBzY3JpcHRzW2ktLV0uc3JjO1xuXHRcdH1cblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5iID0gZG9jdW1lbnQuYmFzZVVSSSB8fCBzZWxmLmxvY2F0aW9uLmhyZWY7XG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJtYWluXCI6IDBcbn07XG5cbi8vIG5vIGNodW5rIG9uIGRlbWFuZCBsb2FkaW5nXG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbi8vIG5vIG9uIGNodW5rcyBsb2FkZWRcblxuLy8gbm8ganNvbnAgZnVuY3Rpb24iLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCBQYXJzZSBmcm9tIFwicGFyc2VcIjtcclxuaW1wb3J0IFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCI7XHJcbmltcG9ydCBQZGZSZXF1ZXN0RmlsZXMgZnJvbSBcIi4uL3BhZ2VzL1BkZlJlcXVlc3RGaWxlc1wiO1xyXG5pbXBvcnQgeyBwZGZqcyB9IGZyb20gXCJyZWFjdC1wZGZcIjtcclxuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tIFwicmVhY3QtcmVkdXhcIjtcclxuaW1wb3J0IHsgc3RvcmUgfSBmcm9tIFwiLi4vcmVkdXgvc3RvcmVcIjtcclxuaW1wb3J0IFwiLi4vaW5kZXguY3NzXCI7XHJcbmltcG9ydCBcIi4vaTE4blwiO1xyXG5pbXBvcnQgeyBpc1B1YmxpY1N0YWdpbmcgfSBmcm9tIFwiLi4vY29uc3RhbnQvY29uc3RcIjtcclxucGRmanMuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMgPSBgLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvcGRmLmpzLyR7cGRmanMudmVyc2lvbn0vcGRmLndvcmtlci5taW4ubWpzYDtcclxuXHJcbi8vIFdyYXBwZXIgY29tcG9uZW50IHRvIG1hbmFnZSBwcm9wc1xyXG5jb25zdCBQdWJsaWNTY3JpcHRGaWxlV3JhcHBlciA9ICh7IGluaXRpYWxQcm9wcyB9KSA9PiB7XHJcbiAgY29uc3QgW3Byb3BzLCBzZXRQcm9wc10gPSB1c2VTdGF0ZShpbml0aWFsUHJvcHMpO1xyXG5cclxuICAvLyBNYWtlIHRoZSBzZXRQcm9wcyBmdW5jdGlvbiBnbG9iYWxseSBhY2Nlc3NpYmxlXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIHdpbmRvdy51cGRhdGVQdWJsaWNUZW1wbGF0ZVByb3BzID0gc2V0UHJvcHM7XHJcblxyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgd2luZG93LnVwZGF0ZVB1YmxpY1RlbXBsYXRlUHJvcHMgPSB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgcmV0dXJuIDxQZGZSZXF1ZXN0RmlsZXMgey4uLnByb3BzfSAvPjtcclxufTtcclxuXHJcbmNvbnN0IGFwcElkID0gaXNQdWJsaWNTdGFnaW5nID8gXCJvcGVuc2lnblwiIDogXCJsZWdhZHJhbmF4blwiO1xyXG4vL1wib3BlbnNpZ25cIlxyXG5cclxuY29uc3Qgc2VydmVyVXJsID0gaXNQdWJsaWNTdGFnaW5nXHJcbiAgPyBcImh0dHBzOi8vc3RhZ2luZy1hcHAub3BlbnNpZ25sYWJzLmNvbS9hcGkvYXBwXCJcclxuICA6IFwiaHR0cHM6Ly9hcHAub3BlbnNpZ25sYWJzLmNvbS9hcGkvYXBwXCI7XHJcbi8vICBcImh0dHBzOi8vc3RhZ2luZy1hcHAub3BlbnNpZ25sYWJzLmNvbS9hcGkvYXBwXCJcclxuXHJcbmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYmFzZVVybFwiLCBgJHtzZXJ2ZXJVcmx9L2ApO1xyXG5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInBhcnNlQXBwSWRcIiwgYXBwSWQpO1xyXG5QYXJzZS5pbml0aWFsaXplKGFwcElkKTtcclxuUGFyc2Uuc2VydmVyVVJMID0gc2VydmVyVXJsO1xyXG4vLyBDcmVhdGUgYSBuZXcgZGl2IGVsZW1lbnQgYW5kIGFwcGVuZCBpdCB0byB0aGUgYm9keVxyXG5jb25zdCBzY3JpcHRDb21wb25lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5zY3JpcHRDb21wb25lbnQuaWQgPSBcInNjcmlwdC1jb21wb25lbnRcIjtcclxuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHRDb21wb25lbnQpO1xyXG5jb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XHJcbmxpbmsuaHJlZiA9IFwiaHR0cHM6Ly9jZG4ub3BlbnNpZ25sYWJzLmNvbS9mb250cy5jc3NcIjtcclxubGluay5yZWwgPSBcInN0eWxlc2hlZXRcIjtcclxuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcclxuXHJcbi8vYWRkIHRoZSBUYWlsd2luZCBDU1MgZmlsZVxyXG5jb25zdCB0YWlsd2luZENzc0xpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcclxudGFpbHdpbmRDc3NMaW5rLmhyZWYgPVxyXG4gIFwiaHR0cHM6Ly9hcHAub3BlbnNpZ25sYWJzLmNvbS9zdGF0aWMvanMvcHVibGljLXRlbXBsYXRlLmJ1bmRsZS5jc3NcIjsgLy8gY3NzIGJ1bmRsZSBmaWxlXHJcbnRhaWx3aW5kQ3NzTGluay5yZWwgPSBcInN0eWxlc2hlZXRcIjtcclxuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0YWlsd2luZENzc0xpbmspO1xyXG4vLyBDcmVhdGUgYSByb290IGFuZCByZW5kZXIgdGhlIHdyYXBwZXIgY29tcG9uZW50IHdpdGggaW5pdGlhbCBwcm9wc1xyXG5jb25zdCByb290ID0gUmVhY3RET00uY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNjcmlwdC1jb21wb25lbnRcIikpO1xyXG5yb290LnJlbmRlcihcclxuICA8ZGl2IGRhdGEtdGhlbWU9XCJvcGVuc2lnbmNzc1wiPlxyXG4gICAgPFByb3ZpZGVyIHN0b3JlPXtzdG9yZX0+XHJcbiAgICAgIDxQdWJsaWNTY3JpcHRGaWxlV3JhcHBlciBpbml0aWFsUHJvcHM9e3sgdGV4dDogXCJ0ZW1wbGF0ZUlkXCIgfX0gLz5cclxuICAgIDwvUHJvdmlkZXI+XHJcbiAgPC9kaXY+XHJcbik7XHJcbiJdLCJuYW1lcyI6WyJSZWFjdCIsIkhlbG1ldCIsIlRpdGxlIiwiX3JlZiIsInRpdGxlIiwiZHJpdmUiLCJjcmVhdGVFbGVtZW50IiwibmFtZSIsImNvbnRlbnQiLCJyZWwiLCJ0eXBlIiwiaHJlZiIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJzaXplcyIsIkJvcmRlclJlc2l6ZSIsInJpZ2h0IiwidG9wIiwiY2xhc3NOYW1lIiwidXNlVHJhbnNsYXRpb24iLCJEZWZhdWx0U2lnbmF0dXJlIiwiZGVmYXVsdFNpZ25JbWciLCJ4eVBvc3Rpb24iLCJzZXREZWZhdWx0U2lnbkFsZXJ0IiwidCIsImNvbmZpcm1Ub2FkZERlZmF1bHRTaWduIiwibGVuZ3RoIiwiaXNTaG93IiwiYWxlcnRNZXNzYWdlIiwiYWx0Iiwic3JjIiwib25DbGljayIsInVzZVN0YXRlIiwiUHJldk5leHQiLCJoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlIiwiaGFuZGxlRG93bmxvYWRQZGYiLCJoYW5kbGVUb1ByaW50IiwiRHJvcGRvd25NZW51IiwiTW9kYWxVaSIsIkxvYWRlciIsIkhlYWRlciIsImlzUGRmUmVxdWVzdEZpbGVzIiwiaXNQbGFjZWhvbGRlciIsInNldElzRGVjbGluZSIsInBhZ2VOdW1iZXIiLCJhbGxQYWdlcyIsImNoYW5nZVBhZ2UiLCJwZGZVcmwiLCJlbWJlZFdpZGdldHNEYXRhIiwicGRmRGV0YWlscyIsInNpZ25lclBvcyIsInNpZ25lcnNkYXRhIiwiaXNNYWlsU2VuZCIsImFsZXJ0U2VuZEVtYWlsIiwiaXNDb21wbGV0ZWQiLCJpc1Nob3dIZWFkZXIiLCJkZWNsaW5lIiwiY3VycmVudFNpZ25lciIsImFscmVhZHlTaWduIiwiaXNTaWduWW91cnNlbGYiLCJzZXRJc0VtYWlsIiwiY29tcGxldGVCdG5UaXRsZSIsInNldElzRWRpdFRlbXBsYXRlIiwiaXNQdWJsaWNUZW1wbGF0ZSIsImNsaWNrT25ab29tSW4iLCJjbGlja09uWm9vbU91dCIsImhhbmRsZVJvdGF0aW9uRnVuIiwiaXNEaXNhYmxlUm90YXRlIiwidGVtcGxhdGVJZCIsImZpbHRlclByZWZpbGwiLCJmaWx0ZXIiLCJkYXRhIiwiUm9sZSIsImlzTW9iaWxlIiwid2luZG93IiwiaW5uZXJXaWR0aCIsImlzRG93bmxvYWRpbmciLCJzZXRJc0Rvd25sb2FkaW5nIiwiaXNHdWVzdFNpZ25lciIsImhhbmRsZURlY2xpbmVQZGZBbGVydCIsImN1cnJlbnREZWNsaW5lIiwiY3Vycm50IiwiaXNEZWNsaW5lZCIsImlkIiwic3R5bGUiLCJ3aWR0aCIsImhpc3RvcnkiLCJnbyIsIlJvb3QiLCJUcmlnZ2VyIiwiYXNDaGlsZCIsIlBvcnRhbCIsIkNvbnRlbnQiLCJzaWRlT2Zmc2V0IiwiSXRlbSIsImUiLCJVUkwiLCJGcmFnbWVudCIsImRpc2FibGVkIiwiaXNPcGVuIiwiaGFuZGxlQ2xvc2UiLCJQZGZab29tIiwicHJvcHMiLCJjdXJzb3IiLCJ6b29tUGVyY2VudCIsInVzZUVmZmVjdCIsIlBsYWNlaG9sZGVyQm9yZGVyIiwiUm5kIiwiZGVmYXVsdFdpZHRoSGVpZ2h0IiwiZm9udENvbG9yQXJyIiwiZm9udHNpemVBcnIiLCJnZXRDb250YWluZXJTY2FsZSIsImhhbmRsZUNvcHlOZXh0VG9XaWRnZXQiLCJpc1RhYkFuZE1vYmlsZSIsIm9uQ2hhbmdlSW5wdXQiLCJyYWRpb0J1dHRvbldpZGdldCIsInRleHRJbnB1dFdpZGdldCIsInRleHRXaWRnZXQiLCJQbGFjZWhvbGRlclR5cGUiLCJtb21lbnQiLCJzZWxlY3RGb3JtYXQiLCJjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQiLCJmb3JtYXQiLCJnZXREZWZhdWx0ZGF0ZSIsInNlbGVjdGVkRGF0ZSIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsImRhdGUiLCJuZXdkYXRlIiwiRGF0ZSIsImRheSIsIm1vbnRoIiwieWVhciIsInNwbGl0IiwidmFsdWUiLCJnZXREZWZhdWx0Rm9ybWF0IiwiZGF0ZUZvcm1hdCIsIlBsYWNlaG9sZGVyIiwicGxhY2Vob2xkZXJCb3JkZXIiLCJzZXRQbGFjZWhvbGRlckJvcmRlciIsInciLCJoIiwiaXNEcmFnZ2luZ0VuYWJsZWQiLCJzZXREcmFnZ2luZ0VuYWJsZWQiLCJpc0RhdGVNb2RhbCIsInNldElzRGF0ZU1vZGFsIiwiY29udGFpbmVyU2NhbGUiLCJzZXRDb250YWluZXJTY2FsZSIsInNlbGVjdERhdGUiLCJzZXRTZWxlY3REYXRlIiwicG9zIiwib3B0aW9ucyIsInJlc3BvbnNlIiwidmFsaWRhdGlvbiIsImdldFRpbWUiLCJzZXREYXRlRm9ybWF0IiwiY2xpY2tvbldpZGdldCIsInNldENsaWNrb25XaWRnZXQiLCJzdGFydERhdGUiLCJzZXRTdGFydERhdGUiLCJnZXRDaGVja2JveFJlbmRlcldpZHRoIiwic2V0R2V0Q2hlY2tib3hSZW5kZXJXaWR0aCIsImhlaWdodCIsImdldFBkZlBhZ2VXaWR0aCIsInBkZk9yaWdpbmFsV0giLCJmaW5kIiwiY29udGFpbmVyV0giLCJkYXRlRm9ybWF0QXJyIiwidXBkYXRlV2lkdGgiLCJybmRFbGVtZW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImtleSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInRpbWVyIiwic2V0VGltZW91dCIsImNsZWFyVGltZW91dCIsImNsb3NlTWVudU9uT3V0c2lkZUNsaWNrIiwidGFyZ2V0IiwiY2xvc2VzdCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY2hhbmdlRGF0ZUZvcm1hdCIsInVwZGF0ZURhdGUiLCJtYXAiLCJtaWxsaXNlY29uZHMiLCJuZXdEYXRlIiwiZGF0ZU9iaiIsInB1c2giLCJoYW5kbGVXaWRnZXRJZGFuZFBvcHVwIiwic2V0U2VsZWN0V2lkZ2V0SWQiLCJ3aWRnZXRUeXBlRXhpc3QiLCJpbmNsdWRlcyIsImlzTmVlZFNpZ24iLCJpc0RyYWdnaW5nIiwiaXNwdWJsaWNUZW1wbGF0ZSIsImhhbmRsZVVzZXJEZXRhaWxzIiwic2V0SXNTaWduUGFkIiwic2V0U2lnbktleSIsInNldElzU3RhbXAiLCJpc1N0YW1wIiwic2V0SXNJbml0aWFsIiwic2VsZWN0V2lkZ2V0SWQiLCJoYW5kbGVMaW5rVXNlciIsIklkIiwic2V0VW5pcXVlSWQiLCJjaGVja0luZGV4IiwiZmluZEluZGV4Iiwic2V0SXNTZWxlY3RJZCIsInNpZ25lck9iaklkIiwiaGFuZGxlT25DbGlja1BsYWNlaG9sZGVyIiwic2V0Q3VycldpZGdldHNEZXRhaWxzIiwic2V0V2lkZ2V0VHlwZSIsInVuaXF1ZUlkIiwiaGFuZGxlT25DbGlja1NldHRpbmdJY29uIiwic2V0SXNSYWRpbyIsInNldFNob3dEcm9wZG93biIsInNldElzQ2hlY2tib3giLCJoYW5kbGVUZXh0U2V0dGluZ01vZGFsIiwiaGFuZGxlTmFtZU1vZGFsIiwic2V0VGVtcFNpZ25lcklkIiwiaGFuZGxlQ29weVBsYWNlaG9sZGVyIiwic3RvcFByb3BhZ2F0aW9uIiwic2V0SXNQYWdlQ29weSIsImluZGV4Iiwic2V0WHlQb3N0aW9uIiwiaGFuZGxlU2F2ZURhdGUiLCJpc0RhdGVDaGFuZ2UiLCJmb250U2l6ZSIsImZvbnRDb2xvciIsIlBsYWNlaG9sZGVySWNvbiIsImlzU2hvd0JvcmRlciIsIm9uVG91Y2hFbmQiLCJjb2xvciIsInpJbmRleCIsImhhbmRsZURlbGV0ZVNpZ24iLCJ4UG9zIiwic2lnbllvdXJzZWxmIiwicmVzaXplUG9zIiwieFBvc2l0aW9uIiwic2NhbGUiLCJ5UG9zIiwieVBvc2l0aW9uIiwiZ2V0Q3Vyc29yIiwidW5TaWduZWRXaWRnZXRJZCIsImxvY2tBc3BlY3RSYXRpbyIsIldpZHRoIiwiSGVpZ2h0IiwiZW5hYmxlUmVzaXppbmciLCJib3R0b20iLCJsZWZ0IiwidG9wUmlnaHQiLCJib3R0b21SaWdodCIsImJvdHRvbUxlZnQiLCJ0b3BMZWZ0IiwiYm91bmRzIiwiYm9yZGVyIiwiYm9yZGVyUmFkaXVzIiwidGV4dEFsaWduIiwiYmFja2dyb3VuZCIsImJsb2NrQ29sb3IiLCJvbkRyYWciLCJoYW5kbGVUYWJEcmFnIiwic2l6ZSIsInBvc1dpZHRoIiwicG9zSGVpZ2h0Iiwib25SZXNpemVTdGFydCIsInNldElzUmVzaXplIiwib25SZXNpemVTdG9wIiwiZGlyZWN0aW9uIiwicmVmIiwiaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemUiLCJpc1Jlc2l6ZSIsImRpc2FibGVEcmFnZ2luZyIsIm9uRHJhZ1N0b3AiLCJldmVudCIsImRyYWdFbGVtZW50IiwiaGFuZGxlU3RvcCIsInBvc2l0aW9uIiwieCIsInkiLCJvblJlc2l6ZSIsIm9mZnNldFdpZHRoIiwib2Zmc2V0SGVpZ2h0IiwiaXNTaG93RHJvcGRvd24iLCJoYW5kbGVVc2VyTmFtZSIsInNldFZhbGlkYXRlQWxlcnQiLCJzaG93Q2xvc2UiLCJkZWZhdWx0VmFsdWUiLCJvbkNoYW5nZSIsInNlbGVjdGVkSW5kZXgiLCJpbmQiLCJzZXRGb250U2l6ZSIsInNldEZvbnRDb2xvciIsInRoZW1lQ29sb3IiLCJyZXNpemVCb3JkZXJFeHRyYVdpZHRoIiwiZ2V0UmVzaXplQm9yZGVyRXh0cmFXaWR0aCIsImRlZmF1bHRXaWR0aCIsImRlZmF1bHRIZWlnaHQiLCJnZXRXaWR0aCIsImdldEhlaWdodCIsImhhbmRsZU1pbldpZHRoIiwiaGFuZGxlTWluSGVpZ2h0Iiwib25Nb3VzZUVudGVyIiwiYm9yZGVyQ29sb3IiLCJtaW5XaWR0aCIsIm1pbkhlaWdodCIsImZvcndhcmRSZWYiLCJ1c2VSZWYiLCJnZXRNb250aCIsImdldFllYXIiLCJvbkNoYW5nZUhlaWdodE9mVGV4dEFyZWEiLCJyYW5nZSIsIkRhdGVQaWNrZXIiLCJSZWdleFBhcnNlciIsImVtYWlsUmVnZXgiLCJ0ZXh0V2lkZ2V0Q2xzIiwic2VsZWN0V2lkZ2V0Q2xzIiwid2lkZ2V0VHlwZVRyYXNsYXRpb24iLCJzZWxlY3RPcHRpb24iLCJzZXRTZWxlY3RPcHRpb24iLCJ2YWxpZGF0ZVBsYWNlaG9sZGVyIiwic2V0VmFsaWRhdGVQbGFjZWhvbGRlciIsImlucHV0UmVmIiwidGV4dFZhbHVlIiwic2V0VGV4dFZhbHVlIiwic2VsZWN0ZWRDaGVja2JveCIsInNldFNlbGVjdGVkQ2hlY2tib3giLCJ5ZWFycyIsIm1vbnRocyIsInZhbGlkYXRlRXhwcmVzc2lvbiIsInJlZ2V4VmFsaWRhdGlvbiIsInJlZ2V4T2JqZWN0IiwiaXNWYWxpZGF0ZSIsInRlc3QiLCJjdXJyZW50IiwiZm9jdXMiLCJoYW5kbGVJbnB1dEJsdXIiLCJ2YWxpZGF0ZVR5cGUiLCJwYXR0ZXJuIiwiaGFuZGxlVGV4dFZhbGlkIiwidGV4dElucHV0IiwiY2hlY2tSZWd1bGFyRXhwcmVzcyIsImlzRGVmYXVsdFZhbHVlIiwiaGludCIsImRlZmF1bHREYXRhIiwiRXhhbXBsZUN1c3RvbUlucHV0IiwiZm9udEZhbWlseSIsImRpc3BsYXlOYW1lIiwiaXNEZWZhdWx0Iiwic2VuZGVyVXNlciIsImpzb25TZW5kZXIiLCJKU09OIiwicGFyc2UiLCJzZWxlY3RDaGVja2JveCIsInJlcyIsImRlZmF1bHRDaGVjayIsImlzU2VsZWN0SW5kZXgiLCJpbmRleE9mIiwiaGFuZGxlUmFkaW9DaGVjayIsImhhbmRsZUNoZWNrYm94VmFsdWUiLCJpc0NoZWNrZWQiLCJ1cGRhdGVTZWxlY3RlZENoZWNrYm94IiwiY2hlY2tlZExpc3QiLCJpc0RlZmF1bHRFbXB0eSIsImhhbmRsZUNoZWNrUmFkaW8iLCJpc1JhZGlvIiwiaGFuZGxlT25EYXRlQ2hhbmdlIiwiaGFuZGxlRW50ZXJQcmVzcyIsIlNpZ25VcmwiLCJkcmFnZ2FibGUiLCJ2YWx1ZXMiLCJvbkJsdXIiLCJpc1JlYWRPbmx5IiwiY2hlY2tlZCIsIm1heFJlcXVpcmVkIiwibWF4UmVxdWlyZWRDb3VudCIsIm1heENvdW50SW50IiwicGFyc2VJbnQiLCJpc0hpZGVMYWJlbCIsInBsYWNlaG9sZGVyIiwicm93cyIsIm9uS2V5RG93biIsImNvbHMiLCJvdmVyZmxvdyIsImhpZGRlbiIsInJlbmRlckN1c3RvbUhlYWRlciIsIl9yZWYyIiwiY2hhbmdlWWVhciIsImNoYW5nZU1vbnRoIiwiX3JlZjMiLCJvcHRpb24iLCJfcmVmNCIsImNsb3NlT25TY3JvbGwiLCJzZWxlY3RlZCIsInBvcHBlclBsYWNlbWVudCIsImN1c3RvbUlucHV0IiwibWFyZ2luVG9wIiwicHJldmlvdXNQYWdlIiwibmV4dFBhZ2UiLCJEb2N1bWVudCIsIlBhZ2UiLCJ1c2VTZWxlY3RvciIsIlJlbmRlckFsbFBkZlBhZ2UiLCJzaWduUGRmVXJsIiwic2V0QWxsUGFnZXMiLCJzZXRQYWdlTnVtYmVyIiwic2V0U2lnbkJ0blBvc2l0aW9uIiwic2lnbmVyT2JqZWN0SWQiLCJwZGZSb3RhdGVCYXNlNjQiLCJzaWduUGFnZU51bWJlciIsInNldFNpZ25QYWdlTnVtYmVyIiwiYm9va21hcmtDb2xvciIsInNldEJvb2ttYXJrQ29sb3IiLCJvbkRvY3VtZW50TG9hZCIsIm51bVBhZ2VzIiwiY2hlY2tVc2VyIiwicGFnZU51bWJlckFyciIsInBsYWNlSG9sZGVyIiwicGFnZUNvbnRhaW5lciIsImlzSGVhZGVyIiwic3RhdGUiLCJzaG93SGVhZGVyIiwicGFnZVdpZHRoIiwic2V0UGFnZVdpZHRoIiwidXBkYXRlU2l6ZSIsImFkZFNpZ25hdHVyZUJvb2ttYXJrIiwiaXNwYWdlTnVtYmVyIiwicGRmRGF0YUJhc2U2NCIsImxvYWRpbmciLCJvbkxvYWRTdWNjZXNzIiwiZmlsZSIsIkFycmF5IiwiZnJvbSIsImVsIiwicmVuZGVyQW5ub3RhdGlvbkxheWVyIiwicmVuZGVyVGV4dExheWVyIiwiUlNDIiwiaGFuZGxlSW1hZ2VSZXNpemUiLCJBbGVydCIsIlJlbmRlclBkZiIsImRyb3AiLCJzdWNjZXNzRW1haWwiLCJwYWdlRGV0YWlscyIsInBkZlJlcXVlc3QiLCJzaWduZWRTaWduZXJzIiwicGRmTG9hZCIsInNldFBkZkxvYWQiLCJzZXRTaWduZXJQb3MiLCJzZXRJc1ZhbGlkYXRlIiwiSXNSZXNpemUiLCJjaGVja1NpZ25lZFNpZ25lcnMiLCJjaGVja1NpZ24iLCJzaWduIiwib2JqZWN0SWQiLCJoYW5kbGVBbGxVc2VyTmFtZSIsIlNpZ25lcnMiLCJzaWduZXIiLCJOYW1lIiwicGxhY2VEYXRhIiwiYm94U2hhZG93IiwiaW5uZXJIZWlnaHQiLCJub1Njcm9sbFkiLCJub1Njcm9sbFgiLCJJc0NvbXBsZXRlZCIsIm9uTG9hZEVycm9yIiwiU2lnbmVkVXJsIiwib25HZXRBbm5vdGF0aW9uc0Vycm9yIiwiZXJyb3IiLCJjb25zb2xlIiwibG9nIiwiU2lnbmF0dXJlQ2FudmFzIiwiU2lnblBhZCIsImlzU2lnblBhZCIsInNldElzSW1hZ2VTZWxlY3QiLCJvblNhdmVTaWduIiwic2V0SW1hZ2UiLCJpc0ltYWdlU2VsZWN0IiwiaW1hZ2VSZWYiLCJvbkltYWdlQ2hhbmdlIiwib25TYXZlSW1hZ2UiLCJpbWFnZSIsImRlZmF1bHRTaWduIiwic2V0U2lnbmF0dXJlIiwibXlJbml0aWFsIiwiaXNJbml0aWFsIiwid2lkZ2V0VHlwZSIsImN1cnJXaWRnZXRzRGV0YWlscyIsInBlbkNvbG9yIiwic2V0UGVuQ29sb3IiLCJhbGxDb2xvciIsImNhbnZhc1JlZiIsImlzRGVmYXVsdFNpZ24iLCJzZXRJc0RlZmF1bHRTaWduIiwiaXNUYWIiLCJzZXRJc1RhYiIsImlzU2lnbkltZyIsInNldElzU2lnbkltZyIsInNpZ25WYWx1ZSIsInNldFNpZ25WYWx1ZSIsInRleHRXaWR0aCIsInNldFRleHRXaWR0aCIsInRleHRIZWlnaHQiLCJzZXRUZXh0SGVpZ2h0Iiwic2lnbmF0dXJlVHlwZSIsInNldFNpZ25hdHVyZVR5cGUiLCJmb250T3B0aW9ucyIsImZvbnRTZWxlY3QiLCJzZXRGb250U2VsZWN0IiwiY3VycmVudFVzZXJOYW1lIiwiaGFuZGxlQ2xlYXIiLCJjbGVhciIsImhhbmRsZVNpZ25hdHVyZUNoYW5nZSIsIlNhdmVCdG4iLCJpc1dpZGdldFR5cGUiLCJ1cmwiLCJmcm9tRGF0YVVSTCIsInRyaW1tZWROYW1lIiwidHJpbSIsImZpcnN0Q2hhcmFjdGVyIiwiY2hhckF0IiwidXNlck5hbWUiLCJsb2FkRm9udCIsImZvbnRzIiwibG9hZCIsInNlbGVjdEZvbnRTVHlsZSIsImZvbnQiLCJjb252ZXJ0VG9JbWciLCJmb250U3R5bGUiLCJ0ZXh0IiwidGV4dENvbnRlbnQiLCJmb250ZmFtaWx5IiwiZm9udFNpemVWYWx1ZSIsInNwYW4iLCJkaXNwbGF5IiwiYm9keSIsImFwcGVuZENoaWxkIiwiY2FudmFzRWxlbWVudCIsImN0eCIsImdldENvbnRleHQiLCJwaXhlbFJhdGlvIiwiZGV2aWNlUGl4ZWxSYXRpbyIsImFkZEV4dHJhV2lkdGgiLCJmaWxsU3R5bGUiLCJ0ZXh0QmFzZWxpbmUiLCJmaWxsVGV4dCIsInJlbW92ZUNoaWxkIiwiZGF0YVVybCIsInRvRGF0YVVSTCIsIlBlbkNvbG9yQ29tcG9uZW50IiwibWFyZ2luIiwiYm9yZGVyQm90dG9tIiwiZmxleERpcmVjdGlvbiIsImp1c3RpZnlDb250ZW50IiwiYWxpZ25JdGVtcyIsIm1hcmdpbkJvdHRvbSIsImNsaWNrIiwiYWNjZXB0IiwibWF4TGVuZ3RoIiwiYmFja2dyb3VuZENvbG9yIiwicGFkZGluZyIsImNhbnZhc1Byb3BzIiwib25FbmQiLCJkb3RTaXplIiwiZGFya2VuQ29sb3IiLCJnZXRGaXJzdExldHRlciIsIlNpZ25lckxpc3RDb21wb25lbnQiLCJjaGVja1NpZ25lckJhY2tDb2xvciIsIm9iaiIsImNoZWNrVXNlck5hbWVDb2xvciIsImdldEJhY2tDb2xvciIsImVtYWlsIiwiRW1haWwiLCJWZXJpZnlFbWFpbCIsImlzVmVyaWZ5TW9kYWwiLCJvblN1Ym1pdCIsInNldElzVmVyaWZ5TW9kYWwiLCJoYW5kbGVWZXJpZnlFbWFpbCIsIm9uSW52YWxpZCIsInNldEN1c3RvbVZhbGlkaXR5Iiwib25JbnB1dCIsInJlcXVpcmVkIiwib3RwIiwic2V0T3RwIiwiaGFuZGxlUmVzZW5kIiwib3RwTG9hZGVyIiwiaGFuZGxlVmVyaWZ5QnRuIiwiYXhpb3MiLCJQREZEb2N1bWVudCIsInJnYiIsImRlZ3JlZXMiLCJQYXJzZSIsImFwcEluZm8iLCJzYXZlQXMiLCJwcmludE1vZHVsZSIsInZhbGlkcGxhbiIsImZvbnRraXQiLCJmaWxlYXNieXRlcyIsImZpbGVwYXRoIiwiZmV0Y2giLCJhcnJheUJ1ZmZlciIsIlVpbnQ4QXJyYXkiLCJvcGVuSW5OZXdUYWIiLCJvcGVuIiwiZmV0Y2hTdWJzY3JpcHRpb24iLCJleHRVc2VySWQiLCJjb250YWN0T2JqSWQiLCJpc0d1ZXN0U2lnbiIsIkV4dGFuZF9DbGFzcyIsImV4dENsYXNzIiwiZXh0VXNlciIsImJhc2VVUkwiLCJoZWFkZXJzIiwic2Vzc2lvblRva2VuIiwicGFyYW1zIiwiY29udGFjdElkIiwidGVuYXRSZXMiLCJwb3N0IiwicGxhbiIsInN0YXR1cyIsImJpbGxpbmdEYXRlIiwiYWRtaW5JZCIsInJlc3VsdCIsImlzU3Vic2NyaWJlZCIsIlBsYW5Db2RlIiwiTmV4dF9iaWxsaW5nX2RhdGUiLCJpc28iLCJhbGxvd2VkVXNlcnMiLCJBbGxvd2VkVXNlcnMiLCJFeHRVc2VyUHRyIiwic2V0SXRlbSIsImVyciIsImZldGNoU3Vic2NyaXB0aW9uSW5mbyIsInByaWNlIiwiU3Vic2NyaXB0aW9uRGV0YWlscyIsInN1YnNjcmlwdGlvbiIsInRvdGFsUHJpY2UiLCJhbW91bnQiLCJwbGFuSWQiLCJzdWJzY3JpcHRpb25faWQiLCJwbGFuX2NvZGUiLCJ0b3RhbEFsbG93ZWRVc2VyIiwiY2hlY2tJc1N1YnNjcmliZWQiLCJpc1ZhbGlkIiwibmFtZUNvbG9yIiwidG9EYXRhVXJsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwicmVhZEFzRGF0YVVSTCIsIm9ubG9hZGVuZCIsImdldERyaXZlIiwiZG9jdW1lbnRJZCIsInNraXAiLCJsaW1pdCIsImRvY0lkIiwiZHJpdmVEZWF0aWxzIiwic2Vzc2lvbnRva2VuIiwidGhlbiIsIkxpc3RkYXRhIiwianNvbiIsImNhdGNoIiwicGRmTmV3V2lkdGhGdW4iLCJkaXZSZWYiLCJwZGZXaWR0aCIsImNvbnRyYWN0VXNlcnMiLCJ1c2VyRGV0YWlscyIsIkNsb3VkIiwicnVuIiwic3RyaW5naWZ5Iiwic2lnbmVySWQiLCJzaG93UmVzaXplIiwiZmlsdGVyU2lnbmVyUG9zIiwiZ2V0UGxhY2VIb2xkZXIiLCJnZXRQYWdlTnVtZXIiLCJnZXRYWWRhdGEiLCJnZXRQb3NEYXRhIiwiYWRkU2lnblBvcyIsIm5ld1VwZGF0ZVNpZ25Qb3MiLCJuZXdVcGRhdGVTaWduZXIiLCJ3aWRnZXRzIiwiaWNvbiIsImljb25TaXplIiwiZ2V0RGF0ZSIsImFkZFdpZGdldE9wdGlvbnMiLCJkZWZhdWx0T3B0IiwiZ2V0V2lkZ2V0VHlwZSIsIml0ZW0iLCJ3aWRnZXROYW1lIiwiZ2V0QmFzZTY0RnJvbVVybCIsImF1dG9zaWduIiwiYmxvYiIsInBkZkJhc2UiLCJzdWZmaXhiYXNlNjQiLCJwb3AiLCJnZXRCYXNlNjRGcm9tSU1HIiwiY29udmVydFBOR3RvSlBFRyIsImJhc2U2NERhdGEiLCJyZWplY3QiLCJjYW52YXMiLCJpbWciLCJJbWFnZSIsIm9ubG9hZCIsImZpbGxSZWN0IiwiZHJhd0ltYWdlIiwianBlZ0Jhc2U2NERhdGEiLCJvbmVycm9yIiwiYWRkU2lnbiIsIm5ld1VwZGF0ZVVybCIsInNpZ25QZGZGdW4iLCJiYXNlNjRVcmwiLCJhY3RpdmVNYWlsQWRhcHRlciIsImlzQ3VzdG9tQ29tcGxldGlvbk1haWwiLCJ0ZW5hbnREZXRhaWxzIiwiZ2V0VGVuYW50RGV0YWlscyIsIm1lc3NhZ2UiLCJDb21wbGV0aW9uQm9keSIsIkNvbXBsZXRpb25TdWJqZWN0IiwiZ2V0U2lnbmF0dXJlIiwidHlwZUV4aXN0Iiwic29tZSIsImJhc2U2NFNpZ24iLCJpc1VybCIsImZldGNoSW1hZ2VCYXNlNjQiLCJnZXROZXdzZTY0IiwiY2hhbmdlSW1hZ2VXSCIsIm1haWxQcm92aWRlciIsInBkZkZpbGUiLCJ1c2VySWQiLCJzaWduYXR1cmUiLCJyZXNTaWduUGRmIiwic2lnbmVkUGRmIiwicmFuZG9tSWQiLCJyYW5kb21CeXRlcyIsImNyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsIlVpbnQxNkFycmF5IiwicmFuZG9tVmFsdWUiLCJyYW5kb21EaWdpdCIsImNyZWF0ZURvY3VtZW50IiwidGVtcGxhdGUiLCJwbGFjZWhvbGRlcnMiLCJzaWduZXJEYXRhIiwiRG9jIiwicGxhY2Vob2xkZXJzQXJyIiwic2lnbmVycyIsImZvckVhY2giLCJfX3R5cGUiLCJTZW50VG9PdGhlcnMiLCJEZXNjcmlwdGlvbiIsIk5vdGUiLCJQbGFjZWhvbGRlcnMiLCJDcmVhdGVkQnkiLCJTZW5kaW5PcmRlciIsIkF1dG9tYXRpY1JlbWluZGVycyIsIlJlbWluZE9uY2VJbkV2ZXJ5IiwiZmlyc3RMZXR0ZXIiLCJmYWN0b3IiLCJoZXgiLCJyZXBsYWNlIiwiciIsInN1YnN0cmluZyIsImciLCJiIiwiZGFya2VyUiIsIk1hdGgiLCJmbG9vciIsImRhcmtlckciLCJkYXJrZXJCIiwidG9TdHJpbmciLCJwYWRTdGFydCIsImFkZFpJbmRleCIsInNldFpJbmRleCIsInNpZ25LZXkiLCJpbml0aWFsIiwiaXNTaWduZXJzIiwic2lnbmVyUHRyIiwieHlEYXRhIiwiYWRkSW5pdGlhbERhdGEiLCJ1cGRhdGVQb3NpdGlvbiIsInBvc2l0aW9uRGF0YSIsInVwZGF0ZVBsYWNlaG9sZGVyIiwiY2FsY3VsYXRlSW5pdGlhbFdpZHRoSGVpZ2h0Iiwid2lkZ2V0RGF0YSIsImludGlhbFRleHQiLCJ3aWRnZXREYXRhVmFsdWUiLCJDb21wYW55IiwiSm9iVGl0bGUiLCJlbWJlZERvY0lkIiwicGRmRG9jIiwiZm9udEJ5dGVzIiwicmVnaXN0ZXJGb250a2l0IiwiZW1iZWRGb250Iiwic3Vic2V0IiwiaSIsInBhZ2VzIiwiZ2V0UGFnZXMiLCJwYWdlIiwiZ2V0T2JqIiwiY29tcGVuc2F0ZVJvdGF0aW9uIiwiZ2V0Um90YXRpb24iLCJhbmdsZSIsImdldFNpemUiLCJkcmF3VGV4dCIsInNpZ25hdHVyZUltZyIsImltZ1dIIiwiaXNUeXBlVGV4dCIsImdldElNR1dIIiwidXBkYXRlWFlEYXRhIiwiY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8iLCJuZXdXaWR0aCIsIm5ld0hlaWdodCIsInVwZGF0ZVhZcG9zaXRpb24iLCJwbGFjZWhvbGRlckhlaWdodCIsImFzcGVjdFJhdGlvIiwiZ2V0WFlEYXRhIiwiSW1hZ2VUeXBlIiwiaW1nVHlwZSIsIm9uSW1hZ2VTZWxlY3QiLCJzZXRJbWdXSCIsImltYWdlVHlwZSIsImZpbGVzIiwiaW1nUiIsImltYWdlVXJsIiwiYmFzZTY0ZGF0YSIsIkVycm9yIiwiYmFzZTY0SW1hZ2UiLCJyZXNpemVkQmFzZTY0IiwiY2FsY3VsYXRlRm9udFNpemUiLCJzaWdueW91cnNlbGYiLCJnZXRXaWRnZXRzRm9udENvbG9yIiwibXVsdGlTaWduRW1iZWQiLCJ1cGRhdGVJdGVtIiwicGFnZU5vIiwid2lkZ2V0c1Bvc2l0aW9uQXJyIiwiZm9ybSIsImdldEZvcm0iLCJpbWFnZXMiLCJhbGwiLCJzaWduVXJsIiwibmV3VXJsIiwiZW1iZWRKcGciLCJlbWJlZFBuZyIsIndpZGdldFdpZHRoIiwid2lkZ2V0SGVpZ2h0IiwicGxhY2Vob2xkZXJXaWR0aCIsInVwZGF0ZUNvbG9ySW5SZ2IiLCJjaGVja2JveEdhcEZyb21Ub3AiLCJpc0NoZWNrIiwib3B0aW9uc0ZvbnRTaXplIiwiY2hlY2tib3hTaXplIiwiY2hlY2tib3hUZXh0R2FwRnJvbUxlZnQiLCJjaGVja2JveFJhbmRvbUlkIiwiY2hlY2tib3giLCJjcmVhdGVDaGVja0JveCIsIm9wdGlvbnNQb3NpdGlvbiIsImNoZWNrYm94T2JqIiwiZ2V0V2lkZ2V0UG9zaXRpb24iLCJhZGRUb1BhZ2UiLCJjaGVjayIsInVuY2hlY2siLCJlbmFibGVSZWFkT25seSIsImZpeGVkV2lkdGgiLCJpc05ld09uRW50ZXJMaW5lRXhpc3QiLCJOZXdicmVha1RleHRJbnRvTGluZXMiLCJsaW5lcyIsImN1cnJlbnRMaW5lIiwid29yZCIsImxpbmVXaWR0aCIsIndpZHRoT2ZUZXh0QXRTaXplIiwiYnJlYWtUZXh0SW50b0xpbmVzIiwibmV3TGluZSIsImxpbmUiLCJ0ZXh0UG9zaXRpb24iLCJmb250c2l6ZSIsImRyb3Bkb3duUmFuZG9tSWQiLCJkcm9wZG93biIsImNyZWF0ZURyb3Bkb3duIiwiYWRkT3B0aW9ucyIsInNlbGVjdCIsImRlZmF1bHRBcHBlYXJhbmNlIiwiYWNyb0ZpZWxkIiwic2V0RGVmYXVsdEFwcGVhcmFuY2UiLCJkcm9wZG93bk9iaiIsImRyb3Bkb3duT3B0aW9uIiwiZHJvcGRvd25TZWxlY3RlZCIsImRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyIsInJhZGlvUmFuZG9tSWQiLCJyYWRpb0dyb3VwIiwiY3JlYXRlUmFkaW9Hcm91cCIsInJhZGlvT3B0aW9uR2FwRnJvbVRvcCIsInJhZGlvVGV4dEdhcEZyb21MZWZ0IiwicmFkaW9TaXplIiwicmFkaW9PYmoiLCJhZGRPcHRpb25Ub1BhZ2UiLCJpbWFnZU9wdGlvbnMiLCJwZGZCeXRlcyIsInNhdmVBc0Jhc2U2NCIsInVzZU9iamVjdFN0cmVhbXMiLCJ1cmxWYWxpZGF0b3IiLCJwcm90b2NvbCIsInBvc1VwZGF0ZUhlaWdodCIsImNvbnRhY3RCb29rIiwiZ2V0IiwicmVzdWx0cyIsImNvbnRyYWN0RG9jdW1lbnQiLCJkb2N1bWVudERlYXRpbHMiLCJhZGREZWZhdWx0U2lnbmF0dXJlSW1nIiwiY29tcGxldGUiLCJ4eURlZmF1bHRQb3MiLCJnZXRQYWdlTm8iLCJuZXdYeXBvcyIsInN0YXJ0IiwiZW5kIiwic3RlcCIsIm5ld01vbnRoIiwibmV3WWVhciIsImdldEZ1bGxZZWFyIiwibmV3cG9zaXRpb24iLCJjYWxjdWxhdGVYUG9zaXRpb24iLCJuZXdJZCIsImdldEZpbGVOYW1lIiwiZmlsZVVybCIsImZpbGVuYW1lIiwicGF0aG5hbWUiLCJnZXRBcHBMb2dvIiwibG9jYXRpb24iLCJob3N0IiwibG9nbyIsImFwcGxvZ28iLCJ1c2VyIiwiZG9tYWluIiwidGVuYW50IiwidGVuYW50Q3JlZGl0c1F1ZXJ5IiwiUXVlcnkiLCJlcXVhbFRvIiwiZmlyc3QiLCJ1cGRhdGVSZXMiLCJyZXBsYWNlTWFpbFZhcmlibGVzIiwic3ViamVjdCIsInZhcmlhYmxlcyIsInJlcGxhY2VkU3ViamVjdCIsInJlcGxhY2VkQm9keSIsInZhcmlhYmxlIiwicmVnZXgiLCJSZWdFeHAiLCJjb3B5dG9EYXRhIiwibmF2aWdhdG9yIiwiY2xpcGJvYXJkIiwid3JpdGVUZXh0IiwidGV4dEFyZWEiLCJleGVjQ29tbWFuZCIsImNvbnZlcnRQZGZBcnJheUJ1ZmZlciIsIm9rIiwiaGFuZGxlU2VuZE9UUCIsImFsZXJ0IiwiZmV0Y2hVcmwiLCJwZGZOYW1lIiwic2FuaXRpemVGaWxlTmFtZSIsImF4aW9zUmVzIiwicHJldmVudERlZmF1bHQiLCJwZGYiLCJpc0FuZHJvaWREZXZpY2UiLCJ1c2VyQWdlbnQiLCJtYXRjaCIsImlzQXBwbGVEZXZpY2UiLCJwbGF0Zm9ybSIsIm1heFRvdWNoUG9pbnRzIiwiTVNTdHJlYW0iLCJieXRlQXJyYXkiLCJhdG9iIiwiY2hhciIsImNoYXJDb2RlQXQiLCJCbG9iIiwiYmxvYlVybCIsImNyZWF0ZU9iamVjdFVSTCIsInByaW50YWJsZSIsImJhc2U2NCIsIkNlcnRpZmljYXRlVXJsIiwiY2VydGlmaWNhdGVVcmwiLCJkb2NEZXRhaWxzIiwiZG9jIiwiZmluZENvbnRhY3QiLCJjdXJyZW50VXNlciIsIlVzZXIiLCJjb250YWN0Ym9vayIsImNyZWF0ZVdpdGhvdXREYXRhIiwibm90RXF1YWxUbyIsIm1hdGNoZXMiLCJjb250YWN0UmVzIiwicGFnZVJvdGF0aW9uIiwiZGltZW5zaW9ucyIsInJvdGF0aW9uUmFkcyIsIlBJIiwiY29vcmRzRnJvbUJvdHRvbUxlZnQiLCJkcmF3WCIsImRyYXdZIiwiY29zIiwic2luIiwicm90YXRlIiwic2l6ZVJhdGlvIiwiaGFzT3duUHJvcGVydHkiLCJwYWdlUmF0aW8iLCJ2cFdpZHRoIiwiaW1hZ2VXaWR0aCIsImltYWdlSGVpZ2h0IiwiaW1hZ2VYIiwiaW1hZ2VZRnJvbVRvcCIsImNvcnJlY3Rpb24iLCJzYXZlTGFuZ3VhZ2VJbkxvY2FsIiwiaTE4biIsImRldGVjdGVkTGFuZ3VhZ2UiLCJsYW5ndWFnZSIsImdldERlZmF1bHRTaWduYXR1cmUiLCJxdWVyeSIsImRlZmF1bHRTaWduYXR1cmUiLCJJbWFnZVVSTCIsImRlZmF1bHRJbml0aWFsIiwiSW5pdGlhbHMiLCJyb3RhdGVQZGZQYWdlIiwicm90YXRlRGVncmVlIiwiYmFzZTY0VG9BcnJheUJ1ZmZlciIsImdldFBhZ2UiLCJjdXJyZW50Um90YXRpb24iLCJuZXdSb3RhdGlvbiIsInNldFJvdGF0aW9uIiwicGRmYmFzZTY0IiwiYmluYXJ5U3RyaW5nIiwibGVuIiwiYnl0ZXMiLCJidWZmZXIiLCJjb252ZXJ0QmFzZTY0VG9GaWxlIiwicGRmQmFzZTY0IiwiZmlsZU5hbWUiLCJGaWxlIiwicGRmRGF0YSIsInNhdmUiLCJvbkNsaWNrWm9vbUluIiwic2V0U2NhbGUiLCJzZXRab29tUGVyY2VudCIsIm9uQ2xpY2tab29tT3V0IiwiaGFuZGxlUmVtb3ZlV2lkZ2V0cyIsInNldElzUm90YXRlIiwidXBkYXRlZFNpZ25lclBvcyIsInBsYWNlaG9sZGVyT2JqIiwiZGVncmVlIiwiaGFuZGxlUm90YXRlV2FybmluZyIsInBsYWNlaG9sZGVyRXhpc3QiLCJpc0VuYWJsZVN1YnNjcmlwdGlvbiIsInNlcnZlclVybF9mbiIsImJhc2VVcmwiLCJwcm9jZXNzIiwiZW52IiwiUkVBQ1RfQVBQX1NFUlZFUlVSTCIsIm9yaWdpbiIsImFwcElkIiwiUkVBQ1RfQVBQX0FQUElEIiwiZGVmYXVsdFJvbGUiLCJmYkFwcElkIiwiUkVBQ1RfQVBQX0ZCQVBQSUQiLCJmZXZfSWNvbiIsImdvb2dsZUNsaWV0SWQiLCJSRUFDVF9BUFBfR09PR0xFQ0xJRU5USUQiLCJtZXRhRGVzY3JpcHRpb24iLCJzZXR0aW5ncyIsInJvbGUiLCJtZW51SWQiLCJwYWdlVHlwZSIsInBhZ2VJZCIsImV4dGVuZGVkX2NsYXNzIiwiY29udGFjdENscyIsInRlbXBsYXRlQ2xzIiwiZG9jdW1lbnRDbHMiLCJpY29uQ29sb3IiLCJSRUFDVF9BUFBfRU5BQkxFX1NVQlNDUklQVElPTiIsInRvTG93ZXJDYXNlIiwiaXNTdGFnaW5nIiwiaXNQdWJsaWNTdGFnaW5nIiwicGxhbnMiLCJwbGFuTmFtZSIsImNvZGUiLCJtb250aGx5IiwieWVhcmx5IiwiY3VycmVuY3kiLCJtb250aGx5UHJpY2UiLCJ5ZWFybHlQcmljZSIsInN1YnRpdGxlIiwiYnRuIiwiYmVuZWZpdHMiLCJ5ZWFybHlCZW5lZml0cyIsInllYXJseVVybCIsInBhaWRVcmwiLCJ0ZWFtcGVyaW9kIiwicGVyaW9kIiwiY29tcGFueSIsInBob25lIiwiUGhvbmUiLCJmdWxsbmFtZSIsImZpcnN0bmFtZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImxhc3RuYW1lIiwicXVhbnRpdHkiLCJkZXRhaWxzIiwicGxhbnVybCIsIkRuZFByb3ZpZGVyIiwiSFRNTDVCYWNrZW5kIiwiVG91ciIsIkNvbmZldHRpIiwiTG9hZGVyV2l0aE1zZyIsIkhhbmRsZUVycm9yIiwiUGRmRGVjbGluZU1vZGFsIiwiVG91ckNvbnRlbnRXaXRoQnRuIiwiUGRmUmVxdWVzdEZpbGVzIiwic2V0UGRmRGV0YWlscyIsInNldFNpZ25lZFNpZ25lcnMiLCJ1bnNpZ25lZFNpZ25lcnMiLCJzZXRVblNpZ25lZFNpZ25lcnMiLCJzZXRQZGZVcmwiLCJoYW5kbGVFcnJvciIsInNldEhhbmRsZUVycm9yIiwic2V0T3RwTG9hZGVyIiwiaXNDZWxlYnJhdGlvbiIsInNldElzQ2VsZWJyYXRpb24iLCJyZXF1ZXN0U2lnblRvdXIiLCJzZXRSZXF1ZXN0U2lnblRvdXIiLCJ0b3VyU3RhdHVzIiwic2V0VG91clN0YXR1cyIsImlzTG9hZGluZyIsInNldElzTG9hZGluZyIsImlzTG9hZCIsInNldERlZmF1bHRTaWduSW1nIiwiaXNEb2NJZCIsInNldElzRG9jSWQiLCJwZGZOZXdXaWR0aCIsInNldFBkZk5ld1dpZHRoIiwic2V0UGRmT3JpZ2luYWxXSCIsInNldFNpZ25lck9iamVjdElkIiwiaXNVaUxvYWRpbmciLCJzZXRJc1VpTG9hZGluZyIsImlzRGVjbGluZSIsInNldEN1cnJlbnRTaWduZXIiLCJpc0FsZXJ0Iiwic2V0SXNBbGVydCIsInNldFVuU2lnbmVkV2lkZ2V0SWQiLCJleHBpcmVkRGF0ZSIsInNldEV4cGlyZWREYXRlIiwic2lnbmVyVXNlcklkIiwic2V0U2lnbmVyVXNlcklkIiwiaXNEb250U2hvdyIsInNldElzRG9udFNob3ciLCJkZWZhdWx0U2lnbkFsZXJ0Iiwic2V0SXNTdWJzY3JpYmVkIiwic2V0SXNDb21wbGV0ZWQiLCJpc0NlcnRpZmljYXRlIiwiaXNNb2RhbCIsInNldE15SW5pdGlhbCIsImlzU2lnbmVkIiwic2V0SXNTaWduZWQiLCJpc0V4cGlyZWQiLCJzZXRJc0V4cGlyZWQiLCJzZXRBbHJlYWR5U2lnbiIsInNldENvbnRhaW5lcldIIiwidmFsaWRhdGVBbGVydCIsIndpZGdldHNUb3VyIiwic2V0V2lkZ2V0c1RvdXIiLCJtaW5SZXF1aXJlZENvdW50Iiwic2V0bWluUmVxdWlyZWRDb3VudCIsInNlbmRJbk9yZGVyIiwic2V0U2VuZEluT3JkZXIiLCJpc1N1YnNjcmlwdGlvbkV4cGlyZWQiLCJzZXRJc1N1YnNjcmlwdGlvbkV4cGlyZWQiLCJzZXRFeHRVc2VySWQiLCJpc0VtYWlsVmVyaWZpZWQiLCJzZXRJc0VtYWlsVmVyaWZpZWQiLCJjb250cmFjdE5hbWUiLCJzZXRDb250cmFjdE5hbWUiLCJzZXRJc1B1YmxpY1RlbXBsYXRlIiwiY29udGFjdCIsInNldENvbnRhY3QiLCJpc090cCIsInNldElzT3RwIiwic2V0TG9hZGluZyIsInNldFJlcyIsInNldERvY3VtZW50SWQiLCJpc1B1YmxpY0NvbnRhY3QiLCJzZXRJc1B1YmxpY0NvbnRhY3QiLCJwZGZBcnJheUJ1ZmZlciIsInNldFBkZkFycmF5QnVmZmVyIiwicGxhbmNvZGUiLCJzZXRQbGFuQ29kZSIsImlzR3Vlc3RTaWduRmxvdyIsInNlbmRtYWlsIiwiZ2V0RG9jSWQiLCJyb3V0ZSIsImdldFF1ZXJ5Iiwic2VhcmNoIiwiY2hlY2tTcGxpdCIsImdldERvY3VtZW50SWQiLCJnZXREb2N1bWVudERldGFpbHMiLCJnZXRUZW1wbGF0ZURldGFpbHMiLCJsb2NhbHVzZXIiLCJyZXNFbWFpbCIsImhhbmRsZU5hdmlnYXRpb24iLCJpc3B1YmxpYyIsInRlbXBsYXRlRGVhdGlscyIsImRvY3VtZW50RGF0YSIsInNldFRlbXBsYXRlU3RhdHVzIiwiSXNQdWJsaWMiLCJnZXRQdWJsaWNSb2xlIiwiUHVibGljUm9sZSIsImdldFVuaXF1ZUlkRGV0YWlscyIsInBsYWNlaG9sZGVyc09yU2lnbmVycyIsInNpZ25lcklkRXhpc3QiLCJnZXRTaWduZXJEYXRhIiwiaXNOZXh0VXNlciIsImN1cnJVc2VySWQiLCJleHBpcmVEYXRlIiwiRXhwaXJ5RGF0ZSIsImRlY2xpbmVkIiwiSXNEZWNsaW5lZCIsImV4cGlyZVVwZGF0ZURhdGUiLCJjdXJyRGF0ZSIsImdldFNpZ25lcnMiLCJnZXRDdXJyZW50U2lnbmVyIiwiVXNlcklkIiwiZXhwaXJlRGF0ZUZvcm1hdCIsImNoZWNrQ3VycmVudFVzZXIiLCJhdWRpdHRyYWlsRGF0YSIsIkF1ZGl0VHJhaWwiLCJBY3Rpdml0eSIsImNoZWNrQWxyZWFkeVNpZ24iLCJVc2VyUHRyIiwibm90ZSIsImRlc2NyaXB0aW9uIiwidmlld2VkQnkiLCJ2aWV3ZWRBdCIsImNyZWF0ZWRBdCIsInVuU2lnbmVkU2lnbmVyIiwiY2hlY2tFbWFpbCIsImVtYWlsT3JJZCIsImlzU2lnbmVkU2lnbmF0dXJlIiwic2lnbmVkRXhpc3QiLCJ0b3VyRGF0YSIsIlRvdXJTdGF0dXMiLCJjaGVja1RvdXJSZXF1ZXN0IiwicmVxdWVzdFNpZ24iLCJkZWZhdWx0U2lnblJlcyIsImVtYWlsVmVyaWZpZWQiLCJ1c2VyUXVlcnkiLCJnZXRVc2VyIiwiY2hlY2tib3hFeGlzdCIsInJlcXVpcmVkUmFkaW8iLCJzaG93QWxlcnQiLCJ3aWRnZXRLZXkiLCJyYWRpb0V4aXN0IiwicmVxdWlyZWRDaGVja2JveCIsIlRvdXJQYWdlTnVtYmVyIiwiaiIsInVwZGF0ZVBhZ2UiLCJtaW5Db3VudCIsInBhcnNlTWluIiwibWF4Q291bnQiLCJwYXJzZU1heCIsImNoZWNrU2lnbmVkIiwiY2hlY2tEZWZhdWx0U2lnbmVkIiwicmVxdWlyZWRXaWRnZXRzIiwiY2hlY2tTaWduVXJsIiwiZXhpc3RpbmdQZGZCeXRlcyIsImlzU2lnbllvdXJTZWxmRmxvdyIsImV4dFVzZXJQdHIiLCJIZWFkZXJEb2NJZCIsImFjdGl2ZV9tYWlsX2FkYXB0ZXIiLCJyZXNTaWduIiwibmV3SW5kZXgiLCJ1c2VybWFpbCIsInJlcXVlc3RCb2R5IiwiUmVxdWVzdEJvZHkiLCJyZXF1ZXN0U3ViamVjdCIsIlJlcXVlc3RTdWJqZWN0IiwibG9jYWxFeHBpcmVEYXRlIiwidG9Mb2NhbGVEYXRlU3RyaW5nIiwic2VuZGVyRW1haWwiLCJzZW5kZXJQaG9uZSIsInNlbmRlck5hbWUiLCJpbWdQbmciLCJob3N0VXJsIiwiZW5jb2RlQmFzZTY0IiwiYnRvYSIsImhvc3RQdWJsaWNVcmwiLCJzaWduUGRmIiwib3BlblNpZ25VcmwiLCJvcmdOYW1lIiwidGhlbWVCR2NvbG9yIiwicmVwbGFjZVZhciIsInJlcGxhY2VkUmVxdWVzdEJvZHkiLCJodG1sUmVxQm9keSIsImRvY3VtZW50X3RpdGxlIiwic2VuZGVyX25hbWUiLCJzZW5kZXJfbWFpbCIsInNlbmRlcl9waG9uZSIsInJlY2VpdmVyX25hbWUiLCJyZWNlaXZlcl9lbWFpbCIsInJlY2VpdmVyX3Bob25lIiwiZXhwaXJ5X2RhdGUiLCJjb21wYW55X25hbWUiLCJzaWduaW5nX3VybCIsInJlY2lwaWVudCIsImh0bWwiLCJjbG9zZVRvdXIiLCJ0b3VyQ29uZmlnIiwic2VsZWN0b3IiLCJwZGZXSE9iaiIsInRvdGFsUGFnZXMiLCJnZXRWaWV3cG9ydCIsIm9mZnNldCIsInByZXZQYWdlTnVtYmVyIiwic2F2ZUltYWdlIiwiZ2V0SW5kZXgiLCJvYmplY3QiLCJwbGFjZWhvbGRlclBvc2l0aW9uIiwiZ2V0VXBkYXRlUG9zaXRpb24iLCJzcGxpY2UiLCJpbmRleG9mU2lnbmVyIiwicHJldlN0YXRlIiwibmV3U3RhdGUiLCJzYXZlU2lnbiIsInVwZGF0ZVNpZ25lckRhdGEiLCJkZWNsaW5lRG9jIiwicmVhc29uIiwiRGVjbGluZVJlYXNvbiIsIkRlY2xpbmVCeSIsInB1dCIsImRlY2xpbmVkQnkiLCJkZWNsaW5lZEF0IiwiYWRkRGVmYXVsdFNpZ25hdHVyZSIsImN1cnJlbnRTaWduZXJQb3NpdGlvbiIsInVwZGF0ZVBsYWNlIiwidXBkYXRlc2lnbmVyUG9zIiwiaGFuZGxlRG9udFNob3ciLCJjbG9zZVJlcXVlc3RTaWduVG91ciIsInVwZGF0ZWRUb3VyU3RhdHVzIiwicmVxdWVzdFNpZ25JbmRleCIsInJlcXVlc3RTaWduVG91ckZ1bmN0aW9uIiwic2lnbmVkQnlTdGVwIiwic2lnbmVkQnkiLCJzbGljZSIsImRlZmF1bHRTaWduU3RlcCIsImRlZmF1bHRTaWduVG91ciIsInNoaWZ0Iiwib25SZXF1ZXN0Q2xvc2UiLCJzdGVwcyIsImNsb3NlV2l0aE1hc2siLCJyb3VuZGVkIiwiaGFuZGxlUHVibGljVXNlciIsInRlbXBsYXRlaWQiLCJ1c2VyUmVzIiwiU2VuZE90cCIsImhhbmRsZUlucHV0Q2hhbmdlIiwiT3RwIiwiVmVyaWZ5T1RQIiwic2VydmVyVXJsIiwicGFyc2VJZCIsIl91c2VyIiwiYmVjb21lIiwiY29udHJhY3RVc2VyRGV0YWlscyIsImhhbmRsZUNsb3NlT3RwIiwiaGFuZGxlRG93bmxvYWRCdG4iLCJoYW5kbGVEZWNsaW5lTXNzZyIsImJhY2tlbmQiLCJwb2ludGVyRXZlbnRzIiwic2hvd051bWJlciIsInNob3dOYXZpZ2F0aW9uIiwic2hvd05hdmlnYXRpb25OdW1iZXIiLCJzaG93IiwiaGVhZE1zZyIsImJvZHlNc3NnIiwiZm9vdGVyTWVzc2FnZSIsImlzRG93bmxvYWRCdG4iLCJwcmV2IiwicmVkdWNlV2lkdGgiLCJpc01lbnUiLCJ1c2VyT2JqZWN0SWQiLCJjaGlsZHJlbiIsInRleHRjb2xvciIsInRoZW1lIiwiQ3VzdG9tTW9kYWwiLCJzZXRSZWFzb24iLCJ2aWRlbyIsInNldElzQ2hlY2siLCJoYW5kbGVDaGVjayIsImFsbG93IiwiYWxsb3dGdWxsU2NyZWVuIiwiY3JlYXRlU2xpY2UiLCJzaG93VGVuYW50U2xpY2UiLCJpbml0aWFsU3RhdGUiLCJyZWR1Y2VycyIsInNob3dUZW5hbnQiLCJhY3Rpb24iLCJwYXlsb2FkIiwiYWN0aW9ucyIsInJlZHVjZXIiLCJ0b3VyU3RlcFNsaWNlIiwic2F2ZVRvdXJTdGVwcyIsInJlbW92ZVRvdXJTdGVwcyIsImluZm9TbGljZSIsImZldGNoQXBwSW5mbyIsInJlbW92ZUl0ZW0iLCJzaG93SGVhZGVyU2xpY2UiLCJjb25maWd1cmVTdG9yZSIsImluZm9SZWR1Y2VyIiwiU2hvd1RlbmFudCIsIlRvdXJTdGVwc1JlZHVjZXIiLCJzdG9yZSIsIlRvdXJTdGVwcyIsImluaXRSZWFjdEkxOG5leHQiLCJMYW5ndWFnZURldGVjdG9yIiwiZW4iLCJmciIsInVzZSIsImluaXQiLCJyZXNvdXJjZXMiLCJ0cmFuc2xhdGlvbiIsImZhbGxiYWNrTG5nIiwiZGV0ZWN0aW9uIiwib3JkZXIiLCJkZWJ1ZyIsImludGVycG9sYXRpb24iLCJlc2NhcGVWYWx1ZSIsIndoaXRlbGlzdCIsIlJlYWN0RE9NIiwicGRmanMiLCJQcm92aWRlciIsIkdsb2JhbFdvcmtlck9wdGlvbnMiLCJ3b3JrZXJTcmMiLCJ2ZXJzaW9uIiwiUHVibGljU2NyaXB0RmlsZVdyYXBwZXIiLCJpbml0aWFsUHJvcHMiLCJzZXRQcm9wcyIsInVwZGF0ZVB1YmxpY1RlbXBsYXRlUHJvcHMiLCJpbml0aWFsaXplIiwic2VydmVyVVJMIiwic2NyaXB0Q29tcG9uZW50IiwibGluayIsImhlYWQiLCJ0YWlsd2luZENzc0xpbmsiLCJyb290IiwiY3JlYXRlUm9vdCIsInJlbmRlciJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLXRlbXBsYXRlLmJ1bmRsZS5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7O0FDVnVDOztBQUV2QztBQUNBLGlnSUFBaWdJOztBQUVqZ0ksaUNBQWlDLDREQUFPO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWtDOzs7Ozs7Ozs7Ozs7Ozs7O0FDZmxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU4Qjs7Ozs7Ozs7Ozs7Ozs7OztBQ1I5QjtBQUNBO0FBQ0EsMEtBQTBLLE1BQU07QUFDaEw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIsTUFBTTtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxPQUFPO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5QixpQ0FBaUM7QUFDMUQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsVUFBVTtBQUN4Qzs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLFVBQVU7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsVUFBVTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7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QTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxtRUFBVztBQUNyQjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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VUFBVTtBQUNyRDtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTs7QUFFQSxTQUFTLFVBQVU7O0FBRW5CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwwQkFBMEI7O0FBRTFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHdFQUF3RTtBQUN4RTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsU0FBUztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGdCQUFnQixpQkFBaUI7QUFDakM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELEVBQUU7QUFDckQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjs7QUFFQTtBQUNBLHlCQUF5QjtBQUN6QixNQUFNO0FBQ04sOEJBQThCO0FBQzlCLE1BQU07OztBQUdOO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLDJCQUEyQixlQUFlO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQSwyQkFBMkIsUUFBUTtBQUNuQzs7QUFFQSx3QkFBd0IsZUFBZTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixNQUFNO0FBQ047QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNERBQTREO0FBQzVELE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLFNBQVM7QUFDakM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLFNBQVM7QUFDakM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCx3QkFBd0IsU0FBUztBQUNqQztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25COztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsS0FBSyxJQUFJOztBQUUzQjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1FQUFtRTs7QUFFbkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQ0FBb0MsT0FBTztBQUMzQztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtR0FBbUc7O0FBRW5HO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvS0FBb0ssaUVBQWlFLEVBQUU7QUFDdk8sR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUxBQW1MLGlFQUFpRSxFQUFFO0FBQ3RQLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNI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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxzR0FBc0c7O0FBRXRHLGtCQUFrQixv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QUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsb0RBQW9ELFdBQVc7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLDJCQUEyQixhQUFhO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsV0FBVztBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsV0FBVztBQUNyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSw2Q0FBNkMsV0FBVztBQUN4RDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkNBQTZDLFdBQVc7QUFDeEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDZDQUE2QyxXQUFXO0FBQ3hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLG9CQUFvQixvQkFBb0I7QUFDeEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4RUFBOEUsYUFBYTtBQUMzRjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7O0FBRXhFLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5R0FBeUc7QUFDekc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUk7OztBQUdKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osSUFBSTtBQUNKLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0osaUNBQWlDO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNEJBQTRCOztBQUU1QjtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0JBQWdCLGNBQWM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQSxhQUFhOztBQUViLDBCQUEwQixRQUFRO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKLDBCQUEwQixRQUFRO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBLHNCQUFzQixnQkFBZ0I7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVELGdEQUFnRCxXQUFXLG1FQUFtRSxxRkFBcUYsNEJBQTRCLGNBQWMsU0FBUyxpQ0FBaUMsZ0tBQWdLLDBCQUEwQjs7QUFFamUsb0RBQW9ELGdCQUFnQixrRUFBa0Usd0RBQXdELDZEQUE2RCxzREFBc0Q7O0FBRWpULHlDQUF5Qyx1REFBdUQsdUNBQXVDLFNBQVMsT0FBTyxvQkFBb0I7O0FBRTNLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3RUFBd0UsNEJBQTRCO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSyxHQUFHOztBQUVSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxpRkFBaUYsOEJBQThCO0FBQy9HO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtFQUErRSw4QkFBOEI7QUFDN0c7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsaUZBQWlGLDhCQUE4QjtBQUMvRztBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsNEVBQTRFLDhCQUE4QjtBQUMxRztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRCxnREFBZ0QsMERBQTBELDJDQUEyQzs7QUFFcko7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELHFFQUFxRTtBQUNyRTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNELDBFQUEwRTtBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxrREFBa0QsMERBQTBELDJDQUEyQztBQUN2Sjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQyxJQUFJO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELDRDQUE0QyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVEOztBQUUvUCw4REFBOEQsc0VBQXNFLDhEQUE4RDs7QUFFbE07QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0IsMkJBQTJCO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDLEdBQUc7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUMsR0FBRztBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRCxrRkFBa0Y7O0FBRWxGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0gsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELGtEQUFrRCwwREFBMEQsMkNBQTJDOztBQUV2SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0Q7O0FBRS9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVELDhDQUE4QyxnQkFBZ0Isa0JBQWtCLE9BQU8sMkJBQTJCLHdEQUF3RCxnQ0FBZ0MsdURBQXVEOztBQUVqUSxnRUFBZ0Usd0VBQXdFLGdFQUFnRTs7QUFFeE07QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQsZ0RBQWdELFdBQVcsbUVBQW1FLHFGQUFxRiw0QkFBNEIsY0FBYyxTQUFTLGlDQUFpQyxnS0FBZ0ssMEJBQTBCOztBQUVqZSxvREFBb0QsZ0JBQWdCLGtFQUFrRSx3REFBd0QsNkRBQTZELHNEQUFzRDs7QUFFalQseUNBQXlDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjtBQUMzSztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3RUFBd0UsNEJBQTRCO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5Q0FBeUM7O0FBRXpDO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1QkFBdUI7QUFDekM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsZ0RBQWdELFdBQVcsbUVBQW1FLHFGQUFxRiw0QkFBNEIsY0FBYyxTQUFTLGlDQUFpQyxnS0FBZ0ssMEJBQTBCOztBQUVqZSxvREFBb0QsZ0JBQWdCLGtFQUFrRSx3REFBd0QsNkRBQTZELHNEQUFzRDs7QUFFalQseUNBQXlDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLG9CQUFvQjs7QUFFM0ssOENBQThDLGdCQUFnQixrQkFBa0IsT0FBTywyQkFBMkIsd0RBQXdELGdDQUFnQyx1REFBdUQ7O0FBRWpRLGdFQUFnRSx3RUFBd0UsZ0VBQWdFO0FBQ3hNO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSx3QkFBd0I7O0FBRXhCO0FBQ0EsK0VBQStFLDRCQUE0QjtBQUMzRztBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUZBQXVGLDhCQUE4QjtBQUNySDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSx1RkFBdUYsOEJBQThCO0FBQ3JIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIsNEJBQTRCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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NkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osd0NBQXdDLGFBQWE7OztBQUdyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxRkFBcUYsNEJBQTRCO0FBQ2pIO0FBQ0Esc0NBQXNDOztBQUV0Qyx1RkFBdUYsOEJBQThCO0FBQ3JIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3RkFBd0YsOEJBQThCO0FBQ3RIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7O0FBRXZEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNGQUFzRixnQ0FBZ0M7QUFDdEg7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFOztBQUVoRTtBQUNBLHdFQUF3RTs7QUFFeEUsMkZBQTJGLGdDQUFnQztBQUMzSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrR0FBa0csZ0NBQWdDO0FBQ2xJOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxzR0FBc0csZ0NBQWdDO0FBQ3RJOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdGQUFnRixnQ0FBZ0M7QUFDaEg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdGQUFnRixnQ0FBZ0M7QUFDaEg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FB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SjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0MsZUFBZTtBQUMvQzs7QUFFQSxrQ0FBa0Msd0JBQXdCO0FBQzFEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkMsU0FBUztBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBOztBQUVBLHdDQUF3QyxVQUFVO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9DQUFvQyxVQUFVO0FBQzlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsMEJBQTBCO0FBQzlDOztBQUVBLHNCQUFzQixtQkFBbUI7QUFDekM7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUZBQXFGLDRCQUE0QjtBQUNqSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDJGQUEyRiw4QkFBOEI7QUFDekg7QUFDQTs7QUFFQSx3QkFBd0IsMkJBQTJCO0FBQ25EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrREFBa0Q7O0FBRWxEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVELGdEQUFnRCxXQUFXLG1FQUFtRSxxRkFBcUYsNEJBQTRCLGNBQWMsU0FBUyxpQ0FBaUMsZ0tBQWdLLDBCQUEwQjs7QUFFamUsb0RBQW9ELGdCQUFnQixrRUFBa0Usd0RBQXdELDZEQUE2RCxzREFBc0Q7O0FBRWpULHlDQUF5Qyx1REFBdUQsdUNBQXVDLFNBQVMsT0FBTyxvQkFBb0I7QUFDM0s7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBLDhFQUE4RSw0QkFBNEI7QUFDMUc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7O0FBRUEsY0FBYyxnQkFBZ0I7QUFDOUI7QUFDQTtBQUNBOzs7QUFHQSwyQkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGNBQWMsUUFBUTtBQUN0QjtBQUNBOztBQUVBLGNBQWMsU0FBUztBQUN2QjtBQUNBOztBQUVBLGNBQWMsT0FBTztBQUNyQjtBQUNBOztBQUVBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7OztBQUdBLGNBQWMsT0FBTztBQUNyQjtBQUNBOztBQUVBOztBQUVBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7OztBQUdBLGNBQWMsU0FBUztBQUN2QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsdUJBQXVCLFFBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTs7O0FBR0EsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsZ0JBQWdCLG1CQUFtQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpREFBaUQsUUFBUTtBQUN6RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxpREFBaUQsUUFBUTtBQUN6RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHFCQUFxQixtQkFBbUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsR0FBRztBQUN0QjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLDhFQUE4RTtBQUM5RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0RBQWtELDBEQUEwRCwyQ0FBMkM7O0FBRXZKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixXQUFXO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixRQUFRO0FBQzlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLFFBQVE7QUFDOUI7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUNBQXlDLGFBQWE7QUFDdEQ7QUFDQTtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5COztBQUVBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCOztBQUU1QjtBQUNBLDhCQUE4QjtBQUM5Qjs7QUFFQSwyQ0FBMkMsVUFBVTtBQUNyRDtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUIsNEJBQTRCO0FBQy9DO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUEsZ0JBQWdCLGtCQUFrQjtBQUNsQztBQUNBO0FBQ0E7OztBQUdBLG1CQUFtQiw0QkFBNEI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBLDBCQUEwQixrQkFBa0I7QUFDNUMsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBLHNDQUFzQyxtQkFBbUI7QUFDekQsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7O0FBRUEsa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGNBQWMsU0FBUztBQUN2QjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxpSUFBaUksUUFBUSxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsVUFBVSxZQUFZLFdBQVcsVUFBVSxLQUFLLEtBQUssWUFBWSxXQUFXLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLE1BQU0sTUFBTSxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxZQUFZLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxPQUFPLFVBQVUsWUFBWSxXQUFXLE9BQU8sT0FBTyxVQUFVLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsV0FBVyxZQUFZLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxNQUFNLEtBQUssVUFBVSxLQUFLLEtBQUssVUFBVSxLQUFLLEtBQUssVUFBVSxLQUFLLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLE1BQU0sS0FBSyxVQUFVLEtBQUssS0FBSyxVQUFVLEtBQUssS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxVQUFVLEtBQUssS0FBSyxVQUFVLEtBQUssS0FBSyxZQUFZLFdBQVcsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxZQUFZLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsTUFBTSxLQUFLLFVBQVUsWUFBWSxNQUFNLE1BQU0sWUFBWSxXQUFXLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxhQUFhLE1BQU0sS0FBSyxVQUFVLEtBQUssTUFBTSxZQUFZLFdBQVcsS0FBSyxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLFdBQVcsS0FBSyxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLEtBQUssS0FBSyxZQUFZLGFBQWEsYUFBYSxNQUFNLEtBQUssVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLE1BQU0sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLFlBQVksTUFBTSxLQUFLLFVBQVUsWUFBWSxhQUFhLE1BQU0sS0FBSyxVQUFVLFlBQVksTUFBTSxLQUFLLFlBQVksV0FBVyxZQUFZLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxVQUFVLEtBQUssS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLE1BQU0sS0FBSyxVQUFVLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxLQUFLLFlBQVksYUFBYSxXQUFXLEtBQUssS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLGFBQWEsV0FBVyxLQUFLLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sT0FBTyxVQUFVLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxPQUFPLFFBQVEsVUFBVSxNQUFNLFFBQVEsWUFBWSxhQUFhLE1BQU0sUUFBUSxZQUFZLE1BQU0sUUFBUSxZQUFZLGFBQWEsV0FBVyxLQUFLLFFBQVEsWUFBWSxNQUFNLFFBQVEsVUFBVSxNQUFNLFFBQVEsVUFBVSxLQUFLLFFBQVEsWUFBWSxhQUFhLGFBQWEsV0FBVyxLQUFLLFFBQVEsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxXQUFXLFlBQVksTUFBTSxRQUFRLFlBQVksTUFBTSxRQUFRLFlBQVksV0FBVyxLQUFLLGNBQWMsWUFBWSxhQUFhLFdBQVcsS0FBSyxjQUFjLFlBQVksTUFBTSxRQUFRLFlBQVksYUFBYSxhQUFhLE1BQU0sUUFBUSxZQUFZLE1BQU0sb0JBQW9CLGFBQWEsTUFBTSxtQ0FBbUMsYUFBYSxXQUFXLEtBQUssUUFBUSxVQUFVLFVBQVUsS0FBSyxRQUFRLFlBQVksTUFBTSxRQUFRLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxLQUFLLEtBQUssWUFBWSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxPQUFPLFlBQVksYUFBYSxhQUFhLE1BQU0sT0FBTyxVQUFVLE1BQU0sVUFBVSxZQUFZLE1BQU0sT0FBTyxZQUFZLFdBQVcsVUFBVSxNQUFNLE9BQU8sWUFBWSxhQUFhLFdBQVcsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsTUFBTSxPQUFPLFVBQVUsTUFBTSxPQUFPLFVBQVUsWUFBWSxPQUFPLE9BQU8sWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLE1BQU0sT0FBTyxZQUFZLGFBQWEsTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLFlBQVksTUFBTSxPQUFPLFlBQVksTUFBTSxPQUFPLFlBQVksTUFBTSxPQUFPLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsV0FBVyxVQUFVLFVBQVUsWUFBWSxhQUFhLE1BQU0sS0FBSyxVQUFVLFlBQVksV0FBVyxZQUFZLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxXQUFXLEtBQUssS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxXQUFXLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxVQUFVLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksTUFBTSxPQUFPLFVBQVUsWUFBWSxNQUFNLEtBQUssT0FBTyxVQUFVLFlBQVksTUFBTSxLQUFLLE1BQU0sWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLE1BQU0sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLFVBQVUsWUFBWSxXQUFXLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksNkNBQTZDLG9NQUFvTSx1QkFBdUIsd0JBQXdCLDhCQUE4QixrQkFBa0IsbUJBQW1CLGdCQUFnQix1QkFBdUIsYUFBYSxlQUFlLEdBQUcsNkJBQTZCLDBCQUEwQixlQUFlLGNBQWMsR0FBRyx1QkFBdUIsa0VBQWtFLHNCQUFzQiwyQkFBMkIsZ0JBQWdCLDhCQUE4QiwwQkFBMEIsMEJBQTBCLHVCQUF1Qix5QkFBeUIsR0FBRyxvRUFBb0UsbUJBQW1CLEdBQUcsbUhBQW1ILHNDQUFzQyx1Q0FBdUMsR0FBRyw4QkFBOEIsZUFBZSxtQkFBbUIsR0FBRyx3REFBd0Qsb0JBQW9CLEdBQUcsZ0ZBQWdGLGtCQUFrQixtQkFBbUIsR0FBRyw2RUFBNkUsZUFBZSxnQkFBZ0IsR0FBRywrQkFBK0IsdUJBQXVCLDhCQUE4QixxQ0FBcUMsbUNBQW1DLG1CQUFtQix1QkFBdUIsR0FBRyxtQ0FBbUMsd0JBQXdCLHNCQUFzQix1QkFBdUIsR0FBRyw4RUFBOEUsOEJBQThCLEdBQUcsNkVBQTZFLG9DQUFvQyxHQUFHLCtVQUErVSwwQkFBMEIsbUJBQW1CLEdBQUcsdUdBQXVHLGtCQUFrQixnQkFBZ0Isc0JBQXNCLHdCQUF3QixHQUFHLHdDQUF3QyxlQUFlLGNBQWMsR0FBRyxvQ0FBb0MsNEJBQTRCLHdCQUF3QixxQkFBcUIsR0FBRyxtQ0FBbUMsd0JBQXdCLHFCQUFxQixrQkFBa0IsNEJBQTRCLHVCQUF1QixvQkFBb0IsdUJBQXVCLGFBQWEsZUFBZSxpQkFBaUIsZUFBZSxpQkFBaUIsZ0JBQWdCLHdCQUF3QixxQkFBcUIsR0FBRywyQ0FBMkMsY0FBYyxHQUFHLHVDQUF1QyxlQUFlLEdBQUcsOEdBQThHLGdCQUFnQixHQUFHLHdDQUF3Qyx1QkFBdUIsV0FBVyxtQkFBbUIsc0JBQXNCLHVCQUF1QixHQUFHLGlEQUFpRCxhQUFhLEdBQUcsaURBQWlELGNBQWMsR0FBRyxpREFBaUQsMEJBQTBCLEdBQUcsd0NBQXdDLHVCQUF1QixjQUFjLG9CQUFvQixhQUFhLEdBQUcsNENBQTRDLGVBQWUsR0FBRyxvREFBb0QsNkJBQTZCLGVBQWUsR0FBRyxnREFBZ0QsZ0JBQWdCLEdBQUcsd0RBQXdELDhCQUE4QixnQkFBZ0IsR0FBRyx3Q0FBd0MsZ0JBQWdCLEdBQUcsNkJBQTZCLG1CQUFtQix1QkFBdUIsR0FBRyxtQ0FBbUMsa0JBQWtCLG9CQUFvQixxQkFBcUIsR0FBRyx3REFBd0QsMEJBQTBCLGdCQUFnQixnQkFBZ0IsR0FBRyw4QkFBOEIsbUJBQW1CLHVCQUF1QixHQUFHLHFIQUFxSCwwQkFBMEIsZ0JBQWdCLGdCQUFnQixHQUFHLDZDQUE2QyxnQkFBZ0IsZ0JBQWdCLGdCQUFnQiw0QkFBNEIscUJBQXFCLEdBQUcsMkVBQTJFLDBCQUEwQixHQUFHLG1GQUFtRiwwQkFBMEIsR0FBRyxpSEFBaUgsMEJBQTBCLHNCQUFzQixHQUFHLHVIQUF1SCxnQkFBZ0IsR0FBRyx5VEFBeVQsNkJBQTZCLGNBQWMsR0FBRyxrSUFBa0ksK0JBQStCLEdBQUcscUhBQXFILHFCQUFxQiwwQkFBMEIsR0FBRyx1Q0FBdUMsaUJBQWlCLG1DQUFtQyxnQkFBZ0IsR0FBRyx3REFBd0Qsb0JBQW9CLDhCQUE4QiwwQkFBMEIsdUJBQXVCLGlCQUFpQixXQUFXLEdBQUcsNkRBQTZELHVCQUF1QixzQkFBc0IsdUNBQXVDLEdBQUcseUZBQXlGLGdCQUFnQix1QkFBdUIsbUJBQW1CLHVCQUF1Qix1Q0FBdUMsR0FBRyx3SEFBd0gscUJBQXFCLGNBQWMscUNBQXFDLHVCQUF1QixxQkFBcUIsb0JBQW9CLGdCQUFnQiw0QkFBNEIsR0FBRyw0SkFBNEosaUJBQWlCLHNCQUFzQix3QkFBd0IsR0FBRyxrS0FBa0ssb0JBQW9CLDhCQUE4QixHQUFHLHNLQUFzSyw4QkFBOEIsaUJBQWlCLHNCQUFzQixHQUFHLDRLQUE0Syw4QkFBOEIsR0FBRyxzS0FBc0ssZ0JBQWdCLEdBQUcsNEtBQTRLLG9CQUFvQixrQ0FBa0MsR0FBRyxvQ0FBb0MsZ0JBQWdCLDBCQUEwQixrQkFBa0Isd0JBQXdCLHVCQUF1QixxQkFBcUIsR0FBRywyRUFBMkUsb0JBQW9CLEdBQUcsbUxBQW1MLDBCQUEwQiw4QkFBOEIsR0FBRyw0Q0FBNEMsMEJBQTBCLDhCQUE4QixnQkFBZ0IsR0FBRyxrREFBa0QsOEJBQThCLEdBQUcscURBQXFELDBCQUEwQiw4QkFBOEIsZ0JBQWdCLEdBQUcsMkRBQTJELDhCQUE4QixHQUFHLGtDQUFrQyx3QkFBd0Isd0JBQXdCLEdBQUcsNkJBQTZCLHdCQUF3QixHQUFHLHlGQUF5RixnQkFBZ0IsMEJBQTBCLGtCQUFrQix3QkFBd0IsdUJBQXVCLHFCQUFxQixHQUFHLDZIQUE2SCxvQkFBb0IsR0FBRyxtSkFBbUosMEJBQTBCLDhCQUE4QixHQUFHLHVKQUF1SixzQkFBc0IsR0FBRywrS0FBK0ssMEJBQTBCLDhCQUE4QixnQkFBZ0IsR0FBRyx1TUFBdU0sOEJBQThCLEdBQUcsbU5BQW1OLG1CQUFtQixHQUFHLG1OQUFtTixpQkFBaUIsR0FBRyxtS0FBbUssdUJBQXVCLDBCQUEwQiw4QkFBOEIsZ0JBQWdCLEdBQUcsdU1BQXVNLHVCQUF1QixpQkFBaUIsY0FBYyxnQ0FBZ0MsMkJBQTJCLGdCQUFnQixpQkFBaUIsdUJBQXVCLHdCQUF3Qix1QkFBdUIsZUFBZSx3REFBd0QsR0FBRywyTEFBMkwsOEJBQThCLEdBQUcsK05BQStOLHdCQUF3QixlQUFlLEdBQUcsNmdCQUE2Z0IsMEJBQTBCLDhCQUE4QixnQkFBZ0IsR0FBRyxxbEJBQXFsQiw4QkFBOEIsR0FBRyx1TUFBdU0sMEJBQTBCLDhCQUE4Qix3QkFBd0IsR0FBRywrTkFBK04sOEJBQThCLEdBQUcsKzFCQUErMUIsOENBQThDLEdBQUcsd3ZFQUF3dkUsOEJBQThCLGdCQUFnQixHQUFHLG1LQUFtSyxvQkFBb0IsZ0JBQWdCLEdBQUcsMkxBQTJMLGtDQUFrQyxHQUFHLHVNQUF1TSx1QkFBdUIsZ0JBQWdCLGNBQWMsZ0NBQWdDLDJCQUEyQixnQkFBZ0IsaUJBQWlCLHVCQUF1Qix3QkFBd0IsdUJBQXVCLGVBQWUsd0RBQXdELEdBQUcsd0NBQXdDLHVCQUF1QiwwQkFBMEIsZ0JBQWdCLEdBQUcsdUVBQXVFLHVCQUF1QixvQkFBb0IsNEJBQTRCLEdBQUcsaURBQWlELCtCQUErQixHQUFHLHNIQUFzSCxrQ0FBa0MsMEJBQTBCLHVCQUF1QixHQUFHLHNJQUFzSSxvQkFBb0IsR0FBRyxraUJBQWtpQiw4QkFBOEIsR0FBRyx3SkFBd0osOEJBQThCLGlCQUFpQixXQUFXLEdBQUcsbUhBQW1ILDhCQUE4Qix1QkFBdUIsZUFBZSxjQUFjLGNBQWMsZUFBZSx1QkFBdUIsMEJBQTBCLDhCQUE4QixHQUFHLG1JQUFtSSxvQkFBb0IsR0FBRyxxSkFBcUosa0JBQWtCLHVCQUF1QixHQUFHLDZHQUE2RyxzQkFBc0IsZ0JBQWdCLG1CQUFtQixzQkFBc0IsdUJBQXVCLEdBQUcscUpBQXFKLG1DQUFtQyxvQ0FBb0MsR0FBRyxrSkFBa0osOEJBQThCLDJCQUEyQiwwQkFBMEIsc0JBQXNCLHNDQUFzQyx1Q0FBdUMsR0FBRyw2SEFBNkgsMkJBQTJCLEdBQUcsdVFBQXVRLGlDQUFpQyxHQUFHLHVRQUF1USw4QkFBOEIsR0FBRyx5SUFBeUksdUJBQXVCLGVBQWUsR0FBRyxtQ0FBbUMsb0JBQW9CLGtDQUFrQyxjQUFjLGVBQWUsdUJBQXVCLHVCQUF1QixXQUFXLGFBQWEsaUJBQWlCLHdCQUF3QiwyQkFBMkIsR0FBRyx3Q0FBd0Msb0JBQW9CLDhCQUE4QixnQkFBZ0IsdUJBQXVCLGlCQUFpQixnQkFBZ0IsaUJBQWlCLG9CQUFvQixtQkFBbUIsdUJBQXVCLHdCQUF3QiwyQkFBMkIsbUJBQW1CLEdBQUcsMkNBQTJDLG9CQUFvQixHQUFHLGtEQUFrRCxvQkFBb0IsMkJBQTJCLEdBQUcscUNBQXFDLHdCQUF3QixrQ0FBa0Msb0JBQW9CLHVCQUF1QixzQkFBc0IsbUJBQW1CLGdCQUFnQixHQUFHLCtCQUErQixvQkFBb0IsaUJBQWlCLGtCQUFrQix5Q0FBeUMsWUFBWSxXQUFXLDRCQUE0Qix3QkFBd0Isa0JBQWtCLHdCQUF3QixHQUFHLHFLQUFxSyxnQkFBZ0Isc0JBQXNCLEdBQUcsa0RBQWtELDJLQUEySyxrQkFBa0Isd0JBQXdCLEtBQUssR0FBRyx5SEFBeUgsdUJBQXVCLEdBQUcsMkNBQTJDLG1CQUFtQixtQkFBbUIsMEJBQTBCLHlCQUF5QixpQkFBaUIsR0FBRyxrQ0FBa0MsdUJBQXVCLHlCQUF5QixjQUFjLGdCQUFnQixpQkFBaUIscUJBQXFCLGVBQWUsZUFBZSx3QkFBd0IsR0FBRyxzQ0FBc0MsZUFBZSxnQkFBZ0IsNkJBQTZCLEdBQUcscUJBQXFCO0FBQzF0NkI7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3h3QnZDO0FBQzBHO0FBQ2pCO0FBQ087QUFDaEcsNENBQTRDLHFsREFBeXhCO0FBQ3IwQiw0Q0FBNEMsaW5EQUF1eUI7QUFDbjFCLDRDQUE0QyxxZ0JBQWlQO0FBQzdSLDhCQUE4QixtRkFBMkIsQ0FBQyw0RkFBcUM7QUFDL0YseUNBQXlDLHNGQUErQjtBQUN4RSx5Q0FBeUMsc0ZBQStCO0FBQ3hFLHlDQUF5QyxzRkFBK0I7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLG1CQUFtQjtBQUNuQix1QkFBdUI7QUFDdkIseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLGtDQUFrQztBQUNsQyxlQUFlO0FBQ2YsbUlBQW1JO0FBQ25JLGlDQUFpQztBQUNqQyxtQ0FBbUM7QUFDbkMsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiLHdCQUF3QjtBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiLGtCQUFrQjtBQUNsQix5QkFBeUI7QUFDekI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtSEFBbUg7QUFDbkgsaUNBQWlDO0FBQ2pDLG1DQUFtQztBQUNuQyxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCO0FBQ2xCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCLGtDQUFrQztBQUNsQyxvQ0FBb0M7QUFDcEMsbUJBQW1CO0FBQ25CLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEIsMkJBQTJCO0FBQzNCLGtCQUFrQjtBQUNsQixhQUFhO0FBQ2IsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QixpQ0FBaUM7QUFDakMsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQyx3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhCQUE4QjtBQUM5QixpQkFBaUI7QUFDakI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkLGtCQUFrQjtBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQiwwQkFBMEI7QUFDMUI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixtQ0FBbUM7QUFDL0QsNEJBQTRCLG1DQUFtQztBQUMvRDtBQUNBO0FBQ0EsNEJBQTRCLG1DQUFtQztBQUMvRCw0QkFBNEIsbUNBQW1DO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLGdCQUFnQixtQ0FBbUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLE9BQU8saUZBQWlGLFlBQVksTUFBTSxPQUFPLHFCQUFxQixvQkFBb0IscUJBQXFCLHFCQUFxQixNQUFNLE1BQU0sV0FBVyxNQUFNLFlBQVksTUFBTSxNQUFNLHFCQUFxQiwrQkFBK0Isb0JBQW9CLHFCQUFxQixxQkFBcUIscUJBQXFCLHFCQUFxQixNQUFNLE9BQU8sTUFBTSxLQUFLLG9CQUFvQixxQkFBcUIsTUFBTSxRQUFRLE1BQU0sS0FBSyxvQkFBb0Isb0JBQW9CLHFCQUFxQixNQUFNLE1BQU0sTUFBTSxLQUFLLFdBQVcsV0FBVyxNQUFNLE1BQU0sTUFBTSxVQUFVLFdBQVcsV0FBVyxNQUFNLE1BQU0sTUFBTSxLQUFLLFVBQVUsV0FBVyxNQUFNLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxTQUFTLE1BQU0sUUFBUSxxQkFBcUIscUJBQXFCLHFCQUFxQixvQkFBb0IsTUFBTSxNQUFNLE1BQU0sS0FBSyxVQUFVLE1BQU0sTUFBTSxNQUFNLE1BQU0sVUFBVSxVQUFVLFdBQVcsV0FBVyxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLFFBQVEsTUFBTSxLQUFLLG9CQUFvQixxQkFBcUIscUJBQXFCLE1BQU0sUUFBUSxNQUFNLFNBQVMscUJBQXFCLHFCQUFxQixxQkFBcUIsb0JBQW9CLHFCQUFxQixxQkFBcUIscUJBQXFCLG9CQUFvQixvQkFBb0Isb0JBQW9CLE1BQU0sTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE9BQU8sTUFBTSxRQUFRLHFCQUFxQixxQkFBcUIscUJBQXFCLE1BQU0sTUFBTSxNQUFNLEtBQUssVUFBVSxNQUFNLE1BQU0sTUFBTSxLQUFLLFdBQVcsTUFBTSxNQUFNLE1BQU0sS0FBSyxXQUFXLE1BQU0sTUFBTSxNQUFNLE1BQU0sVUFBVSxNQUFNLE9BQU8sTUFBTSxLQUFLLHFCQUFxQixxQkFBcUIsTUFBTSxNQUFNLE1BQU0sS0FBSyxXQUFXLE1BQU0sT0FBTyxNQUFNLEtBQUsscUJBQXFCLG9CQUFvQixNQUFNLE1BQU0sTUFBTSxLQUFLLFdBQVcsTUFBTSxNQUFNLE1BQU0saUJBQWlCLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLE9BQU8sV0FBVyxVQUFVLFVBQVUsTUFBTSxNQUFNLEtBQUssS0FBSyxVQUFVLE1BQU0sTUFBTSxNQUFNLEtBQUssV0FBVyxNQUFNLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixvQkFBb0IsTUFBTSxNQUFNLE1BQU0sTUFBTSxVQUFVLE1BQU0sTUFBTSxLQUFLLEtBQUssVUFBVSxNQUFNLFFBQVEsTUFBTSxZQUFZLG9CQUFvQixxQkFBcUIsTUFBTSxNQUFNLE1BQU0sTUFBTSxVQUFVLFVBQVUsTUFBTSxXQUFXLEtBQUssVUFBVSxNQUFNLE1BQU0sV0FBVyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLE1BQU0sTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLEtBQUssS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLEtBQUssV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLE1BQU0sS0FBSyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLEtBQUssTUFBTSxLQUFLLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxLQUFLLE1BQU0sS0FBSyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsVUFBVSxXQUFXLFdBQVcsV0FBVyxXQUFXLFVBQVUsV0FBVyxVQUFVLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsS0FBSyxLQUFLLEtBQUssS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLEtBQUssS0FBSyxNQUFNLEtBQUssTUFBTSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sS0FBSyxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sT0FBTyxZQUFZLGFBQWEsYUFBYSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLFlBQVksTUFBTSxNQUFNLEtBQUssTUFBTSxZQUFZLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxLQUFLLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE9BQU8sV0FBVyxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLFFBQVEsWUFBWSxNQUFNLE1BQU0sT0FBTyxLQUFLLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxPQUFPLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxNQUFNLE1BQU0sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxPQUFPLEtBQUssS0FBSyxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxPQUFPLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLE1BQU0sUUFBUSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxPQUFPLEtBQUssWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE9BQU8sTUFBTSxXQUFXLGFBQWEsTUFBTSxPQUFPLE9BQU8sS0FBSyxLQUFLLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxNQUFNLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxZQUFZLFlBQVksWUFBWSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFdBQVcsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxZQUFZLFlBQVksYUFBYSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsWUFBWSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxTQUFTLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxNQUFNLE9BQU8sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLFFBQVEsS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU8sS0FBSyxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLFlBQVksWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxPQUFPLFFBQVEsTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxPQUFPLFlBQVksTUFBTSxNQUFNLE9BQU8sS0FBSyxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE1BQU0sS0FBSyxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLFFBQVEsWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGdCQUFnQixNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxRQUFRLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLFFBQVEsV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxTQUFTLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sU0FBUyxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFdBQVcsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxPQUFPLE1BQU0sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxZQUFZLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxZQUFZLFlBQVksYUFBYSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxZQUFZLFlBQVksYUFBYSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsWUFBWSxZQUFZLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQU0sU0FBUyxZQUFZLFlBQVksWUFBWSxNQUFNLE1BQU0sT0FBTyxLQUFLLEtBQUssTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sT0FBTyxLQUFLLE1BQU0sT0FBTyxNQUFNLE1BQU0sT0FBTyxNQUFNLE1BQU0sTUFBTSxLQUFLLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsWUFBWSxNQUFNLE1BQU0sUUFBUSxZQUFZLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE9BQU8sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLFlBQVksYUFBYSxNQUFNLE9BQU8sYUFBYSxhQUFhLFdBQVcsTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sU0FBUyxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLFFBQVEsWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxRQUFRLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sUUFBUSxZQUFZLE1BQU0sTUFBTSxPQUFPLEtBQUssWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sTUFBTSxLQUFLLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE9BQU8sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLFFBQVEsTUFBTSxNQUFNLE9BQU8sTUFBTSxNQUFNLEtBQUssTUFBTSxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLFlBQVksT0FBTyxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sT0FBTyxZQUFZLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsYUFBYSxhQUFhLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxhQUFhLGFBQWEsWUFBWSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxXQUFXLGFBQWEsTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFdBQVcsTUFBTSxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sV0FBVyxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxhQUFhLE1BQU0sTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sWUFBWSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNLFlBQVksTUFBTSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxNQUFNLE1BQU0sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxPQUFPLFlBQVksTUFBTSxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxXQUFXLE1BQU0sS0FBSyxLQUFLLFlBQVksTUFBTSxNQUFNLFlBQVksTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sV0FBVyxLQUFLLE1BQU0sS0FBSyxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLGFBQWEsTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxhQUFhLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLFlBQVksTUFBTSxVQUFVLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxPQUFPLEtBQUssV0FBVyxhQUFhLGFBQWEsYUFBYSxNQUFNLE9BQU8sTUFBTSxXQUFXLGFBQWEsYUFBYSxhQUFhLE1BQU0sT0FBTyxNQUFNLFdBQVcsWUFBWSxNQUFNLE9BQU8sTUFBTSxXQUFXLFlBQVksTUFBTSxPQUFPLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sV0FBVyxZQUFZLGFBQWEsTUFBTSxNQUFNLE1BQU0sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxhQUFhLGFBQWEsTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sWUFBWSxhQUFhLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksYUFBYSxNQUFNLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sWUFBWSxNQUFNLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLE1BQU0sT0FBTyxNQUFNLFlBQVksTUFBTSxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sS0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxnR0FBZ0csWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLE1BQU0sT0FBTyxXQUFXLE1BQU0sUUFBUSxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLE1BQU0sS0FBSyxZQUFZLGFBQWEsT0FBTyxRQUFRLFlBQVksYUFBYSxPQUFPLFFBQVEsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLFdBQVcsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLE1BQU0sS0FBSyxVQUFVLFlBQVksUUFBUSxLQUFLLFlBQVksYUFBYSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxVQUFVLFlBQVksV0FBVyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxPQUFPLFlBQVksTUFBTSxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksV0FBVyxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLFdBQVcsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxXQUFXLFlBQVksT0FBTyxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxNQUFNLE1BQU0sS0FBSyxLQUFLLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLE1BQU0sTUFBTSxLQUFLLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksTUFBTSxNQUFNLEtBQUssS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxNQUFNLE1BQU0sS0FBSyxLQUFLLFVBQVUsS0FBSyxNQUFNLEtBQUssS0FBSyxVQUFVLEtBQUssc0VBQXNFLDJDQUEyQyw0Q0FBNEMsd0RBQXdELHVCQUF1Qiw4QkFBOEIseUJBQXlCLHVCQUF1QixtQkFBbUIsc0hBQXNILGtCQUFrQixLQUFLLDRHQUE0RyxzQkFBc0IscUJBQXFCLDhCQUE4Qix5QkFBeUIsb0JBQW9CLDBCQUEwQixtQkFBbUIscUJBQXFCLHlCQUF5Qix5QkFBeUIsd0JBQXdCLG9CQUFvQixLQUFLLHFEQUFxRCw2QkFBNkIsOEJBQThCLEtBQUssd0tBQXdLLDRCQUE0QiwrQkFBK0IsS0FBSyxvTEFBb0wsZ0NBQWdDLDhCQUE4QixLQUFLLDJCQUEyQix5QkFBeUIsc0JBQXNCLHdCQUF3Qiw2QkFBNkIsS0FBSyxtQ0FBbUMseUJBQXlCLGNBQWMsa0JBQWtCLDJCQUEyQiwwQkFBMEIsOEJBQThCLEtBQUssb0JBQW9CLHdCQUF3Qix5QkFBeUIsNkJBQTZCLEtBQUsseUNBQXlDLG1CQUFtQixLQUFLLG9DQUFvQyw0QkFBNEIsS0FBSyx3QkFBd0IsdUJBQXVCLEtBQUssd0JBQXdCLHFCQUFxQixrQkFBa0IsNkJBQTZCLGtCQUFrQix1QkFBdUIscUJBQXFCLDBCQUEwQiwwQkFBMEIsb0NBQW9DLGdCQUFnQixzQkFBc0IsS0FBSyw4QkFBOEIsZ0NBQWdDLDhCQUE4QixLQUFLLGdCQUFnQix1QkFBdUIsS0FBSyxjQUFjLHNCQUFzQix1QkFBdUIsS0FBSyxzQkFBc0Isa0NBQWtDLHFDQUFxQyxnQkFBZ0IsK0NBQStDLEtBQUssdUJBQXVCLHlCQUF5QixhQUFhLGVBQWUsNkJBQTZCLGtCQUFrQixtQkFBbUIsb0JBQW9CLDhCQUE4QiwwQkFBMEIseUJBQXlCLCtDQUErQyxLQUFLLHlCQUF5QixzQkFBc0IsS0FBSyxvREFBb0QsZ0NBQWdDLGtCQUFrQixLQUFLLHNCQUFzQixnQ0FBZ0Msa0JBQWtCLEtBQUssbUJBQW1CLGdDQUFnQyxrQkFBa0IsS0FBSyxrQkFBa0IsZ0NBQWdDLGtCQUFrQixLQUFLLGdCQUFnQixnQ0FBZ0Msa0JBQWtCLEtBQUssbUJBQW1CLHdCQUF3QixrQkFBa0Isb0JBQW9CLDBCQUEwQiw4QkFBOEIsc0JBQXNCLEtBQUsscUJBQXFCLHFEQUFxRCx1Q0FBdUMseUJBQXlCLEtBQUssbUJBQW1CLDRCQUE0QixtQkFBbUIsMEJBQTBCLGtDQUFrQyw4QkFBOEIsc0JBQXNCLHlCQUF5Qix1QkFBdUIsS0FBSyxXQUFXLGlCQUFpQixLQUFLLDJCQUEyQix5QkFBeUIsd0JBQXdCLG1CQUFtQiw4QkFBOEIscUhBQXFILGdDQUFnQywrREFBK0Qsc0NBQXNDLHlCQUF5QiwwQkFBMEIsS0FBSyw4Q0FBOEMsdUNBQXVDLEtBQUssZ0RBQWdELHVDQUF1QyxLQUFLLGlEQUFpRCxxQ0FBcUMsS0FBSywrQ0FBK0Msd0NBQXdDLEtBQUsseUJBQXlCLGtCQUFrQixLQUFLLG1DQUFtQyxVQUFVLG1CQUFtQixtQ0FBbUMsT0FBTyxnQkFBZ0IsbUJBQW1CLGlDQUFpQyxPQUFPLEtBQUssc0NBQXNDLFVBQVUsbUJBQW1CLG9DQUFvQyxPQUFPLGdCQUFnQixtQkFBbUIsaUNBQWlDLE9BQU8sS0FBSyxxQ0FBcUMsVUFBVSxtQkFBbUIsb0NBQW9DLE9BQU8sZ0JBQWdCLG1CQUFtQixpQ0FBaUMsT0FBTyxLQUFLLHFDQUFxQyxVQUFVLG1CQUFtQixtQ0FBbUMsT0FBTyxnQkFBZ0IsbUJBQW1CLGlDQUFpQyxPQUFPLEtBQUssMERBQTBELGFBQWEscUJBQXFCLE9BQU8sS0FBSyw4Q0FBOEMsYUFBYSxxQkFBcUIsT0FBTyxLQUFLLHVCQUF1QjtBQUM5NlA7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoVHZDO0FBQzZHO0FBQ2pCO0FBQzVGLDhCQUE4QixtRkFBMkIsQ0FBQyw0RkFBcUM7QUFDL0Ysc0hBQXNIO0FBQ3RILDRIQUE0SDtBQUM1SCxnSUFBZ0k7QUFDaEksZ0lBQWdJO0FBQ2hJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVELG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLDJGQUEyRixZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksV0FBVyxVQUFVLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLFdBQVcsVUFBVSxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLE1BQU0sT0FBTyxhQUFhLFdBQVcsWUFBWSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsTUFBTSxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sTUFBTSxZQUFZLE9BQU8sTUFBTSxZQUFZLE9BQU8sTUFBTSxZQUFZLE9BQU8sTUFBTSxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsVUFBVSxZQUFZLFdBQVcsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxZQUFZLFdBQVcsVUFBVSxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sT0FBTyxP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OztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQSxrQ0FBa0MsUUFBUTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLHVDQUF1QyxRQUFRO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTLHlCQUF5QjtBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4REFBOEQsWUFBWTtBQUMxRTtBQUNBLDhEQUE4RCxZQUFZO0FBQzFFO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsWUFBWTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoZkEsaUVBQWUscUJBQXVCLDREQUE0RDs7Ozs7Ozs7OztBQ0FsRywrR0FBZSxHQUFHLElBQXFDLENBQUMsaUNBQU8sRUFBRSxvQ0FBQyxDQUFDO0FBQUE7QUFBQTtBQUFBLGtHQUFDLENBQUMsS0FBSyxFQUE2RSxDQUFDLGtCQUFrQixhQUFhLGdCQUFnQiwrQkFBK0IsV0FBVyw0RkFBNEYsV0FBVyxrRUFBa0UsNERBQTRELFlBQVksSUFBSSxrQkFBa0IseUJBQXlCLDBEQUEwRCxrQkFBa0Isc0JBQXNCLHlDQUF5QyxVQUFVLGNBQWMseUJBQXlCLG9CQUFvQixJQUFJLFNBQVMsVUFBVSxvQ0FBb0MsY0FBYyxJQUFJLHlDQUF5QyxTQUFTLDBDQUEwQywwRkFBMEYsMkhBQTJILHFCQUFNLEVBQUUscUJBQU0sVUFBVSxxQkFBTSxDQUFDLHFCQUFNLHdNQUF3TSw4REFBOEQsdURBQXVELGlOQUFpTiwwQkFBMEIsNEJBQTRCLEtBQUssS0FBSyxnREFBZ0QsbUZBQW1GLHNCQUFzQixLQUFLLGtDQUFrQyxpREFBaUQsS0FBSyxHQUFHLG1CQUFtQiw4SEFBOEgsb0lBQW9JLGlEQUFpRCxxQkFBcUIsdUJBQXVCLGVBQWUsMEJBQTBCLEdBQUcsd0JBQXdCLHlDQUF5QyxvQkFBb0IsS0FBSyxnREFBZ0QsNERBQTRELHFCQUFxQixPQUFPLEVBQUUsb0JBQW9CLEtBQTBCLHFCQUFxQjs7QUFFaHBGOzs7Ozs7Ozs7Ozs7Ozs7QUNGTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWEE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckJxQztBQUNlO0FBQ1Q7QUFDVTtBQUM1RCxxREFBcUQ7QUFDckQ7QUFDQSxtQkFBbUIscURBQU8sNERBQTRELDJDQUEyQztBQUNqSTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDTztBQUNQO0FBQ0Esb0NBQW9DLGdCQUFnQix5RUFBZ0IsQ0FBQyxzREFBUTtBQUM3RTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHdFQUFtQjtBQUM5QixlQUFlLHlEQUFRO0FBQ3ZCLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQjBDO0FBQ0U7QUFDSjtBQUNvQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxtQkFBbUI7QUFDL0Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDTztBQUNQLGlDQUFpQztBQUNqQyx3QkFBd0IseUVBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxxREFBTyx3Q0FBd0MsbURBQVcsZ0NBQWdDLE9BQU8seURBQVEsd0JBQXdCO0FBQzVJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwQitDO0FBQ007QUFDTTtBQUNUO0FBQ0M7QUFDUztBQUNSO0FBQzRCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyx3Q0FBd0M7QUFDakY7QUFDQSwwQ0FBMEMseUJBQXlCLFNBQVMsZ0RBQVM7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asd0JBQXdCLHlFQUFnQixDQUFDLHFEQUFPLGtDQUFrQyxzREFBUTtBQUMxRixrQkFBa0Isd0VBQW1CLGlCQUFpQixrREFBVztBQUNqRSx1QkFBdUIsb0VBQWtCO0FBQ3pDO0FBQ0EsdUJBQXVCLGtFQUFpQjtBQUN4QztBQUNBO0FBQ0EsZUFBZSxzREFBVztBQUMxQixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGtFQUFpQjtBQUN0QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsZ0JBQWdCLGlEQUFRO0FBQ3hCLGtCQUFrQiw4Q0FBUztBQUMzQjtBQUNBO0FBQ0EsUUFBUSxnRUFBYSw4QkFBOEIseUVBQXVCO0FBQzFFLFlBQVksZ0VBQWEsZ0NBQWdDLHlFQUF1QjtBQUNoRjtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6RTJEO0FBQ1Q7QUFDSztBQUNKO0FBQ0Y7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHlCQUF5QjtBQUNsQztBQUNPO0FBQ1Asa0JBQWtCLHdFQUFtQixpQkFBaUIsa0RBQVc7QUFDakUsdUJBQXVCLG9FQUFrQjtBQUN6QyxxQkFBcUIsZ0VBQWUsQ0FBQyw4REFBYTtBQUNsRCx3QkFBd0IsOERBQWE7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGtEQUFPO0FBQzFCLFNBQVM7QUFDVCxLQUFLO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pCcUM7QUFDTztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHdDQUF3QztBQUM5RCxTQUFTLG1CQUFtQjtBQUM1QjtBQUNPO0FBQ1AsOEJBQThCO0FBQzlCLG9CQUFvQix5REFBVztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxRQUFRLGtEQUFPO0FBQ2Y7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2Q29EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxxQkFBcUI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixpRUFBZ0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsMEJBQTBCO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekZxQztBQUM0QztBQUN6QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsV0FBVztBQUN4QjtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixxREFBTztBQUN4Qix3Q0FBd0MsUUFBUSx5REFBUSxtQkFBbUI7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGlFQUFnQjtBQUMxQixVQUFVLGtFQUFpQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGlFQUFnQixDQUFDLHFEQUFPO0FBQ2xDLFVBQVUsa0VBQWlCLENBQUMscURBQU87QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0RBQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0I7QUFDTztBQUNQLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QjtBQUNPO0FBQ1AsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGtEQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QjtBQUNPO0FBQ1AsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0I7QUFDTztBQUNQLDhCQUE4QjtBQUM5QjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pIb0Q7QUFDRDtBQUNkO0FBQzlCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrREFBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixpRUFBWTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixnRUFBYTtBQUN2Qyx5QkFBeUIsZ0VBQWE7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckZrQztBQUMrQztBQUNwQztBQUN1QjtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxXQUFXLCtDQUFPO0FBQ2xCLGtDQUFrQyxPQUFPLG9EQUFlLDBCQUEwQjtBQUNsRixrQ0FBa0MsT0FBTyxtREFBYyxTQUFTO0FBQ2hFO0FBQ087QUFDUCw0QkFBNEI7QUFDNUIsV0FBVywrQ0FBTyxpQ0FBaUMsT0FBTyw2REFBd0IsZ0JBQWdCO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHlCQUF5QjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsV0FBVywwREFBZSxpQkFBaUIsd0RBQWE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHdCQUF3QjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsV0FBVywwREFBZSxpQkFBaUIsd0RBQWE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCwyQkFBMkIsa0VBQXVCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwrQ0FBTztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUUyRDtBQUNoQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0IsNEJBQTRCLE9BQU87QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QywrQkFBK0I7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxnQkFBZ0IsK0NBQU87QUFDdkI7QUFDQSw2Q0FBNkMsbURBQVc7QUFDeEQ7QUFDQSwyQkFBMkIsK0NBQU8sdURBQXVELG1EQUFXLDJDQUEyQyxzREFBYztBQUM3SjtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqREE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ08sNkJBQTZCO0FBQzdCLDhCQUE4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1hZO0FBQ0g7QUFDWjtBQUNsQztBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsK0NBQVU7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsd0JBQXdCLDhEQUFtQjtBQUMzQztBQUNBLGVBQWUsMkRBQWM7QUFDN0I7QUFDQSxXQUFXLDJEQUFjLENBQUMsOERBQW1CO0FBQzdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxQnNDO0FBQ3RDO0FBQ0E7QUFDQSxnQkFBZ0IsK0NBQWM7QUFDOUIsZ0NBQWdDLCtCQUErQjtBQUMvRCxnQ0FBZ0Msb0JBQW9CO0FBQ3BEO0FBQ087QUFDUCxRQUFRLG1EQUFjO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxvQ0FBb0MsaURBQWlEO0FBQ3JGO0FBQ0EsMENBQTBDLDZCQUE2QjtBQUN2RTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkI2QztBQUN0QztBQUNQO0FBQ0EsZUFBZSwwREFBVztBQUMxQjtBQUNBO0FBQ0E7QUFDTztBQUNQLHlCQUF5QiwwREFBVztBQUNwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsZ0RBQVMsZUFBZSw4Q0FBOEM7QUFDOUg7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQmtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTyw0Q0FBNEM7QUFDNUMsMkNBQTJDO0FBQzNDO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1Asc0NBQXNDLDBEQUFrQjtBQUN4RDtBQUNBO0FBQ08sZ0NBQWdDLFFBQVE7QUFDeEMsb0NBQW9DO0FBQ3BDLCtCQUErQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0RVk7QUFDWjtBQUNKO0FBQ2xDO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IscUJBQXFCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCx5QkFBeUIsK0NBQU87QUFDaEMsc0JBQXNCLCtDQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLG1EQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsaURBQWlELGtCQUFrQiwrREFBb0IsMkJBQTJCO0FBQ2xIOzs7Ozs7Ozs7Ozs7Ozs7O0FDMURPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1BrQztBQUMzQjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxXQUFXLCtDQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEU7QUFDMUU7QUFDQSxLQUFLO0FBQ0wsa0NBQWtDLCtDQUErQztBQUNqRjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZDMEM7QUFDUjtBQUNNO0FBQ3hDLHFCQUFxQixpREFBUztBQUM5QjtBQUNBO0FBQ0EsV0FBVywrQ0FBTztBQUNsQjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDJHQUEyRyxtREFBbUQ7QUFDOUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsK0NBQU8sOEVBQThFLHlCQUF5QjtBQUM1SDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCx5REFBeUQsa0RBQVU7QUFDbkUsV0FBVywrQ0FBTztBQUNsQiwrQkFBK0IsK0JBQStCO0FBQzlELHdDQUF3QywyQkFBMkI7QUFDbkU7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6Q0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDckJBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ25GQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUF3QztBQUNoRCxlQUFlLHNCQUFpQjtBQUNoQztBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ1phOztBQUViLGNBQWMsbUJBQU8sQ0FBQyx1RkFBVTs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQkFBb0IsaUJBQWlCO0FBQ3JDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7OztBQUliLElBQUksSUFBcUM7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEOztBQUVqRDtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7O0FBRWxEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQjtBQUNqQixzQkFBc0I7QUFDdEIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2QixlQUFlO0FBQ2Ysa0JBQWtCO0FBQ2xCLGdCQUFnQjtBQUNoQixZQUFZO0FBQ1osWUFBWTtBQUNaLGNBQWM7QUFDZCxnQkFBZ0I7QUFDaEIsa0JBQWtCO0FBQ2xCLGdCQUFnQjtBQUNoQixtQkFBbUI7QUFDbkIsd0JBQXdCO0FBQ3hCLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekIsaUJBQWlCO0FBQ2pCLG9CQUFvQjtBQUNwQixrQkFBa0I7QUFDbEIsY0FBYztBQUNkLGNBQWM7QUFDZCxnQkFBZ0I7QUFDaEIsa0JBQWtCO0FBQ2xCLG9CQUFvQjtBQUNwQixrQkFBa0I7QUFDbEIsMEJBQTBCO0FBQzFCLGNBQWM7QUFDZCxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7OztBQ3BMYTs7QUFFYixJQUFJLEtBQXFDLEVBQUUsRUFFMUMsQ0FBQztBQUNGLEVBQUUscUtBQXlEO0FBQzNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNONkIsMkRBQTJELGNBQWMsT0FBTywwQ0FBMEMsYUFBYSxrQ0FBa0Msb0JBQW9CLHNEQUFDLG1GQUFtRiwwQkFBMEIsT0FBTywrQ0FBK0MsK0JBQStCLHFCQUFxQix5QkFBeUIsMkJBQTJCLHFFQUFxRSxrRUFBa0UsU0FBUyx3RkFBd0YsZ0JBQWdCLGVBQWUsOEJBQThCLG9EQUFvRCxTQUFTLHVDQUF1QyxtQ0FBbUMsaUdBQWlHLHFEQUFxRCxPQUFPLG9CQUFvQixRQUFRLGlDQUFpQywwQkFBMEIsdUJBQXVCLHFCQUFxQixRQUFRLDhDQUE4QyxFQUFFLGlDQUFpQyxNQUFNLDhCQUE4QixLQUFLLCtFQUErRSxNQUFNLFdBQVcsdURBQXVELGtJQUFrSSxnREFBZ0Qsc0tBQXNLLHlCQUF5QixvREFBb0QsMkRBQTJELHNCQUFzQixHQUFHLElBQUksdUJBQXVCLDhCQUE4QixpQkFBaUIsT0FBTyxpRUFBZSxDQUFDLEVBQUM7QUFDdGlFOzs7Ozs7Ozs7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLHFCQUFNLGdCQUFnQixxQkFBTSxJQUFJLHFCQUFNLHNCQUFzQixxQkFBTTs7QUFFMUY7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUSxXQUFXO0FBQzlCLFdBQVcsU0FBUztBQUNwQjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLCtDQUErQyxpQkFBaUI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RLRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ2pFRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDckxEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNsRUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN2TUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDaEhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDeEpEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDakdEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzdERDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUMzSUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDaklEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxJQUFJO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdElEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ2xMRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUMxS0Q7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM5R0Q7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUMvTEQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDekVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQyxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM1R0Q7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUMvREQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN6RkQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0RkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDeEZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3BHRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLGdDQUFnQztBQUNoQywrQkFBK0I7QUFDL0IsK0JBQStCO0FBQy9CLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3BIRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDOUVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzFFRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDOUVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM5RUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDMUVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM5RUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzlFRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDOUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDOUVEO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0SEQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN4SEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN4SEQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN4SEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDeEZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDM0VEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDM0hEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdElEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDcEVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RIRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3JGRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FB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Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3hJRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0SUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3BJRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDOUpEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUN0RkQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtB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b0NBQW9DLEtBQUs7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUM5R0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3JORDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdEZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDckZEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDdEZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDOUVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDakVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxpQ0FBaUM7QUFDakMsY0FBYztBQUNkLGdDQUFnQztBQUNoQyxjQUFjO0FBQ2QsbUNBQW1DO0FBQ25DLGNBQWM7QUFDZCxtQ0FBbUM7QUFDbkMsY0FBYztBQUNkLGdDQUFnQztBQUNoQyxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzdJRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNsR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQzlFRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDL0hEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDM0VEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3JHRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNuRUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3RJRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNwSEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ25HRDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNoRUQ7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRCxHQUFHLEtBQ29DLFdBQVcsbUJBQU8sQ0FBQyxrREFBVztBQUNyRSxHQUFHLENBQ3NCO0FBQ3pCLENBQUMsNEJBQTRCOztBQUU3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FDaEVEO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVULG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDs7QUFFQSxDQUFDOzs7Ozs7Ozs7OztBQ3pIRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsR0FBRyxLQUNvQyxXQUFXLG1CQUFPLENBQUMsa0RBQVc7QUFDckUsR0FBRyxDQUNzQjtBQUN6QixDQUFDLDRCQUE0Qjs7QUFFN0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7O0FBRUEsQ0FBQzs7Ozs7Ozs7Ozs7QUNqTEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNELEdBQUcsS0FDb0MsV0FBVyxtQkFBTyxDQUFDLGtEQUFXO0FBQ3JFLEdBQUcsQ0FDc0I7QUFDekIsQ0FBQyw0QkFBNEI7O0FBRTdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBLENBQUM7Ozs7Ozs7Ozs7O0FD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0QsSUFBSSxLQUE0RDtBQUNoRSxJQUFJLENBQ3lCO0FBQzdCLENBQUMsc0JBQXNCOztBQUV2Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IseUJBQXlCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsWUFBWTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hELHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLElBQUk7QUFDeEI7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3R0FBd0csSUFBSSx3QkFBd0IsSUFBSSx1REFBdUQsSUFBSTtBQUNuTSxxRUFBcUUsSUFBSTtBQUN6RSw0QkFBNEI7QUFDNUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDLFlBQVk7QUFDdkQ7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFlBQVk7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNENBQTRDLElBQUk7O0FBRWhEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixrQ0FBa0M7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLEVBQUU7QUFDdkIscUJBQXFCLEVBQUU7QUFDdkIsMEJBQTBCLEVBQUU7QUFDNUI7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLElBQUk7QUFDNUIsd0JBQXdCLElBQUk7QUFDNUIsNkJBQTZCLElBQUk7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsSUFBSTtBQUM1QztBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsTUFBTSx3RUFBd0UsTUFBTSxtQkFBbUIsTUFBTSxxQkFBcUIsTUFBTSxFQUFFLElBQUk7QUFDaks7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixPQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsT0FBTztBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLCtCQUErQjtBQUNuRDtBQUNBOztBQUVBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxtQ0FBbUMsaUJBQWlCO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDRHQUE0RztBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxzQkFBc0I7QUFDMUQ7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msc0JBQXNCO0FBQzFEO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQyxPQUFPO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxPQUFPO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLE9BQU87QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxPQUFPO0FBQzVDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsbUJBQW1CO0FBQ3pDO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLENBQUM7Ozs7Ozs7Ozs7OztBQ3ZqTEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLHNCQUFzQjtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsb0JBQW9CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN6RkE7QUFDYTs7QUFFYixnQkFBZ0IsaUdBQW9DOztBQUVwRCxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBZTtBQUN2QyxnQkFBZ0IsbUJBQU8sQ0FBQyx5REFBZTtBQUN2QyxnQkFBZ0IsbUJBQU8sQ0FBQyx1RUFBc0I7O0FBRTlDOztBQUVBOztBQUVBOzs7Ozs7Ozs7Ozs7QUNiYTs7O0FBR2IsbUJBQW1CLG1CQUFPLENBQUMsK0RBQWdCO0FBQzNDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFnQjtBQUMzQyxtQkFBbUIsbUJBQU8sQ0FBQyxpRUFBaUI7QUFDNUMsbUJBQW1CLG1CQUFPLENBQUMsaUVBQWlCO0FBQzVDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFnQjs7QUFFM0M7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsU0FBUztBQUM3QztBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxlQUFlOztBQUVsQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEIsd0JBQXdCO0FBQ3hCLHdCQUF3Qjs7QUFFeEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQjs7QUFFcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esc0JBQXNCOztBQUV0QjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLGVBQWU7QUFDZixlQUFlO0FBQ2Ysa0JBQWtCO0FBQ2xCLFlBQVk7Ozs7Ozs7Ozs7OztBQy9ZQzs7O0FBR2IsbUJBQW1CLG1CQUFPLENBQUMsK0RBQWdCO0FBQzNDLG1CQUFtQixtQkFBTyxDQUFDLCtEQUFnQjtBQUMzQyxtQkFBbUIsbUJBQU8sQ0FBQyxpRUFBaUI7QUFDNUMsbUJBQW1CLG1CQUFPLENBQUMsbUVBQWtCO0FBQzdDLG1CQUFtQixtQkFBTyxDQUFDLGlFQUFpQjtBQUM1QyxtQkFBbUIsbUJBQU8sQ0FBQywrREFBZ0I7QUFDM0MsbUJBQW1CLG1CQUFPLENBQUMsaUVBQWlCOztBQUU1Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsU0FBUztBQUM3QztBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsZUFBZTs7QUFFbEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCO0FBQ3hCLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEIsd0JBQXdCOztBQUV4QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwREFBMEQ7O0FBRTFEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCOztBQUVBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxlQUFlO0FBQ2YsZUFBZTtBQUNmLGtCQUFrQjtBQUNsQixj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QUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLDZCQUE2QjtBQUM3Qiw0QkFBNEI7QUFDNUIsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQjtBQUNqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUM7QUFDdkM7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLG9FQUFvRTtBQUNwRTtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DO0FBQ25DO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1EQUFtRDtBQUNuRDtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLG9FQUFvRTtBQUNwRTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDO0FBQ3JDO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1EQUFtRDtBQUNuRDtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLGtDQUFrQztBQUNsQztBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRkFBaUY7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBOEQ7QUFDOUQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQjtBQUNwQixxQkFBcUI7QUFDckIsd0JBQXdCO0FBQ3hCLG1CQUFtQjtBQUNuQixvQkFBb0I7QUFDcEIsZUFBZTtBQUNmLGtCQUFrQjtBQUNsQix3QkFBd0I7QUFDeEIsNEJBQTRCO0FBQzVCLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuaERhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVksbUJBQU8sQ0FBQyxnRUFBaUI7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQiw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLGlDQUFpQztBQUNqQyw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLDZCQUE2QjtBQUM3QixrQ0FBa0M7QUFDbEMsNkJBQTZCO0FBQzdCLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFDekIseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekIsd0JBQXdCO0FBQ3hCLHVCQUF1QjtBQUN2QjtBQUNBLHFCQUFxQjtBQUNyQiw4QkFBOEI7QUFDOUIsNENBQTRDLGtCQUFrQjtBQUM5RCwyQ0FBMkMsbUJBQW1CO0FBQzlEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0EsZ0JBQWdCLGFBQWE7QUFDN0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0JBQXNCLFVBQVU7QUFDaEMsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDLHdDQUF3Qyw2QkFBNkI7QUFDckUsMENBQTBDO0FBQzFDLDJDQUEyQztBQUMzQzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxnQkFBZ0IsV0FBVztBQUMzQiw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQixnQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLG9DQUFvQztBQUNwQzs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCLGVBQWU7QUFDL0I7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQixhQUFhO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCOztBQUVBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUksMEJBQTBCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsbUNBQW1DO0FBQ25DLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDZCQUE2QjtBQUM3Qiw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdFZhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQy9CYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsZ0VBQWlCOztBQUVyQztBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjs7QUFFQTs7O0FBR0EscUJBQXFCLHNCQUFzQixxQkFBcUI7O0FBRWhFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBLG9DQUFvQztBQUNwQyxvQ0FBb0M7QUFDcEMsb0NBQW9DO0FBQ3BDLG9DQUFvQztBQUNwQyxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLGdDQUFnQztBQUNoQyxnQ0FBZ0M7QUFDaEMsZ0NBQWdDO0FBQ2hDOzs7O0FBSUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QixzQkFBc0I7QUFDdEIsc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QixzQkFBc0I7O0FBRXRCLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7O0FBRWhELDJCQUEyQixlQUFlO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLFlBQVk7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixZQUFZO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakMsaUNBQWlDO0FBQ2pDO0FBQ0EsMkNBQTJDO0FBQzNDLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsNkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxlQUFlO0FBQzlCO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCLGdCQUFnQjtBQUNoQixnQkFBZ0I7QUFDaEIsZ0JBQWdCO0FBQ2hCLGdCQUFnQjtBQUNoQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLHlCQUF5QjtBQUMxQztBQUNBLGdCQUFnQiw4QkFBOEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsV0FBVztBQUM1QjtBQUNBLGdCQUFnQiw4QkFBOEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsU0FBUyxnQkFBZ0I7QUFDekI7QUFDQSxnQkFBZ0Isb0NBQW9DO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLGFBQWE7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLGNBQWMsY0FBYyxPQUFPO0FBQ25DLGNBQWMsY0FBYyxPQUFPO0FBQ25DLGNBQWMsY0FBYyxPQUFPOztBQUVuQztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCLDRCQUE0QjtBQUM1QjtBQUNBLHNCQUFzQjtBQUN0QixzQkFBc0I7QUFDdEIsc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QixzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixxQkFBcUI7QUFDckIscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsUUFBUSxPQUFPOztBQUV2RDtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrQkFBK0I7O0FBRS9CLDhCQUE4QjtBQUM5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTs7QUFFSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkI7QUFDQSw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLDZCQUE2Qjs7QUFFN0IseUNBQXlDOztBQUV6Qyw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7O0FBRWpELGNBQWMsZUFBZTtBQUM3QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOOztBQUVBLE1BQU07O0FBRU4sZ0NBQWdDO0FBQ2hDOztBQUVBLE1BQU07QUFDTjs7QUFFQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNO0FBQ047QUFDQTs7QUFFQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLDBCQUEwQjtBQUMxQjtBQUNBLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsNkJBQTZCOztBQUU3Qix5Q0FBeUM7O0FBRXpDLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsNkJBQTZCOztBQUU3QixnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYyxlQUFlO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxNQUFNO0FBQ04sV0FBVyxtQ0FBbUM7O0FBRTlDLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNO0FBQ047QUFDQTs7QUFFQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLGtCQUFrQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsK0JBQStCOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBLGlDQUFpQztBQUNqQyxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlDQUF5QztBQUN6Qzs7QUFFQSx5Q0FBeUM7QUFDekM7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLElBQUksTUFBTSxHQUFHLE1BQU0sR0FBRztBQUNoRDtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUksS0FBSyxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxJQUFJLE1BQU0sSUFBSTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCO0FBQ0EsNERBQTREO0FBQzVELHdDQUF3QztBQUN4Qzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjtBQUNBLDhCQUE4QjtBQUM5Qiw4QkFBOEI7O0FBRTlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DOztBQUVuQyxJQUFJO0FBQ0o7QUFDQSw2Q0FBNkM7QUFDN0M7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUEsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdCQUFnQjtBQUNoQix3QkFBd0I7QUFDeEIsdUJBQXVCO0FBQ3ZCLGlCQUFpQjtBQUNqQixpQkFBaUI7Ozs7Ozs7Ozs7OztBQ3JzQ0o7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7QUM5Q0EsK0dBQWtEOzs7Ozs7Ozs7Ozs7QUNBckM7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGFBQWE7QUFDYiwwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxhQUFhO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN2RWE7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2Ysd0NBQXdDLG1CQUFPLENBQUMsa0VBQWE7QUFDN0QsbUNBQW1DLG1CQUFPLENBQUMsd0RBQVE7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFlBQVk7QUFDekI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QixhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDckhqQjs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkcsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0Qsb0JBQW9CO0FBQ3BCLG1CQUFtQjtBQUNuQixXQUFXO0FBQ1gsZ0JBQWdCO0FBQ2hCLG1DQUFtQyxtQkFBTyxDQUFDLDhIQUFtRDtBQUM5RixzQ0FBc0MsbUJBQU8sQ0FBQyxzSEFBK0M7QUFDN0YsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakUscUNBQXFDLG1CQUFPLENBQUMsNERBQVU7QUFDdkQscUNBQXFDLG1CQUFPLENBQUMsNERBQVU7QUFDdkQseUNBQXlDLG1CQUFPLENBQUMsb0VBQWM7QUFDL0QseUNBQXlDLG1CQUFPLENBQUMsb0VBQWM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsY0FBYztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN6SWE7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2Ysc0NBQXNDLG1CQUFPLENBQUMsMElBQXlEO0FBQ3ZHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsTUFBTSxpQkFBaUIsS0FBSztBQUNyRDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDalFqQjs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkcsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0Qsa0JBQWU7QUFDZix3Q0FBd0MsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDdEc7QUFDQTtBQUNBLE1BQU0sbUJBQU8sQ0FBQyxzREFBZTtBQUM3QixNQUFNLG1CQUFPLENBQUMsZ0VBQW9CO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDeEJqQjs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkc7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLG1GQUE4QjtBQUMvQyxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBZTs7Ozs7Ozs7Ozs7QUNsQmpCOztBQUViLDZCQUE2QixtQkFBTyxDQUFDLG9KQUE4RDtBQUNuRyw2QkFBNkIsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDM0Y7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBZTtBQUNmLHdDQUF3QyxtQkFBTyxDQUFDLG9JQUFzRDtBQUN0RyxxQ0FBcUMsbUJBQU8sQ0FBQyxzSUFBdUQ7QUFDcEcsd0NBQXdDLG1CQUFPLENBQUMsOElBQTJEO0FBQzNHLDJDQUEyQyxtQkFBTyxDQUFDLGdJQUFvRDtBQUN2RyxtQ0FBbUMsbUJBQU8sQ0FBQyxrSUFBcUQ7QUFDaEcsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakUseUNBQXlDLG1CQUFPLENBQUMsb0VBQWM7QUFDL0QsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakUseUNBQXlDLG1CQUFPLENBQUMsb0VBQWM7QUFDL0Qsc0NBQXNDLG1CQUFPLENBQUMsOERBQVc7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsYUFBYSxRQUFRLHFCQUFxQixrR0FBa0c7QUFDNUksZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGFBQWEsUUFBUSxxQkFBcUIsd0dBQXdHO0FBQ2xKLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGFBQWEsYUFBYTtBQUMxQixlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFlOzs7Ozs7Ozs7OztBQ3RXakI7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2Ysd0NBQXdDLG1CQUFPLENBQUMsa0VBQWE7QUFDN0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLGFBQWEsbUJBQW1CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlFQUF5RTtBQUN6RTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsMkVBQTJFO0FBQzNFO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QjtBQUNBLGFBQWEsbUJBQW1CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBZTs7Ozs7Ozs7Ozs7QUM5TmpCOztBQUViLDRCQUE0QixtQkFBTyxDQUFDLGtJQUFxRDtBQUN6Riw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkc7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBZTtBQUNmLGlCQUFpQixtQkFBTyxDQUFDLDJEQUFZO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBZTs7Ozs7Ozs7Ozs7QUMxQ2pCOztBQUViLDZCQUE2QixtQkFBTyxDQUFDLG9KQUE4RDtBQUNuRyw2QkFBNkIsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDM0Y7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBZTtBQUNmLHdDQUF3QyxtQkFBTyxDQUFDLG9JQUFzRDtBQUN0RywwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRSxzQ0FBc0MsbUJBQU8sQ0FBQyw4REFBVztBQUN6RCxnREFBZ0QsbUJBQU8sQ0FBQyxrRkFBcUI7QUFDN0UsbUNBQW1DLG1CQUFPLENBQUMsd0RBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWU7Ozs7Ozs7Ozs7O0FDakZqQjs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkcsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0Qsa0JBQWU7QUFDZixzQ0FBc0MsbUJBQU8sQ0FBQywwSUFBeUQ7QUFDdkcsa0NBQWtDLG1CQUFPLENBQUMsOEdBQTJDO0FBQ3JGLG1DQUFtQyxtQkFBTyxDQUFDLGtJQUFxRDtBQUNoRyx3Q0FBd0MsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDdEcsc0NBQXNDLG1CQUFPLENBQUMsMElBQXlEO0FBQ3ZHLHFDQUFxQyxtQkFBTyxDQUFDLHNJQUF1RDtBQUNwRywwQ0FBMEMsbUJBQU8sQ0FBQyw4SEFBbUQ7QUFDckcsbUNBQW1DLG1CQUFPLENBQUMsa0lBQXFEO0FBQ2hHLDhDQUE4QyxtQkFBTyxDQUFDLHNIQUErQztBQUNyRywwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRSwwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRSxvREFBb0QsbUJBQU8sQ0FBQywwRkFBeUI7QUFDckYsb0JBQW9CLG1CQUFPLENBQUMsd0VBQWdCO0FBQzVDLHlDQUF5QyxtQkFBTyxDQUFDLG9FQUFjO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxFQUFFO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksRUFBRTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEVBQUU7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZGQUE2RixhQUFhO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QixhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxxQkFBcUIsWUFBWTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsbUNBQW1DLEVBQUUsaUJBQWlCLEdBQUcsUUFBUTtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsMEJBQTBCLDRCQUE0QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsMEJBQTBCLDRCQUE0QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsMEJBQTBCLDRCQUE0QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLDBCQUEwQiw0QkFBNEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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Q0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLGdCQUFnQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHdFQUF3RSxhQUFhO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLDJFQUEyRSxlQUFlO0FBQzFGO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSx3RUFBd0U7QUFDeEUsd0NBQXdDO0FBQ3hDLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBZTs7Ozs7Ozs7Ozs7QUNwWmpCOztBQUViLDZCQUE2QixtQkFBTyxDQUFDLG9KQUE4RDtBQUNuRyw2QkFBNkIsbUJBQU8sQ0FBQyxvSUFBc0Q7QUFDM0Y7QUFDQTtBQUNBLENBQUM7QUFDRCxrQkFBZTtBQUNmLG1DQUFtQyxtQkFBTyxDQUFDLDhIQUFtRDtBQUM5Riw4Q0FBOEMsbUJBQU8sQ0FBQyxzSEFBK0M7QUFDckcsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHVCQUF1QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEIsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEIsY0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixLQUFLO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ04sNkJBQTZCLFVBQVU7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEIsY0FBYyxXQUFXO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QixjQUFjLFdBQVc7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixjQUFjLFdBQVc7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixjQUFjLFdBQVc7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLGNBQWMsV0FBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCLGNBQWMsV0FBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBZTs7Ozs7Ozs7Ozs7QUMvakJqQjs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkcsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0Qsa0JBQWU7QUFDZixzQ0FBc0MsbUJBQU8sQ0FBQyxzSEFBK0M7QUFDN0Ysd0NBQXdDLG1CQUFPLENBQUMsb0lBQXNEO0FBQ3RHLDhDQUE4QyxtQkFBTyxDQUFDLHNIQUErQztBQUNyRywwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRSxxQ0FBcUMsbUJBQU8sQ0FBQyw0REFBVTtBQUN2RCxxQ0FBcUMsbUJBQU8sQ0FBQyw0REFBVTtBQUN2RCxxQ0FBcUMsbUJBQU8sQ0FBQyw0REFBVTtBQUN2RCx5Q0FBeUMsbUJBQU8sQ0FBQyxvRUFBYztBQUMvRCxzQ0FBc0MsbUJBQU8sQ0FBQyw4REFBVztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFlOzs7Ozs7Ozs7OztBQ2pOakI7O0FBRWIsOEJBQThCLG1CQUFPLENBQUMsb0pBQThEO0FBQ3BHLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2Ysc0NBQXNDLG1CQUFPLENBQUMsMElBQXlEO0FBQ3ZHLDhDQUE4QyxtQkFBTyxDQUFDLG9KQUE4RDtBQUNwSCw4Q0FBOEMsbUJBQU8sQ0FBQyxzSEFBK0M7QUFDckcsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakU7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLGVBQWU7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FB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QUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixVQUFVO0FBQzFCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixR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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWEsZUFBZTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixvQkFBb0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBa0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVLEVBQUU7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVSxFQUFFO0FBQ1o7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLE9BQU87QUFDcEIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLG9CQUFvQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdGQUF3RixNQUFNO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSSxFQUFFO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJLEVBQUU7QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSSxFQUFFO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEseUJBQXlCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxlQUFlO0FBQ2Y7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsV0FBVztBQUN4QixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsV0FBVztBQUN4QixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxpQkFBaUI7QUFDOUIsYUFBYSxRQUFRO0FBQ3JCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsYUFBYTtBQUMxQixlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLGFBQWE7QUFDMUIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsZUFBZSxhQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNB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QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLFFBQVE7QUFDN0IsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQSxxQ0FBcUMsWUFBWTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEsYUFBYTtBQUNsQyxlQUFlLGNBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUSxhQUFhO0FBQ2xDLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRLGFBQWE7QUFDbEMsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVEs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QVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQSx3RUFBd0UsYUFBYTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQSwyRUFBMkUsZUFBZTtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQSwyRUFBMkUsZUFBZTtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQSwyRUFBMkUsZUFBZTtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxZQUFZO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxlQUFlO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRTtBQUN0RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0MsMkZBQTJGO0FBQzdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGtDQUFrQztBQUNsQztBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVGQUF1RjtBQUN2RjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrQkFBZTs7Ozs7Ozs7Ozs7QUNodUNqQjs7QUFFYiw2QkFBNkIsbUJBQU8sQ0FBQyxvSkFBOEQ7QUFDbkcsNkJBQTZCLG1CQUFPLENBQUMsb0lBQXNEO0FBQzNGO0FBQ0E7QUFDQSxDQUFDO0FBQ0QscUJBQXFCO0FBQ3JCLFlBQVk7QUFDWiwwQ0FBMEMsbUJBQU8sQ0FBQyxzRUFBZTtBQUNqRSx5Q0FBeUMsbUJBQU8sQ0FBQyxvRUFBYztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNyR2E7O0FBRWIsNkJBQTZCLG1CQUFPLENBQUMsb0pBQThEO0FBQ25HLDZCQUE2QixtQkFBTyxDQUFDLG9JQUFzRDtBQUMzRjtBQUNBO0FBQ0EsQ0FBQztBQUNELGtCQUFlO0FBQ2Ysc0NBQXNDLG1CQUFPLENBQUMsc0hBQStDO0FBQzdGLHdDQUF3QyxtQkFBTyxDQUFDLG9JQUFzRDtBQUN0Ryx1Q0FBdUMsbUJBQU8sQ0FBQywwSUFBeUQ7QUFDeEcsc0NBQXNDLG1CQUFPLENBQUMsMElBQXlEO0FBQ3ZHLHNDQUFzQyxtQkFBTyxDQUFDLDBJQUF5RDtBQUN2RywwQ0FBMEMsbUJBQU8sQ0FBQyw4SEFBbUQ7QUFDckcsbUNBQW1DLG1CQUFPLENBQUMsd0RBQVE7QUFDbkQsMENBQTBDLG1CQUFPLENBQUMsc0VBQWU7QUFDakUseUNBQXlDLG1CQUFPLENBQUMsb0VBQWM7QUFDL0Qsb0JBQW9CLG1CQUFPLENBQUMsd0VBQWdCO0FBQzVDLGtDQUFrQyxtQkFBTyxDQUFDLGtFQUFhO0FBQ3ZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsWUFBWTtBQUNaO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFRO0FBQ2hCLFFBQVEsaURBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBUTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGtEQUFlO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0Msa0RBQWU7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxrREFBZTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxrREFBZTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0RBQVEsaUJBQWlCLGdEQUFPO0FBQ3hDLFFBQVEsdUVBQTRCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyw0Q0FBRztBQUNuQztBQUNBLHNDQUFzQyw0Q0FBRztBQUN6QztBQUNBLGtDQUFrQyw0Q0FBRztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsbURBQU87QUFDbEY7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFdBQVc7QUFDM0Q7QUFDQSw0SEFBNEgsNENBQVM7QUFDckk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdEQUFRLGlCQUFpQixnREFBTztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxnREFBUSxpQkFBaUIsZ0RBQU87QUFDeEMsUUFBUSx5REFBaUI7QUFDekI7QUFDQSxnREFBZ0QsV0FBVztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRUFBK0UsMkVBQWlDO0FBQ2hILDBCQUEwQixpRUFBbUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxpREFBUTtBQUNWLGlFQUFlLFdBQVcsRUFBQztBQUMzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDamtCaUQ7QUFDUjtBQUNzQjtBQUM0QztBQUNxQztBQUN0RTtBQUNoQztBQUNlO0FBQ2xEO0FBQ1AsSUFBSSx5REFBaUI7QUFDckIsSUFBSSx5REFBaUI7QUFDckIsSUFBSSx5REFBaUI7QUFDckIsSUFBSSx5REFBaUI7QUFDckIsSUFBSSx5REFBaUI7QUFDckI7QUFDQTtBQUNBLElBQUkseURBQWlCO0FBQ3JCO0FBQ0E7QUFDQSxJQUFJLHlEQUFpQjtBQUNyQjtBQUNBO0FBQ0EsSUFBSSx5REFBaUI7QUFDckIsSUFBSSx5REFBaUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0RBQVEsMkJBQTJCLGtEQUFlO0FBQzFELFFBQVEsZ0RBQVEsZUFBZSx5Q0FBTTtBQUNyQyxRQUFRLGdEQUFRLGVBQWUsb0RBQVc7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxpREFBYztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxpREFBYztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxpREFBYztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsaURBQWM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsaURBQWM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsaURBQWM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsaURBQWM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsaURBQWM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsaURBQWM7QUFDL0M7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDREQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNERBQXlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLHFEQUFTO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzREFBYztBQUN0QjtBQUNBLHFCQUFxQixzREFBbUI7QUFDeEM7QUFDQSxtQkFBbUIsMkRBQWUsR0FBRywwQ0FBMEM7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQywwREFBaUI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGlCQUFpQjtBQUM5QztBQUNBLDhCQUE4QiwwREFBaUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGtEQUFlO0FBQ3hDLHlCQUF5QixrREFBZTtBQUN4Qyx5QkFBeUIsa0RBQWU7QUFDeEM7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLHdEQUFlO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsY0FBYztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsMERBQWM7QUFDckMscUJBQXFCLDBEQUFhLENBQUMsK0NBQVEsQ0FBQywrQ0FBUSxHQUFHLGdCQUFnQixvQkFBb0I7QUFDM0Ysa0JBQWtCLGlFQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1EQUFPO0FBQzNCLG1CQUFtQixtREFBTztBQUMxQixtQkFBbUIsbURBQU87QUFDMUI7QUFDQSwwQkFBMEIsa0RBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGtEQUFjO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHFEQUFjLFNBQVMsc0RBQVM7QUFDekQ7QUFDQSwwQkFBMEIsaUJBQWlCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBLDJCQUEyQiwwQ0FBTztBQUNsQztBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUVBQWUsUUFBUSxFQUFDO0FBQ3hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNVhpRDtBQUNSO0FBQ0w7QUFDSTtBQUNBO0FBQ0k7QUFDQTtBQUNGO0FBQ0E7QUFDa0Y7QUFDM0Y7QUFDZ0I7QUFDSDtBQUM2QztBQUMwSTtBQUNwSztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsMERBQWE7QUFDNUQ7QUFDQSxRQUFRLGlEQUFRLHlCQUF5QiwrQ0FBVztBQUNwRCxRQUFRLGlEQUFRLGVBQWUsb0RBQVc7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLDBDQUFLO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLDJDQUFPO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLDJDQUFPO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixLQUFLLElBQUksS0FBSztBQUN0QyxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFdBQVc7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBUTtBQUNoQjtBQUNBLCtDQUErQyxXQUFXO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxREFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFRO0FBQ2hCO0FBQ0EsNkJBQTZCLGtEQUFTO0FBQ3RDO0FBQ0Esa0JBQWtCLDZEQUF3QixPQUFPLGtEQUFTO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQVE7QUFDaEI7QUFDQSw2QkFBNkIsb0RBQVc7QUFDeEM7QUFDQSxrQkFBa0IsNkRBQXdCLE9BQU8sb0RBQVc7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFRO0FBQ2hCO0FBQ0EsNkJBQTZCLG9EQUFXO0FBQ3hDO0FBQ0Esa0JBQWtCLDZEQUF3QixPQUFPLG9EQUFXO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBUTtBQUNoQjtBQUNBLDZCQUE2QixzREFBYTtBQUMxQztBQUNBLGtCQUFrQiw2REFBd0IsT0FBTyxzREFBYTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQVE7QUFDaEI7QUFDQSw2QkFBNkIsc0RBQWE7QUFDMUM7QUFDQSxrQkFBa0IsNkRBQXdCLE9BQU8sc0RBQWE7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQVE7QUFDaEI7QUFDQSw2QkFBNkIscURBQVk7QUFDekM7QUFDQSxrQkFBa0IsNkRBQXdCLE9BQU8scURBQVk7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBUTtBQUNoQjtBQUNBLDZCQUE2QixxREFBWTtBQUN6QztBQUNBLGtCQUFrQiw2REFBd0IsT0FBTyxxREFBWTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFRO0FBQ2hCO0FBQ0E7QUFDQSxxQkFBcUIscURBQWlCO0FBQ3RDO0FBQ0E7QUFDQSxlQUFlLGtEQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQVE7QUFDaEI7QUFDQTtBQUNBLHVCQUF1QixtREFBZTtBQUN0QztBQUNBO0FBQ0EsZUFBZSxvREFBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFRO0FBQ2hCO0FBQ0E7QUFDQSx1QkFBdUIsbURBQWU7QUFDdEM7QUFDQTtBQUNBLGVBQWUsb0RBQVc7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpREFBUTtBQUNoQjtBQUNBO0FBQ0Esc0JBQXNCLGtEQUFjO0FBQ3BDO0FBQ0E7QUFDQSxlQUFlLHNEQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsTUFBTTtBQUMxRCxvREFBb0QsT0FBTztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlEQUFRO0FBQ2hCO0FBQ0E7QUFDQSwwQkFBMEIsc0RBQWtCO0FBQzVDO0FBQ0E7QUFDQSxlQUFlLHNEQUFhO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQVE7QUFDaEI7QUFDQTtBQUNBLG1CQUFtQiwrQ0FBVztBQUM5QjtBQUNBO0FBQ0EsZUFBZSxxREFBWTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFlBQVk7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsZUFBZTtBQUNsRTtBQUNBO0FBQ0EseURBQXlELGdCQUFnQjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHNEQUFjO0FBQzlDLG9CQUFvQiw4REFBaUI7QUFDckMsb0JBQW9CLHNEQUFTO0FBQzdCLG1CQUFtQiwyREFBYSxDQUFDLGdEQUFRLENBQUMsZ0RBQVEsR0FBRyxnQkFBZ0IsYUFBYTtBQUNsRixvQkFBb0IsdURBQVU7QUFDOUIsb0JBQW9CLDZEQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxTQUFTO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QywwQ0FBMEM7QUFDbEY7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHdCQUF3QjtBQUN6RDtBQUNBLGlDQUFpQywwQ0FBTTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSwwREFBaUIsaUJBQWlCLGdEQUFPO0FBQ2pEO0FBQ0E7QUFDQSwrQ0FBK0MsV0FBVztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSwwREFBaUIseUJBQXlCLDBDQUFNO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSwwREFBaUIseUJBQXlCLDBDQUFNO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSwwREFBaUIseUJBQXlCLDBDQUFNO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJELDJCQUEyQjtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMkNBQU87QUFDeEMsOEJBQThCLG9EQUFXLHFCQUFxQixzREFBYTtBQUMzRTtBQUNBLGlHQUFpRywyQ0FBTztBQUN4RywrQkFBK0IsMENBQU07QUFDckM7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDBDQUFNO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxXQUFXO0FBQ2hFO0FBQ0E7QUFDQSwwQkFBMEIsOERBQXlCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixzREFBa0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsK0NBQVc7QUFDbEQ7QUFDQSxjQUFjLDJEQUFtQjtBQUNqQywrQ0FBK0MsV0FBVztBQUMxRDtBQUNBO0FBQ0EscUNBQXFDLHNEQUFrQjtBQUN2RDtBQUNBLDBCQUEwQiw0REFBdUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGlFQUFlLE9BQU8sRUFBQztBQUN2QjtBQUNBLHlCQUF5QixxREFBaUI7QUFDMUMsZUFBZSxrREFBUztBQUN4Qix5QkFBeUIsbURBQWU7QUFDeEMsZUFBZSxvREFBVztBQUMxQix5QkFBeUIsbURBQWU7QUFDeEMsZUFBZSxvREFBVztBQUMxQix5QkFBeUIsa0RBQWM7QUFDdkMsZUFBZSxzREFBYTtBQUM1Qix5QkFBeUIsK0NBQVc7QUFDcEMsZUFBZSxxREFBWTtBQUMzQix5QkFBeUIsc0RBQWtCO0FBQzNDLGVBQWUsc0RBQWE7QUFDNUI7QUFDQSx5QkFBeUIsb0RBQWdCO0FBQ3pDLGVBQWUscURBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxXQUFXO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDJEQUFtQjtBQUNwQywyQ0FBMkMsV0FBVztBQUN0RDtBQUNBLHNCQUFzQiw0REFBdUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNudEJrQztBQUNEO0FBQ0E7QUFDb0M7QUFDcUI7QUFDMUQ7QUFDTztBQUNnRDtBQUNJO0FBQzNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0EsUUFBUSxnREFBUSwrQkFBK0IsaURBQWM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxXQUFXO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsV0FBVztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdEQUFRO0FBQ2hCO0FBQ0E7QUFDQSxnREFBZ0QsV0FBVztBQUMzRCxtQ0FBbUMsT0FBTywrQ0FBWTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFdBQVc7QUFDOUQsZ0NBQWdDLE9BQU8sK0NBQVk7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDLFFBQVEsZ0RBQVE7QUFDaEIsUUFBUSxnREFBUTtBQUNoQjtBQUNBO0FBQ0EsUUFBUSxzREFBYztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFdBQVc7QUFDOUQsMEJBQTBCLCtDQUFZO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsc0RBQWM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGtEQUFlO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxrREFBZTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxrREFBZTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0RBQVEsaUJBQWlCLGdEQUFPO0FBQ3hDLFFBQVEsdUVBQTRCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyw0Q0FBRztBQUNuQztBQUNBLHNDQUFzQyw0Q0FBRztBQUN6QztBQUNBLGtDQUFrQyw0Q0FBRztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsbURBQU87QUFDbEY7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFdBQVc7QUFDM0Q7QUFDQSw0SEFBNEgsNENBQVM7QUFDckk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdEQUFRLGlCQUFpQixnREFBTztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxnREFBUSxpQkFBaUIsZ0RBQU87QUFDeEMsUUFBUSx5REFBaUI7QUFDekI7QUFDQSxnREFBZ0QsV0FBVztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrRUFBK0UsNkVBQW1DO0FBQ2xILDBCQUEwQixpRUFBbUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDLGlEQUFRO0FBQ1YsaUVBQWUsYUFBYSxFQUFDO0FBQzdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hma0M7QUFDRDtBQUNvQztBQUNxQjtBQUMxRDtBQUNPO0FBQzJEO0FBQ3pCO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0EsUUFBUSxnREFBUTtBQUNoQixhQUFhLHFEQUFrQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsV0FBVztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsV0FBVztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwwQ0FBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxXQUFXO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsV0FBVztBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLG9EQUFvRCxXQUFXO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxnREFBUTtBQUNoQjtBQUNBLFFBQVEscURBQWE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsV0FBVztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsV0FBVztBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsMENBQU87QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsa0RBQWU7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQWU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsa0RBQWU7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxrREFBZTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGtEQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsbUJBQW1CO0FBQ3JFLHFEQUFxRCxvQkFBb0I7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0RBQVE7QUFDaEIsUUFBUSxnREFBUSxpQkFBaUIsZ0RBQU87QUFDeEMsUUFBUSx1RUFBNEI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUlBQW1JLDRDQUFHO0FBQ3RJLCtJQUErSSw0Q0FBRztBQUNsSix1SUFBdUksNENBQUc7QUFDMUk7QUFDQSw2SEFBNkgsbURBQU87QUFDcEk7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esc0VBQXNFLCtDQUFZO0FBQ2xGO0FBQ0Esa0NBQWtDLDBDQUFPO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFdBQVc7QUFDM0Q7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLDBDQUFPO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixxREFBcUQ7QUFDMUUsbUJBQW1CLHFEQUFxRDtBQUN4RTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx5REFBaUI7QUFDekI7QUFDQSxnREFBZ0QsV0FBVztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0VBQStFLDZFQUFtQztBQUNsSCwwQkFBMEIsaUVBQW1CO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBLENBQUMsQ0FBQyxpREFBUTtBQUNWLGlFQUFlLGFBQWEsRUFBQztBQUM3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVaa0M7QUFDQTtBQUNZO0FBQ1A7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0EsUUFBUSxnREFBUTtBQUNoQixhQUFhLG1EQUFnQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBLENBQUMsQ0FBQyxpREFBUTtBQUNWLGlFQUFlLFlBQVksRUFBQztBQUM1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeENrQztBQUNEO0FBQ0E7QUFDb0M7QUFDb0I7QUFDekQ7QUFDTztBQUM0RDtBQUMvQztBQUNGO0FBQ2dDO0FBQ2dDO0FBQ2xIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxpREFBUztBQUNiO0FBQ0E7QUFDQSxRQUFRLGlEQUFRLHlCQUF5Qiw4Q0FBVztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwyREFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSwwREFBaUI7QUFDekI7QUFDQTtBQUNBLHNCQUFzQiwyREFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsK0NBQVk7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDBEQUFhO0FBQzlDLCtCQUErQiwwREFBYTtBQUM1QyxtQ0FBbUMsMERBQWE7QUFDaEQsc0JBQXNCLDBEQUFhO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzREFBYSx5QkFBeUIsMERBQWE7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFVBQVU7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSwrREFBc0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsMERBQXFCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLDBEQUFhLFVBQVUsNERBQWM7QUFDaEYsaUNBQWlDLDBEQUFhLFNBQVMsNERBQWM7QUFDckUsa0JBQWtCLDREQUFjO0FBQ2hDO0FBQ0EsZ0RBQWdELFdBQVc7QUFDM0Q7QUFDQTtBQUNBLG1EQUFtRCxtQkFBbUI7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1REFBYztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxnREFBYTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxnREFBYTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsZ0RBQWE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0RBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0RBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxnREFBYTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGdEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnREFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsZ0RBQWE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsZ0RBQWE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsMERBQVM7QUFDL0Msd0NBQXdDLDBEQUFTO0FBQ2pELDhCQUE4Qix3QkFBd0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isd0RBQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix3REFBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isd0RBQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLCtDQUFNO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDhEQUF5QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUVBQWUsWUFBWSxFQUFDO0FBQzVCOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQzBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0RBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsU0FBUztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IscUJBQXFCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDN0I7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlBQVk7QUFDdEQsZ0NBQWdDLG9EQUFVLFlB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsVUFBVTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQscURBQVc7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsVUFBVTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxxREFBVztBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4QkFBOEI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVMsS0FBcUM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixzQkFBc0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGdDQUFnQztBQUNoRTtBQUNBO0FBQ0EsZ0NBQWdDLDhCQUE4QjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxpREFBaUQsaUNBQWlDLHFFQUFxRTtBQUN2SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELGFBQWE7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsYUFBYTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxhQUFhO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsY0FBYztBQUMzRDs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsdURBQXVELGNBQWM7QUFDckU7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZDQUE2QyxjQUFjO0FBQzNEOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZDQUE2QyxjQUFjO0FBQzNEOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsZ0JBQWdCO0FBQ3pFOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsZ0JBQWdCO0FBQ3pFOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzV3QmE7QUFDYix1QkFBdUI7QUFDdkIsYUFBYSxtQkFBTyxDQUFDLDRHQUF1Qjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlCQUF5Qix1QkFBdUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFF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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsV0FBVztBQUM1RDtBQUNBLGlEQUFpRCxXQUFXO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0hBQW9IO0FBQ3BILGdIQUFnSDtBQUNoSCwwSEFBMEg7QUFDMUgsNEhBQTRIO0FBQzVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELFdBQVc7QUFDNUQ7QUFDQSxpREFBaUQsV0FBVztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9IQUFvSDtBQUNwSCxnSEFBZ0g7QUFDaEgsMEhBQTBIO0FBQzFILDRIQUE0SDtBQUM1SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QSxRQUFRLE9BQU8sRUFBRSxTQUFTO0FBQzFCO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEI7O0FBRTFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNVNhO0FBQ2IsY0FBYztBQUNkLGNBQWMsbUJBQU8sQ0FBQywrRkFBYTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjOzs7Ozs7Ozs7Ozs7QUMzQkQ7QUFDYixtQkFBbUI7QUFDbkIsRUFBRSxjQUFjO0FBQ2hCLEVBQUUsa0NBQWtDO0FBQ3BDO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLDhGQUFvQjtBQUN6QyxjQUFjLG1CQUFPLENBQUMsc0dBQXdCOztBQUU5Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYzs7QUFFZDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQzs7Ozs7Ozs7Ozs7O0FDMURyQjtBQUNiLHdCQUF3QixHQUFHLHVCQUF1QjtBQUNsRCx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLElBQUk7QUFDdEIsb0JBQW9CLElBQUk7QUFDeEIsbUJBQW1CLElBQUk7O0FBRXZCO0FBQ0E7QUFDQSwwQkFBMEIsSUFBSTtBQUM5Qiw0QkFBNEIsSUFBSTtBQUNoQywyQkFBMkIsSUFBSTtBQUMvQixDQUFDOztBQUVELDBCQUEwQix3QkFBd0I7QUFDbEQsb0NBQW9DLEVBQUUsS0FBSyxFQUFFO0FBQzdDLHFCQUFxQixFQUFFLEtBQUssRUFBRTtBQUM5QixvQ0FBb0MsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQ3JELHdCQUF3QixFQUFFLE1BQU0sRUFBRTtBQUNsQyx1Q0FBdUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0FBQzFELENBQUM7Ozs7Ozs7Ozs7OztBQ2hDWTtBQUNiLGVBQWU7QUFDZixpQkFBaUIsbUJBQU8sQ0FBQyxxSEFBd0I7QUFDakQsa0JBQWtCLG1CQUFPLENBQUMsdUhBQXlCO0FBQ25ELDJCQUEyQixtQkFBTyxDQUFDLHlJQUFrQztBQUNyRSx5QkFBeUIsbUJBQU8sQ0FBQyxxSUFBZ0M7QUFDakUsMEJBQTBCLG1CQUFPLENBQUMsdUlBQWlDO0FBQ25FLHFCQUFxQixtQkFBTyxDQUFDLDZIQUE0QjtBQUN6RCwrQkFBK0IsbUJBQU8sQ0FBQyxpSkFBc0M7QUFDN0UsbUJBQW1CLG1CQUFPLENBQUMseUhBQTBCO0FBQ3JELDZCQUE2QixtQkFBTyxDQUFDLDZJQUFvQztBQUN6RSx1QkFBdUIsbUJBQU8sQ0FBQyxpSUFBOEI7QUFDN0QscUJBQXFCLG1CQUFPLENBQUMsNkhBQTRCO0FBQ3pELGtCQUFrQixtQkFBTyxDQUFDLHVIQUF5QjtBQUNuRCx1QkFBdUIsbUJBQU8sQ0FBQyxpSUFBOEI7QUFDN0QsaUJBQWlCLG1CQUFPLENBQUMscUhBQXdCO0FBQ2pELHNCQUFzQixtQkFBTyxDQUFDLCtIQUE2QjtBQUMzRCxnQ0FBZ0MsbUJBQU8sQ0FBQyxtSkFBdUM7QUFDL0Usb0JBQW9CLG1CQUFPLENBQUMsMkhBQTJCO0FBQ3ZELGtCQUFrQixtQkFBTyxDQUFDLHVIQUF5QjtBQUNuRCwwQkFBMEIsbUJBQU8sQ0FBQyx1SUFBaUM7QUFDbkUsdUJBQXVCLG1CQUFPLENBQUMsaUlBQThCO0FBQzdELHVCQUF1QixtQkFBTyxDQUFDLGlJQUE4QjtBQUM3RCx1QkFBdUIsbUJBQU8sQ0FBQyxpSUFBOEI7QUFDN0QsdUJBQXVCLG1CQUFPLENBQUMsaUlBQThCO0FBQzdELHVCQUF1QixtQkFBTyxDQUFDLGlJQUE4QjtBQUM3RCxvQkFBb0IsbUJBQU8sQ0FBQywySEFBMkI7QUFDdkQsb0JBQW9CLG1CQUFPLENBQUMsMkhBQTJCO0FBQ3ZELDhCQUE4QixtQkFBTyxDQUFDLCtJQUFxQztBQUMzRSw4QkFBOEIsbUJBQU8sQ0FBQywrSUFBcUM7QUFDM0UseUJBQXlCLG1CQUFPLENBQUMscUlBQWdDO0FBQ2pFLDhCQUE4QixtQkFBTyxDQUFDLCtJQUFxQztBQUMzRSxtQ0FBbUMsbUJBQU8sQ0FBQyx5SkFBMEM7O0FBRXJGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsZUFBZTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7OztBQzlHWTtBQUNiLDBCQUEwQjtBQUMxQixjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCOzs7Ozs7Ozs7Ozs7QUN4RGI7QUFDYixrQkFBa0I7QUFDbEIsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjs7Ozs7Ozs7Ozs7O0FDeERMO0FBQ2Isa0JBQWtCO0FBQ2xCLGlCQUFpQixtQkFBTyxDQUFDLHNHQUFpQjtBQUMxQyxjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7Ozs7Ozs7Ozs7OztBQy9ETDtBQUNiLHVCQUF1QjtBQUN2QixpQkFBaUIsbUJBQU8sQ0FBQyxzR0FBaUI7QUFDMUMsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7Ozs7Ozs7Ozs7OztBQzdEVjtBQUNiLGlCQUFpQjtBQUNqQixhQUFhLG1CQUFPLENBQUMsMkZBQW9CO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxnR0FBYzs7QUFFcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLGtDQUFrQyx1Q0FBdUM7QUFDekUsa0NBQWtDLHdDQUF3QztBQUMxRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyx1Q0FBdUM7QUFDekUsa0NBQWtDLHdDQUF3QztBQUMxRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxzQ0FBc0M7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLGtDQUFrQyx1Q0FBdUM7QUFDekUsa0NBQWtDLHdDQUF3QztBQUMxRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjs7Ozs7Ozs7Ozs7O0FDaEVKO0FBQ2IsdUJBQXVCO0FBQ3ZCLGNBQWMsbUJBQU8sQ0FBQyxnR0FBYzs7QUFFcEMsYUFBYSxtQkFBTyxDQUFDLDhGQUFhOztBQUVsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1Qjs7Ozs7Ozs7Ozs7O0FDekRWO0FBQ2IsaUJBQWlCOztBQUVqQixjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0Msc0JBQXNCO0FBQ3hELGtDQUFrQyxpQkFBaUI7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBLHVDQUF1QyxpQkFBaUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsZUFBZTtBQUNqRCxrQ0FBa0Msc0JBQXNCO0FBQ3hELGtDQUFrQyxpQkFBaUI7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCOzs7Ozs7Ozs7Ozs7QUMxQ0o7QUFDYiwwQkFBMEI7QUFDMUIsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEI7Ozs7Ozs7Ozs7OztBQ3pCYjtBQUNiLDhCQUE4QjtBQUM5QixjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7Ozs7Ozs7Ozs7OztBQ3pCakI7QUFDYix1QkFBdUI7QUFDdkIsaUJBQWlCLG1CQUFPLENBQUMsc0dBQWlCO0FBQzFDLGNBQWMsbUJBQU8sQ0FBQyxnR0FBYzs7QUFFcEMsYUFBYSxtQkFBTyxDQUFDLDhGQUFhOztBQUVsQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1Qjs7Ozs7Ozs7Ozs7O0FDeENWO0FBQ2IsdUJBQXVCO0FBQ3ZCLGlCQUFpQixtQkFBTyxDQUFDLHNHQUFpQjtBQUMxQyxjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUI7Ozs7Ozs7Ozs7OztBQ25DVjtBQUNiLHVCQUF1QjtBQUN2QixpQkFBaUIsbUJBQU8sQ0FBQyxzR0FBaUI7QUFDMUMsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUI7Ozs7Ozs7Ozs7OztBQ3BDVjtBQUNiLHVCQUF1QjtBQUN2QixpQkFBaUIsbUJBQU8sQ0FBQyxzR0FBaUI7QUFDMUMsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxjQUFjO0FBQy9EO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCOzs7Ozs7Ozs7Ozs7QUMxQ1Y7QUFDYixvQkFBb0I7QUFDcEIsYUFBYSxtQkFBTyxDQUFDLGlHQUF1QjtBQUM1QyxjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGFBQWE7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9COzs7Ozs7Ozs7Ozs7QUN2SFA7QUFDYix5QkFBeUI7QUFDekIsYUFBYSxtQkFBTyxDQUFDLHlHQUEyQjtBQUNoRCxjQUFjLG1CQUFPLENBQUMsdUpBQWtEO0FBQ3hFLGlCQUFpQixtQkFBTyxDQUFDLHNHQUFpQjtBQUMxQyxjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5Qjs7Ozs7Ozs7Ozs7O0FDeERaO0FBQ2IsOEJBQThCO0FBQzlCLGFBQWEsbUJBQU8sQ0FBQyx5R0FBMkI7QUFDaEQsY0FBYyxtQkFBTyxDQUFDLHVKQUFrRDtBQUN4RSxpQkFBaUIsbUJBQU8sQ0FBQyxzR0FBaUI7QUFDMUMsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7Ozs7Ozs7Ozs7OztBQ3hEakI7QUFDYixxQkFBcUI7QUFDckIsYUFBYSxtQkFBTyxDQUFDLG1HQUF3QjtBQUM3QyxjQUFjLG1CQUFPLENBQUMsMkdBQTRCO0FBQ2xELGlCQUFpQixtQkFBTyxDQUFDLHNHQUFpQjtBQUMxQyxjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsY0FBYztBQUMvRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7Ozs7Ozs7Ozs7OztBQ3BEUjtBQUNiLHlCQUF5QjtBQUN6QixhQUFhLG1CQUFPLENBQUMsMkdBQTRCO0FBQ2pELGNBQWMsbUJBQU8sQ0FBQyx5R0FBMkI7QUFDakQsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7Ozs7Ozs7Ozs7OztBQzdDWjtBQUNiLHNCQUFzQjtBQUN0QixhQUFhLG1CQUFPLENBQUMsMkZBQW9CO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxnR0FBYzs7QUFFcEMsYUFBYSxtQkFBTyxDQUFDLDhGQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxrQ0FBa0MsdUNBQXVDO0FBQ3pFLGtDQUFrQyx3Q0FBd0M7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsdUNBQXVDO0FBQ3pFLGtDQUFrQyx3Q0FBd0M7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0Msc0NBQXNDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxrQ0FBa0MsdUNBQXVDO0FBQ3pFLGtDQUFrQyx3Q0FBd0M7QUFDMUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjs7Ozs7Ozs7Ozs7O0FDcEdUO0FBQ2IsdUJBQXVCO0FBQ3ZCLGFBQWEsbUJBQU8sQ0FBQyw2RkFBcUI7QUFDMUMsY0FBYyxtQkFBTyxDQUFDLHFHQUF5QjtBQUMvQyxpQkFBaUIsbUJBQU8sQ0FBQyxzR0FBaUI7QUFDMUMsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGNBQWM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qjs7Ozs7Ozs7Ozs7O0FDdERWO0FBQ2IsMkJBQTJCO0FBQzNCLGFBQWEsbUJBQU8sQ0FBQyxxR0FBeUI7O0FBRTlDLGNBQWMsbUJBQU8sQ0FBQyxxR0FBeUI7QUFDL0MsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjs7Ozs7Ozs7Ozs7O0FDcEZkO0FBQ2Isb0JBQW9CO0FBQ3BCLGlCQUFpQixtQkFBTyxDQUFDLHNHQUFpQjtBQUMxQyxjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGdCQUFnQjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjs7Ozs7Ozs7Ozs7O0FDbkNQO0FBQ2IsbUJBQW1CO0FBQ25CLGlCQUFpQixtQkFBTyxDQUFDLHNHQUFpQjtBQUMxQyxjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxvQ0FBb0Msd0NBQXdDO0FBQzVFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msc0NBQXNDO0FBQzFFO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxvQ0FBb0Msd0NBQXdDO0FBQzVFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COzs7Ozs7Ozs7Ozs7QUM3Rk47QUFDYixxQkFBcUI7QUFDckIsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxpQkFBaUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7Ozs7Ozs7Ozs7O0FDcEZSO0FBQ2Isb0JBQW9CO0FBQ3BCLGlCQUFpQixtQkFBTyxDQUFDLHNHQUFpQjtBQUMxQyxjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGdCQUFnQjtBQUNqRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjs7Ozs7Ozs7Ozs7O0FDbkNQO0FBQ2IsZ0NBQWdDO0FBQ2hDLGFBQWEsbUJBQU8sQ0FBQywyRkFBb0I7QUFDekMsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxrQ0FBa0MsdUNBQXVDO0FBQ3pFLGtDQUFrQyx3Q0FBd0M7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsdUNBQXVDO0FBQ3pFLGtDQUFrQyx3Q0FBd0M7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0Msc0NBQXNDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxrQ0FBa0MsdUNBQXVDO0FBQ3pFLGtDQUFrQyx3Q0FBd0M7QUFDMUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQzs7Ozs7Ozs7Ozs7O0FDckduQjtBQUNiLDZCQUE2QjtBQUM3QixpQkFBaUIsbUJBQU8sQ0FBQyxzR0FBaUI7QUFDMUMsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxvQ0FBb0Msd0NBQXdDO0FBQzVFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msc0NBQXNDO0FBQzFFO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxvQ0FBb0Msd0NBQXdDO0FBQzVFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qjs7Ozs7Ozs7Ozs7O0FDN0ZoQjtBQUNiLCtCQUErQjtBQUMvQixjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGlCQUFpQjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCOzs7Ozs7Ozs7Ozs7QUNwRmxCO0FBQ2IsbUNBQW1DO0FBQ25DLGFBQWEsbUJBQU8sQ0FBQyx5R0FBMkI7QUFDaEQsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0RBQXNELHNCQUFzQjtBQUM1RTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DOzs7Ozs7Ozs7Ozs7QUNwQnRCO0FBQ2IsOEJBQThCO0FBQzlCLGFBQWEsbUJBQU8sQ0FBQyx5R0FBMkI7QUFDaEQsY0FBYyxtQkFBTyxDQUFDLGdHQUFjOztBQUVwQyxhQUFhLG1CQUFPLENBQUMsOEZBQWE7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsc0JBQXNCO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhCQUE4Qjs7Ozs7Ozs7Ozs7O0FDdkJqQjtBQUNiLGtCQUFrQjtBQUNsQixjQUFjLG1CQUFPLENBQUMsZ0dBQWM7O0FBRXBDLGFBQWEsbUJBQU8sQ0FBQyw4RkFBYTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7Ozs7Ozs7Ozs7O0FDckVMO0FBQ2IsNEJBQTRCO0FBQzVCLHVCQUF1QjtBQUN2QixnQkFBZ0I7QUFDaEIsNkJBQTZCO0FBQzdCLDRCQUE0QjtBQUM1QixvQkFBb0I7QUFDcEIsMEJBQTBCO0FBQzFCLDJCQUEyQjtBQUMzQiw0QkFBNEI7QUFDNUIsYUFBYSxtQkFBTyxDQUFDLDhGQUFvQjs7QUFFekMsaUJBQWlCLG1CQUFPLENBQUMscUdBQWdCOztBQUV6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFlBQVk7QUFDOUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELFlBQVk7QUFDaEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMxS2E7QUFDYixXQUFXO0FBQ1gsYUFBYSxtQkFBTyxDQUFDLGtHQUFvQjtBQUN6QyxjQUFjLG1CQUFPLENBQUMsd0ZBQWU7QUFDckMsY0FBYyxtQkFBTyxDQUFDLG9GQUFhOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsZ0NBQWdDO0FBQy9FO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELFdBQVc7QUFDcEU7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM1RWE7QUFDYixjQUFjO0FBQ2QsYUFBYSxtQkFBTyxDQUFDLHNGQUFjO0FBQ25DLGNBQWMsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbkMsY0FBYyxtQkFBTyxDQUFDLDhHQUEwQjs7QUFFaEQ7QUFDQSxRQUFRLGNBQWM7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxpQkFBaUI7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMxRGE7QUFDYixnQkFBZ0I7QUFDaEIsYUFBYSxtQkFBTyxDQUFDLG9GQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDNUJhO0FBQ2IsaUJBQWlCO0FBQ2pCLGFBQWEsbUJBQU8sQ0FBQyxzRkFBYztBQUNuQyxjQUFjLG1CQUFPLENBQUMsMEZBQWdCO0FBQ3RDLGNBQWMsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pDYTtBQUNiLGtCQUFrQjtBQUNsQixhQUFhLG1CQUFPLENBQUMsNEZBQWlCO0FBQ3RDLGNBQWMsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2hDYTtBQUNiLGtCQUFrQjtBQUNsQixhQUFhLG1CQUFPLENBQUMsb0ZBQWE7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM1QmE7QUFDYixnQkFBZ0I7QUFDaEIsYUFBYSxtQkFBTyxDQUFDLGtHQUFvQjtBQUN6QyxjQUFjLG1CQUFPLENBQUMsb0dBQXFCO0FBQzNDLGNBQWMsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdkNhO0FBQ2Isa0JBQWtCO0FBQ2xCLGFBQWEsbUJBQU8sQ0FBQyx3RkFBZTtBQUNwQyxjQUFjLG1CQUFPLENBQUMsb0ZBQWE7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzlCYTtBQUNiLGtCQUFrQjtBQUNsQixhQUFhLG1CQUFPLENBQUMsb0ZBQWE7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM1QmE7QUFDYixlQUFlO0FBQ2YsYUFBYSxtQkFBTyxDQUFDLHNGQUFjO0FBQ25DLGNBQWMsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbkM7QUFDQSxRQUFRLGVBQWU7QUFDdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkRhO0FBQ2IsZUFBZTtBQUNmLGFBQWEsbUJBQU8sQ0FBQyxrR0FBb0I7QUFDekMsY0FBYyxtQkFBTyxDQUFDLG9GQUFhOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ25DYTtBQUNiLGtCQUFrQjtBQUNsQixhQUFhLG1CQUFPLENBQUMsb0ZBQWE7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM1QmE7QUFDYixzQkFBc0I7QUFDdEIsYUFBYSxtQkFBTyxDQUFDLDhGQUFrQjs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxpQkFBaUI7QUFDMUQ7Ozs7Ozs7Ozs7OztBQzVCYTtBQUNiLDBCQUEwQjtBQUMxQixhQUFhLG1CQUFPLENBQUMsb0dBQXFCO0FBQzFDLGNBQWMsbUJBQU8sQ0FBQyxvR0FBcUI7QUFDM0MsY0FBYyxtQkFBTyxDQUFDLGtHQUFvQjs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuQ2E7QUFDYixvQkFBb0I7QUFDcEIsYUFBYSxtQkFBTyxDQUFDLG9GQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM3QmE7QUFDYixzQkFBc0I7QUFDdEIsYUFBYSxtQkFBTyxDQUFDLG9GQUFhOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDL0JhO0FBQ2IsbUJBQW1CO0FBQ25CLGFBQWEsbUJBQU8sQ0FBQyxvRkFBYTs7QUFFbEMsY0FBYyxtQkFBTyxDQUFDLDhHQUEwQjs7QUFFaEQ7QUFDQSxRQUFRLG1CQUFtQjtBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLGlCQUFpQjtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3BEYTtBQUNiLHVCQUF1QjtBQUN2QixhQUFhLG1CQUFPLENBQUMsa0dBQW9CO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyw4RkFBa0I7QUFDeEMsY0FBYyxtQkFBTyxDQUFDLDhGQUFrQjs7QUFFeEMsY0FBYyxtQkFBTyxDQUFDLDhHQUEwQjs7QUFFaEQ7QUFDQSxRQUFRLHVCQUF1QjtBQUMvQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQy9EYTtBQUNiLG1CQUFtQjtBQUNuQixhQUFhLG1CQUFPLENBQUMsb0ZBQWE7QUFDbEMsY0FBYyxtQkFBTyxDQUFDLGtHQUFvQjs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMvQmE7QUFDYixlQUFlO0FBQ2YsYUFBYSxtQkFBTyxDQUFDLHNGQUFjOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMxQmE7QUFDYixpQkFBaUI7QUFDakIsYUFBYSxtQkFBTyxDQUFDLDBGQUFnQjs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDMUJhO0FBQ2IsbUJBQW1CO0FBQ25CLGFBQWEsbUJBQU8sQ0FBQyw4RkFBa0I7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzFCYTtBQUNiLGdCQUFnQjtBQUNoQixhQUFhLG1CQUFPLENBQUMsd0ZBQWU7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzFCYTtBQUNiLGdCQUFnQjtBQUNoQixhQUFhLG1CQUFPLENBQUMsd0ZBQWU7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzFCYTtBQUNiLGNBQWM7O0FBRWQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3pEYTtBQUNiLGlCQUFpQjtBQUNqQixhQUFhLG1CQUFPLENBQUMsa0dBQW9COztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsbUJBQU8sQ0FBQyw0Q0FBTztBQUNyQyxnQkFBZ0IsbUJBQU8sQ0FBQywyRUFBVzs7QUFFbkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2RkFBNkYsYUFBYTtBQUMxRztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUdBQWlHLGVBQWU7QUFDaEg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBLEtBQUssR0FBRzs7QUFFUixrREFBa0Q7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdDQUFnQzs7QUFFaEMsa0JBQWtCOztBQUVsQixvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEscURBQXFEO0FBQ3JEOztBQUVBLGlDQUFpQzs7QUFFakMsMENBQTBDOztBQUUxQyxnQ0FBZ0M7O0FBRWhDLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBOztBQUVBLGdEQUFnRDtBQUNoRCxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDOztBQUVyQyxnQ0FBZ0M7O0FBRWhDLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7O0FBRUEsc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLHlCQUF5QjtBQUMzQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjs7QUFFQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBOztBQUVBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCO0FBQzVCOztBQUVBLGlCQUFpQjtBQUNqQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEdBQUc7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsR0FBRztBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxHQUFHO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTs7O0FBR1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSw4REFBOEQ7QUFDOUQsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCLFdBQVcsUUFBUTtBQUNuQixXQUFXLEdBQUc7QUFDZDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVB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RUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsR0FBRztBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtFQUFrRTtBQUNsRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsb0JBQW9CLGtCQUFrQjtBQUN0Qzs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsK0JBQStCO0FB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QTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLDZOQUE2TjtBQUM3TjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZFQUE2RSxZQUFZO0FBQ3pGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlJQUFpSSw4QkFBOEI7QUFDL0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtRkFBbUY7QUFDbkY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUSwwQ0FBMEM7OztBQUdsRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnR0FBZ0c7QUFDaEc7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSwwQ0FBMEM7OztBQUdsRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEVBQThFOztBQUU5RTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNKQUFzSixpQkFBaUI7QUFDdkssUUFBUTtBQUNSLHNKQUFzSixpQkFBaUIsd0RBQXdELG1CQUFtQixnQkFBZ0IsK0JBQStCO0FBQ2pTOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBLG9HQUFvRyxHQUFHOztBQUV2RztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksZ0JBQWdCO0FBQzVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTs7QUFFdkU7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDhDQUE4Qzs7QUFFOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLDBCQUEwQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFlBQVksV0FBVztBQUN2Qjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkNBQTJDO0FBQzNDOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7O0FBRUEsc0NBQXNDO0FBQ3RDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLGlCQUFpQjs7QUFFakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxlQUFlO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSLHdFQUF3RTs7QUFFeEU7QUFDQSwrREFBK0Q7QUFDL0Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFROzs7QUFHUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxNQUFNO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxXQUFXLE1BQU07QUFDakI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRjs7QUFFM0Y7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDs7QUFFdkQsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ04sSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBLHlDQUF5Qzs7QUFFekM7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QztBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDOztBQUU5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBLHVDQUF1Qzs7QUFFdkMsK0JBQStCO0FBQy9COztBQUVBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQSwwRUFBMEU7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUywyQ0FBMkM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFO0FBQ0E7O0FBRUEsb0JBQW9CLGlDQUFpQztBQUNyRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1CQUFtQiw0Q0FBNEM7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEVBQTRFOztBQUU1RSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7O0FBRUEsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7O0FBR0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FB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QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlDQUF5QztBQUN6QztBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxRQUFRO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0Esa0RBQWtEO0FBQ2xEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNB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QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4R0FBOEc7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEdBQTBHO0FBQzFHOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7OztBQUczQjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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QTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sMkVBQTJFLG9HQUFvRyxrQ0FBa0M7QUFDdk47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLDJ2QkFBMnZCOztBQUUzdkI7QUFDQTtBQUNBO0FBQ0EscUNBQXFDOztBQUVyQyx3REFBd0Q7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFO0FBQ0E7QUFDQSxFQUFFLG1CQUFtQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0Q7O0FBRWhEO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJLGNBQWM7QUFDbEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGdCQUFnQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUyxjQUFjO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSwrQ0FBK0M7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLCtDQUErQztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsK0NBQStDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBOzs7QUFHQSwwRUFBMEU7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwySEFBMkg7QUFDM0g7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvRUFBb0U7O0FBRXBFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEVBQUU7OztBQUdGLDJEQUEyRDs7QUFFM0QscURBQXFEO0FBQ3JEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7O0FBRUEsMkhBQTJIO0FBQzNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEU7QUFDMUU7O0FBRUE7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FB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O0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHNKQUFzSjs7QUFFdEoscUNBQXFDO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQThEO0FBQzlELHFEQUFxRDtBQUNyRCwyREFBMkQ7QUFDM0QsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDs7QUFFdEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBK0M7O0FBRS9DOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDOztBQUVyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhIQUE4SCx5Q0FBeUM7QUFDdks7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsa0RBQWtEO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLDZCQUE2QjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOLHdFQUF3RTs7QUFFeEUsV0FBVyw2QkFBNkI7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUjs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsV0FBVyxpQ0FBaUM7QUFDNUM7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOLHdFQUF3RTs7QUFFeEUsV0FBVyxZQUFZO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLE1BQU07QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUNBQXFDOztBQUVyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCOztBQUU1Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzRkFBc0Y7O0FBRXRGLDREQUE0RDtBQUM1RDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDZCQUE2QjtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFD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QUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCOztBQUU3QixxQ0FBcUM7O0FBRXJDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLDJDQUEyQztBQUNqRDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrRkFBa0Y7QUFDbEY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0lBQWdJO0FBQ2hJO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQSx5S0FBeUssMENBQTBDO0FBQ25OO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DOzs7QUFHbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7O0FBRTlCLGdEQUFnRDtBQUNoRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxlQUFlO0FBQ3pCLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdFQUFnRTs7QUFFaEU7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGdDQUFnQztBQUNoQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKLGlHQUFpRztBQUNqRyxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4SUFBOEk7O0FBRTlJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Ysa0VBQWtFLDRDQUE0QztBQUM5Rzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0MsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0Esc0RBQXNEO0FBQ3REOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUlBQW1JO0FBQ25JO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtSUFBbUk7QUFDbkk7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLFFBQVEsSUFBSTtBQUNaO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOzs7QUFHQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQSxpSEFBaUg7QUFDakg7QUFDQTtBQUNBOztBQUVBLHlDQUF5QztBQUN6QyxNQUFNLEtBQUssRUFLTjtBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGdEQUFnRDs7QUFFaEQsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUdWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ04sbUNBQW1DO0FBQ25DOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7O0FBRWpEO0FBQ0E7QUFDQSx5RUFBeUU7O0FBRXpFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1RUFBdUU7O0FBRXZFO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkNBQTJDOztBQUUzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7OztBQUdBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQSxzRUFBc0U7O0FBRXRFLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTix5Q0FBeUM7O0FBRXpDO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDs7QUFFdEQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5TkFBeU4sR0FBRzs7QUFFNU47QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IscUJBQXFCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOzs7QUFHWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0Q7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7O0FBR0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBLDBDQUEwQzs7QUFFMUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0hBQWdIO0FBQ2hIO0FBQ0E7O0FBRUEsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsZ0hBQWdIO0FBQ2hIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7O0FBR0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7O0FBRTdEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsb0NBQW9DO0FBQzVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDREQUE0RDtBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7O0FBRUEsc0hBQXNIOztBQUV0SCxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtHQUFrRztBQUNsRztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBLGtHQUFrRztBQUNsRztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFjOzs7QUFHZDtBQUNBO0FBQ0E7O0FBRUEscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsY0FBYzs7QUFFZDs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUVaOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQSxZQUFZOzs7QUFHWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxpRUFBaUU7QUFDakU7O0FBRUEsc0lBQXNJOztBQUV0STtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7O0FBRVosVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFEQUFxRDs7QUFFckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQSxnRUFBZ0U7QUFDaEU7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHdFQUF3RTs7QUFFeEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsRUFBRTs7O0FBR0Y7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0QkFBNEI7O0FBRTVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTs7O0FBR0EsaUVBQWlFO0FBQ2pFOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVEsNElBQTRJO0FBQ3BKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7OztBQUdBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQSxzREFBc0Q7O0FBRXREO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7O0FBRUEsbURBQW1EO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJLCtCQUErQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSSwrQkFBK0I7QUFDbkM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7QUFFVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBOztBQUVBO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdEQUFnRDtBQUNoRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTs7QUFFdkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUI7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLHNCQUFzQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGOztBQUU1RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCOztBQUU1QixrQ0FBa0M7O0FBRWxDLCtCQUErQjs7QUFFL0IsMkJBQTJCOztBQUUzQiw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzREFBc0Q7O0FBRXRELG1EQUFtRDs7QUFFbkQseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBK0M7QUFDL0M7O0FBRUEsOENBQThDOztBQUU5Qyx5REFBeUQ7O0FBRXpELDZDQUE2Qzs7QUFFN0MsK0NBQStDO0FBQy9DOztBQUVBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBLGdDQUFnQztBQUNoQzs7QUFFQSxtREFBbUQ7QUFDbkQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0MsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEO0FBQ2hEOztBQUVBLGdEQUFnRDs7QUFFaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSiwrREFBK0Q7O0FBRS9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7O0FBRWxEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZFQUE2RTtBQUM3RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RkFBNEY7O0FBRTVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvRUFBb0U7OztBQUdwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVOzs7QUFHVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCLG1CQUFtQjtBQUM3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLG9GQUFvRjtBQUNwRjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkNBQTZDO0FBQzdDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR047QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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QUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw0Q0FBNEM7QUFDcEQ7OztBQUdBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7O0FBRUEsa0RBQWtEOztBQUVsRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUhBQW1IOztBQUVuSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sR0FBRztBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDhMQUE4TCxvREFBb0QsRUFBRTtBQUNwUCxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbU9BQW1PLG9EQUFvRCxFQUFFO0FBQ3pSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQzs7QUFFakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSixnREFBZ0Q7O0FBRWhELHdDQUF3QztBQUN4Qzs7QUFFQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRDs7QUFFdEQsd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLGlCQUFpQjtBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3TEFBd0w7O0FBRXhMLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwwRUFBMEU7QUFDMUU7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxHQUFHO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXdEOztBQUV4RDtBQUNBLG1DQUFtQzs7QUFFbkM7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0RBQXdELFFBQVE7O0FBRWhFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLGdMQUFnTCw4QkFBOEI7QUFDOU07QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQSw2REFBNkQ7O0FBRTdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdEOztBQUVoRDs7QUFFQTtBQUNBLG9CQUFvQiwyQkFBMkI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSx1REFBdUQ7O0FBRXZEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSyxHQUFHO0FBQ1I7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQSw4RUFBOEU7O0FBRTlFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBEQUEwRDtBQUMxRCxvQkFBb0I7QUFDcEIsa0JBQWtCO0FBQ2xCLG1CQUFtQjtBQUNuQixpQkFBaUI7QUFDakIsZUFBZTtBQUNmLG1CQUFtQjtBQUNuQixjQUFjO0FBQ2QsOEJBQThCO0FBQzlCLCtCQUErQjtBQUMvQiwyQ0FBMkM7QUFDM0MsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7O0FDbHU2QmE7O0FBRWIsUUFBUSxtQkFBTyxDQUFDLG9EQUFXO0FBQzNCLElBQUksS0FBcUMsRUFBRSxFQUcxQyxDQUFDO0FBQ0Y7QUFDQSxFQUFFLGtCQUFrQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsRUFBRSxtQkFBbUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN4QmE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxLQUFxQyxFQUFFLEVBSzFDLENBQUM7QUFDRixFQUFFLG1JQUEwRDtBQUM1RDs7Ozs7Ozs7Ozs7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLEVBQUUsb0JBQW9CO0FBQ3RCO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQSxFQUFFLG9CQUFvQjtBQUN0QjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7OztBQUdBLG9DQUFvQzs7QUFFcEMscUNBQXFDOztBQUVyQztBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQywrQ0FBK0M7O0FBRS9DO0FBQ0EscUJBQXFCOztBQUVyQix1QkFBdUI7QUFDdkI7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQSxtRkFBbUY7O0FBRW5GOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw2QkFBNkI7QUFDN0Isa0NB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QUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEdBQUc7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSwrRUFBK0U7QUFDL0U7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxrQkFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Es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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsMEJBQTBCO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlEQUFpRCxTQUFTO0FBQzFEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztB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QUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGVBQWUsc0RBQVc7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNEQUFzRDs7QUFFdEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEscUJBQXFCLHVCQUF1QjtBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0EsaURBQWlELFVBQVU7QUFDM0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEscUJBQXFCLHVCQUF1QjtBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixxREFBcUQsVUFBVTtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQiwwQkFBMEI7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHdDQUF3Qzs7QUFFekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxvREFBb0Q7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDRDQUFlO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQiw4Q0FBRzs7QUFFekI7QUFDQTtBQUNBOztBQUVBLFdBQVcsZ0RBQW1CLENBQUMsMERBQWE7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQyxDQUFDLDRDQUFlOztBQUVqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQiw4Q0FBRzs7QUFFekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLENBQUMsNENBQWU7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0MscURBQVM7O0FBRXpDO0FBQ0E7QUFDQSxvQkFBb0IscURBQVM7QUFDN0IsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIOztBQUVBLHVCQUF1QixnREFBbUI7QUFDMUM7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTs7QUFFQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRkFBcUY7O0FBRXJGO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtREFBbUQ7O0FBRW5ELDZGQUE2RjtBQUM3RjtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRyxHQUFHOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBLE9BQU87QUFDUCw0Q0FBNEMsbURBQW1ELDRHQUE0RztBQUMzTTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLDhEQUE4RDtBQUM5RDtBQUNBLFFBQVE7QUFDUjs7QUFFQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLG9EQUFvRDtBQUNwRDtBQUNBLE9BQU87QUFDUCw2REFBNkQsMkdBQTJHO0FBQ3hLO0FBQ0EsT0FBTztBQUNQLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtDQUErQztBQUMvQztBQUNBLG1CQUFtQiw4Q0FBRztBQUN0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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsNEJBQTRCO0FBQzVCO0FBQ0EscUNBQXFDOztBQUVyQyxnQ0FBZ0M7QUFDaEM7QUFDQTs7QUFFQSxnQ0FBZ0M7O0FBRWhDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkLFdBQVcsZUFBZTtBQUMxQixXQUFXLEdBQUc7QUFDZCxXQUFXLEdBQUc7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNk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OztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsV0FBVztBQUN0QjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0RBQW9EOztBQUVwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2QsV0FBVyxHQUFHO0FBQ2QsV0FBVyxlQUFlO0FBQzFCLFdBQVcsR0FBRztBQUNkLFdBQVcsR0FBRztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxHQUFHOztBQUVSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJIQUEySDtBQUMzSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9FQUFvRTs7QUFFcEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxnREFBUztBQUN6QztBQUNBLDhCQUE4QixzREFBUTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVMsS0FBcUM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isc0JBQXNCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxJQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQiwyQkFBMkI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDLDRGQUE0RixDQUFNO0FBQzdJO0FBQ0E7O0FBRUEsb0JBQW9CLGdDQUFnQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0IsZ0NBQWdDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7OztBQ25LYTs7QUFFYixJQUFJLEtBQXFDLEVBQUUsRUFFMUMsQ0FBQztBQUNGLEVBQUUseU1BQXNGO0FBQ3hGOzs7Ozs7Ozs7Ozs7QUNOYTs7QUFFYiw4Q0FBNkM7QUFDN0M7QUFDQSxDQUFDLEVBQUM7QUFDRix1Q0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRix1Q0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRix5Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRiw2Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRixzQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRiwwQ0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRixzQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRixzQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRixzQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRixzQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRiwwQ0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRixzQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRiw0Q0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7QUFDRiwyQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyw0REFBWTtBQUNqQjtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLHNEQUFNO0FBQ1g7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxzREFBTTtBQUNYO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssK0RBQWU7QUFDcEI7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssc0RBQU07QUFDWDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyx3REFBUTtBQUNiO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVpRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMVc3Qjs7QUFFckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isb0VBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxxRUFBYTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWlUOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlJalQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWdWOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3SWhWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUV5Vzs7Ozs7Ozs7Ozs7Ozs7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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TztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQzhDOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7QUFDdEMsNEJBQTRCLFVBQVU7QUFDdEMsMkJBQTJCLFNBQVMsR0FBRyxVQUFVO0FBQ2pELDJCQUEyQixTQUFTLEdBQUcsVUFBVTtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsTUFBTSxFQUFFLFdBQVcsV0FBVyxLQUFLO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixNQUFxQyxHQUFHLENBQTBCLE1BQU0sVUFBVTtBQUN0RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsVUFBVTtBQUNyQjtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhO0FBQ2I7QUFDQSwyQkFBMkIsb0JBQW9CLElBQUk7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQ0FBZ0MsT0FBTztBQUN2QztBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFNBQVMsR0FBRyxTQUFTO0FBQzVDLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxTQUFTLFVBQVU7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixrQ0FBa0M7QUFDbEMsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0MsT0FBTztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDQSxnQ0FBZ0MsV0FBVyxJQUFJO0FBQy9DO0FBQ0E7QUFDQSxlQUFlLDREQUFJO0FBQ25CLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRyxHQUFHLFdBQVc7QUFDakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLGtCQUFrQjtBQUM3QixXQUFXLFVBQVU7QUFDckI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsVUFBVTtBQUNyQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEIsZUFBZTs7QUFFekM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVMsUUFBUTtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQyxhQUFhO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLFdBQVcsY0FBYztBQUM1QixDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsaUVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdnZCRixjQUFjLGFBQWEsK0NBQStDLGdEQUFnRCxlQUFlLFFBQVEsSUFBSSwwQ0FBMEMseUNBQXlDLFNBQWdCLGdCQUFnQix3Q0FBd0MsSUFBSSxtREFBbUQsU0FBUyxpRUFBZSxJQUFJOzs7Ozs7Ozs7Ozs7Ozs7QUNBblk7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRmlEO0FBQ0U7QUFDVTtBQUNSO0FBQ3JEO0FBQ0EsVUFBVSxrREFBVztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMLGdCQUFnQixnRUFBZ0U7QUFDaEY7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDBFQUFlO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsMEVBQWU7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaURBQVU7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSwrREFBUztBQUNiO0FBQ0EsUUFBUSwrREFBUztBQUNqQixLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksK0RBQVM7QUFDYjtBQUNBO0FBQ0EsSUFBSSwrREFBUyxDQUFDLDREQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxRQUFRO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsc0JBQXNCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNpRDtBQUNFO0FBQ2pCO0FBQzNCO0FBQ1AscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsMkNBQUk7QUFDMUI7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLElBQUksK0RBQVM7QUFDYixJQUFJLCtEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSwrREFBUyxzQ0FBc0MsNERBQVE7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3hFaUQ7QUFDWDtBQUMvQjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsK0NBQVE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLCtEQUFTO0FBQ2I7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RCaUQ7QUFDUTtBQUN0QjtBQUM1QjtBQUNQLDBDQUEwQyxnQkFBZ0IsSUFBSTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNENBQUs7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksK0RBQVM7QUFDYjtBQUNBO0FBQ0EsSUFBSSwrREFBUztBQUNiLElBQUksK0RBQVM7QUFDYixtQkFBbUIsc0JBQXNCO0FBQ3pDO0FBQ0EsUUFBUSwrREFBUztBQUNqQjtBQUNBLFFBQVEsK0RBQVM7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFFBQVE7QUFDOUM7QUFDQTtBQUNBLGFBQWEsa0VBQVc7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2RGlEO0FBQ1Y7QUFDTTtBQUNKO0FBQ3dCO0FBQ3RDO0FBQ3BCO0FBQ1A7QUFDQSxtQkFBbUIsOERBQWU7QUFDbEMsMkJBQTJCLDhFQUF1QjtBQUNsRCxlQUFlLHNEQUFXO0FBQzFCLGNBQWMsb0RBQVU7QUFDeEIsaUJBQWlCLDBEQUFhO0FBQzlCO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoQjBDO0FBQ25DO0FBQ1A7QUFDQSxjQUFjLGtEQUFXO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQ1hpRDtBQUMxQztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDBEQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2JPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFUDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1BPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3JDcUU7QUFDOUQ7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFlBQVk7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpRkFBcUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUk7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2RGlEO0FBQzBDO0FBQzFDO0FBQ0s7QUFDL0M7QUFDUCxpREFBaUQ7QUFDakQsZ0JBQWdCLGNBQWM7QUFDOUIsUUFBUSwrREFBUztBQUNqQixRQUFRLCtEQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpSEFBaUgsNkRBQVE7QUFDekg7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsK0RBQVM7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLCtEQUFTLHNEQUFzRCxTQUFTO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLCtEQUFTLHNEQUFzRCxTQUFTO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtFQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSwrREFBUyxzREFBc0QsU0FBUztBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsV0FBVztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGtFQUFXO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsdUVBQXFCO0FBQ3BDO0FBQ0E7QUFDQSxlQUFlLGdGQUE4QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZKdUM7QUFDVTtBQUN5QztBQUNLO0FBQ2hEO0FBQ2U7QUFDOUQ7QUFDQSxlQUFlLDBFQUFlO0FBQzlCO0FBQ0EsYUFBYSx1REFBVztBQUN4Qix1QkFBdUIsR0FBRztBQUMxQixhQUFhLHVEQUFXO0FBQ3hCLHVCQUF1QixHQUFHO0FBQzFCO0FBQ0EscURBQXFELEtBQUs7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQix1REFBVztBQUM5QjtBQUNBLG1CQUFtQix1REFBVztBQUM5QjtBQUNBLHdEQUF3RCxVQUFVO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw2QkFBNkI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNPO0FBQ1A7QUFDQSxRQUFRLDJEQUFZO0FBQ3BCLFFBQVEscUVBQXNCO0FBQzlCLHlDQUF5Qyx1REFBVztBQUNwRCw0QkFBNEIsK0RBQVM7QUFDckM7QUFDQTtBQUNBO0FBQ0EsUUFBUSwyREFBWTtBQUNwQixRQUFRLHFFQUFzQjtBQUM5Qix5Q0FBeUMsdURBQVc7QUFDcEQsNEJBQTRCLCtEQUFTO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsK0RBQVM7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsK0RBQVM7QUFDakI7QUFDQTtBQUNBO0FBQ0EsUUFBUSwrREFBUztBQUNqQjtBQUNBO0FBQ0E7QUFDQSxRQUFRLCtEQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHVEQUFXO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1REFBVztBQUNuQztBQUNBO0FBQ0EsUUFBUSwrREFBUztBQUNqQiw0QkFBNEIsa0VBQVk7QUFDeEMsUUFBUSxxREFBSTtBQUNaO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVEsK0RBQVM7QUFDakIsNEJBQTRCLGtFQUFZO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLCtEQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSwrREFBUztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsdURBQVc7QUFDaEM7QUFDQSxVQUFVLGtCQUFrQix1REFBVztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaElpRDtBQUMxQztBQUNQLElBQUksK0RBQVM7QUFDYixJQUFJLCtEQUFTO0FBQ2IsSUFBSSwrREFBUztBQUNiO0FBQ087QUFDUCxJQUFJLCtEQUFTO0FBQ2IsSUFBSSwrREFBUztBQUNiLElBQUksK0RBQVM7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksK0RBQVM7QUFDYjs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwQm9DO0FBQ21DO0FBQ0E7QUFDQTtBQUMxQjtBQUN0Qyw2RkFBNkY7QUFDcEc7QUFDQSx3QkFBd0IsZ0ZBQW1CLFlBQVksZ0ZBQW1CO0FBQzFFLHdCQUF3QixnRkFBbUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsa0RBQVcsQ0FBQyxzREFBTTtBQUM3QjtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUN2Qk87QUFDUDtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtDQUFrQzs7QUFFbkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTnNHO0FBQ1I7QUFDNUM7QUFDSTtBQUNYO0FBQ3BDO0FBQ1AsU0FBUyxxREFBSTtBQUNiO0FBQ0EsYUFBYSw2REFBSztBQUNsQjtBQUNBLGFBQWEsNERBQVU7QUFDdkIsYUFBYSw0REFBVTtBQUN2QixhQUFhLCtEQUFhO0FBQzFCLGFBQWEsK0RBQWE7QUFDMUIsbUJBQW1CLHFEQUFJO0FBQ3ZCLGFBQWEsa0VBQVU7QUFDdkIsYUFBYSwyRUFBbUI7QUFDaEMsYUFBYSxnRUFBUTtBQUNyQixhQUFhLDREQUFJO0FBQ2pCO0FBQ0EsbUJBQW1CLG9EQUFHO0FBQ3RCO0FBQ0EsWUFBWSxxQ0FBcUM7QUFDakQsbUJBQW1CLHVEQUFHO0FBQ3RCLDRDQUE0QyxrRUFBYztBQUMxRDtBQUNBLGVBQWUscURBQUk7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixzQkFBc0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQzhGO0FBQ3hDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFlBQVksV0FBVztBQUN2QjtBQUNBLGFBQWEsbUVBQVc7QUFDeEIsYUFBYSxrRUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSw2REFBSztBQUNsQixnQkFBZ0Isa0VBQWM7QUFDOUI7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBLGFBQWE7QUFDYixhQUFhLGdFQUFRO0FBQ3JCLGFBQWEsNERBQUk7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDc0c7QUFDL0M7QUFDUjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLFlBQVksV0FBVztBQUN2QjtBQUNBLGFBQWEsa0VBQVU7QUFDdkIsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixhQUFhLDJFQUFtQjtBQUNoQyxtQ0FBbUM7QUFDbkM7QUFDQSxhQUFhO0FBQ2IsYUFBYSw2REFBSztBQUNsQixtQ0FBbUM7QUFDbkM7QUFDQSxhQUFhO0FBQ2IsYUFBYSwrREFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkMsMkJBQTJCLDJEQUFPO0FBQ2xDLGFBQWE7QUFDYixhQUFhLDREQUFJO0FBQ2pCLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsYUFBYSxnRUFBUTtBQUNyQixtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixzQkFBc0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQzJDO0FBQ3NCO0FBQ1Y7QUFDTTtBQUNWO0FBQ0Y7QUFDMUMsMEJBQTBCO0FBQ2pDO0FBQ0EseUJBQXlCLDJEQUFlO0FBQ3hDO0FBQ0EscUNBQXFDO0FBQ3JDLCtCQUErQix1REFBRztBQUNsQyxhQUFhO0FBQ2IsU0FBUztBQUNULG9CQUFvQixzREFBVTtBQUM5QixrQkFBa0Isb0RBQVE7QUFDMUIsdUJBQXVCLHlEQUFhO0FBQ3BDLGlCQUFpQixtREFBTztBQUN4QjtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDakQ4RjtBQUN2RjtBQUNQO0FBQ0EsYUFBYSw0REFBVTtBQUN2QixhQUFhLDREQUFVO0FBQ3ZCO0FBQ0EsYUFBYSwrREFBYTtBQUMxQixhQUFhLCtEQUFhO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQ2RPO0FBQ1A7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQVc7QUFDWCxZQUFZLGtFQUFrRTtBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFXO0FBQ1gsWUFBWSxzQ0FBc0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUM2QztBQUN0QztBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDBEQUFZO0FBQ2xDO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckJPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQVc7QUFDWDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixjQUFjO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FDL0JBO0FBQ087QUFDUDtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQ3hETztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLLEdBQUcsTUFBTTtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxjQUFjLFVBQVUsbUJBQW1CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFNBQVMsV0FBVztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxPQUFPLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsVUFBVSwwQkFBMEI7QUFDbEQ7QUFDQSw4QkFBOEI7QUFDOUIsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esc0JBQXNCLEtBQUs7QUFDM0IsdUNBQXVDO0FBQ3ZDLG9CQUFvQixlQUFlO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixtQkFBbUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSwyRUFBMkU7QUFDM0U7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSx3QkFBd0I7QUFDeEIsd0JBQXdCLHNCQUFzQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkZBQTZGLElBQUksZUFBZSxLQUFLLFFBQVEsSUFBSTs7QUFFakk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLDRFQUE0RTtBQUM1RSxxREFBcUQ7QUFDckQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFOEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pYOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0UsYUFBYTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFLGVBQWU7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRSxlQUFlO0FBQzFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsZUFBZTtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsWUFBWSxHQUFHLFdBQVc7QUFDN0MsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMkYsYUFBYTtBQUN4RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsbUJBQW1CO0FBQzNDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixtQkFBbUI7QUFDM0M7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0IsR0FBRyxFQUFFO0FBQ2hDO0FBQ0E7QUFDQSwrQ0FBK0MsT0FBTyxHQUFHLEVBQUU7QUFDM0Q7QUFDQTtBQUNBO0FBQ0EsY0FBYyxPQUFPLEdBQUcsRUFBRTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELEVBQUU7QUFDckQ7QUFDQSxhQUFhO0FBQ2IsWUFBWTtBQUNaLFlBQVk7QUFDWixjQUFjO0FBQ2QsYUFBYTtBQUNiLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELHdEQUF3RDtBQUNqSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixVQUFVLEVBQUUsWUFBWSxFQUFFLElBQUk7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsWUFBWSxLQUFLLEdBQUcsY0FBYztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUU7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLDJFQUEyRSw2QkFBNkIsaUNBQWlDLG1CQUFtQiw2QkFBNkIsa0NBQWtDO0FBQzNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix5QkFBeUI7QUFDbkQ7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSw2QkFBNkIsOEJBQThCLDZCQUE2QjtBQUMxSixpQ0FBaUMsNkJBQTZCO0FBQzlEO0FBQ0E7QUFDQSxzRUFBc0UsT0FBTztBQUM3RSxlQUFlO0FBQ2YsYUFBYTtBQUNiLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUZBQXVGLFVBQVUsR0FBRyxJQUFJO0FBQ3hHO0FBQ0E7QUFDQSxrR0FBa0csVUFBVSxHQUFHLElBQUk7QUFDbkgsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEUsYUFBYTtBQUN6RjtBQUNBO0FBQ0E7QUFDQSx5RUFBeUUsU0FBUyxVQUFVLE9BQU87QUFDbkc7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxTQUFTLEdBQUcsR0FBRztBQUNoRCw4QkFBOEIsU0FBUyxHQUFHLEdBQUc7QUFDN0MsbUNBQW1DLFFBQVEsbUJBQW1CLGlCQUFpQixxQ0FBcUMsT0FBTztBQUMzSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0Esa0NBQWtDLDZCQUE2QjtBQUMvRCxxQ0FBcUMsNkJBQTZCLFNBQVMsNkJBQTZCO0FBQ3hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLElBQUksRUFBRSw4QkFBOEIsRUFBRSxnQkFBZ0I7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsZ0ZBQWdGLEVBQUU7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTixrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsNkRBQTZELFdBQVc7QUFDeEU7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixJQUFJLEdBQUcsR0FBRztBQUNsQztBQUNBO0FBQ0EsVUFBVSxpQ0FBaUM7QUFDM0M7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLE9BQU8sb0JBQW9CLElBQUksZUFBZSxLQUFLO0FBQ3RGLDJDQUEyQyxPQUFPLG1CQUFtQixJQUFJLGVBQWUsSUFBSTtBQUM1RjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLElBQUksc0JBQXNCLFVBQVU7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0ZBQStGLGFBQWE7QUFDNUc7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUdBQW1HLGVBQWU7QUFDbEg7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiw0QkFBNEI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUdBQW1HLGVBQWU7QUFDbEg7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msa0JBQWtCLEVBQUUsYUFBYSxFQUFFLEVBQUU7QUFDekUsUUFBUTtBQUNSLDJDQUEyQyxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsSUFBSTtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxFQUFFLEdBQUcsRUFBRTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlHQUFpRyxlQUFlO0FBQ2hIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU2TTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3IwRTdNO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFeUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2THpIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxLQUFxQztBQUNsRDtBQUNBO0FBQ0EsOEJBQThCLE9BQU8sa0ZBQWtGLE9BQU87QUFDOUgsR0FBRztBQUNIO0FBQ0EsaUtBQWlLLE1BQU07QUFDdkssR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxNQUFNO0FBQ3BELEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLE1BQU07QUFDckQ7QUFDQTtBQUNBO0FBQ0EsSUFBSSxDQUFFO0FBQ047QUFDQSxNQUFNLElBQXFDO0FBQzNDO0FBQ0E7QUFDQSwrQkFBK0IsSUFBSTtBQUNuQztBQUNBO0FBQ0Esa0NBQWtDLE1BQU07QUFDeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxnQkFBZ0I7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEIsZUFBZSxVQUFVO0FBQ3pCLGVBQWUsVUFBVTtBQUN6QixpQkFBaUIsS0FBSztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsSUFBSTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixJQUFJO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLElBQUk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdGQUFnRixDQUF3cEI7QUFDeHVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixvQ0FBb0MsR0FBRztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxRQUFRO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCx3QkFBd0I7QUFDdkY7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsOEJBQThCLFFBQVE7QUFDdEMsd0JBQXdCLFFBQVE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7OztBQUlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHVCQUF1QixFQUFFLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msd0lBQXdJO0FBQzVLO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixhQUFhLEdBQUcsV0FBVztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFLElBQUk7QUFDN0U7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sd0JBQXdCLGFBQWEsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGFBQWE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sc0JBQXNCLFdBQVc7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsZ0JBQWdCO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7OztBQU1EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ2pCQUFnakIsZ0JBQWdCO0FBQ2hrQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLG1DQUFtQyw4Q0FBOEM7QUFDakYsb0NBQW9DLDhDQUE4QztBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsd0VBQXdFLEtBQUs7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsdUNBQXVDO0FBQy9EO0FBQ0E7QUFDQSxRQUFRO0FBQ1Isd0JBQXdCLHVDQUF1QztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdFQUF3RSxLQUFLO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFFBQVE7QUFDakQ7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7OztBQUlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLElBQUksR0FBRywyQkFBMkI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IseUNBQXlDLGtCQUFrQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsdUNBQXVDLHNCQUFzQixNQUFNLEdBQUc7QUFDdEU7QUFDQTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsV0FBVztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixVQUFVO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsVUFBVTtBQUM1QjtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxRQUFRO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLE1BQU07QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxVQUFVO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCLDZDQUE2QyxjQUFjO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZUFBZTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFFBQVE7QUFDakQ7QUFDQTtBQUNBLElBQUk7QUFDSixXQUFXLGVBQWU7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFFBQVE7QUFDN0M7QUFDQTtBQUNBLElBQUk7QUFDSixxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFdBQVc7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFlBQVk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsV0FBVztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFdBQVc7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxzQkFBc0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGlCQUFpQjtBQUNqQztBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtCQUFrQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsZ0JBQWdCLGlCQUFpQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLElBQUk7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osdUNBQXVDLGFBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsWUFBWTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsS0FBSyxLQUFLLHFCQUFxQjtBQUN2RjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixRQUFRLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixLQUFLLFNBQVM7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGtCQUFrQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxxQkFBcUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsUUFBUTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxXQUFXO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCxZQUFZO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0UsV0FBVztBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUixrREFBa0QsUUFBUTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxTQUFTO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsR0FBRztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0Esc0RBQXNELEdBQUc7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLHNEQUFzRCxHQUFHO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxzREFBc0QsR0FBRztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGFBQWE7QUFDM0Q7QUFDQTtBQUNBLCtCQUErQixXQUFXO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsR0FBRztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixHQUFHLEdBQUcsY0FBYztBQUN6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHFEQUFxRCxPQUFPO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsRUFBRTtBQUNoRDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7OztBQUlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLE9BQU8sMEJBQTBCLElBQUk7QUFDN0c7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsSUFBSTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxNQUFNLEdBQUcsUUFBUTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFdBQVcsR0FBRyxhQUFhO0FBQ3hFO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7O0FBSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxVQUFVO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxVQUFVO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsTUFBTSxHQUFHLFFBQVE7QUFDeEQ7QUFDQTtBQUNBLDhEQUE4RCxVQUFVO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLHdEQUF3RCxLQUFLO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QiwwQ0FBMEM7QUFDbkUsd0JBQXdCLDBDQUEwQztBQUNsRSxNQUFNO0FBQ04seUJBQXlCLGVBQWUsRUFBRSxnQkFBZ0I7QUFDMUQsd0JBQXdCLGVBQWUsRUFBRSxlQUFlO0FBQ3hEO0FBQ0EsMkJBQTJCLGVBQWUsRUFBRSxpREFBaUQ7QUFDN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLDJCQUEyQiwyQkFBMkI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0Esc0JBQXNCLHVCQUF1QixLQUFLLFdBQVc7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLDhCQUE4QixrQ0FBa0MsSUFBSSxVQUFVO0FBQzlFO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixpQkFBaUIsT0FBTyxVQUFVO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtCQUFrQixLQUFLLFdBQVc7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQWlCRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixnQ0FBZ0M7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxRQUFRO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxzRkFBc0Y7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsSUFBSSxHQUFHO0FBQzVDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw2QkFBNkI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsZ0ZBQWdGLGVBQWU7QUFDL0YsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELE9BQU87QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQsZUFBZTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0JBQWdCLEdBQUcsbUNBQW1DO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSwrQ0FBK0MsY0FBYztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsS0FBSztBQUNqRTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsS0FBSztBQUMxRDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msd0NBQXdDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7OztBQU1EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLEdBQUc7QUFDMUU7QUFDQTtBQUNBLFVBQVU7QUFDViw4REFBOEQsR0FBRztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsaUJBQWlCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLFVBQVU7QUFDeEQ7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QyxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUUsaUJBQWlCLEVBQUUsR0FBRztBQUMvRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELFdBQVc7QUFDdkUsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxlQUFlO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxRQUFRO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLG9CQUFvQixrQkFBa0I7QUFDdEMsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLDBDQUEwQyxRQUFRO0FBQ2xEO0FBQ0E7QUFDQSxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLHVCQUF1Qix3QkFBd0IsYUFBYSx1REFBdUQ7QUFDbkg7QUFDQSwyQ0FBMkMsaUNBQWlDLEdBQUc7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixpQkFBaUIsRUFBRSxHQUFHO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSxHQUFHO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsS0FBSztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sNkJBQTZCLGVBQWU7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix3QkFBd0IsRUFBRSxNQUFNLEVBQUUsdUJBQXVCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw2QkFBNkIsZUFBZTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsUUFBUTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0UsS0FBSztBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7O0FBT0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7Ozs7O0FBTUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsTUFBTSxFQUFFLHNCQUFzQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHFCQUFxQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7OztBQUtEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFLEtBQUs7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7Ozs7Ozs7O0FBUUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLDBCQUEwQixpQkFBaUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLDBCQUEwQixpQkFBaUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUk7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOLG1CQUFtQixRQUFRO0FBQzNCLG9CQUFvQixRQUFRO0FBQzVCLHFCQUFxQixZQUFZO0FBQ2pD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHlCQUF5QjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGdDQUFnQztBQUN6QztBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNENBQVcsY0FBYyw0Q0FBVztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxtRkFBc0I7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QSw0QkFBNEIsWUFBWTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsV0FBVyxRQUFRLGFBQWEsK0NBQStDLE1BQU07QUFDOUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsWUFBWSxNQUFNLE1BQU0scUNBQXFDLDZCQUE2QjtBQUN6SDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0Esa0RBQWtELGtDQUFrQztBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsWUFBWSxJQUFxQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSx3QkFBd0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtB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QUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0hBQStILDRCQUE0QjtBQUMzSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxJQUFJO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILElBQUk7QUFDSjtBQVVFO0FBQ0Y7Ozs7Ozs7Ozs7Ozs7OztBQ3R1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0RixhQUFhO0FBQ3pHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrREFBK0Q7O0FBRS9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYTtBQUNiOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhO0FBQ2IsYUFBYTs7QUFFYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7O0FBRWpCOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGtCQUFrQixlQUFlO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0Isd0JBQXdCO0FBQzFDOztBQUVBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNB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QUFRLENBQUNwSyxhQUFhLENBQUMsTUFBTSxDQUFDO0FBQ3REazZDLGVBQWUsQ0FBQzc1QyxJQUFJLEdBQ2xCLG1FQUFtRSxDQUFDLENBQUM7QUFDdkU2NUMsZUFBZSxDQUFDLzVDLEdBQUcsR0FBRyxZQUFZO0FBQ2xDaUssUUFBUSxDQUFDNnZDLElBQUksQ0FBQzk0QixXQUFXLENBQUMrNEIsZUFBZSxDQUFDO0FBQzFDO0FBQ0EsTUFBTUMsSUFBSSxHQUFHaEIsd0RBQW1CLENBQUMvdUMsUUFBUSxDQUFDQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUM3RTh2QyxJQUFJLENBQUNFLE1BQU0sZUFDVDM2QywwREFBQTtFQUFLLGNBQVc7QUFBYSxnQkFDM0JBLDBEQUFBLENBQUMyNUMsaURBQVE7RUFBQ25CLEtBQUssRUFBRUEsK0NBQUtBO0FBQUMsZ0JBQ3JCeDRDLDBEQUFBLENBQUMrNUMsdUJBQXVCO0VBQUNDLFlBQVksRUFBRTtJQUFFOTRCLElBQUksRUFBRTtFQUFhO0FBQUUsQ0FBRSxDQUN4RCxDQUNQLENBQ1AsQ0FBQyxDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL2lzLXByb3AtdmFsaWQvZGlzdC9lbW90aW9uLWlzLXByb3AtdmFsaWQuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL21lbW9pemUvZGlzdC9lbW90aW9uLW1lbW9pemUuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL3N0eWxpcy9kaXN0L3N0eWxpcy5icm93c2VyLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZmxvYXRpbmctdWkvcmVhY3QvZGlzdC9mbG9hdGluZy11aS5yZWFjdC5lc20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHBkZi1saWIvZm9udGtpdC9kaXN0L2ZvbnRraXQuZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHBkZi1saWIvc3RhbmRhcmQtZm9udHMvZXMvRW5jb2RpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHBkZi1saWIvc3RhbmRhcmQtZm9udHMvZXMvRm9udC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcGRmLWxpYi9zdGFuZGFyZC1mb250cy9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcGRmLWxpYi9zdGFuZGFyZC1mb250cy9lcy91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcGRmLWxpYi91cG5nL1VQTkcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXJpYS1oaWRkZW4vZGlzdC9lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9UaXRsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9Cb3JkZXJSZXNpemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvRGVmYXVsdFNpZ25hdHVyZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QZGZIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvUGRmWm9vbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QbGFjZWhvbGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QbGFjZWhvbGRlckJvcmRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9QbGFjZWhvbGRlclR5cGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvUHJldk5leHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvUmVuZGVyQWxsUGRmUGFnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9SZW5kZXJQZGYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29tcG9uZW50cy9wZGYvU2lnblBhZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9jb21wb25lbnRzL3BkZi9TaWduZXJMaXN0Q29tcG9uZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbXBvbmVudHMvcGRmL1ZlcmlmeUVtYWlsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbnN0YW50L1V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2NvbnN0YW50L2FwcGluZm8uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvY29uc3RhbnQvY29uc3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvanNvbi9wbGFuc0Fyci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wYWdlcy9QZGZSZXF1ZXN0RmlsZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcHJpbWl0aXZlcy9BbGVydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL0xvYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9wcmltaXRpdmVzL01vZGFsVWkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcmVkdXgvcmVkdWNlcnMvU2hvd1RlbmFudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9yZWR1eC9yZWR1Y2Vycy9Ub3VyU3RlcHNSZWR1Y2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3JlZHV4L3JlZHVjZXJzL2luZm9SZWR1Y2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL3JlZHV4L3JlZHVjZXJzL3Nob3dIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvcmVkdXgvc3RvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvc2NyaXB0L2kxOG4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY2xzeC9kaXN0L2Nsc3guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY25idWlsZGVyL2VzbS9jbmIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2Flcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvY2lwaGVyLWNvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2NvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2VuYy1iYXNlNjQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2VuYy11dGY4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NyeXB0by1qcy9ldnBrZGYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL2htYWMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3J5cHRvLWpzL21kNS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jcnlwdG8tanMvc2hhMS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL2JsYWNrLWFscGhhLmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL21hdXZlLmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL3Zpb2xldC5jc3MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9kaXN0L3JlYWN0LWRhdGVwaWNrZXIuY3NzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2luZGV4LmNzcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9zdHlsZXMvb3BlbnNpZ25kcml2ZS5jc3MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvc3R5bGVzL3NpZ25hdHVyZS5jc3MiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2dldFVybC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL25vZGVfbW9kdWxlcy9yZWR1eC9lcy9yZWR1eC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vc3JjL2Fzc2V0cy9pbWFnZXMvbG9nby5wbmciLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZmlsZS1zYXZlci9kaXN0L0ZpbGVTYXZlci5taW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9jb21tYW5kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2ZvY3VzSW5zaWRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvZm9jdXNJc0hpZGRlbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L2ZvY3VzU29sdmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvZm9jdXNhYmxlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L21vdmVGb2N1c0luc2lkZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3JldHVybi1mb2N1cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3NpYmxpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9zb2x2ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9ET011dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2FsbC1hZmZlY3RlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2FycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvYXV0by1mb2N1cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2NvcnJlY3RGb2N1cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL2ZpcnN0Rm9jdXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9nZXRBY3RpdmVFbGVtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvaXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9wYXJlbnRpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy9zYWZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2ZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbHMvdGFiT3JkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZm9jdXMtbG9jay9kaXN0L2VzMjAxNS91dGlscy90YWJVdGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3V0aWxzL3RhYmJhYmxlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9mb2N1cy1vdXRsaW5lLW1hbmFnZXIvZm9jdXMtb3V0bGluZS1tYW5hZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2dldC1ub25jZS9kaXN0L2VzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9kaXN0L2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzLmNqcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9ob2lzdC1ub24tcmVhY3Qtc3RhdGljcy9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9odG1sLXBhcnNlLXN0cmluZ2lmeS9kaXN0L2h0bWwtcGFyc2Utc3RyaW5naWZ5Lm1vZHVsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9sb2Rhc2guZGVib3VuY2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWR6LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIta3cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1seS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLW1hLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItcHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1zYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXRuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hei5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLWJkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jYS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2NzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS1jaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZHYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWF1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tY2EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1nYi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWllLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLW56LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tc2cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLWRvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtbXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy11cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9maWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2Z5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWRldmEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nb20tbGF0bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2d1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oaS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oeS1hbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2lkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC1jaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvamEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9qdi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2thLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2tuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva28uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS1rbXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rdS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbGIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbHYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21pLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tcy1teS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9teS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25iLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC1iZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9vYy1sbmMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wYS1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3BsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcHQtYnIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3JvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcnUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2kuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3EuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zci1jeXJsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGV0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGwtcGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bS1sYXRuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHptLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdWctY24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXotbGF0bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3V6LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdmkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS94LXBzZXVkby5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3lvLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtY24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1oay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLW1vLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtdHcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS8gc3luYyBeXFwuXFwvLiokIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21vbWVudC9tb21lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL2RlZmxhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvaW5mbGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvc3RyaW5ncy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jcmMzMi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2RlZmxhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9nemhlYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9tZXNzYWdlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3RyZWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvenN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9BbmFseXRpY3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQW5vbnltb3VzVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQ2xvdWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQ29yZU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvQ3J5cHRvQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9FdmVudEVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvRXZlbnR1YWxseVF1ZXVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0ZhY2Vib29rVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvSW5zdGFsbGF0aW9uQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9MaXZlUXVlcnlDbGllbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvTGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5kZWZhdWx0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL0xvY2FsRGF0YXN0b3JlVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvT2JqZWN0U3RhdGVNdXRhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvT2ZmbGluZVF1ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlQUNMLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlQ0xQLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlQ29uZmlnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlRXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VGaWxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlR2VvUG9pbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VIb29rcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUluc3RhbGxhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZUxpdmVRdWVyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZU9wLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlUG9seWdvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZVF1ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlUmVsYXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUGFyc2VSb2xlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlU2NoZW1hLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1BhcnNlU2Vzc2lvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9QYXJzZVVzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvUHVzaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9SRVNUQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9TaW5nbGVJbnN0YW5jZVN0YXRlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9Tb2NrZXQud2VhcHAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9TdG9yYWdlQ29udHJvbGxlci5icm93c2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvU3RvcmFnZUNvbnRyb2xsZXIucmVhY3QtbmF0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1N0b3JhZ2VDb250cm9sbGVyLndlYXBwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1Rhc2tRdWV1ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9VbmlxdWVJbnN0YW5jZVN0YXRlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9XZWJTb2NrZXRDb250cm9sbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL1hoci53ZWFwcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9hcnJheUNvbnRhaW5zT2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL2NhbkJlU2VyaWFsaXplZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9kZWNvZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvZW5jb2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL2VxdWFscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9lc2NhcGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvaXNSZXZvY2FibGVTZXNzaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL3BhcnNlRGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci9wcm9taXNlVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGFyc2UvbGliL2Jyb3dzZXIvdW5pcXVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BhcnNlL2xpYi9icm93c2VyL3Vuc2F2ZWRDaGlsZHJlbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wYXJzZS9saWIvYnJvd3Nlci91dWlkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkRvY3VtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkRvY3VtZW50T3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZFbWJlZGRlZEZpbGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGRW1iZWRkZWRQYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERkZvbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGSW1hZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvUERGSmF2YVNjcmlwdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9QREZQYWdlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1BERlBhZ2VPcHRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL1N0YW5kYXJkRm9udHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvY29sb3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Vycm9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERkJ1dHRvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERkNoZWNrQm94LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGRHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZGaWVsZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERkZvcm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvZm9ybS9QREZPcHRpb25MaXN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vUERGUmFkaW9Hcm91cC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERlNpZ25hdHVyZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL1BERlRleHRGaWVsZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9mb3JtL2FwcGVhcmFuY2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2Zvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvaW1hZ2UvYWxpZ25tZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2ltYWdlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL29iamVjdHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvb3BlcmF0aW9ucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS9vcGVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvcm90YXRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL3NpemVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvYXBpL3N2Z1BhdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvdGV4dC9hbGlnbm1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9hcGkvdGV4dC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2FwaS90ZXh0L2xheW91dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvUERGQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvUERGT2JqZWN0Q29waWVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvQnV0dG9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvQ2hlY2tCb3guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9DaG9pY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9Db21ib0JveC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb0ZpZWxkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvRm9ybS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb0xpc3RCb3guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9Ob25UZXJtaW5hbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb1B1c2hCdXR0b24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL1BERkFjcm9SYWRpb0J1dHRvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb1NpZ25hdHVyZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vUERGQWNyb1Rlcm1pbmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS9QREZBY3JvVGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYWNyb2Zvcm0vZmxhZ3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fjcm9mb3JtL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hY3JvZm9ybS91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9BcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hbm5vdGF0aW9uL0JvcmRlclN0eWxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9hbm5vdGF0aW9uL1BERkFubm90YXRpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Fubm90YXRpb24vUERGV2lkZ2V0QW5ub3RhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9mbGFncy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvYW5ub3RhdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZG9jdW1lbnQvUERGQ3Jvc3NSZWZTZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9kb2N1bWVudC9QREZIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2RvY3VtZW50L1BERlRyYWlsZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2RvY3VtZW50L1BERlRyYWlsZXJEaWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvQ01hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0N1c3RvbUZvbnRFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0N1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0ZpbGVFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0ZvbnRGbGFncy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0phdmFTY3JpcHRFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL0pwZWdFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL1BERlBhZ2VFbWJlZGRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvZW1iZWRkZXJzL1BuZ0VtYmVkZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9lbWJlZGRlcnMvU3RhbmRhcmRGb250RW1iZWRkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2Vycm9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL2ludGVyYWN0aXZlL1ZpZXdlclByZWZlcmVuY2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERkFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERkJvb2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGRGljdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZIZXhTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGSW52YWxpZE9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZOYW1lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERk51bGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGTnVtYmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERk9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZSYXdTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29iamVjdHMvUERGUmVmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9vYmplY3RzL1BERlN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb2JqZWN0cy9QREZTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL29wZXJhdG9ycy9QREZPcGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvb3BlcmF0b3JzL1BERk9wZXJhdG9yTmFtZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3BhcnNlci9CYXNlUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9wYXJzZXIvQnl0ZVN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERk9iamVjdFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERk9iamVjdFN0cmVhbVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERlBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvcGFyc2VyL1BERlhSZWZTdHJlYW1QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvQXNjaWk4NVN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9Bc2NpaUhleFN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9EZWNvZGVTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvRmxhdGVTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvTFpXU3RyZWFtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJlYW1zL1J1bkxlbmd0aFN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RyZWFtcy9TdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cmVhbXMvZGVjb2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zdHJ1Y3R1cmVzL1BERkNhdGFsb2cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGQ29udGVudFN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZDcm9zc1JlZlN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZGbGF0ZVN0cmVhbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvc3RydWN0dXJlcy9QREZPYmplY3RTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGUGFnZUxlYWYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N0cnVjdHVyZXMvUERGUGFnZVRyZWUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9DaGFyQ29kZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9EZWxpbWl0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvSXJyZWd1bGFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvS2V5d29yZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3N5bnRheC9OdW1lcmljLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvY29yZS9zeW50YXgvV2hpdGVzcGFjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL2NvcmUvd3JpdGVycy9QREZTdHJlYW1Xcml0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy9jb3JlL3dyaXRlcnMvUERGV3JpdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy90eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL0NhY2hlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvYXJyYXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvYXN5bmMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9iYXNlNjQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9lcnJvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL251bWJlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9vYmplY3RzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvcGRmRG9jRW5jb2RpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9wbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9ybmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9lcy91dGlscy9zdHJpbmdzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3BkZi1saWIvZXMvdXRpbHMvdW5pY29kZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGYtbGliL2VzL3V0aWxzL3ZhbGlkYXRvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcGRmLWxpYi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3ByaW50LWpzL2Rpc3QvcHJpbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvaGFzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZS1yZXNpemFibGUvbGliL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlLXJlc2l6YWJsZS9saWIvcmVzaXplci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1jbGllbnRzaWRlLWVmZmVjdC9saWIvaW5kZXguZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtY29uZmV0dGkvZGlzdC9yZWFjdC1jb25mZXR0aS5taW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9kaXN0L3JlYWN0LWRhdGVwaWNrZXIubWluLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvYWRkTGVhZGluZ1plcm9zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZGVmYXVsdExvY2FsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2RlZmF1bHRPcHRpb25zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2Zvcm1hdHRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9mb3JtYXQvbGlnaHRGb3JtYXR0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL3Byb3RlY3RlZFRva2Vucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGREYXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZEhvdXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZE1pbGxpc2Vjb25kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRNaW51dGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZE1vbnRocy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRRdWFydGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9hZGRTZWNvbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFdlZWtzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2FkZFllYXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb25zdHJ1Y3RGcm9tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZEYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZNb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lbmRPZldlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZW5kT2ZZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2Zvcm1hdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldERheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXREYXlPZlllYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGF5c0luTW9udGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0RGVmYXVsdE9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SG91cnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPRGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldElTT1dlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0SVNPV2Vla1llYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0TWludXRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRNb250aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRRdWFydGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFNlY29uZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZ2V0VGltZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9nZXRXZWVrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFdlZWtZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2dldFllYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNBZnRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0JlZm9yZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc0RhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNFcXVhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVEYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lTW9udGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNTYW1lUXVhcnRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9pc1NhbWVZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzVmFsaWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNXaXRoaW5JbnRlcnZhbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZEZvcm1hdExvbmdGbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZExvY2FsaXplRm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRNYXRjaEZuLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdExvbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvbG9jYWxpemUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvbWF0Y2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbWF4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL21pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZUlTTy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL1BhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL1NldHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0FNUE1NaWRuaWdodFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvQU1QTVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF0ZVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRGF5T2ZZZWFyUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9EYXlQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0RheVBlcmlvZFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvRXJhUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9FeHRlbmRlZFllYXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0ZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIwVG8xMVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSG91cjB0bzIzUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Ib3VyMVRvMjRQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0hvdXIxdG8xMlBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPRGF5UGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9JU09UaW1lem9uZVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPVGltZXpvbmVXaXRoWlBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPV2Vla1BhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvSVNPV2Vla1llYXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsRGF5UGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9Mb2NhbFdlZWtQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL0xvY2FsV2Vla1llYXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL01pbnV0ZVBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvTW9udGhQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1F1YXJ0ZXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1NlY29uZFBhcnNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9wYXJzZS9fbGliL3BhcnNlcnMvU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9TdGFuZEFsb25lTW9udGhQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1N0YW5kQWxvbmVRdWFydGVyUGFyc2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3BhcnNlL19saWIvcGFyc2Vycy9UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1RpbWVzdGFtcFNlY29uZHNQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi9wYXJzZXJzL1llYXJQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvcGFyc2UvX2xpYi91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0RGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldEhvdXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldElTT0RheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRJU09XZWVrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldE1pbnV0ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0TW9udGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0UXVhcnRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zZXRTZWNvbmRzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3NldFdlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc2V0WWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mRGF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZJU09XZWVrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZJU09XZWVrWWVhci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy9zdGFydE9mTW9udGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZlF1YXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZldlZWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3RhcnRPZldlZWtZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZZZWFyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YkRheXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvc3ViTW9udGhzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YlF1YXJ0ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YldlZWtzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N1YlllYXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRhdGVwaWNrZXIvbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3RvRGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL25vZGVfbW9kdWxlcy9kYXRlLWZucy90cmFuc3Bvc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20uZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2NsaWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvYnVpbGQvY2pzL0RyYWdnYWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvYnVpbGQvY2pzL0RyYWdnYWJsZUNvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy9janMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy91dGlscy9kb21GbnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy91dGlscy9nZXRQcmVmaXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy91dGlscy9sb2cuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZHJhZ2dhYmxlL2J1aWxkL2Nqcy91dGlscy9wb3NpdGlvbkZucy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kcmFnZ2FibGUvYnVpbGQvY2pzL3V0aWxzL3NoaW1zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRyYWdnYWJsZS9ub2RlX21vZHVsZXMvY2xzeC9kaXN0L2Nsc3gubS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mYXN0LWNvbXBhcmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9BdXRvRm9jdXNJbnNpZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9Db21iaW5hdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L0ZvY3VzR3VhcmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9GcmVlRm9jdXNJbnNpZGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9Mb2NrLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvTW92ZUZvY3VzSW5zaWRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvVHJhcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L1VJLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9tZWRpdW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZm9jdXMtbG9jay9kaXN0L2VzMjAxNS9uYW5vLWV2ZW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1mb2N1cy1sb2NrL2Rpc3QvZXMyMDE1L3Njb3BlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXNlLWZvY3VzLXNjb3BlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXNlLWZvY3VzLXN0YXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWZvY3VzLWxvY2svZGlzdC9lczIwMTUvdXRpbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1oZWxtZXQvZXMvSGVsbWV0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1vbmNsaWNrb3V0c2lkZS9kaXN0L3JlYWN0LW9uY2xpY2tvdXRzaWRlLmVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlbW92ZS1zY3JvbGwtYmFyL2Rpc3QvZXMyMDE1L2NvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsLWJhci9kaXN0L2VzMjAxNS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC1iYXIvZGlzdC9lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC1iYXIvZGlzdC9lczIwMTUvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9Db21iaW5hdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsL2Rpc3QvZXMyMDE1L1NpZGVFZmZlY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9VSS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZW1vdmUtc2Nyb2xsL2Rpc3QvZXMyMDE1L2FnZ3Jlc2l2ZUNhcHR1cmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9oYW5kbGVTY3JvbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9tZWRpdW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcmVtb3ZlLXNjcm9sbC9kaXN0L2VzMjAxNS9zaWRlY2FyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJuZC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc2Nyb2xsYmFycy1jdXN0b20vZGlzdC9yc2MuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXNpZGUtZWZmZWN0L2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1zaWduYXR1cmUtY2FudmFzL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXN0eWxlLXNpbmdsZXRvbi9kaXN0L2VzMjAxNS9jb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc3R5bGUtc2luZ2xldG9uL2Rpc3QvZXMyMDE1L2hvb2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3Qtc3R5bGUtc2luZ2xldG9uL2Rpc3QvZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXN0eWxlLXNpbmdsZXRvbi9kaXN0L2VzMjAxNS9zaW5nbGV0b24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LWpzeC1ydW50aW1lLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC9qc3gtcnVudGltZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9kaXN0L3JlYWN0b3VyLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvY2xhc3NuYW1lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3RvdXIvbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdG91ci9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVnZXgtcGFyc2VyL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtc21vb3RoL2Rpc3QvYW5jaG9yU2Nyb2xsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Njcm9sbC1zbW9vdGgvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtc21vb3RoL2Rpc3Qvb2JzZXJ2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtc21vb3RoL2Rpc3Qvc2Nyb2xsU21vb3RoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3Njcm9sbC1zbW9vdGgvZGlzdC90b29scy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zY3JvbGxwYXJlbnQvc2Nyb2xscGFyZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3NoYWxsb3dlcXVhbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kYXRlcGlja2VyL2Rpc3QvcmVhY3QtZGF0ZXBpY2tlci5jc3M/M2Y0MyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9pbmRleC5jc3M/MDUzOCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9zdHlsZXMvb3BlbnNpZ25kcml2ZS5jc3M/NjNkMCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL3NyYy9zdHlsZXMvc2lnbmF0dXJlLmNzcz9jNjNjIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvc3R5bGVkLWNvbXBvbmVudHMvZGlzdC9zdHlsZWQtY29tcG9uZW50cy5icm93c2VyLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zdHlsZWQtY29tcG9uZW50cy9ub2RlX21vZHVsZXMvQGVtb3Rpb24vdW5pdGxlc3MvZGlzdC91bml0bGVzcy5icm93c2VyLmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy90YWJiYWJsZS9kaXN0L2luZGV4LmVzbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy90cmltLWNhbnZhcy9idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91c2UtY2FsbGJhY2stcmVmL2Rpc3QvZXMyMDE1L2Fzc2lnblJlZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91c2UtY2FsbGJhY2stcmVmL2Rpc3QvZXMyMDE1L3VzZU1lcmdlUmVmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1jYWxsYmFjay1yZWYvZGlzdC9lczIwMTUvdXNlUmVmLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1zaWRlY2FyL2Rpc3QvZXMyMDE1L2V4cG9ydHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXNlLXNpZGVjYXIvZGlzdC9lczIwMTUvbWVkaXVtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS13aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3dpdGgtc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvbWF4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL21kNS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9uYXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvbmlsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3BhcnNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3JlZ2V4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci9zaGExLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92MS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92MVRvVjYuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2NvbW1vbmpzLWJyb3dzZXIvdjM1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3Y1LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3Y2LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9jb21tb25qcy1icm93c2VyL3Y2VG9WMS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92Ny5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvY29tbW9uanMtYnJvd3Nlci92ZXJzaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3ZvaWQtZWxlbWVudHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvd2FybmluZy93YXJuaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3dzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvem9vbS1sZXZlbC9kaXN0L3pvb20tbGV2ZWwuZXNtLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL2lnbm9yZWR8RDpcXG9mZmljZUFwcGxpY2F0aW9uc1xcT3Blbi1zaWduXFx1cGRhdGVIaWdoUmVzb2x1dGlvblxcT3BlblNpZ25cXGFwcHNcXE9wZW5TaWduXFxub2RlX21vZHVsZXNcXGNyeXB0by1qc3xjcnlwdG8iLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9mcm9tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvY29uY2F0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2V2ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmlsdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZmluZC1pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvcmVkdWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3BsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL21hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL251bWJlci9pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZnJlZXplLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvc2V0LWludGVydmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvc2V0LXRpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS93ZWFrLW1hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvdG9QcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL3RvUHJvcGVydHlLZXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvYWN0dWFsL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2FjdHVhbC9zeW1ib2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2FjdHVhbC9zeW1ib2wvaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2FjdHVhbC9zeW1ib2wvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS9mcm9tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS9pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9jb25jYXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9ldmVyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvZmluZC1pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9maW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2Zvci1lYWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2luY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2luZGV4LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL2tleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2FycmF5L3ZpcnR1YWwvbWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL3JlZHVjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9zbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC9zb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9hcnJheS92aXJ0dWFsL3NwbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvYXJyYXkvdmlydHVhbC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2Z1bmN0aW9uL3ZpcnR1YWwvYmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvYmluZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvY29uY2F0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9ldmVyeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvZmlsdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9maW5kLWluZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9maW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL2luc3RhbmNlL21hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2UvcmVkdWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9zbGljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2Uvc29ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvaW5zdGFuY2Uvc3BsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9pbnN0YW5jZS9zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvanNvbi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL21hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvbnVtYmVyL2lzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL29iamVjdC9lbnRyaWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3QvZnJlZXplLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9vYmplY3QvZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvb2JqZWN0L2tleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3BhcnNlLWludC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvcHJvbWlzZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvc2V0L2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9zdHJpbmcvdmlydHVhbC9pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvc3RyaW5nL3ZpcnR1YWwvc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2VzL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZXMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy9zeW1ib2wvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9lcy93ZWFrLW1hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZmVhdHVyZXMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZmVhdHVyZXMvc3ltYm9sL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mZWF0dXJlcy9zeW1ib2wvaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2Z1bGwvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvZnVsbC9zeW1ib2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2Z1bGwvc3ltYm9sL2l0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9mdWxsL3N5bWJvbC90by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hLWNhbGxhYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYS1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYS1zZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1ub24tZXh0ZW5zaWJsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktcmVkdWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktc2V0LWxlbmd0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LXNsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvYXJyYXktc29ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY2FsbGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jbGFzc29mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jcmVhdGUtaXRlci1yZXN1bHQtb2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kYXRlLXRvLWlzby1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW5zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2RlbGV0ZS1wcm9wZXJ0eS1vci10aHJvdy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9kb2VzLW5vdC1leGNlZWQtc2FmZS1pbnRlZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbnZpcm9ubWVudC1mZi12ZXJzaW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtaWUtb3ItZWRnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLWlvcy1wZWJibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1pb3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1ub2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtd2Vib3Mtd2Via2l0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vudmlyb25tZW50LXY4LXZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lbnZpcm9ubWVudC13ZWJraXQtdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Vudmlyb25tZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZXJyb3Itc3RhY2stY2xlYXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9leHBvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mYWlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3Nvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1kaXJlY3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LWpzb24tcmVwbGFjZXItZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nZXQtbWV0aG9kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvZ2V0LXNldC1yZWNvcmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9nbG9iYWwtdGhpcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2h0bWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pZTgtZG9tLWRlZmluZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pbnN0YWxsLWVycm9yLWNhdXNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLWFycmF5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pcy1jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtcG9zc2libGUtcHJvdG90eXBlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXMtcHVyZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9pdGVyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL21hcC1oZWxwZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbWF0aC10cnVuYy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL21pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWlzLWV4dGVuc2libGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvb3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9wYXRoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3F1ZXVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2FmZS1nZXQtYnVpbHQtaW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zY2hlZHVsZXJzLWZpeC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1jbG9uZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1kaWZmZXJlbmNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaW50ZXJzZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWlzLWRpc2pvaW50LWZyb20uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtaXMtc3Vic2V0LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWlzLXN1cGVyc2V0LW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LWl0ZXJhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtbWV0aG9kLWFjY2VwdC1zZXQtbGlrZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC1zaXplLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtc3ltbWV0cmljLWRpZmZlcmVuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NldC11bmlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N0cmluZy1wYWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zdHJpbmctcmVwZWF0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3ltYm9sLWRlZmluZS10by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy9zeW1ib2wtaXMtcmVnaXN0ZXJlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3N5bWJvbC1pcy13ZWxsLWtub3duLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvc3ltYm9sLXJlZ2lzdHJ5LWRldGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3Rhc2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3RyeS10by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy91aWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3dlYWstbWFwLWJhc2ljLWRldGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLXdyYXBwZWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFnZ3JlZ2F0ZS1lcnJvci5jb25zdHJ1Y3Rvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hZ2dyZWdhdGUtZXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmV2ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5maW5kLWluZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LmZpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LnNsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmRhdGUudG8tanNvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5kYXRlLnRvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLmpzb24udG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5tYXAuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMubWFwLmdyb3VwLWJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5tYXRoLnRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuY3JlYXRlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmVudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmZyZWV6ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LmtleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmFueS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLmNhdGNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMucHJvbWlzZS5yYWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UucmVqZWN0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnByb21pc2UucmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5wcm9taXNlLndpdGgtcmVzb2x2ZXJzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnJlZmxlY3QudG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LmRpZmZlcmVuY2UudjIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LmludGVyc2VjdGlvbi52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuaXMtZGlzam9pbnQtZnJvbS52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuaXMtc3Vic2V0LW9mLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC5pcy1zdXBlcnNldC1vZi52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc2V0LnN5bW1ldHJpYy1kaWZmZXJlbmNlLnYyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnNldC51bmlvbi52Mi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuZm9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5oYXMtaW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmlzLWNvbmNhdC1zcHJlYWRhYmxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLmtleS1mb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoLWFsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLnJlcGxhY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuc3BlY2llcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wuc3BsaXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wudG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lcy5zeW1ib2wudW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMud2Vhay1tYXAuY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXMud2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LmZ1bmN0aW9uLm1ldGFkYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuYXN5bmMtZGlzcG9zZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLmN1c3RvbS1tYXRjaGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuZGlzcG9zZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXJlZ2lzdGVyZWQtc3ltYm9sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtcmVnaXN0ZXJlZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLmlzLXdlbGwta25vd24tc3ltYm9sLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtd2VsbC1rbm93bi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLm1hdGNoZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5tZXRhZGF0YS1rZXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy9lc25leHQuc3ltYm9sLm9ic2VydmFibGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5wYXR0ZXJuLW1hdGNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucmVwbGFjZS1hbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL3dlYi5zZXQtaW50ZXJ2YWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL21vZHVsZXMvd2ViLnNldC10aW1lb3V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9tb2R1bGVzL3dlYi50aW1lcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS9mcm9tLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS92aXJ0dWFsL2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS92aXJ0dWFsL2Zvci1lYWNoLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvdmlydHVhbC9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvYXJyYXkvdmlydHVhbC92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9iaW5kLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvY29uY2F0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZW50cmllcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2V2ZXJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmlsdGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmluZC1pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2ZpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2YuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9rZXlzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvbWFwLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvcmVkdWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc2xpY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zb3J0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc3BsaWNlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2Uvc3RhcnRzLXdpdGguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9qc29uL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL21hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL251bWJlci9pcy1pbnRlZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2VudHJpZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZnJlZXplLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2tleXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9wcm9taXNlL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvc2V0LWludGVydmFsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvc2V0LXRpbWVvdXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zZXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zeW1ib2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zeW1ib2wvaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvY29yZS1qcy1wdXJlL3N0YWJsZS9zeW1ib2wvdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMtcHVyZS9zdGFibGUvd2Vhay1tYXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1ByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1Byb3BlcnR5S2V5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZmxvYXRpbmctdWkvY29yZS9kaXN0L2Zsb2F0aW5nLXVpLmNvcmUubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9kb20vZGlzdC9mbG9hdGluZy11aS5kb20ubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9yZWFjdC1kb20vZGlzdC9mbG9hdGluZy11aS5yZWFjdC1kb20ubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9yZWFjdC9kaXN0L2Zsb2F0aW5nLXVpLnJlYWN0LnV0aWxzLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AZmxvYXRpbmctdWkvdXRpbHMvZGlzdC9mbG9hdGluZy11aS51dGlscy5kb20ubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS91dGlscy9kaXN0L2Zsb2F0aW5nLXVpLnV0aWxzLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcHJpbWl0aXZlL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1hcnJvdy9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29sbGVjdGlvbi9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1jb250ZXh0L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1kaXJlY3Rpb24vZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWRpc21pc3NhYmxlLWxheWVyL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51L2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1mb2N1cy1ndWFyZHMvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LWZvY3VzLXNjb3BlL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1pZC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtbWVudS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtcG9wcGVyL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wb3J0YWwvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXByZXNlbmNlL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC1wcmltaXRpdmUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL3JlYWN0LXJvdmluZy1mb2N1cy9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3Qtc2xvdC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZi9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWNvbnRyb2xsYWJsZS1zdGF0ZS9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLWVzY2FwZS1rZXlkb3duL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9yZWFjdC11c2UtbGF5b3V0LWVmZmVjdC9kaXN0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvcmVhY3QtdXNlLXNpemUvZGlzdC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvQXNhcFF1ZXVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL0ByZWFjdC1kbmQvYXNhcC9kaXN0L1Jhd1Rhc2suanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvVGFza0ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvYXNhcC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVhY3QtZG5kL2FzYXAvZGlzdC9tYWtlUmVxdWVzdENhbGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9hc2FwL2Rpc3QvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvQHJlYWN0LWRuZC9pbnZhcmlhbnQvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9AcmVkdXhqcy90b29sa2l0L2Rpc3QvcmVkdXgtdG9vbGtpdC5tb2Rlcm4ubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy9hZGFwdGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMvZmV0Y2guanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvc0Vycm9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zSGVhZGVycy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3RyYW5zZm9ybURhdGEuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2Vudi9kYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL0F4aW9zVVJMU2VhcmNoUGFyYW1zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2JpbmQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tcG9zZVNpZ25hbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0Fic29sdXRlVVJMLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc1VSTFNhbWVPcmlnaW4uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbnVsbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VQcm90b2NvbC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wcm9ncmVzc0V2ZW50UmVkdWNlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9yZXNvbHZlQ29uZmlnLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwZWVkb21ldGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwcmVhZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90aHJvdHRsZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy90b0Zvcm1EYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3RvVVJMRW5jb2RlZEZvcm0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdHJhY2tTdHJlYW0uanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2NsYXNzZXMvQmxvYi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9jbGFzc2VzL0Zvcm1EYXRhLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2NsYXNzZXMvVVJMU2VhcmNoUGFyYW1zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9icm93c2VyL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9wbGF0Zm9ybS9jb21tb24vdXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9jbHN4L2Rpc3QvY2xzeC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZGVxdWFsL2Rpc3QvaW5kZXgubWpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC9iZWdpbkRyYWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL2Ryb3AuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL2VuZERyYWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL2RyYWdEcm9wL2hvdmVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvbG9jYWwvc2V0Q2xpZW50T2Zmc2V0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvYWN0aW9ucy9kcmFnRHJvcC9wdWJsaXNoRHJhZ1NvdXJjZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L2FjdGlvbnMvZHJhZ0Ryb3AvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9hY3Rpb25zL3JlZ2lzdHJ5LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvY2xhc3Nlcy9EcmFnRHJvcE1hbmFnZXJJbXBsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvY2xhc3Nlcy9EcmFnRHJvcE1vbml0b3JJbXBsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvY2xhc3Nlcy9IYW5kbGVyUmVnaXN0cnlJbXBsLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvY29udHJhY3RzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvY3JlYXRlRHJhZ0Ryb3BNYW5hZ2VyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvaW50ZXJmYWNlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3JlZHVjZXJzL2RpcnR5SGFuZGxlcklkcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3JlZHVjZXJzL2RyYWdPZmZzZXQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9yZWR1Y2Vycy9kcmFnT3BlcmF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvcmVkdWNlcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC9yZWR1Y2Vycy9yZWZDb3VudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3JlZHVjZXJzL3N0YXRlSWQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC91dGlscy9jb29yZHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC91dGlscy9kaXJ0aW5lc3MuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvZG5kLWNvcmUvZGlzdC91dGlscy9lcXVhbGl0eS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3V0aWxzL2dldE5leHRVbmlxdWVJZC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9kbmQtY29yZS9kaXN0L3V0aWxzL2pzX3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2RuZC1jb3JlL2Rpc3QvdXRpbHMvbWF0Y2hlc1R5cGUuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaTE4bmV4dC1icm93c2VyLWxhbmd1YWdlZGV0ZWN0b3IvZGlzdC9lc20vaTE4bmV4dEJyb3dzZXJMYW5ndWFnZURldGVjdG9yLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL2kxOG5leHQvZGlzdC9lc20vaTE4bmV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9pZGIta2V5dmFsL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvaW1tZXIvZGlzdC9pbW1lci5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbWFrZS1jYW5jZWxsYWJsZS1wcm9taXNlL2Rpc3QvZXNtL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL21ha2UtZXZlbnQtcHJvcHMvZGlzdC9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvbWVyZ2UtcmVmcy9kaXN0L2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9wZGZqcy1kaXN0L2J1aWxkL3BkZi5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9Ccm93c2VyRGV0ZWN0b3IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9FbnRlckxlYXZlQ291bnRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L0hUTUw1QmFja2VuZEltcGwuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9Nb25vdG9uaWNJbnRlcnBvbGFudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L05hdGl2ZURyYWdTb3VyY2VzL05hdGl2ZURyYWdTb3VyY2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9OYXRpdmVEcmFnU291cmNlcy9nZXREYXRhRnJvbURhdGFUcmFuc2Zlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L05hdGl2ZURyYWdTb3VyY2VzL2luZGV4LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvTmF0aXZlRHJhZ1NvdXJjZXMvbmF0aXZlVHlwZXNDb25maWcuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9OYXRpdmVUeXBlcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L09mZnNldFV0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC1odG1sNS1iYWNrZW5kL2Rpc3QvT3B0aW9uc1JlYWRlci5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L2dldEVtcHR5SW1hZ2UuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG5kLWh0bWw1LWJhY2tlbmQvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQtaHRtbDUtYmFja2VuZC9kaXN0L3V0aWxzL2pzX3V0aWxzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRuZC9kaXN0L2NvcmUvRG5kQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kbmQvZGlzdC9jb3JlL0RuZFByb3ZpZGVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9JMThuZXh0UHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL1RyYW5zLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9UcmFuc1dpdGhvdXRDb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy9UcmFuc2xhdGlvbi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvY29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvZGVmYXVsdHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL2kxOG5JbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL2luaXRSZWFjdEkxOG5leHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL3VuZXNjYXBlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy91c2VTU1IuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtaTE4bmV4dC9kaXN0L2VzL3VzZVRyYW5zbGF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWkxOG5leHQvZGlzdC9lcy91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvd2l0aFNTUi5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pMThuZXh0L2Rpc3QvZXMvd2l0aFRyYW5zbGF0aW9uLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9Eb2N1bWVudC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vRG9jdW1lbnRDb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9MaW5rU2VydmljZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vTWVzc2FnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vUGFnZS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vUGFnZUNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1BhZ2UvQW5ub3RhdGlvbkxheWVyLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9QYWdlL0NhbnZhcy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vUGFnZS9UZXh0TGF5ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL1Bhc3N3b3JkUmVzcG9uc2VzLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9TdHJ1Y3RUcmVlLmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9TdHJ1Y3RUcmVlSXRlbS5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vc2hhcmVkL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vc2hhcmVkL2hvb2tzL3VzZURvY3VtZW50Q29udGV4dC5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wZGYvZGlzdC9lc20vc2hhcmVkL2hvb2tzL3VzZVBhZ2VDb250ZXh0LmpzIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXBkZi9kaXN0L2VzbS9zaGFyZWQvaG9va3MvdXNlUmVzb2x2ZXIuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL3NoYXJlZC9zdHJ1Y3RUcmVlVXRpbHMuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvcmVhY3QtcGRmL2Rpc3QvZXNtL3NoYXJlZC91dGlscy5qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9kaXN0L3JlYWN0LXJlZHV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWR1eC10aHVuay9kaXN0L3JlZHV4LXRodW5rLm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZWR1eC9kaXN0L3JlZHV4Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9yZXNlbGVjdC9kaXN0L3Jlc2VsZWN0Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS8uL25vZGVfbW9kdWxlcy9zaWduYXR1cmVfcGFkL2Rpc3Qvc2lnbmF0dXJlX3BhZC5tanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdGlueS1pbnZhcmlhbnQvZGlzdC9lc20vdGlueS1pbnZhcmlhbnQuanMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvY3JlYXRlIGZha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL1B1YmxpY1RlbXBsYXRlL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvd2VicGFjay9ydW50aW1lL25vZGUgbW9kdWxlIGRlY29yYXRvciIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvcHVibGljUGF0aCIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly9QdWJsaWNUZW1wbGF0ZS93ZWJwYWNrL3J1bnRpbWUvbm9uY2UiLCJ3ZWJwYWNrOi8vUHVibGljVGVtcGxhdGUvLi9zcmMvc2NyaXB0L1B1YmxpY1RlbXBsYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiUHVibGljVGVtcGxhdGVcIiwgW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiUHVibGljVGVtcGxhdGVcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiUHVibGljVGVtcGxhdGVcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCAoKSA9PiB7XG5yZXR1cm4gIiwiaW1wb3J0IG1lbW9pemUgZnJvbSAnQGVtb3Rpb24vbWVtb2l6ZSc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxudmFyIHJlYWN0UHJvcHNSZWdleCA9IC9eKChjaGlsZHJlbnxkYW5nZXJvdXNseVNldElubmVySFRNTHxrZXl8cmVmfGF1dG9Gb2N1c3xkZWZhdWx0VmFsdWV8ZGVmYXVsdENoZWNrZWR8aW5uZXJIVE1MfHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ3xzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmd8dmFsdWVMaW5rfGFiYnJ8YWNjZXB0fGFjY2VwdENoYXJzZXR8YWNjZXNzS2V5fGFjdGlvbnxhbGxvd3xhbGxvd1VzZXJNZWRpYXxhbGxvd1BheW1lbnRSZXF1ZXN0fGFsbG93RnVsbFNjcmVlbnxhbGxvd1RyYW5zcGFyZW5jeXxhbHR8YXN5bmN8YXV0b0NvbXBsZXRlfGF1dG9QbGF5fGNhcHR1cmV8Y2VsbFBhZGRpbmd8Y2VsbFNwYWNpbmd8Y2hhbGxlbmdlfGNoYXJTZXR8Y2hlY2tlZHxjaXRlfGNsYXNzSUR8Y2xhc3NOYW1lfGNvbHN8Y29sU3Bhbnxjb250ZW50fGNvbnRlbnRFZGl0YWJsZXxjb250ZXh0TWVudXxjb250cm9sc3xjb250cm9sc0xpc3R8Y29vcmRzfGNyb3NzT3JpZ2lufGRhdGF8ZGF0ZVRpbWV8ZGVjb2Rpbmd8ZGVmYXVsdHxkZWZlcnxkaXJ8ZGlzYWJsZWR8ZGlzYWJsZVBpY3R1cmVJblBpY3R1cmV8ZGlzYWJsZVJlbW90ZVBsYXliYWNrfGRvd25sb2FkfGRyYWdnYWJsZXxlbmNUeXBlfGVudGVyS2V5SGludHxmb3JtfGZvcm1BY3Rpb258Zm9ybUVuY1R5cGV8Zm9ybU1ldGhvZHxmb3JtTm9WYWxpZGF0ZXxmb3JtVGFyZ2V0fGZyYW1lQm9yZGVyfGhlYWRlcnN8aGVpZ2h0fGhpZGRlbnxoaWdofGhyZWZ8aHJlZkxhbmd8aHRtbEZvcnxodHRwRXF1aXZ8aWR8aW5wdXRNb2RlfGludGVncml0eXxpc3xrZXlQYXJhbXN8a2V5VHlwZXxraW5kfGxhYmVsfGxhbmd8bGlzdHxsb2FkaW5nfGxvb3B8bG93fG1hcmdpbkhlaWdodHxtYXJnaW5XaWR0aHxtYXh8bWF4TGVuZ3RofG1lZGlhfG1lZGlhR3JvdXB8bWV0aG9kfG1pbnxtaW5MZW5ndGh8bXVsdGlwbGV8bXV0ZWR8bmFtZXxub25jZXxub1ZhbGlkYXRlfG9wZW58b3B0aW11bXxwYXR0ZXJufHBsYWNlaG9sZGVyfHBsYXlzSW5saW5lfHBvc3RlcnxwcmVsb2FkfHByb2ZpbGV8cmFkaW9Hcm91cHxyZWFkT25seXxyZWZlcnJlclBvbGljeXxyZWx8cmVxdWlyZWR8cmV2ZXJzZWR8cm9sZXxyb3dzfHJvd1NwYW58c2FuZGJveHxzY29wZXxzY29wZWR8c2Nyb2xsaW5nfHNlYW1sZXNzfHNlbGVjdGVkfHNoYXBlfHNpemV8c2l6ZXN8c2xvdHxzcGFufHNwZWxsQ2hlY2t8c3JjfHNyY0RvY3xzcmNMYW5nfHNyY1NldHxzdGFydHxzdGVwfHN0eWxlfHN1bW1hcnl8dGFiSW5kZXh8dGFyZ2V0fHRpdGxlfHRyYW5zbGF0ZXx0eXBlfHVzZU1hcHx2YWx1ZXx3aWR0aHx3bW9kZXx3cmFwfGFib3V0fGRhdGF0eXBlfGlubGlzdHxwcmVmaXh8cHJvcGVydHl8cmVzb3VyY2V8dHlwZW9mfHZvY2FifGF1dG9DYXBpdGFsaXplfGF1dG9Db3JyZWN0fGF1dG9TYXZlfGNvbG9yfGluY3JlbWVudGFsfGZhbGxiYWNrfGluZXJ0fGl0ZW1Qcm9wfGl0ZW1TY29wZXxpdGVtVHlwZXxpdGVtSUR8aXRlbVJlZnxvbnxvcHRpb258cmVzdWx0c3xzZWN1cml0eXx1bnNlbGVjdGFibGV8YWNjZW50SGVpZ2h0fGFjY3VtdWxhdGV8YWRkaXRpdmV8YWxpZ25tZW50QmFzZWxpbmV8YWxsb3dSZW9yZGVyfGFscGhhYmV0aWN8YW1wbGl0dWRlfGFyYWJpY0Zvcm18YXNjZW50fGF0dHJpYnV0ZU5hbWV8YXR0cmlidXRlVHlwZXxhdXRvUmV2ZXJzZXxhemltdXRofGJhc2VGcmVxdWVuY3l8YmFzZWxpbmVTaGlmdHxiYXNlUHJvZmlsZXxiYm94fGJlZ2lufGJpYXN8Ynl8Y2FsY01vZGV8Y2FwSGVpZ2h0fGNsaXB8Y2xpcFBhdGhVbml0c3xjbGlwUGF0aHxjbGlwUnVsZXxjb2xvckludGVycG9sYXRpb258Y29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyc3xjb2xvclByb2ZpbGV8Y29sb3JSZW5kZXJpbmd8Y29udGVudFNjcmlwdFR5cGV8Y29udGVudFN0eWxlVHlwZXxjdXJzb3J8Y3h8Y3l8ZHxkZWNlbGVyYXRlfGRlc2NlbnR8ZGlmZnVzZUNvbnN0YW50fGRpcmVjdGlvbnxkaXNwbGF5fGRpdmlzb3J8ZG9taW5hbnRCYXNlbGluZXxkdXJ8ZHh8ZHl8ZWRnZU1vZGV8ZWxldmF0aW9ufGVuYWJsZUJhY2tncm91bmR8ZW5kfGV4cG9uZW50fGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWR8ZmlsbHxmaWxsT3BhY2l0eXxmaWxsUnVsZXxmaWx0ZXJ8ZmlsdGVyUmVzfGZpbHRlclVuaXRzfGZsb29kQ29sb3J8Zmxvb2RPcGFjaXR5fGZvY3VzYWJsZXxmb250RmFtaWx5fGZvbnRTaXplfGZvbnRTaXplQWRqdXN0fGZvbnRTdHJldGNofGZvbnRTdHlsZXxmb250VmFyaWFudHxmb250V2VpZ2h0fGZvcm1hdHxmcm9tfGZyfGZ4fGZ5fGcxfGcyfGdseXBoTmFtZXxnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbHxnbHlwaE9yaWVudGF0aW9uVmVydGljYWx8Z2x5cGhSZWZ8Z3JhZGllbnRUcmFuc2Zvcm18Z3JhZGllbnRVbml0c3xoYW5naW5nfGhvcml6QWR2WHxob3Jpek9yaWdpblh8aWRlb2dyYXBoaWN8aW1hZ2VSZW5kZXJpbmd8aW58aW4yfGludGVyY2VwdHxrfGsxfGsyfGszfGs0fGtlcm5lbE1hdHJpeHxrZXJuZWxVbml0TGVuZ3RofGtlcm5pbmd8a2V5UG9pbnRzfGtleVNwbGluZXN8a2V5VGltZXN8bGVuZ3RoQWRqdXN0fGxldHRlclNwYWNpbmd8bGlnaHRpbmdDb2xvcnxsaW1pdGluZ0NvbmVBbmdsZXxsb2NhbHxtYXJrZXJFbmR8bWFya2VyTWlkfG1hcmtlclN0YXJ0fG1hcmtlckhlaWdodHxtYXJrZXJVbml0c3xtYXJrZXJXaWR0aHxtYXNrfG1hc2tDb250ZW50VW5pdHN8bWFza1VuaXRzfG1hdGhlbWF0aWNhbHxtb2RlfG51bU9jdGF2ZXN8b2Zmc2V0fG9wYWNpdHl8b3BlcmF0b3J8b3JkZXJ8b3JpZW50fG9yaWVudGF0aW9ufG9yaWdpbnxvdmVyZmxvd3xvdmVybGluZVBvc2l0aW9ufG92ZXJsaW5lVGhpY2tuZXNzfHBhbm9zZTF8cGFpbnRPcmRlcnxwYXRoTGVuZ3RofHBhdHRlcm5Db250ZW50VW5pdHN8cGF0dGVyblRyYW5zZm9ybXxwYXR0ZXJuVW5pdHN8cG9pbnRlckV2ZW50c3xwb2ludHN8cG9pbnRzQXRYfHBvaW50c0F0WXxwb2ludHNBdFp8cHJlc2VydmVBbHBoYXxwcmVzZXJ2ZUFzcGVjdFJhdGlvfHByaW1pdGl2ZVVuaXRzfHJ8cmFkaXVzfHJlZlh8cmVmWXxyZW5kZXJpbmdJbnRlbnR8cmVwZWF0Q291bnR8cmVwZWF0RHVyfHJlcXVpcmVkRXh0ZW5zaW9uc3xyZXF1aXJlZEZlYXR1cmVzfHJlc3RhcnR8cmVzdWx0fHJvdGF0ZXxyeHxyeXxzY2FsZXxzZWVkfHNoYXBlUmVuZGVyaW5nfHNsb3BlfHNwYWNpbmd8c3BlY3VsYXJDb25zdGFudHxzcGVjdWxhckV4cG9uZW50fHNwZWVkfHNwcmVhZE1ldGhvZHxzdGFydE9mZnNldHxzdGREZXZpYXRpb258c3RlbWh8c3RlbXZ8c3RpdGNoVGlsZXN8c3RvcENvbG9yfHN0b3BPcGFjaXR5fHN0cmlrZXRocm91Z2hQb3NpdGlvbnxzdHJpa2V0aHJvdWdoVGhpY2tuZXNzfHN0cmluZ3xzdHJva2V8c3Ryb2tlRGFzaGFycmF5fHN0cm9rZURhc2hvZmZzZXR8c3Ryb2tlTGluZWNhcHxzdHJva2VMaW5lam9pbnxzdHJva2VNaXRlcmxpbWl0fHN0cm9rZU9wYWNpdHl8c3Ryb2tlV2lkdGh8c3VyZmFjZVNjYWxlfHN5c3RlbUxhbmd1YWdlfHRhYmxlVmFsdWVzfHRhcmdldFh8dGFyZ2V0WXx0ZXh0QW5jaG9yfHRleHREZWNvcmF0aW9ufHRleHRSZW5kZXJpbmd8dGV4dExlbmd0aHx0b3x0cmFuc2Zvcm18dTF8dTJ8dW5kZXJsaW5lUG9zaXRpb258dW5kZXJsaW5lVGhpY2tuZXNzfHVuaWNvZGV8dW5pY29kZUJpZGl8dW5pY29kZVJhbmdlfHVuaXRzUGVyRW18dkFscGhhYmV0aWN8dkhhbmdpbmd8dklkZW9ncmFwaGljfHZNYXRoZW1hdGljYWx8dmFsdWVzfHZlY3RvckVmZmVjdHx2ZXJzaW9ufHZlcnRBZHZZfHZlcnRPcmlnaW5YfHZlcnRPcmlnaW5ZfHZpZXdCb3h8dmlld1RhcmdldHx2aXNpYmlsaXR5fHdpZHRoc3x3b3JkU3BhY2luZ3x3cml0aW5nTW9kZXx4fHhIZWlnaHR8eDF8eDJ8eENoYW5uZWxTZWxlY3Rvcnx4bGlua0FjdHVhdGV8eGxpbmtBcmNyb2xlfHhsaW5rSHJlZnx4bGlua1JvbGV8eGxpbmtTaG93fHhsaW5rVGl0bGV8eGxpbmtUeXBlfHhtbEJhc2V8eG1sbnN8eG1sbnNYbGlua3x4bWxMYW5nfHhtbFNwYWNlfHl8eTF8eTJ8eUNoYW5uZWxTZWxlY3Rvcnx6fHpvb21BbmRQYW58Zm9yfGNsYXNzfGF1dG9mb2N1cyl8KChbRGRdW0FhXVtUdF1bQWFdfFtBYV1bUnJdW0lpXVtBYV18eCktLiopKSQvOyAvLyBodHRwczovL2VzYmVuY2guY29tL2JlbmNoLzViZmVlNjhhNGNkN2U2MDA5ZWY2MWQyM1xuXG52YXIgaXNQcm9wVmFsaWQgPSAvKiAjX19QVVJFX18gKi9tZW1vaXplKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHJldHVybiByZWFjdFByb3BzUmVnZXgudGVzdChwcm9wKSB8fCBwcm9wLmNoYXJDb2RlQXQoMCkgPT09IDExMVxuICAvKiBvICovXG4gICYmIHByb3AuY2hhckNvZGVBdCgxKSA9PT0gMTEwXG4gIC8qIG4gKi9cbiAgJiYgcHJvcC5jaGFyQ29kZUF0KDIpIDwgOTE7XG59XG4vKiBaKzEgKi9cbik7XG5cbmV4cG9ydCB7IGlzUHJvcFZhbGlkIGFzIGRlZmF1bHQgfTtcbiIsImZ1bmN0aW9uIG1lbW9pemUoZm4pIHtcbiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICBpZiAoY2FjaGVbYXJnXSA9PT0gdW5kZWZpbmVkKSBjYWNoZVthcmddID0gZm4oYXJnKTtcbiAgICByZXR1cm4gY2FjaGVbYXJnXTtcbiAgfTtcbn1cblxuZXhwb3J0IHsgbWVtb2l6ZSBhcyBkZWZhdWx0IH07XG4iLCJmdW5jdGlvbiBzdHlsaXNfbWluIChXKSB7XG4gIGZ1bmN0aW9uIE0oZCwgYywgZSwgaCwgYSkge1xuICAgIGZvciAodmFyIG0gPSAwLCBiID0gMCwgdiA9IDAsIG4gPSAwLCBxLCBnLCB4ID0gMCwgSyA9IDAsIGssIHUgPSBrID0gcSA9IDAsIGwgPSAwLCByID0gMCwgSSA9IDAsIHQgPSAwLCBCID0gZS5sZW5ndGgsIEogPSBCIC0gMSwgeSwgZiA9ICcnLCBwID0gJycsIEYgPSAnJywgRyA9ICcnLCBDOyBsIDwgQjspIHtcbiAgICAgIGcgPSBlLmNoYXJDb2RlQXQobCk7XG4gICAgICBsID09PSBKICYmIDAgIT09IGIgKyBuICsgdiArIG0gJiYgKDAgIT09IGIgJiYgKGcgPSA0NyA9PT0gYiA/IDEwIDogNDcpLCBuID0gdiA9IG0gPSAwLCBCKyssIEorKyk7XG5cbiAgICAgIGlmICgwID09PSBiICsgbiArIHYgKyBtKSB7XG4gICAgICAgIGlmIChsID09PSBKICYmICgwIDwgciAmJiAoZiA9IGYucmVwbGFjZShOLCAnJykpLCAwIDwgZi50cmltKCkubGVuZ3RoKSkge1xuICAgICAgICAgIHN3aXRjaCAoZykge1xuICAgICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIGNhc2UgNTk6XG4gICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGYgKz0gZS5jaGFyQXQobCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZyA9IDU5O1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChnKSB7XG4gICAgICAgICAgY2FzZSAxMjM6XG4gICAgICAgICAgICBmID0gZi50cmltKCk7XG4gICAgICAgICAgICBxID0gZi5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgayA9IDE7XG5cbiAgICAgICAgICAgIGZvciAodCA9ICsrbDsgbCA8IEI7KSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoZyA9IGUuY2hhckNvZGVBdChsKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTIzOlxuICAgICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDEyNTpcbiAgICAgICAgICAgICAgICAgIGstLTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA0NzpcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZyA9IGUuY2hhckNvZGVBdChsICsgMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzpcbiAgICAgICAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHUgPSBsICsgMTsgdSA8IEo7ICsrdSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUuY2hhckNvZGVBdCh1KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNDIgPT09IGcgJiYgNDIgPT09IGUuY2hhckNvZGVBdCh1IC0gMSkgJiYgbCArIDIgIT09IHUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IHUgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNDcgPT09IGcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IHUgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbCA9IHU7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA5MTpcbiAgICAgICAgICAgICAgICAgIGcrKztcblxuICAgICAgICAgICAgICAgIGNhc2UgNDA6XG4gICAgICAgICAgICAgICAgICBnKys7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgICAgICAgICBmb3IgKDsgbCsrIDwgSiAmJiBlLmNoYXJDb2RlQXQobCkgIT09IGc7KSB7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICgwID09PSBrKSBicmVhaztcbiAgICAgICAgICAgICAgbCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBrID0gZS5zdWJzdHJpbmcodCwgbCk7XG4gICAgICAgICAgICAwID09PSBxICYmIChxID0gKGYgPSBmLnJlcGxhY2UoY2EsICcnKS50cmltKCkpLmNoYXJDb2RlQXQoMCkpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHEpIHtcbiAgICAgICAgICAgICAgY2FzZSA2NDpcbiAgICAgICAgICAgICAgICAwIDwgciAmJiAoZiA9IGYucmVwbGFjZShOLCAnJykpO1xuICAgICAgICAgICAgICAgIGcgPSBmLmNoYXJDb2RlQXQoMSk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGcpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOlxuICAgICAgICAgICAgICAgICAgY2FzZSAxMDk6XG4gICAgICAgICAgICAgICAgICBjYXNlIDExNTpcbiAgICAgICAgICAgICAgICAgIGNhc2UgNDU6XG4gICAgICAgICAgICAgICAgICAgIHIgPSBjO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgciA9IE87XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgayA9IE0oYywgciwgaywgZywgYSArIDEpO1xuICAgICAgICAgICAgICAgIHQgPSBrLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAwIDwgQSAmJiAociA9IFgoTywgZiwgSSksIEMgPSBIKDMsIGssIHIsIGMsIEQsIHosIHQsIGcsIGEsIGgpLCBmID0gci5qb2luKCcnKSwgdm9pZCAwICE9PSBDICYmIDAgPT09ICh0ID0gKGsgPSBDLnRyaW0oKSkubGVuZ3RoKSAmJiAoZyA9IDAsIGsgPSAnJykpO1xuICAgICAgICAgICAgICAgIGlmICgwIDwgdCkgc3dpdGNoIChnKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDExNTpcbiAgICAgICAgICAgICAgICAgICAgZiA9IGYucmVwbGFjZShkYSwgZWEpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDEwMDpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTA5OlxuICAgICAgICAgICAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICAgICAgICAgICAgayA9IGYgKyAneycgKyBrICsgJ30nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgY2FzZSAxMDc6XG4gICAgICAgICAgICAgICAgICAgIGYgPSBmLnJlcGxhY2UoZmEsICckMSAkMicpO1xuICAgICAgICAgICAgICAgICAgICBrID0gZiArICd7JyArIGsgKyAnfSc7XG4gICAgICAgICAgICAgICAgICAgIGsgPSAxID09PSB3IHx8IDIgPT09IHcgJiYgTCgnQCcgKyBrLCAzKSA/ICdALXdlYmtpdC0nICsgayArICdAJyArIGsgOiAnQCcgKyBrO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgayA9IGYgKyBrLCAxMTIgPT09IGggJiYgKGsgPSAocCArPSBrLCAnJykpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBrID0gJyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBrID0gTShjLCBYKGMsIGYsIEkpLCBrLCBoLCBhICsgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEYgKz0gaztcbiAgICAgICAgICAgIGsgPSBJID0gciA9IHUgPSBxID0gMDtcbiAgICAgICAgICAgIGYgPSAnJztcbiAgICAgICAgICAgIGcgPSBlLmNoYXJDb2RlQXQoKytsKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxMjU6XG4gICAgICAgICAgY2FzZSA1OTpcbiAgICAgICAgICAgIGYgPSAoMCA8IHIgPyBmLnJlcGxhY2UoTiwgJycpIDogZikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKDEgPCAodCA9IGYubGVuZ3RoKSkgc3dpdGNoICgwID09PSB1ICYmIChxID0gZi5jaGFyQ29kZUF0KDApLCA0NSA9PT0gcSB8fCA5NiA8IHEgJiYgMTIzID4gcSkgJiYgKHQgPSAoZiA9IGYucmVwbGFjZSgnICcsICc6JykpLmxlbmd0aCksIDAgPCBBICYmIHZvaWQgMCAhPT0gKEMgPSBIKDEsIGYsIGMsIGQsIEQsIHosIHAubGVuZ3RoLCBoLCBhLCBoKSkgJiYgMCA9PT0gKHQgPSAoZiA9IEMudHJpbSgpKS5sZW5ndGgpICYmIChmID0gJ1xceDAwXFx4MDAnKSwgcSA9IGYuY2hhckNvZGVBdCgwKSwgZyA9IGYuY2hhckNvZGVBdCgxKSwgcSkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSA2NDpcbiAgICAgICAgICAgICAgICBpZiAoMTA1ID09PSBnIHx8IDk5ID09PSBnKSB7XG4gICAgICAgICAgICAgICAgICBHICs9IGYgKyBlLmNoYXJBdChsKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIDU4ICE9PSBmLmNoYXJDb2RlQXQodCAtIDEpICYmIChwICs9IFAoZiwgcSwgZywgZi5jaGFyQ29kZUF0KDIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBJID0gciA9IHUgPSBxID0gMDtcbiAgICAgICAgICAgIGYgPSAnJztcbiAgICAgICAgICAgIGcgPSBlLmNoYXJDb2RlQXQoKytsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGcpIHtcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICA0NyA9PT0gYiA/IGIgPSAwIDogMCA9PT0gMSArIHEgJiYgMTA3ICE9PSBoICYmIDAgPCBmLmxlbmd0aCAmJiAociA9IDEsIGYgKz0gJ1xceDAwJyk7XG4gICAgICAgICAgMCA8IEEgKiBZICYmIEgoMCwgZiwgYywgZCwgRCwgeiwgcC5sZW5ndGgsIGgsIGEsIGgpO1xuICAgICAgICAgIHogPSAxO1xuICAgICAgICAgIEQrKztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDU5OlxuICAgICAgICBjYXNlIDEyNTpcbiAgICAgICAgICBpZiAoMCA9PT0gYiArIG4gKyB2ICsgbSkge1xuICAgICAgICAgICAgeisrO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgeisrO1xuICAgICAgICAgIHkgPSBlLmNoYXJBdChsKTtcblxuICAgICAgICAgIHN3aXRjaCAoZykge1xuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgICAgaWYgKDAgPT09IG4gKyBtICsgYikgc3dpdGNoICh4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSA0NDpcbiAgICAgICAgICAgICAgICBjYXNlIDU4OlxuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICBjYXNlIDMyOlxuICAgICAgICAgICAgICAgICAgeSA9ICcnO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgMzIgIT09IGcgJiYgKHkgPSAnICcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHkgPSAnXFxcXDAnO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgeSA9ICdcXFxcZic7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICB5ID0gJ1xcXFx2JztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICAgIDAgPT09IG4gKyBiICsgbSAmJiAociA9IEkgPSAxLCB5ID0gJ1xcZicgKyB5KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMTA4OlxuICAgICAgICAgICAgICBpZiAoMCA9PT0gbiArIGIgKyBtICsgRSAmJiAwIDwgdSkgc3dpdGNoIChsIC0gdSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgIDExMiA9PT0geCAmJiA1OCA9PT0gZS5jaGFyQ29kZUF0KGwgLSAzKSAmJiAoRSA9IHgpO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgMTExID09PSBLICYmIChFID0gSyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNTg6XG4gICAgICAgICAgICAgIDAgPT09IG4gKyBiICsgbSAmJiAodSA9IGwpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA0NDpcbiAgICAgICAgICAgICAgMCA9PT0gYiArIHYgKyBuICsgbSAmJiAociA9IDEsIHkgKz0gJ1xccicpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgICAgIDAgPT09IGIgJiYgKG4gPSBuID09PSBnID8gMCA6IDAgPT09IG4gPyBnIDogbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDkxOlxuICAgICAgICAgICAgICAwID09PSBuICsgYiArIHYgJiYgbSsrO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA5MzpcbiAgICAgICAgICAgICAgMCA9PT0gbiArIGIgKyB2ICYmIG0tLTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNDE6XG4gICAgICAgICAgICAgIDAgPT09IG4gKyBiICsgbSAmJiB2LS07XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgICBpZiAoMCA9PT0gbiArIGIgKyBtKSB7XG4gICAgICAgICAgICAgICAgaWYgKDAgPT09IHEpIHN3aXRjaCAoMiAqIHggKyAzICogSykge1xuICAgICAgICAgICAgICAgICAgY2FzZSA1MzM6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBxID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdisrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNjQ6XG4gICAgICAgICAgICAgIDAgPT09IGIgKyB2ICsgbiArIG0gKyB1ICsgayAmJiAoayA9IDEpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgIGNhc2UgNDc6XG4gICAgICAgICAgICAgIGlmICghKDAgPCBuICsgbSArIHYpKSBzd2l0Y2ggKGIpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKDIgKiBnICsgMyAqIGUuY2hhckNvZGVBdChsICsgMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzU6XG4gICAgICAgICAgICAgICAgICAgICAgYiA9IDQ3O1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjIwOlxuICAgICAgICAgICAgICAgICAgICAgIHQgPSBsLCBiID0gNDI7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgICAgICAgIDQ3ID09PSBnICYmIDQyID09PSB4ICYmIHQgKyAyICE9PSBsICYmICgzMyA9PT0gZS5jaGFyQ29kZUF0KHQgKyAyKSAmJiAocCArPSBlLnN1YnN0cmluZyh0LCBsICsgMSkpLCB5ID0gJycsIGIgPSAwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIDAgPT09IGIgJiYgKGYgKz0geSk7XG4gICAgICB9XG5cbiAgICAgIEsgPSB4O1xuICAgICAgeCA9IGc7XG4gICAgICBsKys7XG4gICAgfVxuXG4gICAgdCA9IHAubGVuZ3RoO1xuXG4gICAgaWYgKDAgPCB0KSB7XG4gICAgICByID0gYztcbiAgICAgIGlmICgwIDwgQSAmJiAoQyA9IEgoMiwgcCwgciwgZCwgRCwgeiwgdCwgaCwgYSwgaCksIHZvaWQgMCAhPT0gQyAmJiAwID09PSAocCA9IEMpLmxlbmd0aCkpIHJldHVybiBHICsgcCArIEY7XG4gICAgICBwID0gci5qb2luKCcsJykgKyAneycgKyBwICsgJ30nO1xuXG4gICAgICBpZiAoMCAhPT0gdyAqIEUpIHtcbiAgICAgICAgMiAhPT0gdyB8fCBMKHAsIDIpIHx8IChFID0gMCk7XG5cbiAgICAgICAgc3dpdGNoIChFKSB7XG4gICAgICAgICAgY2FzZSAxMTE6XG4gICAgICAgICAgICBwID0gcC5yZXBsYWNlKGhhLCAnOi1tb3otJDEnKSArIHA7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMTEyOlxuICAgICAgICAgICAgcCA9IHAucmVwbGFjZShRLCAnOjotd2Via2l0LWlucHV0LSQxJykgKyBwLnJlcGxhY2UoUSwgJzo6LW1vei0kMScpICsgcC5yZXBsYWNlKFEsICc6LW1zLWlucHV0LSQxJykgKyBwO1xuICAgICAgICB9XG5cbiAgICAgICAgRSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEcgKyBwICsgRjtcbiAgfVxuXG4gIGZ1bmN0aW9uIFgoZCwgYywgZSkge1xuICAgIHZhciBoID0gYy50cmltKCkuc3BsaXQoaWEpO1xuICAgIGMgPSBoO1xuICAgIHZhciBhID0gaC5sZW5ndGgsXG4gICAgICAgIG0gPSBkLmxlbmd0aDtcblxuICAgIHN3aXRjaCAobSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgICB2YXIgYiA9IDA7XG5cbiAgICAgICAgZm9yIChkID0gMCA9PT0gbSA/ICcnIDogZFswXSArICcgJzsgYiA8IGE7ICsrYikge1xuICAgICAgICAgIGNbYl0gPSBaKGQsIGNbYl0sIGUpLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgdiA9IGIgPSAwO1xuXG4gICAgICAgIGZvciAoYyA9IFtdOyBiIDwgYTsgKytiKSB7XG4gICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBtOyArK24pIHtcbiAgICAgICAgICAgIGNbdisrXSA9IFooZFtuXSArICcgJywgaFtiXSwgZSkudHJpbSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG4gIH1cblxuICBmdW5jdGlvbiBaKGQsIGMsIGUpIHtcbiAgICB2YXIgaCA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICAzMyA+IGggJiYgKGggPSAoYyA9IGMudHJpbSgpKS5jaGFyQ29kZUF0KDApKTtcblxuICAgIHN3aXRjaCAoaCkge1xuICAgICAgY2FzZSAzODpcbiAgICAgICAgcmV0dXJuIGMucmVwbGFjZShGLCAnJDEnICsgZC50cmltKCkpO1xuXG4gICAgICBjYXNlIDU4OlxuICAgICAgICByZXR1cm4gZC50cmltKCkgKyBjLnJlcGxhY2UoRiwgJyQxJyArIGQudHJpbSgpKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKDAgPCAxICogZSAmJiAwIDwgYy5pbmRleE9mKCdcXGYnKSkgcmV0dXJuIGMucmVwbGFjZShGLCAoNTggPT09IGQuY2hhckNvZGVBdCgwKSA/ICcnIDogJyQxJykgKyBkLnRyaW0oKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGQgKyBjO1xuICB9XG5cbiAgZnVuY3Rpb24gUChkLCBjLCBlLCBoKSB7XG4gICAgdmFyIGEgPSBkICsgJzsnLFxuICAgICAgICBtID0gMiAqIGMgKyAzICogZSArIDQgKiBoO1xuXG4gICAgaWYgKDk0NCA9PT0gbSkge1xuICAgICAgZCA9IGEuaW5kZXhPZignOicsIDkpICsgMTtcbiAgICAgIHZhciBiID0gYS5zdWJzdHJpbmcoZCwgYS5sZW5ndGggLSAxKS50cmltKCk7XG4gICAgICBiID0gYS5zdWJzdHJpbmcoMCwgZCkudHJpbSgpICsgYiArICc7JztcbiAgICAgIHJldHVybiAxID09PSB3IHx8IDIgPT09IHcgJiYgTChiLCAxKSA/ICctd2Via2l0LScgKyBiICsgYiA6IGI7XG4gICAgfVxuXG4gICAgaWYgKDAgPT09IHcgfHwgMiA9PT0gdyAmJiAhTChhLCAxKSkgcmV0dXJuIGE7XG5cbiAgICBzd2l0Y2ggKG0pIHtcbiAgICAgIGNhc2UgMTAxNTpcbiAgICAgICAgcmV0dXJuIDk3ID09PSBhLmNoYXJDb2RlQXQoMTApID8gJy13ZWJraXQtJyArIGEgKyBhIDogYTtcblxuICAgICAgY2FzZSA5NTE6XG4gICAgICAgIHJldHVybiAxMTYgPT09IGEuY2hhckNvZGVBdCgzKSA/ICctd2Via2l0LScgKyBhICsgYSA6IGE7XG5cbiAgICAgIGNhc2UgOTYzOlxuICAgICAgICByZXR1cm4gMTEwID09PSBhLmNoYXJDb2RlQXQoNSkgPyAnLXdlYmtpdC0nICsgYSArIGEgOiBhO1xuXG4gICAgICBjYXNlIDEwMDk6XG4gICAgICAgIGlmICgxMDAgIT09IGEuY2hhckNvZGVBdCg0KSkgYnJlYWs7XG5cbiAgICAgIGNhc2UgOTY5OlxuICAgICAgY2FzZSA5NDI6XG4gICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArIGE7XG5cbiAgICAgIGNhc2UgOTc4OlxuICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1vei0nICsgYSArIGE7XG5cbiAgICAgIGNhc2UgMTAxOTpcbiAgICAgIGNhc2UgOTgzOlxuICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1vei0nICsgYSArICctbXMtJyArIGEgKyBhO1xuXG4gICAgICBjYXNlIDg4MzpcbiAgICAgICAgaWYgKDQ1ID09PSBhLmNoYXJDb2RlQXQoOCkpIHJldHVybiAnLXdlYmtpdC0nICsgYSArIGE7XG4gICAgICAgIGlmICgwIDwgYS5pbmRleE9mKCdpbWFnZS1zZXQoJywgMTEpKSByZXR1cm4gYS5yZXBsYWNlKGphLCAnJDEtd2Via2l0LSQyJykgKyBhO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA5MzI6XG4gICAgICAgIGlmICg0NSA9PT0gYS5jaGFyQ29kZUF0KDQpKSBzd2l0Y2ggKGEuY2hhckNvZGVBdCg1KSkge1xuICAgICAgICAgIGNhc2UgMTAzOlxuICAgICAgICAgICAgcmV0dXJuICctd2Via2l0LWJveC0nICsgYS5yZXBsYWNlKCctZ3JvdycsICcnKSArICctd2Via2l0LScgKyBhICsgJy1tcy0nICsgYS5yZXBsYWNlKCdncm93JywgJ3Bvc2l0aXZlJykgKyBhO1xuXG4gICAgICAgICAgY2FzZSAxMTU6XG4gICAgICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1zLScgKyBhLnJlcGxhY2UoJ3NocmluaycsICduZWdhdGl2ZScpICsgYTtcblxuICAgICAgICAgIGNhc2UgOTg6XG4gICAgICAgICAgICByZXR1cm4gJy13ZWJraXQtJyArIGEgKyAnLW1zLScgKyBhLnJlcGxhY2UoJ2Jhc2lzJywgJ3ByZWZlcnJlZC1zaXplJykgKyBhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbXMtJyArIGEgKyBhO1xuXG4gICAgICBjYXNlIDk2NDpcbiAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgJy1tcy1mbGV4LScgKyBhICsgYTtcblxuICAgICAgY2FzZSAxMDIzOlxuICAgICAgICBpZiAoOTkgIT09IGEuY2hhckNvZGVBdCg4KSkgYnJlYWs7XG4gICAgICAgIGIgPSBhLnN1YnN0cmluZyhhLmluZGV4T2YoJzonLCAxNSkpLnJlcGxhY2UoJ2ZsZXgtJywgJycpLnJlcGxhY2UoJ3NwYWNlLWJldHdlZW4nLCAnanVzdGlmeScpO1xuICAgICAgICByZXR1cm4gJy13ZWJraXQtYm94LXBhY2snICsgYiArICctd2Via2l0LScgKyBhICsgJy1tcy1mbGV4LXBhY2snICsgYiArIGE7XG5cbiAgICAgIGNhc2UgMTAwNTpcbiAgICAgICAgcmV0dXJuIGthLnRlc3QoYSkgPyBhLnJlcGxhY2UoYWEsICc6LXdlYmtpdC0nKSArIGEucmVwbGFjZShhYSwgJzotbW96LScpICsgYSA6IGE7XG5cbiAgICAgIGNhc2UgMWUzOlxuICAgICAgICBiID0gYS5zdWJzdHJpbmcoMTMpLnRyaW0oKTtcbiAgICAgICAgYyA9IGIuaW5kZXhPZignLScpICsgMTtcblxuICAgICAgICBzd2l0Y2ggKGIuY2hhckNvZGVBdCgwKSArIGIuY2hhckNvZGVBdChjKSkge1xuICAgICAgICAgIGNhc2UgMjI2OlxuICAgICAgICAgICAgYiA9IGEucmVwbGFjZShHLCAndGInKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyMzI6XG4gICAgICAgICAgICBiID0gYS5yZXBsYWNlKEcsICd0Yi1ybCcpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIyMDpcbiAgICAgICAgICAgIGIgPSBhLnJlcGxhY2UoRywgJ2xyJyk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbXMtJyArIGIgKyBhO1xuXG4gICAgICBjYXNlIDEwMTc6XG4gICAgICAgIGlmICgtMSA9PT0gYS5pbmRleE9mKCdzdGlja3knLCA5KSkgYnJlYWs7XG5cbiAgICAgIGNhc2UgOTc1OlxuICAgICAgICBjID0gKGEgPSBkKS5sZW5ndGggLSAxMDtcbiAgICAgICAgYiA9ICgzMyA9PT0gYS5jaGFyQ29kZUF0KGMpID8gYS5zdWJzdHJpbmcoMCwgYykgOiBhKS5zdWJzdHJpbmcoZC5pbmRleE9mKCc6JywgNykgKyAxKS50cmltKCk7XG5cbiAgICAgICAgc3dpdGNoIChtID0gYi5jaGFyQ29kZUF0KDApICsgKGIuY2hhckNvZGVBdCg3KSB8IDApKSB7XG4gICAgICAgICAgY2FzZSAyMDM6XG4gICAgICAgICAgICBpZiAoMTExID4gYi5jaGFyQ29kZUF0KDgpKSBicmVhaztcblxuICAgICAgICAgIGNhc2UgMTE1OlxuICAgICAgICAgICAgYSA9IGEucmVwbGFjZShiLCAnLXdlYmtpdC0nICsgYikgKyAnOycgKyBhO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDIwNzpcbiAgICAgICAgICBjYXNlIDEwMjpcbiAgICAgICAgICAgIGEgPSBhLnJlcGxhY2UoYiwgJy13ZWJraXQtJyArICgxMDIgPCBtID8gJ2lubGluZS0nIDogJycpICsgJ2JveCcpICsgJzsnICsgYS5yZXBsYWNlKGIsICctd2Via2l0LScgKyBiKSArICc7JyArIGEucmVwbGFjZShiLCAnLW1zLScgKyBiICsgJ2JveCcpICsgJzsnICsgYTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhICsgJzsnO1xuXG4gICAgICBjYXNlIDkzODpcbiAgICAgICAgaWYgKDQ1ID09PSBhLmNoYXJDb2RlQXQoNSkpIHN3aXRjaCAoYS5jaGFyQ29kZUF0KDYpKSB7XG4gICAgICAgICAgY2FzZSAxMDU6XG4gICAgICAgICAgICByZXR1cm4gYiA9IGEucmVwbGFjZSgnLWl0ZW1zJywgJycpLCAnLXdlYmtpdC0nICsgYSArICctd2Via2l0LWJveC0nICsgYiArICctbXMtZmxleC0nICsgYiArIGE7XG5cbiAgICAgICAgICBjYXNlIDExNTpcbiAgICAgICAgICAgIHJldHVybiAnLXdlYmtpdC0nICsgYSArICctbXMtZmxleC1pdGVtLScgKyBhLnJlcGxhY2UoYmEsICcnKSArIGE7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICctd2Via2l0LScgKyBhICsgJy1tcy1mbGV4LWxpbmUtcGFjaycgKyBhLnJlcGxhY2UoJ2FsaWduLWNvbnRlbnQnLCAnJykucmVwbGFjZShiYSwgJycpICsgYTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA5NzM6XG4gICAgICBjYXNlIDk4OTpcbiAgICAgICAgaWYgKDQ1ICE9PSBhLmNoYXJDb2RlQXQoMykgfHwgMTIyID09PSBhLmNoYXJDb2RlQXQoNCkpIGJyZWFrO1xuXG4gICAgICBjYXNlIDkzMTpcbiAgICAgIGNhc2UgOTUzOlxuICAgICAgICBpZiAoITAgPT09IGxhLnRlc3QoZCkpIHJldHVybiAxMTUgPT09IChiID0gZC5zdWJzdHJpbmcoZC5pbmRleE9mKCc6JykgKyAxKSkuY2hhckNvZGVBdCgwKSA/IFAoZC5yZXBsYWNlKCdzdHJldGNoJywgJ2ZpbGwtYXZhaWxhYmxlJyksIGMsIGUsIGgpLnJlcGxhY2UoJzpmaWxsLWF2YWlsYWJsZScsICc6c3RyZXRjaCcpIDogYS5yZXBsYWNlKGIsICctd2Via2l0LScgKyBiKSArIGEucmVwbGFjZShiLCAnLW1vei0nICsgYi5yZXBsYWNlKCdmaWxsLScsICcnKSkgKyBhO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA5NjI6XG4gICAgICAgIGlmIChhID0gJy13ZWJraXQtJyArIGEgKyAoMTAyID09PSBhLmNoYXJDb2RlQXQoNSkgPyAnLW1zLScgKyBhIDogJycpICsgYSwgMjExID09PSBlICsgaCAmJiAxMDUgPT09IGEuY2hhckNvZGVBdCgxMykgJiYgMCA8IGEuaW5kZXhPZigndHJhbnNmb3JtJywgMTApKSByZXR1cm4gYS5zdWJzdHJpbmcoMCwgYS5pbmRleE9mKCc7JywgMjcpICsgMSkucmVwbGFjZShtYSwgJyQxLXdlYmtpdC0kMicpICsgYTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfVxuXG4gIGZ1bmN0aW9uIEwoZCwgYykge1xuICAgIHZhciBlID0gZC5pbmRleE9mKDEgPT09IGMgPyAnOicgOiAneycpLFxuICAgICAgICBoID0gZC5zdWJzdHJpbmcoMCwgMyAhPT0gYyA/IGUgOiAxMCk7XG4gICAgZSA9IGQuc3Vic3RyaW5nKGUgKyAxLCBkLmxlbmd0aCAtIDEpO1xuICAgIHJldHVybiBSKDIgIT09IGMgPyBoIDogaC5yZXBsYWNlKG5hLCAnJDEnKSwgZSwgYyk7XG4gIH1cblxuICBmdW5jdGlvbiBlYShkLCBjKSB7XG4gICAgdmFyIGUgPSBQKGMsIGMuY2hhckNvZGVBdCgwKSwgYy5jaGFyQ29kZUF0KDEpLCBjLmNoYXJDb2RlQXQoMikpO1xuICAgIHJldHVybiBlICE9PSBjICsgJzsnID8gZS5yZXBsYWNlKG9hLCAnIG9yICgkMSknKS5zdWJzdHJpbmcoNCkgOiAnKCcgKyBjICsgJyknO1xuICB9XG5cbiAgZnVuY3Rpb24gSChkLCBjLCBlLCBoLCBhLCBtLCBiLCB2LCBuLCBxKSB7XG4gICAgZm9yICh2YXIgZyA9IDAsIHggPSBjLCB3OyBnIDwgQTsgKytnKSB7XG4gICAgICBzd2l0Y2ggKHcgPSBTW2ddLmNhbGwoQiwgZCwgeCwgZSwgaCwgYSwgbSwgYiwgdiwgbiwgcSkpIHtcbiAgICAgICAgY2FzZSB2b2lkIDA6XG4gICAgICAgIGNhc2UgITE6XG4gICAgICAgIGNhc2UgITA6XG4gICAgICAgIGNhc2UgbnVsbDpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHggPSB3O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh4ICE9PSBjKSByZXR1cm4geDtcbiAgfVxuXG4gIGZ1bmN0aW9uIFQoZCkge1xuICAgIHN3aXRjaCAoZCkge1xuICAgICAgY2FzZSB2b2lkIDA6XG4gICAgICBjYXNlIG51bGw6XG4gICAgICAgIEEgPSBTLmxlbmd0aCA9IDA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGQpIFNbQSsrXSA9IGQ7ZWxzZSBpZiAoJ29iamVjdCcgPT09IHR5cGVvZiBkKSBmb3IgKHZhciBjID0gMCwgZSA9IGQubGVuZ3RoOyBjIDwgZTsgKytjKSB7XG4gICAgICAgICAgVChkW2NdKTtcbiAgICAgICAgfSBlbHNlIFkgPSAhIWQgfCAwO1xuICAgIH1cblxuICAgIHJldHVybiBUO1xuICB9XG5cbiAgZnVuY3Rpb24gVShkKSB7XG4gICAgZCA9IGQucHJlZml4O1xuICAgIHZvaWQgMCAhPT0gZCAmJiAoUiA9IG51bGwsIGQgPyAnZnVuY3Rpb24nICE9PSB0eXBlb2YgZCA/IHcgPSAxIDogKHcgPSAyLCBSID0gZCkgOiB3ID0gMCk7XG4gICAgcmV0dXJuIFU7XG4gIH1cblxuICBmdW5jdGlvbiBCKGQsIGMpIHtcbiAgICB2YXIgZSA9IGQ7XG4gICAgMzMgPiBlLmNoYXJDb2RlQXQoMCkgJiYgKGUgPSBlLnRyaW0oKSk7XG4gICAgViA9IGU7XG4gICAgZSA9IFtWXTtcblxuICAgIGlmICgwIDwgQSkge1xuICAgICAgdmFyIGggPSBIKC0xLCBjLCBlLCBlLCBELCB6LCAwLCAwLCAwLCAwKTtcbiAgICAgIHZvaWQgMCAhPT0gaCAmJiAnc3RyaW5nJyA9PT0gdHlwZW9mIGggJiYgKGMgPSBoKTtcbiAgICB9XG5cbiAgICB2YXIgYSA9IE0oTywgZSwgYywgMCwgMCk7XG4gICAgMCA8IEEgJiYgKGggPSBIKC0yLCBhLCBlLCBlLCBELCB6LCBhLmxlbmd0aCwgMCwgMCwgMCksIHZvaWQgMCAhPT0gaCAmJiAoYSA9IGgpKTtcbiAgICBWID0gJyc7XG4gICAgRSA9IDA7XG4gICAgeiA9IEQgPSAxO1xuICAgIHJldHVybiBhO1xuICB9XG5cbiAgdmFyIGNhID0gL15cXDArL2csXG4gICAgICBOID0gL1tcXDBcXHJcXGZdL2csXG4gICAgICBhYSA9IC86ICovZyxcbiAgICAgIGthID0gL3pvb3xncmEvLFxuICAgICAgbWEgPSAvKFssOiBdKSh0cmFuc2Zvcm0pL2csXG4gICAgICBpYSA9IC8sXFxyKz8vZyxcbiAgICAgIEYgPSAvKFtcXHRcXHJcXG4gXSkqXFxmPyYvZyxcbiAgICAgIGZhID0gL0Aoa1xcdyspXFxzKihcXFMqKVxccyovLFxuICAgICAgUSA9IC86OihwbGFjZSkvZyxcbiAgICAgIGhhID0gLzoocmVhZC1vbmx5KS9nLFxuICAgICAgRyA9IC9bc3ZoXVxcdystW3RibHJdezJ9LyxcbiAgICAgIGRhID0gL1xcKFxccyooLiopXFxzKlxcKS9nLFxuICAgICAgb2EgPSAvKFtcXHNcXFNdKj8pOy9nLFxuICAgICAgYmEgPSAvLXNlbGZ8ZmxleC0vZyxcbiAgICAgIG5hID0gL1teXSo/KDpbcnBdW2VsXWFbXFx3LV0rKVteXSovLFxuICAgICAgbGEgPSAvc3RyZXRjaHw6XFxzKlxcdytcXC0oPzpjb250ZXxhdmFpbCkvLFxuICAgICAgamEgPSAvKFteLV0pKGltYWdlLXNldFxcKCkvLFxuICAgICAgeiA9IDEsXG4gICAgICBEID0gMSxcbiAgICAgIEUgPSAwLFxuICAgICAgdyA9IDEsXG4gICAgICBPID0gW10sXG4gICAgICBTID0gW10sXG4gICAgICBBID0gMCxcbiAgICAgIFIgPSBudWxsLFxuICAgICAgWSA9IDAsXG4gICAgICBWID0gJyc7XG4gIEIudXNlID0gVDtcbiAgQi5zZXQgPSBVO1xuICB2b2lkIDAgIT09IFcgJiYgVShXKTtcbiAgcmV0dXJuIEI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0eWxpc19taW47XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgc3RvcEV2ZW50LCBnZXREb2N1bWVudCwgaXNNb3VzZUxpa2VQb2ludGVyVHlwZSwgY29udGFpbnMsIGFjdGl2ZUVsZW1lbnQsIGlzU2FmYXJpLCBpc1R5cGVhYmxlQ29tYm9ib3gsIGlzVmlydHVhbENsaWNrLCBpc1ZpcnR1YWxQb2ludGVyRXZlbnQsIGdldFRhcmdldCwgZ2V0UGxhdGZvcm0sIGlzVHlwZWFibGVFbGVtZW50LCBpc1JlYWN0RXZlbnQsIGlzUm9vdEVsZW1lbnQsIGlzRXZlbnRUYXJnZXRXaXRoaW4sIGlzTWFjLCBnZXRVc2VyQWdlbnQgfSBmcm9tICdAZmxvYXRpbmctdWkvcmVhY3QvdXRpbHMnO1xuaW1wb3J0IHsgZmxvb3IsIGV2YWx1YXRlIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzJztcbmltcG9ydCB7IGdldENvbXB1dGVkU3R5bGUsIGlzRWxlbWVudCwgZ2V0Tm9kZU5hbWUsIGlzSFRNTEVsZW1lbnQsIGdldFdpbmRvdywgaXNMYXN0VHJhdmVyc2FibGVOb2RlLCBnZXRQYXJlbnROb2RlIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzL2RvbSc7XG5pbXBvcnQgeyB0YWJiYWJsZSwgaXNUYWJiYWJsZSB9IGZyb20gJ3RhYmJhYmxlJztcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBnZXRPdmVyZmxvd0FuY2VzdG9ycywgdXNlRmxvYXRpbmcgYXMgdXNlRmxvYXRpbmckMSwgb2Zmc2V0LCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gJ0BmbG9hdGluZy11aS9yZWFjdC1kb20nO1xuZXhwb3J0IHsgYXJyb3csIGF1dG9QbGFjZW1lbnQsIGF1dG9VcGRhdGUsIGNvbXB1dGVQb3NpdGlvbiwgZGV0ZWN0T3ZlcmZsb3csIGZsaXAsIGdldE92ZXJmbG93QW5jZXN0b3JzLCBoaWRlLCBpbmxpbmUsIGxpbWl0U2hpZnQsIG9mZnNldCwgcGxhdGZvcm0sIHNoaWZ0LCBzaXplIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3JlYWN0LWRvbSc7XG5cbi8qKlxuICogTWVyZ2VzIGFuIGFycmF5IG9mIHJlZnMgaW50byBhIHNpbmdsZSBtZW1vaXplZCBjYWxsYmFjayByZWYgb3IgYG51bGxgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3JlYWN0LXV0aWxzI3VzZW1lcmdlcmVmc1xuICovXG5mdW5jdGlvbiB1c2VNZXJnZVJlZnMocmVmcykge1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHJlZnMuZXZlcnkocmVmID0+IHJlZiA9PSBudWxsKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSA9PiB7XG4gICAgICByZWZzLmZvckVhY2gocmVmID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZWYodmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgICAgICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIHJlZnMpO1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbXVpL21hdGVyaWFsLXVpL2lzc3Vlcy80MTE5MCNpc3N1ZWNvbW1lbnQtMjA0MDg3MzM3OVxuY29uc3QgU2FmZVJlYWN0ID0ge1xuICAuLi5SZWFjdFxufTtcblxuY29uc3QgdXNlSW5zZXJ0aW9uRWZmZWN0ID0gU2FmZVJlYWN0LnVzZUluc2VydGlvbkVmZmVjdDtcbmNvbnN0IHVzZVNhZmVJbnNlcnRpb25FZmZlY3QgPSB1c2VJbnNlcnRpb25FZmZlY3QgfHwgKGZuID0+IGZuKCkpO1xuZnVuY3Rpb24gdXNlRWZmZWN0RXZlbnQoY2FsbGJhY2spIHtcbiAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKCgpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIGFuIGV2ZW50IGhhbmRsZXIgd2hpbGUgcmVuZGVyaW5nLicpO1xuICAgIH1cbiAgfSk7XG4gIHVzZVNhZmVJbnNlcnRpb25FZmZlY3QoKCkgPT4ge1xuICAgIHJlZi5jdXJyZW50ID0gY2FsbGJhY2s7XG4gIH0pO1xuICByZXR1cm4gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZi5jdXJyZW50ID09IG51bGwgPyB2b2lkIDAgOiByZWYuY3VycmVudCguLi5hcmdzKTtcbiAgfSwgW10pO1xufVxuXG5jb25zdCBBUlJPV19VUCA9ICdBcnJvd1VwJztcbmNvbnN0IEFSUk9XX0RPV04gPSAnQXJyb3dEb3duJztcbmNvbnN0IEFSUk9XX0xFRlQgPSAnQXJyb3dMZWZ0JztcbmNvbnN0IEFSUk9XX1JJR0hUID0gJ0Fycm93UmlnaHQnO1xuZnVuY3Rpb24gaXNEaWZmZXJlbnRSb3coaW5kZXgsIGNvbHMsIHByZXZSb3cpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoaW5kZXggLyBjb2xzKSAhPT0gcHJldlJvdztcbn1cbmZ1bmN0aW9uIGlzSW5kZXhPdXRPZkJvdW5kcyhsaXN0UmVmLCBpbmRleCkge1xuICByZXR1cm4gaW5kZXggPCAwIHx8IGluZGV4ID49IGxpc3RSZWYuY3VycmVudC5sZW5ndGg7XG59XG5mdW5jdGlvbiBnZXRNaW5JbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXMpIHtcbiAgcmV0dXJuIGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICBkaXNhYmxlZEluZGljZXNcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRNYXhJbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXMpIHtcbiAgcmV0dXJuIGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgc3RhcnRpbmdJbmRleDogbGlzdFJlZi5jdXJyZW50Lmxlbmd0aCxcbiAgICBkaXNhYmxlZEluZGljZXNcbiAgfSk7XG59XG5mdW5jdGlvbiBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCBfdGVtcCkge1xuICBsZXQge1xuICAgIHN0YXJ0aW5nSW5kZXggPSAtMSxcbiAgICBkZWNyZW1lbnQgPSBmYWxzZSxcbiAgICBkaXNhYmxlZEluZGljZXMsXG4gICAgYW1vdW50ID0gMVxuICB9ID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA7XG4gIGNvbnN0IGxpc3QgPSBsaXN0UmVmLmN1cnJlbnQ7XG4gIGxldCBpbmRleCA9IHN0YXJ0aW5nSW5kZXg7XG4gIGRvIHtcbiAgICBpbmRleCArPSBkZWNyZW1lbnQgPyAtYW1vdW50IDogYW1vdW50O1xuICB9IHdoaWxlIChpbmRleCA+PSAwICYmIGluZGV4IDw9IGxpc3QubGVuZ3RoIC0gMSAmJiBpc0Rpc2FibGVkKGxpc3QsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpKTtcbiAgcmV0dXJuIGluZGV4O1xufVxuZnVuY3Rpb24gZ2V0R3JpZE5hdmlnYXRlZEluZGV4KGVsZW1lbnRzUmVmLCBfcmVmKSB7XG4gIGxldCB7XG4gICAgZXZlbnQsXG4gICAgb3JpZW50YXRpb24sXG4gICAgbG9vcCxcbiAgICBjb2xzLFxuICAgIGRpc2FibGVkSW5kaWNlcyxcbiAgICBtaW5JbmRleCxcbiAgICBtYXhJbmRleCxcbiAgICBwcmV2SW5kZXgsXG4gICAgc3RvcEV2ZW50OiBzdG9wID0gZmFsc2VcbiAgfSA9IF9yZWY7XG4gIGxldCBuZXh0SW5kZXggPSBwcmV2SW5kZXg7XG4gIGlmIChldmVudC5rZXkgPT09IEFSUk9XX1VQKSB7XG4gICAgc3RvcCAmJiBzdG9wRXZlbnQoZXZlbnQpO1xuICAgIGlmIChwcmV2SW5kZXggPT09IC0xKSB7XG4gICAgICBuZXh0SW5kZXggPSBtYXhJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgc3RhcnRpbmdJbmRleDogbmV4dEluZGV4LFxuICAgICAgICBhbW91bnQ6IGNvbHMsXG4gICAgICAgIGRlY3JlbWVudDogdHJ1ZSxcbiAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICB9KTtcbiAgICAgIGlmIChsb29wICYmIChwcmV2SW5kZXggLSBjb2xzIDwgbWluSW5kZXggfHwgbmV4dEluZGV4IDwgMCkpIHtcbiAgICAgICAgY29uc3QgY29sID0gcHJldkluZGV4ICUgY29scztcbiAgICAgICAgY29uc3QgbWF4Q29sID0gbWF4SW5kZXggJSBjb2xzO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBtYXhJbmRleCAtIChtYXhDb2wgLSBjb2wpO1xuICAgICAgICBpZiAobWF4Q29sID09PSBjb2wpIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBtYXhJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBtYXhDb2wgPiBjb2wgPyBvZmZzZXQgOiBvZmZzZXQgLSBjb2xzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0luZGV4T3V0T2ZCb3VuZHMoZWxlbWVudHNSZWYsIG5leHRJbmRleCkpIHtcbiAgICAgIG5leHRJbmRleCA9IHByZXZJbmRleDtcbiAgICB9XG4gIH1cbiAgaWYgKGV2ZW50LmtleSA9PT0gQVJST1dfRE9XTikge1xuICAgIHN0b3AgJiYgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICBpZiAocHJldkluZGV4ID09PSAtMSkge1xuICAgICAgbmV4dEluZGV4ID0gbWluSW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCxcbiAgICAgICAgYW1vdW50OiBjb2xzLFxuICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgIH0pO1xuICAgICAgaWYgKGxvb3AgJiYgcHJldkluZGV4ICsgY29scyA+IG1heEluZGV4KSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4ICUgY29scyAtIGNvbHMsXG4gICAgICAgICAgYW1vdW50OiBjb2xzLFxuICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSW5kZXhPdXRPZkJvdW5kcyhlbGVtZW50c1JlZiwgbmV4dEluZGV4KSkge1xuICAgICAgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbWFpbnMgb24gdGhlIHNhbWUgcm93L2NvbHVtbi5cbiAgaWYgKG9yaWVudGF0aW9uID09PSAnYm90aCcpIHtcbiAgICBjb25zdCBwcmV2Um93ID0gZmxvb3IocHJldkluZGV4IC8gY29scyk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gQVJST1dfUklHSFQpIHtcbiAgICAgIHN0b3AgJiYgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIGlmIChwcmV2SW5kZXggJSBjb2xzICE9PSBjb2xzIC0gMSkge1xuICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCxcbiAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChsb29wICYmIGlzRGlmZmVyZW50Um93KG5leHRJbmRleCwgY29scywgcHJldlJvdykpIHtcbiAgICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4IC0gcHJldkluZGV4ICUgY29scyAtIDEsXG4gICAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsb29wKSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4IC0gcHJldkluZGV4ICUgY29scyAtIDEsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGlmZmVyZW50Um93KG5leHRJbmRleCwgY29scywgcHJldlJvdykpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSBBUlJPV19MRUZUKSB7XG4gICAgICBzdG9wICYmIHN0b3BFdmVudChldmVudCk7XG4gICAgICBpZiAocHJldkluZGV4ICUgY29scyAhPT0gMCkge1xuICAgICAgICBuZXh0SW5kZXggPSBmaW5kTm9uRGlzYWJsZWRJbmRleChlbGVtZW50c1JlZiwge1xuICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCxcbiAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobG9vcCAmJiBpc0RpZmZlcmVudFJvdyhuZXh0SW5kZXgsIGNvbHMsIHByZXZSb3cpKSB7XG4gICAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IHByZXZJbmRleCArIChjb2xzIC0gcHJldkluZGV4ICUgY29scyksXG4gICAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsb29wKSB7XG4gICAgICAgIG5leHRJbmRleCA9IGZpbmROb25EaXNhYmxlZEluZGV4KGVsZW1lbnRzUmVmLCB7XG4gICAgICAgICAgc3RhcnRpbmdJbmRleDogcHJldkluZGV4ICsgKGNvbHMgLSBwcmV2SW5kZXggJSBjb2xzKSxcbiAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGlmZmVyZW50Um93KG5leHRJbmRleCwgY29scywgcHJldlJvdykpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gcHJldkluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsYXN0Um93ID0gZmxvb3IobWF4SW5kZXggLyBjb2xzKSA9PT0gcHJldlJvdztcbiAgICBpZiAoaXNJbmRleE91dE9mQm91bmRzKGVsZW1lbnRzUmVmLCBuZXh0SW5kZXgpKSB7XG4gICAgICBpZiAobG9vcCAmJiBsYXN0Um93KSB7XG4gICAgICAgIG5leHRJbmRleCA9IGV2ZW50LmtleSA9PT0gQVJST1dfTEVGVCA/IG1heEluZGV4IDogZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICBzdGFydGluZ0luZGV4OiBwcmV2SW5kZXggLSBwcmV2SW5kZXggJSBjb2xzIC0gMSxcbiAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0SW5kZXggPSBwcmV2SW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXh0SW5kZXg7XG59XG5cbi8qKiBGb3IgZWFjaCBjZWxsIGluZGV4LCBnZXRzIHRoZSBpdGVtIGluZGV4IHRoYXQgb2NjdXBpZXMgdGhhdCBjZWxsICovXG5mdW5jdGlvbiBidWlsZENlbGxNYXAoc2l6ZXMsIGNvbHMsIGRlbnNlKSB7XG4gIGNvbnN0IGNlbGxNYXAgPSBbXTtcbiAgbGV0IHN0YXJ0SW5kZXggPSAwO1xuICBzaXplcy5mb3JFYWNoKChfcmVmMiwgaW5kZXgpID0+IHtcbiAgICBsZXQge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gX3JlZjI7XG4gICAgaWYgKHdpZHRoID4gY29scykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbRmxvYXRpbmcgVUldOiBJbnZhbGlkIGdyaWQgLSBpdGVtIHdpZHRoIGF0IGluZGV4IFwiICsgaW5kZXggKyBcIiBpcyBncmVhdGVyIHRoYW4gZ3JpZCBjb2x1bW5zXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaXRlbVBsYWNlZCA9IGZhbHNlO1xuICAgIGlmIChkZW5zZSkge1xuICAgICAgc3RhcnRJbmRleCA9IDA7XG4gICAgfVxuICAgIHdoaWxlICghaXRlbVBsYWNlZCkge1xuICAgICAgY29uc3QgdGFyZ2V0Q2VsbHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7XG4gICAgICAgICAgdGFyZ2V0Q2VsbHMucHVzaChzdGFydEluZGV4ICsgaSArIGogKiBjb2xzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0SW5kZXggJSBjb2xzICsgd2lkdGggPD0gY29scyAmJiB0YXJnZXRDZWxscy5ldmVyeShjZWxsID0+IGNlbGxNYXBbY2VsbF0gPT0gbnVsbCkpIHtcbiAgICAgICAgdGFyZ2V0Q2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgICBjZWxsTWFwW2NlbGxdID0gaW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgICBpdGVtUGxhY2VkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0SW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vIGNvbnZlcnQgaW50byBhIG5vbi1zcGFyc2UgYXJyYXlcbiAgcmV0dXJuIFsuLi5jZWxsTWFwXTtcbn1cblxuLyoqIEdldHMgY2VsbCBpbmRleCBvZiBhbiBpdGVtJ3MgY29ybmVyIG9yIC0xIHdoZW4gaW5kZXggaXMgLTEuICovXG5mdW5jdGlvbiBnZXRDZWxsSW5kZXhPZkNvcm5lcihpbmRleCwgc2l6ZXMsIGNlbGxNYXAsIGNvbHMsIGNvcm5lcikge1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gLTE7XG4gIGNvbnN0IGZpcnN0Q2VsbEluZGV4ID0gY2VsbE1hcC5pbmRleE9mKGluZGV4KTtcbiAgY29uc3Qgc2l6ZUl0ZW0gPSBzaXplc1tpbmRleF07XG4gIHN3aXRjaCAoY29ybmVyKSB7XG4gICAgY2FzZSAndGwnOlxuICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4O1xuICAgIGNhc2UgJ3RyJzpcbiAgICAgIGlmICghc2l6ZUl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4ICsgc2l6ZUl0ZW0ud2lkdGggLSAxO1xuICAgIGNhc2UgJ2JsJzpcbiAgICAgIGlmICghc2l6ZUl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0Q2VsbEluZGV4ICsgKHNpemVJdGVtLmhlaWdodCAtIDEpICogY29scztcbiAgICBjYXNlICdicic6XG4gICAgICByZXR1cm4gY2VsbE1hcC5sYXN0SW5kZXhPZihpbmRleCk7XG4gIH1cbn1cblxuLyoqIEdldHMgYWxsIGNlbGwgaW5kaWNlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNwZWNpZmllZCBpbmRpY2VzICovXG5mdW5jdGlvbiBnZXRDZWxsSW5kaWNlcyhpbmRpY2VzLCBjZWxsTWFwKSB7XG4gIHJldHVybiBjZWxsTWFwLmZsYXRNYXAoKGluZGV4LCBjZWxsSW5kZXgpID0+IGluZGljZXMuaW5jbHVkZXMoaW5kZXgpID8gW2NlbGxJbmRleF0gOiBbXSk7XG59XG5mdW5jdGlvbiBpc0Rpc2FibGVkKGxpc3QsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpIHtcbiAgaWYgKGRpc2FibGVkSW5kaWNlcykge1xuICAgIHJldHVybiBkaXNhYmxlZEluZGljZXMuaW5jbHVkZXMoaW5kZXgpO1xuICB9XG4gIGNvbnN0IGVsZW1lbnQgPSBsaXN0W2luZGV4XTtcbiAgcmV0dXJuIGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcpID09PSAndHJ1ZSc7XG59XG5cbmxldCByYWZJZCA9IDA7XG5mdW5jdGlvbiBlbnF1ZXVlRm9jdXMoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgcHJldmVudFNjcm9sbCA9IGZhbHNlLFxuICAgIGNhbmNlbFByZXZpb3VzID0gdHJ1ZSxcbiAgICBzeW5jID0gZmFsc2VcbiAgfSA9IG9wdGlvbnM7XG4gIGNhbmNlbFByZXZpb3VzICYmIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcbiAgY29uc3QgZXhlYyA9ICgpID0+IGVsID09IG51bGwgPyB2b2lkIDAgOiBlbC5mb2N1cyh7XG4gICAgcHJldmVudFNjcm9sbFxuICB9KTtcbiAgaWYgKHN5bmMpIHtcbiAgICBleGVjKCk7XG4gIH0gZWxzZSB7XG4gICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZXhlYyk7XG4gIH1cbn1cblxudmFyIGluZGV4ID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDtcblxuZnVuY3Rpb24gc29ydEJ5RG9jdW1lbnRQb3NpdGlvbihhLCBiKSB7XG4gIGNvbnN0IHBvc2l0aW9uID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKTtcbiAgaWYgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcgfHwgcG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAocG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyB8fCBwb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTlMpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGFyZU1hcHNFcXVhbChtYXAxLCBtYXAyKSB7XG4gIGlmIChtYXAxLnNpemUgIT09IG1hcDIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBtYXAxLmVudHJpZXMoKSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbWFwMi5nZXQoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IEZsb2F0aW5nTGlzdENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIHJlZ2lzdGVyOiAoKSA9PiB7fSxcbiAgdW5yZWdpc3RlcjogKCkgPT4ge30sXG4gIG1hcDogLyojX19QVVJFX18qL25ldyBNYXAoKSxcbiAgZWxlbWVudHNSZWY6IHtcbiAgICBjdXJyZW50OiBbXVxuICB9XG59KTtcbi8qKlxuICogUHJvdmlkZXMgY29udGV4dCBmb3IgYSBsaXN0IG9mIGl0ZW1zIHdpdGhpbiB0aGUgZmxvYXRpbmcgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ0xpc3RcbiAqL1xuZnVuY3Rpb24gRmxvYXRpbmdMaXN0KHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBlbGVtZW50c1JlZixcbiAgICBsYWJlbHNSZWZcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbbWFwLCBzZXRNYXBdID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gbmV3IE1hcCgpKTtcbiAgY29uc3QgcmVnaXN0ZXIgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBzZXRNYXAocHJldk1hcCA9PiBuZXcgTWFwKHByZXZNYXApLnNldChub2RlLCBudWxsKSk7XG4gIH0sIFtdKTtcbiAgY29uc3QgdW5yZWdpc3RlciA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIHNldE1hcChwcmV2TWFwID0+IHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAocHJldk1hcCk7XG4gICAgICBtYXAuZGVsZXRlKG5vZGUpO1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9KTtcbiAgfSwgW10pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShuZXdNYXAua2V5cygpKS5zb3J0KHNvcnRCeURvY3VtZW50UG9zaXRpb24pO1xuICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBuZXdNYXAuc2V0KG5vZGUsIGluZGV4KTtcbiAgICB9KTtcbiAgICBpZiAoIWFyZU1hcHNFcXVhbChtYXAsIG5ld01hcCkpIHtcbiAgICAgIHNldE1hcChuZXdNYXApO1xuICAgIH1cbiAgfSwgW21hcF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmxvYXRpbmdMaXN0Q29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgICByZWdpc3RlcixcbiAgICAgIHVucmVnaXN0ZXIsXG4gICAgICBtYXAsXG4gICAgICBlbGVtZW50c1JlZixcbiAgICAgIGxhYmVsc1JlZlxuICAgIH0pLCBbcmVnaXN0ZXIsIHVucmVnaXN0ZXIsIG1hcCwgZWxlbWVudHNSZWYsIGxhYmVsc1JlZl0pXG4gIH0sIGNoaWxkcmVuKTtcbn1cbi8qKlxuICogVXNlZCB0byByZWdpc3RlciBhIGxpc3QgaXRlbSBhbmQgaXRzIGluZGV4IChET00gcG9zaXRpb24pIGluIHRoZVxuICogYEZsb2F0aW5nTGlzdGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdMaXN0I3VzZWxpc3RpdGVtXG4gKi9cbmZ1bmN0aW9uIHVzZUxpc3RJdGVtKHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgbGFiZWxcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgcmVnaXN0ZXIsXG4gICAgdW5yZWdpc3RlcixcbiAgICBtYXAsXG4gICAgZWxlbWVudHNSZWYsXG4gICAgbGFiZWxzUmVmXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KEZsb2F0aW5nTGlzdENvbnRleHQpO1xuICBjb25zdCBbaW5kZXgkMSwgc2V0SW5kZXhdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IGNvbXBvbmVudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgcmVmID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgY29tcG9uZW50UmVmLmN1cnJlbnQgPSBub2RlO1xuICAgIGlmIChpbmRleCQxICE9PSBudWxsKSB7XG4gICAgICBlbGVtZW50c1JlZi5jdXJyZW50W2luZGV4JDFdID0gbm9kZTtcbiAgICAgIGlmIChsYWJlbHNSZWYpIHtcbiAgICAgICAgdmFyIF9ub2RlJHRleHRDb250ZW50O1xuICAgICAgICBjb25zdCBpc0xhYmVsRGVmaW5lZCA9IGxhYmVsICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGxhYmVsc1JlZi5jdXJyZW50W2luZGV4JDFdID0gaXNMYWJlbERlZmluZWQgPyBsYWJlbCA6IChfbm9kZSR0ZXh0Q29udGVudCA9IG5vZGUgPT0gbnVsbCA/IHZvaWQgMCA6IG5vZGUudGV4dENvbnRlbnQpICE9IG51bGwgPyBfbm9kZSR0ZXh0Q29udGVudCA6IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LCBbaW5kZXgkMSwgZWxlbWVudHNSZWYsIGxhYmVsc1JlZiwgbGFiZWxdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBjb21wb25lbnRSZWYuY3VycmVudDtcbiAgICBpZiAobm9kZSkge1xuICAgICAgcmVnaXN0ZXIobm9kZSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB1bnJlZ2lzdGVyKG5vZGUpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtyZWdpc3RlciwgdW5yZWdpc3Rlcl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSBjb21wb25lbnRSZWYuY3VycmVudCA/IG1hcC5nZXQoY29tcG9uZW50UmVmLmN1cnJlbnQpIDogbnVsbDtcbiAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgc2V0SW5kZXgoaW5kZXgpO1xuICAgIH1cbiAgfSwgW21hcF0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJlZixcbiAgICBpbmRleDogaW5kZXgkMSA9PSBudWxsID8gLTEgOiBpbmRleCQxXG4gIH0pLCBbaW5kZXgkMSwgcmVmXSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckpzeChyZW5kZXIsIGNvbXB1dGVkUHJvcHMpIHtcbiAgaWYgKHR5cGVvZiByZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gcmVuZGVyKGNvbXB1dGVkUHJvcHMpO1xuICB9XG4gIGlmIChyZW5kZXIpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChyZW5kZXIsIGNvbXB1dGVkUHJvcHMpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBjb21wdXRlZFByb3BzKTtcbn1cbmNvbnN0IENvbXBvc2l0ZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGFjdGl2ZUluZGV4OiAwLFxuICBvbk5hdmlnYXRlOiAoKSA9PiB7fVxufSk7XG5jb25zdCBob3Jpem9udGFsS2V5cyA9IFtBUlJPV19MRUZULCBBUlJPV19SSUdIVF07XG5jb25zdCB2ZXJ0aWNhbEtleXMgPSBbQVJST1dfVVAsIEFSUk9XX0RPV05dO1xuY29uc3QgYWxsS2V5cyA9IFsuLi5ob3Jpem9udGFsS2V5cywgLi4udmVydGljYWxLZXlzXTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIHRhYiBzdG9wIHdob3NlIGl0ZW1zIGFyZSBuYXZpZ2F0ZWQgYnkgYXJyb3cga2V5cywgd2hpY2hcbiAqIHByb3ZpZGVzIGxpc3QgbmF2aWdhdGlvbiBvdXRzaWRlIG9mIGZsb2F0aW5nIGVsZW1lbnQgY29udGV4dHMuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgdG8gZW5hYmxlIG5hdmlnYXRpb24gb2YgYSBsaXN0IG9mIGl0ZW1zIHRoYXQgYXJlbuKAmXQgcGFydCBvZiBhXG4gKiBmbG9hdGluZyBlbGVtZW50LiBBIG1lbnViYXIgaXMgYW4gZXhhbXBsZSBvZiBhIGNvbXBvc2l0ZSwgd2l0aCBlYWNoIHJlZmVyZW5jZVxuICogZWxlbWVudCBiZWluZyBhbiBpdGVtLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0NvbXBvc2l0ZVxuICovXG5jb25zdCBDb21wb3NpdGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBDb21wb3NpdGUocHJvcHMsIGZvcndhcmRlZFJlZikge1xuICBjb25zdCB7XG4gICAgcmVuZGVyLFxuICAgIG9yaWVudGF0aW9uID0gJ2JvdGgnLFxuICAgIGxvb3AgPSB0cnVlLFxuICAgIGNvbHMgPSAxLFxuICAgIGRpc2FibGVkSW5kaWNlcyxcbiAgICBhY3RpdmVJbmRleDogZXh0ZXJuYWxBY3RpdmVJbmRleCxcbiAgICBvbk5hdmlnYXRlOiBleHRlcm5hbFNldEFjdGl2ZUluZGV4LFxuICAgIGl0ZW1TaXplcyxcbiAgICBkZW5zZSA9IGZhbHNlLFxuICAgIC4uLmRvbVByb3BzXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgW2ludGVybmFsQWN0aXZlSW5kZXgsIGludGVybmFsU2V0QWN0aXZlSW5kZXhdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gIGNvbnN0IGFjdGl2ZUluZGV4ID0gZXh0ZXJuYWxBY3RpdmVJbmRleCAhPSBudWxsID8gZXh0ZXJuYWxBY3RpdmVJbmRleCA6IGludGVybmFsQWN0aXZlSW5kZXg7XG4gIGNvbnN0IG9uTmF2aWdhdGUgPSB1c2VFZmZlY3RFdmVudChleHRlcm5hbFNldEFjdGl2ZUluZGV4ICE9IG51bGwgPyBleHRlcm5hbFNldEFjdGl2ZUluZGV4IDogaW50ZXJuYWxTZXRBY3RpdmVJbmRleCk7XG4gIGNvbnN0IGVsZW1lbnRzUmVmID0gUmVhY3QudXNlUmVmKFtdKTtcbiAgY29uc3QgcmVuZGVyRWxlbWVudFByb3BzID0gcmVuZGVyICYmIHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicgPyByZW5kZXIucHJvcHMgOiB7fTtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGFjdGl2ZUluZGV4LFxuICAgIG9uTmF2aWdhdGVcbiAgfSksIFthY3RpdmVJbmRleCwgb25OYXZpZ2F0ZV0pO1xuICBjb25zdCBpc0dyaWQgPSBjb2xzID4gMTtcbiAgZnVuY3Rpb24gaGFuZGxlS2V5RG93bihldmVudCkge1xuICAgIGlmICghYWxsS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm47XG4gICAgbGV0IG5leHRJbmRleCA9IGFjdGl2ZUluZGV4O1xuICAgIGNvbnN0IG1pbkluZGV4ID0gZ2V0TWluSW5kZXgoZWxlbWVudHNSZWYsIGRpc2FibGVkSW5kaWNlcyk7XG4gICAgY29uc3QgbWF4SW5kZXggPSBnZXRNYXhJbmRleChlbGVtZW50c1JlZiwgZGlzYWJsZWRJbmRpY2VzKTtcbiAgICBpZiAoaXNHcmlkKSB7XG4gICAgICBjb25zdCBzaXplcyA9IGl0ZW1TaXplcyB8fCBBcnJheS5mcm9tKHtcbiAgICAgICAgbGVuZ3RoOiBlbGVtZW50c1JlZi5jdXJyZW50Lmxlbmd0aFxuICAgICAgfSwgKCkgPT4gKHtcbiAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgIGhlaWdodDogMVxuICAgICAgfSkpO1xuICAgICAgLy8gVG8gY2FsY3VsYXRlIG1vdmVtZW50cyBvbiB0aGUgZ3JpZCwgd2UgdXNlIGh5cG90aGV0aWNhbCBjZWxsIGluZGljZXNcbiAgICAgIC8vIGFzIGlmIGV2ZXJ5IGl0ZW0gd2FzIDF4MSwgdGhlbiBjb252ZXJ0IGJhY2sgdG8gcmVhbCBpbmRpY2VzLlxuICAgICAgY29uc3QgY2VsbE1hcCA9IGJ1aWxkQ2VsbE1hcChzaXplcywgY29scywgZGVuc2UpO1xuICAgICAgY29uc3QgbWluR3JpZEluZGV4ID0gY2VsbE1hcC5maW5kSW5kZXgoaW5kZXggPT4gaW5kZXggIT0gbnVsbCAmJiAhaXNEaXNhYmxlZChlbGVtZW50c1JlZi5jdXJyZW50LCBpbmRleCwgZGlzYWJsZWRJbmRpY2VzKSk7XG4gICAgICAvLyBsYXN0IGVuYWJsZWQgaW5kZXhcbiAgICAgIGNvbnN0IG1heEdyaWRJbmRleCA9IGNlbGxNYXAucmVkdWNlKChmb3VuZEluZGV4LCBpbmRleCwgY2VsbEluZGV4KSA9PiBpbmRleCAhPSBudWxsICYmICFpc0Rpc2FibGVkKGVsZW1lbnRzUmVmLmN1cnJlbnQsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpID8gY2VsbEluZGV4IDogZm91bmRJbmRleCwgLTEpO1xuICAgICAgbmV4dEluZGV4ID0gY2VsbE1hcFtnZXRHcmlkTmF2aWdhdGVkSW5kZXgoe1xuICAgICAgICBjdXJyZW50OiBjZWxsTWFwLm1hcChpdGVtSW5kZXggPT4gaXRlbUluZGV4ID8gZWxlbWVudHNSZWYuY3VycmVudFtpdGVtSW5kZXhdIDogbnVsbClcbiAgICAgIH0sIHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgICBsb29wLFxuICAgICAgICBjb2xzLFxuICAgICAgICAvLyB0cmVhdCB1bmRlZmluZWQgKGVtcHR5IGdyaWQgc3BhY2VzKSBhcyBkaXNhYmxlZCBpbmRpY2VzIHNvIHdlXG4gICAgICAgIC8vIGRvbid0IGVuZCB1cCBpbiB0aGVtXG4gICAgICAgIGRpc2FibGVkSW5kaWNlczogZ2V0Q2VsbEluZGljZXMoWy4uLihkaXNhYmxlZEluZGljZXMgfHwgZWxlbWVudHNSZWYuY3VycmVudC5tYXAoKF8sIGluZGV4KSA9PiBpc0Rpc2FibGVkKGVsZW1lbnRzUmVmLmN1cnJlbnQsIGluZGV4KSA/IGluZGV4IDogdW5kZWZpbmVkKSksIHVuZGVmaW5lZF0sIGNlbGxNYXApLFxuICAgICAgICBtaW5JbmRleDogbWluR3JpZEluZGV4LFxuICAgICAgICBtYXhJbmRleDogbWF4R3JpZEluZGV4LFxuICAgICAgICBwcmV2SW5kZXg6IGdldENlbGxJbmRleE9mQ29ybmVyKGFjdGl2ZUluZGV4ID4gbWF4SW5kZXggPyBtaW5JbmRleCA6IGFjdGl2ZUluZGV4LCBzaXplcywgY2VsbE1hcCwgY29scyxcbiAgICAgICAgLy8gdXNlIGEgY29ybmVyIG1hdGNoaW5nIHRoZSBlZGdlIGNsb3Nlc3QgdG8gdGhlIGRpcmVjdGlvbiB3ZSdyZVxuICAgICAgICAvLyBtb3ZpbmcgaW4gc28gd2UgZG9uJ3QgZW5kIHVwIGluIHRoZSBzYW1lIGl0ZW0uIFByZWZlclxuICAgICAgICAvLyB0b3AvbGVmdCBvdmVyIGJvdHRvbS9yaWdodC5cbiAgICAgICAgZXZlbnQua2V5ID09PSBBUlJPV19ET1dOID8gJ2JsJyA6IGV2ZW50LmtleSA9PT0gQVJST1dfUklHSFQgPyAndHInIDogJ3RsJylcbiAgICAgIH0pXTsgLy8gbmF2aWdhdGVkIGNlbGwgd2lsbCBuZXZlciBiZSBudWxsaXNoXG4gICAgfVxuICAgIGNvbnN0IHRvRW5kS2V5cyA9IHtcbiAgICAgIGhvcml6b250YWw6IFtBUlJPV19SSUdIVF0sXG4gICAgICB2ZXJ0aWNhbDogW0FSUk9XX0RPV05dLFxuICAgICAgYm90aDogW0FSUk9XX1JJR0hULCBBUlJPV19ET1dOXVxuICAgIH1bb3JpZW50YXRpb25dO1xuICAgIGNvbnN0IHRvU3RhcnRLZXlzID0ge1xuICAgICAgaG9yaXpvbnRhbDogW0FSUk9XX0xFRlRdLFxuICAgICAgdmVydGljYWw6IFtBUlJPV19VUF0sXG4gICAgICBib3RoOiBbQVJST1dfTEVGVCwgQVJST1dfVVBdXG4gICAgfVtvcmllbnRhdGlvbl07XG4gICAgY29uc3QgcHJldmVudGVkS2V5cyA9IGlzR3JpZCA/IGFsbEtleXMgOiB7XG4gICAgICBob3Jpem9udGFsOiBob3Jpem9udGFsS2V5cyxcbiAgICAgIHZlcnRpY2FsOiB2ZXJ0aWNhbEtleXMsXG4gICAgICBib3RoOiBhbGxLZXlzXG4gICAgfVtvcmllbnRhdGlvbl07XG4gICAgaWYgKG5leHRJbmRleCA9PT0gYWN0aXZlSW5kZXggJiYgWy4uLnRvRW5kS2V5cywgLi4udG9TdGFydEtleXNdLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgIGlmIChsb29wICYmIG5leHRJbmRleCA9PT0gbWF4SW5kZXggJiYgdG9FbmRLZXlzLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgICAgbmV4dEluZGV4ID0gbWluSW5kZXg7XG4gICAgICB9IGVsc2UgaWYgKGxvb3AgJiYgbmV4dEluZGV4ID09PSBtaW5JbmRleCAmJiB0b1N0YXJ0S2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgIG5leHRJbmRleCA9IG1heEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEluZGV4ID0gZmluZE5vbkRpc2FibGVkSW5kZXgoZWxlbWVudHNSZWYsIHtcbiAgICAgICAgICBzdGFydGluZ0luZGV4OiBuZXh0SW5kZXgsXG4gICAgICAgICAgZGVjcmVtZW50OiB0b1N0YXJ0S2V5cy5pbmNsdWRlcyhldmVudC5rZXkpLFxuICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5leHRJbmRleCAhPT0gYWN0aXZlSW5kZXggJiYgIWlzSW5kZXhPdXRPZkJvdW5kcyhlbGVtZW50c1JlZiwgbmV4dEluZGV4KSkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAocHJldmVudGVkS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICBvbk5hdmlnYXRlKG5leHRJbmRleCk7XG5cbiAgICAgIC8vIFdhaXQgZm9yIEZvY3VzTWFuYWdlciBgcmV0dXJuRm9jdXNgIHRvIGV4ZWN1dGUuXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGVucXVldWVGb2N1cyhlbGVtZW50c1JlZi5jdXJyZW50W25leHRJbmRleF0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvbXB1dGVkUHJvcHMgPSB7XG4gICAgLi4uZG9tUHJvcHMsXG4gICAgLi4ucmVuZGVyRWxlbWVudFByb3BzLFxuICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICdhcmlhLW9yaWVudGF0aW9uJzogb3JpZW50YXRpb24gPT09ICdib3RoJyA/IHVuZGVmaW5lZCA6IG9yaWVudGF0aW9uLFxuICAgIG9uS2V5RG93bihlKSB7XG4gICAgICBkb21Qcm9wcy5vbktleURvd24gPT0gbnVsbCB8fCBkb21Qcm9wcy5vbktleURvd24oZSk7XG4gICAgICByZW5kZXJFbGVtZW50UHJvcHMub25LZXlEb3duID09IG51bGwgfHwgcmVuZGVyRWxlbWVudFByb3BzLm9uS2V5RG93bihlKTtcbiAgICAgIGhhbmRsZUtleURvd24oZSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9zaXRlQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBjb250ZXh0VmFsdWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRmxvYXRpbmdMaXN0LCB7XG4gICAgZWxlbWVudHNSZWY6IGVsZW1lbnRzUmVmXG4gIH0sIHJlbmRlckpzeChyZW5kZXIsIGNvbXB1dGVkUHJvcHMpKSk7XG59KTtcbi8qKlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0NvbXBvc2l0ZVxuICovXG5jb25zdCBDb21wb3NpdGVJdGVtID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ29tcG9zaXRlSXRlbShwcm9wcywgZm9yd2FyZGVkUmVmKSB7XG4gIGNvbnN0IHtcbiAgICByZW5kZXIsXG4gICAgLi4uZG9tUHJvcHNcbiAgfSA9IHByb3BzO1xuICBjb25zdCByZW5kZXJFbGVtZW50UHJvcHMgPSByZW5kZXIgJiYgdHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJyA/IHJlbmRlci5wcm9wcyA6IHt9O1xuICBjb25zdCB7XG4gICAgYWN0aXZlSW5kZXgsXG4gICAgb25OYXZpZ2F0ZVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChDb21wb3NpdGVDb250ZXh0KTtcbiAgY29uc3Qge1xuICAgIHJlZixcbiAgICBpbmRleFxuICB9ID0gdXNlTGlzdEl0ZW0oKTtcbiAgY29uc3QgbWVyZ2VkUmVmID0gdXNlTWVyZ2VSZWZzKFtyZWYsIGZvcndhcmRlZFJlZiwgcmVuZGVyRWxlbWVudFByb3BzLnJlZl0pO1xuICBjb25zdCBpc0FjdGl2ZSA9IGFjdGl2ZUluZGV4ID09PSBpbmRleDtcbiAgY29uc3QgY29tcHV0ZWRQcm9wcyA9IHtcbiAgICAuLi5kb21Qcm9wcyxcbiAgICAuLi5yZW5kZXJFbGVtZW50UHJvcHMsXG4gICAgcmVmOiBtZXJnZWRSZWYsXG4gICAgdGFiSW5kZXg6IGlzQWN0aXZlID8gMCA6IC0xLFxuICAgICdkYXRhLWFjdGl2ZSc6IGlzQWN0aXZlID8gJycgOiB1bmRlZmluZWQsXG4gICAgb25Gb2N1cyhlKSB7XG4gICAgICBkb21Qcm9wcy5vbkZvY3VzID09IG51bGwgfHwgZG9tUHJvcHMub25Gb2N1cyhlKTtcbiAgICAgIHJlbmRlckVsZW1lbnRQcm9wcy5vbkZvY3VzID09IG51bGwgfHwgcmVuZGVyRWxlbWVudFByb3BzLm9uRm9jdXMoZSk7XG4gICAgICBvbk5hdmlnYXRlKGluZGV4KTtcbiAgICB9XG4gIH07XG4gIHJldHVybiByZW5kZXJKc3gocmVuZGVyLCBjb21wdXRlZFByb3BzKTtcbn0pO1xuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxubGV0IHNlcnZlckhhbmRvZmZDb21wbGV0ZSA9IGZhbHNlO1xubGV0IGNvdW50ID0gMDtcbmNvbnN0IGdlbklkID0gKCkgPT4gLy8gRW5zdXJlIHRoZSBpZCBpcyB1bmlxdWUgd2l0aCBtdWx0aXBsZSBpbmRlcGVuZGVudCB2ZXJzaW9ucyBvZiBGbG9hdGluZyBVSVxuLy8gb24gPFJlYWN0IDE4XG5cImZsb2F0aW5nLXVpLVwiICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNikgKyBjb3VudCsrO1xuZnVuY3Rpb24gdXNlRmxvYXRpbmdJZCgpIHtcbiAgY29uc3QgW2lkLCBzZXRJZF0gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBzZXJ2ZXJIYW5kb2ZmQ29tcGxldGUgPyBnZW5JZCgpIDogdW5kZWZpbmVkKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChpZCA9PSBudWxsKSB7XG4gICAgICBzZXRJZChnZW5JZCgpKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2VydmVySGFuZG9mZkNvbXBsZXRlID0gdHJ1ZTtcbiAgfSwgW10pO1xuICByZXR1cm4gaWQ7XG59XG5jb25zdCB1c2VSZWFjdElkID0gU2FmZVJlYWN0LnVzZUlkO1xuXG4vKipcbiAqIFVzZXMgUmVhY3QgMTgncyBidWlsdC1pbiBgdXNlSWQoKWAgd2hlbiBhdmFpbGFibGUsIG9yIGZhbGxzIGJhY2sgdG8gYVxuICogc2xpZ2h0bHkgbGVzcyBwZXJmb3JtYW50IChyZXF1aXJpbmcgYSBkb3VibGUgcmVuZGVyKSBpbXBsZW1lbnRhdGlvbiBmb3JcbiAqIGVhcmxpZXIgUmVhY3QgdmVyc2lvbnMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvcmVhY3QtdXRpbHMjdXNlaWRcbiAqL1xuY29uc3QgdXNlSWQgPSB1c2VSZWFjdElkIHx8IHVzZUZsb2F0aW5nSWQ7XG5cbmxldCBkZXZNZXNzYWdlU2V0O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICBkZXZNZXNzYWdlU2V0ID0gLyojX19QVVJFX18qL25ldyBTZXQoKTtcbn1cbmZ1bmN0aW9uIHdhcm4oKSB7XG4gIHZhciBfZGV2TWVzc2FnZVNldDtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2VzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIG1lc3NhZ2VzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIGNvbnN0IG1lc3NhZ2UgPSBcIkZsb2F0aW5nIFVJOiBcIiArIG1lc3NhZ2VzLmpvaW4oJyAnKTtcbiAgaWYgKCEoKF9kZXZNZXNzYWdlU2V0ID0gZGV2TWVzc2FnZVNldCkgIT0gbnVsbCAmJiBfZGV2TWVzc2FnZVNldC5oYXMobWVzc2FnZSkpKSB7XG4gICAgdmFyIF9kZXZNZXNzYWdlU2V0MjtcbiAgICAoX2Rldk1lc3NhZ2VTZXQyID0gZGV2TWVzc2FnZVNldCkgPT0gbnVsbCB8fCBfZGV2TWVzc2FnZVNldDIuYWRkKG1lc3NhZ2UpO1xuICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoKSB7XG4gIHZhciBfZGV2TWVzc2FnZVNldDM7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgbWVzc2FnZXMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBtZXNzYWdlc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG4gIGNvbnN0IG1lc3NhZ2UgPSBcIkZsb2F0aW5nIFVJOiBcIiArIG1lc3NhZ2VzLmpvaW4oJyAnKTtcbiAgaWYgKCEoKF9kZXZNZXNzYWdlU2V0MyA9IGRldk1lc3NhZ2VTZXQpICE9IG51bGwgJiYgX2Rldk1lc3NhZ2VTZXQzLmhhcyhtZXNzYWdlKSkpIHtcbiAgICB2YXIgX2Rldk1lc3NhZ2VTZXQ0O1xuICAgIChfZGV2TWVzc2FnZVNldDQgPSBkZXZNZXNzYWdlU2V0KSA9PSBudWxsIHx8IF9kZXZNZXNzYWdlU2V0NC5hZGQobWVzc2FnZSk7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBwb2ludGluZyBhcnJvdyB0cmlhbmdsZS5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ0Fycm93XG4gKi9cbmNvbnN0IEZsb2F0aW5nQXJyb3cgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGbG9hdGluZ0Fycm93KHByb3BzLCByZWYpIHtcbiAgY29uc3Qge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIGZsb2F0aW5nXG4gICAgICB9LFxuICAgICAgbWlkZGxld2FyZURhdGE6IHtcbiAgICAgICAgYXJyb3dcbiAgICAgIH1cbiAgICB9LFxuICAgIHdpZHRoID0gMTQsXG4gICAgaGVpZ2h0ID0gNyxcbiAgICB0aXBSYWRpdXMgPSAwLFxuICAgIHN0cm9rZVdpZHRoID0gMCxcbiAgICBzdGF0aWNPZmZzZXQsXG4gICAgc3Ryb2tlLFxuICAgIGQsXG4gICAgc3R5bGU6IHtcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIC4uLnJlc3RTdHlsZVxuICAgIH0gPSB7fSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICghcmVmKSB7XG4gICAgICB3YXJuKCdUaGUgYHJlZmAgcHJvcCBpcyByZXF1aXJlZCBmb3IgYEZsb2F0aW5nQXJyb3dgLicpO1xuICAgIH1cbiAgfVxuICBjb25zdCBjbGlwUGF0aElkID0gdXNlSWQoKTtcbiAgY29uc3QgW2lzUlRMLCBzZXRJc1JUTF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yOTMyXG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWZsb2F0aW5nKSByZXR1cm47XG4gICAgY29uc3QgaXNSVEwgPSBnZXRDb21wdXRlZFN0eWxlKGZsb2F0aW5nKS5kaXJlY3Rpb24gPT09ICdydGwnO1xuICAgIGlmIChpc1JUTCkge1xuICAgICAgc2V0SXNSVEwodHJ1ZSk7XG4gICAgfVxuICB9LCBbZmxvYXRpbmddKTtcbiAgaWYgKCFmbG9hdGluZykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gU3Ryb2tlcyBtdXN0IGJlIGRvdWJsZSB0aGUgYm9yZGVyIHdpZHRoLCB0aGlzIGVuc3VyZXMgdGhlIHN0cm9rZSdzIHdpZHRoXG4gIC8vIHdvcmtzIGFzIHlvdSdkIGV4cGVjdC5cbiAgY29uc3QgY29tcHV0ZWRTdHJva2VXaWR0aCA9IHN0cm9rZVdpZHRoICogMjtcbiAgY29uc3QgaGFsZlN0cm9rZVdpZHRoID0gY29tcHV0ZWRTdHJva2VXaWR0aCAvIDI7XG4gIGNvbnN0IHN2Z1ggPSB3aWR0aCAvIDIgKiAodGlwUmFkaXVzIC8gLTggKyAxKTtcbiAgY29uc3Qgc3ZnWSA9IGhlaWdodCAvIDIgKiB0aXBSYWRpdXMgLyA0O1xuICBjb25zdCBbc2lkZSwgYWxpZ25tZW50XSA9IHBsYWNlbWVudC5zcGxpdCgnLScpO1xuICBjb25zdCBpc0N1c3RvbVNoYXBlID0gISFkO1xuICBjb25zdCBpc1ZlcnRpY2FsU2lkZSA9IHNpZGUgPT09ICd0b3AnIHx8IHNpZGUgPT09ICdib3R0b20nO1xuICBjb25zdCB5T2Zmc2V0UHJvcCA9IHN0YXRpY09mZnNldCAmJiBhbGlnbm1lbnQgPT09ICdlbmQnID8gJ2JvdHRvbScgOiAndG9wJztcbiAgbGV0IHhPZmZzZXRQcm9wID0gc3RhdGljT2Zmc2V0ICYmIGFsaWdubWVudCA9PT0gJ2VuZCcgPyAncmlnaHQnIDogJ2xlZnQnO1xuICBpZiAoc3RhdGljT2Zmc2V0ICYmIGlzUlRMKSB7XG4gICAgeE9mZnNldFByb3AgPSBhbGlnbm1lbnQgPT09ICdlbmQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgfVxuICBjb25zdCBhcnJvd1ggPSAoYXJyb3cgPT0gbnVsbCA/IHZvaWQgMCA6IGFycm93LngpICE9IG51bGwgPyBzdGF0aWNPZmZzZXQgfHwgYXJyb3cueCA6ICcnO1xuICBjb25zdCBhcnJvd1kgPSAoYXJyb3cgPT0gbnVsbCA/IHZvaWQgMCA6IGFycm93LnkpICE9IG51bGwgPyBzdGF0aWNPZmZzZXQgfHwgYXJyb3cueSA6ICcnO1xuICBjb25zdCBkVmFsdWUgPSBkIHx8ICdNMCwwJyArIChcIiBIXCIgKyB3aWR0aCkgKyAoXCIgTFwiICsgKHdpZHRoIC0gc3ZnWCkgKyBcIixcIiArIChoZWlnaHQgLSBzdmdZKSkgKyAoXCIgUVwiICsgd2lkdGggLyAyICsgXCIsXCIgKyBoZWlnaHQgKyBcIiBcIiArIHN2Z1ggKyBcIixcIiArIChoZWlnaHQgLSBzdmdZKSkgKyAnIFonO1xuICBjb25zdCByb3RhdGlvbiA9IHtcbiAgICB0b3A6IGlzQ3VzdG9tU2hhcGUgPyAncm90YXRlKDE4MGRlZyknIDogJycsXG4gICAgbGVmdDogaXNDdXN0b21TaGFwZSA/ICdyb3RhdGUoOTBkZWcpJyA6ICdyb3RhdGUoLTkwZGVnKScsXG4gICAgYm90dG9tOiBpc0N1c3RvbVNoYXBlID8gJycgOiAncm90YXRlKDE4MGRlZyknLFxuICAgIHJpZ2h0OiBpc0N1c3RvbVNoYXBlID8gJ3JvdGF0ZSgtOTBkZWcpJyA6ICdyb3RhdGUoOTBkZWcpJ1xuICB9W3NpZGVdO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWUsXG4gICAgcmVmOiByZWYsXG4gICAgd2lkdGg6IGlzQ3VzdG9tU2hhcGUgPyB3aWR0aCA6IHdpZHRoICsgY29tcHV0ZWRTdHJva2VXaWR0aCxcbiAgICBoZWlnaHQ6IHdpZHRoLFxuICAgIHZpZXdCb3g6IFwiMCAwIFwiICsgd2lkdGggKyBcIiBcIiArIChoZWlnaHQgPiB3aWR0aCA/IGhlaWdodCA6IHdpZHRoKSxcbiAgICBzdHlsZToge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICBbeE9mZnNldFByb3BdOiBhcnJvd1gsXG4gICAgICBbeU9mZnNldFByb3BdOiBhcnJvd1ksXG4gICAgICBbc2lkZV06IGlzVmVydGljYWxTaWRlIHx8IGlzQ3VzdG9tU2hhcGUgPyAnMTAwJScgOiBcImNhbGMoMTAwJSAtIFwiICsgY29tcHV0ZWRTdHJva2VXaWR0aCAvIDIgKyBcInB4KVwiLFxuICAgICAgdHJhbnNmb3JtOiBcIlwiICsgcm90YXRpb24gKyAodHJhbnNmb3JtICE9IG51bGwgPyB0cmFuc2Zvcm0gOiAnJyksXG4gICAgICAuLi5yZXN0U3R5bGVcbiAgICB9XG4gIH0pLCBjb21wdXRlZFN0cm9rZVdpZHRoID4gMCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsaXBQYXRoOiBcInVybCgjXCIgKyBjbGlwUGF0aElkICsgXCIpXCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgc3Ryb2tlOiBzdHJva2VcbiAgICAvLyBBY2NvdW50IGZvciB0aGUgc3Ryb2tlIG9uIHRoZSBmaWxsIHBhdGggcmVuZGVyZWQgYmVsb3cuXG4gICAgLFxuICAgIHN0cm9rZVdpZHRoOiBjb21wdXRlZFN0cm9rZVdpZHRoICsgKGQgPyAwIDogMSksXG4gICAgZDogZFZhbHVlXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIHN0cm9rZTogY29tcHV0ZWRTdHJva2VXaWR0aCAmJiAhZCA/IHJlc3QuZmlsbCA6ICdub25lJyxcbiAgICBkOiBkVmFsdWVcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2xpcFBhdGhcIiwge1xuICAgIGlkOiBjbGlwUGF0aElkXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogLWhhbGZTdHJva2VXaWR0aCxcbiAgICB5OiBoYWxmU3Ryb2tlV2lkdGggKiAoaXNDdXN0b21TaGFwZSA/IC0xIDogMSksXG4gICAgd2lkdGg6IHdpZHRoICsgY29tcHV0ZWRTdHJva2VXaWR0aCxcbiAgICBoZWlnaHQ6IHdpZHRoXG4gIH0pKSk7XG59KTtcblxuZnVuY3Rpb24gY3JlYXRlUHViU3ViKCkge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gIHJldHVybiB7XG4gICAgZW1pdChldmVudCwgZGF0YSkge1xuICAgICAgdmFyIF9tYXAkZ2V0O1xuICAgICAgKF9tYXAkZ2V0ID0gbWFwLmdldChldmVudCkpID09IG51bGwgfHwgX21hcCRnZXQuZm9yRWFjaChoYW5kbGVyID0+IGhhbmRsZXIoZGF0YSkpO1xuICAgIH0sXG4gICAgb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICBtYXAuc2V0KGV2ZW50LCBbLi4uKG1hcC5nZXQoZXZlbnQpIHx8IFtdKSwgbGlzdGVuZXJdKTtcbiAgICB9LFxuICAgIG9mZihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBfbWFwJGdldDI7XG4gICAgICBtYXAuc2V0KGV2ZW50LCAoKF9tYXAkZ2V0MiA9IG1hcC5nZXQoZXZlbnQpKSA9PSBudWxsID8gdm9pZCAwIDogX21hcCRnZXQyLmZpbHRlcihsID0+IGwgIT09IGxpc3RlbmVyKSkgfHwgW10pO1xuICAgIH1cbiAgfTtcbn1cblxuY29uc3QgRmxvYXRpbmdOb2RlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuY29uc3QgRmxvYXRpbmdUcmVlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcmVudCBub2RlIGlkIGZvciBuZXN0ZWQgZmxvYXRpbmcgZWxlbWVudHMsIGlmIGF2YWlsYWJsZS5cbiAqIFJldHVybnMgYG51bGxgIGZvciB0b3AtbGV2ZWwgZmxvYXRpbmcgZWxlbWVudHMuXG4gKi9cbmNvbnN0IHVzZUZsb2F0aW5nUGFyZW50Tm9kZUlkID0gKCkgPT4ge1xuICB2YXIgX1JlYWN0JHVzZUNvbnRleHQ7XG4gIHJldHVybiAoKF9SZWFjdCR1c2VDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGbG9hdGluZ05vZGVDb250ZXh0KSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9SZWFjdCR1c2VDb250ZXh0LmlkKSB8fCBudWxsO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZWFyZXN0IGZsb2F0aW5nIHRyZWUgY29udGV4dCwgaWYgYXZhaWxhYmxlLlxuICovXG5jb25zdCB1c2VGbG9hdGluZ1RyZWUgPSAoKSA9PiBSZWFjdC51c2VDb250ZXh0KEZsb2F0aW5nVHJlZUNvbnRleHQpO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhIG5vZGUgaW50byB0aGUgYEZsb2F0aW5nVHJlZWAsIHJldHVybmluZyBpdHMgaWQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdUcmVlXG4gKi9cbmZ1bmN0aW9uIHVzZUZsb2F0aW5nTm9kZUlkKGN1c3RvbVBhcmVudElkKSB7XG4gIGNvbnN0IGlkID0gdXNlSWQoKTtcbiAgY29uc3QgdHJlZSA9IHVzZUZsb2F0aW5nVHJlZSgpO1xuICBjb25zdCByZWFjdFBhcmVudElkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKTtcbiAgY29uc3QgcGFyZW50SWQgPSBjdXN0b21QYXJlbnRJZCB8fCByZWFjdFBhcmVudElkO1xuICBpbmRleCgoKSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IHtcbiAgICAgIGlkLFxuICAgICAgcGFyZW50SWRcbiAgICB9O1xuICAgIHRyZWUgPT0gbnVsbCB8fCB0cmVlLmFkZE5vZGUobm9kZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRyZWUgPT0gbnVsbCB8fCB0cmVlLnJlbW92ZU5vZGUobm9kZSk7XG4gICAgfTtcbiAgfSwgW3RyZWUsIGlkLCBwYXJlbnRJZF0pO1xuICByZXR1cm4gaWQ7XG59XG4vKipcbiAqIFByb3ZpZGVzIHBhcmVudCBub2RlIGNvbnRleHQgZm9yIG5lc3RlZCBmbG9hdGluZyBlbGVtZW50cy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ1RyZWVcbiAqL1xuZnVuY3Rpb24gRmxvYXRpbmdOb2RlKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBpZFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHBhcmVudElkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZsb2F0aW5nTm9kZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgICAgaWQsXG4gICAgICBwYXJlbnRJZFxuICAgIH0pLCBbaWQsIHBhcmVudElkXSlcbiAgfSwgY2hpbGRyZW4pO1xufVxuLyoqXG4gKiBQcm92aWRlcyBjb250ZXh0IGZvciBuZXN0ZWQgZmxvYXRpbmcgZWxlbWVudHMgd2hlbiB0aGV5IGFyZSBub3QgY2hpbGRyZW4gb2ZcbiAqIGVhY2ggb3RoZXIgb24gdGhlIERPTS5cbiAqIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpbiBhbGwgY2FzZXMsIGV4Y2VwdCB3aGVuIHRoZXJlIG11c3QgYmUgZXhwbGljaXQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHBhcmVudCBhbmQgY2hpbGQgZmxvYXRpbmcgZWxlbWVudHMuIEl0IGlzIG5lY2Vzc2FyeSBmb3I6XG4gKiAtIFRoZSBgYnViYmxlc2Agb3B0aW9uIGluIHRoZSBgdXNlRGlzbWlzcygpYCBIb29rXG4gKiAtIE5lc3RlZCB2aXJ0dWFsIGxpc3QgbmF2aWdhdGlvblxuICogLSBOZXN0ZWQgZmxvYXRpbmcgZWxlbWVudHMgdGhhdCBlYWNoIG9wZW4gb24gaG92ZXJcbiAqIC0gQ3VzdG9tIGNvbW11bmljYXRpb24gYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkIGZsb2F0aW5nIGVsZW1lbnRzXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvRmxvYXRpbmdUcmVlXG4gKi9cbmZ1bmN0aW9uIEZsb2F0aW5nVHJlZShwcm9wcykge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW5cbiAgfSA9IHByb3BzO1xuICBjb25zdCBub2Rlc1JlZiA9IFJlYWN0LnVzZVJlZihbXSk7XG4gIGNvbnN0IGFkZE5vZGUgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBub2Rlc1JlZi5jdXJyZW50ID0gWy4uLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVdO1xuICB9LCBbXSk7XG4gIGNvbnN0IHJlbW92ZU5vZGUgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBub2Rlc1JlZi5jdXJyZW50ID0gbm9kZXNSZWYuY3VycmVudC5maWx0ZXIobiA9PiBuICE9PSBub2RlKTtcbiAgfSwgW10pO1xuICBjb25zdCBldmVudHMgPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBjcmVhdGVQdWJTdWIoKSlbMF07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGbG9hdGluZ1RyZWVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgIG5vZGVzUmVmLFxuICAgICAgYWRkTm9kZSxcbiAgICAgIHJlbW92ZU5vZGUsXG4gICAgICBldmVudHNcbiAgICB9KSwgW2FkZE5vZGUsIHJlbW92ZU5vZGUsIGV2ZW50c10pXG4gIH0sIGNoaWxkcmVuKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXR0cmlidXRlKG5hbWUpIHtcbiAgcmV0dXJuIFwiZGF0YS1mbG9hdGluZy11aS1cIiArIG5hbWU7XG59XG5cbmZ1bmN0aW9uIHVzZUxhdGVzdFJlZih2YWx1ZSkge1xuICBjb25zdCByZWYgPSB1c2VSZWYodmFsdWUpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZWY7XG59XG5cbmNvbnN0IHNhZmVQb2x5Z29uSWRlbnRpZmllciA9IC8qI19fUFVSRV9fKi9jcmVhdGVBdHRyaWJ1dGUoJ3NhZmUtcG9seWdvbicpO1xuZnVuY3Rpb24gZ2V0RGVsYXkodmFsdWUsIHByb3AsIHBvaW50ZXJUeXBlKSB7XG4gIGlmIChwb2ludGVyVHlwZSAmJiAhaXNNb3VzZUxpa2VQb2ludGVyVHlwZShwb2ludGVyVHlwZSkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHZvaWQgMCA6IHZhbHVlW3Byb3BdO1xufVxuLyoqXG4gKiBPcGVucyB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGlsZSBob3ZlcmluZyBvdmVyIHRoZSByZWZlcmVuY2UgZWxlbWVudCwgbGlrZVxuICogQ1NTIGA6aG92ZXJgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUhvdmVyXG4gKi9cbmZ1bmN0aW9uIHVzZUhvdmVyKGNvbnRleHQsIHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZGF0YVJlZixcbiAgICBldmVudHMsXG4gICAgZWxlbWVudHNcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBkZWxheSA9IDAsXG4gICAgaGFuZGxlQ2xvc2UgPSBudWxsLFxuICAgIG1vdXNlT25seSA9IGZhbHNlLFxuICAgIHJlc3RNcyA9IDAsXG4gICAgbW92ZSA9IHRydWVcbiAgfSA9IHByb3BzO1xuICBjb25zdCB0cmVlID0gdXNlRmxvYXRpbmdUcmVlKCk7XG4gIGNvbnN0IHBhcmVudElkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKTtcbiAgY29uc3QgaGFuZGxlQ2xvc2VSZWYgPSB1c2VMYXRlc3RSZWYoaGFuZGxlQ2xvc2UpO1xuICBjb25zdCBkZWxheVJlZiA9IHVzZUxhdGVzdFJlZihkZWxheSk7XG4gIGNvbnN0IG9wZW5SZWYgPSB1c2VMYXRlc3RSZWYob3Blbik7XG4gIGNvbnN0IHBvaW50ZXJUeXBlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IHRpbWVvdXRSZWYgPSBSZWFjdC51c2VSZWYoLTEpO1xuICBjb25zdCBoYW5kbGVyUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IHJlc3RUaW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKC0xKTtcbiAgY29uc3QgYmxvY2tNb3VzZU1vdmVSZWYgPSBSZWFjdC51c2VSZWYodHJ1ZSk7XG4gIGNvbnN0IHBlcmZvcm1lZFBvaW50ZXJFdmVudHNNdXRhdGlvblJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHVuYmluZE1vdXNlTW92ZVJlZiA9IFJlYWN0LnVzZVJlZigoKSA9PiB7fSk7XG4gIGNvbnN0IGlzSG92ZXJPcGVuID0gUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHZhciBfZGF0YVJlZiRjdXJyZW50JG9wZW47XG4gICAgY29uc3QgdHlwZSA9IChfZGF0YVJlZiRjdXJyZW50JG9wZW4gPSBkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2RhdGFSZWYkY3VycmVudCRvcGVuLnR5cGU7XG4gICAgcmV0dXJuICh0eXBlID09IG51bGwgPyB2b2lkIDAgOiB0eXBlLmluY2x1ZGVzKCdtb3VzZScpKSAmJiB0eXBlICE9PSAnbW91c2Vkb3duJztcbiAgfSwgW2RhdGFSZWZdKTtcblxuICAvLyBXaGVuIGNsb3NpbmcgYmVmb3JlIG9wZW5pbmcsIGNsZWFyIHRoZSBkZWxheSB0aW1lb3V0cyB0byBjYW5jZWwgaXRcbiAgLy8gZnJvbSBzaG93aW5nLlxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIG9uT3BlbkNoYW5nZShfcmVmKSB7XG4gICAgICBsZXQge1xuICAgICAgICBvcGVuXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIGlmICghb3Blbikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlc3RUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICBibG9ja01vdXNlTW92ZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXZlbnRzLm9uKCdvcGVuY2hhbmdlJywgb25PcGVuQ2hhbmdlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZXZlbnRzLm9mZignb3BlbmNoYW5nZScsIG9uT3BlbkNoYW5nZSk7XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIGV2ZW50c10pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGlmICghaGFuZGxlQ2xvc2VSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIGlmICghb3BlbikgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIG9uTGVhdmUoZXZlbnQpIHtcbiAgICAgIGlmIChpc0hvdmVyT3BlbigpKSB7XG4gICAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQsICdob3ZlcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBodG1sID0gZ2V0RG9jdW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpLmRvY3VtZW50RWxlbWVudDtcbiAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvbkxlYXZlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaHRtbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgb25MZWF2ZSk7XG4gICAgfTtcbiAgfSwgW2VsZW1lbnRzLmZsb2F0aW5nLCBvcGVuLCBvbk9wZW5DaGFuZ2UsIGVuYWJsZWQsIGhhbmRsZUNsb3NlUmVmLCBpc0hvdmVyT3Blbl0pO1xuICBjb25zdCBjbG9zZVdpdGhEZWxheSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCwgcnVuRWxzZUJyYW5jaCwgcmVhc29uKSB7XG4gICAgaWYgKHJ1bkVsc2VCcmFuY2ggPT09IHZvaWQgMCkge1xuICAgICAgcnVuRWxzZUJyYW5jaCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChyZWFzb24gPT09IHZvaWQgMCkge1xuICAgICAgcmVhc29uID0gJ2hvdmVyJztcbiAgICB9XG4gICAgY29uc3QgY2xvc2VEZWxheSA9IGdldERlbGF5KGRlbGF5UmVmLmN1cnJlbnQsICdjbG9zZScsIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQpO1xuICAgIGlmIChjbG9zZURlbGF5ICYmICFoYW5kbGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudCwgcmVhc29uKSwgY2xvc2VEZWxheSk7XG4gICAgfSBlbHNlIGlmIChydW5FbHNlQnJhbmNoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQsIHJlYXNvbik7XG4gICAgfVxuICB9LCBbZGVsYXlSZWYsIG9uT3BlbkNoYW5nZV0pO1xuICBjb25zdCBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlciA9IHVzZUVmZmVjdEV2ZW50KCgpID0+IHtcbiAgICB1bmJpbmRNb3VzZU1vdmVSZWYuY3VycmVudCgpO1xuICAgIGhhbmRsZXJSZWYuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgfSk7XG4gIGNvbnN0IGNsZWFyUG9pbnRlckV2ZW50cyA9IHVzZUVmZmVjdEV2ZW50KCgpID0+IHtcbiAgICBpZiAocGVyZm9ybWVkUG9pbnRlckV2ZW50c011dGF0aW9uUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBnZXREb2N1bWVudChlbGVtZW50cy5mbG9hdGluZykuYm9keTtcbiAgICAgIGJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgYm9keS5yZW1vdmVBdHRyaWJ1dGUoc2FmZVBvbHlnb25JZGVudGlmaWVyKTtcbiAgICAgIHBlcmZvcm1lZFBvaW50ZXJFdmVudHNNdXRhdGlvblJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICAvLyBSZWdpc3RlcmluZyB0aGUgbW91c2UgZXZlbnRzIG9uIHRoZSByZWZlcmVuY2UgZGlyZWN0bHkgdG8gYnlwYXNzIFJlYWN0J3NcbiAgLy8gZGVsZWdhdGlvbiBzeXN0ZW0uIElmIHRoZSBjdXJzb3Igd2FzIG9uIGEgZGlzYWJsZWQgZWxlbWVudCBhbmQgdGhlbiBlbnRlcmVkXG4gIC8vIHRoZSByZWZlcmVuY2UgKG5vIGdhcCksIGBtb3VzZWVudGVyYCBkb2Vzbid0IGZpcmUgaW4gdGhlIGRlbGVnYXRpb24gc3lzdGVtLlxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIGlzQ2xpY2tMaWtlT3BlbkV2ZW50KCkge1xuICAgICAgcmV0dXJuIGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQgPyBbJ2NsaWNrJywgJ21vdXNlZG93biddLmluY2x1ZGVzKGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQudHlwZSkgOiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb25Nb3VzZUVudGVyKGV2ZW50KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIGJsb2NrTW91c2VNb3ZlUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIGlmIChtb3VzZU9ubHkgJiYgIWlzTW91c2VMaWtlUG9pbnRlclR5cGUocG9pbnRlclR5cGVSZWYuY3VycmVudCkgfHwgcmVzdE1zID4gMCAmJiAhZ2V0RGVsYXkoZGVsYXlSZWYuY3VycmVudCwgJ29wZW4nKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBvcGVuRGVsYXkgPSBnZXREZWxheShkZWxheVJlZi5jdXJyZW50LCAnb3BlbicsIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQpO1xuICAgICAgaWYgKG9wZW5EZWxheSkge1xuICAgICAgICB0aW1lb3V0UmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFvcGVuUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudCwgJ2hvdmVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBvcGVuRGVsYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25PcGVuQ2hhbmdlKHRydWUsIGV2ZW50LCAnaG92ZXInKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25Nb3VzZUxlYXZlKGV2ZW50KSB7XG4gICAgICBpZiAoaXNDbGlja0xpa2VPcGVuRXZlbnQoKSkgcmV0dXJuO1xuICAgICAgdW5iaW5kTW91c2VNb3ZlUmVmLmN1cnJlbnQoKTtcbiAgICAgIGNvbnN0IGRvYyA9IGdldERvY3VtZW50KGVsZW1lbnRzLmZsb2F0aW5nKTtcbiAgICAgIGNsZWFyVGltZW91dChyZXN0VGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIGlmIChoYW5kbGVDbG9zZVJlZi5jdXJyZW50ICYmIGRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQpIHtcbiAgICAgICAgLy8gUHJldmVudCBjbGVhcmluZyBgb25TY3JvbGxNb3VzZUxlYXZlYCB0aW1lb3V0LlxuICAgICAgICBpZiAoIW9wZW4pIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVyUmVmLmN1cnJlbnQgPSBoYW5kbGVDbG9zZVJlZi5jdXJyZW50KHtcbiAgICAgICAgICAuLi5kYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0LFxuICAgICAgICAgIHRyZWUsXG4gICAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgICAgICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgICAgICBjbGVhclBvaW50ZXJFdmVudHMoKTtcbiAgICAgICAgICAgIGNsZWFudXBNb3VzZU1vdmVIYW5kbGVyKCk7XG4gICAgICAgICAgICBjbG9zZVdpdGhEZWxheShldmVudCwgdHJ1ZSwgJ3NhZmUtcG9seWdvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyUmVmLmN1cnJlbnQ7XG4gICAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVyKTtcbiAgICAgICAgdW5iaW5kTW91c2VNb3ZlUmVmLmN1cnJlbnQgPSAoKSA9PiB7XG4gICAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFsbG93IGludGVyYWN0aXZpdHkgd2l0aG91dCBgc2FmZVBvbHlnb25gIG9uIHRvdWNoIGRldmljZXMuIFdpdGggYVxuICAgICAgLy8gcG9pbnRlciwgYSBzaG9ydCBjbG9zZSBkZWxheSBpcyBhbiBhbHRlcm5hdGl2ZSwgc28gaXQgc2hvdWxkIHdvcmtcbiAgICAgIC8vIGNvbnNpc3RlbnRseS5cbiAgICAgIGNvbnN0IHNob3VsZENsb3NlID0gcG9pbnRlclR5cGVSZWYuY3VycmVudCA9PT0gJ3RvdWNoJyA/ICFjb250YWlucyhlbGVtZW50cy5mbG9hdGluZywgZXZlbnQucmVsYXRlZFRhcmdldCkgOiB0cnVlO1xuICAgICAgaWYgKHNob3VsZENsb3NlKSB7XG4gICAgICAgIGNsb3NlV2l0aERlbGF5KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgY2xvc2VzIGFmdGVyIHNjcm9sbGluZyBldmVuIGlmIHRoZSBwb2ludGVyXG4gICAgLy8gZGlkIG5vdCBtb3ZlLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9kaXNjdXNzaW9ucy8xNjkyXG4gICAgZnVuY3Rpb24gb25TY3JvbGxNb3VzZUxlYXZlKGV2ZW50KSB7XG4gICAgICBpZiAoaXNDbGlja0xpa2VPcGVuRXZlbnQoKSkgcmV0dXJuO1xuICAgICAgaWYgKCFkYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0KSByZXR1cm47XG4gICAgICBoYW5kbGVDbG9zZVJlZi5jdXJyZW50ID09IG51bGwgfHwgaGFuZGxlQ2xvc2VSZWYuY3VycmVudCh7XG4gICAgICAgIC4uLmRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQsXG4gICAgICAgIHRyZWUsXG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFksXG4gICAgICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgICAgY2xlYXJQb2ludGVyRXZlbnRzKCk7XG4gICAgICAgICAgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIoKTtcbiAgICAgICAgICBjbG9zZVdpdGhEZWxheShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKGlzRWxlbWVudChlbGVtZW50cy5kb21SZWZlcmVuY2UpKSB7XG4gICAgICB2YXIgX2VsZW1lbnRzJGZsb2F0aW5nO1xuICAgICAgY29uc3QgcmVmID0gZWxlbWVudHMuZG9tUmVmZXJlbmNlO1xuICAgICAgb3BlbiAmJiByZWYuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uU2Nyb2xsTW91c2VMZWF2ZSk7XG4gICAgICAoX2VsZW1lbnRzJGZsb2F0aW5nID0gZWxlbWVudHMuZmxvYXRpbmcpID09IG51bGwgfHwgX2VsZW1lbnRzJGZsb2F0aW5nLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblNjcm9sbE1vdXNlTGVhdmUpO1xuICAgICAgbW92ZSAmJiByZWYuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZUVudGVyLCB7XG4gICAgICAgIG9uY2U6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmVmLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBvbk1vdXNlRW50ZXIpO1xuICAgICAgcmVmLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvbk1vdXNlTGVhdmUpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdmFyIF9lbGVtZW50cyRmbG9hdGluZzI7XG4gICAgICAgIG9wZW4gJiYgcmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvblNjcm9sbE1vdXNlTGVhdmUpO1xuICAgICAgICAoX2VsZW1lbnRzJGZsb2F0aW5nMiA9IGVsZW1lbnRzLmZsb2F0aW5nKSA9PSBudWxsIHx8IF9lbGVtZW50cyRmbG9hdGluZzIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uU2Nyb2xsTW91c2VMZWF2ZSk7XG4gICAgICAgIG1vdmUgJiYgcmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VFbnRlcik7XG4gICAgICAgIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgb25Nb3VzZUVudGVyKTtcbiAgICAgICAgcmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBvbk1vdXNlTGVhdmUpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtlbGVtZW50cywgZW5hYmxlZCwgY29udGV4dCwgbW91c2VPbmx5LCByZXN0TXMsIG1vdmUsIGNsb3NlV2l0aERlbGF5LCBjbGVhbnVwTW91c2VNb3ZlSGFuZGxlciwgY2xlYXJQb2ludGVyRXZlbnRzLCBvbk9wZW5DaGFuZ2UsIG9wZW4sIG9wZW5SZWYsIHRyZWUsIGRlbGF5UmVmLCBoYW5kbGVDbG9zZVJlZiwgZGF0YVJlZl0pO1xuXG4gIC8vIEJsb2NrIHBvaW50ZXItZXZlbnRzIG9mIGV2ZXJ5IGVsZW1lbnQgb3RoZXIgdGhhbiB0aGUgcmVmZXJlbmNlIGFuZCBmbG9hdGluZ1xuICAvLyB3aGlsZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBpcyBvcGVuIGFuZCBoYXMgYSBgaGFuZGxlQ2xvc2VgIGhhbmRsZXIuIEFsc29cbiAgLy8gaGFuZGxlcyBuZXN0ZWQgZmxvYXRpbmcgZWxlbWVudHMuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMTcyMlxuICBpbmRleCgoKSA9PiB7XG4gICAgdmFyIF9oYW5kbGVDbG9zZVJlZiRjdXJyZTtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBpZiAob3BlbiAmJiAoX2hhbmRsZUNsb3NlUmVmJGN1cnJlID0gaGFuZGxlQ2xvc2VSZWYuY3VycmVudCkgIT0gbnVsbCAmJiBfaGFuZGxlQ2xvc2VSZWYkY3VycmUuX19vcHRpb25zLmJsb2NrUG9pbnRlckV2ZW50cyAmJiBpc0hvdmVyT3BlbigpKSB7XG4gICAgICBjb25zdCBib2R5ID0gZ2V0RG9jdW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpLmJvZHk7XG4gICAgICBib2R5LnNldEF0dHJpYnV0ZShzYWZlUG9seWdvbklkZW50aWZpZXIsICcnKTtcbiAgICAgIGJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHBlcmZvcm1lZFBvaW50ZXJFdmVudHNNdXRhdGlvblJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGZsb2F0aW5nRWwgPSBlbGVtZW50cy5mbG9hdGluZztcbiAgICAgIGlmIChpc0VsZW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlKSAmJiBmbG9hdGluZ0VsKSB7XG4gICAgICAgIHZhciBfdHJlZSRub2Rlc1JlZiRjdXJyZW47XG4gICAgICAgIGNvbnN0IHJlZiA9IGVsZW1lbnRzLmRvbVJlZmVyZW5jZTtcbiAgICAgICAgY29uc3QgcGFyZW50RmxvYXRpbmcgPSB0cmVlID09IG51bGwgfHwgKF90cmVlJG5vZGVzUmVmJGN1cnJlbiA9IHRyZWUubm9kZXNSZWYuY3VycmVudC5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gcGFyZW50SWQpKSA9PSBudWxsIHx8IChfdHJlZSRub2Rlc1JlZiRjdXJyZW4gPSBfdHJlZSRub2Rlc1JlZiRjdXJyZW4uY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF90cmVlJG5vZGVzUmVmJGN1cnJlbi5lbGVtZW50cy5mbG9hdGluZztcbiAgICAgICAgaWYgKHBhcmVudEZsb2F0aW5nKSB7XG4gICAgICAgICAgcGFyZW50RmxvYXRpbmcuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJlZi5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICBmbG9hdGluZ0VsLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgcmVmLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgICBmbG9hdGluZ0VsLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtlbmFibGVkLCBvcGVuLCBwYXJlbnRJZCwgZWxlbWVudHMsIHRyZWUsIGhhbmRsZUNsb3NlUmVmLCBpc0hvdmVyT3Blbl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICBwb2ludGVyVHlwZVJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIoKTtcbiAgICAgIGNsZWFyUG9pbnRlckV2ZW50cygpO1xuICAgIH1cbiAgfSwgW29wZW4sIGNsZWFudXBNb3VzZU1vdmVIYW5kbGVyLCBjbGVhclBvaW50ZXJFdmVudHNdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIoKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgY2xlYXJUaW1lb3V0KHJlc3RUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgY2xlYXJQb2ludGVyRXZlbnRzKCk7XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIGVsZW1lbnRzLmRvbVJlZmVyZW5jZSwgY2xlYW51cE1vdXNlTW92ZUhhbmRsZXIsIGNsZWFyUG9pbnRlckV2ZW50c10pO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBmdW5jdGlvbiBzZXRQb2ludGVyUmVmKGV2ZW50KSB7XG4gICAgICBwb2ludGVyVHlwZVJlZi5jdXJyZW50ID0gZXZlbnQucG9pbnRlclR5cGU7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBvblBvaW50ZXJEb3duOiBzZXRQb2ludGVyUmVmLFxuICAgICAgb25Qb2ludGVyRW50ZXI6IHNldFBvaW50ZXJSZWYsXG4gICAgICBvbk1vdXNlTW92ZShldmVudCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgbmF0aXZlRXZlbnRcbiAgICAgICAgfSA9IGV2ZW50O1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoKSB7XG4gICAgICAgICAgaWYgKCFibG9ja01vdXNlTW92ZVJlZi5jdXJyZW50ICYmICFvcGVuUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBuYXRpdmVFdmVudCwgJ2hvdmVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtb3VzZU9ubHkgJiYgIWlzTW91c2VMaWtlUG9pbnRlclR5cGUocG9pbnRlclR5cGVSZWYuY3VycmVudCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wZW4gfHwgcmVzdE1zID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyVGltZW91dChyZXN0VGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgICAgaWYgKHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPT09ICd0b3VjaCcpIHtcbiAgICAgICAgICBoYW5kbGVNb3VzZU1vdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN0VGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoaGFuZGxlTW91c2VNb3ZlLCByZXN0TXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW21vdXNlT25seSwgb25PcGVuQ2hhbmdlLCBvcGVuLCBvcGVuUmVmLCByZXN0TXNdKTtcbiAgY29uc3QgZmxvYXRpbmcgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgb25Nb3VzZUVudGVyKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgfSxcbiAgICBvbk1vdXNlTGVhdmUoZXZlbnQpIHtcbiAgICAgIGNsb3NlV2l0aERlbGF5KGV2ZW50Lm5hdGl2ZUV2ZW50LCBmYWxzZSk7XG4gICAgfVxuICB9KSwgW2Nsb3NlV2l0aERlbGF5XSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IGVuYWJsZWQgPyB7XG4gICAgcmVmZXJlbmNlLFxuICAgIGZsb2F0aW5nXG4gIH0gOiB7fSwgW2VuYWJsZWQsIHJlZmVyZW5jZSwgZmxvYXRpbmddKTtcbn1cblxuY29uc3QgTk9PUCA9ICgpID0+IHt9O1xuY29uc3QgRmxvYXRpbmdEZWxheUdyb3VwQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgZGVsYXk6IDAsXG4gIGluaXRpYWxEZWxheTogMCxcbiAgdGltZW91dE1zOiAwLFxuICBjdXJyZW50SWQ6IG51bGwsXG4gIHNldEN1cnJlbnRJZDogTk9PUCxcbiAgc2V0U3RhdGU6IE5PT1AsXG4gIGlzSW5zdGFudFBoYXNlOiBmYWxzZVxufSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFVzZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGB1c2VEZWxheUdyb3VwKClgIGluc3RlYWQuXG4gKi9cbmNvbnN0IHVzZURlbGF5R3JvdXBDb250ZXh0ID0gKCkgPT4gUmVhY3QudXNlQ29udGV4dChGbG9hdGluZ0RlbGF5R3JvdXBDb250ZXh0KTtcbi8qKlxuICogUHJvdmlkZXMgY29udGV4dCBmb3IgYSBncm91cCBvZiBmbG9hdGluZyBlbGVtZW50cyB0aGF0IHNob3VsZCBzaGFyZSBhXG4gKiBgZGVsYXlgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nRGVsYXlHcm91cFxuICovXG5mdW5jdGlvbiBGbG9hdGluZ0RlbGF5R3JvdXAocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGRlbGF5LFxuICAgIHRpbWVvdXRNcyA9IDBcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IFJlYWN0LnVzZVJlZHVjZXIoKHByZXYsIG5leHQpID0+ICh7XG4gICAgLi4ucHJldixcbiAgICAuLi5uZXh0XG4gIH0pLCB7XG4gICAgZGVsYXksXG4gICAgdGltZW91dE1zLFxuICAgIGluaXRpYWxEZWxheTogZGVsYXksXG4gICAgY3VycmVudElkOiBudWxsLFxuICAgIGlzSW5zdGFudFBoYXNlOiBmYWxzZVxuICB9KTtcbiAgY29uc3QgaW5pdGlhbEN1cnJlbnRJZFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qgc2V0Q3VycmVudElkID0gUmVhY3QudXNlQ2FsbGJhY2soY3VycmVudElkID0+IHtcbiAgICBzZXRTdGF0ZSh7XG4gICAgICBjdXJyZW50SWRcbiAgICB9KTtcbiAgfSwgW10pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKHN0YXRlLmN1cnJlbnRJZCkge1xuICAgICAgaWYgKGluaXRpYWxDdXJyZW50SWRSZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICBpbml0aWFsQ3VycmVudElkUmVmLmN1cnJlbnQgPSBzdGF0ZS5jdXJyZW50SWQ7XG4gICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5pc0luc3RhbnRQaGFzZSkge1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgaXNJbnN0YW50UGhhc2U6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzdGF0ZS5pc0luc3RhbnRQaGFzZSkge1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgaXNJbnN0YW50UGhhc2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaW5pdGlhbEN1cnJlbnRJZFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH0sIFtzdGF0ZS5jdXJyZW50SWQsIHN0YXRlLmlzSW5zdGFudFBoYXNlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGbG9hdGluZ0RlbGF5R3JvdXBDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2V0U3RhdGUsXG4gICAgICBzZXRDdXJyZW50SWRcbiAgICB9KSwgW3N0YXRlLCBzZXRDdXJyZW50SWRdKVxuICB9LCBjaGlsZHJlbik7XG59XG4vKipcbiAqIEVuYWJsZXMgZ3JvdXBpbmcgd2hlbiBjYWxsZWQgaW5zaWRlIGEgY29tcG9uZW50IHRoYXQncyBhIGNoaWxkIG9mIGFcbiAqIGBGbG9hdGluZ0RlbGF5R3JvdXBgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nRGVsYXlHcm91cFxuICovXG5mdW5jdGlvbiB1c2VEZWxheUdyb3VwKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgZmxvYXRpbmdJZFxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGlkOiBvcHRpb25JZFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaWQgPSBvcHRpb25JZCAhPSBudWxsID8gb3B0aW9uSWQgOiBmbG9hdGluZ0lkO1xuICBjb25zdCBncm91cENvbnRleHQgPSB1c2VEZWxheUdyb3VwQ29udGV4dCgpO1xuICBjb25zdCB7XG4gICAgY3VycmVudElkLFxuICAgIHNldEN1cnJlbnRJZCxcbiAgICBpbml0aWFsRGVsYXksXG4gICAgc2V0U3RhdGUsXG4gICAgdGltZW91dE1zXG4gIH0gPSBncm91cENvbnRleHQ7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIWN1cnJlbnRJZCkgcmV0dXJuO1xuICAgIHNldFN0YXRlKHtcbiAgICAgIGRlbGF5OiB7XG4gICAgICAgIG9wZW46IDEsXG4gICAgICAgIGNsb3NlOiBnZXREZWxheShpbml0aWFsRGVsYXksICdjbG9zZScpXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGN1cnJlbnRJZCAhPT0gaWQpIHtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgfVxuICB9LCBbaWQsIG9uT3BlbkNoYW5nZSwgc2V0U3RhdGUsIGN1cnJlbnRJZCwgaW5pdGlhbERlbGF5XSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBmdW5jdGlvbiB1bnNldCgpIHtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSk7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGRlbGF5OiBpbml0aWFsRGVsYXksXG4gICAgICAgIGN1cnJlbnRJZDogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghY3VycmVudElkKSByZXR1cm47XG4gICAgaWYgKCFvcGVuICYmIGN1cnJlbnRJZCA9PT0gaWQpIHtcbiAgICAgIGlmICh0aW1lb3V0TXMpIHtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KHVuc2V0LCB0aW1lb3V0TXMpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHVuc2V0KCk7XG4gICAgfVxuICB9LCBbb3Blbiwgc2V0U3RhdGUsIGN1cnJlbnRJZCwgaWQsIG9uT3BlbkNoYW5nZSwgaW5pdGlhbERlbGF5LCB0aW1lb3V0TXNdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChzZXRDdXJyZW50SWQgPT09IE5PT1AgfHwgIW9wZW4pIHJldHVybjtcbiAgICBzZXRDdXJyZW50SWQoaWQpO1xuICB9LCBbb3Blbiwgc2V0Q3VycmVudElkLCBpZF0pO1xuICByZXR1cm4gZ3JvdXBDb250ZXh0O1xufVxuXG5mdW5jdGlvbiBnZXRBbmNlc3RvcnMobm9kZXMsIGlkKSB7XG4gIHZhciBfbm9kZXMkZmluZDtcbiAgbGV0IGFsbEFuY2VzdG9ycyA9IFtdO1xuICBsZXQgY3VycmVudFBhcmVudElkID0gKF9ub2RlcyRmaW5kID0gbm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT09IGlkKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlcyRmaW5kLnBhcmVudElkO1xuICB3aGlsZSAoY3VycmVudFBhcmVudElkKSB7XG4gICAgY29uc3QgY3VycmVudE5vZGUgPSBub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gY3VycmVudFBhcmVudElkKTtcbiAgICBjdXJyZW50UGFyZW50SWQgPSBjdXJyZW50Tm9kZSA9PSBudWxsID8gdm9pZCAwIDogY3VycmVudE5vZGUucGFyZW50SWQ7XG4gICAgaWYgKGN1cnJlbnROb2RlKSB7XG4gICAgICBhbGxBbmNlc3RvcnMgPSBhbGxBbmNlc3RvcnMuY29uY2F0KGN1cnJlbnROb2RlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFsbEFuY2VzdG9ycztcbn1cblxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obm9kZXMsIGlkKSB7XG4gIGxldCBhbGxDaGlsZHJlbiA9IG5vZGVzLmZpbHRlcihub2RlID0+IHtcbiAgICB2YXIgX25vZGUkY29udGV4dDtcbiAgICByZXR1cm4gbm9kZS5wYXJlbnRJZCA9PT0gaWQgJiYgKChfbm9kZSRjb250ZXh0ID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dC5vcGVuKTtcbiAgfSk7XG4gIGxldCBjdXJyZW50Q2hpbGRyZW4gPSBhbGxDaGlsZHJlbjtcbiAgd2hpbGUgKGN1cnJlbnRDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBjdXJyZW50Q2hpbGRyZW4gPSBub2Rlcy5maWx0ZXIobm9kZSA9PiB7XG4gICAgICB2YXIgX2N1cnJlbnRDaGlsZHJlbjtcbiAgICAgIHJldHVybiAoX2N1cnJlbnRDaGlsZHJlbiA9IGN1cnJlbnRDaGlsZHJlbikgPT0gbnVsbCA/IHZvaWQgMCA6IF9jdXJyZW50Q2hpbGRyZW4uc29tZShuID0+IHtcbiAgICAgICAgdmFyIF9ub2RlJGNvbnRleHQyO1xuICAgICAgICByZXR1cm4gbm9kZS5wYXJlbnRJZCA9PT0gbi5pZCAmJiAoKF9ub2RlJGNvbnRleHQyID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dDIub3Blbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBhbGxDaGlsZHJlbiA9IGFsbENoaWxkcmVuLmNvbmNhdChjdXJyZW50Q2hpbGRyZW4pO1xuICB9XG4gIHJldHVybiBhbGxDaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGdldERlZXBlc3ROb2RlKG5vZGVzLCBpZCkge1xuICBsZXQgZGVlcGVzdE5vZGVJZDtcbiAgbGV0IG1heERlcHRoID0gLTE7XG4gIGZ1bmN0aW9uIGZpbmREZWVwZXN0KG5vZGVJZCwgZGVwdGgpIHtcbiAgICBpZiAoZGVwdGggPiBtYXhEZXB0aCkge1xuICAgICAgZGVlcGVzdE5vZGVJZCA9IG5vZGVJZDtcbiAgICAgIG1heERlcHRoID0gZGVwdGg7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4obm9kZXMsIG5vZGVJZCk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICBmaW5kRGVlcGVzdChjaGlsZC5pZCwgZGVwdGggKyAxKTtcbiAgICB9KTtcbiAgfVxuICBmaW5kRGVlcGVzdChpZCwgMCk7XG4gIHJldHVybiBub2Rlcy5maW5kKG5vZGUgPT4gbm9kZS5pZCA9PT0gZGVlcGVzdE5vZGVJZCk7XG59XG5cbi8vIE1vZGlmaWVkIHRvIGFkZCBjb25kaXRpb25hbCBgYXJpYS1oaWRkZW5gIHN1cHBvcnQ6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGhlS2FzaGV5L2FyaWEtaGlkZGVuL2Jsb2IvOTIyMGM4ZjRhNGZkMzVmNjNiZWU1NTEwYTlmNDFhMzcyNjQzODJkNC9zcmMvaW5kZXgudHNcbmxldCBjb3VudGVyTWFwID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG5sZXQgdW5jb250cm9sbGVkRWxlbWVudHNTZXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbmxldCBtYXJrZXJNYXAgPSB7fTtcbmxldCBsb2NrQ291bnQgPSAwO1xuY29uc3Qgc3VwcG9ydHNJbmVydCA9ICgpID0+IHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2luZXJ0JyBpbiBIVE1MRWxlbWVudC5wcm90b3R5cGU7XG5jb25zdCB1bndyYXBIb3N0ID0gbm9kZSA9PiBub2RlICYmIChub2RlLmhvc3QgfHwgdW53cmFwSG9zdChub2RlLnBhcmVudE5vZGUpKTtcbmNvbnN0IGNvcnJlY3RFbGVtZW50cyA9IChwYXJlbnQsIHRhcmdldHMpID0+IHRhcmdldHMubWFwKHRhcmdldCA9PiB7XG4gIGlmIChwYXJlbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgY29uc3QgY29ycmVjdGVkVGFyZ2V0ID0gdW53cmFwSG9zdCh0YXJnZXQpO1xuICBpZiAocGFyZW50LmNvbnRhaW5zKGNvcnJlY3RlZFRhcmdldCkpIHtcbiAgICByZXR1cm4gY29ycmVjdGVkVGFyZ2V0O1xuICB9XG4gIHJldHVybiBudWxsO1xufSkuZmlsdGVyKHggPT4geCAhPSBudWxsKTtcbmZ1bmN0aW9uIGFwcGx5QXR0cmlidXRlVG9PdGhlcnModW5jb3JyZWN0ZWRBdm9pZEVsZW1lbnRzLCBib2R5LCBhcmlhSGlkZGVuLCBpbmVydCkge1xuICBjb25zdCBtYXJrZXJOYW1lID0gJ2RhdGEtZmxvYXRpbmctdWktaW5lcnQnO1xuICBjb25zdCBjb250cm9sQXR0cmlidXRlID0gaW5lcnQgPyAnaW5lcnQnIDogYXJpYUhpZGRlbiA/ICdhcmlhLWhpZGRlbicgOiBudWxsO1xuICBjb25zdCBhdm9pZEVsZW1lbnRzID0gY29ycmVjdEVsZW1lbnRzKGJvZHksIHVuY29ycmVjdGVkQXZvaWRFbGVtZW50cyk7XG4gIGNvbnN0IGVsZW1lbnRzVG9LZWVwID0gbmV3IFNldCgpO1xuICBjb25zdCBlbGVtZW50c1RvU3RvcCA9IG5ldyBTZXQoYXZvaWRFbGVtZW50cyk7XG4gIGNvbnN0IGhpZGRlbkVsZW1lbnRzID0gW107XG4gIGlmICghbWFya2VyTWFwW21hcmtlck5hbWVdKSB7XG4gICAgbWFya2VyTWFwW21hcmtlck5hbWVdID0gbmV3IFdlYWtNYXAoKTtcbiAgfVxuICBjb25zdCBtYXJrZXJDb3VudGVyID0gbWFya2VyTWFwW21hcmtlck5hbWVdO1xuICBhdm9pZEVsZW1lbnRzLmZvckVhY2goa2VlcCk7XG4gIGRlZXAoYm9keSk7XG4gIGVsZW1lbnRzVG9LZWVwLmNsZWFyKCk7XG4gIGZ1bmN0aW9uIGtlZXAoZWwpIHtcbiAgICBpZiAoIWVsIHx8IGVsZW1lbnRzVG9LZWVwLmhhcyhlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudHNUb0tlZXAuYWRkKGVsKTtcbiAgICBlbC5wYXJlbnROb2RlICYmIGtlZXAoZWwucGFyZW50Tm9kZSk7XG4gIH1cbiAgZnVuY3Rpb24gZGVlcChwYXJlbnQpIHtcbiAgICBpZiAoIXBhcmVudCB8fCBlbGVtZW50c1RvU3RvcC5oYXMocGFyZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBbXS5mb3JFYWNoLmNhbGwocGFyZW50LmNoaWxkcmVuLCBub2RlID0+IHtcbiAgICAgIGlmIChnZXROb2RlTmFtZShub2RlKSA9PT0gJ3NjcmlwdCcpIHJldHVybjtcbiAgICAgIGlmIChlbGVtZW50c1RvS2VlcC5oYXMobm9kZSkpIHtcbiAgICAgICAgZGVlcChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGF0dHIgPSBjb250cm9sQXR0cmlidXRlID8gbm9kZS5nZXRBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSkgOiBudWxsO1xuICAgICAgICBjb25zdCBhbHJlYWR5SGlkZGVuID0gYXR0ciAhPT0gbnVsbCAmJiBhdHRyICE9PSAnZmFsc2UnO1xuICAgICAgICBjb25zdCBjb3VudGVyVmFsdWUgPSAoY291bnRlck1hcC5nZXQobm9kZSkgfHwgMCkgKyAxO1xuICAgICAgICBjb25zdCBtYXJrZXJWYWx1ZSA9IChtYXJrZXJDb3VudGVyLmdldChub2RlKSB8fCAwKSArIDE7XG4gICAgICAgIGNvdW50ZXJNYXAuc2V0KG5vZGUsIGNvdW50ZXJWYWx1ZSk7XG4gICAgICAgIG1hcmtlckNvdW50ZXIuc2V0KG5vZGUsIG1hcmtlclZhbHVlKTtcbiAgICAgICAgaGlkZGVuRWxlbWVudHMucHVzaChub2RlKTtcbiAgICAgICAgaWYgKGNvdW50ZXJWYWx1ZSA9PT0gMSAmJiBhbHJlYWR5SGlkZGVuKSB7XG4gICAgICAgICAgdW5jb250cm9sbGVkRWxlbWVudHNTZXQuYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrZXJWYWx1ZSA9PT0gMSkge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG1hcmtlck5hbWUsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFscmVhZHlIaWRkZW4gJiYgY29udHJvbEF0dHJpYnV0ZSkge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGNvbnRyb2xBdHRyaWJ1dGUsICd0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBsb2NrQ291bnQrKztcbiAgcmV0dXJuICgpID0+IHtcbiAgICBoaWRkZW5FbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgY29uc3QgY291bnRlclZhbHVlID0gKGNvdW50ZXJNYXAuZ2V0KGVsZW1lbnQpIHx8IDApIC0gMTtcbiAgICAgIGNvbnN0IG1hcmtlclZhbHVlID0gKG1hcmtlckNvdW50ZXIuZ2V0KGVsZW1lbnQpIHx8IDApIC0gMTtcbiAgICAgIGNvdW50ZXJNYXAuc2V0KGVsZW1lbnQsIGNvdW50ZXJWYWx1ZSk7XG4gICAgICBtYXJrZXJDb3VudGVyLnNldChlbGVtZW50LCBtYXJrZXJWYWx1ZSk7XG4gICAgICBpZiAoIWNvdW50ZXJWYWx1ZSkge1xuICAgICAgICBpZiAoIXVuY29udHJvbGxlZEVsZW1lbnRzU2V0LmhhcyhlbGVtZW50KSAmJiBjb250cm9sQXR0cmlidXRlKSB7XG4gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5jb250cm9sbGVkRWxlbWVudHNTZXQuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgaWYgKCFtYXJrZXJWYWx1ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShtYXJrZXJOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsb2NrQ291bnQtLTtcbiAgICBpZiAoIWxvY2tDb3VudCkge1xuICAgICAgY291bnRlck1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICBjb3VudGVyTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHVuY29udHJvbGxlZEVsZW1lbnRzU2V0ID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgIG1hcmtlck1hcCA9IHt9O1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIG1hcmtPdGhlcnMoYXZvaWRFbGVtZW50cywgYXJpYUhpZGRlbiwgaW5lcnQpIHtcbiAgaWYgKGFyaWFIaWRkZW4gPT09IHZvaWQgMCkge1xuICAgIGFyaWFIaWRkZW4gPSBmYWxzZTtcbiAgfVxuICBpZiAoaW5lcnQgPT09IHZvaWQgMCkge1xuICAgIGluZXJ0ID0gZmFsc2U7XG4gIH1cbiAgY29uc3QgYm9keSA9IGdldERvY3VtZW50KGF2b2lkRWxlbWVudHNbMF0pLmJvZHk7XG4gIHJldHVybiBhcHBseUF0dHJpYnV0ZVRvT3RoZXJzKGF2b2lkRWxlbWVudHMuY29uY2F0KEFycmF5LmZyb20oYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdbYXJpYS1saXZlXScpKSksIGJvZHksIGFyaWFIaWRkZW4sIGluZXJ0KTtcbn1cblxuY29uc3QgZ2V0VGFiYmFibGVPcHRpb25zID0gKCkgPT4gKHtcbiAgZ2V0U2hhZG93Um9vdDogdHJ1ZSxcbiAgZGlzcGxheUNoZWNrOlxuICAvLyBKU0RPTSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgdGFiYmFibGVgIGxpYnJhcnkuIFRvIHNvbHZlIHRoaXMgd2UgY2FuXG4gIC8vIGNoZWNrIGlmIGBSZXNpemVPYnNlcnZlcmAgaXMgYSByZWFsIGZ1bmN0aW9uIChub3QgcG9seWZpbGxlZCksIHdoaWNoXG4gIC8vIGRldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgSlNET00tbGlrZS5cbiAgdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAnZnVuY3Rpb24nICYmIFJlc2l6ZU9ic2VydmVyLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1tuYXRpdmUgY29kZV0nKSA/ICdmdWxsJyA6ICdub25lJ1xufSk7XG5mdW5jdGlvbiBnZXRUYWJiYWJsZUluKGNvbnRhaW5lciwgZGlyZWN0aW9uKSB7XG4gIGNvbnN0IGFsbFRhYmJhYmxlID0gdGFiYmFibGUoY29udGFpbmVyLCBnZXRUYWJiYWJsZU9wdGlvbnMoKSk7XG4gIGlmIChkaXJlY3Rpb24gPT09ICdwcmV2Jykge1xuICAgIGFsbFRhYmJhYmxlLnJldmVyc2UoKTtcbiAgfVxuICBjb25zdCBhY3RpdmVJbmRleCA9IGFsbFRhYmJhYmxlLmluZGV4T2YoYWN0aXZlRWxlbWVudChnZXREb2N1bWVudChjb250YWluZXIpKSk7XG4gIGNvbnN0IG5leHRUYWJiYWJsZUVsZW1lbnRzID0gYWxsVGFiYmFibGUuc2xpY2UoYWN0aXZlSW5kZXggKyAxKTtcbiAgcmV0dXJuIG5leHRUYWJiYWJsZUVsZW1lbnRzWzBdO1xufVxuZnVuY3Rpb24gZ2V0TmV4dFRhYmJhYmxlKCkge1xuICByZXR1cm4gZ2V0VGFiYmFibGVJbihkb2N1bWVudC5ib2R5LCAnbmV4dCcpO1xufVxuZnVuY3Rpb24gZ2V0UHJldmlvdXNUYWJiYWJsZSgpIHtcbiAgcmV0dXJuIGdldFRhYmJhYmxlSW4oZG9jdW1lbnQuYm9keSwgJ3ByZXYnKTtcbn1cbmZ1bmN0aW9uIGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBjb250YWluZXIpIHtcbiAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lciB8fCBldmVudC5jdXJyZW50VGFyZ2V0O1xuICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgcmV0dXJuICFyZWxhdGVkVGFyZ2V0IHx8ICFjb250YWlucyhjb250YWluZXJFbGVtZW50LCByZWxhdGVkVGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIGRpc2FibGVGb2N1c0luc2lkZShjb250YWluZXIpIHtcbiAgY29uc3QgdGFiYmFibGVFbGVtZW50cyA9IHRhYmJhYmxlKGNvbnRhaW5lciwgZ2V0VGFiYmFibGVPcHRpb25zKCkpO1xuICB0YWJiYWJsZUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgZWxlbWVudC5kYXRhc2V0LnRhYmluZGV4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JykgfHwgJyc7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZW5hYmxlRm9jdXNJbnNpZGUoY29udGFpbmVyKSB7XG4gIGNvbnN0IGVsZW1lbnRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXRhYmluZGV4XScpO1xuICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IHRhYmluZGV4ID0gZWxlbWVudC5kYXRhc2V0LnRhYmluZGV4O1xuICAgIGRlbGV0ZSBlbGVtZW50LmRhdGFzZXQudGFiaW5kZXg7XG4gICAgaWYgKHRhYmluZGV4KSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCB0YWJpbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRDbG9zZXN0VGFiYmFibGVFbGVtZW50KHRhYmJhYmxlRWxlbWVudHMsIGVsZW1lbnQsIGZsb2F0aW5nKSB7XG4gIGNvbnN0IGVsZW1lbnRJbmRleCA9IHRhYmJhYmxlRWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTtcbiAgZnVuY3Rpb24gdHJhdmVyc2VUYWJiYWJsZUVsZW1lbnRzKG5leHQpIHtcbiAgICBjb25zdCBhdHRyID0gY3JlYXRlQXR0cmlidXRlKCdmb2N1cy1ndWFyZCcpO1xuICAgIGxldCBpbmRleCA9IGVsZW1lbnRJbmRleCArIChuZXh0ID8gMSA6IDApO1xuICAgIGxldCBjdXJyZW50RWxlbWVudCA9IHRhYmJhYmxlRWxlbWVudHNbaW5kZXhdO1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCAmJiAoIWN1cnJlbnRFbGVtZW50LmlzQ29ubmVjdGVkIHx8IGN1cnJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSB8fCBjb250YWlucyhmbG9hdGluZywgY3VycmVudEVsZW1lbnQpKSkge1xuICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4LS07XG4gICAgICB9XG4gICAgICBjdXJyZW50RWxlbWVudCA9IHRhYmJhYmxlRWxlbWVudHNbaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XG4gIH1cblxuICAvLyBGaXJzdCwgdHJ5IHRvIGZpbmQgdGhlIG5leHQgdGFiYmFibGUgZWxlbWVudFxuICBjb25zdCBuZXh0ID0gdHJhdmVyc2VUYWJiYWJsZUVsZW1lbnRzKHRydWUpO1xuICBpZiAobmV4dCkge1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgLy8gSWYgd2UgY2FuJ3QgZmluZCBhIG5leHQgdGFiYmFibGUgZWxlbWVudCwgdHJ5IHRvIGZpbmQgdGhlIHByZXZpb3VzIG9uZVxuICByZXR1cm4gdHJhdmVyc2VUYWJiYWJsZUVsZW1lbnRzKGZhbHNlKTtcbn1cblxuLy8gU2VlIERpZWdvIEhheidzIFNhbmRib3ggZm9yIG1ha2luZyB0aGlzIGxvZ2ljIHdvcmsgd2VsbCBvbiBTYWZhcmkvaU9TOlxuLy8gaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3RhYmJhYmxlLXBvcnRhbC1mNHRuZz9maWxlPS9zcmMvRm9jdXNUcmFwLnRzeFxuXG5jb25zdCBISURERU5fU1RZTEVTID0ge1xuICBib3JkZXI6IDAsXG4gIGNsaXA6ICdyZWN0KDAgMCAwIDApJyxcbiAgaGVpZ2h0OiAnMXB4JyxcbiAgbWFyZ2luOiAnLTFweCcsXG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgcGFkZGluZzogMCxcbiAgcG9zaXRpb246ICdmaXhlZCcsXG4gIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICB3aWR0aDogJzFweCcsXG4gIHRvcDogMCxcbiAgbGVmdDogMFxufTtcbmxldCB0aW1lb3V0SWQ7XG5mdW5jdGlvbiBzZXRBY3RpdmVFbGVtZW50T25UYWIoZXZlbnQpIHtcbiAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICBldmVudC50YXJnZXQ7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gIH1cbn1cbmNvbnN0IEZvY3VzR3VhcmQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb2N1c0d1YXJkKHByb3BzLCByZWYpIHtcbiAgY29uc3QgW3JvbGUsIHNldFJvbGVdID0gUmVhY3QudXNlU3RhdGUoKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChpc1NhZmFyaSgpKSB7XG4gICAgICAvLyBVbmxpa2Ugb3RoZXIgc2NyZWVuIHJlYWRlcnMgc3VjaCBhcyBOVkRBIGFuZCBKQVdTLCB0aGUgdmlydHVhbCBjdXJzb3JcbiAgICAgIC8vIG9uIFZvaWNlT3ZlciBkb2VzIHRyaWdnZXIgdGhlIG9uRm9jdXMgZXZlbnQsIHNvIHdlIGNhbiB1c2UgdGhlIGZvY3VzXG4gICAgICAvLyB0cmFwIGVsZW1lbnQuIE9uIFNhZmFyaSwgb25seSBidXR0b25zIHRyaWdnZXIgdGhlIG9uRm9jdXMgZXZlbnQuXG4gICAgICAvLyBOQjogXCJncm91cFwiIHJvbGUgaW4gdGhlIFNhbmRib3ggbm8gbG9uZ2VyIGFwcGVhcnMgdG8gd29yaywgbXVzdCBiZSBhXG4gICAgICAvLyBidXR0b24gcm9sZS5cbiAgICAgIHNldFJvbGUoJ2J1dHRvbicpO1xuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgc2V0QWN0aXZlRWxlbWVudE9uVGFiKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHNldEFjdGl2ZUVsZW1lbnRPblRhYik7XG4gICAgfTtcbiAgfSwgW10pO1xuICBjb25zdCByZXN0UHJvcHMgPSB7XG4gICAgcmVmLFxuICAgIHRhYkluZGV4OiAwLFxuICAgIC8vIFJvbGUgaXMgb25seSBmb3IgVm9pY2VPdmVyXG4gICAgcm9sZSxcbiAgICAnYXJpYS1oaWRkZW4nOiByb2xlID8gdW5kZWZpbmVkIDogdHJ1ZSxcbiAgICBbY3JlYXRlQXR0cmlidXRlKCdmb2N1cy1ndWFyZCcpXTogJycsXG4gICAgc3R5bGU6IEhJRERFTl9TVFlMRVNcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHJlc3RQcm9wcykpO1xufSk7XG5cbmNvbnN0IFBvcnRhbENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChudWxsKTtcbmNvbnN0IGF0dHIgPSAvKiNfX1BVUkVfXyovY3JlYXRlQXR0cmlidXRlKCdwb3J0YWwnKTtcbi8qKlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nUG9ydGFsI3VzZWZsb2F0aW5ncG9ydGFsbm9kZVxuICovXG5mdW5jdGlvbiB1c2VGbG9hdGluZ1BvcnRhbE5vZGUocHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICByb290XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgdW5pcXVlSWQgPSB1c2VJZCgpO1xuICBjb25zdCBwb3J0YWxDb250ZXh0ID0gdXNlUG9ydGFsQ29udGV4dCgpO1xuICBjb25zdCBbcG9ydGFsTm9kZSwgc2V0UG9ydGFsTm9kZV0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgcG9ydGFsTm9kZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBwb3J0YWxOb2RlID09IG51bGwgfHwgcG9ydGFsTm9kZS5yZW1vdmUoKTtcbiAgICAgIC8vIEFsbG93IHRoZSBzdWJzZXF1ZW50IGxheW91dCBlZmZlY3RzIHRvIGNyZWF0ZSBhIG5ldyBub2RlIG9uIHVwZGF0ZXMuXG4gICAgICAvLyBUaGUgcG9ydGFsIG5vZGUgd2lsbCBzdGlsbCBiZSBjbGVhbmVkIHVwIG9uIHVubW91bnQuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzI0NTRcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgcG9ydGFsTm9kZVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0sIFtwb3J0YWxOb2RlXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICAvLyBXYWl0IGZvciB0aGUgdW5pcXVlSWQgdG8gYmUgZ2VuZXJhdGVkIGJlZm9yZSBjcmVhdGluZyB0aGUgcG9ydGFsIG5vZGUgaW5cbiAgICAvLyBSZWFjdCA8MTggKHVzaW5nIGB1c2VGbG9hdGluZ0lkYCBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgYHVzZUlkYCkuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yNzc4XG4gICAgaWYgKCF1bmlxdWVJZCkgcmV0dXJuO1xuICAgIGlmIChwb3J0YWxOb2RlUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBjb25zdCBleGlzdGluZ0lkUm9vdCA9IGlkID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIDogbnVsbDtcbiAgICBpZiAoIWV4aXN0aW5nSWRSb290KSByZXR1cm47XG4gICAgY29uc3Qgc3ViUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN1YlJvb3QuaWQgPSB1bmlxdWVJZDtcbiAgICBzdWJSb290LnNldEF0dHJpYnV0ZShhdHRyLCAnJyk7XG4gICAgZXhpc3RpbmdJZFJvb3QuYXBwZW5kQ2hpbGQoc3ViUm9vdCk7XG4gICAgcG9ydGFsTm9kZVJlZi5jdXJyZW50ID0gc3ViUm9vdDtcbiAgICBzZXRQb3J0YWxOb2RlKHN1YlJvb3QpO1xuICB9LCBbaWQsIHVuaXF1ZUlkXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIXVuaXF1ZUlkKSByZXR1cm47XG4gICAgaWYgKHBvcnRhbE5vZGVSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgIGxldCBjb250YWluZXIgPSByb290IHx8IChwb3J0YWxDb250ZXh0ID09IG51bGwgPyB2b2lkIDAgOiBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpO1xuICAgIGlmIChjb250YWluZXIgJiYgIWlzRWxlbWVudChjb250YWluZXIpKSBjb250YWluZXIgPSBjb250YWluZXIuY3VycmVudDtcbiAgICBjb250YWluZXIgPSBjb250YWluZXIgfHwgZG9jdW1lbnQuYm9keTtcbiAgICBsZXQgaWRXcmFwcGVyID0gbnVsbDtcbiAgICBpZiAoaWQpIHtcbiAgICAgIGlkV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgaWRXcmFwcGVyLmlkID0gaWQ7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWRXcmFwcGVyKTtcbiAgICB9XG4gICAgY29uc3Qgc3ViUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN1YlJvb3QuaWQgPSB1bmlxdWVJZDtcbiAgICBzdWJSb290LnNldEF0dHJpYnV0ZShhdHRyLCAnJyk7XG4gICAgY29udGFpbmVyID0gaWRXcmFwcGVyIHx8IGNvbnRhaW5lcjtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3ViUm9vdCk7XG4gICAgcG9ydGFsTm9kZVJlZi5jdXJyZW50ID0gc3ViUm9vdDtcbiAgICBzZXRQb3J0YWxOb2RlKHN1YlJvb3QpO1xuICB9LCBbaWQsIHJvb3QsIHVuaXF1ZUlkLCBwb3J0YWxDb250ZXh0XSk7XG4gIHJldHVybiBwb3J0YWxOb2RlO1xufVxuLyoqXG4gKiBQb3J0YWxzIHRoZSBmbG9hdGluZyBlbGVtZW50IGludG8gYSBnaXZlbiBjb250YWluZXIgZWxlbWVudCDigJQgYnkgZGVmYXVsdCxcbiAqIG91dHNpZGUgb2YgdGhlIGFwcCByb290IGFuZCBpbnRvIHRoZSBib2R5LlxuICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZSBmbG9hdGluZyBlbGVtZW50IGNhbiBhcHBlYXIgb3V0c2lkZSBhbnlcbiAqIHBvdGVudGlhbCBwYXJlbnQgY29udGFpbmVycyB0aGF0IGNhdXNlIGNsaXBwaW5nIChzdWNoIGFzIGBvdmVyZmxvdzogaGlkZGVuYCksXG4gKiB3aGlsZSByZXRhaW5pbmcgaXRzIGxvY2F0aW9uIGluIHRoZSBSZWFjdCB0cmVlLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nUG9ydGFsXG4gKi9cbmZ1bmN0aW9uIEZsb2F0aW5nUG9ydGFsKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBpZCxcbiAgICByb290ID0gbnVsbCxcbiAgICBwcmVzZXJ2ZVRhYk9yZGVyID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHBvcnRhbE5vZGUgPSB1c2VGbG9hdGluZ1BvcnRhbE5vZGUoe1xuICAgIGlkLFxuICAgIHJvb3RcbiAgfSk7XG4gIGNvbnN0IFtmb2N1c01hbmFnZXJTdGF0ZSwgc2V0Rm9jdXNNYW5hZ2VyU3RhdGVdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IGJlZm9yZU91dHNpZGVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGFmdGVyT3V0c2lkZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgYmVmb3JlSW5zaWRlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBhZnRlckluc2lkZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3Qgc2hvdWxkUmVuZGVyR3VhcmRzID1cbiAgLy8gVGhlIEZvY3VzTWFuYWdlciBhbmQgdGhlcmVmb3JlIGZsb2F0aW5nIGVsZW1lbnQgYXJlIGN1cnJlbnRseSBvcGVuL1xuICAvLyByZW5kZXJlZC5cbiAgISFmb2N1c01hbmFnZXJTdGF0ZSAmJlxuICAvLyBHdWFyZHMgYXJlIG9ubHkgZm9yIG5vbi1tb2RhbCBmb2N1cyBtYW5hZ2VtZW50LlxuICAhZm9jdXNNYW5hZ2VyU3RhdGUubW9kYWwgJiZcbiAgLy8gRG9uJ3QgcmVuZGVyIGlmIHVubW91bnQgaXMgdHJhbnNpdGlvbmluZy5cbiAgZm9jdXNNYW5hZ2VyU3RhdGUub3BlbiAmJiBwcmVzZXJ2ZVRhYk9yZGVyICYmICEhKHJvb3QgfHwgcG9ydGFsTm9kZSk7XG5cbiAgLy8gaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3RhYmJhYmxlLXBvcnRhbC1mNHRuZz9maWxlPS9zcmMvVGFiYmFibGVQb3J0YWwudHN4XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFwb3J0YWxOb2RlIHx8ICFwcmVzZXJ2ZVRhYk9yZGVyIHx8IGZvY3VzTWFuYWdlclN0YXRlICE9IG51bGwgJiYgZm9jdXNNYW5hZ2VyU3RhdGUubW9kYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHN1cmUgZWxlbWVudHMgaW5zaWRlIHRoZSBwb3J0YWwgZWxlbWVudCBhcmUgdGFiYmFibGUgb25seSB3aGVuIHRoZVxuICAgIC8vIHBvcnRhbCBoYXMgYWxyZWFkeSBiZWVuIGZvY3VzZWQsIGVpdGhlciBieSB0YWJiaW5nIGludG8gYSBmb2N1cyB0cmFwXG4gICAgLy8gZWxlbWVudCBvdXRzaWRlIG9yIHVzaW5nIHRoZSBtb3VzZS5cbiAgICBmdW5jdGlvbiBvbkZvY3VzKGV2ZW50KSB7XG4gICAgICBpZiAocG9ydGFsTm9kZSAmJiBpc091dHNpZGVFdmVudChldmVudCkpIHtcbiAgICAgICAgY29uc3QgZm9jdXNpbmcgPSBldmVudC50eXBlID09PSAnZm9jdXNpbic7XG4gICAgICAgIGNvbnN0IG1hbmFnZUZvY3VzID0gZm9jdXNpbmcgPyBlbmFibGVGb2N1c0luc2lkZSA6IGRpc2FibGVGb2N1c0luc2lkZTtcbiAgICAgICAgbWFuYWdlRm9jdXMocG9ydGFsTm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIExpc3RlbiB0byB0aGUgZXZlbnQgb24gdGhlIGNhcHR1cmUgcGhhc2Ugc28gdGhleSBydW4gYmVmb3JlIHRoZSBmb2N1c1xuICAgIC8vIHRyYXAgZWxlbWVudHMgb25Gb2N1cyBwcm9wIGlzIGNhbGxlZC5cbiAgICBwb3J0YWxOb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBvbkZvY3VzLCB0cnVlKTtcbiAgICBwb3J0YWxOb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0Jywgb25Gb2N1cywgdHJ1ZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHBvcnRhbE5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG9uRm9jdXMsIHRydWUpO1xuICAgICAgcG9ydGFsTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXMsIHRydWUpO1xuICAgIH07XG4gIH0sIFtwb3J0YWxOb2RlLCBwcmVzZXJ2ZVRhYk9yZGVyLCBmb2N1c01hbmFnZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogZm9jdXNNYW5hZ2VyU3RhdGUubW9kYWxdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgICAgcHJlc2VydmVUYWJPcmRlcixcbiAgICAgIGJlZm9yZU91dHNpZGVSZWYsXG4gICAgICBhZnRlck91dHNpZGVSZWYsXG4gICAgICBiZWZvcmVJbnNpZGVSZWYsXG4gICAgICBhZnRlckluc2lkZVJlZixcbiAgICAgIHBvcnRhbE5vZGUsXG4gICAgICBzZXRGb2N1c01hbmFnZXJTdGF0ZVxuICAgIH0pLCBbcHJlc2VydmVUYWJPcmRlciwgcG9ydGFsTm9kZV0pXG4gIH0sIHNob3VsZFJlbmRlckd1YXJkcyAmJiBwb3J0YWxOb2RlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzR3VhcmQsIHtcbiAgICBcImRhdGEtdHlwZVwiOiBcIm91dHNpZGVcIixcbiAgICByZWY6IGJlZm9yZU91dHNpZGVSZWYsXG4gICAgb25Gb2N1czogZXZlbnQgPT4ge1xuICAgICAgaWYgKGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBwb3J0YWxOb2RlKSkge1xuICAgICAgICB2YXIgX2JlZm9yZUluc2lkZVJlZiRjdXJyO1xuICAgICAgICAoX2JlZm9yZUluc2lkZVJlZiRjdXJyID0gYmVmb3JlSW5zaWRlUmVmLmN1cnJlbnQpID09IG51bGwgfHwgX2JlZm9yZUluc2lkZVJlZiRjdXJyLmZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcmV2VGFiYmFibGUgPSBnZXRQcmV2aW91c1RhYmJhYmxlKCkgfHwgKGZvY3VzTWFuYWdlclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBmb2N1c01hbmFnZXJTdGF0ZS5yZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KTtcbiAgICAgICAgcHJldlRhYmJhYmxlID09IG51bGwgfHwgcHJldlRhYmJhYmxlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9KSwgc2hvdWxkUmVuZGVyR3VhcmRzICYmIHBvcnRhbE5vZGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBcImFyaWEtb3duc1wiOiBwb3J0YWxOb2RlLmlkLFxuICAgIHN0eWxlOiBISURERU5fU1RZTEVTXG4gIH0pLCBwb3J0YWxOb2RlICYmIC8qI19fUFVSRV9fKi9SZWFjdERPTS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHBvcnRhbE5vZGUpLCBzaG91bGRSZW5kZXJHdWFyZHMgJiYgcG9ydGFsTm9kZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0d1YXJkLCB7XG4gICAgXCJkYXRhLXR5cGVcIjogXCJvdXRzaWRlXCIsXG4gICAgcmVmOiBhZnRlck91dHNpZGVSZWYsXG4gICAgb25Gb2N1czogZXZlbnQgPT4ge1xuICAgICAgaWYgKGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBwb3J0YWxOb2RlKSkge1xuICAgICAgICB2YXIgX2FmdGVySW5zaWRlUmVmJGN1cnJlO1xuICAgICAgICAoX2FmdGVySW5zaWRlUmVmJGN1cnJlID0gYWZ0ZXJJbnNpZGVSZWYuY3VycmVudCkgPT0gbnVsbCB8fCBfYWZ0ZXJJbnNpZGVSZWYkY3VycmUuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHRUYWJiYWJsZSA9IGdldE5leHRUYWJiYWJsZSgpIHx8IChmb2N1c01hbmFnZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogZm9jdXNNYW5hZ2VyU3RhdGUucmVmcy5kb21SZWZlcmVuY2UuY3VycmVudCk7XG4gICAgICAgIG5leHRUYWJiYWJsZSA9PSBudWxsIHx8IG5leHRUYWJiYWJsZS5mb2N1cygpO1xuICAgICAgICAoZm9jdXNNYW5hZ2VyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGZvY3VzTWFuYWdlclN0YXRlLmNsb3NlT25Gb2N1c091dCkgJiYgKGZvY3VzTWFuYWdlclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBmb2N1c01hbmFnZXJTdGF0ZS5vbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9KSk7XG59XG5jb25zdCB1c2VQb3J0YWxDb250ZXh0ID0gKCkgPT4gUmVhY3QudXNlQ29udGV4dChQb3J0YWxDb250ZXh0KTtcblxuY29uc3QgTElTVF9MSU1JVCA9IDIwO1xubGV0IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMgPSBbXTtcbmZ1bmN0aW9uIGFkZFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudChlbGVtZW50KSB7XG4gIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMgPSBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzLmZpbHRlcihlbCA9PiBlbC5pc0Nvbm5lY3RlZCk7XG4gIGxldCB0YWJiYWJsZUVsID0gZWxlbWVudDtcbiAgaWYgKCF0YWJiYWJsZUVsIHx8IGdldE5vZGVOYW1lKHRhYmJhYmxlRWwpID09PSAnYm9keScpIHJldHVybjtcbiAgaWYgKCFpc1RhYmJhYmxlKHRhYmJhYmxlRWwsIGdldFRhYmJhYmxlT3B0aW9ucygpKSkge1xuICAgIGNvbnN0IHRhYmJhYmxlQ2hpbGQgPSB0YWJiYWJsZSh0YWJiYWJsZUVsLCBnZXRUYWJiYWJsZU9wdGlvbnMoKSlbMF07XG4gICAgaWYgKHRhYmJhYmxlQ2hpbGQpIHtcbiAgICAgIHRhYmJhYmxlRWwgPSB0YWJiYWJsZUNoaWxkO1xuICAgIH1cbiAgfVxuICBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzLnB1c2godGFiYmFibGVFbCk7XG4gIGlmIChwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzLmxlbmd0aCA+IExJU1RfTElNSVQpIHtcbiAgICBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRzID0gcHJldmlvdXNseUZvY3VzZWRFbGVtZW50cy5zbGljZSgtTElTVF9MSU1JVCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpIHtcbiAgcmV0dXJuIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudHMuc2xpY2UoKS5yZXZlcnNlKCkuZmluZChlbCA9PiBlbC5pc0Nvbm5lY3RlZCk7XG59XG5jb25zdCBWaXN1YWxseUhpZGRlbkRpc21pc3MgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBWaXN1YWxseUhpZGRlbkRpc21pc3MocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgX2V4dGVuZHMoe30sIHByb3BzLCB7XG4gICAgdHlwZTogXCJidXR0b25cIixcbiAgICByZWY6IHJlZixcbiAgICB0YWJJbmRleDogLTEsXG4gICAgc3R5bGU6IEhJRERFTl9TVFlMRVNcbiAgfSkpO1xufSk7XG4vKipcbiAqIFByb3ZpZGVzIGZvY3VzIG1hbmFnZW1lbnQgZm9yIHRoZSBmbG9hdGluZyBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL0Zsb2F0aW5nRm9jdXNNYW5hZ2VyXG4gKi9cbmZ1bmN0aW9uIEZsb2F0aW5nRm9jdXNNYW5hZ2VyKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjb250ZXh0LFxuICAgIGNoaWxkcmVuLFxuICAgIGRpc2FibGVkID0gZmFsc2UsXG4gICAgb3JkZXIgPSBbJ2NvbnRlbnQnXSxcbiAgICBndWFyZHM6IF9ndWFyZHMgPSB0cnVlLFxuICAgIGluaXRpYWxGb2N1cyA9IDAsXG4gICAgcmV0dXJuRm9jdXMgPSB0cnVlLFxuICAgIHJlc3RvcmVGb2N1cyA9IGZhbHNlLFxuICAgIG1vZGFsID0gdHJ1ZSxcbiAgICB2aXN1YWxseUhpZGRlbkRpc21pc3MgPSBmYWxzZSxcbiAgICBjbG9zZU9uRm9jdXNPdXQgPSB0cnVlXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgcmVmcyxcbiAgICBub2RlSWQsXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGV2ZW50cyxcbiAgICBkYXRhUmVmLFxuICAgIGZsb2F0aW5nSWQsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGRvbVJlZmVyZW5jZSxcbiAgICAgIGZsb2F0aW5nXG4gICAgfVxuICB9ID0gY29udGV4dDtcbiAgY29uc3QgaWdub3JlSW5pdGlhbEZvY3VzID0gdHlwZW9mIGluaXRpYWxGb2N1cyA9PT0gJ251bWJlcicgJiYgaW5pdGlhbEZvY3VzIDwgMDtcbiAgLy8gSWYgdGhlIHJlZmVyZW5jZSBpcyBhIGNvbWJvYm94IGFuZCBpcyB0eXBlYWJsZSAoZS5nLiBpbnB1dC90ZXh0YXJlYSksXG4gIC8vIHRoZXJlIGFyZSBkaWZmZXJlbnQgZm9jdXMgc2VtYW50aWNzLiBUaGUgZ3VhcmRzIHNob3VsZCBub3QgYmUgcmVuZGVyZWQsIGJ1dFxuICAvLyBhcmlhLWhpZGRlbiBzaG91bGQgYmUgYXBwbGllZCB0byBhbGwgbm9kZXMgc3RpbGwuIEZ1cnRoZXIsIHRoZSB2aXN1YWxseVxuICAvLyBoaWRkZW4gZGlzbWlzcyBidXR0b24gc2hvdWxkIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIG5vdCB0aGVcbiAgLy8gc3RhcnQuXG4gIGNvbnN0IGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCA9IGlzVHlwZWFibGVDb21ib2JveChkb21SZWZlcmVuY2UpICYmIGlnbm9yZUluaXRpYWxGb2N1cztcblxuICAvLyBGb3JjZSB0aGUgZ3VhcmRzIHRvIGJlIHJlbmRlcmVkIGlmIHRoZSBgaW5lcnRgIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkLlxuICBjb25zdCBndWFyZHMgPSBzdXBwb3J0c0luZXJ0KCkgPyBfZ3VhcmRzIDogdHJ1ZTtcbiAgY29uc3Qgb3JkZXJSZWYgPSB1c2VMYXRlc3RSZWYob3JkZXIpO1xuICBjb25zdCBpbml0aWFsRm9jdXNSZWYgPSB1c2VMYXRlc3RSZWYoaW5pdGlhbEZvY3VzKTtcbiAgY29uc3QgcmV0dXJuRm9jdXNSZWYgPSB1c2VMYXRlc3RSZWYocmV0dXJuRm9jdXMpO1xuICBjb25zdCB0cmVlID0gdXNlRmxvYXRpbmdUcmVlKCk7XG4gIGNvbnN0IHBvcnRhbENvbnRleHQgPSB1c2VQb3J0YWxDb250ZXh0KCk7XG4gIGNvbnN0IHN0YXJ0RGlzbWlzc0J1dHRvblJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgZW5kRGlzbWlzc0J1dHRvblJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgcHJldmVudFJldHVybkZvY3VzUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgaXNQb2ludGVyRG93blJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHRhYmJhYmxlSW5kZXhSZWYgPSBSZWFjdC51c2VSZWYoLTEpO1xuICBjb25zdCBpc0luc2lkZVBvcnRhbCA9IHBvcnRhbENvbnRleHQgIT0gbnVsbDtcbiAgY29uc3QgZmlyc3RFbGVtZW50Q2hpbGQgPSBmbG9hdGluZyA9PSBudWxsID8gdm9pZCAwIDogZmxvYXRpbmcuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gIC8vIElmIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzIGFjdGluZyBhcyBhIHBvc2l0aW9uaW5nIHdyYXBwZXIgcmF0aGVyIHRoYW4gdGhlXG4gIC8vIGVsZW1lbnQgdGhhdCByZWNlaXZlcyBhcmlhIHByb3BzLCB1c2UgaXQgYXMgdGhlIGZvY3VzIHJvb3QgaW5zdGVhZC5cbiAgY29uc3QgZmxvYXRpbmdGb2N1c05vZGUgPSAoZmlyc3RFbGVtZW50Q2hpbGQgPT0gbnVsbCA/IHZvaWQgMCA6IGZpcnN0RWxlbWVudENoaWxkLmlkKSA9PT0gZmxvYXRpbmdJZCA/IGZpcnN0RWxlbWVudENoaWxkIDogZmxvYXRpbmc7XG4gIGNvbnN0IGdldFRhYmJhYmxlQ29udGVudCA9IHVzZUVmZmVjdEV2ZW50KGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICBpZiAoY29udGFpbmVyID09PSB2b2lkIDApIHtcbiAgICAgIGNvbnRhaW5lciA9IGZsb2F0aW5nRm9jdXNOb2RlO1xuICAgIH1cbiAgICByZXR1cm4gY29udGFpbmVyID8gdGFiYmFibGUoY29udGFpbmVyLCBnZXRUYWJiYWJsZU9wdGlvbnMoKSkgOiBbXTtcbiAgfSk7XG4gIGNvbnN0IGdldFRhYmJhYmxlRWxlbWVudHMgPSB1c2VFZmZlY3RFdmVudChjb250YWluZXIgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBnZXRUYWJiYWJsZUNvbnRlbnQoY29udGFpbmVyKTtcbiAgICByZXR1cm4gb3JkZXJSZWYuY3VycmVudC5tYXAodHlwZSA9PiB7XG4gICAgICBpZiAoZG9tUmVmZXJlbmNlICYmIHR5cGUgPT09ICdyZWZlcmVuY2UnKSB7XG4gICAgICAgIHJldHVybiBkb21SZWZlcmVuY2U7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmdGb2N1c05vZGUgJiYgdHlwZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgICAgICByZXR1cm4gZmxvYXRpbmdGb2N1c05vZGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5maWx0ZXIoQm9vbGVhbikuZmxhdCgpO1xuICB9KTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBpZiAoIW1vZGFsKSByZXR1cm47XG4gICAgZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgICAvLyBUaGUgZm9jdXMgZ3VhcmRzIGhhdmUgbm90aGluZyB0byBmb2N1cywgc28gd2UgbmVlZCB0byBzdG9wIHRoZSBldmVudC5cbiAgICAgICAgaWYgKGNvbnRhaW5zKGZsb2F0aW5nRm9jdXNOb2RlLCBhY3RpdmVFbGVtZW50KGdldERvY3VtZW50KGZsb2F0aW5nRm9jdXNOb2RlKSkpICYmIGdldFRhYmJhYmxlQ29udGVudCgpLmxlbmd0aCA9PT0gMCAmJiAhaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94KSB7XG4gICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbHMgPSBnZXRUYWJiYWJsZUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudCk7XG4gICAgICAgIGlmIChvcmRlclJlZi5jdXJyZW50WzBdID09PSAncmVmZXJlbmNlJyAmJiB0YXJnZXQgPT09IGRvbVJlZmVyZW5jZSkge1xuICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBlbnF1ZXVlRm9jdXMoZWxzW2Vscy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVucXVldWVGb2N1cyhlbHNbMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3JkZXJSZWYuY3VycmVudFsxXSA9PT0gJ2Zsb2F0aW5nJyAmJiB0YXJnZXQgPT09IGZsb2F0aW5nRm9jdXNOb2RlICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICBlbnF1ZXVlRm9jdXMoZWxzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkb2MgPSBnZXREb2N1bWVudChmbG9hdGluZ0ZvY3VzTm9kZSk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93bik7XG4gICAgfTtcbiAgfSwgW2Rpc2FibGVkLCBkb21SZWZlcmVuY2UsIGZsb2F0aW5nRm9jdXNOb2RlLCBtb2RhbCwgb3JkZXJSZWYsIGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCwgZ2V0VGFiYmFibGVDb250ZW50LCBnZXRUYWJiYWJsZUVsZW1lbnRzXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgaWYgKCFmbG9hdGluZykgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIGhhbmRsZUZvY3VzSW4oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudCk7XG4gICAgICBjb25zdCB0YWJiYWJsZUNvbnRlbnQgPSBnZXRUYWJiYWJsZUNvbnRlbnQoKTtcbiAgICAgIGNvbnN0IHRhYmJhYmxlSW5kZXggPSB0YWJiYWJsZUNvbnRlbnQuaW5kZXhPZih0YXJnZXQpO1xuICAgICAgaWYgKHRhYmJhYmxlSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRhYmJhYmxlSW5kZXhSZWYuY3VycmVudCA9IHRhYmJhYmxlSW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIGZsb2F0aW5nLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBoYW5kbGVGb2N1c0luKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZmxvYXRpbmcucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGhhbmRsZUZvY3VzSW4pO1xuICAgIH07XG4gIH0sIFtkaXNhYmxlZCwgZmxvYXRpbmcsIGdldFRhYmJhYmxlQ29udGVudF0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgIGlmICghY2xvc2VPbkZvY3VzT3V0KSByZXR1cm47XG5cbiAgICAvLyBJbiBTYWZhcmksIGJ1dHRvbnMgbG9zZSBmb2N1cyB3aGVuIHByZXNzaW5nIHRoZW0uXG4gICAgZnVuY3Rpb24gaGFuZGxlUG9pbnRlckRvd24oKSB7XG4gICAgICBpc1BvaW50ZXJEb3duUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlzUG9pbnRlckRvd25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZUZvY3VzT3V0c2lkZShldmVudCkge1xuICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vdmVkVG9VbnJlbGF0ZWROb2RlID0gIShjb250YWlucyhkb21SZWZlcmVuY2UsIHJlbGF0ZWRUYXJnZXQpIHx8IGNvbnRhaW5zKGZsb2F0aW5nLCByZWxhdGVkVGFyZ2V0KSB8fCBjb250YWlucyhyZWxhdGVkVGFyZ2V0LCBmbG9hdGluZykgfHwgY29udGFpbnMocG9ydGFsQ29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlLCByZWxhdGVkVGFyZ2V0KSB8fCByZWxhdGVkVGFyZ2V0ICE9IG51bGwgJiYgcmVsYXRlZFRhcmdldC5oYXNBdHRyaWJ1dGUoY3JlYXRlQXR0cmlidXRlKCdmb2N1cy1ndWFyZCcpKSB8fCB0cmVlICYmIChnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkuZmluZChub2RlID0+IHtcbiAgICAgICAgICB2YXIgX25vZGUkY29udGV4dCwgX25vZGUkY29udGV4dDI7XG4gICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKChfbm9kZSRjb250ZXh0ID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dC5lbGVtZW50cy5mbG9hdGluZywgcmVsYXRlZFRhcmdldCkgfHwgY29udGFpbnMoKF9ub2RlJGNvbnRleHQyID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dDIuZWxlbWVudHMuZG9tUmVmZXJlbmNlLCByZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgfSkgfHwgZ2V0QW5jZXN0b3JzKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKS5maW5kKG5vZGUgPT4ge1xuICAgICAgICAgIHZhciBfbm9kZSRjb250ZXh0MywgX25vZGUkY29udGV4dDQ7XG4gICAgICAgICAgcmV0dXJuICgoX25vZGUkY29udGV4dDMgPSBub2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRjb250ZXh0My5lbGVtZW50cy5mbG9hdGluZykgPT09IHJlbGF0ZWRUYXJnZXQgfHwgKChfbm9kZSRjb250ZXh0NCA9IG5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJGNvbnRleHQ0LmVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgPT09IHJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgIH0pKSk7XG5cbiAgICAgICAgLy8gUmVzdG9yZSBmb2N1cyB0byB0aGUgcHJldmlvdXMgdGFiYmFibGUgZWxlbWVudCBpbmRleCB0byBwcmV2ZW50XG4gICAgICAgIC8vIGZvY3VzIGZyb20gYmVpbmcgbG9zdCBvdXRzaWRlIHRoZSBmbG9hdGluZyB0cmVlLlxuICAgICAgICBpZiAocmVzdG9yZUZvY3VzICYmIG1vdmVkVG9VbnJlbGF0ZWROb2RlICYmIGFjdGl2ZUVsZW1lbnQoZ2V0RG9jdW1lbnQoZmxvYXRpbmdGb2N1c05vZGUpKSA9PT0gZ2V0RG9jdW1lbnQoZmxvYXRpbmdGb2N1c05vZGUpLmJvZHkpIHtcbiAgICAgICAgICAvLyBMZXQgYEZsb2F0aW5nUG9ydGFsYCBlZmZlY3Qga25vd3MgdGhhdCBmb2N1cyBpcyBzdGlsbCBpbnNpZGUgdGhlXG4gICAgICAgICAgLy8gZmxvYXRpbmcgdHJlZS5cbiAgICAgICAgICBpZiAoaXNIVE1MRWxlbWVudChmbG9hdGluZ0ZvY3VzTm9kZSkpIHtcbiAgICAgICAgICAgIGZsb2F0aW5nRm9jdXNOb2RlID09IG51bGwgfHwgZmxvYXRpbmdGb2N1c05vZGUuZm9jdXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcHJldlRhYmJhYmxlSW5kZXggPSB0YWJiYWJsZUluZGV4UmVmLmN1cnJlbnQ7XG4gICAgICAgICAgY29uc3QgdGFiYmFibGVDb250ZW50ID0gZ2V0VGFiYmFibGVDb250ZW50KCk7XG4gICAgICAgICAgY29uc3Qgbm9kZVRvRm9jdXMgPSB0YWJiYWJsZUNvbnRlbnRbcHJldlRhYmJhYmxlSW5kZXhdIHx8IHRhYmJhYmxlQ29udGVudFt0YWJiYWJsZUNvbnRlbnQubGVuZ3RoIC0gMV0gfHwgZmxvYXRpbmdGb2N1c05vZGU7XG4gICAgICAgICAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZVRvRm9jdXMpKSB7XG4gICAgICAgICAgICBub2RlVG9Gb2N1cy5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvY3VzIGRpZCBub3QgbW92ZSBpbnNpZGUgdGhlIGZsb2F0aW5nIHRyZWUsIGFuZCB0aGVyZSBhcmUgbm8gdGFiYmFibGVcbiAgICAgICAgLy8gcG9ydGFsIGd1YXJkcyB0byBoYW5kbGUgY2xvc2luZy5cbiAgICAgICAgaWYgKChpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3ggPyB0cnVlIDogIW1vZGFsKSAmJiByZWxhdGVkVGFyZ2V0ICYmIG1vdmVkVG9VbnJlbGF0ZWROb2RlICYmICFpc1BvaW50ZXJEb3duUmVmLmN1cnJlbnQgJiZcbiAgICAgICAgLy8gRml4IFJlYWN0IDE4IFN0cmljdCBNb2RlIHJldHVybkZvY3VzIGR1ZSB0byBkb3VibGUgcmVuZGVyaW5nLlxuICAgICAgICByZWxhdGVkVGFyZ2V0ICE9PSBnZXRQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKSkge1xuICAgICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmbG9hdGluZyAmJiBpc0hUTUxFbGVtZW50KGRvbVJlZmVyZW5jZSkpIHtcbiAgICAgIGRvbVJlZmVyZW5jZS5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGhhbmRsZUZvY3VzT3V0c2lkZSk7XG4gICAgICBkb21SZWZlcmVuY2UuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVQb2ludGVyRG93bik7XG4gICAgICBmbG9hdGluZy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGhhbmRsZUZvY3VzT3V0c2lkZSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBkb21SZWZlcmVuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBoYW5kbGVGb2N1c091dHNpZGUpO1xuICAgICAgICBkb21SZWZlcmVuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVQb2ludGVyRG93bik7XG4gICAgICAgIGZsb2F0aW5nLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgaGFuZGxlRm9jdXNPdXRzaWRlKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbZGlzYWJsZWQsIGRvbVJlZmVyZW5jZSwgZmxvYXRpbmcsIGZsb2F0aW5nRm9jdXNOb2RlLCBtb2RhbCwgbm9kZUlkLCB0cmVlLCBwb3J0YWxDb250ZXh0LCBvbk9wZW5DaGFuZ2UsIGNsb3NlT25Gb2N1c091dCwgcmVzdG9yZUZvY3VzLCBnZXRUYWJiYWJsZUNvbnRlbnQsIGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveF0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZhciBfcG9ydGFsQ29udGV4dCRwb3J0YWw7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG5cbiAgICAvLyBEb24ndCBoaWRlIHBvcnRhbHMgbmVzdGVkIHdpdGhpbiB0aGUgcGFyZW50IHBvcnRhbC5cbiAgICBjb25zdCBwb3J0YWxOb2RlcyA9IEFycmF5LmZyb20oKHBvcnRhbENvbnRleHQgPT0gbnVsbCB8fCAoX3BvcnRhbENvbnRleHQkcG9ydGFsID0gcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlKSA9PSBudWxsID8gdm9pZCAwIDogX3BvcnRhbENvbnRleHQkcG9ydGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIgKyBjcmVhdGVBdHRyaWJ1dGUoJ3BvcnRhbCcpICsgXCJdXCIpKSB8fCBbXSk7XG4gICAgaWYgKGZsb2F0aW5nKSB7XG4gICAgICBjb25zdCBpbnNpZGVFbGVtZW50cyA9IFtmbG9hdGluZywgLi4ucG9ydGFsTm9kZXMsIHN0YXJ0RGlzbWlzc0J1dHRvblJlZi5jdXJyZW50LCBlbmREaXNtaXNzQnV0dG9uUmVmLmN1cnJlbnQsIG9yZGVyUmVmLmN1cnJlbnQuaW5jbHVkZXMoJ3JlZmVyZW5jZScpIHx8IGlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCA/IGRvbVJlZmVyZW5jZSA6IG51bGxdLmZpbHRlcih4ID0+IHggIT0gbnVsbCk7XG4gICAgICBjb25zdCBjbGVhbnVwID0gbW9kYWwgfHwgaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94ID8gbWFya090aGVycyhpbnNpZGVFbGVtZW50cywgZ3VhcmRzLCAhZ3VhcmRzKSA6IG1hcmtPdGhlcnMoaW5zaWRlRWxlbWVudHMpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtkaXNhYmxlZCwgZG9tUmVmZXJlbmNlLCBmbG9hdGluZywgbW9kYWwsIG9yZGVyUmVmLCBwb3J0YWxDb250ZXh0LCBpc1VudHJhcHBlZFR5cGVhYmxlQ29tYm9ib3gsIGd1YXJkc10pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkIHx8ICFpc0hUTUxFbGVtZW50KGZsb2F0aW5nRm9jdXNOb2RlKSkgcmV0dXJuO1xuICAgIGNvbnN0IGRvYyA9IGdldERvY3VtZW50KGZsb2F0aW5nRm9jdXNOb2RlKTtcbiAgICBjb25zdCBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBhY3RpdmVFbGVtZW50KGRvYyk7XG5cbiAgICAvLyBXYWl0IGZvciBhbnkgbGF5b3V0IGVmZmVjdCBzdGF0ZSBzZXR0ZXJzIHRvIGV4ZWN1dGUgdG8gc2V0IGB0YWJJbmRleGAuXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBnZXRUYWJiYWJsZUVsZW1lbnRzKGZsb2F0aW5nRm9jdXNOb2RlKTtcbiAgICAgIGNvbnN0IGluaXRpYWxGb2N1c1ZhbHVlID0gaW5pdGlhbEZvY3VzUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBlbFRvRm9jdXMgPSAodHlwZW9mIGluaXRpYWxGb2N1c1ZhbHVlID09PSAnbnVtYmVyJyA/IGZvY3VzYWJsZUVsZW1lbnRzW2luaXRpYWxGb2N1c1ZhbHVlXSA6IGluaXRpYWxGb2N1c1ZhbHVlLmN1cnJlbnQpIHx8IGZsb2F0aW5nRm9jdXNOb2RlO1xuICAgICAgY29uc3QgZm9jdXNBbHJlYWR5SW5zaWRlRmxvYXRpbmdFbCA9IGNvbnRhaW5zKGZsb2F0aW5nRm9jdXNOb2RlLCBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpO1xuICAgICAgaWYgKCFpZ25vcmVJbml0aWFsRm9jdXMgJiYgIWZvY3VzQWxyZWFkeUluc2lkZUZsb2F0aW5nRWwgJiYgb3Blbikge1xuICAgICAgICBlbnF1ZXVlRm9jdXMoZWxUb0ZvY3VzLCB7XG4gICAgICAgICAgcHJldmVudFNjcm9sbDogZWxUb0ZvY3VzID09PSBmbG9hdGluZ0ZvY3VzTm9kZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW2Rpc2FibGVkLCBvcGVuLCBmbG9hdGluZ0ZvY3VzTm9kZSwgaWdub3JlSW5pdGlhbEZvY3VzLCBnZXRUYWJiYWJsZUVsZW1lbnRzLCBpbml0aWFsRm9jdXNSZWZdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCB8fCAhZmxvYXRpbmdGb2N1c05vZGUpIHJldHVybjtcbiAgICBsZXQgcHJldmVudFJldHVybkZvY3VzU2Nyb2xsID0gZmFsc2U7XG4gICAgY29uc3QgZG9jID0gZ2V0RG9jdW1lbnQoZmxvYXRpbmdGb2N1c05vZGUpO1xuICAgIGNvbnN0IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGFjdGl2ZUVsZW1lbnQoZG9jKTtcbiAgICBjb25zdCBjb250ZXh0RGF0YSA9IGRhdGFSZWYuY3VycmVudDtcbiAgICBsZXQgb3BlbkV2ZW50ID0gY29udGV4dERhdGEub3BlbkV2ZW50O1xuICAgIGNvbnN0IGRvbVJlZmVyZW5jZSA9IHJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQ7XG4gICAgYWRkUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCk7XG5cbiAgICAvLyBEaXNtaXNzaW5nIHZpYSBvdXRzaWRlIHByZXNzIHNob3VsZCBhbHdheXMgaWdub3JlIGByZXR1cm5Gb2N1c2AgdG9cbiAgICAvLyBwcmV2ZW50IHVud2FudGVkIHNjcm9sbGluZy5cbiAgICBmdW5jdGlvbiBvbk9wZW5DaGFuZ2UoX3JlZikge1xuICAgICAgbGV0IHtcbiAgICAgICAgb3BlbixcbiAgICAgICAgcmVhc29uLFxuICAgICAgICBldmVudCxcbiAgICAgICAgbmVzdGVkXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgIG9wZW5FdmVudCA9IGV2ZW50O1xuICAgICAgfVxuICAgICAgaWYgKHJlYXNvbiA9PT0gJ2VzY2FwZS1rZXknICYmIHJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQpIHtcbiAgICAgICAgYWRkUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KHJlZnMuZG9tUmVmZXJlbmNlLmN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgaWYgKHJlYXNvbiA9PT0gJ2hvdmVyJyAmJiBldmVudC50eXBlID09PSAnbW91c2VsZWF2ZScpIHtcbiAgICAgICAgcHJldmVudFJldHVybkZvY3VzUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHJlYXNvbiAhPT0gJ291dHNpZGUtcHJlc3MnKSByZXR1cm47XG4gICAgICBpZiAobmVzdGVkKSB7XG4gICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIHByZXZlbnRSZXR1cm5Gb2N1c1Njcm9sbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCA9ICEoaXNWaXJ0dWFsQ2xpY2soZXZlbnQpIHx8IGlzVmlydHVhbFBvaW50ZXJFdmVudChldmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBldmVudHMub24oJ29wZW5jaGFuZ2UnLCBvbk9wZW5DaGFuZ2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBldmVudHMub2ZmKCdvcGVuY2hhbmdlJywgb25PcGVuQ2hhbmdlKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUVsID0gYWN0aXZlRWxlbWVudChkb2MpO1xuICAgICAgY29uc3QgaXNGb2N1c0luc2lkZUZsb2F0aW5nVHJlZSA9IGNvbnRhaW5zKGZsb2F0aW5nLCBhY3RpdmVFbCkgfHwgdHJlZSAmJiBnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkuc29tZShub2RlID0+IHtcbiAgICAgICAgdmFyIF9ub2RlJGNvbnRleHQ1O1xuICAgICAgICByZXR1cm4gY29udGFpbnMoKF9ub2RlJGNvbnRleHQ1ID0gbm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGUkY29udGV4dDUuZWxlbWVudHMuZmxvYXRpbmcsIGFjdGl2ZUVsKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2hvdWxkRm9jdXNSZWZlcmVuY2UgPSBpc0ZvY3VzSW5zaWRlRmxvYXRpbmdUcmVlIHx8IG9wZW5FdmVudCAmJiBbJ2NsaWNrJywgJ21vdXNlZG93biddLmluY2x1ZGVzKG9wZW5FdmVudC50eXBlKTtcbiAgICAgIGlmIChzaG91bGRGb2N1c1JlZmVyZW5jZSAmJiByZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KSB7XG4gICAgICAgIGFkZFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudChyZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJldHVybkNvbnRleHRFbGVtZW50ID0gZG9tUmVmZXJlbmNlIHx8IHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudDtcbiAgICAgIGNvbnN0IHRhYmJhYmxlRWxlbWVudHMgPSB0YWJiYWJsZShnZXREb2N1bWVudChyZXR1cm5Db250ZXh0RWxlbWVudCkuYm9keSwgZ2V0VGFiYmFibGVPcHRpb25zKCkpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgcmV0dXJuIGVsZW1lbnQgdG8gZ2V0IHBvdGVudGlhbGx5IGRpc2Nvbm5lY3RlZCBiZWZvcmVcbiAgICAgIC8vIGNoZWNraW5nLlxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBsZXQgcmV0dXJuRWxlbWVudCA9IGdldFByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpO1xuICAgICAgICBpZiAoIXJldHVybkVsZW1lbnQgJiYgaXNIVE1MRWxlbWVudChyZXR1cm5Db250ZXh0RWxlbWVudCkgJiYgZmxvYXRpbmcpIHtcbiAgICAgICAgICByZXR1cm5FbGVtZW50ID0gZ2V0Q2xvc2VzdFRhYmJhYmxlRWxlbWVudCh0YWJiYWJsZUVsZW1lbnRzLCByZXR1cm5Db250ZXh0RWxlbWVudCwgZmxvYXRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgICAgICByZXR1cm5Gb2N1c1JlZi5jdXJyZW50ICYmICFwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCAmJiBpc0hUTUxFbGVtZW50KHJldHVybkVsZW1lbnQpICYmIChcbiAgICAgICAgLy8gSWYgdGhlIGZvY3VzIG1vdmVkIHNvbWV3aGVyZSBlbHNlIGFmdGVyIG1vdW50LCBhdm9pZCByZXR1cm5pbmcgZm9jdXNcbiAgICAgICAgLy8gc2luY2UgaXQgbGlrZWx5IGVudGVyZWQgYSBkaWZmZXJlbnQgZWxlbWVudCB3aGljaCBzaG91bGQgYmVcbiAgICAgICAgLy8gcmVzcGVjdGVkOiBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzI2MDdcbiAgICAgICAgcmV0dXJuRWxlbWVudCAhPT0gYWN0aXZlRWwgJiYgYWN0aXZlRWwgIT09IGRvYy5ib2R5ID8gaXNGb2N1c0luc2lkZUZsb2F0aW5nVHJlZSA6IHRydWUpKSB7XG4gICAgICAgICAgcmV0dXJuRWxlbWVudC5mb2N1cyh7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiBwcmV2ZW50UmV0dXJuRm9jdXNTY3JvbGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfSwgW2Rpc2FibGVkLCBmbG9hdGluZywgZmxvYXRpbmdGb2N1c05vZGUsIHJldHVybkZvY3VzUmVmLCBkYXRhUmVmLCByZWZzLCBldmVudHMsIHRyZWUsIG5vZGVJZF0pO1xuXG4gIC8vIFN5bmNocm9uaXplIHRoZSBgY29udGV4dGAgJiBgbW9kYWxgIHZhbHVlIHRvIHRoZSBGbG9hdGluZ1BvcnRhbCBjb250ZXh0LlxuICAvLyBJdCB3aWxsIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCBpdCBuZWVkcyB0byByZW5kZXIgaXRzIG93biBndWFyZHMuXG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVybjtcbiAgICBpZiAoIXBvcnRhbENvbnRleHQpIHJldHVybjtcbiAgICBwb3J0YWxDb250ZXh0LnNldEZvY3VzTWFuYWdlclN0YXRlKHtcbiAgICAgIG1vZGFsLFxuICAgICAgY2xvc2VPbkZvY3VzT3V0LFxuICAgICAgb3BlbixcbiAgICAgIG9uT3BlbkNoYW5nZSxcbiAgICAgIHJlZnNcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcG9ydGFsQ29udGV4dC5zZXRGb2N1c01hbmFnZXJTdGF0ZShudWxsKTtcbiAgICB9O1xuICB9LCBbZGlzYWJsZWQsIHBvcnRhbENvbnRleHQsIG1vZGFsLCBvcGVuLCBvbk9wZW5DaGFuZ2UsIHJlZnMsIGNsb3NlT25Gb2N1c091dF0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgaWYgKCFmbG9hdGluZ0ZvY3VzTm9kZSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuICAgIGlmIChpZ25vcmVJbml0aWFsRm9jdXMpIHJldHVybjtcbiAgICBjb25zdCBoYW5kbGVNdXRhdGlvbiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYkluZGV4ID0gZmxvYXRpbmdGb2N1c05vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgY29uc3QgdGFiYmFibGVDb250ZW50ID0gZ2V0VGFiYmFibGVDb250ZW50KCk7XG4gICAgICBjb25zdCBhY3RpdmVFbCA9IGFjdGl2ZUVsZW1lbnQoZ2V0RG9jdW1lbnQoZmxvYXRpbmcpKTtcbiAgICAgIGNvbnN0IHRhYmJhYmxlSW5kZXggPSB0YWJiYWJsZUNvbnRlbnQuaW5kZXhPZihhY3RpdmVFbCk7XG4gICAgICBpZiAodGFiYmFibGVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGFiYmFibGVJbmRleFJlZi5jdXJyZW50ID0gdGFiYmFibGVJbmRleDtcbiAgICAgIH1cbiAgICAgIGlmIChvcmRlclJlZi5jdXJyZW50LmluY2x1ZGVzKCdmbG9hdGluZycpIHx8IGFjdGl2ZUVsICE9PSByZWZzLmRvbVJlZmVyZW5jZS5jdXJyZW50ICYmIHRhYmJhYmxlQ29udGVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKHRhYkluZGV4ICE9PSAnMCcpIHtcbiAgICAgICAgICBmbG9hdGluZ0ZvY3VzTm9kZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWJJbmRleCAhPT0gJy0xJykge1xuICAgICAgICBmbG9hdGluZ0ZvY3VzTm9kZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBoYW5kbGVNdXRhdGlvbigpO1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoaGFuZGxlTXV0YXRpb24pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoZmxvYXRpbmdGb2N1c05vZGUsIHtcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9LCBbZGlzYWJsZWQsIGZsb2F0aW5nLCBmbG9hdGluZ0ZvY3VzTm9kZSwgcmVmcywgb3JkZXJSZWYsIGdldFRhYmJhYmxlQ29udGVudCwgaWdub3JlSW5pdGlhbEZvY3VzXSk7XG4gIGZ1bmN0aW9uIHJlbmRlckRpc21pc3NCdXR0b24obG9jYXRpb24pIHtcbiAgICBpZiAoZGlzYWJsZWQgfHwgIXZpc3VhbGx5SGlkZGVuRGlzbWlzcyB8fCAhbW9kYWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVmlzdWFsbHlIaWRkZW5EaXNtaXNzLCB7XG4gICAgICByZWY6IGxvY2F0aW9uID09PSAnc3RhcnQnID8gc3RhcnREaXNtaXNzQnV0dG9uUmVmIDogZW5kRGlzbWlzc0J1dHRvblJlZixcbiAgICAgIG9uQ2xpY2s6IGV2ZW50ID0+IG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQubmF0aXZlRXZlbnQpXG4gICAgfSwgdHlwZW9mIHZpc3VhbGx5SGlkZGVuRGlzbWlzcyA9PT0gJ3N0cmluZycgPyB2aXN1YWxseUhpZGRlbkRpc21pc3MgOiAnRGlzbWlzcycpO1xuICB9XG4gIGNvbnN0IHNob3VsZFJlbmRlckd1YXJkcyA9ICFkaXNhYmxlZCAmJiBndWFyZHMgJiYgKG1vZGFsID8gIWlzVW50cmFwcGVkVHlwZWFibGVDb21ib2JveCA6IHRydWUpICYmIChpc0luc2lkZVBvcnRhbCB8fCBtb2RhbCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgc2hvdWxkUmVuZGVyR3VhcmRzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzR3VhcmQsIHtcbiAgICBcImRhdGEtdHlwZVwiOiBcImluc2lkZVwiLFxuICAgIHJlZjogcG9ydGFsQ29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogcG9ydGFsQ29udGV4dC5iZWZvcmVJbnNpZGVSZWYsXG4gICAgb25Gb2N1czogZXZlbnQgPT4ge1xuICAgICAgaWYgKG1vZGFsKSB7XG4gICAgICAgIGNvbnN0IGVscyA9IGdldFRhYmJhYmxlRWxlbWVudHMoKTtcbiAgICAgICAgZW5xdWV1ZUZvY3VzKG9yZGVyWzBdID09PSAncmVmZXJlbmNlJyA/IGVsc1swXSA6IGVsc1tlbHMubGVuZ3RoIC0gMV0pO1xuICAgICAgfSBlbHNlIGlmIChwb3J0YWxDb250ZXh0ICE9IG51bGwgJiYgcG9ydGFsQ29udGV4dC5wcmVzZXJ2ZVRhYk9yZGVyICYmIHBvcnRhbENvbnRleHQucG9ydGFsTm9kZSkge1xuICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICBpZiAoaXNPdXRzaWRlRXZlbnQoZXZlbnQsIHBvcnRhbENvbnRleHQucG9ydGFsTm9kZSkpIHtcbiAgICAgICAgICBjb25zdCBuZXh0VGFiYmFibGUgPSBnZXROZXh0VGFiYmFibGUoKSB8fCBkb21SZWZlcmVuY2U7XG4gICAgICAgICAgbmV4dFRhYmJhYmxlID09IG51bGwgfHwgbmV4dFRhYmJhYmxlLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wb3J0YWxDb250ZXh0JGJlZm9yZTtcbiAgICAgICAgICAoX3BvcnRhbENvbnRleHQkYmVmb3JlID0gcG9ydGFsQ29udGV4dC5iZWZvcmVPdXRzaWRlUmVmLmN1cnJlbnQpID09IG51bGwgfHwgX3BvcnRhbENvbnRleHQkYmVmb3JlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pLCAhaXNVbnRyYXBwZWRUeXBlYWJsZUNvbWJvYm94ICYmIHJlbmRlckRpc21pc3NCdXR0b24oJ3N0YXJ0JyksIGNoaWxkcmVuLCByZW5kZXJEaXNtaXNzQnV0dG9uKCdlbmQnKSwgc2hvdWxkUmVuZGVyR3VhcmRzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzR3VhcmQsIHtcbiAgICBcImRhdGEtdHlwZVwiOiBcImluc2lkZVwiLFxuICAgIHJlZjogcG9ydGFsQ29udGV4dCA9PSBudWxsID8gdm9pZCAwIDogcG9ydGFsQ29udGV4dC5hZnRlckluc2lkZVJlZixcbiAgICBvbkZvY3VzOiBldmVudCA9PiB7XG4gICAgICBpZiAobW9kYWwpIHtcbiAgICAgICAgZW5xdWV1ZUZvY3VzKGdldFRhYmJhYmxlRWxlbWVudHMoKVswXSk7XG4gICAgICB9IGVsc2UgaWYgKHBvcnRhbENvbnRleHQgIT0gbnVsbCAmJiBwb3J0YWxDb250ZXh0LnByZXNlcnZlVGFiT3JkZXIgJiYgcG9ydGFsQ29udGV4dC5wb3J0YWxOb2RlKSB7XG4gICAgICAgIGlmIChjbG9zZU9uRm9jdXNPdXQpIHtcbiAgICAgICAgICBwcmV2ZW50UmV0dXJuRm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT3V0c2lkZUV2ZW50KGV2ZW50LCBwb3J0YWxDb250ZXh0LnBvcnRhbE5vZGUpKSB7XG4gICAgICAgICAgY29uc3QgcHJldlRhYmJhYmxlID0gZ2V0UHJldmlvdXNUYWJiYWJsZSgpIHx8IGRvbVJlZmVyZW5jZTtcbiAgICAgICAgICBwcmV2VGFiYmFibGUgPT0gbnVsbCB8fCBwcmV2VGFiYmFibGUuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX3BvcnRhbENvbnRleHQkYWZ0ZXJPO1xuICAgICAgICAgIChfcG9ydGFsQ29udGV4dCRhZnRlck8gPSBwb3J0YWxDb250ZXh0LmFmdGVyT3V0c2lkZVJlZi5jdXJyZW50KSA9PSBudWxsIHx8IF9wb3J0YWxDb250ZXh0JGFmdGVyTy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KSk7XG59XG5cbmNvbnN0IGFjdGl2ZUxvY2tzID0gLyojX19QVVJFX18qL25ldyBTZXQoKTtcbi8qKlxuICogUHJvdmlkZXMgYmFzZSBzdHlsaW5nIGZvciBhIGZpeGVkIG92ZXJsYXkgZWxlbWVudCB0byBkaW0gY29udGVudCBvciBibG9ja1xuICogcG9pbnRlciBldmVudHMgYmVoaW5kIGEgZmxvYXRpbmcgZWxlbWVudC5cbiAqIEl0J3MgYSByZWd1bGFyIGA8ZGl2PmAsIHNvIGl0IGNhbiBiZSBzdHlsZWQgdmlhIGFueSBDU1Mgc29sdXRpb24geW91IHByZWZlci5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9GbG9hdGluZ092ZXJsYXlcbiAqL1xuY29uc3QgRmxvYXRpbmdPdmVybGF5ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRmxvYXRpbmdPdmVybGF5KHByb3BzLCByZWYpIHtcbiAgY29uc3Qge1xuICAgIGxvY2tTY3JvbGwgPSBmYWxzZSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgbG9ja0lkID0gdXNlSWQoKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghbG9ja1Njcm9sbCkgcmV0dXJuO1xuICAgIGFjdGl2ZUxvY2tzLmFkZChsb2NrSWQpO1xuICAgIGNvbnN0IGlzSU9TID0gL2lQKGhvbmV8YWR8b2QpfGlPUy8udGVzdChnZXRQbGF0Zm9ybSgpKTtcbiAgICBjb25zdCBib2R5U3R5bGUgPSBkb2N1bWVudC5ib2R5LnN0eWxlO1xuICAgIC8vIFJUTCA8Ym9keT4gc2Nyb2xsYmFyXG4gICAgY29uc3Qgc2Nyb2xsYmFyWCA9IE1hdGgucm91bmQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgY29uc3QgcGFkZGluZ1Byb3AgPSBzY3JvbGxiYXJYID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgY29uc3Qgc2Nyb2xsWCA9IGJvZHlTdHlsZS5sZWZ0ID8gcGFyc2VGbG9hdChib2R5U3R5bGUubGVmdCkgOiB3aW5kb3cuc2Nyb2xsWDtcbiAgICBjb25zdCBzY3JvbGxZID0gYm9keVN0eWxlLnRvcCA/IHBhcnNlRmxvYXQoYm9keVN0eWxlLnRvcCkgOiB3aW5kb3cuc2Nyb2xsWTtcbiAgICBib2R5U3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICBpZiAoc2Nyb2xsYmFyV2lkdGgpIHtcbiAgICAgIGJvZHlTdHlsZVtwYWRkaW5nUHJvcF0gPSBzY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGlPUyBkb2Vzbid0IHJlc3BlY3QgYG92ZXJmbG93OiBoaWRkZW5gIG9uIGRvY3VtZW50LmJvZHksIGFuZCB0aGlzXG4gICAgLy8gdGVjaG5pcXVlIGhhcyBmZXdlciBzaWRlIGVmZmVjdHMuXG4gICAgaWYgKGlzSU9TKSB7XG4gICAgICB2YXIgX3dpbmRvdyR2aXN1YWxWaWV3cG9yLCBfd2luZG93JHZpc3VhbFZpZXdwb3IyO1xuICAgICAgLy8gaU9TIDEyIGRvZXMgbm90IHN1cHBvcnQgYHZpc3VhbFZpZXdwb3J0YC5cbiAgICAgIGNvbnN0IG9mZnNldExlZnQgPSAoKF93aW5kb3ckdmlzdWFsVmlld3BvciA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCkgPT0gbnVsbCA/IHZvaWQgMCA6IF93aW5kb3ckdmlzdWFsVmlld3Bvci5vZmZzZXRMZWZ0KSB8fCAwO1xuICAgICAgY29uc3Qgb2Zmc2V0VG9wID0gKChfd2luZG93JHZpc3VhbFZpZXdwb3IyID0gd2luZG93LnZpc3VhbFZpZXdwb3J0KSA9PSBudWxsID8gdm9pZCAwIDogX3dpbmRvdyR2aXN1YWxWaWV3cG9yMi5vZmZzZXRUb3ApIHx8IDA7XG4gICAgICBPYmplY3QuYXNzaWduKGJvZHlTdHlsZSwge1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAtKHNjcm9sbFkgLSBNYXRoLmZsb29yKG9mZnNldFRvcCkpICsgXCJweFwiLFxuICAgICAgICBsZWZ0OiAtKHNjcm9sbFggLSBNYXRoLmZsb29yKG9mZnNldExlZnQpKSArIFwicHhcIixcbiAgICAgICAgcmlnaHQ6ICcwJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBhY3RpdmVMb2Nrcy5kZWxldGUobG9ja0lkKTtcbiAgICAgIGlmIChhY3RpdmVMb2Nrcy5zaXplID09PSAwKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYm9keVN0eWxlLCB7XG4gICAgICAgICAgb3ZlcmZsb3c6ICcnLFxuICAgICAgICAgIFtwYWRkaW5nUHJvcF06ICcnXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaXNJT1MpIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHlTdHlsZSwge1xuICAgICAgICAgICAgcG9zaXRpb246ICcnLFxuICAgICAgICAgICAgdG9wOiAnJyxcbiAgICAgICAgICAgIGxlZnQ6ICcnLFxuICAgICAgICAgICAgcmlnaHQ6ICcnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd2luZG93LnNjcm9sbFRvKHNjcm9sbFgsIHNjcm9sbFkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2xvY2tJZCwgbG9ja1Njcm9sbF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHJlZjogcmVmXG4gIH0sIHJlc3QsIHtcbiAgICBzdHlsZToge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICBvdmVyZmxvdzogJ2F1dG8nLFxuICAgICAgdG9wOiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgLi4ucmVzdC5zdHlsZVxuICAgIH1cbiAgfSkpO1xufSk7XG5cbmZ1bmN0aW9uIGlzQnV0dG9uVGFyZ2V0KGV2ZW50KSB7XG4gIHJldHVybiBpc0hUTUxFbGVtZW50KGV2ZW50LnRhcmdldCkgJiYgZXZlbnQudGFyZ2V0LnRhZ05hbWUgPT09ICdCVVRUT04nO1xufVxuZnVuY3Rpb24gaXNTcGFjZUlnbm9yZWQoZWxlbWVudCkge1xuICByZXR1cm4gaXNUeXBlYWJsZUVsZW1lbnQoZWxlbWVudCk7XG59XG4vKipcbiAqIE9wZW5zIG9yIGNsb3NlcyB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGVuIGNsaWNraW5nIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VDbGlja1xuICovXG5mdW5jdGlvbiB1c2VDbGljayhjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGRhdGFSZWYsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGRvbVJlZmVyZW5jZVxuICAgIH1cbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBldmVudDogZXZlbnRPcHRpb24gPSAnY2xpY2snLFxuICAgIHRvZ2dsZSA9IHRydWUsXG4gICAgaWdub3JlTW91c2UgPSBmYWxzZSxcbiAgICBrZXlib2FyZEhhbmRsZXJzID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHBvaW50ZXJUeXBlUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IGRpZEtleURvd25SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgb25Qb2ludGVyRG93bihldmVudCkge1xuICAgICAgcG9pbnRlclR5cGVSZWYuY3VycmVudCA9IGV2ZW50LnBvaW50ZXJUeXBlO1xuICAgIH0sXG4gICAgb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHBvaW50ZXJUeXBlID0gcG9pbnRlclR5cGVSZWYuY3VycmVudDtcblxuICAgICAgLy8gSWdub3JlIGFsbCBidXR0b25zIGV4Y2VwdCBmb3IgdGhlIFwibWFpblwiIGJ1dHRvbi5cbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Nb3VzZUV2ZW50L2J1dHRvblxuICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgICAgaWYgKGV2ZW50T3B0aW9uID09PSAnY2xpY2snKSByZXR1cm47XG4gICAgICBpZiAoaXNNb3VzZUxpa2VQb2ludGVyVHlwZShwb2ludGVyVHlwZSwgdHJ1ZSkgJiYgaWdub3JlTW91c2UpIHJldHVybjtcbiAgICAgIGlmIChvcGVuICYmIHRvZ2dsZSAmJiAoZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCA/IGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bicgOiB0cnVlKSkge1xuICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFByZXZlbnQgc3RlYWxpbmcgZm9jdXMgZnJvbSB0aGUgZmxvYXRpbmcgZWxlbWVudFxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25DbGljayhldmVudCkge1xuICAgICAgY29uc3QgcG9pbnRlclR5cGUgPSBwb2ludGVyVHlwZVJlZi5jdXJyZW50O1xuICAgICAgaWYgKGV2ZW50T3B0aW9uID09PSAnbW91c2Vkb3duJyAmJiBwb2ludGVyVHlwZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHBvaW50ZXJUeXBlUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlLCB0cnVlKSAmJiBpZ25vcmVNb3VzZSkgcmV0dXJuO1xuICAgICAgaWYgKG9wZW4gJiYgdG9nZ2xlICYmIChkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50ID8gZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudC50eXBlID09PSAnY2xpY2snIDogdHJ1ZSkpIHtcbiAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCwgJ2NsaWNrJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBwb2ludGVyVHlwZVJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgIWtleWJvYXJkSGFuZGxlcnMgfHwgaXNCdXR0b25UYXJnZXQoZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJyAmJiAhaXNTcGFjZUlnbm9yZWQoZG9tUmVmZXJlbmNlKSkge1xuICAgICAgICAvLyBQcmV2ZW50IHNjcm9sbGluZ1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBkaWRLZXlEb3duUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICBpZiAob3BlbiAmJiB0b2dnbGUpIHtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBvbktleVVwKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAha2V5Ym9hcmRIYW5kbGVycyB8fCBpc0J1dHRvblRhcmdldChldmVudCkgfHwgaXNTcGFjZUlnbm9yZWQoZG9tUmVmZXJlbmNlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnICcgJiYgZGlkS2V5RG93blJlZi5jdXJyZW50KSB7XG4gICAgICAgIGRpZEtleURvd25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICBpZiAob3BlbiAmJiB0b2dnbGUpIHtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIGV2ZW50Lm5hdGl2ZUV2ZW50LCAnY2xpY2snKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdjbGljaycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KSwgW2RhdGFSZWYsIGRvbVJlZmVyZW5jZSwgZXZlbnRPcHRpb24sIGlnbm9yZU1vdXNlLCBrZXlib2FyZEhhbmRsZXJzLCBvbk9wZW5DaGFuZ2UsIG9wZW4sIHRvZ2dsZV0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIHJlZmVyZW5jZVxuICB9IDoge30sIFtlbmFibGVkLCByZWZlcmVuY2VdKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmlydHVhbEVsZW1lbnQoZG9tRWxlbWVudCwgZGF0YSkge1xuICBsZXQgb2Zmc2V0WCA9IG51bGw7XG4gIGxldCBvZmZzZXRZID0gbnVsbDtcbiAgbGV0IGlzQXV0b1VwZGF0ZUV2ZW50ID0gZmFsc2U7XG4gIHJldHVybiB7XG4gICAgY29udGV4dEVsZW1lbnQ6IGRvbUVsZW1lbnQgfHwgdW5kZWZpbmVkLFxuICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHtcbiAgICAgIHZhciBfZGF0YSRkYXRhUmVmJGN1cnJlbnQ7XG4gICAgICBjb25zdCBkb21SZWN0ID0gKGRvbUVsZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpIHx8IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGlzWEF4aXMgPSBkYXRhLmF4aXMgPT09ICd4JyB8fCBkYXRhLmF4aXMgPT09ICdib3RoJztcbiAgICAgIGNvbnN0IGlzWUF4aXMgPSBkYXRhLmF4aXMgPT09ICd5JyB8fCBkYXRhLmF4aXMgPT09ICdib3RoJztcbiAgICAgIGNvbnN0IGNhblRyYWNrQ3Vyc29yT25BdXRvVXBkYXRlID0gWydtb3VzZWVudGVyJywgJ21vdXNlbW92ZSddLmluY2x1ZGVzKCgoX2RhdGEkZGF0YVJlZiRjdXJyZW50ID0gZGF0YS5kYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2RhdGEkZGF0YVJlZiRjdXJyZW50LnR5cGUpIHx8ICcnKSAmJiBkYXRhLnBvaW50ZXJUeXBlICE9PSAndG91Y2gnO1xuICAgICAgbGV0IHdpZHRoID0gZG9tUmVjdC53aWR0aDtcbiAgICAgIGxldCBoZWlnaHQgPSBkb21SZWN0LmhlaWdodDtcbiAgICAgIGxldCB4ID0gZG9tUmVjdC54O1xuICAgICAgbGV0IHkgPSBkb21SZWN0Lnk7XG4gICAgICBpZiAob2Zmc2V0WCA9PSBudWxsICYmIGRhdGEueCAmJiBpc1hBeGlzKSB7XG4gICAgICAgIG9mZnNldFggPSBkb21SZWN0LnggLSBkYXRhLng7XG4gICAgICB9XG4gICAgICBpZiAob2Zmc2V0WSA9PSBudWxsICYmIGRhdGEueSAmJiBpc1lBeGlzKSB7XG4gICAgICAgIG9mZnNldFkgPSBkb21SZWN0LnkgLSBkYXRhLnk7XG4gICAgICB9XG4gICAgICB4IC09IG9mZnNldFggfHwgMDtcbiAgICAgIHkgLT0gb2Zmc2V0WSB8fCAwO1xuICAgICAgd2lkdGggPSAwO1xuICAgICAgaGVpZ2h0ID0gMDtcbiAgICAgIGlmICghaXNBdXRvVXBkYXRlRXZlbnQgfHwgY2FuVHJhY2tDdXJzb3JPbkF1dG9VcGRhdGUpIHtcbiAgICAgICAgd2lkdGggPSBkYXRhLmF4aXMgPT09ICd5JyA/IGRvbVJlY3Qud2lkdGggOiAwO1xuICAgICAgICBoZWlnaHQgPSBkYXRhLmF4aXMgPT09ICd4JyA/IGRvbVJlY3QuaGVpZ2h0IDogMDtcbiAgICAgICAgeCA9IGlzWEF4aXMgJiYgZGF0YS54ICE9IG51bGwgPyBkYXRhLnggOiB4O1xuICAgICAgICB5ID0gaXNZQXhpcyAmJiBkYXRhLnkgIT0gbnVsbCA/IGRhdGEueSA6IHk7XG4gICAgICB9IGVsc2UgaWYgKGlzQXV0b1VwZGF0ZUV2ZW50ICYmICFjYW5UcmFja0N1cnNvck9uQXV0b1VwZGF0ZSkge1xuICAgICAgICBoZWlnaHQgPSBkYXRhLmF4aXMgPT09ICd4JyA/IGRvbVJlY3QuaGVpZ2h0IDogaGVpZ2h0O1xuICAgICAgICB3aWR0aCA9IGRhdGEuYXhpcyA9PT0gJ3knID8gZG9tUmVjdC53aWR0aCA6IHdpZHRoO1xuICAgICAgfVxuICAgICAgaXNBdXRvVXBkYXRlRXZlbnQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgdG9wOiB5LFxuICAgICAgICByaWdodDogeCArIHdpZHRoLFxuICAgICAgICBib3R0b206IHkgKyBoZWlnaHQsXG4gICAgICAgIGxlZnQ6IHhcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gaXNNb3VzZUJhc2VkRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGV2ZW50ICE9IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsO1xufVxuLyoqXG4gKiBQb3NpdGlvbnMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgcmVsYXRpdmUgdG8gYSBjbGllbnQgcG9pbnQgKGluIHRoZSB2aWV3cG9ydCksXG4gKiBzdWNoIGFzIHRoZSBtb3VzZSBwb3NpdGlvbi4gQnkgZGVmYXVsdCwgaXQgZm9sbG93cyB0aGUgbW91c2UgY3Vyc29yLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUNsaWVudFBvaW50XG4gKi9cbmZ1bmN0aW9uIHVzZUNsaWVudFBvaW50KGNvbnRleHQsIHByb3BzKSB7XG4gIGlmIChwcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBkYXRhUmVmLFxuICAgIGVsZW1lbnRzOiB7XG4gICAgICBmbG9hdGluZyxcbiAgICAgIGRvbVJlZmVyZW5jZVxuICAgIH0sXG4gICAgcmVmc1xuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIGF4aXMgPSAnYm90aCcsXG4gICAgeCA9IG51bGwsXG4gICAgeSA9IG51bGxcbiAgfSA9IHByb3BzO1xuICBjb25zdCBpbml0aWFsUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgY2xlYW51cExpc3RlbmVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBbcG9pbnRlclR5cGUsIHNldFBvaW50ZXJUeXBlXSA9IFJlYWN0LnVzZVN0YXRlKCk7XG4gIGNvbnN0IFtyZWFjdGl2ZSwgc2V0UmVhY3RpdmVdID0gUmVhY3QudXNlU3RhdGUoW10pO1xuICBjb25zdCBzZXRSZWZlcmVuY2UgPSB1c2VFZmZlY3RFdmVudCgoeCwgeSkgPT4ge1xuICAgIGlmIChpbml0aWFsUmVmLmN1cnJlbnQpIHJldHVybjtcblxuICAgIC8vIFByZXZlbnQgc2V0dGluZyBpZiB0aGUgb3BlbiBldmVudCB3YXMgbm90IGEgbW91c2UtbGlrZSBvbmVcbiAgICAvLyAoZS5nLiBmb2N1cyB0byBvcGVuLCB0aGVuIGhvdmVyIG92ZXIgdGhlIHJlZmVyZW5jZSBlbGVtZW50KS5cbiAgICAvLyBPbmx5IGFwcGx5IGlmIHRoZSBldmVudCBleGlzdHMuXG4gICAgaWYgKGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQgJiYgIWlzTW91c2VCYXNlZEV2ZW50KGRhdGFSZWYuY3VycmVudC5vcGVuRXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlZnMuc2V0UG9zaXRpb25SZWZlcmVuY2UoY3JlYXRlVmlydHVhbEVsZW1lbnQoZG9tUmVmZXJlbmNlLCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIGF4aXMsXG4gICAgICBkYXRhUmVmLFxuICAgICAgcG9pbnRlclR5cGVcbiAgICB9KSk7XG4gIH0pO1xuICBjb25zdCBoYW5kbGVSZWZlcmVuY2VFbnRlck9yTW92ZSA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICBpZiAoeCAhPSBudWxsIHx8IHkgIT0gbnVsbCkgcmV0dXJuO1xuICAgIGlmICghb3Blbikge1xuICAgICAgc2V0UmVmZXJlbmNlKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH0gZWxzZSBpZiAoIWNsZWFudXBMaXN0ZW5lclJlZi5jdXJyZW50KSB7XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIGNsZWFudXAsIHRoZXJlJ3Mgbm8gbGlzdGVuZXIsIGJ1dCB3ZSB3YW50IHRvIGVuc3VyZVxuICAgICAgLy8gd2UgYWRkIHRoZSBsaXN0ZW5lciBpZiB0aGUgY3Vyc29yIGxhbmRlZCBvbiB0aGUgZmxvYXRpbmcgZWxlbWVudCBhbmRcbiAgICAgIC8vIHRoZW4gYmFjayBvbiB0aGUgcmVmZXJlbmNlIChpLmUuIGl0J3MgaW50ZXJhY3RpdmUpLlxuICAgICAgc2V0UmVhY3RpdmUoW10pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gSWYgdGhlIHBvaW50ZXIgaXMgYSBtb3VzZS1saWtlIHBvaW50ZXIsIHdlIHdhbnQgdG8gY29udGludWUgZm9sbG93aW5nIHRoZVxuICAvLyBtb3VzZSBldmVuIGlmIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzIHRyYW5zaXRpb25pbmcgb3V0LiBPbiB0b3VjaFxuICAvLyBkZXZpY2VzLCB0aGlzIGlzIHVuZGVzaXJhYmxlIGJlY2F1c2UgdGhlIGZsb2F0aW5nIGVsZW1lbnQgd2lsbCBtb3ZlIHRvXG4gIC8vIHRoZSBkaXNtaXNzYWwgdG91Y2ggcG9pbnQuXG4gIGNvbnN0IG9wZW5DaGVjayA9IGlzTW91c2VMaWtlUG9pbnRlclR5cGUocG9pbnRlclR5cGUpID8gZmxvYXRpbmcgOiBvcGVuO1xuICBjb25zdCBhZGRMaXN0ZW5lciA9IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAvLyBFeHBsaWNpdGx5IHNwZWNpZmllZCBgeGAvYHlgIGNvb3JkaW5hdGVzIHNob3VsZG4ndCBhZGQgYSBsaXN0ZW5lci5cbiAgICBpZiAoIW9wZW5DaGVjayB8fCAhZW5hYmxlZCB8fCB4ICE9IG51bGwgfHwgeSAhPSBudWxsKSByZXR1cm47XG4gICAgY29uc3Qgd2luID0gZ2V0V2luZG93KGZsb2F0aW5nKTtcbiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZXZlbnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldmVudCk7XG4gICAgICBpZiAoIWNvbnRhaW5zKGZsb2F0aW5nLCB0YXJnZXQpKSB7XG4gICAgICAgIHNldFJlZmVyZW5jZShldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgICBjbGVhbnVwTGlzdGVuZXJSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZGF0YVJlZi5jdXJyZW50Lm9wZW5FdmVudCB8fCBpc01vdXNlQmFzZWRFdmVudChkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50KSkge1xuICAgICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB3aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgY2xlYW51cExpc3RlbmVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgfTtcbiAgICAgIGNsZWFudXBMaXN0ZW5lclJlZi5jdXJyZW50ID0gY2xlYW51cDtcbiAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgIH1cbiAgICByZWZzLnNldFBvc2l0aW9uUmVmZXJlbmNlKGRvbVJlZmVyZW5jZSk7XG4gIH0sIFtvcGVuQ2hlY2ssIGVuYWJsZWQsIHgsIHksIGZsb2F0aW5nLCBkYXRhUmVmLCByZWZzLCBkb21SZWZlcmVuY2UsIHNldFJlZmVyZW5jZV0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiBhZGRMaXN0ZW5lcigpO1xuICB9LCBbYWRkTGlzdGVuZXIsIHJlYWN0aXZlXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGVuYWJsZWQgJiYgIWZsb2F0aW5nKSB7XG4gICAgICBpbml0aWFsUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9XG4gIH0sIFtlbmFibGVkLCBmbG9hdGluZ10pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCAmJiBvcGVuKSB7XG4gICAgICBpbml0aWFsUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cbiAgfSwgW2VuYWJsZWQsIG9wZW5dKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChlbmFibGVkICYmICh4ICE9IG51bGwgfHwgeSAhPSBudWxsKSkge1xuICAgICAgaW5pdGlhbFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICBzZXRSZWZlcmVuY2UoeCwgeSk7XG4gICAgfVxuICB9LCBbZW5hYmxlZCwgeCwgeSwgc2V0UmVmZXJlbmNlXSk7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHNldFBvaW50ZXJUeXBlUmVmKF9yZWYpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIHBvaW50ZXJUeXBlXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIHNldFBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uUG9pbnRlckRvd246IHNldFBvaW50ZXJUeXBlUmVmLFxuICAgICAgb25Qb2ludGVyRW50ZXI6IHNldFBvaW50ZXJUeXBlUmVmLFxuICAgICAgb25Nb3VzZU1vdmU6IGhhbmRsZVJlZmVyZW5jZUVudGVyT3JNb3ZlLFxuICAgICAgb25Nb3VzZUVudGVyOiBoYW5kbGVSZWZlcmVuY2VFbnRlck9yTW92ZVxuICAgIH07XG4gIH0sIFtoYW5kbGVSZWZlcmVuY2VFbnRlck9yTW92ZV0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIHJlZmVyZW5jZVxuICB9IDoge30sIFtlbmFibGVkLCByZWZlcmVuY2VdKTtcbn1cblxuY29uc3QgYnViYmxlSGFuZGxlcktleXMgPSB7XG4gIHBvaW50ZXJkb3duOiAnb25Qb2ludGVyRG93bicsXG4gIG1vdXNlZG93bjogJ29uTW91c2VEb3duJyxcbiAgY2xpY2s6ICdvbkNsaWNrJ1xufTtcbmNvbnN0IGNhcHR1cmVIYW5kbGVyS2V5cyA9IHtcbiAgcG9pbnRlcmRvd246ICdvblBvaW50ZXJEb3duQ2FwdHVyZScsXG4gIG1vdXNlZG93bjogJ29uTW91c2VEb3duQ2FwdHVyZScsXG4gIGNsaWNrOiAnb25DbGlja0NhcHR1cmUnXG59O1xuY29uc3Qgbm9ybWFsaXplUHJvcCA9IG5vcm1hbGl6YWJsZSA9PiB7XG4gIHZhciBfbm9ybWFsaXphYmxlJGVzY2FwZUssIF9ub3JtYWxpemFibGUkb3V0c2lkZTtcbiAgcmV0dXJuIHtcbiAgICBlc2NhcGVLZXk6IHR5cGVvZiBub3JtYWxpemFibGUgPT09ICdib29sZWFuJyA/IG5vcm1hbGl6YWJsZSA6IChfbm9ybWFsaXphYmxlJGVzY2FwZUsgPSBub3JtYWxpemFibGUgPT0gbnVsbCA/IHZvaWQgMCA6IG5vcm1hbGl6YWJsZS5lc2NhcGVLZXkpICE9IG51bGwgPyBfbm9ybWFsaXphYmxlJGVzY2FwZUsgOiBmYWxzZSxcbiAgICBvdXRzaWRlUHJlc3M6IHR5cGVvZiBub3JtYWxpemFibGUgPT09ICdib29sZWFuJyA/IG5vcm1hbGl6YWJsZSA6IChfbm9ybWFsaXphYmxlJG91dHNpZGUgPSBub3JtYWxpemFibGUgPT0gbnVsbCA/IHZvaWQgMCA6IG5vcm1hbGl6YWJsZS5vdXRzaWRlUHJlc3MpICE9IG51bGwgPyBfbm9ybWFsaXphYmxlJG91dHNpZGUgOiB0cnVlXG4gIH07XG59O1xuLyoqXG4gKiBDbG9zZXMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgd2hlbiBhIGRpc21pc3NhbCBpcyByZXF1ZXN0ZWQg4oCUIGJ5IGRlZmF1bHQsIHdoZW5cbiAqIHRoZSB1c2VyIHByZXNzZXMgdGhlIGBlc2NhcGVgIGtleSBvciBvdXRzaWRlIG9mIHRoZSBmbG9hdGluZyBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZURpc21pc3NcbiAqL1xuZnVuY3Rpb24gdXNlRGlzbWlzcyhjb250ZXh0LCBwcm9wcykge1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgb25PcGVuQ2hhbmdlLFxuICAgIGVsZW1lbnRzLFxuICAgIGRhdGFSZWZcbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICBlc2NhcGVLZXkgPSB0cnVlLFxuICAgIG91dHNpZGVQcmVzczogdW5zdGFibGVfb3V0c2lkZVByZXNzID0gdHJ1ZSxcbiAgICBvdXRzaWRlUHJlc3NFdmVudCA9ICdwb2ludGVyZG93bicsXG4gICAgcmVmZXJlbmNlUHJlc3MgPSBmYWxzZSxcbiAgICByZWZlcmVuY2VQcmVzc0V2ZW50ID0gJ3BvaW50ZXJkb3duJyxcbiAgICBhbmNlc3RvclNjcm9sbCA9IGZhbHNlLFxuICAgIGJ1YmJsZXMsXG4gICAgY2FwdHVyZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHRyZWUgPSB1c2VGbG9hdGluZ1RyZWUoKTtcbiAgY29uc3Qgb3V0c2lkZVByZXNzRm4gPSB1c2VFZmZlY3RFdmVudCh0eXBlb2YgdW5zdGFibGVfb3V0c2lkZVByZXNzID09PSAnZnVuY3Rpb24nID8gdW5zdGFibGVfb3V0c2lkZVByZXNzIDogKCkgPT4gZmFsc2UpO1xuICBjb25zdCBvdXRzaWRlUHJlc3MgPSB0eXBlb2YgdW5zdGFibGVfb3V0c2lkZVByZXNzID09PSAnZnVuY3Rpb24nID8gb3V0c2lkZVByZXNzRm4gOiB1bnN0YWJsZV9vdXRzaWRlUHJlc3M7XG4gIGNvbnN0IGluc2lkZVJlYWN0VHJlZVJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGVuZGVkT3JTdGFydGVkSW5zaWRlUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3Qge1xuICAgIGVzY2FwZUtleTogZXNjYXBlS2V5QnViYmxlcyxcbiAgICBvdXRzaWRlUHJlc3M6IG91dHNpZGVQcmVzc0J1YmJsZXNcbiAgfSA9IG5vcm1hbGl6ZVByb3AoYnViYmxlcyk7XG4gIGNvbnN0IHtcbiAgICBlc2NhcGVLZXk6IGVzY2FwZUtleUNhcHR1cmUsXG4gICAgb3V0c2lkZVByZXNzOiBvdXRzaWRlUHJlc3NDYXB0dXJlXG4gIH0gPSBub3JtYWxpemVQcm9wKGNhcHR1cmUpO1xuICBjb25zdCBjbG9zZU9uRXNjYXBlS2V5RG93biA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICB2YXIgX2RhdGFSZWYkY3VycmVudCRmbG9hO1xuICAgIGlmICghb3BlbiB8fCAhZW5hYmxlZCB8fCAhZXNjYXBlS2V5IHx8IGV2ZW50LmtleSAhPT0gJ0VzY2FwZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZUlkID0gKF9kYXRhUmVmJGN1cnJlbnQkZmxvYSA9IGRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfZGF0YVJlZiRjdXJyZW50JGZsb2Eubm9kZUlkO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdHJlZSA/IGdldENoaWxkcmVuKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKSA6IFtdO1xuICAgIGlmICghZXNjYXBlS2V5QnViYmxlcykge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgc2hvdWxkRGlzbWlzcyA9IHRydWU7XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICAgIHZhciBfY2hpbGQkY29udGV4dDtcbiAgICAgICAgICBpZiAoKF9jaGlsZCRjb250ZXh0ID0gY2hpbGQuY29udGV4dCkgIT0gbnVsbCAmJiBfY2hpbGQkY29udGV4dC5vcGVuICYmICFjaGlsZC5jb250ZXh0LmRhdGFSZWYuY3VycmVudC5fX2VzY2FwZUtleUJ1YmJsZXMpIHtcbiAgICAgICAgICAgIHNob3VsZERpc21pc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXNob3VsZERpc21pc3MpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBpc1JlYWN0RXZlbnQoZXZlbnQpID8gZXZlbnQubmF0aXZlRXZlbnQgOiBldmVudCwgJ2VzY2FwZS1rZXknKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NlT25Fc2NhcGVLZXlEb3duQ2FwdHVyZSA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICB2YXIgX2dldFRhcmdldDI7XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB2YXIgX2dldFRhcmdldDtcbiAgICAgIGNsb3NlT25Fc2NhcGVLZXlEb3duKGV2ZW50KTtcbiAgICAgIChfZ2V0VGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2ZW50KSkgPT0gbnVsbCB8fCBfZ2V0VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBjYWxsYmFjayk7XG4gICAgfTtcbiAgICAoX2dldFRhcmdldDIgPSBnZXRUYXJnZXQoZXZlbnQpKSA9PSBudWxsIHx8IF9nZXRUYXJnZXQyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBjYWxsYmFjayk7XG4gIH0pO1xuICBjb25zdCBjbG9zZU9uUHJlc3NPdXRzaWRlID0gdXNlRWZmZWN0RXZlbnQoZXZlbnQgPT4ge1xuICAgIHZhciBfZGF0YVJlZiRjdXJyZW50JGZsb2EyO1xuICAgIC8vIEdpdmVuIGRldmVsb3BlcnMgY2FuIHN0b3AgdGhlIHByb3BhZ2F0aW9uIG9mIHRoZSBzeW50aGV0aWMgZXZlbnQsXG4gICAgLy8gd2UgY2FuIG9ubHkgYmUgY29uZmlkZW50IHdpdGggYSBwb3NpdGl2ZSB2YWx1ZS5cbiAgICBjb25zdCBpbnNpZGVSZWFjdFRyZWUgPSBpbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudDtcbiAgICBpbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudCA9IGZhbHNlO1xuXG4gICAgLy8gV2hlbiBjbGljayBvdXRzaWRlIGlzIGxhenkgKGBjbGlja2AgZXZlbnQpLCBoYW5kbGUgZHJhZ2dpbmcuXG4gICAgLy8gRG9uJ3QgY2xvc2UgaWY6XG4gICAgLy8gLSBUaGUgY2xpY2sgc3RhcnRlZCBpbnNpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQuXG4gICAgLy8gLSBUaGUgY2xpY2sgZW5kZWQgaW5zaWRlIHRoZSBmbG9hdGluZyBlbGVtZW50LlxuICAgIGNvbnN0IGVuZGVkT3JTdGFydGVkSW5zaWRlID0gZW5kZWRPclN0YXJ0ZWRJbnNpZGVSZWYuY3VycmVudDtcbiAgICBlbmRlZE9yU3RhcnRlZEluc2lkZVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgaWYgKG91dHNpZGVQcmVzc0V2ZW50ID09PSAnY2xpY2snICYmIGVuZGVkT3JTdGFydGVkSW5zaWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbnNpZGVSZWFjdFRyZWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvdXRzaWRlUHJlc3MgPT09ICdmdW5jdGlvbicgJiYgIW91dHNpZGVQcmVzcyhldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2ZW50KTtcbiAgICBjb25zdCBpbmVydFNlbGVjdG9yID0gXCJbXCIgKyBjcmVhdGVBdHRyaWJ1dGUoJ2luZXJ0JykgKyBcIl1cIjtcbiAgICBjb25zdCBtYXJrZXJzID0gZ2V0RG9jdW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpLnF1ZXJ5U2VsZWN0b3JBbGwoaW5lcnRTZWxlY3Rvcik7XG4gICAgbGV0IHRhcmdldFJvb3RBbmNlc3RvciA9IGlzRWxlbWVudCh0YXJnZXQpID8gdGFyZ2V0IDogbnVsbDtcbiAgICB3aGlsZSAodGFyZ2V0Um9vdEFuY2VzdG9yICYmICFpc0xhc3RUcmF2ZXJzYWJsZU5vZGUodGFyZ2V0Um9vdEFuY2VzdG9yKSkge1xuICAgICAgY29uc3QgbmV4dFBhcmVudCA9IGdldFBhcmVudE5vZGUodGFyZ2V0Um9vdEFuY2VzdG9yKTtcbiAgICAgIGlmIChpc0xhc3RUcmF2ZXJzYWJsZU5vZGUobmV4dFBhcmVudCkgfHwgIWlzRWxlbWVudChuZXh0UGFyZW50KSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRhcmdldFJvb3RBbmNlc3RvciA9IG5leHRQYXJlbnQ7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWNrIG9jY3VycmVkIG9uIGEgdGhpcmQtcGFydHkgZWxlbWVudCBpbmplY3RlZCBhZnRlciB0aGVcbiAgICAvLyBmbG9hdGluZyBlbGVtZW50IHJlbmRlcmVkLlxuICAgIGlmIChtYXJrZXJzLmxlbmd0aCAmJiBpc0VsZW1lbnQodGFyZ2V0KSAmJiAhaXNSb290RWxlbWVudCh0YXJnZXQpICYmXG4gICAgLy8gQ2xpY2tlZCBvbiBhIGRpcmVjdCBhbmNlc3RvciAoZS5nLiBGbG9hdGluZ092ZXJsYXkpLlxuICAgICFjb250YWlucyh0YXJnZXQsIGVsZW1lbnRzLmZsb2F0aW5nKSAmJlxuICAgIC8vIElmIHRoZSB0YXJnZXQgcm9vdCBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb2YgdGhlIG1hcmtlcnMsIHRoZW4gdGhlXG4gICAgLy8gZWxlbWVudCB3YXMgaW5qZWN0ZWQgYWZ0ZXIgdGhlIGZsb2F0aW5nIGVsZW1lbnQgcmVuZGVyZWQuXG4gICAgQXJyYXkuZnJvbShtYXJrZXJzKS5ldmVyeShtYXJrZXIgPT4gIWNvbnRhaW5zKHRhcmdldFJvb3RBbmNlc3RvciwgbWFya2VyKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY2xpY2sgb2NjdXJyZWQgb24gdGhlIHNjcm9sbGJhclxuICAgIGlmIChpc0hUTUxFbGVtZW50KHRhcmdldCkgJiYgZmxvYXRpbmcpIHtcbiAgICAgIC8vIEluIEZpcmVmb3gsIGB0YXJnZXQuc2Nyb2xsV2lkdGggPiB0YXJnZXQuY2xpZW50V2lkdGhgIGZvciBpbmxpbmVcbiAgICAgIC8vIGVsZW1lbnRzLlxuICAgICAgY29uc3QgY2FuU2Nyb2xsWCA9IHRhcmdldC5jbGllbnRXaWR0aCA+IDAgJiYgdGFyZ2V0LnNjcm9sbFdpZHRoID4gdGFyZ2V0LmNsaWVudFdpZHRoO1xuICAgICAgY29uc3QgY2FuU2Nyb2xsWSA9IHRhcmdldC5jbGllbnRIZWlnaHQgPiAwICYmIHRhcmdldC5zY3JvbGxIZWlnaHQgPiB0YXJnZXQuY2xpZW50SGVpZ2h0O1xuICAgICAgbGV0IHhDb25kID0gY2FuU2Nyb2xsWSAmJiBldmVudC5vZmZzZXRYID4gdGFyZ2V0LmNsaWVudFdpZHRoO1xuXG4gICAgICAvLyBJbiBzb21lIGJyb3dzZXJzIGl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgPGJvZHk+IChvciB3aW5kb3cpXG4gICAgICAvLyBzY3JvbGxiYXIgdG8gdGhlIGxlZnQgc2lkZSwgYnV0IGlzIHZlcnkgcmFyZSBhbmQgaXMgZGlmZmljdWx0IHRvXG4gICAgICAvLyBjaGVjayBmb3IuIFBsdXMsIGZvciBtb2RhbCBkaWFsb2dzIHdpdGggYmFja2Ryb3BzLCBpdCBpcyBtb3JlXG4gICAgICAvLyBpbXBvcnRhbnQgdGhhdCB0aGUgYmFja2Ryb3AgaXMgY2hlY2tlZCBidXQgbm90IHNvIG11Y2ggdGhlIHdpbmRvdy5cbiAgICAgIGlmIChjYW5TY3JvbGxZKSB7XG4gICAgICAgIGNvbnN0IGlzUlRMID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmRpcmVjdGlvbiA9PT0gJ3J0bCc7XG4gICAgICAgIGlmIChpc1JUTCkge1xuICAgICAgICAgIHhDb25kID0gZXZlbnQub2Zmc2V0WCA8PSB0YXJnZXQub2Zmc2V0V2lkdGggLSB0YXJnZXQuY2xpZW50V2lkdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh4Q29uZCB8fCBjYW5TY3JvbGxYICYmIGV2ZW50Lm9mZnNldFkgPiB0YXJnZXQuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgbm9kZUlkID0gKF9kYXRhUmVmJGN1cnJlbnQkZmxvYTIgPSBkYXRhUmVmLmN1cnJlbnQuZmxvYXRpbmdDb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX2RhdGFSZWYkY3VycmVudCRmbG9hMi5ub2RlSWQ7XG4gICAgY29uc3QgdGFyZ2V0SXNJbnNpZGVDaGlsZHJlbiA9IHRyZWUgJiYgZ2V0Q2hpbGRyZW4odHJlZS5ub2Rlc1JlZi5jdXJyZW50LCBub2RlSWQpLnNvbWUobm9kZSA9PiB7XG4gICAgICB2YXIgX25vZGUkY29udGV4dDtcbiAgICAgIHJldHVybiBpc0V2ZW50VGFyZ2V0V2l0aGluKGV2ZW50LCAoX25vZGUkY29udGV4dCA9IG5vZGUuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9ub2RlJGNvbnRleHQuZWxlbWVudHMuZmxvYXRpbmcpO1xuICAgIH0pO1xuICAgIGlmIChpc0V2ZW50VGFyZ2V0V2l0aGluKGV2ZW50LCBlbGVtZW50cy5mbG9hdGluZykgfHwgaXNFdmVudFRhcmdldFdpdGhpbihldmVudCwgZWxlbWVudHMuZG9tUmVmZXJlbmNlKSB8fCB0YXJnZXRJc0luc2lkZUNoaWxkcmVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkcmVuID0gdHJlZSA/IGdldENoaWxkcmVuKHRyZWUubm9kZXNSZWYuY3VycmVudCwgbm9kZUlkKSA6IFtdO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgc2hvdWxkRGlzbWlzcyA9IHRydWU7XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgdmFyIF9jaGlsZCRjb250ZXh0MjtcbiAgICAgICAgaWYgKChfY2hpbGQkY29udGV4dDIgPSBjaGlsZC5jb250ZXh0KSAhPSBudWxsICYmIF9jaGlsZCRjb250ZXh0Mi5vcGVuICYmICFjaGlsZC5jb250ZXh0LmRhdGFSZWYuY3VycmVudC5fX291dHNpZGVQcmVzc0J1YmJsZXMpIHtcbiAgICAgICAgICBzaG91bGREaXNtaXNzID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghc2hvdWxkRGlzbWlzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQsICdvdXRzaWRlLXByZXNzJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zZU9uUHJlc3NPdXRzaWRlQ2FwdHVyZSA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICB2YXIgX2dldFRhcmdldDQ7XG4gICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB2YXIgX2dldFRhcmdldDM7XG4gICAgICBjbG9zZU9uUHJlc3NPdXRzaWRlKGV2ZW50KTtcbiAgICAgIChfZ2V0VGFyZ2V0MyA9IGdldFRhcmdldChldmVudCkpID09IG51bGwgfHwgX2dldFRhcmdldDMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvdXRzaWRlUHJlc3NFdmVudCwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgKF9nZXRUYXJnZXQ0ID0gZ2V0VGFyZ2V0KGV2ZW50KSkgPT0gbnVsbCB8fCBfZ2V0VGFyZ2V0NC5hZGRFdmVudExpc3RlbmVyKG91dHNpZGVQcmVzc0V2ZW50LCBjYWxsYmFjayk7XG4gIH0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghb3BlbiB8fCAhZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYXRhUmVmLmN1cnJlbnQuX19lc2NhcGVLZXlCdWJibGVzID0gZXNjYXBlS2V5QnViYmxlcztcbiAgICBkYXRhUmVmLmN1cnJlbnQuX19vdXRzaWRlUHJlc3NCdWJibGVzID0gb3V0c2lkZVByZXNzQnViYmxlcztcbiAgICBmdW5jdGlvbiBvblNjcm9sbChldmVudCkge1xuICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudCwgJ2FuY2VzdG9yLXNjcm9sbCcpO1xuICAgIH1cbiAgICBjb25zdCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50cy5mbG9hdGluZyk7XG4gICAgZXNjYXBlS2V5ICYmIGRvYy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXNjYXBlS2V5Q2FwdHVyZSA/IGNsb3NlT25Fc2NhcGVLZXlEb3duQ2FwdHVyZSA6IGNsb3NlT25Fc2NhcGVLZXlEb3duLCBlc2NhcGVLZXlDYXB0dXJlKTtcbiAgICBvdXRzaWRlUHJlc3MgJiYgZG9jLmFkZEV2ZW50TGlzdGVuZXIob3V0c2lkZVByZXNzRXZlbnQsIG91dHNpZGVQcmVzc0NhcHR1cmUgPyBjbG9zZU9uUHJlc3NPdXRzaWRlQ2FwdHVyZSA6IGNsb3NlT25QcmVzc091dHNpZGUsIG91dHNpZGVQcmVzc0NhcHR1cmUpO1xuICAgIGxldCBhbmNlc3RvcnMgPSBbXTtcbiAgICBpZiAoYW5jZXN0b3JTY3JvbGwpIHtcbiAgICAgIGlmIChpc0VsZW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlKSkge1xuICAgICAgICBhbmNlc3RvcnMgPSBnZXRPdmVyZmxvd0FuY2VzdG9ycyhlbGVtZW50cy5kb21SZWZlcmVuY2UpO1xuICAgICAgfVxuICAgICAgaWYgKGlzRWxlbWVudChlbGVtZW50cy5mbG9hdGluZykpIHtcbiAgICAgICAgYW5jZXN0b3JzID0gYW5jZXN0b3JzLmNvbmNhdChnZXRPdmVyZmxvd0FuY2VzdG9ycyhlbGVtZW50cy5mbG9hdGluZykpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0VsZW1lbnQoZWxlbWVudHMucmVmZXJlbmNlKSAmJiBlbGVtZW50cy5yZWZlcmVuY2UgJiYgZWxlbWVudHMucmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSB7XG4gICAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5jb25jYXQoZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZWxlbWVudHMucmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWdub3JlIHRoZSB2aXN1YWwgdmlld3BvcnQgZm9yIHNjcm9sbGluZyBkaXNtaXNzYWwgKGFsbG93IHBpbmNoLXpvb20pXG4gICAgYW5jZXN0b3JzID0gYW5jZXN0b3JzLmZpbHRlcihhbmNlc3RvciA9PiB7XG4gICAgICB2YXIgX2RvYyRkZWZhdWx0VmlldztcbiAgICAgIHJldHVybiBhbmNlc3RvciAhPT0gKChfZG9jJGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3KSA9PSBudWxsID8gdm9pZCAwIDogX2RvYyRkZWZhdWx0Vmlldy52aXN1YWxWaWV3cG9ydCk7XG4gICAgfSk7XG4gICAgYW5jZXN0b3JzLmZvckVhY2goYW5jZXN0b3IgPT4ge1xuICAgICAgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGwsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGVzY2FwZUtleSAmJiBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGVzY2FwZUtleUNhcHR1cmUgPyBjbG9zZU9uRXNjYXBlS2V5RG93bkNhcHR1cmUgOiBjbG9zZU9uRXNjYXBlS2V5RG93biwgZXNjYXBlS2V5Q2FwdHVyZSk7XG4gICAgICBvdXRzaWRlUHJlc3MgJiYgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIob3V0c2lkZVByZXNzRXZlbnQsIG91dHNpZGVQcmVzc0NhcHR1cmUgPyBjbG9zZU9uUHJlc3NPdXRzaWRlQ2FwdHVyZSA6IGNsb3NlT25QcmVzc091dHNpZGUsIG91dHNpZGVQcmVzc0NhcHR1cmUpO1xuICAgICAgYW5jZXN0b3JzLmZvckVhY2goYW5jZXN0b3IgPT4ge1xuICAgICAgICBhbmNlc3Rvci5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbCk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9LCBbZGF0YVJlZiwgZWxlbWVudHMsIGVzY2FwZUtleSwgb3V0c2lkZVByZXNzLCBvdXRzaWRlUHJlc3NFdmVudCwgb3Blbiwgb25PcGVuQ2hhbmdlLCBhbmNlc3RvclNjcm9sbCwgZW5hYmxlZCwgZXNjYXBlS2V5QnViYmxlcywgb3V0c2lkZVByZXNzQnViYmxlcywgY2xvc2VPbkVzY2FwZUtleURvd24sIGVzY2FwZUtleUNhcHR1cmUsIGNsb3NlT25Fc2NhcGVLZXlEb3duQ2FwdHVyZSwgY2xvc2VPblByZXNzT3V0c2lkZSwgb3V0c2lkZVByZXNzQ2FwdHVyZSwgY2xvc2VPblByZXNzT3V0c2lkZUNhcHR1cmVdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudCA9IGZhbHNlO1xuICB9LCBbb3V0c2lkZVByZXNzLCBvdXRzaWRlUHJlc3NFdmVudF0pO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgb25LZXlEb3duOiBjbG9zZU9uRXNjYXBlS2V5RG93bixcbiAgICBbYnViYmxlSGFuZGxlcktleXNbcmVmZXJlbmNlUHJlc3NFdmVudF1dOiBldmVudCA9PiB7XG4gICAgICBpZiAocmVmZXJlbmNlUHJlc3MpIHtcbiAgICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlLCBldmVudC5uYXRpdmVFdmVudCwgJ3JlZmVyZW5jZS1wcmVzcycpO1xuICAgICAgfVxuICAgIH1cbiAgfSksIFtjbG9zZU9uRXNjYXBlS2V5RG93biwgb25PcGVuQ2hhbmdlLCByZWZlcmVuY2VQcmVzcywgcmVmZXJlbmNlUHJlc3NFdmVudF0pO1xuICBjb25zdCBmbG9hdGluZyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBvbktleURvd246IGNsb3NlT25Fc2NhcGVLZXlEb3duLFxuICAgIG9uTW91c2VEb3duKCkge1xuICAgICAgZW5kZWRPclN0YXJ0ZWRJbnNpZGVSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfSxcbiAgICBvbk1vdXNlVXAoKSB7XG4gICAgICBlbmRlZE9yU3RhcnRlZEluc2lkZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9LFxuICAgIFtjYXB0dXJlSGFuZGxlcktleXNbb3V0c2lkZVByZXNzRXZlbnRdXTogKCkgPT4ge1xuICAgICAgaW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH1cbiAgfSksIFtjbG9zZU9uRXNjYXBlS2V5RG93biwgb3V0c2lkZVByZXNzRXZlbnRdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmdcbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlLCBmbG9hdGluZ10pO1xufVxuXG5mdW5jdGlvbiB1c2VGbG9hdGluZ1Jvb3RDb250ZXh0KG9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIG9wZW4gPSBmYWxzZSxcbiAgICBvbk9wZW5DaGFuZ2U6IG9uT3BlbkNoYW5nZVByb3AsXG4gICAgZWxlbWVudHM6IGVsZW1lbnRzUHJvcFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZmxvYXRpbmdJZCA9IHVzZUlkKCk7XG4gIGNvbnN0IGRhdGFSZWYgPSBSZWFjdC51c2VSZWYoe30pO1xuICBjb25zdCBbZXZlbnRzXSA9IFJlYWN0LnVzZVN0YXRlKCgpID0+IGNyZWF0ZVB1YlN1YigpKTtcbiAgY29uc3QgbmVzdGVkID0gdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQoKSAhPSBudWxsO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc3Qgb3B0aW9uRG9tUmVmZXJlbmNlID0gZWxlbWVudHNQcm9wLnJlZmVyZW5jZTtcbiAgICBpZiAob3B0aW9uRG9tUmVmZXJlbmNlICYmICFpc0VsZW1lbnQob3B0aW9uRG9tUmVmZXJlbmNlKSkge1xuICAgICAgZXJyb3IoJ0Nhbm5vdCBwYXNzIGEgdmlydHVhbCBlbGVtZW50IHRvIHRoZSBgZWxlbWVudHMucmVmZXJlbmNlYCBvcHRpb24sJywgJ2FzIGl0IG11c3QgYmUgYSByZWFsIERPTSBlbGVtZW50LiBVc2UgYHJlZnMuc2V0UG9zaXRpb25SZWZlcmVuY2UoKWAnLCAnaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW3Bvc2l0aW9uUmVmZXJlbmNlLCBzZXRQb3NpdGlvblJlZmVyZW5jZV0gPSBSZWFjdC51c2VTdGF0ZShlbGVtZW50c1Byb3AucmVmZXJlbmNlKTtcbiAgY29uc3Qgb25PcGVuQ2hhbmdlID0gdXNlRWZmZWN0RXZlbnQoKG9wZW4sIGV2ZW50LCByZWFzb24pID0+IHtcbiAgICBkYXRhUmVmLmN1cnJlbnQub3BlbkV2ZW50ID0gb3BlbiA/IGV2ZW50IDogdW5kZWZpbmVkO1xuICAgIGV2ZW50cy5lbWl0KCdvcGVuY2hhbmdlJywge1xuICAgICAgb3BlbixcbiAgICAgIGV2ZW50LFxuICAgICAgcmVhc29uLFxuICAgICAgbmVzdGVkXG4gICAgfSk7XG4gICAgb25PcGVuQ2hhbmdlUHJvcCA9PSBudWxsIHx8IG9uT3BlbkNoYW5nZVByb3Aob3BlbiwgZXZlbnQsIHJlYXNvbik7XG4gIH0pO1xuICBjb25zdCByZWZzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHNldFBvc2l0aW9uUmVmZXJlbmNlXG4gIH0pLCBbXSk7XG4gIGNvbnN0IGVsZW1lbnRzID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIHJlZmVyZW5jZTogcG9zaXRpb25SZWZlcmVuY2UgfHwgZWxlbWVudHNQcm9wLnJlZmVyZW5jZSB8fCBudWxsLFxuICAgIGZsb2F0aW5nOiBlbGVtZW50c1Byb3AuZmxvYXRpbmcgfHwgbnVsbCxcbiAgICBkb21SZWZlcmVuY2U6IGVsZW1lbnRzUHJvcC5yZWZlcmVuY2VcbiAgfSksIFtwb3NpdGlvblJlZmVyZW5jZSwgZWxlbWVudHNQcm9wLnJlZmVyZW5jZSwgZWxlbWVudHNQcm9wLmZsb2F0aW5nXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZGF0YVJlZixcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBlbGVtZW50cyxcbiAgICBldmVudHMsXG4gICAgZmxvYXRpbmdJZCxcbiAgICByZWZzXG4gIH0pLCBbb3Blbiwgb25PcGVuQ2hhbmdlLCBlbGVtZW50cywgZXZlbnRzLCBmbG9hdGluZ0lkLCByZWZzXSk7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhIGZsb2F0aW5nIGVsZW1lbnQgYW5kIGNvbnRleHQgdG8gYWRkIGludGVyYWN0aW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy91c2VGbG9hdGluZ1xuICovXG5mdW5jdGlvbiB1c2VGbG9hdGluZyhvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG5vZGVJZFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgaW50ZXJuYWxSb290Q29udGV4dCA9IHVzZUZsb2F0aW5nUm9vdENvbnRleHQoe1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIHJlZmVyZW5jZTogbnVsbCxcbiAgICAgIGZsb2F0aW5nOiBudWxsLFxuICAgICAgLi4ub3B0aW9ucy5lbGVtZW50c1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IHJvb3RDb250ZXh0ID0gb3B0aW9ucy5yb290Q29udGV4dCB8fCBpbnRlcm5hbFJvb3RDb250ZXh0O1xuICBjb25zdCBjb21wdXRlZEVsZW1lbnRzID0gcm9vdENvbnRleHQuZWxlbWVudHM7XG4gIGNvbnN0IFtfZG9tUmVmZXJlbmNlLCBzZXREb21SZWZlcmVuY2VdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtwb3NpdGlvblJlZmVyZW5jZSwgX3NldFBvc2l0aW9uUmVmZXJlbmNlXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBvcHRpb25Eb21SZWZlcmVuY2UgPSBjb21wdXRlZEVsZW1lbnRzID09IG51bGwgPyB2b2lkIDAgOiBjb21wdXRlZEVsZW1lbnRzLnJlZmVyZW5jZTtcbiAgY29uc3QgZG9tUmVmZXJlbmNlID0gb3B0aW9uRG9tUmVmZXJlbmNlIHx8IF9kb21SZWZlcmVuY2U7XG4gIGNvbnN0IGRvbVJlZmVyZW5jZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgdHJlZSA9IHVzZUZsb2F0aW5nVHJlZSgpO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKGRvbVJlZmVyZW5jZSkge1xuICAgICAgZG9tUmVmZXJlbmNlUmVmLmN1cnJlbnQgPSBkb21SZWZlcmVuY2U7XG4gICAgfVxuICB9LCBbZG9tUmVmZXJlbmNlXSk7XG4gIGNvbnN0IHBvc2l0aW9uID0gdXNlRmxvYXRpbmckMSh7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBlbGVtZW50czoge1xuICAgICAgLi4uY29tcHV0ZWRFbGVtZW50cyxcbiAgICAgIC4uLihwb3NpdGlvblJlZmVyZW5jZSAmJiB7XG4gICAgICAgIHJlZmVyZW5jZTogcG9zaXRpb25SZWZlcmVuY2VcbiAgICAgIH0pXG4gICAgfVxuICB9KTtcbiAgY29uc3Qgc2V0UG9zaXRpb25SZWZlcmVuY2UgPSBSZWFjdC51c2VDYWxsYmFjayhub2RlID0+IHtcbiAgICBjb25zdCBjb21wdXRlZFBvc2l0aW9uUmVmZXJlbmNlID0gaXNFbGVtZW50KG5vZGUpID8ge1xuICAgICAgZ2V0Qm91bmRpbmdDbGllbnRSZWN0OiAoKSA9PiBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgY29udGV4dEVsZW1lbnQ6IG5vZGVcbiAgICB9IDogbm9kZTtcbiAgICAvLyBTdG9yZSB0aGUgcG9zaXRpb25SZWZlcmVuY2UgaW4gc3RhdGUgaWYgdGhlIERPTSByZWZlcmVuY2UgaXMgc3BlY2lmaWVkIGV4dGVybmFsbHkgdmlhIHRoZVxuICAgIC8vIGBlbGVtZW50cy5yZWZlcmVuY2VgIG9wdGlvbi4gVGhpcyBlbnN1cmVzIHRoYXQgaXQgd29uJ3QgYmUgb3ZlcnJpZGRlbiBvbiBmdXR1cmUgcmVuZGVycy5cbiAgICBfc2V0UG9zaXRpb25SZWZlcmVuY2UoY29tcHV0ZWRQb3NpdGlvblJlZmVyZW5jZSk7XG4gICAgcG9zaXRpb24ucmVmcy5zZXRSZWZlcmVuY2UoY29tcHV0ZWRQb3NpdGlvblJlZmVyZW5jZSk7XG4gIH0sIFtwb3NpdGlvbi5yZWZzXSk7XG4gIGNvbnN0IHNldFJlZmVyZW5jZSA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIGlmIChpc0VsZW1lbnQobm9kZSkgfHwgbm9kZSA9PT0gbnVsbCkge1xuICAgICAgZG9tUmVmZXJlbmNlUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgc2V0RG9tUmVmZXJlbmNlKG5vZGUpO1xuICAgIH1cblxuICAgIC8vIEJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGZvciBwYXNzaW5nIGEgdmlydHVhbCBlbGVtZW50IHRvIGByZWZlcmVuY2VgXG4gICAgLy8gYWZ0ZXIgaXQgaGFzIHNldCB0aGUgRE9NIHJlZmVyZW5jZS5cbiAgICBpZiAoaXNFbGVtZW50KHBvc2l0aW9uLnJlZnMucmVmZXJlbmNlLmN1cnJlbnQpIHx8IHBvc2l0aW9uLnJlZnMucmVmZXJlbmNlLmN1cnJlbnQgPT09IG51bGwgfHxcbiAgICAvLyBEb24ndCBhbGxvdyBzZXR0aW5nIHZpcnR1YWwgZWxlbWVudHMgdXNpbmcgdGhlIG9sZCB0ZWNobmlxdWUgYmFjayB0b1xuICAgIC8vIGBudWxsYCB0byBzdXBwb3J0IGBwb3NpdGlvblJlZmVyZW5jZWAgKyBhbiB1bnN0YWJsZSBgcmVmZXJlbmNlYFxuICAgIC8vIGNhbGxiYWNrIHJlZi5cbiAgICBub2RlICE9PSBudWxsICYmICFpc0VsZW1lbnQobm9kZSkpIHtcbiAgICAgIHBvc2l0aW9uLnJlZnMuc2V0UmVmZXJlbmNlKG5vZGUpO1xuICAgIH1cbiAgfSwgW3Bvc2l0aW9uLnJlZnNdKTtcbiAgY29uc3QgcmVmcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5wb3NpdGlvbi5yZWZzLFxuICAgIHNldFJlZmVyZW5jZSxcbiAgICBzZXRQb3NpdGlvblJlZmVyZW5jZSxcbiAgICBkb21SZWZlcmVuY2U6IGRvbVJlZmVyZW5jZVJlZlxuICB9KSwgW3Bvc2l0aW9uLnJlZnMsIHNldFJlZmVyZW5jZSwgc2V0UG9zaXRpb25SZWZlcmVuY2VdKTtcbiAgY29uc3QgZWxlbWVudHMgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgLi4ucG9zaXRpb24uZWxlbWVudHMsXG4gICAgZG9tUmVmZXJlbmNlOiBkb21SZWZlcmVuY2VcbiAgfSksIFtwb3NpdGlvbi5lbGVtZW50cywgZG9tUmVmZXJlbmNlXSk7XG4gIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgLi4ucG9zaXRpb24sXG4gICAgLi4ucm9vdENvbnRleHQsXG4gICAgcmVmcyxcbiAgICBlbGVtZW50cyxcbiAgICBub2RlSWRcbiAgfSksIFtwb3NpdGlvbiwgcmVmcywgZWxlbWVudHMsIG5vZGVJZCwgcm9vdENvbnRleHRdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIHJvb3RDb250ZXh0LmRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQgPSBjb250ZXh0O1xuICAgIGNvbnN0IG5vZGUgPSB0cmVlID09IG51bGwgPyB2b2lkIDAgOiB0cmVlLm5vZGVzUmVmLmN1cnJlbnQuZmluZChub2RlID0+IG5vZGUuaWQgPT09IG5vZGVJZCk7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIG5vZGUuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAuLi5wb3NpdGlvbixcbiAgICBjb250ZXh0LFxuICAgIHJlZnMsXG4gICAgZWxlbWVudHNcbiAgfSksIFtwb3NpdGlvbiwgcmVmcywgZWxlbWVudHMsIGNvbnRleHRdKTtcbn1cblxuLyoqXG4gKiBPcGVucyB0aGUgZmxvYXRpbmcgZWxlbWVudCB3aGlsZSB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgaGFzIGZvY3VzLCBsaWtlIENTU1xuICogYDpmb2N1c2AuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlRm9jdXNcbiAqL1xuZnVuY3Rpb24gdXNlRm9jdXMoY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBldmVudHMsXG4gICAgZGF0YVJlZixcbiAgICBlbGVtZW50c1xuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIHZpc2libGVPbmx5ID0gdHJ1ZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGJsb2NrRm9jdXNSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCB0aW1lb3V0UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIGNvbnN0IGtleWJvYXJkTW9kYWxpdHlSZWYgPSBSZWFjdC51c2VSZWYodHJ1ZSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gICAgY29uc3Qgd2luID0gZ2V0V2luZG93KGVsZW1lbnRzLmRvbVJlZmVyZW5jZSk7XG5cbiAgICAvLyBJZiB0aGUgcmVmZXJlbmNlIHdhcyBmb2N1c2VkIGFuZCB0aGUgdXNlciBsZWZ0IHRoZSB0YWIvd2luZG93LCBhbmQgdGhlXG4gICAgLy8gZmxvYXRpbmcgZWxlbWVudCB3YXMgbm90IG9wZW4sIHRoZSBmb2N1cyBzaG91bGQgYmUgYmxvY2tlZCB3aGVuIHRoZXlcbiAgICAvLyByZXR1cm4gdG8gdGhlIHRhYi93aW5kb3cuXG4gICAgZnVuY3Rpb24gb25CbHVyKCkge1xuICAgICAgaWYgKCFvcGVuICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlKSAmJiBlbGVtZW50cy5kb21SZWZlcmVuY2UgPT09IGFjdGl2ZUVsZW1lbnQoZ2V0RG9jdW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlKSkpIHtcbiAgICAgICAgYmxvY2tGb2N1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25LZXlEb3duKCkge1xuICAgICAga2V5Ym9hcmRNb2RhbGl0eVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgd2luLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbkJsdXIpO1xuICAgIHdpbi5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duLCB0cnVlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbkJsdXIpO1xuICAgICAgd2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24sIHRydWUpO1xuICAgIH07XG4gIH0sIFtlbGVtZW50cy5kb21SZWZlcmVuY2UsIG9wZW4sIGVuYWJsZWRdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBmdW5jdGlvbiBvbk9wZW5DaGFuZ2UoX3JlZikge1xuICAgICAgbGV0IHtcbiAgICAgICAgcmVhc29uXG4gICAgICB9ID0gX3JlZjtcbiAgICAgIGlmIChyZWFzb24gPT09ICdyZWZlcmVuY2UtcHJlc3MnIHx8IHJlYXNvbiA9PT0gJ2VzY2FwZS1rZXknKSB7XG4gICAgICAgIGJsb2NrRm9jdXNSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGV2ZW50cy5vbignb3BlbmNoYW5nZScsIG9uT3BlbkNoYW5nZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGV2ZW50cy5vZmYoJ29wZW5jaGFuZ2UnLCBvbk9wZW5DaGFuZ2UpO1xuICAgIH07XG4gIH0sIFtldmVudHMsIGVuYWJsZWRdKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW10pO1xuICBjb25zdCByZWZlcmVuY2UgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgb25Qb2ludGVyRG93bihldmVudCkge1xuICAgICAgaWYgKGlzVmlydHVhbFBvaW50ZXJFdmVudChldmVudC5uYXRpdmVFdmVudCkpIHJldHVybjtcbiAgICAgIGtleWJvYXJkTW9kYWxpdHlSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0sXG4gICAgb25Nb3VzZUxlYXZlKCkge1xuICAgICAgYmxvY2tGb2N1c1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSxcbiAgICBvbkZvY3VzKGV2ZW50KSB7XG4gICAgICBpZiAoYmxvY2tGb2N1c1JlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQubmF0aXZlRXZlbnQpO1xuICAgICAgaWYgKHZpc2libGVPbmx5ICYmIGlzRWxlbWVudCh0YXJnZXQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gTWFjIFNhZmFyaSB1bnJlbGlhYmx5IG1hdGNoZXMgYDpmb2N1cy12aXNpYmxlYCBvbiB0aGUgcmVmZXJlbmNlXG4gICAgICAgICAgLy8gaWYgZm9jdXMgd2FzIG91dHNpZGUgdGhlIHBhZ2UgaW5pdGlhbGx5IC0gdXNlIHRoZSBmYWxsYmFja1xuICAgICAgICAgIC8vIGluc3RlYWQuXG4gICAgICAgICAgaWYgKGlzU2FmYXJpKCkgJiYgaXNNYWMoKSkgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICBpZiAoIXRhcmdldC5tYXRjaGVzKCc6Zm9jdXMtdmlzaWJsZScpKSByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBPbGQgYnJvd3NlcnMgd2lsbCB0aHJvdyBhbiBlcnJvciB3aGVuIHVzaW5nIGA6Zm9jdXMtdmlzaWJsZWAuXG4gICAgICAgICAgaWYgKCFrZXlib2FyZE1vZGFsaXR5UmVmLmN1cnJlbnQgJiYgIWlzVHlwZWFibGVFbGVtZW50KHRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uT3BlbkNoYW5nZSh0cnVlLCBldmVudC5uYXRpdmVFdmVudCwgJ2ZvY3VzJyk7XG4gICAgfSxcbiAgICBvbkJsdXIoZXZlbnQpIHtcbiAgICAgIGJsb2NrRm9jdXNSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICBjb25zdCBuYXRpdmVFdmVudCA9IGV2ZW50Lm5hdGl2ZUV2ZW50O1xuXG4gICAgICAvLyBIaXQgdGhlIG5vbi1tb2RhbCBmb2N1cyBtYW5hZ2VtZW50IHBvcnRhbCBndWFyZC4gRm9jdXMgd2lsbCBiZVxuICAgICAgLy8gbW92ZWQgaW50byB0aGUgZmxvYXRpbmcgZWxlbWVudCBpbW1lZGlhdGVseSBhZnRlci5cbiAgICAgIGNvbnN0IG1vdmVkVG9Gb2N1c0d1YXJkID0gaXNFbGVtZW50KHJlbGF0ZWRUYXJnZXQpICYmIHJlbGF0ZWRUYXJnZXQuaGFzQXR0cmlidXRlKGNyZWF0ZUF0dHJpYnV0ZSgnZm9jdXMtZ3VhcmQnKSkgJiYgcmVsYXRlZFRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpID09PSAnb3V0c2lkZSc7XG5cbiAgICAgIC8vIFdhaXQgZm9yIHRoZSB3aW5kb3cgYmx1ciBsaXN0ZW5lciB0byBmaXJlLlxuICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2YXIgX2RhdGFSZWYkY3VycmVudCRmbG9hO1xuICAgICAgICBjb25zdCBhY3RpdmVFbCA9IGFjdGl2ZUVsZW1lbnQoZWxlbWVudHMuZG9tUmVmZXJlbmNlID8gZWxlbWVudHMuZG9tUmVmZXJlbmNlLm93bmVyRG9jdW1lbnQgOiBkb2N1bWVudCk7XG5cbiAgICAgICAgLy8gRm9jdXMgbGVmdCB0aGUgcGFnZSwga2VlcCBpdCBvcGVuLlxuICAgICAgICBpZiAoIXJlbGF0ZWRUYXJnZXQgJiYgYWN0aXZlRWwgPT09IGVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFdoZW4gZm9jdXNpbmcgdGhlIHJlZmVyZW5jZSBlbGVtZW50IChlLmcuIHJlZ3VsYXIgY2xpY2spLCB0aGVuXG4gICAgICAgIC8vIGNsaWNraW5nIGludG8gdGhlIGZsb2F0aW5nIGVsZW1lbnQsIHByZXZlbnQgaXQgZnJvbSBoaWRpbmcuXG4gICAgICAgIC8vIE5vdGU6IGl0IG11c3QgYmUgZm9jdXNhYmxlLCBlLmcuIGB0YWJpbmRleD1cIi0xXCJgLlxuICAgICAgICAvLyBXZSBjYW4gbm90IHJlbHkgb24gcmVsYXRlZFRhcmdldCB0byBwb2ludCB0byB0aGUgY29ycmVjdCBlbGVtZW50XG4gICAgICAgIC8vIGFzIGl0IHdpbGwgb25seSBwb2ludCB0byB0aGUgc2hhZG93IGhvc3Qgb2YgdGhlIG5ld2x5IGZvY3VzZWQgZWxlbWVudFxuICAgICAgICAvLyBhbmQgbm90IHRoZSBlbGVtZW50IHRoYXQgYWN0dWFsbHkgaGFzIHJlY2VpdmVkIGZvY3VzIGlmIGl0IGlzIGxvY2F0ZWRcbiAgICAgICAgLy8gaW5zaWRlIGEgc2hhZG93IHJvb3QuXG4gICAgICAgIGlmIChjb250YWlucygoX2RhdGFSZWYkY3VycmVudCRmbG9hID0gZGF0YVJlZi5jdXJyZW50LmZsb2F0aW5nQ29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhUmVmJGN1cnJlbnQkZmxvYS5yZWZzLmZsb2F0aW5nLmN1cnJlbnQsIGFjdGl2ZUVsKSB8fCBjb250YWlucyhlbGVtZW50cy5kb21SZWZlcmVuY2UsIGFjdGl2ZUVsKSB8fCBtb3ZlZFRvRm9jdXNHdWFyZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvbk9wZW5DaGFuZ2UoZmFsc2UsIG5hdGl2ZUV2ZW50LCAnZm9jdXMnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIFtkYXRhUmVmLCBlbGVtZW50cy5kb21SZWZlcmVuY2UsIG9uT3BlbkNoYW5nZSwgdmlzaWJsZU9ubHldKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2VcbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlXSk7XG59XG5cbmNvbnN0IEFDVElWRV9LRVkgPSAnYWN0aXZlJztcbmNvbnN0IFNFTEVDVEVEX0tFWSA9ICdzZWxlY3RlZCc7XG5mdW5jdGlvbiBtZXJnZVByb3BzKHVzZXJQcm9wcywgcHJvcHNMaXN0LCBlbGVtZW50S2V5KSB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaXNJdGVtID0gZWxlbWVudEtleSA9PT0gJ2l0ZW0nO1xuICBsZXQgZG9tVXNlclByb3BzID0gdXNlclByb3BzO1xuICBpZiAoaXNJdGVtICYmIHVzZXJQcm9wcykge1xuICAgIGNvbnN0IHtcbiAgICAgIFtBQ1RJVkVfS0VZXTogXyxcbiAgICAgIFtTRUxFQ1RFRF9LRVldOiBfXyxcbiAgICAgIC4uLnZhbGlkUHJvcHNcbiAgICB9ID0gdXNlclByb3BzO1xuICAgIGRvbVVzZXJQcm9wcyA9IHZhbGlkUHJvcHM7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi4oZWxlbWVudEtleSA9PT0gJ2Zsb2F0aW5nJyAmJiB7XG4gICAgICB0YWJJbmRleDogLTFcbiAgICB9KSxcbiAgICAuLi5kb21Vc2VyUHJvcHMsXG4gICAgLi4ucHJvcHNMaXN0Lm1hcCh2YWx1ZSA9PiB7XG4gICAgICBjb25zdCBwcm9wc09yR2V0UHJvcHMgPSB2YWx1ZSA/IHZhbHVlW2VsZW1lbnRLZXldIDogbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHNPckdldFByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB1c2VyUHJvcHMgPyBwcm9wc09yR2V0UHJvcHModXNlclByb3BzKSA6IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHNPckdldFByb3BzO1xuICAgIH0pLmNvbmNhdCh1c2VyUHJvcHMpLnJlZHVjZSgoYWNjLCBwcm9wcykgPT4ge1xuICAgICAgaWYgKCFwcm9wcykge1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmVudHJpZXMocHJvcHMpLmZvckVhY2goX3JlZiA9PiB7XG4gICAgICAgIGxldCBba2V5LCB2YWx1ZV0gPSBfcmVmO1xuICAgICAgICBpZiAoaXNJdGVtICYmIFtBQ1RJVkVfS0VZLCBTRUxFQ1RFRF9LRVldLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleS5pbmRleE9mKCdvbicpID09PSAwKSB7XG4gICAgICAgICAgaWYgKCFtYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIG1hcC5zZXQoa2V5LCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBfbWFwJGdldDtcbiAgICAgICAgICAgIChfbWFwJGdldCA9IG1hcC5nZXQoa2V5KSkgPT0gbnVsbCB8fCBfbWFwJGdldC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGFjY1trZXldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2YXIgX21hcCRnZXQyO1xuICAgICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAoX21hcCRnZXQyID0gbWFwLmdldChrZXkpKSA9PSBudWxsID8gdm9pZCAwIDogX21hcCRnZXQyLm1hcChmbiA9PiBmbiguLi5hcmdzKSkuZmluZCh2YWwgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KVxuICB9O1xufVxuLyoqXG4gKiBNZXJnZXMgYW4gYXJyYXkgb2YgaW50ZXJhY3Rpb24gaG9va3MnIHByb3BzIGludG8gcHJvcCBnZXR0ZXJzLCBhbGxvd2luZ1xuICogZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMgdG8gYmUgY29tcG9zZWQgdG9nZXRoZXIgd2l0aG91dCBvdmVyd3JpdGluZyBvbmVcbiAqIGFub3RoZXIuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlSW50ZXJhY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHVzZUludGVyYWN0aW9ucyhwcm9wc0xpc3QpIHtcbiAgaWYgKHByb3BzTGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgcHJvcHNMaXN0ID0gW107XG4gIH1cbiAgY29uc3QgcmVmZXJlbmNlRGVwcyA9IHByb3BzTGlzdC5tYXAoa2V5ID0+IGtleSA9PSBudWxsID8gdm9pZCAwIDoga2V5LnJlZmVyZW5jZSk7XG4gIGNvbnN0IGZsb2F0aW5nRGVwcyA9IHByb3BzTGlzdC5tYXAoa2V5ID0+IGtleSA9PSBudWxsID8gdm9pZCAwIDoga2V5LmZsb2F0aW5nKTtcbiAgY29uc3QgaXRlbURlcHMgPSBwcm9wc0xpc3QubWFwKGtleSA9PiBrZXkgPT0gbnVsbCA/IHZvaWQgMCA6IGtleS5pdGVtKTtcbiAgY29uc3QgZ2V0UmVmZXJlbmNlUHJvcHMgPSBSZWFjdC51c2VDYWxsYmFjayh1c2VyUHJvcHMgPT4gbWVyZ2VQcm9wcyh1c2VyUHJvcHMsIHByb3BzTGlzdCwgJ3JlZmVyZW5jZScpLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIHJlZmVyZW5jZURlcHMpO1xuICBjb25zdCBnZXRGbG9hdGluZ1Byb3BzID0gUmVhY3QudXNlQ2FsbGJhY2sodXNlclByb3BzID0+IG1lcmdlUHJvcHModXNlclByb3BzLCBwcm9wc0xpc3QsICdmbG9hdGluZycpLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIGZsb2F0aW5nRGVwcyk7XG4gIGNvbnN0IGdldEl0ZW1Qcm9wcyA9IFJlYWN0LnVzZUNhbGxiYWNrKHVzZXJQcm9wcyA9PiBtZXJnZVByb3BzKHVzZXJQcm9wcywgcHJvcHNMaXN0LCAnaXRlbScpLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIGl0ZW1EZXBzKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBnZXRSZWZlcmVuY2VQcm9wcyxcbiAgICBnZXRGbG9hdGluZ1Byb3BzLFxuICAgIGdldEl0ZW1Qcm9wc1xuICB9KSwgW2dldFJlZmVyZW5jZVByb3BzLCBnZXRGbG9hdGluZ1Byb3BzLCBnZXRJdGVtUHJvcHNdKTtcbn1cblxubGV0IGlzUHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IGZhbHNlO1xuZnVuY3Rpb24gZG9Td2l0Y2gob3JpZW50YXRpb24sIHZlcnRpY2FsLCBob3Jpem9udGFsKSB7XG4gIHN3aXRjaCAob3JpZW50YXRpb24pIHtcbiAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICByZXR1cm4gdmVydGljYWw7XG4gICAgY2FzZSAnaG9yaXpvbnRhbCc6XG4gICAgICByZXR1cm4gaG9yaXpvbnRhbDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHZlcnRpY2FsIHx8IGhvcml6b250YWw7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzTWFpbk9yaWVudGF0aW9uS2V5KGtleSwgb3JpZW50YXRpb24pIHtcbiAgY29uc3QgdmVydGljYWwgPSBrZXkgPT09IEFSUk9XX1VQIHx8IGtleSA9PT0gQVJST1dfRE9XTjtcbiAgY29uc3QgaG9yaXpvbnRhbCA9IGtleSA9PT0gQVJST1dfTEVGVCB8fCBrZXkgPT09IEFSUk9XX1JJR0hUO1xuICByZXR1cm4gZG9Td2l0Y2gob3JpZW50YXRpb24sIHZlcnRpY2FsLCBob3Jpem9udGFsKTtcbn1cbmZ1bmN0aW9uIGlzTWFpbk9yaWVudGF0aW9uVG9FbmRLZXkoa2V5LCBvcmllbnRhdGlvbiwgcnRsKSB7XG4gIGNvbnN0IHZlcnRpY2FsID0ga2V5ID09PSBBUlJPV19ET1dOO1xuICBjb25zdCBob3Jpem9udGFsID0gcnRsID8ga2V5ID09PSBBUlJPV19MRUZUIDoga2V5ID09PSBBUlJPV19SSUdIVDtcbiAgcmV0dXJuIGRvU3dpdGNoKG9yaWVudGF0aW9uLCB2ZXJ0aWNhbCwgaG9yaXpvbnRhbCkgfHwga2V5ID09PSAnRW50ZXInIHx8IGtleSA9PT0gJyAnIHx8IGtleSA9PT0gJyc7XG59XG5mdW5jdGlvbiBpc0Nyb3NzT3JpZW50YXRpb25PcGVuS2V5KGtleSwgb3JpZW50YXRpb24sIHJ0bCkge1xuICBjb25zdCB2ZXJ0aWNhbCA9IHJ0bCA/IGtleSA9PT0gQVJST1dfTEVGVCA6IGtleSA9PT0gQVJST1dfUklHSFQ7XG4gIGNvbnN0IGhvcml6b250YWwgPSBrZXkgPT09IEFSUk9XX0RPV047XG4gIHJldHVybiBkb1N3aXRjaChvcmllbnRhdGlvbiwgdmVydGljYWwsIGhvcml6b250YWwpO1xufVxuZnVuY3Rpb24gaXNDcm9zc09yaWVudGF0aW9uQ2xvc2VLZXkoa2V5LCBvcmllbnRhdGlvbiwgcnRsKSB7XG4gIGNvbnN0IHZlcnRpY2FsID0gcnRsID8ga2V5ID09PSBBUlJPV19SSUdIVCA6IGtleSA9PT0gQVJST1dfTEVGVDtcbiAgY29uc3QgaG9yaXpvbnRhbCA9IGtleSA9PT0gQVJST1dfVVA7XG4gIHJldHVybiBkb1N3aXRjaChvcmllbnRhdGlvbiwgdmVydGljYWwsIGhvcml6b250YWwpO1xufVxuLyoqXG4gKiBBZGRzIGFycm93IGtleS1iYXNlZCBuYXZpZ2F0aW9uIG9mIGEgbGlzdCBvZiBpdGVtcywgZWl0aGVyIHVzaW5nIHJlYWwgRE9NXG4gKiBmb2N1cyBvciB2aXJ0dWFsIGZvY3VzLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUxpc3ROYXZpZ2F0aW9uXG4gKi9cbmZ1bmN0aW9uIHVzZUxpc3ROYXZpZ2F0aW9uKGNvbnRleHQsIHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIG9uT3BlbkNoYW5nZSxcbiAgICBlbGVtZW50c1xuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGxpc3RSZWYsXG4gICAgYWN0aXZlSW5kZXgsXG4gICAgb25OYXZpZ2F0ZTogdW5zdGFibGVfb25OYXZpZ2F0ZSA9ICgpID0+IHt9LFxuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIHNlbGVjdGVkSW5kZXggPSBudWxsLFxuICAgIGFsbG93RXNjYXBlID0gZmFsc2UsXG4gICAgbG9vcCA9IGZhbHNlLFxuICAgIG5lc3RlZCA9IGZhbHNlLFxuICAgIHJ0bCA9IGZhbHNlLFxuICAgIHZpcnR1YWwgPSBmYWxzZSxcbiAgICBmb2N1c0l0ZW1Pbk9wZW4gPSAnYXV0bycsXG4gICAgZm9jdXNJdGVtT25Ib3ZlciA9IHRydWUsXG4gICAgb3Blbk9uQXJyb3dLZXlEb3duID0gdHJ1ZSxcbiAgICBkaXNhYmxlZEluZGljZXMgPSB1bmRlZmluZWQsXG4gICAgb3JpZW50YXRpb24gPSAndmVydGljYWwnLFxuICAgIGNvbHMgPSAxLFxuICAgIHNjcm9sbEl0ZW1JbnRvVmlldyA9IHRydWUsXG4gICAgdmlydHVhbEl0ZW1SZWYsXG4gICAgaXRlbVNpemVzLFxuICAgIGRlbnNlID0gZmFsc2VcbiAgfSA9IHByb3BzO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKGFsbG93RXNjYXBlKSB7XG4gICAgICBpZiAoIWxvb3ApIHtcbiAgICAgICAgd2FybignYHVzZUxpc3ROYXZpZ2F0aW9uYCBsb29waW5nIG11c3QgYmUgZW5hYmxlZCB0byBhbGxvdyBlc2NhcGluZy4nKTtcbiAgICAgIH1cbiAgICAgIGlmICghdmlydHVhbCkge1xuICAgICAgICB3YXJuKCdgdXNlTGlzdE5hdmlnYXRpb25gIG11c3QgYmUgdmlydHVhbCB0byBhbGxvdyBlc2NhcGluZy4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9yaWVudGF0aW9uID09PSAndmVydGljYWwnICYmIGNvbHMgPiAxKSB7XG4gICAgICB3YXJuKCdJbiBncmlkIGxpc3QgbmF2aWdhdGlvbiBtb2RlIChgY29sc2AgPiAxKSwgdGhlIGBvcmllbnRhdGlvbmAgc2hvdWxkJywgJ2JlIGVpdGhlciBcImhvcml6b250YWxcIiBvciBcImJvdGhcIi4nKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGFyZW50SWQgPSB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCgpO1xuICBjb25zdCB0cmVlID0gdXNlRmxvYXRpbmdUcmVlKCk7XG4gIGNvbnN0IG9uTmF2aWdhdGUgPSB1c2VFZmZlY3RFdmVudCh1bnN0YWJsZV9vbk5hdmlnYXRlKTtcbiAgY29uc3QgZm9jdXNJdGVtT25PcGVuUmVmID0gUmVhY3QudXNlUmVmKGZvY3VzSXRlbU9uT3Blbik7XG4gIGNvbnN0IGluZGV4UmVmID0gUmVhY3QudXNlUmVmKHNlbGVjdGVkSW5kZXggIT0gbnVsbCA/IHNlbGVjdGVkSW5kZXggOiAtMSk7XG4gIGNvbnN0IGtleVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgaXNQb2ludGVyTW9kYWxpdHlSZWYgPSBSZWFjdC51c2VSZWYodHJ1ZSk7XG4gIGNvbnN0IHByZXZpb3VzT25OYXZpZ2F0ZVJlZiA9IFJlYWN0LnVzZVJlZihvbk5hdmlnYXRlKTtcbiAgY29uc3QgcHJldmlvdXNNb3VudGVkUmVmID0gUmVhY3QudXNlUmVmKCEhZWxlbWVudHMuZmxvYXRpbmcpO1xuICBjb25zdCBwcmV2aW91c09wZW5SZWYgPSBSZWFjdC51c2VSZWYob3Blbik7XG4gIGNvbnN0IGZvcmNlU3luY0ZvY3VzID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgZm9yY2VTY3JvbGxJbnRvVmlld1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGRpc2FibGVkSW5kaWNlc1JlZiA9IHVzZUxhdGVzdFJlZihkaXNhYmxlZEluZGljZXMpO1xuICBjb25zdCBsYXRlc3RPcGVuUmVmID0gdXNlTGF0ZXN0UmVmKG9wZW4pO1xuICBjb25zdCBzY3JvbGxJdGVtSW50b1ZpZXdSZWYgPSB1c2VMYXRlc3RSZWYoc2Nyb2xsSXRlbUludG9WaWV3KTtcbiAgY29uc3QgZmxvYXRpbmdSZWYgPSB1c2VMYXRlc3RSZWYoZWxlbWVudHMuZmxvYXRpbmcpO1xuICBjb25zdCBzZWxlY3RlZEluZGV4UmVmID0gdXNlTGF0ZXN0UmVmKHNlbGVjdGVkSW5kZXgpO1xuICBjb25zdCBbYWN0aXZlSWQsIHNldEFjdGl2ZUlkXSA9IFJlYWN0LnVzZVN0YXRlKCk7XG4gIGNvbnN0IFt2aXJ0dWFsSWQsIHNldFZpcnR1YWxJZF0gPSBSZWFjdC51c2VTdGF0ZSgpO1xuICBjb25zdCBmb2N1c0l0ZW0gPSB1c2VFZmZlY3RFdmVudChmdW5jdGlvbiAobGlzdFJlZiwgaW5kZXhSZWYsIGZvcmNlU2Nyb2xsSW50b1ZpZXcpIHtcbiAgICBpZiAoZm9yY2VTY3JvbGxJbnRvVmlldyA9PT0gdm9pZCAwKSB7XG4gICAgICBmb3JjZVNjcm9sbEludG9WaWV3ID0gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJ1bkZvY3VzKGl0ZW0pIHtcbiAgICAgIGlmICh2aXJ0dWFsKSB7XG4gICAgICAgIHNldEFjdGl2ZUlkKGl0ZW0uaWQpO1xuICAgICAgICB0cmVlID09IG51bGwgfHwgdHJlZS5ldmVudHMuZW1pdCgndmlydHVhbGZvY3VzJywgaXRlbSk7XG4gICAgICAgIGlmICh2aXJ0dWFsSXRlbVJlZikge1xuICAgICAgICAgIHZpcnR1YWxJdGVtUmVmLmN1cnJlbnQgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnF1ZXVlRm9jdXMoaXRlbSwge1xuICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWUsXG4gICAgICAgICAgLy8gTWFjIFNhZmFyaSBkb2VzIG5vdCBtb3ZlIHRoZSB2aXJ0dWFsIGN1cnNvciB1bmxlc3MgdGhlIGZvY3VzIGNhbGxcbiAgICAgICAgICAvLyBpcyBzeW5jLiBIb3dldmVyLCBmb3IgdGhlIHZlcnkgZmlyc3QgZm9jdXMgY2FsbCwgd2UgbmVlZCB0byB3YWl0XG4gICAgICAgICAgLy8gZm9yIHRoZSBwb3NpdGlvbiB0byBiZSByZWFkeSBpbiBvcmRlciB0byBwcmV2ZW50IHVud2FudGVkXG4gICAgICAgICAgLy8gc2Nyb2xsaW5nLiBUaGlzIG1lYW5zIHRoZSB2aXJ0dWFsIGN1cnNvciB3aWxsIG5vdCBtb3ZlIHRvIHRoZSBmaXJzdFxuICAgICAgICAgIC8vIGl0ZW0gd2hlbiBmaXJzdCBvcGVuaW5nIHRoZSBmbG9hdGluZyBlbGVtZW50LCBidXQgd2lsbCBvblxuICAgICAgICAgIC8vIHN1YnNlcXVlbnQgY2FsbHMuIGBwcmV2ZW50U2Nyb2xsYCBpcyBzdXBwb3J0ZWQgaW4gbW9kZXJuIFNhZmFyaSxcbiAgICAgICAgICAvLyBzbyB3ZSBjYW4gdXNlIHRoYXQgaW5zdGVhZC5cbiAgICAgICAgICAvLyBpT1MgU2FmYXJpIG11c3QgYmUgYXN5bmMgb3IgdGhlIGZpcnN0IGl0ZW0gd2lsbCBub3QgYmUgZm9jdXNlZC5cbiAgICAgICAgICBzeW5jOiBpc01hYygpICYmIGlzU2FmYXJpKCkgPyBpc1ByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgfHwgZm9yY2VTeW5jRm9jdXMuY3VycmVudCA6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbml0aWFsSXRlbSA9IGxpc3RSZWYuY3VycmVudFtpbmRleFJlZi5jdXJyZW50XTtcbiAgICBpZiAoaW5pdGlhbEl0ZW0pIHtcbiAgICAgIHJ1bkZvY3VzKGluaXRpYWxJdGVtKTtcbiAgICB9XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGNvbnN0IHdhaXRlZEl0ZW0gPSBsaXN0UmVmLmN1cnJlbnRbaW5kZXhSZWYuY3VycmVudF0gfHwgaW5pdGlhbEl0ZW07XG4gICAgICBpZiAoIXdhaXRlZEl0ZW0pIHJldHVybjtcbiAgICAgIGlmICghaW5pdGlhbEl0ZW0pIHtcbiAgICAgICAgcnVuRm9jdXMod2FpdGVkSXRlbSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JvbGxJbnRvVmlld09wdGlvbnMgPSBzY3JvbGxJdGVtSW50b1ZpZXdSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHNob3VsZFNjcm9sbEludG9WaWV3ID0gc2Nyb2xsSW50b1ZpZXdPcHRpb25zICYmIGl0ZW0gJiYgKGZvcmNlU2Nyb2xsSW50b1ZpZXcgfHwgIWlzUG9pbnRlck1vZGFsaXR5UmVmLmN1cnJlbnQpO1xuICAgICAgaWYgKHNob3VsZFNjcm9sbEludG9WaWV3KSB7XG4gICAgICAgIC8vIEpTRE9NIGRvZXNuJ3Qgc3VwcG9ydCBgLnNjcm9sbEludG9WaWV3KClgIGJ1dCBpdCdzIHdpZGVseSBzdXBwb3J0ZWRcbiAgICAgICAgLy8gYnkgYWxsIGJyb3dzZXJzLlxuICAgICAgICB3YWl0ZWRJdGVtLnNjcm9sbEludG9WaWV3ID09IG51bGwgfHwgd2FpdGVkSXRlbS5zY3JvbGxJbnRvVmlldyh0eXBlb2Ygc2Nyb2xsSW50b1ZpZXdPcHRpb25zID09PSAnYm9vbGVhbicgPyB7XG4gICAgICAgICAgYmxvY2s6ICduZWFyZXN0JyxcbiAgICAgICAgICBpbmxpbmU6ICduZWFyZXN0J1xuICAgICAgICB9IDogc2Nyb2xsSW50b1ZpZXdPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5mb2N1cyh7XG4gICAgICBnZXQgcHJldmVudFNjcm9sbCgpIHtcbiAgICAgICAgaXNQcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbXSk7XG5cbiAgLy8gU3luYyBgc2VsZWN0ZWRJbmRleGAgdG8gYmUgdGhlIGBhY3RpdmVJbmRleGAgdXBvbiBvcGVuaW5nIHRoZSBmbG9hdGluZ1xuICAvLyBlbGVtZW50LiBBbHNvLCByZXNldCBgYWN0aXZlSW5kZXhgIHVwb24gY2xvc2luZyB0aGUgZmxvYXRpbmcgZWxlbWVudC5cbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGlmIChvcGVuICYmIGVsZW1lbnRzLmZsb2F0aW5nKSB7XG4gICAgICBpZiAoZm9jdXNJdGVtT25PcGVuUmVmLmN1cnJlbnQgJiYgc2VsZWN0ZWRJbmRleCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFJlZ2FyZGxlc3Mgb2YgdGhlIHBvaW50ZXIgbW9kYWxpdHksIHdlIHdhbnQgdG8gZW5zdXJlIHRoZSBzZWxlY3RlZFxuICAgICAgICAvLyBpdGVtIGNvbWVzIGludG8gdmlldyB3aGVuIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzIG9wZW5lZC5cbiAgICAgICAgZm9yY2VTY3JvbGxJbnRvVmlld1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IHNlbGVjdGVkSW5kZXg7XG4gICAgICAgIG9uTmF2aWdhdGUoc2VsZWN0ZWRJbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcmV2aW91c01vdW50ZWRSZWYuY3VycmVudCkge1xuICAgICAgLy8gU2luY2UgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYG9uTmF2aWdhdGVgIGNvbmRpdGlvbmFsbHlcbiAgICAgIC8vIChvbk5hdmlnYXRlOiBvcGVuID8gc2V0QWN0aXZlSW5kZXggOiBzZXRTZWxlY3RlZEluZGV4KSxcbiAgICAgIC8vIHdlIHN0b3JlIGFuZCBjYWxsIHRoZSBwcmV2aW91cyBmdW5jdGlvbi5cbiAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICAgIHByZXZpb3VzT25OYXZpZ2F0ZVJlZi5jdXJyZW50KG51bGwpO1xuICAgIH1cbiAgfSwgW2VuYWJsZWQsIG9wZW4sIGVsZW1lbnRzLmZsb2F0aW5nLCBzZWxlY3RlZEluZGV4LCBvbk5hdmlnYXRlXSk7XG5cbiAgLy8gU3luYyBgYWN0aXZlSW5kZXhgIHRvIGJlIHRoZSBmb2N1c2VkIGl0ZW0gd2hpbGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaXNcbiAgLy8gb3Blbi5cbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGlmIChvcGVuICYmIGVsZW1lbnRzLmZsb2F0aW5nKSB7XG4gICAgICBpZiAoYWN0aXZlSW5kZXggPT0gbnVsbCkge1xuICAgICAgICBmb3JjZVN5bmNGb2N1cy5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIGlmIChzZWxlY3RlZEluZGV4UmVmLmN1cnJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHdoaWxlIHRoZSBmbG9hdGluZyBlbGVtZW50IHdhcyBvcGVuIChlLmcuIHRoZSBsaXN0IGNoYW5nZWQpLlxuICAgICAgICBpZiAocHJldmlvdXNNb3VudGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gLTE7XG4gICAgICAgICAgZm9jdXNJdGVtKGxpc3RSZWYsIGluZGV4UmVmKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWwgc3luYy5cbiAgICAgICAgaWYgKCghcHJldmlvdXNPcGVuUmVmLmN1cnJlbnQgfHwgIXByZXZpb3VzTW91bnRlZFJlZi5jdXJyZW50KSAmJiBmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCAmJiAoa2V5UmVmLmN1cnJlbnQgIT0gbnVsbCB8fCBmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCA9PT0gdHJ1ZSAmJiBrZXlSZWYuY3VycmVudCA9PSBudWxsKSkge1xuICAgICAgICAgIGxldCBydW5zID0gMDtcbiAgICAgICAgICBjb25zdCB3YWl0Rm9yTGlzdFBvcHVsYXRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChsaXN0UmVmLmN1cnJlbnRbMF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBBdm9pZCBsZXR0aW5nIHRoZSBicm93c2VyIHBhaW50IGlmIHBvc3NpYmxlIG9uIHRoZSBmaXJzdCB0cnksXG4gICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgckFGLiBEb24ndCB0cnkgbW9yZSB0aGFuIHR3aWNlLCBzaW5jZSBzb21ldGhpbmdcbiAgICAgICAgICAgICAgLy8gaXMgd3Jvbmcgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgICBpZiAocnVucyA8IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlZHVsZXIgPSBydW5zID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIDogcXVldWVNaWNyb3Rhc2s7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVyKHdhaXRGb3JMaXN0UG9wdWxhdGVkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBydW5zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0ga2V5UmVmLmN1cnJlbnQgPT0gbnVsbCB8fCBpc01haW5PcmllbnRhdGlvblRvRW5kS2V5KGtleVJlZi5jdXJyZW50LCBvcmllbnRhdGlvbiwgcnRsKSB8fCBuZXN0ZWQgPyBnZXRNaW5JbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXNSZWYuY3VycmVudCkgOiBnZXRNYXhJbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXNSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgIGtleVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgb25OYXZpZ2F0ZShpbmRleFJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHdhaXRGb3JMaXN0UG9wdWxhdGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzSW5kZXhPdXRPZkJvdW5kcyhsaXN0UmVmLCBhY3RpdmVJbmRleCkpIHtcbiAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGFjdGl2ZUluZGV4O1xuICAgICAgICBmb2N1c0l0ZW0obGlzdFJlZiwgaW5kZXhSZWYsIGZvcmNlU2Nyb2xsSW50b1ZpZXdSZWYuY3VycmVudCk7XG4gICAgICAgIGZvcmNlU2Nyb2xsSW50b1ZpZXdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2VuYWJsZWQsIG9wZW4sIGVsZW1lbnRzLmZsb2F0aW5nLCBhY3RpdmVJbmRleCwgc2VsZWN0ZWRJbmRleFJlZiwgbmVzdGVkLCBsaXN0UmVmLCBvcmllbnRhdGlvbiwgcnRsLCBvbk5hdmlnYXRlLCBmb2N1c0l0ZW0sIGRpc2FibGVkSW5kaWNlc1JlZl0pO1xuXG4gIC8vIEVuc3VyZSB0aGUgcGFyZW50IGZsb2F0aW5nIGVsZW1lbnQgaGFzIGZvY3VzIHdoZW4gYSBuZXN0ZWQgY2hpbGQgY2xvc2VzXG4gIC8vIHRvIGFsbG93IGFycm93IGtleSBuYXZpZ2F0aW9uIHRvIHdvcmsgYWZ0ZXIgdGhlIHBvaW50ZXIgbGVhdmVzIHRoZSBjaGlsZC5cbiAgaW5kZXgoKCkgPT4ge1xuICAgIHZhciBfbm9kZXMkZmluZDtcbiAgICBpZiAoIWVuYWJsZWQgfHwgZWxlbWVudHMuZmxvYXRpbmcgfHwgIXRyZWUgfHwgdmlydHVhbCB8fCAhcHJldmlvdXNNb3VudGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZXMgPSB0cmVlLm5vZGVzUmVmLmN1cnJlbnQ7XG4gICAgY29uc3QgcGFyZW50ID0gKF9ub2RlcyRmaW5kID0gbm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT09IHBhcmVudElkKSkgPT0gbnVsbCB8fCAoX25vZGVzJGZpbmQgPSBfbm9kZXMkZmluZC5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX25vZGVzJGZpbmQuZWxlbWVudHMuZmxvYXRpbmc7XG4gICAgY29uc3QgYWN0aXZlRWwgPSBhY3RpdmVFbGVtZW50KGdldERvY3VtZW50KGVsZW1lbnRzLmZsb2F0aW5nKSk7XG4gICAgY29uc3QgdHJlZUNvbnRhaW5zQWN0aXZlRWwgPSBub2Rlcy5zb21lKG5vZGUgPT4gbm9kZS5jb250ZXh0ICYmIGNvbnRhaW5zKG5vZGUuY29udGV4dC5lbGVtZW50cy5mbG9hdGluZywgYWN0aXZlRWwpKTtcbiAgICBpZiAocGFyZW50ICYmICF0cmVlQ29udGFpbnNBY3RpdmVFbCAmJiBpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50KSB7XG4gICAgICBwYXJlbnQuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtlbmFibGVkLCBlbGVtZW50cy5mbG9hdGluZywgdHJlZSwgcGFyZW50SWQsIHZpcnR1YWxdKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICAgIGlmICghdHJlZSkgcmV0dXJuO1xuICAgIGlmICghdmlydHVhbCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnRJZCkgcmV0dXJuO1xuICAgIGZ1bmN0aW9uIGhhbmRsZVZpcnR1YWxGb2N1cyhpdGVtKSB7XG4gICAgICBzZXRWaXJ0dWFsSWQoaXRlbS5pZCk7XG4gICAgICBpZiAodmlydHVhbEl0ZW1SZWYpIHtcbiAgICAgICAgdmlydHVhbEl0ZW1SZWYuY3VycmVudCA9IGl0ZW07XG4gICAgICB9XG4gICAgfVxuICAgIHRyZWUuZXZlbnRzLm9uKCd2aXJ0dWFsZm9jdXMnLCBoYW5kbGVWaXJ0dWFsRm9jdXMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0cmVlLmV2ZW50cy5vZmYoJ3ZpcnR1YWxmb2N1cycsIGhhbmRsZVZpcnR1YWxGb2N1cyk7XG4gICAgfTtcbiAgfSwgW2VuYWJsZWQsIHRyZWUsIHZpcnR1YWwsIHBhcmVudElkLCB2aXJ0dWFsSXRlbVJlZl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgcHJldmlvdXNPbk5hdmlnYXRlUmVmLmN1cnJlbnQgPSBvbk5hdmlnYXRlO1xuICAgIHByZXZpb3VzTW91bnRlZFJlZi5jdXJyZW50ID0gISFlbGVtZW50cy5mbG9hdGluZztcbiAgfSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAoIW9wZW4pIHtcbiAgICAgIGtleVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH0sIFtvcGVuXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBwcmV2aW91c09wZW5SZWYuY3VycmVudCA9IG9wZW47XG4gIH0sIFtvcGVuXSk7XG4gIGNvbnN0IGhhc0FjdGl2ZUluZGV4ID0gYWN0aXZlSW5kZXggIT0gbnVsbDtcbiAgY29uc3QgaXRlbSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHN5bmNDdXJyZW50VGFyZ2V0KGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIGlmICghb3BlbikgcmV0dXJuO1xuICAgICAgY29uc3QgaW5kZXggPSBsaXN0UmVmLmN1cnJlbnQuaW5kZXhPZihjdXJyZW50VGFyZ2V0KTtcbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgb25OYXZpZ2F0ZShpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgb25Gb2N1cyhfcmVmKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgY3VycmVudFRhcmdldFxuICAgICAgICB9ID0gX3JlZjtcbiAgICAgICAgc3luY0N1cnJlbnRUYXJnZXQoY3VycmVudFRhcmdldCk7XG4gICAgICB9LFxuICAgICAgb25DbGljazogX3JlZjIgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGN1cnJlbnRUYXJnZXRcbiAgICAgICAgfSA9IF9yZWYyO1xuICAgICAgICByZXR1cm4gY3VycmVudFRhcmdldC5mb2N1cyh7XG4gICAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyBTYWZhcmlcbiAgICAgIC4uLihmb2N1c0l0ZW1PbkhvdmVyICYmIHtcbiAgICAgICAgb25Nb3VzZU1vdmUoX3JlZjMpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgY3VycmVudFRhcmdldFxuICAgICAgICAgIH0gPSBfcmVmMztcbiAgICAgICAgICBzeW5jQ3VycmVudFRhcmdldChjdXJyZW50VGFyZ2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Qb2ludGVyTGVhdmUoX3JlZjQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgcG9pbnRlclR5cGVcbiAgICAgICAgICB9ID0gX3JlZjQ7XG4gICAgICAgICAgaWYgKCFpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50IHx8IHBvaW50ZXJUeXBlID09PSAndG91Y2gnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSAtMTtcbiAgICAgICAgICBmb2N1c0l0ZW0obGlzdFJlZiwgaW5kZXhSZWYpO1xuICAgICAgICAgIG9uTmF2aWdhdGUobnVsbCk7XG4gICAgICAgICAgaWYgKCF2aXJ0dWFsKSB7XG4gICAgICAgICAgICBlbnF1ZXVlRm9jdXMoZmxvYXRpbmdSZWYuY3VycmVudCwge1xuICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gcHJvcHM7XG4gIH0sIFtvcGVuLCBmbG9hdGluZ1JlZiwgZm9jdXNJdGVtLCBmb2N1c0l0ZW1PbkhvdmVyLCBsaXN0UmVmLCBvbk5hdmlnYXRlLCB2aXJ0dWFsXSk7XG4gIGNvbnN0IGNvbW1vbk9uS2V5RG93biA9IHVzZUVmZmVjdEV2ZW50KGV2ZW50ID0+IHtcbiAgICBpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgZm9yY2VTeW5jRm9jdXMuY3VycmVudCA9IHRydWU7XG5cbiAgICAvLyBJZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBpcyBhbmltYXRpbmcgb3V0LCBpZ25vcmUgbmF2aWdhdGlvbi4gT3RoZXJ3aXNlLFxuICAgIC8vIHRoZSBgYWN0aXZlSW5kZXhgIGdldHMgc2V0IHRvIDAgZGVzcGl0ZSBub3QgYmVpbmcgb3BlbiBzbyB0aGUgbmV4dCB0aW1lXG4gICAgLy8gdGhlIHVzZXIgQXJyb3dEb3ducywgdGhlIGZpcnN0IGl0ZW0gd29uJ3QgYmUgZm9jdXNlZC5cbiAgICBpZiAoIWxhdGVzdE9wZW5SZWYuY3VycmVudCAmJiBldmVudC5jdXJyZW50VGFyZ2V0ID09PSBmbG9hdGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuZXN0ZWQgJiYgaXNDcm9zc09yaWVudGF0aW9uQ2xvc2VLZXkoZXZlbnQua2V5LCBvcmllbnRhdGlvbiwgcnRsKSkge1xuICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSwgZXZlbnQubmF0aXZlRXZlbnQsICdsaXN0LW5hdmlnYXRpb24nKTtcbiAgICAgIGlmIChpc0hUTUxFbGVtZW50KGVsZW1lbnRzLmRvbVJlZmVyZW5jZSkgJiYgIXZpcnR1YWwpIHtcbiAgICAgICAgZWxlbWVudHMuZG9tUmVmZXJlbmNlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGluZGV4UmVmLmN1cnJlbnQ7XG4gICAgY29uc3QgbWluSW5kZXggPSBnZXRNaW5JbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXMpO1xuICAgIGNvbnN0IG1heEluZGV4ID0gZ2V0TWF4SW5kZXgobGlzdFJlZiwgZGlzYWJsZWRJbmRpY2VzKTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnSG9tZScpIHtcbiAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICBpbmRleFJlZi5jdXJyZW50ID0gbWluSW5kZXg7XG4gICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW5kJykge1xuICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBtYXhJbmRleDtcbiAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgfVxuXG4gICAgLy8gR3JpZCBuYXZpZ2F0aW9uLlxuICAgIGlmIChjb2xzID4gMSkge1xuICAgICAgY29uc3Qgc2l6ZXMgPSBpdGVtU2l6ZXMgfHwgQXJyYXkuZnJvbSh7XG4gICAgICAgIGxlbmd0aDogbGlzdFJlZi5jdXJyZW50Lmxlbmd0aFxuICAgICAgfSwgKCkgPT4gKHtcbiAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgIGhlaWdodDogMVxuICAgICAgfSkpO1xuICAgICAgLy8gVG8gY2FsY3VsYXRlIG1vdmVtZW50cyBvbiB0aGUgZ3JpZCwgd2UgdXNlIGh5cG90aGV0aWNhbCBjZWxsIGluZGljZXNcbiAgICAgIC8vIGFzIGlmIGV2ZXJ5IGl0ZW0gd2FzIDF4MSwgdGhlbiBjb252ZXJ0IGJhY2sgdG8gcmVhbCBpbmRpY2VzLlxuICAgICAgY29uc3QgY2VsbE1hcCA9IGJ1aWxkQ2VsbE1hcChzaXplcywgY29scywgZGVuc2UpO1xuICAgICAgY29uc3QgbWluR3JpZEluZGV4ID0gY2VsbE1hcC5maW5kSW5kZXgoaW5kZXggPT4gaW5kZXggIT0gbnVsbCAmJiAhaXNEaXNhYmxlZChsaXN0UmVmLmN1cnJlbnQsIGluZGV4LCBkaXNhYmxlZEluZGljZXMpKTtcbiAgICAgIC8vIGxhc3QgZW5hYmxlZCBpbmRleFxuICAgICAgY29uc3QgbWF4R3JpZEluZGV4ID0gY2VsbE1hcC5yZWR1Y2UoKGZvdW5kSW5kZXgsIGluZGV4LCBjZWxsSW5kZXgpID0+IGluZGV4ICE9IG51bGwgJiYgIWlzRGlzYWJsZWQobGlzdFJlZi5jdXJyZW50LCBpbmRleCwgZGlzYWJsZWRJbmRpY2VzKSA/IGNlbGxJbmRleCA6IGZvdW5kSW5kZXgsIC0xKTtcbiAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBjZWxsTWFwW2dldEdyaWROYXZpZ2F0ZWRJbmRleCh7XG4gICAgICAgIGN1cnJlbnQ6IGNlbGxNYXAubWFwKGl0ZW1JbmRleCA9PiBpdGVtSW5kZXggIT0gbnVsbCA/IGxpc3RSZWYuY3VycmVudFtpdGVtSW5kZXhdIDogbnVsbClcbiAgICAgIH0sIHtcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgICBsb29wLFxuICAgICAgICBjb2xzLFxuICAgICAgICAvLyB0cmVhdCB1bmRlZmluZWQgKGVtcHR5IGdyaWQgc3BhY2VzKSBhcyBkaXNhYmxlZCBpbmRpY2VzIHNvIHdlXG4gICAgICAgIC8vIGRvbid0IGVuZCB1cCBpbiB0aGVtXG4gICAgICAgIGRpc2FibGVkSW5kaWNlczogZ2V0Q2VsbEluZGljZXMoWy4uLihkaXNhYmxlZEluZGljZXMgfHwgbGlzdFJlZi5jdXJyZW50Lm1hcCgoXywgaW5kZXgpID0+IGlzRGlzYWJsZWQobGlzdFJlZi5jdXJyZW50LCBpbmRleCkgPyBpbmRleCA6IHVuZGVmaW5lZCkpLCB1bmRlZmluZWRdLCBjZWxsTWFwKSxcbiAgICAgICAgbWluSW5kZXg6IG1pbkdyaWRJbmRleCxcbiAgICAgICAgbWF4SW5kZXg6IG1heEdyaWRJbmRleCxcbiAgICAgICAgcHJldkluZGV4OiBnZXRDZWxsSW5kZXhPZkNvcm5lcihpbmRleFJlZi5jdXJyZW50ID4gbWF4SW5kZXggPyBtaW5JbmRleCA6IGluZGV4UmVmLmN1cnJlbnQsIHNpemVzLCBjZWxsTWFwLCBjb2xzLFxuICAgICAgICAvLyB1c2UgYSBjb3JuZXIgbWF0Y2hpbmcgdGhlIGVkZ2UgY2xvc2VzdCB0byB0aGUgZGlyZWN0aW9uXG4gICAgICAgIC8vIHdlJ3JlIG1vdmluZyBpbiBzbyB3ZSBkb24ndCBlbmQgdXAgaW4gdGhlIHNhbWUgaXRlbS4gUHJlZmVyXG4gICAgICAgIC8vIHRvcC9sZWZ0IG92ZXIgYm90dG9tL3JpZ2h0LlxuICAgICAgICBldmVudC5rZXkgPT09IEFSUk9XX0RPV04gPyAnYmwnIDogZXZlbnQua2V5ID09PSBBUlJPV19SSUdIVCA/ICd0cicgOiAndGwnKSxcbiAgICAgICAgc3RvcEV2ZW50OiB0cnVlXG4gICAgICB9KV07IC8vIG5hdmlnYXRlZCBjZWxsIHdpbGwgbmV2ZXIgYmUgbnVsbGlzaFxuXG4gICAgICBvbk5hdmlnYXRlKGluZGV4UmVmLmN1cnJlbnQpO1xuICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnYm90aCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNNYWluT3JpZW50YXRpb25LZXkoZXZlbnQua2V5LCBvcmllbnRhdGlvbikpIHtcbiAgICAgIHN0b3BFdmVudChldmVudCk7XG5cbiAgICAgIC8vIFJlc2V0IHRoZSBpbmRleCBpZiBubyBpdGVtIGlzIGZvY3VzZWQuXG4gICAgICBpZiAob3BlbiAmJiAhdmlydHVhbCAmJiBhY3RpdmVFbGVtZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQub3duZXJEb2N1bWVudCkgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IGlzTWFpbk9yaWVudGF0aW9uVG9FbmRLZXkoZXZlbnQua2V5LCBvcmllbnRhdGlvbiwgcnRsKSA/IG1pbkluZGV4IDogbWF4SW5kZXg7XG4gICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc01haW5PcmllbnRhdGlvblRvRW5kS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCkpIHtcbiAgICAgICAgaWYgKGxvb3ApIHtcbiAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gY3VycmVudEluZGV4ID49IG1heEluZGV4ID8gYWxsb3dFc2NhcGUgJiYgY3VycmVudEluZGV4ICE9PSBsaXN0UmVmLmN1cnJlbnQubGVuZ3RoID8gLTEgOiBtaW5JbmRleCA6IGZpbmROb25EaXNhYmxlZEluZGV4KGxpc3RSZWYsIHtcbiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgIGRpc2FibGVkSW5kaWNlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBNYXRoLm1pbihtYXhJbmRleCwgZmluZE5vbkRpc2FibGVkSW5kZXgobGlzdFJlZiwge1xuICAgICAgICAgICAgc3RhcnRpbmdJbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobG9vcCkge1xuICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBjdXJyZW50SW5kZXggPD0gbWluSW5kZXggPyBhbGxvd0VzY2FwZSAmJiBjdXJyZW50SW5kZXggIT09IC0xID8gbGlzdFJlZi5jdXJyZW50Lmxlbmd0aCA6IG1heEluZGV4IDogZmluZE5vbkRpc2FibGVkSW5kZXgobGlzdFJlZiwge1xuICAgICAgICAgICAgc3RhcnRpbmdJbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgZGVjcmVtZW50OiB0cnVlLFxuICAgICAgICAgICAgZGlzYWJsZWRJbmRpY2VzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5kZXhSZWYuY3VycmVudCA9IE1hdGgubWF4KG1pbkluZGV4LCBmaW5kTm9uRGlzYWJsZWRJbmRleChsaXN0UmVmLCB7XG4gICAgICAgICAgICBzdGFydGluZ0luZGV4OiBjdXJyZW50SW5kZXgsXG4gICAgICAgICAgICBkZWNyZW1lbnQ6IHRydWUsXG4gICAgICAgICAgICBkaXNhYmxlZEluZGljZXNcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0luZGV4T3V0T2ZCb3VuZHMobGlzdFJlZiwgaW5kZXhSZWYuY3VycmVudCkpIHtcbiAgICAgICAgb25OYXZpZ2F0ZShudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3QgYXJpYUFjdGl2ZURlc2NlbmRhbnRQcm9wID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHZpcnR1YWwgJiYgb3BlbiAmJiBoYXNBY3RpdmVJbmRleCAmJiB7XG4gICAgICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogdmlydHVhbElkIHx8IGFjdGl2ZUlkXG4gICAgfTtcbiAgfSwgW3ZpcnR1YWwsIG9wZW4sIGhhc0FjdGl2ZUluZGV4LCB2aXJ0dWFsSWQsIGFjdGl2ZUlkXSk7XG4gIGNvbnN0IGZsb2F0aW5nID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdhcmlhLW9yaWVudGF0aW9uJzogb3JpZW50YXRpb24gPT09ICdib3RoJyA/IHVuZGVmaW5lZCA6IG9yaWVudGF0aW9uLFxuICAgICAgLi4uKCFpc1R5cGVhYmxlQ29tYm9ib3goZWxlbWVudHMuZG9tUmVmZXJlbmNlKSAmJiBhcmlhQWN0aXZlRGVzY2VuZGFudFByb3ApLFxuICAgICAgb25LZXlEb3duOiBjb21tb25PbktleURvd24sXG4gICAgICBvblBvaW50ZXJNb3ZlKCkge1xuICAgICAgICBpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbYXJpYUFjdGl2ZURlc2NlbmRhbnRQcm9wLCBjb21tb25PbktleURvd24sIGVsZW1lbnRzLmRvbVJlZmVyZW5jZSwgb3JpZW50YXRpb25dKTtcbiAgY29uc3QgcmVmZXJlbmNlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgZnVuY3Rpb24gY2hlY2tWaXJ0dWFsTW91c2UoZXZlbnQpIHtcbiAgICAgIGlmIChmb2N1c0l0ZW1Pbk9wZW4gPT09ICdhdXRvJyAmJiBpc1ZpcnR1YWxDbGljayhldmVudC5uYXRpdmVFdmVudCkpIHtcbiAgICAgICAgZm9jdXNJdGVtT25PcGVuUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1ZpcnR1YWxQb2ludGVyKGV2ZW50KSB7XG4gICAgICAvLyBgcG9pbnRlcmRvd25gIGZpcmVzIGZpcnN0LCByZXNldCB0aGUgc3RhdGUgdGhlbiBwZXJmb3JtIHRoZSBjaGVja3MuXG4gICAgICBmb2N1c0l0ZW1Pbk9wZW5SZWYuY3VycmVudCA9IGZvY3VzSXRlbU9uT3BlbjtcbiAgICAgIGlmIChmb2N1c0l0ZW1Pbk9wZW4gPT09ICdhdXRvJyAmJiBpc1ZpcnR1YWxQb2ludGVyRXZlbnQoZXZlbnQubmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIGZvY3VzSXRlbU9uT3BlblJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFyaWFBY3RpdmVEZXNjZW5kYW50UHJvcCxcbiAgICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgICBpc1BvaW50ZXJNb2RhbGl0eVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzQXJyb3dLZXkgPSBldmVudC5rZXkuaW5kZXhPZignQXJyb3cnKSA9PT0gMDtcbiAgICAgICAgY29uc3QgaXNDcm9zc09wZW5LZXkgPSBpc0Nyb3NzT3JpZW50YXRpb25PcGVuS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCk7XG4gICAgICAgIGNvbnN0IGlzQ3Jvc3NDbG9zZUtleSA9IGlzQ3Jvc3NPcmllbnRhdGlvbkNsb3NlS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24sIHJ0bCk7XG4gICAgICAgIGNvbnN0IGlzTWFpbktleSA9IGlzTWFpbk9yaWVudGF0aW9uS2V5KGV2ZW50LmtleSwgb3JpZW50YXRpb24pO1xuICAgICAgICBjb25zdCBpc05hdmlnYXRpb25LZXkgPSAobmVzdGVkID8gaXNDcm9zc09wZW5LZXkgOiBpc01haW5LZXkpIHx8IGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkudHJpbSgpID09PSAnJztcbiAgICAgICAgaWYgKHZpcnR1YWwgJiYgb3Blbikge1xuICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gdHJlZSA9PSBudWxsID8gdm9pZCAwIDogdHJlZS5ub2Rlc1JlZi5jdXJyZW50LmZpbmQobm9kZSA9PiBub2RlLnBhcmVudElkID09IG51bGwpO1xuICAgICAgICAgIGNvbnN0IGRlZXBlc3ROb2RlID0gdHJlZSAmJiByb290Tm9kZSA/IGdldERlZXBlc3ROb2RlKHRyZWUubm9kZXNSZWYuY3VycmVudCwgcm9vdE5vZGUuaWQpIDogbnVsbDtcbiAgICAgICAgICBpZiAoaXNBcnJvd0tleSAmJiBkZWVwZXN0Tm9kZSAmJiB2aXJ0dWFsSXRlbVJlZikge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRPYmplY3QgPSBuZXcgS2V5Ym9hcmRFdmVudCgna2V5ZG93bicsIHtcbiAgICAgICAgICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGlzQ3Jvc3NPcGVuS2V5IHx8IGlzQ3Jvc3NDbG9zZUtleSkge1xuICAgICAgICAgICAgICB2YXIgX2RlZXBlc3ROb2RlJGNvbnRleHQsIF9kZWVwZXN0Tm9kZSRjb250ZXh0MjtcbiAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50VGFyZ2V0ID0gKChfZGVlcGVzdE5vZGUkY29udGV4dCA9IGRlZXBlc3ROb2RlLmNvbnRleHQpID09IG51bGwgPyB2b2lkIDAgOiBfZGVlcGVzdE5vZGUkY29udGV4dC5lbGVtZW50cy5kb21SZWZlcmVuY2UpID09PSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaEl0ZW0gPSBpc0Nyb3NzQ2xvc2VLZXkgJiYgIWlzQ3VycmVudFRhcmdldCA/IChfZGVlcGVzdE5vZGUkY29udGV4dDIgPSBkZWVwZXN0Tm9kZS5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogX2RlZXBlc3ROb2RlJGNvbnRleHQyLmVsZW1lbnRzLmRvbVJlZmVyZW5jZSA6IGlzQ3Jvc3NPcGVuS2V5ID8gbGlzdFJlZi5jdXJyZW50LmZpbmQoaXRlbSA9PiAoaXRlbSA9PSBudWxsID8gdm9pZCAwIDogaXRlbS5pZCkgPT09IGFjdGl2ZUlkKSA6IG51bGw7XG4gICAgICAgICAgICAgIGlmIChkaXNwYXRjaEl0ZW0pIHtcbiAgICAgICAgICAgICAgICBzdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoSXRlbS5kaXNwYXRjaEV2ZW50KGV2ZW50T2JqZWN0KTtcbiAgICAgICAgICAgICAgICBzZXRWaXJ0dWFsSWQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzTWFpbktleSAmJiBkZWVwZXN0Tm9kZS5jb250ZXh0KSB7XG4gICAgICAgICAgICAgIGlmIChkZWVwZXN0Tm9kZS5jb250ZXh0Lm9wZW4gJiYgZGVlcGVzdE5vZGUucGFyZW50SWQgJiYgZXZlbnQuY3VycmVudFRhcmdldCAhPT0gZGVlcGVzdE5vZGUuY29udGV4dC5lbGVtZW50cy5kb21SZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2RlZXBlc3ROb2RlJGNvbnRleHQkO1xuICAgICAgICAgICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICAgICAgICAgICAgKF9kZWVwZXN0Tm9kZSRjb250ZXh0JCA9IGRlZXBlc3ROb2RlLmNvbnRleHQuZWxlbWVudHMuZG9tUmVmZXJlbmNlKSA9PSBudWxsIHx8IF9kZWVwZXN0Tm9kZSRjb250ZXh0JC5kaXNwYXRjaEV2ZW50KGV2ZW50T2JqZWN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvbW1vbk9uS2V5RG93bihldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBhIGZsb2F0aW5nIGVsZW1lbnQgc2hvdWxkIG5vdCBvcGVuIG9uIGFycm93IGtleSBkb3duLCBhdm9pZFxuICAgICAgICAvLyBzZXR0aW5nIGBhY3RpdmVJbmRleGAgd2hpbGUgaXQncyBjbG9zZWQuXG4gICAgICAgIGlmICghb3BlbiAmJiAhb3Blbk9uQXJyb3dLZXlEb3duICYmIGlzQXJyb3dLZXkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmF2aWdhdGlvbktleSkge1xuICAgICAgICAgIGtleVJlZi5jdXJyZW50ID0gbmVzdGVkICYmIGlzTWFpbktleSA/IG51bGwgOiBldmVudC5rZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lc3RlZCkge1xuICAgICAgICAgIGlmIChpc0Nyb3NzT3BlbktleSkge1xuICAgICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgIGluZGV4UmVmLmN1cnJlbnQgPSBnZXRNaW5JbmRleChsaXN0UmVmLCBkaXNhYmxlZEluZGljZXNSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdsaXN0LW5hdmlnYXRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc01haW5LZXkpIHtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbmRleFJlZi5jdXJyZW50ID0gc2VsZWN0ZWRJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RvcEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICBpZiAoIW9wZW4gJiYgb3Blbk9uQXJyb3dLZXlEb3duKSB7XG4gICAgICAgICAgICBvbk9wZW5DaGFuZ2UodHJ1ZSwgZXZlbnQubmF0aXZlRXZlbnQsICdsaXN0LW5hdmlnYXRpb24nKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbW9uT25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgICAgIG9uTmF2aWdhdGUoaW5kZXhSZWYuY3VycmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Gb2N1cygpIHtcbiAgICAgICAgaWYgKG9wZW4gJiYgIXZpcnR1YWwpIHtcbiAgICAgICAgICBvbk5hdmlnYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Qb2ludGVyRG93bjogY2hlY2tWaXJ0dWFsUG9pbnRlcixcbiAgICAgIG9uTW91c2VEb3duOiBjaGVja1ZpcnR1YWxNb3VzZSxcbiAgICAgIG9uQ2xpY2s6IGNoZWNrVmlydHVhbE1vdXNlXG4gICAgfTtcbiAgfSwgW2FjdGl2ZUlkLCBhcmlhQWN0aXZlRGVzY2VuZGFudFByb3AsIGNvbW1vbk9uS2V5RG93biwgZGlzYWJsZWRJbmRpY2VzUmVmLCBmb2N1c0l0ZW1Pbk9wZW4sIGxpc3RSZWYsIG5lc3RlZCwgb25OYXZpZ2F0ZSwgb25PcGVuQ2hhbmdlLCBvcGVuLCBvcGVuT25BcnJvd0tleURvd24sIG9yaWVudGF0aW9uLCBydGwsIHNlbGVjdGVkSW5kZXgsIHRyZWUsIHZpcnR1YWwsIHZpcnR1YWxJdGVtUmVmXSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IGVuYWJsZWQgPyB7XG4gICAgcmVmZXJlbmNlLFxuICAgIGZsb2F0aW5nLFxuICAgIGl0ZW1cbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlLCBmbG9hdGluZywgaXRlbV0pO1xufVxuXG5jb25zdCBjb21wb25lbnRSb2xlVG9BcmlhUm9sZU1hcCA9IC8qI19fUFVSRV9fKi9uZXcgTWFwKFtbJ3NlbGVjdCcsICdsaXN0Ym94J10sIFsnY29tYm9ib3gnLCAnbGlzdGJveCddLCBbJ2xhYmVsJywgZmFsc2VdXSk7XG5cbi8qKlxuICogQWRkcyBiYXNlIHNjcmVlbiByZWFkZXIgcHJvcHMgdG8gdGhlIHJlZmVyZW5jZSBhbmQgZmxvYXRpbmcgZWxlbWVudHMgZm9yIGFcbiAqIGdpdmVuIGZsb2F0aW5nIGVsZW1lbnQgYHJvbGVgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZVJvbGVcbiAqL1xuZnVuY3Rpb24gdXNlUm9sZShjb250ZXh0LCBwcm9wcykge1xuICB2YXIgX2NvbXBvbmVudFJvbGVUb0FyaWFSO1xuICBpZiAocHJvcHMgPT09IHZvaWQgMCkge1xuICAgIHByb3BzID0ge307XG4gIH1cbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgZmxvYXRpbmdJZFxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIHJvbGUgPSAnZGlhbG9nJ1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGFyaWFSb2xlID0gKF9jb21wb25lbnRSb2xlVG9BcmlhUiA9IGNvbXBvbmVudFJvbGVUb0FyaWFSb2xlTWFwLmdldChyb2xlKSkgIT0gbnVsbCA/IF9jb21wb25lbnRSb2xlVG9BcmlhUiA6IHJvbGU7XG4gIGNvbnN0IHJlZmVyZW5jZUlkID0gdXNlSWQoKTtcbiAgY29uc3QgcGFyZW50SWQgPSB1c2VGbG9hdGluZ1BhcmVudE5vZGVJZCgpO1xuICBjb25zdCBpc05lc3RlZCA9IHBhcmVudElkICE9IG51bGw7XG4gIGNvbnN0IHJlZmVyZW5jZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChhcmlhUm9sZSA9PT0gJ3Rvb2x0aXAnIHx8IHJvbGUgPT09ICdsYWJlbCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtcImFyaWEtXCIgKyAocm9sZSA9PT0gJ2xhYmVsJyA/ICdsYWJlbGxlZGJ5JyA6ICdkZXNjcmliZWRieScpXTogb3BlbiA/IGZsb2F0aW5nSWQgOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAnYXJpYS1leHBhbmRlZCc6IG9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgJ2FyaWEtaGFzcG9wdXAnOiBhcmlhUm9sZSA9PT0gJ2FsZXJ0ZGlhbG9nJyA/ICdkaWFsb2cnIDogYXJpYVJvbGUsXG4gICAgICAnYXJpYS1jb250cm9scyc6IG9wZW4gPyBmbG9hdGluZ0lkIDogdW5kZWZpbmVkLFxuICAgICAgLi4uKGFyaWFSb2xlID09PSAnbGlzdGJveCcgJiYge1xuICAgICAgICByb2xlOiAnY29tYm9ib3gnXG4gICAgICB9KSxcbiAgICAgIC4uLihhcmlhUm9sZSA9PT0gJ21lbnUnICYmIHtcbiAgICAgICAgaWQ6IHJlZmVyZW5jZUlkXG4gICAgICB9KSxcbiAgICAgIC4uLihhcmlhUm9sZSA9PT0gJ21lbnUnICYmIGlzTmVzdGVkICYmIHtcbiAgICAgICAgcm9sZTogJ21lbnVpdGVtJ1xuICAgICAgfSksXG4gICAgICAuLi4ocm9sZSA9PT0gJ3NlbGVjdCcgJiYge1xuICAgICAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAnbm9uZSdcbiAgICAgIH0pLFxuICAgICAgLi4uKHJvbGUgPT09ICdjb21ib2JveCcgJiYge1xuICAgICAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAnbGlzdCdcbiAgICAgIH0pXG4gICAgfTtcbiAgfSwgW2FyaWFSb2xlLCBmbG9hdGluZ0lkLCBpc05lc3RlZCwgb3BlbiwgcmVmZXJlbmNlSWQsIHJvbGVdKTtcbiAgY29uc3QgZmxvYXRpbmcgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBmbG9hdGluZ1Byb3BzID0ge1xuICAgICAgaWQ6IGZsb2F0aW5nSWQsXG4gICAgICAuLi4oYXJpYVJvbGUgJiYge1xuICAgICAgICByb2xlOiBhcmlhUm9sZVxuICAgICAgfSlcbiAgICB9O1xuICAgIGlmIChhcmlhUm9sZSA9PT0gJ3Rvb2x0aXAnIHx8IHJvbGUgPT09ICdsYWJlbCcpIHtcbiAgICAgIHJldHVybiBmbG9hdGluZ1Byb3BzO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZmxvYXRpbmdQcm9wcyxcbiAgICAgIC4uLihhcmlhUm9sZSA9PT0gJ21lbnUnICYmIHtcbiAgICAgICAgJ2FyaWEtbGFiZWxsZWRieSc6IHJlZmVyZW5jZUlkXG4gICAgICB9KVxuICAgIH07XG4gIH0sIFthcmlhUm9sZSwgZmxvYXRpbmdJZCwgcmVmZXJlbmNlSWQsIHJvbGVdKTtcbiAgY29uc3QgaXRlbSA9IFJlYWN0LnVzZUNhbGxiYWNrKF9yZWYgPT4ge1xuICAgIGxldCB7XG4gICAgICBhY3RpdmUsXG4gICAgICBzZWxlY3RlZFxuICAgIH0gPSBfcmVmO1xuICAgIGNvbnN0IGNvbW1vblByb3BzID0ge1xuICAgICAgcm9sZTogJ29wdGlvbicsXG4gICAgICAuLi4oYWN0aXZlICYmIHtcbiAgICAgICAgaWQ6IGZsb2F0aW5nSWQgKyBcIi1vcHRpb25cIlxuICAgICAgfSlcbiAgICB9O1xuXG4gICAgLy8gRm9yIGBtZW51YCwgd2UgYXJlIHVuYWJsZSB0byB0ZWxsIGlmIHRoZSBpdGVtIGlzIGEgYG1lbnVpdGVtcmFkaW9gXG4gICAgLy8gb3IgYG1lbnVpdGVtY2hlY2tib3hgLiBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgcmVhc29ucywgYWxzb1xuICAgIC8vIGF2b2lkIGRlZmF1bHRpbmcgdG8gYG1lbnVpdGVtYCBhcyBpdCBtYXkgb3ZlcndyaXRlIGN1c3RvbSByb2xlIHByb3BzLlxuICAgIHN3aXRjaCAocm9sZSkge1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb21tb25Qcm9wcyxcbiAgICAgICAgICAnYXJpYS1zZWxlY3RlZCc6IGFjdGl2ZSAmJiBzZWxlY3RlZFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnY29tYm9ib3gnOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICAgICAgLi4uKGFjdGl2ZSAmJiB7XG4gICAgICAgICAgICAgICdhcmlhLXNlbGVjdGVkJzogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfSwgW2Zsb2F0aW5nSWQsIHJvbGVdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmcsXG4gICAgaXRlbVxuICB9IDoge30sIFtlbmFibGVkLCByZWZlcmVuY2UsIGZsb2F0aW5nLCBpdGVtXSk7XG59XG5cbi8vIENvbnZlcnRzIGEgSlMgc3R5bGUga2V5IGxpa2UgYGJhY2tncm91bmRDb2xvcmAgdG8gYSBDU1MgdHJhbnNpdGlvbi1wcm9wZXJ0eVxuLy8gbGlrZSBgYmFja2dyb3VuZC1jb2xvcmAuXG5jb25zdCBjYW1lbENhc2VUb0tlYmFiQ2FzZSA9IHN0ciA9PiBzdHIucmVwbGFjZSgvW0EtWl0rKD8hW2Etel0pfFtBLVpdL2csICgkLCBvZnMpID0+IChvZnMgPyAnLScgOiAnJykgKyAkLnRvTG93ZXJDYXNlKCkpO1xuZnVuY3Rpb24gZXhlY1dpdGhBcmdzT3JSZXR1cm4odmFsdWVPckZuLCBhcmdzKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWVPckZuID09PSAnZnVuY3Rpb24nID8gdmFsdWVPckZuKGFyZ3MpIDogdmFsdWVPckZuO1xufVxuZnVuY3Rpb24gdXNlRGVsYXlVbm1vdW50KG9wZW4sIGR1cmF0aW9uTXMpIHtcbiAgY29uc3QgW2lzTW91bnRlZCwgc2V0SXNNb3VudGVkXSA9IFJlYWN0LnVzZVN0YXRlKG9wZW4pO1xuICBpZiAob3BlbiAmJiAhaXNNb3VudGVkKSB7XG4gICAgc2V0SXNNb3VudGVkKHRydWUpO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuICYmIGlzTW91bnRlZCkge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gc2V0SXNNb3VudGVkKGZhbHNlKSwgZHVyYXRpb25Ncyk7XG4gICAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIH1cbiAgfSwgW29wZW4sIGlzTW91bnRlZCwgZHVyYXRpb25Nc10pO1xuICByZXR1cm4gaXNNb3VudGVkO1xufVxuLyoqXG4gKiBQcm92aWRlcyBhIHN0YXR1cyBzdHJpbmcgdG8gYXBwbHkgQ1NTIHRyYW5zaXRpb25zIHRvIGEgZmxvYXRpbmcgZWxlbWVudCxcbiAqIGNvcnJlY3RseSBoYW5kbGluZyBwbGFjZW1lbnQtYXdhcmUgdHJhbnNpdGlvbnMuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlVHJhbnNpdGlvbiN1c2V0cmFuc2l0aW9uc3RhdHVzXG4gKi9cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb25TdGF0dXMoY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBvcGVuLFxuICAgIGVsZW1lbnRzOiB7XG4gICAgICBmbG9hdGluZ1xuICAgIH1cbiAgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBkdXJhdGlvbiA9IDI1MFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGlzTnVtYmVyRHVyYXRpb24gPSB0eXBlb2YgZHVyYXRpb24gPT09ICdudW1iZXInO1xuICBjb25zdCBjbG9zZUR1cmF0aW9uID0gKGlzTnVtYmVyRHVyYXRpb24gPyBkdXJhdGlvbiA6IGR1cmF0aW9uLmNsb3NlKSB8fCAwO1xuICBjb25zdCBbc3RhdHVzLCBzZXRTdGF0dXNdID0gUmVhY3QudXNlU3RhdGUoJ3VubW91bnRlZCcpO1xuICBjb25zdCBpc01vdW50ZWQgPSB1c2VEZWxheVVubW91bnQob3BlbiwgY2xvc2VEdXJhdGlvbik7XG4gIGlmICghaXNNb3VudGVkICYmIHN0YXR1cyA9PT0gJ2Nsb3NlJykge1xuICAgIHNldFN0YXR1cygndW5tb3VudGVkJyk7XG4gIH1cbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmICghZmxvYXRpbmcpIHJldHVybjtcbiAgICBpZiAob3Blbikge1xuICAgICAgc2V0U3RhdHVzKCdpbml0aWFsJyk7XG4gICAgICBjb25zdCBmcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHNldFN0YXR1cygnb3BlbicpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShmcmFtZSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBzZXRTdGF0dXMoJ2Nsb3NlJyk7XG4gIH0sIFtvcGVuLCBmbG9hdGluZ10pO1xuICByZXR1cm4ge1xuICAgIGlzTW91bnRlZCxcbiAgICBzdGF0dXNcbiAgfTtcbn1cbi8qKlxuICogUHJvdmlkZXMgc3R5bGVzIHRvIGFwcGx5IENTUyB0cmFuc2l0aW9ucyB0byBhIGZsb2F0aW5nIGVsZW1lbnQsIGNvcnJlY3RseVxuICogaGFuZGxpbmcgcGxhY2VtZW50LWF3YXJlIHRyYW5zaXRpb25zLiBXcmFwcGVyIGFyb3VuZCBgdXNlVHJhbnNpdGlvblN0YXR1c2AuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlVHJhbnNpdGlvbiN1c2V0cmFuc2l0aW9uc3R5bGVzXG4gKi9cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb25TdHlsZXMoY29udGV4dCwgcHJvcHMpIHtcbiAgaWYgKHByb3BzID09PSB2b2lkIDApIHtcbiAgICBwcm9wcyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBpbml0aWFsOiB1bnN0YWJsZV9pbml0aWFsID0ge1xuICAgICAgb3BhY2l0eTogMFxuICAgIH0sXG4gICAgb3BlbjogdW5zdGFibGVfb3BlbixcbiAgICBjbG9zZTogdW5zdGFibGVfY2xvc2UsXG4gICAgY29tbW9uOiB1bnN0YWJsZV9jb21tb24sXG4gICAgZHVyYXRpb24gPSAyNTBcbiAgfSA9IHByb3BzO1xuICBjb25zdCBwbGFjZW1lbnQgPSBjb250ZXh0LnBsYWNlbWVudDtcbiAgY29uc3Qgc2lkZSA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xuICBjb25zdCBmbkFyZ3MgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgc2lkZSxcbiAgICBwbGFjZW1lbnRcbiAgfSksIFtzaWRlLCBwbGFjZW1lbnRdKTtcbiAgY29uc3QgaXNOdW1iZXJEdXJhdGlvbiA9IHR5cGVvZiBkdXJhdGlvbiA9PT0gJ251bWJlcic7XG4gIGNvbnN0IG9wZW5EdXJhdGlvbiA9IChpc051bWJlckR1cmF0aW9uID8gZHVyYXRpb24gOiBkdXJhdGlvbi5vcGVuKSB8fCAwO1xuICBjb25zdCBjbG9zZUR1cmF0aW9uID0gKGlzTnVtYmVyRHVyYXRpb24gPyBkdXJhdGlvbiA6IGR1cmF0aW9uLmNsb3NlKSB8fCAwO1xuICBjb25zdCBbc3R5bGVzLCBzZXRTdHlsZXNdID0gUmVhY3QudXNlU3RhdGUoKCkgPT4gKHtcbiAgICAuLi5leGVjV2l0aEFyZ3NPclJldHVybih1bnN0YWJsZV9jb21tb24sIGZuQXJncyksXG4gICAgLi4uZXhlY1dpdGhBcmdzT3JSZXR1cm4odW5zdGFibGVfaW5pdGlhbCwgZm5BcmdzKVxuICB9KSk7XG4gIGNvbnN0IHtcbiAgICBpc01vdW50ZWQsXG4gICAgc3RhdHVzXG4gIH0gPSB1c2VUcmFuc2l0aW9uU3RhdHVzKGNvbnRleHQsIHtcbiAgICBkdXJhdGlvblxuICB9KTtcbiAgY29uc3QgaW5pdGlhbFJlZiA9IHVzZUxhdGVzdFJlZih1bnN0YWJsZV9pbml0aWFsKTtcbiAgY29uc3Qgb3BlblJlZiA9IHVzZUxhdGVzdFJlZih1bnN0YWJsZV9vcGVuKTtcbiAgY29uc3QgY2xvc2VSZWYgPSB1c2VMYXRlc3RSZWYodW5zdGFibGVfY2xvc2UpO1xuICBjb25zdCBjb21tb25SZWYgPSB1c2VMYXRlc3RSZWYodW5zdGFibGVfY29tbW9uKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGNvbnN0IGluaXRpYWxTdHlsZXMgPSBleGVjV2l0aEFyZ3NPclJldHVybihpbml0aWFsUmVmLmN1cnJlbnQsIGZuQXJncyk7XG4gICAgY29uc3QgY2xvc2VTdHlsZXMgPSBleGVjV2l0aEFyZ3NPclJldHVybihjbG9zZVJlZi5jdXJyZW50LCBmbkFyZ3MpO1xuICAgIGNvbnN0IGNvbW1vblN0eWxlcyA9IGV4ZWNXaXRoQXJnc09yUmV0dXJuKGNvbW1vblJlZi5jdXJyZW50LCBmbkFyZ3MpO1xuICAgIGNvbnN0IG9wZW5TdHlsZXMgPSBleGVjV2l0aEFyZ3NPclJldHVybihvcGVuUmVmLmN1cnJlbnQsIGZuQXJncykgfHwgT2JqZWN0LmtleXMoaW5pdGlhbFN0eWxlcykucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSAnJztcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuICAgIGlmIChzdGF0dXMgPT09ICdpbml0aWFsJykge1xuICAgICAgc2V0U3R5bGVzKHN0eWxlcyA9PiAoe1xuICAgICAgICB0cmFuc2l0aW9uUHJvcGVydHk6IHN0eWxlcy50cmFuc2l0aW9uUHJvcGVydHksXG4gICAgICAgIC4uLmNvbW1vblN0eWxlcyxcbiAgICAgICAgLi4uaW5pdGlhbFN0eWxlc1xuICAgICAgfSkpO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSAnb3BlbicpIHtcbiAgICAgIHNldFN0eWxlcyh7XG4gICAgICAgIHRyYW5zaXRpb25Qcm9wZXJ0eTogT2JqZWN0LmtleXMob3BlblN0eWxlcykubWFwKGNhbWVsQ2FzZVRvS2ViYWJDYXNlKS5qb2luKCcsJyksXG4gICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogb3BlbkR1cmF0aW9uICsgXCJtc1wiLFxuICAgICAgICAuLi5jb21tb25TdHlsZXMsXG4gICAgICAgIC4uLm9wZW5TdHlsZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSAnY2xvc2UnKSB7XG4gICAgICBjb25zdCBzdHlsZXMgPSBjbG9zZVN0eWxlcyB8fCBpbml0aWFsU3R5bGVzO1xuICAgICAgc2V0U3R5bGVzKHtcbiAgICAgICAgdHJhbnNpdGlvblByb3BlcnR5OiBPYmplY3Qua2V5cyhzdHlsZXMpLm1hcChjYW1lbENhc2VUb0tlYmFiQ2FzZSkuam9pbignLCcpLFxuICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb246IGNsb3NlRHVyYXRpb24gKyBcIm1zXCIsXG4gICAgICAgIC4uLmNvbW1vblN0eWxlcyxcbiAgICAgICAgLi4uc3R5bGVzXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtjbG9zZUR1cmF0aW9uLCBjbG9zZVJlZiwgaW5pdGlhbFJlZiwgb3BlblJlZiwgY29tbW9uUmVmLCBvcGVuRHVyYXRpb24sIHN0YXR1cywgZm5BcmdzXSk7XG4gIHJldHVybiB7XG4gICAgaXNNb3VudGVkLFxuICAgIHN0eWxlc1xuICB9O1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIGEgbWF0Y2hpbmcgY2FsbGJhY2sgdGhhdCBjYW4gYmUgdXNlZCB0byBmb2N1cyBhbiBpdGVtIGFzIHRoZSB1c2VyXG4gKiB0eXBlcywgb2Z0ZW4gdXNlZCBpbiB0YW5kZW0gd2l0aCBgdXNlTGlzdE5hdmlnYXRpb24oKWAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlVHlwZWFoZWFkXG4gKi9cbmZ1bmN0aW9uIHVzZVR5cGVhaGVhZChjb250ZXh0LCBwcm9wcykge1xuICB2YXIgX3JlZjtcbiAgY29uc3Qge1xuICAgIG9wZW4sXG4gICAgZGF0YVJlZlxuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGxpc3RSZWYsXG4gICAgYWN0aXZlSW5kZXgsXG4gICAgb25NYXRjaDogdW5zdGFibGVfb25NYXRjaCxcbiAgICBvblR5cGluZ0NoYW5nZTogdW5zdGFibGVfb25UeXBpbmdDaGFuZ2UsXG4gICAgZW5hYmxlZCA9IHRydWUsXG4gICAgZmluZE1hdGNoID0gbnVsbCxcbiAgICByZXNldE1zID0gNzUwLFxuICAgIGlnbm9yZUtleXMgPSBbXSxcbiAgICBzZWxlY3RlZEluZGV4ID0gbnVsbFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHRpbWVvdXRJZFJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBjb25zdCBzdHJpbmdSZWYgPSBSZWFjdC51c2VSZWYoJycpO1xuICBjb25zdCBwcmV2SW5kZXhSZWYgPSBSZWFjdC51c2VSZWYoKF9yZWYgPSBzZWxlY3RlZEluZGV4ICE9IG51bGwgPyBzZWxlY3RlZEluZGV4IDogYWN0aXZlSW5kZXgpICE9IG51bGwgPyBfcmVmIDogLTEpO1xuICBjb25zdCBtYXRjaEluZGV4UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBvbk1hdGNoID0gdXNlRWZmZWN0RXZlbnQodW5zdGFibGVfb25NYXRjaCk7XG4gIGNvbnN0IG9uVHlwaW5nQ2hhbmdlID0gdXNlRWZmZWN0RXZlbnQodW5zdGFibGVfb25UeXBpbmdDaGFuZ2UpO1xuICBjb25zdCBmaW5kTWF0Y2hSZWYgPSB1c2VMYXRlc3RSZWYoZmluZE1hdGNoKTtcbiAgY29uc3QgaWdub3JlS2V5c1JlZiA9IHVzZUxhdGVzdFJlZihpZ25vcmVLZXlzKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIGlmIChvcGVuKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkUmVmLmN1cnJlbnQpO1xuICAgICAgbWF0Y2hJbmRleFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgIHN0cmluZ1JlZi5jdXJyZW50ID0gJyc7XG4gICAgfVxuICB9LCBbb3Blbl0pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgLy8gU3luYyBhcnJvdyBrZXkgbmF2aWdhdGlvbiBidXQgbm90IHR5cGVhaGVhZCBuYXZpZ2F0aW9uLlxuICAgIGlmIChvcGVuICYmIHN0cmluZ1JlZi5jdXJyZW50ID09PSAnJykge1xuICAgICAgdmFyIF9yZWYyO1xuICAgICAgcHJldkluZGV4UmVmLmN1cnJlbnQgPSAoX3JlZjIgPSBzZWxlY3RlZEluZGV4ICE9IG51bGwgPyBzZWxlY3RlZEluZGV4IDogYWN0aXZlSW5kZXgpICE9IG51bGwgPyBfcmVmMiA6IC0xO1xuICAgIH1cbiAgfSwgW29wZW4sIHNlbGVjdGVkSW5kZXgsIGFjdGl2ZUluZGV4XSk7XG4gIGNvbnN0IHNldFR5cGluZ0NoYW5nZSA9IHVzZUVmZmVjdEV2ZW50KHZhbHVlID0+IHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmICghZGF0YVJlZi5jdXJyZW50LnR5cGluZykge1xuICAgICAgICBkYXRhUmVmLmN1cnJlbnQudHlwaW5nID0gdmFsdWU7XG4gICAgICAgIG9uVHlwaW5nQ2hhbmdlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGFSZWYuY3VycmVudC50eXBpbmcpIHtcbiAgICAgICAgZGF0YVJlZi5jdXJyZW50LnR5cGluZyA9IHZhbHVlO1xuICAgICAgICBvblR5cGluZ0NoYW5nZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgY29uc3Qgb25LZXlEb3duID0gdXNlRWZmZWN0RXZlbnQoZXZlbnQgPT4ge1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoaW5nSW5kZXgobGlzdCwgb3JkZXJlZExpc3QsIHN0cmluZykge1xuICAgICAgY29uc3Qgc3RyID0gZmluZE1hdGNoUmVmLmN1cnJlbnQgPyBmaW5kTWF0Y2hSZWYuY3VycmVudChvcmRlcmVkTGlzdCwgc3RyaW5nKSA6IG9yZGVyZWRMaXN0LmZpbmQodGV4dCA9PiAodGV4dCA9PSBudWxsID8gdm9pZCAwIDogdGV4dC50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2Yoc3RyaW5nLnRvTG9jYWxlTG93ZXJDYXNlKCkpKSA9PT0gMCk7XG4gICAgICByZXR1cm4gc3RyID8gbGlzdC5pbmRleE9mKHN0cikgOiAtMTtcbiAgICB9XG4gICAgY29uc3QgbGlzdENvbnRlbnQgPSBsaXN0UmVmLmN1cnJlbnQ7XG4gICAgaWYgKHN0cmluZ1JlZi5jdXJyZW50Lmxlbmd0aCA+IDAgJiYgc3RyaW5nUmVmLmN1cnJlbnRbMF0gIT09ICcgJykge1xuICAgICAgaWYgKGdldE1hdGNoaW5nSW5kZXgobGlzdENvbnRlbnQsIGxpc3RDb250ZW50LCBzdHJpbmdSZWYuY3VycmVudCkgPT09IC0xKSB7XG4gICAgICAgIHNldFR5cGluZ0NoYW5nZShmYWxzZSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsaXN0Q29udGVudCA9PSBudWxsIHx8IGlnbm9yZUtleXNSZWYuY3VycmVudC5pbmNsdWRlcyhldmVudC5rZXkpIHx8XG4gICAgLy8gQ2hhcmFjdGVyIGtleS5cbiAgICBldmVudC5rZXkubGVuZ3RoICE9PSAxIHx8XG4gICAgLy8gTW9kaWZpZXIga2V5LlxuICAgIGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5hbHRLZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wZW4gJiYgZXZlbnQua2V5ICE9PSAnICcpIHtcbiAgICAgIHN0b3BFdmVudChldmVudCk7XG4gICAgICBzZXRUeXBpbmdDaGFuZ2UodHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gQmFpbCBvdXQgaWYgdGhlIGxpc3QgY29udGFpbnMgYSB3b3JkIGxpa2UgXCJsbGFtYVwiIG9yIFwiYWFyb25cIi4gVE9ETzpcbiAgICAvLyBhbGxvdyBpdCBpbiB0aGlzIGNhc2UsIHRvby5cbiAgICBjb25zdCBhbGxvd1JhcGlkU3VjY2Vzc2lvbk9mRmlyc3RMZXR0ZXIgPSBsaXN0Q29udGVudC5ldmVyeSh0ZXh0ID0+IHtcbiAgICAgIHZhciBfdGV4dCQsIF90ZXh0JDI7XG4gICAgICByZXR1cm4gdGV4dCA/ICgoX3RleHQkID0gdGV4dFswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF90ZXh0JC50b0xvY2FsZUxvd2VyQ2FzZSgpKSAhPT0gKChfdGV4dCQyID0gdGV4dFsxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF90ZXh0JDIudG9Mb2NhbGVMb3dlckNhc2UoKSkgOiB0cnVlO1xuICAgIH0pO1xuXG4gICAgLy8gQWxsb3dzIHRoZSB1c2VyIHRvIGN5Y2xlIHRocm91Z2ggaXRlbXMgdGhhdCBzdGFydCB3aXRoIHRoZSBzYW1lIGxldHRlclxuICAgIC8vIGluIHJhcGlkIHN1Y2Nlc3Npb24uXG4gICAgaWYgKGFsbG93UmFwaWRTdWNjZXNzaW9uT2ZGaXJzdExldHRlciAmJiBzdHJpbmdSZWYuY3VycmVudCA9PT0gZXZlbnQua2V5KSB7XG4gICAgICBzdHJpbmdSZWYuY3VycmVudCA9ICcnO1xuICAgICAgcHJldkluZGV4UmVmLmN1cnJlbnQgPSBtYXRjaEluZGV4UmVmLmN1cnJlbnQ7XG4gICAgfVxuICAgIHN0cmluZ1JlZi5jdXJyZW50ICs9IGV2ZW50LmtleTtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dElkUmVmLmN1cnJlbnQpO1xuICAgIHRpbWVvdXRJZFJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzdHJpbmdSZWYuY3VycmVudCA9ICcnO1xuICAgICAgcHJldkluZGV4UmVmLmN1cnJlbnQgPSBtYXRjaEluZGV4UmVmLmN1cnJlbnQ7XG4gICAgICBzZXRUeXBpbmdDaGFuZ2UoZmFsc2UpO1xuICAgIH0sIHJlc2V0TXMpO1xuICAgIGNvbnN0IHByZXZJbmRleCA9IHByZXZJbmRleFJlZi5jdXJyZW50O1xuICAgIGNvbnN0IGluZGV4ID0gZ2V0TWF0Y2hpbmdJbmRleChsaXN0Q29udGVudCwgWy4uLmxpc3RDb250ZW50LnNsaWNlKChwcmV2SW5kZXggfHwgMCkgKyAxKSwgLi4ubGlzdENvbnRlbnQuc2xpY2UoMCwgKHByZXZJbmRleCB8fCAwKSArIDEpXSwgc3RyaW5nUmVmLmN1cnJlbnQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIG9uTWF0Y2goaW5kZXgpO1xuICAgICAgbWF0Y2hJbmRleFJlZi5jdXJyZW50ID0gaW5kZXg7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgIT09ICcgJykge1xuICAgICAgc3RyaW5nUmVmLmN1cnJlbnQgPSAnJztcbiAgICAgIHNldFR5cGluZ0NoYW5nZShmYWxzZSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcmVmZXJlbmNlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIG9uS2V5RG93blxuICB9KSwgW29uS2V5RG93bl0pO1xuICBjb25zdCBmbG9hdGluZyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBvbktleURvd24sXG4gICAgICBvbktleVVwKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgICAgIHNldFR5cGluZ0NoYW5nZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LCBbb25LZXlEb3duLCBzZXRUeXBpbmdDaGFuZ2VdKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gZW5hYmxlZCA/IHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmdcbiAgfSA6IHt9LCBbZW5hYmxlZCwgcmVmZXJlbmNlLCBmbG9hdGluZ10pO1xufVxuXG5mdW5jdGlvbiBnZXRBcmdzV2l0aEN1c3RvbUZsb2F0aW5nSGVpZ2h0KHN0YXRlLCBoZWlnaHQpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICByZWN0czoge1xuICAgICAgLi4uc3RhdGUucmVjdHMsXG4gICAgICBmbG9hdGluZzoge1xuICAgICAgICAuLi5zdGF0ZS5yZWN0cy5mbG9hdGluZyxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuLyoqXG4gKiBQb3NpdGlvbnMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgc3VjaCB0aGF0IGFuIGlubmVyIGVsZW1lbnQgaW5zaWRlIG9mIGl0IGlzXG4gKiBhbmNob3JlZCB0byB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaW5uZXJcbiAqL1xuY29uc3QgaW5uZXIgPSBwcm9wcyA9PiAoe1xuICBuYW1lOiAnaW5uZXInLFxuICBvcHRpb25zOiBwcm9wcyxcbiAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBsaXN0UmVmLFxuICAgICAgb3ZlcmZsb3dSZWYsXG4gICAgICBvbkZhbGxiYWNrQ2hhbmdlLFxuICAgICAgb2Zmc2V0OiBpbm5lck9mZnNldCA9IDAsXG4gICAgICBpbmRleCA9IDAsXG4gICAgICBtaW5JdGVtc1Zpc2libGUgPSA0LFxuICAgICAgcmVmZXJlbmNlT3ZlcmZsb3dUaHJlc2hvbGQgPSAwLFxuICAgICAgc2Nyb2xsUmVmLFxuICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgfSA9IGV2YWx1YXRlKHByb3BzLCBzdGF0ZSk7XG4gICAgY29uc3Qge1xuICAgICAgcmVjdHMsXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICBmbG9hdGluZ1xuICAgICAgfVxuICAgIH0gPSBzdGF0ZTtcbiAgICBjb25zdCBpdGVtID0gbGlzdFJlZi5jdXJyZW50W2luZGV4XTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBpZiAoIXN0YXRlLnBsYWNlbWVudC5zdGFydHNXaXRoKCdib3R0b20nKSkge1xuICAgICAgICB3YXJuKCdgcGxhY2VtZW50YCBzaWRlIG11c3QgYmUgXCJib3R0b21cIiB3aGVuIHVzaW5nIHRoZSBgaW5uZXJgJywgJ21pZGRsZXdhcmUuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBuZXh0QXJncyA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgLi4uKGF3YWl0IG9mZnNldCgtaXRlbS5vZmZzZXRUb3AgLSBmbG9hdGluZy5jbGllbnRUb3AgLSByZWN0cy5yZWZlcmVuY2UuaGVpZ2h0IC8gMiAtIGl0ZW0ub2Zmc2V0SGVpZ2h0IC8gMiAtIGlubmVyT2Zmc2V0KS5mbihzdGF0ZSkpXG4gICAgfTtcbiAgICBjb25zdCBlbCA9IChzY3JvbGxSZWYgPT0gbnVsbCA/IHZvaWQgMCA6IHNjcm9sbFJlZi5jdXJyZW50KSB8fCBmbG9hdGluZztcbiAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KGdldEFyZ3NXaXRoQ3VzdG9tRmxvYXRpbmdIZWlnaHQobmV4dEFyZ3MsIGVsLnNjcm9sbEhlaWdodCksIGRldGVjdE92ZXJmbG93T3B0aW9ucyk7XG4gICAgY29uc3QgcmVmT3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhuZXh0QXJncywge1xuICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zLFxuICAgICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnXG4gICAgfSk7XG4gICAgY29uc3QgZGlmZlkgPSBNYXRoLm1heCgwLCBvdmVyZmxvdy50b3ApO1xuICAgIGNvbnN0IG5leHRZID0gbmV4dEFyZ3MueSArIGRpZmZZO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IE1hdGgubWF4KDAsIGVsLnNjcm9sbEhlaWdodCAtIGRpZmZZIC0gTWF0aC5tYXgoMCwgb3ZlcmZsb3cuYm90dG9tKSk7XG4gICAgZWwuc3R5bGUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0ICsgXCJweFwiO1xuICAgIGVsLnNjcm9sbFRvcCA9IGRpZmZZO1xuXG4gICAgLy8gVGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSwgZmFsbGJhY2sgdG8gc3RhbmRhcmQgYW5jaG9yZWQgcG9zaXRpb25pbmdcbiAgICBpZiAob25GYWxsYmFja0NoYW5nZSkge1xuICAgICAgaWYgKGVsLm9mZnNldEhlaWdodCA8IGl0ZW0ub2Zmc2V0SGVpZ2h0ICogTWF0aC5taW4obWluSXRlbXNWaXNpYmxlLCBsaXN0UmVmLmN1cnJlbnQubGVuZ3RoIC0gMSkgLSAxIHx8IHJlZk92ZXJmbG93LnRvcCA+PSAtcmVmZXJlbmNlT3ZlcmZsb3dUaHJlc2hvbGQgfHwgcmVmT3ZlcmZsb3cuYm90dG9tID49IC1yZWZlcmVuY2VPdmVyZmxvd1RocmVzaG9sZCkge1xuICAgICAgICBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4gb25GYWxsYmFja0NoYW5nZSh0cnVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4gb25GYWxsYmFja0NoYW5nZShmYWxzZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcmZsb3dSZWYpIHtcbiAgICAgIG92ZXJmbG93UmVmLmN1cnJlbnQgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhnZXRBcmdzV2l0aEN1c3RvbUZsb2F0aW5nSGVpZ2h0KHtcbiAgICAgICAgLi4ubmV4dEFyZ3MsXG4gICAgICAgIHk6IG5leHRZXG4gICAgICB9LCBlbC5vZmZzZXRIZWlnaHQpLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgeTogbmV4dFlcbiAgICB9O1xuICB9XG59KTtcbi8qKlxuICogQ2hhbmdlcyB0aGUgYGlubmVyYCBtaWRkbGV3YXJlJ3MgYG9mZnNldGAgdXBvbiBhIGB3aGVlbGAgZXZlbnQgdG9cbiAqIGV4cGFuZCB0aGUgZmxvYXRpbmcgZWxlbWVudCdzIGhlaWdodCwgcmV2ZWFsaW5nIG1vcmUgbGlzdCBpdGVtcy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9pbm5lclxuICovXG5mdW5jdGlvbiB1c2VJbm5lck9mZnNldChjb250ZXh0LCBwcm9wcykge1xuICBjb25zdCB7XG4gICAgb3BlbixcbiAgICBlbGVtZW50c1xuICB9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIG92ZXJmbG93UmVmLFxuICAgIHNjcm9sbFJlZixcbiAgICBvbkNoYW5nZTogdW5zdGFibGVfb25DaGFuZ2VcbiAgfSA9IHByb3BzO1xuICBjb25zdCBvbkNoYW5nZSA9IHVzZUVmZmVjdEV2ZW50KHVuc3RhYmxlX29uQ2hhbmdlKTtcbiAgY29uc3QgY29udHJvbGxlZFNjcm9sbGluZ1JlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHByZXZTY3JvbGxUb3BSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGluaXRpYWxPdmVyZmxvd1JlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgICBmdW5jdGlvbiBvbldoZWVsKGUpIHtcbiAgICAgIGlmIChlLmN0cmxLZXkgfHwgIWVsIHx8IG92ZXJmbG93UmVmLmN1cnJlbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkWSA9IGUuZGVsdGFZO1xuICAgICAgY29uc3QgaXNBdFRvcCA9IG92ZXJmbG93UmVmLmN1cnJlbnQudG9wID49IC0wLjU7XG4gICAgICBjb25zdCBpc0F0Qm90dG9tID0gb3ZlcmZsb3dSZWYuY3VycmVudC5ib3R0b20gPj0gLTAuNTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ1Njcm9sbCA9IGVsLnNjcm9sbEhlaWdodCAtIGVsLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHNpZ24gPSBkWSA8IDAgPyAtMSA6IDE7XG4gICAgICBjb25zdCBtZXRob2QgPSBkWSA8IDAgPyAnbWF4JyA6ICdtaW4nO1xuICAgICAgaWYgKGVsLnNjcm9sbEhlaWdodCA8PSBlbC5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0F0VG9wICYmIGRZID4gMCB8fCAhaXNBdEJvdHRvbSAmJiBkWSA8IDApIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgICAgIG9uQ2hhbmdlKGQgPT4gZCArIE1hdGhbbWV0aG9kXShkWSwgcmVtYWluaW5nU2Nyb2xsICogc2lnbikpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoL2ZpcmVmb3gvaS50ZXN0KGdldFVzZXJBZ2VudCgpKSkge1xuICAgICAgICAvLyBOZWVkZWQgdG8gcHJvcGFnYXRlIHNjcm9sbGluZyBkdXJpbmcgbW9tZW50dW0gc2Nyb2xsaW5nIHBoYXNlIG9uY2VcbiAgICAgICAgLy8gaXQgZ2V0cyBsaW1pdGVkIGJ5IHRoZSBib3VuZGFyeS4gVVggaW1wcm92ZW1lbnQsIG5vdCBjcml0aWNhbC5cbiAgICAgICAgZWwuc2Nyb2xsVG9wICs9IGRZO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlbCA9IChzY3JvbGxSZWYgPT0gbnVsbCA/IHZvaWQgMCA6IHNjcm9sbFJlZi5jdXJyZW50KSB8fCBlbGVtZW50cy5mbG9hdGluZztcbiAgICBpZiAob3BlbiAmJiBlbCkge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbldoZWVsKTtcblxuICAgICAgLy8gV2FpdCBmb3IgdGhlIHBvc2l0aW9uIHRvIGJlIHJlYWR5LlxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgcHJldlNjcm9sbFRvcFJlZi5jdXJyZW50ID0gZWwuc2Nyb2xsVG9wO1xuICAgICAgICBpZiAob3ZlcmZsb3dSZWYuY3VycmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgaW5pdGlhbE92ZXJmbG93UmVmLmN1cnJlbnQgPSB7XG4gICAgICAgICAgICAuLi5vdmVyZmxvd1JlZi5jdXJyZW50XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBwcmV2U2Nyb2xsVG9wUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBpbml0aWFsT3ZlcmZsb3dSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2VuYWJsZWQsIG9wZW4sIGVsZW1lbnRzLmZsb2F0aW5nLCBvdmVyZmxvd1JlZiwgc2Nyb2xsUmVmLCBvbkNoYW5nZV0pO1xuICBjb25zdCBmbG9hdGluZyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICBvbktleURvd24oKSB7XG4gICAgICBjb250cm9sbGVkU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIH0sXG4gICAgb25XaGVlbCgpIHtcbiAgICAgIGNvbnRyb2xsZWRTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0sXG4gICAgb25Qb2ludGVyTW92ZSgpIHtcbiAgICAgIGNvbnRyb2xsZWRTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0sXG4gICAgb25TY3JvbGwoKSB7XG4gICAgICBjb25zdCBlbCA9IChzY3JvbGxSZWYgPT0gbnVsbCA/IHZvaWQgMCA6IHNjcm9sbFJlZi5jdXJyZW50KSB8fCBlbGVtZW50cy5mbG9hdGluZztcbiAgICAgIGlmICghb3ZlcmZsb3dSZWYuY3VycmVudCB8fCAhZWwgfHwgIWNvbnRyb2xsZWRTY3JvbGxpbmdSZWYuY3VycmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocHJldlNjcm9sbFRvcFJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHNjcm9sbERpZmYgPSBlbC5zY3JvbGxUb3AgLSBwcmV2U2Nyb2xsVG9wUmVmLmN1cnJlbnQ7XG4gICAgICAgIGlmIChvdmVyZmxvd1JlZi5jdXJyZW50LmJvdHRvbSA8IC0wLjUgJiYgc2Nyb2xsRGlmZiA8IC0xIHx8IG92ZXJmbG93UmVmLmN1cnJlbnQudG9wIDwgLTAuNSAmJiBzY3JvbGxEaWZmID4gMSkge1xuICAgICAgICAgIFJlYWN0RE9NLmZsdXNoU3luYygoKSA9PiBvbkNoYW5nZShkID0+IGQgKyBzY3JvbGxEaWZmKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gW0ZpcmVmb3hdIFdhaXQgZm9yIHRoZSBoZWlnaHQgY2hhbmdlIHRvIGhhdmUgYmVlbiBhcHBsaWVkLlxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgcHJldlNjcm9sbFRvcFJlZi5jdXJyZW50ID0gZWwuc2Nyb2xsVG9wO1xuICAgICAgfSk7XG4gICAgfVxuICB9KSwgW2VsZW1lbnRzLmZsb2F0aW5nLCBvbkNoYW5nZSwgb3ZlcmZsb3dSZWYsIHNjcm9sbFJlZl0pO1xuICByZXR1cm4gUmVhY3QudXNlTWVtbygoKSA9PiBlbmFibGVkID8ge1xuICAgIGZsb2F0aW5nXG4gIH0gOiB7fSwgW2VuYWJsZWQsIGZsb2F0aW5nXSk7XG59XG5cbmZ1bmN0aW9uIGlzUG9pbnRJblBvbHlnb24ocG9pbnQsIHBvbHlnb24pIHtcbiAgY29uc3QgW3gsIHldID0gcG9pbnQ7XG4gIGxldCBpc0luc2lkZSA9IGZhbHNlO1xuICBjb25zdCBsZW5ndGggPSBwb2x5Z29uLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDAsIGogPSBsZW5ndGggLSAxOyBpIDwgbGVuZ3RoOyBqID0gaSsrKSB7XG4gICAgY29uc3QgW3hpLCB5aV0gPSBwb2x5Z29uW2ldIHx8IFswLCAwXTtcbiAgICBjb25zdCBbeGosIHlqXSA9IHBvbHlnb25bal0gfHwgWzAsIDBdO1xuICAgIGNvbnN0IGludGVyc2VjdCA9IHlpID49IHkgIT09IHlqID49IHkgJiYgeCA8PSAoeGogLSB4aSkgKiAoeSAtIHlpKSAvICh5aiAtIHlpKSArIHhpO1xuICAgIGlmIChpbnRlcnNlY3QpIHtcbiAgICAgIGlzSW5zaWRlID0gIWlzSW5zaWRlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaXNJbnNpZGU7XG59XG5mdW5jdGlvbiBpc0luc2lkZShwb2ludCwgcmVjdCkge1xuICByZXR1cm4gcG9pbnRbMF0gPj0gcmVjdC54ICYmIHBvaW50WzBdIDw9IHJlY3QueCArIHJlY3Qud2lkdGggJiYgcG9pbnRbMV0gPj0gcmVjdC55ICYmIHBvaW50WzFdIDw9IHJlY3QueSArIHJlY3QuaGVpZ2h0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBzYWZlIHBvbHlnb24gYXJlYSB0aGF0IHRoZSB1c2VyIGNhbiB0cmF2ZXJzZSB3aXRob3V0IGNsb3NpbmcgdGhlXG4gKiBmbG9hdGluZyBlbGVtZW50IG9uY2UgbGVhdmluZyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvdXNlSG92ZXIjc2FmZXBvbHlnb25cbiAqL1xuZnVuY3Rpb24gc2FmZVBvbHlnb24ob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBidWZmZXIgPSAwLjUsXG4gICAgYmxvY2tQb2ludGVyRXZlbnRzID0gZmFsc2UsXG4gICAgcmVxdWlyZUludGVudCA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGxldCB0aW1lb3V0SWQ7XG4gIGxldCBoYXNMYW5kZWQgPSBmYWxzZTtcbiAgbGV0IGxhc3RYID0gbnVsbDtcbiAgbGV0IGxhc3RZID0gbnVsbDtcbiAgbGV0IGxhc3RDdXJzb3JUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGZ1bmN0aW9uIGdldEN1cnNvclNwZWVkKHgsIHkpIHtcbiAgICBjb25zdCBjdXJyZW50VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gY3VycmVudFRpbWUgLSBsYXN0Q3Vyc29yVGltZTtcbiAgICBpZiAobGFzdFggPT09IG51bGwgfHwgbGFzdFkgPT09IG51bGwgfHwgZWxhcHNlZFRpbWUgPT09IDApIHtcbiAgICAgIGxhc3RYID0geDtcbiAgICAgIGxhc3RZID0geTtcbiAgICAgIGxhc3RDdXJzb3JUaW1lID0gY3VycmVudFRpbWU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZGVsdGFYID0geCAtIGxhc3RYO1xuICAgIGNvbnN0IGRlbHRhWSA9IHkgLSBsYXN0WTtcbiAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpO1xuICAgIGNvbnN0IHNwZWVkID0gZGlzdGFuY2UgLyBlbGFwc2VkVGltZTsgLy8gcHggLyBtc1xuXG4gICAgbGFzdFggPSB4O1xuICAgIGxhc3RZID0geTtcbiAgICBsYXN0Q3Vyc29yVGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIHJldHVybiBzcGVlZDtcbiAgfVxuICBjb25zdCBmbiA9IF9yZWYgPT4ge1xuICAgIGxldCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgb25DbG9zZSxcbiAgICAgIG5vZGVJZCxcbiAgICAgIHRyZWVcbiAgICB9ID0gX3JlZjtcbiAgICByZXR1cm4gZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICAgIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgb25DbG9zZSgpO1xuICAgICAgfVxuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICBpZiAoIWVsZW1lbnRzLmRvbVJlZmVyZW5jZSB8fCAhZWxlbWVudHMuZmxvYXRpbmcgfHwgcGxhY2VtZW50ID09IG51bGwgfHwgeCA9PSBudWxsIHx8IHkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNsaWVudFgsXG4gICAgICAgIGNsaWVudFlcbiAgICAgIH0gPSBldmVudDtcbiAgICAgIGNvbnN0IGNsaWVudFBvaW50ID0gW2NsaWVudFgsIGNsaWVudFldO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2ZW50KTtcbiAgICAgIGNvbnN0IGlzTGVhdmUgPSBldmVudC50eXBlID09PSAnbW91c2VsZWF2ZSc7XG4gICAgICBjb25zdCBpc092ZXJGbG9hdGluZ0VsID0gY29udGFpbnMoZWxlbWVudHMuZmxvYXRpbmcsIHRhcmdldCk7XG4gICAgICBjb25zdCBpc092ZXJSZWZlcmVuY2VFbCA9IGNvbnRhaW5zKGVsZW1lbnRzLmRvbVJlZmVyZW5jZSwgdGFyZ2V0KTtcbiAgICAgIGNvbnN0IHJlZlJlY3QgPSBlbGVtZW50cy5kb21SZWZlcmVuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCByZWN0ID0gZWxlbWVudHMuZmxvYXRpbmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBzaWRlID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG4gICAgICBjb25zdCBjdXJzb3JMZWF2ZUZyb21SaWdodCA9IHggPiByZWN0LnJpZ2h0IC0gcmVjdC53aWR0aCAvIDI7XG4gICAgICBjb25zdCBjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPSB5ID4gcmVjdC5ib3R0b20gLSByZWN0LmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBpc092ZXJSZWZlcmVuY2VSZWN0ID0gaXNJbnNpZGUoY2xpZW50UG9pbnQsIHJlZlJlY3QpO1xuICAgICAgY29uc3QgaXNGbG9hdGluZ1dpZGVyID0gcmVjdC53aWR0aCA+IHJlZlJlY3Qud2lkdGg7XG4gICAgICBjb25zdCBpc0Zsb2F0aW5nVGFsbGVyID0gcmVjdC5oZWlnaHQgPiByZWZSZWN0LmhlaWdodDtcbiAgICAgIGNvbnN0IGxlZnQgPSAoaXNGbG9hdGluZ1dpZGVyID8gcmVmUmVjdCA6IHJlY3QpLmxlZnQ7XG4gICAgICBjb25zdCByaWdodCA9IChpc0Zsb2F0aW5nV2lkZXIgPyByZWZSZWN0IDogcmVjdCkucmlnaHQ7XG4gICAgICBjb25zdCB0b3AgPSAoaXNGbG9hdGluZ1RhbGxlciA/IHJlZlJlY3QgOiByZWN0KS50b3A7XG4gICAgICBjb25zdCBib3R0b20gPSAoaXNGbG9hdGluZ1RhbGxlciA/IHJlZlJlY3QgOiByZWN0KS5ib3R0b207XG4gICAgICBpZiAoaXNPdmVyRmxvYXRpbmdFbCkge1xuICAgICAgICBoYXNMYW5kZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIWlzTGVhdmUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc092ZXJSZWZlcmVuY2VFbCkge1xuICAgICAgICBoYXNMYW5kZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc092ZXJSZWZlcmVuY2VFbCAmJiAhaXNMZWF2ZSkge1xuICAgICAgICBoYXNMYW5kZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXZlbnQgb3ZlcmxhcHBpbmcgZmxvYXRpbmcgZWxlbWVudCBmcm9tIGJlaW5nIHN0dWNrIGluIGFuIG9wZW4tY2xvc2VcbiAgICAgIC8vIGxvb3A6IGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMTkxMFxuICAgICAgaWYgKGlzTGVhdmUgJiYgaXNFbGVtZW50KGV2ZW50LnJlbGF0ZWRUYXJnZXQpICYmIGNvbnRhaW5zKGVsZW1lbnRzLmZsb2F0aW5nLCBldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGFueSBuZXN0ZWQgY2hpbGQgaXMgb3BlbiwgYWJvcnQuXG4gICAgICBpZiAodHJlZSAmJiBnZXRDaGlsZHJlbih0cmVlLm5vZGVzUmVmLmN1cnJlbnQsIG5vZGVJZCkuc29tZShfcmVmMiA9PiB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgY29udGV4dFxuICAgICAgICB9ID0gX3JlZjI7XG4gICAgICAgIHJldHVybiBjb250ZXh0ID09IG51bGwgPyB2b2lkIDAgOiBjb250ZXh0Lm9wZW47XG4gICAgICB9KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBwb2ludGVyIGlzIGxlYXZpbmcgZnJvbSB0aGUgb3Bwb3NpdGUgc2lkZSwgdGhlIFwiYnVmZmVyXCIgbG9naWNcbiAgICAgIC8vIGNyZWF0ZXMgYSBwb2ludCB3aGVyZSB0aGUgZmxvYXRpbmcgZWxlbWVudCByZW1haW5zIG9wZW4sIGJ1dCBzaG91bGQgYmVcbiAgICAgIC8vIGlnbm9yZWQuXG4gICAgICAvLyBBIGNvbnN0YW50IG9mIDEgaGFuZGxlcyBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnMuXG4gICAgICBpZiAoc2lkZSA9PT0gJ3RvcCcgJiYgeSA+PSByZWZSZWN0LmJvdHRvbSAtIDEgfHwgc2lkZSA9PT0gJ2JvdHRvbScgJiYgeSA8PSByZWZSZWN0LnRvcCArIDEgfHwgc2lkZSA9PT0gJ2xlZnQnICYmIHggPj0gcmVmUmVjdC5yaWdodCAtIDEgfHwgc2lkZSA9PT0gJ3JpZ2h0JyAmJiB4IDw9IHJlZlJlY3QubGVmdCArIDEpIHtcbiAgICAgICAgcmV0dXJuIGNsb3NlKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElnbm9yZSB3aGVuIHRoZSBjdXJzb3IgaXMgd2l0aGluIHRoZSByZWN0YW5ndWxhciB0cm91Z2ggYmV0d2VlbiB0aGVcbiAgICAgIC8vIHR3byBlbGVtZW50cy4gU2luY2UgdGhlIHRyaWFuZ2xlIGlzIGNyZWF0ZWQgZnJvbSB0aGUgY3Vyc29yIHBvaW50LFxuICAgICAgLy8gd2hpY2ggY2FuIHN0YXJ0IGJleW9uZCB0aGUgcmVmIGVsZW1lbnQncyBlZGdlLCB0cmF2ZXJzaW5nIGJhY2sgYW5kXG4gICAgICAvLyBmb3J0aCBmcm9tIHRoZSByZWYgdG8gdGhlIGZsb2F0aW5nIGVsZW1lbnQgY2FuIGNhdXNlIGl0IHRvIGNsb3NlLiBUaGlzXG4gICAgICAvLyBlbnN1cmVzIGl0IGFsd2F5cyByZW1haW5zIG9wZW4gaW4gdGhhdCBjYXNlLlxuICAgICAgbGV0IHJlY3RQb2x5ID0gW107XG4gICAgICBzd2l0Y2ggKHNpZGUpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICByZWN0UG9seSA9IFtbbGVmdCwgcmVmUmVjdC50b3AgKyAxXSwgW2xlZnQsIHJlY3QuYm90dG9tIC0gMV0sIFtyaWdodCwgcmVjdC5ib3R0b20gLSAxXSwgW3JpZ2h0LCByZWZSZWN0LnRvcCArIDFdXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICByZWN0UG9seSA9IFtbbGVmdCwgcmVjdC50b3AgKyAxXSwgW2xlZnQsIHJlZlJlY3QuYm90dG9tIC0gMV0sIFtyaWdodCwgcmVmUmVjdC5ib3R0b20gLSAxXSwgW3JpZ2h0LCByZWN0LnRvcCArIDFdXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgcmVjdFBvbHkgPSBbW3JlY3QucmlnaHQgLSAxLCBib3R0b21dLCBbcmVjdC5yaWdodCAtIDEsIHRvcF0sIFtyZWZSZWN0LmxlZnQgKyAxLCB0b3BdLCBbcmVmUmVjdC5sZWZ0ICsgMSwgYm90dG9tXV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICByZWN0UG9seSA9IFtbcmVmUmVjdC5yaWdodCAtIDEsIGJvdHRvbV0sIFtyZWZSZWN0LnJpZ2h0IC0gMSwgdG9wXSwgW3JlY3QubGVmdCArIDEsIHRvcF0sIFtyZWN0LmxlZnQgKyAxLCBib3R0b21dXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGdldFBvbHlnb24oX3JlZjMpIHtcbiAgICAgICAgbGV0IFt4LCB5XSA9IF9yZWYzO1xuICAgICAgICBzd2l0Y2ggKHNpZGUpIHtcbiAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludE9uZSA9IFtpc0Zsb2F0aW5nV2lkZXIgPyB4ICsgYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8geCArIGJ1ZmZlciAqIDQgOiB4IC0gYnVmZmVyICogNCwgeSArIGJ1ZmZlciArIDFdO1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludFR3byA9IFtpc0Zsb2F0aW5nV2lkZXIgPyB4IC0gYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8geCArIGJ1ZmZlciAqIDQgOiB4IC0gYnVmZmVyICogNCwgeSArIGJ1ZmZlciArIDFdO1xuICAgICAgICAgICAgICBjb25zdCBjb21tb25Qb2ludHMgPSBbW3JlY3QubGVmdCwgY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyByZWN0LmJvdHRvbSAtIGJ1ZmZlciA6IGlzRmxvYXRpbmdXaWRlciA/IHJlY3QuYm90dG9tIC0gYnVmZmVyIDogcmVjdC50b3BdLCBbcmVjdC5yaWdodCwgY3Vyc29yTGVhdmVGcm9tUmlnaHQgPyBpc0Zsb2F0aW5nV2lkZXIgPyByZWN0LmJvdHRvbSAtIGJ1ZmZlciA6IHJlY3QudG9wIDogcmVjdC5ib3R0b20gLSBidWZmZXJdXTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtjdXJzb3JQb2ludE9uZSwgY3Vyc29yUG9pbnRUd28sIC4uLmNvbW1vblBvaW50c107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRPbmUgPSBbaXNGbG9hdGluZ1dpZGVyID8geCArIGJ1ZmZlciAvIDIgOiBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IHggKyBidWZmZXIgKiA0IDogeCAtIGJ1ZmZlciAqIDQsIHkgLSBidWZmZXJdO1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludFR3byA9IFtpc0Zsb2F0aW5nV2lkZXIgPyB4IC0gYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbVJpZ2h0ID8geCArIGJ1ZmZlciAqIDQgOiB4IC0gYnVmZmVyICogNCwgeSAtIGJ1ZmZlcl07XG4gICAgICAgICAgICAgIGNvbnN0IGNvbW1vblBvaW50cyA9IFtbcmVjdC5sZWZ0LCBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IHJlY3QudG9wICsgYnVmZmVyIDogaXNGbG9hdGluZ1dpZGVyID8gcmVjdC50b3AgKyBidWZmZXIgOiByZWN0LmJvdHRvbV0sIFtyZWN0LnJpZ2h0LCBjdXJzb3JMZWF2ZUZyb21SaWdodCA/IGlzRmxvYXRpbmdXaWRlciA/IHJlY3QudG9wICsgYnVmZmVyIDogcmVjdC5ib3R0b20gOiByZWN0LnRvcCArIGJ1ZmZlcl1dO1xuICAgICAgICAgICAgICByZXR1cm4gW2N1cnNvclBvaW50T25lLCBjdXJzb3JQb2ludFR3bywgLi4uY29tbW9uUG9pbnRzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRPbmUgPSBbeCArIGJ1ZmZlciArIDEsIGlzRmxvYXRpbmdUYWxsZXIgPyB5ICsgYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHkgKyBidWZmZXIgKiA0IDogeSAtIGJ1ZmZlciAqIDRdO1xuICAgICAgICAgICAgICBjb25zdCBjdXJzb3JQb2ludFR3byA9IFt4ICsgYnVmZmVyICsgMSwgaXNGbG9hdGluZ1RhbGxlciA/IHkgLSBidWZmZXIgLyAyIDogY3Vyc29yTGVhdmVGcm9tQm90dG9tID8geSArIGJ1ZmZlciAqIDQgOiB5IC0gYnVmZmVyICogNF07XG4gICAgICAgICAgICAgIGNvbnN0IGNvbW1vblBvaW50cyA9IFtbY3Vyc29yTGVhdmVGcm9tQm90dG9tID8gcmVjdC5yaWdodCAtIGJ1ZmZlciA6IGlzRmxvYXRpbmdUYWxsZXIgPyByZWN0LnJpZ2h0IC0gYnVmZmVyIDogcmVjdC5sZWZ0LCByZWN0LnRvcF0sIFtjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyBpc0Zsb2F0aW5nVGFsbGVyID8gcmVjdC5yaWdodCAtIGJ1ZmZlciA6IHJlY3QubGVmdCA6IHJlY3QucmlnaHQgLSBidWZmZXIsIHJlY3QuYm90dG9tXV07XG4gICAgICAgICAgICAgIHJldHVybiBbLi4uY29tbW9uUG9pbnRzLCBjdXJzb3JQb2ludE9uZSwgY3Vyc29yUG9pbnRUd29dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9pbnRPbmUgPSBbeCAtIGJ1ZmZlciwgaXNGbG9hdGluZ1RhbGxlciA/IHkgKyBidWZmZXIgLyAyIDogY3Vyc29yTGVhdmVGcm9tQm90dG9tID8geSArIGJ1ZmZlciAqIDQgOiB5IC0gYnVmZmVyICogNF07XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvaW50VHdvID0gW3ggLSBidWZmZXIsIGlzRmxvYXRpbmdUYWxsZXIgPyB5IC0gYnVmZmVyIC8gMiA6IGN1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHkgKyBidWZmZXIgKiA0IDogeSAtIGJ1ZmZlciAqIDRdO1xuICAgICAgICAgICAgICBjb25zdCBjb21tb25Qb2ludHMgPSBbW2N1cnNvckxlYXZlRnJvbUJvdHRvbSA/IHJlY3QubGVmdCArIGJ1ZmZlciA6IGlzRmxvYXRpbmdUYWxsZXIgPyByZWN0LmxlZnQgKyBidWZmZXIgOiByZWN0LnJpZ2h0LCByZWN0LnRvcF0sIFtjdXJzb3JMZWF2ZUZyb21Cb3R0b20gPyBpc0Zsb2F0aW5nVGFsbGVyID8gcmVjdC5sZWZ0ICsgYnVmZmVyIDogcmVjdC5yaWdodCA6IHJlY3QubGVmdCArIGJ1ZmZlciwgcmVjdC5ib3R0b21dXTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtjdXJzb3JQb2ludE9uZSwgY3Vyc29yUG9pbnRUd28sIC4uLmNvbW1vblBvaW50c107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc1BvaW50SW5Qb2x5Z29uKFtjbGllbnRYLCBjbGllbnRZXSwgcmVjdFBvbHkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNMYW5kZWQgJiYgIWlzT3ZlclJlZmVyZW5jZVJlY3QpIHtcbiAgICAgICAgcmV0dXJuIGNsb3NlKCk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzTGVhdmUgJiYgcmVxdWlyZUludGVudCkge1xuICAgICAgICBjb25zdCBjdXJzb3JTcGVlZCA9IGdldEN1cnNvclNwZWVkKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgICBjb25zdCBjdXJzb3JTcGVlZFRocmVzaG9sZCA9IDAuMTtcbiAgICAgICAgaWYgKGN1cnNvclNwZWVkICE9PSBudWxsICYmIGN1cnNvclNwZWVkIDwgY3Vyc29yU3BlZWRUaHJlc2hvbGQpIHtcbiAgICAgICAgICByZXR1cm4gY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1BvaW50SW5Qb2x5Z29uKFtjbGllbnRYLCBjbGllbnRZXSwgZ2V0UG9seWdvbihbeCwgeV0pKSkge1xuICAgICAgICBjbG9zZSgpO1xuICAgICAgfSBlbHNlIGlmICghaGFzTGFuZGVkICYmIHJlcXVpcmVJbnRlbnQpIHtcbiAgICAgICAgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoY2xvc2UsIDQwKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICBmbi5fX29wdGlvbnMgPSB7XG4gICAgYmxvY2tQb2ludGVyRXZlbnRzXG4gIH07XG4gIHJldHVybiBmbjtcbn1cblxuZXhwb3J0IHsgQ29tcG9zaXRlLCBDb21wb3NpdGVJdGVtLCBGbG9hdGluZ0Fycm93LCBGbG9hdGluZ0RlbGF5R3JvdXAsIEZsb2F0aW5nRm9jdXNNYW5hZ2VyLCBGbG9hdGluZ0xpc3QsIEZsb2F0aW5nTm9kZSwgRmxvYXRpbmdPdmVybGF5LCBGbG9hdGluZ1BvcnRhbCwgRmxvYXRpbmdUcmVlLCBpbm5lciwgc2FmZVBvbHlnb24sIHVzZUNsaWNrLCB1c2VDbGllbnRQb2ludCwgdXNlRGVsYXlHcm91cCwgdXNlRGVsYXlHcm91cENvbnRleHQsIHVzZURpc21pc3MsIHVzZUZsb2F0aW5nLCB1c2VGbG9hdGluZ05vZGVJZCwgdXNlRmxvYXRpbmdQYXJlbnROb2RlSWQsIHVzZUZsb2F0aW5nUG9ydGFsTm9kZSwgdXNlRmxvYXRpbmdSb290Q29udGV4dCwgdXNlRmxvYXRpbmdUcmVlLCB1c2VGb2N1cywgdXNlSG92ZXIsIHVzZUlkLCB1c2VJbm5lck9mZnNldCwgdXNlSW50ZXJhY3Rpb25zLCB1c2VMaXN0SXRlbSwgdXNlTGlzdE5hdmlnYXRpb24sIHVzZU1lcmdlUmVmcywgdXNlUm9sZSwgdXNlVHJhbnNpdGlvblN0YXR1cywgdXNlVHJhbnNpdGlvblN0eWxlcywgdXNlVHlwZWFoZWFkIH07XG4iLCJpbXBvcnQgcGFrbyBmcm9tICdwYWtvJztcblxudmFyIGNvbW1vbmpzR2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge307XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuLCBtb2R1bGUpIHtcblx0cmV0dXJuIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfSwgZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzO1xufVxuXG5mdW5jdGlvbiBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlIChuKSB7XG5cdHJldHVybiBuICYmIG5bJ2RlZmF1bHQnXSB8fCBuO1xufVxuXG52YXIgYnl0ZUxlbmd0aF8xID0gYnl0ZUxlbmd0aDtcbnZhciB0b0J5dGVBcnJheV8xID0gdG9CeXRlQXJyYXk7XG52YXIgZnJvbUJ5dGVBcnJheV8xID0gZnJvbUJ5dGVBcnJheTtcbnZhciBsb29rdXAgPSBbXTtcbnZhciByZXZMb29rdXAgPSBbXTtcbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXk7XG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcblxuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXTtcbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpO1xufSAvLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5cblxucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyO1xucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzO1xuXG5mdW5jdGlvbiBnZXRMZW5zKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aDtcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKTtcbiAgfSAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG5cblxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpO1xuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlbjtcbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW4gPyAwIDogNCAtIHZhbGlkTGVuICUgNDtcbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXTtcbn0gLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NCk7XG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF07XG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdO1xuICByZXR1cm4gKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzTGVuO1xufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCAtIHBsYWNlSG9sZGVyc0xlbjtcbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkoYjY0KSB7XG4gIHZhciB0bXA7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpO1xuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdO1xuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXTtcbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSk7XG4gIHZhciBjdXJCeXRlID0gMDsgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwID8gdmFsaWRMZW4gLSA0IDogdmFsaWRMZW47XG4gIHZhciBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTggfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMiB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXTtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCA+PiAxNiAmIDB4RkY7XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgPj4gOCAmIDB4RkY7XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGO1xuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMiB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQ7XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGO1xuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTAgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0IHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMjtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCA+PiA4ICYgMHhGRjtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkY7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArIGxvb2t1cFtudW0gJiAweDNGXTtcbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcDtcbiAgdmFyIG91dHB1dCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2ICYgMHhGRjAwMDApICsgKHVpbnQ4W2kgKyAxXSA8PCA4ICYgMHhGRjAwKSArICh1aW50OFtpICsgMl0gJiAweEZGKTtcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5KHVpbnQ4KSB7XG4gIHZhciB0bXA7XG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGg7XG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMzsgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcblxuICB2YXIgcGFydHMgPSBbXTtcbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODM7IC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIGkgKyBtYXhDaHVua0xlbmd0aCA+IGxlbjIgPyBsZW4yIDogaSArIG1heENodW5rTGVuZ3RoKSk7XG4gIH0gLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuXG5cbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXTtcbiAgICBwYXJ0cy5wdXNoKGxvb2t1cFt0bXAgPj4gMl0gKyBsb29rdXBbdG1wIDw8IDQgJiAweDNGXSArICc9PScpO1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXTtcbiAgICBwYXJ0cy5wdXNoKGxvb2t1cFt0bXAgPj4gMTBdICsgbG9va3VwW3RtcCA+PiA0ICYgMHgzRl0gKyBsb29rdXBbdG1wIDw8IDIgJiAweDNGXSArICc9Jyk7XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJyk7XG59XG5cbnZhciBiYXNlNjRKcyA9IHtcbiAgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aF8xLFxuICB0b0J5dGVBcnJheTogdG9CeXRlQXJyYXlfMSxcbiAgZnJvbUJ5dGVBcnJheTogZnJvbUJ5dGVBcnJheV8xXG59O1xuXG52YXIgcmVhZCA9IGZ1bmN0aW9uIHJlYWQoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbTtcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBuQml0cyA9IC03O1xuICB2YXIgaSA9IGlzTEUgPyBuQnl0ZXMgLSAxIDogMDtcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxO1xuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXTtcbiAgaSArPSBkO1xuICBlID0gcyAmICgxIDw8IC1uQml0cykgLSAxO1xuICBzID4+PSAtbkJpdHM7XG4gIG5CaXRzICs9IGVMZW47XG5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgxIDw8IC1uQml0cykgLSAxO1xuICBlID4+PSAtbkJpdHM7XG4gIG5CaXRzICs9IG1MZW47XG5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXM7XG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKHMgPyAtMSA6IDEpICogSW5maW5pdHk7XG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKTtcbiAgICBlID0gZSAtIGVCaWFzO1xuICB9XG5cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbik7XG59O1xuXG52YXIgd3JpdGUgPSBmdW5jdGlvbiB3cml0ZShidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgYztcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBydCA9IG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwO1xuICB2YXIgaSA9IGlzTEUgPyAwIDogbkJ5dGVzIC0gMTtcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xO1xuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCB2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwID8gMSA6IDA7XG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpO1xuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwO1xuICAgIGUgPSBlTWF4O1xuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKTtcblxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLTtcbiAgICAgIGMgKj0gMjtcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrO1xuICAgICAgYyAvPSAyO1xuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDA7XG4gICAgICBlID0gZU1heDtcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbik7XG4gICAgICBlID0gZSArIGVCaWFzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbik7XG4gICAgICBlID0gMDtcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSBlIDw8IG1MZW4gfCBtO1xuICBlTGVuICs9IG1MZW47XG5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyODtcbn07XG5cbnZhciBpZWVlNzU0ID0ge1xuICByZWFkOiByZWFkLFxuICB3cml0ZTogd3JpdGVcbn07XG5cbnZhciBidWZmZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cbiAgdmFyIGN1c3RvbUluc3BlY3RTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2xbXCJmb3JcIl0gPT09ICdmdW5jdGlvbicgPyBTeW1ib2xbXCJmb3JcIl0oJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJykgOiBudWxsO1xuICBleHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlcjtcbiAgZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlcjtcbiAgZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwO1xuICB2YXIgS19NQVhfTEVOR1RIID0gMHg3ZmZmZmZmZjtcbiAgZXhwb3J0cy5rTWF4TGVuZ3RoID0gS19NQVhfTEVOR1RIO1xuICAvKipcbiAgICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAgICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAgICogICA9PT0gZmFsc2UgICBQcmludCB3YXJuaW5nIGFuZCByZWNvbW1lbmQgdXNpbmcgYGJ1ZmZlcmAgdjQueCB3aGljaCBoYXMgYW4gT2JqZWN0XG4gICAqICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gICAqXG4gICAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAgICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICAgKlxuICAgKiBXZSByZXBvcnQgdGhhdCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBpZiB0aGUgYXJlIG5vdCBzdWJjbGFzc2FibGVcbiAgICogdXNpbmcgX19wcm90b19fLiBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YFxuICAgKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gICAqIGZvciBfX3Byb3RvX18gYW5kIGhhcyBhIGJ1Z2d5IHR5cGVkIGFycmF5IGltcGxlbWVudGF0aW9uLlxuICAgKi9cblxuICBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IHR5cGVkQXJyYXlTdXBwb3J0KCk7XG5cbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKCdUaGlzIGJyb3dzZXIgbGFja3MgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpIHN1cHBvcnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgJyArICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LicpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQoKSB7XG4gICAgLy8gQ2FuIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkP1xuICAgIHRyeSB7XG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSk7XG4gICAgICB2YXIgcHJvdG8gPSB7XG4gICAgICAgIGZvbzogZnVuY3Rpb24gZm9vKCkge1xuICAgICAgICAgIHJldHVybiA0MjtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm90bywgVWludDhBcnJheS5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGFyciwgcHJvdG8pO1xuICAgICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDI7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAncGFyZW50Jywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ29mZnNldCcsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0O1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQnVmZmVyKGxlbmd0aCkge1xuICAgIGlmIChsZW5ndGggPiBLX01BWF9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgbGVuZ3RoICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpO1xuICAgIH0gLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcblxuXG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyLnByb3RvdHlwZSk7XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuICAvKipcbiAgICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gICAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAgICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICAgKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICAgKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICAgKlxuICAgKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gICAgLy8gQ29tbW9uIGNhc2UuXG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIEJ1ZmZlci5wb29sU2l6ZSA9IDgxOTI7IC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuICBmdW5jdGlvbiBmcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpO1xuICAgIH1cblxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgKyAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGlzSW5zdGFuY2UodmFsdWUsIEFycmF5QnVmZmVyKSB8fCB2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgQXJyYXlCdWZmZXIpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIChpc0luc3RhbmNlKHZhbHVlLCBTaGFyZWRBcnJheUJ1ZmZlcikgfHwgdmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIFNoYXJlZEFycmF5QnVmZmVyKSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJyk7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlT2YgPSB2YWx1ZS52YWx1ZU9mICYmIHZhbHVlLnZhbHVlT2YoKTtcblxuICAgIGlmICh2YWx1ZU9mICE9IG51bGwgJiYgdmFsdWVPZiAhPT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZU9mLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpO1xuICAgIH1cblxuICAgIHZhciBiID0gZnJvbU9iamVjdCh2YWx1ZSk7XG4gICAgaWYgKGIpIHJldHVybiBiO1xuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1ByaW1pdGl2ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSgnc3RyaW5nJyksIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAgICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gICAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAgICogQnVmZmVyLmZyb20oYXJyYXkpXG4gICAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAgICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gICAqKi9cblxuXG4gIEJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgfTsgLy8gTm90ZTogQ2hhbmdlIHByb3RvdHlwZSAqYWZ0ZXIqIEJ1ZmZlci5mcm9tIGlzIGRlZmluZWQgdG8gd29ya2Fyb3VuZCBDaHJvbWUgYnVnOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzE0OFxuXG5cbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlci5wcm90b3R5cGUsIFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlciwgVWludDhBcnJheSk7XG5cbiAgZnVuY3Rpb24gYXNzZXJ0U2l6ZShzaXplKSB7XG4gICAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpO1xuICAgIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgc2l6ZSArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICAgIGFzc2VydFNpemUoc2l6ZSk7XG5cbiAgICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpO1xuICAgIH1cblxuICAgIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyA/IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKSA6IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAgICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICAgKiovXG5cblxuICBCdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgICByZXR1cm4gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGFsbG9jVW5zYWZlKHNpemUpIHtcbiAgICBhc3NlcnRTaXplKHNpemUpO1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApO1xuICB9XG4gIC8qKlxuICAgKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICAgKiAqL1xuXG5cbiAgQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSk7XG4gIH07XG4gIC8qKlxuICAgKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAgICovXG5cblxuICBCdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gZnJvbVN0cmluZyhzdHJpbmcsIGVuY29kaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgICB9XG5cbiAgICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgICB9XG5cbiAgICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDA7XG4gICAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpO1xuICAgIHZhciBhY3R1YWwgPSBidWYud3JpdGUoc3RyaW5nLCBlbmNvZGluZyk7XG5cbiAgICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgICAgYnVmID0gYnVmLnNsaWNlKDAsIGFjdHVhbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyb21BcnJheUxpa2UoYXJyYXkpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwO1xuICAgIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1O1xuICAgIH1cblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICBmdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJyk7XG4gICAgfVxuXG4gICAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wibGVuZ3RoXCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJyk7XG4gICAgfVxuXG4gICAgdmFyIGJ1ZjtcblxuICAgIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5KTtcbiAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICAgIH0gLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcblxuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyLnByb3RvdHlwZSk7XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDA7XG4gICAgICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbik7XG5cbiAgICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBidWY7XG4gICAgICB9XG5cbiAgICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuKTtcbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuXG4gICAgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBudW1iZXJJc05hTihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmopO1xuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iai5kYXRhKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja2VkKGxlbmd0aCkge1xuICAgIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IEtfTUFYX0xFTkdUSGAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAgIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICAgIGlmIChsZW5ndGggPj0gS19NQVhfTEVOR1RIKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICsgJ3NpemU6IDB4JyArIEtfTUFYX0xFTkdUSC50b1N0cmluZygxNikgKyAnIGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlbmd0aCB8IDA7XG4gIH1cblxuICBmdW5jdGlvbiBTbG93QnVmZmVyKGxlbmd0aCkge1xuICAgIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICAgIGxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKTtcbiAgfVxuXG4gIEJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyKGIpIHtcbiAgICByZXR1cm4gYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyID09PSB0cnVlICYmIGIgIT09IEJ1ZmZlci5wcm90b3R5cGU7IC8vIHNvIEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIucHJvdG90eXBlKSB3aWxsIGJlIGZhbHNlXG4gIH07XG5cbiAgQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkgYSA9IEJ1ZmZlci5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpO1xuICAgIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aCk7XG5cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKGEgPT09IGIpIHJldHVybiAwO1xuICAgIHZhciB4ID0gYS5sZW5ndGg7XG4gICAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgICB4ID0gYVtpXTtcbiAgICAgICAgeSA9IGJbaV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh4IDwgeSkgcmV0dXJuIC0xO1xuICAgIGlmICh5IDwgeCkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIDA7XG4gIH07XG5cbiAgQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nKGVuY29kaW5nKSB7XG4gICAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIEJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQobGlzdCwgbGVuZ3RoKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtcbiAgICB9XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gICAgfVxuXG4gICAgdmFyIGk7XG5cbiAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGxlbmd0aCA9IDA7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aCk7XG4gICAgdmFyIHBvcyA9IDA7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGJ1ZiA9IGxpc3RbaV07XG5cbiAgICAgIGlmIChpc0luc3RhbmNlKGJ1ZiwgVWludDhBcnJheSkpIHtcbiAgICAgICAgYnVmID0gQnVmZmVyLmZyb20oYnVmKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtcbiAgICAgIH1cblxuICAgICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpO1xuICAgICAgcG9zICs9IGJ1Zi5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfTtcblxuICBmdW5jdGlvbiBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICAgIHJldHVybiBzdHJpbmcubGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBpc0luc3RhbmNlKHN0cmluZywgQXJyYXlCdWZmZXIpKSB7XG4gICAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gJyArICdSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2Ygc3RyaW5nKTtcbiAgICB9XG5cbiAgICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aDtcbiAgICB2YXIgbXVzdE1hdGNoID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdID09PSB0cnVlO1xuICAgIGlmICghbXVzdE1hdGNoICYmIGxlbiA9PT0gMCkgcmV0dXJuIDA7IC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuXG4gICAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2U7XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgICByZXR1cm4gbGVuO1xuXG4gICAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoO1xuXG4gICAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgICAgcmV0dXJuIGxlbiAqIDI7XG5cbiAgICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgICByZXR1cm4gbGVuID4+PiAxO1xuXG4gICAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGg7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAobG93ZXJlZENhc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBtdXN0TWF0Y2ggPyAtMSA6IHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoOyAvLyBhc3N1bWUgdXRmOFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDtcblxuICBmdW5jdGlvbiBzbG93VG9TdHJpbmcoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZTsgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gICAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cbiAgICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gICAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cblxuICAgIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH0gLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuXG5cbiAgICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKGVuZCA8PSAwKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuXG5cbiAgICBlbmQgPj4+PSAwO1xuICAgIHN0YXJ0ID4+Pj0gMDtcblxuICAgIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4JztcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKTtcblxuICAgICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgY2FzZSAndWNzMic6XG4gICAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICAgICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgKGFuZCB0aGUgYGlzLWJ1ZmZlcmAgbnBtIHBhY2thZ2UpXG4gIC8vIHRvIGRldGVjdCBhIEJ1ZmZlciBpbnN0YW5jZS4gSXQncyBub3QgcG9zc2libGUgdG8gdXNlIGBpbnN0YW5jZW9mIEJ1ZmZlcmBcbiAgLy8gcmVsaWFibHkgaW4gYSBicm93c2VyaWZ5IGNvbnRleHQgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBkaWZmZXJlbnRcbiAgLy8gY29waWVzIG9mIHRoZSAnYnVmZmVyJyBwYWNrYWdlIGluIHVzZS4gVGhpcyBtZXRob2Qgd29ya3MgZXZlbiBmb3IgQnVmZmVyXG4gIC8vIGluc3RhbmNlcyB0aGF0IHdlcmUgY3JlYXRlZCBmcm9tIGFub3RoZXIgY29weSBvZiB0aGUgYGJ1ZmZlcmAgcGFja2FnZS5cbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTU0XG5cblxuICBCdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWU7XG5cbiAgZnVuY3Rpb24gc3dhcChiLCBuLCBtKSB7XG4gICAgdmFyIGkgPSBiW25dO1xuICAgIGJbbl0gPSBiW21dO1xuICAgIGJbbV0gPSBpO1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYoKSB7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoO1xuXG4gICAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICAgIHN3YXAodGhpcywgaSwgaSArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyKCkge1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcblxuICAgIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgICBzd2FwKHRoaXMsIGksIGkgKyAzKTtcbiAgICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCgpIHtcbiAgICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG5cbiAgICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgICAgc3dhcCh0aGlzLCBpLCBpICsgNyk7XG4gICAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNik7XG4gICAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSk7XG4gICAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKTtcbiAgICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZyA9IEJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmc7XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMoYikge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJyk7XG4gICAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUztcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLnJlcGxhY2UoLyguezJ9KS9nLCAnJDEgJykudHJpbSgpO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICc7XG4gICAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPic7XG4gIH07XG5cbiAgaWYgKGN1c3RvbUluc3BlY3RTeW1ib2wpIHtcbiAgICBCdWZmZXIucHJvdG90eXBlW2N1c3RvbUluc3BlY3RTeW1ib2xdID0gQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0O1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICAgIGlmIChpc0luc3RhbmNlKHRhcmdldCwgVWludDhBcnJheSkpIHtcbiAgICAgIHRhcmdldCA9IEJ1ZmZlci5mcm9tKHRhcmdldCwgdGFyZ2V0Lm9mZnNldCwgdGFyZ2V0LmJ5dGVMZW5ndGgpO1xuICAgIH1cblxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuICcgKyAnUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHRhcmdldCk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwO1xuICAgIH1cblxuICAgIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpc1N0YXJ0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgc3RhcnQgPj4+PSAwO1xuICAgIGVuZCA+Pj49IDA7XG4gICAgdGhpc1N0YXJ0ID4+Pj0gMDtcbiAgICB0aGlzRW5kID4+Pj0gMDtcbiAgICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMDtcbiAgICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnQ7XG4gICAgdmFyIHkgPSBlbmQgLSBzdGFydDtcbiAgICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSk7XG4gICAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpO1xuICAgIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICAgIHggPSB0aGlzQ29weVtpXTtcbiAgICAgICAgeSA9IHRhcmdldENvcHlbaV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh4IDwgeSkgcmV0dXJuIC0xO1xuICAgIGlmICh5IDwgeCkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIDA7XG4gIH07IC8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbiAgLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbiAgLy9cbiAgLy8gQXJndW1lbnRzOlxuICAvLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuICAvLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuICAvLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbiAgLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbiAgLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcblxuXG4gIGZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gICAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMTsgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcblxuICAgIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldDtcbiAgICAgIGJ5dGVPZmZzZXQgPSAwO1xuICAgIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmO1xuICAgIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDA7XG4gICAgfVxuXG4gICAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0OyAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuXG4gICAgaWYgKG51bWJlcklzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogYnVmZmVyLmxlbmd0aCAtIDE7XG4gICAgfSAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuXG5cbiAgICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldDtcblxuICAgIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgIGlmIChkaXIpIHJldHVybiAtMTtlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMTtcbiAgICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMDtlbHNlIHJldHVybiAtMTtcbiAgICB9IC8vIE5vcm1hbGl6ZSB2YWxcblxuXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKTtcbiAgICB9IC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG5cblxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICB2YWwgPSB2YWwgJiAweEZGOyAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG5cbiAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoZGlyKSB7XG4gICAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbdmFsXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcik7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJyk7XG4gIH1cblxuICBmdW5jdGlvbiBhcnJheUluZGV4T2YoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgICB2YXIgaW5kZXhTaXplID0gMTtcbiAgICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aDtcblxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHwgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleFNpemUgPSAyO1xuICAgICAgICBhcnJMZW5ndGggLz0gMjtcbiAgICAgICAgdmFsTGVuZ3RoIC89IDI7XG4gICAgICAgIGJ5dGVPZmZzZXQgLz0gMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWFkKGJ1ZiwgaSkge1xuICAgICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYnVmW2ldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGk7XG5cbiAgICBpZiAoZGlyKSB7XG4gICAgICB2YXIgZm91bmRJbmRleCA9IC0xO1xuXG4gICAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGk7XG4gICAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXg7XG4gICAgICAgICAgZm91bmRJbmRleCA9IC0xO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoO1xuXG4gICAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBCdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXModmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICAgIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICAgIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICAgIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gaGV4V3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMDtcbiAgICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldDtcblxuICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xuXG4gICAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgICBsZW5ndGggPSBzdHJMZW4gLyAyO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpO1xuICAgICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpO1xuICAgICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkO1xuICAgIH1cblxuICAgIHJldHVybiBpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXRmOFdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aCk7XG4gIH1cblxuICBmdW5jdGlvbiBsYXRpbjFXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpO1xuICB9XG5cbiAgZnVuY3Rpb24gYmFzZTY0V3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVjczJXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZShzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAgIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gICAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgICAgb2Zmc2V0ID0gMDsgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gICAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBvZmZzZXQ7XG4gICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICAgIG9mZnNldCA9IDA7IC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gICAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG5cbiAgICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gMDtcbiAgICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5jb2RpbmcgPSBsZW5ndGg7XG4gICAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCcpO1xuICAgIH1cblxuICAgIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldDtcbiAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmc7XG5cbiAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpO1xuICAgIH1cblxuICAgIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnO1xuICAgIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlO1xuXG4gICAgZm9yICg7Oykge1xuICAgICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgICBjYXNlICdoZXgnOlxuICAgICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKTtcblxuICAgICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCk7XG5cbiAgICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpO1xuXG4gICAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpO1xuXG4gICAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCk7XG5cbiAgICAgICAgY2FzZSAndWNzMic6XG4gICAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICAgICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIGJhc2U2NFNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICAgIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBiYXNlNjRKcy5mcm9tQnl0ZUFycmF5KGJ1Zik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBiYXNlNjRKcy5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXRmOFNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICAgIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZCk7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBpID0gc3RhcnQ7XG5cbiAgICB3aGlsZSAoaSA8IGVuZCkge1xuICAgICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXTtcbiAgICAgIHZhciBjb2RlUG9pbnQgPSBudWxsO1xuICAgICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSBmaXJzdEJ5dGUgPiAweEVGID8gNCA6IGZpcnN0Qnl0ZSA+IDB4REYgPyAzIDogZmlyc3RCeXRlID4gMHhCRiA/IDIgOiAxO1xuXG4gICAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnQ7XG5cbiAgICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdO1xuXG4gICAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IHNlY29uZEJ5dGUgJiAweDNGO1xuXG4gICAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl07XG5cbiAgICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCB0aGlyZEJ5dGUgJiAweDNGO1xuXG4gICAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdO1xuICAgICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM107XG5cbiAgICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgZm91cnRoQnl0ZSAmIDB4M0Y7XG5cbiAgICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgICAgY29kZVBvaW50ID0gMHhGRkZEO1xuICAgICAgICBieXRlc1BlclNlcXVlbmNlID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwO1xuICAgICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuICAgICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRjtcbiAgICAgIH1cblxuICAgICAgcmVzLnB1c2goY29kZVBvaW50KTtcbiAgICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcyk7XG4gIH0gLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4gIC8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbiAgLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxuXG5cbiAgdmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwO1xuXG4gIGZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheShjb2RlUG9pbnRzKSB7XG4gICAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoO1xuXG4gICAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKTsgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICAgIH0gLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuXG5cbiAgICB2YXIgcmVzID0gJyc7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzY2lpU2xpY2UoYnVmLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHJldCA9ICcnO1xuICAgIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZCk7XG5cbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3Rik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxhdGluMVNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICAgIHZhciByZXQgPSAnJztcbiAgICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpO1xuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhleFNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICAgIHZhciBsZW4gPSBidWYubGVuZ3RoO1xuICAgIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDA7XG4gICAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlbjtcbiAgICB2YXIgb3V0ID0gJyc7XG5cbiAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgb3V0ICs9IGhleFNsaWNlTG9va3VwVGFibGVbYnVmW2ldXTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZnVuY3Rpb24gdXRmMTZsZVNsaWNlKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICAgIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKTtcbiAgICB2YXIgcmVzID0gJyc7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1Nik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoO1xuICAgIHN0YXJ0ID0gfn5zdGFydDtcbiAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kO1xuXG4gICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgc3RhcnQgKz0gbGVuO1xuICAgICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwO1xuICAgIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICAgIHN0YXJ0ID0gbGVuO1xuICAgIH1cblxuICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICBlbmQgKz0gbGVuO1xuICAgICAgaWYgKGVuZCA8IDApIGVuZCA9IDA7XG4gICAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICAgIGVuZCA9IGxlbjtcbiAgICB9XG5cbiAgICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0O1xuICAgIHZhciBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpOyAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKG5ld0J1ZiwgQnVmZmVyLnByb3RvdHlwZSk7XG4gICAgcmV0dXJuIG5ld0J1ZjtcbiAgfTtcbiAgLypcbiAgICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gY2hlY2tPZmZzZXQob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICAgIGlmIChvZmZzZXQgJSAxICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKTtcbiAgICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpO1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRShvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldF07XG4gICAgdmFyIG11bCA9IDE7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRShvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwO1xuXG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXTtcbiAgICB2YXIgbXVsID0gMTtcblxuICAgIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4KG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXNbb2Zmc2V0XTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzW29mZnNldF0gfCB0aGlzW29mZnNldCArIDFdIDw8IDg7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpc1tvZmZzZXRdIDw8IDggfCB0aGlzW29mZnNldCArIDFdO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuICh0aGlzW29mZnNldF0gfCB0aGlzW29mZnNldCArIDFdIDw8IDggfCB0aGlzW29mZnNldCArIDJdIDw8IDE2KSArIHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDA7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpc1tvZmZzZXRdICogMHgxMDAwMDAwICsgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYgfCB0aGlzW29mZnNldCArIDJdIDw8IDggfCB0aGlzW29mZnNldCArIDNdKTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRShvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciB2YWwgPSB0aGlzW29mZnNldF07XG4gICAgdmFyIG11bCA9IDE7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsO1xuICAgIH1cblxuICAgIG11bCAqPSAweDgwO1xuICAgIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpO1xuICAgIHJldHVybiB2YWw7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgaSA9IGJ5dGVMZW5ndGg7XG4gICAgdmFyIG11bCA9IDE7XG4gICAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXTtcblxuICAgIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bDtcbiAgICB9XG5cbiAgICBtdWwgKj0gMHg4MDtcbiAgICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKTtcbiAgICByZXR1cm4gdmFsO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpO1xuICAgIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gdGhpc1tvZmZzZXRdO1xuICAgIHJldHVybiAoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTE7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7XG4gICAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8IHRoaXNbb2Zmc2V0ICsgMV0gPDwgODtcbiAgICByZXR1cm4gdmFsICYgMHg4MDAwID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8IHRoaXNbb2Zmc2V0XSA8PCA4O1xuICAgIHJldHVybiB2YWwgJiAweDgwMDAgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzW29mZnNldF0gfCB0aGlzW29mZnNldCArIDFdIDw8IDggfCB0aGlzW29mZnNldCArIDJdIDw8IDE2IHwgdGhpc1tvZmZzZXQgKyAzXSA8PCAyNDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpc1tvZmZzZXRdIDw8IDI0IHwgdGhpc1tvZmZzZXQgKyAxXSA8PCAxNiB8IHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCB8IHRoaXNbb2Zmc2V0ICsgM107XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gICAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRShvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpO1xuICAgIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOCk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUob2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKTtcbiAgICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KTtcbiAgfTtcblxuICBmdW5jdGlvbiBjaGVja0ludChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtcbiAgICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO1xuICAgIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJyk7XG4gIH1cblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDA7XG5cbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxO1xuICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApO1xuICAgIH1cblxuICAgIHZhciBtdWwgPSAxO1xuICAgIHZhciBpID0gMDtcbiAgICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkY7XG5cbiAgICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlIC8gbXVsICYgMHhGRjtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDA7XG5cbiAgICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxO1xuICAgICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApO1xuICAgIH1cblxuICAgIHZhciBpID0gYnl0ZUxlbmd0aCAtIDE7XG4gICAgdmFyIG11bCA9IDE7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRjtcblxuICAgIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgICAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlIC8gbXVsICYgMHhGRjtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4KHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZjtcbiAgICByZXR1cm4gb2Zmc2V0ICsgMTtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMCk7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gODtcbiAgICByZXR1cm4gb2Zmc2V0ICsgMjtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMCk7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgPj4+IDg7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9IHZhbHVlICYgMHhmZjtcbiAgICByZXR1cm4gb2Zmc2V0ICsgMjtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApO1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZSA+Pj4gMjQ7XG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9IHZhbHVlID4+PiAxNjtcbiAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDg7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmO1xuICAgIHJldHVybiBvZmZzZXQgKyA0O1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMCk7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgPj4+IDI0O1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gMTY7XG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9IHZhbHVlID4+PiA4O1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgcmV0dXJuIG9mZnNldCArIDQ7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcblxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSk7XG4gICAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdCk7XG4gICAgfVxuXG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBtdWwgPSAxO1xuICAgIHZhciBzdWIgPSAwO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRjtcblxuICAgIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgICBzdWIgPSAxO1xuICAgICAgfVxuXG4gICAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsID4+IDApIC0gc3ViICYgMHhGRjtcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aDtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuXG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKTtcbiAgICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KTtcbiAgICB9XG5cbiAgICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxO1xuICAgIHZhciBtdWwgPSAxO1xuICAgIHZhciBzdWIgPSAwO1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkY7XG5cbiAgICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICAgIHN1YiA9IDE7XG4gICAgICB9XG5cbiAgICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwgPj4gMCkgLSBzdWIgJiAweEZGO1xuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4KHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKTtcbiAgICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDE7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmO1xuICAgIHJldHVybiBvZmZzZXQgKyAxO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMCk7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweGZmO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gODtcbiAgICByZXR1cm4gb2Zmc2V0ICsgMjtcbiAgfTtcblxuICBCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlID4+PiA4O1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgcmV0dXJuIG9mZnNldCArIDI7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDA7XG4gICAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApO1xuICAgIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhmZjtcbiAgICB0aGlzW29mZnNldCArIDFdID0gdmFsdWUgPj4+IDg7XG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9IHZhbHVlID4+PiAxNjtcbiAgICB0aGlzW29mZnNldCArIDNdID0gdmFsdWUgPj4+IDI0O1xuICAgIHJldHVybiBvZmZzZXQgKyA0O1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKTtcbiAgICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDE7XG4gICAgdGhpc1tvZmZzZXRdID0gdmFsdWUgPj4+IDI0O1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+Pj4gMTY7XG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9IHZhbHVlID4+PiA4O1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSB2YWx1ZSAmIDB4ZmY7XG4gICAgcmV0dXJuIG9mZnNldCArIDQ7XG4gIH07XG5cbiAgZnVuY3Rpb24gY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICAgIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJyk7XG4gICAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyaXRlRmxvYXQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gICAgdmFsdWUgPSArdmFsdWU7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuXG4gICAgaWYgKCFub0Fzc2VydCkge1xuICAgICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCk7XG4gICAgfVxuXG4gICAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpO1xuICAgIHJldHVybiBvZmZzZXQgKyA0O1xuICB9XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydCk7XG4gIH07XG5cbiAgQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHdyaXRlRG91YmxlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICAgIHZhbHVlID0gK3ZhbHVlO1xuICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcblxuICAgIGlmICghbm9Bc3NlcnQpIHtcbiAgICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgpO1xuICAgIH1cblxuICAgIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KTtcbiAgICByZXR1cm4gb2Zmc2V0ICsgODtcbiAgfVxuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpO1xuICB9O1xuXG4gIEJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KTtcbiAgfTsgLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuXG5cbiAgQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc2hvdWxkIGJlIGEgQnVmZmVyJyk7XG4gICAgaWYgKCFzdGFydCkgc3RhcnQgPSAwO1xuICAgIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aDtcbiAgICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDA7XG4gICAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0OyAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcblxuICAgIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMDtcbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7IC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcblxuICAgIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpO1xuICAgIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKTsgLy8gQXJlIHdlIG9vYj9cblxuICAgIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGg7XG5cbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0O1xuICAgIH1cblxuICAgIHZhciBsZW4gPSBlbmQgLSBzdGFydDtcblxuICAgIGlmICh0aGlzID09PSB0YXJnZXQgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFVzZSBidWlsdC1pbiB3aGVuIGF2YWlsYWJsZSwgbWlzc2luZyBmcm9tIElFMTFcbiAgICAgIHRoaXMuY29weVdpdGhpbih0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCk7XG4gICAgfSBlbHNlIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHRhcmdldCwgdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSwgdGFyZ2V0U3RhcnQpO1xuICAgIH1cblxuICAgIHJldHVybiBsZW47XG4gIH07IC8vIFVzYWdlOlxuICAvLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbiAgLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4gIC8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuXG5cbiAgQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gICAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGVuY29kaW5nID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGVuY29kaW5nID0gZW5kO1xuICAgICAgICBlbmQgPSB0aGlzLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICBpZiAoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4IHx8IGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAgIC8vIEZhc3QgcGF0aDogSWYgYHZhbGAgZml0cyBpbnRvIGEgc2luZ2xlIGJ5dGUsIHVzZSB0aGF0IG51bWVyaWMgdmFsdWUuXG4gICAgICAgICAgdmFsID0gY29kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhbCA9IHZhbCAmIDI1NTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJykge1xuICAgICAgdmFsID0gTnVtYmVyKHZhbCk7XG4gICAgfSAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cblxuXG4gICAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4Jyk7XG4gICAgfVxuXG4gICAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc3RhcnQgPSBzdGFydCA+Pj4gMDtcbiAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwO1xuICAgIGlmICghdmFsKSB2YWwgPSAwO1xuICAgIHZhciBpO1xuXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgIHRoaXNbaV0gPSB2YWw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpID8gdmFsIDogQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZyk7XG4gICAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoO1xuXG4gICAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyB2YWwgKyAnXCIgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgXCJ2YWx1ZVwiJyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9OyAvLyBIRUxQRVIgRlVOQ1RJT05TXG4gIC8vID09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2c7XG5cbiAgZnVuY3Rpb24gYmFzZTY0Y2xlYW4oc3RyKSB7XG4gICAgLy8gTm9kZSB0YWtlcyBlcXVhbCBzaWducyBhcyBlbmQgb2YgdGhlIEJhc2U2NCBlbmNvZGluZ1xuICAgIHN0ciA9IHN0ci5zcGxpdCgnPScpWzBdOyAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcblxuICAgIHN0ciA9IHN0ci50cmltKCkucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpOyAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG5cbiAgICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJzsgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG5cbiAgICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICAgIHN0ciA9IHN0ciArICc9JztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgZnVuY3Rpb24gdXRmOFRvQnl0ZXMoc3RyaW5nLCB1bml0cykge1xuICAgIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHk7XG4gICAgdmFyIGNvZGVQb2ludDtcbiAgICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGw7XG4gICAgdmFyIGJ5dGVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKTsgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuXG4gICAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSAvLyB2YWxpZCBsZWFkXG5cblxuICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8gMiBsZWFkcyBpbiBhIHJvd1xuXG5cbiAgICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50O1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG5cblxuICAgICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwO1xuICAgICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgfVxuXG4gICAgICBsZWFkU3Vycm9nYXRlID0gbnVsbDsgLy8gZW5jb2RlIHV0ZjhcblxuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrO1xuICAgICAgICBieXRlcy5wdXNoKGNvZGVQb2ludCk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVhaztcbiAgICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCwgY29kZVBvaW50ICYgMHgzRiB8IDB4ODApO1xuICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVhaztcbiAgICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCwgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLCBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MCk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVhaztcbiAgICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCwgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLCBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBieXRlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzY2lpVG9CeXRlcyhzdHIpIHtcbiAgICB2YXIgYnl0ZUFycmF5ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpO1xuICAgIH1cblxuICAgIHJldHVybiBieXRlQXJyYXk7XG4gIH1cblxuICBmdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyhzdHIsIHVuaXRzKSB7XG4gICAgdmFyIGMsIGhpLCBsbztcbiAgICB2YXIgYnl0ZUFycmF5ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrO1xuICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgaGkgPSBjID4+IDg7XG4gICAgICBsbyA9IGMgJSAyNTY7XG4gICAgICBieXRlQXJyYXkucHVzaChsbyk7XG4gICAgICBieXRlQXJyYXkucHVzaChoaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ5dGVBcnJheTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMoc3RyKSB7XG4gICAgcmV0dXJuIGJhc2U2NEpzLnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpO1xuICB9XG5cbiAgZnVuY3Rpb24gYmxpdEJ1ZmZlcihzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoIHx8IGkgPj0gc3JjLmxlbmd0aCkgYnJlYWs7XG4gICAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGk7XG4gIH0gLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3NcbiAgLy8gdGhlIGBpbnN0YW5jZW9mYCBjaGVjayBidXQgdGhleSBzaG91bGQgYmUgdHJlYXRlZCBhcyBvZiB0aGF0IHR5cGUuXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE2NlxuXG5cbiAgZnVuY3Rpb24gaXNJbnN0YW5jZShvYmosIHR5cGUpIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgdHlwZSB8fCBvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lID09PSB0eXBlLm5hbWU7XG4gIH1cblxuICBmdW5jdGlvbiBudW1iZXJJc05hTihvYmopIHtcbiAgICAvLyBGb3IgSUUxMSBzdXBwb3J0XG4gICAgcmV0dXJuIG9iaiAhPT0gb2JqOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICB9IC8vIENyZWF0ZSBsb29rdXAgdGFibGUgZm9yIGB0b1N0cmluZygnaGV4JylgXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzIxOVxuXG5cbiAgdmFyIGhleFNsaWNlTG9va3VwVGFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFscGhhYmV0ID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuICAgIHZhciB0YWJsZSA9IG5ldyBBcnJheSgyNTYpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICB2YXIgaTE2ID0gaSAqIDE2O1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgICAgdGFibGVbaTE2ICsgal0gPSBhbHBoYWJldFtpXSArIGFscGhhYmV0W2pdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YWJsZTtcbiAgfSgpO1xufSk7XG52YXIgYnVmZmVyXzEgPSBidWZmZXIuQnVmZmVyO1xudmFyIGJ1ZmZlcl8yID0gYnVmZmVyLlNsb3dCdWZmZXI7XG52YXIgYnVmZmVyXzMgPSBidWZmZXIuSU5TUEVDVF9NQVhfQllURVM7XG52YXIgYnVmZmVyXzQgPSBidWZmZXIua01heExlbmd0aDtcblxudmFyIGRvbWFpbjsgLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIHN0b3JlIGV2ZW50IGhhbmRsZXJzLiBJbnN0YW50aWF0aW5nIHRoaXMgaXNcbi8vIGZhc3RlciB0aGFuIGV4cGxpY2l0bHkgY2FsbGluZyBgT2JqZWN0LmNyZWF0ZShudWxsKWAgdG8gZ2V0IGEgXCJjbGVhblwiIGVtcHR5XG4vLyBvYmplY3QgKHRlc3RlZCB3aXRoIHY4IHY0LjkpLlxuXG5mdW5jdGlvbiBFdmVudEhhbmRsZXJzKCkge31cblxuRXZlbnRIYW5kbGVycy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG4vLyByZXF1aXJlKCdldmVudHMnKSA9PT0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyXG5cbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5FdmVudEVtaXR0ZXIudXNpbmdEb21haW5zID0gZmFsc2U7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmRvbWFpbiA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDsgLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5kb21haW4gPSBudWxsO1xuXG4gIGlmIChFdmVudEVtaXR0ZXIudXNpbmdEb21haW5zKSB7XG4gICAgLy8gaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRvbWFpbiwgdGhlbiBhdHRhY2ggdG8gaXQuXG4gICAgaWYgKGRvbWFpbi5hY3RpdmUgKSA7XG4gIH1cblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTsgLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cblxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgaXNOYU4obikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiblwiIGFyZ3VtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiAkZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gJGdldE1heExpc3RlbmVycyh0aGlzKTtcbn07IC8vIFRoZXNlIHN0YW5kYWxvbmUgZW1pdCogZnVuY3Rpb25zIGFyZSB1c2VkIHRvIG9wdGltaXplIGNhbGxpbmcgb2YgZXZlbnRcbi8vIGhhbmRsZXJzIGZvciBmYXN0IGNhc2VzIGJlY2F1c2UgZW1pdCgpIGl0c2VsZiBvZnRlbiBoYXMgYSB2YXJpYWJsZSBudW1iZXIgb2Zcbi8vIGFyZ3VtZW50cyBhbmQgY2FuIGJlIGRlb3B0aW1pemVkIGJlY2F1c2Ugb2YgdGhhdC4gVGhlc2UgZnVuY3Rpb25zIGFsd2F5cyBoYXZlXG4vLyB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGFuZCB0aHVzIGRvIG5vdCBnZXQgZGVvcHRpbWl6ZWQsIHNvIHRoZSBjb2RlXG4vLyBpbnNpZGUgdGhlbSBjYW4gZXhlY3V0ZSBmYXN0ZXIuXG5cblxuZnVuY3Rpb24gZW1pdE5vbmUoaGFuZGxlciwgaXNGbiwgc2VsZikge1xuICBpZiAoaXNGbikgaGFuZGxlci5jYWxsKHNlbGYpO2Vsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRPbmUoaGFuZGxlciwgaXNGbiwgc2VsZiwgYXJnMSkge1xuICBpZiAoaXNGbikgaGFuZGxlci5jYWxsKHNlbGYsIGFyZzEpO2Vsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZiwgYXJnMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRUd28oaGFuZGxlciwgaXNGbiwgc2VsZiwgYXJnMSwgYXJnMikge1xuICBpZiAoaXNGbikgaGFuZGxlci5jYWxsKHNlbGYsIGFyZzEsIGFyZzIpO2Vsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZiwgYXJnMSwgYXJnMik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRUaHJlZShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmIChpc0ZuKSBoYW5kbGVyLmNhbGwoc2VsZiwgYXJnMSwgYXJnMiwgYXJnMyk7ZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdE1hbnkoaGFuZGxlciwgaXNGbiwgc2VsZiwgYXJncykge1xuICBpZiAoaXNGbikgaGFuZGxlci5hcHBseShzZWxmLCBhcmdzKTtlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBldmVudHMsIGRvbWFpbjtcbiAgdmFyIGRvRXJyb3IgPSB0eXBlID09PSAnZXJyb3InO1xuICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMpIGRvRXJyb3IgPSBkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PSBudWxsO2Vsc2UgaWYgKCFkb0Vycm9yKSByZXR1cm4gZmFsc2U7XG4gIGRvbWFpbiA9IHRoaXMuZG9tYWluOyAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICBlciA9IGFyZ3VtZW50c1sxXTtcblxuICAgIGlmIChkb21haW4pIHtcbiAgICAgIGlmICghZXIpIGVyID0gbmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgXCJlcnJvclwiIGV2ZW50Jyk7XG4gICAgICBlci5kb21haW5FbWl0dGVyID0gdGhpcztcbiAgICAgIGVyLmRvbWFpbiA9IGRvbWFpbjtcbiAgICAgIGVyLmRvbWFpblRocm93biA9IGZhbHNlO1xuICAgICAgZG9tYWluLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIH0gZWxzZSBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuICgnICsgZXIgKyAnKScpO1xuICAgICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoIWhhbmRsZXIpIHJldHVybiBmYWxzZTtcbiAgdmFyIGlzRm4gPSB0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJztcbiAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICBzd2l0Y2ggKGxlbikge1xuICAgIC8vIGZhc3QgY2FzZXNcbiAgICBjYXNlIDE6XG4gICAgICBlbWl0Tm9uZShoYW5kbGVyLCBpc0ZuLCB0aGlzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAyOlxuICAgICAgZW1pdE9uZShoYW5kbGVyLCBpc0ZuLCB0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDM6XG4gICAgICBlbWl0VHdvKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSA0OlxuICAgICAgZW1pdFRocmVlKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdLCBhcmd1bWVudHNbM10pO1xuICAgICAgYnJlYWs7XG4gICAgLy8gc2xvd2VyXG5cbiAgICBkZWZhdWx0OlxuICAgICAgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcblxuICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgfVxuXG4gICAgICBlbWl0TWFueShoYW5kbGVyLCBpc0ZuLCB0aGlzLCBhcmdzKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKCFldmVudHMpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lcikge1xuICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTsgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuXG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXTtcbiAgfVxuXG4gIGlmICghZXhpc3RpbmcpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfSAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuXG5cbiAgICBpZiAoIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgbSA9ICRnZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcblxuICAgICAgaWYgKG0gJiYgbSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSkge1xuICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICsgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgdHlwZSArICcgbGlzdGVuZXJzIGFkZGVkLiAnICsgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0Jyk7XG4gICAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnO1xuICAgICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICAgIHcudHlwZSA9IHR5cGU7XG4gICAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7XG4gICAgICAgIGVtaXRXYXJuaW5nKHcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIGVtaXRXYXJuaW5nKGUpIHtcbiAgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnNvbGUud2FybihlKSA6IGNvbnNvbGUubG9nKGUpO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID0gZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xufTtcblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0YXJnZXQucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgZy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICByZXR1cm4gZztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZSh0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID0gZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07IC8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKCFldmVudHMpIHJldHVybiB0aGlzO1xuICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICBpZiAoIWxpc3QpIHJldHVybiB0aGlzO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7ZWxzZSB7XG4gICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcikgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fCBsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0WzBdID0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwbGljZU9uZShsaXN0LCBwb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcikgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gIHZhciBsaXN0ZW5lcnMsIGV2ZW50cztcbiAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoIWV2ZW50cykgcmV0dXJuIHRoaXM7IC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcblxuICBpZiAoIWV2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdKSB7XG4gICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtlbHNlIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG5cblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBrZXk7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2UgaWYgKGxpc3RlbmVycykge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICBkbyB7XG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICAgIH0gd2hpbGUgKGxpc3RlbmVyc1swXSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgdmFyIGV2bGlzdGVuZXI7XG4gIHZhciByZXQ7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmICghZXZlbnRzKSByZXQgPSBbXTtlbHNlIHtcbiAgICBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICAgIGlmICghZXZsaXN0ZW5lcikgcmV0ID0gW107ZWxzZSBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHJldCA9IFtldmxpc3RlbmVyLmxpc3RlbmVyIHx8IGV2bGlzdGVuZXJdO2Vsc2UgcmV0ID0gdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpO1xuICB9XG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuXG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcblxuICBpZiAoZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdC5vd25LZXlzKHRoaXMuX2V2ZW50cykgOiBbXTtcbn07IC8vIEFib3V0IDEuNXggZmFzdGVyIHRoYW4gdGhlIHR3by1hcmcgdmVyc2lvbiBvZiBBcnJheSNzcGxpY2UoKS5cblxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICh2YXIgaSA9IGluZGV4LCBrID0gaSArIDEsIG4gPSBsaXN0Lmxlbmd0aDsgayA8IG47IGkgKz0gMSwgayArPSAxKSB7XG4gICAgbGlzdFtpXSA9IGxpc3Rba107XG4gIH1cblxuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgaSkge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShpKTtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxudmFyIGdsb2JhbCQxID0gdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fTtcblxuLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG4vLyBiYXNlZCBvZmYgaHR0cHM6Ly9naXRodWIuY29tL2RlZnVuY3R6b21iaWUvbm9kZS1wcm9jZXNzL2Jsb2IvbWFzdGVyL2Jyb3dzZXIuanNcbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuXG52YXIgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcblxuaWYgKHR5cGVvZiBnbG9iYWwkMS5zZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xufVxuXG5pZiAodHlwZW9mIGdsb2JhbCQxLmNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG59XG5cbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgfSAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXG5cbiAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gIH0gLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXG5cbiAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZHJhaW5pbmcgPSBmYWxzZTtcblxuICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcXVldWVJbmRleCA9IC0xO1xuICB9XG5cbiAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgIGRyYWluUXVldWUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICBpZiAoZHJhaW5pbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgZHJhaW5pbmcgPSB0cnVlO1xuICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuXG4gIHdoaWxlIChsZW4pIHtcbiAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICBxdWV1ZSA9IFtdO1xuXG4gICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVldWVJbmRleCA9IC0xO1xuICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgfVxuXG4gIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gIGRyYWluaW5nID0gZmFsc2U7XG4gIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZnVuKSB7XG4gIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICB9XG5cbiAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcblxuICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gIH1cbn0gLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgdGhpcy5mdW4gPSBmdW47XG4gIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cblxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5cbnZhciB0aXRsZSA9ICdicm93c2VyJztcbnZhciBwbGF0Zm9ybSA9ICdicm93c2VyJztcbnZhciBicm93c2VyID0gdHJ1ZTtcbnZhciBlbnYgPSB7fTtcbnZhciBhcmd2ID0gW107XG52YXIgdmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xuXG52YXIgdmVyc2lvbnMgPSB7fTtcbnZhciByZWxlYXNlID0ge307XG52YXIgY29uZmlnID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG52YXIgb24gPSBub29wO1xudmFyIGFkZExpc3RlbmVyID0gbm9vcDtcbnZhciBvbmNlID0gbm9vcDtcbnZhciBvZmYgPSBub29wO1xudmFyIHJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnZhciByZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xudmFyIGVtaXQgPSBub29wO1xuZnVuY3Rpb24gYmluZGluZyhuYW1lKSB7XG4gIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1cbmZ1bmN0aW9uIGN3ZCgpIHtcbiAgcmV0dXJuICcvJztcbn1cbmZ1bmN0aW9uIGNoZGlyKGRpcikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufVxuZnVuY3Rpb24gdW1hc2soKSB7XG4gIHJldHVybiAwO1xufSAvLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9rdW1hdmlzL2Jyb3dzZXItcHJvY2Vzcy1ocnRpbWUvYmxvYi9tYXN0ZXIvaW5kZXguanNcblxudmFyIHBlcmZvcm1hbmNlID0gZ2xvYmFsJDEucGVyZm9ybWFuY2UgfHwge307XG5cbnZhciBwZXJmb3JtYW5jZU5vdyA9IHBlcmZvcm1hbmNlLm5vdyB8fCBwZXJmb3JtYW5jZS5tb3pOb3cgfHwgcGVyZm9ybWFuY2UubXNOb3cgfHwgcGVyZm9ybWFuY2Uub05vdyB8fCBwZXJmb3JtYW5jZS53ZWJraXROb3cgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG59OyAvLyBnZW5lcmF0ZSB0aW1lc3RhbXAgb3IgZGVsdGFcbi8vIHNlZSBodHRwOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19ocnRpbWVcblxuXG5mdW5jdGlvbiBocnRpbWUocHJldmlvdXNUaW1lc3RhbXApIHtcbiAgdmFyIGNsb2NrdGltZSA9IHBlcmZvcm1hbmNlTm93LmNhbGwocGVyZm9ybWFuY2UpICogMWUtMztcbiAgdmFyIHNlY29uZHMgPSBNYXRoLmZsb29yKGNsb2NrdGltZSk7XG4gIHZhciBuYW5vc2Vjb25kcyA9IE1hdGguZmxvb3IoY2xvY2t0aW1lICUgMSAqIDFlOSk7XG5cbiAgaWYgKHByZXZpb3VzVGltZXN0YW1wKSB7XG4gICAgc2Vjb25kcyA9IHNlY29uZHMgLSBwcmV2aW91c1RpbWVzdGFtcFswXTtcbiAgICBuYW5vc2Vjb25kcyA9IG5hbm9zZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMV07XG5cbiAgICBpZiAobmFub3NlY29uZHMgPCAwKSB7XG4gICAgICBzZWNvbmRzLS07XG4gICAgICBuYW5vc2Vjb25kcyArPSAxZTk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtzZWNvbmRzLCBuYW5vc2Vjb25kc107XG59XG52YXIgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcbmZ1bmN0aW9uIHVwdGltZSgpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKTtcbiAgdmFyIGRpZiA9IGN1cnJlbnRUaW1lIC0gc3RhcnRUaW1lO1xuICByZXR1cm4gZGlmIC8gMTAwMDtcbn1cbnZhciBwcm9jZXNzID0ge1xuICBuZXh0VGljazogbmV4dFRpY2ssXG4gIHRpdGxlOiB0aXRsZSxcbiAgYnJvd3NlcjogYnJvd3NlcixcbiAgZW52OiBlbnYsXG4gIGFyZ3Y6IGFyZ3YsXG4gIHZlcnNpb246IHZlcnNpb24sXG4gIHZlcnNpb25zOiB2ZXJzaW9ucyxcbiAgb246IG9uLFxuICBhZGRMaXN0ZW5lcjogYWRkTGlzdGVuZXIsXG4gIG9uY2U6IG9uY2UsXG4gIG9mZjogb2ZmLFxuICByZW1vdmVMaXN0ZW5lcjogcmVtb3ZlTGlzdGVuZXIsXG4gIHJlbW92ZUFsbExpc3RlbmVyczogcmVtb3ZlQWxsTGlzdGVuZXJzLFxuICBlbWl0OiBlbWl0LFxuICBiaW5kaW5nOiBiaW5kaW5nLFxuICBjd2Q6IGN3ZCxcbiAgY2hkaXI6IGNoZGlyLFxuICB1bWFzazogdW1hc2ssXG4gIGhydGltZTogaHJ0aW1lLFxuICBwbGF0Zm9ybTogcGxhdGZvcm0sXG4gIHJlbGVhc2U6IHJlbGVhc2UsXG4gIGNvbmZpZzogY29uZmlnLFxuICB1cHRpbWU6IHVwdGltZVxufTtcblxudmFyIGluaGVyaXRzO1xuXG5pZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgaW5oZXJpdHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIGluaGVyaXRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3I7XG5cbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiBUZW1wQ3RvcigpIHt9O1xuXG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpO1xuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjtcbiAgfTtcbn1cblxudmFyIGluaGVyaXRzJDEgPSBpbmhlcml0cztcblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5mdW5jdGlvbiBmb3JtYXQoZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uICh4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcblxuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG5cbiAgICAgIGNhc2UgJyVkJzpcbiAgICAgICAgcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuXG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG5cbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cblxuZnVuY3Rpb24gZGVwcmVjYXRlKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbCQxLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZnVuY3Rpb24gZGVidWdsb2coc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKSBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcblxuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gMDtcblxuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtc2cgPSBmb3JtYXQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn1cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cblxuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9OyAvLyBsZWdhY3kuLi5cblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG5cbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIF9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfSAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG5cblxuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufSAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3NcblxuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJzogWzEsIDIyXSxcbiAgJ2l0YWxpYyc6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnOiBbNCwgMjRdLFxuICAnaW52ZXJzZSc6IFs3LCAyN10sXG4gICd3aGl0ZSc6IFszNywgMzldLFxuICAnZ3JleSc6IFs5MCwgMzldLFxuICAnYmxhY2snOiBbMzAsIDM5XSxcbiAgJ2JsdWUnOiBbMzQsIDM5XSxcbiAgJ2N5YW4nOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJzogWzMyLCAzOV0sXG4gICdtYWdlbnRhJzogWzM1LCAzOV0sXG4gICdyZWQnOiBbMzEsIDM5XSxcbiAgJ3llbGxvdyc6IFszMywgMzldXG59OyAvLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcblxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiBcIlxceDFCW1wiICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICsgXCJcXHgxQltcIiArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24gKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBoYXNoO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiYgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gIHZhbHVlLmluc3BlY3QgIT09IGluc3BlY3QgJiYgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG5cbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH0gLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcblxuXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG5cbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH0gLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuXG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH0gLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuXG5cbiAgaWYgKGlzRXJyb3IodmFsdWUpICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH0gLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuXG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cblxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsXG4gICAgICBhcnJheSA9IGZhbHNlLFxuICAgICAgYnJhY2VzID0gWyd7JywgJ30nXTsgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuXG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9IC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuXG5cbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfSAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuXG5cbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9IC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuXG5cbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH0gLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuXG5cbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcbiAgdmFyIG91dHB1dDtcblxuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG5cbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIikucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG5cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSkgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpOyAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuXG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHtcbiAgICB2YWx1ZTogdmFsdWVba2V5XVxuICB9O1xuXG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuXG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbiAobGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuXG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIikucmVwbGFjZSgvXFxcXFwiL2csICdcIicpLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cikge1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgKyAnICcgKyBvdXRwdXQuam9pbignLFxcbiAgJykgKyAnICcgKyBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufSAvLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHwgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8IHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8IC8vIEVTNiBzeW1ib2xcbiAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5mdW5jdGlvbiBpc0J1ZmZlcihtYXliZUJ1Zikge1xuICByZXR1cm4gYnVmZmVyXzEuaXNCdWZmZXIobWF5YmVCdWYpO1xufVxuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddOyAvLyAyNiBGZWIgMTY6MTk6MzRcblxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLCBwYWQoZC5nZXRNaW51dGVzKCkpLCBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59IC8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcblxuXG5mdW5jdGlvbiBsb2coKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGZvcm1hdC5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbn1cbmZ1bmN0aW9uIF9leHRlbmQob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cblxuICByZXR1cm4gb3JpZ2luO1xufVxuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG52YXIgcmVxdWlyZSQkMyA9IHtcbiAgaW5oZXJpdHM6IGluaGVyaXRzJDEsXG4gIF9leHRlbmQ6IF9leHRlbmQsXG4gIGxvZzogbG9nLFxuICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gIGlzUHJpbWl0aXZlOiBpc1ByaW1pdGl2ZSxcbiAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgaXNFcnJvcjogaXNFcnJvcixcbiAgaXNEYXRlOiBpc0RhdGUsXG4gIGlzT2JqZWN0OiBpc09iamVjdCxcbiAgaXNSZWdFeHA6IGlzUmVnRXhwLFxuICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gIGlzU3ltYm9sOiBpc1N5bWJvbCxcbiAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuICBpc051bWJlcjogaXNOdW1iZXIsXG4gIGlzTnVsbE9yVW5kZWZpbmVkOiBpc051bGxPclVuZGVmaW5lZCxcbiAgaXNOdWxsOiBpc051bGwsXG4gIGlzQm9vbGVhbjogaXNCb29sZWFuLFxuICBpc0FycmF5OiBpc0FycmF5LFxuICBpbnNwZWN0OiBpbnNwZWN0LFxuICBkZXByZWNhdGU6IGRlcHJlY2F0ZSxcbiAgZm9ybWF0OiBmb3JtYXQsXG4gIGRlYnVnbG9nOiBkZWJ1Z2xvZ1xufTtcblxuZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgdGhpcy5oZWFkID0gbnVsbDtcbiAgdGhpcy50YWlsID0gbnVsbDtcbiAgdGhpcy5sZW5ndGggPSAwO1xufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHYpIHtcbiAgdmFyIGVudHJ5ID0ge1xuICAgIGRhdGE6IHYsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O2Vsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gIHRoaXMudGFpbCA9IGVudHJ5O1xuICArK3RoaXMubGVuZ3RoO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uICh2KSB7XG4gIHZhciBlbnRyeSA9IHtcbiAgICBkYXRhOiB2LFxuICAgIG5leHQ6IHRoaXMuaGVhZFxuICB9O1xuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHRoaXMudGFpbCA9IGVudHJ5O1xuICB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgKyt0aGlzLmxlbmd0aDtcbn07XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgdmFyIHJldCA9IHRoaXMuaGVhZC5kYXRhO1xuICBpZiAodGhpcy5sZW5ndGggPT09IDEpIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7ZWxzZSB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dDtcbiAgLS10aGlzLmxlbmd0aDtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO1xuICB0aGlzLmxlbmd0aCA9IDA7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gKHMpIHtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gIHZhciBwID0gdGhpcy5oZWFkO1xuICB2YXIgcmV0ID0gJycgKyBwLmRhdGE7XG5cbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICByZXQgKz0gcyArIHAuZGF0YTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAobikge1xuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBidWZmZXJfMS5hbGxvYygwKTtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSByZXR1cm4gdGhpcy5oZWFkLmRhdGE7XG4gIHZhciByZXQgPSBidWZmZXJfMS5hbGxvY1Vuc2FmZShuID4+PiAwKTtcbiAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gIHZhciBpID0gMDtcblxuICB3aGlsZSAocCkge1xuICAgIHAuZGF0YS5jb3B5KHJldCwgaSk7XG4gICAgaSArPSBwLmRhdGEubGVuZ3RoO1xuICAgIHAgPSBwLm5leHQ7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxudmFyIHN0cmluZ19kZWNvZGVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbiAgLy9cbiAgLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbiAgLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuICAvLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbiAgLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuICAvLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4gIC8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuICAvLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgLy9cbiAgLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbiAgLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gIC8vXG4gIC8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1NcbiAgLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICAvLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4gIC8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuICAvLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1JcbiAgLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuICAvLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICB2YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlcjtcblxuICB2YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nIHx8IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcgJiYgZW5jb2RpbmcudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgY2FzZSAncmF3JzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgICBpZiAoZW5jb2RpbmcgJiYgIWlzQnVmZmVyRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gICAgfVxuICB9IC8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2ZcbiAgLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4gIC8vIGNoYXJhY3RlcnMuIENFU1UtOCBpcyBoYW5kbGVkIGFzIHBhcnQgb2YgdGhlIFVURi04IGVuY29kaW5nLlxuICAvL1xuICAvLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbiAgLy8gdG8gcmVhc29uIGFib3V0IHRoaXMgY29kZSwgc28gaXQgc2hvdWxkIGJlIHNwbGl0IHVwIGluIHRoZSBmdXR1cmUuXG4gIC8vIEBUT0RPIFRoZXJlIHNob3VsZCBiZSBhIHV0Zjgtc3RyaWN0IGVuY29kaW5nIHRoYXQgcmVqZWN0cyBpbnZhbGlkIFVURi04IGNvZGVcbiAgLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxuXG5cbiAgdmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICAgIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKTtcblxuICAgIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgIC8vIENFU1UtOCByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMy1ieXRlc1xuICAgICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgICAgLy8gVVRGLTE2IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAyLWJ5dGVzXG4gICAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gQmFzZS02NCBzdG9yZXMgMyBieXRlcyBpbiA0IGNoYXJzLCBhbmQgcGFkcyB0aGUgcmVtYWluZGVyLlxuICAgICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gYmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLndyaXRlID0gcGFzc1Rocm91Z2hXcml0ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgICAvLyBieXRlcywgYnV0IENFU1UtOCBtYXkgcmVxdWlyZSB1cCB0byA2ICgzIGJ5dGVzIHBlciBzdXJyb2dhdGUpLlxuXG5cbiAgICB0aGlzLmNoYXJCdWZmZXIgPSBuZXcgQnVmZmVyKDYpOyAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG5cbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7IC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cblxuICAgIHRoaXMuY2hhckxlbmd0aCA9IDA7XG4gIH07IC8vIHdyaXRlIGRlY29kZXMgdGhlIGdpdmVuIGJ1ZmZlciBhbmQgcmV0dXJucyBpdCBhcyBKUyBzdHJpbmcgdGhhdCBpc1xuICAvLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbiAgLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBpcyBidWZmZXJlZCB1cCwgYW5kIHdpbGwgYmVcbiAgLy8gcmV0dXJuZWQgd2hlbiBjYWxsaW5nIHdyaXRlIGFnYWluIHdpdGggdGhlIHJlbWFpbmluZyBieXRlcy5cbiAgLy9cbiAgLy8gTm90ZTogQ29udmVydGluZyBhIEJ1ZmZlciBjb250YWluaW5nIGFuIG9ycGhhbiBzdXJyb2dhdGUgdG8gYSBTdHJpbmdcbiAgLy8gY3VycmVudGx5IHdvcmtzLCBidXQgY29udmVydGluZyBhIFN0cmluZyB0byBhIEJ1ZmZlciAodmlhIGBuZXcgQnVmZmVyYCwgb3JcbiAgLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbiAgLy8gcmVwbGFjZW1lbnQgY2hhcmFjdGVyLiBTZWUgaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy8xMjExNzMwMDkvIC5cblxuXG4gIFN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgIHZhciBjaGFyU3RyID0gJyc7IC8vIGlmIG91ciBsYXN0IHdyaXRlIGVuZGVkIHdpdGggYW4gaW5jb21wbGV0ZSBtdWx0aWJ5dGUgY2hhcmFjdGVyXG5cbiAgICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgcmVtYWluaW5nIGJ5dGVzIHRoaXMgYnVmZmVyIGhhcyB0byBvZmZlciBmb3IgdGhpcyBjaGFyXG4gICAgICB2YXIgYXZhaWxhYmxlID0gYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA/IHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkIDogYnVmZmVyLmxlbmd0aDsgLy8gYWRkIHRoZSBuZXcgYnl0ZXMgdG8gdGhlIGNoYXIgYnVmZmVyXG5cbiAgICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgdGhpcy5jaGFyUmVjZWl2ZWQsIDAsIGF2YWlsYWJsZSk7XG4gICAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBhdmFpbGFibGU7XG5cbiAgICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgICAvLyBzdGlsbCBub3QgZW5vdWdoIGNoYXJzIGluIHRoaXMgYnVmZmVyPyB3YWl0IGZvciBtb3JlIC4uLlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9IC8vIHJlbW92ZSBieXRlcyBiZWxvbmdpbmcgdG8gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGZyb20gdGhlIGJ1ZmZlclxuXG5cbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShhdmFpbGFibGUsIGJ1ZmZlci5sZW5ndGgpOyAvLyBnZXQgdGhlIGNoYXJhY3RlciB0aGF0IHdhcyBzcGxpdFxuXG4gICAgICBjaGFyU3RyID0gdGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsIHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7IC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcblxuICAgICAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGNoYXJTdHIubGVuZ3RoIC0gMSk7XG5cbiAgICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICAgIHRoaXMuY2hhckxlbmd0aCArPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgICAgIGNoYXJTdHIgPSAnJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDsgLy8gaWYgdGhlcmUgYXJlIG5vIG1vcmUgYnl0ZXMgaW4gdGhpcyBidWZmZXIsIGp1c3QgZW1pdCBvdXIgY2hhclxuXG4gICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gY2hhclN0cjtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfSAvLyBkZXRlcm1pbmUgYW5kIHNldCBjaGFyTGVuZ3RoIC8gY2hhclJlY2VpdmVkXG5cblxuICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKTtcbiAgICB2YXIgZW5kID0gYnVmZmVyLmxlbmd0aDtcblxuICAgIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAgIC8vIGJ1ZmZlciB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXIgYnl0ZXMgd2UgZ290XG4gICAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCwgZW5kKTtcbiAgICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgICB9XG5cbiAgICBjaGFyU3RyICs9IGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCBlbmQpO1xuICAgIHZhciBlbmQgPSBjaGFyU3RyLmxlbmd0aCAtIDE7XG4gICAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7IC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcblxuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCArPSBzaXplO1xuICAgICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gc2l6ZTtcbiAgICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIDAsIHNpemUpO1xuICAgICAgcmV0dXJuIGNoYXJTdHIuc3Vic3RyaW5nKDAsIGVuZCk7XG4gICAgfSAvLyBvciBqdXN0IGVtaXQgdGhlIGNoYXJTdHJcblxuXG4gICAgcmV0dXJuIGNoYXJTdHI7XG4gIH07IC8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbiAgLy8gdGhlIGVuZCBvZiB0aGUgZ2l2ZW4gYnVmZmVyLiBJZiBzbywgaXQgc2V0cyB0aGlzLmNoYXJMZW5ndGggdG8gdGhlIGJ5dGVcbiAgLy8gbGVuZ3RoIHRoYXQgY2hhcmFjdGVyLCBhbmQgc2V0cyB0aGlzLmNoYXJSZWNlaXZlZCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzXG4gIC8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5cblxuICBTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gICAgdmFyIGkgPSBidWZmZXIubGVuZ3RoID49IDMgPyAzIDogYnVmZmVyLmxlbmd0aDsgLy8gRmlndXJlIG91dCBpZiBvbmUgb2YgdGhlIGxhc3QgaSBieXRlcyBvZiBvdXIgYnVmZmVyIGFubm91bmNlcyBhblxuICAgIC8vIGluY29tcGxldGUgY2hhci5cblxuICAgIGZvciAoOyBpID4gMDsgaS0tKSB7XG4gICAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07IC8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi04I0Rlc2NyaXB0aW9uXG4gICAgICAvLyAxMTBYWFhYWFxuXG4gICAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvLyAxMTEwWFhYWFxuXG5cbiAgICAgIGlmIChpIDw9IDIgJiYgYyA+PiA0ID09IDB4MEUpIHtcbiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIDExMTEwWFhYXG5cblxuICAgICAgaWYgKGkgPD0gMyAmJiBjID4+IDMgPT0gMHgxRSkge1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IGk7XG4gIH07XG5cbiAgU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgIHZhciByZXMgPSAnJztcbiAgICBpZiAoYnVmZmVyICYmIGJ1ZmZlci5sZW5ndGgpIHJlcyA9IHRoaXMud3JpdGUoYnVmZmVyKTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCkge1xuICAgICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgICB2YXIgYnVmID0gdGhpcy5jaGFyQnVmZmVyO1xuICAgICAgdmFyIGVuYyA9IHRoaXMuZW5jb2Rpbmc7XG4gICAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFzc1Rocm91Z2hXcml0ZShidWZmZXIpIHtcbiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAyO1xuICAgIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG4gIH1cblxuICBmdW5jdGlvbiBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICAgIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMyA6IDA7XG4gIH1cbn0pO1xudmFyIHN0cmluZ19kZWNvZGVyXzEgPSBzdHJpbmdfZGVjb2Rlci5TdHJpbmdEZWNvZGVyO1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcbnZhciBkZWJ1ZyA9IGRlYnVnbG9nKCdzdHJlYW0nKTtcbmluaGVyaXRzJDEoUmVhZGFibGUsIEV2ZW50RW1pdHRlcik7XG5cbmZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4pIHtcbiAgLy8gU2FkbHkgdGhpcyBpcyBub3QgY2FjaGVhYmxlIGFzIHNvbWUgbGlicmFyaWVzIGJ1bmRsZSB0aGVpciBvd25cbiAgLy8gZXZlbnQgZW1pdHRlciBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZW0uXG4gIGlmICh0eXBlb2YgZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gICAgLy8gdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuIFRoaXMgaXMgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBjb2RlIG5lZWRzXG4gICAgLy8gdG8gY29udGludWUgdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIE5vZGUuanMgdGhhdCBkbyBub3QgaW5jbHVkZVxuICAgIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW2V2ZW50XSkgZW1pdHRlci5vbihldmVudCwgZm4pO2Vsc2UgaWYgKEFycmF5LmlzQXJyYXkoZW1pdHRlci5fZXZlbnRzW2V2ZW50XSkpIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0udW5zaGlmdChmbik7ZWxzZSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdID0gW2ZuLCBlbWl0dGVyLl9ldmVudHNbZXZlbnRdXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50JDEoZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcblxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGU7IC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcblxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod20gfHwgaHdtID09PSAwID8gaHdtIDogZGVmYXVsdEh3bTsgLy8gY2FzdCB0byBpbnRzLlxuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH5+dGhpcy5oaWdoV2F0ZXJNYXJrOyAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpXG5cbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTsgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG5cbiAgdGhpcy5zeW5jID0gdHJ1ZTsgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuICB0aGlzLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlOyAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnOyAvLyB3aGVuIHBpcGluZywgd2Ugb25seSBjYXJlIGFib3V0ICdyZWFkYWJsZScgZXZlbnRzIHRoYXQgaGFwcGVuXG4gIC8vIGFmdGVyIHJlYWQoKWluZyBhbGwgdGhlIGJ5dGVzIGFuZCBub3QgZ2V0dGluZyBhbnkgcHVzaGJhY2suXG5cbiAgdGhpcy5yYW5PdXQgPSBmYWxzZTsgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcblxuICB0aGlzLmF3YWl0RHJhaW4gPSAwOyAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG5cbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcblxuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBzdHJpbmdfZGVjb2Rlcl8xKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTsgLy8gbGVnYWN5XG5cbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlYWQgPT09ICdmdW5jdGlvbicpIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG4gIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xufSAvLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICBjaHVuayA9IGJ1ZmZlcl8xLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIGVuY29kaW5nID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgZmFsc2UpO1xufTsgLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssICcnLCB0cnVlKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICB2YXIgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcblxuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIH0gZWxzZSBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RhdGUuZW5kZWQgJiYgIWFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRicpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRFbWl0dGVkICYmIGFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBfZSA9IG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcblxuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgX2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2tpcEFkZDtcblxuICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWFkZFRvRnJvbnQgJiYgIWVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgICAgIHNraXBBZGQgPSAhc3RhdGUub2JqZWN0TW9kZSAmJiBjaHVuay5sZW5ndGggPT09IDA7XG4gICAgICB9XG5cbiAgICAgIGlmICghYWRkVG9Gcm9udCkgc3RhdGUucmVhZGluZyA9IGZhbHNlOyAvLyBEb24ndCBhZGQgdG8gdGhlIGJ1ZmZlciBpZiB3ZSd2ZSBkZWNvZGVkIHRvIGFuIGVtcHR5IHN0cmluZyBjaHVuayBhbmRcbiAgICAgIC8vIHdlJ3JlIG5vdCBpbiBvYmplY3QgbW9kZVxuXG4gICAgICBpZiAoIXNraXBBZGQpIHtcbiAgICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgICAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKSBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufSAvLyBpZiBpdCdzIHBhc3QgdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2UgY2FuIHB1c2ggaW4gc29tZSBtb3JlLlxuLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWVcbi8vIG1vcmUgYnl0ZXMuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLFxuLy8gc3VjaCBhcyB0aGUgcmVwbC4gIEFsc28sIGlmIHRoZSBwdXNoKCkgdHJpZ2dlcmVkIGFcbi8vIHJlYWRhYmxlIGV2ZW50LCBhbmQgdGhlIHVzZXIgY2FsbGVkIHJlYWQobGFyZ2VOdW1iZXIpIHN1Y2ggdGhhdFxuLy8gbmVlZFJlYWRhYmxlIHdhcyBzZXQsIHRoZW4gd2Ugb3VnaHQgdG8gcHVzaCBtb3JlLCBzbyB0aGF0IGFub3RoZXJcbi8vICdyZWFkYWJsZScgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5cblxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59IC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuXG5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IHN0cmluZ19kZWNvZGVyXzEoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59OyAvLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG5cblxudmFyIE1BWF9IV00gPSAweDgwMDAwMDtcblxuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMiB0byBwcmV2ZW50IGluY3JlYXNpbmcgaHdtIGV4Y2Vzc2l2ZWx5IGluXG4gICAgLy8gdGlueSBhbW91bnRzXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuXG4gIHJldHVybiBuO1xufSAvLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cblxuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiAxO1xuXG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9IC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuXG5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG47IC8vIERvbid0IGhhdmUgZW5vdWdoXG5cbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gc3RhdGUubGVuZ3RoO1xufSAvLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuXG5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlOyAvLyBpZiB3ZSdyZSBkb2luZyByZWFkKDApIHRvIHRyaWdnZXIgYSByZWFkYWJsZSBldmVudCwgYnV0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhIGJ1bmNoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciwgdGhlbiBqdXN0IHRyaWdnZXJcbiAgLy8gdGhlICdyZWFkYWJsZScgZXZlbnQgYW5kIG1vdmUgb24uXG5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7IC8vIGlmIHdlJ3ZlIGVuZGVkLCBhbmQgd2UncmUgbm93IGNsZWFyLCB0aGVuIGZpbmlzaCBpdCB1cC5cblxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cblxuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTsgLy8gaWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lXG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfSAvLyBob3dldmVyLCBpZiB3ZSd2ZSBlbmRlZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50LCBhbmQgaWYgd2UncmUgYWxyZWFkeVxuICAvLyByZWFkaW5nLCB0aGVuIGl0J3MgdW5uZWNlc3NhcnkuXG5cblxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlOyAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTsgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcblxuICAgIHN0YXRlLnN5bmMgPSBmYWxzZTsgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG5cbiAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSk7XG4gIH1cblxuICB2YXIgcmV0O1xuICBpZiAobiA+IDApIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlKTtlbHNlIHJldCA9IG51bGw7XG5cbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgbiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUubGVuZ3RoIC09IG47XG4gIH1cblxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gICAgLy8gYXMgc29vbiBhcyB3ZSAqZG8qIGdldCBzb21ldGhpbmcgaW50byB0aGUgYnVmZmVyLlxuICAgIGlmICghc3RhdGUuZW5kZWQpIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7IC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cblxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7XG4gIH1cblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuXG4gIGlmICghYnVmZmVyXzEuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG5cbiAgcmV0dXJuIGVyO1xufVxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgaWYgKHN0YXRlLmRlY29kZXIpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuXG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTsgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59IC8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5cblxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIG5leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7ZWxzZSBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pIHtcbiAgZGVidWcoJ2VtaXQgcmVhZGFibGUnKTtcbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG4gIGZsb3coc3RyZWFtKTtcbn0gLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgbmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcblxuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuXG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59IC8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuXG5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuICB2YXIgZG9FbmQgPSAhcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZTtcbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBuZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG5cbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcblxuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfSAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cblxuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTsgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgY2xlYW5lZFVwID0gdHJ1ZTsgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cblxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfSAvLyBJZiB0aGUgdXNlciBwdXNoZXMgbW9yZSBkYXRhIHdoaWxlIHdlJ3JlIHdyaXRpbmcgdG8gZGVzdCB0aGVuIHdlJ2xsIGVuZCB1cFxuICAvLyBpbiBvbmRhdGEgYWdhaW4uIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byBpbmNyZWFzZSBhd2FpdERyYWluIG9uY2UgYmVjYXVzZVxuICAvLyBkZXN0IHdpbGwgb25seSBlbWl0IG9uZSAnZHJhaW4nIGV2ZW50IGZvciB0aGUgbXVsdGlwbGUgd3JpdGVzLlxuICAvLyA9PiBJbnRyb2R1Y2UgYSBndWFyZCBvbiBpbmNyZWFzaW5nIGF3YWl0RHJhaW4uXG5cblxuICB2YXIgaW5jcmVhc2VkQXdhaXREcmFpbiA9IGZhbHNlO1xuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuXG4gICAgaWYgKGZhbHNlID09PSByZXQgJiYgIWluY3JlYXNlZEF3YWl0RHJhaW4pIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICAvLyA9PiBDaGVjayB3aGV0aGVyIGBkZXN0YCBpcyBzdGlsbCBhIHBpcGluZyBkZXN0aW5hdGlvbi5cbiAgICAgIGlmICgoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZS5waXBlc0NvdW50ID4gMSAmJiBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KSAhPT0gLTEpICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgICAgaW5jcmVhc2VkQXdhaXREcmFpbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfSAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuXG5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKGxpc3RlbmVyQ291bnQkMShkZXN0LCAnZXJyb3InKSA9PT0gMCkgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSAvLyBNYWtlIHN1cmUgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIHVzZXJsYW5kIG9uZXMuXG5cblxuICBwcmVwZW5kTGlzdGVuZXIoZGVzdCwgJ2Vycm9yJywgb25lcnJvcik7IC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cblxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG5cbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuXG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfSAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuXG5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTsgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBzcmMubGlzdGVuZXJzKCdkYXRhJykubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlOyAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHJldHVybiB0aGlzOyAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcykgcmV0dXJuIHRoaXM7XG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7IC8vIGdvdCBhIG1hdGNoLlxuXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgZGVzdHNbX2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9IC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG5cblxuICB2YXIgaSA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaSA9PT0gLTEpIHJldHVybiB0aGlzO1xuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gIHJldHVybiB0aGlzO1xufTsgLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblxuXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcblxuICBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgIC8vIFN0YXJ0IGZsb3dpbmcgb24gbmV4dCB0aWNrIGlmIHN0cmVhbSBpc24ndCBleHBsaWNpdGx5IHBhdXNlZFxuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB0aGlzLnJlc3VtZSgpO1xuICB9IGVsc2UgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgbmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufSAvLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5cblxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIG5leHRUaWNrKHJlc3VtZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZV8oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICB9XG5cbiAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG4gIHN0YXRlLmF3YWl0RHJhaW4gPSAwO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpIHN0cmVhbS5yZWFkKDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpO1xuXG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG5cbiAgd2hpbGUgKHN0YXRlLmZsb3dpbmcgJiYgc3RyZWFtLnJlYWQoKSAhPT0gbnVsbCkge31cbn0gLy8gd3JhcCBhbiBvbGQtc3R5bGUgc3RyZWFtIGFzIHRoZSBhc3luYyBkYXRhIHNvdXJjZS5cbi8vIFRoaXMgaXMgKm5vdCogcGFydCBvZiB0aGUgcmVhZGFibGUgc3RyZWFtIGludGVyZmFjZS5cbi8vIEl0IGlzIGFuIHVnbHkgdW5mb3J0dW5hdGUgbWVzcyBvZiBoaXN0b3J5LlxuXG5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG5cbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBzZWxmLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIHNlbGYucHVzaChudWxsKTtcbiAgfSk7XG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTsgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG5cbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG4gICAgdmFyIHJldCA9IHNlbGYucHVzaChjaHVuayk7XG5cbiAgICBpZiAoIXJldCkge1xuICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIH1cbiAgfSk7IC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG5cbiAgZm9yICh2YXIgaSBpbiBzdHJlYW0pIHtcbiAgICBpZiAodGhpc1tpXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzdHJlYW1baV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbaV0gPSBmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbVttZXRob2RdLmFwcGx5KHN0cmVhbSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oaSk7XG4gICAgfVxuICB9IC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cblxuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pOyAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG5cbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHNlbGY7XG59OyAvLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5cblxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7IC8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cblxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgLy8gbm90aGluZyBidWZmZXJlZFxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgdmFyIHJldDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpO2Vsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIHJldCA9IHN0YXRlLmJ1ZmZlci5qb2luKCcnKTtlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuaGVhZC5kYXRhO2Vsc2UgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpO1xuICAgIHN0YXRlLmJ1ZmZlci5jbGVhcigpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQgcGFydCBvZiBsaXN0XG4gICAgcmV0ID0gZnJvbUxpc3RQYXJ0aWFsKG4sIHN0YXRlLmJ1ZmZlciwgc3RhdGUuZGVjb2Rlcik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn0gLy8gRXh0cmFjdHMgb25seSBlbm91Z2ggYnVmZmVyZWQgZGF0YSB0byBzYXRpc2Z5IHRoZSBhbW91bnQgcmVxdWVzdGVkLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5cblxuZnVuY3Rpb24gZnJvbUxpc3RQYXJ0aWFsKG4sIGxpc3QsIGhhc1N0cmluZ3MpIHtcbiAgdmFyIHJldDtcblxuICBpZiAobiA8IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzXG4gICAgcmV0ID0gbGlzdC5oZWFkLmRhdGEuc2xpY2UoMCwgbik7XG4gICAgbGlzdC5oZWFkLmRhdGEgPSBsaXN0LmhlYWQuZGF0YS5zbGljZShuKTtcbiAgfSBlbHNlIGlmIChuID09PSBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyXG4gICAgcmV0ID0gaGFzU3RyaW5ncyA/IGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIDogY29weUZyb21CdWZmZXIobiwgbGlzdCk7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufSAvLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhXG4vLyBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cblxuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSB7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHZhciByZXQgPSBwLmRhdGE7XG4gIG4gLT0gcmV0Lmxlbmd0aDtcblxuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHZhciBzdHIgPSBwLmRhdGE7XG4gICAgdmFyIG5iID0gbiA+IHN0ci5sZW5ndGggPyBzdHIubGVuZ3RoIDogbjtcbiAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHJldCArPSBzdHI7ZWxzZSByZXQgKz0gc3RyLnNsaWNlKDAsIG4pO1xuICAgIG4gLT0gbmI7XG5cbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICsrYztcbiAgICAgICAgaWYgKHAubmV4dCkgbGlzdC5oZWFkID0gcC5uZXh0O2Vsc2UgbGlzdC5oZWFkID0gbGlzdC50YWlsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QuaGVhZCA9IHA7XG4gICAgICAgIHAuZGF0YSA9IHN0ci5zbGljZShuYik7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgICsrYztcbiAgfVxuXG4gIGxpc3QubGVuZ3RoIC09IGM7XG4gIHJldHVybiByZXQ7XG59IC8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpIHtcbiAgdmFyIHJldCA9IGJ1ZmZlcl8xLmFsbG9jVW5zYWZlKG4pO1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICBwLmRhdGEuY29weShyZXQpO1xuICBuIC09IHAuZGF0YS5sZW5ndGg7XG5cbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG5cbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgaWYgKG5iID09PSBidWYubGVuZ3RoKSB7XG4gICAgICAgICsrYztcbiAgICAgICAgaWYgKHAubmV4dCkgbGlzdC5oZWFkID0gcC5uZXh0O2Vsc2UgbGlzdC5oZWFkID0gbGlzdC50YWlsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QuaGVhZCA9IHA7XG4gICAgICAgIHAuZGF0YSA9IGJ1Zi5zbGljZShuYik7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgICsrYztcbiAgfVxuXG4gIGxpc3QubGVuZ3RoIC09IGM7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7IC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ1wiZW5kUmVhZGFibGUoKVwiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIG5leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuV3JpdGFibGUuV3JpdGFibGVTdGF0ZSA9IFdyaXRhYmxlU3RhdGU7XG5pbmhlcml0cyQxKFdyaXRhYmxlLCBFdmVudEVtaXR0ZXIpO1xuXG5mdW5jdGlvbiBub3AoKSB7fVxuXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYnVmZmVyJywge1xuICAgIGdldDogZGVwcmVjYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJylcbiAgfSk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OyAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuXG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTsgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG5cbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207IC8vIGNhc3QgdG8gaW50cy5cblxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+fnRoaXMuaGlnaFdhdGVyTWFyaztcbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTsgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcblxuICB0aGlzLmVuZGluZyA9IGZhbHNlOyAvLyB3aGVuIGVuZCgpIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHJldHVybmVkXG5cbiAgdGhpcy5lbmRlZCA9IGZhbHNlOyAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcblxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7IC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cblxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7IC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7IC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG5cbiAgdGhpcy5sZW5ndGggPSAwOyAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlOyAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG5cbiAgdGhpcy5jb3JrZWQgPSAwOyAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cblxuICB0aGlzLnN5bmMgPSB0cnVlOyAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlOyAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG5cbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTsgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG5cblxuICB0aGlzLndyaXRlY2IgPSBudWxsOyAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG5cbiAgdGhpcy53cml0ZWxlbiA9IDA7XG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDsgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG5cbiAgdGhpcy5wZW5kaW5nY2IgPSAwOyAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG5cbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlOyAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7IC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG5cbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7IC8vIGFsbG9jYXRlIHRoZSBmaXJzdCBDb3JrZWRSZXF1ZXN0LCB0aGVyZSBpcyBhbHdheXNcbiAgLy8gb25lIGFsbG9jYXRlZCBhbmQgZnJlZSB0byB1c2UsIGFuZCB3ZSBtYWludGFpbiBhdCBtb3N0IHR3b1xuXG4gIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIHdyaXRhYmxlU3RhdGVHZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcblxuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufTtcbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gaW5zdGFuY2VvZiBXcml0YWJsZSwgdGhleSdyZSBpbnN0YW5jZW9mIFJlYWRhYmxlLlxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTsgLy8gbGVnYWN5LlxuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG4gIH1cblxuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcbn0gLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZScpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpOyAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuXG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgbmV4dFRpY2soY2IsIGVyKTtcbn0gLy8gSWYgd2UgZ2V0IHNvbWV0aGluZyB0aGF0IGlzIG5vdCBhIGJ1ZmZlciwgc3RyaW5nLCBudWxsLCBvciB1bmRlZmluZWQsXG4vLyBhbmQgd2UncmUgbm90IGluIG9iamVjdE1vZGUsIHRoZW4gdGhhdCdzIGFuIGVycm9yLlxuLy8gT3RoZXJ3aXNlIHN0cmVhbSBjaHVua3MgYXJlIGFsbCBjb25zaWRlcmVkIHRvIGJlIG9mIGxlbmd0aD0xLCBhbmQgdGhlXG4vLyB3YXRlcm1hcmtzIGRldGVybWluZSBob3cgbWFueSBvYmplY3RzIHRvIGtlZXAgaW4gdGhlIGJ1ZmZlciwgcmF0aGVyIHRoYW5cbi8vIGhvdyBtYW55IGJ5dGVzIG9yIGNoYXJhY3RlcnMuXG5cblxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgdmFyIGVyID0gZmFsc2U7IC8vIEFsd2F5cyB0aHJvdyBlcnJvciBpZiBhIG51bGwgaXMgd3JpdHRlblxuICAvLyBpZiB3ZSBhcmUgbm90IGluIG9iamVjdCBtb2RlIHRoZW4gdGhyb3dcbiAgLy8gaWYgaXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG9yIHVuZGVmaW5lZC5cblxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ01heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtJyk7XG4gIH0gZWxzZSBpZiAoIWJ1ZmZlcl8xLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuXG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBuZXh0VGljayhjYiwgZXIpO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoYnVmZmVyXzEuaXNCdWZmZXIoY2h1bmspKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuICBpZiAoc3RhdGUuZW5kZWQpIHdyaXRlQWZ0ZXJFbmQodGhpcywgY2IpO2Vsc2UgaWYgKHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG4gICAgaWYgKCFzdGF0ZS53cml0aW5nICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUpO1xuICB9XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIShbJ2hleCcsICd1dGY4JywgJ3V0Zi04JywgJ2FzY2lpJywgJ2JpbmFyeScsICdiYXNlNjQnLCAndWNzMicsICd1Y3MtMicsICd1dGYxNmxlJywgJ3V0Zi0xNmxlJywgJ3JhdyddLmluZGV4T2YoKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IGJ1ZmZlcl8xLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuXG4gIHJldHVybiBjaHVuaztcbn0gLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cblxuXG5mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2h1bmsgPSBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKTtcbiAgaWYgKGJ1ZmZlcl8xLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyazsgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYik7XG5cbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG5cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCArPSAxO1xuICB9IGVsc2Uge1xuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHdyaXRldiwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgaWYgKHdyaXRldikgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpO2Vsc2Ugc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgLS1zdGF0ZS5wZW5kaW5nY2I7XG4gIGlmIChzeW5jKSBuZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBuZXh0VGljayhhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgLyo8L3JlcGxhY2VtZW50PiovXG4gICAgfSBlbHNlIHtcbiAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59IC8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuXG5cbmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUubmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJyk7XG4gIH1cbn0gLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcblxuXG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlO1xuICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3Q7XG5cbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIGVudHJ5ICYmIGVudHJ5Lm5leHQpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGwgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBob2xkZXIgPSBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7XG4gICAgaG9sZGVyLmVudHJ5ID0gZW50cnk7XG4gICAgdmFyIGNvdW50ID0gMDtcblxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgYnVmZmVyW2NvdW50XSA9IGVudHJ5O1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7IC8vIGRvV3JpdGUgaXMgYWxtb3N0IGFsd2F5cyBhc3luYywgZGVmZXIgdGhlc2UgdG8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgLy8gYXMgdGhlIGhvdCBwYXRoIGVuZHMgd2l0aCBkb1dyaXRlXG5cbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAgIGlmIChob2xkZXIubmV4dCkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU2xvdyBjYXNlLCB3cml0ZSBjaHVua3Mgb25lLWJ5LW9uZVxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cblxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTsgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9IC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cblxuXG4gIGlmICghc3RhdGUuZW5kaW5nICYmICFzdGF0ZS5maW5pc2hlZCkgZW5kV3JpdGFibGUodGhpcywgc3RhdGUsIGNiKTtcbn07XG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmVuZGluZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID09PSBudWxsICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUud3JpdGluZztcbn1cblxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCkge1xuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gIGlmIChuZWVkKSB7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuXG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgbmV4dFRpY2soY2IpO2Vsc2Ugc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuXG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59IC8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5cblxuZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzdGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMubmV4dCA9IG51bGw7XG4gIHRoaXMuZW50cnkgPSBudWxsO1xuXG4gIHRoaXMuZmluaXNoID0gZnVuY3Rpb24gKGVycikge1xuICAgIHZhciBlbnRyeSA9IF90aGlzLmVudHJ5O1xuICAgIF90aGlzLmVudHJ5ID0gbnVsbDtcblxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgIGNiKGVycik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBfdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gX3RoaXM7XG4gICAgfVxuICB9O1xufVxuXG5pbmhlcml0cyQxKER1cGxleCwgUmVhZGFibGUpO1xudmFyIGtleXMgPSBPYmplY3Qua2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuXG5mb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn1cbmZ1bmN0aW9uIER1cGxleChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtcbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufSAvLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5cbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjsgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cblxuICBuZXh0VGljayhvbkVuZE5ULCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gb25FbmROVChzZWxmKSB7XG4gIHNlbGYuZW5kKCk7XG59XG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbmluaGVyaXRzJDEoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdGF0ZShzdHJlYW0pIHtcbiAgdGhpcy5hZnRlclRyYW5zZm9ybSA9IGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgIHJldHVybiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKTtcbiAgfTtcblxuICB0aGlzLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgdGhpcy50cmFuc2Zvcm1pbmcgPSBmYWxzZTtcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcbiAgdGhpcy53cml0ZWNodW5rID0gbnVsbDtcbiAgdGhpcy53cml0ZWVuY29kaW5nID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSkge1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuICB0cy50cmFuc2Zvcm1pbmcgPSBmYWxzZTtcbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcbiAgaWYgKCFjYikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7XG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcbiAgaWYgKGRhdGEgIT09IG51bGwgJiYgZGF0YSAhPT0gdW5kZWZpbmVkKSBzdHJlYW0ucHVzaChkYXRhKTtcbiAgY2IoZXIpO1xuICB2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcblxuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKSByZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKTtcbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpOyAvLyB3aGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7IC8vIHN0YXJ0IG91dCBhc2tpbmcgZm9yIGEgcmVhZGFibGUgZXZlbnQgb25jZSBkYXRhIGlzIHRyYW5zZm9ybWVkLlxuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTsgLy8gd2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2g7XG4gIH1cblxuICB0aGlzLm9uY2UoJ3ByZWZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaChmdW5jdGlvbiAoZXIpIHtcbiAgICAgIGRvbmUoc3RyZWFtLCBlcik7XG4gICAgfSk7ZWxzZSBkb25lKHN0cmVhbSk7XG4gIH0pO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59OyAvLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuXG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuXG4gIGlmICghdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAodHMubmVlZFRyYW5zZm9ybSB8fCBycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufTsgLy8gRG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgYXJncyBhcmUgaGVyZS5cbi8vIF90cmFuc2Zvcm0gZG9lcyBhbGwgdGhlIHdvcmsuXG4vLyBUaGF0IHdlIGdvdCBoZXJlIG1lYW5zIHRoYXQgdGhlIHJlYWRhYmxlIHNpZGUgd2FudHMgbW9yZSBkYXRhLlxuXG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGRvbmUoc3RyZWFtLCBlcikge1xuICBpZiAoZXIpIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7IC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG5cbiAgdmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuICBpZiAod3MubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuICBpZiAodHMudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufVxuXG5pbmhlcml0cyQxKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59O1xuXG5pbmhlcml0cyQxKFN0cmVhbSwgRXZlbnRFbWl0dGVyKTtcblN0cmVhbS5SZWFkYWJsZSA9IFJlYWRhYmxlO1xuU3RyZWFtLldyaXRhYmxlID0gV3JpdGFibGU7XG5TdHJlYW0uRHVwbGV4ID0gRHVwbGV4O1xuU3RyZWFtLlRyYW5zZm9ybSA9IFRyYW5zZm9ybTtcblN0cmVhbS5QYXNzVGhyb3VnaCA9IFBhc3NUaHJvdWdoOyAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjQueFxuXG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtO1xuLy8gcGFydCBvZiB0aGlzIGNsYXNzKSBpcyBvdmVycmlkZGVuIGluIHRoZSBSZWFkYWJsZSBjbGFzcy5cblxuZnVuY3Rpb24gU3RyZWFtKCkge1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcbn1cblxuU3RyZWFtLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIG9wdGlvbnMpIHtcbiAgdmFyIHNvdXJjZSA9IHRoaXM7XG5cbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgaWYgKGRlc3Qud3JpdGFibGUpIHtcbiAgICAgIGlmIChmYWxzZSA9PT0gZGVzdC53cml0ZShjaHVuaykgJiYgc291cmNlLnBhdXNlKSB7XG4gICAgICAgIHNvdXJjZS5wYXVzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZGF0YScsIG9uZGF0YSk7XG5cbiAgZnVuY3Rpb24gb25kcmFpbigpIHtcbiAgICBpZiAoc291cmNlLnJlYWRhYmxlICYmIHNvdXJjZS5yZXN1bWUpIHtcbiAgICAgIHNvdXJjZS5yZXN1bWUoKTtcbiAgICB9XG4gIH1cblxuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pOyAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuXG4gIGlmICghZGVzdC5faXNTdGRpbyAmJiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5lbmQgIT09IGZhbHNlKSkge1xuICAgIHNvdXJjZS5vbignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5vbignY2xvc2UnLCBvbmNsb3NlKTtcbiAgfVxuXG4gIHZhciBkaWRPbkVuZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG4gICAgaWYgKHR5cGVvZiBkZXN0LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIGRlc3QuZGVzdHJveSgpO1xuICB9IC8vIGRvbid0IGxlYXZlIGRhbmdsaW5nIHBpcGVzIHdoZW4gdGhlcmUgYXJlIGVycm9ycy5cblxuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBjbGVhbnVwKCk7XG5cbiAgICBpZiAoRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQodGhpcywgJ2Vycm9yJykgPT09IDApIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgc3RyZWFtIGVycm9yIGluIHBpcGUuXG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpOyAvLyByZW1vdmUgYWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkLlxuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuICB9XG5cbiAgc291cmNlLm9uKCdlbmQnLCBjbGVhbnVwKTtcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApO1xuICBkZXN0Lm9uKCdjbG9zZScsIGNsZWFudXApO1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzb3VyY2UpOyAvLyBBbGxvdyBmb3IgdW5peC1saWtlIHVzYWdlOiBBLnBpcGUoQikucGlwZShDKVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXI7XG52YXIgc2FmZXIgPSB7fTtcbnZhciBrZXk7XG5cbmZvciAoa2V5IGluIGJ1ZmZlcikge1xuICBpZiAoIWJ1ZmZlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZTtcbiAgaWYgKGtleSA9PT0gJ1Nsb3dCdWZmZXInIHx8IGtleSA9PT0gJ0J1ZmZlcicpIGNvbnRpbnVlO1xuICBzYWZlcltrZXldID0gYnVmZmVyW2tleV07XG59XG5cbnZhciBTYWZlciA9IHNhZmVyLkJ1ZmZlciA9IHt9O1xuXG5mb3IgKGtleSBpbiBCdWZmZXIpIHtcbiAgaWYgKCFCdWZmZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7XG4gIGlmIChrZXkgPT09ICdhbGxvY1Vuc2FmZScgfHwga2V5ID09PSAnYWxsb2NVbnNhZmVTbG93JykgY29udGludWU7XG4gIFNhZmVyW2tleV0gPSBCdWZmZXJba2V5XTtcbn1cblxuc2FmZXIuQnVmZmVyLnByb3RvdHlwZSA9IEJ1ZmZlci5wcm90b3R5cGU7XG5cbmlmICghU2FmZXIuZnJvbSB8fCBTYWZlci5mcm9tID09PSBVaW50OEFycmF5LmZyb20pIHtcbiAgU2FmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufVxuXG5pZiAoIVNhZmVyLmFsbG9jKSB7XG4gIFNhZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzaXplKTtcbiAgICB9XG5cbiAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+PSAyICogKDEgPDwgMzApKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJyk7XG4gICAgfVxuXG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKTtcblxuICAgIGlmICghZmlsbCB8fCBmaWxsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYnVmLmZpbGwoMCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwpO1xuICAgIH1cblxuICAgIHJldHVybiBidWY7XG4gIH07XG59XG5cbmlmICghc2FmZXIua1N0cmluZ01heExlbmd0aCkge1xuICB0cnkge1xuICAgIHNhZmVyLmtTdHJpbmdNYXhMZW5ndGggPSBwcm9jZXNzLmJpbmRpbmcoJ2J1ZmZlcicpLmtTdHJpbmdNYXhMZW5ndGg7XG4gIH0gY2F0Y2ggKGUpIHsvLyB3ZSBjYW4ndCBkZXRlcm1pbmUga1N0cmluZ01heExlbmd0aCBpbiBlbnZpcm9ubWVudHMgd2hlcmUgcHJvY2Vzcy5iaW5kaW5nXG4gICAgLy8gaXMgdW5zdXBwb3J0ZWQsIHNvIGxldCdzIG5vdCBzZXQgaXRcbiAgfVxufVxuXG5pZiAoIXNhZmVyLmNvbnN0YW50cykge1xuICBzYWZlci5jb25zdGFudHMgPSB7XG4gICAgTUFYX0xFTkdUSDogc2FmZXIua01heExlbmd0aFxuICB9O1xuXG4gIGlmIChzYWZlci5rU3RyaW5nTWF4TGVuZ3RoKSB7XG4gICAgc2FmZXIuY29uc3RhbnRzLk1BWF9TVFJJTkdfTEVOR1RIID0gc2FmZXIua1N0cmluZ01heExlbmd0aDtcbiAgfVxufVxuXG52YXIgc2FmZXJfMSA9IHNhZmVyO1xuXG52YXIgQk9NQ2hhciA9IFwiXFx1RkVGRlwiO1xudmFyIFByZXBlbmRCT00gPSBQcmVwZW5kQk9NV3JhcHBlcjtcblxuZnVuY3Rpb24gUHJlcGVuZEJPTVdyYXBwZXIoZW5jb2Rlciwgb3B0aW9ucykge1xuICB0aGlzLmVuY29kZXIgPSBlbmNvZGVyO1xuICB0aGlzLmFkZEJPTSA9IHRydWU7XG59XG5cblByZXBlbmRCT01XcmFwcGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgaWYgKHRoaXMuYWRkQk9NKSB7XG4gICAgc3RyID0gQk9NQ2hhciArIHN0cjtcbiAgICB0aGlzLmFkZEJPTSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZW5jb2Rlci53cml0ZShzdHIpO1xufTtcblxuUHJlcGVuZEJPTVdyYXBwZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZW5jb2Rlci5lbmQoKTtcbn07IC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxudmFyIFN0cmlwQk9NID0gU3RyaXBCT01XcmFwcGVyO1xuXG5mdW5jdGlvbiBTdHJpcEJPTVdyYXBwZXIoZGVjb2Rlciwgb3B0aW9ucykge1xuICB0aGlzLmRlY29kZXIgPSBkZWNvZGVyO1xuICB0aGlzLnBhc3MgPSBmYWxzZTtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbn1cblxuU3RyaXBCT01XcmFwcGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgdmFyIHJlcyA9IHRoaXMuZGVjb2Rlci53cml0ZShidWYpO1xuICBpZiAodGhpcy5wYXNzIHx8ICFyZXMpIHJldHVybiByZXM7XG5cbiAgaWYgKHJlc1swXSA9PT0gQk9NQ2hhcikge1xuICAgIHJlcyA9IHJlcy5zbGljZSgxKTtcbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5zdHJpcEJPTSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5vcHRpb25zLnN0cmlwQk9NKCk7XG4gIH1cblxuICB0aGlzLnBhc3MgPSB0cnVlO1xuICByZXR1cm4gcmVzO1xufTtcblxuU3RyaXBCT01XcmFwcGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmRlY29kZXIuZW5kKCk7XG59O1xuXG52YXIgYm9tSGFuZGxpbmcgPSB7XG4gIFByZXBlbmRCT006IFByZXBlbmRCT00sXG4gIFN0cmlwQk9NOiBTdHJpcEJPTVxufTtcblxudmFyIEJ1ZmZlciQxID0gc2FmZXJfMS5CdWZmZXI7IC8vIEV4cG9ydCBOb2RlLmpzIGludGVybmFsIGVuY29kaW5ncy5cblxudmFyIGludGVybmFsID0ge1xuICAvLyBFbmNvZGluZ3NcbiAgdXRmODoge1xuICAgIHR5cGU6IFwiX2ludGVybmFsXCIsXG4gICAgYm9tQXdhcmU6IHRydWVcbiAgfSxcbiAgY2VzdTg6IHtcbiAgICB0eXBlOiBcIl9pbnRlcm5hbFwiLFxuICAgIGJvbUF3YXJlOiB0cnVlXG4gIH0sXG4gIHVuaWNvZGUxMXV0Zjg6IFwidXRmOFwiLFxuICB1Y3MyOiB7XG4gICAgdHlwZTogXCJfaW50ZXJuYWxcIixcbiAgICBib21Bd2FyZTogdHJ1ZVxuICB9LFxuICB1dGYxNmxlOiBcInVjczJcIixcbiAgYmluYXJ5OiB7XG4gICAgdHlwZTogXCJfaW50ZXJuYWxcIlxuICB9LFxuICBiYXNlNjQ6IHtcbiAgICB0eXBlOiBcIl9pbnRlcm5hbFwiXG4gIH0sXG4gIGhleDoge1xuICAgIHR5cGU6IFwiX2ludGVybmFsXCJcbiAgfSxcbiAgLy8gQ29kZWMuXG4gIF9pbnRlcm5hbDogSW50ZXJuYWxDb2RlY1xufTsgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gSW50ZXJuYWxDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gIHRoaXMuZW5jID0gY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZTtcbiAgdGhpcy5ib21Bd2FyZSA9IGNvZGVjT3B0aW9ucy5ib21Bd2FyZTtcbiAgaWYgKHRoaXMuZW5jID09PSBcImJhc2U2NFwiKSB0aGlzLmVuY29kZXIgPSBJbnRlcm5hbEVuY29kZXJCYXNlNjQ7ZWxzZSBpZiAodGhpcy5lbmMgPT09IFwiY2VzdThcIikge1xuICAgIHRoaXMuZW5jID0gXCJ1dGY4XCI7IC8vIFVzZSB1dGY4IGZvciBkZWNvZGluZy5cblxuICAgIHRoaXMuZW5jb2RlciA9IEludGVybmFsRW5jb2RlckNlc3U4OyAvLyBBZGQgZGVjb2RlciBmb3IgdmVyc2lvbnMgb2YgTm9kZSBub3Qgc3VwcG9ydGluZyBDRVNVLThcblxuICAgIGlmIChCdWZmZXIkMS5mcm9tKCdlZGEwYmRlZGIyYTknLCAnaGV4JykudG9TdHJpbmcoKSAhPT0gJ/CfkqknKSB7XG4gICAgICB0aGlzLmRlY29kZXIgPSBJbnRlcm5hbERlY29kZXJDZXN1ODtcbiAgICAgIHRoaXMuZGVmYXVsdENoYXJVbmljb2RlID0gaWNvbnYuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgIH1cbiAgfVxufVxuXG5JbnRlcm5hbENvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gSW50ZXJuYWxFbmNvZGVyO1xuSW50ZXJuYWxDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IEludGVybmFsRGVjb2RlcjsgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdlIHVzZSBub2RlLmpzIGludGVybmFsIGRlY29kZXIuIEl0cyBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgb3Vycy5cblxudmFyIFN0cmluZ0RlY29kZXIgPSBzdHJpbmdfZGVjb2Rlci5TdHJpbmdEZWNvZGVyO1xuaWYgKCFTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQpIC8vIE5vZGUgdjAuOCBkb2Vzbid0IGhhdmUgdGhpcyBtZXRob2QuXG4gIFN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHt9O1xuXG5mdW5jdGlvbiBJbnRlcm5hbERlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgU3RyaW5nRGVjb2Rlci5jYWxsKHRoaXMsIGNvZGVjLmVuYyk7XG59XG5cbkludGVybmFsRGVjb2Rlci5wcm90b3R5cGUgPSBTdHJpbmdEZWNvZGVyLnByb3RvdHlwZTsgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVuY29kZXIgaXMgbW9zdGx5IHRyaXZpYWxcblxuZnVuY3Rpb24gSW50ZXJuYWxFbmNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIHRoaXMuZW5jID0gY29kZWMuZW5jO1xufVxuXG5JbnRlcm5hbEVuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gQnVmZmVyJDEuZnJvbShzdHIsIHRoaXMuZW5jKTtcbn07XG5cbkludGVybmFsRW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge307IC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeGNlcHQgYmFzZTY0IGVuY29kZXIsIHdoaWNoIG11c3Qga2VlcCBpdHMgc3RhdGUuXG5cblxuZnVuY3Rpb24gSW50ZXJuYWxFbmNvZGVyQmFzZTY0KG9wdGlvbnMsIGNvZGVjKSB7XG4gIHRoaXMucHJldlN0ciA9ICcnO1xufVxuXG5JbnRlcm5hbEVuY29kZXJCYXNlNjQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICBzdHIgPSB0aGlzLnByZXZTdHIgKyBzdHI7XG4gIHZhciBjb21wbGV0ZVF1YWRzID0gc3RyLmxlbmd0aCAtIHN0ci5sZW5ndGggJSA0O1xuICB0aGlzLnByZXZTdHIgPSBzdHIuc2xpY2UoY29tcGxldGVRdWFkcyk7XG4gIHN0ciA9IHN0ci5zbGljZSgwLCBjb21wbGV0ZVF1YWRzKTtcbiAgcmV0dXJuIEJ1ZmZlciQxLmZyb20oc3RyLCBcImJhc2U2NFwiKTtcbn07XG5cbkludGVybmFsRW5jb2RlckJhc2U2NC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gQnVmZmVyJDEuZnJvbSh0aGlzLnByZXZTdHIsIFwiYmFzZTY0XCIpO1xufTsgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENFU1UtOCBlbmNvZGVyIGlzIGFsc28gc3BlY2lhbC5cblxuXG5mdW5jdGlvbiBJbnRlcm5hbEVuY29kZXJDZXN1OChvcHRpb25zLCBjb2RlYykge31cblxuSW50ZXJuYWxFbmNvZGVyQ2VzdTgucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gQnVmZmVyJDEuYWxsb2Moc3RyLmxlbmd0aCAqIDMpLFxuICAgICAgYnVmSWR4ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpOyAvLyBOYWl2ZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGl0IHdvcmtzIGJlY2F1c2UgQ0VTVS04IGlzIGVzcGVjaWFsbHkgZWFzeVxuICAgIC8vIHRvIGNvbnZlcnQgZnJvbSBVVEYtMTYgKHdoaWNoIGFsbCBKUyBzdHJpbmdzIGFyZSBlbmNvZGVkIGluKS5cblxuICAgIGlmIChjaGFyQ29kZSA8IDB4ODApIGJ1ZltidWZJZHgrK10gPSBjaGFyQ29kZTtlbHNlIGlmIChjaGFyQ29kZSA8IDB4ODAwKSB7XG4gICAgICBidWZbYnVmSWR4KytdID0gMHhDMCArIChjaGFyQ29kZSA+Pj4gNik7XG4gICAgICBidWZbYnVmSWR4KytdID0gMHg4MCArIChjaGFyQ29kZSAmIDB4M2YpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjaGFyQ29kZSB3aWxsIGFsd2F5cyBiZSA8IDB4MTAwMDAgaW4gamF2YXNjcmlwdC5cbiAgICAgIGJ1ZltidWZJZHgrK10gPSAweEUwICsgKGNoYXJDb2RlID4+PiAxMik7XG4gICAgICBidWZbYnVmSWR4KytdID0gMHg4MCArIChjaGFyQ29kZSA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2J1ZklkeCsrXSA9IDB4ODAgKyAoY2hhckNvZGUgJiAweDNmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmLnNsaWNlKDAsIGJ1ZklkeCk7XG59O1xuXG5JbnRlcm5hbEVuY29kZXJDZXN1OC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge307IC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDRVNVLTggZGVjb2RlciBpcyBub3QgaW1wbGVtZW50ZWQgaW4gTm9kZSB2NC4wK1xuXG5cbmZ1bmN0aW9uIEludGVybmFsRGVjb2RlckNlc3U4KG9wdGlvbnMsIGNvZGVjKSB7XG4gIHRoaXMuYWNjID0gMDtcbiAgdGhpcy5jb250Qnl0ZXMgPSAwO1xuICB0aGlzLmFjY0J5dGVzID0gMDtcbiAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBjb2RlYy5kZWZhdWx0Q2hhclVuaWNvZGU7XG59XG5cbkludGVybmFsRGVjb2RlckNlc3U4LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgdmFyIGFjYyA9IHRoaXMuYWNjLFxuICAgICAgY29udEJ5dGVzID0gdGhpcy5jb250Qnl0ZXMsXG4gICAgICBhY2NCeXRlcyA9IHRoaXMuYWNjQnl0ZXMsXG4gICAgICByZXMgPSAnJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjdXJCeXRlID0gYnVmW2ldO1xuXG4gICAgaWYgKChjdXJCeXRlICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgIC8vIExlYWRpbmcgYnl0ZVxuICAgICAgaWYgKGNvbnRCeXRlcyA+IDApIHtcbiAgICAgICAgLy8gUHJldmlvdXMgY29kZSBpcyBpbnZhbGlkXG4gICAgICAgIHJlcyArPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgICAgICAgY29udEJ5dGVzID0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1ckJ5dGUgPCAweDgwKSB7XG4gICAgICAgIC8vIFNpbmdsZS1ieXRlIGNvZGVcbiAgICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY3VyQnl0ZSk7XG4gICAgICB9IGVsc2UgaWYgKGN1ckJ5dGUgPCAweEUwKSB7XG4gICAgICAgIC8vIFR3by1ieXRlIGNvZGVcbiAgICAgICAgYWNjID0gY3VyQnl0ZSAmIDB4MUY7XG4gICAgICAgIGNvbnRCeXRlcyA9IDE7XG4gICAgICAgIGFjY0J5dGVzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoY3VyQnl0ZSA8IDB4RjApIHtcbiAgICAgICAgLy8gVGhyZWUtYnl0ZSBjb2RlXG4gICAgICAgIGFjYyA9IGN1ckJ5dGUgJiAweDBGO1xuICAgICAgICBjb250Qnl0ZXMgPSAyO1xuICAgICAgICBhY2NCeXRlcyA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3VyIG9yIG1vcmUgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIENFU1UtOC5cbiAgICAgICAgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250aW51YXRpb24gYnl0ZVxuICAgICAgaWYgKGNvbnRCeXRlcyA+IDApIHtcbiAgICAgICAgLy8gV2UncmUgd2FpdGluZyBmb3IgaXQuXG4gICAgICAgIGFjYyA9IGFjYyA8PCA2IHwgY3VyQnl0ZSAmIDB4M2Y7XG4gICAgICAgIGNvbnRCeXRlcy0tO1xuICAgICAgICBhY2NCeXRlcysrO1xuXG4gICAgICAgIGlmIChjb250Qnl0ZXMgPT09IDApIHtcbiAgICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmxvbmcgZW5jb2RpbmcsIGJ1dCBzdXBwb3J0IE1vZGlmaWVkIFVURi04IChlbmNvZGluZyBOVUxMIGFzIEMwIDgwKVxuICAgICAgICAgIGlmIChhY2NCeXRlcyA9PT0gMiAmJiBhY2MgPCAweDgwICYmIGFjYyA+IDApIHJlcyArPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZTtlbHNlIGlmIChhY2NCeXRlcyA9PT0gMyAmJiBhY2MgPCAweDgwMCkgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO2Vsc2UgLy8gQWN0dWFsbHkgYWRkIGNoYXJhY3Rlci5cbiAgICAgICAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFjYyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVuZXhwZWN0ZWQgY29udGludWF0aW9uIGJ5dGVcbiAgICAgICAgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuYWNjID0gYWNjO1xuICB0aGlzLmNvbnRCeXRlcyA9IGNvbnRCeXRlcztcbiAgdGhpcy5hY2NCeXRlcyA9IGFjY0J5dGVzO1xuICByZXR1cm4gcmVzO1xufTtcblxuSW50ZXJuYWxEZWNvZGVyQ2VzdTgucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGlmICh0aGlzLmNvbnRCeXRlcyA+IDApIHJlcyArPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbnZhciBCdWZmZXIkMiA9IHNhZmVyXzEuQnVmZmVyOyAvLyBOb3RlOiBVVEYxNi1MRSAob3IgVUNTMikgY29kZWMgaXMgTm9kZS5qcyBuYXRpdmUuIFNlZSBlbmNvZGluZ3MvaW50ZXJuYWwuanNcbi8vID09IFVURjE2LUJFIGNvZGVjLiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbnZhciB1dGYxNmJlID0gVXRmMTZCRUNvZGVjO1xuXG5mdW5jdGlvbiBVdGYxNkJFQ29kZWMoKSB7fVxuXG5VdGYxNkJFQ29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBVdGYxNkJFRW5jb2RlcjtcblV0ZjE2QkVDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFV0ZjE2QkVEZWNvZGVyO1xuVXRmMTZCRUNvZGVjLnByb3RvdHlwZS5ib21Bd2FyZSA9IHRydWU7IC8vIC0tIEVuY29kaW5nXG5cbmZ1bmN0aW9uIFV0ZjE2QkVFbmNvZGVyKCkge31cblxuVXRmMTZCRUVuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gQnVmZmVyJDIuZnJvbShzdHIsICd1Y3MyJyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgdG1wID0gYnVmW2ldO1xuICAgIGJ1ZltpXSA9IGJ1ZltpICsgMV07XG4gICAgYnVmW2kgKyAxXSA9IHRtcDtcbiAgfVxuXG4gIHJldHVybiBidWY7XG59O1xuXG5VdGYxNkJFRW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge307IC8vIC0tIERlY29kaW5nXG5cblxuZnVuY3Rpb24gVXRmMTZCRURlY29kZXIoKSB7XG4gIHRoaXMub3ZlcmZsb3dCeXRlID0gLTE7XG59XG5cblV0ZjE2QkVEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgaWYgKGJ1Zi5sZW5ndGggPT0gMCkgcmV0dXJuICcnO1xuICB2YXIgYnVmMiA9IEJ1ZmZlciQyLmFsbG9jKGJ1Zi5sZW5ndGggKyAxKSxcbiAgICAgIGkgPSAwLFxuICAgICAgaiA9IDA7XG5cbiAgaWYgKHRoaXMub3ZlcmZsb3dCeXRlICE9PSAtMSkge1xuICAgIGJ1ZjJbMF0gPSBidWZbMF07XG4gICAgYnVmMlsxXSA9IHRoaXMub3ZlcmZsb3dCeXRlO1xuICAgIGkgPSAxO1xuICAgIGogPSAyO1xuICB9XG5cbiAgZm9yICg7IGkgPCBidWYubGVuZ3RoIC0gMTsgaSArPSAyLCBqICs9IDIpIHtcbiAgICBidWYyW2pdID0gYnVmW2kgKyAxXTtcbiAgICBidWYyW2ogKyAxXSA9IGJ1ZltpXTtcbiAgfVxuXG4gIHRoaXMub3ZlcmZsb3dCeXRlID0gaSA9PSBidWYubGVuZ3RoIC0gMSA/IGJ1ZltidWYubGVuZ3RoIC0gMV0gOiAtMTtcbiAgcmV0dXJuIGJ1ZjIuc2xpY2UoMCwgaikudG9TdHJpbmcoJ3VjczInKTtcbn07XG5cblV0ZjE2QkVEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7fTsgLy8gPT0gVVRGLTE2IGNvZGVjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERlY29kZXIgY2hvb3NlcyBhdXRvbWF0aWNhbGx5IGZyb20gVVRGLTE2TEUgYW5kIFVURi0xNkJFIHVzaW5nIEJPTSBhbmQgc3BhY2UtYmFzZWQgaGV1cmlzdGljLlxuLy8gRGVmYXVsdHMgdG8gVVRGLTE2TEUsIGFzIGl0J3MgcHJldmFsZW50IGFuZCBkZWZhdWx0IGluIE5vZGUuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiBhbmQgaHR0cDovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jdXRmLTE2bGVcbi8vIERlY29kZXIgZGVmYXVsdCBjYW4gYmUgY2hhbmdlZDogaWNvbnYuZGVjb2RlKGJ1ZiwgJ3V0ZjE2Jywge2RlZmF1bHRFbmNvZGluZzogJ3V0Zi0xNmJlJ30pO1xuLy8gRW5jb2RlciB1c2VzIFVURi0xNkxFIGFuZCBwcmVwZW5kcyBCT00gKHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggYWRkQk9NOiBmYWxzZSkuXG5cblxudmFyIHV0ZjE2XzEgPSBVdGYxNkNvZGVjO1xuXG5mdW5jdGlvbiBVdGYxNkNvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgdGhpcy5pY29udiA9IGljb252O1xufVxuXG5VdGYxNkNvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmMTZFbmNvZGVyO1xuVXRmMTZDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFV0ZjE2RGVjb2RlcjsgLy8gLS0gRW5jb2RpbmcgKHBhc3MtdGhyb3VnaClcblxuZnVuY3Rpb24gVXRmMTZFbmNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAob3B0aW9ucy5hZGRCT00gPT09IHVuZGVmaW5lZCkgb3B0aW9ucy5hZGRCT00gPSB0cnVlO1xuICB0aGlzLmVuY29kZXIgPSBjb2RlYy5pY29udi5nZXRFbmNvZGVyKCd1dGYtMTZsZScsIG9wdGlvbnMpO1xufVxuXG5VdGYxNkVuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gdGhpcy5lbmNvZGVyLndyaXRlKHN0cik7XG59O1xuXG5VdGYxNkVuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuZW5jb2Rlci5lbmQoKTtcbn07IC8vIC0tIERlY29kaW5nXG5cblxuZnVuY3Rpb24gVXRmMTZEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuaW5pdGlhbEJ5dGVzID0gW107XG4gIHRoaXMuaW5pdGlhbEJ5dGVzTGVuID0gMDtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5pY29udiA9IGNvZGVjLmljb252O1xufVxuXG5VdGYxNkRlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAoIXRoaXMuZGVjb2Rlcikge1xuICAgIC8vIENvZGVjIGlzIG5vdCBjaG9zZW4geWV0LiBBY2N1bXVsYXRlIGluaXRpYWwgYnl0ZXMuXG4gICAgdGhpcy5pbml0aWFsQnl0ZXMucHVzaChidWYpO1xuICAgIHRoaXMuaW5pdGlhbEJ5dGVzTGVuICs9IGJ1Zi5sZW5ndGg7XG4gICAgaWYgKHRoaXMuaW5pdGlhbEJ5dGVzTGVuIDwgMTYpIC8vIFdlIG5lZWQgbW9yZSBieXRlcyB0byB1c2Ugc3BhY2UgaGV1cmlzdGljIChzZWUgYmVsb3cpXG4gICAgICByZXR1cm4gJyc7IC8vIFdlIGhhdmUgZW5vdWdoIGJ5dGVzIC0+IGRldGVjdCBlbmRpYW5uZXNzLlxuXG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlciQyLmNvbmNhdCh0aGlzLmluaXRpYWxCeXRlcyksXG4gICAgICAgIGVuY29kaW5nID0gZGV0ZWN0RW5jb2RpbmcoYnVmLCB0aGlzLm9wdGlvbnMuZGVmYXVsdEVuY29kaW5nKTtcbiAgICB0aGlzLmRlY29kZXIgPSB0aGlzLmljb252LmdldERlY29kZXIoZW5jb2RpbmcsIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5pbml0aWFsQnl0ZXMubGVuZ3RoID0gdGhpcy5pbml0aWFsQnl0ZXNMZW4gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZGVjb2Rlci53cml0ZShidWYpO1xufTtcblxuVXRmMTZEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5kZWNvZGVyKSB7XG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlciQyLmNvbmNhdCh0aGlzLmluaXRpYWxCeXRlcyksXG4gICAgICAgIGVuY29kaW5nID0gZGV0ZWN0RW5jb2RpbmcoYnVmLCB0aGlzLm9wdGlvbnMuZGVmYXVsdEVuY29kaW5nKTtcbiAgICB0aGlzLmRlY29kZXIgPSB0aGlzLmljb252LmdldERlY29kZXIoZW5jb2RpbmcsIHRoaXMub3B0aW9ucyk7XG4gICAgdmFyIHJlcyA9IHRoaXMuZGVjb2Rlci53cml0ZShidWYpLFxuICAgICAgICB0cmFpbCA9IHRoaXMuZGVjb2Rlci5lbmQoKTtcbiAgICByZXR1cm4gdHJhaWwgPyByZXMgKyB0cmFpbCA6IHJlcztcbiAgfVxuXG4gIHJldHVybiB0aGlzLmRlY29kZXIuZW5kKCk7XG59O1xuXG5mdW5jdGlvbiBkZXRlY3RFbmNvZGluZyhidWYsIGRlZmF1bHRFbmNvZGluZykge1xuICB2YXIgZW5jID0gZGVmYXVsdEVuY29kaW5nIHx8ICd1dGYtMTZsZSc7XG5cbiAgaWYgKGJ1Zi5sZW5ndGggPj0gMikge1xuICAgIC8vIENoZWNrIEJPTS5cbiAgICBpZiAoYnVmWzBdID09IDB4RkUgJiYgYnVmWzFdID09IDB4RkYpIC8vIFVURi0xNkJFIEJPTVxuICAgICAgZW5jID0gJ3V0Zi0xNmJlJztlbHNlIGlmIChidWZbMF0gPT0gMHhGRiAmJiBidWZbMV0gPT0gMHhGRSkgLy8gVVRGLTE2TEUgQk9NXG4gICAgICBlbmMgPSAndXRmLTE2bGUnO2Vsc2Uge1xuICAgICAgLy8gTm8gQk9NIGZvdW5kLiBUcnkgdG8gZGVkdWNlIGVuY29kaW5nIGZyb20gaW5pdGlhbCBjb250ZW50LlxuICAgICAgLy8gTW9zdCBvZiB0aGUgdGltZSwgdGhlIGNvbnRlbnQgaGFzIEFTQ0lJIGNoYXJzIChVKzAwKiopLCBidXQgdGhlIG9wcG9zaXRlIChVKyoqMDApIGlzIHVuY29tbW9uLlxuICAgICAgLy8gU28sIHdlIGNvdW50IEFTQ0lJIGFzIGlmIGl0IHdhcyBMRSBvciBCRSwgYW5kIGRlY2lkZSBmcm9tIHRoYXQuXG4gICAgICB2YXIgYXNjaWlDaGFyc0xFID0gMCxcbiAgICAgICAgICBhc2NpaUNoYXJzQkUgPSAwLFxuICAgICAgICAgIC8vIENvdW50cyBvZiBjaGFycyBpbiBib3RoIHBvc2l0aW9uc1xuICAgICAgX2xlbiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBidWYubGVuZ3RoICUgMiwgNjQpOyAvLyBMZW4gaXMgYWx3YXlzIGV2ZW4uXG5cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfbGVuOyBpICs9IDIpIHtcbiAgICAgICAgaWYgKGJ1ZltpXSA9PT0gMCAmJiBidWZbaSArIDFdICE9PSAwKSBhc2NpaUNoYXJzQkUrKztcbiAgICAgICAgaWYgKGJ1ZltpXSAhPT0gMCAmJiBidWZbaSArIDFdID09PSAwKSBhc2NpaUNoYXJzTEUrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGFzY2lpQ2hhcnNCRSA+IGFzY2lpQ2hhcnNMRSkgZW5jID0gJ3V0Zi0xNmJlJztlbHNlIGlmIChhc2NpaUNoYXJzQkUgPCBhc2NpaUNoYXJzTEUpIGVuYyA9ICd1dGYtMTZsZSc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVuYztcbn1cblxudmFyIHV0ZjE2ID0ge1xuICB1dGYxNmJlOiB1dGYxNmJlLFxuICB1dGYxNjogdXRmMTZfMVxufTtcblxudmFyIEJ1ZmZlciQzID0gc2FmZXJfMS5CdWZmZXI7IC8vIFVURi03IGNvZGVjLCBhY2NvcmRpbmcgdG8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIxNTJcbi8vIFNlZSBhbHNvIGJlbG93IGEgVVRGLTctSU1BUCBjb2RlYywgYWNjb3JkaW5nIHRvIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi01LjEuM1xuXG52YXIgdXRmN18xID0gVXRmN0NvZGVjO1xudmFyIHVuaWNvZGUxMXV0ZjcgPSAndXRmNyc7IC8vIEFsaWFzIFVOSUNPREUtMS0xLVVURi03XG5cbmZ1bmN0aW9uIFV0ZjdDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gIHRoaXMuaWNvbnYgPSBpY29udjtcbn1cblV0ZjdDb2RlYy5wcm90b3R5cGUuZW5jb2RlciA9IFV0ZjdFbmNvZGVyO1xuVXRmN0NvZGVjLnByb3RvdHlwZS5kZWNvZGVyID0gVXRmN0RlY29kZXI7XG5VdGY3Q29kZWMucHJvdG90eXBlLmJvbUF3YXJlID0gdHJ1ZTsgLy8gLS0gRW5jb2RpbmdcblxudmFyIG5vbkRpcmVjdENoYXJzID0gL1teQS1aYS16MC05J1xcKFxcKSwtXFwuXFwvOlxcPyBcXG5cXHJcXHRdKy9nO1xuXG5mdW5jdGlvbiBVdGY3RW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG59XG5cblV0ZjdFbmNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgLy8gTmFpdmUgaW1wbGVtZW50YXRpb24uXG4gIC8vIE5vbi1kaXJlY3QgY2hhcnMgYXJlIGVuY29kZWQgYXMgXCIrPGJhc2U2ND4tXCI7IHNpbmdsZSBcIitcIiBjaGFyIGlzIGVuY29kZWQgYXMgXCIrLVwiLlxuICByZXR1cm4gQnVmZmVyJDMuZnJvbShzdHIucmVwbGFjZShub25EaXJlY3RDaGFycywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgcmV0dXJuIFwiK1wiICsgKGNodW5rID09PSAnKycgPyAnJyA6IHRoaXMuaWNvbnYuZW5jb2RlKGNodW5rLCAndXRmMTYtYmUnKS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvPSskLywgJycpKSArIFwiLVwiO1xuICB9LmJpbmQodGhpcykpKTtcbn07XG5cblV0ZjdFbmNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7fTsgLy8gLS0gRGVjb2RpbmdcblxuXG5mdW5jdGlvbiBVdGY3RGVjb2RlcihvcHRpb25zLCBjb2RlYykge1xuICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG4gIHRoaXMuaW5CYXNlNjQgPSBmYWxzZTtcbiAgdGhpcy5iYXNlNjRBY2N1bSA9ICcnO1xufVxuXG52YXIgYmFzZTY0UmVnZXggPSAvW0EtWmEtejAtOVxcLytdLztcbnZhciBiYXNlNjRDaGFycyA9IFtdO1xuXG5mb3IgKHZhciBpJDEgPSAwOyBpJDEgPCAyNTY7IGkkMSsrKSB7XG4gIGJhc2U2NENoYXJzW2kkMV0gPSBiYXNlNjRSZWdleC50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoaSQxKSk7XG59XG5cbnZhciBwbHVzQ2hhciA9ICcrJy5jaGFyQ29kZUF0KDApLFxuICAgIG1pbnVzQ2hhciA9ICctJy5jaGFyQ29kZUF0KDApLFxuICAgIGFuZENoYXIgPSAnJicuY2hhckNvZGVBdCgwKTtcblxuVXRmN0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICB2YXIgcmVzID0gXCJcIixcbiAgICAgIGxhc3RJID0gMCxcbiAgICAgIGluQmFzZTY0ID0gdGhpcy5pbkJhc2U2NCxcbiAgICAgIGJhc2U2NEFjY3VtID0gdGhpcy5iYXNlNjRBY2N1bTsgLy8gVGhlIGRlY29kZXIgaXMgbW9yZSBpbnZvbHZlZCBhcyB3ZSBtdXN0IGhhbmRsZSBjaHVua3MgaW4gc3RyZWFtLlxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFpbkJhc2U2NCkge1xuICAgICAgLy8gV2UncmUgaW4gZGlyZWN0IG1vZGUuXG4gICAgICAvLyBXcml0ZSBkaXJlY3QgY2hhcnMgdW50aWwgJysnXG4gICAgICBpZiAoYnVmW2ldID09IHBsdXNDaGFyKSB7XG4gICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShidWYuc2xpY2UobGFzdEksIGkpLCBcImFzY2lpXCIpOyAvLyBXcml0ZSBkaXJlY3QgY2hhcnMuXG5cbiAgICAgICAgbGFzdEkgPSBpICsgMTtcbiAgICAgICAgaW5CYXNlNjQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBkZWNvZGUgYmFzZTY0LlxuICAgICAgaWYgKCFiYXNlNjRDaGFyc1tidWZbaV1dKSB7XG4gICAgICAgIC8vIEJhc2U2NCBlbmRlZC5cbiAgICAgICAgaWYgKGkgPT0gbGFzdEkgJiYgYnVmW2ldID09IG1pbnVzQ2hhcikge1xuICAgICAgICAgIC8vIFwiKy1cIiAtPiBcIitcIlxuICAgICAgICAgIHJlcyArPSBcIitcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYjY0c3RyID0gYmFzZTY0QWNjdW0gKyBidWYuc2xpY2UobGFzdEksIGkpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgcmVzICs9IHRoaXMuaWNvbnYuZGVjb2RlKEJ1ZmZlciQzLmZyb20oYjY0c3RyLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnVmW2ldICE9IG1pbnVzQ2hhcikgLy8gTWludXMgaXMgYWJzb3JiZWQgYWZ0ZXIgYmFzZTY0LlxuICAgICAgICAgIGktLTtcbiAgICAgICAgbGFzdEkgPSBpICsgMTtcbiAgICAgICAgaW5CYXNlNjQgPSBmYWxzZTtcbiAgICAgICAgYmFzZTY0QWNjdW0gPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWluQmFzZTY0KSB7XG4gICAgcmVzICs9IHRoaXMuaWNvbnYuZGVjb2RlKGJ1Zi5zbGljZShsYXN0SSksIFwiYXNjaWlcIik7IC8vIFdyaXRlIGRpcmVjdCBjaGFycy5cbiAgfSBlbHNlIHtcbiAgICB2YXIgYjY0c3RyID0gYmFzZTY0QWNjdW0gKyBidWYuc2xpY2UobGFzdEkpLnRvU3RyaW5nKCk7XG4gICAgdmFyIGNhbkJlRGVjb2RlZCA9IGI2NHN0ci5sZW5ndGggLSBiNjRzdHIubGVuZ3RoICUgODsgLy8gTWluaW1hbCBjaHVuazogMiBxdWFkcyAtPiAyeDMgYnl0ZXMgLT4gMyBjaGFycy5cblxuICAgIGJhc2U2NEFjY3VtID0gYjY0c3RyLnNsaWNlKGNhbkJlRGVjb2RlZCk7IC8vIFRoZSByZXN0IHdpbGwgYmUgZGVjb2RlZCBpbiBmdXR1cmUuXG5cbiAgICBiNjRzdHIgPSBiNjRzdHIuc2xpY2UoMCwgY2FuQmVEZWNvZGVkKTtcbiAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoQnVmZmVyJDMuZnJvbShiNjRzdHIsICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgfVxuXG4gIHRoaXMuaW5CYXNlNjQgPSBpbkJhc2U2NDtcbiAgdGhpcy5iYXNlNjRBY2N1bSA9IGJhc2U2NEFjY3VtO1xuICByZXR1cm4gcmVzO1xufTtcblxuVXRmN0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlcyA9IFwiXCI7XG4gIGlmICh0aGlzLmluQmFzZTY0ICYmIHRoaXMuYmFzZTY0QWNjdW0ubGVuZ3RoID4gMCkgcmVzID0gdGhpcy5pY29udi5kZWNvZGUoQnVmZmVyJDMuZnJvbSh0aGlzLmJhc2U2NEFjY3VtLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG4gIHRoaXMuaW5CYXNlNjQgPSBmYWxzZTtcbiAgdGhpcy5iYXNlNjRBY2N1bSA9ICcnO1xuICByZXR1cm4gcmVzO1xufTsgLy8gVVRGLTctSU1BUCBjb2RlYy5cbi8vIFJGQzM1MDEgU2VjLiA1LjEuMyBNb2RpZmllZCBVVEYtNyAoaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTUuMS4zKVxuLy8gRGlmZmVyZW5jZXM6XG4vLyAgKiBCYXNlNjQgcGFydCBpcyBzdGFydGVkIGJ5IFwiJlwiIGluc3RlYWQgb2YgXCIrXCJcbi8vICAqIERpcmVjdCBjaGFyYWN0ZXJzIGFyZSAweDIwLTB4N0UsIGV4Y2VwdCBcIiZcIiAoMHgyNilcbi8vICAqIEluIEJhc2U2NCwgXCIsXCIgaXMgdXNlZCBpbnN0ZWFkIG9mIFwiL1wiXG4vLyAgKiBCYXNlNjQgbXVzdCBub3QgYmUgdXNlZCB0byByZXByZXNlbnQgZGlyZWN0IGNoYXJhY3RlcnMuXG4vLyAgKiBObyBpbXBsaWNpdCBzaGlmdCBiYWNrIGZyb20gQmFzZTY0IChzaG91bGQgYWx3YXlzIGVuZCB3aXRoICctJylcbi8vICAqIFN0cmluZyBtdXN0IGVuZCBpbiBub24tc2hpZnRlZCBwb3NpdGlvbi5cbi8vICAqIFwiLSZcIiB3aGlsZSBpbiBiYXNlNjQgaXMgbm90IGFsbG93ZWQuXG5cblxudmFyIHV0ZjdpbWFwID0gVXRmN0lNQVBDb2RlYztcblxuZnVuY3Rpb24gVXRmN0lNQVBDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gIHRoaXMuaWNvbnYgPSBpY29udjtcbn1cblV0ZjdJTUFQQ29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBVdGY3SU1BUEVuY29kZXI7XG5VdGY3SU1BUENvZGVjLnByb3RvdHlwZS5kZWNvZGVyID0gVXRmN0lNQVBEZWNvZGVyO1xuVXRmN0lNQVBDb2RlYy5wcm90b3R5cGUuYm9tQXdhcmUgPSB0cnVlOyAvLyAtLSBFbmNvZGluZ1xuXG5mdW5jdGlvbiBVdGY3SU1BUEVuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgdGhpcy5pY29udiA9IGNvZGVjLmljb252O1xuICB0aGlzLmluQmFzZTY0ID0gZmFsc2U7XG4gIHRoaXMuYmFzZTY0QWNjdW0gPSBCdWZmZXIkMy5hbGxvYyg2KTtcbiAgdGhpcy5iYXNlNjRBY2N1bUlkeCA9IDA7XG59XG5cblV0ZjdJTUFQRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBpbkJhc2U2NCA9IHRoaXMuaW5CYXNlNjQsXG4gICAgICBiYXNlNjRBY2N1bSA9IHRoaXMuYmFzZTY0QWNjdW0sXG4gICAgICBiYXNlNjRBY2N1bUlkeCA9IHRoaXMuYmFzZTY0QWNjdW1JZHgsXG4gICAgICBidWYgPSBCdWZmZXIkMy5hbGxvYyhzdHIubGVuZ3RoICogNSArIDEwKSxcbiAgICAgIGJ1ZklkeCA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdUNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmICgweDIwIDw9IHVDaGFyICYmIHVDaGFyIDw9IDB4N0UpIHtcbiAgICAgIC8vIERpcmVjdCBjaGFyYWN0ZXIgb3IgJyYnLlxuICAgICAgaWYgKGluQmFzZTY0KSB7XG4gICAgICAgIGlmIChiYXNlNjRBY2N1bUlkeCA+IDApIHtcbiAgICAgICAgICBidWZJZHggKz0gYnVmLndyaXRlKGJhc2U2NEFjY3VtLnNsaWNlKDAsIGJhc2U2NEFjY3VtSWR4KS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvXFwvL2csICcsJykucmVwbGFjZSgvPSskLywgJycpLCBidWZJZHgpO1xuICAgICAgICAgIGJhc2U2NEFjY3VtSWR4ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1ZltidWZJZHgrK10gPSBtaW51c0NoYXI7IC8vIFdyaXRlICctJywgdGhlbiBnbyB0byBkaXJlY3QgbW9kZS5cblxuICAgICAgICBpbkJhc2U2NCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluQmFzZTY0KSB7XG4gICAgICAgIGJ1ZltidWZJZHgrK10gPSB1Q2hhcjsgLy8gV3JpdGUgZGlyZWN0IGNoYXJhY3RlclxuXG4gICAgICAgIGlmICh1Q2hhciA9PT0gYW5kQ2hhcikgLy8gQW1wZXJzYW5kIC0+ICcmLSdcbiAgICAgICAgICBidWZbYnVmSWR4KytdID0gbWludXNDaGFyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOb24tZGlyZWN0IGNoYXJhY3RlclxuICAgICAgaWYgKCFpbkJhc2U2NCkge1xuICAgICAgICBidWZbYnVmSWR4KytdID0gYW5kQ2hhcjsgLy8gV3JpdGUgJyYnLCB0aGVuIGdvIHRvIGJhc2U2NCBtb2RlLlxuXG4gICAgICAgIGluQmFzZTY0ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluQmFzZTY0KSB7XG4gICAgICAgIGJhc2U2NEFjY3VtW2Jhc2U2NEFjY3VtSWR4KytdID0gdUNoYXIgPj4gODtcbiAgICAgICAgYmFzZTY0QWNjdW1bYmFzZTY0QWNjdW1JZHgrK10gPSB1Q2hhciAmIDB4RkY7XG5cbiAgICAgICAgaWYgKGJhc2U2NEFjY3VtSWR4ID09IGJhc2U2NEFjY3VtLmxlbmd0aCkge1xuICAgICAgICAgIGJ1ZklkeCArPSBidWYud3JpdGUoYmFzZTY0QWNjdW0udG9TdHJpbmcoJ2Jhc2U2NCcpLnJlcGxhY2UoL1xcLy9nLCAnLCcpLCBidWZJZHgpO1xuICAgICAgICAgIGJhc2U2NEFjY3VtSWR4ID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuaW5CYXNlNjQgPSBpbkJhc2U2NDtcbiAgdGhpcy5iYXNlNjRBY2N1bUlkeCA9IGJhc2U2NEFjY3VtSWR4O1xuICByZXR1cm4gYnVmLnNsaWNlKDAsIGJ1ZklkeCk7XG59O1xuXG5VdGY3SU1BUEVuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGJ1ZiA9IEJ1ZmZlciQzLmFsbG9jKDEwKSxcbiAgICAgIGJ1ZklkeCA9IDA7XG5cbiAgaWYgKHRoaXMuaW5CYXNlNjQpIHtcbiAgICBpZiAodGhpcy5iYXNlNjRBY2N1bUlkeCA+IDApIHtcbiAgICAgIGJ1ZklkeCArPSBidWYud3JpdGUodGhpcy5iYXNlNjRBY2N1bS5zbGljZSgwLCB0aGlzLmJhc2U2NEFjY3VtSWR4KS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvXFwvL2csICcsJykucmVwbGFjZSgvPSskLywgJycpLCBidWZJZHgpO1xuICAgICAgdGhpcy5iYXNlNjRBY2N1bUlkeCA9IDA7XG4gICAgfVxuXG4gICAgYnVmW2J1ZklkeCsrXSA9IG1pbnVzQ2hhcjsgLy8gV3JpdGUgJy0nLCB0aGVuIGdvIHRvIGRpcmVjdCBtb2RlLlxuXG4gICAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGJ1Zi5zbGljZSgwLCBidWZJZHgpO1xufTsgLy8gLS0gRGVjb2RpbmdcblxuXG5mdW5jdGlvbiBVdGY3SU1BUERlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgdGhpcy5pY29udiA9IGNvZGVjLmljb252O1xuICB0aGlzLmluQmFzZTY0ID0gZmFsc2U7XG4gIHRoaXMuYmFzZTY0QWNjdW0gPSAnJztcbn1cblxudmFyIGJhc2U2NElNQVBDaGFycyA9IGJhc2U2NENoYXJzLnNsaWNlKCk7XG5iYXNlNjRJTUFQQ2hhcnNbJywnLmNoYXJDb2RlQXQoMCldID0gdHJ1ZTtcblxuVXRmN0lNQVBEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChidWYpIHtcbiAgdmFyIHJlcyA9IFwiXCIsXG4gICAgICBsYXN0SSA9IDAsXG4gICAgICBpbkJhc2U2NCA9IHRoaXMuaW5CYXNlNjQsXG4gICAgICBiYXNlNjRBY2N1bSA9IHRoaXMuYmFzZTY0QWNjdW07IC8vIFRoZSBkZWNvZGVyIGlzIG1vcmUgaW52b2x2ZWQgYXMgd2UgbXVzdCBoYW5kbGUgY2h1bmtzIGluIHN0cmVhbS5cbiAgLy8gSXQgaXMgZm9yZ2l2aW5nLCBjbG9zZXIgdG8gc3RhbmRhcmQgVVRGLTcgKGZvciBleGFtcGxlLCAnLScgaXMgb3B0aW9uYWwgYXQgdGhlIGVuZCkuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWluQmFzZTY0KSB7XG4gICAgICAvLyBXZSdyZSBpbiBkaXJlY3QgbW9kZS5cbiAgICAgIC8vIFdyaXRlIGRpcmVjdCBjaGFycyB1bnRpbCAnJidcbiAgICAgIGlmIChidWZbaV0gPT0gYW5kQ2hhcikge1xuICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoYnVmLnNsaWNlKGxhc3RJLCBpKSwgXCJhc2NpaVwiKTsgLy8gV3JpdGUgZGlyZWN0IGNoYXJzLlxuXG4gICAgICAgIGxhc3RJID0gaSArIDE7XG4gICAgICAgIGluQmFzZTY0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgZGVjb2RlIGJhc2U2NC5cbiAgICAgIGlmICghYmFzZTY0SU1BUENoYXJzW2J1ZltpXV0pIHtcbiAgICAgICAgLy8gQmFzZTY0IGVuZGVkLlxuICAgICAgICBpZiAoaSA9PSBsYXN0SSAmJiBidWZbaV0gPT0gbWludXNDaGFyKSB7XG4gICAgICAgICAgLy8gXCImLVwiIC0+IFwiJlwiXG4gICAgICAgICAgcmVzICs9IFwiJlwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBiNjRzdHIgPSBiYXNlNjRBY2N1bSArIGJ1Zi5zbGljZShsYXN0SSwgaSkudG9TdHJpbmcoKS5yZXBsYWNlKC8sL2csICcvJyk7XG4gICAgICAgICAgcmVzICs9IHRoaXMuaWNvbnYuZGVjb2RlKEJ1ZmZlciQzLmZyb20oYjY0c3RyLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnVmW2ldICE9IG1pbnVzQ2hhcikgLy8gTWludXMgbWF5IGJlIGFic29yYmVkIGFmdGVyIGJhc2U2NC5cbiAgICAgICAgICBpLS07XG4gICAgICAgIGxhc3RJID0gaSArIDE7XG4gICAgICAgIGluQmFzZTY0ID0gZmFsc2U7XG4gICAgICAgIGJhc2U2NEFjY3VtID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpbkJhc2U2NCkge1xuICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShidWYuc2xpY2UobGFzdEkpLCBcImFzY2lpXCIpOyAvLyBXcml0ZSBkaXJlY3QgY2hhcnMuXG4gIH0gZWxzZSB7XG4gICAgdmFyIGI2NHN0ciA9IGJhc2U2NEFjY3VtICsgYnVmLnNsaWNlKGxhc3RJKS50b1N0cmluZygpLnJlcGxhY2UoLywvZywgJy8nKTtcbiAgICB2YXIgY2FuQmVEZWNvZGVkID0gYjY0c3RyLmxlbmd0aCAtIGI2NHN0ci5sZW5ndGggJSA4OyAvLyBNaW5pbWFsIGNodW5rOiAyIHF1YWRzIC0+IDJ4MyBieXRlcyAtPiAzIGNoYXJzLlxuXG4gICAgYmFzZTY0QWNjdW0gPSBiNjRzdHIuc2xpY2UoY2FuQmVEZWNvZGVkKTsgLy8gVGhlIHJlc3Qgd2lsbCBiZSBkZWNvZGVkIGluIGZ1dHVyZS5cblxuICAgIGI2NHN0ciA9IGI2NHN0ci5zbGljZSgwLCBjYW5CZURlY29kZWQpO1xuICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIkMy5mcm9tKGI2NHN0ciwgJ2Jhc2U2NCcpLCBcInV0ZjE2LWJlXCIpO1xuICB9XG5cbiAgdGhpcy5pbkJhc2U2NCA9IGluQmFzZTY0O1xuICB0aGlzLmJhc2U2NEFjY3VtID0gYmFzZTY0QWNjdW07XG4gIHJldHVybiByZXM7XG59O1xuXG5VdGY3SU1BUERlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlcyA9IFwiXCI7XG4gIGlmICh0aGlzLmluQmFzZTY0ICYmIHRoaXMuYmFzZTY0QWNjdW0ubGVuZ3RoID4gMCkgcmVzID0gdGhpcy5pY29udi5kZWNvZGUoQnVmZmVyJDMuZnJvbSh0aGlzLmJhc2U2NEFjY3VtLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG4gIHRoaXMuaW5CYXNlNjQgPSBmYWxzZTtcbiAgdGhpcy5iYXNlNjRBY2N1bSA9ICcnO1xuICByZXR1cm4gcmVzO1xufTtcblxudmFyIHV0ZjcgPSB7XG4gIHV0Zjc6IHV0ZjdfMSxcbiAgdW5pY29kZTExdXRmNzogdW5pY29kZTExdXRmNyxcbiAgdXRmN2ltYXA6IHV0ZjdpbWFwXG59O1xuXG52YXIgQnVmZmVyJDQgPSBzYWZlcl8xLkJ1ZmZlcjsgLy8gU2luZ2xlLWJ5dGUgY29kZWMuIE5lZWRzIGEgJ2NoYXJzJyBzdHJpbmcgcGFyYW1ldGVyIHRoYXQgY29udGFpbnMgMjU2IG9yIDEyOCBjaGFycyB0aGF0XG4vLyBjb3JyZXNwb25kIHRvIGVuY29kZWQgYnl0ZXMgKGlmIDEyOCAtIHRoZW4gbG93ZXIgaGFsZiBpcyBBU0NJSSkuIFxuXG52YXIgX3NiY3MgPSBTQkNTQ29kZWM7XG5cbmZ1bmN0aW9uIFNCQ1NDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gIGlmICghY29kZWNPcHRpb25zKSB0aHJvdyBuZXcgRXJyb3IoXCJTQkNTIGNvZGVjIGlzIGNhbGxlZCB3aXRob3V0IHRoZSBkYXRhLlwiKTsgLy8gUHJlcGFyZSBjaGFyIGJ1ZmZlciBmb3IgZGVjb2RpbmcuXG5cbiAgaWYgKCFjb2RlY09wdGlvbnMuY2hhcnMgfHwgY29kZWNPcHRpb25zLmNoYXJzLmxlbmd0aCAhPT0gMTI4ICYmIGNvZGVjT3B0aW9ucy5jaGFycy5sZW5ndGggIT09IDI1NikgdGhyb3cgbmV3IEVycm9yKFwiRW5jb2RpbmcgJ1wiICsgY29kZWNPcHRpb25zLnR5cGUgKyBcIicgaGFzIGluY29ycmVjdCAnY2hhcnMnIChtdXN0IGJlIG9mIGxlbiAxMjggb3IgMjU2KVwiKTtcblxuICBpZiAoY29kZWNPcHRpb25zLmNoYXJzLmxlbmd0aCA9PT0gMTI4KSB7XG4gICAgdmFyIGFzY2lpU3RyaW5nID0gXCJcIjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTI4OyBpKyspIHtcbiAgICAgIGFzY2lpU3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSk7XG4gICAgfVxuXG4gICAgY29kZWNPcHRpb25zLmNoYXJzID0gYXNjaWlTdHJpbmcgKyBjb2RlY09wdGlvbnMuY2hhcnM7XG4gIH1cblxuICB0aGlzLmRlY29kZUJ1ZiA9IEJ1ZmZlciQ0LmZyb20oY29kZWNPcHRpb25zLmNoYXJzLCAndWNzMicpOyAvLyBFbmNvZGluZyBidWZmZXIuXG5cbiAgdmFyIGVuY29kZUJ1ZiA9IEJ1ZmZlciQ0LmFsbG9jKDY1NTM2LCBpY29udi5kZWZhdWx0Q2hhclNpbmdsZUJ5dGUuY2hhckNvZGVBdCgwKSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlY09wdGlvbnMuY2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICBlbmNvZGVCdWZbY29kZWNPcHRpb25zLmNoYXJzLmNoYXJDb2RlQXQoaSldID0gaTtcbiAgfVxuXG4gIHRoaXMuZW5jb2RlQnVmID0gZW5jb2RlQnVmO1xufVxuXG5TQkNTQ29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBTQkNTRW5jb2RlcjtcblNCQ1NDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFNCQ1NEZWNvZGVyO1xuXG5mdW5jdGlvbiBTQkNTRW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICB0aGlzLmVuY29kZUJ1ZiA9IGNvZGVjLmVuY29kZUJ1Zjtcbn1cblxuU0JDU0VuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gQnVmZmVyJDQuYWxsb2Moc3RyLmxlbmd0aCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBidWZbaV0gPSB0aGlzLmVuY29kZUJ1ZltzdHIuY2hhckNvZGVBdChpKV07XG4gIH1cblxuICByZXR1cm4gYnVmO1xufTtcblxuU0JDU0VuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHt9O1xuXG5mdW5jdGlvbiBTQkNTRGVjb2RlcihvcHRpb25zLCBjb2RlYykge1xuICB0aGlzLmRlY29kZUJ1ZiA9IGNvZGVjLmRlY29kZUJ1Zjtcbn1cblxuU0JDU0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICAvLyBTdHJpbmdzIGFyZSBpbW11dGFibGUgaW4gSlMgLT4gd2UgdXNlIHVjczIgYnVmZmVyIHRvIHNwZWVkIHVwIGNvbXB1dGF0aW9ucy5cbiAgdmFyIGRlY29kZUJ1ZiA9IHRoaXMuZGVjb2RlQnVmO1xuICB2YXIgbmV3QnVmID0gQnVmZmVyJDQuYWxsb2MoYnVmLmxlbmd0aCAqIDIpO1xuICB2YXIgaWR4MSA9IDAsXG4gICAgICBpZHgyID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgIGlkeDEgPSBidWZbaV0gKiAyO1xuICAgIGlkeDIgPSBpICogMjtcbiAgICBuZXdCdWZbaWR4Ml0gPSBkZWNvZGVCdWZbaWR4MV07XG4gICAgbmV3QnVmW2lkeDIgKyAxXSA9IGRlY29kZUJ1ZltpZHgxICsgMV07XG4gIH1cblxuICByZXR1cm4gbmV3QnVmLnRvU3RyaW5nKCd1Y3MyJyk7XG59O1xuXG5TQkNTRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBzYmNzQ29kZWMgPSB7XG4gIF9zYmNzOiBfc2Jjc1xufTtcblxudmFyIHNiY3NEYXRhID0ge1xuICAvLyBOb3Qgc3VwcG9ydGVkIGJ5IGljb252LCBub3Qgc3VyZSB3aHkuXG4gIFwiMTAwMjlcIjogXCJtYWNjZW50ZXVyb1wiLFxuICBcIm1hY2NlbnRldXJvXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDhMSAxIHDicSEw5bDnMOhxIXEjMOkxI3EhsSHw6nFucW6xI7DrcSPxJLEk8SWw7PEl8O0w7bDtcO6xJrEm8O84oCgwrDEmMKjwqfigKLCtsOfwq7CqeKEosSZwqjiiaDEo8SuxK/EquKJpOKJpcSrxLbiiILiiJHFgsS7xLzEvcS+xLnEusWFxYbFg8Ks4oiaxYTFh+KIhsKrwrvigKbCoMWIxZDDlcWRxYzigJPigJTigJzigJ3igJjigJnDt+KXisWNxZTFlcWY4oC54oC6xZnFlsWXxaDigJrigJ7FocWaxZvDgcWkxaXDjcW9xb7FqsOTw5TFq8Wuw5rFr8WwxbHFssWzw53DvcS3xbvFgcW8xKLLh1wiXG4gIH0sXG4gIFwiODA4XCI6IFwiY3A4MDhcIixcbiAgXCJpYm04MDhcIjogXCJjcDgwOFwiLFxuICBcImNwODA4XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLQkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/ilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDRgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj9CB0ZHQhNGU0IfRl9CO0Z7CsOKImcK34oia4oSW4oKs4pagwqBcIlxuICB9LFxuICBcIm1pa1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/ilJTilLTilKzilJzilIDilLzilaPilZHilZrilZTilanilabilaDilZDilazilJDilpHilpLilpPilILilKTihJbCp+KVl+KVneKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICAvLyBBbGlhc2VzIG9mIGdlbmVyYXRlZCBlbmNvZGluZ3MuXG4gIFwiYXNjaWk4Yml0XCI6IFwiYXNjaWlcIixcbiAgXCJ1c2FzY2lpXCI6IFwiYXNjaWlcIixcbiAgXCJhbnNpeDM0XCI6IFwiYXNjaWlcIixcbiAgXCJhbnNpeDM0MTk2OFwiOiBcImFzY2lpXCIsXG4gIFwiYW5zaXgzNDE5ODZcIjogXCJhc2NpaVwiLFxuICBcImNzYXNjaWlcIjogXCJhc2NpaVwiLFxuICBcImNwMzY3XCI6IFwiYXNjaWlcIixcbiAgXCJpYm0zNjdcIjogXCJhc2NpaVwiLFxuICBcImlzb2lyNlwiOiBcImFzY2lpXCIsXG4gIFwiaXNvNjQ2dXNcIjogXCJhc2NpaVwiLFxuICBcImlzbzY0NmlydlwiOiBcImFzY2lpXCIsXG4gIFwidXNcIjogXCJhc2NpaVwiLFxuICBcImxhdGluMVwiOiBcImlzbzg4NTkxXCIsXG4gIFwibGF0aW4yXCI6IFwiaXNvODg1OTJcIixcbiAgXCJsYXRpbjNcIjogXCJpc284ODU5M1wiLFxuICBcImxhdGluNFwiOiBcImlzbzg4NTk0XCIsXG4gIFwibGF0aW41XCI6IFwiaXNvODg1OTlcIixcbiAgXCJsYXRpbjZcIjogXCJpc284ODU5MTBcIixcbiAgXCJsYXRpbjdcIjogXCJpc284ODU5MTNcIixcbiAgXCJsYXRpbjhcIjogXCJpc284ODU5MTRcIixcbiAgXCJsYXRpbjlcIjogXCJpc284ODU5MTVcIixcbiAgXCJsYXRpbjEwXCI6IFwiaXNvODg1OTE2XCIsXG4gIFwiY3Npc29sYXRpbjFcIjogXCJpc284ODU5MVwiLFxuICBcImNzaXNvbGF0aW4yXCI6IFwiaXNvODg1OTJcIixcbiAgXCJjc2lzb2xhdGluM1wiOiBcImlzbzg4NTkzXCIsXG4gIFwiY3Npc29sYXRpbjRcIjogXCJpc284ODU5NFwiLFxuICBcImNzaXNvbGF0aW5jeXJpbGxpY1wiOiBcImlzbzg4NTk1XCIsXG4gIFwiY3Npc29sYXRpbmFyYWJpY1wiOiBcImlzbzg4NTk2XCIsXG4gIFwiY3Npc29sYXRpbmdyZWVrXCI6IFwiaXNvODg1OTdcIixcbiAgXCJjc2lzb2xhdGluaGVicmV3XCI6IFwiaXNvODg1OThcIixcbiAgXCJjc2lzb2xhdGluNVwiOiBcImlzbzg4NTk5XCIsXG4gIFwiY3Npc29sYXRpbjZcIjogXCJpc284ODU5MTBcIixcbiAgXCJsMVwiOiBcImlzbzg4NTkxXCIsXG4gIFwibDJcIjogXCJpc284ODU5MlwiLFxuICBcImwzXCI6IFwiaXNvODg1OTNcIixcbiAgXCJsNFwiOiBcImlzbzg4NTk0XCIsXG4gIFwibDVcIjogXCJpc284ODU5OVwiLFxuICBcImw2XCI6IFwiaXNvODg1OTEwXCIsXG4gIFwibDdcIjogXCJpc284ODU5MTNcIixcbiAgXCJsOFwiOiBcImlzbzg4NTkxNFwiLFxuICBcImw5XCI6IFwiaXNvODg1OTE1XCIsXG4gIFwibDEwXCI6IFwiaXNvODg1OTE2XCIsXG4gIFwiaXNvaXIxNFwiOiBcImlzbzY0NmpwXCIsXG4gIFwiaXNvaXI1N1wiOiBcImlzbzY0NmNuXCIsXG4gIFwiaXNvaXIxMDBcIjogXCJpc284ODU5MVwiLFxuICBcImlzb2lyMTAxXCI6IFwiaXNvODg1OTJcIixcbiAgXCJpc29pcjEwOVwiOiBcImlzbzg4NTkzXCIsXG4gIFwiaXNvaXIxMTBcIjogXCJpc284ODU5NFwiLFxuICBcImlzb2lyMTQ0XCI6IFwiaXNvODg1OTVcIixcbiAgXCJpc29pcjEyN1wiOiBcImlzbzg4NTk2XCIsXG4gIFwiaXNvaXIxMjZcIjogXCJpc284ODU5N1wiLFxuICBcImlzb2lyMTM4XCI6IFwiaXNvODg1OThcIixcbiAgXCJpc29pcjE0OFwiOiBcImlzbzg4NTk5XCIsXG4gIFwiaXNvaXIxNTdcIjogXCJpc284ODU5MTBcIixcbiAgXCJpc29pcjE2NlwiOiBcInRpczYyMFwiLFxuICBcImlzb2lyMTc5XCI6IFwiaXNvODg1OTEzXCIsXG4gIFwiaXNvaXIxOTlcIjogXCJpc284ODU5MTRcIixcbiAgXCJpc29pcjIwM1wiOiBcImlzbzg4NTkxNVwiLFxuICBcImlzb2lyMjI2XCI6IFwiaXNvODg1OTE2XCIsXG4gIFwiY3A4MTlcIjogXCJpc284ODU5MVwiLFxuICBcImlibTgxOVwiOiBcImlzbzg4NTkxXCIsXG4gIFwiY3lyaWxsaWNcIjogXCJpc284ODU5NVwiLFxuICBcImFyYWJpY1wiOiBcImlzbzg4NTk2XCIsXG4gIFwiYXJhYmljOFwiOiBcImlzbzg4NTk2XCIsXG4gIFwiZWNtYTExNFwiOiBcImlzbzg4NTk2XCIsXG4gIFwiYXNtbzcwOFwiOiBcImlzbzg4NTk2XCIsXG4gIFwiZ3JlZWtcIjogXCJpc284ODU5N1wiLFxuICBcImdyZWVrOFwiOiBcImlzbzg4NTk3XCIsXG4gIFwiZWNtYTExOFwiOiBcImlzbzg4NTk3XCIsXG4gIFwiZWxvdDkyOFwiOiBcImlzbzg4NTk3XCIsXG4gIFwiaGVicmV3XCI6IFwiaXNvODg1OThcIixcbiAgXCJoZWJyZXc4XCI6IFwiaXNvODg1OThcIixcbiAgXCJ0dXJraXNoXCI6IFwiaXNvODg1OTlcIixcbiAgXCJ0dXJraXNoOFwiOiBcImlzbzg4NTk5XCIsXG4gIFwidGhhaVwiOiBcImlzbzg4NTkxMVwiLFxuICBcInRoYWk4XCI6IFwiaXNvODg1OTExXCIsXG4gIFwiY2VsdGljXCI6IFwiaXNvODg1OTE0XCIsXG4gIFwiY2VsdGljOFwiOiBcImlzbzg4NTkxNFwiLFxuICBcImlzb2NlbHRpY1wiOiBcImlzbzg4NTkxNFwiLFxuICBcInRpczYyMDBcIjogXCJ0aXM2MjBcIixcbiAgXCJ0aXM2MjAyNTI5MVwiOiBcInRpczYyMFwiLFxuICBcInRpczYyMDI1MzMwXCI6IFwidGlzNjIwXCIsXG4gIFwiMTAwMDBcIjogXCJtYWNyb21hblwiLFxuICBcIjEwMDA2XCI6IFwibWFjZ3JlZWtcIixcbiAgXCIxMDAwN1wiOiBcIm1hY2N5cmlsbGljXCIsXG4gIFwiMTAwNzlcIjogXCJtYWNpY2VsYW5kXCIsXG4gIFwiMTAwODFcIjogXCJtYWN0dXJraXNoXCIsXG4gIFwiY3NwYzhjb2RlcGFnZTQzN1wiOiBcImNwNDM3XCIsXG4gIFwiY3NwYzc3NWJhbHRpY1wiOiBcImNwNzc1XCIsXG4gIFwiY3NwYzg1MG11bHRpbGluZ3VhbFwiOiBcImNwODUwXCIsXG4gIFwiY3NwY3A4NTJcIjogXCJjcDg1MlwiLFxuICBcImNzcGM4NjJsYXRpbmhlYnJld1wiOiBcImNwODYyXCIsXG4gIFwiY3BnclwiOiBcImNwODY5XCIsXG4gIFwibXNlZVwiOiBcImNwMTI1MFwiLFxuICBcIm1zY3lybFwiOiBcImNwMTI1MVwiLFxuICBcIm1zYW5zaVwiOiBcImNwMTI1MlwiLFxuICBcIm1zZ3JlZWtcIjogXCJjcDEyNTNcIixcbiAgXCJtc3R1cmtcIjogXCJjcDEyNTRcIixcbiAgXCJtc2hlYnJcIjogXCJjcDEyNTVcIixcbiAgXCJtc2FyYWJcIjogXCJjcDEyNTZcIixcbiAgXCJ3aW5iYWx0cmltXCI6IFwiY3AxMjU3XCIsXG4gIFwiY3AyMDg2NlwiOiBcImtvaThyXCIsXG4gIFwiMjA4NjZcIjogXCJrb2k4clwiLFxuICBcImlibTg3OFwiOiBcImtvaThyXCIsXG4gIFwiY3Nrb2k4clwiOiBcImtvaThyXCIsXG4gIFwiY3AyMTg2NlwiOiBcImtvaTh1XCIsXG4gIFwiMjE4NjZcIjogXCJrb2k4dVwiLFxuICBcImlibTExNjhcIjogXCJrb2k4dVwiLFxuICBcInN0cmsxMDQ4MjAwMlwiOiBcInJrMTA0OFwiLFxuICBcInRjdm41NzEyXCI6IFwidGN2blwiLFxuICBcInRjdm41NzEyMVwiOiBcInRjdm5cIixcbiAgXCJnYjE5ODg4MFwiOiBcImlzbzY0NmNuXCIsXG4gIFwiY25cIjogXCJpc282NDZjblwiLFxuICBcImNzaXNvMTRqaXNjNjIyMHJvXCI6IFwiaXNvNjQ2anBcIixcbiAgXCJqaXNjNjIyMDE5Njlyb1wiOiBcImlzbzY0NmpwXCIsXG4gIFwianBcIjogXCJpc282NDZqcFwiLFxuICBcImNzaHByb21hbjhcIjogXCJocHJvbWFuOFwiLFxuICBcInI4XCI6IFwiaHByb21hbjhcIixcbiAgXCJyb21hbjhcIjogXCJocHJvbWFuOFwiLFxuICBcInhyb21hbjhcIjogXCJocHJvbWFuOFwiLFxuICBcImlibTEwNTFcIjogXCJocHJvbWFuOFwiLFxuICBcIm1hY1wiOiBcIm1hY2ludG9zaFwiLFxuICBcImNzbWFjaW50b3NoXCI6IFwibWFjaW50b3NoXCJcbn07XG5cbnZhciBzYmNzRGF0YUdlbmVyYXRlZCA9IHtcbiAgXCI0MzdcIjogXCJjcDQzN1wiLFxuICBcIjczN1wiOiBcImNwNzM3XCIsXG4gIFwiNzc1XCI6IFwiY3A3NzVcIixcbiAgXCI4NTBcIjogXCJjcDg1MFwiLFxuICBcIjg1MlwiOiBcImNwODUyXCIsXG4gIFwiODU1XCI6IFwiY3A4NTVcIixcbiAgXCI4NTZcIjogXCJjcDg1NlwiLFxuICBcIjg1N1wiOiBcImNwODU3XCIsXG4gIFwiODU4XCI6IFwiY3A4NThcIixcbiAgXCI4NjBcIjogXCJjcDg2MFwiLFxuICBcIjg2MVwiOiBcImNwODYxXCIsXG4gIFwiODYyXCI6IFwiY3A4NjJcIixcbiAgXCI4NjNcIjogXCJjcDg2M1wiLFxuICBcIjg2NFwiOiBcImNwODY0XCIsXG4gIFwiODY1XCI6IFwiY3A4NjVcIixcbiAgXCI4NjZcIjogXCJjcDg2NlwiLFxuICBcIjg2OVwiOiBcImNwODY5XCIsXG4gIFwiODc0XCI6IFwid2luZG93czg3NFwiLFxuICBcIjkyMlwiOiBcImNwOTIyXCIsXG4gIFwiMTA0NlwiOiBcImNwMTA0NlwiLFxuICBcIjExMjRcIjogXCJjcDExMjRcIixcbiAgXCIxMTI1XCI6IFwiY3AxMTI1XCIsXG4gIFwiMTEyOVwiOiBcImNwMTEyOVwiLFxuICBcIjExMzNcIjogXCJjcDExMzNcIixcbiAgXCIxMTYxXCI6IFwiY3AxMTYxXCIsXG4gIFwiMTE2MlwiOiBcImNwMTE2MlwiLFxuICBcIjExNjNcIjogXCJjcDExNjNcIixcbiAgXCIxMjUwXCI6IFwid2luZG93czEyNTBcIixcbiAgXCIxMjUxXCI6IFwid2luZG93czEyNTFcIixcbiAgXCIxMjUyXCI6IFwid2luZG93czEyNTJcIixcbiAgXCIxMjUzXCI6IFwid2luZG93czEyNTNcIixcbiAgXCIxMjU0XCI6IFwid2luZG93czEyNTRcIixcbiAgXCIxMjU1XCI6IFwid2luZG93czEyNTVcIixcbiAgXCIxMjU2XCI6IFwid2luZG93czEyNTZcIixcbiAgXCIxMjU3XCI6IFwid2luZG93czEyNTdcIixcbiAgXCIxMjU4XCI6IFwid2luZG93czEyNThcIixcbiAgXCIyODU5MVwiOiBcImlzbzg4NTkxXCIsXG4gIFwiMjg1OTJcIjogXCJpc284ODU5MlwiLFxuICBcIjI4NTkzXCI6IFwiaXNvODg1OTNcIixcbiAgXCIyODU5NFwiOiBcImlzbzg4NTk0XCIsXG4gIFwiMjg1OTVcIjogXCJpc284ODU5NVwiLFxuICBcIjI4NTk2XCI6IFwiaXNvODg1OTZcIixcbiAgXCIyODU5N1wiOiBcImlzbzg4NTk3XCIsXG4gIFwiMjg1OThcIjogXCJpc284ODU5OFwiLFxuICBcIjI4NTk5XCI6IFwiaXNvODg1OTlcIixcbiAgXCIyODYwMFwiOiBcImlzbzg4NTkxMFwiLFxuICBcIjI4NjAxXCI6IFwiaXNvODg1OTExXCIsXG4gIFwiMjg2MDNcIjogXCJpc284ODU5MTNcIixcbiAgXCIyODYwNFwiOiBcImlzbzg4NTkxNFwiLFxuICBcIjI4NjA1XCI6IFwiaXNvODg1OTE1XCIsXG4gIFwiMjg2MDZcIjogXCJpc284ODU5MTZcIixcbiAgXCJ3aW5kb3dzODc0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73vv73vv73vv73igKbvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73igJjigJnigJzigJ3igKLigJPigJTvv73vv73vv73vv73vv73vv73vv73vv73CoOC4geC4guC4g+C4hOC4heC4huC4h+C4iOC4ieC4iuC4i+C4jOC4jeC4juC4j+C4kOC4keC4kuC4k+C4lOC4leC4luC4l+C4mOC4meC4muC4m+C4nOC4neC4nuC4n+C4oOC4oeC4ouC4o+C4pOC4peC4puC4p+C4qOC4qeC4quC4q+C4rOC4reC4ruC4r+C4sOC4seC4suC4s+C4tOC4teC4tuC4t+C4uOC4ueC4uu+/ve+/ve+/ve+/veC4v+C5gOC5geC5guC5g+C5hOC5heC5huC5h+C5iOC5ieC5iuC5i+C5jOC5jeC5juC5j+C5kOC5keC5kuC5k+C5lOC5leC5luC5l+C5mOC5meC5muC5m++/ve+/ve+/ve+/vVwiXG4gIH0sXG4gIFwid2luODc0XCI6IFwid2luZG93czg3NFwiLFxuICBcImNwODc0XCI6IFwid2luZG93czg3NFwiLFxuICBcIndpbmRvd3MxMjUwXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73igJrvv73igJ7igKbigKDigKHvv73igLDFoOKAucWaxaTFvcW577+94oCY4oCZ4oCc4oCd4oCi4oCT4oCU77+94oSixaHigLrFm8Wlxb7FusKgy4fLmMWBwqTEhMKmwqfCqMKpxZ7Cq8Kswq3CrsW7wrDCscubxYLCtMK1wrbCt8K4xIXFn8K7xL3LncS+xbzFlMOBw4LEgsOExLnEhsOHxIzDicSYw4vEmsONw47EjsSQxYPFh8OTw5TFkMOWw5fFmMWuw5rFsMOcw53FosOfxZXDocOixIPDpMS6xIfDp8SNw6nEmcOrxJvDrcOuxI/EkcWExYjDs8O0xZHDtsO3xZnFr8O6xbHDvMO9xaPLmVwiXG4gIH0sXG4gIFwid2luMTI1MFwiOiBcIndpbmRvd3MxMjUwXCIsXG4gIFwiY3AxMjUwXCI6IFwid2luZG93czEyNTBcIixcbiAgXCJ3aW5kb3dzMTI1MVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0ILQg+KAmtGT4oCe4oCm4oCg4oCh4oKs4oCw0InigLnQitCM0IvQj9GS4oCY4oCZ4oCc4oCd4oCi4oCT4oCU77+94oSi0ZnigLrRmtGc0ZvRn8Kg0I7RntCIwqTSkMKmwqfQgcKp0ITCq8Kswq3CrtCHwrDCsdCG0ZbSkcK1wrbCt9GR4oSW0ZTCu9GY0IXRldGX0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y9cIlxuICB9LFxuICBcIndpbjEyNTFcIjogXCJ3aW5kb3dzMTI1MVwiLFxuICBcImNwMTI1MVwiOiBcIndpbmRvd3MxMjUxXCIsXG4gIFwid2luZG93czEyNTJcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKCrO+/veKAmsaS4oCe4oCm4oCg4oChy4bigLDFoOKAucWS77+9xb3vv73vv73igJjigJnigJzigJ3igKLigJPigJTLnOKEosWh4oC6xZPvv73FvsW4wqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv8OAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDl8OYw5nDmsObw5zDncOew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73DvsO/XCJcbiAgfSxcbiAgXCJ3aW4xMjUyXCI6IFwid2luZG93czEyNTJcIixcbiAgXCJjcDEyNTJcIjogXCJ3aW5kb3dzMTI1MlwiLFxuICBcIndpbmRvd3MxMjUzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73igJrGkuKAnuKApuKAoOKAoe+/veKAsO+/veKAue+/ve+/ve+/ve+/ve+/veKAmOKAmeKAnOKAneKAouKAk+KAlO+/veKEou+/veKAuu+/ve+/ve+/ve+/vcKgzoXOhsKjwqTCpcKmwqfCqMKp77+9wqvCrMKtwq7igJXCsMKxwrLCs86EwrXCtsK3zojOic6KwrvOjMK9zo7Oj86QzpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoe+/vc6jzqTOpc6mzqfOqM6pzqrOq86szq3Ors6vzrDOsc6yzrPOtM61zrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4LPg8+Ez4XPhs+Hz4jPic+Kz4vPjM+Nz47vv71cIlxuICB9LFxuICBcIndpbjEyNTNcIjogXCJ3aW5kb3dzMTI1M1wiLFxuICBcImNwMTI1M1wiOiBcIndpbmRvd3MxMjUzXCIsXG4gIFwid2luZG93czEyNTRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKCrO+/veKAmsaS4oCe4oCm4oCg4oChy4bigLDFoOKAucWS77+977+977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLFoeKAusWT77+977+9xbjCoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/EnsORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMSwxZ7Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvxJ/DscOyw7PDtMO1w7bDt8O4w7nDusO7w7zEscWfw79cIlxuICB9LFxuICBcIndpbjEyNTRcIjogXCJ3aW5kb3dzMTI1NFwiLFxuICBcImNwMTI1NFwiOiBcIndpbmRvd3MxMjU0XCIsXG4gIFwid2luZG93czEyNTVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKCrO+/veKAmsaS4oCe4oCm4oCg4oChy4bigLDvv73igLnvv73vv73vv73vv73vv73igJjigJnigJzigJ3igKLigJPigJTLnOKEou+/veKAuu+/ve+/ve+/ve+/vcKgwqHCosKj4oKqwqXCpsKnwqjCqcOXwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5w7fCu8K8wr3CvsK/1rDWsday1rPWtNa11rbWt9a41rnWuta71rzWvda+1r/XgNeB14LXg9ew17HXstez17Tvv73vv73vv73vv73vv73vv73vv73XkNeR15LXk9eU15XXlteX15jXmdea15vXnNed157Xn9eg16HXotej16TXpdem16fXqNep16rvv73vv73igI7igI/vv71cIlxuICB9LFxuICBcIndpbjEyNTVcIjogXCJ3aW5kb3dzMTI1NVwiLFxuICBcImNwMTI1NVwiOiBcIndpbmRvd3MxMjU1XCIsXG4gIFwid2luZG93czEyNTZcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKCrNm+4oCaxpLigJ7igKbigKDigKHLhuKAsNm54oC5xZLahtqY2ojar+KAmOKAmeKAnOKAneKAouKAk+KAlNqp4oSi2pHigLrFk+KAjOKAjdq6wqDYjMKiwqPCpMKlwqbCp8KowqnavsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCudibwrvCvMK9wr7Yn9uB2KHYotij2KTYpdim2KfYqNip2KrYq9is2K3Yrtiv2LDYsdiy2LPYtNi12LbDl9i32LjYudi62YDZgdmC2YPDoNmEw6LZhdmG2YfZiMOnw6jDqcOqw6vZidmKw67Dr9mL2YzZjdmOw7TZj9mQw7fZkcO52ZLDu8O84oCO4oCP25JcIlxuICB9LFxuICBcIndpbjEyNTZcIjogXCJ3aW5kb3dzMTI1NlwiLFxuICBcImNwMTI1NlwiOiBcIndpbmRvd3MxMjU2XCIsXG4gIFwid2luZG93czEyNTdcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKCrO+/veKAmu+/veKAnuKApuKAoOKAoe+/veKAsO+/veKAue+/vcKoy4fCuO+/veKAmOKAmeKAnOKAneKAouKAk+KAlO+/veKEou+/veKAuu+/vcKvy5vvv73CoO+/vcKiwqPCpO+/vcKmwqfDmMKpxZbCq8Kswq3CrsOGwrDCscKywrPCtMK1wrbCt8O4wrnFl8K7wrzCvcK+w6bEhMSuxIDEhsOEw4XEmMSSxIzDicW5xJbEosS2xKrEu8WgxYPFhcOTxYzDlcOWw5fFssWBxZrFqsOcxbvFvcOfxIXEr8SBxIfDpMOlxJnEk8SNw6nFusSXxKPEt8SrxLzFocWExYbDs8WNw7XDtsO3xbPFgsWbxavDvMW8xb7LmVwiXG4gIH0sXG4gIFwid2luMTI1N1wiOiBcIndpbmRvd3MxMjU3XCIsXG4gIFwiY3AxMjU3XCI6IFwid2luZG93czEyNTdcIixcbiAgXCJ3aW5kb3dzMTI1OFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs77+94oCaxpLigJ7igKbigKDigKHLhuKAsO+/veKAucWS77+977+977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLvv73igLrFk++/ve+/vcW4wqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv8OAw4HDgsSCw4TDhcOGw4fDiMOJw4rDi8yAw43DjsOPxJDDkcyJw5PDlMagw5bDl8OYw5nDmsObw5zGr8yDw5/DoMOhw6LEg8Okw6XDpsOnw6jDqcOqw6vMgcOtw67Dr8SRw7HMo8Ozw7TGocO2w7fDuMO5w7rDu8O8xrDigqvDv1wiXG4gIH0sXG4gIFwid2luMTI1OFwiOiBcIndpbmRvd3MxMjU4XCIsXG4gIFwiY3AxMjU4XCI6IFwid2luZG93czEyNThcIixcbiAgXCJpc284ODU5MVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5fDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9w77Dv1wiXG4gIH0sXG4gIFwiY3AyODU5MVwiOiBcImlzbzg4NTkxXCIsXG4gIFwiaXNvODg1OTJcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMSEy5jFgcKkxL3FmsKnwqjFoMWexaTFucKtxb3Fu8KwxIXLm8WCwrTEvsWby4fCuMWhxZ/FpcW6y53FvsW8xZTDgcOCxILDhMS5xIbDh8SMw4nEmMOLxJrDjcOOxI7EkMWDxYfDk8OUxZDDlsOXxZjFrsOaxbDDnMOdxaLDn8WVw6HDosSDw6TEusSHw6fEjcOpxJnDq8Sbw63DrsSPxJHFhMWIw7PDtMWRw7bDt8WZxa/DusWxw7zDvcWjy5lcIlxuICB9LFxuICBcImNwMjg1OTJcIjogXCJpc284ODU5MlwiLFxuICBcImlzbzg4NTkzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDEpsuYwqPCpO+/vcSkwqfCqMSwxZ7EnsS0wq3vv73Fu8KwxKfCssKzwrTCtcSlwrfCuMSxxZ/En8S1wr3vv73FvMOAw4HDgu+/vcOExIrEiMOHw4jDicOKw4vDjMONw47Dj++/vcORw5LDk8OUxKDDlsOXxJzDmcOaw5vDnMWsxZzDn8Ogw6HDou+/vcOkxIvEicOnw6jDqcOqw6vDrMOtw67Dr++/vcOxw7LDs8O0xKHDtsO3xJ3DucO6w7vDvMWtxZ3LmVwiXG4gIH0sXG4gIFwiY3AyODU5M1wiOiBcImlzbzg4NTkzXCIsXG4gIFwiaXNvODg1OTRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMSExLjFlsKkxKjEu8KnwqjFoMSSxKLFpsKtxb3Cr8KwxIXLm8WXwrTEqcS8y4fCuMWhxJPEo8WnxYrFvsWLxIDDgcOCw4PDhMOFw4bErsSMw4nEmMOLxJbDjcOOxKrEkMWFxYzEtsOUw5XDlsOXw5jFssOaw5vDnMWoxarDn8SBw6HDosOjw6TDpcOmxK/EjcOpxJnDq8SXw63DrsSrxJHFhsWNxLfDtMO1w7bDt8O4xbPDusO7w7zFqcWry5lcIlxuICB9LFxuICBcImNwMjg1OTRcIjogXCJpc284ODU5NFwiLFxuICBcImlzbzg4NTk1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDQgdCC0IPQhNCF0IbQh9CI0InQitCL0IzCrdCO0I/QkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj+KEltGR0ZLRk9GU0ZXRltGX0ZjRmdGa0ZvRnMKn0Z7Rn1wiXG4gIH0sXG4gIFwiY3AyODU5NVwiOiBcImlzbzg4NTk1XCIsXG4gIFwiaXNvODg1OTZcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoO+/ve+/ve+/vcKk77+977+977+977+977+977+977+92IzCre+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vdib77+977+977+92J/vv73Yodii2KPYpNil2KbYp9io2KnYqtir2KzYrdiu2K/YsNix2LLYs9i02LXYtti32LjYudi677+977+977+977+977+92YDZgdmC2YPZhNmF2YbZh9mI2YnZitmL2YzZjdmO2Y/ZkNmR2ZLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv71cIlxuICB9LFxuICBcImNwMjg1OTZcIjogXCJpc284ODU5NlwiLFxuICBcImlzbzg4NTk3XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDigJjigJnCo+KCrOKCr8KmwqfCqMKpzbrCq8Kswq3vv73igJXCsMKxwrLCs86EzoXOhsK3zojOic6KwrvOjMK9zo7Oj86QzpHOks6TzpTOlc6WzpfOmM6ZzprOm86czp3Ons6fzqDOoe+/vc6jzqTOpc6mzqfOqM6pzqrOq86szq3Ors6vzrDOsc6yzrPOtM61zrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4LPg8+Ez4XPhs+Hz4jPic+Kz4vPjM+Nz47vv71cIlxuICB9LFxuICBcImNwMjg1OTdcIjogXCJpc284ODU5N1wiLFxuICBcImlzbzg4NTk4XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDvv73CosKjwqTCpcKmwqfCqMKpw5fCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnDt8K7wrzCvcK+77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+94oCX15DXkdeS15PXlNeV15bXl9eY15nXmteb15zXndee15/XoNeh16LXo9ek16XXpten16jXqdeq77+977+94oCO4oCP77+9XCJcbiAgfSxcbiAgXCJjcDI4NTk4XCI6IFwiaXNvODg1OThcIixcbiAgXCJpc284ODU5OVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8Sew5HDksOTw5TDlcOWw5fDmMOZw5rDm8OcxLDFnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/En8Oxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMSxxZ/Dv1wiXG4gIH0sXG4gIFwiY3AyODU5OVwiOiBcImlzbzg4NTk5XCIsXG4gIFwiaXNvODg1OTEwXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDEhMSSxKLEqsSoxLbCp8S7xJDFoMWmxb3CrcWqxYrCsMSFxJPEo8SrxKnEt8K3xLzEkcWhxafFvuKAlcWrxYvEgMOBw4LDg8OEw4XDhsSuxIzDicSYw4vElsONw47Dj8OQxYXFjMOTw5TDlcOWxajDmMWyw5rDm8Ocw53DnsOfxIHDocOiw6PDpMOlw6bEr8SNw6nEmcOrxJfDrcOuw6/DsMWGxY3Ds8O0w7XDtsWpw7jFs8O6w7vDvMO9w77EuFwiXG4gIH0sXG4gIFwiY3AyODYwMFwiOiBcImlzbzg4NTkxMFwiLFxuICBcImlzbzg4NTkxMVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg4LiB4LiC4LiD4LiE4LiF4LiG4LiH4LiI4LiJ4LiK4LiL4LiM4LiN4LiO4LiP4LiQ4LiR4LiS4LiT4LiU4LiV4LiW4LiX4LiY4LiZ4Lia4Lib4Lic4Lid4Lie4Lif4Lig4Lih4Lii4Lij4Lik4Lil4Lim4Lin4Lio4Lip4Liq4Lir4Lis4Lit4Liu4Liv4Liw4Lix4Liy4Liz4Li04Li14Li24Li34Li44Li54Li677+977+977+977+94Li/4LmA4LmB4LmC4LmD4LmE4LmF4LmG4LmH4LmI4LmJ4LmK4LmL4LmM4LmN4LmO4LmP4LmQ4LmR4LmS4LmT4LmU4LmV4LmW4LmX4LmY4LmZ4Lma4Lmb77+977+977+977+9XCJcbiAgfSxcbiAgXCJjcDI4NjAxXCI6IFwiaXNvODg1OTExXCIsXG4gIFwiaXNvODg1OTEzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDigJ3CosKjwqTigJ7CpsKnw5jCqcWWwqvCrMKtwq7DhsKwwrHCssKz4oCcwrXCtsK3w7jCucWXwrvCvMK9wr7DpsSExK7EgMSGw4TDhcSYxJLEjMOJxbnElsSixLbEqsS7xaDFg8WFw5PFjMOVw5bDl8WyxYHFmsWqw5zFu8W9w5/EhcSvxIHEh8Okw6XEmcSTxI3DqcW6xJfEo8S3xKvEvMWhxYTFhsOzxY3DtcO2w7fFs8WCxZvFq8O8xbzFvuKAmVwiXG4gIH0sXG4gIFwiY3AyODYwM1wiOiBcImlzbzg4NTkxM1wiLFxuICBcImlzbzg4NTkxNFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg4biC4biDwqPEisSL4biKwqfhuoDCqeG6guG4i+G7ssKtwq7FuOG4nuG4n8SgxKHhuYDhuYHCtuG5luG6geG5l+G6g+G5oOG7s+G6hOG6heG5ocOAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPxbTDkcOSw5PDlMOVw5bhuarDmMOZw5rDm8Ocw53FtsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/FtcOxw7LDs8O0w7XDtuG5q8O4w7nDusO7w7zDvcW3w79cIlxuICB9LFxuICBcImNwMjg2MDRcIjogXCJpc284ODU5MTRcIixcbiAgXCJpc284ODU5MTVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMKhwqLCo+KCrMKlxaDCp8WhwqnCqsKrwqzCrcKuwq/CsMKxwrLCs8W9wrXCtsK3xb7CucK6wrvFksWTxbjCv8OAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPw5DDkcOSw5PDlMOVw5bDl8OYw5nDmsObw5zDncOew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Oww7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8w73DvsO/XCJcbiAgfSxcbiAgXCJjcDI4NjA1XCI6IFwiaXNvODg1OTE1XCIsXG4gIFwiaXNvODg1OTE2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDEhMSFxYHigqzigJ7FoMKnxaHCqciYwqvFucKtxbrFu8KwwrHEjMWCxb3igJ3CtsK3xb7EjciZwrvFksWTxbjFvMOAw4HDgsSCw4TEhsOGw4fDiMOJw4rDi8OMw43DjsOPxJDFg8OSw5PDlMWQw5bFmsWww5nDmsObw5zEmMiaw5/DoMOhw6LEg8OkxIfDpsOnw6jDqcOqw6vDrMOtw67Dr8SRxYTDssOzw7TFkcO2xZvFscO5w7rDu8O8xJnIm8O/XCJcbiAgfSxcbiAgXCJjcDI4NjA2XCI6IFwiaXNvODg1OTE2XCIsXG4gIFwiY3A0MzdcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8Ouw6zDhMOFw4nDpsOGw7TDtsOyw7vDucO/w5bDnMKiwqPCpeKCp8aSw6HDrcOzw7rDscORwqrCusK/4oyQwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtNDM3XCI6IFwiY3A0MzdcIixcbiAgXCJjc2libTQzN1wiOiBcImNwNDM3XCIsXG4gIFwiY3A3MzdcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIs6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHOo86kzqXOps6nzqjOqc6xzrLOs860zrXOts63zrjOuc66zrvOvM69zr7Ov8+Az4HPg8+Cz4TPhc+Gz4fPiOKWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM+JzqzOrc6uz4rOr8+Mz43Pi8+OzobOiM6JzorOjM6Ozo/CseKJpeKJpM6qzqvDt+KJiMKw4oiZwrfiiJrigb/CsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm03MzdcIjogXCJjcDczN1wiLFxuICBcImNzaWJtNzM3XCI6IFwiY3A3MzdcIixcbiAgXCJjcDc3NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwixIbDvMOpxIHDpMSjw6XEh8WCxJPFlsWXxKvFucOEw4XDicOmw4bFjcO2xKLCosWaxZvDlsOcw7jCo8OYw5fCpMSAxKrDs8W7xbzFuuKAncKmwqnCrsKswr3CvMWBwqvCu+KWkeKWkuKWk+KUguKUpMSExIzEmMSW4pWj4pWR4pWX4pWdxK7FoOKUkOKUlOKUtOKUrOKUnOKUgOKUvMWyxarilZrilZTilanilabilaDilZDilazFvcSFxI3EmcSXxK/FocWzxavFvuKUmOKUjOKWiOKWhOKWjOKWkOKWgMOTw5/FjMWDw7XDlcK1xYTEtsS3xLvEvMWGxJLFheKAmcKtwrHigJzCvsK2wqfDt+KAnsKw4oiZwrfCucKzwrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtNzc1XCI6IFwiY3A3NzVcIixcbiAgXCJjc2libTc3NVwiOiBcImNwNzc1XCIsXG4gIFwiY3A4NTBcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8Ouw6zDhMOFw4nDpsOGw7TDtsOyw7vDucO/w5bDnMO4wqPDmMOXxpLDocOtw7PDusOxw5HCqsK6wr/CrsKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpMOBw4LDgMKp4pWj4pWR4pWX4pWdwqLCpeKUkOKUlOKUtOKUrOKUnOKUgOKUvMOjw4PilZrilZTilanilabilaDilZDilazCpMOww5DDisOLw4jEscONw47Dj+KUmOKUjOKWiOKWhMKmw4ziloDDk8Ofw5TDksO1w5XCtcO+w57DmsObw5nDvcOdwq/CtMKtwrHigJfCvsK2wqfDt8K4wrDCqMK3wrnCs8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg1MFwiOiBcImNwODUwXCIsXG4gIFwiY3NpYm04NTBcIjogXCJjcDg1MFwiLFxuICBcImNwODUyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOkxa/Eh8OnxYLDq8WQxZHDrsW5w4TEhsOJxLnEusO0w7bEvcS+xZrFm8OWw5zFpMWlxYHDl8SNw6HDrcOzw7rEhMSFxb3FvsSYxJnCrMW6xIzFn8KrwrvilpHilpLilpPilILilKTDgcOCxJrFnuKVo+KVkeKVl+KVncW7xbzilJDilJTilLTilKzilJzilIDilLzEgsSD4pWa4pWU4pWp4pWm4pWg4pWQ4pWswqTEkcSQxI7Di8SPxYfDjcOOxJvilJjilIzilojiloTFosWu4paAw5PDn8OUxYPFhMWIxaDFocWUw5rFlcWww73DncWjwrTCrcudy5vLh8uYwqfDt8K4wrDCqMuZxbHFmMWZ4pagwqBcIlxuICB9LFxuICBcImlibTg1MlwiOiBcImNwODUyXCIsXG4gIFwiY3NpYm04NTJcIjogXCJjcDg1MlwiLFxuICBcImNwODU1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLRktCC0ZPQg9GR0IHRlNCE0ZXQhdGW0IbRl9CH0ZjQiNGZ0InRmtCK0ZvQi9Gc0IzRntCO0Z/Qj9GO0K7RitCq0LDQkNCx0JHRhtCm0LTQlNC10JXRhNCk0LPQk8KrwrvilpHilpLilpPilILilKTRhdCl0LjQmOKVo+KVkeKVl+KVndC50JnilJDilJTilLTilKzilJzilIDilLzQutCa4pWa4pWU4pWp4pWm4pWg4pWQ4pWswqTQu9Cb0LzQnNC90J3QvtCe0L/ilJjilIzilojiloTQn9GP4paA0K/RgNCg0YHQodGC0KLRg9Cj0LbQltCy0JLRjNCs4oSWwq3Ri9Cr0LfQl9GI0KjRjdCt0YnQqdGH0KfCp+KWoMKgXCJcbiAgfSxcbiAgXCJpYm04NTVcIjogXCJjcDg1NVwiLFxuICBcImNzaWJtODU1XCI6IFwiY3A4NTVcIixcbiAgXCJjcDg1NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi15DXkdeS15PXlNeV15bXl9eY15nXmteb15zXndee15/XoNeh16LXo9ek16XXpten16jXqdeq77+9wqPvv73Dl++/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vcKuwqzCvcK877+9wqvCu+KWkeKWkuKWk+KUguKUpO+/ve+/ve+/vcKp4pWj4pWR4pWX4pWdwqLCpeKUkOKUlOKUtOKUrOKUnOKUgOKUvO+/ve+/veKVmuKVlOKVqeKVpuKVoOKVkOKVrMKk77+977+977+977+977+977+977+977+977+94pSY4pSM4paI4paEwqbvv73iloDvv73vv73vv73vv73vv73vv73Cte+/ve+/ve+/ve+/ve+/ve+/ve+/vcKvwrTCrcKx4oCXwr7CtsKnw7fCuMKwwqjCt8K5wrPCsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NTZcIjogXCJjcDg1NlwiLFxuICBcImNzaWJtODU2XCI6IFwiY3A4NTZcIixcbiAgXCJjcDg1N1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDpMOgw6XDp8Oqw6vDqMOvw67EscOEw4XDicOmw4bDtMO2w7LDu8O5xLDDlsOcw7jCo8OYxZ7Fn8Ohw63Ds8O6w7HDkcSexJ/Cv8KuwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSkw4HDgsOAwqnilaPilZHilZfilZ3CosKl4pSQ4pSU4pS04pSs4pSc4pSA4pS8w6PDg+KVmuKVlOKVqeKVpuKVoOKVkOKVrMKkwrrCqsOKw4vDiO+/vcONw47Dj+KUmOKUjOKWiOKWhMKmw4ziloDDk8Ofw5TDksO1w5XCte+/vcOXw5rDm8OZw6zDv8KvwrTCrcKx77+9wr7CtsKnw7fCuMKwwqjCt8K5wrPCsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NTdcIjogXCJjcDg1N1wiLFxuICBcImNzaWJtODU3XCI6IFwiY3A4NTdcIixcbiAgXCJjcDg1OFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDpMOgw6XDp8Oqw6vDqMOvw67DrMOEw4XDicOmw4bDtMO2w7LDu8O5w7/DlsOcw7jCo8OYw5fGksOhw63Ds8O6w7HDkcKqwrrCv8KuwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSkw4HDgsOAwqnilaPilZHilZfilZ3CosKl4pSQ4pSU4pS04pSs4pSc4pSA4pS8w6PDg+KVmuKVlOKVqeKVpuKVoOKVkOKVrMKkw7DDkMOKw4vDiOKCrMONw47Dj+KUmOKUjOKWiOKWhMKmw4ziloDDk8Ofw5TDksO1w5XCtcO+w57DmsObw5nDvcOdwq/CtMKtwrHigJfCvsK2wqfDt8K4wrDCqMK3wrnCs8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg1OFwiOiBcImNwODU4XCIsXG4gIFwiY3NpYm04NThcIjogXCJjcDg1OFwiLFxuICBcImNwODYwXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOjw6DDgcOnw6rDisOow43DlMOsw4PDgsOJw4DDiMO0w7XDssOaw7nDjMOVw5zCosKjw5nigqfDk8Ohw63Ds8O6w7HDkcKqwrrCv8OSwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtODYwXCI6IFwiY3A4NjBcIixcbiAgXCJjc2libTg2MFwiOiBcImNwODYwXCIsXG4gIFwiY3A4NjFcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDkMOww57DhMOFw4nDpsOGw7TDtsO+w7vDncO9w5bDnMO4wqPDmOKCp8aSw6HDrcOzw7rDgcONw5PDmsK/4oyQwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtODYxXCI6IFwiY3A4NjFcIixcbiAgXCJjc2libTg2MVwiOiBcImNwODYxXCIsXG4gIFwiY3A4NjJcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIteQ15HXkteT15TXldeW15fXmNeZ15rXm9ec153Xntef16DXodei16PXpNel16bXp9eo16nXqsKiwqPCpeKCp8aSw6HDrcOzw7rDscORwqrCusK/4oyQwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtODYyXCI6IFwiY3A4NjJcIixcbiAgXCJjc2libTg2MlwiOiBcImNwODYyXCIsXG4gIFwiY3A4NjNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOHw7zDqcOiw4LDoMK2w6fDqsOrw6jDr8Ou4oCXw4DCp8OJw4jDisO0w4vDj8O7w7nCpMOUw5zCosKjw5nDm8aSwqbCtMOzw7rCqMK4wrPCr8OO4oyQwqzCvcK8wr7Cq8K74paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtODYzXCI6IFwiY3A4NjNcIixcbiAgXCJjc2libTg2M1wiOiBcImNwODYzXCIsXG4gIFwiY3A4NjRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlxcMFxceDAxXFx4MDJcXHgwM1xceDA0XFx4MDVcXHgwNlxceDA3XFxiXFx0XFxuXFx4MEJcXGZcXHJcXHgwRVxceDBGXFx4MTBcXHgxMVxceDEyXFx4MTNcXHgxNFxceDE1XFx4MTZcXHgxN1xceDE4XFx4MTlcXHgxQVxceDFCXFx4MUNcXHgxRFxceDFFXFx4MUYgIVxcXCIjJFxcdTA2NkEmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9flxceDdGXFx4QjBcXHhCN1xcdTIyMTlcXHUyMjFBXFx1MjU5MlxcdTI1MDBcXHUyNTAyXFx1MjUzQ1xcdTI1MjRcXHUyNTJDXFx1MjUxQ1xcdTI1MzRcXHUyNTEwXFx1MjUwQ1xcdTI1MTRcXHUyNTE4XFx1MDNCMlxcdTIyMUVcXHUwM0M2XFx4QjFcXHhCRFxceEJDXFx1MjI0OFxceEFCXFx4QkJcXHVGRUY3XFx1RkVGOFxcdUZGRkRcXHVGRkZEXFx1RkVGQlxcdUZFRkNcXHVGRkZEXFx4QTBcXHhBRFxcdUZFODJcXHhBM1xceEE0XFx1RkU4NFxcdUZGRkRcXHVGRkZEXFx1RkU4RVxcdUZFOEZcXHVGRTk1XFx1RkU5OVxcdTA2MENcXHVGRTlEXFx1RkVBMVxcdUZFQTVcXHUwNjYwXFx1MDY2MVxcdTA2NjJcXHUwNjYzXFx1MDY2NFxcdTA2NjVcXHUwNjY2XFx1MDY2N1xcdTA2NjhcXHUwNjY5XFx1RkVEMVxcdTA2MUJcXHVGRUIxXFx1RkVCNVxcdUZFQjlcXHUwNjFGXFx4QTJcXHVGRTgwXFx1RkU4MVxcdUZFODNcXHVGRTg1XFx1RkVDQVxcdUZFOEJcXHVGRThEXFx1RkU5MVxcdUZFOTNcXHVGRTk3XFx1RkU5QlxcdUZFOUZcXHVGRUEzXFx1RkVBN1xcdUZFQTlcXHVGRUFCXFx1RkVBRFxcdUZFQUZcXHVGRUIzXFx1RkVCN1xcdUZFQkJcXHVGRUJGXFx1RkVDMVxcdUZFQzVcXHVGRUNCXFx1RkVDRlxceEE2XFx4QUNcXHhGN1xceEQ3XFx1RkVDOVxcdTA2NDBcXHVGRUQzXFx1RkVEN1xcdUZFREJcXHVGRURGXFx1RkVFM1xcdUZFRTdcXHVGRUVCXFx1RkVFRFxcdUZFRUZcXHVGRUYzXFx1RkVCRFxcdUZFQ0NcXHVGRUNFXFx1RkVDRFxcdUZFRTFcXHVGRTdEXFx1MDY1MVxcdUZFRTVcXHVGRUU5XFx1RkVFQ1xcdUZFRjBcXHVGRUYyXFx1RkVEMFxcdUZFRDVcXHVGRUY1XFx1RkVGNlxcdUZFRERcXHVGRUQ5XFx1RkVGMVxcdTI1QTBcXHVGRkZEXCJcbiAgfSxcbiAgXCJpYm04NjRcIjogXCJjcDg2NFwiLFxuICBcImNzaWJtODY0XCI6IFwiY3A4NjRcIixcbiAgXCJjcDg2NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDpMOgw6XDp8Oqw6vDqMOvw67DrMOEw4XDicOmw4bDtMO2w7LDu8O5w7/DlsOcw7jCo8OY4oKnxpLDocOtw7PDusOxw5HCqsK6wr/ijJDCrMK9wrzCocKrwqTilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDOscOfzpPPgM6jz4PCtc+EzqbOmM6pzrTiiJ7Phs614oip4omhwrHiiaXiiaTijKDijKHDt+KJiMKw4oiZwrfiiJrigb/CsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NjVcIjogXCJjcDg2NVwiLFxuICBcImNzaWJtODY1XCI6IFwiY3A4NjVcIixcbiAgXCJjcDg2NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/4paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paA0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/QgdGR0ITRlNCH0ZfQjtGewrDiiJnCt+KImuKElsKk4pagwqBcIlxuICB9LFxuICBcImlibTg2NlwiOiBcImNwODY2XCIsXG4gIFwiY3NpYm04NjZcIjogXCJjcDg2NlwiLFxuICBcImNwODY5XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLvv73vv73vv73vv73vv73vv73Ohu+/vcK3wqzCpuKAmOKAmc6I4oCVzonOis6qzozvv73vv73Ojs6rwqnOj8KywrPOrMKjzq3Ors6vz4rOkM+Mz43Okc6SzpPOlM6VzpbOl8K9zpjOmcKrwrvilpHilpLilpPilILilKTOms6bzpzOneKVo+KVkeKVl+KVnc6ezp/ilJDilJTilLTilKzilJzilIDilLzOoM6h4pWa4pWU4pWp4pWm4pWg4pWQ4pWszqPOpM6lzqbOp86ozqnOsc6yzrPilJjilIzilojiloTOtM614paAzrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4PPgs+EzoTCrcKxz4XPhs+HwqfPiM6FwrDCqM+Jz4vOsM+O4pagwqBcIlxuICB9LFxuICBcImlibTg2OVwiOiBcImNwODY5XCIsXG4gIFwiY3NpYm04NjlcIjogXCJjcDg2OVwiLFxuICBcImNwOTIyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKu4oC+wrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8Wgw5HDksOTw5TDlcOWw5fDmMOZw5rDm8Ocw53FvcOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/FocOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9xb7Dv1wiXG4gIH0sXG4gIFwiaWJtOTIyXCI6IFwiY3A5MjJcIixcbiAgXCJjc2libTkyMlwiOiBcImNwOTIyXCIsXG4gIFwiY3AxMDQ2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLvuojDl8O376O276O176O076O377mxwojilqDilILilIDilJDilIzilJTilJjvubnvubvvub3vub/vubfvuorvu7Dvu7Pvu7Lvu47vu4/vu5Dvu7bvu7jvu7rvu7zCoO+juu+jue+juMKk76O777qL77qR77qX77qb77qf77qj2IzCre+6p++6s9mg2aHZotmj2aTZpdmm2afZqNmp77q32Jvvurvvur/vu4rYn++7i9ih2KLYo9ik2KXYptin2KjYqdiq2KvYrNit2K7Yr9iw2LHYstiz2LTYtdi22Lfvu4fYudi677uM77qC77qE77qO77uT2YDZgdmC2YPZhNmF2YbZh9mI2YnZitmL2YzZjdmO2Y/ZkNmR2ZLvu5fvu5vvu5/vo7zvu7Xvu7fvu7nvu7vvu6Pvu6fvu6zvu6nvv71cIlxuICB9LFxuICBcImlibTEwNDZcIjogXCJjcDEwNDZcIixcbiAgXCJjc2libTEwNDZcIjogXCJjcDEwNDZcIixcbiAgXCJjcDExMjRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoNCB0ILSkNCE0IXQhtCH0IjQidCK0IvQjMKt0I7Qj9CQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP4oSW0ZHRktKR0ZTRldGW0ZfRmNGZ0ZrRm9GcwqfRntGfXCJcbiAgfSxcbiAgXCJpYm0xMTI0XCI6IFwiY3AxMTI0XCIsXG4gIFwiY3NpYm0xMTI0XCI6IFwiY3AxMTI0XCIsXG4gIFwiY3AxMTI1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLQkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/ilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDRgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj9CB0ZHSkNKR0ITRlNCG0ZbQh9GXwrfiiJrihJbCpOKWoMKgXCJcbiAgfSxcbiAgXCJpYm0xMTI1XCI6IFwiY3AxMTI1XCIsXG4gIFwiY3NpYm0xMTI1XCI6IFwiY3AxMTI1XCIsXG4gIFwiY3AxMTI5XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPCpMKlwqbCp8WTwqnCqsKrwqzCrcKuwq/CsMKxwrLCs8W4wrXCtsK3xZLCucK6wrvCvMK9wr7Cv8OAw4HDgsSCw4TDhcOGw4fDiMOJw4rDi8yAw43DjsOPxJDDkcyJw5PDlMagw5bDl8OYw5nDmsObw5zGr8yDw5/DoMOhw6LEg8Okw6XDpsOnw6jDqcOqw6vMgcOtw67Dr8SRw7HMo8Ozw7TGocO2w7fDuMO5w7rDu8O8xrDigqvDv1wiXG4gIH0sXG4gIFwiaWJtMTEyOVwiOiBcImNwMTEyOVwiLFxuICBcImNzaWJtMTEyOVwiOiBcImNwMTEyOVwiLFxuICBcImNwMTEzM1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg4LqB4LqC4LqE4LqH4LqI4Lqq4LqK4LqN4LqU4LqV4LqW4LqX4LqZ4Lqa4Lqb4Lqc4Lqd4Lqe4Lqf4Lqh4Lqi4Lqj4Lql4Lqn4Lqr4Lqt4Lqu77+977+977+94Lqv4Lqw4Lqy4Lqz4Lq04Lq14Lq24Lq34Lq44Lq54Lq84Lqx4Lq74Lq977+977+977+94LuA4LuB4LuC4LuD4LuE4LuI4LuJ4LuK4LuL4LuM4LuN4LuG77+94Luc4Lud4oKt77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+94LuQ4LuR4LuS4LuT4LuU4LuV4LuW4LuX4LuY4LuZ77+977+9wqLCrMKm77+9XCJcbiAgfSxcbiAgXCJpYm0xMTMzXCI6IFwiY3AxMTMzXCIsXG4gIFwiY3NpYm0xMTMzXCI6IFwiY3AxMTMzXCIsXG4gIFwiY3AxMTYxXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73guYjguIHguILguIPguITguIXguIbguIfguIjguInguIrguIvguIzguI3guI7guI/guJDguJHguJLguJPguJTguJXguJbguJfguJjguJnguJrguJvguJzguJ3guJ7guJ/guKDguKHguKLguKPguKTguKXguKbguKfguKjguKnguKrguKvguKzguK3guK7guK/guLDguLHguLLguLPguLTguLXguLbguLfguLjguLnguLrguYnguYrguYvigqzguL/guYDguYHguYLguYPguYTguYXguYbguYfguYjguYnguYrguYvguYzguY3guY7guY/guZDguZHguZLguZPguZTguZXguZbguZfguZjguZnguZrguZvCosKswqbCoFwiXG4gIH0sXG4gIFwiaWJtMTE2MVwiOiBcImNwMTE2MVwiLFxuICBcImNzaWJtMTE2MVwiOiBcImNwMTE2MVwiLFxuICBcImNwMTE2MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKswoHCgsKDwoTigKbChsKHwojCicKKwovCjMKNwo7Cj8KQ4oCY4oCZ4oCc4oCd4oCi4oCT4oCUwpjCmcKawpvCnMKdwp7Cn8Kg4LiB4LiC4LiD4LiE4LiF4LiG4LiH4LiI4LiJ4LiK4LiL4LiM4LiN4LiO4LiP4LiQ4LiR4LiS4LiT4LiU4LiV4LiW4LiX4LiY4LiZ4Lia4Lib4Lic4Lid4Lie4Lif4Lig4Lih4Lii4Lij4Lik4Lil4Lim4Lin4Lio4Lip4Liq4Lir4Lis4Lit4Liu4Liv4Liw4Lix4Liy4Liz4Li04Li14Li24Li34Li44Li54Li677+977+977+977+94Li/4LmA4LmB4LmC4LmD4LmE4LmF4LmG4LmH4LmI4LmJ4LmK4LmL4LmM4LmN4LmO4LmP4LmQ4LmR4LmS4LmT4LmU4LmV4LmW4LmX4LmY4LmZ4Lma4Lmb77+977+977+977+9XCJcbiAgfSxcbiAgXCJpYm0xMTYyXCI6IFwiY3AxMTYyXCIsXG4gIFwiY3NpYm0xMTYyXCI6IFwiY3AxMTYyXCIsXG4gIFwiY3AxMTYzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPigqzCpcKmwqfFk8KpwqrCq8Kswq3CrsKvwrDCscKywrPFuMK1wrbCt8WSwrnCusK7wrzCvcK+wr/DgMOBw4LEgsOEw4XDhsOHw4jDicOKw4vMgMONw47Dj8SQw5HMicOTw5TGoMOWw5fDmMOZw5rDm8Ocxq/Mg8Ofw6DDocOixIPDpMOlw6bDp8Oow6nDqsOrzIHDrcOuw6/EkcOxzKPDs8O0xqHDtsO3w7jDucO6w7vDvMaw4oKrw79cIlxuICB9LFxuICBcImlibTExNjNcIjogXCJjcDExNjNcIixcbiAgXCJjc2libTExNjNcIjogXCJjcDExNjNcIixcbiAgXCJtYWNjcm9hdGlhblwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvOKAoMKwwqLCo8Kn4oCiwrbDn8KuxaDihKLCtMKo4omgxb3DmOKInsKx4omk4oml4oiGwrXiiILiiJHiiI/FoeKIq8KqwrrihKbFvsO4wr/CocKs4oiaxpLiiYjEhsKrxIzigKbCoMOAw4PDlcWSxZPEkOKAlOKAnOKAneKAmOKAmcO34peK77+9wqnigYTCpOKAueKAusOGwrvigJPCt+KAmuKAnuKAsMOCxIfDgcSNw4jDjcOOw4/DjMOTw5TEkcOSw5rDm8OZxLHLhsucwq/PgMOLy5rCuMOKw6bLh1wiXG4gIH0sXG4gIFwibWFjY3lyaWxsaWNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItCQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/igKDCsMKiwqPCp+KAosK20IbCrsKp4oSi0ILRkuKJoNCD0ZPiiJ7CseKJpOKJpdGWwrXiiILQiNCE0ZTQh9GX0InRmdCK0ZrRmNCFwqziiJrGkuKJiOKIhsKrwrvigKbCoNCL0ZvQjNGc0ZXigJPigJTigJzigJ3igJjigJnDt+KAntCO0Z7Qj9Gf4oSW0IHRkdGP0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7CpFwiXG4gIH0sXG4gIFwibWFjZ3JlZWtcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOEwrnCssOJwrPDlsOczoXDoMOiw6TOhMKow6fDqcOow6rDq8Kj4oSiw67Dr+KAosK94oCww7TDtsKmwq3DucO7w7zigKDOk86UzpjOm86ezqDDn8KuwqnOo86qwqfiiaDCsM6HzpHCseKJpOKJpcKlzpLOlc6WzpfOmc6azpzOps6rzqjOqc6szp3CrM6fzqHiiYjOpMKrwrvigKbCoM6lzqfOhs6IxZPigJPigJXigJzigJ3igJjigJnDt86JzorOjM6Ozq3Ors6vz4zOj8+NzrHOss+IzrTOtc+GzrPOt865zr7Ous67zrzOvc6/z4DPjs+Bz4PPhM64z4nPgs+Hz4XOts+Kz4vOkM6w77+9XCJcbiAgfSxcbiAgXCJtYWNpY2VsYW5kXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDhMOFw4fDicORw5bDnMOhw6DDosOkw6PDpcOnw6nDqMOqw6vDrcOsw67Dr8Oxw7PDssO0w7bDtcO6w7nDu8O8w53CsMKiwqPCp+KAosK2w5/CrsKp4oSiwrTCqOKJoMOGw5jiiJ7CseKJpOKJpcKlwrXiiILiiJHiiI/PgOKIq8KqwrrihKbDpsO4wr/CocKs4oiaxpLiiYjiiIbCq8K74oCmwqDDgMODw5XFksWT4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rDv8W44oGEwqTDkMOww57DvsO9wrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU77+9w5LDmsObw5nEscuGy5zCr8uYy5nLmsK4y53Lm8uHXCJcbiAgfSxcbiAgXCJtYWNyb21hblwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvOKAoMKwwqLCo8Kn4oCiwrbDn8KuwqnihKLCtMKo4omgw4bDmOKInsKx4omk4omlwqXCteKIguKIkeKIj8+A4oirwqrCuuKEpsOmw7jCv8KhwqziiJrGkuKJiOKIhsKrwrvigKbCoMOAw4PDlcWSxZPigJPigJTigJzigJ3igJjigJnDt+KXisO/xbjigYTCpOKAueKAuu+sge+sguKAocK34oCa4oCe4oCww4LDisOBw4vDiMONw47Dj8OMw5PDlO+/vcOSw5rDm8OZxLHLhsucwq/LmMuZy5rCuMudy5vLh1wiXG4gIH0sXG4gIFwibWFjcm9tYW5pYVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvOKAoMKwwqLCo8Kn4oCiwrbDn8KuwqnihKLCtMKo4omgxILFnuKInsKx4omk4omlwqXCteKIguKIkeKIj8+A4oirwqrCuuKEpsSDxZ/Cv8KhwqziiJrGkuKJiOKIhsKrwrvigKbCoMOAw4PDlcWSxZPigJPigJTigJzigJ3igJjigJnDt+KXisO/xbjigYTCpOKAueKAusWixaPigKHCt+KAmuKAnuKAsMOCw4rDgcOLw4jDjcOOw4/DjMOTw5Tvv73DksOaw5vDmcSxy4bLnMKvy5jLmcuawrjLncuby4dcIlxuICB9LFxuICBcIm1hY3RoYWlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKrwrvigKbvoozvoo/vopLvopXvopjvoovvoo7vopHvopTvopfigJzigJ3vopnvv73igKLvooTvoonvooXvoobvoofvoojvoorvoo3vopDvopPvopbigJjigJnvv73CoOC4geC4guC4g+C4hOC4heC4huC4h+C4iOC4ieC4iuC4i+C4jOC4jeC4juC4j+C4kOC4keC4kuC4k+C4lOC4leC4luC4l+C4mOC4meC4muC4m+C4nOC4neC4nuC4n+C4oOC4oeC4ouC4o+C4pOC4peC4puC4p+C4qOC4qeC4quC4q+C4rOC4reC4ruC4r+C4sOC4seC4suC4s+C4tOC4teC4tuC4t+C4uOC4ueC4uu+7v+KAi+KAk+KAlOC4v+C5gOC5geC5guC5g+C5hOC5heC5huC5h+C5iOC5ieC5iuC5i+C5jOC5jeKEouC5j+C5kOC5keC5kuC5k+C5lOC5leC5luC5l+C5mOC5mcKuwqnvv73vv73vv73vv71cIlxuICB9LFxuICBcIm1hY3R1cmtpc2hcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOEw4XDh8OJw5HDlsOcw6HDoMOiw6TDo8Olw6fDqcOow6rDq8Otw6zDrsOvw7HDs8Oyw7TDtsO1w7rDucO7w7zigKDCsMKiwqPCp+KAosK2w5/CrsKp4oSiwrTCqOKJoMOGw5jiiJ7CseKJpOKJpcKlwrXiiILiiJHiiI/PgOKIq8KqwrrihKbDpsO4wr/CocKs4oiaxpLiiYjiiIbCq8K74oCmwqDDgMODw5XFksWT4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rDv8W4xJ7En8SwxLHFnsWf4oChwrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU77+9w5LDmsObw5nvv73Lhsucwq/LmMuZy5rCuMudy5vLh1wiXG4gIH0sXG4gIFwibWFjdWtyYWluZVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr+KAoMKw0pDCo8Kn4oCiwrbQhsKuwqnihKLQgtGS4omg0IPRk+KInsKx4omk4oml0ZbCtdKR0IjQhNGU0IfRl9CJ0ZnQitGa0ZjQhcKs4oiaxpLiiYjiiIbCq8K74oCmwqDQi9Gb0IzRnNGV4oCT4oCU4oCc4oCd4oCY4oCZw7figJ7QjtGe0I/Rn+KEltCB0ZHRj9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGOwqRcIlxuICB9LFxuICBcImtvaThyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLilIDilILilIzilJDilJTilJjilJzilKTilKzilLTilLziloDiloTilojilozilpDilpHilpLilpPijKDilqDiiJniiJriiYjiiaTiiaXCoOKMocKwwrLCt8O34pWQ4pWR4pWS0ZHilZPilZTilZXilZbilZfilZjilZnilZrilZvilZzilZ3ilZ7ilZ/ilaDilaHQgeKVouKVo+KVpOKVpeKVpuKVp+KVqOKVqeKVquKVq+KVrMKp0Y7QsNCx0YbQtNC10YTQs9GF0LjQudC60LvQvNC90L7Qv9GP0YDRgdGC0YPQttCy0YzRi9C30YjRjdGJ0YfRitCu0JDQkdCm0JTQldCk0JPQpdCY0JnQmtCb0JzQndCe0J/Qr9Cg0KHQotCj0JbQktCs0KvQl9Co0K3QqdCn0KpcIlxuICB9LFxuICBcImtvaTh1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLilIDilILilIzilJDilJTilJjilJzilKTilKzilLTilLziloDiloTilojilozilpDilpHilpLilpPijKDilqDiiJniiJriiYjiiaTiiaXCoOKMocKwwrLCt8O34pWQ4pWR4pWS0ZHRlOKVlNGW0ZfilZfilZjilZnilZrilZvSkeKVneKVnuKVn+KVoOKVodCB0ITilaPQhtCH4pWm4pWn4pWo4pWp4pWq0pDilazCqdGO0LDQsdGG0LTQtdGE0LPRhdC40LnQutC70LzQvdC+0L/Rj9GA0YHRgtGD0LbQstGM0YvQt9GI0Y3RidGH0YrQrtCQ0JHQptCU0JXQpNCT0KXQmNCZ0JrQm9Cc0J3QntCf0K/QoNCh0KLQo9CW0JLQrNCr0JfQqNCt0KnQp9CqXCJcbiAgfSxcbiAgXCJrb2k4cnVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKUgOKUguKUjOKUkOKUlOKUmOKUnOKUpOKUrOKUtOKUvOKWgOKWhOKWiOKWjOKWkOKWkeKWkuKWk+KMoOKWoOKImeKImuKJiOKJpOKJpcKg4oyhwrDCssK3w7filZDilZHilZLRkdGU4pWU0ZbRl+KVl+KVmOKVmeKVmuKVm9KR0Z7ilZ7ilZ/ilaDilaHQgdCE4pWj0IbQh+KVpuKVp+KVqOKVqeKVqtKQ0I7CqdGO0LDQsdGG0LTQtdGE0LPRhdC40LnQutC70LzQvdC+0L/Rj9GA0YHRgtGD0LbQstGM0YvQt9GI0Y3RidGH0YrQrtCQ0JHQptCU0JXQpNCT0KXQmNCZ0JrQm9Cc0J3QntCf0K/QoNCh0KLQo9CW0JLQrNCr0JfQqNCt0KnQp9CqXCJcbiAgfSxcbiAgXCJrb2k4dFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0pvSk+KAmtKS4oCe4oCm4oCg4oCh77+94oCw0rPigLnSstK30rbvv73SmuKAmOKAmeKAnOKAneKAouKAk+KAlO+/veKEou+/veKAuu+/ve+/ve+/ve+/ve+/vdOv067RkcKk06PCpsKn77+977+977+9wqvCrMKtwq7vv73CsMKxwrLQge+/vdOiwrbCt++/veKElu+/vcK777+977+977+9wqnRjtCw0LHRhtC00LXRhNCz0YXQuNC50LrQu9C80L3QvtC/0Y/RgNGB0YLRg9C20LLRjNGL0LfRiNGN0YnRh9GK0K7QkNCR0KbQlNCV0KTQk9Cl0JjQmdCa0JvQnNCd0J7Qn9Cv0KDQodCi0KPQltCS0KzQq9CX0KjQrdCp0KfQqlwiXG4gIH0sXG4gIFwiYXJtc2NpaThcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoO+/vdaH1okpKMK7wqvigJQu1Z0sLdaK4oCm1ZzVm9We1LHVodSy1aLUs9Wj1LTVpNS11aXUttWm1LfVp9S41ajUudWp1LrVqtS71avUvNWs1L3VrdS+1a7Uv9Wv1YDVsNWB1bHVgtWy1YPVs9WE1bTVhdW11YbVttWH1bfViNW41YnVudWK1brVi9W71YzVvNWN1b3VjtW+1Y/Vv9WQ1oDVkdaB1ZLWgtWT1oPVlNaE1ZXWhdWW1obVmu+/vVwiXG4gIH0sXG4gIFwicmsxMDQ4XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLQgtCD4oCa0ZPigJ7igKbigKDigKHigqzigLDQieKAudCK0prSutCP0ZLigJjigJnigJzigJ3igKLigJPigJTvv73ihKLRmeKAutGa0pvSu9GfwqDSsNKx05jCpNOowqbCp9CBwqnSksKrwqzCrcKu0q7CsMKx0IbRltOpwrXCtsK30ZHihJbSk8K705nSotKj0q/QkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj1wiXG4gIH0sXG4gIFwidGN2blwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFwwXFx4REFcXHUxRUU0XFx4MDNcXHUxRUVBXFx1MUVFQ1xcdTFFRUVcXHgwN1xcYlxcdFxcblxceDBCXFxmXFxyXFx4MEVcXHgwRlxceDEwXFx1MUVFOFxcdTFFRjBcXHUxRUYyXFx1MUVGNlxcdTFFRjhcXHhERFxcdTFFRjRcXHgxOFxceDE5XFx4MUFcXHgxQlxceDFDXFx4MURcXHgxRVxceDFGICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cXHg3RlxceEMwXFx1MUVBMlxceEMzXFx4QzFcXHUxRUEwXFx1MUVCNlxcdTFFQUNcXHhDOFxcdTFFQkFcXHUxRUJDXFx4QzlcXHUxRUI4XFx1MUVDNlxceENDXFx1MUVDOFxcdTAxMjhcXHhDRFxcdTFFQ0FcXHhEMlxcdTFFQ0VcXHhENVxceEQzXFx1MUVDQ1xcdTFFRDhcXHUxRURDXFx1MUVERVxcdTFFRTBcXHUxRURBXFx1MUVFMlxceEQ5XFx1MUVFNlxcdTAxNjhcXHhBMFxcdTAxMDJcXHhDMlxceENBXFx4RDRcXHUwMUEwXFx1MDFBRlxcdTAxMTBcXHUwMTAzXFx4RTJcXHhFQVxceEY0XFx1MDFBMVxcdTAxQjBcXHUwMTExXFx1MUVCMFxcdTAzMDBcXHUwMzA5XFx1MDMwM1xcdTAzMDFcXHUwMzIzXFx4RTBcXHUxRUEzXFx4RTNcXHhFMVxcdTFFQTFcXHUxRUIyXFx1MUVCMVxcdTFFQjNcXHUxRUI1XFx1MUVBRlxcdTFFQjRcXHUxRUFFXFx1MUVBNlxcdTFFQThcXHUxRUFBXFx1MUVBNFxcdTFFQzBcXHUxRUI3XFx1MUVBN1xcdTFFQTlcXHUxRUFCXFx1MUVBNVxcdTFFQURcXHhFOFxcdTFFQzJcXHUxRUJCXFx1MUVCRFxceEU5XFx1MUVCOVxcdTFFQzFcXHUxRUMzXFx1MUVDNVxcdTFFQkZcXHUxRUM3XFx4RUNcXHUxRUM5XFx1MUVDNFxcdTFFQkVcXHUxRUQyXFx1MDEyOVxceEVEXFx1MUVDQlxceEYyXFx1MUVENFxcdTFFQ0ZcXHhGNVxceEYzXFx1MUVDRFxcdTFFRDNcXHUxRUQ1XFx1MUVEN1xcdTFFRDFcXHUxRUQ5XFx1MUVERFxcdTFFREZcXHUxRUUxXFx1MUVEQlxcdTFFRTNcXHhGOVxcdTFFRDZcXHUxRUU3XFx1MDE2OVxceEZBXFx1MUVFNVxcdTFFRUJcXHUxRUVEXFx1MUVFRlxcdTFFRTlcXHUxRUYxXFx1MUVGM1xcdTFFRjdcXHUxRUY5XFx4RkRcXHUxRUY1XFx1MUVEMFwiXG4gIH0sXG4gIFwiZ2VvcmdpYW5hY2FkZW15XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKB4oCaxpLigJ7igKbigKDigKHLhuKAsMWg4oC5xZLCjcKOwo/CkOKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSixaHigLrFk8Kdwp7FuMKgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/hg5Dhg5Hhg5Lhg5Phg5Thg5Xhg5bhg5fhg5jhg5nhg5rhg5vhg5zhg53hg57hg5/hg6Dhg6Hhg6Lhg6Phg6Thg6Xhg6bhg6fhg6jhg6nhg6rhg6vhg6zhg63hg67hg6/hg7Dhg7Hhg7Lhg7Phg7Thg7Xhg7bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9w77Dv1wiXG4gIH0sXG4gIFwiZ2VvcmdpYW5wc1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgeKAmsaS4oCe4oCm4oCg4oChy4bigLDFoOKAucWSwo3CjsKPwpDigJjigJnigJzigJ3igKLigJPigJTLnOKEosWh4oC6xZPCncKexbjCoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/4YOQ4YOR4YOS4YOT4YOU4YOV4YOW4YOx4YOX4YOY4YOZ4YOa4YOb4YOc4YOy4YOd4YOe4YOf4YOg4YOh4YOi4YOz4YOj4YOk4YOl4YOm4YOn4YOo4YOp4YOq4YOr4YOs4YOt4YOu4YO04YOv4YOw4YO1w6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9w77Dv1wiXG4gIH0sXG4gIFwicHQxNTRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItKW0pLTrtKT4oCe4oCm0rbSrtKy0q/SoNOi0qLSmtK60rjSl+KAmOKAmeKAnOKAneKAouKAk+KAlNKz0rfSodOj0qPSm9K70rnCoNCO0Z7QiNOo0pjSsMKn0IHCqdOYwqvCrNOvwq7SnMKw0rHQhtGW0pnTqcK2wrfRkeKEltOZwrvRmNKq0qvSndCQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGPXCJcbiAgfSxcbiAgXCJ2aXNjaWlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlxcMFxceDAxXFx1MUVCMlxceDAzXFx4MDRcXHUxRUI0XFx1MUVBQVxceDA3XFxiXFx0XFxuXFx4MEJcXGZcXHJcXHgwRVxceDBGXFx4MTBcXHgxMVxceDEyXFx4MTNcXHUxRUY2XFx4MTVcXHgxNlxceDE3XFx4MThcXHUxRUY4XFx4MUFcXHgxQlxceDFDXFx4MURcXHUxRUY0XFx4MUYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9flxceDdGXFx1MUVBMFxcdTFFQUVcXHUxRUIwXFx1MUVCNlxcdTFFQTRcXHUxRUE2XFx1MUVBOFxcdTFFQUNcXHUxRUJDXFx1MUVCOFxcdTFFQkVcXHUxRUMwXFx1MUVDMlxcdTFFQzRcXHUxRUM2XFx1MUVEMFxcdTFFRDJcXHUxRUQ0XFx1MUVENlxcdTFFRDhcXHUxRUUyXFx1MUVEQVxcdTFFRENcXHUxRURFXFx1MUVDQVxcdTFFQ0VcXHUxRUNDXFx1MUVDOFxcdTFFRTZcXHUwMTY4XFx1MUVFNFxcdTFFRjJcXHhENVxcdTFFQUZcXHUxRUIxXFx1MUVCN1xcdTFFQTVcXHUxRUE3XFx1MUVBOVxcdTFFQURcXHUxRUJEXFx1MUVCOVxcdTFFQkZcXHUxRUMxXFx1MUVDM1xcdTFFQzVcXHUxRUM3XFx1MUVEMVxcdTFFRDNcXHUxRUQ1XFx1MUVEN1xcdTFFRTBcXHUwMUEwXFx1MUVEOVxcdTFFRERcXHUxRURGXFx1MUVDQlxcdTFFRjBcXHUxRUU4XFx1MUVFQVxcdTFFRUNcXHUwMUExXFx1MUVEQlxcdTAxQUZcXHhDMFxceEMxXFx4QzJcXHhDM1xcdTFFQTJcXHUwMTAyXFx1MUVCM1xcdTFFQjVcXHhDOFxceEM5XFx4Q0FcXHUxRUJBXFx4Q0NcXHhDRFxcdTAxMjhcXHUxRUYzXFx1MDExMFxcdTFFRTlcXHhEMlxceEQzXFx4RDRcXHUxRUExXFx1MUVGN1xcdTFFRUJcXHUxRUVEXFx4RDlcXHhEQVxcdTFFRjlcXHUxRUY1XFx4RERcXHUxRUUxXFx1MDFCMFxceEUwXFx4RTFcXHhFMlxceEUzXFx1MUVBM1xcdTAxMDNcXHUxRUVGXFx1MUVBQlxceEU4XFx4RTlcXHhFQVxcdTFFQkJcXHhFQ1xceEVEXFx1MDEyOVxcdTFFQzlcXHUwMTExXFx1MUVGMVxceEYyXFx4RjNcXHhGNFxceEY1XFx1MUVDRlxcdTFFQ0RcXHUxRUU1XFx4RjlcXHhGQVxcdTAxNjlcXHUxRUU3XFx4RkRcXHUxRUUzXFx1MUVFRVwiXG4gIH0sXG4gIFwiaXNvNjQ2Y25cIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlxcMFxceDAxXFx4MDJcXHgwM1xceDA0XFx4MDVcXHgwNlxceDA3XFxiXFx0XFxuXFx4MEJcXGZcXHJcXHgwRVxceDBGXFx4MTBcXHgxMVxceDEyXFx4MTNcXHgxNFxceDE1XFx4MTZcXHgxN1xceDE4XFx4MTlcXHgxQVxceDFCXFx4MUNcXHgxRFxceDFFXFx4MUYgIVxcXCIjXFx4QTUlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fVxcdTIwM0VcXHg3RlxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXCJcbiAgfSxcbiAgXCJpc282NDZqcFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFwwXFx4MDFcXHgwMlxceDAzXFx4MDRcXHgwNVxceDA2XFx4MDdcXGJcXHRcXG5cXHgwQlxcZlxcclxceDBFXFx4MEZcXHgxMFxceDExXFx4MTJcXHgxM1xceDE0XFx4MTVcXHgxNlxceDE3XFx4MThcXHgxOVxceDFBXFx4MUJcXHgxQ1xceDFEXFx4MUVcXHgxRiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xceEE1XV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9XFx1MjAzRVxceDdGXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcXHVGRkZEXFx1RkZGRFxcdUZGRkRcIlxuICB9LFxuICBcImhwcm9tYW44XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDDgMOCw4jDisOLw47Dj8K0y4vLhsKoy5zDmcOb4oKkwq/DncO9wrDDh8Onw5HDscKhwr/CpMKjwqXCp8aSwqLDosOqw7TDu8Ohw6nDs8O6w6DDqMOyw7nDpMOrw7bDvMOFw67DmMOGw6XDrcO4w6bDhMOsw5bDnMOJw6/Dn8OUw4HDg8Ojw5DDsMONw4zDk8OSw5XDtcWgxaHDmsW4w7/DnsO+wrfCtcK2wr7igJTCvMK9wqrCusKr4pagwrvCse+/vVwiXG4gIH0sXG4gIFwibWFjaW50b3NoXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDhMOFw4fDicORw5bDnMOhw6DDosOkw6PDpcOnw6nDqMOqw6vDrcOsw67Dr8Oxw7PDssO0w7bDtcO6w7nDu8O84oCgwrDCosKjwqfigKLCtsOfwq7CqeKEosK0wqjiiaDDhsOY4oiewrHiiaTiiaXCpcK14oiC4oiR4oiPz4DiiKvCqsK64oSmw6bDuMK/wqHCrOKImsaS4omI4oiGwqvCu+KApsKgw4DDg8OVxZLFk+KAk+KAlOKAnOKAneKAmOKAmcO34peKw7/FuOKBhMKk4oC54oC676yB76yC4oChwrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU77+9w5LDmsObw5nEscuGy5zCr8uYy5nLmsK4y53Lm8uHXCJcbiAgfSxcbiAgXCJhc2NpaVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCJcbiAgfSxcbiAgXCJ0aXM2MjBcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veC4geC4guC4g+C4hOC4heC4huC4h+C4iOC4ieC4iuC4i+C4jOC4jeC4juC4j+C4kOC4keC4kuC4k+C4lOC4leC4luC4l+C4mOC4meC4muC4m+C4nOC4neC4nuC4n+C4oOC4oeC4ouC4o+C4pOC4peC4puC4p+C4qOC4qeC4quC4q+C4rOC4reC4ruC4r+C4sOC4seC4suC4s+C4tOC4teC4tuC4t+C4uOC4ueC4uu+/ve+/ve+/ve+/veC4v+C5gOC5geC5guC5g+C5hOC5heC5huC5h+C5iOC5ieC5iuC5i+C5jOC5jeC5juC5j+C5kOC5keC5kuC5k+C5lOC5leC5luC5l+C5mOC5meC5muC5m++/ve+/ve+/ve+/vVwiXG4gIH1cbn07XG5cbnZhciBCdWZmZXIkNSA9IHNhZmVyXzEuQnVmZmVyOyAvLyBNdWx0aWJ5dGUgY29kZWMuIEluIHRoaXMgc2NoZW1lLCBhIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCBieSAxIG9yIG1vcmUgYnl0ZXMuXG4vLyBPdXIgY29kZWMgc3VwcG9ydHMgVVRGLTE2IHN1cnJvZ2F0ZXMsIGV4dGVuc2lvbnMgZm9yIEdCMTgwMzAgYW5kIHVuaWNvZGUgc2VxdWVuY2VzLlxuLy8gVG8gc2F2ZSBtZW1vcnkgYW5kIGxvYWRpbmcgdGltZSwgd2UgcmVhZCB0YWJsZSBmaWxlcyBvbmx5IHdoZW4gcmVxdWVzdGVkLlxuXG52YXIgX2RiY3MgPSBEQkNTQ29kZWM7XG52YXIgVU5BU1NJR05FRCA9IC0xLFxuICAgIEdCMTgwMzBfQ09ERSA9IC0yLFxuICAgIFNFUV9TVEFSVCA9IC0xMCxcbiAgICBOT0RFX1NUQVJUID0gLTEwMDAsXG4gICAgVU5BU1NJR05FRF9OT0RFID0gbmV3IEFycmF5KDB4MTAwKSxcbiAgICBERUZfQ0hBUiA9IC0xO1xuXG5mb3IgKHZhciBpJDIgPSAwOyBpJDIgPCAweDEwMDsgaSQyKyspIHtcbiAgVU5BU1NJR05FRF9OT0RFW2kkMl0gPSBVTkFTU0lHTkVEO1xufSAvLyBDbGFzcyBEQkNTQ29kZWMgcmVhZHMgYW5kIGluaXRpYWxpemVzIG1hcHBpbmcgdGFibGVzLlxuXG5cbmZ1bmN0aW9uIERCQ1NDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gIHRoaXMuZW5jb2RpbmdOYW1lID0gY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZTtcbiAgaWYgKCFjb2RlY09wdGlvbnMpIHRocm93IG5ldyBFcnJvcihcIkRCQ1MgY29kZWMgaXMgY2FsbGVkIHdpdGhvdXQgdGhlIGRhdGEuXCIpO1xuICBpZiAoIWNvZGVjT3B0aW9ucy50YWJsZSkgdGhyb3cgbmV3IEVycm9yKFwiRW5jb2RpbmcgJ1wiICsgdGhpcy5lbmNvZGluZ05hbWUgKyBcIicgaGFzIG5vIGRhdGEuXCIpOyAvLyBMb2FkIHRhYmxlcy5cblxuICB2YXIgbWFwcGluZ1RhYmxlID0gY29kZWNPcHRpb25zLnRhYmxlKCk7IC8vIERlY29kZSB0YWJsZXM6IE1CQ1MgLT4gVW5pY29kZS5cbiAgLy8gZGVjb2RlVGFibGVzIGlzIGEgdHJpZSwgZW5jb2RlZCBhcyBhbiBhcnJheSBvZiBhcnJheXMgb2YgaW50ZWdlcnMuIEludGVybmFsIGFycmF5cyBhcmUgdHJpZSBub2RlcyBhbmQgYWxsIGhhdmUgbGVuID0gMjU2LlxuICAvLyBUcmllIHJvb3QgaXMgZGVjb2RlVGFibGVzWzBdLlxuICAvLyBWYWx1ZXM6ID49ICAwIC0+IHVuaWNvZGUgY2hhcmFjdGVyIGNvZGUuIGNhbiBiZSA+IDB4RkZGRlxuICAvLyAgICAgICAgID09IFVOQVNTSUdORUQgLT4gdW5rbm93bi91bmFzc2lnbmVkIHNlcXVlbmNlLlxuICAvLyAgICAgICAgID09IEdCMTgwMzBfQ09ERSAtPiB0aGlzIGlzIHRoZSBlbmQgb2YgYSBHQjE4MDMwIDQtYnl0ZSBzZXF1ZW5jZS5cbiAgLy8gICAgICAgICA8PSBOT0RFX1NUQVJUIC0+IGluZGV4IG9mIHRoZSBuZXh0IG5vZGUgaW4gb3VyIHRyaWUgdG8gcHJvY2VzcyBuZXh0IGJ5dGUuXG4gIC8vICAgICAgICAgPD0gU0VRX1NUQVJUICAtPiBpbmRleCBvZiB0aGUgc3RhcnQgb2YgYSBjaGFyYWN0ZXIgY29kZSBzZXF1ZW5jZSwgaW4gZGVjb2RlVGFibGVTZXEuXG5cbiAgdGhpcy5kZWNvZGVUYWJsZXMgPSBbXTtcbiAgdGhpcy5kZWNvZGVUYWJsZXNbMF0gPSBVTkFTU0lHTkVEX05PREUuc2xpY2UoMCk7IC8vIENyZWF0ZSByb290IG5vZGUuXG4gIC8vIFNvbWV0aW1lcyBhIE1CQ1MgY2hhciBjb3JyZXNwb25kcyB0byBhIHNlcXVlbmNlIG9mIHVuaWNvZGUgY2hhcnMuIFdlIHN0b3JlIHRoZW0gYXMgYXJyYXlzIG9mIGludGVnZXJzIGhlcmUuIFxuXG4gIHRoaXMuZGVjb2RlVGFibGVTZXEgPSBbXTsgLy8gQWN0dWFsIG1hcHBpbmcgdGFibGVzIGNvbnNpc3Qgb2YgY2h1bmtzLiBVc2UgdGhlbSB0byBmaWxsIHVwIGRlY29kZSB0YWJsZXMuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBwaW5nVGFibGUubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLl9hZGREZWNvZGVDaHVuayhtYXBwaW5nVGFibGVbaV0pO1xuICB9XG5cbiAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBpY29udi5kZWZhdWx0Q2hhclVuaWNvZGU7IC8vIEVuY29kZSB0YWJsZXM6IFVuaWNvZGUgLT4gREJDUy5cbiAgLy8gYGVuY29kZVRhYmxlYCBpcyBhcnJheSBtYXBwaW5nIGZyb20gdW5pY29kZSBjaGFyIHRvIGVuY29kZWQgY2hhci4gQWxsIGl0cyB2YWx1ZXMgYXJlIGludGVnZXJzIGZvciBwZXJmb3JtYW5jZS5cbiAgLy8gQmVjYXVzZSBpdCBjYW4gYmUgc3BhcnNlLCBpdCBpcyByZXByZXNlbnRlZCBhcyBhcnJheSBvZiBidWNrZXRzIGJ5IDI1NiBjaGFycyBlYWNoLiBCdWNrZXQgY2FuIGJlIG51bGwuXG4gIC8vIFZhbHVlczogPj0gIDAgLT4gaXQgaXMgYSBub3JtYWwgY2hhci4gV3JpdGUgdGhlIHZhbHVlIChpZiA8PTI1NiB0aGVuIDEgYnl0ZSwgaWYgPD02NTUzNiB0aGVuIDIgYnl0ZXMsIGV0Yy4pLlxuICAvLyAgICAgICAgID09IFVOQVNTSUdORUQgLT4gbm8gY29udmVyc2lvbiBmb3VuZC4gT3V0cHV0IGEgZGVmYXVsdCBjaGFyLlxuICAvLyAgICAgICAgIDw9IFNFUV9TVEFSVCAgLT4gaXQncyBhbiBpbmRleCBpbiBlbmNvZGVUYWJsZVNlcSwgc2VlIGJlbG93LiBUaGUgY2hhcmFjdGVyIHN0YXJ0cyBhIHNlcXVlbmNlLlxuXG4gIHRoaXMuZW5jb2RlVGFibGUgPSBbXTsgLy8gYGVuY29kZVRhYmxlU2VxYCBpcyB1c2VkIHdoZW4gYSBzZXF1ZW5jZSBvZiB1bmljb2RlIGNoYXJhY3RlcnMgaXMgZW5jb2RlZCBhcyBhIHNpbmdsZSBjb2RlLiBXZSB1c2UgYSB0cmVlIG9mXG4gIC8vIG9iamVjdHMgd2hlcmUga2V5cyBjb3JyZXNwb25kIHRvIGNoYXJhY3RlcnMgaW4gc2VxdWVuY2UgYW5kIGxlYWZzIGFyZSB0aGUgZW5jb2RlZCBkYmNzIHZhbHVlcy4gQSBzcGVjaWFsIERFRl9DSEFSIGtleVxuICAvLyBtZWFucyBlbmQgb2Ygc2VxdWVuY2UgKG5lZWRlZCB3aGVuIG9uZSBzZXF1ZW5jZSBpcyBhIHN0cmljdCBzdWJzZXF1ZW5jZSBvZiBhbm90aGVyKS5cbiAgLy8gT2JqZWN0cyBhcmUga2VwdCBzZXBhcmF0ZWx5IGZyb20gZW5jb2RlVGFibGUgdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2UuXG5cbiAgdGhpcy5lbmNvZGVUYWJsZVNlcSA9IFtdOyAvLyBTb21lIGNoYXJzIGNhbiBiZSBkZWNvZGVkLCBidXQgbmVlZCBub3QgYmUgZW5jb2RlZC5cblxuICB2YXIgc2tpcEVuY29kZUNoYXJzID0ge307XG4gIGlmIChjb2RlY09wdGlvbnMuZW5jb2RlU2tpcFZhbHMpIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZWNPcHRpb25zLmVuY29kZVNraXBWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHZhbCA9IGNvZGVjT3B0aW9ucy5lbmNvZGVTa2lwVmFsc1tpXTtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHNraXBFbmNvZGVDaGFyc1t2YWxdID0gdHJ1ZTtlbHNlIGZvciAodmFyIGogPSB2YWwuZnJvbTsgaiA8PSB2YWwudG87IGorKykge1xuICAgICAgc2tpcEVuY29kZUNoYXJzW2pdID0gdHJ1ZTtcbiAgICB9XG4gIH0gLy8gVXNlIGRlY29kZSB0cmllIHRvIHJlY3Vyc2l2ZWx5IGZpbGwgb3V0IGVuY29kZSB0YWJsZXMuXG5cbiAgdGhpcy5fZmlsbEVuY29kZVRhYmxlKDAsIDAsIHNraXBFbmNvZGVDaGFycyk7IC8vIEFkZCBtb3JlIGVuY29kaW5nIHBhaXJzIHdoZW4gbmVlZGVkLlxuXG5cbiAgaWYgKGNvZGVjT3B0aW9ucy5lbmNvZGVBZGQpIHtcbiAgICBmb3IgKHZhciB1Q2hhciBpbiBjb2RlY09wdGlvbnMuZW5jb2RlQWRkKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvZGVjT3B0aW9ucy5lbmNvZGVBZGQsIHVDaGFyKSkgdGhpcy5fc2V0RW5jb2RlQ2hhcih1Q2hhci5jaGFyQ29kZUF0KDApLCBjb2RlY09wdGlvbnMuZW5jb2RlQWRkW3VDaGFyXSk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5kZWZDaGFyU0IgPSB0aGlzLmVuY29kZVRhYmxlWzBdW2ljb252LmRlZmF1bHRDaGFyU2luZ2xlQnl0ZS5jaGFyQ29kZUF0KDApXTtcbiAgaWYgKHRoaXMuZGVmQ2hhclNCID09PSBVTkFTU0lHTkVEKSB0aGlzLmRlZkNoYXJTQiA9IHRoaXMuZW5jb2RlVGFibGVbMF1bJz8nXTtcbiAgaWYgKHRoaXMuZGVmQ2hhclNCID09PSBVTkFTU0lHTkVEKSB0aGlzLmRlZkNoYXJTQiA9IFwiP1wiLmNoYXJDb2RlQXQoMCk7IC8vIExvYWQgJiBjcmVhdGUgR0IxODAzMCB0YWJsZXMgd2hlbiBuZWVkZWQuXG5cbiAgaWYgKHR5cGVvZiBjb2RlY09wdGlvbnMuZ2IxODAzMCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuZ2IxODAzMCA9IGNvZGVjT3B0aW9ucy5nYjE4MDMwKCk7IC8vIExvYWQgR0IxODAzMCByYW5nZXMuXG4gICAgLy8gQWRkIEdCMTgwMzAgZGVjb2RlIHRhYmxlcy5cblxuICAgIHZhciB0aGlyZEJ5dGVOb2RlSWR4ID0gdGhpcy5kZWNvZGVUYWJsZXMubGVuZ3RoO1xuICAgIHZhciB0aGlyZEJ5dGVOb2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbdGhpcmRCeXRlTm9kZUlkeF0gPSBVTkFTU0lHTkVEX05PREUuc2xpY2UoMCk7XG4gICAgdmFyIGZvdXJ0aEJ5dGVOb2RlSWR4ID0gdGhpcy5kZWNvZGVUYWJsZXMubGVuZ3RoO1xuICAgIHZhciBmb3VydGhCeXRlTm9kZSA9IHRoaXMuZGVjb2RlVGFibGVzW2ZvdXJ0aEJ5dGVOb2RlSWR4XSA9IFVOQVNTSUdORURfTk9ERS5zbGljZSgwKTtcblxuICAgIGZvciAodmFyIGkgPSAweDgxOyBpIDw9IDB4RkU7IGkrKykge1xuICAgICAgdmFyIHNlY29uZEJ5dGVOb2RlSWR4ID0gTk9ERV9TVEFSVCAtIHRoaXMuZGVjb2RlVGFibGVzWzBdW2ldO1xuICAgICAgdmFyIHNlY29uZEJ5dGVOb2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbc2Vjb25kQnl0ZU5vZGVJZHhdO1xuXG4gICAgICBmb3IgKHZhciBqID0gMHgzMDsgaiA8PSAweDM5OyBqKyspIHtcbiAgICAgICAgc2Vjb25kQnl0ZU5vZGVbal0gPSBOT0RFX1NUQVJUIC0gdGhpcmRCeXRlTm9kZUlkeDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMHg4MTsgaSA8PSAweEZFOyBpKyspIHtcbiAgICAgIHRoaXJkQnl0ZU5vZGVbaV0gPSBOT0RFX1NUQVJUIC0gZm91cnRoQnl0ZU5vZGVJZHg7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDB4MzA7IGkgPD0gMHgzOTsgaSsrKSB7XG4gICAgICBmb3VydGhCeXRlTm9kZVtpXSA9IEdCMTgwMzBfQ09ERTtcbiAgICB9XG4gIH1cbn1cblxuREJDU0NvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gREJDU0VuY29kZXI7XG5EQkNTQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBEQkNTRGVjb2RlcjsgLy8gRGVjb2RlciBoZWxwZXJzXG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX2dldERlY29kZVRyaWVOb2RlID0gZnVuY3Rpb24gKGFkZHIpIHtcbiAgdmFyIGJ5dGVzID0gW107XG5cbiAgZm9yICg7IGFkZHIgPiAwOyBhZGRyID4+PSA4KSB7XG4gICAgYnl0ZXMucHVzaChhZGRyICYgMHhGRik7XG4gIH1cblxuICBpZiAoYnl0ZXMubGVuZ3RoID09IDApIGJ5dGVzLnB1c2goMCk7XG4gIHZhciBub2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbMF07XG5cbiAgZm9yICh2YXIgaSA9IGJ5dGVzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAvLyBUcmF2ZXJzZSBub2RlcyBkZWVwZXIgaW50byB0aGUgdHJpZS5cbiAgICB2YXIgdmFsID0gbm9kZVtieXRlc1tpXV07XG5cbiAgICBpZiAodmFsID09IFVOQVNTSUdORUQpIHtcbiAgICAgIC8vIENyZWF0ZSBuZXcgbm9kZS5cbiAgICAgIG5vZGVbYnl0ZXNbaV1dID0gTk9ERV9TVEFSVCAtIHRoaXMuZGVjb2RlVGFibGVzLmxlbmd0aDtcbiAgICAgIHRoaXMuZGVjb2RlVGFibGVzLnB1c2gobm9kZSA9IFVOQVNTSUdORURfTk9ERS5zbGljZSgwKSk7XG4gICAgfSBlbHNlIGlmICh2YWwgPD0gTk9ERV9TVEFSVCkge1xuICAgICAgLy8gRXhpc3Rpbmcgbm9kZS5cbiAgICAgIG5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1tOT0RFX1NUQVJUIC0gdmFsXTtcbiAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKFwiT3ZlcndyaXRlIGJ5dGUgaW4gXCIgKyB0aGlzLmVuY29kaW5nTmFtZSArIFwiLCBhZGRyOiBcIiArIGFkZHIudG9TdHJpbmcoMTYpKTtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufTtcblxuREJDU0NvZGVjLnByb3RvdHlwZS5fYWRkRGVjb2RlQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgLy8gRmlyc3QgZWxlbWVudCBvZiBjaHVuayBpcyB0aGUgaGV4IG1iY3MgY29kZSB3aGVyZSB3ZSBzdGFydC5cbiAgdmFyIGN1ckFkZHIgPSBwYXJzZUludChjaHVua1swXSwgMTYpOyAvLyBDaG9vc2UgdGhlIGRlY29kaW5nIG5vZGUgd2hlcmUgd2UnbGwgd3JpdGUgb3VyIGNoYXJzLlxuXG4gIHZhciB3cml0ZVRhYmxlID0gdGhpcy5fZ2V0RGVjb2RlVHJpZU5vZGUoY3VyQWRkcik7XG5cbiAgY3VyQWRkciA9IGN1ckFkZHIgJiAweEZGOyAvLyBXcml0ZSBhbGwgb3RoZXIgZWxlbWVudHMgb2YgdGhlIGNodW5rIHRvIHRoZSB0YWJsZS5cblxuICBmb3IgKHZhciBrID0gMTsgayA8IGNodW5rLmxlbmd0aDsgaysrKSB7XG4gICAgdmFyIHBhcnQgPSBjaHVua1trXTtcblxuICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gU3RyaW5nLCB3cml0ZSBhcy1pcy5cbiAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgcGFydC5sZW5ndGg7KSB7XG4gICAgICAgIHZhciBjb2RlID0gcGFydC5jaGFyQ29kZUF0KGwrKyk7XG5cbiAgICAgICAgaWYgKDB4RDgwMCA8PSBjb2RlICYmIGNvZGUgPCAweERDMDApIHtcbiAgICAgICAgICAvLyBEZWNvZGUgc3Vycm9nYXRlXG4gICAgICAgICAgdmFyIGNvZGVUcmFpbCA9IHBhcnQuY2hhckNvZGVBdChsKyspO1xuICAgICAgICAgIGlmICgweERDMDAgPD0gY29kZVRyYWlsICYmIGNvZGVUcmFpbCA8IDB4RTAwMCkgd3JpdGVUYWJsZVtjdXJBZGRyKytdID0gMHgxMDAwMCArIChjb2RlIC0gMHhEODAwKSAqIDB4NDAwICsgKGNvZGVUcmFpbCAtIDB4REMwMCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJJbmNvcnJlY3Qgc3Vycm9nYXRlIHBhaXIgaW4gXCIgKyB0aGlzLmVuY29kaW5nTmFtZSArIFwiIGF0IGNodW5rIFwiICsgY2h1bmtbMF0pO1xuICAgICAgICB9IGVsc2UgaWYgKDB4MEZGMCA8IGNvZGUgJiYgY29kZSA8PSAweDBGRkYpIHtcbiAgICAgICAgICAvLyBDaGFyYWN0ZXIgc2VxdWVuY2UgKG91ciBvd24gZW5jb2RpbmcgdXNlZClcbiAgICAgICAgICB2YXIgbGVuID0gMHhGRkYgLSBjb2RlICsgMjtcbiAgICAgICAgICB2YXIgc2VxID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBtID0gMDsgbSA8IGxlbjsgbSsrKSB7XG4gICAgICAgICAgICBzZXEucHVzaChwYXJ0LmNoYXJDb2RlQXQobCsrKSk7XG4gICAgICAgICAgfSAvLyBTaW1wbGUgdmFyaWF0aW9uOiBkb24ndCBzdXBwb3J0IHN1cnJvZ2F0ZXMgb3Igc3Vic2VxdWVuY2VzIGluIHNlcS5cblxuXG4gICAgICAgICAgd3JpdGVUYWJsZVtjdXJBZGRyKytdID0gU0VRX1NUQVJUIC0gdGhpcy5kZWNvZGVUYWJsZVNlcS5sZW5ndGg7XG4gICAgICAgICAgdGhpcy5kZWNvZGVUYWJsZVNlcS5wdXNoKHNlcSk7XG4gICAgICAgIH0gZWxzZSB3cml0ZVRhYmxlW2N1ckFkZHIrK10gPSBjb2RlOyAvLyBCYXNpYyBjaGFyXG5cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJ0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAvLyBJbnRlZ2VyLCBtZWFuaW5nIGluY3JlYXNpbmcgc2VxdWVuY2Ugc3RhcnRpbmcgd2l0aCBwcmV2IGNoYXJhY3Rlci5cbiAgICAgIHZhciBjaGFyQ29kZSA9IHdyaXRlVGFibGVbY3VyQWRkciAtIDFdICsgMTtcblxuICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBwYXJ0OyBsKyspIHtcbiAgICAgICAgd3JpdGVUYWJsZVtjdXJBZGRyKytdID0gY2hhckNvZGUrKztcbiAgICAgIH1cbiAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKFwiSW5jb3JyZWN0IHR5cGUgJ1wiICsgdHlwZW9mIHBhcnQgKyBcIicgZ2l2ZW4gaW4gXCIgKyB0aGlzLmVuY29kaW5nTmFtZSArIFwiIGF0IGNodW5rIFwiICsgY2h1bmtbMF0pO1xuICB9XG5cbiAgaWYgKGN1ckFkZHIgPiAweEZGKSB0aHJvdyBuZXcgRXJyb3IoXCJJbmNvcnJlY3QgY2h1bmsgaW4gXCIgKyB0aGlzLmVuY29kaW5nTmFtZSArIFwiIGF0IGFkZHIgXCIgKyBjaHVua1swXSArIFwiOiB0b28gbG9uZ1wiICsgY3VyQWRkcik7XG59OyAvLyBFbmNvZGVyIGhlbHBlcnNcblxuXG5EQkNTQ29kZWMucHJvdG90eXBlLl9nZXRFbmNvZGVCdWNrZXQgPSBmdW5jdGlvbiAodUNvZGUpIHtcbiAgdmFyIGhpZ2ggPSB1Q29kZSA+PiA4OyAvLyBUaGlzIGNvdWxkIGJlID4gMHhGRiBiZWNhdXNlIG9mIGFzdHJhbCBjaGFyYWN0ZXJzLlxuXG4gIGlmICh0aGlzLmVuY29kZVRhYmxlW2hpZ2hdID09PSB1bmRlZmluZWQpIHRoaXMuZW5jb2RlVGFibGVbaGlnaF0gPSBVTkFTU0lHTkVEX05PREUuc2xpY2UoMCk7IC8vIENyZWF0ZSBidWNrZXQgb24gZGVtYW5kLlxuXG4gIHJldHVybiB0aGlzLmVuY29kZVRhYmxlW2hpZ2hdO1xufTtcblxuREJDU0NvZGVjLnByb3RvdHlwZS5fc2V0RW5jb2RlQ2hhciA9IGZ1bmN0aW9uICh1Q29kZSwgZGJjc0NvZGUpIHtcbiAgdmFyIGJ1Y2tldCA9IHRoaXMuX2dldEVuY29kZUJ1Y2tldCh1Q29kZSk7XG5cbiAgdmFyIGxvdyA9IHVDb2RlICYgMHhGRjtcbiAgaWYgKGJ1Y2tldFtsb3ddIDw9IFNFUV9TVEFSVCkgdGhpcy5lbmNvZGVUYWJsZVNlcVtTRVFfU1RBUlQgLSBidWNrZXRbbG93XV1bREVGX0NIQVJdID0gZGJjc0NvZGU7IC8vIFRoZXJlJ3MgYWxyZWFkeSBhIHNlcXVlbmNlLCBzZXQgYSBzaW5nbGUtY2hhciBzdWJzZXF1ZW5jZSBvZiBpdC5cbiAgZWxzZSBpZiAoYnVja2V0W2xvd10gPT0gVU5BU1NJR05FRCkgYnVja2V0W2xvd10gPSBkYmNzQ29kZTtcbn07XG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX3NldEVuY29kZVNlcXVlbmNlID0gZnVuY3Rpb24gKHNlcSwgZGJjc0NvZGUpIHtcbiAgLy8gR2V0IHRoZSByb290IG9mIGNoYXJhY3RlciB0cmVlIGFjY29yZGluZyB0byBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHNlcXVlbmNlLlxuICB2YXIgdUNvZGUgPSBzZXFbMF07XG5cbiAgdmFyIGJ1Y2tldCA9IHRoaXMuX2dldEVuY29kZUJ1Y2tldCh1Q29kZSk7XG5cbiAgdmFyIGxvdyA9IHVDb2RlICYgMHhGRjtcbiAgdmFyIG5vZGU7XG5cbiAgaWYgKGJ1Y2tldFtsb3ddIDw9IFNFUV9TVEFSVCkge1xuICAgIC8vIFRoZXJlJ3MgYWxyZWFkeSBhIHNlcXVlbmNlIHdpdGggIC0gdXNlIGl0LlxuICAgIG5vZGUgPSB0aGlzLmVuY29kZVRhYmxlU2VxW1NFUV9TVEFSVCAtIGJ1Y2tldFtsb3ddXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSB3YXMgbm8gc2VxdWVuY2Ugb2JqZWN0IC0gYWxsb2NhdGUgYSBuZXcgb25lLlxuICAgIG5vZGUgPSB7fTtcbiAgICBpZiAoYnVja2V0W2xvd10gIT09IFVOQVNTSUdORUQpIG5vZGVbREVGX0NIQVJdID0gYnVja2V0W2xvd107IC8vIElmIGEgY2hhciB3YXMgc2V0IGJlZm9yZSAtIG1ha2UgaXQgYSBzaW5nbGUtY2hhciBzdWJzZXF1ZW5jZS5cblxuICAgIGJ1Y2tldFtsb3ddID0gU0VRX1NUQVJUIC0gdGhpcy5lbmNvZGVUYWJsZVNlcS5sZW5ndGg7XG4gICAgdGhpcy5lbmNvZGVUYWJsZVNlcS5wdXNoKG5vZGUpO1xuICB9IC8vIFRyYXZlcnNlIHRoZSBjaGFyYWN0ZXIgdHJlZSwgYWxsb2NhdGluZyBuZXcgbm9kZXMgYXMgbmVlZGVkLlxuXG5cbiAgZm9yICh2YXIgaiA9IDE7IGogPCBzZXEubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgdmFyIG9sZFZhbCA9IG5vZGVbdUNvZGVdO1xuICAgIGlmICh0eXBlb2Ygb2xkVmFsID09PSAnb2JqZWN0Jykgbm9kZSA9IG9sZFZhbDtlbHNlIHtcbiAgICAgIG5vZGUgPSBub2RlW3VDb2RlXSA9IHt9O1xuICAgICAgaWYgKG9sZFZhbCAhPT0gdW5kZWZpbmVkKSBub2RlW0RFRl9DSEFSXSA9IG9sZFZhbDtcbiAgICB9XG4gIH0gLy8gU2V0IHRoZSBsZWFmIHRvIGdpdmVuIGRiY3NDb2RlLlxuXG5cbiAgdUNvZGUgPSBzZXFbc2VxLmxlbmd0aCAtIDFdO1xuICBub2RlW3VDb2RlXSA9IGRiY3NDb2RlO1xufTtcblxuREJDU0NvZGVjLnByb3RvdHlwZS5fZmlsbEVuY29kZVRhYmxlID0gZnVuY3Rpb24gKG5vZGVJZHgsIHByZWZpeCwgc2tpcEVuY29kZUNoYXJzKSB7XG4gIHZhciBub2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbbm9kZUlkeF07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAweDEwMDsgaSsrKSB7XG4gICAgdmFyIHVDb2RlID0gbm9kZVtpXTtcbiAgICB2YXIgbWJDb2RlID0gcHJlZml4ICsgaTtcbiAgICBpZiAoc2tpcEVuY29kZUNoYXJzW21iQ29kZV0pIGNvbnRpbnVlO1xuICAgIGlmICh1Q29kZSA+PSAwKSB0aGlzLl9zZXRFbmNvZGVDaGFyKHVDb2RlLCBtYkNvZGUpO2Vsc2UgaWYgKHVDb2RlIDw9IE5PREVfU1RBUlQpIHRoaXMuX2ZpbGxFbmNvZGVUYWJsZShOT0RFX1NUQVJUIC0gdUNvZGUsIG1iQ29kZSA8PCA4LCBza2lwRW5jb2RlQ2hhcnMpO2Vsc2UgaWYgKHVDb2RlIDw9IFNFUV9TVEFSVCkgdGhpcy5fc2V0RW5jb2RlU2VxdWVuY2UodGhpcy5kZWNvZGVUYWJsZVNlcVtTRVFfU1RBUlQgLSB1Q29kZV0sIG1iQ29kZSk7XG4gIH1cbn07IC8vID09IEVuY29kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuZnVuY3Rpb24gREJDU0VuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgLy8gRW5jb2RlciBzdGF0ZVxuICB0aGlzLmxlYWRTdXJyb2dhdGUgPSAtMTtcbiAgdGhpcy5zZXFPYmogPSB1bmRlZmluZWQ7IC8vIFN0YXRpYyBkYXRhXG5cbiAgdGhpcy5lbmNvZGVUYWJsZSA9IGNvZGVjLmVuY29kZVRhYmxlO1xuICB0aGlzLmVuY29kZVRhYmxlU2VxID0gY29kZWMuZW5jb2RlVGFibGVTZXE7XG4gIHRoaXMuZGVmYXVsdENoYXJTaW5nbGVCeXRlID0gY29kZWMuZGVmQ2hhclNCO1xuICB0aGlzLmdiMTgwMzAgPSBjb2RlYy5nYjE4MDMwO1xufVxuXG5EQkNTRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBuZXdCdWYgPSBCdWZmZXIkNS5hbGxvYyhzdHIubGVuZ3RoICogKHRoaXMuZ2IxODAzMCA/IDQgOiAzKSksXG4gICAgICBsZWFkU3Vycm9nYXRlID0gdGhpcy5sZWFkU3Vycm9nYXRlLFxuICAgICAgc2VxT2JqID0gdGhpcy5zZXFPYmosXG4gICAgICBuZXh0Q2hhciA9IC0xLFxuICAgICAgaSA9IDAsXG4gICAgICBqID0gMDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIDAuIEdldCBuZXh0IGNoYXJhY3Rlci5cbiAgICBpZiAobmV4dENoYXIgPT09IC0xKSB7XG4gICAgICBpZiAoaSA9PSBzdHIubGVuZ3RoKSBicmVhaztcbiAgICAgIHZhciB1Q29kZSA9IHN0ci5jaGFyQ29kZUF0KGkrKyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1Q29kZSA9IG5leHRDaGFyO1xuICAgICAgbmV4dENoYXIgPSAtMTtcbiAgICB9IC8vIDEuIEhhbmRsZSBzdXJyb2dhdGVzLlxuXG5cbiAgICBpZiAoMHhEODAwIDw9IHVDb2RlICYmIHVDb2RlIDwgMHhFMDAwKSB7XG4gICAgICAvLyBDaGFyIGlzIG9uZSBvZiBzdXJyb2dhdGVzLlxuICAgICAgaWYgKHVDb2RlIDwgMHhEQzAwKSB7XG4gICAgICAgIC8vIFdlJ3ZlIGdvdCBsZWFkIHN1cnJvZ2F0ZS5cbiAgICAgICAgaWYgKGxlYWRTdXJyb2dhdGUgPT09IC0xKSB7XG4gICAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IHVDb2RlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSB1Q29kZTsgLy8gRG91YmxlIGxlYWQgc3Vycm9nYXRlIGZvdW5kLlxuXG4gICAgICAgICAgdUNvZGUgPSBVTkFTU0lHTkVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSd2ZSBnb3QgdHJhaWwgc3Vycm9nYXRlLlxuICAgICAgICBpZiAobGVhZFN1cnJvZ2F0ZSAhPT0gLTEpIHtcbiAgICAgICAgICB1Q29kZSA9IDB4MTAwMDAgKyAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCkgKiAweDQwMCArICh1Q29kZSAtIDB4REMwMCk7XG4gICAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEluY29tcGxldGUgc3Vycm9nYXRlIHBhaXIgLSBvbmx5IHRyYWlsIHN1cnJvZ2F0ZSBmb3VuZC5cbiAgICAgICAgICB1Q29kZSA9IFVOQVNTSUdORUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUgIT09IC0xKSB7XG4gICAgICAvLyBJbmNvbXBsZXRlIHN1cnJvZ2F0ZSBwYWlyIC0gb25seSBsZWFkIHN1cnJvZ2F0ZSBmb3VuZC5cbiAgICAgIG5leHRDaGFyID0gdUNvZGU7XG4gICAgICB1Q29kZSA9IFVOQVNTSUdORUQ7IC8vIFdyaXRlIGFuIGVycm9yLCB0aGVuIGN1cnJlbnQgY2hhci5cblxuICAgICAgbGVhZFN1cnJvZ2F0ZSA9IC0xO1xuICAgIH0gLy8gMi4gQ29udmVydCB1Q29kZSBjaGFyYWN0ZXIuXG5cblxuICAgIHZhciBkYmNzQ29kZSA9IFVOQVNTSUdORUQ7XG5cbiAgICBpZiAoc2VxT2JqICE9PSB1bmRlZmluZWQgJiYgdUNvZGUgIT0gVU5BU1NJR05FRCkge1xuICAgICAgLy8gV2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHNlcXVlbmNlXG4gICAgICB2YXIgcmVzQ29kZSA9IHNlcU9ialt1Q29kZV07XG5cbiAgICAgIGlmICh0eXBlb2YgcmVzQ29kZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gU2VxdWVuY2UgY29udGludWVzLlxuICAgICAgICBzZXFPYmogPSByZXNDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlc0NvZGUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gU2VxdWVuY2UgZmluaXNoZWQuIFdyaXRlIGl0LlxuICAgICAgICBkYmNzQ29kZSA9IHJlc0NvZGU7XG4gICAgICB9IGVsc2UgaWYgKHJlc0NvZGUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEN1cnJlbnQgY2hhcmFjdGVyIGlzIG5vdCBwYXJ0IG9mIHRoZSBzZXF1ZW5jZS5cbiAgICAgICAgLy8gVHJ5IGRlZmF1bHQgY2hhcmFjdGVyIGZvciB0aGlzIHNlcXVlbmNlXG4gICAgICAgIHJlc0NvZGUgPSBzZXFPYmpbREVGX0NIQVJdO1xuXG4gICAgICAgIGlmIChyZXNDb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkYmNzQ29kZSA9IHJlc0NvZGU7IC8vIEZvdW5kLiBXcml0ZSBpdC5cblxuICAgICAgICAgIG5leHRDaGFyID0gdUNvZGU7IC8vIEN1cnJlbnQgY2hhcmFjdGVyIHdpbGwgYmUgd3JpdHRlbiB0b28gaW4gdGhlIG5leHQgaXRlcmF0aW9uLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNlcU9iaiA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHVDb2RlID49IDApIHtcbiAgICAgIC8vIFJlZ3VsYXIgY2hhcmFjdGVyXG4gICAgICB2YXIgc3VidGFibGUgPSB0aGlzLmVuY29kZVRhYmxlW3VDb2RlID4+IDhdO1xuICAgICAgaWYgKHN1YnRhYmxlICE9PSB1bmRlZmluZWQpIGRiY3NDb2RlID0gc3VidGFibGVbdUNvZGUgJiAweEZGXTtcblxuICAgICAgaWYgKGRiY3NDb2RlIDw9IFNFUV9TVEFSVCkge1xuICAgICAgICAvLyBTZXF1ZW5jZSBzdGFydFxuICAgICAgICBzZXFPYmogPSB0aGlzLmVuY29kZVRhYmxlU2VxW1NFUV9TVEFSVCAtIGRiY3NDb2RlXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYmNzQ29kZSA9PSBVTkFTU0lHTkVEICYmIHRoaXMuZ2IxODAzMCkge1xuICAgICAgICAvLyBVc2UgR0IxODAzMCBhbGdvcml0aG0gdG8gZmluZCBjaGFyYWN0ZXIocykgdG8gd3JpdGUuXG4gICAgICAgIHZhciBpZHggPSBmaW5kSWR4KHRoaXMuZ2IxODAzMC51Q2hhcnMsIHVDb2RlKTtcblxuICAgICAgICBpZiAoaWR4ICE9IC0xKSB7XG4gICAgICAgICAgdmFyIGRiY3NDb2RlID0gdGhpcy5nYjE4MDMwLmdiQ2hhcnNbaWR4XSArICh1Q29kZSAtIHRoaXMuZ2IxODAzMC51Q2hhcnNbaWR4XSk7XG4gICAgICAgICAgbmV3QnVmW2orK10gPSAweDgxICsgTWF0aC5mbG9vcihkYmNzQ29kZSAvIDEyNjAwKTtcbiAgICAgICAgICBkYmNzQ29kZSA9IGRiY3NDb2RlICUgMTI2MDA7XG4gICAgICAgICAgbmV3QnVmW2orK10gPSAweDMwICsgTWF0aC5mbG9vcihkYmNzQ29kZSAvIDEyNjApO1xuICAgICAgICAgIGRiY3NDb2RlID0gZGJjc0NvZGUgJSAxMjYwO1xuICAgICAgICAgIG5ld0J1ZltqKytdID0gMHg4MSArIE1hdGguZmxvb3IoZGJjc0NvZGUgLyAxMCk7XG4gICAgICAgICAgZGJjc0NvZGUgPSBkYmNzQ29kZSAlIDEwO1xuICAgICAgICAgIG5ld0J1ZltqKytdID0gMHgzMCArIGRiY3NDb2RlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyAzLiBXcml0ZSBkYmNzQ29kZSBjaGFyYWN0ZXIuXG5cblxuICAgIGlmIChkYmNzQ29kZSA9PT0gVU5BU1NJR05FRCkgZGJjc0NvZGUgPSB0aGlzLmRlZmF1bHRDaGFyU2luZ2xlQnl0ZTtcblxuICAgIGlmIChkYmNzQ29kZSA8IDB4MTAwKSB7XG4gICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlO1xuICAgIH0gZWxzZSBpZiAoZGJjc0NvZGUgPCAweDEwMDAwKSB7XG4gICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlID4+IDg7IC8vIGhpZ2ggYnl0ZVxuXG4gICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlICYgMHhGRjsgLy8gbG93IGJ5dGVcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZSA+PiAxNjtcbiAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGUgPj4gOCAmIDB4RkY7XG4gICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlICYgMHhGRjtcbiAgICB9XG4gIH1cblxuICB0aGlzLnNlcU9iaiA9IHNlcU9iajtcbiAgdGhpcy5sZWFkU3Vycm9nYXRlID0gbGVhZFN1cnJvZ2F0ZTtcbiAgcmV0dXJuIG5ld0J1Zi5zbGljZSgwLCBqKTtcbn07XG5cbkRCQ1NFbmNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmxlYWRTdXJyb2dhdGUgPT09IC0xICYmIHRoaXMuc2VxT2JqID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gQWxsIGNsZWFuLiBNb3N0IG9mdGVuIGNhc2UuXG5cbiAgdmFyIG5ld0J1ZiA9IEJ1ZmZlciQ1LmFsbG9jKDEwKSxcbiAgICAgIGogPSAwO1xuXG4gIGlmICh0aGlzLnNlcU9iaikge1xuICAgIC8vIFdlJ3JlIGluIHRoZSBzZXF1ZW5jZS5cbiAgICB2YXIgZGJjc0NvZGUgPSB0aGlzLnNlcU9ialtERUZfQ0hBUl07XG5cbiAgICBpZiAoZGJjc0NvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gV3JpdGUgYmVnaW5uaW5nIG9mIHRoZSBzZXF1ZW5jZS5cbiAgICAgIGlmIChkYmNzQ29kZSA8IDB4MTAwKSB7XG4gICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlID4+IDg7IC8vIGhpZ2ggYnl0ZVxuXG4gICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGUgJiAweEZGOyAvLyBsb3cgYnl0ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VxT2JqID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHRoaXMubGVhZFN1cnJvZ2F0ZSAhPT0gLTEpIHtcbiAgICAvLyBJbmNvbXBsZXRlIHN1cnJvZ2F0ZSBwYWlyIC0gb25seSBsZWFkIHN1cnJvZ2F0ZSBmb3VuZC5cbiAgICBuZXdCdWZbaisrXSA9IHRoaXMuZGVmYXVsdENoYXJTaW5nbGVCeXRlO1xuICAgIHRoaXMubGVhZFN1cnJvZ2F0ZSA9IC0xO1xuICB9XG5cbiAgcmV0dXJuIG5ld0J1Zi5zbGljZSgwLCBqKTtcbn07IC8vIEV4cG9ydCBmb3IgdGVzdGluZ1xuXG5cbkRCQ1NFbmNvZGVyLnByb3RvdHlwZS5maW5kSWR4ID0gZmluZElkeDsgLy8gPT0gRGVjb2RlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gREJDU0RlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgLy8gRGVjb2RlciBzdGF0ZVxuICB0aGlzLm5vZGVJZHggPSAwO1xuICB0aGlzLnByZXZCdWYgPSBCdWZmZXIkNS5hbGxvYygwKTsgLy8gU3RhdGljIGRhdGFcblxuICB0aGlzLmRlY29kZVRhYmxlcyA9IGNvZGVjLmRlY29kZVRhYmxlcztcbiAgdGhpcy5kZWNvZGVUYWJsZVNlcSA9IGNvZGVjLmRlY29kZVRhYmxlU2VxO1xuICB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZSA9IGNvZGVjLmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgdGhpcy5nYjE4MDMwID0gY29kZWMuZ2IxODAzMDtcbn1cblxuREJDU0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGJ1Zikge1xuICB2YXIgbmV3QnVmID0gQnVmZmVyJDUuYWxsb2MoYnVmLmxlbmd0aCAqIDIpLFxuICAgICAgbm9kZUlkeCA9IHRoaXMubm9kZUlkeCxcbiAgICAgIHByZXZCdWYgPSB0aGlzLnByZXZCdWYsXG4gICAgICBwcmV2QnVmT2Zmc2V0ID0gdGhpcy5wcmV2QnVmLmxlbmd0aCxcbiAgICAgIHNlcVN0YXJ0ID0gLXRoaXMucHJldkJ1Zi5sZW5ndGgsXG4gICAgICAvLyBpZHggb2YgdGhlIHN0YXJ0IG9mIGN1cnJlbnQgcGFyc2VkIHNlcXVlbmNlLlxuICB1Q29kZTtcbiAgaWYgKHByZXZCdWZPZmZzZXQgPiAwKSAvLyBNYWtlIHByZXYgYnVmIG92ZXJsYXAgYSBsaXR0bGUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gc2xpY2UgbGF0ZXIuXG4gICAgcHJldkJ1ZiA9IEJ1ZmZlciQ1LmNvbmNhdChbcHJldkJ1ZiwgYnVmLnNsaWNlKDAsIDEwKV0pO1xuXG4gIGZvciAodmFyIGkgPSAwLCBqID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjdXJCeXRlID0gaSA+PSAwID8gYnVmW2ldIDogcHJldkJ1ZltpICsgcHJldkJ1Zk9mZnNldF07IC8vIExvb2t1cCBpbiBjdXJyZW50IHRyaWUgbm9kZS5cblxuICAgIHZhciB1Q29kZSA9IHRoaXMuZGVjb2RlVGFibGVzW25vZGVJZHhdW2N1ckJ5dGVdO1xuXG4gICAgaWYgKHVDb2RlID49IDApIDsgZWxzZSBpZiAodUNvZGUgPT09IFVOQVNTSUdORUQpIHtcbiAgICAgIC8vIFVua25vd24gY2hhci5cbiAgICAgIC8vIFRPRE86IENhbGxiYWNrIHdpdGggc2VxLlxuICAgICAgLy92YXIgY3VyU2VxID0gKHNlcVN0YXJ0ID49IDApID8gYnVmLnNsaWNlKHNlcVN0YXJ0LCBpKzEpIDogcHJldkJ1Zi5zbGljZShzZXFTdGFydCArIHByZXZCdWZPZmZzZXQsIGkrMSArIHByZXZCdWZPZmZzZXQpO1xuICAgICAgaSA9IHNlcVN0YXJ0OyAvLyBUcnkgdG8gcGFyc2UgYWdhaW4sIGFmdGVyIHNraXBwaW5nIGZpcnN0IGJ5dGUgb2YgdGhlIHNlcXVlbmNlICgnaScgd2lsbCBiZSBpbmNyZW1lbnRlZCBieSAnZm9yJyBjeWNsZSkuXG5cbiAgICAgIHVDb2RlID0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUuY2hhckNvZGVBdCgwKTtcbiAgICB9IGVsc2UgaWYgKHVDb2RlID09PSBHQjE4MDMwX0NPREUpIHtcbiAgICAgIHZhciBjdXJTZXEgPSBzZXFTdGFydCA+PSAwID8gYnVmLnNsaWNlKHNlcVN0YXJ0LCBpICsgMSkgOiBwcmV2QnVmLnNsaWNlKHNlcVN0YXJ0ICsgcHJldkJ1Zk9mZnNldCwgaSArIDEgKyBwcmV2QnVmT2Zmc2V0KTtcbiAgICAgIHZhciBwdHIgPSAoY3VyU2VxWzBdIC0gMHg4MSkgKiAxMjYwMCArIChjdXJTZXFbMV0gLSAweDMwKSAqIDEyNjAgKyAoY3VyU2VxWzJdIC0gMHg4MSkgKiAxMCArIChjdXJTZXFbM10gLSAweDMwKTtcbiAgICAgIHZhciBpZHggPSBmaW5kSWR4KHRoaXMuZ2IxODAzMC5nYkNoYXJzLCBwdHIpO1xuICAgICAgdUNvZGUgPSB0aGlzLmdiMTgwMzAudUNoYXJzW2lkeF0gKyBwdHIgLSB0aGlzLmdiMTgwMzAuZ2JDaGFyc1tpZHhdO1xuICAgIH0gZWxzZSBpZiAodUNvZGUgPD0gTk9ERV9TVEFSVCkge1xuICAgICAgLy8gR28gdG8gbmV4dCB0cmllIG5vZGUuXG4gICAgICBub2RlSWR4ID0gTk9ERV9TVEFSVCAtIHVDb2RlO1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmICh1Q29kZSA8PSBTRVFfU1RBUlQpIHtcbiAgICAgIC8vIE91dHB1dCBhIHNlcXVlbmNlIG9mIGNoYXJzLlxuICAgICAgdmFyIHNlcSA9IHRoaXMuZGVjb2RlVGFibGVTZXFbU0VRX1NUQVJUIC0gdUNvZGVdO1xuXG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHNlcS5sZW5ndGggLSAxOyBrKyspIHtcbiAgICAgICAgdUNvZGUgPSBzZXFba107XG4gICAgICAgIG5ld0J1ZltqKytdID0gdUNvZGUgJiAweEZGO1xuICAgICAgICBuZXdCdWZbaisrXSA9IHVDb2RlID4+IDg7XG4gICAgICB9XG5cbiAgICAgIHVDb2RlID0gc2VxW3NlcS5sZW5ndGggLSAxXTtcbiAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKFwiaWNvbnYtbGl0ZSBpbnRlcm5hbCBlcnJvcjogaW52YWxpZCBkZWNvZGluZyB0YWJsZSB2YWx1ZSBcIiArIHVDb2RlICsgXCIgYXQgXCIgKyBub2RlSWR4ICsgXCIvXCIgKyBjdXJCeXRlKTsgLy8gV3JpdGUgdGhlIGNoYXJhY3RlciB0byBidWZmZXIsIGhhbmRsaW5nIGhpZ2hlciBwbGFuZXMgdXNpbmcgc3Vycm9nYXRlIHBhaXIuXG5cblxuICAgIGlmICh1Q29kZSA+IDB4RkZGRikge1xuICAgICAgdUNvZGUgLT0gMHgxMDAwMDtcbiAgICAgIHZhciB1Q29kZUxlYWQgPSAweEQ4MDAgKyBNYXRoLmZsb29yKHVDb2RlIC8gMHg0MDApO1xuICAgICAgbmV3QnVmW2orK10gPSB1Q29kZUxlYWQgJiAweEZGO1xuICAgICAgbmV3QnVmW2orK10gPSB1Q29kZUxlYWQgPj4gODtcbiAgICAgIHVDb2RlID0gMHhEQzAwICsgdUNvZGUgJSAweDQwMDtcbiAgICB9XG5cbiAgICBuZXdCdWZbaisrXSA9IHVDb2RlICYgMHhGRjtcbiAgICBuZXdCdWZbaisrXSA9IHVDb2RlID4+IDg7IC8vIFJlc2V0IHRyaWUgbm9kZS5cblxuICAgIG5vZGVJZHggPSAwO1xuICAgIHNlcVN0YXJ0ID0gaSArIDE7XG4gIH1cblxuICB0aGlzLm5vZGVJZHggPSBub2RlSWR4O1xuICB0aGlzLnByZXZCdWYgPSBzZXFTdGFydCA+PSAwID8gYnVmLnNsaWNlKHNlcVN0YXJ0KSA6IHByZXZCdWYuc2xpY2Uoc2VxU3RhcnQgKyBwcmV2QnVmT2Zmc2V0KTtcbiAgcmV0dXJuIG5ld0J1Zi5zbGljZSgwLCBqKS50b1N0cmluZygndWNzMicpO1xufTtcblxuREJDU0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJldCA9ICcnOyAvLyBUcnkgdG8gcGFyc2UgYWxsIHJlbWFpbmluZyBjaGFycy5cblxuICB3aGlsZSAodGhpcy5wcmV2QnVmLmxlbmd0aCA+IDApIHtcbiAgICAvLyBTa2lwIDEgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIuXG4gICAgcmV0ICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgIHZhciBidWYgPSB0aGlzLnByZXZCdWYuc2xpY2UoMSk7IC8vIFBhcnNlIHJlbWFpbmluZyBhcyB1c3VhbC5cblxuICAgIHRoaXMucHJldkJ1ZiA9IEJ1ZmZlciQ1LmFsbG9jKDApO1xuICAgIHRoaXMubm9kZUlkeCA9IDA7XG4gICAgaWYgKGJ1Zi5sZW5ndGggPiAwKSByZXQgKz0gdGhpcy53cml0ZShidWYpO1xuICB9XG5cbiAgdGhpcy5ub2RlSWR4ID0gMDtcbiAgcmV0dXJuIHJldDtcbn07IC8vIEJpbmFyeSBzZWFyY2ggZm9yIEdCMTgwMzAuIFJldHVybnMgbGFyZ2VzdCBpIHN1Y2ggdGhhdCB0YWJsZVtpXSA8PSB2YWwuXG5cblxuZnVuY3Rpb24gZmluZElkeCh0YWJsZSwgdmFsKSB7XG4gIGlmICh0YWJsZVswXSA+IHZhbCkgcmV0dXJuIC0xO1xuICB2YXIgbCA9IDAsXG4gICAgICByID0gdGFibGUubGVuZ3RoO1xuXG4gIHdoaWxlIChsIDwgciAtIDEpIHtcbiAgICAvLyBhbHdheXMgdGFibGVbbF0gPD0gdmFsIDwgdGFibGVbcl1cbiAgICB2YXIgbWlkID0gbCArIE1hdGguZmxvb3IoKHIgLSBsICsgMSkgLyAyKTtcbiAgICBpZiAodGFibGVbbWlkXSA8PSB2YWwpIGwgPSBtaWQ7ZWxzZSByID0gbWlkO1xuICB9XG5cbiAgcmV0dXJuIGw7XG59XG5cbnZhciBkYmNzQ29kZWMgPSB7XG4gIF9kYmNzOiBfZGJjc1xufTtcblxudmFyIHNoaWZ0amlzID0gW1xuXHRbXG5cdFx0XCIwXCIsXG5cdFx0XCJcXHUwMDAwXCIsXG5cdFx0MTI4XG5cdF0sXG5cdFtcblx0XHRcImExXCIsXG5cdFx0XCLvvaFcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCI4MTQwXCIsXG5cdFx0XCLjgIDjgIHjgILvvIzvvI7jg7vvvJrvvJvvvJ/vvIHjgpvjgpzCtO+9gMKo77y+77+j77y/44O944O+44Kd44Ke44CD5Lud44CF44CG44CH44O84oCV4oCQ77yP77y8772e4oil772c4oCm4oCl4oCY4oCZ4oCc4oCd77yI77yJ44CU44CV77y777y9772b772d44CIXCIsXG5cdFx0OSxcblx0XHRcIu+8i++8jcKxw5dcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MTgwXCIsXG5cdFx0XCLDt++8neKJoO+8nO+8nuKJpuKJp+KInuKItOKZguKZgMKw4oCy4oCz4oSD77+l77yE77+g77+h77yF77yD77yG77yK77ygwqfimIbimIXil4vil4/il47il4fil4bilqHilqDilrPilrLilr3ilrzigLvjgJLihpLihpDihpHihpPjgJNcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MWI4XCIsXG5cdFx0XCLiiIjiiIviiobiiofiioLiioPiiKriiKlcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MWM4XCIsXG5cdFx0XCLiiKfiiKjvv6Lih5Lih5TiiIDiiINcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MWRhXCIsXG5cdFx0XCLiiKDiiqXijJLiiILiiIfiiaHiiZLiiariiaviiJriiL3iiJ3iiLXiiKviiKxcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MWYwXCIsXG5cdFx0XCLihKvigLDima/ima3imarigKDigKHCtlwiXG5cdF0sXG5cdFtcblx0XHRcIjgxZmNcIixcblx0XHRcIuKXr1wiXG5cdF0sXG5cdFtcblx0XHRcIjgyNGZcIixcblx0XHRcIu+8kFwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiODI2MFwiLFxuXHRcdFwi77yhXCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiODI4MVwiLFxuXHRcdFwi772BXCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiODI5ZlwiLFxuXHRcdFwi44GBXCIsXG5cdFx0ODJcblx0XSxcblx0W1xuXHRcdFwiODM0MFwiLFxuXHRcdFwi44KhXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiODM4MFwiLFxuXHRcdFwi44OgXCIsXG5cdFx0MjJcblx0XSxcblx0W1xuXHRcdFwiODM5ZlwiLFxuXHRcdFwizpFcIixcblx0XHQxNixcblx0XHRcIs6jXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCI4M2JmXCIsXG5cdFx0XCLOsVwiLFxuXHRcdDE2LFxuXHRcdFwiz4NcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcIjg0NDBcIixcblx0XHRcItCQXCIsXG5cdFx0NSxcblx0XHRcItCB0JZcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCI4NDcwXCIsXG5cdFx0XCLQsFwiLFxuXHRcdDUsXG5cdFx0XCLRkdC2XCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCI4NDgwXCIsXG5cdFx0XCLQvlwiLFxuXHRcdDE3XG5cdF0sXG5cdFtcblx0XHRcIjg0OWZcIixcblx0XHRcIuKUgOKUguKUjOKUkOKUmOKUlOKUnOKUrOKUpOKUtOKUvOKUgeKUg+KUj+KUk+KUm+KUl+KUo+KUs+KUq+KUu+KVi+KUoOKUr+KUqOKUt+KUv+KUneKUsOKUpeKUuOKVglwiXG5cdF0sXG5cdFtcblx0XHRcIjg3NDBcIixcblx0XHRcIuKRoFwiLFxuXHRcdDE5LFxuXHRcdFwi4oWgXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCI4NzVmXCIsXG5cdFx0XCLjjYnjjJTjjKLjjY3jjJjjjKfjjIPjjLbjjZHjjZfjjI3jjKbjjKPjjKvjjYrjjLvjjpzjjp3jjp7jjo7jjo/jj4TjjqFcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NzdlXCIsXG5cdFx0XCLjjbtcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NzgwXCIsXG5cdFx0XCLjgJ3jgJ/ihJbjj43ihKHjiqRcIixcblx0XHQ0LFxuXHRcdFwi44ix44iy44i5442+442944284omS4omh4oir4oiu4oiR4oia4oql4oig4oif4oq/4oi14oip4oiqXCJcblx0XSxcblx0W1xuXHRcdFwiODg5ZlwiLFxuXHRcdFwi5Lqc5ZSW5aiD6Zi/5ZOA5oSb5oyo5ae26YCi6JG16Iyc56mQ5oKq5o+h5ril5pet6JGm6Iqm6a+15qKT5Zyn5pah5omx5a6b5aeQ6Jm76aO057Wi57a+6a6O5oiW57Kf6KK35a6J5bq15oyJ5pqX5qGI6ZeH6Z6N5p2P5Lul5LyK5L2N5L6d5YGJ5Zuy5aS35aeU5aiB5bCJ5oOf5oSP5oWw5piT5qSF54K655WP55Ww56e757at57ev6IOD6JCO6KGj6KyC6YGV6YG65Yy75LqV5Lql5Z+f6IKy6YOB56Ov5LiA5aOx5rqi6YC456iy6Iyo6IqL6bCv5YWB5Y2w5ZK95ZOh5Zug5ae75byV6aOy5rer6IOk6JStXCJcblx0XSxcblx0W1xuXHRcdFwiODk0MFwiLFxuXHRcdFwi6Zmi6Zmw6Zqg6Z+75ZCL5Y+z5a6H54OP57696L+C6Zuo5Y2v6bWc56q65LiR56KT6Ie85rim5ZiY5ZSE5qyd6JSa6bC75ael5Y6p5rWm55Oc6ZaP5ZmC5LqR6YGL6Zuy6I2P6aSM5Y+h5Za25ayw5b2x5pig5puz5qCE5rC45rOz5rSp55Gb55uI56mO6aC06Iux6KGb6Kmg6Yut5ray55ar55uK6aeF5oKm6KyB6LaK6Zay5qaO5Y6t5YaGXCJcblx0XSxcblx0W1xuXHRcdFwiODk4MFwiLFxuXHRcdFwi5ZyS5aCw5aWE5a605bu25oCo5o6p5o+05rK/5ryU54KO54SU54WZ54eV54y/57iB6Im26IuR6JaX6YGg6Ymb6bSb5aGp5pa85rGa55Sl5Ye55aSu5aWl5b6A5b+c5oq85pe65qiq5qyn5q60546L57+B6KWW6bSs6bSO6buE5bKh5rKW6I275YSE5bGL5oa26IeG5qG254mh5LmZ5L+65Y245oGp5rip56mP6Z+z5LiL5YyW5Luu5L2V5Ly95L6h5L2z5Yqg5Y+v5ZiJ5aSP5auB5a625a+h56eR5pqH5p6c5p625q2M5rKz54Gr54+C56aN56a+56i8566H6Iqx6Iub6IyE6I236I+v6I+T6J2m6Kqy5Zip6LKo6L+m6YGO6Zye6JqK5L+E5bOo5oiR54mZ55S76Iel6Iq96Ju+6LOA6ZuF6aST6aeV5LuL5Lya6Kej5Zue5aGK5aOK5bu75b+r5oCq5oKU5oGi5oeQ5oiS5ouQ5pS5XCJcblx0XSxcblx0W1xuXHRcdFwiOGE0MFwiLFxuXHRcdFwi6a2B5pmm5qKw5rW354Gw55WM55qG57W16Iql6J+56ZaL6ZqO6LKd5Yex5Yq+5aSW5ZKz5a6z5bSW5oWo5qaC5rav56KN6JOL6KGX6Kmy6Y6n6aq45rWs6aao6JuZ5Z6j5p+/6JuO6YiO5YqD5ZqH5ZCE5buT5ouh5pK55qC85qC45q67542y56K656mr6Kaa6KeS6LWr6LyD6YOt6Zaj6ZqU6Z2p5a2m5bKz5qW96aGN6aGO5o6b56yg5qirXCJcblx0XSxcblx0W1xuXHRcdFwiOGE4MFwiLFxuXHRcdFwi5qm/5qK26bCN5r2f5Ymy5Zad5oGw5ous5rS75riH5ruR6JGb6KSQ6L2E5LiU6bC55Y+25qSb5qi66Z6E5qCq5YWc56uD6JKy6Yec6Y6M5Zmb6bSo5qCi6IyF6JCx57Kl5YiI6IuF55Om5Lm+5L6D5Yag5a+S5YiK5YuY5Yun5be75Zaa5aCq5aem5a6M5a6Y5a+b5bmy5bm55oKj5oSf5oWj5oa+5o+b5pWi5p+R5qGT5qO65qy+5q2T5rGX5ryi5r6X5r2F55Kw55SY55uj55yL56u/566h57Ch57ep57y257+w6IKd6Imm6I6e6Kaz6KuM6LKr6YKE6ZGR6ZaT6ZaR6Zai6Zml6Z+T6aSo6IiY5Li45ZCr5bK45beM546p55mM55y85bKp57+r6LSL6ZuB6aCR6aGU6aGY5LyB5LyO5Y2x5Zac5Zmo5Z+65aWH5ayJ5a+E5bKQ5biM5bm+5b+M5o+u5py65peX5pei5pyf5qOL5qOEXCJcblx0XSxcblx0W1xuXHRcdFwiOGI0MFwiLFxuXHRcdFwi5qmf5biw5q+F5rCX5rG955W/56WI5a2j56iA57SA5b696KaP6KiY6LK06LW36LuM6Lyd6aOi6aiO6ay85LqA5YG95YSA5aaT5a6c5oiv5oqA5pOs5qy654qg55aR56WH576p6J+76Kq86K2w5o6s6I+K6Z6g5ZCJ5ZCD5Zar5qGU5qmY6Kmw56Cn5p216buN5Y205a6i6ISa6JmQ6YCG5LiY5LmF5LuH5LyR5Y+K5ZC45a6u5byT5oCl5pWRXCJcblx0XSxcblx0W1xuXHRcdFwiOGI4MFwiLFxuXHRcdFwi5py95rGC5rGy5rOj54G455CD56m256qu56yI57Sa57O+57Wm5pen54mb5Y675bGF5beo5ouS5oug5oyZ5rig6Jma6Kix6Led6Yu45ryB56am6a2a5Lqo5Lqr5Lqs5L6b5L6g5YOR5YWH56u25YWx5Ye25Y2U5Yyh5Y2/5Y+r5Zas5aKD5bOh5by35b2K5oCv5oGQ5oGt5oyf5pWZ5qmL5rOB54uC54ut55+v6IO46ISF6IiI6JWO6YO36Y+h6Z+/6aWX6ama5Luw5Yed5bCt5pqB5qWt5bGA5puy5qW1546J5qGQ57KB5YOF5Yuk5Z2H5be+6Yym5pak5qyj5qy955C056aB56a9562L57eK6Iq56I+M6KG/6KWf6Ky56L+R6YeR5ZCf6YqA5Lmd5YC25Y+l5Yy654uX546W55+p6Ium6Lqv6aeG6aeI6aeS5YW35oSa6Jme5Zaw56m65YG25a+T6YGH6ZqF5Liy5qub6Yen5bGR5bGIXCJcblx0XSxcblx0W1xuXHRcdFwiOGM0MFwiLFxuXHRcdFwi5o6Y56qf5rKT6Z206L2h56qq54aK6ZqI57KC5qCX57mw5qGR6Y2s5Yuy5ZCb6Jar6KiT576k6LuN6YOh5Y2m6KKI56WB5L+C5YK+5YiR5YWE5ZWT5Zyt54+q5Z6L5aWR5b2i5b6E5oG15oW25oWn5oap5o6y5pC65pWs5pmv5qGC5riT55Wm56i957O757WM57aZ57mL572r6IyO6I2K6JuN6KiI6Kmj6K2m6Lu96aCa6baP6Iq46L+O6a+oXCJcblx0XSxcblx0W1xuXHRcdFwiOGM4MFwiLFxuXHRcdFwi5YqH5oif5pKD5r+A6ZqZ5qGB5YKR5qyg5rG65r2U56m057WQ6KGA6Kij5pyI5Lu25YC55YCm5YGl5YW85Yi45Ymj5Zan5ZyP5aCF5auM5bu65oay5oe45ouz5o2y5qSc5qip54m954qs54yu56CU56Gv57W555yM6IKp6KaL6KyZ6LOi6LuS6YGj6Y216Zm66aGV6aiT6bm45YWD5Y6f5Y6z5bm75bym5rib5rqQ546E54++57WD6Ii36KiA6Ku66ZmQ5LmO5YCL5Y+k5ZG85Zu65aeR5a2k5bex5bqr5byn5oi45pWF5p6v5rmW54uQ57OK6KK06IKh6IOh6I+w6JmO6KqH6Leo6Yi36ZuH6aGn6byT5LqU5LqS5LyN5Y2I5ZGJ5ZC+5aiv5b6M5b6h5oKf5qKn5qqO55Ga56KB6Kqe6Kqk6K236YaQ5Lme6a+J5Lqk5L285L6v5YCZ5YCW5YWJ5YWs5Yqf5Yq55Yu+5Y6a5Y+j5ZCRXCJcblx0XSxcblx0W1xuXHRcdFwiOGQ0MFwiLFxuXHRcdFwi5ZCO5ZaJ5Z2R5Z6i5aW95a2U5a2d5a6P5bel5ben5be35bm45bqD5bqa5bq35byY5oGS5oWM5oqX5ouY5o6n5pS75piC5pmD5pu05p2t5qCh5qKX5qeL5rGf5rSq5rWp5riv5rqd55Sy55qH56Gs56i/57Og57SF57SY57We57ax6ICV6ICD6IKv6IKx6IWU6IaP6Iiq6I2S6KGM6KGh6Kyb6LKi6LO86YOK6YW16Ymx56C/6Yu86Zak6ZmNXCJcblx0XSxcblx0W1xuXHRcdFwiOGQ4MFwiLFxuXHRcdFwi6aCF6aaZ6auY6bS75Ymb5Yqr5Y+35ZCI5aOV5ou35r+g6LGq6L2f6bq55YWL5Yi75ZGK5Zu956mA6YW36bWg6buS542E5ryJ6IWw55SR5b+95oOa6aqo54ub6L685q2k6aCD5LuK5Zuw5Z2k5aK+5ama5oGo5oeH5piP5piG5qC55qKx5re355eV57S66Imu6a2C5Lqb5L2Q5Y+J5ZSG5bWv5bem5beu5p+75rKZ55Gz56CC6KmQ6Y6W6KOf5Z2Q5bqn5oyr5YK15YKs5YaN5pyA5ZOJ5aGe5aa75a6w5b2p5omN5o6h5qC95q2z5riI54G96YeH54qA56CV56Cm56Wt5paO57Sw6I+c6KOB6LyJ6Zqb5Ymk5Zyo5p2Q572q6LKh5Ya05Z2C6Ziq5aC65qaK6IK05ZKy5bSO5Z+856KV6be65L2c5YmK5ZKL5pC+5pio5pyU5p+156qE562W57Si6Yyv5qGc6a6t56y55YyZ5YaK5Yi3XCJcblx0XSxcblx0W1xuXHRcdFwiOGU0MFwiLFxuXHRcdFwi5a+f5ou25pKu5pOm5pyt5q666Jap6ZuR55qQ6a+W5o2M6YyG6a6r55q/5pmS5LiJ5YKY5Y+C5bGx5oOo5pKS5pWj5qGf54em54+K55Sj566X57qC6JqV6K6D6LOb6YW46aSQ5pas5pqr5q6L5LuV5LuU5Ly65L2/5Yi65Y+45Y+y5Zej5Zub5aOr5aeL5aeJ5ae/5a2Q5bGN5biC5bir5b+X5oCd5oyH5pSv5a2c5pav5pa95peo5p6d5q2iXCJcblx0XSxcblx0W1xuXHRcdFwiOGU4MFwiLFxuXHRcdFwi5q275rCP542F56WJ56eB57O457SZ57Sr6IKi6ISC6Iez6KaW6Kme6Kmp6Kmm6KqM6Kuu6LOH6LOc6ZuM6aO85q2v5LqL5Ly85L6N5YWQ5a2X5a+65oWI5oyB5pmC5qyh5ruL5rK754i+55K955eU56OB56S66ICM6ICz6Ieq6JKU6L6e5rGQ6bm/5byP6K2Y6bSr56u66Lu45a6N6Zur5LiD5Y+x5Z+35aSx5auJ5a6k5oKJ5rm/5ryG55a+6LOq5a6f6JSA56+g5YGy5p+06Iqd5bGh6JWK57ie6IiO5YaZ5bCE5o2o6LWm5pac54Wu56S+57SX6ICF6Kyd6LuK6YGu6JuH6YKq5YCf5Yu65bC65p2T54G854i16YWM6YeI6Yyr6Iul5a+C5byx5oO55Li75Y+W5a6I5omL5pyx5q6K54up54+g56iu6IWr6Laj6YWS6aaW5YSS5Y+X5ZGq5a+/5o6I5qi557as6ZyA5Zua5Y+O5ZGoXCJcblx0XSxcblx0W1xuXHRcdFwiOGY0MFwiLFxuXHRcdFwi5a6X5bCx5bee5L+u5oSB5ou+5rSy56eA56eL57WC57mN57+S6Iet6Iif6JKQ6KGG6KWy6K6Q6Lm06Lyv6YCx6YWL6YWs6ZuG6Yac5LuA5L2P5YWF5Y2B5b6T5oiO5p+U5rGB5riL542j57im6YeN6YqD5Y+U5aSZ5a6/5reR56Wd57iu57Kb5aG+54af5Ye66KGT6L+w5L+K5bO75pil556s56uj6Iic6ae/5YeG5b6q5pes5qWv5q6J5rezXCJcblx0XSxcblx0W1xuXHRcdFwiOGY4MFwiLFxuXHRcdFwi5rqW5r2k55u+57SU5beh6YG16YaH6aCG5Yem5Yid5omA5pqR5puZ5ria5bq257eS572y5pu46Jav6Je36Ku45Yqp5Y+Z5aWz5bqP5b6Q5oGV6Yuk6Zmk5YK35YSf5Yud5Yyg5Y2H5Y+s5ZOo5ZWG5ZSx5ZiX5aWo5aa+5ai85a615bCG5bCP5bCR5bCa5bqE5bqK5bug5b2w5om/5oqE5oub5o6M5o235piH5piM5pit5pm25p2+5qKi5qif5qi15rK85raI5riJ5rmY54S854Sm54Wn55eH55yB56Gd56SB56Wl56ew56ug56yR57Kn57S56IKW6I+W6JKL6JWJ6KGd6KOz6Kif6Ki86KmU6Kmz6LGh6LOe6Yak6Ymm6Y2+6ZCY6Zqc6Z6Y5LiK5LiI5Lie5LmX5YaX5Ymw5Z+O5aC05aOM5ayi5bi45oOF5pO+5p2h5p2W5rWE54q255Wz56mj6JK46K2y6Ya46Yyg5Zix5Z+06aO+XCJcblx0XSxcblx0W1xuXHRcdFwiOTA0MFwiLFxuXHRcdFwi5out5qSN5q6W54et57mU6IG36Imy6Kem6aOf6J2V6L6x5bC75Ly45L+h5L615ZSH5aig5a+d5a+p5b+D5oWO5oyv5paw5pmL5qOu5qab5rW45rex55Sz55a555yf56We56em57Sz6Iej6Iqv6Jaq6Kaq6Ki66Lqr6L6b6YCy6Yed6ZyH5Lq65LuB5YiD5aG15aOs5bCL55Sa5bC96IWO6KiK6L+F6Zmj6Z2t56yl6KuP6aCI6YWi5Zuz5Y6oXCJcblx0XSxcblx0W1xuXHRcdFwiOTA4MFwiLFxuXHRcdFwi6YCX5ZC55Z6C5bil5o6o5rC054KK552h57KL57+g6KGw6YGC6YWU6YyQ6YyY6ZqP55Ge6auE5bSH5bWp5pWw5p6i6Lao6Zub5o2u5p2J5qSZ6I+F6aCX6ZuA6KO+5r6E5pG65a+45LiW54Cs55Wd5piv5YeE5Yi25Yui5aeT5b6B5oCn5oiQ5pS/5pW05pif5pm05qOy5qCW5q2j5riF54my55Sf55ub57K+6IGW5aOw6KO96KW/6Kqg6KqT6KuL6YCd6YaS6Z2S6Z2Z5paJ56iO6ISG6Zq75bit5oOc5oia5pal5piU5p6Q55+z56mN57GN57i+6ISK6LKs6LWk6Leh6Lmf56Kp5YiH5ouZ5o6l5pGC5oqY6Kit56qD56+A6Kqs6Zuq57W26IiM6J2J5LuZ5YWI5Y2D5Y2g5a6j5bCC5bCW5bed5oim5omH5pKw5qCT5qC05rOJ5rWF5rSX5p+T5r2c54WO54W95peL56m/566t57eaXCJcblx0XSxcblx0W1xuXHRcdFwiOTE0MFwiLFxuXHRcdFwi57mK576o6IW66Iib6Ii56Jam6Kmu6LOO6Le16YG46YG36Yqt6YqR6ZaD6a6u5YmN5ZaE5ry454S25YWo56aF57mV6Iaz57OO5ZmM5aGR5bKo5o6q5pu+5pu95qWa54uZ55aP55aO56SO56WW56ef57KX57Sg57WE6JiH6Ki06Zi76YGh6byg5YOn5Ym15Y+M5Y+i5YCJ5Zaq5aOu5aWP54i95a6L5bGk5Yyd5oOj5oOz5o2c5o6D5oy/5o67XCJcblx0XSxcblx0W1xuXHRcdFwiOTE4MFwiLFxuXHRcdFwi5pON5pep5pu55bej5qeN5qe95ryV54el5LqJ55ep55u456qT57Of57eP57ac6IGh6I2J6I2Y6JGs6JK86Je76KOF6LWw6YCB6YGt6Y6X6Zyc6aiS5YOP5aKX5oaO6IeT6JS16LSI6YCg5L+D5YG05YmH5Y2z5oGv5o2J5p2f5ris6Laz6YCf5L+X5bGe6LOK5peP57aa5Y2S6KKW5YW25o+D5a2Y5a2r5bCK5pCN5p2R6YGc5LuW5aSa5aSq5rGw6KmR5ZS+5aCV5aal5oOw5omT5p+B6Ii15qWV6ZmA6aeE6aio5L2T5aCG5a++6ICQ5bKx5biv5b6F5oCg5oWL5oi05pu/5rOw5rue6IOO6IW/6IuU6KKL6LK46YCA6YCu6ZqK6bub6a+b5Luj5Y+w5aSn56ys6YaN6aGM6be55rud54Cn5Y2T5ZWE5a6F5omY5oqe5ouT5rKi5r+v55Ci6KiX6ZC45r+B6Ku+6Iy45Yen6Ju45Y+qXCJcblx0XSxcblx0W1xuXHRcdFwiOTI0MFwiLFxuXHRcdFwi5Y+p5L2G6YGU6L6w5aWq6ISx5be956uq6L6/5qOa6LC354u46bGI5qi96Kqw5Li55Y2Y5ZiG5Z2m5ouF5o6i5pem5q2O5reh5rmb54Kt55+t56uv566q57a76IC96IOG6JuL6KqV6Y2b5Zuj5aOH5by+5pat5pqW5qqA5q6155S36KuH5YCk55+l5Zyw5byb5oGl5pm65rGg55e056ia572u6Ie06JyY6YGF6aaz56+J55Wc56u5562R6JOEXCJcblx0XSxcblx0W1xuXHRcdFwiOTI4MFwiLFxuXHRcdFwi6YCQ56ep56qS6Iy25auh552A5Lit5Luy5a6Z5b+g5oq95pi85p+x5rOo6Jmr6KG36Ki76YWO6Yuz6aeQ5qiX54Cm54yq6Iun6JGX6LKv5LiB5YWG5YeL5ZaL5a+15biW5biz5bqB5byU5by15b2r5b605oey5oyR5pqi5pyd5r2u54mS55S655y66IG06IS56IW46J226Kq/6Kuc6LaF6Lez6Yqa6ZW36aCC6bOl5YuF5o2X55u05pyV5rKI54+N6LOD6Y6u6Zmz5rSl5aKc5qSO5qeM6L+96Y6a55eb6YCa5aGa5qCC5o605qe75L2D5rys5p+Y6L676JSm57a06Y2U5qS/5r2w5Z2q5aO35ays57Ss54iq5ZCK6Yej6ba05Lqt5L2O5YGc5YG15YmD6LKe5ZGI5aCk5a6a5bid5bqV5bqt5bu35byf5oKM5oq15oy65o+Q5qKv5rGA56KH56aO56iL57eg6ImH6KiC6Kum6LmE6YCTXCJcblx0XSxcblx0W1xuXHRcdFwiOTM0MFwiLFxuXHRcdFwi6YK46YSt6YeY6byO5rOl5pGY5pOi5pW15ru055qE56yb6YGp6Y+R5rq65ZOy5b655pKk6L2N6L+t6YmE5YW45aGr5aSp5bGV5bqX5re757qP55Sc6LK86Lui6aGb54K55Lyd5q6/5r6x55Sw6Zu75YWO5ZCQ5aC15aGX5aas5bGg5b6S5paX5p2c5rih55m76I+f6LOt6YCU6YO96Y2N56Cl56C65Yqq5bqm5Zyf5aW05oCS5YCS5YWa5YasXCJcblx0XSxcblx0W1xuXHRcdFwiOTM4MFwiLFxuXHRcdFwi5YeN5YiA5ZSQ5aGU5aGY5aWX5a6V5bO25baL5oK85oqV5pCt5p2x5qGD5qK85qOf55uX5reY5rmv5rab54Gv54eI5b2T55eY56W3562J562U562S57OW57Wx5Yiw6JGj6JWp6Jek6KiO6KyE6LGG6LiP6YCD6YCP6ZCZ6Zm26aCt6aiw6ZeY5YON5YuV5ZCM5aCC5bCO5oan5pKe5rSe556z56ul6IO06JCE6YGT6YqF5bOg6bSH5Yy/5b6X5b6z5rac54m5552j56a/56+k5q+S54us6Kqt5qCD5qmh5Ye456qB5qS05bGK6bO26Iur5a+F6YWJ54Ce5Zm45bGv5oOH5pWm5rKM6LGa6YGB6aCT5ZGR5puH6YiN5aWI6YKj5YaF5LmN5Yeq6JaZ6KyO54GY5o266Y2L5qWi6aa057iE55W35Y2X5qWg6Luf6Zuj5rGd5LqM5bC85byQ6L+p5YyC6LOR6IKJ6Jm55bu/5pel5Lmz5YWlXCJcblx0XSxcblx0W1xuXHRcdFwiOTQ0MFwiLFxuXHRcdFwi5aaC5bC/6Z+u5Lu75aaK5b+N6KqN5r+h56aw56Wi5a+n6JGx54yr54ax5bm05b+15o275pKa54eD57KY5LmD5bu85LmL5Z+c5Zqi5oKp5r+D57SN6IO96ISz6Ia/6L6y6KaX6Jqk5be05oqK5pKt6KaH5p235rOi5rS+55C256C05amG57216Iqt6aas5L+z5buD5oud5o6S5pWX5p2v55uD54mM6IOM6IK66Lyp6YWN5YCN5Z+55aqS5qKFXCJcblx0XSxcblx0W1xuXHRcdFwiOTQ4MFwiLFxuXHRcdFwi5qWz54Wk54u96LK35aOy6LOg6Zmq6YCZ6J2/56ek55+n6JCp5Lyv5Yml5Y2a5ouN5p+P5rOK55m9566U57KV6Ii26JaE6L+r5pud5ryg54iG57ib6I6r6aeB6bqm5Ye9566x56Gy56646IKH562I5quo5bmh6IKM55WR55Wg5YWr6Ymi5rqM55m66YaX6auq5LyQ572w5oqc562P6Zal6bOp5Zm65aGZ6Juk6Zq85Ly05Yik5Y2K5Y+N5Y+b5biG5pCs5paR5p2/5rC+5rGO54mI54qv54+t55WU57mB6Iis6Jep6LKp56+E6YeG54Wp6aCS6aOv5oy95pmp55Wq55uk56OQ6JWD6Juu5Yyq5Y2R5ZCm5aaD5bqH5b285oKy5omJ5om55oqr5paQ5q+U5rOM55ay55qu56KR56eY57eL57236IKl6KKr6Kq56LK76YG/6Z2e6aOb5qiL57C45YKZ5bC+5b6u5p6H5q+Y55C155yJ576OXCJcblx0XSxcblx0W1xuXHRcdFwiOTU0MFwiLFxuXHRcdFwi6by75p+K56iX5Yy555aL6aut5b2m6Iad6I+x6IKY5by85b+F55Wi562G6YC85qGn5aer5aqb57SQ55m+6Kys5L+15b2q5qiZ5rC35ryC55Oi56Wo6KGo6KmV6LG55buf5o+P55eF56eS6IuX6Yyo6Yuy6JKc6Jut6bCt5ZOB5b2s5paM5rWc54CV6LKn6LOT6aC75pWP55O25LiN5LuY5Z+g5aSr5amm5a+M5Yao5biD5bqc5oCW5om25pW3XCJcblx0XSxcblx0W1xuXHRcdFwiOTU4MFwiLFxuXHRcdFwi5pan5pmu5rWu54i256ym6IWQ6Iaa6IqZ6K2c6LKg6LOm6LW06Zic6ZmE5L6u5pKr5q2m6Iie6JGh6JWq6YOo5bCB5qWT6aKo6JG66JWX5LyP5Ymv5b6p5bmF5pyN56aP6IW56KSH6KaG5re15byX5omV5rK45LuP54mp6a6S5YiG5ZC75Zm05aKz5oak5omu54Sa5aWu57KJ57Oe57Sb6Zuw5paH6IGe5LiZ5L215YW15aGA5bmj5bmz5byK5p+E5Lim6JS96ZaJ6Zmb57Gz6aCB5YO75aOB55mW56Kn5Yil556l6JSR566G5YGP5aSJ54mH56+H57eo6L666L+U6YGN5L6/5YuJ5aip5byB6Z6t5L+d6IiX6Yuq5ZyD5o2V5q2p55Sr6KOc6LyU56mC5Yuf5aKT5oWV5oiK5pqu5q+N57C/6I+p5YCj5L+45YyF5ZGG5aCx5aWJ5a6d5bOw5bOv5bSp5bqW5oqx5o2n5pS+5pa55pyLXCJcblx0XSxcblx0W1xuXHRcdFwiOTY0MFwiLFxuXHRcdFwi5rOV5rOh54O556Cy57ir6IOe6Iqz6JCM6JOs6JyC6KSS6Kiq6LGK6YKm6YuS6aO96bOz6bWs5LmP5Lqh5YKN5YmW5Z2K5aao5bi95b+Y5b+Z5oi/5pq05pyb5p+Q5qOS5YaS57Sh6IKq6Iao6KyA6LKM6LK/6Ym+6Ziy5ZCg6aCs5YyX5YOV5Y2c5aKo5pKy5py054mn552m56mG6Yem5YuD5rKh5q6G5aCA5bmM5aWU5pys57+75Yeh55uGXCJcblx0XSxcblx0W1xuXHRcdFwiOTY4MFwiLFxuXHRcdFwi5pGp56Oo6a2U6bq75Z+L5aa55pin5p6a5q+O5ZOp5qeZ5bmV6Iac5p6V6a6q5p++6bGS5qGd5Lqm5L+j5Y+I5oq55pyr5rKr6L+E5L6t57mt6bq/5LiH5oWi5rqA5ryr6JST5ZGz5pyq6a2F5bez566V5bKs5a+G6Jyc5rmK6JOR56iU6ISI5aaZ57KN5rCR55yg5YuZ5aSi54Sh54mf55+b6Zyn6bWh5qSL5am/5aiY5Yal5ZCN5ZG95piO55uf6L+36YqY6bO05aeq54md5ruF5YWN5qOJ57a/57es6Z2i6bq65pG45qih6IyC5aaE5a2f5q+b54yb55uy57ay6ICX6JKZ5YSy5pyo6buZ55uu5p2i5Yu/6aSF5bCk5oi757G+6LKw5ZWP5oK257SL6ZaA5YyB5Lmf5Ya25aSc54i66IC26YeO5byl55+i5Y6E5b2557SE6Jas6Kiz6LqN6Z2W5p+z6Jau6ZGT5oSJ5oSI5rK555mSXCJcblx0XSxcblx0W1xuXHRcdFwiOTc0MFwiLFxuXHRcdFwi6Kut6Ly45ZSv5L2R5YSq5YuH5Y+L5a6l5bm95oKg5oaC5o+W5pyJ5p+a5rmn5raM54y254y355Sx56WQ6KOV6KqY6YGK6YKR6YO16ZuE6J6N5aSV5LqI5L2Z5LiO6KqJ6Ly/6aCQ5YKt5bm85aaW5a655bq45o+a5o+65pOB5puc5qWK5qeY5rSL5rq254aU55So56qv576K6ICA6JGJ6JOJ6KaB6Kyh6LiK6YGl6Zm96aSK5oW+5oqR5qyyXCJcblx0XSxcblx0W1xuXHRcdFwiOTc4MFwiLFxuXHRcdFwi5rKD5rW057+M57+85reA576F6J666KO45p2l6I6x6aC86Zu35rSb57Wh6JC96YWq5Lmx5Y215bWQ5qyE5r+r6JeN6Jit6Kan5Yip5ZCP5bGl5p2O5qKo55CG55KD55ei6KOP6KOh6YeM6Zui6Zm45b6L546H56uL6JGO5o6g55Wl5YqJ5rWB5rqc55CJ55WZ56Gr57KS6ZqG56uc6b6N5L625oWu5peF6Jmc5LqG5Lqu5YOa5Lih5YeM5a+u5paZ5qKB5ra854yf55mC556t56ic57On6Imv6KuS6YG86YeP6Zm16aCY5Yqb57eR5YCr5Y6Y5p6X5reL54eQ55Cz6Ieo6Lyq6Zqj6bGX6bqf55Gg5aGB5raZ57Sv6aGe5Luk5Ly25L6L5Ya35Yqx5ba65oCc546y56S86IuT6Yi06Zq36Zu26ZyK6bqX6b2i5pqm5q205YiX5Yqj54OI6KOC5buJ5oGL5oaQ5ryj54WJ57C+57e06IGvXCJcblx0XSxcblx0W1xuXHRcdFwiOTg0MFwiLFxuXHRcdFwi6JOu6YCj6Yys5ZGC6a2v5quT54KJ6LOC6Lev6Zyy5Yq05amB5buK5byE5pyX5qW85qaU5rWq5ryP54mi54u856+t6ICB6IG+6J2L6YOO5YWt6bqT56aE6IKL6Yyy6KuW5YCt5ZKM6Kmx5q2q6LOE6ISH5oOR5p6g6bey5LqZ5LqY6bCQ6Kmr6JeB6JWo5qSA5rm+56KX6IWVXCJcblx0XSxcblx0W1xuXHRcdFwiOTg5ZlwiLFxuXHRcdFwi5byM5LiQ5LiV5Liq5Lix5Li25Li85Li/5LmC5LmW5LmY5LqC5LqF6LGr5LqK6IiS5byN5LqO5Lqe5Lqf5Lqg5Lqi5Lqw5Lqz5Lq25LuO5LuN5LuE5LuG5LuC5LuX5Lue5Lut5Luf5Lu35LyJ5L2a5Lyw5L2b5L2d5L2X5L2H5L225L6I5L6P5L6Y5L275L2p5L2w5L6R5L2v5L6G5L6W5YSY5L+U5L+f5L+O5L+Y5L+b5L+R5L+a5L+Q5L+k5L+l5YCa5YCo5YCU5YCq5YCl5YCF5Lyc5L+25YCh5YCp5YCs5L++5L+v5YCR5YCG5YGD5YGH5pyD5YGV5YGQ5YGI5YGa5YGW5YGs5YG45YKA5YKa5YKF5YK05YKyXCJcblx0XSxcblx0W1xuXHRcdFwiOTk0MFwiLFxuXHRcdFwi5YOJ5YOK5YKz5YOC5YOW5YOe5YOl5YOt5YOj5YOu5YO55YO15YSJ5YSB5YSC5YSW5YSV5YSU5YSa5YSh5YS65YS35YS85YS75YS/5YWA5YWS5YWM5YWU5YWi56u45YWp5YWq5YWu5YaA5YaC5ZuY5YaM5YaJ5YaP5YaR5YaT5YaV5YaW5Yak5Yam5Yai5Yap5Yaq5Yar5Yaz5Yax5Yay5Yaw5Ya15Ya95YeF5YeJ5Yeb5Yeg6JmV5Yep5YetXCJcblx0XSxcblx0W1xuXHRcdFwiOTk4MFwiLFxuXHRcdFwi5Yew5Ye15Ye+5YiE5YiL5YiU5YiO5Yin5Yiq5Yiu5Yiz5Yi55YmP5YmE5YmL5YmM5Yme5YmU5Ymq5Ym05Ymp5Ymz5Ym/5Ym95YqN5YqU5YqS5Ymx5YqI5YqR6L6o6L6n5Yqs5Yqt5Yq85Yq15YuB5YuN5YuX5Yue5Yuj5Yum6aOt5Yug5Yuz5Yu15Yu45Yu55YyG5YyI55S45YyN5YyQ5YyP5YyV5Yya5Yyj5Yyv5Yyx5Yyz5Yy45Y2A5Y2G5Y2F5LiX5Y2J5Y2N5YeW5Y2e5Y2p5Y2u5aSY5Y275Y235Y6C5Y6W5Y6g5Y6m5Y6l5Y6u5Y6w5Y625Y+D57CS6ZuZ5Y+f5pu854eu5Y+u5Y+o5Y+t5Y+65ZCB5ZC95ZGA5ZCs5ZCt5ZC85ZCu5ZC25ZCp5ZCd5ZGO5ZKP5ZG15ZKO5ZGf5ZGx5ZG35ZGw5ZKS5ZG75ZKA5ZG25ZKE5ZKQ5ZKG5ZOH5ZKi5ZK45ZKl5ZKs5ZOE5ZOI5ZKoXCJcblx0XSxcblx0W1xuXHRcdFwiOWE0MFwiLFxuXHRcdFwi5ZKr5ZOC5ZKk5ZK+5ZK85ZOY5ZOl5ZOm5ZSP5ZSU5ZO95ZOu5ZOt5ZO65ZOi5ZS55ZWA5ZWj5ZWM5ZSu5ZWc5ZWF5ZWW5ZWX5ZS45ZSz5ZWd5ZaZ5ZaA5ZKv5ZaK5Zaf5ZW75ZW+5ZaY5Zae5Zau5ZW85ZaD5Zap5ZaH5Zao5Zea5ZeF5Zef5ZeE5Zec5Zek5ZeU5ZiU5Ze35ZiW5Ze+5Ze95Zib5Ze55ZmO5ZmQ54ef5Zi05Zi25Ziy5Zi4XCJcblx0XSxcblx0W1xuXHRcdFwiOWE4MFwiLFxuXHRcdFwi5Zmr5Zmk5Ziv5Zms5Zmq5ZqG5ZqA5ZqK5Zqg5ZqU5ZqP5Zql5Zqu5Zq25Zq05ZuC5Zq85ZuB5ZuD5ZuA5ZuI5ZuO5ZuR5ZuT5ZuX5Zuu5Zu55ZyA5Zu/5ZyE5ZyJ5ZyI5ZyL5ZyN5ZyT5ZyY5ZyW5ZeH5Zyc5Zym5Zy35Zy45Z2O5Zy75Z2A5Z2P5Z2p5Z+A5Z6I5Z2h5Z2/5Z6J5Z6T5Z6g5Z6z5Z6k5Z6q5Z6w5Z+D5Z+G5Z+U5Z+S5Z+T5aCK5Z+W5Z+j5aCL5aCZ5aCd5aGy5aCh5aGi5aGL5aGw5q+A5aGS5aC95aG55aKF5aK55aKf5aKr5aK65aOe5aK75aK45aKu5aOF5aOT5aOR5aOX5aOZ5aOY5aOl5aOc5aOk5aOf5aOv5aO65aO55aO75aO85aO95aSC5aSK5aSQ5aSb5qKm5aSl5aSs5aSt5aSy5aS45aS+56uS5aWV5aWQ5aWO5aWa5aWY5aWi5aWg5aWn5aWs5aWpXCJcblx0XSxcblx0W1xuXHRcdFwiOWI0MFwiLFxuXHRcdFwi5aW45aaB5aad5L2e5L6r5aaj5aay5aeG5aeo5aec5aaN5aeZ5aea5ail5aif5aiR5aic5aiJ5aia5amA5ams5amJ5ai15ai25ami5amq5aqa5aq85aq+5auL5auC5aq95auj5auX5aum5aup5auW5au65au75ayM5ayL5ayW5ayy5auQ5ayq5ay25ay+5a2D5a2F5a2A5a2R5a2V5a2a5a2b5a2l5a2p5a2w5a2z5a215a245paI5a265a6AXCJcblx0XSxcblx0W1xuXHRcdFwiOWI4MFwiLFxuXHRcdFwi5a6D5a6m5a645a+D5a+H5a+J5a+U5a+Q5a+k5a+m5a+i5a+e5a+l5a+r5a+w5a+25a+z5bCF5bCH5bCI5bCN5bCT5bCg5bCi5bCo5bC45bC55bGB5bGG5bGO5bGT5bGQ5bGP5a2x5bGs5bGu5Lmi5bG25bG55bKM5bKR5bKU5aab5bKr5bK75bK25bK85bK35bOF5bK+5bOH5bOZ5bOp5bO95bO65bOt5baM5bOq5bSL5bSV5bSX5bWc5bSf5bSb5bSR5bSU5bSi5bSa5bSZ5bSY5bWM5bWS5bWO5bWL5bWs5bWz5bW25baH5baE5baC5bai5bad5bas5bau5ba95baQ5ba35ba85beJ5beN5beT5beS5beW5beb5ber5bey5be15biL5bia5biZ5biR5bib5bi25bi35bmE5bmD5bmA5bmO5bmX5bmU5bmf5bmi5bmk5bmH5bm15bm25bm66bq85bm/5bqg5buB5buC5buI5buQ5buPXCJcblx0XSxcblx0W1xuXHRcdFwiOWM0MFwiLFxuXHRcdFwi5buW5buj5bud5bua5bub5bui5buh5buo5bup5bus5bux5buz5buw5bu05bu45bu+5byD5byJ5b2d5b2c5byL5byR5byW5byp5byt5by45b2B5b2I5b2M5b2O5byv5b2R5b2W5b2X5b2Z5b2h5b2t5b2z5b235b6D5b6C5b2/5b6K5b6I5b6R5b6H5b6e5b6Z5b6Y5b6g5b6o5b6t5b685b+W5b+75b+k5b+45b+x5b+d5oKz5b+/5oCh5oGgXCJcblx0XSxcblx0W1xuXHRcdFwiOWM4MFwiLFxuXHRcdFwi5oCZ5oCQ5oCp5oCO5oCx5oCb5oCV5oCr5oCm5oCP5oC65oGa5oGB5oGq5oG35oGf5oGK5oGG5oGN5oGj5oGD5oGk5oGC5oGs5oGr5oGZ5oKB5oKN5oOn5oKD5oKa5oKE5oKb5oKW5oKX5oKS5oKn5oKL5oOh5oK45oOg5oOT5oK05b+w5oK95oOG5oK15oOY5oWN5oSV5oSG5oO25oO35oSA5oO05oO65oSD5oSh5oO75oOx5oSN5oSO5oWH5oS+5oSo5oSn5oWK5oS/5oS85oSs5oS05oS95oWC5oWE5oWz5oW35oWY5oWZ5oWa5oWr5oW05oWv5oWl5oWx5oWf5oWd5oWT5oW15oaZ5oaW5oaH5oas5oaU5oaa5oaK5oaR5oar5oau5oeM5oeK5oeJ5oe35oeI5oeD5oeG5oa65oeL57255oeN5oem5oej5oe25oe65oe05oe/5oe95oe85oe+5oiA5oiI5oiJ5oiN5oiM5oiU5oibXCJcblx0XSxcblx0W1xuXHRcdFwiOWQ0MFwiLFxuXHRcdFwi5oie5oih5oiq5oiu5oiw5oiy5oiz5omB5omO5ome5omj5omb5omg5omo5om85oqC5oqJ5om+5oqS5oqT5oqW5ouU5oqD5oqU5ouX5ouR5oq75ouP5ou/5ouG5pOU5ouI5ouc5ouM5ouK5ouC5ouH5oqb5ouJ5oyM5ouu5oux5oyn5oyC5oyI5ouv5ou15o2Q5oy+5o2N5pCc5o2P5o6W5o6O5o6A5o6r5o225o6j5o6P5o6J5o6f5o615o2rXCJcblx0XSxcblx0W1xuXHRcdFwiOWQ4MFwiLFxuXHRcdFwi5o2p5o6+5o+p5o+A5o+G5o+j5o+J5o+S5o+25o+E5pCW5pC05pCG5pCT5pCm5pC25pSd5pCX5pCo5pCP5pGn5pGv5pG25pGO5pSq5pKV5pKT5pKl5pKp5pKI5pK85pOa5pOS5pOF5pOH5pK75pOY5pOC5pOx5pOn6IiJ5pOg5pOh5oqs5pOj5pOv5pSs5pO25pO05pOy5pO65pSA5pO95pSY5pSc5pSF5pSk5pSj5pSr5pS05pS15pS35pS25pS455WL5pWI5pWW5pWV5pWN5pWY5pWe5pWd5pWy5pW45paC5paD6K6K5pab5paf5par5pa35peD5peG5peB5peE5peM5peS5peb5peZ5peg5peh5pex5p2y5piK5piD5pe75p2z5pi15pi25pi05pic5pmP5pmE5pmJ5pmB5pme5pmd5pmk5pmn5pmo5pmf5pmi5pmw5pqD5pqI5pqO5pqJ5pqE5pqY5pqd5puB5pq55puJ5pq+5pq8XCJcblx0XSxcblx0W1xuXHRcdFwiOWU0MFwiLFxuXHRcdFwi5puE5pq45puW5pua5pug5pi/5pum5pup5puw5pu15pu35pyP5pyW5pye5pym5pyn6Zy45pyu5py/5py25p2B5py45py35p2G5p2e5p2g5p2Z5p2j5p2k5p6J5p2w5p6p5p285p2q5p6M5p6L5p6m5p6h5p6F5p635p+v5p605p+s5p6z5p+p5p645p+k5p+e5p+d5p+i5p+u5p655p+O5p+G5p+n5qqc5qCe5qGG5qCp5qGA5qGN5qCy5qGOXCJcblx0XSxcblx0W1xuXHRcdFwiOWU4MFwiLFxuXHRcdFwi5qKz5qCr5qGZ5qGj5qG35qG/5qKf5qKP5qKt5qKU5qKd5qKb5qKD5qqu5qK55qG05qK15qKg5qK65qSP5qKN5qG+5qSB5qOK5qSI5qOY5qSi5qSm5qOh5qSM5qON5qOU5qOn5qOV5qS25qSS5qSE5qOX5qOj5qSl5qO55qOg5qOv5qSo5qSq5qSa5qSj5qSh5qOG5qW55qW35qWc5qW45qWr5qWU5qW+5qWu5qS55qW05qS95qWZ5qSw5qWh5qWe5qWd5qaB5qWq5qay5qau5qeQ5qa/5qeB5qeT5qa+5qeO5a+o5qeK5qed5qa75qeD5qan5qiu5qaR5qag5qac5qaV5qa05qee5qeo5qiC5qib5qe/5qyK5qe55qey5qen5qiF5qax5qie5qet5qiU5qer5qiK5qiS5quB5qij5qiT5qmE5qiM5qmy5qi25qm45qmH5qmi5qmZ5qmm5qmI5qi45qii5qqQ5qqN5qqg5qqE5qqi5qqjXCJcblx0XSxcblx0W1xuXHRcdFwiOWY0MFwiLFxuXHRcdFwi5qqX6JiX5qq75quD5quC5qq45qqz5qqs5que5quR5quf5qqq5qua5quq5qu75qyF6JiW5qu65qyS5qyW6ayx5qyf5qy45qy355uc5qy56aOu5q2H5q2D5q2J5q2Q5q2Z5q2U5q2b5q2f5q2h5q245q255q2/5q6A5q6E5q6D5q6N5q6Y5q6V5q6e5q6k5q6q5q6r5q6v5q6y5q6x5q6z5q635q685q+G5q+L5q+T5q+f5q+s5q+r5q+z5q+vXCJcblx0XSxcblx0W1xuXHRcdFwiOWY4MFwiLFxuXHRcdFwi6bq+5rCI5rCT5rCU5rCb5rCk5rCj5rGe5rGV5rGi5rGq5rKC5rKN5rKa5rKB5rKb5rG+5rGo5rGz5rKS5rKQ5rOE5rOx5rOT5rK95rOX5rOF5rOd5rKu5rKx5rK+5rK65rOb5rOv5rOZ5rOq5rSf6KGN5rS25rSr5rS95rS45rSZ5rS15rSz5rSS5rSM5rWj5raT5rWk5rWa5rW55rWZ5raO5raV5r+k5raF5re55riV5riK5ra15reH5rem5ra45reG5res5ree5reM5reo5reS5reF5re65reZ5rek5reV5req5reu5rit5rmu5riu5riZ5rmy5rmf5ri+5rij5rmr5rir5rm25rmN5rif5rmD5ri65rmO5rik5ru/5rid5ri45rqC5rqq5rqY5ruJ5rq35ruT5rq95rqv5ruE5rqy5ruU5ruV5rqP5rql5ruC5rqf5r2B5ryR54GM5rus5ru45ru+5ry/5ruy5ryx5ruv5ryy5ruMXCJcblx0XSxcblx0W1xuXHRcdFwiZTA0MFwiLFxuXHRcdFwi5ry+5ryT5ru35r6G5r265r245r6B5r6A5r2v5r2b5r+z5r2t5r6C5r285r2Y5r6O5r6R5r+C5r2m5r6z5r6j5r6h5r6k5r655r+G5r6q5r+f5r+V5r+s5r+U5r+Y5r+x5r+u5r+b54CJ54CL5r+654CR54CB54CP5r++54Cb54Ca5r2054Cd54CY54Cf54Cw54C+54Cy54GR54Gj54KZ54KS54Kv54Ox54Ks54K454Kz54Ku54Of54OL54OdXCJcblx0XSxcblx0W1xuXHRcdFwiZTA4MFwiLFxuXHRcdFwi54OZ54SJ54O954Sc54SZ54Wl54WV54aI54Wm54Wi54WM54WW54Ws54aP54e754aE54aV54ao54as54eX54a554a+54eS54eJ54eU54eO54eg54es54en54e154e854e554e/54iN54iQ54ib54io54it54is54iw54iy54i754i854i/54mA54mG54mL54mY54m054m+54qC54qB54qH54qS54qW54qi54qn54q554qy54uD54uG54uE54uO54uS54ui54ug54uh54u554u35YCP54yX54yK54yc54yW54yd54y054yv54yp54yl54y+542O542P6buY542X542q542o542w542454215427542654+I546z54+O546754+A54+l54+u54+e55Ki55CF55Gv55Cl54+455Cy55C655GV55C/55Gf55GZ55GB55Gc55Gp55Gw55Gj55Gq55G255G+55KL55Ke55Kn55OK55OP55OU54+xXCJcblx0XSxcblx0W1xuXHRcdFwiZTE0MFwiLFxuXHRcdFwi55Og55Oj55On55Op55Ou55Oy55Ow55Ox55O455O355SE55SD55SF55SM55SO55SN55SV55ST55Se55Sm55Ss55S855WE55WN55WK55WJ55Wb55WG55Wa55Wp55Wk55Wn55Wr55Wt55W455W255aG55aH55W055aK55aJ55aC55aU55aa55ad55al55aj55eC55az55eD55a155a955a455a855ax55eN55eK55eS55eZ55ej55ee55e+55e/XCJcblx0XSxcblx0W1xuXHRcdFwiZTE4MFwiLFxuXHRcdFwi55e855iB55ew55e655ey55ez55iL55iN55iJ55if55in55ig55ih55ii55ik55i055iw55i755mH55mI55mG55mc55mY55mh55mi55mo55mp55mq55mn55ms55mw55my55m255m455m855qA55qD55qI55qL55qO55qW55qT55qZ55qa55qw55q055q455q555q655uC55uN55uW55uS55ue55uh55ul55un55uq6Jiv55u755yI55yH55yE55yp55yk55ye55yl55ym55yb55y355y4552H552a552o552r552b552l552/552+5525556O556L556R556g556e556w55625565556/55685569556755+H55+N55+X55+a55+c55+j55+u55+856CM56CS56Sm56Cg56Sq56GF56KO56G056KG56G856Ka56KM56Kj56K156Kq56Kv56OR56OG56OL56OU56K+56K856OF56OK56OsXCJcblx0XSxcblx0W1xuXHRcdFwiZTI0MFwiLFxuXHRcdFwi56On56Oa56O956O056SH56SS56SR56SZ56Ss56Sr56WA56Wg56WX56Wf56Wa56WV56WT56W656W/56aK56ad56an6b2L56aq56au56az56a556a656eJ56eV56en56es56eh56ej56iI56iN56iY56iZ56ig56if56aA56ix56i756i+56i356mD56mX56mJ56mh56mi56mp6b6d56mw56m556m956qI56qX56qV56qY56qW56qp56uI56qwXCJcblx0XSxcblx0W1xuXHRcdFwiZTI4MFwiLFxuXHRcdFwi56q256uF56uE56q/6YKD56uH56uK56uN56uP56uV56uT56uZ56ua56ud56uh56ui56um56ut56uw56yC56yP56yK56yG56yz56yY56yZ56ye56y156yo56y2562Q562656yE562N56yL562M562F5621562l5620562n562w562x562s562u566d566Y566f566N566c566a566L566S566P562d566Z56+L56+B56+M56+P566056+G56+d56+p57CR57CU56+m56+l57Gg57CA57CH57CT56+z56+357CX57CN56+257Cj57Cn57Cq57Cf57C357Cr57C957GM57GD57GU57GP57GA57GQ57GY57Gf57Gk57GW57Gl57Gs57G157KD57KQ57Kk57Kt57Ki57Kr57Kh57Ko57Kz57Ky57Kx57Ku57K557K957OA57OF57OC57OY57OS57Oc57Oi6ay757Ov57Oy57O057O257O657SGXCJcblx0XSxcblx0W1xuXHRcdFwiZTM0MFwiLFxuXHRcdFwi57SC57Sc57SV57SK57WF57WL57Su57Sy57S/57S157WG57Wz57WW57WO57Wy57Wo57Wu57WP57Wj57aT57aJ57Wb57aP57W957ab57a657au57aj57a157eH57a957ar57i957ai57av57ec57a457af57aw57eY57ed57ek57ee57e757ey57eh57iF57iK57ij57ih57iS57ix57if57iJ57iL57ii57mG57mm57i757i157i557mD57i3XCJcblx0XSxcblx0W1xuXHRcdFwiZTM4MFwiLFxuXHRcdFwi57iy57i657mn57md57mW57me57mZ57ma57m557mq57mp57m857m757qD57eV57m96L6u57m/57qI57qJ57qM57qS57qQ57qT57qU57qW57qO57qb57qc57y457y6572F572M572N572O572Q572R572V572U572Y572f572g572o572p572n5724576C576G576D576I576H576M576U576e576d576a576j576v576y5765576u576257646K2x57+F57+G57+K57+V57+U57+h57+m57+p57+z57+56aOc6ICG6ICE6ICL6ICS6ICY6ICZ6ICc6ICh6ICo6IC/6IC76IGK6IGG6IGS6IGY6IGa6IGf6IGi6IGo6IGz6IGy6IGw6IG26IG56IG96IG/6IKE6IKG6IKF6IKb6IKT6IKa6IKt5YaQ6IKs6IOb6IOl6IOZ6IOd6IOE6IOa6IOW6ISJ6IOv6IOx6ISb6ISp6ISj6ISv6IWLXCJcblx0XSxcblx0W1xuXHRcdFwiZTQ0MFwiLFxuXHRcdFwi6ZqL6IWG6IS+6IWT6IWR6IO86IWx6IWu6IWl6IWm6IW06IaD6IaI6IaK6IaA6IaC6Iag6IaV6Iak6Iaj6IWf6IaT6Iap6Iaw6Ia16Ia+6Ia46Ia96IeA6IeC6Ia66IeJ6IeN6IeR6IeZ6IeY6IeI6Iea6Ief6Ieg6Ien6Ie66Ie76Ie+6IiB6IiC6IiF6IiH6IiK6IiN6IiQ6IiW6Iip6Iir6Ii46Iiz6ImA6ImZ6ImY6Imd6Ima6Imf6ImkXCJcblx0XSxcblx0W1xuXHRcdFwiZTQ4MFwiLFxuXHRcdFwi6Imi6Imo6Imq6Imr6Iiu6Imx6Im36Im46Im+6IqN6IqS6Iqr6Iqf6Iq76Iqs6Iuh6Iuj6Iuf6IuS6Iu06Iuz6Iu66I6T6IyD6Iu76Iu56Iue6IyG6Iuc6IyJ6IuZ6Iy16Iy06IyW6Iyy6Iyx6I2A6Iy56I2Q6I2F6Iyv6Iyr6IyX6IyY6I6F6I6a6I6q6I6f6I6i6I6W6Iyj6I6O6I6H6I6K6I286I616I2z6I216I6g6I6J6I6o6I+06JCT6I+r6I+O6I+96JCD6I+Y6JCL6I+B6I+36JCH6I+g6I+y6JCN6JCi6JCg6I696JC46JSG6I+76JGt6JCq6JC86JWa6JKE6JG36JGr6JKt6JGu6JKC6JGp6JGG6JCs6JGv6JG56JC16JOK6JGi6JK56JK/6JKf6JOZ6JON6JK76JOa6JOQ6JOB6JOG6JOW6JKh6JSh6JO/6JO06JSX6JSY6JSs6JSf6JSV6JSU6JO86JWA6JWj6JWY6JWIXCJcblx0XSxcblx0W1xuXHRcdFwiZTU0MFwiLFxuXHRcdFwi6JWB6JiC6JWL6JWV6JaA6Jak6JaI6JaR6JaK6Jao6JWt6JaU6Jab6Jeq6JaH6Jac6JW36JW+6JaQ6JeJ6Ja66JeP6Ja56JeQ6JeV6Jed6Jel6Jec6Je56JiK6JiT6JiL6Je+6Je66JiG6Jii6Jia6Jiw6Ji/6JmN5LmV6JmU6Jmf6Jmn6Jmx6JqT6Jqj6Jqp6Jqq6JqL6JqM6Jq26Jqv6JuE6JuG6Jqw6JuJ6KCj6Jqr6JuU6Jue6Jup6JusXCJcblx0XSxcblx0W1xuXHRcdFwiZTU4MFwiLFxuXHRcdFwi6Juf6Jub6Juv6JyS6JyG6JyI6JyA6JyD6Ju76JyR6JyJ6JyN6Ju56JyK6Jy06Jy/6Jy36Jy76Jyl6Jyp6Jya6J2g6J2f6J246J2M6J2O6J206J2X6J2o6J2u6J2Z6J2T6J2j6J2q6KCF6J6i6J6f6J6C6J6v6J+L6J696J+A6J+Q6ZuW6J6r6J+E6J6z6J+H6J+G6J676J+v6J+y6J+g6KCP6KCN6J++6J+26J+36KCO6J+S6KCR6KCW6KCV6KCi6KCh6KCx6KC26KC56KCn6KC76KGE6KGC6KGS6KGZ6KGe6KGi6KGr6KKB6KG+6KKe6KG16KG96KK16KGy6KKC6KKX6KKS6KKu6KKZ6KKi6KKN6KKk6KKw6KK/6KKx6KOD6KOE6KOU6KOY6KOZ6KOd6KO56KSC6KO86KO06KOo6KOy6KSE6KSM6KSK6KST6KWD6KSe6KSl6KSq6KSr6KWB6KWE6KS76KS26KS46KWM6KSd6KWg6KWeXCJcblx0XSxcblx0W1xuXHRcdFwiZTY0MFwiLFxuXHRcdFwi6KWm6KWk6KWt6KWq6KWv6KW06KW36KW+6KaD6KaI6KaK6KaT6KaY6Kah6Kap6Kam6Kas6Kav6Kay6Ka66Ka96Ka/6KeA6Kea6Kec6Ked6Ken6Ke06Ke46KiD6KiW6KiQ6KiM6Kib6Kid6Kil6Ki26KmB6Kmb6KmS6KmG6KmI6Km86Kmt6Kms6Kmi6KqF6KqC6KqE6Kqo6Kqh6KqR6Kql6Kqm6Kqa6Kqj6KuE6KuN6KuC6Kua6Kur6Kuz6KunXCJcblx0XSxcblx0W1xuXHRcdFwiZTY4MFwiLFxuXHRcdFwi6Kuk6Kux6KyU6Kug6Kui6Ku36Kue6Kub6KyM6KyH6Kya6Kuh6KyW6KyQ6KyX6Kyg6Kyz6Z6r6Kym6Kyr6Ky+6Kyo6K2B6K2M6K2P6K2O6K2J6K2W6K2b6K2a6K2r6K2f6K2s6K2v6K206K296K6A6K6M6K6O6K6S6K6T6K6W6K6Z6K6a6LC66LGB6LC/6LGI6LGM6LGO6LGQ6LGV6LGi6LGs6LG46LG66LKC6LKJ6LKF6LKK6LKN6LKO6LKU6LG86LKY5oid6LKt6LKq6LK96LKy6LKz6LKu6LK26LOI6LOB6LOk6LOj6LOa6LO96LO66LO76LSE6LSF6LSK6LSH6LSP6LSN6LSQ6b2O6LST6LON6LSU6LSW6LWn6LWt6LWx6LWz6LaB6LaZ6LeC6La+6La66LeP6Lea6LeW6LeM6Leb6LeL6Leq6Ler6Lef6Lej6Le86LiI6LiJ6Le/6Lid6Lie6LiQ6Lif6LmC6Li16Liw6Li06LmKXCJcblx0XSxcblx0W1xuXHRcdFwiZTc0MFwiLFxuXHRcdFwi6LmH6LmJ6LmM6LmQ6LmI6LmZ6Lmk6Lmg6Liq6Lmj6LmV6Lm26Lmy6Lm86LqB6LqH6LqF6LqE6LqL6LqK6LqT6LqR6LqU6LqZ6Lqq6Lqh6Lqs6Lqw6LuG6Lqx6Lq+6LuF6LuI6LuL6Lub6Luj6Lu86Lu76Lur6Lu+6LyK6LyF6LyV6LyS6LyZ6LyT6Lyc6Lyf6Lyb6LyM6Lym6Lyz6Ly76Ly56L2F6L2C6Ly+6L2M6L2J6L2G6L2O6L2X6L2cXCJcblx0XSxcblx0W1xuXHRcdFwiZTc4MFwiLFxuXHRcdFwi6L2i6L2j6L2k6L6c6L6f6L6j6L6t6L6v6L636L+a6L+l6L+i6L+q6L+v6YKH6L+06YCF6L+56L+66YCR6YCV6YCh6YCN6YCe6YCW6YCL6YCn6YC26YC16YC56L+46YGP6YGQ6YGR6YGS6YCO6YGJ6YC+6YGW6YGY6YGe6YGo6YGv6YG26Zqo6YGy6YKC6YG96YKB6YKA6YKK6YKJ6YKP6YKo6YKv6YKx6YK16YOi6YOk5omI6YOb6YSC6YSS6YSZ6YSy6YSw6YWK6YWW6YWY6YWj6YWl6YWp6YWz6YWy6YaL6YaJ6YaC6Yai6Yar6Yav6Yaq6Ya16Ya06Ya66YeA6YeB6YeJ6YeL6YeQ6YeW6Yef6Yeh6Yeb6Ye86Ye16Ye26Yie6Ye/6YiU6Yis6YiV6YiR6Yme6YmX6YmF6YmJ6Ymk6YmI6YqV6Yi/6YmL6YmQ6Yqc6YqW6YqT6Yqb6Yma6YuP6Yq56Yq36Yup6YyP6Yu66Y2E6YyuXCJcblx0XSxcblx0W1xuXHRcdFwiZTg0MFwiLFxuXHRcdFwi6YyZ6Yyi6Yya6Yyj6Yy66Yy16Yy76Y2c6Y2g6Y286Y2u6Y2W6Y6w6Y6s6Y6t6Y6U6Y656Y+W6Y+X6Y+o6Y+l6Y+Y6Y+D6Y+d6Y+Q6Y+I6Y+k6ZCa6ZCU6ZCT6ZCD6ZCH6ZCQ6ZC26ZCr6ZC16ZCh6ZC66ZGB6ZGS6ZGE6ZGb6ZGg6ZGi6ZGe6ZGq6Yip6ZGw6ZG16ZG36ZG96ZGa6ZG86ZG+6ZKB6ZG/6ZaC6ZaH6ZaK6ZaU6ZaW6ZaY6ZaZXCJcblx0XSxcblx0W1xuXHRcdFwiZTg4MFwiLFxuXHRcdFwi6Zag6Zao6Zan6Zat6Za86Za76Za56Za+6ZeK5r+26ZeD6ZeN6ZeM6ZeV6ZeU6ZeW6Zec6Zeh6Zel6Zei6Zih6Zio6Ziu6Ziv6ZmC6ZmM6ZmP6ZmL6Zm36Zmc6Zme6Zmd6Zmf6Zmm6Zmy6Zms6ZqN6ZqY6ZqV6ZqX6Zqq6Zqn6Zqx6Zqy6Zqw6Zq06Zq26Zq46Zq56ZuO6ZuL6ZuJ6ZuN6KWN6Zuc6ZyN6ZuV6Zu56ZyE6ZyG6ZyI6ZyT6ZyO6ZyR6ZyP6ZyW6ZyZ6Zyk6Zyq6Zyw6Zy56Zy96Zy+6Z2E6Z2G6Z2I6Z2C6Z2J6Z2c6Z2g6Z2k6Z2m6Z2o5YuS6Z2r6Z2x6Z256Z6F6Z286Z6B6Z266Z6G6Z6L6Z6P6Z6Q6Z6c6Z6o6Z6m6Z6j6Z6z6Z606Z+D6Z+G6Z+I6Z+L6Z+c6Z+t6b2P6Z+y56uf6Z+26Z+16aCP6aCM6aC46aCk6aCh6aC36aC96aGG6aGP6aGL6aGr6aGv6aGwXCJcblx0XSxcblx0W1xuXHRcdFwiZTk0MFwiLFxuXHRcdFwi6aGx6aG06aGz6aKq6aKv6aKx6aK26aOE6aOD6aOG6aOp6aOr6aSD6aSJ6aSS6aSU6aSY6aSh6aSd6aSe6aSk6aSg6aSs6aSu6aS96aS+6aWC6aWJ6aWF6aWQ6aWL6aWR6aWS6aWM6aWV6aaX6aaY6aal6aat6aau6aa86aef6aeb6aed6aeY6aeR6aet6aeu6aex6aey6ae76ae46aiB6aiP6aiF6aei6aiZ6air6ai36amF6amC6amA6amDXCJcblx0XSxcblx0W1xuXHRcdFwiZTk4MFwiLFxuXHRcdFwi6ai+6amV6amN6amb6amX6amf6ami6aml6amk6amp6amr6amq6aqt6aqw6aq86auA6auP6auR6auT6auU6aue6auf6aui6auj6aum6auv6aur6auu6au06aux6au36au76ayG6ayY6aya6ayf6ayi6ayj6ayl6ayn6ayo6ayp6ayq6ayu6ayv6ayy6a2E6a2D6a2P6a2N6a2O6a2R6a2Y6a206a6T6a6D6a6R6a6W6a6X6a6f6a6g6a6o6a606a+A6a+K6a656a+G6a+P6a+R6a+S6a+j6a+i6a+k6a+U6a+h6bC66a+y6a+x6a+w6bCV6bCU6bCJ6bCT6bCM6bCG6bCI6bCS6bCK6bCE6bCu6bCb6bCl6bCk6bCh6bCw6bGH6bCy6bGG6bC+6bGa6bGg6bGn6bG26bG46bOn6bOs6bOw6bSJ6bSI6bOr6bSD6bSG6bSq6bSm6bav6bSj6bSf6bWE6bSV6bSS6bWB6bS/6bS+6bWG6bWIXCJcblx0XSxcblx0W1xuXHRcdFwiZWE0MFwiLFxuXHRcdFwi6bWd6bWe6bWk6bWR6bWQ6bWZ6bWy6baJ6baH6bar6bWv6bW66baa6bak6bap6bay6beE6beB6ba76ba46ba66beG6beP6beC6beZ6beT6be46bem6bet6bev6be96bia6bib6bie6bm16bm56bm96bqB6bqI6bqL6bqM6bqS6bqV6bqR6bqd6bql6bqp6bq46bqq6bqt6Z2h6buM6buO6buP6buQ6buU6buc6bue6bud6bug6bul6buo6buvXCJcblx0XSxcblx0W1xuXHRcdFwiZWE4MFwiLFxuXHRcdFwi6bu06bu26bu36bu56bu76bu86bu96byH6byI55q36byV6byh6bys6by+6b2K6b2S6b2U6b2j6b2f6b2g6b2h6b2m6b2n6b2s6b2q6b236b2y6b226b6V6b6c6b6g5aCv5qeH6YGZ55Gk5Yec54aZXCJcblx0XSxcblx0W1xuXHRcdFwiZWQ0MFwiLFxuXHRcdFwi57qK6KSc6Y2I6YqI6JOc5L+J54K75pix5qOI6Yu55pu75b2F5Lio5Luh5Lu85LyA5LyD5Ly55L2W5L6S5L6K5L6a5L6U5L+N5YGA5YCi5L+/5YCe5YGG5YGw5YGC5YKU5YO05YOY5YWK5YWk5Yad5Ya+5Yes5YiV5Yqc5Yqm5YuA5Yub5YyA5YyH5Yyk5Y2y5Y6T5Y6y5Y+d76iO5ZKc5ZKK5ZKp5ZO/5ZaG5Z2Z5Z2l5Z6s5Z+I5Z+H76iPXCJcblx0XSxcblx0W1xuXHRcdFwiZWQ4MFwiLFxuXHRcdFwi76iQ5aKe5aKy5aSL5aWT5aWb5aWd5aWj5aak5aa65a2W5a+A55Sv5a+Y5a+s5bCe5bKm5bK65bO15bSn5bWT76iR5bWC5bWt5ba45ba55beQ5byh5by05b2n5b635b+e5oGd5oKF5oKK5oOe5oOV5oSg5oOy5oSR5oS35oSw5oaY5oiT5oqm5o+15pGg5pKd5pOO5pWO5piA5piV5pi75piJ5piu5pie5pik5pml5pmX5pmZ76iS5pmz5pqZ5pqg5pqy5pq/5pu65pyO76Sp5p2m5p675qGS5p+A5qCB5qGE5qOP76iT5qWo76iU5qaY5qei5qiw5qmr5qmG5qmz5qm+5qui5quk5q+W5rC/5rGc5rKG5rGv5rOa5rSE5raH5rWv5raW5ras5reP5re45rey5re85ri55rmc5rin5ri85rq/5r6I5r615r+154CF54CH54Co54KF54Kr54SP54SE54Wc54WG54WH76iV54eB54e+54qxXCJcblx0XSxcblx0W1xuXHRcdFwiZWU0MFwiLFxuXHRcdFwi54q+54yk76iW5423546954+J54+W54+j54+S55CH54+155Cm55Cq55Cp55Cu55Gi55KJ55Kf55SB55Wv55qC55qc55qe55qb55qm76iX552G5Yqv56Ch56GO56Gk56G656Sw76iY76iZ76ia56aU76ib56ab56uR56un76ic56ur566e76id57WI57Wc57a357ag57eW57mS572H576h76ie6IyB6I2i6I2/6I+H6I+26JGI6JK06JWT6JWZXCJcblx0XSxcblx0W1xuXHRcdFwiZWU4MFwiLFxuXHRcdFwi6JWr76if6Jaw76ig76ih6KCH6KO16KiS6Ki36Km56Kqn6Kq+6Kuf76ii6Ku26K2T6K2/6LOw6LO06LSS6LW276ij6LuP76ik76il6YGn6YOe76im6YSV6YSn6Yea6YeX6Yee6Yet6Yeu6Yek6Yel6YiG6YiQ6YiK6Yi66YmA6Yi86YmO6YmZ6YmR6Yi56Ymn6Yqn6Ym36Ym46Yun6YuX6YuZ6YuQ76in6YuV6Yug6YuT6Yyl6Yyh6Yu776io6Yye6Yu/6Yyd6YyC6Y2w6Y2X6Y6k6Y+G6Y+e6Y+46ZCx6ZGF6ZGI6ZaS76ec76ip6Zqd6Zqv6Zyz6Zy76Z2D6Z2N6Z2P6Z2R6Z2V6aGX6aGl76iq76ir6aSn76is6aae6amO6auZ6auc6a216a2y6a6P6a6x6a676bCA6bWw6bWr76it6biZ6buRXCJcblx0XSxcblx0W1xuXHRcdFwiZWVlZlwiLFxuXHRcdFwi4oWwXCIsXG5cdFx0OSxcblx0XHRcIu+/ou+/pO+8h++8glwiXG5cdF0sXG5cdFtcblx0XHRcImYwNDBcIixcblx0XHRcIu6AgFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImYwODBcIixcblx0XHRcIu6Av1wiLFxuXHRcdDEyNFxuXHRdLFxuXHRbXG5cdFx0XCJmMTQwXCIsXG5cdFx0XCLugrxcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmMTgwXCIsXG5cdFx0XCLug7tcIixcblx0XHQxMjRcblx0XSxcblx0W1xuXHRcdFwiZjI0MFwiLFxuXHRcdFwi7oW4XCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjI4MFwiLFxuXHRcdFwi7oa3XCIsXG5cdFx0MTI0XG5cdF0sXG5cdFtcblx0XHRcImYzNDBcIixcblx0XHRcIu6ItFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImYzODBcIixcblx0XHRcIu6Js1wiLFxuXHRcdDEyNFxuXHRdLFxuXHRbXG5cdFx0XCJmNDQwXCIsXG5cdFx0XCLui7BcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmNDgwXCIsXG5cdFx0XCLujK9cIixcblx0XHQxMjRcblx0XSxcblx0W1xuXHRcdFwiZjU0MFwiLFxuXHRcdFwi7o6sXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjU4MFwiLFxuXHRcdFwi7o+rXCIsXG5cdFx0MTI0XG5cdF0sXG5cdFtcblx0XHRcImY2NDBcIixcblx0XHRcIu6RqFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImY2ODBcIixcblx0XHRcIu6Sp1wiLFxuXHRcdDEyNFxuXHRdLFxuXHRbXG5cdFx0XCJmNzQwXCIsXG5cdFx0XCLulKRcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmNzgwXCIsXG5cdFx0XCLulaNcIixcblx0XHQxMjRcblx0XSxcblx0W1xuXHRcdFwiZjg0MFwiLFxuXHRcdFwi7pegXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjg4MFwiLFxuXHRcdFwi7pifXCIsXG5cdFx0MTI0XG5cdF0sXG5cdFtcblx0XHRcImY5NDBcIixcblx0XHRcIu6anFwiXG5cdF0sXG5cdFtcblx0XHRcImZhNDBcIixcblx0XHRcIuKFsFwiLFxuXHRcdDksXG5cdFx0XCLihaBcIixcblx0XHQ5LFxuXHRcdFwi77+i77+k77yH77yC44ix4oSW4oSh4oi157qK6KSc6Y2I6YqI6JOc5L+J54K75pix5qOI6Yu55pu75b2F5Lio5Luh5Lu85LyA5LyD5Ly55L2W5L6S5L6K5L6a5L6U5L+N5YGA5YCi5L+/5YCe5YGG5YGw5YGC5YKU5YO05YOY5YWKXCJcblx0XSxcblx0W1xuXHRcdFwiZmE4MFwiLFxuXHRcdFwi5YWk5Yad5Ya+5Yes5YiV5Yqc5Yqm5YuA5Yub5YyA5YyH5Yyk5Y2y5Y6T5Y6y5Y+d76iO5ZKc5ZKK5ZKp5ZO/5ZaG5Z2Z5Z2l5Z6s5Z+I5Z+H76iP76iQ5aKe5aKy5aSL5aWT5aWb5aWd5aWj5aak5aa65a2W5a+A55Sv5a+Y5a+s5bCe5bKm5bK65bO15bSn5bWT76iR5bWC5bWt5ba45ba55beQ5byh5by05b2n5b635b+e5oGd5oKF5oKK5oOe5oOV5oSg5oOy5oSR5oS35oSw5oaY5oiT5oqm5o+15pGg5pKd5pOO5pWO5piA5piV5pi75piJ5piu5pie5pik5pml5pmX5pmZ76iS5pmz5pqZ5pqg5pqy5pq/5pu65pyO76Sp5p2m5p675qGS5p+A5qCB5qGE5qOP76iT5qWo76iU5qaY5qei5qiw5qmr5qmG5qmz5qm+5qui5quk5q+W5rC/5rGc5rKG5rGv5rOa5rSE5raH5rWvXCJcblx0XSxcblx0W1xuXHRcdFwiZmI0MFwiLFxuXHRcdFwi5raW5ras5reP5re45rey5re85ri55rmc5rin5ri85rq/5r6I5r615r+154CF54CH54Co54KF54Kr54SP54SE54Wc54WG54WH76iV54eB54e+54qx54q+54yk76iW5423546954+J54+W54+j54+S55CH54+155Cm55Cq55Cp55Cu55Gi55KJ55Kf55SB55Wv55qC55qc55qe55qb55qm76iX552G5Yqv56Ch56GO56Gk56G656Sw76iY76iZXCJcblx0XSxcblx0W1xuXHRcdFwiZmI4MFwiLFxuXHRcdFwi76ia56aU76ib56ab56uR56un76ic56ur566e76id57WI57Wc57a357ag57eW57mS572H576h76ie6IyB6I2i6I2/6I+H6I+26JGI6JK06JWT6JWZ6JWr76if6Jaw76ig76ih6KCH6KO16KiS6Ki36Km56Kqn6Kq+6Kuf76ii6Ku26K2T6K2/6LOw6LO06LSS6LW276ij6LuP76ik76il6YGn6YOe76im6YSV6YSn6Yea6YeX6Yee6Yet6Yeu6Yek6Yel6YiG6YiQ6YiK6Yi66YmA6Yi86YmO6YmZ6YmR6Yi56Ymn6Yqn6Ym36Ym46Yun6YuX6YuZ6YuQ76in6YuV6Yug6YuT6Yyl6Yyh6Yu776io6Yye6Yu/6Yyd6YyC6Y2w6Y2X6Y6k6Y+G6Y+e6Y+46ZCx6ZGF6ZGI6ZaS76ec76ip6Zqd6Zqv6Zyz6Zy76Z2D6Z2N6Z2P6Z2R6Z2V6aGX6aGl76iq76ir6aSn76is6aae6amO6auZXCJcblx0XSxcblx0W1xuXHRcdFwiZmM0MFwiLFxuXHRcdFwi6auc6a216a2y6a6P6a6x6a676bCA6bWw6bWr76it6biZ6buRXCJcblx0XVxuXTtcblxudmFyIHNoaWZ0amlzJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0J2RlZmF1bHQnOiBzaGlmdGppc1xufSk7XG5cbnZhciBldWNqcCA9IFtcblx0W1xuXHRcdFwiMFwiLFxuXHRcdFwiXFx1MDAwMFwiLFxuXHRcdDEyN1xuXHRdLFxuXHRbXG5cdFx0XCI4ZWExXCIsXG5cdFx0XCLvvaFcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJhMWExXCIsXG5cdFx0XCLjgIDjgIHjgILvvIzvvI7jg7vvvJrvvJvvvJ/vvIHjgpvjgpzCtO+9gMKo77y+77+j77y/44O944O+44Kd44Ke44CD5Lud44CF44CG44CH44O84oCV4oCQ77yP77y8772e4oil772c4oCm4oCl4oCY4oCZ4oCc4oCd77yI77yJ44CU44CV77y777y9772b772d44CIXCIsXG5cdFx0OSxcblx0XHRcIu+8i++8jcKxw5fDt++8neKJoO+8nO+8nuKJpuKJp+KInuKItOKZguKZgMKw4oCy4oCz4oSD77+l77yE77+g77+h77yF77yD77yG77yK77ygwqfimIbimIXil4vil4/il47il4dcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMmExXCIsXG5cdFx0XCLil4bilqHilqDilrPilrLilr3ilrzigLvjgJLihpLihpDihpHihpPjgJNcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMmJhXCIsXG5cdFx0XCLiiIjiiIviiobiiofiioLiioPiiKriiKlcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMmNhXCIsXG5cdFx0XCLiiKfiiKjvv6Lih5Lih5TiiIDiiINcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMmRjXCIsXG5cdFx0XCLiiKDiiqXijJLiiILiiIfiiaHiiZLiiariiaviiJriiL3iiJ3iiLXiiKviiKxcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMmYyXCIsXG5cdFx0XCLihKvigLDima/ima3imarigKDigKHCtlwiXG5cdF0sXG5cdFtcblx0XHRcImEyZmVcIixcblx0XHRcIuKXr1wiXG5cdF0sXG5cdFtcblx0XHRcImEzYjBcIixcblx0XHRcIu+8kFwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiYTNjMVwiLFxuXHRcdFwi77yhXCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiYTNlMVwiLFxuXHRcdFwi772BXCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiYTRhMVwiLFxuXHRcdFwi44GBXCIsXG5cdFx0ODJcblx0XSxcblx0W1xuXHRcdFwiYTVhMVwiLFxuXHRcdFwi44KhXCIsXG5cdFx0ODVcblx0XSxcblx0W1xuXHRcdFwiYTZhMVwiLFxuXHRcdFwizpFcIixcblx0XHQxNixcblx0XHRcIs6jXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJhNmMxXCIsXG5cdFx0XCLOsVwiLFxuXHRcdDE2LFxuXHRcdFwiz4NcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImE3YTFcIixcblx0XHRcItCQXCIsXG5cdFx0NSxcblx0XHRcItCB0JZcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCJhN2QxXCIsXG5cdFx0XCLQsFwiLFxuXHRcdDUsXG5cdFx0XCLRkdC2XCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiYThhMVwiLFxuXHRcdFwi4pSA4pSC4pSM4pSQ4pSY4pSU4pSc4pSs4pSk4pS04pS84pSB4pSD4pSP4pST4pSb4pSX4pSj4pSz4pSr4pS74pWL4pSg4pSv4pSo4pS34pS/4pSd4pSw4pSl4pS44pWCXCJcblx0XSxcblx0W1xuXHRcdFwiYWRhMVwiLFxuXHRcdFwi4pGgXCIsXG5cdFx0MTksXG5cdFx0XCLihaBcIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcImFkYzBcIixcblx0XHRcIuONieOMlOOMouONjeOMmOOMp+OMg+OMtuONkeONl+OMjeOMpuOMo+OMq+ONiuOMu+OOnOOOneOOnuOOjuOOj+OPhOOOoVwiXG5cdF0sXG5cdFtcblx0XHRcImFkZGZcIixcblx0XHRcIuONu+OAneOAn+KEluOPjeKEoeOKpFwiLFxuXHRcdDQsXG5cdFx0XCLjiLHjiLLjiLnjjb7jjb3jjbziiZLiiaHiiKviiK7iiJHiiJriiqXiiKDiiJ/iir/iiLXiiKniiKpcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMGExXCIsXG5cdFx0XCLkupzllJblqIPpmL/lk4DmhJvmjKjlp7bpgKLokbXojJznqZDmgqrmj6HmuKXml63okaboiqbpr7XmopPlnKfmlqHmibHlrpvlp5Dombvpo7TntaLntr7pro7miJbnsp/oorflronlurXmjInmmpfmoYjpl4fpno3mnY/ku6XkvIrkvY3kvp3lgYnlm7LlpLflp5TlqIHlsInmg5/mhI/mhbDmmJPmpIXngrrnlY/nlbDnp7vntq3nt6/og4PokI7ooaPorILpgZXpgbrljLvkupXkuqXln5/ogrLpg4Hno6/kuIDlo7HmuqLpgLjnqLLojKjoiovpsK/lhYHljbDlkr3lk6Hlm6Dlp7vlvJXpo7Lmt6vog6TolK1cIlxuXHRdLFxuXHRbXG5cdFx0XCJiMWExXCIsXG5cdFx0XCLpmaLpmbDpmqDpn7vlkIvlj7Plrofng4/nvr3ov4Lpm6jlja/ptZznqrrkuJHnopPoh7zmuKblmJjllITmrJ3olJrpsLvlp6Xljqnmtabnk5zplo/lmYLkupHpgYvpm7LojY/ppIzlj6HllrblrLDlvbHmmKDmm7PmoITmsLjms7PmtKnnkZvnm4jnqY7poLToi7HooZvoqaDpi63mtrLnlqvnm4rpp4XmgqborIHotorplrLmpo7ljq3lhoblnJLloLDlpYTlrrTlu7bmgKjmjqnmj7Tmsr/mvJTngo7nhJTnhZnnh5XnjL/nuIHoibboi5HolpfpgaDpiZvptJvloanmlrzmsZrnlKXlh7nlpK7lpaXlvoDlv5xcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMmExXCIsXG5cdFx0XCLmirzml7rmqKrmrKfmrrTnjovnv4HopZbptKzptI7pu4TlsqHmspbojbvlhITlsYvmhrboh4bmobbniaHkuZnkv7rljbjmganmuKnnqY/pn7PkuIvljJbku67kvZXkvL3kvqHkvbPliqDlj6/lmInlpI/lq4Hlrrblr6Hnp5HmmofmnpzmnrbmrYzmsrPngavnj4Lnpo3npr7nqLznrofoirHoi5vojITojbfoj6/oj5PonaboqrLlmKnosqjov6bpgY7pnJ7omorkv4Tls6jmiJHniZnnlLvoh6Xoir3om77os4Dpm4XppJPpp5Xku4vkvJrop6Plm57loYrlo4rlu7vlv6vmgKrmgpTmgaLmh5DmiJLmi5DmlLlcIlxuXHRdLFxuXHRbXG5cdFx0XCJiM2ExXCIsXG5cdFx0XCLprYHmmabmorDmtbfngbDnlYznmobntbXoiqXon7nplovpmo7osp3lh7Hlir7lpJblkrPlrrPltJbmhajmpoLmtq/noo3ok4vooZfoqbLpjqfpqrjmtazppqjom5nlnqPmn7/om47piI7lioPlmoflkITlu5Pmi6HmkrnmoLzmoLjmrrvnjbLnorrnqavopprop5LotavovIPpg63plqPpmpTpnanlrablsrPmpb3poY3poY7mjpvnrKDmqKvmqb/morbpsI3mvZ/libLllp3mgbDmi6zmtLvmuIfmu5HokZvopJDovYTkuJTpsLnlj7bmpJvmqLrpnoTmoKrlhZznq4PokrLph5zpjozlmZvptKjmoKLojIXokLFcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNGExXCIsXG5cdFx0XCLnsqXliIjoi4Xnk6bkub7kvoPlhqDlr5LliIrli5jli6flt7vllprloKrlp6blrozlrpjlr5vlubLlubnmgqPmhJ/mhaPmhr7mj5vmlaLmn5HmoZPmo7rmrL7mrZPmsZfmvKLmvpfmvYXnkrDnlJjnm6PnnIvnq7/nrqHnsKHnt6nnvLbnv7Dogp3oiabojp7oprPoq4zosqvpgoTpkZHplpPplpHplqLpmaXpn5PppKjoiJjkuLjlkKvlsrjlt4znjqnnmYznnLzlsqnnv6votIvpm4HpoJHpoZTpoZjkvIHkvI7ljbHllpzlmajln7rlpYflrInlr4TlspDluIzlub7lv4zmj67mnLrml5fml6LmnJ/mo4vmo4RcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNWExXCIsXG5cdFx0XCLmqZ/luLDmr4XmsJfmsb3nlb/npYjlraPnqIDntIDlvr3opo/oqJjosrTotbfou4zovJ3po6LpqI7prLzkuoDlgb3lhIDlppPlrpzmiK/mioDmk6zmrLrniqDnlpHnpYfnvqnon7voqrzorbDmjqzoj4rpnqDlkInlkIPllqvmoZTmqZjoqbDnoKfmnbXpu43ljbTlrqLohJromZDpgIbkuJjkuYXku4fkvJHlj4rlkLjlrq7lvJPmgKXmlZHmnL3msYLmsbLms6PngbjnkIPnqbbnqq7nrIjntJrns77ntabml6fniZvljrvlsYXlt6jmi5Lmi6DmjJnmuKDomZroqLHot53pi7jmvIHnpqbprZrkuqjkuqvkuqxcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNmExXCIsXG5cdFx0XCLkvpvkvqDlg5HlhYfnq7blhbHlh7bljZTljKHljb/lj6vllqzlooPls6HlvLflvYrmgK/mgZDmga3mjJ/mlZnmqYvms4Hni4Lni63nn6/og7johIXoiIjolY7pg7fpj6Hpn7/ppZfpqZrku7Dlh53lsK3mmoHmpa3lsYDmm7LmpbXnjonmoZDnsoHlg4Xli6TlnYflt77pjKbmlqTmrKPmrL3nkLTnpoHnpr3nrYvnt4roirnoj4zoob/opZ/orLnov5Hph5HlkJ/pioDkuZ3lgLblj6XljLrni5fnjpbnn6noi6bouq/pp4bpp4jpp5LlhbfmhJromZ7llrDnqbrlgbblr5PpgYfpmoXkuLLmq5vph6flsZHlsYhcIlxuXHRdLFxuXHRbXG5cdFx0XCJiN2ExXCIsXG5cdFx0XCLmjpjnqp/mspPpnbTovaHnqqrnhorpmojnsoLmoJfnubDmoZHpjazli7LlkJvolqvoqJPnvqTou43pg6HljabooojnpYHkv4Llgr7liJHlhYTllZPlnK3nj6rlnovlpZHlvaLlvoTmgbXmhbbmhafmhqnmjrLmkLrmlazmma/moYLmuJPnlabnqL3ns7vntYzntpnnuYvnvavojI7ojYrom43oqIjoqaPorabou73poJrpto/oirjov47pr6jliofmiJ/mkoPmv4DpmpnmoYHlgpHmrKDmsbrmvZTnqbTntZDooYDoqKPmnIjku7blgLnlgKblgaXlhbzliLjliaPllqflnI/loIXlq4zlu7rmhrLmh7jmi7PmjbJcIlxuXHRdLFxuXHRbXG5cdFx0XCJiOGExXCIsXG5cdFx0XCLmpJzmqKnnib3niqznjK7noJTnoa/ntbnnnIzogqnopovorJnos6Lou5LpgaPpjbXpmbrpoZXpqJPpubjlhYPljp/ljrPlubvlvKbmuJvmupDnjoTnj77ntYPoiLfoqIDoq7rpmZDkuY7lgIvlj6Tlkbzlm7rlp5HlraTlt7HluqvlvKfmiLjmlYXmnq/muZbni5Dns4roorTogqHog6Hoj7DomY7oqofot6jpiLfpm4fpoafpvJPkupTkupLkvI3ljYjlkYnlkL7lqK/lvozlvqHmgp/moqfmqo7nkZrnooHoqp7oqqTorbfphpDkuZ7pr4nkuqTkvbzkvq/lgJnlgJblhYnlhazlip/lirnli77ljprlj6PlkJFcIlxuXHRdLFxuXHRbXG5cdFx0XCJiOWExXCIsXG5cdFx0XCLlkI7llonlnZHlnqLlpb3lrZTlrZ3lro/lt6Xlt6flt7flubjluoPluprlurflvJjmgZLmhYzmipfmi5jmjqfmlLvmmILmmYPmm7Tmna3moKHmopfmp4vmsZ/mtKrmtanmuK/mup3nlLLnmofnoaznqL/ns6DntIXntJjntZ7ntrHogJXogIPogq/ogrHohZToho/oiKrojZLooYzooaHorJvosqLos7zpg4rphbXpibHnoL/pi7zplqTpmY3poIXpppnpq5jptLvliZvliqvlj7flkIjlo5Xmi7fmv6DosarovZ/purnlhYvliLvlkYrlm73nqYDphbfptaDpu5LnjYTmvInohbDnlJHlv73mg5rpqqjni5vovrxcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYWExXCIsXG5cdFx0XCLmraTpoIPku4rlm7DlnaTlor7lqZrmgajmh4fmmI/mmIbmoLnmorHmt7fnl5XntLroia7prYLkupvkvZDlj4nllIblta/lt6blt67mn7vmspnnkbPnoILoqZDpjpboo5/lnZDluqfmjKvlgrXlgqzlho3mnIDlk4nloZ7lprvlrrDlvanmiY3mjqHmoL3mrbPmuIjngb3ph4fnioDnoJXnoKbnpa3mlo7ntLDoj5zoo4HovInpmpvliaTlnKjmnZDnvarosqHlhrTlnYLpmKrloLrmporogrTlkrLltI7ln7znopXpt7rkvZzliYrlkovmkL7mmKjmnJTmn7XnqoTnrZbntKLpjK/moZzprq3nrLnljJnlhorliLdcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYmExXCIsXG5cdFx0XCLlr5/mi7bmkq7mk6bmnK3mrrrolqnpm5HnmpDpr5bmjYzpjIbprqvnmr/mmZLkuInlgpjlj4LlsbHmg6jmkpLmlaPmoZ/nh6bnj4rnlKPnrpfnuoLompXoroPos5vphbjppJDmlqzmmqvmrovku5Xku5TkvLrkvb/liLrlj7jlj7Lll6Plm5vlo6vlp4vlp4nlp7/lrZDlsY3luILluKvlv5fmgJ3mjIfmlK/lrZzmlq/mlr3ml6jmnp3mraLmrbvmsI/njYXnpYnnp4Hns7jntJnntKvogqLohILoh7PoppboqZ7oqanoqaboqozoq67os4fos5zpm4zpo7zmra/kuovkvLzkvo3lhZDlrZflr7rmhYjmjIHmmYJcIlxuXHRdLFxuXHRbXG5cdFx0XCJiY2ExXCIsXG5cdFx0XCLmrKHmu4vmsrvniL7nkr3nl5Tno4HnpLrogIzogLPoh6rokpTovp7msZDpub/lvI/orZjptKvnq7rou7jlro3pm6vkuIPlj7Hln7flpLHlq4nlrqTmgonmub/mvIbnlr7os6rlrp/olIDnr6DlgbLmn7Toip3lsaHolYrnuJ7oiI7lhpnlsITmjajotabmlpznha7npL7ntJfogIXorJ3ou4rpga7om4fpgqrlgJ/li7rlsLrmnZPngbzniLXphYzph4jpjKvoi6Xlr4LlvLHmg7nkuLvlj5blrojmiYvmnLHmrorni6nnj6DnqK7ohavotqPphZLpppblhJLlj5flkarlr7/mjojmqLnntqzpnIDlm5rlj47lkahcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZGExXCIsXG5cdFx0XCLlrpflsLHlt57kv67mhIHmi77mtLLnp4Dnp4vntYLnuY3nv5Loh63oiJ/okpDooYbopbLorpDoubTovK/pgLHphYvphazpm4bphpzku4DkvY/lhYXljYHlvpPmiI7mn5TmsYHmuIvnjaPnuKbph43pioPlj5TlpJnlrr/mt5HnpZ3nuK7nspvlob7nhp/lh7rooZPov7Dkv4rls7vmmKXnnqznq6PoiJzpp7/lh4blvqrml6zmpa/mronmt7PmupbmvaTnm77ntJTlt6HpgbXphofpoIblh6bliJ3miYDmmpHmm5nmuJrlurbnt5LnvbLmm7jolq/ol7foq7jliqnlj5nlpbPluo/lvpDmgZXpi6TpmaTlgrflhJ9cIlxuXHRdLFxuXHRbXG5cdFx0XCJiZWExXCIsXG5cdFx0XCLli53ljKDljYflj6zlk6jllYbllLHlmJflpajlpr7lqLzlrrXlsIblsI/lsJHlsJrluoTluorlu6DlvbDmib/mioTmi5vmjozmjbfmmIfmmIzmmK3mmbbmnb7moqLmqJ/mqLXmsrzmtojmuInmuZjnhLznhKbnhafnl4fnnIHnoZ3npIHnpaXnp7Dnq6DnrJHnsqfntLnogpboj5bokovolYnooZ3oo7PoqJ/oqLzoqZToqbPosaHos57phqTpiabpjb7pkJjpmpzpnpjkuIrkuIjkuJ7kuZflhpflibDln47loLTlo4zlrKLluLjmg4Xmk77mnaHmnZbmtYTnirbnlbPnqaPokrjorbLphrjpjKDlmLHln7Tpo75cIlxuXHRdLFxuXHRbXG5cdFx0XCJiZmExXCIsXG5cdFx0XCLmi63mpI3mrpbnh63nuZTogbfoibLop6bpo5/onZXovrHlsLvkvLjkv6HkvrXllIflqKDlr53lr6nlv4PmhY7mjK/mlrDmmYvmo67mppvmtbjmt7HnlLPnlrnnnJ/npZ7np6bntLPoh6Poiq/olqropqroqLrouqvovpvpgLLph53pnIfkurrku4HliIPlobXlo6zlsIvnlJrlsL3ohY7oqIrov4XpmaPpna3nrKXoq4/poIjphaLlm7PljqjpgJflkLnlnoLluKXmjqjmsLTngornnaHnsovnv6DoobDpgYLphZTpjJDpjJjpmo/nkZ7pq4TltIfltanmlbDmnqLotqjpm5vmja7mnYnmpJnoj4XpoJfpm4Doo75cIlxuXHRdLFxuXHRbXG5cdFx0XCJjMGExXCIsXG5cdFx0XCLmvoTmkbrlr7jkuJbngKznlZ3mmK/lh4TliLbli6Llp5PlvoHmgKfmiJDmlL/mlbTmmJ/mmbTmo7LmoJbmraPmuIXnibLnlJ/nm5vnsr7ogZblo7Doo73opb/oqqDoqpPoq4vpgJ3phpLpnZLpnZnmlonnqI7ohIbpmrvluK3mg5zmiJrmlqXmmJTmnpDnn7PnqY3nsY3nuL7ohIrosqzotaTot6HouZ/noqnliIfmi5nmjqXmkYLmipjoqK3nqoPnr4Doqqzpm6rntbboiIzonYnku5nlhYjljYPljaDlrqPlsILlsJblt53miKbmiYfmkrDmoJPmoLTms4nmtYXmtJfmn5PmvZznhY7nhb3ml4vnqb/nrq3nt5pcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMWExXCIsXG5cdFx0XCLnuYrnvqjohbroiJvoiLnolqboqa7os47ot7Xpgbjpgbfpiq3pipHploPprq7liY3lloTmvLjnhLblhajnpoXnuZXohrPns47lmYzloZHlsqjmjqrmm77mm73mpZrni5nnlo/nlo7npI7npZbnp5/nspfntKDntYTomIfoqLTpmLvpgaHpvKDlg6flibXlj4zlj6LlgInllqrlo67lpY/niL3lrovlsaTljJ3mg6Pmg7PmjZzmjoPmjL/mjrvmk43ml6nmm7nlt6Pmp43mp73mvJXnh6Xkuonnl6nnm7jnqpPns5/nt4/ntpzogaHojYnojZjokazokrzol7voo4XotbDpgIHpga3pjpfpnJzpqJLlg4/lopfmho5cIlxuXHRdLFxuXHRbXG5cdFx0XCJjMmExXCIsXG5cdFx0XCLoh5PolLXotIjpgKDkv4PlgbTliYfljbPmga/mjYnmnZ/muKzotrPpgJ/kv5flsZ7os4rml4/ntprljZLoopblhbbmj4PlrZjlravlsIrmkI3mnZHpgZzku5blpJrlpKrmsbDoqZHllL7loJXlpqXmg7DmiZPmn4HoiLXmpZXpmYDpp4TpqKjkvZPloIblr77ogJDlsrHluK/lvoXmgKDmhYvmiLTmm7/ms7Dmu57og47ohb/oi5TooovosrjpgIDpgK7pmorpu5vpr5vku6Plj7DlpKfnrKzpho3poYzpt7nmu53ngKfljZPllYTlroXmiZjmip7mi5PmsqLmv6/nkKLoqJfpkLjmv4Hoq77ojLjlh6fom7jlj6pcIlxuXHRdLFxuXHRbXG5cdFx0XCJjM2ExXCIsXG5cdFx0XCLlj6nkvYbpgZTovrDlparohLHlt73nq6rovr/mo5rosLfni7jpsYjmqL3oqrDkuLnljZjlmIblnabmi4XmjqLml6bmrY7mt6HmuZvngq3nn63nq6/nrqrntrvogL3og4bom4voqpXpjZvlm6Plo4flvL7mlq3mmpbmqoDmrrXnlLfoq4flgKTnn6XlnLDlvJvmgaXmmbrmsaDnl7TnqJrnva7oh7TonJjpgYXpprPnr4nnlZznq7nnrZHok4TpgJDnp6nnqpLojLblq6HnnYDkuK3ku7Llrpnlv6Dmir3mmLzmn7Hms6jomavoobfoqLvphY7pi7Ppp5DmqJfngKbnjKroi6fokZfosq/kuIHlhYblh4vllovlr7VcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNGExXCIsXG5cdFx0XCLluJbluLPluoHlvJTlvLXlvavlvrTmh7LmjJHmmqLmnJ3mva7niZLnlLrnnLrogbTohLnohbjonbboqr/oq5zotoXot7PpiprplbfpoILps6Xli4XmjZfnm7TmnJXmsojnj43os4Ppjq7pmbPmtKXlopzmpI7mp4zov73pjprnl5vpgJrloZrmoILmjrTmp7vkvYPmvKzmn5jovrvolKbntrTpjZTmpL/mvbDlnarlo7flrKzntKzniKrlkIrph6PptrTkuq3kvY7lgZzlgbXliYPosp7lkYjloKTlrprluJ3lupXluq3lu7flvJ/mgozmirXmjLrmj5Dmoq/msYDnoofnpo7nqIvnt6DoiYfoqILoq6bouYTpgJNcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNWExXCIsXG5cdFx0XCLpgrjphK3ph5jpvI7ms6XmkZjmk6LmlbXmu7TnmoTnrJvpganpj5Hmurrlk7LlvrnmkqTovY3ov63piYTlhbjloavlpKnlsZXlupfmt7vnuo/nlJzosrzou6LpoZvngrnkvJ3mrr/mvrHnlLDpm7vlhY7lkJDloLXloZflpqzlsaDlvpLmlpfmnZzmuKHnmbvoj5/os63pgJTpg73pjY3noKXnoLrliqrluqblnJ/lpbTmgJLlgJLlhZrlhqzlh43liIDllJDloZTloZjlpZflrpXls7bltovmgrzmipXmkK3mnbHmoYPmorzmo5/nm5fmt5jmua/mtpvnga/nh4jlvZPnl5jnpbfnrYnnrZTnrZLns5bntbHliLBcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNmExXCIsXG5cdFx0XCLokaPolanol6ToqI7orITosYbouI/pgIPpgI/pkJnpmbbpoK3pqLDpl5jlg43li5XlkIzloILlsI7mhqfmkp7mtJ7nnrPnq6Xog7TokITpgZPpioXls6DptIfljL/lvpflvrPmtpznibnnnaPnpr/nr6Tmr5Lni6zoqq3moIPmqaHlh7jnqoHmpLTlsYrps7boi6vlr4XphYnngJ7lmbjlsa/mg4fmlabmsozosZrpgYHpoJPlkZHmm4fpiI3lpYjpgqPlhoXkuY3lh6rolpnorI7ngZjmjbrpjYvmpaLpprTnuITnlbfljZfmpaDou5/pm6PmsZ3kuozlsLzlvJDov6nljILos5Hogonombnlu7/ml6XkubPlhaVcIlxuXHRdLFxuXHRbXG5cdFx0XCJjN2ExXCIsXG5cdFx0XCLlpoLlsL/pn67ku7vlporlv43oqo3mv6HnprDnpaLlr6fokbHnjKvnhrHlubTlv7Xmjbvmkprnh4PnspjkuYPlu7zkuYvln5zlmqLmgqnmv4PntI3og73ohLPohr/ovrLoppfomqTlt7Tmiormkq3opofmnbfms6LmtL7nkLbnoLTlqYbnvbXoiq3ppqzkv7Plu4Pmi53mjpLmlZfmna/nm4PniYzog4zogrrovKnphY3lgI3ln7nlqpLmooXmpbPnhaTni73osrflo7Los6DpmarpgJnonb/np6Tnn6fokKnkvK/liaXljZrmi43mn4/ms4rnmb3nrpTnspXoiLboloTov6vmm53mvKDniIbnuJvojqvpp4HpuqZcIlxuXHRdLFxuXHRbXG5cdFx0XCJjOGExXCIsXG5cdFx0XCLlh73nrrHnobLnrrjogofnrYjmq6jluaHogoznlZHnlaDlhavpiaLmuoznmbrphpfpq6rkvJDnvbDmipznrY/plqXps6nlmbrloZnom6TpmrzkvLTliKTljYrlj43lj5vluIbmkKzmlpHmnb/msL7msY7niYjniq/nj63nlZTnuYHoiKzol6nosqnnr4Tph4bnhanpoJLpo6/mjL3mmannlarnm6Tno5DolYPom67ljKrljZHlkKblpoPluoflvbzmgrLmiYnmibnmiqvmlpDmr5Tms4znlrLnmq7nopHnp5jnt4vnvbfogqXooqvoqrnosrvpgb/pnZ7po5vmqIvnsLjlgpnlsL7lvq7mnofmr5jnkLXnnInnvo5cIlxuXHRdLFxuXHRbXG5cdFx0XCJjOWExXCIsXG5cdFx0XCLpvLvmn4rnqJfljLnnlovpq63lvabohp3oj7HogpjlvLzlv4XnlaLnrYbpgLzmoaflp6vlqpvntJDnmb7orKzkv7XlvarmqJnmsLfmvILnk6LnpajooajoqZXosbnlu5/mj4/nl4Xnp5Loi5fpjKjpi7Lokpzom63psK3lk4HlvazmlozmtZzngJXosqfos5PpoLvmlY/nk7bkuI3ku5jln6DlpKvlqablr4zlhqjluIPlupzmgJbmibbmlbfmlqfmma7mta7niLbnrKbohZDohproipnorZzosqDos6botbTpmJzpmYTkvq7mkqvmraboiJ7okaHolarpg6jlsIHmpZPpoqjokbrolZfkvI/lia/lvqnluYXmnI1cIlxuXHRdLFxuXHRbXG5cdFx0XCJjYWExXCIsXG5cdFx0XCLnpo/ohbnopIfopobmt7XlvJfmiZXmsrjku4/nianprpLliIblkLvlmbTlorPmhqTmia7nhJrlpa7nsonns57ntJvpm7DmlofogZ7kuJnkvbXlhbXloYDluaPlubPlvIrmn4TkuKbolL3plonpmZvnsbPpoIHlg7vlo4HnmZbnoqfliKXnnqXolJHnroblgY/lpInniYfnr4fnt6jovrrov5TpgY3kvr/li4nlqKnlvIHpnq3kv53oiJfpi6rlnIPmjZXmrannlKvoo5zovJTnqYLli5/lopPmhZXmiIrmmq7mr43nsL/oj6nlgKPkv7jljIXlkYbloLHlpYnlrp3ls7Dls6/ltKnlupbmirHmjafmlL7mlrnmnItcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYmExXCIsXG5cdFx0XCLms5Xms6Hng7nnoLLnuKvog57oirPokIzok6zonILopJLoqKrosYrpgqbpi5Lpo73ps7PptazkuY/kuqHlgo3liZblnYrlpqjluL3lv5jlv5nmiL/mmrTmnJvmn5Dmo5LlhpLntKHogqrohqjorIDosozosr/pib7pmLLlkKDpoKzljJflg5XljZzloqjmkrLmnLTniafnnabnqYbph6bli4PmsqHmrobloIDluYzlpZTmnKznv7vlh6Hnm4bmkanno6jprZTpurvln4vlprnmmKfmnprmr47lk6nmp5nluZXohpzmnpXprqrmn77psZLmoZ3kuqbkv6Plj4jmirnmnKvmsqvov4Tkvq3nua3pur/kuIfmhaLmuoBcIlxuXHRdLFxuXHRbXG5cdFx0XCJjY2ExXCIsXG5cdFx0XCLmvKvolJPlkbPmnKrprYXlt7PnrpXlsqzlr4bonJzmuYrok5HnqJTohIjlppnnso3msJHnnKDli5nlpKLnhKHniZ/nn5vpnKfptaHmpIvlqb/lqJjlhqXlkI3lkb3mmI7nm5/ov7fpipjps7Tlp6rniZ3mu4XlhY3mo4nntr/nt6zpnaLpurrmkbjmqKHojILlpoTlrZ/mr5vnjJvnm7LntrLogJfokpnlhLLmnKjpu5nnm67mnaLli7/ppIXlsKTmiLvnsb7osrDllY/mgrbntIvploDljIHkuZ/lhrblpJzniLrogLbph47lvKXnn6LljoTlvbnntITolqzoqLPouo3pnZbmn7Polq7pkZPmhInmhIjmsrnnmZJcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZGExXCIsXG5cdFx0XCLoq63ovLjllK/kvZHlhKrli4flj4vlrqXlub3mgqDmhoLmj5bmnInmn5rmuafmtoznjLbnjLfnlLHnpZDoo5XoqpjpgYrpgpHpg7Xpm4Tono3lpJXkuojkvZnkuI7oqonovL/poJDlgq3lubzlppblrrnlurjmj5rmj7rmk4Hmm5zmpYrmp5jmtIvmurbnhpTnlKjnqq/nvorogIDokYnok4nopoHorKHouIrpgaXpmb3ppIrmhb7mipHmrLLmsoPmtbTnv4znv7zmt4DnvoXonrroo7jmnaXojrHpoLzpm7fmtJvntaHokL3pharkubHljbXltZDmrITmv6vol43omK3opqfliKnlkI/lsaXmnY7moqjnkIbnkoNcIlxuXHRdLFxuXHRbXG5cdFx0XCJjZWExXCIsXG5cdFx0XCLnl6Loo4/oo6Hph4zpm6Lpmbjlvovnjofnq4vokY7mjqDnlaXlionmtYHmupznkInnlZnnoavnspLpmobnq5zpvo3kvrbmha7ml4XomZzkuobkuq7lg5rkuKHlh4zlr67mlpnmooHmtrznjJ/nmYLnnq3nqJzns6foia/oq5Lpgbzph4/pmbXpoJjlipvnt5HlgKvljpjmnpfmt4vnh5DnkLPoh6jovKrpmqPpsZfpup/nkaDloYHmtpnntK/poZ7ku6TkvLbkvovlhrflirHltrrmgJznjrLnpLzoi5PpiLTpmrfpm7bpnIrpupfpvaLmmqbmrbTliJfliqPng4joo4Llu4nmgYvmhpDmvKPnhYnnsL7nt7Toga9cIlxuXHRdLFxuXHRbXG5cdFx0XCJjZmExXCIsXG5cdFx0XCLok67pgKPpjKzlkYLpra/mq5Pngonos4Lot6/pnLLlirTlqYHlu4rlvITmnJfmpbzmppTmtarmvI/niaLni7znr63ogIHogb7onYvpg47lha3pupPnpoTogovpjLLoq5blgK3lkozoqbHmraros4TohIfmg5HmnqDpt7LkupnkupjpsJDoqavol4HolajmpIDmub7nopfohZVcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMGExXCIsXG5cdFx0XCLlvIzkuJDkuJXkuKrkuLHkuLbkuLzkuL/kuYLkuZbkuZjkuoLkuoXosavkuoroiJLlvI3kuo7kup7kup/kuqDkuqLkurDkurPkurbku47ku43ku4Tku4bku4Lku5fku57ku63ku5/ku7fkvInkvZrkvLDkvZvkvZ3kvZfkvYfkvbbkvojkvo/kvpjkvbvkvankvbDkvpHkva/kvobkvpblhJjkv5Tkv5/kv47kv5jkv5vkv5Hkv5rkv5Dkv6Tkv6XlgJrlgKjlgJTlgKrlgKXlgIXkvJzkv7blgKHlgKnlgKzkv77kv6/lgJHlgIblgYPlgYfmnIPlgZXlgZDlgYjlgZrlgZblgazlgbjlgoDlgprlgoXlgrTlgrJcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMWExXCIsXG5cdFx0XCLlg4nlg4rlgrPlg4Llg5blg57lg6Xlg63lg6Plg67lg7nlg7XlhInlhIHlhILlhJblhJXlhJTlhJrlhKHlhLrlhLflhLzlhLvlhL/lhYDlhZLlhYzlhZTlhaLnq7jlhanlharlha7lhoDlhoLlm5jlhozlhonlho/lhpHlhpPlhpXlhpblhqTlhqblhqLlhqnlhqrlhqvlhrPlhrHlhrLlhrDlhrXlhr3lh4Xlh4nlh5vlh6DomZXlh6nlh63lh7Dlh7Xlh77liITliIvliJTliI7liKfliKrliK7liLPliLnliY/liYTliYvliYzliZ7liZTliarlibTlianlibPlib/lib3lio3lipTlipLlibHliojlipHovqhcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMmExXCIsXG5cdFx0XCLovqfliqzliq3lirzlirXli4Hli43li5fli57li6Pli6bpo63li6Dli7Pli7Xli7jli7nljIbljIjnlLjljI3ljJDljI/ljJXljJrljKPljK/ljLHljLPljLjljYDljYbljYXkuJfljYnljY3lh5bljZ7ljanlja7lpJjljbvljbfljoLljpbljqDljqbljqXljq7ljrDljrblj4PnsJLpm5nlj5/mm7znh67lj67lj6jlj63lj7rlkIHlkL3lkYDlkKzlkK3lkLzlkK7lkLblkKnlkJ3lkY7lko/lkbXlko7lkZ/lkbHlkbflkbDlkpLlkbvlkoDlkbblkoTlkpDlkoblk4flkqLlkrjlkqXlkqzlk4Tlk4jlkqhcIlxuXHRdLFxuXHRbXG5cdFx0XCJkM2ExXCIsXG5cdFx0XCLlkqvlk4LlkqTlkr7lkrzlk5jlk6Xlk6bllI/llJTlk73lk67lk63lk7rlk6LllLnllYDllaPllYzllK7llZzllYXllZbllZfllLjllLPllZ3llpnlloDlkq/llorllp/llbvllb7llpjllp7llq7llbzlloPllqnllofllqjll5rll4Xll5/ll4Tll5zll6Tll5TlmJTll7flmJbll77ll73lmJvll7nlmY7lmZDnh5/lmLTlmLblmLLlmLjlmavlmaTlmK/lmazlmarlmoblmoDlmorlmqDlmpTlmo/lmqXlmq7lmrblmrTlm4Llmrzlm4Hlm4Plm4Dlm4jlm47lm5Hlm5Plm5flm67lm7nlnIDlm7/lnITlnIlcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNGExXCIsXG5cdFx0XCLlnIjlnIvlnI3lnJPlnJjlnJbll4flnJzlnKblnLflnLjlnY7lnLvlnYDlnY/lnanln4DlnojlnaHlnb/lnonlnpPlnqDlnrPlnqTlnqrlnrDln4Pln4bln5Tln5Lln5PloIrln5bln6PloIvloJnloJ3lobLloKHloaLloYvlobDmr4DloZLloL3lobnlooXlornlop/loqvlorrlo57lorvlorjloq7lo4Xlo5Plo5Hlo5flo5nlo5jlo6Xlo5zlo6Tlo5/lo6/lo7rlo7nlo7vlo7zlo73lpILlpIrlpJDlpJvmoqblpKXlpKzlpK3lpLLlpLjlpL7nq5LlpZXlpZDlpY7lpZrlpZjlpaLlpaDlpaflpazlpalcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNWExXCIsXG5cdFx0XCLlpbjlpoHlpp3kvZ7kvqvlpqPlprLlp4blp6jlp5zlpo3lp5nlp5rlqKXlqJ/lqJHlqJzlqInlqJrlqYDlqazlqYnlqLXlqLblqaLlqarlqprlqrzlqr7lq4vlq4Llqr3lq6Plq5flq6blq6nlq5blq7rlq7vlrIzlrIvlrJblrLLlq5DlrKrlrLblrL7lrYPlrYXlrYDlrZHlrZXlrZrlrZvlraXlranlrbDlrbPlrbXlrbjmlojlrbrlroDlroPlrqblrrjlr4Plr4flr4nlr5Tlr5Dlr6Tlr6blr6Llr57lr6Xlr6vlr7Dlr7blr7PlsIXlsIflsIjlsI3lsJPlsKDlsKLlsKjlsLjlsLnlsYHlsYblsY7lsZNcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNmExXCIsXG5cdFx0XCLlsZDlsY/lrbHlsazlsa7kuaLlsbblsbnlsozlspHlspTlppvlsqvlsrvlsrblsrzlsrfls4Xlsr7ls4fls5nls6nls73ls7rls63ltozls6rltIvltJXltJfltZzltJ/ltJvltJHltJTltKLltJrltJnltJjltYzltZLltY7ltYvltazltbPltbbltofltoTltoLltqLltp3ltqzltq7ltr3ltpDltrfltrzlt4nlt43lt5Plt5Llt5blt5vlt6vlt7Llt7XluIvluJrluJnluJHluJvluLbluLfluYTluYPluYDluY7luZfluZTluZ/luaLluaTluYflubXlubblubrpurzlub/luqDlu4Hlu4Llu4jlu5Dlu49cIlxuXHRdLFxuXHRbXG5cdFx0XCJkN2ExXCIsXG5cdFx0XCLlu5blu6Plu53lu5rlu5vlu6Llu6Hlu6jlu6nlu6zlu7Hlu7Plu7Dlu7Tlu7jlu77lvIPlvInlvZ3lvZzlvIvlvJHlvJblvKnlvK3lvLjlvYHlvYjlvYzlvY7lvK/lvZHlvZblvZflvZnlvaHlva3lvbPlvbflvoPlvoLlvb/lvorlvojlvpHlvoflvp7lvpnlvpjlvqDlvqjlvq3lvrzlv5blv7vlv6Tlv7jlv7Hlv53mgrPlv7/mgKHmgaDmgJnmgJDmgKnmgI7mgLHmgJvmgJXmgKvmgKbmgI/mgLrmgZrmgYHmgarmgbfmgZ/mgYrmgYbmgY3mgaPmgYPmgaTmgYLmgazmgavmgZnmgoHmgo3mg6fmgoPmgppcIlxuXHRdLFxuXHRbXG5cdFx0XCJkOGExXCIsXG5cdFx0XCLmgoTmgpvmgpbmgpfmgpLmgqfmgovmg6Hmgrjmg6Dmg5PmgrTlv7Dmgr3mg4bmgrXmg5jmhY3mhJXmhIbmg7bmg7fmhIDmg7Tmg7rmhIPmhKHmg7vmg7HmhI3mhI7mhYfmhL7mhKjmhKfmhYrmhL/mhLzmhKzmhLTmhL3mhYLmhYTmhbPmhbfmhZjmhZnmhZrmhavmhbTmha/mhaXmhbHmhZ/mhZ3mhZPmhbXmhpnmhpbmhofmhqzmhpTmhprmhormhpHmhqvmhq7mh4zmh4rmh4nmh7fmh4jmh4Pmh4bmhrrmh4vnvbnmh43mh6bmh6Pmh7bmh7rmh7Tmh7/mh73mh7zmh77miIDmiIjmiInmiI3miIzmiJTmiJtcIlxuXHRdLFxuXHRbXG5cdFx0XCJkOWExXCIsXG5cdFx0XCLmiJ7miKHmiKrmiK7miLDmiLLmiLPmiYHmiY7miZ7miaPmiZvmiaDmiajmibzmioLmionmib7mipLmipPmipbmi5TmioPmipTmi5fmi5Hmirvmi4/mi7/mi4bmk5Tmi4jmi5zmi4zmi4rmi4Lmi4fmipvmi4nmjIzmi67mi7HmjKfmjILmjIjmi6/mi7XmjZDmjL7mjY3mkJzmjY/mjpbmjo7mjoDmjqvmjbbmjqPmjo/mjonmjp/mjrXmjavmjanmjr7mj6nmj4Dmj4bmj6Pmj4nmj5Lmj7bmj4TmkJbmkLTmkIbmkJPmkKbmkLbmlJ3mkJfmkKjmkI/mkafmka/mkbbmkY7mlKrmkpXmkpPmkqXmkqnmkojmkrxcIlxuXHRdLFxuXHRbXG5cdFx0XCJkYWExXCIsXG5cdFx0XCLmk5rmk5Lmk4Xmk4fmkrvmk5jmk4Lmk7Hmk6foiInmk6Dmk6Hmiqzmk6Pmk6/mlKzmk7bmk7Tmk7Lmk7rmlIDmk73mlJjmlJzmlIXmlKTmlKPmlKvmlLTmlLXmlLfmlLbmlLjnlYvmlYjmlZbmlZXmlY3mlZjmlZ7mlZ3mlbLmlbjmloLmloPorormlpvmlp/mlqvmlrfml4Pml4bml4Hml4Tml4zml5Lml5vml5nml6Dml6Hml7HmnbLmmIrmmIPml7vmnbPmmLXmmLbmmLTmmJzmmY/mmYTmmYnmmYHmmZ7mmZ3mmaTmmafmmajmmZ/mmaLmmbDmmoPmmojmmo7mmonmmoTmmpjmmp3mm4Hmmrnmm4nmmr7mmrxcIlxuXHRdLFxuXHRbXG5cdFx0XCJkYmExXCIsXG5cdFx0XCLmm4Tmmrjmm5bmm5rmm6DmmL/mm6bmm6nmm7Dmm7Xmm7fmnI/mnJbmnJ7mnKbmnKfpnLjmnK7mnL/mnLbmnYHmnLjmnLfmnYbmnZ7mnaDmnZnmnaPmnaTmnonmnbDmnqnmnbzmnarmnozmnovmnqbmnqHmnoXmnrfmn6/mnrTmn6zmnrPmn6nmnrjmn6Tmn57mn53mn6Lmn67mnrnmn47mn4bmn6fmqpzmoJ7moYbmoKnmoYDmoY3moLLmoY7morPmoKvmoZnmoaPmobfmob/mop/moo/moq3mopTmop3mopvmooPmqq7mornmobTmorXmoqDmorrmpI/moo3mob7mpIHmo4rmpIjmo5jmpKLmpKbmo6HmpIzmo41cIlxuXHRdLFxuXHRbXG5cdFx0XCJkY2ExXCIsXG5cdFx0XCLmo5Tmo6fmo5XmpLbmpJLmpITmo5fmo6PmpKXmo7nmo6Dmo6/mpKjmpKrmpJrmpKPmpKHmo4bmpbnmpbfmpZzmpbjmpavmpZTmpb7mpa7mpLnmpbTmpL3mpZnmpLDmpaHmpZ7mpZ3mpoHmparmprLmpq7mp5Dmpr/mp4Hmp5Pmpr7mp47lr6jmp4rmp53mprvmp4PmpqfmqK7mppHmpqDmppzmppXmprTmp57mp6jmqILmqJvmp7/mrIrmp7nmp7Lmp6fmqIXmprHmqJ7mp63mqJTmp6vmqIrmqJLmq4HmqKPmqJPmqYTmqIzmqbLmqLbmqbjmqYfmqaLmqZnmqabmqYjmqLjmqKLmqpDmqo3mqqDmqoTmqqLmqqNcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZGExXCIsXG5cdFx0XCLmqpfomJfmqrvmq4Pmq4LmqrjmqrPmqqzmq57mq5Hmq5/mqqrmq5rmq6rmq7vmrIXomJbmq7rmrJLmrJbprLHmrJ/mrLjmrLfnm5zmrLnpo67mrYfmrYPmrYnmrZDmrZnmrZTmrZvmrZ/mraHmrbjmrbnmrb/mroDmroTmroPmro3mrpjmrpXmrp7mrqTmrqrmrqvmrq/mrrLmrrHmrrPmrrfmrrzmr4bmr4vmr5Pmr5/mr6zmr6vmr7Pmr6/pur7msIjmsJPmsJTmsJvmsKTmsKPmsZ7msZXmsaLmsarmsoLmso3msprmsoHmspvmsb7msajmsbPmspLmspDms4Tms7Hms5Pmsr3ms5fms4Xms53msq7msrHmsr5cIlxuXHRdLFxuXHRbXG5cdFx0XCJkZWExXCIsXG5cdFx0XCLmsrrms5vms6/ms5nms6rmtJ/ooY3mtLbmtKvmtL3mtLjmtJnmtLXmtLPmtJLmtIzmtaPmtpPmtaTmtZrmtbnmtZnmto7mtpXmv6TmtoXmt7nmuJXmuIrmtrXmt4fmt6bmtrjmt4bmt6zmt57mt4zmt6jmt5Lmt4Xmt7rmt5nmt6Tmt5Xmt6rmt67muK3mua7muK7muJnmubLmuZ/muL7muKPmuavmuKvmubbmuY3muJ/muYPmuLrmuY7muKTmu7/muJ3muLjmuoLmuqrmupjmu4nmurfmu5Pmur3muq/mu4TmurLmu5Tmu5Xmuo/muqXmu4Lmup/mvYHmvJHngYzmu6zmu7jmu77mvL/mu7LmvLHmu6/mvLLmu4xcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZmExXCIsXG5cdFx0XCLmvL7mvJPmu7fmvobmvbrmvbjmvoHmvoDmva/mvZvmv7Pmva3mvoLmvbzmvZjmvo7mvpHmv4LmvabmvrPmvqPmvqHmvqTmvrnmv4bmvqrmv5/mv5Xmv6zmv5Tmv5jmv7Hmv67mv5vngInngIvmv7rngJHngIHngI/mv77ngJvngJrmvbTngJ3ngJjngJ/ngLDngL7ngLLngZHngaPngpnngpLngq/ng7HngqzngrjngrPngq7ng5/ng4vng53ng5nnhInng73nhJznhJnnhaXnhZXnhojnhabnhaLnhYznhZbnhaznho/nh7vnhoTnhpXnhqjnhqznh5fnhrnnhr7nh5Lnh4nnh5Tnh47nh6Dnh6znh6fnh7Xnh7xcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMGExXCIsXG5cdFx0XCLnh7nnh7/niI3niJDniJvniKjniK3niKzniLDniLLniLvniLzniL/niYDniYbniYvniZjnibTnib7nioLnioHniofnipLnipbniqLniqfnirnnirLni4Pni4bni4Tni47ni5Lni6Lni6Dni6Hni7nni7flgI/njJfnjIrnjJznjJbnjJ3njLTnjK/njKnnjKXnjL7njY7njY/pu5jnjZfnjarnjajnjbDnjbjnjbXnjbvnjbrnj4jnjrPnj47njrvnj4Dnj6Xnj67nj57nkqLnkIXnka/nkKXnj7jnkLLnkLrnkZXnkL/nkZ/nkZnnkYHnkZznkannkbDnkaPnkarnkbbnkb7nkovnkp7nkqfnk4rnk4/nk5Tnj7FcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMWExXCIsXG5cdFx0XCLnk6Dnk6Pnk6fnk6nnk67nk7Lnk7Dnk7Hnk7jnk7fnlITnlIPnlIXnlIznlI7nlI3nlJXnlJPnlJ7nlKbnlKznlLznlYTnlY3nlYrnlYnnlZvnlYbnlZrnlannlaTnlafnlavnla3nlbjnlbbnlobnlofnlbTnlornlonnloLnlpTnlprnlp3nlqXnlqPnl4LnlrPnl4PnlrXnlr3nlrjnlrznlrHnl43nl4rnl5Lnl5nnl6Pnl57nl77nl7/nl7znmIHnl7Dnl7rnl7Lnl7PnmIvnmI3nmInnmJ/nmKfnmKDnmKHnmKLnmKTnmLTnmLDnmLvnmYfnmYjnmYbnmZznmZjnmaHnmaLnmajnmannmarnmafnmaznmbBcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMmExXCIsXG5cdFx0XCLnmbLnmbbnmbjnmbznmoDnmoPnmojnmovnmo7nmpbnmpPnmpnnmprnmrDnmrTnmrjnmrnnmrrnm4Lnm43nm5bnm5Lnm57nm6Hnm6Xnm6fnm6romK/nm7vnnIjnnIfnnITnnKnnnKTnnJ7nnKXnnKbnnJvnnLfnnLjnnYfnnZrnnajnnavnnZvnnaXnnb/nnb7nnbnnno7nnovnnpHnnqDnnp7nnrDnnrbnnrnnnr/nnrznnr3nnrvnn4fnn43nn5fnn5rnn5znn6Pnn67nn7znoIznoJLnpKbnoKDnpKrnoYXnoo7nobTnoobnobznoprnooznoqPnorXnoqrnoq/no5Hno4bno4vno5Tnor7norzno4Xno4rno6xcIlxuXHRdLFxuXHRbXG5cdFx0XCJlM2ExXCIsXG5cdFx0XCLno6fno5rno73no7TnpIfnpJLnpJHnpJnnpKznpKvnpYDnpaDnpZfnpZ/npZrnpZXnpZPnpbrnpb/npornpp3npqfpvYvnpqrnpq7nprPnprnnprrnp4nnp5Xnp6fnp6znp6Hnp6PnqIjnqI3nqJjnqJnnqKDnqJ/npoDnqLHnqLvnqL7nqLfnqYPnqZfnqYnnqaHnqaLnqanpvp3nqbDnqbnnqb3nqojnqpfnqpXnqpjnqpbnqqnnq4jnqrDnqrbnq4Xnq4Tnqr/pgoPnq4fnq4rnq43nq4/nq5Xnq5Pnq5nnq5rnq53nq6Hnq6Lnq6bnq63nq7DnrILnrI/nrIrnrIbnrLPnrJjnrJnnrJ7nrLXnrKjnrLbnrZBcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNGExXCIsXG5cdFx0XCLnrbrnrITnrY3nrIvnrYznrYXnrbXnraXnrbTnrafnrbDnrbHnraznra7nrp3nrpjnrp/nro3nrpznrprnrovnrpLnro/nrZ3nrpnnr4vnr4Hnr4znr4/nrrTnr4bnr53nr6nnsJHnsJTnr6bnr6XnsaDnsIDnsIfnsJPnr7Pnr7fnsJfnsI3nr7bnsKPnsKfnsKrnsJ/nsLfnsKvnsL3nsYznsYPnsZTnsY/nsYDnsZDnsZjnsZ/nsaTnsZbnsaXnsaznsbXnsoPnspDnsqTnsq3nsqLnsqvnsqHnsqjnsrPnsrLnsrHnsq7nsrnnsr3ns4Dns4Xns4Lns5jns5Lns5zns6LprLvns6/ns7Lns7Tns7bns7rntIZcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNWExXCIsXG5cdFx0XCLntILntJzntJXntIrntYXntYvntK7ntLLntL/ntLXntYbntbPntZbntY7ntbLntajnta7ntY/ntaPntpPntonntZvnto/ntb3ntpvntrrntq7ntqPntrXnt4fntr3ntqvnuL3ntqLntq/nt5zntrjntp/ntrDnt5jnt53nt6Tnt57nt7vnt7Lnt6HnuIXnuIrnuKPnuKHnuJLnuLHnuJ/nuInnuIvnuKLnuYbnuabnuLvnuLXnuLnnuYPnuLfnuLLnuLrnuafnuZ3nuZbnuZ7nuZnnuZrnubnnuarnuannubznubvnuoPnt5Xnub3ovq7nub/nuojnuonnuoznupLnupDnupPnupTnupbnuo7nupvnupznvLjnvLpcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNmExXCIsXG5cdFx0XCLnvYXnvYznvY3nvY7nvZDnvZHnvZXnvZTnvZjnvZ/nvaDnvajnvannvafnvbjnvoLnvobnvoPnvojnvofnvoznvpTnvp7nvp3nvprnvqPnvq/nvrLnvrnnvq7nvrbnvrjorbHnv4Xnv4bnv4rnv5Xnv5Tnv6Hnv6bnv6nnv7Pnv7npo5zogIbogITogIvogJLogJjogJnogJzogKHogKjogL/ogLvogYrogYbogZLogZjogZrogZ/ogaLogajogbPogbLogbDogbbogbnogb3ogb/ogoTogobogoXogpvogpPogprogq3lhpDogqzog5vog6Xog5nog53og4Tog5rog5bohInog6/og7HohJvohKnohKPohK/ohYtcIlxuXHRdLFxuXHRbXG5cdFx0XCJlN2ExXCIsXG5cdFx0XCLpmovohYbohL7ohZPohZHog7zohbHoha7ohaXohabohbTohoPohojohorohoDohoLohqDohpXohqTohqPohZ/ohpPohqnohrDohrXohr7ohrjohr3oh4Doh4Lohrroh4noh43oh5Hoh5noh5joh4joh5roh5/oh6Doh6foh7roh7voh77oiIHoiILoiIXoiIfoiIroiI3oiJDoiJboiKnoiKvoiLjoiLPoiYDoiZnoiZjoiZ3oiZroiZ/oiaToiaLoiajoiaroiavoiK7oibHoibfoibjoib7oio3oipLoiqvoip/oirvoiqzoi6Hoi6Poi5/oi5Loi7Toi7Poi7rojpPojIPoi7voi7noi57ojIboi5zojInoi5lcIlxuXHRdLFxuXHRbXG5cdFx0XCJlOGExXCIsXG5cdFx0XCLojLXojLTojJbojLLojLHojYDojLnojZDojYXojK/ojKvojJfojJjojoXojprojqrojp/ojqLojpbojKPojo7ojofojorojbzojrXojbPojbXojqDojonojqjoj7TokJPoj6voj47oj73okIPoj5jokIvoj4Hoj7fokIfoj6Doj7LokI3okKLokKDojr3okLjolIboj7voka3okKrokLzolZrokoTokbfokavokq3oka7okoLokanokYbokKzoka/okbnokLXok4rokaLokrnokr/okp/ok5nok43okrvok5rok5Dok4Hok4bok5bokqHolKHok7/ok7TolJfolJjolKzolJ/olJXolJTok7zolYDolaPolZjolYhcIlxuXHRdLFxuXHRbXG5cdFx0XCJlOWExXCIsXG5cdFx0XCLolYHomILolYvolZXoloDolqTolojolpHolorolqjola3olpTolpvol6rolofolpzolbfolb7olpDol4nolrrol4/olrnol5Dol5Xol53ol6Xol5zol7nomIromJPomIvol77ol7romIbomKLomJromLDomL/omY3kuZXomZTomZ/omafombHompPomqPomqnomqromovomozomrbomq/om4Tom4bomrDom4nooKPomqvom5Tom57om6nom6zom5/om5vom6/onJLonIbonIjonIDonIPom7vonJHonInonI3om7nonIronLTonL/onLfonLvonKXonKnonJronaDonZ/onbjonYzonY7onbTonZfonajona7onZlcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYWExXCIsXG5cdFx0XCLonZPonaPonarooIXonqLonp/onoLonq/on4vonr3on4Don5Dpm5bonqvon4TonrPon4fon4bonrvon6/on7Lon6DooI/ooI3on77on7bon7fooI7on5LooJHooJbooJXooKLooKHooLHooLbooLnooKfooLvooYTooYLooZLooZnooZ7ooaLooavoooHoob7oop7oobXoob3oorXoobLoooLoopfoopLooq7oopnooqLooo3ooqToorDoor/oorHoo4Poo4Too5Too5joo5noo53oo7nopILoo7zoo7Too6joo7LopITopIzopIropJPopYPopJ7opKXopKropKvopYHopYTopLvopLbopLjopYzopJ3opaDopZ5cIlxuXHRdLFxuXHRbXG5cdFx0XCJlYmExXCIsXG5cdFx0XCLopabopaTopa3oparopa/opbTopbfopb7opoPopojoporoppPoppjopqHopqnopqbopqzopq/oprLoprropr3opr/op4Dop5rop5zop53op6fop7Top7joqIPoqJboqJDoqIzoqJvoqJ3oqKXoqLboqYHoqZvoqZLoqYboqYjoqbzoqa3oqazoqaLoqoXoqoLoqoToqqjoqqHoqpHoqqXoqqboqproqqPoq4Toq43oq4Loq5roq6voq7Poq6foq6Toq7HorJToq6Doq6Loq7foq57oq5vorIzorIforJroq6HorJborJDorJforKDorLPpnqvorKborKvorL7orKjorYHorYzorY/orY7orYnorZborZvorZroratcIlxuXHRdLFxuXHRbXG5cdFx0XCJlY2ExXCIsXG5cdFx0XCLorZ/orazora/orbTorb3oroDorozoro7orpLorpPorpborpnorprosLrosYHosL/osYjosYzosY7osZDosZXosaLosazosbjosbrosoLosonosoXosoroso3oso7ospTosbzospjmiJ3osq3osqrosr3osrLosrPosq7osrbos4jos4Hos6Tos6Pos5ros73os7ros7votITotIXotIrotIfotI/otI3otJDpvY7otJPos43otJTotJbotafota3otbHotbPotoHotpnot4Lotr7otrrot4/ot5rot5bot4zot5vot4vot6rot6vot5/ot6Pot7zouIjouInot7/ouJ3ouJ7ouJDouJ/ouYLouLXouLDouLTouYpcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZGExXCIsXG5cdFx0XCLouYfouYnouYzouZDouYjouZnouaTouaDouKrouaPouZXoubboubLoubzouoHouofouoXouoTouovouoroupPoupHoupToupnouqrouqHouqzourDou4bourHour7ou4Xou4jou4vou5vou6Pou7zou7vou6vou77ovIrovIXovJXovJLovJnovJPovJzovJ/ovJvovIzovKbovLPovLvovLnovYXovYLovL7ovYzovYnovYbovY7ovZfovZzovaLovaPovaTovpzovp/ovqPovq3ovq/ovrfov5rov6Xov6Lov6rov6/pgofov7TpgIXov7nov7rpgJHpgJXpgKHpgI3pgJ7pgJbpgIvpgKfpgLbpgLXpgLnov7hcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZWExXCIsXG5cdFx0XCLpgY/pgZDpgZHpgZLpgI7pgYnpgL7pgZbpgZjpgZ7pgajpga/pgbbpmqjpgbLpgoLpgb3pgoHpgoDpgorpgonpgo/pgqjpgq/pgrHpgrXpg6Lpg6TmiYjpg5vphILphJLphJnphLLphLDphYrphZbphZjphaPphaXphanphbPphbLphovphonphoLphqLphqvphq/phqrphrXphrTphrrph4Dph4Hph4nph4vph5Dph5bph5/ph6Hph5vph7zph7Xph7bpiJ7ph7/piJTpiKzpiJXpiJHpiZ7piZfpiYXpiYnpiaTpiYjpipXpiL/piYvpiZDpipzpipbpipPpipvpiZrpi4/pirnpirfpi6npjI/pi7rpjYTpjK5cIlxuXHRdLFxuXHRbXG5cdFx0XCJlZmExXCIsXG5cdFx0XCLpjJnpjKLpjJrpjKPpjLrpjLXpjLvpjZzpjaDpjbzpja7pjZbpjrDpjqzpjq3pjpTpjrnpj5bpj5fpj6jpj6Xpj5jpj4Ppj53pj5Dpj4jpj6TpkJrpkJTpkJPpkIPpkIfpkJDpkLbpkKvpkLXpkKHpkLrpkYHpkZLpkYTpkZvpkaDpkaLpkZ7pkarpiKnpkbDpkbXpkbfpkb3pkZrpkbzpkb7pkoHpkb/ploLplofplorplpTplpbplpjplpnplqDplqjplqfplq3plrzplrvplrnplr7pl4rmv7bpl4Ppl43pl4zpl5Xpl5Tpl5bpl5zpl6Hpl6Xpl6LpmKHpmKjpmK7pmK/pmYLpmYzpmY/pmYvpmbfpmZzpmZ5cIlxuXHRdLFxuXHRbXG5cdFx0XCJmMGExXCIsXG5cdFx0XCLpmZ3pmZ/pmabpmbLpmazpmo3pmpjpmpXpmpfpmqrpmqfpmrHpmrLpmrDpmrTpmrbpmrjpmrnpm47pm4vpm4npm43opY3pm5zpnI3pm5Xpm7npnITpnIbpnIjpnJPpnI7pnJHpnI/pnJbpnJnpnKTpnKrpnLDpnLnpnL3pnL7pnYTpnYbpnYjpnYLpnYnpnZzpnaDpnaTpnabpnajli5LpnavpnbHpnbnpnoXpnbzpnoHpnbrpnobpnovpno/pnpDpnpzpnqjpnqbpnqPpnrPpnrTpn4Ppn4bpn4jpn4vpn5zpn63pvY/pn7Lnq5/pn7bpn7XpoI/poIzpoLjpoKTpoKHpoLfpoL3poYbpoY/poYvpoavpoa/pobBcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMWExXCIsXG5cdFx0XCLpobHpobTpobPpoqrpoq/porHporbpo4Tpo4Ppo4bpo6npo6vppIPppInppJLppJTppJjppKHppJ3ppJ7ppKTppKDppKzppK7ppL3ppL7ppYLppYnppYXppZDppYvppZHppZLppYzppZXpppfpppjppqXppq3ppq7pprzpp5/pp5vpp53pp5jpp5Hpp63pp67pp7Hpp7Lpp7vpp7jpqIHpqI/pqIXpp6LpqJnpqKvpqLfpqYXpqYLpqYDpqYPpqL7pqZXpqY3pqZvpqZfpqZ/pqaLpqaXpqaTpqanpqavpqarpqq3pqrDpqrzpq4Dpq4/pq5Hpq5Ppq5Tpq57pq5/pq6Lpq6Ppq6bpq6/pq6vpq67pq7Tpq7Hpq7dcIlxuXHRdLFxuXHRbXG5cdFx0XCJmMmExXCIsXG5cdFx0XCLpq7vprIbprJjprJrprJ/prKLprKPprKXprKfprKjprKnprKrprK7prK/prLLprYTprYPprY/prY3prY7prZHprZjprbTprpPproPprpHprpbprpfprp/prqDprqjprrTpr4Dpr4rprrnpr4bpr4/pr5Hpr5Lpr6Ppr6Lpr6Tpr5Tpr6HpsLrpr7Lpr7Hpr7DpsJXpsJTpsInpsJPpsIzpsIbpsIjpsJLpsIrpsITpsK7psJvpsKXpsKTpsKHpsLDpsYfpsLLpsYbpsL7psZrpsaDpsafpsbbpsbjps6fps6zps7DptInptIjps6vptIPptIbptKrptKbptq/ptKPptJ/ptYTptJXptJLptYHptL/ptL7ptYbptYhcIlxuXHRdLFxuXHRbXG5cdFx0XCJmM2ExXCIsXG5cdFx0XCLptZ3ptZ7ptaTptZHptZDptZnptbLptonptofptqvpta/ptbrptprptqTptqnptrLpt4Tpt4Hptrvptrjptrrpt4bpt4/pt4Lpt5npt5Ppt7jpt6bpt63pt6/pt73puJrpuJvpuJ7pubXpubnpub3puoHpuojpuovpuozpupLpupXpupHpup3puqXpuqnpurjpuqrpuq3pnaHpu4zpu47pu4/pu5Dpu5Tpu5zpu57pu53pu6Dpu6Xpu6jpu6/pu7Tpu7bpu7fpu7npu7vpu7zpu73pvIfpvIjnmrfpvJXpvKHpvKzpvL7pvYrpvZLpvZTpvaPpvZ/pvaDpvaHpvabpvafpvazpvarpvbfpvbLpvbbpvpXpvpzpvqBcIlxuXHRdLFxuXHRbXG5cdFx0XCJmNGExXCIsXG5cdFx0XCLloK/mp4fpgZnnkaTlh5znhplcIlxuXHRdLFxuXHRbXG5cdFx0XCJmOWExXCIsXG5cdFx0XCLnuoropJzpjYjpiojok5zkv4nngrvmmLHmo4jpi7nmm7vlvYXkuKjku6Hku7zkvIDkvIPkvLnkvZbkvpLkvorkvprkvpTkv43lgYDlgKLkv7/lgJ7lgYblgbDlgYLlgpTlg7Tlg5jlhYrlhaTlhp3lhr7lh6zliJXlipzliqbli4Dli5vljIDljIfljKTljbLljpPljrLlj53vqI7lkpzlkorlkqnlk7/lloblnZnlnaXlnqzln4jln4fvqI/vqJDlop7lorLlpIvlpZPlpZvlpZ3lpaPlpqTlprrlrZblr4DnlK/lr5jlr6zlsJ7lsqblsrrls7XltKfltZPvqJHltYLlta3ltrjltrnlt5DlvKHlvLTlvaflvrdcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYWExXCIsXG5cdFx0XCLlv57mgZ3mgoXmgormg57mg5XmhKDmg7LmhJHmhLfmhLDmhpjmiJPmiqbmj7XmkaDmkp3mk47mlY7mmIDmmJXmmLvmmInmmK7mmJ7mmKTmmaXmmZfmmZnvqJLmmbPmmpnmmqDmmrLmmr/mm7rmnI7vpKnmnabmnrvmoZLmn4DmoIHmoYTmo4/vqJPmpajvqJTmppjmp6LmqLDmqavmqYbmqbPmqb7mq6Lmq6Tmr5bmsL/msZzmsobmsa/ms5rmtITmtofmta/mtpbmtqzmt4/mt7jmt7Lmt7zmuLnmuZzmuKfmuLzmur/mvojmvrXmv7XngIXngIfngKjngoXngqvnhI/nhITnhZznhYbnhYfvqJXnh4Hnh77nirFcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYmExXCIsXG5cdFx0XCLnir7njKTvqJbnjbfnjr3nj4nnj5bnj6Pnj5LnkIfnj7XnkKbnkKrnkKnnkK7nkaLnkonnkp/nlIHnla/nmoLnmpznmp7nmpvnmqbvqJfnnYbliq/noKHnoY7noaTnobrnpLDvqJjvqJnvqJrnppTvqJvnppvnq5Hnq6fvqJznq6vnrp7vqJ3ntYjntZzntrfntqDnt5bnuZLnvYfnvqHvqJ7ojIHojaLojb/oj4foj7bokYjokrTolZPolZnolavvqJ/olrDvqKDvqKHooIfoo7XoqJLoqLfoqbnoqqfoqr7oq5/vqKLoq7borZPorb/os7Dos7TotJLotbbvqKPou4/vqKTvqKXpgafpg57vqKbphJXphKfph5pcIlxuXHRdLFxuXHRbXG5cdFx0XCJmY2ExXCIsXG5cdFx0XCLph5fph57ph63ph67ph6Tph6XpiIbpiJDpiIrpiLrpiYDpiLzpiY7piZnpiZHpiLnpiafpiqfpibfpibjpi6fpi5fpi5npi5DvqKfpi5Xpi6Dpi5PpjKXpjKHpi7vvqKjpjJ7pi7/pjJ3pjILpjbDpjZfpjqTpj4bpj57pj7jpkLHpkYXpkYjplpLvp5zvqKnpmp3pmq/pnLPpnLvpnYPpnY3pnY/pnZHpnZXpoZfpoaXvqKrvqKvppKfvqKzppp7pqY7pq5npq5zprbXprbLpro/prrHprrvpsIDptbDptavvqK3puJnpu5FcIlxuXHRdLFxuXHRbXG5cdFx0XCJmY2YxXCIsXG5cdFx0XCLihbBcIixcblx0XHQ5LFxuXHRcdFwi77+i77+k77yH77yCXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhMmFmXCIsXG5cdFx0XCLLmMuHwrjLmcudwq/Lm8ua772ezoTOhVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTJjMlwiLFxuXHRcdFwiwqHCpsK/XCJcblx0XSxcblx0W1xuXHRcdFwiOGZhMmViXCIsXG5cdFx0XCLCusKqwqnCruKEosKk4oSWXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhNmUxXCIsXG5cdFx0XCLOhs6IzonOis6qXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhNmU3XCIsXG5cdFx0XCLOjFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTZlOVwiLFxuXHRcdFwizo7Oq1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTZlY1wiLFxuXHRcdFwizo9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE2ZjFcIixcblx0XHRcIs6szq3Ors6vz4rOkM+Mz4LPjc+LzrDPjlwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTdjMlwiLFxuXHRcdFwi0IJcIixcblx0XHQxMCxcblx0XHRcItCO0I9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE3ZjJcIixcblx0XHRcItGSXCIsXG5cdFx0MTAsXG5cdFx0XCLRntGfXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhOWExXCIsXG5cdFx0XCLDhsSQXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhOWE0XCIsXG5cdFx0XCLEplwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTlhNlwiLFxuXHRcdFwixLJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE5YThcIixcblx0XHRcIsWBxL9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmE5YWJcIixcblx0XHRcIsWKw5jFklwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTlhZlwiLFxuXHRcdFwixabDnlwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYTljMVwiLFxuXHRcdFwiw6bEkcOwxKfEscSzxLjFgsWAxYnFi8O4xZPDn8Wnw75cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmFhYTFcIixcblx0XHRcIsOBw4DDhMOCxILHjcSAxITDhcODxIbEiMSMw4fEisSOw4nDiMOLw4rEmsSWxJLEmFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYWFiYVwiLFxuXHRcdFwixJzEnsSixKDEpMONw4zDj8OOx4/EsMSqxK7EqMS0xLbEucS9xLvFg8WHxYXDkcOTw5LDlsOUx5HFkMWMw5XFlMWYxZbFmsWcxaDFnsWkxaLDmsOZw5zDm8Wsx5PFsMWqxbLFrsWox5fHm8eZx5XFtMOdxbjFtsW5xb3Fu1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYWJhMVwiLFxuXHRcdFwiw6HDoMOkw6LEg8eOxIHEhcOlw6PEh8SJxI3Dp8SLxI/DqcOow6vDqsSbxJfEk8SZx7XEncSfXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhYmJkXCIsXG5cdFx0XCLEocSlw63DrMOvw67HkFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYWJjNVwiLFxuXHRcdFwixKvEr8SpxLXEt8S6xL7EvMWExYjFhsOxw7PDssO2w7THksWRxY3DtcWVxZnFl8WbxZ3FocWfxaXFo8O6w7nDvMO7xa3HlMWxxavFs8WvxanHmMecx5rHlsW1w73Dv8W3xbrFvsW8XCJcblx0XSxcblx0W1xuXHRcdFwiOGZiMGExXCIsXG5cdFx0XCLkuILkuITkuIXkuIzkuJLkuJ/kuKPkuKTkuKjkuKvkuK7kuK/kuLDkuLXkuYDkuYHkuYTkuYfkuZHkuZrkuZzkuaPkuajkuankubTkubXkubnkub/kuo3kupbkupfkup3kuq/kurnku4Pku5Dku5rku5vku6Dku6Hku6Lku6jku6/ku7Hku7Pku7Xku73ku77ku7/kvIDkvILkvIPkvIjkvIvkvIzkvJLkvJXkvJbkvJfkvJnkvK7kvLHkvaDkvLPkvLXkvLfkvLnkvLvkvL7kvYDkvYLkvYjkvYnkvYvkvYzkvZLkvZTkvZbkvZjkvZ/kvaPkvarkvazkva7kvbHkvbfkvbjkvbnkvbrkvb3kvb7kvoHkvoLkvoRcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmIxYTFcIixcblx0XHRcIuS+heS+ieS+iuS+jOS+juS+kOS+kuS+k+S+lOS+l+S+meS+muS+nuS+n+S+suS+t+S+ueS+u+S+vOS+veS+vuS/gOS/geS/heS/huS/iOS/ieS/i+S/jOS/jeS/j+S/kuS/nOS/oOS/ouS/sOS/suS/vOS/veS/v+WAgOWAgeWAhOWAh+WAiuWAjOWAjuWAkOWAk+WAl+WAmOWAm+WAnOWAneWAnuWAouWAp+WAruWAsOWAsuWAs+WAteWBgOWBgeWBguWBheWBhuWBiuWBjOWBjuWBkeWBkuWBk+WBl+WBmeWBn+WBoOWBouWBo+WBpuWBp+WBquWBreWBsOWBseWAu+WCgeWCg+WChOWChuWCiuWCjuWCj+WCkFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYjJhMVwiLFxuXHRcdFwi5YKS5YKT5YKU5YKW5YKb5YKc5YKeXCIsXG5cdFx0NCxcblx0XHRcIuWCquWCr+WCsOWCueWCuuWCveWDgOWDg+WDhOWDh+WDjOWDjuWDkOWDk+WDlOWDmOWDnOWDneWDn+WDouWDpOWDpuWDqOWDqeWDr+WDseWDtuWDuuWDvuWEg+WEhuWEh+WEiOWEi+WEjOWEjeWEjuWDsuWEkOWEl+WEmeWEm+WEnOWEneWEnuWEo+WEp+WEqOWErOWEreWEr+WEseWEs+WEtOWEteWEuOWEueWFguWFiuWFj+WFk+WFleWFl+WFmOWFn+WFpOWFpuWFvuWGg+WGhOWGi+WGjuWGmOWGneWGoeWGo+WGreWGuOWGuuWGvOWGvuWGv+WHglwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYjNhMVwiLFxuXHRcdFwi5YeI5YeP5YeR5YeS5YeT5YeV5YeY5Yee5Yei5Yel5Yeu5Yey5Yez5Ye05Ye35YiB5YiC5YiF5YiS5YiT5YiV5YiW5YiY5Yii5Yio5Yix5Yiy5Yi15Yi85YmF5YmJ5YmV5YmX5YmY5Yma5Ymc5Ymf5Ymg5Ymh5Ymm5Ymu5Ym35Ym45Ym55YqA5YqC5YqF5YqK5YqM5YqT5YqV5YqW5YqX5YqY5Yqa5Yqc5Yqk5Yql5Yqm5Yqn5Yqv5Yqw5Yq25Yq35Yq45Yq65Yq75Yq95YuA5YuE5YuG5YuI5YuM5YuP5YuR5YuU5YuW5Yub5Yuc5Yuh5Yul5Yuo5Yup5Yuq5Yus5Yuw5Yux5Yu05Yu25Yu35YyA5YyD5YyK5YyLXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiNGExXCIsXG5cdFx0XCLljIzljJHljJPljJjljJvljJzljJ7ljJ/ljKXljKfljKjljKnljKvljKzljK3ljLDljLLljLXljLzljL3ljL7ljYLljYzljYvljZnljZvljaHljaPljaXljazlja3ljbLljbnljb7ljoPljofljojljo7ljpPljpTljpnljp3ljqHljqTljqrljqvljq/ljrLljrTljrXljrfljrjljrrljr3lj4Dlj4Xlj4/lj5Llj5Plj5Xlj5rlj53lj57lj6Dlj6blj6flj7XlkILlkJPlkJrlkKHlkKflkKjlkKrlkK/lkLHlkLTlkLXlkYPlkYTlkYflkY3lkY/lkZ7lkaLlkaTlkablkaflkanlkavlka3lka7lkbTlkb9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmI1YTFcIixcblx0XHRcIuWSgeWSg+WSheWSiOWSieWSjeWSkeWSleWSluWSnOWSn+WSoeWSpuWSp+WSqeWSquWSreWSruWSseWSt+WSueWSuuWSu+WSv+WThuWTiuWTjeWTjuWToOWTquWTrOWTr+WTtuWTvOWTvuWTv+WUgOWUgeWUheWUiOWUieWUjOWUjeWUjuWUleWUquWUq+WUsuWUteWUtuWUu+WUvOWUveWVgeWVh+WVieWViuWVjeWVkOWVkeWVmOWVmuWVm+WVnuWVoOWVoeWVpOWVpuWVv+WWgeWWguWWhuWWiOWWjuWWj+WWkeWWkuWWk+WWlOWWl+WWo+WWpOWWreWWsuWWv+WXgeWXg+WXhuWXieWXi+WXjOWXjuWXkeWXklwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYjZhMVwiLFxuXHRcdFwi5ZeT5ZeX5ZeY5Zeb5Zee5Zei5Zep5Ze25Ze/5ZiF5ZiI5ZiK5ZiNXCIsXG5cdFx0NSxcblx0XHRcIuWYmeWYrOWYsOWYs+WYteWYt+WYueWYu+WYvOWYveWYv+WZgOWZgeWZg+WZhOWZhuWZieWZi+WZjeWZj+WZlOWZnuWZoOWZoeWZouWZo+WZpuWZqeWZreWZr+WZseWZsuWZteWahOWaheWaiOWai+WajOWaleWameWamuWaneWanuWan+WapuWap+WaqOWaqeWaq+WarOWareWaseWas+Wat+WavuWbheWbieWbiuWbi+Wbj+WbkOWbjOWbjeWbmeWbnOWbneWbn+WboeWbpFwiLFxuXHRcdDQsXG5cdFx0XCLlm7Hlm6vlm61cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmI3YTFcIixcblx0XHRcIuWbtuWbt+WcgeWcguWch+WciuWcjOWckeWcleWcmuWcm+WcneWcoOWcouWco+WcpOWcpeWcqeWcquWcrOWcruWcr+Wcs+WctOWcveWcvuWcv+WdheWdhuWdjOWdjeWdkuWdouWdpeWdp+WdqOWdq+WdrVwiLFxuXHRcdDQsXG5cdFx0XCLlnbPlnbTlnbXlnbflnbnlnbrlnbvlnbzlnb7lnoHlnoPlnozlnpTlnpflnpnlnprlnpzlnp3lnp7lnp/lnqHlnpXlnqflnqjlnqnlnqzlnrjlnr3ln4fln4jln4zln4/ln5Xln53ln57ln6Tln6bln6fln6nln63ln7Dln7Xln7bln7jln73ln77ln7/loIPloITloIjloInln6FcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmI4YTFcIixcblx0XHRcIuWgjOWgjeWgm+WgnuWgn+WgoOWgpuWgp+WgreWgsuWgueWgv+WhieWhjOWhjeWhj+WhkOWhleWhn+WhoeWhpOWhp+WhqOWhuOWhvOWhv+WigOWigeWih+WiiOWiieWiiuWijOWijeWij+WikOWilOWiluWineWioOWioeWiouWipuWiqeWiseWisuWjhOWivOWjguWjiOWjjeWjjuWjkOWjkuWjlOWjluWjmuWjneWjoeWjouWjqeWjs+WkheWkhuWki+WkjOWkkuWkk+WklOiZgeWkneWkoeWko+WkpOWkqOWkr+WksOWks+WkteWktuWkv+Wlg+WlhuWlkuWlk+WlmeWlm+WlneWlnuWln+WloeWlo+Wlq+WlrVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYjlhMVwiLFxuXHRcdFwi5aWv5aWy5aW15aW25aW55aW75aW85aaL5aaM5aaO5aaS5aaV5aaX5aaf5aak5aan5aat5aau5aav5aaw5aaz5aa35aa65aa85aeB5aeD5aeE5aeI5aeK5aeN5aeS5aed5aee5aef5aej5aek5aen5aeu5aev5aex5aey5ae05ae35aiA5aiE5aiM5aiN5aiO5aiS5aiT5aie5aij5aik5ain5aio5aiq5ait5aiw5amE5amF5amH5amI5amM5amQ5amV5ame5amj5aml5amn5amt5am35am65am75am+5aqL5aqQ5aqT5aqW5aqZ5aqc5aqe5aqf5aqg5aqi5aqn5aqs5aqx5aqy5aqz5aq15aq45aq65aq75aq/XCJcblx0XSxcblx0W1xuXHRcdFwiOGZiYWExXCIsXG5cdFx0XCLlq4Tlq4blq4jlq4/lq5rlq5zlq6Dlq6Xlq6rlq67lq7Xlq7blq73lrIDlrIHlrIjlrJflrLTlrJnlrJvlrJ3lrKHlrKXlrK3lrLjlrYHlrYvlrYzlrZLlrZblrZ7lrajlra7lra/lrbzlrb3lrb7lrb/lroHlroTlroblrorlro7lrpDlrpHlrpPlrpTlrpblrqjlrqnlrqzlrq3lrq/lrrHlrrLlrrflrrrlrrzlr4Dlr4Hlr43lr4/lr5ZcIixcblx0XHQ0LFxuXHRcdFwi5a+g5a+v5a+x5a+05a+95bCM5bCX5bCe5bCf5bCj5bCm5bCp5bCr5bCs5bCu5bCw5bCy5bC15bC25bGZ5bGa5bGc5bGi5bGj5bGn5bGo5bGpXCJcblx0XSxcblx0W1xuXHRcdFwiOGZiYmExXCIsXG5cdFx0XCLlsa3lsbDlsbTlsbXlsbrlsbvlsbzlsb3lsoflsojlsorlso/lspLlsp3lsp/lsqDlsqLlsqPlsqblsqrlsrLlsrTlsrXlsrrls4nls4vls5Lls53ls5fls67ls7Hls7Lls7TltIHltIbltI3ltJLltKvltKPltKTltKbltKfltLHltLTltLnltL3ltL/ltYLltYPltYbltYjltZXltZHltZnltYrltZ/ltaDltaHltaLltaTltarlta3ltbDltbnltbrltb7ltb/ltoHltoPltojltorltpLltpPltpTltpXltpnltpvltp/ltqDltqfltqvltrDltrTltrjltrnlt4Plt4flt4vlt5Dlt47lt5jlt5nlt6Dlt6RcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmJjYTFcIixcblx0XHRcIuW3qeW3uOW3ueW4gOW4h+W4jeW4kuW4lOW4leW4mOW4n+W4oOW4ruW4qOW4suW4teW4vuW5i+W5kOW5ieW5keW5luW5mOW5m+W5nOW5nuW5qOW5qlwiLFxuXHRcdDQsXG5cdFx0XCLlubDluoDluovluo7luqLluqTluqXluqjluqrluqzlurHlurPlur3lur7lur/lu4blu4zlu4vlu47lu5Hlu5Llu5Tlu5Xlu5zlu57lu6Xlu6vlvILlvIblvIflvIjlvI7lvJnlvJzlvJ3lvKHlvKLlvKPlvKTlvKjlvKvlvKzlvK7lvLDlvLTlvLblvLvlvL3lvL/lvYDlvYTlvYXlvYflvY3lvZDlvZTlvZjlvZvlvaDlvaPlvaTlvadcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmJkYTFcIixcblx0XHRcIuW9r+W9suW9tOW9teW9uOW9uuW9veW9vuW+ieW+jeW+j+W+luW+nOW+neW+ouW+p+W+q+W+pOW+rOW+r+W+sOW+seW+uOW/hOW/h+W/iOW/ieW/i+W/kFwiLFxuXHRcdDQsXG5cdFx0XCLlv57lv6Hlv6Llv6jlv6nlv6rlv6zlv63lv67lv6/lv7Llv7Plv7blv7rlv7zmgIfmgIrmgI3mgJPmgJTmgJfmgJjmgJrmgJ/mgKTmgK3mgLPmgLXmgYDmgYfmgYjmgYnmgYzmgZHmgZTmgZbmgZfmgZ3mgaHmgafmgbHmgb7mgb/mgoLmgobmgojmgormgo7mgpHmgpPmgpXmgpjmgp3mgp7mgqLmgqTmgqXmgqjmgrDmgrHmgrdcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmJlYTFcIixcblx0XHRcIuaCu+aCvuaDguaDhOaDiOaDieaDiuaDi+aDjuaDj+aDlOaDleaDmeaDm+aDneaDnuaDouaDpeaDsuaDteaDuOaDvOaDveaEguaEh+aEiuaEjOaEkFwiLFxuXHRcdDQsXG5cdFx0XCLmhJbmhJfmhJnmhJzmhJ7mhKLmhKrmhKvmhLDmhLHmhLXmhLbmhLfmhLnmhYHmhYXmhYbmhYnmhZ7mhaDmhazmhbLmhbjmhbvmhbzmhb/mhoDmhoHmhoPmhoTmhovmho3mhpLmhpPmhpfmhpjmhpzmhp3mhp/mhqDmhqXmhqjmhqrmhq3mhrjmhrnmhrzmh4Dmh4Hmh4Lmh47mh4/mh5Xmh5zmh53mh57mh5/mh6Hmh6Lmh6fmh6nmh6VcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmJmYTFcIixcblx0XHRcIuaHrOaHreaHr+aIgeaIg+aIhOaIh+aIk+aIleaInOaIoOaIouaIo+aIp+aIqeaIq+aIueaIveaJguaJg+aJhOaJhuaJjOaJkOaJkeaJkuaJlOaJluaJmuaJnOaJpOaJreaJr+aJs+aJuuaJveaKjeaKjuaKj+aKkOaKpuaKqOaKs+aKtuaKt+aKuuaKvuaKv+aLhOaLjuaLleaLluaLmuaLquaLsuaLtOaLvOaLveaMg+aMhOaMiuaMi+aMjeaMkOaMk+aMluaMmOaMqeaMquaMreaMteaMtuaMueaMvOaNgeaNguaNg+aNhOaNhuaNiuaNi+aNjuaNkuaNk+aNlOaNmOaNm+aNpeaNpuaNrOaNreaNseaNtOaNtVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYzBhMVwiLFxuXHRcdFwi5o245o285o295o2/5o6C5o6E5o6H5o6K5o6Q5o6U5o6V5o6Z5o6a5o6e5o6k5o6m5o6t5o6u5o6v5o695o+B5o+F5o+I5o+O5o+R5o+T5o+U5o+V5o+c5o+g5o+l5o+q5o+s5o+y5o+z5o+15o+45o+55pCJ5pCK5pCQ5pCS5pCU5pCY5pCe5pCg5pCi5pCk5pCl5pCp5pCq5pCv5pCw5pC15pC95pC/5pGL5pGP5pGR5pGS5pGT5pGU5pGa5pGb5pGc5pGd5pGf5pGg5pGh5pGj5pGt5pGz5pG05pG75pG95pKF5pKH5pKP5pKQ5pKR5pKY5pKZ5pKb5pKd5pKf5pKh5pKj5pKm5pKo5pKs5pKz5pK95pK+5pK/XCJcblx0XSxcblx0W1xuXHRcdFwiOGZjMWExXCIsXG5cdFx0XCLmk4Tmk4nmk4rmk4vmk4zmk47mk5Dmk5Hmk5Xmk5fmk6Tmk6Xmk6nmk6rmk63mk7Dmk7Xmk7fmk7vmk7/mlIHmlITmlIjmlInmlIrmlI/mlJPmlJTmlJbmlJnmlJvmlJ7mlJ/mlKLmlKbmlKnmlK7mlLHmlLrmlLzmlL3mlYPmlYfmlYnmlZDmlZLmlZTmlZ/mlaDmlafmlavmlbrmlb3mloHmloXmlormlpLmlpXmlpjmlp3mlqDmlqPmlqbmlq7mlrLmlrPmlrTmlr/ml4Lml4jml4nml47ml5Dml5Tml5bml5jml5/ml7Dml7Lml7Tml7Xml7nml77ml7/mmIDmmITmmIjmmInmmI3mmJHmmJLmmJXmmJbmmJ1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmMyYTFcIixcblx0XHRcIuaYnuaYoeaYouaYo+aYpOaYpuaYqeaYquaYq+aYrOaYruaYsOaYseaYs+aYueaYt+aZgOaZheaZhuaZiuaZjOaZkeaZjuaZl+aZmOaZmeaZm+aZnOaZoOaZoeabu+aZquaZq+aZrOaZvuaZs+aZteaZv+aZt+aZuOaZueaZu+aagOaZvOaai+aajOaajeaakOaakuaameaamuaam+aanOaan+aaoOaapOaareaaseaasuaateaau+aav+abgOabguabg+abiOabjOabjuabj+ablOabm+abn+abqOabq+abrOabruabuuacheach+acjuack+acmeacnOacoOacouacs+acvuadheadh+adiOadjOadlOadleadnVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYzNhMVwiLFxuXHRcdFwi5p2m5p2s5p2u5p205p225p275p6B5p6E5p6O5p6P5p6R5p6T5p6W5p6Y5p6Z5p6b5p6w5p6x5p6y5p615p675p685p695p+55p+A5p+C5p+D5p+F5p+I5p+J5p+S5p+X5p+Z5p+c5p+h5p+m5p+w5p+y5p+25p+35qGS5qCU5qCZ5qCd5qCf5qCo5qCn5qCs5qCt5qCv5qCw5qCx5qCz5qC75qC/5qGE5qGF5qGK5qGM5qGV5qGX5qGY5qGb5qGr5qGuXCIsXG5cdFx0NCxcblx0XHRcIuahteahueahuuahu+ahvOaiguaihOaihuaiiOailuaimOaimuainOaioeaio+aipeaiqeaiquairuaisuaiu+ajheajiOajjOajj1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmYzRhMVwiLFxuXHRcdFwi5qOQ5qOR5qOT5qOW5qOZ5qOc5qOd5qOl5qOo5qOq5qOr5qOs5qOt5qOw5qOx5qO15qO25qO75qO85qO95qSG5qSJ5qSK5qSQ5qSR5qST5qSW5qSX5qSx5qSz5qS15qS45qS75qWC5qWF5qWJ5qWO5qWX5qWb5qWj5qWk5qWl5qWm5qWo5qWp5qWs5qWw5qWx5qWy5qW65qW75qW/5qaA5qaN5qaS5qaW5qaY5qah5qal5qam5qao5qar5qat5qav5qa35qa45qa65qa85qeF5qeI5qeR5qeW5qeX5qei5qel5qeu5qev5qex5qez5qe15qe+5qiA5qiB5qiD5qiP5qiR5qiV5qia5qid5qig5qik5qio5qiw5qiyXCJcblx0XSxcblx0W1xuXHRcdFwiOGZjNWExXCIsXG5cdFx0XCLmqLTmqLfmqLvmqL7mqL/mqYXmqYbmqYnmqYrmqY7mqZDmqZHmqZLmqZXmqZbmqZvmqaTmqafmqarmqbHmqbPmqb7mqoHmqoPmqobmqofmqonmqovmqpHmqpvmqp3mqp7mqp/mqqXmqqvmqq/mqrDmqrHmqrTmqr3mqr7mqr/mq4bmq4nmq4jmq4zmq5Dmq5Tmq5Xmq5bmq5zmq53mq6Tmq6fmq6zmq7Dmq7Hmq7Lmq7zmq73mrILmrIPmrIbmrIfmrInmrI/mrJDmrJHmrJfmrJvmrJ7mrKTmrKjmrKvmrKzmrK/mrLXmrLbmrLvmrL/mrYbmrYrmrY3mrZLmrZbmrZjmrZ3mraDmrafmravmra7mrbDmrbXmrb1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmM2YTFcIixcblx0XHRcIuatvuauguauheaul+aum+aun+auoOauouauo+auqOauqeaurOaureauruausOauuOauueauveauvuavg+avhOavieavjOavluavmuavoeavo+avpuavp+avruavseavt+avueavv+awguawhOawheawieawjeawjuawkOawkuawmeawn+awpuawp+awqOawrOawruaws+awteawtuawuuawu+awv+axiuaxi+axjeaxj+axkuaxlOaxmeaxm+axnOaxq+axreaxr+axtOaxtuaxuOaxueaxu+ayheayhuayh+ayieaylOayleayl+aymOaynOayn+aysOaysuaytOazguazhuazjeazj+azkOazkeazkuazlOazllwiXG5cdF0sXG5cdFtcblx0XHRcIjhmYzdhMVwiLFxuXHRcdFwi5rOa5rOc5rOg5rOn5rOp5rOr5rOs5rOu5rOy5rO05rSE5rSH5rSK5rSO5rSP5rSR5rST5rSa5rSm5rSn5rSo5rGn5rSu5rSv5rSx5rS55rS85rS/5rWX5rWe5rWf5rWh5rWl5rWn5rWv5rWw5rW85raC5raH5raR5raS5raU5raW5raX5raY5raq5ras5ra05ra35ra55ra95ra/5reE5reI5reK5reO5reP5reW5reb5red5ref5reg5rei5rel5rep5rev5rew5re05re25re85riA5riE5rie5rii5rin5riy5ri25ri55ri75ri85rmE5rmF5rmI5rmJ5rmL5rmP5rmR5rmS5rmT5rmU5rmX5rmc5rmd5rmeXCJcblx0XSxcblx0W1xuXHRcdFwiOGZjOGExXCIsXG5cdFx0XCLmuaLmuaPmuajmubPmubvmub3muo3mupPmupnmuqDmuqfmuq3muq7murHmurPmurvmur/mu4Dmu4Hmu4Pmu4fmu4jmu4rmu43mu47mu4/mu6vmu63mu67mu7nmu7vmu73mvITmvIjmvIrmvIzmvI3mvJbmvJjmvJrmvJvmvKbmvKnmvKrmvK/mvLDmvLPmvLbmvLvmvLzmvK3mvY/mvZHmvZLmvZPmvZfmvZnmvZrmvZ3mvZ7mvaHmvaLmvajmvazmvb3mvb7mvoPmvofmvojmvovmvozmvo3mvpDmvpLmvpPmvpTmvpbmvprmvp/mvqDmvqXmvqbmvqfmvqjmvq7mvq/mvrDmvrXmvrbmvrzmv4Xmv4fmv4jmv4pcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmM5YTFcIixcblx0XHRcIua/mua/nua/qOa/qea/sOa/tea/uea/vOa/veeAgOeAheeAhueAh+eAjeeAl+eAoOeAo+eAr+eAtOeAt+eAueeAvOeBg+eBhOeBiOeBieeBiueBi+eBlOeBleeBneeBnueBjueBpOeBpeeBrOeBrueBteeBtueBvueCgeeCheeChueClFwiLFxuXHRcdDQsXG5cdFx0XCLngpvngqTngqvngrDngrHngrTngrfng4rng5Hng5Png5Tng5Xng5bng5jng5zng6Tng7rnhINcIixcblx0XHQ0LFxuXHRcdFwi54SL54SM54SP54Se54Sg54Sr54St54Sv54Sw54Sx54S454WB54WF54WG54WH54WK54WL54WQ54WS54WX54Wa54Wc54We54WgXCJcblx0XSxcblx0W1xuXHRcdFwiOGZjYWExXCIsXG5cdFx0XCLnhajnhbnnhoDnhoXnhofnhoznhpLnhprnhpvnhqDnhqLnhq/nhrDnhrLnhrPnhrrnhr/nh4Dnh4Hnh4Tnh4vnh4znh5Pnh5bnh5nnh5rnh5znh7jnh77niIDniIfniIjniInniJPniJfniJrniJ3niJ/niKTniKvniK/niLTniLjniLnniYHniYLniYPniYXniY7niY/niZDniZPniZXniZbniZrniZzniZ7niaDniaPniajniavnia7nia/nibHnibfnibjnibvnibznib/nioTnionnio3nio7nipPnipvniqjniq3niq7nirHnirTnir7ni4Hni4fni4nni4zni5Xni5bni5jni5/ni6Xni7Pni7Tni7rni7tcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmNiYTFcIixcblx0XHRcIueLvueMgueMhOeMheeMh+eMi+eMjeeMkueMk+eMmOeMmeeMnueMoueMpOeMp+eMqOeMrOeMseeMsueMteeMuueMu+eMveeNg+eNjeeNkOeNkueNlueNmOeNneeNnueNn+eNoOeNpueNp+eNqeeNq+eNrOeNrueNr+eNseeNt+eNueeNvOeOgOeOgeeOg+eOheeOhueOjueOkOeOk+eOleeOl+eOmOeOnOeOnueOn+eOoOeOoueOpeeOpueOqueOq+eOreeOteeOt+eOueeOvOeOveeOv+ePheePhuePieePi+ePjOePj+ePkuePk+ePluePmeePneePoeePo+ePpuePp+ePqeePtOePteePt+ePueePuuePu+ePvVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmY2NhMVwiLFxuXHRcdFwi54+/55CA55CB55CE55CH55CK55CR55Ca55Cb55Ck55Cm55CoXCIsXG5cdFx0OSxcblx0XHRcIueQueeRgOeRg+eRhOeRhueRh+eRi+eRjeeRkeeRkueRl+eRneeRoueRpueRp+eRqOeRq+eRreeRrueRseeRsueSgOeSgeeSheeShueSh+eSieeSj+eSkOeSkeeSkueSmOeSmeeSmueSnOeSn+eSoOeSoeeSo+eSpueSqOeSqeeSqueSq+eSrueSr+eSseeSsueSteeSueeSu+eSv+eTiOeTieeTjOeTkOeTk+eTmOeTmueTm+eTnueTn+eTpOeTqOeTqueTq+eTr+eTtOeTuueTu+eTvOeTv+eUhlwiXG5cdF0sXG5cdFtcblx0XHRcIjhmY2RhMVwiLFxuXHRcdFwi55SS55SW55SX55Sg55Sh55Sk55Sn55Sp55Sq55Sv55S255S555S955S+55S/55WA55WD55WH55WI55WO55WQ55WS55WX55We55Wf55Wh55Wv55Wx55W5XCIsXG5cdFx0NSxcblx0XHRcIueWgeeWheeWkOeWkueWk+eWleeWmeeWnOeWoueWpOeWtOeWuueWv+eXgOeXgeeXhOeXhueXjOeXjueXj+eXl+eXnOeXn+eXoOeXoeeXpOeXp+eXrOeXrueXr+eXseeXueeYgOeYgueYg+eYhOeYh+eYiOeYiueYjOeYj+eYkueYk+eYleeYlueYmeeYm+eYnOeYneeYnueYo+eYpeeYpueYqeeYreeYsueYs+eYteeYuOeYuVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmY2VhMVwiLFxuXHRcdFwi55i655i855mK55mA55mB55mD55mE55mF55mJ55mL55mV55mZ55mf55mk55ml55mt55mu55mv55mx55m055qB55qF55qM55qN55qV55qb55qc55qd55qf55qg55qiXCIsXG5cdFx0Nixcblx0XHRcIueaqueareeaveebgeebheebieebi+ebjOebjueblOebmeeboOebpuebqOebrOebsOebseebtuebueebvOecgOechueciuecjueckueclOecleecl+ecmeecmuecnOecouecqOecreecruecr+ectOecteectuecueecveecvuedguedheedhuediuedjeedjuedj+edkuedluedl+ednOednuedn+edoOedolwiXG5cdF0sXG5cdFtcblx0XHRcIjhmY2ZhMVwiLFxuXHRcdFwi552k552n552q552s552w552y552z552055265529556A556E556M556N556U556V556W556a556f556i556n556q556u556v556x5561556+55+D55+J55+R55+S55+V55+Z55+e55+f55+g55+k55+m55+q55+s55+w55+x55+055+455+756CF56CG56CJ56CN56CO56CR56Cd56Ch56Ci56Cj56Ct56Cu56Cw56C156C356GD56GE56GH56GI56GM56GO56GS56Gc56Ge56Gg56Gh56Gj56Gk56Go56Gq56Gu56G656G+56KK56KP56KU56KY56Kh56Kd56Ke56Kf56Kk56Ko56Ks56Kt56Kw56Kx56Ky56KzXCJcblx0XSxcblx0W1xuXHRcdFwiOGZkMGExXCIsXG5cdFx0XCLnorvnor3nor/no4fno4jno4nno4zno47no5Lno5Pno5Xno5bno6Tno5vno5/no6Dno6Hno6bno6rno7Lno7PnpIDno7bno7fno7rno7vno7/npIbnpIznpJDnpJrnpJznpJ7npJ/npKDnpKXnpKfnpKnnpK3npLHnpLTnpLXnpLvnpL3npL/npYTnpYXnpYbnpYrnpYvnpY/npZHnpZTnpZjnpZvnpZznpafnpannpavnpbLnpbnnpbvnpbznpb7npovnpoznppHnppPnppTnppXnppbnppjnppvnppznpqHnpqjnpqnnpqvnpq/nprHnprTnprjnprvnp4Lnp4Tnp4fnp4jnp4rnp4/np5Tnp5bnp5rnp53np55cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmQxYTFcIixcblx0XHRcIuenoOenouenpeenquenq+enreenseenuOenvOeogueog+eoh+eoieeoiueojOeokeeoleeom+eonueooeeop+eoq+eoreeor+eosOeotOeoteeouOeoueeouuephOepheeph+epiOepjOepleepluepmeepnOepneepn+epoOeppeepp+epquepreepteepuOepvueqgOeqgueqheeqhueqiueqi+eqkOeqkeeqlOeqnueqoOeqo+eqrOeqs+eqteequeequ+eqvOerhuerieerjOerjuerkeerm+erqOerqeerq+errOerseertOeru+erveervuesh+eslOesn+eso+esp+esqeesquesq+esreesruesr+essFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZDJhMVwiLFxuXHRcdFwi56yx56y056y956y/562A562B562H562O562V562g562k562m562p562q562t562v562y562z5623566E566J566O566Q566R566W566b566e566g566l566s566v566w566y56615662566656675668566956+C56+F56+I56+K56+U56+W56+X56+Z56+a56+b56+o56+q56+y56+056+156+456+556+656+856++57CB57CC57CD57CE57CG57CJ57CL57CM57CO57CP57CZ57Cb57Cg57Cl57Cm57Co57Cs57Cx57Cz57C057C257C557C657GG57GK57GV57GR57GS57GT57GZXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI4ZmQzYTFcIixcblx0XHRcIuexoeexo+exp+exqeexreexruexsOexsuexueexvOexveeyhueyh+eyj+eylOeynueyoOeypueysOeytueyt+eyuueyu+eyvOeyv+ezhOezh+eziOezieezjeezj+ezk+ezlOezleezl+ezmeezmuezneezpuezqeezq+eztee0g+e0h+e0iOe0iee0j+e0kee0kue0k+e0lue0nee0nue0o+e0pue0que0ree0see0vOe0vee0vue1gOe1gee1h+e1iOe1jee1kee1k+e1l+e1mee1mue1nOe1nee1pee1p+e1que1sOe1uOe1uue1u+e1v+e2gee2gue2g+e2hee2hue2iOe2i+e2jOe2jee2kee2lue2l+e2nVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZDRhMVwiLFxuXHRcdFwi57ae57am57an57aq57az57a257a357a557eCXCIsXG5cdFx0NCxcblx0XHRcIue3jOe3jee3jue3l+e3mee4gOe3oue3pee3pue3que3q+e3ree3see3tee3tue3uee3uue4iOe4kOe4kee4lee4l+e4nOe4nee4oOe4p+e4qOe4rOe4ree4r+e4s+e4tue4v+e5hOe5hee5h+e5jue5kOe5kue5mOe5n+e5oee5oue5pee5q+e5rue5r+e5s+e5uOe5vue6gee6hue6h+e6iue6jee6kee6lee6mOe6mue6nee6nue8vOe8u+e8vee8vue8v+e9g+e9hOe9h+e9j+e9kue9k+e9m+e9nOe9nee9oee9o+e9pOe9pee9pue9rVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZDVhMVwiLFxuXHRcdFwi572x5729572+572/576A576L576N576P576Q576R576W576X576c576h576i576m576q576t57605768576/57+A57+D57+I57+O57+P57+b57+f57+j57+l57+o57+s57+u57+v57+y57+657+957++57+/6ICH6ICI6ICK6ICN6ICO6ICP6ICR6ICT6ICU6ICW6ICd6ICe6ICf6ICg6ICk6ICm6ICs6ICu6ICw6IC06IC16IC36IC56IC66IC86IC+6IGA6IGE6IGg6IGk6IGm6IGt6IGx6IG16IKB6IKI6IKO6IKc6IKe6IKm6IKn6IKr6IK46IK56IOI6ION6IOP6IOS6IOU6IOV6IOX6IOY6IOg6IOt6IOuXCJcblx0XSxcblx0W1xuXHRcdFwiOGZkNmExXCIsXG5cdFx0XCLog7Dog7Log7Pog7bog7nog7rog77ohIPohIvohJbohJfohJjohJzohJ7ohKDohKTohKfohKzohLDohLXohLrohLzohYXohYfohYrohYzohZLohZfohaDohaHohafohajohanoha3oha/ohbfohoHohpDohoTohoXohobohovoho7ohpbohpjohpvohp7ohqLohq7ohrLohrTohrvoh4voh4Poh4Xoh4roh47oh4/oh5Xoh5foh5voh53oh57oh6Hoh6Toh6voh6zoh7Doh7Hoh7Loh7Xoh7boh7joh7noh73oh7/oiIDoiIPoiI/oiJPoiJToiJnoiJroiJ3oiKHoiKLoiKjoiLLoiLToiLroiYPoiYToiYXoiYZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmQ3YTFcIixcblx0XHRcIuiJi+iJjuiJj+iJkeiJluiJnOiJoOiJo+iJp+iJreiJtOiJu+iJveiJv+iKgOiKgeiKg+iKhOiKh+iKieiKiuiKjuiKkeiKlOiKluiKmOiKmuiKm+iKoOiKoeiKo+iKpOiKp+iKqOiKqeiKquiKruiKsOiKsuiKtOiKt+iKuuiKvOiKvuiKv+iLhuiLkOiLleiLmuiLoOiLouiLpOiLqOiLquiLreiLr+iLtuiLt+iLveiLvuiMgOiMgeiMh+iMiOiMiuiMi+iNlOiMm+iMneiMnuiMn+iMoeiMouiMrOiMreiMruiMsOiMs+iMt+iMuuiMvOiMveiNguiNg+iNhOiNh+iNjeiNjuiNkeiNleiNluiNl+iNsOiNuFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZDhhMVwiLFxuXHRcdFwi6I296I2/6I6A6I6C6I6E6I6G6I6N6I6S6I6U6I6V6I6Y6I6Z6I6b6I6c6I6d6I6m6I6n6I6p6I6s6I6+6I6/6I+A6I+H6I+J6I+P6I+Q6I+R6I+U6I+d6I2T6I+o6I+q6I+26I+46I+56I+86JCB6JCG6JCK6JCP6JCR6JCV6JCZ6I6t6JCv6JC56JGF6JGH6JGI6JGK6JGN6JGP6JGR6JGS6JGW6JGY6JGZ6JGa6JGc6JGg6JGk6JGl6JGn6JGq6JGw6JGz6JG06JG26JG46JG86JG96JKB6JKF6JKS6JKT6JKV6JKe6JKm6JKo6JKp6JKq6JKv6JKx6JK06JK66JK96JK+6JOA6JOC6JOH6JOI6JOM6JOP6JOTXCJcblx0XSxcblx0W1xuXHRcdFwiOGZkOWExXCIsXG5cdFx0XCLok5zok6fok6rok6/ok7Dok7Hok7Lok7folLLok7rok7vok73olILolIPolIfolIzolI7olJDolJzolJ7olKLolKPolKTolKXolKfolKrolKvolK/olLPolLTolLbolL/olYbolY9cIixcblx0XHQ0LFxuXHRcdFwi6JWW6JWZ6JWcXCIsXG5cdFx0Nixcblx0XHRcIuiVpOiVq+iVr+iVueiVuuiVu+iVveiVv+iWgeiWheiWhuiWieiWi+iWjOiWj+iWk+iWmOiWneiWn+iWoOiWouiWpeiWp+iWtOiWtuiWt+iWuOiWvOiWveiWvuiWv+iXguiXh+iXiuiXi+iXjuiWreiXmOiXmuiXn+iXoOiXpuiXqOiXreiXs+iXtuiXvFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZGFhMVwiLFxuXHRcdFwi6Je/6JiA6JiE6JiF6JiN6JiO6JiQ6JiR6JiS6JiY6JiZ6Jib6Jie6Jih6Jin6Jip6Ji26Ji46Ji66Ji86Ji96JmA6JmC6JmG6JmS6JmT6JmW6JmX6JmY6JmZ6Jmd6JmgXCIsXG5cdFx0NCxcblx0XHRcIuiZqeiZrOiZr+iZteiZtuiZt+iZuuiajeiakeialuiamOiamuianOiaoeiapuiap+iaqOiareiaseias+iatOiateiat+iauOiaueiav+ibgOibgeibg+ibheibkeibkuibleibl+ibmuibnOiboOibo+ibpeibp+iaiOibuuibvOibveichOicheich+ici+icjuicj+ickOick+iclOicmeicnuicn+icoeico1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmZGJhMVwiLFxuXHRcdFwi6Jyo6Jyu6Jyv6Jyx6Jyy6Jy56Jy66Jy86Jy96Jy+6J2A6J2D6J2F6J2N6J2Y6J2d6J2h6J2k6J2l6J2v6J2x6J2y6J276J6DXCIsXG5cdFx0Nixcblx0XHRcIuiei+iejOiekOiek+ieleiel+iemOiemeienuieoOieo+iep+ierOiereieruieseieteievuiev+ifgeifiOifieifiuifjuifleifluifmeifmuifnOifn+ifouifo+ifpOifquifq+ifreifseifs+ifuOifuuifv+iggeigg+ighuigieigiuigi+igkOigmeigkuigk+iglOigmOigmuigm+ignOignuign+igqOigreigruigsOigsuigtVwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZGNhMVwiLFxuXHRcdFwi6KC66KC86KGB6KGD6KGF6KGI6KGJ6KGK6KGL6KGO6KGR6KGV6KGW6KGY6KGa6KGc6KGf6KGg6KGk6KGp6KGx6KG56KG76KKA6KKY6KKa6KKb6KKc6KKf6KKg6KKo6KKq6KK66KK96KK+6KOA6KOKXCIsXG5cdFx0NCxcblx0XHRcIuijkeijkuijk+ijm+ijnuijp+ijr+ijsOijseijteijt+ikgeikhuikjeikjuikj+ikleikluikmOikmeikmuiknOikoOikpuikp+ikqOiksOikseiksuikteikueikuuikvuilgOilguilheilhuilieilj+ilkuill+ilmuilm+ilnOiloeilouilo+ilq+ilruilsOils+ilteilulwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZGRhMVwiLFxuXHRcdFwi6KW76KW86KW96KaJ6KaN6KaQ6KaU6KaV6Kab6Kac6Kaf6Kag6Kal6Kaw6Ka06Ka16Ka26Ka36Ka86KeUXCIsXG5cdFx0NCxcblx0XHRcIuinpeinqeinq+inreinseins+intuinueinveinv+iohOioheioh+ioj+iokeiokuiolOioleionuiooOioouiopOiopuioq+iorOior+ioteiot+ioveiovuipgOipg+ipheiph+ipieipjeipjuipk+ipluipl+ipmOipnOipneipoeippeipp+ipteiptuipt+ipueipuuipu+ipvuipv+iqgOiqg+iqhuiqi+iqj+iqkOiqkuiqluiql+iqmeiqn+iqp+iqqeiqruiqr+iqs1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmZGVhMVwiLFxuXHRcdFwi6Kq26Kq36Kq76Kq+6KuD6KuG6KuI6KuJ6KuK6KuR6KuT6KuU6KuV6KuX6Kud6Kuf6Kus6Kuw6Ku06Ku16Ku26Ku86Ku/6KyF6KyG6KyL6KyR6Kyc6Kye6Kyf6KyK6Kyt6Kyw6Ky36Ky86K2CXCIsXG5cdFx0NCxcblx0XHRcIuitiOitkuitk+itlOitmeitjeitnuito+itreittuituOitueitvOitvuiugeiuhOiuheiui+iujeiuj+iulOiuleiunOiunuiun+iwuOiwueiwveiwvuixheixh+ixieixi+ixj+ixkeixk+ixlOixl+ixmOixm+ixneixmeixo+ixpOixpuixqOixqeixreixs+ixteixtuixu+ixvuiyhlwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZGZhMVwiLFxuXHRcdFwi6LKH6LKL6LKQ6LKS6LKT6LKZ6LKb6LKc6LKk6LK56LK66LOF6LOG6LOJ6LOL6LOP6LOW6LOV6LOZ6LOd6LOh6LOo6LOs6LOv6LOw6LOy6LO16LO36LO46LO+6LO/6LSB6LSD6LSJ6LSS6LSX6LSb6LWl6LWp6LWs6LWu6LW/6LaC6LaE6LaI6LaN6LaQ6LaR6LaV6Lae6Laf6Lag6Lam6Lar6Las6Lav6Lay6La16La36La56La76LeA6LeF6LeG6LeH6LeI6LeK6LeO6LeR6LeU6LeV6LeX6LeZ6Lek6Lel6Len6Les6Lew6La86Lex6Ley6Le06Le96LiB6LiE6LiF6LiG6LiL6LiR6LiU6LiW6Lig6Lih6LiiXCJcblx0XSxcblx0W1xuXHRcdFwiOGZlMGExXCIsXG5cdFx0XCLouKPouKbouKfouLHouLPouLbouLfouLjouLnouL3ouYDouYHouYvouY3ouY7ouY/ouZTouZvouZzouZ3ouZ7ouaHouaLouanouazoua3oua/oubDoubHoubnoubroubvouoLouoPouonoupDoupLoupXouproupvoup3oup7ouqLouqfouqnouq3ouq7ourPourXourrourvou4Dou4Hou4Pou4Tou4fou4/ou5Hou5Tou5zou6jou67ou7Dou7Hou7fou7nou7rou63ovIDovILovIfovIjovI/ovJDovJbovJfovJjovJ7ovKDovKHovKPovKXovKfovKjovKzovK3ovK7ovLTovLXovLbovLfovLrovYDovYFcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmUxYTFcIixcblx0XHRcIui9g+i9h+i9j+i9kVwiLFxuXHRcdDQsXG5cdFx0XCLovZjovZ3ovZ7ovaXovp3ovqDovqHovqTovqXovqbovrXovrbovrjovr7ov4Dov4Hov4bov4rov4vov43ov5Dov5Lov5Pov5Xov6Dov6Pov6Tov6jov67ov7Hov7Xov7bov7vov77pgILpgITpgIjpgIzpgJjpgJvpgKjpgKnpgK/pgKrpgKzpgK3pgLPpgLTpgLfpgL/pgYPpgYTpgYzpgZvpgZ3pgaLpgabpgafpgazpgbDpgbTpgbnpgoXpgojpgovpgozpgo7pgpDpgpXpgpfpgpjpgpnpgpvpgqDpgqHpgqLpgqXpgrDpgrLpgrPpgrTpgrbpgr3pg4zpgr7pg4NcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmUyYTFcIixcblx0XHRcIumDhOmDhemDh+mDiOmDlemDl+mDmOmDmemDnOmDnemDn+mDpemDkumDtumDq+mDr+mDsOmDtOmDvumDv+mEgOmEhOmEhemEhumEiOmEjemEkOmElOmElumEl+mEmOmEmumEnOmEnumEoOmEpemEoumEo+mEp+mEqemErumEr+mEsemEtOmEtumEt+mEuemEuumEvOmEvemFg+mFh+mFiOmFj+mFk+mFl+mFmemFmumFm+mFoemFpOmFp+mFremFtOmFuemFuumFu+mGgemGg+mGhemGhumGiumGjumGkemGk+mGlOmGlemGmOmGnumGoemGpumGqOmGrOmGremGrumGsOmGsemGsumGs+mGtumGu+mGvOmGvemGv1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmZTNhMVwiLFxuXHRcdFwi6YeC6YeD6YeF6YeT6YeU6YeX6YeZ6Yea6Yee6Yek6Yel6Yep6Yeq6YesXCIsXG5cdFx0NSxcblx0XHRcIumHt+mHuemHu+mHvemIgOmIgemIhOmIhemIhumIh+mIiemIiumIjOmIkOmIkumIk+mIlumImOmInOmInemIo+mIpOmIpemIpumIqOmIrumIr+mIsOmIs+mItemItumIuOmIuemIuumIvOmIvumJgOmJgumJg+mJhumJh+mJiumJjemJjumJj+mJkemJmOmJmemJnOmJnemJoOmJoemJpemJp+mJqOmJqemJrumJr+mJsOmJtVwiLFxuXHRcdDQsXG5cdFx0XCLpibvpibzpib3pib/piojpionpiorpio3pio7pipLpipdcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmU0YTFcIixcblx0XHRcIumKmemKn+mKoOmKpOmKpemKp+mKqOmKq+mKr+mKsumKtumKuOmKuumKu+mKvOmKvemKv1wiLFxuXHRcdDQsXG5cdFx0XCLpi4Xpi4bpi4fpi4jpi4vpi4zpi43pi47pi5Dpi5Ppi5Xpi5fpi5jpi5npi5zpi53pi5/pi6Dpi6Hpi6Ppi6Xpi6fpi6jpi6zpi67pi7Dpi7npi7vpi7/pjIDpjILpjIjpjI3pjJHpjJTpjJXpjJzpjJ3pjJ7pjJ/pjKHpjKTpjKXpjKfpjKnpjKrpjLPpjLTpjLbpjLfpjYfpjYjpjYnpjZDpjZHpjZLpjZXpjZfpjZjpjZrpjZ7pjaTpjaXpjafpjanpjarpja3pja/pjbDpjbHpjbPpjbTpjbZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmU1YTFcIixcblx0XHRcIumNuumNvemNv+mOgOmOgemOgumOiOmOiumOi+mOjemOj+mOkumOlemOmOmOm+mOnumOoemOo+mOpOmOpumOqOmOq+mOtOmOtemOtumOuumOqemPgemPhOmPhemPhumPh+mPiVwiLFxuXHRcdDQsXG5cdFx0XCLpj5Ppj5npj5zpj57pj5/pj6Lpj6bpj6fpj7npj7fpj7jpj7rpj7vpj73pkIHpkILpkITpkIjpkInpkI3pkI7pkI/pkJXpkJbpkJfpkJ/pkK7pkK/pkLHpkLLpkLPpkLTpkLvpkL/pkL3pkYPpkYXpkYjpkYrpkYzpkZXpkZnpkZzpkZ/pkaHpkaPpkajpkavpka3pka7pka/pkbHpkbLpkoTpkoPplbjplblcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZmU2YTFcIixcblx0XHRcIumVvumWhOmWiOmWjOmWjemWjumWnemWnumWn+mWoemWpumWqemWq+mWrOmWtOmWtumWuumWvemWv+mXhumXiOmXiemXi+mXkOmXkemXkumXk+mXmemXmumXnemXnumXn+mXoOmXpOmXpumYnemYnumYoumYpOmYpemYpumYrOmYsemYs+mYt+mYuOmYuemYuumYvOmYvemZgemZkumZlOmZlumZl+mZmOmZoemZrumZtOmZu+mZvOmZvumZv+magemagumag+mahOmaiemakemalumamumaneman+mapOmapemapumaqemarumar+mas+mauumbiumbkuW2sumbmOmbmumbnembnumbn+mbqembr+mbsembuumcglwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZTdhMVwiLFxuXHRcdFwi6ZyD6ZyF6ZyJ6Zya6Zyb6Zyd6Zyh6Zyi6Zyj6Zyo6Zyx6Zyz6Z2B6Z2D6Z2K6Z2O6Z2P6Z2V6Z2X6Z2Y6Z2a6Z2b6Z2j6Z2n6Z2q6Z2u6Z2z6Z226Z236Z246Z276Z296Z2/6Z6A6Z6J6Z6V6Z6W6Z6X6Z6Z6Z6a6Z6e6Z6f6Z6i6Z6s6Z6u6Z6x6Z6y6Z616Z626Z646Z656Z666Z686Z6+6Z6/6Z+B6Z+E6Z+F6Z+H6Z+J6Z+K6Z+M6Z+N6Z+O6Z+Q6Z+R6Z+U6Z+X6Z+Y6Z+Z6Z+d6Z+e6Z+g6Z+b6Z+h6Z+k6Z+v6Z+x6Z+06Z+36Z+46Z+66aCH6aCK6aCZ6aCN6aCO6aCU6aCW6aCc6aCe6aCg6aCj6aCmXCJcblx0XSxcblx0W1xuXHRcdFwiOGZlOGExXCIsXG5cdFx0XCLpoKvpoK7poK/poLDpoLLpoLPpoLXpoKXpoL7poYTpoYfpoYrpoZHpoZLpoZPpoZbpoZfpoZnpoZrpoaLpoaPpoaXpoabpoarpoazpoqvpoq3poq7porDporTporfporjporrporvpor/po4Lpo4Xpo4jpo4zpo6Hpo6Ppo6Xpo6bpo6fpo6rpo7Ppo7bppILppIfppIjppJHppJXppJbppJfppJrppJvppJzppJ/ppKLppKbppKfppKvppLFcIixcblx0XHQ0LFxuXHRcdFwi6aS56aS66aS76aS86aWA6aWB6aWG6aWH6aWI6aWN6aWO6aWU6aWY6aWZ6aWb6aWc6aWe6aWf6aWg6aab6aad6aaf6aam6aaw6aax6aay6aa1XCJcblx0XSxcblx0W1xuXHRcdFwiOGZlOWExXCIsXG5cdFx0XCLpprnpprrppr3ppr/pp4Ppp4npp5Ppp5Tpp5npp5rpp5zpp57pp6fpp6rpp6vpp6zpp7Dpp7Tpp7Xpp7npp73pp77pqILpqIPpqITpqIvpqIzpqJDpqJHpqJbpqJ7pqKDpqKLpqKPpqKTpqKfpqK3pqK7pqLPpqLXpqLbpqLjpqYfpqYHpqYTpqYrpqYvpqYzpqY7pqZHpqZTpqZbpqZ3pqqrpqqzpqq7pqq/pqrLpqrTpqrXpqrbpqrnpqrvpqr7pqr/pq4Hpq4Ppq4bpq4jpq47pq5Dpq5Lpq5Xpq5bpq5fpq5vpq5zpq6Dpq6Tpq6Xpq6fpq6npq6zpq7Lpq7Ppq7Xpq7npq7rpq73pq79cIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcIjhmZWFhMVwiLFxuXHRcdFwi6ayE6ayF6ayI6ayJ6ayL6ayM6ayN6ayO6ayQ6ayS6ayW6ayZ6ayb6ayc6ayg6aym6ayr6ayt6ayz6ay06ay16ay36ay56ay66ay96a2I6a2L6a2M6a2V6a2W6a2X6a2b6a2e6a2h6a2j6a2l6a2m6a2o6a2qXCIsXG5cdFx0NCxcblx0XHRcIumts+mttemtt+mtuOmtuemtv+mugOmuhOmuhemuhumuh+muiemuiumui+mujemuj+mukOmulOmumumunemunumupumup+muqemurOmusOmusemusumut+muuOmuu+muvOmuvumuv+mvgemvh+mviOmvjumvkOmvl+mvmOmvnemvn+mvpemvp+mvqumvq+mvr+mvs+mvt+mvuFwiXG5cdF0sXG5cdFtcblx0XHRcIjhmZWJhMVwiLFxuXHRcdFwi6a+56a+66a+96a+/6bCA6bCC6bCL6bCP6bCR6bCW6bCY6bCZ6bCa6bCc6bCe6bCi6bCj6bCmXCIsXG5cdFx0NCxcblx0XHRcIumwsemwtemwtumwt+mwvemxgemxg+mxhOmxhemxiemxiumxjumxj+mxkOmxk+mxlOmxlumxmOmxm+mxnemxnumxn+mxo+mxqemxqumxnOmxq+mxqOmxrumxsOmxsumxtemxt+mxu+mzpumzsumzt+mzuem0i+m0gum0kem0l+m0mOm0nOm0nem0num0r+m0sOm0sum0s+m0tOm0uum0vOm1hem0vem1gum1g+m1h+m1ium1k+m1lOm1n+m1o+m1oum1pem1qem1qum1q+m1sOm1tum1t+m1u1wiXG5cdF0sXG5cdFtcblx0XHRcIjhmZWNhMVwiLFxuXHRcdFwi6bW86bW+6baD6baE6baG6baK6baN6baO6baS6baT6baV6baW6baX6baY6bah6baq6bas6bau6bax6ba16ba56ba86ba/6beD6beH6beJ6beK6beU6beV6beW6beX6bea6bee6bef6beg6bel6ben6bep6ber6beu6bew6bez6be06be+6biK6biC6biH6biO6biQ6biR6biS6biV6biW6biZ6bic6bid6bm66bm76bm86bqA6bqC6bqD6bqE6bqF6bqH6bqO6bqP6bqW6bqY6bqb6bqe6bqk6bqo6bqs6bqu6bqv6bqw6bqz6bq06bq16buG6buI6buL6buV6buf6buk6bun6bus6but6buu6buw6bux6buy6bu1XCJcblx0XSxcblx0W1xuXHRcdFwiOGZlZGExXCIsXG5cdFx0XCLpu7jpu7/pvILpvIPpvInpvI/pvJDpvJHpvJLpvJTpvJbpvJfpvJnpvJrpvJvpvJ/pvKLpvKbpvKrpvKvpvK/pvLHpvLLpvLTpvLfpvLnpvLrpvLzpvL3pvL/pvYHpvYNcIixcblx0XHQ0LFxuXHRcdFwi6b2T6b2V6b2W6b2X6b2Y6b2a6b2d6b2e6b2o6b2p6b2tXCIsXG5cdFx0NCxcblx0XHRcIum9s+m9tem9uum9vem+j+m+kOm+kem+kum+lOm+lum+l+m+num+oem+oum+o+m+pVwiXG5cdF1cbl07XG5cbnZhciBldWNqcCQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdCdkZWZhdWx0JzogZXVjanBcbn0pO1xuXG52YXIgY3A5MzYgPSBbXG5cdFtcblx0XHRcIjBcIixcblx0XHRcIlxcdTAwMDBcIixcblx0XHQxMjcsXG5cdFx0XCLigqxcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MTQwXCIsXG5cdFx0XCLkuILkuITkuIXkuIbkuI/kuJLkuJfkuJ/kuKDkuKHkuKPkuKbkuKnkuK7kuK/kuLHkuLPkuLXkuLfkuLzkuYDkuYHkuYLkuYTkuYbkuYrkuZHkuZXkuZfkuZrkuZvkuaLkuaPkuaTkuaXkuafkuajkuapcIixcblx0XHQ1LFxuXHRcdFwi5Lmy5Lm0XCIsXG5cdFx0OSxcblx0XHRcIuS5v1wiLFxuXHRcdDYsXG5cdFx0XCLkuofkuopcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MTgwXCIsXG5cdFx0XCLkupDkupbkupfkupnkupzkup3kup7kuqPkuqrkuq/kurDkurHkurTkurbkurfkurjkurnkurzkur3kur7ku4jku4zku4/ku5Dku5Lku5rku5vku5zku6Dku6Lku6bku6fku6nku63ku67ku6/ku7Hku7Tku7jku7nku7rku7zku77kvIDkvIJcIixcblx0XHQ2LFxuXHRcdFwi5LyL5LyM5LySXCIsXG5cdFx0NCxcblx0XHRcIuS8nOS8neS8oeS8o+S8qOS8qeS8rOS8reS8ruS8seS8s+S8teS8t+S8ueS8u+S8vlwiLFxuXHRcdDQsXG5cdFx0XCLkvYTkvYXkvYdcIixcblx0XHQ1LFxuXHRcdFwi5L2S5L2U5L2W5L2h5L2i5L2m5L2o5L2q5L2r5L2t5L2u5L2x5L2y5L215L235L245L255L265L295L6A5L6B5L6C5L6F5L6G5L6H5L6K5L6M5L6O5L6Q5L6S5L6T5L6V5L6W5L6Y5L6Z5L6a5L6c5L6e5L6f5L6h5L6iXCJcblx0XSxcblx0W1xuXHRcdFwiODI0MFwiLFxuXHRcdFwi5L6k5L6r5L6t5L6wXCIsXG5cdFx0NCxcblx0XHRcIuS+tlwiLFxuXHRcdDgsXG5cdFx0XCLkv4Dkv4Hkv4Lkv4bkv4fkv4jkv4nkv4vkv4zkv43kv5JcIixcblx0XHQ0LFxuXHRcdFwi5L+Z5L+b5L+g5L+i5L+k5L+l5L+n5L+r5L+s5L+w5L+y5L+05L+15L+25L+35L+55L+75L+85L+95L+/XCIsXG5cdFx0MTFcblx0XSxcblx0W1xuXHRcdFwiODI4MFwiLFxuXHRcdFwi5YCL5YCO5YCQ5YCR5YCT5YCV5YCW5YCX5YCb5YCd5YCe5YCg5YCi5YCj5YCk5YCn5YCr5YCvXCIsXG5cdFx0MTAsXG5cdFx0XCLlgLvlgL3lgL/lgYDlgYHlgYLlgYTlgYXlgYblgYnlgYrlgYvlgY3lgZBcIixcblx0XHQ0LFxuXHRcdFwi5YGW5YGX5YGY5YGZ5YGb5YGdXCIsXG5cdFx0Nyxcblx0XHRcIuWBplwiLFxuXHRcdDUsXG5cdFx0XCLlga1cIixcblx0XHQ4LFxuXHRcdFwi5YG45YG55YG65YG85YG95YKB5YKC5YKD5YKE5YKG5YKH5YKJ5YKK5YKL5YKM5YKOXCIsXG5cdFx0MjAsXG5cdFx0XCLlgqTlgqblgqrlgqvlgq1cIixcblx0XHQ0LFxuXHRcdFwi5YKzXCIsXG5cdFx0Nixcblx0XHRcIuWCvFwiXG5cdF0sXG5cdFtcblx0XHRcIjgzNDBcIixcblx0XHRcIuWCvVwiLFxuXHRcdDE3LFxuXHRcdFwi5YOQXCIsXG5cdFx0NSxcblx0XHRcIuWDl+WDmOWDmeWDm1wiLFxuXHRcdDEwLFxuXHRcdFwi5YOo5YOp5YOq5YOr5YOv5YOw5YOx5YOy5YO05YO2XCIsXG5cdFx0NCxcblx0XHRcIuWDvFwiLFxuXHRcdDksXG5cdFx0XCLlhIhcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MzgwXCIsXG5cdFx0XCLlhInlhIrlhIxcIixcblx0XHQ1LFxuXHRcdFwi5YSTXCIsXG5cdFx0MTMsXG5cdFx0XCLlhKJcIixcblx0XHQyOCxcblx0XHRcIuWFguWFh+WFiuWFjOWFjuWFj+WFkOWFkuWFk+WFl+WFmOWFmeWFm+WFnVwiLFxuXHRcdDQsXG5cdFx0XCLlhaPlhaTlhablhaflhanlharlha/lhbLlhbrlhb7lhb/lhoPlhoTlhoblhoflhorlhovlho7lho/lhpDlhpHlhpPlhpTlhpjlhprlhp3lhp7lhp/lhqHlhqPlhqZcIixcblx0XHQ0LFxuXHRcdFwi5Yat5Yau5Ya05Ya45Ya55Ya65Ya+5Ya/5YeB5YeC5YeD5YeF5YeI5YeK5YeN5YeO5YeQ5YeSXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI4NDQwXCIsXG5cdFx0XCLlh5jlh5nlh5rlh5zlh57lh5/lh6Llh6Plh6VcIixcblx0XHQ1LFxuXHRcdFwi5Yes5Yeu5Yex5Yey5Ye05Ye35Ye+5YiE5YiF5YiJ5YiL5YiM5YiP5YiQ5YiT5YiU5YiV5Yic5Yie5Yif5Yih5Yii5Yij5Yil5Yim5Yin5Yiq5Yis5Yiv5Yix5Yiy5Yi05Yi15Yi85Yi+5YmEXCIsXG5cdFx0NSxcblx0XHRcIuWJi+WJjuWJj+WJkuWJk+WJleWJl+WJmFwiXG5cdF0sXG5cdFtcblx0XHRcIjg0ODBcIixcblx0XHRcIuWJmeWJmuWJm+WJneWJn+WJoOWJouWJo+WJpOWJpuWJqOWJq+WJrOWJreWJruWJsOWJseWJs1wiLFxuXHRcdDksXG5cdFx0XCLlib7lioDlioNcIixcblx0XHQ0LFxuXHRcdFwi5YqJXCIsXG5cdFx0Nixcblx0XHRcIuWKkeWKkuWKlFwiLFxuXHRcdDYsXG5cdFx0XCLlipzliqTliqXliqbliqfliq7liq/lirDlirRcIixcblx0XHQ5LFxuXHRcdFwi5YuA5YuB5YuC5YuE5YuF5YuG5YuI5YuK5YuM5YuN5YuO5YuP5YuR5YuT5YuU5YuV5YuX5YuZXCIsXG5cdFx0NSxcblx0XHRcIuWLoOWLoeWLouWLo+WLpVwiLFxuXHRcdDEwLFxuXHRcdFwi5YuxXCIsXG5cdFx0Nyxcblx0XHRcIuWLu+WLvOWLveWMgeWMguWMg+WMhOWMh+WMieWMiuWMi+WMjOWMjlwiXG5cdF0sXG5cdFtcblx0XHRcIjg1NDBcIixcblx0XHRcIuWMkeWMkuWMk+WMlOWMmOWMm+WMnOWMnuWMn+WMouWMpOWMpeWMp+WMqOWMqeWMq+WMrOWMreWMr1wiLFxuXHRcdDksXG5cdFx0XCLljLzljL3ljYDljYLljYTljYbljYvljYzljY3ljZDljZTljZjljZnljZvljZ3ljaXljajljarljazlja3ljbLljbbljbnljbvljbzljb3ljb7ljoDljoHljoPljofljojljorljo7ljo9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4NTgwXCIsXG5cdFx0XCLljpBcIixcblx0XHQ0LFxuXHRcdFwi5Y6W5Y6X5Y6Z5Y6b5Y6c5Y6e5Y6g5Y6h5Y6k5Y6n5Y6q5Y6r5Y6s5Y6t5Y6vXCIsXG5cdFx0Nixcblx0XHRcIuWOt+WOuOWOueWOuuWOvOWOveWOvuWPgOWPg1wiLFxuXHRcdDQsXG5cdFx0XCLlj47lj4/lj5Dlj5Llj5Plj5Xlj5rlj5zlj53lj57lj6Hlj6Llj6flj7Tlj7rlj77lj7/lkIDlkILlkIXlkIflkIvlkJTlkJjlkJnlkJrlkJzlkKLlkKTlkKXlkKrlkLDlkLPlkLblkLflkLrlkL3lkL/lkYHlkYLlkYTlkYXlkYflkYnlkYzlkY3lkY7lkY/lkZHlkZrlkZ1cIixcblx0XHQ0LFxuXHRcdFwi5ZGj5ZGl5ZGn5ZGpXCIsXG5cdFx0Nyxcblx0XHRcIuWRtOWRueWRuuWRvuWRv+WSgeWSg+WSheWSh+WSiOWSieWSiuWSjeWSkeWSk+WSl+WSmOWSnOWSnuWSn+WSoOWSoVwiXG5cdF0sXG5cdFtcblx0XHRcIjg2NDBcIixcblx0XHRcIuWSouWSpeWSruWSsOWSsuWSteWStuWSt+WSueWSuuWSvOWSvuWTg+WTheWTiuWTi+WTluWTmOWTm+WToFwiLFxuXHRcdDQsXG5cdFx0XCLlk6vlk6zlk6/lk7Dlk7Hlk7RcIixcblx0XHQ1LFxuXHRcdFwi5ZO75ZO+5ZSA5ZSC5ZSD5ZSE5ZSF5ZSI5ZSKXCIsXG5cdFx0NCxcblx0XHRcIuWUkuWUk+WUlVwiLFxuXHRcdDUsXG5cdFx0XCLllJzllJ3llJ7llJ/llKHllKXllKZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NjgwXCIsXG5cdFx0XCLllKjllKnllKvllK3llLLllLTllLXllLbllLjllLnllLrllLvllL3llYDllYLllYXllYfllYjllYtcIixcblx0XHQ0LFxuXHRcdFwi5ZWR5ZWS5ZWT5ZWU5ZWXXCIsXG5cdFx0NCxcblx0XHRcIuWVneWVnuWVn+WVoOWVouWVo+WVqOWVqeWVq+WVr1wiLFxuXHRcdDUsXG5cdFx0XCLllbnllbrllb3llb/lloXllobllozllo3llo7llpDllpLllpPllpXllpbllpfllprllpvllp7llqBcIixcblx0XHQ2LFxuXHRcdFwi5ZaoXCIsXG5cdFx0OCxcblx0XHRcIuWWsuWWtOWWtuWWuOWWuuWWvOWWv1wiLFxuXHRcdDQsXG5cdFx0XCLll4bll4fll4jll4rll4vll47ll4/ll5Dll5Xll5dcIixcblx0XHQ0LFxuXHRcdFwi5Zee5Zeg5Zei5Zen5Zep5Zet5Zeu5Zew5Zex5Ze05Ze25Ze4XCIsXG5cdFx0NCxcblx0XHRcIuWXv+WYguWYg+WYhOWYhVwiXG5cdF0sXG5cdFtcblx0XHRcIjg3NDBcIixcblx0XHRcIuWYhuWYh+WYiuWYi+WYjeWYkFwiLFxuXHRcdDcsXG5cdFx0XCLlmJnlmJrlmJzlmJ3lmKDlmKHlmKLlmKXlmKblmKjlmKnlmKrlmKvlmK7lmK/lmLDlmLPlmLXlmLflmLjlmLrlmLzlmL3lmL7lmYBcIixcblx0XHQxMSxcblx0XHRcIuWZj1wiLFxuXHRcdDQsXG5cdFx0XCLlmZXlmZblmZrlmZvlmZ1cIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcIjg3ODBcIixcblx0XHRcIuWZo+WZpeWZpuWZp+WZreWZruWZr+WZsOWZsuWZs+WZtOWZteWZt+WZuOWZueWZuuWZvVwiLFxuXHRcdDcsXG5cdFx0XCLlmodcIixcblx0XHQ2LFxuXHRcdFwi5ZqQ5ZqR5ZqS5ZqUXCIsXG5cdFx0MTQsXG5cdFx0XCLlmqRcIixcblx0XHQxMCxcblx0XHRcIuWasFwiLFxuXHRcdDYsXG5cdFx0XCLlmrjlmrnlmrrlmrvlmr1cIixcblx0XHQxMixcblx0XHRcIuWbi1wiLFxuXHRcdDgsXG5cdFx0XCLlm5Xlm5blm5jlm5nlm5zlm6Plm6VcIixcblx0XHQ1LFxuXHRcdFwi5Zus5Zuu5Zuv5Zuy5Zuz5Zu25Zu35Zu45Zu75Zu85ZyA5ZyB5ZyC5ZyF5ZyH5ZyLXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCI4ODQwXCIsXG5cdFx0XCLlnJJcIixcblx0XHQ5LFxuXHRcdFwi5Zyd5Zye5Zyg5Zyh5Zyi5Zyk5Zyl5Zym5Zyn5Zyr5Zyx5Zyy5Zy0XCIsXG5cdFx0NCxcblx0XHRcIuWcvOWcveWcv+WdgeWdg+WdhOWdheWdhuWdiOWdieWdi+WdklwiLFxuXHRcdDQsXG5cdFx0XCLlnZjlnZnlnaLlnaPlnaXlnaflnazlna7lnbDlnbHlnbLlnbTlnbXlnbjlnbnlnbrlnb3lnb7lnb/lnoBcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ODgwXCIsXG5cdFx0XCLlnoHlnoflnojlnonlnorlno1cIixcblx0XHQ0LFxuXHRcdFwi5Z6UXCIsXG5cdFx0Nixcblx0XHRcIuWenOWeneWenuWen+WepeWeqOWequWerOWer+WesOWeseWes+WeteWetuWet+WeuVwiLFxuXHRcdDgsXG5cdFx0XCLln4RcIixcblx0XHQ2LFxuXHRcdFwi5Z+M5Z+N5Z+Q5Z+R5Z+T5Z+W5Z+X5Z+b5Z+c5Z+e5Z+h5Z+i5Z+j5Z+lXCIsXG5cdFx0Nyxcblx0XHRcIuWfruWfsOWfseWfsuWfs+WfteWftuWft+Wfu+WfvOWfvuWfv+WggeWgg+WghOWgheWgiOWgieWgiuWgjOWgjuWgj+WgkOWgkuWgk+WglOWgluWgl+WgmOWgmuWgm+WgnOWgneWgn+WgouWgo+WgpVwiLFxuXHRcdDQsXG5cdFx0XCLloKtcIixcblx0XHQ0LFxuXHRcdFwi5aCx5aCy5aCz5aC05aC2XCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCI4OTQwXCIsXG5cdFx0XCLloL5cIixcblx0XHQ1LFxuXHRcdFwi5aGFXCIsXG5cdFx0Nixcblx0XHRcIuWhjuWhj+WhkOWhkuWhk+WhleWhluWhl+WhmVwiLFxuXHRcdDQsXG5cdFx0XCLloZ9cIixcblx0XHQ1LFxuXHRcdFwi5aGmXCIsXG5cdFx0NCxcblx0XHRcIuWhrVwiLFxuXHRcdDE2LFxuXHRcdFwi5aG/5aKC5aKE5aKG5aKH5aKI5aKK5aKL5aKMXCJcblx0XSxcblx0W1xuXHRcdFwiODk4MFwiLFxuXHRcdFwi5aKNXCIsXG5cdFx0NCxcblx0XHRcIuWilFwiLFxuXHRcdDQsXG5cdFx0XCLlopvlopzlop3loqBcIixcblx0XHQ3LFxuXHRcdFwi5aKqXCIsXG5cdFx0MTcsXG5cdFx0XCLlor3lor7lor/lo4Dlo4Llo4Plo4Tlo4ZcIixcblx0XHQxMCxcblx0XHRcIuWjkuWjk+WjlOWjllwiLFxuXHRcdDEzLFxuXHRcdFwi5aOlXCIsXG5cdFx0NSxcblx0XHRcIuWjreWjr+WjseWjsuWjtOWjteWjt+WjuOWjulwiLFxuXHRcdDcsXG5cdFx0XCLlpIPlpIXlpIblpIhcIixcblx0XHQ0LFxuXHRcdFwi5aSO5aSQ5aSR5aSS5aST5aSX5aSY5aSb5aSd5aSe5aSg5aSh5aSi5aSj5aSm5aSo5aSs5aSw5aSy5aSz5aS15aS25aS7XCJcblx0XSxcblx0W1xuXHRcdFwiOGE0MFwiLFxuXHRcdFwi5aS95aS+5aS/5aWA5aWD5aWF5aWG5aWK5aWM5aWN5aWQ5aWS5aWT5aWZ5aWbXCIsXG5cdFx0NCxcblx0XHRcIuWloeWlo+WlpOWlplwiLFxuXHRcdDEyLFxuXHRcdFwi5aW15aW35aW65aW75aW85aW+5aW/5aaA5aaF5aaJ5aaL5aaM5aaO5aaP5aaQ5aaR5aaU5aaV5aaY5aaa5aab5aac5aad5aaf5aag5aah5aai5aamXCJcblx0XSxcblx0W1xuXHRcdFwiOGE4MFwiLFxuXHRcdFwi5aan5aas5aat5aaw5aax5aazXCIsXG5cdFx0NSxcblx0XHRcIuWmuuWmvOWmveWmv1wiLFxuXHRcdDYsXG5cdFx0XCLlp4flp4jlp4nlp4zlp43lp47lp4/lp5Xlp5blp5nlp5vlp55cIixcblx0XHQ0LFxuXHRcdFwi5aek5aem5aen5aep5aeq5aer5aetXCIsXG5cdFx0MTEsXG5cdFx0XCLlp7rlp7zlp73lp77lqIDlqILlqIrlqIvlqI3lqI7lqI/lqJDlqJLlqJTlqJXlqJblqJflqJnlqJrlqJvlqJ3lqJ7lqKHlqKLlqKTlqKblqKflqKjlqKpcIixcblx0XHQ2LFxuXHRcdFwi5aiz5ai15ai3XCIsXG5cdFx0NCxcblx0XHRcIuWoveWovuWov+WpgVwiLFxuXHRcdDQsXG5cdFx0XCLlqYflqYjlqYtcIixcblx0XHQ5LFxuXHRcdFwi5amW5amX5amY5amZ5ambXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI4YjQwXCIsXG5cdFx0XCLlqaHlqaPlqaTlqaXlqablqajlqanlqatcIixcblx0XHQ4LFxuXHRcdFwi5am45am55am75am85am95am+5aqAXCIsXG5cdFx0MTcsXG5cdFx0XCLlqpNcIixcblx0XHQ2LFxuXHRcdFwi5aqcXCIsXG5cdFx0MTMsXG5cdFx0XCLlqqvlqqxcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YjgwXCIsXG5cdFx0XCLlqq1cIixcblx0XHQ0LFxuXHRcdFwi5aq05aq25aq35aq5XCIsXG5cdFx0NCxcblx0XHRcIuWqv+WrgOWrg1wiLFxuXHRcdDUsXG5cdFx0XCLlq4rlq4vlq41cIixcblx0XHQ0LFxuXHRcdFwi5auT5auV5auX5auZ5aua5aub5aud5aue5auf5aui5auk5aul5aun5auo5auq5ausXCIsXG5cdFx0NCxcblx0XHRcIuWrslwiLFxuXHRcdDIyLFxuXHRcdFwi5ayKXCIsXG5cdFx0MTEsXG5cdFx0XCLlrJhcIixcblx0XHQyNSxcblx0XHRcIuWss+WsteWstuWsuFwiLFxuXHRcdDcsXG5cdFx0XCLlrYFcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcIjhjNDBcIixcblx0XHRcIuWtiFwiLFxuXHRcdDcsXG5cdFx0XCLlrZLlrZblrZ7lraDlraHlraflrajlravlra3lra7lra/lrbLlrbTlrbblrbflrbjlrbnlrbvlrbzlrb7lrb/lroLlroblrorlro3lro7lrpDlrpHlrpLlrpTlrpblrp/lrqflrqjlrqnlrqzlrq3lrq7lrq/lrrHlrrLlrrflrrrlrrvlrrzlr4Dlr4Hlr4Plr4jlr4nlr4rlr4vlr43lr47lr49cIlxuXHRdLFxuXHRbXG5cdFx0XCI4YzgwXCIsXG5cdFx0XCLlr5Hlr5RcIixcblx0XHQ4LFxuXHRcdFwi5a+g5a+i5a+j5a+m5a+n5a+pXCIsXG5cdFx0NCxcblx0XHRcIuWvr+WvsVwiLFxuXHRcdDYsXG5cdFx0XCLlr73lr77lsIDlsILlsIPlsIXlsIflsIjlsIvlsIzlsI3lsI7lsJDlsJLlsJPlsJflsJnlsJvlsJ7lsJ/lsKDlsKHlsKPlsKblsKjlsKnlsKrlsKvlsK3lsK7lsK/lsLDlsLLlsLPlsLXlsLblsLflsYPlsYTlsYblsYflsYzlsY3lsZLlsZPlsZTlsZblsZflsZjlsZrlsZvlsZzlsZ3lsZ/lsaLlsaTlsadcIixcblx0XHQ2LFxuXHRcdFwi5bGw5bGyXCIsXG5cdFx0Nixcblx0XHRcIuWxu+WxvOWxveWxvuWygOWyg1wiLFxuXHRcdDQsXG5cdFx0XCLlsonlsorlsovlso7lso/lspLlspPlspXlsp1cIixcblx0XHQ0LFxuXHRcdFwi5bKkXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCI4ZDQwXCIsXG5cdFx0XCLlsqrlsq7lsq/lsrDlsrLlsrTlsrblsrnlsrrlsrvlsrzlsr7ls4Dls4Lls4Pls4VcIixcblx0XHQ1LFxuXHRcdFwi5bOMXCIsXG5cdFx0NSxcblx0XHRcIuWzk1wiLFxuXHRcdDUsXG5cdFx0XCLls5pcIixcblx0XHQ2LFxuXHRcdFwi5bOi5bOj5bOn5bOp5bOr5bOs5bOu5bOv5bOxXCIsXG5cdFx0OSxcblx0XHRcIuWzvFwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiOGQ4MFwiLFxuXHRcdFwi5bSB5bSE5bSF5bSIXCIsXG5cdFx0NSxcblx0XHRcIuW0j1wiLFxuXHRcdDQsXG5cdFx0XCLltJXltJfltJjltJnltJrltJzltJ3ltJ9cIixcblx0XHQ0LFxuXHRcdFwi5bSl5bSo5bSq5bSr5bSs5bSvXCIsXG5cdFx0NCxcblx0XHRcIuW0tVwiLFxuXHRcdDcsXG5cdFx0XCLltL9cIixcblx0XHQ3LFxuXHRcdFwi5bWI5bWJ5bWNXCIsXG5cdFx0MTAsXG5cdFx0XCLltZnltZrltZzltZ5cIixcblx0XHQxMCxcblx0XHRcIuW1quW1reW1ruW1sOW1seW1suW1s+W1tVwiLFxuXHRcdDEyLFxuXHRcdFwi5baDXCIsXG5cdFx0MjEsXG5cdFx0XCLltprltpvltpzltp7ltp/ltqBcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZTQwXCIsXG5cdFx0XCLltqFcIixcblx0XHQyMSxcblx0XHRcIuW2uFwiLFxuXHRcdDEyLFxuXHRcdFwi5beGXCIsXG5cdFx0Nixcblx0XHRcIuW3jlwiLFxuXHRcdDEyLFxuXHRcdFwi5bec5bef5beg5bej5bek5beq5bes5betXCJcblx0XSxcblx0W1xuXHRcdFwiOGU4MFwiLFxuXHRcdFwi5bew5be15be25be4XCIsXG5cdFx0NCxcblx0XHRcIuW3v+W4gOW4hOW4h+W4ieW4iuW4i+W4jeW4juW4kuW4k+W4l+W4nlwiLFxuXHRcdDcsXG5cdFx0XCLluKhcIixcblx0XHQ0LFxuXHRcdFwi5biv5biw5biyXCIsXG5cdFx0NCxcblx0XHRcIuW4ueW4uuW4vuW4v+W5gOW5geW5g+W5hlwiLFxuXHRcdDUsXG5cdFx0XCLluY1cIixcblx0XHQ2LFxuXHRcdFwi5bmWXCIsXG5cdFx0NCxcblx0XHRcIuW5nOW5neW5n+W5oOW5o1wiLFxuXHRcdDE0LFxuXHRcdFwi5bm15bm35bm55bm+5bqB5bqC5bqD5bqF5bqI5bqJ5bqM5bqN5bqO5bqS5bqY5bqb5bqd5bqh5bqi5bqj5bqk5bqoXCIsXG5cdFx0NCxcblx0XHRcIuW6rlwiLFxuXHRcdDQsXG5cdFx0XCLlurTlurrlurvlurzlur3lur9cIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcIjhmNDBcIixcblx0XHRcIuW7huW7h+W7iOW7i1wiLFxuXHRcdDUsXG5cdFx0XCLlu5Tlu5Xlu5flu5jlu5nlu5rlu5xcIixcblx0XHQxMSxcblx0XHRcIuW7qeW7q1wiLFxuXHRcdDgsXG5cdFx0XCLlu7Xlu7jlu7nlu7vlu7zlu73lvIXlvIblvIflvInlvIzlvI3lvI7lvJDlvJLlvJTlvJblvJnlvJrlvJzlvJ3lvJ7lvKHlvKLlvKPlvKRcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZjgwXCIsXG5cdFx0XCLlvKjlvKvlvKzlvK7lvLDlvLJcIixcblx0XHQ2LFxuXHRcdFwi5by75by95by+5by/5b2BXCIsXG5cdFx0MTQsXG5cdFx0XCLlvZHlvZTlvZnlvZrlvZvlvZzlvZ7lvZ/lvaDlvaPlvaXlvaflvajlvavlva7lva/lvbLlvbTlvbXlvbblvbjlvbrlvb3lvb7lvb/lvoPlvoblvo3lvo7lvo/lvpHlvpPlvpTlvpblvprlvpvlvp3lvp7lvp/lvqDlvqJcIixcblx0XHQ1LFxuXHRcdFwi5b6p5b6r5b6s5b6vXCIsXG5cdFx0NSxcblx0XHRcIuW+tuW+uOW+ueW+uuW+u+W+vlwiLFxuXHRcdDQsXG5cdFx0XCLlv4flv4jlv4rlv4vlv47lv5Plv5Tlv5Xlv5rlv5vlv5zlv57lv5/lv6Llv6Plv6Xlv6blv6jlv6nlv6zlv6/lv7Dlv7Llv7Plv7Tlv7blv7flv7nlv7rlv7zmgIdcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MDQwXCIsXG5cdFx0XCLmgIjmgInmgIvmgIzmgJDmgJHmgJPmgJfmgJjmgJrmgJ7mgJ/mgKLmgKPmgKTmgKzmgK3mgK7mgLBcIixcblx0XHQ0LFxuXHRcdFwi5oC2XCIsXG5cdFx0NCxcblx0XHRcIuaAveaAvuaBgOaBhFwiLFxuXHRcdDYsXG5cdFx0XCLmgYzmgY7mgY/mgZHmgZPmgZTmgZbmgZfmgZjmgZvmgZzmgZ7mgZ/mgaDmgaHmgaXmgabmga7mgbHmgbLmgbTmgbXmgbfmgb7mgoBcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MDgwXCIsXG5cdFx0XCLmgoHmgoLmgoXmgobmgofmgojmgormgovmgo7mgo/mgpDmgpHmgpPmgpXmgpfmgpjmgpnmgpzmgp7mgqHmgqLmgqTmgqXmgqfmgqnmgqrmgq7mgrDmgrPmgrXmgrbmgrfmgrnmgrrmgr1cIixcblx0XHQ3LFxuXHRcdFwi5oOH5oOI5oOJ5oOMXCIsXG5cdFx0NCxcblx0XHRcIuaDkuaDk+aDlOaDluaDl+aDmeaDm+aDnuaDoVwiLFxuXHRcdDQsXG5cdFx0XCLmg6rmg7Hmg7Lmg7Xmg7fmg7jmg7tcIixcblx0XHQ0LFxuXHRcdFwi5oSC5oSD5oSE5oSF5oSH5oSK5oSL5oSM5oSQXCIsXG5cdFx0NCxcblx0XHRcIuaEluaEl+aEmOaEmeaEm+aEnOaEneaEnuaEoeaEouaEpeaEqOaEqeaEquaErFwiLFxuXHRcdDE4LFxuXHRcdFwi5oWAXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCI5MTQwXCIsXG5cdFx0XCLmhYfmhYnmhYvmhY3mhY/mhZDmhZLmhZPmhZTmhZZcIixcblx0XHQ2LFxuXHRcdFwi5oWe5oWf5oWg5oWh5oWj5oWk5oWl5oWm5oWpXCIsXG5cdFx0Nixcblx0XHRcIuaFseaFsuaFs+aFtOaFtuaFuFwiLFxuXHRcdDE4LFxuXHRcdFwi5oaM5oaN5oaPXCIsXG5cdFx0NCxcblx0XHRcIuaGlVwiXG5cdF0sXG5cdFtcblx0XHRcIjkxODBcIixcblx0XHRcIuaGllwiLFxuXHRcdDYsXG5cdFx0XCLmhp5cIixcblx0XHQ4LFxuXHRcdFwi5oaq5oar5oatXCIsXG5cdFx0OSxcblx0XHRcIuaGuFwiLFxuXHRcdDUsXG5cdFx0XCLmhr/mh4Dmh4Hmh4NcIixcblx0XHQ0LFxuXHRcdFwi5oeJ5oeMXCIsXG5cdFx0NCxcblx0XHRcIuaHk+aHlVwiLFxuXHRcdDE2LFxuXHRcdFwi5oenXCIsXG5cdFx0MTMsXG5cdFx0XCLmh7ZcIixcblx0XHQ4LFxuXHRcdFwi5oiAXCIsXG5cdFx0NSxcblx0XHRcIuaIh+aIieaIk+aIlOaImeaInOaIneaInuaIoOaIo+aIpuaIp+aIqOaIqeaIq+aIreaIr+aIsOaIseaIsuaIteaItuaIuFwiLFxuXHRcdDQsXG5cdFx0XCLmiYLmiYTmiYXmiYbmiYpcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MjQwXCIsXG5cdFx0XCLmiY/miZDmiZXmiZbmiZfmiZnmiZrmiZxcIixcblx0XHQ2LFxuXHRcdFwi5omk5oml5omo5omx5omy5om05om15om35om45om65om75om95oqB5oqC5oqD5oqF5oqG5oqH5oqI5oqLXCIsXG5cdFx0NSxcblx0XHRcIuaKlOaKmeaKnOaKneaKnuaKo+aKpuaKp+aKqeaKquaKreaKruaKr+aKsOaKsuaKs+aKtOaKtuaKt+aKuOaKuuaKvuaLgOaLgVwiXG5cdF0sXG5cdFtcblx0XHRcIjkyODBcIixcblx0XHRcIuaLg+aLi+aLj+aLkeaLleaLneaLnuaLoOaLoeaLpOaLquaLq+aLsOaLsuaLteaLuOaLueaLuuaLu+aMgOaMg+aMhOaMheaMhuaMiuaMi+aMjOaMjeaMj+aMkOaMkuaMk+aMlOaMleaMl+aMmOaMmeaMnOaMpuaMp+aMqeaMrOaMreaMruaMsOaMseaMs1wiLFxuXHRcdDUsXG5cdFx0XCLmjLvmjLzmjL7mjL/mjYDmjYHmjYTmjYfmjYjmjYrmjZHmjZLmjZPmjZTmjZZcIixcblx0XHQ3LFxuXHRcdFwi5o2g5o2k5o2l5o2m5o2o5o2q5o2r5o2s5o2v5o2w5o2y5o2z5o205o215o245o255o285o295o2+5o2/5o6B5o6D5o6E5o6F5o6G5o6L5o6N5o6R5o6T5o6U5o6V5o6X5o6ZXCIsXG5cdFx0Nixcblx0XHRcIuaOoeaOpOaOpuaOq+aOr+aOseaOsuaOteaOtuaOueaOu+aOveaOv+aPgFwiXG5cdF0sXG5cdFtcblx0XHRcIjkzNDBcIixcblx0XHRcIuaPgeaPguaPg+aPheaPh+aPiOaPiuaPi+aPjOaPkeaPk+aPlOaPleaPl1wiLFxuXHRcdDYsXG5cdFx0XCLmj5/mj6Lmj6RcIixcblx0XHQ0LFxuXHRcdFwi5o+r5o+s5o+u5o+v5o+w5o+x5o+z5o+15o+35o+55o+65o+75o+85o++5pCD5pCE5pCGXCIsXG5cdFx0NCxcblx0XHRcIuaQjeaQjuaQkeaQkuaQlVwiLFxuXHRcdDUsXG5cdFx0XCLmkJ3mkJ/mkKLmkKPmkKRcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MzgwXCIsXG5cdFx0XCLmkKXmkKfmkKjmkKnmkKvmkK5cIixcblx0XHQ1LFxuXHRcdFwi5pC1XCIsXG5cdFx0NCxcblx0XHRcIuaQu+aQvOaQvuaRgOaRguaRg+aRieaRi1wiLFxuXHRcdDYsXG5cdFx0XCLmkZPmkZXmkZbmkZfmkZlcIixcblx0XHQ0LFxuXHRcdFwi5pGfXCIsXG5cdFx0Nyxcblx0XHRcIuaRqOaRquaRq+aRrOaRrlwiLFxuXHRcdDksXG5cdFx0XCLmkbtcIixcblx0XHQ2LFxuXHRcdFwi5pKD5pKG5pKIXCIsXG5cdFx0OCxcblx0XHRcIuaSk+aSlOaSl+aSmOaSmuaSm+aSnOaSneaSn1wiLFxuXHRcdDQsXG5cdFx0XCLmkqXmkqbmkqfmkqjmkqrmkqvmkq/mkrHmkrLmkrPmkrTmkrbmkrnmkrvmkr3mkr7mkr/mk4Hmk4Pmk4Tmk4ZcIixcblx0XHQ2LFxuXHRcdFwi5pOP5pOR5pOT5pOU5pOV5pOW5pOZ5pOaXCJcblx0XSxcblx0W1xuXHRcdFwiOTQ0MFwiLFxuXHRcdFwi5pOb5pOc5pOd5pOf5pOg5pOh5pOj5pOl5pOnXCIsXG5cdFx0MjQsXG5cdFx0XCLmlIFcIixcblx0XHQ3LFxuXHRcdFwi5pSKXCIsXG5cdFx0Nyxcblx0XHRcIuaUk1wiLFxuXHRcdDQsXG5cdFx0XCLmlJlcIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjk0ODBcIixcblx0XHRcIuaUouaUo+aUpOaUplwiLFxuXHRcdDQsXG5cdFx0XCLmlKzmlK3mlLDmlLHmlLLmlLPmlLfmlLrmlLzmlL3mlYBcIixcblx0XHQ0LFxuXHRcdFwi5pWG5pWH5pWK5pWL5pWN5pWO5pWQ5pWS5pWT5pWU5pWX5pWY5pWa5pWc5pWf5pWg5pWh5pWk5pWl5pWn5pWo5pWp5pWq5pWt5pWu5pWv5pWx5pWz5pW15pW25pW4XCIsXG5cdFx0MTQsXG5cdFx0XCLmlojmlonmlormlo3mlo7mlo/mlpLmlpTmlpXmlpbmlpjmlprmlp3mlp7mlqDmlqLmlqPmlqbmlqjmlqrmlqzmlq7mlrFcIixcblx0XHQ3LFxuXHRcdFwi5pa65pa75pa+5pa/5peA5peC5peH5peI5peJ5peK5peN5peQ5peR5peT5peU5peV5peYXCIsXG5cdFx0Nyxcblx0XHRcIuaXoeaXo+aXpOaXquaXq1wiXG5cdF0sXG5cdFtcblx0XHRcIjk1NDBcIixcblx0XHRcIuaXsuaXs+aXtOaXteaXuOaXueaXu1wiLFxuXHRcdDQsXG5cdFx0XCLmmIHmmITmmIXmmIfmmIjmmInmmIvmmI3mmJDmmJHmmJLmmJbmmJfmmJjmmJrmmJvmmJzmmJ7mmKHmmKLmmKPmmKTmmKbmmKnmmKrmmKvmmKzmmK7mmLDmmLLmmLPmmLdcIixcblx0XHQ0LFxuXHRcdFwi5pi95pi/5pmA5pmC5pmEXCIsXG5cdFx0Nixcblx0XHRcIuaZjeaZjuaZkOaZkeaZmFwiXG5cdF0sXG5cdFtcblx0XHRcIjk1ODBcIixcblx0XHRcIuaZmeaZm+aZnOaZneaZnuaZoOaZouaZo+aZpeaZp+aZqVwiLFxuXHRcdDQsXG5cdFx0XCLmmbHmmbLmmbPmmbXmmbjmmbnmmbvmmbzmmb3mmb/mmoDmmoHmmoPmmoXmmobmmojmmonmmormmovmmo3mmo7mmo/mmpDmmpLmmpPmmpTmmpXmmphcIixcblx0XHQ0LFxuXHRcdFwi5pqeXCIsXG5cdFx0OCxcblx0XHRcIuaaqVwiLFxuXHRcdDQsXG5cdFx0XCLmmq9cIixcblx0XHQ0LFxuXHRcdFwi5pq15pq25pq35pq45pq65pq75pq85pq95pq/XCIsXG5cdFx0MjUsXG5cdFx0XCLmm5rmm55cIixcblx0XHQ3LFxuXHRcdFwi5pun5puo5puqXCIsXG5cdFx0NSxcblx0XHRcIuabseabteabtuabuOabuuabu+abveacgeacguacg1wiXG5cdF0sXG5cdFtcblx0XHRcIjk2NDBcIixcblx0XHRcIuachOacheachuach+acjOacjuacj+ackeackuack+acluacmOacmeacmuacnOacnuacoFwiLFxuXHRcdDUsXG5cdFx0XCLmnKfmnKnmnK7mnLDmnLLmnLPmnLbmnLfmnLjmnLnmnLvmnLzmnL7mnL/mnYHmnYTmnYXmnYfmnYrmnYvmnY3mnZLmnZTmnZXmnZdcIixcblx0XHQ0LFxuXHRcdFwi5p2d5p2i5p2j5p2k5p2m5p2n5p2r5p2s5p2u5p2x5p205p22XCJcblx0XSxcblx0W1xuXHRcdFwiOTY4MFwiLFxuXHRcdFwi5p245p255p265p275p295p6A5p6C5p6D5p6F5p6G5p6I5p6K5p6M5p6N5p6O5p6P5p6R5p6S5p6T5p6U5p6W5p6Z5p6b5p6f5p6g5p6h5p6k5p6m5p6p5p6s5p6u5p6x5p6y5p605p65XCIsXG5cdFx0Nyxcblx0XHRcIuafguafhVwiLFxuXHRcdDksXG5cdFx0XCLmn5Xmn5bmn5fmn5vmn5/mn6Hmn6Pmn6Tmn6bmn6fmn6jmn6rmn6vmn63mn67mn7Lmn7VcIixcblx0XHQ3LFxuXHRcdFwi5p++5qCB5qCC5qCD5qCE5qCG5qCN5qCQ5qCS5qCU5qCV5qCYXCIsXG5cdFx0NCxcblx0XHRcIuagnuagn+agoOagolwiLFxuXHRcdDYsXG5cdFx0XCLmoKtcIixcblx0XHQ2LFxuXHRcdFwi5qC05qC15qC25qC65qC75qC/5qGH5qGL5qGN5qGP5qGS5qGWXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI5NzQwXCIsXG5cdFx0XCLmoZzmoZ3moZ7moZ/moarmoaxcIixcblx0XHQ3LFxuXHRcdFwi5qG15qG4XCIsXG5cdFx0OCxcblx0XHRcIuaiguaihOaih1wiLFxuXHRcdDcsXG5cdFx0XCLmopDmopHmopLmopTmopXmopbmophcIixcblx0XHQ5LFxuXHRcdFwi5qKj5qKk5qKl5qKp5qKq5qKr5qKs5qKu5qKx5qKy5qK05qK25qK35qK4XCJcblx0XSxcblx0W1xuXHRcdFwiOTc4MFwiLFxuXHRcdFwi5qK5XCIsXG5cdFx0Nixcblx0XHRcIuajgeajg1wiLFxuXHRcdDUsXG5cdFx0XCLmo4rmo4zmo47mo4/mo5Dmo5Hmo5Pmo5Tmo5bmo5fmo5nmo5tcIixcblx0XHQ0LFxuXHRcdFwi5qOh5qOi5qOkXCIsXG5cdFx0OSxcblx0XHRcIuajr+ajsuajs+ajtOajtuajt+ajuOaju+ajveajvuajv+akgOakguakg+akhOakhlwiLFxuXHRcdDQsXG5cdFx0XCLmpIzmpI/mpJHmpJNcIixcblx0XHQxMSxcblx0XHRcIuakoeakouako+akpVwiLFxuXHRcdDcsXG5cdFx0XCLmpK7mpK/mpLHmpLLmpLPmpLXmpLbmpLfmpLjmpLrmpLvmpLzmpL7mpYDmpYHmpYNcIixcblx0XHQxNixcblx0XHRcIualleallualmOalmealm+alnOaln1wiXG5cdF0sXG5cdFtcblx0XHRcIjk4NDBcIixcblx0XHRcIualoealoualpOalpealp+alqOalqealqualrOalrealr+alsOalslwiLFxuXHRcdDQsXG5cdFx0XCLmpbrmpbvmpb3mpb7mpb/mpoHmpoPmpoXmpormpovmpozmpo5cIixcblx0XHQ1LFxuXHRcdFwi5qaW5qaX5qaZ5qaa5qadXCIsXG5cdFx0OSxcblx0XHRcIuamqeamquamrOamruamr+amsOamsuams+amteamtuamuOamueamuuamvOamvVwiXG5cdF0sXG5cdFtcblx0XHRcIjk4ODBcIixcblx0XHRcIuamvuamv+angOanglwiLFxuXHRcdDcsXG5cdFx0XCLmp4vmp43mp4/mp5Hmp5Lmp5Pmp5VcIixcblx0XHQ1LFxuXHRcdFwi5qec5qed5qee5qehXCIsXG5cdFx0MTEsXG5cdFx0XCLmp67mp6/mp7Dmp7Hmp7NcIixcblx0XHQ5LFxuXHRcdFwi5qe+5qiAXCIsXG5cdFx0OSxcblx0XHRcIuaoi1wiLFxuXHRcdDExLFxuXHRcdFwi5qiZXCIsXG5cdFx0NSxcblx0XHRcIuaooOaoolwiLFxuXHRcdDUsXG5cdFx0XCLmqKnmqKvmqKzmqK3mqK7mqLDmqLLmqLPmqLTmqLZcIixcblx0XHQ2LFxuXHRcdFwi5qi/XCIsXG5cdFx0NCxcblx0XHRcIuapheaphuapiFwiLFxuXHRcdDcsXG5cdFx0XCLmqZFcIixcblx0XHQ2LFxuXHRcdFwi5qmaXCJcblx0XSxcblx0W1xuXHRcdFwiOTk0MFwiLFxuXHRcdFwi5qmcXCIsXG5cdFx0NCxcblx0XHRcIuapouapo+appOapplwiLFxuXHRcdDEwLFxuXHRcdFwi5qmyXCIsXG5cdFx0Nixcblx0XHRcIuapuuapu+apveapvuapv+aqgeaqguaqg+aqhVwiLFxuXHRcdDgsXG5cdFx0XCLmqo/mqpJcIixcblx0XHQ0LFxuXHRcdFwi5qqYXCIsXG5cdFx0Nyxcblx0XHRcIuaqoVwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiOTk4MFwiLFxuXHRcdFwi5qqn5qqo5qqq5qqtXCIsXG5cdFx0MTE0LFxuXHRcdFwi5qyl5qym5qyoXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCI5YTQwXCIsXG5cdFx0XCLmrK/mrLDmrLHmrLPmrLTmrLXmrLbmrLjmrLvmrLzmrL3mrL/mrYDmrYHmrYLmrYTmrYXmrYjmrYrmrYvmrY1cIixcblx0XHQxMSxcblx0XHRcIuatmlwiLFxuXHRcdDcsXG5cdFx0XCLmrajmranmratcIixcblx0XHQxMyxcblx0XHRcIuatuuatveatvuatv+augOauheauiFwiXG5cdF0sXG5cdFtcblx0XHRcIjlhODBcIixcblx0XHRcIuaujOaujuauj+aukOaukeaulOauleaul+aumOaumeaunFwiLFxuXHRcdDQsXG5cdFx0XCLmrqJcIixcblx0XHQ3LFxuXHRcdFwi5q6rXCIsXG5cdFx0Nyxcblx0XHRcIuautuauuFwiLFxuXHRcdDYsXG5cdFx0XCLmr4Dmr4Pmr4Tmr4ZcIixcblx0XHQ0LFxuXHRcdFwi5q+M5q+O5q+Q5q+R5q+Y5q+a5q+cXCIsXG5cdFx0NCxcblx0XHRcIuavolwiLFxuXHRcdDcsXG5cdFx0XCLmr6zmr63mr67mr7Dmr7Hmr7Lmr7Tmr7bmr7fmr7jmr7rmr7vmr7zmr75cIixcblx0XHQ2LFxuXHRcdFwi5rCIXCIsXG5cdFx0NCxcblx0XHRcIuawjuawkuawl+awnOawneawnuawoOawo+awpeawq+awrOawreawseaws+awtuawt+awueawuuawu+awvOawvuawv+axg+axhOaxheaxiOaxi1wiLFxuXHRcdDQsXG5cdFx0XCLmsZHmsZLmsZPmsZbmsZhcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YjQwXCIsXG5cdFx0XCLmsZnmsZrmsaLmsaPmsaXmsabmsafmsatcIixcblx0XHQ0LFxuXHRcdFwi5rGx5rGz5rG15rG35rG45rG65rG75rG85rG/5rKA5rKE5rKH5rKK5rKL5rKN5rKO5rKR5rKS5rKV5rKW5rKX5rKY5rKa5rKc5rKd5rKe5rKg5rKi5rKo5rKs5rKv5rKw5rK05rK15rK25rK35rK65rOA5rOB5rOC5rOD5rOG5rOH5rOI5rOL5rON5rOO5rOP5rOR5rOS5rOYXCJcblx0XSxcblx0W1xuXHRcdFwiOWI4MFwiLFxuXHRcdFwi5rOZ5rOa5rOc5rOd5rOf5rOk5rOm5rOn5rOp5rOs5rOt5rOy5rO05rO55rO/5rSA5rSC5rSD5rSF5rSG5rSI5rSJ5rSK5rSN5rSP5rSQ5rSR5rST5rSU5rSV5rSW5rSY5rSc5rSd5rSfXCIsXG5cdFx0NSxcblx0XHRcIua0pua0qOa0qea0rOa0rea0r+a0sOa0tOa0tua0t+a0uOa0uua0v+a1gOa1gua1hOa1iea1jOa1kOa1lea1lua1l+a1mOa1m+a1nea1n+a1oea1oua1pOa1pea1p+a1qOa1q+a1rOa1rea1sOa1sea1sua1s+a1tea1tua1uea1uua1u+a1vVwiLFxuXHRcdDQsXG5cdFx0XCLmtoPmtoTmtobmtofmtormtovmto3mto/mtpDmtpLmtpZcIixcblx0XHQ0LFxuXHRcdFwi5rac5rai5ral5ras5rat5raw5rax5raz5ra05ra25ra35ra5XCIsXG5cdFx0NSxcblx0XHRcIua3gea3gua3g+a3iOa3iea3ilwiXG5cdF0sXG5cdFtcblx0XHRcIjljNDBcIixcblx0XHRcIua3jea3jua3j+a3kOa3kua3k+a3lOa3lea3l+a3mua3m+a3nOa3n+a3oua3o+a3pea3p+a3qOa3qea3qua3rea3r+a3sOa3sua3tOa3tea3tua3uOa3uua3vVwiLFxuXHRcdDcsXG5cdFx0XCLmuIbmuIfmuIjmuInmuIvmuI/muJLmuJPmuJXmuJjmuJnmuJvmuJzmuJ7muJ/muKLmuKbmuKfmuKjmuKrmuKzmuK7muLDmuLHmuLPmuLVcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YzgwXCIsXG5cdFx0XCLmuLbmuLfmuLnmuLtcIixcblx0XHQ3LFxuXHRcdFwi5rmFXCIsXG5cdFx0Nyxcblx0XHRcIua5j+a5kOa5kea5kua5lea5l+a5mea5mua5nOa5nea5nua5oFwiLFxuXHRcdDEwLFxuXHRcdFwi5rms5rmt5rmvXCIsXG5cdFx0MTQsXG5cdFx0XCLmuoDmuoHmuoLmuoTmuofmuojmuopcIixcblx0XHQ0LFxuXHRcdFwi5rqRXCIsXG5cdFx0Nixcblx0XHRcIua6mea6mua6m+a6nea6nua6oOa6oea6o+a6pOa6pua6qOa6qea6q+a6rOa6rea6rua6sOa6s+a6tea6uOa6uea6vOa6vua6v+a7gOa7g+a7hOa7hea7hua7iOa7iea7iua7jOa7jea7jua7kOa7kua7lua7mOa7mea7m+a7nOa7nea7o+a7p+a7qlwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiOWQ0MFwiLFxuXHRcdFwi5ruw5rux5ruy5ruz5ru15ru25ru35ru45ru6XCIsXG5cdFx0Nyxcblx0XHRcIua8g+a8hOa8hea8h+a8iOa8ilwiLFxuXHRcdDQsXG5cdFx0XCLmvJDmvJHmvJLmvJZcIixcblx0XHQ5LFxuXHRcdFwi5ryh5ryi5ryj5ryl5rym5ryn5ryo5rys5ryu5ryw5ryy5ry05ry15ry3XCIsXG5cdFx0Nixcblx0XHRcIua8v+a9gOa9gea9glwiXG5cdF0sXG5cdFtcblx0XHRcIjlkODBcIixcblx0XHRcIua9g+a9hOa9hea9iOa9iea9iua9jOa9jlwiLFxuXHRcdDksXG5cdFx0XCLmvZnmvZrmvZvmvZ3mvZ/mvaDmvaHmvaPmvaTmvaXmvadcIixcblx0XHQ1LFxuXHRcdFwi5r2v5r2w5r2x5r2z5r215r225r235r255r275r29XCIsXG5cdFx0Nixcblx0XHRcIua+hea+hua+h+a+iua+i+a+j1wiLFxuXHRcdDEyLFxuXHRcdFwi5r6d5r6e5r6f5r6g5r6iXCIsXG5cdFx0NCxcblx0XHRcIua+qFwiLFxuXHRcdDEwLFxuXHRcdFwi5r605r615r635r645r66XCIsXG5cdFx0NSxcblx0XHRcIua/gea/g1wiLFxuXHRcdDUsXG5cdFx0XCLmv4pcIixcblx0XHQ2LFxuXHRcdFwi5r+TXCIsXG5cdFx0MTAsXG5cdFx0XCLmv5/mv6Lmv6Pmv6Tmv6VcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZTQwXCIsXG5cdFx0XCLmv6ZcIixcblx0XHQ3LFxuXHRcdFwi5r+wXCIsXG5cdFx0MzIsXG5cdFx0XCLngJJcIixcblx0XHQ3LFxuXHRcdFwi54CcXCIsXG5cdFx0Nixcblx0XHRcIueApFwiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiOWU4MFwiLFxuXHRcdFwi54CrXCIsXG5cdFx0OSxcblx0XHRcIueAtueAt+eAuOeAulwiLFxuXHRcdDE3LFxuXHRcdFwi54GN54GO54GQXCIsXG5cdFx0MTMsXG5cdFx0XCLngZ9cIixcblx0XHQxMSxcblx0XHRcIueBrueBseeBsueBs+eBtOeBt+eBueeBuueBu+eBveeCgeeCgueCg+eChOeChueCh+eCiOeCi+eCjOeCjeeCj+eCkOeCkeeCk+eCl+eCmOeCmueCm+eCnlwiLFxuXHRcdDEyLFxuXHRcdFwi54Kw54Ky54K054K154K254K654K+54K/54OE54OF54OG54OH54OJ54OLXCIsXG5cdFx0MTIsXG5cdFx0XCLng5pcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZjQwXCIsXG5cdFx0XCLng5zng53ng57ng6Dng6Hng6Lng6Png6Xng6rng67ng7BcIixcblx0XHQ2LFxuXHRcdFwi54O454O654O754O854O+XCIsXG5cdFx0MTAsXG5cdFx0XCLnhItcIixcblx0XHQ0LFxuXHRcdFwi54SR54SS54SU54SX54SbXCIsXG5cdFx0MTAsXG5cdFx0XCLnhKdcIixcblx0XHQ3LFxuXHRcdFwi54Sy54Sz54S0XCJcblx0XSxcblx0W1xuXHRcdFwiOWY4MFwiLFxuXHRcdFwi54S154S3XCIsXG5cdFx0MTMsXG5cdFx0XCLnhYbnhYfnhYjnhYnnhYvnhY3nhY9cIixcblx0XHQxMixcblx0XHRcIueFneeFn1wiLFxuXHRcdDQsXG5cdFx0XCLnhaXnhalcIixcblx0XHQ0LFxuXHRcdFwi54Wv54Ww54Wx54W054W154W254W354W554W754W854W+XCIsXG5cdFx0NSxcblx0XHRcIueGhVwiLFxuXHRcdDQsXG5cdFx0XCLnhovnhoznho3nho7nhpDnhpHnhpLnhpPnhpXnhpbnhpfnhppcIixcblx0XHQ0LFxuXHRcdFwi54ahXCIsXG5cdFx0Nixcblx0XHRcIueGqeeGqueGq+eGrVwiLFxuXHRcdDUsXG5cdFx0XCLnhrTnhrbnhrfnhrjnhrpcIixcblx0XHQ4LFxuXHRcdFwi54eEXCIsXG5cdFx0OSxcblx0XHRcIueHj1wiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiYTA0MFwiLFxuXHRcdFwi54eWXCIsXG5cdFx0OSxcblx0XHRcIueHoeeHoueHo+eHpOeHpueHqFwiLFxuXHRcdDUsXG5cdFx0XCLnh69cIixcblx0XHQ5LFxuXHRcdFwi54e6XCIsXG5cdFx0MTEsXG5cdFx0XCLniIdcIixcblx0XHQxOVxuXHRdLFxuXHRbXG5cdFx0XCJhMDgwXCIsXG5cdFx0XCLniJvniJzniJ5cIixcblx0XHQ5LFxuXHRcdFwi54ip54ir54it54iu54iv54iy54iz54i054i654i854i+54mAXCIsXG5cdFx0Nixcblx0XHRcIueJieeJiueJi+eJjueJj+eJkOeJkeeJk+eJlOeJleeJl+eJmOeJmueJnOeJnueJoOeJo+eJpOeJpeeJqOeJqueJq+eJrOeJreeJsOeJseeJs+eJtOeJtueJt+eJuOeJu+eJvOeJveeKgueKg+eKhVwiLFxuXHRcdDQsXG5cdFx0XCLnioznio7nipDnipHnipNcIixcblx0XHQxMSxcblx0XHRcIueKoFwiLFxuXHRcdDExLFxuXHRcdFwi54qu54qx54qy54qz54q154q6XCIsXG5cdFx0Nixcblx0XHRcIueLheeLhueLh+eLieeLiueLi+eLjOeLj+eLkeeLk+eLlOeLleeLlueLmOeLmueLm1wiXG5cdF0sXG5cdFtcblx0XHRcImExYTFcIixcblx0XHRcIuOAgOOAgeOAgsK3y4nLh8Ko44CD44CF4oCU772e4oCW4oCm4oCY4oCZ4oCc4oCd44CU44CV44CIXCIsXG5cdFx0Nyxcblx0XHRcIuOAluOAl+OAkOOAkcKxw5fDt+KItuKIp+KIqOKIkeKIj+KIquKIqeKIiOKIt+KImuKKpeKIpeKIoOKMkuKKmeKIq+KIruKJoeKJjOKJiOKIveKIneKJoOKJruKJr+KJpOKJpeKInuKIteKItOKZguKZgMKw4oCy4oCz4oSD77yEwqTvv6Dvv6HigLDCp+KEluKYhuKYheKXi+KXj+KXjuKXh+KXhuKWoeKWoOKWs+KWsuKAu+KGkuKGkOKGkeKGk+OAk1wiXG5cdF0sXG5cdFtcblx0XHRcImEyYTFcIixcblx0XHRcIuKFsFwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiYTJiMVwiLFxuXHRcdFwi4pKIXCIsXG5cdFx0MTksXG5cdFx0XCLikbRcIixcblx0XHQxOSxcblx0XHRcIuKRoFwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiYTJlNVwiLFxuXHRcdFwi44igXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCJhMmYxXCIsXG5cdFx0XCLihaBcIixcblx0XHQxMVxuXHRdLFxuXHRbXG5cdFx0XCJhM2ExXCIsXG5cdFx0XCLvvIHvvILvvIPvv6XvvIVcIixcblx0XHQ4OCxcblx0XHRcIu+/o1wiXG5cdF0sXG5cdFtcblx0XHRcImE0YTFcIixcblx0XHRcIuOBgVwiLFxuXHRcdDgyXG5cdF0sXG5cdFtcblx0XHRcImE1YTFcIixcblx0XHRcIuOCoVwiLFxuXHRcdDg1XG5cdF0sXG5cdFtcblx0XHRcImE2YTFcIixcblx0XHRcIs6RXCIsXG5cdFx0MTYsXG5cdFx0XCLOo1wiLFxuXHRcdDZcblx0XSxcblx0W1xuXHRcdFwiYTZjMVwiLFxuXHRcdFwizrFcIixcblx0XHQxNixcblx0XHRcIs+DXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJhNmUwXCIsXG5cdFx0XCLvuLXvuLbvuLnvuLrvuL/vuYDvuL3vuL7vuYHvuYLvuYPvuYRcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNmVlXCIsXG5cdFx0XCLvuLvvuLzvuLfvuLjvuLFcIlxuXHRdLFxuXHRbXG5cdFx0XCJhNmY0XCIsXG5cdFx0XCLvuLPvuLRcIlxuXHRdLFxuXHRbXG5cdFx0XCJhN2ExXCIsXG5cdFx0XCLQkFwiLFxuXHRcdDUsXG5cdFx0XCLQgdCWXCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiYTdkMVwiLFxuXHRcdFwi0LBcIixcblx0XHQ1LFxuXHRcdFwi0ZHQtlwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcImE4NDBcIixcblx0XHRcIsuKy4vLmeKAk+KAleKApeKAteKEheKEieKGluKGl+KGmOKGmeKIleKIn+KIo+KJkuKJpuKJp+KKv+KVkFwiLFxuXHRcdDM1LFxuXHRcdFwi4paBXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJhODgwXCIsXG5cdFx0XCLilohcIixcblx0XHQ3LFxuXHRcdFwi4paT4paU4paV4pa84pa94pei4pej4pek4pel4piJ4oqV44CS44Cd44CeXCJcblx0XSxcblx0W1xuXHRcdFwiYThhMVwiLFxuXHRcdFwixIHDoceOw6DEk8OpxJvDqMSrw63HkMOsxY3Ds8eSw7LFq8O6x5TDuceWx5jHmsecw7zDqsmRXCJcblx0XSxcblx0W1xuXHRcdFwiYThiZFwiLFxuXHRcdFwixYTFiFwiXG5cdF0sXG5cdFtcblx0XHRcImE4YzBcIixcblx0XHRcIsmhXCJcblx0XSxcblx0W1xuXHRcdFwiYThjNVwiLFxuXHRcdFwi44SFXCIsXG5cdFx0MzZcblx0XSxcblx0W1xuXHRcdFwiYTk0MFwiLFxuXHRcdFwi44ChXCIsXG5cdFx0OCxcblx0XHRcIuOKo+OOjuOOj+OOnOOOneOOnuOOoeOPhOOPjuOPkeOPkuOPle+4sO+/ou+/pFwiXG5cdF0sXG5cdFtcblx0XHRcImE5NTlcIixcblx0XHRcIuKEoeOIsVwiXG5cdF0sXG5cdFtcblx0XHRcImE5NWNcIixcblx0XHRcIuKAkFwiXG5cdF0sXG5cdFtcblx0XHRcImE5NjBcIixcblx0XHRcIuODvOOCm+OCnOODveODvuOAhuOCneOCnu+5iVwiLFxuXHRcdDksXG5cdFx0XCLvuZTvuZXvuZbvuZfvuZlcIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcImE5ODBcIixcblx0XHRcIu+5olwiLFxuXHRcdDQsXG5cdFx0XCLvuajvuanvuarvuatcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOTk2XCIsXG5cdFx0XCLjgIdcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOWE0XCIsXG5cdFx0XCLilIBcIixcblx0XHQ3NVxuXHRdLFxuXHRbXG5cdFx0XCJhYTQwXCIsXG5cdFx0XCLni5zni53ni5/ni6JcIixcblx0XHQ1LFxuXHRcdFwi54uq54ur54u154u254u554u954u+54u/54yA54yC54yEXCIsXG5cdFx0NSxcblx0XHRcIueMi+eMjOeMjeeMj+eMkOeMkeeMkueMlOeMmOeMmeeMmueMn+eMoOeMo+eMpOeMpueMp+eMqOeMreeMr+eMsOeMsueMs+eMteeMtueMuueMu+eMvOeMveeNgFwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiYWE4MFwiLFxuXHRcdFwi542J542K542L542M542O542P542R542T542U542V542W542YXCIsXG5cdFx0Nyxcblx0XHRcIueNoVwiLFxuXHRcdDEwLFxuXHRcdFwi542u542w542xXCJcblx0XSxcblx0W1xuXHRcdFwiYWI0MFwiLFxuXHRcdFwi542yXCIsXG5cdFx0MTEsXG5cdFx0XCLnjb9cIixcblx0XHQ0LFxuXHRcdFwi546F546G546I546K546M546N546P546Q546S546T546U546V546X546Y546Z546a546c546d546e546g546h546jXCIsXG5cdFx0NSxcblx0XHRcIueOqueOrOeOreeOseeOtOeOteeOtueOuOeOueeOvOeOveeOvueOv+ePgeePg1wiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiYWI4MFwiLFxuXHRcdFwi54+L54+M54+O54+SXCIsXG5cdFx0Nixcblx0XHRcIuePmuePm+ePnOePneePn+ePoeePouePo+ePpOePpuePqOePquePq+ePrOePruePr+ePsOePseePs1wiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiYWM0MFwiLFxuXHRcdFwi54+4XCIsXG5cdFx0MTAsXG5cdFx0XCLnkITnkIfnkIjnkIvnkIznkI3nkI7nkJFcIixcblx0XHQ4LFxuXHRcdFwi55CcXCIsXG5cdFx0NSxcblx0XHRcIueQo+eQpOeQp+eQqeeQq+eQreeQr+eQseeQsueQt1wiLFxuXHRcdDQsXG5cdFx0XCLnkL3nkL7nkL/nkYDnkYJcIixcblx0XHQxMVxuXHRdLFxuXHRbXG5cdFx0XCJhYzgwXCIsXG5cdFx0XCLnkY5cIixcblx0XHQ2LFxuXHRcdFwi55GW55GY55Gd55GgXCIsXG5cdFx0MTIsXG5cdFx0XCLnka7nka/nkbFcIixcblx0XHQ0LFxuXHRcdFwi55G455G555G6XCJcblx0XSxcblx0W1xuXHRcdFwiYWQ0MFwiLFxuXHRcdFwi55G755G855G955G/55KC55KE55KF55KG55KI55KJ55KK55KM55KN55KP55KRXCIsXG5cdFx0MTAsXG5cdFx0XCLnkp3nkp9cIixcblx0XHQ3LFxuXHRcdFwi55KqXCIsXG5cdFx0MTUsXG5cdFx0XCLnkrtcIixcblx0XHQxMlxuXHRdLFxuXHRbXG5cdFx0XCJhZDgwXCIsXG5cdFx0XCLnk4hcIixcblx0XHQ5LFxuXHRcdFwi55OTXCIsXG5cdFx0OCxcblx0XHRcIueTneeTn+eToeeTpeeTp1wiLFxuXHRcdDYsXG5cdFx0XCLnk7Dnk7Hnk7JcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZTQwXCIsXG5cdFx0XCLnk7Pnk7Xnk7hcIixcblx0XHQ2LFxuXHRcdFwi55SA55SB55SC55SD55SFXCIsXG5cdFx0Nyxcblx0XHRcIueUjueUkOeUkueUlOeUleeUlueUl+eUm+eUneeUnueUoFwiLFxuXHRcdDQsXG5cdFx0XCLnlKbnlKfnlKrnlK7nlLTnlLbnlLnnlLznlL3nlL/nlYHnlYLnlYPnlYTnlYbnlYfnlYnnlYrnlY3nlZDnlZHnlZLnlZPnlZXnlZbnlZfnlZhcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZTgwXCIsXG5cdFx0XCLnlZ1cIixcblx0XHQ3LFxuXHRcdFwi55Wn55Wo55Wp55WrXCIsXG5cdFx0Nixcblx0XHRcIueVs+eVteeVtueVt+eVulwiLFxuXHRcdDQsXG5cdFx0XCLnloDnloHnloLnloTnloXnlodcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZjQwXCIsXG5cdFx0XCLnlojnlonnlornloznlo3nlo7nlpDnlpPnlpXnlpjnlpvnlpznlp7nlqLnlqZcIixcblx0XHQ0LFxuXHRcdFwi55at55a255a355a655a755a/55eA55eB55eG55eL55eM55eO55eP55eQ55eR55eT55eX55eZ55ea55ec55ed55ef55eg55eh55el55ep55es55et55eu55ev55ey55ez55e155e255e355e455e655e755e955e+55iC55iE55iG55iHXCJcblx0XSxcblx0W1xuXHRcdFwiYWY4MFwiLFxuXHRcdFwi55iI55iJ55iL55iN55iO55iP55iR55iS55iT55iU55iW55ia55ic55id55ie55ih55ij55in55io55is55iu55iv55ix55iy55i255i355i555i655i755i955mB55mC55mEXCJcblx0XSxcblx0W1xuXHRcdFwiYjA0MFwiLFxuXHRcdFwi55mFXCIsXG5cdFx0Nixcblx0XHRcIueZjlwiLFxuXHRcdDUsXG5cdFx0XCLnmZXnmZdcIixcblx0XHQ0LFxuXHRcdFwi55md55mf55mg55mh55mi55mkXCIsXG5cdFx0Nixcblx0XHRcIueZrOeZreeZrueZsFwiLFxuXHRcdDcsXG5cdFx0XCLnmbnnmbrnmbznmb/nmoDnmoHnmoPnmoXnmonnmornmoznmo3nmo/nmpDnmpLnmpTnmpXnmpfnmpjnmprnmptcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMDgwXCIsXG5cdFx0XCLnmpxcIixcblx0XHQ3LFxuXHRcdFwi55qlXCIsXG5cdFx0OCxcblx0XHRcIuear+easOeas+eatVwiLFxuXHRcdDksXG5cdFx0XCLnm4Dnm4Hnm4PllYrpmL/ln4PmjKjlk47llInlk4DnmpHnmYzolLznn67oib7noo3niLHpmpjpno3msKjlronkv7rmjInmmpflsrjog7rmoYjogq7mmILnm47lh7nmlZbnhqznv7HoooTlgrLlpaXmh4rmvrPoiq3mjYzmiZLlj63lkKfnrIblhavnlqTlt7Tmi5Tot4vpnbbmiorogJnlnZ3pnLjnvaLniLjnmb3mn4/nmb7mkYbkvbDotKXmi5znqJfmlpHnj63mkKzmibPoiKzpooHmnb/niYjmia7mi4zkvLTnk6PljYrlip7nu4rpgqbluK7moobmppzohoDnu5Hmo5Lno4XomozplZHlgo3osKToi57og57ljIXopJLliaVcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMTQwXCIsXG5cdFx0XCLnm4Tnm4fnm4nnm4vnm4znm5Pnm5Xnm5nnm5rnm5znm53nm57nm6BcIixcblx0XHQ0LFxuXHRcdFwi55umXCIsXG5cdFx0Nyxcblx0XHRcIuebsOebs+ebteebtuebt+ebuuebu+ebveebv+ecgOecguecg+echeechueciuecjOecjlwiLFxuXHRcdDEwLFxuXHRcdFwi55yb55yc55yd55ye55yh55yj55yk55yl55yn55yq55yrXCJcblx0XSxcblx0W1xuXHRcdFwiYjE4MFwiLFxuXHRcdFwi55ys55yu55ywXCIsXG5cdFx0NCxcblx0XHRcIuecueecu+ecveecvuecv+edguedhOedheedhuediFwiLFxuXHRcdDcsXG5cdFx0XCLnnZJcIixcblx0XHQ3LFxuXHRcdFwi552c6JaE6Zu55L+d5aCh6aWx5a6d5oqx5oql5pq06LG56bKN54iG5p2v56KR5oKy5Y2R5YyX6L6I6IOM6LSd6ZKh5YCN54uI5aSH5oOr54SZ6KKr5aWU6Iuv5pys56yo5bSp57u355St5rO16Lmm6L+46YC86by75q+U6YSZ56yU5b2856Kn6JOW6JS95q+V5q+Z5q+W5biB5bqH55e56Zet5pWd5byK5b+F6L6f5aOB6IeC6YG/6Zmb6Z6t6L6557yW6LSs5omB5L6/5Y+Y5Y2e6L6o6L6p6L6r6YGN5qCH5b2q6IaY6KGo6bOW5oaL5Yir55iq5b2s5paM5r+S5ruo5a6+5pGI5YW15Yaw5p+E5LiZ56eJ6aW854KzXCJcblx0XSxcblx0W1xuXHRcdFwiYjI0MFwiLFxuXHRcdFwi552d552e552f552g552k552n552p552q552tXCIsXG5cdFx0MTEsXG5cdFx0XCLnnbrnnbvnnbznnoHnnoLnnoPnnoZcIixcblx0XHQ1LFxuXHRcdFwi556P556Q556TXCIsXG5cdFx0MTEsXG5cdFx0XCLnnqHnnqPnnqTnnqbnnqjnnqvnnq3nnq7nnq/nnrHnnrLnnrTnnrZcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImIyODBcIixcblx0XHRcIueevOeevuefgFwiLFxuXHRcdDEyLFxuXHRcdFwi55+OXCIsXG5cdFx0OCxcblx0XHRcIuefmOefmeefmuefnVwiLFxuXHRcdDQsXG5cdFx0XCLnn6Tnl4Xlubbnjrvoj6Dmkq3mi6jpkrXms6LljZrli4PmkI/pk4LnrpTkvK/luJvoiLbohJbohormuKTms4rpqbPmjZXljZzlk7rooaXln6DkuI3luIPmraXnsL/pg6jmgJbmk6bnjJzoo4HmnZDmiY3otKLnnazouKnph4flvanoj5zolKHppJDlj4LompXmrovmg63mg6jngb/oi43oiLHku5Pmsqfol4/mk43ns5nmp73mm7nojYnljpXnrZbkvqflhozmtYvlsYLoua3mj5Llj4nojKzojLbmn6XnorTmkL3lr5/lspTlt67or6fmi4bmn7TosbrmkIDmjrronYnppovosJfnvKDpk7LkuqfpmJDpoqTmmIznjJZcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMzQwXCIsXG5cdFx0XCLnn6bnn6jnn6rnn6/nn7Dnn7Hnn7Lnn7Tnn7Xnn7fnn7nnn7rnn7vnn7znoINcIixcblx0XHQ1LFxuXHRcdFwi56CK56CL56CO56CP56CQ56CT56CV56CZ56Cb56Ce56Cg56Ch56Ci56Ck56Co56Cq56Cr56Cu56Cv56Cx56Cy56Cz56C156C256C956C/56GB56GC56GD56GE56GG56GI56GJ56GK56GL56GN56GP56GR56GT56GU56GY56GZ56GaXCJcblx0XSxcblx0W1xuXHRcdFwiYjM4MFwiLFxuXHRcdFwi56Gb56Gc56GeXCIsXG5cdFx0MTEsXG5cdFx0XCLnoa9cIixcblx0XHQ3LFxuXHRcdFwi56G456G556G656G756G9XCIsXG5cdFx0Nixcblx0XHRcIuWcuuWwneW4uOmVv+WBv+iCoOWOguaVnueVheWUseWAoei2heaKhOmSnuacneWYsua9ruW3ouWQteeCkui9puaJr+aSpOaOo+W9u+a+iOmDtOiHo+i+sOWwmOaZqOW/seayiemZiOi2geihrOaSkeensOWfjuapmeaIkOWRiOS5mOeoi+aDqea+hOivmuaJv+mAnumqi+enpOWQg+eXtOaMgeWMmeaxoOi/n+W8m+mpsOiAu+m9v+S+iOWwuui1pOe/heaWpeeCveWFheWGsuiZq+W0h+WuoOaKvemFrOeVtOi4jOeooOaEgeetueS7h+e7uOeeheS4keiHreWIneWHuuapseWOqOi6h+mUhOmbj+a7gemZpOalmlwiXG5cdF0sXG5cdFtcblx0XHRcImI0NDBcIixcblx0XHRcIueihOeiheeihueiiOeiiueii+eij+eikOeikueilOeileeilueimeeineeinueioOeioueipOeipueiqFwiLFxuXHRcdDcsXG5cdFx0XCLnorXnorbnorfnorjnorrnorvnorznor3nor/no4Dno4Lno4Pno4Tno4bno4fno4jno4zno43no47no4/no5Hno5Lno5Pno5bno5fno5jno5pcIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcImI0ODBcIixcblx0XHRcIuejpOejpeejpuejp+ejqeejquejq+ejrVwiLFxuXHRcdDQsXG5cdFx0XCLno7Pno7Xno7bno7jno7nno7tcIixcblx0XHQ1LFxuXHRcdFwi56SC56SD56SE56SGXCIsXG5cdFx0Nixcblx0XHRcIuehgOWCqOefl+aQkOinpuWkhOaPo+W3neepv+akveS8oOiIueWWmOS4sueWrueql+W5ouW6iumXr+WIm+WQueeCiuaNtumUpOWeguaYpeakv+mGh+WUh+a3s+e6r+igouaIs+e7sOeWteiMqOejgembjOi+nuaFiOeTt+ivjeatpOWIuui1kOasoeiBquiRseWbseWMhuS7juS4m+WHkeeyl+mGi+ewh+S/g+i5v+evoeeqnOaRp+W0lOWCrOiEhueYgeeyuea3rOe/oOadkeWtmOWvuOeji+aSruaQk+aOquaMq+mUmeaQrei+vuetlOeYqeaJk+Wkp+WRhuatueWCo+aItOW4puauhuS7o+i0t+iii+W+hemArlwiXG5cdF0sXG5cdFtcblx0XHRcImI1NDBcIixcblx0XHRcIuekjVwiLFxuXHRcdDUsXG5cdFx0XCLnpJRcIixcblx0XHQ5LFxuXHRcdFwi56SfXCIsXG5cdFx0NCxcblx0XHRcIuekpVwiLFxuXHRcdDE0LFxuXHRcdFwi56S1XCIsXG5cdFx0NCxcblx0XHRcIuekveekv+elguelg+elhOelheelh+elilwiLFxuXHRcdDgsXG5cdFx0XCLnpZTnpZXnpZjnpZnnpaHnpaNcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNTgwXCIsXG5cdFx0XCLnpaTnpabnpannparnpavnpaznpa7npbBcIixcblx0XHQ2LFxuXHRcdFwi56W556W7XCIsXG5cdFx0NCxcblx0XHRcIuemguemg+emhuemh+emiOemieemi+emjOemjeemjuemkOemkeemkuaAoOiAveaLheS4ueWNlemDuOaOuOiDhuaXpuawruS9huaDrua3oeivnuW8ueibi+W9k+aMoeWFmuiNoeaho+WIgOaNo+i5iOWAkuWym+elt+WvvOWIsOeou+aCvOmBk+ebl+W+t+W+l+eahOi5rOeBr+eZu+etieeequWHs+mCk+WgpOS9jua7tOi/quaVjOesm+eLhOa2pOe/n+WroeaKteW6leWcsOiSguesrOW4neW8n+mAkue8lOmioOaOgua7h+eimOeCueWFuOmdm+Weq+eUteS9g+eUuOW6l+aDpuWloOa3gOauv+eiieWPvOmbleWHi+WIgeaOieWQiumSk+iwg+i3jOeIueein+idtui/reiwjeWPoFwiXG5cdF0sXG5cdFtcblx0XHRcImI2NDBcIixcblx0XHRcIuemk1wiLFxuXHRcdDYsXG5cdFx0XCLnpptcIixcblx0XHQxMSxcblx0XHRcIuemqFwiLFxuXHRcdDEwLFxuXHRcdFwi56a0XCIsXG5cdFx0NCxcblx0XHRcIuemvOemv+enguenhOenheenh+eniOeniuenjOenjuenj+enkOenk+enlOenluenl+enmVwiLFxuXHRcdDUsXG5cdFx0XCLnp6Dnp6Hnp6Lnp6Xnp6jnp6pcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNjgwXCIsXG5cdFx0XCLnp6znp67np7FcIixcblx0XHQ2LFxuXHRcdFwi56e556e656e856e+56e/56iB56iE56iF56iH56iI56iJ56iK56iM56iPXCIsXG5cdFx0NCxcblx0XHRcIueoleeolueomOeomeeom+eonOS4geebr+WPrumSiemhtum8jumUreWumuiuouS4ouS4nOWGrOiRo+aHguWKqOagi+S+l+aBq+WGu+a0nuWFnOaKluaWl+mZoeixhumAl+eXmOmDveedo+avkueKiueLrOivu+Wgteeduei1jOadnOmVgOiCmuW6pua4oeWmkuerr+efremUu+auteaWree8juWghuWFkemYn+WvueWiqeWQqOi5suaVpumhv+WbpOmSneebvumBgeaOh+WThuWkmuWkuuWem+i6suactei3uuiIteWJgeaDsOWgleibvuWzqOm5heS/hOmineiuueWopeaBtuWOhOaJvOmBj+mEgumlv+aBqeiAjOWEv+iAs+WwlOmltea0seS6jFwiXG5cdF0sXG5cdFtcblx0XHRcImI3NDBcIixcblx0XHRcIueoneeon+eooeeooueopFwiLFxuXHRcdDE0LFxuXHRcdFwi56i056i156i256i456i656i+56mAXCIsXG5cdFx0NSxcblx0XHRcIueph1wiLFxuXHRcdDksXG5cdFx0XCLnqZJcIixcblx0XHQ0LFxuXHRcdFwi56mYXCIsXG5cdFx0MTZcblx0XSxcblx0W1xuXHRcdFwiYjc4MFwiLFxuXHRcdFwi56mpXCIsXG5cdFx0Nixcblx0XHRcIuepseepsueps+epteepu+epvOepveepvueqgueqheeqh+eqieeqiueqi+eqjOeqjueqj+eqkOeqk+eqlOeqmeeqmueqm+eqnueqoeeqoui0sOWPkee9muetj+S8kOS5j+mYgOazleePkOiXqeW4hueVque/u+aoiuefvumSkue5geWHoeeDpuWPjei/lOiMg+i0qeeKr+mlreazm+WdiuiKs+aWueiCquaIv+mYsuWmqOS7v+iuv+e6uuaUvuiPsumdnuWVoemjnuiCpeWMquivveWQoOiCuuW6n+ayuOi0ueiKrOmFmuWQqeawm+WIhue6t+Wdn+eEmuaxvueyieWli+S7veW/v+aEpOeyquS4sOWwgeaeq+icguWzsOmUi+mjjueWr+eDvemAouWGr+e8neiuveWlieWHpOS9m+WQpuWkq+aVt+iCpOWtteaJtuaLgui+kOW5heawn+espuS8j+S/mOacjVwiXG5cdF0sXG5cdFtcblx0XHRcImI4NDBcIixcblx0XHRcIueqo+eqpOeqp+eqqeeqqueqq+eqrlwiLFxuXHRcdDQsXG5cdFx0XCLnqrRcIixcblx0XHQxMCxcblx0XHRcIuergFwiLFxuXHRcdDEwLFxuXHRcdFwi56uMXCIsXG5cdFx0OSxcblx0XHRcIuerl+ermOermuerm+ernOerneeroeerouerpOerp1wiLFxuXHRcdDUsXG5cdFx0XCLnq67nq7Dnq7Hnq7Lnq7NcIlxuXHRdLFxuXHRbXG5cdFx0XCJiODgwXCIsXG5cdFx0XCLnq7RcIixcblx0XHQ0LFxuXHRcdFwi56u756u856u+56yA56yB56yC56yF56yH56yJ56yM56yN56yO56yQ56yS56yT56yW56yX56yY56ya56yc56yd56yf56yh56yi56yj56yn56yp56yt5rWu5raq56aP6KKx5byX55Sr5oqa6L6F5L+v6Yec5pan6ISv6IWR5bqc6IWQ6LW05Ymv6KaG6LWL5aSN5YKF5LuY6Zic54i26IW56LSf5a+M6K6j6ZmE5aaH57ya5ZKQ5Zm25ZiO6K+l5pS55qaC6ZKZ55uW5rqJ5bmy55SY5p2G5p+R56u/6IKd6LW25oSf56eG5pWi6LWj5YaI5Yia6ZKi57y46IKb57qy5bKX5riv5p2g56+Z55qL6auY6IaP576U57OV5pCe6ZWQ56i/5ZGK5ZOl5q2M5pCB5oiI6bi96IOz55aZ5Ymy6Z2p6JGb5qC86Juk6ZiB6ZqU6ZOs5Liq5ZCE57uZ5qC56Lef6ICV5pu05bqa5765XCJcblx0XSxcblx0W1xuXHRcdFwiYjk0MFwiLFxuXHRcdFwi56yv56yw56yy56y056y156y256y356y556y756y956y/XCIsXG5cdFx0NSxcblx0XHRcIuethuetiOetiuetjeetjuetk+etleetl+etmeetnOetnuetn+etoeeto1wiLFxuXHRcdDEwLFxuXHRcdFwi562v562w562z562056225624562656285629562/566B566C566D566E566GXCIsXG5cdFx0Nixcblx0XHRcIueujueuj1wiXG5cdF0sXG5cdFtcblx0XHRcImI5ODBcIixcblx0XHRcIueukeeukueuk+eulueumOeumeeumueum+eunueun+euoOeuo+eupOeupeeurueur+eusOeusueus+euteeutueut+euuVwiLFxuXHRcdDcsXG5cdFx0XCLnr4Lnr4Pnr4Tln4LogL/mopflt6XmlLvlip/mga3pvprkvpvouqzlhazlrqvlvJPlt6nmsZ7mi7HotKHlhbHpkqnli77msp/oi5/ni5flnqLmnoTotK3lpJ/ovpzoj4flkpXnro3kvLDmsr3lraTlp5HpvJPlj6Tom4rpqqjosLfogqHmlYXpob7lm7rpm4fliK7nk5zliZDlr6HmjILopILkuZbmi5DmgKrmo7rlhbPlrpjlhqDop4LnrqHppobnvZDmg6/ngYzotK/lhYnlub/pgJvnkbDop4TlnK3noYXlvZLpvp/pl7rovajprLzor6HnmbjmoYLmn5zot6rotLXliL3ovormu5rmo43plIXpg63lm73mnpzoo7nov4flk4hcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYTQwXCIsXG5cdFx0XCLnr4Xnr4jnr4nnr4rnr4vnr43nr47nr4/nr5Dnr5Lnr5RcIixcblx0XHQ0LFxuXHRcdFwi56+b56+c56+e56+f56+g56+i56+j56+k56+n56+o56+p56+r56+s56+t56+v56+w56+yXCIsXG5cdFx0NCxcblx0XHRcIuevuOevueevuuevu+evveevv1wiLFxuXHRcdDcsXG5cdFx0XCLnsIjnsInnsIrnsI3nsI7nsJBcIixcblx0XHQ1LFxuXHRcdFwi57CX57CY57CZXCJcblx0XSxcblx0W1xuXHRcdFwiYmE4MFwiLFxuXHRcdFwi57CaXCIsXG5cdFx0NCxcblx0XHRcIuewoFwiLFxuXHRcdDUsXG5cdFx0XCLnsKjnsKnnsKtcIixcblx0XHQxMixcblx0XHRcIuewuVwiLFxuXHRcdDUsXG5cdFx0XCLnsYLpqrjlranmtbfmsKbkuqXlrrPpqofphaPmhqjpgq/pn6nlkKvmtrXlr5Llh73llornvZXnv7DmkrzmjY3ml7Hmhr7mgo3nhIrmsZfmsYnlpK/mna3oiKrlo5Xlmo7osarmr6vpg53lpb3ogJflj7fmtanlkbXllp3ojbfoj4/moLjnpr7lkozkvZXlkIjnm5LosonpmILmsrPmtrjotavopJDpuaTotLrlmL/pu5Hnl5Xlvojni6Dmgajlk7zkuqjmqKrooaHmgZLovbDlk4Tng5jombnpuL/mtKrlro/lvJjnuqLllonkvq/njLTlkLzljprlgJnlkI7lkbzkuY7lv73nkZrlo7bokavog6HonbTni5Dns4rmuZZcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYjQwXCIsXG5cdFx0XCLnsYNcIixcblx0XHQ5LFxuXHRcdFwi57GOXCIsXG5cdFx0MzYsXG5cdFx0XCLnsbVcIixcblx0XHQ1LFxuXHRcdFwi57G+XCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCJiYjgwXCIsXG5cdFx0XCLnsojnsopcIixcblx0XHQ2LFxuXHRcdFwi57KT57KU57KW57KZ57Ka57Kb57Kg57Kh57Kj57Km57Kn57Ko57Kp57Kr57Ks57Kt57Kv57Kw57K0XCIsXG5cdFx0NCxcblx0XHRcIueyuueyu+W8p+iZjuWUrOaKpOS6kuayquaIt+iKseWTl+WNjueMvua7keeUu+WIkuWMluivneankOW+iuaAgOa3ruWdj+asoueOr+ahk+i/mOe8k+aNouaCo+WUpOeXquixoueElea2o+WupuW5u+iNkuaFjOm7hOejuuidl+ewp+eah+WHsOaDtueFjOaZg+W5jOaBjeiwjueBsOaMpei+ieW+veaBouiblOWbnuavgeaClOaFp+WNieaDoOaZpui0v+enveS8mueDqeaxh+ius+ivsue7mOiNpOaYj+Wpmumtgua1kea3t+ixgea0u+S8meeBq+iOt+aIluaDkemcjei0p+eluOWHu+WcvuWfuuacuueVuOeoveenr+eulVwiXG5cdF0sXG5cdFtcblx0XHRcImJjNDBcIixcblx0XHRcIueyv+ezgOezguezg+ezhOezhuezieezi+ezjlwiLFxuXHRcdDYsXG5cdFx0XCLns5jns5rns5vns53ns57ns6FcIixcblx0XHQ2LFxuXHRcdFwi57OpXCIsXG5cdFx0NSxcblx0XHRcIuezsFwiLFxuXHRcdDcsXG5cdFx0XCLns7nns7rns7xcIixcblx0XHQxMyxcblx0XHRcIue0i1wiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiYmM4MFwiLFxuXHRcdFwi57SRXCIsXG5cdFx0MTQsXG5cdFx0XCLntKHntKPntKTntKXntKbntKjntKnntKrntKzntK3ntK7ntLBcIixcblx0XHQ2LFxuXHRcdFwi6IKM6aWl6L+55r+A6K6l6bih5aes57up57yJ5ZCJ5p6B5qOY6L6R57GN6ZuG5Y+K5oCl55a+5rGy5Y2z5auJ57qn5oyk5Yeg6ISK5bex6JOf5oqA5YaA5a2j5LyO56Wt5YmC5oK45rWO5a+E5a+C6K6h6K6w5pei5b+M6ZmF5aaT57un57qq5ZiJ5p635aS55L2z5a625Yqg6I2a6aKK6LS+55Sy6ZK+5YGH56i85Lu35p626am+5auB5q2855uR5Z2a5bCW56y66Ze054WO5YW86IKp6Imw5aW457yE6Iyn5qOA5p+s56Kx56G35ouj5o2h566A5L+t5Ymq5YeP6I2Q5qeb6Ym06Le16LSx6KeB6ZSu566t5Lu2XCJcblx0XSxcblx0W1xuXHRcdFwiYmQ0MFwiLFxuXHRcdFwi57S3XCIsXG5cdFx0NTQsXG5cdFx0XCLnta9cIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcImJkODBcIixcblx0XHRcIue1uFwiLFxuXHRcdDMyLFxuXHRcdFwi5YGl6Iiw5YmR6aWv5riQ5rqF5ran5bu65YO15aec5bCG5rWG5rGf55aG6JKL5qGo5aWW6K6y5Yyg6YWx6ZmN6JWJ5qSS56SB54Sm6IO25Lqk6YOK5rWH6aqE5aiH5Zq85pCF6ZOw55+r5L6l6ISa54uh6KeS6aW657y057ue5Ym/5pWZ6YW16L2/6L6D5Y+r56qW5o+t5o6l55qG56e46KGX6Zi25oiq5Yqr6IqC5qGU5p2w5o23552r56ut5rSB57uT6Kej5aeQ5oiS6JeJ6Iql55WM5YCf5LuL55al6K+r5bGK5be+562L5pak6YeR5LuK5rSl6KWf57Sn6ZSm5LuF6LCo6L+b6Z2z5pmL56aB6L+R54Os5rW4XCJcblx0XSxcblx0W1xuXHRcdFwiYmU0MFwiLFxuXHRcdFwi57aZXCIsXG5cdFx0MTIsXG5cdFx0XCLntqdcIixcblx0XHQ2LFxuXHRcdFwi57avXCIsXG5cdFx0NDJcblx0XSxcblx0W1xuXHRcdFwiYmU4MFwiLFxuXHRcdFwi57eaXCIsXG5cdFx0MzIsXG5cdFx0XCLlsL3lirLojYblhaLojI7nnZvmmbbpsrjkuqzmg4rnsr7nsrPnu4/kupXorabmma/poojpnZnlooPmlazplZzlvoTnl4npnZbnq5/nq57lh4Dngq/nqpjmj6rnqbbnuqDnjpbpn63kuYXngbjkuZ3phZLljqnmlZHml6foh7zoiIXlko7lsLHnlprpnqDmi5jni5nnlr3lsYXpqbnoj4rlsYDlkoDnn6nkuL7msq7ogZrmi5Lmja7lt6jlhbfot53ouJ7plK/kv7Hlj6Xmg6fngqzliafmjZDpuYPlqJ/lgKbnnLfljbfnu6LmkoXmlKvmionmjpjlgJTniLXop4nlhrPor4Dnu53lnYfoj4zpkqflhpvlkJvls7tcIlxuXHRdLFxuXHRbXG5cdFx0XCJiZjQwXCIsXG5cdFx0XCLnt7tcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJiZjgwXCIsXG5cdFx0XCLnuLrnuLxcIixcblx0XHQ0LFxuXHRcdFwi57mCXCIsXG5cdFx0NCxcblx0XHRcIue5iFwiLFxuXHRcdDIxLFxuXHRcdFwi5L+K56uj5rWa6YOh6aqP5ZaA5ZKW5Y2h5ZKv5byA5o+p5qW35Yev5oWo5YiK5aCq5YuY5Z2O56CN55yL5bq35oW357Og5omb5oqX5Lqi54KV6ICD5ou354Ok6Z2g5Z236Iub5p+v5qO156OV6aKX56eR5aOz5ZKz5Y+v5ri05YWL5Yi75a6i6K++6IKv5ZWD5Z6m5oGz5Z2R5ZCt56m65oGQ5a2U5o6n5oqg5Y+j5omj5a+H5p6v5ZOt56qf6Ium6YW35bqT6KOk5aS45Z6u5oyO6Leo6IOv5Z2X56235L6p5b+r5a695qy+5Yyh562Q54uC5qGG55+/55y25pe35Ya15LqP55uU5bK/56ql6JG15aWO6a2B5YKAXCJcblx0XSxcblx0W1xuXHRcdFwiYzA0MFwiLFxuXHRcdFwi57meXCIsXG5cdFx0MzUsXG5cdFx0XCLnuoNcIixcblx0XHQyMyxcblx0XHRcIue6nOe6nee6nlwiXG5cdF0sXG5cdFtcblx0XHRcImMwODBcIixcblx0XHRcIue6rue6tOe6u+e6vOe7lue7pOe7rOe7uee8iue8kOe8nue8t+e8uee8u1wiLFxuXHRcdDYsXG5cdFx0XCLnvYPnvYZcIixcblx0XHQ5LFxuXHRcdFwi572S572T6aaI5oSn5rqD5Z2k5piG5o2G5Zuw5ous5omp5buT6ZiU5Z6D5ouJ5ZaH6Jyh6IWK6L6j5ZWm6I6x5p2l6LWW6JOd5amq5qCP5oum56+u6ZiR5YWw5r6c6LCw5o+96KeI5oeS57yG54OC5rul55CF5qaU54u85buK6YOO5pyX5rWq5o2e5Yqz54mi6ICB5L2s5ael6YWq54OZ5rad5YuS5LmQ6Zu36ZWt6JW+56OK57Sv5YSh5Z6S5pOC6IKL57G75rOq5qOx5qWe5Ya35Y6Y5qKo54qB6buO56+x54u456a75ryT55CG5p2O6YeM6bKk56S86I6J6I2U5ZCP5qCX5Li95Y6J5Yqx56C+5Y6G5Yip5YKI5L6L5L+QXCJcblx0XSxcblx0W1xuXHRcdFwiYzE0MFwiLFxuXHRcdFwi572W572Z572b572c572d572e572g572jXCIsXG5cdFx0NCxcblx0XHRcIue9q+e9rOe9ree9r+e9sOe9s+e9tee9tue9t+e9uOe9uue9u+e9vOe9vee9v+e+gOe+glwiLFxuXHRcdDcsXG5cdFx0XCLnvovnvo3nvo9cIixcblx0XHQ0LFxuXHRcdFwi576VXCIsXG5cdFx0NCxcblx0XHRcIue+m+e+nOe+oOe+oue+o+e+pee+pue+qFwiLFxuXHRcdDYsXG5cdFx0XCLnvrFcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMTgwXCIsXG5cdFx0XCLnvrNcIixcblx0XHQ0LFxuXHRcdFwi57665767576+57+A57+C57+D57+E57+G57+H57+I57+J57+L57+N57+PXCIsXG5cdFx0NCxcblx0XHRcIue/lue/l+e/mVwiLFxuXHRcdDUsXG5cdFx0XCLnv6Lnv6Pnl6Lnq4vnspLmsqXpmrblipvnkoPlk6nkv6nogZTojrLov57plbDlu4nmgJzmtp/luJjmlZvohLjpk77mgYvngrznu4Pnsq7lh4nmooHnsrHoia/kuKTovobph4/mmb7kuq7osIXmkqnogYrlg5rnlpfnh47lr6Xovr3mvabkuobmkoLplaPlu5bmlpnliJfoo4Lng4jliqPnjI7nkLPmnpfno7fpnJbkuLTpgrvps57mt4vlh5votYHlkJ3mi47njrLoj7Hpm7bpvoTpk4PkvLbnvprlh4zngbXpmbXlsq3pooblj6bku6TmupznkInmprTnoavppo/nlZnliJjnmKTmtYHmn7Plha3pvpnogYvlkpnnrLznqr9cIlxuXHRdLFxuXHRbXG5cdFx0XCJjMjQwXCIsXG5cdFx0XCLnv6Tnv6fnv6jnv6rnv6vnv6znv63nv6/nv7Lnv7RcIixcblx0XHQ2LFxuXHRcdFwi57+957++57+/6ICC6ICH6ICI6ICJ6ICK6ICO6ICP6ICR6ICT6ICa6ICb6ICd6ICe6ICf6ICh6ICj6ICk6ICrXCIsXG5cdFx0NSxcblx0XHRcIuiAsuiAtOiAueiAuuiAvOiAvuiBgOiBgeiBhOiBheiBh+iBiOiBieiBjuiBj+iBkOiBkeiBk+iBleiBluiBl1wiXG5cdF0sXG5cdFtcblx0XHRcImMyODBcIixcblx0XHRcIuiBmeiBm1wiLFxuXHRcdDEzLFxuXHRcdFwi6IGrXCIsXG5cdFx0NSxcblx0XHRcIuiBslwiLFxuXHRcdDExLFxuXHRcdFwi6ZqG5Z6E5oui6ZmH5qW85aiE5pCC56+T5ryP6ZmL6Iqm5Y2i6aKF5bqQ54KJ5o6z5Y2k6JmP6bKB6bqT56KM6Zyy6Lev6LWC6bm/5r2e56aE5b2V6ZmG5oiu6am05ZCV6ZOd5L6j5peF5bGl5bGh57yV6JmR5rCv5b6L546H5ruk57u/5bOm5oyb5a2q5rum5Y215Lmx5o6g55Wl5oqh6L2u5Lym5LuR5rKm57q26K666JCd6J66572X6YC76ZSj566p6aqh6KO46JC95rSb6aqG57uc5aaI6bq7546b56CB6JqC6ams6aqC5Zib5ZCX5Z+L5Lmw6bqm5Y2W6L+I6ISJ556S6aaS6Juu5ruh6JST5pu85oWi5ryrXCJcblx0XSxcblx0W1xuXHRcdFwiYzM0MFwiLFxuXHRcdFwi6IG+6IKB6IKC6IKF6IKI6IKK6IKNXCIsXG5cdFx0NSxcblx0XHRcIuiClOiCleiCl+iCmeiCnuiCo+iCpuiCp+iCqOiCrOiCsOiCs+iCteiCtuiCuOiCueiCu+iDheiDh1wiLFxuXHRcdDQsXG5cdFx0XCLog49cIixcblx0XHQ2LFxuXHRcdFwi6IOY6IOf6IOg6IOi6IOj6IOm6IOu6IO16IO36IO56IO76IO+6IO/6ISA6ISB6ISD6ISE6ISF6ISH6ISI6ISLXCJcblx0XSxcblx0W1xuXHRcdFwiYzM4MFwiLFxuXHRcdFwi6ISM6ISV6ISX6ISZ6ISb6ISc6ISd6ISfXCIsXG5cdFx0MTIsXG5cdFx0XCLohK3ohK7ohLDohLPohLTohLXohLfohLlcIixcblx0XHQ0LFxuXHRcdFwi6IS/6LCp6IqS6Iyr55uy5rCT5b+Z6I6954yr6IyF6ZSa5q+b55+b6ZOG5Y2v6IyC5YaS5bi96LKM6LS45LmI546r5p6a5qKF6YW26ZyJ54Wk5rKh55yJ5aqS6ZWB5q+P576O5pin5a+Q5aa55aqa6Zeo6Ze35Lus6JCM6JKZ5qqs55uf6ZSw54yb5qKm5a2f55yv6Yaa6Z2h57Oc6L+36LCc5byl57Gz56eY6KeF5rOM6Jyc5a+G5bmC5qOJ55yg57u15YaV5YWN5YuJ5aip57yF6Z2i6IuX5o+P556E6JeQ56eS5ri65bqZ5aaZ6JSR54Gt5rCR5oq/55q/5pWP5oKv6Ze95piO6J6f6bij6ZOt5ZCN5ZG96LCs5pG4XCJcblx0XSxcblx0W1xuXHRcdFwiYzQ0MFwiLFxuXHRcdFwi6IWAXCIsXG5cdFx0NSxcblx0XHRcIuiFh+iFieiFjeiFjuiFj+iFkuiFluiFl+iFmOiFm1wiLFxuXHRcdDQsXG5cdFx0XCLohaHohaLohaPohaTohabohajoharohavohazoha/ohbLohbPohbXohbbohbfohbjohoHohoNcIixcblx0XHQ0LFxuXHRcdFwi6IaJ6IaL6IaM6IaN6IaO6IaQ6IaSXCIsXG5cdFx0NSxcblx0XHRcIuiGmeiGmuiGnlwiLFxuXHRcdDQsXG5cdFx0XCLohqTohqVcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNDgwXCIsXG5cdFx0XCLohqfohqnohqtcIixcblx0XHQ3LFxuXHRcdFwi6Ia0XCIsXG5cdFx0NSxcblx0XHRcIuiGvOiGveiGvuiGv+iHhOiHheiHh+iHiOiHieiHi+iHjVwiLFxuXHRcdDYsXG5cdFx0XCLmkbnomJHmqKHohpzno6jmkanprZTmirnmnKvojqvloqjpu5jmsqvmvKDlr57pmYzosIvniZ/mn5Dmi4fniaHkuqnlp4bmr43lopPmmq7luZXli5/mhZXmnKjnm67nnabniafnqYbmi7/lk6rlkZDpkqDpgqPlqJznurPmsJbkuYPlpbbogJDlpYjljZfnlLfpmr7lm4rmjKDohJHmgbzpl7nmt5blkaLppoHlhoXlq6nog73lpq7pnJPlgKrms6XlsLzmi5/kvaDljL/ohbvpgIbmurrolKvmi4jlubTnor7mkrXmjbvlv7XlqJjphb/puJ/lsL/mjY/ogYLlrb3lla7plYrplY3mtoXmgqjmn6Dni57lh53lroFcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNTQwXCIsXG5cdFx0XCLoh5RcIixcblx0XHQxNCxcblx0XHRcIuiHpOiHpeiHpuiHqOiHqeiHq+iHrlwiLFxuXHRcdDQsXG5cdFx0XCLoh7VcIixcblx0XHQ1LFxuXHRcdFwi6Ie96Ie/6IiD6IiHXCIsXG5cdFx0NCxcblx0XHRcIuiIjuiIj+iIkeiIk+iIlVwiLFxuXHRcdDUsXG5cdFx0XCLoiJ3oiKDoiKToiKXoiKboiKfoiKnoiK7oiLLoiLroiLzoiL3oiL9cIlxuXHRdLFxuXHRbXG5cdFx0XCJjNTgwXCIsXG5cdFx0XCLoiYDoiYHoiYLoiYPoiYXoiYboiYjoiYroiYzoiY3oiY7oiZBcIixcblx0XHQ3LFxuXHRcdFwi6ImZ6Imb6Imc6Imd6Ime6ImgXCIsXG5cdFx0Nyxcblx0XHRcIuiJqeaLp+aznueJm+aJremSrue6veiEk+a1k+WGnOW8hOWltOWKquaAkuWls+aaluiZkOeWn+aMquaHpuezr+ivuuWTpuasp+m4peautOiXleWRleWBtuaypOWVqui2tOeIrOW4leaAleeQtuaLjeaOkueJjOW+mOa5g+a0vuaUgOa9mOebmOejkOebvOeVlOWIpOWPm+S5k+W6nuaXgeiAquiDluaKm+WShuWIqOeCruiijei3keazoeWRuOiDmuWfueijtOi1lOmZqumFjeS9qeaym+WWt+ebhuegsOaKqOeDuea+juW9reiTrOajmuehvOevt+iGqOaci+m5j+aNp+eisOWdr+egkumcueaJueaKq+WKiOeQteavl1wiXG5cdF0sXG5cdFtcblx0XHRcImM2NDBcIixcblx0XHRcIuiJquiJq+iJrOiJreiJseiJteiJtuiJt+iJuOiJu+iJvOiKgOiKgeiKg+iKheiKhuiKh+iKieiKjOiKkOiKk+iKlOiKleiKluiKmuiKm+iKnuiKoOiKouiKo+iKp+iKsuiKteiKtuiKuuiKu+iKvOiKv+iLgOiLguiLg+iLheiLhuiLieiLkOiLluiLmeiLmuiLneiLouiLp+iLqOiLqeiLquiLrOiLreiLruiLsOiLsuiLs+iLteiLtuiLuFwiXG5cdF0sXG5cdFtcblx0XHRcImM2ODBcIixcblx0XHRcIuiLuuiLvFwiLFxuXHRcdDQsXG5cdFx0XCLojIrojIvojI3ojJDojJLojJPojJbojJjojJnojJ1cIixcblx0XHQ5LFxuXHRcdFwi6Iyp6Iyq6Iyu6Iyw6Iyy6Iy36Iy76Iy95ZWk6IS+55ay55qu5Yy555ee5YO75bGB6K2s56+H5YGP54mH6aqX6aOY5ryC55Oi56Wo5pKH556l5ou86aKR6LSr5ZOB6IGY5LmS5Z2q6Iu56JCN5bmz5Yet55O26K+E5bGP5Z2h5rO86aKH5amG56C06a2E6L+r57KV5YmW5omR6ZO65LuG6I6G6JGh6I+p6JKy5Z+U5py05ZyD5pmu5rWm6LCx5pud54CR5pyf5qy65qCW5oia5aa75LiD5YeE5ryG5p+S5rKP5YW25qOL5aWH5q2n55Wm5bSO6ISQ6b2Q5peX56WI56WB6aqR6LW35bKC5Lme5LyB5ZCv5aWR56CM5Zmo5rCU6L+E5byD5rG95rOj6K6r5o6QXCJcblx0XSxcblx0W1xuXHRcdFwiYzc0MFwiLFxuXHRcdFwi6Iy+6Iy/6I2B6I2C6I2E6I2F6I2I6I2KXCIsXG5cdFx0NCxcblx0XHRcIuiNk+iNlVwiLFxuXHRcdDQsXG5cdFx0XCLojZ3ojaLojbBcIixcblx0XHQ2LFxuXHRcdFwi6I256I266I2+XCIsXG5cdFx0Nixcblx0XHRcIuiOh+iOiOiOiuiOi+iOjOiOjeiOj+iOkOiOkeiOlOiOleiOluiOl+iOmeiOmuiOneiOn+iOoVwiLFxuXHRcdDYsXG5cdFx0XCLojqzojq3ojq5cIlxuXHRdLFxuXHRbXG5cdFx0XCJjNzgwXCIsXG5cdFx0XCLojq/ojrXojrvojr7ojr/oj4Loj4Poj4Toj4boj4joj4noj4voj43oj47oj5Doj5Hoj5Loj5Poj5Xoj5foj5noj5roj5voj57oj6Loj6Poj6Toj6boj6foj6joj6voj6zoj63mgbDmtL3nibXmiabpko7pk4XljYPov4Hnrb7ku5/osKbkub7pu5TpkrHpkrPliY3mvZzpgaPmtYXosLTloJHltYzmrKDmrYnmnqrlkZvohZTnvozlopnolLflvLrmiqLmqYfplLnmlbLmgoTmoaXnnqfkuZTkvqjlt6fpnpjmkqznv5jls63kv4/nqo3liIfojITkuJTmgK/nqoPpkqbkvrXkurLnp6bnkLTli6Toirnmk5Lnpr3lr53msoHpnZLovbvmsKLlgL7ljb/muIXmk47mmbTmsLDmg4Xpobfor7fluobnkLznqbfnp4vkuJjpgrHnkIPmsYLlm5rphYvms4XotovljLrom4bmm7Louq/lsYjpqbHmuKBcIlxuXHRdLFxuXHRbXG5cdFx0XCJjODQwXCIsXG5cdFx0XCLoj67oj6/oj7NcIixcblx0XHQ0LFxuXHRcdFwi6I+66I+76I+86I++6I+/6JCA6JCC6JCF6JCH6JCI6JCJ6JCK6JCQ6JCSXCIsXG5cdFx0NSxcblx0XHRcIuiQmeiQmuiQm+iQnlwiLFxuXHRcdDUsXG5cdFx0XCLokKlcIixcblx0XHQ3LFxuXHRcdFwi6JCyXCIsXG5cdFx0NSxcblx0XHRcIuiQueiQuuiQu+iQvlwiLFxuXHRcdDcsXG5cdFx0XCLokYfokYjokYlcIlxuXHRdLFxuXHRbXG5cdFx0XCJjODgwXCIsXG5cdFx0XCLokYpcIixcblx0XHQ2LFxuXHRcdFwi6JGSXCIsXG5cdFx0NCxcblx0XHRcIuiRmOiRneiRnuiRn+iRoOiRouiRpFwiLFxuXHRcdDQsXG5cdFx0XCLokaroka7oka/okbDokbLokbTokbfokbnokbvokbzlj5blqLbpvovotqPljrvlnIjpoqfmnYPphpvms4nlhajnl4rmi7PniqzliLjlip3nvLrngpTnmLjljbTpuYrmprfnoa7pm4Doo5nnvqTnhLbnh4Plhonmn5Pnk6Tlo6TmlJjlmrforqnppbbmibDnu5Xmg7nng63lo6zku4Hkurrlv43pn6fku7vorqTliIPlpornuqvmiZTku43ml6XmiI7ojLjok4nojaPono3nhpTmurblrrnnu5Llhpfmj4nmn5TogonojLnooJXlhJLlrbrlpoLovrHkubPmsZ3lhaXopKXova/pmK7olYrnkZ7plJDpl7Dmtqboi6XlvLHmkpLmtJLokKjoha7ps4PloZ7otZvkuInlj4FcIlxuXHRdLFxuXHRbXG5cdFx0XCJjOTQwXCIsXG5cdFx0XCLokb1cIixcblx0XHQ0LFxuXHRcdFwi6JKD6JKE6JKF6JKG6JKK6JKN6JKPXCIsXG5cdFx0Nyxcblx0XHRcIuiSmOiSmuiSm+iSneiSnuiSn+iSoOiSolwiLFxuXHRcdDEyLFxuXHRcdFwi6JKw6JKx6JKz6JK16JK26JK36JK76JK86JK+6JOA6JOC6JOD6JOF6JOG6JOH6JOI6JOL6JOM6JOO6JOP6JOS6JOU6JOV6JOXXCJcblx0XSxcblx0W1xuXHRcdFwiYzk4MFwiLFxuXHRcdFwi6JOYXCIsXG5cdFx0NCxcblx0XHRcIuiTnuiToeiTouiTpOiTp1wiLFxuXHRcdDQsXG5cdFx0XCLok63ok67ok6/ok7FcIixcblx0XHQxMCxcblx0XHRcIuiTveiTvuiUgOiUgeiUguS8nuaVo+ahkeWXk+S4p+aQlOmqmuaJq+WrgueRn+iJsua2qeajruWDp+iOjuegguadgOWIueaymee6seWCu+WVpeeFnuetm+aZkuePiuiLq+adieWxseWIoOeFveihq+mXqumZleaThei1oeiGs+WWhOaxleaJh+e8ruWikuS8pOWVhui1j+aZjOS4iuWwmuijs+aiouaNjueojeeDp+iKjeWLuumftuWwkeWTqOmCtee7jeWloui1iuibh+iIjOiIjei1puaRhOWwhOaFkea2ieekvuiuvuegt+eUs+WRu+S8uOi6q+a3seWooOe7heelnuayiOWuoeWptueUmuiCvuaFjua4l+WjsOeUn+eUpeeJsuWNh+e7s1wiXG5cdF0sXG5cdFtcblx0XHRcImNhNDBcIixcblx0XHRcIuiUg1wiLFxuXHRcdDgsXG5cdFx0XCLolI3olI7olI/olJDolJLolJTolJXolJbolJjolJnolJvolJzolJ3olJ7olKDolKJcIixcblx0XHQ4LFxuXHRcdFwi6JStXCIsXG5cdFx0OSxcblx0XHRcIuiUvlwiLFxuXHRcdDQsXG5cdFx0XCLolYTolYXolYbolYfolYtcIixcblx0XHQxMFxuXHRdLFxuXHRbXG5cdFx0XCJjYTgwXCIsXG5cdFx0XCLolZfolZjolZrolZvolZzolZ3olZ9cIixcblx0XHQ0LFxuXHRcdFwi6JWl6JWm6JWn6JWpXCIsXG5cdFx0OCxcblx0XHRcIuiVs+iVteiVtuiVt+iVuOiVvOiVveiVv+iWgOiWgeecgeebm+WJqeiDnOWco+W4iOWkseeLruaWvea5v+ivl+WwuOiZseWNgeefs+aLvuaXtuS7gOmjn+iagOWunuivhuWPsuefouS9v+WxjumptuWni+W8j+ekuuWjq+S4luafv+S6i+aLreiqk+mAneWKv+aYr+WXnOWZrOmAguS7leS+jemHiumlsOawj+W4guaBg+WupOinhuivleaUtuaJi+mmluWuiOWvv+aOiOWUruWPl+eYpuWFveiUrOaeouais+auiuaKkui+k+WPlOiIkua3keeWj+S5pui1juWtsOeGn+iWr+aakeabmee9suicgOm7jem8oOWxnuacr+i/sOagkeadn+aIjeerluWiheW6tuaVsOa8sVwiXG5cdF0sXG5cdFtcblx0XHRcImNiNDBcIixcblx0XHRcIuiWguiWg+iWhuiWiFwiLFxuXHRcdDYsXG5cdFx0XCLolpBcIixcblx0XHQxMCxcblx0XHRcIuiWnVwiLFxuXHRcdDYsXG5cdFx0XCLolqXolqbolqfolqnolqvolqzolq3olrFcIixcblx0XHQ1LFxuXHRcdFwi6Ja46Ja6XCIsXG5cdFx0Nixcblx0XHRcIuiXglwiLFxuXHRcdDYsXG5cdFx0XCLol4pcIixcblx0XHQ0LFxuXHRcdFwi6JeR6JeSXCJcblx0XSxcblx0W1xuXHRcdFwiY2I4MFwiLFxuXHRcdFwi6JeU6JeWXCIsXG5cdFx0NSxcblx0XHRcIuiXnVwiLFxuXHRcdDYsXG5cdFx0XCLol6Xol6bol6fol6jol6pcIixcblx0XHQxNCxcblx0XHRcIuaBleWIt+iAjeaRlOihsOeUqeW4heagk+aLtOmcnOWPjOeIveiwgeawtOedoeeojuWQrueerOmhuuiInOivtOehleaclOeDgeaWr+aSleWYtuaAneengeWPuOS4neatu+iChuWvuuWXo+Wbm+S8uuS8vOmlsuW3s+advuiAuOaAgumigumAgeWui+iuvOivteaQnOiJmOaTnuWXveiLj+mFpeS/l+e0oOmAn+eyn+WDs+Whkea6r+Wuv+ivieiCg+mFuOiSnOeul+iZvemai+maj+e7pemrk+eijuWygeepl+mBgumap+eln+WtmeaNn+esi+iTkeaireWUhue8qeeQkOe0oumUgeaJgOWhjOS7luWug+WlueWhlFwiXG5cdF0sXG5cdFtcblx0XHRcImNjNDBcIixcblx0XHRcIuiXueiXuuiXvOiXveiXvuiYgFwiLFxuXHRcdDQsXG5cdFx0XCLomIZcIixcblx0XHQxMCxcblx0XHRcIuiYkuiYk+iYlOiYleiYl1wiLFxuXHRcdDE1LFxuXHRcdFwi6Jio6JiqXCIsXG5cdFx0MTMsXG5cdFx0XCLomLnomLromLvomL3omL7omL/omYBcIlxuXHRdLFxuXHRbXG5cdFx0XCJjYzgwXCIsXG5cdFx0XCLomYFcIixcblx0XHQxMSxcblx0XHRcIuiZkuiZk+iZlVwiLFxuXHRcdDQsXG5cdFx0XCLomZvomZzomZ3omZ/omaDomaHomaNcIixcblx0XHQ3LFxuXHRcdFwi542t5oye6LmL6LiP6IOO6IuU5oqs5Y+w5rOw6YWe5aSq5oCB5rGw5Z2N5pGK6LSq55ir5rup5Z2b5qqA55ew5r2t6LCt6LCI5Z2m5q+v6KKS56Kz5o6i5Y+554Kt5rGk5aGY5pCq5aCC5qOg6Iab5ZSQ57OW5YCY6Lq65reM6Laf54Or5o6P5rab5ruU57um6JCE5qGD6YCD5reY6Zm26K6o5aWX54m56Jek6IW+55a86KqK5qKv5YmU6Lii6ZSR5o+Q6aKY6LmE5ZW85L2T5pu/5ZqP5oOV5raV5YmD5bGJ5aSp5re75aGr55Sw55Sc5oGs6IiU6IWG5oyR5p2h6L+i55y66Lez6LS06ZOB5biW5Y6F5ZCs54ODXCJcblx0XSxcblx0W1xuXHRcdFwiY2Q0MFwiLFxuXHRcdFwi6Jmt6Jmv6Jmw6JmyXCIsXG5cdFx0Nixcblx0XHRcIuiag1wiLFxuXHRcdDYsXG5cdFx0XCLomo5cIixcblx0XHQ0LFxuXHRcdFwi6JqU6JqWXCIsXG5cdFx0NSxcblx0XHRcIuianlwiLFxuXHRcdDQsXG5cdFx0XCLomqXomqbomqvomq3omq7omrLomrPomrfomrjomrnomrtcIixcblx0XHQ0LFxuXHRcdFwi6JuB6JuC6JuD6JuF6JuI6JuM6JuN6JuS6JuT6JuV6JuW6JuX6Jua6JucXCJcblx0XSxcblx0W1xuXHRcdFwiY2Q4MFwiLFxuXHRcdFwi6Jud6Jug6Juh6Jui6Juj6Jul6Jum6Jun6Juo6Juq6Jur6Jus6Juv6Ju16Ju26Ju36Ju66Ju76Ju86Ju96Ju/6JyB6JyE6JyF6JyG6JyL6JyM6JyO6JyP6JyQ6JyR6JyU6JyW5rGA5bu35YGc5Lqt5bqt5oy66ImH6YCa5qGQ6YWu556z5ZCM6ZOc5b2k56ul5qG25o2F562S57uf55eb5YG35oqV5aS06YCP5Ye456eD56qB5Zu+5b6S6YCU5raC5bGg5Zyf5ZCQ5YWU5rmN5Zui5o6o6aKT6IW/6JyV6KSq6YCA5ZCe5bGv6IeA5ouW5omY6ISx6bi16ZmA6amu6am85qSt5aal5ouT5ZS+5oyW5ZOH6JuZ5rS85aiD55Om6KKc5q2q5aSW6LGM5byv5rm+546p6aG95Li454O35a6M56KX5oy95pma55qW5oOL5a6b5amJ5LiH6IWV5rGq546L5Lqh5p6J572R5b6A5pe65pyb5b+Y5aaE5aiBXCJcblx0XSxcblx0W1xuXHRcdFwiY2U0MFwiLFxuXHRcdFwi6JyZ6Jyb6Jyd6Jyf6Jyg6Jyk6Jym6Jyn6Jyo6Jyq6Jyr6Jys6Jyt6Jyv6Jyw6Jyy6Jyz6Jy16Jy26Jy46Jy56Jy66Jy86Jy96J2AXCIsXG5cdFx0Nixcblx0XHRcIuidiuidi+idjeidj+idkOidkeidkuidlOidleidluidmOidmlwiLFxuXHRcdDUsXG5cdFx0XCLonaHonaLonaZcIixcblx0XHQ3LFxuXHRcdFwi6J2v6J2x6J2y6J2z6J21XCJcblx0XSxcblx0W1xuXHRcdFwiY2U4MFwiLFxuXHRcdFwi6J236J246J256J266J2/6J6A6J6B6J6E6J6G6J6H6J6J6J6K6J6M6J6OXCIsXG5cdFx0NCxcblx0XHRcIuielOieleieluiemFwiLFxuXHRcdDYsXG5cdFx0XCLonqBcIixcblx0XHQ0LFxuXHRcdFwi5beN5b6u5Y2x6Z+m6L+d5qGF5Zu05ZSv5oOf5Li65r2N57u06IuH6JCO5aeU5Lyf5Lyq5bC+57qs5pyq6JSa5ZGz55WP6IOD5ZaC6a2P5L2N5rit6LCT5bCJ5oWw5Y2r55if5rip6JqK5paH6Ze757q55ZC756iz57SK6Zeu5Zeh57+B55Ou5oyd6JyX5rah56qd5oiR5pah5Y2n5o+h5rKD5ber5ZGc6ZKo5LmM5rGh6K+s5bGL5peg6Iqc5qKn5ZC+5ZC05q+L5q2m5LqU5o2C5Y2I6Iie5LyN5L6u5Z2e5oiK6Zu+5pmk54mp5Yu/5Yqh5oKf6K+v5piU54aZ5p6Q6KW/56GS55+95pmw5Zi75ZC46ZSh54m6XCJcblx0XSxcblx0W1xuXHRcdFwiY2Y0MFwiLFxuXHRcdFwi6J6l6J6m6J6n6J6p6J6q6J6u6J6w6J6x6J6y6J606J626J636J646J656J676J686J6+6J6/6J+BXCIsXG5cdFx0NCxcblx0XHRcIuifh+ifiOifieifjFwiLFxuXHRcdDQsXG5cdFx0XCLon5RcIixcblx0XHQ2LFxuXHRcdFwi6J+c6J+d6J+e6J+f6J+h6J+i6J+j6J+k6J+m6J+n6J+o6J+p6J+r6J+s6J+t6J+vXCIsXG5cdFx0OVxuXHRdLFxuXHRbXG5cdFx0XCJjZjgwXCIsXG5cdFx0XCLon7ron7von7zon73on7/ooIDooIHooILooIRcIixcblx0XHQ1LFxuXHRcdFwi6KCLXCIsXG5cdFx0Nyxcblx0XHRcIuiglOigl+igmOigmeigmuignFwiLFxuXHRcdDQsXG5cdFx0XCLooKPnqIDmga/luIzmgonohp3lpJXmg5znhoTng6/muqrmsZDnioDmqoTooq3luK3kuaDlqrPllpzpk6PmtJfns7vpmpnmiI/nu4bnno7omb7ljKPpnJ7ovpbmmofls6HkvqDni63kuIvljqblpI/lkJPmjoDplKjlhYjku5npspznuqTlkrjotKTooZToiLfpl7Lmto7lvKblq4zmmL7pmannjrDnjK7ljr/ohbrppoXnvqHlrqrpmbfpmZDnur/nm7jljqLplbbpppnnrrHopYTmuZjkuaHnv5TnpaXor6bmg7Plk43kuqvpobnlt7fmqaHlg4/lkJHosaHokKfnoZ3pnITliYrlk67lmqPplIDmtojlrrXmt4bmmZNcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMDQwXCIsXG5cdFx0XCLooKRcIixcblx0XHQxMyxcblx0XHRcIuigs1wiLFxuXHRcdDUsXG5cdFx0XCLooLrooLvooL3ooL7ooL/ooYHooYLooYPooYZcIixcblx0XHQ1LFxuXHRcdFwi6KGOXCIsXG5cdFx0NSxcblx0XHRcIuihleihluihmOihmlwiLFxuXHRcdDYsXG5cdFx0XCLooabooafooarooa3ooa/oobHoobPoobToobXoobboobjoobnoobpcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMDgwXCIsXG5cdFx0XCLoobvoobzoooDoooPooobooofooonooorooozooo7ooo/oopDoopHoopPoopToopXoopdcIixcblx0XHQ0LFxuXHRcdFwi6KKdXCIsXG5cdFx0NCxcblx0XHRcIuiio+iipVwiLFxuXHRcdDUsXG5cdFx0XCLlsI/lrZ3moKHogpbllbjnrJHmlYjmpZTkupvmrYfonY7pnovljY/mjJ/mkLrpgqrmlpzog4HosJDlhpnmorDljbjon7nmh4jms4Tms7vosKLlsZHolqroiq/plIzmrKPovpvmlrDlv7vlv4Pkv6HooYXmmJ/ohaXnjKnmg7rlhbTliJHlnovlvaLpgqLooYzphpLlubjmnY/mgKflp5PlhYTlh7bog7jljIjmsbnpm4TnhorkvJHkv67nvp7mnL3ll4XplIjnp4Doopbnu6Plop/miIzpnIDomZrlmJjpobvlvpDorrjok4TphZflj5nml63luo/nlZzmgaTnta7lqb/nu6rnu63ovanllqflrqPmgqzml4vnjoRcIlxuXHRdLFxuXHRbXG5cdFx0XCJkMTQwXCIsXG5cdFx0XCLooqzooq7ooq/oorDoorJcIixcblx0XHQ0LFxuXHRcdFwi6KK46KK56KK66KK76KK96KK+6KK/6KOA6KOD6KOE6KOH6KOI6KOK6KOL6KOM6KON6KOP6KOQ6KOR6KOT6KOW6KOX6KOaXCIsXG5cdFx0NCxcblx0XHRcIuijoOijoeijpuijp+ijqVwiLFxuXHRcdDYsXG5cdFx0XCLoo7Loo7Xoo7boo7foo7roo7voo73oo7/opIDopIHopINcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcImQxODBcIixcblx0XHRcIuikieiki1wiLFxuXHRcdDQsXG5cdFx0XCLopJHopJRcIixcblx0XHQ0LFxuXHRcdFwi6KScXCIsXG5cdFx0NCxcblx0XHRcIuikouiko+ikpOikpuikp+ikqOikqeikrOikreikruikr+ikseiksuiks+ikteikt+mAieeZo+ecqee7mumdtOiWm+WtpueptOmbquihgOWLi+eGj+W+quaXrOivouWvu+mpr+W3oeauieaxm+iureiur+mAiui/heWOi+aKvOm4pum4reWRgOS4q+iKveeJmeianOW0luihmea2r+mbheWTkeS6muiutueEieWSvemYieeDn+a3ueebkOS4peeglOickuWyqeW7tuiogOminOmYjueCjuayv+WlhOaOqeecvOihjea8lOiJs+WgsOeHleWOjOegmumbgeWUgeW9pueEsOWutOiwmumqjOaug+Wkrum4r+enp+adqOaJrOS9r+eWoee+iua0i+mYs+awp+S7sOeXkuWFu+agt+a8vumCgOiFsOWmlueRtlwiXG5cdF0sXG5cdFtcblx0XHRcImQyNDBcIixcblx0XHRcIuikuFwiLFxuXHRcdDgsXG5cdFx0XCLopYLopYPopYVcIixcblx0XHQyNCxcblx0XHRcIuiloFwiLFxuXHRcdDUsXG5cdFx0XCLopadcIixcblx0XHQxOSxcblx0XHRcIuilvFwiXG5cdF0sXG5cdFtcblx0XHRcImQyODBcIixcblx0XHRcIuilveilvuimgOimguimhOimheimh1wiLFxuXHRcdDI2LFxuXHRcdFwi5pGH5bCn6YGl56qR6LCj5aea5ZKs6IiA6I2v6KaB6ICA5qSw5ZmO6IC254i36YeO5Ya25Lmf6aG15o6W5Lia5Y+25puz6IWL5aSc5ray5LiA5aO55Yy75o+W6ZOx5L6d5LyK6KGj6aKQ5aS36YGX56e75Luq6IOw55aR5rKC5a6c5aeo5b2d5qSF6JqB5YCa5bey5LmZ55+j5Lul6Im65oqR5piT6YKR5bG55Lq/5b256IeG6YC46IKE55ar5Lqm6KOU5oSP5q+F5b+G5LmJ55uK5rqi6K+j6K6u6LCK6K+R5byC57+857+M57uO6Iy16I2r5Zug5q636Z+z6Zi05ae75ZCf6ZO25rer5a+F6aWu5bC55byV6ZqQXCJcblx0XSxcblx0W1xuXHRcdFwiZDM0MFwiLFxuXHRcdFwi6KaiXCIsXG5cdFx0MzAsXG5cdFx0XCLop4Pop43op5Pop5Top5Xop5fop5jop5nop5vop53op5/op6Dop6Hop6Lop6Top6fop6jop6nop6rop6zop63op67op7Dop7Hop7Lop7RcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImQzODBcIixcblx0XHRcIuinu1wiLFxuXHRcdDQsXG5cdFx0XCLoqIFcIixcblx0XHQ1LFxuXHRcdFwi6KiIXCIsXG5cdFx0MjEsXG5cdFx0XCLljbDoi7HmqLHlqbTpubDlupTnvKjojrnokKTokKXojafonYfov47otaLnm4jlvbHpopbnoazmmKDlk5/mi6XkvaPoh4Pnl4jlurjpm43ouIrom7nlko/ms7PmtozmsLjmgb/li4fnlKjlub3kvJjmgqDlv6flsKTnlLHpgq7pk4DnirnmsrnmuLjphYnmnInlj4vlj7PkvZHph4nor7Hlj4jlubzov4Lmt6Tkuo7nm4LmpobomZ7mhJroiIbkvZnkv57pgL7psbzmhInmuJ3muJTpmoXkuojlqLHpm6jkuI7lsb/nprnlrofor63nvr3njonln5/oiovpg4HlkIHpgYfllrvls6rlvqHmhIjmrLLni7HogrLoqolcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNDQwXCIsXG5cdFx0XCLoqJ5cIixcblx0XHQzMSxcblx0XHRcIuiov1wiLFxuXHRcdDgsXG5cdFx0XCLoqYlcIixcblx0XHQyMVxuXHRdLFxuXHRbXG5cdFx0XCJkNDgwXCIsXG5cdFx0XCLoqZ9cIixcblx0XHQyNSxcblx0XHRcIuipulwiLFxuXHRcdDYsXG5cdFx0XCLmtbTlr5Poo5XpooTosavpqa3puLPmuIrlhqTlhYPlnqPoooHljp/mj7TovpXlm63lkZjlnIbnjL/mupDnvJjov5zoi5HmhL/mgKjpmaLmm7Dnuqbotorot4PpkqXlsrPnsqTmnIjmgqbpmIXogJjkupHpg6fljIDpmajlhYHov5DolbTphZ3mmZXpn7XlrZXljJ3noLjmnYLmoL3lk4nngb7lrrDovb3lho3lnKjlkrHmlJLmmoLotZ7otYPohI/okazpga3ns5/lh7/ol7vmnqPml6nmvqHomqTouoHlmarpgKDnmoLngbbnh6XotKPmi6nliJnms73otLzmgI7lop7mho7mm77otaDmiY7llrPmuKPmnK3ovadcIlxuXHRdLFxuXHRbXG5cdFx0XCJkNTQwXCIsXG5cdFx0XCLoqoFcIixcblx0XHQ3LFxuXHRcdFwi6KqLXCIsXG5cdFx0Nyxcblx0XHRcIuiqlFwiLFxuXHRcdDQ2XG5cdF0sXG5cdFtcblx0XHRcImQ1ODBcIixcblx0XHRcIuirg1wiLFxuXHRcdDMyLFxuXHRcdFwi6ZOh6Ze455yo5qCF5qao5ZKL5LmN54K46K+I5pGY5paL5a6F56qE5YC65a+o55675q+h6Km557KY5rK+55uP5pap6L6X5bSt5bGV6Ji45qCI5Y2g5oiY56uZ5rmb57u95qif56ug5b2w5ryz5byg5o6M5rao5p2W5LiI5biQ6LSm5LuX6IOA55i06Zqc5oub5pit5om+5rK86LW154Wn572p5YWG6IKH5Y+s6YGu5oqY5ZOy6Juw6L6Z6ICF6ZSX6JSX6L+Z5rWZ54+N5paf55yf55SE56Cn6Ie76LSe6ZKI5L6m5p6V55a56K+K6ZyH5oyv6ZWH6Zi16JK45oyj552B5b6B54uw5LqJ5oCU5pW05ouv5q2j5pS/XCJcblx0XSxcblx0W1xuXHRcdFwiZDY0MFwiLFxuXHRcdFwi6KukXCIsXG5cdFx0MzQsXG5cdFx0XCLorIhcIixcblx0XHQyN1xuXHRdLFxuXHRbXG5cdFx0XCJkNjgwXCIsXG5cdFx0XCLorKTorKXorKdcIixcblx0XHQzMCxcblx0XHRcIuW4p+eXh+mDkeivgeiKneaeneaUr+WQseicmOefpeiCouiEguaxgeS5i+e7h+iBjOebtOakjeauluaJp+WAvOS+hOWdgOaMh+atoui2vuWPquaXqOe6uOW/l+aMmuaOt+iHs+iHtOe9ruW4nOWzmeWItuaZuuenqeeomui0qOeCmeeXlOa7nuayu+eqkuS4reebheW/oOmSn+iht+e7iOenjeiCv+mHjeS7suS8l+iIn+WRqOW3nua0suivjOeypei9tOiCmOW4muWSkueaseWumeaYvOmqpOePoOagquibm+acseeMquivuOivm+mAkOerueeDm+eFruaLhOeeqeWYseS4u+iRl+afseWKqeibgOi0rumTuOetkVwiXG5cdF0sXG5cdFtcblx0XHRcImQ3NDBcIixcblx0XHRcIuithlwiLFxuXHRcdDMxLFxuXHRcdFwi6K2nXCIsXG5cdFx0NCxcblx0XHRcIuitrVwiLFxuXHRcdDI1XG5cdF0sXG5cdFtcblx0XHRcImQ3ODBcIixcblx0XHRcIuiuh1wiLFxuXHRcdDI0LFxuXHRcdFwi6K6s6K6x6K676K+H6K+Q6K+q6LCJ6LCe5L2P5rOo56Wd6am75oqT54iq5ou95LiT56CW6L2s5pKw6LWa56+G5qGp5bqE6KOF5aaG5pKe5aOu54q25qSO6ZSl6L+96LWY5Z2g57yA6LCG5YeG5o2J5ouZ5Y2T5qGM55Ci6IyB6YWM5ZWE552A54G85rWK5YW55ZKo6LWE5ae/5ruL5reE5a2c57Sr5LuU57G95ruT5a2Q6Ieq5riN5a2X6ayD5qOV6Liq5a6X57u85oC757q16YK56LWw5aWP5o+N56ef6Laz5Y2S5peP56WW6K+F6Zi757uE6ZK757qC5Zi06YaJ5pyA572q5bCK6YG15pio5bem5L2Q5p+e5YGa5L2c5Z2Q5bqnXCJcblx0XSxcblx0W1xuXHRcdFwiZDg0MFwiLFxuXHRcdFwi6LC4XCIsXG5cdFx0OCxcblx0XHRcIuixguixg+ixhOixheixiOixiuixi+ixjVwiLFxuXHRcdDcsXG5cdFx0XCLosZbosZfosZjosZnosZtcIixcblx0XHQ1LFxuXHRcdFwi6LGjXCIsXG5cdFx0Nixcblx0XHRcIuixrFwiLFxuXHRcdDYsXG5cdFx0XCLosbTosbXosbbosbfosbtcIixcblx0XHQ2LFxuXHRcdFwi6LKD6LKE6LKG6LKHXCJcblx0XSxcblx0W1xuXHRcdFwiZDg4MFwiLFxuXHRcdFwi6LKI6LKL6LKNXCIsXG5cdFx0Nixcblx0XHRcIuiyleiyluiyl+iymVwiLFxuXHRcdDIwLFxuXHRcdFwi5LqN5LiM5YWA5LiQ5bu/5Y2F5LiV5LqY5Lie6ayy5a2s5Zmp5Lio56a65Li/5YyV5LmH5aSt54i75Y2u5rCQ5Zuf6IOk6aaX5q+T552+6byX5Li25Lqf6byQ5Lmc5Lmp5LqT6IqI5a2b5ZWs5ZiP5LuE5Y6N5Y6d5Y6j5Y6l5Y6u6Z2l6LWd5Yya5Y+15Yym5Yyu5Yy+6LWc5Y2m5Y2j5YiC5YiI5YiO5Yit5Yiz5Yi/5YmA5YmM5Yme5Ymh5Ymc6JKv5Ym95YqC5YqB5YqQ5YqT5YaC572U5Lq75LuD5LuJ5LuC5Luo5Luh5Lur5Lue5Lyb5Luz5Lyi5L2k5Lu15Lyl5Lyn5LyJ5Lyr5L2e5L2n5pS45L2a5L2dXCJcblx0XSxcblx0W1xuXHRcdFwiZDk0MFwiLFxuXHRcdFwi6LKuXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZDk4MFwiLFxuXHRcdFwi6LOtXCIsXG5cdFx0MzIsXG5cdFx0XCLkvZ/kvZfkvLLkvL3kvbbkvbTkvpHkvonkvoPkvo/kvb7kvbvkvqrkvbzkvqzkvpTkv6bkv6jkv6rkv4Xkv5rkv6Pkv5zkv5Hkv5/kv7jlgKnlgYzkv7PlgKzlgI/lgK7lgK3kv77lgJzlgIzlgKXlgKjlgb7lgYPlgZXlgYjlgY7lgazlgbvlgqXlgqflgqnlgrrlg5blhIblg63lg6zlg6blg67lhIflhIvku53msL3kvZjkvaXkv47pvqDmsYbnsbTlha7lt73pu4npppjlhoHlpJTli7nljI3oqIfljJDlh6vlpJnlhZXkuqDlhZbkurPooa7ooqTkurXohJToo5LnpoDlrLTooIPnvrjlhqvlhrHlhr3lhrxcIlxuXHRdLFxuXHRbXG5cdFx0XCJkYTQwXCIsXG5cdFx0XCLotI5cIixcblx0XHQxNCxcblx0XHRcIui0oOi1kei1kui1l+i1n+i1pei1qOi1qei1qui1rOi1rui1r+i1sei1sui1uFwiLFxuXHRcdDgsXG5cdFx0XCLotoLotoPotobotofotojotonotoxcIixcblx0XHQ0LFxuXHRcdFwi6LaS6LaT6LaVXCIsXG5cdFx0OSxcblx0XHRcIui2oOi2oVwiXG5cdF0sXG5cdFtcblx0XHRcImRhODBcIixcblx0XHRcIui2oui2pFwiLFxuXHRcdDEyLFxuXHRcdFwi6Lay6La26La36La56La76La96LeA6LeB6LeC6LeF6LeH6LeI6LeJ6LeK6LeN6LeQ6LeS6LeT6LeU5YeH5YaW5Yai5Yal6K6g6K6m6K6n6K6q6K606K616K636K+C6K+D6K+L6K+P6K+O6K+S6K+T6K+U6K+W6K+Y6K+Z6K+c6K+f6K+g6K+k6K+o6K+p6K+u6K+w6K+z6K+26K+56K+86K+/6LCA6LCC6LCE6LCH6LCM6LCP6LCR6LCS6LCU6LCV6LCW6LCZ6LCb6LCY6LCd6LCf6LCg6LCh6LCl6LCn6LCq6LCr6LCu6LCv6LCy6LCz6LC16LC25Y2p5Y266Zid6Zii6Zih6Zix6Ziq6Zi96Zi86ZmC6ZmJ6ZmU6Zmf6Zmn6Zms6Zmy6Zm06ZqI6ZqN6ZqX6Zqw6YKX6YKb6YKd6YKZ6YKs6YKh6YK06YKz6YK26YK6XCJcblx0XSxcblx0W1xuXHRcdFwiZGI0MFwiLFxuXHRcdFwi6LeV6LeY6LeZ6Lec6Leg6Leh6Lei6Lel6Lem6Len6Lep6Let6Leu6Lew6Lex6Ley6Le06Le26Le86Le+XCIsXG5cdFx0Nixcblx0XHRcIui4hui4h+i4iOi4i+i4jei4jui4kOi4kei4kui4k+i4lVwiLFxuXHRcdDcsXG5cdFx0XCLouKDouKHouKRcIixcblx0XHQ0LFxuXHRcdFwi6Lir6Lit6Liw6Liy6Liz6Li06Li26Li36Li46Li76Li86Li+XCJcblx0XSxcblx0W1xuXHRcdFwiZGI4MFwiLFxuXHRcdFwi6Li/6LmD6LmF6LmG6LmMXCIsXG5cdFx0NCxcblx0XHRcIui5k1wiLFxuXHRcdDUsXG5cdFx0XCLouZpcIixcblx0XHQxMSxcblx0XHRcIui5p+i5qOi5qui5q+i5rui5semCuOmCsOmDj+mDhemCvumDkOmDhOmDh+mDk+mDpumDoumDnOmDl+mDm+mDq+mDr+mDvumEhOmEoumEnumEo+mEsemEr+mEuemFg+mFhuWIjeWlguWKouWKrOWKreWKvuWTv+WLkOWLluWLsOWPn+eHruefjeW7tOWHteWHvOmsr+WOtuW8geeVmuW3r+WdjOWeqeWeoeWhvuWivOWjheWjkeWcqeWcrOWcquWcs+WcueWcruWcr+WdnOWcu+WdguWdqeWeheWdq+WehuWdvOWdu+WdqOWdreWdtuWds+WereWepOWejOWesuWfj+Wep+WetOWek+WeoOWfleWfmOWfmuWfmeWfkuWeuOWftOWfr+WfuOWfpOWfnVwiXG5cdF0sXG5cdFtcblx0XHRcImRjNDBcIixcblx0XHRcIui5s+i5tei5t1wiLFxuXHRcdDQsXG5cdFx0XCLoub3oub7ouoDouoLouoPouoTouobouohcIixcblx0XHQ2LFxuXHRcdFwi6LqR6LqS6LqT6LqVXCIsXG5cdFx0Nixcblx0XHRcIui6nei6n1wiLFxuXHRcdDExLFxuXHRcdFwi6Lqt6Lqu6Lqw6Lqx6LqzXCIsXG5cdFx0Nixcblx0XHRcIui6u1wiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiZGM4MFwiLFxuXHRcdFwi6LuDXCIsXG5cdFx0MTAsXG5cdFx0XCLou49cIixcblx0XHQyMSxcblx0XHRcIuWgi+WgjeWfveWfreWggOWgnuWgmeWhhOWgoOWhpeWhrOWigeWiieWimuWigOmmqOm8meaHv+iJueiJveiJv+iKj+iKiuiKqOiKhOiKjuiKkeiKl+iKmeiKq+iKuOiKvuiKsOiLiOiLiuiLo+iKmOiKt+iKruiLi+iLjOiLgeiKqeiKtOiKoeiKquiKn+iLhOiLjuiKpOiLoeiMieiLt+iLpOiMj+iMh+iLnOiLtOiLkuiLmOiMjOiLu+iLk+iMkeiMmuiMhuiMlOiMleiLoOiLleiMnOiNkeiNm+iNnOiMiOiOkuiMvOiMtOiMseiOm+iNnuiMr+iNj+iNh+iNg+iNn+iNgOiMl+iNoOiMreiMuuiMs+iNpuiNpVwiXG5cdF0sXG5cdFtcblx0XHRcImRkNDBcIixcblx0XHRcIui7pVwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImRkODBcIixcblx0XHRcIui8pFwiLFxuXHRcdDMyLFxuXHRcdFwi6I2o6Iyb6I2p6I2s6I2q6I2t6I2u6I6w6I246I6z6I606I6g6I6q6I6T6I6c6I6F6I286I626I6p6I296I646I276I6Y6I6e6I6o6I666I686I+B6JCB6I+l6I+Y5aCH6JCY6JCL6I+d6I+96I+W6JCc6JC46JCR6JCG6I+U6I+f6JCP6JCD6I+46I+56I+q6I+F6I+A6JCm6I+w6I+h6JGc6JGR6JGa6JGZ6JGz6JKH6JKI6JG66JKJ6JG46JC86JGG6JGp6JG26JKM6JKO6JCx6JGt6JOB6JON6JOQ6JOm6JK96JOT6JOK6JK/6JK66JOg6JKh6JK56JK06JKX6JOl6JOj6JSM55SN6JS46JOw6JS56JSf6JS6XCJcblx0XSxcblx0W1xuXHRcdFwiZGU0MFwiLFxuXHRcdFwi6L2FXCIsXG5cdFx0MzIsXG5cdFx0XCLovarovoDovozovpLovp3ovqDovqHovqLovqTovqXovqbovqfovqrovqzovq3ovq7ovq/ovrLovrPovrTovrXovrfovrjovrrovrvovrzovr/ov4Dov4Pov4ZcIlxuXHRdLFxuXHRbXG5cdFx0XCJkZTgwXCIsXG5cdFx0XCLov4lcIixcblx0XHQ0LFxuXHRcdFwi6L+P6L+S6L+W6L+X6L+a6L+g6L+h6L+j6L+n6L+s6L+v6L+x6L+y6L+06L+16L+26L+66L+76L+86L++6L+/6YCH6YCI6YCM6YCO6YCT6YCV6YCY6JWW6JS76JO/6JO86JWZ6JWI6JWo6JWk6JWe6JW6556i6JWD6JWy6JW76Jak6Jao6JaH6JaP6JW56Jau6Jac6JaF6Ja56Ja36Jaw6JeT6JeB6Jec6Je/6Jin6JiF6Jip6JiW6Ji85bu+5byI5aS85aWB6IC35aWV5aWa5aWY5YyP5bCi5bCl5bCs5bC05omM5omq5oqf5oq75ouK5oua5ouX5ouu5oyi5ou25oy55o2L5o2D5o6t5o+25o2x5o265o6O5o605o2t5o6s5o6K5o2p5o6u5o685o+y5o+45o+g5o+/5o+E5o+e5o+O5pGS5o+G5o6+5pGF5pGB5pCL5pCb5pCg5pCM5pCm5pCh5pGe5pKE5pGt5pKWXCJcblx0XSxcblx0W1xuXHRcdFwiZGY0MFwiLFxuXHRcdFwi6YCZ6YCc6YCj6YCk6YCl6YCnXCIsXG5cdFx0NSxcblx0XHRcIumAsFwiLFxuXHRcdDQsXG5cdFx0XCLpgLfpgLnpgLrpgL3pgL/pgYDpgYPpgYXpgYbpgYhcIixcblx0XHQ0LFxuXHRcdFwi6YGO6YGU6YGV6YGW6YGZ6YGa6YGcXCIsXG5cdFx0NSxcblx0XHRcIumBpOmBpumBp+mBqemBqumBq+mBrOmBr1wiLFxuXHRcdDQsXG5cdFx0XCLpgbZcIixcblx0XHQ2LFxuXHRcdFwi6YG+6YKBXCJcblx0XSxcblx0W1xuXHRcdFwiZGY4MFwiLFxuXHRcdFwi6YKE6YKF6YKG6YKH6YKJ6YKK6YKMXCIsXG5cdFx0NCxcblx0XHRcIumCkumClOmClumCmOmCmumCnOmCnumCn+mCoOmCpOmCpemCp+mCqOmCqemCq+mCremCsumCt+mCvOmCvemCv+mDgOaRuuaSt+aSuOaSmeaSuuaTgOaTkOaTl+aTpOaTouaUieaUpeaUruW8i+W/kueUmeW8keWNn+WPseWPveWPqeWPqOWPu+WQkuWQluWQhuWRi+WRkuWRk+WRlOWRluWRg+WQoeWRl+WRmeWQo+WQsuWSguWSlOWRt+WRseWRpOWSmuWSm+WShOWRtuWRpuWSneWTkOWSreWTguWStOWTkuWSp+WSpuWTk+WTlOWRsuWSo+WTleWSu+WSv+WTjOWTmeWTmuWTnOWSqeWSquWSpOWTneWTj+WTnuWUm+WTp+WUoOWTveWUlOWTs+WUouWUo+WUj+WUkeWUp+WUquWVp+WWj+WWteWVieWVreWVgeWVleWUv+WVkOWUvFwiXG5cdF0sXG5cdFtcblx0XHRcImUwNDBcIixcblx0XHRcIumDgumDg+mDhumDiOmDiemDi+mDjOmDjemDkumDlOmDlemDlumDmOmDmemDmumDnumDn+mDoOmDo+mDpOmDpemDqemDqumDrOmDrumDsOmDsemDsumDs+mDtemDtumDt+mDuemDuumDu+mDvOmDv+mEgOmEgemEg+mEhVwiLFxuXHRcdDE5LFxuXHRcdFwi6YSa6YSb6YScXCJcblx0XSxcblx0W1xuXHRcdFwiZTA4MFwiLFxuXHRcdFwi6YSd6YSf6YSg6YSh6YSkXCIsXG5cdFx0MTAsXG5cdFx0XCLphLDphLJcIixcblx0XHQ2LFxuXHRcdFwi6YS6XCIsXG5cdFx0OCxcblx0XHRcIumFhOWUt+WVluWVteWVtuWVt+WUs+WUsOWVnOWWi+WXkuWWg+WWseWWueWWiOWWgeWWn+WVvuWXluWWkeWVu+WXn+WWveWWvuWWlOWWmeWXquWXt+WXieWYn+WXkeWXq+WXrOWXlOWXpuWXneWXhOWXr+WXpeWXsuWXs+WXjOWXjeWXqOWXteWXpOi+lOWYnuWYiOWYjOWYgeWYpOWYo+WXvuWYgOWYp+WYreWZmOWYueWZl+WYrOWZjeWZouWZmeWZnOWZjOWZlOWahuWZpOWZseWZq+WZu+WZvOWaheWak+War+WblOWbl+WbneWboeWbteWbq+WbueWbv+WchOWciuWcieWcnOW4j+W4meW4lOW4keW4seW4u+W4vFwiXG5cdF0sXG5cdFtcblx0XHRcImUxNDBcIixcblx0XHRcIumFhemFh+mFiOmFkemFk+mFlOmFlemFlumFmOmFmemFm+mFnOmFn+mFoOmFpumFp+mFqOmFq+mFremFs+mFuumFu+mFvOmGgFwiLFxuXHRcdDQsXG5cdFx0XCLphobphojphorpho7pho/phpNcIixcblx0XHQ2LFxuXHRcdFwi6YacXCIsXG5cdFx0NSxcblx0XHRcIumGpFwiLFxuXHRcdDUsXG5cdFx0XCLphqvphqzphrDphrHphrLphrPphrbphrfphrjphrnphrtcIlxuXHRdLFxuXHRbXG5cdFx0XCJlMTgwXCIsXG5cdFx0XCLphrxcIixcblx0XHQxMCxcblx0XHRcIumHiOmHi+mHkOmHklwiLFxuXHRcdDksXG5cdFx0XCLph51cIixcblx0XHQ4LFxuXHRcdFwi5bi35bmE5bmU5bmb5bme5bmh5bKM5bG65bKN5bKQ5bKW5bKI5bKY5bKZ5bKR5bKa5bKc5bK15bKi5bK95bKs5bKr5bKx5bKj5bOB5bK35bOE5bOS5bOk5bOL5bOl5bSC5bSD5bSn5bSm5bSu5bSk5bSe5bSG5bSb5bWY5bS+5bS05bS95bWs5bWb5bWv5bWd5bWr5bWL5bWK5bWp5bW05baC5baZ5bad6LGz5ba35beF5b2z5b235b6C5b6H5b6J5b6M5b6V5b6Z5b6c5b6o5b6t5b615b686KGi5b2h54qt54qw54q054q354q454uD54uB54uO54uN54uS54uo54uv54up54uy54u054u354yB54uz54yD54u6XCJcblx0XSxcblx0W1xuXHRcdFwiZTI0MFwiLFxuXHRcdFwi6YemXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZTI4MFwiLFxuXHRcdFwi6YilXCIsXG5cdFx0MzIsXG5cdFx0XCLni7vnjJfnjJPnjKHnjIrnjJ7njJ3njJXnjKLnjLnnjKXnjKznjLjnjLHnjZDnjY3njZfnjaDnjaznja/njb7oiJvlpKXpo6flpKTlpILppaPppadcIixcblx0XHQ1LFxuXHRcdFwi6aW06aW36aW96aaA6aaE6aaH6aaK6aaN6aaQ6aaR6aaT6aaU6aaV5bqA5bqR5bqL5bqW5bql5bqg5bq55bq15bq+5bqz6LWT5buS5buR5bub5buo5buq6Ia65b+E5b+J5b+W5b+P5oCD5b+u5oCE5b+h5b+k5b++5oCF5oCG5b+q5b+t5b+45oCZ5oC15oCm5oCb5oCP5oCN5oCp5oCr5oCK5oC/5oCh5oG45oG55oG75oG65oGCXCJcblx0XSxcblx0W1xuXHRcdFwiZTM0MFwiLFxuXHRcdFwi6YmGXCIsXG5cdFx0NDUsXG5cdFx0XCLpibVcIixcblx0XHQxNlxuXHRdLFxuXHRbXG5cdFx0XCJlMzgwXCIsXG5cdFx0XCLpioZcIixcblx0XHQ3LFxuXHRcdFwi6YqPXCIsXG5cdFx0MjQsXG5cdFx0XCLmgarmgb3mgpbmgprmgq3mgp3mgoPmgpLmgozmgpvmg6zmgrvmgrHmg53mg5jmg4bmg5rmgrTmhKDmhKbmhJXmhKPmg7TmhIDmhI7mhKvmhYrmhbXmhqzmhpTmhqfmhrfmh5Tmh7Xlv53pmrPpl6npl6vpl7Hpl7Ppl7Xpl7bpl7zpl77pmIPpmITpmIbpmIjpmIrpmIvpmIzpmI3pmI/pmJLpmJXpmJbpmJfpmJnpmJrkuKzniL/miJXmsLXmsZTmsZzmsYrmsqPmsoXmspDmspTmsozmsajmsanmsbTmsbbmsobmsqnms5Dms5Tmsq3ms7fms7jms7Hms5fmsrLms6Dms5bms7rms6vms67msrHms5Pms6/ms75cIlxuXHRdLFxuXHRbXG5cdFx0XCJlNDQwXCIsXG5cdFx0XCLpiqhcIixcblx0XHQ1LFxuXHRcdFwi6YqvXCIsXG5cdFx0MjQsXG5cdFx0XCLpi4lcIixcblx0XHQzMVxuXHRdLFxuXHRbXG5cdFx0XCJlNDgwXCIsXG5cdFx0XCLpi6lcIixcblx0XHQzMixcblx0XHRcIua0uea0p+a0jOa1g+a1iOa0h+a0hOa0mea0jua0q+a1jea0rua0tea0mua1j+a1kua1lOa0s+a2kea1r+a2nua2oOa1nua2k+a2lOa1nOa1oOa1vOa1o+a4mua3h+a3hea3nua4jua2v+a3oOa4kea3pua3nea3mea4lua2q+a4jOa2rua4q+a5rua5jua5q+a6sua5n+a6hua5k+a5lOa4sua4pea5hOa7n+a6sea6mOa7oOa8rea7oua6pea6p+a6vea6u+a6t+a7l+a6tOa7j+a6j+a7gua6n+a9oua9hua9h+a8pOa8lea7uea8r+a8tua9i+a9tOa8qua8iea8qea+iea+jea+jOa9uOa9sua9vOa9uua/kVwiXG5cdF0sXG5cdFtcblx0XHRcImU1NDBcIixcblx0XHRcIumMilwiLFxuXHRcdDUxLFxuXHRcdFwi6Yy/XCIsXG5cdFx0MTBcblx0XSxcblx0W1xuXHRcdFwiZTU4MFwiLFxuXHRcdFwi6Y2KXCIsXG5cdFx0MzEsXG5cdFx0XCLpjavmv4nmvqfmvrnmvrbmv4Lmv6Hmv67mv57mv6Dmv6/ngJrngKPngJvngLnngLXngY/ngZ7lroDlroTlrpXlrpPlrqXlrrjnlK/pqp7mkLTlr6Tlr67opLDlr7DouYforIfovrbov5Pov5Xov6Xov67ov6Tov6nov6bov7Pov6jpgIXpgITpgIvpgKbpgJHpgI3pgJbpgKHpgLXpgLbpgK3pgK/pgYTpgZHpgZLpgZDpgajpgZjpgaLpgZvmmrnpgbTpgb3pgoLpgojpgoPpgovlvZDlvZflvZblvZjlsLvlkqvlsZDlsZnlrbHlsaPlsabnvrzlvKrlvKnlvK3oibTlvLzprLvlsa7lpoHlpoPlpo3lpqnlpqrlpqNcIlxuXHRdLFxuXHRbXG5cdFx0XCJlNjQwXCIsXG5cdFx0XCLpjaxcIixcblx0XHQzNCxcblx0XHRcIumOkFwiLFxuXHRcdDI3XG5cdF0sXG5cdFtcblx0XHRcImU2ODBcIixcblx0XHRcIumOrFwiLFxuXHRcdDI5LFxuXHRcdFwi6Y+L6Y+M6Y+N5aaX5aeK5aar5aae5aak5aeS5aay5aav5aeX5aa+5aiF5aiG5aed5aiI5aej5aeY5ae55aiM5aiJ5aiy5ai05aiR5aij5aiT5amA5amn5amK5amV5ai85ami5am16IOs5aqq5aqb5am35am65aq+5aur5aqy5auS5auU5aq45aug5auj5aux5auW5aum5auY5auc5ayJ5ayX5ayW5ayy5ay35a2A5bCV5bCc5a2a5a2l5a2z5a2R5a2T5a2i6am16am36am46am66am/6am96aqA6aqB6aqF6aqI6aqK6aqQ6aqS6aqT6aqW6aqY6aqb6aqc6aqd6aqf6aqg6aqi6aqj6aql6aqn57qf57qh57qj57ql57qo57qpXCJcblx0XSxcblx0W1xuXHRcdFwiZTc0MFwiLFxuXHRcdFwi6Y+OXCIsXG5cdFx0Nyxcblx0XHRcIumPl1wiLFxuXHRcdDU0XG5cdF0sXG5cdFtcblx0XHRcImU3ODBcIixcblx0XHRcIumQjlwiLFxuXHRcdDMyLFxuXHRcdFwi57qt57qw57q+57uA57uB57uC57uJ57uL57uM57uQ57uU57uX57ub57ug57uh57uo57ur57uu57uv57ux57uy57yN57u257u657u757u+57yB57yC57yD57yH57yI57yL57yM57yP57yR57yS57yX57yZ57yc57yb57yf57yhXCIsXG5cdFx0Nixcblx0XHRcIue8que8q+e8rOe8ree8r1wiLFxuXHRcdDQsXG5cdFx0XCLnvLXlubrnlb/lt5vnlL7pgpXnjo7njpHnjq7njqLnjp/nj4/nj4Lnj5HnjrfnjrPnj4Dnj4nnj4jnj6Xnj5npobznkIrnj6nnj6fnj57njrrnj7LnkI/nkKrnkZvnkKbnkKXnkKjnkLDnkK7nkKxcIlxuXHRdLFxuXHRbXG5cdFx0XCJlODQwXCIsXG5cdFx0XCLpkK9cIixcblx0XHQxNCxcblx0XHRcIumQv1wiLFxuXHRcdDQzLFxuXHRcdFwi6ZGs6ZGt6ZGu6ZGvXCJcblx0XSxcblx0W1xuXHRcdFwiZTg4MFwiLFxuXHRcdFwi6ZGwXCIsXG5cdFx0MjAsXG5cdFx0XCLpkpHpkpbpkpjpk4fpk4/pk5Ppk5Tpk5rpk6bpk7vplJzplKDnkJvnkJrnkYHnkZznkZfnkZXnkZnnkbfnka3nkb7nkpznko7nkoDnkoHnkofnkovnkp7nkqjnkqnnkpDnkqfnk5Lnkrrpn6rpn6vpn6zmnYzmnZPmnZ7mnYjmnanmnqXmnofmnarmnbPmnpjmnqfmnbXmnqjmnp7mnq3mnovmnbfmnbzmn7DmoInmn5jmoIrmn6nmnrDmoIzmn5nmnrXmn5rmnrPmn53moIDmn4Pmnrjmn6LmoI7mn4Hmn73moLLmoLPmoaDmoaHmoY7moaLmoYTmoaTmooPmoJ3moZXmoabmoYHmoafmoYDmoL7moYrmoYnmoKnmorXmoo/mobTmobfmopPmoavmo4Lmpa7mo7zmpJ/mpKDmo7lcIlxuXHRdLFxuXHRbXG5cdFx0XCJlOTQwXCIsXG5cdFx0XCLplKfplLPplL3plYPplYjplYvplZXplZrplaDpla7plbTplbXplbdcIixcblx0XHQ3LFxuXHRcdFwi6ZaAXCIsXG5cdFx0NDJcblx0XSxcblx0W1xuXHRcdFwiZTk4MFwiLFxuXHRcdFwi6ZarXCIsXG5cdFx0MzIsXG5cdFx0XCLmpKTmo7DmpIvmpIHmpZfmo6PmpJDmpbHmpLnmpaDmpYLmpZ3mpoTmpavmpoDmppjmpbjmpLTmp4zmpofmpojmp47mponmpabmpaPmpbnmppvmpqfmprvmpqvmpq3mp5TmprHmp4Hmp4rmp5/mppXmp6Dmpo3mp7/mqK/mp63mqJfmqJjmqaXmp7LmqYTmqL7mqqDmqZDmqZvmqLXmqo7mqbnmqL3mqKjmqZjmqbzmqpHmqpDmqqnmqpfmqqvnjLfnjZLmroHmroLmrofmroTmrpLmrpPmro3mrprmrpvmrqHmrqrovavova3ovbHovbLovbPovbXovbbovbjovbfovbnovbrovbzovb7ovoHovoLovoTovofovotcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYTQwXCIsXG5cdFx0XCLpl4xcIixcblx0XHQyNyxcblx0XHRcIumXrOmXv+mYh+mYk+mYmOmYm+mYnumYoOmYo1wiLFxuXHRcdDYsXG5cdFx0XCLpmKvpmKzpmK3pmK/pmLDpmLfpmLjpmLnpmLrpmL7pmYHpmYPpmYrpmY7pmY/pmZHpmZLpmZPpmZbpmZdcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYTgwXCIsXG5cdFx0XCLpmZjpmZnpmZrpmZzpmZ3pmZ7pmaDpmaPpmaXpmabpmavpma1cIixcblx0XHQ0LFxuXHRcdFwi6Zmz6Zm4XCIsXG5cdFx0MTIsXG5cdFx0XCLpmofpmonpmorovo3ovo7ovo/ovpjovprou47miIvmiJfmiJvmiJ/miKLmiKHmiKXmiKTmiKzoh6fnk6/nk7Tnk7/nlI/nlJHnlJPmlLTml67ml6/ml7DmmIrmmJnmnbLmmIPmmJXmmIDngoXmm7fmmJ3mmLTmmLHmmLbmmLXogIbmmZ/mmZTmmYHmmY/mmZbmmaHmmZfmmbfmmoTmmozmmqfmmp3mmr7mm5vmm5zmm6bmm6notLLotLPotLbotLvotL3otYDotYXotYbotYjotYnotYfotY3otZXotZnop4fop4rop4vop4zop47op4/op5Dop5Hnia7nip/niZ3niabnia/nib7nib/nioTniovnio3nio/nipLmjIjmjLLmjrBcIlxuXHRdLFxuXHRbXG5cdFx0XCJlYjQwXCIsXG5cdFx0XCLpmozpmo7pmpHpmpLpmpPpmpXpmpbpmprpmpvpmp1cIixcblx0XHQ5LFxuXHRcdFwi6ZqoXCIsXG5cdFx0Nyxcblx0XHRcIumasemasumatOmatemat+mauOmauumau+mav+mbgumbg+mbiOmbiumbi+mbkOmbkembk+mblOmbllwiLFxuXHRcdDksXG5cdFx0XCLpm6FcIixcblx0XHQ2LFxuXHRcdFwi6ZurXCJcblx0XSxcblx0W1xuXHRcdFwiZWI4MFwiLFxuXHRcdFwi6Zus6Zut6Zuu6Zuw6Zux6Zuy6Zu06Zu16Zu46Zu66Zu76Zu86Zu96Zu/6ZyC6ZyD6ZyF6ZyK6ZyL6ZyM6ZyQ6ZyR6ZyS6ZyU6ZyV6ZyXXCIsXG5cdFx0NCxcblx0XHRcIumcnemcn+mcoOaQv+aTmOiAhOavquavs+avveavteavueawheawh+awhuawjeawleawmOawmeawmuawoeawqeawpOawquawsuaUteaVleaVq+eJjeeJkueJlueIsOiZouWIluiCn+iCnOiCk+iCvOaciuiCveiCseiCq+iCreiCtOiCt+iDp+iDqOiDqeiDquiDm+iDguiDhOiDmeiDjeiDl+ackOiDneiDq+iDseiDtOiDreiEjeiEjuiDsuiDvOacleiEkuixmuiEtuiEnuiErOiEmOiEsuiFiOiFjOiFk+iFtOiFmeiFmuiFseiFoOiFqeiFvOiFveiFreiFp+WhjeWqteiGiOiGguiGkea7leiGo+iGquiHjOacpuiHiuiGu1wiXG5cdF0sXG5cdFtcblx0XHRcImVjNDBcIixcblx0XHRcIumcoVwiLFxuXHRcdDgsXG5cdFx0XCLpnKvpnKzpnK7pnK/pnLHpnLNcIixcblx0XHQ0LFxuXHRcdFwi6Zy66Zy76Zy86Zy96Zy/XCIsXG5cdFx0MTgsXG5cdFx0XCLpnZTpnZXpnZfpnZjpnZrpnZzpnZ3pnZ/pnaPpnaTpnabpnafpnajpnapcIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcImVjODBcIixcblx0XHRcIumdsumdtemdt1wiLFxuXHRcdDQsXG5cdFx0XCLpnb1cIixcblx0XHQ3LFxuXHRcdFwi6Z6GXCIsXG5cdFx0NCxcblx0XHRcIumejOmejumej+mekOmek+melemelumel+memVwiLFxuXHRcdDQsXG5cdFx0XCLoh4HohqbmrKTmrLfmrLnmrYPmrYbmrZnpo5Hpo5Lpo5Ppo5Xpo5npo5rmrrPlvYDmr4Lop7PmlpDpvZHmlpPmlrzml4bml4Tml4Pml4zml47ml5Lml5bngoDngpzngpbngp3ngrvng4DngrfngqvngrHng6jng4rnhJDnhJPnhJbnhK/nhLHnhbPnhZznhajnhYXnhbLnhYrnhbjnhbrnhpjnhrPnhrXnhqjnhqDnh6Dnh5Tnh6fnh7nniJ3niKjngaznhJjnhabnhrnmiL7miL3miYPmiYjmiYnnpLvnpYDnpYbnpYnnpZvnpZznpZPnpZrnpaLnpZfnpaDnpa/npafnpbrnpoXnpornpprnpqfnprPlv5Hlv5BcIlxuXHRdLFxuXHRbXG5cdFx0XCJlZDQwXCIsXG5cdFx0XCLpnp7pnp/pnqHpnqLpnqRcIixcblx0XHQ2LFxuXHRcdFwi6Z6s6Z6u6Z6w6Z6x6Z6z6Z61XCIsXG5cdFx0NDZcblx0XSxcblx0W1xuXHRcdFwiZWQ4MFwiLFxuXHRcdFwi6Z+k6Z+l6Z+o6Z+uXCIsXG5cdFx0NCxcblx0XHRcIumftOmft1wiLFxuXHRcdDIzLFxuXHRcdFwi5oC85oGd5oGa5oGn5oGB5oGZ5oGj5oKr5oSG5oSN5oWd5oap5oad5oeL5oeR5oiG6IKA6IG/5rKT5rO25re855+255+456CA56CJ56CX56CY56CR5par56Ct56Cc56Cd56C556C656C756Cf56C856Cl56Cs56Cj56Cp56GO56Gt56GW56GX56Cm56GQ56GH56GM56Gq56Kb56KT56Ka56KH56Kc56Kh56Kj56Ky56K556Kl56OU56OZ56OJ56Os56Oy56SF56O056ST56Sk56Se56S06b6b6bu56bu76bu855ux55yE55yN55u555yH55yI55ya55yi55yZ55yt55ym55y155y4552Q552R552H552D552a552oXCJcblx0XSxcblx0W1xuXHRcdFwiZWU0MFwiLFxuXHRcdFwi6aCPXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZWU4MFwiLFxuXHRcdFwi6aGOXCIsXG5cdFx0MzIsXG5cdFx0XCLnnaLnnaXnnb/nno3nnb3nnoDnnoznnpHnnp/nnqDnnrDnnrXnnr3nlLrnlYDnlY7nlYvnlYjnlZvnlbLnlbnnloPnvZjnvaHnvZ/oqYjnvajnvbTnvbHnvbnnvoHnvb7nm43nm6XooLLpkoXpkobpkofpkovpkorpkozpko3pko/pkpDpkpTpkpfpkpXpkprpkpvpkpzpkqPpkqTpkqvpkqrpkq3pkqzpkq/pkrDpkrLpkrTpkrZcIixcblx0XHQ0LFxuXHRcdFwi6ZK86ZK96ZK/6ZOE6ZOIXCIsXG5cdFx0Nixcblx0XHRcIumTkOmTkemTkumTlemTlumTl+mTmemTmOmTm+mTnumTn+mToOmToumTpOmTpemTp+mTqOmTqlwiXG5cdF0sXG5cdFtcblx0XHRcImVmNDBcIixcblx0XHRcIumhr1wiLFxuXHRcdDUsXG5cdFx0XCLpoovpoo7popLpopXpopnpoqPpoqhcIixcblx0XHQzNyxcblx0XHRcIumjj+mjkOmjlOmjlumjl+mjm+mjnOmjnemjoFwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiZWY4MFwiLFxuXHRcdFwi6aOl6aOm6aOpXCIsXG5cdFx0MzAsXG5cdFx0XCLpk6npk6vpk67pk6/pk7Ppk7Tpk7Xpk7fpk7npk7zpk73pk7/plIPplILplIbplIfplInplIrplI3plI7plI/plJJcIixcblx0XHQ0LFxuXHRcdFwi6ZSY6ZSb6ZSd6ZSe6ZSf6ZSi6ZSq6ZSr6ZSp6ZSs6ZSx6ZSy6ZS06ZS26ZS36ZS46ZS86ZS+6ZS/6ZWC6ZS16ZWE6ZWF6ZWG6ZWJ6ZWM6ZWO6ZWP6ZWS6ZWT6ZWU6ZWW6ZWX6ZWY6ZWZ6ZWb6ZWe6ZWf6ZWd6ZWh6ZWi6ZWkXCIsXG5cdFx0OCxcblx0XHRcIumVr+mVsemVsumVs+mUuuefp+efrOmbieenleenreeno+enq+eohuW1h+eog+eogueonueolFwiXG5cdF0sXG5cdFtcblx0XHRcImYwNDBcIixcblx0XHRcIumkiFwiLFxuXHRcdDQsXG5cdFx0XCLppI7ppI/ppJFcIixcblx0XHQyOCxcblx0XHRcIumkr1wiLFxuXHRcdDI2XG5cdF0sXG5cdFtcblx0XHRcImYwODBcIixcblx0XHRcIumlilwiLFxuXHRcdDksXG5cdFx0XCLppZZcIixcblx0XHQxMixcblx0XHRcIumlpOmlpumls+mluOmluemlu+mlvummgummg+mmieeoueeot+epkem7j+mmpeepsOeaiOeajueak+eameeapOeTnueToOeUrOm4oOm4oum4qFwiLFxuXHRcdDQsXG5cdFx0XCLpuLLpuLHpuLbpuLjpuLfpuLnpuLrpuL7puYHpuYLpuYTpuYbpuYfpuYjpuYnpuYvpuYzpuY7puZHpuZXpuZfpuZrpuZvpuZzpuZ7puaPpuaZcIixcblx0XHQ2LFxuXHRcdFwi6bmx6bmt6bmz55aS55aU55aW55ag55ad55as55aj55az55a055a455eE55ax55aw55eD55eC55eW55eN55ej55eo55em55ek55er55en55iD55ex55e855e/55iQ55iA55iF55iM55iX55iK55il55iY55iV55iZXCJcblx0XSxcblx0W1xuXHRcdFwiZjE0MFwiLFxuXHRcdFwi6aaM6aaO6aaaXCIsXG5cdFx0MTAsXG5cdFx0XCLppqbppqfppqlcIixcblx0XHQ0N1xuXHRdLFxuXHRbXG5cdFx0XCJmMTgwXCIsXG5cdFx0XCLpp5lcIixcblx0XHQzMixcblx0XHRcIueYm+eYvOeYoueYoOeZgOeYreeYsOeYv+eYteeZg+eYvueYs+eZjeeZnueZlOeZnOeZlueZq+eZr+e/iuerpuepuOepueeqgOeqhueqiOeqleeqpueqoOeqrOeqqOeqreeqs+ihpOihqeihsuihveihv+iiguiiouijhuiit+iivOijieijouijjuijo+ijpeijseikmuijvOijqOijvuijsOikoeikmeikk+ikm+ikiuiktOikq+iktuilgeilpuilu+eWi+iDpeeasueatOefnOiAkuiAlOiAluiAnOiAoOiAouiApeiApuiAp+iAqeiAqOiAseiAi+iAteiBg+iBhuiBjeiBkuiBqeiBseimg+mhuOmigOmig1wiXG5cdF0sXG5cdFtcblx0XHRcImYyNDBcIixcblx0XHRcIumnulwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImYyODBcIixcblx0XHRcIumouVwiLFxuXHRcdDMyLFxuXHRcdFwi6aKJ6aKM6aKN6aKP6aKU6aKa6aKb6aKe6aKf6aKh6aKi6aKl6aKm6JmN6JmU6Jms6Jmu6Jm/6Jm66Jm86Jm76Jqo6JqN6JqL6Jqs6Jqd6Jqn6Jqj6Jqq6JqT6Jqp6Jq26JuE6Jq16JuO6Jqw6Jq66Jqx6Jqv6JuJ6JuP6Jq06Jup6Jux6Juy6Jut6Juz6JuQ6JyT6Jue6Ju06Juf6JuY6JuR6JyD6JyH6Ju46JyI6JyK6JyN6JyJ6Jyj6Jy76Jye6Jyl6Jyu6Jya6Jy+6J2I6Jy06Jyx6Jyp6Jy36Jy/6J6C6Jyi6J296J2+6J276J2g6J2w6J2M6J2u6J6L6J2T6J2j6J286J2k6J2Z6J2l6J6T6J6v6J6o6J+SXCJcblx0XSxcblx0W1xuXHRcdFwiZjM0MFwiLFxuXHRcdFwi6amaXCIsXG5cdFx0MTcsXG5cdFx0XCLpqbLpqoPpqonpqo3pqo7pqpTpqpXpqpnpqqbpqqlcIixcblx0XHQ2LFxuXHRcdFwi6aqy6aqz6aq06aq16aq56aq76aq96aq+6aq/6auD6auE6auGXCIsXG5cdFx0NCxcblx0XHRcIumrjemrjumrj+mrkOmrkumrlOmrlemrlumrl+mrmemrmumrm+mrnFwiXG5cdF0sXG5cdFtcblx0XHRcImYzODBcIixcblx0XHRcIumrnemrnumroOmroumro+mrpOmrpemrp+mrqOmrqemrqumrrOmrrumrsFwiLFxuXHRcdDgsXG5cdFx0XCLpq7rpq7xcIixcblx0XHQ2LFxuXHRcdFwi6ayE6ayF6ayG6J+G6J6I6J6F6J6t6J6X6J6D6J6r6J+l6J6s6J616J6z6J+L6J+T6J696J+R6J+A6J+K6J+b6J+q6J+g6J+u6KCW6KCT6J++6KCK6KCb6KCh6KC56KC857y2572C572E572F6IiQ56u656u956yI56yD56yE56yV56yK56yr56yP562H56y456yq56yZ56yu56yx56yg56yl56yk56yz56y+56ye562Y562a562F5621562M562d562g562u5627562i562y562x566Q566m566n5664566s566d566o566F566q566c566i566r566056+R56+B56+M56+d56+a56+l56+m56+q57CM56++56+857CP57CW57CLXCJcblx0XSxcblx0W1xuXHRcdFwiZjQ0MFwiLFxuXHRcdFwi6ayH6ayJXCIsXG5cdFx0NSxcblx0XHRcIumskOmskemskumslFwiLFxuXHRcdDEwLFxuXHRcdFwi6ayg6ayh6ayi6aykXCIsXG5cdFx0MTAsXG5cdFx0XCLprLDprLHprLNcIixcblx0XHQ3LFxuXHRcdFwi6ay96ay+6ay/6a2A6a2G6a2K6a2L6a2M6a2O6a2Q6a2S6a2T6a2VXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCJmNDgwXCIsXG5cdFx0XCLprZtcIixcblx0XHQzMixcblx0XHRcIuewn+ewquewpuewuOexgeexgOiHvuiIgeiIguiIhOiHrOihhOiIoeiIouiIo+iIreiIr+iIqOiIq+iIuOiIu+iIs+iItOiIvuiJhOiJieiJi+iJj+iJmuiJn+iJqOihvuiiheiiiOijmOijn+ilnue+nee+n+e+p+e+r+e+sOe+suexvOaVieeykeeyneeynOeynueyoueysueyvOeyveezgeezh+ezjOezjeeziOezheezl+ezqOiJruaaqOe+v+e/jue/lee/pee/oee/pue/qee/rue/s+ezuOe1t+e2pue2rue5h+e6m+m6uOm6tOi1s+i2hOi2lOi2kei2sei1p+i1reixh+ixiemFiumFkOmFjumFj+mFpFwiXG5cdF0sXG5cdFtcblx0XHRcImY1NDBcIixcblx0XHRcIumtvFwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImY1ODBcIixcblx0XHRcIumuu1wiLFxuXHRcdDMyLFxuXHRcdFwi6YWi6YWh6YWw6YWp6YWv6YW96YW+6YWy6YW06YW56YaM6YaF6YaQ6YaN6YaR6Yai6Yaj6Yaq6Yat6Yau6Yav6Ya16Ya06Ya66LGV6bm+6La46Ler6LiF6LmZ6Lmp6La16La/6La86La66LeE6LeW6LeX6Lea6Lee6LeO6LeP6Leb6LeG6Les6Le36Le46Lej6Le56Le76Lek6LiJ6Le96LiU6Lid6Lif6Lis6Liu6Lij6Liv6Li66LmA6Li56Li16Li96Lix6LmJ6LmB6LmC6LmR6LmS6LmK6Lmw6Lm26Lm86Lmv6Lm06LqF6LqP6LqU6LqQ6Lqc6Lqe6LG46LKC6LKK6LKF6LKY6LKU5pab6KeW6Kee6Kea6KecXCJcblx0XSxcblx0W1xuXHRcdFwiZjY0MFwiLFxuXHRcdFwi6a+cXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjY4MFwiLFxuXHRcdFwi6bCbXCIsXG5cdFx0MzIsXG5cdFx0XCLop6Xop6vop6/oqL7orKbpnZPpm6npm7Ppm6/pnIbpnIHpnIjpnI/pnI7pnKrpnK3pnLDpnL7pvoDpvoPpvoVcIixcblx0XHQ1LFxuXHRcdFwi6b6M6bu+6byL6byN6Zq56Zq86Zq96ZuO6ZuS556/6Zug6YqO6Yqu6YuI6Yy+6Y2q6Y+K6Y6P6ZC+6ZGr6bG/6bKC6bKF6bKG6bKH6bKI56ij6bKL6bKO6bKQ6bKR6bKS6bKU6bKV6bKa6bKb6bKeXCIsXG5cdFx0NSxcblx0XHRcIumypVwiLFxuXHRcdDQsXG5cdFx0XCLpsqvpsq3psq7psrBcIixcblx0XHQ3LFxuXHRcdFwi6bK66bK76bK86bK96bOE6bOF6bOG6bOH6bOK6bOLXCJcblx0XSxcblx0W1xuXHRcdFwiZjc0MFwiLFxuXHRcdFwi6bC8XCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiZjc4MFwiLFxuXHRcdFwi6bG76bG96bG+6bKA6bKD6bKE6bKJ6bKK6bKM6bKP6bKT6bKW6bKX6bKY6bKZ6bKd6bKq6bKs6bKv6bK56bK+XCIsXG5cdFx0NCxcblx0XHRcIumziOmziemzkemzkumzmumzm+mzoOmzoemzjFwiLFxuXHRcdDQsXG5cdFx0XCLps5Pps5Tps5Xps5fps5jps5nps5zps53ps5/ps6LpnbzpnoXpnpHpnpLpnpTpnq/pnqvpnqPpnrLpnrTpqrHpqrDpqrfpuZjpqrbpqrrpqrzpq4Hpq4Dpq4Xpq4Lpq4vpq4zpq5HprYXprYPprYfprYnprYjprY3prZHpo6jppI3ppK7ppZXppZTpq5/pq6Hpq6bpq6/pq6vpq7vpq63pq7nprIjprI/prJPprJ/prKPpur3pur7nuLvpuoLpuofpuojpuovpupLpj5bpup3pup/pu5vpu5zpu53pu6Dpu5/pu6Lpu6npu6fpu6Xpu6rpu6/pvKLpvKzpvK/pvLnpvLfpvL3pvL7pvYRcIlxuXHRdLFxuXHRbXG5cdFx0XCJmODQwXCIsXG5cdFx0XCLps6NcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmODgwXCIsXG5cdFx0XCLptKJcIixcblx0XHQzMlxuXHRdLFxuXHRbXG5cdFx0XCJmOTQwXCIsXG5cdFx0XCLptYNcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmOTgwXCIsXG5cdFx0XCLptoJcIixcblx0XHQzMlxuXHRdLFxuXHRbXG5cdFx0XCJmYTQwXCIsXG5cdFx0XCLptqNcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJmYTgwXCIsXG5cdFx0XCLpt6JcIixcblx0XHQzMlxuXHRdLFxuXHRbXG5cdFx0XCJmYjQwXCIsXG5cdFx0XCLpuINcIixcblx0XHQyNyxcblx0XHRcIum4pOm4p+m4rum4sOm4tOm4u+m4vOm5gOm5jem5kOm5kum5k+m5lOm5lum5mem5nem5n+m5oOm5oem5oum5pem5rum5r+m5sum5tFwiLFxuXHRcdDksXG5cdFx0XCLpuoBcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYjgwXCIsXG5cdFx0XCLpuoHpuoPpuoTpuoXpuobpuonpuorpuoxcIixcblx0XHQ1LFxuXHRcdFwi6bqUXCIsXG5cdFx0OCxcblx0XHRcIum6num6oFwiLFxuXHRcdDUsXG5cdFx0XCLpuqfpuqjpuqnpuqpcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYzQwXCIsXG5cdFx0XCLpuqtcIixcblx0XHQ4LFxuXHRcdFwi6bq16bq26bq36bq56bq66bq86bq/XCIsXG5cdFx0NCxcblx0XHRcIum7hem7hum7h+m7iOm7ium7i+m7jOm7kOm7kum7k+m7lem7lum7l+m7mem7mum7num7oem7o+m7pOm7pum7qOm7q+m7rOm7rem7rum7sFwiLFxuXHRcdDgsXG5cdFx0XCLpu7rpu73pu79cIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImZjODBcIixcblx0XHRcIum8hlwiLFxuXHRcdDQsXG5cdFx0XCLpvIzpvI/pvJHpvJLpvJTpvJXpvJbpvJjpvJpcIixcblx0XHQ1LFxuXHRcdFwi6byh6byjXCIsXG5cdFx0OCxcblx0XHRcIum8rem8rum8sOm8sVwiXG5cdF0sXG5cdFtcblx0XHRcImZkNDBcIixcblx0XHRcIum8slwiLFxuXHRcdDQsXG5cdFx0XCLpvLjpvLrpvLzpvL9cIixcblx0XHQ0LFxuXHRcdFwi6b2FXCIsXG5cdFx0MTAsXG5cdFx0XCLpvZJcIixcblx0XHQzOFxuXHRdLFxuXHRbXG5cdFx0XCJmZDgwXCIsXG5cdFx0XCLpvblcIixcblx0XHQ1LFxuXHRcdFwi6b6B6b6C6b6NXCIsXG5cdFx0MTEsXG5cdFx0XCLpvpzpvp3pvp7pvqFcIixcblx0XHQ0LFxuXHRcdFwi76Ss76W576aV76en76exXCJcblx0XSxcblx0W1xuXHRcdFwiZmU0MFwiLFxuXHRcdFwi76iM76iN76iO76iP76iR76iT76iU76iY76if76ig76ih76ij76ik76in76io76ipXCJcblx0XVxuXTtcblxudmFyIGNwOTM2JDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0J2RlZmF1bHQnOiBjcDkzNlxufSk7XG5cbnZhciBnYmtBZGRlZCA9IFtcblx0W1xuXHRcdFwiYTE0MFwiLFxuXHRcdFwi7pOGXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiYTE4MFwiLFxuXHRcdFwi7pSFXCIsXG5cdFx0MzJcblx0XSxcblx0W1xuXHRcdFwiYTI0MFwiLFxuXHRcdFwi7pSmXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiYTI4MFwiLFxuXHRcdFwi7pWlXCIsXG5cdFx0MzJcblx0XSxcblx0W1xuXHRcdFwiYTJhYlwiLFxuXHRcdFwi7p2mXCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCJhMmUzXCIsXG5cdFx0XCLigqzuna1cIlxuXHRdLFxuXHRbXG5cdFx0XCJhMmVmXCIsXG5cdFx0XCLuna7una9cIlxuXHRdLFxuXHRbXG5cdFx0XCJhMmZkXCIsXG5cdFx0XCLunbDunbFcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMzQwXCIsXG5cdFx0XCLuloZcIixcblx0XHQ2MlxuXHRdLFxuXHRbXG5cdFx0XCJhMzgwXCIsXG5cdFx0XCLul4VcIixcblx0XHQzMSxcblx0XHRcIuOAgFwiXG5cdF0sXG5cdFtcblx0XHRcImE0NDBcIixcblx0XHRcIu6XplwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImE0ODBcIixcblx0XHRcIu6YpVwiLFxuXHRcdDMyXG5cdF0sXG5cdFtcblx0XHRcImE0ZjRcIixcblx0XHRcIu6dslwiLFxuXHRcdDEwXG5cdF0sXG5cdFtcblx0XHRcImE1NDBcIixcblx0XHRcIu6ZhlwiLFxuXHRcdDYyXG5cdF0sXG5cdFtcblx0XHRcImE1ODBcIixcblx0XHRcIu6ahVwiLFxuXHRcdDMyXG5cdF0sXG5cdFtcblx0XHRcImE1ZjdcIixcblx0XHRcIu6dvVwiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiYTY0MFwiLFxuXHRcdFwi7pqmXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiYTY4MFwiLFxuXHRcdFwi7pulXCIsXG5cdFx0MzJcblx0XSxcblx0W1xuXHRcdFwiYTZiOVwiLFxuXHRcdFwi7p6FXCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCJhNmQ5XCIsXG5cdFx0XCLuno1cIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImE2ZWNcIixcblx0XHRcIu6elO6elVwiXG5cdF0sXG5cdFtcblx0XHRcImE2ZjNcIixcblx0XHRcIu6ellwiXG5cdF0sXG5cdFtcblx0XHRcImE2ZjZcIixcblx0XHRcIu6el1wiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiYTc0MFwiLFxuXHRcdFwi7pyGXCIsXG5cdFx0NjJcblx0XSxcblx0W1xuXHRcdFwiYTc4MFwiLFxuXHRcdFwi7p2FXCIsXG5cdFx0MzJcblx0XSxcblx0W1xuXHRcdFwiYTdjMlwiLFxuXHRcdFwi7p6gXCIsXG5cdFx0MTRcblx0XSxcblx0W1xuXHRcdFwiYTdmMlwiLFxuXHRcdFwi7p6vXCIsXG5cdFx0MTJcblx0XSxcblx0W1xuXHRcdFwiYTg5NlwiLFxuXHRcdFwi7p68XCIsXG5cdFx0MTBcblx0XSxcblx0W1xuXHRcdFwiYThiY1wiLFxuXHRcdFwi7p+HXCJcblx0XSxcblx0W1xuXHRcdFwiYThiZlwiLFxuXHRcdFwix7lcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOGMxXCIsXG5cdFx0XCLun4nun4run4vun4xcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOGVhXCIsXG5cdFx0XCLun41cIixcblx0XHQyMFxuXHRdLFxuXHRbXG5cdFx0XCJhOTU4XCIsXG5cdFx0XCLun6JcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOTViXCIsXG5cdFx0XCLun6NcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOTVkXCIsXG5cdFx0XCLun6Tun6Xun6ZcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOTg5XCIsXG5cdFx0XCLjgL7iv7BcIixcblx0XHQxMVxuXHRdLFxuXHRbXG5cdFx0XCJhOTk3XCIsXG5cdFx0XCLun7RcIixcblx0XHQxMlxuXHRdLFxuXHRbXG5cdFx0XCJhOWYwXCIsXG5cdFx0XCLuoIFcIixcblx0XHQxNFxuXHRdLFxuXHRbXG5cdFx0XCJhYWExXCIsXG5cdFx0XCLugIBcIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJhYmExXCIsXG5cdFx0XCLugZ5cIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJhY2ExXCIsXG5cdFx0XCLugrxcIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJhZGExXCIsXG5cdFx0XCLuhJpcIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJhZWExXCIsXG5cdFx0XCLuhbhcIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJhZmExXCIsXG5cdFx0XCLuh5ZcIixcblx0XHQ5M1xuXHRdLFxuXHRbXG5cdFx0XCJkN2ZhXCIsXG5cdFx0XCLuoJBcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImY4YTFcIixcblx0XHRcIu6ItFwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImY5YTFcIixcblx0XHRcIu6KklwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImZhYTFcIixcblx0XHRcIu6LsFwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImZiYTFcIixcblx0XHRcIu6NjlwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImZjYTFcIixcblx0XHRcIu6OrFwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImZkYTFcIixcblx0XHRcIu6QilwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImZlNTBcIixcblx0XHRcIuK6ge6glu6gl+6gmOK6hOORs+ORh+K6iOK6i+6gnuOWnuOYmuOYjuK6jOK6l+OlruOkmO6gpuOnj+Onn+Ops+OnkO6gq+6grOOtjuOxruOzoOK6p+6gse6gsuK6quSBluSFn+K6ruSMt+K6s+K6tuK6t+6gu+SOseSOrOK6u+SPneSTluSZoeSZjO6hg1wiXG5cdF0sXG5cdFtcblx0XHRcImZlODBcIixcblx0XHRcIuSco+ScqeSdvOSejeK7iuSlh+SluuSlveSmguSmg+SmheSmhuSmn+Smm+Smt+Smtu6hlO6hleSyo+Syn+SyoOSyoeSxt+SyouS0k1wiLFxuXHRcdDYsXG5cdFx0XCLktq7uoaTukahcIixcblx0XHQ5M1xuXHRdXG5dO1xuXG52YXIgZ2JrQWRkZWQkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHQnZGVmYXVsdCc6IGdia0FkZGVkXG59KTtcblxudmFyIHVDaGFycyA9IFtcblx0MTI4LFxuXHQxNjUsXG5cdDE2OSxcblx0MTc4LFxuXHQxODQsXG5cdDIxNixcblx0MjI2LFxuXHQyMzUsXG5cdDIzOCxcblx0MjQ0LFxuXHQyNDgsXG5cdDI1MSxcblx0MjUzLFxuXHQyNTgsXG5cdDI3Nixcblx0Mjg0LFxuXHQzMDAsXG5cdDMyNSxcblx0MzI5LFxuXHQzMzQsXG5cdDM2NCxcblx0NDYzLFxuXHQ0NjUsXG5cdDQ2Nyxcblx0NDY5LFxuXHQ0NzEsXG5cdDQ3Myxcblx0NDc1LFxuXHQ0NzcsXG5cdDUwNixcblx0NTk0LFxuXHQ2MTAsXG5cdDcxMixcblx0NzE2LFxuXHQ3MzAsXG5cdDkzMCxcblx0OTM4LFxuXHQ5NjIsXG5cdDk3MCxcblx0MTAyNixcblx0MTEwNCxcblx0MTEwNixcblx0ODIwOSxcblx0ODIxNSxcblx0ODIxOCxcblx0ODIyMixcblx0ODIzMSxcblx0ODI0MSxcblx0ODI0NCxcblx0ODI0Nixcblx0ODI1Mixcblx0ODM2NSxcblx0ODQ1Mixcblx0ODQ1NCxcblx0ODQ1OCxcblx0ODQ3MSxcblx0ODQ4Mixcblx0ODU1Nixcblx0ODU3MCxcblx0ODU5Nixcblx0ODYwMixcblx0ODcxMyxcblx0ODcyMCxcblx0ODcyMixcblx0ODcyNixcblx0ODczMSxcblx0ODczNyxcblx0ODc0MCxcblx0ODc0Mixcblx0ODc0OCxcblx0ODc1MSxcblx0ODc2MCxcblx0ODc2Nixcblx0ODc3Nyxcblx0ODc4MSxcblx0ODc4Nyxcblx0ODgwMixcblx0ODgwOCxcblx0ODgxNixcblx0ODg1NCxcblx0ODg1OCxcblx0ODg3MCxcblx0ODg5Nixcblx0ODk3OSxcblx0OTMyMixcblx0OTM3Mixcblx0OTU0OCxcblx0OTU4OCxcblx0OTYxNixcblx0OTYyMixcblx0OTYzNCxcblx0OTY1Mixcblx0OTY2Mixcblx0OTY3Mixcblx0OTY3Nixcblx0OTY4MCxcblx0OTcwMixcblx0OTczNSxcblx0OTczOCxcblx0OTc5Myxcblx0OTc5NSxcblx0MTE5MDYsXG5cdDExOTA5LFxuXHQxMTkxMyxcblx0MTE5MTcsXG5cdDExOTI4LFxuXHQxMTk0NCxcblx0MTE5NDcsXG5cdDExOTUxLFxuXHQxMTk1Nixcblx0MTE5NjAsXG5cdDExOTY0LFxuXHQxMTk3OSxcblx0MTIyODQsXG5cdDEyMjkyLFxuXHQxMjMxMixcblx0MTIzMTksXG5cdDEyMzMwLFxuXHQxMjM1MSxcblx0MTI0MzYsXG5cdDEyNDQ3LFxuXHQxMjUzNSxcblx0MTI1NDMsXG5cdDEyNTg2LFxuXHQxMjg0Mixcblx0MTI4NTAsXG5cdDEyOTY0LFxuXHQxMzIwMCxcblx0MTMyMTUsXG5cdDEzMjE4LFxuXHQxMzI1Myxcblx0MTMyNjMsXG5cdDEzMjY3LFxuXHQxMzI3MCxcblx0MTMzODQsXG5cdDEzNDI4LFxuXHQxMzcyNyxcblx0MTM4MzksXG5cdDEzODUxLFxuXHQxNDYxNyxcblx0MTQ3MDMsXG5cdDE0ODAxLFxuXHQxNDgxNixcblx0MTQ5NjQsXG5cdDE1MTgzLFxuXHQxNTQ3MSxcblx0MTU1ODUsXG5cdDE2NDcxLFxuXHQxNjczNixcblx0MTcyMDgsXG5cdDE3MzI1LFxuXHQxNzMzMCxcblx0MTczNzQsXG5cdDE3NjIzLFxuXHQxNzk5Nyxcblx0MTgwMTgsXG5cdDE4MjEyLFxuXHQxODIxOCxcblx0MTgzMDEsXG5cdDE4MzE4LFxuXHQxODc2MCxcblx0MTg4MTEsXG5cdDE4ODE0LFxuXHQxODgyMCxcblx0MTg4MjMsXG5cdDE4ODQ0LFxuXHQxODg0OCxcblx0MTg4NzIsXG5cdDE5NTc2LFxuXHQxOTYyMCxcblx0MTk3MzgsXG5cdDE5ODg3LFxuXHQ0MDg3MCxcblx0NTkyNDQsXG5cdDU5MzM2LFxuXHQ1OTM2Nyxcblx0NTk0MTMsXG5cdDU5NDE3LFxuXHQ1OTQyMyxcblx0NTk0MzEsXG5cdDU5NDM3LFxuXHQ1OTQ0Myxcblx0NTk0NTIsXG5cdDU5NDYwLFxuXHQ1OTQ3OCxcblx0NTk0OTMsXG5cdDYzNzg5LFxuXHQ2Mzg2Nixcblx0NjM4OTQsXG5cdDYzOTc2LFxuXHQ2Mzk4Nixcblx0NjQwMTYsXG5cdDY0MDE4LFxuXHQ2NDAyMSxcblx0NjQwMjUsXG5cdDY0MDM0LFxuXHQ2NDAzNyxcblx0NjQwNDIsXG5cdDY1MDc0LFxuXHQ2NTA5Myxcblx0NjUxMDcsXG5cdDY1MTEyLFxuXHQ2NTEyNyxcblx0NjUxMzIsXG5cdDY1Mzc1LFxuXHQ2NTUxMCxcblx0NjU1MzZcbl07XG52YXIgZ2JDaGFycyA9IFtcblx0MCxcblx0MzYsXG5cdDM4LFxuXHQ0NSxcblx0NTAsXG5cdDgxLFxuXHQ4OSxcblx0OTUsXG5cdDk2LFxuXHQxMDAsXG5cdDEwMyxcblx0MTA0LFxuXHQxMDUsXG5cdDEwOSxcblx0MTI2LFxuXHQxMzMsXG5cdDE0OCxcblx0MTcyLFxuXHQxNzUsXG5cdDE3OSxcblx0MjA4LFxuXHQzMDYsXG5cdDMwNyxcblx0MzA4LFxuXHQzMDksXG5cdDMxMCxcblx0MzExLFxuXHQzMTIsXG5cdDMxMyxcblx0MzQxLFxuXHQ0MjgsXG5cdDQ0Myxcblx0NTQ0LFxuXHQ1NDUsXG5cdDU1OCxcblx0NzQxLFxuXHQ3NDIsXG5cdDc0OSxcblx0NzUwLFxuXHQ4MDUsXG5cdDgxOSxcblx0ODIwLFxuXHQ3OTIyLFxuXHQ3OTI0LFxuXHQ3OTI1LFxuXHQ3OTI3LFxuXHQ3OTM0LFxuXHQ3OTQzLFxuXHQ3OTQ0LFxuXHQ3OTQ1LFxuXHQ3OTUwLFxuXHQ4MDYyLFxuXHQ4MTQ4LFxuXHQ4MTQ5LFxuXHQ4MTUyLFxuXHQ4MTY0LFxuXHQ4MTc0LFxuXHQ4MjM2LFxuXHQ4MjQwLFxuXHQ4MjYyLFxuXHQ4MjY0LFxuXHQ4Mzc0LFxuXHQ4MzgwLFxuXHQ4MzgxLFxuXHQ4Mzg0LFxuXHQ4Mzg4LFxuXHQ4MzkwLFxuXHQ4MzkyLFxuXHQ4MzkzLFxuXHQ4Mzk0LFxuXHQ4Mzk2LFxuXHQ4NDAxLFxuXHQ4NDA2LFxuXHQ4NDE2LFxuXHQ4NDE5LFxuXHQ4NDI0LFxuXHQ4NDM3LFxuXHQ4NDM5LFxuXHQ4NDQ1LFxuXHQ4NDgyLFxuXHQ4NDg1LFxuXHQ4NDk2LFxuXHQ4NTIxLFxuXHQ4NjAzLFxuXHQ4OTM2LFxuXHQ4OTQ2LFxuXHQ5MDQ2LFxuXHQ5MDUwLFxuXHQ5MDYzLFxuXHQ5MDY2LFxuXHQ5MDc2LFxuXHQ5MDkyLFxuXHQ5MTAwLFxuXHQ5MTA4LFxuXHQ5MTExLFxuXHQ5MTEzLFxuXHQ5MTMxLFxuXHQ5MTYyLFxuXHQ5MTY0LFxuXHQ5MjE4LFxuXHQ5MjE5LFxuXHQxMTMyOSxcblx0MTEzMzEsXG5cdDExMzM0LFxuXHQxMTMzNixcblx0MTEzNDYsXG5cdDExMzYxLFxuXHQxMTM2Myxcblx0MTEzNjYsXG5cdDExMzcwLFxuXHQxMTM3Mixcblx0MTEzNzUsXG5cdDExMzg5LFxuXHQxMTY4Mixcblx0MTE2ODYsXG5cdDExNjg3LFxuXHQxMTY5Mixcblx0MTE2OTQsXG5cdDExNzE0LFxuXHQxMTcxNixcblx0MTE3MjMsXG5cdDExNzI1LFxuXHQxMTczMCxcblx0MTE3MzYsXG5cdDExOTgyLFxuXHQxMTk4OSxcblx0MTIxMDIsXG5cdDEyMzM2LFxuXHQxMjM0OCxcblx0MTIzNTAsXG5cdDEyMzg0LFxuXHQxMjM5Myxcblx0MTIzOTUsXG5cdDEyMzk3LFxuXHQxMjUxMCxcblx0MTI1NTMsXG5cdDEyODUxLFxuXHQxMjk2Mixcblx0MTI5NzMsXG5cdDEzNzM4LFxuXHQxMzgyMyxcblx0MTM5MTksXG5cdDEzOTMzLFxuXHQxNDA4MCxcblx0MTQyOTgsXG5cdDE0NTg1LFxuXHQxNDY5OCxcblx0MTU1ODMsXG5cdDE1ODQ3LFxuXHQxNjMxOCxcblx0MTY0MzQsXG5cdDE2NDM4LFxuXHQxNjQ4MSxcblx0MTY3MjksXG5cdDE3MTAyLFxuXHQxNzEyMixcblx0MTczMTUsXG5cdDE3MzIwLFxuXHQxNzQwMixcblx0MTc0MTgsXG5cdDE3ODU5LFxuXHQxNzkwOSxcblx0MTc5MTEsXG5cdDE3OTE1LFxuXHQxNzkxNixcblx0MTc5MzYsXG5cdDE3OTM5LFxuXHQxNzk2MSxcblx0MTg2NjQsXG5cdDE4NzAzLFxuXHQxODgxNCxcblx0MTg5NjIsXG5cdDE5MDQzLFxuXHQzMzQ2OSxcblx0MzM0NzAsXG5cdDMzNDcxLFxuXHQzMzQ4NCxcblx0MzM0ODUsXG5cdDMzNDkwLFxuXHQzMzQ5Nyxcblx0MzM1MDEsXG5cdDMzNTA1LFxuXHQzMzUxMyxcblx0MzM1MjAsXG5cdDMzNTM2LFxuXHQzMzU1MCxcblx0Mzc4NDUsXG5cdDM3OTIxLFxuXHQzNzk0OCxcblx0MzgwMjksXG5cdDM4MDM4LFxuXHQzODA2NCxcblx0MzgwNjUsXG5cdDM4MDY2LFxuXHQzODA2OSxcblx0MzgwNzUsXG5cdDM4MDc2LFxuXHQzODA3OCxcblx0MzkxMDgsXG5cdDM5MTA5LFxuXHQzOTExMyxcblx0MzkxMTQsXG5cdDM5MTE1LFxuXHQzOTExNixcblx0MzkyNjUsXG5cdDM5Mzk0LFxuXHQxODkwMDBcbl07XG52YXIgZ2IxODAzMFJhbmdlcyA9IHtcblx0dUNoYXJzOiB1Q2hhcnMsXG5cdGdiQ2hhcnM6IGdiQ2hhcnNcbn07XG5cbnZhciBnYjE4MDMwUmFuZ2VzJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0dUNoYXJzOiB1Q2hhcnMsXG5cdGdiQ2hhcnM6IGdiQ2hhcnMsXG5cdCdkZWZhdWx0JzogZ2IxODAzMFJhbmdlc1xufSk7XG5cbnZhciBjcDk0OSA9IFtcblx0W1xuXHRcdFwiMFwiLFxuXHRcdFwiXFx1MDAwMFwiLFxuXHRcdDEyN1xuXHRdLFxuXHRbXG5cdFx0XCI4MTQxXCIsXG5cdFx0XCLqsILqsIPqsIXqsIbqsItcIixcblx0XHQ0LFxuXHRcdFwi6rCY6rCe6rCf6rCh6rCi6rCj6rClXCIsXG5cdFx0Nixcblx0XHRcIuqwruqwsuqws+qwtFwiXG5cdF0sXG5cdFtcblx0XHRcIjgxNjFcIixcblx0XHRcIuqwteqwtuqwt+qwuuqwu+qwveqwvuqwv+qxgVwiLFxuXHRcdDksXG5cdFx0XCLqsYzqsY5cIixcblx0XHQ1LFxuXHRcdFwi6rGVXCJcblx0XSxcblx0W1xuXHRcdFwiODE4MVwiLFxuXHRcdFwi6rGW6rGX6rGZ6rGa6rGb6rGdXCIsXG5cdFx0MTgsXG5cdFx0XCLqsbLqsbPqsbXqsbbqsbnqsbtcIixcblx0XHQ0LFxuXHRcdFwi6rKC6rKH6rKI6rKN6rKO6rKP6rKR6rKS6rKT6rKVXCIsXG5cdFx0Nixcblx0XHRcIuqynuqyolwiLFxuXHRcdDUsXG5cdFx0XCLqsqvqsq3qsq7qsrFcIixcblx0XHQ2LFxuXHRcdFwi6rK66rK+6rK/6rOA6rOC6rOD6rOF6rOG6rOH6rOJ6rOK6rOL6rONXCIsXG5cdFx0Nyxcblx0XHRcIuqzluqzmFwiLFxuXHRcdDcsXG5cdFx0XCLqs6Lqs6Pqs6Xqs6bqs6nqs6vqs63qs67qs7Lqs7Tqs7dcIixcblx0XHQ0LFxuXHRcdFwi6rO+6rO/6rSB6rSC6rSD6rSF6rSHXCIsXG5cdFx0NCxcblx0XHRcIuq0juq0kOq0kuq0k1wiXG5cdF0sXG5cdFtcblx0XHRcIjgyNDFcIixcblx0XHRcIuq0lOq0leq0luq0l+q0meq0muq0m+q0neq0nuq0n+q0oVwiLFxuXHRcdDcsXG5cdFx0XCLqtKrqtKvqtK5cIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjgyNjFcIixcblx0XHRcIuq0tuq0t+q0ueq0uuq0u+q0vVwiLFxuXHRcdDYsXG5cdFx0XCLqtYbqtYjqtYpcIixcblx0XHQ1LFxuXHRcdFwi6rWR6rWS6rWT6rWV6rWW6rWXXCJcblx0XSxcblx0W1xuXHRcdFwiODI4MVwiLFxuXHRcdFwi6rWZXCIsXG5cdFx0Nyxcblx0XHRcIuq1ouq1pFwiLFxuXHRcdDcsXG5cdFx0XCLqta7qta/qtbHqtbLqtbfqtbjqtbnqtbrqtb7qtoDqtoNcIixcblx0XHQ0LFxuXHRcdFwi6raK6raL6raN6raO6raP6raRXCIsXG5cdFx0MTAsXG5cdFx0XCLqtp5cIixcblx0XHQ1LFxuXHRcdFwi6ralXCIsXG5cdFx0MTcsXG5cdFx0XCLqtrhcIixcblx0XHQ3LFxuXHRcdFwi6reC6reD6reF6reG6reH6reJXCIsXG5cdFx0Nixcblx0XHRcIuq3kuq3lFwiLFxuXHRcdDcsXG5cdFx0XCLqt53qt57qt5/qt6Hqt6Lqt6Pqt6VcIixcblx0XHQxOFxuXHRdLFxuXHRbXG5cdFx0XCI4MzQxXCIsXG5cdFx0XCLqt7rqt7vqt73qt77quIJcIixcblx0XHQ1LFxuXHRcdFwi6riK6riM6riOXCIsXG5cdFx0NSxcblx0XHRcIuq4lVwiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiODM2MVwiLFxuXHRcdFwi6ridXCIsXG5cdFx0MTgsXG5cdFx0XCLquLLquLPquLXquLbquLnquLvquLxcIlxuXHRdLFxuXHRbXG5cdFx0XCI4MzgxXCIsXG5cdFx0XCLquL3quL7quL/quYLquYTquYfquYjquYnquYvquY/quZHquZLquZPquZXquZdcIixcblx0XHQ0LFxuXHRcdFwi6rme6rmi6rmj6rmk6rmm6rmn6rmq6rmr6rmt6rmu6rmv6rmxXCIsXG5cdFx0Nixcblx0XHRcIuq5uuq5vlwiLFxuXHRcdDUsXG5cdFx0XCLquoZcIixcblx0XHQ1LFxuXHRcdFwi6rqNXCIsXG5cdFx0NDYsXG5cdFx0XCLqur/qu4Hqu4Lqu4Pqu4VcIixcblx0XHQ2LFxuXHRcdFwi6ruO6ruSXCIsXG5cdFx0NSxcblx0XHRcIuq7muq7m+q7nVwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiODQ0MVwiLFxuXHRcdFwi6rum6run6rup6ruq6rus6ruuXCIsXG5cdFx0NSxcblx0XHRcIuq7teq7tuq7t+q7ueq7uuq7u+q7vVwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiODQ2MVwiLFxuXHRcdFwi6ryG6ryJ6ryK6ryL6ryM6ryO6ryP6ryRXCIsXG5cdFx0MThcblx0XSxcblx0W1xuXHRcdFwiODQ4MVwiLFxuXHRcdFwi6rykXCIsXG5cdFx0Nyxcblx0XHRcIuq8ruq8r+q8seq8s+q8tVwiLFxuXHRcdDYsXG5cdFx0XCLqvL7qvYDqvYTqvYXqvYbqvYfqvYpcIixcblx0XHQ1LFxuXHRcdFwi6r2RXCIsXG5cdFx0MTAsXG5cdFx0XCLqvZ5cIixcblx0XHQ1LFxuXHRcdFwi6r2mXCIsXG5cdFx0MTgsXG5cdFx0XCLqvbpcIixcblx0XHQ1LFxuXHRcdFwi6r6B6r6C6r6D6r6F6r6G6r6H6r6JXCIsXG5cdFx0Nixcblx0XHRcIuq+kuq+k+q+lOq+llwiLFxuXHRcdDUsXG5cdFx0XCLqvp1cIixcblx0XHQyNixcblx0XHRcIuq+uuq+u+q+veq+vlwiXG5cdF0sXG5cdFtcblx0XHRcIjg1NDFcIixcblx0XHRcIuq+v+q/gVwiLFxuXHRcdDUsXG5cdFx0XCLqv4rqv4zqv49cIixcblx0XHQ0LFxuXHRcdFwi6r+VXCIsXG5cdFx0Nixcblx0XHRcIuq/nVwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiODU2MVwiLFxuXHRcdFwi6r+iXCIsXG5cdFx0NSxcblx0XHRcIuq/qlwiLFxuXHRcdDUsXG5cdFx0XCLqv7Lqv7Pqv7Xqv7bqv7fqv7lcIixcblx0XHQ2LFxuXHRcdFwi64CC64CDXCJcblx0XSxcblx0W1xuXHRcdFwiODU4MVwiLFxuXHRcdFwi64CFXCIsXG5cdFx0Nixcblx0XHRcIuuAjeuAjuuAj+uAkeuAkuuAk+uAlVwiLFxuXHRcdDYsXG5cdFx0XCLrgJ5cIixcblx0XHQ5LFxuXHRcdFwi64CpXCIsXG5cdFx0MjYsXG5cdFx0XCLrgYbrgYfrgYnrgYvrgY3rgY/rgZDrgZHrgZLrgZbrgZjrgZrrgZvrgZzrgZ5cIixcblx0XHQyOSxcblx0XHRcIuuBvuuBv+uCgeuCguuCg+uChVwiLFxuXHRcdDYsXG5cdFx0XCLrgo7rgpDrgpJcIixcblx0XHQ1LFxuXHRcdFwi64Kb64Kd64Ke64Kj64KkXCJcblx0XSxcblx0W1xuXHRcdFwiODY0MVwiLFxuXHRcdFwi64Kl64Km64Kn64Kq64Kw64Ky64K264K364K564K664K764K9XCIsXG5cdFx0Nixcblx0XHRcIuuDhuuDilwiLFxuXHRcdDUsXG5cdFx0XCLrg5JcIlxuXHRdLFxuXHRbXG5cdFx0XCI4NjYxXCIsXG5cdFx0XCLrg5Prg5Xrg5brg5frg5lcIixcblx0XHQ2LFxuXHRcdFwi64Oh64Oi64Oj64Ok64OmXCIsXG5cdFx0MTBcblx0XSxcblx0W1xuXHRcdFwiODY4MVwiLFxuXHRcdFwi64OxXCIsXG5cdFx0MjIsXG5cdFx0XCLrhIrrhI3rhI7rhI/rhJHrhJTrhJXrhJbrhJfrhJrrhJ5cIixcblx0XHQ0LFxuXHRcdFwi64Sm64Sn64Sp64Sq64Sr64StXCIsXG5cdFx0Nixcblx0XHRcIuuEtuuEulwiLFxuXHRcdDUsXG5cdFx0XCLrhYLrhYPrhYXrhYbrhYfrhYlcIixcblx0XHQ2LFxuXHRcdFwi64WS64WT64WW64WX64WZ64Wa64Wb64Wd64We64Wf64WhXCIsXG5cdFx0MjIsXG5cdFx0XCLrhbrrhbvrhb3rhb7rhb/rhoHrhoNcIixcblx0XHQ0LFxuXHRcdFwi64aK64aM64aO64aP64aQ64aR64aV64aW64aX64aZ64aa64ab64adXCJcblx0XSxcblx0W1xuXHRcdFwiODc0MVwiLFxuXHRcdFwi64aeXCIsXG5cdFx0OSxcblx0XHRcIuuGqVwiLFxuXHRcdDE1XG5cdF0sXG5cdFtcblx0XHRcIjg3NjFcIixcblx0XHRcIuuGuVwiLFxuXHRcdDE4LFxuXHRcdFwi64eN64eO64eP64eR64eS64eT64eVXCJcblx0XSxcblx0W1xuXHRcdFwiODc4MVwiLFxuXHRcdFwi64eWXCIsXG5cdFx0NSxcblx0XHRcIuuHnuuHoFwiLFxuXHRcdDcsXG5cdFx0XCLrh6rrh6vrh63rh67rh6/rh7FcIixcblx0XHQ3LFxuXHRcdFwi64e664e864e+XCIsXG5cdFx0NSxcblx0XHRcIuuIhuuIh+uIieuIiuuIjVwiLFxuXHRcdDYsXG5cdFx0XCLriJbriJjriJpcIixcblx0XHQ1LFxuXHRcdFwi64ihXCIsXG5cdFx0MTgsXG5cdFx0XCLriLVcIixcblx0XHQ2LFxuXHRcdFwi64i9XCIsXG5cdFx0MjYsXG5cdFx0XCLriZnriZrriZvriZ3riZ7riZ/riaFcIixcblx0XHQ2LFxuXHRcdFwi64mqXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCI4ODQxXCIsXG5cdFx0XCLria9cIixcblx0XHQ0LFxuXHRcdFwi64m2XCIsXG5cdFx0NSxcblx0XHRcIuuJvVwiLFxuXHRcdDYsXG5cdFx0XCLriobriofriojriopcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcIjg4NjFcIixcblx0XHRcIuuKj+uKkuuKk+uKleuKluuKl+uKm1wiLFxuXHRcdDQsXG5cdFx0XCLriqLriqTriqfriqjriqnriqvriq3riq7riq/rirHrirLrirPrirXrirbrirdcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ODgxXCIsXG5cdFx0XCLrirhcIixcblx0XHQxNSxcblx0XHRcIuuLiuuLi+uLjeuLjuuLj+uLkeuLk1wiLFxuXHRcdDQsXG5cdFx0XCLri5rri5zri57ri5/ri6Dri6Hri6Pri6fri6nri6rri7Dri7Hri7Lri7bri7zri73ri77rjILrjIPrjIXrjIbrjIfrjIlcIixcblx0XHQ2LFxuXHRcdFwi64yS64yWXCIsXG5cdFx0NSxcblx0XHRcIuuMnVwiLFxuXHRcdDU0LFxuXHRcdFwi642X642Z642a642d642g642h642i642jXCJcblx0XSxcblx0W1xuXHRcdFwiODk0MVwiLFxuXHRcdFwi642m642o642q642s642t642v642y642z6421642264236425XCIsXG5cdFx0Nixcblx0XHRcIuuOguuOhlwiLFxuXHRcdDUsXG5cdFx0XCLrjo1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4OTYxXCIsXG5cdFx0XCLrjo7rjo/rjpHrjpLrjpPrjpVcIixcblx0XHQxMCxcblx0XHRcIuuOolwiLFxuXHRcdDUsXG5cdFx0XCLrjqnrjqrrjqvrjq1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4OTgxXCIsXG5cdFx0XCLrjq5cIixcblx0XHQyMSxcblx0XHRcIuuPhuuPh+uPieuPiuuPjeuPj+uPkeuPkuuPk+uPluuPmOuPmuuPnOuPnuuPn+uPoeuPouuPo+uPpeuPpuuPp+uPqVwiLFxuXHRcdDE4LFxuXHRcdFwi64+9XCIsXG5cdFx0MTgsXG5cdFx0XCLrkJFcIixcblx0XHQ2LFxuXHRcdFwi65CZ65Ca65Cb65Cd65Ce65Cf65ChXCIsXG5cdFx0Nixcblx0XHRcIuuQquuQrFwiLFxuXHRcdDcsXG5cdFx0XCLrkLVcIixcblx0XHQxNVxuXHRdLFxuXHRbXG5cdFx0XCI4YTQxXCIsXG5cdFx0XCLrkYVcIixcblx0XHQxMCxcblx0XHRcIuuRkuuRk+uRleuRluuRl+uRmVwiLFxuXHRcdDYsXG5cdFx0XCLrkaLrkaTrkaZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YTYxXCIsXG5cdFx0XCLrkadcIixcblx0XHQ0LFxuXHRcdFwi65GtXCIsXG5cdFx0MTgsXG5cdFx0XCLrkoHrkoJcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YTgxXCIsXG5cdFx0XCLrkoNcIixcblx0XHQ0LFxuXHRcdFwi65KJXCIsXG5cdFx0MTksXG5cdFx0XCLrkp5cIixcblx0XHQ1LFxuXHRcdFwi65Kl65Km65Kn65Kp65Kq65Kr65KtXCIsXG5cdFx0Nyxcblx0XHRcIuuStuuSuOuSulwiLFxuXHRcdDUsXG5cdFx0XCLrk4Hrk4Lrk4Prk4Xrk4brk4frk4lcIixcblx0XHQ2LFxuXHRcdFwi65OR65OS65OT65OU65OWXCIsXG5cdFx0NSxcblx0XHRcIuuTnuuTn+uToeuTouuTpeuTp1wiLFxuXHRcdDQsXG5cdFx0XCLrk67rk7Drk7JcIixcblx0XHQ1LFxuXHRcdFwi65O5XCIsXG5cdFx0MjYsXG5cdFx0XCLrlJbrlJfrlJnrlJrrlJ1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4YjQxXCIsXG5cdFx0XCLrlJ5cIixcblx0XHQ1LFxuXHRcdFwi65Sm65SrXCIsXG5cdFx0NCxcblx0XHRcIuuUsuuUs+uUteuUtuuUt+uUuVwiLFxuXHRcdDYsXG5cdFx0XCLrlYLrlYZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YjYxXCIsXG5cdFx0XCLrlYfrlYjrlYnrlYrrlY7rlY/rlZHrlZLrlZPrlZVcIixcblx0XHQ2LFxuXHRcdFwi65We65WiXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI4YjgxXCIsXG5cdFx0XCLrlatcIixcblx0XHQ1Mixcblx0XHRcIuuWouuWo+uWpeuWpuuWp+uWqeuWrOuWreuWruuWr+uWsuuWtlwiLFxuXHRcdDQsXG5cdFx0XCLrlr7rlr/rl4Hrl4Lrl4Prl4VcIixcblx0XHQ2LFxuXHRcdFwi65eO65eSXCIsXG5cdFx0NSxcblx0XHRcIuuXmVwiLFxuXHRcdDE4LFxuXHRcdFwi65etXCIsXG5cdFx0MThcblx0XSxcblx0W1xuXHRcdFwiOGM0MVwiLFxuXHRcdFwi65iAXCIsXG5cdFx0MTUsXG5cdFx0XCLrmJLrmJPrmJXrmJbrmJfrmJlcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcIjhjNjFcIixcblx0XHRcIuuYnlwiLFxuXHRcdDYsXG5cdFx0XCLrmKZcIixcblx0XHQ1LFxuXHRcdFwi65itXCIsXG5cdFx0Nixcblx0XHRcIuuYtVwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiOGM4MVwiLFxuXHRcdFwi65i7XCIsXG5cdFx0MTIsXG5cdFx0XCLrmYlcIixcblx0XHQyNixcblx0XHRcIuuZpeuZpuuZp+uZqVwiLFxuXHRcdDUwLFxuXHRcdFwi65qe65qf65qh65qi65qj65qlXCIsXG5cdFx0NSxcblx0XHRcIuuareuaruuar+uasOuaslwiLFxuXHRcdDE2XG5cdF0sXG5cdFtcblx0XHRcIjhkNDFcIixcblx0XHRcIuubg1wiLFxuXHRcdDE2LFxuXHRcdFwi65uVXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI4ZDYxXCIsXG5cdFx0XCLrm55cIixcblx0XHQxNyxcblx0XHRcIuubseubsuubs+ubteubtuubt+ubueubulwiXG5cdF0sXG5cdFtcblx0XHRcIjhkODFcIixcblx0XHRcIuubu1wiLFxuXHRcdDQsXG5cdFx0XCLrnILrnIPrnITrnIZcIixcblx0XHQzMyxcblx0XHRcIuucquucq+ucreucruucsVwiLFxuXHRcdDYsXG5cdFx0XCLrnLrrnLxcIixcblx0XHQ3LFxuXHRcdFwi652F652G652H652J652K652L652NXCIsXG5cdFx0Nixcblx0XHRcIuudllwiLFxuXHRcdDksXG5cdFx0XCLrnaHrnaLrnaPrnaXrnabrnafrnalcIixcblx0XHQ2LFxuXHRcdFwi652y65206522XCIsXG5cdFx0NSxcblx0XHRcIuudvuudv+uegeueguueg+uehVwiLFxuXHRcdDYsXG5cdFx0XCLrno7rnpPrnpTrnpXrnprrnpvrnp3rnp5cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZTQxXCIsXG5cdFx0XCLrnp/rnqFcIixcblx0XHQ2LFxuXHRcdFwi656q656uXCIsXG5cdFx0NSxcblx0XHRcIuuetuuet+ueuVwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiOGU2MVwiLFxuXHRcdFwi65+CXCIsXG5cdFx0NCxcblx0XHRcIuufiOufilwiLFxuXHRcdDE5XG5cdF0sXG5cdFtcblx0XHRcIjhlODFcIixcblx0XHRcIuufnlwiLFxuXHRcdDEzLFxuXHRcdFwi65+u65+v65+x65+y65+z65+1XCIsXG5cdFx0Nixcblx0XHRcIuufvuugglwiLFxuXHRcdDQsXG5cdFx0XCLroIrroIvroI3roI7roI/roJFcIixcblx0XHQ2LFxuXHRcdFwi66Ca66Cc66CeXCIsXG5cdFx0NSxcblx0XHRcIuugpuugp+ugqeugquugq+ugrVwiLFxuXHRcdDYsXG5cdFx0XCLroLbroLpcIixcblx0XHQ1LFxuXHRcdFwi66GB66GC66GD66GFXCIsXG5cdFx0MTEsXG5cdFx0XCLroZLroZRcIixcblx0XHQ3LFxuXHRcdFwi66Ge66Gf66Gh66Gi66Gj66GlXCIsXG5cdFx0Nixcblx0XHRcIuuhruuhsOuhslwiLFxuXHRcdDUsXG5cdFx0XCLrobnrobrrobvrob1cIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcIjhmNDFcIixcblx0XHRcIuuihVwiLFxuXHRcdDcsXG5cdFx0XCLroo5cIixcblx0XHQxN1xuXHRdLFxuXHRbXG5cdFx0XCI4ZjYxXCIsXG5cdFx0XCLroqBcIixcblx0XHQ3LFxuXHRcdFwi66KpXCIsXG5cdFx0Nixcblx0XHRcIuuiseuisuuis+uiteuituuit+uiuVwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiOGY4MVwiLFxuXHRcdFwi66K+66K/66OC66OE66OGXCIsXG5cdFx0NSxcblx0XHRcIuujjeujjuujj+ujkeujkuujk+ujlVwiLFxuXHRcdDcsXG5cdFx0XCLro57ro6Dro6JcIixcblx0XHQ1LFxuXHRcdFwi66Oq66Or66Ot66Ou66Ov66OxXCIsXG5cdFx0Nixcblx0XHRcIuujuuujvOujvlwiLFxuXHRcdDUsXG5cdFx0XCLrpIVcIixcblx0XHQxOCxcblx0XHRcIuukmVwiLFxuXHRcdDYsXG5cdFx0XCLrpKFcIixcblx0XHQyNixcblx0XHRcIuukvuukv+ulgeulguulg+ulhVwiLFxuXHRcdDYsXG5cdFx0XCLrpY3rpY7rpZDrpZJcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjkwNDFcIixcblx0XHRcIuulmuulm+ulneulnuuln+uloVwiLFxuXHRcdDYsXG5cdFx0XCLrparrpazrpa5cIixcblx0XHQ1LFxuXHRcdFwi66W266W366W566W666W766W9XCJcblx0XSxcblx0W1xuXHRcdFwiOTA2MVwiLFxuXHRcdFwi66W+XCIsXG5cdFx0NSxcblx0XHRcIuumhuumiOumi+umjOumj1wiLFxuXHRcdDE1XG5cdF0sXG5cdFtcblx0XHRcIjkwODFcIixcblx0XHRcIuumn1wiLFxuXHRcdDEyLFxuXHRcdFwi66au66av66ax66ay66az66a1XCIsXG5cdFx0Nixcblx0XHRcIuumvuungOunglwiLFxuXHRcdDUsXG5cdFx0XCLrp4rrp4vrp43rp5NcIixcblx0XHQ0LFxuXHRcdFwi66ea66ec66ef66eg66ei66em66en66ep66eq66er66etXCIsXG5cdFx0Nixcblx0XHRcIuuntuunu1wiLFxuXHRcdDQsXG5cdFx0XCLrqIJcIixcblx0XHQ1LFxuXHRcdFwi66iJXCIsXG5cdFx0MTEsXG5cdFx0XCLrqJZcIixcblx0XHQzMyxcblx0XHRcIuuouuuou+uoveuovuuov+upgeupg+uphOupheuphlwiXG5cdF0sXG5cdFtcblx0XHRcIjkxNDFcIixcblx0XHRcIuuph+upiuupjOupj+upkOupkeupkuupluupl+upmeupmuupm+upnVwiLFxuXHRcdDYsXG5cdFx0XCLrqabrqapcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjkxNjFcIixcblx0XHRcIuupsuups+upteuptuupt+upuVwiLFxuXHRcdDksXG5cdFx0XCLrqobrqojrqonrqorrqovrqo1cIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcIjkxODFcIixcblx0XHRcIuuqk1wiLFxuXHRcdDIwLFxuXHRcdFwi66qq66qt66qu66qv66qx66qzXCIsXG5cdFx0NCxcblx0XHRcIuuquuuqvOuqvlwiLFxuXHRcdDUsXG5cdFx0XCLrq4Xrq4brq4frq4lcIixcblx0XHQxNCxcblx0XHRcIuurmlwiLFxuXHRcdDMzLFxuXHRcdFwi66u966u+66u/66yB66yC66yD66yFXCIsXG5cdFx0Nyxcblx0XHRcIuusjuuskOusklwiLFxuXHRcdDUsXG5cdFx0XCLrrJnrrJrrrJvrrJ3rrJ7rrJ/rrKFcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcIjkyNDFcIixcblx0XHRcIuusqOusquusrFwiLFxuXHRcdDcsXG5cdFx0XCLrrLfrrLnrrLrrrL9cIixcblx0XHQ0LFxuXHRcdFwi662G662I662K662L662M662O662R662SXCJcblx0XSxcblx0W1xuXHRcdFwiOTI2MVwiLFxuXHRcdFwi662T662V662W662X662ZXCIsXG5cdFx0Nyxcblx0XHRcIuutouutpFwiLFxuXHRcdDcsXG5cdFx0XCLrra1cIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcIjkyODFcIixcblx0XHRcIuutslwiLFxuXHRcdDIxLFxuXHRcdFwi666J666K666L666N666O666P666RXCIsXG5cdFx0MTgsXG5cdFx0XCLrrqXrrqbrrqfrrqnrrqrrrqvrrq1cIixcblx0XHQ2LFxuXHRcdFwi666166626664XCIsXG5cdFx0Nyxcblx0XHRcIuuvgeuvguuvg+uvheuvhuuvh+uviVwiLFxuXHRcdDYsXG5cdFx0XCLrr5Hrr5Lrr5RcIixcblx0XHQzNSxcblx0XHRcIuuvuuuvu+uvveuvvuuwgVwiXG5cdF0sXG5cdFtcblx0XHRcIjkzNDFcIixcblx0XHRcIuuwg1wiLFxuXHRcdDQsXG5cdFx0XCLrsIrrsI7rsJDrsJLrsJPrsJnrsJrrsKDrsKHrsKLrsKPrsKbrsKjrsKrrsKvrsKzrsK7rsK/rsLLrsLPrsLVcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MzYxXCIsXG5cdFx0XCLrsLbrsLfrsLlcIixcblx0XHQ2LFxuXHRcdFwi67GC67GG67GH67GI67GK67GL67GO67GP67GRXCIsXG5cdFx0OFxuXHRdLFxuXHRbXG5cdFx0XCI5MzgxXCIsXG5cdFx0XCLrsZrrsZvrsZzrsZ5cIixcblx0XHQzNyxcblx0XHRcIuuyhuuyh+uyieuyiuuyjeuyj1wiLFxuXHRcdDQsXG5cdFx0XCLrspbrspjrsptcIixcblx0XHQ0LFxuXHRcdFwi67Ki67Kj67Kl67Km67KpXCIsXG5cdFx0Nixcblx0XHRcIuuysuuytlwiLFxuXHRcdDUsXG5cdFx0XCLrsr7rsr/rs4Hrs4Lrs4Prs4VcIixcblx0XHQ3LFxuXHRcdFwi67OO67OS67OT67OU67OW67OX67OZ67Oa67Ob67OdXCIsXG5cdFx0MjIsXG5cdFx0XCLrs7frs7nrs7rrs7vrs71cIlxuXHRdLFxuXHRbXG5cdFx0XCI5NDQxXCIsXG5cdFx0XCLrs75cIixcblx0XHQ1LFxuXHRcdFwi67SG67SI67SKXCIsXG5cdFx0NSxcblx0XHRcIuu0keu0kuu0k+u0lVwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiOTQ2MVwiLFxuXHRcdFwi67SeXCIsXG5cdFx0NSxcblx0XHRcIuu0pVwiLFxuXHRcdDYsXG5cdFx0XCLrtK1cIixcblx0XHQxMlxuXHRdLFxuXHRbXG5cdFx0XCI5NDgxXCIsXG5cdFx0XCLrtLpcIixcblx0XHQ1LFxuXHRcdFwi67WBXCIsXG5cdFx0Nixcblx0XHRcIuu1iuu1i+u1jeu1juu1j+u1kVwiLFxuXHRcdDYsXG5cdFx0XCLrtZpcIixcblx0XHQ5LFxuXHRcdFwi67Wl67Wm67Wn67WpXCIsXG5cdFx0MjIsXG5cdFx0XCLrtoLrtoPrtoXrtobrtotcIixcblx0XHQ0LFxuXHRcdFwi67aS67aU67aW67aX67aY67ab67adXCIsXG5cdFx0Nixcblx0XHRcIuu2pVwiLFxuXHRcdDEwLFxuXHRcdFwi67axXCIsXG5cdFx0Nixcblx0XHRcIuu2uVwiLFxuXHRcdDI0XG5cdF0sXG5cdFtcblx0XHRcIjk1NDFcIixcblx0XHRcIuu3kuu3k+u3luu3l+u3meu3muu3m+u3nVwiLFxuXHRcdDExLFxuXHRcdFwi67eqXCIsXG5cdFx0NSxcblx0XHRcIuu3sVwiXG5cdF0sXG5cdFtcblx0XHRcIjk1NjFcIixcblx0XHRcIuu3suu3s+u3teu3tuu3t+u3uVwiLFxuXHRcdDYsXG5cdFx0XCLruIHruILruITruIZcIixcblx0XHQ1LFxuXHRcdFwi67iO67iP67iR67iS67iTXCJcblx0XSxcblx0W1xuXHRcdFwiOTU4MVwiLFxuXHRcdFwi67iVXCIsXG5cdFx0Nixcblx0XHRcIuu4nuu4oFwiLFxuXHRcdDM1LFxuXHRcdFwi67mG67mH67mJ67mK67mL67mN67mPXCIsXG5cdFx0NCxcblx0XHRcIuu5luu5mOu5nOu5neu5nuu5n+u5ouu5o+u5peu5puu5p+u5qeu5q1wiLFxuXHRcdDQsXG5cdFx0XCLrubLrubZcIixcblx0XHQ0LFxuXHRcdFwi67m+67m/67qB67qC67qD67qFXCIsXG5cdFx0Nixcblx0XHRcIuu6juu6klwiLFxuXHRcdDUsXG5cdFx0XCLruppcIixcblx0XHQxMyxcblx0XHRcIuu6qVwiLFxuXHRcdDE0XG5cdF0sXG5cdFtcblx0XHRcIjk2NDFcIixcblx0XHRcIuu6uFwiLFxuXHRcdDIzLFxuXHRcdFwi67uS67uTXCJcblx0XSxcblx0W1xuXHRcdFwiOTY2MVwiLFxuXHRcdFwi67uV67uW67uZXCIsXG5cdFx0Nixcblx0XHRcIuu7oeu7ouu7plwiLFxuXHRcdDUsXG5cdFx0XCLru61cIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjk2ODFcIixcblx0XHRcIuu7tlwiLFxuXHRcdDEwLFxuXHRcdFwi67yCXCIsXG5cdFx0NSxcblx0XHRcIuu8ilwiLFxuXHRcdDEzLFxuXHRcdFwi67ya67yeXCIsXG5cdFx0MzMsXG5cdFx0XCLrvYLrvYPrvYXrvYbrvYfrvYlcIixcblx0XHQ2LFxuXHRcdFwi672S672T672U672WXCIsXG5cdFx0NDRcblx0XSxcblx0W1xuXHRcdFwiOTc0MVwiLFxuXHRcdFwi676DXCIsXG5cdFx0MTYsXG5cdFx0XCLrvpVcIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjk3NjFcIixcblx0XHRcIuu+nlwiLFxuXHRcdDE3LFxuXHRcdFwi676xXCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCI5NzgxXCIsXG5cdFx0XCLrvrlcIixcblx0XHQxMSxcblx0XHRcIuu/hlwiLFxuXHRcdDUsXG5cdFx0XCLrv47rv4/rv5Hrv5Lrv5Prv5VcIixcblx0XHQ2LFxuXHRcdFwi67+d67+e67+g67+iXCIsXG5cdFx0ODksXG5cdFx0XCLsgL3sgL7sgL9cIlxuXHRdLFxuXHRbXG5cdFx0XCI5ODQxXCIsXG5cdFx0XCLsgYBcIixcblx0XHQxNixcblx0XHRcIuyBklwiLFxuXHRcdDUsXG5cdFx0XCLsgZnsgZrsgZtcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ODYxXCIsXG5cdFx0XCLsgZ3sgZ7sgZ/sgaFcIixcblx0XHQ2LFxuXHRcdFwi7IGqXCIsXG5cdFx0MTVcblx0XSxcblx0W1xuXHRcdFwiOTg4MVwiLFxuXHRcdFwi7IG6XCIsXG5cdFx0MjEsXG5cdFx0XCLsgpLsgpPsgpXsgpbsgpfsgplcIixcblx0XHQ2LFxuXHRcdFwi7IKi7IKk7IKmXCIsXG5cdFx0NSxcblx0XHRcIuyCruyCseyCsuyCt1wiLFxuXHRcdDQsXG5cdFx0XCLsgr7sg4Lsg4Psg4Tsg4bsg4fsg4rsg4vsg43sg47sg4/sg5FcIixcblx0XHQ2LFxuXHRcdFwi7IOa7IOeXCIsXG5cdFx0NSxcblx0XHRcIuyDpuyDp+yDqeyDquyDq+yDrVwiLFxuXHRcdDYsXG5cdFx0XCLsg7bsg7jsg7pcIixcblx0XHQ1LFxuXHRcdFwi7ISB7ISC7ISD7ISF7ISG7ISH7ISJXCIsXG5cdFx0Nixcblx0XHRcIuyEkeyEkuyEk+yElOyEllwiLFxuXHRcdDUsXG5cdFx0XCLshKHshKLshKXshKjshKnshKrshKvshK5cIlxuXHRdLFxuXHRbXG5cdFx0XCI5OTQxXCIsXG5cdFx0XCLshLLshLPshLTshLXshLfshLrshLvshL3shL7shL/shYFcIixcblx0XHQ2LFxuXHRcdFwi7IWK7IWOXCIsXG5cdFx0NSxcblx0XHRcIuyFluyFl1wiXG5cdF0sXG5cdFtcblx0XHRcIjk5NjFcIixcblx0XHRcIuyFmeyFmuyFm+yFnVwiLFxuXHRcdDYsXG5cdFx0XCLshabshapcIixcblx0XHQ1LFxuXHRcdFwi7IWx7IWy7IWz7IW17IW27IW37IW57IW67IW7XCJcblx0XSxcblx0W1xuXHRcdFwiOTk4MVwiLFxuXHRcdFwi7IW8XCIsXG5cdFx0OCxcblx0XHRcIuyGhlwiLFxuXHRcdDUsXG5cdFx0XCLsho/shpHshpLshpPshpXshpdcIixcblx0XHQ0LFxuXHRcdFwi7Iae7Iag7Iai7Iaj7Iak7Iam7Ian7Iaq7Iar7Iat7Iau7Iav7IaxXCIsXG5cdFx0MTEsXG5cdFx0XCLshr5cIixcblx0XHQ1LFxuXHRcdFwi7IeF7IeG7IeH7IeJ7IeK7IeL7IeNXCIsXG5cdFx0Nixcblx0XHRcIuyHleyHluyHmVwiLFxuXHRcdDYsXG5cdFx0XCLsh6Hsh6Lsh6Psh6Xsh6bsh6fsh6lcIixcblx0XHQ2LFxuXHRcdFwi7Iey7Ie0XCIsXG5cdFx0Nyxcblx0XHRcIuyHvuyHv+yIgeyIguyIg+yIhVwiLFxuXHRcdDYsXG5cdFx0XCLsiI7siJDsiJJcIixcblx0XHQ1LFxuXHRcdFwi7Iia7Iib7Iid7Iie7Iih7Iii7IijXCJcblx0XSxcblx0W1xuXHRcdFwiOWE0MVwiLFxuXHRcdFwi7Iik7Iil7Iim7Iin7Iiq7Iis7Iiu7Iiw7Iiz7Ii1XCIsXG5cdFx0MTZcblx0XSxcblx0W1xuXHRcdFwiOWE2MVwiLFxuXHRcdFwi7ImG7ImH7ImJXCIsXG5cdFx0Nixcblx0XHRcIuyJkuyJk+yJleyJluyJl+yJmVwiLFxuXHRcdDYsXG5cdFx0XCLsiaHsiaLsiaPsiaTsiaZcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YTgxXCIsXG5cdFx0XCLsiadcIixcblx0XHQ0LFxuXHRcdFwi7Imu7Imv7Imx7Imy7Imz7Im1XCIsXG5cdFx0Nixcblx0XHRcIuyJvuyKgOyKglwiLFxuXHRcdDUsXG5cdFx0XCLsiopcIixcblx0XHQ1LFxuXHRcdFwi7IqRXCIsXG5cdFx0Nixcblx0XHRcIuyKmeyKmuyKnOyKnlwiLFxuXHRcdDUsXG5cdFx0XCLsiqbsiqfsiqnsiqrsiqvsiq5cIixcblx0XHQ1LFxuXHRcdFwi7Iq27Iq47Iq6XCIsXG5cdFx0MzMsXG5cdFx0XCLsi57si5/si6Hsi6Lsi6VcIixcblx0XHQ1LFxuXHRcdFwi7Iuu7Iuw7Iuy7Iuz7Iu07Iu17Iu37Iu67Iu97Iu+7Iu/7IyBXCIsXG5cdFx0Nixcblx0XHRcIuyMiuyMi+yMjuyMj1wiXG5cdF0sXG5cdFtcblx0XHRcIjliNDFcIixcblx0XHRcIuyMkOyMkeyMkuyMluyMl+yMmeyMmuyMm+yMnVwiLFxuXHRcdDYsXG5cdFx0XCLsjKbsjKfsjKpcIixcblx0XHQ4XG5cdF0sXG5cdFtcblx0XHRcIjliNjFcIixcblx0XHRcIuyMs1wiLFxuXHRcdDE3LFxuXHRcdFwi7I2GXCIsXG5cdFx0N1xuXHRdLFxuXHRbXG5cdFx0XCI5YjgxXCIsXG5cdFx0XCLsjY5cIixcblx0XHQyNSxcblx0XHRcIuyNquyNq+yNreyNruyNr+yNseyNs1wiLFxuXHRcdDQsXG5cdFx0XCLsjbrsjbvsjb5cIixcblx0XHQ1LFxuXHRcdFwi7I6F7I6G7I6H7I6J7I6K7I6L7I6NXCIsXG5cdFx0NTAsXG5cdFx0XCLsj4FcIixcblx0XHQyMixcblx0XHRcIuyPmlwiXG5cdF0sXG5cdFtcblx0XHRcIjljNDFcIixcblx0XHRcIuyPm+yPneyPnuyPoeyPo1wiLFxuXHRcdDQsXG5cdFx0XCLsj6rsj6vsj6zsj65cIixcblx0XHQ1LFxuXHRcdFwi7I+27I+37I+5XCIsXG5cdFx0NVxuXHRdLFxuXHRbXG5cdFx0XCI5YzYxXCIsXG5cdFx0XCLsj79cIixcblx0XHQ4LFxuXHRcdFwi7JCJXCIsXG5cdFx0Nixcblx0XHRcIuyQkVwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiOWM4MVwiLFxuXHRcdFwi7JCbXCIsXG5cdFx0OCxcblx0XHRcIuyQpVwiLFxuXHRcdDYsXG5cdFx0XCLskK3skK7skK/skLHskLLskLPskLVcIixcblx0XHQ2LFxuXHRcdFwi7JC+XCIsXG5cdFx0OSxcblx0XHRcIuyRiVwiLFxuXHRcdDI2LFxuXHRcdFwi7JGm7JGn7JGp7JGq7JGr7JGtXCIsXG5cdFx0Nixcblx0XHRcIuyRtuyRt+yRuOyRulwiLFxuXHRcdDUsXG5cdFx0XCLskoFcIixcblx0XHQxOCxcblx0XHRcIuySlVwiLFxuXHRcdDYsXG5cdFx0XCLskp1cIixcblx0XHQxMlxuXHRdLFxuXHRbXG5cdFx0XCI5ZDQxXCIsXG5cdFx0XCLskqpcIixcblx0XHQxMyxcblx0XHRcIuySueySuuySu+ySvVwiLFxuXHRcdDhcblx0XSxcblx0W1xuXHRcdFwiOWQ2MVwiLFxuXHRcdFwi7JOGXCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiOWQ4MVwiLFxuXHRcdFwi7JOgXCIsXG5cdFx0OCxcblx0XHRcIuyTqlwiLFxuXHRcdDUsXG5cdFx0XCLsk7Lsk7Psk7Xsk7bsk7fsk7nsk7vsk7zsk73sk77slIJcIixcblx0XHQ5LFxuXHRcdFwi7JSN7JSO7JSP7JSR7JSS7JST7JSVXCIsXG5cdFx0Nixcblx0XHRcIuyUnVwiLFxuXHRcdDEwLFxuXHRcdFwi7JSq7JSr7JSt7JSu7JSv7JSxXCIsXG5cdFx0Nixcblx0XHRcIuyUuuyUvOyUvlwiLFxuXHRcdDUsXG5cdFx0XCLslYbslYfslYvslY/slZDslZHslZLslZbslZrslZvslZzslZ/slaLslaPslaXslabslafslalcIixcblx0XHQ2LFxuXHRcdFwi7JWy7JW2XCIsXG5cdFx0NSxcblx0XHRcIuyVvuyVv+yWgeyWguyWg+yWheyWhuyWiOyWieyWiuyWi+yWjuyWkOyWkuyWk+yWlFwiXG5cdF0sXG5cdFtcblx0XHRcIjllNDFcIixcblx0XHRcIuyWluyWmeyWmuyWm+yWneyWnuyWn+yWoVwiLFxuXHRcdDcsXG5cdFx0XCLslqpcIixcblx0XHQ5LFxuXHRcdFwi7Ja2XCJcblx0XSxcblx0W1xuXHRcdFwiOWU2MVwiLFxuXHRcdFwi7Ja37Ja67Ja/XCIsXG5cdFx0NCxcblx0XHRcIuyXi+yXjeyXj+yXkuyXk+yXleyXluyXl+yXmVwiLFxuXHRcdDYsXG5cdFx0XCLsl6Lsl6Tsl6bsl6dcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZTgxXCIsXG5cdFx0XCLsl6jsl6nsl6rsl6vsl6/sl7Hsl7Lsl7Psl7Xsl7jsl7nsl7rsl7vsmILsmIPsmITsmInsmIrsmIvsmI3smI7smI/smJFcIixcblx0XHQ2LFxuXHRcdFwi7Jia7JidXCIsXG5cdFx0Nixcblx0XHRcIuyYpuyYp+yYqeyYquyYq+yYr+yYseyYsuyYtuyYuOyYuuyYvOyYveyYvuyYv+yZguyZg+yZheyZhuyZh+yZiVwiLFxuXHRcdDYsXG5cdFx0XCLsmZLsmZZcIixcblx0XHQ1LFxuXHRcdFwi7Jme7Jmf7JmhXCIsXG5cdFx0MTAsXG5cdFx0XCLsma3sma7smbDsmbJcIixcblx0XHQ1LFxuXHRcdFwi7Jm67Jm77Jm97Jm+7Jm/7JqBXCIsXG5cdFx0Nixcblx0XHRcIuyaiuyajOyajlwiLFxuXHRcdDUsXG5cdFx0XCLsmpbsmpfsmpnsmprsmpvsmp1cIixcblx0XHQ2LFxuXHRcdFwi7JqmXCJcblx0XSxcblx0W1xuXHRcdFwiOWY0MVwiLFxuXHRcdFwi7Jqo7JqqXCIsXG5cdFx0NSxcblx0XHRcIuyasuyas+yateyatuyat+yau1wiLFxuXHRcdDQsXG5cdFx0XCLsm4Lsm4Tsm4ZcIixcblx0XHQ1LFxuXHRcdFwi7JuOXCJcblx0XSxcblx0W1xuXHRcdFwiOWY2MVwiLFxuXHRcdFwi7JuP7JuR7JuS7JuT7JuVXCIsXG5cdFx0Nixcblx0XHRcIuybnuybn+ybolwiLFxuXHRcdDUsXG5cdFx0XCLsm6rsm6vsm63sm67sm6/sm7Hsm7JcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZjgxXCIsXG5cdFx0XCLsm7NcIixcblx0XHQ0LFxuXHRcdFwi7Ju67Ju77Ju87Ju+XCIsXG5cdFx0NSxcblx0XHRcIuychuych+ycieyciuyci+ycjVwiLFxuXHRcdDYsXG5cdFx0XCLsnJbsnJjsnJpcIixcblx0XHQ1LFxuXHRcdFwi7Jyi7Jyj7Jyl7Jym7Jyn7JypXCIsXG5cdFx0Nixcblx0XHRcIuycsuyctOyctuycuOycueycuuycu+ycvuycv+ydgeydguydg+ydhVwiLFxuXHRcdDQsXG5cdFx0XCLsnYvsnY7snZDsnZnsnZrsnZvsnZ3snZ7snZ/snaFcIixcblx0XHQ2LFxuXHRcdFwi7J2p7J2q7J2sXCIsXG5cdFx0Nyxcblx0XHRcIuydtuydt+ydueyduuydu+ydv+yegOyegeyeguyehuyei+yejOyejeyej+yekuyek+yeleyemeyem1wiLFxuXHRcdDQsXG5cdFx0XCLsnqLsnqdcIixcblx0XHQ0LFxuXHRcdFwi7J6u7J6v7J6x7J6y7J6z7J617J627J63XCJcblx0XSxcblx0W1xuXHRcdFwiYTA0MVwiLFxuXHRcdFwi7J647J657J667J677J6+7J+CXCIsXG5cdFx0NSxcblx0XHRcIuyfiuyfi+yfjeyfj+yfkVwiLFxuXHRcdDYsXG5cdFx0XCLsn5nsn5rsn5vsn5xcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMDYxXCIsXG5cdFx0XCLsn55cIixcblx0XHQ1LFxuXHRcdFwi7J+l7J+m7J+n7J+p7J+q7J+r7J+tXCIsXG5cdFx0MTNcblx0XSxcblx0W1xuXHRcdFwiYTA4MVwiLFxuXHRcdFwi7J+7XCIsXG5cdFx0NCxcblx0XHRcIuygguygg+ygheyghuygh+ygieygi1wiLFxuXHRcdDQsXG5cdFx0XCLsoJLsoJTsoJdcIixcblx0XHQ0LFxuXHRcdFwi7KCe7KCf7KCh7KCi7KCj7KClXCIsXG5cdFx0Nixcblx0XHRcIuygruygsOygslwiLFxuXHRcdDUsXG5cdFx0XCLsoLnsoLrsoLvsoL3soL7soL/soYFcIixcblx0XHQ2LFxuXHRcdFwi7KGK7KGL7KGOXCIsXG5cdFx0NSxcblx0XHRcIuyhlVwiLFxuXHRcdDI2LFxuXHRcdFwi7KGy7KGz7KG17KG27KG37KG57KG7XCIsXG5cdFx0NCxcblx0XHRcIuyiguyihOyiiOyiieyiiuyijlwiLFxuXHRcdDUsXG5cdFx0XCLsopVcIixcblx0XHQ3LFxuXHRcdFwi7KKe7KKg7KKi7KKj7KKkXCJcblx0XSxcblx0W1xuXHRcdFwiYTE0MVwiLFxuXHRcdFwi7KKl7KKm7KKn7KKpXCIsXG5cdFx0MTgsXG5cdFx0XCLsor7sor/so4Dso4FcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMTYxXCIsXG5cdFx0XCLso4Lso4Pso4Xso4bso4fso4nso4rso4vso41cIixcblx0XHQ2LFxuXHRcdFwi7KOW7KOY7KOaXCIsXG5cdFx0NSxcblx0XHRcIuyjouyjo+yjpVwiXG5cdF0sXG5cdFtcblx0XHRcImExODFcIixcblx0XHRcIuyjplwiLFxuXHRcdDE0LFxuXHRcdFwi7KO2XCIsXG5cdFx0NSxcblx0XHRcIuyjvuyjv+ykgeykguykg+ykh1wiLFxuXHRcdDQsXG5cdFx0XCLspI7jgIDjgIHjgILCt+KApeKApsKo44CDwq3igJXiiKXvvLziiLzigJjigJnigJzigJ3jgJTjgJXjgIhcIixcblx0XHQ5LFxuXHRcdFwiwrHDl8O34omg4omk4oml4oie4oi0wrDigLLigLPihIPihKvvv6Dvv6Hvv6XimYLimYDiiKDiiqXijJLiiILiiIfiiaHiiZLCp+KAu+KYhuKYheKXi+KXj+KXjuKXh+KXhuKWoeKWoOKWs+KWsuKWveKWvOKGkuKGkOKGkeKGk+KGlOOAk+KJquKJq+KImuKIveKIneKIteKIq+KIrOKIiOKIi+KKhuKKh+KKguKKg+KIquKIqeKIp+KIqO+/olwiXG5cdF0sXG5cdFtcblx0XHRcImEyNDFcIixcblx0XHRcIuykkOykklwiLFxuXHRcdDUsXG5cdFx0XCLspJlcIixcblx0XHQxOFxuXHRdLFxuXHRbXG5cdFx0XCJhMjYxXCIsXG5cdFx0XCLspK1cIixcblx0XHQ2LFxuXHRcdFwi7KS1XCIsXG5cdFx0MThcblx0XSxcblx0W1xuXHRcdFwiYTI4MVwiLFxuXHRcdFwi7KWIXCIsXG5cdFx0Nyxcblx0XHRcIuylkuylk+ylleylluyll+ylmVwiLFxuXHRcdDYsXG5cdFx0XCLspaLspaRcIixcblx0XHQ3LFxuXHRcdFwi7KWt7KWu7KWv4oeS4oeU4oiA4oiDwrTvvZ7Lh8uYy53LmsuZwrjLm8Khwr/LkOKIruKIkeKIj8Kk4oSJ4oCw4peB4peA4pa34pa24pmk4pmg4pmh4pml4pmn4pmj4oqZ4peI4paj4peQ4peR4paS4pak4pal4pao4pan4pam4pap4pmo4piP4piO4pic4piewrbigKDigKHihpXihpfihpnihpbihpjima3imanimarimazjib/jiJzihJbjj4fihKLjj4Ljj5jihKHigqzCrlwiXG5cdF0sXG5cdFtcblx0XHRcImEzNDFcIixcblx0XHRcIuylseylsuyls+yltVwiLFxuXHRcdDYsXG5cdFx0XCLspb1cIixcblx0XHQxMCxcblx0XHRcIuymiuymi+ymjeymjuymj1wiXG5cdF0sXG5cdFtcblx0XHRcImEzNjFcIixcblx0XHRcIuymkVwiLFxuXHRcdDYsXG5cdFx0XCLspprsppzspp5cIixcblx0XHQxNlxuXHRdLFxuXHRbXG5cdFx0XCJhMzgxXCIsXG5cdFx0XCLspq9cIixcblx0XHQxNixcblx0XHRcIuynguyng+ynheynhuynieyni1wiLFxuXHRcdDQsXG5cdFx0XCLsp5Lsp5Tsp5fsp5jsp5vvvIFcIixcblx0XHQ1OCxcblx0XHRcIu+/pu+8vVwiLFxuXHRcdDMyLFxuXHRcdFwi77+jXCJcblx0XSxcblx0W1xuXHRcdFwiYTQ0MVwiLFxuXHRcdFwi7Kee7Kef7Keh7Kej7Kel7Kem7Keo7Kep7Keq7Ker7Keu7KeyXCIsXG5cdFx0NSxcblx0XHRcIuynuuynu+ynveynvuynv+yogeyoguyog+yohFwiXG5cdF0sXG5cdFtcblx0XHRcImE0NjFcIixcblx0XHRcIuyoheyohuyoh+yoiuyojlwiLFxuXHRcdDUsXG5cdFx0XCLsqJXsqJbsqJfsqJlcIixcblx0XHQxMlxuXHRdLFxuXHRbXG5cdFx0XCJhNDgxXCIsXG5cdFx0XCLsqKbsqKfsqKjsqKpcIixcblx0XHQyOCxcblx0XHRcIuOEsVwiLFxuXHRcdDkzXG5cdF0sXG5cdFtcblx0XHRcImE1NDFcIixcblx0XHRcIuyph1wiLFxuXHRcdDQsXG5cdFx0XCLsqY7sqY/sqZHsqZLsqZPsqZVcIixcblx0XHQ2LFxuXHRcdFwi7Kme7KmiXCIsXG5cdFx0NSxcblx0XHRcIuypqeypqlwiXG5cdF0sXG5cdFtcblx0XHRcImE1NjFcIixcblx0XHRcIuypq1wiLFxuXHRcdDE3LFxuXHRcdFwi7Km+XCIsXG5cdFx0NSxcblx0XHRcIuyqheyqhlwiXG5cdF0sXG5cdFtcblx0XHRcImE1ODFcIixcblx0XHRcIuyqh1wiLFxuXHRcdDE2LFxuXHRcdFwi7KqZXCIsXG5cdFx0MTQsXG5cdFx0XCLihbBcIixcblx0XHQ5XG5cdF0sXG5cdFtcblx0XHRcImE1YjBcIixcblx0XHRcIuKFoFwiLFxuXHRcdDlcblx0XSxcblx0W1xuXHRcdFwiYTVjMVwiLFxuXHRcdFwizpFcIixcblx0XHQxNixcblx0XHRcIs6jXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJhNWUxXCIsXG5cdFx0XCLOsVwiLFxuXHRcdDE2LFxuXHRcdFwiz4NcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImE2NDFcIixcblx0XHRcIuyqqFwiLFxuXHRcdDE5LFxuXHRcdFwi7Kq+7Kq/7KuB7KuC7KuD7KuFXCJcblx0XSxcblx0W1xuXHRcdFwiYTY2MVwiLFxuXHRcdFwi7KuGXCIsXG5cdFx0NSxcblx0XHRcIuyrjuyrkOyrkuyrlOyrleyrluyrl+yrmlwiLFxuXHRcdDUsXG5cdFx0XCLsq6FcIixcblx0XHQ2XG5cdF0sXG5cdFtcblx0XHRcImE2ODFcIixcblx0XHRcIuyrqOyrqeyrquyrq+yrrVwiLFxuXHRcdDYsXG5cdFx0XCLsq7VcIixcblx0XHQxOCxcblx0XHRcIuysieysiuKUgOKUguKUjOKUkOKUmOKUlOKUnOKUrOKUpOKUtOKUvOKUgeKUg+KUj+KUk+KUm+KUl+KUo+KUs+KUq+KUu+KVi+KUoOKUr+KUqOKUt+KUv+KUneKUsOKUpeKUuOKVguKUkuKUkeKUmuKUmeKUluKUleKUjuKUjeKUnuKUn+KUoeKUouKUpuKUp+KUqeKUquKUreKUruKUseKUsuKUteKUtuKUueKUuuKUveKUvuKVgOKVgeKVg1wiLFxuXHRcdDdcblx0XSxcblx0W1xuXHRcdFwiYTc0MVwiLFxuXHRcdFwi7KyLXCIsXG5cdFx0NCxcblx0XHRcIuyskeyskuysk+ysleysluysl+ysmVwiLFxuXHRcdDYsXG5cdFx0XCLsrKJcIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcImE3NjFcIixcblx0XHRcIuysqlwiLFxuXHRcdDIyLFxuXHRcdFwi7K2C7K2D7K2EXCJcblx0XSxcblx0W1xuXHRcdFwiYTc4MVwiLFxuXHRcdFwi7K2F7K2G7K2H7K2K7K2L7K2N7K2O7K2P7K2RXCIsXG5cdFx0Nixcblx0XHRcIuytmuytm+ytnOytnlwiLFxuXHRcdDUsXG5cdFx0XCLsraVcIixcblx0XHQ3LFxuXHRcdFwi446V446W446X4oST446Y44+E446j446k446l446m446ZXCIsXG5cdFx0OSxcblx0XHRcIuOPiuOOjeOOjuOOj+OPj+OOiOOOieOPiOOOp+OOqOOOsFwiLFxuXHRcdDksXG5cdFx0XCLjjoBcIixcblx0XHQ0LFxuXHRcdFwi4466XCIsXG5cdFx0NSxcblx0XHRcIuOOkFwiLFxuXHRcdDQsXG5cdFx0XCLihKbjj4Djj4Hjjorjjovjjozjj5bjj4Xjjq3jjq7jjq/jj5vjjqnjjqrjjqvjjqzjj53jj5Djj5Pjj4Pjj4njj5zjj4ZcIlxuXHRdLFxuXHRbXG5cdFx0XCJhODQxXCIsXG5cdFx0XCLsra1cIixcblx0XHQxMCxcblx0XHRcIuytulwiLFxuXHRcdDE0XG5cdF0sXG5cdFtcblx0XHRcImE4NjFcIixcblx0XHRcIuyuiVwiLFxuXHRcdDE4LFxuXHRcdFwi7K6dXCIsXG5cdFx0NlxuXHRdLFxuXHRbXG5cdFx0XCJhODgxXCIsXG5cdFx0XCLsrqRcIixcblx0XHQxOSxcblx0XHRcIuyuuVwiLFxuXHRcdDExLFxuXHRcdFwiw4bDkMKqxKZcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOGE2XCIsXG5cdFx0XCLEslwiXG5cdF0sXG5cdFtcblx0XHRcImE4YThcIixcblx0XHRcIsS/xYHDmMWSwrrDnsWmxYpcIlxuXHRdLFxuXHRbXG5cdFx0XCJhOGIxXCIsXG5cdFx0XCLjiaBcIixcblx0XHQyNyxcblx0XHRcIuKTkFwiLFxuXHRcdDI1LFxuXHRcdFwi4pGgXCIsXG5cdFx0MTQsXG5cdFx0XCLCveKFk+KFlMK8wr7ihZvihZzihZ3ihZ5cIlxuXHRdLFxuXHRbXG5cdFx0XCJhOTQxXCIsXG5cdFx0XCLsr4VcIixcblx0XHQxNCxcblx0XHRcIuyvlVwiLFxuXHRcdDEwXG5cdF0sXG5cdFtcblx0XHRcImE5NjFcIixcblx0XHRcIuyvoOyvoeyvouyvo+yvpeyvpuyvqOyvqlwiLFxuXHRcdDE4XG5cdF0sXG5cdFtcblx0XHRcImE5ODFcIixcblx0XHRcIuyvvVwiLFxuXHRcdDE0LFxuXHRcdFwi7LCO7LCP7LCR7LCS7LCT7LCVXCIsXG5cdFx0Nixcblx0XHRcIuywnuywn+ywoOywo+ywpMOmxJHDsMSnxLHEs8S4xYDFgsO4xZPDn8O+xafFi8WJ44iAXCIsXG5cdFx0MjcsXG5cdFx0XCLikpxcIixcblx0XHQyNSxcblx0XHRcIuKRtFwiLFxuXHRcdDE0LFxuXHRcdFwiwrnCssKz4oG04oG/4oKB4oKC4oKD4oKEXCJcblx0XSxcblx0W1xuXHRcdFwiYWE0MVwiLFxuXHRcdFwi7LCl7LCm7LCq7LCr7LCt7LCv7LCxXCIsXG5cdFx0Nixcblx0XHRcIuywuuywv1wiLFxuXHRcdDQsXG5cdFx0XCLssYbssYfssYnssYrssYvssY3ssY5cIlxuXHRdLFxuXHRbXG5cdFx0XCJhYTYxXCIsXG5cdFx0XCLssY9cIixcblx0XHQ0LFxuXHRcdFwi7LGW7LGaXCIsXG5cdFx0NSxcblx0XHRcIuyxoeyxouyxo+yxpeyxp+yxqVwiLFxuXHRcdDYsXG5cdFx0XCLssbHssbJcIlxuXHRdLFxuXHRbXG5cdFx0XCJhYTgxXCIsXG5cdFx0XCLssbPssbTssbZcIixcblx0XHQyOSxcblx0XHRcIuOBgVwiLFxuXHRcdDgyXG5cdF0sXG5cdFtcblx0XHRcImFiNDFcIixcblx0XHRcIuyylOyyleyyluyyl+yymuyym+yyneyynuyyn+yyoVwiLFxuXHRcdDYsXG5cdFx0XCLssqrssq5cIixcblx0XHQ1LFxuXHRcdFwi7LK27LK37LK5XCJcblx0XSxcblx0W1xuXHRcdFwiYWI2MVwiLFxuXHRcdFwi7LK67LK77LK9XCIsXG5cdFx0Nixcblx0XHRcIuyzhuyziOyzilwiLFxuXHRcdDUsXG5cdFx0XCLss5Hss5Lss5Pss5VcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcImFiODFcIixcblx0XHRcIuyzm1wiLFxuXHRcdDgsXG5cdFx0XCLss6VcIixcblx0XHQ2LFxuXHRcdFwi7LOt7LOu7LOv7LOxXCIsXG5cdFx0MTIsXG5cdFx0XCLjgqFcIixcblx0XHQ4NVxuXHRdLFxuXHRbXG5cdFx0XCJhYzQxXCIsXG5cdFx0XCLss77ss7/stIDstIJcIixcblx0XHQ1LFxuXHRcdFwi7LSK7LSL7LSN7LSO7LSP7LSRXCIsXG5cdFx0Nixcblx0XHRcIuy0muy0nOy0nuy0n+y0oFwiXG5cdF0sXG5cdFtcblx0XHRcImFjNjFcIixcblx0XHRcIuy0oey0ouy0o+y0pey0puy0p+y0qey0quy0q+y0rVwiLFxuXHRcdDExLFxuXHRcdFwi7LS6XCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJhYzgxXCIsXG5cdFx0XCLstL9cIixcblx0XHQyOCxcblx0XHRcIuy1ney1nuy1n9CQXCIsXG5cdFx0NSxcblx0XHRcItCB0JZcIixcblx0XHQyNVxuXHRdLFxuXHRbXG5cdFx0XCJhY2QxXCIsXG5cdFx0XCLQsFwiLFxuXHRcdDUsXG5cdFx0XCLRkdC2XCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiYWQ0MVwiLFxuXHRcdFwi7LWh7LWi7LWj7LWlXCIsXG5cdFx0Nixcblx0XHRcIuy1ruy1sOy1slwiLFxuXHRcdDUsXG5cdFx0XCLstblcIixcblx0XHQ3XG5cdF0sXG5cdFtcblx0XHRcImFkNjFcIixcblx0XHRcIuy2gVwiLFxuXHRcdDYsXG5cdFx0XCLstolcIixcblx0XHQxMCxcblx0XHRcIuy2luy2l+y2mey2muy2m+y2ney2nuy2n1wiXG5cdF0sXG5cdFtcblx0XHRcImFkODFcIixcblx0XHRcIuy2oOy2oey2ouy2o+y2puy2qOy2qlwiLFxuXHRcdDUsXG5cdFx0XCLstrFcIixcblx0XHQxOCxcblx0XHRcIuy3hVwiXG5cdF0sXG5cdFtcblx0XHRcImFlNDFcIixcblx0XHRcIuy3hlwiLFxuXHRcdDUsXG5cdFx0XCLst43st47st4/st5FcIixcblx0XHQxNlxuXHRdLFxuXHRbXG5cdFx0XCJhZTYxXCIsXG5cdFx0XCLst6JcIixcblx0XHQ1LFxuXHRcdFwi7Lep7Leq7Ler7Let7Leu7Lev7LexXCIsXG5cdFx0Nixcblx0XHRcIuy3uuy3vOy3vlwiLFxuXHRcdDRcblx0XSxcblx0W1xuXHRcdFwiYWU4MVwiLFxuXHRcdFwi7LiD7LiF7LiG7LiH7LiJ7LiK7LiL7LiNXCIsXG5cdFx0Nixcblx0XHRcIuy4ley4luy4l+y4mOy4mlwiLFxuXHRcdDUsXG5cdFx0XCLsuKLsuKPsuKXsuKbsuKfsuKnsuKrsuKtcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZjQxXCIsXG5cdFx0XCLsuKzsuK3suK7suK/suLLsuLTsuLZcIixcblx0XHQxOVxuXHRdLFxuXHRbXG5cdFx0XCJhZjYxXCIsXG5cdFx0XCLsuYpcIixcblx0XHQxMyxcblx0XHRcIuy5muy5m+y5ney5nuy5olwiLFxuXHRcdDUsXG5cdFx0XCLsuarsuaxcIlxuXHRdLFxuXHRbXG5cdFx0XCJhZjgxXCIsXG5cdFx0XCLsua5cIixcblx0XHQ1LFxuXHRcdFwi7Lm27Lm37Lm57Lm67Lm77Lm9XCIsXG5cdFx0Nixcblx0XHRcIuy6huy6iOy6ilwiLFxuXHRcdDUsXG5cdFx0XCLsupLsupPsupXsupbsupfsuplcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMDQxXCIsXG5cdFx0XCLsuppcIixcblx0XHQ1LFxuXHRcdFwi7Lqi7LqmXCIsXG5cdFx0NSxcblx0XHRcIuy6rlwiLFxuXHRcdDEyXG5cdF0sXG5cdFtcblx0XHRcImIwNjFcIixcblx0XHRcIuy6u1wiLFxuXHRcdDUsXG5cdFx0XCLsu4JcIixcblx0XHQxOVxuXHRdLFxuXHRbXG5cdFx0XCJiMDgxXCIsXG5cdFx0XCLsu5ZcIixcblx0XHQxMyxcblx0XHRcIuy7puy7p+y7qey7quy7rVwiLFxuXHRcdDYsXG5cdFx0XCLsu7bsu7pcIixcblx0XHQ1LFxuXHRcdFwi6rCA6rCB6rCE6rCH6rCI6rCJ6rCK6rCQXCIsXG5cdFx0Nyxcblx0XHRcIuqwmVwiLFxuXHRcdDQsXG5cdFx0XCLqsKDqsKTqsKzqsK3qsK/qsLDqsLHqsLjqsLnqsLzqsYDqsYvqsY3qsZTqsZjqsZzqsbDqsbHqsbTqsbfqsbjqsbrqsoDqsoHqsoPqsoTqsoXqsobqsonqsorqsovqsozqspDqspTqspzqsp3qsp/qsqDqsqHqsqjqsqnqsqrqsqzqsq/qsrDqsrjqsrnqsrvqsrzqsr3qs4Hqs4Tqs4jqs4zqs5Xqs5fqs6Dqs6Hqs6Tqs6fqs6jqs6rqs6zqs6/qs7Dqs7Hqs7Pqs7Xqs7bqs7zqs73qtIDqtITqtIZcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMTQxXCIsXG5cdFx0XCLsvILsvIPsvIXsvIbsvIfsvIlcIixcblx0XHQ2LFxuXHRcdFwi7LyS7LyU7LyWXCIsXG5cdFx0NSxcblx0XHRcIuy8ney8nuy8n+y8oey8ouy8o1wiXG5cdF0sXG5cdFtcblx0XHRcImIxNjFcIixcblx0XHRcIuy8pVwiLFxuXHRcdDYsXG5cdFx0XCLsvK7svLJcIixcblx0XHQ1LFxuXHRcdFwi7Ly5XCIsXG5cdFx0MTFcblx0XSxcblx0W1xuXHRcdFwiYjE4MVwiLFxuXHRcdFwi7L2FXCIsXG5cdFx0MTQsXG5cdFx0XCLsvZbsvZfsvZnsvZrsvZvsvZ1cIixcblx0XHQ2LFxuXHRcdFwi7L2m7L2o7L2q7L2r7L2s6rSM6rSN6rSP6rSR6rSY6rSc6rSg6rSp6rSs6rSt6rS06rS16rS46rS86rWE6rWF6rWH6rWJ6rWQ6rWU6rWY6rWh6rWj6rWs6rWt6rWw6rWz6rW06rW16rW26rW76rW86rW96rW/6raB6raC6raI6raJ6raM6raQ6rac6rad6rak6ra36reA6reB6reE6reI6reQ6reR6reT6rec6reg6rek6re46re56re86re/6riA6riB6riI6riJ6riL6riN6riU6riw6rix6ri06ri36ri46ri66rmA6rmB6rmD6rmF6rmG6rmK6rmM6rmN6rmO6rmQ6rmU6rmW6rmc6rmd6rmf6rmg6rmh6rml6rmo6rmp6rms6rmw6rm4XCJcblx0XSxcblx0W1xuXHRcdFwiYjI0MVwiLFxuXHRcdFwi7L2t7L2u7L2v7L2y7L2z7L217L227L237L25XCIsXG5cdFx0Nixcblx0XHRcIuy+gey+guy+g+y+hOy+hlwiLFxuXHRcdDUsXG5cdFx0XCLsvo1cIlxuXHRdLFxuXHRbXG5cdFx0XCJiMjYxXCIsXG5cdFx0XCLsvo5cIixcblx0XHQxOCxcblx0XHRcIuy+olwiLFxuXHRcdDUsXG5cdFx0XCLsvqlcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMjgxXCIsXG5cdFx0XCLsvqpcIixcblx0XHQ1LFxuXHRcdFwi7L6xXCIsXG5cdFx0MTgsXG5cdFx0XCLsv4VcIixcblx0XHQ2LFxuXHRcdFwi6rm56rm76rm86rm96rqE6rqF6rqM6rq86rq96rq+6ruA6ruE6ruM6ruN6ruP6ruQ6ruR6ruY6ruZ6ruc6ruo6rur6rut6ru06ru46ru86ryH6ryI6ryN6ryQ6rys6ryt6ryw6ryy6ry06ry86ry96ry/6r2B6r2C6r2D6r2I6r2J6r2Q6r2c6r2d6r2k6r2l6r256r6A6r6E6r6I6r6Q6r6R6r6V6r6c6r646r656r686r+A6r+H6r+I6r+J6r+L6r+N6r+O6r+U6r+c6r+o6r+p6r+w6r+x6r+06r+464CA64CB64CE64CM64CQ64CU64Cc64Cd64Co64GE64GF64GI64GK64GM64GO64GT64GU64GV64GX64GZXCJcblx0XSxcblx0W1xuXHRcdFwiYjM0MVwiLFxuXHRcdFwi7L+MXCIsXG5cdFx0MTksXG5cdFx0XCLsv6Lsv6Psv6Xsv6bsv6fsv6lcIlxuXHRdLFxuXHRbXG5cdFx0XCJiMzYxXCIsXG5cdFx0XCLsv6pcIixcblx0XHQ1LFxuXHRcdFwi7L+y7L+07L+2XCIsXG5cdFx0NSxcblx0XHRcIuy/vey/vuy/v+2Age2Agu2Ag+2AhVwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiYjM4MVwiLFxuXHRcdFwi7YCLXCIsXG5cdFx0NSxcblx0XHRcIu2AklwiLFxuXHRcdDUsXG5cdFx0XCLtgJlcIixcblx0XHQxOSxcblx0XHRcIuuBneuBvOuBveuCgOuChOuCjOuCjeuCj+uCkeuCmOuCmeuCmuuCnOuCn+uCoOuCoeuCouuCqOuCqeuCq1wiLFxuXHRcdDQsXG5cdFx0XCLrgrHrgrPrgrTrgrXrgrjrgrzrg4Trg4Xrg4frg4jrg4nrg5Drg5Hrg5Trg5jrg6Drg6XrhIjrhInrhIvrhIzrhJDrhJLrhJPrhJjrhJnrhJvrhJzrhJ3rhKPrhKTrhKXrhKjrhKzrhLTrhLXrhLfrhLjrhLnrhYDrhYHrhYTrhYjrhZDrhZHrhZTrhZXrhZjrhZzrhaDrhbjrhbnrhbzrhoDrhoLrhojrhonrhovrho3rhpLrhpPrhpTrhpjrhpzrhqjrh4zrh5Drh5Trh5zrh51cIlxuXHRdLFxuXHRbXG5cdFx0XCJiNDQxXCIsXG5cdFx0XCLtgK5cIixcblx0XHQ1LFxuXHRcdFwi7YC27YC37YC57YC67YC77YC9XCIsXG5cdFx0Nixcblx0XHRcIu2Bhu2BiO2BilwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiYjQ2MVwiLFxuXHRcdFwi7YGR7YGS7YGT7YGV7YGW7YGX7YGZXCIsXG5cdFx0Nixcblx0XHRcIu2BoVwiLFxuXHRcdDEwLFxuXHRcdFwi7YGu7YGvXCJcblx0XSxcblx0W1xuXHRcdFwiYjQ4MVwiLFxuXHRcdFwi7YGx7YGy7YGz7YG1XCIsXG5cdFx0Nixcblx0XHRcIu2Bvu2Bv+2CgO2CglwiLFxuXHRcdDE4LFxuXHRcdFwi64ef64eo64ep64es64ew64e564e764e964iE64iF64iI64iL64iM64iU64iV64iX64iZ64ig64i064i864mY64mc64mg64mo64mp64m064m164m864qE64qF64qJ64qQ64qR64qU64qY64qZ64qa64qg64qh64qj64ql64qm64qq64qs64qw64q064uI64uJ64uM64uQ64uS64uY64uZ64ub64ud64ui64uk64ul64um64uo64urXCIsXG5cdFx0NCxcblx0XHRcIuuLs+uLtOuLteuLt1wiLFxuXHRcdDQsXG5cdFx0XCLri7/rjIDrjIHrjITrjIjrjJDrjJHrjJPrjJTrjJXrjJzrjZTrjZXrjZbrjZjrjZvrjZzrjZ7rjZ/rjaTrjaVcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNTQxXCIsXG5cdFx0XCLtgpVcIixcblx0XHQxNCxcblx0XHRcIu2Cpu2Cp+2Cqe2Cqu2Cq+2CrVwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiYjU2MVwiLFxuXHRcdFwi7YKz7YK27YK47YK6XCIsXG5cdFx0NSxcblx0XHRcIu2Dgu2Dg+2Dhe2Dhu2Dh+2DilwiLFxuXHRcdDUsXG5cdFx0XCLtg5Ltg5ZcIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImI1ODFcIixcblx0XHRcIu2Dm+2Dnu2Dn+2Doe2Dou2Do+2DpVwiLFxuXHRcdDYsXG5cdFx0XCLtg67tg7JcIixcblx0XHQ1LFxuXHRcdFwi7YO5XCIsXG5cdFx0MTEsXG5cdFx0XCLrjafrjanrjavrja7rjbDrjbHrjbTrjbjrjoDrjoHrjoPrjoTrjoXrjozrjpDrjpTrjqDrjqHrjqjrjqzrj4Trj4Xrj4jrj4vrj4zrj47rj5Drj5Trj5Xrj5frj5nrj5vrj53rj6Drj6Trj6jrj7zrkJDrkJjrkJzrkKDrkKjrkKnrkKvrkLTrkZDrkZHrkZTrkZjrkaDrkaHrkaPrkaXrkazrkoDrkojrkp3rkqTrkqjrkqzrkrXrkrfrkrnrk4Drk4Trk4jrk5Drk5Xrk5zrk53rk6Drk6Prk6Trk6brk6zrk63rk6/rk7Hrk7jrlJTrlJXrlJjrlJvrlJzrlKTrlKXrlKfrlKjrlKnrlKrrlLDrlLHrlLTrlLhcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNjQxXCIsXG5cdFx0XCLthIVcIixcblx0XHQ3LFxuXHRcdFwi7YSOXCIsXG5cdFx0MTdcblx0XSxcblx0W1xuXHRcdFwiYjY2MVwiLFxuXHRcdFwi7YSgXCIsXG5cdFx0MTUsXG5cdFx0XCLthLLthLPthLXthLbthLfthLnthLvthLzthL3thL5cIlxuXHRdLFxuXHRbXG5cdFx0XCJiNjgxXCIsXG5cdFx0XCLthL/thYLthYZcIixcblx0XHQ1LFxuXHRcdFwi7YWO7YWP7YWR7YWS7YWT7YWVXCIsXG5cdFx0Nixcblx0XHRcIu2Fnu2FoO2FolwiLFxuXHRcdDUsXG5cdFx0XCLthantharthavtha3rlYDrlYHrlYPrlYTrlYXrlYvrlYzrlY3rlZDrlZTrlZzrlZ3rlZ/rlaDrlaHrlqDrlqHrlqTrlqjrlqrrlqvrlrDrlrHrlrPrlrTrlrXrlrvrlrzrlr3rl4Drl4Trl4zrl43rl4/rl5Drl5Hrl5jrl6zrmJDrmJHrmJTrmJjrmKXrmKzrmLTrmYjrmaTrmajrmpzrmp3rmqDrmqTrmqvrmqzrmrHrm5Trm7Drm7Trm7jrnIDrnIHrnIXrnKjrnKnrnKzrnK/rnLDrnLjrnLnrnLvrnYTrnYjrnYzrnZTrnZXrnaDrnaTrnajrnbDrnbHrnbPrnbXrnbzrnb3rnoDrnoTrnozrno3rno/rnpDrnpHrnpLrnpbrnpdcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNzQxXCIsXG5cdFx0XCLtha5cIixcblx0XHQxMyxcblx0XHRcIu2FvVwiLFxuXHRcdDYsXG5cdFx0XCLthoXthobthofthonthopcIlxuXHRdLFxuXHRbXG5cdFx0XCJiNzYxXCIsXG5cdFx0XCLthotcIixcblx0XHQyMCxcblx0XHRcIu2Gou2Go+2Gpe2Gpu2Gp1wiXG5cdF0sXG5cdFtcblx0XHRcImI3ODFcIixcblx0XHRcIu2GqVwiLFxuXHRcdDYsXG5cdFx0XCLthrLthrTthrbthrfthrjthrnthrvthr3thr7thr/th4FcIixcblx0XHQxNCxcblx0XHRcIuuemOuemeuenOueoOueqOueqeueq+uerOuereuetOueteueuOufh+ufieufrOufreufsOuftOufvOufveufv+uggOuggeugh+ugiOugieugjOugkOugmOugmeugm+ugneugpOugpeugqOugrOugtOugteugt+uguOugueuhgOuhhOuhkeuhk+uhnOuhneuhoOuhpOuhrOuhreuhr+uhseuhuOuhvOuijeuiqOuisOuitOuiuOujgOujgeujg+ujheujjOujkOujlOujneujn+ujoeujqOujqeujrOujsOujuOujueuju+ujveukhOukmOukoOukvOukveulgOulhOuljOulj+ulkeulmOulmeulnOuloOulqOulqVwiXG5cdF0sXG5cdFtcblx0XHRcImI4NDFcIixcblx0XHRcIu2HkFwiLFxuXHRcdDcsXG5cdFx0XCLth5lcIixcblx0XHQxN1xuXHRdLFxuXHRbXG5cdFx0XCJiODYxXCIsXG5cdFx0XCLth6tcIixcblx0XHQ4LFxuXHRcdFwi7Ye17Ye27Ye37Ye5XCIsXG5cdFx0MTNcblx0XSxcblx0W1xuXHRcdFwiYjg4MVwiLFxuXHRcdFwi7YiI7YiKXCIsXG5cdFx0NSxcblx0XHRcIu2IkVwiLFxuXHRcdDI0LFxuXHRcdFwi66Wr66Wt66W066W166W466W866aE66aF66aH66aJ66aK66aN66aO66as66at66aw66a066a866a966a/66eB66eI66eJ66eM66eOXCIsXG5cdFx0NCxcblx0XHRcIuunmOunmeunm+unneunnuunoeuno+unpOunpeunqOunrOuntOunteunt+unuOunueunuuuogOuogeuoiOuoleuouOuoueuovOupgOupguupiOupieupi+upjeupjuupk+uplOupleupmOupnOuppOuppeupp+upqOupqeupsOupseuptOupuOuqg+uqhOuqheuqh+uqjOuqqOuqqeuqq+uqrOuqsOuqsuuquOuqueuqu+uqveurhOuriOurmOurmeurvFwiXG5cdF0sXG5cdFtcblx0XHRcImI5NDFcIixcblx0XHRcIu2Iqu2Iq+2Iru2Ir+2Ise2Isu2Is+2ItVwiLFxuXHRcdDYsXG5cdFx0XCLtiL7tiYDtiYJcIixcblx0XHQ1LFxuXHRcdFwi7YmJ7YmK7YmL7YmMXCJcblx0XSxcblx0W1xuXHRcdFwiYjk2MVwiLFxuXHRcdFwi7YmNXCIsXG5cdFx0MTQsXG5cdFx0XCLtiZ1cIixcblx0XHQ2LFxuXHRcdFwi7Yml7Ymm7Ymn7YmoXCJcblx0XSxcblx0W1xuXHRcdFwiYjk4MVwiLFxuXHRcdFwi7YmpXCIsXG5cdFx0MjIsXG5cdFx0XCLtioLtioPtioXtiobtioftiontiortiovtiozrrIDrrITrrI3rrI/rrJHrrJjrrJzrrKDrrKnrrKvrrLTrrLXrrLbrrLjrrLvrrLzrrL3rrL7rrYTrrYXrrYfrrYnrrY3rrY/rrZDrrZTrrZjrraHrraPrrazrrojrrozrrpDrrqTrrqjrrqzrrrTrrrfrr4Drr4Trr4jrr5Drr5Prr7jrr7nrr7zrr7/rsIDrsILrsIjrsInrsIvrsIzrsI3rsI/rsJHrsJRcIixcblx0XHQ0LFxuXHRcdFwi67CbXCIsXG5cdFx0NCxcblx0XHRcIuuwpOuwpeuwp+uwqeuwreuwsOuwseuwtOuwuOuxgOuxgeuxg+uxhOuxheuxieuxjOuxjeuxkOuxneuyhOuyheuyiOuyi+uyjOuyjuuylOuyleuyl1wiXG5cdF0sXG5cdFtcblx0XHRcImJhNDFcIixcblx0XHRcIu2Kje2Kju2Kj+2Kku2Kk+2KlO2KllwiLFxuXHRcdDUsXG5cdFx0XCLtip3tip7tip/tiqHtiqLtiqPtiqVcIixcblx0XHQ2LFxuXHRcdFwi7YqtXCJcblx0XSxcblx0W1xuXHRcdFwiYmE2MVwiLFxuXHRcdFwi7Yqu7Yqv7Yqw7YqyXCIsXG5cdFx0NSxcblx0XHRcIu2Kuu2Ku+2Kve2Kvu2Lge2Lg1wiLFxuXHRcdDQsXG5cdFx0XCLti4rti4xcIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcImJhODFcIixcblx0XHRcIu2Lku2Lk+2Lle2Llu2Ll+2Lme2Lmu2Lm+2LnVwiLFxuXHRcdDYsXG5cdFx0XCLti6ZcIixcblx0XHQ5LFxuXHRcdFwi7Yuy7Yuz7Yu17Yu27Yu37Yu57Yu667KZ67Ka67Kg67Kh67Kk67Kn67Ko67Kw67Kx67Kz67K067K167K867K967OA67OE67ON67OP67OQ67OR67OV67OY67Oc67O067O167O267O467O867SE67SF67SH67SJ67SQ67SU67Sk67Ss67WA67WI67WJ67WM67WQ67WY67WZ67Wk67Wo67aA67aB67aE67aH67aI67aJ67aK67aQ67aR67aT67aV67aZ67aa67ac67ak67aw67a467eU67eV67eY67ec67ep67ew67e067e467iA67iD67iF67iM67iN67iQ67iU67ic67id67if67mE67mF67mI67mM67mO67mU67mV67mX67mZ67ma67mb67mg67mh67mkXCJcblx0XSxcblx0W1xuXHRcdFwiYmI0MVwiLFxuXHRcdFwi7Yu7XCIsXG5cdFx0NCxcblx0XHRcIu2Mgu2MhO2MhlwiLFxuXHRcdDUsXG5cdFx0XCLtjI/tjJHtjJLtjJPtjJXtjJdcIixcblx0XHQ0LFxuXHRcdFwi7Yye7Yyi7YyjXCJcblx0XSxcblx0W1xuXHRcdFwiYmI2MVwiLFxuXHRcdFwi7Yyk7Yym7Yyn7Yyq7Yyr7Yyt7Yyu7Yyv7YyxXCIsXG5cdFx0Nixcblx0XHRcIu2Muu2MvlwiLFxuXHRcdDUsXG5cdFx0XCLtjYbtjYftjYjtjYlcIlxuXHRdLFxuXHRbXG5cdFx0XCJiYjgxXCIsXG5cdFx0XCLtjYpcIixcblx0XHQzMSxcblx0XHRcIuu5qOu5quu5sOu5seu5s+u5tOu5teu5u+u5vOu5veu6gOu6hOu6jOu6jeu6j+u6kOu6keu6mOu6meu6qOu7kOu7keu7lOu7l+u7mOu7oOu7o+u7pOu7peu7rOu8geu8iOu8ieu8mOu8meu8m+u8nOu8neu9gOu9geu9hOu9iOu9kOu9keu9leu+lOu+sOu/heu/jOu/jeu/kOu/lOu/nOu/n+u/oeyAvOyBkeyBmOyBnOyBoOyBqOyBqeyCkOyCkeyClOyCmOyCoOyCoeyCo+yCpeyCrOyCreyCr+yCsOyCs+yCtOyCteyCtuyCvOyCveyCv+yDgOyDgeyDheyDiOyDieyDjOyDkOyDmOyDmeyDm+yDnOyDneyDpFwiXG5cdF0sXG5cdFtcblx0XHRcImJjNDFcIixcblx0XHRcIu2NqlwiLFxuXHRcdDE3LFxuXHRcdFwi7Y2+7Y2/7Y6B7Y6C7Y6D7Y6F7Y6G7Y6HXCJcblx0XSxcblx0W1xuXHRcdFwiYmM2MVwiLFxuXHRcdFwi7Y6I7Y6J7Y6K7Y6L7Y6O7Y6SXCIsXG5cdFx0NSxcblx0XHRcIu2Omu2Om+2One2Onu2On+2OoVwiLFxuXHRcdDYsXG5cdFx0XCLtjqrtjqztjq5cIlxuXHRdLFxuXHRbXG5cdFx0XCJiYzgxXCIsXG5cdFx0XCLtjq9cIixcblx0XHQ0LFxuXHRcdFwi7Y617Y627Y637Y657Y667Y677Y69XCIsXG5cdFx0Nixcblx0XHRcIu2Phu2Ph+2PilwiLFxuXHRcdDUsXG5cdFx0XCLtj5FcIixcblx0XHQ1LFxuXHRcdFwi7IOl7IOo7IOs7IO07IO17IO37IO57ISA7ISE7ISI7ISQ7ISV7IScXCIsXG5cdFx0NCxcblx0XHRcIuyEo+yEpOyEpuyEp+yErOyEreyEr+yEsOyEseyEtuyEuOyEueyEvOyFgOyFiOyFieyFi+yFjOyFjeyFlOyFleyFmOyFnOyFpOyFpeyFp+yFqOyFqeyFsOyFtOyFuOyGheyGjOyGjeyGjuyGkOyGlOyGluyGnOyGneyGn+yGoeyGpeyGqOyGqeyGrOyGsOyGveyHhOyHiOyHjOyHlOyHl+yHmOyHoOyHpOyHqOyHsOyHseyHs+yHvOyHveyIgOyIhOyIjOyIjeyIj+yIkeyImOyImeyInOyIn+yIoOyIqOyIqeyIq+yIrVwiXG5cdF0sXG5cdFtcblx0XHRcImJkNDFcIixcblx0XHRcIu2Pl+2PmVwiLFxuXHRcdDcsXG5cdFx0XCLtj6Ltj6RcIixcblx0XHQ3LFxuXHRcdFwi7Y+u7Y+v7Y+x7Y+y7Y+z7Y+17Y+27Y+3XCJcblx0XSxcblx0W1xuXHRcdFwiYmQ2MVwiLFxuXHRcdFwi7Y+47Y+57Y+67Y+77Y++7ZCA7ZCCXCIsXG5cdFx0NSxcblx0XHRcIu2QiVwiLFxuXHRcdDEzXG5cdF0sXG5cdFtcblx0XHRcImJkODFcIixcblx0XHRcIu2Ql1wiLFxuXHRcdDUsXG5cdFx0XCLtkJ5cIixcblx0XHQyNSxcblx0XHRcIuyIr+yIseyIsuyItOyJiOyJkOyJkeyJlOyJmOyJoOyJpeyJrOyJreyJsOyJtOyJvOyJveyJv+yKgeyKiOyKieyKkOyKmOyKm+yKneyKpOyKpeyKqOyKrOyKreyKtOyKteyKt+yKueyLnOyLneyLoOyLo+yLpOyLq+yLrOyLreyLr+yLseyLtuyLuOyLueyLu+yLvOyMgOyMiOyMieyMjOyMjeyMk+yMlOyMleyMmOyMnOyMpOyMpeyMqOyMqeyNheyNqOyNqeyNrOyNsOyNsuyNuOyNueyNvOyNveyOhOyOiOyOjOyPgOyPmOyPmeyPnOyPn+yPoOyPouyPqOyPqeyPreyPtOyPteyPuOyQiOyQkOyQpOyQrOyQsFwiXG5cdF0sXG5cdFtcblx0XHRcImJlNDFcIixcblx0XHRcIu2QuFwiLFxuXHRcdDcsXG5cdFx0XCLtkYHtkYLtkYPtkYVcIixcblx0XHQxNFxuXHRdLFxuXHRbXG5cdFx0XCJiZTYxXCIsXG5cdFx0XCLtkZRcIixcblx0XHQ3LFxuXHRcdFwi7ZGd7ZGe7ZGf7ZGh7ZGi7ZGj7ZGlXCIsXG5cdFx0Nyxcblx0XHRcIu2Rru2RsO2Rse2RslwiXG5cdF0sXG5cdFtcblx0XHRcImJlODFcIixcblx0XHRcIu2Rs1wiLFxuXHRcdDQsXG5cdFx0XCLtkbrtkbvtkb3tkb7tkoHtkoNcIixcblx0XHQ0LFxuXHRcdFwi7ZKK7ZKM7ZKOXCIsXG5cdFx0NSxcblx0XHRcIu2SlVwiLFxuXHRcdDgsXG5cdFx0XCLskLTskLzskL3skYjskaTskaXskajskazskbTskbXskbnskoDskpTskpzskrjskrzsk6nsk7Dsk7Hsk7Tsk7jsk7rsk7/slIDslIHslIzslJDslJTslJzslKjslKnslKzslLDslLjslLnslLvslL3slYTslYXslYjslYnslYrslYzslY3slY7slZPslZTslZXslZfslZjslZnslZ3slZ7slaDslaHslaTslajslbDslbHslbPslbTslbXslbzslb3sloDsloTslofslozslo3slo/slpHslpXslpfslpjslpzslqDslqnslrTslrXslrjslrnslrvslrzslr3slr7sl4RcIixcblx0XHQ2LFxuXHRcdFwi7JeM7JeOXCJcblx0XSxcblx0W1xuXHRcdFwiYmY0MVwiLFxuXHRcdFwi7ZKeXCIsXG5cdFx0MTAsXG5cdFx0XCLtkqpcIixcblx0XHQxNFxuXHRdLFxuXHRbXG5cdFx0XCJiZjYxXCIsXG5cdFx0XCLtkrlcIixcblx0XHQxOCxcblx0XHRcIu2Tje2Tju2Tj+2Tke2Tku2Tk+2TlVwiXG5cdF0sXG5cdFtcblx0XHRcImJmODFcIixcblx0XHRcIu2TllwiLFxuXHRcdDUsXG5cdFx0XCLtk53tk57tk6BcIixcblx0XHQ3LFxuXHRcdFwi7ZOp7ZOq7ZOr7ZOt7ZOu7ZOv7ZOxXCIsXG5cdFx0Nixcblx0XHRcIu2Tue2Tuu2TvOyXkOyXkeyXlOyXmOyXoOyXoeyXo+yXpeyXrOyXreyXruyXsOyXtOyXtuyXt+yXvFwiLFxuXHRcdDUsXG5cdFx0XCLsmIXsmIbsmIfsmIjsmIzsmJDsmJjsmJnsmJvsmJzsmKTsmKXsmKjsmKzsmK3smK7smLDsmLPsmLTsmLXsmLfsmLnsmLvsmYDsmYHsmYTsmYjsmZDsmZHsmZPsmZTsmZXsmZzsmZ3smaDsmazsma/smbHsmbjsmbnsmbzsmoDsmojsmonsmovsmo3smpTsmpXsmpjsmpzsmqTsmqXsmqfsmqnsmrDsmrHsmrTsmrjsmrnsmrrsm4Dsm4Hsm4Psm4Xsm4zsm43sm5Dsm5Tsm5zsm53sm6Dsm6Hsm6hcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMDQxXCIsXG5cdFx0XCLtk75cIixcblx0XHQ1LFxuXHRcdFwi7ZSF7ZSG7ZSH7ZSJ7ZSK7ZSL7ZSNXCIsXG5cdFx0Nixcblx0XHRcIu2Ulu2UmFwiLFxuXHRcdDVcblx0XSxcblx0W1xuXHRcdFwiYzA2MVwiLFxuXHRcdFwi7ZSeXCIsXG5cdFx0MjVcblx0XSxcblx0W1xuXHRcdFwiYzA4MVwiLFxuXHRcdFwi7ZS47ZS57ZS67ZS77ZS+7ZS/7ZWB7ZWC7ZWD7ZWFXCIsXG5cdFx0Nixcblx0XHRcIu2Vju2VkO2VklwiLFxuXHRcdDUsXG5cdFx0XCLtlZrtlZvtlZ3tlZ7tlZ/tlaHtlaLtlaPsm6nsm6zsm7Dsm7jsm7nsm73snITsnIXsnIjsnIzsnJTsnJXsnJfsnJnsnKDsnKHsnKTsnKjsnLDsnLHsnLPsnLXsnLfsnLzsnL3snYDsnYTsnYrsnYzsnY3snY/snZFcIixcblx0XHQ3LFxuXHRcdFwi7J2c7J2g7J2o7J2r7J207J217J247J287J297J2+7J6D7J6E7J6F7J6H7J6I7J6J7J6K7J6O7J6Q7J6R7J6U7J6W7J6X7J6Y7J6a7J6g7J6h7J6j7J6k7J6l7J6m7J6s7J6t7J6w7J607J687J697J6/7J+A7J+B7J+I7J+J7J+M7J+O7J+Q7J+Y7J+d7J+k7J+o7J+s7KCA7KCB7KCE7KCI7KCKXCJcblx0XSxcblx0W1xuXHRcdFwiYzE0MVwiLFxuXHRcdFwi7ZWk7ZWm7ZWn7ZWq7ZWs7ZWuXCIsXG5cdFx0NSxcblx0XHRcIu2Vtu2Vt+2Vue2Vuu2Vu+2VvVwiLFxuXHRcdDYsXG5cdFx0XCLtlobtlortlotcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMTYxXCIsXG5cdFx0XCLtloztlo3tlo7tlo/tlpFcIixcblx0XHQxOSxcblx0XHRcIu2Wpu2Wp1wiXG5cdF0sXG5cdFtcblx0XHRcImMxODFcIixcblx0XHRcIu2WqFwiLFxuXHRcdDMxLFxuXHRcdFwi7KCQ7KCR7KCT7KCV7KCW7KCc7KCd7KCg7KCk7KCs7KCt7KCv7KCx7KC47KC87KGA7KGI7KGJ7KGM7KGN7KGU7KGw7KGx7KG07KG47KG67KKA7KKB7KKD7KKF7KKG7KKH7KKL7KKM7KKN7KKU7KKd7KKf7KKh7KKo7KK87KK97KOE7KOI7KOM7KOU7KOV7KOX7KOZ7KOg7KOh7KOk7KO17KO87KO97KSA7KSE7KSF7KSG7KSM7KSN7KSP7KSR7KSY7KSs7KS07KWQ7KWR7KWU7KWY7KWg7KWh7KWj7KWs7KWw7KW07KW87KaI7KaJ7KaM7KaQ7KaY7KaZ7Kab7Kad7KeA7KeB7KeE7KeH7KeI7KeK7KeQ7KeR7KeTXCJcblx0XSxcblx0W1xuXHRcdFwiYzI0MVwiLFxuXHRcdFwi7ZeK7ZeL7ZeN7ZeO7ZeP7ZeR7ZeTXCIsXG5cdFx0NCxcblx0XHRcIu2Xmu2XnO2XnlwiLFxuXHRcdDUsXG5cdFx0XCLtl6btl6ftl6ntl6rtl6vtl63tl65cIlxuXHRdLFxuXHRbXG5cdFx0XCJjMjYxXCIsXG5cdFx0XCLtl69cIixcblx0XHQ0LFxuXHRcdFwi7Ze27Ze47Ze6XCIsXG5cdFx0NSxcblx0XHRcIu2Ygu2Yg+2Yhe2Yhu2Yh+2YiVwiLFxuXHRcdDYsXG5cdFx0XCLtmJJcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMjgxXCIsXG5cdFx0XCLtmJZcIixcblx0XHQ1LFxuXHRcdFwi7Zid7Zie7Zif7Zih7Zii7Zij7ZilXCIsXG5cdFx0Nyxcblx0XHRcIu2YrlwiLFxuXHRcdDksXG5cdFx0XCLtmLrtmLvsp5Xsp5bsp5nsp5rsp5zsp53sp6Dsp6Lsp6Tsp6fsp6zsp63sp6/sp7Dsp7Hsp7jsp7nsp7zsqIDsqIjsqInsqIvsqIzsqI3sqJTsqJjsqKnsqYzsqY3sqZDsqZTsqZzsqZ3sqZ/sqaDsqaHsqajsqb3sqoTsqpjsqrzsqr3sq4Dsq4Tsq4zsq43sq4/sq5Hsq5Psq5jsq5nsq6Dsq6zsq7TsrIjsrJDsrJTsrJjsrKDsrKHsrYHsrYjsrYnsrYzsrZDsrZjsrZnsrZ3sraTsrbjsrbnsrpzsrrjsr5Tsr6Tsr6fsr6nssIzssI3ssJDssJTssJzssJ3ssKHssKLssKfssKjssKnssKzssK7ssLDssLjssLnssLtcIlxuXHRdLFxuXHRbXG5cdFx0XCJjMzQxXCIsXG5cdFx0XCLtmL3tmL7tmL/tmYHtmYLtmYPtmYTtmYbtmYftmYrtmYztmY7tmY/tmZDtmZLtmZPtmZbtmZftmZntmZrtmZvtmZ1cIixcblx0XHQ0XG5cdF0sXG5cdFtcblx0XHRcImMzNjFcIixcblx0XHRcIu2ZolwiLFxuXHRcdDQsXG5cdFx0XCLtmajtmapcIixcblx0XHQ1LFxuXHRcdFwi7Zmy7Zmz7Zm1XCIsXG5cdFx0MTFcblx0XSxcblx0W1xuXHRcdFwiYzM4MVwiLFxuXHRcdFwi7ZqB7ZqC7ZqE7ZqGXCIsXG5cdFx0NSxcblx0XHRcIu2aju2aj+2ake2aku2ak+2alVwiLFxuXHRcdDcsXG5cdFx0XCLtmp7tmqDtmqJcIixcblx0XHQ1LFxuXHRcdFwi7Zqp7Zqq7LC87LC97LC+7LGE7LGF7LGI7LGM7LGU7LGV7LGX7LGY7LGZ7LGg7LGk7LGm7LGo7LGw7LG17LKY7LKZ7LKc7LKg7LKo7LKp7LKr7LKs7LKt7LK07LK17LK47LK87LOE7LOF7LOH7LOJ7LOQ7LOU7LOk7LOs7LOw7LSB7LSI7LSJ7LSM7LSQ7LSY7LSZ7LSb7LSd7LSk7LSo7LSs7LS57LWc7LWg7LWk7LWs7LWt7LWv7LWx7LW47LaI7LaU7LaV7LaY7Lac7Lak7Lal7Lan7Lap7Law7LeE7LeM7LeQ7Leo7Les7Lew7Le47Le57Le77Le97LiE7LiI7LiM7LiU7LiZ7Lig7Lih7Lik7Lio7Liw7Lix7Liz7Li1XCJcblx0XSxcblx0W1xuXHRcdFwiYzQ0MVwiLFxuXHRcdFwi7Zqr7Zqt7Zqu7Zqv7ZqxXCIsXG5cdFx0Nyxcblx0XHRcIu2auu2avFwiLFxuXHRcdDcsXG5cdFx0XCLtm4btm4ftm4ntm4rtm4tcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNDYxXCIsXG5cdFx0XCLtm43tm47tm4/tm5Dtm5Ltm5Ptm5Xtm5btm5jtm5pcIixcblx0XHQ1LFxuXHRcdFwi7Zuh7Zui7Zuj7Zul7Zum7Zun7ZupXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJjNDgxXCIsXG5cdFx0XCLtm67tm6/tm7Htm7Ltm7Ptm7Ttm7ZcIixcblx0XHQ1LFxuXHRcdFwi7Zu+7Zu/7ZyB7ZyC7ZyD7ZyFXCIsXG5cdFx0MTEsXG5cdFx0XCLtnJLtnJPtnJTsuZjsuZnsuZzsuZ/suaDsuaHsuajsuansuavsua3subTsubXsubjsubzsuoTsuoXsuofsuonsupDsupHsupTsupjsuqDsuqHsuqPsuqTsuqXsuqzsuq3su4Hsu6Tsu6Xsu6jsu6vsu6zsu7Tsu7Xsu7fsu7jsu7nsvIDsvIHsvITsvIjsvJDsvJHsvJPsvJXsvJzsvKDsvKTsvKzsvK3svK/svLDsvLHsvLjsvZTsvZXsvZjsvZzsvaTsvaXsvafsvansvbDsvbHsvbTsvbjsvoDsvoXsvozsvqHsvqjsvrDsv4Tsv6Dsv6Hsv6Tsv6jsv7Dsv7Hsv7Psv7Xsv7ztgIDtgITtgJHtgJjtgK3tgLTtgLXtgLjtgLxcIlxuXHRdLFxuXHRbXG5cdFx0XCJjNTQxXCIsXG5cdFx0XCLtnJXtnJbtnJftnJrtnJvtnJ3tnJ7tnJ/tnKFcIixcblx0XHQ2LFxuXHRcdFwi7Zyq7Zys7ZyuXCIsXG5cdFx0NSxcblx0XHRcIu2ctu2ct+2cuVwiXG5cdF0sXG5cdFtcblx0XHRcImM1NjFcIixcblx0XHRcIu2cuu2cu+2cvVwiLFxuXHRcdDYsXG5cdFx0XCLtnYXtnYbtnYjtnYpcIixcblx0XHQ1LFxuXHRcdFwi7Z2S7Z2T7Z2V7Z2aXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJjNTgxXCIsXG5cdFx0XCLtnZ/tnaLtnaTtnabtnaftnajtnartnavtna3tna7tna/tnbHtnbLtnbPtnbVcIixcblx0XHQ2LFxuXHRcdFwi7Z2+7Z2/7Z6A7Z6CXCIsXG5cdFx0NSxcblx0XHRcIu2eiu2ei+2BhO2Bhe2Bh+2Bie2BkO2BlO2BmO2BoO2BrO2Bre2BsO2BtO2BvO2Bve2Cge2CpO2Cpe2CqO2CrO2CtO2Cte2Ct+2Cue2DgO2Dge2DhO2DiO2Die2DkO2Dke2Dk+2DlO2Dle2DnO2Dne2DoO2DpO2DrO2Dre2Dr+2DsO2Dse2DuO2Eje2EsO2Ese2EtO2EuO2Euu2FgO2Fge2Fg+2FhO2Fhe2FjO2Fje2FkO2FlO2FnO2Fne2Fn+2Foe2FqO2FrO2FvO2GhO2GiO2GoO2Goe2GpO2GqO2GsO2Gse2Gs+2Gte2Guu2GvO2HgO2HmO2HtO2HuO2Ih+2Iie2IkO2IrO2Ire2IsO2ItO2IvO2Ive2Iv+2Jge2JiO2JnFwiXG5cdF0sXG5cdFtcblx0XHRcImM2NDFcIixcblx0XHRcIu2eje2eju2ej+2ekVwiLFxuXHRcdDYsXG5cdFx0XCLtnprtnpztnp5cIixcblx0XHQ1XG5cdF0sXG5cdFtcblx0XHRcImM2YTFcIixcblx0XHRcIu2JpO2KgO2Kge2KhO2KiO2KkO2Kke2Kle2KnO2KoO2KpO2KrO2Kse2KuO2Kue2KvO2Kv+2LgO2Lgu2LiO2Lie2Li+2LlO2LmO2LnO2LpO2Lpe2LsO2Lse2LtO2LuO2MgO2Mge2Mg+2Mhe2MjO2Mje2Mju2MkO2MlO2Mlu2MnO2Mne2Mn+2MoO2Moe2Mpe2MqO2Mqe2MrO2MsO2MuO2Mue2Mu+2MvO2Mve2NhO2Nhe2NvO2Nve2OgO2OhO2OjO2Oje2Oj+2OkO2Oke2OmO2Ome2OnO2OoO2OqO2Oqe2Oq+2Ore2OtO2OuO2OvO2PhO2Phe2PiO2Pie2PkO2PmO2Poe2Po+2PrO2Pre2PsO2PtO2PvO2Pve2Pv+2QgVwiXG5cdF0sXG5cdFtcblx0XHRcImM3YTFcIixcblx0XHRcIu2QiO2Qne2RgO2RhO2RnO2RoO2RpO2Rre2Rr+2RuO2Rue2RvO2Rv+2SgO2Sgu2SiO2Sie2Si+2Sje2SlO2Sqe2TjO2TkO2TlO2TnO2Tn+2TqO2TrO2TsO2TuO2Tu+2Tve2UhO2UiO2UjO2UlO2Ule2Ul+2UvO2Uve2VgO2VhO2VjO2Vje2Vj+2Vke2VmO2Vme2VnO2VoO2Vpe2VqO2Vqe2Vq+2Vre2VtO2Vte2VuO2VvO2WhO2Whe2Wh+2WiO2Wie2WkO2Wpe2XiO2Xie2XjO2XkO2Xku2XmO2Xme2Xm+2Xne2XpO2Xpe2XqO2XrO2XtO2Xte2Xt+2Xue2YgO2Yge2YhO2YiO2YkO2Yke2Yk+2YlO2Yle2YnO2YoFwiXG5cdF0sXG5cdFtcblx0XHRcImM4YTFcIixcblx0XHRcIu2YpO2Yre2YuO2Yue2YvO2ZgO2Zhe2ZiO2Zie2Zi+2Zje2Zke2ZlO2Zle2ZmO2ZnO2Zp+2Zqe2ZsO2Zse2ZtO2ag+2ahe2ajO2aje2akO2alO2ane2an+2aoe2aqO2arO2asO2aue2au+2bhO2bhe2biO2bjO2bke2blO2bl+2bme2boO2bpO2bqO2bsO2bte2bvO2bve2cgO2chO2cke2cmO2cme2cnO2coO2cqO2cqe2cq+2cre2ctO2cte2cuO2cvO2dhO2dh+2die2dkO2dke2dlO2dlu2dl+2dmO2dme2doO2doe2do+2dpe2dqe2drO2dsO2dtO2dvO2dve2ege2eiO2eie2ejO2ekO2emO2eme2em+2enVwiXG5cdF0sXG5cdFtcblx0XHRcImNhYTFcIixcblx0XHRcIuS8veS9s+WBh+WDueWKoOWPr+WRteWTpeWYieWrgeWutuaah+aetuaet+afr+atjOePgueXgueovOiLm+iMhOihl+iiiOiotuiziOi3j+i7u+i/pumnleWIu+WNtOWQhOaBquaFpOauvOePj+iEmuimuuinkumWo+S+g+WIiuWivuWluOWnpuW5suW5ueaHh+aPgOadhuafrOahv+a+l+eZjueci+ejteeoiOerv+ewoeiCneiJruiJseirq+mWk+S5q+WWneabt+a4tOeio+erreiRm+ikkOidjumeqOWLmOWdjuWgquW1jOaEn+aGvuaIoeaVouafkeaphOa4m+eUmOeWs+ebo+eesOe0uumCr+mRkemRkum+lVwiXG5cdF0sXG5cdFtcblx0XHRcImNiYTFcIixcblx0XHRcIuWMo+WyrOeUsuiDm+mJgOmWmOWJm+WgiOWnnOWyoeW0l+W6t+W8uuW9iuaFt+axn+eVuueWhuezoOe1s+e2see+jOiFlOiIoeiWkeilgeism+mLvOmZjemxh+S7i+S7t+WAi+WHseWhj+aEt+aEvuaFqOaUueanqua8keeWpeeahueblueuh+iKpeiTi++kgOmOp+mWi+WWgOWuouWdke+kgeeys+e+uemGteWAqOWOu+WxheW3qOaLkuaNruaTmuaTp+a4oOeCrOelm+i3nei4nu+kgumBvemJhemLuOS5vuS7tuWBpeW3vuW7uuaEhuall+iFseiZlOi5h+mNtemoq+S5nuWCkeadsOahgOWEieWKjeWKkuaqolwiXG5cdF0sXG5cdFtcblx0XHRcImNjYTFcIixcblx0XHRcIueevOmIkOm7lOWKq+aAr+i/suWBiOaGqeaPreaTiuagvOaqhOa/gOiGiOimoemalOWgheeJveeKrOeUhOe1uee5reiCqeimi+ittOmBo+m1keaKieaxuua9lOe1kOe8uuioo+WFvOaFiueuneismemJl+mOjOS6rOS/k+WAnuWCvuWEhuWLgeWLjeWNv+WdsOWig+W6muW+keaFtuaGrOaTjuaVrOaZr+aau+abtOail+a2h+eCheeDseeSn+eSpeeTiueXmeehrOejrOern+ertue1hee2k+iAleiAv+iEm+iOluitpui8lemAlemPoemgg+mguOmpmumvqOS/guWVk+WguuWlkeWto+WxhuaCuOaIkuahguaisFwiXG5cdF0sXG5cdFtcblx0XHRcImNkYTFcIixcblx0XHRcIuajqOa6queVjOeZuOejjueoveezu+e5q+e5vOioiOiqoeiwv+majum3hOWPpOWPqeWRiuWRseWbuuWnkeWtpOWwu+W6q+aLt+aUt+aVheaVsuaaoOaer+angeayveeXvOeakOedvueov+e+lOiAg+iCoeiGj+iLpuiLveiPsOiXgeigseiitOiqpe+kg+i+nOmMrumbh+mhp+mrmOm8k+WTreaWm+absuaij+epgOiwt+m1oOWbsOWdpOW0keaYhuaiseajjea7vueQqOiinumvpOaxqO+khOmqqOS+m+WFrOWFseWKn+WtlOW3peaBkOaBreaLseaOp+aUu+ePmeepuuiao+iyoumej+S4suWvoeaIiOaenOeTnFwiXG5cdF0sXG5cdFtcblx0XHRcImNlYTFcIixcblx0XHRcIuenkeiPk+iqh+iqsui3qOmBjumNi+mhhuW7k+anqOiXv+mDre+kheWGoOWumOWvrOaFo+ajuuasvueBjOeQr+eTmOeuoee9kOiPheingOiyq+mXnOmkqOWIruaBneaLrOmAguS+iuWFieWMoeWjmeW7o+aboOa0uOeCmueLguePluetkOiDsemRm+WNpuaOm+e9q+S5luWCgOWhiuWjnuaAquaEp+aLkOankOmtgeWuj+e0mOiCsei9n+S6pOWDkeWSrOWWrOWsjOW2oOW3p+aUquaVjuagoeapi+eLoeeajuefr+e1nue/ueiGoOiVjuibn+i8g+i9jumDiumkg+mplemuq+S4mOS5heS5neS7h+S/seWFt+WLvlwiXG5cdF0sXG5cdFtcblx0XHRcImNmYTFcIixcblx0XHRcIuWNgOWPo+WPpeWSjuWYlOWdteWeouWvh+W2h+W7kOaHvOaLmOaVkeaeuOafqeani+atkOavhuavrOaxgua6neeBuOeLl+eOlueQg+eev+efqeeptue1v+iAieiHvOiIheiIiuiLn+ihouiss+izvOi7gOmAkemCsemJpOmKtumnkumphemzqem3l+m+nOWci+WxgOiPiumeoOmeq+m6tOWQm+eqmOe+pOijmei7jemDoeWggOWxiOaOmOeqn+WuruW8k+epueeqruiKjui6rOWApuWIuOWLuOWNt+WciOaLs+aNsuasiua3g+ect+WOpeeNl+iVqOi5tumXleacuuarg+a9sOiprei7jOmli++khuaZt+atuOiytFwiXG5cdF0sXG5cdFtcblx0XHRcImQwYTFcIixcblx0XHRcIumsvO+kh+WPq+WcreWljuaPhuanu+ePquehheequuerheezvuiRteimj+i1s+mAtemWqOWLu+Wdh+eVh+etoOiPjOmInu+kiOapmOWFi+WJi+WKh+aIn+ajmOaltemameWDheWKpOWLpOaHg+aWpOagueanv+eRvueti+iKueiPq+imsuisuei/kemlie+kieS7iuWml+aTkuaYkeaqjueQtOemgeemveiKqeihvuihv+iln++kiumMpuS8i+WPiuaApeaJseaxsue0mue1puS6mOWFouefnOiCr+S8geS8juWFtuWGgOWXnOWZqOWcu+WfuuWfvOWklOWlh+Wmk+WvhOWykOW0juW3seW5vuW/jOaKgOaXl+aXo1wiXG5cdF0sXG5cdFtcblx0XHRcImQxYTFcIixcblx0XHRcIuacnuacn+adnuaji+ajhOapn+asuuawo+axveaygua3h+eOmOeQpueQqueSgueSo+eVuOeVv+eigeejr+elgeelh+eliOeluueulee0gOe2uue+iOiAhuiAreiCjOiomOitj+ixiOi1t+mMoemMpOmjoumlkemojumoj+mppem6kue3iuS9tuWQieaLruahlOmHkeWWq+WEuu+ki++kjOWonOaHpu+kjeaLj+aLv++kjlwiLFxuXHRcdDUsXG5cdFx0XCLpgqPvpJRcIixcblx0XHQ0LFxuXHRcdFwi6Ku+76SZ76Sa76Sb76Sc5pqW76Sd54WW76Se76Sf6Zuj76Sg5o2P5o265Y2X76Sh5p6P5qWg5rmz76Si55S376Sj76Sk76SlXCJcblx0XSxcblx0W1xuXHRcdFwiZDJhMVwiLFxuXHRcdFwi57SN76Sm76Sn6KGy5ZuK5aiY76SoXCIsXG5cdFx0NCxcblx0XHRcIuS5g++kreWFp+WliOafsOiAkO+kruWls+W5tOaSmueniuW/teaBrOaLiOaNu+Wvp+Wvl+WKqu+kr+WltOW8qeaAku+ksO+kse+ksueRme+ks1wiLFxuXHRcdDUsXG5cdFx0XCLpp5HvpLlcIixcblx0XHQxMCxcblx0XHRcIua/g++lhO+lheiGv+i+suaDse+lhu+lh+iFpu+liO+lieWwv++lilwiLFxuXHRcdDcsXG5cdFx0XCLlq6noqKXmnbvntJDvpZJcIixcblx0XHQ1LFxuXHRcdFwi6IO976WY76WZ5bC85rOl5Yy/5rq65aSa6Iy2XCJcblx0XSxcblx0W1xuXHRcdFwiZDNhMVwiLFxuXHRcdFwi5Li55Lq25L2G5Zau5ZyY5aOH5b2W5pa35pem5qqA5q615rmN55+t56uv57Ce57ee6JuL6KKS6YSy6Y2b5pK75r6+542655a46YGU5ZWW5Z2N5oa65pOU5puH5reh5rmb5r2t5r6555ew6IGD6Ia96JWB6KaD6KuH6K2a6Yyf5rKT55WT562U6LiP6YGd5ZSQ5aCC5aGY5bmi5oiH5pKe5qOg55W257OW6J6z6buo5Luj5Z6I5Z2u5aSn5bCN5bKx5bi25b6F5oi05pOh546z6Ie66KKL6LK46ZqK6bub5a6F5b635oKz5YCS5YiA5Yiw5ZyW5aC15aGX5bCO5bGg5bO25baL5bqm5b6S5oK85oyR5o6J5pCX5qGDXCJcblx0XSxcblx0W1xuXHRcdFwiZDRhMVwiLFxuXHRcdFwi5qO55quC5reY5rih5ruU5r+k54e+55uc552556ax56i76JCE6Kap6LOt6Lez6LmI6YCD6YCU6YGT6YO96Y2N6Zm26Z+c5q+S54CG54mY54qi542o552j56a/56+k57qb6K6A5aKp5oOH5pWm5pe95pq+5rKM54Se54eJ6LGa6aCT5Lmt56qB5Lud5Yas5YeN5YuV5ZCM5oan5p2x5qGQ5qOf5rSe5r2855a8556z56ul6IO06JGj6YqF5YWc5paX5p2c5p6T55eY56uH6I2z76Wa6LGG6YCX6aCt5bGv6IeA6Iqa6YGB6YGv6YiN5b6X5bad5qmZ54eI55m7562J6Jek6KyE6YSn6aiw5ZaH5oe276Wb55mp576FXCJcblx0XSxcblx0W1xuXHRcdFwiZDVhMVwiLFxuXHRcdFwi6Ji/6J666KO46YKP76Wc5rSb54OZ54+e57Wh6JC976Wd6YWq6aex76We5LqC5Y215qyE5qyS54C+54ib6Jit6bie5YmM6L6j5bWQ5pOl5pSs5qyW5r+r57GD57qc6JeN6KWk6Ka95ouJ6IeY6KCf5buK5pyX5rWq54u855CF55Gv6J6C6YOe5L6G5bSN5b6g6JCK5Ya35o6g55Wl5Lqu5YCG5YWp5YeJ5qKB5qiR57Ku57Kx57On6Imv6KuS6Lyb6YeP5L625YS35Yu15ZGC5bus5oWu5oi+5peF5qua5r++56Sq6Jec6KCj6Zat6ami6amq6bqX6buO5Yqb5puG5q2354Cd56Sr6L2i6Z2C5oaQ5oiA5pSj5ryjXCJcblx0XSxcblx0W1xuXHRcdFwiZDZhMVwiLFxuXHRcdFwi54WJ55KJ57e06IGv6JOu6Lym6YCj6Y2K5Ya95YiX5Yqj5rSM54OI6KOC5buJ5paC5q6u5r+C57C+54215Luk5Ly25Zu576Wf5bK65ba65oCc546y56yt576a57+O6IGG6YCe6Yi06Zu26Z2I6aCY6b2h5L6L5r6n56au6Ya06Zq35Yue76Wg5pKI5pOE5quT5r2e54CY54iQ55un6ICB6JiG6Jmc6Lev6LyF6Zyy6a2v6be66bm156KM56W/57ag6I+J6YyE6bm/6bqT6KuW5aOf5byE5pyn54Cn55OP57Gg6IG+5YSh54Co54mi56OK6LOC6LOa6LO06Zu35LqG5YOa5a+u5buW5paZ54eO55mC556t6IGK6JO8XCJcblx0XSxcblx0W1xuXHRcdFwiZDdhMVwiLFxuXHRcdFwi6YG86ayn6b6N5aOY5amB5bGi5qiT5rea5ryP55i757Sv57i36JSe6KS46Y+k6ZmL5YqJ5peS5p+z5qa05rWB5rqc54CP55CJ55Gg55WZ55ik56Gr6Kys6aGe5YWt5oiu6Zm45L6W5YCr5bSZ5req57a46Lyq5b6L5oWE5qCX76Wh6ZqG5YuS6IKL5Yec5YeM5qWe56ic57a+6I+x6Zm15L+a5Yip5Y6Y5ZCP5ZSO5bGl5oKn5p2O5qKo5rWs54qB54u455CG55KD76Wi55ei57Gs572557646I6J6KOP6KOh6YeM6YeQ6Zui6a+J5ZCd5r2+54eQ55KY6Je66Lqq6Zqj6bGX6bqf5p6X5reL55Cz6Ieo6ZyW56CsXCJcblx0XSxcblx0W1xuXHRcdFwiZDhhMVwiLFxuXHRcdFwi56uL56yg57KS5pGp55Gq55ey56K856Oo6aas6a2U6bq75a+e5bmV5ryg6Iac6I6r6YKI5LiH5Y2N5aip5beS5b2O5oWi5oy95pmp5pu85ru/5ryr54Gj556e6JCs6JST6KC76LyT6aWF6bC75ZSc5oq55pyr5rKr6IyJ6KWq6Z265Lqh5aaE5b+Y5b+Z5pyb57ay572U6IqS6Iyr6I696Lye6YKZ5Z+L5aa55aqS5a+Q5pin5p6a5qKF5q+P54Wk57216LK36LOj6YKB6a2F6ISI6LKK6ZmM6amA6bql5a2f5rCT54yb55uy55uf6JCM5Yaq6KaT5YWN5YaV5YuJ5qOJ5rKU55yE55yg57a/57es6Z2i6bq15ruFXCJcblx0XSxcblx0W1xuXHRcdFwiZDlhMVwiLFxuXHRcdFwi6JSR5Yal5ZCN5ZG95piO5pqd5qSn5rqf55q/556R6IyX6JOC6J6f6YWp6YqY6bO06KKC5L6u5YaS5Yuf5aeG5bi95oWV5pG45pG55pqu5p+Q5qih5q+N5q+b54mf54mh55GB55y455+b6ICX6Iq86IyF6KyA6Kyo6LKM5pyo5rKQ54mn55uu552m56mG6bap5q2/5rKS5aSi5pym6JKZ5Y2v5aKT5aaZ5buf5o+P5pi05p2z5ri654yr56uX6IuX6Yyo5YuZ5ber5oau5oeL5oiK5ouH5pKr5peg5qWZ5q2m5q+L54Sh54+355Wd57mG6Iie6IyC6JWq6Kqj6LK/6Zyn6bWh5aKo6buY5YCR5YiO5ZC75ZWP5paHXCJcblx0XSxcblx0W1xuXHRcdFwiZGFhMVwiLFxuXHRcdFwi5rG257SK57SL6IGe6JqK6ZaA6Zuv5Yu/5rKV54mp5ZGz5aqa5bC+5bWL5b2M5b6u5pyq5qK25qWj5ri85rmE55yJ57Gz576O6JaH6KyO6L+36Z2h6bu05bK35oK25oSN5oar5pWP5pe75pe85rCR5rOv546f54+J57eh6ZaU5a+G6Jyc6KyQ5Ymd5Y2a5ouN5pCP5pKy5py05qi45rOK54+A55Ke566U57KV57ib6IaK6Ii26JaE6L+r6Zu56aeB5Ly05Y2K5Y+N5Y+b5ouM5pCs5pSA5paR5qeD5rOu5r2Y54+t55WU55ii55uk55u856OQ56O756Ss57WG6Iis6J+g6L+U6aCS6aOv5YuD5ouU5pKl5rik5r2RXCJcblx0XSxcblx0W1xuXHRcdFwiZGJhMVwiLFxuXHRcdFwi55m86LeL6Yax6Ymi6auu6a2D5YCj5YKN5Z2K5aao5bCo5bmH5b235oi/5pS+5pa55peB5piJ5p6L5qac5ruC56OF57Sh6IKq6IaA6Iir6Iqz6JKh6JqM6Kiq6KyX6YKm6Ziy6b6Q5YCN5L+z76Wj5Z+55b6Y5ouc5o6S5p2v5rmD54SZ55uD6IOM6IOa6KO06KO16KSZ6LOg6Lyp6YWN6Zmq5Lyv5L2w5bib5p+P5qCi55m955m+6a2E5bmh5qiK54Wp54eU55Wq76Wk57mB6JWD6Jep6aOc5LyQ562P572w6Zal5Yeh5biG5qK15rC+5rGO5rOb54qv56+E6IyD5rOV55C65YO75YqI5aOB5pOY5qqX55Kn55mWXCJcblx0XSxcblx0W1xuXHRcdFwiZGNhMVwiLFxuXHRcdFwi56Kn6JiX6Zei6Zy576Wl5Y2e5byB6K6K6L6o6L6v6YKK5Yil556l6bGJ6byI5LiZ5YCC5YW15bGb5bm35pie5pi65p+E5qOF54Kz55SB55eF56eJ56ud6Lyn6aSg6aiI5L+d5aCh5aCx5a+25pmu5q2l5rSR5rm65r2954+k55Sr6I+p6KOc6KST6K2c6LyU5LyP5YOV5YyQ5Y2c5a6T5b6p5pyN56aP6IW56Iyv6JSU6KSH6KaG6Ly56Ly76aal6bCS5pys5Lm25L+45aWJ5bCB5bOv5bOw5o2n5qOS54O954ai55Cr57ir6JOs6JyC6YCi6YuS6bOz5LiN5LuY5L+v5YKF5YmW5Ymv5ZCm5ZKQ5Z+g5aSr5ammXCJcblx0XSxcblx0W1xuXHRcdFwiZGRhMVwiLFxuXHRcdFwi5a2a5a215a+M5bqc76Wm5om25pW35pan5rWu5rql54i256ym57C/57y26IWQ6IWR6Iaa6ImA6IqZ6I6p6KiD6LKg6LOm6LO76LW06La66YOo6Yec6Zic6ZmE6aeZ6bOn5YyX5YiG5ZCp5Zm05aKz5aWU5aWu5b+/5oak5omu5piQ5rG+54Sa55uG57KJ57Oe57Sb6Iqs6LOB6Zuw76Wn5L2b5byX5b2/5ouC5bSp5pyL5qOa56G857mD6bWs5LiV5YKZ5YyV5Yyq5Y2R5aaD5ami5bqH5oKy5oaK5omJ5om55paQ5p6H5qan5q+U5q+W5q+X5q+Y5rK476Wo55C155e656CS56KR56eV56eY57KD57eL57+h6IKlXCJcblx0XSxcblx0W1xuXHRcdFwiZGVhMVwiLFxuXHRcdFwi6IS+6IeC6I+y6Jya6KOo6Kq56K2s6LK76YSZ6Z2e6aOb6by75Zqs5ayq5b2s5paM5qqz5q6v5rWc5r+x54CV54md546t6LKn6LOT6aC75oaR5rC36IGY6aiB5LmN5LqL5Lqb5LuV5Ly65Ly85L2/5L+f5YO/5Y+y5Y+45ZSG5Zej5Zub5aOr5aWi5aiR5a+r5a+65bCE5bez5bir5b6Z5oCd5o2o5pac5pav5p+25p+75qKt5q275rKZ5rOX5rij54CJ542F56CC56S+56WA56Wg56eB56+p57SX57Wy6IKG6IiN6I6O6JOR6JuH6KOf6KmQ6Kme6Kyd6LOc6LWm6L6t6YKq6aO86aef6bqd5YmK76Wp5pyU76WqXCJcblx0XSxcblx0W1xuXHRcdFwiZGZhMVwiLFxuXHRcdFwi5YKY5Yiq5bGx5pWj5rGV54+K55Sj55ad566X6JKc6YW46Zyw5Lm35pKS5q6654We6Jap5LiJ76Wr5p2J5qOu5riX6Iqf6JSY6KGr5o+35r6B6YiS6aKv5LiK5YK35YOP5YSf5ZWG5Zaq5ZiX5a2A5bCZ5bOg5bi45bqK5bqg5buC5oOz5qGR5qmh5rmY54i954mA54uA55u456Wl566x57+U6KOz6Ke06Kmz6LGh6LOe6Zyc5aGe55K96LO95ZeH76Ws56mh57Si6Imy54my55Sf55Sl76Wt56yZ5aKF5aO75ba85bqP5bq25b6Q5oGV5oqS5o2/5pWN5pqR5puZ5pu45qCW5qOy54qA55Ge562u57Wu57eW572yXCJcblx0XSxcblx0W1xuXHRcdFwiZTBhMVwiLFxuXHRcdFwi6IOl6IiS6Jav6KW/6KqT6YCd6Yuk6buN6byg5aSV5aWt5bit5oOc5piU5pmz5p6Q5rGQ5reF5r2f55+z56Kp6JOG6YeL6Yyr5LuZ5YOK5YWI5ZaE5ayL5a6j5omH5pW+5peL5riy54W955CB55GE55KH55K/55ms56aq57ea57mV576o6IW66Iaz6Ii56Jia6J+s6Km16Lej6YG46YqR6ZCl6aWN6a6u5Y2o5bGR5qWU5rOE5rSp5rir6IiM6Jab6KS76Kit6Kqq6Zuq6b2n5Ymh5pq55q6y57qW6J++6LSN6ZaD6Zmd5pSd5raJ54eu76Wu5Z+O5aeT5a6s5oCn5oO65oiQ5pif5pmf54yp54+555ub55yB562sXCJcblx0XSxcblx0W1xuXHRcdFwiZTFhMVwiLFxuXHRcdFwi6IGW6IGy6IWl6Kqg6YaS5LiW5Yui5q2y5rSX56iF56y557Sw76Wv6LKw5Y+s5Ziv5aGR5a615bCP5bCR5bei5omA5o6D5pCU5pit5qKz5rK85raI5rqv54Cf54Kk54eS55Sm55aP55aO55iZ56yR56+g57Cr57Sg57S56JSs6JWt6JiH6Ki06YCN6YGh6YK16Yq36Z+26ai35L+X5bGs5p2f5raR57Kf57qM6KyW6LSW6YCf5a2r5be95pCN6JOA6YGc6aOh546H5a6L5oKa5p2+5ree6Kif6Kqm6YCB6aCM5Yi376Ww54GR56KO6Y6W6KGw6YeX5L+u5Y+X5Ze95Zua5Z6C5aO95auC5a6I5bKr5bOA5bil5oSBXCJcblx0XSxcblx0W1xuXHRcdFwiZTJhMVwiLFxuXHRcdFwi5oiN5omL5o6I5pCc5pS25pW45qi55q6K5rC05rSZ5ryx54en54up542455CH55Ky55im552h56eA56mX56uq57K557aP57as57mh576e6ISp6Iyx6JKQ6JOa6Jeq6KKW6Kqw6K6Q6Ly46YGC6YKD6YWs6YqW6Yq56ZqL6Zqn6Zqo6ZuW6ZyA6aCI6aaW6auT6aya5Y+U5aG+5aSZ5a2w5a6/5reR5r2a54af55Ch55K56IKF6I+95beh5b6H5b6q5oGC5pes5qCS5qWv5qmT5q6J5rS15rez54+j55u+556s562N57SU6ISj6Iic6I2A6JO06JWj6Kmi6KuE6YaH6Yye6aCG6aa05oiM6KGT6L+w6Yml5bSH5bSnXCJcblx0XSxcblx0W1xuXHRcdFwiZTNhMVwiLFxuXHRcdFwi5bWp55Gf6Iad6J2o5r+V5ou+57+S6KS26KWy5Lie5LmY5YOn5Yud5Y2H5om/5piH57mp6KCF6Zme5L6N5YyZ5Zi25aeL5aqk5bC45bGO5bGN5biC5byR5oGD5pa95piv5pmC5p6+5p+054yc55+i56S657+F6JKU6JON6KaW6Kmm6Kmp6Kuh6LGV6LG65Z+05a+U5byP5oGv5out5qSN5q6W5rmc54aE56+S6J2V6K2Y6Lu+6aOf6aO+5Ly45L6B5L+h5ZG75aig5a645oS85paw5pmo54e855Sz56We57Sz6IWO6Iej6I6Y6Jaq6JeO6JyD6KiK6Lqr6L6b76Wx6L+F5aSx5a6k5a+m5oKJ5a+p5bCL5b+D5rKBXCJcblx0XSxcblx0W1xuXHRcdFwiZTRhMVwiLFxuXHRcdFwi76Wy5rex54CL55Sa6Iqv6Ku25LuA5Y2B76Wz6ZuZ5rCP5Lqe5L+E5YWS5ZWe5ail5bOo5oiR54mZ6Iq96I6q6Ju+6KGZ6Kid6Zi/6ZuF6aST6bSJ6bWd5aCK5bKz5ba95bmE5oOh5oSV5o+h5qiC5ril6YSC6Y2U6aGO6bCQ6b235a6J5bK45oyJ5pmP5qGI55y86ZuB6Z6N6aGU6a6f5pah6KyB6LuL6Za85ZS15bKp5beW5bq15pqX55mM6I+06ZeH5aOT5oq854uO6bSo5Luw5aSu5oCP5pi75q6D56en6bSm5Y6T5ZOA5Z+D5bSW5oSb5puW5rav56KN6Im+6ZqY6Z2E5Y6E5om85o6W5ray57iK6IWL6aGNXCJcblx0XSxcblx0W1xuXHRcdFwiZTVhMVwiLFxuXHRcdFwi5qu7572M6bav6bia5Lmf5YC75Ya25aSc5oO55o+25qSw54i66IC276W06YeO5byx76W176W257SE6Iul6JGv6JK76Jel6LqN76W35L2v76W476W55aOk5a2D5oGZ5o+a5pSY5pWt5pqY76W65qWK5qij5rSL54CB54Ws55eS55iN56az56mw76W7576K76W86KWE76W96K6T6YeA6Zm976W+6aSK5ZyE5b6h5pa85ryB55iA56am6Kqe6aat6a2a6b2s5YSE5oa25oqR5qqN6IeG5YGD5aCw5b2m54SJ6KiA6Ku65a286JiW5L+65YS85Zq05aWE5o6p5re55baq5qWt5YaG5LqI5L2Z76W/76aA76aB5aaC76aCXCJcblx0XSxcblx0W1xuXHRcdFwiZTZhMVwiLFxuXHRcdFwi76aD5q2f5rGd76aE55K156SW76aF6IiH6ImF6Iy56Ly/6L2d76aG6aSY76aH76aI76aJ5Lqm76aK5Z+f5b255piT76aL76aM55ar57m56K2v76aN6YCG6amb5Zql5aCn5ae45aif5a6076aO5bu276aP76aQ5o2Q5oy776aR5qS95rKH5rK/5raO5raT5re15ryU76aS54Of54S254WZ76aT54eD54eV76aU56GP56Gv76aV562157ej76aW57iv76aX6KGN6Luf76aY76aZ76aa6Ymb76ab6bO276ac76ad76ae5oKF5raF76af54ax76ag76ah6Zax5Y6t76ai76aj76ak5p+T76al54KO54Sw55Cw6Im26IuSXCJcblx0XSxcblx0W1xuXHRcdFwiZTdhMVwiLFxuXHRcdFwi76am6Za76aul6bm95puE76an54eB6JGJ76ao76ap5aGL76aq76ar5ba45b2x76as5pig5pqO5qW55qau5rC45rOz5ri25r2B5r+a54Cb54Cv54WQ54ef542w76at55Gb76au55OU55uI56mO57qT76av76aw6Iux6Kmg6L+O76ax6Y2I76ay6ZyZ76az76a05LmC5YCq76a15YiI5Y+h5puz5rGt5r+K54yK552/56mi6Iqu6Jed6JiC76a26KOU6Kmj6K296LGr76a36Yqz76a46ZyT6aCQ5LqU5LyN5L+J5YKy5Y2I5ZC+5ZCz5Zea5aGi5aK65aWn5aib5a+k5oKf76a55oeK5pWW5pe/5pmk5qKn5rGa5r6zXCJcblx0XSxcblx0W1xuXHRcdFwiZThhMVwiLFxuXHRcdFwi54OP54as542S56296JyI6Kqk6bCy6byH5bGL5rKD542E546J6Yi65rqr55Gl55if56mp57iV6JiK5YWA5aOF5pOB55Ou55SV55mw57+B6YKV6ZuN6aWU5rim55Om56qp56qq6Iel6JuZ6J246Kib5amJ5a6M5a6b5qKh5qSA5rWj546p55CT55Cs56KX57ep57+r6ISY6IWV6I6e6LGM6Ziu6aCR5puw5b6A5pe65p6J5rGq546L5YCt5aiD5q2q55+u5aSW5bWs5beN54yl55WP76a676a75YOl5Ye55aCv5aSt5aaW5aea5a+l76a876a95bai5ouX5pCW5pKT5pO+76a+5puc76a/5qmI76eA54e/55Gk76eBXCJcblx0XSxcblx0W1xuXHRcdFwiZTlhMVwiLFxuXHRcdFwi56qI56qv57mH57me6ICA6IWw76eC6J+v6KaB6Kyg6YGZ76eD6YKA6aWS5oW+5qyy5rW057if6KSl6L6x5L+R5YKt5YaX5YuH5Z+H5aKJ5a655bq45oWC5qaV5raM5rmn5rq254aU55Gi55So55Ss6IGz6Iy46JOJ6LiK6Y6U6Y+e76eE5LqO5L2R5YG25YSq5Y+I5Y+L5Y+z5a6H5a+T5bCk5oSa5oaC5pe054mb546X55GA55uC56WQ56aR56a557SG57696IqL6JeV6Jme6L+C6YGH6YO16Yeq6ZqF6Zuo6Zup5YuW5b2n5pet5pix5qCv54Wc56i26YOB6aCK5LqR76eF5qmS5q6e5r6Q54aJ6ICY6Iq46JWTXCJcblx0XSxcblx0W1xuXHRcdFwiZWFhMVwiLFxuXHRcdFwi6YGL6ZqV6Zuy6Z+76JSa6ayx5LqQ54aK6ZuE5YWD5Y6f5ZOh5ZyT5ZyS5Z6j5aqb5auE5a+D5oCo5oS/5o+05rKF5rS55rmy5rqQ54iw54y/55GX6IuR6KKB6L2F6YGg76eG6Zmi6aGY6bSb5pyI6LaK6Yme5L2N5YGJ5YOe5Y2x5ZyN5aeU5aiB5bCJ5oWw5pqQ5rit54iy55GL57ev6IOD6JCO6JGm6JS/6J2f6KGb6KSY6KyC6YGV6Z+L6a2P5Lmz5L6R5YSS5YWq76eH5ZSv5Zap5a265a6l5bm85bm95bq+5oKg5oOf5oSI5oSJ5o+E5pS45pyJ76eI5p+U5p+a76eJ5qWh5qWi5rK55rSn76eK5ri476eLXCJcblx0XSxcblx0W1xuXHRcdFwiZWJhMVwiLFxuXHRcdFwi5r+h54y254y376eM55Gc55Sx76eN55mS76eO76eP57at6Ie+6JC46KOV6KqY6Kub6Kut6Liw6LmC6YGK6YC+6YG66YWJ6YeJ6Y2u76eQ76eR5aCJ76eS5q+T6IKJ6IKy76eT76eU5YWB5aWr5bC576eV76eW5r2k546n6IOk6LSH76eX6YiX6ZaP76eY76eZ76ea76eb6IG/5oiO54Cc57Wo6J6N76ec5Z6g5oGp5oWH5q636Kq+6YqA6Zqx5LmZ5ZCf5rer6JSt6Zmw6Z+z6aOu5o+W5rOj6YKR5Yed5oeJ6Ia66be55L6d5YCa5YSA5a6c5oSP5oe/5pOs5qSF5q+F55aR55+j576p6Imk6JaP6J+76KGj6Kq8XCJcblx0XSxcblx0W1xuXHRcdFwiZWNhMVwiLFxuXHRcdFwi6K2w6Yar5LqM5Lul5LyK76ed76ee5aS35aeo76ef5bey5byb5b2b5oCh76eg76eh76ei76ej54i+54+l76ek55Ww55eN76el56e776em6ICM6ICz6IKE6Iuh6I2R76en76eo6LK96LKz6YKH76ep76eq6aO06aSM76er76es54C355uK57+K57+M57+86Kya5Lq65LuB5YiD5Y2w76et5ZK95Zug5ae75a+F5byV5b+N5rmu76eu76ev57Wq6Iy176ew6JqT6KqN76ex6Z2t6Z2376ey76ez5LiA5L2a5L2+5aO55pel5rqi6YC46Y6w6aa55Lu75aOs5aaK5aeZ5oGB76e076e156iU76e26I2P6LOD5YWl5Y2EXCJcblx0XSxcblx0W1xuXHRcdFwiZWRhMVwiLFxuXHRcdFwi76e376e476e55LuN5Ymp5a2V6Iq/5LuU5Yi65ZKo5aeJ5ae/5a2Q5a2X5a2c5oGj5oWI5ruL54KZ54Wu546G55O355a156OB57Sr6ICF6Ieq6Iyo6JSX6JeJ6Kuu6LOH6ZuM5L2c5Yu65Zq85par5pio54G854K454i157a96IqN6YWM6ZuA6bWy5a2x5qOn5q6Y5r2655ue5bKR5pqr5r2b566057Cq6KC26Zuc5LiI5LuX5Yyg5aC05aK75aOv5aWs5bCH5biz5bqE5by15o6M5pqy5p2W5qif5qqj5qyM5ry/54mG76e6542Q55KL56ug57Kn6IW46Ief6Ien6I6K6JGs6JSj6JaU6JeP6KOd6LST6Yas6ZW3XCJcblx0XSxcblx0W1xuXHRcdFwiZWVhMVwiLFxuXHRcdFwi6Zqc5YaN5ZOJ5Zyo5a6w5omN5p2Q5qC95qKT5ri95ruT54G957ih6KOB6LKh6LyJ6b2L6b2O54it566P6KuN6Yya5L2H5L2O5YSy5ZKA5aeQ5bqV5oq15p215qWu5qiX5rKu5ria54uZ54yq55a9566457S16Iun6I+56JGX6Je36Kmb6LKv6LqH6YCZ6YK46ZuO6b2f5Yuj5ZCK5auh5a+C5pGY5pW15ru054uE76e755qE56mN56yb57GN57i+57+f6I276Kyr6LOK6LWk6Leh6Lmf6L+q6L+56YGp6Y+R5L2D5L265YKz5YWo5YW45YmN5Ymq5aGh5aG85aWg5bCI5bGV5bub5oKb5oiw5qCT5q6/5rCI5r6xXCJcblx0XSxcblx0W1xuXHRcdFwiZWZhMVwiLFxuXHRcdFwi54WO55Cg55Sw55S455WR55my562M566L566t56+G57qP6Kmu6Ly+6L2J6Yi/6YqT6Yyi6ZCr6Zu76aGa6aGr6aSe5YiH5oiq5oqY5rWZ55mk56uK56+A57W25Y2g5bK+5bqX5ry454K557KY6ZyR6a6O6bue5o6l5pG66J225LiB5LqV5Lqt5YGc5YG15ZGI5aeD5a6a5bmA5bqt5bu35b6B5oOF5oy65pS/5pW05peM5pm25pm45p++5qWo5qqJ5q2j5rGA5reA5reo5rif5rme54Ce54Kh546O54+955S6552b56KH56aO56iL56m957K+57aO6ImH6KiC6Kuq6LKe6YSt6YWK6YeY6Ymm6YuM6Yyg6ZyG6Z2WXCJcblx0XSxcblx0W1xuXHRcdFwiZjBhMVwiLFxuXHRcdFwi6Z2c6aCC6byO5Yi25YqR5ZW85aCk5bid5byf5oKM5o+Q5qKv5r+f56Wt56ys6IeN6Ja66KO96Ku46LmE6YaN6Zmk6Zqb6Zy96aGM6b2K5L+O5YWG5YeL5Yqp5Ziy5byU5b2r5o6q5pON5pep5pmB5pu65pu55pyd5qKd5qOX5qe95ryV5r2u54Wn54el54iq55Kq55y656WW56Wa56ef56ig56qV57KX57Of57WE57mw6IKH6Je76Jqk6KmU6Kq/6LaZ6LqB6YCg6YGt6Yej6Zi76ZuV6bOl5peP57CH6Laz6Y+D5a2Y5bCK5Y2S5ouZ54yd5YCn5a6X5b6e5oKw5oWr5qOV5reZ55Cu56iu57WC57ac57ix6IWrXCJcblx0XSxcblx0W1xuXHRcdFwiZjFhMVwiLFxuXHRcdFwi6Liq6Li16Y2+6ZCY5L2Q5Z2Q5bem5bqn5oyr572q5Li75L2P5L6P5YGa5aed6IOE5ZGq5ZGo5Ze+5aWP5a6Z5bee5bua5pmd5pyx5p+x5qCq5rOo5rSy5rmK5r6N54K354+g55aH57GM57SC57Ss57ai6Iif6Jub6Ki76KqF6LWw6LqK6Lyz6YCx6YWO6YWS6ZGE6aeQ56u557Kl5L+K5YSB5YeG5Z+I5a+v5bO75pmZ5qi95rWa5rqW5r+s54SM55Wv56uj6KCi6YCh6YG16ZuL6ae/6IyB5Lit5Luy6KGG6YeN5Y295qub5qWr5rGB6JG65aKe5oaO5pu+5ouv54Od55SR55eH57mS6JK46K2J6LSI5LmL5Y+qXCJcblx0XSxcblx0W1xuXHRcdFwiZjJhMVwiLFxuXHRcdFwi5ZKr5Zyw5Z2A5b+X5oyB5oyH5pGv5pSv5peo5pm65p6d5p6z5q2i5rGg5rKa5rys55+l56Cl56WJ56WX57SZ6IKi6ISC6Iez6Iqd6Iq36JyY6KqM76e86LSE6La+6YGy55u056iZ56i357mU6IG35ZSH5ZeU5aG15oyv5pCi5pmJ5pmL5qGt5qab5q6E5rSl5rqx54+N55Go55Kh55Wb55a555uh55ye556L56em57iJ57id6Ie76JSv6KKX6Ki66LOR6Lur6L6w6YCy6Y6t6Zmj6Zmz6ZyH5L6E5Y+x5aeq5auJ5biZ5qGO55OG55a+56ep56qS6Iaj6Jut6LOq6LeM6L+t5paf5pyV76e95Z+35r2X57ed6LyvXCJcblx0XSxcblx0W1xuXHRcdFwiZjNhMVwiLFxuXHRcdFwi6Y+26ZuG5b615oey5r6E5LiU5L6Y5YCf5Y+J5Zef5bWv5beu5qyh5q2k56OL566a76e+6LmJ6LuK6YGu5o2J5pC+552A56qE6Yyv6ZG/6b2q5pKw5r6v54em55Ko55Oa56uE57CS57qC57Ky57qY6K6a6LSK6ZG96aSQ6aWM5Yi55a+f5pOm5pyt57Su5YOt5Y+D5aG55oWY5oWZ5oe65pas56uZ6K6S6K6W5YCJ5YCh5Ym15ZSx5ai85bug5b2w5oS05pWe5piM5pi25pqi5qeN5ruE5ryy54yW55ih56qT6IS56ImZ6I+W6JK85YK15Z+w5a+A5a+o5b2p5o6h56Cm57a16I+c6JSh6YeH6Ye15YaK5p+1562WXCJcblx0XSxcblx0W1xuXHRcdFwiZjRhMVwiLFxuXHRcdFwi6LKs5YeE5aa75oK96JmV5YCc76e/5YmU5bC65oW95oia5ouT5pOy5pal5ruM55ig6ISK6Lmg6Zmf6Zq75Luf5Y2D5ZaY5aSp5bed5pOF5rOJ5re6546U56m/6Iib6Jam6LOk6LiQ6YG36Yen6Zeh6Zih6Z+G5Ye45ZOy5ZaG5b655pKk5r6I57a06Lyf6L2N6ZC15YOJ5bCW5rK+5re755Sb556757C957Gk6Km56KuC5aCe5aa+5biW5o2354mS55aK552r6Kuc6LK86LyS5buz5pm05re46IG96I+B6KuL6Z2R6a+W76iA5YmD5pu/5raV5ruv57eg6Kum6YCu6YGe6auU5Yid5Ym/5ZOo5oaU5oqE5oub5qKiXCJcblx0XSxcblx0W1xuXHRcdFwiZjVhMVwiLFxuXHRcdFwi5qSS5qWa5qi154KS54Sm56Gd56SB56SO56eS56iN6IKW6Im46IuV6I2J6JWJ6LKC6LaF6YWi6YaL6Yau5L+D5ZuR54et55+X6JyA6Ke45a+45b+W5p2R6YKo5Y+i5aGa5a+15oKk5oaB5pGg57i96IGw6JSl6YqD5pKu5YKs5bSU5pyA5aKc5oq95o6o5qSO5qW45qie5rmr55q656eL6Iq76JCp6KuP6Lao6L+96YSS6YWL6Yac6YyQ6YyY6Y6a6Zub6ai26bCN5LiR55Wc56Wd56u6562R56+J57iu6JOE6LmZ6Lm06Lu46YCQ5pil5qS/55GD5Ye65pyu6buc5YWF5b+g5rKW6J+y6KGd6KG35oK06Ia16JCDXCJcblx0XSxcblx0W1xuXHRcdFwiZjZhMVwiLFxuXHRcdFwi6LSF5Y+W5ZC55Zi05ai25bCx54KK57+g6IGa6ISG6Iet6Laj6YaJ6amf6bey5YG05LuE5Y6g5oO75ris5bGk5L6I5YCk5Zek5bOZ5bmf5oGl5qKU5rK75reE54a+55eU55e055mh56ia56mJ57eH57e7572u6Ie06Jqp6Lyc6ZuJ6aaz6b2S5YmH5YuF6aOt6Kaq5LiD5p+S5ryG5L615a+i5p6V5rKI5rW455Cb56Cn6Yed6Y286J+E56ek56ix5b+r5LuW5ZKk5ZS+5aKu5aal5oOw5omT5ouW5py25qWV6Ii16ZmA6aax6aed5YCs5Y2T5ZWE5Z2876iB5omY76iC5pOi5pmr5p+d5r+B5r+v55Ci55C46KiXXCJcblx0XSxcblx0W1xuXHRcdFwiZjdhMVwiLFxuXHRcdFwi6ZC45ZGR5ZiG5Z2m5b2I5oaa5q2O54GY54Kt57a76KqV5aWq6ISr5o6i55yI6IC96LKq5aGU5pCt5qa75a6V5biR5rmv76iD6JWp5YWM5Y+w5aSq5oCg5oWL5q6G5rGw5rOw56ye6IOO6IuU6LeG6YKw6aKx76iE5pOH5r6k5pKR5pSE5YWO5ZCQ5Zyf6KiO5oWf5qG276iF55eb562S57Wx6YCa5aCG5qeM6IW/6KSq6YCA6aC55YG45aWX5aas5oqV6YCP6ayq5oWd54m56ZeW5Z2h5amG5be05oqK5pKt5pO65p235rOi5rS+54is55C256C057236Iqt6Leb6aCX5Yik5Z2C5p2/54mI55Oj6LKp6L6m6YiRXCJcblx0XSxcblx0W1xuXHRcdFwiZjhhMVwiLFxuXHRcdFwi6Ziq5YWr5Y+t5o2M5L2p5ZSE5oKW5pWX5rKb5rW/54mM54u956iX6KaH6LKd5b2t5r6O54O56Iao5oSO5L6/5YGP5omB54mH56+H57eo57+p6YGN6Z6t6aiZ6LK25Z2q5bmz5p6w6JCN6KmV5ZCg5ayW5bmj5bui5byK5paD6IK66JS96ZaJ6Zmb5L2I5YyF5YyN5YyP5ZKG5ZO65ZyD5biD5oCW5oqb5oqx5o2V76iG5rOh5rWm55ax56Cy6IOe6ISv6Iue6JGh6JKy6KKN6KSS6YCL6Yuq6aO96a6R5bmF5pq05pud54CR54iG76iH5L+15Ym95b2q5oWT5p2T5qiZ5ryC55Oi56Wo6KGo6LG56aOH6aOE6amDXCJcblx0XSxcblx0W1xuXHRcdFwiZjlhMVwiLFxuXHRcdFwi5ZOB56if5qWT6Ku36LGK6aKo6aau5b285oqr55ay55qu6KKr6YG/6ZmC5Yy55by85b+F5rOM54+M55Wi55aL562G6Iu+6aad5LmP6YC85LiL5L2V5Y6m5aSP5buI5piw5rKz55GV6I236J2m6LOA6YGQ6Zye6bCV5aOR5a246JmQ6KyU6ba05a+S5oGo5oKN5pex5rGX5ryi5r6j54Ca572V57+w6ZaR6ZaS6ZmQ6Z+T5Ymy6L2E5Ye95ZCr5ZK45ZWj5ZaK5qq75ra157eY6Imm6Yqc6Zm36bm55ZCI5ZOI55uS6Juk6Zak6ZeU6Zmc5Lqi5LyJ5aeu5aum5be35oGS5oqX5p2t5qGB5rKG5riv57y46IKb6IiqXCJcblx0XSxcblx0W1xuXHRcdFwiZmFhMVwiLFxuXHRcdFwi76iI76iJ6aCF5Lql5YGV5ZKz5Z6T5aWa5a2p5a6z5oeI5qW35rW354Cj6J+56Kej6Kmy6Kun6YKC6aet6aq45Yq+5qC45YCW5bm45p2P6I2H6KGM5Lqr5ZCR5Zqu54+m6YSV6Z+/6aSJ6aWX6aaZ5ZmT5aKf6Jmb6Kix5oay5qu254276LuS5q2H6Zqq6amX5aWV54iA6LWr6Z2p5L+U5bO05bym5oe45pmb5rOr54Kr546E546554++55yp552N57WD57Wi57ij6Ii36KGS76iK6LOi6YmJ6aGv5a2R56m06KGA6aCB5auM5L+g5Y2U5aS+5bO95oy+5rW554u56ISF6ISH6I6i6YuP6aCw5Lqo5YWE5YiR5Z6LXCJcblx0XSxcblx0W1xuXHRcdFwiZmJhMVwiLFxuXHRcdFwi5b2i5rOC5ruO54CF54GQ54Kv54aS54+p55Gp6I2K6J6i6KGh6YCI6YKi6Y6j6aao5YWu5b2X5oOg5oWn5pqz6JWZ6LmK6Yav6Z6L5LmO5LqS5ZG85aOV5aO65aW95bK15byn5oi25omI5piK5pmn5q+r5rWp5reP5rmW5ru45r6U5r+g5r+p54Gd54uQ55Cl55Ga55Og55qT56Wc57OK57ie6IOh6Iqm6JGr6JK/6JmO6Jmf6J206K236LGq6Y6s6aCA6aGl5oOR5oiW6YW35ama5piP5re35ri+55C/6a2C5b+95oOa56yP5ZOE5byY5rGe5rOT5rSq54OY57SF6Jm56KiM6bS75YyW5ZKM5ayF5qi654Gr55W1XCJcblx0XSxcblx0W1xuXHRcdFwiZmNhMVwiLFxuXHRcdFwi56aN56a+6Iqx6I+v6Kmx6K2B6LKo6Z2076iL5pO05pSr56K656K756mr5Li45Zaa5aWQ5a6m5bm75oKj5o+b5q2h5pml5qGT5riZ54Wl55Kw57SI6YKE6amp6bCl5rS75ruR54y+6LGB6ZeK5Yew5bmM5b6o5oGN5oO25oSw5oWM5pmD5pmE5qal5rOB5rmf5ruJ5r2i54WM55Kc55qH56+B57Cn6I2S6J2X6YGR6ZqN6buD5Yyv5Zue5bu75b6K5oGi5oKU5oe35pmm5pyD5qqc5reu5r6u54Gw542q57mq6Ia+6Iy06JuU6Kqo6LOE5YqD542y5a6W5qmr6ZCE5ZOu5ZqG5a2d5pWI5paF5puJ5qKf5raN5reGXCJcblx0XSxcblx0W1xuXHRcdFwiZmRhMVwiLFxuXHRcdFwi54i76IK06YW16amN5L6v5YCZ5Y6a5ZCO5ZC85ZaJ5ZeF5bi/5b6M5py954Wm54+d6YCF5Yub5Yuz5aGk5aOO54SE54aP54e76Jaw6KiT5pqI6Jao5Zan5pqE54WK6JCx5Y2J5ZaZ5q+B5b2Z5b695o+u5pqJ54WH6Kux6Lyd6bq+5LyR5pC654OL55Wm6Jmn5oGk6K2O6be45YWH5Ye25YyI5rS26IO46buR5piV5qyj54KY55eV5ZCD5bG557SH6KiW5qyg5qy95q2G5ZC45oGw5rS957+V6IiI5YOW5Yee5Zac5Zmr5ZuN5aes5ayJ5biM5oaZ5oaY5oix5pme5pum54aZ54a554a654qn56an56iA576y6KmwXCJcblx0XVxuXTtcblxudmFyIGNwOTQ5JDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0J2RlZmF1bHQnOiBjcDk0OVxufSk7XG5cbnZhciBjcDk1MCA9IFtcblx0W1xuXHRcdFwiMFwiLFxuXHRcdFwiXFx1MDAwMFwiLFxuXHRcdDEyN1xuXHRdLFxuXHRbXG5cdFx0XCJhMTQwXCIsXG5cdFx0XCLjgIDvvIzjgIHjgILvvI7igKfvvJvvvJrvvJ/vvIHvuLDigKbigKXvuZDvuZHvuZLCt++5lO+5le+5lu+5l++9nOKAk++4seKAlO+4s+KVtO+4tO+5j++8iO+8ie+4te+4tu+9m++9ne+4t++4uOOAlOOAle+4ue+4uuOAkOOAke+4u++4vOOAiuOAi++4ve+4vuOAiOOAie+4v++5gOOAjOOAje+5ge+5guOAjuOAj++5g++5hO+5me+5mlwiXG5cdF0sXG5cdFtcblx0XHRcImExYTFcIixcblx0XHRcIu+5m++5nO+5ne+5nuKAmOKAmeKAnOKAneOAneOAnuKAteKAsu+8g++8hu+8iuKAu8Kn44CD4peL4peP4paz4pay4peO4piG4piF4peH4peG4pah4pag4pa94pa844qj4oSFwq/vv6PvvL/Lje+5ie+5iu+5je+5ju+5i++5jO+5n++5oO+5oe+8i++8jcOXw7fCseKImu+8nO+8nu+8neKJpuKJp+KJoOKInuKJkuKJoe+5olwiLFxuXHRcdDQsXG5cdFx0XCLvvZ7iiKniiKriiqXiiKDiiJ/iir/jj5Ljj5HiiKviiK7iiLXiiLTimYDimYLiipXiipnihpHihpPihpDihpLihpbihpfihpnihpjiiKXiiKPvvI9cIlxuXHRdLFxuXHRbXG5cdFx0XCJhMjQwXCIsXG5cdFx0XCLvvLziiJXvuajvvITvv6XjgJLvv6Dvv6HvvIXvvKDihIPihInvuanvuarvuavjj5Xjjpzjjp3jjp7jj47jjqHjjo7jjo/jj4TCsOWFmeWFm+WFnuWFneWFoeWFo+WXp+eTqeezjuKWgVwiLFxuXHRcdDcsXG5cdFx0XCLilo/ilo7ilo3ilozilovilorilonilLzilLTilKzilKTilJzilpTilIDilILilpXilIzilJDilJTilJjila1cIlxuXHRdLFxuXHRbXG5cdFx0XCJhMmExXCIsXG5cdFx0XCLila7ilbDila/ilZDilZ7ilarilaHil6Lil6Pil6Xil6TilbHilbLilbPvvJBcIixcblx0XHQ5LFxuXHRcdFwi4oWgXCIsXG5cdFx0OSxcblx0XHRcIuOAoVwiLFxuXHRcdDgsXG5cdFx0XCLljYHljYTljYXvvKFcIixcblx0XHQyNSxcblx0XHRcIu+9gVwiLFxuXHRcdDIxXG5cdF0sXG5cdFtcblx0XHRcImEzNDBcIixcblx0XHRcIu+9l++9mO+9me+9ms6RXCIsXG5cdFx0MTYsXG5cdFx0XCLOo1wiLFxuXHRcdDYsXG5cdFx0XCLOsVwiLFxuXHRcdDE2LFxuXHRcdFwiz4NcIixcblx0XHQ2LFxuXHRcdFwi44SFXCIsXG5cdFx0MTBcblx0XSxcblx0W1xuXHRcdFwiYTNhMVwiLFxuXHRcdFwi44SQXCIsXG5cdFx0MjUsXG5cdFx0XCLLmcuJy4rLh8uLXCJcblx0XSxcblx0W1xuXHRcdFwiYTNlMVwiLFxuXHRcdFwi4oKsXCJcblx0XSxcblx0W1xuXHRcdFwiYTQ0MFwiLFxuXHRcdFwi5LiA5LmZ5LiB5LiD5LmD5Lmd5LqG5LqM5Lq65YS/5YWl5YWr5Yeg5YiA5YiB5Yqb5YyV5Y2B5Y2c5Y+I5LiJ5LiL5LiI5LiK5Lir5Li45Yeh5LmF5LmI5Lmf5Lme5LqO5Lqh5YWA5YiD5Yu65Y2D5Y+J5Y+j5Zyf5aOr5aSV5aSn5aWz5a2Q5a2R5a2T5a+45bCP5bCi5bC45bGx5bed5bel5bex5bey5bez5be+5bmy5bu+5byL5byT5omNXCJcblx0XSxcblx0W1xuXHRcdFwiYTRhMVwiLFxuXHRcdFwi5LiR5LiQ5LiN5Lit5Liw5Li55LmL5bC55LqI5LqR5LqV5LqS5LqU5Lqi5LuB5LuA5LuD5LuG5LuH5LuN5LuK5LuL5LuE5YWD5YWB5YWn5YWt5YWu5YWs5YaX5Ye25YiG5YiH5YiI5Yu75Yu+5Yu/5YyW5Yy55Y2I5Y2H5Y2F5Y2e5Y6E5Y+L5Y+K5Y+N5aOs5aSp5aSr5aSq5aSt5a2U5bCR5bCk5bC65bGv5be05bm75bu/5byU5byV5b+D5oiI5oi25omL5omO5pSv5paH5paX5pak5pa55pel5puw5pyI5pyo5qyg5q2i5q255q+L5q+U5q+b5rCP5rC054Gr54iq54i254i754mH54mZ54mb54qs546L5LiZXCJcblx0XSxcblx0W1xuXHRcdFwiYTU0MFwiLFxuXHRcdFwi5LiW5LiV5LiU5LiY5Li75LmN5LmP5LmO5Lul5LuY5LuU5LuV5LuW5LuX5Luj5Luk5LuZ5Lue5YWF5YWE5YaJ5YaK5Yas5Ye55Ye65Ye45YiK5Yqg5Yqf5YyF5YyG5YyX5Yyd5Luf5Y2K5Y2J5Y2h5Y2g5Y2v5Y2u5Y675Y+v5Y+k5Y+z5Y+s5Y+u5Y+p5Y+o5Y+85Y+45Y+15Y+r5Y+m5Y+q5Y+y5Y+x5Y+w5Y+l5Y+t5Y+75Zub5Zua5aSWXCJcblx0XSxcblx0W1xuXHRcdFwiYTVhMVwiLFxuXHRcdFwi5aSu5aSx5aW05aW25a2V5a6D5bC85beo5ben5bem5biC5biD5bmz5bm85byB5byY5byX5b+F5oiK5omT5omU5omS5omR5pal5pem5pyu5pys5pyq5pyr5pyt5q2j5q+N5rCR5rCQ5rC45rGB5rGA5rC+54qv546E546J55Oc55Om55SY55Sf55So55Sp55Sw55Sx55Sy55Sz55aL55m955qu55q/55uu55+b55+i55+z56S656a+56m056uL5Lie5Lif5LmS5LmT5Lmp5LqZ5Lqk5Lqm5Lql5Lu/5LyJ5LyZ5LyK5LyV5LyN5LyQ5LyR5LyP5Luy5Lu25Lu75Luw5Luz5Lu95LyB5LyL5YWJ5YWH5YWG5YWI5YWoXCJcblx0XSxcblx0W1xuXHRcdFwiYTY0MFwiLFxuXHRcdFwi5YWx5YaN5Yaw5YiX5YiR5YiS5YiO5YiW5Yqj5YyI5Yyh5Yyg5Y2w5Y2x5ZCJ5ZCP5ZCM5ZCK5ZCQ5ZCB5ZCL5ZCE5ZCR5ZCN5ZCI5ZCD5ZCO5ZCG5ZCS5Zug5Zue5Zud5Zyz5Zyw5Zyo5Zyt5Zys5Zyv5Zyp5aSZ5aSa5aS35aS45aaE5aW45aaD5aW95aW55aaC5aaB5a2X5a2Y5a6H5a6I5a6F5a6J5a+65bCW5bG55bee5biG5bm25bm0XCJcblx0XSxcblx0W1xuXHRcdFwiYTZhMVwiLFxuXHRcdFwi5byP5byb5b+Z5b+W5oiO5oiM5oiN5oiQ5omj5omb5omY5pS25pep5peo5pes5pet5puy5puz5pyJ5py95py05pyx5py15qyh5q2k5q275rCW5rGd5rGX5rGZ5rGf5rGg5rGQ5rGV5rGh5rGb5rGN5rGO54Gw54mf54md55m+56u557Gz57O457y2576K57696ICB6ICD6ICM6ICS6ICz6IG/6IKJ6IKL6IKM6Iej6Ieq6Iez6Ie86IiM6Iib6Iif6Imu6Imy6Im+6Jmr6KGA6KGM6KGj6KW/6Zih5Liy5Lqo5L2N5L2P5L2H5L2X5L2e5Ly05L2b5L2V5Lyw5L2Q5L2R5Ly95Ly65Ly45L2D5L2U5Ly85L2G5L2jXCJcblx0XSxcblx0W1xuXHRcdFwiYTc0MFwiLFxuXHRcdFwi5L2c5L2g5Lyv5L2O5Ly25L2Z5L2d5L2I5L2a5YWM5YWL5YWN5YW15Ya25Ya35Yil5Yik5Yip5Yiq5Yio5Yqr5Yqp5Yqq5Yqs5Yyj5Y2z5Y215ZCd5ZCt5ZCe5ZC+5ZCm5ZGO5ZCn5ZGG5ZGD5ZCz5ZGI5ZGC5ZCb5ZCp5ZGK5ZC55ZC75ZC45ZCu5ZC15ZC25ZCg5ZC85ZGA5ZCx5ZCr5ZCf5ZCs5Zuq5Zuw5Zuk5Zur5Z2K5Z2R5Z2A5Z2NXCJcblx0XSxcblx0W1xuXHRcdFwiYTdhMVwiLFxuXHRcdFwi5Z2H5Z2O5Zy+5Z2Q5Z2P5Zy75aOv5aS+5aad5aaS5aao5aae5aaj5aaZ5aaW5aaN5aak5aaT5aaK5aal5a2d5a2c5a2a5a2b5a6M5a6L5a6P5bCs5bGA5bGB5bC/5bC+5bKQ5bKR5bKU5bKM5ber5biM5bqP5bqH5bqK5bu35byE5byf5b2k5b2i5b235b255b+Y5b+M5b+X5b+N5b+x5b+r5b+45b+q5oiS5oiR5oqE5oqX5oqW5oqA5om25oqJ5omt5oqK5om85om+5om55omz5oqS5omv5oqY5omu5oqV5oqT5oqR5oqG5pS55pS75pS45pex5pu05p2f5p2O5p2P5p2Q5p2R5p2c5p2W5p2e5p2J5p2G5p2gXCJcblx0XSxcblx0W1xuXHRcdFwiYTg0MFwiLFxuXHRcdFwi5p2T5p2X5q2l5q+P5rGC5rGe5rKZ5rKB5rKI5rKJ5rKF5rKb5rGq5rG65rKQ5rGw5rKM5rGo5rKW5rKS5rG95rKD5rGy5rG+5rG05rKG5rG25rKN5rKU5rKY5rKC54G254G854G954G454mi54mh54mg54uE54uC546W55Ss55Sr55S355S455qC55uv55+j56eB56eA56a/56m257O7572V6IKW6IKT6IKd6IKY6IKb6IKa6IKy6Imv6IqSXCJcblx0XSxcblx0W1xuXHRcdFwiYThhMVwiLFxuXHRcdFwi6IqL6IqN6KaL6KeS6KiA6LC36LGG6LGV6LKd6LWk6LWw6Laz6Lqr6LuK6L6b6L6w6L+C6L+G6L+F6L+E5beh6YKR6YKi6YKq6YKm6YKj6YWJ6YeG6YeM6Ziy6Ziu6Zix6Ziq6Zis5Lim5LmW5Lmz5LqL5Lqb5Lqe5Lqr5Lqs5L2v5L6d5L6N5L2z5L2/5L2s5L6b5L6L5L6G5L6D5L2w5L215L6I5L2p5L275L6W5L2+5L6P5L6R5L265YWU5YWS5YWV5YWp5YW35YW25YW45Ya95Ye95Yi75Yi45Yi35Yi65Yiw5Yiu5Yi25YmB5Yq+5Yq75Y2S5Y2U5Y2T5Y2R5Y2m5Y235Y245Y255Y+W5Y+U5Y+X5ZGz5ZG1XCJcblx0XSxcblx0W1xuXHRcdFwiYTk0MFwiLFxuXHRcdFwi5ZKW5ZG45ZKV5ZKA5ZG75ZG35ZKE5ZKS5ZKG5ZG85ZKQ5ZGx5ZG25ZKM5ZKa5ZGi5ZGo5ZKL5ZG95ZKO5Zu65Z6D5Z235Z2q5Z2p5Z2h5Z2m5Z2k5Z285aSc5aWJ5aWH5aWI5aWE5aWU5aa+5aa75aeU5aa55aau5aeR5aeG5aeQ5aeN5aeL5aeT5aeK5aav5aaz5aeS5aeF5a2f5a2k5a2j5a6X5a6a5a6Y5a6c5a6Z5a6b5bCa5bGI5bGFXCJcblx0XSxcblx0W1xuXHRcdFwiYTlhMVwiLFxuXHRcdFwi5bGG5bK35bKh5bK45bKp5bKr5bKx5bKz5biY5bia5biW5biV5bib5biR5bm45bqa5bqX5bqc5bqV5bqW5bu25bym5byn5byp5b6A5b6B5b2/5b285b+d5b+g5b+95b+15b+/5oCP5oCU5oCv5oC15oCW5oCq5oCV5oCh5oCn5oCp5oCr5oCb5oiW5oiV5oi/5oi+5omA5om/5ouJ5ouM5ouE5oq/5ouC5oq55ouS5oub5oqr5ouT5ouU5ouL5ouI5oqo5oq95oq85ouQ5ouZ5ouH5ouN5oq15oua5oqx5ouY5ouW5ouX5ouG5oqs5ouO5pS+5pan5pa85pe65piU5piT5piM5piG5piC5piO5piA5piP5piV5piKXCJcblx0XSxcblx0W1xuXHRcdFwiYWE0MFwiLFxuXHRcdFwi5piH5pyN5pyL5p2t5p6L5p6V5p2x5p6c5p2z5p235p6H5p6d5p6X5p2v5p2w5p2/5p6J5p2+5p6Q5p215p6a5p6T5p285p2q5p2y5qyj5q2m5q2n5q2/5rCT5rCb5rOj5rOo5rOz5rKx5rOM5rOl5rKz5rK95rK+5rK85rOi5rKr5rOV5rOT5rK45rOE5rK55rOB5rKu5rOX5rOF5rOx5rK/5rK75rOh5rOb5rOK5rKs5rOv5rOc5rOW5rOgXCJcblx0XSxcblx0W1xuXHRcdFwiYWFhMVwiLFxuXHRcdFwi54KV54KO54KS54KK54KZ54is54it54i454mI54mn54mp54uA54uO54uZ54uX54uQ546p546o546f546r546l55S955ad55aZ55aa55qE55uC55uy55u055+l55+956S+56WA56WB56eJ56eI56m656m556u657O+572U576M576L6ICF6IK66IKl6IKi6IKx6IKh6IKr6IKp6IK06IKq6IKv6Iel6Ie+6IiN6Iqz6Iqd6IqZ6Iqt6Iq96Iqf6Iq56Iqx6Iqs6Iql6Iqv6Iq46Iqj6Iqw6Iq+6Iq36JmO6Jmx5Yid6KGo6LuL6L+O6L+U6L+R6YK16YK46YKx6YK26YeH6YeR6ZW36ZaA6Zic6ZmA6Zi/6Zi76ZmEXCJcblx0XSxcblx0W1xuXHRcdFwiYWI0MFwiLFxuXHRcdFwi6ZmC6Zq56Zuo6Z2S6Z2e5Lqf5Lqt5Lqu5L+h5L615L6v5L6/5L+g5L+R5L+P5L+d5L+D5L625L+Y5L+f5L+K5L+X5L6u5L+Q5L+E5L+C5L+a5L+O5L+e5L635YWX5YaS5YaR5Yag5YmO5YmD5YmK5YmN5YmM5YmL5YmH5YuH5YuJ5YuD5YuB5YyN5Y2X5Y275Y6a5Y+b5ZKs5ZOA5ZKo5ZOO5ZOJ5ZK45ZKm5ZKz5ZOH5ZOC5ZK95ZKq5ZOBXCJcblx0XSxcblx0W1xuXHRcdFwiYWJhMVwiLFxuXHRcdFwi5ZOE5ZOI5ZKv5ZKr5ZKx5ZK75ZKp5ZKn5ZK/5Zu/5Z6C5Z6L5Z6g5Z6j5Z6i5Z+O5Z6u5Z6T5aWV5aWR5aWP5aWO5aWQ5aec5aeY5ae/5aej5aeo5aiD5ael5aeq5aea5aem5aiB5ae75a2p5a6j5a6m5a6k5a6i5a6l5bCB5bGO5bGP5bGN5bGL5bOZ5bOS5be35bid5bil5bif5bm95bqg5bqm5bu65byI5byt5b2l5b6I5b6F5b6K5b6L5b6H5b6M5b6J5oCS5oCd5oCg5oCl5oCO5oCo5oGN5oGw5oGo5oGi5oGG5oGD5oGs5oGr5oGq5oGk5omB5ouc5oyW5oyJ5ou85out5oyB5ouu5ou95oyH5oux5ou3XCJcblx0XSxcblx0W1xuXHRcdFwiYWM0MFwiLFxuXHRcdFwi5ouv5ous5ou+5ou05oyR5oyC5pS/5pWF5par5pa95pei5pil5pit5pig5pin5piv5pif5pio5pix5pik5pu35p+/5p+T5p+x5p+U5p+Q5p+s5p625p6v5p+15p+p5p+v5p+E5p+R5p605p+a5p+l5p645p+P5p+e5p+z5p6w5p+Z5p+i5p+d5p+S5q2q5q6D5q6G5q615q+S5q+X5rCf5rOJ5rSL5rSy5rSq5rWB5rSl5rSM5rSx5rSe5rSXXCJcblx0XSxcblx0W1xuXHRcdFwiYWNhMVwiLFxuXHRcdFwi5rS75rS95rS+5rS25rSb5rO15rS55rSn5rS45rSp5rSu5rS15rSO5rSr54Kr54K654Kz54Ks54Kv54Kt54K454Ku54Kk54iw54my54mv54m054up54ug54uh546354+K5467546y54+N54+A546z55Sa55St55WP55WM55WO55WL55ar55ak55al55ai55aj55m455qG55qH55qI55uI55uG55uD55uF55yB55u555u455yJ55yL55u+55u855yH55+c56CC56CU56CM56CN56WG56WJ56WI56WH56a556a656eR56eS56eL56m/56qB56u/56u957G957SC57SF57SA57SJ57SH57SE57SG57y4576O576/6ICEXCJcblx0XSxcblx0W1xuXHRcdFwiYWQ0MFwiLFxuXHRcdFwi6ICQ6ICN6ICR6IC26IOW6IOl6IOa6IOD6IOE6IOM6IOh6IOb6IOO6IOe6IOk6IOd6Ie06Iii6Iun6IyD6IyF6Iuj6Iub6Ium6IyE6Iul6IyC6IyJ6IuS6IuX6Iux6IyB6Iuc6IuU6IuR6Iue6IuT6Iuf6Iuv6IyG6JmQ6Jm56Jm76Jm66KGN6KGr6KaB6KeU6KiI6KiC6KiD6LKe6LKg6LW06LWz6La06LuN6LuM6L+w6L+m6L+i6L+q6L+lXCJcblx0XSxcblx0W1xuXHRcdFwiYWRhMVwiLFxuXHRcdFwi6L+t6L+r6L+k6L+o6YOK6YOO6YOB6YOD6YWL6YWK6YeN6ZaC6ZmQ6ZmL6ZmM6ZmN6Z2i6Z2p6Z+L6Z+t6Z+z6aCB6aKo6aOb6aOf6aaW6aaZ5LmY5Lqz5YCM5YCN5YCj5L+v5YCm5YCl5L+45YCp5YCW5YCG5YC85YCf5YCa5YCS5YCR5L+65YCA5YCU5YCo5L+x5YCh5YCL5YCZ5YCY5L+z5L+u5YCt5YCq5L++5YCr5YCJ5YW85Yak5Yal5Yai5YeN5YeM5YeG5YeL5YmW5Ymc5YmU5Ymb5Ymd5Yyq5Y2/5Y6f5Y6d5Y+f5ZOo5ZSQ5ZSB5ZS35ZO85ZOl5ZOy5ZSG5ZO65ZSU5ZOp5ZOt5ZOh5ZSJ5ZOu5ZOqXCJcblx0XSxcblx0W1xuXHRcdFwiYWU0MFwiLFxuXHRcdFwi5ZOm5ZSn5ZSH5ZO95ZSP5ZyD5ZyE5Z+C5Z+U5Z+L5Z+D5aCJ5aSP5aWX5aWY5aWa5aiR5aiY5aic5aif5aib5aiT5aes5aig5aij5aip5ail5aiM5aiJ5a2r5bGY5a6w5a6z5a625a605a6u5a615a655a645bCE5bGR5bGV5bGQ5bOt5bO95bO75bOq5bOo5bOw5bO25bSB5bO05beu5bit5bir5bqr5bqt5bqn5byx5b6S5b6R5b6Q5oGZXCJcblx0XSxcblx0W1xuXHRcdFwiYWVhMVwiLFxuXHRcdFwi5oGj5oGl5oGQ5oGV5oGt5oGp5oGv5oKE5oKf5oKa5oKN5oKU5oKM5oKF5oKW5omH5ouz5oyI5ou/5o2O5oy+5oyv5o2V5o2C5o2G5o2P5o2J5oy65o2Q5oy95oyq5oyr5oyo5o2N5o2M5pWI5pWJ5paZ5peB5peF5pmC5pmJ5pmP5pmD5pmS5pmM5pmF5pmB5pu45pyU5pyV5pyX5qCh5qC45qGI5qGG5qGT5qC55qGC5qGU5qCp5qKz5qCX5qGM5qGR5qC95p+05qGQ5qGA5qC85qGD5qCq5qGF5qCT5qCY5qGB5q6K5q6J5q635rCj5rCn5rCo5rCm5rCk5rOw5rWq5raV5raI5raH5rWm5rW45rW35rWZ5raTXCJcblx0XSxcblx0W1xuXHRcdFwiYWY0MFwiLFxuXHRcdFwi5rWs5raJ5rWu5rWa5rW05rWp5raM5raK5rW55raF5rWl5raU54OK54OY54Ok54OZ54OI54OP54i554m554u854u554u954u454u3546G54+t55CJ54+u54+g54+q54+e55WU55Wd55Wc55Wa55WZ55a+55eF55eH55ay55az55a955a855a555eC55a455qL55qw55uK55uN55uO55yp55yf55yg55yo55+p56Cw56Cn56C456Cd56C056C3XCJcblx0XSxcblx0W1xuXHRcdFwiYWZhMVwiLFxuXHRcdFwi56Cl56Ct56Cg56Cf56Cy56WV56WQ56Wg56Wf56WW56We56Wd56WX56Wa56ek56ej56en56ef56em56ep56eY56qE56qI56uZ56yG56yR57KJ57Sh57SX57SL57SK57Sg57Si57SU57SQ57SV57Sa57Sc57SN57SZ57Sb57y6572f576U57+F57+B6ICG6ICY6ICV6ICZ6ICX6IC96IC/6IOx6ISC6IOw6ISF6IOt6IO06ISG6IO46IOz6ISI6IO96ISK6IO86IOv6Iet6Ies6IiA6IiQ6Iiq6Iir6Iio6Iis6Iq76Iyr6I2S6I2U6I2K6Iy46I2Q6I2J6Iy16Iy06I2P6Iyy6Iy56Iy26IyX6I2A6Iyx6Iyo6I2DXCJcblx0XSxcblx0W1xuXHRcdFwiYjA0MFwiLFxuXHRcdFwi6JmU6JqK6Jqq6JqT6Jqk6Jqp6JqM6Jqj6Jqc6KGw6KG36KKB6KKC6KG96KG56KiY6KiQ6KiO6KiM6KiV6KiK6KiX6KiT6KiW6KiP6KiR6LGI6LG66LG56LKh6LKi6LW36Lqs6LuS6LuU6LuP6L6x6YCB6YCG6L+36YCA6L+66L+06YCD6L+96YCF6L+46YKV6YOh6YOd6YOi6YWS6YWN6YWM6YeY6Yed6YeX6Yec6YeZ6ZaD6Zmi6Zmj6ZmhXCJcblx0XSxcblx0W1xuXHRcdFwiYjBhMVwiLFxuXHRcdFwi6Zmb6Zmd6Zmk6ZmY6Zme6Zq76aOi6aas6aqo6auY6ayl6ayy6ay85Lm+5YG65YG95YGc5YGH5YGD5YGM5YGa5YGJ5YGl5YG25YGO5YGV5YG15YG05YG35YGP5YCP5YGv5YGt5YWc5YaV5Yew5Ymq5Ymv5YuS5YuZ5YuY5YuV5YyQ5YyP5YyZ5Yy/5Y2A5Yy+5Y+D5pu85ZWG5ZWq5ZWm5ZWE5ZWe5ZWh5ZWD5ZWK5ZSx5ZWW5ZWP5ZWV5ZSv5ZWk5ZS45ZSu5ZWc5ZSs5ZWj5ZSz5ZWB5ZWX5ZyI5ZyL5ZyJ5Z+f5aCF5aCK5aCG5Z+g5Z+k5Z+65aCC5aC15Z+35Z+55aSg5aWi5ai25amB5amJ5amm5amq5amAXCJcblx0XSxcblx0W1xuXHRcdFwiYjE0MFwiLFxuXHRcdFwi5ai85ami5ama5amG5amK5a2w5a+H5a+F5a+E5a+C5a6/5a+G5bCJ5bCI5bCH5bGg5bGc5bGd5bSH5bSG5bSO5bSb5bSW5bSi5bSR5bSp5bSU5bSZ5bSk5bSn5bSX5bei5bi45bi25biz5bi35bq35bq45bq25bq15bq+5by15by35b2X5b2s5b2p5b2r5b6X5b6Z5b6e5b6Y5b6h5b6g5b6c5oG/5oKj5oKJ5oKg5oKo5oOL5oK05oOm5oK9XCJcblx0XSxcblx0W1xuXHRcdFwiYjFhMVwiLFxuXHRcdFwi5oOF5oK75oK15oOc5oK85oOY5oOV5oOG5oOf5oK45oOa5oOH5oia5oib5omI5o6g5o6n5o2y5o6W5o6i5o6l5o235o2n5o6Y5o6q5o2x5o6p5o6J5o6D5o6b5o2r5o6o5o6E5o6I5o6Z5o6h5o6s5o6S5o6P5o6A5o275o2p5o2o5o265pWd5pWW5pWR5pWZ5pWX5ZWf5pWP5pWY5pWV5pWU5pac5pab5pas5peP5peL5peM5peO5pmd5pma5pmk5pmo5pmm5pme5pu55YuX5pyb5qKB5qKv5qKi5qKT5qK15qG/5qG25qKx5qKn5qKX5qKw5qKD5qOE5qKt5qKG5qKF5qKU5qKd5qKo5qKf5qKh5qKC5qyy5q66XCJcblx0XSxcblx0W1xuXHRcdFwiYjI0MFwiLFxuXHRcdFwi5q+r5q+s5rCr5raO5ra85rez5reZ5ray5reh5reM5rek5re75re65riF5reH5reL5rav5reR5rau5ree5re55ra45re35re15reF5reS5ria5ra15rea5rer5reY5req5rex5reu5reo5reG5reE5raq5res5ra/5rem54O554SJ54SK54O954Ov54i954m954qB54yc54yb54yW54yT54yZ546H55CF55CK55CD55CG54++55CN55Og55O2XCJcblx0XSxcblx0W1xuXHRcdFwiYjJhMVwiLFxuXHRcdFwi55O355Sc55Si55Wl55Wm55Wi55Ww55aP55eU55eV55a155eK55eN55qO55uU55uS55ub55y355y+55y855y255y455y656Gr56GD56GO56Wl56Wo56Wt56e756qS56qV56yg56yo56yb56ys56ym56yZ56ye56yu57KS57KX57KV57WG57WD57Wx57Su57S557S857WA57Sw57Sz57WE57Sv57WC57Sy57Sx57y9576e576a57+M57+O57+S6ICc6IGK6IGG6ISv6ISW6ISj6ISr6ISp6ISw6ISk6IiC6Ii16Ii36Ii26Ii56I6O6I6e6I6Y6I246I6i6I6W6I696I6r6I6S6I6K6I6T6I6J6I6g6I236I276I28XCJcblx0XSxcblx0W1xuXHRcdFwiYjM0MFwiLFxuXHRcdFwi6I6G6I6n6JmV5b2q6JuH6JuA6Jq26JuE6Jq16JuG6JuL6Jqx6Jqv6JuJ6KGT6KKe6KKI6KKr6KKS6KKW6KKN6KKL6KaT6KaP6Kiq6Kid6Kij6Kil6Kix6Kit6Kif6Kib6Kii6LGJ6LGa6LKp6LKs6LKr6LKo6LKq6LKn6LWn6LWm6La+6La66Lub6Luf6YCZ6YCN6YCa6YCX6YCj6YCf6YCd6YCQ6YCV6YCe6YCg6YCP6YCi6YCW6YCb6YCUXCJcblx0XSxcblx0W1xuXHRcdFwiYjNhMVwiLFxuXHRcdFwi6YOo6YOt6YO96YWX6YeO6Ye16Yem6Yej6Yen6Yet6Yep6ZaJ6Zmq6Zm16Zmz6Zm46Zmw6Zm06Zm26Zm36Zms6ZuA6Zuq6Zup56ug56uf6aCC6aCD6a2a6bOl6bm16bm/6bql6bq75YKi5YKN5YKF5YKZ5YKR5YKA5YKW5YKY5YKa5pyA5Yex5Ymy5Ym05Ym15Ymp5Yue5Yud5Yub5Y2a5Y6l5ZW75ZaA5Zan5ZW85ZaK5Zad5ZaY5ZaC5Zac5Zaq5ZaU5ZaH5ZaL5ZaD5Zaz5Zau5Zaf5ZS+5Zay5Zaa5Za75Zas5Zax5ZW+5ZaJ5Zar5ZaZ5ZyN5aCv5aCq5aC05aCk5aCw5aCx5aCh5aCd5aCg5aO55aO65aWgXCJcblx0XSxcblx0W1xuXHRcdFwiYjQ0MFwiLFxuXHRcdFwi5am35aqa5am/5aqS5aqb5aqn5a2z5a2x5a+S5a+M5a+T5a+Q5bCK5bCL5bCx5bWM5bWQ5bS05bWH5be95bmF5bi95bmA5bmD5bm+5buK5buB5buC5buE5by85b2t5b6p5b6q5b6o5oOR5oOh5oKy5oK25oOg5oSc5oSj5oO65oSV5oOw5oO75oO05oWo5oOx5oSO5oO25oSJ5oSA5oSS5oif5omJ5o6j5o6M5o+P5o+A5o+p5o+J5o+G5o+NXCJcblx0XSxcblx0W1xuXHRcdFwiYjRhMVwiLFxuXHRcdFwi5o+S5o+j5o+Q5o+h5o+W5o+t5o+u5o225o+05o+q5o+b5pGS5o+a5o+55pWe5pWm5pWi5pWj5paR5paQ5pav5pmu5pmw5pm05pm25pmv5pqR5pm65pm+5pm35pu+5pu/5pyf5pyd5qO65qOV5qOg5qOY5qOX5qSF5qOf5qO15qOu5qOn5qO55qOS5qOy5qOj5qOL5qON5qSN5qSS5qSO5qOJ5qOa5qWu5qO75qy+5qy65qy95q6Y5q6W5q685q+v5rCu5rCv5rCs5riv5ri45rmU5rih5riy5rmn5rmK5rig5ril5rij5rib5rmb5rmY5rik5rmW5rmu5rit5rim5rmv5ri05rmN5ri65ris5rmD5rid5ri+5ruLXCJcblx0XSxcblx0W1xuXHRcdFwiYjU0MFwiLFxuXHRcdFwi5rqJ5riZ5rmO5rmj5rmE5rmy5rmp5rmf54SZ54Sa54Sm54Sw54Sh54S254Wu54Sc54mM54qE54qA54y254yl54y054yp55C655Cq55Cz55Ci55Cl55C155C255C055Cv55Cb55Cm55Co55Sl55Sm55Wr55Wq55ei55eb55ej55eZ55eY55ee55eg55m755m855qW55qT55q055uc552P55+t56Gd56Gs56Gv56iN56iI56iL56iF56iA56qYXCJcblx0XSxcblx0W1xuXHRcdFwiYjVhMVwiLFxuXHRcdFwi56qX56qW56ul56uj562J562W562G562Q562S562U562N562L562P562R57Kf57Kl57We57WQ57Wo57WV57Sr57Wu57Wy57Wh57Wm57Wi57Ww57Wz5ZaE57+U57+V6ICL6IGS6IKF6IWV6IWU6IWL6IWR6IWO6IS56IWG6IS+6IWM6IWT6IW06IiS6Iic6I+p6JCD6I+46JCN6I+g6I+F6JCL6I+B6I+v6I+x6I+06JGX6JCK6I+w6JCM6I+M6I+96I+y6I+K6JC46JCO6JCE6I+c6JCH6I+U6I+f6Jmb6Juf6JuZ6Jut6JuU6Jub6Juk6JuQ6Jue6KGX6KOB6KOC6KKx6KaD6KaW6Ki76Kmg6KmV6Kme6Ki86KmBXCJcblx0XSxcblx0W1xuXHRcdFwiYjY0MFwiLFxuXHRcdFwi6KmU6Kmb6KmQ6KmG6Ki06Ki66Ki26KmW6LGh6LKC6LKv6LK86LKz6LK96LOB6LK76LOA6LK06LK36LK26LK/6LK46LaK6LaF6LaB6LeO6Led6LeL6Lea6LeR6LeM6Leb6LeG6Lu76Lu46Lu86L6c6YCu6YC16YCx6YC46YCy6YC26YSC6YO16YSJ6YO+6YWj6YWl6YeP6YiU6YiV6Yij6YiJ6Yie6YiN6YiQ6YiH6YiR6ZaU6ZaP6ZaL6ZaRXCJcblx0XSxcblx0W1xuXHRcdFwiYjZhMVwiLFxuXHRcdFwi6ZaT6ZaS6ZaO6ZqK6ZqO6ZqL6Zm96ZqF6ZqG6ZqN6Zmy6ZqE6ZuB6ZuF6ZuE6ZuG6ZuH6Zuv6Zuy6Z+M6aCF6aCG6aCI6aOn6aOq6aOv6aOp6aOy6aOt6aau6aat6buD6buN6buR5LqC5YKt5YK15YKy5YKz5YOF5YK+5YKs5YK35YK75YKv5YOH5Ym/5Ym35Ym95Yuf5Yum5Yuk5Yui5Yuj5Yyv5Zef5Zeo5ZeT5Zem5ZeO5Zec5ZeH5ZeR5Zej5Zek5Zev5Zea5Zeh5ZeF5ZeG5Zel5ZeJ5ZyS5ZyT5aGe5aGR5aGY5aGX5aGa5aGU5aGr5aGM5aGt5aGK5aGi5aGS5aGL5aWn5auB5auJ5auM5aq+5aq95aq8XCJcblx0XSxcblx0W1xuXHRcdFwiYjc0MFwiLFxuXHRcdFwi5aqz5auC5aqy5bWp5bWv5bmM5bm55buJ5buI5byS5b2Z5b6s5b6u5oSa5oSP5oWI5oSf5oOz5oSb5oO55oSB5oSI5oWO5oWM5oWE5oWN5oS+5oS05oSn5oSN5oSG5oS35oih5oii5pCT5pC+5pCe5pCq5pCt5pC95pCs5pCP5pCc5pCU5pCN5pC25pCW5pCX5pCG5pWs5paf5paw5pqX5pqJ5pqH5pqI5pqW5pqE5pqY5pqN5pyD5qaU5qWtXCJcblx0XSxcblx0W1xuXHRcdFwiYjdhMVwiLFxuXHRcdFwi5qWa5qW35qWg5qWU5qW15qSw5qaC5qWK5qWo5qWr5qWe5qWT5qW55qaG5qWd5qWj5qWb5q2H5q2y5q+A5q6/5q+T5q+95rqi5rqv5ruT5rq25ruC5rqQ5rqd5ruH5ruF5rql5rqY5rq85rq65rqr5ruR5rqW5rqc5ruE5ruU5rqq5rqn5rq054WO54WZ54Wp54Wk54WJ54Wn54Wc54Ws54Wm54WM54Wl54We54WG54Wo54WW54i654mS54y3542F54y/54y+55Gv55Ga55GV55Gf55Ge55GB55C/55GZ55Gb55Gc55W255W455iA55ew55iB55ey55ex55e655e/55e055ez55ue55uf552b552r552m552e552jXCJcblx0XSxcblx0W1xuXHRcdFwiYjg0MFwiLFxuXHRcdFwi5525552q552s552c552l552o552i55+u56KO56Kw56KX56KY56KM56KJ56G856KR56KT56G/56W656W/56aB6JCs56a956ic56ia56ig56iU56if56ie56qf56qg562356+A562g562u562n57Kx57Kz57K157aT57W557aR57aB57aP57Wb572u572p572q572y576p576o576k6IGW6IGY6IKG6IKE6IWx6IWw6IW46IWl6IWu6IWz6IWrXCJcblx0XSxcblx0W1xuXHRcdFwiYjhhMVwiLFxuXHRcdFwi6IW56IW66IWm6IiF6ImH6JKC6JG36JC96JCx6JG16JGm6JGr6JGJ6JGs6JGb6JC86JC16JGh6JGj6JGp6JGt6JGG6Jme6Jmc6Jmf6Ju56JyT6JyI6JyH6JyA6Ju+6Ju76JyC6JyD6JyG6JyK6KGZ6KOf6KOU6KOZ6KOc6KOY6KOd6KOh6KOK6KOV6KOS6Kac6Kej6Kmr6Kmy6Kmz6Kmm6Kmp6Kmw6KqH6Km86Kmj6Kqg6Kmx6KqF6Kmt6Kmi6Kmu6Kms6Km56Km76Ki+6Kmo6LGi6LKK6LKJ6LOK6LOH6LOI6LOE6LKy6LOD6LOC6LOF6Leh6Lef6Leo6Lev6Lez6Le66Leq6Lek6Lem6Lqy6LyD6LyJ6Lu+6LyKXCJcblx0XSxcblx0W1xuXHRcdFwiYjk0MFwiLFxuXHRcdFwi6L6f6L6y6YGL6YGK6YGT6YGC6YGU6YC86YGV6YGQ6YGH6YGP6YGO6YGN6YGR6YC+6YGB6YSS6YSX6YWs6YWq6YWp6YeJ6Yi36YmX6Yi46Yi96YmA6Yi+6Ymb6YmL6Ymk6YmR6Yi06YmJ6YmN6YmF6Yi56Yi/6Yma6ZaY6ZqY6ZqU6ZqV6ZuN6ZuL6ZuJ6ZuK6Zu36Zu76Zu56Zu26Z2W6Z206Z226aCQ6aCR6aCT6aCK6aCS6aCM6aO86aO0XCJcblx0XSxcblx0W1xuXHRcdFwiYjlhMVwiLFxuXHRcdFwi6aO96aO+6aaz6aax6aa06auh6bOp6bqC6byO6byT6byg5YOn5YOu5YOl5YOW5YOt5YOa5YOV5YOP5YOR5YOx5YOO5YOp5YWi5Yez5YqD5YqC5Yyx5Y6t5Ze+5ZiA5Zib5ZiX5Ze95ZiU5ZiG5ZiJ5ZiN5ZiO5Ze35ZiW5Zif5ZiI5ZiQ5Ze25ZyY5ZyW5aG15aG+5aKD5aKT5aKK5aG55aKF5aG95aO95aSl5aSi5aSk5aWq5aWp5auh5aum5aup5auX5auW5auY5auj5a215a+e5a+n5a+h5a+l5a+m5a+o5a+i5a+k5a+f5bCN5bGi5baE5baH5bmb5bmj5bmV5bmX5bmU5buT5buW5byK5b2G5b2w5b655oWHXCJcblx0XSxcblx0W1xuXHRcdFwiYmE0MFwiLFxuXHRcdFwi5oS/5oWL5oW35oWi5oWj5oWf5oWa5oWY5oW15oiq5pKH5pGY5pGU5pKk5pG45pGf5pG65pGR5pGn5pC05pGt5pG75pWy5pah5peX5peW5pqi5pqo5pqd5qac5qao5qaV5qeB5qau5qeT5qeL5qab5qa35qa75qar5qa05qeQ5qeN5qat5qeM5qam5qeD5qaj5q2J5q2M5rCz5ryz5ryU5ru+5ryT5ru05ryp5ry+5ryg5rys5ryP5ryC5ryiXCJcblx0XSxcblx0W1xuXHRcdFwiYmFhMVwiLFxuXHRcdFwi5ru/5ruv5ryG5ryx5ry45ryy5ryj5ryV5ryr5ryv5r6I5ryq5rus5ryB5ruy5ruM5ru354aU54aZ54W954aK54aE54aS54i+54qS54qW542E542Q55Gk55Gj55Gq55Gw55Gt55SE55aR55in55iN55iL55iJ55iT55uh55uj556E5529552/552h56OB56Kf56Kn56Kz56Kp56Kj56aO56aP56aN56iu56ix56qq56qp56ut56uv566h566V566L5621566X566d566U566P5664566H566E57K557K957K+57a757aw57ac57a957a+57ag57eK57a057ay57ax57a657ai57a/57a157a457at57eS57eH57asXCJcblx0XSxcblx0W1xuXHRcdFwiYmI0MFwiLFxuXHRcdFwi572w57+g57+h57+f6IGe6IGa6IKH6IWQ6IaA6IaP6IaI6IaK6IW/6IaC6Ien6Ie66IiH6IiU6Iie6ImL6JOJ6JK/6JOG6JOE6JKZ6JKe6JKy6JKc6JOL6JK46JOA6JOT6JKQ6JK86JOR6JOK6Jy/6Jyc6Jy76Jyi6Jyl6Jy06JyY6J2V6Jy36Jyp6KOz6KSC6KO06KO56KO46KO96KOo6KSa6KOv6Kqm6KqM6Kqe6Kqj6KqN6Kqh6KqT6KqkXCJcblx0XSxcblx0W1xuXHRcdFwiYmJhMVwiLFxuXHRcdFwi6Kqq6Kql6Kqo6KqY6KqR6Kqa6Kqn6LGq6LKN6LKM6LOT6LOR6LOS6LWr6LaZ6LaV6Le86LyU6LyS6LyV6LyT6L6j6YGg6YGY6YGc6YGj6YGZ6YGe6YGi6YGd6YGb6YSZ6YSY6YSe6YW16YW46YW36YW06Ym46YqA6YqF6YqY6YqW6Ym76YqT6Yqc6Yqo6Ym86YqR6Zah6Zao6Zap6Zaj6Zal6Zak6ZqZ6Zqc6Zqb6ZuM6ZuS6ZyA6Z286Z6F6Z+26aCX6aCY6aKv6aKx6aSD6aSF6aSM6aSJ6aeB6aqv6aqw6aum6a2B6a2C6bO06bO26bOz6bq86by76b2K5YSE5YSA5YO75YO15YO55YSC5YSI5YSJ5YSF5YecXCJcblx0XSxcblx0W1xuXHRcdFwiYmM0MFwiLFxuXHRcdFwi5YqH5YqI5YqJ5YqN5YqK5Yuw5Y6y5Ziu5Zi75Zi55Ziy5Zi/5Zi05Zip5ZmT5ZmO5ZmX5Zm05Zi25Ziv5Ziw5aKA5aKf5aKe5aKz5aKc5aKu5aKp5aKm5aWt5ayJ5au75ayL5au15ayM5ayI5a+u5a+s5a+p5a+r5bGk5bGl5bad5baU5bmi5bmf5bmh5bui5bua5buf5bud5buj5bug5b2I5b2x5b635b615oW25oWn5oWu5oWd5oWV5oaCXCJcblx0XSxcblx0W1xuXHRcdFwiYmNhMVwiLFxuXHRcdFwi5oW85oWw5oWr5oW+5oan5oaQ5oar5oaO5oas5oaa5oak5oaU5oau5oiu5pGp5pGv5pG55pKe5pKy5pKI5pKQ5pKw5pKl5pKT5pKV5pKp5pKS5pKu5pKt5pKr5pKa5pKs5pKZ5pKi5pKz5pW15pW35pW45pqu5pqr5pq05pqx5qij5qif5qeo5qiB5qie5qiZ5qe95qih5qiT5qiK5qez5qiC5qiF5qet5qiR5q2Q5q2O5q6k5q+F5q+G5ry/5r285r6E5r2R5r2m5r2U5r6G5r2t5r2b5r245r2u5r6O5r265r2w5r2k5r6X5r2Y5ruV5r2v5r2g5r2f54af54as54ax54ao54mW54qb542O542X55Gp55KL55KDXCJcblx0XSxcblx0W1xuXHRcdFwiYmQ0MFwiLFxuXHRcdFwi55G+55KA55W/55ig55ip55if55ik55im55ih55ii55qa55q655uk556O556H556M556R556L56OL56OF56K656OK56K+56OV56K856OQ56i/56i856mA56i956i356i756qv56qu566t566x56+E566056+G56+H56+B566g56+M57OK57eg57e057ev57e757eY57es57ed57eo57ej57ea57ee57ep57ae57eZ57ey57e557215723576vXCJcblx0XSxcblx0W1xuXHRcdFwiYmRhMVwiLFxuXHRcdFwi57+p6ICm6Iab6Iac6Iad6Iag6Iaa6IaY6JSX6JS96JSa6JOu6JSs6JSt6JST6JSR6JSj6JSh6JSU6JOs6JSl6JO/6JSG6J6C6J206J226J2g6J2m6J246J2o6J2Z6J2X6J2M6J2T6KGb6KGd6KSQ6KSH6KSS6KST6KSV6KSK6Kq86KuS6KuH6KuE6KqV6KuL6Ku46Kqy6KuJ6KuC6Kq/6Kqw6KuW6KuN6Kq26Kq56Kub6LGM6LGO6LGs6LOg6LOe6LOm6LOk6LOs6LOt6LOi6LOj6LOc6LOq6LOh6LWt6Laf6Laj6Lir6LiQ6Lid6Lii6LiP6Lip6Lif6Lih6Lie6Lq66Lyd6Lyb6Lyf6Lyp6Lym6Lyq6Lyc6LyeXCJcblx0XSxcblx0W1xuXHRcdFwiYmU0MFwiLFxuXHRcdFwi6Lyl6YGp6YGu6YGo6YGt6YG36YSw6YSt6YSn6YSx6YaH6YaJ6YaL6YaD6YuF6Yq76Yq36Yuq6Yqs6Yuk6YuB6Yqz6Yq86YuS6YuH6Yuw6Yqy6Zat6Zax6ZyE6ZyG6ZyH6ZyJ6Z2g6Z6N6Z6L6Z6P6aCh6aCr6aCc6aKz6aSK6aST6aSS6aSY6aed6aeQ6aef6aeb6aeR6aeV6aeS6aeZ6aq36auu6auv6ayn6a2F6a2E6a236a2v6bSG6bSJXCJcblx0XSxcblx0W1xuXHRcdFwiYmVhMVwiLFxuXHRcdFwi6bSD6bqp6bq+6buO5aKo6b2S5YSS5YSY5YSU5YSQ5YSV5YaA5Yaq5Yed5YqR5YqT5Yuz5ZmZ5Zmr5Zm55Zmp5Zmk5Zm45Zmq5Zmo5Zml5Zmx5Zmv5Zms5Zmi5Zm25aOB5aK+5aOH5aOF5aWu5ayd5ay05a245a+w5bCO5b2K5oay5oaR5oap5oaK5oeN5oa25oa+5oeK5oeI5oiw5pOF5pOB5pOL5pK75pK85pOa5pOE5pOH5pOC5pON5pK/5pOS5pOU5pK+5pW05puG5puJ5pq55puE5puH5pq45qi95qi45qi65qmZ5qmr5qmY5qi55qmE5qmi5qmh5qmL5qmH5qi15qmf5qmI5q2Z5q235rCF5r+C5r6x5r6hXCJcblx0XSxcblx0W1xuXHRcdFwiYmY0MFwiLFxuXHRcdFwi5r+D5r6k5r+B5r6n5r6z5r+A5r655r625r6m5r6g5r6054a+54eJ54eQ54eS54eI54eV54a554eO54eZ54ec54eD54eE542o55Kc55Kj55KY55Kf55Ke55Oi55SM55SN55i055i455i655un55ul556g556e556f556l56Oo56Oa56Os56On56am56mN56mO56mG56mM56mL56q656+Z57CR56+J56+k56+b56+h56+p56+m57OV57OW57iKXCJcblx0XSxcblx0W1xuXHRcdFwiYmZhMVwiLFxuXHRcdFwi57iR57iI57ib57ij57ie57id57iJ57iQ5725576y57+w57+x57+u6ICo6Iaz6Iap6Iao6Ie76IiI6ImY6ImZ6JWK6JWZ6JWI6JWo6JWp6JWD6JWJ6JWt6JWq6JWe6J6D6J6f6J6e6J6i6J6N6KGh6KSq6KSy6KSl6KSr6KSh6Kaq6Kam6Kum6Ku66Kur6Kux6KyA6Kuc6Kun6Kuu6Ku+6KyB6KyC6Ku36Kut6Kuz6Ku26Ku86LGr6LGt6LKT6LO06LmE6Lix6Li06LmC6Li56Li16Ly76Lyv6Ly46Lyz6L6o6L6m6YG16YG06YG46YGy6YG86YG66YS06YaS6Yyg6Yy26Yu46Yyz6Yyv6Yyi6Yu86Yyr6YyE6YyaXCJcblx0XSxcblx0W1xuXHRcdFwiYzA0MFwiLFxuXHRcdFwi6YyQ6Yym6Yyh6YyV6Yyu6YyZ6Za76Zqn6Zqo6Zqq6ZuV6ZyO6ZyR6ZyW6ZyN6ZyT6ZyP6Z2b6Z2c6Z2m6Z6Y6aCw6aC46aC76aC36aCt6aC56aCk6aSQ6aSo6aSe6aSb6aSh6aSa6aet6aei6aex6aq46aq86au76aut6ayo6a6R6bSV6bSj6bSm6bSo6bSS6bSb6buY6buU6b6N6b6c5YSq5YSf5YSh5YSy5Yu15ZqO5ZqA5ZqQ5ZqF5ZqHXCJcblx0XSxcblx0W1xuXHRcdFwiYzBhMVwiLFxuXHRcdFwi5ZqP5aOV5aOT5aOR5aOO5ayw5ayq5ayk5a265bC35bGo5ba85ba65ba95ba45bmr5b2M5b695oeJ5oeC5oeH5oem5oeL5oiy5oi05pOO5pOK5pOY5pOg5pOw5pOm5pOs5pOx5pOi5pOt5paC5paD5puZ5puW5qqA5qqU5qqE5qqi5qqc5qub5qqj5qm+5qqX5qqQ5qqg5q2c5q6u5q+a5rCI5r+Y5r+x5r+f5r+g5r+b5r+k5r+r5r+v5r6A5r+s5r+h5r+p5r+V5r+u5r+w54en54ef54eu54em54el54et54es54e054eg54i154mG542w542y55Kp55Kw55Km55Ko55mG55mC55mM55uq556z556q556w556sXCJcblx0XSxcblx0W1xuXHRcdFwiYzE0MFwiLFxuXHRcdFwi556n556t55+v56O356O656O056Ov56SB56an56aq56mX56q/57CH57CN56++56+357CM56+g57Og57Oc57Oe57Oi57Of57OZ57Od57iu57i+57mG57i357iy57mD57ir57i957ix57mF57mB57i057i557mI57i157i/57iv572E57+z57+86IGx6IGy6IGw6IGv6IGz6IeG6IeD6Ia66IeC6IeA6Ia/6Ia96IeJ6Ia+6Ieo6IiJ6Imx6JaqXCJcblx0XSxcblx0W1xuXHRcdFwiYzFhMVwiLFxuXHRcdFwi6JaE6JW+6Jac6JaR6JaU6Jav6Jab6JaH6Jao6JaK6Jmn6J+A6J+R6J6z6J+S6J+G6J6r6J676J666J+I6J+L6KS76KS26KWE6KS46KS96Kas6KyO6KyX6KyZ6Kyb6KyK6Kyg6Kyd6KyE6KyQ6LGB6LC/6LGz6LO66LO96LO86LO46LO76Lao6LmJ6LmL6LmI6LmK6L2E6Ly+6L2C6L2F6Ly/6YG/6YG96YKE6YKB6YKC6YKA6YS56Yaj6Yae6Yac6Y2N6Y6C6Yyo6Y216Y2K6Y2l6Y2L6YyY6Y2+6Y2s6Y2b6Y2w6Y2a6Y2U6ZeK6ZeL6ZeM6ZeI6ZeG6Zqx6Zq46ZuW6Zyc6Zye6Z6g6Z+T6aGG6aK26aS16aiBXCJcblx0XSxcblx0W1xuXHRcdFwiYzI0MFwiLFxuXHRcdFwi6ae/6a6u6a6r6a6q6a6t6bS76bS/6bqL6buP6bue6buc6bud6bub6by+6b2L5Y+i5ZqV5Zqu5aOZ5aOY5ay45b2d5oej5oiz5pO05pOy5pO+5pSG5pO65pO75pO35pa35puc5pym5qqz5qqs5quD5qq75qq45quC5qqu5qqv5q2f5q245q6v54CJ54CL5r++54CG5r+654CR54CP54e754e854e+54e45423542155Kn55K/55SV55mW55mYXCJcblx0XSxcblx0W1xuXHRcdFwiYzJhMVwiLFxuXHRcdFwi55mS5569556/5567556856SO56au56mh56mi56mg56uE56uF57Cr57Cn57Cq57Ce57Cj57Ch57On57mU57mV57me57ma57mh57mS57mZ572I57+557+76IG36IG26IeN6IeP6IiK6JeP6Jap6JeN6JeQ6JeJ6Jaw6Ja66Ja56Jam6J+v6J+s6J+y6J+g6KaG6Kay6Ke06Kyo6Ky56Kys6Kyr6LGQ6LSF6LmZ6Lmj6Lmm6Lmk6Lmf6LmV6LuA6L2J6L2N6YKH6YKD6YKI6Yar6Yas6YeQ6Y6U6Y6K6Y6W6Y6i6Y6z6Y6u6Y6s6Y6w6Y6Y6Y6a6Y6X6ZeU6ZeW6ZeQ6ZeV6Zui6Zuc6ZuZ6Zub6Zue6Zyk6Z6j6Z6mXCJcblx0XSxcblx0W1xuXHRcdFwiYzM0MFwiLFxuXHRcdFwi6Z6t6Z+56aGN6aGP6aGM6aGO6aGT6aK66aS+6aS/6aS96aSu6aal6aiO6auB6ayD6ayG6a2P6a2O6a2N6a+K6a+J6a+96a+I6a+A6bWR6bWd6bWg6bug6byV6bys5YSz5Zql5aOe5aOf5aOi5a+16b6Q5bus5oey5oe35oe25oe15pSA5pSP5pug5pud5qul5qud5qua5quT54Cb54Cf54Co54Ca54Cd54CV54CY54iG54iN54mY54qi5424XCJcblx0XSxcblx0W1xuXHRcdFwiYzNhMVwiLFxuXHRcdFwi542655K955OK55Oj55aH55aG55mf55mh55+H56SZ56ax56mr56mp57C+57C/57C457C957C357GA57mr57mt57m557mp57mq576F57mz5762576557646IeY6Jep6Jed6Jeq6JeV6Jek6Jel6Je36J+76KCF6KCN6J+56J++6KWg6KWf6KWW6KWe6K2B6K2c6K2Y6K2J6K2a6K2O6K2P6K2G6K2Z6LSI6LSK6Lm86Lmy6LqH6Lm26Lms6Lm66Lm06L2U6L2O6L6t6YKK6YKL6Yax6Yau6Y+h6Y+R6Y+f6Y+D6Y+I6Y+c6Y+d6Y+W6Y+i6Y+N6Y+Y6Y+k6Y+X6Y+o6Zec6Zq06Zuj6Zyq6Zyn6Z2h6Z+c6Z+76aGeXCJcblx0XSxcblx0W1xuXHRcdFwiYzQ0MFwiLFxuXHRcdFwi6aGY6aGb6aK86aWF6aWJ6aiW6aiZ6ayN6a+o6a+n6a+W6a+b6baJ6bWh6bWy6bWq6bWs6bqS6bqX6bqT6bq05Yu45Zqo5Zq35Zq25Zq05Zq85aOk5a2A5a2D5a295a+25beJ5oe45oe65pSY5pSU5pSZ5pum5pyn5qus54C+54Cw54Cy54iQ542755OP55mi55ml56Sm56Sq56Ss56Sr56uH56u257GM57GD57GN57Ov57Ow6L6u57m957m8XCJcblx0XSxcblx0W1xuXHRcdFwiYzRhMVwiLFxuXHRcdFwi57qC572M6ICA6Iea6Imm6Je76Je56JiR6Je66JiG6JiL6JiH6JiK6KCU6KCV6KWk6Ka66Ke46K2w6K2s6K2m6K2v6K2f6K2r6LSP6LSN6LqJ6LqB6LqF6LqC6Ya06YeL6ZCY6ZCD6Y+96Zeh6Zyw6aOE6aWS6aWR6aao6air6aiw6ai36ai16bCT6bCN6bm56bq16buo6byv6b2f6b2j6b2h5YS35YS45ZuB5ZuA5ZuC5aSU5bGs5beN5oe85oe+5pSd5pSc5paV5pup5qu75qyE5qu65q6y54GM54ib54qn55OW55OU55mp55+T57GQ57qP57qM57686JiX6Jit6Jia6KCj6KCi6KCh6KCf6KWq6KWs6Ka96K20XCJcblx0XSxcblx0W1xuXHRcdFwiYzU0MFwiLFxuXHRcdFwi6K236K296LST6LqK6LqN6LqL6L2f6L6v6Ya66ZCu6ZCz6ZC16ZC66ZC46ZCy6ZCr6Zei6Zy46Zy56Zyy6Z+/6aGn6aGl6aWX6amF6amD6amA6ai+6auP6a2U6a2R6bCt6bCl6bav6ba06beC6ba46bqd6buv6byZ6b2c6b2m6b2n5YS85YS75ZuI5ZuK5ZuJ5a2/5beU5beS5b2O5oe/5pSk5qyK5q2h54GR54GY546A55Ok55aK55mu55msXCJcblx0XSxcblx0W1xuXHRcdFwiYzVhMVwiLFxuXHRcdFwi56az57Gg57Gf6IG+6IG96Ief6KWy6KWv6Ke86K6A6LSW6LSX6LqR6LqT6L2h6YWI6ZGE6ZGR6ZGS6Zy96Zy+6Z+D6Z+B6aGr6aWV6amV6amN6auS6aya6bGJ6bCx6bC+6bC76beT6beX6by06b2s6b2q6b6U5ZuM5beW5oiA5pSj5pSr5pSq5pus5qyQ55Oa56uK57Gk57Gj57Gl57qT57qW57qU6Iei6Ji46Ji/6KCx6K6K6YKQ6YKP6ZGj6ZGg6ZGk6Z2o6aGv6aWc6ama6amb6amX6auT6auU6auR6bGU6bGX6bGW6bel6bqf6bu05ZuR5aOp5pSs54Ge55mx55my55+X572Q576I6KC26KC56KGi6K6T6K6SXCJcblx0XSxcblx0W1xuXHRcdFwiYzY0MFwiLFxuXHRcdFwi6K6W6Im36LSb6YeA6ZGq6Z2C6Z2I6Z2E6Z+G6aGw6amf6ayi6a2Y6bGf6be56be66bm86bm96byH6b236b2y5buz5qyW54Gj57Gs57Gu6KC76KeA6Lqh6YeB6ZGy6ZGw6aGx6aWe6auW6ayj6buM54Gk55+a6K6a6ZG36Z+J6ami6aml57qc6K6c6Lqq6YeF6ZG96ZG+6ZG86bG36bG46bu36LGU6ZG/6bia54io6amq6ayx6bib6bie57GyXCJcblx0XSxcblx0W1xuXHRcdFwiYzk0MFwiLFxuXHRcdFwi5LmC5Lmc5Ye15Yya5Y6C5LiH5LiM5LmH5LqN5ZuX76iM5bGu5b2z5LiP5YaH5LiO5Liu5LqT5LuC5LuJ5LuI5YaY5Yu85Y2s5Y655Zyg5aSD5aSs5bCQ5be/5peh5q6z5q+M5rCU54i/5Lix5Li85Luo5Luc5Lup5Luh5Lud5Lua5YiM5Yyc5Y2M5Zyi5Zyj5aSX5aSv5a6B5a6E5bCS5bC75bG05bGz5biE5bqA5bqC5b+J5oiJ5omQ5rCVXCJcblx0XSxcblx0W1xuXHRcdFwiYzlhMVwiLFxuXHRcdFwi5rC25rGD5rC/5rC754qu54qw546K56a46IKK6Zie5LyO5LyY5Lys5Lu15LyU5Lux5LyA5Lu35LyI5Lyd5LyC5LyF5Lyi5LyT5LyE5Lu05LyS5Yax5YiT5YiJ5YiQ5Yqm5Yyi5Yyf5Y2N5Y6K5ZCH5Zuh5Zuf5Zyu5Zyq5Zy05aS85aaA5aW85aaF5aW75aW+5aW35aW/5a2W5bCV5bCl5bG85bG65bG75bG+5bef5bm15bqE5byC5bya5b205b+V5b+U5b+P5omc5ome5omk5omh5omm5omi5omZ5omg5oma5oml5pev5peu5py+5py55py45py75py65py/5py85pyz5rCY5rGG5rGS5rGc5rGP5rGK5rGU5rGLXCJcblx0XSxcblx0W1xuXHRcdFwiY2E0MFwiLFxuXHRcdFwi5rGM54Gx54me54q054q1546O55Sq55m/56m1572R6Im46Im86IqA6Im96Im/6JmN6KW+6YKZ6YKX6YKY6YKb6YKU6Zii6Zik6Zig6Zij5L2W5Ly75L2i5L2J5L2T5L2k5Ly+5L2n5L2S5L2f5L2B5L2Y5Lyt5Lyz5Ly/5L2h5YaP5Ya55Yic5Yie5Yih5Yqt5Yqu5YyJ5Y2j5Y2y5Y6O5Y6P5ZCw5ZC35ZCq5ZGU5ZGF5ZCZ5ZCc5ZCl5ZCYXCJcblx0XSxcblx0W1xuXHRcdFwiY2FhMVwiLFxuXHRcdFwi5ZC95ZGP5ZGB5ZCo5ZCk5ZGH5Zuu5Zun5Zul5Z2B5Z2F5Z2M5Z2J5Z2L5Z2S5aSG5aWA5aam5aaY5aag5aaX5aaO5aai5aaQ5aaP5aan5aah5a6O5a6S5bCo5bCq5bKN5bKP5bKI5bKL5bKJ5bKS5bKK5bKG5bKT5bKV5beg5biK5biO5bqL5bqJ5bqM5bqI5bqN5byF5byd5b245b225b+S5b+R5b+Q5b+t5b+o5b+u5b+z5b+h5b+k5b+j5b+65b+v5b+35b+75oCA5b+05oi65oqD5oqM5oqO5oqP5oqU5oqH5omx5om75om65omw5oqB5oqI5om35om95omy5om05pS35pew5pe05pez5pey5pe15p2F5p2HXCJcblx0XSxcblx0W1xuXHRcdFwiY2I0MFwiLFxuXHRcdFwi5p2Z5p2V5p2M5p2I5p2d5p2N5p2a5p2L5q+Q5rCZ5rCa5rG45rGn5rGr5rKE5rKL5rKP5rGx5rGv5rGp5rKa5rGt5rKH5rKV5rKc5rGm5rGz5rGl5rG75rKO54G054G654mj54q/54q954uD54uG54uB54q654uF546V546X546T546U546S55S655S555aU55aV55qB56S96IC06IKV6IKZ6IKQ6IKS6IKc6IqQ6IqP6IqF6IqO6IqR6IqTXCJcblx0XSxcblx0W1xuXHRcdFwiY2JhMVwiLFxuXHRcdFwi6IqK6IqD6IqE6LG46L+J6L6/6YKf6YKh6YKl6YKe6YKn6YKg6Ziw6Zio6Ziv6Zit5Liz5L6Y5L285L6F5L295L6A5L6H5L225L205L6J5L6E5L235L2M5L6X5L2q5L6a5L255L6B5L245L6Q5L6c5L6U5L6e5L6S5L6C5L6V5L2r5L2u5Yae5Ya85Ya+5Yi15Yiy5Yiz5YmG5Yix5Yq85YyK5YyL5Yy85Y6S5Y6U5ZKH5ZG/5ZKB5ZKR5ZKC5ZKI5ZGr5ZG65ZG+5ZGl5ZGs5ZG05ZGm5ZKN5ZGv5ZGh5ZGg5ZKY5ZGj5ZGn5ZGk5Zu35Zu55Z2v5Z2y5Z2t5Z2r5Z2x5Z2w5Z225Z6A5Z215Z275Z2z5Z205Z2iXCJcblx0XSxcblx0W1xuXHRcdFwiY2M0MFwiLFxuXHRcdFwi5Z2o5Z295aSM5aWF5aa15aa65aeP5aeO5aay5aeM5aeB5aa25aa85aeD5aeW5aax5aa95aeA5aeI5aa05aeH5a2i5a2l5a6T5a6V5bGE5bGH5bKu5bKk5bKg5bK15bKv5bKo5bKs5bKf5bKj5bKt5bKi5bKq5bKn5bKd5bKl5bK25bKw5bKm5biX5biU5biZ5byo5byi5byj5byk5b2U5b6C5b2+5b295b+e5b+l5oCt5oCm5oCZ5oCy5oCLXCJcblx0XSxcblx0W1xuXHRcdFwiY2NhMVwiLFxuXHRcdFwi5oC05oCK5oCX5oCz5oCa5oCe5oCs5oCi5oCN5oCQ5oCu5oCT5oCR5oCM5oCJ5oCc5oiU5oi95oqt5oq05ouR5oq+5oqq5oq25ouK5oqu5oqz5oqv5oq75oqp5oqw5oq45pS95pao5pa75piJ5pe85piE5piS5piI5pe75piD5piL5piN5piF5pe95piR5piQ5pu25pyK5p6F5p2s5p6O5p6S5p225p275p6Y5p6G5p6E5p205p6N5p6M5p265p6f5p6R5p6Z5p6D5p295p6B5p245p255p6U5qyl5q6A5q2+5q+e5rCd5rKT5rOs5rOr5rOu5rOZ5rK25rOU5rKt5rOn5rK35rOQ5rOC5rK65rOD5rOG5rOt5rOyXCJcblx0XSxcblx0W1xuXHRcdFwiY2Q0MFwiLFxuXHRcdFwi5rOS5rOd5rK05rKK5rKd5rKA5rOe5rOA5rSw5rON5rOH5rKw5rO55rOP5rOp5rOR54KU54KY54KF54KT54KG54KE54KR54KW54KC54Ka54KD54mq54uW54uL54uY54uJ54uc54uS54uU54ua54uM54uR546k546h546t546m546i546g546s546d55Od55Oo55S/55WA55S+55aM55aY55qv55uz55ux55uw55u155+455+855+555+755+6XCJcblx0XSxcblx0W1xuXHRcdFwiY2RhMVwiLFxuXHRcdFwi55+356WC56S/56eF56m456m756u757G157O96IC16IKP6IKu6IKj6IK46IK16IKt6Iig6Iqg6IuA6Iqr6Iqa6IqY6Iqb6Iq16Iqn6Iqu6Iq86Iqe6Iq66Iq06Iqo6Iqh6Iqp6IuC6Iqk6IuD6Iq26Iqi6Jmw6Jmv6Jmt6Jmu6LGW6L+S6L+L6L+T6L+N6L+W6L+V6L+X6YKy6YK06YKv6YKz6YKw6Zi56Zi96Zi86Zi66ZmD5L+N5L+F5L+T5L6y5L+J5L+L5L+B5L+U5L+c5L+Z5L675L6z5L+b5L+H5L+W5L665L+A5L655L+s5YmE5YmJ5YuA5YuC5Yy95Y285Y6X5Y6W5Y6Z5Y6Y5ZK65ZKh5ZKt5ZKl5ZOPXCJcblx0XSxcblx0W1xuXHRcdFwiY2U0MFwiLFxuXHRcdFwi5ZOD6IyN5ZK35ZKu5ZOW5ZK25ZOF5ZOG5ZKg5ZGw5ZK85ZKi5ZK+5ZGy5ZOe5ZKw5Z615Z6e5Z6f5Z6k5Z6M5Z6X5Z6d5Z6b5Z6U5Z6Y5Z6P5Z6Z5Z6l5Z6a5Z6V5aO05aSN5aWT5aeh5aee5aeu5aiA5aex5aed5ae65ae95ae85ae25aek5aey5ae35aeb5aep5aez5ae15aeg5ae+5ae05aet5a6o5bGM5bOQ5bOY5bOM5bOX5bOL5bObXCJcblx0XSxcblx0W1xuXHRcdFwiY2VhMVwiLFxuXHRcdFwi5bOe5bOa5bOJ5bOH5bOK5bOW5bOT5bOU5bOP5bOI5bOG5bOO5bOf5bO45be55bih5bii5bij5big5bik5bqw5bqk5bqi5bqb5bqj5bql5byH5byu5b2W5b6G5oC35oC55oGU5oGy5oGe5oGF5oGT5oGH5oGJ5oGb5oGM5oGA5oGC5oGf5oCk5oGE5oGY5oGm5oGu5omC5omD5ouP5oyN5oyL5ou15oyO5oyD5our5ou55oyP5oyM5ou45ou25oyA5oyT5oyU5ou65oyV5ou75ouw5pWB5pWD5paq5pa/5pi25pih5piy5pi15pic5pim5pii5piz5pir5pi65pid5pi05pi55piu5pyP5pyQ5p+B5p+y5p+I5p66XCJcblx0XSxcblx0W1xuXHRcdFwiY2Y0MFwiLFxuXHRcdFwi5p+c5p675p+45p+Y5p+A5p635p+F5p+r5p+k5p+f5p615p+N5p6z5p+35p+25p+u5p+j5p+C5p655p+O5p+n5p+w5p6y5p+85p+G5p+t5p+M5p6u5p+m5p+b5p+65p+J5p+K5p+D5p+q5p+L5qyo5q6C5q6E5q625q+W5q+Y5q+g5rCg5rCh5rSo5rS05rSt5rSf5rS85rS/5rSS5rSK5rOa5rSz5rSE5rSZ5rS65rSa5rSR5rSA5rSd5rWCXCJcblx0XSxcblx0W1xuXHRcdFwiY2ZhMVwiLFxuXHRcdFwi5rSB5rSY5rS35rSD5rSP5rWA5rSH5rSg5rSs5rSI5rSi5rSJ5rSQ54K354Kf54K+54Kx54Kw54Kh54K054K154Kp54mB54mJ54mK54ms54mw54mz54mu54uK54uk54uo54ur54uf54uq54um54uj546F54+M54+C54+I54+F546554625461546054+r546/54+H546+54+D54+G546454+L55Os55Ou55Su55WH55WI55an55aq55m555uE55yI55yD55yE55yF55yK55u355u755u655+n55+o56CG56CR56CS56CF56CQ56CP56CO56CJ56CD56CT56WK56WM56WL56WF56WE56eV56eN56eP56eW56eO56qAXCJcblx0XSxcblx0W1xuXHRcdFwiZDA0MFwiLFxuXHRcdFwi56m+56uR56yA56yB57G657G457G557G/57KA57KB57SD57SI57SB572Y576R576N576+6ICH6ICO6ICP6ICU6IC36IOY6IOH6IOg6IOR6IOI6IOC6IOQ6IOF6IOj6IOZ6IOc6IOK6IOV6IOJ6IOP6IOX6IOm6ION6Ie/6Iih6IqU6IuZ6Iu+6Iu56IyH6Iuo6IyA6IuV6Iy66Iur6IuW6Iu06Ius6Iuh6Iuy6Iu16IyM6Iu76Iu26Iuw6IuqXCJcblx0XSxcblx0W1xuXHRcdFwiZDBhMVwiLFxuXHRcdFwi6Iuk6Iug6Iu66Iuz6Iut6Jm36Jm06Jm86Jmz6KGB6KGO6KGn6KGq6KGp6KeT6KiE6KiH6LWy6L+j6L+h6L+u6L+g6YOx6YK96YK/6YOV6YOF6YK+6YOH6YOL6YOI6YeU6YeT6ZmU6ZmP6ZmR6ZmT6ZmK6ZmO5YCe5YCF5YCH5YCT5YCi5YCw5YCb5L+15L+05YCz5YC35YCs5L+25L+35YCX5YCc5YCg5YCn5YC15YCv5YCx5YCO5YWa5YaU5YaT5YeK5YeE5YeF5YeI5YeO5Ymh5Yma5YmS5Yme5Ymf5YmV5Ymi5YuN5YyO5Y6e5ZSm5ZOi5ZSX5ZSS5ZOn5ZOz5ZOk5ZSa5ZO/5ZSE5ZSI5ZOr5ZSR5ZSF5ZOxXCJcblx0XSxcblx0W1xuXHRcdFwiZDE0MFwiLFxuXHRcdFwi5ZSK5ZO75ZO35ZO45ZOg5ZSO5ZSD5ZSL5ZyB5ZyC5Z+M5aCy5Z+V5Z+S5Z665Z+G5Z695Z685Z645Z625Z6/5Z+H5Z+Q5Z655Z+B5aSO5aWK5aiZ5aiW5ait5aiu5aiV5aiP5aiX5aiK5aie5aiz5a2s5a6n5a6t5a6s5bCD5bGW5bGU5bOs5bO/5bOu5bOx5bO35bSA5bO55bip5bio5bqo5bqu5bqq5bqs5byz5byw5b2n5oGd5oGa5oGnXCJcblx0XSxcblx0W1xuXHRcdFwiZDFhMVwiLFxuXHRcdFwi5oGB5oKi5oKI5oKA5oKS5oKB5oKd5oKD5oKV5oKb5oKX5oKH5oKc5oKO5oiZ5omG5ouy5oyQ5o2W5oys5o2E5o2F5oy25o2D5o+k5oy55o2L5o2K5oy85oyp5o2B5oy05o2Y5o2U5o2Z5oyt5o2H5oyz5o2a5o2R5oy45o2X5o2A5o2I5pWK5pWG5peG5peD5peE5peC5pmK5pmf5pmH5pmR5pyS5pyT5qCf5qCa5qGJ5qCy5qCz5qC75qGL5qGP5qCW5qCx5qCc5qC15qCr5qCt5qCv5qGO5qGE5qC05qCd5qCS5qCU5qCm5qCo5qCu5qGN5qC65qCl5qCg5qys5qyv5qyt5qyx5qy05q2t6IKC5q6I5q+m5q+kXCJcblx0XSxcblx0W1xuXHRcdFwiZDI0MFwiLFxuXHRcdFwi5q+o5q+j5q+i5q+n5rCl5rW65rWj5rWk5rW25rSN5rWh5raS5rWY5rWi5rWt5rWv5raR5raN5rev5rW/5raG5rWe5rWn5rWg5raX5rWw5rW85rWf5raC5raY5rSv5rWo5raL5rW+5raA5raE5rSW5raD5rW75rW95rW15raQ54Oc54OT54OR54Od54OL57y554Oi54OX54OS54Oe54Og54OU54ON54OF54OG54OH54Oa54OO54Oh54mC54m4XCJcblx0XSxcblx0W1xuXHRcdFwiZDJhMVwiLFxuXHRcdFwi54m354m254yA54u654u054u+54u254uz54u754yB54+T54+Z54+l54+W546854+n54+j54+p54+c54+S54+b54+U54+d54+a54+X54+Y54+o55Oe55Of55O055O155Sh55Wb55Wf55aw55eB55a755eE55eA55a/55a255a655qK55uJ55yd55yb55yQ55yT55yS55yj55yR55yV55yZ55ya55yi55yn56Cj56Cs56Ci56C156Cv56Co56Cu56Cr56Ch56Cp56Cz56Cq56Cx56WU56Wb56WP56Wc56WT56WS56WR56er56es56eg56eu56et56eq56ec56ee56ed56qG56qJ56qF56qL56qM56qK56qH56uY56yQXCJcblx0XSxcblx0W1xuXHRcdFwiZDM0MFwiLFxuXHRcdFwi56yE56yT56yF56yP56yI56yK56yO56yJ56yS57KE57KR57KK57KM57KI57KN57KF57Se57Sd57SR57SO57SY57SW57ST57Sf57SS57SP57SM572c572h572e572g572d572b576W576S57+D57+C57+A6ICW6IC+6IC56IO66IOy6IO56IO16ISB6IO76ISA6IiB6Iiv6Iil6Iyz6Iyt6I2E6IyZ6I2R6Iyl6I2W6Iy/6I2B6Iym6Iyc6IyiXCJcblx0XSxcblx0W1xuXHRcdFwiZDNhMVwiLFxuXHRcdFwi6I2C6I2O6Iyb6Iyq6IyI6Iy86I2N6IyW6Iyk6Iyg6Iy36Iyv6Iyp6I2H6I2F6I2M6I2T6Iye6Iys6I2L6Iyn6I2I6JmT6JmS6Jqi6Jqo6JqW6JqN6JqR6Jqe6JqH6JqX6JqG6JqL6Jqa6JqF6Jql6JqZ6Jqh6Jqn6JqV6JqY6JqO6Jqd6JqQ6JqU6KGD6KGE6KGt6KG16KG26KGy6KKA6KGx6KG/6KGv6KKD6KG+6KG06KG86KiS6LGH6LGX6LG76LKk6LKj6LW26LW46La16La36La26LuR6LuT6L++6L+16YCC6L+/6L+76YCE6L+86L+26YOW6YOg6YOZ6YOa6YOj6YOf6YOl6YOY6YOb6YOX6YOc6YOk6YWQXCJcblx0XSxcblx0W1xuXHRcdFwiZDQ0MFwiLFxuXHRcdFwi6YWO6YWP6YeV6Yei6Yea6Zmc6Zmf6Zq86aOj6auf6ayv5Lm/5YGw5YGq5YGh5YGe5YGg5YGT5YGL5YGd5YGy5YGI5YGN5YGB5YGb5YGK5YGi5YCV5YGF5YGf5YGp5YGr5YGj5YGk5YGG5YGA5YGu5YGz5YGX5YGR5YeQ5Ymr5Ymt5Yms5Ymu5YuW5YuT5Yyt5Y6c5ZW15ZW25ZS85ZWN5ZWQ5ZS05ZSq5ZWR5ZWi5ZS25ZS15ZSw5ZWS5ZWFXCJcblx0XSxcblx0W1xuXHRcdFwiZDRhMVwiLFxuXHRcdFwi5ZSM5ZSy5ZWl5ZWO5ZS55ZWI5ZSt5ZS75ZWA5ZWL5ZyK5ZyH5Z+75aCU5Z+i5Z+25Z+c5Z+05aCA5Z+t5Z+95aCI5Z+45aCL5Z+z5Z+P5aCH5Z+u5Z+j5Z+y5Z+l5Z+s5Z+h5aCO5Z+85aCQ5Z+n5aCB5aCM5Z+x5Z+p5Z+w5aCN5aCE5aWc5amg5amY5amV5amn5ame5ai45ai15amt5amQ5amf5aml5ams5amT5amk5amX5amD5amd5amS5amE5amb5amI5aqO5ai+5amN5ai55amM5amw5amp5amH5amR5amW5amC5amc5a2y5a2u5a+B5a+A5bGZ5bSe5bSL5bSd5bSa5bSg5bSM5bSo5bSN5bSm5bSl5bSPXCJcblx0XSxcblx0W1xuXHRcdFwiZDU0MFwiLFxuXHRcdFwi5bSw5bSS5bSj5bSf5bSu5bi+5bi05bqx5bq05bq55bqy5bqz5by25by45b6b5b6W5b6f5oKK5oKQ5oKG5oK+5oKw5oK65oOT5oOU5oOP5oOk5oOZ5oOd5oOI5oKx5oOb5oK35oOK5oK/5oOD5oON5oOA5oyy5o2l5o6K5o6C5o295o695o6e5o6t5o6d5o6X5o6r5o6O5o2v5o6H5o6Q5o2u5o6v5o215o6c5o2t5o6u5o285o6k5oy75o6fXCJcblx0XSxcblx0W1xuXHRcdFwiZDVhMVwiLFxuXHRcdFwi5o245o6F5o6B5o6R5o6N5o2w5pWT5peN5pml5pmh5pmb5pmZ5pmc5pmi5pyY5qG55qKH5qKQ5qKc5qGt5qGu5qKu5qKr5qWW5qGv5qKj5qKs5qKp5qG15qG05qKy5qKP5qG35qKS5qG85qGr5qGy5qKq5qKA5qGx5qG+5qKb5qKW5qKL5qKg5qKJ5qKk5qG45qG75qKR5qKM5qKK5qG95qy25qyz5qy35qy45q6R5q6P5q6N5q6O5q6M5rCq5reA5rar5ra05raz5rm05ras5rep5rei5ra35re25reU5riA5reI5reg5ref5reW5ra+5rel5rec5red5reb5re05reK5ra95ret5rew5ra65reV5reC5reP5reJXCJcblx0XSxcblx0W1xuXHRcdFwiZDY0MFwiLFxuXHRcdFwi5reQ5rey5reT5re95reX5reN5rej5ra754O654SN54O354SX54O054SM54Ow54SE54Oz54SQ54O854O/54SG54ST54SA54O454O254SL54SC54SO54m+54m754m854m/54yd54yX54yH54yR54yY54yK54yI54u/54yP54ye546I54+254+454+155CE55CB54+955CH55CA54+654+854+/55CM55CL54+055CI55Wk55Wj55eO55eS55ePXCJcblx0XSxcblx0W1xuXHRcdFwiZDZhMVwiLFxuXHRcdFwi55eL55eM55eR55eQ55qP55qJ55uT55y555yv55yt55yx55yy55y055yz55y955yl55y755y156GI56GS56GJ56GN56GK56GM56Cm56GF56GQ56Wk56Wn56Wp56Wq56Wj56Wr56Wh56a756e656e456e256e356qP56qU56qQ56y1562H56y056yl56yw56yi56yk56yz56yY56yq56yd56yx56yr56yt56yv56yy56y456ya56yj57KU57KY57KW57Kj57S157S957S457S257S657WF57Ss57Sp57WB57WH57S+57S/57WK57S757So572j576V576c576d576b57+K57+L57+N57+Q57+R57+H57+P57+J6ICfXCJcblx0XSxcblx0W1xuXHRcdFwiZDc0MFwiLFxuXHRcdFwi6ICe6ICb6IGH6IGD6IGI6ISY6ISl6ISZ6ISb6ISt6ISf6ISs6ISe6ISh6ISV6ISn6ISd6ISi6IiR6Ii46Iiz6Ii66Ii06Iiy6Im06I6Q6I6j6I6o6I6N6I266I2z6I6k6I206I6P6I6B6I6V6I6Z6I216I6U6I6p6I296I6D6I6M6I6d6I6b6I6q6I6L6I2+6I6l6I6v6I6I6I6X6I6w6I2/6I6m6I6H6I6u6I226I6a6JmZ6JmW6Jq/6Jq3XCJcblx0XSxcblx0W1xuXHRcdFwiZDdhMVwiLFxuXHRcdFwi6JuC6JuB6JuF6Jq66Jqw6JuI6Jq56Jqz6Jq46JuM6Jq06Jq76Jq86JuD6Jq96Jq+6KGS6KKJ6KKV6KKo6KKi6KKq6KKa6KKR6KKh6KKf6KKY6KKn6KKZ6KKb6KKX6KKk6KKs6KKM6KKT6KKO6KaC6KeW6KeZ6KeV6Kiw6Kin6Kis6Kie6LC56LC76LGc6LGd6LG96LKl6LW96LW76LW56La86LeC6La56La/6LeB6LuY6Lue6Lud6Luc6LuX6Lug6Luh6YCk6YCL6YCR6YCc6YCM6YCh6YOv6YOq6YOw6YO06YOy6YOz6YOU6YOr6YOs6YOp6YWW6YWY6YWa6YWT6YWV6Yes6Ye06Yex6Yez6Ye46Yek6Ye56YeqXCJcblx0XSxcblx0W1xuXHRcdFwiZDg0MFwiLFxuXHRcdFwi6Yer6Ye36Yeo6Yeu6ZW66ZaG6ZaI6Zm86Zmt6Zmr6Zmx6Zmv6Zq/6Z2q6aCE6aOl6aaX5YKb5YKV5YKU5YKe5YKL5YKj5YKD5YKM5YKO5YKd5YGo5YKc5YKS5YKC5YKH5YWf5YeU5YyS5YyR5Y6k5Y6n5ZaR5Zao5Zal5Zat5ZW35ZmF5Zai5ZaT5ZaI5ZaP5Za15ZaB5Zaj5ZaS5Zak5ZW95ZaM5Zam5ZW/5ZaV5Zah5ZaO5ZyM5aCp5aC3XCJcblx0XSxcblx0W1xuXHRcdFwiZDhhMVwiLFxuXHRcdFwi5aCZ5aCe5aCn5aCj5aCo5Z+15aGI5aCl5aCc5aCb5aCz5aC/5aC25aCu5aC55aC45aCt5aCs5aC75aWh5aqv5aqU5aqf5am65aqi5aqe5am45aqm5am85aql5aqs5aqV5aqu5ai35aqE5aqK5aqX5aqD5aqL5aqp5am75am95aqM5aqc5aqP5aqT5aqd5a+q5a+N5a+L5a+U5a+R5a+K5a+O5bCM5bCw5bS35bWD5bWr5bWB5bWL5bS/5bS15bWR5bWO5bWV5bSz5bS65bWS5bS95bSx5bWZ5bWC5bS55bWJ5bS45bS85bSy5bS25bWA5bWF5bmE5bmB5b2Y5b6m5b6l5b6r5oOJ5oK55oOM5oOi5oOO5oOE5oSUXCJcblx0XSxcblx0W1xuXHRcdFwiZDk0MFwiLFxuXHRcdFwi5oOy5oSK5oSW5oSF5oO15oST5oO45oO85oO+5oOB5oSD5oSY5oSd5oSQ5oO/5oSE5oSL5omK5o6U5o6x5o6w5o+O5o+l5o+o5o+v5o+D5pKd5o+z5o+K5o+g5o+25o+V5o+y5o+15pGh5o+f5o6+5o+d5o+c5o+E5o+Y5o+T5o+C5o+H5o+M5o+L5o+I5o+w5o+X5o+Z5pSy5pWn5pWq5pWk5pWc5pWo5pWl5paM5pad5pae5pau5peQ5peSXCJcblx0XSxcblx0W1xuXHRcdFwiZDlhMVwiLFxuXHRcdFwi5pm85pms5pm75pqA5pmx5pm55pmq5pmy5pyB5qSM5qOT5qSE5qOc5qSq5qOs5qOq5qOx5qSP5qOW5qO35qOr5qOk5qO25qST5qSQ5qOz5qOh5qSH5qOM5qSI5qWw5qK05qSR5qOv5qOG5qSU5qO45qOQ5qO95qO85qOo5qSL5qSK5qSX5qOO5qOI5qOd5qOe5qOm5qO05qOR5qSG5qOU5qOp5qSV5qSl5qOH5qy55qy75qy/5qy85q6U5q6X5q6Z5q6V5q695q+w5q+y5q+z5rCw5re85rmG5rmH5rif5rmJ5rqI5ri85ri95rmF5rmi5rir5ri/5rmB5rmd5rmz5ric5riz5rmL5rmA5rmR5ri75riD5riu5rmeXCJcblx0XSxcblx0W1xuXHRcdFwiZGE0MFwiLFxuXHRcdFwi5rmo5rmc5rmh5rix5rio5rmg5rmx5rmr5ri55rii5riw5rmT5rml5rin5rm45rmk5rm35rmV5rm55rmS5rmm5ri15ri25rma54Sg54Se54Sv54O754Su54Sx54Sj54Sl54Si54Sy54Sf54So54S654Sb54mL54ma54qI54qJ54qG54qF54qL54yS54yL54yw54yi54yx54yz54yn54yy54yt54ym54yj54y154yM55Cu55Cs55Cw55Cr55CWXCJcblx0XSxcblx0W1xuXHRcdFwiZGFhMVwiLFxuXHRcdFwi55Ca55Ch55Ct55Cx55Ck55Cj55Cd55Cp55Cg55Cy55O755Sv55Wv55Ws55en55ea55eh55em55ed55ef55ek55eX55qV55qS55ua552G552H552E552N552F552K552O552L552M55+e55+s56Gg56Gk56Gl56Gc56Gt56Gx56Gq56Gu56Gw56Gp56Go56Ge56Gi56W056Wz56Wy56Ww56iC56iK56iD56iM56iE56qZ56um56uk562K56y7562E562I562M562O562A562Y562F57Ki57Ke57Ko57Kh57WY57Wv57Wj57WT57WW57Wn57Wq57WP57Wt57Wc57Wr57WS57WU57Wp57WR57Wf57WO57y+57y/572lXCJcblx0XSxcblx0W1xuXHRcdFwiZGI0MFwiLFxuXHRcdFwi572m576i576g576h57+X6IGR6IGP6IGQ6IO+6IOU6IWD6IWK6IWS6IWP6IWH6IS96IWN6IS66Iem6Ieu6Ie36Ie46Ie56IiE6Ii86Ii96Ii/6Im16Iy76I+P6I+56JCj6I+A6I+o6JCS6I+n6I+k6I+86I+26JCQ6I+G6I+I6I+r6I+j6I6/6JCB6I+d6I+l6I+Y6I+/6I+h6I+L6I+O6I+W6I+16I+J6JCJ6JCP6I+e6JCR6JCG6I+C6I+zXCJcblx0XSxcblx0W1xuXHRcdFwiZGJhMVwiLFxuXHRcdFwi6I+V6I+66I+H6I+R6I+q6JCT6I+D6I+s6I+u6I+E6I+76I+X6I+i6JCb6I+b6I++6JuY6Jui6Jum6JuT6Juj6Jua6Juq6Jud6Jur6Juc6Jus6Jup6JuX6Juo6JuR6KGI6KGW6KGV6KK66KOX6KK56KK46KOA6KK+6KK26KK86KK36KK96KKy6KSB6KOJ6KaV6KaY6KaX6Ked6Kea6Keb6KmO6KmN6Ki56KmZ6KmA6KmX6KmY6KmE6KmF6KmS6KmI6KmR6KmK6KmM6KmP6LGf6LKB6LKA6LK66LK+6LKw6LK56LK16LaE6LaA6LaJ6LeY6LeT6LeN6LeH6LeW6Lec6LeP6LeV6LeZ6LeI6LeX6LeF6Luv6Lu36Lu6XCJcblx0XSxcblx0W1xuXHRcdFwiZGM0MFwiLFxuXHRcdFwi6Lu56Lum6Luu6Lul6Lu16Lun6Luo6Lu26Lur6Lux6Lus6Lu06Lup6YCt6YC06YCv6YSG6YSs6YSE6YO/6YO86YSI6YO56YO76YSB6YSA6YSH6YSF6YSD6YWh6YWk6YWf6YWi6YWg6YiB6YiK6Yil6YiD6Yia6Yim6YiP6YiM6YiA6YiS6Ye/6Ye96YiG6YiE6Yin6YiC6Yic6Yik6YiZ6YiX6YiF6YiW6ZW76ZaN6ZaM6ZaQ6ZqH6Zm+6ZqIXCJcblx0XSxcblx0W1xuXHRcdFwiZGNhMVwiLFxuXHRcdFwi6ZqJ6ZqD6ZqA6ZuC6ZuI6ZuD6Zux6Zuw6Z2s6Z2w6Z2u6aCH6aKp6aOr6bOm6bu55LqD5LqE5Lq25YK95YK/5YOG5YKu5YOE5YOK5YK05YOI5YOC5YKw5YOB5YK65YKx5YOL5YOJ5YK25YK45YeX5Ym65Ym45Ym75Ym85ZeD5Zeb5ZeM5ZeQ5ZeL5ZeK5Zed5ZeA5ZeU5ZeE5Zep5Za/5ZeS5ZaN5ZeP5ZeV5Zei5ZeW5ZeI5Zey5ZeN5ZeZ5ZeC5ZyU5aGT5aGo5aGk5aGP5aGN5aGJ5aGv5aGV5aGO5aGd5aGZ5aGl5aGb5aC95aGj5aGx5aO85auH5auE5auL5aq65aq45aqx5aq15aqw5aq/5auI5aq75auGXCJcblx0XSxcblx0W1xuXHRcdFwiZGQ0MFwiLFxuXHRcdFwi5aq35auA5auK5aq05aq25auN5aq55aqQ5a+W5a+Y5a+Z5bCf5bCz5bWx5bWj5bWK5bWl5bWy5bWs5bWe5bWo5bWn5bWi5bew5bmP5bmO5bmK5bmN5bmL5buF5buM5buG5buL5buH5b2A5b6v5b6t5oO35oWJ5oWK5oSr5oWF5oS25oSy5oSu5oWG5oSv5oWP5oSp5oWA5oig6YWo5oij5oil5oik5o+F5o+x5o+r5pCQ5pCS5pCJ5pCg5pCkXCJcblx0XSxcblx0W1xuXHRcdFwiZGRhMVwiLFxuXHRcdFwi5pCz5pGD5pCf5pCV5pCY5pC55pC35pCi5pCj5pCM5pCm5pCw5pCo5pGB5pC15pCv5pCK5pCa5pGA5pCl5pCn5pCL5o+n5pCb5pCu5pCh5pCO5pWv5paS5peT5pqG5pqM5pqV5pqQ5pqL5pqK5pqZ5pqU5pm45pyg5qWm5qWf5qS45qWO5qWi5qWx5qS/5qWF5qWq5qS55qWC5qWX5qWZ5qW65qWI5qWJ5qS15qWs5qSz5qS95qWl5qOw5qW45qS05qWp5qWA5qWv5qWE5qW25qWY5qWB5qW05qWM5qS75qWL5qS35qWc5qWP5qWR5qSy5qWS5qSv5qW75qS85q2G5q2F5q2D5q2C5q2I5q2B5q6b76iN5q+75q+8XCJcblx0XSxcblx0W1xuXHRcdFwiZGU0MFwiLFxuXHRcdFwi5q+55q+35q+45rqb5ruW5ruI5rqP5ruA5rqf5rqT5rqU5rqg5rqx5rq55ruG5ruS5rq95ruB5rqe5ruJ5rq35rqw5ruN5rqm5ruP5rqy5rq+5ruD5ruc5ruY5rqZ5rqS5rqO5rqN5rqk5rqh5rq/5rqz5ruQ5ruK5rqX5rqu5rqj54WH54WU54WS54Wj54Wg54WB54Wd54Wi54Wy54W454Wq54Wh54WC54WY54WD54WL54Ww54Wf54WQ54WTXCJcblx0XSxcblx0W1xuXHRcdFwiZGVhMVwiLFxuXHRcdFwi54WE54WN54Wa54mP54qN54qM54qR54qQ54qO54y8542C54y754y6542A542K542J55GE55GK55GL55GS55GR55GX55GA55GP55GQ55GO55GC55GG55GN55GU55Oh55O/55O+55O955Sd55W555W35qaD55ev55iP55iD55e355e+55e855e555e455iQ55e755e255et55e155e955qZ55q155ud552V552f552g552S552W552a552p552n552U552Z552t55+g56KH56Ka56KU56KP56KE56KV56KF56KG56Kh56KD56G556KZ56KA56KW56G756W856aC56W956W556iR56iY56iZ56iS56iX56iV56ii56iTXCJcblx0XSxcblx0W1xuXHRcdFwiZGY0MFwiLFxuXHRcdFwi56ib56iQ56qj56qi56qe56ur562m562k562t5620562p562y562l562z562x562w562h56245622562j57Ky57K057Kv57aI57aG57aA57aN57W/57aF57W657aO57W757aD57W857aM57aU57aE57W957aS572t572r572n572o572s576m576l576n57+b57+c6ICh6IWk6IWg6IW36IWc6IWp6IWb6IWi6IWy5pyh6IWe6IW26IWn6IWvXCJcblx0XSxcblx0W1xuXHRcdFwiZGZhMVwiLFxuXHRcdFwi6IWE6IWh6Iid6ImJ6ImE6ImA6ImC6ImF6JOx6JC/6JGW6JG26JG56JKP6JKN6JGl6JGR6JGA6JKG6JGn6JCw6JGN6JG96JGa6JGZ6JG06JGz6JGd6JSH6JGe6JC36JC66JC06JG66JGD6JG46JCy6JGF6JCp6I+Z6JGL6JCv6JGC6JCt6JGf6JGw6JC56JGO6JGM6JGS6JGv6JOF6JKO6JC76JGH6JC26JCz6JGo6JG+6JGE6JCr6JGg6JGU6JGu6JGQ6JyL6JyE6Ju36JyM6Ju66JuW6Ju16J2N6Ju46JyO6JyJ6JyB6Ju26JyN6JyF6KOW6KOL6KON6KOO6KOe6KOb6KOa6KOM6KOQ6KaF6Kab6Kef6Kel6KekXCJcblx0XSxcblx0W1xuXHRcdFwiZTA0MFwiLFxuXHRcdFwi6Keh6Keg6Kei6Kec6Kem6Km26KqG6Km/6Kmh6Ki/6Km36KqC6KqE6Km16KqD6KqB6Km06Km66LC86LGL6LGK6LGl6LGk6LGm6LKG6LKE6LKF6LOM6LWo6LWp6LaR6LaM6LaO6LaP6LaN6LaT6LaU6LaQ6LaS6Lew6Leg6Les6Lex6Leu6LeQ6Lep6Lej6Lei6Len6Ley6Ler6Le06LyG6Lu/6LyB6LyA6LyF6LyH6LyI6LyC6LyL6YGS6YC/XCJcblx0XSxcblx0W1xuXHRcdFwiZTBhMVwiLFxuXHRcdFwi6YGE6YGJ6YC96YSQ6YSN6YSP6YSR6YSW6YSU6YSL6YSO6YWu6YWv6YmI6YmS6Yiw6Yi66Ymm6Yiz6Yml6Yme6YqD6Yiu6YmK6YmG6Ymt6Yms6YmP6Ymg6Ymn6Ymv6Yi26Ymh6Ymw6Yix6YmU6Ymj6YmQ6Ymy6YmO6YmT6YmM6YmW6Yiy6Zaf6Zac6Zae6Zab6ZqS6ZqT6ZqR6ZqX6ZuO6Zu66Zu96Zu46Zu16Z2z6Z236Z246Z2y6aCP6aCN6aCO6aKs6aO26aO56aav6aay6aaw6aa16aqt6aqr6a2b6bOq6bOt6bOn6bqA6bu95YOm5YOU5YOX5YOo5YOz5YOb5YOq5YOd5YOk5YOT5YOs5YOw5YOv5YOj5YOgXCJcblx0XSxcblx0W1xuXHRcdFwiZTE0MFwiLFxuXHRcdFwi5YeY5YqA5YqB5Yup5Yur5Yyw5Y6s5Zin5ZiV5ZiM5ZiS5Ze85ZiP5Zic5ZiB5ZiT5ZiC5Ze65Zid5ZiE5Ze/5Ze55aKJ5aG85aKQ5aKY5aKG5aKB5aG/5aG05aKL5aG65aKH5aKR5aKO5aG25aKC5aKI5aG75aKU5aKP5aO+5aWr5auc5auu5aul5auV5auq5aua5aut5aur5auz5aui5aug5aub5aus5aue5aud5auZ5auo5auf5a235a+gXCJcblx0XSxcblx0W1xuXHRcdFwiZTFhMVwiLFxuXHRcdFwi5a+j5bGj5baC5baA5bW95baG5bW65baB5bW35baK5baJ5baI5bW+5bW85baN5bW55bW/5bmY5bmZ5bmT5buY5buR5buX5buO5buc5buV5buZ5buS5buU5b2E5b2D5b2v5b625oSs5oSo5oWB5oWe5oWx5oWz5oWS5oWT5oWy5oWs5oaA5oW05oWU5oW65oWb5oWl5oS75oWq5oWh5oWW5oip5oin5oir5pCr5pGN5pGb5pGd5pG05pG25pGy5pGz5pG95pG15pGm5pKm5pGO5pKC5pGe5pGc5pGL5pGT5pGg5pGQ5pG/5pC/5pGs5pGr5pGZ5pGl5pG35pWz5pag5pqh5pqg5pqf5pyF5pyE5pyi5qax5qa25qeJXCJcblx0XSxcblx0W1xuXHRcdFwiZTI0MFwiLFxuXHRcdFwi5qag5qeO5qaW5qaw5qas5qa85qaR5qaZ5qaO5qan5qaN5qap5qa+5qav5qa/5qeE5qa95qak5qeU5qa55qeK5qaa5qeP5qaz5qaT5qaq5qah5qae5qeZ5qaX5qaQ5qeC5qa15qal5qeG5q2K5q2N5q2L5q6e5q6f5q6g5q+D5q+E5q++5ruO5ru15rux5ryD5ryl5ru45ry35ru75ryu5ryJ5r2O5ryZ5rya5ryn5ryY5ry75ryS5rut5ryKXCJcblx0XSxcblx0W1xuXHRcdFwiZTJhMVwiLFxuXHRcdFwi5ry25r2z5ru55ruu5ryt5r2A5ryw5ry85ry15rur5ryH5ryO5r2D5ryF5ru95ru25ry55ryc5ru85ry65ryf5ryN5rye5ryI5ryh54aH54aQ54aJ54aA54aF54aC54aP54W754aG54aB54aX54mE54mT54qX54qV54qT542D542N542R542M55Gi55Gz55Gx55G155Gy55Gn55Gu55SA55SC55SD55W955aQ55iW55iI55iM55iV55iR55iK55iU55q4556B5528556F556C552u556A552v552+556D56Ky56Kq56K056Kt56Ko56G+56Kr56Ke56Kl56Kg56Ks56Ki56Kk56aY56aK56aL56aW56aV56aU56aTXCJcblx0XSxcblx0W1xuXHRcdFwiZTM0MFwiLFxuXHRcdFwi56aX56aI56aS56aQ56ir56mK56iw56iv56io56im56qo56qr56qs56uu566I566c566K566R566Q566W566N566M566b566O566F566Y5YqE566Z566k566C57K757K/57K857K657an57a357eC57aj57aq57eB57eA57eF57ad57eO57eE57eG57eL57eM57av57a557aW57a857af57am57au57ap57ah57eJ572z57+i57+j57+l57+eXCJcblx0XSxcblx0W1xuXHRcdFwiZTNhMVwiLFxuXHRcdFwi6ICk6IGd6IGc6IaJ6IaG6IaD6IaH6IaN6IaM6IaL6IiV6JKX6JKk6JKh6JKf6JK66JOO6JOC6JKs6JKu6JKr6JK56JK06JOB6JON6JKq6JKa6JKx6JOQ6JKd6JKn6JK76JKi6JKU6JOH6JOM6JKb6JKp6JKv6JKo6JOW6JKY6JK26JOP6JKg6JOX6JOU6JOS6JOb6JKw6JKR6Jmh6Jyz6Jyj6Jyo6J2r6J2A6Jyu6Jye6Jyh6JyZ6Jyb6J2D6Jys6J2B6Jy+6J2G6Jyg6Jyy6Jyq6Jyt6Jy86JyS6Jy66Jyx6Jy16J2C6Jym6Jyn6Jy46Jyk6Jya6Jyw6JyR6KO36KOn6KOx6KOy6KO66KO+6KOu6KO86KO26KO7XCJcblx0XSxcblx0W1xuXHRcdFwiZTQ0MFwiLFxuXHRcdFwi6KOw6KOs6KOr6Kad6Kah6Kaf6Kae6Kep6Ker6Keo6Kqr6KqZ6KqL6KqS6KqP6KqW6LC96LGo6LGp6LOV6LOP6LOX6LaW6LiJ6LiC6Le/6LiN6Le96LiK6LiD6LiH6LiG6LiF6Le+6LiA6LiE6LyQ6LyR6LyO6LyN6YSj6YSc6YSg6YSi6YSf6YSd6YSa6YSk6YSh6YSb6YW66YWy6YW56YWz6Yql6Yqk6Ym26Yqb6Ym66Yqg6YqU6Yqq6YqNXCJcblx0XSxcblx0W1xuXHRcdFwiZTRhMVwiLFxuXHRcdFwi6Yqm6Yqa6Yqr6Ym56YqX6Ym/6Yqj6Yuu6YqO6YqC6YqV6Yqi6Ym96YqI6Yqh6YqK6YqG6YqM6YqZ6Yqn6Ym+6YqH6Yqp6Yqd6YqL6Yit6Zqe6Zqh6Zu/6Z2Y6Z296Z266Z2+6Z6D6Z6A6Z6C6Z276Z6E6Z6B6Z2/6Z+O6Z+N6aCW6aKt6aKu6aSC6aSA6aSH6aad6aac6aeD6aa56aa76aa66aeC6aa96aeH6aqx6auj6aun6ay+6ay/6a2g6a2h6a2f6bOx6bOy6bO16bqn5YO/5YSD5YSw5YO45YSG5YSH5YO25YO+5YSL5YSM5YO95YSK5YqL5YqM5Yux5Yuv5ZmI5ZmC5ZmM5Zi15ZmB5ZmK5ZmJ5ZmG5ZmYXCJcblx0XSxcblx0W1xuXHRcdFwiZTU0MFwiLFxuXHRcdFwi5Zma5ZmA5Ziz5Zi95Zis5Zi+5Zi45Ziq5Zi65Zya5aKr5aKd5aKx5aKg5aKj5aKv5aKs5aKl5aKh5aO/5au/5au05au95au35au25ayD5au45ayC5au55ayB5ayH5ayF5ayP5bGn5baZ5baX5baf5baS5bai5baT5baV5bag5bac5bah5baa5bae5bmp5bmd5bmg5bmc57ez5bub5bue5buh5b2J5b6y5oaL5oaD5oW55oax5oaw5oai5oaJXCJcblx0XSxcblx0W1xuXHRcdFwiZTVhMVwiLFxuXHRcdFwi5oab5oaT5oav5oat5oaf5oaS5oaq5oah5oaN5oWm5oaz5oit5pGu5pGw5pKW5pKg5pKF5pKX5pKc5pKP5pKL5pKK5pKM5pKj5pKf5pGo5pKx5pKY5pW25pW65pW55pW75pay5paz5pq15pqw5pqp5pqy5pq35pqq5pqv5qiA5qiG5qiX5qel5qe45qiV5qex5qek5qig5qe/5qes5qei5qib5qid5qe+5qin5qey5qeu5qiU5qe35qen5qmA5qiI5qem5qe75qiN5qe85qer5qiJ5qiE5qiY5qil5qiP5qe25qim5qiH5qe05qiW5q2R5q6l5q6j5q6i5q6m5rCB5rCA5q+/5rCC5r2B5rym5r2+5r6H5r+G5r6SXCJcblx0XSxcblx0W1xuXHRcdFwiZTY0MFwiLFxuXHRcdFwi5r6N5r6J5r6M5r2i5r2P5r6F5r2a5r6W5r225r2s5r6C5r2V5r2y5r2S5r2Q5r2X5r6U5r6T5r2d5ryA5r2h5r2r5r295r2n5r6Q5r2T5r6L5r2p5r2/5r6V5r2j5r235r2q5r2754ay54av54ab54aw54ag54aa54ap54a154ad54al54ae54ak54ah54aq54ac54an54az54qY54qa542Y542S542e542f542g542d542b542h542a542ZXCJcblx0XSxcblx0W1xuXHRcdFwiZTZhMVwiLFxuXHRcdFwi542i55KH55KJ55KK55KG55KB55G955KF55KI55G855G555SI55SH55W+55il55ie55iZ55id55ic55ij55ia55io55ib55qc55qd55qe55qb556N556P556J556I56ON56K756OP56OM56OR56OO56OU56OI56OD56OE56OJ56aa56ah56ag56ac56ai56ab5q2256i556qy56q056qz566356+L566+566s56+O566v566556+K566157OF57OI57OM57OL57e357eb57eq57en57eX57eh57iD57e657em57e257ex57ew57eu57ef5722576s576w576t57+t57+r57+q57+s57+m57+o6IGk6IGn6Iaj6IafXCJcblx0XSxcblx0W1xuXHRcdFwiZTc0MFwiLFxuXHRcdFwi6Iae6IaV6Iai6IaZ6IaX6IiW6ImP6ImT6ImS6ImQ6ImO6ImR6JSk6JS76JSP6JSA6JSp6JSO6JSJ6JSN6JSf6JSK6JSn6JSc6JO76JSr6JO66JSI6JSM6JO06JSq6JOy6JSV6JO36JOr6JOz6JO86JSS6JOq6JOp6JSW6JO+6JSo6JSd6JSu6JSC6JO96JSe6JO26JSx6JSm6JOn6JOo6JOw6JOv6JO56JSY6JSg6JSw6JSL6JSZ6JSv6JmiXCJcblx0XSxcblx0W1xuXHRcdFwiZTdhMVwiLFxuXHRcdFwi6J2W6J2j6J2k6J236J+h6J2z6J2Y6J2U6J2b6J2S6J2h6J2a6J2R6J2e6J2t6J2q6J2Q6J2O6J2f6J2d6J2v6J2s6J266J2u6J2c6J2l6J2P6J276J216J2i6J2n6J2p6KGa6KSF6KSM6KSU6KSL6KSX6KSY6KSZ6KSG6KSW6KSR6KSO6KSJ6Kai6Kak6Kaj6Ket6Kew6Kes6KuP6KuG6Kq46KuT6KuR6KuU6KuV6Kq76KuX6Kq+6KuA6KuF6KuY6KuD6Kq66Kq96KuZ6LC+6LGN6LKP6LOl6LOf6LOZ6LOo6LOa6LOd6LOn6Lag6Lac6Lah6Lab6Lig6Lij6Lil6Lik6Liu6LiV6Lib6LiW6LiR6LiZ6Lim6LinXCJcblx0XSxcblx0W1xuXHRcdFwiZTg0MFwiLFxuXHRcdFwi6LiU6LiS6LiY6LiT6Lic6LiX6Lia6Lys6Lyk6LyY6Lya6Lyg6Lyj6LyW6LyX6YGz6YGw6YGv6YGn6YGr6YSv6YSr6YSp6YSq6YSy6YSm6YSu6YaF6YaG6YaK6YaB6YaC6YaE6YaA6YuQ6YuD6YuE6YuA6YuZ6Yq26YuP6Yux6Yuf6YuY6Yup6YuX6Yud6YuM6Yuv6YuC6Yuo6YuK6YuI6YuO6Yum6YuN6YuV6YuJ6Yug6Yue6Yun6YuR6YuTXCJcblx0XSxcblx0W1xuXHRcdFwiZThhMVwiLFxuXHRcdFwi6Yq16Yuh6YuG6Yq06ZW86Zas6Zar6Zau6Zaw6Zqk6Zqi6ZuT6ZyF6ZyI6ZyC6Z2a6Z6K6Z6O6Z6I6Z+Q6Z+P6aCe6aCd6aCm6aCp6aCo6aCg6aCb6aCn6aKy6aSI6aO66aSR6aSU6aSW6aSX6aSV6aec6aeN6aeP6aeT6aeU6aeO6aeJ6aeW6aeY6aeL6aeX6aeM6aqz6aus6aur6auz6auy6aux6a2G6a2D6a2n6a206a2x6a2m6a226a216a2w6a2o6a2k6a2s6bO86bO66bO96bO/6bO36bSH6bSA6bO56bO76bSI6bSF6bSE6bqD6buT6byP6byQ5YSc5YST5YSX5YSa5YSR5Yee5Yy05Y+h5Zmw5Zmg5ZmuXCJcblx0XSxcblx0W1xuXHRcdFwiZTk0MFwiLFxuXHRcdFwi5Zmz5Zmm5Zmj5Zmt5Zmy5Zme5Zm35Zyc5Zyb5aOI5aK95aOJ5aK/5aK65aOC5aK85aOG5ayX5ayZ5ayb5ayh5ayU5ayT5ayQ5ayW5ayo5aya5ayg5aye5a+v5bas5bax5bap5ban5ba15baw5bau5baq5bao5bay5bat5bav5ba05bmn5bmo5bmm5bmv5bup5bun5bum5buo5bul5b2L5b685oad5oao5oaW5oeF5oa05oeG5oeB5oeM5oa6XCJcblx0XSxcblx0W1xuXHRcdFwiZTlhMVwiLFxuXHRcdFwi5oa/5oa45oaM5pOX5pOW5pOQ5pOP5pOJ5pK95pKJ5pOD5pOb5pOz5pOZ5pSz5pW/5pW85pai5puI5pq+5puA5puK5puL5puP5pq95pq75pq65puM5pyj5qi05qmm5qmJ5qmn5qiy5qmo5qi+5qmd5qmt5qm25qmb5qmR5qio5qma5qi75qi/5qmB5qmq5qmk5qmQ5qmP5qmU5qmv5qmp5qmg5qi85qme5qmW5qmV5qmN5qmO5qmG5q2V5q2U5q2W5q6n5q6q5q6r5q+I5q+H5rCE5rCD5rCG5r6t5r+L5r6j5r+H5r685r+O5r+I5r2e5r+E5r695r6e5r+K5r6o54CE5r6l5r6u5r665r6s5r6q5r+P5r6/5r64XCJcblx0XSxcblx0W1xuXHRcdFwiZWE0MFwiLFxuXHRcdFwi5r6i5r+J5r6r5r+N5r6v5r6y5r6w54eF54eC54a/54a454eW54eA54eB54eL54eU54eK54eH54eP54a954eY54a854eG54ea54eb54qd54qe542p542m542n542s542l542r542q55G/55Ka55Kg55KU55KS55KV55Kh55SL55aA55iv55it55ix55i955iz55i855i155iy55iw55q755um556a556d556h556c556b556i556j556V556ZXCJcblx0XSxcblx0W1xuXHRcdFwiZWFhMVwiLFxuXHRcdFwi556X56Od56Op56Ol56Oq56Oe56Oj56Ob56Oh56Oi56Ot56Of56Og56ak56mE56mI56mH56q256q456q156qx56q356+e56+j56+n56+d56+V56+l56+a56+o56+556+U56+q56+i56+c56+r56+Y56+f57OS57OU57OX57OQ57OR57iS57ih57iX57iM57if57ig57iT57iO57ic57iV57ia57ii57iL57iP57iW57iN57iU57il57ik572D572757285726576x57+v6ICq6ICp6IGs6Iax6Iam6Iau6Ia56Ia16Iar6Iaw6Ias6Ia06Iay6Ia36Ian6Iey6ImV6ImW6ImX6JWW6JWF6JWr6JWN6JWT6JWh6JWYXCJcblx0XSxcblx0W1xuXHRcdFwiZWI0MFwiLFxuXHRcdFwi6JWA6JWG6JWk6JWB6JWi6JWE6JWR6JWH6JWj6JS+6JWb6JWx6JWO6JWu6JW16JWV6JWn6JWg6JaM6JWm6JWd6JWU6JWl6JWs6Jmj6Jml6Jmk6J6b6J6P6J6X6J6T6J6S6J6I6J6B6J6W6J6Y6J256J6H6J6j6J6F6J6Q6J6R6J6d6J6E6J6U6J6c6J6a6J6J6KSe6KSm6KSw6KSt6KSu6KSn6KSx6KSi6KSp6KSj6KSv6KSs6KSf6Kex6KugXCJcblx0XSxcblx0W1xuXHRcdFwiZWJhMVwiLFxuXHRcdFwi6Kui6Kuy6Ku06Ku16Kud6KyU6Kuk6Kuf6Kuw6KuI6Kue6Kuh6Kuo6Ku/6Kuv6Ku76LKR6LKS6LKQ6LO16LOu6LOx6LOw6LOz6LWs6LWu6Lal6Lan6Liz6Li+6Li46LmA6LmF6Li26Li86Li96LmB6Liw6Li/6Lq96Ly26Lyu6Ly16Lyy6Ly56Ly36Ly06YG26YG56YG76YKG6YO66YSz6YS16YS26YaT6YaQ6YaR6YaN6YaP6Yyn6Yye6YyI6Yyf6YyG6YyP6Y266Yy46Yy86Yyb6Yyj6YyS6YyB6Y2G6Yyt6YyO6YyN6YuL6Yyd6Yu66Yyl6YyT6Yu56Yu36Yy06YyC6Yyk6Yu/6Yyp6Yy56Yy16Yyq6YyU6YyMXCJcblx0XSxcblx0W1xuXHRcdFwiZWM0MFwiLFxuXHRcdFwi6YyL6Yu+6YyJ6YyA6Yu76YyW6Za86ZeN6Za+6Za56Za66Za26Za/6Za16Za96Zqp6ZuU6ZyL6ZyS6ZyQ6Z6Z6Z6X6Z6U6Z+w6Z+46aC16aCv6aCy6aSk6aSf6aSn6aSp6aae6aeu6aes6ael6aek6aew6aej6aeq6aep6aen6aq56aq/6aq06aq76au26au66au56au36ayz6a6A6a6F6a6H6a286a2+6a276a6C6a6T6a6S6a6Q6a266a6VXCJcblx0XSxcblx0W1xuXHRcdFwiZWNhMVwiLFxuXHRcdFwi6a296a6I6bSl6bSX6bSg6bSe6bSU6bSp6bSd6bSY6bSi6bSQ6bSZ6bSf6bqI6bqG6bqH6bqu6bqt6buV6buW6bu66byS6by95YSm5YSl5YSi5YSk5YSg5YSp5Yu05ZqT5ZqM5ZqN5ZqG5ZqE5ZqD5Zm+5ZqC5Zm/5ZqB5aOW5aOU5aOP5aOS5ayt5ayl5ayy5ayj5ays5ayn5aym5ayv5ayu5a275a+x5a+y5ba35bms5bmq5b6+5b675oeD5oa15oa85oen5oeg5oel5oek5oeo5oee5pOv5pOp5pOj5pOr5pOk5pOo5paB5paA5pa25pea5puS5qqN5qqW5qqB5qql5qqJ5qqf5qqb5qqh5qqe5qqH5qqT5qqOXCJcblx0XSxcblx0W1xuXHRcdFwiZWQ0MFwiLFxuXHRcdFwi5qqV5qqD5qqo5qqk5qqR5qm/5qqm5qqa5qqF5qqM5qqS5q2b5q6t5rCJ5r+M5r6p5r+05r+U5r+j5r+c5r+t5r+n5r+m5r+e5r+y5r+d5r+i5r+o54eh54ex54eo54ey54ek54ew54ei542z542u542v55KX55Ky55Kr55KQ55Kq55Kt55Kx55Kl55Kv55SQ55SR55SS55SP55aE55mD55mI55mJ55mH55qk55up5561556r556y55635562XCJcblx0XSxcblx0W1xuXHRcdFwiZWRhMVwiLFxuXHRcdFwi5560556x556o55+w56Oz56O956SC56O756O856Oy56SF56O556O+56SE56ar56ao56mc56mb56mW56mY56mU56ma56q+56uA56uB57CF57CP56+y57CA56+/56+757CO56+057CL56+z57CC57CJ57CD57CB56+456+957CG56+w56+x57CQ57CK57Oo57it57i857mC57iz6aGI57i457iq57mJ57mA57mH57ip57mM57iw57i757i257mE57i6572F572/572+572957+057+y6ICs6Ia76IeE6IeM6IeK6IeF6IeH6Ia86Iep6Imb6Ima6Imc6JaD6JaA6JaP6Jan6JaV6Jag6JaL6Jaj6JW76Jak6Jaa6JaeXCJcblx0XSxcblx0W1xuXHRcdFwiZWU0MFwiLFxuXHRcdFwi6JW36JW86JaJ6Jah6JW66JW46JWX6JaO6JaW6JaG6JaN6JaZ6Jad6JaB6Jai6JaC6JaI6JaF6JW56JW26JaY6JaQ6Jaf6Jmo6J6+6J6q6J6t6J+F6J6w6J6s6J656J616J686J6u6J+J6J+D6J+C6J+M6J636J6v6J+E6J+K6J606J626J6/6J646J696J+e6J6y6KS16KSz6KS86KS+6KWB6KWS6KS36KWC6Kat6Kav6Kau6Key6Kez6KyeXCJcblx0XSxcblx0W1xuXHRcdFwiZWVhMVwiLFxuXHRcdFwi6KyY6KyW6KyR6KyF6KyL6Kyi6KyP6KyS6KyV6KyH6KyN6KyI6KyG6Kyc6KyT6Kya6LGP6LGw6LGy6LGx6LGv6LKV6LKU6LO56LWv6LmO6LmN6LmT6LmQ6LmM6LmH6L2D6L2A6YKF6YG+6YS46Yaa6Yai6Yab6YaZ6Yaf6Yah6Yad6Yag6Y6h6Y6D6Y6v6Y2k6Y2W6Y2H6Y286Y2Y6Y2c6Y226Y2J6Y2Q6Y2R6Y2g6Y2t6Y6P6Y2M6Y2q6Y256Y2X6Y2V6Y2S6Y2P6Y2x6Y236Y276Y2h6Y2e6Y2j6Y2n6Y6A6Y2O6Y2Z6ZeH6ZeA6ZeJ6ZeD6ZeF6Za36Zqu6Zqw6Zqs6Zyg6Zyf6ZyY6Zyd6ZyZ6Z6a6Z6h6Z6cXCJcblx0XSxcblx0W1xuXHRcdFwiZWY0MFwiLFxuXHRcdFwi6Z6e6Z6d6Z+V6Z+U6Z+x6aGB6aGE6aGK6aGJ6aGF6aGD6aSl6aSr6aSs6aSq6aSz6aSy6aSv6aSt6aSx6aSw6aaY6aaj6aah6aiC6ae66ae06ae36ae56ae46ae26ae76ae96ae+6ae86aiD6aq+6au+6au96ayB6au86a2I6a6a6a6o6a6e6a6b6a6m6a6h6a6l6a6k6a6G6a6i6a6g6a6v6bSz6bWB6bWn6bS26bSu6bSv6bSx6bS46bSwXCJcblx0XSxcblx0W1xuXHRcdFwiZWZhMVwiLFxuXHRcdFwi6bWF6bWC6bWD6bS+6bS36bWA6bS957+16bSt6bqK6bqJ6bqN6bqw6buI6bua6bu76bu/6byk6byj6byi6b2U6b6g5YSx5YSt5YSu5ZqY5Zqc5ZqX5Zqa5Zqd5ZqZ5aWw5ay85bGp5bGq5beA5bmt5bmu5oeY5oef5oet5oeu5oex5oeq5oew5oer5oeW5oep5pO/5pSE5pO95pO45pSB5pSD5pO85paU5peb5pua5pub5puY5quF5qq55qq95quh5quG5qq65qq25qq35quH5qq05qqt5q2e5q+J5rCL54CH54CM54CN54CB54CF54CU54CO5r+/54CA5r+754Cm5r+85r+354CK54iB54e/54e554iD54e95422XCJcblx0XSxcblx0W1xuXHRcdFwiZjA0MFwiLFxuXHRcdFwi55K455OA55K155OB55K+55K255K755OC55SU55ST55mc55mk55mZ55mQ55mT55mX55ma55qm55q955us55+C556656O/56SM56ST56SU56SJ56SQ56SS56SR56at56as56mf57Cc57Cp57CZ57Cg57Cf57Ct57Cd57Cm57Co57Ci57Cl57Cw57mc57mQ57mW57mj57mY57mi57mf57mR57mg57mX57mT5761576z57+357+46IG16IeR6IeSXCJcblx0XSxcblx0W1xuXHRcdFwiZjBhMVwiLFxuXHRcdFwi6IeQ6Imf6Ime6Ja06JeG6JeA6JeD6JeC6Jaz6Ja16Ja96JeH6JeE6Ja/6JeL6JeO6JeI6JeF6Jax6Ja26JeS6Jik6Ja46Ja36Ja+6Jmp6J+n6J+m6J+i6J+b6J+r6J+q6J+l6J+f6J+z6J+k6J+U6J+c6J+T6J+t6J+Y6J+j6J6k6J+X6J+Z6KCB6J+06J+o6J+d6KWT6KWL6KWP6KWM6KWG6KWQ6KWR6KWJ6Kyq6Kyn6Kyj6Kyz6Kyw6Ky16K2H6Kyv6Ky86Ky+6Kyx6Kyl6Ky36Kym6Ky26Kyu6Kyk6Ky76Ky96Ky66LGC6LG16LKZ6LKY6LKX6LO+6LSE6LSC6LSA6Lmc6Lmi6Lmg6LmX6LmW6Lme6Lml6LmnXCJcblx0XSxcblx0W1xuXHRcdFwiZjE0MFwiLFxuXHRcdFwi6Lmb6Lma6Lmh6Lmd6Lmp6LmU6L2G6L2H6L2I6L2L6YSo6YS66YS76YS+6Yao6Yal6Yan6Yav6Yaq6Y616Y6M6Y6S6Y636Y6b6Y6d6Y6J6Y6n6Y6O6Y6q6Y6e6Y6m6Y6V6Y6I6Y6Z6Y6f6Y6N6Y6x6Y6R6Y6y6Y6k6Y6o6Y606Y6j6Y6l6ZeS6ZeT6ZeR6Zqz6ZuX6Zua5beC6Zuf6ZuY6Zud6Zyj6Zyi6Zyl6Z6s6Z6u6Z6o6Z6r6Z6k6Z6qXCJcblx0XSxcblx0W1xuXHRcdFwiZjFhMVwiLFxuXHRcdFwi6Z6i6Z6l6Z+X6Z+Z6Z+W6Z+Y6Z+66aGQ6aGR6aGS6aK46aWB6aS86aS66aiP6aiL6aiJ6aiN6aiE6aiR6aiK6aiF6aiH6aiG6auA6auc6ayI6ayE6ayF6ayp6ay16a2K6a2M6a2L6a+H6a+G6a+D6a6/6a+B6a616a646a+T6a626a+E6a656a696bWc6bWT6bWP6bWK6bWb6bWL6bWZ6bWW6bWM6bWX6bWS6bWU6bWf6bWY6bWa6bqO6bqM6buf6byB6byA6byW6byl6byr6byq6byp6byo6b2M6b2V5YS05YS15YqW5Yu35Y605Zqr5Zqt5Zqm5Zqn5Zqq5Zqs5aOa5aOd5aOb5aSS5ay95ay+5ay/5beD5bmwXCJcblx0XSxcblx0W1xuXHRcdFwiZjI0MFwiLFxuXHRcdFwi5b6/5oe75pSH5pSQ5pSN5pSJ5pSM5pSO5paE5pee5ped5pue5qun5qug5quM5quR5quZ5quL5quf5quc5quQ5qur5quP5quN5que5q2g5q6w5rCM54CZ54Cn54Cg54CW54Cr54Ch54Ci54Cj54Cp54CX54Ck54Cc54Cq54iM54iK54iH54iC54iF54ql54qm54qk54qj54qh55OL55OF55K355OD55SW55mg55+J55+K55+E55+x56Sd56SbXCJcblx0XSxcblx0W1xuXHRcdFwiZjJhMVwiLFxuXHRcdFwi56Sh56Sc56SX56Se56aw56mn56mo57Cz57C857C557Cs57C757Os57Oq57m257m157m457mw57m357mv57m657my57m057mo572L572K576D576G576357+957++6IG46IeX6IeV6Imk6Imh6Imj6Jer6Jex6Jet6JeZ6Jeh6Jeo6Jea6JeX6Jes6Jey6Je46JeY6Jef6Jej6Jec6JeR6Jew6Jem6Jev6Jee6Jei6KCA6J+66KCD6J+26J+36KCJ6KCM6KCL6KCG6J+86KCI6J+/6KCK6KCC6KWi6KWa6KWb6KWX6KWh6KWc6KWY6KWd6KWZ6KaI6Ka36Ka26Ke26K2Q6K2I6K2K6K2A6K2T6K2W6K2U6K2L6K2VXCJcblx0XSxcblx0W1xuXHRcdFwiZjM0MFwiLFxuXHRcdFwi6K2R6K2C6K2S6K2X6LGD6LG36LG26LKa6LSG6LSH6LSJ6Las6Laq6Lat6Lar6Lmt6Lm46Lmz6Lmq6Lmv6Lm76LuC6L2S6L2R6L2P6L2Q6L2T6L606YWA6YS/6Yaw6Yat6Y+e6Y+H6Y+P6Y+C6Y+a6Y+Q6Y+56Y+s6Y+M6Y+Z6Y6p6Y+m6Y+K6Y+U6Y+u6Y+j6Y+V6Y+E6Y+O6Y+A6Y+S6Y+n6ZW96Zea6Zeb6Zuh6Zyp6Zyr6Zys6Zyo6ZymXCJcblx0XSxcblx0W1xuXHRcdFwiZjNhMVwiLFxuXHRcdFwi6Z6z6Z636Z626Z+d6Z+e6Z+f6aGc6aGZ6aGd6aGX6aK/6aK96aK76aK+6aWI6aWH6aWD6aam6aan6aia6aiV6ail6aid6aik6aib6aii6aig6ain6aij6aie6aic6aiU6auC6ayL6ayK6ayO6ayM6ay36a+q6a+r6a+g6a+e6a+k6a+m6a+i6a+w6a+U6a+X6a+s6a+c6a+Z6a+l6a+V6a+h6a+a6bW36baB6baK6baE6baI6bWx6baA6bW46baG6baL6baM6bW96bWr6bW06bW16bWw6bWp6baF6bWz6bW76baC6bWv6bW56bW/6baH6bWo6bqU6bqR6buA6bu86byt6b2A6b2B6b2N6b2W6b2X6b2Y5Yy35ZqyXCJcblx0XSxcblx0W1xuXHRcdFwiZjQ0MFwiLFxuXHRcdFwi5Zq15Zqz5aOj5a2F5beG5beH5buu5buv5b+A5b+B5oe55pSX5pSW5pSV5pST5pef5puo5puj5puk5quz5quw5quq5quo5qu55qux5quu5quv54C854C154Cv54C354C054Cx54GC54C454C/54C654C554GA54C754Cz54GB54iT54iU54qo5429542855K655qr55qq55q+55ut55+M55+O55+P55+N55+y56Sl56Sj56Sn56So56Sk56SpXCJcblx0XSxcblx0W1xuXHRcdFwiZjRhMVwiLFxuXHRcdFwi56ay56mu56ms56mt56u357GJ57GI57GK57GH57GF57Ou57m757m+57qB57qA576657+/6IG56Ieb6IeZ6IiL6Imo6Imp6Jii6Je/6JiB6Je+6Jib6JiA6Je26JiE6JiJ6JiF6JiM6Je96KCZ6KCQ6KCR6KCX6KCT6KCW6KWj6KWm6Ka56Ke36K2g6K2q6K2d6K2o6K2j6K2l6K2n6K2t6Lau6LqG6LqI6LqE6L2Z6L2W6L2X6L2V6L2Y6L2a6YKN6YWD6YWB6Ya36Ya16Yay6Yaz6ZCL6ZCT6Y+76ZCg6ZCP6ZCU6Y++6ZCV6ZCQ6ZCo6ZCZ6ZCN6Y+16ZCA6Y+36ZCH6ZCO6ZCW6ZCS6Y+66ZCJ6Y+46ZCK6Y+/XCJcblx0XSxcblx0W1xuXHRcdFwiZjU0MFwiLFxuXHRcdFwi6Y+86ZCM6Y+26ZCR6ZCG6Zee6Zeg6Zef6Zyu6Zyv6Z656Z676Z+96Z++6aGg6aGi6aGj6aGf6aOB6aOC6aWQ6aWO6aWZ6aWM6aWL6aWT6aiy6ai06aix6ais6aiq6ai26aip6aiu6ai46ait6auH6auK6auG6ayQ6ayS6ayR6bCL6bCI6a+36bCF6bCS6a+46bGA6bCH6bCO6bCG6bCX6bCU6bCJ6baf6baZ6bak6bad6baS6baY6baQ6babXCJcblx0XSxcblx0W1xuXHRcdFwiZjVhMVwiLFxuXHRcdFwi6bag6baU6bac6baq6baX6bah6baa6bai6bao6bae6baj6ba/6bap6baW6bam6ban6bqZ6bqb6bqa6bul6buk6bun6bum6byw6byu6b2b6b2g6b2e6b2d6b2Z6b6R5YS65YS55YqY5YqX5ZuD5Zq95Zq+5a2I5a2H5beL5beP5bux5oe95pSb5qyC5qu85qyD5qu45qyA54GD54GE54GK54GI54GJ54GF54GG54id54ia54iZ542+55SX55mq55+Q56St56Sx56Sv57GU57GT57Oy57qK57qH57qI57qL57qG57qN572N57676ICw6Ied6JiY6Jiq6Jim6Jif6Jij6Jic6JiZ6Jin6Jiu6Jih6Jig6Jip6Jie6JilXCJcblx0XSxcblx0W1xuXHRcdFwiZjY0MFwiLFxuXHRcdFwi6KCp6KCd6KCb6KCg6KCk6KCc6KCr6KGK6KWt6KWp6KWu6KWr6Ke66K256K246K2F6K266K276LSQ6LSU6Lav6LqO6LqM6L2e6L2b6L2d6YWG6YWE6YWF6Ya56ZC/6ZC76ZC26ZCp6ZC96ZC86ZCw6ZC56ZCq6ZC36ZCs6ZGA6ZCx6Zel6Zek6Zej6Zy16Zy66Z6/6Z+h6aGk6aOJ6aOG6aOA6aWY6aWW6ai56ai96amG6amE6amC6amB6ai6XCJcblx0XSxcblx0W1xuXHRcdFwiZjZhMVwiLFxuXHRcdFwi6ai/6auN6ayV6ayX6ayY6ayW6ay66a2S6bCr6bCd6bCc6bCs6bCj6bCo6bCp6bCk6bCh6ba36ba26ba86beB6beH6beK6beP6ba+6beF6beD6ba76ba16beO6ba56ba66bas6beI6bax6bat6beM6baz6beN6bay6bm66bqc6bur6buu6but6byb6byY6bya6byx6b2O6b2l6b2k6b6S5Lq55ZuG5ZuF5ZuL5aWx5a2L5a2M5beV5beR5buy5pSh5pSg5pSm5pSi5qyL5qyI5qyJ5rCN54GV54GW54GX54GS54ie54if54qp542/55OY55OV55OZ55OX55mt55qt56S156a056mw56mx57GX57Gc57GZ57Gb57GaXCJcblx0XSxcblx0W1xuXHRcdFwiZjc0MFwiLFxuXHRcdFwi57O057Ox57qR572P576H6Iee6Imr6Ji06Ji16Jiz6Jis6Jiy6Ji26KCs6KCo6KCm6KCq6KCl6KWx6Ka/6Ka+6Ke76K2+6K6E6K6C6K6G6K6F6K2/6LSV6LqV6LqU6Lqa6LqS6LqQ6LqW6LqX6L2g6L2i6YWH6ZGM6ZGQ6ZGK6ZGL6ZGP6ZGH6ZGF6ZGI6ZGJ6ZGG6Zy/6Z+j6aGq6aGp6aOL6aWU6aWb6amO6amT6amU6amM6amP6amI6amKXCJcblx0XSxcblx0W1xuXHRcdFwiZjdhMVwiLFxuXHRcdFwi6amJ6amS6amQ6auQ6ayZ6ayr6ay76a2W6a2V6bGG6bGI6bC/6bGE6bC56bCz6bGB6bC86bC36bC06bCy6bC96bC26beb6beS6bee6bea6beL6beQ6bec6beR6bef6bep6beZ6beY6beW6be16beV6bed6bq26buw6by16byz6byy6b2C6b2r6b6V6b6i5YS95YqZ5aOo5aOn5aWy5a2N5beY6KCv5b2P5oiB5oiD5oiE5pSp5pSl5paW5pur5qyR5qyS5qyP5q+K54Gb54Ga54ii546C546B546D55mw55+U57Gn57Gm57qV6Ims6Ji66JmA6Ji56Ji86Jix6Ji76Ji+6KCw6KCy6KCu6KCz6KW26KW06KWz6Ke+XCJcblx0XSxcblx0W1xuXHRcdFwiZjg0MFwiLFxuXHRcdFwi6K6M6K6O6K6L6K6I6LGF6LSZ6LqY6L2k6L2j6Ya86ZGi6ZGV6ZGd6ZGX6ZGe6Z+E6Z+F6aCA6amW6amZ6aye6ayf6ayg6bGS6bGY6bGQ6bGK6bGN6bGL6bGV6bGZ6bGM6bGO6be76be36bev6bej6ber6be46bek6be26beh6beu6bem6bey6bew6bei6bes6be06bez6beo6bet6buC6buQ6buy6buz6byG6byc6by46by36by26b2D6b2PXCJcblx0XSxcblx0W1xuXHRcdFwiZjhhMVwiLFxuXHRcdFwi6b2x6b2w6b2u6b2v5ZuT5ZuN5a2O5bGt5pSt5put5puu5qyT54Gf54Gh54Gd54Gg54ij55Ob55Ol55+V56S456a356a257Gq57qX576J6Imt6JmD6KC46KC36KC16KGL6K6U6K6V6Lqe6Lqf6Lqg6Lqd6Ya+6Ya96YeC6ZGr6ZGo6ZGp6Zul6Z2G6Z2D6Z2H6Z+H6Z+l6ame6auV6a2Z6bGj6bGn6bGm6bGi6bGe6bGg6biC6be+6biH6biD6biG6biF6biA6biB6biJ6be/6be96biE6bqg6bye6b2G6b206b216b225ZuU5pSu5pa45qyY5qyZ5qyX5qya54Gi54im54qq55+Y55+Z56S557Gp57Gr57O257qaXCJcblx0XSxcblx0W1xuXHRcdFwiZjk0MFwiLFxuXHRcdFwi57qY57qb57qZ6Ieg6Ieh6JmG6JmH6JmI6KW56KW66KW86KW76Ke/6K6Y6K6Z6Lql6Lqk6Lqj6ZGu6ZGt6ZGv6ZGx6ZGz6Z2J6aGy6aWf6bGo6bGu6bGt6biL6biN6biQ6biP6biS6biR6bqh6bu16byJ6b2H6b246b276b266b255Zye54Gm57Gv6KC86Lay6Lqm6YeD6ZG06ZG46ZG26ZG16amg6bG06bGz6bGx6bG16biU6biT6bu26byKXCJcblx0XSxcblx0W1xuXHRcdFwiZjlhMVwiLFxuXHRcdFwi6b6k54Go54Gl57O36Jmq6KC+6KC96KC/6K6e6LKc6Lqp6LuJ6Z2L6aGz6aG06aOM6aWh6aar6amk6amm6amn6ayk6biV6biX6b2I5oiH5qye54in6JmM6Lqo6ZKC6ZKA6ZKB6amp6amo6ayu6biZ54ip6JmL6K6f6ZKD6bG56bq355m16amr6bG66bid54Gp54Gq6bqk6b2+6b2J6b6Y56KB6Yq56KOP5aK75oGS57Kn5au64pWU4pWm4pWX4pWg4pWs4pWj4pWa4pWp4pWd4pWS4pWk4pWV4pWe4pWq4pWh4pWY4pWn4pWb4pWT4pWl4pWW4pWf4pWr4pWi4pWZ4pWo4pWc4pWR4pWQ4pWt4pWu4pWw4pWv4paTXCJcblx0XVxuXTtcblxudmFyIGNwOTUwJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0J2RlZmF1bHQnOiBjcDk1MFxufSk7XG5cbnZhciBiaWc1QWRkZWQgPSBbXG5cdFtcblx0XHRcIjg3NDBcIixcblx0XHRcIuSPsOSwsuSYg+SWpuSVuPCniafktbfklrPwp7Kx5LOi8KezheOuleSctuSdhOSxh+SxgPCkir/wo5iX8KeNkvCmuovwp4OS5LGX8KqNkeSdj+SXmuSyhfCnsazktIfkqqTkmqHwpqyj54il8KWplPChqaPwo7iG8KO9oeaZjeWbu1wiXG5cdF0sXG5cdFtcblx0XHRcIjg3NjdcIixcblx0XHRcIue2leWknfCorrnjt7TpnLTwp6+v5a+b8KG1nuWqpOOYpfCpurDlq5Hlrrfls7zmna7olpPwqaWF55Gh55Kd46G18KG1k/Cjmp7wpoCh47usXCJcblx0XSxcblx0W1xuXHRcdFwiODdhMVwiLFxuXHRcdFwi8KWjnuOrteervOm+l/CkhaHwqKSN8KOHqvCgqorwo4me5IyK6JKE6b6W6ZCv5KSw6JiT5aKW6Z2K6YiY56eQ56iy5pmg5qip6KKd55GM56+F5p6C56is5YmP6YGG45Om54+E8KW2ueeThum/h+Wes+Skr+WRjOSEsfCjmo7loJjnqbLwp62l6K6P5Jqu8Ka6iOSGgfCltpnnrq7wopK86b+I8KKTgfCik4nwopOM6b+J6JSE8KOWu+SCtOm/iuSTofCqt7/mi4Hnga7pv4tcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ODQwXCIsXG5cdFx0XCLjh4BcIixcblx0XHQ0LFxuXHRcdFwi8KCEjOOHhfCgg5HwoION44eG44eH8KCDi/Chv6jjh4jwoIOK44eJ44eK44eL44eM8KCEjuOHjeOHjsSAw4HHjcOAxJLDicSaw4jFjMOTx5HDkuC/v8OKzIThur7gv7/DisyM4buAw4rEgcOhx47DoMmRxJPDqcSbw6jEq8Otx5DDrMWNw7PHksOyxavDuseUw7nHlseYx5pcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OGExXCIsXG5cdFx0XCLHnMO84L+/w6rMhOG6v+C/v8OqzIzhu4HDqsmh4o+a4o+bXCJcblx0XSxcblx0W1xuXHRcdFwiODk0MFwiLFxuXHRcdFwi8KqOqfChhYVcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OTQzXCIsXG5cdFx0XCLmlIpcIlxuXHRdLFxuXHRbXG5cdFx0XCI4OTQ2XCIsXG5cdFx0XCLkuL3mu53ptY7ph59cIlxuXHRdLFxuXHRbXG5cdFx0XCI4OTRjXCIsXG5cdFx0XCLwp5y15pKR5Lya5Lyo5L6o5YWW5YW05Yac5Yek5Yqh5Yqo5Yy75Y2O5Y+R5Y+Y5Zui5aOw5aSE5aSH5aSy5aS05a2m5a6e5a6f5bKa5bqG5oC75paJ5p++5qCE5qGl5rWO54K855S157qk57qs57q657uH57uP57uf57yG57y36Im66IuP6I2v6KeG6K6+6K+i6L2m6L2n6L2uXCJcblx0XSxcblx0W1xuXHRcdFwiODlhMVwiLFxuXHRcdFwi55CR57O857eN5qWG56uJ5YinXCJcblx0XSxcblx0W1xuXHRcdFwiODlhYlwiLFxuXHRcdFwi6YaM56K46YWe6IK8XCJcblx0XSxcblx0W1xuXHRcdFwiODliMFwiLFxuXHRcdFwi6LSL6IO28KCnp1wiXG5cdF0sXG5cdFtcblx0XHRcIjg5YjVcIixcblx0XHRcIuiCn+m7h+Szjem3iem4jOSwvvCpt7bwp4CO6biK8KqEs+OXgVwiXG5cdF0sXG5cdFtcblx0XHRcIjg5YzFcIixcblx0XHRcIua6muiIvueUmVwiXG5cdF0sXG5cdFtcblx0XHRcIjg5YzVcIixcblx0XHRcIuSkkemprOmqj+m+meemh/CokazwobeK8KCXkPCiq6bkuKTkuoHkuoDkuofkur/ku6vkvLfjkYzkvr3juYjlgIPlgojjkb3jkpPjkqXlhoblpIXlh5vlh7zliIXkuonlibnlipDljKfjl4fljqnjlZHljrDjlZPlj4LlkKPjla3jlbLjmoHlkpPlkqPlkrTlkrnlk5Dlk6/llJjllKPllKjjlpjllL/jlqXjlr/ll5fjl4VcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YTQwXCIsXG5cdFx0XCLwp7aE5ZSlXCJcblx0XSxcblx0W1xuXHRcdFwiOGE0M1wiLFxuXHRcdFwi8KCxgvCgtJXwpYSr5ZaQ8KKzhuOnrPCgjYHouYbwpLa48KmTpeSBk/Cogr7nnbrworC446i05J+V8KiFnfCmp7LwpLeq5pOd8KC1vPCgvrTwoLOV8KGDtOaSjei5vvCgupbwoLCL8KC9pPCisqnwqImW8KSTk1wiXG5cdF0sXG5cdFtcblx0XHRcIjhhNjRcIixcblx0XHRcIvCgtYbwqamN8KiDqeSftPCkuqfworOC6aqy46mn8KmXtOO/reOUhvCli4fwqZ+U8KejiPCitYTpta7poJVcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YTc2XCIsXG5cdFx0XCLkj5nwpoKl5pK05ZOj8KK1jPCir4rwoYG346e78KGBr1wiXG5cdF0sXG5cdFtcblx0XHRcIjhhYTFcIixcblx0XHRcIvCmm5rwppyW8KemoOaTqvClgZLwoLGD6Lmo8KKGofCorYzwoJyxXCJcblx0XSxcblx0W1xuXHRcdFwiOGFhY1wiLFxuXHRcdFwi5KCL8KCGqeO/uuWhs/Cito1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4YWIyXCIsXG5cdFx0XCLwpJeI8KCTvPCmgpfwoL2M8KC2luWVueSCu+SOulwiXG5cdF0sXG5cdFtcblx0XHRcIjhhYmJcIixcblx0XHRcIuSqtPCiqabwoYKd6Iaq6aO18KC2nOaNueOnvvCinbXot4DlmqHmkbzjuYNcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YWM5XCIsXG5cdFx0XCLwqpiB8KC4ifCiq4/worOJXCJcblx0XSxcblx0W1xuXHRcdFwiOGFjZVwiLFxuXHRcdFwi8KGDiPCjp4LjppLjqIbwqIqb45W48KW5ifCig4flmZLwoLyx8KKysvCpnKDjkrzmsL3wpLi7XCJcblx0XSxcblx0W1xuXHRcdFwiOGFkZlwiLFxuXHRcdFwi8KeVtPCiuovwooiI8KqZm/Cos43woLm68KCwtPCmoJznvpPwoYOP8KKgg/CipLnjl7vwpYej8KC6jPCgvo3woLqq476T8KC8sPCgtYfwoYWP8KC5jFwiXG5cdF0sXG5cdFtcblx0XHRcIjhhZjZcIixcblx0XHRcIvCguqvwoK6p8KC1iPChg4DwoYS947+58KKaluaQsvCgvq1cIlxuXHRdLFxuXHRbXG5cdFx0XCI4YjQwXCIsXG5cdFx0XCLwo4+08KeYufCir47woLW+8KC1v/CisZHworGV46iY8KC6mPChg4fwoLyu8KqYsvCmrZDwqLOS8Ki2mfCos4rplqrlk4zoi4TllrlcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YjU1XCIsXG5cdFx0XCLwqbuD6bCm6aq28KednvCit67nhYDoha3og6zlsJzwppWy6IS0456X5Y2f8KiCvemGtvCgu7rwoLiP8KC5t/Cgu7vjl53wpLer45iJ8KCzluWar/CinrXwoYOJ8KC4kPCgubjwoYG48KGFiPCoiIfwoZGV8KC5ufCkuZDworak5amU8KGAnfChgJ7woYO18KGDtuWenPCguJFcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YmExXCIsXG5cdFx0XCLwp5qU8KiLjfCgvrXwoLm78KWFvuOcg/CgvrbwoYaA8KWLmPCqir3wpKea8KGguvCkhbfwqIm85aKZ5Ymo45ia8KWcveeusuWtqOSggOSsrOm8p+Snp+mwn+mujfClrbTwo4S95Ze745ey5ZqJ5Lio5aSC8KGvgfCvobjpnZHwoIKG5Lmb5Lq745S+5bCj5b2R5b+E46O65omM5pS15q265rC15rC654Gs54ir5Lis54qt8KSjqee9kueku+ezuee9k/Cmiarjk4FcIlxuXHRdLFxuXHRbXG5cdFx0XCI4YmRlXCIsXG5cdFx0XCLwpo2L6ICC6IKA8KaYkvCmpZHljZ3ooaTop4Hwp6Ky6K6g6LSd6ZKF6ZW46ZW/6Zeo8Ki4j+mfpumhtemjjumjnumlo/CpoJDpsbzpuJ/pu4Tmra/vpIfkuLfwoIKH6Zid5oi36ZKiXCJcblx0XSxcblx0W1xuXHRcdFwiOGM0MFwiLFxuXHRcdFwi5YC75re+8Kmxs+m+puO3ieiij/CkhY7ngbfls7XkrKDwpYeN45WZ8KW0sOaEovCoqLLovqfph7bnhpHmnJnnjrrwo4qB8KqEh+Oyi/ChpoDkrJDno6TnkILlhq7wqJyP5ICJ5qmj8KqKuuSIo+iYj/Cgqa/nqKrwqaWH8KirqumdleeBjeWMpPCigb7pj7Tnm5nwqKej6b6n55+d5Lqj5L+w5YK85Liv5LyX6b6o5ZC057aL5aKS5aOQ8KG2tuW6kuW6meW/gvCinJLmlotcIlxuXHRdLFxuXHRbXG5cdFx0XCI4Y2ExXCIsXG5cdFx0XCLwo4+55qSZ5qmD8KOxo+azv1wiXG5cdF0sXG5cdFtcblx0XHRcIjhjYTdcIixcblx0XHRcIueIgPCklIXnjozju5vwpKiT5ayV55K56K6D8KWypPClmpXnqpPnr6zns4Pnuazoi7jolpfpvqnoopDpvqrournpvqvov4/olZ/pp6DpiKHpvqzwqLa58KGQv+SBseSKouWomlwiXG5cdF0sXG5cdFtcblx0XHRcIjhjYzlcIixcblx0XHRcIumhqOadq+SJtuWcvVwiXG5cdF0sXG5cdFtcblx0XHRcIjhjY2VcIixcblx0XHRcIuiXlvCkpbvoir/wp4SN5LKB8Ka1tOW1u/CmrJXwpr6+6b6t6b6u5a6W6b6v5pun57mb5rmX56eK47aI5JOD8KOJlvCinpbkjprklLZcIlxuXHRdLFxuXHRbXG5cdFx0XCI4Y2U2XCIsXG5cdFx0XCLls5Xwo6ya6Ku55bG447SS8KOVkeW1uOm+sueFl+SVmPCkg6zwobij5LG346W445GK8KCGpPCmsYHoq4zkvrTwoIi55aa/6IWs6aGW8KmjuuW8u1wiXG5cdF0sXG5cdFtcblx0XHRcIjhkNDBcIixcblx0XHRcIvCgrp9cIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZDQyXCIsXG5cdFx0XCLwooeB8KilreSEguSau/CpgbnjvIfpvrPwqoa15IO445+W5Ju38KaxhuSFvPComrLwp4+/5JWt46OU8KWSmuSVoeSUm+S2ieSxu+S1tuSXquO/iPCkrI/jmaHkk57kkr3kh63ltL7ltYjltZbjt7zjoI/ltqTltrnjoKDjoLjluYLlur3lvKXlvoPjpIjjpJTjpL/jpY3mg5fmhL3ls6Xjponmhrfmhrnmh4/jprjmiKzmipDmi6XmjJjjp7jlmrFcIlxuXHRdLFxuXHRbXG5cdFx0XCI4ZGExXCIsXG5cdFx0XCLjqIPmj6Lmj7vmkIfmkZrjqYvmk4DltJXlmKHpvp/jqpfmlobjqr3ml7/mmZPjq7LmmpLjrKLmnJbjrYLmnqTmoIDjrZjmoYrmooTjrbLjrbHjrbvmpInmpYPniZzmpaTmpp/mpoXjrrzmp5bjr53mqaXmqbTmqbHmqoLjr6zmqpnjr7LmqqvmqrXmq5Tmq7bmroHmr4Hmr6rmsbXmsqrjs4vmtILmtIbmtKbmtoHjs6/mtqTmtrHmuJXmuJjmuKnmuobwqKeA5rq75rui5rua6b2/5ruo5rup5ryk5ry047WG8KO9gea+gea+vuO1quO1teeGt+WymeO2iueArOO2keeBkOeBlOeBr+eBv+eCifCgjKXkj4Hjl7HwoLuYXCJcblx0XSxcblx0W1xuXHRcdFwiOGU0MFwiLFxuXHRcdFwi8KO7l+WevvCmu5PnhL7wpZ+g45mO5qai8KivqeWttOepifClo6HwqZOZ56ml56m98KWmrOequ+eqsOerguerg+eHkfCmko3kh4rnq5rnq53nq6rkh6/lkrLwpbCB56yL562V56yp8KWMjvCls77nrqLnra/ojpzwpa608Kaxv+evkOiQoeeukueuuPCltKDjtq3wpbGl6JKS56+657CG57C18KWzgeexhOeyg/CkooLnsqbmmb3wpJW457OJ57OH57Om57G057Oz57O157OOXCJcblx0XSxcblx0W1xuXHRcdFwiOGVhMVwiLFxuXHRcdFwi57mn5JSd8Ka5hOe1nfCmu5bnko3ntonntqvnhLXntrPnt5LwpIGX8KaAqee3pOO0k+e3tfChn7nnt6XwqI2t57id8KaEofCmhZrnua7nupLkjKvpkaznuKfnvYDnvYHnvYfnpLbwpouQ6aeh576X8KaNkee+o/ChmaHwoIGo5JWc8KOdpuSUg/CojLrnv7rwppKJ6ICF6ICI6ICd6ICo6ICv8KqCh/Cms4PogLvogLzogaHwopyU5KaJ8KaYpvCjt6Pwppuo5pyl6IKn8KipiOiEh+iEmuWisPCim7bmsb/wppKY8KS+uOaTp/ChkoroiJjwoaGe5qmT8KSppfCkqpXkkbroiKnwoKyN8KapkvCjtb7kv7nwoZO96JOi6I2i8KasivCkpqfwo5Sw8KGds/Cjt7joiqrmpJvwr6aU5IebXCJcblx0XSxcblx0W1xuXHRcdFwiOGY0MFwiLFxuXHRcdFwi6JWL6IuQ6Iya8KC4lvChnrTjm4Hwo4W98KOVmuiJu+iLouiMmPCjuovwpraj8KashfCmrpfwo5eO47a/6Iyd5Zes6I6F5JSL8Ka2peiOrOiPgeiPk+ORvvCmu5TmqZfolZrjkpbwprmC8KK7r+iRmPClr6TokbHjt5Pkk6TmqqfokYrwo7K156WY6JKo8KaulvCmubfwprmD6JOe6JCP6I6R5JKg6JKT6JOk8KWykeSJgPCls4DklYPolLTlq7LwprqZ5JSn6JWz5JSW5p6/6JiWXCJcblx0XSxcblx0W1xuXHRcdFwiOGZhMVwiLFxuXHRcdFwi8KiYpfComLvol4Hwp4KI6JiC8KGWgvCng43wr6ay5JWq6Jio45mI8KGiouWPt/Cnjpromb7onbHwqoO46J+u8KKwp+ieseifmuigj+WZoeiZrOahluSYj+ihheihhvCnl6Dwo7a58KeXpOihnuiinOSZm+iitOiiteaPgeijheedt/CnnI/opofoporopqbopqnopqfoprzwqKil6Ken8KekpPCnqr3oqpznnpPph77oqpDwp6mZ56up8KesuvCjvo/knJPwp6y454W86KyM6Kyf8KWQsPCllaXorL/orYzorY3oqqnwpKm66K6Q6K6b6Kqv8KGbn+SYleihj+iym/CntZTwp7aP8K+nlOOcpfCntZPos5bwp7aY8Ke2vei0kui0g/ChpJDos5vngZzotJHwpLOJ47uQ6LW3XCJcblx0XSxcblx0W1xuXHRcdFwiOTA0MFwiLFxuXHRcdFwi6Lap8KiAgvChgJTwpKaK46288KiGvPCnhIznq6fouq3ourbou4Ppi5TovJnovK3wqI2l8KiQkui+pemMg/Cqip/woKmQ6L6z5KSq8KinnvColL3wo7a75bu48KOJoui/ufCqgJTwqJq88KiUgfCijKXjpoDwpruX6YC38KiUvPCnqr7pgaHwqJWs8KiYi+mCqPConJPpg4TwqJum6YKu6YO96YWn46uw6Yap6YeE57Ks8Kiks/ChuonpiI7msp/piYHpiaLwpZa56Yq58KirhvCjspvwqKyM8KWXm1wiXG5cdF0sXG5cdFtcblx0XHRcIjkwYTFcIixcblx0XHRcIvCgtLHpjKzpjavwqKuh8Kivq+eCj+Wrg/Coq6LwqKul5KWl6YmE8KivrPCosLnwqK+/6Y2z6ZGb6Lq86ZaF6Zam6ZCm6Zag5r+25Iq58KKZuvCom5jwoYm88KO4ruSnn+awnOmZu+maluSFrOmao/Cmu5Xmh5rpmrbno7XwqKug6Zq95Y+M5Kah8KayuPCgibTwppCQ8KmCr/Cpg6XwpKuR8KGklfCjjIrpnLHomYLpnLbkqI/klL3kloXwpKup54G15a2B6Zyb6Z2c8KmHlemdl+WtivCph6vpnZ/pkKXlg5Dwo4K38KOCvOmeiemen+mesemevumfgOmfkumfoPClkazpn67nkJzwqZCz6Z+/6Z+18KmQnfCnpbrkq5HpoLTpoLPpoYvpoabjrI7wp4W147WR8KCYsPCkhZxcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MTQwXCIsXG5cdFx0XCLwpZyG6aOK6aK36aOI6aOH5Ku/8Ka0p/Chm5PllrDpo6Hpo6bpo6zpjbjppLnwpKip5K2y8Kmhl/CppIXpp7XpqIzpqLvpqJDpqZjwpZyl45uE8KmCsfCpr5Xpq6Dpq6LwqayF6au05LCO6ayU6ayt8KiYgOWAtOmstPCmpqjjo4Pwo4G96a2Q6a2A8Km0vuWphfChoaPpro7wpImL6bCC6a+/6bCM8Km5qOm3lPCpvrfwqoaS8KqGq/Cqg6HwqoSj8KqHn+m1vum2g/CqhLTpuI7moohcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MWExXCIsXG5cdFx0XCLpt4TwooWb8KqGk/CqiKDwoaS78KqIs+m0ufCqgrnwqoq06bqQ6bqV6bqe6bqi5LS06bqq6bqv8KSNpOm7geOtoOOnpeO0neS8suOevvCosKvpvILpvIjkrpbpkKTwprai6byX6byW6by55Zqf5ZqK6b2F6aa48KmCi+mfsuiRv+m9oum9qeernOm+jueIluSuvvCkpbXwpKa754W38KSnuPCkjYjwpKmR546e8KivmvCho7rnpp/wqKW+8Ki4tumNqemPs/CoqYTpi6zpjoHpj4vwqKWs8KSSueeIl+O7q+edsuepg+eDkPCkkbPwpI+454W+8KGfr+eCo/Chor7wo5aZ47uH8KGihfClkK/woZ+445yi8KGbu/ChoLnjm6HwoZ208KGjkfClvYvjnKPwoZuA5Z2b8KSopfChj77woYqoXCJcblx0XSxcblx0W1xuXHRcdFwiOTI0MFwiLFxuXHRcdFwi8KGPhvChkrbolIPwo5qm6JSD6JGV8KSmlPCnhaXwo7ix8KWVnPCju7vwp4GS5JO08KObrvCppp3wprym5p+545yz47CV47en5aGs8KGkouagkOSBl/CjnL/wpIOh8KSCi/CkhI/wprCh5ZOL5Zqe8KaaseWakvCgv5/woK6o8KC4jemPhvCorJPpjpzku7jlhKvjoJnwpJC25Lq88KCRpfCgjb/kvYvkvorwpZmR5amo8KCGq/Cgj4vjppnwoIyK8KCQlOOQteS8qfCgi4DwqLqz8KCJteirmvCgiIzkuphcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MmExXCIsXG5cdFx0XCLlg43lhI3kvqLkvIPwpKiO8KO6iuS9guWAruWBrOWCgeS/jOS/peWBmOWDvOWFmeWFm+WFneWFnua5tvCjlpXwo7i58KO6v+a1svChooTwo7qJ5Yao5YeD8KCXoOSTnfCgkqPwoJKS8KCSkei1uvCoqpzwoJyO5YmZ5Yqk8KChs+WLoemNruSZuueGjPCkjozwoLCg8KSmrPChg6Tmp5HwoLid55G547ue55KZ55CU55GW546Y5K6O8KSqvPCkgo3lj5DjloTniI/wpIOJ5Za08KCNheWTjfCgr4blnJ3piZ3pm7Tpjabln53lno3lnb/jmL7lo4vlqpnwqKmG8KGbuvChna/woZyQ5ais5aa46YqP5am+5auP5aiS8KWlhvChp7PwoaGh8KSKleObtea0heeRg+WoofCluoNcIlxuXHRdLFxuXHRbXG5cdFx0XCI5MzQwXCIsXG5cdFx0XCLlqoHwqK+X8KCQk+mPoOeSjPChjIPnhIXkpbLpkIjwqKe76Y69456g5bCe5bKe5bme5bmI8KGmlvChpbzwo6uu5buN5a2P8KGkg/ChpITjnIHwoaKg45ud8KGbvuObk+iEqvCoqYfwoba68KORsvCopqjlvIzlvI7woaSn8KGeq+Wpq/ChnLvlrYTomJTwp5e96KGg5oG+8KKhoPCimKvlv5vjurjwopav8KKWvvCpgojwpr2z5oeA8KCAvvCggYbwopib5oaZ5oaY5oG18KKym/CitIfwpJuU8KmFjVwiXG5cdF0sXG5cdFtcblx0XHRcIjkzYTFcIixcblx0XHRcIuaRsfCkmaXwoq2q46ip8KKsovCjkZDwqaOq8KK5uOaMt/CqkZvmkrbmjLHmj5HwpKej8KK1p+aKpPCisqHmkLvmlavmpbLjr7Two4KO8KOKrfCkponwo4qr5ZSN8KOLoPCho5nwqZC/5puO8KOKifCjhrPjq6DkhpDwpZaE8KisovCllo/woZu88KWVm/ClkKXno67wo4SD8KGgqvCjiLTjkaTwo4iP8KOGgvCki4nmmo7wprSk5pmr5K6T5piw8KehsPCht6vmmaPwo4uS8KOLoeaYnvClobLjo5Hwo6C68KOevOOumfCjnqLwo4++55OQ466W5p6P8KSYquaituagnuOvhOaqvuOho/Cjn5XwpJKH5qiz5qmS5quJ5qyF8KGkkuaUkeaimOapjOOvl+apuuatl/Cjv4Dwo7Ka6Y6g6Yuy8KivqvCoq4tcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NDQwXCIsXG5cdFx0XCLpionwqICe8KinnOmRp+a2pea8i/Ckp6zmtafwo72/47aP5riE8KSAvOWovea4iuWhh+a0pOehgueEu/CkjJrwpIm254Ox54mQ54qH54qU8KSej/CknKXlhbnwpKqk8KCXq+eRuvCju7jwo5mf8KSpivCkpJfwpb+h47yG47qx8KSrn/CosKPwo7y15oKn47uz55OM55C86Y6H55C35JKf8Ka3quSVkeeWg+O9o/Cks5nwpLSG472Y55WV55mz8KqXhuOsmeeRqPCoq4zwpKar8KSmjuOru1wiXG5cdF0sXG5cdFtcblx0XHRcIjk0YTFcIixcblx0XHRcIuO3jfCkqY7ju7/wpKeF8KSjs+mHuuWcsumNgvCoq6PwoaGk5YOf8KWIofClh6fnnbjwo4iy55yO55yP55278KSal/CjnoHjqZ7wpKOw55C455Kb47q/8KSquvCkq4fkg4jwpKqW8KaGrumMh/ClloHnoJ7noo3noojno5Lnj5DnpZnwp52B8KWbo+SEjuemm+iSluempeaorfCju7rnqLrnp7Tkha7woZum5ISy6Yi156ex8KC1jPCkpozwoIqZ8KO2uvChna7jlpfllavjlbDjmqrwoIeU8KCwjeerouWpmfCim7Xwpaqv8KWqnOWojfCgiZvno7DlqKrwpa+G56u+5Ie557Gd57Gt5IiR8KWus/Clurzwpbqm57ON8KSnufChnrDnso7nsbznsq7mqrLnt5znuIfnt5PnvY7wpomhXCJcblx0XSxcblx0W1xuXHRcdFwiOTU0MFwiLFxuXHRcdFwi8KaFnPCnrYjntpfwpbqC5Imq8KattfCgpJbmn5bwoIGO8KOXj+WfhPCmkJLwpo+48KSloue/neesp/CgoKzwpaup8KW1g+esjPCluI7pp6bomYXpqaPmqJzwo5C/46ei8KSnt/Cmlq3pqJ/wppag6JKA8KeEp/Cms5Hkk6rohLfkkILog4bohInohYLwpp606aOD8KapguiJouiJpfCmqZHokZPwpran6JiQ8KeIm+WqhuSFv/ChoYDlrKvwoaKh5auk8KGjmOiaoPCvprzwo7aP6KCt8KeQouWoglwiXG5cdF0sXG5cdFtcblx0XHRcIjk1YTFcIixcblx0XHRcIuihruS9heiih+iiv+ijpuilpeiljfClmoPopZTwp56F8KeehPCor7XwqK+Z8KiunPCop7njuq3okqPkm7Xkm4/jn7LoqL3oqJzwqZGI5b2N6Yir8KSKhOaXlOeEqeeDhPChoYXpta3osp/os6nwp7ec5aaa55+D5aew5I2u45uU6Liq6Lqn8KSwiei8sOi9iuSLtOaxmOa+u/CijKHkopvmvbnmuovwoZ+a6a+p45q18KSkr+mCu+mCl+WVseSkhumGu+mQhPCoqYvkgaLwqKu86ZCn8KiwnfCosLvok6XoqKvplpnplqfplpfplpbwqLS055GF47uC8KSjv/CkqYLwpI+q47un8KOIpemaj/Cou6fwqLmm8Ki5peO7jPCkp63wpKm48KO/rueQkueRq+O7vOmdgfCpgrBcIlxuXHRdLFxuXHRbXG5cdFx0XCI5NjQwXCIsXG5cdFx0XCLmoYfkqJ3wqYKT8KWfn+mdnemNqPCoponwqLCm8Kisr/Cmjr7pirrlrJHorankpLznj7nwpIib6Z6b6Z2x6aS48KC8puW3gfCor4XwpKqy6aCf8KmTmumLtvCpl5fph6Xkk4DwqK2Q8KSpp/CoraTpo5zwqKmF47yA6Yiq5KSl6JCU6aS76aWN8KeshuO3vemmm+Str+mmqumpnPCoraXwpaOI5qqP6aih5au+6aiv8KmjseSukPCppYjpprzkrr3krpfpjb3lobLwoYyC5aCi8KSmuFwiXG5cdF0sXG5cdFtcblx0XHRcIjk2YTFcIixcblx0XHRcIvChk6jnoYTwopyf8KO2uOajheO1vemRmOOkp+aFkPCinoHwoqWr5oSH6bGP6bGT6bG76bC16bCQ6a2/6a+P8Km4remun/Cqh7XwqoO+6bSh5LKu8KSEhOm4mOSysOm0jPCqhrTwqoOt8KqDs/CppK/ptqXokr3wpriS8Ka/n/CmroLol7zklLPwprak8Ka6hPCmt7DokKDol67wpriA8KOfl/CmgaTnp6Lwo5ac8KOZgOSkrfCkp57jtaLpj5vpir7pjYjwoIq/56K56Ym36ZGN5L+k45GA6YGk8KWVneegveehlOeituehi/ChnZfwo4eJ8KSlgeOamuS9sua/mua/meeAnueAnuWQlPCkhrXlnrvlo7PlnorptJbln5fnhLTjkq/wpIas54er8KaxgPCkvpflrKjwoZ618KipiVwiXG5cdF0sXG5cdFtcblx0XHRcIjk3NDBcIixcblx0XHRcIuaEjOWrjuWoi+SKvPCkkojjnKzkrbvwqKe86Y676Y648KGjlvCgvJ3okbLwprOA8KGQk/Cki7rworCm8KSPgeWmlPCjtrfwpp2B57ao8KaFm/CmgqTwpKa58KSmi/Cop7rpi6Xnj6Lju6nnkrTwqK2j8KGin+O7ofCkqrPmq5jnj7Pnj7vju5bwpKi+8KSqlPChn5nwpKmm8KCOp/ChkKTwpKel55GI8KSklueCpfCkpbbpioTnj6bpjZ/woJO+6Yyx8KirjvCoqJbpjobwqK+n8KWXleSktfCoqoLnhatcIlxuXHRdLFxuXHRbXG5cdFx0XCI5N2ExXCIsXG5cdFx0XCLwpKWD8KCzv+WapPCgmJrwoK+r8KCyuOWUguenhPChn7rnt77woZuC8KSpkPChoZLklK7pkIHjnIrwqKuA8KSmreWmsPChor/woaKD8KeShOWqoeObovCjtZvjmrDpiZ/lqbnwqKqB8KGhoumNtOOzjfCgqrTkqpbjporlg7TjtanjtYzwoY6c54W15Iu78KiImOa4j/Cpg6Tkk6vmtZfwp7mP54Gn5rKv47OW8KO/rfCjuK3muILmvIzjta/woI+155WR45q845OI5JqA47ua5KGx5aeE6Ymu5KS+6L2B8KiwnPCmr4DloJLln4jjm5bwoZGS54O+8KSNovCkqbHwor+j8KGKsPCijr3mornmpafwoY6Y8KOTpfCnr7Two5uf8Kiqg/Cjn5bwo4+68KSyn+aomvCjmq3wprK36JC+5JOf5JOOXCJcblx0XSxcblx0W1xuXHRcdFwiOTg0MFwiLFxuXHRcdFwi8Ka0pvCmtZHwprKC8Ka/nua8l/CnhInojL3woZy66I+t8KaygPCngZPwoZ+b5aaJ5aqC8KGes+WpoeWpsfChpIXwpIe845yt5aev8KGcvOObh+eGjumOkOaamvCkiqXlqa7lqKvwpIqT5qir8KO7ufCnnLbwpJGb8KSLiueEnfCkiZnwqKeh5L6w8Ka0qOWzgvCkk47wp7mN8KSOveaojPCkiZbwoYyE54Km54Sz8KSPqeO2peazn/CvoKXwpKmP57ml5aer5bSv47ez5b2c8KSpnfChn5/ntqTokKZcIlxuXHRdLFxuXHRbXG5cdFx0XCI5OGExXCIsXG5cdFx0XCLlkoXwo6u68KOMgPCgiJTlnb7woKOV8KCYmeO/pfChvp7wqoq254CD8KmFm+W1sOeOj+ezk/CoqZnwqZCg5L+I57+n54uN54yQ8KertOeMuOeMufClm7bnjYHnjYjjuqnwp6yY6YGs54e18KSjsuePoeiHtuO7iuecjOO7keayouWbveeQmeeQnueQn+O7ouO7sOO7tOO7uueTk+O8juO9k+eVgueVreeVsueWjeO9vOeXiOeXnOO/gOeZjeO/l+eZtOO/nOeZuvCkvZznhojlmKPopoDloankgJ3nnYPkgLnmnaHkgYXjl5vnnpjkgarkga/lsZ7nnr7nn4vlo7LnoJjngrnnoJzkgqjnoLnnoYfnoZHnoabokYjwpZS156Sz5qCD56Sy5ISDXCJcblx0XSxcblx0W1xuXHRcdFwiOTk0MFwiLFxuXHRcdFwi5ISJ56aR56aZ6L6756iG6L685IWn56qR5Iay56q86Im55IeE56uP56ub5IeP5Lih562i562s562757CS57Cb5Img5Im657G757Kc5IqM57K45IqU57Ot6L6T54OA8KCzj+e3j+e3lOe3kOe3vee+rue+tOeKn+SOl+iAoOiApeesueiAruiAseiBlOO3jOWetOeCoOiCt+iDqeSPreiEjOeMquiEjuiEkueVoOiElOSQgeOsueiFluiFmeiFmlwiXG5cdF0sXG5cdFtcblx0XHRcIjk5YTFcIixcblx0XHRcIuSQk+WguuiFvOiGhOSQpeiGk+SQreiGpeWfr+iHgeiHpOiJlOSSj+iKpuiJtuiLiuiLmOiLv+SSsOiNl+mZqeamiuiQheeDteiRpOaDo+iSiOSUhOiSvuiToeiTuOiUkOiUuOiVkuSUu+iVr+iVsOiXoOSVt+iZsuiakuiasuibr+mZheiei+SYhuSYl+iiruijv+ikpOilh+imkfCnpafoqKnoqLjoqpToqrTosZHos5Tos7LotJzknpjloZ/ot4Pkn63ku67ouLrll5jlnZToubHll7XourDkoLfou47ou6Lou6Tou63ou7Lovrfov4Hov4rov4zpgLPpp4Tkoq3po6DpiJPkpJ7piKjpiZjpiavpirHpiq7pir9cIlxuXHRdLFxuXHRbXG5cdFx0XCI5YTQwXCIsXG5cdFx0XCLpi6Ppi6vpi7Ppi7Tpi73pjYPpjoTpjq3kpYXkpZHpur/pkJfljIHpkJ3pkK3pkL7kparpkZTpkbnplK3plqLkpqfpl7TpmLPkp6XmnqDkqKTpnYDkqLXpnrLpn4LlmZTkq6Tmg6jpornkrJnpo7HloYTppI7ppJnlhrTppJzppLfppYLppZ3ppaLkrbDpp4Xkrp3pqLzprI/nqoPpranproHpr53pr7Hpr7Tksa3psKDjna/woa+C6bWJ6bC6XCJcblx0XSxcblx0W1xuXHRcdFwiOWFhMVwiLFxuXHRcdFwi6bu+5ZmQ6baT6ba96beA6be86ZO26L626bm76bqs6bqx6bq96buG6ZOc6bui6bux6bu456uI6b2E8KCClPCgirfwoI6g5qSa6ZOD5aas8KCTl+WhgOmTgeOeufCgl5XwoJiV8KCZtvChmrrlnZfnhbPwoKuC8KCrjfCgrr/lkarwr6C78KCvi+WSnvCgr7vwoLC78KCxk/CgsaXwoLG85oOn8KCyjeWZuvCgsrXwoLOd8KCzrfCgta/woLay8KC3iOallemwr+iepfCguITwoLiO8KC7l/CgvpDwoLyt8KC5s+WwoPCgvrzluIvwoYGc8KGBj/ChgbbmnJ7woYG78KGCiPChgpbjmYfwoYK/8KGDk/ChhK/woYS75Y2k6JKt8KGLo/ChjbXwoYy26K6B8KGVt/ChmJnwoZ+D8KGfh+S5uOeCu/ChoK3woaWqXCJcblx0XSxcblx0W1xuXHRcdFwiOWI0MFwiLFxuXHRcdFwi8KGorfChqYXwobCq8KGxsPChsqzwobuI5ouD8KG7lfChvJXnhpjmoZXwooGF5qep45uI8KKJvPCij5fwoo+68KKcqvCiobHwoqWP6Iu98KKlp/CippPwoquV6Kal8KKrqOi+oPCirI7pnrjwoqy/6aGH6aq98KKxjFwiXG5cdF0sXG5cdFtcblx0XHRcIjliNjJcIixcblx0XHRcIvCisojworK38KWvqPCitIjworSS8KK2t/CitpXwormC8KK9tPCiv4zwo4Cz8KOBpvCjjJ/wo4+e5b6x5pmI5pq/8KepufCjlafwo5ez54iB8KSmuuefl/CjmJrwo5yW57qH8KCNhuWiteacjlwiXG5cdF0sXG5cdFtcblx0XHRcIjliYTFcIixcblx0XHRcIuakmPCjqqfwp5mX8KW/ovCjuJHwo7q58KeXvvCigprko5DkqrjwpISZ8KiqmvCki67wpIyN8KSAu/CkjLTwpI6W8KSphfCgl4rlh5LwoJiR5aaf8KG6qOOuvvCjs7/wpJCE8KSTluWeiPCkmbTjppvwpJyv8KiXqPCpp4njnaLwooeD6K2e8KitjumnlvCkoJLwpKO78KSoleeIifCkq4DwoLG45aWl8KS6pfCkvobwoJ256Lua8KWArOWKj+Wcv+eFsfClipnwpZCZ8KO9ivCkqqfllrzwpZGG8KWRrvCmrZLph5TjkbPwpZS/8KeYsvCllZ7knJjwpZWi8KWVpvCln4fwpKS/8KWhneWBpuOTu/Cjj4zmg57wpaSD5J288KiliPClqq7wpa6J8KWwhvChtpDlnqHnhZHmvrbwpoSC8KewkumBlvCmhrLwpL6a6K2i8KaQgvCmkYpcIlxuXHRdLFxuXHRbXG5cdFx0XCI5YzQwXCIsXG5cdFx0XCLltZvwpq+36Ly28KaShPChpJzoq6rwpKe28KaSiPCjv6/wppSS5K+A8KaWv/CmmrXwopyb6ZGl8KWfoeaGleWop/Cvo43kvrvlmrnwpJSh8KabvOS5qvCkpLTpmZbmto/wprK945iY6KW38KaemfCmoa7wppCR8KahnueHn/Cmo4fnrYLwqYOA8KCokfCmpKbphITwpqS556mF6bew8KanuumopvCmqK3jmZ/wppGp8KCAoeemg/CmqLTwpq2b5bSs8KOUmeiPj/Cmrp3km5DwprKk55S76KGl8Ka2ruWitlwiXG5cdF0sXG5cdFtcblx0XHRcIjljYTFcIixcblx0XHRcIuOcnPCilo3wp4GL8KeHjeOxlPCnioDwp4qF6YqB8KKFuvCniovpjLDwp4um8KSnkOawuemSn/CnkZDwoLu46KCn6KO18KKkpvCokbPwoZ6x5rq48KSoqvChoKDjpqTjmrnlsJDnp6PklL/mmrbwqbKt8KmipOilg/Cnn4zwp6GY5ZuW5IOf8KGYiuOmofCjnK/wqIOo8KGPheeGreiNpvCnp53wqYao5amn5LK38KeCr/Copqvwp6e98KeoivCnrIvwp7Wm8KSFuuetg+elvvCogInmvrXwqouf5qiD8KiMmOWOovCmuIfpjr/moLbpnZ3wqIWv8KiAo/CmprXwoY+t8KOIr/CogYjltoXwqLCw8KiCg+Wclemgo/CopYnltqvwpKaI5pa+5qeV5Y+S8KSqpfCjvoHjsJHmnLbwqIKQ8KiDtPCohK7wob6h8KiFj1wiXG5cdF0sXG5cdFtcblx0XHRcIjlkNDBcIixcblx0XHRcIvCohonwqIav8KiImvCojIbwqIyv8KiOiuOXivCokajwqJqq5KO65o+m8KilluegiOmJlfCoprjkj7LwqKen5I+f8KinqPCorYbwqK+U5ae48Kiwiei8i/Cov4XwqYOs562R8KmEkPCphLzjt7fwqYWe8KSriui/kOeKj+Wai/Cpk6fwqZep8KmWsPCplrjwqZyy8KmjkfCppYnwqaWq8Kmng/CpqKjwqayO8Km1mvCptpvnup/wqbu48Km8o+SypOmVh/CqipPnhqLwqou/5LaR6YCS8KqXi+S2nPCgspzovr7ll4FcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZGExXCIsXG5cdFx0XCLovrrwopKw6L658KSqk+SUiee5v+a9luaqseS7quOTpPCorKzwp6Kd45y66LqA8KGftfCogKTwqK2s8KiumfCnqL7wppqv47er8KeZlfCjsrfwpZi18KWlluS6mvCluoHwpomY5Zq/8KC5rei4juWtrfCjuojwpLKe5o+e5ouQ8KGftvChobvmlLDlmK3wpbGK5ZCa8KWMkeO3hvCptpjksb3lmKLlmJ7nvYnwpbuY5aW18KO1gOidsOS4nPCgv6rwoLWJ8KOauuiEl+m1nui0mOeYu+mxheeZjueeuemNheWQsuiFiOiLt+WYpeiEsuiQmOiCveWXquelouWZg+WQlvCgup3jl47lmIXll7Hmm7HwqIui45it55S05Zew5Za65ZKX5ZWy8KCxgfCgspblu5DwpYWI8KC5tvCisaJcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZTQwXCIsXG5cdFx0XCLwoLqi6bqr57Wa5Zee8KGBteaKnemdreWSlOizjeeHtumFtuaPvOaOueaPvuWVqfCirYPpsbLworqz5Yaa45Of8KC2p+WGp+WRjeWUnuWUk+eZpui4rfCmoornlrHogrbooITonoboo4fohrbokJzwoYOB5JOs54yE8KSchuWukOiMi/CmopPlmbvwopu08Ke0r/CkhqPwp7Wz8Ka7kPCnirbphbDwoYeZ6YiI8KOzvPCqmqnwoLqs8KC7ueeJpvChsqLknY7wpL+C8Ke/ufCgv6vkg7pcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZWExXCIsXG5cdFx0XCLpsZ3mlJ/worag5KOz8KSfoPCptbzwoL+s8KC4iuaBovCnlqPwoL+tXCJcblx0XSxcblx0W1xuXHRcdFwiOWVhZFwiLFxuXHRcdFwi8KaBiPChhofnhqPnuo7ptZDkuJrkuITjlbflrI3msrLljafjmqzjp5zljb3jmqXwpJiY5aKa8KStruiIreWRi+WeqvClqpXwoKW5XCJcblx0XSxcblx0W1xuXHRcdFwiOWVjNVwiLFxuXHRcdFwi46mS8KKRpeeNtPCpuqzktInpr63wo7O+8Km8sOSxm/CkvqnwqZae8Km/nuiRnPCjtrbwp4qy8Kaes/CjnKDmjK7ntKXwo7u38KO4rOOoqumAiOWLjOO5tOOZuuSXqfCgko7nmYDlq7DwoLq256G68Ke8ruWip+SCv+WZvOmui+W1tOeZlPCqkLTpuoXks6Hnl7njn7vmhJnwo4Oa8KSPslwiXG5cdF0sXG5cdFtcblx0XHRcIjllZjVcIixcblx0XHRcIuWZnfChiqnlnqfwpKWj8Km4huWItPCngq7jlq3msYrptbxcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZjQwXCIsXG5cdFx0XCLnsZbprLnln57woZ2s5bGT5pOT8KmTkPCmjLXwp4Wk6Jqt8KC0qPCmtKLwpKui8KC1sVwiXG5cdF0sXG5cdFtcblx0XHRcIjlmNGZcIixcblx0XHRcIuWHvvChvI/lto7pnIPwobeR6bqB6YGM56yf6ayC5bOR566j5omo5oy16au/56+P6ayq57G+6ayu57GC57KG6bCV56+86ayJ6byX6bCb8KSkvum9muWVs+Wvg+S/vem6mOS/suWJoOO4huWLkeWdp+WBluWmt+W4kumfiOm2q+i9nOWRqemetOmlgOmeuuWMrOaEsFwiXG5cdF0sXG5cdFtcblx0XHRcIjlmYTFcIixcblx0XHRcIuakrOWPmumwium0guSwu+mZgeamgOWCpueVhvChna3pp5rlibNcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZmFlXCIsXG5cdFx0XCLphZnpmoHphZxcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZmIyXCIsXG5cdFx0XCLphZHwqLqX5o2/8Ka0o+ariuWYkemGjueVuuaKhfCgj7znjY/nsbDwpbCh8KOzvVwiXG5cdF0sXG5cdFtcblx0XHRcIjlmYzFcIixcblx0XHRcIvCkpJnnm5bprp3kuKrwoLOU6I6+6KGCXCJcblx0XSxcblx0W1xuXHRcdFwiOWZjOVwiLFxuXHRcdFwi5bGK5qeA5YOt5Z265Yif5be15LuO5rCx8KCHsuS8ueWSnOWTmuWKmui2guOXvuW8jOOXs1wiXG5cdF0sXG5cdFtcblx0XHRcIjlmZGJcIixcblx0XHRcIuatkumFvOm+pemul+mgrumitOmquum6qOm6hOeFuueslFwiXG5cdF0sXG5cdFtcblx0XHRcIjlmZTdcIixcblx0XHRcIuavuuigmOe9uFwiXG5cdF0sXG5cdFtcblx0XHRcIjlmZWJcIixcblx0XHRcIuWYoPCqmYroubfpvZNcIlxuXHRdLFxuXHRbXG5cdFx0XCI5ZmYwXCIsXG5cdFx0XCLot5TouY/puJzouIHmioLwqI296Lio6Lm156uT8KSpt+eovuejmOazquipp+eYh1wiXG5cdF0sXG5cdFtcblx0XHRcImEwNDBcIixcblx0XHRcIvCoqZrpvKbms47on5bnl4Pwqoqy56GT8K+hgOi0jOeLoueNseisreeMgueTseizq/CkqrvomK/lvrrooqDkkrdcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMDU1XCIsXG5cdFx0XCLwoaC78Ka4hVwiXG5cdF0sXG5cdFtcblx0XHRcImEwNThcIixcblx0XHRcIuipvvCilJtcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMDViXCIsXG5cdFx0XCLmg73nmafpq5fptYTpja7pro/on7VcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMDYzXCIsXG5cdFx0XCLooI/os7fnjKzpnKHprrDjl5bnirLksIfnsZHppYrwpoWZ5oWZ5LCE6bqW5oW9XCJcblx0XSxcblx0W1xuXHRcdFwiYTA3M1wiLFxuXHRcdFwi5Z2f5oWv5oqm5oi55ouO46mc5oei5Y6q8KOPteaNpOagguOXklwiXG5cdF0sXG5cdFtcblx0XHRcImEwYTFcIixcblx0XHRcIuW1l/Cor4Lov5rwqLi5XCJcblx0XSxcblx0W1xuXHRcdFwiYTBhNlwiLFxuXHRcdFwi5YOZ8KG1huekhuWMsumYuPCgvLvkgaVcIlxuXHRdLFxuXHRbXG5cdFx0XCJhMGFlXCIsXG5cdFx0XCLnn75cIlxuXHRdLFxuXHRbXG5cdFx0XCJhMGIwXCIsXG5cdFx0XCLns4Lwpbya57Oa56it6IGm6IGj57WN55SF55Oy6KaU6Iia5pyM6IGi8KeShuiBm+eTsOiEg+ecpOimifCmn4znlZPwpruR6J6p6J+O6IeI6J6M6KmJ6LKt6K2D55yr55O46JOa45i15qay6LamXCJcblx0XSxcblx0W1xuXHRcdFwiYTBkNFwiLFxuXHRcdFwi6Kap55Go5ra56J+B8KSAkeeTp+O3m+eFtuaCpOaGnOOzkeeFouaBt1wiXG5cdF0sXG5cdFtcblx0XHRcImEwZTJcIixcblx0XHRcIue9sfCorK3niZDmg6nkrb7liKDjsJjwo7OH8KW7l/CnmZbwpZSx8KGlhPChi77wqaSD8Ka3nPCngq3ls4Hwpoat8Kioj/CjmbfwoIOu8KahhvCkvI7klaLlrJ/wpo2M6b2Q6bqm8KaJq1wiXG5cdF0sXG5cdFtcblx0XHRcImEzYzBcIixcblx0XHRcIuKQgFwiLFxuXHRcdDMxLFxuXHRcdFwi4pChXCJcblx0XSxcblx0W1xuXHRcdFwiYzZhMVwiLFxuXHRcdFwi4pGgXCIsXG5cdFx0OSxcblx0XHRcIuKRtFwiLFxuXHRcdDksXG5cdFx0XCLihbBcIixcblx0XHQ5LFxuXHRcdFwi5Li25Li/5LqF5Lqg5YaC5YaW5Yar5Yu55Yy45Y2p5Y625aSK5a6A5beb4ryz5bm/5bu05b2Q5b2h5pS05peg55aS55m26L616Zq2wqjLhuODveODvuOCneOCnuOAg+S7neOAheOAhuOAh+ODvO+8u++8veKcveOBgVwiLFxuXHRcdDIzXG5cdF0sXG5cdFtcblx0XHRcImM3NDBcIixcblx0XHRcIuOBmVwiLFxuXHRcdDU4LFxuXHRcdFwi44Kh44Ki44Kj44KkXCJcblx0XSxcblx0W1xuXHRcdFwiYzdhMVwiLFxuXHRcdFwi44KlXCIsXG5cdFx0ODEsXG5cdFx0XCLQkFwiLFxuXHRcdDUsXG5cdFx0XCLQgdCWXCIsXG5cdFx0NFxuXHRdLFxuXHRbXG5cdFx0XCJjODQwXCIsXG5cdFx0XCLQm1wiLFxuXHRcdDI2LFxuXHRcdFwi0ZHQtlwiLFxuXHRcdDI1LFxuXHRcdFwi4oen4oa44oa544eP8KCDjOS5mvCggorliILkkpFcIlxuXHRdLFxuXHRbXG5cdFx0XCJjOGExXCIsXG5cdFx0XCLpvrDlhojpvrHwp5iHXCJcblx0XSxcblx0W1xuXHRcdFwiYzhjZFwiLFxuXHRcdFwi77+i77+k77yH77yC44ix4oSW4oSh44Kb44Kc4rqA4rqE4rqG4rqH4rqI4rqK4rqM4rqN4rqV4rqc4rqd4rql4rqn4rqq4rqs4rqu4rq24rq84rq+4ruG4ruK4ruM4ruN4ruP4ruW4ruX4rue4rujXCJcblx0XSxcblx0W1xuXHRcdFwiYzhmNVwiLFxuXHRcdFwiyoPJkMmbyZTJtcWTw7jFi8qKyapcIlxuXHRdLFxuXHRbXG5cdFx0XCJmOWZlXCIsXG5cdFx0XCLvv61cIlxuXHRdLFxuXHRbXG5cdFx0XCJmYTQwXCIsXG5cdFx0XCLwoJWH6Yub8KCXn/Cjv4XolYzkirXnj6/lhrXjmYnwpKWC8KinpOmNhPChp5voi67wo7OI56C85p2E5ouf8KSks/CopqrwoIqg8Kaus/ChjIXkvqvwopOt5YCI8Ka0qfCnqoTwo5iA8KSqsfCilJPlgKnwoI2+5b6k8KCOgPCgjYfmu5vwoJCf5YG95YSB45G65YSO6aGs452D6JCW8KSmpPCgkoflhaDwo4605YWq8KCvv/Cig7zwoIul8KKUsPCglo7wo4iz8KGmg+WuguidvfCglrPwo7KZ5Yay5Ya4XCJcblx0XSxcblx0W1xuXHRcdFwiZmFhMVwiLFxuXHRcdFwi6bS05YeJ5YeP5YeR47Oc5YeT8KSqpuWGs+WHouWNguWHreiPjeakvvCjnK3lvbvliIvliKbliLzlirXliZflipTlirnli4XnsJXolYLli6DomI3wpqyT5YyF8KirnuWViea7mfCjvoDwoKWU8KO/rOWMs+WNhPCgr6Lms4vwoZym5qCb54+V5oGK47qq46OM8KGbqOeHneSSouWNreWNtPComqvljb7ljb/woZaW8KGYk+efpuWOk/CoqpvljqDljqvljq7njqfwpZ2y472Z546c5Y+B5Y+F5rGJ5LmJ5Z++5Y+Z46qr8KCuj+WPoPCjv6vworaj5Y+28KCxt+WQk+eBueWUq+aZl+a1m+WRrfCmrZPwoLW05ZWd5ZKP5ZKk5J6m8KGcjfCgu53jtrTwoLWNXCJcblx0XSxcblx0W1xuXHRcdFwiZmI0MFwiLFxuXHRcdFwi8KimvPCimpjllYfks63lkK/nkJfllobllqnlmIXwoaOX8KSAuuSVkvCkkLXmmrPwoYK05Zi35puN8KOKiuaapOaareWZjeWZj+ejseWbsemeh+WPvuWcgOWbr+WbrfCorabjmKPwoYmP5Z2G8KSGpeaxrueCi+WdguOasfCmsb7ln6bwoZCW5aCD8KGRlPCkjaPloKbwpK+15aGc5aKq45Wh5aOg5aOc8KGIvOWju+Wvv+Wdg/CqhZDwpIm46Y+T45ah5aSf5qKm45uD5rmZXCJcblx0XSxcblx0W1xuXHRcdFwiZmJhMVwiLFxuXHRcdFwi8KGYvuWopOWVk/ChmpLolIXlp4nwoLWO8KaygfCmtKrwoZ+c5aeZ8KGfu/ChnrLwpram5rWx8KGgqPChm5Xlp7nwprmF5aqr5amj45um8KSmqeWpt+OciOWqlueRpeWrk/CmvqHwopWU47aF8KGkkeOcsvChmrjluoPli5Dlrbbmlojlrbzwp6iO5ICE5KGd8KCIhOWvleaFoPChqLTwpaeM8KCWpeWvs+WuneS0kOWwhfChrYTlsJPnj47lsJTwobKl8KasqOWxieSjneWyheWzqeWzr+W2i/Cht7nwobi35bSQ5bSY5bWG8KG6pOWyuuW3l+iLvOOgrfCkpIHwooGJ8KKFs+iKh+OgtuOvguW4ruaqiuW5teW5uvCkkrzwoLOT5Y6m5Lq35buQ5Y6o8KGdseW4ieW7tPCokoJcIlxuXHRdLFxuXHRbXG5cdFx0XCJmYzQwXCIsXG5cdFx0XCLlu7nlu7vjoqDlu7zmoL7pkJvlvI3woIeB8K+ilOOrnuSirvChjLrlvLrwpqKI8KKPkOW9mPCikbHlvaPpnr3wprmu5b2y6Y2A8KiotuW+p+W2tuO1n/CliZDwob2q8KeDuPCimajph5bwoIqe8KioqeaAseaahfChobfjpaPjt4fjmLnlnpDwop6056Wx47mA5oKe5oKk5oKz8KSmgvCkpo/wp6mT55Kk5YOh5aqg5oWk6JCk5oWC8K+ipvCmu5LmhoHlh7TwoJmW5oaH5a6q8KO+t1wiXG5cdF0sXG5cdFtcblx0XHRcImZjYTFcIixcblx0XHRcIvCioZ/mh5PwqK6d8KmlneaHkOOksvCipoDwoqOB5oCj5oWc5pSe5o6L8KCEmOaLhfChnbDmi5XworiN5o2s8KSnn+Ool+aQuOaPuPChjo7woZ+85pKQ5r6K8KK4tumglPCkgozwpZyd5pOh5pOl6ZG746mm5pC646mX5pWN5ryW8KSoqPCkqKPmloXmla3mlZ/wo4G+5pa18KSlgOSst+aXkeSDmPChoKnml6Dml6Plv5/wo5CA5piY8KOHt/Cjh7jmmYTwo4ak8KOGpeaZi/CgubXmmafwpYem5pmz5pm08KG4vfCjiLHwqJe08KOHiPCljJPnn4XwoqO36aak5pyC8KSOnPCkqKHjrKvmp7rwo5+C5p2e5p2n5p2i8KSHjfCpg63mn5fkk6nmoKLmuZDpiLzmoIHwo4+m8Ka2oOahnVwiXG5cdF0sXG5cdFtcblx0XHRcImZkNDBcIixcblx0XHRcIvCjka/mp6HmqIvwqKuf5qWz5qOD8KOXjeakgeakgOO0suOogfCjmLzjroDmnqzmpaHwqKmK5Iu85qS25qaY466h8KCPieiNo+WCkOanufCjmZnwooSq5qmF8KOcg+aqneOvs+aeseariPCphpzjsI3mrJ3woKSj5oOe5qy15q208KKfjea6tfCjq5vwoI618KGlmOOdgOWQofCjrZrmr6Hwo7u85q+c5rC38KKSi/Cko7Hwpq2R5rGa6Iim5rG58KO2vOSThfCjtr3wpIak8KSkjPCkpIBcIlxuXHRdLFxuXHRbXG5cdFx0XCJmZGExXCIsXG5cdFx0XCLwo7OJ45ul47Or8KC0sumug/Cjh7nwopKR576P5qC38Ka0pfCmtqHwprer5raW5rWc5rm85ryE8KSlv/CkgoXwprmy6JSz8Ka9tOWHh+aynOa4neiQrvCorKHmuK/wo7iv55GT8KO+guenjOa5j+WqkfCjgYvmv7jjnI3mvp3wo7iw5ru68KGSl/CkgL3klZXpj7DmvYTmvZzjtY7mvbTwqYWw47S75r6f8KSFhOa/k/CkgpHwpIWV8KSAufCjv7Dwo7608KSEv+WHn/CkhZbwpIWX8KSFgPCmh53ngYvngb7ngqfngoHng4zng5Xng5bng5/khITjt6jnhrTnhpbwpIm354Sr54WF5aqI54WK54Wu5bKc8KSNpeeFj+mNovCki4HnhKzwpJGa8KSop/CkqKLnhrrwqK+o54K954iOXCJcblx0XSxcblx0W1xuXHRcdFwiZmU0MFwiLFxuXHRcdFwi6ZGC54iV5aSR6ZGD54ik6Y2B8KWYheeIrueJgPCkpbTmor3niZXniZfjuZXwo4GE5qCN5ry954qC54yq54yr8KSgo/CooKvko63wqKCE54yo54yu54+P546q8KCwuvCmqK7nj4nnkYnwpIei8KGbp/CkqKTmmKPjm4XwpKa38KSmjfCkp7vnj7fnkJXmpIPwpKim55C58KCXg+O7l+eRnPCioq3nkaDwqLqy55GH54+k55G26I6555Gs45yw55G06Y+x5qis55KC5KWT8KSqjFwiXG5cdF0sXG5cdFtcblx0XHRcImZlYTFcIixcblx0XHRcIvCkhZ/wpKm58Kiuj+WthvCosIPwoaKe55OI8KGmiOeUjueTqeeUnvCou5nwoamL5a+X8Ki6rOmOheeVjeeViueVp+eVrvCkvoLjvITwpLST55aO55Gd55ae55a055iC55is55mR55mP55mv55m28KaPteeakOiHr+OfuPCmpJHwpqSO55qh55ql55q355uM8Ka+n+iRovClgp3wpYW98KG4nOecnuecpuedgOaSr/CliKDnnZjwo4qs556v8KilpPCopajwoZuB55+056CJ8KGNtvCkqJLmo4rnoq/no4fno5PpmqXnpK7wpZeg56OX56S056Kx8KeYjOi+uOiihPCorKvwpoKD8KKYnOemhuikgOakguemgPCloZfnpp3wp6y556S856ap5riq8KeEpuO6qOenhvCphI3np5RcIlxuXHRdXG5dO1xuXG52YXIgYmlnNUFkZGVkJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0J2RlZmF1bHQnOiBiaWc1QWRkZWRcbn0pO1xuXG52YXIgcmVxdWlyZSQkMCA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2Uoc2hpZnRqaXMkMSk7XG5cbnZhciByZXF1aXJlJCQxID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShldWNqcCQxKTtcblxudmFyIHJlcXVpcmUkJDIgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKGNwOTM2JDEpO1xuXG52YXIgcmVxdWlyZSQkMyQxID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShnYmtBZGRlZCQxKTtcblxudmFyIHJlcXVpcmUkJDQgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKGdiMTgwMzBSYW5nZXMkMSk7XG5cbnZhciByZXF1aXJlJCQ1ID0gZ2V0Q2pzRXhwb3J0RnJvbU5hbWVzcGFjZShjcDk0OSQxKTtcblxudmFyIHJlcXVpcmUkJDYgPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKGNwOTUwJDEpO1xuXG52YXIgcmVxdWlyZSQkNyA9IGdldENqc0V4cG9ydEZyb21OYW1lc3BhY2UoYmlnNUFkZGVkJDEpO1xuXG4vLyBUYWJsZXMgYXJlIG5vdCByZXF1aXJlKCktZCB1bnRpbCB0aGV5IGFyZSBuZWVkZWQgdG8gc3BlZWQgdXAgbGlicmFyeSBsb2FkLlxuLy8gcmVxdWlyZSgpLXMgYXJlIGRpcmVjdCB0byBzdXBwb3J0IEJyb3dzZXJpZnkuXG5cblxudmFyIGRiY3NEYXRhID0ge1xuICAvLyA9PSBKYXBhbmVzZS9TaGlmdEpJUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFsbCBqYXBhbmVzZSBlbmNvZGluZ3MgYXJlIGJhc2VkIG9uIEpJUyBYIHNldCBvZiBzdGFuZGFyZHM6XG4gIC8vIEpJUyBYIDAyMDEgLSBTaW5nbGUtYnl0ZSBlbmNvZGluZyBvZiBBU0NJSSArIMKlICsgS2FuYSBjaGFycyBhdCAweEExLTB4REYuXG4gIC8vIEpJUyBYIDAyMDggLSBNYWluIHNldCBvZiA2ODc5IGNoYXJhY3RlcnMsIHBsYWNlZCBpbiA5NHg5NCBwbGFuZSwgdG8gYmUgZW5jb2RlZCBieSAyIGJ5dGVzLiBcbiAgLy8gICAgICAgICAgICAgIEhhcyBzZXZlcmFsIHZhcmlhdGlvbnMgaW4gMTk3OCwgMTk4MywgMTk5MCBhbmQgMTk5Ny5cbiAgLy8gSklTIFggMDIxMiAtIFN1cHBsZW1lbnRhcnkgcGxhbmUgb2YgNjA2NyBjaGFycyBpbiA5NHg5NCBwbGFuZS4gMTk5MC4gRWZmZWN0aXZlbHkgZGVhZC5cbiAgLy8gSklTIFggMDIxMyAtIEV4dGVuc2lvbiBhbmQgbW9kZXJuIHJlcGxhY2VtZW50IG9mIDAyMDggYW5kIDAyMTIuIFRvdGFsIGNoYXJzOiAxMTIzMy5cbiAgLy8gICAgICAgICAgICAgIDIgcGxhbmVzLCBmaXJzdCBpcyBzdXBlcnNldCBvZiAwMjA4LCBzZWNvbmQgLSByZXZpc2VkIDAyMTIuXG4gIC8vICAgICAgICAgICAgICBJbnRyb2R1Y2VkIGluIDIwMDAsIHJldmlzZWQgMjAwNC4gU29tZSBjaGFyYWN0ZXJzIGFyZSBpbiBVbmljb2RlIFBsYW5lIDIgKDB4Mnh4eHgpXG4gIC8vIEJ5dGUgZW5jb2RpbmdzIGFyZTpcbiAgLy8gICogU2hpZnRfSklTOiBDb21wYXRpYmxlIHdpdGggMDIwMSwgdXNlcyBub3QgZGVmaW5lZCBjaGFycyBpbiB0b3AgaGFsZiBhcyBsZWFkIGJ5dGVzIGZvciBkb3VibGUtYnl0ZVxuICAvLyAgICAgICAgICAgICAgIGVuY29kaW5nIG9mIDAyMDguIExlYWQgYnl0ZSByYW5nZXM6IDB4ODEtMHg5RiwgMHhFMC0weEVGOyBUcmFpbCBieXRlIHJhbmdlczogMHg0MC0weDdFLCAweDgwLTB4OUUsIDB4OUYtMHhGQy5cbiAgLy8gICAgICAgICAgICAgICBXaW5kb3dzIENQOTMyIGlzIGEgc3VwZXJzZXQgb2YgU2hpZnRfSklTLiBTb21lIGNvbXBhbmllcyBhZGRlZCBtb3JlIGNoYXJzLCBub3RhYmx5IEtEREkuXG4gIC8vICAqIEVVQy1KUDogICAgVXAgdG8gMyBieXRlcyBwZXIgY2hhcmFjdGVyLiBVc2VkIG1vc3RseSBvbiAqbml4ZXMuXG4gIC8vICAgICAgICAgICAgICAgMHgwMC0weDdGICAgICAgIC0gbG93ZXIgcGFydCBvZiAwMjAxXG4gIC8vICAgICAgICAgICAgICAgMHg4RSwgMHhBMS0weERGIC0gdXBwZXIgcGFydCBvZiAwMjAxXG4gIC8vICAgICAgICAgICAgICAgKDB4QTEtMHhGRSl4MiAgIC0gMDIwOCBwbGFuZSAoOTR4OTQpLlxuICAvLyAgICAgICAgICAgICAgIDB4OEYsICgweEExLTB4RkUpeDIgLSAwMjEyIHBsYW5lICg5NHg5NCkuXG4gIC8vICAqIEpJUyBYIDIwODogNy1iaXQsIGRpcmVjdCBlbmNvZGluZyBvZiAwMjA4LiBCeXRlIHJhbmdlczogMHgyMS0weDdFICg5NCB2YWx1ZXMpLiBVbmNvbW1vbi5cbiAgLy8gICAgICAgICAgICAgICBVc2VkIGFzLWlzIGluIElTTzIwMjIgZmFtaWx5LlxuICAvLyAgKiBJU08yMDIyLUpQOiBTdGF0ZWZ1bCBlbmNvZGluZywgd2l0aCBlc2NhcGUgc2VxdWVuY2VzIHRvIHN3aXRjaCBiZXR3ZWVuIEFTQ0lJLCBcbiAgLy8gICAgICAgICAgICAgICAgMDIwMS0xOTc2IFJvbWFuLCAwMjA4LTE5NzgsIDAyMDgtMTk4My5cbiAgLy8gICogSVNPMjAyMi1KUC0xOiBBZGRzIGVzYyBzZXEgZm9yIDAyMTItMTk5MC5cbiAgLy8gICogSVNPMjAyMi1KUC0yOiBBZGRzIGVzYyBzZXEgZm9yIEdCMjMxMy0xOTgwLCBLU1gxMDAxLTE5OTIsIElTTzg4NTktMSwgSVNPODg1OS03LlxuICAvLyAgKiBJU08yMDIyLUpQLTM6IEFkZHMgZXNjIHNlcSBmb3IgMDIwMS0xOTc2IEthbmEgc2V0LCAwMjEzLTIwMDAgUGxhbmVzIDEsIDIuXG4gIC8vICAqIElTTzIwMjItSlAtMjAwNDogQWRkcyAwMjEzLTIwMDQgUGxhbmUgMS5cbiAgLy9cbiAgLy8gQWZ0ZXIgSklTIFggMDIxMyBhcHBlYXJlZCwgU2hpZnRfSklTLTIwMDQsIEVVQy1KSVNYMDIxMyBhbmQgSVNPMjAyMi1KUC0yMDA0IGZvbGxvd2VkLCB3aXRoIGp1c3QgY2hhbmdpbmcgdGhlIHBsYW5lcy5cbiAgLy9cbiAgLy8gT3ZlcmFsbCwgaXQgc2VlbXMgdGhhdCBpdCdzIGEgbWVzcyA6KCBodHRwOi8vd3d3OC5wbGFsYS5vci5qcC90a3Vib3RhMS91bmljb2RlLXN5bWJvbHMtbWFwMi5odG1sXG4gICdzaGlmdGppcyc6IHtcbiAgICB0eXBlOiAnX2RiY3MnLFxuICAgIHRhYmxlOiBmdW5jdGlvbiB0YWJsZSgpIHtcbiAgICAgIHJldHVybiByZXF1aXJlJCQwO1xuICAgIH0sXG4gICAgZW5jb2RlQWRkOiB7XG4gICAgICBcIlxceEE1XCI6IDB4NUMsXG4gICAgICBcIlxcdTIwM0VcIjogMHg3RVxuICAgIH0sXG4gICAgZW5jb2RlU2tpcFZhbHM6IFt7XG4gICAgICBmcm9tOiAweEVENDAsXG4gICAgICB0bzogMHhGOTQwXG4gICAgfV1cbiAgfSxcbiAgJ2Nzc2hpZnRqaXMnOiAnc2hpZnRqaXMnLFxuICAnbXNrYW5qaSc6ICdzaGlmdGppcycsXG4gICdzamlzJzogJ3NoaWZ0amlzJyxcbiAgJ3dpbmRvd3MzMWonOiAnc2hpZnRqaXMnLFxuICAnbXMzMWonOiAnc2hpZnRqaXMnLFxuICAneHNqaXMnOiAnc2hpZnRqaXMnLFxuICAnd2luZG93czkzMic6ICdzaGlmdGppcycsXG4gICdtczkzMic6ICdzaGlmdGppcycsXG4gICc5MzInOiAnc2hpZnRqaXMnLFxuICAnY3A5MzInOiAnc2hpZnRqaXMnLFxuICAnZXVjanAnOiB7XG4gICAgdHlwZTogJ19kYmNzJyxcbiAgICB0YWJsZTogZnVuY3Rpb24gdGFibGUoKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZSQkMTtcbiAgICB9LFxuICAgIGVuY29kZUFkZDoge1xuICAgICAgXCJcXHhBNVwiOiAweDVDLFxuICAgICAgXCJcXHUyMDNFXCI6IDB4N0VcbiAgICB9XG4gIH0sXG4gIC8vIFRPRE86IEtEREkgZXh0ZW5zaW9uIHRvIFNoaWZ0X0pJU1xuICAvLyBUT0RPOiBJQk0gQ0NTSUQgOTQyID0gQ1A5MzIsIGJ1dCBGMC1GOSBjdXN0b20gY2hhcnMgYW5kIG90aGVyIGNoYXIgY2hhbmdlcy5cbiAgLy8gVE9ETzogSUJNIENDU0lEIDk0MyA9IFNoaWZ0X0pJUyA9IENQOTMyIHdpdGggb3JpZ2luYWwgU2hpZnRfSklTIGxvd2VyIDEyOCBjaGFycy5cbiAgLy8gPT0gQ2hpbmVzZS9HQksgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dCS1xuICAvLyBXZSBtb3N0bHkgaW1wbGVtZW50IFczQyByZWNvbW1lbmRhdGlvbjogaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY29kaW5nLyNnYmstZW5jb2RlclxuICAvLyBPbGRlc3QgR0IyMzEyICgxOTgxLCB+NzYwMCBjaGFycykgaXMgYSBzdWJzZXQgb2YgQ1A5MzZcbiAgJ2diMjMxMic6ICdjcDkzNicsXG4gICdnYjIzMTI4MCc6ICdjcDkzNicsXG4gICdnYjIzMTIxOTgwJzogJ2NwOTM2JyxcbiAgJ2NzZ2IyMzEyJzogJ2NwOTM2JyxcbiAgJ2NzaXNvNThnYjIzMTI4MCc6ICdjcDkzNicsXG4gICdldWNjbic6ICdjcDkzNicsXG4gIC8vIE1pY3Jvc29mdCdzIENQOTM2IGlzIGEgc3Vic2V0IGFuZCBhcHByb3hpbWF0aW9uIG9mIEdCSy5cbiAgJ3dpbmRvd3M5MzYnOiAnY3A5MzYnLFxuICAnbXM5MzYnOiAnY3A5MzYnLFxuICAnOTM2JzogJ2NwOTM2JyxcbiAgJ2NwOTM2Jzoge1xuICAgIHR5cGU6ICdfZGJjcycsXG4gICAgdGFibGU6IGZ1bmN0aW9uIHRhYmxlKCkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUkJDI7XG4gICAgfVxuICB9LFxuICAvLyBHQksgKH4yMjAwMCBjaGFycykgaXMgYW4gZXh0ZW5zaW9uIG9mIENQOTM2IHRoYXQgYWRkZWQgdXNlci1tYXBwZWQgY2hhcnMgYW5kIHNvbWUgb3RoZXIuXG4gICdnYmsnOiB7XG4gICAgdHlwZTogJ19kYmNzJyxcbiAgICB0YWJsZTogZnVuY3Rpb24gdGFibGUoKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZSQkMi5jb25jYXQocmVxdWlyZSQkMyQxKTtcbiAgICB9XG4gIH0sXG4gICd4Z2JrJzogJ2diaycsXG4gICdpc29pcjU4JzogJ2diaycsXG4gIC8vIEdCMTgwMzAgaXMgYW4gYWxnb3JpdGhtaWMgZXh0ZW5zaW9uIG9mIEdCSy5cbiAgLy8gTWFpbiBzb3VyY2U6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNvZGluZy8jZ2JrLWVuY29kZXJcbiAgLy8gaHR0cDovL2ljdS1wcm9qZWN0Lm9yZy9kb2NzL3BhcGVycy9nYjE4MDMwLmh0bWxcbiAgLy8gaHR0cDovL3NvdXJjZS5pY3UtcHJvamVjdC5vcmcvcmVwb3MvaWN1L2RhdGEvdHJ1bmsvY2hhcnNldC9kYXRhL3htbC9nYi0xODAzMC0yMDAwLnhtbFxuICAvLyBodHRwOi8vd3d3LmtobmdhaS5jb20vY2hpbmVzZS9jaGFybWFwL3RibGdiay5waHA/cGFnZT0wXG4gICdnYjE4MDMwJzoge1xuICAgIHR5cGU6ICdfZGJjcycsXG4gICAgdGFibGU6IGZ1bmN0aW9uIHRhYmxlKCkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUkJDIuY29uY2F0KHJlcXVpcmUkJDMkMSk7XG4gICAgfSxcbiAgICBnYjE4MDMwOiBmdW5jdGlvbiBnYjE4MDMwKCkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUkJDQ7XG4gICAgfSxcbiAgICBlbmNvZGVTa2lwVmFsczogWzB4ODBdLFxuICAgIGVuY29kZUFkZDoge1xuICAgICAgJ+KCrCc6IDB4QTJFM1xuICAgIH1cbiAgfSxcbiAgJ2NoaW5lc2UnOiAnZ2IxODAzMCcsXG4gIC8vID09IEtvcmVhbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRVVDLUtSLCBLU19DXzU2MDEgYW5kIEtTIFggMTAwMSBhcmUgZXhhY3RseSB0aGUgc2FtZS5cbiAgJ3dpbmRvd3M5NDknOiAnY3A5NDknLFxuICAnbXM5NDknOiAnY3A5NDknLFxuICAnOTQ5JzogJ2NwOTQ5JyxcbiAgJ2NwOTQ5Jzoge1xuICAgIHR5cGU6ICdfZGJjcycsXG4gICAgdGFibGU6IGZ1bmN0aW9uIHRhYmxlKCkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUkJDU7XG4gICAgfVxuICB9LFxuICAnY3NldWNrcic6ICdjcDk0OScsXG4gICdjc2tzYzU2MDExOTg3JzogJ2NwOTQ5JyxcbiAgJ2V1Y2tyJzogJ2NwOTQ5JyxcbiAgJ2lzb2lyMTQ5JzogJ2NwOTQ5JyxcbiAgJ2tvcmVhbic6ICdjcDk0OScsXG4gICdrc2M1NjAxMTk4Nyc6ICdjcDk0OScsXG4gICdrc2M1NjAxMTk4OSc6ICdjcDk0OScsXG4gICdrc2M1NjAxJzogJ2NwOTQ5JyxcbiAgLy8gPT0gQmlnNS9UYWl3YW4vSG9uZyBLb25nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUaGVyZSBhcmUgbG90cyBvZiB0YWJsZXMgZm9yIEJpZzUgYW5kIGNwOTUwLiBQbGVhc2Ugc2VlIHRoZSBmb2xsb3dpbmcgbGlua3MgZm9yIGhpc3Rvcnk6XG4gIC8vIGh0dHA6Ly9tb3p0dy5vcmcvZG9jcy9iaWc1LyAgaHR0cDovL3d3dy5oYWlibGUuZGUvYnJ1bm8vY2hhcnNldHMvY29udmVyc2lvbi10YWJsZXMvQmlnNS5odG1sXG4gIC8vIFZhcmlhdGlvbnMsIGluIHJvdWdobHkgbnVtYmVyIG9mIGRlZmluZWQgY2hhcnM6XG4gIC8vICAqIFdpbmRvd3MgQ1AgOTUwOiBNaWNyb3NvZnQgdmFyaWFudCBvZiBCaWc1LiBDYW5vbmljYWw6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A5NTAuVFhUXG4gIC8vICAqIFdpbmRvd3MgQ1AgOTUxOiBNaWNyb3NvZnQgdmFyaWFudCBvZiBCaWc1LUhLU0NTLTIwMDEuIFNlZW1zIHRvIGJlIG5ldmVyIHB1YmxpYy4gaHR0cDovL21lLmFiZWxjaGV1bmcub3JnL2FydGljbGVzL3Jlc2VhcmNoL3doYXQtaXMtY3A5NTEvXG4gIC8vICAqIEJpZzUtMjAwMyAoVGFpd2FuIHN0YW5kYXJkKSBhbG1vc3Qgc3VwZXJzZXQgb2YgY3A5NTAuXG4gIC8vICAqIFVuaWNvZGUtYXQtb24gKFVBTykgLyBNb3ppbGxhIDEuOC4gRmFsbGluZyBvdXQgb2YgdXNlIG9uIHRoZSBXZWIuIE5vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgYnJvd3NlcnMuXG4gIC8vICAqIEJpZzUtSEtTQ1MgKC0yMDAxLCAtMjAwNCwgLTIwMDgpLiBIb25nIEtvbmcgc3RhbmRhcmQuIFxuICAvLyAgICBtYW55IHVuaWNvZGUgY29kZSBwb2ludHMgbW92ZWQgZnJvbSBQVUEgdG8gU3VwcGxlbWVudGFyeSBwbGFuZSAoVSsyWFhYWCkgb3ZlciB0aGUgeWVhcnMuXG4gIC8vICAgIFBsdXMsIGl0IGhhcyA0IGNvbWJpbmluZyBzZXF1ZW5jZXMuXG4gIC8vICAgIFNlZW1zIHRoYXQgTW96aWxsYSByZWZ1c2VkIHRvIHN1cHBvcnQgaXQgZm9yIDEwIHlycy4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYyNDMxIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTMxMDI5OVxuICAvLyAgICBiZWNhdXNlIGJpZzUtaGtzY3MgaXMgdGhlIG9ubHkgZW5jb2RpbmcgdG8gaW5jbHVkZSBhc3RyYWwgY2hhcmFjdGVycyBpbiBub24tYWxnb3JpdGhtaWMgd2F5LlxuICAvLyAgICBJbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCBjb25zaXN0ZW50IHdpdGhpbiBicm93c2Vyczsgc29tZXRpbWVzIGxhYmVsZWQgYXMganVzdCBiaWc1LlxuICAvLyAgICBNUyBJbnRlcm5ldCBFeHBsb3JlciBzd2l0Y2hlcyBmcm9tIGJpZzUgdG8gYmlnNS1oa3NjcyB3aGVuIGEgcGF0Y2ggYXBwbGllZC5cbiAgLy8gICAgR3JlYXQgZGlzY3Vzc2lvbiAmIHJlY2FwIG9mIHdoYXQncyBnb2luZyBvbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD05MTI0NzAjYzMxXG4gIC8vICAgIEluIHRoZSBlbmNvZGVyLCBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIHN1cHBvcnQgZW5jb2Rpbmcgb2xkIFBVQSBtYXBwaW5ncyB0byBCaWc1IGJ5dGVzIHNlcS1zLlxuICAvLyAgICBPZmZpY2lhbCBzcGVjOiBodHRwOi8vd3d3Lm9nY2lvLmdvdi5oay9lbi9idXNpbmVzcy90ZWNoX3Byb21vdGlvbi9jY2xpL3Rlcm1zL2RvYy8yMDAzY21wXzIwMDgudHh0XG4gIC8vICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cub2djaW8uZ292LmhrL3RjL2J1c2luZXNzL3RlY2hfcHJvbW90aW9uL2NjbGkvdGVybXMvZG9jL2hrc2NzLTIwMDgtYmlnNS1pc28udHh0XG4gIC8vIFxuICAvLyBDdXJyZW50IHVuZGVyc3RhbmRpbmcgb2YgaG93IHRvIGRlYWwgd2l0aCBCaWc1KC1IS1NDUykgaXMgaW4gdGhlIEVuY29kaW5nIFN0YW5kYXJkLCBodHRwOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnLyNiaWc1LWVuY29kZXJcbiAgLy8gVW5pY29kZSBtYXBwaW5nIChodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9PQlNPTEVURS9FQVNUQVNJQS9PVEhFUi9CSUc1LlRYVCkgaXMgc2FpZCB0byBiZSB3cm9uZy5cbiAgJ3dpbmRvd3M5NTAnOiAnY3A5NTAnLFxuICAnbXM5NTAnOiAnY3A5NTAnLFxuICAnOTUwJzogJ2NwOTUwJyxcbiAgJ2NwOTUwJzoge1xuICAgIHR5cGU6ICdfZGJjcycsXG4gICAgdGFibGU6IGZ1bmN0aW9uIHRhYmxlKCkge1xuICAgICAgcmV0dXJuIHJlcXVpcmUkJDY7XG4gICAgfVxuICB9LFxuICAvLyBCaWc1IGhhcyBtYW55IHZhcmlhdGlvbnMgYW5kIGlzIGFuIGV4dGVuc2lvbiBvZiBjcDk1MC4gV2UgdXNlIEVuY29kaW5nIFN0YW5kYXJkJ3MgYXMgYSBjb25zZW5zdXMuXG4gICdiaWc1JzogJ2JpZzVoa3NjcycsXG4gICdiaWc1aGtzY3MnOiB7XG4gICAgdHlwZTogJ19kYmNzJyxcbiAgICB0YWJsZTogZnVuY3Rpb24gdGFibGUoKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZSQkNi5jb25jYXQocmVxdWlyZSQkNyk7XG4gICAgfSxcbiAgICBlbmNvZGVTa2lwVmFsczogWzB4YTJjY11cbiAgfSxcbiAgJ2NuYmlnNSc6ICdiaWc1aGtzY3MnLFxuICAnY3NiaWc1JzogJ2JpZzVoa3NjcycsXG4gICd4eGJpZzUnOiAnYmlnNWhrc2NzJ1xufTtcblxudmFyIGVuY29kaW5ncyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgLy8gV2Ugc3VwcG9ydCBCcm93c2VyaWZ5IGJ5IHNraXBwaW5nIGF1dG9tYXRpYyBtb2R1bGUgZGlzY292ZXJ5IGFuZCByZXF1aXJpbmcgbW9kdWxlcyBkaXJlY3RseS5cblxuICB2YXIgbW9kdWxlcyA9IFtpbnRlcm5hbCwgdXRmMTYsIHV0ZjcsIHNiY3NDb2RlYywgc2Jjc0RhdGEsIHNiY3NEYXRhR2VuZXJhdGVkLCBkYmNzQ29kZWMsIGRiY3NEYXRhXTsgLy8gUHV0IGFsbCBlbmNvZGluZy9hbGlhcy9jb2RlYyBkZWZpbml0aW9ucyB0byBzaW5nbGUgb2JqZWN0IGFuZCBleHBvcnQgaXQuIFxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtb2R1bGUgPSBtb2R1bGVzW2ldO1xuXG4gICAgZm9yICh2YXIgZW5jIGluIG1vZHVsZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2R1bGUsIGVuYykpIGV4cG9ydHNbZW5jXSA9IG1vZHVsZVtlbmNdO1xuICAgIH1cbiAgfVxufSk7XG5cbnZhciBCdWZmZXIkNiA9IGJ1ZmZlci5CdWZmZXIsXG4gICAgVHJhbnNmb3JtJDEgPSBTdHJlYW0uVHJhbnNmb3JtOyAvLyA9PSBFeHBvcnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG52YXIgc3RyZWFtcyA9IGZ1bmN0aW9uIHN0cmVhbXMoaWNvbnYpIHtcbiAgLy8gQWRkaXRpb25hbCBQdWJsaWMgQVBJLlxuICBpY29udi5lbmNvZGVTdHJlYW0gPSBmdW5jdGlvbiBlbmNvZGVTdHJlYW0oZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEljb252TGl0ZUVuY29kZXJTdHJlYW0oaWNvbnYuZ2V0RW5jb2RlcihlbmNvZGluZywgb3B0aW9ucyksIG9wdGlvbnMpO1xuICB9O1xuXG4gIGljb252LmRlY29kZVN0cmVhbSA9IGZ1bmN0aW9uIGRlY29kZVN0cmVhbShlbmNvZGluZywgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgSWNvbnZMaXRlRGVjb2RlclN0cmVhbShpY29udi5nZXREZWNvZGVyKGVuY29kaW5nLCBvcHRpb25zKSwgb3B0aW9ucyk7XG4gIH07XG5cbiAgaWNvbnYuc3VwcG9ydHNTdHJlYW1zID0gdHJ1ZTsgLy8gTm90IHB1Ymxpc2hlZCB5ZXQuXG5cbiAgaWNvbnYuSWNvbnZMaXRlRW5jb2RlclN0cmVhbSA9IEljb252TGl0ZUVuY29kZXJTdHJlYW07XG4gIGljb252Lkljb252TGl0ZURlY29kZXJTdHJlYW0gPSBJY29udkxpdGVEZWNvZGVyU3RyZWFtO1xuICBpY29udi5fY29sbGVjdCA9IEljb252TGl0ZURlY29kZXJTdHJlYW0ucHJvdG90eXBlLmNvbGxlY3Q7XG59OyAvLyA9PSBFbmNvZGVyIHN0cmVhbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuZnVuY3Rpb24gSWNvbnZMaXRlRW5jb2RlclN0cmVhbShjb252LCBvcHRpb25zKSB7XG4gIHRoaXMuY29udiA9IGNvbnY7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLmRlY29kZVN0cmluZ3MgPSBmYWxzZTsgLy8gV2UgYWNjZXB0IG9ubHkgc3RyaW5ncywgc28gd2UgZG9uJ3QgbmVlZCB0byBkZWNvZGUgdGhlbS5cblxuICBUcmFuc2Zvcm0kMS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5JY29udkxpdGVFbmNvZGVyU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtJDEucHJvdG90eXBlLCB7XG4gIGNvbnN0cnVjdG9yOiB7XG4gICAgdmFsdWU6IEljb252TGl0ZUVuY29kZXJTdHJlYW1cbiAgfVxufSk7XG5cbkljb252TGl0ZUVuY29kZXJTdHJlYW0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gIGlmICh0eXBlb2YgY2h1bmsgIT0gJ3N0cmluZycpIHJldHVybiBkb25lKG5ldyBFcnJvcihcIkljb252IGVuY29kaW5nIHN0cmVhbSBuZWVkcyBzdHJpbmdzIGFzIGl0cyBpbnB1dC5cIikpO1xuXG4gIHRyeSB7XG4gICAgdmFyIHJlcyA9IHRoaXMuY29udi53cml0ZShjaHVuayk7XG4gICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoKSB0aGlzLnB1c2gocmVzKTtcbiAgICBkb25lKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkb25lKGUpO1xuICB9XG59O1xuXG5JY29udkxpdGVFbmNvZGVyU3RyZWFtLnByb3RvdHlwZS5fZmx1c2ggPSBmdW5jdGlvbiAoZG9uZSkge1xuICB0cnkge1xuICAgIHZhciByZXMgPSB0aGlzLmNvbnYuZW5kKCk7XG4gICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoKSB0aGlzLnB1c2gocmVzKTtcbiAgICBkb25lKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkb25lKGUpO1xuICB9XG59O1xuXG5JY29udkxpdGVFbmNvZGVyU3RyZWFtLnByb3RvdHlwZS5jb2xsZWN0ID0gZnVuY3Rpb24gKGNiKSB7XG4gIHZhciBjaHVua3MgPSBbXTtcbiAgdGhpcy5vbignZXJyb3InLCBjYik7XG4gIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBjaHVua3MucHVzaChjaHVuayk7XG4gIH0pO1xuICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY2IobnVsbCwgQnVmZmVyJDYuY29uY2F0KGNodW5rcykpO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59OyAvLyA9PSBEZWNvZGVyIHN0cmVhbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuZnVuY3Rpb24gSWNvbnZMaXRlRGVjb2RlclN0cmVhbShjb252LCBvcHRpb25zKSB7XG4gIHRoaXMuY29udiA9IGNvbnY7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLmVuY29kaW5nID0gdGhpcy5lbmNvZGluZyA9ICd1dGY4JzsgLy8gV2Ugb3V0cHV0IHN0cmluZ3MuXG5cbiAgVHJhbnNmb3JtJDEuY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFRyYW5zZm9ybSQxLnByb3RvdHlwZSwge1xuICBjb25zdHJ1Y3Rvcjoge1xuICAgIHZhbHVlOiBJY29udkxpdGVEZWNvZGVyU3RyZWFtXG4gIH1cbn0pO1xuXG5JY29udkxpdGVEZWNvZGVyU3RyZWFtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgZG9uZSkge1xuICBpZiAoIUJ1ZmZlciQ2LmlzQnVmZmVyKGNodW5rKSkgcmV0dXJuIGRvbmUobmV3IEVycm9yKFwiSWNvbnYgZGVjb2Rpbmcgc3RyZWFtIG5lZWRzIGJ1ZmZlcnMgYXMgaXRzIGlucHV0LlwiKSk7XG5cbiAgdHJ5IHtcbiAgICB2YXIgcmVzID0gdGhpcy5jb252LndyaXRlKGNodW5rKTtcbiAgICBpZiAocmVzICYmIHJlcy5sZW5ndGgpIHRoaXMucHVzaChyZXMsIHRoaXMuZW5jb2RpbmcpO1xuICAgIGRvbmUoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRvbmUoZSk7XG4gIH1cbn07XG5cbkljb252TGl0ZURlY29kZXJTdHJlYW0ucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uIChkb25lKSB7XG4gIHRyeSB7XG4gICAgdmFyIHJlcyA9IHRoaXMuY29udi5lbmQoKTtcbiAgICBpZiAocmVzICYmIHJlcy5sZW5ndGgpIHRoaXMucHVzaChyZXMsIHRoaXMuZW5jb2RpbmcpO1xuICAgIGRvbmUoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRvbmUoZSk7XG4gIH1cbn07XG5cbkljb252TGl0ZURlY29kZXJTdHJlYW0ucHJvdG90eXBlLmNvbGxlY3QgPSBmdW5jdGlvbiAoY2IpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICB0aGlzLm9uKCdlcnJvcicsIGNiKTtcbiAgdGhpcy5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHJlcyArPSBjaHVuaztcbiAgfSk7XG4gIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjYihudWxsLCByZXMpO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG52YXIgQnVmZmVyJDcgPSBidWZmZXIuQnVmZmVyOyAvLyBOb3RlOiBub3QgcG9seWZpbGxlZCB3aXRoIHNhZmVyLWJ1ZmZlciBvbiBhIHB1cnBvc2UsIGFzIG92ZXJyaWRlcyBCdWZmZXJcbi8vID09IEV4dGVuZCBOb2RlIHByaW1pdGl2ZXMgdG8gdXNlIGljb252LWxpdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbnZhciBleHRlbmROb2RlID0gZnVuY3Rpb24gZXh0ZW5kTm9kZShpY29udikge1xuICB2YXIgb3JpZ2luYWwgPSB1bmRlZmluZWQ7IC8vIFBsYWNlIHRvIGtlZXAgb3JpZ2luYWwgbWV0aG9kcy5cbiAgLy8gTm9kZSBhdXRob3JzIHJld3JvdGUgQnVmZmVyIGludGVybmFscyB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aFxuICAvLyBVaW50OEFycmF5IGFuZCB3ZSBjYW5ub3QgcGF0Y2gga2V5IGZ1bmN0aW9ucyBzaW5jZSB0aGVuLlxuICAvLyBOb3RlOiB0aGlzIGRvZXMgdXNlIG9sZGVyIEJ1ZmZlciBBUEkgb24gYSBwdXJwb3NlXG5cbiAgaWNvbnYuc3VwcG9ydHNOb2RlRW5jb2RpbmdzRXh0ZW5zaW9uID0gIShCdWZmZXIkNy5mcm9tIHx8IG5ldyBCdWZmZXIkNygwKSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpO1xuXG4gIGljb252LmV4dGVuZE5vZGVFbmNvZGluZ3MgPSBmdW5jdGlvbiBleHRlbmROb2RlRW5jb2RpbmdzKCkge1xuICAgIGlmIChvcmlnaW5hbCkgcmV0dXJuO1xuICAgIG9yaWdpbmFsID0ge307XG5cbiAgICBpZiAoIWljb252LnN1cHBvcnRzTm9kZUVuY29kaW5nc0V4dGVuc2lvbikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkFDVElPTiBORUVERUQ6IHJlcXVpcmUoJ2ljb252LWxpdGUnKS5leHRlbmROb2RlRW5jb2RpbmdzKCkgaXMgbm90IHN1cHBvcnRlZCBpbiB5b3VyIHZlcnNpb24gb2YgTm9kZVwiKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJTZWUgbW9yZSBpbmZvIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hc2h0dWNoa2luL2ljb252LWxpdGUvd2lraS9Ob2RlLXY0LWNvbXBhdGliaWxpdHlcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5vZGVOYXRpdmVFbmNvZGluZ3MgPSB7XG4gICAgICAnaGV4JzogdHJ1ZSxcbiAgICAgICd1dGY4JzogdHJ1ZSxcbiAgICAgICd1dGYtOCc6IHRydWUsXG4gICAgICAnYXNjaWknOiB0cnVlLFxuICAgICAgJ2JpbmFyeSc6IHRydWUsXG4gICAgICAnYmFzZTY0JzogdHJ1ZSxcbiAgICAgICd1Y3MyJzogdHJ1ZSxcbiAgICAgICd1Y3MtMic6IHRydWUsXG4gICAgICAndXRmMTZsZSc6IHRydWUsXG4gICAgICAndXRmLTE2bGUnOiB0cnVlXG4gICAgfTtcblxuICAgIEJ1ZmZlciQ3LmlzTmF0aXZlRW5jb2RpbmcgPSBmdW5jdGlvbiAoZW5jKSB7XG4gICAgICByZXR1cm4gZW5jICYmIG5vZGVOYXRpdmVFbmNvZGluZ3NbZW5jLnRvTG93ZXJDYXNlKCldO1xuICAgIH07IC8vIC0tIFNsb3dCdWZmZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4gICAgdmFyIFNsb3dCdWZmZXIgPSBidWZmZXIuU2xvd0J1ZmZlcjtcbiAgICBvcmlnaW5hbC5TbG93QnVmZmVyVG9TdHJpbmcgPSBTbG93QnVmZmVyLnByb3RvdHlwZS50b1N0cmluZztcblxuICAgIFNsb3dCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7IC8vIFVzZSBuYXRpdmUgY29udmVyc2lvbiB3aGVuIHBvc3NpYmxlXG5cbiAgICAgIGlmIChCdWZmZXIkNy5pc05hdGl2ZUVuY29kaW5nKGVuY29kaW5nKSkgcmV0dXJuIG9yaWdpbmFsLlNsb3dCdWZmZXJUb1N0cmluZy5jYWxsKHRoaXMsIGVuY29kaW5nLCBzdGFydCwgZW5kKTsgLy8gT3RoZXJ3aXNlLCB1c2Ugb3VyIGRlY29kaW5nIG1ldGhvZC5cblxuICAgICAgaWYgKHR5cGVvZiBzdGFydCA9PSAndW5kZWZpbmVkJykgc3RhcnQgPSAwO1xuICAgICAgaWYgKHR5cGVvZiBlbmQgPT0gJ3VuZGVmaW5lZCcpIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIGljb252LmRlY29kZSh0aGlzLnNsaWNlKHN0YXJ0LCBlbmQpLCBlbmNvZGluZyk7XG4gICAgfTtcblxuICAgIG9yaWdpbmFsLlNsb3dCdWZmZXJXcml0ZSA9IFNsb3dCdWZmZXIucHJvdG90eXBlLndyaXRlO1xuXG4gICAgU2xvd0J1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgICAgIC8vIFN1cHBvcnQgYm90aCAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpXG4gICAgICAvLyBhbmQgdGhlIGxlZ2FjeSAoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpXG4gICAgICBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgICAgICBpZiAoIWlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgICBlbmNvZGluZyA9IGxlbmd0aDtcbiAgICAgICAgICBsZW5ndGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGxlZ2FjeVxuICAgICAgICB2YXIgc3dhcCA9IGVuY29kaW5nO1xuICAgICAgICBlbmNvZGluZyA9IG9mZnNldDtcbiAgICAgICAgb2Zmc2V0ID0gbGVuZ3RoO1xuICAgICAgICBsZW5ndGggPSBzd2FwO1xuICAgICAgfVxuXG4gICAgICBvZmZzZXQgPSArb2Zmc2V0IHx8IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXQ7XG5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlbmd0aCA9ICtsZW5ndGg7XG5cbiAgICAgICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7IC8vIFVzZSBuYXRpdmUgY29udmVyc2lvbiB3aGVuIHBvc3NpYmxlXG5cbiAgICAgIGlmIChCdWZmZXIkNy5pc05hdGl2ZUVuY29kaW5nKGVuY29kaW5nKSkgcmV0dXJuIG9yaWdpbmFsLlNsb3dCdWZmZXJXcml0ZS5jYWxsKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKTtcbiAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2F0dGVtcHQgdG8gd3JpdGUgYmV5b25kIGJ1ZmZlciBib3VuZHMnKTsgLy8gT3RoZXJ3aXNlLCB1c2Ugb3VyIGVuY29kaW5nIG1ldGhvZC5cblxuICAgICAgdmFyIGJ1ZiA9IGljb252LmVuY29kZShzdHJpbmcsIGVuY29kaW5nKTtcbiAgICAgIGlmIChidWYubGVuZ3RoIDwgbGVuZ3RoKSBsZW5ndGggPSBidWYubGVuZ3RoO1xuICAgICAgYnVmLmNvcHkodGhpcywgb2Zmc2V0LCAwLCBsZW5ndGgpO1xuICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9OyAvLyAtLSBCdWZmZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgIG9yaWdpbmFsLkJ1ZmZlcklzRW5jb2RpbmcgPSBCdWZmZXIkNy5pc0VuY29kaW5nO1xuXG4gICAgQnVmZmVyJDcuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmNvZGluZykge1xuICAgICAgcmV0dXJuIEJ1ZmZlciQ3LmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpIHx8IGljb252LmVuY29kaW5nRXhpc3RzKGVuY29kaW5nKTtcbiAgICB9O1xuXG4gICAgb3JpZ2luYWwuQnVmZmVyQnl0ZUxlbmd0aCA9IEJ1ZmZlciQ3LmJ5dGVMZW5ndGg7XG5cbiAgICBCdWZmZXIkNy5ieXRlTGVuZ3RoID0gU2xvd0J1ZmZlci5ieXRlTGVuZ3RoID0gZnVuY3Rpb24gKHN0ciwgZW5jb2RpbmcpIHtcbiAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKTsgLy8gVXNlIG5hdGl2ZSBjb252ZXJzaW9uIHdoZW4gcG9zc2libGVcblxuICAgICAgaWYgKEJ1ZmZlciQ3LmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpKSByZXR1cm4gb3JpZ2luYWwuQnVmZmVyQnl0ZUxlbmd0aC5jYWxsKHRoaXMsIHN0ciwgZW5jb2RpbmcpOyAvLyBTbG93LCBJIGtub3csIGJ1dCB3ZSBkb24ndCBoYXZlIGEgYmV0dGVyIHdheSB5ZXQuXG5cbiAgICAgIHJldHVybiBpY29udi5lbmNvZGUoc3RyLCBlbmNvZGluZykubGVuZ3RoO1xuICAgIH07XG5cbiAgICBvcmlnaW5hbC5CdWZmZXJUb1N0cmluZyA9IEJ1ZmZlciQ3LnByb3RvdHlwZS50b1N0cmluZztcblxuICAgIEJ1ZmZlciQ3LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICAgICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpOyAvLyBVc2UgbmF0aXZlIGNvbnZlcnNpb24gd2hlbiBwb3NzaWJsZVxuXG4gICAgICBpZiAoQnVmZmVyJDcuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykpIHJldHVybiBvcmlnaW5hbC5CdWZmZXJUb1N0cmluZy5jYWxsKHRoaXMsIGVuY29kaW5nLCBzdGFydCwgZW5kKTsgLy8gT3RoZXJ3aXNlLCB1c2Ugb3VyIGRlY29kaW5nIG1ldGhvZC5cblxuICAgICAgaWYgKHR5cGVvZiBzdGFydCA9PSAndW5kZWZpbmVkJykgc3RhcnQgPSAwO1xuICAgICAgaWYgKHR5cGVvZiBlbmQgPT0gJ3VuZGVmaW5lZCcpIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIGljb252LmRlY29kZSh0aGlzLnNsaWNlKHN0YXJ0LCBlbmQpLCBlbmNvZGluZyk7XG4gICAgfTtcblxuICAgIG9yaWdpbmFsLkJ1ZmZlcldyaXRlID0gQnVmZmVyJDcucHJvdG90eXBlLndyaXRlO1xuXG4gICAgQnVmZmVyJDcucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gICAgICB2YXIgX29mZnNldCA9IG9mZnNldCxcbiAgICAgICAgICBfbGVuZ3RoID0gbGVuZ3RoLFxuICAgICAgICAgIF9lbmNvZGluZyA9IGVuY29kaW5nOyAvLyBTdXBwb3J0IGJvdGggKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKVxuICAgICAgLy8gYW5kIHRoZSBsZWdhY3kgKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgICAgICBpZiAoIWlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgICBlbmNvZGluZyA9IGxlbmd0aDtcbiAgICAgICAgICBsZW5ndGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGxlZ2FjeVxuICAgICAgICB2YXIgc3dhcCA9IGVuY29kaW5nO1xuICAgICAgICBlbmNvZGluZyA9IG9mZnNldDtcbiAgICAgICAgb2Zmc2V0ID0gbGVuZ3RoO1xuICAgICAgICBsZW5ndGggPSBzd2FwO1xuICAgICAgfVxuXG4gICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7IC8vIFVzZSBuYXRpdmUgY29udmVyc2lvbiB3aGVuIHBvc3NpYmxlXG5cbiAgICAgIGlmIChCdWZmZXIkNy5pc05hdGl2ZUVuY29kaW5nKGVuY29kaW5nKSkgcmV0dXJuIG9yaWdpbmFsLkJ1ZmZlcldyaXRlLmNhbGwodGhpcywgc3RyaW5nLCBfb2Zmc2V0LCBfbGVuZ3RoLCBfZW5jb2RpbmcpO1xuICAgICAgb2Zmc2V0ID0gK29mZnNldCB8fCAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0O1xuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZW5ndGggPSArbGVuZ3RoO1xuXG4gICAgICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXR0ZW1wdCB0byB3cml0ZSBiZXlvbmQgYnVmZmVyIGJvdW5kcycpOyAvLyBPdGhlcndpc2UsIHVzZSBvdXIgZW5jb2RpbmcgbWV0aG9kLlxuXG4gICAgICB2YXIgYnVmID0gaWNvbnYuZW5jb2RlKHN0cmluZywgZW5jb2RpbmcpO1xuICAgICAgaWYgKGJ1Zi5sZW5ndGggPCBsZW5ndGgpIGxlbmd0aCA9IGJ1Zi5sZW5ndGg7XG4gICAgICBidWYuY29weSh0aGlzLCBvZmZzZXQsIDAsIGxlbmd0aCk7XG4gICAgICByZXR1cm4gbGVuZ3RoOyAvLyBUT0RPOiBTZXQgX2NoYXJzV3JpdHRlbi5cbiAgICB9OyAvLyAtLSBSZWFkYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgIGlmIChpY29udi5zdXBwb3J0c1N0cmVhbXMpIHtcbiAgICAgIHZhciBSZWFkYWJsZSA9IFN0cmVhbS5SZWFkYWJsZTtcbiAgICAgIG9yaWdpbmFsLlJlYWRhYmxlU2V0RW5jb2RpbmcgPSBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc7XG5cbiAgICAgIFJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldEVuY29kaW5nKGVuYywgb3B0aW9ucykge1xuICAgICAgICAvLyBVc2Ugb3VyIG93biBkZWNvZGVyLCBpdCBoYXMgdGhlIHNhbWUgaW50ZXJmYWNlLlxuICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIG9yaWdpbmFsIGZ1bmN0aW9uIGFzIGl0IGRvZXNuJ3QgaGFuZGxlIEJPTS1zLlxuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBpY29udi5nZXREZWNvZGVyKGVuYywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSBlbmM7XG4gICAgICB9O1xuXG4gICAgICBSZWFkYWJsZS5wcm90b3R5cGUuY29sbGVjdCA9IGljb252Ll9jb2xsZWN0O1xuICAgIH1cbiAgfTsgLy8gUmVtb3ZlIGljb252LWxpdGUgTm9kZSBwcmltaXRpdmUgZXh0ZW5zaW9ucy5cblxuXG4gIGljb252LnVuZG9FeHRlbmROb2RlRW5jb2RpbmdzID0gZnVuY3Rpb24gdW5kb0V4dGVuZE5vZGVFbmNvZGluZ3MoKSB7XG4gICAgaWYgKCFpY29udi5zdXBwb3J0c05vZGVFbmNvZGluZ3NFeHRlbnNpb24pIHJldHVybjtcbiAgICBpZiAoIW9yaWdpbmFsKSB0aHJvdyBuZXcgRXJyb3IoXCJyZXF1aXJlKCdpY29udi1saXRlJykudW5kb0V4dGVuZE5vZGVFbmNvZGluZ3MoKTogTm90aGluZyB0byB1bmRvOyBleHRlbmROb2RlRW5jb2RpbmdzKCkgaXMgbm90IGNhbGxlZC5cIik7XG4gICAgZGVsZXRlIEJ1ZmZlciQ3LmlzTmF0aXZlRW5jb2Rpbmc7XG4gICAgdmFyIFNsb3dCdWZmZXIgPSBidWZmZXIuU2xvd0J1ZmZlcjtcbiAgICBTbG93QnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IG9yaWdpbmFsLlNsb3dCdWZmZXJUb1N0cmluZztcbiAgICBTbG93QnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IG9yaWdpbmFsLlNsb3dCdWZmZXJXcml0ZTtcbiAgICBCdWZmZXIkNy5pc0VuY29kaW5nID0gb3JpZ2luYWwuQnVmZmVySXNFbmNvZGluZztcbiAgICBCdWZmZXIkNy5ieXRlTGVuZ3RoID0gb3JpZ2luYWwuQnVmZmVyQnl0ZUxlbmd0aDtcbiAgICBCdWZmZXIkNy5wcm90b3R5cGUudG9TdHJpbmcgPSBvcmlnaW5hbC5CdWZmZXJUb1N0cmluZztcbiAgICBCdWZmZXIkNy5wcm90b3R5cGUud3JpdGUgPSBvcmlnaW5hbC5CdWZmZXJXcml0ZTtcblxuICAgIGlmIChpY29udi5zdXBwb3J0c1N0cmVhbXMpIHtcbiAgICAgIHZhciBSZWFkYWJsZSA9IFN0cmVhbS5SZWFkYWJsZTtcbiAgICAgIFJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IG9yaWdpbmFsLlJlYWRhYmxlU2V0RW5jb2Rpbmc7XG4gICAgICBkZWxldGUgUmVhZGFibGUucHJvdG90eXBlLmNvbGxlY3Q7XG4gICAgfVxuXG4gICAgb3JpZ2luYWwgPSB1bmRlZmluZWQ7XG4gIH07XG59O1xuXG52YXIgbGliID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBTb2x1dGlvbiB3b3VsZCBiZSBpbnN0YWxsaW5nIG5wbSBtb2R1bGVzIFwiYnVmZmVyXCIgYW5kIFwic3RyZWFtXCIgZXhwbGljaXRseS5cblxuICB2YXIgQnVmZmVyID0gc2FmZXJfMS5CdWZmZXI7XG4gIHZhciBpY29udiA9IG1vZHVsZS5leHBvcnRzOyAvLyBBbGwgY29kZWNzIGFuZCBhbGlhc2VzIGFyZSBrZXB0IGhlcmUsIGtleWVkIGJ5IGVuY29kaW5nIG5hbWUvYWxpYXMuXG4gIC8vIFRoZXkgYXJlIGxhenkgbG9hZGVkIGluIGBpY29udi5nZXRDb2RlY2AgZnJvbSBgZW5jb2RpbmdzL2luZGV4LmpzYC5cblxuICBpY29udi5lbmNvZGluZ3MgPSBudWxsOyAvLyBDaGFyYWN0ZXJzIGVtaXR0ZWQgaW4gY2FzZSBvZiBlcnJvci5cblxuICBpY29udi5kZWZhdWx0Q2hhclVuaWNvZGUgPSAn77+9JztcbiAgaWNvbnYuZGVmYXVsdENoYXJTaW5nbGVCeXRlID0gJz8nOyAvLyBQdWJsaWMgQVBJLlxuXG4gIGljb252LmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIsIGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgc3RyID0gXCJcIiArIChzdHIgfHwgXCJcIik7IC8vIEVuc3VyZSBzdHJpbmcuXG5cbiAgICB2YXIgZW5jb2RlciA9IGljb252LmdldEVuY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpO1xuICAgIHZhciByZXMgPSBlbmNvZGVyLndyaXRlKHN0cik7XG4gICAgdmFyIHRyYWlsID0gZW5jb2Rlci5lbmQoKTtcbiAgICByZXR1cm4gdHJhaWwgJiYgdHJhaWwubGVuZ3RoID4gMCA/IEJ1ZmZlci5jb25jYXQoW3JlcywgdHJhaWxdKSA6IHJlcztcbiAgfTtcblxuICBpY29udi5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoYnVmLCBlbmNvZGluZywgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgYnVmID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKCFpY29udi5za2lwRGVjb2RlV2FybmluZykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdJY29udi1saXRlIHdhcm5pbmc6IGRlY29kZSgpLWluZyBzdHJpbmdzIGlzIGRlcHJlY2F0ZWQuIFJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2h0dWNoa2luL2ljb252LWxpdGUvd2lraS9Vc2UtQnVmZmVycy13aGVuLWRlY29kaW5nJyk7XG4gICAgICAgIGljb252LnNraXBEZWNvZGVXYXJuaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgYnVmID0gQnVmZmVyLmZyb20oXCJcIiArIChidWYgfHwgXCJcIiksIFwiYmluYXJ5XCIpOyAvLyBFbnN1cmUgYnVmZmVyLlxuICAgIH1cblxuICAgIHZhciBkZWNvZGVyID0gaWNvbnYuZ2V0RGVjb2RlcihlbmNvZGluZywgb3B0aW9ucyk7XG4gICAgdmFyIHJlcyA9IGRlY29kZXIud3JpdGUoYnVmKTtcbiAgICB2YXIgdHJhaWwgPSBkZWNvZGVyLmVuZCgpO1xuICAgIHJldHVybiB0cmFpbCA/IHJlcyArIHRyYWlsIDogcmVzO1xuICB9O1xuXG4gIGljb252LmVuY29kaW5nRXhpc3RzID0gZnVuY3Rpb24gZW5jb2RpbmdFeGlzdHMoZW5jKSB7XG4gICAgdHJ5IHtcbiAgICAgIGljb252LmdldENvZGVjKGVuYyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9OyAvLyBMZWdhY3kgYWxpYXNlcyB0byBjb252ZXJ0IGZ1bmN0aW9uc1xuXG5cbiAgaWNvbnYudG9FbmNvZGluZyA9IGljb252LmVuY29kZTtcbiAgaWNvbnYuZnJvbUVuY29kaW5nID0gaWNvbnYuZGVjb2RlOyAvLyBTZWFyY2ggZm9yIGEgY29kZWMgaW4gaWNvbnYuZW5jb2RpbmdzLiBDYWNoZSBjb2RlYyBkYXRhIGluIGljb252Ll9jb2RlY0RhdGFDYWNoZS5cblxuICBpY29udi5fY29kZWNEYXRhQ2FjaGUgPSB7fTtcblxuICBpY29udi5nZXRDb2RlYyA9IGZ1bmN0aW9uIGdldENvZGVjKGVuY29kaW5nKSB7XG4gICAgaWYgKCFpY29udi5lbmNvZGluZ3MpIGljb252LmVuY29kaW5ncyA9IGVuY29kaW5nczsgLy8gTGF6eSBsb2FkIGFsbCBlbmNvZGluZyBkZWZpbml0aW9ucy5cbiAgICAvLyBDYW5vbmljYWxpemUgZW5jb2RpbmcgbmFtZTogc3RyaXAgYWxsIG5vbi1hbHBoYW51bWVyaWMgY2hhcnMgYW5kIGFwcGVuZGVkIHllYXIuXG5cbiAgICB2YXIgZW5jID0gaWNvbnYuX2Nhbm9uaWNhbGl6ZUVuY29kaW5nKGVuY29kaW5nKTsgLy8gVHJhdmVyc2UgaWNvbnYuZW5jb2RpbmdzIHRvIGZpbmQgYWN0dWFsIGNvZGVjLlxuXG5cbiAgICB2YXIgY29kZWNPcHRpb25zID0ge307XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdmFyIGNvZGVjID0gaWNvbnYuX2NvZGVjRGF0YUNhY2hlW2VuY107XG4gICAgICBpZiAoY29kZWMpIHJldHVybiBjb2RlYztcbiAgICAgIHZhciBjb2RlY0RlZiA9IGljb252LmVuY29kaW5nc1tlbmNdO1xuXG4gICAgICBzd2l0Y2ggKHR5cGVvZiBjb2RlY0RlZikge1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgLy8gRGlyZWN0IGFsaWFzIHRvIG90aGVyIGVuY29kaW5nLlxuICAgICAgICAgIGVuYyA9IGNvZGVjRGVmO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAvLyBBbGlhcyB3aXRoIG9wdGlvbnMuIENhbiBiZSBsYXllcmVkLlxuICAgICAgICAgIGZvciAodmFyIGtleSBpbiBjb2RlY0RlZikge1xuICAgICAgICAgICAgY29kZWNPcHRpb25zW2tleV0gPSBjb2RlY0RlZltrZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSkgY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSA9IGVuYztcbiAgICAgICAgICBlbmMgPSBjb2RlY0RlZi50eXBlO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgIC8vIENvZGVjIGl0c2VsZi5cbiAgICAgICAgICBpZiAoIWNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWUpIGNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWUgPSBlbmM7IC8vIFRoZSBjb2RlYyBmdW5jdGlvbiBtdXN0IGxvYWQgYWxsIHRhYmxlcyBhbmQgcmV0dXJuIG9iamVjdCB3aXRoIC5lbmNvZGVyIGFuZCAuZGVjb2RlciBtZXRob2RzLlxuICAgICAgICAgIC8vIEl0J2xsIGJlIGNhbGxlZCBvbmx5IG9uY2UgKGZvciBlYWNoIGRpZmZlcmVudCBvcHRpb25zIG9iamVjdCkuXG5cbiAgICAgICAgICBjb2RlYyA9IG5ldyBjb2RlY0RlZihjb2RlY09wdGlvbnMsIGljb252KTtcbiAgICAgICAgICBpY29udi5fY29kZWNEYXRhQ2FjaGVbY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZV0gPSBjb2RlYzsgLy8gU2F2ZSBpdCB0byBiZSByZXVzZWQgbGF0ZXIuXG5cbiAgICAgICAgICByZXR1cm4gY29kZWM7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmNvZGluZyBub3QgcmVjb2duaXplZDogJ1wiICsgZW5jb2RpbmcgKyBcIicgKHNlYXJjaGVkIGFzOiAnXCIgKyBlbmMgKyBcIicpXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBpY29udi5fY2Fub25pY2FsaXplRW5jb2RpbmcgPSBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgICAvLyBDYW5vbmljYWxpemUgZW5jb2RpbmcgbmFtZTogc3RyaXAgYWxsIG5vbi1hbHBoYW51bWVyaWMgY2hhcnMgYW5kIGFwcGVuZGVkIHllYXIuXG4gICAgcmV0dXJuICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLzpcXGR7NH0kfFteMC05YS16XS9nLCBcIlwiKTtcbiAgfTtcblxuICBpY29udi5nZXRFbmNvZGVyID0gZnVuY3Rpb24gZ2V0RW5jb2RlcihlbmNvZGluZywgb3B0aW9ucykge1xuICAgIHZhciBjb2RlYyA9IGljb252LmdldENvZGVjKGVuY29kaW5nKSxcbiAgICAgICAgZW5jb2RlciA9IG5ldyBjb2RlYy5lbmNvZGVyKG9wdGlvbnMsIGNvZGVjKTtcbiAgICBpZiAoY29kZWMuYm9tQXdhcmUgJiYgb3B0aW9ucyAmJiBvcHRpb25zLmFkZEJPTSkgZW5jb2RlciA9IG5ldyBib21IYW5kbGluZy5QcmVwZW5kQk9NKGVuY29kZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiBlbmNvZGVyO1xuICB9O1xuXG4gIGljb252LmdldERlY29kZXIgPSBmdW5jdGlvbiBnZXREZWNvZGVyKGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgdmFyIGNvZGVjID0gaWNvbnYuZ2V0Q29kZWMoZW5jb2RpbmcpLFxuICAgICAgICBkZWNvZGVyID0gbmV3IGNvZGVjLmRlY29kZXIob3B0aW9ucywgY29kZWMpO1xuICAgIGlmIChjb2RlYy5ib21Bd2FyZSAmJiAhKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpcEJPTSA9PT0gZmFsc2UpKSBkZWNvZGVyID0gbmV3IGJvbUhhbmRsaW5nLlN0cmlwQk9NKGRlY29kZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiBkZWNvZGVyO1xuICB9OyAvLyBMb2FkIGV4dGVuc2lvbnMgaW4gTm9kZS4gQWxsIG9mIHRoZW0gYXJlIG9taXR0ZWQgaW4gQnJvd3NlcmlmeSBidWlsZCB2aWEgJ2Jyb3dzZXInIGZpZWxkIGluIHBhY2thZ2UuanNvbi5cblxuXG4gIHZhciBub2RlVmVyID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlO1xuXG4gIGlmIChub2RlVmVyKSB7XG4gICAgLy8gTG9hZCBzdHJlYW1pbmcgc3VwcG9ydCBpbiBOb2RlIHYwLjEwK1xuICAgIHZhciBub2RlVmVyQXJyID0gbm9kZVZlci5zcGxpdChcIi5cIikubWFwKE51bWJlcik7XG5cbiAgICBpZiAobm9kZVZlckFyclswXSA+IDAgfHwgbm9kZVZlckFyclsxXSA+PSAxMCkge1xuICAgICAgc3RyZWFtcyhpY29udik7XG4gICAgfSAvLyBMb2FkIE5vZGUgcHJpbWl0aXZlIGV4dGVuc2lvbnMuXG5cblxuICAgIGV4dGVuZE5vZGUoaWNvbnYpO1xuICB9XG59KTtcblxudmFyIERlY29kZVN0cmVhbSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBEZWNvZGVTdHJlYW0sIGljb252O1xuXG4gICAgdHJ5IHtcbiAgICAgIGljb252ID0gbGliO1xuICAgIH0gY2F0Y2ggKF9lcnJvcikge31cblxuICAgIERlY29kZVN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBrZXk7XG5cbiAgICAgIGZ1bmN0aW9uIERlY29kZVN0cmVhbShidWZmZXIpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIERlY29kZVN0cmVhbS5UWVBFUyA9IHtcbiAgICAgICAgVUludDg6IDEsXG4gICAgICAgIFVJbnQxNjogMixcbiAgICAgICAgVUludDI0OiAzLFxuICAgICAgICBVSW50MzI6IDQsXG4gICAgICAgIEludDg6IDEsXG4gICAgICAgIEludDE2OiAyLFxuICAgICAgICBJbnQyNDogMyxcbiAgICAgICAgSW50MzI6IDQsXG4gICAgICAgIEZsb2F0OiA0LFxuICAgICAgICBEb3VibGU6IDhcbiAgICAgIH07XG5cbiAgICAgIGZvciAoa2V5IGluIGJ1ZmZlcl8xLnByb3RvdHlwZSkge1xuICAgICAgICBpZiAoa2V5LnNsaWNlKDAsIDQpID09PSAncmVhZCcpIHtcbiAgICAgICAgICAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIGJ5dGVzO1xuICAgICAgICAgICAgYnl0ZXMgPSBEZWNvZGVTdHJlYW0uVFlQRVNba2V5LnJlcGxhY2UoL3JlYWR8W0JMXUUvZywgJycpXTtcbiAgICAgICAgICAgIHJldHVybiBEZWNvZGVTdHJlYW0ucHJvdG90eXBlW2tleV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciByZXQ7XG4gICAgICAgICAgICAgIHJldCA9IHRoaXMuYnVmZmVyW2tleV0odGhpcy5wb3MpO1xuICAgICAgICAgICAgICB0aGlzLnBvcyArPSBieXRlcztcbiAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbiAobGVuZ3RoLCBlbmNvZGluZykge1xuICAgICAgICB2YXIgYnVmLCBfYnl0ZSwgaSwgX2ksIF9yZWY7XG5cbiAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHtcbiAgICAgICAgICBlbmNvZGluZyA9ICdhc2NpaSc7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAgICAgY2FzZSAndWNzMic6XG4gICAgICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnRvU3RyaW5nKGVuY29kaW5nLCB0aGlzLnBvcywgdGhpcy5wb3MgKz0gbGVuZ3RoKTtcblxuICAgICAgICAgIGNhc2UgJ3V0ZjE2YmUnOlxuICAgICAgICAgICAgYnVmID0gbmV3IGJ1ZmZlcl8xKHRoaXMucmVhZEJ1ZmZlcihsZW5ndGgpKTtcblxuICAgICAgICAgICAgZm9yIChpID0gX2kgPSAwLCBfcmVmID0gYnVmLmxlbmd0aCAtIDE7IF9pIDwgX3JlZjsgaSA9IF9pICs9IDIpIHtcbiAgICAgICAgICAgICAgX2J5dGUgPSBidWZbaV07XG4gICAgICAgICAgICAgIGJ1ZltpXSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICAgIGJ1ZltpICsgMV0gPSBfYnl0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmMTZsZScpO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJ1ZiA9IHRoaXMucmVhZEJ1ZmZlcihsZW5ndGgpO1xuXG4gICAgICAgICAgICBpZiAoaWNvbnYpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWNvbnYuZGVjb2RlKGJ1ZiwgZW5jb2RpbmcpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChfZXJyb3IpIHt9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBidWY7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUucmVhZEJ1ZmZlciA9IGZ1bmN0aW9uIChsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnNsaWNlKHRoaXMucG9zLCB0aGlzLnBvcyArPSBsZW5ndGgpO1xuICAgICAgfTtcblxuICAgICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5yZWFkVUludDI0QkUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5yZWFkVUludDE2QkUoKSA8PCA4KSArIHRoaXMucmVhZFVJbnQ4KCk7XG4gICAgICB9O1xuXG4gICAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnJlYWRVSW50MjRMRSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFVJbnQxNkxFKCkgKyAodGhpcy5yZWFkVUludDgoKSA8PCAxNik7XG4gICAgICB9O1xuXG4gICAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnJlYWRJbnQyNEJFID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucmVhZEludDE2QkUoKSA8PCA4KSArIHRoaXMucmVhZFVJbnQ4KCk7XG4gICAgICB9O1xuXG4gICAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLnJlYWRJbnQyNExFID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVUludDE2TEUoKSArICh0aGlzLnJlYWRJbnQ4KCkgPDwgMTYpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIERlY29kZVN0cmVhbTtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IERlY29kZVN0cmVhbTtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIEVuY29kZVN0cmVhbSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBEZWNvZGVTdHJlYW0kMSxcbiAgICAgICAgRW5jb2RlU3RyZWFtLFxuICAgICAgICBpY29udixcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICBfX2hhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgICAgX19leHRlbmRzID0gZnVuY3Rpb24gX19leHRlbmRzKGNoaWxkLCBwYXJlbnQpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHtcbiAgICAgICAgaWYgKF9faGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjdG9yKCkge1xuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7XG4gICAgICB9XG5cbiAgICAgIGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICAgIGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7XG4gICAgICBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlO1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICBzdHJlYW0gPSBTdHJlYW07XG4gICAgRGVjb2RlU3RyZWFtJDEgPSBEZWNvZGVTdHJlYW07XG5cbiAgICB0cnkge1xuICAgICAgaWNvbnYgPSBsaWI7XG4gICAgfSBjYXRjaCAoX2Vycm9yKSB7fVxuXG4gICAgRW5jb2RlU3RyZWFtID0gZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgdmFyIGtleTtcblxuICAgICAgX19leHRlbmRzKEVuY29kZVN0cmVhbSwgX3N1cGVyKTtcblxuICAgICAgZnVuY3Rpb24gRW5jb2RlU3RyZWFtKGJ1ZmZlclNpemUpIHtcbiAgICAgICAgaWYgKGJ1ZmZlclNpemUgPT0gbnVsbCkge1xuICAgICAgICAgIGJ1ZmZlclNpemUgPSA2NTUzNjtcbiAgICAgICAgfVxuXG4gICAgICAgIEVuY29kZVN0cmVhbS5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBidWZmZXJfMShidWZmZXJTaXplKTtcbiAgICAgICAgdGhpcy5idWZmZXJPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICB9XG5cbiAgICAgIGZvciAoa2V5IGluIGJ1ZmZlcl8xLnByb3RvdHlwZSkge1xuICAgICAgICBpZiAoa2V5LnNsaWNlKDAsIDUpID09PSAnd3JpdGUnKSB7XG4gICAgICAgICAgKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHZhciBieXRlcztcbiAgICAgICAgICAgIGJ5dGVzID0gK0RlY29kZVN0cmVhbSQxLlRZUEVTW2tleS5yZXBsYWNlKC93cml0ZXxbQkxdRS9nLCAnJyldO1xuICAgICAgICAgICAgcmV0dXJuIEVuY29kZVN0cmVhbS5wcm90b3R5cGVba2V5XSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLmVuc3VyZShieXRlcyk7XG4gICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2tleV0odmFsdWUsIHRoaXMuYnVmZmVyT2Zmc2V0KTtcbiAgICAgICAgICAgICAgdGhpcy5idWZmZXJPZmZzZXQgKz0gYnl0ZXM7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnBvcyArPSBieXRlcztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBFbmNvZGVTdHJlYW0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAgIEVuY29kZVN0cmVhbS5wcm90b3R5cGUuZW5zdXJlID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlck9mZnNldCArIGJ5dGVzID4gdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgRW5jb2RlU3RyZWFtLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyT2Zmc2V0ID4gMCkge1xuICAgICAgICAgIHRoaXMucHVzaChuZXcgYnVmZmVyXzEodGhpcy5idWZmZXIuc2xpY2UoMCwgdGhpcy5idWZmZXJPZmZzZXQpKSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyT2Zmc2V0ID0gMDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgRW5jb2RlU3RyZWFtLnByb3RvdHlwZS53cml0ZUJ1ZmZlciA9IGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB0aGlzLnB1c2goYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICB9O1xuXG4gICAgICBFbmNvZGVTdHJlYW0ucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgICAgICAgdmFyIGJ1ZiwgX2J5dGUsIGksIF9pLCBfcmVmO1xuXG4gICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSAnYXNjaWknO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlQnVmZmVyKG5ldyBidWZmZXJfMShzdHJpbmcsIGVuY29kaW5nKSk7XG5cbiAgICAgICAgICBjYXNlICd1dGYxNmJlJzpcbiAgICAgICAgICAgIGJ1ZiA9IG5ldyBidWZmZXJfMShzdHJpbmcsICd1dGYxNmxlJyk7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IF9pID0gMCwgX3JlZiA9IGJ1Zi5sZW5ndGggLSAxOyBfaSA8IF9yZWY7IGkgPSBfaSArPSAyKSB7XG4gICAgICAgICAgICAgIF9ieXRlID0gYnVmW2ldO1xuICAgICAgICAgICAgICBidWZbaV0gPSBidWZbaSArIDFdO1xuICAgICAgICAgICAgICBidWZbaSArIDFdID0gX2J5dGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlQnVmZmVyKGJ1Zik7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKGljb252KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlQnVmZmVyKGljb252LmVuY29kZShzdHJpbmcsIGVuY29kaW5nKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luc3RhbGwgaWNvbnYtbGl0ZSB0byBlbmFibGUgYWRkaXRpb25hbCBzdHJpbmcgZW5jb2RpbmdzLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIEVuY29kZVN0cmVhbS5wcm90b3R5cGUud3JpdGVVSW50MjRCRSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgdGhpcy5lbnN1cmUoMyk7XG4gICAgICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyT2Zmc2V0KytdID0gdmFsID4+PiAxNiAmIDB4ZmY7XG4gICAgICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyT2Zmc2V0KytdID0gdmFsID4+PiA4ICYgMHhmZjtcbiAgICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmZzZXQrK10gPSB2YWwgJiAweGZmO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgKz0gMztcbiAgICAgIH07XG5cbiAgICAgIEVuY29kZVN0cmVhbS5wcm90b3R5cGUud3JpdGVVSW50MjRMRSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgdGhpcy5lbnN1cmUoMyk7XG4gICAgICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyT2Zmc2V0KytdID0gdmFsICYgMHhmZjtcbiAgICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmZzZXQrK10gPSB2YWwgPj4+IDggJiAweGZmO1xuICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlck9mZnNldCsrXSA9IHZhbCA+Pj4gMTYgJiAweGZmO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgKz0gMztcbiAgICAgIH07XG5cbiAgICAgIEVuY29kZVN0cmVhbS5wcm90b3R5cGUud3JpdGVJbnQyNEJFID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICBpZiAodmFsID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZVVJbnQyNEJFKHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVVSW50MjRCRSh2YWwgKyAweGZmZmZmZiArIDEpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBFbmNvZGVTdHJlYW0ucHJvdG90eXBlLndyaXRlSW50MjRMRSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgaWYgKHZhbCA+PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVVSW50MjRMRSh2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlVUludDI0TEUodmFsICsgMHhmZmZmZmYgKyAxKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgRW5jb2RlU3RyZWFtLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gKHZhbCwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBidWY7XG5cbiAgICAgICAgaWYgKGxlbmd0aCA8IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZW5zdXJlKGxlbmd0aCk7XG4gICAgICAgICAgdGhpcy5idWZmZXIuZmlsbCh2YWwsIHRoaXMuYnVmZmVyT2Zmc2V0LCB0aGlzLmJ1ZmZlck9mZnNldCArIGxlbmd0aCk7XG4gICAgICAgICAgdGhpcy5idWZmZXJPZmZzZXQgKz0gbGVuZ3RoO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBvcyArPSBsZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVmID0gbmV3IGJ1ZmZlcl8xKGxlbmd0aCk7XG4gICAgICAgICAgYnVmLmZpbGwodmFsKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlcihidWYpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBFbmNvZGVTdHJlYW0ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5wdXNoKG51bGwpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIEVuY29kZVN0cmVhbTtcbiAgICB9KHN0cmVhbS5SZWFkYWJsZSk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IEVuY29kZVN0cmVhbTtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIF9OdW1iZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgRGVjb2RlU3RyZWFtJDEsXG4gICAgICAgIEZpeGVkLFxuICAgICAgICBOdW1iZXJULFxuICAgICAgICBfX2hhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgICAgX19leHRlbmRzID0gZnVuY3Rpb24gX19leHRlbmRzKGNoaWxkLCBwYXJlbnQpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHtcbiAgICAgICAgaWYgKF9faGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjdG9yKCkge1xuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7XG4gICAgICB9XG5cbiAgICAgIGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICAgIGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7XG4gICAgICBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlO1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG5cbiAgICBEZWNvZGVTdHJlYW0kMSA9IERlY29kZVN0cmVhbTtcblxuICAgIE51bWJlclQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBOdW1iZXJUKHR5cGUsIGVuZGlhbikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmVuZGlhbiA9IGVuZGlhbiAhPSBudWxsID8gZW5kaWFuIDogJ0JFJztcbiAgICAgICAgdGhpcy5mbiA9IHRoaXMudHlwZTtcblxuICAgICAgICBpZiAodGhpcy50eXBlW3RoaXMudHlwZS5sZW5ndGggLSAxXSAhPT0gJzgnKSB7XG4gICAgICAgICAgdGhpcy5mbiArPSB0aGlzLmVuZGlhbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBOdW1iZXJULnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRGVjb2RlU3RyZWFtJDEuVFlQRVNbdGhpcy50eXBlXTtcbiAgICAgIH07XG5cbiAgICAgIE51bWJlclQucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICAgICAgcmV0dXJuIHN0cmVhbVsncmVhZCcgKyB0aGlzLmZuXSgpO1xuICAgICAgfTtcblxuICAgICAgTnVtYmVyVC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgdmFsKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW1bJ3dyaXRlJyArIHRoaXMuZm5dKHZhbCk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gTnVtYmVyVDtcbiAgICB9KCk7XG5cbiAgICBleHBvcnRzLk51bWJlciA9IE51bWJlclQ7XG4gICAgZXhwb3J0cy51aW50OCA9IG5ldyBOdW1iZXJUKCdVSW50OCcpO1xuICAgIGV4cG9ydHMudWludDE2YmUgPSBleHBvcnRzLnVpbnQxNiA9IG5ldyBOdW1iZXJUKCdVSW50MTYnLCAnQkUnKTtcbiAgICBleHBvcnRzLnVpbnQxNmxlID0gbmV3IE51bWJlclQoJ1VJbnQxNicsICdMRScpO1xuICAgIGV4cG9ydHMudWludDI0YmUgPSBleHBvcnRzLnVpbnQyNCA9IG5ldyBOdW1iZXJUKCdVSW50MjQnLCAnQkUnKTtcbiAgICBleHBvcnRzLnVpbnQyNGxlID0gbmV3IE51bWJlclQoJ1VJbnQyNCcsICdMRScpO1xuICAgIGV4cG9ydHMudWludDMyYmUgPSBleHBvcnRzLnVpbnQzMiA9IG5ldyBOdW1iZXJUKCdVSW50MzInLCAnQkUnKTtcbiAgICBleHBvcnRzLnVpbnQzMmxlID0gbmV3IE51bWJlclQoJ1VJbnQzMicsICdMRScpO1xuICAgIGV4cG9ydHMuaW50OCA9IG5ldyBOdW1iZXJUKCdJbnQ4Jyk7XG4gICAgZXhwb3J0cy5pbnQxNmJlID0gZXhwb3J0cy5pbnQxNiA9IG5ldyBOdW1iZXJUKCdJbnQxNicsICdCRScpO1xuICAgIGV4cG9ydHMuaW50MTZsZSA9IG5ldyBOdW1iZXJUKCdJbnQxNicsICdMRScpO1xuICAgIGV4cG9ydHMuaW50MjRiZSA9IGV4cG9ydHMuaW50MjQgPSBuZXcgTnVtYmVyVCgnSW50MjQnLCAnQkUnKTtcbiAgICBleHBvcnRzLmludDI0bGUgPSBuZXcgTnVtYmVyVCgnSW50MjQnLCAnTEUnKTtcbiAgICBleHBvcnRzLmludDMyYmUgPSBleHBvcnRzLmludDMyID0gbmV3IE51bWJlclQoJ0ludDMyJywgJ0JFJyk7XG4gICAgZXhwb3J0cy5pbnQzMmxlID0gbmV3IE51bWJlclQoJ0ludDMyJywgJ0xFJyk7XG4gICAgZXhwb3J0cy5mbG9hdGJlID0gZXhwb3J0c1tcImZsb2F0XCJdID0gbmV3IE51bWJlclQoJ0Zsb2F0JywgJ0JFJyk7XG4gICAgZXhwb3J0cy5mbG9hdGxlID0gbmV3IE51bWJlclQoJ0Zsb2F0JywgJ0xFJyk7XG4gICAgZXhwb3J0cy5kb3VibGViZSA9IGV4cG9ydHNbXCJkb3VibGVcIl0gPSBuZXcgTnVtYmVyVCgnRG91YmxlJywgJ0JFJyk7XG4gICAgZXhwb3J0cy5kb3VibGVsZSA9IG5ldyBOdW1iZXJUKCdEb3VibGUnLCAnTEUnKTtcblxuICAgIEZpeGVkID0gZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzKEZpeGVkLCBfc3VwZXIpO1xuXG4gICAgICBmdW5jdGlvbiBGaXhlZChzaXplLCBlbmRpYW4sIGZyYWNCaXRzKSB7XG4gICAgICAgIGlmIChmcmFjQml0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZnJhY0JpdHMgPSBzaXplID4+IDE7XG4gICAgICAgIH1cblxuICAgICAgICBGaXhlZC5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLCBcIkludFwiICsgc2l6ZSwgZW5kaWFuKTtcblxuICAgICAgICB0aGlzLl9wb2ludCA9IDEgPDwgZnJhY0JpdHM7XG4gICAgICB9XG5cbiAgICAgIEZpeGVkLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgICAgIHJldHVybiBGaXhlZC5fX3N1cGVyX18uZGVjb2RlLmNhbGwodGhpcywgc3RyZWFtKSAvIHRoaXMuX3BvaW50O1xuICAgICAgfTtcblxuICAgICAgRml4ZWQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHZhbCkge1xuICAgICAgICByZXR1cm4gRml4ZWQuX19zdXBlcl9fLmVuY29kZS5jYWxsKHRoaXMsIHN0cmVhbSwgdmFsICogdGhpcy5fcG9pbnQgfCAwKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBGaXhlZDtcbiAgICB9KE51bWJlclQpO1xuXG4gICAgZXhwb3J0cy5GaXhlZCA9IEZpeGVkO1xuICAgIGV4cG9ydHMuZml4ZWQxNmJlID0gZXhwb3J0cy5maXhlZDE2ID0gbmV3IEZpeGVkKDE2LCAnQkUnKTtcbiAgICBleHBvcnRzLmZpeGVkMTZsZSA9IG5ldyBGaXhlZCgxNiwgJ0xFJyk7XG4gICAgZXhwb3J0cy5maXhlZDMyYmUgPSBleHBvcnRzLmZpeGVkMzIgPSBuZXcgRml4ZWQoMzIsICdCRScpO1xuICAgIGV4cG9ydHMuZml4ZWQzMmxlID0gbmV3IEZpeGVkKDMyLCAnTEUnKTtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcbnZhciBfTnVtYmVyXzEgPSBfTnVtYmVyLk51bWJlcjtcbnZhciBfTnVtYmVyXzIgPSBfTnVtYmVyLnVpbnQ4O1xudmFyIF9OdW1iZXJfMyA9IF9OdW1iZXIudWludDE2YmU7XG52YXIgX051bWJlcl80ID0gX051bWJlci51aW50MTY7XG52YXIgX051bWJlcl81ID0gX051bWJlci51aW50MTZsZTtcbnZhciBfTnVtYmVyXzYgPSBfTnVtYmVyLnVpbnQyNGJlO1xudmFyIF9OdW1iZXJfNyA9IF9OdW1iZXIudWludDI0O1xudmFyIF9OdW1iZXJfOCA9IF9OdW1iZXIudWludDI0bGU7XG52YXIgX051bWJlcl85ID0gX051bWJlci51aW50MzJiZTtcbnZhciBfTnVtYmVyXzEwID0gX051bWJlci51aW50MzI7XG52YXIgX051bWJlcl8xMSA9IF9OdW1iZXIudWludDMybGU7XG52YXIgX051bWJlcl8xMiA9IF9OdW1iZXIuaW50ODtcbnZhciBfTnVtYmVyXzEzID0gX051bWJlci5pbnQxNmJlO1xudmFyIF9OdW1iZXJfMTQgPSBfTnVtYmVyLmludDE2O1xudmFyIF9OdW1iZXJfMTUgPSBfTnVtYmVyLmludDE2bGU7XG52YXIgX051bWJlcl8xNiA9IF9OdW1iZXIuaW50MjRiZTtcbnZhciBfTnVtYmVyXzE3ID0gX051bWJlci5pbnQyNDtcbnZhciBfTnVtYmVyXzE4ID0gX051bWJlci5pbnQyNGxlO1xudmFyIF9OdW1iZXJfMTkgPSBfTnVtYmVyLmludDMyYmU7XG52YXIgX051bWJlcl8yMCA9IF9OdW1iZXIuaW50MzI7XG52YXIgX051bWJlcl8yMSA9IF9OdW1iZXIuaW50MzJsZTtcbnZhciBfTnVtYmVyXzIyID0gX051bWJlci5mbG9hdGJlO1xudmFyIF9OdW1iZXJfMjMgPSBfTnVtYmVyLmZsb2F0bGU7XG52YXIgX051bWJlcl8yNCA9IF9OdW1iZXIuZG91YmxlYmU7XG52YXIgX051bWJlcl8yNSA9IF9OdW1iZXIuZG91YmxlbGU7XG52YXIgX051bWJlcl8yNiA9IF9OdW1iZXIuRml4ZWQ7XG52YXIgX051bWJlcl8yNyA9IF9OdW1iZXIuZml4ZWQxNmJlO1xudmFyIF9OdW1iZXJfMjggPSBfTnVtYmVyLmZpeGVkMTY7XG52YXIgX051bWJlcl8yOSA9IF9OdW1iZXIuZml4ZWQxNmxlO1xudmFyIF9OdW1iZXJfMzAgPSBfTnVtYmVyLmZpeGVkMzJiZTtcbnZhciBfTnVtYmVyXzMxID0gX051bWJlci5maXhlZDMyO1xudmFyIF9OdW1iZXJfMzIgPSBfTnVtYmVyLmZpeGVkMzJsZTtcblxudmFyIHV0aWxzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIE51bWJlclQsIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICBOdW1iZXJUID0gX051bWJlci5OdW1iZXI7XG5cbiAgICBleHBvcnRzLnJlc29sdmVMZW5ndGggPSBmdW5jdGlvbiAobGVuZ3RoLCBzdHJlYW0sIHBhcmVudCkge1xuICAgICAgdmFyIHJlcztcblxuICAgICAgaWYgKHR5cGVvZiBsZW5ndGggPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJlcyA9IGxlbmd0aDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxlbmd0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXMgPSBsZW5ndGguY2FsbChwYXJlbnQsIHBhcmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHBhcmVudCAmJiB0eXBlb2YgbGVuZ3RoID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXMgPSBwYXJlbnRbbGVuZ3RoXTtcbiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtICYmIGxlbmd0aCBpbnN0YW5jZW9mIE51bWJlclQpIHtcbiAgICAgICAgcmVzID0gbGVuZ3RoLmRlY29kZShzdHJlYW0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOYU4ocmVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIGZpeGVkIHNpemUnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuXG4gICAgUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gUHJvcGVydHlEZXNjcmlwdG9yKG9wdHMpIHtcbiAgICAgICAgdmFyIGtleSwgdmFsO1xuXG4gICAgICAgIGlmIChvcHRzID09IG51bGwpIHtcbiAgICAgICAgICBvcHRzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudW1lcmFibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG5cbiAgICAgICAgZm9yIChrZXkgaW4gb3B0cykge1xuICAgICAgICAgIHZhbCA9IG9wdHNba2V5XTtcbiAgICAgICAgICB0aGlzW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICB9KCk7XG5cbiAgICBleHBvcnRzLlByb3BlcnR5RGVzY3JpcHRvciA9IFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcbnZhciB1dGlsc18xID0gdXRpbHMucmVzb2x2ZUxlbmd0aDtcbnZhciB1dGlsc18yID0gdXRpbHMuUHJvcGVydHlEZXNjcmlwdG9yO1xuXG52YXIgX0FycmF5ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIEFycmF5VCwgTnVtYmVyVCwgdXRpbHMkMTtcbiAgICBOdW1iZXJUID0gX051bWJlci5OdW1iZXI7XG4gICAgdXRpbHMkMSA9IHV0aWxzO1xuXG4gICAgQXJyYXlUID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gQXJyYXlUKHR5cGUsIGxlbmd0aCwgbGVuZ3RoVHlwZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5sZW5ndGhUeXBlID0gbGVuZ3RoVHlwZSAhPSBudWxsID8gbGVuZ3RoVHlwZSA6ICdjb3VudCc7XG4gICAgICB9XG5cbiAgICAgIEFycmF5VC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBjdHgsIGksIGxlbmd0aCwgcG9zLCByZXMsIHRhcmdldCwgX2k7XG5cbiAgICAgICAgcG9zID0gc3RyZWFtLnBvcztcbiAgICAgICAgcmVzID0gW107XG4gICAgICAgIGN0eCA9IHBhcmVudDtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggIT0gbnVsbCkge1xuICAgICAgICAgIGxlbmd0aCA9IHV0aWxzJDEucmVzb2x2ZUxlbmd0aCh0aGlzLmxlbmd0aCwgc3RyZWFtLCBwYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIGluc3RhbmNlb2YgTnVtYmVyVCkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJlcywge1xuICAgICAgICAgICAgcGFyZW50OiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBwYXJlbnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfc3RhcnRPZmZzZXQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6IHBvc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9jdXJyZW50T2Zmc2V0OiB7XG4gICAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9sZW5ndGg6IHtcbiAgICAgICAgICAgICAgdmFsdWU6IGxlbmd0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGN0eCA9IHJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsZW5ndGggPT0gbnVsbCB8fCB0aGlzLmxlbmd0aFR5cGUgPT09ICdieXRlcycpIHtcbiAgICAgICAgICB0YXJnZXQgPSBsZW5ndGggIT0gbnVsbCA/IHN0cmVhbS5wb3MgKyBsZW5ndGggOiAocGFyZW50ICE9IG51bGwgPyBwYXJlbnQuX2xlbmd0aCA6IHZvaWQgMCkgPyBwYXJlbnQuX3N0YXJ0T2Zmc2V0ICsgcGFyZW50Ll9sZW5ndGggOiBzdHJlYW0ubGVuZ3RoO1xuXG4gICAgICAgICAgd2hpbGUgKHN0cmVhbS5wb3MgPCB0YXJnZXQpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMudHlwZS5kZWNvZGUoc3RyZWFtLCBjdHgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChpID0gX2kgPSAwOyBfaSA8IGxlbmd0aDsgaSA9IF9pICs9IDEpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKHRoaXMudHlwZS5kZWNvZGUoc3RyZWFtLCBjdHgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfTtcblxuICAgICAgQXJyYXlULnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKGFycmF5LCBjdHgpIHtcbiAgICAgICAgdmFyIGl0ZW0sIHNpemUsIF9pLCBfbGVuO1xuXG4gICAgICAgIGlmICghYXJyYXkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNpemUobnVsbCwgY3R4KSAqIHV0aWxzJDEucmVzb2x2ZUxlbmd0aCh0aGlzLmxlbmd0aCwgbnVsbCwgY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNpemUgPSAwO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCBpbnN0YW5jZW9mIE51bWJlclQpIHtcbiAgICAgICAgICBzaXplICs9IHRoaXMubGVuZ3RoLnNpemUoKTtcbiAgICAgICAgICBjdHggPSB7XG4gICAgICAgICAgICBwYXJlbnQ6IGN0eFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGFycmF5Lmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgaXRlbSA9IGFycmF5W19pXTtcbiAgICAgICAgICBzaXplICs9IHRoaXMudHlwZS5zaXplKGl0ZW0sIGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgIH07XG5cbiAgICAgIEFycmF5VC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgYXJyYXksIHBhcmVudCkge1xuICAgICAgICB2YXIgY3R4LCBpLCBpdGVtLCBwdHIsIF9pLCBfbGVuO1xuXG4gICAgICAgIGN0eCA9IHBhcmVudDtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggaW5zdGFuY2VvZiBOdW1iZXJUKSB7XG4gICAgICAgICAgY3R4ID0ge1xuICAgICAgICAgICAgcG9pbnRlcnM6IFtdLFxuICAgICAgICAgICAgc3RhcnRPZmZzZXQ6IHN0cmVhbS5wb3MsXG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudFxuICAgICAgICAgIH07XG4gICAgICAgICAgY3R4LnBvaW50ZXJPZmZzZXQgPSBzdHJlYW0ucG9zICsgdGhpcy5zaXplKGFycmF5LCBjdHgpO1xuICAgICAgICAgIHRoaXMubGVuZ3RoLmVuY29kZShzdHJlYW0sIGFycmF5Lmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IGFycmF5Lmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgaXRlbSA9IGFycmF5W19pXTtcbiAgICAgICAgICB0aGlzLnR5cGUuZW5jb2RlKHN0cmVhbSwgaXRlbSwgY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCBpbnN0YW5jZW9mIE51bWJlclQpIHtcbiAgICAgICAgICBpID0gMDtcblxuICAgICAgICAgIHdoaWxlIChpIDwgY3R4LnBvaW50ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcHRyID0gY3R4LnBvaW50ZXJzW2krK107XG4gICAgICAgICAgICBwdHIudHlwZS5lbmNvZGUoc3RyZWFtLCBwdHIudmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBBcnJheVQ7XG4gICAgfSgpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBBcnJheVQ7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBMYXp5QXJyYXkgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgQXJyYXlULFxuICAgICAgICBMYXp5QXJyYXksXG4gICAgICAgIExhenlBcnJheVQsXG4gICAgICAgIE51bWJlclQsXG4gICAgICAgIGluc3BlY3QsXG4gICAgICAgIHV0aWxzJDEsXG4gICAgICAgIF9faGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LFxuICAgICAgICBfX2V4dGVuZHMgPSBmdW5jdGlvbiBfX2V4dGVuZHMoY2hpbGQsIHBhcmVudCkge1xuICAgICAgZm9yICh2YXIga2V5IGluIHBhcmVudCkge1xuICAgICAgICBpZiAoX19oYXNQcm9wLmNhbGwocGFyZW50LCBrZXkpKSBjaGlsZFtrZXldID0gcGFyZW50W2tleV07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICAgIH1cblxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuICAgICAgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTtcbiAgICAgIGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcblxuICAgIEFycmF5VCA9IF9BcnJheTtcbiAgICBOdW1iZXJUID0gX051bWJlci5OdW1iZXI7XG4gICAgdXRpbHMkMSA9IHV0aWxzO1xuICAgIGluc3BlY3QgPSByZXF1aXJlJCQzLmluc3BlY3Q7XG5cbiAgICBMYXp5QXJyYXlUID0gZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgX19leHRlbmRzKExhenlBcnJheVQsIF9zdXBlcik7XG5cbiAgICAgIGZ1bmN0aW9uIExhenlBcnJheVQoKSB7XG4gICAgICAgIHJldHVybiBMYXp5QXJyYXlULl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICBMYXp5QXJyYXlULnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGxlbmd0aCwgcG9zLCByZXM7XG4gICAgICAgIHBvcyA9IHN0cmVhbS5wb3M7XG4gICAgICAgIGxlbmd0aCA9IHV0aWxzJDEucmVzb2x2ZUxlbmd0aCh0aGlzLmxlbmd0aCwgc3RyZWFtLCBwYXJlbnQpO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCBpbnN0YW5jZW9mIE51bWJlclQpIHtcbiAgICAgICAgICBwYXJlbnQgPSB7XG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICAgIF9zdGFydE9mZnNldDogcG9zLFxuICAgICAgICAgICAgX2N1cnJlbnRPZmZzZXQ6IDAsXG4gICAgICAgICAgICBfbGVuZ3RoOiBsZW5ndGhcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzID0gbmV3IExhenlBcnJheSh0aGlzLnR5cGUsIGxlbmd0aCwgc3RyZWFtLCBwYXJlbnQpO1xuICAgICAgICBzdHJlYW0ucG9zICs9IGxlbmd0aCAqIHRoaXMudHlwZS5zaXplKG51bGwsIHBhcmVudCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9O1xuXG4gICAgICBMYXp5QXJyYXlULnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKHZhbCwgY3R4KSB7XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBMYXp5QXJyYXkpIHtcbiAgICAgICAgICB2YWwgPSB2YWwudG9BcnJheSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIExhenlBcnJheVQuX19zdXBlcl9fLnNpemUuY2FsbCh0aGlzLCB2YWwsIGN0eCk7XG4gICAgICB9O1xuXG4gICAgICBMYXp5QXJyYXlULnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCB2YWwsIGN0eCkge1xuICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgTGF6eUFycmF5KSB7XG4gICAgICAgICAgdmFsID0gdmFsLnRvQXJyYXkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBMYXp5QXJyYXlULl9fc3VwZXJfXy5lbmNvZGUuY2FsbCh0aGlzLCBzdHJlYW0sIHZhbCwgY3R4KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBMYXp5QXJyYXlUO1xuICAgIH0oQXJyYXlUKTtcblxuICAgIExhenlBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIExhenlBcnJheSh0eXBlLCBsZW5ndGgsIHN0cmVhbSwgY3R4KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XG4gICAgICAgIHRoaXMuYmFzZSA9IHRoaXMuc3RyZWFtLnBvcztcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgICAgfVxuXG4gICAgICBMYXp5QXJyYXkucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgcG9zO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXRlbXNbaW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgICBwb3MgPSB0aGlzLnN0cmVhbS5wb3M7XG4gICAgICAgICAgdGhpcy5zdHJlYW0ucG9zID0gdGhpcy5iYXNlICsgdGhpcy50eXBlLnNpemUobnVsbCwgdGhpcy5jdHgpICogaW5kZXg7XG4gICAgICAgICAgdGhpcy5pdGVtc1tpbmRleF0gPSB0aGlzLnR5cGUuZGVjb2RlKHRoaXMuc3RyZWFtLCB0aGlzLmN0eCk7XG4gICAgICAgICAgdGhpcy5zdHJlYW0ucG9zID0gcG9zO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXhdO1xuICAgICAgfTtcblxuICAgICAgTGF6eUFycmF5LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaSwgX2ksIF9yZWYsIF9yZXN1bHRzO1xuXG4gICAgICAgIF9yZXN1bHRzID0gW107XG5cbiAgICAgICAgZm9yIChpID0gX2kgPSAwLCBfcmVmID0gdGhpcy5sZW5ndGg7IF9pIDwgX3JlZjsgaSA9IF9pICs9IDEpIHtcbiAgICAgICAgICBfcmVzdWx0cy5wdXNoKHRoaXMuZ2V0KGkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfcmVzdWx0cztcbiAgICAgIH07XG5cbiAgICAgIExhenlBcnJheS5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGluc3BlY3QodGhpcy50b0FycmF5KCkpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIExhenlBcnJheTtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IExhenlBcnJheVQ7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBCaXRmaWVsZCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBCaXRmaWVsZDtcblxuICAgIEJpdGZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gQml0ZmllbGQodHlwZSwgZmxhZ3MpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5mbGFncyA9IGZsYWdzICE9IG51bGwgPyBmbGFncyA6IFtdO1xuICAgICAgfVxuXG4gICAgICBCaXRmaWVsZC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgICAgICB2YXIgZmxhZywgaSwgcmVzLCB2YWwsIF9pLCBfbGVuLCBfcmVmO1xuXG4gICAgICAgIHZhbCA9IHRoaXMudHlwZS5kZWNvZGUoc3RyZWFtKTtcbiAgICAgICAgcmVzID0ge307XG4gICAgICAgIF9yZWYgPSB0aGlzLmZsYWdzO1xuXG4gICAgICAgIGZvciAoaSA9IF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IGkgPSArK19pKSB7XG4gICAgICAgICAgZmxhZyA9IF9yZWZbaV07XG5cbiAgICAgICAgICBpZiAoZmxhZyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXNbZmxhZ10gPSAhISh2YWwgJiAxIDw8IGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9O1xuXG4gICAgICBCaXRmaWVsZC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zaXplKCk7XG4gICAgICB9O1xuXG4gICAgICBCaXRmaWVsZC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwga2V5cykge1xuICAgICAgICB2YXIgZmxhZywgaSwgdmFsLCBfaSwgX2xlbiwgX3JlZjtcblxuICAgICAgICB2YWwgPSAwO1xuICAgICAgICBfcmVmID0gdGhpcy5mbGFncztcblxuICAgICAgICBmb3IgKGkgPSBfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBpID0gKytfaSkge1xuICAgICAgICAgIGZsYWcgPSBfcmVmW2ldO1xuXG4gICAgICAgICAgaWYgKGZsYWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGtleXNbZmxhZ10pIHtcbiAgICAgICAgICAgICAgdmFsIHw9IDEgPDwgaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy50eXBlLmVuY29kZShzdHJlYW0sIHZhbCk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gQml0ZmllbGQ7XG4gICAgfSgpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBCaXRmaWVsZDtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIF9Cb29sZWFuID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuICAvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuNy4xXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIEJvb2xlYW5UO1xuXG4gICAgQm9vbGVhblQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBCb29sZWFuVCh0eXBlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICB9XG5cbiAgICAgIEJvb2xlYW5ULnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy50eXBlLmRlY29kZShzdHJlYW0sIHBhcmVudCk7XG4gICAgICB9O1xuXG4gICAgICBCb29sZWFuVC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICh2YWwsIHBhcmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNpemUodmFsLCBwYXJlbnQpO1xuICAgICAgfTtcblxuICAgICAgQm9vbGVhblQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHZhbCwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuZW5jb2RlKHN0cmVhbSwgK3ZhbCwgcGFyZW50KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBCb29sZWFuVDtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IEJvb2xlYW5UO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgQnVmZmVyJDggPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgQnVmZmVyVCwgTnVtYmVyVCwgdXRpbHMkMTtcbiAgICB1dGlscyQxID0gdXRpbHM7XG4gICAgTnVtYmVyVCA9IF9OdW1iZXIuTnVtYmVyO1xuXG4gICAgQnVmZmVyVCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIEJ1ZmZlclQobGVuZ3RoKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBCdWZmZXJULnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGxlbmd0aDtcbiAgICAgICAgbGVuZ3RoID0gdXRpbHMkMS5yZXNvbHZlTGVuZ3RoKHRoaXMubGVuZ3RoLCBzdHJlYW0sIHBhcmVudCk7XG4gICAgICAgIHJldHVybiBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpO1xuICAgICAgfTtcblxuICAgICAgQnVmZmVyVC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICh2YWwsIHBhcmVudCkge1xuICAgICAgICBpZiAoIXZhbCkge1xuICAgICAgICAgIHJldHVybiB1dGlscyQxLnJlc29sdmVMZW5ndGgodGhpcy5sZW5ndGgsIG51bGwsIHBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsLmxlbmd0aDtcbiAgICAgIH07XG5cbiAgICAgIEJ1ZmZlclQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIGJ1ZiwgcGFyZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCBpbnN0YW5jZW9mIE51bWJlclQpIHtcbiAgICAgICAgICB0aGlzLmxlbmd0aC5lbmNvZGUoc3RyZWFtLCBidWYubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHJlYW0ud3JpdGVCdWZmZXIoYnVmKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBCdWZmZXJUO1xuICAgIH0oKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gQnVmZmVyVDtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIEVudW0gPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgRW51bTtcblxuICAgIEVudW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmdW5jdGlvbiBFbnVtKHR5cGUsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IFtdO1xuICAgICAgfVxuXG4gICAgICBFbnVtLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gICAgICAgIHZhciBpbmRleDtcbiAgICAgICAgaW5kZXggPSB0aGlzLnR5cGUuZGVjb2RlKHN0cmVhbSk7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbaW5kZXhdIHx8IGluZGV4O1xuICAgICAgfTtcblxuICAgICAgRW51bS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zaXplKCk7XG4gICAgICB9O1xuXG4gICAgICBFbnVtLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCB2YWwpIHtcbiAgICAgICAgdmFyIGluZGV4O1xuICAgICAgICBpbmRleCA9IHRoaXMub3B0aW9ucy5pbmRleE9mKHZhbCk7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3B0aW9uIGluIGVudW06IFwiICsgdmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuZW5jb2RlKHN0cmVhbSwgaW5kZXgpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIEVudW07XG4gICAgfSgpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBFbnVtO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgT3B0aW9uYWwgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgT3B0aW9uYWw7XG5cbiAgICBPcHRpb25hbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIE9wdGlvbmFsKHR5cGUsIGNvbmRpdGlvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbiAhPSBudWxsID8gY29uZGl0aW9uIDogdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgT3B0aW9uYWwucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHBhcmVudCkge1xuICAgICAgICB2YXIgY29uZGl0aW9uO1xuICAgICAgICBjb25kaXRpb24gPSB0aGlzLmNvbmRpdGlvbjtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbmRpdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5jYWxsKHBhcmVudCwgcGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmRlY29kZShzdHJlYW0sIHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIE9wdGlvbmFsLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKHZhbCwgcGFyZW50KSB7XG4gICAgICAgIHZhciBjb25kaXRpb247XG4gICAgICAgIGNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmNhbGwocGFyZW50LCBwYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuc2l6ZSh2YWwsIHBhcmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIE9wdGlvbmFsLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCB2YWwsIHBhcmVudCkge1xuICAgICAgICB2YXIgY29uZGl0aW9uO1xuICAgICAgICBjb25kaXRpb24gPSB0aGlzLmNvbmRpdGlvbjtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbmRpdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5jYWxsKHBhcmVudCwgcGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmVuY29kZShzdHJlYW0sIHZhbCwgcGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIE9wdGlvbmFsO1xuICAgIH0oKTtcblxuICAgIG1vZHVsZS5leHBvcnRzID0gT3B0aW9uYWw7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBSZXNlcnZlZCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBSZXNlcnZlZCwgdXRpbHMkMTtcbiAgICB1dGlscyQxID0gdXRpbHM7XG5cbiAgICBSZXNlcnZlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFJlc2VydmVkKHR5cGUsIGNvdW50KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuY291bnQgPSBjb3VudCAhPSBudWxsID8gY291bnQgOiAxO1xuICAgICAgfVxuXG4gICAgICBSZXNlcnZlZC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgICAgIHN0cmVhbS5wb3MgKz0gdGhpcy5zaXplKG51bGwsIHBhcmVudCk7XG4gICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICB9O1xuXG4gICAgICBSZXNlcnZlZC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIChkYXRhLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGNvdW50O1xuICAgICAgICBjb3VudCA9IHV0aWxzJDEucmVzb2x2ZUxlbmd0aCh0aGlzLmNvdW50LCBudWxsLCBwYXJlbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNpemUoKSAqIGNvdW50O1xuICAgICAgfTtcblxuICAgICAgUmVzZXJ2ZWQucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHZhbCwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiBzdHJlYW0uZmlsbCgwLCB0aGlzLnNpemUodmFsLCBwYXJlbnQpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBSZXNlcnZlZDtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IFJlc2VydmVkO1xuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xuXG52YXIgX1N0cmluZyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBOdW1iZXJULCBTdHJpbmdULCB1dGlscyQxO1xuICAgIE51bWJlclQgPSBfTnVtYmVyLk51bWJlcjtcbiAgICB1dGlscyQxID0gdXRpbHM7XG5cbiAgICBTdHJpbmdUID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gU3RyaW5nVChsZW5ndGgsIGVuY29kaW5nKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2RpbmcgIT0gbnVsbCA/IGVuY29kaW5nIDogJ2FzY2lpJztcbiAgICAgIH1cblxuICAgICAgU3RyaW5nVC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBidWZmZXIsIGVuY29kaW5nLCBsZW5ndGgsIHBvcywgc3RyaW5nO1xuXG4gICAgICAgIGxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5sZW5ndGggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzJDEucmVzb2x2ZUxlbmd0aCh0aGlzLmxlbmd0aCwgc3RyZWFtLCBwYXJlbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBidWZmZXIgPSBzdHJlYW0uYnVmZmVyLCBsZW5ndGggPSBzdHJlYW0ubGVuZ3RoLCBwb3MgPSBzdHJlYW0ucG9zO1xuXG4gICAgICAgICAgICB3aGlsZSAocG9zIDwgbGVuZ3RoICYmIGJ1ZmZlcltwb3NdICE9PSAweDAwKSB7XG4gICAgICAgICAgICAgICsrcG9zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcG9zIC0gc3RyZWFtLnBvcztcbiAgICAgICAgICB9XG4gICAgICAgIH0uY2FsbCh0aGlzKTtcblxuICAgICAgICBlbmNvZGluZyA9IHRoaXMuZW5jb2Rpbmc7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVuY29kaW5nID0gZW5jb2RpbmcuY2FsbChwYXJlbnQsIHBhcmVudCkgfHwgJ2FzY2lpJztcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmluZyA9IHN0cmVhbS5yZWFkU3RyaW5nKGxlbmd0aCwgZW5jb2RpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PSBudWxsICYmIHN0cmVhbS5wb3MgPCBzdHJlYW0ubGVuZ3RoKSB7XG4gICAgICAgICAgc3RyZWFtLnBvcysrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH07XG5cbiAgICAgIFN0cmluZ1QucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAodmFsLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIGVuY29kaW5nLCBzaXplO1xuXG4gICAgICAgIGlmICghdmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHV0aWxzJDEucmVzb2x2ZUxlbmd0aCh0aGlzLmxlbmd0aCwgbnVsbCwgcGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVuY29kaW5nID0gdGhpcy5lbmNvZGluZztcblxuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy5jYWxsKHBhcmVudCAhPSBudWxsID8gcGFyZW50LnZhbCA6IHZvaWQgMCwgcGFyZW50ICE9IG51bGwgPyBwYXJlbnQudmFsIDogdm9pZCAwKSB8fCAnYXNjaWknO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuY29kaW5nID09PSAndXRmMTZiZScpIHtcbiAgICAgICAgICBlbmNvZGluZyA9ICd1dGYxNmxlJztcbiAgICAgICAgfVxuXG4gICAgICAgIHNpemUgPSBidWZmZXJfMS5ieXRlTGVuZ3RoKHZhbCwgZW5jb2RpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCBpbnN0YW5jZW9mIE51bWJlclQpIHtcbiAgICAgICAgICBzaXplICs9IHRoaXMubGVuZ3RoLnNpemUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PSBudWxsKSB7XG4gICAgICAgICAgc2l6ZSsrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICB9O1xuXG4gICAgICBTdHJpbmdULnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCB2YWwsIHBhcmVudCkge1xuICAgICAgICB2YXIgZW5jb2Rpbmc7XG4gICAgICAgIGVuY29kaW5nID0gdGhpcy5lbmNvZGluZztcblxuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy5jYWxsKHBhcmVudCAhPSBudWxsID8gcGFyZW50LnZhbCA6IHZvaWQgMCwgcGFyZW50ICE9IG51bGwgPyBwYXJlbnQudmFsIDogdm9pZCAwKSB8fCAnYXNjaWknO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIGluc3RhbmNlb2YgTnVtYmVyVCkge1xuICAgICAgICAgIHRoaXMubGVuZ3RoLmVuY29kZShzdHJlYW0sIGJ1ZmZlcl8xLmJ5dGVMZW5ndGgodmFsLCBlbmNvZGluZykpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyZWFtLndyaXRlU3RyaW5nKHZhbCwgZW5jb2RpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbS53cml0ZVVJbnQ4KDB4MDApO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gU3RyaW5nVDtcbiAgICB9KCk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IFN0cmluZ1Q7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBTdHJ1Y3QgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgU3RydWN0LCB1dGlscyQxO1xuICAgIHV0aWxzJDEgPSB1dGlscztcblxuICAgIFN0cnVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFN0cnVjdChmaWVsZHMpIHtcbiAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHMgIT0gbnVsbCA/IGZpZWxkcyA6IHt9O1xuICAgICAgfVxuXG4gICAgICBTdHJ1Y3QucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHBhcmVudCwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciByZXMsIF9yZWY7XG5cbiAgICAgICAgaWYgKGxlbmd0aCA9PSBudWxsKSB7XG4gICAgICAgICAgbGVuZ3RoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcyA9IHRoaXMuX3NldHVwKHN0cmVhbSwgcGFyZW50LCBsZW5ndGgpO1xuXG4gICAgICAgIHRoaXMuX3BhcnNlRmllbGRzKHN0cmVhbSwgcmVzLCB0aGlzLmZpZWxkcyk7XG5cbiAgICAgICAgaWYgKChfcmVmID0gdGhpcy5wcm9jZXNzKSAhPSBudWxsKSB7XG4gICAgICAgICAgX3JlZi5jYWxsKHJlcywgc3RyZWFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9O1xuXG4gICAgICBTdHJ1Y3QucHJvdG90eXBlLl9zZXR1cCA9IGZ1bmN0aW9uIChzdHJlYW0sIHBhcmVudCwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIHJlcyA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhyZXMsIHtcbiAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiBwYXJlbnRcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9zdGFydE9mZnNldDoge1xuICAgICAgICAgICAgdmFsdWU6IHN0cmVhbS5wb3NcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9jdXJyZW50T2Zmc2V0OiB7XG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBfbGVuZ3RoOiB7XG4gICAgICAgICAgICB2YWx1ZTogbGVuZ3RoXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH07XG5cbiAgICAgIFN0cnVjdC5wcm90b3R5cGUuX3BhcnNlRmllbGRzID0gZnVuY3Rpb24gKHN0cmVhbSwgcmVzLCBmaWVsZHMpIHtcbiAgICAgICAgdmFyIGtleSwgdHlwZSwgdmFsO1xuXG4gICAgICAgIGZvciAoa2V5IGluIGZpZWxkcykge1xuICAgICAgICAgIHR5cGUgPSBmaWVsZHNba2V5XTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFsID0gdHlwZS5jYWxsKHJlcywgcmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsID0gdHlwZS5kZWNvZGUoc3RyZWFtLCByZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWwgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIHV0aWxzJDEuUHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXMsIGtleSwgdmFsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc1trZXldID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcy5fY3VycmVudE9mZnNldCA9IHN0cmVhbS5wb3MgLSByZXMuX3N0YXJ0T2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAodmFsLCBwYXJlbnQsIGluY2x1ZGVQb2ludGVycykge1xuICAgICAgICB2YXIgY3R4LCBrZXksIHNpemUsIHR5cGUsIF9yZWY7XG5cbiAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgdmFsID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5jbHVkZVBvaW50ZXJzID09IG51bGwpIHtcbiAgICAgICAgICBpbmNsdWRlUG9pbnRlcnMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3R4ID0ge1xuICAgICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICAgIHZhbDogdmFsLFxuICAgICAgICAgIHBvaW50ZXJTaXplOiAwXG4gICAgICAgIH07XG4gICAgICAgIHNpemUgPSAwO1xuICAgICAgICBfcmVmID0gdGhpcy5maWVsZHM7XG5cbiAgICAgICAgZm9yIChrZXkgaW4gX3JlZikge1xuICAgICAgICAgIHR5cGUgPSBfcmVmW2tleV07XG5cbiAgICAgICAgICBpZiAodHlwZS5zaXplICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNpemUgKz0gdHlwZS5zaXplKHZhbFtrZXldLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNsdWRlUG9pbnRlcnMpIHtcbiAgICAgICAgICBzaXplICs9IGN0eC5wb2ludGVyU2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaXplO1xuICAgICAgfTtcblxuICAgICAgU3RydWN0LnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCB2YWwsIHBhcmVudCkge1xuICAgICAgICB2YXIgY3R4LCBpLCBrZXksIHB0ciwgdHlwZSwgX3JlZiwgX3JlZjE7XG5cbiAgICAgICAgaWYgKChfcmVmID0gdGhpcy5wcmVFbmNvZGUpICE9IG51bGwpIHtcbiAgICAgICAgICBfcmVmLmNhbGwodmFsLCBzdHJlYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY3R4ID0ge1xuICAgICAgICAgIHBvaW50ZXJzOiBbXSxcbiAgICAgICAgICBzdGFydE9mZnNldDogc3RyZWFtLnBvcyxcbiAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICB2YWw6IHZhbCxcbiAgICAgICAgICBwb2ludGVyU2l6ZTogMFxuICAgICAgICB9O1xuICAgICAgICBjdHgucG9pbnRlck9mZnNldCA9IHN0cmVhbS5wb3MgKyB0aGlzLnNpemUodmFsLCBjdHgsIGZhbHNlKTtcbiAgICAgICAgX3JlZjEgPSB0aGlzLmZpZWxkcztcblxuICAgICAgICBmb3IgKGtleSBpbiBfcmVmMSkge1xuICAgICAgICAgIHR5cGUgPSBfcmVmMVtrZXldO1xuXG4gICAgICAgICAgaWYgKHR5cGUuZW5jb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHR5cGUuZW5jb2RlKHN0cmVhbSwgdmFsW2tleV0sIGN0eCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBjdHgucG9pbnRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgcHRyID0gY3R4LnBvaW50ZXJzW2krK107XG4gICAgICAgICAgcHRyLnR5cGUuZW5jb2RlKHN0cmVhbSwgcHRyLnZhbCwgcHRyLnBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBTdHJ1Y3Q7XG4gICAgfSgpO1xuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBTdHJ1Y3Q7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG5cbnZhciBWZXJzaW9uZWRTdHJ1Y3QgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgU3RydWN0JDEsXG4gICAgICAgIFZlcnNpb25lZFN0cnVjdCxcbiAgICAgICAgX19oYXNQcm9wID0ge30uaGFzT3duUHJvcGVydHksXG4gICAgICAgIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uIF9fZXh0ZW5kcyhjaGlsZCwgcGFyZW50KSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7XG4gICAgICAgIGlmIChfX2hhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY3RvcigpIHtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgICAgfVxuXG4gICAgICBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpO1xuICAgICAgY2hpbGQuX19zdXBlcl9fID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuXG4gICAgU3RydWN0JDEgPSBTdHJ1Y3Q7XG5cbiAgICBWZXJzaW9uZWRTdHJ1Y3QgPSBmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICBfX2V4dGVuZHMoVmVyc2lvbmVkU3RydWN0LCBfc3VwZXIpO1xuXG4gICAgICBmdW5jdGlvbiBWZXJzaW9uZWRTdHJ1Y3QodHlwZSwgdmVyc2lvbnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy52ZXJzaW9ucyA9IHZlcnNpb25zICE9IG51bGwgPyB2ZXJzaW9ucyA6IHt9O1xuICAgICAgfVxuXG4gICAgICBWZXJzaW9uZWRTdHJ1Y3QucHJvdG90eXBlLnZlcnNpb25HZXR0ZXIgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuc3BsaXQoJy4nKS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvYmpbcHJvcF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIFZlcnNpb25lZFN0cnVjdC5wcm90b3R5cGUudmVyc2lvblNldHRlciA9IGZ1bmN0aW9uIChwYXJlbnQsIHZlcnNpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zcGxpdCgnLicpLnJlZHVjZShmdW5jdGlvbiAob2JqLCBwcm9wKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqW3Byb3BdID0gdmVyc2lvbjtcbiAgICAgICAgICB9LCBwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBWZXJzaW9uZWRTdHJ1Y3QucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHBhcmVudCwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBmaWVsZHMsIHJlcywgX3JlZjtcblxuICAgICAgICBpZiAobGVuZ3RoID09IG51bGwpIHtcbiAgICAgICAgICBsZW5ndGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzID0gdGhpcy5fc2V0dXAoc3RyZWFtLCBwYXJlbnQsIGxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmVzLnZlcnNpb24gPSB0aGlzLnZlcnNpb25HZXR0ZXIocGFyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXMudmVyc2lvbiA9IHRoaXMudHlwZS5kZWNvZGUoc3RyZWFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZlcnNpb25zLmhlYWRlcikge1xuICAgICAgICAgIHRoaXMuX3BhcnNlRmllbGRzKHN0cmVhbSwgcmVzLCB0aGlzLnZlcnNpb25zLmhlYWRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZHMgPSB0aGlzLnZlcnNpb25zW3Jlcy52ZXJzaW9uXTtcblxuICAgICAgICBpZiAoZmllbGRzID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHZlcnNpb24gXCIgKyByZXMudmVyc2lvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGRzIGluc3RhbmNlb2YgVmVyc2lvbmVkU3RydWN0KSB7XG4gICAgICAgICAgcmV0dXJuIGZpZWxkcy5kZWNvZGUoc3RyZWFtLCBwYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGFyc2VGaWVsZHMoc3RyZWFtLCByZXMsIGZpZWxkcyk7XG5cbiAgICAgICAgaWYgKChfcmVmID0gdGhpcy5wcm9jZXNzKSAhPSBudWxsKSB7XG4gICAgICAgICAgX3JlZi5jYWxsKHJlcywgc3RyZWFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9O1xuXG4gICAgICBWZXJzaW9uZWRTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAodmFsLCBwYXJlbnQsIGluY2x1ZGVQb2ludGVycykge1xuICAgICAgICB2YXIgY3R4LCBmaWVsZHMsIGtleSwgc2l6ZSwgdHlwZSwgX3JlZjtcblxuICAgICAgICBpZiAoaW5jbHVkZVBvaW50ZXJzID09IG51bGwpIHtcbiAgICAgICAgICBpbmNsdWRlUG9pbnRlcnMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIGZpeGVkIHNpemUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eCA9IHtcbiAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICB2YWw6IHZhbCxcbiAgICAgICAgICBwb2ludGVyU2l6ZTogMFxuICAgICAgICB9O1xuICAgICAgICBzaXplID0gMDtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBzaXplICs9IHRoaXMudHlwZS5zaXplKHZhbC52ZXJzaW9uLCBjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbnMuaGVhZGVyKSB7XG4gICAgICAgICAgX3JlZiA9IHRoaXMudmVyc2lvbnMuaGVhZGVyO1xuXG4gICAgICAgICAgZm9yIChrZXkgaW4gX3JlZikge1xuICAgICAgICAgICAgdHlwZSA9IF9yZWZba2V5XTtcblxuICAgICAgICAgICAgaWYgKHR5cGUuc2l6ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHNpemUgKz0gdHlwZS5zaXplKHZhbFtrZXldLCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkcyA9IHRoaXMudmVyc2lvbnNbdmFsLnZlcnNpb25dO1xuXG4gICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdmVyc2lvbiBcIiArIHZhbC52ZXJzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoa2V5IGluIGZpZWxkcykge1xuICAgICAgICAgIHR5cGUgPSBmaWVsZHNba2V5XTtcblxuICAgICAgICAgIGlmICh0eXBlLnNpemUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2l6ZSArPSB0eXBlLnNpemUodmFsW2tleV0sIGN0eCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluY2x1ZGVQb2ludGVycykge1xuICAgICAgICAgIHNpemUgKz0gY3R4LnBvaW50ZXJTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICB9O1xuXG4gICAgICBWZXJzaW9uZWRTdHJ1Y3QucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uIChzdHJlYW0sIHZhbCwgcGFyZW50KSB7XG4gICAgICAgIHZhciBjdHgsIGZpZWxkcywgaSwga2V5LCBwdHIsIHR5cGUsIF9yZWYsIF9yZWYxO1xuXG4gICAgICAgIGlmICgoX3JlZiA9IHRoaXMucHJlRW5jb2RlKSAhPSBudWxsKSB7XG4gICAgICAgICAgX3JlZi5jYWxsKHZhbCwgc3RyZWFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eCA9IHtcbiAgICAgICAgICBwb2ludGVyczogW10sXG4gICAgICAgICAgc3RhcnRPZmZzZXQ6IHN0cmVhbS5wb3MsXG4gICAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgdmFsOiB2YWwsXG4gICAgICAgICAgcG9pbnRlclNpemU6IDBcbiAgICAgICAgfTtcbiAgICAgICAgY3R4LnBvaW50ZXJPZmZzZXQgPSBzdHJlYW0ucG9zICsgdGhpcy5zaXplKHZhbCwgY3R4LCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy50eXBlLmVuY29kZShzdHJlYW0sIHZhbC52ZXJzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZlcnNpb25zLmhlYWRlcikge1xuICAgICAgICAgIF9yZWYxID0gdGhpcy52ZXJzaW9ucy5oZWFkZXI7XG5cbiAgICAgICAgICBmb3IgKGtleSBpbiBfcmVmMSkge1xuICAgICAgICAgICAgdHlwZSA9IF9yZWYxW2tleV07XG5cbiAgICAgICAgICAgIGlmICh0eXBlLmVuY29kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHR5cGUuZW5jb2RlKHN0cmVhbSwgdmFsW2tleV0sIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmllbGRzID0gdGhpcy52ZXJzaW9uc1t2YWwudmVyc2lvbl07XG5cbiAgICAgICAgZm9yIChrZXkgaW4gZmllbGRzKSB7XG4gICAgICAgICAgdHlwZSA9IGZpZWxkc1trZXldO1xuXG4gICAgICAgICAgaWYgKHR5cGUuZW5jb2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHR5cGUuZW5jb2RlKHN0cmVhbSwgdmFsW2tleV0sIGN0eCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBjdHgucG9pbnRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgcHRyID0gY3R4LnBvaW50ZXJzW2krK107XG4gICAgICAgICAgcHRyLnR5cGUuZW5jb2RlKHN0cmVhbSwgcHRyLnZhbCwgcHRyLnBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBWZXJzaW9uZWRTdHJ1Y3Q7XG4gICAgfShTdHJ1Y3QkMSk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IFZlcnNpb25lZFN0cnVjdDtcbiAgfSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG59KTtcblxudmFyIFBvaW50ZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gIC8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS43LjFcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgUG9pbnRlciwgVm9pZFBvaW50ZXIsIHV0aWxzJDE7XG4gICAgdXRpbHMkMSA9IHV0aWxzO1xuXG4gICAgUG9pbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIFBvaW50ZXIob2Zmc2V0VHlwZSwgdHlwZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2Jhc2UsIF9iYXNlMSwgX2Jhc2UyLCBfYmFzZTM7XG5cbiAgICAgICAgdGhpcy5vZmZzZXRUeXBlID0gb2Zmc2V0VHlwZTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IHt9O1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICd2b2lkJykge1xuICAgICAgICAgIHRoaXMudHlwZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKF9iYXNlID0gdGhpcy5vcHRpb25zKS50eXBlID09IG51bGwpIHtcbiAgICAgICAgICBfYmFzZS50eXBlID0gJ2xvY2FsJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoX2Jhc2UxID0gdGhpcy5vcHRpb25zKS5hbGxvd051bGwgPT0gbnVsbCkge1xuICAgICAgICAgIF9iYXNlMS5hbGxvd051bGwgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChfYmFzZTIgPSB0aGlzLm9wdGlvbnMpLm51bGxWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgX2Jhc2UyLm51bGxWYWx1ZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKF9iYXNlMyA9IHRoaXMub3B0aW9ucykubGF6eSA9PSBudWxsKSB7XG4gICAgICAgICAgX2Jhc2UzLmxhenkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBQb2ludGVyLnByb3RvdHlwZS5yZWxhdGl2ZVRvR2V0dGVyID0gZnVuY3Rpb24gKGN0eCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlbGF0aXZlVG8uc3BsaXQoJy4nKS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgcHJvcCkge1xuICAgICAgICAgIHJldHVybiBvYmpbcHJvcF07XG4gICAgICAgIH0sIGN0eCk7XG4gICAgICB9O1xuXG4gICAgICBQb2ludGVyLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCBjdHgpIHtcbiAgICAgICAgdmFyIGMsIGRlY29kZVZhbHVlLCBvZmZzZXQsIHB0ciwgcmVsYXRpdmUsIHZhbDtcbiAgICAgICAgb2Zmc2V0ID0gdGhpcy5vZmZzZXRUeXBlLmRlY29kZShzdHJlYW0sIGN0eCk7XG5cbiAgICAgICAgaWYgKG9mZnNldCA9PT0gdGhpcy5vcHRpb25zLm51bGxWYWx1ZSAmJiB0aGlzLm9wdGlvbnMuYWxsb3dOdWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZWxhdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdsb2NhbCc6XG4gICAgICAgICAgICAgIHJldHVybiBjdHguX3N0YXJ0T2Zmc2V0O1xuXG4gICAgICAgICAgICBjYXNlICdpbW1lZGlhdGUnOlxuICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtLnBvcyAtIHRoaXMub2Zmc2V0VHlwZS5zaXplKCk7XG5cbiAgICAgICAgICAgIGNhc2UgJ3BhcmVudCc6XG4gICAgICAgICAgICAgIHJldHVybiBjdHgucGFyZW50Ll9zdGFydE9mZnNldDtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgYyA9IGN0eDtcblxuICAgICAgICAgICAgICB3aGlsZSAoYy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBjID0gYy5wYXJlbnQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gYy5fc3RhcnRPZmZzZXQgfHwgMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0uY2FsbCh0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlbGF0aXZlVG8pIHtcbiAgICAgICAgICByZWxhdGl2ZSArPSB0aGlzLnJlbGF0aXZlVG9HZXR0ZXIoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB0ciA9IG9mZnNldCArIHJlbGF0aXZlO1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgIHZhbCA9IG51bGw7XG5cbiAgICAgICAgICBkZWNvZGVWYWx1ZSA9IGZ1bmN0aW9uIChfdGhpcykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIHBvcztcblxuICAgICAgICAgICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcG9zID0gc3RyZWFtLnBvcztcbiAgICAgICAgICAgICAgc3RyZWFtLnBvcyA9IHB0cjtcbiAgICAgICAgICAgICAgdmFsID0gX3RoaXMudHlwZS5kZWNvZGUoc3RyZWFtLCBjdHgpO1xuICAgICAgICAgICAgICBzdHJlYW0ucG9zID0gcG9zO1xuICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KHRoaXMpO1xuXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYXp5KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHV0aWxzJDEuUHJvcGVydHlEZXNjcmlwdG9yKHtcbiAgICAgICAgICAgICAgZ2V0OiBkZWNvZGVWYWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRlY29kZVZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHB0cjtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgUG9pbnRlci5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICh2YWwsIGN0eCkge1xuICAgICAgICB2YXIgcGFyZW50LCB0eXBlO1xuICAgICAgICBwYXJlbnQgPSBjdHg7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2xvY2FsJzpcbiAgICAgICAgICBjYXNlICdpbW1lZGlhdGUnOlxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdwYXJlbnQnOlxuICAgICAgICAgICAgY3R4ID0gY3R4LnBhcmVudDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHdoaWxlIChjdHgucGFyZW50KSB7XG4gICAgICAgICAgICAgIGN0eCA9IGN0eC5wYXJlbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHR5cGUgPSB0aGlzLnR5cGU7XG5cbiAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgIGlmICghKHZhbCBpbnN0YW5jZW9mIFZvaWRQb2ludGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBiZSBhIFZvaWRQb2ludGVyXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHR5cGUgPSB2YWwudHlwZTtcbiAgICAgICAgICB2YWwgPSB2YWwudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsICYmIGN0eCkge1xuICAgICAgICAgIGN0eC5wb2ludGVyU2l6ZSArPSB0eXBlLnNpemUodmFsLCBwYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0VHlwZS5zaXplKCk7XG4gICAgICB9O1xuXG4gICAgICBQb2ludGVyLnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiAoc3RyZWFtLCB2YWwsIGN0eCkge1xuICAgICAgICB2YXIgcGFyZW50LCByZWxhdGl2ZSwgdHlwZTtcbiAgICAgICAgcGFyZW50ID0gY3R4O1xuXG4gICAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMub2Zmc2V0VHlwZS5lbmNvZGUoc3RyZWFtLCB0aGlzLm9wdGlvbnMubnVsbFZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRoaXMub3B0aW9ucy50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnbG9jYWwnOlxuICAgICAgICAgICAgcmVsYXRpdmUgPSBjdHguc3RhcnRPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2ltbWVkaWF0ZSc6XG4gICAgICAgICAgICByZWxhdGl2ZSA9IHN0cmVhbS5wb3MgKyB0aGlzLm9mZnNldFR5cGUuc2l6ZSh2YWwsIHBhcmVudCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3BhcmVudCc6XG4gICAgICAgICAgICBjdHggPSBjdHgucGFyZW50O1xuICAgICAgICAgICAgcmVsYXRpdmUgPSBjdHguc3RhcnRPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZWxhdGl2ZSA9IDA7XG5cbiAgICAgICAgICAgIHdoaWxlIChjdHgucGFyZW50KSB7XG4gICAgICAgICAgICAgIGN0eCA9IGN0eC5wYXJlbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVsYXRpdmVUbykge1xuICAgICAgICAgIHJlbGF0aXZlICs9IHRoaXMucmVsYXRpdmVUb0dldHRlcihwYXJlbnQudmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2Zmc2V0VHlwZS5lbmNvZGUoc3RyZWFtLCBjdHgucG9pbnRlck9mZnNldCAtIHJlbGF0aXZlKTtcbiAgICAgICAgdHlwZSA9IHRoaXMudHlwZTtcblxuICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKCEodmFsIGluc3RhbmNlb2YgVm9pZFBvaW50ZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IGJlIGEgVm9pZFBvaW50ZXJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHlwZSA9IHZhbC50eXBlO1xuICAgICAgICAgIHZhbCA9IHZhbC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5wb2ludGVycy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgIHZhbDogdmFsLFxuICAgICAgICAgIHBhcmVudDogcGFyZW50XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY3R4LnBvaW50ZXJPZmZzZXQgKz0gdHlwZS5zaXplKHZhbCwgcGFyZW50KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBQb2ludGVyO1xuICAgIH0oKTtcblxuICAgIFZvaWRQb2ludGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgZnVuY3Rpb24gVm9pZFBvaW50ZXIodHlwZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVm9pZFBvaW50ZXI7XG4gICAgfSgpO1xuXG4gICAgZXhwb3J0cy5Qb2ludGVyID0gUG9pbnRlcjtcbiAgICBleHBvcnRzLlZvaWRQb2ludGVyID0gVm9pZFBvaW50ZXI7XG4gIH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xufSk7XG52YXIgUG9pbnRlcl8xID0gUG9pbnRlci5Qb2ludGVyO1xudmFyIFBvaW50ZXJfMiA9IFBvaW50ZXIuVm9pZFBvaW50ZXI7XG5cbnZhciByZXN0cnVjdHVyZSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjcuMVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBrZXksIHZhbCwgX3JlZiwgX3JlZjE7XG5cbiAgICBleHBvcnRzLkVuY29kZVN0cmVhbSA9IEVuY29kZVN0cmVhbTtcbiAgICBleHBvcnRzLkRlY29kZVN0cmVhbSA9IERlY29kZVN0cmVhbTtcbiAgICBleHBvcnRzLkFycmF5ID0gX0FycmF5O1xuICAgIGV4cG9ydHMuTGF6eUFycmF5ID0gTGF6eUFycmF5O1xuICAgIGV4cG9ydHMuQml0ZmllbGQgPSBCaXRmaWVsZDtcbiAgICBleHBvcnRzLkJvb2xlYW4gPSBfQm9vbGVhbjtcbiAgICBleHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlciQ4O1xuICAgIGV4cG9ydHMuRW51bSA9IEVudW07XG4gICAgZXhwb3J0cy5PcHRpb25hbCA9IE9wdGlvbmFsO1xuICAgIGV4cG9ydHMuUmVzZXJ2ZWQgPSBSZXNlcnZlZDtcbiAgICBleHBvcnRzLlN0cmluZyA9IF9TdHJpbmc7XG4gICAgZXhwb3J0cy5TdHJ1Y3QgPSBTdHJ1Y3Q7XG4gICAgZXhwb3J0cy5WZXJzaW9uZWRTdHJ1Y3QgPSBWZXJzaW9uZWRTdHJ1Y3Q7XG4gICAgX3JlZiA9IF9OdW1iZXI7XG5cbiAgICBmb3IgKGtleSBpbiBfcmVmKSB7XG4gICAgICB2YWwgPSBfcmVmW2tleV07XG4gICAgICBleHBvcnRzW2tleV0gPSB2YWw7XG4gICAgfVxuXG4gICAgX3JlZjEgPSBQb2ludGVyO1xuXG4gICAgZm9yIChrZXkgaW4gX3JlZjEpIHtcbiAgICAgIHZhbCA9IF9yZWYxW2tleV07XG4gICAgICBleHBvcnRzW2tleV0gPSB2YWw7XG4gICAgfVxuICB9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcbn0pO1xudmFyIHJlc3RydWN0dXJlXzEgPSByZXN0cnVjdHVyZS5FbmNvZGVTdHJlYW07XG52YXIgcmVzdHJ1Y3R1cmVfMiA9IHJlc3RydWN0dXJlLkRlY29kZVN0cmVhbTtcbnZhciByZXN0cnVjdHVyZV8zID0gcmVzdHJ1Y3R1cmUuQXJyYXk7XG52YXIgcmVzdHJ1Y3R1cmVfNCA9IHJlc3RydWN0dXJlLkxhenlBcnJheTtcbnZhciByZXN0cnVjdHVyZV81ID0gcmVzdHJ1Y3R1cmUuQml0ZmllbGQ7XG52YXIgcmVzdHJ1Y3R1cmVfNiA9IHJlc3RydWN0dXJlLkJvb2xlYW47XG52YXIgcmVzdHJ1Y3R1cmVfNyA9IHJlc3RydWN0dXJlLkJ1ZmZlcjtcbnZhciByZXN0cnVjdHVyZV84ID0gcmVzdHJ1Y3R1cmUuRW51bTtcbnZhciByZXN0cnVjdHVyZV85ID0gcmVzdHJ1Y3R1cmUuT3B0aW9uYWw7XG52YXIgcmVzdHJ1Y3R1cmVfMTAgPSByZXN0cnVjdHVyZS5SZXNlcnZlZDtcbnZhciByZXN0cnVjdHVyZV8xMSA9IHJlc3RydWN0dXJlLlN0cmluZztcbnZhciByZXN0cnVjdHVyZV8xMiA9IHJlc3RydWN0dXJlLlN0cnVjdDtcbnZhciByZXN0cnVjdHVyZV8xMyA9IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdDtcblxudmFyIGZvcm1hdHMgPSBbXTtcbnZhciBmb250a2l0ID0ge1xuICBsb2dFcnJvcnM6IGZhbHNlLFxuICByZWdpc3RlckZvcm1hdDogZnVuY3Rpb24gcmVnaXN0ZXJGb3JtYXQoZm9ybWF0KSB7XG4gICAgZm9ybWF0cy5wdXNoKGZvcm1hdCk7XG4gIH0sXG4gIGNyZWF0ZTogZnVuY3Rpb24gY3JlYXRlKHVpbnQ4QXJyYXlGb250RGF0YSwgcG9zdHNjcmlwdE5hbWUpIHtcbiAgICB2YXIgYnVmZmVyID0gbmV3IGJ1ZmZlcl8xLmZyb20odWludDhBcnJheUZvbnREYXRhKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZvcm1hdCA9IGZvcm1hdHNbaV07XG5cbiAgICAgIGlmIChmb3JtYXQucHJvYmUoYnVmZmVyKSkge1xuICAgICAgICB2YXIgZm9udCA9IG5ldyBmb3JtYXQobmV3IHJlc3RydWN0dXJlLkRlY29kZVN0cmVhbShidWZmZXIpKTtcblxuICAgICAgICBpZiAocG9zdHNjcmlwdE5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gZm9udC5nZXRGb250KHBvc3RzY3JpcHROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb250O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBmb250IGZvcm1hdCcpO1xuICB9XG59O1xuXG4vKipcbiAqIFRoaXMgZGVjb3JhdG9yIGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBhIGdldHRlciBvciBtZXRob2Qgc3VjaCB0aGF0XG4gKiB0aGUgcmVzdWx0cyBhcmUgbGF6aWx5IGNvbXB1dGVkIG9uY2UsIGFuZCB0aGVuIGNhY2hlZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhY2hlKHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKSB7XG4gIGlmIChkZXNjcmlwdG9yLmdldCkge1xuICAgIHZhciBnZXQgPSBkZXNjcmlwdG9yLmdldDtcblxuICAgIGRlc2NyaXB0b3IuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0LmNhbGwodGhpcyk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmbiA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICB2YXIgY2FjaGUgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgZnVuY3Rpb24gbWVtb2l6ZWQoKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBrZXkgPSBhcmdzLmxlbmd0aCA+IDAgPyBhcmdzWzBdIDogJ3ZhbHVlJztcblxuICAgICAgICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciByZXN1bHQgPSBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICBjYWNoZS5zZXQoa2V5LCByZXN1bHQpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwge1xuICAgICAgICAgIHZhbHVlOiBtZW1vaXplZFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1lbW9pemVkO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxudmFyIFN1YkhlYWRlciA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmaXJzdENvZGU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZW50cnlDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBpZERlbHRhOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgaWRSYW5nZU9mZnNldDogcmVzdHJ1Y3R1cmUudWludDE2XG59KTtcbnZhciBDbWFwR3JvdXAgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgc3RhcnRDaGFyQ29kZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBlbmRDaGFyQ29kZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBnbHlwaElEOiByZXN0cnVjdHVyZS51aW50MzJcbn0pO1xudmFyIFVuaWNvZGVWYWx1ZVJhbmdlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHN0YXJ0VW5pY29kZVZhbHVlOiByZXN0cnVjdHVyZS51aW50MjQsXG4gIGFkZGl0aW9uYWxDb3VudDogcmVzdHJ1Y3R1cmUudWludDhcbn0pO1xudmFyIFVWU01hcHBpbmcgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdW5pY29kZVZhbHVlOiByZXN0cnVjdHVyZS51aW50MjQsXG4gIGdseXBoSUQ6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7XG52YXIgRGVmYXVsdFVWUyA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShVbmljb2RlVmFsdWVSYW5nZSwgcmVzdHJ1Y3R1cmUudWludDMyKTtcbnZhciBOb25EZWZhdWx0VVZTID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KFVWU01hcHBpbmcsIHJlc3RydWN0dXJlLnVpbnQzMik7XG52YXIgVmFyU2VsZWN0b3JSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmFyU2VsZWN0b3I6IHJlc3RydWN0dXJlLnVpbnQyNCxcbiAgZGVmYXVsdFVWUzogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBEZWZhdWx0VVZTLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSksXG4gIG5vbkRlZmF1bHRVVlM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgTm9uRGVmYXVsdFVWUywge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBDbWFwU3VidGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAwOiB7XG4gICAgLy8gQnl0ZSBlbmNvZGluZ1xuICAgIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIFRvdGFsIHRhYmxlIGxlbmd0aCBpbiBieXRlcyAoc2V0IHRvIDI2MiBmb3IgZm9ybWF0IDApXG4gICAgbGFuZ3VhZ2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyBMYW5ndWFnZSBjb2RlIGZvciB0aGlzIGVuY29kaW5nIHN1YnRhYmxlLCBvciB6ZXJvIGlmIGxhbmd1YWdlLWluZGVwZW5kZW50XG4gICAgY29kZU1hcDogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS51aW50OCwgMjU2KVxuICB9LFxuICAyOiB7XG4gICAgLy8gSGlnaC1ieXRlIG1hcHBpbmcgKENKSylcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBsYW5ndWFnZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHN1YkhlYWRlcktleXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIDI1NiksXG4gICAgc3ViSGVhZGVyQ291bnQ6IGZ1bmN0aW9uIHN1YkhlYWRlckNvdW50KHQpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCB0LnN1YkhlYWRlcktleXMpO1xuICAgIH0sXG4gICAgc3ViSGVhZGVyczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShTdWJIZWFkZXIsICdzdWJIZWFkZXJDb3VudCcpLFxuICAgIGdseXBoSW5kZXhBcnJheTogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdzdWJIZWFkZXJDb3VudCcpXG4gIH0sXG4gIDQ6IHtcbiAgICAvLyBTZWdtZW50IG1hcHBpbmcgdG8gZGVsdGEgdmFsdWVzXG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gVG90YWwgdGFibGUgbGVuZ3RoIGluIGJ5dGVzXG4gICAgbGFuZ3VhZ2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyBMYW5ndWFnZSBjb2RlXG4gICAgc2VnQ291bnRYMjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHNlZ0NvdW50OiBmdW5jdGlvbiBzZWdDb3VudCh0KSB7XG4gICAgICByZXR1cm4gdC5zZWdDb3VudFgyID4+IDE7XG4gICAgfSxcbiAgICBzZWFyY2hSYW5nZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGVudHJ5U2VsZWN0b3I6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICByYW5nZVNoaWZ0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZW5kQ29kZTogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdzZWdDb3VudCcpLFxuICAgIHJlc2VydmVkUGFkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgICAvLyBUaGlzIHZhbHVlIHNob3VsZCBiZSB6ZXJvXG4gICAgc3RhcnRDb2RlOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ3NlZ0NvdW50JyksXG4gICAgaWREZWx0YTogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS5pbnQxNiwgJ3NlZ0NvdW50JyksXG4gICAgaWRSYW5nZU9mZnNldDogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdzZWdDb3VudCcpLFxuICAgIGdseXBoSW5kZXhBcnJheTogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS51aW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gKHQubGVuZ3RoIC0gdC5fY3VycmVudE9mZnNldCkgLyAyO1xuICAgIH0pXG4gIH0sXG4gIDY6IHtcbiAgICAvLyBUcmltbWVkIHRhYmxlXG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbGFuZ3VhZ2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBmaXJzdENvZGU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBlbnRyeUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZ2x5cGhJbmRpY2VzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ2VudHJ5Q291bnQnKVxuICB9LFxuICA4OiB7XG4gICAgLy8gbWl4ZWQgMTYtYml0IGFuZCAzMi1iaXQgY292ZXJhZ2VcbiAgICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgbGFuZ3VhZ2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBpczMyOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCA4MTkyKSxcbiAgICBuR3JvdXBzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZ3JvdXBzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KENtYXBHcm91cCwgJ25Hcm91cHMnKVxuICB9LFxuICAxMDoge1xuICAgIC8vIFRyaW1tZWQgQXJyYXlcbiAgICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgbGFuZ3VhZ2U6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBmaXJzdENvZGU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBlbnRyeUNvdW50OiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZ2x5cGhJbmRpY2VzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ251bUNoYXJzJylcbiAgfSxcbiAgMTI6IHtcbiAgICAvLyBTZWdtZW50ZWQgY292ZXJhZ2VcbiAgICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiksXG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgbGFuZ3VhZ2U6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBuR3JvdXBzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZ3JvdXBzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KENtYXBHcm91cCwgJ25Hcm91cHMnKVxuICB9LFxuICAxMzoge1xuICAgIC8vIE1hbnktdG8tb25lIHJhbmdlIG1hcHBpbmdzIChzYW1lIGFzIDEyIGV4Y2VwdCBmb3IgZ3JvdXAuc3RhcnRHbHlwaElEKVxuICAgIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBsYW5ndWFnZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIG5Hcm91cHM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBncm91cHM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkoQ21hcEdyb3VwLCAnbkdyb3VwcycpXG4gIH0sXG4gIDE0OiB7XG4gICAgLy8gVW5pY29kZSBWYXJpYXRpb24gU2VxdWVuY2VzXG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgbnVtUmVjb3JkczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIHZhclNlbGVjdG9yczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShWYXJTZWxlY3RvclJlY29yZCwgJ251bVJlY29yZHMnKVxuICB9XG59KTtcbnZhciBDbWFwRW50cnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgcGxhdGZvcm1JRDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBQbGF0Zm9ybSBpZGVudGlmaWVyXG4gIGVuY29kaW5nSUQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gUGxhdGZvcm0tc3BlY2lmaWMgZW5jb2RpbmcgaWRlbnRpZmllclxuICB0YWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBDbWFwU3VidGFibGUsIHtcbiAgICB0eXBlOiAncGFyZW50JyxcbiAgICBsYXp5OiB0cnVlXG4gIH0pXG59KTsgLy8gY2hhcmFjdGVyIHRvIGdseXBoIG1hcHBpbmdcblxudmFyIGNtYXAgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBudW1TdWJ0YWJsZXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdGFibGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQ21hcEVudHJ5LCAnbnVtU3VidGFibGVzJylcbn0pO1xuXG52YXIgaGVhZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS5pbnQzMixcbiAgLy8gMHgwMDAxMDAwMCAodmVyc2lvbiAxLjApXG4gIHJldmlzaW9uOiByZXN0cnVjdHVyZS5pbnQzMixcbiAgLy8gc2V0IGJ5IGZvbnQgbWFudWZhY3R1cmVyXG4gIGNoZWNrU3VtQWRqdXN0bWVudDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBtYWdpY051bWJlcjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAvLyBzZXQgdG8gMHg1RjBGM0NGNVxuICBmbGFnczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB1bml0c1BlckVtOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIHJhbmdlIGZyb20gNjQgdG8gMTYzODRcbiAgY3JlYXRlZDogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLmludDMyLCAyKSxcbiAgbW9kaWZpZWQ6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS5pbnQzMiwgMiksXG4gIHhNaW46IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBmb3IgYWxsIGdseXBoIGJvdW5kaW5nIGJveGVzXG4gIHlNaW46IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBmb3IgYWxsIGdseXBoIGJvdW5kaW5nIGJveGVzXG4gIHhNYXg6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBmb3IgYWxsIGdseXBoIGJvdW5kaW5nIGJveGVzXG4gIHlNYXg6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBmb3IgYWxsIGdseXBoIGJvdW5kaW5nIGJveGVzXG4gIG1hY1N0eWxlOiBuZXcgcmVzdHJ1Y3R1cmUuQml0ZmllbGQocmVzdHJ1Y3R1cmUudWludDE2LCBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdvdXRsaW5lJywgJ3NoYWRvdycsICdjb25kZW5zZWQnLCAnZXh0ZW5kZWQnXSksXG4gIGxvd2VzdFJlY1BQRU06IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gc21hbGxlc3QgcmVhZGFibGUgc2l6ZSBpbiBwaXhlbHNcbiAgZm9udERpcmVjdGlvbkhpbnQ6IHJlc3RydWN0dXJlLmludDE2LFxuICBpbmRleFRvTG9jRm9ybWF0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gMCBmb3Igc2hvcnQgb2Zmc2V0cywgMSBmb3IgbG9uZ1xuICBnbHlwaERhdGFGb3JtYXQ6IHJlc3RydWN0dXJlLmludDE2IC8vIDAgZm9yIGN1cnJlbnQgZm9ybWF0XG5cbn0pO1xuXG52YXIgaGhlYSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS5pbnQzMixcbiAgYXNjZW50OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gRGlzdGFuY2UgZnJvbSBiYXNlbGluZSBvZiBoaWdoZXN0IGFzY2VuZGVyXG4gIGRlc2NlbnQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBEaXN0YW5jZSBmcm9tIGJhc2VsaW5lIG9mIGxvd2VzdCBkZXNjZW5kZXJcbiAgbGluZUdhcDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIFR5cG9ncmFwaGljIGxpbmUgZ2FwXG4gIGFkdmFuY2VXaWR0aE1heDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBNYXhpbXVtIGFkdmFuY2Ugd2lkdGggdmFsdWUgaW4gJ2htdHgnIHRhYmxlXG4gIG1pbkxlZnRTaWRlQmVhcmluZzogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIE1heGltdW0gYWR2YW5jZSB3aWR0aCB2YWx1ZSBpbiAnaG10eCcgdGFibGVcbiAgbWluUmlnaHRTaWRlQmVhcmluZzogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIE1pbmltdW0gcmlnaHQgc2lkZWJlYXJpbmcgdmFsdWVcbiAgeE1heEV4dGVudDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIGNhcmV0U2xvcGVSaXNlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gVXNlZCB0byBjYWxjdWxhdGUgdGhlIHNsb3BlIG9mIHRoZSBjdXJzb3IgKHJpc2UvcnVuKTsgMSBmb3IgdmVydGljYWxcbiAgY2FyZXRTbG9wZVJ1bjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIDAgZm9yIHZlcnRpY2FsXG4gIGNhcmV0T2Zmc2V0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gU2V0IHRvIDAgZm9yIG5vbi1zbGFudGVkIGZvbnRzXG4gIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUuaW50MTYsIDQpLFxuICBtZXRyaWNEYXRhRm9ybWF0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gMCBmb3IgY3VycmVudCBmb3JtYXRcbiAgbnVtYmVyT2ZNZXRyaWNzOiByZXN0cnVjdHVyZS51aW50MTYgLy8gTnVtYmVyIG9mIGFkdmFuY2Ugd2lkdGhzIGluICdobXR4JyB0YWJsZVxuXG59KTtcblxudmFyIEhtdHhFbnRyeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBhZHZhbmNlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGJlYXJpbmc6IHJlc3RydWN0dXJlLmludDE2XG59KTtcbnZhciBobXR4ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG1ldHJpY3M6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkoSG10eEVudHJ5LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5oaGVhLm51bWJlck9mTWV0cmljcztcbiAgfSksXG4gIGJlYXJpbmdzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLmludDE2LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5tYXhwLm51bUdseXBocyAtIHQucGFyZW50LmhoZWEubnVtYmVyT2ZNZXRyaWNzO1xuICB9KVxufSk7XG5cbnZhciBtYXhwID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLmludDMyLFxuICBudW1HbHlwaHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIGZvbnRcbiAgbWF4UG9pbnRzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE1heGltdW0gcG9pbnRzIGluIGEgbm9uLWNvbXBvc2l0ZSBnbHlwaFxuICBtYXhDb250b3VyczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBNYXhpbXVtIGNvbnRvdXJzIGluIGEgbm9uLWNvbXBvc2l0ZSBnbHlwaFxuICBtYXhDb21wb25lbnRQb2ludHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTWF4aW11bSBwb2ludHMgaW4gYSBjb21wb3NpdGUgZ2x5cGhcbiAgbWF4Q29tcG9uZW50Q29udG91cnM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTWF4aW11bSBjb250b3VycyBpbiBhIGNvbXBvc2l0ZSBnbHlwaFxuICBtYXhab25lczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyAxIGlmIGluc3RydWN0aW9ucyBkbyBub3QgdXNlIHRoZSB0d2lsaWdodCB6b25lLCAyIG90aGVyd2lzZVxuICBtYXhUd2lsaWdodFBvaW50czogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBNYXhpbXVtIHBvaW50cyB1c2VkIGluIFowXG4gIG1heFN0b3JhZ2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTnVtYmVyIG9mIFN0b3JhZ2UgQXJlYSBsb2NhdGlvbnNcbiAgbWF4RnVuY3Rpb25EZWZzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE51bWJlciBvZiBGREVGc1xuICBtYXhJbnN0cnVjdGlvbkRlZnM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTnVtYmVyIG9mIElERUZzXG4gIG1heFN0YWNrRWxlbWVudHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTWF4aW11bSBzdGFjayBkZXB0aFxuICBtYXhTaXplT2ZJbnN0cnVjdGlvbnM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTWF4aW11bSBieXRlIGNvdW50IGZvciBnbHlwaCBpbnN0cnVjdGlvbnNcbiAgbWF4Q29tcG9uZW50RWxlbWVudHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTWF4aW11bSBudW1iZXIgb2YgY29tcG9uZW50cyByZWZlcmVuY2VkIGF0IOKAnHRvcCBsZXZlbOKAnSBmb3IgYW55IGNvbXBvc2l0ZSBnbHlwaFxuICBtYXhDb21wb25lbnREZXB0aDogcmVzdHJ1Y3R1cmUudWludDE2IC8vIE1heGltdW0gbGV2ZWxzIG9mIHJlY3Vyc2lvbjsgMSBmb3Igc2ltcGxlIGNvbXBvbmVudHNcblxufSk7XG5cbi8qKlxuICogR2V0cyBhbiBlbmNvZGluZyBuYW1lIGZyb20gcGxhdGZvcm0sIGVuY29kaW5nLCBhbmQgbGFuZ3VhZ2UgaWRzLlxuICogUmV0dXJuZWQgZW5jb2RpbmcgbmFtZXMgY2FuIGJlIHVzZWQgaW4gaWNvbnYtbGl0ZSB0byBkZWNvZGUgdGV4dC5cbiAqL1xuZnVuY3Rpb24gZ2V0RW5jb2RpbmcocGxhdGZvcm1JRCwgZW5jb2RpbmdJRCwgbGFuZ3VhZ2VJRCkge1xuICBpZiAobGFuZ3VhZ2VJRCA9PT0gdm9pZCAwKSB7XG4gICAgbGFuZ3VhZ2VJRCA9IDA7XG4gIH1cblxuICBpZiAocGxhdGZvcm1JRCA9PT0gMSAmJiBNQUNfTEFOR1VBR0VfRU5DT0RJTkdTW2xhbmd1YWdlSURdKSB7XG4gICAgcmV0dXJuIE1BQ19MQU5HVUFHRV9FTkNPRElOR1NbbGFuZ3VhZ2VJRF07XG4gIH1cblxuICByZXR1cm4gRU5DT0RJTkdTW3BsYXRmb3JtSURdW2VuY29kaW5nSURdO1xufSAvLyBNYXAgb2YgcGxhdGZvcm0gaWRzIHRvIGVuY29kaW5nIGlkcy5cblxudmFyIEVOQ09ESU5HUyA9IFsvLyB1bmljb2RlXG5bJ3V0ZjE2YmUnLCAndXRmMTZiZScsICd1dGYxNmJlJywgJ3V0ZjE2YmUnLCAndXRmMTZiZScsICd1dGYxNmJlJ10sIC8vIG1hY2ludG9zaFxuLy8gTWFwcGluZ3MgYXZhaWxhYmxlIGF0IGh0dHA6Ly91bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9BUFBMRS9cbi8vIDBcdFJvbWFuICAgICAgICAgICAgICAgICAxN1x0TWFsYXlhbGFtXG4vLyAxXHRKYXBhbmVzZVx0ICAgICAgICAgICAgMThcdFNpbmhhbGVzZVxuLy8gMlx0VHJhZGl0aW9uYWwgQ2hpbmVzZVx0ICAxOVx0QnVybWVzZVxuLy8gM1x0S29yZWFuXHQgICAgICAgICAgICAgIDIwXHRLaG1lclxuLy8gNFx0QXJhYmljXHQgICAgICAgICAgICAgIDIxXHRUaGFpXG4vLyA1XHRIZWJyZXdcdCAgICAgICAgICAgICAgMjJcdExhb3RpYW5cbi8vIDZcdEdyZWVrXHQgICAgICAgICAgICAgICAgMjNcdEdlb3JnaWFuXG4vLyA3XHRSdXNzaWFuXHQgICAgICAgICAgICAgIDI0XHRBcm1lbmlhblxuLy8gOFx0UlN5bWJvbFx0ICAgICAgICAgICAgICAyNVx0U2ltcGxpZmllZCBDaGluZXNlXG4vLyA5XHREZXZhbmFnYXJpXHQgICAgICAgICAgMjZcdFRpYmV0YW5cbi8vIDEwXHRHdXJtdWtoaVx0ICAgICAgICAgICAgMjdcdE1vbmdvbGlhblxuLy8gMTFcdEd1amFyYXRpXHQgICAgICAgICAgICAyOFx0R2VlelxuLy8gMTJcdE9yaXlhXHQgICAgICAgICAgICAgICAgMjlcdFNsYXZpY1xuLy8gMTNcdEJlbmdhbGlcdCAgICAgICAgICAgICAgMzBcdFZpZXRuYW1lc2Vcbi8vIDE0XHRUYW1pbFx0ICAgICAgICAgICAgICAgIDMxXHRTaW5kaGlcbi8vIDE1XHRUZWx1Z3VcdCAgICAgICAgICAgICAgMzJcdChVbmludGVycHJldGVkKVxuLy8gMTZcdEthbm5hZGFcblsnbWFjcm9tYW4nLCAnc2hpZnQtamlzJywgJ2JpZzUnLCAnZXVjLWtyJywgJ2lzby04ODU5LTYnLCAnaXNvLTg4NTktOCcsICdtYWNncmVlaycsICdtYWNjeXJpbGxpYycsICdzeW1ib2wnLCAnRGV2YW5hZ2FyaScsICdHdXJtdWtoaScsICdHdWphcmF0aScsICdPcml5YScsICdCZW5nYWxpJywgJ1RhbWlsJywgJ1RlbHVndScsICdLYW5uYWRhJywgJ01hbGF5YWxhbScsICdTaW5oYWxlc2UnLCAnQnVybWVzZScsICdLaG1lcicsICdtYWN0aGFpJywgJ0xhb3RpYW4nLCAnR2VvcmdpYW4nLCAnQXJtZW5pYW4nLCAnZ2ItMjMxMi04MCcsICdUaWJldGFuJywgJ01vbmdvbGlhbicsICdHZWV6JywgJ21hY2NlbnRldXJvJywgJ1ZpZXRuYW1lc2UnLCAnU2luZGhpJ10sIC8vIElTTyAoZGVwcmVjYXRlZClcblsnYXNjaWknXSwgLy8gd2luZG93c1xuLy8gRG9jcyBoZXJlOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvc3lzdGVtLnRleHQuZW5jb2Rpbmcodj12cy4xMTApLmFzcHhcblsnc3ltYm9sJywgJ3V0ZjE2YmUnLCAnc2hpZnQtamlzJywgJ2diMTgwMzAnLCAnYmlnNScsICd3YW5zdW5nJywgJ2pvaGFiJywgbnVsbCwgbnVsbCwgbnVsbCwgJ3V0ZjE2YmUnXV07IC8vIE92ZXJyaWRlcyBmb3IgTWFjIHNjcmlwdHMgYnkgbGFuZ3VhZ2UgaWQuXG4vLyBTZWUgaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL0FQUExFL1JlYWRtZS50eHRcblxudmFyIE1BQ19MQU5HVUFHRV9FTkNPRElOR1MgPSB7XG4gIDE1OiAnbWFjaWNlbGFuZCcsXG4gIDE3OiAnbWFjdHVya2lzaCcsXG4gIDE4OiAnbWFjY3JvYXRpYW4nLFxuICAyNDogJ21hY2NlbnRldXJvJyxcbiAgMjU6ICdtYWNjZW50ZXVybycsXG4gIDI2OiAnbWFjY2VudGV1cm8nLFxuICAyNzogJ21hY2NlbnRldXJvJyxcbiAgMjg6ICdtYWNjZW50ZXVybycsXG4gIDMwOiAnbWFjaWNlbGFuZCcsXG4gIDM3OiAnbWFjcm9tYW5pYScsXG4gIDM4OiAnbWFjY2VudGV1cm8nLFxuICAzOTogJ21hY2NlbnRldXJvJyxcbiAgNDA6ICdtYWNjZW50ZXVybycsXG4gIDE0MzogJ21hY2ludWl0JyxcbiAgLy8gVW5zdXBwb3J0ZWQgYnkgaWNvbnYtbGl0ZVxuICAxNDY6ICdtYWNnYWVsaWMnIC8vIFVuc3VwcG9ydGVkIGJ5IGljb252LWxpdGVcblxufTsgLy8gTWFwIG9mIHBsYXRmb3JtIGlkcyB0byBCQ1AtNDcgbGFuZ3VhZ2UgY29kZXMuXG5cbnZhciBMQU5HVUFHRVMgPSBbLy8gdW5pY29kZVxuW10sIHtcbiAgLy8gbWFjaW50b3NoXG4gIDA6ICdlbicsXG4gIDMwOiAnZm8nLFxuICA2MDogJ2tzJyxcbiAgOTA6ICdydycsXG4gIDE6ICdmcicsXG4gIDMxOiAnZmEnLFxuICA2MTogJ2t1JyxcbiAgOTE6ICdybicsXG4gIDI6ICdkZScsXG4gIDMyOiAncnUnLFxuICA2MjogJ3NkJyxcbiAgOTI6ICdueScsXG4gIDM6ICdpdCcsXG4gIDMzOiAnemgnLFxuICA2MzogJ2JvJyxcbiAgOTM6ICdtZycsXG4gIDQ6ICdubCcsXG4gIDM0OiAnbmwtQkUnLFxuICA2NDogJ25lJyxcbiAgOTQ6ICdlbycsXG4gIDU6ICdzdicsXG4gIDM1OiAnZ2EnLFxuICA2NTogJ3NhJyxcbiAgMTI4OiAnY3knLFxuICA2OiAnZXMnLFxuICAzNjogJ3NxJyxcbiAgNjY6ICdtcicsXG4gIDEyOTogJ2V1JyxcbiAgNzogJ2RhJyxcbiAgMzc6ICdybycsXG4gIDY3OiAnYm4nLFxuICAxMzA6ICdjYScsXG4gIDg6ICdwdCcsXG4gIDM4OiAnY3onLFxuICA2ODogJ2FzJyxcbiAgMTMxOiAnbGEnLFxuICA5OiAnbm8nLFxuICAzOTogJ3NrJyxcbiAgNjk6ICdndScsXG4gIDEzMjogJ3F1JyxcbiAgMTA6ICdoZScsXG4gIDQwOiAnc2knLFxuICA3MDogJ3BhJyxcbiAgMTMzOiAnZ24nLFxuICAxMTogJ2phJyxcbiAgNDE6ICd5aScsXG4gIDcxOiAnb3InLFxuICAxMzQ6ICdheScsXG4gIDEyOiAnYXInLFxuICA0MjogJ3NyJyxcbiAgNzI6ICdtbCcsXG4gIDEzNTogJ3R0JyxcbiAgMTM6ICdmaScsXG4gIDQzOiAnbWsnLFxuICA3MzogJ2tuJyxcbiAgMTM2OiAndWcnLFxuICAxNDogJ2VsJyxcbiAgNDQ6ICdiZycsXG4gIDc0OiAndGEnLFxuICAxMzc6ICdkeicsXG4gIDE1OiAnaXMnLFxuICA0NTogJ3VrJyxcbiAgNzU6ICd0ZScsXG4gIDEzODogJ2p2JyxcbiAgMTY6ICdtdCcsXG4gIDQ2OiAnYmUnLFxuICA3NjogJ3NpJyxcbiAgMTM5OiAnc3UnLFxuICAxNzogJ3RyJyxcbiAgNDc6ICd1eicsXG4gIDc3OiAnbXknLFxuICAxNDA6ICdnbCcsXG4gIDE4OiAnaHInLFxuICA0ODogJ2trJyxcbiAgNzg6ICdrbScsXG4gIDE0MTogJ2FmJyxcbiAgMTk6ICd6aC1IYW50JyxcbiAgNDk6ICdhei1DeXJsJyxcbiAgNzk6ICdsbycsXG4gIDE0MjogJ2JyJyxcbiAgMjA6ICd1cicsXG4gIDUwOiAnYXotQXJhYicsXG4gIDgwOiAndmknLFxuICAxNDM6ICdpdScsXG4gIDIxOiAnaGknLFxuICA1MTogJ2h5JyxcbiAgODE6ICdpZCcsXG4gIDE0NDogJ2dkJyxcbiAgMjI6ICd0aCcsXG4gIDUyOiAna2EnLFxuICA4MjogJ3RsJyxcbiAgMTQ1OiAnZ3YnLFxuICAyMzogJ2tvJyxcbiAgNTM6ICdtbycsXG4gIDgzOiAnbXMnLFxuICAxNDY6ICdnYScsXG4gIDI0OiAnbHQnLFxuICA1NDogJ2t5JyxcbiAgODQ6ICdtcy1BcmFiJyxcbiAgMTQ3OiAndG8nLFxuICAyNTogJ3BsJyxcbiAgNTU6ICd0ZycsXG4gIDg1OiAnYW0nLFxuICAxNDg6ICdlbC1wb2x5dG9uJyxcbiAgMjY6ICdodScsXG4gIDU2OiAndGsnLFxuICA4NjogJ3RpJyxcbiAgMTQ5OiAna2wnLFxuICAyNzogJ2VzJyxcbiAgNTc6ICdtbi1DTicsXG4gIDg3OiAnb20nLFxuICAxNTA6ICdheicsXG4gIDI4OiAnbHYnLFxuICA1ODogJ21uJyxcbiAgODg6ICdzbycsXG4gIDE1MTogJ25uJyxcbiAgMjk6ICdzZScsXG4gIDU5OiAncHMnLFxuICA4OTogJ3N3J1xufSwgLy8gSVNPIChkZXByZWNhdGVkKVxuW10sIHtcbiAgLy8gd2luZG93cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgMHgwNDM2OiAnYWYnLFxuICAweDQwMDk6ICdlbi1JTicsXG4gIDB4MDQ4NzogJ3J3JyxcbiAgMHgwNDMyOiAndG4nLFxuICAweDA0MUM6ICdzcScsXG4gIDB4MTgwOTogJ2VuLUlFJyxcbiAgMHgwNDQxOiAnc3cnLFxuICAweDA0NUI6ICdzaScsXG4gIDB4MDQ4NDogJ2dzdycsXG4gIDB4MjAwOTogJ2VuLUpNJyxcbiAgMHgwNDU3OiAna29rJyxcbiAgMHgwNDFCOiAnc2snLFxuICAweDA0NUU6ICdhbScsXG4gIDB4NDQwOTogJ2VuLU1ZJyxcbiAgMHgwNDEyOiAna28nLFxuICAweDA0MjQ6ICdzbCcsXG4gIDB4MTQwMTogJ2FyLURaJyxcbiAgMHgxNDA5OiAnZW4tTlonLFxuICAweDA0NDA6ICdreScsXG4gIDB4MkMwQTogJ2VzLUFSJyxcbiAgMHgzQzAxOiAnYXItQkgnLFxuICAweDM0MDk6ICdlbi1QSCcsXG4gIDB4MDQ1NDogJ2xvJyxcbiAgMHg0MDBBOiAnZXMtQk8nLFxuICAweDBDMDE6ICdhcicsXG4gIDB4NDgwOTogJ2VuLVNHJyxcbiAgMHgwNDI2OiAnbHYnLFxuICAweDM0MEE6ICdlcy1DTCcsXG4gIDB4MDgwMTogJ2FyLUlRJyxcbiAgMHgxQzA5OiAnZW4tWkEnLFxuICAweDA0Mjc6ICdsdCcsXG4gIDB4MjQwQTogJ2VzLUNPJyxcbiAgMHgyQzAxOiAnYXItSk8nLFxuICAweDJDMDk6ICdlbi1UVCcsXG4gIDB4MDgyRTogJ2RzYicsXG4gIDB4MTQwQTogJ2VzLUNSJyxcbiAgMHgzNDAxOiAnYXItS1cnLFxuICAweDA4MDk6ICdlbi1HQicsXG4gIDB4MDQ2RTogJ2xiJyxcbiAgMHgxQzBBOiAnZXMtRE8nLFxuICAweDMwMDE6ICdhci1MQicsXG4gIDB4MDQwOTogJ2VuJyxcbiAgMHgwNDJGOiAnbWsnLFxuICAweDMwMEE6ICdlcy1FQycsXG4gIDB4MTAwMTogJ2FyLUxZJyxcbiAgMHgzMDA5OiAnZW4tWlcnLFxuICAweDA4M0U6ICdtcy1CTicsXG4gIDB4NDQwQTogJ2VzLVNWJyxcbiAgMHgxODAxOiAnYXJ5JyxcbiAgMHgwNDI1OiAnZXQnLFxuICAweDA0M0U6ICdtcycsXG4gIDB4MTAwQTogJ2VzLUdUJyxcbiAgMHgyMDAxOiAnYXItT00nLFxuICAweDA0Mzg6ICdmbycsXG4gIDB4MDQ0QzogJ21sJyxcbiAgMHg0ODBBOiAnZXMtSE4nLFxuICAweDQwMDE6ICdhci1RQScsXG4gIDB4MDQ2NDogJ2ZpbCcsXG4gIDB4MDQzQTogJ210JyxcbiAgMHgwODBBOiAnZXMtTVgnLFxuICAweDA0MDE6ICdhci1TQScsXG4gIDB4MDQwQjogJ2ZpJyxcbiAgMHgwNDgxOiAnbWknLFxuICAweDRDMEE6ICdlcy1OSScsXG4gIDB4MjgwMTogJ2FyLVNZJyxcbiAgMHgwODBDOiAnZnItQkUnLFxuICAweDA0N0E6ICdhcm4nLFxuICAweDE4MEE6ICdlcy1QQScsXG4gIDB4MUMwMTogJ2FlYicsXG4gIDB4MEMwQzogJ2ZyLUNBJyxcbiAgMHgwNDRFOiAnbXInLFxuICAweDNDMEE6ICdlcy1QWScsXG4gIDB4MzgwMTogJ2FyLUFFJyxcbiAgMHgwNDBDOiAnZnInLFxuICAweDA0N0M6ICdtb2gnLFxuICAweDI4MEE6ICdlcy1QRScsXG4gIDB4MjQwMTogJ2FyLVlFJyxcbiAgMHgxNDBDOiAnZnItTFUnLFxuICAweDA0NTA6ICdtbicsXG4gIDB4NTAwQTogJ2VzLVBSJyxcbiAgMHgwNDJCOiAnaHknLFxuICAweDE4MEM6ICdmci1NQycsXG4gIDB4MDg1MDogJ21uLUNOJyxcbiAgMHgwQzBBOiAnZXMnLFxuICAweDA0NEQ6ICdhcycsXG4gIDB4MTAwQzogJ2ZyLUNIJyxcbiAgMHgwNDYxOiAnbmUnLFxuICAweDA0MEE6ICdlcycsXG4gIDB4MDgyQzogJ2F6LUN5cmwnLFxuICAweDA0NjI6ICdmeScsXG4gIDB4MDQxNDogJ25iJyxcbiAgMHg1NDBBOiAnZXMtVVMnLFxuICAweDA0MkM6ICdheicsXG4gIDB4MDQ1NjogJ2dsJyxcbiAgMHgwODE0OiAnbm4nLFxuICAweDM4MEE6ICdlcy1VWScsXG4gIDB4MDQ2RDogJ2JhJyxcbiAgMHgwNDM3OiAna2EnLFxuICAweDA0ODI6ICdvYycsXG4gIDB4MjAwQTogJ2VzLVZFJyxcbiAgMHgwNDJEOiAnZXUnLFxuICAweDBDMDc6ICdkZS1BVCcsXG4gIDB4MDQ0ODogJ29yJyxcbiAgMHgwODFEOiAnc3YtRkknLFxuICAweDA0MjM6ICdiZScsXG4gIDB4MDQwNzogJ2RlJyxcbiAgMHgwNDYzOiAncHMnLFxuICAweDA0MUQ6ICdzdicsXG4gIDB4MDg0NTogJ2JuJyxcbiAgMHgxNDA3OiAnZGUtTEknLFxuICAweDA0MTU6ICdwbCcsXG4gIDB4MDQ1QTogJ3N5cicsXG4gIDB4MDQ0NTogJ2JuLUlOJyxcbiAgMHgxMDA3OiAnZGUtTFUnLFxuICAweDA0MTY6ICdwdCcsXG4gIDB4MDQyODogJ3RnJyxcbiAgMHgyMDFBOiAnYnMtQ3lybCcsXG4gIDB4MDgwNzogJ2RlLUNIJyxcbiAgMHgwODE2OiAncHQtUFQnLFxuICAweDA4NUY6ICd0em0nLFxuICAweDE0MUE6ICdicycsXG4gIDB4MDQwODogJ2VsJyxcbiAgMHgwNDQ2OiAncGEnLFxuICAweDA0NDk6ICd0YScsXG4gIDB4MDQ3RTogJ2JyJyxcbiAgMHgwNDZGOiAna2wnLFxuICAweDA0NkI6ICdxdS1CTycsXG4gIDB4MDQ0NDogJ3R0JyxcbiAgMHgwNDAyOiAnYmcnLFxuICAweDA0NDc6ICdndScsXG4gIDB4MDg2QjogJ3F1LUVDJyxcbiAgMHgwNDRBOiAndGUnLFxuICAweDA0MDM6ICdjYScsXG4gIDB4MDQ2ODogJ2hhJyxcbiAgMHgwQzZCOiAncXUnLFxuICAweDA0MUU6ICd0aCcsXG4gIDB4MEMwNDogJ3poLUhLJyxcbiAgMHgwNDBEOiAnaGUnLFxuICAweDA0MTg6ICdybycsXG4gIDB4MDQ1MTogJ2JvJyxcbiAgMHgxNDA0OiAnemgtTU8nLFxuICAweDA0Mzk6ICdoaScsXG4gIDB4MDQxNzogJ3JtJyxcbiAgMHgwNDFGOiAndHInLFxuICAweDA4MDQ6ICd6aCcsXG4gIDB4MDQwRTogJ2h1JyxcbiAgMHgwNDE5OiAncnUnLFxuICAweDA0NDI6ICd0aycsXG4gIDB4MTAwNDogJ3poLVNHJyxcbiAgMHgwNDBGOiAnaXMnLFxuICAweDI0M0I6ICdzbW4nLFxuICAweDA0ODA6ICd1ZycsXG4gIDB4MDQwNDogJ3poLVRXJyxcbiAgMHgwNDcwOiAnaWcnLFxuICAweDEwM0I6ICdzbWotTk8nLFxuICAweDA0MjI6ICd1aycsXG4gIDB4MDQ4MzogJ2NvJyxcbiAgMHgwNDIxOiAnaWQnLFxuICAweDE0M0I6ICdzbWonLFxuICAweDA0MkU6ICdoc2InLFxuICAweDA0MUE6ICdocicsXG4gIDB4MDQ1RDogJ2l1JyxcbiAgMHgwQzNCOiAnc2UtRkknLFxuICAweDA0MjA6ICd1cicsXG4gIDB4MTAxQTogJ2hyLUJBJyxcbiAgMHgwODVEOiAnaXUtTGF0bicsXG4gIDB4MDQzQjogJ3NlJyxcbiAgMHgwODQzOiAndXotQ3lybCcsXG4gIDB4MDQwNTogJ2NzJyxcbiAgMHgwODNDOiAnZ2EnLFxuICAweDA4M0I6ICdzZS1TRScsXG4gIDB4MDQ0MzogJ3V6JyxcbiAgMHgwNDA2OiAnZGEnLFxuICAweDA0MzQ6ICd4aCcsXG4gIDB4MjAzQjogJ3NtcycsXG4gIDB4MDQyQTogJ3ZpJyxcbiAgMHgwNDhDOiAncHJzJyxcbiAgMHgwNDM1OiAnenUnLFxuICAweDE4M0I6ICdzbWEtTk8nLFxuICAweDA0NTI6ICdjeScsXG4gIDB4MDQ2NTogJ2R2JyxcbiAgMHgwNDEwOiAnaXQnLFxuICAweDFDM0I6ICdzbXMnLFxuICAweDA0ODg6ICd3bycsXG4gIDB4MDgxMzogJ25sLUJFJyxcbiAgMHgwODEwOiAnaXQtQ0gnLFxuICAweDA0NEY6ICdzYScsXG4gIDB4MDQ4NTogJ3NhaCcsXG4gIDB4MDQxMzogJ25sJyxcbiAgMHgwNDExOiAnamEnLFxuICAweDFDMUE6ICdzci1DeXJsLUJBJyxcbiAgMHgwNDc4OiAnaWknLFxuICAweDBDMDk6ICdlbi1BVScsXG4gIDB4MDQ0QjogJ2tuJyxcbiAgMHgwQzFBOiAnc3InLFxuICAweDA0NkE6ICd5bycsXG4gIDB4MjgwOTogJ2VuLUJaJyxcbiAgMHgwNDNGOiAna2snLFxuICAweDE4MUE6ICdzci1MYXRuLUJBJyxcbiAgMHgxMDA5OiAnZW4tQ0EnLFxuICAweDA0NTM6ICdrbScsXG4gIDB4MDgxQTogJ3NyLUxhdG4nLFxuICAweDI0MDk6ICdlbi0wMjknLFxuICAweDA0ODY6ICdxdWMnLFxuICAweDA0NkM6ICduc28nXG59XTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZShvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxudmFyIE5hbWVSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgcGxhdGZvcm1JRDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBlbmNvZGluZ0lEOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxhbmd1YWdlSUQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbmFtZUlEOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzdHJpbmc6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgbmV3IHJlc3RydWN0dXJlLlN0cmluZygnbGVuZ3RoJywgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gZ2V0RW5jb2RpbmcodC5wbGF0Zm9ybUlELCB0LmVuY29kaW5nSUQsIHQubGFuZ3VhZ2VJRCk7XG4gIH0pLCB7XG4gICAgdHlwZTogJ3BhcmVudCcsXG4gICAgcmVsYXRpdmVUbzogJ3BhcmVudC5zdHJpbmdPZmZzZXQnLFxuICAgIGFsbG93TnVsbDogZmFsc2VcbiAgfSlcbn0pO1xudmFyIExhbmdUYWdSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKCdsZW5ndGgnLCAndXRmMTZiZScpLCB7XG4gICAgdHlwZTogJ3BhcmVudCcsXG4gICAgcmVsYXRpdmVUbzogJ3N0cmluZ09mZnNldCdcbiAgfSlcbn0pO1xudmFyIE5hbWVUYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIDA6IHtcbiAgICBjb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHN0cmluZ09mZnNldDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShOYW1lUmVjb3JkLCAnY291bnQnKVxuICB9LFxuICAxOiB7XG4gICAgY291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBzdHJpbmdPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICByZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTmFtZVJlY29yZCwgJ2NvdW50JyksXG4gICAgbGFuZ1RhZ0NvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbGFuZ1RhZ3M6IG5ldyByZXN0cnVjdHVyZS5BcnJheShMYW5nVGFnUmVjb3JkLCAnbGFuZ1RhZ0NvdW50JylcbiAgfVxufSk7XG52YXIgTkFNRVMgPSBbJ2NvcHlyaWdodCcsICdmb250RmFtaWx5JywgJ2ZvbnRTdWJmYW1pbHknLCAndW5pcXVlU3ViZmFtaWx5JywgJ2Z1bGxOYW1lJywgJ3ZlcnNpb24nLCAncG9zdHNjcmlwdE5hbWUnLCAvLyBOb3RlOiBBIGZvbnQgbWF5IGhhdmUgb25seSBvbmUgUG9zdFNjcmlwdCBuYW1lIGFuZCB0aGF0IG5hbWUgbXVzdCBiZSBBU0NJSS5cbid0cmFkZW1hcmsnLCAnbWFudWZhY3R1cmVyJywgJ2Rlc2lnbmVyJywgJ2Rlc2NyaXB0aW9uJywgJ3ZlbmRvclVSTCcsICdkZXNpZ25lclVSTCcsICdsaWNlbnNlJywgJ2xpY2Vuc2VVUkwnLCBudWxsLCAvLyByZXNlcnZlZFxuJ3ByZWZlcnJlZEZhbWlseScsICdwcmVmZXJyZWRTdWJmYW1pbHknLCAnY29tcGF0aWJsZUZ1bGwnLCAnc2FtcGxlVGV4dCcsICdwb3N0c2NyaXB0Q0lERm9udE5hbWUnLCAnd3dzRmFtaWx5TmFtZScsICd3d3NTdWJmYW1pbHlOYW1lJ107XG5cbk5hbWVUYWJsZS5wcm9jZXNzID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgcmVjb3JkcyA9IHt9O1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UodGhpcy5yZWNvcmRzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgcmVjb3JkID0gX3N0ZXAudmFsdWU7XG4gICAgLy8gZmluZCBvdXQgd2hhdCBsYW5ndWFnZSB0aGlzIGlzIGZvclxuICAgIHZhciBsYW5ndWFnZSA9IExBTkdVQUdFU1tyZWNvcmQucGxhdGZvcm1JRF1bcmVjb3JkLmxhbmd1YWdlSURdO1xuXG4gICAgaWYgKGxhbmd1YWdlID09IG51bGwgJiYgdGhpcy5sYW5nVGFncyAhPSBudWxsICYmIHJlY29yZC5sYW5ndWFnZUlEID49IDB4ODAwMCkge1xuICAgICAgbGFuZ3VhZ2UgPSB0aGlzLmxhbmdUYWdzW3JlY29yZC5sYW5ndWFnZUlEIC0gMHg4MDAwXS50YWc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmd1YWdlID09IG51bGwpIHtcbiAgICAgIGxhbmd1YWdlID0gcmVjb3JkLnBsYXRmb3JtSUQgKyAnLScgKyByZWNvcmQubGFuZ3VhZ2VJRDtcbiAgICB9IC8vIGlmIHRoZSBuYW1lSUQgaXMgPj0gMjU2LCBpdCBpcyBhIGZvbnQgZmVhdHVyZSByZWNvcmQgKEFBVClcblxuXG4gICAgdmFyIGtleSA9IHJlY29yZC5uYW1lSUQgPj0gMjU2ID8gJ2ZvbnRGZWF0dXJlcycgOiBOQU1FU1tyZWNvcmQubmFtZUlEXSB8fCByZWNvcmQubmFtZUlEO1xuXG4gICAgaWYgKHJlY29yZHNba2V5XSA9PSBudWxsKSB7XG4gICAgICByZWNvcmRzW2tleV0gPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgb2JqID0gcmVjb3Jkc1trZXldO1xuXG4gICAgaWYgKHJlY29yZC5uYW1lSUQgPj0gMjU2KSB7XG4gICAgICBvYmogPSBvYmpbcmVjb3JkLm5hbWVJRF0gfHwgKG9ialtyZWNvcmQubmFtZUlEXSA9IHt9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlY29yZC5zdHJpbmcgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvYmpbbGFuZ3VhZ2VdICE9PSAnc3RyaW5nJykge1xuICAgICAgb2JqW2xhbmd1YWdlXSA9IHJlY29yZC5zdHJpbmc7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5yZWNvcmRzID0gcmVjb3Jkcztcbn07XG5cbk5hbWVUYWJsZS5wcmVFbmNvZGUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHRoaXMucmVjb3JkcykpIHJldHVybjtcbiAgdGhpcy52ZXJzaW9uID0gMDtcbiAgdmFyIHJlY29yZHMgPSBbXTtcblxuICBmb3IgKHZhciBrZXkgaW4gdGhpcy5yZWNvcmRzKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMucmVjb3Jkc1trZXldO1xuICAgIGlmIChrZXkgPT09ICdmb250RmVhdHVyZXMnKSBjb250aW51ZTtcbiAgICByZWNvcmRzLnB1c2goe1xuICAgICAgcGxhdGZvcm1JRDogMyxcbiAgICAgIGVuY29kaW5nSUQ6IDEsXG4gICAgICBsYW5ndWFnZUlEOiAweDQwOSxcbiAgICAgIG5hbWVJRDogTkFNRVMuaW5kZXhPZihrZXkpLFxuICAgICAgbGVuZ3RoOiBidWZmZXJfMS5ieXRlTGVuZ3RoKHZhbC5lbiwgJ3V0ZjE2bGUnKSxcbiAgICAgIHN0cmluZzogdmFsLmVuXG4gICAgfSk7XG5cbiAgICBpZiAoa2V5ID09PSAncG9zdHNjcmlwdE5hbWUnKSB7XG4gICAgICByZWNvcmRzLnB1c2goe1xuICAgICAgICBwbGF0Zm9ybUlEOiAxLFxuICAgICAgICBlbmNvZGluZ0lEOiAwLFxuICAgICAgICBsYW5ndWFnZUlEOiAwLFxuICAgICAgICBuYW1lSUQ6IE5BTUVTLmluZGV4T2Yoa2V5KSxcbiAgICAgICAgbGVuZ3RoOiB2YWwuZW4ubGVuZ3RoLFxuICAgICAgICBzdHJpbmc6IHZhbC5lblxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5yZWNvcmRzID0gcmVjb3JkcztcbiAgdGhpcy5jb3VudCA9IHJlY29yZHMubGVuZ3RoO1xuICB0aGlzLnN0cmluZ09mZnNldCA9IE5hbWVUYWJsZS5zaXplKHRoaXMsIG51bGwsIGZhbHNlKTtcbn07XG5cbnZhciBPUzIgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICBoZWFkZXI6IHtcbiAgICB4QXZnQ2hhcldpZHRoOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyBhdmVyYWdlIHdlaWdodGVkIGFkdmFuY2Ugd2lkdGggb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIGFuZCBzcGFjZVxuICAgIHVzV2VpZ2h0Q2xhc3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyB2aXN1YWwgd2VpZ2h0IG9mIHN0cm9rZSBpbiBnbHlwaHNcbiAgICB1c1dpZHRoQ2xhc3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyByZWxhdGl2ZSBjaGFuZ2UgZnJvbSB0aGUgbm9ybWFsIGFzcGVjdCByYXRpbyAod2lkdGggdG8gaGVpZ2h0IHJhdGlvKVxuICAgIGZzVHlwZTogbmV3IHJlc3RydWN0dXJlLkJpdGZpZWxkKHJlc3RydWN0dXJlLnVpbnQxNiwgWy8vIEluZGljYXRlcyBmb250IGVtYmVkZGluZyBsaWNlbnNpbmcgcmlnaHRzXG4gICAgbnVsbCwgJ25vRW1iZWRkaW5nJywgJ3ZpZXdPbmx5JywgJ2VkaXRhYmxlJywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgJ25vU3Vic2V0dGluZycsICdiaXRtYXBPbmx5J10pLFxuICAgIHlTdWJzY3JpcHRYU2l6ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gcmVjb21tZW5kZWQgaG9yaXpvbnRhbCBzaXplIGluIHBpeGVscyBmb3Igc3Vic2NyaXB0c1xuICAgIHlTdWJzY3JpcHRZU2l6ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gcmVjb21tZW5kZWQgdmVydGljYWwgc2l6ZSBpbiBwaXhlbHMgZm9yIHN1YnNjcmlwdHNcbiAgICB5U3Vic2NyaXB0WE9mZnNldDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gcmVjb21tZW5kZWQgaG9yaXpvbnRhbCBvZmZzZXQgZm9yIHN1YnNjcmlwdHNcbiAgICB5U3Vic2NyaXB0WU9mZnNldDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gcmVjb21tZW5kZWQgdmVydGljYWwgb2Zmc2V0IGZvcm0gdGhlIGJhc2VsaW5lIGZvciBzdWJzY3JpcHRzXG4gICAgeVN1cGVyc2NyaXB0WFNpemU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIHJlY29tbWVuZGVkIGhvcml6b250YWwgc2l6ZSBpbiBwaXhlbHMgZm9yIHN1cGVyc2NyaXB0c1xuICAgIHlTdXBlcnNjcmlwdFlTaXplOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyByZWNvbW1lbmRlZCB2ZXJ0aWNhbCBzaXplIGluIHBpeGVscyBmb3Igc3VwZXJzY3JpcHRzXG4gICAgeVN1cGVyc2NyaXB0WE9mZnNldDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gcmVjb21tZW5kZWQgaG9yaXpvbnRhbCBvZmZzZXQgZm9yIHN1cGVyc2NyaXB0c1xuICAgIHlTdXBlcnNjcmlwdFlPZmZzZXQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIHJlY29tbWVuZGVkIHZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBiYXNlbGluZSBmb3Igc3VwZXJzY3JpcHRzXG4gICAgeVN0cmlrZW91dFNpemU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIHdpZHRoIG9mIHRoZSBzdHJpa2VvdXQgc3Ryb2tlXG4gICAgeVN0cmlrZW91dFBvc2l0aW9uOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICAvLyBwb3NpdGlvbiBvZiB0aGUgc3RyaWtlb3V0IHN0cm9rZSByZWxhdGl2ZSB0byB0aGUgYmFzZWxpbmVcbiAgICBzRmFtaWx5Q2xhc3M6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIGNsYXNzaWZpY2F0aW9uIG9mIGZvbnQtZmFtaWx5IGRlc2lnblxuICAgIHBhbm9zZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCAxMCksXG4gICAgLy8gZGVzY3JpYmUgdGhlIHZpc3VhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBnaXZlbiB0eXBlZmFjZVxuICAgIHVsQ2hhclJhbmdlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDMyLCA0KSxcbiAgICB2ZW5kb3JJRDogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgICAvLyBmb3VyIGNoYXJhY3RlciBpZGVudGlmaWVyIGZvciB0aGUgZm9udCB2ZW5kb3JcbiAgICBmc1NlbGVjdGlvbjogbmV3IHJlc3RydWN0dXJlLkJpdGZpZWxkKHJlc3RydWN0dXJlLnVpbnQxNiwgWy8vIGJpdCBmaWVsZCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmb250XG4gICAgJ2l0YWxpYycsICd1bmRlcnNjb3JlJywgJ25lZ2F0aXZlJywgJ291dGxpbmVkJywgJ3N0cmlrZW91dCcsICdib2xkJywgJ3JlZ3VsYXInLCAndXNlVHlwb01ldHJpY3MnLCAnd3dzJywgJ29ibGlxdWUnXSksXG4gICAgdXNGaXJzdENoYXJJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIFRoZSBtaW5pbXVtIFVuaWNvZGUgaW5kZXggaW4gdGhpcyBmb250XG4gICAgdXNMYXN0Q2hhckluZGV4OiByZXN0cnVjdHVyZS51aW50MTYgLy8gVGhlIG1heGltdW0gVW5pY29kZSBpbmRleCBpbiB0aGlzIGZvbnRcblxuICB9LFxuICAvLyBUaGUgQXBwbGUgdmVyc2lvbiBvZiB0aGlzIHRhYmxlIGVuZHMgaGVyZSwgYnV0IHRoZSBNaWNyb3NvZnQgb25lIGNvbnRpbnVlcyBvbi4uLlxuICAwOiB7fSxcbiAgMToge1xuICAgIHR5cG9Bc2NlbmRlcjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgdHlwb0Rlc2NlbmRlcjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgdHlwb0xpbmVHYXA6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHdpbkFzY2VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHdpbkRlc2NlbnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb2RlUGFnZVJhbmdlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDMyLCAyKVxuICB9LFxuICAyOiB7XG4gICAgLy8gdGhlc2Ugc2hvdWxkIGJlIGNvbW1vbiB3aXRoIHZlcnNpb24gMSBzb21laG93XG4gICAgdHlwb0FzY2VuZGVyOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB0eXBvRGVzY2VuZGVyOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB0eXBvTGluZUdhcDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgd2luQXNjZW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgd2luRGVzY2VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvZGVQYWdlUmFuZ2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MzIsIDIpLFxuICAgIHhIZWlnaHQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIGNhcEhlaWdodDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgZGVmYXVsdENoYXI6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBicmVha0NoYXI6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBtYXhDb250ZW50OiByZXN0cnVjdHVyZS51aW50MTZcbiAgfSxcbiAgNToge1xuICAgIHR5cG9Bc2NlbmRlcjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgdHlwb0Rlc2NlbmRlcjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgdHlwb0xpbmVHYXA6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHdpbkFzY2VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHdpbkRlc2NlbnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb2RlUGFnZVJhbmdlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDMyLCAyKSxcbiAgICB4SGVpZ2h0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICBjYXBIZWlnaHQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIGRlZmF1bHRDaGFyOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgYnJlYWtDaGFyOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbWF4Q29udGVudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHVzTG93ZXJPcHRpY2FsUG9pbnRTaXplOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgdXNVcHBlck9wdGljYWxQb2ludFNpemU6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9XG59KTtcbnZhciB2ZXJzaW9ucyQxID0gT1MyLnZlcnNpb25zO1xudmVyc2lvbnMkMVszXSA9IHZlcnNpb25zJDFbNF0gPSB2ZXJzaW9ucyQxWzJdO1xuXG52YXIgcG9zdCA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUuZml4ZWQzMiwge1xuICBoZWFkZXI6IHtcbiAgICAvLyB0aGVzZSBmaWVsZHMgZXhpc3QgYXQgdGhlIHRvcCBvZiBhbGwgdmVyc2lvbnNcbiAgICBpdGFsaWNBbmdsZTogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgICAvLyBJdGFsaWMgYW5nbGUgaW4gY291bnRlci1jbG9ja3dpc2UgZGVncmVlcyBmcm9tIHRoZSB2ZXJ0aWNhbC5cbiAgICB1bmRlcmxpbmVQb3NpdGlvbjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gU3VnZ2VzdGVkIGRpc3RhbmNlIG9mIHRoZSB0b3Agb2YgdGhlIHVuZGVybGluZSBmcm9tIHRoZSBiYXNlbGluZVxuICAgIHVuZGVybGluZVRoaWNrbmVzczogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgLy8gU3VnZ2VzdGVkIHZhbHVlcyBmb3IgdGhlIHVuZGVybGluZSB0aGlja25lc3NcbiAgICBpc0ZpeGVkUGl0Y2g6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICAvLyBXaGV0aGVyIHRoZSBmb250IGlzIG1vbm9zcGFjZWRcbiAgICBtaW5NZW1UeXBlNDI6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICAvLyBNaW5pbXVtIG1lbW9yeSB1c2FnZSB3aGVuIGEgVHJ1ZVR5cGUgZm9udCBpcyBkb3dubG9hZGVkIGFzIGEgVHlwZSA0MiBmb250XG4gICAgbWF4TWVtVHlwZTQyOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgLy8gTWF4aW11bSBtZW1vcnkgdXNhZ2Ugd2hlbiBhIFRydWVUeXBlIGZvbnQgaXMgZG93bmxvYWRlZCBhcyBhIFR5cGUgNDIgZm9udFxuICAgIG1pbk1lbVR5cGUxOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgLy8gTWluaW11bSBtZW1vcnkgdXNhZ2Ugd2hlbiBhIFRydWVUeXBlIGZvbnQgaXMgZG93bmxvYWRlZCBhcyBhIFR5cGUgMSBmb250XG4gICAgbWF4TWVtVHlwZTE6IHJlc3RydWN0dXJlLnVpbnQzMiAvLyBNYXhpbXVtIG1lbW9yeSB1c2FnZSB3aGVuIGEgVHJ1ZVR5cGUgZm9udCBpcyBkb3dubG9hZGVkIGFzIGEgVHlwZSAxIGZvbnRcblxuICB9LFxuICAxOiB7fSxcbiAgLy8gdmVyc2lvbiAxIGhhcyBubyBhZGRpdGlvbmFsIGZpZWxkc1xuICAyOiB7XG4gICAgbnVtYmVyT2ZHbHlwaHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBnbHlwaE5hbWVJbmRleDogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ251bWJlck9mR2x5cGhzJyksXG4gICAgbmFtZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKHJlc3RydWN0dXJlLnVpbnQ4KSlcbiAgfSxcbiAgMi41OiB7XG4gICAgbnVtYmVyT2ZHbHlwaHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBvZmZzZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsICdudW1iZXJPZkdseXBocycpXG4gIH0sXG4gIDM6IHt9LFxuICAvLyB2ZXJzaW9uIDMgaGFzIG5vIGFkZGl0aW9uYWwgZmllbGRzXG4gIDQ6IHtcbiAgICBtYXA6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MzIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5wYXJlbnQubWF4cC5udW1HbHlwaHM7XG4gICAgfSlcbiAgfVxufSk7XG5cbnZhciBjdnQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgY29udHJvbFZhbHVlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLmludDE2KVxufSk7XG5cbi8vIFRoZXNlIGluc3RydWN0aW9ucyBhcmUga25vd24gYXMgdGhlIGZvbnQgcHJvZ3JhbS4gVGhlIG1haW4gdXNlIG9mIHRoaXMgdGFibGVcbi8vIGlzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCBpbiBtYW55IGRpZmZlcmVudCBnbHlwaCBwcm9ncmFtcy5cblxudmFyIGZwZ20gPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgaW5zdHJ1Y3Rpb25zOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgpXG59KTtcblxudmFyIGxvY2EgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KCdoZWFkLmluZGV4VG9Mb2NGb3JtYXQnLCB7XG4gIDA6IHtcbiAgICBvZmZzZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2KVxuICB9LFxuICAxOiB7XG4gICAgb2Zmc2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQzMilcbiAgfVxufSk7XG5cbmxvY2EucHJvY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMudmVyc2lvbiA9PT0gMCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLm9mZnNldHNbaV0gPDw9IDE7XG4gICAgfVxuICB9XG59O1xuXG5sb2NhLnByZUVuY29kZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMudmVyc2lvbiAhPSBudWxsKSByZXR1cm47IC8vIGFzc3VtZSB0aGlzLm9mZnNldHMgaXMgYSBzb3J0ZWQgYXJyYXlcblxuICB0aGlzLnZlcnNpb24gPSB0aGlzLm9mZnNldHNbdGhpcy5vZmZzZXRzLmxlbmd0aCAtIDFdID4gMHhmZmZmID8gMSA6IDA7XG5cbiAgaWYgKHRoaXMudmVyc2lvbiA9PT0gMCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLm9mZnNldHNbaV0gPj4+PSAxO1xuICAgIH1cbiAgfVxufTtcblxudmFyIHByZXAgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgY29udHJvbFZhbHVlUHJvZ3JhbTogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4KVxufSk7XG5cbnZhciBnbHlmID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5CdWZmZXIoKSk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkMShvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkMShvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkMShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDEobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQxKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkMShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIENGRkluZGV4ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ0ZGSW5kZXgodHlwZSkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQ0ZGSW5kZXgucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRDRkZWZXJzaW9uID0gZnVuY3Rpb24gZ2V0Q0ZGVmVyc2lvbihjdHgpIHtcbiAgICB3aGlsZSAoY3R4ICYmICFjdHguaGRyU2l6ZSkge1xuICAgICAgY3R4ID0gY3R4LnBhcmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3R4ID8gY3R4LnZlcnNpb24gOiAtMTtcbiAgfTtcblxuICBfcHJvdG8uZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgdmFyIHZlcnNpb24gPSB0aGlzLmdldENGRlZlcnNpb24ocGFyZW50KTtcbiAgICB2YXIgY291bnQgPSB2ZXJzaW9uID49IDIgPyBzdHJlYW0ucmVhZFVJbnQzMkJFKCkgOiBzdHJlYW0ucmVhZFVJbnQxNkJFKCk7XG5cbiAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgb2ZmU2l6ZSA9IHN0cmVhbS5yZWFkVUludDgoKTtcbiAgICB2YXIgb2Zmc2V0VHlwZTtcblxuICAgIGlmIChvZmZTaXplID09PSAxKSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDg7XG4gICAgfSBlbHNlIGlmIChvZmZTaXplID09PSAyKSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDE2O1xuICAgIH0gZWxzZSBpZiAob2ZmU2l6ZSA9PT0gMykge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQyNDtcbiAgICB9IGVsc2UgaWYgKG9mZlNpemUgPT09IDQpIHtcbiAgICAgIG9mZnNldFR5cGUgPSByZXN0cnVjdHVyZS51aW50MzI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCBvZmZzZXQgc2l6ZSBpbiBDRkZJbmRleDogXCIgKyBvZmZTaXplICsgXCIgXCIgKyBzdHJlYW0ucG9zKTtcbiAgICB9XG5cbiAgICB2YXIgcmV0ID0gW107XG4gICAgdmFyIHN0YXJ0UG9zID0gc3RyZWFtLnBvcyArIChjb3VudCArIDEpICogb2ZmU2l6ZSAtIDE7XG4gICAgdmFyIHN0YXJ0ID0gb2Zmc2V0VHlwZS5kZWNvZGUoc3RyZWFtKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgdmFyIGVuZCA9IG9mZnNldFR5cGUuZGVjb2RlKHN0cmVhbSk7XG5cbiAgICAgIGlmICh0aGlzLnR5cGUgIT0gbnVsbCkge1xuICAgICAgICB2YXIgcG9zID0gc3RyZWFtLnBvcztcbiAgICAgICAgc3RyZWFtLnBvcyA9IHN0YXJ0UG9zICsgc3RhcnQ7XG4gICAgICAgIHBhcmVudC5sZW5ndGggPSBlbmQgLSBzdGFydDtcbiAgICAgICAgcmV0LnB1c2godGhpcy50eXBlLmRlY29kZShzdHJlYW0sIHBhcmVudCkpO1xuICAgICAgICBzdHJlYW0ucG9zID0gcG9zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0LnB1c2goe1xuICAgICAgICAgIG9mZnNldDogc3RhcnRQb3MgKyBzdGFydCxcbiAgICAgICAgICBsZW5ndGg6IGVuZCAtIHN0YXJ0XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBzdGFydCA9IGVuZDtcbiAgICB9XG5cbiAgICBzdHJlYW0ucG9zID0gc3RhcnRQb3MgKyBzdGFydDtcbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIF9wcm90by5zaXplID0gZnVuY3Rpb24gc2l6ZShhcnIsIHBhcmVudCkge1xuICAgIHZhciBzaXplID0gMjtcblxuICAgIGlmIChhcnIubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9IHRoaXMudHlwZSB8fCBuZXcgcmVzdHJ1Y3R1cmUuQnVmZmVyKCk7IC8vIGZpbmQgbWF4aW11bSBvZmZzZXQgdG8gZGV0bWluaW5lIG9mZnNldCB0eXBlXG5cbiAgICB2YXIgb2Zmc2V0ID0gMTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IGFycltpXTtcbiAgICAgIG9mZnNldCArPSB0eXBlLnNpemUoaXRlbSwgcGFyZW50KTtcbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0VHlwZTtcblxuICAgIGlmIChvZmZzZXQgPD0gMHhmZikge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQ4O1xuICAgIH0gZWxzZSBpZiAob2Zmc2V0IDw9IDB4ZmZmZikge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQxNjtcbiAgICB9IGVsc2UgaWYgKG9mZnNldCA8PSAweGZmZmZmZikge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQyNDtcbiAgICB9IGVsc2UgaWYgKG9mZnNldCA8PSAweGZmZmZmZmZmKSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDMyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgb2Zmc2V0IGluIENGRkluZGV4XCIpO1xuICAgIH1cblxuICAgIHNpemUgKz0gMSArIG9mZnNldFR5cGUuc2l6ZSgpICogKGFyci5sZW5ndGggKyAxKTtcbiAgICBzaXplICs9IG9mZnNldCAtIDE7XG4gICAgcmV0dXJuIHNpemU7XG4gIH07XG5cbiAgX3Byb3RvLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHJlYW0sIGFyciwgcGFyZW50KSB7XG4gICAgc3RyZWFtLndyaXRlVUludDE2QkUoYXJyLmxlbmd0aCk7XG5cbiAgICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0eXBlID0gdGhpcy50eXBlIHx8IG5ldyByZXN0cnVjdHVyZS5CdWZmZXIoKTsgLy8gZmluZCBtYXhpbXVtIG9mZnNldCB0byBkZXRtaW5pbmUgb2Zmc2V0IHR5cGVcblxuICAgIHZhciBzaXplcyA9IFtdO1xuICAgIHZhciBvZmZzZXQgPSAxO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQxKGFyciksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgaXRlbSA9IF9zdGVwLnZhbHVlO1xuICAgICAgdmFyIHMgPSB0eXBlLnNpemUoaXRlbSwgcGFyZW50KTtcbiAgICAgIHNpemVzLnB1c2gocyk7XG4gICAgICBvZmZzZXQgKz0gcztcbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0VHlwZTtcblxuICAgIGlmIChvZmZzZXQgPD0gMHhmZikge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQ4O1xuICAgIH0gZWxzZSBpZiAob2Zmc2V0IDw9IDB4ZmZmZikge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQxNjtcbiAgICB9IGVsc2UgaWYgKG9mZnNldCA8PSAweGZmZmZmZikge1xuICAgICAgb2Zmc2V0VHlwZSA9IHJlc3RydWN0dXJlLnVpbnQyNDtcbiAgICB9IGVsc2UgaWYgKG9mZnNldCA8PSAweGZmZmZmZmZmKSB7XG4gICAgICBvZmZzZXRUeXBlID0gcmVzdHJ1Y3R1cmUudWludDMyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgb2Zmc2V0IGluIENGRkluZGV4XCIpO1xuICAgIH0gLy8gd3JpdGUgb2Zmc2V0IHNpemVcblxuXG4gICAgc3RyZWFtLndyaXRlVUludDgob2Zmc2V0VHlwZS5zaXplKCkpOyAvLyB3cml0ZSBlbGVtZW50c1xuXG4gICAgb2Zmc2V0ID0gMTtcbiAgICBvZmZzZXRUeXBlLmVuY29kZShzdHJlYW0sIG9mZnNldCk7XG5cbiAgICBmb3IgKHZhciBfaSA9IDAsIF9zaXplcyA9IHNpemVzOyBfaSA8IF9zaXplcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBzaXplID0gX3NpemVzW19pXTtcbiAgICAgIG9mZnNldCArPSBzaXplO1xuICAgICAgb2Zmc2V0VHlwZS5lbmNvZGUoc3RyZWFtLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDEoYXJyKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgIHZhciBfaXRlbSA9IF9zdGVwMi52YWx1ZTtcbiAgICAgIHR5cGUuZW5jb2RlKHN0cmVhbSwgX2l0ZW0sIHBhcmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9O1xuXG4gIHJldHVybiBDRkZJbmRleDtcbn0oKTtcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIGlzQXJndW1lbnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcbiAgdmFyIHN0ciA9IHRvU3RyLmNhbGwodmFsdWUpO1xuICB2YXIgaXNBcmdzID0gc3RyID09PSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuICBpZiAoIWlzQXJncykge1xuICAgIGlzQXJncyA9IHN0ciAhPT0gJ1tvYmplY3QgQXJyYXldJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmIHZhbHVlLmxlbmd0aCA+PSAwICYmIHRvU3RyLmNhbGwodmFsdWUuY2FsbGVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfVxuXG4gIHJldHVybiBpc0FyZ3M7XG59O1xuXG52YXIga2V5c1NoaW07XG5cbmlmICghT2JqZWN0LmtleXMpIHtcbiAgLy8gbW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW1cbiAgdmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gIHZhciB0b1N0ciQxID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgdmFyIGlzQXJncyA9IGlzQXJndW1lbnRzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdsb2JhbC1yZXF1aXJlXG5cbiAgdmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG4gIHZhciBoYXNEb250RW51bUJ1ZyA9ICFpc0VudW1lcmFibGUuY2FsbCh7XG4gICAgdG9TdHJpbmc6IG51bGxcbiAgfSwgJ3RvU3RyaW5nJyk7XG4gIHZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW1lcmFibGUuY2FsbChmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xuICB2YXIgZG9udEVudW1zID0gWyd0b1N0cmluZycsICd0b0xvY2FsZVN0cmluZycsICd2YWx1ZU9mJywgJ2hhc093blByb3BlcnR5JywgJ2lzUHJvdG90eXBlT2YnLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAnY29uc3RydWN0b3InXTtcblxuICB2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUgPSBmdW5jdGlvbiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKSB7XG4gICAgdmFyIGN0b3IgPSBvLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xuICB9O1xuXG4gIHZhciBleGNsdWRlZEtleXMgPSB7XG4gICAgJGFwcGxpY2F0aW9uQ2FjaGU6IHRydWUsXG4gICAgJGNvbnNvbGU6IHRydWUsXG4gICAgJGV4dGVybmFsOiB0cnVlLFxuICAgICRmcmFtZTogdHJ1ZSxcbiAgICAkZnJhbWVFbGVtZW50OiB0cnVlLFxuICAgICRmcmFtZXM6IHRydWUsXG4gICAgJGlubmVySGVpZ2h0OiB0cnVlLFxuICAgICRpbm5lcldpZHRoOiB0cnVlLFxuICAgICRvbm1vemZ1bGxzY3JlZW5jaGFuZ2U6IHRydWUsXG4gICAgJG9ubW96ZnVsbHNjcmVlbmVycm9yOiB0cnVlLFxuICAgICRvdXRlckhlaWdodDogdHJ1ZSxcbiAgICAkb3V0ZXJXaWR0aDogdHJ1ZSxcbiAgICAkcGFnZVhPZmZzZXQ6IHRydWUsXG4gICAgJHBhZ2VZT2Zmc2V0OiB0cnVlLFxuICAgICRwYXJlbnQ6IHRydWUsXG4gICAgJHNjcm9sbExlZnQ6IHRydWUsXG4gICAgJHNjcm9sbFRvcDogdHJ1ZSxcbiAgICAkc2Nyb2xsWDogdHJ1ZSxcbiAgICAkc2Nyb2xsWTogdHJ1ZSxcbiAgICAkc2VsZjogdHJ1ZSxcbiAgICAkd2Via2l0SW5kZXhlZERCOiB0cnVlLFxuICAgICR3ZWJraXRTdG9yYWdlSW5mbzogdHJ1ZSxcbiAgICAkd2luZG93OiB0cnVlXG4gIH07XG5cbiAgdmFyIGhhc0F1dG9tYXRpb25FcXVhbGl0eUJ1ZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvKiBnbG9iYWwgd2luZG93ICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgayBpbiB3aW5kb3cpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZXhjbHVkZWRLZXlzWyckJyArIGtdICYmIGhhcy5jYWxsKHdpbmRvdywgaykgJiYgd2luZG93W2tdICE9PSBudWxsICYmIHR5cGVvZiB3aW5kb3dba10gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKHdpbmRvd1trXSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSgpO1xuXG4gIHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZUlmTm90QnVnZ3kgPSBmdW5jdGlvbiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZUlmTm90QnVnZ3kobykge1xuICAgIC8qIGdsb2JhbCB3aW5kb3cgKi9cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc0F1dG9tYXRpb25FcXVhbGl0eUJ1Zykge1xuICAgICAgcmV0dXJuIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKG8pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUobyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBrZXlzU2hpbSA9IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gICAgdmFyIGlzT2JqZWN0ID0gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gdG9TdHIkMS5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgdmFyIGlzQXJndW1lbnRzID0gaXNBcmdzKG9iamVjdCk7XG4gICAgdmFyIGlzU3RyaW5nID0gaXNPYmplY3QgJiYgdG9TdHIkMS5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuICAgIHZhciB0aGVLZXlzID0gW107XG5cbiAgICBpZiAoIWlzT2JqZWN0ICYmICFpc0Z1bmN0aW9uICYmICFpc0FyZ3VtZW50cykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmtleXMgY2FsbGVkIG9uIGEgbm9uLW9iamVjdCcpO1xuICAgIH1cblxuICAgIHZhciBza2lwUHJvdG8gPSBoYXNQcm90b0VudW1CdWcgJiYgaXNGdW5jdGlvbjtcblxuICAgIGlmIChpc1N0cmluZyAmJiBvYmplY3QubGVuZ3RoID4gMCAmJiAhaGFzLmNhbGwob2JqZWN0LCAwKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdGhlS2V5cy5wdXNoKFN0cmluZyhpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzQXJndW1lbnRzICYmIG9iamVjdC5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9iamVjdC5sZW5ndGg7ICsraikge1xuICAgICAgICB0aGVLZXlzLnB1c2goU3RyaW5nKGopKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKCEoc2tpcFByb3RvICYmIG5hbWUgPT09ICdwcm90b3R5cGUnKSAmJiBoYXMuY2FsbChvYmplY3QsIG5hbWUpKSB7XG4gICAgICAgICAgdGhlS2V5cy5wdXNoKFN0cmluZyhuYW1lKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzRG9udEVudW1CdWcpIHtcbiAgICAgIHZhciBza2lwQ29uc3RydWN0b3IgPSBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZUlmTm90QnVnZ3kob2JqZWN0KTtcblxuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBkb250RW51bXMubGVuZ3RoOyArK2spIHtcbiAgICAgICAgaWYgKCEoc2tpcENvbnN0cnVjdG9yICYmIGRvbnRFbnVtc1trXSA9PT0gJ2NvbnN0cnVjdG9yJykgJiYgaGFzLmNhbGwob2JqZWN0LCBkb250RW51bXNba10pKSB7XG4gICAgICAgICAgdGhlS2V5cy5wdXNoKGRvbnRFbnVtc1trXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhlS2V5cztcbiAgfTtcbn1cblxudmFyIGltcGxlbWVudGF0aW9uID0ga2V5c1NoaW07XG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBvcmlnS2V5cyA9IE9iamVjdC5rZXlzO1xudmFyIGtleXNTaGltJDEgPSBvcmlnS2V5cyA/IGZ1bmN0aW9uIGtleXMobykge1xuICByZXR1cm4gb3JpZ0tleXMobyk7XG59IDogaW1wbGVtZW50YXRpb247XG52YXIgb3JpZ2luYWxLZXlzID0gT2JqZWN0LmtleXM7XG5cbmtleXNTaGltJDEuc2hpbSA9IGZ1bmN0aW9uIHNoaW1PYmplY3RLZXlzKCkge1xuICBpZiAoT2JqZWN0LmtleXMpIHtcbiAgICB2YXIga2V5c1dvcmtzV2l0aEFyZ3VtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFNhZmFyaSA1LjAgYnVnXG4gICAgICB2YXIgYXJncyA9IE9iamVjdC5rZXlzKGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gYXJncyAmJiBhcmdzLmxlbmd0aCA9PT0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB9KDEsIDIpO1xuXG4gICAgaWYgKCFrZXlzV29ya3NXaXRoQXJndW1lbnRzKSB7XG4gICAgICBPYmplY3Qua2V5cyA9IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmplY3QpKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsS2V5cyhzbGljZS5jYWxsKG9iamVjdCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsS2V5cyhvYmplY3QpO1xuICAgICAgfTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgT2JqZWN0LmtleXMgPSBrZXlzU2hpbSQxO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzIHx8IGtleXNTaGltJDE7XG59O1xuXG52YXIgb2JqZWN0S2V5cyA9IGtleXNTaGltJDE7XG5cbnZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCc7XG52YXIgdG9TdHIkMiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbnZhciBpc1N0YW5kYXJkQXJndW1lbnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcbiAgaWYgKGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRvU3RyJDIuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufTtcblxudmFyIGlzTGVnYWN5QXJndW1lbnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcbiAgaWYgKGlzU3RhbmRhcmRBcmd1bWVudHModmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJyAmJiB2YWx1ZS5sZW5ndGggPj0gMCAmJiB0b1N0ciQyLmNhbGwodmFsdWUpICE9PSAnW29iamVjdCBBcnJheV0nICYmIHRvU3RyJDIuY2FsbCh2YWx1ZS5jYWxsZWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufTtcblxudmFyIHN1cHBvcnRzU3RhbmRhcmRBcmd1bWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpc1N0YW5kYXJkQXJndW1lbnRzKGFyZ3VtZW50cyk7XG59KCk7XG5cbmlzU3RhbmRhcmRBcmd1bWVudHMuaXNMZWdhY3lBcmd1bWVudHMgPSBpc0xlZ2FjeUFyZ3VtZW50czsgLy8gZm9yIHRlc3RzXG5cbnZhciBpc0FyZ3VtZW50cyQxID0gc3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cyA/IGlzU3RhbmRhcmRBcmd1bWVudHMgOiBpc0xlZ2FjeUFyZ3VtZW50cztcblxudmFyIGhhc1N5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2woJ2ZvbycpID09PSAnc3ltYm9sJztcbnZhciB0b1N0ciQzID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBjb25jYXQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xudmFyIG9yaWdEZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxudmFyIGlzRnVuY3Rpb24kMSA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oZm4pIHtcbiAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0ciQzLmNhbGwoZm4pID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufTtcblxudmFyIGFyZVByb3BlcnR5RGVzY3JpcHRvcnNTdXBwb3J0ZWQgPSBmdW5jdGlvbiBhcmVQcm9wZXJ0eURlc2NyaXB0b3JzU3VwcG9ydGVkKCkge1xuICB2YXIgb2JqID0ge307XG5cbiAgdHJ5IHtcbiAgICBvcmlnRGVmaW5lUHJvcGVydHkob2JqLCAneCcsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG9ialxuICAgIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cbiAgICBmb3IgKHZhciBfIGluIG9iaikge1xuICAgICAgLy8ganNjczppZ25vcmUgZGlzYWxsb3dVbnVzZWRWYXJpYWJsZXNcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqLnggPT09IG9iajtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8qIHRoaXMgaXMgSUUgOC4gKi9cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gb3JpZ0RlZmluZVByb3BlcnR5ICYmIGFyZVByb3BlcnR5RGVzY3JpcHRvcnNTdXBwb3J0ZWQoKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCB2YWx1ZSwgcHJlZGljYXRlKSB7XG4gIGlmIChuYW1lIGluIG9iamVjdCAmJiAoIWlzRnVuY3Rpb24kMShwcmVkaWNhdGUpIHx8ICFwcmVkaWNhdGUoKSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuICAgIG9yaWdEZWZpbmVQcm9wZXJ0eShvYmplY3QsIG5hbWUsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RbbmFtZV0gPSB2YWx1ZTtcbiAgfVxufTtcblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKG9iamVjdCwgbWFwKSB7XG4gIHZhciBwcmVkaWNhdGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgdmFyIHByb3BzID0gb2JqZWN0S2V5cyhtYXApO1xuXG4gIGlmIChoYXNTeW1ib2xzKSB7XG4gICAgcHJvcHMgPSBjb25jYXQuY2FsbChwcm9wcywgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtYXApKTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BzW2ldLCBtYXBbcHJvcHNbaV1dLCBwcmVkaWNhdGVzW3Byb3BzW2ldXSk7XG4gIH1cbn07XG5cbmRlZmluZVByb3BlcnRpZXMuc3VwcG9ydHNEZXNjcmlwdG9ycyA9ICEhc3VwcG9ydHNEZXNjcmlwdG9ycztcbnZhciBkZWZpbmVQcm9wZXJ0aWVzXzEgPSBkZWZpbmVQcm9wZXJ0aWVzO1xuXG4vKiBlc2xpbnQgbm8taW52YWxpZC10aGlzOiAxICovXG5cbnZhciBFUlJPUl9NRVNTQUdFID0gJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgJztcbnZhciBzbGljZSQxID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIHRvU3RyJDQgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxudmFyIGltcGxlbWVudGF0aW9uJDEgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgdmFyIHRhcmdldCA9IHRoaXM7XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicgfHwgdG9TdHIkNC5jYWxsKHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJPUl9NRVNTQUdFICsgdGFyZ2V0KTtcbiAgfVxuXG4gIHZhciBhcmdzID0gc2xpY2UkMS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHZhciBib3VuZDtcblxuICB2YXIgYmluZGVyID0gZnVuY3Rpb24gYmluZGVyKCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkodGhpcywgYXJncy5jb25jYXQoc2xpY2UkMS5jYWxsKGFyZ3VtZW50cykpKTtcblxuICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkodGhhdCwgYXJncy5jb25jYXQoc2xpY2UkMS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGJvdW5kTGVuZ3RoID0gTWF0aC5tYXgoMCwgdGFyZ2V0Lmxlbmd0aCAtIGFyZ3MubGVuZ3RoKTtcbiAgdmFyIGJvdW5kQXJncyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRMZW5ndGg7IGkrKykge1xuICAgIGJvdW5kQXJncy5wdXNoKCckJyArIGkpO1xuICB9XG5cbiAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGJvdW5kQXJncy5qb2luKCcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gIGlmICh0YXJnZXQucHJvdG90eXBlKSB7XG4gICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcblxuICAgIEVtcHR5LnByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7XG4gICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHkucHJvdG90eXBlID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBib3VuZDtcbn07XG5cbnZhciBmdW5jdGlvbkJpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB8fCBpbXBsZW1lbnRhdGlvbiQxO1xuXG4vKiBlc2xpbnQgY29tcGxleGl0eTogWzIsIDE4XSwgbWF4LXN0YXRlbWVudHM6IFsyLCAzM10gKi9cblxudmFyIHNoYW1zID0gZnVuY3Rpb24gaGFzU3ltYm9scygpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBvYmogPSB7fTtcbiAgdmFyIHN5bSA9IFN5bWJvbCgndGVzdCcpO1xuICB2YXIgc3ltT2JqID0gT2JqZWN0KHN5bSk7XG5cbiAgaWYgKHR5cGVvZiBzeW0gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pICE9PSAnW29iamVjdCBTeW1ib2xdJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltT2JqKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9vYmplY3QuYXNzaWduL2lzc3Vlcy8xN1xuICAvLyBpZiAoc3ltIGluc3RhbmNlb2YgU3ltYm9sKSB7IHJldHVybiBmYWxzZTsgfVxuICAvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMvaXNzdWVzLzRcbiAgLy8gaWYgKCEoc3ltT2JqIGluc3RhbmNlb2YgU3ltYm9sKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgLy8gaWYgKHR5cGVvZiBTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuICAvLyBpZiAoU3RyaW5nKHN5bSkgIT09IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzeW0pKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cbiAgdmFyIHN5bVZhbCA9IDQyO1xuICBvYmpbc3ltXSA9IHN5bVZhbDtcblxuICBmb3IgKHN5bSBpbiBvYmopIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuXG5cbiAgaWYgKHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblxuICBpZiAoc3ltcy5sZW5ndGggIT09IDEgfHwgc3ltc1swXSAhPT0gc3ltKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqLCBzeW0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKTtcblxuICAgIGlmIChkZXNjcmlwdG9yLnZhbHVlICE9PSBzeW1WYWwgfHwgZGVzY3JpcHRvci5lbnVtZXJhYmxlICE9PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgb3JpZ1N5bWJvbCA9IGNvbW1vbmpzR2xvYmFsLlN5bWJvbDtcblxudmFyIGhhc1N5bWJvbHMkMSA9IGZ1bmN0aW9uIGhhc05hdGl2ZVN5bWJvbHMoKSB7XG4gIGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcmlnU3ltYm9sKCdmb28nKSAhPT0gJ3N5bWJvbCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIFN5bWJvbCgnYmFyJykgIT09ICdzeW1ib2wnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHNoYW1zKCk7XG59O1xuXG4vKiBnbG9iYWxzXG5cdEF0b21pY3MsXG5cdFNoYXJlZEFycmF5QnVmZmVyLFxuKi9cblxuXG52YXIgdW5kZWZpbmVkJDE7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciAkZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmlmICgkZ09QRCkge1xuICB0cnkge1xuICAgICRnT1BEKHt9LCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkZ09QRCA9IG51bGw7IC8vIHRoaXMgaXMgSUUgOCwgd2hpY2ggaGFzIGEgYnJva2VuIGdPUERcbiAgfVxufVxuXG52YXIgdGhyb3dUeXBlRXJyb3IgPSBmdW5jdGlvbiB0aHJvd1R5cGVFcnJvcigpIHtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoKTtcbn07XG5cbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEID8gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnMsIG5vLWNhbGxlciwgbm8tcmVzdHJpY3RlZC1wcm9wZXJ0aWVzXG4gICAgYXJndW1lbnRzLmNhbGxlZTsgLy8gSUUgOCBkb2VzIG5vdCB0aHJvdyBoZXJlXG5cbiAgICByZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG4gIH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuICAgIHRyeSB7XG4gICAgICAvLyBJRSA4IHRocm93cyBvbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFyZ3VtZW50cywgJycpXG4gICAgICByZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuICAgIH0gY2F0Y2ggKGdPUER0aHJvd3MpIHtcbiAgICAgIHJldHVybiB0aHJvd1R5cGVFcnJvcjtcbiAgICB9XG4gIH1cbn0oKSA6IHRocm93VHlwZUVycm9yO1xudmFyIGhhc1N5bWJvbHMkMiA9IGhhc1N5bWJvbHMkMSgpO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIHguX19wcm90b19fO1xufTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuXG52YXIgZ2VuZXJhdG9yRnVuY3Rpb24gPSAgdW5kZWZpbmVkJDE7XG5cbnZhciBhc3luY0Z1bmN0aW9uID0gIHVuZGVmaW5lZCQxO1xuXG52YXIgYXN5bmNHZW5GdW5jdGlvbiA9ICB1bmRlZmluZWQkMTtcbnZhciBUeXBlZEFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBnZXRQcm90byhVaW50OEFycmF5KTtcbnZhciBJTlRSSU5TSUNTID0ge1xuICAnJUFycmF5JSc6IEFycmF5LFxuICAnJUFycmF5QnVmZmVyJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEFycmF5QnVmZmVyLFxuICAnJUFycmF5QnVmZmVyUHJvdG90eXBlJSc6IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IEFycmF5QnVmZmVyLnByb3RvdHlwZSxcbiAgJyVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMkMiA/IGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQkMSxcbiAgJyVBcnJheVByb3RvdHlwZSUnOiBBcnJheS5wcm90b3R5cGUsXG4gICclQXJyYXlQcm90b19lbnRyaWVzJSc6IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzLFxuICAnJUFycmF5UHJvdG9fZm9yRWFjaCUnOiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCxcbiAgJyVBcnJheVByb3RvX2tleXMlJzogQXJyYXkucHJvdG90eXBlLmtleXMsXG4gICclQXJyYXlQcm90b192YWx1ZXMlJzogQXJyYXkucHJvdG90eXBlLnZhbHVlcyxcbiAgJyVBc3luY0Zyb21TeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogdW5kZWZpbmVkJDEsXG4gICclQXN5bmNGdW5jdGlvbiUnOiBhc3luY0Z1bmN0aW9uLFxuICAnJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJzogIHVuZGVmaW5lZCQxLFxuICAnJUFzeW5jR2VuZXJhdG9yJSc6ICB1bmRlZmluZWQkMSxcbiAgJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSc6IGFzeW5jR2VuRnVuY3Rpb24sXG4gICclQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlJzogIHVuZGVmaW5lZCQxLFxuICAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogIHVuZGVmaW5lZCQxLFxuICAnJUF0b21pY3MlJzogdHlwZW9mIEF0b21pY3MgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBBdG9taWNzLFxuICAnJUJvb2xlYW4lJzogQm9vbGVhbixcbiAgJyVCb29sZWFuUHJvdG90eXBlJSc6IEJvb2xlYW4ucHJvdG90eXBlLFxuICAnJURhdGFWaWV3JSc6IHR5cGVvZiBEYXRhVmlldyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IERhdGFWaWV3LFxuICAnJURhdGFWaWV3UHJvdG90eXBlJSc6IHR5cGVvZiBEYXRhVmlldyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IERhdGFWaWV3LnByb3RvdHlwZSxcbiAgJyVEYXRlJSc6IERhdGUsXG4gICclRGF0ZVByb3RvdHlwZSUnOiBEYXRlLnByb3RvdHlwZSxcbiAgJyVkZWNvZGVVUkklJzogZGVjb2RlVVJJLFxuICAnJWRlY29kZVVSSUNvbXBvbmVudCUnOiBkZWNvZGVVUklDb21wb25lbnQsXG4gICclZW5jb2RlVVJJJSc6IGVuY29kZVVSSSxcbiAgJyVlbmNvZGVVUklDb21wb25lbnQlJzogZW5jb2RlVVJJQ29tcG9uZW50LFxuICAnJUVycm9yJSc6IEVycm9yLFxuICAnJUVycm9yUHJvdG90eXBlJSc6IEVycm9yLnByb3RvdHlwZSxcbiAgJyVldmFsJSc6IGV2YWwsXG4gIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXZhbFxuICAnJUV2YWxFcnJvciUnOiBFdmFsRXJyb3IsXG4gICclRXZhbEVycm9yUHJvdG90eXBlJSc6IEV2YWxFcnJvci5wcm90b3R5cGUsXG4gICclRmxvYXQzMkFycmF5JSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBGbG9hdDMyQXJyYXksXG4gICclRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBGbG9hdDMyQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBGbG9hdDMyQXJyYXkucHJvdG90eXBlLFxuICAnJUZsb2F0NjRBcnJheSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogRmxvYXQ2NEFycmF5LFxuICAnJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgRmxvYXQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogRmxvYXQ2NEFycmF5LnByb3RvdHlwZSxcbiAgJyVGdW5jdGlvbiUnOiBGdW5jdGlvbixcbiAgJyVGdW5jdGlvblByb3RvdHlwZSUnOiBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICclR2VuZXJhdG9yJSc6ICB1bmRlZmluZWQkMSxcbiAgJyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBnZW5lcmF0b3JGdW5jdGlvbixcbiAgJyVHZW5lcmF0b3JQcm90b3R5cGUlJzogIHVuZGVmaW5lZCQxLFxuICAnJUludDhBcnJheSUnOiB0eXBlb2YgSW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogSW50OEFycmF5LFxuICAnJUludDhBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgSW50OEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogSW50OEFycmF5LnByb3RvdHlwZSxcbiAgJyVJbnQxNkFycmF5JSc6IHR5cGVvZiBJbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogSW50MTZBcnJheSxcbiAgJyVJbnQxNkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBJbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogSW50OEFycmF5LnByb3RvdHlwZSxcbiAgJyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogSW50MzJBcnJheSxcbiAgJyVJbnQzMkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogSW50MzJBcnJheS5wcm90b3R5cGUsXG4gICclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG4gICclaXNOYU4lJzogaXNOYU4sXG4gICclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyQyID8gZ2V0UHJvdG8oZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSkgOiB1bmRlZmluZWQkMSxcbiAgJyVKU09OJSc6IHR5cGVvZiBKU09OID09PSAnb2JqZWN0JyA/IEpTT04gOiB1bmRlZmluZWQkMSxcbiAgJyVKU09OUGFyc2UlJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTi5wYXJzZSA6IHVuZGVmaW5lZCQxLFxuICAnJU1hcCUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogTWFwLFxuICAnJU1hcEl0ZXJhdG9yUHJvdG90eXBlJSc6IHR5cGVvZiBNYXAgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNTeW1ib2xzJDIgPyB1bmRlZmluZWQkMSA6IGdldFByb3RvKG5ldyBNYXAoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuICAnJU1hcFByb3RvdHlwZSUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogTWFwLnByb3RvdHlwZSxcbiAgJyVNYXRoJSc6IE1hdGgsXG4gICclTnVtYmVyJSc6IE51bWJlcixcbiAgJyVOdW1iZXJQcm90b3R5cGUlJzogTnVtYmVyLnByb3RvdHlwZSxcbiAgJyVPYmplY3QlJzogT2JqZWN0LFxuICAnJU9iamVjdFByb3RvdHlwZSUnOiBPYmplY3QucHJvdG90eXBlLFxuICAnJU9ialByb3RvX3RvU3RyaW5nJSc6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG4gICclT2JqUHJvdG9fdmFsdWVPZiUnOiBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YsXG4gICclcGFyc2VGbG9hdCUnOiBwYXJzZUZsb2F0LFxuICAnJXBhcnNlSW50JSc6IHBhcnNlSW50LFxuICAnJVByb21pc2UlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBQcm9taXNlLFxuICAnJVByb21pc2VQcm90b3R5cGUlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBQcm9taXNlLnByb3RvdHlwZSxcbiAgJyVQcm9taXNlUHJvdG9fdGhlbiUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFByb21pc2UucHJvdG90eXBlLnRoZW4sXG4gICclUHJvbWlzZV9hbGwlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBQcm9taXNlLmFsbCxcbiAgJyVQcm9taXNlX3JlamVjdCUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFByb21pc2UucmVqZWN0LFxuICAnJVByb21pc2VfcmVzb2x2ZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFByb21pc2UucmVzb2x2ZSxcbiAgJyVQcm94eSUnOiB0eXBlb2YgUHJveHkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBQcm94eSxcbiAgJyVSYW5nZUVycm9yJSc6IFJhbmdlRXJyb3IsXG4gICclUmFuZ2VFcnJvclByb3RvdHlwZSUnOiBSYW5nZUVycm9yLnByb3RvdHlwZSxcbiAgJyVSZWZlcmVuY2VFcnJvciUnOiBSZWZlcmVuY2VFcnJvcixcbiAgJyVSZWZlcmVuY2VFcnJvclByb3RvdHlwZSUnOiBSZWZlcmVuY2VFcnJvci5wcm90b3R5cGUsXG4gICclUmVmbGVjdCUnOiB0eXBlb2YgUmVmbGVjdCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFJlZmxlY3QsXG4gICclUmVnRXhwJSc6IFJlZ0V4cCxcbiAgJyVSZWdFeHBQcm90b3R5cGUlJzogUmVnRXhwLnByb3RvdHlwZSxcbiAgJyVTZXQlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFNldCxcbiAgJyVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzU3ltYm9scyQyID8gdW5kZWZpbmVkJDEgOiBnZXRQcm90byhuZXcgU2V0KClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcbiAgJyVTZXRQcm90b3R5cGUlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFNldC5wcm90b3R5cGUsXG4gICclU2hhcmVkQXJyYXlCdWZmZXIlJzogdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogU2hhcmVkQXJyYXlCdWZmZXIsXG4gICclU2hhcmVkQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogU2hhcmVkQXJyYXlCdWZmZXIucHJvdG90eXBlLFxuICAnJVN0cmluZyUnOiBTdHJpbmcsXG4gICclU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyQyID8gZ2V0UHJvdG8oJydbU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCQxLFxuICAnJVN0cmluZ1Byb3RvdHlwZSUnOiBTdHJpbmcucHJvdG90eXBlLFxuICAnJVN5bWJvbCUnOiBoYXNTeW1ib2xzJDIgPyBTeW1ib2wgOiB1bmRlZmluZWQkMSxcbiAgJyVTeW1ib2xQcm90b3R5cGUlJzogaGFzU3ltYm9scyQyID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCQxLFxuICAnJVN5bnRheEVycm9yJSc6IFN5bnRheEVycm9yLFxuICAnJVN5bnRheEVycm9yUHJvdG90eXBlJSc6IFN5bnRheEVycm9yLnByb3RvdHlwZSxcbiAgJyVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcbiAgJyVUeXBlZEFycmF5JSc6IFR5cGVkQXJyYXksXG4gICclVHlwZWRBcnJheVByb3RvdHlwZSUnOiBUeXBlZEFycmF5ID8gVHlwZWRBcnJheS5wcm90b3R5cGUgOiB1bmRlZmluZWQkMSxcbiAgJyVUeXBlRXJyb3IlJzogJFR5cGVFcnJvcixcbiAgJyVUeXBlRXJyb3JQcm90b3R5cGUlJzogJFR5cGVFcnJvci5wcm90b3R5cGUsXG4gICclVWludDhBcnJheSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFVpbnQ4QXJyYXksXG4gICclVWludDhBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFVpbnQ4QXJyYXkucHJvdG90eXBlLFxuICAnJVVpbnQ4Q2xhbXBlZEFycmF5JSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICAnJVVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFVpbnQ4Q2xhbXBlZEFycmF5LnByb3RvdHlwZSxcbiAgJyVVaW50MTZBcnJheSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBVaW50MTZBcnJheSxcbiAgJyVVaW50MTZBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkJDEgOiBVaW50MTZBcnJheS5wcm90b3R5cGUsXG4gICclVWludDMyQXJyYXklJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogVWludDMyQXJyYXksXG4gICclVWludDMyQXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogVWludDMyQXJyYXkucHJvdG90eXBlLFxuICAnJVVSSUVycm9yJSc6IFVSSUVycm9yLFxuICAnJVVSSUVycm9yUHJvdG90eXBlJSc6IFVSSUVycm9yLnByb3RvdHlwZSxcbiAgJyVXZWFrTWFwJSc6IHR5cGVvZiBXZWFrTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogV2Vha01hcCxcbiAgJyVXZWFrTWFwUHJvdG90eXBlJSc6IHR5cGVvZiBXZWFrTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCQxIDogV2Vha01hcC5wcm90b3R5cGUsXG4gICclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFdlYWtTZXQsXG4gICclV2Vha1NldFByb3RvdHlwZSUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQkMSA6IFdlYWtTZXQucHJvdG90eXBlXG59O1xudmFyICRyZXBsYWNlID0gZnVuY3Rpb25CaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbi8qIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iLzQuMTcuMTUvZGlzdC9sb2Rhc2guanMjTDY3MzUtTDY3NDQgKi9cblxudmFyIHJlUHJvcE5hbWUgPSAvW14lLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCUkKSkvZztcbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuXG52YXIgc3RyaW5nVG9QYXRoID0gZnVuY3Rpb24gc3RyaW5nVG9QYXRoKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gICRyZXBsYWNlKHN0cmluZywgcmVQcm9wTmFtZSwgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBxdW90ZSA/ICRyZXBsYWNlKHN1YlN0cmluZywgcmVFc2NhcGVDaGFyLCAnJDEnKSA6IG51bWJlciB8fCBtYXRjaDtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuLyogZW5kIGFkYXB0YXRpb24gKi9cblxuXG52YXIgZ2V0QmFzZUludHJpbnNpYyA9IGZ1bmN0aW9uIGdldEJhc2VJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG4gIGlmICghKG5hbWUgaW4gSU5UUklOU0lDUykpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZG9lcyBub3QgZXhpc3QhJyk7XG4gIH0gLy8gaXN0YW5idWwgaWdub3JlIGlmIC8vIGhvcGVmdWxseSB0aGlzIGlzIGltcG9zc2libGUgdG8gdGVzdCA6LSlcblxuXG4gIGlmICh0eXBlb2YgSU5UUklOU0lDU1tuYW1lXSA9PT0gJ3VuZGVmaW5lZCcgJiYgIWFsbG93TWlzc2luZykge1xuICAgIHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpO1xuICB9XG5cbiAgcmV0dXJuIElOVFJJTlNJQ1NbbmFtZV07XG59O1xuXG52YXIgR2V0SW50cmluc2ljID0gZnVuY3Rpb24gR2V0SW50cmluc2ljKG5hbWUsIGFsbG93TWlzc2luZykge1xuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB0eXBlb2YgYWxsb3dNaXNzaW5nICE9PSAnYm9vbGVhbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImFsbG93TWlzc2luZ1wiIGFyZ3VtZW50IG11c3QgYmUgYSBib29sZWFuJyk7XG4gIH1cblxuICB2YXIgcGFydHMgPSBzdHJpbmdUb1BhdGgobmFtZSk7XG4gIHZhciB2YWx1ZSA9IGdldEJhc2VJbnRyaW5zaWMoJyUnICsgKHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0c1swXSA6ICcnKSArICclJywgYWxsb3dNaXNzaW5nKTtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmICgkZ09QRCAmJiBpICsgMSA+PSBwYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGRlc2MgPSAkZ09QRCh2YWx1ZSwgcGFydHNbaV0pO1xuXG4gICAgICAgIGlmICghYWxsb3dNaXNzaW5nICYmICEocGFydHNbaV0gaW4gdmFsdWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2Jhc2UgaW50cmluc2ljIGZvciAnICsgbmFtZSArICcgZXhpc3RzLCBidXQgdGhlIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IGRlc2MgPyBkZXNjLmdldCB8fCBkZXNjLnZhbHVlIDogdmFsdWVbcGFydHNbaV1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZVtwYXJ0c1tpXV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxudmFyICRGdW5jdGlvbiA9IEdldEludHJpbnNpYygnJUZ1bmN0aW9uJScpO1xudmFyICRhcHBseSA9ICRGdW5jdGlvbi5hcHBseTtcbnZhciAkY2FsbCA9ICRGdW5jdGlvbi5jYWxsO1xuXG52YXIgY2FsbEJpbmQgPSBmdW5jdGlvbiBjYWxsQmluZCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uQmluZC5hcHBseSgkY2FsbCwgYXJndW1lbnRzKTtcbn07XG5cbnZhciBhcHBseSA9IGZ1bmN0aW9uIGFwcGx5QmluZCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uQmluZC5hcHBseSgkYXBwbHksIGFyZ3VtZW50cyk7XG59O1xuY2FsbEJpbmQuYXBwbHkgPSBhcHBseTtcblxudmFyIG51bWJlcklzTmFOID0gZnVuY3Rpb24gbnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn07XG5cbnZhciBpbXBsZW1lbnRhdGlvbiQyID0gZnVuY3Rpb24gaXMoYSwgYikge1xuICBpZiAoYSA9PT0gMCAmJiBiID09PSAwKSB7XG4gICAgcmV0dXJuIDEgLyBhID09PSAxIC8gYjtcbiAgfVxuXG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAobnVtYmVySXNOYU4oYSkgJiYgbnVtYmVySXNOYU4oYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbnZhciBwb2x5ZmlsbCA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuICByZXR1cm4gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGltcGxlbWVudGF0aW9uJDI7XG59O1xuXG52YXIgc2hpbSA9IGZ1bmN0aW9uIHNoaW1PYmplY3RJcygpIHtcbiAgdmFyIHBvbHlmaWxsJDEgPSBwb2x5ZmlsbCgpO1xuICBkZWZpbmVQcm9wZXJ0aWVzXzEoT2JqZWN0LCB7XG4gICAgaXM6IHBvbHlmaWxsJDFcbiAgfSwge1xuICAgIGlzOiBmdW5jdGlvbiB0ZXN0T2JqZWN0SXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmlzICE9PSBwb2x5ZmlsbCQxO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBwb2x5ZmlsbCQxO1xufTtcblxudmFyIHBvbHlmaWxsJDEgPSBjYWxsQmluZChwb2x5ZmlsbCgpLCBPYmplY3QpO1xuZGVmaW5lUHJvcGVydGllc18xKHBvbHlmaWxsJDEsIHtcbiAgZ2V0UG9seWZpbGw6IHBvbHlmaWxsLFxuICBpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24kMixcbiAgc2hpbTogc2hpbVxufSk7XG52YXIgb2JqZWN0SXMgPSBwb2x5ZmlsbCQxO1xuXG52YXIgc3JjID0gZnVuY3Rpb25CaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbnZhciByZWdleEV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciB0cnlSZWdleEV4ZWNDYWxsID0gZnVuY3Rpb24gdHJ5UmVnZXhFeGVjKHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgdmFyIGxhc3RJbmRleCA9IHZhbHVlLmxhc3RJbmRleDtcbiAgICB2YWx1ZS5sYXN0SW5kZXggPSAwOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG5cbiAgICByZWdleEV4ZWMuY2FsbCh2YWx1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZmluYWxseSB7XG4gICAgdmFsdWUubGFzdEluZGV4ID0gbGFzdEluZGV4OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIH1cbn07XG5cbnZhciB0b1N0ciQ1ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciByZWdleENsYXNzID0gJ1tvYmplY3QgUmVnRXhwXSc7XG52YXIgaGFzVG9TdHJpbmdUYWckMSA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCc7XG5cbnZhciBpc1JlZ2V4ID0gZnVuY3Rpb24gaXNSZWdleCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1RvU3RyaW5nVGFnJDEpIHtcbiAgICByZXR1cm4gdG9TdHIkNS5jYWxsKHZhbHVlKSA9PT0gcmVnZXhDbGFzcztcbiAgfVxuXG4gIHZhciBkZXNjcmlwdG9yID0gZ09QRCh2YWx1ZSwgJ2xhc3RJbmRleCcpO1xuICB2YXIgaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBzcmMoZGVzY3JpcHRvciwgJ3ZhbHVlJyk7XG5cbiAgaWYgKCFoYXNMYXN0SW5kZXhEYXRhUHJvcGVydHkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ5UmVnZXhFeGVjQ2FsbCh2YWx1ZSk7XG59O1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcbnZhciAkVHlwZUVycm9yJDEgPSBUeXBlRXJyb3I7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiQzID0gZnVuY3Rpb24gZmxhZ3MoKSB7XG4gIGlmICh0aGlzICE9IG51bGwgJiYgdGhpcyAhPT0gJE9iamVjdCh0aGlzKSkge1xuICAgIHRocm93IG5ldyAkVHlwZUVycm9yJDEoJ1JlZ0V4cC5wcm90b3R5cGUuZmxhZ3MgZ2V0dGVyIGNhbGxlZCBvbiBub24tb2JqZWN0Jyk7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gJyc7XG5cbiAgaWYgKHRoaXMuZ2xvYmFsKSB7XG4gICAgcmVzdWx0ICs9ICdnJztcbiAgfVxuXG4gIGlmICh0aGlzLmlnbm9yZUNhc2UpIHtcbiAgICByZXN1bHQgKz0gJ2knO1xuICB9XG5cbiAgaWYgKHRoaXMubXVsdGlsaW5lKSB7XG4gICAgcmVzdWx0ICs9ICdtJztcbiAgfVxuXG4gIGlmICh0aGlzLmRvdEFsbCkge1xuICAgIHJlc3VsdCArPSAncyc7XG4gIH1cblxuICBpZiAodGhpcy51bmljb2RlKSB7XG4gICAgcmVzdWx0ICs9ICd1JztcbiAgfVxuXG4gIGlmICh0aGlzLnN0aWNreSkge1xuICAgIHJlc3VsdCArPSAneSc7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMkMSA9IGRlZmluZVByb3BlcnRpZXNfMS5zdXBwb3J0c0Rlc2NyaXB0b3JzO1xudmFyICRnT1BEJDEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyICRUeXBlRXJyb3IkMiA9IFR5cGVFcnJvcjtcblxudmFyIHBvbHlmaWxsJDIgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcbiAgaWYgKCFzdXBwb3J0c0Rlc2NyaXB0b3JzJDEpIHtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvciQyKCdSZWdFeHAucHJvdG90eXBlLmZsYWdzIHJlcXVpcmVzIGEgdHJ1ZSBFUzUgZW52aXJvbm1lbnQgdGhhdCBzdXBwb3J0cyBwcm9wZXJ0eSBkZXNjcmlwdG9ycycpO1xuICB9XG5cbiAgaWYgKC9hL21pZy5mbGFncyA9PT0gJ2dpbScpIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9ICRnT1BEJDEoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJyk7XG5cbiAgICBpZiAoZGVzY3JpcHRvciAmJiB0eXBlb2YgZGVzY3JpcHRvci5nZXQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIC9hLy5kb3RBbGwgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbXBsZW1lbnRhdGlvbiQzO1xufTtcblxudmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMkMiA9IGRlZmluZVByb3BlcnRpZXNfMS5zdXBwb3J0c0Rlc2NyaXB0b3JzO1xudmFyIGdPUEQkMSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgZGVmaW5lUHJvcGVydHkkMSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBUeXBlRXJyID0gVHlwZUVycm9yO1xudmFyIGdldFByb3RvJDEgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgcmVnZXggPSAvYS87XG5cbnZhciBzaGltJDEgPSBmdW5jdGlvbiBzaGltRmxhZ3MoKSB7XG4gIGlmICghc3VwcG9ydHNEZXNjcmlwdG9ycyQyIHx8ICFnZXRQcm90byQxKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnIoJ1JlZ0V4cC5wcm90b3R5cGUuZmxhZ3MgcmVxdWlyZXMgYSB0cnVlIEVTNSBlbnZpcm9ubWVudCB0aGF0IHN1cHBvcnRzIHByb3BlcnR5IGRlc2NyaXB0b3JzJyk7XG4gIH1cblxuICB2YXIgcG9seWZpbGwgPSBwb2x5ZmlsbCQyKCk7XG4gIHZhciBwcm90byA9IGdldFByb3RvJDEocmVnZXgpO1xuICB2YXIgZGVzY3JpcHRvciA9IGdPUEQkMShwcm90bywgJ2ZsYWdzJyk7XG5cbiAgaWYgKCFkZXNjcmlwdG9yIHx8IGRlc2NyaXB0b3IuZ2V0ICE9PSBwb2x5ZmlsbCkge1xuICAgIGRlZmluZVByb3BlcnR5JDEocHJvdG8sICdmbGFncycsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBwb2x5ZmlsbFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHBvbHlmaWxsO1xufTtcblxudmFyIGZsYWdzQm91bmQgPSBjYWxsQmluZChpbXBsZW1lbnRhdGlvbiQzKTtcbmRlZmluZVByb3BlcnRpZXNfMShmbGFnc0JvdW5kLCB7XG4gIGdldFBvbHlmaWxsOiBwb2x5ZmlsbCQyLFxuICBpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24kMyxcbiAgc2hpbTogc2hpbSQxXG59KTtcbnZhciByZWdleHBfcHJvdG90eXBlX2ZsYWdzID0gZmxhZ3NCb3VuZDtcblxudmFyIGdldERheSA9IERhdGUucHJvdG90eXBlLmdldERheTtcblxudmFyIHRyeURhdGVPYmplY3QgPSBmdW5jdGlvbiB0cnlEYXRlR2V0RGF5Q2FsbCh2YWx1ZSkge1xuICB0cnkge1xuICAgIGdldERheS5jYWxsKHZhbHVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxudmFyIHRvU3RyJDYgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGRhdGVDbGFzcyA9ICdbb2JqZWN0IERhdGVdJztcbnZhciBoYXNUb1N0cmluZ1RhZyQyID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJztcblxudmFyIGlzRGF0ZU9iamVjdCA9IGZ1bmN0aW9uIGlzRGF0ZU9iamVjdCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBoYXNUb1N0cmluZ1RhZyQyID8gdHJ5RGF0ZU9iamVjdCh2YWx1ZSkgOiB0b1N0ciQ2LmNhbGwodmFsdWUpID09PSBkYXRlQ2xhc3M7XG59O1xuXG52YXIgZ2V0VGltZSA9IERhdGUucHJvdG90eXBlLmdldFRpbWU7XG5cbmZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTsgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG5cbiAgaWYgKG9wdHMuc3RyaWN0ID8gb2JqZWN0SXMoYWN0dWFsLCBleHBlY3RlZCkgOiBhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gNy4zLiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLCBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuXG5cbiAgaWYgKCFhY3R1YWwgfHwgIWV4cGVjdGVkIHx8IHR5cGVvZiBhY3R1YWwgIT09ICdvYmplY3QnICYmIHR5cGVvZiBleHBlY3RlZCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gb3B0cy5zdHJpY3QgPyBvYmplY3RJcyhhY3R1YWwsIGV4cGVjdGVkKSA6IGFjdHVhbCA9PSBleHBlY3RlZDtcbiAgfVxuICAvKlxuICAgKiA3LjQuIEZvciBhbGwgb3RoZXIgT2JqZWN0IHBhaXJzLCBpbmNsdWRpbmcgQXJyYXkgb2JqZWN0cywgZXF1aXZhbGVuY2UgaXNcbiAgICogZGV0ZXJtaW5lZCBieSBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGFzIHZlcmlmaWVkXG4gICAqIHdpdGggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKSwgdGhlIHNhbWUgc2V0IG9mIGtleXNcbiAgICogKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBldmVyeVxuICAgKiBjb3JyZXNwb25kaW5nIGtleSwgYW5kIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS4gTm90ZTogdGhpc1xuICAgKiBhY2NvdW50cyBmb3IgYm90aCBuYW1lZCBhbmQgaW5kZXhlZCBwcm9wZXJ0aWVzIG9uIEFycmF5cy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuXG5cbiAgcmV0dXJuIG9iakVxdWl2KGFjdHVhbCwgZXhwZWN0ZWQsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZE9yTnVsbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaXNCdWZmZXIkMSh4KSB7XG4gIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHgubGVuZ3RoICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgeC5jb3B5ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiB4LnNsaWNlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHgubGVuZ3RoID4gMCAmJiB0eXBlb2YgeFswXSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgb3B0cykge1xuICAvKiBlc2xpbnQgbWF4LXN0YXRlbWVudHM6IFsyLCA1MF0gKi9cbiAgdmFyIGksIGtleTtcblxuICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzVW5kZWZpbmVkT3JOdWxsKGEpIHx8IGlzVW5kZWZpbmVkT3JOdWxsKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIGFuIGlkZW50aWNhbCAncHJvdG90eXBlJyBwcm9wZXJ0eS5cblxuXG4gIGlmIChhLnByb3RvdHlwZSAhPT0gYi5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNBcmd1bWVudHMkMShhKSAhPT0gaXNBcmd1bWVudHMkMShiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBhSXNSZWdleCA9IGlzUmVnZXgoYSk7XG4gIHZhciBiSXNSZWdleCA9IGlzUmVnZXgoYik7XG5cbiAgaWYgKGFJc1JlZ2V4ICE9PSBiSXNSZWdleCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhSXNSZWdleCB8fCBiSXNSZWdleCkge1xuICAgIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgcmVnZXhwX3Byb3RvdHlwZV9mbGFncyhhKSA9PT0gcmVnZXhwX3Byb3RvdHlwZV9mbGFncyhiKTtcbiAgfVxuXG4gIGlmIChpc0RhdGVPYmplY3QoYSkgJiYgaXNEYXRlT2JqZWN0KGIpKSB7XG4gICAgcmV0dXJuIGdldFRpbWUuY2FsbChhKSA9PT0gZ2V0VGltZS5jYWxsKGIpO1xuICB9XG5cbiAgdmFyIGFJc0J1ZmZlciA9IGlzQnVmZmVyJDEoYSk7XG4gIHZhciBiSXNCdWZmZXIgPSBpc0J1ZmZlciQxKGIpO1xuXG4gIGlmIChhSXNCdWZmZXIgIT09IGJJc0J1ZmZlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChhSXNCdWZmZXIgfHwgYklzQnVmZmVyKSB7XG4gICAgLy8gJiYgd291bGQgd29yayB0b28sIGJlY2F1c2UgYm90aCBhcmUgdHJ1ZSBvciBib3RoIGZhbHNlIGhlcmVcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIHZhciBrYSA9IG9iamVjdEtleXMoYSk7XG4gICAgdmFyIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGhhcHBlbnMgd2hlbiBvbmUgaXMgYSBzdHJpbmcgbGl0ZXJhbCBhbmQgdGhlIG90aGVyIGlzbid0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoa2V5cyBpbmNvcnBvcmF0ZXMgaGFzT3duUHJvcGVydHkpXG5cblxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gdGhlIHNhbWUgc2V0IG9mIGtleXMgKGFsdGhvdWdoIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBvcmRlciksXG5cblxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTsgLy8gfn5+Y2hlYXAga2V5IHRlc3RcblxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPSBrYltpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSAvLyBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZCB+fn5wb3NzaWJseSBleHBlbnNpdmUgZGVlcCB0ZXN0XG5cblxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGtleSA9IGthW2ldO1xuXG4gICAgaWYgKCFkZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIG9wdHMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbnZhciBkZWVwRXF1YWxfMSA9IGRlZXBFcXVhbDtcblxudmFyIEZMT0FUX0VPRiA9IDB4ZjtcbnZhciBGTE9BVF9MT09LVVAgPSBbJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnLicsICdFJywgJ0UtJywgbnVsbCwgJy0nXTtcbnZhciBGTE9BVF9FTkNPREVfTE9PS1VQID0ge1xuICAnLic6IDEwLFxuICAnRSc6IDExLFxuICAnRS0nOiAxMixcbiAgJy0nOiAxNFxufTtcblxudmFyIENGRk9wZXJhbmQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDRkZPcGVyYW5kKCkge31cblxuICBDRkZPcGVyYW5kLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHZhbHVlKSB7XG4gICAgaWYgKDMyIDw9IHZhbHVlICYmIHZhbHVlIDw9IDI0Nikge1xuICAgICAgcmV0dXJuIHZhbHVlIC0gMTM5O1xuICAgIH1cblxuICAgIGlmICgyNDcgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjUwKSB7XG4gICAgICByZXR1cm4gKHZhbHVlIC0gMjQ3KSAqIDI1NiArIHN0cmVhbS5yZWFkVUludDgoKSArIDEwODtcbiAgICB9XG5cbiAgICBpZiAoMjUxIDw9IHZhbHVlICYmIHZhbHVlIDw9IDI1NCkge1xuICAgICAgcmV0dXJuIC0odmFsdWUgLSAyNTEpICogMjU2IC0gc3RyZWFtLnJlYWRVSW50OCgpIC0gMTA4O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gMjgpIHtcbiAgICAgIHJldHVybiBzdHJlYW0ucmVhZEludDE2QkUoKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IDI5KSB7XG4gICAgICByZXR1cm4gc3RyZWFtLnJlYWRJbnQzMkJFKCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAzMCkge1xuICAgICAgdmFyIHN0ciA9ICcnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgYiA9IHN0cmVhbS5yZWFkVUludDgoKTtcbiAgICAgICAgdmFyIG4xID0gYiA+PiA0O1xuXG4gICAgICAgIGlmIChuMSA9PT0gRkxPQVRfRU9GKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdHIgKz0gRkxPQVRfTE9PS1VQW24xXTtcbiAgICAgICAgdmFyIG4yID0gYiAmIDE1O1xuXG4gICAgICAgIGlmIChuMiA9PT0gRkxPQVRfRU9GKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdHIgKz0gRkxPQVRfTE9PS1VQW24yXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBDRkZPcGVyYW5kLnNpemUgPSBmdW5jdGlvbiBzaXplKHZhbHVlKSB7XG4gICAgLy8gaWYgdGhlIHZhbHVlIG5lZWRzIHRvIGJlIGZvcmNlZCB0byB0aGUgbGFyZ2VzdCBzaXplICgzMiBiaXQpXG4gICAgLy8gZS5nLiBmb3IgdW5rbm93biBwb2ludGVycywgc2V0IHRvIDMyNzY4XG4gICAgaWYgKHZhbHVlLmZvcmNlTGFyZ2UpIHtcbiAgICAgIHZhbHVlID0gMzI3Njg7XG4gICAgfVxuXG4gICAgaWYgKCh2YWx1ZSB8IDApICE9PSB2YWx1ZSkge1xuICAgICAgLy8gZmxvYXRpbmcgcG9pbnRcbiAgICAgIHZhciBzdHIgPSAnJyArIHZhbHVlO1xuICAgICAgcmV0dXJuIDEgKyBNYXRoLmNlaWwoKHN0ci5sZW5ndGggKyAxKSAvIDIpO1xuICAgIH0gZWxzZSBpZiAoLTEwNyA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAxMDcpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoMTA4IDw9IHZhbHVlICYmIHZhbHVlIDw9IDExMzEgfHwgLTExMzEgPD0gdmFsdWUgJiYgdmFsdWUgPD0gLTEwOCkge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfSBlbHNlIGlmICgtMzI3NjggPD0gdmFsdWUgJiYgdmFsdWUgPD0gMzI3NjcpIHtcbiAgICAgIHJldHVybiAzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gNTtcbiAgICB9XG4gIH07XG5cbiAgQ0ZGT3BlcmFuZC5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyZWFtLCB2YWx1ZSkge1xuICAgIC8vIGlmIHRoZSB2YWx1ZSBuZWVkcyB0byBiZSBmb3JjZWQgdG8gdGhlIGxhcmdlc3Qgc2l6ZSAoMzIgYml0KVxuICAgIC8vIGUuZy4gZm9yIHVua25vd24gcG9pbnRlcnMsIHNhdmUgdGhlIG9sZCB2YWx1ZSBhbmQgc2V0IHRvIDMyNzY4XG4gICAgdmFyIHZhbCA9IE51bWJlcih2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUuZm9yY2VMYXJnZSkge1xuICAgICAgc3RyZWFtLndyaXRlVUludDgoMjkpO1xuICAgICAgcmV0dXJuIHN0cmVhbS53cml0ZUludDMyQkUodmFsKTtcbiAgICB9IGVsc2UgaWYgKCh2YWwgfCAwKSAhPT0gdmFsKSB7XG4gICAgICAvLyBmbG9hdGluZyBwb2ludFxuICAgICAgc3RyZWFtLndyaXRlVUludDgoMzApO1xuICAgICAgdmFyIHN0ciA9ICcnICsgdmFsO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICB2YXIgYzEgPSBzdHJbaV07XG4gICAgICAgIHZhciBuMSA9IEZMT0FUX0VOQ09ERV9MT09LVVBbYzFdIHx8ICtjMTtcblxuICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB2YXIgbjIgPSBGTE9BVF9FT0Y7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGMyID0gc3RyW2kgKyAxXTtcbiAgICAgICAgICB2YXIgbjIgPSBGTE9BVF9FTkNPREVfTE9PS1VQW2MyXSB8fCArYzI7XG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0ud3JpdGVVSW50OChuMSA8PCA0IHwgbjIgJiAxNSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuMiAhPT0gRkxPQVRfRU9GKSB7XG4gICAgICAgIHJldHVybiBzdHJlYW0ud3JpdGVVSW50OChGTE9BVF9FT0YgPDwgNCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgtMTA3IDw9IHZhbCAmJiB2YWwgPD0gMTA3KSB7XG4gICAgICByZXR1cm4gc3RyZWFtLndyaXRlVUludDgodmFsICsgMTM5KTtcbiAgICB9IGVsc2UgaWYgKDEwOCA8PSB2YWwgJiYgdmFsIDw9IDExMzEpIHtcbiAgICAgIHZhbCAtPSAxMDg7XG4gICAgICBzdHJlYW0ud3JpdGVVSW50OCgodmFsID4+IDgpICsgMjQ3KTtcbiAgICAgIHJldHVybiBzdHJlYW0ud3JpdGVVSW50OCh2YWwgJiAweGZmKTtcbiAgICB9IGVsc2UgaWYgKC0xMTMxIDw9IHZhbCAmJiB2YWwgPD0gLTEwOCkge1xuICAgICAgdmFsID0gLXZhbCAtIDEwODtcbiAgICAgIHN0cmVhbS53cml0ZVVJbnQ4KCh2YWwgPj4gOCkgKyAyNTEpO1xuICAgICAgcmV0dXJuIHN0cmVhbS53cml0ZVVJbnQ4KHZhbCAmIDB4ZmYpO1xuICAgIH0gZWxzZSBpZiAoLTMyNzY4IDw9IHZhbCAmJiB2YWwgPD0gMzI3NjcpIHtcbiAgICAgIHN0cmVhbS53cml0ZVVJbnQ4KDI4KTtcbiAgICAgIHJldHVybiBzdHJlYW0ud3JpdGVJbnQxNkJFKHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmVhbS53cml0ZVVJbnQ4KDI5KTtcbiAgICAgIHJldHVybiBzdHJlYW0ud3JpdGVJbnQzMkJFKHZhbCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBDRkZPcGVyYW5kO1xufSgpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDIobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDIobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JDIobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQyKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMihvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JDIoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBDRkZEaWN0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ0ZGRGljdChvcHMpIHtcbiAgICBpZiAob3BzID09PSB2b2lkIDApIHtcbiAgICAgIG9wcyA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMub3BzID0gb3BzO1xuICAgIHRoaXMuZmllbGRzID0ge307XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDIob3BzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBmaWVsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgdmFyIGtleSA9IEFycmF5LmlzQXJyYXkoZmllbGRbMF0pID8gZmllbGRbMF1bMF0gPDwgOCB8IGZpZWxkWzBdWzFdIDogZmllbGRbMF07XG4gICAgICB0aGlzLmZpZWxkc1trZXldID0gZmllbGQ7XG4gICAgfVxuICB9XG5cbiAgdmFyIF9wcm90byA9IENGRkRpY3QucHJvdG90eXBlO1xuXG4gIF9wcm90by5kZWNvZGVPcGVyYW5kcyA9IGZ1bmN0aW9uIGRlY29kZU9wZXJhbmRzKHR5cGUsIHN0cmVhbSwgcmV0LCBvcGVyYW5kcykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgcmV0dXJuIG9wZXJhbmRzLm1hcChmdW5jdGlvbiAob3AsIGkpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmRlY29kZU9wZXJhbmRzKHR5cGVbaV0sIHN0cmVhbSwgcmV0LCBbb3BdKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZS5kZWNvZGUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHR5cGUuZGVjb2RlKHN0cmVhbSwgcmV0LCBvcGVyYW5kcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBjYXNlICdvZmZzZXQnOlxuICAgICAgICBjYXNlICdzaWQnOlxuICAgICAgICAgIHJldHVybiBvcGVyYW5kc1swXTtcblxuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICByZXR1cm4gISFvcGVyYW5kc1swXTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBvcGVyYW5kcztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmVuY29kZU9wZXJhbmRzID0gZnVuY3Rpb24gZW5jb2RlT3BlcmFuZHModHlwZSwgc3RyZWFtLCBjdHgsIG9wZXJhbmRzKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgcmV0dXJuIG9wZXJhbmRzLm1hcChmdW5jdGlvbiAob3AsIGkpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5lbmNvZGVPcGVyYW5kcyh0eXBlW2ldLCBzdHJlYW0sIGN0eCwgb3ApWzBdO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlLmVuY29kZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdHlwZS5lbmNvZGUoc3RyZWFtLCBvcGVyYW5kcywgY3R4KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcGVyYW5kcyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBbb3BlcmFuZHNdO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wZXJhbmRzID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBbK29wZXJhbmRzXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob3BlcmFuZHMpKSB7XG4gICAgICByZXR1cm4gb3BlcmFuZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbb3BlcmFuZHNdO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgdmFyIGVuZCA9IHN0cmVhbS5wb3MgKyBwYXJlbnQubGVuZ3RoO1xuICAgIHZhciByZXQgPSB7fTtcbiAgICB2YXIgb3BlcmFuZHMgPSBbXTsgLy8gZGVmaW5lIGhpZGRlbiBwcm9wZXJ0aWVzXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhyZXQsIHtcbiAgICAgIHBhcmVudDoge1xuICAgICAgICB2YWx1ZTogcGFyZW50XG4gICAgICB9LFxuICAgICAgX3N0YXJ0T2Zmc2V0OiB7XG4gICAgICAgIHZhbHVlOiBzdHJlYW0ucG9zXG4gICAgICB9XG4gICAgfSk7IC8vIGZpbGwgaW4gZGVmYXVsdHNcblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmZpZWxkcykge1xuICAgICAgdmFyIGZpZWxkID0gdGhpcy5maWVsZHNba2V5XTtcbiAgICAgIHJldFtmaWVsZFsxXV0gPSBmaWVsZFszXTtcbiAgICB9XG5cbiAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IGVuZCkge1xuICAgICAgdmFyIGIgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG5cbiAgICAgIGlmIChiIDwgMjgpIHtcbiAgICAgICAgaWYgKGIgPT09IDEyKSB7XG4gICAgICAgICAgYiA9IGIgPDwgOCB8IHN0cmVhbS5yZWFkVUludDgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZmllbGQgPSB0aGlzLmZpZWxkc1tiXTtcblxuICAgICAgICBpZiAoIV9maWVsZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3BlcmF0b3IgXCIgKyBiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmRlY29kZU9wZXJhbmRzKF9maWVsZFsyXSwgc3RyZWFtLCByZXQsIG9wZXJhbmRzKTtcblxuICAgICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgdXRpbHNfMikge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgX2ZpZWxkWzFdLCB2YWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXRbX2ZpZWxkWzFdXSA9IHZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvcGVyYW5kcyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlcmFuZHMucHVzaChDRkZPcGVyYW5kLmRlY29kZShzdHJlYW0sIGIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9O1xuXG4gIF9wcm90by5zaXplID0gZnVuY3Rpb24gc2l6ZShkaWN0LCBwYXJlbnQsIGluY2x1ZGVQb2ludGVycykge1xuICAgIGlmIChpbmNsdWRlUG9pbnRlcnMgPT09IHZvaWQgMCkge1xuICAgICAgaW5jbHVkZVBvaW50ZXJzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgY3R4ID0ge1xuICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICB2YWw6IGRpY3QsXG4gICAgICBwb2ludGVyU2l6ZTogMCxcbiAgICAgIHN0YXJ0T2Zmc2V0OiBwYXJlbnQuc3RhcnRPZmZzZXQgfHwgMFxuICAgIH07XG4gICAgdmFyIGxlbiA9IDA7XG5cbiAgICBmb3IgKHZhciBrIGluIHRoaXMuZmllbGRzKSB7XG4gICAgICB2YXIgZmllbGQgPSB0aGlzLmZpZWxkc1trXTtcbiAgICAgIHZhciB2YWwgPSBkaWN0W2ZpZWxkWzFdXTtcblxuICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IGRlZXBFcXVhbF8xKHZhbCwgZmllbGRbM10pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3BlcmFuZHMgPSB0aGlzLmVuY29kZU9wZXJhbmRzKGZpZWxkWzJdLCBudWxsLCBjdHgsIHZhbCk7XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDIob3BlcmFuZHMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgICB2YXIgb3AgPSBfc3RlcDIudmFsdWU7XG4gICAgICAgIGxlbiArPSBDRkZPcGVyYW5kLnNpemUob3ApO1xuICAgICAgfVxuXG4gICAgICB2YXIga2V5ID0gQXJyYXkuaXNBcnJheShmaWVsZFswXSkgPyBmaWVsZFswXSA6IFtmaWVsZFswXV07XG4gICAgICBsZW4gKz0ga2V5Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAoaW5jbHVkZVBvaW50ZXJzKSB7XG4gICAgICBsZW4gKz0gY3R4LnBvaW50ZXJTaXplO1xuICAgIH1cblxuICAgIHJldHVybiBsZW47XG4gIH07XG5cbiAgX3Byb3RvLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHJlYW0sIGRpY3QsIHBhcmVudCkge1xuICAgIHZhciBjdHggPSB7XG4gICAgICBwb2ludGVyczogW10sXG4gICAgICBzdGFydE9mZnNldDogc3RyZWFtLnBvcyxcbiAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgdmFsOiBkaWN0LFxuICAgICAgcG9pbnRlclNpemU6IDBcbiAgICB9O1xuICAgIGN0eC5wb2ludGVyT2Zmc2V0ID0gc3RyZWFtLnBvcyArIHRoaXMuc2l6ZShkaWN0LCBjdHgsIGZhbHNlKTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDIodGhpcy5vcHMpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgdmFyIGZpZWxkID0gX3N0ZXAzLnZhbHVlO1xuICAgICAgdmFyIHZhbCA9IGRpY3RbZmllbGRbMV1dO1xuXG4gICAgICBpZiAodmFsID09IG51bGwgfHwgZGVlcEVxdWFsXzEodmFsLCBmaWVsZFszXSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBvcGVyYW5kcyA9IHRoaXMuZW5jb2RlT3BlcmFuZHMoZmllbGRbMl0sIHN0cmVhbSwgY3R4LCB2YWwpO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQyKG9wZXJhbmRzKSwgX3N0ZXA0OyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIG9wID0gX3N0ZXA0LnZhbHVlO1xuICAgICAgICBDRkZPcGVyYW5kLmVuY29kZShzdHJlYW0sIG9wKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGtleSA9IEFycmF5LmlzQXJyYXkoZmllbGRbMF0pID8gZmllbGRbMF0gOiBbZmllbGRbMF1dO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3I1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQyKGtleSksIF9zdGVwNTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1KCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBfb3AgPSBfc3RlcDUudmFsdWU7XG4gICAgICAgIHN0cmVhbS53cml0ZVVJbnQ4KF9vcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBjdHgucG9pbnRlcnMubGVuZ3RoKSB7XG4gICAgICB2YXIgcHRyID0gY3R4LnBvaW50ZXJzW2krK107XG4gICAgICBwdHIudHlwZS5lbmNvZGUoc3RyZWFtLCBwdHIudmFsLCBwdHIucGFyZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH07XG5cbiAgcmV0dXJuIENGRkRpY3Q7XG59KCk7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgQ0ZGUG9pbnRlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX3IkUG9pbnRlcikge1xuICBfaW5oZXJpdHNMb29zZShDRkZQb2ludGVyLCBfciRQb2ludGVyKTtcblxuICBmdW5jdGlvbiBDRkZQb2ludGVyKHR5cGUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudHlwZSA9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnR5cGUgPSAnZ2xvYmFsJztcbiAgICB9XG5cbiAgICByZXR1cm4gX3IkUG9pbnRlci5jYWxsKHRoaXMsIG51bGwsIHR5cGUsIG9wdGlvbnMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQ0ZGUG9pbnRlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCwgb3BlcmFuZHMpIHtcbiAgICB0aGlzLm9mZnNldFR5cGUgPSB7XG4gICAgICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZSgpIHtcbiAgICAgICAgcmV0dXJuIG9wZXJhbmRzWzBdO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIF9yJFBvaW50ZXIucHJvdG90eXBlLmRlY29kZS5jYWxsKHRoaXMsIHN0cmVhbSwgcGFyZW50LCBvcGVyYW5kcyk7XG4gIH07XG5cbiAgX3Byb3RvLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHJlYW0sIHZhbHVlLCBjdHgpIHtcbiAgICBpZiAoIXN0cmVhbSkge1xuICAgICAgLy8gY29tcHV0ZSB0aGUgc2l6ZSAoc28gY3R4LnBvaW50ZXJTaXplIGlzIGNvcnJlY3QpXG4gICAgICB0aGlzLm9mZnNldFR5cGUgPSB7XG4gICAgICAgIHNpemU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnNpemUodmFsdWUsIGN0eCk7XG4gICAgICByZXR1cm4gW25ldyBQdHIoMCldO1xuICAgIH1cblxuICAgIHZhciBwdHIgPSBudWxsO1xuICAgIHRoaXMub2Zmc2V0VHlwZSA9IHtcbiAgICAgIGVuY29kZTogZnVuY3Rpb24gZW5jb2RlKHN0cmVhbSwgdmFsKSB7XG4gICAgICAgIHJldHVybiBwdHIgPSB2YWw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9yJFBvaW50ZXIucHJvdG90eXBlLmVuY29kZS5jYWxsKHRoaXMsIHN0cmVhbSwgdmFsdWUsIGN0eCk7XG5cbiAgICByZXR1cm4gW25ldyBQdHIocHRyKV07XG4gIH07XG5cbiAgcmV0dXJuIENGRlBvaW50ZXI7XG59KHJlc3RydWN0dXJlLlBvaW50ZXIpO1xuXG52YXIgUHRyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUHRyKHZhbCkge1xuICAgIHRoaXMudmFsID0gdmFsO1xuICAgIHRoaXMuZm9yY2VMYXJnZSA9IHRydWU7XG4gIH1cblxuICB2YXIgX3Byb3RvMiA9IFB0ci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMi52YWx1ZU9mID0gZnVuY3Rpb24gdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy52YWw7XG4gIH07XG5cbiAgcmV0dXJuIFB0cjtcbn0oKTtcblxudmFyIENGRkJsZW5kT3AgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDRkZCbGVuZE9wKCkge31cblxuICBDRkZCbGVuZE9wLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCwgb3BlcmFuZHMpIHtcbiAgICB2YXIgbnVtQmxlbmRzID0gb3BlcmFuZHMucG9wKCk7IC8vIFRPRE86IGFjdHVhbGx5IGJsZW5kLiBGb3Igbm93IGp1c3QgY29uc3VtZSB0aGUgZGVsdGFzXG4gICAgLy8gc2luY2Ugd2UgZG9uJ3QgdXNlIGFueSBvZiB0aGUgdmFsdWVzIGFueXdheS5cblxuICAgIHdoaWxlIChvcGVyYW5kcy5sZW5ndGggPiBudW1CbGVuZHMpIHtcbiAgICAgIG9wZXJhbmRzLnBvcCgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gQ0ZGQmxlbmRPcDtcbn0oKTtcblxudmFyIENGRlByaXZhdGVEaWN0ID0gbmV3IENGRkRpY3QoWy8vIGtleSAgICAgICBuYW1lICAgICAgICAgICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFxuWzYsICdCbHVlVmFsdWVzJywgJ2RlbHRhJywgbnVsbF0sIFs3LCAnT3RoZXJCbHVlcycsICdkZWx0YScsIG51bGxdLCBbOCwgJ0ZhbWlseUJsdWVzJywgJ2RlbHRhJywgbnVsbF0sIFs5LCAnRmFtaWx5T3RoZXJCbHVlcycsICdkZWx0YScsIG51bGxdLCBbWzEyLCA5XSwgJ0JsdWVTY2FsZScsICdudW1iZXInLCAwLjAzOTYyNV0sIFtbMTIsIDEwXSwgJ0JsdWVTaGlmdCcsICdudW1iZXInLCA3XSwgW1sxMiwgMTFdLCAnQmx1ZUZ1enonLCAnbnVtYmVyJywgMV0sIFsxMCwgJ1N0ZEhXJywgJ251bWJlcicsIG51bGxdLCBbMTEsICdTdGRWVycsICdudW1iZXInLCBudWxsXSwgW1sxMiwgMTJdLCAnU3RlbVNuYXBIJywgJ2RlbHRhJywgbnVsbF0sIFtbMTIsIDEzXSwgJ1N0ZW1TbmFwVicsICdkZWx0YScsIG51bGxdLCBbWzEyLCAxNF0sICdGb3JjZUJvbGQnLCAnYm9vbGVhbicsIGZhbHNlXSwgW1sxMiwgMTddLCAnTGFuZ3VhZ2VHcm91cCcsICdudW1iZXInLCAwXSwgW1sxMiwgMThdLCAnRXhwYW5zaW9uRmFjdG9yJywgJ251bWJlcicsIDAuMDZdLCBbWzEyLCAxOV0sICdpbml0aWFsUmFuZG9tU2VlZCcsICdudW1iZXInLCAwXSwgWzIwLCAnZGVmYXVsdFdpZHRoWCcsICdudW1iZXInLCAwXSwgWzIxLCAnbm9taW5hbFdpZHRoWCcsICdudW1iZXInLCAwXSwgWzIyLCAndnNpbmRleCcsICdudW1iZXInLCAwXSwgWzIzLCAnYmxlbmQnLCBDRkZCbGVuZE9wLCBudWxsXSwgWzE5LCAnU3VicnMnLCBuZXcgQ0ZGUG9pbnRlcihuZXcgQ0ZGSW5kZXgoKSwge1xuICB0eXBlOiAnbG9jYWwnXG59KSwgbnVsbF1dKTtcblxuLy8gQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBBcHBlbmRpeCBBIG9mIHRoZSBDRkYgc3BlY2lmaWNhdGlvbjsgZG9cbi8vIG5vdCBlZGl0LiBMZW5ndGggc2hvdWxkIGJlIDM5MS5cbnZhciBzdGFuZGFyZFN0cmluZ3MgPSBbXCIubm90ZGVmXCIsIFwic3BhY2VcIiwgXCJleGNsYW1cIiwgXCJxdW90ZWRibFwiLCBcIm51bWJlcnNpZ25cIiwgXCJkb2xsYXJcIiwgXCJwZXJjZW50XCIsIFwiYW1wZXJzYW5kXCIsIFwicXVvdGVyaWdodFwiLCBcInBhcmVubGVmdFwiLCBcInBhcmVucmlnaHRcIiwgXCJhc3Rlcmlza1wiLCBcInBsdXNcIiwgXCJjb21tYVwiLCBcImh5cGhlblwiLCBcInBlcmlvZFwiLCBcInNsYXNoXCIsIFwiemVyb1wiLCBcIm9uZVwiLCBcInR3b1wiLCBcInRocmVlXCIsIFwiZm91clwiLCBcImZpdmVcIiwgXCJzaXhcIiwgXCJzZXZlblwiLCBcImVpZ2h0XCIsIFwibmluZVwiLCBcImNvbG9uXCIsIFwic2VtaWNvbG9uXCIsIFwibGVzc1wiLCBcImVxdWFsXCIsIFwiZ3JlYXRlclwiLCBcInF1ZXN0aW9uXCIsIFwiYXRcIiwgXCJBXCIsIFwiQlwiLCBcIkNcIiwgXCJEXCIsIFwiRVwiLCBcIkZcIiwgXCJHXCIsIFwiSFwiLCBcIklcIiwgXCJKXCIsIFwiS1wiLCBcIkxcIiwgXCJNXCIsIFwiTlwiLCBcIk9cIiwgXCJQXCIsIFwiUVwiLCBcIlJcIiwgXCJTXCIsIFwiVFwiLCBcIlVcIiwgXCJWXCIsIFwiV1wiLCBcIlhcIiwgXCJZXCIsIFwiWlwiLCBcImJyYWNrZXRsZWZ0XCIsIFwiYmFja3NsYXNoXCIsIFwiYnJhY2tldHJpZ2h0XCIsIFwiYXNjaWljaXJjdW1cIiwgXCJ1bmRlcnNjb3JlXCIsIFwicXVvdGVsZWZ0XCIsIFwiYVwiLCBcImJcIiwgXCJjXCIsIFwiZFwiLCBcImVcIiwgXCJmXCIsIFwiZ1wiLCBcImhcIiwgXCJpXCIsIFwialwiLCBcImtcIiwgXCJsXCIsIFwibVwiLCBcIm5cIiwgXCJvXCIsIFwicFwiLCBcInFcIiwgXCJyXCIsIFwic1wiLCBcInRcIiwgXCJ1XCIsIFwidlwiLCBcIndcIiwgXCJ4XCIsIFwieVwiLCBcInpcIiwgXCJicmFjZWxlZnRcIiwgXCJiYXJcIiwgXCJicmFjZXJpZ2h0XCIsIFwiYXNjaWl0aWxkZVwiLCBcImV4Y2xhbWRvd25cIiwgXCJjZW50XCIsIFwic3RlcmxpbmdcIiwgXCJmcmFjdGlvblwiLCBcInllblwiLCBcImZsb3JpblwiLCBcInNlY3Rpb25cIiwgXCJjdXJyZW5jeVwiLCBcInF1b3Rlc2luZ2xlXCIsIFwicXVvdGVkYmxsZWZ0XCIsIFwiZ3VpbGxlbW90bGVmdFwiLCBcImd1aWxzaW5nbGxlZnRcIiwgXCJndWlsc2luZ2xyaWdodFwiLCBcImZpXCIsIFwiZmxcIiwgXCJlbmRhc2hcIiwgXCJkYWdnZXJcIiwgXCJkYWdnZXJkYmxcIiwgXCJwZXJpb2RjZW50ZXJlZFwiLCBcInBhcmFncmFwaFwiLCBcImJ1bGxldFwiLCBcInF1b3Rlc2luZ2xiYXNlXCIsIFwicXVvdGVkYmxiYXNlXCIsIFwicXVvdGVkYmxyaWdodFwiLCBcImd1aWxsZW1vdHJpZ2h0XCIsIFwiZWxsaXBzaXNcIiwgXCJwZXJ0aG91c2FuZFwiLCBcInF1ZXN0aW9uZG93blwiLCBcImdyYXZlXCIsIFwiYWN1dGVcIiwgXCJjaXJjdW1mbGV4XCIsIFwidGlsZGVcIiwgXCJtYWNyb25cIiwgXCJicmV2ZVwiLCBcImRvdGFjY2VudFwiLCBcImRpZXJlc2lzXCIsIFwicmluZ1wiLCBcImNlZGlsbGFcIiwgXCJodW5nYXJ1bWxhdXRcIiwgXCJvZ29uZWtcIiwgXCJjYXJvblwiLCBcImVtZGFzaFwiLCBcIkFFXCIsIFwib3JkZmVtaW5pbmVcIiwgXCJMc2xhc2hcIiwgXCJPc2xhc2hcIiwgXCJPRVwiLCBcIm9yZG1hc2N1bGluZVwiLCBcImFlXCIsIFwiZG90bGVzc2lcIiwgXCJsc2xhc2hcIiwgXCJvc2xhc2hcIiwgXCJvZVwiLCBcImdlcm1hbmRibHNcIiwgXCJvbmVzdXBlcmlvclwiLCBcImxvZ2ljYWxub3RcIiwgXCJtdVwiLCBcInRyYWRlbWFya1wiLCBcIkV0aFwiLCBcIm9uZWhhbGZcIiwgXCJwbHVzbWludXNcIiwgXCJUaG9yblwiLCBcIm9uZXF1YXJ0ZXJcIiwgXCJkaXZpZGVcIiwgXCJicm9rZW5iYXJcIiwgXCJkZWdyZWVcIiwgXCJ0aG9yblwiLCBcInRocmVlcXVhcnRlcnNcIiwgXCJ0d29zdXBlcmlvclwiLCBcInJlZ2lzdGVyZWRcIiwgXCJtaW51c1wiLCBcImV0aFwiLCBcIm11bHRpcGx5XCIsIFwidGhyZWVzdXBlcmlvclwiLCBcImNvcHlyaWdodFwiLCBcIkFhY3V0ZVwiLCBcIkFjaXJjdW1mbGV4XCIsIFwiQWRpZXJlc2lzXCIsIFwiQWdyYXZlXCIsIFwiQXJpbmdcIiwgXCJBdGlsZGVcIiwgXCJDY2VkaWxsYVwiLCBcIkVhY3V0ZVwiLCBcIkVjaXJjdW1mbGV4XCIsIFwiRWRpZXJlc2lzXCIsIFwiRWdyYXZlXCIsIFwiSWFjdXRlXCIsIFwiSWNpcmN1bWZsZXhcIiwgXCJJZGllcmVzaXNcIiwgXCJJZ3JhdmVcIiwgXCJOdGlsZGVcIiwgXCJPYWN1dGVcIiwgXCJPY2lyY3VtZmxleFwiLCBcIk9kaWVyZXNpc1wiLCBcIk9ncmF2ZVwiLCBcIk90aWxkZVwiLCBcIlNjYXJvblwiLCBcIlVhY3V0ZVwiLCBcIlVjaXJjdW1mbGV4XCIsIFwiVWRpZXJlc2lzXCIsIFwiVWdyYXZlXCIsIFwiWWFjdXRlXCIsIFwiWWRpZXJlc2lzXCIsIFwiWmNhcm9uXCIsIFwiYWFjdXRlXCIsIFwiYWNpcmN1bWZsZXhcIiwgXCJhZGllcmVzaXNcIiwgXCJhZ3JhdmVcIiwgXCJhcmluZ1wiLCBcImF0aWxkZVwiLCBcImNjZWRpbGxhXCIsIFwiZWFjdXRlXCIsIFwiZWNpcmN1bWZsZXhcIiwgXCJlZGllcmVzaXNcIiwgXCJlZ3JhdmVcIiwgXCJpYWN1dGVcIiwgXCJpY2lyY3VtZmxleFwiLCBcImlkaWVyZXNpc1wiLCBcImlncmF2ZVwiLCBcIm50aWxkZVwiLCBcIm9hY3V0ZVwiLCBcIm9jaXJjdW1mbGV4XCIsIFwib2RpZXJlc2lzXCIsIFwib2dyYXZlXCIsIFwib3RpbGRlXCIsIFwic2Nhcm9uXCIsIFwidWFjdXRlXCIsIFwidWNpcmN1bWZsZXhcIiwgXCJ1ZGllcmVzaXNcIiwgXCJ1Z3JhdmVcIiwgXCJ5YWN1dGVcIiwgXCJ5ZGllcmVzaXNcIiwgXCJ6Y2Fyb25cIiwgXCJleGNsYW1zbWFsbFwiLCBcIkh1bmdhcnVtbGF1dHNtYWxsXCIsIFwiZG9sbGFyb2xkc3R5bGVcIiwgXCJkb2xsYXJzdXBlcmlvclwiLCBcImFtcGVyc2FuZHNtYWxsXCIsIFwiQWN1dGVzbWFsbFwiLCBcInBhcmVubGVmdHN1cGVyaW9yXCIsIFwicGFyZW5yaWdodHN1cGVyaW9yXCIsIFwidHdvZG90ZW5sZWFkZXJcIiwgXCJvbmVkb3RlbmxlYWRlclwiLCBcInplcm9vbGRzdHlsZVwiLCBcIm9uZW9sZHN0eWxlXCIsIFwidHdvb2xkc3R5bGVcIiwgXCJ0aHJlZW9sZHN0eWxlXCIsIFwiZm91cm9sZHN0eWxlXCIsIFwiZml2ZW9sZHN0eWxlXCIsIFwic2l4b2xkc3R5bGVcIiwgXCJzZXZlbm9sZHN0eWxlXCIsIFwiZWlnaHRvbGRzdHlsZVwiLCBcIm5pbmVvbGRzdHlsZVwiLCBcImNvbW1hc3VwZXJpb3JcIiwgXCJ0aHJlZXF1YXJ0ZXJzZW1kYXNoXCIsIFwicGVyaW9kc3VwZXJpb3JcIiwgXCJxdWVzdGlvbnNtYWxsXCIsIFwiYXN1cGVyaW9yXCIsIFwiYnN1cGVyaW9yXCIsIFwiY2VudHN1cGVyaW9yXCIsIFwiZHN1cGVyaW9yXCIsIFwiZXN1cGVyaW9yXCIsIFwiaXN1cGVyaW9yXCIsIFwibHN1cGVyaW9yXCIsIFwibXN1cGVyaW9yXCIsIFwibnN1cGVyaW9yXCIsIFwib3N1cGVyaW9yXCIsIFwicnN1cGVyaW9yXCIsIFwic3N1cGVyaW9yXCIsIFwidHN1cGVyaW9yXCIsIFwiZmZcIiwgXCJmZmlcIiwgXCJmZmxcIiwgXCJwYXJlbmxlZnRpbmZlcmlvclwiLCBcInBhcmVucmlnaHRpbmZlcmlvclwiLCBcIkNpcmN1bWZsZXhzbWFsbFwiLCBcImh5cGhlbnN1cGVyaW9yXCIsIFwiR3JhdmVzbWFsbFwiLCBcIkFzbWFsbFwiLCBcIkJzbWFsbFwiLCBcIkNzbWFsbFwiLCBcIkRzbWFsbFwiLCBcIkVzbWFsbFwiLCBcIkZzbWFsbFwiLCBcIkdzbWFsbFwiLCBcIkhzbWFsbFwiLCBcIklzbWFsbFwiLCBcIkpzbWFsbFwiLCBcIktzbWFsbFwiLCBcIkxzbWFsbFwiLCBcIk1zbWFsbFwiLCBcIk5zbWFsbFwiLCBcIk9zbWFsbFwiLCBcIlBzbWFsbFwiLCBcIlFzbWFsbFwiLCBcIlJzbWFsbFwiLCBcIlNzbWFsbFwiLCBcIlRzbWFsbFwiLCBcIlVzbWFsbFwiLCBcIlZzbWFsbFwiLCBcIldzbWFsbFwiLCBcIlhzbWFsbFwiLCBcIllzbWFsbFwiLCBcIlpzbWFsbFwiLCBcImNvbG9ubW9uZXRhcnlcIiwgXCJvbmVmaXR0ZWRcIiwgXCJydXBpYWhcIiwgXCJUaWxkZXNtYWxsXCIsIFwiZXhjbGFtZG93bnNtYWxsXCIsIFwiY2VudG9sZHN0eWxlXCIsIFwiTHNsYXNoc21hbGxcIiwgXCJTY2Fyb25zbWFsbFwiLCBcIlpjYXJvbnNtYWxsXCIsIFwiRGllcmVzaXNzbWFsbFwiLCBcIkJyZXZlc21hbGxcIiwgXCJDYXJvbnNtYWxsXCIsIFwiRG90YWNjZW50c21hbGxcIiwgXCJNYWNyb25zbWFsbFwiLCBcImZpZ3VyZWRhc2hcIiwgXCJoeXBoZW5pbmZlcmlvclwiLCBcIk9nb25la3NtYWxsXCIsIFwiUmluZ3NtYWxsXCIsIFwiQ2VkaWxsYXNtYWxsXCIsIFwicXVlc3Rpb25kb3duc21hbGxcIiwgXCJvbmVlaWdodGhcIiwgXCJ0aHJlZWVpZ2h0aHNcIiwgXCJmaXZlZWlnaHRoc1wiLCBcInNldmVuZWlnaHRoc1wiLCBcIm9uZXRoaXJkXCIsIFwidHdvdGhpcmRzXCIsIFwiemVyb3N1cGVyaW9yXCIsIFwiZm91cnN1cGVyaW9yXCIsIFwiZml2ZXN1cGVyaW9yXCIsIFwic2l4c3VwZXJpb3JcIiwgXCJzZXZlbnN1cGVyaW9yXCIsIFwiZWlnaHRzdXBlcmlvclwiLCBcIm5pbmVzdXBlcmlvclwiLCBcInplcm9pbmZlcmlvclwiLCBcIm9uZWluZmVyaW9yXCIsIFwidHdvaW5mZXJpb3JcIiwgXCJ0aHJlZWluZmVyaW9yXCIsIFwiZm91cmluZmVyaW9yXCIsIFwiZml2ZWluZmVyaW9yXCIsIFwic2l4aW5mZXJpb3JcIiwgXCJzZXZlbmluZmVyaW9yXCIsIFwiZWlnaHRpbmZlcmlvclwiLCBcIm5pbmVpbmZlcmlvclwiLCBcImNlbnRpbmZlcmlvclwiLCBcImRvbGxhcmluZmVyaW9yXCIsIFwicGVyaW9kaW5mZXJpb3JcIiwgXCJjb21tYWluZmVyaW9yXCIsIFwiQWdyYXZlc21hbGxcIiwgXCJBYWN1dGVzbWFsbFwiLCBcIkFjaXJjdW1mbGV4c21hbGxcIiwgXCJBdGlsZGVzbWFsbFwiLCBcIkFkaWVyZXNpc3NtYWxsXCIsIFwiQXJpbmdzbWFsbFwiLCBcIkFFc21hbGxcIiwgXCJDY2VkaWxsYXNtYWxsXCIsIFwiRWdyYXZlc21hbGxcIiwgXCJFYWN1dGVzbWFsbFwiLCBcIkVjaXJjdW1mbGV4c21hbGxcIiwgXCJFZGllcmVzaXNzbWFsbFwiLCBcIklncmF2ZXNtYWxsXCIsIFwiSWFjdXRlc21hbGxcIiwgXCJJY2lyY3VtZmxleHNtYWxsXCIsIFwiSWRpZXJlc2lzc21hbGxcIiwgXCJFdGhzbWFsbFwiLCBcIk50aWxkZXNtYWxsXCIsIFwiT2dyYXZlc21hbGxcIiwgXCJPYWN1dGVzbWFsbFwiLCBcIk9jaXJjdW1mbGV4c21hbGxcIiwgXCJPdGlsZGVzbWFsbFwiLCBcIk9kaWVyZXNpc3NtYWxsXCIsIFwiT0VzbWFsbFwiLCBcIk9zbGFzaHNtYWxsXCIsIFwiVWdyYXZlc21hbGxcIiwgXCJVYWN1dGVzbWFsbFwiLCBcIlVjaXJjdW1mbGV4c21hbGxcIiwgXCJVZGllcmVzaXNzbWFsbFwiLCBcIllhY3V0ZXNtYWxsXCIsIFwiVGhvcm5zbWFsbFwiLCBcIllkaWVyZXNpc3NtYWxsXCIsIFwiMDAxLjAwMFwiLCBcIjAwMS4wMDFcIiwgXCIwMDEuMDAyXCIsIFwiMDAxLjAwM1wiLCBcIkJsYWNrXCIsIFwiQm9sZFwiLCBcIkJvb2tcIiwgXCJMaWdodFwiLCBcIk1lZGl1bVwiLCBcIlJlZ3VsYXJcIiwgXCJSb21hblwiLCBcIlNlbWlib2xkXCJdO1xuXG52YXIgU3RhbmRhcmRFbmNvZGluZyA9IFsnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICdzcGFjZScsICdleGNsYW0nLCAncXVvdGVkYmwnLCAnbnVtYmVyc2lnbicsICdkb2xsYXInLCAncGVyY2VudCcsICdhbXBlcnNhbmQnLCAncXVvdGVyaWdodCcsICdwYXJlbmxlZnQnLCAncGFyZW5yaWdodCcsICdhc3RlcmlzaycsICdwbHVzJywgJ2NvbW1hJywgJ2h5cGhlbicsICdwZXJpb2QnLCAnc2xhc2gnLCAnemVybycsICdvbmUnLCAndHdvJywgJ3RocmVlJywgJ2ZvdXInLCAnZml2ZScsICdzaXgnLCAnc2V2ZW4nLCAnZWlnaHQnLCAnbmluZScsICdjb2xvbicsICdzZW1pY29sb24nLCAnbGVzcycsICdlcXVhbCcsICdncmVhdGVyJywgJ3F1ZXN0aW9uJywgJ2F0JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsICdicmFja2V0bGVmdCcsICdiYWNrc2xhc2gnLCAnYnJhY2tldHJpZ2h0JywgJ2FzY2lpY2lyY3VtJywgJ3VuZGVyc2NvcmUnLCAncXVvdGVsZWZ0JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJywgJ20nLCAnbicsICdvJywgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsICdicmFjZWxlZnQnLCAnYmFyJywgJ2JyYWNlcmlnaHQnLCAnYXNjaWl0aWxkZScsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnZXhjbGFtZG93bicsICdjZW50JywgJ3N0ZXJsaW5nJywgJ2ZyYWN0aW9uJywgJ3llbicsICdmbG9yaW4nLCAnc2VjdGlvbicsICdjdXJyZW5jeScsICdxdW90ZXNpbmdsZScsICdxdW90ZWRibGxlZnQnLCAnZ3VpbGxlbW90bGVmdCcsICdndWlsc2luZ2xsZWZ0JywgJ2d1aWxzaW5nbHJpZ2h0JywgJ2ZpJywgJ2ZsJywgJycsICdlbmRhc2gnLCAnZGFnZ2VyJywgJ2RhZ2dlcmRibCcsICdwZXJpb2RjZW50ZXJlZCcsICcnLCAncGFyYWdyYXBoJywgJ2J1bGxldCcsICdxdW90ZXNpbmdsYmFzZScsICdxdW90ZWRibGJhc2UnLCAncXVvdGVkYmxyaWdodCcsICdndWlsbGVtb3RyaWdodCcsICdlbGxpcHNpcycsICdwZXJ0aG91c2FuZCcsICcnLCAncXVlc3Rpb25kb3duJywgJycsICdncmF2ZScsICdhY3V0ZScsICdjaXJjdW1mbGV4JywgJ3RpbGRlJywgJ21hY3JvbicsICdicmV2ZScsICdkb3RhY2NlbnQnLCAnZGllcmVzaXMnLCAnJywgJ3JpbmcnLCAnY2VkaWxsYScsICcnLCAnaHVuZ2FydW1sYXV0JywgJ29nb25laycsICdjYXJvbicsICdlbWRhc2gnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJ0FFJywgJycsICdvcmRmZW1pbmluZScsICcnLCAnJywgJycsICcnLCAnTHNsYXNoJywgJ09zbGFzaCcsICdPRScsICdvcmRtYXNjdWxpbmUnLCAnJywgJycsICcnLCAnJywgJycsICdhZScsICcnLCAnJywgJycsICdkb3RsZXNzaScsICcnLCAnJywgJ2xzbGFzaCcsICdvc2xhc2gnLCAnb2UnLCAnZ2VybWFuZGJscyddO1xudmFyIEV4cGVydEVuY29kaW5nID0gWycnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJ3NwYWNlJywgJ2V4Y2xhbXNtYWxsJywgJ0h1bmdhcnVtbGF1dHNtYWxsJywgJycsICdkb2xsYXJvbGRzdHlsZScsICdkb2xsYXJzdXBlcmlvcicsICdhbXBlcnNhbmRzbWFsbCcsICdBY3V0ZXNtYWxsJywgJ3BhcmVubGVmdHN1cGVyaW9yJywgJ3BhcmVucmlnaHRzdXBlcmlvcicsICd0d29kb3RlbmxlYWRlcicsICdvbmVkb3RlbmxlYWRlcicsICdjb21tYScsICdoeXBoZW4nLCAncGVyaW9kJywgJ2ZyYWN0aW9uJywgJ3plcm9vbGRzdHlsZScsICdvbmVvbGRzdHlsZScsICd0d29vbGRzdHlsZScsICd0aHJlZW9sZHN0eWxlJywgJ2ZvdXJvbGRzdHlsZScsICdmaXZlb2xkc3R5bGUnLCAnc2l4b2xkc3R5bGUnLCAnc2V2ZW5vbGRzdHlsZScsICdlaWdodG9sZHN0eWxlJywgJ25pbmVvbGRzdHlsZScsICdjb2xvbicsICdzZW1pY29sb24nLCAnY29tbWFzdXBlcmlvcicsICd0aHJlZXF1YXJ0ZXJzZW1kYXNoJywgJ3BlcmlvZHN1cGVyaW9yJywgJ3F1ZXN0aW9uc21hbGwnLCAnJywgJ2FzdXBlcmlvcicsICdic3VwZXJpb3InLCAnY2VudHN1cGVyaW9yJywgJ2RzdXBlcmlvcicsICdlc3VwZXJpb3InLCAnJywgJycsICdpc3VwZXJpb3InLCAnJywgJycsICdsc3VwZXJpb3InLCAnbXN1cGVyaW9yJywgJ25zdXBlcmlvcicsICdvc3VwZXJpb3InLCAnJywgJycsICdyc3VwZXJpb3InLCAnc3N1cGVyaW9yJywgJ3RzdXBlcmlvcicsICcnLCAnZmYnLCAnZmknLCAnZmwnLCAnZmZpJywgJ2ZmbCcsICdwYXJlbmxlZnRpbmZlcmlvcicsICcnLCAncGFyZW5yaWdodGluZmVyaW9yJywgJ0NpcmN1bWZsZXhzbWFsbCcsICdoeXBoZW5zdXBlcmlvcicsICdHcmF2ZXNtYWxsJywgJ0FzbWFsbCcsICdCc21hbGwnLCAnQ3NtYWxsJywgJ0RzbWFsbCcsICdFc21hbGwnLCAnRnNtYWxsJywgJ0dzbWFsbCcsICdIc21hbGwnLCAnSXNtYWxsJywgJ0pzbWFsbCcsICdLc21hbGwnLCAnTHNtYWxsJywgJ01zbWFsbCcsICdOc21hbGwnLCAnT3NtYWxsJywgJ1BzbWFsbCcsICdRc21hbGwnLCAnUnNtYWxsJywgJ1NzbWFsbCcsICdUc21hbGwnLCAnVXNtYWxsJywgJ1ZzbWFsbCcsICdXc21hbGwnLCAnWHNtYWxsJywgJ1lzbWFsbCcsICdac21hbGwnLCAnY29sb25tb25ldGFyeScsICdvbmVmaXR0ZWQnLCAncnVwaWFoJywgJ1RpbGRlc21hbGwnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJ2V4Y2xhbWRvd25zbWFsbCcsICdjZW50b2xkc3R5bGUnLCAnTHNsYXNoc21hbGwnLCAnJywgJycsICdTY2Fyb25zbWFsbCcsICdaY2Fyb25zbWFsbCcsICdEaWVyZXNpc3NtYWxsJywgJ0JyZXZlc21hbGwnLCAnQ2Fyb25zbWFsbCcsICcnLCAnRG90YWNjZW50c21hbGwnLCAnJywgJycsICdNYWNyb25zbWFsbCcsICcnLCAnJywgJ2ZpZ3VyZWRhc2gnLCAnaHlwaGVuaW5mZXJpb3InLCAnJywgJycsICdPZ29uZWtzbWFsbCcsICdSaW5nc21hbGwnLCAnQ2VkaWxsYXNtYWxsJywgJycsICcnLCAnJywgJ29uZXF1YXJ0ZXInLCAnb25laGFsZicsICd0aHJlZXF1YXJ0ZXJzJywgJ3F1ZXN0aW9uZG93bnNtYWxsJywgJ29uZWVpZ2h0aCcsICd0aHJlZWVpZ2h0aHMnLCAnZml2ZWVpZ2h0aHMnLCAnc2V2ZW5laWdodGhzJywgJ29uZXRoaXJkJywgJ3R3b3RoaXJkcycsICcnLCAnJywgJ3plcm9zdXBlcmlvcicsICdvbmVzdXBlcmlvcicsICd0d29zdXBlcmlvcicsICd0aHJlZXN1cGVyaW9yJywgJ2ZvdXJzdXBlcmlvcicsICdmaXZlc3VwZXJpb3InLCAnc2l4c3VwZXJpb3InLCAnc2V2ZW5zdXBlcmlvcicsICdlaWdodHN1cGVyaW9yJywgJ25pbmVzdXBlcmlvcicsICd6ZXJvaW5mZXJpb3InLCAnb25laW5mZXJpb3InLCAndHdvaW5mZXJpb3InLCAndGhyZWVpbmZlcmlvcicsICdmb3VyaW5mZXJpb3InLCAnZml2ZWluZmVyaW9yJywgJ3NpeGluZmVyaW9yJywgJ3NldmVuaW5mZXJpb3InLCAnZWlnaHRpbmZlcmlvcicsICduaW5laW5mZXJpb3InLCAnY2VudGluZmVyaW9yJywgJ2RvbGxhcmluZmVyaW9yJywgJ3BlcmlvZGluZmVyaW9yJywgJ2NvbW1haW5mZXJpb3InLCAnQWdyYXZlc21hbGwnLCAnQWFjdXRlc21hbGwnLCAnQWNpcmN1bWZsZXhzbWFsbCcsICdBdGlsZGVzbWFsbCcsICdBZGllcmVzaXNzbWFsbCcsICdBcmluZ3NtYWxsJywgJ0FFc21hbGwnLCAnQ2NlZGlsbGFzbWFsbCcsICdFZ3JhdmVzbWFsbCcsICdFYWN1dGVzbWFsbCcsICdFY2lyY3VtZmxleHNtYWxsJywgJ0VkaWVyZXNpc3NtYWxsJywgJ0lncmF2ZXNtYWxsJywgJ0lhY3V0ZXNtYWxsJywgJ0ljaXJjdW1mbGV4c21hbGwnLCAnSWRpZXJlc2lzc21hbGwnLCAnRXRoc21hbGwnLCAnTnRpbGRlc21hbGwnLCAnT2dyYXZlc21hbGwnLCAnT2FjdXRlc21hbGwnLCAnT2NpcmN1bWZsZXhzbWFsbCcsICdPdGlsZGVzbWFsbCcsICdPZGllcmVzaXNzbWFsbCcsICdPRXNtYWxsJywgJ09zbGFzaHNtYWxsJywgJ1VncmF2ZXNtYWxsJywgJ1VhY3V0ZXNtYWxsJywgJ1VjaXJjdW1mbGV4c21hbGwnLCAnVWRpZXJlc2lzc21hbGwnLCAnWWFjdXRlc21hbGwnLCAnVGhvcm5zbWFsbCcsICdZZGllcmVzaXNzbWFsbCddO1xuXG52YXIgSVNPQWRvYmVDaGFyc2V0ID0gWycubm90ZGVmJywgJ3NwYWNlJywgJ2V4Y2xhbScsICdxdW90ZWRibCcsICdudW1iZXJzaWduJywgJ2RvbGxhcicsICdwZXJjZW50JywgJ2FtcGVyc2FuZCcsICdxdW90ZXJpZ2h0JywgJ3BhcmVubGVmdCcsICdwYXJlbnJpZ2h0JywgJ2FzdGVyaXNrJywgJ3BsdXMnLCAnY29tbWEnLCAnaHlwaGVuJywgJ3BlcmlvZCcsICdzbGFzaCcsICd6ZXJvJywgJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicsICdmaXZlJywgJ3NpeCcsICdzZXZlbicsICdlaWdodCcsICduaW5lJywgJ2NvbG9uJywgJ3NlbWljb2xvbicsICdsZXNzJywgJ2VxdWFsJywgJ2dyZWF0ZXInLCAncXVlc3Rpb24nLCAnYXQnLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywgJ2JyYWNrZXRsZWZ0JywgJ2JhY2tzbGFzaCcsICdicmFja2V0cmlnaHQnLCAnYXNjaWljaXJjdW0nLCAndW5kZXJzY29yZScsICdxdW90ZWxlZnQnLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsICduJywgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgJ2JyYWNlbGVmdCcsICdiYXInLCAnYnJhY2VyaWdodCcsICdhc2NpaXRpbGRlJywgJ2V4Y2xhbWRvd24nLCAnY2VudCcsICdzdGVybGluZycsICdmcmFjdGlvbicsICd5ZW4nLCAnZmxvcmluJywgJ3NlY3Rpb24nLCAnY3VycmVuY3knLCAncXVvdGVzaW5nbGUnLCAncXVvdGVkYmxsZWZ0JywgJ2d1aWxsZW1vdGxlZnQnLCAnZ3VpbHNpbmdsbGVmdCcsICdndWlsc2luZ2xyaWdodCcsICdmaScsICdmbCcsICdlbmRhc2gnLCAnZGFnZ2VyJywgJ2RhZ2dlcmRibCcsICdwZXJpb2RjZW50ZXJlZCcsICdwYXJhZ3JhcGgnLCAnYnVsbGV0JywgJ3F1b3Rlc2luZ2xiYXNlJywgJ3F1b3RlZGJsYmFzZScsICdxdW90ZWRibHJpZ2h0JywgJ2d1aWxsZW1vdHJpZ2h0JywgJ2VsbGlwc2lzJywgJ3BlcnRob3VzYW5kJywgJ3F1ZXN0aW9uZG93bicsICdncmF2ZScsICdhY3V0ZScsICdjaXJjdW1mbGV4JywgJ3RpbGRlJywgJ21hY3JvbicsICdicmV2ZScsICdkb3RhY2NlbnQnLCAnZGllcmVzaXMnLCAncmluZycsICdjZWRpbGxhJywgJ2h1bmdhcnVtbGF1dCcsICdvZ29uZWsnLCAnY2Fyb24nLCAnZW1kYXNoJywgJ0FFJywgJ29yZGZlbWluaW5lJywgJ0xzbGFzaCcsICdPc2xhc2gnLCAnT0UnLCAnb3JkbWFzY3VsaW5lJywgJ2FlJywgJ2RvdGxlc3NpJywgJ2xzbGFzaCcsICdvc2xhc2gnLCAnb2UnLCAnZ2VybWFuZGJscycsICdvbmVzdXBlcmlvcicsICdsb2dpY2Fsbm90JywgJ211JywgJ3RyYWRlbWFyaycsICdFdGgnLCAnb25laGFsZicsICdwbHVzbWludXMnLCAnVGhvcm4nLCAnb25lcXVhcnRlcicsICdkaXZpZGUnLCAnYnJva2VuYmFyJywgJ2RlZ3JlZScsICd0aG9ybicsICd0aHJlZXF1YXJ0ZXJzJywgJ3R3b3N1cGVyaW9yJywgJ3JlZ2lzdGVyZWQnLCAnbWludXMnLCAnZXRoJywgJ211bHRpcGx5JywgJ3RocmVlc3VwZXJpb3InLCAnY29weXJpZ2h0JywgJ0FhY3V0ZScsICdBY2lyY3VtZmxleCcsICdBZGllcmVzaXMnLCAnQWdyYXZlJywgJ0FyaW5nJywgJ0F0aWxkZScsICdDY2VkaWxsYScsICdFYWN1dGUnLCAnRWNpcmN1bWZsZXgnLCAnRWRpZXJlc2lzJywgJ0VncmF2ZScsICdJYWN1dGUnLCAnSWNpcmN1bWZsZXgnLCAnSWRpZXJlc2lzJywgJ0lncmF2ZScsICdOdGlsZGUnLCAnT2FjdXRlJywgJ09jaXJjdW1mbGV4JywgJ09kaWVyZXNpcycsICdPZ3JhdmUnLCAnT3RpbGRlJywgJ1NjYXJvbicsICdVYWN1dGUnLCAnVWNpcmN1bWZsZXgnLCAnVWRpZXJlc2lzJywgJ1VncmF2ZScsICdZYWN1dGUnLCAnWWRpZXJlc2lzJywgJ1pjYXJvbicsICdhYWN1dGUnLCAnYWNpcmN1bWZsZXgnLCAnYWRpZXJlc2lzJywgJ2FncmF2ZScsICdhcmluZycsICdhdGlsZGUnLCAnY2NlZGlsbGEnLCAnZWFjdXRlJywgJ2VjaXJjdW1mbGV4JywgJ2VkaWVyZXNpcycsICdlZ3JhdmUnLCAnaWFjdXRlJywgJ2ljaXJjdW1mbGV4JywgJ2lkaWVyZXNpcycsICdpZ3JhdmUnLCAnbnRpbGRlJywgJ29hY3V0ZScsICdvY2lyY3VtZmxleCcsICdvZGllcmVzaXMnLCAnb2dyYXZlJywgJ290aWxkZScsICdzY2Fyb24nLCAndWFjdXRlJywgJ3VjaXJjdW1mbGV4JywgJ3VkaWVyZXNpcycsICd1Z3JhdmUnLCAneWFjdXRlJywgJ3lkaWVyZXNpcycsICd6Y2Fyb24nXTtcbnZhciBFeHBlcnRDaGFyc2V0ID0gWycubm90ZGVmJywgJ3NwYWNlJywgJ2V4Y2xhbXNtYWxsJywgJ0h1bmdhcnVtbGF1dHNtYWxsJywgJ2RvbGxhcm9sZHN0eWxlJywgJ2RvbGxhcnN1cGVyaW9yJywgJ2FtcGVyc2FuZHNtYWxsJywgJ0FjdXRlc21hbGwnLCAncGFyZW5sZWZ0c3VwZXJpb3InLCAncGFyZW5yaWdodHN1cGVyaW9yJywgJ3R3b2RvdGVubGVhZGVyJywgJ29uZWRvdGVubGVhZGVyJywgJ2NvbW1hJywgJ2h5cGhlbicsICdwZXJpb2QnLCAnZnJhY3Rpb24nLCAnemVyb29sZHN0eWxlJywgJ29uZW9sZHN0eWxlJywgJ3R3b29sZHN0eWxlJywgJ3RocmVlb2xkc3R5bGUnLCAnZm91cm9sZHN0eWxlJywgJ2ZpdmVvbGRzdHlsZScsICdzaXhvbGRzdHlsZScsICdzZXZlbm9sZHN0eWxlJywgJ2VpZ2h0b2xkc3R5bGUnLCAnbmluZW9sZHN0eWxlJywgJ2NvbG9uJywgJ3NlbWljb2xvbicsICdjb21tYXN1cGVyaW9yJywgJ3RocmVlcXVhcnRlcnNlbWRhc2gnLCAncGVyaW9kc3VwZXJpb3InLCAncXVlc3Rpb25zbWFsbCcsICdhc3VwZXJpb3InLCAnYnN1cGVyaW9yJywgJ2NlbnRzdXBlcmlvcicsICdkc3VwZXJpb3InLCAnZXN1cGVyaW9yJywgJ2lzdXBlcmlvcicsICdsc3VwZXJpb3InLCAnbXN1cGVyaW9yJywgJ25zdXBlcmlvcicsICdvc3VwZXJpb3InLCAncnN1cGVyaW9yJywgJ3NzdXBlcmlvcicsICd0c3VwZXJpb3InLCAnZmYnLCAnZmknLCAnZmwnLCAnZmZpJywgJ2ZmbCcsICdwYXJlbmxlZnRpbmZlcmlvcicsICdwYXJlbnJpZ2h0aW5mZXJpb3InLCAnQ2lyY3VtZmxleHNtYWxsJywgJ2h5cGhlbnN1cGVyaW9yJywgJ0dyYXZlc21hbGwnLCAnQXNtYWxsJywgJ0JzbWFsbCcsICdDc21hbGwnLCAnRHNtYWxsJywgJ0VzbWFsbCcsICdGc21hbGwnLCAnR3NtYWxsJywgJ0hzbWFsbCcsICdJc21hbGwnLCAnSnNtYWxsJywgJ0tzbWFsbCcsICdMc21hbGwnLCAnTXNtYWxsJywgJ05zbWFsbCcsICdPc21hbGwnLCAnUHNtYWxsJywgJ1FzbWFsbCcsICdSc21hbGwnLCAnU3NtYWxsJywgJ1RzbWFsbCcsICdVc21hbGwnLCAnVnNtYWxsJywgJ1dzbWFsbCcsICdYc21hbGwnLCAnWXNtYWxsJywgJ1pzbWFsbCcsICdjb2xvbm1vbmV0YXJ5JywgJ29uZWZpdHRlZCcsICdydXBpYWgnLCAnVGlsZGVzbWFsbCcsICdleGNsYW1kb3duc21hbGwnLCAnY2VudG9sZHN0eWxlJywgJ0xzbGFzaHNtYWxsJywgJ1NjYXJvbnNtYWxsJywgJ1pjYXJvbnNtYWxsJywgJ0RpZXJlc2lzc21hbGwnLCAnQnJldmVzbWFsbCcsICdDYXJvbnNtYWxsJywgJ0RvdGFjY2VudHNtYWxsJywgJ01hY3JvbnNtYWxsJywgJ2ZpZ3VyZWRhc2gnLCAnaHlwaGVuaW5mZXJpb3InLCAnT2dvbmVrc21hbGwnLCAnUmluZ3NtYWxsJywgJ0NlZGlsbGFzbWFsbCcsICdvbmVxdWFydGVyJywgJ29uZWhhbGYnLCAndGhyZWVxdWFydGVycycsICdxdWVzdGlvbmRvd25zbWFsbCcsICdvbmVlaWdodGgnLCAndGhyZWVlaWdodGhzJywgJ2ZpdmVlaWdodGhzJywgJ3NldmVuZWlnaHRocycsICdvbmV0aGlyZCcsICd0d290aGlyZHMnLCAnemVyb3N1cGVyaW9yJywgJ29uZXN1cGVyaW9yJywgJ3R3b3N1cGVyaW9yJywgJ3RocmVlc3VwZXJpb3InLCAnZm91cnN1cGVyaW9yJywgJ2ZpdmVzdXBlcmlvcicsICdzaXhzdXBlcmlvcicsICdzZXZlbnN1cGVyaW9yJywgJ2VpZ2h0c3VwZXJpb3InLCAnbmluZXN1cGVyaW9yJywgJ3plcm9pbmZlcmlvcicsICdvbmVpbmZlcmlvcicsICd0d29pbmZlcmlvcicsICd0aHJlZWluZmVyaW9yJywgJ2ZvdXJpbmZlcmlvcicsICdmaXZlaW5mZXJpb3InLCAnc2l4aW5mZXJpb3InLCAnc2V2ZW5pbmZlcmlvcicsICdlaWdodGluZmVyaW9yJywgJ25pbmVpbmZlcmlvcicsICdjZW50aW5mZXJpb3InLCAnZG9sbGFyaW5mZXJpb3InLCAncGVyaW9kaW5mZXJpb3InLCAnY29tbWFpbmZlcmlvcicsICdBZ3JhdmVzbWFsbCcsICdBYWN1dGVzbWFsbCcsICdBY2lyY3VtZmxleHNtYWxsJywgJ0F0aWxkZXNtYWxsJywgJ0FkaWVyZXNpc3NtYWxsJywgJ0FyaW5nc21hbGwnLCAnQUVzbWFsbCcsICdDY2VkaWxsYXNtYWxsJywgJ0VncmF2ZXNtYWxsJywgJ0VhY3V0ZXNtYWxsJywgJ0VjaXJjdW1mbGV4c21hbGwnLCAnRWRpZXJlc2lzc21hbGwnLCAnSWdyYXZlc21hbGwnLCAnSWFjdXRlc21hbGwnLCAnSWNpcmN1bWZsZXhzbWFsbCcsICdJZGllcmVzaXNzbWFsbCcsICdFdGhzbWFsbCcsICdOdGlsZGVzbWFsbCcsICdPZ3JhdmVzbWFsbCcsICdPYWN1dGVzbWFsbCcsICdPY2lyY3VtZmxleHNtYWxsJywgJ090aWxkZXNtYWxsJywgJ09kaWVyZXNpc3NtYWxsJywgJ09Fc21hbGwnLCAnT3NsYXNoc21hbGwnLCAnVWdyYXZlc21hbGwnLCAnVWFjdXRlc21hbGwnLCAnVWNpcmN1bWZsZXhzbWFsbCcsICdVZGllcmVzaXNzbWFsbCcsICdZYWN1dGVzbWFsbCcsICdUaG9ybnNtYWxsJywgJ1lkaWVyZXNpc3NtYWxsJ107XG52YXIgRXhwZXJ0U3Vic2V0Q2hhcnNldCA9IFsnLm5vdGRlZicsICdzcGFjZScsICdkb2xsYXJvbGRzdHlsZScsICdkb2xsYXJzdXBlcmlvcicsICdwYXJlbmxlZnRzdXBlcmlvcicsICdwYXJlbnJpZ2h0c3VwZXJpb3InLCAndHdvZG90ZW5sZWFkZXInLCAnb25lZG90ZW5sZWFkZXInLCAnY29tbWEnLCAnaHlwaGVuJywgJ3BlcmlvZCcsICdmcmFjdGlvbicsICd6ZXJvb2xkc3R5bGUnLCAnb25lb2xkc3R5bGUnLCAndHdvb2xkc3R5bGUnLCAndGhyZWVvbGRzdHlsZScsICdmb3Vyb2xkc3R5bGUnLCAnZml2ZW9sZHN0eWxlJywgJ3NpeG9sZHN0eWxlJywgJ3NldmVub2xkc3R5bGUnLCAnZWlnaHRvbGRzdHlsZScsICduaW5lb2xkc3R5bGUnLCAnY29sb24nLCAnc2VtaWNvbG9uJywgJ2NvbW1hc3VwZXJpb3InLCAndGhyZWVxdWFydGVyc2VtZGFzaCcsICdwZXJpb2RzdXBlcmlvcicsICdhc3VwZXJpb3InLCAnYnN1cGVyaW9yJywgJ2NlbnRzdXBlcmlvcicsICdkc3VwZXJpb3InLCAnZXN1cGVyaW9yJywgJ2lzdXBlcmlvcicsICdsc3VwZXJpb3InLCAnbXN1cGVyaW9yJywgJ25zdXBlcmlvcicsICdvc3VwZXJpb3InLCAncnN1cGVyaW9yJywgJ3NzdXBlcmlvcicsICd0c3VwZXJpb3InLCAnZmYnLCAnZmknLCAnZmwnLCAnZmZpJywgJ2ZmbCcsICdwYXJlbmxlZnRpbmZlcmlvcicsICdwYXJlbnJpZ2h0aW5mZXJpb3InLCAnaHlwaGVuc3VwZXJpb3InLCAnY29sb25tb25ldGFyeScsICdvbmVmaXR0ZWQnLCAncnVwaWFoJywgJ2NlbnRvbGRzdHlsZScsICdmaWd1cmVkYXNoJywgJ2h5cGhlbmluZmVyaW9yJywgJ29uZXF1YXJ0ZXInLCAnb25laGFsZicsICd0aHJlZXF1YXJ0ZXJzJywgJ29uZWVpZ2h0aCcsICd0aHJlZWVpZ2h0aHMnLCAnZml2ZWVpZ2h0aHMnLCAnc2V2ZW5laWdodGhzJywgJ29uZXRoaXJkJywgJ3R3b3RoaXJkcycsICd6ZXJvc3VwZXJpb3InLCAnb25lc3VwZXJpb3InLCAndHdvc3VwZXJpb3InLCAndGhyZWVzdXBlcmlvcicsICdmb3Vyc3VwZXJpb3InLCAnZml2ZXN1cGVyaW9yJywgJ3NpeHN1cGVyaW9yJywgJ3NldmVuc3VwZXJpb3InLCAnZWlnaHRzdXBlcmlvcicsICduaW5lc3VwZXJpb3InLCAnemVyb2luZmVyaW9yJywgJ29uZWluZmVyaW9yJywgJ3R3b2luZmVyaW9yJywgJ3RocmVlaW5mZXJpb3InLCAnZm91cmluZmVyaW9yJywgJ2ZpdmVpbmZlcmlvcicsICdzaXhpbmZlcmlvcicsICdzZXZlbmluZmVyaW9yJywgJ2VpZ2h0aW5mZXJpb3InLCAnbmluZWluZmVyaW9yJywgJ2NlbnRpbmZlcmlvcicsICdkb2xsYXJpbmZlcmlvcicsICdwZXJpb2RpbmZlcmlvcicsICdjb21tYWluZmVyaW9yJ107XG5cbi8vIFNjcmlwdHMgYW5kIExhbmd1YWdlcyAjXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG52YXIgTGFuZ1N5c1RhYmxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgcmVxRmVhdHVyZUluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGZlYXR1cmVDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBmZWF0dXJlSW5kZXhlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ2ZlYXR1cmVDb3VudCcpXG59KTtcbnZhciBMYW5nU3lzUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgbGFuZ1N5czogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBMYW5nU3lzVGFibGUsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgU2NyaXB0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGRlZmF1bHRMYW5nU3lzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIExhbmdTeXNUYWJsZSksXG4gIGNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxhbmdTeXNSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTGFuZ1N5c1JlY29yZCwgJ2NvdW50Jylcbn0pO1xudmFyIFNjcmlwdFJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIHNjcmlwdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBTY3JpcHQsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgU2NyaXB0TGlzdCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShTY3JpcHRSZWNvcmQsIHJlc3RydWN0dXJlLnVpbnQxNik7IC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbi8vIEZlYXR1cmVzIGFuZCBMb29rdXBzICNcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxudmFyIEZlYXR1cmUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmVhdHVyZVBhcmFtczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBwb2ludGVyXG4gIGxvb2t1cENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxvb2t1cExpc3RJbmRleGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnbG9va3VwQ291bnQnKVxufSk7XG52YXIgRmVhdHVyZVJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIGZlYXR1cmU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgRmVhdHVyZSwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBGZWF0dXJlTGlzdCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShGZWF0dXJlUmVjb3JkLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIExvb2t1cEZsYWdzID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG1hcmtBdHRhY2htZW50VHlwZTogcmVzdHJ1Y3R1cmUudWludDgsXG4gIGZsYWdzOiBuZXcgcmVzdHJ1Y3R1cmUuQml0ZmllbGQocmVzdHJ1Y3R1cmUudWludDgsIFsncmlnaHRUb0xlZnQnLCAnaWdub3JlQmFzZUdseXBocycsICdpZ25vcmVMaWdhdHVyZXMnLCAnaWdub3JlTWFya3MnLCAndXNlTWFya0ZpbHRlcmluZ1NldCddKVxufSk7XG5mdW5jdGlvbiBMb29rdXBMaXN0KFN1YlRhYmxlKSB7XG4gIHZhciBMb29rdXAgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgICBsb29rdXBUeXBlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZmxhZ3M6IExvb2t1cEZsYWdzLFxuICAgIHN1YlRhYmxlQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBzdWJUYWJsZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFN1YlRhYmxlKSwgJ3N1YlRhYmxlQ291bnQnKSxcbiAgICBtYXJrRmlsdGVyaW5nU2V0OiBuZXcgcmVzdHJ1Y3R1cmUuT3B0aW9uYWwocmVzdHJ1Y3R1cmUudWludDE2LCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQuZmxhZ3MuZmxhZ3MudXNlTWFya0ZpbHRlcmluZ1NldDtcbiAgICB9KVxuICB9KTtcbiAgcmV0dXJuIG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBMb29rdXApLCByZXN0cnVjdHVyZS51aW50MTYpO1xufSAvLyMjIyMjIyMjIyMjIyMjIyMjXG4vLyBDb3ZlcmFnZSBUYWJsZSAjXG4vLyMjIyMjIyMjIyMjIyMjIyMjXG5cbnZhciBSYW5nZVJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBzdGFydDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBlbmQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc3RhcnRDb3ZlcmFnZUluZGV4OiByZXN0cnVjdHVyZS51aW50MTZcbn0pO1xudmFyIENvdmVyYWdlID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgMToge1xuICAgIGdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBnbHlwaHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdnbHlwaENvdW50JylcbiAgfSxcbiAgMjoge1xuICAgIHJhbmdlQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICByYW5nZVJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShSYW5nZVJlY29yZCwgJ3JhbmdlQ291bnQnKVxuICB9XG59KTsgLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4vLyBDbGFzcyBEZWZpbml0aW9uIFRhYmxlICNcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG52YXIgQ2xhc3NSYW5nZVJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBzdGFydDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBlbmQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgXCJjbGFzc1wiOiByZXN0cnVjdHVyZS51aW50MTZcbn0pO1xudmFyIENsYXNzRGVmID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgMToge1xuICAgIC8vIENsYXNzIGFycmF5XG4gICAgc3RhcnRHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjbGFzc1ZhbHVlQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdnbHlwaENvdW50JylcbiAgfSxcbiAgMjoge1xuICAgIC8vIENsYXNzIHJhbmdlc1xuICAgIGNsYXNzUmFuZ2VDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNsYXNzUmFuZ2VSZWNvcmQ6IG5ldyByZXN0cnVjdHVyZS5BcnJheShDbGFzc1JhbmdlUmVjb3JkLCAnY2xhc3NSYW5nZUNvdW50JylcbiAgfVxufSk7IC8vIyMjIyMjIyMjIyMjIyMjXG4vLyBEZXZpY2UgVGFibGUgI1xuLy8jIyMjIyMjIyMjIyMjIyNcblxudmFyIERldmljZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBhOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIHN0YXJ0U2l6ZSBmb3IgaGludGluZyBEZXZpY2UsIG91dGVySW5kZXggZm9yIFZhcmlhdGlvbkluZGV4XG4gIGI6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gZW5kU2l6ZSBmb3IgRGV2aWNlLCBpbm5lckluZGV4IGZvciBWYXJpYXRpb25JbmRleFxuICBkZWx0YUZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2XG59KTsgLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbi8vIENvbnRleHR1YWwgU3Vic3RpdHV0aW9uL1Bvc2l0aW9uaW5nIFRhYmxlcyAjXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG52YXIgTG9va3VwUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHNlcXVlbmNlSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbG9va3VwTGlzdEluZGV4OiByZXN0cnVjdHVyZS51aW50MTZcbn0pO1xudmFyIFJ1bGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZ2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsb29rdXBDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBpbnB1dDogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5nbHlwaENvdW50IC0gMTtcbiAgfSksXG4gIGxvb2t1cFJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShMb29rdXBSZWNvcmQsICdsb29rdXBDb3VudCcpXG59KTtcbnZhciBSdWxlU2V0ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgUnVsZSksIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgQ2xhc3NSdWxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGdseXBoQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbG9va3VwQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgY2xhc3NlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5nbHlwaENvdW50IC0gMTtcbiAgfSksXG4gIGxvb2t1cFJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShMb29rdXBSZWNvcmQsICdsb29rdXBDb3VudCcpXG59KTtcbnZhciBDbGFzc1NldCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzUnVsZSksIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgQ29udGV4dCA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIDE6IHtcbiAgICAvLyBTaW1wbGUgY29udGV4dFxuICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBydWxlU2V0Q291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBydWxlU2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgUnVsZVNldCksICdydWxlU2V0Q291bnQnKVxuICB9LFxuICAyOiB7XG4gICAgLy8gQ2xhc3MtYmFzZWQgY29udGV4dFxuICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBjbGFzc0RlZjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc0RlZiksXG4gICAgY2xhc3NTZXRDbnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjbGFzc1NldDogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NTZXQpLCAnY2xhc3NTZXRDbnQnKVxuICB9LFxuICAzOiB7XG4gICAgZ2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGxvb2t1cENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY292ZXJhZ2VzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksICdnbHlwaENvdW50JyksXG4gICAgbG9va3VwUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KExvb2t1cFJlY29yZCwgJ2xvb2t1cENvdW50JylcbiAgfVxufSk7IC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4vLyBDaGFpbmluZyBDb250ZXh0dWFsIFN1YnN0aXR1dGlvbi9Qb3NpdGlvbmluZyBUYWJsZXMgI1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxudmFyIENoYWluUnVsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBiYWNrdHJhY2tHbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGJhY2t0cmFjazogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ2JhY2t0cmFja0dseXBoQ291bnQnKSxcbiAgaW5wdXRHbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGlucHV0OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LmlucHV0R2x5cGhDb3VudCAtIDE7XG4gIH0pLFxuICBsb29rYWhlYWRHbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxvb2thaGVhZDogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ2xvb2thaGVhZEdseXBoQ291bnQnKSxcbiAgbG9va3VwQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbG9va3VwUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KExvb2t1cFJlY29yZCwgJ2xvb2t1cENvdW50Jylcbn0pO1xudmFyIENoYWluUnVsZVNldCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENoYWluUnVsZSksIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgQ2hhaW5pbmdDb250ZXh0ID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgMToge1xuICAgIC8vIFNpbXBsZSBjb250ZXh0IGdseXBoIHN1YnN0aXR1dGlvblxuICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBjaGFpbkNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY2hhaW5SdWxlU2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2hhaW5SdWxlU2V0KSwgJ2NoYWluQ291bnQnKVxuICB9LFxuICAyOiB7XG4gICAgLy8gQ2xhc3MtYmFzZWQgY2hhaW5pbmcgY29udGV4dFxuICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBiYWNrdHJhY2tDbGFzc0RlZjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc0RlZiksXG4gICAgaW5wdXRDbGFzc0RlZjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc0RlZiksXG4gICAgbG9va2FoZWFkQ2xhc3NEZWY6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NEZWYpLFxuICAgIGNoYWluQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjaGFpbkNsYXNzU2V0OiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDaGFpblJ1bGVTZXQpLCAnY2hhaW5Db3VudCcpXG4gIH0sXG4gIDM6IHtcbiAgICAvLyBDb3ZlcmFnZS1iYXNlZCBjaGFpbmluZyBjb250ZXh0XG4gICAgYmFja3RyYWNrR2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGJhY2t0cmFja0NvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksICdiYWNrdHJhY2tHbHlwaENvdW50JyksXG4gICAgaW5wdXRHbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgaW5wdXRDb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLCAnaW5wdXRHbHlwaENvdW50JyksXG4gICAgbG9va2FoZWFkR2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGxvb2thaGVhZENvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksICdsb29rYWhlYWRHbHlwaENvdW50JyksXG4gICAgbG9va3VwQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBsb29rdXBSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTG9va3VwUmVjb3JkLCAnbG9va3VwQ291bnQnKVxuICB9XG59KTtcblxudmFyIF87XG4vKioqKioqKioqKioqKioqKioqKlxuICogVmFyaWF0aW9uIFN0b3JlICpcbiAqKioqKioqKioqKioqKioqKioqL1xuXG52YXIgRjJET1QxNCA9IG5ldyByZXN0cnVjdHVyZS5GaXhlZCgxNiwgJ0JFJywgMTQpO1xudmFyIFJlZ2lvbkF4aXNDb29yZGluYXRlcyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBzdGFydENvb3JkOiBGMkRPVDE0LFxuICBwZWFrQ29vcmQ6IEYyRE9UMTQsXG4gIGVuZENvb3JkOiBGMkRPVDE0XG59KTtcbnZhciBWYXJpYXRpb25SZWdpb25MaXN0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGF4aXNDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICByZWdpb25Db3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB2YXJpYXRpb25SZWdpb25zOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLkFycmF5KFJlZ2lvbkF4aXNDb29yZGluYXRlcywgJ2F4aXNDb3VudCcpLCAncmVnaW9uQ291bnQnKVxufSk7XG52YXIgRGVsdGFTZXQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgc2hvcnREZWx0YXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS5pbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQuc2hvcnREZWx0YUNvdW50O1xuICB9KSxcbiAgcmVnaW9uRGVsdGFzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUuaW50OCwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQucmVnaW9uSW5kZXhDb3VudCAtIHQucGFyZW50LnNob3J0RGVsdGFDb3VudDtcbiAgfSksXG4gIGRlbHRhczogZnVuY3Rpb24gZGVsdGFzKHQpIHtcbiAgICByZXR1cm4gdC5zaG9ydERlbHRhcy5jb25jYXQodC5yZWdpb25EZWx0YXMpO1xuICB9XG59KTtcbnZhciBJdGVtVmFyaWF0aW9uRGF0YSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBpdGVtQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc2hvcnREZWx0YUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHJlZ2lvbkluZGV4Q291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcmVnaW9uSW5kZXhlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ3JlZ2lvbkluZGV4Q291bnQnKSxcbiAgZGVsdGFTZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRGVsdGFTZXQsICdpdGVtQ291bnQnKVxufSk7XG52YXIgSXRlbVZhcmlhdGlvblN0b3JlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB2YXJpYXRpb25SZWdpb25MaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIFZhcmlhdGlvblJlZ2lvbkxpc3QpLFxuICB2YXJpYXRpb25EYXRhQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgaXRlbVZhcmlhdGlvbkRhdGE6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEl0ZW1WYXJpYXRpb25EYXRhKSwgJ3ZhcmlhdGlvbkRhdGFDb3VudCcpXG59KTtcbi8qKioqKioqKioqKioqKioqKioqKioqXG4gKiBGZWF0dXJlIFZhcmlhdGlvbnMgKlxuICoqKioqKioqKioqKioqKioqKioqKiovXG5cbnZhciBDb25kaXRpb25UYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIDE6IChfID0ge1xuICAgIGF4aXNJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH0sIF9bXCJheGlzSW5kZXhcIl0gPSByZXN0cnVjdHVyZS51aW50MTYsIF8uZmlsdGVyUmFuZ2VNaW5WYWx1ZSA9IEYyRE9UMTQsIF8uZmlsdGVyUmFuZ2VNYXhWYWx1ZSA9IEYyRE9UMTQsIF8pXG59KTtcbnZhciBDb25kaXRpb25TZXQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgY29uZGl0aW9uQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgY29uZGl0aW9uVGFibGU6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIENvbmRpdGlvblRhYmxlKSwgJ2NvbmRpdGlvbkNvdW50Jylcbn0pO1xudmFyIEZlYXR1cmVUYWJsZVN1YnN0aXR1dGlvblJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmZWF0dXJlSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgYWx0ZXJuYXRlRmVhdHVyZVRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEZlYXR1cmUsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgRmVhdHVyZVRhYmxlU3Vic3RpdHV0aW9uID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIHN1YnN0aXR1dGlvbkNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHN1YnN0aXR1dGlvbnM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShGZWF0dXJlVGFibGVTdWJzdGl0dXRpb25SZWNvcmQsICdzdWJzdGl0dXRpb25Db3VudCcpXG59KTtcbnZhciBGZWF0dXJlVmFyaWF0aW9uUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGNvbmRpdGlvblNldDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBDb25kaXRpb25TZXQsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KSxcbiAgZmVhdHVyZVRhYmxlU3Vic3RpdHV0aW9uOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEZlYXR1cmVUYWJsZVN1YnN0aXR1dGlvbiwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBGZWF0dXJlVmFyaWF0aW9ucyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBtYWpvclZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWlub3JWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGZlYXR1cmVWYXJpYXRpb25SZWNvcmRDb3VudDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBmZWF0dXJlVmFyaWF0aW9uUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEZlYXR1cmVWYXJpYXRpb25SZWNvcmQsICdmZWF0dXJlVmFyaWF0aW9uUmVjb3JkQ291bnQnKVxufSk7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJDEoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG4vLyBvdGhlcndpc2UgZGVsZWdhdGVzIHRvIHRoZSBwcm92aWRlZCB0eXBlLlxuXG52YXIgUHJlZGVmaW5lZE9wID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUHJlZGVmaW5lZE9wKHByZWRlZmluZWRPcHMsIHR5cGUpIHtcbiAgICB0aGlzLnByZWRlZmluZWRPcHMgPSBwcmVkZWZpbmVkT3BzO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gUHJlZGVmaW5lZE9wLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50LCBvcGVyYW5kcykge1xuICAgIGlmICh0aGlzLnByZWRlZmluZWRPcHNbb3BlcmFuZHNbMF1dKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVkZWZpbmVkT3BzW29wZXJhbmRzWzBdXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50eXBlLmRlY29kZShzdHJlYW0sIHBhcmVudCwgb3BlcmFuZHMpO1xuICB9O1xuXG4gIF9wcm90by5zaXplID0gZnVuY3Rpb24gc2l6ZSh2YWx1ZSwgY3R4KSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZS5zaXplKHZhbHVlLCBjdHgpO1xuICB9O1xuXG4gIF9wcm90by5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyZWFtLCB2YWx1ZSwgY3R4KSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5wcmVkZWZpbmVkT3BzLmluZGV4T2YodmFsdWUpO1xuXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnR5cGUuZW5jb2RlKHN0cmVhbSwgdmFsdWUsIGN0eCk7XG4gIH07XG5cbiAgcmV0dXJuIFByZWRlZmluZWRPcDtcbn0oKTtcblxudmFyIENGRkVuY29kaW5nVmVyc2lvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX3IkTnVtYmVyKSB7XG4gIF9pbmhlcml0c0xvb3NlJDEoQ0ZGRW5jb2RpbmdWZXJzaW9uLCBfciROdW1iZXIpO1xuXG4gIGZ1bmN0aW9uIENGRkVuY29kaW5nVmVyc2lvbigpIHtcbiAgICByZXR1cm4gX3IkTnVtYmVyLmNhbGwodGhpcywgJ1VJbnQ4JykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8yID0gQ0ZGRW5jb2RpbmdWZXJzaW9uLnByb3RvdHlwZTtcblxuICBfcHJvdG8yLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0pIHtcbiAgICByZXR1cm4gcmVzdHJ1Y3R1cmUudWludDguZGVjb2RlKHN0cmVhbSkgJiAweDdmO1xuICB9O1xuXG4gIHJldHVybiBDRkZFbmNvZGluZ1ZlcnNpb247XG59KHJlc3RydWN0dXJlLk51bWJlcik7XG5cbnZhciBSYW5nZTEgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmlyc3Q6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbkxlZnQ6IHJlc3RydWN0dXJlLnVpbnQ4XG59KTtcbnZhciBSYW5nZTIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmlyc3Q6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbkxlZnQ6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7XG52YXIgQ0ZGQ3VzdG9tRW5jb2RpbmcgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KG5ldyBDRkZFbmNvZGluZ1ZlcnNpb24oKSwge1xuICAwOiB7XG4gICAgbkNvZGVzOiByZXN0cnVjdHVyZS51aW50OCxcbiAgICBjb2RlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCAnbkNvZGVzJylcbiAgfSxcbiAgMToge1xuICAgIG5SYW5nZXM6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAgIHJhbmdlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFJhbmdlMSwgJ25SYW5nZXMnKVxuICB9IC8vIFRPRE86IHN1cHBsZW1lbnQ/XG5cbn0pO1xudmFyIENGRkVuY29kaW5nID0gbmV3IFByZWRlZmluZWRPcChbU3RhbmRhcmRFbmNvZGluZywgRXhwZXJ0RW5jb2RpbmddLCBuZXcgQ0ZGUG9pbnRlcihDRkZDdXN0b21FbmNvZGluZywge1xuICBsYXp5OiB0cnVlXG59KSk7IC8vIERlY29kZXMgYW4gYXJyYXkgb2YgcmFuZ2VzIHVudGlsIHRoZSB0b3RhbFxuLy8gbGVuZ3RoIGlzIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBsZW5ndGguXG5cbnZhciBSYW5nZUFycmF5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfciRBcnJheSkge1xuICBfaW5oZXJpdHNMb29zZSQxKFJhbmdlQXJyYXksIF9yJEFycmF5KTtcblxuICBmdW5jdGlvbiBSYW5nZUFycmF5KCkge1xuICAgIHJldHVybiBfciRBcnJheS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvMyA9IFJhbmdlQXJyYXkucHJvdG90eXBlO1xuXG4gIF9wcm90bzMuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgdmFyIGxlbmd0aCA9IHV0aWxzXzEodGhpcy5sZW5ndGgsIHN0cmVhbSwgcGFyZW50KTtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciByZXMgPSBbXTtcblxuICAgIHdoaWxlIChjb3VudCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHJhbmdlID0gdGhpcy50eXBlLmRlY29kZShzdHJlYW0sIHBhcmVudCk7XG4gICAgICByYW5nZS5vZmZzZXQgPSBjb3VudDtcbiAgICAgIGNvdW50ICs9IHJhbmdlLm5MZWZ0ICsgMTtcbiAgICAgIHJlcy5wdXNoKHJhbmdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIHJldHVybiBSYW5nZUFycmF5O1xufShyZXN0cnVjdHVyZS5BcnJheSk7XG5cbnZhciBDRkZDdXN0b21DaGFyc2V0ID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50OCwge1xuICAwOiB7XG4gICAgZ2x5cGhzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQucGFyZW50LkNoYXJTdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgfSlcbiAgfSxcbiAgMToge1xuICAgIHJhbmdlczogbmV3IFJhbmdlQXJyYXkoUmFuZ2UxLCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQucGFyZW50LkNoYXJTdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgfSlcbiAgfSxcbiAgMjoge1xuICAgIHJhbmdlczogbmV3IFJhbmdlQXJyYXkoUmFuZ2UyLCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQucGFyZW50LkNoYXJTdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgfSlcbiAgfVxufSk7XG52YXIgQ0ZGQ2hhcnNldCA9IG5ldyBQcmVkZWZpbmVkT3AoW0lTT0Fkb2JlQ2hhcnNldCwgRXhwZXJ0Q2hhcnNldCwgRXhwZXJ0U3Vic2V0Q2hhcnNldF0sIG5ldyBDRkZQb2ludGVyKENGRkN1c3RvbUNoYXJzZXQsIHtcbiAgbGF6eTogdHJ1ZVxufSkpO1xudmFyIEZEUmFuZ2UzID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZpcnN0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGZkOiByZXN0cnVjdHVyZS51aW50OFxufSk7XG52YXIgRkRSYW5nZTQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmlyc3Q6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgZmQ6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7XG52YXIgRkRTZWxlY3QgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQ4LCB7XG4gIDA6IHtcbiAgICBmZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LnBhcmVudC5DaGFyU3RyaW5ncy5sZW5ndGg7XG4gICAgfSlcbiAgfSxcbiAgMzoge1xuICAgIG5SYW5nZXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICByYW5nZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShGRFJhbmdlMywgJ25SYW5nZXMnKSxcbiAgICBzZW50aW5lbDogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH0sXG4gIDQ6IHtcbiAgICBuUmFuZ2VzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgcmFuZ2VzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRkRSYW5nZTQsICduUmFuZ2VzJyksXG4gICAgc2VudGluZWw6IHJlc3RydWN0dXJlLnVpbnQzMlxuICB9XG59KTtcbnZhciBwdHIgPSBuZXcgQ0ZGUG9pbnRlcihDRkZQcml2YXRlRGljdCk7XG5cbnZhciBDRkZQcml2YXRlT3AgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDRkZQcml2YXRlT3AoKSB7fVxuXG4gIHZhciBfcHJvdG80ID0gQ0ZGUHJpdmF0ZU9wLnByb3RvdHlwZTtcblxuICBfcHJvdG80LmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCwgb3BlcmFuZHMpIHtcbiAgICBwYXJlbnQubGVuZ3RoID0gb3BlcmFuZHNbMF07XG4gICAgcmV0dXJuIHB0ci5kZWNvZGUoc3RyZWFtLCBwYXJlbnQsIFtvcGVyYW5kc1sxXV0pO1xuICB9O1xuXG4gIF9wcm90bzQuc2l6ZSA9IGZ1bmN0aW9uIHNpemUoZGljdCwgY3R4KSB7XG4gICAgcmV0dXJuIFtDRkZQcml2YXRlRGljdC5zaXplKGRpY3QsIGN0eCwgZmFsc2UpLCBwdHIuc2l6ZShkaWN0LCBjdHgpWzBdXTtcbiAgfTtcblxuICBfcHJvdG80LmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHJlYW0sIGRpY3QsIGN0eCkge1xuICAgIHJldHVybiBbQ0ZGUHJpdmF0ZURpY3Quc2l6ZShkaWN0LCBjdHgsIGZhbHNlKSwgcHRyLmVuY29kZShzdHJlYW0sIGRpY3QsIGN0eClbMF1dO1xuICB9O1xuXG4gIHJldHVybiBDRkZQcml2YXRlT3A7XG59KCk7XG5cbnZhciBGb250RGljdCA9IG5ldyBDRkZEaWN0KFsvLyBrZXkgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgICB0eXBlKHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFxuWzE4LCAnUHJpdmF0ZScsIG5ldyBDRkZQcml2YXRlT3AoKSwgbnVsbF0sIFtbMTIsIDM4XSwgJ0ZvbnROYW1lJywgJ3NpZCcsIG51bGxdXSk7XG52YXIgQ0ZGVG9wRGljdCA9IG5ldyBDRkZEaWN0KFsvLyBrZXkgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgICB0eXBlKHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFxuW1sxMiwgMzBdLCAnUk9TJywgWydzaWQnLCAnc2lkJywgJ251bWJlciddLCBudWxsXSwgWzAsICd2ZXJzaW9uJywgJ3NpZCcsIG51bGxdLCBbMSwgJ05vdGljZScsICdzaWQnLCBudWxsXSwgW1sxMiwgMF0sICdDb3B5cmlnaHQnLCAnc2lkJywgbnVsbF0sIFsyLCAnRnVsbE5hbWUnLCAnc2lkJywgbnVsbF0sIFszLCAnRmFtaWx5TmFtZScsICdzaWQnLCBudWxsXSwgWzQsICdXZWlnaHQnLCAnc2lkJywgbnVsbF0sIFtbMTIsIDFdLCAnaXNGaXhlZFBpdGNoJywgJ2Jvb2xlYW4nLCBmYWxzZV0sIFtbMTIsIDJdLCAnSXRhbGljQW5nbGUnLCAnbnVtYmVyJywgMF0sIFtbMTIsIDNdLCAnVW5kZXJsaW5lUG9zaXRpb24nLCAnbnVtYmVyJywgLTEwMF0sIFtbMTIsIDRdLCAnVW5kZXJsaW5lVGhpY2tuZXNzJywgJ251bWJlcicsIDUwXSwgW1sxMiwgNV0sICdQYWludFR5cGUnLCAnbnVtYmVyJywgMF0sIFtbMTIsIDZdLCAnQ2hhcnN0cmluZ1R5cGUnLCAnbnVtYmVyJywgMl0sIFtbMTIsIDddLCAnRm9udE1hdHJpeCcsICdhcnJheScsIFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdXSwgWzEzLCAnVW5pcXVlSUQnLCAnbnVtYmVyJywgbnVsbF0sIFs1LCAnRm9udEJCb3gnLCAnYXJyYXknLCBbMCwgMCwgMCwgMF1dLCBbWzEyLCA4XSwgJ1N0cm9rZVdpZHRoJywgJ251bWJlcicsIDBdLCBbMTQsICdYVUlEJywgJ2FycmF5JywgbnVsbF0sIFsxNSwgJ2NoYXJzZXQnLCBDRkZDaGFyc2V0LCBJU09BZG9iZUNoYXJzZXRdLCBbMTYsICdFbmNvZGluZycsIENGRkVuY29kaW5nLCBTdGFuZGFyZEVuY29kaW5nXSwgWzE3LCAnQ2hhclN0cmluZ3MnLCBuZXcgQ0ZGUG9pbnRlcihuZXcgQ0ZGSW5kZXgoKSksIG51bGxdLCBbMTgsICdQcml2YXRlJywgbmV3IENGRlByaXZhdGVPcCgpLCBudWxsXSwgW1sxMiwgMjBdLCAnU3ludGhldGljQmFzZScsICdudW1iZXInLCBudWxsXSwgW1sxMiwgMjFdLCAnUG9zdFNjcmlwdCcsICdzaWQnLCBudWxsXSwgW1sxMiwgMjJdLCAnQmFzZUZvbnROYW1lJywgJ3NpZCcsIG51bGxdLCBbWzEyLCAyM10sICdCYXNlRm9udEJsZW5kJywgJ2RlbHRhJywgbnVsbF0sIC8vIENJRCBmb250IHNwZWNpZmljXG5bWzEyLCAzMV0sICdDSURGb250VmVyc2lvbicsICdudW1iZXInLCAwXSwgW1sxMiwgMzJdLCAnQ0lERm9udFJldmlzaW9uJywgJ251bWJlcicsIDBdLCBbWzEyLCAzM10sICdDSURGb250VHlwZScsICdudW1iZXInLCAwXSwgW1sxMiwgMzRdLCAnQ0lEQ291bnQnLCAnbnVtYmVyJywgODcyMF0sIFtbMTIsIDM1XSwgJ1VJREJhc2UnLCAnbnVtYmVyJywgbnVsbF0sIFtbMTIsIDM3XSwgJ0ZEU2VsZWN0JywgbmV3IENGRlBvaW50ZXIoRkRTZWxlY3QpLCBudWxsXSwgW1sxMiwgMzZdLCAnRkRBcnJheScsIG5ldyBDRkZQb2ludGVyKG5ldyBDRkZJbmRleChGb250RGljdCkpLCBudWxsXSwgW1sxMiwgMzhdLCAnRm9udE5hbWUnLCAnc2lkJywgbnVsbF1dKTtcbnZhciBWYXJpYXRpb25TdG9yZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgaXRlbVZhcmlhdGlvblN0b3JlOiBJdGVtVmFyaWF0aW9uU3RvcmVcbn0pO1xudmFyIENGRjJUb3BEaWN0ID0gbmV3IENGRkRpY3QoW1tbMTIsIDddLCAnRm9udE1hdHJpeCcsICdhcnJheScsIFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdXSwgWzE3LCAnQ2hhclN0cmluZ3MnLCBuZXcgQ0ZGUG9pbnRlcihuZXcgQ0ZGSW5kZXgoKSksIG51bGxdLCBbWzEyLCAzN10sICdGRFNlbGVjdCcsIG5ldyBDRkZQb2ludGVyKEZEU2VsZWN0KSwgbnVsbF0sIFtbMTIsIDM2XSwgJ0ZEQXJyYXknLCBuZXcgQ0ZGUG9pbnRlcihuZXcgQ0ZGSW5kZXgoRm9udERpY3QpKSwgbnVsbF0sIFsyNCwgJ3ZzdG9yZScsIG5ldyBDRkZQb2ludGVyKFZhcmlhdGlvblN0b3JlKSwgbnVsbF0sIFsyNSwgJ21heHN0YWNrJywgJ251bWJlcicsIDE5M11dKTtcbnZhciBDRkZUb3AgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLmZpeGVkMTYsIHtcbiAgMToge1xuICAgIGhkclNpemU6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAgIG9mZlNpemU6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAgIG5hbWVJbmRleDogbmV3IENGRkluZGV4KG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoJ2xlbmd0aCcpKSxcbiAgICB0b3BEaWN0SW5kZXg6IG5ldyBDRkZJbmRleChDRkZUb3BEaWN0KSxcbiAgICBzdHJpbmdJbmRleDogbmV3IENGRkluZGV4KG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoJ2xlbmd0aCcpKSxcbiAgICBnbG9iYWxTdWJySW5kZXg6IG5ldyBDRkZJbmRleCgpXG4gIH0sXG4gIDI6IHtcbiAgICBoZHJTaXplOiByZXN0cnVjdHVyZS51aW50OCxcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICB0b3BEaWN0OiBDRkYyVG9wRGljdCxcbiAgICBnbG9iYWxTdWJySW5kZXg6IG5ldyBDRkZJbmRleCgpXG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciBDRkZGb250ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ0ZGRm9udChzdHJlYW0pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLmRlY29kZSgpO1xuICB9XG5cbiAgQ0ZGRm9udC5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtKSB7XG4gICAgcmV0dXJuIG5ldyBDRkZGb250KHN0cmVhbSk7XG4gIH07XG5cbiAgdmFyIF9wcm90byA9IENGRkZvbnQucHJvdG90eXBlO1xuXG4gIF9wcm90by5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoKSB7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5zdHJlYW0ucG9zO1xuICAgIHZhciB0b3AgPSBDRkZUb3AuZGVjb2RlKHRoaXMuc3RyZWFtKTtcblxuICAgIGZvciAodmFyIGtleSBpbiB0b3ApIHtcbiAgICAgIHZhciB2YWwgPSB0b3Bba2V5XTtcbiAgICAgIHRoaXNba2V5XSA9IHZhbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52ZXJzaW9uIDwgMikge1xuICAgICAgaWYgKHRoaXMudG9wRGljdEluZGV4Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IGEgc2luZ2xlIGZvbnQgaXMgYWxsb3dlZCBpbiBDRkZcIik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudG9wRGljdCA9IHRoaXMudG9wRGljdEluZGV4WzBdO1xuICAgIH1cblxuICAgIHRoaXMuaXNDSURGb250ID0gdGhpcy50b3BEaWN0LlJPUyAhPSBudWxsO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIF9wcm90by5zdHJpbmcgPSBmdW5jdGlvbiBzdHJpbmcoc2lkKSB7XG4gICAgaWYgKHRoaXMudmVyc2lvbiA+PSAyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoc2lkIDwgc3RhbmRhcmRTdHJpbmdzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHN0YW5kYXJkU3RyaW5nc1tzaWRdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmluZ0luZGV4W3NpZCAtIHN0YW5kYXJkU3RyaW5ncy5sZW5ndGhdO1xuICB9O1xuXG4gIF9wcm90by5nZXRDaGFyU3RyaW5nID0gZnVuY3Rpb24gZ2V0Q2hhclN0cmluZyhnbHlwaCkge1xuICAgIHRoaXMuc3RyZWFtLnBvcyA9IHRoaXMudG9wRGljdC5DaGFyU3RyaW5nc1tnbHlwaF0ub2Zmc2V0O1xuICAgIHJldHVybiB0aGlzLnN0cmVhbS5yZWFkQnVmZmVyKHRoaXMudG9wRGljdC5DaGFyU3RyaW5nc1tnbHlwaF0ubGVuZ3RoKTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0R2x5cGhOYW1lID0gZnVuY3Rpb24gZ2V0R2x5cGhOYW1lKGdpZCkge1xuICAgIC8vIENGRjIgZ2x5cGggbmFtZXMgYXJlIGluIHRoZSBwb3N0IHRhYmxlLlxuICAgIGlmICh0aGlzLnZlcnNpb24gPj0gMikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBDSUQta2V5ZWQgZm9udHMgZG9uJ3QgaGF2ZSBnbHlwaCBuYW1lc1xuXG5cbiAgICBpZiAodGhpcy5pc0NJREZvbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBjaGFyc2V0ID0gdGhpcy50b3BEaWN0LmNoYXJzZXQ7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGFyc2V0KSkge1xuICAgICAgcmV0dXJuIGNoYXJzZXRbZ2lkXTtcbiAgICB9XG5cbiAgICBpZiAoZ2lkID09PSAwKSB7XG4gICAgICByZXR1cm4gJy5ub3RkZWYnO1xuICAgIH1cblxuICAgIGdpZCAtPSAxO1xuXG4gICAgc3dpdGNoIChjaGFyc2V0LnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nKGNoYXJzZXQuZ2x5cGhzW2dpZF0pO1xuXG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnNldC5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgcmFuZ2UgPSBjaGFyc2V0LnJhbmdlc1tpXTtcblxuICAgICAgICAgIGlmIChyYW5nZS5vZmZzZXQgPD0gZ2lkICYmIGdpZCA8PSByYW5nZS5vZmZzZXQgKyByYW5nZS5uTGVmdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nKHJhbmdlLmZpcnN0ICsgKGdpZCAtIHJhbmdlLm9mZnNldCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9wcm90by5mZEZvckdseXBoID0gZnVuY3Rpb24gZmRGb3JHbHlwaChnaWQpIHtcbiAgICBpZiAoIXRoaXMudG9wRGljdC5GRFNlbGVjdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLnRvcERpY3QuRkRTZWxlY3QudmVyc2lvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gdGhpcy50b3BEaWN0LkZEU2VsZWN0LmZkc1tnaWRdO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHZhciByYW5nZXMgPSB0aGlzLnRvcERpY3QuRkRTZWxlY3QucmFuZ2VzO1xuICAgICAgICB2YXIgbG93ID0gMDtcbiAgICAgICAgdmFyIGhpZ2ggPSByYW5nZXMubGVuZ3RoIC0gMTtcblxuICAgICAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHtcbiAgICAgICAgICB2YXIgbWlkID0gbG93ICsgaGlnaCA+PiAxO1xuXG4gICAgICAgICAgaWYgKGdpZCA8IHJhbmdlc1ttaWRdLmZpcnN0KSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkIC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1pZCA8IGhpZ2ggJiYgZ2lkID4gcmFuZ2VzW21pZCArIDFdLmZpcnN0KSB7XG4gICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VzW21pZF0uZmQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gRkRTZWxlY3QgdmVyc2lvbjogXCIgKyB0aGlzLnRvcERpY3QuRkRTZWxlY3QudmVyc2lvbik7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5wcml2YXRlRGljdEZvckdseXBoID0gZnVuY3Rpb24gcHJpdmF0ZURpY3RGb3JHbHlwaChnaWQpIHtcbiAgICBpZiAodGhpcy50b3BEaWN0LkZEU2VsZWN0KSB7XG4gICAgICB2YXIgZmQgPSB0aGlzLmZkRm9yR2x5cGgoZ2lkKTtcblxuICAgICAgaWYgKHRoaXMudG9wRGljdC5GREFycmF5W2ZkXSkge1xuICAgICAgICByZXR1cm4gdGhpcy50b3BEaWN0LkZEQXJyYXlbZmRdLlByaXZhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZlcnNpb24gPCAyKSB7XG4gICAgICByZXR1cm4gdGhpcy50b3BEaWN0LlByaXZhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudG9wRGljdC5GREFycmF5WzBdLlByaXZhdGU7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKENGRkZvbnQsIFt7XG4gICAga2V5OiBcInBvc3RzY3JpcHROYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy52ZXJzaW9uIDwgMikge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lSW5kZXhbMF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmdWxsTmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nKHRoaXMudG9wRGljdC5GdWxsTmFtZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZhbWlseU5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmluZyh0aGlzLnRvcERpY3QuRmFtaWx5TmFtZSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENGRkZvbnQ7XG59KCk7XG5cbnZhciBWZXJ0aWNhbE9yaWdpbiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBnbHlwaEluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHZlcnRPcmlnaW5ZOiByZXN0cnVjdHVyZS5pbnQxNlxufSk7XG52YXIgVk9SRyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBtYWpvclZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWlub3JWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGRlZmF1bHRWZXJ0T3JpZ2luWTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIG51bVZlcnRPcmlnaW5ZTWV0cmljczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtZXRyaWNzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoVmVydGljYWxPcmlnaW4sICdudW1WZXJ0T3JpZ2luWU1ldHJpY3MnKVxufSk7XG5cbnZhciBCaWdNZXRyaWNzID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGhlaWdodDogcmVzdHJ1Y3R1cmUudWludDgsXG4gIHdpZHRoOiByZXN0cnVjdHVyZS51aW50OCxcbiAgaG9yaUJlYXJpbmdYOiByZXN0cnVjdHVyZS5pbnQ4LFxuICBob3JpQmVhcmluZ1k6IHJlc3RydWN0dXJlLmludDgsXG4gIGhvcmlBZHZhbmNlOiByZXN0cnVjdHVyZS51aW50OCxcbiAgdmVydEJlYXJpbmdYOiByZXN0cnVjdHVyZS5pbnQ4LFxuICB2ZXJ0QmVhcmluZ1k6IHJlc3RydWN0dXJlLmludDgsXG4gIHZlcnRBZHZhbmNlOiByZXN0cnVjdHVyZS51aW50OFxufSk7XG52YXIgU21hbGxNZXRyaWNzID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGhlaWdodDogcmVzdHJ1Y3R1cmUudWludDgsXG4gIHdpZHRoOiByZXN0cnVjdHVyZS51aW50OCxcbiAgYmVhcmluZ1g6IHJlc3RydWN0dXJlLmludDgsXG4gIGJlYXJpbmdZOiByZXN0cnVjdHVyZS5pbnQ4LFxuICBhZHZhbmNlOiByZXN0cnVjdHVyZS51aW50OFxufSk7XG52YXIgRUJEVENvbXBvbmVudCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBnbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB4T2Zmc2V0OiByZXN0cnVjdHVyZS5pbnQ4LFxuICB5T2Zmc2V0OiByZXN0cnVjdHVyZS5pbnQ4XG59KTtcblxudmFyIEJ5dGVBbGlnbmVkID0gZnVuY3Rpb24gQnl0ZUFsaWduZWQoKSB7fTtcblxudmFyIEJpdEFsaWduZWQgPSBmdW5jdGlvbiBCaXRBbGlnbmVkKCkge307XG5cbnZhciBnbHlwaCA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QoJ3ZlcnNpb24nLCB7XG4gIDE6IHtcbiAgICBtZXRyaWNzOiBTbWFsbE1ldHJpY3MsXG4gICAgZGF0YTogQnl0ZUFsaWduZWRcbiAgfSxcbiAgMjoge1xuICAgIG1ldHJpY3M6IFNtYWxsTWV0cmljcyxcbiAgICBkYXRhOiBCaXRBbGlnbmVkXG4gIH0sXG4gIC8vIGZvcm1hdCAzIGlzIGRlcHJlY2F0ZWRcbiAgLy8gZm9ybWF0IDQgaXMgbm90IHN1cHBvcnRlZCBieSBNaWNyb3NvZnRcbiAgNToge1xuICAgIGRhdGE6IEJpdEFsaWduZWRcbiAgfSxcbiAgNjoge1xuICAgIG1ldHJpY3M6IEJpZ01ldHJpY3MsXG4gICAgZGF0YTogQnl0ZUFsaWduZWRcbiAgfSxcbiAgNzoge1xuICAgIG1ldHJpY3M6IEJpZ01ldHJpY3MsXG4gICAgZGF0YTogQml0QWxpZ25lZFxuICB9LFxuICA4OiB7XG4gICAgbWV0cmljczogU21hbGxNZXRyaWNzLFxuICAgIHBhZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQ4KSxcbiAgICBudW1Db21wb25lbnRzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY29tcG9uZW50czogbmV3IHJlc3RydWN0dXJlLkFycmF5KEVCRFRDb21wb25lbnQsICdudW1Db21wb25lbnRzJylcbiAgfSxcbiAgOToge1xuICAgIG1ldHJpY3M6IEJpZ01ldHJpY3MsXG4gICAgcGFkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDgpLFxuICAgIG51bUNvbXBvbmVudHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb21wb25lbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRUJEVENvbXBvbmVudCwgJ251bUNvbXBvbmVudHMnKVxuICB9LFxuICAxNzoge1xuICAgIG1ldHJpY3M6IFNtYWxsTWV0cmljcyxcbiAgICBkYXRhTGVuOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZGF0YTogbmV3IHJlc3RydWN0dXJlLkJ1ZmZlcignZGF0YUxlbicpXG4gIH0sXG4gIDE4OiB7XG4gICAgbWV0cmljczogQmlnTWV0cmljcyxcbiAgICBkYXRhTGVuOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZGF0YTogbmV3IHJlc3RydWN0dXJlLkJ1ZmZlcignZGF0YUxlbicpXG4gIH0sXG4gIDE5OiB7XG4gICAgZGF0YUxlbjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGRhdGE6IG5ldyByZXN0cnVjdHVyZS5CdWZmZXIoJ2RhdGFMZW4nKVxuICB9XG59KTtcblxudmFyIFNCaXRMaW5lTWV0cmljcyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBhc2NlbmRlcjogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgZGVzY2VuZGVyOiByZXN0cnVjdHVyZS5pbnQ4LFxuICB3aWR0aE1heDogcmVzdHJ1Y3R1cmUudWludDgsXG4gIGNhcmV0U2xvcGVOdW1lcmF0b3I6IHJlc3RydWN0dXJlLmludDgsXG4gIGNhcmV0U2xvcGVEZW5vbWluYXRvcjogcmVzdHJ1Y3R1cmUuaW50OCxcbiAgY2FyZXRPZmZzZXQ6IHJlc3RydWN0dXJlLmludDgsXG4gIG1pbk9yaWdpblNCOiByZXN0cnVjdHVyZS5pbnQ4LFxuICBtaW5BZHZhbmNlU0I6IHJlc3RydWN0dXJlLmludDgsXG4gIG1heEJlZm9yZUJMOiByZXN0cnVjdHVyZS5pbnQ4LFxuICBtaW5BZnRlckJMOiByZXN0cnVjdHVyZS5pbnQ4LFxuICBwYWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS5pbnQ4LCAyKVxufSk7XG52YXIgQ29kZU9mZnNldFBhaXIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZ2x5cGhDb2RlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG9mZnNldDogcmVzdHJ1Y3R1cmUudWludDE2XG59KTtcbnZhciBJbmRleFN1YnRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgaGVhZGVyOiB7XG4gICAgaW1hZ2VGb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBpbWFnZURhdGFPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQzMlxuICB9LFxuICAxOiB7XG4gICAgb2Zmc2V0QXJyYXk6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MzIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5wYXJlbnQubGFzdEdseXBoSW5kZXggLSB0LnBhcmVudC5maXJzdEdseXBoSW5kZXggKyAxO1xuICAgIH0pXG4gIH0sXG4gIDI6IHtcbiAgICBpbWFnZVNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBiaWdNZXRyaWNzOiBCaWdNZXRyaWNzXG4gIH0sXG4gIDM6IHtcbiAgICBvZmZzZXRBcnJheTogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LnBhcmVudC5sYXN0R2x5cGhJbmRleCAtIHQucGFyZW50LmZpcnN0R2x5cGhJbmRleCArIDE7XG4gICAgfSlcbiAgfSxcbiAgNDoge1xuICAgIG51bUdseXBoczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGdseXBoQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5BcnJheShDb2RlT2Zmc2V0UGFpciwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0Lm51bUdseXBocyArIDE7XG4gICAgfSlcbiAgfSxcbiAgNToge1xuICAgIGltYWdlU2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGJpZ01ldHJpY3M6IEJpZ01ldHJpY3MsXG4gICAgbnVtR2x5cGhzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgZ2x5cGhDb2RlQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdudW1HbHlwaHMnKVxuICB9XG59KTtcbnZhciBJbmRleFN1YnRhYmxlQXJyYXkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZmlyc3RHbHlwaEluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxhc3RHbHlwaEluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHN1YnRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEluZGV4U3VidGFibGUpXG59KTtcbnZhciBCaXRtYXBTaXplVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgaW5kZXhTdWJUYWJsZUFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyByZXN0cnVjdHVyZS5BcnJheShJbmRleFN1YnRhYmxlQXJyYXksIDEpLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSksXG4gIGluZGV4VGFibGVzU2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBudW1iZXJPZkluZGV4U3ViVGFibGVzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGNvbG9yUmVmOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGhvcmk6IFNCaXRMaW5lTWV0cmljcyxcbiAgdmVydDogU0JpdExpbmVNZXRyaWNzLFxuICBzdGFydEdseXBoSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZW5kR2x5cGhJbmRleDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBwcGVtWDogcmVzdHJ1Y3R1cmUudWludDgsXG4gIHBwZW1ZOiByZXN0cnVjdHVyZS51aW50OCxcbiAgYml0RGVwdGg6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBmbGFnczogbmV3IHJlc3RydWN0dXJlLkJpdGZpZWxkKHJlc3RydWN0dXJlLnVpbnQ4LCBbJ2hvcml6b250YWwnLCAndmVydGljYWwnXSlcbn0pO1xudmFyIEVCTEMgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAvLyAweDAwMDIwMDAwXG4gIG51bVNpemVzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHNpemVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQml0bWFwU2l6ZVRhYmxlLCAnbnVtU2l6ZXMnKVxufSk7XG5cbnZhciBJbWFnZVRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHBwZW06IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcmVzb2x1dGlvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBpbWFnZU9mZnNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsICd2b2lkJyksIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LnBhcmVudC5tYXhwLm51bUdseXBocyArIDE7XG4gIH0pXG59KTsgLy8gVGhpcyBpcyB0aGUgQXBwbGUgc2JpeCB0YWJsZSwgdXNlZCBieSB0aGUgXCJBcHBsZSBDb2xvciBFbW9qaVwiIGZvbnQuXG4vLyBJdCBpbmNsdWRlcyBzZXZlcmFsIGltYWdlIHRhYmxlcyB3aXRoIGltYWdlcyBmb3IgZWFjaCBiaXRtYXAgZ2x5cGhcbi8vIG9mIHNldmVyYWwgZGlmZmVyZW50IHNpemVzLlxuXG52YXIgc2JpeCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGZsYWdzOiBuZXcgcmVzdHJ1Y3R1cmUuQml0ZmllbGQocmVzdHJ1Y3R1cmUudWludDE2LCBbJ3JlbmRlck91dGxpbmVzJ10pLFxuICBudW1JbWdUYWJsZXM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgaW1hZ2VUYWJsZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIEltYWdlVGFibGUpLCAnbnVtSW1nVGFibGVzJylcbn0pO1xuXG52YXIgTGF5ZXJSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZ2lkOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIEdseXBoIElEIG9mIGxheWVyIGdseXBoIChtdXN0IGJlIGluIHotb3JkZXIgZnJvbSBib3R0b20gdG8gdG9wKS5cbiAgcGFsZXR0ZUluZGV4OiByZXN0cnVjdHVyZS51aW50MTYgLy8gSW5kZXggdmFsdWUgdG8gdXNlIGluIHRoZSBhcHByb3ByaWF0ZSBwYWxldHRlLiBUaGlzIHZhbHVlIG11c3RcblxufSk7IC8vIGJlIGxlc3MgdGhhbiBudW1QYWxldHRlRW50cmllcyBpbiB0aGUgQ1BBTCB0YWJsZSwgZXhjZXB0IGZvclxuLy8gdGhlIHNwZWNpYWwgY2FzZSBub3RlZCBiZWxvdy4gRWFjaCBwYWxldHRlIGVudHJ5IGlzIDE2IGJpdHMuXG4vLyBBIHBhbGV0dGUgaW5kZXggb2YgMHhGRkZGIGlzIGEgc3BlY2lhbCBjYXNlIGluZGljYXRpbmcgdGhhdFxuLy8gdGhlIHRleHQgZm9yZWdyb3VuZCBjb2xvciBzaG91bGQgYmUgdXNlZC5cblxudmFyIEJhc2VHbHlwaFJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBnaWQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gR2x5cGggSUQgb2YgcmVmZXJlbmNlIGdseXBoLiBUaGlzIGdseXBoIGlzIGZvciByZWZlcmVuY2Ugb25seVxuICAvLyBhbmQgaXMgbm90IHJlbmRlcmVkIGZvciBjb2xvci5cbiAgZmlyc3RMYXllckluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIEluZGV4IChmcm9tIGJlZ2lubmluZyBvZiB0aGUgTGF5ZXIgUmVjb3JkcykgdG8gdGhlIGxheWVyIHJlY29yZC5cbiAgLy8gVGhlcmUgd2lsbCBiZSBudW1MYXllcnMgY29uc2VjdXRpdmUgZW50cmllcyBmb3IgdGhpcyBiYXNlIGdseXBoLlxuICBudW1MYXllcnM6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7XG52YXIgQ09MUiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG51bUJhc2VHbHlwaFJlY29yZHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgYmFzZUdseXBoUmVjb3JkOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyByZXN0cnVjdHVyZS5BcnJheShCYXNlR2x5cGhSZWNvcmQsICdudW1CYXNlR2x5cGhSZWNvcmRzJykpLFxuICBsYXllclJlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KExheWVyUmVjb3JkLCAnbnVtTGF5ZXJSZWNvcmRzJyksIHtcbiAgICBsYXp5OiB0cnVlXG4gIH0pLFxuICBudW1MYXllclJlY29yZHM6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7XG5cbnZhciBDb2xvclJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBibHVlOiByZXN0cnVjdHVyZS51aW50OCxcbiAgZ3JlZW46IHJlc3RydWN0dXJlLnVpbnQ4LFxuICByZWQ6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBhbHBoYTogcmVzdHJ1Y3R1cmUudWludDhcbn0pO1xudmFyIENQQUwgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICBoZWFkZXI6IHtcbiAgICBudW1QYWxldHRlRW50cmllczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG51bVBhbGV0dGVzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbnVtQ29sb3JSZWNvcmRzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY29sb3JSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyByZXN0cnVjdHVyZS5BcnJheShDb2xvclJlY29yZCwgJ251bUNvbG9yUmVjb3JkcycpKSxcbiAgICBjb2xvclJlY29yZEluZGljZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdudW1QYWxldHRlcycpXG4gIH0sXG4gIDA6IHt9LFxuICAxOiB7XG4gICAgb2Zmc2V0UGFsZXR0ZVR5cGVBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDMyLCAnbnVtUGFsZXR0ZXMnKSksXG4gICAgb2Zmc2V0UGFsZXR0ZUxhYmVsQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ251bVBhbGV0dGVzJykpLFxuICAgIG9mZnNldFBhbGV0dGVFbnRyeUxhYmVsQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ251bVBhbGV0dGVFbnRyaWVzJykpXG4gIH1cbn0pO1xuXG52YXIgQmFzZUNvb3JkID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgMToge1xuICAgIC8vIERlc2lnbiB1bml0cyBvbmx5XG4gICAgY29vcmRpbmF0ZTogcmVzdHJ1Y3R1cmUuaW50MTYgLy8gWCBvciBZIHZhbHVlLCBpbiBkZXNpZ24gdW5pdHNcblxuICB9LFxuICAyOiB7XG4gICAgLy8gRGVzaWduIHVuaXRzIHBsdXMgY29udG91ciBwb2ludFxuICAgIGNvb3JkaW5hdGU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIFggb3IgWSB2YWx1ZSwgaW4gZGVzaWduIHVuaXRzXG4gICAgcmVmZXJlbmNlR2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyBHbHlwaElEIG9mIGNvbnRyb2wgZ2x5cGhcbiAgICBiYXNlQ29vcmRQb2ludDogcmVzdHJ1Y3R1cmUudWludDE2IC8vIEluZGV4IG9mIGNvbnRvdXIgcG9pbnQgb24gdGhlIHJlZmVyZW5jZUdseXBoXG5cbiAgfSxcbiAgMzoge1xuICAgIC8vIERlc2lnbiB1bml0cyBwbHVzIERldmljZSB0YWJsZVxuICAgIGNvb3JkaW5hdGU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIC8vIFggb3IgWSB2YWx1ZSwgaW4gZGVzaWduIHVuaXRzXG4gICAgZGV2aWNlVGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgRGV2aWNlKSAvLyBEZXZpY2UgdGFibGUgZm9yIFggb3IgWSB2YWx1ZVxuXG4gIH1cbn0pO1xudmFyIEJhc2VWYWx1ZXMgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZGVmYXVsdEluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIEluZGV4IG9mIGRlZmF1bHQgYmFzZWxpbmUgZm9yIHRoaXMgc2NyaXB0LXNhbWUgaW5kZXggaW4gdGhlIEJhc2VUYWdMaXN0XG4gIGJhc2VDb29yZENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGJhc2VDb29yZHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEJhc2VDb29yZCksICdiYXNlQ29vcmRDb3VudCcpXG59KTtcbnZhciBGZWF0TWluTWF4UmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgLy8gNC1ieXRlIGZlYXR1cmUgaWRlbnRpZmljYXRpb24gdGFnLW11c3QgbWF0Y2ggRmVhdHVyZVRhZyBpbiBGZWF0dXJlTGlzdFxuICBtaW5Db29yZDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBCYXNlQ29vcmQsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KSxcbiAgLy8gTWF5IGJlIE5VTExcbiAgbWF4Q29vcmQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQmFzZUNvb3JkLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSkgLy8gTWF5IGJlIE5VTExcblxufSk7XG52YXIgTWluTWF4ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG1pbkNvb3JkOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEJhc2VDb29yZCksXG4gIC8vIE1heSBiZSBOVUxMXG4gIG1heENvb3JkOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEJhc2VDb29yZCksXG4gIC8vIE1heSBiZSBOVUxMXG4gIGZlYXRNaW5NYXhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBNYXkgYmUgMFxuICBmZWF0TWluTWF4UmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEZlYXRNaW5NYXhSZWNvcmQsICdmZWF0TWluTWF4Q291bnQnKSAvLyBJbiBhbHBoYWJldGljYWwgb3JkZXJcblxufSk7XG52YXIgQmFzZUxhbmdTeXNSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICAvLyA0LWJ5dGUgbGFuZ3VhZ2Ugc3lzdGVtIGlkZW50aWZpY2F0aW9uIHRhZ1xuICBtaW5NYXg6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTWluTWF4LCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIEJhc2VTY3JpcHQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYmFzZVZhbHVlczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBCYXNlVmFsdWVzKSxcbiAgLy8gTWF5IGJlIE5VTExcbiAgZGVmYXVsdE1pbk1heDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBNaW5NYXgpLFxuICAvLyBNYXkgYmUgTlVMTFxuICBiYXNlTGFuZ1N5c0NvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE1heSBiZSAwXG4gIGJhc2VMYW5nU3lzUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEJhc2VMYW5nU3lzUmVjb3JkLCAnYmFzZUxhbmdTeXNDb3VudCcpIC8vIGluIGFscGhhYmV0aWNhbCBvcmRlciBieSBCYXNlTGFuZ1N5c1RhZ1xuXG59KTtcbnZhciBCYXNlU2NyaXB0UmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgLy8gNC1ieXRlIHNjcmlwdCBpZGVudGlmaWNhdGlvbiB0YWdcbiAgc2NyaXB0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEJhc2VTY3JpcHQsIHtcbiAgICB0eXBlOiAncGFyZW50J1xuICB9KVxufSk7XG52YXIgQmFzZVNjcmlwdExpc3QgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQmFzZVNjcmlwdFJlY29yZCwgcmVzdHJ1Y3R1cmUudWludDE2KTsgLy8gQXJyYXkgb2YgNC1ieXRlIGJhc2VsaW5lIGlkZW50aWZpY2F0aW9uIHRhZ3MtbXVzdCBiZSBpbiBhbHBoYWJldGljYWwgb3JkZXJcblxudmFyIEJhc2VUYWdMaXN0ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgQXhpcyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBiYXNlVGFnTGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBCYXNlVGFnTGlzdCksXG4gIC8vIE1heSBiZSBOVUxMXG4gIGJhc2VTY3JpcHRMaXN0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEJhc2VTY3JpcHRMaXN0KVxufSk7XG52YXIgQkFTRSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDMyLCB7XG4gIGhlYWRlcjoge1xuICAgIGhvcml6QXhpczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBBeGlzKSxcbiAgICAvLyBNYXkgYmUgTlVMTFxuICAgIHZlcnRBeGlzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEF4aXMpIC8vIE1heSBiZSBOVUxMXG5cbiAgfSxcbiAgMHgwMDAxMDAwMDoge30sXG4gIDB4MDAwMTAwMDE6IHtcbiAgICBpdGVtVmFyaWF0aW9uU3RvcmU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgSXRlbVZhcmlhdGlvblN0b3JlKVxuICB9XG59KTtcblxudmFyIEF0dGFjaFBvaW50ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBBdHRhY2hMaXN0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgZ2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBhdHRhY2hQb2ludHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEF0dGFjaFBvaW50KSwgJ2dseXBoQ291bnQnKVxufSk7XG52YXIgQ2FyZXRWYWx1ZSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDE2LCB7XG4gIDE6IHtcbiAgICAvLyBEZXNpZ24gdW5pdHMgb25seVxuICAgIGNvb3JkaW5hdGU6IHJlc3RydWN0dXJlLmludDE2XG4gIH0sXG4gIDI6IHtcbiAgICAvLyBDb250b3VyIHBvaW50XG4gICAgY2FyZXRWYWx1ZVBvaW50OiByZXN0cnVjdHVyZS51aW50MTZcbiAgfSxcbiAgMzoge1xuICAgIC8vIERlc2lnbiB1bml0cyBwbHVzIERldmljZSB0YWJsZVxuICAgIGNvb3JkaW5hdGU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIGRldmljZVRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIERldmljZSlcbiAgfVxufSk7XG52YXIgTGlnR2x5cGggPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDYXJldFZhbHVlKSwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBMaWdDYXJldExpc3QgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICBsaWdHbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGxpZ0dseXBoczogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTGlnR2x5cGgpLCAnbGlnR2x5cGhDb3VudCcpXG59KTtcbnZhciBNYXJrR2x5cGhTZXRzRGVmID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG1hcmtTZXRUYWJsZUZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtYXJrU2V0Q291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIENvdmVyYWdlKSwgJ21hcmtTZXRDb3VudCcpXG59KTtcbnZhciBHREVGID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MzIsIHtcbiAgaGVhZGVyOiB7XG4gICAgZ2x5cGhDbGFzc0RlZjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc0RlZiksXG4gICAgYXR0YWNoTGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBBdHRhY2hMaXN0KSxcbiAgICBsaWdDYXJldExpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTGlnQ2FyZXRMaXN0KSxcbiAgICBtYXJrQXR0YWNoQ2xhc3NEZWY6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NEZWYpXG4gIH0sXG4gIDB4MDAwMTAwMDA6IHt9LFxuICAweDAwMDEwMDAyOiB7XG4gICAgbWFya0dseXBoU2V0c0RlZjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBNYXJrR2x5cGhTZXRzRGVmKVxuICB9LFxuICAweDAwMDEwMDAzOiB7XG4gICAgbWFya0dseXBoU2V0c0RlZjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBNYXJrR2x5cGhTZXRzRGVmKSxcbiAgICBpdGVtVmFyaWF0aW9uU3RvcmU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgSXRlbVZhcmlhdGlvblN0b3JlKVxuICB9XG59KTtcblxudmFyIFZhbHVlRm9ybWF0ID0gbmV3IHJlc3RydWN0dXJlLkJpdGZpZWxkKHJlc3RydWN0dXJlLnVpbnQxNiwgWyd4UGxhY2VtZW50JywgJ3lQbGFjZW1lbnQnLCAneEFkdmFuY2UnLCAneUFkdmFuY2UnLCAneFBsYURldmljZScsICd5UGxhRGV2aWNlJywgJ3hBZHZEZXZpY2UnLCAneUFkdkRldmljZSddKTtcbnZhciB0eXBlcyA9IHtcbiAgeFBsYWNlbWVudDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHlQbGFjZW1lbnQ6IHJlc3RydWN0dXJlLmludDE2LFxuICB4QWR2YW5jZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHlBZHZhbmNlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgeFBsYURldmljZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBEZXZpY2UsIHtcbiAgICB0eXBlOiAnZ2xvYmFsJyxcbiAgICByZWxhdGl2ZVRvOiAncmVsJ1xuICB9KSxcbiAgeVBsYURldmljZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBEZXZpY2UsIHtcbiAgICB0eXBlOiAnZ2xvYmFsJyxcbiAgICByZWxhdGl2ZVRvOiAncmVsJ1xuICB9KSxcbiAgeEFkdkRldmljZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBEZXZpY2UsIHtcbiAgICB0eXBlOiAnZ2xvYmFsJyxcbiAgICByZWxhdGl2ZVRvOiAncmVsJ1xuICB9KSxcbiAgeUFkdkRldmljZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBEZXZpY2UsIHtcbiAgICB0eXBlOiAnZ2xvYmFsJyxcbiAgICByZWxhdGl2ZVRvOiAncmVsJ1xuICB9KVxufTtcblxudmFyIFZhbHVlUmVjb3JkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVmFsdWVSZWNvcmQoa2V5KSB7XG4gICAgaWYgKGtleSA9PT0gdm9pZCAwKSB7XG4gICAgICBrZXkgPSAndmFsdWVGb3JtYXQnO1xuICAgIH1cblxuICAgIHRoaXMua2V5ID0ga2V5O1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFZhbHVlUmVjb3JkLnByb3RvdHlwZTtcblxuICBfcHJvdG8uYnVpbGRTdHJ1Y3QgPSBmdW5jdGlvbiBidWlsZFN0cnVjdChwYXJlbnQpIHtcbiAgICB2YXIgc3RydWN0ID0gcGFyZW50O1xuXG4gICAgd2hpbGUgKCFzdHJ1Y3RbdGhpcy5rZXldICYmIHN0cnVjdC5wYXJlbnQpIHtcbiAgICAgIHN0cnVjdCA9IHN0cnVjdC5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFzdHJ1Y3RbdGhpcy5rZXldKSByZXR1cm47XG4gICAgdmFyIGZpZWxkcyA9IHt9O1xuXG4gICAgZmllbGRzLnJlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzdHJ1Y3QuX3N0YXJ0T2Zmc2V0O1xuICAgIH07XG5cbiAgICB2YXIgZm9ybWF0ID0gc3RydWN0W3RoaXMua2V5XTtcblxuICAgIGZvciAodmFyIGtleSBpbiBmb3JtYXQpIHtcbiAgICAgIGlmIChmb3JtYXRba2V5XSkge1xuICAgICAgICBmaWVsZHNba2V5XSA9IHR5cGVzW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3QoZmllbGRzKTtcbiAgfTtcblxuICBfcHJvdG8uc2l6ZSA9IGZ1bmN0aW9uIHNpemUodmFsLCBjdHgpIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFN0cnVjdChjdHgpLnNpemUodmFsLCBjdHgpO1xuICB9O1xuXG4gIF9wcm90by5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICB2YXIgcmVzID0gdGhpcy5idWlsZFN0cnVjdChwYXJlbnQpLmRlY29kZShzdHJlYW0sIHBhcmVudCk7XG4gICAgZGVsZXRlIHJlcy5yZWw7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICByZXR1cm4gVmFsdWVSZWNvcmQ7XG59KCk7XG5cbnZhciBQYWlyVmFsdWVSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgc2Vjb25kR2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdmFsdWUxOiBuZXcgVmFsdWVSZWNvcmQoJ3ZhbHVlRm9ybWF0MScpLFxuICB2YWx1ZTI6IG5ldyBWYWx1ZVJlY29yZCgndmFsdWVGb3JtYXQyJylcbn0pO1xudmFyIFBhaXJTZXQgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoUGFpclZhbHVlUmVjb3JkLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIENsYXNzMlJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2YWx1ZTE6IG5ldyBWYWx1ZVJlY29yZCgndmFsdWVGb3JtYXQxJyksXG4gIHZhbHVlMjogbmV3IFZhbHVlUmVjb3JkKCd2YWx1ZUZvcm1hdDInKVxufSk7XG52YXIgQW5jaG9yID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgMToge1xuICAgIC8vIERlc2lnbiB1bml0cyBvbmx5XG4gICAgeENvb3JkaW5hdGU6IHJlc3RydWN0dXJlLmludDE2LFxuICAgIHlDb29yZGluYXRlOiByZXN0cnVjdHVyZS5pbnQxNlxuICB9LFxuICAyOiB7XG4gICAgLy8gRGVzaWduIHVuaXRzIHBsdXMgY29udG91ciBwb2ludFxuICAgIHhDb29yZGluYXRlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB5Q29vcmRpbmF0ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgYW5jaG9yUG9pbnQ6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9LFxuICAzOiB7XG4gICAgLy8gRGVzaWduIHVuaXRzIHBsdXMgRGV2aWNlIHRhYmxlc1xuICAgIHhDb29yZGluYXRlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgICB5Q29vcmRpbmF0ZTogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gICAgeERldmljZVRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIERldmljZSksXG4gICAgeURldmljZVRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIERldmljZSlcbiAgfVxufSk7XG52YXIgRW50cnlFeGl0UmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGVudHJ5QW5jaG9yOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEFuY2hvciwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pLFxuICBleGl0QW5jaG9yOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEFuY2hvciwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBNYXJrUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIFwiY2xhc3NcIjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtYXJrQW5jaG9yOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEFuY2hvciwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBNYXJrQXJyYXkgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTWFya1JlY29yZCwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBCYXNlUmVjb3JkID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQW5jaG9yKSwgZnVuY3Rpb24gKHQpIHtcbiAgcmV0dXJuIHQucGFyZW50LmNsYXNzQ291bnQ7XG59KTtcbnZhciBCYXNlQXJyYXkgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQmFzZVJlY29yZCwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBDb21wb25lbnRSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBBbmNob3IpLCBmdW5jdGlvbiAodCkge1xuICByZXR1cm4gdC5wYXJlbnQucGFyZW50LmNsYXNzQ291bnQ7XG59KTtcbnZhciBMaWdhdHVyZUF0dGFjaCA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShDb21wb25lbnRSZWNvcmQsIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgTGlnYXR1cmVBcnJheSA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIExpZ2F0dXJlQXR0YWNoKSwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBHUE9TTG9va3VwID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdCgnbG9va3VwVHlwZScsIHtcbiAgMTogbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MTYsIHtcbiAgICAvLyBTaW5nbGUgQWRqdXN0bWVudFxuICAgIDE6IHtcbiAgICAgIC8vIFNpbmdsZSBwb3NpdGlvbmluZyB2YWx1ZVxuICAgICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgICAgdmFsdWVGb3JtYXQ6IFZhbHVlRm9ybWF0LFxuICAgICAgdmFsdWU6IG5ldyBWYWx1ZVJlY29yZCgpXG4gICAgfSxcbiAgICAyOiB7XG4gICAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgICB2YWx1ZUZvcm1hdDogVmFsdWVGb3JtYXQsXG4gICAgICB2YWx1ZUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgICB2YWx1ZXM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkobmV3IFZhbHVlUmVjb3JkKCksICd2YWx1ZUNvdW50JylcbiAgICB9XG4gIH0pLFxuICAyOiBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAgIC8vIFBhaXIgQWRqdXN0bWVudCBQb3NpdGlvbmluZ1xuICAgIDE6IHtcbiAgICAgIC8vIEFkanVzdG1lbnRzIGZvciBnbHlwaCBwYWlyc1xuICAgICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgICAgdmFsdWVGb3JtYXQxOiBWYWx1ZUZvcm1hdCxcbiAgICAgIHZhbHVlRm9ybWF0MjogVmFsdWVGb3JtYXQsXG4gICAgICBwYWlyU2V0Q291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAgIHBhaXJTZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgUGFpclNldCksICdwYWlyU2V0Q291bnQnKVxuICAgIH0sXG4gICAgMjoge1xuICAgICAgLy8gQ2xhc3MgcGFpciBhZGp1c3RtZW50XG4gICAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgICB2YWx1ZUZvcm1hdDE6IFZhbHVlRm9ybWF0LFxuICAgICAgdmFsdWVGb3JtYXQyOiBWYWx1ZUZvcm1hdCxcbiAgICAgIGNsYXNzRGVmMTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc0RlZiksXG4gICAgICBjbGFzc0RlZjI6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NEZWYpLFxuICAgICAgY2xhc3MxQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAgIGNsYXNzMkNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgICBjbGFzc1JlY29yZHM6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkobmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShDbGFzczJSZWNvcmQsICdjbGFzczJDb3VudCcpLCAnY2xhc3MxQ291bnQnKVxuICAgIH1cbiAgfSksXG4gIDM6IHtcbiAgICAvLyBDdXJzaXZlIEF0dGFjaG1lbnQgUG9zaXRpb25pbmdcbiAgICBmb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgZW50cnlFeGl0Q291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBlbnRyeUV4aXRSZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRW50cnlFeGl0UmVjb3JkLCAnZW50cnlFeGl0Q291bnQnKVxuICB9LFxuICA0OiB7XG4gICAgLy8gTWFya1RvQmFzZSBBdHRhY2htZW50IFBvc2l0aW9uaW5nXG4gICAgZm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbWFya0NvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBiYXNlQ292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGNsYXNzQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBtYXJrQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTWFya0FycmF5KSxcbiAgICBiYXNlQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQmFzZUFycmF5KVxuICB9LFxuICA1OiB7XG4gICAgLy8gTWFya1RvTGlnYXR1cmUgQXR0YWNobWVudCBQb3NpdGlvbmluZ1xuICAgIGZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG1hcmtDb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgbGlnYXR1cmVDb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgY2xhc3NDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG1hcmtBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBNYXJrQXJyYXkpLFxuICAgIGxpZ2F0dXJlQXJyYXk6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTGlnYXR1cmVBcnJheSlcbiAgfSxcbiAgNjoge1xuICAgIC8vIE1hcmtUb01hcmsgQXR0YWNobWVudCBQb3NpdGlvbmluZ1xuICAgIGZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG1hcmsxQ292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIG1hcmsyQ292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ292ZXJhZ2UpLFxuICAgIGNsYXNzQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBtYXJrMUFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIE1hcmtBcnJheSksXG4gICAgbWFyazJBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBCYXNlQXJyYXkpXG4gIH0sXG4gIDc6IENvbnRleHQsXG4gIC8vIENvbnRleHR1YWwgcG9zaXRpb25pbmdcbiAgODogQ2hhaW5pbmdDb250ZXh0LFxuICAvLyBDaGFpbmluZyBjb250ZXh0dWFsIHBvc2l0aW9uaW5nXG4gIDk6IHtcbiAgICAvLyBFeHRlbnNpb24gUG9zaXRpb25pbmdcbiAgICBwb3NGb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBsb29rdXBUeXBlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gY2Fubm90IGFsc28gYmUgOVxuICAgIGV4dGVuc2lvbjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBHUE9TTG9va3VwKVxuICB9XG59KTsgLy8gRml4IGNpcmN1bGFyIHJlZmVyZW5jZVxuXG5HUE9TTG9va3VwLnZlcnNpb25zWzldLmV4dGVuc2lvbi50eXBlID0gR1BPU0xvb2t1cDtcbnZhciBHUE9TID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MzIsIHtcbiAgaGVhZGVyOiB7XG4gICAgc2NyaXB0TGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBTY3JpcHRMaXN0KSxcbiAgICBmZWF0dXJlTGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBGZWF0dXJlTGlzdCksXG4gICAgbG9va3VwTGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBuZXcgTG9va3VwTGlzdChHUE9TTG9va3VwKSlcbiAgfSxcbiAgMHgwMDAxMDAwMDoge30sXG4gIDB4MDAwMTAwMDE6IHtcbiAgICBmZWF0dXJlVmFyaWF0aW9uczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBGZWF0dXJlVmFyaWF0aW9ucylcbiAgfVxufSk7IC8vIGV4cG9ydCBHUE9TTG9va3VwIGZvciBKU1RGIHRhYmxlXG5cbnZhciBTZXF1ZW5jZSA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIHJlc3RydWN0dXJlLnVpbnQxNik7XG52YXIgQWx0ZXJuYXRlU2V0ID0gU2VxdWVuY2U7XG52YXIgTGlnYXR1cmUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZ2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgY29tcENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGNvbXBvbmVudHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuY29tcENvdW50IC0gMTtcbiAgfSlcbn0pO1xudmFyIExpZ2F0dXJlU2V0ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgTGlnYXR1cmUpLCByZXN0cnVjdHVyZS51aW50MTYpO1xudmFyIEdTVUJMb29rdXAgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KCdsb29rdXBUeXBlJywge1xuICAxOiBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAgIC8vIFNpbmdsZSBTdWJzdGl0dXRpb25cbiAgICAxOiB7XG4gICAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgICBkZWx0YUdseXBoSUQ6IHJlc3RydWN0dXJlLmludDE2XG4gICAgfSxcbiAgICAyOiB7XG4gICAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgICBnbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgICBzdWJzdGl0dXRlOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ2dseXBoQ291bnQnKVxuICAgIH1cbiAgfSksXG4gIDI6IHtcbiAgICAvLyBNdWx0aXBsZSBTdWJzdGl0dXRpb25cbiAgICBzdWJzdEZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBjb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHNlcXVlbmNlczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFNlcXVlbmNlKSwgJ2NvdW50JylcbiAgfSxcbiAgMzoge1xuICAgIC8vIEFsdGVybmF0ZSBTdWJzdGl0dXRpb25cbiAgICBzdWJzdEZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBjb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGFsdGVybmF0ZVNldDogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEFsdGVybmF0ZVNldCksICdjb3VudCcpXG4gIH0sXG4gIDQ6IHtcbiAgICAvLyBMaWdhdHVyZSBTdWJzdGl0dXRpb25cbiAgICBzdWJzdEZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNvdmVyYWdlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSxcbiAgICBjb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGxpZ2F0dXJlU2V0czogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIExpZ2F0dXJlU2V0KSwgJ2NvdW50JylcbiAgfSxcbiAgNTogQ29udGV4dCxcbiAgLy8gQ29udGV4dHVhbCBTdWJzdGl0dXRpb25cbiAgNjogQ2hhaW5pbmdDb250ZXh0LFxuICAvLyBDaGFpbmluZyBDb250ZXh0dWFsIFN1YnN0aXR1dGlvblxuICA3OiB7XG4gICAgLy8gRXh0ZW5zaW9uIFN1YnN0aXR1dGlvblxuICAgIHN1YnN0Rm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbG9va3VwVHlwZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIC8vIGNhbm5vdCBhbHNvIGJlIDdcbiAgICBleHRlbnNpb246IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgR1NVQkxvb2t1cClcbiAgfSxcbiAgODoge1xuICAgIC8vIFJldmVyc2UgQ2hhaW5pbmcgQ29udGV4dHVhbCBTaW5nbGUgU3Vic3RpdHV0aW9uXG4gICAgc3Vic3RGb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBjb3ZlcmFnZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDb3ZlcmFnZSksXG4gICAgYmFja3RyYWNrQ292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSwgJ2JhY2t0cmFja0dseXBoQ291bnQnKSxcbiAgICBsb29rYWhlYWRHbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgbG9va2FoZWFkQ292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5BcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENvdmVyYWdlKSwgJ2xvb2thaGVhZEdseXBoQ291bnQnKSxcbiAgICBnbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgc3Vic3RpdHV0ZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdnbHlwaENvdW50JylcbiAgfVxufSk7IC8vIEZpeCBjaXJjdWxhciByZWZlcmVuY2VcblxuR1NVQkxvb2t1cC52ZXJzaW9uc1s3XS5leHRlbnNpb24udHlwZSA9IEdTVUJMb29rdXA7XG52YXIgR1NVQiA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QocmVzdHJ1Y3R1cmUudWludDMyLCB7XG4gIGhlYWRlcjoge1xuICAgIHNjcmlwdExpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgU2NyaXB0TGlzdCksXG4gICAgZmVhdHVyZUxpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgRmVhdHVyZUxpc3QpLFxuICAgIGxvb2t1cExpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgbmV3IExvb2t1cExpc3QoR1NVQkxvb2t1cCkpXG4gIH0sXG4gIDB4MDAwMTAwMDA6IHt9LFxuICAweDAwMDEwMDAxOiB7XG4gICAgZmVhdHVyZVZhcmlhdGlvbnM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgRmVhdHVyZVZhcmlhdGlvbnMpXG4gIH1cbn0pO1xuXG52YXIgSnN0ZkdTVUJNb2RMaXN0ID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBKc3RmUHJpb3JpdHkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgc2hyaW5rYWdlRW5hYmxlR1NVQjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmR1NVQk1vZExpc3QpLFxuICBzaHJpbmthZ2VEaXNhYmxlR1NVQjogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmR1NVQk1vZExpc3QpLFxuICBzaHJpbmthZ2VFbmFibGVHUE9TOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZHU1VCTW9kTGlzdCksXG4gIHNocmlua2FnZURpc2FibGVHUE9TOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZHU1VCTW9kTGlzdCksXG4gIHNocmlua2FnZUpzdGZNYXg6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgbmV3IExvb2t1cExpc3QoR1BPU0xvb2t1cCkpLFxuICBleHRlbnNpb25FbmFibGVHU1VCOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZHU1VCTW9kTGlzdCksXG4gIGV4dGVuc2lvbkRpc2FibGVHU1VCOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZHU1VCTW9kTGlzdCksXG4gIGV4dGVuc2lvbkVuYWJsZUdQT1M6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZkdTVUJNb2RMaXN0KSxcbiAgZXh0ZW5zaW9uRGlzYWJsZUdQT1M6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZkdTVUJNb2RMaXN0KSxcbiAgZXh0ZW5zaW9uSnN0Zk1heDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBuZXcgTG9va3VwTGlzdChHUE9TTG9va3VwKSlcbn0pO1xudmFyIEpzdGZMYW5nU3lzID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZlByaW9yaXR5KSwgcmVzdHJ1Y3R1cmUudWludDE2KTtcbnZhciBKc3RmTGFuZ1N5c1JlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIGpzdGZMYW5nU3lzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIEpzdGZMYW5nU3lzKVxufSk7XG52YXIgSnN0ZlNjcmlwdCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBleHRlbmRlckdseXBoczogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCByZXN0cnVjdHVyZS51aW50MTYpKSxcbiAgLy8gYXJyYXkgb2YgZ2x5cGhzIHRvIGV4dGVuZCBsaW5lIGxlbmd0aFxuICBkZWZhdWx0TGFuZ1N5czogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBKc3RmTGFuZ1N5cyksXG4gIGxhbmdTeXNDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsYW5nU3lzUmVjb3JkczogbmV3IHJlc3RydWN0dXJlLkFycmF5KEpzdGZMYW5nU3lzUmVjb3JkLCAnbGFuZ1N5c0NvdW50Jylcbn0pO1xudmFyIEpzdGZTY3JpcHRSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICBzY3JpcHQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnN0ZlNjcmlwdCwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pXG59KTtcbnZhciBKU1RGID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgLy8gc2hvdWxkIGJlIDB4MDAwMTAwMDBcbiAgc2NyaXB0Q291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc2NyaXB0TGlzdDogbmV3IHJlc3RydWN0dXJlLkFycmF5KEpzdGZTY3JpcHRSZWNvcmQsICdzY3JpcHRDb3VudCcpXG59KTtcblxudmFyIFZhcmlhYmxlU2l6ZU51bWJlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFZhcmlhYmxlU2l6ZU51bWJlcihzaXplKSB7XG4gICAgdGhpcy5fc2l6ZSA9IHNpemU7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gVmFyaWFibGVTaXplTnVtYmVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKHN0cmVhbSwgcGFyZW50KSB7XG4gICAgc3dpdGNoICh0aGlzLnNpemUoMCwgcGFyZW50KSkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWRVSW50OCgpO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBzdHJlYW0ucmVhZFVJbnQxNkJFKCk7XG5cbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkVUludDI0QkUoKTtcblxuICAgICAgY2FzZSA0OlxuICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWRVSW50MzJCRSgpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc2l6ZSA9IGZ1bmN0aW9uIHNpemUodmFsLCBwYXJlbnQpIHtcbiAgICByZXR1cm4gdXRpbHNfMSh0aGlzLl9zaXplLCBudWxsLCBwYXJlbnQpO1xuICB9O1xuXG4gIHJldHVybiBWYXJpYWJsZVNpemVOdW1iZXI7XG59KCk7XG5cbnZhciBNYXBEYXRhRW50cnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZW50cnk6IG5ldyBWYXJpYWJsZVNpemVOdW1iZXIoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gKCh0LnBhcmVudC5lbnRyeUZvcm1hdCAmIDB4MDAzMCkgPj4gNCkgKyAxO1xuICB9KSxcbiAgb3V0ZXJJbmRleDogZnVuY3Rpb24gb3V0ZXJJbmRleCh0KSB7XG4gICAgcmV0dXJuIHQuZW50cnkgPj4gKHQucGFyZW50LmVudHJ5Rm9ybWF0ICYgMHgwMDBGKSArIDE7XG4gIH0sXG4gIGlubmVySW5kZXg6IGZ1bmN0aW9uIGlubmVySW5kZXgodCkge1xuICAgIHJldHVybiB0LmVudHJ5ICYgKDEgPDwgKHQucGFyZW50LmVudHJ5Rm9ybWF0ICYgMHgwMDBGKSArIDEpIC0gMTtcbiAgfVxufSk7XG52YXIgRGVsdGFTZXRJbmRleE1hcCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBlbnRyeUZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtYXBDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtYXBEYXRhOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoTWFwRGF0YUVudHJ5LCAnbWFwQ291bnQnKVxufSk7XG52YXIgSFZBUiA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBtYWpvclZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWlub3JWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGl0ZW1WYXJpYXRpb25TdG9yZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBJdGVtVmFyaWF0aW9uU3RvcmUpLFxuICBhZHZhbmNlV2lkdGhNYXBwaW5nOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIERlbHRhU2V0SW5kZXhNYXApLFxuICBMU0JNYXBwaW5nOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIERlbHRhU2V0SW5kZXhNYXApLFxuICBSU0JNYXBwaW5nOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIERlbHRhU2V0SW5kZXhNYXApXG59KTtcblxudmFyIFNpZ25hdHVyZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG9mZnNldDogcmVzdHJ1Y3R1cmUudWludDMyXG59KTtcbnZhciBTaWduYXR1cmVCbG9jayA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLnVpbnQxNiwgMiksXG4gIGNiU2lnbmF0dXJlOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIC8vIExlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBQS0NTIzcgcGFja2V0IGluIHBiU2lnbmF0dXJlXG4gIHNpZ25hdHVyZTogbmV3IHJlc3RydWN0dXJlLkJ1ZmZlcignY2JTaWduYXR1cmUnKVxufSk7XG52YXIgRFNJRyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB1bFZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgLy8gVmVyc2lvbiBudW1iZXIgb2YgdGhlIERTSUcgdGFibGUgKDB4MDAwMDAwMDEpXG4gIHVzTnVtU2lnczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBOdW1iZXIgb2Ygc2lnbmF0dXJlcyBpbiB0aGUgdGFibGVcbiAgdXNGbGFnOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIFBlcm1pc3Npb24gZmxhZ3NcbiAgc2lnbmF0dXJlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFNpZ25hdHVyZSwgJ3VzTnVtU2lncycpLFxuICBzaWduYXR1cmVCbG9ja3M6IG5ldyByZXN0cnVjdHVyZS5BcnJheShTaWduYXR1cmVCbG9jaywgJ3VzTnVtU2lncycpXG59KTtcblxudmFyIEdhc3BSYW5nZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICByYW5nZU1heFBQRU06IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gVXBwZXIgbGltaXQgb2YgcmFuZ2UsIGluIHBwZW1cbiAgcmFuZ2VHYXNwQmVoYXZpb3I6IG5ldyByZXN0cnVjdHVyZS5CaXRmaWVsZChyZXN0cnVjdHVyZS51aW50MTYsIFsvLyBGbGFncyBkZXNjcmliaW5nIGRlc2lyZWQgcmFzdGVyaXplciBiZWhhdmlvclxuICAnZ3JheXNjYWxlJywgJ2dyaWRmaXQnLCAnc3ltbWV0cmljU21vb3RoaW5nJywgJ3N5bW1ldHJpY0dyaWRmaXQnIC8vIG9ubHkgaW4gdmVyc2lvbiAxLCBmb3IgQ2xlYXJUeXBlXG4gIF0pXG59KTtcbnZhciBnYXNwID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gc2V0IHRvIDBcbiAgbnVtUmFuZ2VzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGdhc3BSYW5nZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShHYXNwUmFuZ2UsICdudW1SYW5nZXMnKSAvLyBTb3J0ZWQgYnkgcHBlbVxuXG59KTtcblxudmFyIERldmljZVJlY29yZCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBwaXhlbFNpemU6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICBtYXhpbXVtV2lkdGg6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICB3aWR0aHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQucGFyZW50Lm1heHAubnVtR2x5cGhzO1xuICB9KVxufSk7IC8vIFRoZSBIb3Jpem9udGFsIERldmljZSBNZXRyaWNzIHRhYmxlIHN0b3JlcyBpbnRlZ2VyIGFkdmFuY2Ugd2lkdGhzIHNjYWxlZCB0byBwYXJ0aWN1bGFyIHBpeGVsIHNpemVzXG5cbnZhciBoZG14ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbnVtUmVjb3JkczogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHNpemVEZXZpY2VSZWNvcmQ6IHJlc3RydWN0dXJlLmludDMyLFxuICByZWNvcmRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRGV2aWNlUmVjb3JkLCAnbnVtUmVjb3JkcycpXG59KTtcblxudmFyIEtlcm5QYWlyID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGxlZnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcmlnaHQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdmFsdWU6IHJlc3RydWN0dXJlLmludDE2XG59KTtcbnZhciBDbGFzc1RhYmxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZpcnN0R2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbkdseXBoczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBvZmZzZXRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCAnbkdseXBocycpLFxuICBtYXg6IGZ1bmN0aW9uIG1heCh0KSB7XG4gICAgcmV0dXJuIHQub2Zmc2V0cy5sZW5ndGggJiYgTWF0aC5tYXguYXBwbHkoTWF0aCwgdC5vZmZzZXRzKTtcbiAgfVxufSk7XG52YXIgS2VybjJBcnJheSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBvZmY6IGZ1bmN0aW9uIG9mZih0KSB7XG4gICAgcmV0dXJuIHQuX3N0YXJ0T2Zmc2V0IC0gdC5wYXJlbnQucGFyZW50Ll9zdGFydE9mZnNldDtcbiAgfSxcbiAgbGVuOiBmdW5jdGlvbiBsZW4odCkge1xuICAgIHJldHVybiAoKHQucGFyZW50LmxlZnRUYWJsZS5tYXggLSB0Lm9mZikgLyB0LnBhcmVudC5yb3dXaWR0aCArIDEpICogKHQucGFyZW50LnJvd1dpZHRoIC8gMik7XG4gIH0sXG4gIHZhbHVlczogbmV3IHJlc3RydWN0dXJlLkxhenlBcnJheShyZXN0cnVjdHVyZS5pbnQxNiwgJ2xlbicpXG59KTtcbnZhciBLZXJuU3VidGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KCdmb3JtYXQnLCB7XG4gIDA6IHtcbiAgICBuUGFpcnM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBzZWFyY2hSYW5nZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGVudHJ5U2VsZWN0b3I6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICByYW5nZVNoaWZ0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgcGFpcnM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShLZXJuUGFpciwgJ25QYWlycycpXG4gIH0sXG4gIDI6IHtcbiAgICByb3dXaWR0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGxlZnRUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBDbGFzc1RhYmxlLCB7XG4gICAgICB0eXBlOiAncGFyZW50J1xuICAgIH0pLFxuICAgIHJpZ2h0VGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NUYWJsZSwge1xuICAgICAgdHlwZTogJ3BhcmVudCdcbiAgICB9KSxcbiAgICBhcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBLZXJuMkFycmF5LCB7XG4gICAgICB0eXBlOiAncGFyZW50J1xuICAgIH0pXG4gIH0sXG4gIDM6IHtcbiAgICBnbHlwaENvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAga2VyblZhbHVlQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAgIGxlZnRDbGFzc0NvdW50OiByZXN0cnVjdHVyZS51aW50OCxcbiAgICByaWdodENsYXNzQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAgIGZsYWdzOiByZXN0cnVjdHVyZS51aW50OCxcbiAgICBrZXJuVmFsdWU6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS5pbnQxNiwgJ2tlcm5WYWx1ZUNvdW50JyksXG4gICAgbGVmdENsYXNzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsICdnbHlwaENvdW50JyksXG4gICAgcmlnaHRDbGFzczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCAnZ2x5cGhDb3VudCcpLFxuICAgIGtlcm5JbmRleDogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCBmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQubGVmdENsYXNzQ291bnQgKiB0LnJpZ2h0Q2xhc3NDb3VudDtcbiAgICB9KVxuICB9XG59KTtcbnZhciBLZXJuVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KCd2ZXJzaW9uJywge1xuICAwOiB7XG4gICAgLy8gTWljcm9zb2Z0IHVzZXMgdGhpcyBmb3JtYXRcbiAgICBzdWJWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgLy8gTWljcm9zb2Z0IGhhcyBhbiBleHRyYSBzdWItdGFibGUgdmVyc2lvbiBudW1iZXJcbiAgICBsZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyBMZW5ndGggb2YgdGhlIHN1YnRhYmxlLCBpbiBieXRlc1xuICAgIGZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDgsXG4gICAgLy8gRm9ybWF0IG9mIHN1YnRhYmxlXG4gICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5CaXRmaWVsZChyZXN0cnVjdHVyZS51aW50OCwgWydob3Jpem9udGFsJywgLy8gMSBpZiB0YWJsZSBoYXMgaG9yaXpvbnRhbCBkYXRhLCAwIGlmIHZlcnRpY2FsXG4gICAgJ21pbmltdW0nLCAvLyBJZiBzZXQgdG8gMSwgdGhlIHRhYmxlIGhhcyBtaW5pbXVtIHZhbHVlcy4gSWYgc2V0IHRvIDAsIHRoZSB0YWJsZSBoYXMga2VybmluZyB2YWx1ZXMuXG4gICAgJ2Nyb3NzU3RyZWFtJywgLy8gSWYgc2V0IHRvIDEsIGtlcm5pbmcgaXMgcGVycGVuZGljdWxhciB0byB0aGUgZmxvdyBvZiB0aGUgdGV4dFxuICAgICdvdmVycmlkZScgLy8gSWYgc2V0IHRvIDEgdGhlIHZhbHVlIGluIHRoaXMgdGFibGUgcmVwbGFjZXMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlXG4gICAgXSksXG4gICAgc3VidGFibGU6IEtlcm5TdWJ0YWJsZSxcbiAgICBwYWRkaW5nOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDgsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5sZW5ndGggLSB0Ll9jdXJyZW50T2Zmc2V0O1xuICAgIH0pXG4gIH0sXG4gIDE6IHtcbiAgICAvLyBBcHBsZSB1c2VzIHRoaXMgZm9ybWF0XG4gICAgbGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgY292ZXJhZ2U6IG5ldyByZXN0cnVjdHVyZS5CaXRmaWVsZChyZXN0cnVjdHVyZS51aW50OCwgW251bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICd2YXJpYXRpb24nLCAvLyBTZXQgaWYgdGFibGUgaGFzIHZhcmlhdGlvbiBrZXJuaW5nIHZhbHVlc1xuICAgICdjcm9zc1N0cmVhbScsIC8vIFNldCBpZiB0YWJsZSBoYXMgY3Jvc3Mtc3RyZWFtIGtlcm5pbmcgdmFsdWVzXG4gICAgJ3ZlcnRpY2FsJyAvLyBTZXQgaWYgdGFibGUgaGFzIHZlcnRpY2FsIGtlcm5pbmcgdmFsdWVzXG4gICAgXSksXG4gICAgZm9ybWF0OiByZXN0cnVjdHVyZS51aW50OCxcbiAgICB0dXBsZUluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgc3VidGFibGU6IEtlcm5TdWJ0YWJsZSxcbiAgICBwYWRkaW5nOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDgsIGZ1bmN0aW9uICh0KSB7XG4gICAgICByZXR1cm4gdC5sZW5ndGggLSB0Ll9jdXJyZW50T2Zmc2V0O1xuICAgIH0pXG4gIH1cbn0pO1xudmFyIGtlcm4gPSBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAwOiB7XG4gICAgLy8gTWljcm9zb2Z0IFZlcnNpb25cbiAgICBuVGFibGVzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgdGFibGVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoS2VyblRhYmxlLCAnblRhYmxlcycpXG4gIH0sXG4gIDE6IHtcbiAgICAvLyBBcHBsZSBWZXJzaW9uXG4gICAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICAgIC8vIHRoZSBvdGhlciBoYWxmIG9mIHRoZSB2ZXJzaW9uIG51bWJlclxuICAgIG5UYWJsZXM6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICB0YWJsZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShLZXJuVGFibGUsICduVGFibGVzJylcbiAgfVxufSk7XG5cbi8vIFJlY29yZHMgdGhlIHBwZW0gZm9yIGVhY2ggZ2x5cGggYXQgd2hpY2ggdGhlIHNjYWxpbmcgYmVjb21lcyBsaW5lYXIgYWdhaW4sXG4vLyBkZXNwaXRlIGluc3RydWN0aW9ucyBlZmZlY3RpbmcgdGhlIGFkdmFuY2Ugd2lkdGhcblxudmFyIExUU0ggPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBudW1HbHlwaHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgeVBlbHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgJ251bUdseXBocycpXG59KTtcblxuLy8gTk9URTogVGhlIFBDTFQgdGFibGUgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQgZm9yIE9wZW5UeXBlIGZvbnRzIHdpdGggVHJ1ZVR5cGUgb3V0bGluZXNcblxudmFyIFBDTFQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBmb250TnVtYmVyOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHBpdGNoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHhIZWlnaHQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc3R5bGU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdHlwZUZhbWlseTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBjYXBIZWlnaHQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc3ltYm9sU2V0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHR5cGVmYWNlOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDE2KSxcbiAgY2hhcmFjdGVyQ29tcGxlbWVudDogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg4KSxcbiAgZmlsZU5hbWU6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNiksXG4gIHN0cm9rZVdlaWdodDogbmV3IHJlc3RydWN0dXJlLlN0cmluZygxKSxcbiAgd2lkdGhUeXBlOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDEpLFxuICBzZXJpZlN0eWxlOiByZXN0cnVjdHVyZS51aW50OCxcbiAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50OClcbn0pO1xuXG4vLyBzaXplcy4gVGhpcyBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gbWF0Y2ggZm9udCBtZXRyaWNzIG9uIFdpbmRvd3MuXG5cbnZhciBSYXRpbyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBiQ2hhclNldDogcmVzdHJ1Y3R1cmUudWludDgsXG4gIC8vIENoYXJhY3RlciBzZXRcbiAgeFJhdGlvOiByZXN0cnVjdHVyZS51aW50OCxcbiAgLy8gVmFsdWUgdG8gdXNlIGZvciB4LVJhdGlvXG4gIHlTdGFydFJhdGlvOiByZXN0cnVjdHVyZS51aW50OCxcbiAgLy8gU3RhcnRpbmcgeS1SYXRpbyB2YWx1ZVxuICB5RW5kUmF0aW86IHJlc3RydWN0dXJlLnVpbnQ4IC8vIEVuZGluZyB5LVJhdGlvIHZhbHVlXG5cbn0pO1xudmFyIHZUYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB5UGVsSGVpZ2h0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIHlQZWxIZWlnaHQgdG8gd2hpY2ggdmFsdWVzIGFwcGx5XG4gIHlNYXg6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBNYXhpbXVtIHZhbHVlIChpbiBwZWxzKSBmb3IgdGhpcyB5UGVsSGVpZ2h0XG4gIHlNaW46IHJlc3RydWN0dXJlLmludDE2IC8vIE1pbmltdW0gdmFsdWUgKGluIHBlbHMpIGZvciB0aGlzIHlQZWxIZWlnaHRcblxufSk7XG52YXIgVmRteEdyb3VwID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHJlY3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTnVtYmVyIG9mIGhlaWdodCByZWNvcmRzIGluIHRoaXMgZ3JvdXBcbiAgc3RhcnRzejogcmVzdHJ1Y3R1cmUudWludDgsXG4gIC8vIFN0YXJ0aW5nIHlQZWxIZWlnaHRcbiAgZW5kc3o6IHJlc3RydWN0dXJlLnVpbnQ4LFxuICAvLyBFbmRpbmcgeVBlbEhlaWdodFxuICBlbnRyaWVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkodlRhYmxlLCAncmVjcycpIC8vIFRoZSBWRE1YIHJlY29yZHNcblxufSk7XG52YXIgVkRNWCA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIFZlcnNpb24gbnVtYmVyICgwIG9yIDEpXG4gIG51bVJlY3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgLy8gTnVtYmVyIG9mIFZETVggZ3JvdXBzIHByZXNlbnRcbiAgbnVtUmF0aW9zOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIE51bWJlciBvZiBhc3BlY3QgcmF0aW8gZ3JvdXBpbmdzXG4gIHJhdGlvUmFuZ2VzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoUmF0aW8sICdudW1SYXRpb3MnKSxcbiAgLy8gUmF0aW8gcmFuZ2VzXG4gIG9mZnNldHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50MTYsICdudW1SYXRpb3MnKSxcbiAgLy8gT2Zmc2V0IHRvIHRoZSBWRE1YIGdyb3VwIGZvciB0aGlzIHJhdGlvIHJhbmdlXG4gIGdyb3VwczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFZkbXhHcm91cCwgJ251bVJlY3MnKSAvLyBUaGUgYWN0dWFsIFZETVggZ3JvdXBpbmdzXG5cbn0pO1xuXG52YXIgdmhlYSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB2ZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBWZXJ0aWNhbCBIZWFkZXIgVGFibGVcbiAgYXNjZW50OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gVGhlIHZlcnRpY2FsIHR5cG9ncmFwaGljIGFzY2VuZGVyIGZvciB0aGlzIGZvbnRcbiAgZGVzY2VudDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIFRoZSB2ZXJ0aWNhbCB0eXBvZ3JhcGhpYyBkZXNjZW5kZXIgZm9yIHRoaXMgZm9udFxuICBsaW5lR2FwOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gVGhlIHZlcnRpY2FsIHR5cG9ncmFwaGljIGxpbmUgZ2FwIGZvciB0aGlzIGZvbnRcbiAgYWR2YW5jZUhlaWdodE1heDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIFRoZSBtYXhpbXVtIGFkdmFuY2UgaGVpZ2h0IG1lYXN1cmVtZW50IGZvdW5kIGluIHRoZSBmb250XG4gIG1pblRvcFNpZGVCZWFyaW5nOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gVGhlIG1pbmltdW0gdG9wIHNpZGUgYmVhcmluZyBtZWFzdXJlbWVudCBmb3VuZCBpbiB0aGUgZm9udFxuICBtaW5Cb3R0b21TaWRlQmVhcmluZzogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIFRoZSBtaW5pbXVtIGJvdHRvbSBzaWRlIGJlYXJpbmcgbWVhc3VyZW1lbnQgZm91bmQgaW4gdGhlIGZvbnRcbiAgeU1heEV4dGVudDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIGNhcmV0U2xvcGVSaXNlOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgLy8gQ2FyZXQgc2xvcGUgKHJpc2UvcnVuKVxuICBjYXJldFNsb3BlUnVuOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgY2FyZXRPZmZzZXQ6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBTZXQgdmFsdWUgZXF1YWwgdG8gMCBmb3Igbm9uc2xhbnRlZCBmb250c1xuICByZXNlcnZlZDogbmV3IHJlc3RydWN0dXJlLlJlc2VydmVkKHJlc3RydWN0dXJlLmludDE2LCA0KSxcbiAgbWV0cmljRGF0YUZvcm1hdDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIC8vIFNldCB0byAwXG4gIG51bWJlck9mTWV0cmljczogcmVzdHJ1Y3R1cmUudWludDE2IC8vIE51bWJlciBvZiBhZHZhbmNlIGhlaWdodHMgaW4gdGhlIFZlcnRpY2FsIE1ldHJpY3MgdGFibGVcblxufSk7XG5cbnZhciBWbXR4RW50cnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYWR2YW5jZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAvLyBUaGUgYWR2YW5jZSBoZWlnaHQgb2YgdGhlIGdseXBoXG4gIGJlYXJpbmc6IHJlc3RydWN0dXJlLmludDE2IC8vIFRoZSB0b3Agc2lkZWJlYXJpbmcgb2YgdGhlIGdseXBoXG5cbn0pOyAvLyBWZXJ0aWNhbCBNZXRyaWNzIFRhYmxlXG5cbnZhciB2bXR4ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG1ldHJpY3M6IG5ldyByZXN0cnVjdHVyZS5MYXp5QXJyYXkoVm10eEVudHJ5LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnBhcmVudC52aGVhLm51bWJlck9mTWV0cmljcztcbiAgfSksXG4gIGJlYXJpbmdzOiBuZXcgcmVzdHJ1Y3R1cmUuTGF6eUFycmF5KHJlc3RydWN0dXJlLmludDE2LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5tYXhwLm51bUdseXBocyAtIHQucGFyZW50LnZoZWEubnVtYmVyT2ZNZXRyaWNzO1xuICB9KVxufSk7XG5cbnZhciBzaG9ydEZyYWMgPSBuZXcgcmVzdHJ1Y3R1cmUuRml4ZWQoMTYsICdCRScsIDE0KTtcbnZhciBDb3JyZXNwb25kZW5jZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmcm9tQ29vcmQ6IHNob3J0RnJhYyxcbiAgdG9Db29yZDogc2hvcnRGcmFjXG59KTtcbnZhciBTZWdtZW50ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHBhaXJDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBjb3JyZXNwb25kZW5jZTogbmV3IHJlc3RydWN0dXJlLkFycmF5KENvcnJlc3BvbmRlbmNlLCAncGFpckNvdW50Jylcbn0pO1xudmFyIGF2YXIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgYXhpc0NvdW50OiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHNlZ21lbnQ6IG5ldyByZXN0cnVjdHVyZS5BcnJheShTZWdtZW50LCAnYXhpc0NvdW50Jylcbn0pO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSQyKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgVW5ib3VuZGVkQXJyYXlBY2Nlc3NvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFVuYm91bmRlZEFycmF5QWNjZXNzb3IodHlwZSwgc3RyZWFtLCBwYXJlbnQpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMuYmFzZSA9IHRoaXMuc3RyZWFtLnBvcztcbiAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFVuYm91bmRlZEFycmF5QWNjZXNzb3IucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRJdGVtID0gZnVuY3Rpb24gZ2V0SXRlbShpbmRleCkge1xuICAgIGlmICh0aGlzLl9pdGVtc1tpbmRleF0gPT0gbnVsbCkge1xuICAgICAgdmFyIHBvcyA9IHRoaXMuc3RyZWFtLnBvcztcbiAgICAgIHRoaXMuc3RyZWFtLnBvcyA9IHRoaXMuYmFzZSArIHRoaXMudHlwZS5zaXplKG51bGwsIHRoaXMucGFyZW50KSAqIGluZGV4O1xuICAgICAgdGhpcy5faXRlbXNbaW5kZXhdID0gdGhpcy50eXBlLmRlY29kZSh0aGlzLnN0cmVhbSwgdGhpcy5wYXJlbnQpO1xuICAgICAgdGhpcy5zdHJlYW0ucG9zID0gcG9zO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pdGVtc1tpbmRleF07XG4gIH07XG5cbiAgX3Byb3RvLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICAgIHJldHVybiBcIltVbmJvdW5kZWRBcnJheSBcIiArIHRoaXMudHlwZS5jb25zdHJ1Y3Rvci5uYW1lICsgXCJdXCI7XG4gIH07XG5cbiAgcmV0dXJuIFVuYm91bmRlZEFycmF5QWNjZXNzb3I7XG59KCk7XG5cbnZhciBVbmJvdW5kZWRBcnJheSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX3IkQXJyYXkpIHtcbiAgX2luaGVyaXRzTG9vc2UkMihVbmJvdW5kZWRBcnJheSwgX3IkQXJyYXkpO1xuXG4gIGZ1bmN0aW9uIFVuYm91bmRlZEFycmF5KHR5cGUpIHtcbiAgICByZXR1cm4gX3IkQXJyYXkuY2FsbCh0aGlzLCB0eXBlLCAwKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90bzIgPSBVbmJvdW5kZWRBcnJheS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMi5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBwYXJlbnQpIHtcbiAgICByZXR1cm4gbmV3IFVuYm91bmRlZEFycmF5QWNjZXNzb3IodGhpcy50eXBlLCBzdHJlYW0sIHBhcmVudCk7XG4gIH07XG5cbiAgcmV0dXJuIFVuYm91bmRlZEFycmF5O1xufShyZXN0cnVjdHVyZS5BcnJheSk7XG52YXIgTG9va3VwVGFibGUgPSBmdW5jdGlvbiBMb29rdXBUYWJsZShWYWx1ZVR5cGUpIHtcbiAgaWYgKFZhbHVlVHlwZSA9PT0gdm9pZCAwKSB7XG4gICAgVmFsdWVUeXBlID0gcmVzdHJ1Y3R1cmUudWludDE2O1xuICB9XG5cbiAgLy8gSGVscGVyIGNsYXNzIHRoYXQgbWFrZXMgaW50ZXJuYWwgc3RydWN0dXJlcyBpbnZpc2libGUgdG8gcG9pbnRlcnNcbiAgdmFyIFNoYWRvdyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2hhZG93KHR5cGUpIHtcbiAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIF9wcm90bzMgPSBTaGFkb3cucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvMy5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUoc3RyZWFtLCBjdHgpIHtcbiAgICAgIGN0eCA9IGN0eC5wYXJlbnQucGFyZW50O1xuICAgICAgcmV0dXJuIHRoaXMudHlwZS5kZWNvZGUoc3RyZWFtLCBjdHgpO1xuICAgIH07XG5cbiAgICBfcHJvdG8zLnNpemUgPSBmdW5jdGlvbiBzaXplKHZhbCwgY3R4KSB7XG4gICAgICBjdHggPSBjdHgucGFyZW50LnBhcmVudDtcbiAgICAgIHJldHVybiB0aGlzLnR5cGUuc2l6ZSh2YWwsIGN0eCk7XG4gICAgfTtcblxuICAgIF9wcm90bzMuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0cmVhbSwgdmFsLCBjdHgpIHtcbiAgICAgIGN0eCA9IGN0eC5wYXJlbnQucGFyZW50O1xuICAgICAgcmV0dXJuIHRoaXMudHlwZS5lbmNvZGUoc3RyZWFtLCB2YWwsIGN0eCk7XG4gICAgfTtcblxuICAgIHJldHVybiBTaGFkb3c7XG4gIH0oKTtcblxuICBWYWx1ZVR5cGUgPSBuZXcgU2hhZG93KFZhbHVlVHlwZSk7XG4gIHZhciBCaW5hcnlTZWFyY2hIZWFkZXIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgICB1bml0U2l6ZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIG5Vbml0czogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHNlYXJjaFJhbmdlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZW50cnlTZWxlY3RvcjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHJhbmdlU2hpZnQ6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9KTtcbiAgdmFyIExvb2t1cFNlZ21lbnRTaW5nbGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgICBsYXN0R2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBmaXJzdEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgdmFsdWU6IFZhbHVlVHlwZVxuICB9KTtcbiAgdmFyIExvb2t1cFNlZ21lbnRBcnJheSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICAgIGxhc3RHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGZpcnN0R2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICB2YWx1ZXM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KFZhbHVlVHlwZSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0Lmxhc3RHbHlwaCAtIHQuZmlyc3RHbHlwaCArIDE7XG4gICAgfSksIHtcbiAgICAgIHR5cGU6ICdwYXJlbnQnXG4gICAgfSlcbiAgfSk7XG4gIHZhciBMb29rdXBTaW5nbGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgICBnbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIHZhbHVlOiBWYWx1ZVR5cGVcbiAgfSk7XG4gIHJldHVybiBuZXcgcmVzdHJ1Y3R1cmUuVmVyc2lvbmVkU3RydWN0KHJlc3RydWN0dXJlLnVpbnQxNiwge1xuICAgIDA6IHtcbiAgICAgIHZhbHVlczogbmV3IFVuYm91bmRlZEFycmF5KFZhbHVlVHlwZSkgLy8gbGVuZ3RoID09IG51bWJlciBvZiBnbHlwaHMgbWF5YmU/XG5cbiAgICB9LFxuICAgIDI6IHtcbiAgICAgIGJpbmFyeVNlYXJjaEhlYWRlcjogQmluYXJ5U2VhcmNoSGVhZGVyLFxuICAgICAgc2VnbWVudHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShMb29rdXBTZWdtZW50U2luZ2xlLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5iaW5hcnlTZWFyY2hIZWFkZXIublVuaXRzO1xuICAgICAgfSlcbiAgICB9LFxuICAgIDQ6IHtcbiAgICAgIGJpbmFyeVNlYXJjaEhlYWRlcjogQmluYXJ5U2VhcmNoSGVhZGVyLFxuICAgICAgc2VnbWVudHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShMb29rdXBTZWdtZW50QXJyYXksIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmJpbmFyeVNlYXJjaEhlYWRlci5uVW5pdHM7XG4gICAgICB9KVxuICAgIH0sXG4gICAgNjoge1xuICAgICAgYmluYXJ5U2VhcmNoSGVhZGVyOiBCaW5hcnlTZWFyY2hIZWFkZXIsXG4gICAgICBzZWdtZW50czogbmV3IHJlc3RydWN0dXJlLkFycmF5KExvb2t1cFNpbmdsZSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQuYmluYXJ5U2VhcmNoSGVhZGVyLm5Vbml0cztcbiAgICAgIH0pXG4gICAgfSxcbiAgICA4OiB7XG4gICAgICBmaXJzdEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgICBjb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgICAgdmFsdWVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoVmFsdWVUeXBlLCAnY291bnQnKVxuICAgIH1cbiAgfSk7XG59O1xuZnVuY3Rpb24gU3RhdGVUYWJsZShlbnRyeURhdGEsIGxvb2t1cFR5cGUpIHtcbiAgaWYgKGVudHJ5RGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgZW50cnlEYXRhID0ge307XG4gIH1cblxuICBpZiAobG9va3VwVHlwZSA9PT0gdm9pZCAwKSB7XG4gICAgbG9va3VwVHlwZSA9IHJlc3RydWN0dXJlLnVpbnQxNjtcbiAgfVxuXG4gIHZhciBlbnRyeSA9IE9iamVjdC5hc3NpZ24oe1xuICAgIG5ld1N0YXRlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9LCBlbnRyeURhdGEpO1xuICB2YXIgRW50cnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KGVudHJ5KTtcbiAgdmFyIFN0YXRlQXJyYXkgPSBuZXcgVW5ib3VuZGVkQXJyYXkobmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5uQ2xhc3NlcztcbiAgfSkpO1xuICB2YXIgU3RhdGVIZWFkZXIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgICBuQ2xhc3NlczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGNsYXNzVGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IExvb2t1cFRhYmxlKGxvb2t1cFR5cGUpKSxcbiAgICBzdGF0ZUFycmF5OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIFN0YXRlQXJyYXkpLFxuICAgIGVudHJ5VGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IFVuYm91bmRlZEFycmF5KEVudHJ5KSlcbiAgfSk7XG4gIHJldHVybiBTdGF0ZUhlYWRlcjtcbn0gLy8gVGhpcyBpcyB0aGUgb2xkIHZlcnNpb24gb2YgdGhlIFN0YXRlVGFibGUgc3RydWN0dXJlXG5cbmZ1bmN0aW9uIFN0YXRlVGFibGUxKGVudHJ5RGF0YSwgbG9va3VwVHlwZSkge1xuICBpZiAoZW50cnlEYXRhID09PSB2b2lkIDApIHtcbiAgICBlbnRyeURhdGEgPSB7fTtcbiAgfVxuXG4gIGlmIChsb29rdXBUeXBlID09PSB2b2lkIDApIHtcbiAgICBsb29rdXBUeXBlID0gcmVzdHJ1Y3R1cmUudWludDE2O1xuICB9XG5cbiAgdmFyIENsYXNzTG9va3VwVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgICB2ZXJzaW9uOiBmdW5jdGlvbiB2ZXJzaW9uKCkge1xuICAgICAgcmV0dXJuIDg7XG4gICAgfSxcbiAgICAvLyBzaW11bGF0ZSBMb29rdXBUYWJsZVxuICAgIGZpcnN0R2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICB2YWx1ZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS51aW50OCwgcmVzdHJ1Y3R1cmUudWludDE2KVxuICB9KTtcbiAgdmFyIGVudHJ5ID0gT2JqZWN0LmFzc2lnbih7XG4gICAgbmV3U3RhdGVPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICAvLyBjb252ZXJ0IG9mZnNldCB0byBzdGF0ZUFycmF5IGluZGV4XG4gICAgbmV3U3RhdGU6IGZ1bmN0aW9uIG5ld1N0YXRlKHQpIHtcbiAgICAgIHJldHVybiAodC5uZXdTdGF0ZU9mZnNldCAtICh0LnBhcmVudC5zdGF0ZUFycmF5LmJhc2UgLSB0LnBhcmVudC5fc3RhcnRPZmZzZXQpKSAvIHQucGFyZW50Lm5DbGFzc2VzO1xuICAgIH0sXG4gICAgZmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQxNlxuICB9LCBlbnRyeURhdGEpO1xuICB2YXIgRW50cnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KGVudHJ5KTtcbiAgdmFyIFN0YXRlQXJyYXkgPSBuZXcgVW5ib3VuZGVkQXJyYXkobmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0Lm5DbGFzc2VzO1xuICB9KSk7XG4gIHZhciBTdGF0ZUhlYWRlcjEgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgICBuQ2xhc3NlczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGNsYXNzVGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgQ2xhc3NMb29rdXBUYWJsZSksXG4gICAgc3RhdGVBcnJheTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBTdGF0ZUFycmF5KSxcbiAgICBlbnRyeVRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIG5ldyBVbmJvdW5kZWRBcnJheShFbnRyeSkpXG4gIH0pO1xuICByZXR1cm4gU3RhdGVIZWFkZXIxO1xufVxuXG52YXIgQnNsblN1YnRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdCgnZm9ybWF0Jywge1xuICAwOiB7XG4gICAgLy8gRGlzdGFuY2UtYmFzZWQsIG5vIG1hcHBpbmdcbiAgICBkZWx0YXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS5pbnQxNiwgMzIpXG4gIH0sXG4gIDE6IHtcbiAgICAvLyBEaXN0YW5jZS1iYXNlZCwgd2l0aCBtYXBwaW5nXG4gICAgZGVsdGFzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUuaW50MTYsIDMyKSxcbiAgICBtYXBwaW5nRGF0YTogbmV3IExvb2t1cFRhYmxlKHJlc3RydWN0dXJlLnVpbnQxNilcbiAgfSxcbiAgMjoge1xuICAgIC8vIENvbnRyb2wgcG9pbnQtYmFzZWQsIG5vIG1hcHBpbmdcbiAgICBzdGFuZGFyZEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY29udHJvbFBvaW50czogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgMzIpXG4gIH0sXG4gIDM6IHtcbiAgICAvLyBDb250cm9sIHBvaW50LWJhc2VkLCB3aXRoIG1hcHBpbmdcbiAgICBzdGFuZGFyZEdseXBoOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgY29udHJvbFBvaW50czogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgMzIpLFxuICAgIG1hcHBpbmdEYXRhOiBuZXcgTG9va3VwVGFibGUocmVzdHJ1Y3R1cmUudWludDE2KVxuICB9XG59KTtcbnZhciBic2xuID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIGZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBkZWZhdWx0QmFzZWxpbmU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc3VidGFibGU6IEJzbG5TdWJ0YWJsZVxufSk7XG5cbnZhciBTZXR0aW5nID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHNldHRpbmc6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbmFtZUluZGV4OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgbmFtZTogZnVuY3Rpb24gbmFtZSh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LnBhcmVudC5wYXJlbnQubmFtZS5yZWNvcmRzLmZvbnRGZWF0dXJlc1t0Lm5hbWVJbmRleF07XG4gIH1cbn0pO1xudmFyIEZlYXR1cmVOYW1lID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZlYXR1cmU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgblNldHRpbmdzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHNldHRpbmdUYWJsZTogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoU2V0dGluZywgJ25TZXR0aW5ncycpLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSksXG4gIGZlYXR1cmVGbGFnczogbmV3IHJlc3RydWN0dXJlLkJpdGZpZWxkKHJlc3RydWN0dXJlLnVpbnQ4LCBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgJ2hhc0RlZmF1bHQnLCAnZXhjbHVzaXZlJ10pLFxuICBkZWZhdWx0U2V0dGluZzogcmVzdHJ1Y3R1cmUudWludDgsXG4gIG5hbWVJbmRleDogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIG5hbWU6IGZ1bmN0aW9uIG5hbWUodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5wYXJlbnQubmFtZS5yZWNvcmRzLmZvbnRGZWF0dXJlc1t0Lm5hbWVJbmRleF07XG4gIH1cbn0pO1xudmFyIGZlYXQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgZmVhdHVyZU5hbWVDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICByZXNlcnZlZDE6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICByZXNlcnZlZDI6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MzIpLFxuICBmZWF0dXJlTmFtZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShGZWF0dXJlTmFtZSwgJ2ZlYXR1cmVOYW1lQ291bnQnKVxufSk7XG5cbnZhciBBeGlzJDEgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgYXhpc1RhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgbWluVmFsdWU6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIGRlZmF1bHRWYWx1ZTogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgbWF4VmFsdWU6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIGZsYWdzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG5hbWVJRDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBuYW1lOiBmdW5jdGlvbiBuYW1lKHQpIHtcbiAgICByZXR1cm4gdC5wYXJlbnQucGFyZW50Lm5hbWUucmVjb3Jkcy5mb250RmVhdHVyZXNbdC5uYW1lSURdO1xuICB9XG59KTtcbnZhciBJbnN0YW5jZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBuYW1lSUQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbmFtZTogZnVuY3Rpb24gbmFtZSh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LnBhcmVudC5uYW1lLnJlY29yZHMuZm9udEZlYXR1cmVzW3QubmFtZUlEXTtcbiAgfSxcbiAgZmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgY29vcmQ6IG5ldyByZXN0cnVjdHVyZS5BcnJheShyZXN0cnVjdHVyZS5maXhlZDMyLCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5heGlzQ291bnQ7XG4gIH0pLFxuICBwb3N0c2NyaXB0TmFtZUlEOiBuZXcgcmVzdHJ1Y3R1cmUuT3B0aW9uYWwocmVzdHJ1Y3R1cmUudWludDE2LCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0LnBhcmVudC5pbnN0YW5jZVNpemUgLSB0Ll9jdXJyZW50T2Zmc2V0ID4gMDtcbiAgfSlcbn0pO1xudmFyIGZ2YXIgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgb2Zmc2V0VG9EYXRhOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGNvdW50U2l6ZVBhaXJzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGF4aXNDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBheGlzU2l6ZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBpbnN0YW5jZUNvdW50OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGluc3RhbmNlU2l6ZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBheGlzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoQXhpcyQxLCAnYXhpc0NvdW50JyksXG4gIGluc3RhbmNlOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoSW5zdGFuY2UsICdpbnN0YW5jZUNvdW50Jylcbn0pO1xuXG52YXIgc2hvcnRGcmFjJDEgPSBuZXcgcmVzdHJ1Y3R1cmUuRml4ZWQoMTYsICdCRScsIDE0KTtcblxudmFyIE9mZnNldCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE9mZnNldCgpIHt9XG5cbiAgT2Zmc2V0LmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCkge1xuICAgIC8vIEluIHNob3J0IGZvcm1hdCwgb2Zmc2V0cyBhcmUgbXVsdGlwbGllZCBieSAyLlxuICAgIC8vIFRoaXMgZG9lc24ndCBzZWVtIHRvIGJlIGRvY3VtZW50ZWQgYnkgQXBwbGUsIGJ1dCBpdFxuICAgIC8vIGlzIGltcGxlbWVudGVkIHRoaXMgd2F5IGluIEZyZWV0eXBlLlxuICAgIHJldHVybiBwYXJlbnQuZmxhZ3MgPyBzdHJlYW0ucmVhZFVJbnQzMkJFKCkgOiBzdHJlYW0ucmVhZFVJbnQxNkJFKCkgKiAyO1xuICB9O1xuXG4gIHJldHVybiBPZmZzZXQ7XG59KCk7XG5cbnZhciBndmFyID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICBheGlzQ291bnQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZ2xvYmFsQ29vcmRDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBnbG9iYWxDb29yZHM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5BcnJheShzaG9ydEZyYWMkMSwgJ2F4aXNDb3VudCcpLCAnZ2xvYmFsQ29vcmRDb3VudCcpKSxcbiAgZ2x5cGhDb3VudDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBmbGFnczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBvZmZzZXRUb0RhdGE6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgb2Zmc2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKE9mZnNldCwgJ3ZvaWQnLCB7XG4gICAgcmVsYXRpdmVUbzogJ29mZnNldFRvRGF0YScsXG4gICAgYWxsb3dOdWxsOiBmYWxzZVxuICB9KSwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5nbHlwaENvdW50ICsgMTtcbiAgfSlcbn0pO1xuXG52YXIgQ2xhc3NUYWJsZSQxID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBjb3ZlcmFnZTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBzdWJGZWF0dXJlRmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgc3RhdGVUYWJsZTogbmV3IFN0YXRlVGFibGUxKClcbn0pO1xudmFyIFdpZHRoRGVsdGFSZWNvcmQgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAganVzdENsYXNzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGJlZm9yZUdyb3dMaW1pdDogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgYmVmb3JlU2hyaW5rTGltaXQ6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIGFmdGVyR3Jvd0xpbWl0OiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBhZnRlclNocmlua0xpbWl0OiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICBncm93RmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc2hyaW5rRmxhZ3M6IHJlc3RydWN0dXJlLnVpbnQxNlxufSk7XG52YXIgV2lkdGhEZWx0YUNsdXN0ZXIgPSBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoV2lkdGhEZWx0YVJlY29yZCwgcmVzdHJ1Y3R1cmUudWludDMyKTtcbnZhciBBY3Rpb25EYXRhID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdCgnYWN0aW9uVHlwZScsIHtcbiAgMDoge1xuICAgIC8vIERlY29tcG9zaXRpb24gYWN0aW9uXG4gICAgbG93ZXJMaW1pdDogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgICB1cHBlckxpbWl0OiByZXN0cnVjdHVyZS5maXhlZDMyLFxuICAgIG9yZGVyOiByZXN0cnVjdHVyZS51aW50MTYsXG4gICAgZ2x5cGhzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDE2LCByZXN0cnVjdHVyZS51aW50MTYpXG4gIH0sXG4gIDE6IHtcbiAgICAvLyBVbmNvbmRpdGlvbmFsIGFkZCBnbHlwaCBhY3Rpb25cbiAgICBhZGRHbHlwaDogcmVzdHJ1Y3R1cmUudWludDE2XG4gIH0sXG4gIDI6IHtcbiAgICAvLyBDb25kaXRpb25hbCBhZGQgZ2x5cGggYWN0aW9uXG4gICAgc3Vic3RUaHJlc2hvbGQ6IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gICAgYWRkR2x5cGg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgICBzdWJzdEdseXBoOiByZXN0cnVjdHVyZS51aW50MTZcbiAgfSxcbiAgMzoge30sXG4gIC8vIFN0cmV0Y2ggZ2x5cGggYWN0aW9uIChubyBkYXRhLCBub3Qgc3VwcG9ydGVkIGJ5IENvcmVUZXh0KVxuICA0OiB7XG4gICAgLy8gRHVjdGlsZSBnbHlwaCBhY3Rpb24gKG5vdCBzdXBwb3J0ZWQgYnkgQ29yZVRleHQpXG4gICAgdmFyaWF0aW9uQXhpczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIG1pbmltdW1MaW1pdDogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgICBub1N0cmV0Y2hWYWx1ZTogcmVzdHJ1Y3R1cmUuZml4ZWQzMixcbiAgICBtYXhpbXVtTGltaXQ6IHJlc3RydWN0dXJlLmZpeGVkMzJcbiAgfSxcbiAgNToge1xuICAgIC8vIFJlcGVhdGVkIGFkZCBnbHlwaCBhY3Rpb25cbiAgICBmbGFnczogcmVzdHJ1Y3R1cmUudWludDE2LFxuICAgIGdseXBoOiByZXN0cnVjdHVyZS51aW50MTZcbiAgfVxufSk7XG52YXIgQWN0aW9uID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGFjdGlvbkNsYXNzOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGFjdGlvblR5cGU6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgYWN0aW9uTGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGFjdGlvbkRhdGE6IEFjdGlvbkRhdGEsXG4gIHBhZGRpbmc6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50OCwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5hY3Rpb25MZW5ndGggLSB0Ll9jdXJyZW50T2Zmc2V0O1xuICB9KVxufSk7XG52YXIgUG9zdGNvbXBlbnNhdGlvbkFjdGlvbiA9IG5ldyByZXN0cnVjdHVyZS5BcnJheShBY3Rpb24sIHJlc3RydWN0dXJlLnVpbnQzMik7XG52YXIgUG9zdENvbXBlbnNhdGlvblRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGxvb2t1cFRhYmxlOiBuZXcgTG9va3VwVGFibGUobmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBQb3N0Y29tcGVuc2F0aW9uQWN0aW9uKSlcbn0pO1xudmFyIEp1c3RpZmljYXRpb25UYWJsZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBjbGFzc1RhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIENsYXNzVGFibGUkMSwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pLFxuICB3ZGNPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcG9zdENvbXBlbnNhdGlvblRhYmxlOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFBvc3RDb21wZW5zYXRpb25UYWJsZSwge1xuICAgIHR5cGU6ICdwYXJlbnQnXG4gIH0pLFxuICB3aWR0aERlbHRhQ2x1c3RlcnM6IG5ldyBMb29rdXBUYWJsZShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MTYsIFdpZHRoRGVsdGFDbHVzdGVyLCB7XG4gICAgdHlwZTogJ3BhcmVudCcsXG4gICAgcmVsYXRpdmVUbzogJ3dkY09mZnNldCdcbiAgfSkpXG59KTtcbnZhciBqdXN0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgZm9ybWF0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGhvcml6b250YWw6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnVzdGlmaWNhdGlvblRhYmxlKSxcbiAgdmVydGljYWw6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgSnVzdGlmaWNhdGlvblRhYmxlKVxufSk7XG5cbnZhciBMaWdhdHVyZURhdGEgPSB7XG4gIGFjdGlvbjogcmVzdHJ1Y3R1cmUudWludDE2XG59O1xudmFyIENvbnRleHR1YWxEYXRhID0ge1xuICBtYXJrSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgY3VycmVudEluZGV4OiByZXN0cnVjdHVyZS51aW50MTZcbn07XG52YXIgSW5zZXJ0aW9uRGF0YSA9IHtcbiAgY3VycmVudEluc2VydEluZGV4OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1hcmtlZEluc2VydEluZGV4OiByZXN0cnVjdHVyZS51aW50MTZcbn07XG52YXIgU3Vic3RpdHV0aW9uVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgaXRlbXM6IG5ldyBVbmJvdW5kZWRBcnJheShuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyBMb29rdXBUYWJsZSgpKSlcbn0pO1xudmFyIFN1YnRhYmxlRGF0YSA9IG5ldyByZXN0cnVjdHVyZS5WZXJzaW9uZWRTdHJ1Y3QoJ3R5cGUnLCB7XG4gIDA6IHtcbiAgICAvLyBJbmRpYyBSZWFycmFuZ2VtZW50IFN1YnRhYmxlXG4gICAgc3RhdGVUYWJsZTogbmV3IFN0YXRlVGFibGUoKVxuICB9LFxuICAxOiB7XG4gICAgLy8gQ29udGV4dHVhbCBHbHlwaCBTdWJzdGl0dXRpb24gU3VidGFibGVcbiAgICBzdGF0ZVRhYmxlOiBuZXcgU3RhdGVUYWJsZShDb250ZXh0dWFsRGF0YSksXG4gICAgc3Vic3RpdHV0aW9uVGFibGU6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgU3Vic3RpdHV0aW9uVGFibGUpXG4gIH0sXG4gIDI6IHtcbiAgICAvLyBMaWdhdHVyZSBzdWJ0YWJsZVxuICAgIHN0YXRlVGFibGU6IG5ldyBTdGF0ZVRhYmxlKExpZ2F0dXJlRGF0YSksXG4gICAgbGlnYXR1cmVBY3Rpb25zOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyBVbmJvdW5kZWRBcnJheShyZXN0cnVjdHVyZS51aW50MzIpKSxcbiAgICBjb21wb25lbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsIG5ldyBVbmJvdW5kZWRBcnJheShyZXN0cnVjdHVyZS51aW50MTYpKSxcbiAgICBsaWdhdHVyZUxpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IFVuYm91bmRlZEFycmF5KHJlc3RydWN0dXJlLnVpbnQxNikpXG4gIH0sXG4gIDQ6IHtcbiAgICAvLyBOb24tY29udGV4dHVhbCBHbHlwaCBTdWJzdGl0dXRpb24gU3VidGFibGVcbiAgICBsb29rdXBUYWJsZTogbmV3IExvb2t1cFRhYmxlKClcbiAgfSxcbiAgNToge1xuICAgIC8vIEdseXBoIEluc2VydGlvbiBTdWJ0YWJsZVxuICAgIHN0YXRlVGFibGU6IG5ldyBTdGF0ZVRhYmxlKEluc2VydGlvbkRhdGEpLFxuICAgIGluc2VydGlvbkFjdGlvbnM6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgbmV3IFVuYm91bmRlZEFycmF5KHJlc3RydWN0dXJlLnVpbnQxNikpXG4gIH1cbn0pO1xudmFyIFN1YnRhYmxlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBjb3ZlcmFnZTogcmVzdHJ1Y3R1cmUudWludDI0LFxuICB0eXBlOiByZXN0cnVjdHVyZS51aW50OCxcbiAgc3ViRmVhdHVyZUZsYWdzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHRhYmxlOiBTdWJ0YWJsZURhdGEsXG4gIHBhZGRpbmc6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50OCwgZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5sZW5ndGggLSB0Ll9jdXJyZW50T2Zmc2V0O1xuICB9KVxufSk7XG52YXIgRmVhdHVyZUVudHJ5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGZlYXR1cmVUeXBlOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGZlYXR1cmVTZXR0aW5nOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIGVuYWJsZUZsYWdzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGRpc2FibGVGbGFnczogcmVzdHJ1Y3R1cmUudWludDMyXG59KTtcbnZhciBNb3J4Q2hhaW4gPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgZGVmYXVsdEZsYWdzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGNoYWluTGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG5GZWF0dXJlRW50cmllczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBuU3VidGFibGVzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGZlYXR1cmVzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoRmVhdHVyZUVudHJ5LCAnbkZlYXR1cmVFbnRyaWVzJyksXG4gIHN1YnRhYmxlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFN1YnRhYmxlLCAnblN1YnRhYmxlcycpXG59KTtcbnZhciBtb3J4ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgdW51c2VkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDE2KSxcbiAgbkNoYWluczogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBjaGFpbnM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShNb3J4Q2hhaW4sICduQ2hhaW5zJylcbn0pO1xuXG52YXIgT3B0aWNhbEJvdW5kcyA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBsZWZ0OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgdG9wOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgcmlnaHQ6IHJlc3RydWN0dXJlLmludDE2LFxuICBib3R0b206IHJlc3RydWN0dXJlLmludDE2XG59KTtcbnZhciBvcGJkID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHZlcnNpb246IHJlc3RydWN0dXJlLmZpeGVkMzIsXG4gIGZvcm1hdDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBsb29rdXBUYWJsZTogbmV3IExvb2t1cFRhYmxlKE9wdGljYWxCb3VuZHMpXG59KTtcblxudmFyIHRhYmxlcyA9IHt9O1xudGFibGVzLmNtYXAgPSBjbWFwO1xudGFibGVzLmhlYWQgPSBoZWFkO1xudGFibGVzLmhoZWEgPSBoaGVhO1xudGFibGVzLmhtdHggPSBobXR4O1xudGFibGVzLm1heHAgPSBtYXhwO1xudGFibGVzLm5hbWUgPSBOYW1lVGFibGU7XG50YWJsZXNbJ09TLzInXSA9IE9TMjtcbnRhYmxlcy5wb3N0ID0gcG9zdDsgLy8gVHJ1ZVR5cGUgT3V0bGluZXNcbnRhYmxlcy5mcGdtID0gZnBnbTtcbnRhYmxlcy5sb2NhID0gbG9jYTtcbnRhYmxlcy5wcmVwID0gcHJlcDtcbnRhYmxlc1snY3Z0ICddID0gY3Z0O1xudGFibGVzLmdseWYgPSBnbHlmOyAvLyBQb3N0U2NyaXB0IE91dGxpbmVzXG50YWJsZXNbJ0NGRiAnXSA9IENGRkZvbnQ7XG50YWJsZXNbJ0NGRjInXSA9IENGRkZvbnQ7XG50YWJsZXMuVk9SRyA9IFZPUkc7IC8vIEJpdG1hcCBHbHlwaHNcbnRhYmxlcy5FQkxDID0gRUJMQztcbnRhYmxlcy5DQkxDID0gdGFibGVzLkVCTEM7XG50YWJsZXMuc2JpeCA9IHNiaXg7XG50YWJsZXMuQ09MUiA9IENPTFI7XG50YWJsZXMuQ1BBTCA9IENQQUw7IC8vIEFkdmFuY2VkIE9wZW5UeXBlIFRhYmxlc1xudGFibGVzLkJBU0UgPSBCQVNFO1xudGFibGVzLkdERUYgPSBHREVGO1xudGFibGVzLkdQT1MgPSBHUE9TO1xudGFibGVzLkdTVUIgPSBHU1VCO1xudGFibGVzLkpTVEYgPSBKU1RGOyAvLyBPcGVuVHlwZSB2YXJpYXRpb25zIHRhYmxlc1xudGFibGVzLkhWQVIgPSBIVkFSOyAvLyBPdGhlciBPcGVuVHlwZSBUYWJsZXNcbnRhYmxlcy5EU0lHID0gRFNJRztcbnRhYmxlcy5nYXNwID0gZ2FzcDtcbnRhYmxlcy5oZG14ID0gaGRteDtcbnRhYmxlcy5rZXJuID0ga2VybjtcbnRhYmxlcy5MVFNIID0gTFRTSDtcbnRhYmxlcy5QQ0xUID0gUENMVDtcbnRhYmxlcy5WRE1YID0gVkRNWDtcbnRhYmxlcy52aGVhID0gdmhlYTtcbnRhYmxlcy52bXR4ID0gdm10eDsgLy8gQXBwbGUgQWR2YW5jZWQgVHlwb2dyYXBoeSBUYWJsZXNcbnRhYmxlcy5hdmFyID0gYXZhcjtcbnRhYmxlcy5ic2xuID0gYnNsbjtcbnRhYmxlcy5mZWF0ID0gZmVhdDtcbnRhYmxlcy5mdmFyID0gZnZhcjtcbnRhYmxlcy5ndmFyID0gZ3ZhcjtcbnRhYmxlcy5qdXN0ID0ganVzdDtcbnRhYmxlcy5tb3J4ID0gbW9yeDtcbnRhYmxlcy5vcGJkID0gb3BiZDtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQzKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQzKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQzKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkMyhvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDMobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQzKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxudmFyIFRhYmxlRW50cnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICBjaGVja1N1bTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBvZmZzZXQ6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQzMiwgJ3ZvaWQnLCB7XG4gICAgdHlwZTogJ2dsb2JhbCdcbiAgfSksXG4gIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyXG59KTtcbnZhciBEaXJlY3RvcnkgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdGFnOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICBudW1UYWJsZXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgc2VhcmNoUmFuZ2U6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgZW50cnlTZWxlY3RvcjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICByYW5nZVNoaWZ0OiByZXN0cnVjdHVyZS51aW50MTYsXG4gIHRhYmxlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFRhYmxlRW50cnksICdudW1UYWJsZXMnKVxufSk7XG5cbkRpcmVjdG9yeS5wcm9jZXNzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGFibGVzID0ge307XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQzKHRoaXMudGFibGVzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICB2YXIgdGFibGUgPSBfc3RlcC52YWx1ZTtcbiAgICB0YWJsZXNbdGFibGUudGFnXSA9IHRhYmxlO1xuICB9XG5cbiAgdGhpcy50YWJsZXMgPSB0YWJsZXM7XG59O1xuXG5EaXJlY3RvcnkucHJlRW5jb2RlID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgdGFibGVzJDEgPSBbXTtcblxuICBmb3IgKHZhciB0YWcgaW4gdGhpcy50YWJsZXMpIHtcbiAgICB2YXIgdGFibGUgPSB0aGlzLnRhYmxlc1t0YWddO1xuXG4gICAgaWYgKHRhYmxlKSB7XG4gICAgICB0YWJsZXMkMS5wdXNoKHtcbiAgICAgICAgdGFnOiB0YWcsXG4gICAgICAgIGNoZWNrU3VtOiAwLFxuICAgICAgICBvZmZzZXQ6IG5ldyByZXN0cnVjdHVyZS5Wb2lkUG9pbnRlcih0YWJsZXNbdGFnXSwgdGFibGUpLFxuICAgICAgICBsZW5ndGg6IHRhYmxlc1t0YWddLnNpemUodGFibGUpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0aGlzLnRhZyA9ICd0cnVlJztcbiAgdGhpcy5udW1UYWJsZXMgPSB0YWJsZXMkMS5sZW5ndGg7XG4gIHRoaXMudGFibGVzID0gdGFibGVzJDE7XG4gIHZhciBtYXhFeHBvbmVudEZvcjIgPSBNYXRoLmZsb29yKE1hdGgubG9nKHRoaXMubnVtVGFibGVzKSAvIE1hdGguTE4yKTtcbiAgdmFyIG1heFBvd2VyT2YyID0gTWF0aC5wb3coMiwgbWF4RXhwb25lbnRGb3IyKTtcbiAgdGhpcy5zZWFyY2hSYW5nZSA9IG1heFBvd2VyT2YyICogMTY7XG4gIHRoaXMuZW50cnlTZWxlY3RvciA9IE1hdGgubG9nKG1heFBvd2VyT2YyKSAvIE1hdGguTE4yO1xuICB0aGlzLnJhbmdlU2hpZnQgPSB0aGlzLm51bVRhYmxlcyAqIDE2IC0gdGhpcy5zZWFyY2hSYW5nZTtcbn07XG5cbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaChhcnIsIGNtcCkge1xuICB2YXIgbWluID0gMDtcbiAgdmFyIG1heCA9IGFyci5sZW5ndGggLSAxO1xuXG4gIHdoaWxlIChtaW4gPD0gbWF4KSB7XG4gICAgdmFyIG1pZCA9IG1pbiArIG1heCA+PiAxO1xuICAgIHZhciByZXMgPSBjbXAoYXJyW21pZF0pO1xuXG4gICAgaWYgKHJlcyA8IDApIHtcbiAgICAgIG1heCA9IG1pZCAtIDE7XG4gICAgfSBlbHNlIGlmIChyZXMgPiAwKSB7XG4gICAgICBtaW4gPSBtaWQgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWlkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cbmZ1bmN0aW9uIHJhbmdlKGluZGV4LCBlbmQpIHtcbiAgdmFyIHJhbmdlID0gW107XG5cbiAgd2hpbGUgKGluZGV4IDwgZW5kKSB7XG4gICAgcmFuZ2UucHVzaChpbmRleCsrKTtcbiAgfVxuXG4gIHJldHVybiByYW5nZTtcbn1cblxudmFyIF9jbGFzcztcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ0KG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ0KG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ0KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkNChvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDQobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQ0KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHksIGRlY29yYXRvcnMsIGRlc2NyaXB0b3IsIGNvbnRleHQpIHsgdmFyIGRlc2MgPSB7fTsgT2JqZWN0LmtleXMoZGVzY3JpcHRvcikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IGRlc2Nba2V5XSA9IGRlc2NyaXB0b3Jba2V5XTsgfSk7IGRlc2MuZW51bWVyYWJsZSA9ICEhZGVzYy5lbnVtZXJhYmxlOyBkZXNjLmNvbmZpZ3VyYWJsZSA9ICEhZGVzYy5jb25maWd1cmFibGU7IGlmICgndmFsdWUnIGluIGRlc2MgfHwgZGVzYy5pbml0aWFsaXplcikgeyBkZXNjLndyaXRhYmxlID0gdHJ1ZTsgfSBkZXNjID0gZGVjb3JhdG9ycy5zbGljZSgpLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGRlc2MsIGRlY29yYXRvcikgeyByZXR1cm4gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHksIGRlc2MpIHx8IGRlc2M7IH0sIGRlc2MpOyBpZiAoY29udGV4dCAmJiBkZXNjLmluaXRpYWxpemVyICE9PSB2b2lkIDApIHsgZGVzYy52YWx1ZSA9IGRlc2MuaW5pdGlhbGl6ZXIgPyBkZXNjLmluaXRpYWxpemVyLmNhbGwoY29udGV4dCkgOiB2b2lkIDA7IGRlc2MuaW5pdGlhbGl6ZXIgPSB1bmRlZmluZWQ7IH0gaWYgKGRlc2MuaW5pdGlhbGl6ZXIgPT09IHZvaWQgMCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYyk7IGRlc2MgPSBudWxsOyB9IHJldHVybiBkZXNjOyB9XG52YXIgQ21hcFByb2Nlc3NvciA9IChfY2xhc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDbWFwUHJvY2Vzc29yKGNtYXBUYWJsZSkge1xuICAgIC8vIEF0dGVtcHQgdG8gZmluZCBhIFVuaWNvZGUgY21hcCBmaXJzdFxuICAgIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICAgIHRoaXMuY21hcCA9IHRoaXMuZmluZFN1YnRhYmxlKGNtYXBUYWJsZSwgWy8vIDMyLWJpdCBzdWJ0YWJsZXNcbiAgICBbMywgMTBdLCBbMCwgNl0sIFswLCA0XSwgLy8gMTYtYml0IHN1YnRhYmxlc1xuICAgIFszLCAxXSwgWzAsIDNdLCBbMCwgMl0sIFswLCAxXSwgWzAsIDBdXSk7IC8vIElmIG5vdCB1bmljb2RlIGNtYXAgd2FzIGZvdW5kLCBhbmQgaWNvbnYtbGl0ZSBpcyBpbnN0YWxsZWQsXG4gICAgLy8gdGFrZSB0aGUgZmlyc3QgdGFibGUgd2l0aCBhIHN1cHBvcnRlZCBlbmNvZGluZy5cblxuICAgIGlmICghdGhpcy5jbWFwICYmIGxpYikge1xuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ0KGNtYXBUYWJsZS50YWJsZXMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgICB2YXIgY21hcCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICB2YXIgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyhjbWFwLnBsYXRmb3JtSUQsIGNtYXAuZW5jb2RpbmdJRCwgY21hcC50YWJsZS5sYW5ndWFnZSAtIDEpO1xuXG4gICAgICAgIGlmIChsaWIuZW5jb2RpbmdFeGlzdHMoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgdGhpcy5jbWFwID0gY21hcC50YWJsZTtcbiAgICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY21hcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgYSBzdXBwb3J0ZWQgY21hcCB0YWJsZVwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnV2cyA9IHRoaXMuZmluZFN1YnRhYmxlKGNtYXBUYWJsZSwgW1swLCA1XV0pO1xuXG4gICAgaWYgKHRoaXMudXZzICYmIHRoaXMudXZzLnZlcnNpb24gIT09IDE0KSB7XG4gICAgICB0aGlzLnV2cyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIF9wcm90byA9IENtYXBQcm9jZXNzb3IucHJvdG90eXBlO1xuXG4gIF9wcm90by5maW5kU3VidGFibGUgPSBmdW5jdGlvbiBmaW5kU3VidGFibGUoY21hcFRhYmxlLCBwYWlycykge1xuICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDQocGFpcnMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgdmFyIF9zdGVwMiR2YWx1ZSA9IF9zdGVwMi52YWx1ZSxcbiAgICAgICAgICBwbGF0Zm9ybUlEID0gX3N0ZXAyJHZhbHVlWzBdLFxuICAgICAgICAgIGVuY29kaW5nSUQgPSBfc3RlcDIkdmFsdWVbMV07XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDQoY21hcFRhYmxlLnRhYmxlcyksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBjbWFwID0gX3N0ZXAzLnZhbHVlO1xuXG4gICAgICAgIGlmIChjbWFwLnBsYXRmb3JtSUQgPT09IHBsYXRmb3JtSUQgJiYgY21hcC5lbmNvZGluZ0lEID09PSBlbmNvZGluZ0lEKSB7XG4gICAgICAgICAgcmV0dXJuIGNtYXAudGFibGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBfcHJvdG8ubG9va3VwID0gZnVuY3Rpb24gbG9va3VwKGNvZGVwb2ludCwgdmFyaWF0aW9uU2VsZWN0b3IpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBVbmljb2RlIGNtYXAgaW4gdGhpcyBmb250LCB3ZSBuZWVkIHRvIHJlLWVuY29kZVxuICAgIC8vIHRoZSBjb2RlcG9pbnQgaW4gdGhlIGVuY29kaW5nIHRoYXQgdGhlIGNtYXAgc3VwcG9ydHMuXG4gICAgaWYgKHRoaXMuZW5jb2RpbmcpIHtcbiAgICAgIHZhciBidWYgPSBsaWIuZW5jb2RlKFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVwb2ludCksIHRoaXMuZW5jb2RpbmcpO1xuICAgICAgY29kZXBvaW50ID0gMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29kZXBvaW50ID0gY29kZXBvaW50IDw8IDggfCBidWZbaV07XG4gICAgICB9IC8vIE90aGVyd2lzZSwgdHJ5IHRvIGdldCBhIFVuaWNvZGUgdmFyaWF0aW9uIHNlbGVjdG9yIGZvciB0aGlzIGNvZGVwb2ludCBpZiBvbmUgaXMgcHJvdmlkZWQuXG5cbiAgICB9IGVsc2UgaWYgKHZhcmlhdGlvblNlbGVjdG9yKSB7XG4gICAgICB2YXIgZ2lkID0gdGhpcy5nZXRWYXJpYXRpb25TZWxlY3Rvcihjb2RlcG9pbnQsIHZhcmlhdGlvblNlbGVjdG9yKTtcblxuICAgICAgaWYgKGdpZCkge1xuICAgICAgICByZXR1cm4gZ2lkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjbWFwID0gdGhpcy5jbWFwO1xuXG4gICAgc3dpdGNoIChjbWFwLnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIGNtYXAuY29kZU1hcC5nZXQoY29kZXBvaW50KSB8fCAwO1xuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbWluID0gMDtcbiAgICAgICAgICB2YXIgbWF4ID0gY21hcC5zZWdDb3VudCAtIDE7XG5cbiAgICAgICAgICB3aGlsZSAobWluIDw9IG1heCkge1xuICAgICAgICAgICAgdmFyIG1pZCA9IG1pbiArIG1heCA+PiAxO1xuXG4gICAgICAgICAgICBpZiAoY29kZXBvaW50IDwgY21hcC5zdGFydENvZGUuZ2V0KG1pZCkpIHtcbiAgICAgICAgICAgICAgbWF4ID0gbWlkIC0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZXBvaW50ID4gY21hcC5lbmRDb2RlLmdldChtaWQpKSB7XG4gICAgICAgICAgICAgIG1pbiA9IG1pZCArIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgcmFuZ2VPZmZzZXQgPSBjbWFwLmlkUmFuZ2VPZmZzZXQuZ2V0KG1pZCk7XG5cbiAgICAgICAgICAgICAgdmFyIF9naWQgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgICAgaWYgKHJhbmdlT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgX2dpZCA9IGNvZGVwb2ludCArIGNtYXAuaWREZWx0YS5nZXQobWlkKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSByYW5nZU9mZnNldCAvIDIgKyAoY29kZXBvaW50IC0gY21hcC5zdGFydENvZGUuZ2V0KG1pZCkpIC0gKGNtYXAuc2VnQ291bnQgLSBtaWQpO1xuICAgICAgICAgICAgICAgIF9naWQgPSBjbWFwLmdseXBoSW5kZXhBcnJheS5nZXQoaW5kZXgpIHx8IDA7XG5cbiAgICAgICAgICAgICAgICBpZiAoX2dpZCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgX2dpZCArPSBjbWFwLmlkRGVsdGEuZ2V0KG1pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIF9naWQgJiAweGZmZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA4OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE86IGNtYXAgZm9ybWF0IDgnKTtcblxuICAgICAgY2FzZSA2OlxuICAgICAgY2FzZSAxMDpcbiAgICAgICAgcmV0dXJuIGNtYXAuZ2x5cGhJbmRpY2VzLmdldChjb2RlcG9pbnQgLSBjbWFwLmZpcnN0Q29kZSkgfHwgMDtcblxuICAgICAgY2FzZSAxMjpcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX21pbiA9IDA7XG5cbiAgICAgICAgICB2YXIgX21heCA9IGNtYXAubkdyb3VwcyAtIDE7XG5cbiAgICAgICAgICB3aGlsZSAoX21pbiA8PSBfbWF4KSB7XG4gICAgICAgICAgICB2YXIgX21pZCA9IF9taW4gKyBfbWF4ID4+IDE7XG5cbiAgICAgICAgICAgIHZhciBncm91cCA9IGNtYXAuZ3JvdXBzLmdldChfbWlkKTtcblxuICAgICAgICAgICAgaWYgKGNvZGVwb2ludCA8IGdyb3VwLnN0YXJ0Q2hhckNvZGUpIHtcbiAgICAgICAgICAgICAgX21heCA9IF9taWQgLSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlcG9pbnQgPiBncm91cC5lbmRDaGFyQ29kZSkge1xuICAgICAgICAgICAgICBfbWluID0gX21pZCArIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoY21hcC52ZXJzaW9uID09PSAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBncm91cC5nbHlwaElEICsgKGNvZGVwb2ludCAtIGdyb3VwLnN0YXJ0Q2hhckNvZGUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBncm91cC5nbHlwaElEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAxNDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPOiBjbWFwIGZvcm1hdCAxNCcpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNtYXAgZm9ybWF0IFwiICsgY21hcC52ZXJzaW9uKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmdldFZhcmlhdGlvblNlbGVjdG9yID0gZnVuY3Rpb24gZ2V0VmFyaWF0aW9uU2VsZWN0b3IoY29kZXBvaW50LCB2YXJpYXRpb25TZWxlY3Rvcikge1xuICAgIGlmICghdGhpcy51dnMpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHZhciBzZWxlY3RvcnMgPSB0aGlzLnV2cy52YXJTZWxlY3RvcnMudG9BcnJheSgpO1xuICAgIHZhciBpID0gYmluYXJ5U2VhcmNoKHNlbGVjdG9ycywgZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiB2YXJpYXRpb25TZWxlY3RvciAtIHgudmFyU2VsZWN0b3I7XG4gICAgfSk7XG4gICAgdmFyIHNlbCA9IHNlbGVjdG9yc1tpXTtcblxuICAgIGlmIChpICE9PSAtMSAmJiBzZWwuZGVmYXVsdFVWUykge1xuICAgICAgaSA9IGJpbmFyeVNlYXJjaChzZWwuZGVmYXVsdFVWUywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIGNvZGVwb2ludCA8IHguc3RhcnRVbmljb2RlVmFsdWUgPyAtMSA6IGNvZGVwb2ludCA+IHguc3RhcnRVbmljb2RlVmFsdWUgKyB4LmFkZGl0aW9uYWxDb3VudCA/ICsxIDogMDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpICE9PSAtMSAmJiBzZWwubm9uRGVmYXVsdFVWUykge1xuICAgICAgaSA9IGJpbmFyeVNlYXJjaChzZWwubm9uRGVmYXVsdFVWUywgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIGNvZGVwb2ludCAtIHgudW5pY29kZVZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gc2VsLm5vbkRlZmF1bHRVVlNbaV0uZ2x5cGhJRDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfTtcblxuICBfcHJvdG8uZ2V0Q2hhcmFjdGVyU2V0ID0gZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyU2V0KCkge1xuICAgIHZhciBjbWFwID0gdGhpcy5jbWFwO1xuXG4gICAgc3dpdGNoIChjbWFwLnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIHJhbmdlKDAsIGNtYXAuY29kZU1hcC5sZW5ndGgpO1xuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgICAgdmFyIGVuZENvZGVzID0gY21hcC5lbmRDb2RlLnRvQXJyYXkoKTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5kQ29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0YWlsID0gZW5kQ29kZXNbaV0gKyAxO1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gY21hcC5zdGFydENvZGUuZ2V0KGkpO1xuICAgICAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCByYW5nZShzdGFydCwgdGFpbCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA4OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE86IGNtYXAgZm9ybWF0IDgnKTtcblxuICAgICAgY2FzZSA2OlxuICAgICAgY2FzZSAxMDpcbiAgICAgICAgcmV0dXJuIHJhbmdlKGNtYXAuZmlyc3RDb2RlLCBjbWFwLmZpcnN0Q29kZSArIGNtYXAuZ2x5cGhJbmRpY2VzLmxlbmd0aCk7XG5cbiAgICAgIGNhc2UgMTI6XG4gICAgICBjYXNlIDEzOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9yZXMgPSBbXTtcblxuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDQoY21hcC5ncm91cHMudG9BcnJheSgpKSwgX3N0ZXA0OyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQoKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBncm91cCA9IF9zdGVwNC52YWx1ZTtcblxuICAgICAgICAgICAgX3Jlcy5wdXNoLmFwcGx5KF9yZXMsIHJhbmdlKGdyb3VwLnN0YXJ0Q2hhckNvZGUsIGdyb3VwLmVuZENoYXJDb2RlICsgMSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfcmVzO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgMTQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVE9ETzogY21hcCBmb3JtYXQgMTQnKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBjbWFwIGZvcm1hdCBcIiArIGNtYXAudmVyc2lvbik7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jb2RlUG9pbnRzRm9yR2x5cGggPSBmdW5jdGlvbiBjb2RlUG9pbnRzRm9yR2x5cGgoZ2lkKSB7XG4gICAgdmFyIGNtYXAgPSB0aGlzLmNtYXA7XG5cbiAgICBzd2l0Y2ggKGNtYXAudmVyc2lvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHJlcyA9IFtdO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNtYXAuY29kZU1hcC5nZXQoaSkgPT09IGdpZCkge1xuICAgICAgICAgICAgICByZXMucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfcmVzMiA9IFtdO1xuXG4gICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGNtYXAuc2VnQ291bnQ7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBlbmQgPSBjbWFwLmVuZENvZGUuZ2V0KF9pKTtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGNtYXAuc3RhcnRDb2RlLmdldChfaSk7XG4gICAgICAgICAgICB2YXIgcmFuZ2VPZmZzZXQgPSBjbWFwLmlkUmFuZ2VPZmZzZXQuZ2V0KF9pKTtcbiAgICAgICAgICAgIHZhciBkZWx0YSA9IGNtYXAuaWREZWx0YS5nZXQoX2kpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBjID0gc3RhcnQ7IGMgPD0gZW5kOyBjKyspIHtcbiAgICAgICAgICAgICAgdmFyIGcgPSAwO1xuXG4gICAgICAgICAgICAgIGlmIChyYW5nZU9mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGcgPSBjICsgZGVsdGE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gcmFuZ2VPZmZzZXQgLyAyICsgKGMgLSBzdGFydCkgLSAoY21hcC5zZWdDb3VudCAtIF9pKTtcbiAgICAgICAgICAgICAgICBnID0gY21hcC5nbHlwaEluZGV4QXJyYXkuZ2V0KGluZGV4KSB8fCAwO1xuXG4gICAgICAgICAgICAgICAgaWYgKGcgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgIGcgKz0gZGVsdGE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGcgPT09IGdpZCkge1xuICAgICAgICAgICAgICAgIF9yZXMyLnB1c2goYyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX3JlczI7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAxMjpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfcmVzMyA9IFtdO1xuXG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yNSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNChjbWFwLmdyb3Vwcy50b0FycmF5KCkpLCBfc3RlcDU7ICEoX3N0ZXA1ID0gX2l0ZXJhdG9yNSgpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gX3N0ZXA1LnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoZ2lkID49IGdyb3VwLmdseXBoSUQgJiYgZ2lkIDw9IGdyb3VwLmdseXBoSUQgKyAoZ3JvdXAuZW5kQ2hhckNvZGUgLSBncm91cC5zdGFydENoYXJDb2RlKSkge1xuICAgICAgICAgICAgICBfcmVzMy5wdXNoKGdyb3VwLnN0YXJ0Q2hhckNvZGUgKyAoZ2lkIC0gZ3JvdXAuZ2x5cGhJRCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfcmVzMztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDEzOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9yZXM0ID0gW107XG5cbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I2ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ0KGNtYXAuZ3JvdXBzLnRvQXJyYXkoKSksIF9zdGVwNjsgIShfc3RlcDYgPSBfaXRlcmF0b3I2KCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgX2dyb3VwID0gX3N0ZXA2LnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoZ2lkID09PSBfZ3JvdXAuZ2x5cGhJRCkge1xuICAgICAgICAgICAgICBfcmVzNC5wdXNoLmFwcGx5KF9yZXM0LCByYW5nZShfZ3JvdXAuc3RhcnRDaGFyQ29kZSwgX2dyb3VwLmVuZENoYXJDb2RlICsgMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBfcmVzNDtcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNtYXAgZm9ybWF0IFwiICsgY21hcC52ZXJzaW9uKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIENtYXBQcm9jZXNzb3I7XG59KCksIChfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzcy5wcm90b3R5cGUsIFwiZ2V0Q2hhcmFjdGVyU2V0XCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzLnByb3RvdHlwZSwgXCJnZXRDaGFyYWN0ZXJTZXRcIiksIF9jbGFzcy5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzcy5wcm90b3R5cGUsIFwiY29kZVBvaW50c0ZvckdseXBoXCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzLnByb3RvdHlwZSwgXCJjb2RlUG9pbnRzRm9yR2x5cGhcIiksIF9jbGFzcy5wcm90b3R5cGUpKSwgX2NsYXNzKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ1KG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ1KG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ1KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkNShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDUobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQ1KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgS2VyblByb2Nlc3NvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEtlcm5Qcm9jZXNzb3IoZm9udCkge1xuICAgIHRoaXMua2VybiA9IGZvbnQua2VybjtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBLZXJuUHJvY2Vzc29yLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucHJvY2VzcyA9IGZ1bmN0aW9uIHByb2Nlc3MoZ2x5cGhzLCBwb3NpdGlvbnMpIHtcbiAgICBmb3IgKHZhciBnbHlwaEluZGV4ID0gMDsgZ2x5cGhJbmRleCA8IGdseXBocy5sZW5ndGggLSAxOyBnbHlwaEluZGV4KyspIHtcbiAgICAgIHZhciBsZWZ0ID0gZ2x5cGhzW2dseXBoSW5kZXhdLmlkO1xuICAgICAgdmFyIHJpZ2h0ID0gZ2x5cGhzW2dseXBoSW5kZXggKyAxXS5pZDtcbiAgICAgIHBvc2l0aW9uc1tnbHlwaEluZGV4XS54QWR2YW5jZSArPSB0aGlzLmdldEtlcm5pbmcobGVmdCwgcmlnaHQpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZ2V0S2VybmluZyA9IGZ1bmN0aW9uIGdldEtlcm5pbmcobGVmdCwgcmlnaHQpIHtcbiAgICB2YXIgcmVzID0gMDtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNSh0aGlzLmtlcm4udGFibGVzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciB0YWJsZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICBpZiAodGFibGUuY292ZXJhZ2UuY3Jvc3NTdHJlYW0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodGFibGUudmVyc2lvbikge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgaWYgKCF0YWJsZS5jb3ZlcmFnZS5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKHRhYmxlLmNvdmVyYWdlLnZlcnRpY2FsIHx8IHRhYmxlLmNvdmVyYWdlLnZhcmlhdGlvbikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBrZXJuaW5nIHRhYmxlIHZlcnNpb24gXCIgKyB0YWJsZS52ZXJzaW9uKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbCA9IDA7XG4gICAgICB2YXIgcyA9IHRhYmxlLnN1YnRhYmxlO1xuXG4gICAgICBzd2l0Y2ggKHRhYmxlLmZvcm1hdCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgdmFyIHBhaXJJZHggPSBiaW5hcnlTZWFyY2gocy5wYWlycywgZnVuY3Rpb24gKHBhaXIpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWZ0IC0gcGFpci5sZWZ0IHx8IHJpZ2h0IC0gcGFpci5yaWdodDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChwYWlySWR4ID49IDApIHtcbiAgICAgICAgICAgIHZhbCA9IHMucGFpcnNbcGFpcklkeF0udmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHZhciBsZWZ0T2Zmc2V0ID0gMCxcbiAgICAgICAgICAgICAgcmlnaHRPZmZzZXQgPSAwO1xuXG4gICAgICAgICAgaWYgKGxlZnQgPj0gcy5sZWZ0VGFibGUuZmlyc3RHbHlwaCAmJiBsZWZ0IDwgcy5sZWZ0VGFibGUuZmlyc3RHbHlwaCArIHMubGVmdFRhYmxlLm5HbHlwaHMpIHtcbiAgICAgICAgICAgIGxlZnRPZmZzZXQgPSBzLmxlZnRUYWJsZS5vZmZzZXRzW2xlZnQgLSBzLmxlZnRUYWJsZS5maXJzdEdseXBoXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGVmdE9mZnNldCA9IHMuYXJyYXkub2ZmO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyaWdodCA+PSBzLnJpZ2h0VGFibGUuZmlyc3RHbHlwaCAmJiByaWdodCA8IHMucmlnaHRUYWJsZS5maXJzdEdseXBoICsgcy5yaWdodFRhYmxlLm5HbHlwaHMpIHtcbiAgICAgICAgICAgIHJpZ2h0T2Zmc2V0ID0gcy5yaWdodFRhYmxlLm9mZnNldHNbcmlnaHQgLSBzLnJpZ2h0VGFibGUuZmlyc3RHbHlwaF07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGluZGV4ID0gKGxlZnRPZmZzZXQgKyByaWdodE9mZnNldCAtIHMuYXJyYXkub2ZmKSAvIDI7XG4gICAgICAgICAgdmFsID0gcy5hcnJheS52YWx1ZXMuZ2V0KGluZGV4KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgaWYgKGxlZnQgPj0gcy5nbHlwaENvdW50IHx8IHJpZ2h0ID49IHMuZ2x5cGhDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFsID0gcy5rZXJuVmFsdWVbcy5rZXJuSW5kZXhbcy5sZWZ0Q2xhc3NbbGVmdF0gKiBzLnJpZ2h0Q2xhc3NDb3VudCArIHMucmlnaHRDbGFzc1tyaWdodF1dXTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGtlcm5pbmcgc3ViLXRhYmxlIGZvcm1hdCBcIiArIHRhYmxlLmZvcm1hdCk7XG4gICAgICB9IC8vIE1pY3Jvc29mdCBzdXBwb3J0cyB0aGUgb3ZlcnJpZGUgZmxhZywgd2hpY2ggcmVzZXRzIHRoZSByZXN1bHRcbiAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHN1bSBvZiB0aGUgcmVzdWx0cyBmcm9tIGFsbCBzdWJ0YWJsZXMgaXMgcmV0dXJuZWRcblxuXG4gICAgICBpZiAodGFibGUuY292ZXJhZ2Uub3ZlcnJpZGUpIHtcbiAgICAgICAgcmVzID0gdmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzICs9IHZhbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIHJldHVybiBLZXJuUHJvY2Vzc29yO1xufSgpO1xuXG52YXIgVElORl9PSyA9IDA7XG52YXIgVElORl9EQVRBX0VSUk9SID0gLTM7XG5cbmZ1bmN0aW9uIFRyZWUoKSB7XG4gIHRoaXMudGFibGUgPSBuZXcgVWludDE2QXJyYXkoMTYpO1xuICAvKiB0YWJsZSBvZiBjb2RlIGxlbmd0aCBjb3VudHMgKi9cblxuICB0aGlzLnRyYW5zID0gbmV3IFVpbnQxNkFycmF5KDI4OCk7XG4gIC8qIGNvZGUgLT4gc3ltYm9sIHRyYW5zbGF0aW9uIHRhYmxlICovXG59XG5cbmZ1bmN0aW9uIERhdGEoc291cmNlLCBkZXN0KSB7XG4gIHRoaXMuc291cmNlID0gc291cmNlO1xuICB0aGlzLnNvdXJjZUluZGV4ID0gMDtcbiAgdGhpcy50YWcgPSAwO1xuICB0aGlzLmJpdGNvdW50ID0gMDtcbiAgdGhpcy5kZXN0ID0gZGVzdDtcbiAgdGhpcy5kZXN0TGVuID0gMDtcbiAgdGhpcy5sdHJlZSA9IG5ldyBUcmVlKCk7XG4gIC8qIGR5bmFtaWMgbGVuZ3RoL3N5bWJvbCB0cmVlICovXG5cbiAgdGhpcy5kdHJlZSA9IG5ldyBUcmVlKCk7XG4gIC8qIGR5bmFtaWMgZGlzdGFuY2UgdHJlZSAqL1xufVxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIHVuaW5pdGlhbGl6ZWQgZ2xvYmFsIGRhdGEgKHN0YXRpYyBzdHJ1Y3R1cmVzKSAtLSAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXG52YXIgc2x0cmVlID0gbmV3IFRyZWUoKTtcbnZhciBzZHRyZWUgPSBuZXcgVHJlZSgpO1xuLyogZXh0cmEgYml0cyBhbmQgYmFzZSB0YWJsZXMgZm9yIGxlbmd0aCBjb2RlcyAqL1xuXG52YXIgbGVuZ3RoX2JpdHMgPSBuZXcgVWludDhBcnJheSgzMCk7XG52YXIgbGVuZ3RoX2Jhc2UgPSBuZXcgVWludDE2QXJyYXkoMzApO1xuLyogZXh0cmEgYml0cyBhbmQgYmFzZSB0YWJsZXMgZm9yIGRpc3RhbmNlIGNvZGVzICovXG5cbnZhciBkaXN0X2JpdHMgPSBuZXcgVWludDhBcnJheSgzMCk7XG52YXIgZGlzdF9iYXNlID0gbmV3IFVpbnQxNkFycmF5KDMwKTtcbi8qIHNwZWNpYWwgb3JkZXJpbmcgb2YgY29kZSBsZW5ndGggY29kZXMgKi9cblxudmFyIGNsY2lkeCA9IG5ldyBVaW50OEFycmF5KFsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1XSk7XG4vKiB1c2VkIGJ5IHRpbmZfZGVjb2RlX3RyZWVzLCBhdm9pZHMgYWxsb2NhdGlvbnMgZXZlcnkgY2FsbCAqL1xuXG52YXIgY29kZV90cmVlID0gbmV3IFRyZWUoKTtcbnZhciBsZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoMjg4ICsgMzIpO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKlxuICogLS0gdXRpbGl0eSBmdW5jdGlvbnMgLS0gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogYnVpbGQgZXh0cmEgYml0cyBhbmQgYmFzZSB0YWJsZXMgKi9cblxuZnVuY3Rpb24gdGluZl9idWlsZF9iaXRzX2Jhc2UoYml0cywgYmFzZSwgZGVsdGEsIGZpcnN0KSB7XG4gIHZhciBpLCBzdW07XG4gIC8qIGJ1aWxkIGJpdHMgdGFibGUgKi9cblxuICBmb3IgKGkgPSAwOyBpIDwgZGVsdGE7ICsraSkge1xuICAgIGJpdHNbaV0gPSAwO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IDMwIC0gZGVsdGE7ICsraSkge1xuICAgIGJpdHNbaSArIGRlbHRhXSA9IGkgLyBkZWx0YSB8IDA7XG4gIH1cbiAgLyogYnVpbGQgYmFzZSB0YWJsZSAqL1xuXG5cbiAgZm9yIChzdW0gPSBmaXJzdCwgaSA9IDA7IGkgPCAzMDsgKytpKSB7XG4gICAgYmFzZVtpXSA9IHN1bTtcbiAgICBzdW0gKz0gMSA8PCBiaXRzW2ldO1xuICB9XG59XG4vKiBidWlsZCB0aGUgZml4ZWQgaHVmZm1hbiB0cmVlcyAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfYnVpbGRfZml4ZWRfdHJlZXMobHQsIGR0KSB7XG4gIHZhciBpO1xuICAvKiBidWlsZCBmaXhlZCBsZW5ndGggdHJlZSAqL1xuXG4gIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICBsdC50YWJsZVtpXSA9IDA7XG4gIH1cblxuICBsdC50YWJsZVs3XSA9IDI0O1xuICBsdC50YWJsZVs4XSA9IDE1MjtcbiAgbHQudGFibGVbOV0gPSAxMTI7XG5cbiAgZm9yIChpID0gMDsgaSA8IDI0OyArK2kpIHtcbiAgICBsdC50cmFuc1tpXSA9IDI1NiArIGk7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgMTQ0OyArK2kpIHtcbiAgICBsdC50cmFuc1syNCArIGldID0gaTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHtcbiAgICBsdC50cmFuc1syNCArIDE0NCArIGldID0gMjgwICsgaTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCAxMTI7ICsraSkge1xuICAgIGx0LnRyYW5zWzI0ICsgMTQ0ICsgOCArIGldID0gMTQ0ICsgaTtcbiAgfVxuICAvKiBidWlsZCBmaXhlZCBkaXN0YW5jZSB0cmVlICovXG5cblxuICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7XG4gICAgZHQudGFibGVbaV0gPSAwO1xuICB9XG5cbiAgZHQudGFibGVbNV0gPSAzMjtcblxuICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkge1xuICAgIGR0LnRyYW5zW2ldID0gaTtcbiAgfVxufVxuLyogZ2l2ZW4gYW4gYXJyYXkgb2YgY29kZSBsZW5ndGhzLCBidWlsZCBhIHRyZWUgKi9cblxuXG52YXIgb2ZmcyA9IG5ldyBVaW50MTZBcnJheSgxNik7XG5cbmZ1bmN0aW9uIHRpbmZfYnVpbGRfdHJlZSh0LCBsZW5ndGhzLCBvZmYsIG51bSkge1xuICB2YXIgaSwgc3VtO1xuICAvKiBjbGVhciBjb2RlIGxlbmd0aCBjb3VudCB0YWJsZSAqL1xuXG4gIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgdC50YWJsZVtpXSA9IDA7XG4gIH1cbiAgLyogc2NhbiBzeW1ib2wgbGVuZ3RocywgYW5kIHN1bSBjb2RlIGxlbmd0aCBjb3VudHMgKi9cblxuXG4gIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkge1xuICAgIHQudGFibGVbbGVuZ3Roc1tvZmYgKyBpXV0rKztcbiAgfVxuXG4gIHQudGFibGVbMF0gPSAwO1xuICAvKiBjb21wdXRlIG9mZnNldCB0YWJsZSBmb3IgZGlzdHJpYnV0aW9uIHNvcnQgKi9cblxuICBmb3IgKHN1bSA9IDAsIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgIG9mZnNbaV0gPSBzdW07XG4gICAgc3VtICs9IHQudGFibGVbaV07XG4gIH1cbiAgLyogY3JlYXRlIGNvZGUtPnN5bWJvbCB0cmFuc2xhdGlvbiB0YWJsZSAoc3ltYm9scyBzb3J0ZWQgYnkgY29kZSkgKi9cblxuXG4gIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkge1xuICAgIGlmIChsZW5ndGhzW29mZiArIGldKSB0LnRyYW5zW29mZnNbbGVuZ3Roc1tvZmYgKyBpXV0rK10gPSBpO1xuICB9XG59XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIGRlY29kZSBmdW5jdGlvbnMgLS0gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiBnZXQgb25lIGJpdCBmcm9tIHNvdXJjZSBzdHJlYW0gKi9cblxuXG5mdW5jdGlvbiB0aW5mX2dldGJpdChkKSB7XG4gIC8qIGNoZWNrIGlmIHRhZyBpcyBlbXB0eSAqL1xuICBpZiAoIWQuYml0Y291bnQtLSkge1xuICAgIC8qIGxvYWQgbmV4dCB0YWcgKi9cbiAgICBkLnRhZyA9IGQuc291cmNlW2Quc291cmNlSW5kZXgrK107XG4gICAgZC5iaXRjb3VudCA9IDc7XG4gIH1cbiAgLyogc2hpZnQgYml0IG91dCBvZiB0YWcgKi9cblxuXG4gIHZhciBiaXQgPSBkLnRhZyAmIDE7XG4gIGQudGFnID4+Pj0gMTtcbiAgcmV0dXJuIGJpdDtcbn1cbi8qIHJlYWQgYSBudW0gYml0IHZhbHVlIGZyb20gYSBzdHJlYW0gYW5kIGFkZCBiYXNlICovXG5cblxuZnVuY3Rpb24gdGluZl9yZWFkX2JpdHMoZCwgbnVtLCBiYXNlKSB7XG4gIGlmICghbnVtKSByZXR1cm4gYmFzZTtcblxuICB3aGlsZSAoZC5iaXRjb3VudCA8IDI0KSB7XG4gICAgZC50YWcgfD0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCsrXSA8PCBkLmJpdGNvdW50O1xuICAgIGQuYml0Y291bnQgKz0gODtcbiAgfVxuXG4gIHZhciB2YWwgPSBkLnRhZyAmIDB4ZmZmZiA+Pj4gMTYgLSBudW07XG4gIGQudGFnID4+Pj0gbnVtO1xuICBkLmJpdGNvdW50IC09IG51bTtcbiAgcmV0dXJuIHZhbCArIGJhc2U7XG59XG4vKiBnaXZlbiBhIGRhdGEgc3RyZWFtIGFuZCBhIHRyZWUsIGRlY29kZSBhIHN5bWJvbCAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfZGVjb2RlX3N5bWJvbChkLCB0KSB7XG4gIHdoaWxlIChkLmJpdGNvdW50IDwgMjQpIHtcbiAgICBkLnRhZyB8PSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4KytdIDw8IGQuYml0Y291bnQ7XG4gICAgZC5iaXRjb3VudCArPSA4O1xuICB9XG5cbiAgdmFyIHN1bSA9IDAsXG4gICAgICBjdXIgPSAwLFxuICAgICAgbGVuID0gMDtcbiAgdmFyIHRhZyA9IGQudGFnO1xuICAvKiBnZXQgbW9yZSBiaXRzIHdoaWxlIGNvZGUgdmFsdWUgaXMgYWJvdmUgc3VtICovXG5cbiAgZG8ge1xuICAgIGN1ciA9IDIgKiBjdXIgKyAodGFnICYgMSk7XG4gICAgdGFnID4+Pj0gMTtcbiAgICArK2xlbjtcbiAgICBzdW0gKz0gdC50YWJsZVtsZW5dO1xuICAgIGN1ciAtPSB0LnRhYmxlW2xlbl07XG4gIH0gd2hpbGUgKGN1ciA+PSAwKTtcblxuICBkLnRhZyA9IHRhZztcbiAgZC5iaXRjb3VudCAtPSBsZW47XG4gIHJldHVybiB0LnRyYW5zW3N1bSArIGN1cl07XG59XG4vKiBnaXZlbiBhIGRhdGEgc3RyZWFtLCBkZWNvZGUgZHluYW1pYyB0cmVlcyBmcm9tIGl0ICovXG5cblxuZnVuY3Rpb24gdGluZl9kZWNvZGVfdHJlZXMoZCwgbHQsIGR0KSB7XG4gIHZhciBobGl0LCBoZGlzdCwgaGNsZW47XG4gIHZhciBpLCBudW0sIGxlbmd0aDtcbiAgLyogZ2V0IDUgYml0cyBITElUICgyNTctMjg2KSAqL1xuXG4gIGhsaXQgPSB0aW5mX3JlYWRfYml0cyhkLCA1LCAyNTcpO1xuICAvKiBnZXQgNSBiaXRzIEhESVNUICgxLTMyKSAqL1xuXG4gIGhkaXN0ID0gdGluZl9yZWFkX2JpdHMoZCwgNSwgMSk7XG4gIC8qIGdldCA0IGJpdHMgSENMRU4gKDQtMTkpICovXG5cbiAgaGNsZW4gPSB0aW5mX3JlYWRfYml0cyhkLCA0LCA0KTtcblxuICBmb3IgKGkgPSAwOyBpIDwgMTk7ICsraSkge1xuICAgIGxlbmd0aHNbaV0gPSAwO1xuICB9XG4gIC8qIHJlYWQgY29kZSBsZW5ndGhzIGZvciBjb2RlIGxlbmd0aCBhbHBoYWJldCAqL1xuXG5cbiAgZm9yIChpID0gMDsgaSA8IGhjbGVuOyArK2kpIHtcbiAgICAvKiBnZXQgMyBiaXRzIGNvZGUgbGVuZ3RoICgwLTcpICovXG4gICAgdmFyIGNsZW4gPSB0aW5mX3JlYWRfYml0cyhkLCAzLCAwKTtcbiAgICBsZW5ndGhzW2NsY2lkeFtpXV0gPSBjbGVuO1xuICB9XG4gIC8qIGJ1aWxkIGNvZGUgbGVuZ3RoIHRyZWUgKi9cblxuXG4gIHRpbmZfYnVpbGRfdHJlZShjb2RlX3RyZWUsIGxlbmd0aHMsIDAsIDE5KTtcbiAgLyogZGVjb2RlIGNvZGUgbGVuZ3RocyBmb3IgdGhlIGR5bmFtaWMgdHJlZXMgKi9cblxuICBmb3IgKG51bSA9IDA7IG51bSA8IGhsaXQgKyBoZGlzdDspIHtcbiAgICB2YXIgc3ltID0gdGluZl9kZWNvZGVfc3ltYm9sKGQsIGNvZGVfdHJlZSk7XG5cbiAgICBzd2l0Y2ggKHN5bSkge1xuICAgICAgY2FzZSAxNjpcbiAgICAgICAgLyogY29weSBwcmV2aW91cyBjb2RlIGxlbmd0aCAzLTYgdGltZXMgKHJlYWQgMiBiaXRzKSAqL1xuICAgICAgICB2YXIgcHJldiA9IGxlbmd0aHNbbnVtIC0gMV07XG5cbiAgICAgICAgZm9yIChsZW5ndGggPSB0aW5mX3JlYWRfYml0cyhkLCAyLCAzKTsgbGVuZ3RoOyAtLWxlbmd0aCkge1xuICAgICAgICAgIGxlbmd0aHNbbnVtKytdID0gcHJldjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDE3OlxuICAgICAgICAvKiByZXBlYXQgY29kZSBsZW5ndGggMCBmb3IgMy0xMCB0aW1lcyAocmVhZCAzIGJpdHMpICovXG4gICAgICAgIGZvciAobGVuZ3RoID0gdGluZl9yZWFkX2JpdHMoZCwgMywgMyk7IGxlbmd0aDsgLS1sZW5ndGgpIHtcbiAgICAgICAgICBsZW5ndGhzW251bSsrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAxODpcbiAgICAgICAgLyogcmVwZWF0IGNvZGUgbGVuZ3RoIDAgZm9yIDExLTEzOCB0aW1lcyAocmVhZCA3IGJpdHMpICovXG4gICAgICAgIGZvciAobGVuZ3RoID0gdGluZl9yZWFkX2JpdHMoZCwgNywgMTEpOyBsZW5ndGg7IC0tbGVuZ3RoKSB7XG4gICAgICAgICAgbGVuZ3Roc1tudW0rK10gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qIHZhbHVlcyAwLTE1IHJlcHJlc2VudCB0aGUgYWN0dWFsIGNvZGUgbGVuZ3RocyAqL1xuICAgICAgICBsZW5ndGhzW251bSsrXSA9IHN5bTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIGJ1aWxkIGR5bmFtaWMgdHJlZXMgKi9cblxuXG4gIHRpbmZfYnVpbGRfdHJlZShsdCwgbGVuZ3RocywgMCwgaGxpdCk7XG4gIHRpbmZfYnVpbGRfdHJlZShkdCwgbGVuZ3RocywgaGxpdCwgaGRpc3QpO1xufVxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKlxuICogLS0gYmxvY2sgaW5mbGF0ZSBmdW5jdGlvbnMgLS0gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogZ2l2ZW4gYSBzdHJlYW0gYW5kIHR3byB0cmVlcywgaW5mbGF0ZSBhIGJsb2NrIG9mIGRhdGEgKi9cblxuXG5mdW5jdGlvbiB0aW5mX2luZmxhdGVfYmxvY2tfZGF0YShkLCBsdCwgZHQpIHtcbiAgd2hpbGUgKDEpIHtcbiAgICB2YXIgc3ltID0gdGluZl9kZWNvZGVfc3ltYm9sKGQsIGx0KTtcbiAgICAvKiBjaGVjayBmb3IgZW5kIG9mIGJsb2NrICovXG5cbiAgICBpZiAoc3ltID09PSAyNTYpIHtcbiAgICAgIHJldHVybiBUSU5GX09LO1xuICAgIH1cblxuICAgIGlmIChzeW0gPCAyNTYpIHtcbiAgICAgIGQuZGVzdFtkLmRlc3RMZW4rK10gPSBzeW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsZW5ndGgsIGRpc3QsIG9mZnM7XG4gICAgICB2YXIgaTtcbiAgICAgIHN5bSAtPSAyNTc7XG4gICAgICAvKiBwb3NzaWJseSBnZXQgbW9yZSBiaXRzIGZyb20gbGVuZ3RoIGNvZGUgKi9cblxuICAgICAgbGVuZ3RoID0gdGluZl9yZWFkX2JpdHMoZCwgbGVuZ3RoX2JpdHNbc3ltXSwgbGVuZ3RoX2Jhc2Vbc3ltXSk7XG4gICAgICBkaXN0ID0gdGluZl9kZWNvZGVfc3ltYm9sKGQsIGR0KTtcbiAgICAgIC8qIHBvc3NpYmx5IGdldCBtb3JlIGJpdHMgZnJvbSBkaXN0YW5jZSBjb2RlICovXG5cbiAgICAgIG9mZnMgPSBkLmRlc3RMZW4gLSB0aW5mX3JlYWRfYml0cyhkLCBkaXN0X2JpdHNbZGlzdF0sIGRpc3RfYmFzZVtkaXN0XSk7XG4gICAgICAvKiBjb3B5IG1hdGNoICovXG5cbiAgICAgIGZvciAoaSA9IG9mZnM7IGkgPCBvZmZzICsgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZC5kZXN0W2QuZGVzdExlbisrXSA9IGQuZGVzdFtpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qIGluZmxhdGUgYW4gdW5jb21wcmVzc2VkIGJsb2NrIG9mIGRhdGEgKi9cblxuXG5mdW5jdGlvbiB0aW5mX2luZmxhdGVfdW5jb21wcmVzc2VkX2Jsb2NrKGQpIHtcbiAgdmFyIGxlbmd0aCwgaW52bGVuZ3RoO1xuICB2YXIgaTtcbiAgLyogdW5yZWFkIGZyb20gYml0YnVmZmVyICovXG5cbiAgd2hpbGUgKGQuYml0Y291bnQgPiA4KSB7XG4gICAgZC5zb3VyY2VJbmRleC0tO1xuICAgIGQuYml0Y291bnQgLT0gODtcbiAgfVxuICAvKiBnZXQgbGVuZ3RoICovXG5cblxuICBsZW5ndGggPSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4ICsgMV07XG4gIGxlbmd0aCA9IDI1NiAqIGxlbmd0aCArIGQuc291cmNlW2Quc291cmNlSW5kZXhdO1xuICAvKiBnZXQgb25lJ3MgY29tcGxlbWVudCBvZiBsZW5ndGggKi9cblxuICBpbnZsZW5ndGggPSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4ICsgM107XG4gIGludmxlbmd0aCA9IDI1NiAqIGludmxlbmd0aCArIGQuc291cmNlW2Quc291cmNlSW5kZXggKyAyXTtcbiAgLyogY2hlY2sgbGVuZ3RoICovXG5cbiAgaWYgKGxlbmd0aCAhPT0gKH5pbnZsZW5ndGggJiAweDAwMDBmZmZmKSkgcmV0dXJuIFRJTkZfREFUQV9FUlJPUjtcbiAgZC5zb3VyY2VJbmRleCArPSA0O1xuICAvKiBjb3B5IGJsb2NrICovXG5cbiAgZm9yIChpID0gbGVuZ3RoOyBpOyAtLWkpIHtcbiAgICBkLmRlc3RbZC5kZXN0TGVuKytdID0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCsrXTtcbiAgfVxuICAvKiBtYWtlIHN1cmUgd2Ugc3RhcnQgbmV4dCBibG9jayBvbiBhIGJ5dGUgYm91bmRhcnkgKi9cblxuXG4gIGQuYml0Y291bnQgPSAwO1xuICByZXR1cm4gVElORl9PSztcbn1cbi8qIGluZmxhdGUgc3RyZWFtIGZyb20gc291cmNlIHRvIGRlc3QgKi9cblxuXG5mdW5jdGlvbiB0aW5mX3VuY29tcHJlc3Moc291cmNlLCBkZXN0KSB7XG4gIHZhciBkID0gbmV3IERhdGEoc291cmNlLCBkZXN0KTtcbiAgdmFyIGJmaW5hbCwgYnR5cGUsIHJlcztcblxuICBkbyB7XG4gICAgLyogcmVhZCBmaW5hbCBibG9jayBmbGFnICovXG4gICAgYmZpbmFsID0gdGluZl9nZXRiaXQoZCk7XG4gICAgLyogcmVhZCBibG9jayB0eXBlICgyIGJpdHMpICovXG5cbiAgICBidHlwZSA9IHRpbmZfcmVhZF9iaXRzKGQsIDIsIDApO1xuICAgIC8qIGRlY29tcHJlc3MgYmxvY2sgKi9cblxuICAgIHN3aXRjaCAoYnR5cGUpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgLyogZGVjb21wcmVzcyB1bmNvbXByZXNzZWQgYmxvY2sgKi9cbiAgICAgICAgcmVzID0gdGluZl9pbmZsYXRlX3VuY29tcHJlc3NlZF9ibG9jayhkKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMTpcbiAgICAgICAgLyogZGVjb21wcmVzcyBibG9jayB3aXRoIGZpeGVkIGh1ZmZtYW4gdHJlZXMgKi9cbiAgICAgICAgcmVzID0gdGluZl9pbmZsYXRlX2Jsb2NrX2RhdGEoZCwgc2x0cmVlLCBzZHRyZWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICAvKiBkZWNvbXByZXNzIGJsb2NrIHdpdGggZHluYW1pYyBodWZmbWFuIHRyZWVzICovXG4gICAgICAgIHRpbmZfZGVjb2RlX3RyZWVzKGQsIGQubHRyZWUsIGQuZHRyZWUpO1xuICAgICAgICByZXMgPSB0aW5mX2luZmxhdGVfYmxvY2tfZGF0YShkLCBkLmx0cmVlLCBkLmR0cmVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJlcyA9IFRJTkZfREFUQV9FUlJPUjtcbiAgICB9XG5cbiAgICBpZiAocmVzICE9PSBUSU5GX09LKSB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgZXJyb3InKTtcbiAgfSB3aGlsZSAoIWJmaW5hbCk7XG5cbiAgaWYgKGQuZGVzdExlbiA8IGQuZGVzdC5sZW5ndGgpIHtcbiAgICBpZiAodHlwZW9mIGQuZGVzdC5zbGljZSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGQuZGVzdC5zbGljZSgwLCBkLmRlc3RMZW4pO2Vsc2UgcmV0dXJuIGQuZGVzdC5zdWJhcnJheSgwLCBkLmRlc3RMZW4pO1xuICB9XG5cbiAgcmV0dXJuIGQuZGVzdDtcbn1cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIGluaXRpYWxpemF0aW9uIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdHJlZXMgKi9cblxuXG50aW5mX2J1aWxkX2ZpeGVkX3RyZWVzKHNsdHJlZSwgc2R0cmVlKTtcbi8qIGJ1aWxkIGV4dHJhIGJpdHMgYW5kIGJhc2UgdGFibGVzICovXG5cbnRpbmZfYnVpbGRfYml0c19iYXNlKGxlbmd0aF9iaXRzLCBsZW5ndGhfYmFzZSwgNCwgMyk7XG50aW5mX2J1aWxkX2JpdHNfYmFzZShkaXN0X2JpdHMsIGRpc3RfYmFzZSwgMiwgMSk7XG4vKiBmaXggYSBzcGVjaWFsIGNhc2UgKi9cblxubGVuZ3RoX2JpdHNbMjhdID0gMDtcbmxlbmd0aF9iYXNlWzI4XSA9IDI1ODtcbnZhciB0aW55SW5mbGF0ZSA9IHRpbmZfdW5jb21wcmVzcztcblxudmFyIFVuaWNvZGVUcmllLCBpbmZsYXRlO1xuaW5mbGF0ZSA9IHRpbnlJbmZsYXRlO1xuXG5Vbmljb2RlVHJpZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIERBVEFfQkxPQ0tfTEVOR1RILCBEQVRBX0dSQU5VTEFSSVRZLCBEQVRBX01BU0ssIElOREVYXzFfT0ZGU0VULCBJTkRFWF8yX0JMT0NLX0xFTkdUSCwgSU5ERVhfMl9CTVBfTEVOR1RILCBJTkRFWF8yX01BU0ssIElOREVYX1NISUZULCBMU0NQX0lOREVYXzJfTEVOR1RILCBMU0NQX0lOREVYXzJfT0ZGU0VULCBPTUlUVEVEX0JNUF9JTkRFWF8xX0xFTkdUSCwgU0hJRlRfMSwgU0hJRlRfMV8yLCBTSElGVF8yLCBVVEY4XzJCX0lOREVYXzJfTEVOR1RILCBVVEY4XzJCX0lOREVYXzJfT0ZGU0VUO1xuICBTSElGVF8xID0gNiArIDU7XG4gIFNISUZUXzIgPSA1O1xuICBTSElGVF8xXzIgPSBTSElGVF8xIC0gU0hJRlRfMjtcbiAgT01JVFRFRF9CTVBfSU5ERVhfMV9MRU5HVEggPSAweDEwMDAwID4+IFNISUZUXzE7XG4gIElOREVYXzJfQkxPQ0tfTEVOR1RIID0gMSA8PCBTSElGVF8xXzI7XG4gIElOREVYXzJfTUFTSyA9IElOREVYXzJfQkxPQ0tfTEVOR1RIIC0gMTtcbiAgSU5ERVhfU0hJRlQgPSAyO1xuICBEQVRBX0JMT0NLX0xFTkdUSCA9IDEgPDwgU0hJRlRfMjtcbiAgREFUQV9NQVNLID0gREFUQV9CTE9DS19MRU5HVEggLSAxO1xuICBMU0NQX0lOREVYXzJfT0ZGU0VUID0gMHgxMDAwMCA+PiBTSElGVF8yO1xuICBMU0NQX0lOREVYXzJfTEVOR1RIID0gMHg0MDAgPj4gU0hJRlRfMjtcbiAgSU5ERVhfMl9CTVBfTEVOR1RIID0gTFNDUF9JTkRFWF8yX09GRlNFVCArIExTQ1BfSU5ERVhfMl9MRU5HVEg7XG4gIFVURjhfMkJfSU5ERVhfMl9PRkZTRVQgPSBJTkRFWF8yX0JNUF9MRU5HVEg7XG4gIFVURjhfMkJfSU5ERVhfMl9MRU5HVEggPSAweDgwMCA+PiA2O1xuICBJTkRFWF8xX09GRlNFVCA9IFVURjhfMkJfSU5ERVhfMl9PRkZTRVQgKyBVVEY4XzJCX0lOREVYXzJfTEVOR1RIO1xuICBEQVRBX0dSQU5VTEFSSVRZID0gMSA8PCBJTkRFWF9TSElGVDtcblxuICBmdW5jdGlvbiBVbmljb2RlVHJpZShkYXRhKSB7XG4gICAgdmFyIGlzQnVmZmVyLCB1bmNvbXByZXNzZWRMZW5ndGgsIHZpZXc7XG4gICAgaXNCdWZmZXIgPSB0eXBlb2YgZGF0YS5yZWFkVUludDMyQkUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRhdGEuc2xpY2UgPT09ICdmdW5jdGlvbic7XG5cbiAgICBpZiAoaXNCdWZmZXIgfHwgZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIGlmIChpc0J1ZmZlcikge1xuICAgICAgICB0aGlzLmhpZ2hTdGFydCA9IGRhdGEucmVhZFVJbnQzMkJFKDApO1xuICAgICAgICB0aGlzLmVycm9yVmFsdWUgPSBkYXRhLnJlYWRVSW50MzJCRSg0KTtcbiAgICAgICAgdW5jb21wcmVzc2VkTGVuZ3RoID0gZGF0YS5yZWFkVUludDMyQkUoOCk7XG4gICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKDEyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpZXcgPSBuZXcgRGF0YVZpZXcoZGF0YS5idWZmZXIpO1xuICAgICAgICB0aGlzLmhpZ2hTdGFydCA9IHZpZXcuZ2V0VWludDMyKDApO1xuICAgICAgICB0aGlzLmVycm9yVmFsdWUgPSB2aWV3LmdldFVpbnQzMig0KTtcbiAgICAgICAgdW5jb21wcmVzc2VkTGVuZ3RoID0gdmlldy5nZXRVaW50MzIoOCk7XG4gICAgICAgIGRhdGEgPSBkYXRhLnN1YmFycmF5KDEyKTtcbiAgICAgIH1cblxuICAgICAgZGF0YSA9IGluZmxhdGUoZGF0YSwgbmV3IFVpbnQ4QXJyYXkodW5jb21wcmVzc2VkTGVuZ3RoKSk7XG4gICAgICBkYXRhID0gaW5mbGF0ZShkYXRhLCBuZXcgVWludDhBcnJheSh1bmNvbXByZXNzZWRMZW5ndGgpKTtcbiAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50MzJBcnJheShkYXRhLmJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGEuZGF0YSwgdGhpcy5oaWdoU3RhcnQgPSBkYXRhLmhpZ2hTdGFydCwgdGhpcy5lcnJvclZhbHVlID0gZGF0YS5lcnJvclZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIFVuaWNvZGVUcmllLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgdmFyIGluZGV4O1xuXG4gICAgaWYgKGNvZGVQb2ludCA8IDAgfHwgY29kZVBvaW50ID4gMHgxMGZmZmYpIHtcbiAgICAgIHJldHVybiB0aGlzLmVycm9yVmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ZDgwMCB8fCBjb2RlUG9pbnQgPiAweGRiZmYgJiYgY29kZVBvaW50IDw9IDB4ZmZmZikge1xuICAgICAgaW5kZXggPSAodGhpcy5kYXRhW2NvZGVQb2ludCA+PiBTSElGVF8yXSA8PCBJTkRFWF9TSElGVCkgKyAoY29kZVBvaW50ICYgREFUQV9NQVNLKTtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbaW5kZXhdO1xuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPD0gMHhmZmZmKSB7XG4gICAgICBpbmRleCA9ICh0aGlzLmRhdGFbTFNDUF9JTkRFWF8yX09GRlNFVCArIChjb2RlUG9pbnQgLSAweGQ4MDAgPj4gU0hJRlRfMildIDw8IElOREVYX1NISUZUKSArIChjb2RlUG9pbnQgJiBEQVRBX01BU0spO1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVtpbmRleF07XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA8IHRoaXMuaGlnaFN0YXJ0KSB7XG4gICAgICBpbmRleCA9IHRoaXMuZGF0YVtJTkRFWF8xX09GRlNFVCAtIE9NSVRURURfQk1QX0lOREVYXzFfTEVOR1RIICsgKGNvZGVQb2ludCA+PiBTSElGVF8xKV07XG4gICAgICBpbmRleCA9IHRoaXMuZGF0YVtpbmRleCArIChjb2RlUG9pbnQgPj4gU0hJRlRfMiAmIElOREVYXzJfTUFTSyldO1xuICAgICAgaW5kZXggPSAoaW5kZXggPDwgSU5ERVhfU0hJRlQpICsgKGNvZGVQb2ludCAmIERBVEFfTUFTSyk7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhW2luZGV4XTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMuZGF0YS5sZW5ndGggLSBEQVRBX0dSQU5VTEFSSVRZXTtcbiAgfTtcblxuICByZXR1cm4gVW5pY29kZVRyaWU7XG59KCk7XG5cbnZhciB1bmljb2RlVHJpZSA9IFVuaWNvZGVUcmllO1xuXG52YXIgYmFzZTY0QXJyYXlidWZmZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gIC8qXG4gICAqIGJhc2U2NC1hcnJheWJ1ZmZlclxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzdmgvYmFzZTY0LWFycmF5YnVmZmVyXG4gICAqXG4gICAqIENvcHlyaWdodCAoYykgMjAxMiBOaWtsYXMgdm9uIEhlcnR6ZW5cbiAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICAgKi9cbiAgKGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBjaGFycyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiOyAvLyBVc2UgYSBsb29rdXAgdGFibGUgdG8gZmluZCB0aGUgaW5kZXguXG5cbiAgICB2YXIgbG9va3VwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiAoYXJyYXlidWZmZXIpIHtcbiAgICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKSxcbiAgICAgICAgICBpLFxuICAgICAgICAgIGxlbiA9IGJ5dGVzLmxlbmd0aCxcbiAgICAgICAgICBiYXNlNjQgPSBcIlwiO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDMpIHtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2ldID4+IDJdO1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbKGJ5dGVzW2ldICYgMykgPDwgNCB8IGJ5dGVzW2kgKyAxXSA+PiA0XTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpICsgMV0gJiAxNSkgPDwgMiB8IGJ5dGVzW2kgKyAyXSA+PiA2XTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kgKyAyXSAmIDYzXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxlbiAlIDMgPT09IDIpIHtcbiAgICAgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cmluZygwLCBiYXNlNjQubGVuZ3RoIC0gMSkgKyBcIj1cIjtcbiAgICAgIH0gZWxzZSBpZiAobGVuICUgMyA9PT0gMSkge1xuICAgICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKDAsIGJhc2U2NC5sZW5ndGggLSAyKSArIFwiPT1cIjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJhc2U2NDtcbiAgICB9O1xuXG4gICAgZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiAoYmFzZTY0KSB7XG4gICAgICB2YXIgYnVmZmVyTGVuZ3RoID0gYmFzZTY0Lmxlbmd0aCAqIDAuNzUsXG4gICAgICAgICAgbGVuID0gYmFzZTY0Lmxlbmd0aCxcbiAgICAgICAgICBpLFxuICAgICAgICAgIHAgPSAwLFxuICAgICAgICAgIGVuY29kZWQxLFxuICAgICAgICAgIGVuY29kZWQyLFxuICAgICAgICAgIGVuY29kZWQzLFxuICAgICAgICAgIGVuY29kZWQ0O1xuXG4gICAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAxXSA9PT0gXCI9XCIpIHtcbiAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMl0gPT09IFwiPVwiKSB7XG4gICAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGFycmF5YnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlckxlbmd0aCksXG4gICAgICAgICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShhcnJheWJ1ZmZlcik7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICBlbmNvZGVkMSA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGVuY29kZWQyID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAxKV07XG4gICAgICAgIGVuY29kZWQzID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAyKV07XG4gICAgICAgIGVuY29kZWQ0ID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAzKV07XG4gICAgICAgIGJ5dGVzW3ArK10gPSBlbmNvZGVkMSA8PCAyIHwgZW5jb2RlZDIgPj4gNDtcbiAgICAgICAgYnl0ZXNbcCsrXSA9IChlbmNvZGVkMiAmIDE1KSA8PCA0IHwgZW5jb2RlZDMgPj4gMjtcbiAgICAgICAgYnl0ZXNbcCsrXSA9IChlbmNvZGVkMyAmIDMpIDw8IDYgfCBlbmNvZGVkNCAmIDYzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyYXlidWZmZXI7XG4gICAgfTtcbiAgfSkoKTtcbn0pO1xudmFyIGJhc2U2NEFycmF5YnVmZmVyXzEgPSBiYXNlNjRBcnJheWJ1ZmZlci5lbmNvZGU7XG52YXIgYmFzZTY0QXJyYXlidWZmZXJfMiA9IGJhc2U2NEFycmF5YnVmZmVyLmRlY29kZTtcblxudmFyIGJhc2U2NERlZmxhdGVkRGF0YSA9IFwiZUp4dFZ0dHk0ellNL1JjLzcwTmk5N0xiTjF0SjQ5U1hlR0kzTzkzT2pnYXlHQkVSUlhvbzBoNU5wLzllQUtUY3BOT0hFQ0FGQWdmQUFaMi9Ka2NJcW5FZVZULzU1YzlKY1p4OG1uenJhZGs1V3ZhODNjbFc4YlpqcmFabHk4czY4bG5MWjJ5M05yemxhMnRlZGtoTDhjckdzbVZ0SFhoaEx4dkxDenZkOE4wdDMvMG15NG12Y2NqQ1RiNS9taHhkVjZGRjJ4UUcrajZoM0xwUVBpdm5hK1VWQTVsWDdxeEdXVDVqb3puT1FobDM0ZE1RNEtoVlhYNzhmRDBlN1o3T3loc1lTSHQwQWNwOXJQcWp4eFBiM3JsWUdYVzF6TnN4ckJ6LzYxZWlyTlVyYjRxaXVMM0o4amJMYVphekxIL0k4c2NzZjhyeTV5dy9aL2tseVduMk44MytwdG5mTlB1YlpuL1Q3RytXN1dmWmZqYmFaLy9UN0grYS9jK3luMW4yTXh2OU1LNXRiQU9RZkVFUEhhUVBuN1BobHpIQm16R3ptekdGYXc0ajJOc3gydTBJNzFad2ZlelZ0YmE1bWxtc3dFTDU0dkJJck1qWUdWdHFBRkVtdFMzeDJYV2RZNnF0SVNETGhUdTV6cjB5SXgrdFZoNkRNT2pCSzlVSzUwNEJtWkRGNE5FWVVlZStVeGFCYnk5VjVaVnd5a01sSC9ka0I2d2NOQkFzTGxFcmswUGxJZWR5YXdPMkJyRytVMmN5YXVpTHBHWWJNS3c5Uk4vRlZpZjFEVHhoWlQ1NkhOamhBVHJreVRnb0U1dVk4cmRRZzNnbXd0SWZUOVFlclNZMVFVRkptWUVjc0ZJWnhnQ1dRSEVRbXAwbVp3UzJpZXo5UG1oMHA1UTcxY1cxaXN0ZkVOeWFMTGtmSGh1MHdMWlBqWmFRejlIS2hRT2xaRnlUM0VYck9PNGlhcXpUdHdyc2hYR3RkS2M0L01iWnhwa1VmNDFkRmNVTXFjdGNQblVwWlJPbC9aRmlxbDVsaTBPS3U2Q3k1ZE45cE5wbWZRRUJXcUhKNmFnNTRKTXBDNDJ0Rk5zRDlaT3RIZ3h3OU5UbUE3NVNUbzFPMEhrbFlqZXBrU3QybDlRL3BKN1lNOUlYS2U0Q3VpaFZINHdMV0c2aGtaN3VORFI5dVFOaFFQVFE2K0NUcndGMHVXYVRaL1VHd3R2ZjREd2lMMUplbk9JTEt1YjRScW1nc056QUlMeTAwUmlCWUJYNGNzSHFjRXdWTEloTm9qeVp1bndNa0VqNzRLaWZ4M3k2VTc2VHplOU12ZkQrdkU5Mzd3aUhsOEI3RGVmc3IrL0FDZ1B2VFFWOURoYVAwQXNoNk15T1BSUlVjeG1iazBmSGZoNjdFMDBYbUhMT0w0V0UzSUhwQnErc3RCa3FLcS9LSEtRaVdhbWVvMG5MZWEySE9pa2JZaU9ETHBkSVdtT0drKzdmSHhlUnNwREhZcVhCT3lxNVRCSW51SGN4NkZLRzlWcWlyZk1mem1nNmtlaVNvTXpQcWsvVDhtalRNNEtPT0U4ZHBVdjR2eCswb1lJeCtCNU1VUDdkQ1VjN1JOOWU2NzJNdGhtN1JZVFVIUW8xTUFIZU8wKy9PbzdxbHA0MURXMlhobHdEVVFaVGMzeWEvSlYyYjBMc1RUUWhmVnpwV01PRnhsWGVNN0JCWnVDQVhrZDVzL2RZMTRsbkd5ZEdCMmlGdEhQdCtQUXIrYlpOV2FDOFBqdUlwTnB5Q1V6NklscUZyODZ6M1gwelVQWkVnWS85bUZzSU10WC83Wk9YNTRCK3ZPblJCaTJ1TlZ4MHVhU1htUlBkb0R4VWQvRmszQ0MxMldOanZ6SlIwM2RsYTFXdXNJVTJJci92Q2k3eVg0RFFpQ016ZU9ZUi9mMDYrZjczUDArbXMraz1cIjtcblxudmFyIGJhc2U2NERlZmxhdGVkVHJpZSA9IFwiZUp3QkF5SDgzZ0FSQUFBQUFBQUFBQUZRY0YxNGR5Q2IrL3YyNlhGS2gzRm9VYkdPcWxvTlZYdWZVcXMydFdxRXF0b2oxQTU2cXJWSnEyclVpRTFiaEZveFV6T3RGWHNGUVdwR2hJYUVJSG43L1gzZlgzdmU5Ny9uZWY1NFB2Zm5IdGQxM1JkaDhYTEREVGVYNWYzdDBHQjBsSndzZDZEdzVRbUdZdTZYWWZ2TFlBamhJQUhheGtSV3V2aWtSK0tKVjloajFYOTZwL3M0UVlib3Z4L2xCck1BcGd2QjJtd0lBMU5FanhiclRXT3VNcWJVMWVmZFNvQzlZRC9zdVQ5aUU2VCtyT2Y5dW9QODBMbE4rOUJhY1BhaFB3aXBqRHorMEVtaFdGbUZCbU1qMjFURmRjTDVOTHMwN3hwTDNtZFBGbk81T0RpYmRzZTY5akwzM3ozK0s1UTkyQjZzamx1d0M3VXZ2b002dHhDbkduQUIxT2NDNGNVZkNSWDAxb2V4NXFRVUQ2Mkc4Y1dEK3IrR3NZOThuZ3NETGowajdWazdKQmp1WWNLNGF6NHpnVmswa3ZCN1BCQ3Vqd2orMEZWREJMZGVZYWt4bGhQRGRrWHpIOUg5V3dYYU56K0s1ZGFlRjExOWtKZFd2eWV4MDV1N3ozWEtHSUt6T0pWYWltVmJvZXlEd1B3YXNiejdXVWVTcDhCNUJCUGJzaEJFRUxwcW9KWU1FODYzek9DNTVjeGVscWU4THJMcTVzTjk0cmJLdWRNTngvRWovc2hLUHBWTXdFS2pqclFodjhQNm8wL1orRElnSTMwYkw2V1RqcHo0dXRucllwQUp5TlRnMHo4MU9RdTYwUHNMQ1Rlc2RNU2Q2MnNUT0RKclV3aGlPTDY4Wk5KK2lFUEs0Rjdib3hQMUQzTkxKd21VVmVFakpZMUV6UjVqcFdlWUFDYldGVU1FRzdhWE1yblVjbkFCQTEwUlAyVkd2UnFVSEZBeitmeFZpY1Y5ZFFjQ1gvS2VpMllZNlRrK0NqMHlka2dhQko5ZnlsS0VhODQ1NmMzcnpkS1ZORjZlS1QyTFBlTFRnQ0o3WnZhQS8vZFNHNi9FQTRDcllYa3ZKZ0p1anZSN0I3Q085QjJIcVVyMUU1Y1h1MC9xMkpCUXpjK29QZXllNTRMWU9QMzNtRFI2SXJLYnY5dHhuR3dUSUoyMjNCWjJ6WFRaYzZ5ZnJoMzRwdmp4UytXODJxOURxamxIT2tvTTdza05NeHl3MkNDRzlqYm4wRTc5U041OWdTeUlhQWNjVys3QVNleUxENUNuWGE3cE96d2l6a0laRU1ialdyeWdyZzZsRkg5WHh5T2g2Q1I2Y205SytOSzN4T1J1TGsvTTFqMmZuaTJseS9EdWovc3E3ZXorM1pkQ1ZtYmNJNkRuL0YxUHJwK3lMcjJrdUVocnBHaHlZR0tlOHdaYzhlTmlUVkl4Z1dGcVhiUnZWUE9Rd0RyY0ZGc0ZuOWxhbDU0NEZsNEZOYzFOeWlzcXZrOWhQNnZpU3dkQ01BWktYUFo0aHRxYlREbGVXa0VuUUlVVXZkLzFYRlFLbjRaSWYzdXdtclZhWlJlMEM3K3g5SThpRG5nazM4NUMvQ3lDNExOWlpwaU4xK3dWM1RNNDVhSHhOUytITENSS3IyaW9QWXNmN2NJZFhmeFIyc1BvRFNPSnBDQXlaZWEvQjRjQnZ5UGFPQ3VHRHBmOG9ZT0c2NnVIMzM5RUVwWk96QUVCeWFFY3lJc2JLdC9SV1dTNjdnSUltZCtRREo3TE93N3lXbFNkaTRZM0NINkx6ZWpRellBbkg3bjJ3ajVYZ0lWWmx4WDBjbU42YUk1SGwzWlJzVWNDQWwzUXZTR0hVNmptL2JFSHorTVlWYWcwOEE0dVF1M0Z3Uk9kY0lhYXJxeFhTOTBhTlYyRU1FWjM2VmR4a21ESjZPZHJPTTZ5SlBUcXVhdW1aaG1PQ0M2MlF1dGwrVDh6akpPK0F5Qy91WkhwV1FsSTZVZHpCckpubmliRXdxSDQwa0NZKzRseUhWM0ZpUWx5QWFZbkxQTVFuYWdBNnBydmRCOVpxQmx1Z2RZUlhuZitUMmI3VFhPZ0xYUUh5QURKY2pSbUNFNWZKUWZ0bnJPbzZybFp4MlcvSHBtR012aFBmM0wrWjFJNTh6WStSZnVMRUxROEtndVRKTTE3NUkvRWFucGdTYTJLN0lLZjcvNW4yUFc5S0I5OXNGRGhvelRER0wyTldQVWswZjBxdzdPTkE3bGRSYXVyZFdLN09xbllzaHRPL2VSSGNFZ080Y2ZzblY4dE9OUmN6ZytUcnVGdzB6UTZsWUZ3d0xxaitUNzdJclM5aUdaakI1eXZRelQzMlNIYzNuM0xPTkhJVzQvQ0Z5MG5qOFZwQnZEQnFLWWtubHZMNTVYT1YrQnV0ZjhPN3pFNTVUMlZvS2xIa3hCT2tjZytNbkZsTVV5VFhKVG0zZGNCR1EwRFpCemZzbFlmV0RLaDhpdmQrSTY4ZnlvUE1keUpnUjI1cUFtUllUZHA3ckJveS9iTTJSZkFYQ1prbkVucHJvSDJKQ3hqUXNGME9wbmYrL3NkTWlpUlA2emV0S001eFJNWTR4cDBLcFgzblBRdGZiZ0VQUGNzcUM1YVF6R0ZybzhWL0R3MWZrMWppS3dINXEvUll6QmVVRm1SOS9kVldCUlorb2hBajlFVks1YjVFaVlvQ2hTK1B0Y3dyK2Zlajg1MlMzTmh2Z280MStzamZ1WVp5cmQ4WkNpZ3Z5RkplK2xBR2dIN0lxc3RJMXplVTNYL1psNTg4NnFXdy9PWTFCOVFvSkhRb1JSakNCL0IzOHVITHNzZlZWWUcvVUE1OU9xVDA0dCtuMEhMWEJCQVRLcjA4cUEyVllVMStVaW9ha1VHMnBpdGErb0xwa0RSYjVSUEwrT0dwQUtjVnYvSVMrRUdab2U3UzcxUXBZUHFSbFZOUVgxa2szWndseHFkRHR5SEE3TmpRc0huOWw5YTVITFhSL0VzSlZJaUR0WkNveHdibDJIRUF4ZHptcXZRTnZDVFZNeU9HRVhDazI3YUYxYmRncjJ4bXR0MzBqZDk1Qjg2aEdldG96Y0xUWk9QLzlyRnFnT3kycmlqNnpaRVQ3Q1hsOEpqMU0vamtpY1VyenRVakxSaTkrMXM0STFwSnhFQy9lYnJKMndjN2pTNjNSNFppdndOR2crbVE1Uk42TVdDU0lUMlEzUHpqRnNxWkVOYkRzemc5U1cvTmRIeCs4cUpWOGUvL0pYTTkrQ2IrYlBKcFUrOVJwRkZuKzZ3cnpza1BkSm9DL2lISFdrMmRyTjdKOGJ1QU1sSEtZS2xGMzVIcXhDNTVweXVZamlGSGRlT3hIeWt4YTFXSlZPRExkOENKUHJyTEZNREI4V3QzbGNJRFhnWDE1aHJ2cS9JUFlTcmQ1TmQxSHd6Z1lIM3JCMkE0YVY2NGlpRUdpbUwrYUhOVnhlRHBDd0hjc2ZBVjkvc004cU05TnhBVFFMaDdXNzBaSmo0WTFWenFsMmdPTkVxNW1zSnhMK0FGblhyZUtpb09acEdPdGlPR1ZVYU9JMTFoYXNCQzFPQ0l2dkswdXlWNFNwT2J0MXBxanRIQ3dPYkg2Unc3MVUyajJjTUR4ZWI4emUwR3NLZWJpU2VLTVZPZnp2bWk5eFhnYmRQMzRERStFSFI1c3oyTVVwVEZ5a3pGMHBmZkJvc1RMSTF0ZFFwa0hnOVFjQzBPYnhuVFJJT0VmU1BVWFVybXNrS2haay91RDg4SnFrZE5EcmhKYlhWR3ZlbndxSXA1bVc5MGVpUjZuWHlCOWN5Y1lHdHdQeFByaURsdjI4ZCtPcUI4QUFvcjN3TmcrUTBPaG1BYW16MmozdjN1aVo0QzNtK0tBc2M5MDVKZXFpOTJNTzl6TjQ2clZwanU3ZG5QQmJVdVFDempQcmorVHdZUDZNaEFKZXBlWkhFMjV0NjdoRlJCcWhLRFJEMDVxVWtoUDFKNlRYaHZXK2Z4RlIvUndTczQwa0tLNXo0d3hYVVlwVVFDY0dsTUZYelVoRHgwTU5SbDBpT3F0R1YxeFU5UWJHOHNxRGtWSjZET3Arc2ZudDJydUVYNnNZNmMrdkxScGp3engxNURrdXA5cEc2OWt4RGhJN2VFL0FGdlA2cHlOWnNvdnBzOGxtM1VKVXdXRFlicmFEK0pEV1VnOGlPc1FaUm01d1V4VzU4ZUhObE5tYnNxbEFHUjZNR2RWRmZ2TzZXK0tYay9oWm5QeHVqcWl4NGg2SmsyWm5TMC9wSHRFWUw0d1A3cTc1V3JtVlk3RXZneDJDLzlTVGJ0WmJmNUp0NFBVcUdPcHZtb3dwR0VZcEF3cjR0VkwySmNFL2MzT1Q2UzdrN1g2NHpjWVpmL1l1ZklmbWFwYTg4V1Q1UDZwRXZaTVNBZEJxaUhGcnQrc1lqdStwcHg0NkFubkk5OGdMS1ZLQUVFVElySmJ0MGQ3Tm9xUEhoTkdZVzZkVVBkbFlmcUlwbmIvTWx2aDdQdzJBY3RzUDcrc0dXdmUyUlo2aVlUaGE5M0lmREY5UUtjcDlyRi9jZnh2NXFkSXNTNkN5WU5XSmUrSkdBb2hIblZSR1dtZk1lbzd1MnQ3bDRxVVRESUVPSzJBeXZQOWc1d2tPMnFRNW5hMXMxeW5VVzMzS3pCQ0Izb0Y2QjhMVS95UXplTGVOUTIvQzNQMnlENzdYVE4yODhCajV3dlU3VmJKQWcyM05zS0MzMkErMUFiOGtmRnlOclJ4UzZyQlVIamc1SUtJU3A4ZE93UEsxTG5vOWY2YkJLZkJkN3B0SnV2UW9BUEhYTUtFMkxmZ044STVCdUZXTzlOdytWcUt4NUs4MEVsMW5za0JoL21GN3UyTXppT2ZLZE5qWkZveTA4ZDVqeE5mWnhiVGpNTjB0ZnUyR2hMeHg3SzlEc3RkNDVpek9keFhmcFZab0pya3JQSzhCOFh6NW11emxvSlVZYkErdEF3Vk1nZE1HdWxiUyttYU03eUFuVDN4a05TVDNJN00yRHpiU2ZUSzlzZW9HVWtjdnlUckJYWW1ESWF5MEF6K1BYc1VscWwxNmxwUzdFMDhQeWlvekNMUTEzYkJpVUIxOVdjNWNEa1JENHA4V1dBTWh3UTJicEhDcHFxYmo5S1dTdGllbGlod3laS3JLMzZYTnFLSlRLL09uTFhSMkI4MmJ4TTZZQ00yNnpNbDRISDJXa2pZY3NTOXBoVHVxVXM4cm4yeW9uMy9tdm9HYU12QTFJWHZNSC9aamMrbmE0Y2cwSUtZODNwUUFxcW9rditzZDAvcFVremc0YU85Qk9NNldpTG80SmJEUWhtS1VkQjRpYTZVVWN6S1oydEt1ckc5bDVZM0xXclVjK0NqWWYzS1p1WURqZUxmcFNUcTJ4MGNZcU5EL2ZRZDhYeklrQUZLOTQ2ZXU3WE1xVlgwcWVOWFo4aldEQ0Y1NGx4ZXNJaDF4bVdjYzRPM0RKVm04UDJ0MDB5aGNqc016citwdFl5VWdiR203QlhLV3hMZGdMaUFMZXI3SDNjUm14TmZoUlVKTVhMelFZd3NzSEtuMmx5MmozcmZBNjlIY0l5cVhKc2lKZmhUQTVrZVpMbFlXRzUwWmpodHFBNjB0UDFLTHozTG9uRThlWC9uS3JIbDNmbnpmeW5sc1hDWUlGZmJRUlhUNGFPR3dmVkVMTnk5bWl5b2IzZjEzMzgzUi9ZWkUya3I4ZncrNjZPNW9wNko1ek83aS9TSkhtRlhwYVhwNXFWNTVGWENBR3FLMlIyMmUrMHJQblVUUDQzRmViQVdxL0NtZHJ2N0YvRGE4MHZxSjh6VFNVRDkzR1h6TllLRzl1QVh4VDU4alBvcHp5d2JpRklMYlduYUxOeXRibVVEOE40SG1ucnVzMFVaWnltZkxLRFBGRzkxY1licmQwNEFycTJva3QvUiszWmpQemdrYS9OZEVHaWsxeldlcHBmVXdFSHdMM0ZaRnBucDlKL2EyanFndVlzUVcvTmNJdHlYcWZjc21hMzkxUmVnVFNFb1dzbTVYbng2Ui9aQU1NUlF6NzJjSDN5VlNQN0gxakpzSTkzdXMzVW14U3hIR2cvNDNjYlVzdGxGekdJNUcrK3FlRXhTMkhCYms1NnVaOWp4VEJYNVhyZWZpQlpzblhMR3FsZVJtWkZMcUNRN0RFSDJhZk9zRUNJWTBDV2JVMytvQkYyNFpzZDkzaTFwam51ZGtrNW52MHQzQ2RPcjJzYklJTnN1UDJIUVRMOHpXUnVHemJreHJYQUU5c2JJdkF5aUEwVnBseGh2UTFlaW44Mnh5ZUFrTlJzWkZmSTdiT2l2cXB4dERNMGFjQmhqM2NOc05xSSt6YW9ET3ZIK2p4aXlaL2Mwc1c2RTZieXNFKy9kWjRZMFJoSWF4eGJkcm1tbkZaekpCQUZHaUJQK2pGb2JmeVBQd2E0UDNiOTRWTWtpR015aDFkN2FJNjVrbTlMUGJ6VVRMZXFDclo4d2ZMbWV1WnU5YitvOVFlc3VidU1jdjRMZ0w2Wmt5VWN0NVI3UW1UZm9qRjRjL0RQczlIZklobXRvZVdiNnZXOHRxc01DNjhsSC82UmZNU3h2WHJIdW5EaTFXZWNjbUpJbFdCNGZ3TFpRY2hEeXFNeks5MVZnYysxQW5XdW0vN0taOFZzRFdoWlo2VU9meXd0ZVA4NVF2bWFOWEpMOUNCRHFlSkEvMDk5UGkzMGNKZER6bGpYZnEweXZsNGhXQzlFczhFZ01wazZvQWRlc0VmY0QzZVNQNkpjWkdJYjV2bmVRK1ZKZ2ExVm9tbTVQUTQxNWd4UHB6bk9ISHU4WURCcnlGb3Q4NmxCbS9QdkFkVlJPZi8reUdTbnRmY2kzZzZyZXpubTNVSDB4YXVibXd3dkluc1BmclZzQ0xFL1FtVDRDUzVtMHZ1WmhlbVJzcVkxREFTWlNoU0hwOUNCbytOd3hBdE56MVRPeWFDZnJUMmFZVGF6Y3NtNWxhejliM3NESnExWnRSWEI1b1VTY0YrK1hxTldGdGVSQi84SHg0cDlCaHl2VnExbk1WOWMxSk1zQUtjaWhLKzRjVW4ralBRNTNiOXRHdjJPQVErSTFzK0d6TWJNS0tvdE1IcndGQytkSXhkVnB0cEZPZEdjcjJ6MkRGaDh5MUFFZGJPOExPRHlvbW5FNmQyUlZHZXNtUHJEcitndXlGcWx5bXVDaDJXckFFb0NMY2VMVVd5WmRGcDZMZDU4QVd2U1dLdFV3andnZWdHMFZvSE5nS1dLenZJdlB5YXRwbmZTVkNGMnNUalh2NXFvdUJrRFltVmdKcGdoRlBxckdGQ2lJOFE1bXJZN3BDMTYzaDZ2eEJVN3o2OUs5LzI3ZmZVMW9zaWcyZWhtU2ZFV3hTc0dvUHdmOW5MSFZ2bXViOW10Y3IxVHN0dy9PbTNmdzVIejcrMGFQS3dMSWVITmY0dXg2Qy8xdWtUNDEva000Uys2WEk2L1hUNlNEeHNIcUU5Q0tEL2h5eUs4b0NxODF0cGlrWG12MmJyTjUyUzA4ZHlhbGRaN3I5NjlwZm1MaDR1M0JpU2dJcldheTF1R0lvUXVJcXJsNDQ4aUJpUjYyQXB5VS9QcTlCM0pTbGh3MisrWTVUbjloV0d5NERsdVZjRzdzRkNJejlIbE1nY053YlhGQkZhQTlxeUFvYzFuOWtQTmVqKzNjRyszMDU3eTlCUnR3VTdLVFNpQmwyUnQxZHV4bi94RTNrV3FTNFpOb1ZmZzFiUVBYbVFVM0UyYXJSanBtSHB5cDNEYzdvZ3JJYlVCdVJRcGUzZWtwVEJKUFhzY0dHbWpJNDRtV0lMUFkwNFhFelRudDNQdlp0YU9QUGhlbVgvaGx6T0ExNVNsSjlWQzhjTUFIMmFWRWRZa0E0Ukh3K1JKZ2lvalJMUUpvU1BGZnBnOUZ2RWRLYWZIK2l2TDI1WmZiT1pmRnQzTTNWMmZORFFiUm5wUHVFT1V5MzZaRi82dmwyeDdwZksrK3FHRDFubG5OQWxoVmt5S0hlWmplYkhrTVV3ZFFOK1BHbFVlTW9tcFhvVDNVT3V2VllwNXZ0UmFDQmVFYktwNFc1UFFZOXNmRzh5TEFqOG1DOXJMQVZYbmdkM3dBUnZQdmpqakxReDdHdDFIMC93Zm9RdFBpeDczOS9aQVNSQjdNRG1XeGFPMUtyUXdleTZhR1RkcEExeUp1YXJndFNHTjZmeE5scDUxNDM3KzZuY2UxcGdjMzU2RHBuaXdNdTJnamxpbkJreGg3d2g2TzB4ajE4c293RlhjWW1DTjRqdVIyWHRGakVpNmRURzV0SUd5NTlhd0x0Q2tzQ3phcmVqb2VNWjJpVHVteHFXci9UMGpPUFE4T3d3T0hKVzQ3N1A0c1Rhdlpia3ZkdGJGNmNRdE9yRGVxWXpWUWFxRmZWZ3VtbTFsdThSeHRpc0U5TWl6M3h5WkZWWEhjY1hQelBMS0tpbjlPSHFSNm53RDRaMnphMStXMDZlSTZTdWorcVVJRlFiRzdLcFkvMXFTTlRwK25xV1FQbFpyVGV1V2JQS3ZFa3daRGpPc2MwRnhRa3R4RGVYWmxOTXJOVUdVSXhJMUZ3QkQ3VmdmeXZ5VTNmVm5OSkp3Y0UrYkpMdjVoaGxWaHZyZmVWL1lHUWFrZlZPcUtDUGI5MjhGenliQXJUOVhOYys2SjB2aEFucW1FbjhoNmJpTituOXlvd3BHMGJpNHpsMEtDa29LZG4ySHdWL1dZdlB5VG9KbzhKSmxXdDVidkg1L3JPNFA1dEdscUV4UzlEWWFCSlo0a3JHcm8rM0hGeVpFZVRlN0xvVHdyeUQyVmZuWmpzNVlpL3p5U0F6OHFOTEJiQzZqZVNKQ1ZPRE9xeGdmRktQUnNVV3NhWDBnT0wyeW53QmkzY3dmQ0d0K0ZrRm9hNXJGNVN6Z005WW9qUzBva29BbGtEN3hMY1lGUW9hUEJ1V0RwZkc3V0FJRHZ4a3NNdFYxMHRla2tkZ3owQm9qL1UxQ281UVNnV1RGZlZoTHR2TUFOMnBOQjdBM052M0xtbDZ5YWtDTzBqRlZZcjZ1NUZadTZYcUFpenh6NXhnM2dGbmJKdENxNjNOL3JLWXZSYzVRVzRteUVoOGdGVVJnZDdjcldoNDc1d2l1eVlUTGQ2Ulg5MC9JTjFRejNJMWF2Qm9tdDYxZlkrMmhKVm1KaDMvVWZLbHViTmVTbW9FdTcvWnA1T2x0aEh5aWlDRkdhRk9SeHZzSS9XZWVpUFpBL21zNlJqMThlUmkyTmQ0UVRCVS9lS2JIVWtQdm9sYWpaSkxzdmRGT054dGwvM0M0MGh3UFVGUUxPTGRrWG5UNHBtZFpZRFBJZnNEdjdZRzMwbkRjZE9mNkxlSlE3UkRrZ05iUXA0aEVoa0dvcmhqdXB5YlpnSmNVdHdKWDMxT3JqWFJzaFY2MjF0SkRidWk3b0ZUN3grL0hQUnV2dllrdzdIY1Fic1NRTktNRFFQazRCZWNNYXUwdkRBQjFPUHhiN2Mvb0l2VGExRGZVaXhNZjZoSExSQU1YTjFWQ0JVdDRaSm5qa3hieXZyUUc3ZXNadnBmVVZrMXJLc1VjMzBjYXprVlU0NW9MSndNZFZhczZXWkJmSFFtUi83dWVpUnlhelZyLy9lOGhKaVhid0x1TkkySUgzTHNLK1E5dDl6WE9tdUhCa1hwTmVoV3lFQzVWL3BzdTFuWHFSeXJXYXZNZVltZ3JzSGFsUHE5d0owQzNpNndxakMzSUltYUZNcDhGMDhTZGhJMmlhMWRVUk1JMG9YTGxJY3d1Y0w4M2J4ZVhBVGdCT0Z4OGNWRnVqbGg4bVlaekZOT3habVNvci9JYkhPYUo5aERNallhR1RrRmdXcTFXRmt3MDVmaW5ESWpzVjBuZ25KKzJiMUtnS3F0cS9vS2dZU2ZKUEQzNy9keGZjWlhOZ3B5bDJ1OVV3QkMyVzVuV0ZVMlVtaHVDVlYxTkE0ZHVSOGQ5ZEliR3pNeXhZNkdveTZkYVNZSHBQbER1dkpnaHlSbTc4NFFRbDZadUMrdXp1cWswejdudGZkRjQ3dlltbG1sYm5hZDk0TDlFei9XbU9XN2ZMTDBncUVJK21Qei9aTVdoL2hvbkZYRFJXWXZ3OHIrVXM1aG5KQW0zUks0elpIMDhGOXIySEtVV3JPOFhnOUoxVGM1M1V1UlM4ajgwYW4rVDBrdkpqSWQyUDd1VEVLZEdra1ZtVzQzbWh2ejFCMjFHSUF5eFVTbjhnMmtLS2FoQTdKaSsyY2pILzZBNUFJcm1iaE1Wd2RqdllpUDhmSXp0cWpLb1ZGOWp6enNyNThOcjFFYjV0L1hGWndkRUJVOVhod3Z2YnlBaFkyQ1FHenkwOEJvWXpaZ1Y1U20wU1pSZE1pMkZaYWJVL252MVVSKzYyajZ3Rlhpc2tiY3VkT1IyS1JTaVNoRlhlS0pPc0JyS1BOZGg2Mk41endwODkzUzRiZlc3VTJRdDRvMm5NNllGS2R3c2dLTzZUOTI5YnFvY3hmdGY2RTB2b1BOckQxRzFQbkJjZXdCUDVuQytSdzBtSkoyL0s1OFpSUlV3N1VXSERkRHVXeWszMER5WDZnS2F0MnFjM3hhZ0VsVWdNSit4djZ5Q1gzMkVkdWhsejFhUGxLWlVrKzRpeG8xRjB5YXdubUpXck12a1V5WnZzSFY1MkNaZ0FtMElJZXdqK1JHZ3Vpdzd5SWpMWHlvbG5Da3FYbnZNdisyVWd2ajJlRXV6WDVJS1dQdGdwdUlOY2hwSzdCekp1VForSmNkd0lCWTkrWTZoeU14bEIyWDMxTkxTRkc5SnpoeFBZSUlzczVZTjl0QkdtNDhQbHZLcFp5OCtnZm11ZFZGRFlmT29VTldmaGZhSWU0ZDltL3d3UmZQcHp1MUNsQUgvZGpHb0g1MkdZNjcyNDNOSG5qaHpUQzJFSUdVN3c4YnRZYVBZdjRCVS80Zi80Y3JJNURqbHc1NDMrR1dtQlBTOUcvL0J6Wk1XcmlSZlNhZFRNdHE4N2FYbzcxMTl1Vit1K1lnZi9VTXJ0Q2R5UytLaHhzSUxCZW9Td1Zla0pBZGdDaG56NkNMbFRxcHl0WmI1VnRGWHpUMFpvb2VYUkQwNHNBVEwrcDhzU25oS1RWeDhCMGtzR0RJaFhqNUQxVGNRMktuV2NhczFpenlybVpjdFVGWkowTWJtTlB2czZPdHRoNWROWGlWWTJEVVRKdkJWMTBRbjJId3AzK1B5VTZYMHc1S1NGMVE3eENaTEtweEhvN1NtWTNuQlRjWHdPU2lheVRqUHlQUDFDd3M1K05mMytOcW80ajdza1FHakduSSt2ckNjNWJtdk5lcmlmS2tqdTlwdS9MNDdmQ3ZEMDBIdWo0UUc0SmhjK1ZHL3NnYi9lczNvSHJTZzVEdDFwSXdnTnFsQjhYM3pZZ0pWb3FyNzFSbXRXTWkzN0Mrb1VaK0V5Q2RYQjR5VzFYSmsxUE9tSU5pYnYvVG1QY05aeEZEVDlIVU5RQ0MwSTk4VFRzN1Q0b2g5S1BuV3FraGNRMU4wbGhXaVlteFFjUkx4bU5YY0VROTFON0RVb0gxQ1ZhbnJDY2tMMDhJWVNJejk3WFowdFllM1F3dHF0OEYremhxdTRnOG1iZDllMm5LOXEzcmRhMWlCN0Vmc05McWNMdHp5b0xlWC9vREtZcm9sMk02N3pFRFhCTXR6U3JOYjVxWWExV1BVZ0IvQlhxTWJqUWtCTFdYUElTRDR4V2lFSzlKWndPcFNRdnhRWkR2SWU1R0I2UGlldzQybFJXdit1Y2ppcUtaK2F0d1lsZmRMSU5USkZwTFB5V2VZSXdYc0g2cnRKQXJsT1pjQkd5eDkyeW52TldpMk1IaGQ2MVB2WWpYdXJwZkh2bnl1dW94YWNQZ2J2MHlFb0dSZmlSeDJlZ3F3dVBUemIvSHhGUVpEVktqeWFOc0t2cDFzR2srZkptdmhJVDhnT2x6KzhxeG1OaDJwVWJVRUx0R2dJZmxXVUF1N3EvdmIzd3FmbTRLMDVWQnpQYkVwUWZZZnhZUmx4UVhGbFVMK0w5emtnM0Z0TFZaV0JyR3VsVGNPSG94dFZjaWE3bFB3UHBvbFBuQWpVVFRManlZbmJ5aXUxQzlnWE1aS0UwdzdWTkdYTFBCM1lTWW8xR2hQSlFyUis0K3hhZUpZZUpPc1VIN0lRN2wwSlllbGFjSzhtMHBYL1V4STg3ZkhHOE9JQnZFdHluWmJ1MFV2V3AvQ0RWN1Z4NDFtMFhwOWZyVU0vOWpvcWVubFpzMm5hUFVlM0YyOGQ0M0UveXozNXM4dE1oNVR6UVp1ZDJjVTJ4eDNiYzd2WXluUVBaSjJJZ3pzOXY0cVpWV0JzODRqM0VaSkJ4Ny9Qb1dldS8wczIzb0hldW5JUUFjTU9MU0ZUbHFMaU5aaGxOOVNreVZkUm93ODJUN3gyQjF6VHROQS9pcnREM05RaDQ0YUgyNlMvOGgxQnJQRHFDczAwVU43eFV2UlJjTnF3eGVqM3VjcS96WGoyQllaWmllc2c0engyaE91K3lBZWIyekhYTUVHRkpCdVFKTFF1K0h2cXU0Wjg0bzE2dFJocVpWZS9INm1SenQ1ZnA3NzY1MzRSUC9nSXR5SFA1M1ZXejZBODJaU0oyMjVEamtuMDM5R01DdzJ3MVErU2JaSzVKUlZCVEhPQitod1RveHpRNWgwSE5ocnBMRGFGbjJUbDJUNndrUGZJdlkvTnF5VkdZM0had1puTy9tYUJmNTMwbzFEWCtxcWEvQzM4SVBnTHVzRU9kQ1hWajR2OCs4Rmh2TzlLdzN5bldidnpYeEpFZGhzTUd1ZlBpTzc0OVBhcDh2TGx5bThnME9UVTFxeVRNQ0RTYnVsdUp4cCs4MHBvdk4zalFaeHpLbXlqQVBpdDZRU3hQKzZWcmRKU21uTmNybXFoOXd3c3VUTS9WVWxQeFVvdmk5cWhoKzJWcVRrdlAzV0ZqNmxlL2tCYkgwTzEraXRNOCtXU3JuK2lEamJmQk95R3ozcTZyanZEaloxVGZpc0JVbFByYXVKUHpMVFd6MDlnZU53ZHIrdlVVL3ZHNzFBMksrUG9oaUNzRkpMRHhycTQxalBjWW5QS1U5dllZV1kxNnlOaHpQMFBma0sySEYrNWR6T3diM09Femx2aVZhUzFYNnZkSS83SUNUT0k3M1Z6U2NhMFE4VzA5VUtKYzBRODRpQis5NXBtM3NLeGVnTnNJRVlMaHd5UC8vMHZKcDQzU3d3ZCtMWjZqaEE5eko4WmZ4NWUxVzN2aWl2R0V4dDJRdTdTVDZHQlY2MzNNSk9oam9HTm1LVWVPTE9ycy84YWE2K3RscFllRllhUHZEOVBMNHpLdHRiOTF6U1NEY0xIa2VDQUQvcmUvaElQZ3ZGdDJnVm82aERqd00zaWwwN0RlcERkUU5BNlp0ZXdEZWlob2pNaGpVekY5QUo2Q0I3RE9IdE94RDJlYmtkSDJpK3cxQUh2UVhrY1doajJmTGtWdGRIVHo0OGVScVgyNjE4aWFrd0ZIT3VVUUYvQytyMU9Pa0NsMWIxTk4rczJ2SjNYS2M0NTNVVmxvRExmTDV2ZmhEN1orSzBOazNxaWFhdWNFeTQ4RlZ0MmlSSncvek9INHdRZUsva3Yrb1lJYUoxSzZSdlhIWXBRWm5XdytQdW8zR3g0WTdDUTZScU03Unp5aGVHeTJpZWI5SEZ4blI1UFl1dlA4T1VmM2ZDSitwd1E5dVBKOFBsblFseEZlTFpoa1dhRVBTUWp2YnBldm5iY3FpcXpvZis1SEFJMTBEYnpZZXZUMW1URnM5eXU4Z01JSC93SExVN2RZK0NFSGhOekJ0SUdJSDErcXBCRG1SUTZ0QTFQVXlJTW9rMmZ3RmdHQ1ViUERDQUtKUjdVOGZrcFZLaW80WklBbithanNwbkJRZ2pzVzNYK2JTSW5uWG41eDhlNFRWdDIvYnpkaC9xQVRVVjdUaW5IbVJoNE4vaE9tbnE2Q0ZVaE9jbnQ3QTgvUDFDUitkRTBCcFZpVkhGb0dyMEFqbzNHaVJiU3JvMjM1VGVjK29OL2FweDcwbkVMalpaMWV5a25ZaVRnYW9LOTlwUHRSczAvbTgzQ0xpTjUwemNNZjY3UzB6bmpmbUI1cTdNcGNhTSs5Nks3YjVIQk9rbnc3T0h2Q3JxaUxSSlRMMEp6TStXR0s5VHo5WnNTZU50cXBNSHRNMlRqeHRYc2QxdlF0T0RSK3h1RGFGdmNrbTgrTHR4YkgreDN3NDg1dWo5SVlxR0FaeTlUMUlaOTRHOHQyYWI4dDhvMFRwa2ZUZFl6OFN6MXJyeWZDWXQzcHhqZW1rTXF1d2gwWTBMcXNIc1U1S0RsQlBkYzJ6dmpaRC9aSXAybUFkZmFZRzIxQWVDZGZaMG9PbXZqTEx1RU1SV0x1S29JZ0ZFYzNYbDByeUpwQ2MydlJKN2dDaWVRRTU4SDdPREdqZnkrUzFlU3B3S0sra0N0cm91Q05yRk1EYlpoTmgyOE5ZYlp1YWY4R2cydGIwbDZCODJMZ2xicFJ3VXErL1JxdnlEZmN4NzhjcENycGovUERMYjllNTlQaGpzc2tMMjNyS0NpNzRGQy9mK0pNcXV4TVZwa1BaRVZySkM0dEhjN2ZES3UvSitaeFZFcUFScDM1UkxKait6NGRYUGxqTWlQd1NpaEhLZlk5ek8yaHpIMHFjaDkwYUNJZUNhUE5HUVQ5bW5JcC9kKzdyenRqSVY3ZkxpZFdoOGg1MGwzN05zT3doOEIxQ29Nejd6bzUxbFMzNUFBRkpaUHR0bHdVY2J4UGRQRlZ6bDZiWDhxUW5UYlR6OWdoeE92RWovZTY2b00yMXdKcVhZMVZXd0taanByT2gwSVc0TTlwYkZ4YmVWZXJTSGVnZS9kei9BZnREMzlNPVwiO1xuXG4vLyB3ZSBtYXkgYmUgcnVubmluZyBpbiBhIGJyb3dzZXIgc28gd2UgbWFrZSBhbiBVaW50OEFycmF5XG5cbnZhciBkYXRhID0gSlNPTi5wYXJzZShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgcGFrby5pbmZsYXRlKGJhc2U2NEFycmF5YnVmZmVyXzIoYmFzZTY0RGVmbGF0ZWREYXRhKSkpKTtcbnZhciB0cmllRGF0YSA9IHBha28uaW5mbGF0ZShiYXNlNjRBcnJheWJ1ZmZlcl8yKGJhc2U2NERlZmxhdGVkVHJpZSkpO1xudmFyIHRyaWUgPSBuZXcgdW5pY29kZVRyaWUodHJpZURhdGEpO1xuXG52YXIgbG9nMiA9IE1hdGgubG9nMiB8fCBmdW5jdGlvbiAobikge1xuICByZXR1cm4gTWF0aC5sb2cobikgLyBNYXRoLkxOMjtcbn07XG5cbnZhciBiaXRzID0gZnVuY3Rpb24gYml0cyhuKSB7XG4gIHJldHVybiBsb2cyKG4pICsgMSB8IDA7XG59OyAvLyBjb21wdXRlIHRoZSBudW1iZXIgb2YgYml0cyBzdG9yZWQgZm9yIGVhY2ggZmllbGRcblxuXG52YXIgQ0FURUdPUllfQklUUyA9IGJpdHMoZGF0YS5jYXRlZ29yaWVzLmxlbmd0aCAtIDEpO1xudmFyIENPTUJJTklOR19CSVRTID0gYml0cyhkYXRhLmNvbWJpbmluZ0NsYXNzZXMubGVuZ3RoIC0gMSk7XG52YXIgU0NSSVBUX0JJVFMgPSBiaXRzKGRhdGEuc2NyaXB0cy5sZW5ndGggLSAxKTtcbnZhciBFQVdfQklUUyA9IGJpdHMoZGF0YS5lYXcubGVuZ3RoIC0gMSk7XG52YXIgTlVNQkVSX0JJVFMgPSAxMDsgLy8gY29tcHV0ZSBzaGlmdCBhbmQgbWFzayB2YWx1ZXMgZm9yIGVhY2ggZmllbGRcblxudmFyIENBVEVHT1JZX1NISUZUID0gQ09NQklOSU5HX0JJVFMgKyBTQ1JJUFRfQklUUyArIEVBV19CSVRTICsgTlVNQkVSX0JJVFM7XG52YXIgQ09NQklOSU5HX1NISUZUID0gU0NSSVBUX0JJVFMgKyBFQVdfQklUUyArIE5VTUJFUl9CSVRTO1xudmFyIFNDUklQVF9TSElGVCA9IEVBV19CSVRTICsgTlVNQkVSX0JJVFM7XG52YXIgRUFXX1NISUZUID0gTlVNQkVSX0JJVFM7XG52YXIgQ0FURUdPUllfTUFTSyA9ICgxIDw8IENBVEVHT1JZX0JJVFMpIC0gMTtcbnZhciBDT01CSU5JTkdfTUFTSyA9ICgxIDw8IENPTUJJTklOR19CSVRTKSAtIDE7XG52YXIgU0NSSVBUX01BU0sgPSAoMSA8PCBTQ1JJUFRfQklUUykgLSAxO1xudmFyIEVBV19NQVNLID0gKDEgPDwgRUFXX0JJVFMpIC0gMTtcbnZhciBOVU1CRVJfTUFTSyA9ICgxIDw8IE5VTUJFUl9CSVRTKSAtIDE7XG52YXIgZ2V0Q2F0ZWdvcnkgPSBmdW5jdGlvbiBnZXRDYXRlZ29yeShjb2RlUG9pbnQpIHtcbiAgdmFyIHZhbCA9IHRyaWUuZ2V0KGNvZGVQb2ludCk7XG4gIHJldHVybiBkYXRhLmNhdGVnb3JpZXNbdmFsID4+IENBVEVHT1JZX1NISUZUICYgQ0FURUdPUllfTUFTS107XG59O1xudmFyIGdldENvbWJpbmluZ0NsYXNzID0gZnVuY3Rpb24gZ2V0Q29tYmluaW5nQ2xhc3MoY29kZVBvaW50KSB7XG4gIHZhciB2YWwgPSB0cmllLmdldChjb2RlUG9pbnQpO1xuICByZXR1cm4gZGF0YS5jb21iaW5pbmdDbGFzc2VzW3ZhbCA+PiBDT01CSU5JTkdfU0hJRlQgJiBDT01CSU5JTkdfTUFTS107XG59O1xudmFyIGdldFNjcmlwdCA9IGZ1bmN0aW9uIGdldFNjcmlwdChjb2RlUG9pbnQpIHtcbiAgdmFyIHZhbCA9IHRyaWUuZ2V0KGNvZGVQb2ludCk7XG4gIHJldHVybiBkYXRhLnNjcmlwdHNbdmFsID4+IFNDUklQVF9TSElGVCAmIFNDUklQVF9NQVNLXTtcbn07XG52YXIgZ2V0RWFzdEFzaWFuV2lkdGggPSBmdW5jdGlvbiBnZXRFYXN0QXNpYW5XaWR0aChjb2RlUG9pbnQpIHtcbiAgdmFyIHZhbCA9IHRyaWUuZ2V0KGNvZGVQb2ludCk7XG4gIHJldHVybiBkYXRhLmVhd1t2YWwgPj4gRUFXX1NISUZUICYgRUFXX01BU0tdO1xufTtcbnZhciBnZXROdW1lcmljVmFsdWUgPSBmdW5jdGlvbiBnZXROdW1lcmljVmFsdWUoY29kZVBvaW50KSB7XG4gIHZhciB2YWwgPSB0cmllLmdldChjb2RlUG9pbnQpO1xuICB2YXIgbnVtID0gdmFsICYgTlVNQkVSX01BU0s7XG5cbiAgaWYgKG51bSA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKG51bSA8PSA1MCkge1xuICAgIHJldHVybiBudW0gLSAxO1xuICB9IGVsc2UgaWYgKG51bSA8IDB4MWUwKSB7XG4gICAgdmFyIG51bWVyYXRvciA9IChudW0gPj4gNCkgLSAxMjtcbiAgICB2YXIgZGVub21pbmF0b3IgPSAobnVtICYgMHhmKSArIDE7XG4gICAgcmV0dXJuIG51bWVyYXRvciAvIGRlbm9taW5hdG9yO1xuICB9IGVsc2UgaWYgKG51bSA8IDB4MzAwKSB7XG4gICAgdmFsID0gKG51bSA+PiA1KSAtIDE0O1xuICAgIHZhciBleHAgPSAobnVtICYgMHgxZikgKyAyO1xuXG4gICAgd2hpbGUgKGV4cCA+IDApIHtcbiAgICAgIHZhbCAqPSAxMDtcbiAgICAgIGV4cC0tO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH0gZWxzZSB7XG4gICAgdmFsID0gKG51bSA+PiAyKSAtIDB4YmY7XG5cbiAgICB2YXIgX2V4cCA9IChudW0gJiAzKSArIDE7XG5cbiAgICB3aGlsZSAoX2V4cCA+IDApIHtcbiAgICAgIHZhbCAqPSA2MDtcbiAgICAgIF9leHAtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG59O1xudmFyIGlzQWxwaGFiZXRpYyA9IGZ1bmN0aW9uIGlzQWxwaGFiZXRpYyhjb2RlUG9pbnQpIHtcbiAgdmFyIGNhdGVnb3J5ID0gZ2V0Q2F0ZWdvcnkoY29kZVBvaW50KTtcbiAgcmV0dXJuIGNhdGVnb3J5ID09PSAnTHUnIHx8IGNhdGVnb3J5ID09PSAnTGwnIHx8IGNhdGVnb3J5ID09PSAnTHQnIHx8IGNhdGVnb3J5ID09PSAnTG0nIHx8IGNhdGVnb3J5ID09PSAnTG8nIHx8IGNhdGVnb3J5ID09PSAnTmwnO1xufTtcbnZhciBpc0RpZ2l0ID0gZnVuY3Rpb24gaXNEaWdpdChjb2RlUG9pbnQpIHtcbiAgcmV0dXJuIGdldENhdGVnb3J5KGNvZGVQb2ludCkgPT09ICdOZCc7XG59O1xudmFyIGlzUHVuY3R1YXRpb24gPSBmdW5jdGlvbiBpc1B1bmN0dWF0aW9uKGNvZGVQb2ludCkge1xuICB2YXIgY2F0ZWdvcnkgPSBnZXRDYXRlZ29yeShjb2RlUG9pbnQpO1xuICByZXR1cm4gY2F0ZWdvcnkgPT09ICdQYycgfHwgY2F0ZWdvcnkgPT09ICdQZCcgfHwgY2F0ZWdvcnkgPT09ICdQZScgfHwgY2F0ZWdvcnkgPT09ICdQZicgfHwgY2F0ZWdvcnkgPT09ICdQaScgfHwgY2F0ZWdvcnkgPT09ICdQbycgfHwgY2F0ZWdvcnkgPT09ICdQcyc7XG59O1xudmFyIGlzTG93ZXJDYXNlID0gZnVuY3Rpb24gaXNMb3dlckNhc2UoY29kZVBvaW50KSB7XG4gIHJldHVybiBnZXRDYXRlZ29yeShjb2RlUG9pbnQpID09PSAnTGwnO1xufTtcbnZhciBpc1VwcGVyQ2FzZSA9IGZ1bmN0aW9uIGlzVXBwZXJDYXNlKGNvZGVQb2ludCkge1xuICByZXR1cm4gZ2V0Q2F0ZWdvcnkoY29kZVBvaW50KSA9PT0gJ0x1Jztcbn07XG52YXIgaXNUaXRsZUNhc2UgPSBmdW5jdGlvbiBpc1RpdGxlQ2FzZShjb2RlUG9pbnQpIHtcbiAgcmV0dXJuIGdldENhdGVnb3J5KGNvZGVQb2ludCkgPT09ICdMdCc7XG59O1xudmFyIGlzV2hpdGVTcGFjZSA9IGZ1bmN0aW9uIGlzV2hpdGVTcGFjZShjb2RlUG9pbnQpIHtcbiAgdmFyIGNhdGVnb3J5ID0gZ2V0Q2F0ZWdvcnkoY29kZVBvaW50KTtcbiAgcmV0dXJuIGNhdGVnb3J5ID09PSAnWnMnIHx8IGNhdGVnb3J5ID09PSAnWmwnIHx8IGNhdGVnb3J5ID09PSAnWnAnO1xufTtcbnZhciBpc0Jhc2VGb3JtID0gZnVuY3Rpb24gaXNCYXNlRm9ybShjb2RlUG9pbnQpIHtcbiAgdmFyIGNhdGVnb3J5ID0gZ2V0Q2F0ZWdvcnkoY29kZVBvaW50KTtcbiAgcmV0dXJuIGNhdGVnb3J5ID09PSAnTmQnIHx8IGNhdGVnb3J5ID09PSAnTm8nIHx8IGNhdGVnb3J5ID09PSAnTmwnIHx8IGNhdGVnb3J5ID09PSAnTHUnIHx8IGNhdGVnb3J5ID09PSAnTGwnIHx8IGNhdGVnb3J5ID09PSAnTHQnIHx8IGNhdGVnb3J5ID09PSAnTG0nIHx8IGNhdGVnb3J5ID09PSAnTG8nIHx8IGNhdGVnb3J5ID09PSAnTWUnIHx8IGNhdGVnb3J5ID09PSAnTWMnO1xufTtcbnZhciBpc01hcmsgPSBmdW5jdGlvbiBpc01hcmsoY29kZVBvaW50KSB7XG4gIHZhciBjYXRlZ29yeSA9IGdldENhdGVnb3J5KGNvZGVQb2ludCk7XG4gIHJldHVybiBjYXRlZ29yeSA9PT0gJ01uJyB8fCBjYXRlZ29yeSA9PT0gJ01lJyB8fCBjYXRlZ29yeSA9PT0gJ01jJztcbn07XG52YXIgdW5pY29kZSA9IHtcbiAgZ2V0Q2F0ZWdvcnk6IGdldENhdGVnb3J5LFxuICBnZXRDb21iaW5pbmdDbGFzczogZ2V0Q29tYmluaW5nQ2xhc3MsXG4gIGdldFNjcmlwdDogZ2V0U2NyaXB0LFxuICBnZXRFYXN0QXNpYW5XaWR0aDogZ2V0RWFzdEFzaWFuV2lkdGgsXG4gIGdldE51bWVyaWNWYWx1ZTogZ2V0TnVtZXJpY1ZhbHVlLFxuICBpc0FscGhhYmV0aWM6IGlzQWxwaGFiZXRpYyxcbiAgaXNEaWdpdDogaXNEaWdpdCxcbiAgaXNQdW5jdHVhdGlvbjogaXNQdW5jdHVhdGlvbixcbiAgaXNMb3dlckNhc2U6IGlzTG93ZXJDYXNlLFxuICBpc1VwcGVyQ2FzZTogaXNVcHBlckNhc2UsXG4gIGlzVGl0bGVDYXNlOiBpc1RpdGxlQ2FzZSxcbiAgaXNXaGl0ZVNwYWNlOiBpc1doaXRlU3BhY2UsXG4gIGlzQmFzZUZvcm06IGlzQmFzZUZvcm0sXG4gIGlzTWFyazogaXNNYXJrXG59O1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB3aGVuIEdQT1MgZG9lcyBub3QgZGVmaW5lICdtYXJrJyBvciAnbWttaycgZmVhdHVyZXNcbiAqIGZvciBwb3NpdGlvbmluZyBtYXJrcyByZWxhdGl2ZSB0byBiYXNlIGdseXBocy4gSXQgdXNlcyB0aGUgdW5pY29kZVxuICogY29tYmluaW5nIGNsYXNzIHByb3BlcnR5IHRvIHBvc2l0aW9uIG1hcmtzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgZnJvbSBIYXJmYnV6eiwgdGhhbmtzIVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JlaGRhZC9oYXJmYnV6ei9ibG9iL21hc3Rlci9zcmMvaGItb3Qtc2hhcGUtZmFsbGJhY2suY2NcbiAqL1xuXG52YXIgVW5pY29kZUxheW91dEVuZ2luZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFVuaWNvZGVMYXlvdXRFbmdpbmUoZm9udCkge1xuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gVW5pY29kZUxheW91dEVuZ2luZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnBvc2l0aW9uR2x5cGhzID0gZnVuY3Rpb24gcG9zaXRpb25HbHlwaHMoZ2x5cGhzLCBwb3NpdGlvbnMpIHtcbiAgICAvLyBmaW5kIGVhY2ggYmFzZSArIG1hcmsgY2x1c3RlciwgYW5kIHBvc2l0aW9uIHRoZSBtYXJrcyByZWxhdGl2ZSB0byB0aGUgYmFzZVxuICAgIHZhciBjbHVzdGVyU3RhcnQgPSAwO1xuICAgIHZhciBjbHVzdGVyRW5kID0gMDtcblxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBnbHlwaHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgZ2x5cGggPSBnbHlwaHNbaW5kZXhdO1xuXG4gICAgICBpZiAoZ2x5cGguaXNNYXJrKSB7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSBsaWdhdHVyZXNcbiAgICAgICAgY2x1c3RlckVuZCA9IGluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNsdXN0ZXJTdGFydCAhPT0gY2x1c3RlckVuZCkge1xuICAgICAgICAgIHRoaXMucG9zaXRpb25DbHVzdGVyKGdseXBocywgcG9zaXRpb25zLCBjbHVzdGVyU3RhcnQsIGNsdXN0ZXJFbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2x1c3RlclN0YXJ0ID0gY2x1c3RlckVuZCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbHVzdGVyU3RhcnQgIT09IGNsdXN0ZXJFbmQpIHtcbiAgICAgIHRoaXMucG9zaXRpb25DbHVzdGVyKGdseXBocywgcG9zaXRpb25zLCBjbHVzdGVyU3RhcnQsIGNsdXN0ZXJFbmQpO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NpdGlvbnM7XG4gIH07XG5cbiAgX3Byb3RvLnBvc2l0aW9uQ2x1c3RlciA9IGZ1bmN0aW9uIHBvc2l0aW9uQ2x1c3RlcihnbHlwaHMsIHBvc2l0aW9ucywgY2x1c3RlclN0YXJ0LCBjbHVzdGVyRW5kKSB7XG4gICAgdmFyIGJhc2UgPSBnbHlwaHNbY2x1c3RlclN0YXJ0XTtcbiAgICB2YXIgYmFzZUJveCA9IGJhc2UuY2JveC5jb3B5KCk7IC8vIGFkanVzdCBib3VuZGluZyBib3ggZm9yIGxpZ2F0dXJlIGdseXBoc1xuXG4gICAgaWYgKGJhc2UuY29kZVBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBMVFIuIFRPRE86IFJUTCBzdXBwb3J0LlxuICAgICAgYmFzZUJveC5taW5YICs9IChiYXNlLmNvZGVQb2ludHMubGVuZ3RoIC0gMSkgKiBiYXNlQm94LndpZHRoIC8gYmFzZS5jb2RlUG9pbnRzLmxlbmd0aDtcbiAgICB9XG5cbiAgICB2YXIgeE9mZnNldCA9IC1wb3NpdGlvbnNbY2x1c3RlclN0YXJ0XS54QWR2YW5jZTtcbiAgICB2YXIgeU9mZnNldCA9IDA7XG4gICAgdmFyIHlHYXAgPSB0aGlzLmZvbnQudW5pdHNQZXJFbSAvIDE2OyAvLyBwb3NpdGlvbiBlYWNoIG9mIHRoZSBtYXJrIGdseXBocyByZWxhdGl2ZSB0byB0aGUgYmFzZSBnbHlwaFxuXG4gICAgZm9yICh2YXIgaW5kZXggPSBjbHVzdGVyU3RhcnQgKyAxOyBpbmRleCA8PSBjbHVzdGVyRW5kOyBpbmRleCsrKSB7XG4gICAgICB2YXIgbWFyayA9IGdseXBoc1tpbmRleF07XG4gICAgICB2YXIgbWFya0JveCA9IG1hcmsuY2JveDtcbiAgICAgIHZhciBwb3NpdGlvbiA9IHBvc2l0aW9uc1tpbmRleF07XG4gICAgICB2YXIgY29tYmluaW5nQ2xhc3MgPSB0aGlzLmdldENvbWJpbmluZ0NsYXNzKG1hcmsuY29kZVBvaW50c1swXSk7XG5cbiAgICAgIGlmIChjb21iaW5pbmdDbGFzcyAhPT0gJ05vdF9SZW9yZGVyZWQnKSB7XG4gICAgICAgIHBvc2l0aW9uLnhPZmZzZXQgPSBwb3NpdGlvbi55T2Zmc2V0ID0gMDsgLy8geCBwb3NpdGlvbmluZ1xuXG4gICAgICAgIHN3aXRjaCAoY29tYmluaW5nQ2xhc3MpIHtcbiAgICAgICAgICBjYXNlICdEb3VibGVfQWJvdmUnOlxuICAgICAgICAgIGNhc2UgJ0RvdWJsZV9CZWxvdyc6XG4gICAgICAgICAgICAvLyBMVFIuIFRPRE86IFJUTCBzdXBwb3J0LlxuICAgICAgICAgICAgcG9zaXRpb24ueE9mZnNldCArPSBiYXNlQm94Lm1pblggLSBtYXJrQm94LndpZHRoIC8gMiAtIG1hcmtCb3gubWluWDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnQXR0YWNoZWRfQmVsb3dfTGVmdCc6XG4gICAgICAgICAgY2FzZSAnQmVsb3dfTGVmdCc6XG4gICAgICAgICAgY2FzZSAnQWJvdmVfTGVmdCc6XG4gICAgICAgICAgICAvLyBsZWZ0IGFsaWduXG4gICAgICAgICAgICBwb3NpdGlvbi54T2Zmc2V0ICs9IGJhc2VCb3gubWluWCAtIG1hcmtCb3gubWluWDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnQXR0YWNoZWRfQWJvdmVfUmlnaHQnOlxuICAgICAgICAgIGNhc2UgJ0JlbG93X1JpZ2h0JzpcbiAgICAgICAgICBjYXNlICdBYm92ZV9SaWdodCc6XG4gICAgICAgICAgICAvLyByaWdodCBhbGlnblxuICAgICAgICAgICAgcG9zaXRpb24ueE9mZnNldCArPSBiYXNlQm94Lm1heFggLSBtYXJrQm94LndpZHRoIC0gbWFya0JveC5taW5YO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gQXR0YWNoZWRfQmVsb3csIEF0dGFjaGVkX0Fib3ZlLCBCZWxvdywgQWJvdmUsIG90aGVyXG4gICAgICAgICAgICAvLyBjZW50ZXIgYWxpZ25cbiAgICAgICAgICAgIHBvc2l0aW9uLnhPZmZzZXQgKz0gYmFzZUJveC5taW5YICsgKGJhc2VCb3gud2lkdGggLSBtYXJrQm94LndpZHRoKSAvIDIgLSBtYXJrQm94Lm1pblg7XG4gICAgICAgIH0gLy8geSBwb3NpdGlvbmluZ1xuXG5cbiAgICAgICAgc3dpdGNoIChjb21iaW5pbmdDbGFzcykge1xuICAgICAgICAgIGNhc2UgJ0RvdWJsZV9CZWxvdyc6XG4gICAgICAgICAgY2FzZSAnQmVsb3dfTGVmdCc6XG4gICAgICAgICAgY2FzZSAnQmVsb3cnOlxuICAgICAgICAgIGNhc2UgJ0JlbG93X1JpZ2h0JzpcbiAgICAgICAgICBjYXNlICdBdHRhY2hlZF9CZWxvd19MZWZ0JzpcbiAgICAgICAgICBjYXNlICdBdHRhY2hlZF9CZWxvdyc6XG4gICAgICAgICAgICAvLyBhZGQgYSBzbWFsbCBnYXAgYmV0d2VlbiB0aGUgZ2x5cGhzIGlmIHRoZXkgYXJlIG5vdCBhdHRhY2hlZFxuICAgICAgICAgICAgaWYgKGNvbWJpbmluZ0NsYXNzID09PSAnQXR0YWNoZWRfQmVsb3dfTGVmdCcgfHwgY29tYmluaW5nQ2xhc3MgPT09ICdBdHRhY2hlZF9CZWxvdycpIHtcbiAgICAgICAgICAgICAgYmFzZUJveC5taW5ZICs9IHlHYXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvc2l0aW9uLnlPZmZzZXQgPSAtYmFzZUJveC5taW5ZIC0gbWFya0JveC5tYXhZO1xuICAgICAgICAgICAgYmFzZUJveC5taW5ZICs9IG1hcmtCb3guaGVpZ2h0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdEb3VibGVfQWJvdmUnOlxuICAgICAgICAgIGNhc2UgJ0Fib3ZlX0xlZnQnOlxuICAgICAgICAgIGNhc2UgJ0Fib3ZlJzpcbiAgICAgICAgICBjYXNlICdBYm92ZV9SaWdodCc6XG4gICAgICAgICAgY2FzZSAnQXR0YWNoZWRfQWJvdmUnOlxuICAgICAgICAgIGNhc2UgJ0F0dGFjaGVkX0Fib3ZlX1JpZ2h0JzpcbiAgICAgICAgICAgIC8vIGFkZCBhIHNtYWxsIGdhcCBiZXR3ZWVuIHRoZSBnbHlwaHMgaWYgdGhleSBhcmUgbm90IGF0dGFjaGVkXG4gICAgICAgICAgICBpZiAoY29tYmluaW5nQ2xhc3MgPT09ICdBdHRhY2hlZF9BYm92ZScgfHwgY29tYmluaW5nQ2xhc3MgPT09ICdBdHRhY2hlZF9BYm92ZV9SaWdodCcpIHtcbiAgICAgICAgICAgICAgYmFzZUJveC5tYXhZICs9IHlHYXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvc2l0aW9uLnlPZmZzZXQgPSBiYXNlQm94Lm1heFkgLSBtYXJrQm94Lm1pblk7XG4gICAgICAgICAgICBiYXNlQm94Lm1heFkgKz0gbWFya0JveC5oZWlnaHQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHBvc2l0aW9uLnhBZHZhbmNlID0gcG9zaXRpb24ueUFkdmFuY2UgPSAwO1xuICAgICAgICBwb3NpdGlvbi54T2Zmc2V0ICs9IHhPZmZzZXQ7XG4gICAgICAgIHBvc2l0aW9uLnlPZmZzZXQgKz0geU9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHhPZmZzZXQgLT0gcG9zaXRpb24ueEFkdmFuY2U7XG4gICAgICAgIHlPZmZzZXQgLT0gcG9zaXRpb24ueUFkdmFuY2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9O1xuXG4gIF9wcm90by5nZXRDb21iaW5pbmdDbGFzcyA9IGZ1bmN0aW9uIGdldENvbWJpbmluZ0NsYXNzKGNvZGVQb2ludCkge1xuICAgIHZhciBjb21iaW5pbmdDbGFzcyA9IHVuaWNvZGUuZ2V0Q29tYmluaW5nQ2xhc3MoY29kZVBvaW50KTsgLy8gVGhhaSAvIExhbyBuZWVkIHNvbWUgcGVyLWNoYXJhY3RlciB3b3JrXG5cbiAgICBpZiAoKGNvZGVQb2ludCAmIH4weGZmKSA9PT0gMHgwZTAwKSB7XG4gICAgICBpZiAoY29tYmluaW5nQ2xhc3MgPT09ICdOb3RfUmVvcmRlcmVkJykge1xuICAgICAgICBzd2l0Y2ggKGNvZGVQb2ludCkge1xuICAgICAgICAgIGNhc2UgMHgwZTMxOlxuICAgICAgICAgIGNhc2UgMHgwZTM0OlxuICAgICAgICAgIGNhc2UgMHgwZTM1OlxuICAgICAgICAgIGNhc2UgMHgwZTM2OlxuICAgICAgICAgIGNhc2UgMHgwZTM3OlxuICAgICAgICAgIGNhc2UgMHgwZTQ3OlxuICAgICAgICAgIGNhc2UgMHgwZTRjOlxuICAgICAgICAgIGNhc2UgMHgwZTNkOlxuICAgICAgICAgIGNhc2UgMHgwZTRlOlxuICAgICAgICAgICAgcmV0dXJuICdBYm92ZV9SaWdodCc7XG5cbiAgICAgICAgICBjYXNlIDB4MGViMTpcbiAgICAgICAgICBjYXNlIDB4MGViNDpcbiAgICAgICAgICBjYXNlIDB4MGViNTpcbiAgICAgICAgICBjYXNlIDB4MGViNjpcbiAgICAgICAgICBjYXNlIDB4MGViNzpcbiAgICAgICAgICBjYXNlIDB4MGViYjpcbiAgICAgICAgICBjYXNlIDB4MGVjYzpcbiAgICAgICAgICBjYXNlIDB4MGVjZDpcbiAgICAgICAgICAgIHJldHVybiAnQWJvdmUnO1xuXG4gICAgICAgICAgY2FzZSAweDBlYmM6XG4gICAgICAgICAgICByZXR1cm4gJ0JlbG93JztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPT09IDB4MGUzYSkge1xuICAgICAgICAvLyB2aXJhbWFcbiAgICAgICAgcmV0dXJuICdCZWxvd19SaWdodCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb21iaW5pbmdDbGFzcykge1xuICAgICAgLy8gSGVicmV3XG4gICAgICBjYXNlICdDQ0MxMCc6IC8vIHNoZXZhXG5cbiAgICAgIGNhc2UgJ0NDQzExJzogLy8gaGF0YWYgc2Vnb2xcblxuICAgICAgY2FzZSAnQ0NDMTInOiAvLyBoYXRhZiBwYXRhaFxuXG4gICAgICBjYXNlICdDQ0MxMyc6IC8vIGhhdGFmIHFhbWF0c1xuXG4gICAgICBjYXNlICdDQ0MxNCc6IC8vIGhpcmlxXG5cbiAgICAgIGNhc2UgJ0NDQzE1JzogLy8gdHNlcmVcblxuICAgICAgY2FzZSAnQ0NDMTYnOiAvLyBzZWdvbFxuXG4gICAgICBjYXNlICdDQ0MxNyc6IC8vIHBhdGFoXG5cbiAgICAgIGNhc2UgJ0NDQzE4JzogLy8gcWFtYXRzXG5cbiAgICAgIGNhc2UgJ0NDQzIwJzogLy8gcXVidXRzXG5cbiAgICAgIGNhc2UgJ0NDQzIyJzpcbiAgICAgICAgLy8gbWV0ZWdcbiAgICAgICAgcmV0dXJuICdCZWxvdyc7XG5cbiAgICAgIGNhc2UgJ0NDQzIzJzpcbiAgICAgICAgLy8gcmFmZVxuICAgICAgICByZXR1cm4gJ0F0dGFjaGVkX0Fib3ZlJztcblxuICAgICAgY2FzZSAnQ0NDMjQnOlxuICAgICAgICAvLyBzaGluIGRvdFxuICAgICAgICByZXR1cm4gJ0Fib3ZlX1JpZ2h0JztcblxuICAgICAgY2FzZSAnQ0NDMjUnOiAvLyBzaW4gZG90XG5cbiAgICAgIGNhc2UgJ0NDQzE5JzpcbiAgICAgICAgLy8gaG9sYW1cbiAgICAgICAgcmV0dXJuICdBYm92ZV9MZWZ0JztcblxuICAgICAgY2FzZSAnQ0NDMjYnOlxuICAgICAgICAvLyBwb2ludCB2YXJpa2FcbiAgICAgICAgcmV0dXJuICdBYm92ZSc7XG5cbiAgICAgIGNhc2UgJ0NDQzIxJzpcbiAgICAgICAgLy8gZGFnZXNoXG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gQXJhYmljIGFuZCBTeXJpYWNcblxuICAgICAgY2FzZSAnQ0NDMjcnOiAvLyBmYXRoYXRhblxuXG4gICAgICBjYXNlICdDQ0MyOCc6IC8vIGRhbW1hdGFuXG5cbiAgICAgIGNhc2UgJ0NDQzMwJzogLy8gZmF0aGFcblxuICAgICAgY2FzZSAnQ0NDMzEnOiAvLyBkYW1tYVxuXG4gICAgICBjYXNlICdDQ0MzMyc6IC8vIHNoYWRkYVxuXG4gICAgICBjYXNlICdDQ0MzNCc6IC8vIHN1a3VuXG5cbiAgICAgIGNhc2UgJ0NDQzM1JzogLy8gc3VwZXJzY3JpcHQgYWxlZlxuXG4gICAgICBjYXNlICdDQ0MzNic6XG4gICAgICAgIC8vIHN1cGVyc2NyaXB0IGFsYXBoXG4gICAgICAgIHJldHVybiAnQWJvdmUnO1xuXG4gICAgICBjYXNlICdDQ0MyOSc6IC8vIGthc3JhdGFuXG5cbiAgICAgIGNhc2UgJ0NDQzMyJzpcbiAgICAgICAgLy8ga2FzcmFcbiAgICAgICAgcmV0dXJuICdCZWxvdyc7XG4gICAgICAvLyBUaGFpXG5cbiAgICAgIGNhc2UgJ0NDQzEwMyc6XG4gICAgICAgIC8vIHNhcmEgdSAvIHNhcmEgdXVcbiAgICAgICAgcmV0dXJuICdCZWxvd19SaWdodCc7XG5cbiAgICAgIGNhc2UgJ0NDQzEwNyc6XG4gICAgICAgIC8vIG1haVxuICAgICAgICByZXR1cm4gJ0Fib3ZlX1JpZ2h0JztcbiAgICAgIC8vIExhb1xuXG4gICAgICBjYXNlICdDQ0MxMTgnOlxuICAgICAgICAvLyBzaWduIHUgLyBzaWduIHV1XG4gICAgICAgIHJldHVybiAnQmVsb3cnO1xuXG4gICAgICBjYXNlICdDQ0MxMjInOlxuICAgICAgICAvLyBtYWlcbiAgICAgICAgcmV0dXJuICdBYm92ZSc7XG4gICAgICAvLyBUaWJldGFuXG5cbiAgICAgIGNhc2UgJ0NDQzEyOSc6IC8vIHNpZ24gYWFcblxuICAgICAgY2FzZSAnQ0NDMTMyJzpcbiAgICAgICAgLy8gc2lnbiB1XG4gICAgICAgIHJldHVybiAnQmVsb3cnO1xuXG4gICAgICBjYXNlICdDQ0MxMzAnOlxuICAgICAgICAvLyBzaWduIGlcbiAgICAgICAgcmV0dXJuICdBYm92ZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbWJpbmluZ0NsYXNzO1xuICB9O1xuXG4gIHJldHVybiBVbmljb2RlTGF5b3V0RW5naW5lO1xufSgpO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQxKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDEoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQxKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMShDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZ2x5cGggYm91bmRpbmcgYm94XG4gKi9cbnZhciBCQm94ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQkJveChtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZKSB7XG4gICAgaWYgKG1pblggPT09IHZvaWQgMCkge1xuICAgICAgbWluWCA9IEluZmluaXR5O1xuICAgIH1cblxuICAgIGlmIChtaW5ZID09PSB2b2lkIDApIHtcbiAgICAgIG1pblkgPSBJbmZpbml0eTtcbiAgICB9XG5cbiAgICBpZiAobWF4WCA9PT0gdm9pZCAwKSB7XG4gICAgICBtYXhYID0gLUluZmluaXR5O1xuICAgIH1cblxuICAgIGlmIChtYXhZID09PSB2b2lkIDApIHtcbiAgICAgIG1heFkgPSAtSW5maW5pdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gWCBwb3NpdGlvbiBpbiB0aGUgYm91bmRpbmcgYm94XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLm1pblggPSBtaW5YO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIFkgcG9zaXRpb24gaW4gdGhlIGJvdW5kaW5nIGJveFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgICB0aGlzLm1pblkgPSBtaW5ZO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhtaW11bSBYIHBvc2l0aW9uIGluIHRoZSBib3VuZGluZyBib3hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gICAgdGhpcy5tYXhYID0gbWF4WDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4bWltdW0gWSBwb3NpdGlvbiBpbiB0aGUgYm91bmRpbmcgYm94XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICAgIHRoaXMubWF4WSA9IG1heFk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiB0aGUgYm91bmRpbmcgYm94XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IEJCb3gucHJvdG90eXBlO1xuXG4gIF9wcm90by5hZGRQb2ludCA9IGZ1bmN0aW9uIGFkZFBvaW50KHgsIHkpIHtcbiAgICBpZiAoTWF0aC5hYnMoeCkgIT09IEluZmluaXR5KSB7XG4gICAgICBpZiAoeCA8IHRoaXMubWluWCkge1xuICAgICAgICB0aGlzLm1pblggPSB4O1xuICAgICAgfVxuXG4gICAgICBpZiAoeCA+IHRoaXMubWF4WCkge1xuICAgICAgICB0aGlzLm1heFggPSB4O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChNYXRoLmFicyh5KSAhPT0gSW5maW5pdHkpIHtcbiAgICAgIGlmICh5IDwgdGhpcy5taW5ZKSB7XG4gICAgICAgIHRoaXMubWluWSA9IHk7XG4gICAgICB9XG5cbiAgICAgIGlmICh5ID4gdGhpcy5tYXhZKSB7XG4gICAgICAgIHRoaXMubWF4WSA9IHk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jb3B5ID0gZnVuY3Rpb24gY29weSgpIHtcbiAgICByZXR1cm4gbmV3IEJCb3godGhpcy5taW5YLCB0aGlzLm1pblksIHRoaXMubWF4WCwgdGhpcy5tYXhZKTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MkMShCQm94LCBbe1xuICAgIGtleTogXCJ3aWR0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubWF4WCAtIHRoaXMubWluWDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgYm94XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImhlaWdodFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubWF4WSAtIHRoaXMubWluWTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQkJveDtcbn0oKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ2KG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ2KG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ2KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkNihvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDYobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQ2KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuLy8gRGF0YSBmcm9tIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9zY3JpcHR0YWdzLmh0bVxuLy8gYW5kIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VOSURBVEEvUHJvcGVydHlWYWx1ZUFsaWFzZXMudHh0LlxuXG52YXIgVU5JQ09ERV9TQ1JJUFRTID0ge1xuICBDYXVjYXNpYW5fQWxiYW5pYW46ICdhZ2hiJyxcbiAgQXJhYmljOiAnYXJhYicsXG4gIEltcGVyaWFsX0FyYW1haWM6ICdhcm1pJyxcbiAgQXJtZW5pYW46ICdhcm1uJyxcbiAgQXZlc3RhbjogJ2F2c3QnLFxuICBCYWxpbmVzZTogJ2JhbGknLFxuICBCYW11bTogJ2JhbXUnLFxuICBCYXNzYV9WYWg6ICdiYXNzJyxcbiAgQmF0YWs6ICdiYXRrJyxcbiAgQmVuZ2FsaTogWydibmcyJywgJ2JlbmcnXSxcbiAgQm9wb21vZm86ICdib3BvJyxcbiAgQnJhaG1pOiAnYnJhaCcsXG4gIEJyYWlsbGU6ICdicmFpJyxcbiAgQnVnaW5lc2U6ICdidWdpJyxcbiAgQnVoaWQ6ICdidWhkJyxcbiAgQ2hha21hOiAnY2FrbScsXG4gIENhbmFkaWFuX0Fib3JpZ2luYWw6ICdjYW5zJyxcbiAgQ2FyaWFuOiAnY2FyaScsXG4gIENoYW06ICdjaGFtJyxcbiAgQ2hlcm9rZWU6ICdjaGVyJyxcbiAgQ29wdGljOiAnY29wdCcsXG4gIEN5cHJpb3Q6ICdjcHJ0JyxcbiAgQ3lyaWxsaWM6ICdjeXJsJyxcbiAgRGV2YW5hZ2FyaTogWydkZXYyJywgJ2RldmEnXSxcbiAgRGVzZXJldDogJ2RzcnQnLFxuICBEdXBsb3lhbjogJ2R1cGwnLFxuICBFZ3lwdGlhbl9IaWVyb2dseXBoczogJ2VneXAnLFxuICBFbGJhc2FuOiAnZWxiYScsXG4gIEV0aGlvcGljOiAnZXRoaScsXG4gIEdlb3JnaWFuOiAnZ2VvcicsXG4gIEdsYWdvbGl0aWM6ICdnbGFnJyxcbiAgR290aGljOiAnZ290aCcsXG4gIEdyYW50aGE6ICdncmFuJyxcbiAgR3JlZWs6ICdncmVrJyxcbiAgR3VqYXJhdGk6IFsnZ2pyMicsICdndWpyJ10sXG4gIEd1cm11a2hpOiBbJ2d1cjInLCAnZ3VydSddLFxuICBIYW5ndWw6ICdoYW5nJyxcbiAgSGFuOiAnaGFuaScsXG4gIEhhbnVub286ICdoYW5vJyxcbiAgSGVicmV3OiAnaGVicicsXG4gIEhpcmFnYW5hOiAnaGlyYScsXG4gIFBhaGF3aF9IbW9uZzogJ2htbmcnLFxuICBLYXRha2FuYV9Pcl9IaXJhZ2FuYTogJ2hya3QnLFxuICBPbGRfSXRhbGljOiAnaXRhbCcsXG4gIEphdmFuZXNlOiAnamF2YScsXG4gIEtheWFoX0xpOiAna2FsaScsXG4gIEthdGFrYW5hOiAna2FuYScsXG4gIEtoYXJvc2h0aGk6ICdraGFyJyxcbiAgS2htZXI6ICdraG1yJyxcbiAgS2hvamtpOiAna2hvaicsXG4gIEthbm5hZGE6IFsna25kMicsICdrbmRhJ10sXG4gIEthaXRoaTogJ2t0aGknLFxuICBUYWlfVGhhbTogJ2xhbmEnLFxuICBMYW86ICdsYW8gJyxcbiAgTGF0aW46ICdsYXRuJyxcbiAgTGVwY2hhOiAnbGVwYycsXG4gIExpbWJ1OiAnbGltYicsXG4gIExpbmVhcl9BOiAnbGluYScsXG4gIExpbmVhcl9COiAnbGluYicsXG4gIExpc3U6ICdsaXN1JyxcbiAgTHljaWFuOiAnbHljaScsXG4gIEx5ZGlhbjogJ2x5ZGknLFxuICBNYWhhamFuaTogJ21haGonLFxuICBNYW5kYWljOiAnbWFuZCcsXG4gIE1hbmljaGFlYW46ICdtYW5pJyxcbiAgTWVuZGVfS2lrYWt1aTogJ21lbmQnLFxuICBNZXJvaXRpY19DdXJzaXZlOiAnbWVyYycsXG4gIE1lcm9pdGljX0hpZXJvZ2x5cGhzOiAnbWVybycsXG4gIE1hbGF5YWxhbTogWydtbG0yJywgJ21seW0nXSxcbiAgTW9kaTogJ21vZGknLFxuICBNb25nb2xpYW46ICdtb25nJyxcbiAgTXJvOiAnbXJvbycsXG4gIE1lZXRlaV9NYXllazogJ210ZWknLFxuICBNeWFubWFyOiBbJ215bTInLCAnbXltciddLFxuICBPbGRfTm9ydGhfQXJhYmlhbjogJ25hcmInLFxuICBOYWJhdGFlYW46ICduYmF0JyxcbiAgTmtvOiAnbmtvICcsXG4gIE9naGFtOiAnb2dhbScsXG4gIE9sX0NoaWtpOiAnb2xjaycsXG4gIE9sZF9UdXJraWM6ICdvcmtoJyxcbiAgT3JpeWE6IFsnb3J5MicsICdvcnlhJ10sXG4gIE9zbWFueWE6ICdvc21hJyxcbiAgUGFsbXlyZW5lOiAncGFsbScsXG4gIFBhdV9DaW5fSGF1OiAncGF1YycsXG4gIE9sZF9QZXJtaWM6ICdwZXJtJyxcbiAgUGhhZ3NfUGE6ICdwaGFnJyxcbiAgSW5zY3JpcHRpb25hbF9QYWhsYXZpOiAncGhsaScsXG4gIFBzYWx0ZXJfUGFobGF2aTogJ3BobHAnLFxuICBQaG9lbmljaWFuOiAncGhueCcsXG4gIE1pYW86ICdwbHJkJyxcbiAgSW5zY3JpcHRpb25hbF9QYXJ0aGlhbjogJ3BydGknLFxuICBSZWphbmc6ICdyam5nJyxcbiAgUnVuaWM6ICdydW5yJyxcbiAgU2FtYXJpdGFuOiAnc2FtcicsXG4gIE9sZF9Tb3V0aF9BcmFiaWFuOiAnc2FyYicsXG4gIFNhdXJhc2h0cmE6ICdzYXVyJyxcbiAgU2hhdmlhbjogJ3NoYXcnLFxuICBTaGFyYWRhOiAnc2hyZCcsXG4gIFNpZGRoYW06ICdzaWRkJyxcbiAgS2h1ZGF3YWRpOiAnc2luZCcsXG4gIFNpbmhhbGE6ICdzaW5oJyxcbiAgU29yYV9Tb21wZW5nOiAnc29yYScsXG4gIFN1bmRhbmVzZTogJ3N1bmQnLFxuICBTeWxvdGlfTmFncmk6ICdzeWxvJyxcbiAgU3lyaWFjOiAnc3lyYycsXG4gIFRhZ2JhbndhOiAndGFnYicsXG4gIFRha3JpOiAndGFrcicsXG4gIFRhaV9MZTogJ3RhbGUnLFxuICBOZXdfVGFpX0x1ZTogJ3RhbHUnLFxuICBUYW1pbDogWyd0bWwyJywgJ3RhbWwnXSxcbiAgVGFpX1ZpZXQ6ICd0YXZ0JyxcbiAgVGVsdWd1OiBbJ3RlbDInLCAndGVsdSddLFxuICBUaWZpbmFnaDogJ3RmbmcnLFxuICBUYWdhbG9nOiAndGdsZycsXG4gIFRoYWFuYTogJ3RoYWEnLFxuICBUaGFpOiAndGhhaScsXG4gIFRpYmV0YW46ICd0aWJ0JyxcbiAgVGlyaHV0YTogJ3RpcmgnLFxuICBVZ2FyaXRpYzogJ3VnYXInLFxuICBWYWk6ICd2YWkgJyxcbiAgV2FyYW5nX0NpdGk6ICd3YXJhJyxcbiAgT2xkX1BlcnNpYW46ICd4cGVvJyxcbiAgQ3VuZWlmb3JtOiAneHN1eCcsXG4gIFlpOiAneWkgICcsXG4gIEluaGVyaXRlZDogJ3ppbmgnLFxuICBDb21tb246ICd6eXl5JyxcbiAgVW5rbm93bjogJ3p6enonXG59O1xudmFyIE9QRU5UWVBFX1NDUklQVFMgPSB7fTtcblxuZm9yICh2YXIgc2NyaXB0IGluIFVOSUNPREVfU0NSSVBUUykge1xuICB2YXIgdGFnID0gVU5JQ09ERV9TQ1JJUFRTW3NjcmlwdF07XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFnKSkge1xuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkNih0YWcpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIHQgPSBfc3RlcC52YWx1ZTtcbiAgICAgIE9QRU5UWVBFX1NDUklQVFNbdF0gPSBzY3JpcHQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIE9QRU5UWVBFX1NDUklQVFNbdGFnXSA9IHNjcmlwdDtcbiAgfVxufVxuZnVuY3Rpb24gZnJvbU9wZW5UeXBlKHRhZykge1xuICByZXR1cm4gT1BFTlRZUEVfU0NSSVBUU1t0YWddO1xufVxuZnVuY3Rpb24gZm9yU3RyaW5nKHN0cmluZykge1xuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aDtcbiAgdmFyIGlkeCA9IDA7XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHZhciBjb2RlID0gc3RyaW5nLmNoYXJDb2RlQXQoaWR4KyspOyAvLyBDaGVjayBpZiB0aGlzIGlzIGEgaGlnaCBzdXJyb2dhdGVcblxuICAgIGlmICgweGQ4MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4ZGJmZiAmJiBpZHggPCBsZW4pIHtcbiAgICAgIHZhciBuZXh0ID0gc3RyaW5nLmNoYXJDb2RlQXQoaWR4KTsgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGxvdyBzdXJyb2dhdGVcblxuICAgICAgaWYgKDB4ZGMwMCA8PSBuZXh0ICYmIG5leHQgPD0gMHhkZmZmKSB7XG4gICAgICAgIGlkeCsrO1xuICAgICAgICBjb2RlID0gKChjb2RlICYgMHgzRkYpIDw8IDEwKSArIChuZXh0ICYgMHgzRkYpICsgMHgxMDAwMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX3NjcmlwdCA9IHVuaWNvZGUuZ2V0U2NyaXB0KGNvZGUpO1xuXG4gICAgaWYgKF9zY3JpcHQgIT09ICdDb21tb24nICYmIF9zY3JpcHQgIT09ICdJbmhlcml0ZWQnICYmIF9zY3JpcHQgIT09ICdVbmtub3duJykge1xuICAgICAgcmV0dXJuIFVOSUNPREVfU0NSSVBUU1tfc2NyaXB0XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gVU5JQ09ERV9TQ1JJUFRTLlVua25vd247XG59XG5mdW5jdGlvbiBmb3JDb2RlUG9pbnRzKGNvZGVQb2ludHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNvZGVQb2ludCA9IGNvZGVQb2ludHNbaV07XG5cbiAgICB2YXIgX3NjcmlwdDIgPSB1bmljb2RlLmdldFNjcmlwdChjb2RlUG9pbnQpO1xuXG4gICAgaWYgKF9zY3JpcHQyICE9PSAnQ29tbW9uJyAmJiBfc2NyaXB0MiAhPT0gJ0luaGVyaXRlZCcgJiYgX3NjcmlwdDIgIT09ICdVbmtub3duJykge1xuICAgICAgcmV0dXJuIFVOSUNPREVfU0NSSVBUU1tfc2NyaXB0Ml07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFVOSUNPREVfU0NSSVBUUy5Vbmtub3duO1xufSAvLyBUaGUgc2NyaXB0cyBpbiB0aGlzIG1hcCBhcmUgd3JpdHRlbiBmcm9tIHJpZ2h0IHRvIGxlZnRcblxudmFyIFJUTCA9IHtcbiAgYXJhYjogdHJ1ZSxcbiAgLy8gQXJhYmljXG4gIGhlYnI6IHRydWUsXG4gIC8vIEhlYnJld1xuICBzeXJjOiB0cnVlLFxuICAvLyBTeXJpYWNcbiAgdGhhYTogdHJ1ZSxcbiAgLy8gVGhhYW5hXG4gIGNwcnQ6IHRydWUsXG4gIC8vIEN5cHJpb3QgU3lsbGFiYXJ5XG4gIGtoYXI6IHRydWUsXG4gIC8vIEtoYXJvc3RoaVxuICBwaG54OiB0cnVlLFxuICAvLyBQaG9lbmljaWFuXG4gICdua28gJzogdHJ1ZSxcbiAgLy8gTidLb1xuICBseWRpOiB0cnVlLFxuICAvLyBMeWRpYW5cbiAgYXZzdDogdHJ1ZSxcbiAgLy8gQXZlc3RhblxuICBhcm1pOiB0cnVlLFxuICAvLyBJbXBlcmlhbCBBcmFtYWljXG4gIHBobGk6IHRydWUsXG4gIC8vIEluc2NyaXB0aW9uYWwgUGFobGF2aVxuICBwcnRpOiB0cnVlLFxuICAvLyBJbnNjcmlwdGlvbmFsIFBhcnRoaWFuXG4gIHNhcmI6IHRydWUsXG4gIC8vIE9sZCBTb3V0aCBBcmFiaWFuXG4gIG9ya2g6IHRydWUsXG4gIC8vIE9sZCBUdXJraWMsIE9ya2hvbiBSdW5pY1xuICBzYW1yOiB0cnVlLFxuICAvLyBTYW1hcml0YW5cbiAgbWFuZDogdHJ1ZSxcbiAgLy8gTWFuZGFpYywgTWFuZGFlYW5cbiAgbWVyYzogdHJ1ZSxcbiAgLy8gTWVyb2l0aWMgQ3Vyc2l2ZVxuICBtZXJvOiB0cnVlLFxuICAvLyBNZXJvaXRpYyBIaWVyb2dseXBoc1xuICAvLyBVbmljb2RlIDcuMCAobm90IGxpc3RlZCBvbiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9vdHNwZWMvc2NyaXB0dGFncy5odG0pXG4gIG1hbmk6IHRydWUsXG4gIC8vIE1hbmljaGFlYW5cbiAgbWVuZDogdHJ1ZSxcbiAgLy8gTWVuZGUgS2lrYWt1aVxuICBuYmF0OiB0cnVlLFxuICAvLyBOYWJhdGFlYW5cbiAgbmFyYjogdHJ1ZSxcbiAgLy8gT2xkIE5vcnRoIEFyYWJpYW5cbiAgcGFsbTogdHJ1ZSxcbiAgLy8gUGFsbXlyZW5lXG4gIHBobHA6IHRydWUgLy8gUHNhbHRlciBQYWhsYXZpXG5cbn07XG5mdW5jdGlvbiBkaXJlY3Rpb24oc2NyaXB0KSB7XG4gIGlmIChSVExbc2NyaXB0XSkge1xuICAgIHJldHVybiAncnRsJztcbiAgfVxuXG4gIHJldHVybiAnbHRyJztcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ3KG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ3KG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSQ3KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkNyhvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDcobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSQ3KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQyKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDIoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQyKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkMihDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cbi8qKlxuICogUmVwcmVzZW50cyBhIHJ1biBvZiBHbHlwaCBhbmQgR2x5cGhQb3NpdGlvbiBvYmplY3RzLlxuICogUmV0dXJuZWQgYnkgdGhlIGZvbnQgbGF5b3V0IG1ldGhvZC5cbiAqL1xuXG52YXIgR2x5cGhSdW4gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHbHlwaFJ1bihnbHlwaHMsIGZlYXR1cmVzLCBzY3JpcHQsIGxhbmd1YWdlLCBkaXJlY3Rpb24kMSkge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEdseXBoIG9iamVjdHMgaW4gdGhlIHJ1blxuICAgICAqIEB0eXBlIHtHbHlwaFtdfVxuICAgICAqL1xuICAgIHRoaXMuZ2x5cGhzID0gZ2x5cGhzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEdseXBoUG9zaXRpb24gb2JqZWN0cyBmb3IgZWFjaCBnbHlwaCBpbiB0aGUgcnVuXG4gICAgICogQHR5cGUge0dseXBoUG9zaXRpb25bXX1cbiAgICAgKi9cblxuICAgIHRoaXMucG9zaXRpb25zID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2NyaXB0IHRoYXQgd2FzIHJlcXVlc3RlZCBmb3Igc2hhcGluZy4gVGhpcyB3YXMgZWl0aGVyIHBhc3NlZCBpbiBvciBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFuZ3VhZ2UgcmVxdWVzdGVkIGZvciBzaGFwaW5nLCBhcyBwYXNzZWQgaW4uIElmIGBudWxsYCwgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgZm9yIHRoZVxuICAgICAqIHNjcmlwdCB3YXMgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlIHx8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRpcmVjdGlvbiByZXF1ZXN0ZWQgZm9yIHNoYXBpbmcsIGFzIHBhc3NlZCBpbiAoZWl0aGVyIGx0ciBvciBydGwpLlxuICAgICAqIElmIGBudWxsYCwgdGhlIGRlZmF1bHQgZGlyZWN0aW9uIG9mIHRoZSBzY3JpcHQgaXMgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gICAgdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb24kMSB8fCBkaXJlY3Rpb24oc2NyaXB0KTtcbiAgICAvKipcbiAgICAgKiBUaGUgZmVhdHVyZXMgcmVxdWVzdGVkIGR1cmluZyBzaGFwaW5nLiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgdXNlclxuICAgICAqIHNwZWNpZmllZCBmZWF0dXJlcyBhbmQgZmVhdHVyZXMgY2hvc2VuIGJ5IHRoZSBzaGFwZXIuXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKi9cblxuICAgIHRoaXMuZmVhdHVyZXMgPSB7fTsgLy8gQ29udmVydCBmZWF0dXJlcyB0byBhbiBvYmplY3RcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGZlYXR1cmVzKSkge1xuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ3KGZlYXR1cmVzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHRhZyA9IF9zdGVwLnZhbHVlO1xuICAgICAgICB0aGlzLmZlYXR1cmVzW3RhZ10gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZlYXR1cmVzID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIHRvdGFsIGFkdmFuY2Ugd2lkdGggb2YgdGhlIHJ1bi5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MkMihHbHlwaFJ1biwgW3tcbiAgICBrZXk6IFwiYWR2YW5jZVdpZHRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgd2lkdGggPSAwO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSQ3KHRoaXMucG9zaXRpb25zKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICB3aWR0aCArPSBwb3NpdGlvbi54QWR2YW5jZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYWR2YW5jZSBoZWlnaHQgb2YgdGhlIHJ1bi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWR2YW5jZUhlaWdodFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGhlaWdodCA9IDA7XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDcodGhpcy5wb3NpdGlvbnMpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBfc3RlcDMudmFsdWU7XG4gICAgICAgIGhlaWdodCArPSBwb3NpdGlvbi55QWR2YW5jZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGJvdW5kaW5nIGJveCBjb250YWluaW5nIGFsbCBnbHlwaHMgaW4gdGhlIHJ1bi5cbiAgICAgKiBAdHlwZSB7QkJveH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImJib3hcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBiYm94ID0gbmV3IEJCb3goKTtcbiAgICAgIHZhciB4ID0gMDtcbiAgICAgIHZhciB5ID0gMDtcblxuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgZ2x5cGggPSB0aGlzLmdseXBoc1tpbmRleF07XG4gICAgICAgIHZhciBwID0gdGhpcy5wb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgICB2YXIgYiA9IGdseXBoLmJib3g7XG4gICAgICAgIGJib3guYWRkUG9pbnQoYi5taW5YICsgeCArIHAueE9mZnNldCwgYi5taW5ZICsgeSArIHAueU9mZnNldCk7XG4gICAgICAgIGJib3guYWRkUG9pbnQoYi5tYXhYICsgeCArIHAueE9mZnNldCwgYi5tYXhZICsgeSArIHAueU9mZnNldCk7XG4gICAgICAgIHggKz0gcC54QWR2YW5jZTtcbiAgICAgICAgeSArPSBwLnlBZHZhbmNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmJveDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gR2x5cGhSdW47XG59KCk7XG5cbi8qKlxuICogUmVwcmVzZW50cyBwb3NpdGlvbmluZyBpbmZvcm1hdGlvbiBmb3IgYSBnbHlwaCBpbiBhIEdseXBoUnVuLlxuICovXG52YXIgR2x5cGhQb3NpdGlvbiA9IGZ1bmN0aW9uIEdseXBoUG9zaXRpb24oeEFkdmFuY2UsIHlBZHZhbmNlLCB4T2Zmc2V0LCB5T2Zmc2V0KSB7XG4gIGlmICh4QWR2YW5jZSA9PT0gdm9pZCAwKSB7XG4gICAgeEFkdmFuY2UgPSAwO1xuICB9XG5cbiAgaWYgKHlBZHZhbmNlID09PSB2b2lkIDApIHtcbiAgICB5QWR2YW5jZSA9IDA7XG4gIH1cblxuICBpZiAoeE9mZnNldCA9PT0gdm9pZCAwKSB7XG4gICAgeE9mZnNldCA9IDA7XG4gIH1cblxuICBpZiAoeU9mZnNldCA9PT0gdm9pZCAwKSB7XG4gICAgeU9mZnNldCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFtb3VudCB0byBtb3ZlIHRoZSB2aXJ0dWFsIHBlbiBpbiB0aGUgWCBkaXJlY3Rpb24gYWZ0ZXIgcmVuZGVyaW5nIHRoaXMgZ2x5cGguXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICB0aGlzLnhBZHZhbmNlID0geEFkdmFuY2U7XG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IHRvIG1vdmUgdGhlIHZpcnR1YWwgcGVuIGluIHRoZSBZIGRpcmVjdGlvbiBhZnRlciByZW5kZXJpbmcgdGhpcyBnbHlwaC5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG5cbiAgdGhpcy55QWR2YW5jZSA9IHlBZHZhbmNlO1xuICAvKipcbiAgICogVGhlIG9mZnNldCBmcm9tIHRoZSBwZW4gcG9zaXRpb24gaW4gdGhlIFggZGlyZWN0aW9uIGF0IHdoaWNoIHRvIHJlbmRlciB0aGlzIGdseXBoLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuICB0aGlzLnhPZmZzZXQgPSB4T2Zmc2V0O1xuICAvKipcbiAgICogVGhlIG9mZnNldCBmcm9tIHRoZSBwZW4gcG9zaXRpb24gaW4gdGhlIFkgZGlyZWN0aW9uIGF0IHdoaWNoIHRvIHJlbmRlciB0aGlzIGdseXBoLlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cblxuICB0aGlzLnlPZmZzZXQgPSB5T2Zmc2V0O1xufTtcblxuLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDkvQXBwZW5kaXhGLmh0bWxcbi8vIGFuZCAvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9Db3JlVGV4dC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9IZWFkZXJzL1NGTlRMYXlvdXRUeXBlcy5oIG9uIGEgTWFjXG52YXIgZmVhdHVyZXMgPSB7XG4gIGFsbFR5cG9ncmFwaGljRmVhdHVyZXM6IHtcbiAgICBjb2RlOiAwLFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgYWxsVHlwZUZlYXR1cmVzOiAwXG4gIH0sXG4gIGxpZ2F0dXJlczoge1xuICAgIGNvZGU6IDEsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICByZXF1aXJlZExpZ2F0dXJlczogMCxcbiAgICBjb21tb25MaWdhdHVyZXM6IDIsXG4gICAgcmFyZUxpZ2F0dXJlczogNCxcbiAgICAvLyBsb2dvczogNlxuICAgIHJlYnVzUGljdHVyZXM6IDgsXG4gICAgZGlwaHRob25nTGlnYXR1cmVzOiAxMCxcbiAgICBzcXVhcmVkTGlnYXR1cmVzOiAxMixcbiAgICBhYmJyZXZTcXVhcmVkTGlnYXR1cmVzOiAxNCxcbiAgICBzeW1ib2xMaWdhdHVyZXM6IDE2LFxuICAgIGNvbnRleHR1YWxMaWdhdHVyZXM6IDE4LFxuICAgIGhpc3RvcmljYWxMaWdhdHVyZXM6IDIwXG4gIH0sXG4gIGN1cnNpdmVDb25uZWN0aW9uOiB7XG4gICAgY29kZTogMixcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgdW5jb25uZWN0ZWQ6IDAsXG4gICAgcGFydGlhbGx5Q29ubmVjdGVkOiAxLFxuICAgIGN1cnNpdmU6IDJcbiAgfSxcbiAgbGV0dGVyQ2FzZToge1xuICAgIGNvZGU6IDMsXG4gICAgZXhjbHVzaXZlOiB0cnVlXG4gIH0sXG4gIC8vIHVwcGVyQW5kTG93ZXJDYXNlOiAwICAgICAgICAgICMgZGVwcmVjYXRlZFxuICAvLyBhbGxDYXBzOiAxICAgICAgICAgICAgICAgICAgICAjIGRlcHJlY2F0ZWRcbiAgLy8gYWxsTG93ZXJDYXNlOiAyICAgICAgICAgICAgICAgIyBkZXByZWNhdGVkXG4gIC8vIHNtYWxsQ2FwczogMyAgICAgICAgICAgICAgICAgICMgZGVwcmVjYXRlZFxuICAvLyBpbml0aWFsQ2FwczogNCAgICAgICAgICAgICAgICAjIGRlcHJlY2F0ZWRcbiAgLy8gaW5pdGlhbENhcHNBbmRTbWFsbENhcHM6IDUgICAgIyBkZXByZWNhdGVkXG4gIHZlcnRpY2FsU3Vic3RpdHV0aW9uOiB7XG4gICAgY29kZTogNCxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIHN1YnN0aXR1dGVWZXJ0aWNhbEZvcm1zOiAwXG4gIH0sXG4gIGxpbmd1aXN0aWNSZWFycmFuZ2VtZW50OiB7XG4gICAgY29kZTogNSxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIGxpbmd1aXN0aWNSZWFycmFuZ2VtZW50OiAwXG4gIH0sXG4gIG51bWJlclNwYWNpbmc6IHtcbiAgICBjb2RlOiA2LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBtb25vc3BhY2VkTnVtYmVyczogMCxcbiAgICBwcm9wb3J0aW9uYWxOdW1iZXJzOiAxLFxuICAgIHRoaXJkV2lkdGhOdW1iZXJzOiAyLFxuICAgIHF1YXJ0ZXJXaWR0aE51bWJlcnM6IDNcbiAgfSxcbiAgc21hcnRTd2FzaDoge1xuICAgIGNvZGU6IDgsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICB3b3JkSW5pdGlhbFN3YXNoZXM6IDAsXG4gICAgd29yZEZpbmFsU3dhc2hlczogMixcbiAgICAvLyBsaW5lSW5pdGlhbFN3YXNoZXM6IDRcbiAgICAvLyBsaW5lRmluYWxTd2FzaGVzOiA2XG4gICAgbm9uRmluYWxTd2FzaGVzOiA4XG4gIH0sXG4gIGRpYWNyaXRpY3M6IHtcbiAgICBjb2RlOiA5LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBzaG93RGlhY3JpdGljczogMCxcbiAgICBoaWRlRGlhY3JpdGljczogMSxcbiAgICBkZWNvbXBvc2VEaWFjcml0aWNzOiAyXG4gIH0sXG4gIHZlcnRpY2FsUG9zaXRpb246IHtcbiAgICBjb2RlOiAxMCxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgbm9ybWFsUG9zaXRpb246IDAsXG4gICAgc3VwZXJpb3JzOiAxLFxuICAgIGluZmVyaW9yczogMixcbiAgICBvcmRpbmFsczogMyxcbiAgICBzY2llbnRpZmljSW5mZXJpb3JzOiA0XG4gIH0sXG4gIGZyYWN0aW9uczoge1xuICAgIGNvZGU6IDExLFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBub0ZyYWN0aW9uczogMCxcbiAgICB2ZXJ0aWNhbEZyYWN0aW9uczogMSxcbiAgICBkaWFnb25hbEZyYWN0aW9uczogMlxuICB9LFxuICBvdmVybGFwcGluZ0NoYXJhY3RlcnM6IHtcbiAgICBjb2RlOiAxMyxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIHByZXZlbnRPdmVybGFwOiAwXG4gIH0sXG4gIHR5cG9ncmFwaGljRXh0cmFzOiB7XG4gICAgY29kZTogMTQsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICAvLyBoeXBoZW5zVG9FbURhc2g6IDBcbiAgICAvLyBoeXBoZW5Ub0VuRGFzaDogMlxuICAgIHNsYXNoZWRaZXJvOiA0XG4gIH0sXG4gIC8vIGZvcm1JbnRlcnJvYmFuZzogNlxuICAvLyBzbWFydFF1b3RlczogOFxuICAvLyBwZXJpb2RzVG9FbGxpcHNpczogMTBcbiAgbWF0aGVtYXRpY2FsRXh0cmFzOiB7XG4gICAgY29kZTogMTUsXG4gICAgZXhjbHVzaXZlOiBmYWxzZSxcbiAgICAvLyBoeXBoZW5Ub01pbnVzOiAwXG4gICAgLy8gYXN0ZXJpc3RvTXVsdGlwbHk6IDJcbiAgICAvLyBzbGFzaFRvRGl2aWRlOiA0XG4gICAgLy8gaW5lcXVhbGl0eUxpZ2F0dXJlczogNlxuICAgIC8vIGV4cG9uZW50czogOFxuICAgIG1hdGhlbWF0aWNhbEdyZWVrOiAxMFxuICB9LFxuICBvcm5hbWVudFNldHM6IHtcbiAgICBjb2RlOiAxNixcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgbm9Pcm5hbWVudHM6IDAsXG4gICAgZGluZ2JhdHM6IDEsXG4gICAgcGlDaGFyYWN0ZXJzOiAyLFxuICAgIGZsZXVyb25zOiAzLFxuICAgIGRlY29yYXRpdmVCb3JkZXJzOiA0LFxuICAgIGludGVybmF0aW9uYWxTeW1ib2xzOiA1LFxuICAgIG1hdGhTeW1ib2xzOiA2XG4gIH0sXG4gIGNoYXJhY3RlckFsdGVybmF0aXZlczoge1xuICAgIGNvZGU6IDE3LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBub0FsdGVybmF0ZXM6IDBcbiAgfSxcbiAgLy8gdXNlciBkZWZpbmVkIG9wdGlvbnNcbiAgZGVzaWduQ29tcGxleGl0eToge1xuICAgIGNvZGU6IDE4LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBkZXNpZ25MZXZlbDE6IDAsXG4gICAgZGVzaWduTGV2ZWwyOiAxLFxuICAgIGRlc2lnbkxldmVsMzogMixcbiAgICBkZXNpZ25MZXZlbDQ6IDMsXG4gICAgZGVzaWduTGV2ZWw1OiA0XG4gIH0sXG4gIHN0eWxlT3B0aW9uczoge1xuICAgIGNvZGU6IDE5LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBub1N0eWxlT3B0aW9uczogMCxcbiAgICBkaXNwbGF5VGV4dDogMSxcbiAgICBlbmdyYXZlZFRleHQ6IDIsXG4gICAgaWxsdW1pbmF0ZWRDYXBzOiAzLFxuICAgIHRpdGxpbmdDYXBzOiA0LFxuICAgIHRhbGxDYXBzOiA1XG4gIH0sXG4gIGNoYXJhY3RlclNoYXBlOiB7XG4gICAgY29kZTogMjAsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIHRyYWRpdGlvbmFsQ2hhcmFjdGVyczogMCxcbiAgICBzaW1wbGlmaWVkQ2hhcmFjdGVyczogMSxcbiAgICBKSVMxOTc4Q2hhcmFjdGVyczogMixcbiAgICBKSVMxOTgzQ2hhcmFjdGVyczogMyxcbiAgICBKSVMxOTkwQ2hhcmFjdGVyczogNCxcbiAgICB0cmFkaXRpb25hbEFsdE9uZTogNSxcbiAgICB0cmFkaXRpb25hbEFsdFR3bzogNixcbiAgICB0cmFkaXRpb25hbEFsdFRocmVlOiA3LFxuICAgIHRyYWRpdGlvbmFsQWx0Rm91cjogOCxcbiAgICB0cmFkaXRpb25hbEFsdEZpdmU6IDksXG4gICAgZXhwZXJ0Q2hhcmFjdGVyczogMTAsXG4gICAgSklTMjAwNENoYXJhY3RlcnM6IDExLFxuICAgIGhvam9DaGFyYWN0ZXJzOiAxMixcbiAgICBOTENDaGFyYWN0ZXJzOiAxMyxcbiAgICB0cmFkaXRpb25hbE5hbWVzQ2hhcmFjdGVyczogMTRcbiAgfSxcbiAgbnVtYmVyQ2FzZToge1xuICAgIGNvZGU6IDIxLFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBsb3dlckNhc2VOdW1iZXJzOiAwLFxuICAgIHVwcGVyQ2FzZU51bWJlcnM6IDFcbiAgfSxcbiAgdGV4dFNwYWNpbmc6IHtcbiAgICBjb2RlOiAyMixcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgcHJvcG9ydGlvbmFsVGV4dDogMCxcbiAgICBtb25vc3BhY2VkVGV4dDogMSxcbiAgICBoYWxmV2lkdGhUZXh0OiAyLFxuICAgIHRoaXJkV2lkdGhUZXh0OiAzLFxuICAgIHF1YXJ0ZXJXaWR0aFRleHQ6IDQsXG4gICAgYWx0UHJvcG9ydGlvbmFsVGV4dDogNSxcbiAgICBhbHRIYWxmV2lkdGhUZXh0OiA2XG4gIH0sXG4gIHRyYW5zbGl0ZXJhdGlvbjoge1xuICAgIGNvZGU6IDIzLFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBub1RyYW5zbGl0ZXJhdGlvbjogMFxuICB9LFxuICAvLyBoYW5qYVRvSGFuZ3VsOiAxXG4gIC8vIGhpcmFnYW5hVG9LYXRha2FuYTogMlxuICAvLyBrYXRha2FuYVRvSGlyYWdhbmE6IDNcbiAgLy8ga2FuYVRvUm9tYW5pemF0aW9uOiA0XG4gIC8vIHJvbWFuaXphdGlvblRvSGlyYWdhbmE6IDVcbiAgLy8gcm9tYW5pemF0aW9uVG9LYXRha2FuYTogNlxuICAvLyBoYW5qYVRvSGFuZ3VsQWx0T25lOiA3XG4gIC8vIGhhbmphVG9IYW5ndWxBbHRUd286IDhcbiAgLy8gaGFuamFUb0hhbmd1bEFsdFRocmVlOiA5XG4gIGFubm90YXRpb246IHtcbiAgICBjb2RlOiAyNCxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgbm9Bbm5vdGF0aW9uOiAwLFxuICAgIGJveEFubm90YXRpb246IDEsXG4gICAgcm91bmRlZEJveEFubm90YXRpb246IDIsXG4gICAgY2lyY2xlQW5ub3RhdGlvbjogMyxcbiAgICBpbnZlcnRlZENpcmNsZUFubm90YXRpb246IDQsXG4gICAgcGFyZW50aGVzaXNBbm5vdGF0aW9uOiA1LFxuICAgIHBlcmlvZEFubm90YXRpb246IDYsXG4gICAgcm9tYW5OdW1lcmFsQW5ub3RhdGlvbjogNyxcbiAgICBkaWFtb25kQW5ub3RhdGlvbjogOCxcbiAgICBpbnZlcnRlZEJveEFubm90YXRpb246IDksXG4gICAgaW52ZXJ0ZWRSb3VuZGVkQm94QW5ub3RhdGlvbjogMTBcbiAgfSxcbiAga2FuYVNwYWNpbmc6IHtcbiAgICBjb2RlOiAyNSxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgZnVsbFdpZHRoS2FuYTogMCxcbiAgICBwcm9wb3J0aW9uYWxLYW5hOiAxXG4gIH0sXG4gIGlkZW9ncmFwaGljU3BhY2luZzoge1xuICAgIGNvZGU6IDI2LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBmdWxsV2lkdGhJZGVvZ3JhcGhzOiAwLFxuICAgIHByb3BvcnRpb25hbElkZW9ncmFwaHM6IDEsXG4gICAgaGFsZldpZHRoSWRlb2dyYXBoczogMlxuICB9LFxuICB1bmljb2RlRGVjb21wb3NpdGlvbjoge1xuICAgIGNvZGU6IDI3LFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgY2Fub25pY2FsQ29tcG9zaXRpb246IDAsXG4gICAgY29tcGF0aWJpbGl0eUNvbXBvc2l0aW9uOiAyLFxuICAgIHRyYW5zY29kaW5nQ29tcG9zaXRpb246IDRcbiAgfSxcbiAgcnVieUthbmE6IHtcbiAgICBjb2RlOiAyOCxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIC8vIG5vUnVieUthbmE6IDAgICAgICMgZGVwcmVjYXRlZCAtIHVzZSBydWJ5S2FuYU9mZiBpbnN0ZWFkXG4gICAgLy8gcnVieUthbmE6IDEgICAgICMgZGVwcmVjYXRlZCAtIHVzZSBydWJ5S2FuYU9uIGluc3RlYWRcbiAgICBydWJ5S2FuYTogMlxuICB9LFxuICBDSktTeW1ib2xBbHRlcm5hdGl2ZXM6IHtcbiAgICBjb2RlOiAyOSxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgbm9DSktTeW1ib2xBbHRlcm5hdGl2ZXM6IDAsXG4gICAgQ0pLU3ltYm9sQWx0T25lOiAxLFxuICAgIENKS1N5bWJvbEFsdFR3bzogMixcbiAgICBDSktTeW1ib2xBbHRUaHJlZTogMyxcbiAgICBDSktTeW1ib2xBbHRGb3VyOiA0LFxuICAgIENKS1N5bWJvbEFsdEZpdmU6IDVcbiAgfSxcbiAgaWRlb2dyYXBoaWNBbHRlcm5hdGl2ZXM6IHtcbiAgICBjb2RlOiAzMCxcbiAgICBleGNsdXNpdmU6IHRydWUsXG4gICAgbm9JZGVvZ3JhcGhpY0FsdGVybmF0aXZlczogMCxcbiAgICBpZGVvZ3JhcGhpY0FsdE9uZTogMSxcbiAgICBpZGVvZ3JhcGhpY0FsdFR3bzogMixcbiAgICBpZGVvZ3JhcGhpY0FsdFRocmVlOiAzLFxuICAgIGlkZW9ncmFwaGljQWx0Rm91cjogNCxcbiAgICBpZGVvZ3JhcGhpY0FsdEZpdmU6IDVcbiAgfSxcbiAgQ0pLVmVydGljYWxSb21hblBsYWNlbWVudDoge1xuICAgIGNvZGU6IDMxLFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZSxcbiAgICBDSktWZXJ0aWNhbFJvbWFuQ2VudGVyZWQ6IDAsXG4gICAgQ0pLVmVydGljYWxSb21hbkhCYXNlbGluZTogMVxuICB9LFxuICBpdGFsaWNDSktSb21hbjoge1xuICAgIGNvZGU6IDMyLFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgLy8gbm9DSktJdGFsaWNSb21hbjogMCAgICAgIyBkZXByZWNhdGVkIC0gdXNlIENKS0l0YWxpY1JvbWFuT2ZmIGluc3RlYWRcbiAgICAvLyBDSktJdGFsaWNSb21hbjogMSAgICAgIyBkZXByZWNhdGVkIC0gdXNlIENKS0l0YWxpY1JvbWFuT24gaW5zdGVhZFxuICAgIENKS0l0YWxpY1JvbWFuOiAyXG4gIH0sXG4gIGNhc2VTZW5zaXRpdmVMYXlvdXQ6IHtcbiAgICBjb2RlOiAzMyxcbiAgICBleGNsdXNpdmU6IGZhbHNlLFxuICAgIGNhc2VTZW5zaXRpdmVMYXlvdXQ6IDAsXG4gICAgY2FzZVNlbnNpdGl2ZVNwYWNpbmc6IDJcbiAgfSxcbiAgYWx0ZXJuYXRlS2FuYToge1xuICAgIGNvZGU6IDM0LFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgYWx0ZXJuYXRlSG9yaXpLYW5hOiAwLFxuICAgIGFsdGVybmF0ZVZlcnRLYW5hOiAyXG4gIH0sXG4gIHN0eWxpc3RpY0FsdGVybmF0aXZlczoge1xuICAgIGNvZGU6IDM1LFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgbm9TdHlsaXN0aWNBbHRlcm5hdGVzOiAwLFxuICAgIHN0eWxpc3RpY0FsdE9uZTogMixcbiAgICBzdHlsaXN0aWNBbHRUd286IDQsXG4gICAgc3R5bGlzdGljQWx0VGhyZWU6IDYsXG4gICAgc3R5bGlzdGljQWx0Rm91cjogOCxcbiAgICBzdHlsaXN0aWNBbHRGaXZlOiAxMCxcbiAgICBzdHlsaXN0aWNBbHRTaXg6IDEyLFxuICAgIHN0eWxpc3RpY0FsdFNldmVuOiAxNCxcbiAgICBzdHlsaXN0aWNBbHRFaWdodDogMTYsXG4gICAgc3R5bGlzdGljQWx0TmluZTogMTgsXG4gICAgc3R5bGlzdGljQWx0VGVuOiAyMCxcbiAgICBzdHlsaXN0aWNBbHRFbGV2ZW46IDIyLFxuICAgIHN0eWxpc3RpY0FsdFR3ZWx2ZTogMjQsXG4gICAgc3R5bGlzdGljQWx0VGhpcnRlZW46IDI2LFxuICAgIHN0eWxpc3RpY0FsdEZvdXJ0ZWVuOiAyOCxcbiAgICBzdHlsaXN0aWNBbHRGaWZ0ZWVuOiAzMCxcbiAgICBzdHlsaXN0aWNBbHRTaXh0ZWVuOiAzMixcbiAgICBzdHlsaXN0aWNBbHRTZXZlbnRlZW46IDM0LFxuICAgIHN0eWxpc3RpY0FsdEVpZ2h0ZWVuOiAzNixcbiAgICBzdHlsaXN0aWNBbHROaW5ldGVlbjogMzgsXG4gICAgc3R5bGlzdGljQWx0VHdlbnR5OiA0MFxuICB9LFxuICBjb250ZXh0dWFsQWx0ZXJuYXRlczoge1xuICAgIGNvZGU6IDM2LFxuICAgIGV4Y2x1c2l2ZTogZmFsc2UsXG4gICAgY29udGV4dHVhbEFsdGVybmF0ZXM6IDAsXG4gICAgc3dhc2hBbHRlcm5hdGVzOiAyLFxuICAgIGNvbnRleHR1YWxTd2FzaEFsdGVybmF0ZXM6IDRcbiAgfSxcbiAgbG93ZXJDYXNlOiB7XG4gICAgY29kZTogMzcsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIGRlZmF1bHRMb3dlckNhc2U6IDAsXG4gICAgbG93ZXJDYXNlU21hbGxDYXBzOiAxLFxuICAgIGxvd2VyQ2FzZVBldGl0ZUNhcHM6IDJcbiAgfSxcbiAgdXBwZXJDYXNlOiB7XG4gICAgY29kZTogMzgsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIGRlZmF1bHRVcHBlckNhc2U6IDAsXG4gICAgdXBwZXJDYXNlU21hbGxDYXBzOiAxLFxuICAgIHVwcGVyQ2FzZVBldGl0ZUNhcHM6IDJcbiAgfSxcbiAgbGFuZ3VhZ2VUYWc6IHtcbiAgICAvLyBpbmRpY2VzIGludG8gbHRhZyB0YWJsZVxuICAgIGNvZGU6IDM5LFxuICAgIGV4Y2x1c2l2ZTogdHJ1ZVxuICB9LFxuICBDSktSb21hblNwYWNpbmc6IHtcbiAgICBjb2RlOiAxMDMsXG4gICAgZXhjbHVzaXZlOiB0cnVlLFxuICAgIGhhbGZXaWR0aENKS1JvbWFuOiAwLFxuICAgIHByb3BvcnRpb25hbENKS1JvbWFuOiAxLFxuICAgIGRlZmF1bHRDSktSb21hbjogMixcbiAgICBmdWxsV2lkdGhDSktSb21hbjogM1xuICB9XG59O1xuXG52YXIgZmVhdHVyZSA9IGZ1bmN0aW9uIGZlYXR1cmUobmFtZSwgc2VsZWN0b3IpIHtcbiAgcmV0dXJuIFtmZWF0dXJlc1tuYW1lXS5jb2RlLCBmZWF0dXJlc1tuYW1lXVtzZWxlY3Rvcl1dO1xufTtcblxudmFyIE9UTWFwcGluZyA9IHtcbiAgcmxpZzogZmVhdHVyZSgnbGlnYXR1cmVzJywgJ3JlcXVpcmVkTGlnYXR1cmVzJyksXG4gIGNsaWc6IGZlYXR1cmUoJ2xpZ2F0dXJlcycsICdjb250ZXh0dWFsTGlnYXR1cmVzJyksXG4gIGRsaWc6IGZlYXR1cmUoJ2xpZ2F0dXJlcycsICdyYXJlTGlnYXR1cmVzJyksXG4gIGhsaWc6IGZlYXR1cmUoJ2xpZ2F0dXJlcycsICdoaXN0b3JpY2FsTGlnYXR1cmVzJyksXG4gIGxpZ2E6IGZlYXR1cmUoJ2xpZ2F0dXJlcycsICdjb21tb25MaWdhdHVyZXMnKSxcbiAgaGlzdDogZmVhdHVyZSgnbGlnYXR1cmVzJywgJ2hpc3RvcmljYWxMaWdhdHVyZXMnKSxcbiAgLy8gPz9cbiAgc21jcDogZmVhdHVyZSgnbG93ZXJDYXNlJywgJ2xvd2VyQ2FzZVNtYWxsQ2FwcycpLFxuICBwY2FwOiBmZWF0dXJlKCdsb3dlckNhc2UnLCAnbG93ZXJDYXNlUGV0aXRlQ2FwcycpLFxuICBmcmFjOiBmZWF0dXJlKCdmcmFjdGlvbnMnLCAnZGlhZ29uYWxGcmFjdGlvbnMnKSxcbiAgZG5vbTogZmVhdHVyZSgnZnJhY3Rpb25zJywgJ2RpYWdvbmFsRnJhY3Rpb25zJyksXG4gIC8vID8/XG4gIG51bXI6IGZlYXR1cmUoJ2ZyYWN0aW9ucycsICdkaWFnb25hbEZyYWN0aW9ucycpLFxuICAvLyA/P1xuICBhZnJjOiBmZWF0dXJlKCdmcmFjdGlvbnMnLCAndmVydGljYWxGcmFjdGlvbnMnKSxcbiAgLy8gYWFsdFxuICAvLyBhYnZmLCBhYnZtLCBhYnZzLCBha2huLCBibHdmLCBibHdtLCBibHdzLCBjZmFyLCBjamN0LCBjcHNwLCBmYWx0LCBpc29sLCBqYWx0LCBsam1vLCBtc2V0P1xuICAvLyBsdHJhLCBsdHJtLCBudWt0LCBwcmVmLCBwcmVzLCBwc3RmLCBwc3RzLCByYW5kLCBya3JmLCBycGhmLCBydGxhLCBydGxtLCBzaXplLCB0am1vLCB0bnVtP1xuICAvLyB1bmljLCB2YXR1LCB2aGFsLCB2am1vLCB2cGFsLCB2cnQyXG4gIC8vIGRpc3QgLT4gdHJhayB0YWJsZT9cbiAgLy8ga2VybiwgdmtybiAtPiBrZXJuIHRhYmxlXG4gIC8vIGxmYmQgKyBvcGJkICsgcnRiZCAtPiBvcGJkIHRhYmxlP1xuICAvLyBtYXJrLCBta21rIC0+IGFjbnQgdGFibGU/XG4gIC8vIGxvY2wgLT4gbGFuZ3VhZ2VUYWcgKyBsdGFnIHRhYmxlXG4gIFwiY2FzZVwiOiBmZWF0dXJlKCdjYXNlU2Vuc2l0aXZlTGF5b3V0JywgJ2Nhc2VTZW5zaXRpdmVMYXlvdXQnKSxcbiAgLy8gYWxzbyBjYXNlU2Vuc2l0aXZlU3BhY2luZ1xuICBjY21wOiBmZWF0dXJlKCd1bmljb2RlRGVjb21wb3NpdGlvbicsICdjYW5vbmljYWxDb21wb3NpdGlvbicpLFxuICAvLyBjb21wYXRpYmlsaXR5Q29tcG9zaXRpb24/XG4gIGNwY3Q6IGZlYXR1cmUoJ0NKS1ZlcnRpY2FsUm9tYW5QbGFjZW1lbnQnLCAnQ0pLVmVydGljYWxSb21hbkNlbnRlcmVkJyksXG4gIC8vIGd1ZXNzLi4uLCBwcm9iYWJseSBub3QgZ2l2ZW4gYmVsb3dcbiAgdmFsdDogZmVhdHVyZSgnQ0pLVmVydGljYWxSb21hblBsYWNlbWVudCcsICdDSktWZXJ0aWNhbFJvbWFuQ2VudGVyZWQnKSxcbiAgc3dzaDogZmVhdHVyZSgnY29udGV4dHVhbEFsdGVybmF0ZXMnLCAnc3dhc2hBbHRlcm5hdGVzJyksXG4gIGNzd2g6IGZlYXR1cmUoJ2NvbnRleHR1YWxBbHRlcm5hdGVzJywgJ2NvbnRleHR1YWxTd2FzaEFsdGVybmF0ZXMnKSxcbiAgY3VyczogZmVhdHVyZSgnY3Vyc2l2ZUNvbm5lY3Rpb24nLCAnY3Vyc2l2ZScpLFxuICAvLyA/P1xuICBjMnBjOiBmZWF0dXJlKCd1cHBlckNhc2UnLCAndXBwZXJDYXNlUGV0aXRlQ2FwcycpLFxuICBjMnNjOiBmZWF0dXJlKCd1cHBlckNhc2UnLCAndXBwZXJDYXNlU21hbGxDYXBzJyksXG4gIGluaXQ6IGZlYXR1cmUoJ3NtYXJ0U3dhc2gnLCAnd29yZEluaXRpYWxTd2FzaGVzJyksXG4gIC8vID8/XG4gIGZpbjI6IGZlYXR1cmUoJ3NtYXJ0U3dhc2gnLCAnd29yZEZpbmFsU3dhc2hlcycpLFxuICAvLyA/P1xuICBtZWRpOiBmZWF0dXJlKCdzbWFydFN3YXNoJywgJ25vbkZpbmFsU3dhc2hlcycpLFxuICAvLyA/P1xuICBtZWQyOiBmZWF0dXJlKCdzbWFydFN3YXNoJywgJ25vbkZpbmFsU3dhc2hlcycpLFxuICAvLyA/P1xuICBmaW4zOiBmZWF0dXJlKCdzbWFydFN3YXNoJywgJ3dvcmRGaW5hbFN3YXNoZXMnKSxcbiAgLy8gPz9cbiAgZmluYTogZmVhdHVyZSgnc21hcnRTd2FzaCcsICd3b3JkRmluYWxTd2FzaGVzJyksXG4gIC8vID8/XG4gIHBrbmE6IGZlYXR1cmUoJ2thbmFTcGFjaW5nJywgJ3Byb3BvcnRpb25hbEthbmEnKSxcbiAgaGFsZjogZmVhdHVyZSgndGV4dFNwYWNpbmcnLCAnaGFsZldpZHRoVGV4dCcpLFxuICAvLyBhbHNvIEhhbGZXaWR0aENKS1JvbWFuLCBIYWxmV2lkdGhJZGVvZ3JhcGhzP1xuICBoYWx0OiBmZWF0dXJlKCd0ZXh0U3BhY2luZycsICdhbHRIYWxmV2lkdGhUZXh0JyksXG4gIGhrbmE6IGZlYXR1cmUoJ2FsdGVybmF0ZUthbmEnLCAnYWx0ZXJuYXRlSG9yaXpLYW5hJyksXG4gIHZrbmE6IGZlYXR1cmUoJ2FsdGVybmF0ZUthbmEnLCAnYWx0ZXJuYXRlVmVydEthbmEnKSxcbiAgLy8gaG5nbDogZmVhdHVyZSAndHJhbnNsaXRlcmF0aW9uJywgJ2hhbmphVG9IYW5ndWxTZWxlY3RvcicgIyBkZXByZWNhdGVkXG4gIGl0YWw6IGZlYXR1cmUoJ2l0YWxpY0NKS1JvbWFuJywgJ0NKS0l0YWxpY1JvbWFuJyksXG4gIGxudW06IGZlYXR1cmUoJ251bWJlckNhc2UnLCAndXBwZXJDYXNlTnVtYmVycycpLFxuICBvbnVtOiBmZWF0dXJlKCdudW1iZXJDYXNlJywgJ2xvd2VyQ2FzZU51bWJlcnMnKSxcbiAgbWdyazogZmVhdHVyZSgnbWF0aGVtYXRpY2FsRXh0cmFzJywgJ21hdGhlbWF0aWNhbEdyZWVrJyksXG4gIC8vIG5hbHQ6IG5vdCBlbm91Z2ggaW5mby4gd2hhdCB0eXBlIG9mIGFubm90YXRpb24/XG4gIC8vIG9ybm06IGRpdHRvLCB3aGljaCBvcm5hbWVudCBzdHlsZT9cbiAgY2FsdDogZmVhdHVyZSgnY29udGV4dHVhbEFsdGVybmF0ZXMnLCAnY29udGV4dHVhbEFsdGVybmF0ZXMnKSxcbiAgLy8gb3IgbW9yZT9cbiAgdnJ0MjogZmVhdHVyZSgndmVydGljYWxTdWJzdGl0dXRpb24nLCAnc3Vic3RpdHV0ZVZlcnRpY2FsRm9ybXMnKSxcbiAgLy8gb2guLi4gYmVsb3c/XG4gIHZlcnQ6IGZlYXR1cmUoJ3ZlcnRpY2FsU3Vic3RpdHV0aW9uJywgJ3N1YnN0aXR1dGVWZXJ0aWNhbEZvcm1zJyksXG4gIHRudW06IGZlYXR1cmUoJ251bWJlclNwYWNpbmcnLCAnbW9ub3NwYWNlZE51bWJlcnMnKSxcbiAgcG51bTogZmVhdHVyZSgnbnVtYmVyU3BhY2luZycsICdwcm9wb3J0aW9uYWxOdW1iZXJzJyksXG4gIHN1cHM6IGZlYXR1cmUoJ3ZlcnRpY2FsUG9zaXRpb24nLCAnc3VwZXJpb3JzJyksXG4gIHN1YnM6IGZlYXR1cmUoJ3ZlcnRpY2FsUG9zaXRpb24nLCAnaW5mZXJpb3JzJyksXG4gIG9yZG46IGZlYXR1cmUoJ3ZlcnRpY2FsUG9zaXRpb24nLCAnb3JkaW5hbHMnKSxcbiAgcHdpZDogZmVhdHVyZSgndGV4dFNwYWNpbmcnLCAncHJvcG9ydGlvbmFsVGV4dCcpLFxuICBod2lkOiBmZWF0dXJlKCd0ZXh0U3BhY2luZycsICdoYWxmV2lkdGhUZXh0JyksXG4gIHF3aWQ6IGZlYXR1cmUoJ3RleHRTcGFjaW5nJywgJ3F1YXJ0ZXJXaWR0aFRleHQnKSxcbiAgLy8gYWxzbyBRdWFydGVyV2lkdGhOdW1iZXJzP1xuICB0d2lkOiBmZWF0dXJlKCd0ZXh0U3BhY2luZycsICd0aGlyZFdpZHRoVGV4dCcpLFxuICAvLyBhbHNvIFRoaXJkV2lkdGhOdW1iZXJzP1xuICBmd2lkOiBmZWF0dXJlKCd0ZXh0U3BhY2luZycsICdwcm9wb3J0aW9uYWxUZXh0JyksXG4gIC8vPz9cbiAgcGFsdDogZmVhdHVyZSgndGV4dFNwYWNpbmcnLCAnYWx0UHJvcG9ydGlvbmFsVGV4dCcpLFxuICB0cmFkOiBmZWF0dXJlKCdjaGFyYWN0ZXJTaGFwZScsICd0cmFkaXRpb25hbENoYXJhY3RlcnMnKSxcbiAgc21wbDogZmVhdHVyZSgnY2hhcmFjdGVyU2hhcGUnLCAnc2ltcGxpZmllZENoYXJhY3RlcnMnKSxcbiAganA3ODogZmVhdHVyZSgnY2hhcmFjdGVyU2hhcGUnLCAnSklTMTk3OENoYXJhY3RlcnMnKSxcbiAganA4MzogZmVhdHVyZSgnY2hhcmFjdGVyU2hhcGUnLCAnSklTMTk4M0NoYXJhY3RlcnMnKSxcbiAganA5MDogZmVhdHVyZSgnY2hhcmFjdGVyU2hhcGUnLCAnSklTMTk5MENoYXJhY3RlcnMnKSxcbiAganAwNDogZmVhdHVyZSgnY2hhcmFjdGVyU2hhcGUnLCAnSklTMjAwNENoYXJhY3RlcnMnKSxcbiAgZXhwdDogZmVhdHVyZSgnY2hhcmFjdGVyU2hhcGUnLCAnZXhwZXJ0Q2hhcmFjdGVycycpLFxuICBob2pvOiBmZWF0dXJlKCdjaGFyYWN0ZXJTaGFwZScsICdob2pvQ2hhcmFjdGVycycpLFxuICBubGNrOiBmZWF0dXJlKCdjaGFyYWN0ZXJTaGFwZScsICdOTENDaGFyYWN0ZXJzJyksXG4gIHRuYW06IGZlYXR1cmUoJ2NoYXJhY3RlclNoYXBlJywgJ3RyYWRpdGlvbmFsTmFtZXNDaGFyYWN0ZXJzJyksXG4gIHJ1Ynk6IGZlYXR1cmUoJ3J1YnlLYW5hJywgJ3J1YnlLYW5hJyksXG4gIHRpdGw6IGZlYXR1cmUoJ3N0eWxlT3B0aW9ucycsICd0aXRsaW5nQ2FwcycpLFxuICB6ZXJvOiBmZWF0dXJlKCd0eXBvZ3JhcGhpY0V4dHJhcycsICdzbGFzaGVkWmVybycpLFxuICBzczAxOiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0T25lJyksXG4gIHNzMDI6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRUd28nKSxcbiAgc3MwMzogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdFRocmVlJyksXG4gIHNzMDQ6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRGb3VyJyksXG4gIHNzMDU6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRGaXZlJyksXG4gIHNzMDY6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRTaXgnKSxcbiAgc3MwNzogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdFNldmVuJyksXG4gIHNzMDg6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRFaWdodCcpLFxuICBzczA5OiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0TmluZScpLFxuICBzczEwOiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0VGVuJyksXG4gIHNzMTE6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRFbGV2ZW4nKSxcbiAgc3MxMjogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdFR3ZWx2ZScpLFxuICBzczEzOiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0VGhpcnRlZW4nKSxcbiAgc3MxNDogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdEZvdXJ0ZWVuJyksXG4gIHNzMTU6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRGaWZ0ZWVuJyksXG4gIHNzMTY6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRTaXh0ZWVuJyksXG4gIHNzMTc6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRTZXZlbnRlZW4nKSxcbiAgc3MxODogZmVhdHVyZSgnc3R5bGlzdGljQWx0ZXJuYXRpdmVzJywgJ3N0eWxpc3RpY0FsdEVpZ2h0ZWVuJyksXG4gIHNzMTk6IGZlYXR1cmUoJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHROaW5ldGVlbicpLFxuICBzczIwOiBmZWF0dXJlKCdzdHlsaXN0aWNBbHRlcm5hdGl2ZXMnLCAnc3R5bGlzdGljQWx0VHdlbnR5Jylcbn07IC8vIHNhbHQ6IGZlYXR1cmUgJ3N0eWxpc3RpY0FsdGVybmF0aXZlcycsICdzdHlsaXN0aWNBbHRPbmUnICMgaG1tLCB3aGljaCBvbmUgdG8gY2hvb3NlXG4vLyBBZGQgY3YwMS1jdjk5IGZlYXR1cmVzXG5cbmZvciAodmFyIGkkMyA9IDE7IGkkMyA8PSA5OTsgaSQzKyspIHtcbiAgT1RNYXBwaW5nW1wiY3ZcIiArIChcIjAwXCIgKyBpJDMpLnNsaWNlKC0yKV0gPSBbZmVhdHVyZXMuY2hhcmFjdGVyQWx0ZXJuYXRpdmVzLmNvZGUsIGkkM107XG59IC8vIGNyZWF0ZSBpbnZlcnNlIG1hcHBpbmdcblxuXG52YXIgQUFUTWFwcGluZyA9IHt9O1xuXG5mb3IgKHZhciBvdCBpbiBPVE1hcHBpbmcpIHtcbiAgdmFyIGFhdCA9IE9UTWFwcGluZ1tvdF07XG5cbiAgaWYgKEFBVE1hcHBpbmdbYWF0WzBdXSA9PSBudWxsKSB7XG4gICAgQUFUTWFwcGluZ1thYXRbMF1dID0ge307XG4gIH1cblxuICBBQVRNYXBwaW5nW2FhdFswXV1bYWF0WzFdXSA9IG90O1xufSAvLyBNYXBzIGFuIGFycmF5IG9mIE9wZW5UeXBlIGZlYXR1cmVzIHRvIEFBVCBmZWF0dXJlc1xuLy8gaW4gdGhlIGZvcm0gb2Yge2ZlYXR1cmVUeXBlOntmZWF0dXJlU2V0dGluZzp0cnVlfX1cblxuXG5mdW5jdGlvbiBtYXBPVFRvQUFUKGZlYXR1cmVzKSB7XG4gIHZhciByZXMgPSB7fTtcblxuICBmb3IgKHZhciBrIGluIGZlYXR1cmVzKSB7XG4gICAgdmFyIHIgPSB2b2lkIDA7XG5cbiAgICBpZiAociA9IE9UTWFwcGluZ1trXSkge1xuICAgICAgaWYgKHJlc1tyWzBdXSA9PSBudWxsKSB7XG4gICAgICAgIHJlc1tyWzBdXSA9IHt9O1xuICAgICAgfVxuXG4gICAgICByZXNbclswXV1bclsxXV0gPSBmZWF0dXJlc1trXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufSAvLyBNYXBzIHN0cmluZ3MgaW4gYSBbZmVhdHVyZVR5cGUsIGZlYXR1cmVTZXR0aW5nXVxuLy8gdG8gdGhlaXIgZXF1aXZhbGVudCBudW1iZXIgY29kZXNcblxuZnVuY3Rpb24gbWFwRmVhdHVyZVN0cmluZ3MoZikge1xuICB2YXIgdHlwZSA9IGZbMF0sXG4gICAgICBzZXR0aW5nID0gZlsxXTtcblxuICBpZiAoaXNOYU4odHlwZSkpIHtcbiAgICB2YXIgdHlwZUNvZGUgPSBmZWF0dXJlc1t0eXBlXSAmJiBmZWF0dXJlc1t0eXBlXS5jb2RlO1xuICB9IGVsc2Uge1xuICAgIHZhciB0eXBlQ29kZSA9IHR5cGU7XG4gIH1cblxuICBpZiAoaXNOYU4oc2V0dGluZykpIHtcbiAgICB2YXIgc2V0dGluZ0NvZGUgPSBmZWF0dXJlc1t0eXBlXSAmJiBmZWF0dXJlc1t0eXBlXVtzZXR0aW5nXTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2V0dGluZ0NvZGUgPSBzZXR0aW5nO1xuICB9XG5cbiAgcmV0dXJuIFt0eXBlQ29kZSwgc2V0dGluZ0NvZGVdO1xufSAvLyBNYXBzIEFBVCBmZWF0dXJlcyB0byBhbiBhcnJheSBvZiBPcGVuVHlwZSBmZWF0dXJlc1xuLy8gU3VwcG9ydHMgYm90aCBhcnJheXMgaW4gdGhlIGZvcm0gb2YgW1tmZWF0dXJlVHlwZSwgZmVhdHVyZVNldHRpbmddXVxuLy8gYW5kIG9iamVjdHMgaW4gdGhlIGZvcm0gb2Yge2ZlYXR1cmVUeXBlOntmZWF0dXJlU2V0dGluZzp0cnVlfX1cbi8vIGZlYXR1cmVUeXBlcyBhbmQgZmVhdHVyZVNldHRpbmdzIGNhbiBiZSBlaXRoZXIgc3RyaW5ncyBvciBudW1iZXIgY29kZXNcblxuXG5mdW5jdGlvbiBtYXBBQVRUb09UKGZlYXR1cmVzKSB7XG4gIHZhciByZXMgPSB7fTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShmZWF0dXJlcykpIHtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGZlYXR1cmVzLmxlbmd0aDsgaysrKSB7XG4gICAgICB2YXIgciA9IHZvaWQgMDtcbiAgICAgIHZhciBmID0gbWFwRmVhdHVyZVN0cmluZ3MoZmVhdHVyZXNba10pO1xuXG4gICAgICBpZiAociA9IEFBVE1hcHBpbmdbZlswXV0gJiYgQUFUTWFwcGluZ1tmWzBdXVtmWzFdXSkge1xuICAgICAgICByZXNbcl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgZmVhdHVyZXMgPT09ICdvYmplY3QnKSB7XG4gICAgZm9yICh2YXIgdHlwZSBpbiBmZWF0dXJlcykge1xuICAgICAgdmFyIF9mZWF0dXJlID0gZmVhdHVyZXNbdHlwZV07XG5cbiAgICAgIGZvciAodmFyIHNldHRpbmcgaW4gX2ZlYXR1cmUpIHtcbiAgICAgICAgdmFyIF9yID0gdm9pZCAwO1xuXG4gICAgICAgIHZhciBfZiA9IG1hcEZlYXR1cmVTdHJpbmdzKFt0eXBlLCBzZXR0aW5nXSk7XG5cbiAgICAgICAgaWYgKF9mZWF0dXJlW3NldHRpbmddICYmIChfciA9IEFBVE1hcHBpbmdbX2ZbMF1dICYmIEFBVE1hcHBpbmdbX2ZbMF1dW19mWzFdXSkpIHtcbiAgICAgICAgICByZXNbX3JdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhyZXMpO1xufVxuXG52YXIgX2NsYXNzJDE7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkOChvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkOChvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkOChvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDgobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ4KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkOChhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQxKHRhcmdldCwgcHJvcGVydHksIGRlY29yYXRvcnMsIGRlc2NyaXB0b3IsIGNvbnRleHQpIHsgdmFyIGRlc2MgPSB7fTsgT2JqZWN0LmtleXMoZGVzY3JpcHRvcikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IGRlc2Nba2V5XSA9IGRlc2NyaXB0b3Jba2V5XTsgfSk7IGRlc2MuZW51bWVyYWJsZSA9ICEhZGVzYy5lbnVtZXJhYmxlOyBkZXNjLmNvbmZpZ3VyYWJsZSA9ICEhZGVzYy5jb25maWd1cmFibGU7IGlmICgndmFsdWUnIGluIGRlc2MgfHwgZGVzYy5pbml0aWFsaXplcikgeyBkZXNjLndyaXRhYmxlID0gdHJ1ZTsgfSBkZXNjID0gZGVjb3JhdG9ycy5zbGljZSgpLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGRlc2MsIGRlY29yYXRvcikgeyByZXR1cm4gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHksIGRlc2MpIHx8IGRlc2M7IH0sIGRlc2MpOyBpZiAoY29udGV4dCAmJiBkZXNjLmluaXRpYWxpemVyICE9PSB2b2lkIDApIHsgZGVzYy52YWx1ZSA9IGRlc2MuaW5pdGlhbGl6ZXIgPyBkZXNjLmluaXRpYWxpemVyLmNhbGwoY29udGV4dCkgOiB2b2lkIDA7IGRlc2MuaW5pdGlhbGl6ZXIgPSB1bmRlZmluZWQ7IH0gaWYgKGRlc2MuaW5pdGlhbGl6ZXIgPT09IHZvaWQgMCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYyk7IGRlc2MgPSBudWxsOyB9IHJldHVybiBkZXNjOyB9XG52YXIgQUFUTG9va3VwVGFibGUgPSAoX2NsYXNzJDEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBQVRMb29rdXBUYWJsZSh0YWJsZSkge1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBBQVRMb29rdXBUYWJsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmxvb2t1cCA9IGZ1bmN0aW9uIGxvb2t1cChnbHlwaCkge1xuICAgIHN3aXRjaCAodGhpcy50YWJsZS52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIC8vIHNpbXBsZSBhcnJheSBmb3JtYXRcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGUudmFsdWVzLmdldEl0ZW0oZ2x5cGgpO1xuXG4gICAgICBjYXNlIDI6IC8vIHNlZ21lbnQgZm9ybWF0XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBtaW4gPSAwO1xuICAgICAgICAgIHZhciBtYXggPSB0aGlzLnRhYmxlLmJpbmFyeVNlYXJjaEhlYWRlci5uVW5pdHMgLSAxO1xuXG4gICAgICAgICAgd2hpbGUgKG1pbiA8PSBtYXgpIHtcbiAgICAgICAgICAgIHZhciBtaWQgPSBtaW4gKyBtYXggPj4gMTtcbiAgICAgICAgICAgIHZhciBzZWcgPSB0aGlzLnRhYmxlLnNlZ21lbnRzW21pZF07IC8vIHNwZWNpYWwgZW5kIG9mIHNlYXJjaCB2YWx1ZVxuXG4gICAgICAgICAgICBpZiAoc2VnLmZpcnN0R2x5cGggPT09IDB4ZmZmZikge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdseXBoIDwgc2VnLmZpcnN0R2x5cGgpIHtcbiAgICAgICAgICAgICAgbWF4ID0gbWlkIC0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2x5cGggPiBzZWcubGFzdEdseXBoKSB7XG4gICAgICAgICAgICAgIG1pbiA9IG1pZCArIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAodGhpcy50YWJsZS52ZXJzaW9uID09PSAyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlZy52YWx1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VnLnZhbHVlc1tnbHlwaCAtIHNlZy5maXJzdEdseXBoXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgNjpcbiAgICAgICAge1xuICAgICAgICAgIC8vIGxvb2t1cCBzaW5nbGVcbiAgICAgICAgICB2YXIgX21pbiA9IDA7XG5cbiAgICAgICAgICB2YXIgX21heCA9IHRoaXMudGFibGUuYmluYXJ5U2VhcmNoSGVhZGVyLm5Vbml0cyAtIDE7XG5cbiAgICAgICAgICB3aGlsZSAoX21pbiA8PSBfbWF4KSB7XG4gICAgICAgICAgICB2YXIgbWlkID0gX21pbiArIF9tYXggPj4gMTtcbiAgICAgICAgICAgIHZhciBzZWcgPSB0aGlzLnRhYmxlLnNlZ21lbnRzW21pZF07IC8vIHNwZWNpYWwgZW5kIG9mIHNlYXJjaCB2YWx1ZVxuXG4gICAgICAgICAgICBpZiAoc2VnLmdseXBoID09PSAweGZmZmYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChnbHlwaCA8IHNlZy5nbHlwaCkge1xuICAgICAgICAgICAgICBfbWF4ID0gbWlkIC0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2x5cGggPiBzZWcuZ2x5cGgpIHtcbiAgICAgICAgICAgICAgX21pbiA9IG1pZCArIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gc2VnLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgODpcbiAgICAgICAgLy8gbG9va3VwIHRyaW1tZWRcbiAgICAgICAgcmV0dXJuIHRoaXMudGFibGUudmFsdWVzW2dseXBoIC0gdGhpcy50YWJsZS5maXJzdEdseXBoXTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBsb29rdXAgdGFibGUgZm9ybWF0OiBcIiArIHRoaXMudGFibGUudmVyc2lvbik7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5nbHlwaHNGb3JWYWx1ZSA9IGZ1bmN0aW9uIGdseXBoc0ZvclZhbHVlKGNsYXNzVmFsdWUpIHtcbiAgICB2YXIgcmVzID0gW107XG5cbiAgICBzd2l0Y2ggKHRoaXMudGFibGUudmVyc2lvbikge1xuICAgICAgY2FzZSAyOiAvLyBzZWdtZW50IGZvcm1hdFxuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHtcbiAgICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDgodGhpcy50YWJsZS5zZWdtZW50cyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgc2VnbWVudCA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy50YWJsZS52ZXJzaW9uID09PSAyICYmIHNlZ21lbnQudmFsdWUgPT09IGNsYXNzVmFsdWUpIHtcbiAgICAgICAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCByYW5nZShzZWdtZW50LmZpcnN0R2x5cGgsIHNlZ21lbnQubGFzdEdseXBoICsgMSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHNlZ21lbnQudmFsdWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnZhbHVlc1tpbmRleF0gPT09IGNsYXNzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKHNlZ21lbnQuZmlyc3RHbHlwaCArIGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDY6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBsb29rdXAgc2luZ2xlXG4gICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkOCh0aGlzLnRhYmxlLnNlZ21lbnRzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBfc2VnbWVudCA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKF9zZWdtZW50LnZhbHVlID09PSBjbGFzc1ZhbHVlKSB7XG4gICAgICAgICAgICAgIHJlcy5wdXNoKF9zZWdtZW50LmdseXBoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDg6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBsb29rdXAgdHJpbW1lZFxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50YWJsZS52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlLnZhbHVlc1tpXSA9PT0gY2xhc3NWYWx1ZSkge1xuICAgICAgICAgICAgICByZXMucHVzaCh0aGlzLnRhYmxlLmZpcnN0R2x5cGggKyBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGxvb2t1cCB0YWJsZSBmb3JtYXQ6IFwiICsgdGhpcy50YWJsZS52ZXJzaW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIHJldHVybiBBQVRMb29rdXBUYWJsZTtcbn0oKSwgKF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkMShfY2xhc3MkMS5wcm90b3R5cGUsIFwiZ2x5cGhzRm9yVmFsdWVcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkMS5wcm90b3R5cGUsIFwiZ2x5cGhzRm9yVmFsdWVcIiksIF9jbGFzcyQxLnByb3RvdHlwZSkpLCBfY2xhc3MkMSk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkOShvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkOShvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkOShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JDkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSQ5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkOShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cbnZhciBTVEFSVF9PRl9URVhUX1NUQVRFID0gMDtcbnZhciBFTkRfT0ZfVEVYVF9DTEFTUyA9IDA7XG52YXIgT1VUX09GX0JPVU5EU19DTEFTUyA9IDE7XG52YXIgREVMRVRFRF9HTFlQSF9DTEFTUyA9IDI7XG52YXIgRE9OVF9BRFZBTkNFID0gMHg0MDAwO1xuXG52YXIgQUFUU3RhdGVNYWNoaW5lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQUFUU3RhdGVNYWNoaW5lKHN0YXRlVGFibGUpIHtcbiAgICB0aGlzLnN0YXRlVGFibGUgPSBzdGF0ZVRhYmxlO1xuICAgIHRoaXMubG9va3VwVGFibGUgPSBuZXcgQUFUTG9va3VwVGFibGUoc3RhdGVUYWJsZS5jbGFzc1RhYmxlKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBBQVRTdGF0ZU1hY2hpbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5wcm9jZXNzID0gZnVuY3Rpb24gcHJvY2VzcyhnbHlwaHMsIHJldmVyc2UsIHByb2Nlc3NFbnRyeSkge1xuICAgIHZhciBjdXJyZW50U3RhdGUgPSBTVEFSVF9PRl9URVhUX1NUQVRFOyAvLyBTVEFSVF9PRl9MSU5FX1NUQVRFIGlzIHVzZWQgZm9yIGthc2hpZGEgZ2x5cGggaW5zZXJ0aW9ucyBzb21ldGltZXMgSSB0aGluaz9cblxuICAgIHZhciBpbmRleCA9IHJldmVyc2UgPyBnbHlwaHMubGVuZ3RoIC0gMSA6IDA7XG4gICAgdmFyIGRpciA9IHJldmVyc2UgPyAtMSA6IDE7XG5cbiAgICB3aGlsZSAoZGlyID09PSAxICYmIGluZGV4IDw9IGdseXBocy5sZW5ndGggfHwgZGlyID09PSAtMSAmJiBpbmRleCA+PSAtMSkge1xuICAgICAgdmFyIGdseXBoID0gbnVsbDtcbiAgICAgIHZhciBjbGFzc0NvZGUgPSBPVVRfT0ZfQk9VTkRTX0NMQVNTO1xuICAgICAgdmFyIHNob3VsZEFkdmFuY2UgPSB0cnVlO1xuXG4gICAgICBpZiAoaW5kZXggPT09IGdseXBocy5sZW5ndGggfHwgaW5kZXggPT09IC0xKSB7XG4gICAgICAgIGNsYXNzQ29kZSA9IEVORF9PRl9URVhUX0NMQVNTO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2x5cGggPSBnbHlwaHNbaW5kZXhdO1xuXG4gICAgICAgIGlmIChnbHlwaC5pZCA9PT0gMHhmZmZmKSB7XG4gICAgICAgICAgLy8gZGVsZXRlZCBnbHlwaFxuICAgICAgICAgIGNsYXNzQ29kZSA9IERFTEVURURfR0xZUEhfQ0xBU1M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xhc3NDb2RlID0gdGhpcy5sb29rdXBUYWJsZS5sb29rdXAoZ2x5cGguaWQpO1xuXG4gICAgICAgICAgaWYgKGNsYXNzQ29kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjbGFzc0NvZGUgPSBPVVRfT0ZfQk9VTkRTX0NMQVNTO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgcm93ID0gdGhpcy5zdGF0ZVRhYmxlLnN0YXRlQXJyYXkuZ2V0SXRlbShjdXJyZW50U3RhdGUpO1xuICAgICAgdmFyIGVudHJ5SW5kZXggPSByb3dbY2xhc3NDb2RlXTtcbiAgICAgIHZhciBlbnRyeSA9IHRoaXMuc3RhdGVUYWJsZS5lbnRyeVRhYmxlLmdldEl0ZW0oZW50cnlJbmRleCk7XG5cbiAgICAgIGlmIChjbGFzc0NvZGUgIT09IEVORF9PRl9URVhUX0NMQVNTICYmIGNsYXNzQ29kZSAhPT0gREVMRVRFRF9HTFlQSF9DTEFTUykge1xuICAgICAgICBwcm9jZXNzRW50cnkoZ2x5cGgsIGVudHJ5LCBpbmRleCk7XG4gICAgICAgIHNob3VsZEFkdmFuY2UgPSAhKGVudHJ5LmZsYWdzICYgRE9OVF9BRFZBTkNFKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFN0YXRlID0gZW50cnkubmV3U3RhdGU7XG5cbiAgICAgIGlmIChzaG91bGRBZHZhbmNlKSB7XG4gICAgICAgIGluZGV4ICs9IGRpcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZ2x5cGhzO1xuICB9XG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIGRlcHRoLWZpcnN0IHRyYXZlcnNhbCBvZiB0aGUgZ2x5cGggc3RyaW5nc1xuICAgKiByZXByZXNlbnRlZCBieSB0aGUgc3RhdGUgbWFjaGluZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udHJhdmVyc2UgPSBmdW5jdGlvbiB0cmF2ZXJzZShvcHRzLCBzdGF0ZSwgdmlzaXRlZCkge1xuICAgIGlmIChzdGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgICBzdGF0ZSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHZpc2l0ZWQgPT09IHZvaWQgMCkge1xuICAgICAgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgICB9XG5cbiAgICBpZiAodmlzaXRlZC5oYXMoc3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmlzaXRlZC5hZGQoc3RhdGUpO1xuICAgIHZhciBfdGhpcyRzdGF0ZVRhYmxlID0gdGhpcy5zdGF0ZVRhYmxlLFxuICAgICAgICBuQ2xhc3NlcyA9IF90aGlzJHN0YXRlVGFibGUubkNsYXNzZXMsXG4gICAgICAgIHN0YXRlQXJyYXkgPSBfdGhpcyRzdGF0ZVRhYmxlLnN0YXRlQXJyYXksXG4gICAgICAgIGVudHJ5VGFibGUgPSBfdGhpcyRzdGF0ZVRhYmxlLmVudHJ5VGFibGU7XG4gICAgdmFyIHJvdyA9IHN0YXRlQXJyYXkuZ2V0SXRlbShzdGF0ZSk7IC8vIFNraXAgcHJlZGVmaW5lZCBjbGFzc2VzXG5cbiAgICBmb3IgKHZhciBjbGFzc0NvZGUgPSA0OyBjbGFzc0NvZGUgPCBuQ2xhc3NlczsgY2xhc3NDb2RlKyspIHtcbiAgICAgIHZhciBlbnRyeUluZGV4ID0gcm93W2NsYXNzQ29kZV07XG4gICAgICB2YXIgZW50cnkgPSBlbnRyeVRhYmxlLmdldEl0ZW0oZW50cnlJbmRleCk7IC8vIFRyeSBhbGwgZ2x5cGhzIGluIHRoZSBjbGFzc1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJDkodGhpcy5sb29rdXBUYWJsZS5nbHlwaHNGb3JWYWx1ZShjbGFzc0NvZGUpKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGdseXBoID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgaWYgKG9wdHMuZW50ZXIpIHtcbiAgICAgICAgICBvcHRzLmVudGVyKGdseXBoLCBlbnRyeSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkubmV3U3RhdGUgIT09IDApIHtcbiAgICAgICAgICB0aGlzLnRyYXZlcnNlKG9wdHMsIGVudHJ5Lm5ld1N0YXRlLCB2aXNpdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLmV4aXQpIHtcbiAgICAgICAgICBvcHRzLmV4aXQoZ2x5cGgsIGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gQUFUU3RhdGVNYWNoaW5lO1xufSgpO1xuXG52YXIgX2NsYXNzJDI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYShvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkYShvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkYShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGEobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRhKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkYShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQyKHRhcmdldCwgcHJvcGVydHksIGRlY29yYXRvcnMsIGRlc2NyaXB0b3IsIGNvbnRleHQpIHsgdmFyIGRlc2MgPSB7fTsgT2JqZWN0LmtleXMoZGVzY3JpcHRvcikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IGRlc2Nba2V5XSA9IGRlc2NyaXB0b3Jba2V5XTsgfSk7IGRlc2MuZW51bWVyYWJsZSA9ICEhZGVzYy5lbnVtZXJhYmxlOyBkZXNjLmNvbmZpZ3VyYWJsZSA9ICEhZGVzYy5jb25maWd1cmFibGU7IGlmICgndmFsdWUnIGluIGRlc2MgfHwgZGVzYy5pbml0aWFsaXplcikgeyBkZXNjLndyaXRhYmxlID0gdHJ1ZTsgfSBkZXNjID0gZGVjb3JhdG9ycy5zbGljZSgpLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGRlc2MsIGRlY29yYXRvcikgeyByZXR1cm4gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHksIGRlc2MpIHx8IGRlc2M7IH0sIGRlc2MpOyBpZiAoY29udGV4dCAmJiBkZXNjLmluaXRpYWxpemVyICE9PSB2b2lkIDApIHsgZGVzYy52YWx1ZSA9IGRlc2MuaW5pdGlhbGl6ZXIgPyBkZXNjLmluaXRpYWxpemVyLmNhbGwoY29udGV4dCkgOiB2b2lkIDA7IGRlc2MuaW5pdGlhbGl6ZXIgPSB1bmRlZmluZWQ7IH0gaWYgKGRlc2MuaW5pdGlhbGl6ZXIgPT09IHZvaWQgMCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYyk7IGRlc2MgPSBudWxsOyB9IHJldHVybiBkZXNjOyB9XG5cbnZhciBNQVJLX0ZJUlNUID0gMHg4MDAwO1xudmFyIE1BUktfTEFTVCA9IDB4MjAwMDtcbnZhciBWRVJCID0gMHgwMDBGOyAvLyBjb250ZXh0dWFsIHN1YnN0aXR1dGlvbiBhbmQgZ2x5cGggaW5zZXJ0aW9uIGZsYWdcblxudmFyIFNFVF9NQVJLID0gMHg4MDAwOyAvLyBsaWdhdHVyZSBlbnRyeSBmbGFnc1xuXG52YXIgU0VUX0NPTVBPTkVOVCA9IDB4ODAwMDtcbnZhciBQRVJGT1JNX0FDVElPTiA9IDB4MjAwMDsgLy8gbGlnYXR1cmUgYWN0aW9uIG1hc2tzXG5cbnZhciBMQVNUX01BU0sgPSAweDgwMDAwMDAwO1xudmFyIFNUT1JFX01BU0sgPSAweDQwMDAwMDAwO1xudmFyIE9GRlNFVF9NQVNLID0gMHgzRkZGRkZGRjtcbnZhciBSRVZFUlNFX0RJUkVDVElPTiA9IDB4NDAwMDAwO1xudmFyIENVUlJFTlRfSU5TRVJUX0JFRk9SRSA9IDB4MDgwMDtcbnZhciBNQVJLRURfSU5TRVJUX0JFRk9SRSA9IDB4MDQwMDtcbnZhciBDVVJSRU5UX0lOU0VSVF9DT1VOVCA9IDB4MDNFMDtcbnZhciBNQVJLRURfSU5TRVJUX0NPVU5UID0gMHgwMDFGO1xudmFyIEFBVE1vcnhQcm9jZXNzb3IgPSAoX2NsYXNzJDIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBQVRNb3J4UHJvY2Vzc29yKGZvbnQpIHtcbiAgICB0aGlzLnByb2Nlc3NJbmRpY1JlYXJyYWdlbWVudCA9IHRoaXMucHJvY2Vzc0luZGljUmVhcnJhZ2VtZW50LmJpbmQodGhpcyk7XG4gICAgdGhpcy5wcm9jZXNzQ29udGV4dHVhbFN1YnN0aXR1dGlvbiA9IHRoaXMucHJvY2Vzc0NvbnRleHR1YWxTdWJzdGl0dXRpb24uYmluZCh0aGlzKTtcbiAgICB0aGlzLnByb2Nlc3NMaWdhdHVyZSA9IHRoaXMucHJvY2Vzc0xpZ2F0dXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5wcm9jZXNzTm9uY29udGV4dHVhbFN1YnN0aXR1dGlvbnMgPSB0aGlzLnByb2Nlc3NOb25jb250ZXh0dWFsU3Vic3RpdHV0aW9ucy5iaW5kKHRoaXMpO1xuICAgIHRoaXMucHJvY2Vzc0dseXBoSW5zZXJ0aW9uID0gdGhpcy5wcm9jZXNzR2x5cGhJbnNlcnRpb24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmZvbnQgPSBmb250O1xuICAgIHRoaXMubW9yeCA9IGZvbnQubW9yeDtcbiAgICB0aGlzLmlucHV0Q2FjaGUgPSBudWxsO1xuICB9IC8vIFByb2Nlc3NlcyBhbiBhcnJheSBvZiBnbHlwaHMgYW5kIGFwcGxpZXMgdGhlIHNwZWNpZmllZCBmZWF0dXJlc1xuICAvLyBGZWF0dXJlcyBzaG91bGQgYmUgaW4gdGhlIGZvcm0gb2Yge2ZlYXR1cmVUeXBlOntmZWF0dXJlU2V0dGluZzp0cnVlfX1cblxuXG4gIHZhciBfcHJvdG8gPSBBQVRNb3J4UHJvY2Vzc29yLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucHJvY2VzcyA9IGZ1bmN0aW9uIHByb2Nlc3MoZ2x5cGhzLCBmZWF0dXJlcykge1xuICAgIGlmIChmZWF0dXJlcyA9PT0gdm9pZCAwKSB7XG4gICAgICBmZWF0dXJlcyA9IHt9O1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYSh0aGlzLm1vcnguY2hhaW5zKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBjaGFpbiA9IF9zdGVwLnZhbHVlO1xuICAgICAgdmFyIGZsYWdzID0gY2hhaW4uZGVmYXVsdEZsYWdzOyAvLyBlbmFibGUvZGlzYWJsZSB0aGUgcmVxdWVzdGVkIGZlYXR1cmVzXG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGEoY2hhaW4uZmVhdHVyZXMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IF9zdGVwMi52YWx1ZTtcbiAgICAgICAgdmFyIGYgPSB2b2lkIDA7XG5cbiAgICAgICAgaWYgKChmID0gZmVhdHVyZXNbZmVhdHVyZS5mZWF0dXJlVHlwZV0pICYmIGZbZmVhdHVyZS5mZWF0dXJlU2V0dGluZ10pIHtcbiAgICAgICAgICBmbGFncyAmPSBmZWF0dXJlLmRpc2FibGVGbGFncztcbiAgICAgICAgICBmbGFncyB8PSBmZWF0dXJlLmVuYWJsZUZsYWdzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGEoY2hhaW4uc3VidGFibGVzKSwgX3N0ZXAzOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHN1YnRhYmxlID0gX3N0ZXAzLnZhbHVlO1xuXG4gICAgICAgIGlmIChzdWJ0YWJsZS5zdWJGZWF0dXJlRmxhZ3MgJiBmbGFncykge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc1N1YnRhYmxlKHN1YnRhYmxlLCBnbHlwaHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyByZW1vdmUgZGVsZXRlZCBnbHlwaHNcblxuXG4gICAgdmFyIGluZGV4ID0gZ2x5cGhzLmxlbmd0aCAtIDE7XG5cbiAgICB3aGlsZSAoaW5kZXggPj0gMCkge1xuICAgICAgaWYgKGdseXBoc1tpbmRleF0uaWQgPT09IDB4ZmZmZikge1xuICAgICAgICBnbHlwaHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgaW5kZXgtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2x5cGhzO1xuICB9O1xuXG4gIF9wcm90by5wcm9jZXNzU3VidGFibGUgPSBmdW5jdGlvbiBwcm9jZXNzU3VidGFibGUoc3VidGFibGUsIGdseXBocykge1xuICAgIHRoaXMuc3VidGFibGUgPSBzdWJ0YWJsZTtcbiAgICB0aGlzLmdseXBocyA9IGdseXBocztcblxuICAgIGlmICh0aGlzLnN1YnRhYmxlLnR5cGUgPT09IDQpIHtcbiAgICAgIHRoaXMucHJvY2Vzc05vbmNvbnRleHR1YWxTdWJzdGl0dXRpb25zKHRoaXMuc3VidGFibGUsIHRoaXMuZ2x5cGhzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxpZ2F0dXJlU3RhY2sgPSBbXTtcbiAgICB0aGlzLm1hcmtlZEdseXBoID0gbnVsbDtcbiAgICB0aGlzLmZpcnN0R2x5cGggPSBudWxsO1xuICAgIHRoaXMubGFzdEdseXBoID0gbnVsbDtcbiAgICB0aGlzLm1hcmtlZEluZGV4ID0gbnVsbDtcbiAgICB2YXIgc3RhdGVNYWNoaW5lID0gdGhpcy5nZXRTdGF0ZU1hY2hpbmUoc3VidGFibGUpO1xuICAgIHZhciBwcm9jZXNzID0gdGhpcy5nZXRQcm9jZXNzb3IoKTtcbiAgICB2YXIgcmV2ZXJzZSA9ICEhKHRoaXMuc3VidGFibGUuY292ZXJhZ2UgJiBSRVZFUlNFX0RJUkVDVElPTik7XG4gICAgcmV0dXJuIHN0YXRlTWFjaGluZS5wcm9jZXNzKHRoaXMuZ2x5cGhzLCByZXZlcnNlLCBwcm9jZXNzKTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0U3RhdGVNYWNoaW5lID0gZnVuY3Rpb24gZ2V0U3RhdGVNYWNoaW5lKHN1YnRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBBQVRTdGF0ZU1hY2hpbmUoc3VidGFibGUudGFibGUuc3RhdGVUYWJsZSk7XG4gIH07XG5cbiAgX3Byb3RvLmdldFByb2Nlc3NvciA9IGZ1bmN0aW9uIGdldFByb2Nlc3NvcigpIHtcbiAgICBzd2l0Y2ggKHRoaXMuc3VidGFibGUudHlwZSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSW5kaWNSZWFycmFnZW1lbnQ7XG5cbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0NvbnRleHR1YWxTdWJzdGl0dXRpb247XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0xpZ2F0dXJlO1xuXG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NOb25jb250ZXh0dWFsU3Vic3RpdHV0aW9ucztcblxuICAgICAgY2FzZSA1OlxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzR2x5cGhJbnNlcnRpb247XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbW9yeCBzdWJ0YWJsZSB0eXBlOiBcIiArIHRoaXMuc3VidGFibGUudHlwZSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5wcm9jZXNzSW5kaWNSZWFycmFnZW1lbnQgPSBmdW5jdGlvbiBwcm9jZXNzSW5kaWNSZWFycmFnZW1lbnQoZ2x5cGgsIGVudHJ5LCBpbmRleCkge1xuICAgIGlmIChlbnRyeS5mbGFncyAmIE1BUktfRklSU1QpIHtcbiAgICAgIHRoaXMuZmlyc3RHbHlwaCA9IGluZGV4O1xuICAgIH1cblxuICAgIGlmIChlbnRyeS5mbGFncyAmIE1BUktfTEFTVCkge1xuICAgICAgdGhpcy5sYXN0R2x5cGggPSBpbmRleDtcbiAgICB9XG5cbiAgICByZW9yZGVyR2x5cGhzKHRoaXMuZ2x5cGhzLCBlbnRyeS5mbGFncyAmIFZFUkIsIHRoaXMuZmlyc3RHbHlwaCwgdGhpcy5sYXN0R2x5cGgpO1xuICB9O1xuXG4gIF9wcm90by5wcm9jZXNzQ29udGV4dHVhbFN1YnN0aXR1dGlvbiA9IGZ1bmN0aW9uIHByb2Nlc3NDb250ZXh0dWFsU3Vic3RpdHV0aW9uKGdseXBoLCBlbnRyeSwgaW5kZXgpIHtcbiAgICB2YXIgc3Vic2l0dXRpb25zID0gdGhpcy5zdWJ0YWJsZS50YWJsZS5zdWJzdGl0dXRpb25UYWJsZS5pdGVtcztcblxuICAgIGlmIChlbnRyeS5tYXJrSW5kZXggIT09IDB4ZmZmZikge1xuICAgICAgdmFyIGxvb2t1cCA9IHN1YnNpdHV0aW9ucy5nZXRJdGVtKGVudHJ5Lm1hcmtJbmRleCk7XG4gICAgICB2YXIgbG9va3VwVGFibGUgPSBuZXcgQUFUTG9va3VwVGFibGUobG9va3VwKTtcbiAgICAgIGdseXBoID0gdGhpcy5nbHlwaHNbdGhpcy5tYXJrZWRHbHlwaF07XG4gICAgICB2YXIgZ2lkID0gbG9va3VwVGFibGUubG9va3VwKGdseXBoLmlkKTtcblxuICAgICAgaWYgKGdpZCkge1xuICAgICAgICB0aGlzLmdseXBoc1t0aGlzLm1hcmtlZEdseXBoXSA9IHRoaXMuZm9udC5nZXRHbHlwaChnaWQsIGdseXBoLmNvZGVQb2ludHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5jdXJyZW50SW5kZXggIT09IDB4ZmZmZikge1xuICAgICAgdmFyIF9sb29rdXAgPSBzdWJzaXR1dGlvbnMuZ2V0SXRlbShlbnRyeS5jdXJyZW50SW5kZXgpO1xuXG4gICAgICB2YXIgX2xvb2t1cFRhYmxlID0gbmV3IEFBVExvb2t1cFRhYmxlKF9sb29rdXApO1xuXG4gICAgICBnbHlwaCA9IHRoaXMuZ2x5cGhzW2luZGV4XTtcblxuICAgICAgdmFyIGdpZCA9IF9sb29rdXBUYWJsZS5sb29rdXAoZ2x5cGguaWQpO1xuXG4gICAgICBpZiAoZ2lkKSB7XG4gICAgICAgIHRoaXMuZ2x5cGhzW2luZGV4XSA9IHRoaXMuZm9udC5nZXRHbHlwaChnaWQsIGdseXBoLmNvZGVQb2ludHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5mbGFncyAmIFNFVF9NQVJLKSB7XG4gICAgICB0aGlzLm1hcmtlZEdseXBoID0gaW5kZXg7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5wcm9jZXNzTGlnYXR1cmUgPSBmdW5jdGlvbiBwcm9jZXNzTGlnYXR1cmUoZ2x5cGgsIGVudHJ5LCBpbmRleCkge1xuICAgIGlmIChlbnRyeS5mbGFncyAmIFNFVF9DT01QT05FTlQpIHtcbiAgICAgIHRoaXMubGlnYXR1cmVTdGFjay5wdXNoKGluZGV4KTtcbiAgICB9XG5cbiAgICBpZiAoZW50cnkuZmxhZ3MgJiBQRVJGT1JNX0FDVElPTikge1xuICAgICAgdmFyIF90aGlzJGxpZ2F0dXJlU3RhY2s7XG5cbiAgICAgIHZhciBhY3Rpb25zID0gdGhpcy5zdWJ0YWJsZS50YWJsZS5saWdhdHVyZUFjdGlvbnM7XG4gICAgICB2YXIgY29tcG9uZW50cyA9IHRoaXMuc3VidGFibGUudGFibGUuY29tcG9uZW50cztcbiAgICAgIHZhciBsaWdhdHVyZUxpc3QgPSB0aGlzLnN1YnRhYmxlLnRhYmxlLmxpZ2F0dXJlTGlzdDtcbiAgICAgIHZhciBhY3Rpb25JbmRleCA9IGVudHJ5LmFjdGlvbjtcbiAgICAgIHZhciBsYXN0ID0gZmFsc2U7XG4gICAgICB2YXIgbGlnYXR1cmVJbmRleCA9IDA7XG4gICAgICB2YXIgY29kZVBvaW50cyA9IFtdO1xuICAgICAgdmFyIGxpZ2F0dXJlR2x5cGhzID0gW107XG5cbiAgICAgIHdoaWxlICghbGFzdCkge1xuICAgICAgICB2YXIgX2NvZGVQb2ludHM7XG5cbiAgICAgICAgdmFyIGNvbXBvbmVudEdseXBoID0gdGhpcy5saWdhdHVyZVN0YWNrLnBvcCgpO1xuXG4gICAgICAgIChfY29kZVBvaW50cyA9IGNvZGVQb2ludHMpLnVuc2hpZnQuYXBwbHkoX2NvZGVQb2ludHMsIHRoaXMuZ2x5cGhzW2NvbXBvbmVudEdseXBoXS5jb2RlUG9pbnRzKTtcblxuICAgICAgICB2YXIgYWN0aW9uID0gYWN0aW9ucy5nZXRJdGVtKGFjdGlvbkluZGV4KyspO1xuICAgICAgICBsYXN0ID0gISEoYWN0aW9uICYgTEFTVF9NQVNLKTtcbiAgICAgICAgdmFyIHN0b3JlID0gISEoYWN0aW9uICYgU1RPUkVfTUFTSyk7XG4gICAgICAgIHZhciBvZmZzZXQgPSAoYWN0aW9uICYgT0ZGU0VUX01BU0spIDw8IDIgPj4gMjsgLy8gc2lnbiBleHRlbmQgMzAgdG8gMzIgYml0c1xuXG4gICAgICAgIG9mZnNldCArPSB0aGlzLmdseXBoc1tjb21wb25lbnRHbHlwaF0uaWQ7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSBjb21wb25lbnRzLmdldEl0ZW0ob2Zmc2V0KTtcbiAgICAgICAgbGlnYXR1cmVJbmRleCArPSBjb21wb25lbnQ7XG5cbiAgICAgICAgaWYgKGxhc3QgfHwgc3RvcmUpIHtcbiAgICAgICAgICB2YXIgbGlnYXR1cmVFbnRyeSA9IGxpZ2F0dXJlTGlzdC5nZXRJdGVtKGxpZ2F0dXJlSW5kZXgpO1xuICAgICAgICAgIHRoaXMuZ2x5cGhzW2NvbXBvbmVudEdseXBoXSA9IHRoaXMuZm9udC5nZXRHbHlwaChsaWdhdHVyZUVudHJ5LCBjb2RlUG9pbnRzKTtcbiAgICAgICAgICBsaWdhdHVyZUdseXBocy5wdXNoKGNvbXBvbmVudEdseXBoKTtcbiAgICAgICAgICBsaWdhdHVyZUluZGV4ID0gMDtcbiAgICAgICAgICBjb2RlUG9pbnRzID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5nbHlwaHNbY29tcG9uZW50R2x5cGhdID0gdGhpcy5mb250LmdldEdseXBoKDB4ZmZmZik7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gUHV0IGxpZ2F0dXJlIGdseXBoIGluZGV4ZXMgYmFjayBvbiB0aGUgc3RhY2tcblxuXG4gICAgICAoX3RoaXMkbGlnYXR1cmVTdGFjayA9IHRoaXMubGlnYXR1cmVTdGFjaykucHVzaC5hcHBseShfdGhpcyRsaWdhdHVyZVN0YWNrLCBsaWdhdHVyZUdseXBocyk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5wcm9jZXNzTm9uY29udGV4dHVhbFN1YnN0aXR1dGlvbnMgPSBmdW5jdGlvbiBwcm9jZXNzTm9uY29udGV4dHVhbFN1YnN0aXR1dGlvbnMoc3VidGFibGUsIGdseXBocywgaW5kZXgpIHtcbiAgICB2YXIgbG9va3VwVGFibGUgPSBuZXcgQUFUTG9va3VwVGFibGUoc3VidGFibGUudGFibGUubG9va3VwVGFibGUpO1xuXG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgZ2x5cGhzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2luZGV4XTtcblxuICAgICAgaWYgKGdseXBoLmlkICE9PSAweGZmZmYpIHtcbiAgICAgICAgdmFyIGdpZCA9IGxvb2t1cFRhYmxlLmxvb2t1cChnbHlwaC5pZCk7XG5cbiAgICAgICAgaWYgKGdpZCkge1xuICAgICAgICAgIC8vIDAgbWVhbnMgZG8gbm90aGluZ1xuICAgICAgICAgIGdseXBoc1tpbmRleF0gPSB0aGlzLmZvbnQuZ2V0R2x5cGgoZ2lkLCBnbHlwaC5jb2RlUG9pbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uX2luc2VydEdseXBocyA9IGZ1bmN0aW9uIF9pbnNlcnRHbHlwaHMoZ2x5cGhJbmRleCwgaW5zZXJ0aW9uQWN0aW9uSW5kZXgsIGNvdW50LCBpc0JlZm9yZSkge1xuICAgIHZhciBfdGhpcyRnbHlwaHM7XG5cbiAgICB2YXIgaW5zZXJ0aW9ucyA9IFtdO1xuXG4gICAgd2hpbGUgKGNvdW50LS0pIHtcbiAgICAgIHZhciBnaWQgPSB0aGlzLnN1YnRhYmxlLnRhYmxlLmluc2VydGlvbkFjdGlvbnMuZ2V0SXRlbShpbnNlcnRpb25BY3Rpb25JbmRleCsrKTtcbiAgICAgIGluc2VydGlvbnMucHVzaCh0aGlzLmZvbnQuZ2V0R2x5cGgoZ2lkKSk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0JlZm9yZSkge1xuICAgICAgZ2x5cGhJbmRleCsrO1xuICAgIH1cblxuICAgIChfdGhpcyRnbHlwaHMgPSB0aGlzLmdseXBocykuc3BsaWNlLmFwcGx5KF90aGlzJGdseXBocywgW2dseXBoSW5kZXgsIDBdLmNvbmNhdChpbnNlcnRpb25zKSk7XG4gIH07XG5cbiAgX3Byb3RvLnByb2Nlc3NHbHlwaEluc2VydGlvbiA9IGZ1bmN0aW9uIHByb2Nlc3NHbHlwaEluc2VydGlvbihnbHlwaCwgZW50cnksIGluZGV4KSB7XG4gICAgaWYgKGVudHJ5LmZsYWdzICYgU0VUX01BUkspIHtcbiAgICAgIHRoaXMubWFya2VkSW5kZXggPSBpbmRleDtcbiAgICB9XG5cbiAgICBpZiAoZW50cnkubWFya2VkSW5zZXJ0SW5kZXggIT09IDB4ZmZmZikge1xuICAgICAgdmFyIGNvdW50ID0gKGVudHJ5LmZsYWdzICYgTUFSS0VEX0lOU0VSVF9DT1VOVCkgPj4+IDU7XG4gICAgICB2YXIgaXNCZWZvcmUgPSAhIShlbnRyeS5mbGFncyAmIE1BUktFRF9JTlNFUlRfQkVGT1JFKTtcblxuICAgICAgdGhpcy5faW5zZXJ0R2x5cGhzKHRoaXMubWFya2VkSW5kZXgsIGVudHJ5Lm1hcmtlZEluc2VydEluZGV4LCBjb3VudCwgaXNCZWZvcmUpO1xuICAgIH1cblxuICAgIGlmIChlbnRyeS5jdXJyZW50SW5zZXJ0SW5kZXggIT09IDB4ZmZmZikge1xuICAgICAgdmFyIF9jb3VudCA9IChlbnRyeS5mbGFncyAmIENVUlJFTlRfSU5TRVJUX0NPVU5UKSA+Pj4gNTtcblxuICAgICAgdmFyIF9pc0JlZm9yZSA9ICEhKGVudHJ5LmZsYWdzICYgQ1VSUkVOVF9JTlNFUlRfQkVGT1JFKTtcblxuICAgICAgdGhpcy5faW5zZXJ0R2x5cGhzKGluZGV4LCBlbnRyeS5jdXJyZW50SW5zZXJ0SW5kZXgsIF9jb3VudCwgX2lzQmVmb3JlKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmdldFN1cHBvcnRlZEZlYXR1cmVzID0gZnVuY3Rpb24gZ2V0U3VwcG9ydGVkRmVhdHVyZXMoKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gW107XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRhKHRoaXMubW9yeC5jaGFpbnMpLCBfc3RlcDQ7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNCgpKS5kb25lOykge1xuICAgICAgdmFyIGNoYWluID0gX3N0ZXA0LnZhbHVlO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3I1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRhKGNoYWluLmZlYXR1cmVzKSwgX3N0ZXA1OyAhKF9zdGVwNSA9IF9pdGVyYXRvcjUoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBfc3RlcDUudmFsdWU7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goW2ZlYXR1cmUuZmVhdHVyZVR5cGUsIGZlYXR1cmUuZmVhdHVyZVNldHRpbmddKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmVhdHVyZXM7XG4gIH07XG5cbiAgX3Byb3RvLmdlbmVyYXRlSW5wdXRzID0gZnVuY3Rpb24gZ2VuZXJhdGVJbnB1dHMoZ2lkKSB7XG4gICAgaWYgKCF0aGlzLmlucHV0Q2FjaGUpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVJbnB1dENhY2hlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5wdXRDYWNoZVtnaWRdIHx8IFtdO1xuICB9O1xuXG4gIF9wcm90by5nZW5lcmF0ZUlucHV0Q2FjaGUgPSBmdW5jdGlvbiBnZW5lcmF0ZUlucHV0Q2FjaGUoKSB7XG4gICAgdGhpcy5pbnB1dENhY2hlID0ge307XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3I2ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRhKHRoaXMubW9yeC5jaGFpbnMpLCBfc3RlcDY7ICEoX3N0ZXA2ID0gX2l0ZXJhdG9yNigpKS5kb25lOykge1xuICAgICAgdmFyIGNoYWluID0gX3N0ZXA2LnZhbHVlO1xuICAgICAgdmFyIGZsYWdzID0gY2hhaW4uZGVmYXVsdEZsYWdzO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3I3ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRhKGNoYWluLnN1YnRhYmxlcyksIF9zdGVwNzsgIShfc3RlcDcgPSBfaXRlcmF0b3I3KCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBzdWJ0YWJsZSA9IF9zdGVwNy52YWx1ZTtcblxuICAgICAgICBpZiAoc3VidGFibGUuc3ViRmVhdHVyZUZsYWdzICYgZmxhZ3MpIHtcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlSW5wdXRzRm9yU3VidGFibGUoc3VidGFibGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5nZW5lcmF0ZUlucHV0c0ZvclN1YnRhYmxlID0gZnVuY3Rpb24gZ2VuZXJhdGVJbnB1dHNGb3JTdWJ0YWJsZShzdWJ0YWJsZSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAvLyBDdXJyZW50bHksIG9ubHkgc3VwcG9ydGluZyBsaWdhdHVyZSBzdWJ0YWJsZXMuXG4gICAgaWYgKHN1YnRhYmxlLnR5cGUgIT09IDIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcmV2ZXJzZSA9ICEhKHN1YnRhYmxlLmNvdmVyYWdlICYgUkVWRVJTRV9ESVJFQ1RJT04pO1xuXG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmV2ZXJzZSBzdWJ0YWJsZSwgbm90IHN1cHBvcnRlZC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnRhYmxlID0gc3VidGFibGU7XG4gICAgdGhpcy5saWdhdHVyZVN0YWNrID0gW107XG4gICAgdmFyIHN0YXRlTWFjaGluZSA9IHRoaXMuZ2V0U3RhdGVNYWNoaW5lKHN1YnRhYmxlKTtcbiAgICB2YXIgcHJvY2VzcyA9IHRoaXMuZ2V0UHJvY2Vzc29yKCk7XG4gICAgdmFyIGlucHV0ID0gW107XG4gICAgdmFyIHN0YWNrID0gW107XG4gICAgdGhpcy5nbHlwaHMgPSBbXTtcbiAgICBzdGF0ZU1hY2hpbmUudHJhdmVyc2Uoe1xuICAgICAgZW50ZXI6IGZ1bmN0aW9uIGVudGVyKGdseXBoLCBlbnRyeSkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gX3RoaXMuZ2x5cGhzO1xuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICBnbHlwaHM6IGdseXBocy5zbGljZSgpLFxuICAgICAgICAgIGxpZ2F0dXJlU3RhY2s6IF90aGlzLmxpZ2F0dXJlU3RhY2suc2xpY2UoKVxuICAgICAgICB9KTsgLy8gQWRkIGdseXBoIHRvIGlucHV0IGFuZCBnbHlwaHMgdG8gcHJvY2Vzcy5cblxuICAgICAgICB2YXIgZyA9IF90aGlzLmZvbnQuZ2V0R2x5cGgoZ2x5cGgpO1xuXG4gICAgICAgIGlucHV0LnB1c2goZyk7XG4gICAgICAgIGdseXBocy5wdXNoKGlucHV0W2lucHV0Lmxlbmd0aCAtIDFdKTsgLy8gUHJvY2VzcyBsaWdhdHVyZSBzdWJzdGl0dXRpb25cblxuICAgICAgICBwcm9jZXNzKGdseXBoc1tnbHlwaHMubGVuZ3RoIC0gMV0sIGVudHJ5LCBnbHlwaHMubGVuZ3RoIC0gMSk7IC8vIEFkZCBpbnB1dCB0byByZXN1bHQgaWYgb25seSBvbmUgbWF0Y2hpbmcgKG5vbi1kZWxldGVkKSBnbHlwaCByZW1haW5zLlxuXG4gICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgIHZhciBmb3VuZCA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaHMubGVuZ3RoICYmIGNvdW50IDw9IDE7IGkrKykge1xuICAgICAgICAgIGlmIChnbHlwaHNbaV0uaWQgIT09IDB4ZmZmZikge1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIGZvdW5kID0gZ2x5cGhzW2ldLmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSBpbnB1dC5tYXAoZnVuY3Rpb24gKGcpIHtcbiAgICAgICAgICAgIHJldHVybiBnLmlkO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBfY2FjaGUgPSBfdGhpcy5pbnB1dENhY2hlW2ZvdW5kXTtcblxuICAgICAgICAgIGlmIChfY2FjaGUpIHtcbiAgICAgICAgICAgIF9jYWNoZS5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLmlucHV0Q2FjaGVbZm91bmRdID0gW3Jlc3VsdF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXhpdDogZnVuY3Rpb24gZXhpdCgpIHtcbiAgICAgICAgdmFyIF9zdGFjayRwb3AgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICBfdGhpcy5nbHlwaHMgPSBfc3RhY2skcG9wLmdseXBocztcbiAgICAgICAgX3RoaXMubGlnYXR1cmVTdGFjayA9IF9zdGFjayRwb3AubGlnYXR1cmVTdGFjaztcbiAgICAgICAgaW5wdXQucG9wKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIEFBVE1vcnhQcm9jZXNzb3I7XG59KCksIChfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDIoX2NsYXNzJDIucHJvdG90eXBlLCBcImdldFN0YXRlTWFjaGluZVwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQyLnByb3RvdHlwZSwgXCJnZXRTdGF0ZU1hY2hpbmVcIiksIF9jbGFzcyQyLnByb3RvdHlwZSkpLCBfY2xhc3MkMik7XG4vLyByZXZlcnNlIHRoZSBnbHlwaHMgaW5zaWRlIHRob3NlIHJhbmdlcyBpZiBzcGVjaWZpZWRcbi8vIHJhbmdlcyBhcmUgaW4gW29mZnNldCwgbGVuZ3RoXSBmb3JtYXRcblxuZnVuY3Rpb24gc3dhcChnbHlwaHMsIHJhbmdlQSwgcmFuZ2VCLCByZXZlcnNlQSwgcmV2ZXJzZUIpIHtcbiAgaWYgKHJldmVyc2VBID09PSB2b2lkIDApIHtcbiAgICByZXZlcnNlQSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKHJldmVyc2VCID09PSB2b2lkIDApIHtcbiAgICByZXZlcnNlQiA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIGVuZCA9IGdseXBocy5zcGxpY2UocmFuZ2VCWzBdIC0gKHJhbmdlQlsxXSAtIDEpLCByYW5nZUJbMV0pO1xuXG4gIGlmIChyZXZlcnNlQikge1xuICAgIGVuZC5yZXZlcnNlKCk7XG4gIH1cblxuICB2YXIgc3RhcnQgPSBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW3JhbmdlQVswXSwgcmFuZ2VBWzFdXS5jb25jYXQoZW5kKSk7XG5cbiAgaWYgKHJldmVyc2VBKSB7XG4gICAgc3RhcnQucmV2ZXJzZSgpO1xuICB9XG5cbiAgZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtyYW5nZUJbMF0gLSAocmFuZ2VBWzFdIC0gMSksIDBdLmNvbmNhdChzdGFydCkpO1xuICByZXR1cm4gZ2x5cGhzO1xufVxuXG5mdW5jdGlvbiByZW9yZGVyR2x5cGhzKGdseXBocywgdmVyYiwgZmlyc3RHbHlwaCwgbGFzdEdseXBoKSB7XG5cbiAgc3dpdGNoICh2ZXJiKSB7XG4gICAgY2FzZSAwOlxuICAgICAgLy8gbm8gY2hhbmdlXG4gICAgICByZXR1cm4gZ2x5cGhzO1xuXG4gICAgY2FzZSAxOlxuICAgICAgLy8gQXggPT4geEFcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDFdLCBbbGFzdEdseXBoLCAwXSk7XG5cbiAgICBjYXNlIDI6XG4gICAgICAvLyB4RCA9PiBEeFxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMF0sIFtsYXN0R2x5cGgsIDFdKTtcblxuICAgIGNhc2UgMzpcbiAgICAgIC8vIEF4RCA9PiBEeEFcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDFdLCBbbGFzdEdseXBoLCAxXSk7XG5cbiAgICBjYXNlIDQ6XG4gICAgICAvLyBBQnggPT4geEFCXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAyXSwgW2xhc3RHbHlwaCwgMF0pO1xuXG4gICAgY2FzZSA1OlxuICAgICAgLy8gQUJ4ID0+IHhCQVxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMl0sIFtsYXN0R2x5cGgsIDBdLCB0cnVlLCBmYWxzZSk7XG5cbiAgICBjYXNlIDY6XG4gICAgICAvLyB4Q0QgPT4gQ0R4XG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAwXSwgW2xhc3RHbHlwaCwgMl0pO1xuXG4gICAgY2FzZSA3OlxuICAgICAgLy8geENEID0+IERDeFxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMF0sIFtsYXN0R2x5cGgsIDJdLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgICBjYXNlIDg6XG4gICAgICAvLyBBeENEID0+IENEeEFcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDFdLCBbbGFzdEdseXBoLCAyXSk7XG5cbiAgICBjYXNlIDk6XG4gICAgICAvLyBBeENEID0+IERDeEFcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDFdLCBbbGFzdEdseXBoLCAyXSwgZmFsc2UsIHRydWUpO1xuXG4gICAgY2FzZSAxMDpcbiAgICAgIC8vIEFCeEQgPT4gRHhBQlxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMl0sIFtsYXN0R2x5cGgsIDFdKTtcblxuICAgIGNhc2UgMTE6XG4gICAgICAvLyBBQnhEID0+IER4QkFcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDJdLCBbbGFzdEdseXBoLCAxXSwgdHJ1ZSwgZmFsc2UpO1xuXG4gICAgY2FzZSAxMjpcbiAgICAgIC8vIEFCeENEID0+IENEeEFCXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAyXSwgW2xhc3RHbHlwaCwgMl0pO1xuXG4gICAgY2FzZSAxMzpcbiAgICAgIC8vIEFCeENEID0+IENEeEJBXG4gICAgICByZXR1cm4gc3dhcChnbHlwaHMsIFtmaXJzdEdseXBoLCAyXSwgW2xhc3RHbHlwaCwgMl0sIHRydWUsIGZhbHNlKTtcblxuICAgIGNhc2UgMTQ6XG4gICAgICAvLyBBQnhDRCA9PiBEQ3hBQlxuICAgICAgcmV0dXJuIHN3YXAoZ2x5cGhzLCBbZmlyc3RHbHlwaCwgMl0sIFtsYXN0R2x5cGgsIDJdLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgICBjYXNlIDE1OlxuICAgICAgLy8gQUJ4Q0QgPT4gREN4QkFcbiAgICAgIHJldHVybiBzd2FwKGdseXBocywgW2ZpcnN0R2x5cGgsIDJdLCBbbGFzdEdseXBoLCAyXSwgdHJ1ZSwgdHJ1ZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB2ZXJiOiBcIiArIHZlcmIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYihvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkYihvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkYihvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGIobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRiKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkYihhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxudmFyIEFBVExheW91dEVuZ2luZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFBVExheW91dEVuZ2luZShmb250KSB7XG4gICAgdGhpcy5mb250ID0gZm9udDtcbiAgICB0aGlzLm1vcnhQcm9jZXNzb3IgPSBuZXcgQUFUTW9yeFByb2Nlc3Nvcihmb250KTtcbiAgICB0aGlzLmZhbGxiYWNrUG9zaXRpb24gPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBBQVRMYXlvdXRFbmdpbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5zdWJzdGl0dXRlID0gZnVuY3Rpb24gc3Vic3RpdHV0ZShnbHlwaFJ1bikge1xuICAgIC8vIEFBVCBleHBlY3RzIHRoZSBnbHlwaHMgdG8gYmUgaW4gdmlzdWFsIG9yZGVyIHByaW9yIHRvIG1vcnggcHJvY2Vzc2luZyxcbiAgICAvLyBzbyByZXZlcnNlIHRoZSBnbHlwaHMgaWYgdGhlIHNjcmlwdCBpcyByaWdodC10by1sZWZ0LlxuICAgIGlmIChnbHlwaFJ1bi5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgICBnbHlwaFJ1bi5nbHlwaHMucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIHRoaXMubW9yeFByb2Nlc3Nvci5wcm9jZXNzKGdseXBoUnVuLmdseXBocywgbWFwT1RUb0FBVChnbHlwaFJ1bi5mZWF0dXJlcykpO1xuICB9O1xuXG4gIF9wcm90by5nZXRBdmFpbGFibGVGZWF0dXJlcyA9IGZ1bmN0aW9uIGdldEF2YWlsYWJsZUZlYXR1cmVzKHNjcmlwdCwgbGFuZ3VhZ2UpIHtcbiAgICByZXR1cm4gbWFwQUFUVG9PVCh0aGlzLm1vcnhQcm9jZXNzb3IuZ2V0U3VwcG9ydGVkRmVhdHVyZXMoKSk7XG4gIH07XG5cbiAgX3Byb3RvLnN0cmluZ3NGb3JHbHlwaCA9IGZ1bmN0aW9uIHN0cmluZ3NGb3JHbHlwaChnaWQpIHtcbiAgICB2YXIgZ2x5cGhTdHJpbmdzID0gdGhpcy5tb3J4UHJvY2Vzc29yLmdlbmVyYXRlSW5wdXRzKGdpZCk7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBTZXQoKTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkYihnbHlwaFN0cmluZ3MpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgdmFyIGdseXBocyA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICB0aGlzLl9hZGRTdHJpbmdzKGdseXBocywgMCwgcmVzdWx0LCAnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBfcHJvdG8uX2FkZFN0cmluZ3MgPSBmdW5jdGlvbiBfYWRkU3RyaW5ncyhnbHlwaHMsIGluZGV4LCBzdHJpbmdzLCBzdHJpbmcpIHtcbiAgICB2YXIgY29kZVBvaW50cyA9IHRoaXMuZm9udC5fY21hcFByb2Nlc3Nvci5jb2RlUG9pbnRzRm9yR2x5cGgoZ2x5cGhzW2luZGV4XSk7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRiKGNvZGVQb2ludHMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgdmFyIGNvZGVQb2ludCA9IF9zdGVwMi52YWx1ZTtcbiAgICAgIHZhciBzID0gc3RyaW5nICsgU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZVBvaW50KTtcblxuICAgICAgaWYgKGluZGV4IDwgZ2x5cGhzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy5fYWRkU3RyaW5ncyhnbHlwaHMsIGluZGV4ICsgMSwgc3RyaW5ncywgcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHJpbmdzLmFkZChzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEFBVExheW91dEVuZ2luZTtcbn0oKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRjKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRjKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRjKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkYyhvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGMobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRjKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuLyoqXG4gKiBTaGFwaW5nUGxhbnMgYXJlIHVzZWQgYnkgdGhlIE9wZW5UeXBlIHNoYXBlcnMgdG8gc3RvcmUgd2hpY2hcbiAqIGZlYXR1cmVzIHNob3VsZCBieSBhcHBsaWVkLCBhbmQgaW4gd2hhdCBvcmRlciB0byBhcHBseSB0aGVtLlxuICogVGhlIGZlYXR1cmVzIGFyZSBhcHBsaWVkIGluIGdyb3VwcyBjYWxsZWQgc3RhZ2VzLiBBIGZlYXR1cmVcbiAqIGNhbiBiZSBhcHBsaWVkIGdsb2JhbGx5IHRvIGFsbCBnbHlwaHMsIG9yIGxvY2FsbHkgdG8gb25seVxuICogc3BlY2lmaWMgZ2x5cGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIFNoYXBpbmdQbGFuID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2hhcGluZ1BsYW4oZm9udCwgc2NyaXB0LCBkaXJlY3Rpb24pIHtcbiAgICB0aGlzLmZvbnQgPSBmb250O1xuICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0O1xuICAgIHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgIHRoaXMuc3RhZ2VzID0gW107XG4gICAgdGhpcy5nbG9iYWxGZWF0dXJlcyA9IHt9O1xuICAgIHRoaXMuYWxsRmVhdHVyZXMgPSB7fTtcbiAgfVxuICAvKipcbiAgICogQWRkcyB0aGUgZ2l2ZW4gZmVhdHVyZXMgdG8gdGhlIGxhc3Qgc3RhZ2UuXG4gICAqIElnbm9yZXMgZmVhdHVyZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBTaGFwaW5nUGxhbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9hZGRGZWF0dXJlcyA9IGZ1bmN0aW9uIF9hZGRGZWF0dXJlcyhmZWF0dXJlcywgZ2xvYmFsKSB7XG4gICAgdmFyIHN0YWdlSW5kZXggPSB0aGlzLnN0YWdlcy5sZW5ndGggLSAxO1xuICAgIHZhciBzdGFnZSA9IHRoaXMuc3RhZ2VzW3N0YWdlSW5kZXhdO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRjKGZlYXR1cmVzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBmZWF0dXJlID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgIGlmICh0aGlzLmFsbEZlYXR1cmVzW2ZlYXR1cmVdID09IG51bGwpIHtcbiAgICAgICAgc3RhZ2UucHVzaChmZWF0dXJlKTtcbiAgICAgICAgdGhpcy5hbGxGZWF0dXJlc1tmZWF0dXJlXSA9IHN0YWdlSW5kZXg7XG5cbiAgICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICAgIHRoaXMuZ2xvYmFsRmVhdHVyZXNbZmVhdHVyZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBBZGQgZmVhdHVyZXMgdG8gdGhlIGxhc3Qgc3RhZ2VcbiAgICovXG4gIDtcblxuICBfcHJvdG8uYWRkID0gZnVuY3Rpb24gYWRkKGFyZywgZ2xvYmFsKSB7XG4gICAgaWYgKGdsb2JhbCA9PT0gdm9pZCAwKSB7XG4gICAgICBnbG9iYWwgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuc3RhZ2VzLnB1c2goW10pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgICAgYXJnID0gW2FyZ107XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgdGhpcy5fYWRkRmVhdHVyZXMoYXJnLCBnbG9iYWwpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuX2FkZEZlYXR1cmVzKGFyZy5nbG9iYWwgfHwgW10sIHRydWUpO1xuXG4gICAgICB0aGlzLl9hZGRGZWF0dXJlcyhhcmcubG9jYWwgfHwgW10sIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYXJndW1lbnQgdG8gU2hhcGluZ1BsYW4jYWRkXCIpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQWRkIGEgbmV3IHN0YWdlXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmFkZFN0YWdlID0gZnVuY3Rpb24gYWRkU3RhZ2UoYXJnLCBnbG9iYWwpIHtcbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5zdGFnZXMucHVzaChhcmcsIFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFnZXMucHVzaChbXSk7XG4gICAgICB0aGlzLmFkZChhcmcsIGdsb2JhbCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5zZXRGZWF0dXJlT3ZlcnJpZGVzID0gZnVuY3Rpb24gc2V0RmVhdHVyZU92ZXJyaWRlcyhmZWF0dXJlcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZlYXR1cmVzKSkge1xuICAgICAgdGhpcy5hZGQoZmVhdHVyZXMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZlYXR1cmVzID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yICh2YXIgdGFnIGluIGZlYXR1cmVzKSB7XG4gICAgICAgIGlmIChmZWF0dXJlc1t0YWddKSB7XG4gICAgICAgICAgdGhpcy5hZGQodGFnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFsbEZlYXR1cmVzW3RhZ10gIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBzdGFnZSA9IHRoaXMuc3RhZ2VzW3RoaXMuYWxsRmVhdHVyZXNbdGFnXV07XG4gICAgICAgICAgc3RhZ2Uuc3BsaWNlKHN0YWdlLmluZGV4T2YodGFnKSwgMSk7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuYWxsRmVhdHVyZXNbdGFnXTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5nbG9iYWxGZWF0dXJlc1t0YWddO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBBc3NpZ25zIHRoZSBnbG9iYWwgZmVhdHVyZXMgdG8gdGhlIGdpdmVuIGdseXBoc1xuICAgKi9cbiAgO1xuXG4gIF9wcm90by5hc3NpZ25HbG9iYWxGZWF0dXJlcyA9IGZ1bmN0aW9uIGFzc2lnbkdsb2JhbEZlYXR1cmVzKGdseXBocykge1xuICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGMoZ2x5cGhzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgIHZhciBnbHlwaCA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgZm9yICh2YXIgZmVhdHVyZSBpbiB0aGlzLmdsb2JhbEZlYXR1cmVzKSB7XG4gICAgICAgIGdseXBoLmZlYXR1cmVzW2ZlYXR1cmVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSBwbGFubmVkIHN0YWdlcyB1c2luZyB0aGUgZ2l2ZW4gT1RQcm9jZXNzb3JcbiAgICovXG4gIDtcblxuICBfcHJvdG8ucHJvY2VzcyA9IGZ1bmN0aW9uIHByb2Nlc3MocHJvY2Vzc29yLCBnbHlwaHMsIHBvc2l0aW9ucykge1xuICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGModGhpcy5zdGFnZXMpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgdmFyIHN0YWdlID0gX3N0ZXAzLnZhbHVlO1xuXG4gICAgICBpZiAodHlwZW9mIHN0YWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmICghcG9zaXRpb25zKSB7XG4gICAgICAgICAgc3RhZ2UodGhpcy5mb250LCBnbHlwaHMsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcHJvY2Vzc29yLmFwcGx5RmVhdHVyZXMoc3RhZ2UsIGdseXBocywgcG9zaXRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFNoYXBpbmdQbGFuO1xufSgpO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxudmFyIFZBUklBVElPTl9GRUFUVVJFUyA9IFsncnZybiddO1xudmFyIENPTU1PTl9GRUFUVVJFUyA9IFsnY2NtcCcsICdsb2NsJywgJ3JsaWcnLCAnbWFyaycsICdta21rJ107XG52YXIgRlJBQ1RJT05BTF9GRUFUVVJFUyA9IFsnZnJhYycsICdudW1yJywgJ2Rub20nXTtcbnZhciBIT1JJWk9OVEFMX0ZFQVRVUkVTID0gWydjYWx0JywgJ2NsaWcnLCAnbGlnYScsICdyY2x0JywgJ2N1cnMnLCAna2VybiddO1xudmFyIERJUkVDVElPTkFMX0ZFQVRVUkVTID0ge1xuICBsdHI6IFsnbHRyYScsICdsdHJtJ10sXG4gIHJ0bDogWydydGxhJywgJ3J0bG0nXVxufTtcblxudmFyIERlZmF1bHRTaGFwZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBEZWZhdWx0U2hhcGVyKCkge31cblxuICBEZWZhdWx0U2hhcGVyLnBsYW4gPSBmdW5jdGlvbiBwbGFuKF9wbGFuLCBnbHlwaHMsIGZlYXR1cmVzKSB7XG4gICAgLy8gUGxhbiB0aGUgZmVhdHVyZXMgd2Ugd2FudCB0byBhcHBseVxuICAgIHRoaXMucGxhblByZXByb2Nlc3NpbmcoX3BsYW4pO1xuICAgIHRoaXMucGxhbkZlYXR1cmVzKF9wbGFuKTtcbiAgICB0aGlzLnBsYW5Qb3N0cHJvY2Vzc2luZyhfcGxhbiwgZmVhdHVyZXMpOyAvLyBBc3NpZ24gdGhlIGdsb2JhbCBmZWF0dXJlcyB0byBhbGwgdGhlIGdseXBoc1xuXG4gICAgX3BsYW4uYXNzaWduR2xvYmFsRmVhdHVyZXMoZ2x5cGhzKTsgLy8gQXNzaWduIGxvY2FsIGZlYXR1cmVzIHRvIGdseXBoc1xuXG5cbiAgICB0aGlzLmFzc2lnbkZlYXR1cmVzKF9wbGFuLCBnbHlwaHMpO1xuICB9O1xuXG4gIERlZmF1bHRTaGFwZXIucGxhblByZXByb2Nlc3NpbmcgPSBmdW5jdGlvbiBwbGFuUHJlcHJvY2Vzc2luZyhwbGFuKSB7XG4gICAgcGxhbi5hZGQoe1xuICAgICAgZ2xvYmFsOiBbXS5jb25jYXQoVkFSSUFUSU9OX0ZFQVRVUkVTLCBESVJFQ1RJT05BTF9GRUFUVVJFU1twbGFuLmRpcmVjdGlvbl0pLFxuICAgICAgbG9jYWw6IEZSQUNUSU9OQUxfRkVBVFVSRVNcbiAgICB9KTtcbiAgfTtcblxuICBEZWZhdWx0U2hhcGVyLnBsYW5GZWF0dXJlcyA9IGZ1bmN0aW9uIHBsYW5GZWF0dXJlcyhwbGFuKSB7Ly8gRG8gbm90aGluZyBieSBkZWZhdWx0LiBMZXQgc3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzLlxuICB9O1xuXG4gIERlZmF1bHRTaGFwZXIucGxhblBvc3Rwcm9jZXNzaW5nID0gZnVuY3Rpb24gcGxhblBvc3Rwcm9jZXNzaW5nKHBsYW4sIHVzZXJGZWF0dXJlcykge1xuICAgIHBsYW4uYWRkKFtdLmNvbmNhdChDT01NT05fRkVBVFVSRVMsIEhPUklaT05UQUxfRkVBVFVSRVMpKTtcbiAgICBwbGFuLnNldEZlYXR1cmVPdmVycmlkZXModXNlckZlYXR1cmVzKTtcbiAgfTtcblxuICBEZWZhdWx0U2hhcGVyLmFzc2lnbkZlYXR1cmVzID0gZnVuY3Rpb24gYXNzaWduRmVhdHVyZXMocGxhbiwgZ2x5cGhzKSB7XG4gICAgLy8gRW5hYmxlIGNvbnRleHR1YWwgZnJhY3Rpb25zXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpXTtcblxuICAgICAgaWYgKGdseXBoLmNvZGVQb2ludHNbMF0gPT09IDB4MjA0NCkge1xuICAgICAgICAvLyBmcmFjdGlvbiBzbGFzaFxuICAgICAgICB2YXIgc3RhcnQgPSBpO1xuICAgICAgICB2YXIgZW5kID0gaSArIDE7IC8vIEFwcGx5IG51bWVyYXRvclxuXG4gICAgICAgIHdoaWxlIChzdGFydCA+IDAgJiYgdW5pY29kZS5pc0RpZ2l0KGdseXBoc1tzdGFydCAtIDFdLmNvZGVQb2ludHNbMF0pKSB7XG4gICAgICAgICAgZ2x5cGhzW3N0YXJ0IC0gMV0uZmVhdHVyZXMubnVtciA9IHRydWU7XG4gICAgICAgICAgZ2x5cGhzW3N0YXJ0IC0gMV0uZmVhdHVyZXMuZnJhYyA9IHRydWU7XG4gICAgICAgICAgc3RhcnQtLTtcbiAgICAgICAgfSAvLyBBcHBseSBkZW5vbWluYXRvclxuXG5cbiAgICAgICAgd2hpbGUgKGVuZCA8IGdseXBocy5sZW5ndGggJiYgdW5pY29kZS5pc0RpZ2l0KGdseXBoc1tlbmRdLmNvZGVQb2ludHNbMF0pKSB7XG4gICAgICAgICAgZ2x5cGhzW2VuZF0uZmVhdHVyZXMuZG5vbSA9IHRydWU7XG4gICAgICAgICAgZ2x5cGhzW2VuZF0uZmVhdHVyZXMuZnJhYyA9IHRydWU7XG4gICAgICAgICAgZW5kKys7XG4gICAgICAgIH0gLy8gQXBwbHkgZnJhY3Rpb24gc2xhc2hcblxuXG4gICAgICAgIGdseXBoLmZlYXR1cmVzLmZyYWMgPSB0cnVlO1xuICAgICAgICBpID0gZW5kIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIERlZmF1bHRTaGFwZXI7XG59KCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShEZWZhdWx0U2hhcGVyLCBcInplcm9NYXJrV2lkdGhzXCIsICdBRlRFUl9HUE9TJyk7XG5cbnZhciBiYXNlNjREZWZsYXRlZFRyaWUkMSA9IFwiZUp3QkRnTHgvUUFCOEFBQUFBQUFBQUE0QUFIOUFRTCs3Wm90VE1Rd0ZNZTc3YjQ0UUlIQTRKQklCQUo1bHhBU0RBbUdoSE1vQklxZ1VPQlFKQWhPSXBGSURJb2dTVWdJRW9sRUVnekovUy9Ya3BlbTNYWFhib1BiZThrdjdhM3I2M3Z0Njl1NlhEY1dZaHZzZ24zUWxiLy9TM2tNVHNFWnVBQ1hvQTl1d0MyNEEvZmdBVHlSZnMvZ1RmNGU4ZzQrWlAxVGxsK2tuWmxPZnNDMXBKNElNUThXa3ZMdEtvb2wrTG9zL1YycGtOOE13ekFNd3pBTXd6QU13MVNQNGZlZlZmNyt3VEFNd3pBTXd6QzVjalV6WWpFblhzRmNXNGdPT0FlUDRMczlhbHVmRldKVENORnJDZEZ2amVwRjhOTEtiejdYY0liWk1KeGpPcmkybGVGOHM0Tjc5enpQUXozMFA3RG9PTVQxbzRxY3Q5VC9DMDZtMU45T0hQM0N3bEpsaVN6UWRsTTlsTlNrM2tTalppaDFUSDJ5UXZ2OUphRTJVUi8xdVhMeEx3U1R6RzBSSkZyZHhROVRYS2wyUVVxYmhOZ0hkRHdYb1Q3VGF6N1NCSFdEL29Za2JmMWRZeUloT3ZWK0RVLzdsV1NOejFCeFBXNXVUTzNqeG5XVnN2ZWRiK3paK28vTDlWbGlqOTVyZXJiWjdJb01lbFRlMVhORmFKa2tocWx0cGhqVDlacm1UNWV5MzR6VkdpalJiUXhsWDluN3hQVHUxWlFVdVk5OTkzT2FmM25xRHFuTE5VZjRTS2cxaXllMDA1WkxJcTFVOVVpTzVmSk9HS2ZvTjQybnhuSzFOVVRPcGZiWWZORnpxWjVUZmUyd3pXT0l1TE90UWRFb3Y0cVd0TGh6SmVzNmhJNVJYd21adjB6UENwczBBNDVya3dHYU1RWHZcIjtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkMyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cbnZhciB0cmllRGF0YSQxID0gcGFrby5pbmZsYXRlKGJhc2U2NEFycmF5YnVmZmVyXzIoYmFzZTY0RGVmbGF0ZWRUcmllJDEpKTtcbnZhciB0cmllJDEgPSBuZXcgdW5pY29kZVRyaWUodHJpZURhdGEkMSk7XG52YXIgRkVBVFVSRVMgPSBbJ2lzb2wnLCAnZmluYScsICdmaW4yJywgJ2ZpbjMnLCAnbWVkaScsICdtZWQyJywgJ2luaXQnXTtcbnZhciBTaGFwaW5nQ2xhc3NlcyA9IHtcbiAgTm9uX0pvaW5pbmc6IDAsXG4gIExlZnRfSm9pbmluZzogMSxcbiAgUmlnaHRfSm9pbmluZzogMixcbiAgRHVhbF9Kb2luaW5nOiAzLFxuICBKb2luX0NhdXNpbmc6IDMsXG4gIEFMQVBIOiA0LFxuICAnREFMQVRIIFJJU0gnOiA1LFxuICBUcmFuc3BhcmVudDogNlxufTtcbnZhciBJU09MID0gJ2lzb2wnO1xudmFyIEZJTkEgPSAnZmluYSc7XG52YXIgRklOMiA9ICdmaW4yJztcbnZhciBGSU4zID0gJ2ZpbjMnO1xudmFyIE1FREkgPSAnbWVkaSc7XG52YXIgTUVEMiA9ICdtZWQyJztcbnZhciBJTklUID0gJ2luaXQnO1xudmFyIE5PTkUgPSBudWxsOyAvLyBFYWNoIGVudHJ5IGlzIFtwcmV2QWN0aW9uLCBjdXJBY3Rpb24sIG5leHRTdGF0ZV1cblxudmFyIFNUQVRFX1RBQkxFID0gWy8vICAgTm9uX0pvaW5pbmcsICAgICAgICBMZWZ0X0pvaW5pbmcsICAgICAgIFJpZ2h0X0pvaW5pbmcsICAgICBEdWFsX0pvaW5pbmcsICAgICAgICAgICBBTEFQSCwgICAgICAgICAgICBEQUxBVEggUklTSFxuLy8gU3RhdGUgMDogcHJldiB3YXMgVSwgIG5vdCB3aWxsaW5nIHRvIGpvaW4uXG5bW05PTkUsIE5PTkUsIDBdLCBbTk9ORSwgSVNPTCwgMl0sIFtOT05FLCBJU09MLCAxXSwgW05PTkUsIElTT0wsIDJdLCBbTk9ORSwgSVNPTCwgMV0sIFtOT05FLCBJU09MLCA2XV0sIC8vIFN0YXRlIDE6IHByZXYgd2FzIFIgb3IgSVNPTC9BTEFQSCwgIG5vdCB3aWxsaW5nIHRvIGpvaW4uXG5bW05PTkUsIE5PTkUsIDBdLCBbTk9ORSwgSVNPTCwgMl0sIFtOT05FLCBJU09MLCAxXSwgW05PTkUsIElTT0wsIDJdLCBbTk9ORSwgRklOMiwgNV0sIFtOT05FLCBJU09MLCA2XV0sIC8vIFN0YXRlIDI6IHByZXYgd2FzIEQvTCBpbiBJU09MIGZvcm0sICB3aWxsaW5nIHRvIGpvaW4uXG5bW05PTkUsIE5PTkUsIDBdLCBbTk9ORSwgSVNPTCwgMl0sIFtJTklULCBGSU5BLCAxXSwgW0lOSVQsIEZJTkEsIDNdLCBbSU5JVCwgRklOQSwgNF0sIFtJTklULCBGSU5BLCA2XV0sIC8vIFN0YXRlIDM6IHByZXYgd2FzIEQgaW4gRklOQSBmb3JtLCAgd2lsbGluZyB0byBqb2luLlxuW1tOT05FLCBOT05FLCAwXSwgW05PTkUsIElTT0wsIDJdLCBbTUVESSwgRklOQSwgMV0sIFtNRURJLCBGSU5BLCAzXSwgW01FREksIEZJTkEsIDRdLCBbTUVESSwgRklOQSwgNl1dLCAvLyBTdGF0ZSA0OiBwcmV2IHdhcyBGSU5BIEFMQVBILCAgbm90IHdpbGxpbmcgdG8gam9pbi5cbltbTk9ORSwgTk9ORSwgMF0sIFtOT05FLCBJU09MLCAyXSwgW01FRDIsIElTT0wsIDFdLCBbTUVEMiwgSVNPTCwgMl0sIFtNRUQyLCBGSU4yLCA1XSwgW01FRDIsIElTT0wsIDZdXSwgLy8gU3RhdGUgNTogcHJldiB3YXMgRklOMi9GSU4zIEFMQVBILCAgbm90IHdpbGxpbmcgdG8gam9pbi5cbltbTk9ORSwgTk9ORSwgMF0sIFtOT05FLCBJU09MLCAyXSwgW0lTT0wsIElTT0wsIDFdLCBbSVNPTCwgSVNPTCwgMl0sIFtJU09MLCBGSU4yLCA1XSwgW0lTT0wsIElTT0wsIDZdXSwgLy8gU3RhdGUgNjogcHJldiB3YXMgREFMQVRIL1JJU0gsICBub3Qgd2lsbGluZyB0byBqb2luLlxuW1tOT05FLCBOT05FLCAwXSwgW05PTkUsIElTT0wsIDJdLCBbTk9ORSwgSVNPTCwgMV0sIFtOT05FLCBJU09MLCAyXSwgW05PTkUsIEZJTjMsIDVdLCBbTk9ORSwgSVNPTCwgNl1dXTtcbi8qKlxuICogVGhpcyBpcyBhIHNoYXBlciBmb3IgQXJhYmljLCBhbmQgb3RoZXIgY3Vyc2l2ZSBzY3JpcHRzLlxuICogSXQgdXNlcyBkYXRhIGZyb20gQXJhYmljU2hhcGluZy50eHQgaW4gdGhlIFVuaWNvZGUgZGF0YWJhc2UsXG4gKiBjb21waWxlZCB0byBhIFVuaWNvZGVUcmllIGJ5IGdlbmVyYXRlLWRhdGEuY29mZmVlLlxuICpcbiAqIFRoZSBzaGFwaW5nIHN0YXRlIG1hY2hpbmUgd2FzIHBvcnRlZCBmcm9tIEhhcmZidXp6LlxuICogaHR0cHM6Ly9naXRodWIuY29tL2JlaGRhZC9oYXJmYnV6ei9ibG9iL21hc3Rlci9zcmMvaGItb3Qtc2hhcGUtY29tcGxleC1hcmFiaWMuY2NcbiAqL1xuXG52YXIgQXJhYmljU2hhcGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRGVmYXVsdFNoYXBlcikge1xuICBfaW5oZXJpdHNMb29zZSQzKEFyYWJpY1NoYXBlciwgX0RlZmF1bHRTaGFwZXIpO1xuXG4gIGZ1bmN0aW9uIEFyYWJpY1NoYXBlcigpIHtcbiAgICByZXR1cm4gX0RlZmF1bHRTaGFwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgQXJhYmljU2hhcGVyLnBsYW5GZWF0dXJlcyA9IGZ1bmN0aW9uIHBsYW5GZWF0dXJlcyhwbGFuKSB7XG4gICAgcGxhbi5hZGQoWydjY21wJywgJ2xvY2wnXSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IEZFQVRVUkVTLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZmVhdHVyZSA9IEZFQVRVUkVTW2ldO1xuICAgICAgcGxhbi5hZGRTdGFnZShmZWF0dXJlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcGxhbi5hZGRTdGFnZSgnbXNldCcpO1xuICB9O1xuXG4gIEFyYWJpY1NoYXBlci5hc3NpZ25GZWF0dXJlcyA9IGZ1bmN0aW9uIGFzc2lnbkZlYXR1cmVzKHBsYW4sIGdseXBocykge1xuICAgIF9EZWZhdWx0U2hhcGVyLmFzc2lnbkZlYXR1cmVzLmNhbGwodGhpcywgcGxhbiwgZ2x5cGhzKTtcblxuICAgIHZhciBwcmV2ID0gLTE7XG4gICAgdmFyIHN0YXRlID0gMDtcbiAgICB2YXIgYWN0aW9ucyA9IFtdOyAvLyBBcHBseSB0aGUgc3RhdGUgbWFjaGluZSB0byBtYXAgZ2x5cGhzIHRvIGZlYXR1cmVzXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdseXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGN1ckFjdGlvbiA9IHZvaWQgMCxcbiAgICAgICAgICBwcmV2QWN0aW9uID0gdm9pZCAwO1xuICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2ldO1xuICAgICAgdmFyIHR5cGUgPSBnZXRTaGFwaW5nQ2xhc3MoZ2x5cGguY29kZVBvaW50c1swXSk7XG5cbiAgICAgIGlmICh0eXBlID09PSBTaGFwaW5nQ2xhc3Nlcy5UcmFuc3BhcmVudCkge1xuICAgICAgICBhY3Rpb25zW2ldID0gTk9ORTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBfU1RBVEVfVEFCTEUkc3RhdGUkdHkgPSBTVEFURV9UQUJMRVtzdGF0ZV1bdHlwZV07XG4gICAgICBwcmV2QWN0aW9uID0gX1NUQVRFX1RBQkxFJHN0YXRlJHR5WzBdO1xuICAgICAgY3VyQWN0aW9uID0gX1NUQVRFX1RBQkxFJHN0YXRlJHR5WzFdO1xuICAgICAgc3RhdGUgPSBfU1RBVEVfVEFCTEUkc3RhdGUkdHlbMl07XG5cbiAgICAgIGlmIChwcmV2QWN0aW9uICE9PSBOT05FICYmIHByZXYgIT09IC0xKSB7XG4gICAgICAgIGFjdGlvbnNbcHJldl0gPSBwcmV2QWN0aW9uO1xuICAgICAgfVxuXG4gICAgICBhY3Rpb25zW2ldID0gY3VyQWN0aW9uO1xuICAgICAgcHJldiA9IGk7XG4gICAgfSAvLyBBcHBseSB0aGUgY2hvc2VuIGZlYXR1cmVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgZ2x5cGhzXG5cblxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBnbHlwaHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgZmVhdHVyZSA9IHZvaWQgMDtcbiAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpbmRleF07XG5cbiAgICAgIGlmIChmZWF0dXJlID0gYWN0aW9uc1tpbmRleF0pIHtcbiAgICAgICAgZ2x5cGguZmVhdHVyZXNbZmVhdHVyZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gQXJhYmljU2hhcGVyO1xufShEZWZhdWx0U2hhcGVyKTtcblxuZnVuY3Rpb24gZ2V0U2hhcGluZ0NsYXNzKGNvZGVQb2ludCkge1xuICB2YXIgcmVzID0gdHJpZSQxLmdldChjb2RlUG9pbnQpO1xuXG4gIGlmIChyZXMpIHtcbiAgICByZXR1cm4gcmVzIC0gMTtcbiAgfVxuXG4gIHZhciBjYXRlZ29yeSA9IHVuaWNvZGUuZ2V0Q2F0ZWdvcnkoY29kZVBvaW50KTtcblxuICBpZiAoY2F0ZWdvcnkgPT09ICdNbicgfHwgY2F0ZWdvcnkgPT09ICdNZScgfHwgY2F0ZWdvcnkgPT09ICdDZicpIHtcbiAgICByZXR1cm4gU2hhcGluZ0NsYXNzZXMuVHJhbnNwYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gU2hhcGluZ0NsYXNzZXMuTm9uX0pvaW5pbmc7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MkMyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG52YXIgR2x5cGhJdGVyYXRvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEdseXBoSXRlcmF0b3IoZ2x5cGhzLCBvcHRpb25zKSB7XG4gICAgdGhpcy5nbHlwaHMgPSBnbHlwaHM7XG4gICAgdGhpcy5yZXNldChvcHRpb25zKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBHbHlwaEl0ZXJhdG9yLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVzZXQgPSBmdW5jdGlvbiByZXNldChvcHRpb25zLCBpbmRleCkge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHZvaWQgMCkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5mbGFncyA9IG9wdGlvbnMuZmxhZ3MgfHwge307XG4gICAgdGhpcy5tYXJrQXR0YWNobWVudFR5cGUgPSBvcHRpb25zLm1hcmtBdHRhY2htZW50VHlwZSB8fCAwO1xuICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgfTtcblxuICBfcHJvdG8uc2hvdWxkSWdub3JlID0gZnVuY3Rpb24gc2hvdWxkSWdub3JlKGdseXBoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmxhZ3MuaWdub3JlTWFya3MgJiYgZ2x5cGguaXNNYXJrIHx8IHRoaXMuZmxhZ3MuaWdub3JlQmFzZUdseXBocyAmJiBnbHlwaC5pc0Jhc2UgfHwgdGhpcy5mbGFncy5pZ25vcmVMaWdhdHVyZXMgJiYgZ2x5cGguaXNMaWdhdHVyZSB8fCB0aGlzLm1hcmtBdHRhY2htZW50VHlwZSAmJiBnbHlwaC5pc01hcmsgJiYgZ2x5cGgubWFya0F0dGFjaG1lbnRUeXBlICE9PSB0aGlzLm1hcmtBdHRhY2htZW50VHlwZTtcbiAgfTtcblxuICBfcHJvdG8ubW92ZSA9IGZ1bmN0aW9uIG1vdmUoZGlyKSB7XG4gICAgdGhpcy5pbmRleCArPSBkaXI7XG5cbiAgICB3aGlsZSAoMCA8PSB0aGlzLmluZGV4ICYmIHRoaXMuaW5kZXggPCB0aGlzLmdseXBocy5sZW5ndGggJiYgdGhpcy5zaG91bGRJZ25vcmUodGhpcy5nbHlwaHNbdGhpcy5pbmRleF0pKSB7XG4gICAgICB0aGlzLmluZGV4ICs9IGRpcjtcbiAgICB9XG5cbiAgICBpZiAoMCA+IHRoaXMuaW5kZXggfHwgdGhpcy5pbmRleCA+PSB0aGlzLmdseXBocy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdseXBoc1t0aGlzLmluZGV4XTtcbiAgfTtcblxuICBfcHJvdG8ubmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgcmV0dXJuIHRoaXMubW92ZSgrMSk7XG4gIH07XG5cbiAgX3Byb3RvLnByZXYgPSBmdW5jdGlvbiBwcmV2KCkge1xuICAgIHJldHVybiB0aGlzLm1vdmUoLTEpO1xuICB9O1xuXG4gIF9wcm90by5wZWVrID0gZnVuY3Rpb24gcGVlayhjb3VudCkge1xuICAgIGlmIChjb3VudCA9PT0gdm9pZCAwKSB7XG4gICAgICBjb3VudCA9IDE7XG4gICAgfVxuXG4gICAgdmFyIGlkeCA9IHRoaXMuaW5kZXg7XG4gICAgdmFyIHJlcyA9IHRoaXMuaW5jcmVtZW50KGNvdW50KTtcbiAgICB0aGlzLmluZGV4ID0gaWR4O1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgX3Byb3RvLnBlZWtJbmRleCA9IGZ1bmN0aW9uIHBlZWtJbmRleChjb3VudCkge1xuICAgIGlmIChjb3VudCA9PT0gdm9pZCAwKSB7XG4gICAgICBjb3VudCA9IDE7XG4gICAgfVxuXG4gICAgdmFyIGlkeCA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5pbmNyZW1lbnQoY291bnQpO1xuICAgIHZhciByZXMgPSB0aGlzLmluZGV4O1xuICAgIHRoaXMuaW5kZXggPSBpZHg7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBfcHJvdG8uaW5jcmVtZW50ID0gZnVuY3Rpb24gaW5jcmVtZW50KGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09PSB2b2lkIDApIHtcbiAgICAgIGNvdW50ID0gMTtcbiAgICB9XG5cbiAgICB2YXIgZGlyID0gY291bnQgPCAwID8gLTEgOiAxO1xuICAgIGNvdW50ID0gTWF0aC5hYnMoY291bnQpO1xuXG4gICAgd2hpbGUgKGNvdW50LS0pIHtcbiAgICAgIHRoaXMubW92ZShkaXIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdseXBoc1t0aGlzLmluZGV4XTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MkMyhHbHlwaEl0ZXJhdG9yLCBbe1xuICAgIGtleTogXCJjdXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdseXBoc1t0aGlzLmluZGV4XSB8fCBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBHbHlwaEl0ZXJhdG9yO1xufSgpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGQobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGQobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRkKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkZChvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGQoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG52YXIgREVGQVVMVF9TQ1JJUFRTID0gWydERkxUJywgJ2RmbHQnLCAnbGF0biddO1xuXG52YXIgT1RQcm9jZXNzb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBPVFByb2Nlc3Nvcihmb250LCB0YWJsZSkge1xuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMuc2NyaXB0ID0gbnVsbDtcbiAgICB0aGlzLnNjcmlwdFRhZyA9IG51bGw7XG4gICAgdGhpcy5sYW5ndWFnZSA9IG51bGw7XG4gICAgdGhpcy5sYW5ndWFnZVRhZyA9IG51bGw7XG4gICAgdGhpcy5mZWF0dXJlcyA9IHt9O1xuICAgIHRoaXMubG9va3VwcyA9IHt9OyAvLyBTZXR1cCB2YXJpYXRpb24gc3Vic3RpdHV0aW9uc1xuXG4gICAgdGhpcy52YXJpYXRpb25zSW5kZXggPSBmb250Ll92YXJpYXRpb25Qcm9jZXNzb3IgPyB0aGlzLmZpbmRWYXJpYXRpb25zSW5kZXgoZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yLm5vcm1hbGl6ZWRDb29yZHMpIDogLTE7IC8vIGluaXRpYWxpemUgdG8gZGVmYXVsdCBzY3JpcHQgKyBsYW5ndWFnZVxuXG4gICAgdGhpcy5zZWxlY3RTY3JpcHQoKTsgLy8gY3VycmVudCBjb250ZXh0IChzZXQgYnkgYXBwbHlGZWF0dXJlcylcblxuICAgIHRoaXMuZ2x5cGhzID0gW107XG4gICAgdGhpcy5wb3NpdGlvbnMgPSBbXTsgLy8gb25seSB1c2VkIGJ5IEdQT1NcblxuICAgIHRoaXMubGlnYXR1cmVJRCA9IDE7XG4gICAgdGhpcy5jdXJyZW50RmVhdHVyZSA9IG51bGw7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gT1RQcm9jZXNzb3IucHJvdG90eXBlO1xuXG4gIF9wcm90by5maW5kU2NyaXB0ID0gZnVuY3Rpb24gZmluZFNjcmlwdChzY3JpcHQpIHtcbiAgICBpZiAodGhpcy50YWJsZS5zY3JpcHRMaXN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShzY3JpcHQpKSB7XG4gICAgICBzY3JpcHQgPSBbc2NyaXB0XTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQoc2NyaXB0KSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBzID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQodGhpcy50YWJsZS5zY3JpcHRMaXN0KSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgIGlmIChlbnRyeS50YWcgPT09IHMpIHtcbiAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBfcHJvdG8uc2VsZWN0U2NyaXB0ID0gZnVuY3Rpb24gc2VsZWN0U2NyaXB0KHNjcmlwdCwgbGFuZ3VhZ2UsIGRpcmVjdGlvbiQxKSB7XG4gICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgZW50cnk7XG5cbiAgICBpZiAoIXRoaXMuc2NyaXB0IHx8IHNjcmlwdCAhPT0gdGhpcy5zY3JpcHRUYWcpIHtcbiAgICAgIGVudHJ5ID0gdGhpcy5maW5kU2NyaXB0KHNjcmlwdCk7XG5cbiAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgZW50cnkgPSB0aGlzLmZpbmRTY3JpcHQoREVGQVVMVF9TQ1JJUFRTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JpcHRUYWc7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2NyaXB0VGFnID0gZW50cnkudGFnO1xuICAgICAgdGhpcy5zY3JpcHQgPSBlbnRyeS5zY3JpcHQ7XG4gICAgICB0aGlzLmxhbmd1YWdlID0gbnVsbDtcbiAgICAgIHRoaXMubGFuZ3VhZ2VUYWcgPSBudWxsO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFkaXJlY3Rpb24kMSB8fCBkaXJlY3Rpb24kMSAhPT0gdGhpcy5kaXJlY3Rpb24pIHtcbiAgICAgIHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uJDEgfHwgZGlyZWN0aW9uKHNjcmlwdCk7XG4gICAgfVxuXG4gICAgaWYgKGxhbmd1YWdlICYmIGxhbmd1YWdlLmxlbmd0aCA8IDQpIHtcbiAgICAgIGxhbmd1YWdlICs9ICcgJy5yZXBlYXQoNCAtIGxhbmd1YWdlLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgaWYgKCFsYW5ndWFnZSB8fCBsYW5ndWFnZSAhPT0gdGhpcy5sYW5ndWFnZVRhZykge1xuICAgICAgdGhpcy5sYW5ndWFnZSA9IG51bGw7XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQodGhpcy5zY3JpcHQubGFuZ1N5c1JlY29yZHMpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgICB2YXIgbGFuZyA9IF9zdGVwMy52YWx1ZTtcblxuICAgICAgICBpZiAobGFuZy50YWcgPT09IGxhbmd1YWdlKSB7XG4gICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmcubGFuZ1N5cztcbiAgICAgICAgICB0aGlzLmxhbmd1YWdlVGFnID0gbGFuZy50YWc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmxhbmd1YWdlKSB7XG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSB0aGlzLnNjcmlwdC5kZWZhdWx0TGFuZ1N5cztcbiAgICAgICAgdGhpcy5sYW5ndWFnZVRhZyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH0gLy8gQnVpbGQgYSBmZWF0dXJlIGxvb2t1cCB0YWJsZVxuXG5cbiAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgdGhpcy5mZWF0dXJlcyA9IHt9O1xuXG4gICAgICBpZiAodGhpcy5sYW5ndWFnZSkge1xuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKHRoaXMubGFuZ3VhZ2UuZmVhdHVyZUluZGV4ZXMpLCBfc3RlcDQ7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNCgpKS5kb25lOykge1xuICAgICAgICAgIHZhciBmZWF0dXJlSW5kZXggPSBfc3RlcDQudmFsdWU7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IHRoaXMudGFibGUuZmVhdHVyZUxpc3RbZmVhdHVyZUluZGV4XTtcbiAgICAgICAgICB2YXIgc3Vic3RpdHV0ZUZlYXR1cmUgPSB0aGlzLnN1YnN0aXR1dGVGZWF0dXJlRm9yVmFyaWF0aW9ucyhmZWF0dXJlSW5kZXgpO1xuICAgICAgICAgIHRoaXMuZmVhdHVyZXNbcmVjb3JkLnRhZ10gPSBzdWJzdGl0dXRlRmVhdHVyZSB8fCByZWNvcmQuZmVhdHVyZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNjcmlwdFRhZztcbiAgfTtcblxuICBfcHJvdG8ubG9va3Vwc0ZvckZlYXR1cmVzID0gZnVuY3Rpb24gbG9va3Vwc0ZvckZlYXR1cmVzKHVzZXJGZWF0dXJlcywgZXhjbHVkZSkge1xuICAgIGlmICh1c2VyRmVhdHVyZXMgPT09IHZvaWQgMCkge1xuICAgICAgdXNlckZlYXR1cmVzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGxvb2t1cHMgPSBbXTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQodXNlckZlYXR1cmVzKSwgX3N0ZXA1OyAhKF9zdGVwNSA9IF9pdGVyYXRvcjUoKSkuZG9uZTspIHtcbiAgICAgIHZhciB0YWcgPSBfc3RlcDUudmFsdWU7XG4gICAgICB2YXIgZmVhdHVyZSA9IHRoaXMuZmVhdHVyZXNbdGFnXTtcblxuICAgICAgaWYgKCFmZWF0dXJlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3I2ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKGZlYXR1cmUubG9va3VwTGlzdEluZGV4ZXMpLCBfc3RlcDY7ICEoX3N0ZXA2ID0gX2l0ZXJhdG9yNigpKS5kb25lOykge1xuICAgICAgICB2YXIgbG9va3VwSW5kZXggPSBfc3RlcDYudmFsdWU7XG5cbiAgICAgICAgaWYgKGV4Y2x1ZGUgJiYgZXhjbHVkZS5pbmRleE9mKGxvb2t1cEluZGV4KSAhPT0gLTEpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvb2t1cHMucHVzaCh7XG4gICAgICAgICAgZmVhdHVyZTogdGFnLFxuICAgICAgICAgIGluZGV4OiBsb29rdXBJbmRleCxcbiAgICAgICAgICBsb29rdXA6IHRoaXMudGFibGUubG9va3VwTGlzdC5nZXQobG9va3VwSW5kZXgpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvb2t1cHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4O1xuICAgIH0pO1xuICAgIHJldHVybiBsb29rdXBzO1xuICB9O1xuXG4gIF9wcm90by5zdWJzdGl0dXRlRmVhdHVyZUZvclZhcmlhdGlvbnMgPSBmdW5jdGlvbiBzdWJzdGl0dXRlRmVhdHVyZUZvclZhcmlhdGlvbnMoZmVhdHVyZUluZGV4KSB7XG4gICAgaWYgKHRoaXMudmFyaWF0aW9uc0luZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRoaXMudGFibGUuZmVhdHVyZVZhcmlhdGlvbnMuZmVhdHVyZVZhcmlhdGlvblJlY29yZHNbdGhpcy52YXJpYXRpb25zSW5kZXhdO1xuICAgIHZhciBzdWJzdGl0dXRpb25zID0gcmVjb3JkLmZlYXR1cmVUYWJsZVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRpb25zO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yNyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChzdWJzdGl0dXRpb25zKSwgX3N0ZXA3OyAhKF9zdGVwNyA9IF9pdGVyYXRvcjcoKSkuZG9uZTspIHtcbiAgICAgIHZhciBzdWJzdGl0dXRpb24gPSBfc3RlcDcudmFsdWU7XG5cbiAgICAgIGlmIChzdWJzdGl0dXRpb24uZmVhdHVyZUluZGV4ID09PSBmZWF0dXJlSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbi5hbHRlcm5hdGVGZWF0dXJlVGFibGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX3Byb3RvLmZpbmRWYXJpYXRpb25zSW5kZXggPSBmdW5jdGlvbiBmaW5kVmFyaWF0aW9uc0luZGV4KGNvb3Jkcykge1xuICAgIHZhciB2YXJpYXRpb25zID0gdGhpcy50YWJsZS5mZWF0dXJlVmFyaWF0aW9ucztcblxuICAgIGlmICghdmFyaWF0aW9ucykge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHZhciByZWNvcmRzID0gdmFyaWF0aW9ucy5mZWF0dXJlVmFyaWF0aW9uUmVjb3JkcztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbmRpdGlvbnMgPSByZWNvcmRzW2ldLmNvbmRpdGlvblNldC5jb25kaXRpb25UYWJsZTtcblxuICAgICAgaWYgKHRoaXMudmFyaWF0aW9uQ29uZGl0aW9uc01hdGNoKGNvbmRpdGlvbnMsIGNvb3JkcykpIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9O1xuXG4gIF9wcm90by52YXJpYXRpb25Db25kaXRpb25zTWF0Y2ggPSBmdW5jdGlvbiB2YXJpYXRpb25Db25kaXRpb25zTWF0Y2goY29uZGl0aW9ucywgY29vcmRzKSB7XG4gICAgcmV0dXJuIGNvbmRpdGlvbnMuZXZlcnkoZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgdmFyIGNvb3JkID0gY29uZGl0aW9uLmF4aXNJbmRleCA8IGNvb3Jkcy5sZW5ndGggPyBjb29yZHNbY29uZGl0aW9uLmF4aXNJbmRleF0gOiAwO1xuICAgICAgcmV0dXJuIGNvbmRpdGlvbi5maWx0ZXJSYW5nZU1pblZhbHVlIDw9IGNvb3JkICYmIGNvb3JkIDw9IGNvbmRpdGlvbi5maWx0ZXJSYW5nZU1heFZhbHVlO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5hcHBseUZlYXR1cmVzID0gZnVuY3Rpb24gYXBwbHlGZWF0dXJlcyh1c2VyRmVhdHVyZXMsIGdseXBocywgYWR2YW5jZXMpIHtcbiAgICB2YXIgbG9va3VwcyA9IHRoaXMubG9va3Vwc0ZvckZlYXR1cmVzKHVzZXJGZWF0dXJlcyk7XG4gICAgdGhpcy5hcHBseUxvb2t1cHMobG9va3VwcywgZ2x5cGhzLCBhZHZhbmNlcyk7XG4gIH07XG5cbiAgX3Byb3RvLmFwcGx5TG9va3VwcyA9IGZ1bmN0aW9uIGFwcGx5TG9va3Vwcyhsb29rdXBzLCBnbHlwaHMsIHBvc2l0aW9ucykge1xuICAgIHRoaXMuZ2x5cGhzID0gZ2x5cGhzO1xuICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xuICAgIHRoaXMuZ2x5cGhJdGVyYXRvciA9IG5ldyBHbHlwaEl0ZXJhdG9yKGdseXBocyk7XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3I4ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKGxvb2t1cHMpLCBfc3RlcDg7ICEoX3N0ZXA4ID0gX2l0ZXJhdG9yOCgpKS5kb25lOykge1xuICAgICAgdmFyIF9zdGVwOCR2YWx1ZSA9IF9zdGVwOC52YWx1ZSxcbiAgICAgICAgICBmZWF0dXJlID0gX3N0ZXA4JHZhbHVlLmZlYXR1cmUsXG4gICAgICAgICAgbG9va3VwID0gX3N0ZXA4JHZhbHVlLmxvb2t1cDtcbiAgICAgIHRoaXMuY3VycmVudEZlYXR1cmUgPSBmZWF0dXJlO1xuICAgICAgdGhpcy5nbHlwaEl0ZXJhdG9yLnJlc2V0KGxvb2t1cC5mbGFncyk7XG5cbiAgICAgIHdoaWxlICh0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXggPCBnbHlwaHMubGVuZ3RoKSB7XG4gICAgICAgIGlmICghKGZlYXR1cmUgaW4gdGhpcy5nbHlwaEl0ZXJhdG9yLmN1ci5mZWF0dXJlcykpIHtcbiAgICAgICAgICB0aGlzLmdseXBoSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yOSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChsb29rdXAuc3ViVGFibGVzKSwgX3N0ZXA5OyAhKF9zdGVwOSA9IF9pdGVyYXRvcjkoKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgdGFibGUgPSBfc3RlcDkudmFsdWU7XG4gICAgICAgICAgdmFyIHJlcyA9IHRoaXMuYXBwbHlMb29rdXAobG9va3VwLmxvb2t1cFR5cGUsIHRhYmxlKTtcblxuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5uZXh0KCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5hcHBseUxvb2t1cCA9IGZ1bmN0aW9uIGFwcGx5TG9va3VwKGxvb2t1cCwgdGFibGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcHBseUxvb2t1cCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXNcIik7XG4gIH07XG5cbiAgX3Byb3RvLmFwcGx5TG9va3VwTGlzdCA9IGZ1bmN0aW9uIGFwcGx5TG9va3VwTGlzdChsb29rdXBSZWNvcmRzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLmdseXBoSXRlcmF0b3Iub3B0aW9ucztcbiAgICB2YXIgZ2x5cGhJbmRleCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5pbmRleDtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjEwID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKGxvb2t1cFJlY29yZHMpLCBfc3RlcDEwOyAhKF9zdGVwMTAgPSBfaXRlcmF0b3IxMCgpKS5kb25lOykge1xuICAgICAgdmFyIGxvb2t1cFJlY29yZCA9IF9zdGVwMTAudmFsdWU7XG4gICAgICAvLyBSZXNldCBmbGFncyBhbmQgZmluZCBnbHlwaCBpbmRleCBmb3IgdGhpcyBsb29rdXAgcmVjb3JkXG4gICAgICB0aGlzLmdseXBoSXRlcmF0b3IucmVzZXQob3B0aW9ucywgZ2x5cGhJbmRleCk7XG4gICAgICB0aGlzLmdseXBoSXRlcmF0b3IuaW5jcmVtZW50KGxvb2t1cFJlY29yZC5zZXF1ZW5jZUluZGV4KTsgLy8gR2V0IHRoZSBsb29rdXAgYW5kIHNldHVwIGZsYWdzIGZvciBzdWJ0YWJsZXNcblxuICAgICAgdmFyIGxvb2t1cCA9IHRoaXMudGFibGUubG9va3VwTGlzdC5nZXQobG9va3VwUmVjb3JkLmxvb2t1cExpc3RJbmRleCk7XG4gICAgICB0aGlzLmdseXBoSXRlcmF0b3IucmVzZXQobG9va3VwLmZsYWdzLCB0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXgpOyAvLyBBcHBseSBsb29rdXAgc3VidGFibGVzIHVudGlsIG9uZSBtYXRjaGVzXG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjExID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKGxvb2t1cC5zdWJUYWJsZXMpLCBfc3RlcDExOyAhKF9zdGVwMTEgPSBfaXRlcmF0b3IxMSgpKS5kb25lOykge1xuICAgICAgICB2YXIgdGFibGUgPSBfc3RlcDExLnZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLmFwcGx5TG9va3VwKGxvb2t1cC5sb29rdXBUeXBlLCB0YWJsZSkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5yZXNldChvcHRpb25zLCBnbHlwaEluZGV4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBfcHJvdG8uY292ZXJhZ2VJbmRleCA9IGZ1bmN0aW9uIGNvdmVyYWdlSW5kZXgoY292ZXJhZ2UsIGdseXBoKSB7XG4gICAgaWYgKGdseXBoID09IG51bGwpIHtcbiAgICAgIGdseXBoID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmN1ci5pZDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvdmVyYWdlLnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIGNvdmVyYWdlLmdseXBocy5pbmRleE9mKGdseXBoKTtcblxuICAgICAgY2FzZSAyOlxuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IxMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChjb3ZlcmFnZS5yYW5nZVJlY29yZHMpLCBfc3RlcDEyOyAhKF9zdGVwMTIgPSBfaXRlcmF0b3IxMigpKS5kb25lOykge1xuICAgICAgICAgIHZhciByYW5nZSA9IF9zdGVwMTIudmFsdWU7XG5cbiAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnQgPD0gZ2x5cGggJiYgZ2x5cGggPD0gcmFuZ2UuZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnRDb3ZlcmFnZUluZGV4ICsgZ2x5cGggLSByYW5nZS5zdGFydDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH07XG5cbiAgX3Byb3RvLm1hdGNoID0gZnVuY3Rpb24gbWF0Y2goc2VxdWVuY2VJbmRleCwgc2VxdWVuY2UsIGZuLCBtYXRjaGVkKSB7XG4gICAgdmFyIHBvcyA9IHRoaXMuZ2x5cGhJdGVyYXRvci5pbmRleDtcbiAgICB2YXIgZ2x5cGggPSB0aGlzLmdseXBoSXRlcmF0b3IuaW5jcmVtZW50KHNlcXVlbmNlSW5kZXgpO1xuICAgIHZhciBpZHggPSAwO1xuXG4gICAgd2hpbGUgKGlkeCA8IHNlcXVlbmNlLmxlbmd0aCAmJiBnbHlwaCAmJiBmbihzZXF1ZW5jZVtpZHhdLCBnbHlwaCkpIHtcbiAgICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgIG1hdGNoZWQucHVzaCh0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXgpO1xuICAgICAgfVxuXG4gICAgICBpZHgrKztcbiAgICAgIGdseXBoID0gdGhpcy5nbHlwaEl0ZXJhdG9yLm5leHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXggPSBwb3M7XG5cbiAgICBpZiAoaWR4IDwgc2VxdWVuY2UubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWQgfHwgdHJ1ZTtcbiAgfTtcblxuICBfcHJvdG8uc2VxdWVuY2VNYXRjaGVzID0gZnVuY3Rpb24gc2VxdWVuY2VNYXRjaGVzKHNlcXVlbmNlSW5kZXgsIHNlcXVlbmNlKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goc2VxdWVuY2VJbmRleCwgc2VxdWVuY2UsIGZ1bmN0aW9uIChjb21wb25lbnQsIGdseXBoKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50ID09PSBnbHlwaC5pZDtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uc2VxdWVuY2VNYXRjaEluZGljZXMgPSBmdW5jdGlvbiBzZXF1ZW5jZU1hdGNoSW5kaWNlcyhzZXF1ZW5jZUluZGV4LCBzZXF1ZW5jZSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gdGhpcy5tYXRjaChzZXF1ZW5jZUluZGV4LCBzZXF1ZW5jZSwgZnVuY3Rpb24gKGNvbXBvbmVudCwgZ2x5cGgpIHtcbiAgICAgIC8vIElmIHRoZSBjdXJyZW50IGZlYXR1cmUgZG9lc24ndCBhcHBseSB0byB0aGlzIGdseXBoLFxuICAgICAgaWYgKCEoX3RoaXMuY3VycmVudEZlYXR1cmUgaW4gZ2x5cGguZmVhdHVyZXMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBvbmVudCA9PT0gZ2x5cGguaWQ7XG4gICAgfSwgW10pO1xuICB9O1xuXG4gIF9wcm90by5jb3ZlcmFnZVNlcXVlbmNlTWF0Y2hlcyA9IGZ1bmN0aW9uIGNvdmVyYWdlU2VxdWVuY2VNYXRjaGVzKHNlcXVlbmNlSW5kZXgsIHNlcXVlbmNlKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICByZXR1cm4gdGhpcy5tYXRjaChzZXF1ZW5jZUluZGV4LCBzZXF1ZW5jZSwgZnVuY3Rpb24gKGNvdmVyYWdlLCBnbHlwaCkge1xuICAgICAgcmV0dXJuIF90aGlzMi5jb3ZlcmFnZUluZGV4KGNvdmVyYWdlLCBnbHlwaC5pZCkgPj0gMDtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0Q2xhc3NJRCA9IGZ1bmN0aW9uIGdldENsYXNzSUQoZ2x5cGgsIGNsYXNzRGVmKSB7XG4gICAgc3dpdGNoIChjbGFzc0RlZi52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIC8vIENsYXNzIGFycmF5XG4gICAgICAgIHZhciBpID0gZ2x5cGggLSBjbGFzc0RlZi5zdGFydEdseXBoO1xuXG4gICAgICAgIGlmIChpID49IDAgJiYgaSA8IGNsYXNzRGVmLmNsYXNzVmFsdWVBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gY2xhc3NEZWYuY2xhc3NWYWx1ZUFycmF5W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQoY2xhc3NEZWYuY2xhc3NSYW5nZVJlY29yZCksIF9zdGVwMTM7ICEoX3N0ZXAxMyA9IF9pdGVyYXRvcjEzKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIHJhbmdlID0gX3N0ZXAxMy52YWx1ZTtcblxuICAgICAgICAgIGlmIChyYW5nZS5zdGFydCA8PSBnbHlwaCAmJiBnbHlwaCA8PSByYW5nZS5lbmQpIHtcbiAgICAgICAgICAgIHJldHVybiByYW5nZVtcImNsYXNzXCJdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9O1xuXG4gIF9wcm90by5jbGFzc1NlcXVlbmNlTWF0Y2hlcyA9IGZ1bmN0aW9uIGNsYXNzU2VxdWVuY2VNYXRjaGVzKHNlcXVlbmNlSW5kZXgsIHNlcXVlbmNlLCBjbGFzc0RlZikge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHRoaXMubWF0Y2goc2VxdWVuY2VJbmRleCwgc2VxdWVuY2UsIGZ1bmN0aW9uIChjbGFzc0lELCBnbHlwaCkge1xuICAgICAgcmV0dXJuIGNsYXNzSUQgPT09IF90aGlzMy5nZXRDbGFzc0lEKGdseXBoLmlkLCBjbGFzc0RlZik7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLmFwcGx5Q29udGV4dCA9IGZ1bmN0aW9uIGFwcGx5Q29udGV4dCh0YWJsZSkge1xuICAgIHN3aXRjaCAodGFibGUudmVyc2lvbikge1xuICAgICAgY2FzZSAxOlxuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UpO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2V0ID0gdGFibGUucnVsZVNldHNbaW5kZXhdO1xuXG4gICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjE0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRkKHNldCksIF9zdGVwMTQ7ICEoX3N0ZXAxNCA9IF9pdGVyYXRvcjE0KCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIHJ1bGUgPSBfc3RlcDE0LnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc2VxdWVuY2VNYXRjaGVzKDEsIHJ1bGUuaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxvb2t1cExpc3QocnVsZS5sb29rdXBSZWNvcmRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICBpZiAodGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlKSA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCA9IHRoaXMuZ2V0Q2xhc3NJRCh0aGlzLmdseXBoSXRlcmF0b3IuY3VyLmlkLCB0YWJsZS5jbGFzc0RlZik7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldCA9IHRhYmxlLmNsYXNzU2V0W2luZGV4XTtcblxuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IxNSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChzZXQpLCBfc3RlcDE1OyAhKF9zdGVwMTUgPSBfaXRlcmF0b3IxNSgpKS5kb25lOykge1xuICAgICAgICAgIHZhciBfcnVsZSA9IF9zdGVwMTUudmFsdWU7XG5cbiAgICAgICAgICBpZiAodGhpcy5jbGFzc1NlcXVlbmNlTWF0Y2hlcygxLCBfcnVsZS5jbGFzc2VzLCB0YWJsZS5jbGFzc0RlZikpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5TG9va3VwTGlzdChfcnVsZS5sb29rdXBSZWNvcmRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAzOlxuICAgICAgICBpZiAodGhpcy5jb3ZlcmFnZVNlcXVlbmNlTWF0Y2hlcygwLCB0YWJsZS5jb3ZlcmFnZXMpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMb29rdXBMaXN0KHRhYmxlLmxvb2t1cFJlY29yZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIF9wcm90by5hcHBseUNoYWluaW5nQ29udGV4dCA9IGZ1bmN0aW9uIGFwcGx5Q2hhaW5pbmdDb250ZXh0KHRhYmxlKSB7XG4gICAgc3dpdGNoICh0YWJsZS52ZXJzaW9uKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5jb3ZlcmFnZSk7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZXQgPSB0YWJsZS5jaGFpblJ1bGVTZXRzW2luZGV4XTtcblxuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IxNiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZChzZXQpLCBfc3RlcDE2OyAhKF9zdGVwMTYgPSBfaXRlcmF0b3IxNigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBydWxlID0gX3N0ZXAxNi52YWx1ZTtcblxuICAgICAgICAgIGlmICh0aGlzLnNlcXVlbmNlTWF0Y2hlcygtcnVsZS5iYWNrdHJhY2subGVuZ3RoLCBydWxlLmJhY2t0cmFjaykgJiYgdGhpcy5zZXF1ZW5jZU1hdGNoZXMoMSwgcnVsZS5pbnB1dCkgJiYgdGhpcy5zZXF1ZW5jZU1hdGNoZXMoMSArIHJ1bGUuaW5wdXQubGVuZ3RoLCBydWxlLmxvb2thaGVhZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5TG9va3VwTGlzdChydWxlLmxvb2t1cFJlY29yZHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDI6XG4gICAgICAgIGlmICh0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UpID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gdGhpcy5nZXRDbGFzc0lEKHRoaXMuZ2x5cGhJdGVyYXRvci5jdXIuaWQsIHRhYmxlLmlucHV0Q2xhc3NEZWYpO1xuICAgICAgICB2YXIgcnVsZXMgPSB0YWJsZS5jaGFpbkNsYXNzU2V0W2luZGV4XTtcblxuICAgICAgICBpZiAoIXJ1bGVzKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMTcgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGQocnVsZXMpLCBfc3RlcDE3OyAhKF9zdGVwMTcgPSBfaXRlcmF0b3IxNygpKS5kb25lOykge1xuICAgICAgICAgIHZhciBfcnVsZTIgPSBfc3RlcDE3LnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY2xhc3NTZXF1ZW5jZU1hdGNoZXMoLV9ydWxlMi5iYWNrdHJhY2subGVuZ3RoLCBfcnVsZTIuYmFja3RyYWNrLCB0YWJsZS5iYWNrdHJhY2tDbGFzc0RlZikgJiYgdGhpcy5jbGFzc1NlcXVlbmNlTWF0Y2hlcygxLCBfcnVsZTIuaW5wdXQsIHRhYmxlLmlucHV0Q2xhc3NEZWYpICYmIHRoaXMuY2xhc3NTZXF1ZW5jZU1hdGNoZXMoMSArIF9ydWxlMi5pbnB1dC5sZW5ndGgsIF9ydWxlMi5sb29rYWhlYWQsIHRhYmxlLmxvb2thaGVhZENsYXNzRGVmKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMb29rdXBMaXN0KF9ydWxlMi5sb29rdXBSZWNvcmRzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAzOlxuICAgICAgICBpZiAodGhpcy5jb3ZlcmFnZVNlcXVlbmNlTWF0Y2hlcygtdGFibGUuYmFja3RyYWNrR2x5cGhDb3VudCwgdGFibGUuYmFja3RyYWNrQ292ZXJhZ2UpICYmIHRoaXMuY292ZXJhZ2VTZXF1ZW5jZU1hdGNoZXMoMCwgdGFibGUuaW5wdXRDb3ZlcmFnZSkgJiYgdGhpcy5jb3ZlcmFnZVNlcXVlbmNlTWF0Y2hlcyh0YWJsZS5pbnB1dEdseXBoQ291bnQsIHRhYmxlLmxvb2thaGVhZENvdmVyYWdlKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5TG9va3VwTGlzdCh0YWJsZS5sb29rdXBSZWNvcmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICByZXR1cm4gT1RQcm9jZXNzb3I7XG59KCk7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDQodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MkNChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDQoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ0KENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG52YXIgR2x5cGhJbmZvID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gR2x5cGhJbmZvKGZvbnQsIGlkLCBjb2RlUG9pbnRzLCBmZWF0dXJlcykge1xuICAgIGlmIChjb2RlUG9pbnRzID09PSB2b2lkIDApIHtcbiAgICAgIGNvZGVQb2ludHMgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLl9mb250ID0gZm9udDtcbiAgICB0aGlzLmNvZGVQb2ludHMgPSBjb2RlUG9pbnRzO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLmZlYXR1cmVzID0ge307XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmZWF0dXJlcykpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTtcbiAgICAgICAgdGhpcy5mZWF0dXJlc1tmZWF0dXJlXSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZmVhdHVyZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuZmVhdHVyZXMsIGZlYXR1cmVzKTtcbiAgICB9XG5cbiAgICB0aGlzLmxpZ2F0dXJlSUQgPSBudWxsO1xuICAgIHRoaXMubGlnYXR1cmVDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuaXNMaWdhdGVkID0gZmFsc2U7XG4gICAgdGhpcy5jdXJzaXZlQXR0YWNobWVudCA9IG51bGw7XG4gICAgdGhpcy5tYXJrQXR0YWNobWVudCA9IG51bGw7XG4gICAgdGhpcy5zaGFwZXJJbmZvID0gbnVsbDtcbiAgICB0aGlzLnN1YnN0aXR1dGVkID0gZmFsc2U7XG4gICAgdGhpcy5pc011bHRpcGxpZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBHbHlwaEluZm8ucHJvdG90eXBlO1xuXG4gIF9wcm90by5jb3B5ID0gZnVuY3Rpb24gY29weSgpIHtcbiAgICByZXR1cm4gbmV3IEdseXBoSW5mbyh0aGlzLl9mb250LCB0aGlzLmlkLCB0aGlzLmNvZGVQb2ludHMsIHRoaXMuZmVhdHVyZXMpO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyQ0KEdseXBoSW5mbywgW3tcbiAgICBrZXk6IFwiaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KGlkKSB7XG4gICAgICB0aGlzLl9pZCA9IGlkO1xuICAgICAgdGhpcy5zdWJzdGl0dXRlZCA9IHRydWU7XG4gICAgICB2YXIgR0RFRiA9IHRoaXMuX2ZvbnQuR0RFRjtcblxuICAgICAgaWYgKEdERUYgJiYgR0RFRi5nbHlwaENsYXNzRGVmKSB7XG4gICAgICAgIC8vIFRPRE86IGNsZWFuIHRoaXMgdXBcbiAgICAgICAgdmFyIGNsYXNzSUQgPSBPVFByb2Nlc3Nvci5wcm90b3R5cGUuZ2V0Q2xhc3NJRChpZCwgR0RFRi5nbHlwaENsYXNzRGVmKTtcbiAgICAgICAgdGhpcy5pc0Jhc2UgPSBjbGFzc0lEID09PSAxO1xuICAgICAgICB0aGlzLmlzTGlnYXR1cmUgPSBjbGFzc0lEID09PSAyO1xuICAgICAgICB0aGlzLmlzTWFyayA9IGNsYXNzSUQgPT09IDM7XG4gICAgICAgIHRoaXMubWFya0F0dGFjaG1lbnRUeXBlID0gR0RFRi5tYXJrQXR0YWNoQ2xhc3NEZWYgPyBPVFByb2Nlc3Nvci5wcm90b3R5cGUuZ2V0Q2xhc3NJRChpZCwgR0RFRi5tYXJrQXR0YWNoQ2xhc3NEZWYpIDogMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNNYXJrID0gdGhpcy5jb2RlUG9pbnRzLmxlbmd0aCA+IDAgJiYgdGhpcy5jb2RlUG9pbnRzLmV2ZXJ5KHVuaWNvZGUuaXNNYXJrKTtcbiAgICAgICAgdGhpcy5pc0Jhc2UgPSAhdGhpcy5pc01hcms7XG4gICAgICAgIHRoaXMuaXNMaWdhdHVyZSA9IHRoaXMuY29kZVBvaW50cy5sZW5ndGggPiAxO1xuICAgICAgICB0aGlzLm1hcmtBdHRhY2htZW50VHlwZSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEdseXBoSW5mbztcbn0oKTtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkNChzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5JDEob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuLyoqXG4gKiBUaGlzIGlzIGEgc2hhcGVyIGZvciB0aGUgSGFuZ3VsIHNjcmlwdCwgdXNlZCBieSB0aGUgS29yZWFuIGxhbmd1YWdlLlxuICogSXQgZG9lcyB0aGUgZm9sbG93aW5nOlxuICogICAtIGRlY29tcG9zZSBpZiB1bnN1cHBvcnRlZCBieSB0aGUgZm9udDpcbiAqICAgICA8TFY+ICAgLT4gPEwsVj5cbiAqICAgICA8TFZUPiAgLT4gPEwsVixUPlxuICogICAgIDxMVixUPiAtPiA8TCxWLFQ+XG4gKlxuICogICAtIGNvbXBvc2UgaWYgc3VwcG9ydGVkIGJ5IHRoZSBmb250OlxuICogICAgIDxMLFY+ICAgLT4gPExWPlxuICogICAgIDxMLFYsVD4gLT4gPExWVD5cbiAqICAgICA8TFYsVD4gIC0+IDxMVlQ+XG4gKlxuICogICAtIHJlb3JkZXIgdG9uZSBtYXJrcyAoUyBpcyBhbnkgdmFsaWQgc3lsbGFibGUpOlxuICogICAgIDxTLCBNPiAtPiA8TSwgUz5cbiAqXG4gKiAgIC0gYXBwbHkgbGptbywgdmptbywgYW5kIHRqbW8gT3BlblR5cGUgZmVhdHVyZXMgdG8gZGVjb21wb3NlZCBKYW1vIHNlcXVlbmNlcy5cbiAqXG4gKiBUaGlzIGxvZ2ljIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzOlxuICogICAtIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L09wZW5UeXBlRGV2L2hhbmd1bC9pbnRyby5odG1cbiAqICAgLSBodHRwOi8va3R1Zy5vcmcvfm5vbW9zL2hhcmZidXp6LWhhbmd1bC9oYW5ndWxzaGFwZXIucGRmXG4gKi9cblxudmFyIEhhbmd1bFNoYXBlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0RlZmF1bHRTaGFwZXIpIHtcbiAgX2luaGVyaXRzTG9vc2UkNChIYW5ndWxTaGFwZXIsIF9EZWZhdWx0U2hhcGVyKTtcblxuICBmdW5jdGlvbiBIYW5ndWxTaGFwZXIoKSB7XG4gICAgcmV0dXJuIF9EZWZhdWx0U2hhcGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIEhhbmd1bFNoYXBlci5wbGFuRmVhdHVyZXMgPSBmdW5jdGlvbiBwbGFuRmVhdHVyZXMocGxhbikge1xuICAgIHBsYW4uYWRkKFsnbGptbycsICd2am1vJywgJ3RqbW8nXSwgZmFsc2UpO1xuICB9O1xuXG4gIEhhbmd1bFNoYXBlci5hc3NpZ25GZWF0dXJlcyA9IGZ1bmN0aW9uIGFzc2lnbkZlYXR1cmVzKHBsYW4sIGdseXBocykge1xuICAgIHZhciBzdGF0ZSA9IDA7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBnbHlwaHMubGVuZ3RoKSB7XG4gICAgICB2YXIgYWN0aW9uID0gdm9pZCAwO1xuICAgICAgdmFyIGdseXBoID0gZ2x5cGhzW2ldO1xuICAgICAgdmFyIGNvZGUgPSBnbHlwaC5jb2RlUG9pbnRzWzBdO1xuICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlKGNvZGUpO1xuICAgICAgdmFyIF9TVEFURV9UQUJMRSRzdGF0ZSR0eSA9IFNUQVRFX1RBQkxFJDFbc3RhdGVdW3R5cGVdO1xuICAgICAgYWN0aW9uID0gX1NUQVRFX1RBQkxFJHN0YXRlJHR5WzBdO1xuICAgICAgc3RhdGUgPSBfU1RBVEVfVEFCTEUkc3RhdGUkdHlbMV07XG5cbiAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgREVDT01QT1NFOlxuICAgICAgICAgIC8vIERlY29tcG9zZSB0aGUgY29tcG9zZWQgc3lsbGFibGUgaWYgaXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZm9udC5cbiAgICAgICAgICBpZiAoIXBsYW4uZm9udC5oYXNHbHlwaEZvckNvZGVQb2ludChjb2RlKSkge1xuICAgICAgICAgICAgaSA9IGRlY29tcG9zZShnbHlwaHMsIGksIHBsYW4uZm9udCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDT01QT1NFOlxuICAgICAgICAgIC8vIEZvdW5kIGEgZGVjb21wb3NlZCBzeWxsYWJsZS4gVHJ5IHRvIGNvbXBvc2UgaWYgc3VwcG9ydGVkIGJ5IHRoZSBmb250LlxuICAgICAgICAgIGkgPSBjb21wb3NlKGdseXBocywgaSwgcGxhbi5mb250KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRPTkVfTUFSSzpcbiAgICAgICAgICAvLyBHb3QgYSB2YWxpZCBzeWxsYWJsZSwgZm9sbG93ZWQgYnkgYSB0b25lIG1hcmsuIE1vdmUgdGhlIHRvbmUgbWFyayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzeWxsYWJsZS5cbiAgICAgICAgICByZW9yZGVyVG9uZU1hcmsoZ2x5cGhzLCBpLCBwbGFuLmZvbnQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgSU5WQUxJRDpcbiAgICAgICAgICAvLyBUb25lIG1hcmsgaGFzIG5vIHZhbGlkIHN5bGxhYmxlIHRvIGF0dGFjaCB0bywgc28gaW5zZXJ0IGEgZG90dGVkIGNpcmNsZVxuICAgICAgICAgIGkgPSBpbnNlcnREb3R0ZWRDaXJjbGUoZ2x5cGhzLCBpLCBwbGFuLmZvbnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBIYW5ndWxTaGFwZXI7XG59KERlZmF1bHRTaGFwZXIpO1xuXG5fZGVmaW5lUHJvcGVydHkkMShIYW5ndWxTaGFwZXIsIFwiemVyb01hcmtXaWR0aHNcIiwgJ05PTkUnKTtcbnZhciBIQU5HVUxfQkFTRSA9IDB4YWMwMDtcbnZhciBIQU5HVUxfRU5EID0gMHhkN2E0O1xudmFyIEhBTkdVTF9DT1VOVCA9IEhBTkdVTF9FTkQgLSBIQU5HVUxfQkFTRSArIDE7XG52YXIgTF9CQVNFID0gMHgxMTAwOyAvLyBsZWFkXG5cbnZhciBWX0JBU0UgPSAweDExNjE7IC8vIHZvd2VsXG5cbnZhciBUX0JBU0UgPSAweDExYTc7IC8vIHRyYWlsXG5cbnZhciBMX0NPVU5UID0gMTk7XG52YXIgVl9DT1VOVCA9IDIxO1xudmFyIFRfQ09VTlQgPSAyODtcbnZhciBMX0VORCA9IExfQkFTRSArIExfQ09VTlQgLSAxO1xudmFyIFZfRU5EID0gVl9CQVNFICsgVl9DT1VOVCAtIDE7XG52YXIgVF9FTkQgPSBUX0JBU0UgKyBUX0NPVU5UIC0gMTtcbnZhciBET1RURURfQ0lSQ0xFID0gMHgyNWNjO1xuXG52YXIgaXNMID0gZnVuY3Rpb24gaXNMKGNvZGUpIHtcbiAgcmV0dXJuIDB4MTEwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHgxMTVmIHx8IDB4YTk2MCA8PSBjb2RlICYmIGNvZGUgPD0gMHhhOTdjO1xufTtcblxudmFyIGlzViA9IGZ1bmN0aW9uIGlzVihjb2RlKSB7XG4gIHJldHVybiAweDExNjAgPD0gY29kZSAmJiBjb2RlIDw9IDB4MTFhNyB8fCAweGQ3YjAgPD0gY29kZSAmJiBjb2RlIDw9IDB4ZDdjNjtcbn07XG5cbnZhciBpc1QgPSBmdW5jdGlvbiBpc1QoY29kZSkge1xuICByZXR1cm4gMHgxMWE4IDw9IGNvZGUgJiYgY29kZSA8PSAweDExZmYgfHwgMHhkN2NiIDw9IGNvZGUgJiYgY29kZSA8PSAweGQ3ZmI7XG59O1xuXG52YXIgaXNUb25lID0gZnVuY3Rpb24gaXNUb25lKGNvZGUpIHtcbiAgcmV0dXJuIDB4MzAyZSA8PSBjb2RlICYmIGNvZGUgPD0gMHgzMDJmO1xufTtcblxudmFyIGlzTFZUID0gZnVuY3Rpb24gaXNMVlQoY29kZSkge1xuICByZXR1cm4gSEFOR1VMX0JBU0UgPD0gY29kZSAmJiBjb2RlIDw9IEhBTkdVTF9FTkQ7XG59O1xuXG52YXIgaXNMViA9IGZ1bmN0aW9uIGlzTFYoY29kZSkge1xuICByZXR1cm4gY29kZSAtIEhBTkdVTF9CQVNFIDwgSEFOR1VMX0NPVU5UICYmIChjb2RlIC0gSEFOR1VMX0JBU0UpICUgVF9DT1VOVCA9PT0gMDtcbn07XG5cbnZhciBpc0NvbWJpbmluZ0wgPSBmdW5jdGlvbiBpc0NvbWJpbmluZ0woY29kZSkge1xuICByZXR1cm4gTF9CQVNFIDw9IGNvZGUgJiYgY29kZSA8PSBMX0VORDtcbn07XG5cbnZhciBpc0NvbWJpbmluZ1YgPSBmdW5jdGlvbiBpc0NvbWJpbmluZ1YoY29kZSkge1xuICByZXR1cm4gVl9CQVNFIDw9IGNvZGUgJiYgY29kZSA8PSBWX0VORDtcbn07XG5cbnZhciBpc0NvbWJpbmluZ1QgPSBmdW5jdGlvbiBpc0NvbWJpbmluZ1QoY29kZSkge1xuICByZXR1cm4gIDEgPD0gY29kZSAmJiBjb2RlIDw9IFRfRU5EO1xufTsgLy8gQ2hhcmFjdGVyIGNhdGVnb3JpZXNcblxuXG52YXIgWCA9IDA7IC8vIE90aGVyIGNoYXJhY3RlclxuXG52YXIgTCA9IDE7IC8vIExlYWRpbmcgY29uc29uYW50XG5cbnZhciBWID0gMjsgLy8gTWVkaWFsIHZvd2VsXG5cbnZhciBUID0gMzsgLy8gVHJhaWxpbmcgY29uc29uYW50XG5cbnZhciBMViA9IDQ7IC8vIENvbXBvc2VkIDxMVj4gc3lsbGFibGVcblxudmFyIExWVCA9IDU7IC8vIENvbXBvc2VkIDxMVlQ+IHN5bGxhYmxlXG5cbnZhciBNID0gNjsgLy8gVG9uZSBtYXJrXG4vLyBUaGlzIGZ1bmN0aW9uIGNsYXNzaWZpZXMgYSBjaGFyYWN0ZXIgdXNpbmcgdGhlIGFib3ZlIGNhdGVnb3JpZXMuXG5cbmZ1bmN0aW9uIGdldFR5cGUoY29kZSkge1xuICBpZiAoaXNMKGNvZGUpKSB7XG4gICAgcmV0dXJuIEw7XG4gIH1cblxuICBpZiAoaXNWKGNvZGUpKSB7XG4gICAgcmV0dXJuIFY7XG4gIH1cblxuICBpZiAoaXNUKGNvZGUpKSB7XG4gICAgcmV0dXJuIFQ7XG4gIH1cblxuICBpZiAoaXNMVihjb2RlKSkge1xuICAgIHJldHVybiBMVjtcbiAgfVxuXG4gIGlmIChpc0xWVChjb2RlKSkge1xuICAgIHJldHVybiBMVlQ7XG4gIH1cblxuICBpZiAoaXNUb25lKGNvZGUpKSB7XG4gICAgcmV0dXJuIE07XG4gIH1cblxuICByZXR1cm4gWDtcbn0gLy8gU3RhdGUgbWFjaGluZSBhY3Rpb25zXG5cblxudmFyIE5PX0FDVElPTiA9IDA7XG52YXIgREVDT01QT1NFID0gMTtcbnZhciBDT01QT1NFID0gMjtcbnZhciBUT05FX01BUksgPSA0O1xudmFyIElOVkFMSUQgPSA1OyAvLyBCdWlsZCBhIHN0YXRlIG1hY2hpbmUgdGhhdCBhY2NlcHRzIHZhbGlkIHN5bGxhYmxlcywgYW5kIGFwcGxpZXMgYWN0aW9ucyBhbG9uZyB0aGUgd2F5LlxuLy8gVGhlIGxvZ2ljIHRoaXMgaXMgaW1wbGVtZW50aW5nIGlzIGRvY3VtZW50ZWQgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS5cblxudmFyIFNUQVRFX1RBQkxFJDEgPSBbLy8gICAgICAgWCAgICAgICAgICAgICAgICAgTCAgICAgICAgICAgICAgICAgViAgICAgICAgICAgICAgICBUICAgICAgICAgICAgICAgICAgTFYgICAgICAgICAgICAgICAgTFZUICAgICAgICAgICAgICAgTVxuLy8gU3RhdGUgMDogc3RhcnQgc3RhdGVcbltbTk9fQUNUSU9OLCAwXSwgW05PX0FDVElPTiwgMV0sIFtOT19BQ1RJT04sIDBdLCBbTk9fQUNUSU9OLCAwXSwgW0RFQ09NUE9TRSwgMl0sIFtERUNPTVBPU0UsIDNdLCBbSU5WQUxJRCwgMF1dLCAvLyBTdGF0ZSAxOiA8TD5cbltbTk9fQUNUSU9OLCAwXSwgW05PX0FDVElPTiwgMV0sIFtDT01QT1NFLCAyXSwgW05PX0FDVElPTiwgMF0sIFtERUNPTVBPU0UsIDJdLCBbREVDT01QT1NFLCAzXSwgW0lOVkFMSUQsIDBdXSwgLy8gU3RhdGUgMjogPEwsVj4gb3IgPExWPlxuW1tOT19BQ1RJT04sIDBdLCBbTk9fQUNUSU9OLCAxXSwgW05PX0FDVElPTiwgMF0sIFtDT01QT1NFLCAzXSwgW0RFQ09NUE9TRSwgMl0sIFtERUNPTVBPU0UsIDNdLCBbVE9ORV9NQVJLLCAwXV0sIC8vIFN0YXRlIDM6IDxMLFYsVD4gb3IgPExWVD5cbltbTk9fQUNUSU9OLCAwXSwgW05PX0FDVElPTiwgMV0sIFtOT19BQ1RJT04sIDBdLCBbTk9fQUNUSU9OLCAwXSwgW0RFQ09NUE9TRSwgMl0sIFtERUNPTVBPU0UsIDNdLCBbVE9ORV9NQVJLLCAwXV1dO1xuXG5mdW5jdGlvbiBnZXRHbHlwaChmb250LCBjb2RlLCBmZWF0dXJlcykge1xuICByZXR1cm4gbmV3IEdseXBoSW5mbyhmb250LCBmb250LmdseXBoRm9yQ29kZVBvaW50KGNvZGUpLmlkLCBbY29kZV0sIGZlYXR1cmVzKTtcbn1cblxuZnVuY3Rpb24gZGVjb21wb3NlKGdseXBocywgaSwgZm9udCkge1xuICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gIHZhciBjb2RlID0gZ2x5cGguY29kZVBvaW50c1swXTtcbiAgdmFyIHMgPSBjb2RlIC0gSEFOR1VMX0JBU0U7XG4gIHZhciB0ID0gVF9CQVNFICsgcyAlIFRfQ09VTlQ7XG4gIHMgPSBzIC8gVF9DT1VOVCB8IDA7XG4gIHZhciBsID0gTF9CQVNFICsgcyAvIFZfQ09VTlQgfCAwO1xuICB2YXIgdiA9IFZfQkFTRSArIHMgJSBWX0NPVU5UOyAvLyBEb24ndCBkZWNvbXBvc2UgaWYgYWxsIG9mIHRoZSBjb21wb25lbnRzIGFyZSBub3QgYXZhaWxhYmxlXG5cbiAgaWYgKCFmb250Lmhhc0dseXBoRm9yQ29kZVBvaW50KGwpIHx8ICFmb250Lmhhc0dseXBoRm9yQ29kZVBvaW50KHYpIHx8IHQgIT09IFRfQkFTRSAmJiAhZm9udC5oYXNHbHlwaEZvckNvZGVQb2ludCh0KSkge1xuICAgIHJldHVybiBpO1xuICB9IC8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgZ2x5cGggd2l0aCBkZWNvbXBvc2VkIEwsIFYsIGFuZCBUIGdseXBocyxcbiAgLy8gYW5kIGFwcGx5IHRoZSBwcm9wZXIgT3BlblR5cGUgZmVhdHVyZXMgdG8gZWFjaCBjb21wb25lbnQuXG5cblxuICB2YXIgbGptbyA9IGdldEdseXBoKGZvbnQsIGwsIGdseXBoLmZlYXR1cmVzKTtcbiAgbGptby5mZWF0dXJlcy5sam1vID0gdHJ1ZTtcbiAgdmFyIHZqbW8gPSBnZXRHbHlwaChmb250LCB2LCBnbHlwaC5mZWF0dXJlcyk7XG4gIHZqbW8uZmVhdHVyZXMudmptbyA9IHRydWU7XG4gIHZhciBpbnNlcnQgPSBbbGptbywgdmptb107XG5cbiAgaWYgKHQgPiBUX0JBU0UpIHtcbiAgICB2YXIgdGptbyA9IGdldEdseXBoKGZvbnQsIHQsIGdseXBoLmZlYXR1cmVzKTtcbiAgICB0am1vLmZlYXR1cmVzLnRqbW8gPSB0cnVlO1xuICAgIGluc2VydC5wdXNoKHRqbW8pO1xuICB9XG5cbiAgZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtpLCAxXS5jb25jYXQoaW5zZXJ0KSk7XG4gIHJldHVybiBpICsgaW5zZXJ0Lmxlbmd0aCAtIDE7XG59XG5cbmZ1bmN0aW9uIGNvbXBvc2UoZ2x5cGhzLCBpLCBmb250KSB7XG4gIHZhciBnbHlwaCA9IGdseXBoc1tpXTtcbiAgdmFyIGNvZGUgPSBnbHlwaHNbaV0uY29kZVBvaW50c1swXTtcbiAgdmFyIHR5cGUgPSBnZXRUeXBlKGNvZGUpO1xuICB2YXIgcHJldiA9IGdseXBoc1tpIC0gMV0uY29kZVBvaW50c1swXTtcbiAgdmFyIHByZXZUeXBlID0gZ2V0VHlwZShwcmV2KTsgLy8gRmlndXJlIG91dCB3aGF0IHR5cGUgb2Ygc3lsbGFibGUgd2UncmUgZGVhbGluZyB3aXRoXG5cbiAgdmFyIGx2LCBsam1vLCB2am1vLCB0am1vO1xuXG4gIGlmIChwcmV2VHlwZSA9PT0gTFYgJiYgdHlwZSA9PT0gVCkge1xuICAgIC8vIDxMVixUPlxuICAgIGx2ID0gcHJldjtcbiAgICB0am1vID0gZ2x5cGg7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGUgPT09IFYpIHtcbiAgICAgIC8vIDxMLFY+XG4gICAgICBsam1vID0gZ2x5cGhzW2kgLSAxXTtcbiAgICAgIHZqbW8gPSBnbHlwaDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gPEwsVixUPlxuICAgICAgbGptbyA9IGdseXBoc1tpIC0gMl07XG4gICAgICB2am1vID0gZ2x5cGhzW2kgLSAxXTtcbiAgICAgIHRqbW8gPSBnbHlwaDtcbiAgICB9XG5cbiAgICB2YXIgbCA9IGxqbW8uY29kZVBvaW50c1swXTtcbiAgICB2YXIgdiA9IHZqbW8uY29kZVBvaW50c1swXTsgLy8gTWFrZSBzdXJlIEwgYW5kIFYgYXJlIGNvbWJpbmluZyBjaGFyYWN0ZXJzXG5cbiAgICBpZiAoaXNDb21iaW5pbmdMKGwpICYmIGlzQ29tYmluaW5nVih2KSkge1xuICAgICAgbHYgPSBIQU5HVUxfQkFTRSArICgobCAtIExfQkFTRSkgKiBWX0NPVU5UICsgKHYgLSBWX0JBU0UpKSAqIFRfQ09VTlQ7XG4gICAgfVxuICB9XG5cbiAgdmFyIHQgPSB0am1vICYmIHRqbW8uY29kZVBvaW50c1swXSB8fCBUX0JBU0U7XG5cbiAgaWYgKGx2ICE9IG51bGwgJiYgKHQgPT09IFRfQkFTRSB8fCBpc0NvbWJpbmluZ1QodCkpKSB7XG4gICAgdmFyIHMgPSBsdiArICh0IC0gVF9CQVNFKTsgLy8gUmVwbGFjZSB3aXRoIGEgY29tcG9zZWQgZ2x5cGggaWYgc3VwcG9ydGVkIGJ5IHRoZSBmb250LFxuICAgIC8vIG90aGVyd2lzZSBhcHBseSB0aGUgcHJvcGVyIE9wZW5UeXBlIGZlYXR1cmVzIHRvIGVhY2ggY29tcG9uZW50LlxuXG4gICAgaWYgKGZvbnQuaGFzR2x5cGhGb3JDb2RlUG9pbnQocykpIHtcbiAgICAgIHZhciBkZWwgPSBwcmV2VHlwZSA9PT0gViA/IDMgOiAyO1xuICAgICAgZ2x5cGhzLnNwbGljZShpIC0gZGVsICsgMSwgZGVsLCBnZXRHbHlwaChmb250LCBzLCBnbHlwaC5mZWF0dXJlcykpO1xuICAgICAgcmV0dXJuIGkgLSBkZWwgKyAxO1xuICAgIH1cbiAgfSAvLyBEaWRuJ3QgY29tcG9zZSAoZWl0aGVyIGEgbm9uLWNvbWJpbmluZyBjb21wb25lbnQgb3IgdW5zdXBwb3J0ZWQgYnkgZm9udCkuXG5cblxuICBpZiAobGptbykge1xuICAgIGxqbW8uZmVhdHVyZXMubGptbyA9IHRydWU7XG4gIH1cblxuICBpZiAodmptbykge1xuICAgIHZqbW8uZmVhdHVyZXMudmptbyA9IHRydWU7XG4gIH1cblxuICBpZiAodGptbykge1xuICAgIHRqbW8uZmVhdHVyZXMudGptbyA9IHRydWU7XG4gIH1cblxuICBpZiAocHJldlR5cGUgPT09IExWKSB7XG4gICAgLy8gU2VxdWVuY2Ugd2FzIG9yaWdpbmFsbHkgPEwsVj4sIHdoaWNoIGdvdCBjb21iaW5lZCBlYXJsaWVyLlxuICAgIC8vIEVpdGhlciB0aGUgVCB3YXMgbm9uLWNvbWJpbmluZywgb3IgdGhlIExWVCBnbHlwaCB3YXNuJ3Qgc3VwcG9ydGVkLlxuICAgIC8vIERlY29tcG9zZSB0aGUgZ2x5cGggYWdhaW4gYW5kIGFwcGx5IE9UIGZlYXR1cmVzLlxuICAgIGRlY29tcG9zZShnbHlwaHMsIGkgLSAxLCBmb250KTtcbiAgICByZXR1cm4gaSArIDE7XG4gIH1cblxuICByZXR1cm4gaTtcbn1cblxuZnVuY3Rpb24gZ2V0TGVuZ3RoKGNvZGUpIHtcbiAgc3dpdGNoIChnZXRUeXBlKGNvZGUpKSB7XG4gICAgY2FzZSBMVjpcbiAgICBjYXNlIExWVDpcbiAgICAgIHJldHVybiAxO1xuXG4gICAgY2FzZSBWOlxuICAgICAgcmV0dXJuIDI7XG5cbiAgICBjYXNlIFQ6XG4gICAgICByZXR1cm4gMztcbiAgfVxufVxuXG5mdW5jdGlvbiByZW9yZGVyVG9uZU1hcmsoZ2x5cGhzLCBpLCBmb250KSB7XG4gIHZhciBnbHlwaCA9IGdseXBoc1tpXTtcbiAgdmFyIGNvZGUgPSBnbHlwaHNbaV0uY29kZVBvaW50c1swXTsgLy8gTW92ZSB0b25lIG1hcmsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJldmlvdXMgc3lsbGFibGUsIHVubGVzcyBpdCBpcyB6ZXJvIHdpZHRoXG5cbiAgaWYgKGZvbnQuZ2x5cGhGb3JDb2RlUG9pbnQoY29kZSkuYWR2YW5jZVdpZHRoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHByZXYgPSBnbHlwaHNbaSAtIDFdLmNvZGVQb2ludHNbMF07XG4gIHZhciBsZW4gPSBnZXRMZW5ndGgocHJldik7XG4gIGdseXBocy5zcGxpY2UoaSwgMSk7XG4gIHJldHVybiBnbHlwaHMuc3BsaWNlKGkgLSBsZW4sIDAsIGdseXBoKTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0RG90dGVkQ2lyY2xlKGdseXBocywgaSwgZm9udCkge1xuICB2YXIgZ2x5cGggPSBnbHlwaHNbaV07XG4gIHZhciBjb2RlID0gZ2x5cGhzW2ldLmNvZGVQb2ludHNbMF07XG5cbiAgaWYgKGZvbnQuaGFzR2x5cGhGb3JDb2RlUG9pbnQoRE9UVEVEX0NJUkNMRSkpIHtcbiAgICB2YXIgZG90dGVkQ2lyY2xlID0gZ2V0R2x5cGgoZm9udCwgRE9UVEVEX0NJUkNMRSwgZ2x5cGguZmVhdHVyZXMpOyAvLyBJZiB0aGUgdG9uZSBtYXJrIGlzIHplcm8gd2lkdGgsIGluc2VydCB0aGUgZG90dGVkIGNpcmNsZSBiZWZvcmUsIG90aGVyd2lzZSBhZnRlclxuXG4gICAgdmFyIGlkeCA9IGZvbnQuZ2x5cGhGb3JDb2RlUG9pbnQoY29kZSkuYWR2YW5jZVdpZHRoID09PSAwID8gaSA6IGkgKyAxO1xuICAgIGdseXBocy5zcGxpY2UoaWR4LCAwLCBkb3R0ZWRDaXJjbGUpO1xuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiBpO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGUobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGUobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGUobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRlKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkZShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGUoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbnZhciBJTklUSUFMX1NUQVRFID0gMTtcbnZhciBGQUlMX1NUQVRFID0gMDtcbi8qKlxuICogQSBTdGF0ZU1hY2hpbmUgcmVwcmVzZW50cyBhIGRldGVybWluaXN0aWMgZmluaXRlIGF1dG9tYXRvbi5cbiAqIEl0IGNhbiBwZXJmb3JtIG1hdGNoZXMgb3ZlciBhIHNlcXVlbmNlIG9mIHZhbHVlcywgc2ltaWxhciB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqL1xuXG52YXIgU3RhdGVNYWNoaW5lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3RhdGVNYWNoaW5lKGRmYSkge1xuICAgIHRoaXMuc3RhdGVUYWJsZSA9IGRmYS5zdGF0ZVRhYmxlO1xuICAgIHRoaXMuYWNjZXB0aW5nID0gZGZhLmFjY2VwdGluZztcbiAgICB0aGlzLnRhZ3MgPSBkZmEudGFncztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBpdGVyYWJsZSBvYmplY3QgdGhhdCB5aWVsZHMgcGF0dGVybiBtYXRjaGVzIG92ZXIgdGhlIGlucHV0IHNlcXVlbmNlLlxuICAgKiBNYXRjaGVzIGFyZSBvZiB0aGUgZm9ybSBbc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRhZ3NdLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBTdGF0ZU1hY2hpbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5tYXRjaCA9IGZ1bmN0aW9uIG1hdGNoKHN0cikge1xuICAgIHZhciBfcmVmO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBfcmVmID0ge30sIF9yZWZbU3ltYm9sLml0ZXJhdG9yXSA9IC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkge1xuICAgICAgdmFyIHN0YXRlLCBzdGFydFJ1biwgbGFzdEFjY2VwdGluZywgbGFzdFN0YXRlLCBwLCBjO1xuICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBzdGF0ZSA9IElOSVRJQUxfU1RBVEU7XG4gICAgICAgICAgICAgIHN0YXJ0UnVuID0gbnVsbDtcbiAgICAgICAgICAgICAgbGFzdEFjY2VwdGluZyA9IG51bGw7XG4gICAgICAgICAgICAgIGxhc3RTdGF0ZSA9IG51bGw7XG4gICAgICAgICAgICAgIHAgPSAwO1xuXG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgIGlmICghKHAgPCBzdHIubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAyMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGMgPSBzdHJbcF07XG4gICAgICAgICAgICAgIGxhc3RTdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgICBzdGF0ZSA9IHNlbGYuc3RhdGVUYWJsZVtzdGF0ZV1bY107XG5cbiAgICAgICAgICAgICAgaWYgKCEoc3RhdGUgPT09IEZBSUxfU1RBVEUpKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE1O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCEoc3RhcnRSdW4gIT0gbnVsbCAmJiBsYXN0QWNjZXB0aW5nICE9IG51bGwgJiYgbGFzdEFjY2VwdGluZyA+PSBzdGFydFJ1bikpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTM7XG4gICAgICAgICAgICAgIHJldHVybiBbc3RhcnRSdW4sIGxhc3RBY2NlcHRpbmcsIHNlbGYudGFnc1tsYXN0U3RhdGVdXTtcblxuICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHN0YXRlIGFzIGlmIHdlIHN0YXJ0ZWQgb3ZlciBmcm9tIHRoZSBpbml0aWFsIHN0YXRlXG4gICAgICAgICAgICAgIHN0YXRlID0gc2VsZi5zdGF0ZVRhYmxlW0lOSVRJQUxfU1RBVEVdW2NdO1xuICAgICAgICAgICAgICBzdGFydFJ1biA9IG51bGw7XG5cbiAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgIC8vIHN0YXJ0IGEgcnVuIGlmIG5vdCBpbiB0aGUgZmFpbHVyZSBzdGF0ZVxuICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IEZBSUxfU1RBVEUgJiYgc3RhcnRSdW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0UnVuID0gcDtcbiAgICAgICAgICAgICAgfSAvLyBpZiBhY2NlcHRpbmcsIG1hcmsgdGhlIHBvdGVudGlhbCBtYXRjaCBlbmRcblxuXG4gICAgICAgICAgICAgIGlmIChzZWxmLmFjY2VwdGluZ1tzdGF0ZV0pIHtcbiAgICAgICAgICAgICAgICBsYXN0QWNjZXB0aW5nID0gcDtcbiAgICAgICAgICAgICAgfSAvLyByZXNldCB0aGUgc3RhdGUgdG8gdGhlIGluaXRpYWwgc3RhdGUgaWYgd2UgZ2V0IGludG8gdGhlIGZhaWx1cmUgc3RhdGVcblxuXG4gICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gRkFJTF9TVEFURSkge1xuICAgICAgICAgICAgICAgIHN0YXRlID0gSU5JVElBTF9TVEFURTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICBwKys7XG4gICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgaWYgKCEoc3RhcnRSdW4gIT0gbnVsbCAmJiBsYXN0QWNjZXB0aW5nICE9IG51bGwgJiYgbGFzdEFjY2VwdGluZyA+PSBzdGFydFJ1bikpIHtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjQ7XG4gICAgICAgICAgICAgIHJldHVybiBbc3RhcnRSdW4sIGxhc3RBY2NlcHRpbmcsIHNlbGYudGFnc1tzdGF0ZV1dO1xuXG4gICAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgX2NhbGxlZSk7XG4gICAgfSksIF9yZWY7XG4gIH1cbiAgLyoqXG4gICAqIEZvciBlYWNoIG1hdGNoIG92ZXIgdGhlIGlucHV0IHNlcXVlbmNlLCBhY3Rpb24gZnVuY3Rpb25zIG1hdGNoaW5nXG4gICAqIHRoZSB0YWcgZGVmaW5pdGlvbnMgaW4gdGhlIGlucHV0IHBhdHRlcm4gYXJlIGNhbGxlZCB3aXRoIHRoZSBzdGFydEluZGV4LFxuICAgKiBlbmRJbmRleCwgYW5kIHN1Yi1tYXRjaCBzZXF1ZW5jZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uYXBwbHkgPSBmdW5jdGlvbiBhcHBseShzdHIsIGFjdGlvbnMpIHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGUodGhpcy5tYXRjaChzdHIpKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBfc3RlcCR2YWx1ZSA9IF9zdGVwLnZhbHVlLFxuICAgICAgICAgIHN0YXJ0ID0gX3N0ZXAkdmFsdWVbMF0sXG4gICAgICAgICAgZW5kID0gX3N0ZXAkdmFsdWVbMV0sXG4gICAgICAgICAgdGFncyA9IF9zdGVwJHZhbHVlWzJdO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRlKHRhZ3MpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgICB2YXIgdGFnID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uc1t0YWddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgYWN0aW9uc1t0YWddKHN0YXJ0LCBlbmQsIHN0ci5zbGljZShzdGFydCwgZW5kICsgMSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTdGF0ZU1hY2hpbmU7XG59KCk7XG5cbnZhciBkZmEgPSBTdGF0ZU1hY2hpbmU7XG5cbi8vIENhdGVvcmllcyB1c2VkIGluIHRoZSBPcGVuVHlwZSBzcGVjOlxuLy8gaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290Zm50ZGV2L2RldmFub3Qvc2hhcGluZy5hc3B4XG52YXIgQ0FURUdPUklFUyA9IHtcbiAgWDogMSA8PCAwLFxuICBDOiAxIDw8IDEsXG4gIFY6IDEgPDwgMixcbiAgTjogMSA8PCAzLFxuICBIOiAxIDw8IDQsXG4gIFpXTko6IDEgPDwgNSxcbiAgWldKOiAxIDw8IDYsXG4gIE06IDEgPDwgNyxcbiAgU006IDEgPDwgOCxcbiAgVkQ6IDEgPDwgOSxcbiAgQTogMSA8PCAxMCxcbiAgUGxhY2Vob2xkZXI6IDEgPDwgMTEsXG4gIERvdHRlZF9DaXJjbGU6IDEgPDwgMTIsXG4gIFJTOiAxIDw8IDEzLFxuICAvLyBSZWdpc3RlciBTaGlmdGVyLCB1c2VkIGluIEtobWVyIE9UIHNwZWMuXG4gIENvZW5nOiAxIDw8IDE0LFxuICAvLyBLaG1lci1zdHlsZSBWaXJhbWEuXG4gIFJlcGhhOiAxIDw8IDE1LFxuICAvLyBBdG9taWNhbGx5LWVuY29kZWQgbG9naWNhbCBvciB2aXN1YWwgcmVwaGEuXG4gIFJhOiAxIDw8IDE2LFxuICBDTTogMSA8PCAxNyxcbiAgLy8gQ29uc29uYW50LU1lZGlhbC5cbiAgU3ltYm9sOiAxIDw8IDE4IC8vIEF2YWdyYWhhLCBldGMgdGhhdCB0YWtlIG1hcmtzIChTTSxBLFZEKS5cblxufTsgLy8gVmlzdWFsIHBvc2l0aW9ucyBpbiBhIHN5bGxhYmxlIGZyb20gbGVmdCB0byByaWdodC5cblxudmFyIFBPU0lUSU9OUyA9IHtcbiAgU3RhcnQ6IDEgPDwgMCxcbiAgUmFfVG9fQmVjb21lX1JlcGg6IDEgPDwgMSxcbiAgUHJlX006IDEgPDwgMixcbiAgUHJlX0M6IDEgPDwgMyxcbiAgQmFzZV9DOiAxIDw8IDQsXG4gIEFmdGVyX01haW46IDEgPDwgNSxcbiAgQWJvdmVfQzogMSA8PCA2LFxuICBCZWZvcmVfU3ViOiAxIDw8IDcsXG4gIEJlbG93X0M6IDEgPDwgOCxcbiAgQWZ0ZXJfU3ViOiAxIDw8IDksXG4gIEJlZm9yZV9Qb3N0OiAxIDw8IDEwLFxuICBQb3N0X0M6IDEgPDwgMTEsXG4gIEFmdGVyX1Bvc3Q6IDEgPDwgMTIsXG4gIEZpbmFsX0M6IDEgPDwgMTMsXG4gIFNNVkQ6IDEgPDwgMTQsXG4gIEVuZDogMSA8PCAxNVxufTtcbnZhciBDT05TT05BTlRfRkxBR1MgPSBDQVRFR09SSUVTLkMgfCBDQVRFR09SSUVTLlJhIHwgQ0FURUdPUklFUy5DTSB8IENBVEVHT1JJRVMuViB8IENBVEVHT1JJRVMuUGxhY2Vob2xkZXIgfCBDQVRFR09SSUVTLkRvdHRlZF9DaXJjbGU7XG52YXIgSk9JTkVSX0ZMQUdTID0gQ0FURUdPUklFUy5aV0ogfCBDQVRFR09SSUVTLlpXTko7XG52YXIgSEFMQU5UX09SX0NPRU5HX0ZMQUdTID0gQ0FURUdPUklFUy5IIHwgQ0FURUdPUklFUy5Db2VuZztcbnZhciBJTkRJQ19DT05GSUdTID0ge1xuICBEZWZhdWx0OiB7XG4gICAgaGFzT2xkU3BlYzogZmFsc2UsXG4gICAgdmlyYW1hOiAwLFxuICAgIGJhc2VQb3M6ICdMYXN0JyxcbiAgICByZXBoUG9zOiBQT1NJVElPTlMuQmVmb3JlX1Bvc3QsXG4gICAgcmVwaE1vZGU6ICdJbXBsaWNpdCcsXG4gICAgYmx3Zk1vZGU6ICdQcmVfQW5kX1Bvc3QnXG4gIH0sXG4gIERldmFuYWdhcmk6IHtcbiAgICBoYXNPbGRTcGVjOiB0cnVlLFxuICAgIHZpcmFtYTogMHgwOTRELFxuICAgIGJhc2VQb3M6ICdMYXN0JyxcbiAgICByZXBoUG9zOiBQT1NJVElPTlMuQmVmb3JlX1Bvc3QsXG4gICAgcmVwaE1vZGU6ICdJbXBsaWNpdCcsXG4gICAgYmx3Zk1vZGU6ICdQcmVfQW5kX1Bvc3QnXG4gIH0sXG4gIEJlbmdhbGk6IHtcbiAgICBoYXNPbGRTcGVjOiB0cnVlLFxuICAgIHZpcmFtYTogMHgwOUNELFxuICAgIGJhc2VQb3M6ICdMYXN0JyxcbiAgICByZXBoUG9zOiBQT1NJVElPTlMuQWZ0ZXJfU3ViLFxuICAgIHJlcGhNb2RlOiAnSW1wbGljaXQnLFxuICAgIGJsd2ZNb2RlOiAnUHJlX0FuZF9Qb3N0J1xuICB9LFxuICBHdXJtdWtoaToge1xuICAgIGhhc09sZFNwZWM6IHRydWUsXG4gICAgdmlyYW1hOiAweDBBNEQsXG4gICAgYmFzZVBvczogJ0xhc3QnLFxuICAgIHJlcGhQb3M6IFBPU0lUSU9OUy5CZWZvcmVfU3ViLFxuICAgIHJlcGhNb2RlOiAnSW1wbGljaXQnLFxuICAgIGJsd2ZNb2RlOiAnUHJlX0FuZF9Qb3N0J1xuICB9LFxuICBHdWphcmF0aToge1xuICAgIGhhc09sZFNwZWM6IHRydWUsXG4gICAgdmlyYW1hOiAweDBBQ0QsXG4gICAgYmFzZVBvczogJ0xhc3QnLFxuICAgIHJlcGhQb3M6IFBPU0lUSU9OUy5CZWZvcmVfUG9zdCxcbiAgICByZXBoTW9kZTogJ0ltcGxpY2l0JyxcbiAgICBibHdmTW9kZTogJ1ByZV9BbmRfUG9zdCdcbiAgfSxcbiAgT3JpeWE6IHtcbiAgICBoYXNPbGRTcGVjOiB0cnVlLFxuICAgIHZpcmFtYTogMHgwQjRELFxuICAgIGJhc2VQb3M6ICdMYXN0JyxcbiAgICByZXBoUG9zOiBQT1NJVElPTlMuQWZ0ZXJfTWFpbixcbiAgICByZXBoTW9kZTogJ0ltcGxpY2l0JyxcbiAgICBibHdmTW9kZTogJ1ByZV9BbmRfUG9zdCdcbiAgfSxcbiAgVGFtaWw6IHtcbiAgICBoYXNPbGRTcGVjOiB0cnVlLFxuICAgIHZpcmFtYTogMHgwQkNELFxuICAgIGJhc2VQb3M6ICdMYXN0JyxcbiAgICByZXBoUG9zOiBQT1NJVElPTlMuQWZ0ZXJfUG9zdCxcbiAgICByZXBoTW9kZTogJ0ltcGxpY2l0JyxcbiAgICBibHdmTW9kZTogJ1ByZV9BbmRfUG9zdCdcbiAgfSxcbiAgVGVsdWd1OiB7XG4gICAgaGFzT2xkU3BlYzogdHJ1ZSxcbiAgICB2aXJhbWE6IDB4MEM0RCxcbiAgICBiYXNlUG9zOiAnTGFzdCcsXG4gICAgcmVwaFBvczogUE9TSVRJT05TLkFmdGVyX1Bvc3QsXG4gICAgcmVwaE1vZGU6ICdFeHBsaWNpdCcsXG4gICAgYmx3Zk1vZGU6ICdQb3N0X09ubHknXG4gIH0sXG4gIEthbm5hZGE6IHtcbiAgICBoYXNPbGRTcGVjOiB0cnVlLFxuICAgIHZpcmFtYTogMHgwQ0NELFxuICAgIGJhc2VQb3M6ICdMYXN0JyxcbiAgICByZXBoUG9zOiBQT1NJVElPTlMuQWZ0ZXJfUG9zdCxcbiAgICByZXBoTW9kZTogJ0ltcGxpY2l0JyxcbiAgICBibHdmTW9kZTogJ1Bvc3RfT25seSdcbiAgfSxcbiAgTWFsYXlhbGFtOiB7XG4gICAgaGFzT2xkU3BlYzogdHJ1ZSxcbiAgICB2aXJhbWE6IDB4MEQ0RCxcbiAgICBiYXNlUG9zOiAnTGFzdCcsXG4gICAgcmVwaFBvczogUE9TSVRJT05TLkFmdGVyX01haW4sXG4gICAgcmVwaE1vZGU6ICdMb2dfUmVwaGEnLFxuICAgIGJsd2ZNb2RlOiAnUHJlX0FuZF9Qb3N0J1xuICB9LFxuICAvLyBIYW5kbGVkIGJ5IFVuaXZlcnNhbFNoYXBlclxuICAvLyBTaW5oYWxhOiB7XG4gIC8vICAgaGFzT2xkU3BlYzogZmFsc2UsXG4gIC8vICAgdmlyYW1hOiAweDBEQ0EsXG4gIC8vICAgYmFzZVBvczogJ0xhc3RfU2luaGFsYScsXG4gIC8vICAgcmVwaFBvczogUE9TSVRJT05TLkFmdGVyX01haW4sXG4gIC8vICAgcmVwaE1vZGU6ICdFeHBsaWNpdCcsXG4gIC8vICAgYmx3Zk1vZGU6ICdQcmVfQW5kX1Bvc3QnXG4gIC8vIH0sXG4gIEtobWVyOiB7XG4gICAgaGFzT2xkU3BlYzogZmFsc2UsXG4gICAgdmlyYW1hOiAweDE3RDIsXG4gICAgYmFzZVBvczogJ0ZpcnN0JyxcbiAgICByZXBoUG9zOiBQT1NJVElPTlMuUmFfVG9fQmVjb21lX1JlcGgsXG4gICAgcmVwaE1vZGU6ICdWaXNfUmVwaGEnLFxuICAgIGJsd2ZNb2RlOiAnUHJlX0FuZF9Qb3N0J1xuICB9XG59OyAvLyBBZGRpdGlvbmFsIGRlY29tcG9zaXRpb25zIHRoYXQgYXJlbid0IGluIFVuaWNvZGVcblxudmFyIElORElDX0RFQ09NUE9TSVRJT05TID0ge1xuICAvLyBLaG1lclxuICAweDE3QkU6IFsweDE3QzEsIDB4MTdCRV0sXG4gIDB4MTdCRjogWzB4MTdDMSwgMHgxN0JGXSxcbiAgMHgxN0MwOiBbMHgxN0MxLCAweDE3QzBdLFxuICAweDE3QzQ6IFsweDE3QzEsIDB4MTdDNF0sXG4gIDB4MTdDNTogWzB4MTdDMSwgMHgxN0M1XVxufTtcblxudmFyIGJhc2U2NERlZmxhdGVkSW5kaWNNYWNoaW5lID0gXCJlSnpsWGR1TzVEaU8vWmQ2OW9QdXR1Yzc5cTNSR0dUMzVEWVdrMU8xNktyWlJXT3gvejZrNUlza1VqYmxjR1JXVFVPaGpDb0hLVkVVSlpMSENzZi9mZnI2N2VYYjYzKzgvUEwyK3VrdlAvMmtCa0g1ZVFBNk05akJEWDRJd3poTXd3elhOYngwZkpsQjIwRzdRZnRCaDBHUGtRR0xuZ1k5RHdhNDlXRE1ZQ3hjTXk1K1pQeGdRdnJYdUhRUi96TU5aaDZzR3F3ZUxQU0pIRFp4V0QvWXhHRnpEanVCVkdNdTFkSzNUVzlob2JYejhvR0RsNGIzZ3RxWllTWFpXb2FyTUdhSHI5VDIwckRCNjdsdURvZ1ZSK3Y4NE1MZ3hzRk5nNXNaUWVxbTFlQ1hONTNUS3BZMFl6Sk5RbThIRDlQcEJ4OEdQdzUrd210SjdBQXZuZjVsY3FGbGFnNTJDTzVFejhIS3pRcEp0c1lYbXdxK3k2YWd3ekNFRVYrVjhHRWlpZ2xJTU1ZWC9FSDV4N1lXUjR2MlBUcDhWYklvSXNyb2x3OUdHT3lJbnhUa0k4cVNhRExKeDNtWUZMN1c1dFU2MG5FbTRtekxqWXJUVU0ya2g4a01reDBtTUZ2UFNVVHRhMHJ0VEdOT2UyYUswOVFrVEZJTGxUakJjam5WNGxTdjQxa1BzOEVYYVgrbXEzTjJ1QVhObnRtQ0ZObUI1ckEyTkE0ejlsMlN6eWhKb3NuRTBRcXJqblh0WVduZXh3K3BMdHNzaXVYUUNwYU5Bdk5Vc0MwcmJEVndvdEVwMDJwYzNxZWMrbXgrdFpxYmxHbFBGeXBVeC9XdnozU3FOZEVRN2hmb2g2Q1NYclIyUkN3bDI5QVNPMmdRWFpzZW9VNGxpd2JyMVVaUnJuakI2Rmk1YlhBWEp6b2ViVXo4YTJPZGp2MlRCZ3NPWkhMeUNVa21YcnErSkkxbnBTSE9EOGxEckdUdEVrMzJ1ak1rSHFYRUdsWS8xb1g4U0E0TnRpWW0xMkNWMnVLTWcxWXNlaHNya2llVDdFaVd6V2tMS0RQQ2d5V25ZWHRBcngwWXIwMmR0clpoYXhNMFlpTnh3YUdUM1ZteVB6bXNPdGExbTZXUDlDR2orQ1lMejZGQnQ5cGgxQWo3RThSREdpeUlFNDZ4QnJkc1VLNGdQOVdyYTFNdXdaQlFyUjZybGlqV0V5MUJSS2FoTjZ5a0krM3BIcVg5c3ZGNHJOVmVwZjNVdmZHVWc0ZHdJNFZmR3FUUU1MblFZQnl2RG5FdlNrRllETmRHVC92QU9ZK2IwUG1xMFJDemNkRXhYcytwczMzdG9QVjhjMXVMTkdiTE9EUmpKNVVXUTFqZVIybXJpYndkN3FpT2FHZVJrNDhCRlJzQ1F2eXFRUThhQnFkSEV2Qm9qRmhIeC9XQ0gvcFkyWmlxTUJxa0RmSHZHQ3NaU0IzTWFyZ3djNXJhKzU3S0RuYUJabDRnRWlwakpKbXFJZk5FNXFBLzZyWHhKYVRXRUZoalhlbVBSTkVnaTV4ZWd4UWE1TlpBcWlFVTF4Q0hpMFRheTBuUVBnVXBaVDdlby9oK01ja1pLMG5hTklUbDNTYkp5d00ycVdOQUwxQ0loakNmWDFYNFNVNmYyZTVSQjdrRkw5b1RCNzFMeDcweFByU3VaeFFKVmlFRXlsVTNlc1pjVUhFOWdXelFCMVkydU42N2lhbUxVU2IrdGJHU3dkUTVqc0dVUTdONzY5YTVLM3ZZSmZLOFJDU0ZRdm9RcXoxZjdCY1RJYmRVSVlPQnpBbnJ4bkFra29IMHFvUEJRSHBsTkdJZW9DVHd5UWFUSElsUWV6bEo1ZGE4VDBDYURWbTNLWTFPMW1rMDFyRzJHNk9uZnV2azVRSHpOM29teEt4R2pHbXZNV1BLOW5ORFB1b2pOK2ZVam81Qm04R2RCV3FkWU5ZaG05bTJINGYvNFVPZWhhZ1lDaGRTWVRacVRCbFVwZXQ3Q2t1RWFxYXdLNWQ4S0NFTDM5cGpvY3Q1MFNkalpHd09Ld1J3RlJ0ME1zWnFJcFNFU0lXWnk2YU5aVVZacy9VdVliQ2NKOVBZcDQ2VjVpd01NWkkzOXNCeUY3eVE2aVo2TGFZM1FJZDFwVCtTeDhBcWt0TWJpNkVSV0tMRmVBZm15Y3JBZzRPU0kwSGk5Qy9LZ3JZTmlhNkJQbzBqcVp3Qmd6UE9VNzcwWVlpVlR4bDN1VkpXYmx4Q1dhZFlhY3BJRW5nREpyTm1wM3d4YnE0NjJjU0srYW9NSWtCRVdjZnFSNzZqQWh5NGx1aTdwVW81REtUWFdEZU9RL09ESEx5RHdZQ0pHTWpHalVkRmdRMEN2VXlxdlp5QUZTdXlJU0ROeDN3QXZJYkZUZ05XUSt3VUV2dHVPMjJJanFzeWJ2d1NuWmpnbTJDUnFRQ0IzS0NQZThrTk83YlU2WVpYTHRhcitvbjNxaGsrUTcxcUM1OVp1Zm9rZzBWa1FvaDFoV25XRkFxYUNXTWgzSmFrUjY1cHFYUEpweFkySnBVMjQvcSt3MEVpYzJ4Z0pHWUVPY2F6RzROSWxiZnQwdWphaURoamlYaGJjT1FoN2lQQlQ3Q2RGUWdTa09iS0NFMUtFNkVUZko5U3JTRVVraE9iRGU2QlpzMFVQNk5wNkVLVld6VGlDa3ltaTFnUWZsWkxsa05JakdSTkNHbmw2eGpSWkxMTXVqMmt5VFNVZklDVlZDQlNBOVZpTEo4SEJaZ0puR0p6RTdpRnFXN2RaQmdLQTVyMUNSUWJQRTl5c2RjeDFza0xpSkc4RVlwVzZOUUZyQ2t4ZURtRG1lWllONFlqa2N6Y3hXQVFjOEo3dnpQWWU3eTVLd1R4RHNvRHkzZ2RjR05Sb3FEY29zeEFORzVSdGtDMGxhOVBQZ0c0eTB3NjJLNUpnTkVadVltSUZTejVlWXFWWUVvRUdUQmJOZytzTm43S1plSnp2Zm5aSmRlbitUN0NZMVl4bXM1UU5VYTJKcXEyOHNuSFpQRWUvWTR2TkVkbFZXdi9PMENOS2x5dGdmUXh1Rm9MSGFHMmIxVnNVRG1vTlc1blZiMERGbEJpbjBpeFFja09hTlVZcTFiRThUTFVTQy9aQWk4QmI0bEJ5eG1zbW1QZEdJNUVzcnFMd1lJZ0ZxUzNTS3BodnJUdmhRL2JqZmN2NW5YQXJhV0oyQ0MzTkF0SWtmYlVoQlEzdmk0SjU1aDZINkxlekxUallEQndsNURmbFowb05qZXhDTHFpSmpYWWlWRmxEOWFnMGszWlI4SVliZng3RkhYbldPUU9YdXJZcEF5OXRNWW4yUXdDK0dNdDIwUmx3eEpUUDlHTjdiTHNtcUpnWHRMZWl2NlJobzhZdWlVUndubGNjWFJYdEhoUU5oNWhZUmMvM2V4c3Mva0NsZXZIMkJMOUtLYTNlRThzUXB6bkozcHNYSGxTZWd1NmNJc3BXc25KQkl1d29rUHFFQ3VCMkFoQVl1MmFhU01jWVp1blB4YTZZaWh6QS9aQXhOQXlVRWtPTkRMU05ZSEdsYTlqVktpMURHWTVHSmZqakV1dDFQemNWRUJqRS8va2dNWVdVc1RNZm9RVkxDb3JucnJPZTdET0RaeE1LOExhSzFVYzhEbjBpUjM3V0xVVHhpUXR1Z3E5dkFKRkpvN1F3V0ZCUFZnM2ppT2hySnQ2R0N6c2g5YmpvVmV3VkErVGhxZWlPaUhWZzlhN1YvYksxMXlsd2ZLck5JTlp1VlhhZ2xsWHZqNEp0UlhjRW1DbUhzektlaWxDcTdLem53ZnB0UVVybkZmNmc2T2xucUlhMW9kWUVaUThTZUF0RE5LQzFCYUV0Z0ZQVCtqaW1GcWtDV2NBM3htR3VTS2VFdHBzR0lISXZzc2RYQXp4Yk1CdnJvVHFjQjErUHJiUDc5a3d4YXJJVUdsSGJwK0FzNVBHZ3BJSHFEY2lHNHJGTlN4TXZ4MHg4b1oxUU0rcjJSR1dIQStFMmdWU093SXBjakIwaDA4UnFMQmpBNmlvOFZNTGpTY0JZVDdHbVFnNEtTb2dsbm50U1g1OGFkRlNsZ2NSR0RGZFhZRkgydlFSUjc4d1FpQ1JLd3hrYTJINmJUem5KbkdiU0MrNXEzMEoyVXNNVnM1Z1FZTllONFlqa1N4TVRRZURCVFhqd1RLMHlra0VuNTNEeUxWSTkrYm5pczNPTGN5cm5hRDlDWmIwck1qWDkyWm9aalpsVHdtd3MrbE0zV0dxblVON094Z1kwKzE0WGsrQUJsbzhqWWNDZ2pMc1RFNGtXZFJOTFdCVVhzVG8rczRrTFQxbTMrd2hnRmk2dWtKb3RPa2pqbjVocEpBWVY3U3F6eDZodHVaWWpaWmxuMDQxMnk5d3JRc2dWV0t3Y2dZSG1uTVJxUEhuVUp0VHBvZkJnYTRRT1k0Y0RjTXNPUmFjU1hRZU0vV1FzQk1ITTRxMVFtZ0ljdUsyazMxNDR6VWlualJDV0lpS2NjOE0xSVM0a1ZOVXFCeHNJa0t4WUZQT0pSNktWdm0zUzF0anliNGJWc0pUcmZpSUFsb3JDQ2JqdVRJdHgxcWVlQzFuc0JtajVRWnN0bkwxU2Jab1RRZ3VjVVZiU3VsZ0w4VnE5clRqc0YybkpVRkFGK1NEamE2RE9qMmpkbXNDcWRqMDBjRmU1MkJqY1RBQkRoWkUxWS9EbWROejJWTUNsNXhKWWh5bWdqa090V05YbUE2NmFOa1M3TXFCaVVRUndlWWRSQnExaUloSzF5TEcxcndlMnVES2tTMWxXcVBJVGJxNllqMjA2U09PZm1Ha3dBMVh0S09lMCtIaU5RbUVrYlRyVENOZUxxM3VFcENTT0hRSGg4T3RDWGVhbGVOSUtHZm1IZ1puRTd3UmpkTzJqTFBrV2VFUTJhbksxSXVKYWJsRHJOZzZrcFk3L0JKMjgydDE2MWVNd3ZuK2RSV3ppRHlSVDg3amJJaDE1em1jRjFCYUQ0ZXpNSWNXUFJVZXFJWWRITCs5ZVNLWmMvdUpMNzQ0Wm5FY2xGMGFsM0FWaDgvUmdGcFBvT2p1V1Q1a0JHTFlPMmdaZ01OMTFBUndWc1p1Q1Rjek81c1FSUE5HZkI5akpmQUh3U1NjVzljZUhncU1kNktZdkhHaHlrM0Y4MGVpRUpseG5rcVdBenFNWkN5Z2svTjFqQWoyclZrd3BIUlhnOEdBbXRremhZMVdzRW5JZEcyS1RoUStLVjdoR1VERktid0ZVSzE4dmZJdCtoT0NPRnpCSTJVMXBRTzNoUlh4RWttN3pqZmkwb0t5RDFiQlZqZE01Q1RMOHdsS2NEN0VTci9oVndNSmJydFpCUG1lODQzSFdpeFVoVWh6NjFraHM0NmZFb1BJY0JoR05oYUh5Zms2eGhSVWZvQ3BQYXF3UzFoaU44MlVsOEk5SzBna1pMbzJTK2M2bjNpZFo5QVNxL01HdExUeTlVcTRhRkNJdlhERmtBZW80RHpwV0JIbWtMVHI2RDBKaHJJUERjRlcxMUVKamtIZGsyOHJOdHQyNE1VZHV2NEFQZFFQajNJQnVsNkN3QXBxY2ZGTzB0RUJtaHh0MmVFWlRHSGR5S01OTlQ3alJwTmtRemM4dWtxMjBWUFppc2tYWnQrczRiQTN3eDA5Nms3MUNSNG5acEhvcVVZbVlTVTVwTnY5TlVhczhZQTRGK0E3Y3VqZFRicVJoTWQ4bXJrVFZhVGhWRG8yRFMvNDVLUENML3huWnkwT3hwWGRSaWx6OTNheVEvUDlGU2FRY2wyYnExTzlZL0RONlQzSEZoaTl0N0NGamE5VHdrV0h3dVNiWFFITTdXdzMyVmh0S3k2cDE4dlV6SXd5eXQ1a0dOdGR0KzZ6WFB2dUpBclRaaTZKS3RKdHBxTm11cjB4OWlkUkRnSStySlpQbzVqWmtFQXN2Um53eHVmVzJzR0RRUUhXamVkUU1nejFPampjakJXL1h3eHJDT0lxTnp1UlpDNUc1dzZEbkhqWG9wckplV0tsdTlYTUZHdGs2dFpVaTArMEhFUXJYdUZUdldCclUrU29nbGNXS3B0MWUzVitWQ0hQdlBkY0hiTVhyeHJaUzUyc2U0Z1Jrb0N3R3lweVZNRnJSUVhNaXpUMzRvcVp1ZThvK1BaalFQS3B1elZFVjJ5QTdyV0JDak1FM3RyalhieXlIdy9XNS9WWTlwU1NNYTlqZG45NGN6cFAyL1pFRDZOZTMzcG9SSjNwZWFPU2dCQUVlcGk1V2tCanFZQjVrY2JzWExHYW5UeDZRb1NxRlZjcGhLSGVoRmpyWUxjT1F2MkdaVHY4RDMvL2JpSEt4UEdHaTlveEJQZm1PRzRuUXJGeGU4NGxIb3JONzBVMng1TGRBeXNqL2RaOVJab2JyUG1Fak9mS3RCeHFHYmNnVHN0WkJrSzEzTXBBVnE0K3lWcUZIRVcrTjJSVmJNRHFJUmp6c0R3OXJFOXZ5YzB3anc5cFhJNDdWNG1NbHh6ZHpIT1pQZi9CS05BM3oyVFgrWStIcTFGRXRNeHNXS3VJemxBUjh5S05ZcmxpeVZNUFU1Y1N2RzVwUVJpMThiM1hBRGIyN1dKMXJnRlhFRmtiVzJscE5oZmlwOFJubGlybjhUajdtQWRzUEVlU2VRaUJlamc4R2lPZXhjYjlOTTZlUks1MGI2Zm5tT3BlaXJ5QmpScjNTSk5yL1lpblJ5S1B6eS9CaU1tYldFbG9SdUlsdjYyTUVSUWM0V0ltTWx1bzhqbUJuSkVMTldQVTZKbXNLUTgycVdSc3NGbndkWXdvWkxkUkRvYTB3ejVsZk5xOEkwSkQyalVRRmpKZG02SVRoV3ZGS3J3SW5obUZ0NExuamE5VHZsWVpTM1RONDlhTllTRituY0l6aHpkSlVPZzMzd0FwbW8vSU94TitMbFM1d2tMcnVHY01qZ1BqQ1BPWW1zckd4dFFGbjN4TW9maW1kSHRVWVE5a3l6aThlYytBaHU1cndDOWt1alpMcHpySGVKL1RlWjRtTURwdnBRa2JYNmVFclRLVCsxUTNoWnVLRFRZOS9xd0VXaUUrcDh1WEhYajhkWWVwN0NHbEVENmtyMm0yZ2ZnODFkaHpFd3l6ZlpBbEp4NEdoNUpCak81SFhVa0d3VzR0V2JwdVUzZzJ1cVZXVVIwSnp2eitPQk9MSjhSYU1LNG56dy94aURxdzBXME1WTWZ5c1VIcGVoYmZVdW5ZK0xiZzZ4alZWQURoUitQS1hFa1JGTGNoYlJwSWU4RlpJUkpLZDgvVnFkNHgrbWIxbmdYdGpONWJRZnZHMXlsaHEyanl4ZFhGL0lYaE0xY2M4ekJFRDVyRzZ1WUd6bENINVZPei9TTDQ3UTFrMC9WVzBNaHorQzB2RklUak4wWXZqZGdGbjZNRVpqYmhDVHZ5V0hFLytmVm5UcW93MWsvbnozbkpROWs5K0kyNFpQb0ZtUFBvMTA5VEVnL21lMVpFUFB4eGxrcThoZTlXajZwNGY0b1B6c0Y0QkVUd1lJaTFQOFdIdW1oWDlwUmlKNzg4ME9RSUY4eWpyRDB1aTdoZ2RLQ0N3TXhEcXBNRUJEK2pWTjFSd0xIV0FxWVB6Tm5QSGxYK21IOUVQM3JYK2lIOTZmcm1rZXNPT0llY3NZaEVLcDF4Qy9laTdudDErVEtlV3hVMW1vYWl0Z0NCS0tvVkh5U1dEcEh1OVZDSzlVOEJuNklOZTFpQUxTc29UMzgyTEd3L1lWSEZMVUVKY0s4OGRObkRIWFRVUWJWd3J6cmNDV3BPSXVMM1JEVEJ2UUwrbWtVdFlsNmtyb2dyaUFkUnl0QTZvcE5MRGV2MzlCZXFxcjJ4OWZoNjNPenJCOWluNjV1TG9KMXdIaUpqRWdwV2VvZG1nazhkeXVxR2hFeTNxd3dhNGxXMnVTMUdaUTJ2dFRCMUNCYmlJN1lGdjExVmVicjJrOHpSYWRYUE1rL1hkMS9IOU1UNnVweFBMbUhwNjVwcE5IV1BxMU1WTWoxSGYraFRlZjN0cnBqcHFlbUtWNzVlQ1h0Y1FJZ1BvUlg4dWxDMTc3VWZ4WXY3ZWYwdzNuUjlkd05NVDZ3YnlQbmtFcFplb0oyeVVjK3hPaHdwMTVNMEdKL0x5Mmx3OTFLY0JsdGVhdVhybGJCVmZQWEFaTUh2Sk5aYjZnV3Jsby9nNStIVHk2Ky92djczdC8vNi9OdW52L3owbnk5dlgxK0hiNy8vay8rVFBqNGhFdnk1ME1KRG5XYk1kVHZ5SVQwMmVMNWZ5U0J2RWY2U0REZDM5M0Nmajg3ZHUrbnd6bVZ4djI0NkZmYUJvblIrVElWNFZKVDNIUEZCWDFkdDV6MVY5YVMrTGx2c1lhOXlYVDlWY1VkeVhmci9uWXI1UU0yZnEvZDlKSHBrZ3J0SDk5N3E2TzcwcXVrL1kxMi9nd0tlWTNMWFJYbkN4emZhNkpWT0hyTU9pU0ZBZXZQdDViZXZrTm44Qk9uUnAxOSsvL0wzMTg5Ly9mWHRuMSsvdmY3K0NTLzkrdVh6MXkrZlh6NS8rK3ZYUDk3ZVhuNTVlNDJYLytmTC83NitsWmNZWm5vcHZXUzAzS1d2MzE0Ky8rM2w3Y3ZuMXd2TTh1RnhQZi94ajErK3ZFbVkrY3ZkREI5eG1abFdla2xNK094TGwyZWR0VXZ4MVNlWXRkelMrY3RMLzEwOFQ3MThlZlVOajh3WHMwZ2JTMWU4bXU5YVdqZjI4SU5zSmwzYnpDUDd3SU10ZmtjNzJvT2U5V04zditkc2xrL2NwSzU4OHFQc3Y5M2plc1NnSHQ0dDJFMy91bk9RbXBiSUxYd3ZjZC90RHVRai9jNnpQZExUNDloYmZNNTd1YWk3SGRlOXp1ZG05M2FuUDdwcmMvMVl0L1NSM3V3ZEhCcHZLM2Q3bWUrZDdoSEU0dG03OGQxdTYzMDgxMGNBSC8wTzVEays1T2taeDRmN2dRL2JzbTdmMjk5bmV4ZnVRMC9ZMnZwYWZZNEE3OVRrOTdaRnYrUE9mZjhXK1QzdXkrK3lrVjdmRm40SXBPTHlkdmpoUy82SGFmWHhiZXo1TzlEaEdydDM2ZmNzMFp2WDh2MUIwWWNsYXZUMVl5eUdkMXBmSDdhV251LzcvMDBjK3p1czlqK3B3LzUzY2sxL2R2ejFnLzNMZDdXSGZvL0c4MGdQMzh0czM3Z0hkZHhCNHRyNCtmLy9CVm9UWWRvPVwiO1xuXG52YXIgYmFzZTY0RGVmbGF0ZWRVc2VEYXRhID0gXCJlSnpObVZ0djJ6WVV4NytMbnZuQSs2VnZhNGEwSzVCc1dMY1dtQkVFc3FNRzNtdzVrSlVPUTlIdnZzT0xMVXAyb3dzVndHQkNtajhkL25sMERra3p5TGRzbGRmRjQ2NWFGL3ZzelNMN05VUFpMN2MvUS8wUmZ0KzloY3IrWHQ5QWRmWHVBOVNmYm41YWZuWHRiL3ZhdHFIcmUxYzNiemYvdW01VjJNYjMzanQ3Ly9rcWpEOTA3VHkvMi9uK3RCTUYwUnMvL05xYlhudDQ3VWVVejV1TnRRODZIdzh6aGpGL2ZiNzk0QnBidThyNi9zbE9jMnRkc1pVYmVvZXloMksxMno3dDl1dDZ2U3ZoL2I5bFZHQUZjWUNHSWNvTkJ5UDRySTlJRUdPUjFnNXByUkExbURwa3lCRnBwVDJpa1JVRHhEQ3hBNkhoaUdFc1BUSWVpUVpSM0ZneFloSGgzQ0xDS1dKRVdIbEdwVU5VTXNTb0ZnNHA0cERDRWFJUmtoN3hCc21BUkl5T296bDJvNW5SQ0Nyc0VmUElSSWdmclRoeEF3V1hGZ2tPYnlVWTlraEhLRmlaR0RXbUFqZGN1QUJJNWp5VWtpRDRiQlBEbEhTZUtBMmVLR216d0l4d1ZrWkFUSXpnSHFrSVNZK3NKeHlTQVVocWoweURuR25nRW50dUlrUWExREkxelVRT1NlUHlBUTFHMGtqaEVmT0lSa2g2eENPa1BCSVJNaDdwQmhuR0hUTk1BVFJVQlNvQzFVZXFNSGNwdGkxQlVMdDQyWjZNcWZhMm1qTkhOYmRVY3hvb2p5azdVTm15dFo0cGdvME5zVzBsZ3RyclFzOEVxZ0w5anJKOURVZlFIL2x5VThDekJVYXpsVHUwb0FqMkMrSlFCQkJ3Qldsa0VNR0lFRVFvSWd6QkhvT2RSeVE4SmdwQit1MFRneWhHbENCS2d4Wmx2dkUxdHhXODV5ek9Vbm4wZHFLQVBYSGEvVk5CYXFCaThBUGJCMElDU3hUT0Z0aGRzTlVWWW5iUkkrNHRJWTN3QU00WkRvR0R5SW1nd09WUmpCbFAxRXdoYVBMVjlBNzVpaTBJNzc1Nk8wdjlpcmlqZUJMTHNZS0hKZVhjb3dOOERDdXAvN1hONE5jZUtIbG01V08vOEhIZnVvK21GaStFd0V2UEhvTjBUYUs3RDhlWDNyV1V2anA3enFkWFRSUEFNVEVkZUtUTzR6TFhMWEhiSFN6T3pjaUFrTU01TnlnaVozVDd5b1JEcTFlUy9QamhOTG1ScXphMlNOejkwNHR3RlhueGxFNUk5Vnh1cHFwMXYrL1R2WnRacnU5bG83dEliTVM2WG5RdUlBTkVUelM3WmJ4a2ZHZHlFOGdCcmtaM3BkNEFzR2FkelNkNzlvNkhSMXp4QWxCOUFmSDZyeEtSZEYzKzhtSVlWQVlzc2hrVzdsdzM4NlMwTVRFeXZtZWtCVzA1RDkzaHpnczJ4WHMreXYxejRuMWx5am5VcTluOWtrelhHNy9lWXFPNXo1NmtMUDM0Rzd4ekZaejFENWlVYStaWjhiUnljcE5KRXVQOUtldnMzZm0vTGxJT2g3TXpKTVRqR09FN2xPV3JWZkZVcjh2SDdNM2lTNzdaRjZpdW5pZFg2UXFYVmtHSTZ2elIvb05nQWVIUGx0WHVuNks4WDIyZTkzVlJaUmF0eTRmaXFZQ3FyRnQ4Lzk5MnVkdTBVWjJYRDNuMTBJSm5KQzhCWFlvZjAxSDV2QzJxZk5Obk5pWi9BMU42Z2ZEcnVzcTMrVDEwdCtzeXI0dEw4dTAxNFBRbEFteFpWUGQvNzlZbE5Na0JPNW5pN3Z2L0xieUpMZz09XCI7XG5cbnZhciBiYXNlNjREZWZsYXRlZFRyaWUkMiA9IFwiZUp3QmR3K0k4QUFSQUFBQUFBQUFBQURZWUFGbUQ1bnc3WjE3akZ4VkhjZnY3czdPek83TTduUUxSQWhpVVNERVVHMUFJcllVRnBCZ0NvbFlUYVJWVVVRSmlFRlFnNUEyQ0FocUxTQVBRVXdzL0NIbEw0cit3VU5qd2JRU0VTd1FVQ0ZnRkxDb05RU3NVUUtpSUg3UDNIUG1uamx6M285N1oyVit5U2YzY2M0OTUzZCt2L08rZDJlWDFMTHNZTEFNSEFGT0JxZUFUNERQZ25lRDkwWTRuZzdPQmw4QzZ4eWVXdzh1QXh2QU5lQzc0R2F3R1d3QmQ0SjdOTTlmQUM0R1B3ZS9BdmVEUjhBVDRHbXdCUHdGL0EyOERPYkJmMEY5TWcrYnhYRlA4Rlp3SUZnS0RnTXJ3SEhnUlBBaHNBYWNCczRDWHdCZkFWOEYzd0JYZ3V2QkpyQVpiQUYzZ3EzZ1B2QWdlQXc4QmY0SWRvSGQ0Qlh3QnBpc1o5a00yQXZzQnc0RVM4SGhZQ1U0RnF5cTU3cXZ4bkVOT0kxZW40WGplZUJDY0JHNEhGd0J2a1BEdjQvakxlQTJjQWZZV3MvTGZSODkydklnamY4WWpyOEVUOUhyeCtueE92QU16aC9pbnRubG1JY056M0JwN3NiNUsrQU4wR2hrV1FlOEJTd0JCNE5sNEloR2YzeHluS2YzSGdZZndQbko0QlR3cVVadXJ6TnhQSmZHdVlEZXV4akhiNEtyRzNsOW1xZmNpT3ROWURPNERkd0J0dEpuN3FQSEhUaitocWIzVklQYUNzYy9OL1JsZmRFUXp0djRKY1RkUWUvZERWN0RkYTJaWmUxbUVYY1BuTzlMcjA4Q0J6UUgwenRFY2krVXc1cDUyM041WmtVQ1BWSnpOSFErWHFMMzgrQmFTZndUYVZ6V0ZsZmplaTM0TklXUGV5U3RiNS9qN3EvUTZFTHE5aGU1dU4rbXh3MUN2QXViZWYvTDY3cU9QdmUxcGx4dmhpNXN4SWdSZmp3OEJEcU1HREZpeElnUkkwYU1XSGdjT1FRNmlEeEgxN3JmY2xqZnIxVGNYNjU1NWxxa2Z6M1lCRGFETGVCT2NBL1lEaDRBajRJbndiTmdWelBmVzlxTjR6L0JmOERFVkphMXdCellCN3g5S3QvUGVTZU9oNExsNEZod0JpM0xaaTcvVmJpL2VxcDZlNDhZTVdMRW13bXliN2tXZmUvN2FzVStmVlZVYllzUkkwYkU0UVJ1emtyZWM4NkQwOURQbkFYT0UrWjZGenJPL1U2aXgzbWF4MUhna3FuaWZlb0duRjh0cEhuRFZQRmVoNGU4bDdrSlliY093Znp6dFVVNUsrZGdJL0NUUldZMklONERpcmd2NFA3K2k3TnNEYmdHUExxNFAvejNDRy91a1dWN2d6WGdrdWtzMndheVZwWWRBeTRoUjNLUEhuZlNJODg3MmxuMnZiR2MwM0grZy9aZ25KMjROejVUWEIrSDgwdkJkakEyaTNVQnVIUzJTQ2NXMjJtYXIrSzR2Sk9mSDkvcGo3T3VrK3YwMDg2ZzNpTkdqQmd4b2h6K1hYRWZISHY4Y1dIRm91cnpuNis5dWJrYzNJNTU0RjFUZyt0UjhwM1B2YmkvalpzbjNvL3pSNmJ5K2VnT1NYcnMrN3NuNlBxYW5EODlsWDlUUjlMYlNkTjZYcExmRXBybVB4RDJNdmM4MnpkOWZjcHYvVXkrbVNMZlRCd2wwWGNTYmFBSkZrMFhjK085cC9Pdy9YRThHQ3liN3MvdmlPbGlIajZQOHhQQUI2ZUwvRmk4ajlKN241ek92L3M2QThmUGd5OVBEK3EvZnJxNFhrYlR2b3crdjNIYTdNZDVxcnZNUHNSK0QwbkNpRjJ1UTlvM2dwdkJMZUEyOENQd1kzQXYrQVY0Q1B3Vy9BN3NCTHZBYnZBS2VBUFVXa1dhYlp6dkNmWUZCNEJEd0tGZ09UaTJOYWpEdmRCaEZlNnZwbUZyY1R3Vm5DR0p5K0tmZzdEelc4WDFSVGovT3JnSy9BelhOK0I0RXcyL0ZjZmJGV2tSU1B5N1dvTTJJNXdxcVcvZFBCRi9PM2dRUEFZZUIzOW81WHYvZjhMeGhWYisvTzY2MldjdkllNnJZQXpyaFRwb2dibDJFYjRQenZjREI0RjNnZmUwaTdLWk9MS3REaVA2dmI5ZC9ucFBySWQ4MkVrYWZZNjJLSzhQWlpkZnhrYzBmaXFMV0dVaDMvSldsVDlwYjZRUC9EaG5UekpPZllhclYyZmkvSngyOGIxc0tqdXVhOHJ2bjA5MVdjL3BlSFJFK3k5RWRPOXBZN0RNczA2V2lha01iR3kvRFBWbW8yTy9QUXp2T1Z6S2Z3M0tkME03WFovdmFuLzJ2ZTJWaXZEMTNOeHZrNlF2NTcvREozTXUyYnlBaGQ5TmorVHZtallqclMzVTEzZmcrRU93MWNIM0wxcjhmYzB4Q2Y2T1lodDBmR0FJeGpSYkhvV3VUeHJtU3MrMis4Y1YyenExekhMdVhpVXFQLzYxM1IvKzl4SjgraTlhdjEvbjhpTHZNR1JyVFFacEk1TXpXVFlEOWdMN2dZTm04ckNsTTNibDUvK3VpYlRYamVEd21ienRQOGUxSTNaK0ZaMkRyMFNjNDJmeVB2YkVHWG43VjlrM05VVDNEOC8wMytQN0l0SVByZVRLdnBIMlkyUzkrREhPYnBkeno1eE8wenNieHl0cWcybWZpL3ZuVzloOG1LaktQNmxaMi96L0xoL1A2NXB4Y1VkSk9nd3J2NjQ0LzBjVSt5aGxFbG9HM2ZpekVMaElHQWRjN0pOcXJieVEvTCtRSVhYM2JiV3hMcDBzVzNDUS9XWCszSWFxZFI1VzN1eFN0ZjJqMVUzNmV4WUxRdGNoaG9rcDNCU3Z3NFdiNHZucVdiV3RGbG81Ykh3MlRNajBYVWo2Njhxa2tpcDE4ZFc1S3YySHZVNVVhWk95NjQ2dFZLMzNRdlYvakxTcXNEK3Z0MnYrS1NSVkdSZEtXV2FiL2RUR0l6QVdrVVYyOGFZYU9jMEpsR054Zmo3ZUtPNjcwS3dWejNadE5FMmhOdUxqR25Xak5wbmkwaU80cnRPOWJkM3E5MittUzR2Q1JIWHQ2c1B1c3hyL3NuQmVaR2tRWWY1dFUvKzJKZjVqTWs3ak1HblQrTVMvWW40eWFUY0c3dzJVU2ZCdkw1NmxmMW45ZG1tdjVNam5aZXZmZ2JLVTdGOHhybmhPaFBpWDJaNzVseUh6VDF2aFgxNUkyOVdKcWp6YVp5ejkyK3RYeHdvLzErYmN4Z0RYOXN0OHFyd3V5YisyN1ZlRTFXM1dwcGlQWmY0TkhVdVpUY1M2NU5vL2EvTVk0OFlRVUo4b0lOSllJUDJ6cTM4bkxmcm5TWXYySzVOSlJaOFF1My91WkVXN0RabkhzWDY3bTdkRi82eHJ5NnF4a3AyTDkyVHh4SHZLKzViekwxSDR0aXpydjluWVBDNjBiVUxkc24zTC9LK1NGTzlGWkNMT3AyM20xRjM5RFA2TzJaNWQvVW5hTS9sOWFCRytUZkgzeGV1Nm9UM3p6K25xRkc4WC9oa1gvK3JFWjcya25ac1BnWDlWY1ptdy90ckd2L3cxTzdmeHI5ajN5cVNuYXdUL2RqbzVQaUw2bDllcExQOXFzV3kvQkdaM05oNnJJR0xxajdzMlZmaU4wVzdvMnc1dms5RDVsZ2xUditZNm43YWRjOHZzRWdPck5DVnJhZHMrWHRhR1Zmc2pMSXdkMlY2SmJMOUZKYTc5TmI5LzRpcXhmZUVMVzdmYklncDVubStuNDQzK2ZTcHk1TmNXaEc3N2J4WnhZcXhyeERxcHNuRUsyNXZ5RExGM2R6OXZMb2VKek43TUYwUkVlOWV6b2wvSkhPeXRxcXNwOXFkNW1oUmxQMnE3aitWUXIvajYycUUyRlBNbEpwbXc4SEdLT3Fickp6T1BPc1hhSUd1SFpEd205YVN1MG4zT25tNzVIZUtuZ0xVSEhmemV0MndkNVZOM1pWSjFIOS9GY3I2Z3FpdXljWlRVbmU1Y25hdzVadnY3cWg0a2I1ZDlEYTZmNS9jNlpHVVk2Q2QxZFhZc2o5T2F5R0Z4MkxQc1BnK2ZsakV2RytZR2JTbkxsOUNrK1hmMXNMUWZlMVo4cjJPcTR6THBDT2VoeU5LeFNUOExmRDQwLzlUbDgwbTNESGhKbllkdmVLcnlpdUt6YnU0K0o5eXpXWVBFeWw4R243OU51VlBsN3lveDdFL0VPLyt5eG1pYmZaUUlld0xNOTdyOUZ4RityZEhiZzZGamYvZDhKb2ZkbDZWQjVnaW0vUmdDMnh2cTJUOXdIelcwRHlpci80NlJmMno5Q1YzN2x0VUdKTzNZWlkzTXI1T1pzUHZkOXg2YU5ZTnVqME5tVCtzMVpreWJlT3o5dVk1M0EvYno4Qmt2cXZVRXYxZWtXbVBJL0N2QzVyMUsvUjMyQXFSK1RsaS9aV1dQa3IrcVhyQndpUjI3YTMvWk9ucldiMzlCdFM5STJ1SEFIdFZFLzdOODNRbnQvME9mNTkrOXNESFBlL3hOVUlkRTI1bjhJZDV2MWZUcCs5clRaNndoZGJDWkZYdFJNbHpIUVd1L3BSekxKT09NekJla3JmWHRuWXpaMjV2TW02UjVLdm9HMjNwakdoOUZHWmcvS0d5aHE1TzYvcDdmdDJ4TzZQTjJHYWY3NmppbmIrajh5VFRlcGt5YkNQK2RWMGU0dG1heGdPUWVzeGNKNDg4WnFqNDJobjF0N1dUYTg5WHBZNnR2WmpqcW5nbnhmNHEwYmZPenpjTkxsMGxRTDY1ampEVStldlRLYmJHR2xkTEluUDhHMk5kM3ZJVDYyL1N0c2tsQ2RJK2h2eTd0Rk9LcVU2MGR0NHpLZXB1WVZQbUUybGdub2ZXaUxKdjY2bEIxZUd4YitOcElKMlhYeDlUMUk5USt3MVIvWGZKSVVUZGN4VVpmL3YwMXYvNnNTOWJoL04vcHBOeC9rcjBiVXRrdzFQZEoxOWs2VE92OWNjMmFXYmFHSFN1K3QzYXBjOUgrcmpYaFhvWExQaC81MnhqKyt6S1Y5T3AvNkg2Y3ovclZaazFMMGJWYmwvM0kwdXV6aE9aRVFhOGNpZnNQM1Q2TzYvdlhEdGRldEh0NEtydEV0cmx1ejR6ZnkrcDdQMUh6SDlkQzJvdk8zNnlmdHlwM1FIM1BNazM5VE4wK0xPcXB1UDhvZS85aGtwQnZGRE1QL3c3MFM0RzJHVWhEc2E5Q3dscjBYWTM0ZlZ4czM2amVEWXIzMlhlNjdKaGFkUE01bTdMS3lpUkxrMzFUR2FLWGFXN3NFcTRUYjkvemRyUHREd3h0eWpRZWtUS3hieVI3K2dmT1Ixem13S0ZySGQ4NXQ0dnVybVdNcmIvdWZxYUlXNmFPdnJhV1NSWDVocGEzREgrSFBHOVQzdGpsQ0xHbHlhNHB3azMyc2JXVHJmaldKMU40U0gwSlRkdEdmOWZuYmV5V3FpN0d5TThuRFZtWnE1VFlOZzNOdnl5ZFUvaytscTYyRXBwZUNydTRwTzhpTWRxS1NRK2RiMVBWSDFVWnE2aS9MdjZKV1k5RDhnaTFlWXE4WEhTcUl2K3F5bS9LazZ4N0o0VnZZOG1SLzUwcVhsZzg4WGZlK3Zia05OZXBZRkxuOXFRSHlqNGJ0aGFYMlM5bUcvYkp5elpmM3pTSHFWMmxMSStMelZ3bDFHZSthY2ZLSXpUL0ZEN3dMV3RvT24yL2hkWEpHYnAzckliOWJ4bDF3M3NrVWF6ZjJ3VDB0U2JwZnBmdTgxdk9rZTFyK3QxbDhnNmJmMGNhMmtZN3d2a3d0enV0ZjBxby82YTJvUE1kKzlza0lyNS9sOExuYXlObDloTmluYlNSS0wrZG50Qy9ycitCVHQ2ZjY3N0xJTEMvQmVIZjgvVDg1Vmt2ZUp2SDZrdDkrdFJZdnVxbWxXQjhJdldNK0loOW42R3lJL3VPWEtjLzAxR21xNi8rUHMvcjJsclZiY2dGOW5kU3h2RnZRdDMvaGRacDM5K3Y1T01OMkQ2eTcvbHdWVndpYk4zSy9wK0RDaWJpNy8zemZSb1RYVjFUK2FTVERmYnhZdDY2YjkvNi9HTUlOMG1LZXVzelRyRHZFQm5NVDZaNWtVdjlacjVpWTQ3dDcrMm03Q05zYktVSzc3TlhUVzR6by84RCs0ZFVaV2NpaHN2S0hIT05QRkMvQkorTCtzWHd2eXQ4K2RsOHlYZXRrL0w3bVJock1hUCtqdU9wN1pqYXFoVy80NmJOdjRSMWVLenloOUxMMCtLYkxWTzdkcldmYnYyWGFteVM5VE1EK2p2T2hjcmVJMkdpS3hzL1pveExmSlJTK0Q3VlJPcjZMUnRqK242WFgveG1VYkh1N04yMytBYlVwZnd5R3lqSExjZnZtZnZLT2l1cy9SVHpzQ3JFWmw0bWpaZXd2dWpXRWFZNVc2aHRZKzluK1BhckxtT0c2M2YycG0rR1ZYUEUwUHJFaC9mT1M2eEh2SWoxaVozejZ5VVcxbTIvbmNKK01lcVBxLzJrdGt1OE42bHJmL3k1Mk05cDdSTkx4OWJnM01pbXJjZGF4L2hJakR4RGRVbVJ2NHMrdnZhTk5VYUcranUwUHNTMmRZeDZHeXV0VlBxVmxiNk5oS2JscXM4dytqNkd2cWI0Wll0TUovR2F2KzlqTTV0bmZkS09WVGRjZldTcnMyMDRMNmxzRkNJcC9CVXFaZFFsMTd4VWNWTklxTTFUMkNRMGJSZDdoYVlaK2x3TWlWRkhRKzBvMHlmTCtwL1gxVzFUbTVDbHFkTk5aWFBWVVphblRuK2I5R1RQbThwblczNmRUWHh0RzZ0dTJPU1RNbjhYaVpGT3FQNHB5aC9EdG1YNEluVytvZjROMVNlMEhGVzFpOUQ4YmVxNWF6Nm11Q24wTnVXdHM1ZVB4UEJuVFArSHl2OEFLWFJMNkE9PVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGYobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGYobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGYobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRmKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkZihvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGYoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJDUoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eSQyKG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbi8vIHdlIG1heSBiZSBydW5uaW5nIGluIGEgYnJvd3NlciBzbyB3ZSBtYWtlIGFuIFVpbnQ4QXJyYXlcblxudmFyIGluZGljTWFjaGluZSA9IEpTT04ucGFyc2UoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIHBha28uaW5mbGF0ZShiYXNlNjRBcnJheWJ1ZmZlcl8yKGJhc2U2NERlZmxhdGVkSW5kaWNNYWNoaW5lKSkpKTtcbnZhciB1c2VEYXRhID0gSlNPTi5wYXJzZShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgcGFrby5pbmZsYXRlKGJhc2U2NEFycmF5YnVmZmVyXzIoYmFzZTY0RGVmbGF0ZWRVc2VEYXRhKSkpKTtcbnZhciB0cmllRGF0YSQyID0gcGFrby5pbmZsYXRlKGJhc2U2NEFycmF5YnVmZmVyXzIoYmFzZTY0RGVmbGF0ZWRUcmllJDIpKTtcbnZhciBkZWNvbXBvc2l0aW9ucyA9IHVzZURhdGEuZGVjb21wb3NpdGlvbnM7XG52YXIgdHJpZSQyID0gbmV3IHVuaWNvZGVUcmllKHRyaWVEYXRhJDIpO1xudmFyIHN0YXRlTWFjaGluZSA9IG5ldyBkZmEoaW5kaWNNYWNoaW5lKTtcbi8qKlxuICogVGhlIEluZGljU2hhcGVyIHN1cHBvcnRzIGluZGljIHNjcmlwdHMgZS5nLiBEZXZhbmFnYXJpLCBLYW5uYWRhLCBldGMuXG4gKiBCYXNlZCBvbiBjb2RlIGZyb20gSGFyZmJ1eno6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWhkYWQvaGFyZmJ1enovYmxvYi9tYXN0ZXIvc3JjL2hiLW90LXNoYXBlLWNvbXBsZXgtaW5kaWMuY2NcbiAqL1xuXG52YXIgSW5kaWNTaGFwZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9EZWZhdWx0U2hhcGVyKSB7XG4gIF9pbmhlcml0c0xvb3NlJDUoSW5kaWNTaGFwZXIsIF9EZWZhdWx0U2hhcGVyKTtcblxuICBmdW5jdGlvbiBJbmRpY1NoYXBlcigpIHtcbiAgICByZXR1cm4gX0RlZmF1bHRTaGFwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgSW5kaWNTaGFwZXIucGxhbkZlYXR1cmVzID0gZnVuY3Rpb24gcGxhbkZlYXR1cmVzKHBsYW4pIHtcbiAgICBwbGFuLmFkZFN0YWdlKHNldHVwU3lsbGFibGVzKTtcbiAgICBwbGFuLmFkZFN0YWdlKFsnbG9jbCcsICdjY21wJ10pO1xuICAgIHBsYW4uYWRkU3RhZ2UoaW5pdGlhbFJlb3JkZXJpbmcpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ251a3QnKTtcbiAgICBwbGFuLmFkZFN0YWdlKCdha2huJyk7XG4gICAgcGxhbi5hZGRTdGFnZSgncnBoZicsIGZhbHNlKTtcbiAgICBwbGFuLmFkZFN0YWdlKCdya3JmJyk7XG4gICAgcGxhbi5hZGRTdGFnZSgncHJlZicsIGZhbHNlKTtcbiAgICBwbGFuLmFkZFN0YWdlKCdibHdmJywgZmFsc2UpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ2FidmYnLCBmYWxzZSk7XG4gICAgcGxhbi5hZGRTdGFnZSgnaGFsZicsIGZhbHNlKTtcbiAgICBwbGFuLmFkZFN0YWdlKCdwc3RmJywgZmFsc2UpO1xuICAgIHBsYW4uYWRkU3RhZ2UoJ3ZhdHUnKTtcbiAgICBwbGFuLmFkZFN0YWdlKCdjamN0Jyk7XG4gICAgcGxhbi5hZGRTdGFnZSgnY2ZhcicsIGZhbHNlKTtcbiAgICBwbGFuLmFkZFN0YWdlKGZpbmFsUmVvcmRlcmluZyk7XG4gICAgcGxhbi5hZGRTdGFnZSh7XG4gICAgICBsb2NhbDogWydpbml0J10sXG4gICAgICBnbG9iYWw6IFsncHJlcycsICdhYnZzJywgJ2Jsd3MnLCAncHN0cycsICdoYWxuJywgJ2Rpc3QnLCAnYWJ2bScsICdibHdtJywgJ2NhbHQnLCAnY2xpZyddXG4gICAgfSk7IC8vIFNldHVwIHRoZSBpbmRpYyBjb25maWcgZm9yIHRoZSBzZWxlY3RlZCBzY3JpcHRcblxuICAgIHBsYW4udW5pY29kZVNjcmlwdCA9IGZyb21PcGVuVHlwZShwbGFuLnNjcmlwdCk7XG4gICAgcGxhbi5pbmRpY0NvbmZpZyA9IElORElDX0NPTkZJR1NbcGxhbi51bmljb2RlU2NyaXB0XSB8fCBJTkRJQ19DT05GSUdTLkRlZmF1bHQ7XG4gICAgcGxhbi5pc09sZFNwZWMgPSBwbGFuLmluZGljQ29uZmlnLmhhc09sZFNwZWMgJiYgcGxhbi5zY3JpcHRbcGxhbi5zY3JpcHQubGVuZ3RoIC0gMV0gIT09ICcyJzsgLy8gVE9ETzogdHVybiBvZmYga2VybiAoS2htZXIpIGFuZCBsaWdhIGZlYXR1cmVzLlxuICB9O1xuXG4gIEluZGljU2hhcGVyLmFzc2lnbkZlYXR1cmVzID0gZnVuY3Rpb24gYXNzaWduRmVhdHVyZXMocGxhbiwgZ2x5cGhzKSB7XG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSkge1xuICAgICAgdmFyIGNvZGVwb2ludCA9IGdseXBoc1tpXS5jb2RlUG9pbnRzWzBdO1xuICAgICAgdmFyIGQgPSBJTkRJQ19ERUNPTVBPU0lUSU9OU1tjb2RlcG9pbnRdIHx8IGRlY29tcG9zaXRpb25zW2NvZGVwb2ludF07XG5cbiAgICAgIGlmIChkKSB7XG4gICAgICAgIHZhciBkZWNvbXBvc2VkID0gZC5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICB2YXIgZyA9IHBsYW4uZm9udC5nbHlwaEZvckNvZGVQb2ludChjKTtcbiAgICAgICAgICByZXR1cm4gbmV3IEdseXBoSW5mbyhwbGFuLmZvbnQsIGcuaWQsIFtjXSwgZ2x5cGhzW2ldLmZlYXR1cmVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbaSwgMV0uY29uY2F0KGRlY29tcG9zZWQpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRGVjb21wb3NlIHNwbGl0IG1hdHJhc1xuICAgIC8vIFRPRE86IGRvIHRoaXMgaW4gYSBtb3JlIGdlbmVyYWwgdW5pY29kZSBub3JtYWxpemVyXG4gICAgZm9yICh2YXIgaSA9IGdseXBocy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgX2xvb3AoaSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBJbmRpY1NoYXBlcjtcbn0oRGVmYXVsdFNoYXBlcik7XG5cbl9kZWZpbmVQcm9wZXJ0eSQyKEluZGljU2hhcGVyLCBcInplcm9NYXJrV2lkdGhzXCIsICdOT05FJyk7XG5cbmZ1bmN0aW9uIGluZGljQ2F0ZWdvcnkoZ2x5cGgpIHtcbiAgcmV0dXJuIHRyaWUkMi5nZXQoZ2x5cGguY29kZVBvaW50c1swXSkgPj4gODtcbn1cblxuZnVuY3Rpb24gaW5kaWNQb3NpdGlvbihnbHlwaCkge1xuICByZXR1cm4gMSA8PCAodHJpZSQyLmdldChnbHlwaC5jb2RlUG9pbnRzWzBdKSAmIDB4ZmYpO1xufVxuXG52YXIgSW5kaWNJbmZvID0gZnVuY3Rpb24gSW5kaWNJbmZvKGNhdGVnb3J5LCBwb3NpdGlvbiwgc3lsbGFibGVUeXBlLCBzeWxsYWJsZSkge1xuICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5zeWxsYWJsZVR5cGUgPSBzeWxsYWJsZVR5cGU7XG4gIHRoaXMuc3lsbGFibGUgPSBzeWxsYWJsZTtcbn07XG5cbmZ1bmN0aW9uIHNldHVwU3lsbGFibGVzKGZvbnQsIGdseXBocykge1xuICB2YXIgc3lsbGFibGUgPSAwO1xuICB2YXIgbGFzdCA9IDA7XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRmKHN0YXRlTWFjaGluZS5tYXRjaChnbHlwaHMubWFwKGluZGljQ2F0ZWdvcnkpKSksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgdmFyIF9zdGVwJHZhbHVlID0gX3N0ZXAudmFsdWUsXG4gICAgICAgIHN0YXJ0ID0gX3N0ZXAkdmFsdWVbMF0sXG4gICAgICAgIGVuZCA9IF9zdGVwJHZhbHVlWzFdLFxuICAgICAgICB0YWdzID0gX3N0ZXAkdmFsdWVbMl07XG5cbiAgICBpZiAoc3RhcnQgPiBsYXN0KSB7XG4gICAgICArK3N5bGxhYmxlO1xuXG4gICAgICBmb3IgKHZhciBfaSA9IGxhc3Q7IF9pIDwgc3RhcnQ7IF9pKyspIHtcbiAgICAgICAgZ2x5cGhzW19pXS5zaGFwZXJJbmZvID0gbmV3IEluZGljSW5mbyhDQVRFR09SSUVTLlgsIFBPU0lUSU9OUy5FbmQsICdub25faW5kaWNfY2x1c3RlcicsIHN5bGxhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICArK3N5bGxhYmxlOyAvLyBDcmVhdGUgc2hhcGVyIGluZm9cblxuICAgIGZvciAodmFyIF9pMiA9IHN0YXJ0OyBfaTIgPD0gZW5kOyBfaTIrKykge1xuICAgICAgZ2x5cGhzW19pMl0uc2hhcGVySW5mbyA9IG5ldyBJbmRpY0luZm8oMSA8PCBpbmRpY0NhdGVnb3J5KGdseXBoc1tfaTJdKSwgaW5kaWNQb3NpdGlvbihnbHlwaHNbX2kyXSksIHRhZ3NbMF0sIHN5bGxhYmxlKTtcbiAgICB9XG5cbiAgICBsYXN0ID0gZW5kICsgMTtcbiAgfVxuXG4gIGlmIChsYXN0IDwgZ2x5cGhzLmxlbmd0aCkge1xuICAgICsrc3lsbGFibGU7XG5cbiAgICBmb3IgKHZhciBpID0gbGFzdDsgaSA8IGdseXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgZ2x5cGhzW2ldLnNoYXBlckluZm8gPSBuZXcgSW5kaWNJbmZvKENBVEVHT1JJRVMuWCwgUE9TSVRJT05TLkVuZCwgJ25vbl9pbmRpY19jbHVzdGVyJywgc3lsbGFibGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnNvbmFudChnbHlwaCkge1xuICByZXR1cm4gZ2x5cGguc2hhcGVySW5mby5jYXRlZ29yeSAmIENPTlNPTkFOVF9GTEFHUztcbn1cblxuZnVuY3Rpb24gaXNKb2luZXIoZ2x5cGgpIHtcbiAgcmV0dXJuIGdseXBoLnNoYXBlckluZm8uY2F0ZWdvcnkgJiBKT0lORVJfRkxBR1M7XG59XG5cbmZ1bmN0aW9uIGlzSGFsYW50T3JDb2VuZyhnbHlwaCkge1xuICByZXR1cm4gZ2x5cGguc2hhcGVySW5mby5jYXRlZ29yeSAmIEhBTEFOVF9PUl9DT0VOR19GTEFHUztcbn1cblxuZnVuY3Rpb24gd291bGRTdWJzdGl0dXRlKGdseXBocywgZmVhdHVyZSkge1xuICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRmKGdseXBocyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgdmFyIF9nbHlwaCRmZWF0dXJlcztcblxuICAgIHZhciBnbHlwaCA9IF9zdGVwMi52YWx1ZTtcbiAgICBnbHlwaC5mZWF0dXJlcyA9IChfZ2x5cGgkZmVhdHVyZXMgPSB7fSwgX2dseXBoJGZlYXR1cmVzW2ZlYXR1cmVdID0gdHJ1ZSwgX2dseXBoJGZlYXR1cmVzKTtcbiAgfVxuXG4gIHZhciBHU1VCID0gZ2x5cGhzWzBdLl9mb250Ll9sYXlvdXRFbmdpbmUuZW5naW5lLkdTVUJQcm9jZXNzb3I7XG4gIEdTVUIuYXBwbHlGZWF0dXJlcyhbZmVhdHVyZV0sIGdseXBocyk7XG4gIHJldHVybiBnbHlwaHMubGVuZ3RoID09PSAxO1xufVxuXG5mdW5jdGlvbiBjb25zb25hbnRQb3NpdGlvbihmb250LCBjb25zb25hbnQsIHZpcmFtYSkge1xuICB2YXIgZ2x5cGhzID0gW3ZpcmFtYSwgY29uc29uYW50LCB2aXJhbWFdO1xuXG4gIGlmICh3b3VsZFN1YnN0aXR1dGUoZ2x5cGhzLnNsaWNlKDAsIDIpLCAnYmx3ZicpIHx8IHdvdWxkU3Vic3RpdHV0ZShnbHlwaHMuc2xpY2UoMSwgMyksICdibHdmJykpIHtcbiAgICByZXR1cm4gUE9TSVRJT05TLkJlbG93X0M7XG4gIH0gZWxzZSBpZiAod291bGRTdWJzdGl0dXRlKGdseXBocy5zbGljZSgwLCAyKSwgJ3BzdGYnKSB8fCB3b3VsZFN1YnN0aXR1dGUoZ2x5cGhzLnNsaWNlKDEsIDMpLCAncHN0ZicpKSB7XG4gICAgcmV0dXJuIFBPU0lUSU9OUy5Qb3N0X0M7XG4gIH0gZWxzZSBpZiAod291bGRTdWJzdGl0dXRlKGdseXBocy5zbGljZSgwLCAyKSwgJ3ByZWYnKSB8fCB3b3VsZFN1YnN0aXR1dGUoZ2x5cGhzLnNsaWNlKDEsIDMpLCAncHJlZicpKSB7XG4gICAgcmV0dXJuIFBPU0lUSU9OUy5Qb3N0X0M7XG4gIH1cblxuICByZXR1cm4gUE9TSVRJT05TLkJhc2VfQztcbn1cblxuZnVuY3Rpb24gaW5pdGlhbFJlb3JkZXJpbmcoZm9udCwgZ2x5cGhzLCBwbGFuKSB7XG4gIHZhciBpbmRpY0NvbmZpZyA9IHBsYW4uaW5kaWNDb25maWc7XG4gIHZhciBmZWF0dXJlcyA9IGZvbnQuX2xheW91dEVuZ2luZS5lbmdpbmUuR1NVQlByb2Nlc3Nvci5mZWF0dXJlcztcbiAgdmFyIGRvdHRlZENpcmNsZSA9IGZvbnQuZ2x5cGhGb3JDb2RlUG9pbnQoMHgyNWNjKS5pZDtcbiAgdmFyIHZpcmFtYSA9IGZvbnQuZ2x5cGhGb3JDb2RlUG9pbnQoaW5kaWNDb25maWcudmlyYW1hKS5pZDtcblxuICBpZiAodmlyYW1hKSB7XG4gICAgdmFyIGluZm8gPSBuZXcgR2x5cGhJbmZvKGZvbnQsIHZpcmFtYSwgW2luZGljQ29uZmlnLnZpcmFtYV0pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbHlwaHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChnbHlwaHNbaV0uc2hhcGVySW5mby5wb3NpdGlvbiA9PT0gUE9TSVRJT05TLkJhc2VfQykge1xuICAgICAgICBnbHlwaHNbaV0uc2hhcGVySW5mby5wb3NpdGlvbiA9IGNvbnNvbmFudFBvc2l0aW9uKGZvbnQsIGdseXBoc1tpXS5jb3B5KCksIGluZm8pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIHN0YXJ0ID0gMCwgZW5kID0gbmV4dFN5bGxhYmxlKGdseXBocywgMCk7IHN0YXJ0IDwgZ2x5cGhzLmxlbmd0aDsgc3RhcnQgPSBlbmQsIGVuZCA9IG5leHRTeWxsYWJsZShnbHlwaHMsIHN0YXJ0KSkge1xuICAgIHZhciBfZ2x5cGhzJHN0YXJ0JHNoYXBlckkgPSBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8sXG4gICAgICAgIGNhdGVnb3J5ID0gX2dseXBocyRzdGFydCRzaGFwZXJJLmNhdGVnb3J5LFxuICAgICAgICBzeWxsYWJsZVR5cGUgPSBfZ2x5cGhzJHN0YXJ0JHNoYXBlckkuc3lsbGFibGVUeXBlO1xuXG4gICAgaWYgKHN5bGxhYmxlVHlwZSA9PT0gJ3N5bWJvbF9jbHVzdGVyJyB8fCBzeWxsYWJsZVR5cGUgPT09ICdub25faW5kaWNfY2x1c3RlcicpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzeWxsYWJsZVR5cGUgPT09ICdicm9rZW5fY2x1c3RlcicgJiYgZG90dGVkQ2lyY2xlKSB7XG4gICAgICB2YXIgZyA9IG5ldyBHbHlwaEluZm8oZm9udCwgZG90dGVkQ2lyY2xlLCBbMHgyNWNjXSk7XG4gICAgICBnLnNoYXBlckluZm8gPSBuZXcgSW5kaWNJbmZvKDEgPDwgaW5kaWNDYXRlZ29yeShnKSwgaW5kaWNQb3NpdGlvbihnKSwgZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLnN5bGxhYmxlVHlwZSwgZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLnN5bGxhYmxlKTsgLy8gSW5zZXJ0IGFmdGVyIHBvc3NpYmxlIFJlcGhhLlxuXG4gICAgICB2YXIgX2kzID0gc3RhcnQ7XG5cbiAgICAgIHdoaWxlIChfaTMgPCBlbmQgJiYgZ2x5cGhzW19pM10uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5SZXBoYSkge1xuICAgICAgICBfaTMrKztcbiAgICAgIH1cblxuICAgICAgZ2x5cGhzLnNwbGljZShfaTMrKywgMCwgZyk7XG4gICAgICBlbmQrKztcbiAgICB9IC8vIDEuIEZpbmQgYmFzZSBjb25zb25hbnQ6XG4gICAgLy9cbiAgICAvLyBUaGUgc2hhcGluZyBlbmdpbmUgZmluZHMgdGhlIGJhc2UgY29uc29uYW50IG9mIHRoZSBzeWxsYWJsZSwgdXNpbmcgdGhlXG4gICAgLy8gZm9sbG93aW5nIGFsZ29yaXRobTogc3RhcnRpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBzeWxsYWJsZSwgbW92ZSBiYWNrd2FyZHNcbiAgICAvLyB1bnRpbCBhIGNvbnNvbmFudCBpcyBmb3VuZCB0aGF0IGRvZXMgbm90IGhhdmUgYSBiZWxvdy1iYXNlIG9yIHBvc3QtYmFzZVxuICAgIC8vIGZvcm0gKHBvc3QtYmFzZSBmb3JtcyBoYXZlIHRvIGZvbGxvdyBiZWxvdy1iYXNlIGZvcm1zKSwgb3IgdGhhdCBpcyBub3QgYVxuICAgIC8vIHByZS1iYXNlIHJlb3JkZXJpbmcgUmEsIG9yIGFycml2ZSBhdCB0aGUgZmlyc3QgY29uc29uYW50LiBUaGUgY29uc29uYW50XG4gICAgLy8gc3RvcHBlZCBhdCB3aWxsIGJlIHRoZSBiYXNlLlxuXG5cbiAgICB2YXIgYmFzZSA9IGVuZDtcbiAgICB2YXIgbGltaXQgPSBzdGFydDtcbiAgICB2YXIgaGFzUmVwaCA9IGZhbHNlOyAvLyBJZiB0aGUgc3lsbGFibGUgc3RhcnRzIHdpdGggUmEgKyBIYWxhbnQgKGluIGEgc2NyaXB0IHRoYXQgaGFzIFJlcGgpXG4gICAgLy8gYW5kIGhhcyBtb3JlIHRoYW4gb25lIGNvbnNvbmFudCwgUmEgaXMgZXhjbHVkZWQgZnJvbSBjYW5kaWRhdGVzIGZvclxuICAgIC8vIGJhc2UgY29uc29uYW50cy5cblxuICAgIGlmIChpbmRpY0NvbmZpZy5yZXBoUG9zICE9PSBQT1NJVElPTlMuUmFfVG9fQmVjb21lX1JlcGggJiYgZmVhdHVyZXMucnBoZiAmJiBzdGFydCArIDMgPD0gZW5kICYmIChpbmRpY0NvbmZpZy5yZXBoTW9kZSA9PT0gJ0ltcGxpY2l0JyAmJiAhaXNKb2luZXIoZ2x5cGhzW3N0YXJ0ICsgMl0pIHx8IGluZGljQ29uZmlnLnJlcGhNb2RlID09PSAnRXhwbGljaXQnICYmIGdseXBoc1tzdGFydCArIDJdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuWldKKSkge1xuICAgICAgLy8gU2VlIGlmIGl0IG1hdGNoZXMgdGhlICdycGhmJyBmZWF0dXJlLlxuICAgICAgdmFyIF9nID0gW2dseXBoc1tzdGFydF0uY29weSgpLCBnbHlwaHNbc3RhcnQgKyAxXS5jb3B5KCksIGdseXBoc1tzdGFydCArIDJdLmNvcHkoKV07XG5cbiAgICAgIGlmICh3b3VsZFN1YnN0aXR1dGUoX2cuc2xpY2UoMCwgMiksICdycGhmJykgfHwgaW5kaWNDb25maWcucmVwaE1vZGUgPT09ICdFeHBsaWNpdCcgJiYgd291bGRTdWJzdGl0dXRlKF9nLCAncnBoZicpKSB7XG4gICAgICAgIGxpbWl0ICs9IDI7XG5cbiAgICAgICAgd2hpbGUgKGxpbWl0IDwgZW5kICYmIGlzSm9pbmVyKGdseXBoc1tsaW1pdF0pKSB7XG4gICAgICAgICAgbGltaXQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGJhc2UgPSBzdGFydDtcbiAgICAgICAgaGFzUmVwaCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbmRpY0NvbmZpZy5yZXBoTW9kZSA9PT0gJ0xvZ19SZXBoYScgJiYgZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLlJlcGhhKSB7XG4gICAgICBsaW1pdCsrO1xuXG4gICAgICB3aGlsZSAobGltaXQgPCBlbmQgJiYgaXNKb2luZXIoZ2x5cGhzW2xpbWl0XSkpIHtcbiAgICAgICAgbGltaXQrKztcbiAgICAgIH1cblxuICAgICAgYmFzZSA9IHN0YXJ0O1xuICAgICAgaGFzUmVwaCA9IHRydWU7XG4gICAgfVxuXG4gICAgc3dpdGNoIChpbmRpY0NvbmZpZy5iYXNlUG9zKSB7XG4gICAgICBjYXNlICdMYXN0JzpcbiAgICAgICAge1xuICAgICAgICAgIC8vIHN0YXJ0aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgc3lsbGFibGUsIG1vdmUgYmFja3dhcmRzXG4gICAgICAgICAgdmFyIF9pNCA9IGVuZDtcbiAgICAgICAgICB2YXIgc2VlbkJlbG93ID0gZmFsc2U7XG5cbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICB2YXIgX2luZm8gPSBnbHlwaHNbLS1faTRdLnNoYXBlckluZm87IC8vIHVudGlsIGEgY29uc29uYW50IGlzIGZvdW5kXG5cbiAgICAgICAgICAgIGlmIChpc0NvbnNvbmFudChnbHlwaHNbX2k0XSkpIHtcbiAgICAgICAgICAgICAgLy8gdGhhdCBkb2VzIG5vdCBoYXZlIGEgYmVsb3ctYmFzZSBvciBwb3N0LWJhc2UgZm9ybVxuICAgICAgICAgICAgICAvLyAocG9zdC1iYXNlIGZvcm1zIGhhdmUgdG8gZm9sbG93IGJlbG93LWJhc2UgZm9ybXMpLFxuICAgICAgICAgICAgICBpZiAoX2luZm8ucG9zaXRpb24gIT09IFBPU0lUSU9OUy5CZWxvd19DICYmIChfaW5mby5wb3NpdGlvbiAhPT0gUE9TSVRJT05TLlBvc3RfQyB8fCBzZWVuQmVsb3cpKSB7XG4gICAgICAgICAgICAgICAgYmFzZSA9IF9pNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfSAvLyBvciB0aGF0IGlzIG5vdCBhIHByZS1iYXNlIHJlb3JkZXJpbmcgUmEsXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIElNUExFTUVOVEFUSU9OIE5PVEVTOlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBPdXIgcHJlLWJhc2UgcmVvcmRlcmluZyBSYSdzIGFyZSBtYXJrZWQgUE9TX1BPU1RfQywgc28gd2lsbCBiZSBza2lwcGVkXG4gICAgICAgICAgICAgIC8vIGJ5IHRoZSBsb2dpYyBhYm92ZSBhbHJlYWR5LlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBvciBhcnJpdmUgYXQgdGhlIGZpcnN0IGNvbnNvbmFudC4gVGhlIGNvbnNvbmFudCBzdG9wcGVkIGF0IHdpbGxcbiAgICAgICAgICAgICAgLy8gYmUgdGhlIGJhc2UuXG5cblxuICAgICAgICAgICAgICBpZiAoX2luZm8ucG9zaXRpb24gPT09IFBPU0lUSU9OUy5CZWxvd19DKSB7XG4gICAgICAgICAgICAgICAgc2VlbkJlbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJhc2UgPSBfaTQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgX2k0ICYmIF9pbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLlpXSiAmJiBnbHlwaHNbX2k0IC0gMV0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5IKSB7XG4gICAgICAgICAgICAgIC8vIEEgWldKIGFmdGVyIGEgSGFsYW50IHN0b3BzIHRoZSBiYXNlIHNlYXJjaCwgYW5kIHJlcXVlc3RzIGFuIGV4cGxpY2l0XG4gICAgICAgICAgICAgIC8vIGhhbGYgZm9ybS5cbiAgICAgICAgICAgICAgLy8gQSBaV0ogYmVmb3JlIGEgSGFsYW50LCByZXF1ZXN0cyBhIHN1YmpvaW5lZCBmb3JtIGluc3RlYWQsIGFuZCBoZW5jZVxuICAgICAgICAgICAgICAvLyBzZWFyY2ggY29udGludWVzLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGZvciBCZW5nYWxpXG4gICAgICAgICAgICAgIC8vIHNlcXVlbmNlIFJhLEgsWWEgdGhhdCBzaG91bGQgZm9ybSBZYS1QaGFsYWEgYnkgc3Viam9pbmluZyBZYS5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAoX2k0ID4gbGltaXQpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnRmlyc3QnOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gVGhlIGZpcnN0IGNvbnNvbmFudCBpcyBhbHdheXMgdGhlIGJhc2UuXG4gICAgICAgICAgYmFzZSA9IHN0YXJ0OyAvLyBNYXJrIGFsbCBzdWJzZXF1ZW50IGNvbnNvbmFudHMgYXMgYmVsb3cuXG5cbiAgICAgICAgICBmb3IgKHZhciBfaTUgPSBiYXNlICsgMTsgX2k1IDwgZW5kOyBfaTUrKykge1xuICAgICAgICAgICAgaWYgKGlzQ29uc29uYW50KGdseXBoc1tfaTVdKSkge1xuICAgICAgICAgICAgICBnbHlwaHNbX2k1XS5zaGFwZXJJbmZvLnBvc2l0aW9uID0gUE9TSVRJT05TLkJlbG93X0M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSAvLyBJZiB0aGUgc3lsbGFibGUgc3RhcnRzIHdpdGggUmEgKyBIYWxhbnQgKGluIGEgc2NyaXB0IHRoYXQgaGFzIFJlcGgpXG4gICAgLy8gYW5kIGhhcyBtb3JlIHRoYW4gb25lIGNvbnNvbmFudCwgUmEgaXMgZXhjbHVkZWQgZnJvbSBjYW5kaWRhdGVzIGZvclxuICAgIC8vIGJhc2UgY29uc29uYW50cy5cbiAgICAvL1xuICAgIC8vICBPbmx5IGRvIHRoaXMgZm9yIHVuZm9yY2VkIFJlcGguIChpZS4gbm90IGZvciBSYSxILFpXSilcblxuXG4gICAgaWYgKGhhc1JlcGggJiYgYmFzZSA9PT0gc3RhcnQgJiYgbGltaXQgLSBiYXNlIDw9IDIpIHtcbiAgICAgIGhhc1JlcGggPSBmYWxzZTtcbiAgICB9IC8vIDIuIERlY29tcG9zZSBhbmQgcmVvcmRlciBNYXRyYXM6XG4gICAgLy9cbiAgICAvLyBFYWNoIG1hdHJhIGFuZCBhbnkgc3lsbGFibGUgbW9kaWZpZXIgc2lnbiBpbiB0aGUgY2x1c3RlciBhcmUgbW92ZWQgdG8gdGhlXG4gICAgLy8gYXBwcm9wcmlhdGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGNvbnNvbmFudChzKSBpbiB0aGUgY2x1c3Rlci4gVGhlXG4gICAgLy8gc2hhcGluZyBlbmdpbmUgZGVjb21wb3NlcyB0d28tIG9yIHRocmVlLXBhcnQgbWF0cmFzIGludG8gdGhlaXIgY29uc3RpdHVlbnRcbiAgICAvLyBwYXJ0cyBiZWZvcmUgYW55IHJlcG9zaXRpb25pbmcuIE1hdHJhIGNoYXJhY3RlcnMgYXJlIGNsYXNzaWZpZWQgYnkgd2hpY2hcbiAgICAvLyBjb25zb25hbnQgaW4gYSBjb25qdW5jdCB0aGV5IGhhdmUgYWZmaW5pdHkgZm9yIGFuZCBhcmUgcmVvcmRlcmVkIHRvIHRoZVxuICAgIC8vIGZvbGxvd2luZyBwb3NpdGlvbnM6XG4gICAgLy9cbiAgICAvLyAgIG8gQmVmb3JlIGZpcnN0IGhhbGYgZm9ybSBpbiB0aGUgc3lsbGFibGVcbiAgICAvLyAgIG8gQWZ0ZXIgc3Viam9pbmVkIGNvbnNvbmFudHNcbiAgICAvLyAgIG8gQWZ0ZXIgcG9zdC1mb3JtIGNvbnNvbmFudFxuICAgIC8vICAgbyBBZnRlciBtYWluIGNvbnNvbmFudCAoZm9yIGFib3ZlIG1hcmtzKVxuICAgIC8vXG4gICAgLy8gSU1QTEVNRU5UQVRJT04gTk9URVM6XG4gICAgLy9cbiAgICAvLyBUaGUgbm9ybWFsaXplKCkgcm91dGluZSBoYXMgYWxyZWFkeSBkZWNvbXBvc2VkIG1hdHJhcyBmb3IgdXMsIHNvIHdlIGRvbid0XG4gICAgLy8gbmVlZCB0byB3b3JyeSBhYm91dCB0aGF0LlxuICAgIC8vIDMuICBSZW9yZGVyIG1hcmtzIHRvIGNhbm9uaWNhbCBvcmRlcjpcbiAgICAvL1xuICAgIC8vIEFkamFjZW50IG51a3RhIGFuZCBoYWxhbnQgb3IgbnVrdGEgYW5kIHZlZGljIHNpZ24gYXJlIGFsd2F5cyByZXBvc2l0aW9uZWRcbiAgICAvLyBpZiBuZWNlc3NhcnksIHNvIHRoYXQgdGhlIG51a3RhIGlzIGZpcnN0LlxuICAgIC8vXG4gICAgLy8gSU1QTEVNRU5UQVRJT04gTk9URVM6XG4gICAgLy9cbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGRvIHRoaXM6IHRoZSBub3JtYWxpemUoKSByb3V0aW5lIGFscmVhZHkgZGlkIHRoaXMgZm9yIHVzLlxuICAgIC8vIFJlb3JkZXIgY2hhcmFjdGVyc1xuXG5cbiAgICBmb3IgKHZhciBfaTYgPSBzdGFydDsgX2k2IDwgYmFzZTsgX2k2KyspIHtcbiAgICAgIHZhciBfaW5mbzIgPSBnbHlwaHNbX2k2XS5zaGFwZXJJbmZvO1xuICAgICAgX2luZm8yLnBvc2l0aW9uID0gTWF0aC5taW4oUE9TSVRJT05TLlByZV9DLCBfaW5mbzIucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmIChiYXNlIDwgZW5kKSB7XG4gICAgICBnbHlwaHNbYmFzZV0uc2hhcGVySW5mby5wb3NpdGlvbiA9IFBPU0lUSU9OUy5CYXNlX0M7XG4gICAgfSAvLyBNYXJrIGZpbmFsIGNvbnNvbmFudHMuICBBIGZpbmFsIGNvbnNvbmFudCBpcyBvbmUgYXBwZWFyaW5nIGFmdGVyIGEgbWF0cmEsXG4gICAgLy8gbGlrZSBpbiBLaG1lci5cblxuXG4gICAgZm9yICh2YXIgX2k3ID0gYmFzZSArIDE7IF9pNyA8IGVuZDsgX2k3KyspIHtcbiAgICAgIGlmIChnbHlwaHNbX2k3XS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLk0pIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IF9pNyArIDE7IGogPCBlbmQ7IGorKykge1xuICAgICAgICAgIGlmIChpc0NvbnNvbmFudChnbHlwaHNbal0pKSB7XG4gICAgICAgICAgICBnbHlwaHNbal0uc2hhcGVySW5mby5wb3NpdGlvbiA9IFBPU0lUSU9OUy5GaW5hbF9DO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBIYW5kbGUgYmVnaW5uaW5nIFJhXG5cblxuICAgIGlmIChoYXNSZXBoKSB7XG4gICAgICBnbHlwaHNbc3RhcnRdLnNoYXBlckluZm8ucG9zaXRpb24gPSBQT1NJVElPTlMuUmFfVG9fQmVjb21lX1JlcGg7XG4gICAgfSAvLyBGb3Igb2xkLXN0eWxlIEluZGljIHNjcmlwdCB0YWdzLCBtb3ZlIHRoZSBmaXJzdCBwb3N0LWJhc2UgSGFsYW50IGFmdGVyXG4gICAgLy8gbGFzdCBjb25zb25hbnQuXG4gICAgLy9cbiAgICAvLyBSZXBvcnRzIHN1Z2dlc3QgdGhhdCBpbiBzb21lIHNjcmlwdHMgVW5pc2NyaWJlIGRvZXMgdGhpcyBvbmx5IGlmIHRoZXJlXG4gICAgLy8gaXMgKm5vdCogYSBIYWxhbnQgYWZ0ZXIgbGFzdCBjb25zb25hbnQgYWxyZWFkeSAoZWcuIEthbm5hZGEpLCB3aGlsZSBpdFxuICAgIC8vIGRvZXMgaXQgdW5jb25kaXRpb25hbGx5IGluIG90aGVyIHNjcmlwdHMgKGVnLiBNYWxheWFsYW0pLiAgV2UgZG9uJ3RcbiAgICAvLyBjdXJyZW50bHkga25vdyBhYm91dCBvdGhlciBzY3JpcHRzLCBzbyB3ZSBzaW5nbGUgb3V0IE1hbGF5YWxhbSBmb3Igbm93LlxuICAgIC8vXG4gICAgLy8gS2FubmFkYSB0ZXN0IGNhc2U6XG4gICAgLy8gVSswQzlBLFUrMENDRCxVKzBDOUEsVSswQ0NEXG4gICAgLy8gV2l0aCBzb21lIHZlcnNpb25zIG9mIExvaGl0IEthbm5hZGEuXG4gICAgLy8gaHR0cHM6Ly9idWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTkxMThcbiAgICAvL1xuICAgIC8vIE1hbGF5YWxhbSB0ZXN0IGNhc2U6XG4gICAgLy8gVSswRDM4LFUrMEQ0RCxVKzBEMzEsVSswRDRELFUrMEQzMSxVKzBENERcbiAgICAvLyBXaXRoIGxvaGl0LXR0Zi0yMDEyMTEyMi9Mb2hpdC1NYWxheWFsYW0udHRmXG5cblxuICAgIGlmIChwbGFuLmlzT2xkU3BlYykge1xuICAgICAgdmFyIGRpc2FsbG93RG91YmxlSGFsYW50cyA9IHBsYW4udW5pY29kZVNjcmlwdCAhPT0gJ01hbGF5YWxhbSc7XG5cbiAgICAgIGZvciAodmFyIF9pOCA9IGJhc2UgKyAxOyBfaTggPCBlbmQ7IF9pOCsrKSB7XG4gICAgICAgIGlmIChnbHlwaHNbX2k4XS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLkgpIHtcbiAgICAgICAgICB2YXIgX2ogPSB2b2lkIDA7XG5cbiAgICAgICAgICBmb3IgKF9qID0gZW5kIC0gMTsgX2ogPiBfaTg7IF9qLS0pIHtcbiAgICAgICAgICAgIGlmIChpc0NvbnNvbmFudChnbHlwaHNbX2pdKSB8fCBkaXNhbGxvd0RvdWJsZUhhbGFudHMgJiYgZ2x5cGhzW19qXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLkgpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGdseXBoc1tfal0uc2hhcGVySW5mby5jYXRlZ29yeSAhPT0gQ0FURUdPUklFUy5IICYmIF9qID4gX2k4KSB7XG4gICAgICAgICAgICAvLyBNb3ZlIEhhbGFudCB0byBhZnRlciBsYXN0IGNvbnNvbmFudC5cbiAgICAgICAgICAgIHZhciB0ID0gZ2x5cGhzW19pOF07XG4gICAgICAgICAgICBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW19pOCwgMF0uY29uY2F0KGdseXBocy5zcGxpY2UoX2k4ICsgMSwgX2ogLSBfaTgpKSk7XG4gICAgICAgICAgICBnbHlwaHNbX2pdID0gdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gQXR0YWNoIG1pc2MgbWFya3MgdG8gcHJldmlvdXMgY2hhciB0byBtb3ZlIHdpdGggdGhlbS5cblxuXG4gICAgdmFyIGxhc3RQb3MgPSBQT1NJVElPTlMuU3RhcnQ7XG5cbiAgICBmb3IgKHZhciBfaTkgPSBzdGFydDsgX2k5IDwgZW5kOyBfaTkrKykge1xuICAgICAgdmFyIF9pbmZvMyA9IGdseXBoc1tfaTldLnNoYXBlckluZm87XG5cbiAgICAgIGlmIChfaW5mbzMuY2F0ZWdvcnkgJiAoSk9JTkVSX0ZMQUdTIHwgQ0FURUdPUklFUy5OIHwgQ0FURUdPUklFUy5SUyB8IENBVEVHT1JJRVMuQ00gfCBIQUxBTlRfT1JfQ09FTkdfRkxBR1MgJiBfaW5mbzMuY2F0ZWdvcnkpKSB7XG4gICAgICAgIF9pbmZvMy5wb3NpdGlvbiA9IGxhc3RQb3M7XG5cbiAgICAgICAgaWYgKF9pbmZvMy5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5IICYmIF9pbmZvMy5wb3NpdGlvbiA9PT0gUE9TSVRJT05TLlByZV9NKSB7XG4gICAgICAgICAgLy8gVW5pc2NyaWJlIGRvZXNuJ3QgbW92ZSB0aGUgSGFsYW50IHdpdGggTGVmdCBNYXRyYS5cbiAgICAgICAgICAvLyBURVNUOiBVKzA5MkIsVSswOTNGLFUrMDk0REVcbiAgICAgICAgICAvLyBXZSBmb2xsb3cuICBUaGlzIGlzIGltcG9ydGFudCBmb3IgdGhlIFNpbmhhbGFcbiAgICAgICAgICAvLyBVKzBEREEgc3BsaXQgbWF0cmEgc2luY2UgaXQgZGVjb21wb3NlcyB0byBVKzBERDksVSswRENBXG4gICAgICAgICAgLy8gd2hlcmUgVSswREQ5IGlzIGEgbGVmdCBtYXRyYSBhbmQgVSswRENBIGlzIHRoZSB2aXJhbWEuXG4gICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBtb3ZlIHRoZSB2aXJhbWEgd2l0aCB0aGUgbGVmdCBtYXRyYS5cbiAgICAgICAgICAvLyBURVNUOiBVKzBEOUEsVSswRERBXG4gICAgICAgICAgZm9yICh2YXIgX2oyID0gX2k5OyBfajIgPiBzdGFydDsgX2oyLS0pIHtcbiAgICAgICAgICAgIGlmIChnbHlwaHNbX2oyIC0gMV0uc2hhcGVySW5mby5wb3NpdGlvbiAhPT0gUE9TSVRJT05TLlByZV9NKSB7XG4gICAgICAgICAgICAgIF9pbmZvMy5wb3NpdGlvbiA9IGdseXBoc1tfajIgLSAxXS5zaGFwZXJJbmZvLnBvc2l0aW9uO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoX2luZm8zLnBvc2l0aW9uICE9PSBQT1NJVElPTlMuU01WRCkge1xuICAgICAgICBsYXN0UG9zID0gX2luZm8zLnBvc2l0aW9uO1xuICAgICAgfVxuICAgIH0gLy8gRm9yIHBvc3QtYmFzZSBjb25zb25hbnRzIGxldCB0aGVtIG93biBhbnl0aGluZyBiZWZvcmUgdGhlbVxuICAgIC8vIHNpbmNlIHRoZSBsYXN0IGNvbnNvbmFudCBvciBtYXRyYS5cblxuXG4gICAgdmFyIGxhc3QgPSBiYXNlO1xuXG4gICAgZm9yICh2YXIgX2kxMCA9IGJhc2UgKyAxOyBfaTEwIDwgZW5kOyBfaTEwKyspIHtcbiAgICAgIGlmIChpc0NvbnNvbmFudChnbHlwaHNbX2kxMF0pKSB7XG4gICAgICAgIGZvciAodmFyIF9qMyA9IGxhc3QgKyAxOyBfajMgPCBfaTEwOyBfajMrKykge1xuICAgICAgICAgIGlmIChnbHlwaHNbX2ozXS5zaGFwZXJJbmZvLnBvc2l0aW9uIDwgUE9TSVRJT05TLlNNVkQpIHtcbiAgICAgICAgICAgIGdseXBoc1tfajNdLnNoYXBlckluZm8ucG9zaXRpb24gPSBnbHlwaHNbX2kxMF0uc2hhcGVySW5mby5wb3NpdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0ID0gX2kxMDtcbiAgICAgIH0gZWxzZSBpZiAoZ2x5cGhzW19pMTBdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuTSkge1xuICAgICAgICBsYXN0ID0gX2kxMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYXJyID0gZ2x5cGhzLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgIGFyci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS5zaGFwZXJJbmZvLnBvc2l0aW9uIC0gYi5zaGFwZXJJbmZvLnBvc2l0aW9uO1xuICAgIH0pO1xuICAgIGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbc3RhcnQsIGFyci5sZW5ndGhdLmNvbmNhdChhcnIpKTsgLy8gRmluZCBiYXNlIGFnYWluXG5cbiAgICBmb3IgKHZhciBfaTExID0gc3RhcnQ7IF9pMTEgPCBlbmQ7IF9pMTErKykge1xuICAgICAgaWYgKGdseXBoc1tfaTExXS5zaGFwZXJJbmZvLnBvc2l0aW9uID09PSBQT1NJVElPTlMuQmFzZV9DKSB7XG4gICAgICAgIGJhc2UgPSBfaTExO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IC8vIFNldHVwIGZlYXR1cmVzIG5vd1xuICAgIC8vIFJlcGhcblxuXG4gICAgZm9yICh2YXIgX2kxMiA9IHN0YXJ0OyBfaTEyIDwgZW5kICYmIGdseXBoc1tfaTEyXS5zaGFwZXJJbmZvLnBvc2l0aW9uID09PSBQT1NJVElPTlMuUmFfVG9fQmVjb21lX1JlcGg7IF9pMTIrKykge1xuICAgICAgZ2x5cGhzW19pMTJdLmZlYXR1cmVzLnJwaGYgPSB0cnVlO1xuICAgIH0gLy8gUHJlLWJhc2VcblxuXG4gICAgdmFyIGJsd2YgPSAhcGxhbi5pc09sZFNwZWMgJiYgaW5kaWNDb25maWcuYmx3Zk1vZGUgPT09ICdQcmVfQW5kX1Bvc3QnO1xuXG4gICAgZm9yICh2YXIgX2kxMyA9IHN0YXJ0OyBfaTEzIDwgYmFzZTsgX2kxMysrKSB7XG4gICAgICBnbHlwaHNbX2kxM10uZmVhdHVyZXMuaGFsZiA9IHRydWU7XG5cbiAgICAgIGlmIChibHdmKSB7XG4gICAgICAgIGdseXBoc1tfaTEzXS5mZWF0dXJlcy5ibHdmID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IC8vIFBvc3QtYmFzZVxuXG5cbiAgICBmb3IgKHZhciBfaTE0ID0gYmFzZSArIDE7IF9pMTQgPCBlbmQ7IF9pMTQrKykge1xuICAgICAgZ2x5cGhzW19pMTRdLmZlYXR1cmVzLmFidmYgPSB0cnVlO1xuICAgICAgZ2x5cGhzW19pMTRdLmZlYXR1cmVzLnBzdGYgPSB0cnVlO1xuICAgICAgZ2x5cGhzW19pMTRdLmZlYXR1cmVzLmJsd2YgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwbGFuLmlzT2xkU3BlYyAmJiBwbGFuLnVuaWNvZGVTY3JpcHQgPT09ICdEZXZhbmFnYXJpJykge1xuICAgICAgLy8gT2xkLXNwZWMgZXllLWxhc2ggUmEgbmVlZHMgc3BlY2lhbCBoYW5kbGluZy4gIEZyb20gdGhlXG4gICAgICAvLyBzcGVjOlxuICAgICAgLy9cbiAgICAgIC8vIFwiVGhlIGZlYXR1cmUgJ2JlbG93LWJhc2UgZm9ybScgaXMgYXBwbGllZCB0byBjb25zb25hbnRzXG4gICAgICAvLyBoYXZpbmcgYmVsb3ctYmFzZSBmb3JtcyBhbmQgZm9sbG93aW5nIHRoZSBiYXNlIGNvbnNvbmFudC5cbiAgICAgIC8vIFRoZSBleGNlcHRpb24gaXMgdmF0dHUsIHdoaWNoIG1heSBhcHBlYXIgYmVsb3cgaGFsZiBmb3Jtc1xuICAgICAgLy8gYXMgd2VsbCBhcyBiZWxvdyB0aGUgYmFzZSBnbHlwaC4gVGhlIGZlYXR1cmUgJ2JlbG93LWJhc2VcbiAgICAgIC8vIGZvcm0nIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgc3VjaCBvY2N1cnJlbmNlcyBvZiBSYSBhcyB3ZWxsLlwiXG4gICAgICAvL1xuICAgICAgLy8gVGVzdCBjYXNlOiBVKzA5MjQsVSswOTRELFUrMDkzMCxVKzA5NGQsVSswOTE1XG4gICAgICAvLyB3aXRoIFNhbnNrcml0IDIwMDMgZm9udC5cbiAgICAgIC8vXG4gICAgICAvLyBIb3dldmVyLCBub3RlIHRoYXQgUmEsSGFsYW50LFpXSiBpcyB0aGUgY29ycmVjdCB3YXkgdG9cbiAgICAgIC8vIHJlcXVlc3QgZXllbGFzaCBmb3JtIG9mIFJhLCBzbyB3ZSB3b3VsZGJuJ3QgaW5oaWJpdCBpdFxuICAgICAgLy8gaW4gdGhhdCBzZXF1ZW5jZS5cbiAgICAgIC8vXG4gICAgICAvLyBUZXN0IGNhc2U6IFUrMDkyNCxVKzA5NEQsVSswOTMwLFUrMDk0ZCxVKzIwMEQsVSswOTE1XG4gICAgICBmb3IgKHZhciBfaTE1ID0gc3RhcnQ7IF9pMTUgKyAxIDwgYmFzZTsgX2kxNSsrKSB7XG4gICAgICAgIGlmIChnbHlwaHNbX2kxNV0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5SYSAmJiBnbHlwaHNbX2kxNSArIDFdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuSCAmJiAoX2kxNSArIDEgPT09IGJhc2UgfHwgZ2x5cGhzW19pMTUgKyAyXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLlpXSikpIHtcbiAgICAgICAgICBnbHlwaHNbX2kxNV0uZmVhdHVyZXMuYmx3ZiA9IHRydWU7XG4gICAgICAgICAgZ2x5cGhzW19pMTUgKyAxXS5mZWF0dXJlcy5ibHdmID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmVmTGVuID0gMjtcblxuICAgIGlmIChmZWF0dXJlcy5wcmVmICYmIGJhc2UgKyBwcmVmTGVuIDwgZW5kKSB7XG4gICAgICAvLyBGaW5kIGEgSGFsYW50LFJhIHNlcXVlbmNlIGFuZCBtYXJrIGl0IGZvciBwcmUtYmFzZSByZW9yZGVyaW5nIHByb2Nlc3NpbmcuXG4gICAgICBmb3IgKHZhciBfaTE2ID0gYmFzZSArIDE7IF9pMTYgKyBwcmVmTGVuIC0gMSA8IGVuZDsgX2kxNisrKSB7XG4gICAgICAgIHZhciBfZzIgPSBbZ2x5cGhzW19pMTZdLmNvcHkoKSwgZ2x5cGhzW19pMTYgKyAxXS5jb3B5KCldO1xuXG4gICAgICAgIGlmICh3b3VsZFN1YnN0aXR1dGUoX2cyLCAncHJlZicpKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2o0ID0gMDsgX2o0IDwgcHJlZkxlbjsgX2o0KyspIHtcbiAgICAgICAgICAgIGdseXBoc1tfaTE2KytdLmZlYXR1cmVzLnByZWYgPSB0cnVlO1xuICAgICAgICAgIH0gLy8gTWFyayB0aGUgc3Vic2VxdWVudCBzdHVmZiB3aXRoICdjZmFyJy4gIFVzZWQgaW4gS2htZXIuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgZmVhdHVyZSBzcGVjLlxuICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGRpc3Rpbmd1aXNoaW5nIHRoZSBmb2xsb3dpbmcgY2FzZXMgd2l0aCBNUyBLaG1lciBmb250czpcbiAgICAgICAgICAvLyBVKzE3ODQsVSsxN0QyLFUrMTc5QSxVKzE3RDIsVSsxNzgyXG4gICAgICAgICAgLy8gVSsxNzg0LFUrMTdEMixVKzE3ODIsVSsxN0QyLFUrMTc5QVxuXG5cbiAgICAgICAgICBpZiAoZmVhdHVyZXMuY2Zhcikge1xuICAgICAgICAgICAgZm9yICg7IF9pMTYgPCBlbmQ7IF9pMTYrKykge1xuICAgICAgICAgICAgICBnbHlwaHNbX2kxNl0uZmVhdHVyZXMuY2ZhciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIEFwcGx5IFpXSi9aV05KIGVmZmVjdHNcblxuXG4gICAgZm9yICh2YXIgX2kxNyA9IHN0YXJ0ICsgMTsgX2kxNyA8IGVuZDsgX2kxNysrKSB7XG4gICAgICBpZiAoaXNKb2luZXIoZ2x5cGhzW19pMTddKSkge1xuICAgICAgICB2YXIgbm9uSm9pbmVyID0gZ2x5cGhzW19pMTddLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuWldOSjtcbiAgICAgICAgdmFyIF9qNSA9IF9pMTc7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIF9qNS0tOyAvLyBaV0ovWldOSiBzaG91bGQgZGlzYWJsZSBDSkNULiAgVGhleSBkbyB0aGF0IGJ5IHNpbXBseVxuICAgICAgICAgIC8vIGJlaW5nIHRoZXJlLCBzaW5jZSB3ZSBkb24ndCBza2lwIHRoZW0gZm9yIHRoZSBDSkNUXG4gICAgICAgICAgLy8gZmVhdHVyZSAoaWUuIEZfTUFOVUFMX1pXSilcbiAgICAgICAgICAvLyBBIFpXTkogZGlzYWJsZXMgSEFMRi5cblxuICAgICAgICAgIGlmIChub25Kb2luZXIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBnbHlwaHNbX2o1XS5mZWF0dXJlcy5oYWxmO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoX2o1ID4gc3RhcnQgJiYgIWlzQ29uc29uYW50KGdseXBoc1tfajVdKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmFsUmVvcmRlcmluZyhmb250LCBnbHlwaHMsIHBsYW4pIHtcbiAgdmFyIGluZGljQ29uZmlnID0gcGxhbi5pbmRpY0NvbmZpZztcbiAgdmFyIGZlYXR1cmVzID0gZm9udC5fbGF5b3V0RW5naW5lLmVuZ2luZS5HU1VCUHJvY2Vzc29yLmZlYXR1cmVzO1xuXG4gIGZvciAodmFyIHN0YXJ0ID0gMCwgZW5kID0gbmV4dFN5bGxhYmxlKGdseXBocywgMCk7IHN0YXJ0IDwgZ2x5cGhzLmxlbmd0aDsgc3RhcnQgPSBlbmQsIGVuZCA9IG5leHRTeWxsYWJsZShnbHlwaHMsIHN0YXJ0KSkge1xuICAgIC8vIDQuIEZpbmFsIHJlb3JkZXJpbmc6XG4gICAgLy9cbiAgICAvLyBBZnRlciB0aGUgbG9jYWxpemVkIGZvcm1zIGFuZCBiYXNpYyBzaGFwaW5nIGZvcm1zIEdTVUIgZmVhdHVyZXMgaGF2ZSBiZWVuXG4gICAgLy8gYXBwbGllZCAoc2VlIGJlbG93KSwgdGhlIHNoYXBpbmcgZW5naW5lIHBlcmZvcm1zIHNvbWUgZmluYWwgZ2x5cGhcbiAgICAvLyByZW9yZGVyaW5nIGJlZm9yZSBhcHBseWluZyBhbGwgdGhlIHJlbWFpbmluZyBmb250IGZlYXR1cmVzIHRvIHRoZSBlbnRpcmVcbiAgICAvLyBjbHVzdGVyLlxuICAgIHZhciB0cnlQcmVmID0gISFmZWF0dXJlcy5wcmVmOyAvLyBGaW5kIGJhc2UgYWdhaW5cblxuICAgIHZhciBiYXNlID0gc3RhcnQ7XG5cbiAgICBmb3IgKDsgYmFzZSA8IGVuZDsgYmFzZSsrKSB7XG4gICAgICBpZiAoZ2x5cGhzW2Jhc2VdLnNoYXBlckluZm8ucG9zaXRpb24gPj0gUE9TSVRJT05TLkJhc2VfQykge1xuICAgICAgICBpZiAodHJ5UHJlZiAmJiBiYXNlICsgMSA8IGVuZCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSBiYXNlICsgMTsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZ2x5cGhzW2ldLmZlYXR1cmVzLnByZWYpIHtcbiAgICAgICAgICAgICAgaWYgKCEoZ2x5cGhzW2ldLnN1YnN0aXR1dGVkICYmIGdseXBoc1tpXS5pc0xpZ2F0ZWQgJiYgIWdseXBoc1tpXS5pc011bHRpcGxpZWQpKSB7XG4gICAgICAgICAgICAgICAgLy8gT2ssIHRoaXMgd2FzIGEgJ3ByZWYnIGNhbmRpZGF0ZSBidXQgZGlkbid0IGZvcm0gYW55LlxuICAgICAgICAgICAgICAgIC8vIEJhc2UgaXMgYXJvdW5kIGhlcmUuLi5cbiAgICAgICAgICAgICAgICBiYXNlID0gaTtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChiYXNlIDwgZW5kICYmIGlzSGFsYW50T3JDb2VuZyhnbHlwaHNbYmFzZV0pKSB7XG4gICAgICAgICAgICAgICAgICBiYXNlKys7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZ2x5cGhzW2Jhc2VdLnNoYXBlckluZm8ucG9zaXRpb24gPSBQT1NJVElPTlMuQkFTRV9DO1xuICAgICAgICAgICAgICAgIHRyeVByZWYgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBGb3IgTWFsYXlhbGFtLCBza2lwIG92ZXIgdW5mb3JtZWQgYmVsb3ctIChidXQgTk9UIHBvc3QtKSBmb3Jtcy5cblxuXG4gICAgICAgIGlmIChwbGFuLnVuaWNvZGVTY3JpcHQgPT09ICdNYWxheWFsYW0nKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2kxOCA9IGJhc2UgKyAxOyBfaTE4IDwgZW5kOyBfaTE4KyspIHtcbiAgICAgICAgICAgIHdoaWxlIChfaTE4IDwgZW5kICYmIGlzSm9pbmVyKGdseXBoc1tfaTE4XSkpIHtcbiAgICAgICAgICAgICAgX2kxOCsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoX2kxOCA9PT0gZW5kIHx8ICFpc0hhbGFudE9yQ29lbmcoZ2x5cGhzW19pMThdKSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX2kxOCsrOyAvLyBTa2lwIGhhbGFudC5cblxuICAgICAgICAgICAgd2hpbGUgKF9pMTggPCBlbmQgJiYgaXNKb2luZXIoZ2x5cGhzW19pMThdKSkge1xuICAgICAgICAgICAgICBfaTE4Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfaTE4IDwgZW5kICYmIGlzQ29uc29uYW50KGdseXBoc1tfaTE4XSkgJiYgZ2x5cGhzW19pMThdLnNoYXBlckluZm8ucG9zaXRpb24gPT09IFBPU0lUSU9OUy5CZWxvd19DKSB7XG4gICAgICAgICAgICAgIGJhc2UgPSBfaTE4O1xuICAgICAgICAgICAgICBnbHlwaHNbYmFzZV0uc2hhcGVySW5mby5wb3NpdGlvbiA9IFBPU0lUSU9OUy5CYXNlX0M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXJ0IDwgYmFzZSAmJiBnbHlwaHNbYmFzZV0uc2hhcGVySW5mby5wb3NpdGlvbiA+IFBPU0lUSU9OUy5CYXNlX0MpIHtcbiAgICAgICAgICBiYXNlLS07XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gZW5kICYmIHN0YXJ0IDwgYmFzZSAmJiBnbHlwaHNbYmFzZSAtIDFdLnNoYXBlckluZm8uY2F0ZWdvcnkgPT09IENBVEVHT1JJRVMuWldKKSB7XG4gICAgICBiYXNlLS07XG4gICAgfVxuXG4gICAgaWYgKGJhc2UgPCBlbmQpIHtcbiAgICAgIHdoaWxlIChzdGFydCA8IGJhc2UgJiYgZ2x5cGhzW2Jhc2VdLnNoYXBlckluZm8uY2F0ZWdvcnkgJiAoQ0FURUdPUklFUy5OIHwgSEFMQU5UX09SX0NPRU5HX0ZMQUdTKSkge1xuICAgICAgICBiYXNlLS07XG4gICAgICB9XG4gICAgfSAvLyBvIFJlb3JkZXIgbWF0cmFzOlxuICAgIC8vXG4gICAgLy8gSWYgYSBwcmUtYmFzZSBtYXRyYSBjaGFyYWN0ZXIgaGFkIGJlZW4gcmVvcmRlcmVkIGJlZm9yZSBhcHBseWluZyBiYXNpY1xuICAgIC8vIGZlYXR1cmVzLCB0aGUgZ2x5cGggY2FuIGJlIG1vdmVkIGNsb3NlciB0byB0aGUgbWFpbiBjb25zb25hbnQgYmFzZWQgb25cbiAgICAvLyB3aGV0aGVyIGhhbGYtZm9ybXMgaGFkIGJlZW4gZm9ybWVkLiBBY3R1YWwgcG9zaXRpb24gZm9yIHRoZSBtYXRyYSBpc1xuICAgIC8vIGRlZmluZWQgYXMg4oCcYWZ0ZXIgbGFzdCBzdGFuZGFsb25lIGhhbGFudCBnbHlwaCwgYWZ0ZXIgaW5pdGlhbCBtYXRyYVxuICAgIC8vIHBvc2l0aW9uIGFuZCBiZWZvcmUgdGhlIG1haW4gY29uc29uYW504oCdLiBJZiBaV0ogb3IgWldOSiBmb2xsb3cgdGhpc1xuICAgIC8vIGhhbGFudCwgcG9zaXRpb24gaXMgbW92ZWQgYWZ0ZXIgaXQuXG4gICAgLy9cblxuXG4gICAgaWYgKHN0YXJ0ICsgMSA8IGVuZCAmJiBzdGFydCA8IGJhc2UpIHtcbiAgICAgIC8vIE90aGVyd2lzZSB0aGVyZSBjYW4ndCBiZSBhbnkgcHJlLWJhc2UgbWF0cmEgY2hhcmFjdGVycy5cbiAgICAgIC8vIElmIHdlIGxvc3QgdHJhY2sgb2YgYmFzZSwgYWxhcywgcG9zaXRpb24gYmVmb3JlIGxhc3QgdGhpbmd5LlxuICAgICAgdmFyIG5ld1BvcyA9IGJhc2UgPT09IGVuZCA/IGJhc2UgLSAyIDogYmFzZSAtIDE7IC8vIE1hbGF5YWxhbSAvIFRhbWlsIGRvIG5vdCBoYXZlIFwiaGFsZlwiIGZvcm1zIG9yIGV4cGxpY2l0IHZpcmFtYSBmb3Jtcy5cbiAgICAgIC8vIFRoZSBnbHlwaHMgZm9ybWVkIGJ5ICdoYWxmJyBhcmUgQ2hpbGx1cyBvciBsaWdhdGVkIGV4cGxpY2l0IHZpcmFtYXMuXG4gICAgICAvLyBXZSB3YW50IHRvIHBvc2l0aW9uIG1hdHJhIGFmdGVyIHRoZW0uXG5cbiAgICAgIGlmIChwbGFuLnVuaWNvZGVTY3JpcHQgIT09ICdNYWxheWFsYW0nICYmIHBsYW4udW5pY29kZVNjcmlwdCAhPT0gJ1RhbWlsJykge1xuICAgICAgICB3aGlsZSAobmV3UG9zID4gc3RhcnQgJiYgIShnbHlwaHNbbmV3UG9zXS5zaGFwZXJJbmZvLmNhdGVnb3J5ICYgKENBVEVHT1JJRVMuTSB8IEhBTEFOVF9PUl9DT0VOR19GTEFHUykpKSB7XG4gICAgICAgICAgbmV3UG9zLS07XG4gICAgICAgIH0gLy8gSWYgd2UgZm91bmQgbm8gSGFsYW50IHdlIGFyZSBkb25lLlxuICAgICAgICAvLyBPdGhlcndpc2Ugb25seSBwcm9jZWVkIGlmIHRoZSBIYWxhbnQgZG9lc1xuICAgICAgICAvLyBub3QgYmVsb25nIHRvIHRoZSBNYXRyYSBpdHNlbGYhXG5cblxuICAgICAgICBpZiAoaXNIYWxhbnRPckNvZW5nKGdseXBoc1tuZXdQb3NdKSAmJiBnbHlwaHNbbmV3UG9zXS5zaGFwZXJJbmZvLnBvc2l0aW9uICE9PSBQT1NJVElPTlMuUHJlX00pIHtcbiAgICAgICAgICAvLyBJZiBaV0ogb3IgWldOSiBmb2xsb3cgdGhpcyBoYWxhbnQsIHBvc2l0aW9uIGlzIG1vdmVkIGFmdGVyIGl0LlxuICAgICAgICAgIGlmIChuZXdQb3MgKyAxIDwgZW5kICYmIGlzSm9pbmVyKGdseXBoc1tuZXdQb3MgKyAxXSkpIHtcbiAgICAgICAgICAgIG5ld1BvcysrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdQb3MgPSBzdGFydDsgLy8gTm8gbW92ZS5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RhcnQgPCBuZXdQb3MgJiYgZ2x5cGhzW25ld1Bvc10uc2hhcGVySW5mby5wb3NpdGlvbiAhPT0gUE9TSVRJT05TLlByZV9NKSB7XG4gICAgICAgIC8vIE5vdyBnbyBzZWUgaWYgdGhlcmUncyBhY3R1YWxseSBhbnkgbWF0cmFzLi4uXG4gICAgICAgIGZvciAodmFyIF9pMTkgPSBuZXdQb3M7IF9pMTkgPiBzdGFydDsgX2kxOS0tKSB7XG4gICAgICAgICAgaWYgKGdseXBoc1tfaTE5IC0gMV0uc2hhcGVySW5mby5wb3NpdGlvbiA9PT0gUE9TSVRJT05TLlByZV9NKSB7XG4gICAgICAgICAgICB2YXIgb2xkUG9zID0gX2kxOSAtIDE7XG5cbiAgICAgICAgICAgIGlmIChvbGRQb3MgPCBiYXNlICYmIGJhc2UgPD0gbmV3UG9zKSB7XG4gICAgICAgICAgICAgIC8vIFNob3VsZG4ndCBhY3R1YWxseSBoYXBwZW4uXG4gICAgICAgICAgICAgIGJhc2UtLTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRtcCA9IGdseXBoc1tvbGRQb3NdO1xuICAgICAgICAgICAgZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtvbGRQb3MsIDBdLmNvbmNhdChnbHlwaHMuc3BsaWNlKG9sZFBvcyArIDEsIG5ld1BvcyAtIG9sZFBvcykpKTtcbiAgICAgICAgICAgIGdseXBoc1tuZXdQb3NdID0gdG1wO1xuICAgICAgICAgICAgbmV3UG9zLS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBvIFJlb3JkZXIgcmVwaDpcbiAgICAvL1xuICAgIC8vIFJlcGjigJlzIG9yaWdpbmFsIHBvc2l0aW9uIGlzIGFsd2F5cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzeWxsYWJsZSxcbiAgICAvLyAoaS5lLiBpdCBpcyBub3QgcmVvcmRlcmVkIGF0IHRoZSBjaGFyYWN0ZXIgcmVvcmRlcmluZyBzdGFnZSkuIEhvd2V2ZXIsXG4gICAgLy8gaXQgd2lsbCBiZSByZW9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZSBiYXNpYy1mb3JtcyBzaGFwaW5nIHJlc3VsdHMuXG4gICAgLy8gUG9zc2libGUgcG9zaXRpb25zIGZvciByZXBoLCBkZXBlbmRpbmcgb24gdGhlIHNjcmlwdCwgYXJlOyBhZnRlciBtYWluLFxuICAgIC8vIGJlZm9yZSBwb3N0LWJhc2UgY29uc29uYW50IGZvcm1zLCBhbmQgYWZ0ZXIgcG9zdC1iYXNlIGNvbnNvbmFudCBmb3Jtcy5cbiAgICAvLyBUd28gY2FzZXM6XG4gICAgLy9cbiAgICAvLyAtIElmIHJlcGhhIGlzIGVuY29kZWQgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIChSYSxIIG9yIFJhLEgsWldKKSwgdGhlblxuICAgIC8vICAgd2Ugc2hvdWxkIG9ubHkgbW92ZSBpdCBpZiB0aGUgc2VxdWVuY2UgbGlnYXRlZCB0byB0aGUgcmVwaGEgZm9ybS5cbiAgICAvL1xuICAgIC8vIC0gSWYgcmVwaGEgaXMgZW5jb2RlZCBzZXBhcmF0ZWx5IGFuZCBpbiB0aGUgbG9naWNhbCBwb3NpdGlvbiwgd2Ugc2hvdWxkIG9ubHlcbiAgICAvLyAgIG1vdmUgaXQgaWYgaXQgZGlkIE5PVCBsaWdhdGUuICBJZiBpdCBsaWdhdGVkLCBpdCdzIHByb2JhYmx5IHRoZSBmb250IHRyeWluZ1xuICAgIC8vICAgdG8gbWFrZSBpdCB3b3JrIHdpdGhvdXQgdGhlIHJlb3JkZXJpbmcuXG5cblxuICAgIGlmIChzdGFydCArIDEgPCBlbmQgJiYgZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLnBvc2l0aW9uID09PSBQT1NJVElPTlMuUmFfVG9fQmVjb21lX1JlcGggJiYgZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLlJlcGhhICE9PSAoZ2x5cGhzW3N0YXJ0XS5pc0xpZ2F0ZWQgJiYgIWdseXBoc1tzdGFydF0uaXNNdWx0aXBsaWVkKSkge1xuICAgICAgdmFyIG5ld1JlcGhQb3MgPSB2b2lkIDA7XG4gICAgICB2YXIgcmVwaFBvcyA9IGluZGljQ29uZmlnLnJlcGhQb3M7XG4gICAgICB2YXIgZm91bmQgPSBmYWxzZTsgLy8gMS4gSWYgcmVwaCBzaG91bGQgYmUgcG9zaXRpb25lZCBhZnRlciBwb3N0LWJhc2UgY29uc29uYW50IGZvcm1zLFxuICAgICAgLy8gICAgcHJvY2VlZCB0byBzdGVwIDUuXG5cbiAgICAgIGlmIChyZXBoUG9zICE9PSBQT1NJVElPTlMuQWZ0ZXJfUG9zdCkge1xuICAgICAgICAvLyAgMi4gSWYgdGhlIHJlcGggcmVwb3NpdGlvbmluZyBjbGFzcyBpcyBub3QgYWZ0ZXIgcG9zdC1iYXNlOiB0YXJnZXRcbiAgICAgICAgLy8gICAgIHBvc2l0aW9uIGlzIGFmdGVyIHRoZSBmaXJzdCBleHBsaWNpdCBoYWxhbnQgZ2x5cGggYmV0d2VlbiB0aGVcbiAgICAgICAgLy8gICAgIGZpcnN0IHBvc3QtcmVwaCBjb25zb25hbnQgYW5kIGxhc3QgbWFpbiBjb25zb25hbnQuIElmIFpXSiBvciBaV05KXG4gICAgICAgIC8vICAgICBhcmUgZm9sbG93aW5nIHRoaXMgaGFsYW50LCBwb3NpdGlvbiBpcyBtb3ZlZCBhZnRlciBpdC4gSWYgc3VjaFxuICAgICAgICAvLyAgICAgcG9zaXRpb24gaXMgZm91bmQsIHRoaXMgaXMgdGhlIHRhcmdldCBwb3NpdGlvbi4gT3RoZXJ3aXNlLFxuICAgICAgICAvLyAgICAgcHJvY2VlZCB0byB0aGUgbmV4dCBzdGVwLlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgTm90ZTogaW4gb2xkLWltcGxlbWVudGF0aW9uIGZvbnRzLCB3aGVyZSBjbGFzc2lmaWNhdGlvbnMgd2VyZVxuICAgICAgICAvLyAgICAgZml4ZWQgaW4gc2hhcGluZyBlbmdpbmUsIHRoZXJlIHdhcyBubyBjYXNlIHdoZXJlIHJlcGggcG9zaXRpb25cbiAgICAgICAgLy8gICAgIHdpbGwgYmUgZm91bmQgb24gdGhpcyBzdGVwLlxuICAgICAgICBuZXdSZXBoUG9zID0gc3RhcnQgKyAxO1xuXG4gICAgICAgIHdoaWxlIChuZXdSZXBoUG9zIDwgYmFzZSAmJiAhaXNIYWxhbnRPckNvZW5nKGdseXBoc1tuZXdSZXBoUG9zXSkpIHtcbiAgICAgICAgICBuZXdSZXBoUG9zKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3UmVwaFBvcyA8IGJhc2UgJiYgaXNIYWxhbnRPckNvZW5nKGdseXBoc1tuZXdSZXBoUG9zXSkpIHtcbiAgICAgICAgICAvLyAtPklmIFpXSiBvciBaV05KIGFyZSBmb2xsb3dpbmcgdGhpcyBoYWxhbnQsIHBvc2l0aW9uIGlzIG1vdmVkIGFmdGVyIGl0LlxuICAgICAgICAgIGlmIChuZXdSZXBoUG9zICsgMSA8IGJhc2UgJiYgaXNKb2luZXIoZ2x5cGhzW25ld1JlcGhQb3MgKyAxXSkpIHtcbiAgICAgICAgICAgIG5ld1JlcGhQb3MrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIH0gLy8gMy4gSWYgcmVwaCBzaG91bGQgYmUgcmVwb3NpdGlvbmVkIGFmdGVyIHRoZSBtYWluIGNvbnNvbmFudDogZmluZCB0aGVcbiAgICAgICAgLy8gICAgZmlyc3QgY29uc29uYW50IG5vdCBsaWdhdGVkIHdpdGggbWFpbiwgb3IgZmluZCB0aGUgZmlyc3RcbiAgICAgICAgLy8gICAgY29uc29uYW50IHRoYXQgaXMgbm90IGEgcG90ZW50aWFsIHByZS1iYXNlIHJlb3JkZXJpbmcgUmEuXG5cblxuICAgICAgICBpZiAoIWZvdW5kICYmIHJlcGhQb3MgPT09IFBPU0lUSU9OUy5BZnRlcl9NYWluKSB7XG4gICAgICAgICAgbmV3UmVwaFBvcyA9IGJhc2U7XG5cbiAgICAgICAgICB3aGlsZSAobmV3UmVwaFBvcyArIDEgPCBlbmQgJiYgZ2x5cGhzW25ld1JlcGhQb3MgKyAxXS5zaGFwZXJJbmZvLnBvc2l0aW9uIDw9IFBPU0lUSU9OUy5BZnRlcl9NYWluKSB7XG4gICAgICAgICAgICBuZXdSZXBoUG9zKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm91bmQgPSBuZXdSZXBoUG9zIDwgZW5kO1xuICAgICAgICB9IC8vIDQuIElmIHJlcGggc2hvdWxkIGJlIHBvc2l0aW9uZWQgYmVmb3JlIHBvc3QtYmFzZSBjb25zb25hbnQsIGZpbmRcbiAgICAgICAgLy8gICAgZmlyc3QgcG9zdC1iYXNlIGNsYXNzaWZpZWQgY29uc29uYW50IG5vdCBsaWdhdGVkIHdpdGggbWFpbi4gSWYgbm9cbiAgICAgICAgLy8gICAgY29uc29uYW50IGlzIGZvdW5kLCB0aGUgdGFyZ2V0IHBvc2l0aW9uIHNob3VsZCBiZSBiZWZvcmUgdGhlXG4gICAgICAgIC8vICAgIGZpcnN0IG1hdHJhLCBzeWxsYWJsZSBtb2RpZmllciBzaWduIG9yIHZlZGljIHNpZ24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgaXMgb3VyIHRha2Ugb24gd2hhdCBzdGVwIDQgaXMgdHJ5aW5nIHRvIHNheSAoYW5kIGZhaWxpbmcsIEJBRExZKS5cblxuXG4gICAgICAgIGlmICghZm91bmQgJiYgcmVwaFBvcyA9PT0gUE9TSVRJT05TLkFmdGVyX1N1Yikge1xuICAgICAgICAgIG5ld1JlcGhQb3MgPSBiYXNlO1xuXG4gICAgICAgICAgd2hpbGUgKG5ld1JlcGhQb3MgKyAxIDwgZW5kICYmICEoZ2x5cGhzW25ld1JlcGhQb3MgKyAxXS5zaGFwZXJJbmZvLnBvc2l0aW9uICYgKFBPU0lUSU9OUy5Qb3N0X0MgfCBQT1NJVElPTlMuQWZ0ZXJfUG9zdCB8IFBPU0lUSU9OUy5TTVZEKSkpIHtcbiAgICAgICAgICAgIG5ld1JlcGhQb3MrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3VuZCA9IG5ld1JlcGhQb3MgPCBlbmQ7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gIDUuIElmIG5vIGNvbnNvbmFudCBpcyBmb3VuZCBpbiBzdGVwcyAzIG9yIDQsIG1vdmUgcmVwaCB0byBhIHBvc2l0aW9uXG4gICAgICAvLyAgICAgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBmaXJzdCBwb3N0LWJhc2UgbWF0cmEsIHN5bGxhYmxlIG1vZGlmaWVyXG4gICAgICAvLyAgICAgc2lnbiBvciB2ZWRpYyBzaWduIHRoYXQgaGFzIGEgcmVvcmRlcmluZyBjbGFzcyBhZnRlciB0aGUgaW50ZW5kZWRcbiAgICAgIC8vICAgICByZXBoIHBvc2l0aW9uLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlb3JkZXJpbmcgcG9zaXRpb24gZm9yIHJlcGhcbiAgICAgIC8vICAgICBpcyBwb3N0LW1haW4sIGl0IHdpbGwgc2tpcCBhYm92ZS1iYXNlIG1hdHJhcyB0aGF0IGFsc28gaGF2ZSBhXG4gICAgICAvLyAgICAgcG9zdC1tYWluIHBvc2l0aW9uLlxuXG5cbiAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgLy8gQ29waWVkIGZyb20gc3RlcCAyLlxuICAgICAgICBuZXdSZXBoUG9zID0gc3RhcnQgKyAxO1xuXG4gICAgICAgIHdoaWxlIChuZXdSZXBoUG9zIDwgYmFzZSAmJiAhaXNIYWxhbnRPckNvZW5nKGdseXBoc1tuZXdSZXBoUG9zXSkpIHtcbiAgICAgICAgICBuZXdSZXBoUG9zKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3UmVwaFBvcyA8IGJhc2UgJiYgaXNIYWxhbnRPckNvZW5nKGdseXBoc1tuZXdSZXBoUG9zXSkpIHtcbiAgICAgICAgICAvLyAtPklmIFpXSiBvciBaV05KIGFyZSBmb2xsb3dpbmcgdGhpcyBoYWxhbnQsIHBvc2l0aW9uIGlzIG1vdmVkIGFmdGVyIGl0LlxuICAgICAgICAgIGlmIChuZXdSZXBoUG9zICsgMSA8IGJhc2UgJiYgaXNKb2luZXIoZ2x5cGhzW25ld1JlcGhQb3MgKyAxXSkpIHtcbiAgICAgICAgICAgIG5ld1JlcGhQb3MrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gNi4gT3RoZXJ3aXNlLCByZW9yZGVyIHJlcGggdG8gdGhlIGVuZCBvZiB0aGUgc3lsbGFibGUuXG5cblxuICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICBuZXdSZXBoUG9zID0gZW5kIC0gMTtcblxuICAgICAgICB3aGlsZSAobmV3UmVwaFBvcyA+IHN0YXJ0ICYmIGdseXBoc1tuZXdSZXBoUG9zXS5zaGFwZXJJbmZvLnBvc2l0aW9uID09PSBQT1NJVElPTlMuU01WRCkge1xuICAgICAgICAgIG5ld1JlcGhQb3MtLTtcbiAgICAgICAgfSAvLyBJZiB0aGUgUmVwaCBpcyB0byBiZSBlbmRpbmcgdXAgYWZ0ZXIgYSBNYXRyYSxIYWxhbnQgc2VxdWVuY2UsXG4gICAgICAgIC8vIHBvc2l0aW9uIGl0IGJlZm9yZSB0aGF0IEhhbGFudCBzbyBpdCBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgTWF0cmEuXG4gICAgICAgIC8vIEhvd2V2ZXIsIGlmIGl0J3MgYSBwbGFpbiBDb25zb25hbnQsSGFsYW50IHdlIHNob3VsZG4ndCBkbyB0aGF0LlxuICAgICAgICAvLyBVbmlzY3JpYmUgZG9lc24ndCBkbyB0aGlzLlxuICAgICAgICAvLyBURVNUOiBVKzA5MzAsVSswOTRELFUrMDkxNSxVKzA5NEIsVSswOTREXG5cblxuICAgICAgICBpZiAoaXNIYWxhbnRPckNvZW5nKGdseXBoc1tuZXdSZXBoUG9zXSkpIHtcbiAgICAgICAgICBmb3IgKHZhciBfaTIwID0gYmFzZSArIDE7IF9pMjAgPCBuZXdSZXBoUG9zOyBfaTIwKyspIHtcbiAgICAgICAgICAgIGlmIChnbHlwaHNbX2kyMF0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gQ0FURUdPUklFUy5NKSB7XG4gICAgICAgICAgICAgIG5ld1JlcGhQb3MtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHJlcGggPSBnbHlwaHNbc3RhcnRdO1xuICAgICAgZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtzdGFydCwgMF0uY29uY2F0KGdseXBocy5zcGxpY2Uoc3RhcnQgKyAxLCBuZXdSZXBoUG9zIC0gc3RhcnQpKSk7XG4gICAgICBnbHlwaHNbbmV3UmVwaFBvc10gPSByZXBoO1xuXG4gICAgICBpZiAoc3RhcnQgPCBiYXNlICYmIGJhc2UgPD0gbmV3UmVwaFBvcykge1xuICAgICAgICBiYXNlLS07XG4gICAgICB9XG4gICAgfSAvLyBvIFJlb3JkZXIgcHJlLWJhc2UgcmVvcmRlcmluZyBjb25zb25hbnRzOlxuICAgIC8vXG4gICAgLy8gSWYgYSBwcmUtYmFzZSByZW9yZGVyaW5nIGNvbnNvbmFudCBpcyBmb3VuZCwgcmVvcmRlciBpdCBhY2NvcmRpbmcgdG9cbiAgICAvLyB0aGUgZm9sbG93aW5nIHJ1bGVzOlxuXG5cbiAgICBpZiAodHJ5UHJlZiAmJiBiYXNlICsgMSA8IGVuZCkge1xuICAgICAgZm9yICh2YXIgX2kyMSA9IGJhc2UgKyAxOyBfaTIxIDwgZW5kOyBfaTIxKyspIHtcbiAgICAgICAgaWYgKGdseXBoc1tfaTIxXS5mZWF0dXJlcy5wcmVmKSB7XG4gICAgICAgICAgLy8gMS4gT25seSByZW9yZGVyIGEgZ2x5cGggcHJvZHVjZWQgYnkgc3Vic3RpdHV0aW9uIGR1cmluZyBhcHBsaWNhdGlvblxuICAgICAgICAgIC8vICAgIG9mIHRoZSA8cHJlZj4gZmVhdHVyZS4gKE5vdGUgdGhhdCBhIGZvbnQgbWF5IHNoYXBlIGEgUmEgY29uc29uYW50IHdpdGhcbiAgICAgICAgICAvLyAgICB0aGUgZmVhdHVyZSBnZW5lcmFsbHkgYnV0IGJsb2NrIGl0IGluIGNlcnRhaW4gY29udGV4dHMuKVxuICAgICAgICAgIC8vIE5vdGU6IFdlIGp1c3QgY2hlY2sgdGhhdCBzb21ldGhpbmcgZ290IHN1YnN0aXR1dGVkLiAgV2UgZG9uJ3QgY2hlY2sgdGhhdFxuICAgICAgICAgIC8vIHRoZSA8cHJlZj4gZmVhdHVyZSBhY3R1YWxseSBkaWQgaXQuLi5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFJlb3JkZXIgcHJlZiBvbmx5IGlmIGl0IGxpZ2F0ZWQuXG4gICAgICAgICAgaWYgKGdseXBoc1tfaTIxXS5pc0xpZ2F0ZWQgJiYgIWdseXBoc1tfaTIxXS5pc011bHRpcGxpZWQpIHtcbiAgICAgICAgICAgIC8vIDIuIFRyeSB0byBmaW5kIGEgdGFyZ2V0IHBvc2l0aW9uIHRoZSBzYW1lIHdheSBhcyBmb3IgcHJlLWJhc2UgbWF0cmEuXG4gICAgICAgICAgICAvLyAgICBJZiBpdCBpcyBmb3VuZCwgcmVvcmRlciBwcmUtYmFzZSBjb25zb25hbnQgZ2x5cGguXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gMy4gSWYgcG9zaXRpb24gaXMgbm90IGZvdW5kLCByZW9yZGVyIGltbWVkaWF0ZWx5IGJlZm9yZSBtYWluXG4gICAgICAgICAgICAvLyAgICBjb25zb25hbnQuXG4gICAgICAgICAgICB2YXIgX25ld1BvcyA9IGJhc2U7IC8vIE1hbGF5YWxhbSAvIFRhbWlsIGRvIG5vdCBoYXZlIFwiaGFsZlwiIGZvcm1zIG9yIGV4cGxpY2l0IHZpcmFtYSBmb3Jtcy5cbiAgICAgICAgICAgIC8vIFRoZSBnbHlwaHMgZm9ybWVkIGJ5ICdoYWxmJyBhcmUgQ2hpbGx1cyBvciBsaWdhdGVkIGV4cGxpY2l0IHZpcmFtYXMuXG4gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHBvc2l0aW9uIG1hdHJhIGFmdGVyIHRoZW0uXG5cbiAgICAgICAgICAgIGlmIChwbGFuLnVuaWNvZGVTY3JpcHQgIT09ICdNYWxheWFsYW0nICYmIHBsYW4udW5pY29kZVNjcmlwdCAhPT0gJ1RhbWlsJykge1xuICAgICAgICAgICAgICB3aGlsZSAoX25ld1BvcyA+IHN0YXJ0ICYmICEoZ2x5cGhzW19uZXdQb3MgLSAxXS5zaGFwZXJJbmZvLmNhdGVnb3J5ICYgKENBVEVHT1JJRVMuTSB8IEhBTEFOVF9PUl9DT0VOR19GTEFHUykpKSB7XG4gICAgICAgICAgICAgICAgX25ld1Bvcy0tO1xuICAgICAgICAgICAgICB9IC8vIEluIEtobWVyIGNvZW5nIG1vZGVsLCBhIEgsUmEgY2FuIGdvICphZnRlciogbWF0cmFzLiAgSWYgaXQgZ29lcyBhZnRlciBhXG4gICAgICAgICAgICAgIC8vIHNwbGl0IG1hdHJhLCBpdCBzaG91bGQgYmUgcmVvcmRlcmVkIHRvICpiZWZvcmUqIHRoZSBsZWZ0IHBhcnQgb2Ygc3VjaCBtYXRyYS5cblxuXG4gICAgICAgICAgICAgIGlmIChfbmV3UG9zID4gc3RhcnQgJiYgZ2x5cGhzW19uZXdQb3MgLSAxXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLk0pIHtcbiAgICAgICAgICAgICAgICB2YXIgX29sZFBvczIgPSBfaTIxO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IGJhc2UgKyAxOyBqIDwgX29sZFBvczI7IGorKykge1xuICAgICAgICAgICAgICAgICAgaWYgKGdseXBoc1tqXS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSBDQVRFR09SSUVTLk0pIHtcbiAgICAgICAgICAgICAgICAgICAgX25ld1Bvcy0tO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKF9uZXdQb3MgPiBzdGFydCAmJiBpc0hhbGFudE9yQ29lbmcoZ2x5cGhzW19uZXdQb3MgLSAxXSkpIHtcbiAgICAgICAgICAgICAgLy8gLT4gSWYgWldKIG9yIFpXTkogZm9sbG93IHRoaXMgaGFsYW50LCBwb3NpdGlvbiBpcyBtb3ZlZCBhZnRlciBpdC5cbiAgICAgICAgICAgICAgaWYgKF9uZXdQb3MgPCBlbmQgJiYgaXNKb2luZXIoZ2x5cGhzW19uZXdQb3NdKSkge1xuICAgICAgICAgICAgICAgIF9uZXdQb3MrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgX29sZFBvcyA9IF9pMjE7XG4gICAgICAgICAgICB2YXIgX3RtcCA9IGdseXBoc1tfb2xkUG9zXTtcbiAgICAgICAgICAgIGdseXBocy5zcGxpY2UuYXBwbHkoZ2x5cGhzLCBbX25ld1BvcyArIDEsIDBdLmNvbmNhdChnbHlwaHMuc3BsaWNlKF9uZXdQb3MsIF9vbGRQb3MgLSBfbmV3UG9zKSkpO1xuICAgICAgICAgICAgZ2x5cGhzW19uZXdQb3NdID0gX3RtcDtcblxuICAgICAgICAgICAgaWYgKF9uZXdQb3MgPD0gYmFzZSAmJiBiYXNlIDwgX29sZFBvcykge1xuICAgICAgICAgICAgICBiYXNlKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIEFwcGx5ICdpbml0JyB0byB0aGUgTGVmdCBNYXRyYSBpZiBpdCdzIGEgd29yZCBzdGFydC5cblxuXG4gICAgaWYgKGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5wb3NpdGlvbiA9PT0gUE9TSVRJT05TLlByZV9NICYmICghc3RhcnQgfHwgIS9DZnxNbi8udGVzdCh1bmljb2RlLmdldENhdGVnb3J5KGdseXBoc1tzdGFydCAtIDFdLmNvZGVQb2ludHNbMF0pKSkpIHtcbiAgICAgIGdseXBoc1tzdGFydF0uZmVhdHVyZXMuaW5pdCA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5leHRTeWxsYWJsZShnbHlwaHMsIHN0YXJ0KSB7XG4gIGlmIChzdGFydCA+PSBnbHlwaHMubGVuZ3RoKSByZXR1cm4gc3RhcnQ7XG4gIHZhciBzeWxsYWJsZSA9IGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5zeWxsYWJsZTtcblxuICB3aGlsZSAoKytzdGFydCA8IGdseXBocy5sZW5ndGggJiYgZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLnN5bGxhYmxlID09PSBzeWxsYWJsZSkge1xuICB9XG5cbiAgcmV0dXJuIHN0YXJ0O1xufVxuXG52YXIgYmFzZTY0RGVmbGF0ZWRUcmllJDMgPSBcImVKd0JGZzdwOFFBQ0FBQUFBQUFBQUFDNkVBRUZEdnJ4N1p4N2pGOUZGY2RuZDd2N2UyMTN1eFphb0x3ZnBxVUlSWm9ZcERFUUlOR1VKbXBERlBuRDFnYzJZckJCalkxS2FJaUdBaElKaGxCamhCcWpsVFQxR1ZCalFQa0RTQVZOaWtSQkJSVWpBVkdFU0VqRnhQZ2Q3NXo4enM2ZWVkN1hGbjRuK1dUdVk1N256TXlkbVR2M3JwcFE2aFN3RnB3RExnUWJ3V1p3dWJsMlhnWHVGckFOYkFjN1BQNTJnbDNDOVJ2QnJXQTMyQU8rRGI0SDdnSDNHUjVrL244QkhnVy9BMDhMOFQwRm5nR3J3QXNtYjZ2TS9WV01WOEFob0pZbzFRWEx3QXB3UEhnak9CT3NCeHZBUmVBUzhHN3dQdkFCOEZHd0hld0FPOEV1Y0F2WURlNEVlOEYrY0RlNEZ6d0FIZ2EvQnI4SGZ3SFBnaGZCSWFBbWxlcUFXYkFTbkFCT0JXZE1GbmxmRC9jOGNLRTUzd2gzTTdnY2JBSGJ3TWZCcDgzOWErRitBZHdNYmdOZm14eVcvWnVUODNWUmx2Mkk3L3NWeDhuNXNSWDNmVGgvRVB3Sy9BWThOVm1VOXhud0FuZ0YvRGVRbjZrcHBXYkFDckJxcWdoL0N0dzE0R3h3cnJsMkFkeDNnSGVCeTZZSzNXcTI0dmhENEdQZ2srQno0UE1tekUzRy9UTGNyNEliV0xyZndQbStLWC9lZmhDNEg4TlBFTWY5NEFBNENKNHc1ZEwzbm9UN1YvQVA4TEs1OWlyYzhRN3FJRmphQ2NkL0pQd2MxeW5pUEJIdWFuQVdXQS9XbWJRMjRQZ01FOWZiakYvTnhleVlzd25YTHdXWFdmZTNPdndUSHpGcG44MzA1dlBQL2VXaTQvZ3cwcndLWEExMmRPTGozMm5wOTB6Qnp5NzR1UVhzN2hUMWJRK0xmNmxISDN0eGJ6KzRHOXpyc0tQVS9oL29ETXYxQ0k0ZkEzOEFUNXUwOVBIZnpQRmpBWHRVb2Q4UkkxNlBqTnJQaUJFalJvd1lNV0xFaU5jQzZ6ckROWUViSXZ6L2s4MWQvMlhOWTc4WUVmNC9DRFBSTGRaaEJuQ1hneFhnT0hDYXVmNG11T3U3aGY4TmNNOEhid2Z2TlBmZkMzY0wyR2JPdDhQZEFYWjIzZWxxZjdzODkwZU1HREZpUkwyYzB6SnRsMy9FaUJIMVVIZjcvaExHajdkM2kvZENkOEQ5bGpDZS9FNjNlTGV2aisreDd0KzNDTWFmZjU4dW1GNnExQ1hna2Vrd08rSHY1NVpmTlRNOFhvM2pMV0FQZUJ3Y012ZFd6MktNUGp2MHR3UEhlNkNEUDRFVGV3Z0Q5dlNLc2Z3ZFU0WDdzRG5uRFByd056WmtZMytobjV0d2JSKzcvanlPMXc2VXVoTHNBOCtEdGRQdFAzL2FKdFJlSG9UdURwaDZlaER1NDhaZWVwNzRiRGY5ZWJyZnVHZEcrdWU4bUpHZTFDZEk0VjlHM0s5MjUvdWovTzczcERlTyt0a0RjNzFoMmJTL28zQitiSzg0UDdrMzlIOTZiMzQrWXZ1cldGdTZ5dmZtbm56dnJiaStBVndFTm9MTjREM2dTWFAvL1RpK0Fsd0ZyamIzUHdPdUF6ZUNXOEh0TE80N2Nid1g3QU0vQkQ4Rjk0TUQ0S0NRQnowUGZ3TFgvMnp1NmYwMHorSDRKY0V2K2Y4MzdvMzFoK2M5SE0rQm8vdkYrVW45WW0rSnZyOEd4MmYzM1RyVC9zL3R5enB6NmYwQytMOFliQUtYZ3N2QVZwUDJ0bjdSWm1MdHRoMytQd1d1QWRlQjY4SE5MRCszNGZncjRPdmdMdkJkVnJZUVAvS1UrMUhrOFdmOWRwNDVMbDAvRk1qUFl1b3JxOVJCRytuL3NqOC8zb05HOTcrRis4ZCt1WHpHbHVOcFQ3dXowNytyNHZJdnh2cFZoZjNMMUpPMnk1ZGEvdWY2emViYnQ0OXFyMWszZjZsZnVJZmdLb3d4cHdiRitmUmc2UGVJZ1Z3MnVyK21JNWVyN3ZvZklyU1hMR2F2MmNwQjRSNFA5N1RCNFZIdmJQMkg3cDh1MkRjVTcwUEMySGF4RWR2djNOQmdYczRhekw5MlRVYit6NW1JcTRlNkRyK0Z0V085djNNRHpzOGZGTzEvSGR0dmViSHhOekQ1MndUMzBrR3g3L1p5dUI4VTZvaXY3YXlPMk11Wmk4NzdsWVA1MS9qZTFlZFFONi9vRE12K0NlTitGdTVkbldIK1QyVmhyalYrcm9kN3N4RDNyYmkyTzdHZHRNMHhFMk5xTWNnWVk5dzY1MzdJbldEM2wwUml4NmNjMStxV3hhSHhrWkJRWFJvWElGdU5DK0hHTFhmU1FCSlR0K3F1Q3hNMXgxKzFUTFdkZ1JJU1k4dlhVOXVYMnN6clNjWWNMQWF4ODhIN3ZNTmRwREdEZlh5NFNHNmRrY1pTT2ZhMTlYYzQ2YkNwZGhjYmQ0cnVxMjZIM1BhdWZpbkVhMTFjOHc1K3Z3cTc1T3FmOHRSaFlCb2JQZitwbWg0d1M0TC9QOWZIMDhaZGF0R3o2RnZNc0xCVXhsbW1zeDZMS3paLzVEOW5ucWhLNkdXQzJhWWJHWmV5L05ubnFZVENLalUvSGNrL1NZeDlTYVlOOXJtMmIwd2YwaGV1dWNwa3A1MnFvMUI3cHZ0VUovamNqcmMvWDlxK3N1VGtPZFcrb1dNdEErTks5cldGMnE5OVBtUDVtMVYraWFtUG9UQXV0RjJXcWFJZDB2eDNUcVU5dzJMdDY3TkpTcDZyc205dSt5V2I4ajVhcWZuOWMxVlN0djNTV0RhVUJuOU9MbU1vZGZqMHo2bjJwV2RyVHY4Y0VydnQyenF3ODVscjMzRTF2M3k1b20wY2VwWkw1WERwWFBLckJQOHVmNjUwcE91eGRZZ0x0VlUrdnVJeXJlYmJuNS9IdG0vcCtleVNuSEpJYTdDaHRRbmVscnZtUExYOXBlUTNwejJuNmtHZis4YkxTaTNzcS9sNXlKNDBucGIwWUV2Wjl1eVQwRE9aK2dKdTQ1aXh2RlN1cHV6cjhrdGk5OWQxMkZkcS83YlllUzFqM3pjWWNvU1B0VktleDFXM3Z4eklIbVJQRzY3VFVQKzdYTWw5SEovL3g5aTB6dlpLWXErVlNPc21LZmJNeVZ2VnRveU5VNm41ZVluTnI5Um1lVjJodWtRMlc4cjhURHZ3MVlkVW5WSStjdGI2Mm1oN1B0djAyRFY3N1VrYUY1T01LMy9jT254SExaeGJkTXk5c3ZzUmJIMHF5ODJ0c3prNmpJbWIvTVRxVzUvUHNiQytjcEhZK2xiTVRTbS95NzhXKzUxL0x1UE10Y2VzcmpGdDFmYlRjVTVhTHMxN0pZbTFjWjNZd3RlTVhXdklOalNHNE9jZE5Wd0Q5cFgzaUFSVW92ODYwQkthSzAxNjd2SHdybm9zdFFsSjZxNGJLVWpQVXMyMGt1dUxYcWZVZFdiR1hEc1NyRkJGSHpXWG1MYTlMNDJPUTNsMXZkZVlVL1B6MFZmRE1aVWRSMWVBeDJXWFBVZTNjMm80RnFGNHBIUzdScTlMaEh6NG9MQmt2emIySTBoMXZPMTNvNkYyWG9XZStGNjNLcVVPSGVVK1greHJ2SCtvTzMwSm5uNktqcXBPUDFXcTBMOXFPUDFRM3JUdzU0WTBkblhOd1FnYWYvVFZjT3lobjhFclZUSCttbVRRR280K3R0dUkvUndtVzZXV3Z5N3g5WUZOOUl2NnVWcDFIVWpSS2E4YjluaURzTWRxWEk0eXpMSmptNk5OUEpOQ2VMdXZUOTNmVUhXN0tWdjNjdFBORFcvRDE2bks1bzlMN0hPN2J1cXNBOVFPYUMySzkxTjExa3Nhbyt2MnRkSndqSkxuU1RNc2I2NzJ5dWVZMUs2bFBsNWEveUdvdmZJMk81bFFKcGVVRFI4YXQ5WTlwdVU2MG5acWVzK2FmdlpLYzBKN1hVR3lOVDJuNitpUFF1dElNYXdDeHhyWFJlcmNvUzA3Y1hnYmx2b1lhc3N6ekYvZDljWmVxeWVYK3ArWWQyNWFiRnU3eW03M1FYeTlZS1dINHd5Njc2RzlYYTYwVS9wbkxqSDlUcXlVblZ2ei9rWDduM1ZBZnFUclhVODRhUytiZEkzeXErT2o5NkcwSDBIVHhyZFkwdmd4Sk1lREU5ajVoSU5ZKzlqcllhbjJUVmwvaWJtZUdyZjlyRXdKcCtYRWlES21TSTVOS1p3OVBtbENPbUV2WHBIV3JLVnJLZkhGaEF1dG5VdXVsRTVLdnNxV284cjEwcFQ4K01ZVUladjU3T3NLVndWU09ldEl4emZXaXBIVStPcktiMWsvZGVxempYUnpiQmtqYlplaDZmS0dwRTFicEtSZlo5MU55Y2RFelhuMjZkMGVJNWJWWHhYNmIwSkNhVFdoLzZic25LUHZxbTJUOCs3Qk5TOXd4UmxhTDNPRnp5MUR6dHhDOHE4eTRrcVpqNFdreVg2bmlmcmV0RDRrNGZiSnpWdHV1ZXJxUTBQbHJjb09ybmlhcmdleDBsVDdLVnZXdHZKUTFpYUxvVytvc3IrMTQwMzFTK3U0OXI0dzZiMUh6TGRWWmVCcjNMVEducXY3MkhCVmx5SDFlU3J0MTJzU3ZlZFIrbmJGaGE0WE1XdDZWUDZjOXd0Y1hPOWJVM0dsNHhvN1NXMkNJKzFCNXU4TVVzc2ZnLzNlMG42WHlkOEQ2WDBrS2Q5clV0bmJmRmRyUSsvZ1hIdDY2VDJ0M2d1ZzYvRkphdml2aWR4eGIyNTk5ZG1iOWtYVXJhL1lOS1Q5RC93ZE9GMno5MFBIQ0U5blpVUmVxSzVLNFdQMGI5dXhhaDN5OVF6K1BOSDM2UDFlbGUya3gxeXlnMjAzVnpqcTU4aHRVbkwwcitzYXIzdDlKVDgzYVk5K2pQRDRwVy9pK2I2OU1STjNYZDlKMWlIMmVPYmtrc1N1TWZna1prMUN1aGZ5NjBySDU0L21qbldNcjZWOGpDdS96cVIxbzVRMDdHdEt5YnB1U3V6Nlo0K3hmWFB0S3RLcmErNlVJNHRsL2FETUhGYXlYNW01Y0ZObGRrbGQ2eEpOMkxqdU9sMTMvREg2ME05Tyt4dHMzN2NnNUkvMmFvWEdhL1o1WFpEb09jcEFMZHhycHlXMGR6Um1MRkgxbW4zZDdiUE9kd3VIU3g2YVRqT2xuSHpPUXZzVW0yZ3Y5aHpHdFIvYjliMTNhRjV2eXlrbGFXSWVjS3BxLzErdTBuOEI3VDNQV3ZlNmY1UEc3ZElhVzF0STlVcjY5cHZ1MFhmZktpRU5hYjBoZHU5M1Nqb3gyRFpwT24zZlB5Vjk3VmlIWFc1UWFxRk9hZTg2MlNwM2ZVNmFZMWF0QTBvclZxcE1NOWRtOW5zVys3OEkya2IwdjB4WGYwdnZBR0x5S1BrcnE0dVU4TDcyVVhWZFNFSHIwTmYvRWdQbEhoK1hyYU81LzE5VG52T3FiV21uNWZKRDQzQmV6KzF2ZDNnL1hlWi9xRXI1KzN4WHV5UHh2YXRTQVg4cFVrZTlUZW4zN2ZlR1ZOZklUbHlrZmlhbER2SCtQdVhieTdKbHBURUcvMWFML2dsQTVhVXhsSjNYa0pSdDMzV1ZuVVQ2RDRKZDVwZzViQzUybnN2K0Y5N1ZibFBxT2k5L3o4cHZxcFMxZjQ1T3E1UVVYZk4vZUlXZWlYWjdxaUw5c3BEb2Q2WDZ2ZWxwS3Z4UEtydHNaZlBQN1RpZUVkN1g1cVd4b3QzT1UvT2ZXODZxK3pHN0RkTjRpT1lyVkRZK1htaENscWlGL3lpUWtQNGhWaldUSmgxN1BLTDFwT2R5Y3hhdWJ6N3Blc3c0eTFkK3FWKzI4N3pjd2RHSlVEbVhxWVZyVVV1VSszbmtxdk5OOUVlKy94N3d0WGU3VGZOMmJmY3BiYXczY0VrZEY4YkdYZVpmakw3NzFOZnpQWTBwNC9qWWVoVHlXd1pYZjhPbHgxeCtUR1hsNnpuMHYrdVlQVVU1ZFNRbXZISWMxOWtXZmY5NVYwb2VQMWFsbnhBVGF1Ry9ObUxhZXB2dlVLc1lxOVkxL3EzejNVOWI3N0ZvVE9tejI1amplaE5TNXp3bVZ1eTlLcWw3TUpyYW45REVIcFdZK0pzcTgyTGM3eUdKbEVaYjdhbXFjc2ZvTTBYM2RGejMyb1ZVanFyaktCdm5ZbXdYWmVPb3NuM1cxZGFyMUZ2WnZQaWs3blRMNU0yWHY2YWt5ZnFWazM1VitjOE5YMVg2TWVtVTFYUElieDM1VGttL2pyaHRTYkdkSkxuMXdDWC9BOG8zcUo0PVwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGcobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGcobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGcobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRnKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkZyhvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGcoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJDYoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eSQzKG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbi8vIHdlIG1heSBiZSBydW5uaW5nIGluIGEgYnJvd3NlciBzbyB3ZSBtYWtlIGFuIFVpbnQ4QXJyYXlcblxudmFyIHVzZURhdGEkMSA9IEpTT04ucGFyc2UoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIHBha28uaW5mbGF0ZShiYXNlNjRBcnJheWJ1ZmZlcl8yKGJhc2U2NERlZmxhdGVkVXNlRGF0YSkpKSk7XG52YXIgdHJpZURhdGEkMyA9IHBha28uaW5mbGF0ZShiYXNlNjRBcnJheWJ1ZmZlcl8yKGJhc2U2NERlZmxhdGVkVHJpZSQzKSk7XG52YXIgY2F0ZWdvcmllcyA9IHVzZURhdGEkMS5jYXRlZ29yaWVzLFxuICAgIGRlY29tcG9zaXRpb25zJDEgPSB1c2VEYXRhJDEuZGVjb21wb3NpdGlvbnM7XG52YXIgdHJpZSQzID0gbmV3IHVuaWNvZGVUcmllKHRyaWVEYXRhJDMpO1xudmFyIHN0YXRlTWFjaGluZSQxID0gbmV3IGRmYSh1c2VEYXRhJDEpO1xuLyoqXG4gKiBUaGlzIHNoYXBlciBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVW5pdmVyc2FsIFNoYXBpbmcgRW5naW5lLCB3aGljaFxuICogdXNlcyBVbmljb2RlIGRhdGEgdG8gc2hhcGUgYSBudW1iZXIgb2Ygc2NyaXB0cyB3aXRob3V0IGEgZGVkaWNhdGVkIHNoYXBpbmcgZW5naW5lLlxuICogU2VlIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9PcGVuVHlwZURldi9VU0UvaW50cm8uaHRtLlxuICovXG5cbnZhciBVbml2ZXJzYWxTaGFwZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9EZWZhdWx0U2hhcGVyKSB7XG4gIF9pbmhlcml0c0xvb3NlJDYoVW5pdmVyc2FsU2hhcGVyLCBfRGVmYXVsdFNoYXBlcik7XG5cbiAgZnVuY3Rpb24gVW5pdmVyc2FsU2hhcGVyKCkge1xuICAgIHJldHVybiBfRGVmYXVsdFNoYXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICBVbml2ZXJzYWxTaGFwZXIucGxhbkZlYXR1cmVzID0gZnVuY3Rpb24gcGxhbkZlYXR1cmVzKHBsYW4pIHtcbiAgICBwbGFuLmFkZFN0YWdlKHNldHVwU3lsbGFibGVzJDEpOyAvLyBEZWZhdWx0IGdseXBoIHByZS1wcm9jZXNzaW5nIGdyb3VwXG5cbiAgICBwbGFuLmFkZFN0YWdlKFsnbG9jbCcsICdjY21wJywgJ251a3QnLCAnYWtobiddKTsgLy8gUmVvcmRlcmluZyBncm91cFxuXG4gICAgcGxhbi5hZGRTdGFnZShjbGVhclN1YnN0aXR1dGlvbkZsYWdzKTtcbiAgICBwbGFuLmFkZFN0YWdlKFsncnBoZiddLCBmYWxzZSk7XG4gICAgcGxhbi5hZGRTdGFnZShyZWNvcmRScGhmKTtcbiAgICBwbGFuLmFkZFN0YWdlKGNsZWFyU3Vic3RpdHV0aW9uRmxhZ3MpO1xuICAgIHBsYW4uYWRkU3RhZ2UoWydwcmVmJ10pO1xuICAgIHBsYW4uYWRkU3RhZ2UocmVjb3JkUHJlZik7IC8vIE9ydGhvZ3JhcGhpYyB1bml0IHNoYXBpbmcgZ3JvdXBcblxuICAgIHBsYW4uYWRkU3RhZ2UoWydya3JmJywgJ2FidmYnLCAnYmx3ZicsICdoYWxmJywgJ3BzdGYnLCAndmF0dScsICdjamN0J10pO1xuICAgIHBsYW4uYWRkU3RhZ2UocmVvcmRlcik7IC8vIFRvcG9ncmFwaGljYWwgZmVhdHVyZXNcbiAgICAvLyBTY3JpcHRzIHRoYXQgbmVlZCB0aGlzIGFyZSBoYW5kbGVkIGJ5IHRoZSBBcmFiaWMgc2hhcGVyLCBub3QgaW1wbGVtZW50ZWQgaGVyZSBmb3Igbm93LlxuICAgIC8vIHBsYW4uYWRkU3RhZ2UoWydpc29sJywgJ2luaXQnLCAnbWVkaScsICdmaW5hJywgJ21lZDInLCAnZmluMicsICdmaW4zJ10sIGZhbHNlKTtcbiAgICAvLyBTdGFuZGFyZCB0b3BvZ3JhcGhpYyBwcmVzZW50YXRpb24gYW5kIHBvc2l0aW9uYWwgZmVhdHVyZSBhcHBsaWNhdGlvblxuXG4gICAgcGxhbi5hZGRTdGFnZShbJ2FidnMnLCAnYmx3cycsICdwcmVzJywgJ3BzdHMnLCAnZGlzdCcsICdhYnZtJywgJ2Jsd20nXSk7XG4gIH07XG5cbiAgVW5pdmVyc2FsU2hhcGVyLmFzc2lnbkZlYXR1cmVzID0gZnVuY3Rpb24gYXNzaWduRmVhdHVyZXMocGxhbiwgZ2x5cGhzKSB7XG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoaSkge1xuICAgICAgdmFyIGNvZGVwb2ludCA9IGdseXBoc1tpXS5jb2RlUG9pbnRzWzBdO1xuXG4gICAgICBpZiAoZGVjb21wb3NpdGlvbnMkMVtjb2RlcG9pbnRdKSB7XG4gICAgICAgIHZhciBkZWNvbXBvc2VkID0gZGVjb21wb3NpdGlvbnMkMVtjb2RlcG9pbnRdLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICAgIHZhciBnID0gcGxhbi5mb250LmdseXBoRm9yQ29kZVBvaW50KGMpO1xuICAgICAgICAgIHJldHVybiBuZXcgR2x5cGhJbmZvKHBsYW4uZm9udCwgZy5pZCwgW2NdLCBnbHlwaHNbaV0uZmVhdHVyZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtpLCAxXS5jb25jYXQoZGVjb21wb3NlZCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBEZWNvbXBvc2Ugc3BsaXQgdm93ZWxzXG4gICAgLy8gVE9ETzogZG8gdGhpcyBpbiBhIG1vcmUgZ2VuZXJhbCB1bmljb2RlIG5vcm1hbGl6ZXJcbiAgICBmb3IgKHZhciBpID0gZ2x5cGhzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBfbG9vcChpKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFVuaXZlcnNhbFNoYXBlcjtcbn0oRGVmYXVsdFNoYXBlcik7XG5cbl9kZWZpbmVQcm9wZXJ0eSQzKFVuaXZlcnNhbFNoYXBlciwgXCJ6ZXJvTWFya1dpZHRoc1wiLCAnQkVGT1JFX0dQT1MnKTtcblxuZnVuY3Rpb24gdXNlQ2F0ZWdvcnkoZ2x5cGgpIHtcbiAgcmV0dXJuIHRyaWUkMy5nZXQoZ2x5cGguY29kZVBvaW50c1swXSk7XG59XG5cbnZhciBVU0VJbmZvID0gZnVuY3Rpb24gVVNFSW5mbyhjYXRlZ29yeSwgc3lsbGFibGVUeXBlLCBzeWxsYWJsZSkge1xuICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gIHRoaXMuc3lsbGFibGVUeXBlID0gc3lsbGFibGVUeXBlO1xuICB0aGlzLnN5bGxhYmxlID0gc3lsbGFibGU7XG59O1xuXG5mdW5jdGlvbiBzZXR1cFN5bGxhYmxlcyQxKGZvbnQsIGdseXBocykge1xuICB2YXIgc3lsbGFibGUgPSAwO1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZyhzdGF0ZU1hY2hpbmUkMS5tYXRjaChnbHlwaHMubWFwKHVzZUNhdGVnb3J5KSkpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgIHZhciBfc3RlcCR2YWx1ZSA9IF9zdGVwLnZhbHVlLFxuICAgICAgICBzdGFydCA9IF9zdGVwJHZhbHVlWzBdLFxuICAgICAgICBlbmQgPSBfc3RlcCR2YWx1ZVsxXSxcbiAgICAgICAgdGFncyA9IF9zdGVwJHZhbHVlWzJdO1xuICAgICsrc3lsbGFibGU7IC8vIENyZWF0ZSBzaGFwZXIgaW5mb1xuXG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICBnbHlwaHNbaV0uc2hhcGVySW5mbyA9IG5ldyBVU0VJbmZvKGNhdGVnb3JpZXNbdXNlQ2F0ZWdvcnkoZ2x5cGhzW2ldKV0sIHRhZ3NbMF0sIHN5bGxhYmxlKTtcbiAgICB9IC8vIEFzc2lnbiBycGhmIGZlYXR1cmVcblxuXG4gICAgdmFyIGxpbWl0ID0gZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLmNhdGVnb3J5ID09PSAnUicgPyAxIDogTWF0aC5taW4oMywgZW5kIC0gc3RhcnQpO1xuXG4gICAgZm9yICh2YXIgX2kgPSBzdGFydDsgX2kgPCBzdGFydCArIGxpbWl0OyBfaSsrKSB7XG4gICAgICBnbHlwaHNbX2ldLmZlYXR1cmVzLnJwaGYgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhclN1YnN0aXR1dGlvbkZsYWdzKGZvbnQsIGdseXBocykge1xuICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRnKGdseXBocyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgdmFyIGdseXBoID0gX3N0ZXAyLnZhbHVlO1xuICAgIGdseXBoLnN1YnN0aXR1dGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkUnBoZihmb250LCBnbHlwaHMpIHtcbiAgZm9yICh2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkZyhnbHlwaHMpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgIHZhciBnbHlwaCA9IF9zdGVwMy52YWx1ZTtcblxuICAgIGlmIChnbHlwaC5zdWJzdGl0dXRlZCAmJiBnbHlwaC5mZWF0dXJlcy5ycGhmKSB7XG4gICAgICAvLyBNYXJrIGEgc3Vic3RpdHV0ZWQgcmVwaGEuXG4gICAgICBnbHlwaC5zaGFwZXJJbmZvLmNhdGVnb3J5ID0gJ1InO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRQcmVmKGZvbnQsIGdseXBocykge1xuICBmb3IgKHZhciBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRnKGdseXBocyksIF9zdGVwNDsgIShfc3RlcDQgPSBfaXRlcmF0b3I0KCkpLmRvbmU7KSB7XG4gICAgdmFyIGdseXBoID0gX3N0ZXA0LnZhbHVlO1xuXG4gICAgaWYgKGdseXBoLnN1YnN0aXR1dGVkKSB7XG4gICAgICAvLyBNYXJrIGEgc3Vic3RpdHV0ZWQgcHJlZiBhcyBWUHJlLCBhcyB0aGV5IGJlaGF2ZSB0aGUgc2FtZSB3YXkuXG4gICAgICBnbHlwaC5zaGFwZXJJbmZvLmNhdGVnb3J5ID0gJ1ZQcmUnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZW9yZGVyKGZvbnQsIGdseXBocykge1xuICB2YXIgZG90dGVkQ2lyY2xlID0gZm9udC5nbHlwaEZvckNvZGVQb2ludCgweDI1Y2MpLmlkO1xuXG4gIGZvciAodmFyIHN0YXJ0ID0gMCwgZW5kID0gbmV4dFN5bGxhYmxlJDEoZ2x5cGhzLCAwKTsgc3RhcnQgPCBnbHlwaHMubGVuZ3RoOyBzdGFydCA9IGVuZCwgZW5kID0gbmV4dFN5bGxhYmxlJDEoZ2x5cGhzLCBzdGFydCkpIHtcbiAgICB2YXIgaSA9IHZvaWQgMCxcbiAgICAgICAgaiA9IHZvaWQgMDtcbiAgICB2YXIgaW5mbyA9IGdseXBoc1tzdGFydF0uc2hhcGVySW5mbztcbiAgICB2YXIgdHlwZSA9IGluZm8uc3lsbGFibGVUeXBlOyAvLyBPbmx5IGEgZmV3IHN5bGxhYmxlIHR5cGVzIG5lZWQgcmVvcmRlcmluZy5cblxuICAgIGlmICh0eXBlICE9PSAndmlyYW1hX3Rlcm1pbmF0ZWRfY2x1c3RlcicgJiYgdHlwZSAhPT0gJ3N0YW5kYXJkX2NsdXN0ZXInICYmIHR5cGUgIT09ICdicm9rZW5fY2x1c3RlcicpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gSW5zZXJ0IGEgZG90dGVkIGNpcmNsZSBnbHlwaCBpbiBicm9rZW4gY2x1c3RlcnMuXG5cblxuICAgIGlmICh0eXBlID09PSAnYnJva2VuX2NsdXN0ZXInICYmIGRvdHRlZENpcmNsZSkge1xuICAgICAgdmFyIGcgPSBuZXcgR2x5cGhJbmZvKGZvbnQsIGRvdHRlZENpcmNsZSwgWzB4MjVjY10pO1xuICAgICAgZy5zaGFwZXJJbmZvID0gaW5mbzsgLy8gSW5zZXJ0IGFmdGVyIHBvc3NpYmxlIFJlcGhhLlxuXG4gICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZCAmJiBnbHlwaHNbaV0uc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gJ1InOyBpKyspIHtcbiAgICAgIH1cblxuICAgICAgZ2x5cGhzLnNwbGljZSgrK2ksIDAsIGcpO1xuICAgICAgZW5kKys7XG4gICAgfSAvLyBNb3ZlIHRoaW5ncyBmb3J3YXJkLlxuXG5cbiAgICBpZiAoaW5mby5jYXRlZ29yeSA9PT0gJ1InICYmIGVuZCAtIHN0YXJ0ID4gMSkge1xuICAgICAgLy8gR290IGEgcmVwaGEuIFJlb3JkZXIgaXQgdG8gYWZ0ZXIgZmlyc3QgYmFzZSwgYmVmb3JlIGZpcnN0IGhhbGFudC5cbiAgICAgIGZvciAoaSA9IHN0YXJ0ICsgMTsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgIGluZm8gPSBnbHlwaHNbaV0uc2hhcGVySW5mbztcblxuICAgICAgICBpZiAoaXNCYXNlKGluZm8pIHx8IGlzSGFsYW50KGdseXBoc1tpXSkpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoaXQgYSBoYWxhbnQsIG1vdmUgYmVmb3JlIGl0OyBvdGhlcndpc2UgaXQncyBhIGJhc2U6IG1vdmUgdG8gaXQnc1xuICAgICAgICAgIC8vIHBsYWNlLCBhbmQgc2hpZnQgdGhpbmdzIGluIGJldHdlZW4gYmFja3dhcmQuXG4gICAgICAgICAgaWYgKGlzSGFsYW50KGdseXBoc1tpXSkpIHtcbiAgICAgICAgICAgIGktLTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBnbHlwaHMuc3BsaWNlLmFwcGx5KGdseXBocywgW3N0YXJ0LCAwXS5jb25jYXQoZ2x5cGhzLnNwbGljZShzdGFydCArIDEsIGkgLSBzdGFydCksIFtnbHlwaHNbaV1dKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIE1vdmUgdGhpbmdzIGJhY2suXG5cblxuICAgIGZvciAoaSA9IHN0YXJ0LCBqID0gZW5kOyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIGluZm8gPSBnbHlwaHNbaV0uc2hhcGVySW5mbztcblxuICAgICAgaWYgKGlzQmFzZShpbmZvKSB8fCBpc0hhbGFudChnbHlwaHNbaV0pKSB7XG4gICAgICAgIC8vIElmIHdlIGhpdCBhIGhhbGFudCwgbW92ZSBhZnRlciBpdDsgb3RoZXJ3aXNlIGl0J3MgYSBiYXNlOiBtb3ZlIHRvIGl0J3NcbiAgICAgICAgLy8gcGxhY2UsIGFuZCBzaGlmdCB0aGluZ3MgaW4gYmV0d2VlbiBiYWNrd2FyZC5cbiAgICAgICAgaiA9IGlzSGFsYW50KGdseXBoc1tpXSkgPyBpICsgMSA6IGk7XG4gICAgICB9IGVsc2UgaWYgKChpbmZvLmNhdGVnb3J5ID09PSAnVlByZScgfHwgaW5mby5jYXRlZ29yeSA9PT0gJ1ZNUHJlJykgJiYgaiA8IGkpIHtcbiAgICAgICAgZ2x5cGhzLnNwbGljZS5hcHBseShnbHlwaHMsIFtqLCAxLCBnbHlwaHNbaV1dLmNvbmNhdChnbHlwaHMuc3BsaWNlKGosIGkgLSBqKSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBuZXh0U3lsbGFibGUkMShnbHlwaHMsIHN0YXJ0KSB7XG4gIGlmIChzdGFydCA+PSBnbHlwaHMubGVuZ3RoKSByZXR1cm4gc3RhcnQ7XG4gIHZhciBzeWxsYWJsZSA9IGdseXBoc1tzdGFydF0uc2hhcGVySW5mby5zeWxsYWJsZTtcblxuICB3aGlsZSAoKytzdGFydCA8IGdseXBocy5sZW5ndGggJiYgZ2x5cGhzW3N0YXJ0XS5zaGFwZXJJbmZvLnN5bGxhYmxlID09PSBzeWxsYWJsZSkge1xuICB9XG5cbiAgcmV0dXJuIHN0YXJ0O1xufVxuXG5mdW5jdGlvbiBpc0hhbGFudChnbHlwaCkge1xuICByZXR1cm4gZ2x5cGguc2hhcGVySW5mby5jYXRlZ29yeSA9PT0gJ0gnICYmICFnbHlwaC5pc0xpZ2F0ZWQ7XG59XG5cbmZ1bmN0aW9uIGlzQmFzZShpbmZvKSB7XG4gIHJldHVybiBpbmZvLmNhdGVnb3J5ID09PSAnQicgfHwgaW5mby5jYXRlZ29yeSA9PT0gJ0dCJztcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRoKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRoKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRoKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkaChvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGgobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRoKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxudmFyIFNIQVBFUlMgPSB7XG4gIGFyYWI6IEFyYWJpY1NoYXBlcixcbiAgLy8gQXJhYmljXG4gIG1vbmc6IEFyYWJpY1NoYXBlcixcbiAgLy8gTW9uZ29saWFuXG4gIHN5cmM6IEFyYWJpY1NoYXBlcixcbiAgLy8gU3lyaWFjXG4gICdua28gJzogQXJhYmljU2hhcGVyLFxuICAvLyBOJ0tvXG4gIHBoYWc6IEFyYWJpY1NoYXBlcixcbiAgLy8gUGhhZ3MgUGFcbiAgbWFuZDogQXJhYmljU2hhcGVyLFxuICAvLyBNYW5kYWljXG4gIG1hbmk6IEFyYWJpY1NoYXBlcixcbiAgLy8gTWFuaWNoYWVhblxuICBwaGxwOiBBcmFiaWNTaGFwZXIsXG4gIC8vIFBzYWx0ZXIgUGFobGF2aVxuICBoYW5nOiBIYW5ndWxTaGFwZXIsXG4gIC8vIEhhbmd1bFxuICBibmcyOiBJbmRpY1NoYXBlcixcbiAgLy8gQmVuZ2FsaVxuICBiZW5nOiBJbmRpY1NoYXBlcixcbiAgLy8gQmVuZ2FsaVxuICBkZXYyOiBJbmRpY1NoYXBlcixcbiAgLy8gRGV2YW5hZ2FyaVxuICBkZXZhOiBJbmRpY1NoYXBlcixcbiAgLy8gRGV2YW5hZ2FyaVxuICBnanIyOiBJbmRpY1NoYXBlcixcbiAgLy8gR3VqYXJhdGlcbiAgZ3VqcjogSW5kaWNTaGFwZXIsXG4gIC8vIEd1amFyYXRpXG4gIGd1cnU6IEluZGljU2hhcGVyLFxuICAvLyBHdXJtdWtoaVxuICBndXIyOiBJbmRpY1NoYXBlcixcbiAgLy8gR3VybXVraGlcbiAga25kYTogSW5kaWNTaGFwZXIsXG4gIC8vIEthbm5hZGFcbiAga25kMjogSW5kaWNTaGFwZXIsXG4gIC8vIEthbm5hZGFcbiAgbWxtMjogSW5kaWNTaGFwZXIsXG4gIC8vIE1hbGF5YWxhbVxuICBtbHltOiBJbmRpY1NoYXBlcixcbiAgLy8gTWFsYXlhbGFtXG4gIG9yeTI6IEluZGljU2hhcGVyLFxuICAvLyBPcml5YVxuICBvcnlhOiBJbmRpY1NoYXBlcixcbiAgLy8gT3JpeWFcbiAgdGFtbDogSW5kaWNTaGFwZXIsXG4gIC8vIFRhbWlsXG4gIHRtbDI6IEluZGljU2hhcGVyLFxuICAvLyBUYW1pbFxuICB0ZWx1OiBJbmRpY1NoYXBlcixcbiAgLy8gVGVsdWd1XG4gIHRlbDI6IEluZGljU2hhcGVyLFxuICAvLyBUZWx1Z3VcbiAga2htcjogSW5kaWNTaGFwZXIsXG4gIC8vIEtobWVyXG4gIGJhbGk6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gQmFsaW5lc2VcbiAgYmF0azogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBCYXRha1xuICBicmFoOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEJyYWhtaVxuICBidWdpOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEJ1Z2luZXNlXG4gIGJ1aGQ6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gQnVoaWRcbiAgY2FrbTogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBDaGFrbWFcbiAgY2hhbTogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBDaGFtXG4gIGR1cGw6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gRHVwbG95YW5cbiAgZWd5cDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBFZ3lwdGlhbiBIaWVyb2dseXBoc1xuICBncmFuOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEdyYW50aGFcbiAgaGFubzogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBIYW51bm9vXG4gIGphdmE6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gSmF2YW5lc2VcbiAga3RoaTogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBLYWl0aGlcbiAga2FsaTogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBLYXlhaCBMaVxuICBraGFyOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIEtoYXJvc2h0aGlcbiAga2hvajogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBLaG9qa2lcbiAgc2luZDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBLaHVkYXdhZGlcbiAgbGVwYzogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBMZXBjaGFcbiAgbGltYjogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBMaW1idVxuICBtYWhqOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIE1haGFqYW5pXG4gIC8vIG1hbmQ6IFVuaXZlcnNhbFNoYXBlciwgLy8gTWFuZGFpY1xuICAvLyBtYW5pOiBVbml2ZXJzYWxTaGFwZXIsIC8vIE1hbmljaGFlYW5cbiAgbXRlaTogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBNZWl0ZWkgTWF5ZWtcbiAgbW9kaTogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBNb2RpXG4gIC8vIG1vbmc6IFVuaXZlcnNhbFNoYXBlciwgLy8gTW9uZ29saWFuXG4gIC8vICdua28gJzogVW5pdmVyc2FsU2hhcGVyLCAvLyBO4oCZS29cbiAgaG1uZzogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBQYWhhd2ggSG1vbmdcbiAgLy8gcGhhZzogVW5pdmVyc2FsU2hhcGVyLCAvLyBQaGFncy1wYVxuICAvLyBwaGxwOiBVbml2ZXJzYWxTaGFwZXIsIC8vIFBzYWx0ZXIgUGFobGF2aVxuICByam5nOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFJlamFuZ1xuICBzYXVyOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFNhdXJhc2h0cmFcbiAgc2hyZDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBTaGFyYWRhXG4gIHNpZGQ6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gU2lkZGhhbVxuICBzaW5oOiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFNpbmhhbGFcbiAgc3VuZDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBTdW5kYW5lc2VcbiAgc3lsbzogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBTeWxvdGkgTmFncmlcbiAgdGdsZzogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBUYWdhbG9nXG4gIHRhZ2I6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gVGFnYmFud2FcbiAgdGFsZTogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBUYWkgTGVcbiAgbGFuYTogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBUYWkgVGhhbVxuICB0YXZ0OiBVbml2ZXJzYWxTaGFwZXIsXG4gIC8vIFRhaSBWaWV0XG4gIHRha3I6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gVGFrcmlcbiAgdGlidDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBUaWJldGFuXG4gIHRmbmc6IFVuaXZlcnNhbFNoYXBlcixcbiAgLy8gVGlmaW5hZ2hcbiAgdGlyaDogVW5pdmVyc2FsU2hhcGVyLFxuICAvLyBUaXJodXRhXG4gIGxhdG46IERlZmF1bHRTaGFwZXIsXG4gIC8vIExhdGluXG4gIERGTFQ6IERlZmF1bHRTaGFwZXIgLy8gRGVmYXVsdFxuXG59O1xuZnVuY3Rpb24gY2hvb3NlKHNjcmlwdCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc2NyaXB0KSkge1xuICAgIHNjcmlwdCA9IFtzY3JpcHRdO1xuICB9XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRoKHNjcmlwdCksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgdmFyIHMgPSBfc3RlcC52YWx1ZTtcbiAgICB2YXIgc2hhcGVyID0gU0hBUEVSU1tzXTtcblxuICAgIGlmIChzaGFwZXIpIHtcbiAgICAgIHJldHVybiBzaGFwZXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIERlZmF1bHRTaGFwZXI7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkaShvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkaShvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkaShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRpKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkaShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkNyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIEdTVUJQcm9jZXNzb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9PVFByb2Nlc3Nvcikge1xuICBfaW5oZXJpdHNMb29zZSQ3KEdTVUJQcm9jZXNzb3IsIF9PVFByb2Nlc3Nvcik7XG5cbiAgZnVuY3Rpb24gR1NVQlByb2Nlc3NvcigpIHtcbiAgICByZXR1cm4gX09UUHJvY2Vzc29yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBHU1VCUHJvY2Vzc29yLnByb3RvdHlwZTtcblxuICBfcHJvdG8uYXBwbHlMb29rdXAgPSBmdW5jdGlvbiBhcHBseUxvb2t1cChsb29rdXBUeXBlLCB0YWJsZSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBzd2l0Y2ggKGxvb2t1cFR5cGUpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFNpbmdsZSBTdWJzdGl0dXRpb25cbiAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UpO1xuXG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBnbHlwaCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5jdXI7XG5cbiAgICAgICAgICBzd2l0Y2ggKHRhYmxlLnZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgZ2x5cGguaWQgPSBnbHlwaC5pZCArIHRhYmxlLmRlbHRhR2x5cGhJRCAmIDB4ZmZmZjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgZ2x5cGguaWQgPSB0YWJsZS5zdWJzdGl0dXRlLmdldChpbmRleCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAge1xuICAgICAgICAgIC8vIE11bHRpcGxlIFN1YnN0aXR1dGlvblxuICAgICAgICAgIHZhciBfaW5kZXggPSB0aGlzLmNvdmVyYWdlSW5kZXgodGFibGUuY292ZXJhZ2UpO1xuXG4gICAgICAgICAgaWYgKF9pbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyRnbHlwaHM7XG5cbiAgICAgICAgICAgIHZhciBzZXF1ZW5jZSA9IHRhYmxlLnNlcXVlbmNlcy5nZXQoX2luZGV4KTtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5jdXIuaWQgPSBzZXF1ZW5jZVswXTtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5jdXIubGlnYXR1cmVDb21wb25lbnQgPSAwO1xuICAgICAgICAgICAgdmFyIGZlYXR1cmVzID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmN1ci5mZWF0dXJlcztcbiAgICAgICAgICAgIHZhciBjdXJHbHlwaCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5jdXI7XG4gICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBzZXF1ZW5jZS5zbGljZSgxKS5tYXAoZnVuY3Rpb24gKGdpZCwgaSkge1xuICAgICAgICAgICAgICB2YXIgZ2x5cGggPSBuZXcgR2x5cGhJbmZvKF90aGlzLmZvbnQsIGdpZCwgdW5kZWZpbmVkLCBmZWF0dXJlcyk7XG4gICAgICAgICAgICAgIGdseXBoLnNoYXBlckluZm8gPSBjdXJHbHlwaC5zaGFwZXJJbmZvO1xuICAgICAgICAgICAgICBnbHlwaC5pc0xpZ2F0ZWQgPSBjdXJHbHlwaC5pc0xpZ2F0ZWQ7XG4gICAgICAgICAgICAgIGdseXBoLmxpZ2F0dXJlQ29tcG9uZW50ID0gaSArIDE7XG4gICAgICAgICAgICAgIGdseXBoLnN1YnN0aXR1dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZ2x5cGguaXNNdWx0aXBsaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdseXBoO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIChfdGhpcyRnbHlwaHMgPSB0aGlzLmdseXBocykuc3BsaWNlLmFwcGx5KF90aGlzJGdseXBocywgW3RoaXMuZ2x5cGhJdGVyYXRvci5pbmRleCArIDEsIDBdLmNvbmNhdChyZXBsYWNlbWVudCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAzOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gQWx0ZXJuYXRlIFN1YnN0aXR1dGlvblxuICAgICAgICAgIHZhciBfaW5kZXgyID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlKTtcblxuICAgICAgICAgIGlmIChfaW5kZXgyICE9PSAtMSkge1xuICAgICAgICAgICAgdmFyIFVTRVJfSU5ERVggPSAwOyAvLyBUT0RPXG5cbiAgICAgICAgICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5jdXIuaWQgPSB0YWJsZS5hbHRlcm5hdGVTZXQuZ2V0KF9pbmRleDIpW1VTRVJfSU5ERVhdO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIExpZ2F0dXJlIFN1YnN0aXR1dGlvblxuICAgICAgICAgIHZhciBfaW5kZXgzID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlKTtcblxuICAgICAgICAgIGlmIChfaW5kZXgzID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkaSh0YWJsZS5saWdhdHVyZVNldHMuZ2V0KF9pbmRleDMpKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciBsaWdhdHVyZSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgICAgdmFyIG1hdGNoZWQgPSB0aGlzLnNlcXVlbmNlTWF0Y2hJbmRpY2VzKDEsIGxpZ2F0dXJlLmNvbXBvbmVudHMpO1xuXG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBfY3VyR2x5cGggPSB0aGlzLmdseXBoSXRlcmF0b3IuY3VyOyAvLyBDb25jYXRlbmF0ZSBhbGwgb2YgdGhlIGNoYXJhY3RlcnMgdGhlIG5ldyBsaWdhdHVyZSB3aWxsIHJlcHJlc2VudFxuXG4gICAgICAgICAgICB2YXIgY2hhcmFjdGVycyA9IF9jdXJHbHlwaC5jb2RlUG9pbnRzLnNsaWNlKCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGkobWF0Y2hlZCksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgIHZhciBfaW5kZXg0ID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgICAgICBjaGFyYWN0ZXJzLnB1c2guYXBwbHkoY2hhcmFjdGVycywgdGhpcy5nbHlwaHNbX2luZGV4NF0uY29kZVBvaW50cyk7XG4gICAgICAgICAgICB9IC8vIENyZWF0ZSB0aGUgcmVwbGFjZW1lbnQgbGlnYXR1cmUgZ2x5cGhcblxuXG4gICAgICAgICAgICB2YXIgbGlnYXR1cmVHbHlwaCA9IG5ldyBHbHlwaEluZm8odGhpcy5mb250LCBsaWdhdHVyZS5nbHlwaCwgY2hhcmFjdGVycywgX2N1ckdseXBoLmZlYXR1cmVzKTtcbiAgICAgICAgICAgIGxpZ2F0dXJlR2x5cGguc2hhcGVySW5mbyA9IF9jdXJHbHlwaC5zaGFwZXJJbmZvO1xuICAgICAgICAgICAgbGlnYXR1cmVHbHlwaC5pc0xpZ2F0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGlnYXR1cmVHbHlwaC5zdWJzdGl0dXRlZCA9IHRydWU7IC8vIEZyb20gSGFyZmJ1eno6XG4gICAgICAgICAgICAvLyAtIElmIGl0ICppcyogYSBtYXJrIGxpZ2F0dXJlLCB3ZSBkb24ndCBhbGxvY2F0ZSBhIG5ldyBsaWdhdHVyZSBpZCwgYW5kIGxlYXZlXG4gICAgICAgICAgICAvLyAgIHRoZSBsaWdhdHVyZSB0byBrZWVwIGl0cyBvbGQgbGlnYXR1cmUgaWQuICBUaGlzIHdpbGwgYWxsb3cgaXQgdG8gYXR0YWNoIHRvXG4gICAgICAgICAgICAvLyAgIGEgYmFzZSBsaWdhdHVyZSBpbiBHUE9TLiAgRWcuIGlmIHRoZSBzZXF1ZW5jZSBpczogTEFNLExBTSxTSEFEREEsRkFUSEEsSEVILFxuICAgICAgICAgICAgLy8gICBhbmQgTEFNLExBTSxIRUggZm9yIGEgbGlnYXR1cmUsIHRoZXkgd2lsbCBsZWF2ZSBTSEFEREEgYW5kIEZBVEhBIHdpdGggYVxuICAgICAgICAgICAgLy8gICBsaWdhdHVyZSBpZCBhbmQgY29tcG9uZW50IHZhbHVlIG9mIDIuICBUaGVuIGlmIFNIQUREQSxGQVRIQSBmb3JtIGEgbGlnYXR1cmVcbiAgICAgICAgICAgIC8vICAgbGF0ZXIsIHdlIGRvbid0IHdhbnQgdGhlbSB0byBsb3NlIHRoZWlyIGxpZ2F0dXJlIGlkL2NvbXBvbmVudCwgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgIEdQT1Mgd2lsbCBmYWlsIHRvIGNvcnJlY3RseSBwb3NpdGlvbiB0aGUgbWFyayBsaWdhdHVyZSBvbiB0b3Agb2YgdGhlXG4gICAgICAgICAgICAvLyAgIExBTSxMQU0sSEVIIGxpZ2F0dXJlLiBTZWUgaHR0cHM6Ly9idWd6aWxsYS5nbm9tZS5vcmcvc2hvd19idWcuY2dpP2lkPTY3NjM0M1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIC0gSWYgYSBsaWdhdHVyZSBpcyBmb3JtZWQgb2YgY29tcG9uZW50cyB0aGF0IHNvbWUgb2Ygd2hpY2ggYXJlIGFsc28gbGlnYXR1cmVzXG4gICAgICAgICAgICAvLyAgIHRoZW1zZWx2ZXMsIGFuZCB0aG9zZSBsaWdhdHVyZSBjb21wb25lbnRzIGhhZCBtYXJrcyBhdHRhY2hlZCB0byAqdGhlaXIqXG4gICAgICAgICAgICAvLyAgIGNvbXBvbmVudHMsIHdlIGhhdmUgdG8gYXR0YWNoIHRoZSBtYXJrcyB0byB0aGUgbmV3IGxpZ2F0dXJlIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gICBwb3NpdGlvbnMhICBOb3cgKnRoYXQqJ3MgdHJpY2t5ISAgQW5kIHRoZXNlIG1hcmtzIG1heSBiZSBmb2xsb3dpbmcgdGhlXG4gICAgICAgICAgICAvLyAgIGxhc3QgY29tcG9uZW50IG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgc28gd2Ugc2hvdWxkIGxvb3AgZm9yd2FyZCBsb29raW5nXG4gICAgICAgICAgICAvLyAgIGZvciB0aGVtIGFuZCB1cGRhdGUgdGhlbS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgIEVnLiB0aGUgc2VxdWVuY2UgaXMgTEFNLExBTSxTSEFEREEsRkFUSEEsSEVILCBhbmQgdGhlIGZvbnQgZmlyc3QgZm9ybXMgYVxuICAgICAgICAgICAgLy8gICAnY2FsdCcgbGlnYXR1cmUgb2YgTEFNLEhFSCwgbGVhdmluZyB0aGUgU0hBRERBIGFuZCBGQVRIQSB3aXRoIGEgbGlnYXR1cmVcbiAgICAgICAgICAgIC8vICAgaWQgYW5kIGNvbXBvbmVudCA9PSAxLiAgTm93LCBkdXJpbmcgJ2xpZ2EnLCB0aGUgTEFNIGFuZCB0aGUgTEFNLUhFSCBsaWdhdHVyZVxuICAgICAgICAgICAgLy8gICBmb3JtIGEgTEFNLUxBTS1IRUggbGlnYXR1cmUuICBXZSBuZWVkIHRvIHJlYXNzaWduIHRoZSBTSEFEREEgYW5kIEZBVEhBIHRvXG4gICAgICAgICAgICAvLyAgIHRoZSBuZXcgbGlnYXR1cmUgd2l0aCBhIGNvbXBvbmVudCB2YWx1ZSBvZiAyLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vICAgVGhpcyBpbiBmYWN0IGhhcHBlbmVkIHRvIGEgZm9udC4uLiAgU2VlIGh0dHBzOi8vYnVnemlsbGEuZ25vbWUub3JnL3Nob3dfYnVnLmNnaT9pZD00Mzc2MzNcblxuICAgICAgICAgICAgdmFyIGlzTWFya0xpZ2F0dXJlID0gX2N1ckdseXBoLmlzTWFyaztcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaGVkLmxlbmd0aCAmJiBpc01hcmtMaWdhdHVyZTsgaSsrKSB7XG4gICAgICAgICAgICAgIGlzTWFya0xpZ2F0dXJlID0gdGhpcy5nbHlwaHNbbWF0Y2hlZFtpXV0uaXNNYXJrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaWdhdHVyZUdseXBoLmxpZ2F0dXJlSUQgPSBpc01hcmtMaWdhdHVyZSA/IG51bGwgOiB0aGlzLmxpZ2F0dXJlSUQrKztcbiAgICAgICAgICAgIHZhciBsYXN0TGlnSUQgPSBfY3VyR2x5cGgubGlnYXR1cmVJRDtcbiAgICAgICAgICAgIHZhciBsYXN0TnVtQ29tcHMgPSBfY3VyR2x5cGguY29kZVBvaW50cy5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgY3VyQ29tcHMgPSBsYXN0TnVtQ29tcHM7XG4gICAgICAgICAgICB2YXIgaWR4ID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4ICsgMTsgLy8gU2V0IGxpZ2F0dXJlSUQgYW5kIGxpZ2F0dXJlQ29tcG9uZW50IG9uIGdseXBocyB0aGF0IHdlcmUgc2tpcHBlZCBpbiB0aGUgbWF0Y2hlZCBzZXF1ZW5jZS5cbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIEdQT1MgdG8gYXR0YWNoIG1hcmtzIHRvIHRoZSBjb3JyZWN0IGxpZ2F0dXJlIGNvbXBvbmVudHMuXG5cbiAgICAgICAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGkobWF0Y2hlZCksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgIHZhciBtYXRjaEluZGV4ID0gX3N0ZXAzLnZhbHVlO1xuXG4gICAgICAgICAgICAgIC8vIERvbid0IGFzc2lnbiBuZXcgbGlnYXR1cmUgY29tcG9uZW50cyBmb3IgbWFyayBsaWdhdHVyZXMgKHNlZSBhYm92ZSlcbiAgICAgICAgICAgICAgaWYgKGlzTWFya0xpZ2F0dXJlKSB7XG4gICAgICAgICAgICAgICAgaWR4ID0gbWF0Y2hJbmRleDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgbWF0Y2hJbmRleCkge1xuICAgICAgICAgICAgICAgICAgdmFyIGxpZ2F0dXJlQ29tcG9uZW50ID0gY3VyQ29tcHMgLSBsYXN0TnVtQ29tcHMgKyBNYXRoLm1pbih0aGlzLmdseXBoc1tpZHhdLmxpZ2F0dXJlQ29tcG9uZW50IHx8IDEsIGxhc3ROdW1Db21wcyk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmdseXBoc1tpZHhdLmxpZ2F0dXJlSUQgPSBsaWdhdHVyZUdseXBoLmxpZ2F0dXJlSUQ7XG4gICAgICAgICAgICAgICAgICB0aGlzLmdseXBoc1tpZHhdLmxpZ2F0dXJlQ29tcG9uZW50ID0gbGlnYXR1cmVDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICBpZHgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsYXN0TGlnSUQgPSB0aGlzLmdseXBoc1tpZHhdLmxpZ2F0dXJlSUQ7XG4gICAgICAgICAgICAgIGxhc3ROdW1Db21wcyA9IHRoaXMuZ2x5cGhzW2lkeF0uY29kZVBvaW50cy5sZW5ndGg7XG4gICAgICAgICAgICAgIGN1ckNvbXBzICs9IGxhc3ROdW1Db21wcztcbiAgICAgICAgICAgICAgaWR4Kys7IC8vIHNraXAgYmFzZSBnbHlwaFxuICAgICAgICAgICAgfSAvLyBBZGp1c3QgbGlnYXR1cmUgY29tcG9uZW50cyBmb3IgYW55IG1hcmtzIGZvbGxvd2luZ1xuXG5cbiAgICAgICAgICAgIGlmIChsYXN0TGlnSUQgJiYgIWlzTWFya0xpZ2F0dXJlKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIF9pID0gaWR4OyBfaSA8IHRoaXMuZ2x5cGhzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdseXBoc1tfaV0ubGlnYXR1cmVJRCA9PT0gbGFzdExpZ0lEKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbGlnYXR1cmVDb21wb25lbnQgPSBjdXJDb21wcyAtIGxhc3ROdW1Db21wcyArIE1hdGgubWluKHRoaXMuZ2x5cGhzW19pXS5saWdhdHVyZUNvbXBvbmVudCB8fCAxLCBsYXN0TnVtQ29tcHMpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5nbHlwaHNbX2ldLmxpZ2F0dXJlQ29tcG9uZW50ID0gbGlnYXR1cmVDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBEZWxldGUgdGhlIG1hdGNoZWQgZ2x5cGhzLCBhbmQgcmVwbGFjZSB0aGUgY3VycmVudCBnbHlwaCB3aXRoIHRoZSBsaWdhdHVyZSBnbHlwaFxuXG5cbiAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IG1hdGNoZWQubGVuZ3RoIC0gMTsgX2kyID49IDA7IF9pMi0tKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2x5cGhzLnNwbGljZShtYXRjaGVkW19pMl0sIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmdseXBoc1t0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXhdID0gbGlnYXR1cmVHbHlwaDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDU6XG4gICAgICAgIC8vIENvbnRleHR1YWwgU3Vic3RpdHV0aW9uXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5Q29udGV4dCh0YWJsZSk7XG5cbiAgICAgIGNhc2UgNjpcbiAgICAgICAgLy8gQ2hhaW5pbmcgQ29udGV4dHVhbCBTdWJzdGl0dXRpb25cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlDaGFpbmluZ0NvbnRleHQodGFibGUpO1xuXG4gICAgICBjYXNlIDc6XG4gICAgICAgIC8vIEV4dGVuc2lvbiBTdWJzdGl0dXRpb25cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMb29rdXAodGFibGUubG9va3VwVHlwZSwgdGFibGUuZXh0ZW5zaW9uKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR1NVQiBsb29rdXBUeXBlIFwiICsgbG9va3VwVHlwZSArIFwiIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBHU1VCUHJvY2Vzc29yO1xufShPVFByb2Nlc3Nvcik7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkaihvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkaihvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkaihvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGoobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRqKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkaihhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkOChzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIEdQT1NQcm9jZXNzb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9PVFByb2Nlc3Nvcikge1xuICBfaW5oZXJpdHNMb29zZSQ4KEdQT1NQcm9jZXNzb3IsIF9PVFByb2Nlc3Nvcik7XG5cbiAgZnVuY3Rpb24gR1BPU1Byb2Nlc3NvcigpIHtcbiAgICByZXR1cm4gX09UUHJvY2Vzc29yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBHUE9TUHJvY2Vzc29yLnByb3RvdHlwZTtcblxuICBfcHJvdG8uYXBwbHlQb3NpdGlvblZhbHVlID0gZnVuY3Rpb24gYXBwbHlQb3NpdGlvblZhbHVlKHNlcXVlbmNlSW5kZXgsIHZhbHVlKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbnNbdGhpcy5nbHlwaEl0ZXJhdG9yLnBlZWtJbmRleChzZXF1ZW5jZUluZGV4KV07XG5cbiAgICBpZiAodmFsdWUueEFkdmFuY2UgIT0gbnVsbCkge1xuICAgICAgcG9zaXRpb24ueEFkdmFuY2UgKz0gdmFsdWUueEFkdmFuY2U7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnlBZHZhbmNlICE9IG51bGwpIHtcbiAgICAgIHBvc2l0aW9uLnlBZHZhbmNlICs9IHZhbHVlLnlBZHZhbmNlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS54UGxhY2VtZW50ICE9IG51bGwpIHtcbiAgICAgIHBvc2l0aW9uLnhPZmZzZXQgKz0gdmFsdWUueFBsYWNlbWVudDtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUueVBsYWNlbWVudCAhPSBudWxsKSB7XG4gICAgICBwb3NpdGlvbi55T2Zmc2V0ICs9IHZhbHVlLnlQbGFjZW1lbnQ7XG4gICAgfSAvLyBBZGp1c3RtZW50cyBmb3IgZm9udCB2YXJpYXRpb25zXG5cblxuICAgIHZhciB2YXJpYXRpb25Qcm9jZXNzb3IgPSB0aGlzLmZvbnQuX3ZhcmlhdGlvblByb2Nlc3NvcjtcbiAgICB2YXIgdmFyaWF0aW9uU3RvcmUgPSB0aGlzLmZvbnQuR0RFRiAmJiB0aGlzLmZvbnQuR0RFRi5pdGVtVmFyaWF0aW9uU3RvcmU7XG5cbiAgICBpZiAodmFyaWF0aW9uUHJvY2Vzc29yICYmIHZhcmlhdGlvblN0b3JlKSB7XG4gICAgICBpZiAodmFsdWUueFBsYURldmljZSkge1xuICAgICAgICBwb3NpdGlvbi54T2Zmc2V0ICs9IHZhcmlhdGlvblByb2Nlc3Nvci5nZXREZWx0YSh2YXJpYXRpb25TdG9yZSwgdmFsdWUueFBsYURldmljZS5hLCB2YWx1ZS54UGxhRGV2aWNlLmIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUueVBsYURldmljZSkge1xuICAgICAgICBwb3NpdGlvbi55T2Zmc2V0ICs9IHZhcmlhdGlvblByb2Nlc3Nvci5nZXREZWx0YSh2YXJpYXRpb25TdG9yZSwgdmFsdWUueVBsYURldmljZS5hLCB2YWx1ZS55UGxhRGV2aWNlLmIpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUueEFkdkRldmljZSkge1xuICAgICAgICBwb3NpdGlvbi54QWR2YW5jZSArPSB2YXJpYXRpb25Qcm9jZXNzb3IuZ2V0RGVsdGEodmFyaWF0aW9uU3RvcmUsIHZhbHVlLnhBZHZEZXZpY2UuYSwgdmFsdWUueEFkdkRldmljZS5iKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlLnlBZHZEZXZpY2UpIHtcbiAgICAgICAgcG9zaXRpb24ueUFkdmFuY2UgKz0gdmFyaWF0aW9uUHJvY2Vzc29yLmdldERlbHRhKHZhcmlhdGlvblN0b3JlLCB2YWx1ZS55QWR2RGV2aWNlLmEsIHZhbHVlLnlBZHZEZXZpY2UuYik7XG4gICAgICB9XG4gICAgfSAvLyBUT0RPOiBkZXZpY2UgdGFibGVzXG5cbiAgfTtcblxuICBfcHJvdG8uYXBwbHlMb29rdXAgPSBmdW5jdGlvbiBhcHBseUxvb2t1cChsb29rdXBUeXBlLCB0YWJsZSkge1xuICAgIHN3aXRjaCAobG9va3VwVHlwZSkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gU2luZ2xlIHBvc2l0aW9uaW5nIHZhbHVlXG4gICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlKTtcblxuICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2l0Y2ggKHRhYmxlLnZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgdGhpcy5hcHBseVBvc2l0aW9uVmFsdWUoMCwgdGFibGUudmFsdWUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICB0aGlzLmFwcGx5UG9zaXRpb25WYWx1ZSgwLCB0YWJsZS52YWx1ZXMuZ2V0KGluZGV4KSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFBhaXIgQWRqdXN0bWVudCBQb3NpdGlvbmluZ1xuICAgICAgICAgIHZhciBuZXh0R2x5cGggPSB0aGlzLmdseXBoSXRlcmF0b3IucGVlaygpO1xuXG4gICAgICAgICAgaWYgKCFuZXh0R2x5cGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX2luZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlKTtcblxuICAgICAgICAgIGlmIChfaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dpdGNoICh0YWJsZS52ZXJzaW9uKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIC8vIEFkanVzdG1lbnRzIGZvciBnbHlwaCBwYWlyc1xuICAgICAgICAgICAgICB2YXIgc2V0ID0gdGFibGUucGFpclNldHMuZ2V0KF9pbmRleCk7XG5cbiAgICAgICAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRqKHNldCksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgdmFyIF9wYWlyID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoX3BhaXIuc2Vjb25kR2x5cGggPT09IG5leHRHbHlwaC5pZCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseVBvc2l0aW9uVmFsdWUoMCwgX3BhaXIudmFsdWUxKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlQb3NpdGlvblZhbHVlKDEsIF9wYWlyLnZhbHVlMik7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgLy8gQ2xhc3MgcGFpciBhZGp1c3RtZW50XG4gICAgICAgICAgICAgIHZhciBjbGFzczEgPSB0aGlzLmdldENsYXNzSUQodGhpcy5nbHlwaEl0ZXJhdG9yLmN1ci5pZCwgdGFibGUuY2xhc3NEZWYxKTtcbiAgICAgICAgICAgICAgdmFyIGNsYXNzMiA9IHRoaXMuZ2V0Q2xhc3NJRChuZXh0R2x5cGguaWQsIHRhYmxlLmNsYXNzRGVmMik7XG5cbiAgICAgICAgICAgICAgaWYgKGNsYXNzMSA9PT0gLTEgfHwgY2xhc3MyID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBwYWlyID0gdGFibGUuY2xhc3NSZWNvcmRzLmdldChjbGFzczEpLmdldChjbGFzczIpO1xuICAgICAgICAgICAgICB0aGlzLmFwcGx5UG9zaXRpb25WYWx1ZSgwLCBwYWlyLnZhbHVlMSk7XG4gICAgICAgICAgICAgIHRoaXMuYXBwbHlQb3NpdGlvblZhbHVlKDEsIHBhaXIudmFsdWUyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgMzpcbiAgICAgICAge1xuICAgICAgICAgIC8vIEN1cnNpdmUgQXR0YWNobWVudCBQb3NpdGlvbmluZ1xuICAgICAgICAgIHZhciBuZXh0SW5kZXggPSB0aGlzLmdseXBoSXRlcmF0b3IucGVla0luZGV4KCk7XG4gICAgICAgICAgdmFyIF9uZXh0R2x5cGggPSB0aGlzLmdseXBoc1tuZXh0SW5kZXhdO1xuXG4gICAgICAgICAgaWYgKCFfbmV4dEdseXBoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGN1clJlY29yZCA9IHRhYmxlLmVudHJ5RXhpdFJlY29yZHNbdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlKV07XG5cbiAgICAgICAgICBpZiAoIWN1clJlY29yZCB8fCAhY3VyUmVjb3JkLmV4aXRBbmNob3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbmV4dFJlY29yZCA9IHRhYmxlLmVudHJ5RXhpdFJlY29yZHNbdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLmNvdmVyYWdlLCBfbmV4dEdseXBoLmlkKV07XG5cbiAgICAgICAgICBpZiAoIW5leHRSZWNvcmQgfHwgIW5leHRSZWNvcmQuZW50cnlBbmNob3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLmdldEFuY2hvcihuZXh0UmVjb3JkLmVudHJ5QW5jaG9yKTtcbiAgICAgICAgICB2YXIgZXhpdCA9IHRoaXMuZ2V0QW5jaG9yKGN1clJlY29yZC5leGl0QW5jaG9yKTtcbiAgICAgICAgICB2YXIgY3VyID0gdGhpcy5wb3NpdGlvbnNbdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4XTtcbiAgICAgICAgICB2YXIgbmV4dCA9IHRoaXMucG9zaXRpb25zW25leHRJbmRleF07XG5cbiAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdsdHInOlxuICAgICAgICAgICAgICBjdXIueEFkdmFuY2UgPSBleGl0LnggKyBjdXIueE9mZnNldDtcbiAgICAgICAgICAgICAgdmFyIGQgPSBlbnRyeS54ICsgbmV4dC54T2Zmc2V0O1xuICAgICAgICAgICAgICBuZXh0LnhBZHZhbmNlIC09IGQ7XG4gICAgICAgICAgICAgIG5leHQueE9mZnNldCAtPSBkO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAncnRsJzpcbiAgICAgICAgICAgICAgZCA9IGV4aXQueCArIGN1ci54T2Zmc2V0O1xuICAgICAgICAgICAgICBjdXIueEFkdmFuY2UgLT0gZDtcbiAgICAgICAgICAgICAgY3VyLnhPZmZzZXQgLT0gZDtcbiAgICAgICAgICAgICAgbmV4dC54QWR2YW5jZSA9IGVudHJ5LnggKyBuZXh0LnhPZmZzZXQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLmdseXBoSXRlcmF0b3IuZmxhZ3MucmlnaHRUb0xlZnQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhJdGVyYXRvci5jdXIuY3Vyc2l2ZUF0dGFjaG1lbnQgPSBuZXh0SW5kZXg7XG4gICAgICAgICAgICBjdXIueU9mZnNldCA9IGVudHJ5LnkgLSBleGl0Lnk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9uZXh0R2x5cGguY3Vyc2l2ZUF0dGFjaG1lbnQgPSB0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXg7XG4gICAgICAgICAgICBjdXIueU9mZnNldCA9IGV4aXQueSAtIGVudHJ5Lnk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gTWFyayB0byBiYXNlIHBvc2l0aW9uaW5nXG4gICAgICAgICAgdmFyIG1hcmtJbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5tYXJrQ292ZXJhZ2UpO1xuXG4gICAgICAgICAgaWYgKG1hcmtJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IC8vIHNlYXJjaCBiYWNrd2FyZCBmb3IgYSBiYXNlIGdseXBoXG5cblxuICAgICAgICAgIHZhciBiYXNlR2x5cGhJbmRleCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5pbmRleDtcblxuICAgICAgICAgIHdoaWxlICgtLWJhc2VHbHlwaEluZGV4ID49IDAgJiYgKHRoaXMuZ2x5cGhzW2Jhc2VHbHlwaEluZGV4XS5pc01hcmsgfHwgdGhpcy5nbHlwaHNbYmFzZUdseXBoSW5kZXhdLmxpZ2F0dXJlQ29tcG9uZW50ID4gMCkpIHtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYmFzZUdseXBoSW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGJhc2VJbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5iYXNlQ292ZXJhZ2UsIHRoaXMuZ2x5cGhzW2Jhc2VHbHlwaEluZGV4XS5pZCk7XG5cbiAgICAgICAgICBpZiAoYmFzZUluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBtYXJrUmVjb3JkID0gdGFibGUubWFya0FycmF5W21hcmtJbmRleF07XG4gICAgICAgICAgdmFyIGJhc2VBbmNob3IgPSB0YWJsZS5iYXNlQXJyYXlbYmFzZUluZGV4XVttYXJrUmVjb3JkW1wiY2xhc3NcIl1dO1xuICAgICAgICAgIHRoaXMuYXBwbHlBbmNob3IobWFya1JlY29yZCwgYmFzZUFuY2hvciwgYmFzZUdseXBoSW5kZXgpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgNTpcbiAgICAgICAge1xuICAgICAgICAgIC8vIE1hcmsgdG8gbGlnYXR1cmUgcG9zaXRpb25pbmdcbiAgICAgICAgICB2YXIgX21hcmtJbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5tYXJrQ292ZXJhZ2UpO1xuXG4gICAgICAgICAgaWYgKF9tYXJrSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSAvLyBzZWFyY2ggYmFja3dhcmQgZm9yIGEgYmFzZSBnbHlwaFxuXG5cbiAgICAgICAgICB2YXIgX2Jhc2VHbHlwaEluZGV4ID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmluZGV4O1xuXG4gICAgICAgICAgd2hpbGUgKC0tX2Jhc2VHbHlwaEluZGV4ID49IDAgJiYgdGhpcy5nbHlwaHNbX2Jhc2VHbHlwaEluZGV4XS5pc01hcmspIHtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2Jhc2VHbHlwaEluZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBsaWdJbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5saWdhdHVyZUNvdmVyYWdlLCB0aGlzLmdseXBoc1tfYmFzZUdseXBoSW5kZXhdLmlkKTtcblxuICAgICAgICAgIGlmIChsaWdJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbGlnQXR0YWNoID0gdGFibGUubGlnYXR1cmVBcnJheVtsaWdJbmRleF07XG4gICAgICAgICAgdmFyIG1hcmtHbHlwaCA9IHRoaXMuZ2x5cGhJdGVyYXRvci5jdXI7XG4gICAgICAgICAgdmFyIGxpZ0dseXBoID0gdGhpcy5nbHlwaHNbX2Jhc2VHbHlwaEluZGV4XTtcbiAgICAgICAgICB2YXIgY29tcEluZGV4ID0gbGlnR2x5cGgubGlnYXR1cmVJRCAmJiBsaWdHbHlwaC5saWdhdHVyZUlEID09PSBtYXJrR2x5cGgubGlnYXR1cmVJRCAmJiBtYXJrR2x5cGgubGlnYXR1cmVDb21wb25lbnQgPiAwID8gTWF0aC5taW4obWFya0dseXBoLmxpZ2F0dXJlQ29tcG9uZW50LCBsaWdHbHlwaC5jb2RlUG9pbnRzLmxlbmd0aCkgLSAxIDogbGlnR2x5cGguY29kZVBvaW50cy5sZW5ndGggLSAxO1xuICAgICAgICAgIHZhciBfbWFya1JlY29yZCA9IHRhYmxlLm1hcmtBcnJheVtfbWFya0luZGV4XTtcbiAgICAgICAgICB2YXIgX2Jhc2VBbmNob3IgPSBsaWdBdHRhY2hbY29tcEluZGV4XVtfbWFya1JlY29yZFtcImNsYXNzXCJdXTtcbiAgICAgICAgICB0aGlzLmFwcGx5QW5jaG9yKF9tYXJrUmVjb3JkLCBfYmFzZUFuY2hvciwgX2Jhc2VHbHlwaEluZGV4KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIDY6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBNYXJrIHRvIG1hcmsgcG9zaXRpb25pbmdcbiAgICAgICAgICB2YXIgbWFyazFJbmRleCA9IHRoaXMuY292ZXJhZ2VJbmRleCh0YWJsZS5tYXJrMUNvdmVyYWdlKTtcblxuICAgICAgICAgIGlmIChtYXJrMUluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gLy8gZ2V0IHRoZSBwcmV2aW91cyBtYXJrIHRvIGF0dGFjaCB0b1xuXG5cbiAgICAgICAgICB2YXIgcHJldkluZGV4ID0gdGhpcy5nbHlwaEl0ZXJhdG9yLnBlZWtJbmRleCgtMSk7XG4gICAgICAgICAgdmFyIHByZXYgPSB0aGlzLmdseXBoc1twcmV2SW5kZXhdO1xuXG4gICAgICAgICAgaWYgKCFwcmV2IHx8ICFwcmV2LmlzTWFyaykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfY3VyID0gdGhpcy5nbHlwaEl0ZXJhdG9yLmN1cjsgLy8gVGhlIGZvbGxvd2luZyBsb2dpYyB3YXMgYm9ycm93ZWQgZnJvbSBIYXJmYnV6elxuXG4gICAgICAgICAgdmFyIGdvb2QgPSBmYWxzZTtcblxuICAgICAgICAgIGlmIChfY3VyLmxpZ2F0dXJlSUQgPT09IHByZXYubGlnYXR1cmVJRCkge1xuICAgICAgICAgICAgaWYgKCFfY3VyLmxpZ2F0dXJlSUQpIHtcbiAgICAgICAgICAgICAgLy8gTWFya3MgYmVsb25naW5nIHRvIHRoZSBzYW1lIGJhc2VcbiAgICAgICAgICAgICAgZ29vZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF9jdXIubGlnYXR1cmVDb21wb25lbnQgPT09IHByZXYubGlnYXR1cmVDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgLy8gTWFya3MgYmVsb25naW5nIHRvIHRoZSBzYW1lIGxpZ2F0dXJlIGNvbXBvbmVudFxuICAgICAgICAgICAgICBnb29kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgbGlnYXR1cmUgaWRzIGRvbid0IG1hdGNoLCBpdCBtYXkgYmUgdGhlIGNhc2UgdGhhdCBvbmUgb2YgdGhlIG1hcmtzXG4gICAgICAgICAgICAvLyBpdHNlbGYgaXMgYSBsaWdhdHVyZSwgaW4gd2hpY2ggY2FzZSBtYXRjaC5cbiAgICAgICAgICAgIGlmIChfY3VyLmxpZ2F0dXJlSUQgJiYgIV9jdXIubGlnYXR1cmVDb21wb25lbnQgfHwgcHJldi5saWdhdHVyZUlEICYmICFwcmV2LmxpZ2F0dXJlQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIGdvb2QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZ29vZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBtYXJrMkluZGV4ID0gdGhpcy5jb3ZlcmFnZUluZGV4KHRhYmxlLm1hcmsyQ292ZXJhZ2UsIHByZXYuaWQpO1xuXG4gICAgICAgICAgaWYgKG1hcmsySW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9tYXJrUmVjb3JkMiA9IHRhYmxlLm1hcmsxQXJyYXlbbWFyazFJbmRleF07XG4gICAgICAgICAgdmFyIF9iYXNlQW5jaG9yMiA9IHRhYmxlLm1hcmsyQXJyYXlbbWFyazJJbmRleF1bX21hcmtSZWNvcmQyW1wiY2xhc3NcIl1dO1xuICAgICAgICAgIHRoaXMuYXBwbHlBbmNob3IoX21hcmtSZWNvcmQyLCBfYmFzZUFuY2hvcjIsIHByZXZJbmRleCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSA3OlxuICAgICAgICAvLyBDb250ZXh0dWFsIHBvc2l0aW9uaW5nXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5Q29udGV4dCh0YWJsZSk7XG5cbiAgICAgIGNhc2UgODpcbiAgICAgICAgLy8gQ2hhaW5pbmcgY29udGV4dHVhbCBwb3NpdGlvbmluZ1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBseUNoYWluaW5nQ29udGV4dCh0YWJsZSk7XG5cbiAgICAgIGNhc2UgOTpcbiAgICAgICAgLy8gRXh0ZW5zaW9uIHBvc2l0aW9uaW5nXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5TG9va3VwKHRhYmxlLmxvb2t1cFR5cGUsIHRhYmxlLmV4dGVuc2lvbik7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIEdQT1MgdGFibGU6IFwiICsgbG9va3VwVHlwZSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5hcHBseUFuY2hvciA9IGZ1bmN0aW9uIGFwcGx5QW5jaG9yKG1hcmtSZWNvcmQsIGJhc2VBbmNob3IsIGJhc2VHbHlwaEluZGV4KSB7XG4gICAgdmFyIGJhc2VDb29yZHMgPSB0aGlzLmdldEFuY2hvcihiYXNlQW5jaG9yKTtcbiAgICB2YXIgbWFya0Nvb3JkcyA9IHRoaXMuZ2V0QW5jaG9yKG1hcmtSZWNvcmQubWFya0FuY2hvcik7XG4gICAgdmFyIGJhc2VQb3MgPSB0aGlzLnBvc2l0aW9uc1tiYXNlR2x5cGhJbmRleF07XG4gICAgdmFyIG1hcmtQb3MgPSB0aGlzLnBvc2l0aW9uc1t0aGlzLmdseXBoSXRlcmF0b3IuaW5kZXhdO1xuICAgIG1hcmtQb3MueE9mZnNldCA9IGJhc2VDb29yZHMueCAtIG1hcmtDb29yZHMueDtcbiAgICBtYXJrUG9zLnlPZmZzZXQgPSBiYXNlQ29vcmRzLnkgLSBtYXJrQ29vcmRzLnk7XG4gICAgdGhpcy5nbHlwaEl0ZXJhdG9yLmN1ci5tYXJrQXR0YWNobWVudCA9IGJhc2VHbHlwaEluZGV4O1xuICB9O1xuXG4gIF9wcm90by5nZXRBbmNob3IgPSBmdW5jdGlvbiBnZXRBbmNob3IoYW5jaG9yKSB7XG4gICAgLy8gVE9ETzogY29udG91ciBwb2ludCwgZGV2aWNlIHRhYmxlc1xuICAgIHZhciB4ID0gYW5jaG9yLnhDb29yZGluYXRlO1xuICAgIHZhciB5ID0gYW5jaG9yLnlDb29yZGluYXRlOyAvLyBBZGp1c3RtZW50cyBmb3IgZm9udCB2YXJpYXRpb25zXG5cbiAgICB2YXIgdmFyaWF0aW9uUHJvY2Vzc29yID0gdGhpcy5mb250Ll92YXJpYXRpb25Qcm9jZXNzb3I7XG4gICAgdmFyIHZhcmlhdGlvblN0b3JlID0gdGhpcy5mb250LkdERUYgJiYgdGhpcy5mb250LkdERUYuaXRlbVZhcmlhdGlvblN0b3JlO1xuXG4gICAgaWYgKHZhcmlhdGlvblByb2Nlc3NvciAmJiB2YXJpYXRpb25TdG9yZSkge1xuICAgICAgaWYgKGFuY2hvci54RGV2aWNlVGFibGUpIHtcbiAgICAgICAgeCArPSB2YXJpYXRpb25Qcm9jZXNzb3IuZ2V0RGVsdGEodmFyaWF0aW9uU3RvcmUsIGFuY2hvci54RGV2aWNlVGFibGUuYSwgYW5jaG9yLnhEZXZpY2VUYWJsZS5iKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFuY2hvci55RGV2aWNlVGFibGUpIHtcbiAgICAgICAgeSArPSB2YXJpYXRpb25Qcm9jZXNzb3IuZ2V0RGVsdGEodmFyaWF0aW9uU3RvcmUsIGFuY2hvci55RGV2aWNlVGFibGUuYSwgYW5jaG9yLnlEZXZpY2VUYWJsZS5iKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9O1xuICB9O1xuXG4gIF9wcm90by5hcHBseUZlYXR1cmVzID0gZnVuY3Rpb24gYXBwbHlGZWF0dXJlcyh1c2VyRmVhdHVyZXMsIGdseXBocywgYWR2YW5jZXMpIHtcbiAgICBfT1RQcm9jZXNzb3IucHJvdG90eXBlLmFwcGx5RmVhdHVyZXMuY2FsbCh0aGlzLCB1c2VyRmVhdHVyZXMsIGdseXBocywgYWR2YW5jZXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdseXBocy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5maXhDdXJzaXZlQXR0YWNobWVudChpKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpeE1hcmtBdHRhY2htZW50KCk7XG4gIH07XG5cbiAgX3Byb3RvLmZpeEN1cnNpdmVBdHRhY2htZW50ID0gZnVuY3Rpb24gZml4Q3Vyc2l2ZUF0dGFjaG1lbnQoaSkge1xuICAgIHZhciBnbHlwaCA9IHRoaXMuZ2x5cGhzW2ldO1xuXG4gICAgaWYgKGdseXBoLmN1cnNpdmVBdHRhY2htZW50ICE9IG51bGwpIHtcbiAgICAgIHZhciBqID0gZ2x5cGguY3Vyc2l2ZUF0dGFjaG1lbnQ7XG4gICAgICBnbHlwaC5jdXJzaXZlQXR0YWNobWVudCA9IG51bGw7XG4gICAgICB0aGlzLmZpeEN1cnNpdmVBdHRhY2htZW50KGopO1xuICAgICAgdGhpcy5wb3NpdGlvbnNbaV0ueU9mZnNldCArPSB0aGlzLnBvc2l0aW9uc1tqXS55T2Zmc2V0O1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZml4TWFya0F0dGFjaG1lbnQgPSBmdW5jdGlvbiBmaXhNYXJrQXR0YWNobWVudCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZ2x5cGggPSB0aGlzLmdseXBoc1tpXTtcblxuICAgICAgaWYgKGdseXBoLm1hcmtBdHRhY2htZW50ICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGogPSBnbHlwaC5tYXJrQXR0YWNobWVudDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNbaV0ueE9mZnNldCArPSB0aGlzLnBvc2l0aW9uc1tqXS54T2Zmc2V0O1xuICAgICAgICB0aGlzLnBvc2l0aW9uc1tpXS55T2Zmc2V0ICs9IHRoaXMucG9zaXRpb25zW2pdLnlPZmZzZXQ7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAnbHRyJykge1xuICAgICAgICAgIGZvciAodmFyIGsgPSBqOyBrIDwgaTsgaysrKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uc1tpXS54T2Zmc2V0IC09IHRoaXMucG9zaXRpb25zW2tdLnhBZHZhbmNlO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnNbaV0ueU9mZnNldCAtPSB0aGlzLnBvc2l0aW9uc1trXS55QWR2YW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yICh2YXIgX2sgPSBqICsgMTsgX2sgPCBpICsgMTsgX2srKykge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnNbaV0ueE9mZnNldCArPSB0aGlzLnBvc2l0aW9uc1tfa10ueEFkdmFuY2U7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uc1tpXS55T2Zmc2V0ICs9IHRoaXMucG9zaXRpb25zW19rXS55QWR2YW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEdQT1NQcm9jZXNzb3I7XG59KE9UUHJvY2Vzc29yKTtcblxudmFyIE9UTGF5b3V0RW5naW5lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gT1RMYXlvdXRFbmdpbmUoZm9udCkge1xuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgdGhpcy5nbHlwaEluZm9zID0gbnVsbDtcbiAgICB0aGlzLnBsYW4gPSBudWxsO1xuICAgIHRoaXMuR1NVQlByb2Nlc3NvciA9IG51bGw7XG4gICAgdGhpcy5HUE9TUHJvY2Vzc29yID0gbnVsbDtcbiAgICB0aGlzLmZhbGxiYWNrUG9zaXRpb24gPSB0cnVlO1xuXG4gICAgaWYgKGZvbnQuR1NVQikge1xuICAgICAgdGhpcy5HU1VCUHJvY2Vzc29yID0gbmV3IEdTVUJQcm9jZXNzb3IoZm9udCwgZm9udC5HU1VCKTtcbiAgICB9XG5cbiAgICBpZiAoZm9udC5HUE9TKSB7XG4gICAgICB0aGlzLkdQT1NQcm9jZXNzb3IgPSBuZXcgR1BPU1Byb2Nlc3Nvcihmb250LCBmb250LkdQT1MpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBPVExheW91dEVuZ2luZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnNldHVwID0gZnVuY3Rpb24gc2V0dXAoZ2x5cGhSdW4pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy8gTWFwIGdseXBocyB0byBHbHlwaEluZm8gb2JqZWN0cyBzbyBkYXRhIGNhbiBiZSBwYXNzZWQgYmV0d2VlblxuICAgIC8vIEdTVUIgYW5kIEdQT1Mgd2l0aG91dCBtdXRhdGluZyB0aGUgcmVhbCAoc2hhcmVkKSBHbHlwaCBvYmplY3RzLlxuICAgIHRoaXMuZ2x5cGhJbmZvcyA9IGdseXBoUnVuLmdseXBocy5tYXAoZnVuY3Rpb24gKGdseXBoKSB7XG4gICAgICByZXR1cm4gbmV3IEdseXBoSW5mbyhfdGhpcy5mb250LCBnbHlwaC5pZCwgW10uY29uY2F0KGdseXBoLmNvZGVQb2ludHMpKTtcbiAgICB9KTsgLy8gU2VsZWN0IGEgc2NyaXB0IGJhc2VkIG9uIHdoYXQgaXMgYXZhaWxhYmxlIGluIEdTVUIvR1BPUy5cblxuICAgIHZhciBzY3JpcHQgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuR1BPU1Byb2Nlc3Nvcikge1xuICAgICAgc2NyaXB0ID0gdGhpcy5HUE9TUHJvY2Vzc29yLnNlbGVjdFNjcmlwdChnbHlwaFJ1bi5zY3JpcHQsIGdseXBoUnVuLmxhbmd1YWdlLCBnbHlwaFJ1bi5kaXJlY3Rpb24pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLkdTVUJQcm9jZXNzb3IpIHtcbiAgICAgIHNjcmlwdCA9IHRoaXMuR1NVQlByb2Nlc3Nvci5zZWxlY3RTY3JpcHQoZ2x5cGhSdW4uc2NyaXB0LCBnbHlwaFJ1bi5sYW5ndWFnZSwgZ2x5cGhSdW4uZGlyZWN0aW9uKTtcbiAgICB9IC8vIENob29zZSBhIHNoYXBlciBiYXNlZCBvbiB0aGUgc2NyaXB0LCBhbmQgc2V0dXAgYSBzaGFwaW5nIHBsYW4uXG4gICAgLy8gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIGZlYXR1cmVzIHRvIGFwcGx5IHRvIHdoaWNoIGdseXBocy5cblxuXG4gICAgdGhpcy5zaGFwZXIgPSBjaG9vc2Uoc2NyaXB0KTtcbiAgICB0aGlzLnBsYW4gPSBuZXcgU2hhcGluZ1BsYW4odGhpcy5mb250LCBzY3JpcHQsIGdseXBoUnVuLmRpcmVjdGlvbik7XG4gICAgdGhpcy5zaGFwZXIucGxhbih0aGlzLnBsYW4sIHRoaXMuZ2x5cGhJbmZvcywgZ2x5cGhSdW4uZmVhdHVyZXMpOyAvLyBBc3NpZ24gY2hvc2VuIGZlYXR1cmVzIHRvIG91dHB1dCBnbHlwaCBydW5cblxuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnBsYW4uYWxsRmVhdHVyZXMpIHtcbiAgICAgIGdseXBoUnVuLmZlYXR1cmVzW2tleV0gPSB0cnVlO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc3Vic3RpdHV0ZSA9IGZ1bmN0aW9uIHN1YnN0aXR1dGUoZ2x5cGhSdW4pIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmICh0aGlzLkdTVUJQcm9jZXNzb3IpIHtcbiAgICAgIHRoaXMucGxhbi5wcm9jZXNzKHRoaXMuR1NVQlByb2Nlc3NvciwgdGhpcy5nbHlwaEluZm9zKTsgLy8gTWFwIGdseXBoIGluZm9zIGJhY2sgdG8gbm9ybWFsIEdseXBoIG9iamVjdHNcblxuICAgICAgZ2x5cGhSdW4uZ2x5cGhzID0gdGhpcy5nbHlwaEluZm9zLm1hcChmdW5jdGlvbiAoZ2x5cGhJbmZvKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuZm9udC5nZXRHbHlwaChnbHlwaEluZm8uaWQsIGdseXBoSW5mby5jb2RlUG9pbnRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucG9zaXRpb24gPSBmdW5jdGlvbiBwb3NpdGlvbihnbHlwaFJ1bikge1xuICAgIGlmICh0aGlzLnNoYXBlci56ZXJvTWFya1dpZHRocyA9PT0gJ0JFRk9SRV9HUE9TJykge1xuICAgICAgdGhpcy56ZXJvTWFya0FkdmFuY2VzKGdseXBoUnVuLnBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuR1BPU1Byb2Nlc3Nvcikge1xuICAgICAgdGhpcy5wbGFuLnByb2Nlc3ModGhpcy5HUE9TUHJvY2Vzc29yLCB0aGlzLmdseXBoSW5mb3MsIGdseXBoUnVuLnBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hhcGVyLnplcm9NYXJrV2lkdGhzID09PSAnQUZURVJfR1BPUycpIHtcbiAgICAgIHRoaXMuemVyb01hcmtBZHZhbmNlcyhnbHlwaFJ1bi5wb3NpdGlvbnMpO1xuICAgIH0gLy8gUmV2ZXJzZSB0aGUgZ2x5cGhzIGFuZCBwb3NpdGlvbnMgaWYgdGhlIHNjcmlwdCBpcyByaWdodC10by1sZWZ0XG5cblxuICAgIGlmIChnbHlwaFJ1bi5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgICBnbHlwaFJ1bi5nbHlwaHMucmV2ZXJzZSgpO1xuICAgICAgZ2x5cGhSdW4ucG9zaXRpb25zLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5HUE9TUHJvY2Vzc29yICYmIHRoaXMuR1BPU1Byb2Nlc3Nvci5mZWF0dXJlcztcbiAgfTtcblxuICBfcHJvdG8uemVyb01hcmtBZHZhbmNlcyA9IGZ1bmN0aW9uIHplcm9NYXJrQWR2YW5jZXMocG9zaXRpb25zKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdseXBoSW5mb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmdseXBoSW5mb3NbaV0uaXNNYXJrKSB7XG4gICAgICAgIHBvc2l0aW9uc1tpXS54QWR2YW5jZSA9IDA7XG4gICAgICAgIHBvc2l0aW9uc1tpXS55QWR2YW5jZSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jbGVhbnVwID0gZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICB0aGlzLmdseXBoSW5mb3MgPSBudWxsO1xuICAgIHRoaXMucGxhbiA9IG51bGw7XG4gICAgdGhpcy5zaGFwZXIgPSBudWxsO1xuICB9O1xuXG4gIF9wcm90by5nZXRBdmFpbGFibGVGZWF0dXJlcyA9IGZ1bmN0aW9uIGdldEF2YWlsYWJsZUZlYXR1cmVzKHNjcmlwdCwgbGFuZ3VhZ2UpIHtcbiAgICB2YXIgZmVhdHVyZXMgPSBbXTtcblxuICAgIGlmICh0aGlzLkdTVUJQcm9jZXNzb3IpIHtcbiAgICAgIHRoaXMuR1NVQlByb2Nlc3Nvci5zZWxlY3RTY3JpcHQoc2NyaXB0LCBsYW5ndWFnZSk7XG4gICAgICBmZWF0dXJlcy5wdXNoLmFwcGx5KGZlYXR1cmVzLCBPYmplY3Qua2V5cyh0aGlzLkdTVUJQcm9jZXNzb3IuZmVhdHVyZXMpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5HUE9TUHJvY2Vzc29yKSB7XG4gICAgICB0aGlzLkdQT1NQcm9jZXNzb3Iuc2VsZWN0U2NyaXB0KHNjcmlwdCwgbGFuZ3VhZ2UpO1xuICAgICAgZmVhdHVyZXMucHVzaC5hcHBseShmZWF0dXJlcywgT2JqZWN0LmtleXModGhpcy5HUE9TUHJvY2Vzc29yLmZlYXR1cmVzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZlYXR1cmVzO1xuICB9O1xuXG4gIHJldHVybiBPVExheW91dEVuZ2luZTtcbn0oKTtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRrKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRrKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRrKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkayhvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JGsobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRrKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgTGF5b3V0RW5naW5lID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGF5b3V0RW5naW5lKGZvbnQpIHtcbiAgICB0aGlzLmZvbnQgPSBmb250O1xuICAgIHRoaXMudW5pY29kZUxheW91dEVuZ2luZSA9IG51bGw7XG4gICAgdGhpcy5rZXJuUHJvY2Vzc29yID0gbnVsbDsgLy8gQ2hvb3NlIGFuIGFkdmFuY2VkIGxheW91dCBlbmdpbmUuIFdlIHRyeSB0aGUgQUFUIG1vcnggdGFibGUgZmlyc3Qgc2luY2UgbW9yZVxuICAgIC8vIHNjcmlwdHMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgYmVjYXVzZSB0aGUgc2hhcGluZyBsb2dpYyBpcyBidWlsdCBpbnRvIHRoZSBmb250LlxuXG4gICAgaWYgKHRoaXMuZm9udC5tb3J4KSB7XG4gICAgICB0aGlzLmVuZ2luZSA9IG5ldyBBQVRMYXlvdXRFbmdpbmUodGhpcy5mb250KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9udC5HU1VCIHx8IHRoaXMuZm9udC5HUE9TKSB7XG4gICAgICB0aGlzLmVuZ2luZSA9IG5ldyBPVExheW91dEVuZ2luZSh0aGlzLmZvbnQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBMYXlvdXRFbmdpbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5sYXlvdXQgPSBmdW5jdGlvbiBsYXlvdXQoc3RyaW5nLCBmZWF0dXJlcywgc2NyaXB0LCBsYW5ndWFnZSwgZGlyZWN0aW9uKSB7XG4gICAgLy8gTWFrZSB0aGUgZmVhdHVyZXMgcGFyYW1ldGVyIG9wdGlvbmFsXG4gICAgaWYgKHR5cGVvZiBmZWF0dXJlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRpcmVjdGlvbiA9IGxhbmd1YWdlO1xuICAgICAgbGFuZ3VhZ2UgPSBzY3JpcHQ7XG4gICAgICBzY3JpcHQgPSBmZWF0dXJlcztcbiAgICAgIGZlYXR1cmVzID0gW107XG4gICAgfSAvLyBNYXAgc3RyaW5nIHRvIGdseXBocyBpZiBuZWVkZWRcblxuXG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGRldGVjdCB0aGUgc2NyaXB0IGZyb20gdGhlIHN0cmluZyBpZiBub3QgcHJvdmlkZWQuXG4gICAgICBpZiAoc2NyaXB0ID09IG51bGwpIHtcbiAgICAgICAgc2NyaXB0ID0gZm9yU3RyaW5nKHN0cmluZyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBnbHlwaHMgPSB0aGlzLmZvbnQuZ2x5cGhzRm9yU3RyaW5nKHN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gZGV0ZWN0IHRoZSBzY3JpcHQgZnJvbSB0aGUgZ2x5cGggY29kZSBwb2ludHMgaWYgbm90IHByb3ZpZGVkLlxuICAgICAgaWYgKHNjcmlwdCA9PSBudWxsKSB7XG4gICAgICAgIHZhciBjb2RlUG9pbnRzID0gW107XG5cbiAgICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRrKHN0cmluZyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGdseXBoID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAgY29kZVBvaW50cy5wdXNoLmFwcGx5KGNvZGVQb2ludHMsIGdseXBoLmNvZGVQb2ludHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2NyaXB0ID0gZm9yQ29kZVBvaW50cyhjb2RlUG9pbnRzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGdseXBocyA9IHN0cmluZztcbiAgICB9XG5cbiAgICB2YXIgZ2x5cGhSdW4gPSBuZXcgR2x5cGhSdW4oZ2x5cGhzLCBmZWF0dXJlcywgc2NyaXB0LCBsYW5ndWFnZSwgZGlyZWN0aW9uKTsgLy8gUmV0dXJuIGVhcmx5IGlmIHRoZXJlIGFyZSBubyBnbHlwaHNcblxuICAgIGlmIChnbHlwaHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBnbHlwaFJ1bi5wb3NpdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybiBnbHlwaFJ1bjtcbiAgICB9IC8vIFNldHVwIHRoZSBhZHZhbmNlZCBsYXlvdXQgZW5naW5lXG5cblxuICAgIGlmICh0aGlzLmVuZ2luZSAmJiB0aGlzLmVuZ2luZS5zZXR1cCkge1xuICAgICAgdGhpcy5lbmdpbmUuc2V0dXAoZ2x5cGhSdW4pO1xuICAgIH0gLy8gU3Vic3RpdHV0ZSBhbmQgcG9zaXRpb24gdGhlIGdseXBoc1xuXG5cbiAgICB0aGlzLnN1YnN0aXR1dGUoZ2x5cGhSdW4pO1xuICAgIHRoaXMucG9zaXRpb24oZ2x5cGhSdW4pO1xuICAgIHRoaXMuaGlkZURlZmF1bHRJZ25vcmFibGVzKGdseXBoUnVuLmdseXBocywgZ2x5cGhSdW4ucG9zaXRpb25zKTsgLy8gTGV0IHRoZSBsYXlvdXQgZW5naW5lIGNsZWFuIHVwIGFueSBzdGF0ZSBpdCBtaWdodCBoYXZlXG5cbiAgICBpZiAodGhpcy5lbmdpbmUgJiYgdGhpcy5lbmdpbmUuY2xlYW51cCkge1xuICAgICAgdGhpcy5lbmdpbmUuY2xlYW51cCgpO1xuICAgIH1cblxuICAgIHJldHVybiBnbHlwaFJ1bjtcbiAgfTtcblxuICBfcHJvdG8uc3Vic3RpdHV0ZSA9IGZ1bmN0aW9uIHN1YnN0aXR1dGUoZ2x5cGhSdW4pIHtcbiAgICAvLyBDYWxsIHRoZSBhZHZhbmNlZCBsYXlvdXQgZW5naW5lIHRvIG1ha2Ugc3Vic3RpdHV0aW9uc1xuICAgIGlmICh0aGlzLmVuZ2luZSAmJiB0aGlzLmVuZ2luZS5zdWJzdGl0dXRlKSB7XG4gICAgICB0aGlzLmVuZ2luZS5zdWJzdGl0dXRlKGdseXBoUnVuKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnBvc2l0aW9uID0gZnVuY3Rpb24gcG9zaXRpb24oZ2x5cGhSdW4pIHtcbiAgICAvLyBHZXQgaW5pdGlhbCBnbHlwaCBwb3NpdGlvbnNcbiAgICBnbHlwaFJ1bi5wb3NpdGlvbnMgPSBnbHlwaFJ1bi5nbHlwaHMubWFwKGZ1bmN0aW9uIChnbHlwaCkge1xuICAgICAgcmV0dXJuIG5ldyBHbHlwaFBvc2l0aW9uKGdseXBoLmFkdmFuY2VXaWR0aCk7XG4gICAgfSk7XG4gICAgdmFyIHBvc2l0aW9uZWQgPSBudWxsOyAvLyBDYWxsIHRoZSBhZHZhbmNlZCBsYXlvdXQgZW5naW5lLiBSZXR1cm5zIHRoZSBmZWF0dXJlcyBhcHBsaWVkLlxuXG4gICAgaWYgKHRoaXMuZW5naW5lICYmIHRoaXMuZW5naW5lLnBvc2l0aW9uKSB7XG4gICAgICBwb3NpdGlvbmVkID0gdGhpcy5lbmdpbmUucG9zaXRpb24oZ2x5cGhSdW4pO1xuICAgIH0gLy8gaWYgdGhlcmUgaXMgbm8gR1BPUyB0YWJsZSwgdXNlIHVuaWNvZGUgcHJvcGVydGllcyB0byBwb3NpdGlvbiBtYXJrcy5cblxuXG4gICAgaWYgKCFwb3NpdGlvbmVkICYmICghdGhpcy5lbmdpbmUgfHwgdGhpcy5lbmdpbmUuZmFsbGJhY2tQb3NpdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy51bmljb2RlTGF5b3V0RW5naW5lKSB7XG4gICAgICAgIHRoaXMudW5pY29kZUxheW91dEVuZ2luZSA9IG5ldyBVbmljb2RlTGF5b3V0RW5naW5lKHRoaXMuZm9udCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudW5pY29kZUxheW91dEVuZ2luZS5wb3NpdGlvbkdseXBocyhnbHlwaFJ1bi5nbHlwaHMsIGdseXBoUnVuLnBvc2l0aW9ucyk7XG4gICAgfSAvLyBpZiBrZXJuaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgR1BPUywgZG8ga2VybmluZyB3aXRoIHRoZSBUcnVlVHlwZS9BQVQga2VybiB0YWJsZVxuXG5cbiAgICBpZiAoKCFwb3NpdGlvbmVkIHx8ICFwb3NpdGlvbmVkLmtlcm4pICYmIGdseXBoUnVuLmZlYXR1cmVzLmtlcm4gIT09IGZhbHNlICYmIHRoaXMuZm9udC5rZXJuKSB7XG4gICAgICBpZiAoIXRoaXMua2VyblByb2Nlc3Nvcikge1xuICAgICAgICB0aGlzLmtlcm5Qcm9jZXNzb3IgPSBuZXcgS2VyblByb2Nlc3Nvcih0aGlzLmZvbnQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmtlcm5Qcm9jZXNzb3IucHJvY2VzcyhnbHlwaFJ1bi5nbHlwaHMsIGdseXBoUnVuLnBvc2l0aW9ucyk7XG4gICAgICBnbHlwaFJ1bi5mZWF0dXJlcy5rZXJuID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmhpZGVEZWZhdWx0SWdub3JhYmxlcyA9IGZ1bmN0aW9uIGhpZGVEZWZhdWx0SWdub3JhYmxlcyhnbHlwaHMsIHBvc2l0aW9ucykge1xuICAgIHZhciBzcGFjZSA9IHRoaXMuZm9udC5nbHlwaEZvckNvZGVQb2ludCgweDIwKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2x5cGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pc0RlZmF1bHRJZ25vcmFibGUoZ2x5cGhzW2ldLmNvZGVQb2ludHNbMF0pKSB7XG4gICAgICAgIGdseXBoc1tpXSA9IHNwYWNlO1xuICAgICAgICBwb3NpdGlvbnNbaV0ueEFkdmFuY2UgPSAwO1xuICAgICAgICBwb3NpdGlvbnNbaV0ueUFkdmFuY2UgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uaXNEZWZhdWx0SWdub3JhYmxlID0gZnVuY3Rpb24gaXNEZWZhdWx0SWdub3JhYmxlKGNoKSB7XG4gICAgLy8gRnJvbSBEZXJpdmVkQ29yZVByb3BlcnRpZXMudHh0IGluIHRoZSBVbmljb2RlIGRhdGFiYXNlLFxuICAgIC8vIG1pbnVzIFUrMTE1RiwgVSsxMTYwLCBVKzMxNjQgYW5kIFUrRkZBMCwgd2hpY2ggaXMgd2hhdFxuICAgIC8vIEhhcmZidXp6IGFuZCBVbmlzY3JpYmUgZG8uXG4gICAgdmFyIHBsYW5lID0gY2ggPj4gMTY7XG5cbiAgICBpZiAocGxhbmUgPT09IDApIHtcbiAgICAgIC8vIEJNUFxuICAgICAgc3dpdGNoIChjaCA+PiA4KSB7XG4gICAgICAgIGNhc2UgMHgwMDpcbiAgICAgICAgICByZXR1cm4gY2ggPT09IDB4MDBBRDtcblxuICAgICAgICBjYXNlIDB4MDM6XG4gICAgICAgICAgcmV0dXJuIGNoID09PSAweDAzNEY7XG5cbiAgICAgICAgY2FzZSAweDA2OlxuICAgICAgICAgIHJldHVybiBjaCA9PT0gMHgwNjFDO1xuXG4gICAgICAgIGNhc2UgMHgxNzpcbiAgICAgICAgICByZXR1cm4gMHgxN0I0IDw9IGNoICYmIGNoIDw9IDB4MTdCNTtcblxuICAgICAgICBjYXNlIDB4MTg6XG4gICAgICAgICAgcmV0dXJuIDB4MTgwQiA8PSBjaCAmJiBjaCA8PSAweDE4MEU7XG5cbiAgICAgICAgY2FzZSAweDIwOlxuICAgICAgICAgIHJldHVybiAweDIwMEIgPD0gY2ggJiYgY2ggPD0gMHgyMDBGIHx8IDB4MjAyQSA8PSBjaCAmJiBjaCA8PSAweDIwMkUgfHwgMHgyMDYwIDw9IGNoICYmIGNoIDw9IDB4MjA2RjtcblxuICAgICAgICBjYXNlIDB4RkU6XG4gICAgICAgICAgcmV0dXJuIDB4RkUwMCA8PSBjaCAmJiBjaCA8PSAweEZFMEYgfHwgY2ggPT09IDB4RkVGRjtcblxuICAgICAgICBjYXNlIDB4RkY6XG4gICAgICAgICAgcmV0dXJuIDB4RkZGMCA8PSBjaCAmJiBjaCA8PSAweEZGRjg7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyIHBsYW5lc1xuICAgICAgc3dpdGNoIChwbGFuZSkge1xuICAgICAgICBjYXNlIDB4MDE6XG4gICAgICAgICAgcmV0dXJuIDB4MUJDQTAgPD0gY2ggJiYgY2ggPD0gMHgxQkNBMyB8fCAweDFEMTczIDw9IGNoICYmIGNoIDw9IDB4MUQxN0E7XG5cbiAgICAgICAgY2FzZSAweDBFOlxuICAgICAgICAgIHJldHVybiAweEUwMDAwIDw9IGNoICYmIGNoIDw9IDB4RTBGRkY7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5nZXRBdmFpbGFibGVGZWF0dXJlcyA9IGZ1bmN0aW9uIGdldEF2YWlsYWJsZUZlYXR1cmVzKHNjcmlwdCwgbGFuZ3VhZ2UpIHtcbiAgICB2YXIgZmVhdHVyZXMgPSBbXTtcblxuICAgIGlmICh0aGlzLmVuZ2luZSkge1xuICAgICAgZmVhdHVyZXMucHVzaC5hcHBseShmZWF0dXJlcywgdGhpcy5lbmdpbmUuZ2V0QXZhaWxhYmxlRmVhdHVyZXMoc2NyaXB0LCBsYW5ndWFnZSkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZvbnQua2VybiAmJiBmZWF0dXJlcy5pbmRleE9mKCdrZXJuJykgPT09IC0xKSB7XG4gICAgICBmZWF0dXJlcy5wdXNoKCdrZXJuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZlYXR1cmVzO1xuICB9O1xuXG4gIF9wcm90by5zdHJpbmdzRm9yR2x5cGggPSBmdW5jdGlvbiBzdHJpbmdzRm9yR2x5cGgoZ2lkKSB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBTZXQoKTtcblxuICAgIHZhciBjb2RlUG9pbnRzID0gdGhpcy5mb250Ll9jbWFwUHJvY2Vzc29yLmNvZGVQb2ludHNGb3JHbHlwaChnaWQpO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2Ukayhjb2RlUG9pbnRzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgIHZhciBjb2RlUG9pbnQgPSBfc3RlcDIudmFsdWU7XG4gICAgICByZXN1bHQuYWRkKFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVuZ2luZSAmJiB0aGlzLmVuZ2luZS5zdHJpbmdzRm9yR2x5cGgpIHtcbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGsodGhpcy5lbmdpbmUuc3RyaW5nc0ZvckdseXBoKGdpZCkpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgICB2YXIgc3RyaW5nID0gX3N0ZXAzLnZhbHVlO1xuICAgICAgICByZXN1bHQuYWRkKHN0cmluZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20ocmVzdWx0KTtcbiAgfTtcblxuICByZXR1cm4gTGF5b3V0RW5naW5lO1xufSgpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJGwobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGwobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JGwobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRsKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkbChvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JGwoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDUodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MkNShDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDUoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ1KENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxudmFyIFNWR19DT01NQU5EUyA9IHtcbiAgbW92ZVRvOiAnTScsXG4gIGxpbmVUbzogJ0wnLFxuICBxdWFkcmF0aWNDdXJ2ZVRvOiAnUScsXG4gIGJlemllckN1cnZlVG86ICdDJyxcbiAgY2xvc2VQYXRoOiAnWidcbn07XG4vKipcbiAqIFBhdGggb2JqZWN0cyBhcmUgcmV0dXJuZWQgYnkgZ2x5cGhzIGFuZCByZXByZXNlbnQgdGhlIGFjdHVhbFxuICogdmVjdG9yIG91dGxpbmVzIGZvciBlYWNoIGdseXBoIGluIHRoZSBmb250LiBQYXRocyBjYW4gYmUgY29udmVydGVkXG4gKiB0byBTVkcgcGF0aCBkYXRhIHN0cmluZ3MsIG9yIHRvIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvXG4gKiByZW5kZXIgdGhlIHBhdGggdG8gYSBncmFwaGljcyBjb250ZXh0LlxuICovXG5cbnZhciBQYXRoID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUGF0aCgpIHtcbiAgICB0aGlzLmNvbW1hbmRzID0gW107XG4gICAgdGhpcy5fYmJveCA9IG51bGw7XG4gICAgdGhpcy5fY2JveCA9IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIENvbXBpbGVzIHRoZSBwYXRoIHRvIGEgSmF2YVNjcmlwdCBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIHdpdGhcbiAgICogYSBncmFwaGljcyBjb250ZXh0IGluIG9yZGVyIHRvIHJlbmRlciB0aGUgcGF0aC5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBQYXRoLnByb3RvdHlwZTtcblxuICBfcHJvdG8udG9GdW5jdGlvbiA9IGZ1bmN0aW9uIHRvRnVuY3Rpb24oKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBmdW5jdGlvbiAoY3R4KSB7XG4gICAgICByZXR1cm4gX3RoaXMuY29tbWFuZHMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gY3R4W2MuY29tbWFuZF0uYXBwbHkoY3R4LCBjLmFyZ3MpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHBhdGggdG8gYW4gU1ZHIHBhdGggZGF0YSBzdHJpbmdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1NWRyA9IGZ1bmN0aW9uIHRvU1ZHKCkge1xuICAgIHZhciBjbWRzID0gdGhpcy5jb21tYW5kcy5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgIHZhciBhcmdzID0gYy5hcmdzLm1hcChmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGFyZyAqIDEwMCkgLyAxMDA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBcIlwiICsgU1ZHX0NPTU1BTkRTW2MuY29tbWFuZF0gKyBhcmdzLmpvaW4oJyAnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY21kcy5qb2luKCcnKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgXCJjb250cm9sIGJveFwiIG9mIGEgcGF0aC5cbiAgICogVGhpcyBpcyBsaWtlIHRoZSBib3VuZGluZyBib3gsIGJ1dCBpdCBpbmNsdWRlcyBhbGwgcG9pbnRzIGluY2x1ZGluZ1xuICAgKiBjb250cm9sIHBvaW50cyBvZiBiZXppZXIgc2VnbWVudHMgYW5kIGlzIG11Y2ggZmFzdGVyIHRvIGNvbXB1dGUgdGhhblxuICAgKiB0aGUgcmVhbCBib3VuZGluZyBib3guXG4gICAqIEB0eXBlIHtCQm94fVxuICAgKi9cbiAgO1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgbWFwcGluZyBmdW5jdGlvbiB0byBlYWNoIHBvaW50IGluIHRoZSBwYXRoLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmblxuICAgKiBAcmV0dXJuIHtQYXRofVxuICAgKi9cbiAgX3Byb3RvLm1hcFBvaW50cyA9IGZ1bmN0aW9uIG1hcFBvaW50cyhmbikge1xuICAgIHZhciBwYXRoID0gbmV3IFBhdGgoKTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkbCh0aGlzLmNvbW1hbmRzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgIHZhciBjID0gX3N0ZXAudmFsdWU7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGMuYXJncy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICB2YXIgX2ZuID0gZm4oYy5hcmdzW2ldLCBjLmFyZ3NbaSArIDFdKSxcbiAgICAgICAgICAgIHggPSBfZm5bMF0sXG4gICAgICAgICAgICB5ID0gX2ZuWzFdO1xuXG4gICAgICAgIGFyZ3MucHVzaCh4LCB5KTtcbiAgICAgIH1cblxuICAgICAgcGF0aFtjLmNvbW1hbmRdLmFwcGx5KHBhdGgsIGFyZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9XG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIHRoZSBwYXRoIGJ5IHRoZSBnaXZlbiBtYXRyaXguXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIHRyYW5zZm9ybShtMCwgbTEsIG0yLCBtMywgbTQsIG01KSB7XG4gICAgcmV0dXJuIHRoaXMubWFwUG9pbnRzKGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICB4ID0gbTAgKiB4ICsgbTIgKiB5ICsgbTQ7XG4gICAgICB5ID0gbTEgKiB4ICsgbTMgKiB5ICsgbTU7XG4gICAgICByZXR1cm4gW3gsIHldO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBUcmFuc2xhdGVzIHRoZSBwYXRoIGJ5IHRoZSBnaXZlbiBvZmZzZXQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIHRyYW5zbGF0ZSh4LCB5KSB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKDEsIDAsIDAsIDEsIHgsIHkpO1xuICB9XG4gIC8qKlxuICAgKiBSb3RhdGVzIHRoZSBwYXRoIGJ5IHRoZSBnaXZlbiBhbmdsZSAoaW4gcmFkaWFucykuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJvdGF0ZSA9IGZ1bmN0aW9uIHJvdGF0ZShhbmdsZSkge1xuICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgdmFyIHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oY29zLCBzaW4sIC1zaW4sIGNvcywgMCwgMCk7XG4gIH1cbiAgLyoqXG4gICAqIFNjYWxlcyB0aGUgcGF0aC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uc2NhbGUgPSBmdW5jdGlvbiBzY2FsZShzY2FsZVgsIHNjYWxlWSkge1xuICAgIGlmIChzY2FsZVkgPT09IHZvaWQgMCkge1xuICAgICAgc2NhbGVZID0gc2NhbGVYO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybShzY2FsZVgsIDAsIDAsIHNjYWxlWSwgMCwgMCk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzJDUoUGF0aCwgW3tcbiAgICBrZXk6IFwiY2JveFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCF0aGlzLl9jYm94KSB7XG4gICAgICAgIHZhciBjYm94ID0gbmV3IEJCb3goKTtcblxuICAgICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRsKHRoaXMuY29tbWFuZHMpLCBfc3RlcDI7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBjb21tYW5kID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tYW5kLmFyZ3MubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNib3guYWRkUG9pbnQoY29tbWFuZC5hcmdzW2ldLCBjb21tYW5kLmFyZ3NbaSArIDFdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jYm94ID0gT2JqZWN0LmZyZWV6ZShjYm94KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2Nib3g7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGV4YWN0IGJvdW5kaW5nIGJveCBvZiB0aGUgcGF0aCBieSBldmFsdWF0aW5nIGN1cnZlIHNlZ21lbnRzLlxuICAgICAqIFNsb3dlciB0byBjb21wdXRlIHRoYW4gdGhlIGNvbnRyb2wgYm94LCBidXQgbW9yZSBhY2N1cmF0ZS5cbiAgICAgKiBAdHlwZSB7QkJveH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImJib3hcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLl9iYm94KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYm94O1xuICAgICAgfVxuXG4gICAgICB2YXIgYmJveCA9IG5ldyBCQm94KCk7XG4gICAgICB2YXIgY3ggPSAwLFxuICAgICAgICAgIGN5ID0gMDtcblxuICAgICAgdmFyIGYgPSBmdW5jdGlvbiBmKHQpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDEgLSB0LCAzKSAqIHAwW2ldICsgMyAqIE1hdGgucG93KDEgLSB0LCAyKSAqIHQgKiBwMVtpXSArIDMgKiAoMSAtIHQpICogTWF0aC5wb3codCwgMikgKiBwMltpXSArIE1hdGgucG93KHQsIDMpICogcDNbaV07XG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRsKHRoaXMuY29tbWFuZHMpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgICB2YXIgYyA9IF9zdGVwMy52YWx1ZTtcblxuICAgICAgICBzd2l0Y2ggKGMuY29tbWFuZCkge1xuICAgICAgICAgIGNhc2UgJ21vdmVUbyc6XG4gICAgICAgICAgY2FzZSAnbGluZVRvJzpcbiAgICAgICAgICAgIHZhciBfYyRhcmdzID0gYy5hcmdzLFxuICAgICAgICAgICAgICAgIHggPSBfYyRhcmdzWzBdLFxuICAgICAgICAgICAgICAgIHkgPSBfYyRhcmdzWzFdO1xuICAgICAgICAgICAgYmJveC5hZGRQb2ludCh4LCB5KTtcbiAgICAgICAgICAgIGN4ID0geDtcbiAgICAgICAgICAgIGN5ID0geTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAncXVhZHJhdGljQ3VydmVUbyc6XG4gICAgICAgICAgY2FzZSAnYmV6aWVyQ3VydmVUbyc6XG4gICAgICAgICAgICBpZiAoYy5jb21tYW5kID09PSAncXVhZHJhdGljQ3VydmVUbycpIHtcbiAgICAgICAgICAgICAgLy8gaHR0cDovL2ZvbnRmb3JnZS5vcmcvYmV6aWVyLmh0bWxcbiAgICAgICAgICAgICAgdmFyIF9jJGFyZ3MyID0gYy5hcmdzLFxuICAgICAgICAgICAgICAgICAgcXAxeCA9IF9jJGFyZ3MyWzBdLFxuICAgICAgICAgICAgICAgICAgcXAxeSA9IF9jJGFyZ3MyWzFdLFxuICAgICAgICAgICAgICAgICAgcDN4ID0gX2MkYXJnczJbMl0sXG4gICAgICAgICAgICAgICAgICBwM3kgPSBfYyRhcmdzMlszXTtcbiAgICAgICAgICAgICAgdmFyIGNwMXggPSBjeCArIDIgLyAzICogKHFwMXggLSBjeCk7IC8vIENQMSA9IFFQMCArIDIvMyAqIChRUDEtUVAwKVxuXG4gICAgICAgICAgICAgIHZhciBjcDF5ID0gY3kgKyAyIC8gMyAqIChxcDF5IC0gY3kpO1xuICAgICAgICAgICAgICB2YXIgY3AyeCA9IHAzeCArIDIgLyAzICogKHFwMXggLSBwM3gpOyAvLyBDUDIgPSBRUDIgKyAyLzMgKiAoUVAxLVFQMilcblxuICAgICAgICAgICAgICB2YXIgY3AyeSA9IHAzeSArIDIgLyAzICogKHFwMXkgLSBwM3kpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIF9jJGFyZ3MzID0gYy5hcmdzLFxuICAgICAgICAgICAgICAgICAgY3AxeCA9IF9jJGFyZ3MzWzBdLFxuICAgICAgICAgICAgICAgICAgY3AxeSA9IF9jJGFyZ3MzWzFdLFxuICAgICAgICAgICAgICAgICAgY3AyeCA9IF9jJGFyZ3MzWzJdLFxuICAgICAgICAgICAgICAgICAgY3AyeSA9IF9jJGFyZ3MzWzNdLFxuICAgICAgICAgICAgICAgICAgcDN4ID0gX2MkYXJnczNbNF0sXG4gICAgICAgICAgICAgICAgICBwM3kgPSBfYyRhcmdzM1s1XTtcbiAgICAgICAgICAgIH0gLy8gaHR0cDovL2Jsb2cuaGFja2Vycy1jYWZlLm5ldC8yMDA5LzA2L2hvdy10by1jYWxjdWxhdGUtYmV6aWVyLWN1cnZlcy1ib3VuZGluZy5odG1sXG5cblxuICAgICAgICAgICAgYmJveC5hZGRQb2ludChwM3gsIHAzeSk7XG4gICAgICAgICAgICB2YXIgcDAgPSBbY3gsIGN5XTtcbiAgICAgICAgICAgIHZhciBwMSA9IFtjcDF4LCBjcDF5XTtcbiAgICAgICAgICAgIHZhciBwMiA9IFtjcDJ4LCBjcDJ5XTtcbiAgICAgICAgICAgIHZhciBwMyA9IFtwM3gsIHAzeV07XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IDE7IGkrKykge1xuICAgICAgICAgICAgICB2YXIgYiA9IDYgKiBwMFtpXSAtIDEyICogcDFbaV0gKyA2ICogcDJbaV07XG4gICAgICAgICAgICAgIHZhciBhID0gLTMgKiBwMFtpXSArIDkgKiBwMVtpXSAtIDkgKiBwMltpXSArIDMgKiBwM1tpXTtcbiAgICAgICAgICAgICAgYyA9IDMgKiBwMVtpXSAtIDMgKiBwMFtpXTtcblxuICAgICAgICAgICAgICBpZiAoYSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChiID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgdCA9IC1jIC8gYjtcblxuICAgICAgICAgICAgICAgIGlmICgwIDwgdCAmJiB0IDwgMSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYmJveC5hZGRQb2ludChmKHQpLCBiYm94Lm1heFkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGJib3guYWRkUG9pbnQoYmJveC5tYXhYLCBmKHQpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBiMmFjID0gTWF0aC5wb3coYiwgMikgLSA0ICogYyAqIGE7XG5cbiAgICAgICAgICAgICAgaWYgKGIyYWMgPCAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgdDEgPSAoLWIgKyBNYXRoLnNxcnQoYjJhYykpIC8gKDIgKiBhKTtcblxuICAgICAgICAgICAgICBpZiAoMCA8IHQxICYmIHQxIDwgMSkge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBiYm94LmFkZFBvaW50KGYodDEpLCBiYm94Lm1heFkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgYmJveC5hZGRQb2ludChiYm94Lm1heFgsIGYodDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgdDIgPSAoLWIgLSBNYXRoLnNxcnQoYjJhYykpIC8gKDIgKiBhKTtcblxuICAgICAgICAgICAgICBpZiAoMCA8IHQyICYmIHQyIDwgMSkge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBiYm94LmFkZFBvaW50KGYodDIpLCBiYm94Lm1heFkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgYmJveC5hZGRQb2ludChiYm94Lm1heFgsIGYodDIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3ggPSBwM3g7XG4gICAgICAgICAgICBjeSA9IHAzeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9iYm94ID0gT2JqZWN0LmZyZWV6ZShiYm94KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGF0aDtcbn0oKTtcblxudmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gIHZhciBjb21tYW5kID0gX2FycltfaV07XG5cbiAgUGF0aC5wcm90b3R5cGVbY29tbWFuZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fYmJveCA9IHRoaXMuX2Nib3ggPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHRoaXMuY29tbWFuZHMucHVzaCh7XG4gICAgICBjb21tYW5kOiBjb21tYW5kLFxuICAgICAgYXJnczogYXJnc1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufTtcblxuZm9yICh2YXIgX2kgPSAwLCBfYXJyID0gWydtb3ZlVG8nLCAnbGluZVRvJywgJ3F1YWRyYXRpY0N1cnZlVG8nLCAnYmV6aWVyQ3VydmVUbycsICdjbG9zZVBhdGgnXTsgX2kgPCBfYXJyLmxlbmd0aDsgX2krKykge1xuICBfbG9vcCgpO1xufVxuXG52YXIgU3RhbmRhcmROYW1lcyA9IFsnLm5vdGRlZicsICcubnVsbCcsICdub25tYXJraW5ncmV0dXJuJywgJ3NwYWNlJywgJ2V4Y2xhbScsICdxdW90ZWRibCcsICdudW1iZXJzaWduJywgJ2RvbGxhcicsICdwZXJjZW50JywgJ2FtcGVyc2FuZCcsICdxdW90ZXNpbmdsZScsICdwYXJlbmxlZnQnLCAncGFyZW5yaWdodCcsICdhc3RlcmlzaycsICdwbHVzJywgJ2NvbW1hJywgJ2h5cGhlbicsICdwZXJpb2QnLCAnc2xhc2gnLCAnemVybycsICdvbmUnLCAndHdvJywgJ3RocmVlJywgJ2ZvdXInLCAnZml2ZScsICdzaXgnLCAnc2V2ZW4nLCAnZWlnaHQnLCAnbmluZScsICdjb2xvbicsICdzZW1pY29sb24nLCAnbGVzcycsICdlcXVhbCcsICdncmVhdGVyJywgJ3F1ZXN0aW9uJywgJ2F0JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsICdicmFja2V0bGVmdCcsICdiYWNrc2xhc2gnLCAnYnJhY2tldHJpZ2h0JywgJ2FzY2lpY2lyY3VtJywgJ3VuZGVyc2NvcmUnLCAnZ3JhdmUnLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsICduJywgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgJ2JyYWNlbGVmdCcsICdiYXInLCAnYnJhY2VyaWdodCcsICdhc2NpaXRpbGRlJywgJ0FkaWVyZXNpcycsICdBcmluZycsICdDY2VkaWxsYScsICdFYWN1dGUnLCAnTnRpbGRlJywgJ09kaWVyZXNpcycsICdVZGllcmVzaXMnLCAnYWFjdXRlJywgJ2FncmF2ZScsICdhY2lyY3VtZmxleCcsICdhZGllcmVzaXMnLCAnYXRpbGRlJywgJ2FyaW5nJywgJ2NjZWRpbGxhJywgJ2VhY3V0ZScsICdlZ3JhdmUnLCAnZWNpcmN1bWZsZXgnLCAnZWRpZXJlc2lzJywgJ2lhY3V0ZScsICdpZ3JhdmUnLCAnaWNpcmN1bWZsZXgnLCAnaWRpZXJlc2lzJywgJ250aWxkZScsICdvYWN1dGUnLCAnb2dyYXZlJywgJ29jaXJjdW1mbGV4JywgJ29kaWVyZXNpcycsICdvdGlsZGUnLCAndWFjdXRlJywgJ3VncmF2ZScsICd1Y2lyY3VtZmxleCcsICd1ZGllcmVzaXMnLCAnZGFnZ2VyJywgJ2RlZ3JlZScsICdjZW50JywgJ3N0ZXJsaW5nJywgJ3NlY3Rpb24nLCAnYnVsbGV0JywgJ3BhcmFncmFwaCcsICdnZXJtYW5kYmxzJywgJ3JlZ2lzdGVyZWQnLCAnY29weXJpZ2h0JywgJ3RyYWRlbWFyaycsICdhY3V0ZScsICdkaWVyZXNpcycsICdub3RlcXVhbCcsICdBRScsICdPc2xhc2gnLCAnaW5maW5pdHknLCAncGx1c21pbnVzJywgJ2xlc3NlcXVhbCcsICdncmVhdGVyZXF1YWwnLCAneWVuJywgJ211JywgJ3BhcnRpYWxkaWZmJywgJ3N1bW1hdGlvbicsICdwcm9kdWN0JywgJ3BpJywgJ2ludGVncmFsJywgJ29yZGZlbWluaW5lJywgJ29yZG1hc2N1bGluZScsICdPbWVnYScsICdhZScsICdvc2xhc2gnLCAncXVlc3Rpb25kb3duJywgJ2V4Y2xhbWRvd24nLCAnbG9naWNhbG5vdCcsICdyYWRpY2FsJywgJ2Zsb3JpbicsICdhcHByb3hlcXVhbCcsICdEZWx0YScsICdndWlsbGVtb3RsZWZ0JywgJ2d1aWxsZW1vdHJpZ2h0JywgJ2VsbGlwc2lzJywgJ25vbmJyZWFraW5nc3BhY2UnLCAnQWdyYXZlJywgJ0F0aWxkZScsICdPdGlsZGUnLCAnT0UnLCAnb2UnLCAnZW5kYXNoJywgJ2VtZGFzaCcsICdxdW90ZWRibGxlZnQnLCAncXVvdGVkYmxyaWdodCcsICdxdW90ZWxlZnQnLCAncXVvdGVyaWdodCcsICdkaXZpZGUnLCAnbG96ZW5nZScsICd5ZGllcmVzaXMnLCAnWWRpZXJlc2lzJywgJ2ZyYWN0aW9uJywgJ2N1cnJlbmN5JywgJ2d1aWxzaW5nbGxlZnQnLCAnZ3VpbHNpbmdscmlnaHQnLCAnZmknLCAnZmwnLCAnZGFnZ2VyZGJsJywgJ3BlcmlvZGNlbnRlcmVkJywgJ3F1b3Rlc2luZ2xiYXNlJywgJ3F1b3RlZGJsYmFzZScsICdwZXJ0aG91c2FuZCcsICdBY2lyY3VtZmxleCcsICdFY2lyY3VtZmxleCcsICdBYWN1dGUnLCAnRWRpZXJlc2lzJywgJ0VncmF2ZScsICdJYWN1dGUnLCAnSWNpcmN1bWZsZXgnLCAnSWRpZXJlc2lzJywgJ0lncmF2ZScsICdPYWN1dGUnLCAnT2NpcmN1bWZsZXgnLCAnYXBwbGUnLCAnT2dyYXZlJywgJ1VhY3V0ZScsICdVY2lyY3VtZmxleCcsICdVZ3JhdmUnLCAnZG90bGVzc2knLCAnY2lyY3VtZmxleCcsICd0aWxkZScsICdtYWNyb24nLCAnYnJldmUnLCAnZG90YWNjZW50JywgJ3JpbmcnLCAnY2VkaWxsYScsICdodW5nYXJ1bWxhdXQnLCAnb2dvbmVrJywgJ2Nhcm9uJywgJ0xzbGFzaCcsICdsc2xhc2gnLCAnU2Nhcm9uJywgJ3NjYXJvbicsICdaY2Fyb24nLCAnemNhcm9uJywgJ2Jyb2tlbmJhcicsICdFdGgnLCAnZXRoJywgJ1lhY3V0ZScsICd5YWN1dGUnLCAnVGhvcm4nLCAndGhvcm4nLCAnbWludXMnLCAnbXVsdGlwbHknLCAnb25lc3VwZXJpb3InLCAndHdvc3VwZXJpb3InLCAndGhyZWVzdXBlcmlvcicsICdvbmVoYWxmJywgJ29uZXF1YXJ0ZXInLCAndGhyZWVxdWFydGVycycsICdmcmFuYycsICdHYnJldmUnLCAnZ2JyZXZlJywgJ0lkb3RhY2NlbnQnLCAnU2NlZGlsbGEnLCAnc2NlZGlsbGEnLCAnQ2FjdXRlJywgJ2NhY3V0ZScsICdDY2Fyb24nLCAnY2Nhcm9uJywgJ2Rjcm9hdCddO1xuXG52YXIgX2NsYXNzJDM7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDYodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MkNihDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDYoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ2KENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDModGFyZ2V0LCBwcm9wZXJ0eSwgZGVjb3JhdG9ycywgZGVzY3JpcHRvciwgY29udGV4dCkgeyB2YXIgZGVzYyA9IHt9OyBPYmplY3Qua2V5cyhkZXNjcmlwdG9yKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgZGVzY1trZXldID0gZGVzY3JpcHRvcltrZXldOyB9KTsgZGVzYy5lbnVtZXJhYmxlID0gISFkZXNjLmVudW1lcmFibGU7IGRlc2MuY29uZmlndXJhYmxlID0gISFkZXNjLmNvbmZpZ3VyYWJsZTsgaWYgKCd2YWx1ZScgaW4gZGVzYyB8fCBkZXNjLmluaXRpYWxpemVyKSB7IGRlc2Mud3JpdGFibGUgPSB0cnVlOyB9IGRlc2MgPSBkZWNvcmF0b3JzLnNsaWNlKCkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoZGVzYywgZGVjb3JhdG9yKSB7IHJldHVybiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYykgfHwgZGVzYzsgfSwgZGVzYyk7IGlmIChjb250ZXh0ICYmIGRlc2MuaW5pdGlhbGl6ZXIgIT09IHZvaWQgMCkgeyBkZXNjLnZhbHVlID0gZGVzYy5pbml0aWFsaXplciA/IGRlc2MuaW5pdGlhbGl6ZXIuY2FsbChjb250ZXh0KSA6IHZvaWQgMDsgZGVzYy5pbml0aWFsaXplciA9IHVuZGVmaW5lZDsgfSBpZiAoZGVzYy5pbml0aWFsaXplciA9PT0gdm9pZCAwKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjKTsgZGVzYyA9IG51bGw7IH0gcmV0dXJuIGRlc2M7IH1cbi8qKlxuICogR2x5cGggb2JqZWN0cyByZXByZXNlbnQgYSBnbHlwaCBpbiB0aGUgZm9udC4gVGhleSBoYXZlIHZhcmlvdXMgcHJvcGVydGllcyBmb3IgYWNjZXNzaW5nIG1ldHJpY3MgYW5kXG4gKiB0aGUgYWN0dWFsIHZlY3RvciBwYXRoIHRoZSBnbHlwaCByZXByZXNlbnRzLCBhbmQgbWV0aG9kcyBmb3IgcmVuZGVyaW5nIHRoZSBnbHlwaCB0byBhIGdyYXBoaWNzIGNvbnRleHQuXG4gKlxuICogWW91IGRvIG5vdCBjcmVhdGUgZ2x5cGggb2JqZWN0cyBkaXJlY3RseS4gVGhleSBhcmUgY3JlYXRlZCBieSB2YXJpb3VzIG1ldGhvZHMgb24gdGhlIGZvbnQgb2JqZWN0LlxuICogVGhlcmUgYXJlIHNldmVyYWwgc3ViY2xhc3NlcyBvZiB0aGUgYmFzZSBHbHlwaCBjbGFzcyBpbnRlcm5hbGx5IHRoYXQgbWF5IGJlIHJldHVybmVkIGRlcGVuZGluZ1xuICogb24gdGhlIGZvbnQgZm9ybWF0LCBidXQgdGhleSBhbGwgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MuXG4gKi9cblxudmFyIEdseXBoID0gKF9jbGFzcyQzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gR2x5cGgoaWQsIGNvZGVQb2ludHMsIGZvbnQpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZ2x5cGggaWQgaW4gdGhlIGZvbnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiB1bmljb2RlIGNvZGUgcG9pbnRzIHRoYXQgYXJlIHJlcHJlc2VudGVkIGJ5IHRoaXMgZ2x5cGguXG4gICAgICogVGhlcmUgY2FuIGJlIG11bHRpcGxlIGNvZGUgcG9pbnRzIGluIHRoZSBjYXNlIG9mIGxpZ2F0dXJlcyBhbmQgb3RoZXIgZ2x5cGhzXG4gICAgICogdGhhdCByZXByZXNlbnQgbXVsdGlwbGUgdmlzdWFsIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge251bWJlcltdfVxuICAgICAqL1xuXG4gICAgdGhpcy5jb2RlUG9pbnRzID0gY29kZVBvaW50cztcbiAgICB0aGlzLl9mb250ID0gZm9udDsgLy8gVE9ETzogZ2V0IHRoaXMgaW5mbyBmcm9tIEdERUYgaWYgYXZhaWxhYmxlXG5cbiAgICB0aGlzLmlzTWFyayA9IHRoaXMuY29kZVBvaW50cy5sZW5ndGggPiAwICYmIHRoaXMuY29kZVBvaW50cy5ldmVyeSh1bmljb2RlLmlzTWFyayk7XG4gICAgdGhpcy5pc0xpZ2F0dXJlID0gdGhpcy5jb2RlUG9pbnRzLmxlbmd0aCA+IDE7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gR2x5cGgucHJvdG90eXBlO1xuXG4gIF9wcm90by5fZ2V0UGF0aCA9IGZ1bmN0aW9uIF9nZXRQYXRoKCkge1xuICAgIHJldHVybiBuZXcgUGF0aCgpO1xuICB9O1xuXG4gIF9wcm90by5fZ2V0Q0JveCA9IGZ1bmN0aW9uIF9nZXRDQm94KCkge1xuICAgIHJldHVybiB0aGlzLnBhdGguY2JveDtcbiAgfTtcblxuICBfcHJvdG8uX2dldEJCb3ggPSBmdW5jdGlvbiBfZ2V0QkJveCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXRoLmJib3g7XG4gIH07XG5cbiAgX3Byb3RvLl9nZXRUYWJsZU1ldHJpY3MgPSBmdW5jdGlvbiBfZ2V0VGFibGVNZXRyaWNzKHRhYmxlKSB7XG4gICAgaWYgKHRoaXMuaWQgPCB0YWJsZS5tZXRyaWNzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRhYmxlLm1ldHJpY3MuZ2V0KHRoaXMuaWQpO1xuICAgIH1cblxuICAgIHZhciBtZXRyaWMgPSB0YWJsZS5tZXRyaWNzLmdldCh0YWJsZS5tZXRyaWNzLmxlbmd0aCAtIDEpO1xuICAgIHZhciByZXMgPSB7XG4gICAgICBhZHZhbmNlOiBtZXRyaWMgPyBtZXRyaWMuYWR2YW5jZSA6IDAsXG4gICAgICBiZWFyaW5nOiB0YWJsZS5iZWFyaW5ncy5nZXQodGhpcy5pZCAtIHRhYmxlLm1ldHJpY3MubGVuZ3RoKSB8fCAwXG4gICAgfTtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIF9wcm90by5fZ2V0TWV0cmljcyA9IGZ1bmN0aW9uIF9nZXRNZXRyaWNzKGNib3gpIHtcbiAgICBpZiAodGhpcy5fbWV0cmljcykge1xuICAgICAgcmV0dXJuIHRoaXMuX21ldHJpY3M7XG4gICAgfVxuXG4gICAgdmFyIF90aGlzJF9nZXRUYWJsZU1ldHJpYyA9IHRoaXMuX2dldFRhYmxlTWV0cmljcyh0aGlzLl9mb250LmhtdHgpLFxuICAgICAgICBhZHZhbmNlV2lkdGggPSBfdGhpcyRfZ2V0VGFibGVNZXRyaWMuYWR2YW5jZSxcbiAgICAgICAgbGVmdEJlYXJpbmcgPSBfdGhpcyRfZ2V0VGFibGVNZXRyaWMuYmVhcmluZzsgLy8gRm9yIHZlcnRpY2FsIG1ldHJpY3MsIHVzZSB2bXR4IGlmIGF2YWlsYWJsZSwgb3IgZmFsbCBiYWNrIHRvIGdsb2JhbCBkYXRhIGZyb20gT1MvMiBvciBoaGVhXG5cblxuICAgIGlmICh0aGlzLl9mb250LnZtdHgpIHtcbiAgICAgIHZhciBfdGhpcyRfZ2V0VGFibGVNZXRyaWMyID0gdGhpcy5fZ2V0VGFibGVNZXRyaWNzKHRoaXMuX2ZvbnQudm10eCksXG4gICAgICAgICAgYWR2YW5jZUhlaWdodCA9IF90aGlzJF9nZXRUYWJsZU1ldHJpYzIuYWR2YW5jZSxcbiAgICAgICAgICB0b3BCZWFyaW5nID0gX3RoaXMkX2dldFRhYmxlTWV0cmljMi5iZWFyaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgb3MyO1xuXG4gICAgICBpZiAodHlwZW9mIGNib3ggPT09ICd1bmRlZmluZWQnIHx8IGNib3ggPT09IG51bGwpIHtcbiAgICAgICAgY2JveCA9IHRoaXMuY2JveDtcbiAgICAgIH1cblxuICAgICAgaWYgKChvczIgPSB0aGlzLl9mb250WydPUy8yJ10pICYmIG9zMi52ZXJzaW9uID4gMCkge1xuICAgICAgICB2YXIgYWR2YW5jZUhlaWdodCA9IE1hdGguYWJzKG9zMi50eXBvQXNjZW5kZXIgLSBvczIudHlwb0Rlc2NlbmRlcik7XG4gICAgICAgIHZhciB0b3BCZWFyaW5nID0gb3MyLnR5cG9Bc2NlbmRlciAtIGNib3gubWF4WTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBoaGVhID0gdGhpcy5fZm9udC5oaGVhO1xuICAgICAgICB2YXIgYWR2YW5jZUhlaWdodCA9IE1hdGguYWJzKGhoZWEuYXNjZW50IC0gaGhlYS5kZXNjZW50KTtcbiAgICAgICAgdmFyIHRvcEJlYXJpbmcgPSBoaGVhLmFzY2VudCAtIGNib3gubWF4WTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yICYmIHRoaXMuX2ZvbnQuSFZBUikge1xuICAgICAgYWR2YW5jZVdpZHRoICs9IHRoaXMuX2ZvbnQuX3ZhcmlhdGlvblByb2Nlc3Nvci5nZXRBZHZhbmNlQWRqdXN0bWVudCh0aGlzLmlkLCB0aGlzLl9mb250LkhWQVIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzID0ge1xuICAgICAgYWR2YW5jZVdpZHRoOiBhZHZhbmNlV2lkdGgsXG4gICAgICBhZHZhbmNlSGVpZ2h0OiBhZHZhbmNlSGVpZ2h0LFxuICAgICAgbGVmdEJlYXJpbmc6IGxlZnRCZWFyaW5nLFxuICAgICAgdG9wQmVhcmluZzogdG9wQmVhcmluZ1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBnbHlwaOKAmXMgY29udHJvbCBib3guXG4gICAqIFRoaXMgaXMgb2Z0ZW4gdGhlIHNhbWUgYXMgdGhlIGJvdW5kaW5nIGJveCwgYnV0IGlzIGZhc3RlciB0byBjb21wdXRlLlxuICAgKiBCZWNhdXNlIG9mIHRoZSB3YXkgYmV6aWVyIGN1cnZlcyBhcmUgZGVmaW5lZCwgc29tZSBvZiB0aGUgY29udHJvbCBwb2ludHNcbiAgICogY2FuIGJlIG91dHNpZGUgb2YgdGhlIGJvdW5kaW5nIGJveC4gV2hlcmUgYGJib3hgIHRha2VzIHRoaXMgaW50byBhY2NvdW50LFxuICAgKiBgY2JveGAgZG9lcyBub3QuIFRodXMsIGNib3ggaXMgbGVzcyBhY2N1cmF0ZSwgYnV0IGZhc3RlciB0byBjb21wdXRlLlxuICAgKiBTZWUgW2hlcmVdKGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnL2ZyZWV0eXBlMi9kb2NzL2dseXBocy9nbHlwaHMtNi5odG1sI3NlY3Rpb24tMilcbiAgICogZm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQHR5cGUge0JCb3h9XG4gICAqL1xuICA7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYXRoIHNjYWxlZCB0byB0aGUgZ2l2ZW4gZm9udCBzaXplLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICAgKiBAcmV0dXJuIHtQYXRofVxuICAgKi9cbiAgX3Byb3RvLmdldFNjYWxlZFBhdGggPSBmdW5jdGlvbiBnZXRTY2FsZWRQYXRoKHNpemUpIHtcbiAgICB2YXIgc2NhbGUgPSAxIC8gdGhpcy5fZm9udC51bml0c1BlckVtICogc2l6ZTtcbiAgICByZXR1cm4gdGhpcy5wYXRoLnNjYWxlKHNjYWxlKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGdseXBoJ3MgYWR2YW5jZSB3aWR0aC5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uX2dldE5hbWUgPSBmdW5jdGlvbiBfZ2V0TmFtZSgpIHtcbiAgICB2YXIgcG9zdCA9IHRoaXMuX2ZvbnQucG9zdDtcblxuICAgIGlmICghcG9zdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwb3N0LnZlcnNpb24pIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIFN0YW5kYXJkTmFtZXNbdGhpcy5pZF07XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdmFyIGlkID0gcG9zdC5nbHlwaE5hbWVJbmRleFt0aGlzLmlkXTtcblxuICAgICAgICBpZiAoaWQgPCBTdGFuZGFyZE5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBTdGFuZGFyZE5hbWVzW2lkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwb3N0Lm5hbWVzW2lkIC0gU3RhbmRhcmROYW1lcy5sZW5ndGhdO1xuXG4gICAgICBjYXNlIDIuNTpcbiAgICAgICAgcmV0dXJuIFN0YW5kYXJkTmFtZXNbdGhpcy5pZCArIHBvc3Qub2Zmc2V0c1t0aGlzLmlkXV07XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocG9zdC5tYXBbdGhpcy5pZF0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIGdseXBoJ3MgbmFtZVxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBnbHlwaCB0byB0aGUgZ2l2ZW4gZ3JhcGhpY3MgY29udGV4dCwgYXQgdGhlIHNwZWNpZmllZCBmb250IHNpemUuXG4gICAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJkfSBjdHhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAgICovXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoY3R4LCBzaXplKSB7XG4gICAgY3R4LnNhdmUoKTtcbiAgICB2YXIgc2NhbGUgPSAxIC8gdGhpcy5fZm9udC5oZWFkLnVuaXRzUGVyRW0gKiBzaXplO1xuICAgIGN0eC5zY2FsZShzY2FsZSwgc2NhbGUpO1xuICAgIHZhciBmbiA9IHRoaXMucGF0aC50b0Z1bmN0aW9uKCk7XG4gICAgZm4oY3R4KTtcbiAgICBjdHguZmlsbCgpO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzJDYoR2x5cGgsIFt7XG4gICAga2V5OiBcImNib3hcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRDQm94KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBnbHlwaOKAmXMgYm91bmRpbmcgYm94LCBpLmUuIHRoZSByZWN0YW5nbGUgdGhhdCBlbmNsb3NlcyB0aGVcbiAgICAgKiBnbHlwaCBvdXRsaW5lIGFzIHRpZ2h0bHkgYXMgcG9zc2libGUuXG4gICAgICogQHR5cGUge0JCb3h9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJiYm94XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0QkJveCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHZlY3RvciBQYXRoIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdseXBoIG91dGxpbmUuXG4gICAgICogQHR5cGUge1BhdGh9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJwYXRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAvLyBDYWNoZSB0aGUgcGF0aCBzbyB3ZSBvbmx5IGRlY29kZSBpdCBvbmNlXG4gICAgICAvLyBEZWNvZGluZyBpcyBhY3R1YWxseSBwZXJmb3JtZWQgYnkgc3ViY2xhc3Nlc1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFBhdGgoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWR2YW5jZVdpZHRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0TWV0cmljcygpLmFkdmFuY2VXaWR0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGdseXBoJ3MgYWR2YW5jZSBoZWlnaHQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFkdmFuY2VIZWlnaHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRNZXRyaWNzKCkuYWR2YW5jZUhlaWdodDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibGlnYXR1cmVDYXJldFBvc2l0aW9uc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge31cbiAgfSwge1xuICAgIGtleTogXCJuYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0TmFtZSgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBHbHlwaDtcbn0oKSwgKF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkMyhfY2xhc3MkMy5wcm90b3R5cGUsIFwiY2JveFwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJjYm94XCIpLCBfY2xhc3MkMy5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDMoX2NsYXNzJDMucHJvdG90eXBlLCBcImJib3hcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkMy5wcm90b3R5cGUsIFwiYmJveFwiKSwgX2NsYXNzJDMucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQzKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJwYXRoXCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDMucHJvdG90eXBlLCBcInBhdGhcIiksIF9jbGFzcyQzLnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkMyhfY2xhc3MkMy5wcm90b3R5cGUsIFwiYWR2YW5jZVdpZHRoXCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDMucHJvdG90eXBlLCBcImFkdmFuY2VXaWR0aFwiKSwgX2NsYXNzJDMucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQzKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJhZHZhbmNlSGVpZ2h0XCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDMucHJvdG90eXBlLCBcImFkdmFuY2VIZWlnaHRcIiksIF9jbGFzcyQzLnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkMyhfY2xhc3MkMy5wcm90b3R5cGUsIFwibmFtZVwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQzLnByb3RvdHlwZSwgXCJuYW1lXCIpLCBfY2xhc3MkMy5wcm90b3R5cGUpKSwgX2NsYXNzJDMpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJG0obykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JG0obykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JG0obywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRtKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkbShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JG0oYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJDkoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBHbHlmSGVhZGVyID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG51bWJlck9mQ29udG91cnM6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBpZiBuZWdhdGl2ZSwgdGhpcyBpcyBhIGNvbXBvc2l0ZSBnbHlwaFxuICB4TWluOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgeU1pbjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHhNYXg6IHJlc3RydWN0dXJlLmludDE2LFxuICB5TWF4OiByZXN0cnVjdHVyZS5pbnQxNlxufSk7IC8vIEZsYWdzIGZvciBzaW1wbGUgZ2x5cGhzXG5cbnZhciBPTl9DVVJWRSA9IDEgPDwgMDtcbnZhciBYX1NIT1JUX1ZFQ1RPUiA9IDEgPDwgMTtcbnZhciBZX1NIT1JUX1ZFQ1RPUiA9IDEgPDwgMjtcbnZhciBSRVBFQVQgPSAxIDw8IDM7XG52YXIgU0FNRV9YID0gMSA8PCA0O1xudmFyIFNBTUVfWSA9IDEgPDwgNTsgLy8gRmxhZ3MgZm9yIGNvbXBvc2l0ZSBnbHlwaHNcblxudmFyIEFSR18xX0FORF8yX0FSRV9XT1JEUyA9IDEgPDwgMDtcbnZhciBXRV9IQVZFX0FfU0NBTEUgPSAxIDw8IDM7XG52YXIgTU9SRV9DT01QT05FTlRTID0gMSA8PCA1O1xudmFyIFdFX0hBVkVfQU5fWF9BTkRfWV9TQ0FMRSA9IDEgPDwgNjtcbnZhciBXRV9IQVZFX0FfVFdPX0JZX1RXTyA9IDEgPDwgNztcbnZhciBXRV9IQVZFX0lOU1RSVUNUSU9OUyA9IDEgPDwgODtcblxudmFyIFBvaW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUG9pbnQob25DdXJ2ZSwgZW5kQ29udG91ciwgeCwgeSkge1xuICAgIGlmICh4ID09PSB2b2lkIDApIHtcbiAgICAgIHggPSAwO1xuICAgIH1cblxuICAgIGlmICh5ID09PSB2b2lkIDApIHtcbiAgICAgIHkgPSAwO1xuICAgIH1cblxuICAgIHRoaXMub25DdXJ2ZSA9IG9uQ3VydmU7XG4gICAgdGhpcy5lbmRDb250b3VyID0gZW5kQ29udG91cjtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gUG9pbnQucHJvdG90eXBlO1xuXG4gIF9wcm90by5jb3B5ID0gZnVuY3Rpb24gY29weSgpIHtcbiAgICByZXR1cm4gbmV3IFBvaW50KHRoaXMub25DdXJ2ZSwgdGhpcy5lbmRDb250b3VyLCB0aGlzLngsIHRoaXMueSk7XG4gIH07XG5cbiAgcmV0dXJuIFBvaW50O1xufSgpOyAvLyBSZXByZXNlbnRzIGEgY29tcG9uZW50IGluIGEgY29tcG9zaXRlIGdseXBoXG5cbnZhciBDb21wb25lbnQgPSBmdW5jdGlvbiBDb21wb25lbnQoZ2x5cGhJRCwgZHgsIGR5KSB7XG4gIHRoaXMuZ2x5cGhJRCA9IGdseXBoSUQ7XG4gIHRoaXMuZHggPSBkeDtcbiAgdGhpcy5keSA9IGR5O1xuICB0aGlzLnBvcyA9IDA7XG4gIHRoaXMuc2NhbGVYID0gdGhpcy5zY2FsZVkgPSAxO1xuICB0aGlzLnNjYWxlMDEgPSB0aGlzLnNjYWxlMTAgPSAwO1xufTtcbi8qKlxuICogUmVwcmVzZW50cyBhIFRydWVUeXBlIGdseXBoLlxuICovXG5cblxudmFyIFRURkdseXBoID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfR2x5cGgpIHtcbiAgX2luaGVyaXRzTG9vc2UkOShUVEZHbHlwaCwgX0dseXBoKTtcblxuICBmdW5jdGlvbiBUVEZHbHlwaCgpIHtcbiAgICByZXR1cm4gX0dseXBoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8yID0gVFRGR2x5cGgucHJvdG90eXBlO1xuXG4gIC8vIFBhcnNlcyBqdXN0IHRoZSBnbHlwaCBoZWFkZXIgYW5kIHJldHVybnMgdGhlIGJvdW5kaW5nIGJveFxuICBfcHJvdG8yLl9nZXRDQm94ID0gZnVuY3Rpb24gX2dldENCb3goaW50ZXJuYWwpIHtcbiAgICAvLyBXZSBuZWVkIHRvIGRlY29kZSB0aGUgZ2x5cGggaWYgdmFyaWF0aW9uIHByb2Nlc3NpbmcgaXMgcmVxdWVzdGVkLFxuICAgIC8vIHNvIGl0J3MgZWFzaWVyIGp1c3QgdG8gcmVjb21wdXRlIHRoZSBwYXRoJ3MgY2JveCBhZnRlciBkZWNvZGluZy5cbiAgICBpZiAodGhpcy5fZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yICYmICFpbnRlcm5hbCkge1xuICAgICAgcmV0dXJuIHRoaXMucGF0aC5jYm94O1xuICAgIH1cblxuICAgIHZhciBzdHJlYW0gPSB0aGlzLl9mb250Ll9nZXRUYWJsZVN0cmVhbSgnZ2x5ZicpO1xuXG4gICAgc3RyZWFtLnBvcyArPSB0aGlzLl9mb250LmxvY2Eub2Zmc2V0c1t0aGlzLmlkXTtcbiAgICB2YXIgZ2x5cGggPSBHbHlmSGVhZGVyLmRlY29kZShzdHJlYW0pO1xuICAgIHZhciBjYm94ID0gbmV3IEJCb3goZ2x5cGgueE1pbiwgZ2x5cGgueU1pbiwgZ2x5cGgueE1heCwgZ2x5cGgueU1heCk7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoY2JveCk7XG4gIH0gLy8gUGFyc2VzIGEgc2luZ2xlIGdseXBoIGNvb3JkaW5hdGVcbiAgO1xuXG4gIF9wcm90bzIuX3BhcnNlR2x5cGhDb29yZCA9IGZ1bmN0aW9uIF9wYXJzZUdseXBoQ29vcmQoc3RyZWFtLCBwcmV2LCBfc2hvcnQsIHNhbWUpIHtcbiAgICBpZiAoX3Nob3J0KSB7XG4gICAgICB2YXIgdmFsID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuXG4gICAgICBpZiAoIXNhbWUpIHtcbiAgICAgICAgdmFsID0gLXZhbDtcbiAgICAgIH1cblxuICAgICAgdmFsICs9IHByZXY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzYW1lKSB7XG4gICAgICAgIHZhciB2YWwgPSBwcmV2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHZhbCA9IHByZXYgKyBzdHJlYW0ucmVhZEludDE2QkUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9IC8vIERlY29kZXMgdGhlIGdseXBoIGRhdGEgaW50byBwb2ludHMgZm9yIHNpbXBsZSBnbHlwaHMsXG4gIC8vIG9yIGNvbXBvbmVudHMgZm9yIGNvbXBvc2l0ZSBnbHlwaHNcbiAgO1xuXG4gIF9wcm90bzIuX2RlY29kZSA9IGZ1bmN0aW9uIF9kZWNvZGUoKSB7XG4gICAgdmFyIGdseWZQb3MgPSB0aGlzLl9mb250LmxvY2Eub2Zmc2V0c1t0aGlzLmlkXTtcbiAgICB2YXIgbmV4dFBvcyA9IHRoaXMuX2ZvbnQubG9jYS5vZmZzZXRzW3RoaXMuaWQgKyAxXTsgLy8gTm90aGluZyB0byBkbyBpZiB0aGVyZSBpcyBubyBkYXRhIGZvciB0aGlzIGdseXBoXG5cbiAgICBpZiAoZ2x5ZlBvcyA9PT0gbmV4dFBvcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHN0cmVhbSA9IHRoaXMuX2ZvbnQuX2dldFRhYmxlU3RyZWFtKCdnbHlmJyk7XG5cbiAgICBzdHJlYW0ucG9zICs9IGdseWZQb3M7XG4gICAgdmFyIHN0YXJ0UG9zID0gc3RyZWFtLnBvcztcbiAgICB2YXIgZ2x5cGggPSBHbHlmSGVhZGVyLmRlY29kZShzdHJlYW0pO1xuXG4gICAgaWYgKGdseXBoLm51bWJlck9mQ29udG91cnMgPiAwKSB7XG4gICAgICB0aGlzLl9kZWNvZGVTaW1wbGUoZ2x5cGgsIHN0cmVhbSk7XG4gICAgfSBlbHNlIGlmIChnbHlwaC5udW1iZXJPZkNvbnRvdXJzIDwgMCkge1xuICAgICAgdGhpcy5fZGVjb2RlQ29tcG9zaXRlKGdseXBoLCBzdHJlYW0sIHN0YXJ0UG9zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2x5cGg7XG4gIH07XG5cbiAgX3Byb3RvMi5fZGVjb2RlU2ltcGxlID0gZnVuY3Rpb24gX2RlY29kZVNpbXBsZShnbHlwaCwgc3RyZWFtKSB7XG4gICAgLy8gdGhpcyBpcyBhIHNpbXBsZSBnbHlwaFxuICAgIGdseXBoLnBvaW50cyA9IFtdO1xuICAgIHZhciBlbmRQdHNPZkNvbnRvdXJzID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgZ2x5cGgubnVtYmVyT2ZDb250b3VycykuZGVjb2RlKHN0cmVhbSk7XG4gICAgZ2x5cGguaW5zdHJ1Y3Rpb25zID0gbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQ4LCByZXN0cnVjdHVyZS51aW50MTYpLmRlY29kZShzdHJlYW0pO1xuICAgIHZhciBmbGFncyA9IFtdO1xuICAgIHZhciBudW1Db29yZHMgPSBlbmRQdHNPZkNvbnRvdXJzW2VuZFB0c09mQ29udG91cnMubGVuZ3RoIC0gMV0gKyAxO1xuXG4gICAgd2hpbGUgKGZsYWdzLmxlbmd0aCA8IG51bUNvb3Jkcykge1xuICAgICAgdmFyIGZsYWcgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG4gICAgICBmbGFncy5wdXNoKGZsYWcpOyAvLyBjaGVjayBmb3IgcmVwZWF0IGZsYWdcblxuICAgICAgaWYgKGZsYWcgJiBSRVBFQVQpIHtcbiAgICAgICAgdmFyIGNvdW50ID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY291bnQ7IGorKykge1xuICAgICAgICAgIGZsYWdzLnB1c2goZmxhZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZmxhZyA9IGZsYWdzW2ldO1xuICAgICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KCEhKGZsYWcgJiBPTl9DVVJWRSksIGVuZFB0c09mQ29udG91cnMuaW5kZXhPZihpKSA+PSAwLCAwLCAwKTtcbiAgICAgIGdseXBoLnBvaW50cy5wdXNoKHBvaW50KTtcbiAgICB9XG5cbiAgICB2YXIgcHggPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZsYWcgPSBmbGFnc1tpXTtcbiAgICAgIGdseXBoLnBvaW50c1tpXS54ID0gcHggPSB0aGlzLl9wYXJzZUdseXBoQ29vcmQoc3RyZWFtLCBweCwgZmxhZyAmIFhfU0hPUlRfVkVDVE9SLCBmbGFnICYgU0FNRV9YKTtcbiAgICB9XG5cbiAgICB2YXIgcHkgPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGZsYWcgPSBmbGFnc1tpXTtcbiAgICAgIGdseXBoLnBvaW50c1tpXS55ID0gcHkgPSB0aGlzLl9wYXJzZUdseXBoQ29vcmQoc3RyZWFtLCBweSwgZmxhZyAmIFlfU0hPUlRfVkVDVE9SLCBmbGFnICYgU0FNRV9ZKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yKSB7XG4gICAgICB2YXIgcG9pbnRzID0gZ2x5cGgucG9pbnRzLnNsaWNlKCk7XG4gICAgICBwb2ludHMucHVzaC5hcHBseShwb2ludHMsIHRoaXMuX2dldFBoYW50b21Qb2ludHMoZ2x5cGgpKTtcblxuICAgICAgdGhpcy5fZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yLnRyYW5zZm9ybVBvaW50cyh0aGlzLmlkLCBwb2ludHMpO1xuXG4gICAgICBnbHlwaC5waGFudG9tUG9pbnRzID0gcG9pbnRzLnNsaWNlKC00KTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH07XG5cbiAgX3Byb3RvMi5fZGVjb2RlQ29tcG9zaXRlID0gZnVuY3Rpb24gX2RlY29kZUNvbXBvc2l0ZShnbHlwaCwgc3RyZWFtLCBvZmZzZXQpIHtcbiAgICBpZiAob2Zmc2V0ID09PSB2b2lkIDApIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBpcyBhIGNvbXBvc2l0ZSBnbHlwaFxuICAgIGdseXBoLmNvbXBvbmVudHMgPSBbXTtcbiAgICB2YXIgaGF2ZUluc3RydWN0aW9ucyA9IGZhbHNlO1xuICAgIHZhciBmbGFncyA9IE1PUkVfQ09NUE9ORU5UUztcblxuICAgIHdoaWxlIChmbGFncyAmIE1PUkVfQ09NUE9ORU5UUykge1xuICAgICAgZmxhZ3MgPSBzdHJlYW0ucmVhZFVJbnQxNkJFKCk7XG4gICAgICB2YXIgZ1BvcyA9IHN0cmVhbS5wb3MgLSBvZmZzZXQ7XG4gICAgICB2YXIgZ2x5cGhJRCA9IHN0cmVhbS5yZWFkVUludDE2QkUoKTtcblxuICAgICAgaWYgKCFoYXZlSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgIGhhdmVJbnN0cnVjdGlvbnMgPSAoZmxhZ3MgJiBXRV9IQVZFX0lOU1RSVUNUSU9OUykgIT09IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChmbGFncyAmIEFSR18xX0FORF8yX0FSRV9XT1JEUykge1xuICAgICAgICB2YXIgZHggPSBzdHJlYW0ucmVhZEludDE2QkUoKTtcbiAgICAgICAgdmFyIGR5ID0gc3RyZWFtLnJlYWRJbnQxNkJFKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZHggPSBzdHJlYW0ucmVhZEludDgoKTtcbiAgICAgICAgdmFyIGR5ID0gc3RyZWFtLnJlYWRJbnQ4KCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KGdseXBoSUQsIGR4LCBkeSk7XG4gICAgICBjb21wb25lbnQucG9zID0gZ1BvcztcblxuICAgICAgaWYgKGZsYWdzICYgV0VfSEFWRV9BX1NDQUxFKSB7XG4gICAgICAgIC8vIGZpeGVkIG51bWJlciB3aXRoIDE0IGJpdHMgb2YgZnJhY3Rpb25cbiAgICAgICAgY29tcG9uZW50LnNjYWxlWCA9IGNvbXBvbmVudC5zY2FsZVkgPSAoc3RyZWFtLnJlYWRVSW50OCgpIDw8IDI0IHwgc3RyZWFtLnJlYWRVSW50OCgpIDw8IDE2KSAvIDEwNzM3NDE4MjQ7XG4gICAgICB9IGVsc2UgaWYgKGZsYWdzICYgV0VfSEFWRV9BTl9YX0FORF9ZX1NDQUxFKSB7XG4gICAgICAgIGNvbXBvbmVudC5zY2FsZVggPSAoc3RyZWFtLnJlYWRVSW50OCgpIDw8IDI0IHwgc3RyZWFtLnJlYWRVSW50OCgpIDw8IDE2KSAvIDEwNzM3NDE4MjQ7XG4gICAgICAgIGNvbXBvbmVudC5zY2FsZVkgPSAoc3RyZWFtLnJlYWRVSW50OCgpIDw8IDI0IHwgc3RyZWFtLnJlYWRVSW50OCgpIDw8IDE2KSAvIDEwNzM3NDE4MjQ7XG4gICAgICB9IGVsc2UgaWYgKGZsYWdzICYgV0VfSEFWRV9BX1RXT19CWV9UV08pIHtcbiAgICAgICAgY29tcG9uZW50LnNjYWxlWCA9IChzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMjQgfCBzdHJlYW0ucmVhZFVJbnQ4KCkgPDwgMTYpIC8gMTA3Mzc0MTgyNDtcbiAgICAgICAgY29tcG9uZW50LnNjYWxlMDEgPSAoc3RyZWFtLnJlYWRVSW50OCgpIDw8IDI0IHwgc3RyZWFtLnJlYWRVSW50OCgpIDw8IDE2KSAvIDEwNzM3NDE4MjQ7XG4gICAgICAgIGNvbXBvbmVudC5zY2FsZTEwID0gKHN0cmVhbS5yZWFkVUludDgoKSA8PCAyNCB8IHN0cmVhbS5yZWFkVUludDgoKSA8PCAxNikgLyAxMDczNzQxODI0O1xuICAgICAgICBjb21wb25lbnQuc2NhbGVZID0gKHN0cmVhbS5yZWFkVUludDgoKSA8PCAyNCB8IHN0cmVhbS5yZWFkVUludDgoKSA8PCAxNikgLyAxMDczNzQxODI0O1xuICAgICAgfVxuXG4gICAgICBnbHlwaC5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yKSB7XG4gICAgICB2YXIgcG9pbnRzID0gW107XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ2x5cGguY29tcG9uZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gZ2x5cGguY29tcG9uZW50c1tqXTtcbiAgICAgICAgcG9pbnRzLnB1c2gobmV3IFBvaW50KHRydWUsIHRydWUsIGNvbXBvbmVudC5keCwgY29tcG9uZW50LmR5KSk7XG4gICAgICB9XG5cbiAgICAgIHBvaW50cy5wdXNoLmFwcGx5KHBvaW50cywgdGhpcy5fZ2V0UGhhbnRvbVBvaW50cyhnbHlwaCkpO1xuXG4gICAgICB0aGlzLl9mb250Ll92YXJpYXRpb25Qcm9jZXNzb3IudHJhbnNmb3JtUG9pbnRzKHRoaXMuaWQsIHBvaW50cyk7XG5cbiAgICAgIGdseXBoLnBoYW50b21Qb2ludHMgPSBwb2ludHMuc3BsaWNlKC00LCA0KTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICBnbHlwaC5jb21wb25lbnRzW2ldLmR4ID0gcG9pbnQueDtcbiAgICAgICAgZ2x5cGguY29tcG9uZW50c1tpXS5keSA9IHBvaW50Lnk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhdmVJbnN0cnVjdGlvbnM7XG4gIH07XG5cbiAgX3Byb3RvMi5fZ2V0UGhhbnRvbVBvaW50cyA9IGZ1bmN0aW9uIF9nZXRQaGFudG9tUG9pbnRzKGdseXBoKSB7XG4gICAgdmFyIGNib3ggPSB0aGlzLl9nZXRDQm94KHRydWUpO1xuXG4gICAgaWYgKHRoaXMuX21ldHJpY3MgPT0gbnVsbCkge1xuICAgICAgdGhpcy5fbWV0cmljcyA9IEdseXBoLnByb3RvdHlwZS5fZ2V0TWV0cmljcy5jYWxsKHRoaXMsIGNib3gpO1xuICAgIH1cblxuICAgIHZhciBfdGhpcyRfbWV0cmljcyA9IHRoaXMuX21ldHJpY3MsXG4gICAgICAgIGFkdmFuY2VXaWR0aCA9IF90aGlzJF9tZXRyaWNzLmFkdmFuY2VXaWR0aCxcbiAgICAgICAgYWR2YW5jZUhlaWdodCA9IF90aGlzJF9tZXRyaWNzLmFkdmFuY2VIZWlnaHQsXG4gICAgICAgIGxlZnRCZWFyaW5nID0gX3RoaXMkX21ldHJpY3MubGVmdEJlYXJpbmcsXG4gICAgICAgIHRvcEJlYXJpbmcgPSBfdGhpcyRfbWV0cmljcy50b3BCZWFyaW5nO1xuICAgIHJldHVybiBbbmV3IFBvaW50KGZhbHNlLCB0cnVlLCBnbHlwaC54TWluIC0gbGVmdEJlYXJpbmcsIDApLCBuZXcgUG9pbnQoZmFsc2UsIHRydWUsIGdseXBoLnhNaW4gLSBsZWZ0QmVhcmluZyArIGFkdmFuY2VXaWR0aCwgMCksIG5ldyBQb2ludChmYWxzZSwgdHJ1ZSwgMCwgZ2x5cGgueU1heCArIHRvcEJlYXJpbmcpLCBuZXcgUG9pbnQoZmFsc2UsIHRydWUsIDAsIGdseXBoLnlNYXggKyB0b3BCZWFyaW5nICsgYWR2YW5jZUhlaWdodCldO1xuICB9IC8vIERlY29kZXMgZm9udCBkYXRhLCByZXNvbHZlcyBjb21wb3NpdGUgZ2x5cGhzLCBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBjb250b3Vyc1xuICA7XG5cbiAgX3Byb3RvMi5fZ2V0Q29udG91cnMgPSBmdW5jdGlvbiBfZ2V0Q29udG91cnMoKSB7XG4gICAgdmFyIGdseXBoID0gdGhpcy5fZGVjb2RlKCk7XG5cbiAgICBpZiAoIWdseXBoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIHBvaW50cyA9IFtdO1xuXG4gICAgaWYgKGdseXBoLm51bWJlck9mQ29udG91cnMgPCAwKSB7XG4gICAgICAvLyByZXNvbHZlIGNvbXBvc2l0ZSBnbHlwaHNcbiAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkbShnbHlwaC5jb21wb25lbnRzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgIHZhciBfY29udG91cnMgPSB0aGlzLl9mb250LmdldEdseXBoKGNvbXBvbmVudC5nbHlwaElEKS5fZ2V0Q29udG91cnMoKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9jb250b3Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjb250b3VyID0gX2NvbnRvdXJzW2ldO1xuXG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb250b3VyLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgX3BvaW50ID0gY29udG91cltqXTtcbiAgICAgICAgICAgIHZhciB4ID0gX3BvaW50LnggKiBjb21wb25lbnQuc2NhbGVYICsgX3BvaW50LnkgKiBjb21wb25lbnQuc2NhbGUwMSArIGNvbXBvbmVudC5keDtcbiAgICAgICAgICAgIHZhciB5ID0gX3BvaW50LnkgKiBjb21wb25lbnQuc2NhbGVZICsgX3BvaW50LnggKiBjb21wb25lbnQuc2NhbGUxMCArIGNvbXBvbmVudC5keTtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKG5ldyBQb2ludChfcG9pbnQub25DdXJ2ZSwgX3BvaW50LmVuZENvbnRvdXIsIHgsIHkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRzID0gZ2x5cGgucG9pbnRzIHx8IFtdO1xuICAgIH0gLy8gUmVjb21wdXRlIGFuZCBjYWNoZSBtZXRyaWNzIGlmIHdlIHBlcmZvcm1lZCB2YXJpYXRpb24gcHJvY2Vzc2luZywgYW5kIGRvbid0IGhhdmUgYW4gSFZBUiB0YWJsZVxuXG5cbiAgICBpZiAoZ2x5cGgucGhhbnRvbVBvaW50cyAmJiAhdGhpcy5fZm9udC5kaXJlY3RvcnkudGFibGVzLkhWQVIpIHtcbiAgICAgIHRoaXMuX21ldHJpY3MuYWR2YW5jZVdpZHRoID0gZ2x5cGgucGhhbnRvbVBvaW50c1sxXS54IC0gZ2x5cGgucGhhbnRvbVBvaW50c1swXS54O1xuICAgICAgdGhpcy5fbWV0cmljcy5hZHZhbmNlSGVpZ2h0ID0gZ2x5cGgucGhhbnRvbVBvaW50c1szXS55IC0gZ2x5cGgucGhhbnRvbVBvaW50c1syXS55O1xuICAgICAgdGhpcy5fbWV0cmljcy5sZWZ0QmVhcmluZyA9IGdseXBoLnhNaW4gLSBnbHlwaC5waGFudG9tUG9pbnRzWzBdLng7XG4gICAgICB0aGlzLl9tZXRyaWNzLnRvcEJlYXJpbmcgPSBnbHlwaC5waGFudG9tUG9pbnRzWzJdLnkgLSBnbHlwaC55TWF4O1xuICAgIH1cblxuICAgIHZhciBjb250b3VycyA9IFtdO1xuICAgIHZhciBjdXIgPSBbXTtcblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcG9pbnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICB2YXIgcG9pbnQgPSBwb2ludHNba107XG4gICAgICBjdXIucHVzaChwb2ludCk7XG5cbiAgICAgIGlmIChwb2ludC5lbmRDb250b3VyKSB7XG4gICAgICAgIGNvbnRvdXJzLnB1c2goY3VyKTtcbiAgICAgICAgY3VyID0gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRvdXJzO1xuICB9O1xuXG4gIF9wcm90bzIuX2dldE1ldHJpY3MgPSBmdW5jdGlvbiBfZ2V0TWV0cmljcygpIHtcbiAgICBpZiAodGhpcy5fbWV0cmljcykge1xuICAgICAgcmV0dXJuIHRoaXMuX21ldHJpY3M7XG4gICAgfVxuXG4gICAgdmFyIGNib3ggPSB0aGlzLl9nZXRDQm94KHRydWUpO1xuXG4gICAgX0dseXBoLnByb3RvdHlwZS5fZ2V0TWV0cmljcy5jYWxsKHRoaXMsIGNib3gpO1xuXG4gICAgaWYgKHRoaXMuX2ZvbnQuX3ZhcmlhdGlvblByb2Nlc3NvciAmJiAhdGhpcy5fZm9udC5IVkFSKSB7XG4gICAgICAvLyBObyBIVkFSIHRhYmxlLCBkZWNvZGUgdGhlIGdseXBoLiBUaGlzIHRyaWdnZXJzIHJlY29tcHV0YXRpb24gb2YgbWV0cmljcy5cbiAgICAgIHRoaXMucGF0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fbWV0cmljcztcbiAgfSAvLyBDb252ZXJ0cyBjb250b3VycyB0byBhIFBhdGggb2JqZWN0IHRoYXQgY2FuIGJlIHJlbmRlcmVkXG4gIDtcblxuICBfcHJvdG8yLl9nZXRQYXRoID0gZnVuY3Rpb24gX2dldFBhdGgoKSB7XG4gICAgdmFyIGNvbnRvdXJzID0gdGhpcy5fZ2V0Q29udG91cnMoKTtcblxuICAgIHZhciBwYXRoID0gbmV3IFBhdGgoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udG91cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb250b3VyID0gY29udG91cnNbaV07XG4gICAgICB2YXIgZmlyc3RQdCA9IGNvbnRvdXJbMF07XG4gICAgICB2YXIgbGFzdFB0ID0gY29udG91cltjb250b3VyLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIHN0YXJ0ID0gMDtcblxuICAgICAgaWYgKGZpcnN0UHQub25DdXJ2ZSkge1xuICAgICAgICAvLyBUaGUgZmlyc3QgcG9pbnQgd2lsbCBiZSBjb25zdW1lZCBieSB0aGUgbW92ZVRvIGNvbW1hbmQsIHNvIHNraXAgaW4gdGhlIGxvb3BcbiAgICAgICAgdmFyIGN1cnZlUHQgPSBudWxsO1xuICAgICAgICBzdGFydCA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGFzdFB0Lm9uQ3VydmUpIHtcbiAgICAgICAgICAvLyBTdGFydCBhdCB0aGUgbGFzdCBwb2ludCBpZiB0aGUgZmlyc3QgcG9pbnQgaXMgb2ZmIGN1cnZlIGFuZCB0aGUgbGFzdCBwb2ludCBpcyBvbiBjdXJ2ZVxuICAgICAgICAgIGZpcnN0UHQgPSBsYXN0UHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3RhcnQgYXQgdGhlIG1pZGRsZSBpZiBib3RoIHRoZSBmaXJzdCBhbmQgbGFzdCBwb2ludHMgYXJlIG9mZiBjdXJ2ZVxuICAgICAgICAgIGZpcnN0UHQgPSBuZXcgUG9pbnQoZmFsc2UsIGZhbHNlLCAoZmlyc3RQdC54ICsgbGFzdFB0LngpIC8gMiwgKGZpcnN0UHQueSArIGxhc3RQdC55KSAvIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGN1cnZlUHQgPSBmaXJzdFB0O1xuICAgICAgfVxuXG4gICAgICBwYXRoLm1vdmVUbyhmaXJzdFB0LngsIGZpcnN0UHQueSk7XG5cbiAgICAgIGZvciAodmFyIGogPSBzdGFydDsgaiA8IGNvbnRvdXIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHB0ID0gY29udG91cltqXTtcbiAgICAgICAgdmFyIHByZXZQdCA9IGogPT09IDAgPyBmaXJzdFB0IDogY29udG91cltqIC0gMV07XG5cbiAgICAgICAgaWYgKHByZXZQdC5vbkN1cnZlICYmIHB0Lm9uQ3VydmUpIHtcbiAgICAgICAgICBwYXRoLmxpbmVUbyhwdC54LCBwdC55KTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2UHQub25DdXJ2ZSAmJiAhcHQub25DdXJ2ZSkge1xuICAgICAgICAgIHZhciBjdXJ2ZVB0ID0gcHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXByZXZQdC5vbkN1cnZlICYmICFwdC5vbkN1cnZlKSB7XG4gICAgICAgICAgdmFyIG1pZFggPSAocHJldlB0LnggKyBwdC54KSAvIDI7XG4gICAgICAgICAgdmFyIG1pZFkgPSAocHJldlB0LnkgKyBwdC55KSAvIDI7XG4gICAgICAgICAgcGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKHByZXZQdC54LCBwcmV2UHQueSwgbWlkWCwgbWlkWSk7XG4gICAgICAgICAgdmFyIGN1cnZlUHQgPSBwdDtcbiAgICAgICAgfSBlbHNlIGlmICghcHJldlB0Lm9uQ3VydmUgJiYgcHQub25DdXJ2ZSkge1xuICAgICAgICAgIHBhdGgucXVhZHJhdGljQ3VydmVUbyhjdXJ2ZVB0LngsIGN1cnZlUHQueSwgcHQueCwgcHQueSk7XG4gICAgICAgICAgdmFyIGN1cnZlUHQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gVFRGIHBhdGggc3RhdGVcIik7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gQ29ubmVjdCB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnRzXG5cblxuICAgICAgaWYgKGN1cnZlUHQpIHtcbiAgICAgICAgcGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKGN1cnZlUHQueCwgY3VydmVQdC55LCBmaXJzdFB0LngsIGZpcnN0UHQueSk7XG4gICAgICB9XG5cbiAgICAgIHBhdGguY2xvc2VQYXRoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH07XG5cbiAgcmV0dXJuIFRURkdseXBoO1xufShHbHlwaCk7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJGEoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gT3BlblR5cGUgUG9zdFNjcmlwdCBnbHlwaCwgaW4gdGhlIENvbXBhY3QgRm9udCBGb3JtYXQuXG4gKi9cblxudmFyIENGRkdseXBoID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfR2x5cGgpIHtcbiAgX2luaGVyaXRzTG9vc2UkYShDRkZHbHlwaCwgX0dseXBoKTtcblxuICBmdW5jdGlvbiBDRkZHbHlwaCgpIHtcbiAgICByZXR1cm4gX0dseXBoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBDRkZHbHlwaC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9nZXROYW1lID0gZnVuY3Rpb24gX2dldE5hbWUoKSB7XG4gICAgaWYgKHRoaXMuX2ZvbnQuQ0ZGMikge1xuICAgICAgcmV0dXJuIF9HbHlwaC5wcm90b3R5cGUuX2dldE5hbWUuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZm9udFsnQ0ZGICddLmdldEdseXBoTmFtZSh0aGlzLmlkKTtcbiAgfTtcblxuICBfcHJvdG8uYmlhcyA9IGZ1bmN0aW9uIGJpYXMocykge1xuICAgIGlmIChzLmxlbmd0aCA8IDEyNDApIHtcbiAgICAgIHJldHVybiAxMDc7XG4gICAgfSBlbHNlIGlmIChzLmxlbmd0aCA8IDMzOTAwKSB7XG4gICAgICByZXR1cm4gMTEzMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDMyNzY4O1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uX2dldFBhdGggPSBmdW5jdGlvbiBfZ2V0UGF0aCgpIHtcbiAgICB2YXIgc3RyZWFtID0gdGhpcy5fZm9udC5zdHJlYW07XG4gICAgdmFyIHBvcyA9IHN0cmVhbS5wb3M7XG4gICAgdmFyIGNmZiA9IHRoaXMuX2ZvbnQuQ0ZGMiB8fCB0aGlzLl9mb250WydDRkYgJ107XG4gICAgdmFyIHN0ciA9IGNmZi50b3BEaWN0LkNoYXJTdHJpbmdzW3RoaXMuaWRdO1xuICAgIHZhciBlbmQgPSBzdHIub2Zmc2V0ICsgc3RyLmxlbmd0aDtcbiAgICBzdHJlYW0ucG9zID0gc3RyLm9mZnNldDtcbiAgICB2YXIgcGF0aCA9IG5ldyBQYXRoKCk7XG4gICAgdmFyIHN0YWNrID0gW107XG4gICAgdmFyIHRyYW5zID0gW107XG4gICAgdmFyIHdpZHRoID0gbnVsbDtcbiAgICB2YXIgblN0ZW1zID0gMDtcbiAgICB2YXIgeCA9IDAsXG4gICAgICAgIHkgPSAwO1xuICAgIHZhciB1c2VkR3N1YnJzO1xuICAgIHZhciB1c2VkU3VicnM7XG4gICAgdmFyIG9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLl91c2VkR3N1YnJzID0gdXNlZEdzdWJycyA9IHt9O1xuICAgIHRoaXMuX3VzZWRTdWJycyA9IHVzZWRTdWJycyA9IHt9O1xuICAgIHZhciBnc3VicnMgPSBjZmYuZ2xvYmFsU3VickluZGV4IHx8IFtdO1xuICAgIHZhciBnc3VicnNCaWFzID0gdGhpcy5iaWFzKGdzdWJycyk7XG4gICAgdmFyIHByaXZhdGVEaWN0ID0gY2ZmLnByaXZhdGVEaWN0Rm9yR2x5cGgodGhpcy5pZCk7XG4gICAgdmFyIHN1YnJzID0gcHJpdmF0ZURpY3QuU3VicnMgfHwgW107XG4gICAgdmFyIHN1YnJzQmlhcyA9IHRoaXMuYmlhcyhzdWJycyk7XG4gICAgdmFyIHZzdG9yZSA9IGNmZi50b3BEaWN0LnZzdG9yZSAmJiBjZmYudG9wRGljdC52c3RvcmUuaXRlbVZhcmlhdGlvblN0b3JlO1xuICAgIHZhciB2c2luZGV4ID0gcHJpdmF0ZURpY3QudnNpbmRleDtcbiAgICB2YXIgdmFyaWF0aW9uUHJvY2Vzc29yID0gdGhpcy5fZm9udC5fdmFyaWF0aW9uUHJvY2Vzc29yO1xuXG4gICAgZnVuY3Rpb24gY2hlY2tXaWR0aCgpIHtcbiAgICAgIGlmICh3aWR0aCA9PSBudWxsKSB7XG4gICAgICAgIHdpZHRoID0gc3RhY2suc2hpZnQoKSArIHByaXZhdGVEaWN0Lm5vbWluYWxXaWR0aFg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VTdGVtcygpIHtcbiAgICAgIGlmIChzdGFjay5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICAgIGNoZWNrV2lkdGgoKTtcbiAgICAgIH1cblxuICAgICAgblN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxO1xuICAgICAgcmV0dXJuIHN0YWNrLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW92ZVRvKHgsIHkpIHtcbiAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgIHBhdGguY2xvc2VQYXRoKCk7XG4gICAgICB9XG5cbiAgICAgIHBhdGgubW92ZVRvKHgsIHkpO1xuICAgICAgb3BlbiA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHBhcnNlID0gZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIgb3AgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG5cbiAgICAgICAgaWYgKG9wIDwgMzIpIHtcbiAgICAgICAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICAgICAgICBjYXNlIDE6IC8vIGhzdGVtXG5cbiAgICAgICAgICAgIGNhc2UgMzogLy8gdnN0ZW1cblxuICAgICAgICAgICAgY2FzZSAxODogLy8gaHN0ZW1obVxuXG4gICAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgICAgICAvLyB2c3RlbWhtXG4gICAgICAgICAgICAgIHBhcnNlU3RlbXMoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgLy8gdm1vdmV0b1xuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGNoZWNrV2lkdGgoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgbW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAvLyBybGluZXRvXG4gICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgcGF0aC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA2OiAvLyBobGluZXRvXG5cbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgLy8gdmxpbmV0b1xuICAgICAgICAgICAgICB2YXIgcGhhc2UgPSBvcCA9PT0gNjtcblxuICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAocGhhc2UpIHtcbiAgICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhdGgubGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgICAgIHBoYXNlID0gIXBoYXNlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgLy8gcnJjdXJ2ZXRvXG4gICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMxeCA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHZhciBjMXkgPSB5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB2YXIgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB2YXIgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB4ID0gYzJ4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB5ID0gYzJ5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAvLyBjYWxsc3ViclxuICAgICAgICAgICAgICB2YXIgaW5kZXggPSBzdGFjay5wb3AoKSArIHN1YnJzQmlhcztcbiAgICAgICAgICAgICAgdmFyIHN1YnIgPSBzdWJyc1tpbmRleF07XG5cbiAgICAgICAgICAgICAgaWYgKHN1YnIpIHtcbiAgICAgICAgICAgICAgICB1c2VkU3VicnNbaW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgcCA9IHN0cmVhbS5wb3M7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBlbmQ7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnBvcyA9IHN1YnIub2Zmc2V0O1xuICAgICAgICAgICAgICAgIGVuZCA9IHN1YnIub2Zmc2V0ICsgc3Vici5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcGFyc2UoKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucG9zID0gcDtcbiAgICAgICAgICAgICAgICBlbmQgPSBlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgIC8vIHJldHVyblxuICAgICAgICAgICAgICBpZiAoY2ZmLnZlcnNpb24gPj0gMikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAvLyBlbmRjaGFyXG4gICAgICAgICAgICAgIGlmIChjZmYudmVyc2lvbiA+PSAyKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNoZWNrV2lkdGgoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChvcGVuKSB7XG4gICAgICAgICAgICAgICAgcGF0aC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgICAgICBvcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIHZzaW5kZXhcbiAgICAgICAgICAgICAgICBpZiAoY2ZmLnZlcnNpb24gPCAyKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZzaW5kZXggb3BlcmF0b3Igbm90IHN1cHBvcnRlZCBpbiBDRkYgdjEnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2c2luZGV4ID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGJsZW5kXG4gICAgICAgICAgICAgICAgaWYgKGNmZi52ZXJzaW9uIDwgMikge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdibGVuZCBvcGVyYXRvciBub3Qgc3VwcG9ydGVkIGluIENGRiB2MScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghdmFyaWF0aW9uUHJvY2Vzc29yKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JsZW5kIG9wZXJhdG9yIGluIG5vbi12YXJpYXRpb24gZm9udCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBibGVuZFZlY3RvciA9IHZhcmlhdGlvblByb2Nlc3Nvci5nZXRCbGVuZFZlY3Rvcih2c3RvcmUsIHZzaW5kZXgpO1xuICAgICAgICAgICAgICAgIHZhciBudW1CbGVuZHMgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB2YXIgbnVtT3BlcmFuZHMgPSBudW1CbGVuZHMgKiBibGVuZFZlY3Rvci5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIGRlbHRhID0gc3RhY2subGVuZ3RoIC0gbnVtT3BlcmFuZHM7XG4gICAgICAgICAgICAgICAgdmFyIGJhc2UgPSBkZWx0YSAtIG51bUJsZW5kcztcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtQmxlbmRzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHZhciBzdW0gPSBzdGFja1tiYXNlICsgaV07XG5cbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYmxlbmRWZWN0b3IubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtICs9IGJsZW5kVmVjdG9yW2pdICogc3RhY2tbZGVsdGErK107XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHN0YWNrW2Jhc2UgKyBpXSA9IHN1bTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAobnVtT3BlcmFuZHMtLSkge1xuICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAxOTogLy8gaGludG1hc2tcblxuICAgICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgICAgLy8gY250cm1hc2tcbiAgICAgICAgICAgICAgcGFyc2VTdGVtcygpO1xuICAgICAgICAgICAgICBzdHJlYW0ucG9zICs9IG5TdGVtcyArIDcgPj4gMztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgIC8vIHJtb3ZldG9cbiAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICBjaGVja1dpZHRoKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgbW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgLy8gaG1vdmV0b1xuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGNoZWNrV2lkdGgoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgbW92ZVRvKHgsIHkpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgLy8gcmN1cnZlbGluZVxuICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID49IDgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYzF4ID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGMxeSA9IHkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHZhciBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHZhciBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHggPSBjMnggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHkgPSBjMnkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUbyhjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHBhdGgubGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgLy8gcmxpbmVjdXJ2ZVxuICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID49IDgpIHtcbiAgICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHBhdGgubGluZVRvKHgsIHkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIGMxeCA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB2YXIgYzF5ID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHZhciBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB2YXIgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgeCA9IGMyeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgIHkgPSBjMnkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgIC8vIHZ2Y3VydmV0b1xuICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikge1xuICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPj0gNCkge1xuICAgICAgICAgICAgICAgIGMxeCA9IHg7XG4gICAgICAgICAgICAgICAgYzF5ID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHggPSBjMng7XG4gICAgICAgICAgICAgICAgeSA9IGMyeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwgeCwgeSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgLy8gaGhjdXJ2ZXRvXG4gICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggJSAyKSB7XG4gICAgICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgICAgICAgICAgYzF4ID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgYzF5ID0geTtcbiAgICAgICAgICAgICAgICBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeCA9IGMyeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgeSA9IGMyeTtcbiAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDI4OlxuICAgICAgICAgICAgICAvLyBzaG9ydGludFxuICAgICAgICAgICAgICBzdGFjay5wdXNoKHN0cmVhbS5yZWFkSW50MTZCRSgpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjk6XG4gICAgICAgICAgICAgIC8vIGNhbGxnc3ViclxuICAgICAgICAgICAgICBpbmRleCA9IHN0YWNrLnBvcCgpICsgZ3N1YnJzQmlhcztcbiAgICAgICAgICAgICAgc3ViciA9IGdzdWJyc1tpbmRleF07XG5cbiAgICAgICAgICAgICAgaWYgKHN1YnIpIHtcbiAgICAgICAgICAgICAgICB1c2VkR3N1YnJzW2luZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIHAgPSBzdHJlYW0ucG9zO1xuICAgICAgICAgICAgICAgIHZhciBlID0gZW5kO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wb3MgPSBzdWJyLm9mZnNldDtcbiAgICAgICAgICAgICAgICBlbmQgPSBzdWJyLm9mZnNldCArIHN1YnIubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHBhcnNlKCk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnBvcyA9IHA7XG4gICAgICAgICAgICAgICAgZW5kID0gZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDMwOiAvLyB2aGN1cnZldG9cblxuICAgICAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICAgICAgLy8gaHZjdXJ2ZXRvXG4gICAgICAgICAgICAgIHBoYXNlID0gb3AgPT09IDMxO1xuXG4gICAgICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPj0gNCkge1xuICAgICAgICAgICAgICAgIGlmIChwaGFzZSkge1xuICAgICAgICAgICAgICAgICAgYzF4ID0geCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjMXkgPSB5O1xuICAgICAgICAgICAgICAgICAgYzJ4ID0gYzF4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGMyeSA9IGMxeSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICB5ID0gYzJ5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHggPSBjMnggKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjMXggPSB4O1xuICAgICAgICAgICAgICAgICAgYzF5ID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHggPSBjMnggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgeSA9IGMyeSArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvKGMxeCwgYzF5LCBjMngsIGMyeSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAhcGhhc2U7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgb3AgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG5cbiAgICAgICAgICAgICAgc3dpdGNoIChvcCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgIC8vIGFuZFxuICAgICAgICAgICAgICAgICAgdmFyIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHZhciBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgJiYgYiA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgLy8gb3JcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8fCBiID8gMSA6IDApO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAvLyBub3RcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSA/IDAgOiAxKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgICAgLy8gYWJzXG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguYWJzKGEpKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgIC8vIGFkZFxuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhICsgYik7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgICAvLyBzdWJcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSAtIGIpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgLy8gZGl2XG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGEgLyBiKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgIC8vIG5lZ1xuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgtYSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAvLyBlcVxuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhID09PSBiID8gMSA6IDApO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgLy8gZHJvcFxuICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAvLyBwdXRcbiAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHZhciBpZHggPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHRyYW5zW2lkeF0gPSB2YWw7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgICAgICAvLyBnZXRcbiAgICAgICAgICAgICAgICAgIGlkeCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0cmFuc1tpZHhdIHx8IDApO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgICAgLy8gaWZlbHNlXG4gICAgICAgICAgICAgICAgICB2YXIgczEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHZhciBzMiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgdmFyIHYxID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICB2YXIgdjIgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godjEgPD0gdjIgPyBzMSA6IHMyKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgICAgIC8vIHJhbmRvbVxuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgICAgIC8vIG11bFxuICAgICAgICAgICAgICAgICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChhICogYik7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgICAgICAvLyBzcXJ0XG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKE1hdGguc3FydChhKSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICAgICAgICAvLyBkdXBcbiAgICAgICAgICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goYSwgYSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMjg6XG4gICAgICAgICAgICAgICAgICAvLyBleGNoXG4gICAgICAgICAgICAgICAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGIsIGEpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgICAgICAgICAgLy8gaW5kZXhcbiAgICAgICAgICAgICAgICAgIGlkeCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBpZHggPSAwO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPiBzdGFjay5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkeCA9IHN0YWNrLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goc3RhY2tbaWR4XSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICAgICAgICAvLyByb2xsXG4gICAgICAgICAgICAgICAgICB2YXIgbiA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgICB2YXIgX2ogPSBzdGFjay5wb3AoKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKF9qID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF9qID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gc3RhY2tbbiAtIDFdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSBuIC0gMjsgX2kgPj0gMDsgX2ktLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tbX2kgKyAxXSA9IHN0YWNrW19pXTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBzdGFja1swXSA9IHQ7XG4gICAgICAgICAgICAgICAgICAgICAgX2otLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF9qIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gc3RhY2tbMF07XG5cbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPD0gbjsgX2kyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW19pMl0gPSBzdGFja1tfaTIgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBzdGFja1tuIC0gMV0gPSB0O1xuICAgICAgICAgICAgICAgICAgICAgIF9qKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgICAgICAgICAgLy8gaGZsZXhcbiAgICAgICAgICAgICAgICAgIGMxeCA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzF5ID0geTtcbiAgICAgICAgICAgICAgICAgIGMyeCA9IGMxeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjMnkgPSBjMXkgKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgdmFyIGMzeCA9IGMyeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICB2YXIgYzN5ID0gYzJ5O1xuICAgICAgICAgICAgICAgICAgdmFyIGM0eCA9IGMzeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICB2YXIgYzR5ID0gYzN5O1xuICAgICAgICAgICAgICAgICAgdmFyIGM1eCA9IGM0eCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICB2YXIgYzV5ID0gYzR5O1xuICAgICAgICAgICAgICAgICAgdmFyIGM2eCA9IGM1eCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICB2YXIgYzZ5ID0gYzV5O1xuICAgICAgICAgICAgICAgICAgeCA9IGM2eDtcbiAgICAgICAgICAgICAgICAgIHkgPSBjNnk7XG4gICAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCBjM3gsIGMzeSk7XG4gICAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8oYzR4LCBjNHksIGM1eCwgYzV5LCBjNngsIGM2eSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMzU6XG4gICAgICAgICAgICAgICAgICAvLyBmbGV4XG4gICAgICAgICAgICAgICAgICB2YXIgcHRzID0gW107XG5cbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8PSA1OyBfaTMrKykge1xuICAgICAgICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgcHRzLnB1c2goeCwgeSk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUby5hcHBseShwYXRoLCBwdHMuc2xpY2UoMCwgNikpO1xuICAgICAgICAgICAgICAgICAgcGF0aC5iZXppZXJDdXJ2ZVRvLmFwcGx5KHBhdGgsIHB0cy5zbGljZSg2KSk7XG4gICAgICAgICAgICAgICAgICBzdGFjay5zaGlmdCgpOyAvLyBmZFxuXG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMzY6XG4gICAgICAgICAgICAgICAgICAvLyBoZmxleDFcbiAgICAgICAgICAgICAgICAgIGMxeCA9IHggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzF5ID0geSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjMnggPSBjMXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzJ5ID0gYzF5ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGMzeCA9IGMyeCArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjM3kgPSBjMnk7XG4gICAgICAgICAgICAgICAgICBjNHggPSBjM3ggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzR5ID0gYzN5O1xuICAgICAgICAgICAgICAgICAgYzV4ID0gYzR4ICsgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIGM1eSA9IGM0eSArIHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICBjNnggPSBjNXggKyBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgYzZ5ID0gYzV5O1xuICAgICAgICAgICAgICAgICAgeCA9IGM2eDtcbiAgICAgICAgICAgICAgICAgIHkgPSBjNnk7XG4gICAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8oYzF4LCBjMXksIGMyeCwgYzJ5LCBjM3gsIGMzeSk7XG4gICAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8oYzR4LCBjNHksIGM1eCwgYzV5LCBjNngsIGM2eSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICAgICAgICAvLyBmbGV4MVxuICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0eCA9IHg7XG4gICAgICAgICAgICAgICAgICB2YXIgc3RhcnR5ID0geTtcbiAgICAgICAgICAgICAgICAgIHB0cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPD0gNDsgX2k0KyspIHtcbiAgICAgICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHB0cy5wdXNoKHgsIHkpO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoeCAtIHN0YXJ0eCkgPiBNYXRoLmFicyh5IC0gc3RhcnR5KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IHN0YXJ0eTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHggPSBzdGFydHg7XG4gICAgICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgcHRzLnB1c2goeCwgeSk7XG4gICAgICAgICAgICAgICAgICBwYXRoLmJlemllckN1cnZlVG8uYXBwbHkocGF0aCwgcHRzLnNsaWNlKDAsIDYpKTtcbiAgICAgICAgICAgICAgICAgIHBhdGguYmV6aWVyQ3VydmVUby5hcHBseShwYXRoLCBwdHMuc2xpY2UoNikpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcDogMTIgXCIgKyBvcCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcDogXCIgKyBvcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG9wIDwgMjQ3KSB7XG4gICAgICAgICAgc3RhY2sucHVzaChvcCAtIDEzOSk7XG4gICAgICAgIH0gZWxzZSBpZiAob3AgPCAyNTEpIHtcbiAgICAgICAgICB2YXIgYjEgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG4gICAgICAgICAgc3RhY2sucHVzaCgob3AgLSAyNDcpICogMjU2ICsgYjEgKyAxMDgpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wIDwgMjU1KSB7XG4gICAgICAgICAgdmFyIGIxID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuICAgICAgICAgIHN0YWNrLnB1c2goLShvcCAtIDI1MSkgKiAyNTYgLSBiMSAtIDEwOCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhY2sucHVzaChzdHJlYW0ucmVhZEludDMyQkUoKSAvIDY1NTM2KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBwYXJzZSgpO1xuXG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHBhdGguY2xvc2VQYXRoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH07XG5cbiAgcmV0dXJuIENGRkdseXBoO1xufShHbHlwaCk7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJGIoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG52YXIgU0JJWEltYWdlID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG9yaWdpblg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgb3JpZ2luWTogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB0eXBlOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICBkYXRhOiBuZXcgcmVzdHJ1Y3R1cmUuQnVmZmVyKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQucGFyZW50LmJ1ZmxlbiAtIHQuX2N1cnJlbnRPZmZzZXQ7XG4gIH0pXG59KTtcbi8qKlxuICogUmVwcmVzZW50cyBhIGNvbG9yIChlLmcuIGVtb2ppKSBnbHlwaCBpbiBBcHBsZSdzIFNCSVggZm9ybWF0LlxuICovXG5cbnZhciBTQklYR2x5cGggPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9UVEZHbHlwaCkge1xuICBfaW5oZXJpdHNMb29zZSRiKFNCSVhHbHlwaCwgX1RURkdseXBoKTtcblxuICBmdW5jdGlvbiBTQklYR2x5cGgoKSB7XG4gICAgcmV0dXJuIF9UVEZHbHlwaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU0JJWEdseXBoLnByb3RvdHlwZTtcblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgZ2x5cGggaW1hZ2UgYXQgdGhlIGdpdmVuIHBvaW50IHNpemUuXG4gICAqIFRoZSBvYmplY3QgaGFzIGEgZGF0YSBwcm9wZXJ0eSB3aXRoIGEgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCBpbWFnZSBkYXRhLFxuICAgKiBhbG9uZyB3aXRoIHRoZSBpbWFnZSB0eXBlLCBhbmQgb3JpZ2luLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBfcHJvdG8uZ2V0SW1hZ2VGb3JTaXplID0gZnVuY3Rpb24gZ2V0SW1hZ2VGb3JTaXplKHNpemUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2ZvbnQuc2JpeC5pbWFnZVRhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRhYmxlID0gdGhpcy5fZm9udC5zYml4LmltYWdlVGFibGVzW2ldO1xuXG4gICAgICBpZiAodGFibGUucHBlbSA+PSBzaXplKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBvZmZzZXRzID0gdGFibGUuaW1hZ2VPZmZzZXRzO1xuICAgIHZhciBzdGFydCA9IG9mZnNldHNbdGhpcy5pZF07XG4gICAgdmFyIGVuZCA9IG9mZnNldHNbdGhpcy5pZCArIDFdO1xuXG4gICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX2ZvbnQuc3RyZWFtLnBvcyA9IHN0YXJ0O1xuICAgIHJldHVybiBTQklYSW1hZ2UuZGVjb2RlKHRoaXMuX2ZvbnQuc3RyZWFtLCB7XG4gICAgICBidWZsZW46IGVuZCAtIHN0YXJ0XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcihjdHgsIHNpemUpIHtcbiAgICB2YXIgaW1nID0gdGhpcy5nZXRJbWFnZUZvclNpemUoc2l6ZSk7XG5cbiAgICBpZiAoaW1nICE9IG51bGwpIHtcbiAgICAgIHZhciBzY2FsZSA9IHNpemUgLyB0aGlzLl9mb250LnVuaXRzUGVyRW07XG4gICAgICBjdHguaW1hZ2UoaW1nLmRhdGEsIHtcbiAgICAgICAgaGVpZ2h0OiBzaXplLFxuICAgICAgICB4OiBpbWcub3JpZ2luWCxcbiAgICAgICAgeTogKHRoaXMuYmJveC5taW5ZIC0gaW1nLm9yaWdpblkpICogc2NhbGVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9mb250LnNiaXguZmxhZ3MucmVuZGVyT3V0bGluZXMpIHtcbiAgICAgIF9UVEZHbHlwaC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcywgY3R4LCBzaXplKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFNCSVhHbHlwaDtcbn0oVFRGR2x5cGgpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJG4obykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JG4obykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JG4obywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRuKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkbihvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JG4oYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJDcodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MkNyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDcoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ3KENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSRjKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgQ09MUkxheWVyID0gZnVuY3Rpb24gQ09MUkxheWVyKGdseXBoLCBjb2xvcikge1xuICB0aGlzLmdseXBoID0gZ2x5cGg7XG4gIHRoaXMuY29sb3IgPSBjb2xvcjtcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb2xvciAoZS5nLiBlbW9qaSkgZ2x5cGggaW4gTWljcm9zb2Z0J3MgQ09MUiBmb3JtYXQuXG4gKiBFYWNoIGdseXBoIGluIHRoaXMgZm9ybWF0IGNvbnRhaW4gYSBsaXN0IG9mIGNvbG9yZWQgbGF5ZXJzLCBlYWNoXG4gKiBvZiB3aGljaCAgaXMgYW5vdGhlciB2ZWN0b3IgZ2x5cGguXG4gKi9cblxuXG52YXIgQ09MUkdseXBoID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfR2x5cGgpIHtcbiAgX2luaGVyaXRzTG9vc2UkYyhDT0xSR2x5cGgsIF9HbHlwaCk7XG5cbiAgZnVuY3Rpb24gQ09MUkdseXBoKCkge1xuICAgIHJldHVybiBfR2x5cGguYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IENPTFJHbHlwaC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9nZXRCQm94ID0gZnVuY3Rpb24gX2dldEJCb3goKSB7XG4gICAgdmFyIGJib3ggPSBuZXcgQkJveCgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxheWVyID0gdGhpcy5sYXllcnNbaV07XG4gICAgICB2YXIgYiA9IGxheWVyLmdseXBoLmJib3g7XG4gICAgICBiYm94LmFkZFBvaW50KGIubWluWCwgYi5taW5ZKTtcbiAgICAgIGJib3guYWRkUG9pbnQoYi5tYXhYLCBiLm1heFkpO1xuICAgIH1cblxuICAgIHJldHVybiBiYm94O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB0aGUgZ2x5cGggYW5kIGNvbG9yIGZvclxuICAgKiBlYWNoIGxheWVyIGluIHRoZSBjb21wb3NpdGUgY29sb3IgZ2x5cGguXG4gICAqIEB0eXBlIHtvYmplY3RbXX1cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKGN0eCwgc2l6ZSkge1xuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2Ukbih0aGlzLmxheWVycyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgX3N0ZXAkdmFsdWUgPSBfc3RlcC52YWx1ZSxcbiAgICAgICAgICBnbHlwaCA9IF9zdGVwJHZhbHVlLmdseXBoLFxuICAgICAgICAgIGNvbG9yID0gX3N0ZXAkdmFsdWUuY29sb3I7XG4gICAgICBjdHguZmlsbENvbG9yKFtjb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlXSwgY29sb3IuYWxwaGEgLyAyNTUgKiAxMDApO1xuICAgICAgZ2x5cGgucmVuZGVyKGN0eCwgc2l6ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyQ3KENPTFJHbHlwaCwgW3tcbiAgICBrZXk6IFwibGF5ZXJzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgY3BhbCA9IHRoaXMuX2ZvbnQuQ1BBTDtcbiAgICAgIHZhciBjb2xyID0gdGhpcy5fZm9udC5DT0xSO1xuICAgICAgdmFyIGxvdyA9IDA7XG4gICAgICB2YXIgaGlnaCA9IGNvbHIuYmFzZUdseXBoUmVjb3JkLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChsb3cgPD0gaGlnaCkge1xuICAgICAgICB2YXIgbWlkID0gbG93ICsgaGlnaCA+PiAxO1xuICAgICAgICB2YXIgcmVjID0gY29sci5iYXNlR2x5cGhSZWNvcmRbbWlkXTtcblxuICAgICAgICBpZiAodGhpcy5pZCA8IHJlYy5naWQpIHtcbiAgICAgICAgICBoaWdoID0gbWlkIC0gMTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlkID4gcmVjLmdpZCkge1xuICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGJhc2VMYXllciA9IHJlYztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSAvLyBpZiBiYXNlIGdseXBoIG5vdCBmb3VuZCBpbiBDT0xSIHRhYmxlLFxuICAgICAgLy8gZGVmYXVsdCB0byBub3JtYWwgZ2x5cGggZnJvbSBnbHlmIG9yIENGRlxuXG5cbiAgICAgIGlmIChiYXNlTGF5ZXIgPT0gbnVsbCkge1xuICAgICAgICB2YXIgZyA9IHRoaXMuX2ZvbnQuX2dldEJhc2VHbHlwaCh0aGlzLmlkKTtcblxuICAgICAgICB2YXIgY29sb3IgPSB7XG4gICAgICAgICAgcmVkOiAwLFxuICAgICAgICAgIGdyZWVuOiAwLFxuICAgICAgICAgIGJsdWU6IDAsXG4gICAgICAgICAgYWxwaGE6IDI1NVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gW25ldyBDT0xSTGF5ZXIoZywgY29sb3IpXTtcbiAgICAgIH0gLy8gb3RoZXJ3aXNlLCByZXR1cm4gYW4gYXJyYXkgb2YgYWxsIHRoZSBsYXllcnNcblxuXG4gICAgICB2YXIgbGF5ZXJzID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSBiYXNlTGF5ZXIuZmlyc3RMYXllckluZGV4OyBpIDwgYmFzZUxheWVyLmZpcnN0TGF5ZXJJbmRleCArIGJhc2VMYXllci5udW1MYXllcnM7IGkrKykge1xuICAgICAgICB2YXIgcmVjID0gY29sci5sYXllclJlY29yZHNbaV07XG4gICAgICAgIHZhciBjb2xvciA9IGNwYWwuY29sb3JSZWNvcmRzW3JlYy5wYWxldHRlSW5kZXhdO1xuXG4gICAgICAgIHZhciBnID0gdGhpcy5fZm9udC5fZ2V0QmFzZUdseXBoKHJlYy5naWQpO1xuXG4gICAgICAgIGxheWVycy5wdXNoKG5ldyBDT0xSTGF5ZXIoZywgY29sb3IpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ09MUkdseXBoO1xufShHbHlwaCk7XG5cbnZhciBUVVBMRVNfU0hBUkVfUE9JTlRfTlVNQkVSUyA9IDB4ODAwMDtcbnZhciBUVVBMRV9DT1VOVF9NQVNLID0gMHgwZmZmO1xudmFyIEVNQkVEREVEX1RVUExFX0NPT1JEID0gMHg4MDAwO1xudmFyIElOVEVSTUVESUFURV9UVVBMRSA9IDB4NDAwMDtcbnZhciBQUklWQVRFX1BPSU5UX05VTUJFUlMgPSAweDIwMDA7XG52YXIgVFVQTEVfSU5ERVhfTUFTSyA9IDB4MGZmZjtcbnZhciBQT0lOVFNfQVJFX1dPUkRTID0gMHg4MDtcbnZhciBQT0lOVF9SVU5fQ09VTlRfTUFTSyA9IDB4N2Y7XG52YXIgREVMVEFTX0FSRV9aRVJPID0gMHg4MDtcbnZhciBERUxUQVNfQVJFX1dPUkRTID0gMHg0MDtcbnZhciBERUxUQV9SVU5fQ09VTlRfTUFTSyA9IDB4M2Y7XG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdHJhbnNmb3JtcyBUcnVlVHlwZSBnbHlwaHMgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIGZyb21cbiAqIHRoZSBBcHBsZSBBZHZhbmNlZCBUeXBvZ3JhcGh5IHZhcmlhdGlvbiB0YWJsZXMgKGZ2YXIsIGd2YXIsIGFuZCBhdmFyKS5cbiAqIFRoZXNlIHRhYmxlcyBhbGxvdyBpbmZpbml0ZSBhZGp1c3RtZW50cyB0byBnbHlwaCB3ZWlnaHQsIHdpZHRoLCBzbGFudCxcbiAqIGFuZCBvcHRpY2FsIHNpemUgd2l0aG91dCB0aGUgZGVzaWduZXIgbmVlZGluZyB0byBzcGVjaWZ5IGV2ZXJ5IGV4YWN0IHN0eWxlLlxuICpcbiAqIEFwcGxlJ3MgZG9jdW1lbnRhdGlvbiBmb3IgdGhlc2UgdGFibGVzIGlzIG5vdCBncmVhdCwgc28gdGhhbmtzIHRvIHRoZVxuICogRnJlZXR5cGUgcHJvamVjdCBmb3IgZmlndXJpbmcgbXVjaCBvZiB0aGlzIG91dC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBHbHlwaFZhcmlhdGlvblByb2Nlc3NvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEdseXBoVmFyaWF0aW9uUHJvY2Vzc29yKGZvbnQsIGNvb3Jkcykge1xuICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgdGhpcy5ub3JtYWxpemVkQ29vcmRzID0gdGhpcy5ub3JtYWxpemVDb29yZHMoY29vcmRzKTtcbiAgICB0aGlzLmJsZW5kVmVjdG9ycyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBHbHlwaFZhcmlhdGlvblByb2Nlc3Nvci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLm5vcm1hbGl6ZUNvb3JkcyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvb3Jkcyhjb29yZHMpIHtcbiAgICAvLyB0aGUgZGVmYXVsdCBtYXBwaW5nIGlzIGxpbmVhciBhbG9uZyBlYWNoIGF4aXMsIGluIHR3byBzZWdtZW50czpcbiAgICAvLyBmcm9tIHRoZSBtaW5WYWx1ZSB0byBkZWZhdWx0VmFsdWUsIGFuZCBmcm9tIGRlZmF1bHRWYWx1ZSB0byBtYXhWYWx1ZS5cbiAgICB2YXIgbm9ybWFsaXplZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZvbnQuZnZhci5heGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYXhpcyA9IHRoaXMuZm9udC5mdmFyLmF4aXNbaV07XG5cbiAgICAgIGlmIChjb29yZHNbaV0gPCBheGlzLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBub3JtYWxpemVkLnB1c2goKGNvb3Jkc1tpXSAtIGF4aXMuZGVmYXVsdFZhbHVlICsgTnVtYmVyLkVQU0lMT04pIC8gKGF4aXMuZGVmYXVsdFZhbHVlIC0gYXhpcy5taW5WYWx1ZSArIE51bWJlci5FUFNJTE9OKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub3JtYWxpemVkLnB1c2goKGNvb3Jkc1tpXSAtIGF4aXMuZGVmYXVsdFZhbHVlICsgTnVtYmVyLkVQU0lMT04pIC8gKGF4aXMubWF4VmFsdWUgLSBheGlzLmRlZmF1bHRWYWx1ZSArIE51bWJlci5FUFNJTE9OKSk7XG4gICAgICB9XG4gICAgfSAvLyBpZiB0aGVyZSBpcyBhbiBhdmFyIHRhYmxlLCB0aGUgbm9ybWFsaXplZCB2YWx1ZSBpcyBjYWxjdWxhdGVkXG4gICAgLy8gYnkgaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHRoZSB0d28gbmVhcmVzdCBtYXBwZWQgdmFsdWVzLlxuXG5cbiAgICBpZiAodGhpcy5mb250LmF2YXIpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mb250LmF2YXIuc2VnbWVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2VnbWVudCA9IHRoaXMuZm9udC5hdmFyLnNlZ21lbnRbaV07XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWdtZW50LmNvcnJlc3BvbmRlbmNlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIHBhaXIgPSBzZWdtZW50LmNvcnJlc3BvbmRlbmNlW2pdO1xuXG4gICAgICAgICAgaWYgKGogPj0gMSAmJiBub3JtYWxpemVkW2ldIDwgcGFpci5mcm9tQ29vcmQpIHtcbiAgICAgICAgICAgIHZhciBwcmV2ID0gc2VnbWVudC5jb3JyZXNwb25kZW5jZVtqIC0gMV07XG4gICAgICAgICAgICBub3JtYWxpemVkW2ldID0gKChub3JtYWxpemVkW2ldIC0gcHJldi5mcm9tQ29vcmQpICogKHBhaXIudG9Db29yZCAtIHByZXYudG9Db29yZCkgKyBOdW1iZXIuRVBTSUxPTikgLyAocGFpci5mcm9tQ29vcmQgLSBwcmV2LmZyb21Db29yZCArIE51bWJlci5FUFNJTE9OKSArIHByZXYudG9Db29yZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9O1xuXG4gIF9wcm90by50cmFuc2Zvcm1Qb2ludHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludHMoZ2lkLCBnbHlwaFBvaW50cykge1xuICAgIGlmICghdGhpcy5mb250LmZ2YXIgfHwgIXRoaXMuZm9udC5ndmFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGd2YXIgPSB0aGlzLmZvbnQuZ3ZhcjtcblxuICAgIGlmIChnaWQgPj0gZ3Zhci5nbHlwaENvdW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldCA9IGd2YXIub2Zmc2V0c1tnaWRdO1xuXG4gICAgaWYgKG9mZnNldCA9PT0gZ3Zhci5vZmZzZXRzW2dpZCArIDFdKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBSZWFkIHRoZSBndmFyIGRhdGEgZm9yIHRoaXMgZ2x5cGhcblxuXG4gICAgdmFyIHN0cmVhbSA9IHRoaXMuZm9udC5zdHJlYW07XG4gICAgc3RyZWFtLnBvcyA9IG9mZnNldDtcblxuICAgIGlmIChzdHJlYW0ucG9zID49IHN0cmVhbS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdHVwbGVDb3VudCA9IHN0cmVhbS5yZWFkVUludDE2QkUoKTtcbiAgICB2YXIgb2Zmc2V0VG9EYXRhID0gb2Zmc2V0ICsgc3RyZWFtLnJlYWRVSW50MTZCRSgpO1xuXG4gICAgaWYgKHR1cGxlQ291bnQgJiBUVVBMRVNfU0hBUkVfUE9JTlRfTlVNQkVSUykge1xuICAgICAgdmFyIGhlcmUgPSBzdHJlYW0ucG9zO1xuICAgICAgc3RyZWFtLnBvcyA9IG9mZnNldFRvRGF0YTtcbiAgICAgIHZhciBzaGFyZWRQb2ludHMgPSB0aGlzLmRlY29kZVBvaW50cygpO1xuICAgICAgb2Zmc2V0VG9EYXRhID0gc3RyZWFtLnBvcztcbiAgICAgIHN0cmVhbS5wb3MgPSBoZXJlO1xuICAgIH1cblxuICAgIHZhciBvcmlnUG9pbnRzID0gZ2x5cGhQb2ludHMubWFwKGZ1bmN0aW9uIChwdCkge1xuICAgICAgcmV0dXJuIHB0LmNvcHkoKTtcbiAgICB9KTtcbiAgICB0dXBsZUNvdW50ICY9IFRVUExFX0NPVU5UX01BU0s7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR1cGxlQ291bnQ7IGkrKykge1xuICAgICAgdmFyIHR1cGxlRGF0YVNpemUgPSBzdHJlYW0ucmVhZFVJbnQxNkJFKCk7XG4gICAgICB2YXIgdHVwbGVJbmRleCA9IHN0cmVhbS5yZWFkVUludDE2QkUoKTtcblxuICAgICAgaWYgKHR1cGxlSW5kZXggJiBFTUJFRERFRF9UVVBMRV9DT09SRCkge1xuICAgICAgICB2YXIgdHVwbGVDb29yZHMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBhID0gMDsgYSA8IGd2YXIuYXhpc0NvdW50OyBhKyspIHtcbiAgICAgICAgICB0dXBsZUNvb3Jkcy5wdXNoKHN0cmVhbS5yZWFkSW50MTZCRSgpIC8gMTYzODQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKHR1cGxlSW5kZXggJiBUVVBMRV9JTkRFWF9NQVNLKSA+PSBndmFyLmdsb2JhbENvb3JkQ291bnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZ3ZhciB0YWJsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHR1cGxlQ29vcmRzID0gZ3Zhci5nbG9iYWxDb29yZHNbdHVwbGVJbmRleCAmIFRVUExFX0lOREVYX01BU0tdO1xuICAgICAgfVxuXG4gICAgICBpZiAodHVwbGVJbmRleCAmIElOVEVSTUVESUFURV9UVVBMRSkge1xuICAgICAgICB2YXIgc3RhcnRDb29yZHMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBfYSA9IDA7IF9hIDwgZ3Zhci5heGlzQ291bnQ7IF9hKyspIHtcbiAgICAgICAgICBzdGFydENvb3Jkcy5wdXNoKHN0cmVhbS5yZWFkSW50MTZCRSgpIC8gMTYzODQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGVuZENvb3JkcyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIF9hMiA9IDA7IF9hMiA8IGd2YXIuYXhpc0NvdW50OyBfYTIrKykge1xuICAgICAgICAgIGVuZENvb3Jkcy5wdXNoKHN0cmVhbS5yZWFkSW50MTZCRSgpIC8gMTYzODQpO1xuICAgICAgICB9XG4gICAgICB9IC8vIEdldCB0aGUgZmFjdG9yIGF0IHdoaWNoIHRvIGFwcGx5IHRoaXMgdHVwbGVcblxuXG4gICAgICB2YXIgZmFjdG9yID0gdGhpcy50dXBsZUZhY3Rvcih0dXBsZUluZGV4LCB0dXBsZUNvb3Jkcywgc3RhcnRDb29yZHMsIGVuZENvb3Jkcyk7XG5cbiAgICAgIGlmIChmYWN0b3IgPT09IDApIHtcbiAgICAgICAgb2Zmc2V0VG9EYXRhICs9IHR1cGxlRGF0YVNpemU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVyZSA9IHN0cmVhbS5wb3M7XG4gICAgICBzdHJlYW0ucG9zID0gb2Zmc2V0VG9EYXRhO1xuXG4gICAgICBpZiAodHVwbGVJbmRleCAmIFBSSVZBVEVfUE9JTlRfTlVNQkVSUykge1xuICAgICAgICB2YXIgcG9pbnRzID0gdGhpcy5kZWNvZGVQb2ludHMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwb2ludHMgPSBzaGFyZWRQb2ludHM7XG4gICAgICB9IC8vIHBvaW50cy5sZW5ndGggPSAwIG1lYW5zIHRoZXJlIGFyZSBkZWx0YXMgZm9yIGFsbCBwb2ludHNcblxuXG4gICAgICB2YXIgblBvaW50cyA9IHBvaW50cy5sZW5ndGggPT09IDAgPyBnbHlwaFBvaW50cy5sZW5ndGggOiBwb2ludHMubGVuZ3RoO1xuICAgICAgdmFyIHhEZWx0YXMgPSB0aGlzLmRlY29kZURlbHRhcyhuUG9pbnRzKTtcbiAgICAgIHZhciB5RGVsdGFzID0gdGhpcy5kZWNvZGVEZWx0YXMoblBvaW50cyk7XG5cbiAgICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGFsbCBwb2ludHNcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGdseXBoUG9pbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIHZhciBwb2ludCA9IGdseXBoUG9pbnRzW19pXTtcbiAgICAgICAgICBwb2ludC54ICs9IE1hdGgucm91bmQoeERlbHRhc1tfaV0gKiBmYWN0b3IpO1xuICAgICAgICAgIHBvaW50LnkgKz0gTWF0aC5yb3VuZCh5RGVsdGFzW19pXSAqIGZhY3Rvcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvdXRQb2ludHMgPSBvcmlnUG9pbnRzLm1hcChmdW5jdGlvbiAocHQpIHtcbiAgICAgICAgICByZXR1cm4gcHQuY29weSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGhhc0RlbHRhID0gZ2x5cGhQb2ludHMubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHBvaW50cy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICAgICAgdmFyIGlkeCA9IHBvaW50c1tfaTJdO1xuXG4gICAgICAgICAgaWYgKGlkeCA8IGdseXBoUG9pbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIF9wb2ludCA9IG91dFBvaW50c1tpZHhdO1xuICAgICAgICAgICAgaGFzRGVsdGFbaWR4XSA9IHRydWU7XG4gICAgICAgICAgICBfcG9pbnQueCArPSBNYXRoLnJvdW5kKHhEZWx0YXNbX2kyXSAqIGZhY3Rvcik7XG4gICAgICAgICAgICBfcG9pbnQueSArPSBNYXRoLnJvdW5kKHlEZWx0YXNbX2kyXSAqIGZhY3Rvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnRlcnBvbGF0ZU1pc3NpbmdEZWx0YXMob3V0UG9pbnRzLCBvcmlnUG9pbnRzLCBoYXNEZWx0YSk7XG5cbiAgICAgICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgZ2x5cGhQb2ludHMubGVuZ3RoOyBfaTMrKykge1xuICAgICAgICAgIHZhciBkZWx0YVggPSBvdXRQb2ludHNbX2kzXS54IC0gb3JpZ1BvaW50c1tfaTNdLng7XG4gICAgICAgICAgdmFyIGRlbHRhWSA9IG91dFBvaW50c1tfaTNdLnkgLSBvcmlnUG9pbnRzW19pM10ueTtcbiAgICAgICAgICBnbHlwaFBvaW50c1tfaTNdLnggKz0gZGVsdGFYO1xuICAgICAgICAgIGdseXBoUG9pbnRzW19pM10ueSArPSBkZWx0YVk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb2Zmc2V0VG9EYXRhICs9IHR1cGxlRGF0YVNpemU7XG4gICAgICBzdHJlYW0ucG9zID0gaGVyZTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmRlY29kZVBvaW50cyA9IGZ1bmN0aW9uIGRlY29kZVBvaW50cygpIHtcbiAgICB2YXIgc3RyZWFtID0gdGhpcy5mb250LnN0cmVhbTtcbiAgICB2YXIgY291bnQgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG5cbiAgICBpZiAoY291bnQgJiBQT0lOVFNfQVJFX1dPUkRTKSB7XG4gICAgICBjb3VudCA9IChjb3VudCAmIFBPSU5UX1JVTl9DT1VOVF9NQVNLKSA8PCA4IHwgc3RyZWFtLnJlYWRVSW50OCgpO1xuICAgIH1cblxuICAgIHZhciBwb2ludHMgPSBuZXcgVWludDE2QXJyYXkoY291bnQpO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcG9pbnQgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBjb3VudCkge1xuICAgICAgdmFyIHJ1biA9IHN0cmVhbS5yZWFkVUludDgoKTtcbiAgICAgIHZhciBydW5Db3VudCA9IChydW4gJiBQT0lOVF9SVU5fQ09VTlRfTUFTSykgKyAxO1xuICAgICAgdmFyIGZuID0gcnVuICYgUE9JTlRTX0FSRV9XT1JEUyA/IHN0cmVhbS5yZWFkVUludDE2IDogc3RyZWFtLnJlYWRVSW50ODtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBydW5Db3VudCAmJiBpIDwgY291bnQ7IGorKykge1xuICAgICAgICBwb2ludCArPSBmbi5jYWxsKHN0cmVhbSk7XG4gICAgICAgIHBvaW50c1tpKytdID0gcG9pbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvaW50cztcbiAgfTtcblxuICBfcHJvdG8uZGVjb2RlRGVsdGFzID0gZnVuY3Rpb24gZGVjb2RlRGVsdGFzKGNvdW50KSB7XG4gICAgdmFyIHN0cmVhbSA9IHRoaXMuZm9udC5zdHJlYW07XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBkZWx0YXMgPSBuZXcgSW50MTZBcnJheShjb3VudCk7XG5cbiAgICB3aGlsZSAoaSA8IGNvdW50KSB7XG4gICAgICB2YXIgcnVuID0gc3RyZWFtLnJlYWRVSW50OCgpO1xuICAgICAgdmFyIHJ1bkNvdW50ID0gKHJ1biAmIERFTFRBX1JVTl9DT1VOVF9NQVNLKSArIDE7XG5cbiAgICAgIGlmIChydW4gJiBERUxUQVNfQVJFX1pFUk8pIHtcbiAgICAgICAgaSArPSBydW5Db3VudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBmbiA9IHJ1biAmIERFTFRBU19BUkVfV09SRFMgPyBzdHJlYW0ucmVhZEludDE2QkUgOiBzdHJlYW0ucmVhZEludDg7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBydW5Db3VudCAmJiBpIDwgY291bnQ7IGorKykge1xuICAgICAgICAgIGRlbHRhc1tpKytdID0gZm4uY2FsbChzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbHRhcztcbiAgfTtcblxuICBfcHJvdG8udHVwbGVGYWN0b3IgPSBmdW5jdGlvbiB0dXBsZUZhY3Rvcih0dXBsZUluZGV4LCB0dXBsZUNvb3Jkcywgc3RhcnRDb29yZHMsIGVuZENvb3Jkcykge1xuICAgIHZhciBub3JtYWxpemVkID0gdGhpcy5ub3JtYWxpemVkQ29vcmRzO1xuICAgIHZhciBndmFyID0gdGhpcy5mb250Lmd2YXI7XG4gICAgdmFyIGZhY3RvciA9IDE7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGd2YXIuYXhpc0NvdW50OyBpKyspIHtcbiAgICAgIGlmICh0dXBsZUNvb3Jkc1tpXSA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vcm1hbGl6ZWRbaV0gPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGlmICgodHVwbGVJbmRleCAmIElOVEVSTUVESUFURV9UVVBMRSkgPT09IDApIHtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRbaV0gPCBNYXRoLm1pbigwLCB0dXBsZUNvb3Jkc1tpXSkgfHwgbm9ybWFsaXplZFtpXSA+IE1hdGgubWF4KDAsIHR1cGxlQ29vcmRzW2ldKSkge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgZmFjdG9yID0gKGZhY3RvciAqIG5vcm1hbGl6ZWRbaV0gKyBOdW1iZXIuRVBTSUxPTikgLyAodHVwbGVDb29yZHNbaV0gKyBOdW1iZXIuRVBTSUxPTik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobm9ybWFsaXplZFtpXSA8IHN0YXJ0Q29vcmRzW2ldIHx8IG5vcm1hbGl6ZWRbaV0gPiBlbmRDb29yZHNbaV0pIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkW2ldIDwgdHVwbGVDb29yZHNbaV0pIHtcbiAgICAgICAgICBmYWN0b3IgPSBmYWN0b3IgKiAobm9ybWFsaXplZFtpXSAtIHN0YXJ0Q29vcmRzW2ldICsgTnVtYmVyLkVQU0lMT04pIC8gKHR1cGxlQ29vcmRzW2ldIC0gc3RhcnRDb29yZHNbaV0gKyBOdW1iZXIuRVBTSUxPTik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmFjdG9yID0gZmFjdG9yICogKGVuZENvb3Jkc1tpXSAtIG5vcm1hbGl6ZWRbaV0gKyBOdW1iZXIuRVBTSUxPTikgLyAoZW5kQ29vcmRzW2ldIC0gdHVwbGVDb29yZHNbaV0gKyBOdW1iZXIuRVBTSUxPTik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFjdG9yO1xuICB9IC8vIEludGVycG9sYXRlcyBwb2ludHMgd2l0aG91dCBkZWx0YSB2YWx1ZXMuXG4gIC8vIE5lZWRlZCBmb3IgdGhlIMOYIGFuZCBRIGdseXBocyBpbiBTa2lhLlxuICAvLyBBbGdvcml0aG0gZnJvbSBGcmVldHlwZS5cbiAgO1xuXG4gIF9wcm90by5pbnRlcnBvbGF0ZU1pc3NpbmdEZWx0YXMgPSBmdW5jdGlvbiBpbnRlcnBvbGF0ZU1pc3NpbmdEZWx0YXMocG9pbnRzLCBpblBvaW50cywgaGFzRGVsdGEpIHtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwb2ludCA9IDA7XG5cbiAgICB3aGlsZSAocG9pbnQgPCBwb2ludHMubGVuZ3RoKSB7XG4gICAgICB2YXIgZmlyc3RQb2ludCA9IHBvaW50OyAvLyBmaW5kIHRoZSBlbmQgcG9pbnQgb2YgdGhlIGNvbnRvdXJcblxuICAgICAgdmFyIGVuZFBvaW50ID0gcG9pbnQ7XG4gICAgICB2YXIgcHQgPSBwb2ludHNbZW5kUG9pbnRdO1xuXG4gICAgICB3aGlsZSAoIXB0LmVuZENvbnRvdXIpIHtcbiAgICAgICAgcHQgPSBwb2ludHNbKytlbmRQb2ludF07XG4gICAgICB9IC8vIGZpbmQgdGhlIGZpcnN0IHBvaW50IHRoYXQgaGFzIGEgZGVsdGFcblxuXG4gICAgICB3aGlsZSAocG9pbnQgPD0gZW5kUG9pbnQgJiYgIWhhc0RlbHRhW3BvaW50XSkge1xuICAgICAgICBwb2ludCsrO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnQgPiBlbmRQb2ludCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpcnN0RGVsdGEgPSBwb2ludDtcbiAgICAgIHZhciBjdXJEZWx0YSA9IHBvaW50O1xuICAgICAgcG9pbnQrKztcblxuICAgICAgd2hpbGUgKHBvaW50IDw9IGVuZFBvaW50KSB7XG4gICAgICAgIC8vIGZpbmQgdGhlIG5leHQgcG9pbnQgd2l0aCBhIGRlbHRhLCBhbmQgaW50ZXJwb2xhdGUgaW50ZXJtZWRpYXRlIHBvaW50c1xuICAgICAgICBpZiAoaGFzRGVsdGFbcG9pbnRdKSB7XG4gICAgICAgICAgdGhpcy5kZWx0YUludGVycG9sYXRlKGN1ckRlbHRhICsgMSwgcG9pbnQgLSAxLCBjdXJEZWx0YSwgcG9pbnQsIGluUG9pbnRzLCBwb2ludHMpO1xuICAgICAgICAgIGN1ckRlbHRhID0gcG9pbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBwb2ludCsrO1xuICAgICAgfSAvLyBzaGlmdCBjb250b3VyIGlmIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBkZWx0YVxuXG5cbiAgICAgIGlmIChjdXJEZWx0YSA9PT0gZmlyc3REZWx0YSkge1xuICAgICAgICB0aGlzLmRlbHRhU2hpZnQoZmlyc3RQb2ludCwgZW5kUG9pbnQsIGN1ckRlbHRhLCBpblBvaW50cywgcG9pbnRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgaGFuZGxlIHRoZSByZW1haW5pbmcgcG9pbnRzIGF0IHRoZSBlbmQgYW5kIGJlZ2lubmluZyBvZiB0aGUgY29udG91clxuICAgICAgICB0aGlzLmRlbHRhSW50ZXJwb2xhdGUoY3VyRGVsdGEgKyAxLCBlbmRQb2ludCwgY3VyRGVsdGEsIGZpcnN0RGVsdGEsIGluUG9pbnRzLCBwb2ludHMpO1xuXG4gICAgICAgIGlmIChmaXJzdERlbHRhID4gMCkge1xuICAgICAgICAgIHRoaXMuZGVsdGFJbnRlcnBvbGF0ZShmaXJzdFBvaW50LCBmaXJzdERlbHRhIC0gMSwgY3VyRGVsdGEsIGZpcnN0RGVsdGEsIGluUG9pbnRzLCBwb2ludHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBvaW50ID0gZW5kUG9pbnQgKyAxO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZGVsdGFJbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uIGRlbHRhSW50ZXJwb2xhdGUocDEsIHAyLCByZWYxLCByZWYyLCBpblBvaW50cywgb3V0UG9pbnRzKSB7XG4gICAgaWYgKHAxID4gcDIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaXRlcmFibGUgPSBbJ3gnLCAneSddO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGsgPSBpdGVyYWJsZVtpXTtcblxuICAgICAgaWYgKGluUG9pbnRzW3JlZjFdW2tdID4gaW5Qb2ludHNbcmVmMl1ba10pIHtcbiAgICAgICAgdmFyIHAgPSByZWYxO1xuICAgICAgICByZWYxID0gcmVmMjtcbiAgICAgICAgcmVmMiA9IHA7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbjEgPSBpblBvaW50c1tyZWYxXVtrXTtcbiAgICAgIHZhciBpbjIgPSBpblBvaW50c1tyZWYyXVtrXTtcbiAgICAgIHZhciBvdXQxID0gb3V0UG9pbnRzW3JlZjFdW2tdO1xuICAgICAgdmFyIG91dDIgPSBvdXRQb2ludHNbcmVmMl1ba107IC8vIElmIHRoZSByZWZlcmVuY2UgcG9pbnRzIGhhdmUgdGhlIHNhbWUgY29vcmRpbmF0ZSBidXQgZGlmZmVyZW50XG4gICAgICAvLyBkZWx0YSwgaW5mZXJyZWQgZGVsdGEgaXMgemVyby4gIE90aGVyd2lzZSBpbnRlcnBvbGF0ZS5cblxuICAgICAgaWYgKGluMSAhPT0gaW4yIHx8IG91dDEgPT09IG91dDIpIHtcbiAgICAgICAgdmFyIHNjYWxlID0gaW4xID09PSBpbjIgPyAwIDogKG91dDIgLSBvdXQxKSAvIChpbjIgLSBpbjEpO1xuXG4gICAgICAgIGZvciAodmFyIF9wID0gcDE7IF9wIDw9IHAyOyBfcCsrKSB7XG4gICAgICAgICAgdmFyIG91dCA9IGluUG9pbnRzW19wXVtrXTtcblxuICAgICAgICAgIGlmIChvdXQgPD0gaW4xKSB7XG4gICAgICAgICAgICBvdXQgKz0gb3V0MSAtIGluMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG91dCA+PSBpbjIpIHtcbiAgICAgICAgICAgIG91dCArPSBvdXQyIC0gaW4yO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQxICsgKG91dCAtIGluMSkgKiBzY2FsZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvdXRQb2ludHNbX3BdW2tdID0gb3V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5kZWx0YVNoaWZ0ID0gZnVuY3Rpb24gZGVsdGFTaGlmdChwMSwgcDIsIHJlZiwgaW5Qb2ludHMsIG91dFBvaW50cykge1xuICAgIHZhciBkZWx0YVggPSBvdXRQb2ludHNbcmVmXS54IC0gaW5Qb2ludHNbcmVmXS54O1xuICAgIHZhciBkZWx0YVkgPSBvdXRQb2ludHNbcmVmXS55IC0gaW5Qb2ludHNbcmVmXS55O1xuXG4gICAgaWYgKGRlbHRhWCA9PT0gMCAmJiBkZWx0YVkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwID0gcDE7IHAgPD0gcDI7IHArKykge1xuICAgICAgaWYgKHAgIT09IHJlZikge1xuICAgICAgICBvdXRQb2ludHNbcF0ueCArPSBkZWx0YVg7XG4gICAgICAgIG91dFBvaW50c1twXS55ICs9IGRlbHRhWTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmdldEFkdmFuY2VBZGp1c3RtZW50ID0gZnVuY3Rpb24gZ2V0QWR2YW5jZUFkanVzdG1lbnQoZ2lkLCB0YWJsZSkge1xuICAgIHZhciBvdXRlckluZGV4LCBpbm5lckluZGV4O1xuXG4gICAgaWYgKHRhYmxlLmFkdmFuY2VXaWR0aE1hcHBpbmcpIHtcbiAgICAgIHZhciBpZHggPSBnaWQ7XG5cbiAgICAgIGlmIChpZHggPj0gdGFibGUuYWR2YW5jZVdpZHRoTWFwcGluZy5tYXBDb3VudCkge1xuICAgICAgICBpZHggPSB0YWJsZS5hZHZhbmNlV2lkdGhNYXBwaW5nLm1hcENvdW50IC0gMTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVudHJ5Rm9ybWF0ID0gdGFibGUuYWR2YW5jZVdpZHRoTWFwcGluZy5lbnRyeUZvcm1hdDtcbiAgICAgIHZhciBfdGFibGUkYWR2YW5jZVdpZHRoTWEgPSB0YWJsZS5hZHZhbmNlV2lkdGhNYXBwaW5nLm1hcERhdGFbaWR4XTtcbiAgICAgIG91dGVySW5kZXggPSBfdGFibGUkYWR2YW5jZVdpZHRoTWEub3V0ZXJJbmRleDtcbiAgICAgIGlubmVySW5kZXggPSBfdGFibGUkYWR2YW5jZVdpZHRoTWEuaW5uZXJJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ZXJJbmRleCA9IDA7XG4gICAgICBpbm5lckluZGV4ID0gZ2lkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldERlbHRhKHRhYmxlLml0ZW1WYXJpYXRpb25TdG9yZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCk7XG4gIH0gLy8gU2VlIHBzZXVkbyBjb2RlIGZyb20gYEZvbnQgVmFyaWF0aW9ucyBPdmVydmlldydcbiAgLy8gaW4gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uXG4gIDtcblxuICBfcHJvdG8uZ2V0RGVsdGEgPSBmdW5jdGlvbiBnZXREZWx0YShpdGVtU3RvcmUsIG91dGVySW5kZXgsIGlubmVySW5kZXgpIHtcbiAgICBpZiAob3V0ZXJJbmRleCA+PSBpdGVtU3RvcmUuaXRlbVZhcmlhdGlvbkRhdGEubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICB2YXIgdmFyRGF0YSA9IGl0ZW1TdG9yZS5pdGVtVmFyaWF0aW9uRGF0YVtvdXRlckluZGV4XTtcblxuICAgIGlmIChpbm5lckluZGV4ID49IHZhckRhdGEuZGVsdGFTZXRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgdmFyIGRlbHRhU2V0ID0gdmFyRGF0YS5kZWx0YVNldHNbaW5uZXJJbmRleF07XG4gICAgdmFyIGJsZW5kVmVjdG9yID0gdGhpcy5nZXRCbGVuZFZlY3RvcihpdGVtU3RvcmUsIG91dGVySW5kZXgpO1xuICAgIHZhciBuZXRBZGp1c3RtZW50ID0gMDtcblxuICAgIGZvciAodmFyIG1hc3RlciA9IDA7IG1hc3RlciA8IHZhckRhdGEucmVnaW9uSW5kZXhDb3VudDsgbWFzdGVyKyspIHtcbiAgICAgIG5ldEFkanVzdG1lbnQgKz0gZGVsdGFTZXQuZGVsdGFzW21hc3Rlcl0gKiBibGVuZFZlY3RvclttYXN0ZXJdO1xuICAgIH1cblxuICAgIHJldHVybiBuZXRBZGp1c3RtZW50O1xuICB9O1xuXG4gIF9wcm90by5nZXRCbGVuZFZlY3RvciA9IGZ1bmN0aW9uIGdldEJsZW5kVmVjdG9yKGl0ZW1TdG9yZSwgb3V0ZXJJbmRleCkge1xuICAgIHZhciB2YXJEYXRhID0gaXRlbVN0b3JlLml0ZW1WYXJpYXRpb25EYXRhW291dGVySW5kZXhdO1xuXG4gICAgaWYgKHRoaXMuYmxlbmRWZWN0b3JzLmhhcyh2YXJEYXRhKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYmxlbmRWZWN0b3JzLmdldCh2YXJEYXRhKTtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZENvb3JkcyA9IHRoaXMubm9ybWFsaXplZENvb3JkcztcbiAgICB2YXIgYmxlbmRWZWN0b3IgPSBbXTsgLy8gb3V0ZXIgbG9vcCBzdGVwcyB0aHJvdWdoIG1hc3RlciBkZXNpZ25zIHRvIGJlIGJsZW5kZWRcblxuICAgIGZvciAodmFyIG1hc3RlciA9IDA7IG1hc3RlciA8IHZhckRhdGEucmVnaW9uSW5kZXhDb3VudDsgbWFzdGVyKyspIHtcbiAgICAgIHZhciBzY2FsYXIgPSAxO1xuICAgICAgdmFyIHJlZ2lvbkluZGV4ID0gdmFyRGF0YS5yZWdpb25JbmRleGVzW21hc3Rlcl07XG4gICAgICB2YXIgYXhlcyA9IGl0ZW1TdG9yZS52YXJpYXRpb25SZWdpb25MaXN0LnZhcmlhdGlvblJlZ2lvbnNbcmVnaW9uSW5kZXhdOyAvLyBpbm5lciBsb29wIHN0ZXBzIHRocm91Z2ggYXhlcyBpbiB0aGlzIHJlZ2lvblxuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGF4ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGF4aXMgPSBheGVzW2pdO1xuICAgICAgICB2YXIgYXhpc1NjYWxhciA9IHZvaWQgMDsgLy8gY29tcHV0ZSB0aGUgc2NhbGFyIGNvbnRyaWJ1dGlvbiBvZiB0aGlzIGF4aXNcbiAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2VzXG5cbiAgICAgICAgaWYgKGF4aXMuc3RhcnRDb29yZCA+IGF4aXMucGVha0Nvb3JkIHx8IGF4aXMucGVha0Nvb3JkID4gYXhpcy5lbmRDb29yZCkge1xuICAgICAgICAgIGF4aXNTY2FsYXIgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKGF4aXMuc3RhcnRDb29yZCA8IDAgJiYgYXhpcy5lbmRDb29yZCA+IDAgJiYgYXhpcy5wZWFrQ29vcmQgIT09IDApIHtcbiAgICAgICAgICBheGlzU2NhbGFyID0gMTsgLy8gcGVhayBvZiAwIG1lYW5zIGlnbm9yZSB0aGlzIGF4aXNcbiAgICAgICAgfSBlbHNlIGlmIChheGlzLnBlYWtDb29yZCA9PT0gMCkge1xuICAgICAgICAgIGF4aXNTY2FsYXIgPSAxOyAvLyBpZ25vcmUgdGhpcyByZWdpb24gaWYgY29vcmRzIGFyZSBvdXQgb2YgcmFuZ2VcbiAgICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkQ29vcmRzW2pdIDwgYXhpcy5zdGFydENvb3JkIHx8IG5vcm1hbGl6ZWRDb29yZHNbal0gPiBheGlzLmVuZENvb3JkKSB7XG4gICAgICAgICAgYXhpc1NjYWxhciA9IDA7IC8vIGNhbGN1bGF0ZSBhIHByb3BvcnRpb25hbCBmYWN0b3JcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobm9ybWFsaXplZENvb3Jkc1tqXSA9PT0gYXhpcy5wZWFrQ29vcmQpIHtcbiAgICAgICAgICAgIGF4aXNTY2FsYXIgPSAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZENvb3Jkc1tqXSA8IGF4aXMucGVha0Nvb3JkKSB7XG4gICAgICAgICAgICBheGlzU2NhbGFyID0gKG5vcm1hbGl6ZWRDb29yZHNbal0gLSBheGlzLnN0YXJ0Q29vcmQgKyBOdW1iZXIuRVBTSUxPTikgLyAoYXhpcy5wZWFrQ29vcmQgLSBheGlzLnN0YXJ0Q29vcmQgKyBOdW1iZXIuRVBTSUxPTik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF4aXNTY2FsYXIgPSAoYXhpcy5lbmRDb29yZCAtIG5vcm1hbGl6ZWRDb29yZHNbal0gKyBOdW1iZXIuRVBTSUxPTikgLyAoYXhpcy5lbmRDb29yZCAtIGF4aXMucGVha0Nvb3JkICsgTnVtYmVyLkVQU0lMT04pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyB0YWtlIHByb2R1Y3Qgb2YgYWxsIHRoZSBheGlzIHNjYWxhcnNcblxuXG4gICAgICAgIHNjYWxhciAqPSBheGlzU2NhbGFyO1xuICAgICAgfVxuXG4gICAgICBibGVuZFZlY3RvclttYXN0ZXJdID0gc2NhbGFyO1xuICAgIH1cblxuICAgIHRoaXMuYmxlbmRWZWN0b3JzLnNldCh2YXJEYXRhLCBibGVuZFZlY3Rvcik7XG4gICAgcmV0dXJuIGJsZW5kVmVjdG9yO1xuICB9O1xuXG4gIHJldHVybiBHbHlwaFZhcmlhdGlvblByb2Nlc3Nvcjtcbn0oKTtcblxudmFyIGNsb25lXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4gIHZhciBjbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDbG9uZXMgKGNvcGllcykgYW4gT2JqZWN0IHVzaW5nIGRlZXAgY29weWluZy5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgY2lyY3VsYXIgcmVmZXJlbmNlcyBieSBkZWZhdWx0LCBidXQgaWYgeW91IGFyZSBjZXJ0YWluXG4gICAgICogdGhlcmUgYXJlIG5vIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4geW91ciBvYmplY3QsIHlvdSBjYW4gc2F2ZSBzb21lIENQVSB0aW1lXG4gICAgICogYnkgY2FsbGluZyBjbG9uZShvYmosIGZhbHNlKS5cbiAgICAgKlxuICAgICAqIENhdXRpb246IGlmIGBjaXJjdWxhcmAgaXMgZmFsc2UgYW5kIGBwYXJlbnRgIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZXMsXG4gICAgICogeW91ciBwcm9ncmFtIG1heSBlbnRlciBhbiBpbmZpbml0ZSBsb29wIGFuZCBjcmFzaC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBgcGFyZW50YCAtIHRoZSBvYmplY3QgdG8gYmUgY2xvbmVkXG4gICAgICogQHBhcmFtIGBjaXJjdWxhcmAgLSBzZXQgdG8gdHJ1ZSBpZiB0aGUgb2JqZWN0IHRvIGJlIGNsb25lZCBtYXkgY29udGFpblxuICAgICAqICAgIGNpcmN1bGFyIHJlZmVyZW5jZXMuIChvcHRpb25hbCAtIHRydWUgYnkgZGVmYXVsdClcbiAgICAgKiBAcGFyYW0gYGRlcHRoYCAtIHNldCB0byBhIG51bWJlciBpZiB0aGUgb2JqZWN0IGlzIG9ubHkgdG8gYmUgY2xvbmVkIHRvXG4gICAgICogICAgYSBwYXJ0aWN1bGFyIGRlcHRoLiAob3B0aW9uYWwgLSBkZWZhdWx0cyB0byBJbmZpbml0eSlcbiAgICAgKiBAcGFyYW0gYHByb3RvdHlwZWAgLSBzZXRzIHRoZSBwcm90b3R5cGUgdG8gYmUgdXNlZCB3aGVuIGNsb25pbmcgYW4gb2JqZWN0LlxuICAgICAqICAgIChvcHRpb25hbCAtIGRlZmF1bHRzIHRvIHBhcmVudCBwcm90b3R5cGUpLlxuICAgICovXG5cbiAgICBmdW5jdGlvbiBjbG9uZShwYXJlbnQsIGNpcmN1bGFyLCBkZXB0aCwgcHJvdG90eXBlKSB7XG4gICAgICB2YXIgZmlsdGVyO1xuXG4gICAgICBpZiAodHlwZW9mIGNpcmN1bGFyID09PSAnb2JqZWN0Jykge1xuICAgICAgICBkZXB0aCA9IGNpcmN1bGFyLmRlcHRoO1xuICAgICAgICBwcm90b3R5cGUgPSBjaXJjdWxhci5wcm90b3R5cGU7XG4gICAgICAgIGZpbHRlciA9IGNpcmN1bGFyLmZpbHRlcjtcbiAgICAgICAgY2lyY3VsYXIgPSBjaXJjdWxhci5jaXJjdWxhcjtcbiAgICAgIH0gLy8gbWFpbnRhaW4gdHdvIGFycmF5cyBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcywgd2hlcmUgY29ycmVzcG9uZGluZyBwYXJlbnRzXG4gICAgICAvLyBhbmQgY2hpbGRyZW4gaGF2ZSB0aGUgc2FtZSBpbmRleFxuXG5cbiAgICAgIHZhciBhbGxQYXJlbnRzID0gW107XG4gICAgICB2YXIgYWxsQ2hpbGRyZW4gPSBbXTtcbiAgICAgIHZhciB1c2VCdWZmZXIgPSB0eXBlb2YgYnVmZmVyXzEgIT0gJ3VuZGVmaW5lZCc7XG4gICAgICBpZiAodHlwZW9mIGNpcmN1bGFyID09ICd1bmRlZmluZWQnKSBjaXJjdWxhciA9IHRydWU7XG4gICAgICBpZiAodHlwZW9mIGRlcHRoID09ICd1bmRlZmluZWQnKSBkZXB0aCA9IEluZmluaXR5OyAvLyByZWN1cnNlIHRoaXMgZnVuY3Rpb24gc28gd2UgZG9uJ3QgcmVzZXQgYWxsUGFyZW50cyBhbmQgYWxsQ2hpbGRyZW5cblxuICAgICAgZnVuY3Rpb24gX2Nsb25lKHBhcmVudCwgZGVwdGgpIHtcbiAgICAgICAgLy8gY2xvbmluZyBudWxsIGFsd2F5cyByZXR1cm5zIG51bGxcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChkZXB0aCA9PSAwKSByZXR1cm4gcGFyZW50O1xuICAgICAgICB2YXIgY2hpbGQ7XG4gICAgICAgIHZhciBwcm90bztcblxuICAgICAgICBpZiAodHlwZW9mIHBhcmVudCAhPSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xvbmUuX19pc0FycmF5KHBhcmVudCkpIHtcbiAgICAgICAgICBjaGlsZCA9IFtdO1xuICAgICAgICB9IGVsc2UgaWYgKGNsb25lLl9faXNSZWdFeHAocGFyZW50KSkge1xuICAgICAgICAgIGNoaWxkID0gbmV3IFJlZ0V4cChwYXJlbnQuc291cmNlLCBfX2dldFJlZ0V4cEZsYWdzKHBhcmVudCkpO1xuICAgICAgICAgIGlmIChwYXJlbnQubGFzdEluZGV4KSBjaGlsZC5sYXN0SW5kZXggPSBwYXJlbnQubGFzdEluZGV4O1xuICAgICAgICB9IGVsc2UgaWYgKGNsb25lLl9faXNEYXRlKHBhcmVudCkpIHtcbiAgICAgICAgICBjaGlsZCA9IG5ldyBEYXRlKHBhcmVudC5nZXRUaW1lKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHVzZUJ1ZmZlciAmJiBidWZmZXJfMS5pc0J1ZmZlcihwYXJlbnQpKSB7XG4gICAgICAgICAgaWYgKGJ1ZmZlcl8xLmFsbG9jVW5zYWZlKSB7XG4gICAgICAgICAgICAvLyBOb2RlLmpzID49IDQuNS4wXG4gICAgICAgICAgICBjaGlsZCA9IGJ1ZmZlcl8xLmFsbG9jVW5zYWZlKHBhcmVudC5sZW5ndGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPbGRlciBOb2RlLmpzIHZlcnNpb25zXG4gICAgICAgICAgICBjaGlsZCA9IG5ldyBidWZmZXJfMShwYXJlbnQubGVuZ3RoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJlbnQuY29weShjaGlsZCk7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJvdG90eXBlID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwYXJlbnQpO1xuICAgICAgICAgICAgY2hpbGQgPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hpbGQgPSBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSk7XG4gICAgICAgICAgICBwcm90byA9IHByb3RvdHlwZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2lyY3VsYXIpIHtcbiAgICAgICAgICB2YXIgaW5kZXggPSBhbGxQYXJlbnRzLmluZGV4T2YocGFyZW50KTtcblxuICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGFsbENoaWxkcmVuW2luZGV4XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhbGxQYXJlbnRzLnB1c2gocGFyZW50KTtcbiAgICAgICAgICBhbGxDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgaW4gcGFyZW50KSB7XG4gICAgICAgICAgdmFyIGF0dHJzO1xuXG4gICAgICAgICAgaWYgKHByb3RvKSB7XG4gICAgICAgICAgICBhdHRycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIGkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhdHRycyAmJiBhdHRycy5zZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hpbGRbaV0gPSBfY2xvbmUocGFyZW50W2ldLCBkZXB0aCAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2Nsb25lKHBhcmVudCwgZGVwdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbGUgZmxhdCBjbG9uZSB1c2luZyBwcm90b3R5cGUsIGFjY2VwdHMgb25seSBvYmplY3RzLCB1c2VmdWxsIGZvciBwcm9wZXJ0eVxuICAgICAqIG92ZXJyaWRlIG9uIEZMQVQgY29uZmlndXJhdGlvbiBvYmplY3QgKG5vIG5lc3RlZCBwcm9wcykuXG4gICAgICpcbiAgICAgKiBVU0UgV0lUSCBDQVVUSU9OISBUaGlzIG1heSBub3QgYmVoYXZlIGFzIHlvdSB3aXNoIGlmIHlvdSBkbyBub3Qga25vdyBob3cgdGhpc1xuICAgICAqIHdvcmtzLlxuICAgICAqL1xuXG5cbiAgICBjbG9uZS5jbG9uZVByb3RvdHlwZSA9IGZ1bmN0aW9uIGNsb25lUHJvdG90eXBlKHBhcmVudCkge1xuICAgICAgaWYgKHBhcmVudCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIHZhciBjID0gZnVuY3Rpb24gYygpIHt9O1xuXG4gICAgICBjLnByb3RvdHlwZSA9IHBhcmVudDtcbiAgICAgIHJldHVybiBuZXcgYygpO1xuICAgIH07IC8vIHByaXZhdGUgdXRpbGl0eSBmdW5jdGlvbnNcblxuXG4gICAgZnVuY3Rpb24gX19vYmpUb1N0cihvKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xuICAgIH1cbiAgICBjbG9uZS5fX29ialRvU3RyID0gX19vYmpUb1N0cjtcblxuICAgIGZ1bmN0aW9uIF9faXNEYXRlKG8pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgX19vYmpUb1N0cihvKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xuICAgIH1cbiAgICBjbG9uZS5fX2lzRGF0ZSA9IF9faXNEYXRlO1xuXG4gICAgZnVuY3Rpb24gX19pc0FycmF5KG8pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgX19vYmpUb1N0cihvKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG4gICAgY2xvbmUuX19pc0FycmF5ID0gX19pc0FycmF5O1xuXG4gICAgZnVuY3Rpb24gX19pc1JlZ0V4cChvKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdvYmplY3QnICYmIF9fb2JqVG9TdHIobykgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xuICAgIH1cbiAgICBjbG9uZS5fX2lzUmVnRXhwID0gX19pc1JlZ0V4cDtcblxuICAgIGZ1bmN0aW9uIF9fZ2V0UmVnRXhwRmxhZ3MocmUpIHtcbiAgICAgIHZhciBmbGFncyA9ICcnO1xuICAgICAgaWYgKHJlLmdsb2JhbCkgZmxhZ3MgKz0gJ2cnO1xuICAgICAgaWYgKHJlLmlnbm9yZUNhc2UpIGZsYWdzICs9ICdpJztcbiAgICAgIGlmIChyZS5tdWx0aWxpbmUpIGZsYWdzICs9ICdtJztcbiAgICAgIHJldHVybiBmbGFncztcbiAgICB9XG4gICAgY2xvbmUuX19nZXRSZWdFeHBGbGFncyA9IF9fZ2V0UmVnRXhwRmxhZ3M7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9KCk7XG5cbiAgaWYgKCBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gY2xvbmU7XG4gIH1cbn0pO1xuXG52YXIgU3Vic2V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3Vic2V0KGZvbnQpIHtcbiAgICB0aGlzLmZvbnQgPSBmb250O1xuICAgIHRoaXMuZ2x5cGhzID0gW107XG4gICAgdGhpcy5tYXBwaW5nID0ge307IC8vIGFsd2F5cyBpbmNsdWRlIHRoZSBtaXNzaW5nIGdseXBoXG5cbiAgICB0aGlzLmluY2x1ZGVHbHlwaCgwKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTdWJzZXQucHJvdG90eXBlO1xuXG4gIF9wcm90by5pbmNsdWRlR2x5cGggPSBmdW5jdGlvbiBpbmNsdWRlR2x5cGgoZ2x5cGgpIHtcbiAgICBpZiAodHlwZW9mIGdseXBoID09PSAnb2JqZWN0Jykge1xuICAgICAgZ2x5cGggPSBnbHlwaC5pZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXBwaW5nW2dseXBoXSA9PSBudWxsKSB7XG4gICAgICB0aGlzLmdseXBocy5wdXNoKGdseXBoKTtcbiAgICAgIHRoaXMubWFwcGluZ1tnbHlwaF0gPSB0aGlzLmdseXBocy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1hcHBpbmdbZ2x5cGhdO1xuICB9O1xuXG4gIF9wcm90by5lbmNvZGVTdHJlYW0gPSBmdW5jdGlvbiBlbmNvZGVTdHJlYW0oKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBzID0gbmV3IHJlc3RydWN0dXJlLkVuY29kZVN0cmVhbSgpO1xuICAgIG5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmVuY29kZShzKTtcblxuICAgICAgcmV0dXJuIHMuZW5kKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHM7XG4gIH07XG5cbiAgcmV0dXJuIFN1YnNldDtcbn0oKTtcblxudmFyIE9OX0NVUlZFJDEgPSAxIDw8IDA7XG52YXIgWF9TSE9SVF9WRUNUT1IkMSA9IDEgPDwgMTtcbnZhciBZX1NIT1JUX1ZFQ1RPUiQxID0gMSA8PCAyO1xudmFyIFJFUEVBVCQxID0gMSA8PCAzO1xudmFyIFNBTUVfWCQxID0gMSA8PCA0O1xudmFyIFNBTUVfWSQxID0gMSA8PCA1O1xuXG52YXIgUG9pbnQkMSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvaW50KCkge31cblxuICBQb2ludC5zaXplID0gZnVuY3Rpb24gc2l6ZSh2YWwpIHtcbiAgICByZXR1cm4gdmFsID49IDAgJiYgdmFsIDw9IDI1NSA/IDEgOiAyO1xuICB9O1xuXG4gIFBvaW50LmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHJlYW0sIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMjU1KSB7XG4gICAgICBzdHJlYW0ud3JpdGVVSW50OCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmVhbS53cml0ZUludDE2QkUodmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUG9pbnQ7XG59KCk7XG5cbnZhciBHbHlmID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIG51bWJlck9mQ29udG91cnM6IHJlc3RydWN0dXJlLmludDE2LFxuICAvLyBpZiBuZWdhdGl2ZSwgdGhpcyBpcyBhIGNvbXBvc2l0ZSBnbHlwaFxuICB4TWluOiByZXN0cnVjdHVyZS5pbnQxNixcbiAgeU1pbjogcmVzdHJ1Y3R1cmUuaW50MTYsXG4gIHhNYXg6IHJlc3RydWN0dXJlLmludDE2LFxuICB5TWF4OiByZXN0cnVjdHVyZS5pbnQxNixcbiAgZW5kUHRzT2ZDb250b3VyczogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQxNiwgJ251bWJlck9mQ29udG91cnMnKSxcbiAgaW5zdHJ1Y3Rpb25zOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsIHJlc3RydWN0dXJlLnVpbnQxNiksXG4gIGZsYWdzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkocmVzdHJ1Y3R1cmUudWludDgsIDApLFxuICB4UG9pbnRzOiBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoUG9pbnQkMSwgMCksXG4gIHlQb2ludHM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShQb2ludCQxLCAwKVxufSk7XG4vKipcbiAqIEVuY29kZXMgVHJ1ZVR5cGUgZ2x5cGggb3V0bGluZXNcbiAqL1xuXG52YXIgVFRGR2x5cGhFbmNvZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVFRGR2x5cGhFbmNvZGVyKCkge31cblxuICB2YXIgX3Byb3RvID0gVFRGR2x5cGhFbmNvZGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZW5jb2RlU2ltcGxlID0gZnVuY3Rpb24gZW5jb2RlU2ltcGxlKHBhdGgsIGluc3RydWN0aW9ucykge1xuICAgIGlmIChpbnN0cnVjdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgaW5zdHJ1Y3Rpb25zID0gW107XG4gICAgfVxuXG4gICAgdmFyIGVuZFB0c09mQ29udG91cnMgPSBbXTtcbiAgICB2YXIgeFBvaW50cyA9IFtdO1xuICAgIHZhciB5UG9pbnRzID0gW107XG4gICAgdmFyIGZsYWdzID0gW107XG4gICAgdmFyIHNhbWUgPSAwO1xuICAgIHZhciBsYXN0WCA9IDAsXG4gICAgICAgIGxhc3RZID0gMCxcbiAgICAgICAgbGFzdEZsYWcgPSAwO1xuICAgIHZhciBwb2ludENvdW50ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5jb21tYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBwYXRoLmNvbW1hbmRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGMuYXJncy5sZW5ndGg7IGogKz0gMikge1xuICAgICAgICB2YXIgeCA9IGMuYXJnc1tqXTtcbiAgICAgICAgdmFyIHkgPSBjLmFyZ3NbaiArIDFdO1xuICAgICAgICB2YXIgZmxhZyA9IDA7IC8vIElmIHRoZSBlbmRpbmcgcG9pbnQgb2YgYSBxdWFkcmF0aWMgY3VydmUgaXMgdGhlIG1pZHBvaW50XG4gICAgICAgIC8vIGJldHdlZW4gdGhlIGNvbnRyb2wgcG9pbnQgYW5kIHRoZSBjb250cm9sIHBvaW50IG9mIHRoZSBuZXh0XG4gICAgICAgIC8vIHF1YWRyYXRpYyBjdXJ2ZSwgd2UgY2FuIG9taXQgdGhlIGVuZGluZyBwb2ludC5cblxuICAgICAgICBpZiAoYy5jb21tYW5kID09PSAncXVhZHJhdGljQ3VydmVUbycgJiYgaiA9PT0gMikge1xuICAgICAgICAgIHZhciBuZXh0ID0gcGF0aC5jb21tYW5kc1tpICsgMV07XG5cbiAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0LmNvbW1hbmQgPT09ICdxdWFkcmF0aWNDdXJ2ZVRvJykge1xuICAgICAgICAgICAgdmFyIG1pZFggPSAobGFzdFggKyBuZXh0LmFyZ3NbMF0pIC8gMjtcbiAgICAgICAgICAgIHZhciBtaWRZID0gKGxhc3RZICsgbmV4dC5hcmdzWzFdKSAvIDI7XG5cbiAgICAgICAgICAgIGlmICh4ID09PSBtaWRYICYmIHkgPT09IG1pZFkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIEFsbCBwb2ludHMgZXhjZXB0IGNvbnRyb2wgcG9pbnRzIGFyZSBvbiBjdXJ2ZS5cblxuXG4gICAgICAgIGlmICghKGMuY29tbWFuZCA9PT0gJ3F1YWRyYXRpY0N1cnZlVG8nICYmIGogPT09IDApKSB7XG4gICAgICAgICAgZmxhZyB8PSBPTl9DVVJWRSQxO1xuICAgICAgICB9XG5cbiAgICAgICAgZmxhZyA9IHRoaXMuX2VuY29kZVBvaW50KHgsIGxhc3RYLCB4UG9pbnRzLCBmbGFnLCBYX1NIT1JUX1ZFQ1RPUiQxLCBTQU1FX1gkMSk7XG4gICAgICAgIGZsYWcgPSB0aGlzLl9lbmNvZGVQb2ludCh5LCBsYXN0WSwgeVBvaW50cywgZmxhZywgWV9TSE9SVF9WRUNUT1IkMSwgU0FNRV9ZJDEpO1xuXG4gICAgICAgIGlmIChmbGFnID09PSBsYXN0RmxhZyAmJiBzYW1lIDwgMjU1KSB7XG4gICAgICAgICAgZmxhZ3NbZmxhZ3MubGVuZ3RoIC0gMV0gfD0gUkVQRUFUJDE7XG4gICAgICAgICAgc2FtZSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChzYW1lID4gMCkge1xuICAgICAgICAgICAgZmxhZ3MucHVzaChzYW1lKTtcbiAgICAgICAgICAgIHNhbWUgPSAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZsYWdzLnB1c2goZmxhZyk7XG4gICAgICAgICAgbGFzdEZsYWcgPSBmbGFnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFggPSB4O1xuICAgICAgICBsYXN0WSA9IHk7XG4gICAgICAgIHBvaW50Q291bnQrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGMuY29tbWFuZCA9PT0gJ2Nsb3NlUGF0aCcpIHtcbiAgICAgICAgZW5kUHRzT2ZDb250b3Vycy5wdXNoKHBvaW50Q291bnQgLSAxKTtcbiAgICAgIH1cbiAgICB9IC8vIENsb3NlIHRoZSBwYXRoIGlmIHRoZSBsYXN0IGNvbW1hbmQgZGlkbid0IGFscmVhZHlcblxuXG4gICAgaWYgKHBhdGguY29tbWFuZHMubGVuZ3RoID4gMSAmJiBwYXRoLmNvbW1hbmRzW3BhdGguY29tbWFuZHMubGVuZ3RoIC0gMV0uY29tbWFuZCAhPT0gJ2Nsb3NlUGF0aCcpIHtcbiAgICAgIGVuZFB0c09mQ29udG91cnMucHVzaChwb2ludENvdW50IC0gMSk7XG4gICAgfVxuXG4gICAgdmFyIGJib3ggPSBwYXRoLmJib3g7XG4gICAgdmFyIGdseWYgPSB7XG4gICAgICBudW1iZXJPZkNvbnRvdXJzOiBlbmRQdHNPZkNvbnRvdXJzLmxlbmd0aCxcbiAgICAgIHhNaW46IGJib3gubWluWCxcbiAgICAgIHlNaW46IGJib3gubWluWSxcbiAgICAgIHhNYXg6IGJib3gubWF4WCxcbiAgICAgIHlNYXg6IGJib3gubWF4WSxcbiAgICAgIGVuZFB0c09mQ29udG91cnM6IGVuZFB0c09mQ29udG91cnMsXG4gICAgICBpbnN0cnVjdGlvbnM6IGluc3RydWN0aW9ucyxcbiAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgIHhQb2ludHM6IHhQb2ludHMsXG4gICAgICB5UG9pbnRzOiB5UG9pbnRzXG4gICAgfTtcbiAgICB2YXIgc2l6ZSA9IEdseWYuc2l6ZShnbHlmKTtcbiAgICB2YXIgdGFpbCA9IDQgLSBzaXplICUgNDtcbiAgICB2YXIgc3RyZWFtID0gbmV3IHJlc3RydWN0dXJlLkVuY29kZVN0cmVhbShzaXplICsgdGFpbCk7XG4gICAgR2x5Zi5lbmNvZGUoc3RyZWFtLCBnbHlmKTsgLy8gQWxpZ24gdG8gNC1ieXRlIGxlbmd0aFxuXG4gICAgaWYgKHRhaWwgIT09IDApIHtcbiAgICAgIHN0cmVhbS5maWxsKDAsIHRhaWwpO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJlYW0uYnVmZmVyO1xuICB9O1xuXG4gIF9wcm90by5fZW5jb2RlUG9pbnQgPSBmdW5jdGlvbiBfZW5jb2RlUG9pbnQodmFsdWUsIGxhc3QsIHBvaW50cywgZmxhZywgc2hvcnRGbGFnLCBzYW1lRmxhZykge1xuICAgIHZhciBkaWZmID0gdmFsdWUgLSBsYXN0O1xuXG4gICAgaWYgKHZhbHVlID09PSBsYXN0KSB7XG4gICAgICBmbGFnIHw9IHNhbWVGbGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoLTI1NSA8PSBkaWZmICYmIGRpZmYgPD0gMjU1KSB7XG4gICAgICAgIGZsYWcgfD0gc2hvcnRGbGFnO1xuXG4gICAgICAgIGlmIChkaWZmIDwgMCkge1xuICAgICAgICAgIGRpZmYgPSAtZGlmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmbGFnIHw9IHNhbWVGbGFnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBvaW50cy5wdXNoKGRpZmYpO1xuICAgIH1cblxuICAgIHJldHVybiBmbGFnO1xuICB9O1xuXG4gIHJldHVybiBUVEZHbHlwaEVuY29kZXI7XG59KCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkbyhvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkbyhvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkbyhvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JG8obywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRvKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkbyhhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkZChzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIFRURlN1YnNldCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1N1YnNldCkge1xuICBfaW5oZXJpdHNMb29zZSRkKFRURlN1YnNldCwgX1N1YnNldCk7XG5cbiAgZnVuY3Rpb24gVFRGU3Vic2V0KGZvbnQpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9TdWJzZXQuY2FsbCh0aGlzLCBmb250KSB8fCB0aGlzO1xuICAgIF90aGlzLmdseXBoRW5jb2RlciA9IG5ldyBUVEZHbHlwaEVuY29kZXIoKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gVFRGU3Vic2V0LnByb3RvdHlwZTtcblxuICBfcHJvdG8uX2FkZEdseXBoID0gZnVuY3Rpb24gX2FkZEdseXBoKGdpZCkge1xuICAgIHZhciBnbHlwaCA9IHRoaXMuZm9udC5nZXRHbHlwaChnaWQpO1xuXG4gICAgdmFyIGdseWYgPSBnbHlwaC5fZGVjb2RlKCk7IC8vIGdldCB0aGUgb2Zmc2V0IHRvIHRoZSBnbHlwaCBmcm9tIHRoZSBsb2NhIHRhYmxlXG5cblxuICAgIHZhciBjdXJPZmZzZXQgPSB0aGlzLmZvbnQubG9jYS5vZmZzZXRzW2dpZF07XG4gICAgdmFyIG5leHRPZmZzZXQgPSB0aGlzLmZvbnQubG9jYS5vZmZzZXRzW2dpZCArIDFdO1xuXG4gICAgdmFyIHN0cmVhbSA9IHRoaXMuZm9udC5fZ2V0VGFibGVTdHJlYW0oJ2dseWYnKTtcblxuICAgIHN0cmVhbS5wb3MgKz0gY3VyT2Zmc2V0O1xuICAgIHZhciBidWZmZXIgPSBzdHJlYW0ucmVhZEJ1ZmZlcihuZXh0T2Zmc2V0IC0gY3VyT2Zmc2V0KTsgLy8gaWYgaXQgaXMgYSBjb21wb3VuZCBnbHlwaCwgaW5jbHVkZSBpdHMgY29tcG9uZW50c1xuXG4gICAgaWYgKGdseWYgJiYgZ2x5Zi5udW1iZXJPZkNvbnRvdXJzIDwgMCkge1xuICAgICAgYnVmZmVyID0gbmV3IGJ1ZmZlcl8xKGJ1ZmZlcik7XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkbyhnbHlmLmNvbXBvbmVudHMpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvcigpKS5kb25lOykge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gX3N0ZXAudmFsdWU7XG4gICAgICAgIGdpZCA9IHRoaXMuaW5jbHVkZUdseXBoKGNvbXBvbmVudC5nbHlwaElEKTtcbiAgICAgICAgYnVmZmVyLndyaXRlVUludDE2QkUoZ2lkLCBjb21wb25lbnQucG9zKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGdseWYgJiYgdGhpcy5mb250Ll92YXJpYXRpb25Qcm9jZXNzb3IpIHtcbiAgICAgIC8vIElmIHRoaXMgaXMgYSBUcnVlVHlwZSB2YXJpYXRpb24gZ2x5cGgsIHJlLWVuY29kZSB0aGUgcGF0aFxuICAgICAgYnVmZmVyID0gdGhpcy5nbHlwaEVuY29kZXIuZW5jb2RlU2ltcGxlKGdseXBoLnBhdGgsIGdseWYuaW5zdHJ1Y3Rpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLmdseWYucHVzaChidWZmZXIpO1xuICAgIHRoaXMubG9jYS5vZmZzZXRzLnB1c2godGhpcy5vZmZzZXQpO1xuICAgIHRoaXMuaG10eC5tZXRyaWNzLnB1c2goe1xuICAgICAgYWR2YW5jZTogZ2x5cGguYWR2YW5jZVdpZHRoLFxuICAgICAgYmVhcmluZzogZ2x5cGguX2dldE1ldHJpY3MoKS5sZWZ0QmVhcmluZ1xuICAgIH0pO1xuICAgIHRoaXMub2Zmc2V0ICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMuZ2x5Zi5sZW5ndGggLSAxO1xuICB9O1xuXG4gIF9wcm90by5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyZWFtKSB7XG4gICAgLy8gdGFibGVzIHJlcXVpcmVkIGJ5IFBERiBzcGVjOlxuICAgIC8vICAgaGVhZCwgaGhlYSwgbG9jYSwgbWF4cCwgY3Z0ICwgcHJlcCwgZ2x5ZiwgaG10eCwgZnBnbVxuICAgIC8vXG4gICAgLy8gYWRkaXRpb25hbCB0YWJsZXMgcmVxdWlyZWQgZm9yIHN0YW5kYWxvbmUgZm9udHM6XG4gICAgLy8gICBuYW1lLCBjbWFwLCBPUy8yLCBwb3N0XG4gICAgdGhpcy5nbHlmID0gW107XG4gICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgIHRoaXMubG9jYSA9IHtcbiAgICAgIG9mZnNldHM6IFtdXG4gICAgfTtcbiAgICB0aGlzLmhtdHggPSB7XG4gICAgICBtZXRyaWNzOiBbXSxcbiAgICAgIGJlYXJpbmdzOiBbXVxuICAgIH07IC8vIGluY2x1ZGUgYWxsIHRoZSBnbHlwaHNcbiAgICAvLyBub3QgdXNpbmcgYSBmb3IgbG9vcCBiZWNhdXNlIHdlIG5lZWQgdG8gc3VwcG9ydCBhZGRpbmcgbW9yZVxuICAgIC8vIGdseXBocyB0byB0aGUgYXJyYXkgYXMgd2UgZ28sIGFuZCBDb2ZmZWVTY3JpcHQgY2FjaGVzIHRoZSBsZW5ndGguXG5cbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IHRoaXMuZ2x5cGhzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fYWRkR2x5cGgodGhpcy5nbHlwaHNbaSsrXSk7XG4gICAgfVxuXG4gICAgdmFyIG1heHAgPSBjbG9uZV8xKHRoaXMuZm9udC5tYXhwKTtcbiAgICBtYXhwLm51bUdseXBocyA9IHRoaXMuZ2x5Zi5sZW5ndGg7XG4gICAgdGhpcy5sb2NhLm9mZnNldHMucHVzaCh0aGlzLm9mZnNldCk7XG4gICAgdGFibGVzLmxvY2EucHJlRW5jb2RlLmNhbGwodGhpcy5sb2NhKTtcbiAgICB2YXIgaGVhZCA9IGNsb25lXzEodGhpcy5mb250LmhlYWQpO1xuICAgIGhlYWQuaW5kZXhUb0xvY0Zvcm1hdCA9IHRoaXMubG9jYS52ZXJzaW9uO1xuICAgIHZhciBoaGVhID0gY2xvbmVfMSh0aGlzLmZvbnQuaGhlYSk7XG4gICAgaGhlYS5udW1iZXJPZk1ldHJpY3MgPSB0aGlzLmhtdHgubWV0cmljcy5sZW5ndGg7IC8vIG1hcCA9IFtdXG4gICAgLy8gZm9yIGluZGV4IGluIFswLi4uMjU2XVxuICAgIC8vICAgICBpZiBpbmRleCA8IEBudW1HbHlwaHNcbiAgICAvLyAgICAgICAgIG1hcFtpbmRleF0gPSBpbmRleFxuICAgIC8vICAgICBlbHNlXG4gICAgLy8gICAgICAgICBtYXBbaW5kZXhdID0gMFxuICAgIC8vXG4gICAgLy8gY21hcFRhYmxlID1cbiAgICAvLyAgICAgdmVyc2lvbjogMFxuICAgIC8vICAgICBsZW5ndGg6IDI2MlxuICAgIC8vICAgICBsYW5ndWFnZTogMFxuICAgIC8vICAgICBjb2RlTWFwOiBtYXBcbiAgICAvL1xuICAgIC8vIGNtYXAgPVxuICAgIC8vICAgICB2ZXJzaW9uOiAwXG4gICAgLy8gICAgIG51bVN1YnRhYmxlczogMVxuICAgIC8vICAgICB0YWJsZXM6IFtcbiAgICAvLyAgICAgICAgIHBsYXRmb3JtSUQ6IDFcbiAgICAvLyAgICAgICAgIGVuY29kaW5nSUQ6IDBcbiAgICAvLyAgICAgICAgIHRhYmxlOiBjbWFwVGFibGVcbiAgICAvLyAgICAgXVxuICAgIC8vIFRPRE86IHN1YnNldCBwcmVwLCBjdnQsIGZwZ20/XG5cbiAgICBEaXJlY3RvcnkuZW5jb2RlKHN0cmVhbSwge1xuICAgICAgdGFibGVzOiB7XG4gICAgICAgIGhlYWQ6IGhlYWQsXG4gICAgICAgIGhoZWE6IGhoZWEsXG4gICAgICAgIGxvY2E6IHRoaXMubG9jYSxcbiAgICAgICAgbWF4cDogbWF4cCxcbiAgICAgICAgJ2N2dCAnOiB0aGlzLmZvbnRbJ2N2dCAnXSxcbiAgICAgICAgcHJlcDogdGhpcy5mb250LnByZXAsXG4gICAgICAgIGdseWY6IHRoaXMuZ2x5ZixcbiAgICAgICAgaG10eDogdGhpcy5obXR4LFxuICAgICAgICBmcGdtOiB0aGlzLmZvbnQuZnBnbSAvLyBuYW1lOiBjbG9uZSBAZm9udC5uYW1lXG4gICAgICAgIC8vICdPUy8yJzogY2xvbmUgQGZvbnRbJ09TLzInXVxuICAgICAgICAvLyBwb3N0OiBjbG9uZSBAZm9udC5wb3N0XG4gICAgICAgIC8vIGNtYXA6IGNtYXBcblxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBUVEZTdWJzZXQ7XG59KFN1YnNldCk7XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkcChvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkcChvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkcChvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JHAobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRwKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkcChhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UkZShzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIENGRlN1YnNldCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1N1YnNldCkge1xuICBfaW5oZXJpdHNMb29zZSRlKENGRlN1YnNldCwgX1N1YnNldCk7XG5cbiAgZnVuY3Rpb24gQ0ZGU3Vic2V0KGZvbnQpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9TdWJzZXQuY2FsbCh0aGlzLCBmb250KSB8fCB0aGlzO1xuICAgIF90aGlzLmNmZiA9IF90aGlzLmZvbnRbJ0NGRiAnXTtcblxuICAgIGlmICghX3RoaXMuY2ZmKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIENGRiBGb250Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IENGRlN1YnNldC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnN1YnNldENoYXJzdHJpbmdzID0gZnVuY3Rpb24gc3Vic2V0Q2hhcnN0cmluZ3MoKSB7XG4gICAgdGhpcy5jaGFyc3RyaW5ncyA9IFtdO1xuICAgIHZhciBnc3VicnMgPSB7fTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkcCh0aGlzLmdseXBocyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgZ2lkID0gX3N0ZXAudmFsdWU7XG4gICAgICB0aGlzLmNoYXJzdHJpbmdzLnB1c2godGhpcy5jZmYuZ2V0Q2hhclN0cmluZyhnaWQpKTtcbiAgICAgIHZhciBnbHlwaCA9IHRoaXMuZm9udC5nZXRHbHlwaChnaWQpO1xuICAgICAgdmFyIHBhdGggPSBnbHlwaC5wYXRoOyAvLyB0aGlzIGNhdXNlcyB0aGUgZ2x5cGggdG8gYmUgcGFyc2VkXG5cbiAgICAgIGZvciAodmFyIHN1YnIgaW4gZ2x5cGguX3VzZWRHc3VicnMpIHtcbiAgICAgICAgZ3N1YnJzW3N1YnJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmdzdWJycyA9IHRoaXMuc3Vic2V0U3VicnModGhpcy5jZmYuZ2xvYmFsU3VickluZGV4LCBnc3VicnMpO1xuICB9O1xuXG4gIF9wcm90by5zdWJzZXRTdWJycyA9IGZ1bmN0aW9uIHN1YnNldFN1YnJzKHN1YnJzLCB1c2VkKSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN1YnIgPSBzdWJyc1tpXTtcblxuICAgICAgaWYgKHVzZWRbaV0pIHtcbiAgICAgICAgdGhpcy5jZmYuc3RyZWFtLnBvcyA9IHN1YnIub2Zmc2V0O1xuICAgICAgICByZXMucHVzaCh0aGlzLmNmZi5zdHJlYW0ucmVhZEJ1ZmZlcihzdWJyLmxlbmd0aCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzLnB1c2gobmV3IGJ1ZmZlcl8xKFsxMV0pKTsgLy8gcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBfcHJvdG8uc3Vic2V0Rm9udGRpY3QgPSBmdW5jdGlvbiBzdWJzZXRGb250ZGljdCh0b3BEaWN0KSB7XG4gICAgdG9wRGljdC5GREFycmF5ID0gW107XG4gICAgdG9wRGljdC5GRFNlbGVjdCA9IHtcbiAgICAgIHZlcnNpb246IDAsXG4gICAgICBmZHM6IFtdXG4gICAgfTtcbiAgICB2YXIgdXNlZF9mZHMgPSB7fTtcbiAgICB2YXIgdXNlZF9zdWJycyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkcCh0aGlzLmdseXBocyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgZ2lkID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgdmFyIGZkID0gdGhpcy5jZmYuZmRGb3JHbHlwaChnaWQpO1xuXG4gICAgICBpZiAoZmQgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF1c2VkX2Zkc1tmZF0pIHtcbiAgICAgICAgdG9wRGljdC5GREFycmF5LnB1c2goT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jZmYudG9wRGljdC5GREFycmF5W2ZkXSkpO1xuICAgICAgICB1c2VkX3N1YnJzLnB1c2goe30pO1xuICAgICAgfVxuXG4gICAgICB1c2VkX2Zkc1tmZF0gPSB0cnVlO1xuICAgICAgdG9wRGljdC5GRFNlbGVjdC5mZHMucHVzaCh0b3BEaWN0LkZEQXJyYXkubGVuZ3RoIC0gMSk7XG4gICAgICB2YXIgZ2x5cGggPSB0aGlzLmZvbnQuZ2V0R2x5cGgoZ2lkKTtcbiAgICAgIHZhciBwYXRoID0gZ2x5cGgucGF0aDsgLy8gdGhpcyBjYXVzZXMgdGhlIGdseXBoIHRvIGJlIHBhcnNlZFxuXG4gICAgICBmb3IgKHZhciBzdWJyIGluIGdseXBoLl91c2VkU3VicnMpIHtcbiAgICAgICAgdXNlZF9zdWJyc1t1c2VkX3N1YnJzLmxlbmd0aCAtIDFdW3N1YnJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvcERpY3QuRkRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRpY3QgPSB0b3BEaWN0LkZEQXJyYXlbaV07XG4gICAgICBkZWxldGUgZGljdC5Gb250TmFtZTtcblxuICAgICAgaWYgKGRpY3QuUHJpdmF0ZSAmJiBkaWN0LlByaXZhdGUuU3VicnMpIHtcbiAgICAgICAgZGljdC5Qcml2YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgZGljdC5Qcml2YXRlKTtcbiAgICAgICAgZGljdC5Qcml2YXRlLlN1YnJzID0gdGhpcy5zdWJzZXRTdWJycyhkaWN0LlByaXZhdGUuU3VicnMsIHVzZWRfc3VicnNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfTtcblxuICBfcHJvdG8uY3JlYXRlQ0lERm9udGRpY3QgPSBmdW5jdGlvbiBjcmVhdGVDSURGb250ZGljdCh0b3BEaWN0KSB7XG4gICAgdmFyIHVzZWRfc3VicnMgPSB7fTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHAodGhpcy5nbHlwaHMpLCBfc3RlcDM7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMygpKS5kb25lOykge1xuICAgICAgdmFyIGdpZCA9IF9zdGVwMy52YWx1ZTtcbiAgICAgIHZhciBnbHlwaCA9IHRoaXMuZm9udC5nZXRHbHlwaChnaWQpO1xuICAgICAgdmFyIHBhdGggPSBnbHlwaC5wYXRoOyAvLyB0aGlzIGNhdXNlcyB0aGUgZ2x5cGggdG8gYmUgcGFyc2VkXG5cbiAgICAgIGZvciAodmFyIHN1YnIgaW4gZ2x5cGguX3VzZWRTdWJycykge1xuICAgICAgICB1c2VkX3N1YnJzW3N1YnJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJpdmF0ZURpY3QgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNmZi50b3BEaWN0LlByaXZhdGUpO1xuXG4gICAgaWYgKHRoaXMuY2ZmLnRvcERpY3QuUHJpdmF0ZSAmJiB0aGlzLmNmZi50b3BEaWN0LlByaXZhdGUuU3VicnMpIHtcbiAgICAgIHByaXZhdGVEaWN0LlN1YnJzID0gdGhpcy5zdWJzZXRTdWJycyh0aGlzLmNmZi50b3BEaWN0LlByaXZhdGUuU3VicnMsIHVzZWRfc3VicnMpO1xuICAgIH1cblxuICAgIHRvcERpY3QuRkRBcnJheSA9IFt7XG4gICAgICBQcml2YXRlOiBwcml2YXRlRGljdFxuICAgIH1dO1xuICAgIHJldHVybiB0b3BEaWN0LkZEU2VsZWN0ID0ge1xuICAgICAgdmVyc2lvbjogMyxcbiAgICAgIG5SYW5nZXM6IDEsXG4gICAgICByYW5nZXM6IFt7XG4gICAgICAgIGZpcnN0OiAwLFxuICAgICAgICBmZDogMFxuICAgICAgfV0sXG4gICAgICBzZW50aW5lbDogdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGhcbiAgICB9O1xuICB9O1xuXG4gIF9wcm90by5hZGRTdHJpbmcgPSBmdW5jdGlvbiBhZGRTdHJpbmcoc3RyaW5nKSB7XG4gICAgaWYgKCFzdHJpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdHJpbmdzKSB7XG4gICAgICB0aGlzLnN0cmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLnN0cmluZ3MucHVzaChzdHJpbmcpO1xuICAgIHJldHVybiBzdGFuZGFyZFN0cmluZ3MubGVuZ3RoICsgdGhpcy5zdHJpbmdzLmxlbmd0aCAtIDE7XG4gIH07XG5cbiAgX3Byb3RvLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHJlYW0pIHtcbiAgICB0aGlzLnN1YnNldENoYXJzdHJpbmdzKCk7XG4gICAgdmFyIGNoYXJzZXQgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLmNoYXJzdHJpbmdzLmxlbmd0aCA+IDI1NSA/IDIgOiAxLFxuICAgICAgcmFuZ2VzOiBbe1xuICAgICAgICBmaXJzdDogMSxcbiAgICAgICAgbkxlZnQ6IHRoaXMuY2hhcnN0cmluZ3MubGVuZ3RoIC0gMlxuICAgICAgfV1cbiAgICB9O1xuICAgIHZhciB0b3BEaWN0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jZmYudG9wRGljdCk7XG4gICAgdG9wRGljdC5Qcml2YXRlID0gbnVsbDtcbiAgICB0b3BEaWN0LmNoYXJzZXQgPSBjaGFyc2V0O1xuICAgIHRvcERpY3QuRW5jb2RpbmcgPSBudWxsO1xuICAgIHRvcERpY3QuQ2hhclN0cmluZ3MgPSB0aGlzLmNoYXJzdHJpbmdzO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwLCBfYXJyID0gWyd2ZXJzaW9uJywgJ05vdGljZScsICdDb3B5cmlnaHQnLCAnRnVsbE5hbWUnLCAnRmFtaWx5TmFtZScsICdXZWlnaHQnLCAnUG9zdFNjcmlwdCcsICdCYXNlRm9udE5hbWUnLCAnRm9udE5hbWUnXTsgX2kgPCBfYXJyLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGtleSA9IF9hcnJbX2ldO1xuICAgICAgdG9wRGljdFtrZXldID0gdGhpcy5hZGRTdHJpbmcodGhpcy5jZmYuc3RyaW5nKHRvcERpY3Rba2V5XSkpO1xuICAgIH1cblxuICAgIHRvcERpY3QuUk9TID0gW3RoaXMuYWRkU3RyaW5nKCdBZG9iZScpLCB0aGlzLmFkZFN0cmluZygnSWRlbnRpdHknKSwgMF07XG4gICAgdG9wRGljdC5DSURDb3VudCA9IHRoaXMuY2hhcnN0cmluZ3MubGVuZ3RoO1xuXG4gICAgaWYgKHRoaXMuY2ZmLmlzQ0lERm9udCkge1xuICAgICAgdGhpcy5zdWJzZXRGb250ZGljdCh0b3BEaWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcmVhdGVDSURGb250ZGljdCh0b3BEaWN0KTtcbiAgICB9XG5cbiAgICB2YXIgdG9wID0ge1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIGhkclNpemU6IHRoaXMuY2ZmLmhkclNpemUsXG4gICAgICBvZmZTaXplOiB0aGlzLmNmZi5sZW5ndGgsXG4gICAgICBoZWFkZXI6IHRoaXMuY2ZmLmhlYWRlcixcbiAgICAgIG5hbWVJbmRleDogW3RoaXMuY2ZmLnBvc3RzY3JpcHROYW1lXSxcbiAgICAgIHRvcERpY3RJbmRleDogW3RvcERpY3RdLFxuICAgICAgc3RyaW5nSW5kZXg6IHRoaXMuc3RyaW5ncyxcbiAgICAgIGdsb2JhbFN1YnJJbmRleDogdGhpcy5nc3VicnNcbiAgICB9O1xuICAgIENGRlRvcC5lbmNvZGUoc3RyZWFtLCB0b3ApO1xuICB9O1xuXG4gIHJldHVybiBDRkZTdWJzZXQ7XG59KFN1YnNldCk7XG5cbnZhciBfY2xhc3MkNDtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRxKG8pIHsgdmFyIGkgPSAwOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAobyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRxKG8pKSkgcmV0dXJuIGZ1bmN0aW9uICgpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IGkgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgcmV0dXJuIGkubmV4dC5iaW5kKGkpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSRxKG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkcShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JHEobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheSRxKGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyQ4KHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzJDgoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyQ4KENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMkOChDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQ0KHRhcmdldCwgcHJvcGVydHksIGRlY29yYXRvcnMsIGRlc2NyaXB0b3IsIGNvbnRleHQpIHsgdmFyIGRlc2MgPSB7fTsgT2JqZWN0LmtleXMoZGVzY3JpcHRvcikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IGRlc2Nba2V5XSA9IGRlc2NyaXB0b3Jba2V5XTsgfSk7IGRlc2MuZW51bWVyYWJsZSA9ICEhZGVzYy5lbnVtZXJhYmxlOyBkZXNjLmNvbmZpZ3VyYWJsZSA9ICEhZGVzYy5jb25maWd1cmFibGU7IGlmICgndmFsdWUnIGluIGRlc2MgfHwgZGVzYy5pbml0aWFsaXplcikgeyBkZXNjLndyaXRhYmxlID0gdHJ1ZTsgfSBkZXNjID0gZGVjb3JhdG9ycy5zbGljZSgpLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGRlc2MsIGRlY29yYXRvcikgeyByZXR1cm4gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHksIGRlc2MpIHx8IGRlc2M7IH0sIGRlc2MpOyBpZiAoY29udGV4dCAmJiBkZXNjLmluaXRpYWxpemVyICE9PSB2b2lkIDApIHsgZGVzYy52YWx1ZSA9IGRlc2MuaW5pdGlhbGl6ZXIgPyBkZXNjLmluaXRpYWxpemVyLmNhbGwoY29udGV4dCkgOiB2b2lkIDA7IGRlc2MuaW5pdGlhbGl6ZXIgPSB1bmRlZmluZWQ7IH0gaWYgKGRlc2MuaW5pdGlhbGl6ZXIgPT09IHZvaWQgMCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYyk7IGRlc2MgPSBudWxsOyB9IHJldHVybiBkZXNjOyB9XG4vKipcbiAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBTRk5ULWJhc2VkIGZvbnQgZm9ybWF0cyBpbiBmb250a2l0LlxuICogSXQgc3VwcG9ydHMgVHJ1ZVR5cGUsIGFuZCBQb3N0U2NyaXB0IGdseXBocywgYW5kIHNldmVyYWwgY29sb3IgZ2x5cGggZm9ybWF0cy5cbiAqL1xuXG52YXIgVFRGRm9udCA9IChfY2xhc3MkNCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIFRURkZvbnQucHJvYmUgPSBmdW5jdGlvbiBwcm9iZShidWZmZXIpIHtcbiAgICB2YXIgZm9ybWF0ID0gYnVmZmVyLnRvU3RyaW5nKCdhc2NpaScsIDAsIDQpO1xuICAgIHJldHVybiBmb3JtYXQgPT09ICd0cnVlJyB8fCBmb3JtYXQgPT09ICdPVFRPJyB8fCBmb3JtYXQgPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoMCwgMSwgMCwgMCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gVFRGRm9udChzdHJlYW0sIHZhcmlhdGlvbkNvb3Jkcykge1xuICAgIGlmICh2YXJpYXRpb25Db29yZHMgPT09IHZvaWQgMCkge1xuICAgICAgdmFyaWF0aW9uQ29vcmRzID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLnZhcmlhdGlvbkNvb3JkcyA9IHZhcmlhdGlvbkNvb3JkcztcbiAgICB0aGlzLl9kaXJlY3RvcnlQb3MgPSB0aGlzLnN0cmVhbS5wb3M7XG4gICAgdGhpcy5fdGFibGVzID0ge307XG4gICAgdGhpcy5fZ2x5cGhzID0ge307XG5cbiAgICB0aGlzLl9kZWNvZGVEaXJlY3RvcnkoKTsgLy8gZGVmaW5lIHByb3BlcnRpZXMgZm9yIGVhY2ggdGFibGUgdG8gbGF6aWx5IHBhcnNlXG5cblxuICAgIGZvciAodmFyIHRhZyBpbiB0aGlzLmRpcmVjdG9yeS50YWJsZXMpIHtcbiAgICAgIHZhciB0YWJsZSA9IHRoaXMuZGlyZWN0b3J5LnRhYmxlc1t0YWddO1xuXG4gICAgICBpZiAodGFibGVzW3RhZ10gJiYgdGFibGUubGVuZ3RoID4gMCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgdGFnLCB7XG4gICAgICAgICAgZ2V0OiB0aGlzLl9nZXRUYWJsZS5iaW5kKHRoaXMsIHRhYmxlKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvID0gVFRGRm9udC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9nZXRUYWJsZSA9IGZ1bmN0aW9uIF9nZXRUYWJsZSh0YWJsZSkge1xuICAgIGlmICghKHRhYmxlLnRhZyBpbiB0aGlzLl90YWJsZXMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl90YWJsZXNbdGFibGUudGFnXSA9IHRoaXMuX2RlY29kZVRhYmxlKHRhYmxlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGZvbnRraXQubG9nRXJyb3JzKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGRlY29kaW5nIHRhYmxlIFwiICsgdGFibGUudGFnKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUuc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlc1t0YWJsZS50YWddO1xuICB9O1xuXG4gIF9wcm90by5fZ2V0VGFibGVTdHJlYW0gPSBmdW5jdGlvbiBfZ2V0VGFibGVTdHJlYW0odGFnKSB7XG4gICAgdmFyIHRhYmxlID0gdGhpcy5kaXJlY3RvcnkudGFibGVzW3RhZ107XG5cbiAgICBpZiAodGFibGUpIHtcbiAgICAgIHRoaXMuc3RyZWFtLnBvcyA9IHRhYmxlLm9mZnNldDtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBfcHJvdG8uX2RlY29kZURpcmVjdG9yeSA9IGZ1bmN0aW9uIF9kZWNvZGVEaXJlY3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlyZWN0b3J5ID0gRGlyZWN0b3J5LmRlY29kZSh0aGlzLnN0cmVhbSwge1xuICAgICAgX3N0YXJ0T2Zmc2V0OiAwXG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLl9kZWNvZGVUYWJsZSA9IGZ1bmN0aW9uIF9kZWNvZGVUYWJsZSh0YWJsZSkge1xuICAgIHZhciBwb3MgPSB0aGlzLnN0cmVhbS5wb3M7XG5cbiAgICB2YXIgc3RyZWFtID0gdGhpcy5fZ2V0VGFibGVTdHJlYW0odGFibGUudGFnKTtcblxuICAgIHZhciByZXN1bHQgPSB0YWJsZXNbdGFibGUudGFnXS5kZWNvZGUoc3RyZWFtLCB0aGlzLCB0YWJsZS5sZW5ndGgpO1xuICAgIHRoaXMuc3RyZWFtLnBvcyA9IHBvcztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIFBvc3RTY3JpcHQgbmFtZSBmb3IgdGhpcyBmb250XG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgLyoqXG4gICAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgZm9udCdzIGBuYW1lYCB0YWJsZVxuICAgKiBgbGFuZ2AgaXMgYSBCQ1AtNDcgbGFuZ3VhZ2UgY29kZS5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgX3Byb3RvLmdldE5hbWUgPSBmdW5jdGlvbiBnZXROYW1lKGtleSwgbGFuZykge1xuICAgIGlmIChsYW5nID09PSB2b2lkIDApIHtcbiAgICAgIGxhbmcgPSAnZW4nO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0aGlzLm5hbWUucmVjb3Jkc1trZXldO1xuXG4gICAgaWYgKHJlY29yZCkge1xuICAgICAgcmV0dXJuIHJlY29yZFtsYW5nXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogVGhlIGZvbnQncyBmdWxsIG5hbWUsIGUuZy4gXCJIZWx2ZXRpY2EgQm9sZFwiXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICA7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGVyZSBpcyBnbHlwaCBpbiB0aGUgZm9udCBmb3IgdGhlIGdpdmVuIHVuaWNvZGUgY29kZSBwb2ludC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvZGVQb2ludFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgX3Byb3RvLmhhc0dseXBoRm9yQ29kZVBvaW50ID0gZnVuY3Rpb24gaGFzR2x5cGhGb3JDb2RlUG9pbnQoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuICEhdGhpcy5fY21hcFByb2Nlc3Nvci5sb29rdXAoY29kZVBvaW50KTtcbiAgfVxuICAvKipcbiAgICogTWFwcyBhIHNpbmdsZSB1bmljb2RlIGNvZGUgcG9pbnQgdG8gYSBHbHlwaCBvYmplY3QuXG4gICAqIERvZXMgbm90IHBlcmZvcm0gYW55IGFkdmFuY2VkIHN1YnN0aXR1dGlvbnMgKHRoZXJlIGlzIG5vIGNvbnRleHQgdG8gZG8gc28pLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZVBvaW50XG4gICAqIEByZXR1cm4ge0dseXBofVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5nbHlwaEZvckNvZGVQb2ludCA9IGZ1bmN0aW9uIGdseXBoRm9yQ29kZVBvaW50KGNvZGVQb2ludCkge1xuICAgIHJldHVybiB0aGlzLmdldEdseXBoKHRoaXMuX2NtYXBQcm9jZXNzb3IubG9va3VwKGNvZGVQb2ludCksIFtjb2RlUG9pbnRdKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBHbHlwaCBvYmplY3RzIGZvciB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgKiBUaGlzIGlzIG9ubHkgYSBvbmUtdG8tb25lIG1hcHBpbmcgZnJvbSBjaGFyYWN0ZXJzIHRvIGdseXBocy5cbiAgICogRm9yIG1vc3QgdXNlcywgeW91IHNob3VsZCB1c2UgZm9udC5sYXlvdXQgKGRlc2NyaWJlZCBiZWxvdyksIHdoaWNoXG4gICAqIHByb3ZpZGVzIGEgbXVjaCBtb3JlIGFkdmFuY2VkIG1hcHBpbmcgc3VwcG9ydGluZyBBQVQgYW5kIE9wZW5UeXBlIHNoYXBpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHJldHVybiB7R2x5cGhbXX1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZ2x5cGhzRm9yU3RyaW5nID0gZnVuY3Rpb24gZ2x5cGhzRm9yU3RyaW5nKHN0cmluZykge1xuICAgIHZhciBnbHlwaHMgPSBbXTtcbiAgICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aDtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgbGFzdCA9IC0xO1xuICAgIHZhciBzdGF0ZSA9IC0xO1xuXG4gICAgd2hpbGUgKGlkeCA8PSBsZW4pIHtcbiAgICAgIHZhciBjb2RlID0gMDtcbiAgICAgIHZhciBuZXh0U3RhdGUgPSAwO1xuXG4gICAgICBpZiAoaWR4IDwgbGVuKSB7XG4gICAgICAgIC8vIERlY29kZSB0aGUgbmV4dCBjb2RlcG9pbnQgZnJvbSBVVEYgMTZcbiAgICAgICAgY29kZSA9IHN0cmluZy5jaGFyQ29kZUF0KGlkeCsrKTtcblxuICAgICAgICBpZiAoMHhkODAwIDw9IGNvZGUgJiYgY29kZSA8PSAweGRiZmYgJiYgaWR4IDwgbGVuKSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBzdHJpbmcuY2hhckNvZGVBdChpZHgpO1xuXG4gICAgICAgICAgaWYgKDB4ZGMwMCA8PSBuZXh0ICYmIG5leHQgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgICBpZHgrKztcbiAgICAgICAgICAgIGNvZGUgPSAoKGNvZGUgJiAweDNmZikgPDwgMTApICsgKG5leHQgJiAweDNmZikgKyAweDEwMDAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBDb21wdXRlIHRoZSBuZXh0IHN0YXRlOiAxIGlmIHRoZSBuZXh0IGNvZGVwb2ludCBpcyBhIHZhcmlhdGlvbiBzZWxlY3RvciwgMCBvdGhlcndpc2UuXG5cblxuICAgICAgICBuZXh0U3RhdGUgPSAweGZlMDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4ZmUwZiB8fCAweGUwMTAwIDw9IGNvZGUgJiYgY29kZSA8PSAweGUwMWVmID8gMSA6IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZHgrKztcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSAwICYmIG5leHRTdGF0ZSA9PT0gMSkge1xuICAgICAgICAvLyBWYXJpYXRpb24gc2VsZWN0b3IgZm9sbG93aW5nIG5vcm1hbCBjb2RlcG9pbnQuXG4gICAgICAgIGdseXBocy5wdXNoKHRoaXMuZ2V0R2x5cGgodGhpcy5fY21hcFByb2Nlc3Nvci5sb29rdXAobGFzdCwgY29kZSksIFtsYXN0LCBjb2RlXSkpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gMCAmJiBuZXh0U3RhdGUgPT09IDApIHtcbiAgICAgICAgLy8gTm9ybWFsIGNvZGVwb2ludCBmb2xsb3dpbmcgbm9ybWFsIGNvZGVwb2ludC5cbiAgICAgICAgZ2x5cGhzLnB1c2godGhpcy5nbHlwaEZvckNvZGVQb2ludChsYXN0KSk7XG4gICAgICB9XG5cbiAgICAgIGxhc3QgPSBjb2RlO1xuICAgICAgc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdseXBocztcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhIEdseXBoUnVuIG9iamVjdCwgd2hpY2ggaW5jbHVkZXMgYW4gYXJyYXkgb2YgR2x5cGhzIGFuZCBHbHlwaFBvc2l0aW9ucyBmb3IgdGhlIGdpdmVuIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbdXNlckZlYXR1cmVzXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NjcmlwdF1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYW5ndWFnZV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkaXJlY3Rpb25dXG4gICAqIEByZXR1cm4ge0dseXBoUnVufVxuICAgKi9cbiAgX3Byb3RvLmxheW91dCA9IGZ1bmN0aW9uIGxheW91dChzdHJpbmcsIHVzZXJGZWF0dXJlcywgc2NyaXB0LCBsYW5ndWFnZSwgZGlyZWN0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheW91dEVuZ2luZS5sYXlvdXQoc3RyaW5nLCB1c2VyRmVhdHVyZXMsIHNjcmlwdCwgbGFuZ3VhZ2UsIGRpcmVjdGlvbik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IG1hcCB0byB0aGUgZ2l2ZW4gZ2x5cGggaWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBnaWQgLSBnbHlwaCBpZFxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5zdHJpbmdzRm9yR2x5cGggPSBmdW5jdGlvbiBzdHJpbmdzRm9yR2x5cGgoZ2lkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xheW91dEVuZ2luZS5zdHJpbmdzRm9yR2x5cGgoZ2lkKTtcbiAgfVxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgYWxsIFtPcGVuVHlwZSBmZWF0dXJlIHRhZ3NdKGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9vdHNwZWMvZmVhdHVyZXRhZ3MuaHRtKVxuICAgKiAob3IgbWFwcGVkIEFBVCB0YWdzKSBzdXBwb3J0ZWQgYnkgdGhlIGZvbnQuXG4gICAqIFRoZSBmZWF0dXJlcyBwYXJhbWV0ZXIgaXMgYW4gYXJyYXkgb2YgT3BlblR5cGUgZmVhdHVyZSB0YWdzIHRvIGJlIGFwcGxpZWQgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgc2V0LlxuICAgKiBJZiB0aGlzIGlzIGFuIEFBVCBmb250LCB0aGUgT3BlblR5cGUgZmVhdHVyZSB0YWdzIGFyZSBtYXBwZWQgdG8gQUFUIGZlYXR1cmVzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nW119XG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmdldEF2YWlsYWJsZUZlYXR1cmVzID0gZnVuY3Rpb24gZ2V0QXZhaWxhYmxlRmVhdHVyZXMoc2NyaXB0LCBsYW5ndWFnZSkge1xuICAgIHJldHVybiB0aGlzLl9sYXlvdXRFbmdpbmUuZ2V0QXZhaWxhYmxlRmVhdHVyZXMoc2NyaXB0LCBsYW5ndWFnZSk7XG4gIH07XG5cbiAgX3Byb3RvLl9nZXRCYXNlR2x5cGggPSBmdW5jdGlvbiBfZ2V0QmFzZUdseXBoKGdseXBoLCBjaGFyYWN0ZXJzKSB7XG4gICAgaWYgKGNoYXJhY3RlcnMgPT09IHZvaWQgMCkge1xuICAgICAgY2hhcmFjdGVycyA9IFtdO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZ2x5cGhzW2dseXBoXSkge1xuICAgICAgaWYgKHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5nbHlmKSB7XG4gICAgICAgIHRoaXMuX2dseXBoc1tnbHlwaF0gPSBuZXcgVFRGR2x5cGgoZ2x5cGgsIGNoYXJhY3RlcnMsIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpcmVjdG9yeS50YWJsZXNbJ0NGRiAnXSB8fCB0aGlzLmRpcmVjdG9yeS50YWJsZXMuQ0ZGMikge1xuICAgICAgICB0aGlzLl9nbHlwaHNbZ2x5cGhdID0gbmV3IENGRkdseXBoKGdseXBoLCBjaGFyYWN0ZXJzLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2x5cGhzW2dseXBoXSB8fCBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZ2x5cGggb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZ2x5cGggaWQuXG4gICAqIFlvdSBjYW4gcGFzcyB0aGUgYXJyYXkgb2YgY29kZSBwb2ludHMgdGhpcyBnbHlwaCByZXByZXNlbnRzIGZvclxuICAgKiB5b3VyIHVzZSBsYXRlciwgYW5kIGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBnbHlwaCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBnbHlwaFxuICAgKiBAcGFyYW0ge251bWJlcltdfSBjaGFyYWN0ZXJzXG4gICAqIEByZXR1cm4ge0dseXBofVxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5nZXRHbHlwaCA9IGZ1bmN0aW9uIGdldEdseXBoKGdseXBoLCBjaGFyYWN0ZXJzKSB7XG4gICAgaWYgKGNoYXJhY3RlcnMgPT09IHZvaWQgMCkge1xuICAgICAgY2hhcmFjdGVycyA9IFtdO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZ2x5cGhzW2dseXBoXSkge1xuICAgICAgaWYgKHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5zYml4KSB7XG4gICAgICAgIHRoaXMuX2dseXBoc1tnbHlwaF0gPSBuZXcgU0JJWEdseXBoKGdseXBoLCBjaGFyYWN0ZXJzLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXJlY3RvcnkudGFibGVzLkNPTFIgJiYgdGhpcy5kaXJlY3RvcnkudGFibGVzLkNQQUwpIHtcbiAgICAgICAgdGhpcy5fZ2x5cGhzW2dseXBoXSA9IG5ldyBDT0xSR2x5cGgoZ2x5cGgsIGNoYXJhY3RlcnMsIHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZ2V0QmFzZUdseXBoKGdseXBoLCBjaGFyYWN0ZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2x5cGhzW2dseXBoXSB8fCBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgU3Vic2V0IGZvciB0aGlzIGZvbnQuXG4gICAqIEByZXR1cm4ge1N1YnNldH1cbiAgICovXG4gIDtcblxuICBfcHJvdG8uY3JlYXRlU3Vic2V0ID0gZnVuY3Rpb24gY3JlYXRlU3Vic2V0KCkge1xuICAgIGlmICh0aGlzLmRpcmVjdG9yeS50YWJsZXNbJ0NGRiAnXSkge1xuICAgICAgcmV0dXJuIG5ldyBDRkZTdWJzZXQodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUVEZTdWJzZXQodGhpcyk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGF2YWlsYWJsZSB2YXJpYXRpb24gYXhlc1xuICAgKiB0aGF0IHRoaXMgZm9udCBzdXBwb3J0cy4gS2V5cyBhcmUgc2V0dGluZyB0YWdzLCBhbmQgdmFsdWVzXG4gICAqIGNvbnRhaW4gdGhlIGF4aXMgbmFtZSwgcmFuZ2UsIGFuZCBkZWZhdWx0IHZhbHVlLlxuICAgKlxuICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgKi9cbiAgO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbmV3IGZvbnQgd2l0aCB0aGUgZ2l2ZW4gdmFyaWF0aW9uIHNldHRpbmdzIGFwcGxpZWQuXG4gICAqIFNldHRpbmdzIGNhbiBlaXRoZXIgYmUgYW4gaW5zdGFuY2UgbmFtZSwgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmdcbiAgICogdmFyaWF0aW9uIHRhZ3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSBgdmFyaWF0aW9uQXhlc2AgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5nc1xuICAgKiBAcmV0dXJuIHtUVEZGb250fVxuICAgKi9cbiAgX3Byb3RvLmdldFZhcmlhdGlvbiA9IGZ1bmN0aW9uIGdldFZhcmlhdGlvbihzZXR0aW5ncykge1xuICAgIGlmICghKHRoaXMuZGlyZWN0b3J5LnRhYmxlcy5mdmFyICYmICh0aGlzLmRpcmVjdG9yeS50YWJsZXMuZ3ZhciAmJiB0aGlzLmRpcmVjdG9yeS50YWJsZXMuZ2x5ZiB8fCB0aGlzLmRpcmVjdG9yeS50YWJsZXMuQ0ZGMikpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhcmlhdGlvbnMgcmVxdWlyZSBhIGZvbnQgd2l0aCB0aGUgZnZhciwgZ3ZhciBhbmQgZ2x5Ziwgb3IgQ0ZGMiB0YWJsZXMuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzZXR0aW5ncyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNldHRpbmdzID0gdGhpcy5uYW1lZFZhcmlhdGlvbnNbc2V0dGluZ3NdO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhcmlhdGlvbiBzZXR0aW5ncyBtdXN0IGJlIGVpdGhlciBhIHZhcmlhdGlvbiBuYW1lIG9yIHNldHRpbmdzIG9iamVjdC4nKTtcbiAgICB9IC8vIG5vcm1hbGl6ZSB0aGUgY29vcmRpbmF0ZXNcblxuXG4gICAgdmFyIGNvb3JkcyA9IHRoaXMuZnZhci5heGlzLm1hcChmdW5jdGlvbiAoYXhpcywgaSkge1xuICAgICAgdmFyIGF4aXNUYWcgPSBheGlzLmF4aXNUYWcudHJpbSgpO1xuXG4gICAgICBpZiAoYXhpc1RhZyBpbiBzZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoYXhpcy5taW5WYWx1ZSwgTWF0aC5taW4oYXhpcy5tYXhWYWx1ZSwgc2V0dGluZ3NbYXhpc1RhZ10pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBheGlzLmRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgc3RyZWFtID0gbmV3IHJlc3RydWN0dXJlLkRlY29kZVN0cmVhbSh0aGlzLnN0cmVhbS5idWZmZXIpO1xuICAgIHN0cmVhbS5wb3MgPSB0aGlzLl9kaXJlY3RvcnlQb3M7XG4gICAgdmFyIGZvbnQgPSBuZXcgVFRGRm9udChzdHJlYW0sIGNvb3Jkcyk7XG4gICAgZm9udC5fdGFibGVzID0gdGhpcy5fdGFibGVzO1xuICAgIHJldHVybiBmb250O1xuICB9O1xuXG4gIC8vIFN0YW5kYXJkaXplZCBmb3JtYXQgcGx1Z2luIEFQSVxuICBfcHJvdG8uZ2V0Rm9udCA9IGZ1bmN0aW9uIGdldEZvbnQobmFtZSkge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhdGlvbihuYW1lKTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MkOChUVEZGb250LCBbe1xuICAgIGtleTogXCJwb3N0c2NyaXB0TmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIG5hbWUgPSB0aGlzLm5hbWUucmVjb3Jkcy5wb3N0c2NyaXB0TmFtZTtcblxuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgdmFyIGxhbmcgPSBPYmplY3Qua2V5cyhuYW1lKVswXTtcbiAgICAgICAgcmV0dXJuIG5hbWVbbGFuZ107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmdWxsTmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgnZnVsbE5hbWUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZvbnQncyBmYW1pbHkgbmFtZSwgZS5nLiBcIkhlbHZldGljYVwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImZhbWlseU5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE5hbWUoJ2ZvbnRGYW1pbHknKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZvbnQncyBzdWItZmFtaWx5LCBlLmcuIFwiQm9sZFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzdWJmYW1pbHlOYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROYW1lKCdmb250U3ViZmFtaWx5Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmb250J3MgY29weXJpZ2h0IGluZm9ybWF0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNvcHlyaWdodFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgnY29weXJpZ2h0Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmb250J3MgdmVyc2lvbiBudW1iZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidmVyc2lvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgndmVyc2lvbicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZm9udOKAmXMgW2FzY2VuZGVyXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Bc2NlbmRlcl8odHlwb2dyYXBoeSkpXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFzY2VudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGhlYS5hc2NlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmb2504oCZcyBbZGVzY2VuZGVyXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZXNjZW5kZXIpXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlc2NlbnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhoZWEuZGVzY2VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBzcGFjZSB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBiZXR3ZWVuIGxpbmVzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImxpbmVHYXBcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhoZWEubGluZUdhcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG9mZnNldCBmcm9tIHRoZSBub3JtYWwgdW5kZXJsaW5lIHBvc2l0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidW5kZXJsaW5lUG9zaXRpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvc3QudW5kZXJsaW5lUG9zaXRpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB3ZWlnaHQgb2YgdGhlIHVuZGVybGluZSB0aGF0IHNob3VsZCBiZSB1c2VkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVuZGVybGluZVRoaWNrbmVzc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zdC51bmRlcmxpbmVUaGlja25lc3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgaXMgYW4gaXRhbGljIGZvbnQsIHRoZSBhbmdsZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBkcmF3biBhdCB0byBtYXRjaCB0aGUgZm9udCBkZXNpZ25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXRhbGljQW5nbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvc3QuaXRhbGljQW5nbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBoZWlnaHQgb2YgY2FwaXRhbCBsZXR0ZXJzIGFib3ZlIHRoZSBiYXNlbGluZS5cbiAgICAgKiBTZWUgW2hlcmVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhcF9oZWlnaHQpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNhcEhlaWdodFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIG9zMiA9IHRoaXNbJ09TLzInXTtcbiAgICAgIHJldHVybiBvczIgPyBvczIuY2FwSGVpZ2h0IDogdGhpcy5hc2NlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBoZWlnaHQgb2YgbG93ZXIgY2FzZSBsZXR0ZXJzIGluIHRoZSBmb250LlxuICAgICAqIFNlZSBbaGVyZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWC1oZWlnaHQpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInhIZWlnaHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBvczIgPSB0aGlzWydPUy8yJ107XG4gICAgICByZXR1cm4gb3MyID8gb3MyLnhIZWlnaHQgOiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgZm9udC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibnVtR2x5cGhzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXhwLm51bUdseXBocztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhlIGZvbnTigJlzIGludGVybmFsIGNvb3JkaW5hdGUgZ3JpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bml0c1BlckVtXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZWFkLnVuaXRzUGVyRW07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmb2504oCZcyBib3VuZGluZyBib3gsIGkuZS4gdGhlIGJveCB0aGF0IGVuY2xvc2VzIGFsbCBnbHlwaHMgaW4gdGhlIGZvbnQuXG4gICAgICogQHR5cGUge0JCb3h9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJiYm94XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShuZXcgQkJveCh0aGlzLmhlYWQueE1pbiwgdGhpcy5oZWFkLnlNaW4sIHRoaXMuaGVhZC54TWF4LCB0aGlzLmhlYWQueU1heCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY21hcFByb2Nlc3NvclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG5ldyBDbWFwUHJvY2Vzc29yKHRoaXMuY21hcCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFsbCBvZiB0aGUgdW5pY29kZSBjb2RlIHBvaW50cyBzdXBwb3J0ZWQgYnkgdGhlIGZvbnQuXG4gICAgICogQHR5cGUge251bWJlcltdfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2hhcmFjdGVyU2V0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY21hcFByb2Nlc3Nvci5nZXRDaGFyYWN0ZXJTZXQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2xheW91dEVuZ2luZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG5ldyBMYXlvdXRFbmdpbmUodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImF2YWlsYWJsZUZlYXR1cmVzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGF5b3V0RW5naW5lLmdldEF2YWlsYWJsZUZlYXR1cmVzKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInZhcmlhdGlvbkF4ZXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciByZXMgPSB7fTtcblxuICAgICAgaWYgKCF0aGlzLmZ2YXIpIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRxKHRoaXMuZnZhci5heGlzKSwgX3N0ZXA7ICEoX3N0ZXAgPSBfaXRlcmF0b3IoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIGF4aXMgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgcmVzW2F4aXMuYXhpc1RhZy50cmltKCldID0ge1xuICAgICAgICAgIG5hbWU6IGF4aXMubmFtZS5lbixcbiAgICAgICAgICBtaW46IGF4aXMubWluVmFsdWUsXG4gICAgICAgICAgXCJkZWZhdWx0XCI6IGF4aXMuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgIG1heDogYXhpcy5tYXhWYWx1ZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSBuYW1lZCB2YXJpYXRpb24gaW5zdGFuY2VzXG4gICAgICogdGhhdCB0aGUgZm9udCBkZXNpZ25lciBoYXMgc3BlY2lmaWVkLiBLZXlzIGFyZSB2YXJpYXRpb24gbmFtZXNcbiAgICAgKiBhbmQgdmFsdWVzIGFyZSB0aGUgdmFyaWF0aW9uIHNldHRpbmdzIGZvciB0aGlzIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm5hbWVkVmFyaWF0aW9uc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIHJlcyA9IHt9O1xuXG4gICAgICBpZiAoIXRoaXMuZnZhcikge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSRxKHRoaXMuZnZhci5pbnN0YW5jZSksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IF9zdGVwMi52YWx1ZTtcbiAgICAgICAgdmFyIHNldHRpbmdzID0ge307XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZ2YXIuYXhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBheGlzID0gdGhpcy5mdmFyLmF4aXNbaV07XG4gICAgICAgICAgc2V0dGluZ3NbYXhpcy5heGlzVGFnLnRyaW0oKV0gPSBpbnN0YW5jZS5jb29yZFtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc1tpbnN0YW5jZS5uYW1lLmVuXSA9IHNldHRpbmdzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdmFyaWF0aW9uUHJvY2Vzc29yXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoIXRoaXMuZnZhcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhcmlhdGlvbkNvb3JkcyA9IHRoaXMudmFyaWF0aW9uQ29vcmRzOyAvLyBJZ25vcmUgaWYgbm8gdmFyaWF0aW9uIGNvb3JkcyBhbmQgbm90IENGRjJcblxuICAgICAgaWYgKCF2YXJpYXRpb25Db29yZHMgJiYgIXRoaXMuQ0ZGMikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCF2YXJpYXRpb25Db29yZHMpIHtcbiAgICAgICAgdmFyaWF0aW9uQ29vcmRzID0gdGhpcy5mdmFyLmF4aXMubWFwKGZ1bmN0aW9uIChheGlzKSB7XG4gICAgICAgICAgcmV0dXJuIGF4aXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBHbHlwaFZhcmlhdGlvblByb2Nlc3Nvcih0aGlzLCB2YXJpYXRpb25Db29yZHMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUVEZGb250O1xufSgpLCAoX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQ0KF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJiYm94XCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDQucHJvdG90eXBlLCBcImJib3hcIiksIF9jbGFzcyQ0LnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkNChfY2xhc3MkNC5wcm90b3R5cGUsIFwiX2NtYXBQcm9jZXNzb3JcIiwgW2NhY2hlXSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihfY2xhc3MkNC5wcm90b3R5cGUsIFwiX2NtYXBQcm9jZXNzb3JcIiksIF9jbGFzcyQ0LnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkNChfY2xhc3MkNC5wcm90b3R5cGUsIFwiY2hhcmFjdGVyU2V0XCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDQucHJvdG90eXBlLCBcImNoYXJhY3RlclNldFwiKSwgX2NsYXNzJDQucHJvdG90eXBlKSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciQ0KF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJfbGF5b3V0RW5naW5lXCIsIFtjYWNoZV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX2NsYXNzJDQucHJvdG90eXBlLCBcIl9sYXlvdXRFbmdpbmVcIiksIF9jbGFzcyQ0LnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkNChfY2xhc3MkNC5wcm90b3R5cGUsIFwidmFyaWF0aW9uQXhlc1wiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJ2YXJpYXRpb25BeGVzXCIpLCBfY2xhc3MkNC5wcm90b3R5cGUpLCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yJDQoX2NsYXNzJDQucHJvdG90eXBlLCBcIm5hbWVkVmFyaWF0aW9uc1wiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJuYW1lZFZhcmlhdGlvbnNcIiksIF9jbGFzcyQ0LnByb3RvdHlwZSksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IkNChfY2xhc3MkNC5wcm90b3R5cGUsIFwiX3ZhcmlhdGlvblByb2Nlc3NvclwiLCBbY2FjaGVdLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF9jbGFzcyQ0LnByb3RvdHlwZSwgXCJfdmFyaWF0aW9uUHJvY2Vzc29yXCIpLCBfY2xhc3MkNC5wcm90b3R5cGUpKSwgX2NsYXNzJDQpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHIobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JHIobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JHIobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRyKG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkcihvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JHIoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG52YXIgV09GRkRpcmVjdG9yeUVudHJ5ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHRhZzogbmV3IHJlc3RydWN0dXJlLlN0cmluZyg0KSxcbiAgb2Zmc2V0OiBuZXcgcmVzdHJ1Y3R1cmUuUG9pbnRlcihyZXN0cnVjdHVyZS51aW50MzIsICd2b2lkJywge1xuICAgIHR5cGU6ICdnbG9iYWwnXG4gIH0pLFxuICBjb21wTGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBvcmlnQ2hlY2tzdW06IHJlc3RydWN0dXJlLnVpbnQzMlxufSk7XG52YXIgV09GRkRpcmVjdG9yeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIC8vIHNob3VsZCBiZSAnd09GRidcbiAgZmxhdm9yOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBudW1UYWJsZXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICB0b3RhbFNmbnRTaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG1ham9yVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtaW5vclZlcnNpb246IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbWV0YU9mZnNldDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBtZXRhTGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG1ldGFPcmlnTGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHByaXZPZmZzZXQ6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgcHJpdkxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICB0YWJsZXM6IG5ldyByZXN0cnVjdHVyZS5BcnJheShXT0ZGRGlyZWN0b3J5RW50cnksICdudW1UYWJsZXMnKVxufSk7XG5cbldPRkZEaXJlY3RvcnkucHJvY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRhYmxlcyA9IHt9O1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2Ukcih0aGlzLnRhYmxlcyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgdmFyIHRhYmxlID0gX3N0ZXAudmFsdWU7XG4gICAgdGFibGVzW3RhYmxlLnRhZ10gPSB0YWJsZTtcbiAgfVxuXG4gIHRoaXMudGFibGVzID0gdGFibGVzO1xufTtcblxudmFyIFRJTkZfT0skMSA9IDA7XG52YXIgVElORl9EQVRBX0VSUk9SJDEgPSAtMztcblxuZnVuY3Rpb24gVHJlZSQxKCkge1xuICB0aGlzLnRhYmxlID0gbmV3IFVpbnQxNkFycmF5KDE2KTtcbiAgLyogdGFibGUgb2YgY29kZSBsZW5ndGggY291bnRzICovXG5cbiAgdGhpcy50cmFucyA9IG5ldyBVaW50MTZBcnJheSgyODgpO1xuICAvKiBjb2RlIC0+IHN5bWJvbCB0cmFuc2xhdGlvbiB0YWJsZSAqL1xufVxuXG5mdW5jdGlvbiBEYXRhJDEoc291cmNlLCBkZXN0KSB7XG4gIHRoaXMuc291cmNlID0gc291cmNlO1xuICB0aGlzLnNvdXJjZUluZGV4ID0gMDtcbiAgdGhpcy50YWcgPSAwO1xuICB0aGlzLmJpdGNvdW50ID0gMDtcbiAgdGhpcy5kZXN0ID0gZGVzdDtcbiAgdGhpcy5kZXN0TGVuID0gMDtcbiAgdGhpcy5sdHJlZSA9IG5ldyBUcmVlJDEoKTtcbiAgLyogZHluYW1pYyBsZW5ndGgvc3ltYm9sIHRyZWUgKi9cblxuICB0aGlzLmR0cmVlID0gbmV3IFRyZWUkMSgpO1xuICAvKiBkeW5hbWljIGRpc3RhbmNlIHRyZWUgKi9cbn1cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSB1bmluaXRpYWxpemVkIGdsb2JhbCBkYXRhIChzdGF0aWMgc3RydWN0dXJlcykgLS0gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblxudmFyIHNsdHJlZSQxID0gbmV3IFRyZWUkMSgpO1xudmFyIHNkdHJlZSQxID0gbmV3IFRyZWUkMSgpO1xuLyogZXh0cmEgYml0cyBhbmQgYmFzZSB0YWJsZXMgZm9yIGxlbmd0aCBjb2RlcyAqL1xuXG52YXIgbGVuZ3RoX2JpdHMkMSA9IG5ldyBVaW50OEFycmF5KDMwKTtcbnZhciBsZW5ndGhfYmFzZSQxID0gbmV3IFVpbnQxNkFycmF5KDMwKTtcbi8qIGV4dHJhIGJpdHMgYW5kIGJhc2UgdGFibGVzIGZvciBkaXN0YW5jZSBjb2RlcyAqL1xuXG52YXIgZGlzdF9iaXRzJDEgPSBuZXcgVWludDhBcnJheSgzMCk7XG52YXIgZGlzdF9iYXNlJDEgPSBuZXcgVWludDE2QXJyYXkoMzApO1xuLyogc3BlY2lhbCBvcmRlcmluZyBvZiBjb2RlIGxlbmd0aCBjb2RlcyAqL1xuXG52YXIgY2xjaWR4JDEgPSBuZXcgVWludDhBcnJheShbMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNV0pO1xuLyogdXNlZCBieSB0aW5mX2RlY29kZV90cmVlcywgYXZvaWRzIGFsbG9jYXRpb25zIGV2ZXJ5IGNhbGwgKi9cblxudmFyIGNvZGVfdHJlZSQxID0gbmV3IFRyZWUkMSgpO1xudmFyIGxlbmd0aHMkMSA9IG5ldyBVaW50OEFycmF5KDI4OCArIDMyKTtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICpcbiAqIC0tIHV0aWxpdHkgZnVuY3Rpb25zIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qIGJ1aWxkIGV4dHJhIGJpdHMgYW5kIGJhc2UgdGFibGVzICovXG5cbmZ1bmN0aW9uIHRpbmZfYnVpbGRfYml0c19iYXNlJDEoYml0cywgYmFzZSwgZGVsdGEsIGZpcnN0KSB7XG4gIHZhciBpLCBzdW07XG4gIC8qIGJ1aWxkIGJpdHMgdGFibGUgKi9cblxuICBmb3IgKGkgPSAwOyBpIDwgZGVsdGE7ICsraSkge1xuICAgIGJpdHNbaV0gPSAwO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IDMwIC0gZGVsdGE7ICsraSkge1xuICAgIGJpdHNbaSArIGRlbHRhXSA9IGkgLyBkZWx0YSB8IDA7XG4gIH1cbiAgLyogYnVpbGQgYmFzZSB0YWJsZSAqL1xuXG5cbiAgZm9yIChzdW0gPSBmaXJzdCwgaSA9IDA7IGkgPCAzMDsgKytpKSB7XG4gICAgYmFzZVtpXSA9IHN1bTtcbiAgICBzdW0gKz0gMSA8PCBiaXRzW2ldO1xuICB9XG59XG4vKiBidWlsZCB0aGUgZml4ZWQgaHVmZm1hbiB0cmVlcyAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfYnVpbGRfZml4ZWRfdHJlZXMkMShsdCwgZHQpIHtcbiAgdmFyIGk7XG4gIC8qIGJ1aWxkIGZpeGVkIGxlbmd0aCB0cmVlICovXG5cbiAgZm9yIChpID0gMDsgaSA8IDc7ICsraSkge1xuICAgIGx0LnRhYmxlW2ldID0gMDtcbiAgfVxuXG4gIGx0LnRhYmxlWzddID0gMjQ7XG4gIGx0LnRhYmxlWzhdID0gMTUyO1xuICBsdC50YWJsZVs5XSA9IDExMjtcblxuICBmb3IgKGkgPSAwOyBpIDwgMjQ7ICsraSkge1xuICAgIGx0LnRyYW5zW2ldID0gMjU2ICsgaTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCAxNDQ7ICsraSkge1xuICAgIGx0LnRyYW5zWzI0ICsgaV0gPSBpO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkge1xuICAgIGx0LnRyYW5zWzI0ICsgMTQ0ICsgaV0gPSAyODAgKyBpO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IDExMjsgKytpKSB7XG4gICAgbHQudHJhbnNbMjQgKyAxNDQgKyA4ICsgaV0gPSAxNDQgKyBpO1xuICB9XG4gIC8qIGJ1aWxkIGZpeGVkIGRpc3RhbmNlIHRyZWUgKi9cblxuXG4gIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHtcbiAgICBkdC50YWJsZVtpXSA9IDA7XG4gIH1cblxuICBkdC50YWJsZVs1XSA9IDMyO1xuXG4gIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKSB7XG4gICAgZHQudHJhbnNbaV0gPSBpO1xuICB9XG59XG4vKiBnaXZlbiBhbiBhcnJheSBvZiBjb2RlIGxlbmd0aHMsIGJ1aWxkIGEgdHJlZSAqL1xuXG5cbnZhciBvZmZzJDEgPSBuZXcgVWludDE2QXJyYXkoMTYpO1xuXG5mdW5jdGlvbiB0aW5mX2J1aWxkX3RyZWUkMSh0LCBsZW5ndGhzLCBvZmYsIG51bSkge1xuICB2YXIgaSwgc3VtO1xuICAvKiBjbGVhciBjb2RlIGxlbmd0aCBjb3VudCB0YWJsZSAqL1xuXG4gIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgdC50YWJsZVtpXSA9IDA7XG4gIH1cbiAgLyogc2NhbiBzeW1ib2wgbGVuZ3RocywgYW5kIHN1bSBjb2RlIGxlbmd0aCBjb3VudHMgKi9cblxuXG4gIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSkge1xuICAgIHQudGFibGVbbGVuZ3Roc1tvZmYgKyBpXV0rKztcbiAgfVxuXG4gIHQudGFibGVbMF0gPSAwO1xuICAvKiBjb21wdXRlIG9mZnNldCB0YWJsZSBmb3IgZGlzdHJpYnV0aW9uIHNvcnQgKi9cblxuICBmb3IgKHN1bSA9IDAsIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgIG9mZnMkMVtpXSA9IHN1bTtcbiAgICBzdW0gKz0gdC50YWJsZVtpXTtcbiAgfVxuICAvKiBjcmVhdGUgY29kZS0+c3ltYm9sIHRyYW5zbGF0aW9uIHRhYmxlIChzeW1ib2xzIHNvcnRlZCBieSBjb2RlKSAqL1xuXG5cbiAgZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7XG4gICAgaWYgKGxlbmd0aHNbb2ZmICsgaV0pIHQudHJhbnNbb2ZmcyQxW2xlbmd0aHNbb2ZmICsgaV1dKytdID0gaTtcbiAgfVxufVxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqXG4gKiAtLSBkZWNvZGUgZnVuY3Rpb25zIC0tICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogZ2V0IG9uZSBiaXQgZnJvbSBzb3VyY2Ugc3RyZWFtICovXG5cblxuZnVuY3Rpb24gdGluZl9nZXRiaXQkMShkKSB7XG4gIC8qIGNoZWNrIGlmIHRhZyBpcyBlbXB0eSAqL1xuICBpZiAoIWQuYml0Y291bnQtLSkge1xuICAgIC8qIGxvYWQgbmV4dCB0YWcgKi9cbiAgICBkLnRhZyA9IGQuc291cmNlW2Quc291cmNlSW5kZXgrK107XG4gICAgZC5iaXRjb3VudCA9IDc7XG4gIH1cbiAgLyogc2hpZnQgYml0IG91dCBvZiB0YWcgKi9cblxuXG4gIHZhciBiaXQgPSBkLnRhZyAmIDE7XG4gIGQudGFnID4+Pj0gMTtcbiAgcmV0dXJuIGJpdDtcbn1cbi8qIHJlYWQgYSBudW0gYml0IHZhbHVlIGZyb20gYSBzdHJlYW0gYW5kIGFkZCBiYXNlICovXG5cblxuZnVuY3Rpb24gdGluZl9yZWFkX2JpdHMkMShkLCBudW0sIGJhc2UpIHtcbiAgaWYgKCFudW0pIHJldHVybiBiYXNlO1xuXG4gIHdoaWxlIChkLmJpdGNvdW50IDwgMjQpIHtcbiAgICBkLnRhZyB8PSBkLnNvdXJjZVtkLnNvdXJjZUluZGV4KytdIDw8IGQuYml0Y291bnQ7XG4gICAgZC5iaXRjb3VudCArPSA4O1xuICB9XG5cbiAgdmFyIHZhbCA9IGQudGFnICYgMHhmZmZmID4+PiAxNiAtIG51bTtcbiAgZC50YWcgPj4+PSBudW07XG4gIGQuYml0Y291bnQgLT0gbnVtO1xuICByZXR1cm4gdmFsICsgYmFzZTtcbn1cbi8qIGdpdmVuIGEgZGF0YSBzdHJlYW0gYW5kIGEgdHJlZSwgZGVjb2RlIGEgc3ltYm9sICovXG5cblxuZnVuY3Rpb24gdGluZl9kZWNvZGVfc3ltYm9sJDEoZCwgdCkge1xuICB3aGlsZSAoZC5iaXRjb3VudCA8IDI0KSB7XG4gICAgZC50YWcgfD0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCsrXSA8PCBkLmJpdGNvdW50O1xuICAgIGQuYml0Y291bnQgKz0gODtcbiAgfVxuXG4gIHZhciBzdW0gPSAwLFxuICAgICAgY3VyID0gMCxcbiAgICAgIGxlbiA9IDA7XG4gIHZhciB0YWcgPSBkLnRhZztcbiAgLyogZ2V0IG1vcmUgYml0cyB3aGlsZSBjb2RlIHZhbHVlIGlzIGFib3ZlIHN1bSAqL1xuXG4gIGRvIHtcbiAgICBjdXIgPSAyICogY3VyICsgKHRhZyAmIDEpO1xuICAgIHRhZyA+Pj49IDE7XG4gICAgKytsZW47XG4gICAgc3VtICs9IHQudGFibGVbbGVuXTtcbiAgICBjdXIgLT0gdC50YWJsZVtsZW5dO1xuICB9IHdoaWxlIChjdXIgPj0gMCk7XG5cbiAgZC50YWcgPSB0YWc7XG4gIGQuYml0Y291bnQgLT0gbGVuO1xuICByZXR1cm4gdC50cmFuc1tzdW0gKyBjdXJdO1xufVxuLyogZ2l2ZW4gYSBkYXRhIHN0cmVhbSwgZGVjb2RlIGR5bmFtaWMgdHJlZXMgZnJvbSBpdCAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfZGVjb2RlX3RyZWVzJDEoZCwgbHQsIGR0KSB7XG4gIHZhciBobGl0LCBoZGlzdCwgaGNsZW47XG4gIHZhciBpLCBudW0sIGxlbmd0aDtcbiAgLyogZ2V0IDUgYml0cyBITElUICgyNTctMjg2KSAqL1xuXG4gIGhsaXQgPSB0aW5mX3JlYWRfYml0cyQxKGQsIDUsIDI1Nyk7XG4gIC8qIGdldCA1IGJpdHMgSERJU1QgKDEtMzIpICovXG5cbiAgaGRpc3QgPSB0aW5mX3JlYWRfYml0cyQxKGQsIDUsIDEpO1xuICAvKiBnZXQgNCBiaXRzIEhDTEVOICg0LTE5KSAqL1xuXG4gIGhjbGVuID0gdGluZl9yZWFkX2JpdHMkMShkLCA0LCA0KTtcblxuICBmb3IgKGkgPSAwOyBpIDwgMTk7ICsraSkge1xuICAgIGxlbmd0aHMkMVtpXSA9IDA7XG4gIH1cbiAgLyogcmVhZCBjb2RlIGxlbmd0aHMgZm9yIGNvZGUgbGVuZ3RoIGFscGhhYmV0ICovXG5cblxuICBmb3IgKGkgPSAwOyBpIDwgaGNsZW47ICsraSkge1xuICAgIC8qIGdldCAzIGJpdHMgY29kZSBsZW5ndGggKDAtNykgKi9cbiAgICB2YXIgY2xlbiA9IHRpbmZfcmVhZF9iaXRzJDEoZCwgMywgMCk7XG4gICAgbGVuZ3RocyQxW2NsY2lkeCQxW2ldXSA9IGNsZW47XG4gIH1cbiAgLyogYnVpbGQgY29kZSBsZW5ndGggdHJlZSAqL1xuXG5cbiAgdGluZl9idWlsZF90cmVlJDEoY29kZV90cmVlJDEsIGxlbmd0aHMkMSwgMCwgMTkpO1xuICAvKiBkZWNvZGUgY29kZSBsZW5ndGhzIGZvciB0aGUgZHluYW1pYyB0cmVlcyAqL1xuXG4gIGZvciAobnVtID0gMDsgbnVtIDwgaGxpdCArIGhkaXN0Oykge1xuICAgIHZhciBzeW0gPSB0aW5mX2RlY29kZV9zeW1ib2wkMShkLCBjb2RlX3RyZWUkMSk7XG5cbiAgICBzd2l0Y2ggKHN5bSkge1xuICAgICAgY2FzZSAxNjpcbiAgICAgICAgLyogY29weSBwcmV2aW91cyBjb2RlIGxlbmd0aCAzLTYgdGltZXMgKHJlYWQgMiBiaXRzKSAqL1xuICAgICAgICB2YXIgcHJldiA9IGxlbmd0aHMkMVtudW0gLSAxXTtcblxuICAgICAgICBmb3IgKGxlbmd0aCA9IHRpbmZfcmVhZF9iaXRzJDEoZCwgMiwgMyk7IGxlbmd0aDsgLS1sZW5ndGgpIHtcbiAgICAgICAgICBsZW5ndGhzJDFbbnVtKytdID0gcHJldjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDE3OlxuICAgICAgICAvKiByZXBlYXQgY29kZSBsZW5ndGggMCBmb3IgMy0xMCB0aW1lcyAocmVhZCAzIGJpdHMpICovXG4gICAgICAgIGZvciAobGVuZ3RoID0gdGluZl9yZWFkX2JpdHMkMShkLCAzLCAzKTsgbGVuZ3RoOyAtLWxlbmd0aCkge1xuICAgICAgICAgIGxlbmd0aHMkMVtudW0rK10gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMTg6XG4gICAgICAgIC8qIHJlcGVhdCBjb2RlIGxlbmd0aCAwIGZvciAxMS0xMzggdGltZXMgKHJlYWQgNyBiaXRzKSAqL1xuICAgICAgICBmb3IgKGxlbmd0aCA9IHRpbmZfcmVhZF9iaXRzJDEoZCwgNywgMTEpOyBsZW5ndGg7IC0tbGVuZ3RoKSB7XG4gICAgICAgICAgbGVuZ3RocyQxW251bSsrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogdmFsdWVzIDAtMTUgcmVwcmVzZW50IHRoZSBhY3R1YWwgY29kZSBsZW5ndGhzICovXG4gICAgICAgIGxlbmd0aHMkMVtudW0rK10gPSBzeW07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvKiBidWlsZCBkeW5hbWljIHRyZWVzICovXG5cblxuICB0aW5mX2J1aWxkX3RyZWUkMShsdCwgbGVuZ3RocyQxLCAwLCBobGl0KTtcbiAgdGluZl9idWlsZF90cmVlJDEoZHQsIGxlbmd0aHMkMSwgaGxpdCwgaGRpc3QpO1xufVxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKlxuICogLS0gYmxvY2sgaW5mbGF0ZSBmdW5jdGlvbnMgLS0gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogZ2l2ZW4gYSBzdHJlYW0gYW5kIHR3byB0cmVlcywgaW5mbGF0ZSBhIGJsb2NrIG9mIGRhdGEgKi9cblxuXG5mdW5jdGlvbiB0aW5mX2luZmxhdGVfYmxvY2tfZGF0YSQxKGQsIGx0LCBkdCkge1xuICB3aGlsZSAoMSkge1xuICAgIHZhciBzeW0gPSB0aW5mX2RlY29kZV9zeW1ib2wkMShkLCBsdCk7XG4gICAgLyogY2hlY2sgZm9yIGVuZCBvZiBibG9jayAqL1xuXG4gICAgaWYgKHN5bSA9PT0gMjU2KSB7XG4gICAgICByZXR1cm4gVElORl9PSyQxO1xuICAgIH1cblxuICAgIGlmIChzeW0gPCAyNTYpIHtcbiAgICAgIGQuZGVzdFtkLmRlc3RMZW4rK10gPSBzeW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsZW5ndGgsIGRpc3QsIG9mZnM7XG4gICAgICB2YXIgaTtcbiAgICAgIHN5bSAtPSAyNTc7XG4gICAgICAvKiBwb3NzaWJseSBnZXQgbW9yZSBiaXRzIGZyb20gbGVuZ3RoIGNvZGUgKi9cblxuICAgICAgbGVuZ3RoID0gdGluZl9yZWFkX2JpdHMkMShkLCBsZW5ndGhfYml0cyQxW3N5bV0sIGxlbmd0aF9iYXNlJDFbc3ltXSk7XG4gICAgICBkaXN0ID0gdGluZl9kZWNvZGVfc3ltYm9sJDEoZCwgZHQpO1xuICAgICAgLyogcG9zc2libHkgZ2V0IG1vcmUgYml0cyBmcm9tIGRpc3RhbmNlIGNvZGUgKi9cblxuICAgICAgb2ZmcyA9IGQuZGVzdExlbiAtIHRpbmZfcmVhZF9iaXRzJDEoZCwgZGlzdF9iaXRzJDFbZGlzdF0sIGRpc3RfYmFzZSQxW2Rpc3RdKTtcbiAgICAgIC8qIGNvcHkgbWF0Y2ggKi9cblxuICAgICAgZm9yIChpID0gb2ZmczsgaSA8IG9mZnMgKyBsZW5ndGg7ICsraSkge1xuICAgICAgICBkLmRlc3RbZC5kZXN0TGVuKytdID0gZC5kZXN0W2ldO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyogaW5mbGF0ZSBhbiB1bmNvbXByZXNzZWQgYmxvY2sgb2YgZGF0YSAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfaW5mbGF0ZV91bmNvbXByZXNzZWRfYmxvY2skMShkKSB7XG4gIHZhciBsZW5ndGgsIGludmxlbmd0aDtcbiAgdmFyIGk7XG4gIC8qIHVucmVhZCBmcm9tIGJpdGJ1ZmZlciAqL1xuXG4gIHdoaWxlIChkLmJpdGNvdW50ID4gOCkge1xuICAgIGQuc291cmNlSW5kZXgtLTtcbiAgICBkLmJpdGNvdW50IC09IDg7XG4gIH1cbiAgLyogZ2V0IGxlbmd0aCAqL1xuXG5cbiAgbGVuZ3RoID0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCArIDFdO1xuICBsZW5ndGggPSAyNTYgKiBsZW5ndGggKyBkLnNvdXJjZVtkLnNvdXJjZUluZGV4XTtcbiAgLyogZ2V0IG9uZSdzIGNvbXBsZW1lbnQgb2YgbGVuZ3RoICovXG5cbiAgaW52bGVuZ3RoID0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCArIDNdO1xuICBpbnZsZW5ndGggPSAyNTYgKiBpbnZsZW5ndGggKyBkLnNvdXJjZVtkLnNvdXJjZUluZGV4ICsgMl07XG4gIC8qIGNoZWNrIGxlbmd0aCAqL1xuXG4gIGlmIChsZW5ndGggIT09ICh+aW52bGVuZ3RoICYgMHgwMDAwZmZmZikpIHJldHVybiBUSU5GX0RBVEFfRVJST1IkMTtcbiAgZC5zb3VyY2VJbmRleCArPSA0O1xuICAvKiBjb3B5IGJsb2NrICovXG5cbiAgZm9yIChpID0gbGVuZ3RoOyBpOyAtLWkpIHtcbiAgICBkLmRlc3RbZC5kZXN0TGVuKytdID0gZC5zb3VyY2VbZC5zb3VyY2VJbmRleCsrXTtcbiAgfVxuICAvKiBtYWtlIHN1cmUgd2Ugc3RhcnQgbmV4dCBibG9jayBvbiBhIGJ5dGUgYm91bmRhcnkgKi9cblxuXG4gIGQuYml0Y291bnQgPSAwO1xuICByZXR1cm4gVElORl9PSyQxO1xufVxuLyogaW5mbGF0ZSBzdHJlYW0gZnJvbSBzb3VyY2UgdG8gZGVzdCAqL1xuXG5cbmZ1bmN0aW9uIHRpbmZfdW5jb21wcmVzcyQxKHNvdXJjZSwgZGVzdCkge1xuICB2YXIgZCA9IG5ldyBEYXRhJDEoc291cmNlLCBkZXN0KTtcbiAgdmFyIGJmaW5hbCwgYnR5cGUsIHJlcztcblxuICBkbyB7XG4gICAgLyogcmVhZCBmaW5hbCBibG9jayBmbGFnICovXG4gICAgYmZpbmFsID0gdGluZl9nZXRiaXQkMShkKTtcbiAgICAvKiByZWFkIGJsb2NrIHR5cGUgKDIgYml0cykgKi9cblxuICAgIGJ0eXBlID0gdGluZl9yZWFkX2JpdHMkMShkLCAyLCAwKTtcbiAgICAvKiBkZWNvbXByZXNzIGJsb2NrICovXG5cbiAgICBzd2l0Y2ggKGJ0eXBlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIC8qIGRlY29tcHJlc3MgdW5jb21wcmVzc2VkIGJsb2NrICovXG4gICAgICAgIHJlcyA9IHRpbmZfaW5mbGF0ZV91bmNvbXByZXNzZWRfYmxvY2skMShkKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMTpcbiAgICAgICAgLyogZGVjb21wcmVzcyBibG9jayB3aXRoIGZpeGVkIGh1ZmZtYW4gdHJlZXMgKi9cbiAgICAgICAgcmVzID0gdGluZl9pbmZsYXRlX2Jsb2NrX2RhdGEkMShkLCBzbHRyZWUkMSwgc2R0cmVlJDEpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICAvKiBkZWNvbXByZXNzIGJsb2NrIHdpdGggZHluYW1pYyBodWZmbWFuIHRyZWVzICovXG4gICAgICAgIHRpbmZfZGVjb2RlX3RyZWVzJDEoZCwgZC5sdHJlZSwgZC5kdHJlZSk7XG4gICAgICAgIHJlcyA9IHRpbmZfaW5mbGF0ZV9ibG9ja19kYXRhJDEoZCwgZC5sdHJlZSwgZC5kdHJlZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXMgPSBUSU5GX0RBVEFfRVJST1IkMTtcbiAgICB9XG5cbiAgICBpZiAocmVzICE9PSBUSU5GX09LJDEpIHRocm93IG5ldyBFcnJvcignRGF0YSBlcnJvcicpO1xuICB9IHdoaWxlICghYmZpbmFsKTtcblxuICBpZiAoZC5kZXN0TGVuIDwgZC5kZXN0Lmxlbmd0aCkge1xuICAgIGlmICh0eXBlb2YgZC5kZXN0LnNsaWNlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZC5kZXN0LnNsaWNlKDAsIGQuZGVzdExlbik7ZWxzZSByZXR1cm4gZC5kZXN0LnN1YmFycmF5KDAsIGQuZGVzdExlbik7XG4gIH1cblxuICByZXR1cm4gZC5kZXN0O1xufVxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gKlxuICogLS0gaW5pdGlhbGl6YXRpb24gLS0gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0cmVlcyAqL1xuXG5cbnRpbmZfYnVpbGRfZml4ZWRfdHJlZXMkMShzbHRyZWUkMSwgc2R0cmVlJDEpO1xuLyogYnVpbGQgZXh0cmEgYml0cyBhbmQgYmFzZSB0YWJsZXMgKi9cblxudGluZl9idWlsZF9iaXRzX2Jhc2UkMShsZW5ndGhfYml0cyQxLCBsZW5ndGhfYmFzZSQxLCA0LCAzKTtcbnRpbmZfYnVpbGRfYml0c19iYXNlJDEoZGlzdF9iaXRzJDEsIGRpc3RfYmFzZSQxLCAyLCAxKTtcbi8qIGZpeCBhIHNwZWNpYWwgY2FzZSAqL1xuXG5sZW5ndGhfYml0cyQxWzI4XSA9IDA7XG5sZW5ndGhfYmFzZSQxWzI4XSA9IDI1ODtcbnZhciB0aW55SW5mbGF0ZSQxID0gdGluZl91bmNvbXByZXNzJDE7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJGYoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBXT0ZGRm9udCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1RURkZvbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UkZihXT0ZGRm9udCwgX1RURkZvbnQpO1xuXG4gIGZ1bmN0aW9uIFdPRkZGb250KCkge1xuICAgIHJldHVybiBfVFRGRm9udC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICBXT0ZGRm9udC5wcm9iZSA9IGZ1bmN0aW9uIHByb2JlKGJ1ZmZlcikge1xuICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoJ2FzY2lpJywgMCwgNCkgPT09ICd3T0ZGJztcbiAgfTtcblxuICB2YXIgX3Byb3RvID0gV09GRkZvbnQucHJvdG90eXBlO1xuXG4gIF9wcm90by5fZGVjb2RlRGlyZWN0b3J5ID0gZnVuY3Rpb24gX2RlY29kZURpcmVjdG9yeSgpIHtcbiAgICB0aGlzLmRpcmVjdG9yeSA9IFdPRkZEaXJlY3RvcnkuZGVjb2RlKHRoaXMuc3RyZWFtLCB7XG4gICAgICBfc3RhcnRPZmZzZXQ6IDBcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uX2dldFRhYmxlU3RyZWFtID0gZnVuY3Rpb24gX2dldFRhYmxlU3RyZWFtKHRhZykge1xuICAgIHZhciB0YWJsZSA9IHRoaXMuZGlyZWN0b3J5LnRhYmxlc1t0YWddO1xuXG4gICAgaWYgKHRhYmxlKSB7XG4gICAgICB0aGlzLnN0cmVhbS5wb3MgPSB0YWJsZS5vZmZzZXQ7XG5cbiAgICAgIGlmICh0YWJsZS5jb21wTGVuZ3RoIDwgdGFibGUubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLnBvcyArPSAyOyAvLyBza2lwIGRlZmxhdGUgaGVhZGVyXG5cbiAgICAgICAgdmFyIG91dEJ1ZmZlciA9IG5ldyBidWZmZXJfMSh0YWJsZS5sZW5ndGgpO1xuICAgICAgICB2YXIgYnVmID0gdGlueUluZmxhdGUkMSh0aGlzLnN0cmVhbS5yZWFkQnVmZmVyKHRhYmxlLmNvbXBMZW5ndGggLSAyKSwgb3V0QnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyByZXN0cnVjdHVyZS5EZWNvZGVTdHJlYW0oYnVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICByZXR1cm4gV09GRkZvbnQ7XG59KFRURkZvbnQpO1xuXG5mdW5jdGlvbiBCcm90bGlJbnB1dChidWZmZXIpIHtcbiAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gIHRoaXMucG9zID0gMDtcbn1cblxuQnJvdGxpSW5wdXQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAoYnVmLCBpLCBjb3VudCkge1xuICBpZiAodGhpcy5wb3MgKyBjb3VudCA+IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgIGNvdW50ID0gdGhpcy5idWZmZXIubGVuZ3RoIC0gdGhpcy5wb3M7XG4gIH1cblxuICBmb3IgKHZhciBwID0gMDsgcCA8IGNvdW50OyBwKyspIHtcbiAgICBidWZbaSArIHBdID0gdGhpcy5idWZmZXJbdGhpcy5wb3MgKyBwXTtcbiAgfVxuXG4gIHRoaXMucG9zICs9IGNvdW50O1xuICByZXR1cm4gY291bnQ7XG59O1xuXG52YXIgQnJvdGxpSW5wdXRfMSA9IEJyb3RsaUlucHV0O1xuXG5mdW5jdGlvbiBCcm90bGlPdXRwdXQoYnVmKSB7XG4gIHRoaXMuYnVmZmVyID0gYnVmO1xuICB0aGlzLnBvcyA9IDA7XG59XG5cbkJyb3RsaU91dHB1dC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmLCBjb3VudCkge1xuICBpZiAodGhpcy5wb3MgKyBjb3VudCA+IHRoaXMuYnVmZmVyLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdPdXRwdXQgYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2gnKTtcbiAgdGhpcy5idWZmZXIuc2V0KGJ1Zi5zdWJhcnJheSgwLCBjb3VudCksIHRoaXMucG9zKTtcbiAgdGhpcy5wb3MgKz0gY291bnQ7XG4gIHJldHVybiBjb3VudDtcbn07XG5cbnZhciBCcm90bGlPdXRwdXRfMSA9IEJyb3RsaU91dHB1dDtcbnZhciBzdHJlYW1zJDEgPSB7XG4gIEJyb3RsaUlucHV0OiBCcm90bGlJbnB1dF8xLFxuICBCcm90bGlPdXRwdXQ6IEJyb3RsaU91dHB1dF8xXG59O1xuXG4vKiBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXG4gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4gICBCaXQgcmVhZGluZyBoZWxwZXJzXG4qL1xudmFyIEJST1RMSV9SRUFEX1NJWkUgPSA0MDk2O1xudmFyIEJST1RMSV9JQlVGX1NJWkUgPSAyICogQlJPVExJX1JFQURfU0laRSArIDMyO1xudmFyIEJST1RMSV9JQlVGX01BU0sgPSAyICogQlJPVExJX1JFQURfU0laRSAtIDE7XG52YXIga0JpdE1hc2sgPSBuZXcgVWludDMyQXJyYXkoWzAsIDEsIDMsIDcsIDE1LCAzMSwgNjMsIDEyNywgMjU1LCA1MTEsIDEwMjMsIDIwNDcsIDQwOTUsIDgxOTEsIDE2MzgzLCAzMjc2NywgNjU1MzUsIDEzMTA3MSwgMjYyMTQzLCA1MjQyODcsIDEwNDg1NzUsIDIwOTcxNTEsIDQxOTQzMDMsIDgzODg2MDcsIDE2Nzc3MjE1XSk7XG4vKiBJbnB1dCBieXRlIGJ1ZmZlciwgY29uc2lzdCBvZiBhIHJpbmdidWZmZXIgYW5kIGEgXCJzbGFja1wiIHJlZ2lvbiB3aGVyZSAqL1xuXG4vKiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcmluZ2J1ZmZlciBhcmUgY29waWVkLiAqL1xuXG5mdW5jdGlvbiBCcm90bGlCaXRSZWFkZXIoaW5wdXQpIHtcbiAgdGhpcy5idWZfID0gbmV3IFVpbnQ4QXJyYXkoQlJPVExJX0lCVUZfU0laRSk7XG4gIHRoaXMuaW5wdXRfID0gaW5wdXQ7XG4gIC8qIGlucHV0IGNhbGxiYWNrICovXG5cbiAgdGhpcy5yZXNldCgpO1xufVxuXG5Ccm90bGlCaXRSZWFkZXIuUkVBRF9TSVpFID0gQlJPVExJX1JFQURfU0laRTtcbkJyb3RsaUJpdFJlYWRlci5JQlVGX01BU0sgPSBCUk9UTElfSUJVRl9NQVNLO1xuXG5Ccm90bGlCaXRSZWFkZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmJ1Zl9wdHJfID0gMDtcbiAgLyogbmV4dCBpbnB1dCB3aWxsIHdyaXRlIGhlcmUgKi9cblxuICB0aGlzLnZhbF8gPSAwO1xuICAvKiBwcmUtZmV0Y2hlZCBiaXRzICovXG5cbiAgdGhpcy5wb3NfID0gMDtcbiAgLyogYnl0ZSBwb3NpdGlvbiBpbiBzdHJlYW0gKi9cblxuICB0aGlzLmJpdF9wb3NfID0gMDtcbiAgLyogY3VycmVudCBiaXQtcmVhZGluZyBwb3NpdGlvbiBpbiB2YWxfICovXG5cbiAgdGhpcy5iaXRfZW5kX3Bvc18gPSAwO1xuICAvKiBiaXQtcmVhZGluZyBlbmQgcG9zaXRpb24gZnJvbSBMU0Igb2YgdmFsXyAqL1xuXG4gIHRoaXMuZW9zXyA9IDA7XG4gIC8qIGlucHV0IHN0cmVhbSBpcyBmaW5pc2hlZCAqL1xuXG4gIHRoaXMucmVhZE1vcmVJbnB1dCgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgdGhpcy52YWxfIHw9IHRoaXMuYnVmX1t0aGlzLnBvc19dIDw8IDggKiBpO1xuICAgICsrdGhpcy5wb3NfO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuYml0X2VuZF9wb3NfID4gMDtcbn07XG4vKiBGaWxscyB1cCB0aGUgaW5wdXQgcmluZ2J1ZmZlciBieSBjYWxsaW5nIHRoZSBpbnB1dCBjYWxsYmFjay5cblxuICAgRG9lcyBub3RoaW5nIGlmIHRoZXJlIGFyZSBhdCBsZWFzdCAzMiBieXRlcyBwcmVzZW50IGFmdGVyIGN1cnJlbnQgcG9zaXRpb24uXG5cbiAgIFJldHVybnMgMCBpZiBlaXRoZXI6XG4gICAgLSB0aGUgaW5wdXQgY2FsbGJhY2sgcmV0dXJuZWQgYW4gZXJyb3IsIG9yXG4gICAgLSB0aGVyZSBpcyBubyBtb3JlIGlucHV0IGFuZCB0aGUgcG9zaXRpb24gaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uXG5cbiAgIEFmdGVyIGVuY291bnRlcmluZyB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJlYW0sIDMyIGFkZGl0aW9uYWwgemVybyBieXRlcyBhcmVcbiAgIGNvcGllZCB0byB0aGUgcmluZ2J1ZmZlciwgdGhlcmVmb3JlIGl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyXG4gICBldmVyeSAzMiBieXRlcyBvZiBpbnB1dCBpcyByZWFkLlxuKi9cblxuXG5Ccm90bGlCaXRSZWFkZXIucHJvdG90eXBlLnJlYWRNb3JlSW5wdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmJpdF9lbmRfcG9zXyA+IDI1Nikge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0aGlzLmVvc18pIHtcbiAgICBpZiAodGhpcy5iaXRfcG9zXyA+IHRoaXMuYml0X2VuZF9wb3NfKSB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIGlucHV0ICcgKyB0aGlzLmJpdF9wb3NfICsgJyAnICsgdGhpcy5iaXRfZW5kX3Bvc18pO1xuICB9IGVsc2Uge1xuICAgIHZhciBkc3QgPSB0aGlzLmJ1Zl9wdHJfO1xuICAgIHZhciBieXRlc19yZWFkID0gdGhpcy5pbnB1dF8ucmVhZCh0aGlzLmJ1Zl8sIGRzdCwgQlJPVExJX1JFQURfU0laRSk7XG5cbiAgICBpZiAoYnl0ZXNfcmVhZCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQnKTtcbiAgICB9XG5cbiAgICBpZiAoYnl0ZXNfcmVhZCA8IEJST1RMSV9SRUFEX1NJWkUpIHtcbiAgICAgIHRoaXMuZW9zXyA9IDE7XG4gICAgICAvKiBTdG9yZSAzMiBieXRlcyBvZiB6ZXJvIGFmdGVyIHRoZSBzdHJlYW0gZW5kLiAqL1xuXG4gICAgICBmb3IgKHZhciBwID0gMDsgcCA8IDMyOyBwKyspIHtcbiAgICAgICAgdGhpcy5idWZfW2RzdCArIGJ5dGVzX3JlYWQgKyBwXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRzdCA9PT0gMCkge1xuICAgICAgLyogQ29weSB0aGUgaGVhZCBvZiB0aGUgcmluZ2J1ZmZlciB0byB0aGUgc2xhY2sgcmVnaW9uLiAqL1xuICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCAzMjsgcCsrKSB7XG4gICAgICAgIHRoaXMuYnVmX1soQlJPVExJX1JFQURfU0laRSA8PCAxKSArIHBdID0gdGhpcy5idWZfW3BdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmJ1Zl9wdHJfID0gQlJPVExJX1JFQURfU0laRTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWZfcHRyXyA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5iaXRfZW5kX3Bvc18gKz0gYnl0ZXNfcmVhZCA8PCAzO1xuICB9XG59O1xuLyogR3VhcmFudGVlcyB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCAyNCBiaXRzIGluIHRoZSBidWZmZXIuICovXG5cblxuQnJvdGxpQml0UmVhZGVyLnByb3RvdHlwZS5maWxsQml0V2luZG93ID0gZnVuY3Rpb24gKCkge1xuICB3aGlsZSAodGhpcy5iaXRfcG9zXyA+PSA4KSB7XG4gICAgdGhpcy52YWxfID4+Pj0gODtcbiAgICB0aGlzLnZhbF8gfD0gdGhpcy5idWZfW3RoaXMucG9zXyAmIEJST1RMSV9JQlVGX01BU0tdIDw8IDI0O1xuICAgICsrdGhpcy5wb3NfO1xuICAgIHRoaXMuYml0X3Bvc18gPSB0aGlzLmJpdF9wb3NfIC0gOCA+Pj4gMDtcbiAgICB0aGlzLmJpdF9lbmRfcG9zXyA9IHRoaXMuYml0X2VuZF9wb3NfIC0gOCA+Pj4gMDtcbiAgfVxufTtcbi8qIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMgZnJvbSBSZWFkIEJ1ZmZlci4gKi9cblxuXG5Ccm90bGlCaXRSZWFkZXIucHJvdG90eXBlLnJlYWRCaXRzID0gZnVuY3Rpb24gKG5fYml0cykge1xuICBpZiAoMzIgLSB0aGlzLmJpdF9wb3NfIDwgbl9iaXRzKSB7XG4gICAgdGhpcy5maWxsQml0V2luZG93KCk7XG4gIH1cblxuICB2YXIgdmFsID0gdGhpcy52YWxfID4+PiB0aGlzLmJpdF9wb3NfICYga0JpdE1hc2tbbl9iaXRzXTtcbiAgdGhpcy5iaXRfcG9zXyArPSBuX2JpdHM7XG4gIHJldHVybiB2YWw7XG59O1xuXG52YXIgYml0X3JlYWRlciA9IEJyb3RsaUJpdFJlYWRlcjtcblxudmFyIGJ5dGVMZW5ndGhfMSQxID0gYnl0ZUxlbmd0aCQxO1xudmFyIHRvQnl0ZUFycmF5XzEkMSA9IHRvQnl0ZUFycmF5JDE7XG52YXIgZnJvbUJ5dGVBcnJheV8xJDEgPSBmcm9tQnl0ZUFycmF5JDE7XG52YXIgbG9va3VwJDEgPSBbXTtcbnZhciByZXZMb29rdXAkMSA9IFtdO1xudmFyIEFyciQxID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5O1xudmFyIGNvZGUkMSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcblxuZm9yICh2YXIgaSQ0ID0gMCwgbGVuJDEgPSBjb2RlJDEubGVuZ3RoOyBpJDQgPCBsZW4kMTsgKytpJDQpIHtcbiAgbG9va3VwJDFbaSQ0XSA9IGNvZGUkMVtpJDRdO1xuICByZXZMb29rdXAkMVtjb2RlJDEuY2hhckNvZGVBdChpJDQpXSA9IGkkNDtcbn0gLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xuXG5cbnJldkxvb2t1cCQxWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyO1xucmV2TG9va3VwJDFbJ18nLmNoYXJDb2RlQXQoMCldID0gNjM7XG5cbmZ1bmN0aW9uIGdldExlbnMkMShiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGg7XG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Jyk7XG4gIH0gLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuXG5cbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKTtcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW47XG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuID8gMCA6IDQgLSB2YWxpZExlbiAlIDQ7XG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl07XG59IC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuXG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGgkMShiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zJDEoYjY0KTtcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXTtcbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV07XG4gIHJldHVybiAodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQgLSBwbGFjZUhvbGRlcnNMZW47XG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoJDEoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQgLSBwbGFjZUhvbGRlcnNMZW47XG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5JDEoYjY0KSB7XG4gIHZhciB0bXA7XG4gIHZhciBsZW5zID0gZ2V0TGVucyQxKGI2NCk7XG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF07XG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdO1xuICB2YXIgYXJyID0gbmV3IEFyciQxKF9ieXRlTGVuZ3RoJDEoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSk7XG4gIHZhciBjdXJCeXRlID0gMDsgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwID8gdmFsaWRMZW4gLSA0IDogdmFsaWRMZW47XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9IHJldkxvb2t1cCQxW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCB8IHJldkxvb2t1cCQxW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIgfCByZXZMb29rdXAkMVtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYgfCByZXZMb29rdXAkMVtiNjQuY2hhckNvZGVBdChpICsgMyldO1xuICAgIGFycltjdXJCeXRlKytdID0gdG1wID4+IDE2ICYgMHhGRjtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCA+PiA4ICYgMHhGRjtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkY7XG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID0gcmV2TG9va3VwJDFbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIgfCByZXZMb29rdXAkMVtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQ7XG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGO1xuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9IHJldkxvb2t1cCQxW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCB8IHJldkxvb2t1cCQxW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCB8IHJldkxvb2t1cCQxW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMjtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCA+PiA4ICYgMHhGRjtcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkY7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQkMShudW0pIHtcbiAgcmV0dXJuIGxvb2t1cCQxW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwJDFbbnVtID4+IDEyICYgMHgzRl0gKyBsb29rdXAkMVtudW0gPj4gNiAmIDB4M0ZdICsgbG9va3VwJDFbbnVtICYgMHgzRl07XG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rJDEodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcDtcbiAgdmFyIG91dHB1dCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2ICYgMHhGRjAwMDApICsgKHVpbnQ4W2kgKyAxXSA8PCA4ICYgMHhGRjAwKSArICh1aW50OFtpICsgMl0gJiAweEZGKTtcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQkMSh0bXApKTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkkMSh1aW50OCkge1xuICB2YXIgdG1wO1xuICB2YXIgbGVuID0gdWludDgubGVuZ3RoO1xuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDM7IC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG5cbiAgdmFyIHBhcnRzID0gW107XG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzOyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rJDEodWludDgsIGksIGkgKyBtYXhDaHVua0xlbmd0aCA+IGxlbjIgPyBsZW4yIDogaSArIG1heENodW5rTGVuZ3RoKSk7XG4gIH0gLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuXG5cbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXTtcbiAgICBwYXJ0cy5wdXNoKGxvb2t1cCQxW3RtcCA+PiAyXSArIGxvb2t1cCQxW3RtcCA8PCA0ICYgMHgzRl0gKyAnPT0nKTtcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV07XG4gICAgcGFydHMucHVzaChsb29rdXAkMVt0bXAgPj4gMTBdICsgbG9va3VwJDFbdG1wID4+IDQgJiAweDNGXSArIGxvb2t1cCQxW3RtcCA8PCAyICYgMHgzRl0gKyAnPScpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpO1xufVxuXG52YXIgYmFzZTY0SnMkMSA9IHtcbiAgYnl0ZUxlbmd0aDogYnl0ZUxlbmd0aF8xJDEsXG4gIHRvQnl0ZUFycmF5OiB0b0J5dGVBcnJheV8xJDEsXG4gIGZyb21CeXRlQXJyYXk6IGZyb21CeXRlQXJyYXlfMSQxXG59O1xuXG52YXIgZGljdGlvbmFyeV9iaW4gPSBcIlc1L2ZjUUxuNWdLZjJYVWJBaVExWFVMWCtUWno2QURUb0RzZ3FrNnFWZmVDMGU0bTZPTzJ3Y1ExSjc2WkJWUlYxZlJrRXNkdS8vNjJ6UXNGRVpXU1RDbk1oY3NRS2xTMnFPaHVWWVlNR0NrVjBmWFdFb01GYkVTWHJLRVo5d2RVRXN5dzlnNGJKbEV0MVk2b1ZNeE1SVEVWYkNJd1p6Snpib0s1ajhtNFlIMDJxZ1hZaHYxVitQTTQzNXNMVnh5SEppaGFKUkVFaFpHcUwwM3R4R0ZRTG03NmNhR08vb3Z4S3Z6Q2J5LzN2TVR0WC80NTlmMGlnaTdXdXRuS2lNUTZ3T0RTb1JoLzhMeDFWM1E5OU12S3R3QjZiSGRFUllSWTBoU3RKb01qTmVUc05YN2JuK1k3ZTRFUTNiZjh4QmM3TDBCc3lmRlBLNDNkR1NYcEw2Y2xZQy9JMzI4aDU0L1ZZclE1aTA2NDhGZ2JHdGw4MzdzdkozNUwzTW90LytuUGxOcFdnS3gxZ0dYUVlxWDZuK2JiWjd3dXlDSEtjVW9rMTJYanF1YjdOWFpHenFCeDBTRCt1emlOZjg3dDd2ZTQyanhTS1FvVzNueXhWcldJR2xGU2hoQ0t4anBaWjVNZUduYTArbEJraytrYU44RjlxRkJBRmdFb2d5TUJkY1gvVDFXL1duTU9pLzd5Y1dVUWxvRUJLR2VDNDhNa2l3cUprSk8rMTJlUWlPRkhNbWNrNnEvSWpXVzNSWmxhbnkyM1RCbStjTnIvODQvb2k1R0dtR0JaV3JaNmorenlrVm96ejVmVC9RSC9EYTZXVGJaWVlQeW5WTk83a3h6dU5OMmt4S0tXY2hlNVd2ZWl0UEtBZWNCOFljQUh6Lyt6WExqY0x6a2REU2t0TklEd1pFOUo5WCt0dG80M29KeTY1d0FwTTNtRHpZdEN3WDlsTStONVZSM2tYWW8wWjN0MFR0WGZnQkZnN2dVOG9OMERnbDdmWmxVYmhObGwrMHV1b2hSVktqckVkOGVnclNuZHk1L1RnZDJncWpBNENBVnVDN0VTVW1MM0Rab0duZmhRVjh1d25waThFR3ZBVlZzb3dOUnhQdWRjazcrb3FBVURrd1pvcFdxRm5XMXJpc3MwdDF6NmlDSVNWS3JlWUdOdlFjWHYrMUw5K2piUDhjZC9kUFVpcUJzbzJxKzdaeUZCdkVOQ2trVnI0NGl5UGJ0T29Pb0NlY1dzaXVxTVNNTDVsdit2TjVNelVyK0RuaDczRzdRMVluUllKVllYSFJKYU5BT0J5aWFLNkN1c2dGZEJQRTQwcjBydnFYVjd0a3NLTzJEckhZWEJUdjhQNXlzcXhFeDhWRFhVRERxa1BINk5OT1YvYTJXSDh6bGtYUkVMU2E4UCtoZU55SkJCUDdQZ3NHMUV0V3ROZWY2L2krbGNheXpRd1FDc2R1aWRwYktmaFdVRGdBRW15aEd1L3pWVGFjSTZSUzB6VEFCck9ZdWVlbW5WYTE5dTlmVDIzTi9UYTZSdlRwb2Y1RFd5Z3FyZUNxckRBZ000TElEMSsxVC90YVU2eVRGVkxxWE92Ky9NdVFPRm5hRjh2TE1LRDd0S1dEb0JkQUxneEYzM3pRY2NDY2RIeDhmS0lWZFc2OU83cUh0WHBlR3I5amJicEZBK3FSTVdyNWhwMHM2N0ZQYzdIQWlMVjBnMC9wZVpsVzdoSlBZRWhaeWhwU3dhaG5mOTMvdFpnZnFaV1hGZG1kWEJ6cXhHSExyUUt4b0FZNmZSb0JoZ0NSUG1tR3VlWVo1SmV4VFZES1VJWHprRy9mcXAvMFUzaEFnUWRKOXp1bXV0SzZucVdiYXF2bTFwZ3UwM0lZUitHKzhzMGpEQkJ6OGNBcFpGU0JldVdhc3lxbzJPTURLQVpDb3pTK0dXU3ZML0hzRTlySHhvb2UxN1Uzcy9sVEUrVlpBazRqM2RwNnVJR2FDMEpNaXFSNUNVc2FiUHlNMGRPWURSN0VhN2lwNFVTWmx5YTM4WWZQdHZyWC90QmxoSGlsajU1bloxbmZOMjRBT0FpOUJWdHovTWJuOEFFREpDcUpnc1ZVYTZuUW5TeHYyRnM3bC9ObEN6cGZZRWptUHJOeWliLyt0MGVpMmVFTWp2TmhMa0hDWmxjaTRXaEJlN2VQWlRtellxbFk5KzFweHRTNEdCKzVsTTFCSFQ5dFMyNzBFV1VEWUZxMUkweVkvZk5pQWs0Yms5eUJnbWVmL2YyazZBbFlRWkhzTkZuVzh3QlF4Q2Q2OGlXdjcvMzViWGZ6M0pabWZHbGlnV0FLUmpJczNJcHp4UTI3dkFnbEhTaU96Q1l6SjlMOUExQ2RpeUZ2eVI2NnVjQTRqS2lmdTVlaHdFUjI2eVY3SGpLcW41TWZvem83Q294eHQ4TFdXUFQ0N0JlTXhYOHAwUGpiN2habis2Ync3ejNMdys3NjUzajVzSThDTHU1a1RocE1sajFtNGMyY2gzakdjUDFGc1QxM3Z1SzNxamVjS1RaazJrSGNPWlk0MFVYK3FkYXhzdFpxc3FRcWdYeitRR0Y5OVpKTHFyM1ZZdTRhZWNsMUFiNUdtcVM4ay9HVjViOTV6eFE1ZDRFZlhVSjZrVFMvQ1hGL2FpcUtET1QxVDdKejV6MFB3RFVjd3I5Y2xMTjFPSkdDaUtmcXZhaCtoM1h6ckJPaUxPVzh3dm44Z1c2cUU4dlB4aStFZnYrVUg1NVQ3UFFGVk1oNmNaMXBaUWx6SnBLWjdQN3VXdndQR0o2RFRsUjZ3YnlqM0l2Mkh5ZWZuUm8vZHY3ZE54K3FhYTBOMzhpQnNSKytVaWw3V2Q0YWZ3RE5zcnpEQUs0Zlhad3ZFWS9qZEt1SUtYbGZyUWQyQzM5ZFc3bnRuUmJJcDlPdEd5OXBQQm4vVjJBU29pLzJVSlpmUyt4dUdMSDhibkx1UGx6ZFROUzZ6ZHlrOER0L2g2c2ZPVzVteXhoMWYremYzelozTVgvbU85Y1FQcDVwT3g5NjdaQTYvcHFIdmNsTmZuVUZGK3JxK1ZkN2FsS3I2S1dQY0lEaHBuNnYySzZObFV1NkxyS284Yi9wWXBVL0dhemZ2dHdobjd0RU9VdVhodDVyVUpkU2Y2c0xqWWYwVlRZRGd3SjgxeWFxS1RVWWVqL3RiSGNrU1JiL0haaWN3R0pxaDFtQUhCL0l1TnM5ZGM5eXV2RjNENVhvY20zZWxXRmRxNW9FeTcwZFlGaXQ3OXlhTGlOalBqNVVVY1ZtWlVWaFFFaFc1VjJaNkNtNEhWSC9SOHFsYW1SWXdCaWxldWgwN0NiRWNlM1RYYTJKbVhXQmYrb3p0MzE5cHNib29iZVpoVm53aE1aek9lUUp6aHBURGJQNzFUdjhIdVp4eFVJLyttYTNYVzZERkREczQrcW1wRVJ3SEdCZDJlZHh3VUtsT0RSZFVXWi9nMEdPZXpyYnpPWmF1Rk1haTRRVTZHVkhWNmFQTkJpQm5kSFNzVjRJenB2VWlpWXlnNk95eXJMNERqNXEvTHczTjVrQXdmdEVWbDlyTmQ3Sms1UERpajJoVEg2d0lYbnN5WGtLZVB4Ym1IWWdDOEE2YW41Rm9iL0tINUd0QzBsNGVGc28rVnB4ZWR0SkhkSHBObStCdnk0Qzc5eVZPa3Jac0xyUTNPSENlQjBSYStrQklSbGRVR2xEQ0VtcTJSd1huZnloNkR6K2FsazZlZnRJMm42c2FzdFJyR3did3N6QmVEUlMvRmEvS3dSSmtDelRzTHIvSkNzNWhPUEUvTVBMWWRaMUYxZnY3RCtWbXlzWDZOcE9DOGFVOUY0UXM2SHZEeVV5OVB2RkdES1ovUDUxMDFUWUhGbDhwamo2d20vcXlTNzVldFpoaGZnMFVFTDRPWW1IazZtNmRPMTkyQXpvSXlQU1Y5UWVkREE0TWwyM3JSYnF4TVBNeGY3RkpuRGM1RlRFbFZTL1B5cWdlUHptd1ZaMjZOV2hSRFErb2FUN2x5N2VsbDRzM0R5cFMxczBnK3RPcjdYSHJya1pqOSt4L21KQnR0ckx4OThsRklhUlp6SHo0YUM3cjUyL0pRNFZqSGFoWTIvWVZYWm4vUUMyenRRYi9zWTN1Umx5YzV2UVM4bkxQR1QvbjI3NDk1aThIUEExNTJ6N0ZoNWFGcHluMUdQSktIdVBMOEl3OTREdVczS2prVVJBV1pYbjRFUXk4OXhpS0VITjFtay90a000Z1lEQnh3Tm9ZdlJmRTZMRnFzeFdKdFByREdic25MTWFwM0thM01Vb3l0VzBjdmllb3pPbWRFUm1oY3F6RyszSG1adjJ5WmVpSWVRVEtHZFJUNEhITnhla20xdFkrL24wNnJHbUZsZXFMc2NTRVJ6Y3RUS002RzlQMFBjMVJtVnZyYXNjSXhhTzFDUUNpWVBFMTViRDdjM3hTZVc3Z1h4WWpneGNyVWxjYkl2TzByK1lwbGh4MGtUdDNxYWZET21GeU1qZ0d4WHU3M3JkZE1IcFYxd011YnlBR2NmL3Y1ZExyNVA3MlRhOWxCRitmek1Kck15Y3d2Kzl2blUzQU5JbDFjSDl0Zlc3YWY4dTAvSEcwdlY0N2pORlh6RlR0YWhhMXh2emUvczhLTXRDWXVjWGMxbnpmZC9NUXlkVVhuL2I3MlJCdDV3Ty8zalJjTUg5QmRoQy95Y3RLQkl2ZVJZUHJOcERXcUJzTzhWTW1QK1d2UmFPY0E0elJNUjFQdlNvTzkyclM3cFlFditmWmZFZlRNekVkTSs2WDV0TGx5eEV4aHFMUmttczVFdUxvdkxmeDY2ZGU1ZkwyL3lYMDJINTJGUFZ3YWhyUHFtTi9FMG9WWG5zQ0toYmkveVJ4WDgzblJiVUtXaHpZY2VYT250ZnVYbjUxTnN6SjZNTzczcFFmNVBsNGluM2VjNEpVOGhGN3BwVjM0K21tOXIxTFkwZWUvaTFPMXdwZDgremZMenRFMGNxQnhnZ2lCaTVCdTk1djlsM3I5ci9VNWh3ZUxuK1RiZnhvd3JXRHFkSmF1S2Q4K3EvZEg4c2JQa2M5dHR1eU85NGY3L1hLL25IWDQ2TVBGTEViNXFRbE5QdmhKNTAvNTl0OWZ0M0xYdTd1VmFXYU8yYkRyRENuUlN6WnlXdkZLeE8xK3ZUOE13d3VuUjNiWDBDa2ZQanFiNEs5TzE5dG41WDUwUHZtWXBFd0h0aVc5V3R6dVYvczc2QjF6dkxMTmtWaU5kOHlTeElsLzNvcmZxUDkwVHlUR2FmNy9yeDhqUXplSEpYZG1oL042WUR2YnZtVEJ3Q2R4ZkVRMU5jTDZ3Tk1kU0lYTnE3YjFFVXpSeTEvQXhzeWs1cDIyR01HMWIrR3hGZ2JIRXJaaDkyd3V2Y28wQXVPTFhjdDlodncybncvTHFJY0RSUm1KbW1aemNnVWE3SnBNL1dWL1M5SVVmYkY1NlRMMm9yenF3ZWJkUkQ4bklZTko0MUQvaHozN0ZvMTFwMlkyMXd6UGNuNzEzcVZHaHF0ZXZTdFlmR0g0bjY5T0VKdFB2YmJMWVd2c2NEcWMzSGdudTE2Nit0QXlMbnhyWDBZNXpvWWpWKysxc0k3dDVrTXIwMktULyt1d3RrYytyWkxPZi9xbi9zM25ZQ2YxM0RnOC9zQjJkaUpnakdxalErVExoeGJ6eXVlMk9iN1g2LzlsVXdXN2ErbGJ6bkh6T1l5OExLVzFDL3VSUGJRWTNLVy8wZ085TFh1bkhMdlBMOTdhZmJhOWJGdGM5aG16N0dBdHRqVllsQ3ZRQWlPd0FrL2dDNStoa0xFczZ0cjNBWkt4TEp0T0V3azJkTHhUWVdzSUIvai9Ub1d0SVd6bzkwNkZyU0c4aWFxcXFxcXFpSWlJaUFnek16TXpOeitBeUsrMDEvemk4bjhTK1kxTWpvUmFRODBXVS9HOE1CbE8rNTNWUFhBTnJXbTR3ekdVVlpVampCSlpWZGhwY2ZranNtY1dhTytVRWxkWGkxZSt6cStIT3NDcGtuWXNodWg4cE9MSVNKdW43VE4wRUlHVzJ4VG5sT0ltZWVjbm9HVzRyYXhlMkcxVDNIRXZmWVVZTWhHK2dBRk9Bd2g1bks4bVpod0pNbU43cjIyNFFWc05Gdlo4N1owcWF0dmtua2x5UERLM0h5NDVQZ1ZLWGppNTJXZW40ZDRQbEZWVllHbk5hcCtmU3BGYks5MHJZbmhVYzZuOTFRM0FZOUUwdEpPRnJjZlp0bS80OTFYYmNHL2pzVmlVUFBYNzZxbWV1aXorcVkxSGs3LzFWUE00MDV6V1Z1b2hlTFVpbXBXWWRWekNtVWRLSGViTWR6Z3JZcmI4bUwyZWVMU25SV0hkb25mWmE4UnNPVTlGMzd3KzU5MWw1RkxZSGlPcVdlSHRFL2xXckJIY1JLcDN1aHRyOHlYbThMVS81bXMrTk02WktzcXU5MGNGWjRvNTgrazRyZHJ0Qjk3TkFERmJ3bUVHN2xYcXZpcmhPVE9xVTE0eHVVRjJteUlqVVJjUEhyUE9RNGxtTTNQZU1nN2JVdWswbm5aaTY3YlhzVTZIOGxocUlvOFRhT3JFYWZDTzFBUks5UGpDMFFPb3EyQnhtTWRnWUI5Ry9sSWI5KytmcU5KMnM3QkhHRnlCTm1aQVI4SjNLQ28wMTJpa2FTUDhCQ3JmNlZJMFg1eGRuYmhISU8rQjVyYk95QjU0elhremZPYnlKNGVjd3hmcUJKTUxGYzdtNTlyTmN3N2hvSG5GWjBiMDB6ZWUrZ1RxdmptNjFQYjR4bjBrY0RYNGp2SE0wckJYWnlwRzNEQ0tuRC9XYWEvWnRIbXRGUGdPNWVFVHgrazdSclZnM2FTd20yWW9OWG5DczNYUFFEaE5uK0ZpYTZJbE9PdUlHNlZKSDdUUDZhdmEyNmVoS0hRYTJUNE4wdGNaOWRQQ0dvM1pkbk5sdHNIUWJlWXQ1dlBuSmV6Vi9jQWVOeXBkbWwxdkNISThNODFuU1JQNVFpMittSTh2L3N4aVpydTkxODduUnRwM2YvNDJOZW1jT05hKzRlVkMzUENaemM4OGFaaDg1MUNxU3NzaGU3MHVQeGVOL2RtWXdsd2IzdHJ3TXJOMUdxOGpibkFwY1ZEeC95RFBlWXM1LzdyNjJ0c1E2bExnK0RpRlhURWh6UjlkSHF2MGlUNHRnajgyNVcrSDNYaVJVTlVaVDJrUjlSaTArbHArVU0zaVF0Uzh1T0UyM0x5NEtZdHZxSDEzamdoVW50SlJBZXd1ek5MRFhwOFJ4ZGNhQTNjTVk2VE8ySWVTRlJYZXplV0lqQ3F5aHNVZE1ZdUNnWVRaU0twQnlwZTF6UmZxOEZzaHZmQlBjNkJBUVdsNy9ReElEcDNWR28xSjN2bjQyT0VzM3F6bndzK1lMUlhieW15QjE5YTlYQng2bi9vd2N5eGxFWXlGV0NpK2tHOUYrRXlELzR5bjgwK2FnYVo5UDdheTJEbnk5OWFLMm85MUZrZkVPWThoQnd5Zmk1dXd4Mnk1U2FIbUcrb3EvemwxRlgvOGlyT2Y4WTN2QWNYLzZ1TFA2QTZudk1PMjRlZFNHUGpRYzgyN1J3MmF0WCt6MmJLcTBDbVc5bU90WW5yNS9BZkRhMVpmUGFYbkt0bFdib3J1cDdRWXgrT3IydVdiK04zTi8vMit5RGNYTXFJSmRmNTV4bDcvdnNqNFdvUFBseEx4dFZya0o0dy90VGUzbUxkQVRPT1l3eGNxNTJ3NVd4ejVNYlBkVnM1TzgvbGhmRTdkUGowYklpUFEzUVYwaXFtNG0zWVg4aFJmYzZqUTNmV2VwZXZNcVVESmQ4Nlo0dndNNDBDV0hubitXcGhzR0hmaWVGMDJEM3RtWnZwV0Qra0JwTkNGY0xuWmhjbW1yaHBHenpiZEErc1ExYXIxOE9KRDg3SU9LT0ZvUk56bmFIUE5IVWZVTmh2WTFpVSt1aHZFdnBLSGFVbjNxSzNleFZWeVg0am9pcHAzdW03Rm1ZSldtQStXYklEc2hScGJWUng1L25xc3RDZ3k4N0ZHYmZWQjh5REdDcVMrMnFDc25Sd25TQU42emd6eGZkQjJuQlQvdlo0LzZ1eGI2b0g4YjRWQlJ4aUlCOTN3TGE0N2hHM3cyU0wvMloyN3lPWEpGd1pwU0phQll5dmFqQTd2UlJZTktxbGpYS3B0L0NGRC90U01yMThES0tid0IweGdnQmVQYXRsMW5raTB5dnFXNXpjaGx5Wm1KME9UeEozRCtmc1lKcy9teFlONStMZTVvYWd0Y2wrWXNWdnk4a1NqSTJZR3ZHanZtcGtSUzlXMmR0WHFXblZ1eFVoVVJtMWxLdG91L2hkRXExOVZCcDlPakd2SEVRU21ycHVmMlIyNG1YR2hlaWw4S2VpQU5ZOGZXMVZFUlVmQkltYjY0ajEyY2FCWm1SVmlaSGJlVk1qQ3JQRGc5QTkwSVhydG5zWUN1WnRSUTBQeXJLRGpCTk9zUGZLc2cxcEEwMmdIbFZyME9YaUZodHA2bkpxWFZ6Y2JmTTBLbnpDM2dnT0VOUEU5VkJkbUhLTjZMWWFpamI0d1h4Sm41QTBGU0RGNWoraDFvb1p4ODg1SnQzWkt6TzVuN1o1V2ZORU90eXlQcVFFbm43V0x2NUZpczNQZGdNc2hqRjFGUnlkYk55ZUJieUtJMW9OMVRSVnJWSzdrZ3NiL3pqWDRORFBJUk1jdFZlYXhWQjM4VmgxeDVLYmVKYlUxMzhBTTVLem1adTN1bnkwRXJ5Z3hpSkY3R1ZYVXJQekZ4cmx4MXVGZEFhWkZETjljdkliNzRxRDl0ekJNbzdMN1dJRVlLK3NsYTFEVk1IcEYwRjdiMytZNlMremp2TGVETUNwYXBtSm8xd2VCV3V4S0Yzck9vY2loMWd1bjRCb0poMWtXblYvSm1pcTZ1T2hLM1ZmS3hFSEVrYWZqTGdLM291amFQelk2U1hnOHBoaEw0VE5SMXh2SmQxV2EwYVlGZlBVTUxyTkJEQ2g0QXVHUlRidEtNYzZaMVVkajhldlkvWnBDdU1BVWVmZG82OURaVW5nb3FFMVA5QTNQSmZPZjdXaXhDRWorWTZ0N2ZZZUhiYnhVQW9GVjNNODljQ0tmbWEzZmMxK2pLUmU3TUZXRWJRcUVmeXpPMngvd3JPMlZZSDdpWWRROUJrUHlJOC8za1hCcExhQ3BVN2VDMFl2L2FtL3RFRHU3SFpwcWcwRXZIbzBuZi9SL2dSelVXeTMzL0hYTUpRZXUxR3lsS21Pa1h6bENmR0ZydUFjUFBoYUdxWk90dTE5enNKMVNPMkp6NFp0dGg1Y0JYNm1SUXdXbUR3cnlHOUZVTWxaek5ja01kSytJb01KdjFyT1duQmFtUzJ3MktIaWFQTVBMQzE1aENabTRLVHBvWnlqNEUyVHFDL1A2cjcvRWhuRE1oS2ljWloxWnd4dUM3RFB6REdzNTNxOGdYYUk5a0ZUSysyTFRxN2Jod3NUYnJNVjhSc2Z1YTVsTVMwRndiVGl0VVZuVmExeVRiNUlYNTFtbVluVWNQOXdQcjhKaTF0aVlKZUpWOUdaVHJRaEY3dnZkVTJPVFU0Mm9nSjlGRHdobXljSTJMSWcrKzAzQzZzY1loVXlVdU1WNXRrdzZrR1VvTCttak5DMzgrd01kV05sam42dEdQcFJFUzd2ZXFyU241VFJ1ditkaDZKVkwvaURIVTFkYjRjOVdLMysrT3JIM1BxemlGOTE2VU1VS244RzY3bk42MEdmV2lIclhZaFVHM3lWV215WWFrNTlOSGo4dDFzbUc0VURpV3oyclBITnJLbk40Wm8xTEJicjIvZUY5WVowbjBibHgybkc0WCtFS0Z4dlMzVzI4SkVTRCtGV2s2MVZDRDN6L1VSR0hpSmwrKzdUZEJ3a0NqNnRHT0gzcURiMFFxY09GOUt6cGowSFViL0t5RlczWWhqMlZNS0pxR1psZUZCSDd2cXZmN1dxTEMzWE11SFY4cThhNHNURnV4VXRrRC82SklCdkthVmp2OTZuZGdydUtaMWsvQkh6cWYySzlmTGs3SEdYQU55TERkMXZ4a0svaTA1NXBuemwrenc2ekxud1hsVllWdGZtYWNKZ0VwUlAxaGJHZ3JZUFZONnYybEcraWRRTkdtd2NLWHUvOHhFai9QNnFlL3NCMldtd05wNnBwOGphSVNNa3dkbGVGWFlLNTVOSFdMVFRidXRTVXFqQmZER1dvL1lnOTE4cVErOEJSWlNBSFpiZnVOWnoyTzBzb3YxVWU0Q1dsVmczckZoTTNLbGpqOWtzR2QvTlVoazRuSCthNVVOMisxaTgrTk0zdlJOcDd1UTZzcWV4U0N1a0VWbFZacmlITnFGaTVyTG05VE1XYTRxbTNpZEpxcHBRQUNvbDJsNFZTdXZXTGZ0YTRKY1h5M2JST1BOYlhPZ2RPaEc0N0xDMEN3Vy9kTWxTeDRKZjE3YUVVM3lBMXg5cCtZYzBqdXBYZ2NNdVlOa3U2NGlZT2tHVG9WRHVKdmxiRUtsSnFzbWlIYnZOcklWWkVIK3lGZEY4RGJsZVo2aU5pV3dNcXZ0TXAvbVNwd3g1S3hSclQ5cDNNQVBUSEd0TWJmdmRGaHlqOXZoYUtjbjNBdDhMYzE2QWkrdkJjU3AxenRYaTdyQ0paeC9xbDdUWGNjbHE2UTc2VWVLV0R5OWJvUzBXSElqVXVXaFBHOExCbVc1eTJyaHVUcE01dnNMdCtIT0xoMVlmMERxWGE5dHNmQytrYUt0Mmh0QTBhaS9MMmk3UktvTmpFd3p0a21SVTBHZmdXMVR4VXZQRmhnMFY3RGRmV0prNWdmcmNjcFl2K01BOU0wZGtHVExFQ2VZd1VpeFJ6alJGZG1qRzd6ZFpJbDNYS0I5WWxpTktJMzFsZmE3aTJKRzVDOFNzK3JIZTBEN1o2OTYvVjNERUFPV0huUTl5TmFoTVVsNWtFTldTNnBIS0twMkQxQmFTcnJIZEUxdzJxTnhJenRwWGdVSXJGMGJtMTVZTUw0YjZWMWsrR3BOeXNUYWhLTVZyclM4NWxUVm85T0dKOTZJNDdlQXk1cllXcFJmL21JemVvWVUxREthUUNUVVZ3cmhIZXlOb0RxSGVsK2xMeHI5V0t6aFNZdzd2clI2K1Y1cTBwZmkyazNMMXpxa3ViWTZycmQ5Wkx2U3VXTmYwdXFua1krRnBUdkZ6U1c5RnAwYjlsOEpBN1RIVjllQ2kvUFkvU0NaSVVZeDNCVTJhbGo3Q20zVlY2ZVlwaW9zNGI2V3VOT0pkWVhVSzN6VHFqNUNWRzJGcVlNNFo3Q3VJVTBxTzA1WFIwZDcxRkhNMFloWm1KbVRSZkxsWEV1bU44MkJHdHpkWDBTMTl0MWUrYlVpZUs4elJtcXBhNFFjNVRTamlmbWFRc1kyRVRMamhJMzZnTVIxKzdxcGpkWFhIaWNlVWVrZkJhdWNIU2hBT2lGWG12M3NObUdReVU1aVZnbm9vY3VvblFYRVBURndzbEh0UzhSK0E0N1N0STl3ajBpU3J0Ymk1ck15c2N6RmlJbXNRK2JkRkNsbkZqanBYWHdNeTZPN3Fmak9yOEZiMGE3T0RJdGlzam5uM0VRTzE2K3lwZDFjd3lhQVc1WXp4ejVRa25mTU83NjQzZlhXL0k5eTNVMnhIMjdPYXBxcjU2Wi90RXpnbGo2SWJUNkhFSGpvcGlYcWVSYmU1bVFRdnh0Y2JET1Z2ZXJOMFpnTWR6cVJZUmphWHRNUmQ1NlE0Y1pTbWRQdlpKZFNyaEoxRDl6TlhQcUFFcVBJYXZQZGZ1YnQ1b2tlMmttdjBkenRJc3pTdjJWWXVveWYxVXVvcGJzWWIrdVg5aDZXcHdqcGd0WjZmTk5hd05KNHE4TzNDRm9TYmlvQWFPU1pNeDJHWWFQWUIrckViNnFqUWlOUkZRNzZUdndORlZLRCtCaEg5VmhjS0dzWHptTUk3QnB0VS9DTldvbE03WXpST3ZwRkFudHNpV0pwNmVSMmQzR2FyY1lTaFZZU1VxaG1ZT1dqNUU5Nk5LMld2bVlOVGVZN1pzNFJVRWR2OWg5UVQ0RXNlS3Q2THpMcnFFT3MzaHhBWTFNYU5XcFNhNnpaeDhGM1lPVmVDWU1TODhXK0NZSER1V2U0eW9jNllLK2RqRHVFT3JCUjVsdmgwcitROXVNODhscmp4OXg5QXRncFFWTkU4ciszTzZHdnc1OUQra0JGL1VNWHlobGlZVXRQam12WEdZNkRrM3gra0VPVytHdGRNVkM0RVpUcW9TL2ptUjBQMExTNzVET2MvdzJ2bnJpOTdNNFNkYlo4cWVVN2dnOERWYkVSa1U1Z2VhTVFPM21ZclNZeUFuZ2VVUXFyTjBDMC92c0ZtY2dXTlhOZWlkc1RBajcvNE1uY0pSMGNhYUJVcGJMSzF5QkNCTlJqRXY2S3Z1VlNkcFBuRU1KZHNSUnRxSitVOHROMWdYQTRlUEhjNlpUMGV2aUk3M1VPSkYwZkVaOFlhbmVBUXFRZEdwaE52d000bklxUG5YeFYweEEwZm5DVCtvQWhKdXl3L3E4ak8weThDalN0ZVpFeHdCcElONlN2TnA2QTVHL2FiaTZlZ2VORC8xR1RndWh1TmphVWJiblNiR2Q0TDg5MzdFem0zNEV5aTZuMW1hZU9CeGgzUEkwanpKRGY1bWgvQnNMRDdGMkdPS3ZsQS81Z3R2eEkzL2VWNHNMZktXNVd5K29pbytlcy91NlQ4VVUrbnNvZnk1N0ljYi9KbFpIUEZ0Q2dkL3grYnd0M1pUK3hYVHRUdFRyR0FiNFFlaEM2WDlHKzhZVCtvemNMeERzZENqc3VPcXdQRm5yZExZYUZjOTJVaTBtNGZyMzlsWW1sQ2FxVGl0N0c2Ty8za1dEa2d0WGpOSDRCaUVtLytqZWdRbmloT3RmZmZuMzNXeHNGamhmTWQ0OEhUK2Y2bzZYNjVqN1hSOFdMU0hNRmt4YnZPWXNyUnNGMWJvd0R1U1ExOE1reGs0cXoyem9HUEw1ZnU5aDJIcW10MWFzbDNRM1l1M3N6T2Mrc3BpQ21YNEFFVEJNM3BMb1RZU3Azc1Z4YWh5aEw4ZUM0bVBOOWsyeDNvMHhraWl4SXpNM0NaRnpmNW9SNG1lY1E1K2F4MndDYWgzL2NybW5Ib3FSMCtLTWFPUHhSaWYxb0VGUkZPTy9rVFBQbXR3dytOZk1YeEVLNmduNmlVMzJVNmZGcnVJejhRNFdnbGp0bmFDVlRCZ1d4N2RpVWRzaEM5WkVhNXlLcFJCQmVXMTJyL2lOYy8rRWdOcW1oc3dOQjhTQm9paEhYZURGN3JyV0RMY210M1Y4R1lZTjdwWFJ5NERaamo0REp1VUJMNWlDM0RRQWFvbzR2a2Z0cVZUWVJHTFMzbUhaN2dkbWRUVHFiZ05OL1BUZFRDT1RnWG9sYzg4TWhYQUVVTWRYMGl5MUpNdWs1d0xzZ2V1MFFVWWx6MlM0c2tUV3dKejZwT20vOGlocm1nR2ZGZ3JpK1pXVUsyZ0FQSGdiV2E4amFvY2RTdU00RkpZb0tpY1lYL1pTRU5rZzlRMVp6SmZ3U2NmVm5SMkRlZ09Hd0N2bW9nYVdKQ0xRZXB2OVdObFU2UWdzbU93SUNxdVUyOE1sazNkOVc1RTgxbFUvNUV6MExjWDZsd0tNV0RObHVOS2ZCRFV5L3BoSmdCY01uZmtoOWlSeHJkT3pnczA4SmRQQjg1THdvK0dVU2I0dDNuQyswYnlxTVp0TzJmUUo0VTJ6R0lyNDl0LzI4cW1tR3YyUmFuREQ3YTNGRWNkdHV0a1c4dHd3d2xVU3BiOFFhbG9kZGRiQmZOSEtEUTgyOEJkRTdPQmdGZGlLWW9oTGF3RllxcHliUW94QVRacmhlTGhkSTcrMFpsdTlRMW15UmNkMTVyOVVJbThLMkxHSnhxVGVnbnRxTlZNS25mMWE4elFpeVVSMXJ4b3FqaUZ4ZUh4cUZjWVVUSGZEdTdyaGJXbmc2cU94T3NJKzVBMXA5bVJ5RVBkVmtUbEUyNHZZNTRXN2JXYzZqTWdadk5YZGZDOS85cTc0MDhLRHNiZEw3VXR6N1FGU0RldHoycGljQXJ6cmRwTDhPYUNIQzlWMjZScm9lbXREWjV5Tk0vS0drV015VG1mbkluRXZ3dFNEMjNVY0ZjamhhRTNWS3prb2FFTUtHQmZ0NFhiSU82Zm9yVFkxbG1HUXdWbUtpY0JDaUFyRHpFKzFvSXhFMDhmV2V2aUlPRDVUem5xSCtPb0hhZHZvT1AyMGRyTVBlNUlyZzNYQlF6aVcyWER1SFl6anFRUTR3eVNzc2pYVXM1SCt0M0ZXWU1IcHBVbkJITXgvbllJVDVkN09takRiZ0Q5RjZuYTNtNGw3S2RrZVNPM2tURVBYYWZpV2lub2dhZzdiNTJ0YWlaaEwxVFN2QkZtRVphZkZxMkg4a2hRYVpYdWl0Q2V3VDVGQmdWdFBLMGo0eFVIUGZVejNRMjhlYWMxWjEzOURBUDIzZGdraTk0RUM4dmJEUFRRQzk3SFBQU1dqVU5HNXRXS01zYXhBRU1LQzA2NjVYdm8xTnRkMDd3Q0xOZjhRNTZtckVQVnBDeGxJTVZsUWxXUnhNM29BZnBnSWMrOEtDM3JFWFVvZzVnMDZ2dDd6Z1hZOGdySDdoaHdWU2FldXZDMDZZWVJBd3BieWsvVW56ajloTEVaTnMyb3hQUUI5eWMrR25MNnpUZ3E3ckkrK0tESndYMlNQOFNkNll6VHV3NWxWL2tVNmVReFJEMTJvbWZRQVc2Y2FUUjRMaWtZa0JCMUNNT3J2Z1JyL1ZZNzUrTlNCNDBDbmk2YkFEQXRhSyt2eXhWV3BmOU5lS0p4TjJLWVE4UTJ4UEIzSzFzN2Z1aHZXYnIyWHBnVzA0NFZENkRSczBxWG9xS2YxTkZzYUd2S0pjNDdsZVVWM3BwcFAvNVZUS0ZoYUd1b2w0RXNmamY1enlDeVVIbUh0aENoY1loNGhZTFFGK0FGV3N1cTR0MHdKeVdnZHdRVk9aaVYwZWZSSFBvSzUrRTF2ano5d1RKbVZrSVRDOW9Fc3RBc3laU2dFL2RiaWN3S3I4OVlVeEtaSStvd0QyMDVUbTVsbm5tRFJ1UC9Kbnp4WDNnTXRscmNYMFVlc1pkeHlRcVlRdUVXNFI1MXZtUTV4T1p0ZVVkOFNKcnVNbFRVemh0VncvTnE3ZVVCY3FOMi9IVm90Z2ZuZ2lmNjB5S0V0b1V4M1dZT1psVkp1Sk9oOHU1OWZ6U0RQRll0UWdxRFVBR3lHaFFPQXZLcm9YTWNPWVkwcWpuU3RKUi9HM2FQK0p0MXNMVmxHVjhQT3dyLzZPR3NxZXRueUYzVG1UcVpqRU5mblhoNTFveGU5cVZVdzJNNzhFekFKK0lNOGxaMU1CUFE5WldTVmM0SjNtV1NyTEtyTUhSZUE1cWRHb3owT0RSc2FBK3Z3eFhBMmNBTTRxbGZ6QkpBNjU4MW00aHp4SXRRdzVkeHJyQkwzWTZrQ2JVY0Z4bzFTOGp5VjQ0cS8vKzdBU05OdWRaNnhlYU5PU0lVZmZxTW40QTlsSWpGY3RZbjJncEVQQWIzZjdwM2lJQk44SDE0RlVHUTljdDJoUHNMK2NFc1RnVXJSNDd1SlZONG40d3Qvd2dmd3dIdU9uTGQ0eW9ia29meThKdnhTUVRBN3JNcERJYzYwOFNsWkZKZlpZY21iVDB0QUhwUEU4TXJ0UTQyc2lUVU5XeHF2V1pPbXZ1OWYwSlBvUW1nKzZsN3NaV3d5Zmk2UFhreEpud0JyYVVHME1ZRzR6WUhRejNpZ3kvWHNGa3g1dE5ReHc0M3F2STlkVTNmMERkaE9VbEhLam1pMVZBcjJLaXkwSFp3RDhWZUViaGgwT2lEZE1Zc3BvbFFzWWRTd2pDY2plb3dJWE5aVlVQbUwyd3dJa1lobVhLaEdvemRDSjRsUktic2Y0TkJoL1huUW9TOTJOSkVXT1ZPRnMyWWhOOGM1UVpGZUswcFJkQUc0MGhxdkxibW9TQTh4UW16T09FYzd3TGNtZTlKT3NqUENFZ3BDd1VzOUUyRG9oTUhSaFVleUdJTjZURnZyYm55OG5EdWlsc0RwenJINW1TNzZBUG9JRUptSXRTNjdzUUorbmZ3ZGR6bWpQeGNCRUJCQ3cwa1dEd2QwRVpDa05lT0Q3Tk5RaHRCbTdLSEw5bVJ4ajZVMXlXVTJwdXpsSUR0cFl4ZEg0WlBlWEJKa1RHQUpmVXIvb1RDei9peXBZNnVYYVIyVjFkb1B4SllscncyZ2hIMEQ1Z2JyaEZjSXh6WXdpNGEvNGhxVmRmMkRkeEJwNnZHWURqYXZ4TUFBb3krMSszYWlPNlMzVy9RQUtOVlhhZ0R0dnNOdHg3S3MrSEtnbzZVMjFCK1FTWmdJb2dWNUJ0K0JuWGlzZFZmeTlWeVhWKzJQNWZNdXZkcEFqTTFvL0s5WitYbkU0RU9DcnVlK2tjZFlIcUFRMC9ZL09tTmxRNk9JMzNqSC91RDFSYWxQYUhwSkFtMmF2MC94dHBxZFhWS05EcmM5RjJpem8yM1d1N2ZpcmdiVVJGRE5YOWVHR2VZQmhpeXB5WFpmdDJqM2hUdnpFNlBNV0tzb2QvL3JFSUxEa3pCWGZpN3hoMGVGa2ZiMy8xenpQSy9QSTVOazNGYlp5VGw0bXE1QmZCb1ZvcWlQSE80UTRRS1pBbHJRM01kTmZpM294SWp2c00za0FGdjNmZHVmdXJxWVIzUFN3WC9tcEd5L0dGSS9CMk1OUGlOZE9wcFdWYnMvZ2pGM1lIK1FBOWpNaGxBYmh2YXNBSHN0QjBJSmV3MDlpQWttWEhsMS9URWoranZIT3BPR3JQUlFYYlBBRE0rSWcyL09FY1VjcGdQVEl0TXRXNERkcWdmWVZJLys0aEFGV1lqVUdwT1AvVXdOdUI3K0JiS09jQUxiam9iZGd6ZUJRZmpnTlNwMkdPcHh6R0xqNzBWdnE1Y3cyQW9ZRU53S0xVdEpVWDhzR1JveDRkVmEvVE40eEt3YUtjbDlYYXdRUi91TnVzNzAwSGYxN3B5Tm5lenJVZ2FZOWU0TUFEaEVEQnBzSlQ2eTFnREpzMXE2d2x3R2h1VXpHUjdDOGtncGpQeUhXd3N2cmYzeW4xekpFSVJhNWVTeG9MQVpPQ1I5eGJ1enR4RlJKVzlabU1ZZkNGSjBldm05RjJmVm51amU5MlJjNFBsNkE4Ymx1TjhNWnl5SkdaMCtzTlNiLy9EdkFGeEMyQnFsRXNGd2NjV2VBbDZDeUJjUVYxYng0bVFNQlAxSnhxazFFVUFETkxlaWVTMmRVRmJRL2Mva3Z3SXRiWjd0eDBzdDE2dmlxZDUzV3NSbVBUS3YyQUQ4Q1VuaHRQV2c1YVVlZ05wc1lnYXNhdzIrRVZvb2VOS21yVzNNRnRqNzZiWUhKbTVLOWdwQVhaWHNFNVU4RE04WG1WT1NKMUYxV25MeTZuUXVwK2p4NTJiQWIrckNxNnk5V1hsMkIyb1pEaGZEa1c3SDNvWWZULzR4eDVWbmNCdXhNWFAybE5maFVWUWpTU3pTUmJ1WkZFNHZGYXdsenZlWHhhWUtWczhMcHZBYjhJUllGM1pIaVJubTBBRGVOUFdvY3d4U3pOc2VHN05yU0VWWm9IZEtXcWFHRUJ6MU44UHQ3a0ZicWgzTFltQWJtOWkxSUNoSXBMcE01QVM2bXI2T0FQSE13d3puVnk2MVlwQllYOHhaRE4vYStsdDduK3g1ajRiTk9WdGVaOGxqM2hwQUhTeDFWUjh2WkhlYzRBSE85WEZDZGpaOWVSa1NWNjVsak1tWlZ6YWVqMnFGbi9xdDFsdld6TlpFZkh4SzNxT0pySEw2Y3JyMENSek1veDVmMmU4QUxCQjRVR0ZaS0EzdE42RjZJWGQzMkdUSlhHUTdEVGk5ai9kTmNMRjlqQ2JEY1dHS3hvS1RZYmxJd2JMRFJlTDAwTFJjRFBNY1F1WExNaDVZemd0ZmprRksxRFAxaUR6ellZVlp6NU0va1dZUmxScGlnMWh0VlJqVkNrbm0raDFNNUxpRURYT3lIUkVodnpDR3BGWmpIUzBSc0syN28yYXZnZGlsckprYWxXcVBXM0Q5Z213VjM3SEttZk0zRjhZWmoyYXIrdkhGdmYzQjhDUm9INGtESElLOW1yQWcrb3dpRXdOampkOVYrRnNRS1lSOGN6SnJVa2Y3UW9pMllhVzZFVkRacDV6WWxxaVl0dVhPVEhrNGZBY1o3cUJiZExEaUpxMFdOVjFsMitIbnRrMW1NV3Z4clltYzhrSXg4RzNyVzM2SjZSYTRsTHJUT0NnaU9paG1vdytZbnpVVDE5amJWMkIzUldxU0h5eGtobWdzQnFNWVd2T2NVb20xakRRNDM2K2ZjYnUzeGYyYmJlcVUvY2ErQzRET0tFK2UzcXZtZU1xVzNBeGVqZnpCUkZWY3dWWVBxNEwwQVBTV1dvSnUrNVVZWDRxZzVVNllUaW9xUUdQRzlYcm51Wi9Ca3h1WXBlNkxpODcrMThFc2t5UVcvdUErdWsycnBIcHI2aHV0MlRsVmJLZ1drRnB4K0FaZmZ3ZWl3MitWaXR0a0V5Zi9pZmluUy8wSXRSTDJKcTN0UU9jeFBhV08yeHJHNjhHZEZvVXBaZ0ZYYVAyd1lWdFJjNnhZQ2ZJMUNhQnF5V3BnNGJ4OE9IQlF3c1Y0WFdNaWJaWjBMWWpXRXkySXhRMW1acmYxL1VOYllDSnBsV3Uzblo0V3BvZElHVkEwNWQrUldTUytFVDl0SDNSZkdHbU5JMWNJWTdldlpacTdvK2EwYmpqeWdwbVIzbVZmYWxrVC9TWkdUMjdROFFHYWx3R2xET1M5VkhDeUZBSUwwYTFRN0ppVzNzYXo5Z3FZOGxxS3luRnJQQ3p4a1U0U0lmTGM5VmZDSTVlZGdSaERYczBlZE85OTJuaFRLSHJpUkVQMU5KQzZTUk9NZ1EweE81a05OWk9oTU9JVDk5QVVFbGJ4cWVaRjhBM3hyZkRKc1d0RG5VZW5BSGRZV1N3QWJZakZxUVorRDVnaTNoTks4Q1N4VTlpNmY2Q2xMOUlHbGoxT1BNUUFzcjg0WUc2aWpzSnBDYUdXajc1YzN5T1pLQkI5bU5wUU5QVUtrSzBENndnTEg4TUdveVJ4VFg2WTA1UTRBbllOWE1ad1hNNGVpai85V3BzTS85Q29SbkZRWEdSNk1FYVkrRlh2WEVPM1JPMEphU3RrNk9YdUhWQVRISkUrMVcrVFUzYlNaMmtzTXRxak8wemZTSkNkQnY3eTJkOERNeDZUZlZtZTNxMFpwVEtNTXU0WUwvdDdjaVROdGREa3dQb2doM0Nuang3cWswOFNId2YrZGtzWjdNMnZDT2xmc0YwaFE2SjRlaFBDYUhUTnJNL3pCU09xRDgzZEJFQkNXL0YvTEVtZWgwbk9IZDdvVmwzL1FvLzlHVURra2JqN3l6KzljdnZ1K2REQXR4OE56Q0RUUDRpS2Radms5TVdpaXp2dElMTGVweXNmbFN2VExGQlozN1JMd2lyaXF5UnhZdi96cmdGZC85WFZIaC9PbXpCdkRYNG1pdE1SL2xVYXZzMlZ4NmNSOTRsekFrcGxtM0lSTnk0VEZmdTQ3dHVZczlFUVBJUFZ0YTRQNjR0VitzWjduM3VlZDNjZ0V4MllLK1FMNSt4bXM2b3NrOHFRYlR5dUtWR2RhWDlGUXFrNnFmRG5UNXlreGswVks3S1o2MmI2RE5EVWZRbHFHSHhTTUt2MVAwWE41QnFNZUtHMVA0V3A1UWZaRFVDRWxkcHBvWDBVNnNzMmpJa28yWHBVUktDSWhmYU9xTFBmU2hkdFMzN1pyVCtqRlJTSDJ4WVZWMXJtVC9NQnRSUWh4aU80TVEzaUFHbGFaaSs5UFdCRUlYT1ZudTlqTjFmOTIxbFdMWmt5OWJxYk0zSjJNQUFJOWptdUF4M2d5b0VVYTZQMml2czBFZU52L09SK0FYNnE1U1c2bDVIYW9GdVM2anI2eWc5bGltdStQMEtZS3pmTVhXY1FTZlRYenBPektFS3B3STNZR1hacFNTeTJMVGxNZ2ZtRkEzQ0Y2UjVjOXhXRXRSdUNnMlpQVVEyTmI2ZFJGVE5kNFRmR0hybkVXU0tIUHVSeWlKU0RBWitLWDBWeG1TSGpHUGJRVExWcHFpeGlhMnV5aFEzOTRnQk10N0MzWkFteG4vREpTK2wxZkJzQW8yRWlyL0Mwakc5Y3NkNCsvdHAxMnBQYy9CVkpHYUs5bWZ2cjdNL0NlenRybUNPNXFZMDZFZGk0eEFHdGlFaG5XQWJ6THkyVkV5YXpFMUo1blBtZ1U0UnBXNFNhMFRuT1Q2dzVsZ3QzL3RNcFJPaWdISG1leEJHQU1ZMG1kY0RiRHhXSXo0MU5nZEQ2b3hnSHNKUmdyNVJuVDZ3WkFrVE9jU3RVNE5NT1FOZW1TTzdneEdhaGRFc0MrTlJWR3hNVWhRbW1NMGxsV1JiYm1GR0h6RXFMTTRJdzBINzU3N0t5bytaZisyY1VGSU93OTNnRVkxNzF2UWFNMEhMd3BqcGRSUjZKejdWMGNrRTdYellKMFRtWTl6bkxkemt2YTB2TnJBR0dUNVNVWjV1YUhEa2NHdkkweVNwd2thc0VnWlBNc2VZY3U4NXc4SFBkU05pKzRUNkE4M2lBd0RieGdlRmNCMVpNMmlHWHpGY0VPVWxZVnJFY2thT3lvZGZ2YVlTUTdHdUI0SVNFMG5ZSmMxNVgvMWNpRFRQYlBDZ1lKSzU1VmtFb3I0THZ6TDlTMldEeTR4ais2Rk9xVnlUQUMyWk5vd2hlZWVTSTVoQS8wMmw4VVlrdjRuazlpYVZuK2tDVkVVc3RnazVIeXErZ0ptNlI5dkczcmh1TTkwNGhlL2hGbU5RYVVJQVRCMXkzdncrT214UDRYNVlpNkE1STVqSnVmSENqRjkrQUdOd25FbGxaalVjbzZYaHNPNVQ1K1IzeXh6NXlMVk9uQW4wenVTKzZ6ZGowblRKYkVaQ2JYSmR0cGZZWmZDZUNPcUpIb0UydlBQRlM2ZVJMaklKbEc2OVg5M25mUjBteFNGWHpwMVpjMGx0L1ZhZkRhSW1oVU10Ym5xV1ZiOU00bkdOUUxONjhCSFA3QVI4SWw5ZGtjeHptQnY4UENabHc5Z3VZMGx1cmJCc21OWWx3SlpzQS9CMTUvSGZrYmpid1BkZGFWZWNscy9lbG1ESE5XMnI0Y3JBeDQzZmVOa2ZSd3NhTnEveXlKMGQvcDVoWjZBWmFqejdEQmZVb2swWlU2MmdDeno3eDhlVmZKVEtBOElXbjQ1dklOTFNNMXErSEY5Q1Y5cUYzelA2TWwyMWtQUEwzQ1h6a3VZVWxuU3FUK0lqNHRJL29kNUt3SXMrdERhakRzNjRvd043dE9BZDZldWNHeitLZk8yNmlOY0JGcGJXQTU3MzJiQk5XTzRrSE5wcjlEOTU1TDYxYnZIQ0YvbXdTcno2ZVFhRGpmREVBTnFHTWtGYytOR3hwS1p6Q0Qyc2ovSnJIZCt6bFBROEl6N1ErMkpWSWlWQ3VDS29LL2hsQUVIenZrL1BpcTNtUkwxclQvZkVoOWhvVDVHSm1lWXN3ZzFvdGlLeWRpekovZlMyU2VLSFZ1NlozSkVIamlXOE5hVFFnUDV4ZEJsaThuQzU3WGlOOWhycXVCdTk5aG45enF3bzkyK1BNMkpYdHBlVlpTMFBkcVI1bUR5RHJlTU10RXdzK0Nwd2FSeXl6b1l0ZmN2dDlQSklXMGZKVk5OaS9GRnlSc2VhN3BlTHZKckwrNWI0R09YSjh0QXIrQVRrOWY4S21pSXNSaHFSeTB2Rnp3UlYzWjVkWjNRcUlVOEpRL3VRcGtKYmpNVU1GajJGOXNDRmVhQmpJNCtmTC9vTjMrTFFnakk0enVBZlErM0lQSVBGUUJjY2YwY2xKcHNmcG5CeEQ4NGF0d3R1cGtHcUt2ckg3Y0dObC9RY1djU2k2d2NWRE1MNmxqT2dZYm8rMkJPQVdOTmpsVUJQaXlpdFVBd2JuaEZ2TGJucXc0MmtSM1lwMmt2MmRNZURkY0dPWDVrVDRTNk00NEtIRUIvU3BDZmw3eGdzVXZzK0pOWTlHM08yWC82RkV0OUZ5QW41N2xyYml1K3RsODNzQ3ltU3ZxOWVaYmU5bWNoTDdNVGYvVGE3OGU4MHpTZjBoWVk1ZVVVNytmZjE0anY3WHk4cWp6Znp6enZhSm5ySWR2RmI1QkxXS2NXR3k1L3c3K3ZWMmN2SWZ3SHFkVEIrUnVKSzVvajltYnQwSHk5NEFtak1qandZTlpsTlM2dWl5eE5ud055dDNnZHJlTGI2NHAvMyswOG5Ya2I5MkxUa2tSZ0ZPd2sxb0dFVmxsY09qNWx2MWhmQVp5d0Rvd3MwOTQ0VTh2VUZ3K0EvbnVWcS9VQ3lnc3JtV0lCbkh5VTAxZDBYSlB3cmlFT3Z4L0lTSzZQazR5MncwZ21valpzN2xVOFR0YWtCQWRuZTR2L2FOeG1NcEs0VmNHTXA3c2kweXFzaW9sWFJ1T2kxWjFQN1NxRDNabXAwQ1djeUs0VWJtcDJTWGlYdUk1bkdMQ2llRkhLSE5SSWxjWTNQeXMyZHdNVFlDYXFseVdTSVR3cjJvR1h2eVUzaDFQZjhlUTN3MWJuRDdpbG9jVmpZRGtjWFIzT28xQlhnTUxUVWpOdzJ4TVZ3anRwOTlOaFNWYzVhSVdyRFFUNURIUEt0Q3RoZUJQNHpIY3c0ZHoyZVJkVE1hbWhsSGh0ZmdxSkpISTdOR0RVdzFYTDh2c1NlU0h5S3FEdHFvQW1yUXFzWXd2d2k3SFczb2pXeWhJYTVvejV4SlRhcTE0TkF6RkxqVkxSMTJyUk5VUTZ4b2hEbnJXRmI1Ykc5eWY4YUNEOGQ1cGhvYWNrY05KcCtEdzNEdWUzUk0rNVJpZDdFdUlnc253Z3BYMHJVV2gvbnFQdEJ5TWhNWlo2OU5wZ3ZSVEtaNjJWaVorUTdEcDVyNEswZDdFZkp1aXkwNkt1SVlhdVJoNUVjcmhkdDJRcFRTMWsxQXNjRUh2YXBOYlUzSEwxRjJURnlSMzNXeGI1TXZINWlac3JuM1NEY3N4bG5uc2hPOFBMd21kR04rcGFXblF1T1J0WkdYMzd1aEZUNjRTZXVQc3g4VU9va1k2T044NVdkUTFka2k1ekVyc0pHYXpjQk9kZFdKRUtxTlBpSnBzTUQxR3JWTHJWWStBT2RQV1FuZVR5eVAxaFJYL2xNTTRab2dHR09oWXVBZHI3Ri9ET2lBb2MrK2NuNXZsZjB6a01VSjQwWjFybGd2OUJlbFBxVk9weEtlT3B6S2RGOG1hSysxVnYyM01POWsvOCtxcExveHJJR0gyRURRbG5HbUg4Q0QzMUc4UXFseVFJY3BtUjVid21TVnc5L05zNklIZ3VsQ1JlaHZaLytWck02MEN1L3IzQW9udEZmcmxqZXc3NHNrWWUydXluN0pLUXRGUUJRUko5cnlHaWMvelFPc2JTNHNjVUJjdEE4Y1BUb1EzeDZaQlF1NkRQdTVtMWJuQ3RQOFRsbExZQTBVVFFOVnF6YTVuZmV3M01vcHkxR1BVd0c1anNsME9WWG5pUG1BY21McU81SEc4SHYzblNMZWNFOW9PalBEWGNzVHhvQ0J4WXl6QmRqNHdtbnlFVjRrdkZEdW5pcFM4U1NrdmRhTW5UQk45YnJIVVI4eGRtbUVBcC9QZHFrOXVleHRwMXQrSnJ0WHdwTi9NRzJ3L3FoUk1wU054UTF1aGcva0tPMzBlUS9GeUhVRGtXSFQ4VjZnR1JVNERoRE14WnU3eFhpajlVaTZqbHBXbVFDcUpnM0ZrT1RxM1dLbmVDUllaeEJYTU5BVkxRZ0hYU0NHU3FOZGplYlk5NG95SXBWak1ZZWhBaUZ4L3RxekJYRkhaYUw1UGVlRDc0clc1T3lzRm9VWFk4c2ViVVpsZUZUVWEvK3pCS1ZURkRvcFRSZVhOdVpxNDdRamtXbnhqaXJDb21tTzRML0dyRnRWVjIxRXBNeXc4d3lUaEw1WTU5ZDg4eHRseDFnMXR0U0lDRHdub2Y2bHQvNnpsaVB6Z1ZVTDhqV0JqQzBvMkQ2S2crak51VGhrQWxhREpzcS9BRzJhS0EvL0E3NmF2dzJLTnF0djIyM1ArV3EzU3RSREROS0ZGZ3RzRnVrWXQxR0ZEV29vRlZYaXRhTmhiM1JDeUppNGNNZU5qUk9pUEVEYjRrK0czK2hEOHRzZys1aGhtU2MvOHQySlRTd1lvQ3pBSTc1ZG9xOFFUSGUrRS9UdzBSUVNVRGxVKzZ1QmVOTjNoNmpKR1gvbUg4b2owaTNjYUNOc2p2VG5vaDczQnR5WnBzZmxITHE2QWZ3Sk5DRFg0Uzk4aDQrcENPaEdLRGhWM3J0a0tITWEzRUc0Sjl5OHpGV0k0VXNmTnpDL1JsNW1pZE5uN2d3b045ajIzSEdDUVErT0FacFRUUE1kaVZvdzc0MGdJeXVFdGQwcVZ4TXlOWGhIY251WFJLZHc1d0RVU0wzNThrdGpNWG1Ba3ZJQjczQkxhMXZmRjlCQVVaSW5QWUppd3hxRldRUUJWazdnUUg0b2pmVVEvS0VqbitBL1dSNkVFZTRDdGJwb0xlMW16SGthamdUSW9FMFNMREhWYXVLaHJxMTJ6ckFYQkdiUFBXS0N0NERHZWRxM0p5R1JibVBGVzMyYkU3VDIwKzczQmF0Vi9xUWhoQldmV0JGSGZoWVdYakFMdHMzOEZlbW5vVCs5Ym4xakRCTWNVTW1ZZ1NjMGU3R1FqdjJNVUJ3TFU4aW9uQ3BnVitRcmhnN2lVSWZVWTZKRnhSMFkrWlRDUE0rclZ1cTBHTkx5SlhYNm5yVVR0OEh6RkJSWTFFL0ZJbTJFZVZBOU5jWHJqN1M2WVlJQ2hWUUNXci9tMmZZVWpDNGowWExrelo4R0NTTGZta1czUEIveHErbmxYc0tWQk9qN3ZUdnFLQ09NcTdadHFyM2NRK044Z0JuUGFBcHMrb0d3V09rYnV4blJZai94L1dqaURjbFZyczIyeE1LNHFBckUxWnRrMTQ1NmtpSnJpdzZhYmtOZVJIb2dhUFJCZ2JnRjlaOGkvdGJ6V0VMTjRDdmJxdHJxVjlUdEdTbm1QUzJGOWtxT0lCYWF6SFlhSjliaTNBb0RCdmxaYXNNbHV4dDBCRFhmaHAwMkpuNDExYVZ0NlM0VFVCOFpnRkRrSTZUUDZnd1BZODV3K29VUVNzakllWFZtaW5yd0lkSzJaQWF3YjhTZTZYT0piT2FsaVF4SFNybkFlT05ETHVDbkZlaklicDRZRHRCY1FDd01zWWlSWmZIZWZ1RUpxSmN3S1RUSjhzeDVoakhtSkkxc1BGSE9yNlc5QWhaMk5Bb2QzOG1uTFFrMWdPejJMQ0FvaG9RYmdNYlVLOVJNRUEzTGtpRjdTcjl0TFpwNmxrY2lJR2hFMlY1NDZ3M01hbTUzVnRWa0diQjl3MFlrMlhpUm5DbWJweG1IcjJrNGVTQzBSdU5iak5zVWZESWZjOERadlJ2Z1VEZTFJbEtkWlR6Y1Q0WkdFYjUzZHA4VnRzb1pseVh6TEhPZEFic3AxTFBUVmFIdkxBMEdZREZNYkFXL1dVQmZVQWRId3FMRkFWKzN1SHZZV3JDZmhVT1IyaTg5cXZDQm9PYjQ4dXNBR2RjRjJNNGFLbjc5ay80M1d6QloreFIxTDB1WmZpYTcwWFA5c29RUmVldWhaaVVuWEZERzFUOC9PWE5tc3NUU25ZTysza1ZMQWdlaVk3MTl1RHdMOUZReWNnTFBlc3NOaWhNWmJBS0c3cXdQWnlHMTFHMStaQTNqQVgyeWRkcFlmbWFLQmxtZmNLL1YwbXdJUlVEQzBuSlNPUFVsMktCOGgxM0Y0ZGxWWmlSaGRHWTVmYXJ3TitmOWhFYjFjUmk0MVpjR0RuNlhlOU1NU1RPWTgxVUxKeVhJSFNXRklRSHN0VllMaUpFaVVqa3RsSGlHam50TjUvYnRCOEZ1K3ZwMjh6bDJmWlhOK2RKRHlONkVYaFMrMHl6cXBsL0xTSk5FVVZ4bXU3QnNOZGpBWTBqVnNBaGtOdXVZMEUxRzQ4ZWoyNW1TdCswMHlQYlE0U1JDVmtJd2I2SVN2WXRtSlJQejladDVkazc2YmxmK2xKd0FQSDVLREYrdkhBbUFDTG9DZEcyQWRpaTZkT0huTkpuVG1adG9PR084UTFqeTF2ZU13NmdiTEZUb1FtZkphN25UN0FsODltUmJSa1paUXhKVEtnSzVLYzlJTnptVEpGcDB0cEFQek5teUwvRjA4YlgzbmhDdW1NL2NSLzJSUG45ZW1aM1Zsam9rdHRaRDF6VldYbFVJcUVVN1NMazVJMGxGUlUwQWNFTlhCWWF6TmFWenNWSEEvc0QzbzlobTQyd2JISVJiL0JCUVRLekFpOHMzK2JNdHBPT1pnTGRRekNZUGZYM1VVeEtkMVdZVmtHSDdsaC9SQkJnTVpad1h6VTkrR1l4ZEJxbEdzMExQK0RaNWcyQldOaDZGQWNSOTQ0QitLL0pUV0kzdDlZeVZ5UmhsUDRDQ29Vay9tbUY3K3IycGlsVkJqeFhCSEZhQmZCdHI5aGJWbjJ6RHVJMGtFT0cza0J4OENHZFBPalgxcGgxUE9PWkpVTzFKRUdHMGp6VXkydEs0WDBDZ1ZOWWhta3FxUXlzUk50S3VQZENKcUszV1c1N2thVjE3dlhnaXlQcmw0S0VFV2dpR0YxZXVJNFFrU0ZIRmYwVERyb1FpTE5LSmlMYmRoSDBZQmhyaVJOQ0hQeFNxSm1OTm9rZXRhaW9vaHFNZ2xoNndMdEVHV1NNMUVaYlFnNzJoMFVKQUlQVkZDQUpPVGhwUUdHZEtmRm92Y3dFZWlCdVpITjJPYjR1Vk03K2d3Wkx6MUQ5RTd0YTRSbU1aMjRPQkJBZzdFaDZkTFhHb2ZaNFUyVEZPQ1FNS2p3aFZja2pyeWRSUytZYXFDdzFrWXQ2VWV4dXpiTkVEeVlMVFpuclkxUHpzSFpKVDRVK2F3TzJ4bHFUU1l1Nm4vVTI5TzJ3UFhnR09FS0RNU3ErelRVdHljOCs2aUxwMGl2YXY0Rkt4K3h4Vnk0RnhoSUYvcHVjVkRxcHNWZTJqRk9mZFpoVHpMejJRanR6dnNUQ3ZEUFU3YnpESDJlWFZLVVY5VForcUZ0YVNTeG5ZZ1lkWEt3VnJlSWd2V2hUOWVHREIyT3ZuV3lQTGZJSUlmTm5mSXhVOG5XN01iY0gwNW5obHNZdGFXOUVaUnN4V2NLZEVxSW5xMURpWlBLQ3o3aUdtQVU5L2Njbm5RdWQycE5nSUdGWU9UQVdqaElyZDYzYVBEZ2ZqOC9zZGxENGwrVVRsY3hUSTlqYmFNcXFOMGdReFNIczYwSUFjVzNjSDRwM1YxYVNjaVRLQjI5TDF0ejJlVVFoUmlUZ1R2bXFjK3NHdEJOaDRreTBtUUpHc2R5Y0JSRVArZkFhU3MxRVJFRFZvNWd2Z2k1K2FDTjdORUN3MzBvd2JDYzFtU3BqaWFoeU5Wd0pkMWppR2d6U3dmVHB6ZjJjNVhKdkcvZzFuMGZIODhLSE5uZit1N1ppUk1sWHVlU0lzbG9KQlV0VzllenZzeDlncmZzWC9GTnhuYnhVMUx2ZzBoTHhpeHlwSEtHRkFhUHUweENEOG9EVGVGU3lmUlQ2czgxMDlHTVVaTDhtMnhYcDhYMmRwUENXV2RYODRpZ2E0QnJUbE9mcW94NHNocUVnaC9IdDRxUnN0NTJjQTF4T0lVdU94Z2ZVaXZwNnY1ZjhJVnlhcnlFZHBWazcyRVJBd2RUNGFvWTF1c0JnbVArMG0wNlEyMTZIL251YnROWXhIYU9JWWpjYWNoM0E4RXovemMwS2NTaGhlbDBIQ1lqRnNBMEZqWXF5SjVaVUgxYVp3Myt6V0MwaExwTTZHRGZjQWRuOWZxMm9yUG1aYlc2WFhyZitLcmM5UnR2SUk1amVEM2RGb1QxS3daSnd4ZlVNdmM1S0xmbjhyUk9XMjNKdzg5c0oyYTVkcEIzcVdEVUJXRjJpWDhPQ3VLcHJIb3NKMm1mbEJSK1dxczg2VnZnSS9YTW5zcWI5NytWbEtkUFZ5c2N6UGo4Smh6ZitXQ3ZHQkhpakFxWWxhdmJGNjBzb01XbEhidktUK1NjdmhwcmdlVGxuNTF4WDBzRitFYWRjL2wyczJhNUJna1ZiSFl5ejBFODVwMExzdHFIK2dFR2lSODRuQlJSRkluOGhMU1pyR3dxalozRTI5Y3VHaSs1WjVicDdFTThNV0ZhOXNzUy92eTRWckRmRUNTdjdEU1U4NERhUDBzWEkzQXA0bFd6blE2NW5Rb1RLUldVMzBnZDdObjhab3dVdkdJeDRhcXlYR3dtQS9QQjRxTjhtc0pVT0RlelVIRWwwVlA5dW8rY1o4dlBGb2RTSUI0QzdsUVlqRUZqOHl1NDlDMktJVjNxeE1GWVRldkc4S3FBcjBUUGxrYnpISG5UcERwdnB6emlBaU5GaDh4aVQ3Qy9UaXlIMEVndVV3NHZ4QWdwbkUyN1dJeXBWK3VGTjJ6Vzd4bmlGL243NXRyczlJSjVhbUIxelhYWjFMRmtKNkdiUy9kRm9remw0Y2MybWFtVndoTDRYVTBBdjVnRFdBbCthRVdoQVA3dDJWSXdVK0VwdmZPUERjTEFTWDdIN2xacFhBMlhRZmJTbEQ0cVUxOE5mZk5Qb0FLTU5TY2NCZk85WVZWZ21sVzRSeWRCcWZIQVY3K2hyWjg0V0pHaG82Yk5UMFlNaHh4TGRPeC9kd0dqMG95YWs5YUFrTko4bFJKelV1QThzUitmUHlpeVRnVUhpbzUrUHArWWFLbEhyaFI0MWpZNU5FU1BTM3grelRNZTBTMkhuTE9LQ09RUHBkeEt5dmlCdmRIckNEUnFPK2w5NkhoaE5CTFhXdjR5RU11RVVZbzhrWG5ZSk04b0lnVk00WEoreFhPZXY0WWJXZXFzdmdxMGxtdzQvUGlZcjlzWUx0K1c1RUF1WVNGbkpFYW44Q3dKd2J0QVNCZkxCQnBKWmlSUG9yL2FDSkJac00rTWh2UzdaZXB5SHZVOG01V1NtYVpueHVMdHM4b2psNktrUzhvU0FIa3E1R1dsQ0IvTmdKNVczck8yQ2oxTUs3YWh4c0NyYlRUM2EwVi9RUUgrc0VyeFY0WFVXREh4MGtrRnkyNWJQbUJNQlE2QlUzSG9IaGhZY0pCOUpoUDZOWFVXS3huRTByYVhIQjZVOUtIcFdkUUNRSTcycWV2cDVmTXpjbStBdkM4NXJzeW5WUWhydURBOWZwOUNPZTdONTZjZzFVS0dTYXM4OXZyTitXbEdMWVR3aTVXKzB4WWRLRUd0R0NlTkp3WEtEVTBYcVU1dVFZbldzTXdURU5MR3RiUU12b0dqSUZJRU16Q1JhbDRybkJBZzdEL0NTbjhNc0N2UytGREpKQXpvaWlvSkVoWkpnQXA5bjIrMVl6bnI3SCs2ZVQ0WWtKOU1wajYwSW1jVzRpNGlIRExuOVJ5ZEI4ZHgzUVltM3JzWDZuNFZSclpEc1lLNkRDR3drd2Q1bjMvSU5GRXBrMTZmWXBQNkp0TVFwcUVNemNPZlFHQUhYQlRFR3p1TEowM0dZUUw5Ym1WMi83RXhEbFJmK1V2ZjFzTTJmclJ0Q1dtYWwxMnBNZ3RvbnZTQ3RSNG4xQ0xVWlJkVEhESFAxT3R3cWQrcmNkbGF2bktqVUIvT1lYUUhVSnpwTnlGb0twUUsrMk9nckVLcEd5SWdJQmduMnk5UUhuVEppaFpPcEV2T0tJb0hBTUdBWEhtajIxTHltMzlNYmlvdzRJRis3N3hOdWV3emlOVkJ4cjZLRDVlKzlIelpTQklsVWEvQW1zREZKRlhleXJRYWtSM0Z3b3dUR2NBREpIY0VmaEdrWFlOR1NZbzRkaDRieHdMTSsyOHhqaXFrZG4wLzNSNFVFa3ZjQnJCZm4vU3pCYzFYaEtNMlZQbEpnS1NvcmpEYWM5NlYyVW5RWVhsMS95WlBUNERWZWxnTytzb01qZXhYd1lPNThWTGw1eEluUVVaSThqYzNIMkNQbkNOYjlYMDVuT3hJeTRNbGVjYXNUcUdLNnMyYXo0UmpwRjJjUVAyRzI4Uis3d0RQc1pEWkMva1d0amRvSEM3U3BkUG1xUXJVQWhNd0tWdXhDbVlUaUQ5cS9PN0dIdFp2UFNOMENBVVFOL3J5bVhaTm5pWUxsSkRFNzBic2s2WHhzaDRrRE9keGU3QTJ3bzdQOUY1WXZxcVJESTZicmY3OXlQQ1NwNEkwalZvTzRZbkxZdFg1bnpzcFI1V0I0QUtPWXRSMXVqWGJPUXBQeVlEdmZSRTNGTjV6dzBpN3JlZWhkaTd5VjBZRFJLUmxsR0NHUms1WXorVXYxZllsMlp3cm5Hc3FzamdBVm8weEVVYmE4b2hqYU5NSk53VHdaQS93QkRXRlNDcGcxZVVIOE1ZTDJ6ZGlveFJUcWdHUXJEWnhReU56eUJKUFhaRjArb3hJVEpBYmo3b05DNUp3Z0RNVUphTTVHcWxHQ1djLy9LQ0lySSthY2xFZTRJQTB1enY3Y3VqNkdDZGFKT05waTEzTzU0NHZidElIQkYrQStKZURGVVFOeTYxR2tpM3J0eVE0YVV5d242cnUzMTQvZGtHaVA4SXdqbzBKLzJUeHM0OVprd0VsNG14K2lZVVVPNTVJNnBKelU0UCs3UlJzK0RYWmt5S1VZWnFWV3JQRjRJOTRtNFd4MXRYZUU3NG85R3VYOTc3eXZKL2prZGFrOCtBbW9IVmpJMTVWK1d3QmRBUkZWMklQaXJKZ1ZNZHNnMVBlejJWTkhxYTdFSFdkVGtsM1hUY3lqRzlCaXVlV0Z2UWZYSThhV1NrdXVSbXFpL0hVdXpxeXZMSmZOZnMwdHhNcWxkWVlmbFdCMUJTMzFXa3VQSkdHd1hVQ3BqaVFTa3RrdUJNV3dIalNrUXhlZWhxdzFLZ3owVHJ6bTdRYnRneGlFUERWbVdDTkNBZUNmUk9UcGhkMVpOT2h6THk2WGZKeUc2WGdkNU1DQVp3NHhpZTBTajVBblkxL2FrRGdOUzlZRmwzWTA2dmQ2RkFzZzJnVlFKdHpHN0xWcTFPSDJmcmJYTkhXSC9OWTg5Tk5aNFFVU0pxTDJ5RWNHQURiVDM4WDBiR2R1a3FZbFNvbGlLT2NzU1R1cWhjYWVtVWVZTExvSTgrTVpvcjJSeFhUUlRoRjFMckhmcWYvNUxjTEFqZGw0RUVSZ1V5c1lTMmdlRSt5RmRhc1U5MVVnVURzYzJjU1ExWm9UOSt1TE93ZGdBbWlmd1FxRjAyOElOYzJJUUVEZlRtVXczZVp4dno3VWQxejN4YzFQUWZlQ3ZmS3NCOWpPaFJqN3JGeWI5WGNEV0xjWWowYkJ5b3N5Y2hNZXpNTFZrRmlZY2RCQlF0dkk2SzBLUnVPWlFIMmtCc1lISmFYVGt1cDhGMGVJaE8xL0djSXdXS3ByMm1vdUI3ZzVUVURKTnZPUlhQWGEvbVU4YmgyN1RBWllCZTJzS3g0TlN2NU9qbkhJV0QyUnV5c0N6QmxVZmVOWGhEZDJqeG5Ib1VsaGVKM2pCQXB6VVJ5MGZ3bTJGd3dzU1UwY2FRR2wwS3Y4aG9wUlFFMjExTm52dExSc21DTnJoaHBFRG9OaVpFekQyUWRKV0tiUlJXbmFGZWRYSEFFTFNOMHQwYmZzQ3NNZjBrdGZCb1hCb05BK25aTjkrcFNsbXV6c3BGZXZtc3FxY01sbHp6dmt5WHJ6b0ErUnlvMWVQWHBkR09vSnZoeXJ1K0VCUnNtT3A3TVhaMHZOVU1VcUhMVW9LZ2xnMXA3M3NXZVptUGMrS0F3MHBFMnpJc0ZGRTVINDE5Mkt3RHZEeGR4RVlvREJETlpqYmcyYm1BRFRlVUtLNTdJUEQ0ZlRZRjRjNkVuWHgvdGVZTU9SQkR0SWhQSm5laVpueTdOdi96RytZbWVrSUtDb3hyNmthdUUyYlp0Qkx1ZmV0TkcwQnRCWTdmKy9JbVV5cE1CdmRXdS9RN3ZUTVJ6dzVhUUdaV3VjMVYwSEVzSXRGWU1JQm5vS0daMHhjYXJiYS9UWVpxNTBrQ2FmbEZ5c1lqQTRFREtIcUdkcFlXZEtZbW0rYTdUQURtVzM1eWZuT1lwWllya3BWRXRpcUYwRXVqSTAwYWVwbE5zMmsrcXlGWk5lRTNDRFBMOVA2YjRQUS9rYXRhSGtWcExTRVZHSzdFWDZyQWE3SVZOcnZadEZ2T0E2b2tLdkJnTXRGREFHWk94ODhNZUJjSjhBUjNBZ1VVZUl6bkFONnRqQ1VpcEdEWk9ObTFGaldKcDRBM1FJelNhSU9tWjdEdkYveXNZWWJNL2ZGRE9WMGpudEFqUmRhcHhKeEwwZVRocEVoS09qQ0REcTJrcyszR3J3eHFJRktMZTFXZE96SUk4WElPUEdud3k2TEtYVmZwU0RPVEVmYVJzR3VqaHBTNGhCSXNNT3FIYmwxNlBKeGM0RWthVnU5d3BFWWxGLzg0TlN2NVp1bTRkck1mcDl5WGJ6ekFPSnFxUzRZa0k0Y0JyRnJDN2JNUGlDZmdJM25OWkFxa2szUU9acVIreXlxeCtuRFFLQkJCWjdRS3JmR01DTCtYcHFGYUJKVTB3cGtCZEFoYlI0aEpzbVQ1YXlubHZrb3VveG0vTmpENW9lNkJ6VklPOXVrdE0rLzVkRUM1UDd2WnZhcm11Ty9sS1h6NHNCYWJWUElBVHVLVHJ3YkpQOFhVa2RNNnVFY3RIS1hJQ1VKR2phWklXUmJacDhjenF1UVlmWTZ5bkJVQ2ZJVStnRzZ3cVNJQm1ZSW05cFpwWGRhTDEyMVY3cTBWakRqbVFuWHZNZTd5c29FWm5aTDE1QjBTcHhTMWpqZDgzdU5JT0tad3U1TVB6ZzJOaE94M3hNT1BZd0VuMkNVemJTcndBczVPQXRyejNHQWFVa0pPVTc0WHdqYVlVbUdKZFpCUzFOSlZrR1lyVG9JTkxLRGp4Y3VJbHlmVnNLUVNHL0c0RHlpTzJTbFF2SjBkME90MXVPRzVJRlNBa3ErUFJWTWdWTUR2T0lKTWRxamVDRktVR1JXQlc5d2lnWXZjYlU3Q1FMLzdtZUYyS1pBYVdsKzR5OXVob3dBWDdlbG9nQXZJdEFBeG8yK1NGeEdSc0hHRVc5Qm5obFR1V2lnWXhSY25WVUJSUUhWNDFMVitGcjVDSllWN3NIZmV5d3N3eDRYTXRVeDZFa0JoUitxOEFYWFVBOHVQSjczUGI0OWk5S0c5Zk9sanZYZXlGajlpeGdibzZDY2JBSjdXSFdxS0h5L2grWWpCd3A2VmNON004OUZHelEwNHFiclF0Z3JPRnliZzNnUVJUWUc1eG43M0Fya2ZRV2pDSlJPd3kzSjM4RHgvRDdqT2E2QkJOc2l0RXcxd0dxNzgwRUVpb09lRCtaR3AySjY2QURpVkdNYXlpSFl1Y01rOG5USzJ6elQ5Q25FcmFBazk1a1FqeTRrMEdSRWxMTDVZQUtMUUVySjVycDFlYXk5TzRGYjZ5SkdtOVU0RmFNd1BHeHRLRDZvZElJSEtvV25oS28xVThLSXBGQytNVm41OVpYbWM3WlRCWmZzZzZGUThXMTBZZlRyNHUwbllycEhaYloxalhpTG1vb0YwY09tMCttUG5KQlhRdGVwYzduMEJxT2lwTkNxSTZ5eWxvVGVSU2hOS0gwNEZJbzBnY01rMEgveFRoeU40cFBBV2pERGtFcDNsTk5QUk5WZnBNSTQ0Q1dSbFJnVmlQNjRlSzBKU1JwMFdVdkNXWXVtbFcvYzU4VmN6L3lNd1ZjVzVvWWI5KzI2VEVod3ZieGlOZzQ4aGwxVkkxVVhUVS8vRXRhK0JNS25HVWl2Y3RmTDV3SU5ERDBnaVFMMWlwdDZVN0M5Y2Q0K2xncVkybE1VWjAyVXY2UHJzK1pFWmVyN1pmV0JYVmdobGZPT3JDbHdzb09GS3pXRWZ6NlJadTFlQ3MrSzhmTHZrdHM1K0JYMGd5ckZZdmUwQzNxSHJuNVUvT2g2RC9DaWhtV0lyWTdIVVpSaEpheGRlK3RsZHU2YWRZSitMZVh1cFF3MFhFeEMzNlJFVGRORnhjcTlnbE11NGNOUVNYOWNxUi9HUVlwK0l4VWtJY05HV1ZVN1p0R2E2UDNYQXlvZFJ0MFhlUzNUcDAxQW5DaDBaYlVoNFZyU1plVjlSV2ZTb1d5eG5ZM2h6Y1ozMEcvSW5EcTR3eFJyRWVqcmVCeG5oSVFia3hlbnhrYXhsK2s3ZUxVUWtVUjZ2S0oyaURGTkdYM1dtVkExeWFPSCttdmhCZCtzRTZ2YWNRekZvYndZNUJxRUFGbWVqd1c1bmU3SHRWTm9sT1VnSmM4Q3NVeG1jL0xCaThONW11OVZzSUE1SHlFcm5TNnplQ3o3VkxJOStuL2hiVDZoVG9rTVhUVnlYSlJLU0cyaGQybGFiWFRidG1LNGZOSDNJWkJQcmVTQTRGTWVWb3VWTjN6RzV4OUNpR3BMdy8zcGNlbzRxR3FwK3JWcCt6Kzd5UTk4b0VmK255SDRGMytKOUloZURCYTk0V2k2M3pKYkxCQ0labTdQMGFzSEdwSUp0M1B6RTNtMFM0WUlXeVhCQ1ZYR2lrajhNdWREUEIvNk5tMnY0SXhKNWdVMGlpMGd1eTVTVUhxR1VZelRQMGpJSlU1RTgyUkhVWHRYNGxEZHJpaEJMZFAxWWFHMUFHVUMxMnJRS3VJYUd2Q3BNalpDOWJXU0NZbmpEbHZwV2JrZFhNVE5lQkhMS2l1b296TUdJdmtjem1QMGFSSlNKOFBZbkxDVk5oS0hYQk5ja0g3OWU4WjhLYzJ3VWVqNHNRWm9IOHFEUkdrZzg2bWFXL1pRV0dObkxjWG1xM0ZsWE02c3NSLzNQNkUvYkhNdm02SExydjF5Uml4aXQyNUpzSDMvSU9yMlVWNEJXSmh4WFc1Qko2WGRyMDduOWtGM1pOQWs2L1hwYzVNU0ZtWUoyUjdiZEw4S2s3cTFPVTlFbGcvdEN4SjhnaVQyN3dTVHlTRjBHT3hnNFBiWUpkaS9OeWlhOU5uODlDR0R1bGZKZW1tMWFpRXIvZWxlR1NOKzVNUnJWSjRLNmxneVRUSVczaTljUTBkQWk2Rkh0MFlNYkgzd0RTQXRHTFNBY2Nlenp4SGl0dDFRZGhXMzZDUWdQY0E4dklJQmgzL0pOamYvT2JtYzJ5enBrOGVkU2xTNGxWZHdnVzV2emJZRXlGb0Y0R0NCQmJ5MWtlVk51ZUhBSCtldmkrSDdvT1ZmUzNYdVBRU05UWE9PTkFiekplU2I1c3R3ZFFIbDFaanJHb0U0OUk4K0E5ajN0K2FoaFFqNzRGQ1NXcFpyajd3UlNGSkpubndpMVQ5SEw1cXJDRlcvSlpxNlA2MlhrTVdUYit1NGxHcEtmbW13aUpXeDE3OEdPRzdLYnJaR3F5V3dtdXlLV1BrTnN3a1oxcTh1cHRVbHZpSWkrQVhoMmJPT1RPTHNydE5rZnFiUUplaDI0cmVlYmtJTkxranV0NXI0ZDlHUi9yOENCYTlTVTBVUWhzblpwNWNQK1JxV0NpeFJtN2k0WVJGYnRaNEVBa2h0TmE2akhiNmdQWVF2N01LcWtQTFJtWDNkRnNLOFhzUkxWWjZJRVZyQ2JtTkRjOG81bXFzb2dqQVFmb0M5QmM3UjZnZncwM20rbFFwdjZrVGZoeHNjRElYNnMwdytmQnh0a2hqWEFYcjEwVW91V0N4M0MvcC9GWXdKUlMvQVhSS2tqT2I1Q0xtSzRYUmUwK3hlRER3VmtKUFphdTUyYnpMRURIQ3FWMGY0NHBQZ0tPa1lLZ1RaSjMzZm1rM1R1OFNkeEowMlNITThGZW01U01zV3FSeWkyRjF5bmZSSnN6Y0ZLeWtkV2xOcWdEQS9MOWxLWUJtYzdadS9xOWlpMUZQRjQ3VkprcWhpclVvYjUzem9pSnRWVlJWd01SMzRnVjlpcWNCYUhiUnU5a2t2cWszeU1wZlJGRzQ5cEtLaklpcTdoL1ZwUndQR1RIb1k0Y2cwNVg1MDI4aUhzTHZVVy91eitralB5SUVoaGNLVXdDa0pBd2JSOXBJRUdPbjh6NnN2QU84aTg5c0ozZEw1cURXRlliUytIR1BSTXhZd0pJdEZRTjg2WUVTZUpRaG4ydXJHaUxSZmZRZUxwdERsOGRBZ2IrVHA0N1VRUHhXT3cxN09lQ2hMTjFXbnpsa1BMMVQ1TytPM01lbnBuNEMzSVk1TEVlcEhwblBlWkhidnVXZmVWdFBsa0g0TFpqUGJCcmtKVDNOb1JKekJ0ODZDTzBYcTU5b1ErOGRzbTB5bVJjbVF5bjh3NzFtaG1jdUVJNWJ5dUYrQzg4VlBZbHkyc0V6amx6QVEzdmRuLzErSHpndXc2cUZOTmJxZW5oWkdiZGlHNlJ3WmFURzdqVEEyWDlSZFhqRE45eWoxdVFweU80THg4S1JBY1pjYlpNYWZwNHdQT2Q1TWRYb0ZZNTJWMUE4TTloaTNzc285Myt1cHJFMHFZTk1qa0UyMkN2SzRIdVV4cU43b0l6NXBXdUVUcTFsUUFqcWxTbHFkRDJSbnIvZ2dwL1RWa1FZam45bE1mWWVsazJzSDVIUGRvcFlvN01Id2xWMW9yOUJ4ZitRQ3lMem05MnZ6RzJ3amlJakMvWkhFSnplcm9KbDZiZEZQVHBaaG81TVYyVTg2ZkxRcXhObEdJTXFDR3krOVdZaEo4b2IxcjArV2h4ZGU5TDJQZHlzRVR2OTdPK3hWdytWTk4xVFpTUU41STZsOW01SXA2cExJcUxtNGExQjFmZkg2Z0h5cVQ5cDgyTk9qbnRSV0dJb2ZPM2JKejVHaGt2U1dic1h1ZVRBTWFKRG91OTlrR0xxRGxod0JaTkVRNG1LUHVEdlZ3U0s0V21MbHVIeWhBOTdwWmlWZThnK0p4bW5KRjhJa1YvdENzNEpxL0hnT29BRUdSOXRDRHNEYkRtaTNPdmlVUXBHNUQ4WG1LY1NBVWFGTFJYYjJsbUpUTllkaHRZeWZqQllaUW1ONXFUNUNOdWFEM0JWbmxrQ2s3YnNNVzNBdFhrTk1NVHVXNEhqVUVSU0puVlEwdnNCR2Exd28zUWg3MTE1WEdlVEYzTlR6OHcwNDQwQWdVN2MzYlNYTy9LTUlOYUlXWGQwb0xwb3EvMC9RSnhDUVNKOVhuWXkxVzdUWUxCSnBIc1ZXRDFhaHNBN0ZqTnZSZDZteENpSHNtOGc2WjBwbnpxSXBGMWRIVXRQMklUVTVaMWhaSGJ1K0wzQkVFU3RCYkw5WFl2R2ZFYWt2MWJtZitiT1pHbm9pdUhFZGxCbmFDaHhZS056QjIzYjhzdzhZeVQ3QWp4Zms0OWVKSUF2ZGJWa2RGQ2UySjBnTWVmaFEwYklaeGh4M2Z6TUl5c1FOaU44UGdPVUt4T011cjEwTGR1aWdSRURSTVp5UDRvR1dyUDFHRlk0dDZncm9BU3NaNDIxb3M0OHdBZG5yYm92TmhMdDdTY05VTGt3WjVBSVpKVHJiYUtZVExqQTFvSjNzSXVOL2FZb2NtLzl1b1FIRUlsYWNGMXMvVE0xZkxjUFRMMzhPOWZPc2pNRUl3b1BLZnZ0N29wdUk5RzJIZi9QUjRhQ0xEUTd3Tm1JZEV1WEovUU5MNzJrNXE0TmVqQWxkUGZlM1VWVnF6a3lzOFlaL2pZT0dPcDZjK1l6UkNyQ3VxME0xMXk3VGlONnFrN1lYUk1uL2d1a3hyRWltYk1RanIzandSTTZkS1ZaNFJVZldRcjhub1BYTEpxNnloNVIzRUgxSVZPSEVTc3QvTEl0YkcyRDJ2UnNaUmtBT2J6dlFBQUQzbWIzL0c0TnpvcEkwRkFpSGZicHEwWDcyYWRnNlNSais4T0hNU2h0Rnh4TFpsZi9uTGdSTGJDbHdsNVdtYVlTcyt5RWprcTQ4dFk3WjJiRTBOOTFtSnd0K3VhME5sUkpJRGgwSGlrRjRVdlNWb3JGajJZVnU5WWVTNXRmdmxWalBTb051L1p1NmRFVWZCT1Q1NTVoYWhCZE4zU2E1WHVqMlJ2YXUxbFFOSWFDOTQ0eTBSV2o5VWlORHNrQUsxV29MK0VmWGNDNkliQlhGUnlWZlgvV0tYeFBBd1V5SUFHVzhnZ1owOGhjaWpLVHQxWUtuVU82UVB2Y3JtRFZBYjBGQ0xJWG41aWQ0ZkQvSng0dHcvZ2JYczdXRjliMlJnWHRQaExCRzl2RjVGRWtkSEFLclFIWkFKQy9IV3ZrN252enpEeklYWmxmRlRKb0MzSnBHZ0xQQlk3U1FUakdsVXZHNTc3eU51dFoxaFRmczkvMW5rU1hLOXp6S0xSWjNWT0RlS1VvdkplMFdDcTF6Vk1ZeENKTWVubU56UElVMlM4VEE0RTd3V21iTmt4cTlySTJkZDZ2MFZwY0FQVk14bkRzdldUV0ZheXlxdktaTzdaMDhhNjJpL29IMi9qeGY4cnBtZk82NGluM0ZMaUwxR1g4SUd0VkU5TTIzeUdzSXFKYnhEVHkrTHRhTVdEYVBxa3ltYjVWclFkek92cWxkZVUwU1VpNklpckc4VVozamNwUmJ3SGExQzBEd3c5Ry9TRlgzZ1B2VEpRRStreXorZzFCZU1JTEtLTytvbGNIemN0T1dnenhZSG5PRDdkcENSdHVaRVhBQ2pncWVzWk1hc29QZ251REM0blV2aUFBeERjNXBuZ2pvQUlUSWt2aEt3ZzVkNjA4cGRyWmNBK3FuNVRNVDZVby9RekJhT3hCQ0xUSlgzTWdrODVyTWZzbld4ODZvTHhmN3AyUFg1T05xaWVUYS9xTTN0UHc0Wlh2bEFwODNOU0Q4RjcrWmdjdEsxVHBvWXd0aVUyaDAySENHaW9INXRrVkNxTlZUTUg1cDAwc1J5MkpVMXF5REJQMkNJSS9EZzRXRHNJbCt6Z2VYNzU4OXNyeDZZT1JSUU1CZktib2RiQjc0M1RsNFdMS09FbndXVVZCc205NFNPbENyYWNVNzJNU3lqMDY4d2RwWWp5ejFGd0MyYmpRbnhuQjZNcC9wWit5eVpYdGd1RWFZQitrcWhqUTZVVW13U0Zhek9iK3JoWWpMYW9pTSthTjkvOEtLbjB6YUNURnBOOWVLd1d5Ny91NEVIek80NlRkRlNOak1mbjJpUFNKd0RQQ0ZIYzBJMSt2amRBWnc1WmpxUi91emk5Wm4yMG9BYTVKbkxFay9FQTNWUldFN0ovWHJ1cGZGSlB0Q1V1cUhQcG5sTDdJU0p0UnBTVmNCOHFzWkNtMlFFa1dvUk90Q0tLeFVoM3lFY01iV1lKd2s2RGxFQkcwYlpQNmVnMDZGTDN2NlJQYjdvZEd1d203Rk44Zkc0d29xdEI4ZTdNNWtsUHBvOTdHb09iTnd0K2x1ZFRBbXh5QzVobWNGeCtkSXZFWktJNmlnRktIcUxIMDFpWTFvNzkwM1Z6RzlRR2V0eVZ4NVJObUJZVVUrekl1U3ZhL3lJY0VDVWk0cFJtRTNWa0YyYXZxdWxRRVVZNHlaL3dtTmJvQnpQbUFQZXkzK2RTWXRCWlVqZVdXVDBwUHdDejRWb3p4cDl4ZUNsSVU2MHF2RUZNUUNhUHZQYUE3MFdsT1A5Zi9leTM5bWFjdnBHQ1ZhK3pmYThnTzQ0d2J4cEpVbEM4R04vcFJNVFF0elk4WjgvaGlOclUrWnE2NFpmRkdJa2RqN203YWJjSzFFQnR3czFYNEovaG5xdmFzUHZ2RFNEWVdOK1FjUVZHTXFYYWxrRHRUYWQ1cllZMFRJUjFFcW94M2N6d1BNaktQdkY1c0Z2MTdUaHVqcjFJWjFZdGw0VlgxSjB2alhLbUxZNGxtWGlwUkFybzBxVkdFY1h4RVZNTUVsNTRqUU1kNEo3Umpnb21VMGoxcHRqeXhZK2NMaVN5WFBmaUVjSVMybFdESzNJU0F5NlVaM0hiNXZuUG5jQTk0NDExamN5NzVheTZCNkRTVHpLNlVUQ1pSOXVEQU50UEJydklEZ2pzZmFyTWl3b2F4Mk9sTHhhU29ZbjRpUmdrcEVHcUVrd294NXR5SThhS2tMbGZaMTJsTzExVHhzcVJNWTg5ajVKYU81NVhmUEpQREwxTEdTbkM4OFJlOUFpK051NWJaanR3UnJ2RklUVUZIUFI0Wm14R3NsUU1lY2diWk83bkhrMzJxSHhZa2R2V3B1cDA3b2pjTUNhVnJwRkF5RlpKSmJOdkJwWmZkZjM5SGRvMmtQdFQ3djAvZjhSL0I1Tno0ZjF0OS8zek5NLzduNlNVSGZjV2s1ZGZRRkp2Y0pNZ1BvbEdDcE9GYi9XQzBGR1dVMmFzdVF5VCtybTg4WktaNzhDZWkvQ0FoOTM5Q0gwSllicFpJUHR4YzJ1ZlhxalMzcEhIOWxuV0s0aUo3T2pSL0VFU3BDbzJSM01ZS3lFN3JIZmhUdldobzRjTDFRZE40akZUeVI2c3lNd0ZtMTI0VFZERFJYTU52ZUkxRHAvbnR3ZHo4azhreHc3aUZTeDYrWXg2TysxTHpNVnJOMEJCenppWmk5a25lWlN6Z29sbEJuVndCaDZvU09QSFhyZ2xyT2orUW1SL0FFU3JoRHBLcldUKzgvQWlNRHhTLzV3d1JOdUdRUExsSjlvdm9taEpXbjhzTUxWSXRROE4vN0lYdnREOGtkT29IYXcrdkJTYkZJbVFzdi9PQ0FJdWk5OUUrWVNJT01sTXZCWGtBdCtOQVpLOHdCOUpmOENQdEIrVE9VT1IrejcxZC9BRlhwUEJUNitBNUZManhNakxJRW9KenJRZnF1dnhFSWkrV29VekdSMUl6UUZOdmJZT254YjJQeVEwa0dkeVhLelcyYXhRTDhsTkFYUGs2TkVqcXJSRDFvWnRLTGxGb29mclh3MGRDTldBU0h6eSs3UFN6T1VKM1h0YVBac3hMRGpyK280MWZLdUtXTm1qaVp0ZmtPekl0dmxWMk1ER1NoZUdGMG1hMDRxRTNUVUVmcUpNclhGbTdEcEsrMjdEU3ZDVVZmN3JiTm9salBoaGE1VzdLQnFWcTBTaFVTVGJSbXVxUHRRcmVWV0g0SkVUNXlNaHVxTW9TZDRyL044c0RtZVFpUVF2aTF0Y1p2N01vYzdkVDVYNUF0Q0Q2a05FR1pPelZjTllscFg0QWJUc0xnU1lZbGlpUHlWb25pdVlZeVN4c0J5NWNnYjNwRCtFSzBHcGIwd0pnMDMxZFBnYUw4Slp0NnNJdnpOUEVIZlZQT2pYbWFYajRiZDR2b1h6cFo1R0FwTWhJTGdNYkNFV1oyendnZGVRZ2pOSExiUEl0K0txeFJ3V1BMVE42SHdaME91aWpqNFVGK1NnMEF1OFh1SUtXMFd4bGV4ZHJGckRjWko4U2hhdWF0M1gwWG1IeWdxZ0wxbkF1MmhySkZiNHdaWGtjUytpMzZLTXlVMXlGdll2MjNiUVVKaS8zeVFwcXIvbmFVT29pRVdPeGNreXEvZ3E0M2RGb3UxRFZEYVlNWks5dGhvNytJWFhva0JDczVHUmZPY0JLN2czQStqWFEzOUs0WUE4UEJSVzRtNSt5UjBaQXhXSm5jalJWYklUdklBUEhZUnQxRUozWUxpVWJxSXZvS0h0ekhLdFV5MWRkUlVRMEFVTzQxdm9uWkRVT1crbXJzencrU1cvNlEvSVVnTnBjWEZqa003RjRDU1NRMkV4Wmc4NW90c01zN2txc1FENE94WWVCTkRjU3BpZmpNb0xiN0dFYkdXVHdhc1ZPYm1CL2JmUGNVbHEwd1loWENZRURXUlcwMlRQNWJCcllzS1RHV2puV0RESjFGN3pXYWkwelcvMlhzQ3V2QlFqUEZjVFlhUVgzdFNYUlNtOGhzQW9EZGpBcksvT0ZwNnZjV1lPRTdsaXpQMFljKzhwMTZpNy9OaVhJaWlRVHA3YzdYdXM5MjVWRXRsS0FqVWRGaHlhaUxUN1Z4RGFncHJNRndpeDR3WjA1dTBxajdjRFdGZDBXOU9ZSEl1M0piSktNWFJKMWFZTm92dWdnK1FxUk43Zk5IU2kyNlZTZ0JwbitKZk11UG8zYWVxUFdpay93STVSejNCV2FyUFFYNGk1K2RNMG5wd1ZPc1grS3NPaEM3dkRnK09Kc3o0UTV6bG5JZWZsVVdMNlFZTWJmOVdEZkxtb3NMRjRRZXYzbUppT3VIam9vci9kTWVCcEE5aUtEa01qWUJOYlJvNDE0SEN4anNIckI0RVhOYkh6Tk1ESENMdU5CRzZTZitKNE1aL0VsVnNEU0x4aklpR3NUUGh3OEJQanhiZlF0c2tqK2R5Tk1LT09jVVlJUkJFSXFiYXp6M2xtamxSUWhwbHhxNjczVmtsTU1ZNjU5N3Z1K2Q4OWVjL3pxN01pNGdRdmg4N2VoWWJwT3VaRVhqNWcvUTdTN0JGREFBQjlEekczNVNDODUzeHRXVmNuWlFvSDU0amVPcVlMUjlORHV3eHNWdGhUVjdWOTluL0I3SFNiQXl0YkV5VlR6LzVOaEo4Z0dJakcwRTVqM2dyaVVMVWQ1Umc3dFFSKzkwaEpnTlFLUUgyYnRiU2ZQY2FUT2ZJZXhjMWRiMUJ4VU9oTTF2V0NwTGFZdUtyM0ZkTlR0L1QzUFdDcEVVV0RLRXR6WXJqcHpsTC93cmkzTUlUS3NGdnRGOFFWVi9OaFZvOTdhS0lCZ2RsaU5jMTBkV2RYVkRwVnRzTm4rMlVJb2xyZ3FkV0E0RVk4c28wWXZCNGErYUx6TVhpTUF1T0hRclhZMHRyK0NMMTBKYnZaemdqSkp1QjFjUmtkVDdEVXFUdm5zd1ZVcDVra1VTRlZ0SUlGWUswNSt0UXhUNjk5MkhITldWaFd4VXNEMVBrY2VJcmxYdVVWUm9nd21mZGh5cmY2enphTDgrYzBMN0dYTVpPdGVBaEFWUVZ3ZEpoKzduclg3eDRMYUlJZnoyRjJ2N0RnL3VEZnoyRmErNGdGbTJ6SEFvcjhVcWltSkczVlRKdFpFb0ZYaG5EWVh2eE1KRmM2a3UyYmhiQ3h6aWoyejVVTnVLMGptcDFtbnZrVk5VZlIrU0VtajFMcjk0THltNzVQTzdGczBNSXIzR2RzV1hSWFNmZ0xUVlkwRkxxYmE5N3UxSW44TkFjWTdJQzZUaldMaWd3S0VJbTQzTnhUZGFWVHY5bWNLa3p1ekJrS2Q4eC94dDFwLzlCYlA3V3liNGJwbzFLMWduT3BiTHZLejU4cFdsM0I1NVJKL1o1bVJETFB0TlFnMTRqZE9FczkraC9WNVVWcHdyQUk4a0diWDhLUFZQRElNZklxS0RqSkQ5VXlET1BoalozdkZBeWVjd3lxNGFrVUU5bURPdEpFSzFocER5aTZBZTg3c1dBQ2xYR1Rpd1B3TjdQWFd3anhhUjc5QXJIUklQZVlLVHVuVlcyNHNQci8zSFB6Mkl3SDhvS0g0T2xXRW10NEJMTTZXNWc0a01jWWJMd2oydXNvZEQxMDg4c3RaQTdWT3NVU3BFVmw0dzdOTWIxRVVITVJ4QXhMRjBDSVYrMEwzaVpiK2VrQjF2U0RTRmpBWjNoZkxKZjdnRmFYck9LbittaFIrcld3L2VUWEljQWdsNEh2RnVCZzFMT21PQXdKSDNlb1ZFamp3aGVLQTRpY2JyUUNtdkF0cFEwbVhHMGFnWXA1bWo0UmI2bWRRK1JWNFFCUGJ4TXFoOUM3bzhuUDBXa28yb2NuQ0hlUkdoTjFYVnlUMmI5QUNzTCs2eWxVeSt5QzNRRW5hS1JJSks5MVl0YW9TcmNXWk1Nd3h1TTBFOUo2OForWXlqQTBnOHAxUGZIQUFJUk95NlNhMDRWWE91VDZBMzUxRk9XaEtmVEdzRkozUlRKR1dZUG9MazVGVks0T2FZUjloa0p2ZXp3Rjl2UU4xMTI2cjZpc01HWFdUcUZXKzNITDNJL2p1cmxJZERXSVZ2WVkrczZ5cTdsckZTUEFHUmRuVTdQVndZL1N2V2JaR3BYenkzQlEyTG1BSmxyT05Vc1pzNG9Ha2x5MFYyNjd4YkQ1S01ZOHdvTk5zbVdHMVZWZ0xDcmE4YVFCQmNJNERQMkJsTnd4aGlDdEhsYXo2T1dGb0NXMHZNUjNFcnJHN0p5TWpUU0NudlJjc0VIZ21QbndBNmlOcEoyRHJGYjRnTGxoS0p5WkdhV2tBOTdINkZGZHdFY0xUNkRSUVFMKytmT2tWQzRjWUdXMVRHLzNpSzVkU2hSU3VpQnVsbWlocWdqUjQ1VmkwM28yUmJRYlAzc3h0OTBWeFE2dnpkbEdma1htbUttak9pMDgwSlNIa0xudGp2c0JKbnY3Z0tzY09hVE9rRWFSUXFBbkNBNEhXdEI0WG5NdE9ocFJtSDJGSDh0VFhySWpBR05XRW11ZFFMQ2tjVmxHVFE5NjVLaDBINml4WGJnSW1RUDZiNDJCNDlzTzVDOHBjN2lSbGd5dlNZdmNuSDlGZ1EzYXpMYlFHMmNVVzk2U0RvalRRU3R4a09KeU91REdUSEFubldrejI5YUV3TjlGVDhFSjR5aFhPZytqTFRyQ1BLZUVvSjlhN2xEWE9qRXI4QWdYNEJtbk1RNjY4b1cwellQeVFpVk1QeEtSSHRwZm5FRXlhS2hkek5WVGhseHhEUU5kckhlWmlVRmI2Tm9ZMkt3dlNiN0JuUmNwSnkrL2cvekFZeDNmWVNONVFFYVZEMlkxVnNOV3hCMEJTTzEyTVJzUlk4SkxmQWV6Uk16NWxVUnVMVW5HMVRvS2s2UTMwRnVnaHFXTjZnQk5jRnhQL25ZL2l2K2lhVVFPYSsyTnV5bTQ2d3RJL0R2U2Z6U3AxakVpNFNkWUJFN1loVGlWVjVjWDlnd2JvVkRNVmdacDVZQlFsSE9RdmFETmZjQ29DSnVZaGY1a3o1a3dpSUtQanpncGNSSkhQYk9oSmFqZW9lUkw1M2N1TWFoaFY4WjdJUnI2TTRoVzBKelQ3bXphTVV6UXBtODY2endNN0NzMDdmSllYdVd2akFNa2JlNU82VjRidTcxc09HNkpRNG9MOHpJZVhIaGVGVmF2enhtbEl5QmtnYzlJWmxFRHBsTVByOHhsY3lzczRwVlVkd0sxZTdDSzJrVHNTZHE3ZzVTSFJBbDNwWVVCOUtvNGZzaDRxbGVPeUp2MXozS0ZTVFN2d0VjUk8vRXc4b3pFRFlaU3FwZm9WVzl1aEpmWXJOQVhSMFozVm1lb0FEK3JWV3R3UC8xM3NFLzNJQ1gzSGhERzNDTWM0NzZkRUVDMEszdW1TQUQ0aitaUUxWZEZPc1dMMkMxVEg1KzRLaVNXSCtsTWlibytCNTVoUjNHcTQwRzFuMjVzR2NOMG1FY29VMndOOUZDVnlRTEJoWU91OWFIVkxXakVLeDJKSVVaaTV5U29IVUFJOWI4aEd6YUxNeENaRE1MaHY4TWtjcFRxRXd6OUtGRHBDcHFRaFZtc0dRTjhtMjR3eUI4MkZBS05tamdmS1JzWFJtc1NFU292QXdYakJJb01LU0c1MXA2VW04YjNpN0dJU3M3a2pUcS9QWm9pb0NmSnpmS2RKVE4wUTQ1a1FFUXVoOUg4OE0zeUVzM0RidFJUS0FMcmFNMFlDOGxhaU1pT09lNkFEbVRjQ2lSRWVBV1plbEJhRVhSYVN1ajJseDB4SGFSWXFGNjVPMExvNU9DRlUxOEE4Y01ERTRNTFltOXcyUVNyOU5nUUFJY1J4WnNOcEE3VUpSMGU3MUpMK1ZVK0lTV0ZrNUk5N2xyYTh1R2c3R2xRWWhHZDRHYzZyeHNMRlJpSWVHTzRhYlA0UzRla1ExZmlxREN5ODdHWkhkNTJmbjVhYURHdXZPbUlvZnJ6cFZ3TXZ0YnJlWi84NTVPYVhUUmNOaU5FMHd6R1pTeGJqZzI2djhrbzhMNTM3di9YQ0NXUDJNRmFBckpwdm5rZXAwcEErTzg2TVdqUkFaUFFSZnpuWmlTSWFUcHB5Nm0zcDZIck5Tc1k3ZkR0ejdDbDRWL0RKQWpRRG95aUwydXdmMVVIVmQyQUlyekJVU2xKYVRqNGs2Tkw5N2EvR3FoV0tVOVJVbWpuWUtwbTJyK0pZVWNya0N1Wkt2Y1l2cmc4cERvVUtReXdZOUdEV2cwM0RVRlNpcmxVWEJTNVNXbi9LQW50bmYwSWRIR0wvN213WHFERytMWllqYkVkUW1xVXFxNHk1NFRObVdVUDdJZ2NBdzU4MTZZQnp3aU5JSmlFOU00bFBDemVJL0ZHQmVZeTNwNklBbUg0QWpYWG12UTRJeTBZODJOVG9iY0FnZ1QyQ2RxejZNeDRUZEdvcTlmbjJldHJXS1VORnlhdEFIeWRRVFZVUTJTNU9XVlVsdWdjTnZvVXJsQThjSkp6OU1xT2EvVzNpVm5vNHpESGZFN3pob1k1ZjVsUlRWWkRoclFiUjhMUzRlUkx6OGlQTXlCTDZvNFBpTGxwODlGamRva1FMYVNCbUtIVXdXcDBuYTVmRTN2OXpueTJZY0RYRy9qZkk5c2N0dWxIUmJka0k1YTRHT1BKeDRvQUpRelZaL3lZQWFkbzhLTlpVZEVGczlaUGlCc2F1c290WE1OZWJFZ3IwZHlvcHVxZlNjRkozT0ROUEhnY2xBQ1BkY2N3djBZSkdRZHNOMmxob1Y0SFZHQnhjRVVlVVgvYWxyNG5xcGNjMUNDUjN2UjdnNDB6dGVRZy9KdldtRmxVRTRtQWlUcEhsWUdyQjd3K1UyS2RTd1F6MlFKS0JlLzVlaWl4V2lwbWZQMTVBRldySzhTaDFHQkJZTGd6a2kxd1RNaEdRbWFnWHFKMitGdXFKOGYwWHpYQ1ZKRkhRZE1Bdzh4Y28xMUhoTTM0N2FsckF1K3dtWDNwREZBQk92a0MrV1BYMFVoZzFaNU1WSEtOUk94YVI4NFlWM3MxMlVjTSs3MGNKNDYwU3pFYUtMeWg0NzJ2T01EM1huYUs3enhaY1hsV3FlbkV2Y2ptZ0dOUjJPS2JJMXM4VStpd2lXK0hvdEhhbHAzZTFNR0R5NkJNVkl2YWpuQXprRkhiZVZzZ2ptSlVrclA5T0F3bkVIWVhWQnFZeDNxN0x2WGpvVlIwbVk4aCtaYU9uaDA1M3Bkc0drbWJxaHlyeU4wMWVWSHlTcitDa0RZa1NNZVoxeGpQTlZNK2dWTFRES3UyVkdzTVVKcVdPNFR3UERQMFZPZzIvOElUYkFVYU1HYjRMakw3TCtQaTExbEVWTVhUWUlsQVovUUhtVEVOanl4M2tEa0JkZmN2dlF0NnRLazZqWUZNNEVHNVVYRFRhRjUrMVpqUno2VzdNZEpQQyt3VGtiRFVpbTRwNVFRSDNiOWtHazJCa2lseWV1cjhCYzIwd201dUpTQk85NUdmWURJMUVaaXBvUmFIN3VWdmVuZXF6NDN0bFRaR1JRNGE3Q05tTUhnWHlPUVFPTDZXUWtnTVVUUURUOHZoMjFhU2R6N0VSaVpUMWpLOUYrdjZ3Z0Z2dUVtR25nU3ZJVVIyQ0prYzV0eDFReWdmWm5BcnVPTm9iQjFpZENMQjFGQ2ZPN04xWmRSb2NUOC9XeWUrRW5EaU85cHpxSXBuTERsNGJrYVJLVytla0JWd0huNDZTaHcxWDB0Y2x0LzBST2lqdVVCNGtJSW5yVkpVNGJ1V2Y0WUlUSnRqT0o2aUtkcjF1K2ZsZ1FlRkg3MEd4S2poZGd0L01yd2ZCNEsvc1hjelErOXpZY3JENGRoWTZxWmhaMDEwcnJ4Z2dXQThKYVp5ZzJwWWlqOGllWUVnMWFaSmtaSzlPMVJlN3NCMGlvdWY2MHJLMEdkK0FZbHA3c29xQ0JDREd3ZktlVVFoQ0JuMEUwbzBHUzZQZG1qTGkwVHRDWVplcWF6cXdOK3lOSU5JQThMazNpUERuV1VpSVBMR05jSG1aRHhmZUswaUFkeG0vVDdMbk4rZ2VtUkw2MWhISWMwTkNBWmFpWUpSK09IbkxXU2U4c0xySzkwNUI1ZUVKSE5sV3E0Um1FWElhRlRtbzQ5Zjh3NjErTndmRVV5dUpBd1ZxWkNMRmN5SEJLQWNJVmozc056ZkVPWHpWS0luZHhIdytBUjkzb3doYkN4VVpmNkdzOGN6Ni8xVmRyRkVQcnYzMzArOXM2QnRNVlBKM3psL1VmOXJVaTBaL29wZXhmZEwzeWtGNzZlOTk5R1BmVnY4Zkp2L1kvKy81aEVNb24xdHFORnlWUmV2Vjl5OS91SXZzRzNkYkI4R1JScmdhRVhmaHgrMnhlT0Z0K2NFbjNSWmFuTnhkRWUyK0I2TUhwTmJyUkU1M1BsRGlmUHZGY3A0a083OElMUjBUNHh5Vy9XR1B5QnNxR2RvQTd6SkpDdTFUS2JHZmhucWduUmJ4YkIyQjNVWm9lUTJiejJzVFZuVXdva1RjVFUyMVJ4TjFQWVBTM1NhcjdUMGVSSXN5Q05vd3I5YW13b01VL29kOXMyQVB0aUtOTDZFTk9seUtBRHN0QUVXS0Erc2RLRGhySjZCT2hSSm1aK1FKYkFhWjMvNUZxMC9sdW1DZ0V6R0VidTN5aTBZNEk0RWdWQWpxeGg0SGJ1UW4wR3JSaE9XeUFmc2dsUUpBVkwxeS82eWV6UzJrOFJFMk1zdEpMaDkyTk9CM0dDWWdGWHpuRjRkMjVxaVA0WkN5STRSWUdlc3V0NkZYSzZHd1BwS0s4V0hFa2hZdWkwQXlFbXI1TWwzdUJGdFBGZG5pb0k4UmlDb29hN1oxRzFXdXlJaTNuU05nbHV0Yyt4WThCa2VXM0pKWFBLNmpkMlZJTXBhU3hwVnRGcStSK3lTSzlKNldHNVF2dCtDK1FIMWh5WVVPVks3ODU3bkZteURCWWdaL28rQW5pYnpOVnF5WUNKUXZ5RFhEVEsraVhka0E3MWJZN1RMM2J2dUx4TEJROGtiVHZURVk5YXFrUTMrTWlMV2JFZ2pMek9IK2xYZ2NvMUVSZ3pkODByREN5bWxwYVJRYk9ZbktHL09Eb0ZsNDZselQwY2pNNUZZVnZ2MHFMVWJENWx5SnRNVWFDMXBGbFRrTk9OeDZsbGlhWDlvMGkvMXZ3czViTktuNU91RU5RRUttTGxjUDRvMlptSmpENHp6ZDNGazMydVE0dVJXa1BTVXFiNExCZTNFWEhkT1JOQjJCV3N3czVkYVJuTWZOVlg3aXNQU2IxaE1RZEFKaTEvcW1ETWZSVWxDVTc0cG1uempiWGZMOFBWRzhOc1c2SVFNMk5lMjNpQ1BJcHJ5SmpZYlZubTVoQ3ZLcE1hN0hMVmlOaU5jK3hUZkRJYUttM2pjdFZpRDhBMU05WVBKTmswMDNWVnI0Wm8yTXVHVzh2aWw4U0xhR3BQWHFHN0k0RExkdGw4YTRSYngxTHQ0dzVIdXFhYTFYelpCdGoyMDhFSlZHY21LWUV1YWVOMjd6VDlFRTZhMDlKZXJYZEVicGFOZ05xWUpkaFAxTmRxaVBLc2JEUlVpODZYdnZOQzdyTUU1bXJTUXRyekFaVm5kdFNqQ01xZDhCbWFlR1I0bDRZRlVMR1JCZVhJVjlZNHl4TEZkeW9VTnBpeTJJaGVQU1d6Qm9mWVBQMGVJYTJxNUpQNGo5RzhhdC9BcW9Tc0xBVXVSWHR2Z3NxWC96WXdzRStvZjZvU0RiVU9vNFJNSncrRE9VVEpxK2hucXdLaW05WXkvbmFweVpOVGMyckNxNlY5akh0SmJ4R1BEd2x6V2ovU2szekYvQkhPbFQvZlNqU3E3RnFsUEkxcTZKK3J1OEFrdTAwOFNGSU5YWmZPZm5aTk92R1BNdEVtbjJnTFB0K0g0UUxBKy9TWWU0ajM5OGF1emhLSXAyUG9rM21QQzVxMUlOMUhnUittbkVmYzROZWVIWXdkMi9rcHN6UjNjQm43bmk5TmJJcWh0U1dGVzh4YlVKdVVQVk9lZVh1M2owSUdabUZOaXdhTlo2ckg0L3pRMk9EejZ0RnhSTHNVWVp1MWJmZDF1SXZmUUR0NFlEL2VmS1l2OFZGOGJIR0RnSzIydzJXcXdwaTQzdk5DT1hGSlpDR01xV2lQYkw4bWlsNnRzbU9UWEFXQ3lNQ3c3M2UyckFEWmoySUs2cnFrc00zRVhGMmNiTGI0dmpCMTR3YS95WEs1dndVKzA1TXpFUko1blhzWHNXMjFvN00rZ08wanMyT3lLY2lQNXVGMmlYeWIyRGlwdHdRZUhlcXlna3JOc3FWQ1NsbGR4Qk1wd0hpMXZmYzhSS3BQLzRMM0xtcHE2RFpjdmhERGZ4VENFM3NwbGFjVGNPdFhkSzJnMzAzZElXQlZlMndEL0d2amExY0NsRlE2N2d3MHQxWlV0dHNVZ1ExVmVreThvT3BTNmtzWUVjNGJxc2VDYlp5NzY2U3ZMM0ZvZG1uYWhsV0pSZ1ZDTmpQeGhML2ZrMnd5dmxLaElUSC9WUUNpcE9JMGROY1JhNUIxTTVIbU9CalRMZVpRSnkyMzdlMm1vYndtRHlKTkhlUGhkRG1pa252TEthRGJTaEwrSXMxWFRDSnVMUWQyd21kSkw3K21LdnMyOTR3aFhRRCt2dGQ4OEtLazBEWFA4QjFYdTlKK3hvNjlWT3VGZ2V4Z1RyY3ZJNlN5bHR1TGl4OU9QdUU2L2lSSllvQk1FWHhVNHNoUU1mNEZqcXdmMVB0bkovd1dTWmQyOXJoWmpSbVRHZ2lHVEFVUXFSeituQ2RqZU1mWWhzQkQ1THY2MEtJTFdFdk5FSGZtc0RzMkwwQTI1MjM1MWVVb1l4QXlzVmFDSlZMZEg5UUZXQW1xSkRDT0RVY2RvbzEyK2dkNmJXMmJvWTBwQlZIV0w2TFFESzViWVdoMVY4dkZ2aTBjUnBmd3Y3Y0ppTVgzQVpOSnVUZGRIZWhUSWRVMFlRL3NRMWRMb0YyeFFQY0N1SEtpdUNXT1kzMERIZTFPd2NDbExBaHFBS3lxbG5JYkgvOHU5U2NKcGNTNGtncDZIS0RVZGlPZ1JhUkdTaVVDUkJqekk1Z1Nrc01aS3F5N1NkNTFhZWcwdGdKK3gwVEg5WUgyTWdzYXA5TjdFTlpkRUIwYmV5MkRNVHJCQTFobjU2U0VyTkhmM3RLdHF5TDliNnlYRVA5Ny9yYytqZ0QyTjFMTlVINlJNOUF6UDNrU2lwcjA2UmtLT29sUjdITzc2OGpqV2lIMVg5MmpBN2RrZzdnY05janFzWkNnZnFXdzB0UFhkTGcyMGNGNnZuUXlwZzdnTHRrYXpySEFvZHlZZkVOUFFac2RmbmpNWmlOdTRuSk85N0QxL3NRRSszdk5GenJTRE9LdytrZUxFQ1lmN1JKd1ZIZVAvajc5ODMzb1owZWdvbllCMkZsRkU1cWowMkIvTFZPTUpRbHNCOHVOZzNMZWc0cXRad250c09TTmlkUjBhYmJabUFLNHNDenZ0OFlpdXoyeXJOQ0pvSDVPOFh2WC92TGVSL0JCWVRXajBzT1BZTS9qeXhSZDUrL0p6aUtBQUJhUGN3LzM0VUEzYWovZ0xaeFpnUkNXTjZtNG0zZGVtYW5OZ3N4MFAyMzcvUStFdzVWWW5KUGt5Q1kwY0lWSG9GbjJBeS9lN1U0UDE5QVBiUEZYRUhYOTRONktoRU1QRzdpd0IzK0krTzFqZDVuNlZTZ0hlZ3hnYVNhd082aVFDWUZnRHNQU01zTk9jVWo0cTNzRjZLekdhSC8wdTVQUW9Bai84enE2VWM5TW9OckdxaFllYjJqUW8wV2xHbFhqeHRhblpMUzI0L09JTjVHeC8yZzY4NEJQRFFwd2xxbmtGY3hwbVAvb3NuT1hyRnV1NFBxaWZvdVFIMGVGNXFDa3ZJVFFiSncvWnZ5NW1BSFdDOW9VK2NUaVloSm1TZktzQ3l0MWNHVnhpc0t1K055bUVRSUF5YUNndWQvVjA5cVQzbmsvOXMvU1dzWXRoYTd5TnB6QklNTTQwckNTR2FKOXU2bEVrbDAwdlhCaUV0N3A5UDVJQkNpYXZ5bkVPdjdGZ0xxUGRlcXhSaUN3dUZWTW9sU0lVQmNveWZVQzJlMkZKU0FVZ1lkVkdGZjBiMEtuMkVabEs5N3l5eHJUMk1WZ3Z0UmlrZmRhQVc4UndFRWZOK0I3L2VLOGJCZHA3VVJwYnFuMXhjckM2ZDJVamRzS2J6Q2pCRnFrS2tvWnQ3TXJoZzZZYWdFN3Nwa3FqMGpPcldNK1VHUTBNVWxHMmV2UDF1RTFwMnhTdjRkTUswZG5hNkVOY05VRit4a2FKN0I3NjROZHhMQ3B1dmhibGx0VlJBZjd2SzVxUHR0Si85UllGVVVTR2NMZGlibno2bWY3V2tQTzNNa1VVaFIybUFPdUd2OElXdzVYRzFadm9WTW5qU0FaZTZUN1dZQTk5R0VOeG9Ia01pS3hIbEN1SzVHZDBJTnJJU0ltSFFyUW12NkY0bXFVL1RUUThuSE1EekNSaXZLeVNROGRxa3BRZ25VTW53SWthQXVjNi9GR3ExaHczYjJTYmEzOThCaFV3VVpTQUlPOFhadm51TGRZMm42aE9Yd3MrZ3E5QkhVS2NLRkE2a3o2RkRucHhMUElDYTNxR2huYzk3Ym8xRlQvWEprNDhMcmtISjJDQXRCdjBSdE45N04yMXBsZnBYSHZaOGdNSmI3WmM0Y2ZJNk1iUHdzVzdBaWxDU1hNRklFVUVtaXI4WExFa2xBMHp0WWJHcFRUR3F0dHA1aHBGVFRJcVV5YUFJcXZNVDlBL3grSmk1ZWpBNEJoeGIvY2wxcFVkT0Q2ZXBkM3lpbElkTzZqMjk3eElub2lCUHVFRFcyL1Vmc2xEeWhHa1FzN1d5MjUzYlZubFQrU1dnODl6WUlLLzlLWEZsNWZlK2pvdzJyZDVGWHY4ekRQcm1mTVhpVVB0OVFCTy9pSzRRR2JYNWovN1J4MWMxdnpzWThPTmJQM2xWSWFQcmhMNCsxUXJFQ1ROM255S2F2R0cwZ0JCdEh2VEtoR29CSGdNWEhTdEZvd04rSEtyUHJpWXUrT1owNUZybjhva1FyUGFheG9LUDFVTENTL2NtS0ZOM2djSDdIUWxWanJhQ2VRbXRqZzFwU1F4ZXVxWGlTS2dMcHhjLzFPaVpzVTQrbjRsejRocGFoR3lXQlVSTGk0NjQybjFnbjlxejliSXNhQ2VFUEowdUptZW5NV3AydEptSXdMUTZWU2dEWUVyT2VCQ2ZTajlQNEcvdkk3b0lGK2wvbjVmcDk1NlFneEd2dXI3N3luYXdBdTNHOU1kRmJKYnU0OU5abldubkZjUUhqeFJ1aFVZdmcxVS9lODRONEpUZWNjaURBS2IvS1lJRlh6bG95dUUxZVlYZjU0TW1oalRxN0IveUJUb0R6enB4M3RKQ1RvM0hDbVZQWWZtdEJSZTNtUFlFRS82UmxUSXhiZjRmU09jYUtGR2s0Z2JhVVdlNDRoVms5U1p6aFc4MHlmVzVRV0JIeG10VXp2TWhmVlFsaTRnWlRrdElPWmQ5bWpKNWhzYm16dHRhSFFCMjlBbTNkWmtteDNnL3F2WW9jeWhaMlBYQVdzTlFpSWFmK1E4Vy9NV1BJSzcvVGp2Q3g1cTJYUnA0bFZXeWRNYzJ3SVFraGFkREIweHNudy9rU0V5R2pMS2pJNGNvVkl3dHViVEYzRTdNSjZMUzZVT3NKS2o4MlhWQVZQSkpjZXBmZXdiekU5MWl2WFp2T3ZZZnNtTWV2d3RQcGZNekdtQzdXSmx5VzJqMGpoN0FGMUpMbXdFSlNLWXdJdnU2REhjM1lueUxIOVpkSUJuUStuT1ZEUmlQK1JFcHF2Kyt0eXBZSEl2b0p5SUNHQTQwZDhiUjdIUjJrN2RvNlVRVEhGNG9yaVllSVFieEtlNFRoNisvbDFCalV0UzlocU9SaDNNYmd2WXJTdFhUZlN3YUJPbUFWUVp6cFlOcXNBbVF5alk1Nk1VcXR5M2MveEg2R3VoTnZOYUc5dkdiRzZjUHRCTThVQTNlOHI1MUQwQVI5a296S3VHR1NNZ0x6M25BSHhETm5jN0dUd3BMajcvNkhlV3AxaWtzRGVUandDTHB4ZWp1TXRwTW5HSmdzaWt1MXNPQUN3UTl1a3pFU2lEUk43N1lORVN4UjVMcGhPbGNBU1hBNXVJdHMxTG5CSWNuMUo3QkxXczQ5RE1BTFNudXo5NWdkT3JUWnIwdTFTZVlIaW5uby9wRTU4eFlvWGJWTy9TK0ZFTU1zNXF5V2tNbnA4UTNDbHlUbFpQNTJZOW5xN2I4ZklUUHVWWFVrOW9oRzVFRkh3NGdBRWNqRnhmS2IzeHVBc0VqeDJ6MXd4TmJTWk1jZ1M5R0t5VzNSNkt3Sk9OZ3RBNjRMVHl4V204QnZ1ZHAwTTFGZEpQRUdvcE00RnZnN0cvaHNwdGtoQ2ZIRmVndjRFTnd4UGVYbVloeHdaeTdqcytCZU0yN3Q5T0RCTXluVkNMSjdSV2NCTXRlWkp0dmpPWUhiNWxPbkNMWVdORU1LQzU5QkE3Y292dTFjQU5hMlBYTDA1aUdkdWZPemtnRnFxSEJPcmdRVlVtTEVjK01rejRScThPNldrTnI3YXROa0g0TThkK1NEMXQvdFN6dDNvRnFsK25lVnMrQXdFSTVKYUJKYXhBUnRZMlo0bUtvVXF4ZHM0VXBaMHN2M3pJYk5vbzBKNGZpaGxkUVRYM1hOY3VOY1ptY3JCNUxUV01kemVSdUF0QmszY1pIWVFGNmdUaTNQTnVESjBubVIrNExQTG9IdnhRSXhSZ0o5aU5OWHFmMlNZSmhjdkN0SmlWV284NVRzeUZPdXE3RXlCUEpyQWRoRWdFMGNUcTE2RlFYaFlQSkZxU2ZpVm4wSVFuUE95MExiVTRCZUc5NFFqZFlOQjBDaVEzUWF4UXFEMmViU01pTmphVmF3OFdhTTRaNVduemNWRHNyNGVHd2VTTGEyREUzQldWaWF4aFpGSWNTVGpneE5DQWZlbGcraHpuVk9Zb2U1VnFUWXMxZzdXdGZUbTNlNC9XZHVDNnArcXFBTThINFp5ckpDR3Bld1RoVERQZTZIN0N6WC96UThUbStyNjVIZVpuK01zbXhVY2lFV1BsQVZhSy9WQmFRQldmb0cvYVJML2pTWklRZmVwLzg5R2phc1dtYmFXemVFWjJSMUZPanZ5SlQzN085QjgwNDZTUlNLVkVuWFdsQnFia2I1WENTM3FGZXVFOXhiOStmckVrbnhXQjVoMUQvaHJ1ejJpVkRFQVM3K3FrRXo1T3Q1YWdISmM3V0NkWTk0V3M2MXNVUmNYNW5HOFVFTEdCQUhaM2krM1Z1bEF5VDBuS05OejRLMkxCSEJXSmNUQlgxd3pmKy8vdS9qLzkrLy92ODcrOS9sOUxiaC9ML3V5TllpVHNXVjJMd3NqYUE2TXhUdXpGTXFteFc4SncvK0lwcGRYOHQvQ2xnaTFySTFTTjBVQy9yNnRYLzRsVWMyVlYxT1FSZVNlQ3NqVXBLWmNodzRYVWNqSGZ3NnJ5Q1YzUjhzNlZYbTY3dnA0bitsY1BWOWdKd21iS1FFc21ySmk5YzJ2a3dybThIRmJWWU5UYVJHcThEOTF0OW41K1UrYUQvaE50TjNIakMvbkMvdlVvR0ZTQ2tYUCtObFJjbUxVcUxiaVVCbDRMWWYxVS9DQ3Z3dGQzcnlDSDhnVW1HSVRBeGlIMU81cm5HVHo3eTFMdUZqbW5GR1ExVVd1TTdId2ZYdFdsMmZQRktrbFl3TlVwRjJJTC9UbWFSRVRqUWlNNVNKYWNJKzNHdjVNQlU4bFA1SW82Z1drYXdweXpORVZHcU9keDRZbE8xZEN2amJXRlpXYkNtZWlGS1BTbE1LdEtjTUZMcy9LUXh0Z0FIaTdOWk5DUTMyYkJBVzJtYkhmbFZaOHdYS2kxSktWSGtXMjBibllubDNkS1dKZVdKT2lYM29LUEJENlpiaTBadlNJdVdrdFVIQjhxRFI4RE1NaDFaZmtCTDlGUzl4NXIwaEJHTEo4cFVDSnYzTllIK0FlOHA0MG1aV2Q1bTVmaG9iRmpRZVF2cVRUNFZLV0lZZlJMMHRmYVhLaVZsNzVoSFJldVRKRWNxVmx1ZytlT0lJYzRiZEl5ZHRuMkswaU5aUHNZV1F2UWlvMnFiTzNPcUFsUEhERE9CN0RmakdFZlZGNTFGcXFOYWNkNlFtZ0ZLSnBNZkxwNURIVHY0d1hsT05LVlhGOXpUSnBEVjRtMXNZWnFKUGhvdGNzbGlaTTh5a3NLa0NrenBpWHQrRWNSUXZTUXFtQlM5V2RXa3hNVEpYUFN3OTRqcUkzdmFyQ2pReFRhempsTUg4alRTOGlsYVc4MDE0L3Z3QS9MTmErWWlGb3l5eDNzL0tzd1AzTzhRVzFqdHE0NXlUTS9EWDlhOE00dm9UVmFPMmVidncxRW9vRHcveWc2WTFmYVkrV3dyZFZzNVl0MGhRNUV3UmZZWFNGeHJheTFZdlNNK2tZbWxwTEcyLzltbTFNZm1iS0hYcjQ0SWg4blZLYjFNNTM3WkFOVWtDdGRzUFo4MEpWS1ZLYWJWSENhZGFMWGcrSVY4aTVHU3dwWnRpMGg2ZGlUYUtzOXNkcFVLRXBkN2pEVXBZbUh0aVgzM1NLaU8zdHV5ZGtheEE3cEVjOVhJUUVPZldKbHN6ajVZcEw1YktlUXlUN2FaU0JPYW12U0hsOHhzV3ZnbzI2SVAvYnFrKzBFSlV6K2dra2N2bFVseVBwMmtkS0Z0dDd5NWFDZGtzOVpKSmNGcDVaV2VhV0tndG5YTU4zT1J3R0xCRTBQdGtFSWVrNUZZMmFWc3NVWkh0c1dJdm5sak1WSnR1VklqcFp1cC81VkwxeVBPSFdXSGtPTWM2WXlTV01ja2N6RDVqVWoybWxMVnF1RmFNVThsZUdWYXFlWGlzK2FSUkw4em00V3VCazZjeVdmR014Z3RyOHVzZVFFeDdrL1B2Um9aeWQ5bmRlMUdVQ1Y4NGdNWDhPZ3UvQldlellQU1IyN2xselFuQTk3b28wcFl5eG9iWVVKZnNqK3lzVG05ekorUzRwazBUR285VlRHMEtqcVloVG1BTGZvRFpWS2xhMmI1eWh2MjQxUHhGYUxKczNpMDVLMEFBSWRjR3hDSlptVDNaZFQ3Q2xpUjdxK2t1cjdXZFFqeWdZdE9XUkw5QjhFNHM0TEk4S3BBajdiRTBkZzdETE9hWCtNR2VBaTBoTU1TU1daRXorUnVkWGJaQ3NHWVMwUXFpWGpIOVhRYmQ4c0NCK25JVlRxNy9UL0ZEUyt6V1k5cTdaMmZkcTF0ZExiNnYzaEtLVkRBdzVnamo2bzlyMXdIRlJPZEhjMThNSnA0U0oyVWN2dStpUTlFZ2tla1c4VkNNK3BzTTZ5Ky8yU0J5OHROTjRhM0wxTXpQK09Mc3l2RVNvNWdTN0lRT25JcU1tdmlKQlZjNnpiVkcxbjhlWGlBM2o0NmttdnZ0Smxld3dORHJ4azRTYkpPdFAvVFYvbElWSzl1ZVNoTmJiTUhmd25MVExMaGJadU83OWVjNVh2ZmdSd0xGSyt3MXI1WldXMTVyVkZackUrd0txTlJ2NUtxc0xOZnBHZ25vVVU2WTcxTnhFbU43TXlxd3FBUXFvSVVMT3cvTGJ1VUIyK3VFNzVnSnQra3ExcVk0TG94VitxUi96YWx1cGVhM0Q1K1dNZWFSSW4wc0FJNkREV0RoMTU4ZnFVYjRZaEF4aFJFYlVOMHF5eUpZa0JVNFYyS0FSWERUNjVnVzNnUnNpdjd4U1BZRUtMd3pncmlXY1dnUHIwc2JabnY3bTFYSE5GVzZ4UGRHTlpVZHhGaVVZbG1YTmpEVld1dTdMQ2tYL25Wa3JYYUpoaVlrdEJJU0MyeGdCWFFuTkVQK2NwdFdsMWVHNjJhN0NQWHJucmtUUTVCUUFTYkVxVVpXTURpWlVpc0t5SERlTEZPYUpJTFVvNWY2aUR0NFpPOE1scWFLTHRvMEFtVEhWVmJrR3V5UGExUi95d1pzV1JvUkRvUmROTU1Id1lUc2tsTVZubEFkMlMwMjgyYmdNSThmaUpwRGg2OU9TTDZLM3FibzIwS2ZwTk11cm5ZR1FTci9zdEZxWjdoWXN4S2xMbktBS2hzbUI4QUlwRVE0YmQvTnJUTFRYZWZzRTZDaFJtS1dqWEtWZ3BHb1BzOEdBaWNnS1Z3NEswcWdEZ3kxQTZoRnExV1JhdDNmSEYrRmtVK2I2SDROV3BPVTNLWFR4ckliMnFTSEFiK3FobThoaVNST2kvOW9mYXBqeGh5S3h4bnRQcGdlNktMNVo0K1dCTVlrQWNFNiswSGQzWWgyekJzSzJNVjNpVzBZNmN2T0Nyb1hsUmIyTU1KdGRXeCszZGtGekdoMlBlM0RaOVFwU3FwYVIvckUxSW1PckhxWVl5Y2NwaUxDMjJhbUpJalJXVkFoZXJUZnBRTG1vNi9LMnBuYTg1R3JEdVFQbEgxVHNhcjhpc0FKYlhMYWZTd09vZjRnZzlSa0FHbS9vWXBCUVFpUFVveURrMkJDUTFrK0tJTHE0OEVyRm80V1NSaEhMcS95N21ndzMrTDg1UHBQNnhXcjZjZ3A5c09qWWpLYWdPcnhGMTQ4dWh1YVd0amV0OTUzZmgxSVFpRXpnQytkMklnQkNjVVpxZ1RBSUNtMmJSOG9DakRMQnNtZytUaHloZkQrekJhbHNLQlkxQ2U1NFkvdDljd2ZiTHU5U0Z3RWdwaGZvcE5BM3lOeGd5RGFmVU0zbVlUb3ZaTmdQR2RkNFpGRk9qMXZ0ZkZXM3U3TitpSEVOMUhrZWVzRE1YS1B5b0NEQ0dWTW80R0NDRDZQQmhRM2RSWklIeTBZLzNNYUU1elU5bVRDcnd3blpvanRFK3FOcE1Ta0pTcG1HZTBFekx5RmVsTUpxaGZGUTdhNTB1WHhaOHBDYzJ3eHRBS1dnSG9lYW1SMk83UiticTdJYlBZSXRPMGVzZFJnb1RhWTM4aFpMSjV5MDJvSVZ3b1Bva0dJenhBTUR1YW5RMXZuMldEUTAwUmg2bzVRT2FDUnU5OWZ3RGJRY04wWEF1cWtGcHhUL2NmejNzbEdSVm9rck5VMGlxaU1BSkZFYktTY1pkbVNrVFV6bkMwVStNZndGT0dkTGdzZXdSeVBLd0JaWVNteTZVMzI1aVVoQlFOeGJBQzNGTEtEVjlWU091UXBPT3VrSi9HQW11L3R5RWJYOURnRXA2ZHYxem9VMElxenBHNmdzc1NqSVlSVlBHZ1UxUUFRWVJnSVQ4Z0VWMEVYcjFzcWVoMkk2clhqdG1vQ1l5RURDZS9Qa0ZFaS9RNDhGdVQyOXA1NTdpTitMQ3drNUNLL0NaMldkQWRmUVpoMlo5UUdyelBMU05SajVpZ1VXemw5VmkwckNxSDhHMUtwNFFNTGt1d01DQXlwZHZpRFh5T0lrMEFIVE04SEJZS2gzYjAvRitEeG9OajRaZG9aZkNwUVZkblphcnFvTWFIV25NTE5WY3lldnl0R3NyWFFFb0lidWJxV1lObzdOUkh6ZGMwenZUMjFmV1Zpcmo3ZzM2aXk2cHhvZ2Z2Z0hwMXhIMVR1cmJ6OFF5eUhuWGVCSmljcFlVY3RiekFwd3paMUhUK0ZQRVhNQWdVWmV0Z2VHTXd0NEcrREhpRFQyTHUrUFQyMWZqSkNBZlYxNmEvV3UxUHFPa1VIU1RLWWhXVzZQaGhIVWxOdFd6Rm5BN01iWStyNjR2a3dkcGZOQjJKZldnV1hBdmt6ZDQySzRsTjl4N1dyZzRrSUtnWENiNG1jVzU5NU1DUEovY1RmUEFNUU1GV3ducXdkZTR3OEhaWUpGcFF3Y1NNaGpWejRCOHA2bmNTQ04xWDRrbHhvSUg0Qk4ySjZ0YUJNajZsSGtBT3M4SkpBbVhxNXhzUXRyUElQSUlwL0hHNmkyMXhNR2NGZ3FEWFNSRjB4UWcxNGQydXk2SGdLRTEzTFN2UWU1Mm9TaEY1SngxUjZhdnlMNHRoaFhRWkhmQzk0b1p6dVBVQktGWWYxVnZEYXhJcnRWNmROR1N4N0RPMGkxcDZDekJrdUFtRXF5V2NlUVk3RjkrVTBPYllEem9hMWlLYW8vY09EL3Y2UTlnSHJycjF1Q2VPazhmU1Q5TUcyM1VsMEttTTNyK1duNkhpNldBY0w3Z0VlYXlraWN2Z2p6a2pTd0ZzQVhJUjgxWng0UUo2b29zVnlKa0NjVCs0eEFsZENjaWhxdlRmOTRISFVQWFlwM1JFSWFSNGRocFFGNitGSzFIMGk5aTdQdmg4b3d1M2xPNFBUMWl1cXUrRGtMMkJqOStrZGZHQWcyVFh3MDNpTkh5b2J4b2ZMRTJpYmpzWURQZ2VFUWxSTVI3YWZYYlNHUWNuUGpJMkQrc2R0bXVRNzcxZGJBU1VzRG5kVTd0NThqcnJOR1J6SVN2d2lvQWxIczVGQStjQkU1Q2N6bmtkOE5NVjZCUjZrc25LTFBabk1VYXdSRFUxTVovaWIzeENka1RibEhLdTRibE5peWxINW4yMTN5TTB6dWJFaWUwbzRKaHpjZkF5M0g1cWgybDE3dUxvb0JOTGFPK2d6b25USDJ1RjhQUXU5RXlIK3BqR3NBQ1RNeTRjSHpzUGR5bVVTWFlKT01QM3lUa1hxdk8vbHB2dDBjWDVla0RFdTlQVWZCZVpPRGtGdUFqWENhR2RpNmV3NHF4SjhQbUZmd21QcGtnUWpRbFdxb21GWTZVa2ptY25BdEpHNzVFVlIrTnB6R3BQMUVmNXFVVWJmb3dyQzN6Y1NMWDNCeGdXRWdFeC92OWNQOEg4dTFNdnQ5L3JNRFlmNnNqd1UxeFNPUEJnekZFZUpMTVJWRnRLbzVRSHNVWVQ4WlJMQ2FoMjc1OTlFdXFvQzlQWWpZTzZhb0FNSEI4WDFPSHdFQVlvdUhmSEIzbnliMkIrU25aeE0vdncvYkN0T1JqTE1TeTVhWm9FcHZnZEd2bEpmTlBGVXUvcDdaNFZWSzFoaUkwL1VUdUIzWlBxNG9oRWJtN01udGdjMWV2RXRrbmFvc2daU3duREMyQmRNbWlicGVnNDhYOEl4bCsvOCt4WGRic2hRWFVQUHZ4OGpUM2ZrRUxpdkhTbXFiaGJsZk5GU2hXQXlRbkozV0JVNlNNWVNJcFREbUhqZExWQWRsQURkejlnQ3BsWnc2bVRpSHFEd0lzeGJtOUVyR3VzaVZwZzJ3OFEza2hLVi9SOU9qOFBGZUY0M2htVy9uU2Q5OW5aemh5akNYM1FPWmtrQjZCc0g0SDg2NldHeXY5RTBoVkF6UFlhaDJ0a1JmUVpNbVAycmluZk9lUWFsZ2Uwb3ZoZHVCakpzOWExR0J3UmVlcmNlaWZ5NDljdE9oNS82NUFUWXVNc0FrVmx0bXZUTEJrNG9IcGRsNmkrcDhEb05qNEZiMnZoZEZZZXIySlNFaWxFd1BkNW41ek5vR0JYRWpyZWcvd2gyTkZuTlJhSVVIU09YYTRlSlJ3eWdab1g2dm5XbnFWZENSVDFBUnhlRnJOQkordHNkb29Nd3FuWWhFN3pJeG5EOHBaSCtQME51MXdXeENQVEFEZk5XbXF4NjI2SUJKSnE2TmVhcGNHZU9tYnRYdmwwVGVXRzBZN09HR1Y0K0VIVHROQklUNVdkMEJ1amw3aW5YZ1pnZlhUTTVlZkQzcURUSjU0Tzl2M0Jrdit0ZElSbHExa1hjVkQwQkVNaXJtRnhnbE5QdDVwZWRiMUFueHVDWU1DaFV5a3dzVElXcVQyM1hEcHZUaUtFcnUxY1RjRU1lbmlCK0hRRGVoeFBYTm1rb3RGZHdVUG5pbEIvdTROeDVYYzZsOEo5akgxRWdLWlVVdDh0OGN5b1psZURCRXQ4b2liRG1KUkFvTUtKNU9lOUNTV1M1Wk1FSnZhY3NHVmRYRFdqcC9ZcGU1eDBwOVBYQjJQQXd0MkxSRDNkK2Z0TmdwdXl2eGxQOHBCODRvQjFpNzN2QVZwd3lybVhXNzJoZlc2RHpuOUprajQrKzBWUTRkMEtTeDFBc0RBNE90WFhEbzYzL3crR0QrekM3dzVTSmF4c21ubFlSUTRkZ2RqQTd0VGwyS05MbnBKK212a29EeHR0MWE0b1BhWDNFVnFqOTZvOXNSS0JRcVU3Wk9pdXBlQUl5TE1EK1kzWXdIeDMwWFdIQjVDUWl3N3EzbWoxRURsUDJlQnNaYno3OWF5VU1ieUhRN3M4Z3U0TGdpcDFMaUdKajdOUWo5MDUvK3JnVVlLQUE1cWRybEhLSWtuV21xZnVSK1BCOFJkQmtEZy9OZ25sVDg5RzcyaDJOdnlTbmo3VXlCd0QrbWkvSVdzMXhXYnh1VndVSVZYdW41Y01xQnRGYnJjY0krRElManNWUWc2ZWVxMGl0aVJmZWRuODlDdnlGdHBreGFhdUV2U0FOdVptQjFwOEZHUGJVOTRKOW1lZHdzWjlIa1VZam1JN09INUh1eGVuZExieFRhWXJQdUlmRTJmZlhGS2hvTkJVcDMzSHNGQVhtQ1YvVnhwcTVBWWdGb1JyNUF5OTNaTFJsZ2FJUGpoWmpYWlpDaFQrYUU1aVdBWE1YMG9TRlFFdHdqaXVoUVFJdFRRWDVJWXJLZktCK3F1ZVROcGxSMUhvZmxvNS9JNmFQUG1BQ3dRQ0UyalRPWW81RHoxY3M3U29kMEtURy8za0VER2sza1VhVUNPTjE5eFNKQ2FiM2tOcFdaaFNXa084bCtTcFc3MFduM2cwY2lPSUpPNUpYbWE2ZGJvczZqeWlzdXhYd1VVaGoyKzF1R2hjdnVsaUt0V3dzVVR3NGdpMWMvZGlFRXBaSG9Lb3hUQmVNRG1oUGhLVHg3VFhXUmFrVjhpbUpSMzU1RGNJSGtSOUlSRUh4b2hQNFRieVI1THRGVTI0dW1SUFJtRVlIYnBlMUxnaHl4UHg3WWdVSGpOYmJRRlJRaGg0S2VVMUVhYlh4OEZTM0pBeHAycndSRG9lV2tKZ1dSVVNLdzZnR1A1VTJQdU85VjRadWlLWEdHekZRdVJ1Zit0a1NTc2JCdFJKS2hDaTNFTnVMbFhoUGJqVEtENGRqWFZuZlhGZHM2WmIrMVhpVXJSZnlheUd4SnExK1NZQkVmYktsZ2ppU21rMG9yZ1RxelNTK0RaNXJUcXNKYnR0aU50cCtLTXFHRTJBSEdGdzZqUXFNNXZENnZNcHRtWFY5T0FqcTQ5VWYvTHg5T3BhbStIbjVPOXA4cW9CQkFRaXh6UVo0ZU5Wa085c1B6SkFNeVIxeTQvUkNRUTFzMHBWNUtBVTVzS0x3M3RrY0ZiSS9KcXJqQ3NLNE13K1c4YW9kNGxpb1l1YXdVaUN5VldCRS9xUGFGaTVibmtncGZ1L2FlNDcxNzRySTFmcVFvVGJXMEhyVTZGQWVqcTdCeU0wVjR6a1pUZzAyL1lKSzJON2hVUVJDZVo0QklnU0VxZ0Q4WHNqekc2TElzU2J1SG9JZHovTGhGemJObjFjbGNpMU5IV0owLzYvTzhISk1kSXBFWmJxaTFScnJGZm9vL3JJLzd1Zm0yTVBHNWxVSTBJWUo0TUFpSFJUU09GSjJvVHZlckZIWVhUaGtZRklveUZ4NnJNWUZnYU9LTTR4TldkbE9uSWNLYi9zdXB0cHRnVE9UZFZJZjRZZ2RhQWpKbklBbTRxTk5ITlFxcUF6dmk1M0dreVJDRW9zZVVCckhvaFpzalVia1I4Z2ZLdGMvK09hNzJsd3hKOE1xNkhEZkRBVGJmYkpoemVJdUZRSlNpdzF1WnBySGx6VWY5MFdncUc3NnpPMGVDQjFXZFB2MUlUNnNOeHhoOTFHRUwyWXBnQzk3aWtGSHlvYUg5Mm5kd2R1cVo2SVlqa2cyMERYMzNNV2RvWms3UWtjS1VDZ2lzSVlzbE9hYUx5dklJcVJLV1FqMTZqRTFEbFFXSkphUG9wV1RKalhmaXhFalJKSm84ZzQrK3d1UWpicStXVllqc3FDdU5JUVczWWpueEtlMk01WktFcXErY1g3WlZnbmtic1UzUldJeVhBMXJ4djRrR2Vyc1lKakQvL2F1bGRYR21jRWJjZlRlRjE2WTE3MDhGQjFISWZtV3Y2ZFNGaTZvRDRFK1JJakNzRVora1k3ZEtud1JlSkp3M3hDakt2aTNrR040MnJ2eWhVbEl6MEJwK2ZOU1Y1eHdGaXVCekcyOTZlNXMvb0hvRnRVeVVwbG1QdWxJUGwrZTFDUUlRVnRqbHpMenp6YlYrRC9PVlF0WXpvNWl4dE1pNUJtSHVHNE4vdUtmSms1VUlSRXA3KzEyb1psS3RQQm9tWFN6QVkwS2d0YlB6elpvSFF4dWpuUkVVZ0JVK08vaktLaGd4VmhSUHRicXlIaVVhUndScEh2N3BnUlB5VXJuRTdmWWtWYmxHbWZUWTI4dEZDdmxJTEMwNFR6M2l2a05XVmF6QStPc1lyeHZSTS9oaU5uOEZjNGJRQmVVWkFCR3g1Uy94RmY5TGJibWsyOThYN2lGZzJ5ZWltdnNRcXFKK2hZYnQ2dXErWmY5akMrSmN3aWNjZDYxTktRdEZ2R1dyZ0ppSEI1bHdpNmZSOEt6WVM3RWFFSGYva2E5RUM3SDhEK1dFYTNURUFDSEJrTlNqL2NYeEZlcTRSbGxDK2ZVRm0yeHRzdFlMTDJub3MxRGZ6c0M5dnFERGRSVmNQQTNIbzk1YUVRSHZFeFZUaFhQcXltNjVsbGtLbGZSWGJQVFJpRGVwZHlsSGptVjlZVFdBRWpsRDlEZFFuQ2VtN0FqL21sNThPbjM2NjM5MjIxNEI1enJtUXovOXlTRzJtRnFFd2pxNXNGbDV0WUpQdzVoTno4bHlaUFVUc3I1RTBGMkM5Vk1Qblpja1dQNyttYndwL0JpTjdmNGtmN3Z0R25aRjJKR3ZqSy9zRFgxUnRjRlk1b1BRbkU0bElBWVY0OVUzQzlTUDBMQ1kvOWkvV0lGSzlPUmp6TTlrRy9LR3JBdXdGbWdkRXBkTGFpcVFOcENUR1pWdUFPNjVhZmtZMWgzM2hycXlMalp5OTJKSzMvdHdkajlwYWZGY3dmWE9ObVBRV2xkUGxNZTdqbFAyNEpzMHY5bThiSUo5VGdTMkl1UnZFOVpWUmFDd1NKWU90QWZMNUgvWVM0RmZ6S1dLYmVrK0dGdWxoZXlLdERObEJ0cmRtcitLVStpYkhUZGFsekZVbU1meHczZjM2eCszY1FiSkxJdFNpbFc5Y3V2WkVNakt3OTg3anlrWlJsc0gvVUkrSGxLZm8ydEx3ZW1CRWVCRnRteEYyeG1JdEEvZEFJZlErclhubTg4ZHF2WGErR2FwT1lWdC8yd2FGaW1YRngzVEMyTVVpT2k1L01sKzNyai9ZVTZJaHgyaFhnaURYRnNVZVFrUkFENndGM1NDUGkyZmxrN1h3S0FBNHpib3F5bnVFTEQzMTJFSjg4bG1ERVZPTWExVy9LL2E4dEd5bFpSTXJNb0lMeW9NUXp6YkRKSE5acmhINzdMOXFTQzQySFZtS2laNVMwMDE2VVRwODNnT2hDd3o5WEl0SzlmZ1hmSzNGNWQ3blpDQlVla29MeHJ1dFFhUEhhMTZSanNhMGdUcnp5anFUbm1jSWNyeGc2WDZka0tpdWN1ZGMwREQ1VzRwSlBmMHZ1RFc4cjUvdXcyNFlmTXV4RlJwRDJvdlQybUZYNzl4SDZKZitNVmR2MlRZcVI2Lzk1NVFnVlBlM0pDRC9XakFZY0xBOXRwWGdGaUVqZ2UySjVsamVJL2lVemc5MUtRdUhrSUk0bW1IWnhDM1hRT1JMQUM2Rzd1Rm41TE9tbG5Ya2pGZG9POTc2bW9OVHhFbFM4SGR4V29QQWtqam9jRFIxMzZtMmwrZjV0NnhhYU5nZG9kT3ZUdTByaWV2bmhOQUI3OVdOclZzNkVzUGdrZ2ZhaEY5Z1NGenpBZCtySlNyYXc1TWxsaXQ3dlVQNVl4QTg0M2xVcHU2LzVqQVIwUnZINHJSWGtTZzNuRStPNUdGeWZlK0wwczVyM2swNUZ5Z2hTRm5LbzRUVGdzMDdxajRuVExxT1lqNnFhVzlrbkpURGtGNU9GTVlibUNQKzhIMTZUeTQ4Mk9qdkVSVjZPRnl3MDQzTDl3M2hvSmk0MDhzUitTR28xV3ZpWFV1OGQ3cVMrZWhLanBLd3hlQ3Roc20yTEJGU0ZlZXR4MHg0QWFLUHh0cDNDeGRXcUNzTHJCMXMvajVUQWhjMWpOWnNYV2w2dGpvL1dEb2V3eHpnOFQ4Tm5oWjFuaVV3TC9uaGZ5Z0xhbkNuUndhRkdEeUx3K3NmWmh5WjFVdFlUcDhUWUI2ZEU3UjNWc0tLSDk1Q1V4Sjh1OE4rOXUyLzlIVU5LSFczeDN3NUdRcmZPUGFmazJ3NXFacThNYUhUMGViZVkzd0lzcDNyTjlscnBJc1c5YzF3czNWTlYrSndOejBMbzkrVjd6WnI2R0Q1NldlNmdXVkl2dG1hbTVHUFBrVkFicjc0cjZTd2h1TCtUUlh0Vy8wcGd5WDE2Vk5sNC9FQUQ1MFRuVVB1d3JXNk9jVU8yVmxXWFMwaW5xODcya2s3R1VsVzZvL296RktxK1NpcDZMY1R0U0RmRHJQVGNDSGh4NzVIOEJlUm9uK0tHMndSd3pmRGdXaEFMbWlXT01PNmgzcG0xVUNaRVBFalNjeWs3dGRMeDZXcmRBMk4xUVRQRU52Tm5oQ1FqVzZrbDA1Ny9xdjdJd1JyeUhyWkJDd1ZTYkxMbkZSaUhkVHdrOG1sWWl4RnQxc2xFY1BEN0ZWaHQxM0h5cVZleUQ1NUhPWHJoMkVsQXhKeWluR2VvRnp3S0E5MXpmcmRMdkR4SlNqem1JbWZ2VGlzcmVJMjVFRGNWZkdzbXhMVmJmVThQR2UvN05tV1dLalhjZFRKMTFqQWxWSVkvQnYvbWN4Zy9RMTB2Q0h3S0cxR1cvWGJKcTVueERoeUxxaW9ybjdXZDdWRVZMOFVnVnpwSE1qUStaOERVZ1N1a2lWd1dBS2tlVGxWVmVaN3QxREduQ2dKVklkQlBaQUVLNWY4Q0R5RE5vN3RLNC81REJqZEQ1TVBWODZUYUVoR3NMVkZQUVNJNjhLbEJZeTg0RmlldmRVOWdXaDZYWnJ1Z3Z0Q1ptaTl2ZmQ2ZGI2VjdGbW9FY1JIbkczNlZaSDhONGFaYWxkcTl6WmF3dDF1QkZneFlZeCtHcy9xVzFqd0FOZUZ5K0xDb3lteU02emdHN2o4Ykd6VXlMaHZyYkprVFlBRWRJQ0ViNGtNS3VzS1Q5VjNlSXdNTHNqZFVkZ2lqTWMrN2lLcnIrVHhyVldHMFUrVzk1U0dyeG54R3JFNGVhSkZmZ3ZBalVNNFNBeThVYVJ3RTlqNlpRSDVxWUFXR3RYQnl2RGlMU0RmT0QweUZBM1VDTUtTeVEzMGZ5eTFtSVJnNFpjZ1pITE5IV2wrYzlTZWlqT3ZiT0p4b1F5N2xUTjJyM1k4cDZvdnh2VVk3NGFPWWJ1VmV6cnlxWEE2VStmY3A2d1NWOVg1L09aS1AxOHRCNTZVYTBnTXl4Skk3WHlOVDdJcnFOOEdzQjlyTC9rUDVLTXJqWHhncUtMRGErVjVPQ0g2YTVobU9XZW1NVXNlYTl2UWw5dDVPY2U3NlByVHlUdjUwRXhPcW5nRTNQSFBmU0wvL0FJdFBkQjdrR255VFJoVlVVRk5kSkoyejdSdGt0WndnbVF6aEJHL0c3UXNqWm1KZkNFN2s3NUVtZElLSDd4bG5tRHJOTS9YYlRUNkZ6bGRjSC9yY1JHeGxQcnY0cURTY3FFN0pTbVFBQkpXcVJUL1RVY0pTd29RTSsxanZEaWd2cmpqSDhvZUsyaW4xUysveU8xajh4QXdzL1Q1dTBWbkl2QVBxYUUxYXROdU4wY3VSbGlMY0gyajBuVEw0SnBjUjd3OVF5YTBKb2FIZ3NPaUFMTENDelJrbDFVVUVTeit6ZS9nSVhIR3REd2dZcks2cENGS0oxd2ViU0RvZzR6VGxQa2dYWnF4bFFEaVlNamhEcHdUdEJXMld4dGhXYm92OWR0Mlg5WEZMRm1jRitlRWMxVWFRNzRncVppWnNkajYzcEgxcWN2M1Z5OEpZY2lvZ0lWS3NKOFl5M0o5dy9HaGpXVlNRQW1yUzBCUE9XSytSS1YrMGxXcVhnWU1uSUZ3cGNaVkQ3elBTcDU0N2k5SGxmbEI4Z1ZuU1RHbW1xMUNsTzA4MU9XL1VIMTFwRVFNZmtFZERGempMQzFDZG8vQmRMM3M3Y1hiOEorK0h6ejFyaE9VVlpGSVBlaFJpWjhWWXU2KzdFcjdqNVBTWnU5Zy9HQmRtTnpKbXlDRDl3aXN3ajlCWncrVDNpQnJnODFyZTM2aWhNTGpvVkxvV2MrNjJhMVUvN3FWWDVDcHZUVkY3cm9jU0FLd3Y0Y0JWcVptN2xMRFMvcW9YczRmTXMvVlFpNkJ0VmJOQTN1U3pLcFFmakgxbzN4NExydmtPbjQwemhtNmhqZHVEZ2x6SlV3QTBQT2FiZ2RYSW5kcDlmemhPbzIzUGUrUms5R1NMWDBkNzFQb3FyeThOUURUek5sc2ErSlRORzkrVXJFZituZ3hDakdFc0RDYzBieit1ZFZSeUhRSTFqbUVPM1MrSU9ReWNFcTdYd0I2ejN3Zk1mYTczbThQVlJwK2lPZ3RaZmVTQmwwMXhuMDN2TWFRSmt5ajd2bmhHQ2tsc0NXVlJVbDR5KzVvTlV6UTYzQjJkYmpERjN2aWtkLzNSVU1pZlBZblg1R2xmdWsyRnNWLzdScWpJOXlLVGJFOHdKWSs3NHA3cVhPOCtkSVlnanRMRC9OOFRKdFJoMDROOXRYSkE0SDU5SWtNbUxFbGd2cjBRNU9DZVZmZEF0KzVoa2g0cFFnZlJNSHBMNzRYYXRMUXBQaU95SFJzL09kbUh0QmY4bk9aY3hWS3pkR2NsSU4xNmxFN2tKK3BWTWpzcE9JKzUrVHFMUk82bTBacE5YSm9aUnY5TVBEUmNBZkpVdE5aSHlpZy9zMnd3UmVha0ZnUFBKd0NRbXUxSTMwL3RjQmJqaStOYTUzaTFXMU4rQnFvWTdaeG8rVS9NOVh5SjRPazJTU2tCdG9Pcnd1aEFZM2EwM0V1Nmw4d0ZkSUcxY04rZThob3BUa2lLRjA5M0t1SC9CY0IzOXJNaUdETG42WFZoR0tFYWFUL3ZxYi9sdWZ1QWRwR0V4ZXZGMStKOWl0a0ZoQ2Z5bVdyOXZHYjNCVEs0ajU5OHpSSDcrZStNVTltYXJ1WnFiMHBrR3hSRFJFMUNENFo4TFY0dmhnUGlkazV3MkJxODE2ZzNuSHcxLy9qM0pTdHo3TlI5SElXRUxPOFRNbjNRclAvelpwLy8rRHY5cDQyOS9vZ3YrR0FUUituL1VkRituczl4TmtYWlFKWFk0dDlqTWtKTlVGeWdBdHpuZFh3anNzK3lXSDlIQW5MUVFmaEFza2RaUzJsMDFITFd2N0w3dXM1dVRINDA5cHFpdHZmU09RZy9jK1p0N2s4NzlQM0s5K1dWNjhuNyszY1pmdVJkL2REUFAvMDNybitkKy9uQnZXZmdEbHQ4K0x6anFKL3Z4M0NuTk93aVhoaG83NzhDOTZpRCsxVEJ2UlpZZVArRUg4MUxFMHZWd09Pcm1DTEIzaUt6STF4K3ZKRXNyUEg0dUYwVUI0VEo0WDN1RGZPQ28zUFlwWWUwTUY0Ym91aDBEUS9sNDNmeFVGN1krZHBXdXZUU2ZmQjB5TzJVUVVFVEkvTHdDWkUzQnZuZXZKN2M5elVsWTNINTh4emtlNkRORkRRRzhuMFd0RE40TEFZTjRub2dLYXYxZXpPZksveit0NnRzQ1RwK2RoeDR5bWpXdUNKazFkRVVpZkRQK0h5UzRpUC9WZzlCMmpUbzlMNE5iaUJ1RFM0bnV1SFc2SCtKRFFuMkp0cVJLR2tFUVBFWUU3dXphelhJa2N4SUFxVXExZXNhc1pCRVRsRVpZN3k3Sm8rUm9WL0lzalk5ZUlNa1V2cjQySGMweHF0c2F2WnZoejFPTHdTeE1PVHVxemxoYjBXYmRPd0JIOUVZaXlCamF0ejQwYlV4VEhiaVd4cUowdW1hMTlxaFBydXZjV0psYmlTU0g0OE9MRERwYUhQc3p2eWN0NDFaZlR1MTArdmpveDZrT3FLNnYwSy9nRVBwaEV2TWwvdndTditBNEhobTM2SlNQOUlYVHlDWkRtNGtLc3FENWF5OGIxU2FkL3ZhaXlPNU4vc0RmRVY2WjRxOTVFK3lmanhwcUJvQkVUVzJDN3hsNHBJTzJiRE9EREZ1clVQd0U3RVdDMlVwbHErQUhtQkh2aXIyUFNna1IxMi9SeTY1TzBhWnRRUGVYaTltVGxGL1dqNUdRK3ZGa1l5aFhzTFRqckJTUDlod2s0R1BxRFA1ckJuNS9sOGIwbUxSQXZSU3pYSGMyOTNiczNzOEVzZEUzbTJleHhpZFdWQjRqb0hSK1MrZHo1L1crdjAwSzNUcU4xNENEQnRoOGVXY3NUYml3WFBzeWdIZEdpZDBQRWR5NkhIbTJ2L0lVdVY1UlZhcFltekdzWDkwbXBuSWROR2NPT3E2NERiYzVHVWJZcEQ5TTdTKzZjTFkvL1FtanhGTFA1Y3VURlJtM3ZBNXJrRlpyb0ZuTzNiakhGMzV1VTNzOG12TDdUcDlueVRjNG15bVRKNXNMSXA3dW1TbkdrTzIzZmFlaHR6M21tVFM3ZmJWeDVyUDd4M0hYSWpSTmVxL0EzeENzOUpOQjA4YzlTOUJGMk8zYk91cjBJdHNsRnhYZ1JQZGFhcEJJaTRkUnBLR3hWejdpcjY5dC9iYzlxVHhqdnRPeUdPZmlMR0RoUjRmWXl3SHYxV2RPcGx4SVY4N1RwTEJ5M1djMFFQMFA5czRHN0ZCTk9kSVRTL3RlcDNvM2gxVEVhNVhERGlpN2ZXdHFSelVFUmVQMmZieHo3YkhXV0pkYklPeE9VSlp0SXROWnBURlJmajZ2bTlzWWpSeFFWTytXVGRpT2hkUGVUSis4WWlyUHZvZUw4OGw1aUxZT0hkM2IvSW1rcSsxWk4xRWwzVWlraGZ0dXRlRVl4ZjFXdWpvZjhQcjRJQ1R1NWV6WnlaNHRIUU14bHpVSExZTzJWTU9vTk1HTC8yMFM1aTJvMm9iZmsrOHFxZFI3eHpiUkRiZ1UwbG51SWd6NExlbFE1WFM3eGJMdVNRdE5TOTV2M1pVT2RhVXgvUWQ4cXhDdDZ4ZjJFNjJ5Yi9IdWtMTzZSeW9yVjhLZ1lsNVlOYzc1eStLdmVmcnhZK2xjLzY0eTlrdldQMGEwYkR6L3JvanErUldqTzA2V2VydVdxTkZVN3IzSFBJY0xXUnFsOElDWnN6MkxzL3FPbS9DTG42KytYK1FmN21Hc3BZQ3Jab2QvbHBsNlJ3NHhOL3l1cThncVY0QjZhSGsxaFZFMVNmSUx4V3U1Z3ZYcWJmQVJZUXBzcGN4S3AxRi9jOFhPUHprWnZtb1N3K3ZFcUJMZHJxMWZyM3dBUHY1Tm5NOWk4RitqZEF1eGtQNVo3MWM2dWhLM2VubG5HeW1yN1VzV1pLQzEycWdVaUc4WFhHUTlteG5xejRHU0lseWJGOWVYbWJxajJzSFgrYTFqZjBnUm9PTkhSZFJTcklxMDNUeTg5ZVExR2JWL0JrK2R1NCtWMTV6bHMrdnZFUnZaNEU3WmJueFdUVmpEamI0by9rOGpsdzQ0cFRJclVHeHh1SnZCZU8raGV1aE9qcEZzTzZsVkovYVhuSkRhL2JNMFFsMWNMYlhFL1BidjNFWjN2ajNpVnJCNWlyanVwWlR6bG52Njc3TnJJOVVOWU5xYlBncC9IWlhTK2xKbWs4N3dlYys3WU94VERvMmF3MmwzTmZEcjM0Vk5sdnFXSkJrbnVLN29TbFo2L1QxMHp1T29QWk9lb0lrODFOK3NMODQzV0oyUTRaMGZaM3Njc3FDL0pWMmZ1aFdpMWpHVVJTS1pWNjM3bGY1M1hubngxNi92S0VYWTg5YVZKMGZ2OTFqR2RmRytHNCtzbml3SGVzNGhTK3VkT3I0UmZoRmhHL0Y1Z1VHMzVRYVUrTWN1TG1jbGI1WldtUitzRzVWNm5mK1B4WXpscm5GR3hwWmFLOGVxcVZvME5mbUFXb0dmWERpVC9GblViV3Z6R0RPVHI4YWt0T1pXZzRCWXZ6NVlIMTJaYmZDY0d0TmsrZERBWk5HV3ZIb3YrUElPblk5UHJqZzhoL3dMUnJUNjlzdWFNVlo1Yk51SzAwbFNWcG5xU1gxTk9OLzgxRm9QOTJyWW5kaW9ud2dPaUE4V01mNHZjOGwxNUtxRUVHNHlBbTIrV0FONUJyZnUxc3E5c3VXWXFnb2FqZ09ZdC9KQ2sxZ0M4d1BrSytYS0N0Ulg2VEF0Z3ZybnVCZ05SbW42SThsVkRpcE9WQjlrWDZPeGtwNFpLeWQxTTZHajgvdjJVN2srWVFCTDk1S2I5UFFFTnVjSmIwSmxXM2I1dE9iTjdtL1oxajFldjM4OGQ3bzE1emdYc0k5Q2lrQUdBVmlSNmxrSnY3bmI0QWs0ME0yRzhUSjQ0N2tOK3B2ZkhpT0ZqU1VTUDZQTStRZmJBeXdLSkNCYXhTVnhwaXpIc2VaVXlVQmhxNTl2Rndya3lHb1JpSGJvMGFwd2VFWmVTTHVOaVErSEFla09uYXJGZzAwZFpOWGFQZW9IUFRSUjBGbUV5cVlFeE9WYWFhTzhjMHVGVWg3VTRlL1V4ZEJtdGhsQkRnZzI1N1EzM2oxaEE3SFR4U2VUVFN1Vm5QWmJnVzFub2R3bUcxNmFLQkRLeEVldHY3RDlPak8wSmhyYkpUbm9lK2tjR29ESmF6RlNPOC9mVU45SnkvZzRYSzVQVWt3MmRnUERHcEpxQmZoZTdHQStjanpmRS9FR3NNTStGVjluajlJQWhyU2ZUL0ozUUU1VEVJWXlrNVVqc0k2WlpjQ1ByNkE4RlpVRjRnOW5ucFZtalg5ME1MU1F5c0lQRDBuRnpxd0NjU0ptSWI1bVl2MkNtaytDMU1ERmtaUXlDQnE0Yy9ZYWk5TEo2eFlrR1MveDJzNS9mcklXMnZtRzJXcnYwQVBwQ2RnQ0E5c25GdmZwZTh1YzBPd2RSczRHOTk3M1BHRUJuUUI1cUtyQ1E2bTZYL0g3TkluWjd5LzE2NzQvWlhPVnA3T2V1Q1JrOEpGUzUxNlZIcm5IMUhrSVVJbFRJbGpqSGFRdEV0a0p0b3NZdWw3N2NWd2prM2dXMUFqYWE2eldleUhHTGxwazNWSEUyVkZ6VDJ5SS9FdmxHVVN6Mkg5ellFMXM0bnNLTXRNcU55S050TC81OUNwRkpraTVGb3U2VlhHbTh2V0FURVB3clVWT0x2b0E4akx1d096VkJDZ0hCMkNyNVY2T3dFV3RKRUtva0prZmM4N2grc05IVHZNYjBLVlRwNTI4NFFUUHVwb1d2UVZVd1Vlb2daUjNrQk1FU1lvMG1mdWtld1JWUEtoNStyekxRYjdIS2pGRklnV2hqMXczeU4vcUNOb1BJOFhGaVVnQk5UMWhDSEJzQXo4TDdPeXQ4d1FXVUZqOTJPTm4vQVB5SkZnOGh6dWVxb0pkTmo1N1JPckZiZmZ1Uy9YeHJTWExUUmdqNXV4WmpwZ1FZY2VlTWMyd0pyYWhSZVNLcG0zUWpIZnFFeFRMQUIyaXBWdW1FOHBxY1p2OExZWFFpUEhIc2diNUJNVzh6TTVwdlFpdCttUXg4WEdhVkRjZlZiTHlNVGxZOHhjZm1tL1JTQVQvSDA5VVFvbDVnSXo3ckVTRG1uclE0YlVSSUI0aVJYTURRd3hnZXgxR2d0RHhLcDJIYXlJa1IrRS9hRG1DdHRObTJDNmx5dFdkZk9WekQ2WDJTcERXalFEbE1SdkFwMXN5bVd2NG15MWJQQ0QrRTFFbUduTUdXaE53bXljSm5EVjJXclFOeE80NXVrRWIwOEFBZmZpellLVlVMcDE1STR2Yk5LNUR6V3dDU1VBRGZtS2hmR1NVcWlpMUwyVXNFOHJCN21MdUh1VUpaT3g0K1dpaXpIQkovaHdib2FCemhwTk9WdmdGVGY1Y0pzSGVmN0wxSENJOWRPVVViYitZeFVKV242ZFlPTHorVEhpOTFrelk1ZHRPNWMrZ3JYN3YwakVic3VvT0dub0lyZURJZy9zRk15RytUeUNMSWNBV2QxSVoxVU5GeEU4VWllMTN1Y200MFUyZmN4QzB1M1dMdkxPeHd1K0Y3TVdVc0hzZHRGUVo3VytubGZDQVNpQUt5aDhyblAzRXlEQnl2dEpiNktheDYvSGtMelQ5U3lFeVRNVk0xelB0TTBNSlkxNERtc1doNE1nRDE1RWE5SGQwMEFka1RaMEVpRzVOQUd1SUJ6UUpKMEpSMG5hK09CN2xRQTZVS3hNZmloSVE3R0NDblZ6Njk0UXZ5a1dYVHhwUzJzb0R1K3NtcnUxVWRJeFN2QXN6QkZEMWM4YzZaT29iQThiSmlKSXZ1eWNnSVhCUUlYV3doeVRnWkRReEpUUlhnRXdSTkFhd0dTWE8wYTFES2pkaWhMVk5wL3RhRS94WWhzZ3dlK1ZwS0VFQjRMbHJhUXlFODRnRWloeENuYmZveU91SklFWHkyRklZdytKalJ1c3liS2xVMmcvdmhUU0dUeWR2Q3ZYaFlCZHRBWHRTMnY3TGtIdG1YaC84Zmx5MWRvOEZJL0QwZjhVYnpWYjVoK0tSaE1HU0FtUjJtaGkwWUcvdWo3d2d4Y2Z6Q3JNdmRqaXRVSXBYRFg4YWUySmNGLzM2cVVXSU13TjZKc2phUkdOaitqRXRlR0RjRnlUVWI4WC9OSFN1Y0tNSnA3cGR1eHRENkt1eFZseXh4d2FlaUMxRmJHQkVTTzg0bGJ5ckF1Z1l4ZGwrMk44LzZBZ1dwby9JZW9BT2NzRzM1SUEvYjNBdVN5b2E1NUw3bGxCTGxhV2xFV3Z1Q0ZkOGY4TmZjVFVnekp2NkNiQis2b2hXd29kbGs5bkdXRnBCQU9hejV1RVc1eEJ2bWpuSEZlRHNiMG1Yd2F5ajNtZFlxNWd4eE5mM0gzL3RuQ2dId2pTcnBTZ1Z4TG1pVHR1c3pkUlVGSXNuNkxpTVBqTDgwOHZMMXVRaERiTTdhQTQzbUlTWFJlcWpTc2t5bklSY0hDSjlxZUZvcEpmeDl0cXlVb0diU3dKZXgvMGFERTNwbEJQR3ROQllnV2JkTG9tMytRL2JqZGl6UjIvQVMvYy9kSC9kM0c3cHlsMXFEWGd0T0Z0RXFpZHdMcXhQWXRyTkV2ZWFzV3EzdlBVVXRxVGV1OGdwb3Y0YmRPUVJJMmtuZUZ2Uk5NclNoeVZlRXVwSzFQb0xEUE1TZldNSUpjczI2N21HQjhYOUNlaFFDRjBnSXlocFAxMG1ieU03bHdXMWU2VEd2SEJWMXNnL1V5VGdoSFBHUnFNeWFlYkM2cGJCMVdLTkNRdGxhaTFHR3ZtcTl6VUthVXpMYVhzWEVCWXRIeG1GYkVaMmtKaFIxNjRMaFdXMlRscDFkaHNHRTdaZ0lXUkJPeDNaY3UyRHhnSCtHODNXVFBjZUtHMFRnUUtLaWlOTk9sV2d2cU5FYm5yazZmVkQrQXFSYW0yT2d1WmIwWVdTVFg4OE4raS9FTFN4YmFVVXBQeDR2SlV6WWcvV29uU2VBOHhVSzZ1N0RQSGdwcVdwRWU2RDRjWGc1dUs5RklZVmJhNDdWL25iK3d5T3RrK3pHOFJyUzRFQTBvdXdhMDRpQnlSTFN2b0pBMkZ6YW9iYlp0WG5xOEdkYmZxRXA1STJkcGZwajU5VENWaWY2K0U3NXA2NjVmYWlYOGdTMjEzUnFCeFRacWZIUDQ2bkY2TlNlbk9uZXVUK3ZnYkxVYmRUSDIvdDBSRUZYWkpPRUI2REh2eDZONmc5OTU2Q1lyWS9BWWNtOWdFTEpYWWtyU2krMEYwZ2VLRFpnT0NJWWtMVS8rR09XNWFHajhtdkxGZ3RGSDUrWEM4aHZBRTNDdkhSZmw0b2ZNL1F3azR4MkErUitueWM5Z051LzlUZW03WFc0WFJueVJ5bWY1MnowOWNUT2RyK1BHNitQL1ZiNFFpWGx3YXVjNVdCMXozbytJSmpsYnhJOE15V3RTelQrazRzS1ZiaEYzeGErdkR0czNOeFhhODdpaXUreFJIOWNBcHJuT0wyaDZ2VjU0aVFSWHVPQWoxczhuTEZLOGdaNzBUaElRY1dkRjE5LzJ4YUptVDBlZnJrTkRrV2JwQVFQZG85Mlo4K0huL2FMamJPekI5QUkvazEyZlBzOUhoVU5ESjF1NmF4MlZ4RDNSNlB5d043QnJMSjI2ejZzM1FvTXA3NnF6endldHJEQUJLU0drZlc1UHdTMUd2WU5VYks2dVJxeGZ5VkdOeUZCMEUrT3VnTU04a0t3bUptdXB1UldPOFhrWFhYUUVDeVJWdzlVeUlydEN0Y2M0b05xWHFyN0FVUkJtS242S2h6M2VCTjk2THdJSnJBR1A5bXIvNTl1VE9TeDYzMXN1eVQrUXVqRGQ0YmVVRnBaMGtKRUVuamxQK1gvS3Iya0NLaG5FTlRnNEJzTVRPbU1xbGoyV01GTFJVbFZHMGZ6ZENCZ1V0YTlvZHJKZnBWZEZvbVRpNmFrMHRGalhUY2RxcXZXQkF6alk2aFZySDlzYnQzWjlnbitBVkRwVGNRSW1lZmJCNGVkaXJqenJzTmlldnZlNFpUNEVVWldWM1R4RXNJVys5TVQvUkpvS2ZaWllTUkdmQzFDd1BHLzlyZE1PTThxUi9MVVl2dzVmL2VtVVNvRDdZU0Z1T29xY2hkVWcyVWVQZDFlQ3RGU0tneExTWjc2NG95NGx2UkNJSDZib3dQeFpXd3hORmN0a3NMZWlsNDdwZmV2Y0JpcGtrQkljNG5nWkcra3hHWjcxYTcyS1E3VmFaNk1aT1prUUpaWE02a2IvQWMwL1hrSng4ZHZ5ZkpjV2JJM3pPTkVhRVBJVzhHYmtZanNaY3d5K2VNb0tyWWpEbXZFRWl4SHprQ1NDUlBSemhPZkpadUxkY2J4MTlFTDIzTUE4cm5qVFpaNzg3RkdNbmtxbnB1ekI1LzkwdzFndFVTUmFXY2IwZXRhODE5OFZFZVpNVVNmSWh5dWM0L255d0ZROXVxbjdqZHFYaCs1d3d2K1JLOVhvdU5QYllkb0VlbE5HbzM0S3l5U3dpZ3NyZkNlMHYvUGxXUHZRdlFnOFIwS2dITzE4bVRWVGhoUXJsYkVRMEtwL0p4UGRqSHlSN0UxUVB3L3V0MHIrSERERzdCd1pGbTlJcUVVWlJwdjJXcHpsTWtPZW1lTGNBdDVDc3J6c2tMR2FWT0F4eXlTelpWL0QyRVk3eWROWk1mOGU4VmhIY0tHSEFXTnN6ZjFFT3E4Zk5zdGlqTVk0Slh5QVR3VGRuY0ZGcWNORGZEbyttV0Z2eEpKcGM0c0VadGpYeUJkb0ZjeGJVbW5pQ29LcTVqeWRVSE5qWUp4TXFOMUt6WVY2Mk11Z2NFTFZoUzNCbmQrVExMT2g3ZHdzL3pTWFd6eEViNE5qNGFGdW41eDRrRFdMSzVUVUYveUNYQi9jWll2STlrUGdWc0cyalNodFhreGZnVCt4empKb2ZYcVBFbklYSVExbG5JZG1WekJPTTkwRVh2SlVXNmEwblovN1hqSkdsOFRvTzNIL2ZkeG54bVROS0JaeG5rcFhMVmdMWENaeXdHVDNZeVM3NXcvUEFINUkvak11UnNwZWo4eFpPYlU5a1JFYlJBK2txam1LUkZhS0dXQW1GUXNwQytRTGJLUGYwUmFLM09YdkJTV3FvNDZwNzB3cy9lWnB1NmpDdFpVZ1F5NnI0dEhNUFVkQWdXR0dVWU5idXYvMWE2SytNVkZzZDNUMTgzK1Q4Y2FwU282bTArU2g1N2ZFZUcvOTVkeWtHSkJRTWowOURTVzJiWTBtVW9uRHk5YTh0ckxubkw1QjVMVzNObDhySlpOeXNPOFpiKzgwelh4cVVHRnB1ZDNRendiN2JmKzhtcTZ4MFRBbkpVOXBEUVI5WVFtWmhsbmEyeHV4SnQwYUNPL2YxU1U4Z2JsT3JiSXlNc3hUbFZVVzY5VkpQellVMkhsUlhjcUUybExMeG5PYlp1ejJ0VDlDaXZmVEFVWWZtekpsdC9sT1Bnc1I2Vk42NC94UWQ0SmxrL1JWN1VLVnYyR3gvQVdzbVRBdUNXS2hkd0MrNEhtS0VLWVpoMlhpczRLc1VSMUJlT2JzMWMxM3dxRlJub2NkbXVoZWFUVjMwZ3ZWWFpjb3V6SEtLNXp3ck41MmpYSkV1WDZkR3gzQkNwVi8rKzRmM2h5YVcvY1FKTEZLcWFzanNNdU8zQjNXbE1xMmd5WWZkSzFlN0wycE8vdFJ5ZTJtd3p3WlBmZFVNcmw1d2RMcWRkMkt2L3dWdG5weVdZaGQ0OUw2cnNPVis4SFhQcldIMkt1cDg5bDJ0ejZiZjgwaVlTZCtWNExST1NPSGVhbXZleFI1MjRxNHI0M3JUbXRGelF2QXJwdldmTFlGWnJiRnNwQnNYTlVxcWVuanhOTnNGWGF0WnZsSWhrN3RlVVBmSytZTDMyRjhNY1RuanYwQlpOcHBiK3ZzaG9DcnRMWGpJV3EzRUpYcFZYSWxHNlpOTDBkaDZxRW0yV013RGpEM0xmT2ZrR2gxL2N6WWMvMHFoaUQyb3pObkg0ODgyTVZWdDNKYlZGa2J3b3dOQ08zS0w1SW9ZVzV3bFZlR0NWaU91djFzdlp4N0ZienhLekE0ekdxQmxSUmFSV0NvYlhhVnE0eVlDV2JaZjhlaUp3dDNPWStNRmlTSmVuZ2NGUDJ0MEpNZnpPaUo3Y0VDdnB4N25lZzFSYzV4KzdteVBKT1h0MkZvaFZSeVh0RCsvckRvVE95R1lJbkplbFpNam9sZWNWSFVoVU5xdmRaV2cySjJ0MGpQbWlMRmVSRC84Zk9UNG8rTkdJTGIrVHVmQ285Y2VCQm0zSkxWbitNTzI2NzVuN3FpRVgvNlcrMTg4Y1lnM1puNU5TVGpnT0tmV0ZTQUFOYTZyYUN4U29WVTg1MW9KTFkxMVdJb1lLMGR1MGVjNUU0dENuQVBvS2g3MXJpVHNqVklwM2dLdkJiRVlRaU5Zcm1IMjJvTFFXQTJBZHdNbklENlBYOWI1OGRSMlFLbzRxYWcxRDFaK0wvRndFS1RSN29zT1pQV0VDUEpJSFFxUFVzTTVpL0NINVl1cFZQZkZBNXBIVUJjc2VzaDhlTzVZaHlXbmFWUlBabi9CbWRYVnVtWldQeE1QNWUyOHptMnVxSGdGb1Q5Q3ltSFlOTnJ6cnJqbFhaTTA2SG56RHhZTmxJNWIvUW9zeExtbXJxREZxbW9nUWRxazBXTGtVY2VvQXZReEhna0l5dldVNjlCUEZyMjRWQjYrbHg3NVJuYTZkR3RybU94RG52Qm9qdmkxLzRkSGpWZWc4b3dvZlBlMWNPbnhVMWlvaDAxNnMvVnVkdjltaFY5ZjM1QXQrU2gyOGgxYnBwOHhocjA5K3ZmNDdFbHgzTXM2aHlwNlF2QjN0MHZuTGJPaHdvNjYwY3A3SzB2dmVwYWJLN1lKZnhFV1dmckMyWXpKZllPanlnUHdmd2QvMWFtVHFhMGhaNXVlZWJoV1lWTXViUlR3SWpqKzBPcTBvaFUzemZSZnVMOGd0NTlYc0hkd0t0eFRRUTRZMnF6Nmdpc3hubTJVZGxtcEVrZ09zWno3aUVrNlFPdDhCdVB3citOUjAxTFRxWG1KbzFDNzZvMU4yNzR0d0p2bCtJMDY5VGlMcGVuSy9taVJ4aHlZOGp2WVY2VzFXdVN3aEg5cTdrdXduSk10bTdJV2NxczdIc255SFNxV1hMU3BZdFpHYVIxVjN0MGdhdW5pbkZQWkd0V3NrRjY1cnR0aTQ4VVY5dVY5S004a2ZEWXMwcGdCMDBTK1RselRYVjZQOG14cTE1YjlFbjhzejNqV1NzemNpZlphL051dWZQTm5OVGIwMzFwcHR0MCtzUlNILzdVRzhwemJzZ3R0M09HM3V0N0I5SnpETXQybVRadXlSTklWOEQ1NFR1VHJwTmNIdGdtTWxZSmVpWTlYUzgzTllKaWNqUmp0SlNmOUJaTHNRdjYyOVFkRHNLUWhUSzVDblhocGs3dk1Oa0h6UGhtMEV4Vy9WQ0dBcEhmUHlCYWd0WlFUUW1QSHg3ZzVJWFhzclFEUHpJVmh2MkxCNkloMTM4aVNEd3cxSk5IckR2elV4dnA3M01zUUJWaFc4RWJyUmVhVlVjTEIxUjNQVVh5YVlHNEhwSlVjTFZ4TWdEeGNQa1ZSUXBMN1ZUQUdhYkR6YktjdmcxMnQ1UDhUU0dRa3JqL2dPcnBuYmlESHdsdUE3M3hiWHRzL0w3dTQ2OGNSV1NXUnRnVHdsUW5BNDdFS2cwT2laRGdGeEFLUVFVY3NiR29tSVRnZVhVQUF5S2UwM2VBN01wNGdueUtRbW0wTFhKdEVrNmRka3NNSkN1eERtbUh6bVZoTytYYU4yQTU0TUloM25pdzVDRjdQd2lYRlpybkE4d09kZUhMdnZoZG9xSURHOVBESTdVbldXSHE1MjZUOHk2aXhKUGhrdVZLWm5vVXJ1T3BVZ09PcDNpSUtCamsreWkxdkhvNWNJdEhYYjFQSUt6R2FabFJTMGc1ZDNNVjJwRDhGUWRHWUxaNzNhYWUvZUVJVWVQTWM0TkZ6OHBJVWZMQ3JyRjRqVldINWdRbmVOM1M4dkFOQm1VWHJFY0tHbjZoSVVOOTV5MXZwc3ZMd2JHcHpWOUwwWktUYW42VERYTTA1MjM2dUxKY0lFTUtWQXhLTlQwSzhXbGp1d05ueTNCTlFSZnpvdkE4NWJlSTl6cjFBR05ZbllDVmtSMWFHbmdXVVJVcmdxUitnUnJRaHhXODFsM0NIZXZqdkdFUHpQTVR4ZHNJZkI5ZGZHUmJaVTBjZy8xbWN1YnRFQ1g0dHZhZWRtTkF2VHhDSnRjMlFhb1VhbEdmRU5DR0s3SVMvTzhDUnBkT1ZjYThFV0NSd3Yyc1NXRThDSlBXNVBDdWdqQ1hQZDNoNlU2MGNQRCtiZGh0WFp1WUI2c3Rjb3ZlRTdTbTVNTTJ5dmZVSFhGU1c3S3pMbWk3L0VlRVdMMHdxY09IOU1PU0tqaENISG13K0pHTGNZRS83U0JaUUNSZ2dveDBaWlRBeHJsek5OWFlYTDVmTklqa2RUNFlNcVZVejZwOFlEdDA0OXY0T1hHZGczcVRydExCVVhPWmY3YWhQbFpBWS9PKzdTcDBidkdTSGR5UThCMUxPc3BscU1iOVNlOFZBRTdnSWRTWnZ4YlJTcmZsK0xrNVFhcWk1UUpjZXFqaXRkRXJjSFhnLzNNcnlsalBTSUFNYWFsb0ZtMWNWd0JKOERObWtEcW9HUk9TSEZldHJnalE1Q2FodUtrZEg1cFJQaWdNcmdUdGxGSTh1ZkpQSlNVbEdnVGpiQlN2cFJjMHp5cGlVbjZVNUtacWNSb3lydHpobUo3L2NhZVprbVZSd0pRZUxPRzhMWTZ2UDVDaHBLaGM4SnMwRWwrbjZGWHFieDlJdGR0THRZUDkya0tmYVRMdENpOFN0TFpkRU5KYTlFeDFuT296MWtRN3F4b2laRktSeUxmNE80Q0hSVDBULzBXOUY4ZXBOS1ZvZXl4VVhoeTNzUU1Nc0pqUUpFeU1Pam1PaE1GZ09tbWxzY1Y0ZUZpMUNsZFU5Mnlqd2xlaXJFS1BXM2JQQXVFaFJaVjdKc0tWM0xyNWNFVEFpRnVYNU53NVVsRjdkMkhaOTZCaDBzZ0ZJTDVLR2FLU29WWVZsdmRLcFpKVlA1K05aN3hERWtRaG1EZ3NES2NpYXpKQ1hKNlpOMkIzRlkyZjZWWnlHbC90NGF1bkdJQWsvQkhhUytpK1NwZFJmbkIvT2t0T3Z5amluV05mTTlLc3I2V3d0Q2ExaENtZVJJNmljcEZNNG84cXVDTHNpa1UwdE1vWkkvOUVxWFJNcEtHYVd6b2ZsNG5RdVZRbTE3ZDVmVTVxWENRZUNEcVZhTDlYSjlxSjA4bjNHM0VGWlMyOFNIRWIzY2RSQmR0TzBZY1R6aWwzUWtuTktFZS9zbVExZlRiMFhicHlOQjV4QWV1SWxmKzVLV2xFWTBEcUpic256SmxReEpQT1Z5SGlLTXg1WHU5RmNFdjFGYmc2RmhtNHQrSnl5NUpDMVczWU84ZFlMc08wUFhQYnhvZEJndHRUYkgzcnQ5Q3AxbEpJazJyM08xWnF1OTRlUmJuSXoyZjUwbFdvbFl6dUtzajRQTW9rNGFiSExPOE5BQzg4NGhpWHg1Rnk1cFdLTzBiV0w3dUVHWGFKQ3R6bmhQNjdTbFE0eGpXSWZncTZFcFoyOFFNdHVaSzdKQzBSR2JsOW5BNFh0Rkx1Zy9OTE1vSDFwR3Q5SW9uQUpxY0VETHlINlREUk9jYnNtR1BhR0l4TW80MUlVQW5RVlBNUEdCeXA0bU9taDlaUU1rQkFja3NVSzU1THNaajdFNXo1WHVab3lXQ0t1Nm5IbURxMjJ4SS85WjhZZHhKeTRrV3BEMTZqTFZycHdHTFdmeU9EMFdkK2NCekZCeFZhR3Y3UzVrOXF3aC81dC9MUUVYc1JxSTNROVJtM1FJb2FaVzlHbHNEYUtPVXl5a3lXdWhOT3ByU0VpMHMxRzRyZ29pWDFWNzQzRUVMdGkrcEp1NW9nNlgwZzZvVHluVXFsaEg5azZlenlSaTA1TkdaSHowbnZwM0hPSnI3ZWJyQVVGckRqYmtGQk9iRXZkUVdra1ViTDBwRXZNVTQ2WDU4dkY5ajlGM2o2a3B5ZXROVUJJdHJFdWJXOVp2TVBNNHFOcUxsc1NCSnFPSDNYYk53di9jWERYTnhOOGlGTHpVaHRlaXNZWStSbEhZT3VQMjkvQ2IrTCt4diszNVJ2N3h1ZG5aNm9oSzRjTVBmQ0c4S0k3ZE5tak5rL0g0ZTg0cE94bi9zWkhLOXBzZnZqOG5jQThxSno3Tzh4cWJ4RVNEaXZHSk9aekY3bzVQSkxRN2czNHFBV295dUEreDNidFU5OExUNlp5R3ljZUlYanJxb2IyQ0FWcWw0Vk9UUVBVUVl2SFYvZzR6QXVDWkd2WVFCdGYwd21kNWxpbHJ2dUVuMUJYTG55MDFCNGg0U01EbFlzbk5wbTlkN205aDU3OHVmcGVmOVo0V3BscVdRdnFvNTJmeVVBN0oyNGVaRDVhdjZTeUdJVjlrcG1ITnF5dmRmemNwRU13OTdCdmtuVjJmcStNRkh1bjlCVDNMc2Y4cGJ6dmlzV2lJUXZZa25nKzhWeGsxVitkbGkxdTU2a1k1MExSamFQZG90dlQ1QndxdHd5RitlbW8vejlKM3lWVVZHZktyeFF0Sk1PQVFXb1FpaS80ZHA5d2d5YlNhNW1rdWNtUkx0RVFaL3B6MHRML05WY2dXQWQ5NW5FUTNUZzZ0TmJ1eW4zSWVwejY1TDNodU1VVUJudGxsV3V1NERidE9GU01TYnBJTFY0Znk2d2xNMFNPdmk2Q3BMaDgxYzFMcmVJdktkNjF1RVdCY0R3MWxVQlVXMUkwWittL1BhUmxYK1BRL294ZzBZZTZLVWlJaVRGNEFETms1OVlkcHQ1L3JreG1xOXRWNUtjcC9lUUxVVlZtQnpRTlZ1eXRRQ1A2RXpkMEc4ZUx4V3lIcG1aV0ozYkF6a1dUdGc0bFpsdzQyU1FlekVtaVVQYUpVdVIvcWtsVkEvODdTNEFyRkNwQUxkWTNRUmRVdzNHM1hiV1VwNmFxOXowelVpemNQYTczNTFwOUpYT1p5ZmRaQkZucXQ5MFZ6UW5kWEIvbXdmOExDOVNUajVrZW5WcE51cU9RUVAzbUlSSmo3ZVYyMUZ4RzhWQXhLckVuM2MrWGZtWjgwMEVQYjkvNWxJbGlqc2NVYkI2ZGEwUlFhTW9vazB6dWcxRzB0S2kvSkJDNHJ3Ny9EM200QVJ6QWt6TWNWckRjVDJTeUZ0VWRXQXNGbHNQREZxVjNOK0VqeVhhb0VlUHdyb2FaQ2lMcUV6YjhNVytQTkU5VG1UQzAxRXpXbGk1MVB6WnZVcWtteXVST1UrVjZpaytMZS85cVQ2bnd6VXpmOXRQNjh0WWVpMFlhREd4NmtBZDdqbjFjS3FPQ3VZYmlFTEg5ellxY2M0TW5SSmprZUdpcWFHd0xJbWh5ZUtzK3hLSk1CbE9KMDVvdzlnR0NLWjFWcG5NS29TQ1RiTVMrWCsyM3kwNDJ6T2I1TXRjWS82b0JlQW8xVnk4OU9UeWhwYXZGUDc4alhDY0ZIMHQ3R3gyNGhNRU9tMmdzRWZHYWJWcFFndkZxYlFLTXNrbkZSUm11UEhjWnUwU3UvV01GcGhadkIyci9FR2JHNzJycEdHaG8zaCtNc3owdUd6SjdoTksydXFRaUUxcW1uMHpnYWNLWVlaQkNxc3hWK3NqYnBvVmRTaWxXL2I5NG4yeE5iNjQ4Vm1OSW9penFFV2hCbnNlbitkMGtiQ1BtUkl0ZldxU0JlT2Q5V25lM2M2YmNkNnV2WE9KNldkaVNzdVhxMG5kaHFyUTRRb1dVakNqWXRaMEVBaG5TT1AxbTQ0eGtmME83alhnaHJ6U0pXeFA0YS90NzJqVTI5VnUycnZ1NG43SGZIa2ttUU9NR1NTK05QZUxHTzVJNzNtQzJCNytsTWlCUVFaUk05LzlsaUxJZm93dXBVRkFiUEJiUitseERNNk04UHRnaDFwYUpxNVJ2czd5RXVMUXYvN2Qxb1Uyd29GU2IzRk1QV1FPS011Q3VKN3BERGpwSWNsdXM1VGVFb01CeTJZZFZCNGZ4bWVzYUNlTU5zRWdUSEtTNVdEU0d5TlVPb0VwY0MyT0ZXdElSZjB3MjdjazM0L0RqeFJUVkljYzkra3FaRTZpTVNpVkRzaUtkUC9YejVYZkVobS9zQmhPNTBwMXJ2SkRsa3l5eHVKOVNQZ3M3WWVVSkJqWGRlQWtFK1A5T1FKbTZTWm5uMXN2Y2R1STc4ZFltYmtFMm10emlQcmNqVmlzWEc3OHNwTHZiWmFTRngvUmtzOXpQNExLbjBDZHovM0pzZXRrVDA2QThmL3lDZ01PNk1iMUhtZTBKSjdiMndaejFxbGVxVHVLQkdva2hQVlVaMGRWdSt0blFZTkVZMWZta1pTejYrRUdaNUV6TDc2NTdtcmVaR1IzalVmYUVrNDU4UERuaUJ6c1NtQktoRFJ6ZlhhbWVyeUp2OS9ENW02SElxWjBSK291Q0U1NER6cDRJSnV1RDFlNERjNWkrUHBTT1JKZkcyM3VWZ3FpeEFNRHZjaE1SMG5aZEg1YnJjbFl3Um9KUld2L3JseEdSSTVmZkQ1TlBHbUlEdDd2REUxNDM0cFlkVlpJRmg4OUJzOTRIR0dKYlR3ck44VDZsaDFIWkZUT0I0bFd6V2o2RVZxeFNNdkMwL2xqV0JRM0Yya2MvbU8yYjZ0V29uVDJKRXFFd0Z0czhyejJoK29XTmRzOWNlUjJjYjd6WnZKVERwcEhhRWhLNWF2V3Fzc2VXYTJEdDVCQmhhYmRXU2t0Uzgwb01Rckw0VHZBTTliNUhNbXlEbk8rT2trYk1YZlVKRzdlWHFUSUc2bHFTT0VicVZSK3FZZFA3dVdiNTdXRUpxenloNDExR0FWc0RpblBzN0t2VWVYSXRsY01kT1VXelhCSDZ6c2N5bVYxTExWQ3RjOEllUG9qelhIRjltNWI1ekd3QlJkemN5VUpraXU5MzhBcG1BYXlSZEpyWDFQbVZndVdVdnQyVGhRNjJjekl0VHlXSk1XMkFuL2hkRGZNSzdTaUZRbEdJZEFibHRIejN5Y29oN2o5VjdHeE5XQnBidGNTZHFtNFh4UndUYXdjM2NiWit4ZlN2OXFRZkVrREtmWlR3Q2txV0dJL3VyMjUwSXRYbE1saDZ2VU5XRVlJZzlBM0d6YmdtYnF2VE44anMyWU1vODdDVTV5Nm5aNGRiSkxEUUpqOWZjN3lNN3RaekpEWkZ0cU9jVTgrbVpqWWxxNFZtaWZJMjNpSGIxWm9UOUUra1QyZG9sblAxQWZpT2t0N1BRQ1N5a0JpWHk1bXY2MzdJZWdXU0tqOUlLcllaZjRMdTkrSTd1Yitta1JkbHZZemVoaC9qYUo5bjdIVUg1YjJJYmdlTmRrWTd3eDF5Vnp4UzdwYnZreTYrbm1WVXRSbGxFRmZ3ZVVRMC9uRzAxN1dvVVlTeHMrajJCNEZWL0Y2MkV0SGxNV1pYWXJqR0hwdGhuTmIxeDY2TEtaMFFlOTJJTldIZGZSL3ZxcDAyd01TOHIxRzRkSnFIb2s4S21RNzk0N0cxM2E0WVhic0dnSGNCdlJ1VnUxZUFpNC9BNStaaXhtZFNYTTczTHVwQi9MSDdPOXl4TFRWWEpUeUJiSTFTNDlUSVJPcmZWQ09iL2N6WjlwTTRKc1p4OGtVejhkUUd2N2dVV0t4WHZUSDdRTS8zSjJPdVhYZ2NpVWhxWStjZ3RhT2xpUVFWT1l0aEJMVjN4cEVTWlQzcm1mRVlOWnhtcEJiYjI0Q1Jhbzg2cHJuK2k5VE5PaDhWeFJKR1hKZlhIQVRKSHMxVDV0eGdjL29wWXJZOFhqbEdRUWJSY294SUJjblZzTWptVTF5bW1JVUw0ZHZpSlhuZE1BSjBZZXQrYzdPNTIvcDk4eXRsbUFzR0JhVEFtTWhpbUFudnAxVFdOR005QnB1aXRHait0ODEwQ1UyVWhvcnJqUEtHdFRoVkM4V2FYdzA0V0ZuVDVmVGpxbVB5clEwdE4zQ2tMc2N0VnkyeHIwWldnaVdWWjFPcmxGamp4SllzT2ladjJjQW9PdkUrN3NZMEkvVHdXY1pxTW95SUtOT2Z0d1A3dysrUmZnNjdsamZvdktZYTUwaWYzZnpFLzhhUFlWZXkvTnEzNStuSDJzTFBoL2ZQNVRzeWxTS0dPWjRrNjlkMlBuSDQzK2txKytzUlhIUXFHQXJXZHdoeCtocHdRQzZKZ1QydXhlaFlVNFpidzdvTmI2L0hMaWtQeUpST0dLMm91eXIrdnpzZUVTcDlHNTBUNEF5RnJTcU9RMHJyb0NZUDRzTURGQnJIbjM0MkV5WlRNbFN5azQ3ckhTcTg5WTkvbkkzekc1bFgxNlo1bHhwaGd1TE9jWlVuZEw4d05jcmt5akg4MmpxZzhCbzhPWWt5bnJ4WnZiRm5vNWxVUzNPUHI4S28zbVg5Tm9SUGRZT0tLakQwN2J2Z0ZncFovUkYrWXprV3ZKL0hzL3RVYmZlR3pHV0x4TkFqZkR6SEhNVlNEd0I1U2FiUUxzSVpIaUJwNDNGakdrYWllbllvRGQxOGh1MkJHd09LN1UzbzcwSy9XWS9rdXVLZG1kcnlrSUJVZEcybXZFOTFMMUp0VGJoMjBtT0xiazF2Q0FhbXU3dXRsWGVHVTJvb1Zpa2JVL2FjdGNnbXNDMUZLazJxbWozR1dlSVdiajR0R0l4RTdCTGNCV1V2dmNuZC9sWXhzTVY0RjkxN2ZXZUZCL1hiSU5OM3FHdkl5VHBDYWx6MWxWZXdkSUdxZUFTL2dCOE1pK3NBK0JxRGlYM1ZHRDJlVXVuVFJiU1krQXVEeTRFM1F4M2hBaHduU1hYK0IwenVqM2VRMW1pUzhWdXgyei9sNi9Ca1d0aktHVTcyYUprT0NXaEdjU2YzK2tGa2tCMTV2R09zUXJTZEZyNnFUajBnQllpT2xuQk80MTE3MGdPV0hTVW9CVlJVMkpqd3BwWWRoSUZEZnU3dElSSGNjU05NNUtaT0ZEUHowVEdNQWp6ekVwZUx3VFdwK2tuMjAxa1U2TmpiaU1RSng4MytMWDFlMXRaMTBrdUNoSlovWEJVUTFkd2FCSGpUREpEcU95bXBFazhYMk0zVnRWdzIxSmtzQ2hBOHcxdFRlZk8zUkoxRk1icVowMWJISGt1ZERCL09oTGZlN1A1R09IYUkyOFpYS1RNdXFvMGhMV1E0SGFiQnNHRzdOYlAxUmlYdEVUejA3NGVyNncvT2VySldFcWpta3EyeTUxcTFCVkkrSlV1ZG5WYTNvZ0JwemRoRkU3ZkM3a3lickF0Mlo2UnFEakFUQVVFWWVZSzQ1V011cEJLUVJ0UWxVK3VOc2puemo2Wm1HcmV6QStBU3JXeFE2TE1rSFJYcVh3TnE3ZnR2MjhkVXgvWlNKY2lEWFAyU1dKc1dhTjBGalBYOVlrbzZMb2JaN2FZVy9JZFVrdEk5YXBUTHlIUzhEeVdQeXVvWnl4TjFUSy92dGZ4azNId1doNkpjelpDOEZ0bjBiSUpheTJnK241d2Q3bG05ckVzS08rc3ZxVm1pK2Mxajg4aFNDeGJ6cmc0K0hFUDBOdDEvQjZZVzFYVm0wOVQxQ3BBS2pjOW4xOGhqcXNhRkdkZnl2YTFaRzBYdTNpcDZONkpHcHlUU3FZNWg0Qk9scExQYU9ueXc0NVBkWFROK0R0QUtnN0RMckxGVG5XdXNvU0JIazNzMGQ3WW91SkhxODUvUjA5VGZjMzdFTlhaRjQ4ZUFZTG5xOUdMaW9OY3dEWnJDNkZXNmdvZEI4Sm5xWVVQdm4wcFdMZlF6MGxNMFl5OE15YmduODREczNROWJEUDEwYkx5T1YrcXp4YTRSZDlEaHU3Y2p1OG1NYU9OWEszVXFtQlE5cUlnN2V0SXdFcU0va0VDay9EemphNEJzMXhSK1EvdENiYzhJS3JTR3NUZEpKMHZnZTdJRzIwVzY4N3VWbUs2aWNXUTZjRDNsd0Z6Z05NR3RGdk81cXlKZUtmbEdMQUFjUVpPcmt4Vnd5M2NXdnFsR3B2am1mOVFlNkFwMjBNUGJWOTJEUFYwT2hGTTRrejhZcjBmZkMyekxXU1Exa3FZNlFkUXJ0dFIza2gxWUx0UWQxa0NFdjVoVm9QSVJXbDVFUmNVVHR0QklyV3A2WHM1RWhoNU9VVXdJNWFFQnZ1aURtVW9FTm1uVncxRm9oQ3JiUnAxQTFFK1hTbFdWT1RpN0FEVys1T2hiOXoxdks0cXg1UjVsUGRHQ1BCSlowMG1DK1NzcDhWVWJncEdBdlhXTXVXUVFSYkNxSTZScjJqdHhaeHRmUDdXLzhvbnoreXowR3M3NkxhVDVIWDllY3lpWkNCL1pSL2dGdE14UHNEd29ob2VDUnRpdUx4RTFHTTF2VUVVZ0J2ODYrZWVoTDU4L1A1NlFGR1EvTXFPZS92Qzc2TDYzanptZWF4NGV4ZC9PS1RVdmtYZytmT0pVSHljaDl4dC85Z29KTXJhcFNndlhyajgrOHZrL044MGYyMlNld2o2Y3lHcXQxQjZtenRvZWtsVkhIcmFvdWh2SEphRy9PdUJ6NkRIS01wRm1RVUxVMWJSV2x5WUUwUlBYWVlrVXljSWVtTjdUTHRnTkNKWDZCcWR5eERLa2VnTzduSks1eFE3T1ZZRFpUTWY5YlZIaWR0azZEUVg5RXQrVjlNN2VzZ2JzWUJkRWVVcHNCMFh2dzJrZDkrckk3VittNDd1K08vdHE3bXc3MjYySFUxV2xTOXVGenNWNkp4SUhObVVDeTBRUzllMDc3SkdSRmJHNjV6My9kT0tCL1prK3lEZEtwVW1kWGpuL2FTM041bnY0Zks3Yk1ISG1QbEhkNEUyK2lUYlY1cnB6U2NSbnhrNktBUnVEVEo4UTFMcEsybVA4Z2oxRWJ1SjlSSXlZK0VXSzRoQ2lJREJBUzFUbTJJRVhBRmZnS1BnZEw5TzZtQWEwNndqQ2NVQUw2RXN4UFFXTzlWTmVnQlBtLzBHZ2taYkR4Q3lueHVqWC85MnZtR2NqWlJNQVk0NXB1YWsyc0ZMQ0xTd1hwRXN5eTVmbkYwakdKQmhtK2ZOU0hLS1VVZnkrMjc2QTcvZmVMT0Z4eFV1SFJOSkkyT3Nlbnh5dmY4REFHT2JUNjBwZlRUbGhFZzl1L0tLa2hKcW01VTEvK0JFY1NrcEZEQTVYZUNxeHdYbVBhYzFqY3VaM0pXUStwME5kV3piLzV2MVp2RjhHdE1URkZFZFFqcExPMGJ3UGIwQkhOV25pcDNsaURYSTJmWGYwNWpqdmZKME5wakxDVWdmVGg5Q01GWVZGS0VkNFovT0cvMkMrTjQzNW1uSys5dDFndkNpVmNhYUg3cks0K1BqQ3ZwVk5peit0MlF5cUgxTzh4M0pLWlZsNlErTHAvWEs4d01qVk1zbE9xOUZkU3c1RnRVcy9DcHRYSDlQVyt3YldIZ3JWMTdSNWpUVk90R3RLRnUzbmI4MFQrRTB0djlRa3pXM0oyZGJhdy84ZGRBS1owcHhJYUVxTGpsUHJqaTNWZ0ozR3ZkRnZscUQ4MDc1d294aDRmVnQwSlpFMEtWRnNBdnFoZTBkcU45YjM1anRTcG5ZTVhrVSt2WnErSUFIYWQzSUhjMnMvTFlybkQxYW5mRzQ2SUZpTUlyOW9OYlpEV3Z3dGhxWU5xT2lnYUtkL1hsTFU0WEhmay9QWElqUHNMeS85L2tBdFErL3dLSCtoSS9JUk9XajVGUHZUWkFUOWY3ajRaWFF5RzRNMFR1ak1BRlhZa0t2RUh2MXhoeVNla2dYR0dxTnhXZVdLbGY4ZERBbEx1QjFjYi9xT0Qrcms3Y213dCsxeUtwazljdWRxQmFuVGk2elRiWFJ0VjhxeWxOdGp5T1ZLeTFIVHowR1c5cmp0NnNTakFaY1Q1UitLZHR5WWIwenlxRzlwU0x1Q3c1V0J3QW43ZmpCaktMTG94TFhNSSs1Mkw5Y0x3SVIyQjZPbGxKWkxISjh2RHhtV2R0RitRSm5tdDFyc0hQSVdZMjBsZnRrOGZZZVBrQUlnNkhnbjUzMlFvSXBlZ014aVdnQU9mZTUvVTQ0QVBSOEFjME5lWnJWaDNnRWhzMTJXK3RWU2lXaVVRZWtmL1lCRUNVeTVmZFliQTA4ZGQ3VnpQQVA5YWlWY0lCOWs2dFk3V2RKMXdOVitiSGV5ZE50bUM2RzVJQ3RGQzFad21KVS9qOGhmMEk4VFJWS1NpejVvWUlhOTNFcFVJNzhYOEdZSUFaYWJ4NDcvbjhMREFBSjBuTnRQMXJwUk9wcnFLTUJSZWNTaGNhNnFYdVRTSTNqWkJMT0IzVnAzODFCNXJDR2hqU3ZoL05TVmtZcDJxSWRQL0JnPVwiO1xuXG4vKipcbiAqIFRoZSBub3JtYWwgZGljdGlvbmFyeS1kYXRhLmpzIGlzIHF1aXRlIGxhcmdlLCB3aGljaCBtYWtlcyBpdFxuICogdW5zdWl0YWJsZSBmb3IgYnJvd3NlciB1c2FnZS4gSW4gb3JkZXIgdG8gbWFrZSBpdCBzbWFsbGVyLFxuICogd2UgcmVhZCBkaWN0aW9uYXJ5LmJpbiwgd2hpY2ggaXMgYSBjb21wcmVzc2VkIHZlcnNpb24gb2ZcbiAqIHRoZSBkaWN0aW9uYXJ5LCBhbmQgb24gaW5pdGlhbCBsb2FkLCBCcm90bGkgZGVjb21wcmVzc2VzXG4gKiBpdCdzIG93biBkaWN0aW9uYXJ5LiDwn5icXG4gKi9cblxudmFyIGluaXQgPSBmdW5jdGlvbiBpbml0KEJyb3RsaURlY29tcHJlc3NCdWZmZXIpIHtcbiAgdmFyIGNvbXByZXNzZWQgPSBiYXNlNjRKcyQxLnRvQnl0ZUFycmF5KGRpY3Rpb25hcnlfYmluKTtcbiAgcmV0dXJuIEJyb3RsaURlY29tcHJlc3NCdWZmZXIoY29tcHJlc3NlZCk7XG59O1xuXG52YXIgZGljdGlvbmFyeURhdGFDb21wcmVzc2VkID0ge1xuICBpbml0OiBpbml0XG59O1xuXG52YXIgZGljdGlvbmFyeSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcbiAgLyogQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAgXG4gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIFxuICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgXG4gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgXG4gICAgIENvbGxlY3Rpb24gb2Ygc3RhdGljIGRpY3Rpb25hcnkgd29yZHMuXG4gICovXG4gIGV4cG9ydHMuaW5pdCA9IGZ1bmN0aW9uIChCcm90bGlEZWNvbXByZXNzQnVmZmVyKSB7XG4gICAgZXhwb3J0cy5kaWN0aW9uYXJ5ID0gZGljdGlvbmFyeURhdGFDb21wcmVzc2VkLmluaXQoQnJvdGxpRGVjb21wcmVzc0J1ZmZlcik7XG4gIH07XG5cbiAgZXhwb3J0cy5vZmZzZXRzQnlMZW5ndGggPSBuZXcgVWludDMyQXJyYXkoWzAsIDAsIDAsIDAsIDAsIDQwOTYsIDkyMTYsIDIxNTA0LCAzNTg0MCwgNDQwMzIsIDUzMjQ4LCA2MzQ4OCwgNzQ3NTIsIDg3MDQwLCA5MzY5NiwgMTAwODY0LCAxMDQ3MDQsIDEwNjc1MiwgMTA4OTI4LCAxMTM1MzYsIDExNTk2OCwgMTE4NTI4LCAxMTk4NzIsIDEyMTI4MCwgMTIyMDE2XSk7XG4gIGV4cG9ydHMuc2l6ZUJpdHNCeUxlbmd0aCA9IG5ldyBVaW50OEFycmF5KFswLCAwLCAwLCAwLCAxMCwgMTAsIDExLCAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCA5LCA5LCA4LCA3LCA3LCA4LCA3LCA3LCA2LCA2LCA1LCA1XSk7XG4gIGV4cG9ydHMubWluRGljdGlvbmFyeVdvcmRMZW5ndGggPSA0O1xuICBleHBvcnRzLm1heERpY3Rpb25hcnlXb3JkTGVuZ3RoID0gMjQ7XG59KTtcbnZhciBkaWN0aW9uYXJ5XzEgPSBkaWN0aW9uYXJ5LmluaXQ7XG52YXIgZGljdGlvbmFyeV8yID0gZGljdGlvbmFyeS5kaWN0aW9uYXJ5O1xudmFyIGRpY3Rpb25hcnlfMyA9IGRpY3Rpb25hcnkub2Zmc2V0c0J5TGVuZ3RoO1xudmFyIGRpY3Rpb25hcnlfNCA9IGRpY3Rpb25hcnkuc2l6ZUJpdHNCeUxlbmd0aDtcbnZhciBkaWN0aW9uYXJ5XzUgPSBkaWN0aW9uYXJ5Lm1pbkRpY3Rpb25hcnlXb3JkTGVuZ3RoO1xudmFyIGRpY3Rpb25hcnlfNiA9IGRpY3Rpb25hcnkubWF4RGljdGlvbmFyeVdvcmRMZW5ndGg7XG5cbmZ1bmN0aW9uIEh1ZmZtYW5Db2RlKGJpdHMsIHZhbHVlKSB7XG4gIHRoaXMuYml0cyA9IGJpdHM7XG4gIC8qIG51bWJlciBvZiBiaXRzIHVzZWQgZm9yIHRoaXMgc3ltYm9sICovXG5cbiAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAvKiBzeW1ib2wgdmFsdWUgb3IgdGFibGUgb2Zmc2V0ICovXG59XG5cbnZhciBIdWZmbWFuQ29kZV8xID0gSHVmZm1hbkNvZGU7XG52YXIgTUFYX0xFTkdUSCA9IDE1O1xuLyogUmV0dXJucyByZXZlcnNlKHJldmVyc2Uoa2V5LCBsZW4pICsgMSwgbGVuKSwgd2hlcmUgcmV2ZXJzZShrZXksIGxlbikgaXMgdGhlXG4gICBiaXQtd2lzZSByZXZlcnNhbCBvZiB0aGUgbGVuIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2Yga2V5LiAqL1xuXG5mdW5jdGlvbiBHZXROZXh0S2V5KGtleSwgbGVuKSB7XG4gIHZhciBzdGVwID0gMSA8PCBsZW4gLSAxO1xuXG4gIHdoaWxlIChrZXkgJiBzdGVwKSB7XG4gICAgc3RlcCA+Pj0gMTtcbiAgfVxuXG4gIHJldHVybiAoa2V5ICYgc3RlcCAtIDEpICsgc3RlcDtcbn1cbi8qIFN0b3JlcyBjb2RlIGluIHRhYmxlWzBdLCB0YWJsZVtzdGVwXSwgdGFibGVbMipzdGVwXSwgLi4uLCB0YWJsZVtlbmRdICovXG5cbi8qIEFzc3VtZXMgdGhhdCBlbmQgaXMgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiBzdGVwICovXG5cblxuZnVuY3Rpb24gUmVwbGljYXRlVmFsdWUodGFibGUsIGksIHN0ZXAsIGVuZCwgY29kZSkge1xuICBkbyB7XG4gICAgZW5kIC09IHN0ZXA7XG4gICAgdGFibGVbaSArIGVuZF0gPSBuZXcgSHVmZm1hbkNvZGUoY29kZS5iaXRzLCBjb2RlLnZhbHVlKTtcbiAgfSB3aGlsZSAoZW5kID4gMCk7XG59XG4vKiBSZXR1cm5zIHRoZSB0YWJsZSB3aWR0aCBvZiB0aGUgbmV4dCAybmQgbGV2ZWwgdGFibGUuIGNvdW50IGlzIHRoZSBoaXN0b2dyYW1cbiAgIG9mIGJpdCBsZW5ndGhzIGZvciB0aGUgcmVtYWluaW5nIHN5bWJvbHMsIGxlbiBpcyB0aGUgY29kZSBsZW5ndGggb2YgdGhlIG5leHRcbiAgIHByb2Nlc3NlZCBzeW1ib2wgKi9cblxuXG5mdW5jdGlvbiBOZXh0VGFibGVCaXRTaXplKGNvdW50LCBsZW4sIHJvb3RfYml0cykge1xuICB2YXIgbGVmdCA9IDEgPDwgbGVuIC0gcm9vdF9iaXRzO1xuXG4gIHdoaWxlIChsZW4gPCBNQVhfTEVOR1RIKSB7XG4gICAgbGVmdCAtPSBjb3VudFtsZW5dO1xuICAgIGlmIChsZWZ0IDw9IDApIGJyZWFrO1xuICAgICsrbGVuO1xuICAgIGxlZnQgPDw9IDE7XG4gIH1cblxuICByZXR1cm4gbGVuIC0gcm9vdF9iaXRzO1xufVxuXG52YXIgQnJvdGxpQnVpbGRIdWZmbWFuVGFibGUgPSBmdW5jdGlvbiBCcm90bGlCdWlsZEh1ZmZtYW5UYWJsZShyb290X3RhYmxlLCB0YWJsZSwgcm9vdF9iaXRzLCBjb2RlX2xlbmd0aHMsIGNvZGVfbGVuZ3Roc19zaXplKSB7XG4gIHZhciBzdGFydF90YWJsZSA9IHRhYmxlO1xuICB2YXIgY29kZTtcbiAgLyogY3VycmVudCB0YWJsZSBlbnRyeSAqL1xuXG4gIHZhciBsZW47XG4gIC8qIGN1cnJlbnQgY29kZSBsZW5ndGggKi9cblxuICB2YXIgc3ltYm9sO1xuICAvKiBzeW1ib2wgaW5kZXggaW4gb3JpZ2luYWwgb3Igc29ydGVkIHRhYmxlICovXG5cbiAgdmFyIGtleTtcbiAgLyogcmV2ZXJzZWQgcHJlZml4IGNvZGUgKi9cblxuICB2YXIgc3RlcDtcbiAgLyogc3RlcCBzaXplIHRvIHJlcGxpY2F0ZSB2YWx1ZXMgaW4gY3VycmVudCB0YWJsZSAqL1xuXG4gIHZhciBsb3c7XG4gIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cblxuICB2YXIgbWFzaztcbiAgLyogbWFzayBmb3IgbG93IGJpdHMgKi9cblxuICB2YXIgdGFibGVfYml0cztcbiAgLyoga2V5IGxlbmd0aCBvZiBjdXJyZW50IHRhYmxlICovXG5cbiAgdmFyIHRhYmxlX3NpemU7XG4gIC8qIHNpemUgb2YgY3VycmVudCB0YWJsZSAqL1xuXG4gIHZhciB0b3RhbF9zaXplO1xuICAvKiBzdW0gb2Ygcm9vdCB0YWJsZSBzaXplIGFuZCAybmQgbGV2ZWwgdGFibGUgc2l6ZXMgKi9cblxuICB2YXIgc29ydGVkO1xuICAvKiBzeW1ib2xzIHNvcnRlZCBieSBjb2RlIGxlbmd0aCAqL1xuXG4gIHZhciBjb3VudCA9IG5ldyBJbnQzMkFycmF5KE1BWF9MRU5HVEggKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG5cbiAgdmFyIG9mZnNldCA9IG5ldyBJbnQzMkFycmF5KE1BWF9MRU5HVEggKyAxKTtcbiAgLyogb2Zmc2V0cyBpbiBzb3J0ZWQgdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG5cbiAgc29ydGVkID0gbmV3IEludDMyQXJyYXkoY29kZV9sZW5ndGhzX3NpemUpO1xuICAvKiBidWlsZCBoaXN0b2dyYW0gb2YgY29kZSBsZW5ndGhzICovXG5cbiAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBjb2RlX2xlbmd0aHNfc2l6ZTsgc3ltYm9sKyspIHtcbiAgICBjb3VudFtjb2RlX2xlbmd0aHNbc3ltYm9sXV0rKztcbiAgfVxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc29ydGVkIHN5bWJvbCB0YWJsZSBieSBjb2RlIGxlbmd0aCAqL1xuXG5cbiAgb2Zmc2V0WzFdID0gMDtcblxuICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWF9MRU5HVEg7IGxlbisrKSB7XG4gICAgb2Zmc2V0W2xlbiArIDFdID0gb2Zmc2V0W2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG4gIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi9cblxuXG4gIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgY29kZV9sZW5ndGhzX3NpemU7IHN5bWJvbCsrKSB7XG4gICAgaWYgKGNvZGVfbGVuZ3Roc1tzeW1ib2xdICE9PSAwKSB7XG4gICAgICBzb3J0ZWRbb2Zmc2V0W2NvZGVfbGVuZ3Roc1tzeW1ib2xdXSsrXSA9IHN5bWJvbDtcbiAgICB9XG4gIH1cblxuICB0YWJsZV9iaXRzID0gcm9vdF9iaXRzO1xuICB0YWJsZV9zaXplID0gMSA8PCB0YWJsZV9iaXRzO1xuICB0b3RhbF9zaXplID0gdGFibGVfc2l6ZTtcbiAgLyogc3BlY2lhbCBjYXNlIGNvZGUgd2l0aCBvbmx5IG9uZSB2YWx1ZSAqL1xuXG4gIGlmIChvZmZzZXRbTUFYX0xFTkdUSF0gPT09IDEpIHtcbiAgICBmb3IgKGtleSA9IDA7IGtleSA8IHRvdGFsX3NpemU7ICsra2V5KSB7XG4gICAgICByb290X3RhYmxlW3RhYmxlICsga2V5XSA9IG5ldyBIdWZmbWFuQ29kZSgwLCBzb3J0ZWRbMF0gJiAweGZmZmYpO1xuICAgIH1cblxuICAgIHJldHVybiB0b3RhbF9zaXplO1xuICB9XG4gIC8qIGZpbGwgaW4gcm9vdCB0YWJsZSAqL1xuXG5cbiAga2V5ID0gMDtcbiAgc3ltYm9sID0gMDtcblxuICBmb3IgKGxlbiA9IDEsIHN0ZXAgPSAyOyBsZW4gPD0gcm9vdF9iaXRzOyArK2xlbiwgc3RlcCA8PD0gMSkge1xuICAgIGZvciAoOyBjb3VudFtsZW5dID4gMDsgLS1jb3VudFtsZW5dKSB7XG4gICAgICBjb2RlID0gbmV3IEh1ZmZtYW5Db2RlKGxlbiAmIDB4ZmYsIHNvcnRlZFtzeW1ib2wrK10gJiAweGZmZmYpO1xuICAgICAgUmVwbGljYXRlVmFsdWUocm9vdF90YWJsZSwgdGFibGUgKyBrZXksIHN0ZXAsIHRhYmxlX3NpemUsIGNvZGUpO1xuICAgICAga2V5ID0gR2V0TmV4dEtleShrZXksIGxlbik7XG4gICAgfVxuICB9XG4gIC8qIGZpbGwgaW4gMm5kIGxldmVsIHRhYmxlcyBhbmQgYWRkIHBvaW50ZXJzIHRvIHJvb3QgdGFibGUgKi9cblxuXG4gIG1hc2sgPSB0b3RhbF9zaXplIC0gMTtcbiAgbG93ID0gLTE7XG5cbiAgZm9yIChsZW4gPSByb290X2JpdHMgKyAxLCBzdGVwID0gMjsgbGVuIDw9IE1BWF9MRU5HVEg7ICsrbGVuLCBzdGVwIDw8PSAxKSB7XG4gICAgZm9yICg7IGNvdW50W2xlbl0gPiAwOyAtLWNvdW50W2xlbl0pIHtcbiAgICAgIGlmICgoa2V5ICYgbWFzaykgIT09IGxvdykge1xuICAgICAgICB0YWJsZSArPSB0YWJsZV9zaXplO1xuICAgICAgICB0YWJsZV9iaXRzID0gTmV4dFRhYmxlQml0U2l6ZShjb3VudCwgbGVuLCByb290X2JpdHMpO1xuICAgICAgICB0YWJsZV9zaXplID0gMSA8PCB0YWJsZV9iaXRzO1xuICAgICAgICB0b3RhbF9zaXplICs9IHRhYmxlX3NpemU7XG4gICAgICAgIGxvdyA9IGtleSAmIG1hc2s7XG4gICAgICAgIHJvb3RfdGFibGVbc3RhcnRfdGFibGUgKyBsb3ddID0gbmV3IEh1ZmZtYW5Db2RlKHRhYmxlX2JpdHMgKyByb290X2JpdHMgJiAweGZmLCB0YWJsZSAtIHN0YXJ0X3RhYmxlIC0gbG93ICYgMHhmZmZmKTtcbiAgICAgIH1cblxuICAgICAgY29kZSA9IG5ldyBIdWZmbWFuQ29kZShsZW4gLSByb290X2JpdHMgJiAweGZmLCBzb3J0ZWRbc3ltYm9sKytdICYgMHhmZmZmKTtcbiAgICAgIFJlcGxpY2F0ZVZhbHVlKHJvb3RfdGFibGUsIHRhYmxlICsgKGtleSA+PiByb290X2JpdHMpLCBzdGVwLCB0YWJsZV9zaXplLCBjb2RlKTtcbiAgICAgIGtleSA9IEdldE5leHRLZXkoa2V5LCBsZW4pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b3RhbF9zaXplO1xufTtcblxudmFyIGh1ZmZtYW4gPSB7XG4gIEh1ZmZtYW5Db2RlOiBIdWZmbWFuQ29kZV8xLFxuICBCcm90bGlCdWlsZEh1ZmZtYW5UYWJsZTogQnJvdGxpQnVpbGRIdWZmbWFuVGFibGVcbn07XG5cbi8qIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cbiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiAgIExvb2t1cCB0YWJsZSB0byBtYXAgdGhlIHByZXZpb3VzIHR3byBieXRlcyB0byBhIGNvbnRleHQgaWQuXG5cbiAgIFRoZXJlIGFyZSBmb3VyIGRpZmZlcmVudCBjb250ZXh0IG1vZGVsaW5nIG1vZGVzIGRlZmluZWQgaGVyZTpcbiAgICAgQ09OVEVYVF9MU0I2OiBjb250ZXh0IGlkIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCA2IGJpdHMgb2YgdGhlIGxhc3QgYnl0ZSxcbiAgICAgQ09OVEVYVF9NU0I2OiBjb250ZXh0IGlkIGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IDYgYml0cyBvZiB0aGUgbGFzdCBieXRlLFxuICAgICBDT05URVhUX1VURjg6IHNlY29uZC1vcmRlciBjb250ZXh0IG1vZGVsIHR1bmVkIGZvciBVVEY4LWVuY29kZWQgdGV4dCxcbiAgICAgQ09OVEVYVF9TSUdORUQ6IHNlY29uZC1vcmRlciBjb250ZXh0IG1vZGVsIHR1bmVkIGZvciBzaWduZWQgaW50ZWdlcnMuXG5cbiAgIFRoZSBjb250ZXh0IGlkIGZvciB0aGUgVVRGOCBjb250ZXh0IG1vZGVsIGlzIGNhbGN1bGF0ZWQgYXMgZm9sbG93cy4gSWYgcDFcbiAgIGFuZCBwMiBhcmUgdGhlIHByZXZpb3VzIHR3byBieXRlcywgd2UgY2FsY3VhbHRlIHRoZSBjb250ZXh0IGFzXG5cbiAgICAgY29udGV4dCA9IGtDb250ZXh0TG9va3VwW3AxXSB8IGtDb250ZXh0TG9va3VwW3AyICsgMjU2XS5cblxuICAgSWYgdGhlIHByZXZpb3VzIHR3byBieXRlcyBhcmUgQVNDSUkgY2hhcmFjdGVycyAoaS5lLiA8IDEyOCksIHRoaXMgd2lsbCBiZVxuICAgZXF1aXZhbGVudCB0b1xuXG4gICAgIGNvbnRleHQgPSA0ICogY29udGV4dDEocDEpICsgY29udGV4dDIocDIpLFxuXG4gICB3aGVyZSBjb250ZXh0MSBpcyBiYXNlZCBvbiB0aGUgcHJldmlvdXMgYnl0ZSBpbiB0aGUgZm9sbG93aW5nIHdheTpcblxuICAgICAwICA6IG5vbi1BU0NJSSBjb250cm9sXG4gICAgIDEgIDogXFx0LCBcXG4sIFxcclxuICAgICAyICA6IHNwYWNlXG4gICAgIDMgIDogb3RoZXIgcHVuY3R1YXRpb25cbiAgICAgNCAgOiBcIiAnXG4gICAgIDUgIDogJVxuICAgICA2ICA6ICggPCBbIHtcbiAgICAgNyAgOiApID4gXSB9XG4gICAgIDggIDogLCA7IDpcbiAgICAgOSAgOiAuXG4gICAgIDEwIDogPVxuICAgICAxMSA6IG51bWJlclxuICAgICAxMiA6IHVwcGVyLWNhc2Ugdm93ZWxcbiAgICAgMTMgOiB1cHBlci1jYXNlIGNvbnNvbmFudFxuICAgICAxNCA6IGxvd2VyLWNhc2Ugdm93ZWxcbiAgICAgMTUgOiBsb3dlci1jYXNlIGNvbnNvbmFudFxuXG4gICBhbmQgY29udGV4dDIgaXMgYmFzZWQgb24gdGhlIHNlY29uZCBsYXN0IGJ5dGU6XG5cbiAgICAgMCA6IGNvbnRyb2wsIHNwYWNlXG4gICAgIDEgOiBwdW5jdHVhdGlvblxuICAgICAyIDogdXBwZXItY2FzZSBsZXR0ZXIsIG51bWJlclxuICAgICAzIDogbG93ZXItY2FzZSBsZXR0ZXJcblxuICAgSWYgdGhlIGxhc3QgYnl0ZSBpcyBBU0NJSSwgYW5kIHRoZSBzZWNvbmQgbGFzdCBieXRlIGlzIG5vdCAoaW4gYSB2YWxpZCBVVEY4XG4gICBzdHJlYW0gaXQgd2lsbCBiZSBhIGNvbnRpbnVhdGlvbiBieXRlLCB2YWx1ZSBiZXR3ZWVuIDEyOCBhbmQgMTkxKSwgdGhlXG4gICBjb250ZXh0IGlzIHRoZSBzYW1lIGFzIGlmIHRoZSBzZWNvbmQgbGFzdCBieXRlIHdhcyBhbiBBU0NJSSBjb250cm9sIG9yIHNwYWNlLlxuXG4gICBJZiB0aGUgbGFzdCBieXRlIGlzIGEgVVRGOCBsZWFkIGJ5dGUgKHZhbHVlID49IDE5MiksIHRoZW4gdGhlIG5leHQgYnl0ZSB3aWxsXG4gICBiZSBhIGNvbnRpbnVhdGlvbiBieXRlIGFuZCB0aGUgY29udGV4dCBpZCBpcyAyIG9yIDMgZGVwZW5kaW5nIG9uIHRoZSBMU0Igb2ZcbiAgIHRoZSBsYXN0IGJ5dGUgYW5kIHRvIGEgbGVzc2VyIGV4dGVudCBvbiB0aGUgc2Vjb25kIGxhc3QgYnl0ZSBpZiBpdCBpcyBBU0NJSS5cblxuICAgSWYgdGhlIGxhc3QgYnl0ZSBpcyBhIFVURjggY29udGludWF0aW9uIGJ5dGUsIHRoZSBzZWNvbmQgbGFzdCBieXRlIGNhbiBiZTpcbiAgICAgLSBjb250aW51YXRpb24gYnl0ZTogdGhlIG5leHQgYnl0ZSBpcyBwcm9iYWJseSBBU0NJSSBvciBsZWFkIGJ5dGUgKGFzc3VtaW5nXG4gICAgICAgNC1ieXRlIFVURjggY2hhcmFjdGVycyBhcmUgcmFyZSkgYW5kIHRoZSBjb250ZXh0IGlkIGlzIDAgb3IgMS5cbiAgICAgLSBsZWFkIGJ5dGUgKDE5MiAtIDIwNyk6IG5leHQgYnl0ZSBpcyBBU0NJSSBvciBsZWFkIGJ5dGUsIGNvbnRleHQgaXMgMCBvciAxXG4gICAgIC0gbGVhZCBieXRlICgyMDggLSAyNTUpOiBuZXh0IGJ5dGUgaXMgY29udGludWF0aW9uIGJ5dGUsIGNvbnRleHQgaXMgMiBvciAzXG5cbiAgIFRoZSBwb3NzaWJsZSB2YWx1ZSBjb21iaW5hdGlvbnMgb2YgdGhlIHByZXZpb3VzIHR3byBieXRlcywgdGhlIHJhbmdlIG9mXG4gICBjb250ZXh0IGlkcyBhbmQgdGhlIHR5cGUgb2YgdGhlIG5leHQgYnl0ZSBpcyBzdW1tYXJpemVkIGluIHRoZSB0YWJsZSBiZWxvdzpcblxuICAgfC0tLS0tLS0tXFwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgIHwgICAgICAgICBcXCAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0IGJ5dGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICB8IFNlY29uZCAgIFxcLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgfCBsYXN0IGJ5dGUgXFwgICAgQVNDSUkgICAgICAgICAgICB8ICAgY29udC4gYnl0ZSAgICAgICAgfCAgIGxlYWQgYnl0ZSAgICAgIHxcbiAgIHwgICAgICAgICAgICBcXCAgICgwLTEyNykgICAgICAgICAgfCAgICgxMjgtMTkxKSAgICAgICAgIHwgICAoMTkyLSkgICAgICAgICB8XG4gICB8PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT18XG4gICB8ICBBU0NJSSAgICAgIHwgbmV4dDogQVNDSUkvbGVhZCAgfCAgbm90IHZhbGlkICAgICAgICAgIHwgIG5leHQ6IGNvbnQuICAgICB8XG4gICB8ICAoMC0xMjcpICAgIHwgY29udGV4dDogNCAtIDYzICAgfCAgICAgICAgICAgICAgICAgICAgIHwgIGNvbnRleHQ6IDIgLSAzICB8XG4gICB8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18XG4gICB8ICBjb250LiBieXRlIHwgbmV4dDogQVNDSUkvbGVhZCAgfCAgbmV4dDogQVNDSUkvbGVhZCAgIHwgIG5leHQ6IGNvbnQuICAgICB8XG4gICB8ICAoMTI4LTE5MSkgIHwgY29udGV4dDogNCAtIDYzICAgfCAgY29udGV4dDogMCAtIDEgICAgIHwgIGNvbnRleHQ6IDIgLSAzICB8XG4gICB8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18XG4gICB8ICBsZWFkIGJ5dGUgIHwgbm90IHZhbGlkICAgICAgICAgfCAgbmV4dDogQVNDSUkvbGVhZCAgIHwgIG5vdCB2YWxpZCAgICAgICB8XG4gICB8ICAoMTkyLTIwNykgIHwgICAgICAgICAgICAgICAgICAgfCAgY29udGV4dDogMCAtIDEgICAgIHwgICAgICAgICAgICAgICAgICB8XG4gICB8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18XG4gICB8ICBsZWFkIGJ5dGUgIHwgbm90IHZhbGlkICAgICAgICAgfCAgbmV4dDogY29udC4gICAgICAgIHwgIG5vdCB2YWxpZCAgICAgICB8XG4gICB8ICAoMjA4LSkgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgY29udGV4dDogMiAtIDMgICAgIHwgICAgICAgICAgICAgICAgICB8XG4gICB8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18XG5cbiAgIFRoZSBjb250ZXh0IGlkIGZvciB0aGUgc2lnbmVkIGNvbnRleHQgbW9kZSBpcyBjYWxjdWxhdGVkIGFzOlxuXG4gICAgIGNvbnRleHQgPSAoa0NvbnRleHRMb29rdXBbNTEyICsgcDFdIDw8IDMpIHwga0NvbnRleHRMb29rdXBbNTEyICsgcDJdLlxuXG4gICBGb3IgYW55IGNvbnRleHQgbW9kZWxpbmcgbW9kZXMsIHRoZSBjb250ZXh0IGlkcyBjYW4gYmUgY2FsY3VsYXRlZCBieSB8LWluZ1xuICAgdG9nZXRoZXIgdHdvIGxvb2t1cHMgZnJvbSBvbmUgdGFibGUgdXNpbmcgY29udGV4dCBtb2RlbCBkZXBlbmRlbnQgb2Zmc2V0czpcblxuICAgICBjb250ZXh0ID0ga0NvbnRleHRMb29rdXBbb2Zmc2V0MSArIHAxXSB8IGtDb250ZXh0TG9va3VwW29mZnNldDIgKyBwMl0uXG5cbiAgIHdoZXJlIG9mZnNldDEgYW5kIG9mZnNldDIgYXJlIGRlcGVuZGVudCBvbiB0aGUgY29udGV4dCBtb2RlLlxuKi9cbi8qIENvbW1vbiBjb250ZXh0IGxvb2t1cCB0YWJsZSBmb3IgYWxsIGNvbnRleHQgbW9kZXMuICovXG5cbnZhciBsb29rdXAkMiA9IG5ldyBVaW50OEFycmF5KFtcbi8qIENPTlRFWFRfVVRGOCwgbGFzdCBieXRlLiAqL1xuXG4vKiBBU0NJSSByYW5nZS4gKi9cbjAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQsIDQsIDAsIDAsIDQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDgsIDEyLCAxNiwgMTIsIDEyLCAyMCwgMTIsIDE2LCAyNCwgMjgsIDEyLCAxMiwgMzIsIDEyLCAzNiwgMTIsIDQ0LCA0NCwgNDQsIDQ0LCA0NCwgNDQsIDQ0LCA0NCwgNDQsIDQ0LCAzMiwgMzIsIDI0LCA0MCwgMjgsIDEyLCAxMiwgNDgsIDUyLCA1MiwgNTIsIDQ4LCA1MiwgNTIsIDUyLCA0OCwgNTIsIDUyLCA1MiwgNTIsIDUyLCA0OCwgNTIsIDUyLCA1MiwgNTIsIDUyLCA0OCwgNTIsIDUyLCA1MiwgNTIsIDUyLCAyNCwgMTIsIDI4LCAxMiwgMTIsIDEyLCA1NiwgNjAsIDYwLCA2MCwgNTYsIDYwLCA2MCwgNjAsIDU2LCA2MCwgNjAsIDYwLCA2MCwgNjAsIDU2LCA2MCwgNjAsIDYwLCA2MCwgNjAsIDU2LCA2MCwgNjAsIDYwLCA2MCwgNjAsIDI0LCAxMiwgMjgsIDEyLCAwLFxuLyogVVRGOCBjb250aW51YXRpb24gYnl0ZSByYW5nZS4gKi9cbjAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsXG4vKiBVVEY4IGxlYWQgYnl0ZSByYW5nZS4gKi9cbjIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsXG4vKiBDT05URVhUX1VURjggc2Vjb25kIGxhc3QgYnl0ZS4gKi9cblxuLyogQVNDSUkgcmFuZ2UuICovXG4wLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAxLCAxLCAxLCAxLCAwLFxuLyogVVRGOCBjb250aW51YXRpb24gYnl0ZSByYW5nZS4gKi9cbjAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsXG4vKiBVVEY4IGxlYWQgYnl0ZSByYW5nZS4gKi9cbjAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsXG4vKiBDT05URVhUX1NJR05FRCwgc2Vjb25kIGxhc3QgYnl0ZS4gKi9cbjAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDcsXG4vKiBDT05URVhUX1NJR05FRCwgbGFzdCBieXRlLCBzYW1lIGFzIHRoZSBhYm92ZSB2YWx1ZXMgc2hpZnRlZCBieSAzIGJpdHMuICovXG4wLCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDU2LFxuLyogQ09OVEVYVF9MU0I2LCBsYXN0IGJ5dGUuICovXG4wLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLFxuLyogQ09OVEVYVF9NU0I2LCBsYXN0IGJ5dGUuICovXG4wLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA5LCA5LCA5LCA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAyMiwgMjIsIDIyLCAyMiwgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNSwgMjUsIDI1LCAyNSwgMjYsIDI2LCAyNiwgMjYsIDI3LCAyNywgMjcsIDI3LCAyOCwgMjgsIDI4LCAyOCwgMjksIDI5LCAyOSwgMjksIDMwLCAzMCwgMzAsIDMwLCAzMSwgMzEsIDMxLCAzMSwgMzIsIDMyLCAzMiwgMzIsIDMzLCAzMywgMzMsIDMzLCAzNCwgMzQsIDM0LCAzNCwgMzUsIDM1LCAzNSwgMzUsIDM2LCAzNiwgMzYsIDM2LCAzNywgMzcsIDM3LCAzNywgMzgsIDM4LCAzOCwgMzgsIDM5LCAzOSwgMzksIDM5LCA0MCwgNDAsIDQwLCA0MCwgNDEsIDQxLCA0MSwgNDEsIDQyLCA0MiwgNDIsIDQyLCA0MywgNDMsIDQzLCA0MywgNDQsIDQ0LCA0NCwgNDQsIDQ1LCA0NSwgNDUsIDQ1LCA0NiwgNDYsIDQ2LCA0NiwgNDcsIDQ3LCA0NywgNDcsIDQ4LCA0OCwgNDgsIDQ4LCA0OSwgNDksIDQ5LCA0OSwgNTAsIDUwLCA1MCwgNTAsIDUxLCA1MSwgNTEsIDUxLCA1MiwgNTIsIDUyLCA1MiwgNTMsIDUzLCA1MywgNTMsIDU0LCA1NCwgNTQsIDU0LCA1NSwgNTUsIDU1LCA1NSwgNTYsIDU2LCA1NiwgNTYsIDU3LCA1NywgNTcsIDU3LCA1OCwgNTgsIDU4LCA1OCwgNTksIDU5LCA1OSwgNTksIDYwLCA2MCwgNjAsIDYwLCA2MSwgNjEsIDYxLCA2MSwgNjIsIDYyLCA2MiwgNjIsIDYzLCA2MywgNjMsIDYzLFxuLyogQ09OVEVYVF97TSxMfVNCNiwgc2Vjb25kIGxhc3QgYnl0ZSwgKi9cbjAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKTtcbnZhciBsb29rdXBPZmZzZXRzID0gbmV3IFVpbnQxNkFycmF5KFtcbi8qIENPTlRFWFRfTFNCNiAqL1xuMTAyNCwgMTUzNixcbi8qIENPTlRFWFRfTVNCNiAqL1xuMTI4MCwgMTUzNixcbi8qIENPTlRFWFRfVVRGOCAqL1xuMCwgMjU2LFxuLyogQ09OVEVYVF9TSUdORUQgKi9cbjc2OCwgNTEyXSk7XG52YXIgY29udGV4dCA9IHtcbiAgbG9va3VwOiBsb29rdXAkMixcbiAgbG9va3VwT2Zmc2V0czogbG9va3VwT2Zmc2V0c1xufTtcblxuLyogQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblxuICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuICAgTG9va3VwIHRhYmxlcyB0byBtYXAgcHJlZml4IGNvZGVzIHRvIHZhbHVlIHJhbmdlcy4gVGhpcyBpcyB1c2VkIGR1cmluZ1xuICAgZGVjb2Rpbmcgb2YgdGhlIGJsb2NrIGxlbmd0aHMsIGxpdGVyYWwgaW5zZXJ0aW9uIGxlbmd0aHMgYW5kIGNvcHkgbGVuZ3Rocy5cbiovXG5cbi8qIFJlcHJlc2VudHMgdGhlIHJhbmdlIG9mIHZhbHVlcyBiZWxvbmdpbmcgdG8gYSBwcmVmaXggY29kZTogKi9cblxuLyogW29mZnNldCwgb2Zmc2V0ICsgMl5uYml0cykgKi9cbmZ1bmN0aW9uIFByZWZpeENvZGVSYW5nZShvZmZzZXQsIG5iaXRzKSB7XG4gIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICB0aGlzLm5iaXRzID0gbmJpdHM7XG59XG5cbnZhciBrQmxvY2tMZW5ndGhQcmVmaXhDb2RlID0gW25ldyBQcmVmaXhDb2RlUmFuZ2UoMSwgMiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNSwgMiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoOSwgMiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTMsIDIpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDE3LCAzKSwgbmV3IFByZWZpeENvZGVSYW5nZSgyNSwgMyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMzMsIDMpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDQxLCAzKSwgbmV3IFByZWZpeENvZGVSYW5nZSg0OSwgNCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNjUsIDQpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDgxLCA0KSwgbmV3IFByZWZpeENvZGVSYW5nZSg5NywgNCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTEzLCA1KSwgbmV3IFByZWZpeENvZGVSYW5nZSgxNDUsIDUpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDE3NywgNSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMjA5LCA1KSwgbmV3IFByZWZpeENvZGVSYW5nZSgyNDEsIDYpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDMwNSwgNiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMzY5LCA3KSwgbmV3IFByZWZpeENvZGVSYW5nZSg0OTcsIDgpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDc1MywgOSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTI2NSwgMTApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDIyODksIDExKSwgbmV3IFByZWZpeENvZGVSYW5nZSg0MzM3LCAxMiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoODQzMywgMTMpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDE2NjI1LCAyNCldO1xudmFyIGtJbnNlcnRMZW5ndGhQcmVmaXhDb2RlID0gW25ldyBQcmVmaXhDb2RlUmFuZ2UoMCwgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMSwgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMiwgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMywgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNCwgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNSwgMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNiwgMSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoOCwgMSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTAsIDIpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDE0LCAyKSwgbmV3IFByZWZpeENvZGVSYW5nZSgxOCwgMyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMjYsIDMpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDM0LCA0KSwgbmV3IFByZWZpeENvZGVSYW5nZSg1MCwgNCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNjYsIDUpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDk4LCA1KSwgbmV3IFByZWZpeENvZGVSYW5nZSgxMzAsIDYpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDE5NCwgNyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMzIyLCA4KSwgbmV3IFByZWZpeENvZGVSYW5nZSg1NzgsIDkpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDEwOTAsIDEwKSwgbmV3IFByZWZpeENvZGVSYW5nZSgyMTE0LCAxMiksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNjIxMCwgMTQpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDIyNTk0LCAyNCldO1xudmFyIGtDb3B5TGVuZ3RoUHJlZml4Q29kZSA9IFtuZXcgUHJlZml4Q29kZVJhbmdlKDIsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDMsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDQsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDUsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDYsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDcsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDgsIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDksIDApLCBuZXcgUHJlZml4Q29kZVJhbmdlKDEwLCAxKSwgbmV3IFByZWZpeENvZGVSYW5nZSgxMiwgMSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTQsIDIpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDE4LCAyKSwgbmV3IFByZWZpeENvZGVSYW5nZSgyMiwgMyksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMzAsIDMpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDM4LCA0KSwgbmV3IFByZWZpeENvZGVSYW5nZSg1NCwgNCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNzAsIDUpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDEwMiwgNSksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMTM0LCA2KSwgbmV3IFByZWZpeENvZGVSYW5nZSgxOTgsIDcpLCBuZXcgUHJlZml4Q29kZVJhbmdlKDMyNiwgOCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoNTgyLCA5KSwgbmV3IFByZWZpeENvZGVSYW5nZSgxMDk0LCAxMCksIG5ldyBQcmVmaXhDb2RlUmFuZ2UoMjExOCwgMjQpXTtcbnZhciBrSW5zZXJ0UmFuZ2VMdXQgPSBbMCwgMCwgOCwgOCwgMCwgMTYsIDgsIDE2LCAxNl07XG52YXIga0NvcHlSYW5nZUx1dCA9IFswLCA4LCAwLCA4LCAxNiwgMCwgMTYsIDgsIDE2XTtcbnZhciBwcmVmaXggPSB7XG4gIGtCbG9ja0xlbmd0aFByZWZpeENvZGU6IGtCbG9ja0xlbmd0aFByZWZpeENvZGUsXG4gIGtJbnNlcnRMZW5ndGhQcmVmaXhDb2RlOiBrSW5zZXJ0TGVuZ3RoUHJlZml4Q29kZSxcbiAga0NvcHlMZW5ndGhQcmVmaXhDb2RlOiBrQ29weUxlbmd0aFByZWZpeENvZGUsXG4gIGtJbnNlcnRSYW5nZUx1dDoga0luc2VydFJhbmdlTHV0LFxuICBrQ29weVJhbmdlTHV0OiBrQ29weVJhbmdlTHV0XG59O1xuXG4vKiBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXG4gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4gICBUcmFuc2Zvcm1hdGlvbnMgb24gZGljdGlvbmFyeSB3b3Jkcy5cbiovXG5cbnZhciBrSWRlbnRpdHkgPSAwO1xudmFyIGtPbWl0TGFzdDEgPSAxO1xudmFyIGtPbWl0TGFzdDIgPSAyO1xudmFyIGtPbWl0TGFzdDMgPSAzO1xudmFyIGtPbWl0TGFzdDQgPSA0O1xudmFyIGtPbWl0TGFzdDUgPSA1O1xudmFyIGtPbWl0TGFzdDYgPSA2O1xudmFyIGtPbWl0TGFzdDcgPSA3O1xudmFyIGtPbWl0TGFzdDggPSA4O1xudmFyIGtPbWl0TGFzdDkgPSA5O1xudmFyIGtVcHBlcmNhc2VGaXJzdCA9IDEwO1xudmFyIGtVcHBlcmNhc2VBbGwgPSAxMTtcbnZhciBrT21pdEZpcnN0MSA9IDEyO1xudmFyIGtPbWl0Rmlyc3QyID0gMTM7XG52YXIga09taXRGaXJzdDMgPSAxNDtcbnZhciBrT21pdEZpcnN0NCA9IDE1O1xudmFyIGtPbWl0Rmlyc3Q1ID0gMTY7XG52YXIga09taXRGaXJzdDYgPSAxNztcbnZhciBrT21pdEZpcnN0NyA9IDE4O1xudmFyIGtPbWl0Rmlyc3Q5ID0gMjA7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybSQyKHByZWZpeCwgdHJhbnNmb3JtLCBzdWZmaXgpIHtcbiAgdGhpcy5wcmVmaXggPSBuZXcgVWludDhBcnJheShwcmVmaXgubGVuZ3RoKTtcbiAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gIHRoaXMuc3VmZml4ID0gbmV3IFVpbnQ4QXJyYXkoc3VmZml4Lmxlbmd0aCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXgubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLnByZWZpeFtpXSA9IHByZWZpeC5jaGFyQ29kZUF0KGkpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWZmaXgubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLnN1ZmZpeFtpXSA9IHN1ZmZpeC5jaGFyQ29kZUF0KGkpO1xuICB9XG59XG5cbnZhciBrVHJhbnNmb3JtcyA9IFtuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtJZGVudGl0eSwgXCIgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRGaXJzdDEsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIHRoZSBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga0lkZW50aXR5LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwicyBcIiwga0lkZW50aXR5LCBcIiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIG9mIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIGFuZCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdEZpcnN0MiwgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdExhc3QxLCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiLCBcIiwga0lkZW50aXR5LCBcIiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiLCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUZpcnN0LCBcIiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIGluIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgdG8gXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJlIFwiLCBrSWRlbnRpdHksIFwiIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJcXFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIi5cIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiXFxcIj5cIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiXFxuXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRMYXN0MywgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiXVwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgZm9yIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0Rmlyc3QzLCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0TGFzdDIsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBhIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgdGhhdCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUZpcnN0LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIuIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiLlwiLCBrSWRlbnRpdHksIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtJZGVudGl0eSwgXCIsIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0Rmlyc3Q0LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgd2l0aCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiJ1wiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgZnJvbSBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIGJ5IFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0Rmlyc3Q1LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0Rmlyc3Q2LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIHRoZSBcIiwga0lkZW50aXR5LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0TGFzdDQsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIi4gVGhlIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBvbiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiIGFzIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgaXMgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga09taXRMYXN0NywgXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdExhc3QxLCBcImluZyBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwiXFxuXFx0XCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIjpcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga0lkZW50aXR5LCBcIi4gXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcImVkIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0Rmlyc3Q5LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0Rmlyc3Q3LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0TGFzdDYsIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIihcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiLCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdExhc3Q4LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIgYXQgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcImx5IFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIHRoZSBcIiwga0lkZW50aXR5LCBcIiBvZiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrT21pdExhc3Q1LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtPbWl0TGFzdDksIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCIsIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCJcXFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIuXCIsIGtJZGVudGl0eSwgXCIoXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCIgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUZpcnN0LCBcIlxcXCI+XCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIj1cXFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtJZGVudGl0eSwgXCIuXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIuY29tL1wiLCBrSWRlbnRpdHksIFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgdGhlIFwiLCBrSWRlbnRpdHksIFwiIG9mIHRoZSBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiJ1wiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCIuIFRoaXMgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIixcIiksIG5ldyBUcmFuc2Zvcm0kMihcIi5cIiwga0lkZW50aXR5LCBcIiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiKFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCIuXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIiBub3QgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtJZGVudGl0eSwgXCI9XFxcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJlciBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUFsbCwgXCIgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcImFsIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlQWxsLCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCI9J1wiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiXFxcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCIuIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrSWRlbnRpdHksIFwiKFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJmdWwgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCIuIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtJZGVudGl0eSwgXCJpdmUgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcImxlc3MgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCInXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcImVzdCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUZpcnN0LCBcIi5cIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIlxcXCI+XCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtJZGVudGl0eSwgXCI9J1wiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCIsXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga0lkZW50aXR5LCBcIml6ZSBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIi5cIiksIG5ldyBUcmFuc2Zvcm0kMihcIlxceGMyXFx4YTBcIiwga0lkZW50aXR5LCBcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrSWRlbnRpdHksIFwiLFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VGaXJzdCwgXCI9XFxcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiPVxcXCJcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrSWRlbnRpdHksIFwib3VzIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiXCIsIGtVcHBlcmNhc2VBbGwsIFwiLCBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlRmlyc3QsIFwiPSdcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUZpcnN0LCBcIixcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUFsbCwgXCI9XFxcIlwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlQWxsLCBcIiwgXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCIsXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCIoXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCJcIiwga1VwcGVyY2FzZUFsbCwgXCIuIFwiKSwgbmV3IFRyYW5zZm9ybSQyKFwiIFwiLCBrVXBwZXJjYXNlQWxsLCBcIi5cIiksIG5ldyBUcmFuc2Zvcm0kMihcIlwiLCBrVXBwZXJjYXNlQWxsLCBcIj0nXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VBbGwsIFwiLiBcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUZpcnN0LCBcIj1cXFwiXCIpLCBuZXcgVHJhbnNmb3JtJDIoXCIgXCIsIGtVcHBlcmNhc2VBbGwsIFwiPSdcIiksIG5ldyBUcmFuc2Zvcm0kMihcIiBcIiwga1VwcGVyY2FzZUZpcnN0LCBcIj0nXCIpXTtcbnZhciBrVHJhbnNmb3Jtc18xID0ga1RyYW5zZm9ybXM7XG52YXIga051bVRyYW5zZm9ybXMgPSBrVHJhbnNmb3Jtcy5sZW5ndGg7XG5cbmZ1bmN0aW9uIFRvVXBwZXJDYXNlKHAsIGkpIHtcbiAgaWYgKHBbaV0gPCAweGMwKSB7XG4gICAgaWYgKHBbaV0gPj0gOTcgJiYgcFtpXSA8PSAxMjIpIHtcbiAgICAgIHBbaV0gXj0gMzI7XG4gICAgfVxuXG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgLyogQW4gb3Zlcmx5IHNpbXBsaWZpZWQgdXBwZXJjYXNpbmcgbW9kZWwgZm9yIHV0Zi04LiAqL1xuXG5cbiAgaWYgKHBbaV0gPCAweGUwKSB7XG4gICAgcFtpICsgMV0gXj0gMzI7XG4gICAgcmV0dXJuIDI7XG4gIH1cbiAgLyogQW4gYXJiaXRyYXJ5IHRyYW5zZm9ybSBmb3IgdGhyZWUgYnl0ZSBjaGFyYWN0ZXJzLiAqL1xuXG5cbiAgcFtpICsgMl0gXj0gNTtcbiAgcmV0dXJuIDM7XG59XG5cbnZhciB0cmFuc2Zvcm1EaWN0aW9uYXJ5V29yZCA9IGZ1bmN0aW9uIHRyYW5zZm9ybURpY3Rpb25hcnlXb3JkKGRzdCwgaWR4LCB3b3JkLCBsZW4sIHRyYW5zZm9ybSkge1xuICB2YXIgcHJlZml4ID0ga1RyYW5zZm9ybXNbdHJhbnNmb3JtXS5wcmVmaXg7XG4gIHZhciBzdWZmaXggPSBrVHJhbnNmb3Jtc1t0cmFuc2Zvcm1dLnN1ZmZpeDtcbiAgdmFyIHQgPSBrVHJhbnNmb3Jtc1t0cmFuc2Zvcm1dLnRyYW5zZm9ybTtcbiAgdmFyIHNraXAgPSB0IDwga09taXRGaXJzdDEgPyAwIDogdCAtIChrT21pdEZpcnN0MSAtIDEpO1xuICB2YXIgaSA9IDA7XG4gIHZhciBzdGFydF9pZHggPSBpZHg7XG4gIHZhciB1cHBlcmNhc2U7XG5cbiAgaWYgKHNraXAgPiBsZW4pIHtcbiAgICBza2lwID0gbGVuO1xuICB9XG5cbiAgdmFyIHByZWZpeF9wb3MgPSAwO1xuXG4gIHdoaWxlIChwcmVmaXhfcG9zIDwgcHJlZml4Lmxlbmd0aCkge1xuICAgIGRzdFtpZHgrK10gPSBwcmVmaXhbcHJlZml4X3BvcysrXTtcbiAgfVxuXG4gIHdvcmQgKz0gc2tpcDtcbiAgbGVuIC09IHNraXA7XG5cbiAgaWYgKHQgPD0ga09taXRMYXN0OSkge1xuICAgIGxlbiAtPSB0O1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgZHN0W2lkeCsrXSA9IGRpY3Rpb25hcnkuZGljdGlvbmFyeVt3b3JkICsgaV07XG4gIH1cblxuICB1cHBlcmNhc2UgPSBpZHggLSBsZW47XG5cbiAgaWYgKHQgPT09IGtVcHBlcmNhc2VGaXJzdCkge1xuICAgIFRvVXBwZXJDYXNlKGRzdCwgdXBwZXJjYXNlKTtcbiAgfSBlbHNlIGlmICh0ID09PSBrVXBwZXJjYXNlQWxsKSB7XG4gICAgd2hpbGUgKGxlbiA+IDApIHtcbiAgICAgIHZhciBzdGVwID0gVG9VcHBlckNhc2UoZHN0LCB1cHBlcmNhc2UpO1xuICAgICAgdXBwZXJjYXNlICs9IHN0ZXA7XG4gICAgICBsZW4gLT0gc3RlcDtcbiAgICB9XG4gIH1cblxuICB2YXIgc3VmZml4X3BvcyA9IDA7XG5cbiAgd2hpbGUgKHN1ZmZpeF9wb3MgPCBzdWZmaXgubGVuZ3RoKSB7XG4gICAgZHN0W2lkeCsrXSA9IHN1ZmZpeFtzdWZmaXhfcG9zKytdO1xuICB9XG5cbiAgcmV0dXJuIGlkeCAtIHN0YXJ0X2lkeDtcbn07XG5cbnZhciB0cmFuc2Zvcm0gPSB7XG4gIGtUcmFuc2Zvcm1zOiBrVHJhbnNmb3Jtc18xLFxuICBrTnVtVHJhbnNmb3Jtczoga051bVRyYW5zZm9ybXMsXG4gIHRyYW5zZm9ybURpY3Rpb25hcnlXb3JkOiB0cmFuc2Zvcm1EaWN0aW9uYXJ5V29yZFxufTtcblxuLyogQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblxuICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbnZhciBCcm90bGlJbnB1dCQxID0gc3RyZWFtcyQxLkJyb3RsaUlucHV0O1xudmFyIEJyb3RsaU91dHB1dCQxID0gc3RyZWFtcyQxLkJyb3RsaU91dHB1dDtcbnZhciBIdWZmbWFuQ29kZSQxID0gaHVmZm1hbi5IdWZmbWFuQ29kZTtcbnZhciBCcm90bGlCdWlsZEh1ZmZtYW5UYWJsZSQxID0gaHVmZm1hbi5Ccm90bGlCdWlsZEh1ZmZtYW5UYWJsZTtcbnZhciBrRGVmYXVsdENvZGVMZW5ndGggPSA4O1xudmFyIGtDb2RlTGVuZ3RoUmVwZWF0Q29kZSA9IDE2O1xudmFyIGtOdW1MaXRlcmFsQ29kZXMgPSAyNTY7XG52YXIga051bUluc2VydEFuZENvcHlDb2RlcyA9IDcwNDtcbnZhciBrTnVtQmxvY2tMZW5ndGhDb2RlcyA9IDI2O1xudmFyIGtMaXRlcmFsQ29udGV4dEJpdHMgPSA2O1xudmFyIGtEaXN0YW5jZUNvbnRleHRCaXRzID0gMjtcbnZhciBIVUZGTUFOX1RBQkxFX0JJVFMgPSA4O1xudmFyIEhVRkZNQU5fVEFCTEVfTUFTSyA9IDB4ZmY7XG4vKiBNYXhpbXVtIHBvc3NpYmxlIEh1ZmZtYW4gdGFibGUgc2l6ZSBmb3IgYW4gYWxwaGFiZXQgc2l6ZSBvZiA3MDQsIG1heCBjb2RlXG4gKiBsZW5ndGggMTUgYW5kIHJvb3QgdGFibGUgYml0cyA4LiAqL1xuXG52YXIgSFVGRk1BTl9NQVhfVEFCTEVfU0laRSA9IDEwODA7XG52YXIgQ09ERV9MRU5HVEhfQ09ERVMgPSAxODtcbnZhciBrQ29kZUxlbmd0aENvZGVPcmRlciA9IG5ldyBVaW50OEFycmF5KFsxLCAyLCAzLCA0LCAwLCA1LCAxNywgNiwgMTYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTVdKTtcbnZhciBOVU1fRElTVEFOQ0VfU0hPUlRfQ09ERVMgPSAxNjtcbnZhciBrRGlzdGFuY2VTaG9ydENvZGVJbmRleE9mZnNldCA9IG5ldyBVaW50OEFycmF5KFszLCAyLCAxLCAwLCAzLCAzLCAzLCAzLCAzLCAzLCAyLCAyLCAyLCAyLCAyLCAyXSk7XG52YXIga0Rpc3RhbmNlU2hvcnRDb2RlVmFsdWVPZmZzZXQgPSBuZXcgSW50OEFycmF5KFswLCAwLCAwLCAwLCAtMSwgMSwgLTIsIDIsIC0zLCAzLCAtMSwgMSwgLTIsIDIsIC0zLCAzXSk7XG52YXIga01heEh1ZmZtYW5UYWJsZVNpemUgPSBuZXcgVWludDE2QXJyYXkoWzI1NiwgNDAyLCA0MzYsIDQ2OCwgNTAwLCA1MzQsIDU2NiwgNTk4LCA2MzAsIDY2MiwgNjk0LCA3MjYsIDc1OCwgNzkwLCA4MjIsIDg1NCwgODg2LCA5MjAsIDk1MiwgOTg0LCAxMDE2LCAxMDQ4LCAxMDgwXSk7XG5cbmZ1bmN0aW9uIERlY29kZVdpbmRvd0JpdHMoYnIpIHtcbiAgdmFyIG47XG5cbiAgaWYgKGJyLnJlYWRCaXRzKDEpID09PSAwKSB7XG4gICAgcmV0dXJuIDE2O1xuICB9XG5cbiAgbiA9IGJyLnJlYWRCaXRzKDMpO1xuXG4gIGlmIChuID4gMCkge1xuICAgIHJldHVybiAxNyArIG47XG4gIH1cblxuICBuID0gYnIucmVhZEJpdHMoMyk7XG5cbiAgaWYgKG4gPiAwKSB7XG4gICAgcmV0dXJuIDggKyBuO1xuICB9XG5cbiAgcmV0dXJuIDE3O1xufVxuLyogRGVjb2RlcyBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAuLjI1NV0sIGJ5IHJlYWRpbmcgMSAtIDExIGJpdHMuICovXG5cblxuZnVuY3Rpb24gRGVjb2RlVmFyTGVuVWludDgoYnIpIHtcbiAgaWYgKGJyLnJlYWRCaXRzKDEpKSB7XG4gICAgdmFyIG5iaXRzID0gYnIucmVhZEJpdHMoMyk7XG5cbiAgICBpZiAobmJpdHMgPT09IDApIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnIucmVhZEJpdHMobmJpdHMpICsgKDEgPDwgbmJpdHMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBNZXRhQmxvY2tMZW5ndGgoKSB7XG4gIHRoaXMubWV0YV9ibG9ja19sZW5ndGggPSAwO1xuICB0aGlzLmlucHV0X2VuZCA9IDA7XG4gIHRoaXMuaXNfdW5jb21wcmVzc2VkID0gMDtcbiAgdGhpcy5pc19tZXRhZGF0YSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBEZWNvZGVNZXRhQmxvY2tMZW5ndGgoYnIpIHtcbiAgdmFyIG91dCA9IG5ldyBNZXRhQmxvY2tMZW5ndGgoKTtcbiAgdmFyIHNpemVfbmliYmxlcztcbiAgdmFyIHNpemVfYnl0ZXM7XG4gIHZhciBpO1xuICBvdXQuaW5wdXRfZW5kID0gYnIucmVhZEJpdHMoMSk7XG5cbiAgaWYgKG91dC5pbnB1dF9lbmQgJiYgYnIucmVhZEJpdHMoMSkpIHtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgc2l6ZV9uaWJibGVzID0gYnIucmVhZEJpdHMoMikgKyA0O1xuXG4gIGlmIChzaXplX25pYmJsZXMgPT09IDcpIHtcbiAgICBvdXQuaXNfbWV0YWRhdGEgPSB0cnVlO1xuICAgIGlmIChici5yZWFkQml0cygxKSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlc2VydmVkIGJpdCcpO1xuICAgIHNpemVfYnl0ZXMgPSBici5yZWFkQml0cygyKTtcbiAgICBpZiAoc2l6ZV9ieXRlcyA9PT0gMCkgcmV0dXJuIG91dDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX2J5dGVzOyBpKyspIHtcbiAgICAgIHZhciBuZXh0X2J5dGUgPSBici5yZWFkQml0cyg4KTtcbiAgICAgIGlmIChpICsgMSA9PT0gc2l6ZV9ieXRlcyAmJiBzaXplX2J5dGVzID4gMSAmJiBuZXh0X2J5dGUgPT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaXplIGJ5dGUnKTtcbiAgICAgIG91dC5tZXRhX2Jsb2NrX2xlbmd0aCB8PSBuZXh0X2J5dGUgPDwgaSAqIDg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX25pYmJsZXM7ICsraSkge1xuICAgICAgdmFyIG5leHRfbmliYmxlID0gYnIucmVhZEJpdHMoNCk7XG4gICAgICBpZiAoaSArIDEgPT09IHNpemVfbmliYmxlcyAmJiBzaXplX25pYmJsZXMgPiA0ICYmIG5leHRfbmliYmxlID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2l6ZSBuaWJibGUnKTtcbiAgICAgIG91dC5tZXRhX2Jsb2NrX2xlbmd0aCB8PSBuZXh0X25pYmJsZSA8PCBpICogNDtcbiAgICB9XG4gIH1cblxuICArK291dC5tZXRhX2Jsb2NrX2xlbmd0aDtcblxuICBpZiAoIW91dC5pbnB1dF9lbmQgJiYgIW91dC5pc19tZXRhZGF0YSkge1xuICAgIG91dC5pc191bmNvbXByZXNzZWQgPSBici5yZWFkQml0cygxKTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKiBEZWNvZGVzIHRoZSBuZXh0IEh1ZmZtYW4gY29kZSBmcm9tIGJpdC1zdHJlYW0uICovXG5cblxuZnVuY3Rpb24gUmVhZFN5bWJvbCh0YWJsZSwgaW5kZXgsIGJyKSB7XG4gIHZhciBuYml0cztcbiAgYnIuZmlsbEJpdFdpbmRvdygpO1xuICBpbmRleCArPSBici52YWxfID4+PiBici5iaXRfcG9zXyAmIEhVRkZNQU5fVEFCTEVfTUFTSztcbiAgbmJpdHMgPSB0YWJsZVtpbmRleF0uYml0cyAtIEhVRkZNQU5fVEFCTEVfQklUUztcblxuICBpZiAobmJpdHMgPiAwKSB7XG4gICAgYnIuYml0X3Bvc18gKz0gSFVGRk1BTl9UQUJMRV9CSVRTO1xuICAgIGluZGV4ICs9IHRhYmxlW2luZGV4XS52YWx1ZTtcbiAgICBpbmRleCArPSBici52YWxfID4+PiBici5iaXRfcG9zXyAmICgxIDw8IG5iaXRzKSAtIDE7XG4gIH1cblxuICBici5iaXRfcG9zXyArPSB0YWJsZVtpbmRleF0uYml0cztcbiAgcmV0dXJuIHRhYmxlW2luZGV4XS52YWx1ZTtcbn1cblxuZnVuY3Rpb24gUmVhZEh1ZmZtYW5Db2RlTGVuZ3Rocyhjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHMsIG51bV9zeW1ib2xzLCBjb2RlX2xlbmd0aHMsIGJyKSB7XG4gIHZhciBzeW1ib2wgPSAwO1xuICB2YXIgcHJldl9jb2RlX2xlbiA9IGtEZWZhdWx0Q29kZUxlbmd0aDtcbiAgdmFyIHJlcGVhdCA9IDA7XG4gIHZhciByZXBlYXRfY29kZV9sZW4gPSAwO1xuICB2YXIgc3BhY2UgPSAzMjc2ODtcbiAgdmFyIHRhYmxlID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgaSsrKSB7XG4gICAgdGFibGUucHVzaChuZXcgSHVmZm1hbkNvZGUkMSgwLCAwKSk7XG4gIH1cblxuICBCcm90bGlCdWlsZEh1ZmZtYW5UYWJsZSQxKHRhYmxlLCAwLCA1LCBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHMsIENPREVfTEVOR1RIX0NPREVTKTtcblxuICB3aGlsZSAoc3ltYm9sIDwgbnVtX3N5bWJvbHMgJiYgc3BhY2UgPiAwKSB7XG4gICAgdmFyIHAgPSAwO1xuICAgIHZhciBjb2RlX2xlbjtcbiAgICBici5yZWFkTW9yZUlucHV0KCk7XG4gICAgYnIuZmlsbEJpdFdpbmRvdygpO1xuICAgIHAgKz0gYnIudmFsXyA+Pj4gYnIuYml0X3Bvc18gJiAzMTtcbiAgICBici5iaXRfcG9zXyArPSB0YWJsZVtwXS5iaXRzO1xuICAgIGNvZGVfbGVuID0gdGFibGVbcF0udmFsdWUgJiAweGZmO1xuXG4gICAgaWYgKGNvZGVfbGVuIDwga0NvZGVMZW5ndGhSZXBlYXRDb2RlKSB7XG4gICAgICByZXBlYXQgPSAwO1xuICAgICAgY29kZV9sZW5ndGhzW3N5bWJvbCsrXSA9IGNvZGVfbGVuO1xuXG4gICAgICBpZiAoY29kZV9sZW4gIT09IDApIHtcbiAgICAgICAgcHJldl9jb2RlX2xlbiA9IGNvZGVfbGVuO1xuICAgICAgICBzcGFjZSAtPSAzMjc2OCA+PiBjb2RlX2xlbjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGV4dHJhX2JpdHMgPSBjb2RlX2xlbiAtIDE0O1xuICAgICAgdmFyIG9sZF9yZXBlYXQ7XG4gICAgICB2YXIgcmVwZWF0X2RlbHRhO1xuICAgICAgdmFyIG5ld19sZW4gPSAwO1xuXG4gICAgICBpZiAoY29kZV9sZW4gPT09IGtDb2RlTGVuZ3RoUmVwZWF0Q29kZSkge1xuICAgICAgICBuZXdfbGVuID0gcHJldl9jb2RlX2xlbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcGVhdF9jb2RlX2xlbiAhPT0gbmV3X2xlbikge1xuICAgICAgICByZXBlYXQgPSAwO1xuICAgICAgICByZXBlYXRfY29kZV9sZW4gPSBuZXdfbGVuO1xuICAgICAgfVxuXG4gICAgICBvbGRfcmVwZWF0ID0gcmVwZWF0O1xuXG4gICAgICBpZiAocmVwZWF0ID4gMCkge1xuICAgICAgICByZXBlYXQgLT0gMjtcbiAgICAgICAgcmVwZWF0IDw8PSBleHRyYV9iaXRzO1xuICAgICAgfVxuXG4gICAgICByZXBlYXQgKz0gYnIucmVhZEJpdHMoZXh0cmFfYml0cykgKyAzO1xuICAgICAgcmVwZWF0X2RlbHRhID0gcmVwZWF0IC0gb2xkX3JlcGVhdDtcblxuICAgICAgaWYgKHN5bWJvbCArIHJlcGVhdF9kZWx0YSA+IG51bV9zeW1ib2xzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignW1JlYWRIdWZmbWFuQ29kZUxlbmd0aHNdIHN5bWJvbCArIHJlcGVhdF9kZWx0YSA+IG51bV9zeW1ib2xzJyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgcmVwZWF0X2RlbHRhOyB4KyspIHtcbiAgICAgICAgY29kZV9sZW5ndGhzW3N5bWJvbCArIHhdID0gcmVwZWF0X2NvZGVfbGVuO1xuICAgICAgfVxuXG4gICAgICBzeW1ib2wgKz0gcmVwZWF0X2RlbHRhO1xuXG4gICAgICBpZiAocmVwZWF0X2NvZGVfbGVuICE9PSAwKSB7XG4gICAgICAgIHNwYWNlIC09IHJlcGVhdF9kZWx0YSA8PCAxNSAtIHJlcGVhdF9jb2RlX2xlbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3BhY2UgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJbUmVhZEh1ZmZtYW5Db2RlTGVuZ3Roc10gc3BhY2UgPSBcIiArIHNwYWNlKTtcbiAgfVxuXG4gIGZvciAoOyBzeW1ib2wgPCBudW1fc3ltYm9sczsgc3ltYm9sKyspIHtcbiAgICBjb2RlX2xlbmd0aHNbc3ltYm9sXSA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZEh1ZmZtYW5Db2RlKGFscGhhYmV0X3NpemUsIHRhYmxlcywgdGFibGUsIGJyKSB7XG4gIHZhciB0YWJsZV9zaXplID0gMDtcbiAgdmFyIHNpbXBsZV9jb2RlX29yX3NraXA7XG4gIHZhciBjb2RlX2xlbmd0aHMgPSBuZXcgVWludDhBcnJheShhbHBoYWJldF9zaXplKTtcbiAgYnIucmVhZE1vcmVJbnB1dCgpO1xuICAvKiBzaW1wbGVfY29kZV9vcl9za2lwIGlzIHVzZWQgYXMgZm9sbG93czpcbiAgICAgMSBmb3Igc2ltcGxlIGNvZGU7XG4gICAgIDAgZm9yIG5vIHNraXBwaW5nLCAyIHNraXBzIDIgY29kZSBsZW5ndGhzLCAzIHNraXBzIDMgY29kZSBsZW5ndGhzICovXG5cbiAgc2ltcGxlX2NvZGVfb3Jfc2tpcCA9IGJyLnJlYWRCaXRzKDIpO1xuXG4gIGlmIChzaW1wbGVfY29kZV9vcl9za2lwID09PSAxKSB7XG4gICAgLyogUmVhZCBzeW1ib2xzLCBjb2RlcyAmIGNvZGUgbGVuZ3RocyBkaXJlY3RseS4gKi9cbiAgICB2YXIgaTtcbiAgICB2YXIgbWF4X2JpdHNfY291bnRlciA9IGFscGhhYmV0X3NpemUgLSAxO1xuICAgIHZhciBtYXhfYml0cyA9IDA7XG4gICAgdmFyIHN5bWJvbHMgPSBuZXcgSW50MzJBcnJheSg0KTtcbiAgICB2YXIgbnVtX3N5bWJvbHMgPSBici5yZWFkQml0cygyKSArIDE7XG5cbiAgICB3aGlsZSAobWF4X2JpdHNfY291bnRlcikge1xuICAgICAgbWF4X2JpdHNfY291bnRlciA+Pj0gMTtcbiAgICAgICsrbWF4X2JpdHM7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1ib2xzOyArK2kpIHtcbiAgICAgIHN5bWJvbHNbaV0gPSBici5yZWFkQml0cyhtYXhfYml0cykgJSBhbHBoYWJldF9zaXplO1xuICAgICAgY29kZV9sZW5ndGhzW3N5bWJvbHNbaV1dID0gMjtcbiAgICB9XG5cbiAgICBjb2RlX2xlbmd0aHNbc3ltYm9sc1swXV0gPSAxO1xuXG4gICAgc3dpdGNoIChudW1fc3ltYm9scykge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAzOlxuICAgICAgICBpZiAoc3ltYm9sc1swXSA9PT0gc3ltYm9sc1sxXSB8fCBzeW1ib2xzWzBdID09PSBzeW1ib2xzWzJdIHx8IHN5bWJvbHNbMV0gPT09IHN5bWJvbHNbMl0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWFkSHVmZm1hbkNvZGVdIGludmFsaWQgc3ltYm9scycpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaWYgKHN5bWJvbHNbMF0gPT09IHN5bWJvbHNbMV0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWFkSHVmZm1hbkNvZGVdIGludmFsaWQgc3ltYm9scycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29kZV9sZW5ndGhzW3N5bWJvbHNbMV1dID0gMTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAgaWYgKHN5bWJvbHNbMF0gPT09IHN5bWJvbHNbMV0gfHwgc3ltYm9sc1swXSA9PT0gc3ltYm9sc1syXSB8fCBzeW1ib2xzWzBdID09PSBzeW1ib2xzWzNdIHx8IHN5bWJvbHNbMV0gPT09IHN5bWJvbHNbMl0gfHwgc3ltYm9sc1sxXSA9PT0gc3ltYm9sc1szXSB8fCBzeW1ib2xzWzJdID09PSBzeW1ib2xzWzNdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVhZEh1ZmZtYW5Db2RlXSBpbnZhbGlkIHN5bWJvbHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChici5yZWFkQml0cygxKSkge1xuICAgICAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2xzWzJdXSA9IDM7XG4gICAgICAgICAgY29kZV9sZW5ndGhzW3N5bWJvbHNbM11dID0gMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2RlX2xlbmd0aHNbc3ltYm9sc1swXV0gPSAyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8qIERlY29kZSBIdWZmbWFuLWNvZGVkIGNvZGUgbGVuZ3Rocy4gKi9cbiAgICB2YXIgaTtcbiAgICB2YXIgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoQ09ERV9MRU5HVEhfQ09ERVMpO1xuICAgIHZhciBzcGFjZSA9IDMyO1xuICAgIHZhciBudW1fY29kZXMgPSAwO1xuICAgIC8qIFN0YXRpYyBIdWZmbWFuIGNvZGUgZm9yIHRoZSBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cblxuICAgIHZhciBodWZmID0gW25ldyBIdWZmbWFuQ29kZSQxKDIsIDApLCBuZXcgSHVmZm1hbkNvZGUkMSgyLCA0KSwgbmV3IEh1ZmZtYW5Db2RlJDEoMiwgMyksIG5ldyBIdWZmbWFuQ29kZSQxKDMsIDIpLCBuZXcgSHVmZm1hbkNvZGUkMSgyLCAwKSwgbmV3IEh1ZmZtYW5Db2RlJDEoMiwgNCksIG5ldyBIdWZmbWFuQ29kZSQxKDIsIDMpLCBuZXcgSHVmZm1hbkNvZGUkMSg0LCAxKSwgbmV3IEh1ZmZtYW5Db2RlJDEoMiwgMCksIG5ldyBIdWZmbWFuQ29kZSQxKDIsIDQpLCBuZXcgSHVmZm1hbkNvZGUkMSgyLCAzKSwgbmV3IEh1ZmZtYW5Db2RlJDEoMywgMiksIG5ldyBIdWZmbWFuQ29kZSQxKDIsIDApLCBuZXcgSHVmZm1hbkNvZGUkMSgyLCA0KSwgbmV3IEh1ZmZtYW5Db2RlJDEoMiwgMyksIG5ldyBIdWZmbWFuQ29kZSQxKDQsIDUpXTtcblxuICAgIGZvciAoaSA9IHNpbXBsZV9jb2RlX29yX3NraXA7IGkgPCBDT0RFX0xFTkdUSF9DT0RFUyAmJiBzcGFjZSA+IDA7ICsraSkge1xuICAgICAgdmFyIGNvZGVfbGVuX2lkeCA9IGtDb2RlTGVuZ3RoQ29kZU9yZGVyW2ldO1xuICAgICAgdmFyIHAgPSAwO1xuICAgICAgdmFyIHY7XG4gICAgICBici5maWxsQml0V2luZG93KCk7XG4gICAgICBwICs9IGJyLnZhbF8gPj4+IGJyLmJpdF9wb3NfICYgMTU7XG4gICAgICBici5iaXRfcG9zXyArPSBodWZmW3BdLmJpdHM7XG4gICAgICB2ID0gaHVmZltwXS52YWx1ZTtcbiAgICAgIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3Roc1tjb2RlX2xlbl9pZHhdID0gdjtcblxuICAgICAgaWYgKHYgIT09IDApIHtcbiAgICAgICAgc3BhY2UgLT0gMzIgPj4gdjtcbiAgICAgICAgKytudW1fY29kZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCEobnVtX2NvZGVzID09PSAxIHx8IHNwYWNlID09PSAwKSkgdGhyb3cgbmV3IEVycm9yKCdbUmVhZEh1ZmZtYW5Db2RlXSBpbnZhbGlkIG51bV9jb2RlcyBvciBzcGFjZScpO1xuICAgIFJlYWRIdWZmbWFuQ29kZUxlbmd0aHMoY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzLCBhbHBoYWJldF9zaXplLCBjb2RlX2xlbmd0aHMsIGJyKTtcbiAgfVxuXG4gIHRhYmxlX3NpemUgPSBCcm90bGlCdWlsZEh1ZmZtYW5UYWJsZSQxKHRhYmxlcywgdGFibGUsIEhVRkZNQU5fVEFCTEVfQklUUywgY29kZV9sZW5ndGhzLCBhbHBoYWJldF9zaXplKTtcblxuICBpZiAodGFibGVfc2l6ZSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIltSZWFkSHVmZm1hbkNvZGVdIEJ1aWxkSHVmZm1hblRhYmxlIGZhaWxlZDogXCIpO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlX3NpemU7XG59XG5cbmZ1bmN0aW9uIFJlYWRCbG9ja0xlbmd0aCh0YWJsZSwgaW5kZXgsIGJyKSB7XG4gIHZhciBjb2RlO1xuICB2YXIgbmJpdHM7XG4gIGNvZGUgPSBSZWFkU3ltYm9sKHRhYmxlLCBpbmRleCwgYnIpO1xuICBuYml0cyA9IHByZWZpeC5rQmxvY2tMZW5ndGhQcmVmaXhDb2RlW2NvZGVdLm5iaXRzO1xuICByZXR1cm4gcHJlZml4LmtCbG9ja0xlbmd0aFByZWZpeENvZGVbY29kZV0ub2Zmc2V0ICsgYnIucmVhZEJpdHMobmJpdHMpO1xufVxuXG5mdW5jdGlvbiBUcmFuc2xhdGVTaG9ydENvZGVzKGNvZGUsIHJpbmdidWZmZXIsIGluZGV4KSB7XG4gIHZhciB2YWw7XG5cbiAgaWYgKGNvZGUgPCBOVU1fRElTVEFOQ0VfU0hPUlRfQ09ERVMpIHtcbiAgICBpbmRleCArPSBrRGlzdGFuY2VTaG9ydENvZGVJbmRleE9mZnNldFtjb2RlXTtcbiAgICBpbmRleCAmPSAzO1xuICAgIHZhbCA9IHJpbmdidWZmZXJbaW5kZXhdICsga0Rpc3RhbmNlU2hvcnRDb2RlVmFsdWVPZmZzZXRbY29kZV07XG4gIH0gZWxzZSB7XG4gICAgdmFsID0gY29kZSAtIE5VTV9ESVNUQU5DRV9TSE9SVF9DT0RFUyArIDE7XG4gIH1cblxuICByZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBNb3ZlVG9Gcm9udCh2LCBpbmRleCkge1xuICB2YXIgdmFsdWUgPSB2W2luZGV4XTtcbiAgdmFyIGkgPSBpbmRleDtcblxuICBmb3IgKDsgaTsgLS1pKSB7XG4gICAgdltpXSA9IHZbaSAtIDFdO1xuICB9XG5cbiAgdlswXSA9IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBJbnZlcnNlTW92ZVRvRnJvbnRUcmFuc2Zvcm0odiwgdl9sZW4pIHtcbiAgdmFyIG10ZiA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG4gIHZhciBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgIG10ZltpXSA9IGk7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgdl9sZW47ICsraSkge1xuICAgIHZhciBpbmRleCA9IHZbaV07XG4gICAgdltpXSA9IG10ZltpbmRleF07XG4gICAgaWYgKGluZGV4KSBNb3ZlVG9Gcm9udChtdGYsIGluZGV4KTtcbiAgfVxufVxuLyogQ29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIGh1ZmZtYW4gdHJlZXMgd2l0aCB0aGUgc2FtZSBhbHBoYWJldCBzaXplLiAqL1xuXG5cbmZ1bmN0aW9uIEh1ZmZtYW5UcmVlR3JvdXAoYWxwaGFiZXRfc2l6ZSwgbnVtX2h0cmVlcykge1xuICB0aGlzLmFscGhhYmV0X3NpemUgPSBhbHBoYWJldF9zaXplO1xuICB0aGlzLm51bV9odHJlZXMgPSBudW1faHRyZWVzO1xuICB0aGlzLmNvZGVzID0gbmV3IEFycmF5KG51bV9odHJlZXMgKyBudW1faHRyZWVzICoga01heEh1ZmZtYW5UYWJsZVNpemVbYWxwaGFiZXRfc2l6ZSArIDMxID4+PiA1XSk7XG4gIHRoaXMuaHRyZWVzID0gbmV3IFVpbnQzMkFycmF5KG51bV9odHJlZXMpO1xufVxuXG5IdWZmbWFuVHJlZUdyb3VwLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbiAoYnIpIHtcbiAgdmFyIGk7XG4gIHZhciB0YWJsZV9zaXplO1xuICB2YXIgbmV4dCA9IDA7XG5cbiAgZm9yIChpID0gMDsgaSA8IHRoaXMubnVtX2h0cmVlczsgKytpKSB7XG4gICAgdGhpcy5odHJlZXNbaV0gPSBuZXh0O1xuICAgIHRhYmxlX3NpemUgPSBSZWFkSHVmZm1hbkNvZGUodGhpcy5hbHBoYWJldF9zaXplLCB0aGlzLmNvZGVzLCBuZXh0LCBicik7XG4gICAgbmV4dCArPSB0YWJsZV9zaXplO1xuICB9XG59O1xuXG5mdW5jdGlvbiBEZWNvZGVDb250ZXh0TWFwKGNvbnRleHRfbWFwX3NpemUsIGJyKSB7XG4gIHZhciBvdXQgPSB7XG4gICAgbnVtX2h0cmVlczogbnVsbCxcbiAgICBjb250ZXh0X21hcDogbnVsbFxuICB9O1xuICB2YXIgdXNlX3JsZV9mb3JfemVyb3M7XG4gIHZhciBtYXhfcnVuX2xlbmd0aF9wcmVmaXggPSAwO1xuICB2YXIgdGFibGU7XG4gIHZhciBpO1xuICBici5yZWFkTW9yZUlucHV0KCk7XG4gIHZhciBudW1faHRyZWVzID0gb3V0Lm51bV9odHJlZXMgPSBEZWNvZGVWYXJMZW5VaW50OChicikgKyAxO1xuICB2YXIgY29udGV4dF9tYXAgPSBvdXQuY29udGV4dF9tYXAgPSBuZXcgVWludDhBcnJheShjb250ZXh0X21hcF9zaXplKTtcblxuICBpZiAobnVtX2h0cmVlcyA8PSAxKSB7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHVzZV9ybGVfZm9yX3plcm9zID0gYnIucmVhZEJpdHMoMSk7XG5cbiAgaWYgKHVzZV9ybGVfZm9yX3plcm9zKSB7XG4gICAgbWF4X3J1bl9sZW5ndGhfcHJlZml4ID0gYnIucmVhZEJpdHMoNCkgKyAxO1xuICB9XG5cbiAgdGFibGUgPSBbXTtcblxuICBmb3IgKGkgPSAwOyBpIDwgSFVGRk1BTl9NQVhfVEFCTEVfU0laRTsgaSsrKSB7XG4gICAgdGFibGVbaV0gPSBuZXcgSHVmZm1hbkNvZGUkMSgwLCAwKTtcbiAgfVxuXG4gIFJlYWRIdWZmbWFuQ29kZShudW1faHRyZWVzICsgbWF4X3J1bl9sZW5ndGhfcHJlZml4LCB0YWJsZSwgMCwgYnIpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBjb250ZXh0X21hcF9zaXplOykge1xuICAgIHZhciBjb2RlO1xuICAgIGJyLnJlYWRNb3JlSW5wdXQoKTtcbiAgICBjb2RlID0gUmVhZFN5bWJvbCh0YWJsZSwgMCwgYnIpO1xuXG4gICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgIGNvbnRleHRfbWFwW2ldID0gMDtcbiAgICAgICsraTtcbiAgICB9IGVsc2UgaWYgKGNvZGUgPD0gbWF4X3J1bl9sZW5ndGhfcHJlZml4KSB7XG4gICAgICB2YXIgcmVwcyA9IDEgKyAoMSA8PCBjb2RlKSArIGJyLnJlYWRCaXRzKGNvZGUpO1xuXG4gICAgICB3aGlsZSAoLS1yZXBzKSB7XG4gICAgICAgIGlmIChpID49IGNvbnRleHRfbWFwX3NpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbRGVjb2RlQ29udGV4dE1hcF0gaSA+PSBjb250ZXh0X21hcF9zaXplXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dF9tYXBbaV0gPSAwO1xuICAgICAgICArK2k7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHRfbWFwW2ldID0gY29kZSAtIG1heF9ydW5fbGVuZ3RoX3ByZWZpeDtcbiAgICAgICsraTtcbiAgICB9XG4gIH1cblxuICBpZiAoYnIucmVhZEJpdHMoMSkpIHtcbiAgICBJbnZlcnNlTW92ZVRvRnJvbnRUcmFuc2Zvcm0oY29udGV4dF9tYXAsIGNvbnRleHRfbWFwX3NpemUpO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gRGVjb2RlQmxvY2tUeXBlKG1heF9ibG9ja190eXBlLCB0cmVlcywgdHJlZV90eXBlLCBibG9ja190eXBlcywgcmluZ2J1ZmZlcnMsIGluZGV4ZXMsIGJyKSB7XG4gIHZhciByaW5nYnVmZmVyID0gdHJlZV90eXBlICogMjtcbiAgdmFyIGluZGV4ID0gdHJlZV90eXBlO1xuICB2YXIgdHlwZV9jb2RlID0gUmVhZFN5bWJvbCh0cmVlcywgdHJlZV90eXBlICogSFVGRk1BTl9NQVhfVEFCTEVfU0laRSwgYnIpO1xuICB2YXIgYmxvY2tfdHlwZTtcblxuICBpZiAodHlwZV9jb2RlID09PSAwKSB7XG4gICAgYmxvY2tfdHlwZSA9IHJpbmdidWZmZXJzW3JpbmdidWZmZXIgKyAoaW5kZXhlc1tpbmRleF0gJiAxKV07XG4gIH0gZWxzZSBpZiAodHlwZV9jb2RlID09PSAxKSB7XG4gICAgYmxvY2tfdHlwZSA9IHJpbmdidWZmZXJzW3JpbmdidWZmZXIgKyAoaW5kZXhlc1tpbmRleF0gLSAxICYgMSldICsgMTtcbiAgfSBlbHNlIHtcbiAgICBibG9ja190eXBlID0gdHlwZV9jb2RlIC0gMjtcbiAgfVxuXG4gIGlmIChibG9ja190eXBlID49IG1heF9ibG9ja190eXBlKSB7XG4gICAgYmxvY2tfdHlwZSAtPSBtYXhfYmxvY2tfdHlwZTtcbiAgfVxuXG4gIGJsb2NrX3R5cGVzW3RyZWVfdHlwZV0gPSBibG9ja190eXBlO1xuICByaW5nYnVmZmVyc1tyaW5nYnVmZmVyICsgKGluZGV4ZXNbaW5kZXhdICYgMSldID0gYmxvY2tfdHlwZTtcbiAgKytpbmRleGVzW2luZGV4XTtcbn1cblxuZnVuY3Rpb24gQ29weVVuY29tcHJlc3NlZEJsb2NrVG9PdXRwdXQob3V0cHV0LCBsZW4sIHBvcywgcmluZ2J1ZmZlciwgcmluZ2J1ZmZlcl9tYXNrLCBicikge1xuICB2YXIgcmJfc2l6ZSA9IHJpbmdidWZmZXJfbWFzayArIDE7XG4gIHZhciByYl9wb3MgPSBwb3MgJiByaW5nYnVmZmVyX21hc2s7XG4gIHZhciBicl9wb3MgPSBici5wb3NfICYgYml0X3JlYWRlci5JQlVGX01BU0s7XG4gIHZhciBuYnl0ZXM7XG4gIC8qIEZvciBzaG9ydCBsZW5ndGhzIGNvcHkgYnl0ZS1ieS1ieXRlICovXG5cbiAgaWYgKGxlbiA8IDggfHwgYnIuYml0X3Bvc18gKyAobGVuIDw8IDMpIDwgYnIuYml0X2VuZF9wb3NfKSB7XG4gICAgd2hpbGUgKGxlbi0tID4gMCkge1xuICAgICAgYnIucmVhZE1vcmVJbnB1dCgpO1xuICAgICAgcmluZ2J1ZmZlcltyYl9wb3MrK10gPSBici5yZWFkQml0cyg4KTtcblxuICAgICAgaWYgKHJiX3BvcyA9PT0gcmJfc2l6ZSkge1xuICAgICAgICBvdXRwdXQud3JpdGUocmluZ2J1ZmZlciwgcmJfc2l6ZSk7XG4gICAgICAgIHJiX3BvcyA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGJyLmJpdF9lbmRfcG9zXyA8IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbQ29weVVuY29tcHJlc3NlZEJsb2NrVG9PdXRwdXRdIGJyLmJpdF9lbmRfcG9zXyA8IDMyJyk7XG4gIH1cbiAgLyogQ29weSByZW1haW5pbmcgMC00IGJ5dGVzIGZyb20gYnIudmFsXyB0byByaW5nYnVmZmVyLiAqL1xuXG5cbiAgd2hpbGUgKGJyLmJpdF9wb3NfIDwgMzIpIHtcbiAgICByaW5nYnVmZmVyW3JiX3Bvc10gPSBici52YWxfID4+PiBici5iaXRfcG9zXztcbiAgICBici5iaXRfcG9zXyArPSA4O1xuICAgICsrcmJfcG9zO1xuICAgIC0tbGVuO1xuICB9XG4gIC8qIENvcHkgcmVtYWluaW5nIGJ5dGVzIGZyb20gYnIuYnVmXyB0byByaW5nYnVmZmVyLiAqL1xuXG5cbiAgbmJ5dGVzID0gYnIuYml0X2VuZF9wb3NfIC0gYnIuYml0X3Bvc18gPj4gMztcblxuICBpZiAoYnJfcG9zICsgbmJ5dGVzID4gYml0X3JlYWRlci5JQlVGX01BU0spIHtcbiAgICB2YXIgdGFpbCA9IGJpdF9yZWFkZXIuSUJVRl9NQVNLICsgMSAtIGJyX3BvcztcblxuICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGFpbDsgeCsrKSB7XG4gICAgICByaW5nYnVmZmVyW3JiX3BvcyArIHhdID0gYnIuYnVmX1ticl9wb3MgKyB4XTtcbiAgICB9XG5cbiAgICBuYnl0ZXMgLT0gdGFpbDtcbiAgICByYl9wb3MgKz0gdGFpbDtcbiAgICBsZW4gLT0gdGFpbDtcbiAgICBicl9wb3MgPSAwO1xuICB9XG5cbiAgZm9yICh2YXIgeCA9IDA7IHggPCBuYnl0ZXM7IHgrKykge1xuICAgIHJpbmdidWZmZXJbcmJfcG9zICsgeF0gPSBici5idWZfW2JyX3BvcyArIHhdO1xuICB9XG5cbiAgcmJfcG9zICs9IG5ieXRlcztcbiAgbGVuIC09IG5ieXRlcztcbiAgLyogSWYgd2Ugd3JvdGUgcGFzdCB0aGUgbG9naWNhbCBlbmQgb2YgdGhlIHJpbmdidWZmZXIsIGNvcHkgdGhlIHRhaWwgb2YgdGhlXG4gICAgIHJpbmdidWZmZXIgdG8gaXRzIGJlZ2lubmluZyBhbmQgZmx1c2ggdGhlIHJpbmdidWZmZXIgdG8gdGhlIG91dHB1dC4gKi9cblxuICBpZiAocmJfcG9zID49IHJiX3NpemUpIHtcbiAgICBvdXRwdXQud3JpdGUocmluZ2J1ZmZlciwgcmJfc2l6ZSk7XG4gICAgcmJfcG9zIC09IHJiX3NpemU7XG5cbiAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHJiX3BvczsgeCsrKSB7XG4gICAgICByaW5nYnVmZmVyW3hdID0gcmluZ2J1ZmZlcltyYl9zaXplICsgeF07XG4gICAgfVxuICB9XG4gIC8qIElmIHdlIGhhdmUgbW9yZSB0byBjb3B5IHRoYW4gdGhlIHJlbWFpbmluZyBzaXplIG9mIHRoZSByaW5nYnVmZmVyLCB0aGVuIHdlXG4gICAgIGZpcnN0IGZpbGwgdGhlIHJpbmdidWZmZXIgZnJvbSB0aGUgaW5wdXQgYW5kIHRoZW4gZmx1c2ggdGhlIHJpbmdidWZmZXIgdG9cbiAgICAgdGhlIG91dHB1dCAqL1xuXG5cbiAgd2hpbGUgKHJiX3BvcyArIGxlbiA+PSByYl9zaXplKSB7XG4gICAgbmJ5dGVzID0gcmJfc2l6ZSAtIHJiX3BvcztcblxuICAgIGlmIChici5pbnB1dF8ucmVhZChyaW5nYnVmZmVyLCByYl9wb3MsIG5ieXRlcykgPCBuYnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW0NvcHlVbmNvbXByZXNzZWRCbG9ja1RvT3V0cHV0XSBub3QgZW5vdWdoIGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgb3V0cHV0LndyaXRlKHJpbmdidWZmZXIsIHJiX3NpemUpO1xuICAgIGxlbiAtPSBuYnl0ZXM7XG4gICAgcmJfcG9zID0gMDtcbiAgfVxuICAvKiBDb3B5IHN0cmFpZ2h0IGZyb20gdGhlIGlucHV0IG9udG8gdGhlIHJpbmdidWZmZXIuIFRoZSByaW5nYnVmZmVyIHdpbGwgYmVcbiAgICAgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGF0IGEgbGF0ZXIgdGltZS4gKi9cblxuXG4gIGlmIChici5pbnB1dF8ucmVhZChyaW5nYnVmZmVyLCByYl9wb3MsIGxlbikgPCBsZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1tDb3B5VW5jb21wcmVzc2VkQmxvY2tUb091dHB1dF0gbm90IGVub3VnaCBieXRlcycpO1xuICB9XG4gIC8qIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBiaXQgcmVhZGVyLiAqL1xuXG5cbiAgYnIucmVzZXQoKTtcbn1cbi8qIEFkdmFuY2VzIHRoZSBiaXQgcmVhZGVyIHBvc2l0aW9uIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkgYW5kIHZlcmlmaWVzXG4gICB0aGF0IGFueSBza2lwcGVkIGJpdHMgYXJlIHNldCB0byB6ZXJvLiAqL1xuXG5cbmZ1bmN0aW9uIEp1bXBUb0J5dGVCb3VuZGFyeShicikge1xuICB2YXIgbmV3X2JpdF9wb3MgPSBici5iaXRfcG9zXyArIDcgJiB+NztcbiAgdmFyIHBhZF9iaXRzID0gYnIucmVhZEJpdHMobmV3X2JpdF9wb3MgLSBici5iaXRfcG9zXyk7XG4gIHJldHVybiBwYWRfYml0cyA9PSAwO1xufVxuXG5mdW5jdGlvbiBCcm90bGlEZWNvbXByZXNzZWRTaXplKGJ1ZmZlcikge1xuICB2YXIgaW5wdXQgPSBuZXcgQnJvdGxpSW5wdXQkMShidWZmZXIpO1xuICB2YXIgYnIgPSBuZXcgYml0X3JlYWRlcihpbnB1dCk7XG4gIERlY29kZVdpbmRvd0JpdHMoYnIpO1xuICB2YXIgb3V0ID0gRGVjb2RlTWV0YUJsb2NrTGVuZ3RoKGJyKTtcbiAgcmV0dXJuIG91dC5tZXRhX2Jsb2NrX2xlbmd0aDtcbn1cblxudmFyIEJyb3RsaURlY29tcHJlc3NlZFNpemVfMSA9IEJyb3RsaURlY29tcHJlc3NlZFNpemU7XG5cbmZ1bmN0aW9uIEJyb3RsaURlY29tcHJlc3NCdWZmZXIoYnVmZmVyLCBvdXRwdXRfc2l6ZSkge1xuICB2YXIgaW5wdXQgPSBuZXcgQnJvdGxpSW5wdXQkMShidWZmZXIpO1xuXG4gIGlmIChvdXRwdXRfc2l6ZSA9PSBudWxsKSB7XG4gICAgb3V0cHV0X3NpemUgPSBCcm90bGlEZWNvbXByZXNzZWRTaXplKGJ1ZmZlcik7XG4gIH1cblxuICB2YXIgb3V0cHV0X2J1ZmZlciA9IG5ldyBVaW50OEFycmF5KG91dHB1dF9zaXplKTtcbiAgdmFyIG91dHB1dCA9IG5ldyBCcm90bGlPdXRwdXQkMShvdXRwdXRfYnVmZmVyKTtcbiAgQnJvdGxpRGVjb21wcmVzcyhpbnB1dCwgb3V0cHV0KTtcblxuICBpZiAob3V0cHV0LnBvcyA8IG91dHB1dC5idWZmZXIubGVuZ3RoKSB7XG4gICAgb3V0cHV0LmJ1ZmZlciA9IG91dHB1dC5idWZmZXIuc3ViYXJyYXkoMCwgb3V0cHV0LnBvcyk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0LmJ1ZmZlcjtcbn1cblxudmFyIEJyb3RsaURlY29tcHJlc3NCdWZmZXJfMSA9IEJyb3RsaURlY29tcHJlc3NCdWZmZXI7XG5cbmZ1bmN0aW9uIEJyb3RsaURlY29tcHJlc3MoaW5wdXQsIG91dHB1dCkge1xuICB2YXIgaTtcbiAgdmFyIHBvcyA9IDA7XG4gIHZhciBpbnB1dF9lbmQgPSAwO1xuICB2YXIgd2luZG93X2JpdHMgPSAwO1xuICB2YXIgbWF4X2JhY2t3YXJkX2Rpc3RhbmNlO1xuICB2YXIgbWF4X2Rpc3RhbmNlID0gMDtcbiAgdmFyIHJpbmdidWZmZXJfc2l6ZTtcbiAgdmFyIHJpbmdidWZmZXJfbWFzaztcbiAgdmFyIHJpbmdidWZmZXI7XG4gIHZhciByaW5nYnVmZmVyX2VuZDtcbiAgLyogVGhpcyByaW5nIGJ1ZmZlciBob2xkcyBhIGZldyBwYXN0IGNvcHkgZGlzdGFuY2VzIHRoYXQgd2lsbCBiZSB1c2VkIGJ5ICovXG5cbiAgLyogc29tZSBzcGVjaWFsIGRpc3RhbmNlIGNvZGVzLiAqL1xuXG4gIHZhciBkaXN0X3JiID0gWzE2LCAxNSwgMTEsIDRdO1xuICB2YXIgZGlzdF9yYl9pZHggPSAwO1xuICAvKiBUaGUgcHJldmlvdXMgMiBieXRlcyB1c2VkIGZvciBjb250ZXh0LiAqL1xuXG4gIHZhciBwcmV2X2J5dGUxID0gMDtcbiAgdmFyIHByZXZfYnl0ZTIgPSAwO1xuICB2YXIgaGdyb3VwID0gW25ldyBIdWZmbWFuVHJlZUdyb3VwKDAsIDApLCBuZXcgSHVmZm1hblRyZWVHcm91cCgwLCAwKSwgbmV3IEh1ZmZtYW5UcmVlR3JvdXAoMCwgMCldO1xuICB2YXIgYmxvY2tfdHlwZV90cmVlcztcbiAgdmFyIGJsb2NrX2xlbl90cmVlcztcbiAgdmFyIGJyO1xuICAvKiBXZSBuZWVkIHRoZSBzbGFjayByZWdpb24gZm9yIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcbiAgICAgICAtIGFsd2F5cyBkb2luZyB0d28gOC1ieXRlIGNvcGllcyBmb3IgZmFzdCBiYWNrd2FyZCBjb3B5aW5nXG4gICAgICAgLSB0cmFuc2Zvcm1zXG4gICAgICAgLSBmbHVzaGluZyB0aGUgaW5wdXQgcmluZ2J1ZmZlciB3aGVuIGRlY29kaW5nIHVuY29tcHJlc3NlZCBibG9ja3MgKi9cblxuICB2YXIga1JpbmdCdWZmZXJXcml0ZUFoZWFkU2xhY2sgPSAxMjggKyBiaXRfcmVhZGVyLlJFQURfU0laRTtcbiAgYnIgPSBuZXcgYml0X3JlYWRlcihpbnB1dCk7XG4gIC8qIERlY29kZSB3aW5kb3cgc2l6ZS4gKi9cblxuICB3aW5kb3dfYml0cyA9IERlY29kZVdpbmRvd0JpdHMoYnIpO1xuICBtYXhfYmFja3dhcmRfZGlzdGFuY2UgPSAoMSA8PCB3aW5kb3dfYml0cykgLSAxNjtcbiAgcmluZ2J1ZmZlcl9zaXplID0gMSA8PCB3aW5kb3dfYml0cztcbiAgcmluZ2J1ZmZlcl9tYXNrID0gcmluZ2J1ZmZlcl9zaXplIC0gMTtcbiAgcmluZ2J1ZmZlciA9IG5ldyBVaW50OEFycmF5KHJpbmdidWZmZXJfc2l6ZSArIGtSaW5nQnVmZmVyV3JpdGVBaGVhZFNsYWNrICsgZGljdGlvbmFyeS5tYXhEaWN0aW9uYXJ5V29yZExlbmd0aCk7XG4gIHJpbmdidWZmZXJfZW5kID0gcmluZ2J1ZmZlcl9zaXplO1xuICBibG9ja190eXBlX3RyZWVzID0gW107XG4gIGJsb2NrX2xlbl90cmVlcyA9IFtdO1xuXG4gIGZvciAodmFyIHggPSAwOyB4IDwgMyAqIEhVRkZNQU5fTUFYX1RBQkxFX1NJWkU7IHgrKykge1xuICAgIGJsb2NrX3R5cGVfdHJlZXNbeF0gPSBuZXcgSHVmZm1hbkNvZGUkMSgwLCAwKTtcbiAgICBibG9ja19sZW5fdHJlZXNbeF0gPSBuZXcgSHVmZm1hbkNvZGUkMSgwLCAwKTtcbiAgfVxuXG4gIHdoaWxlICghaW5wdXRfZW5kKSB7XG4gICAgdmFyIG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbiA9IDA7XG4gICAgdmFyIGlzX3VuY29tcHJlc3NlZDtcbiAgICB2YXIgYmxvY2tfbGVuZ3RoID0gWzEgPDwgMjgsIDEgPDwgMjgsIDEgPDwgMjhdO1xuICAgIHZhciBibG9ja190eXBlID0gWzBdO1xuICAgIHZhciBudW1fYmxvY2tfdHlwZXMgPSBbMSwgMSwgMV07XG4gICAgdmFyIGJsb2NrX3R5cGVfcmIgPSBbMCwgMSwgMCwgMSwgMCwgMV07XG4gICAgdmFyIGJsb2NrX3R5cGVfcmJfaW5kZXggPSBbMF07XG4gICAgdmFyIGRpc3RhbmNlX3Bvc3RmaXhfYml0cztcbiAgICB2YXIgbnVtX2RpcmVjdF9kaXN0YW5jZV9jb2RlcztcbiAgICB2YXIgZGlzdGFuY2VfcG9zdGZpeF9tYXNrO1xuICAgIHZhciBudW1fZGlzdGFuY2VfY29kZXM7XG4gICAgdmFyIGNvbnRleHRfbWFwID0gbnVsbDtcbiAgICB2YXIgY29udGV4dF9tb2RlcyA9IG51bGw7XG4gICAgdmFyIG51bV9saXRlcmFsX2h0cmVlcztcbiAgICB2YXIgZGlzdF9jb250ZXh0X21hcCA9IG51bGw7XG4gICAgdmFyIG51bV9kaXN0X2h0cmVlcztcbiAgICB2YXIgY29udGV4dF9vZmZzZXQgPSAwO1xuICAgIHZhciBjb250ZXh0X21hcF9zbGljZSA9IG51bGw7XG4gICAgdmFyIGxpdGVyYWxfaHRyZWVfaW5kZXggPSAwO1xuICAgIHZhciBkaXN0X2NvbnRleHRfb2Zmc2V0ID0gMDtcbiAgICB2YXIgZGlzdF9jb250ZXh0X21hcF9zbGljZSA9IG51bGw7XG4gICAgdmFyIGRpc3RfaHRyZWVfaW5kZXggPSAwO1xuICAgIHZhciBjb250ZXh0X2xvb2t1cF9vZmZzZXQxID0gMDtcbiAgICB2YXIgY29udGV4dF9sb29rdXBfb2Zmc2V0MiA9IDA7XG4gICAgdmFyIGNvbnRleHRfbW9kZTtcbiAgICB2YXIgaHRyZWVfY29tbWFuZDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHtcbiAgICAgIGhncm91cFtpXS5jb2RlcyA9IG51bGw7XG4gICAgICBoZ3JvdXBbaV0uaHRyZWVzID0gbnVsbDtcbiAgICB9XG5cbiAgICBici5yZWFkTW9yZUlucHV0KCk7XG5cbiAgICB2YXIgX291dCA9IERlY29kZU1ldGFCbG9ja0xlbmd0aChicik7XG5cbiAgICBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4gPSBfb3V0Lm1ldGFfYmxvY2tfbGVuZ3RoO1xuXG4gICAgaWYgKHBvcyArIG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbiA+IG91dHB1dC5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAvKiBXZSBuZWVkIHRvIGdyb3cgdGhlIG91dHB1dCBidWZmZXIgdG8gZml0IHRoZSBhZGRpdGlvbmFsIGRhdGEuICovXG4gICAgICB2YXIgdG1wID0gbmV3IFVpbnQ4QXJyYXkocG9zICsgbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuKTtcbiAgICAgIHRtcC5zZXQob3V0cHV0LmJ1ZmZlcik7XG4gICAgICBvdXRwdXQuYnVmZmVyID0gdG1wO1xuICAgIH1cblxuICAgIGlucHV0X2VuZCA9IF9vdXQuaW5wdXRfZW5kO1xuICAgIGlzX3VuY29tcHJlc3NlZCA9IF9vdXQuaXNfdW5jb21wcmVzc2VkO1xuXG4gICAgaWYgKF9vdXQuaXNfbWV0YWRhdGEpIHtcbiAgICAgIEp1bXBUb0J5dGVCb3VuZGFyeShicik7XG5cbiAgICAgIGZvciAoOyBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4gPiAwOyAtLW1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbikge1xuICAgICAgICBici5yZWFkTW9yZUlucHV0KCk7XG4gICAgICAgIC8qIFJlYWQgb25lIGJ5dGUgYW5kIGlnbm9yZSBpdC4gKi9cblxuICAgICAgICBici5yZWFkQml0cyg4KTtcbiAgICAgIH1cblxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbiA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGlzX3VuY29tcHJlc3NlZCkge1xuICAgICAgYnIuYml0X3Bvc18gPSBici5iaXRfcG9zXyArIDcgJiB+NztcbiAgICAgIENvcHlVbmNvbXByZXNzZWRCbG9ja1RvT3V0cHV0KG91dHB1dCwgbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuLCBwb3MsIHJpbmdidWZmZXIsIHJpbmdidWZmZXJfbWFzaywgYnIpO1xuICAgICAgcG9zICs9IG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHtcbiAgICAgIG51bV9ibG9ja190eXBlc1tpXSA9IERlY29kZVZhckxlblVpbnQ4KGJyKSArIDE7XG5cbiAgICAgIGlmIChudW1fYmxvY2tfdHlwZXNbaV0gPj0gMikge1xuICAgICAgICBSZWFkSHVmZm1hbkNvZGUobnVtX2Jsb2NrX3R5cGVzW2ldICsgMiwgYmxvY2tfdHlwZV90cmVlcywgaSAqIEhVRkZNQU5fTUFYX1RBQkxFX1NJWkUsIGJyKTtcbiAgICAgICAgUmVhZEh1ZmZtYW5Db2RlKGtOdW1CbG9ja0xlbmd0aENvZGVzLCBibG9ja19sZW5fdHJlZXMsIGkgKiBIVUZGTUFOX01BWF9UQUJMRV9TSVpFLCBicik7XG4gICAgICAgIGJsb2NrX2xlbmd0aFtpXSA9IFJlYWRCbG9ja0xlbmd0aChibG9ja19sZW5fdHJlZXMsIGkgKiBIVUZGTUFOX01BWF9UQUJMRV9TSVpFLCBicik7XG4gICAgICAgIGJsb2NrX3R5cGVfcmJfaW5kZXhbaV0gPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGJyLnJlYWRNb3JlSW5wdXQoKTtcbiAgICBkaXN0YW5jZV9wb3N0Zml4X2JpdHMgPSBici5yZWFkQml0cygyKTtcbiAgICBudW1fZGlyZWN0X2Rpc3RhbmNlX2NvZGVzID0gTlVNX0RJU1RBTkNFX1NIT1JUX0NPREVTICsgKGJyLnJlYWRCaXRzKDQpIDw8IGRpc3RhbmNlX3Bvc3RmaXhfYml0cyk7XG4gICAgZGlzdGFuY2VfcG9zdGZpeF9tYXNrID0gKDEgPDwgZGlzdGFuY2VfcG9zdGZpeF9iaXRzKSAtIDE7XG4gICAgbnVtX2Rpc3RhbmNlX2NvZGVzID0gbnVtX2RpcmVjdF9kaXN0YW5jZV9jb2RlcyArICg0OCA8PCBkaXN0YW5jZV9wb3N0Zml4X2JpdHMpO1xuICAgIGNvbnRleHRfbW9kZXMgPSBuZXcgVWludDhBcnJheShudW1fYmxvY2tfdHlwZXNbMF0pO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja190eXBlc1swXTsgKytpKSB7XG4gICAgICBici5yZWFkTW9yZUlucHV0KCk7XG4gICAgICBjb250ZXh0X21vZGVzW2ldID0gYnIucmVhZEJpdHMoMikgPDwgMTtcbiAgICB9XG5cbiAgICB2YXIgX28xID0gRGVjb2RlQ29udGV4dE1hcChudW1fYmxvY2tfdHlwZXNbMF0gPDwga0xpdGVyYWxDb250ZXh0Qml0cywgYnIpO1xuXG4gICAgbnVtX2xpdGVyYWxfaHRyZWVzID0gX28xLm51bV9odHJlZXM7XG4gICAgY29udGV4dF9tYXAgPSBfbzEuY29udGV4dF9tYXA7XG5cbiAgICB2YXIgX28yID0gRGVjb2RlQ29udGV4dE1hcChudW1fYmxvY2tfdHlwZXNbMl0gPDwga0Rpc3RhbmNlQ29udGV4dEJpdHMsIGJyKTtcblxuICAgIG51bV9kaXN0X2h0cmVlcyA9IF9vMi5udW1faHRyZWVzO1xuICAgIGRpc3RfY29udGV4dF9tYXAgPSBfbzIuY29udGV4dF9tYXA7XG4gICAgaGdyb3VwWzBdID0gbmV3IEh1ZmZtYW5UcmVlR3JvdXAoa051bUxpdGVyYWxDb2RlcywgbnVtX2xpdGVyYWxfaHRyZWVzKTtcbiAgICBoZ3JvdXBbMV0gPSBuZXcgSHVmZm1hblRyZWVHcm91cChrTnVtSW5zZXJ0QW5kQ29weUNvZGVzLCBudW1fYmxvY2tfdHlwZXNbMV0pO1xuICAgIGhncm91cFsyXSA9IG5ldyBIdWZmbWFuVHJlZUdyb3VwKG51bV9kaXN0YW5jZV9jb2RlcywgbnVtX2Rpc3RfaHRyZWVzKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHtcbiAgICAgIGhncm91cFtpXS5kZWNvZGUoYnIpO1xuICAgIH1cblxuICAgIGNvbnRleHRfbWFwX3NsaWNlID0gMDtcbiAgICBkaXN0X2NvbnRleHRfbWFwX3NsaWNlID0gMDtcbiAgICBjb250ZXh0X21vZGUgPSBjb250ZXh0X21vZGVzW2Jsb2NrX3R5cGVbMF1dO1xuICAgIGNvbnRleHRfbG9va3VwX29mZnNldDEgPSBjb250ZXh0Lmxvb2t1cE9mZnNldHNbY29udGV4dF9tb2RlXTtcbiAgICBjb250ZXh0X2xvb2t1cF9vZmZzZXQyID0gY29udGV4dC5sb29rdXBPZmZzZXRzW2NvbnRleHRfbW9kZSArIDFdO1xuICAgIGh0cmVlX2NvbW1hbmQgPSBoZ3JvdXBbMV0uaHRyZWVzWzBdO1xuXG4gICAgd2hpbGUgKG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbiA+IDApIHtcbiAgICAgIHZhciBjbWRfY29kZTtcbiAgICAgIHZhciByYW5nZV9pZHg7XG4gICAgICB2YXIgaW5zZXJ0X2NvZGU7XG4gICAgICB2YXIgY29weV9jb2RlO1xuICAgICAgdmFyIGluc2VydF9sZW5ndGg7XG4gICAgICB2YXIgY29weV9sZW5ndGg7XG4gICAgICB2YXIgZGlzdGFuY2VfY29kZTtcbiAgICAgIHZhciBkaXN0YW5jZTtcbiAgICAgIHZhciBjb250ZXh0JDE7XG4gICAgICB2YXIgajtcbiAgICAgIHZhciBjb3B5X2RzdDtcbiAgICAgIGJyLnJlYWRNb3JlSW5wdXQoKTtcblxuICAgICAgaWYgKGJsb2NrX2xlbmd0aFsxXSA9PT0gMCkge1xuICAgICAgICBEZWNvZGVCbG9ja1R5cGUobnVtX2Jsb2NrX3R5cGVzWzFdLCBibG9ja190eXBlX3RyZWVzLCAxLCBibG9ja190eXBlLCBibG9ja190eXBlX3JiLCBibG9ja190eXBlX3JiX2luZGV4LCBicik7XG4gICAgICAgIGJsb2NrX2xlbmd0aFsxXSA9IFJlYWRCbG9ja0xlbmd0aChibG9ja19sZW5fdHJlZXMsIEhVRkZNQU5fTUFYX1RBQkxFX1NJWkUsIGJyKTtcbiAgICAgICAgaHRyZWVfY29tbWFuZCA9IGhncm91cFsxXS5odHJlZXNbYmxvY2tfdHlwZVsxXV07XG4gICAgICB9XG5cbiAgICAgIC0tYmxvY2tfbGVuZ3RoWzFdO1xuICAgICAgY21kX2NvZGUgPSBSZWFkU3ltYm9sKGhncm91cFsxXS5jb2RlcywgaHRyZWVfY29tbWFuZCwgYnIpO1xuICAgICAgcmFuZ2VfaWR4ID0gY21kX2NvZGUgPj4gNjtcblxuICAgICAgaWYgKHJhbmdlX2lkeCA+PSAyKSB7XG4gICAgICAgIHJhbmdlX2lkeCAtPSAyO1xuICAgICAgICBkaXN0YW5jZV9jb2RlID0gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXN0YW5jZV9jb2RlID0gMDtcbiAgICAgIH1cblxuICAgICAgaW5zZXJ0X2NvZGUgPSBwcmVmaXgua0luc2VydFJhbmdlTHV0W3JhbmdlX2lkeF0gKyAoY21kX2NvZGUgPj4gMyAmIDcpO1xuICAgICAgY29weV9jb2RlID0gcHJlZml4LmtDb3B5UmFuZ2VMdXRbcmFuZ2VfaWR4XSArIChjbWRfY29kZSAmIDcpO1xuICAgICAgaW5zZXJ0X2xlbmd0aCA9IHByZWZpeC5rSW5zZXJ0TGVuZ3RoUHJlZml4Q29kZVtpbnNlcnRfY29kZV0ub2Zmc2V0ICsgYnIucmVhZEJpdHMocHJlZml4LmtJbnNlcnRMZW5ndGhQcmVmaXhDb2RlW2luc2VydF9jb2RlXS5uYml0cyk7XG4gICAgICBjb3B5X2xlbmd0aCA9IHByZWZpeC5rQ29weUxlbmd0aFByZWZpeENvZGVbY29weV9jb2RlXS5vZmZzZXQgKyBici5yZWFkQml0cyhwcmVmaXgua0NvcHlMZW5ndGhQcmVmaXhDb2RlW2NvcHlfY29kZV0ubmJpdHMpO1xuICAgICAgcHJldl9ieXRlMSA9IHJpbmdidWZmZXJbcG9zIC0gMSAmIHJpbmdidWZmZXJfbWFza107XG4gICAgICBwcmV2X2J5dGUyID0gcmluZ2J1ZmZlcltwb3MgLSAyICYgcmluZ2J1ZmZlcl9tYXNrXTtcblxuICAgICAgZm9yIChqID0gMDsgaiA8IGluc2VydF9sZW5ndGg7ICsraikge1xuICAgICAgICBici5yZWFkTW9yZUlucHV0KCk7XG5cbiAgICAgICAgaWYgKGJsb2NrX2xlbmd0aFswXSA9PT0gMCkge1xuICAgICAgICAgIERlY29kZUJsb2NrVHlwZShudW1fYmxvY2tfdHlwZXNbMF0sIGJsb2NrX3R5cGVfdHJlZXMsIDAsIGJsb2NrX3R5cGUsIGJsb2NrX3R5cGVfcmIsIGJsb2NrX3R5cGVfcmJfaW5kZXgsIGJyKTtcbiAgICAgICAgICBibG9ja19sZW5ndGhbMF0gPSBSZWFkQmxvY2tMZW5ndGgoYmxvY2tfbGVuX3RyZWVzLCAwLCBicik7XG4gICAgICAgICAgY29udGV4dF9vZmZzZXQgPSBibG9ja190eXBlWzBdIDw8IGtMaXRlcmFsQ29udGV4dEJpdHM7XG4gICAgICAgICAgY29udGV4dF9tYXBfc2xpY2UgPSBjb250ZXh0X29mZnNldDtcbiAgICAgICAgICBjb250ZXh0X21vZGUgPSBjb250ZXh0X21vZGVzW2Jsb2NrX3R5cGVbMF1dO1xuICAgICAgICAgIGNvbnRleHRfbG9va3VwX29mZnNldDEgPSBjb250ZXh0Lmxvb2t1cE9mZnNldHNbY29udGV4dF9tb2RlXTtcbiAgICAgICAgICBjb250ZXh0X2xvb2t1cF9vZmZzZXQyID0gY29udGV4dC5sb29rdXBPZmZzZXRzW2NvbnRleHRfbW9kZSArIDFdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dCQxID0gY29udGV4dC5sb29rdXBbY29udGV4dF9sb29rdXBfb2Zmc2V0MSArIHByZXZfYnl0ZTFdIHwgY29udGV4dC5sb29rdXBbY29udGV4dF9sb29rdXBfb2Zmc2V0MiArIHByZXZfYnl0ZTJdO1xuICAgICAgICBsaXRlcmFsX2h0cmVlX2luZGV4ID0gY29udGV4dF9tYXBbY29udGV4dF9tYXBfc2xpY2UgKyBjb250ZXh0JDFdO1xuICAgICAgICAtLWJsb2NrX2xlbmd0aFswXTtcbiAgICAgICAgcHJldl9ieXRlMiA9IHByZXZfYnl0ZTE7XG4gICAgICAgIHByZXZfYnl0ZTEgPSBSZWFkU3ltYm9sKGhncm91cFswXS5jb2RlcywgaGdyb3VwWzBdLmh0cmVlc1tsaXRlcmFsX2h0cmVlX2luZGV4XSwgYnIpO1xuICAgICAgICByaW5nYnVmZmVyW3BvcyAmIHJpbmdidWZmZXJfbWFza10gPSBwcmV2X2J5dGUxO1xuXG4gICAgICAgIGlmICgocG9zICYgcmluZ2J1ZmZlcl9tYXNrKSA9PT0gcmluZ2J1ZmZlcl9tYXNrKSB7XG4gICAgICAgICAgb3V0cHV0LndyaXRlKHJpbmdidWZmZXIsIHJpbmdidWZmZXJfc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICArK3BvcztcbiAgICAgIH1cblxuICAgICAgbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuIC09IGluc2VydF9sZW5ndGg7XG4gICAgICBpZiAobWV0YV9ibG9ja19yZW1haW5pbmdfbGVuIDw9IDApIGJyZWFrO1xuXG4gICAgICBpZiAoZGlzdGFuY2VfY29kZSA8IDApIHtcbiAgICAgICAgdmFyIGNvbnRleHQkMTtcbiAgICAgICAgYnIucmVhZE1vcmVJbnB1dCgpO1xuXG4gICAgICAgIGlmIChibG9ja19sZW5ndGhbMl0gPT09IDApIHtcbiAgICAgICAgICBEZWNvZGVCbG9ja1R5cGUobnVtX2Jsb2NrX3R5cGVzWzJdLCBibG9ja190eXBlX3RyZWVzLCAyLCBibG9ja190eXBlLCBibG9ja190eXBlX3JiLCBibG9ja190eXBlX3JiX2luZGV4LCBicik7XG4gICAgICAgICAgYmxvY2tfbGVuZ3RoWzJdID0gUmVhZEJsb2NrTGVuZ3RoKGJsb2NrX2xlbl90cmVlcywgMiAqIEhVRkZNQU5fTUFYX1RBQkxFX1NJWkUsIGJyKTtcbiAgICAgICAgICBkaXN0X2NvbnRleHRfb2Zmc2V0ID0gYmxvY2tfdHlwZVsyXSA8PCBrRGlzdGFuY2VDb250ZXh0Qml0cztcbiAgICAgICAgICBkaXN0X2NvbnRleHRfbWFwX3NsaWNlID0gZGlzdF9jb250ZXh0X29mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIC0tYmxvY2tfbGVuZ3RoWzJdO1xuICAgICAgICBjb250ZXh0JDEgPSAoY29weV9sZW5ndGggPiA0ID8gMyA6IGNvcHlfbGVuZ3RoIC0gMikgJiAweGZmO1xuICAgICAgICBkaXN0X2h0cmVlX2luZGV4ID0gZGlzdF9jb250ZXh0X21hcFtkaXN0X2NvbnRleHRfbWFwX3NsaWNlICsgY29udGV4dCQxXTtcbiAgICAgICAgZGlzdGFuY2VfY29kZSA9IFJlYWRTeW1ib2woaGdyb3VwWzJdLmNvZGVzLCBoZ3JvdXBbMl0uaHRyZWVzW2Rpc3RfaHRyZWVfaW5kZXhdLCBicik7XG5cbiAgICAgICAgaWYgKGRpc3RhbmNlX2NvZGUgPj0gbnVtX2RpcmVjdF9kaXN0YW5jZV9jb2Rlcykge1xuICAgICAgICAgIHZhciBuYml0cztcbiAgICAgICAgICB2YXIgcG9zdGZpeDtcbiAgICAgICAgICB2YXIgb2Zmc2V0O1xuICAgICAgICAgIGRpc3RhbmNlX2NvZGUgLT0gbnVtX2RpcmVjdF9kaXN0YW5jZV9jb2RlcztcbiAgICAgICAgICBwb3N0Zml4ID0gZGlzdGFuY2VfY29kZSAmIGRpc3RhbmNlX3Bvc3RmaXhfbWFzaztcbiAgICAgICAgICBkaXN0YW5jZV9jb2RlID4+PSBkaXN0YW5jZV9wb3N0Zml4X2JpdHM7XG4gICAgICAgICAgbmJpdHMgPSAoZGlzdGFuY2VfY29kZSA+PiAxKSArIDE7XG4gICAgICAgICAgb2Zmc2V0ID0gKDIgKyAoZGlzdGFuY2VfY29kZSAmIDEpIDw8IG5iaXRzKSAtIDQ7XG4gICAgICAgICAgZGlzdGFuY2VfY29kZSA9IG51bV9kaXJlY3RfZGlzdGFuY2VfY29kZXMgKyAob2Zmc2V0ICsgYnIucmVhZEJpdHMobmJpdHMpIDw8IGRpc3RhbmNlX3Bvc3RmaXhfYml0cykgKyBwb3N0Zml4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiBDb252ZXJ0IHRoZSBkaXN0YW5jZSBjb2RlIHRvIHRoZSBhY3R1YWwgZGlzdGFuY2UgYnkgcG9zc2libHkgbG9va2luZyAqL1xuXG4gICAgICAvKiB1cCBwYXN0IGRpc3RuYWNlcyBmcm9tIHRoZSByaW5nYnVmZmVyLiAqL1xuXG5cbiAgICAgIGRpc3RhbmNlID0gVHJhbnNsYXRlU2hvcnRDb2RlcyhkaXN0YW5jZV9jb2RlLCBkaXN0X3JiLCBkaXN0X3JiX2lkeCk7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbQnJvdGxpRGVjb21wcmVzc10gaW52YWxpZCBkaXN0YW5jZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9zIDwgbWF4X2JhY2t3YXJkX2Rpc3RhbmNlICYmIG1heF9kaXN0YW5jZSAhPT0gbWF4X2JhY2t3YXJkX2Rpc3RhbmNlKSB7XG4gICAgICAgIG1heF9kaXN0YW5jZSA9IHBvcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heF9kaXN0YW5jZSA9IG1heF9iYWNrd2FyZF9kaXN0YW5jZTtcbiAgICAgIH1cblxuICAgICAgY29weV9kc3QgPSBwb3MgJiByaW5nYnVmZmVyX21hc2s7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA+IG1heF9kaXN0YW5jZSkge1xuICAgICAgICBpZiAoY29weV9sZW5ndGggPj0gZGljdGlvbmFyeS5taW5EaWN0aW9uYXJ5V29yZExlbmd0aCAmJiBjb3B5X2xlbmd0aCA8PSBkaWN0aW9uYXJ5Lm1heERpY3Rpb25hcnlXb3JkTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIG9mZnNldCA9IGRpY3Rpb25hcnkub2Zmc2V0c0J5TGVuZ3RoW2NvcHlfbGVuZ3RoXTtcbiAgICAgICAgICB2YXIgd29yZF9pZCA9IGRpc3RhbmNlIC0gbWF4X2Rpc3RhbmNlIC0gMTtcbiAgICAgICAgICB2YXIgc2hpZnQgPSBkaWN0aW9uYXJ5LnNpemVCaXRzQnlMZW5ndGhbY29weV9sZW5ndGhdO1xuICAgICAgICAgIHZhciBtYXNrID0gKDEgPDwgc2hpZnQpIC0gMTtcbiAgICAgICAgICB2YXIgd29yZF9pZHggPSB3b3JkX2lkICYgbWFzaztcbiAgICAgICAgICB2YXIgdHJhbnNmb3JtX2lkeCA9IHdvcmRfaWQgPj4gc2hpZnQ7XG4gICAgICAgICAgb2Zmc2V0ICs9IHdvcmRfaWR4ICogY29weV9sZW5ndGg7XG5cbiAgICAgICAgICBpZiAodHJhbnNmb3JtX2lkeCA8IHRyYW5zZm9ybS5rTnVtVHJhbnNmb3Jtcykge1xuICAgICAgICAgICAgdmFyIGxlbiA9IHRyYW5zZm9ybS50cmFuc2Zvcm1EaWN0aW9uYXJ5V29yZChyaW5nYnVmZmVyLCBjb3B5X2RzdCwgb2Zmc2V0LCBjb3B5X2xlbmd0aCwgdHJhbnNmb3JtX2lkeCk7XG4gICAgICAgICAgICBjb3B5X2RzdCArPSBsZW47XG4gICAgICAgICAgICBwb3MgKz0gbGVuO1xuICAgICAgICAgICAgbWV0YV9ibG9ja19yZW1haW5pbmdfbGVuIC09IGxlbjtcblxuICAgICAgICAgICAgaWYgKGNvcHlfZHN0ID49IHJpbmdidWZmZXJfZW5kKSB7XG4gICAgICAgICAgICAgIG91dHB1dC53cml0ZShyaW5nYnVmZmVyLCByaW5nYnVmZmVyX3NpemUpO1xuXG4gICAgICAgICAgICAgIGZvciAodmFyIF94ID0gMDsgX3ggPCBjb3B5X2RzdCAtIHJpbmdidWZmZXJfZW5kOyBfeCsrKSB7XG4gICAgICAgICAgICAgICAgcmluZ2J1ZmZlcltfeF0gPSByaW5nYnVmZmVyW3JpbmdidWZmZXJfZW5kICsgX3hdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmFja3dhcmQgcmVmZXJlbmNlLiBwb3M6IFwiICsgcG9zICsgXCIgZGlzdGFuY2U6IFwiICsgZGlzdGFuY2UgKyBcIiBsZW46IFwiICsgY29weV9sZW5ndGggKyBcIiBieXRlcyBsZWZ0OiBcIiArIG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmFja3dhcmQgcmVmZXJlbmNlLiBwb3M6IFwiICsgcG9zICsgXCIgZGlzdGFuY2U6IFwiICsgZGlzdGFuY2UgKyBcIiBsZW46IFwiICsgY29weV9sZW5ndGggKyBcIiBieXRlcyBsZWZ0OiBcIiArIG1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkaXN0YW5jZV9jb2RlID4gMCkge1xuICAgICAgICAgIGRpc3RfcmJbZGlzdF9yYl9pZHggJiAzXSA9IGRpc3RhbmNlO1xuICAgICAgICAgICsrZGlzdF9yYl9pZHg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29weV9sZW5ndGggPiBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhY2t3YXJkIHJlZmVyZW5jZS4gcG9zOiBcIiArIHBvcyArIFwiIGRpc3RhbmNlOiBcIiArIGRpc3RhbmNlICsgXCIgbGVuOiBcIiArIGNvcHlfbGVuZ3RoICsgXCIgYnl0ZXMgbGVmdDogXCIgKyBtZXRhX2Jsb2NrX3JlbWFpbmluZ19sZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvcHlfbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICByaW5nYnVmZmVyW3BvcyAmIHJpbmdidWZmZXJfbWFza10gPSByaW5nYnVmZmVyW3BvcyAtIGRpc3RhbmNlICYgcmluZ2J1ZmZlcl9tYXNrXTtcblxuICAgICAgICAgIGlmICgocG9zICYgcmluZ2J1ZmZlcl9tYXNrKSA9PT0gcmluZ2J1ZmZlcl9tYXNrKSB7XG4gICAgICAgICAgICBvdXRwdXQud3JpdGUocmluZ2J1ZmZlciwgcmluZ2J1ZmZlcl9zaXplKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICArK3BvcztcbiAgICAgICAgICAtLW1ldGFfYmxvY2tfcmVtYWluaW5nX2xlbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogV2hlbiB3ZSBnZXQgaGVyZSwgd2UgbXVzdCBoYXZlIGluc2VydGVkIGF0IGxlYXN0IG9uZSBsaXRlcmFsIGFuZCAqL1xuXG4gICAgICAvKiBtYWRlIGEgY29weSBvZiBhdCBsZWFzdCBsZW5ndGggdHdvLCB0aGVyZWZvcmUgYWNjZXNzaW5nIHRoZSBsYXN0IDIgKi9cblxuICAgICAgLyogYnl0ZXMgaXMgdmFsaWQuICovXG5cblxuICAgICAgcHJldl9ieXRlMSA9IHJpbmdidWZmZXJbcG9zIC0gMSAmIHJpbmdidWZmZXJfbWFza107XG4gICAgICBwcmV2X2J5dGUyID0gcmluZ2J1ZmZlcltwb3MgLSAyICYgcmluZ2J1ZmZlcl9tYXNrXTtcbiAgICB9XG4gICAgLyogUHJvdGVjdCBwb3MgZnJvbSBvdmVyZmxvdywgd3JhcCBpdCBhcm91bmQgYXQgZXZlcnkgR0Igb2YgaW5wdXQgZGF0YSAqL1xuXG5cbiAgICBwb3MgJj0gMHgzZmZmZmZmZjtcbiAgfVxuXG4gIG91dHB1dC53cml0ZShyaW5nYnVmZmVyLCBwb3MgJiByaW5nYnVmZmVyX21hc2spO1xufVxuXG52YXIgQnJvdGxpRGVjb21wcmVzc18xID0gQnJvdGxpRGVjb21wcmVzcztcbmRpY3Rpb25hcnkuaW5pdChCcm90bGlEZWNvbXByZXNzQnVmZmVyKTtcbnZhciBkZWNvZGUgPSB7XG4gIEJyb3RsaURlY29tcHJlc3NlZFNpemU6IEJyb3RsaURlY29tcHJlc3NlZFNpemVfMSxcbiAgQnJvdGxpRGVjb21wcmVzc0J1ZmZlcjogQnJvdGxpRGVjb21wcmVzc0J1ZmZlcl8xLFxuICBCcm90bGlEZWNvbXByZXNzOiBCcm90bGlEZWNvbXByZXNzXzFcbn07XG5cbnZhciBkZWNvbXByZXNzID0gZGVjb2RlLkJyb3RsaURlY29tcHJlc3NCdWZmZXI7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJGcoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG4vKipcbiAqIFJlcHJlc2VudHMgYSBUcnVlVHlwZSBnbHlwaCBpbiB0aGUgV09GRjIgZm9ybWF0LCB3aGljaCBjb21wcmVzc2VzIGdseXBocyBkaWZmZXJlbnRseS5cbiAqL1xuXG52YXIgV09GRjJHbHlwaCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1RURkdseXBoKSB7XG4gIF9pbmhlcml0c0xvb3NlJGcoV09GRjJHbHlwaCwgX1RURkdseXBoKTtcblxuICBmdW5jdGlvbiBXT0ZGMkdseXBoKCkge1xuICAgIHJldHVybiBfVFRGR2x5cGguYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFdPRkYyR2x5cGgucHJvdG90eXBlO1xuXG4gIF9wcm90by5fZGVjb2RlID0gZnVuY3Rpb24gX2RlY29kZSgpIHtcbiAgICAvLyBXZSBoYXZlIHRvIGRlY29kZSBpbiBhZHZhbmNlIChpbiBXT0ZGMkZvbnQpLCBzbyBqdXN0IHJldHVybiB0aGUgcHJlLWRlY29kZWQgZGF0YS5cbiAgICByZXR1cm4gdGhpcy5fZm9udC5fdHJhbnNmb3JtZWRHbHlwaHNbdGhpcy5pZF07XG4gIH07XG5cbiAgX3Byb3RvLl9nZXRDQm94ID0gZnVuY3Rpb24gX2dldENCb3goKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0aC5iYm94O1xuICB9O1xuXG4gIHJldHVybiBXT0ZGMkdseXBoO1xufShUVEZHbHlwaCk7XG5cbnZhciBCYXNlMTI4ID0ge1xuICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0pIHtcbiAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICB2YXIgaXRlcmFibGUgPSBbMCwgMSwgMiwgMywgNF07XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGl0ZXJhYmxlLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgY29kZSA9IHN0cmVhbS5yZWFkVUludDgoKTsgLy8gSWYgYW55IG9mIHRoZSB0b3Agc2V2ZW4gYml0cyBhcmUgc2V0IHRoZW4gd2UncmUgYWJvdXQgdG8gb3ZlcmZsb3cuXG5cbiAgICAgIGlmIChyZXN1bHQgJiAweGUwMDAwMDAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT3ZlcmZsb3cnKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0ID0gcmVzdWx0IDw8IDcgfCBjb2RlICYgMHg3ZjtcblxuICAgICAgaWYgKChjb2RlICYgMHg4MCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBiYXNlIDEyOCBudW1iZXInKTtcbiAgfVxufTtcbnZhciBrbm93blRhZ3MgPSBbJ2NtYXAnLCAnaGVhZCcsICdoaGVhJywgJ2htdHgnLCAnbWF4cCcsICduYW1lJywgJ09TLzInLCAncG9zdCcsICdjdnQgJywgJ2ZwZ20nLCAnZ2x5ZicsICdsb2NhJywgJ3ByZXAnLCAnQ0ZGICcsICdWT1JHJywgJ0VCRFQnLCAnRUJMQycsICdnYXNwJywgJ2hkbXgnLCAna2VybicsICdMVFNIJywgJ1BDTFQnLCAnVkRNWCcsICd2aGVhJywgJ3ZtdHgnLCAnQkFTRScsICdHREVGJywgJ0dQT1MnLCAnR1NVQicsICdFQlNDJywgJ0pTVEYnLCAnTUFUSCcsICdDQkRUJywgJ0NCTEMnLCAnQ09MUicsICdDUEFMJywgJ1NWRyAnLCAnc2JpeCcsICdhY250JywgJ2F2YXInLCAnYmRhdCcsICdibG9jJywgJ2JzbG4nLCAnY3ZhcicsICdmZHNjJywgJ2ZlYXQnLCAnZm10eCcsICdmdmFyJywgJ2d2YXInLCAnaHN0eScsICdqdXN0JywgJ2xjYXInLCAnbW9ydCcsICdtb3J4JywgJ29wYmQnLCAncHJvcCcsICd0cmFrJywgJ1phcGYnLCAnU2lsZicsICdHbGF0JywgJ0dsb2MnLCAnRmVhdCcsICdTaWxsJ107XG52YXIgV09GRjJEaXJlY3RvcnlFbnRyeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBmbGFnczogcmVzdHJ1Y3R1cmUudWludDgsXG4gIGN1c3RvbVRhZzogbmV3IHJlc3RydWN0dXJlLk9wdGlvbmFsKG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuICh0LmZsYWdzICYgMHgzZikgPT09IDB4M2Y7XG4gIH0pLFxuICB0YWc6IGZ1bmN0aW9uIHRhZyh0KSB7XG4gICAgcmV0dXJuIHQuY3VzdG9tVGFnIHx8IGtub3duVGFnc1t0LmZsYWdzICYgMHgzZl07XG4gIH0sXG4gIC8vIHx8ICgoKSA9PiB7IHRocm93IG5ldyBFcnJvcihgQmFkIHRhZzogJHtmbGFncyAmIDB4M2Z9YCk7IH0pKCk7IH0sXG4gIGxlbmd0aDogQmFzZTEyOCxcbiAgdHJhbnNmb3JtVmVyc2lvbjogZnVuY3Rpb24gdHJhbnNmb3JtVmVyc2lvbih0KSB7XG4gICAgcmV0dXJuIHQuZmxhZ3MgPj4+IDYgJiAweDAzO1xuICB9LFxuICB0cmFuc2Zvcm1lZDogZnVuY3Rpb24gdHJhbnNmb3JtZWQodCkge1xuICAgIHJldHVybiB0LnRhZyA9PT0gJ2dseWYnIHx8IHQudGFnID09PSAnbG9jYScgPyB0LnRyYW5zZm9ybVZlcnNpb24gPT09IDAgOiB0LnRyYW5zZm9ybVZlcnNpb24gIT09IDA7XG4gIH0sXG4gIHRyYW5zZm9ybUxlbmd0aDogbmV3IHJlc3RydWN0dXJlLk9wdGlvbmFsKEJhc2UxMjgsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQudHJhbnNmb3JtZWQ7XG4gIH0pXG59KTtcbnZhciBXT0ZGMkRpcmVjdG9yeSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICB0YWc6IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcoNCksXG4gIC8vIHNob3VsZCBiZSAnd09GMidcbiAgZmxhdm9yOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBudW1UYWJsZXM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcmVzZXJ2ZWQ6IG5ldyByZXN0cnVjdHVyZS5SZXNlcnZlZChyZXN0cnVjdHVyZS51aW50MTYpLFxuICB0b3RhbFNmbnRTaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHRvdGFsQ29tcHJlc3NlZFNpemU6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbWFqb3JWZXJzaW9uOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG1pbm9yVmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDE2LFxuICBtZXRhT2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG1ldGFMZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbWV0YU9yaWdMZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgcHJpdk9mZnNldDogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBwcml2TGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIHRhYmxlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFdPRkYyRGlyZWN0b3J5RW50cnksICdudW1UYWJsZXMnKVxufSk7XG5cbldPRkYyRGlyZWN0b3J5LnByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0YWJsZXMgPSB7fTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRhYmxlID0gdGhpcy50YWJsZXNbaV07XG4gICAgdGFibGVzW3RhYmxlLnRhZ10gPSB0YWJsZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLnRhYmxlcyA9IHRhYmxlcztcbn07XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlJGgoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG4vKipcbiAqIFN1YmNsYXNzIG9mIFRURkZvbnQgdGhhdCByZXByZXNlbnRzIGEgVFRGL09URiBmb250IGNvbXByZXNzZWQgYnkgV09GRjJcbiAqIFNlZSBzcGVjIGhlcmU6IGh0dHA6Ly93d3cudzMub3JnL1RSL1dPRkYyL1xuICovXG5cbnZhciBXT0ZGMkZvbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9UVEZGb250KSB7XG4gIF9pbmhlcml0c0xvb3NlJGgoV09GRjJGb250LCBfVFRGRm9udCk7XG5cbiAgZnVuY3Rpb24gV09GRjJGb250KCkge1xuICAgIHJldHVybiBfVFRGRm9udC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICBXT0ZGMkZvbnQucHJvYmUgPSBmdW5jdGlvbiBwcm9iZShidWZmZXIpIHtcbiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCdhc2NpaScsIDAsIDQpID09PSAnd09GMic7XG4gIH07XG5cbiAgdmFyIF9wcm90byA9IFdPRkYyRm9udC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9kZWNvZGVEaXJlY3RvcnkgPSBmdW5jdGlvbiBfZGVjb2RlRGlyZWN0b3J5KCkge1xuICAgIHRoaXMuZGlyZWN0b3J5ID0gV09GRjJEaXJlY3RvcnkuZGVjb2RlKHRoaXMuc3RyZWFtKTtcbiAgICB0aGlzLl9kYXRhUG9zID0gdGhpcy5zdHJlYW0ucG9zO1xuICB9O1xuXG4gIF9wcm90by5fZGVjb21wcmVzcyA9IGZ1bmN0aW9uIF9kZWNvbXByZXNzKCkge1xuICAgIC8vIGRlY29tcHJlc3MgZGF0YSBhbmQgc2V0dXAgdGFibGUgb2Zmc2V0cyBpZiB3ZSBoYXZlbid0IGFscmVhZHlcbiAgICBpZiAoIXRoaXMuX2RlY29tcHJlc3NlZCkge1xuICAgICAgdGhpcy5zdHJlYW0ucG9zID0gdGhpcy5fZGF0YVBvcztcbiAgICAgIHZhciBidWZmZXIgPSB0aGlzLnN0cmVhbS5yZWFkQnVmZmVyKHRoaXMuZGlyZWN0b3J5LnRvdGFsQ29tcHJlc3NlZFNpemUpO1xuICAgICAgdmFyIGRlY29tcHJlc3NlZFNpemUgPSAwO1xuXG4gICAgICBmb3IgKHZhciB0YWcgaW4gdGhpcy5kaXJlY3RvcnkudGFibGVzKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMuZGlyZWN0b3J5LnRhYmxlc1t0YWddO1xuICAgICAgICBlbnRyeS5vZmZzZXQgPSBkZWNvbXByZXNzZWRTaXplO1xuICAgICAgICBkZWNvbXByZXNzZWRTaXplICs9IGVudHJ5LnRyYW5zZm9ybUxlbmd0aCAhPSBudWxsID8gZW50cnkudHJhbnNmb3JtTGVuZ3RoIDogZW50cnkubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVjb21wcmVzc2VkID0gZGVjb21wcmVzcyhidWZmZXIsIGRlY29tcHJlc3NlZFNpemUpO1xuXG4gICAgICBpZiAoIWRlY29tcHJlc3NlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGRlY29kaW5nIGNvbXByZXNzZWQgZGF0YSBpbiBXT0ZGMicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0cmVhbSA9IG5ldyByZXN0cnVjdHVyZS5EZWNvZGVTdHJlYW0obmV3IGJ1ZmZlcl8xKGRlY29tcHJlc3NlZCkpO1xuICAgICAgdGhpcy5fZGVjb21wcmVzc2VkID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLl9kZWNvZGVUYWJsZSA9IGZ1bmN0aW9uIF9kZWNvZGVUYWJsZSh0YWJsZSkge1xuICAgIHRoaXMuX2RlY29tcHJlc3MoKTtcblxuICAgIHJldHVybiBfVFRGRm9udC5wcm90b3R5cGUuX2RlY29kZVRhYmxlLmNhbGwodGhpcywgdGFibGUpO1xuICB9IC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGdldCBhIGdseXBoIGFuZCByZXR1cm4gb3VyXG4gIC8vIGN1c3RvbSBzdWJjbGFzcyBpZiB0aGVyZSBpcyBhIGdseWYgdGFibGUuXG4gIDtcblxuICBfcHJvdG8uX2dldEJhc2VHbHlwaCA9IGZ1bmN0aW9uIF9nZXRCYXNlR2x5cGgoZ2x5cGgsIGNoYXJhY3RlcnMpIHtcbiAgICBpZiAoY2hhcmFjdGVycyA9PT0gdm9pZCAwKSB7XG4gICAgICBjaGFyYWN0ZXJzID0gW107XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9nbHlwaHNbZ2x5cGhdKSB7XG4gICAgICBpZiAodGhpcy5kaXJlY3RvcnkudGFibGVzLmdseWYgJiYgdGhpcy5kaXJlY3RvcnkudGFibGVzLmdseWYudHJhbnNmb3JtZWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90cmFuc2Zvcm1lZEdseXBocykge1xuICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybUdseWZUYWJsZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dseXBoc1tnbHlwaF0gPSBuZXcgV09GRjJHbHlwaChnbHlwaCwgY2hhcmFjdGVycywgdGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gX1RURkZvbnQucHJvdG90eXBlLl9nZXRCYXNlR2x5cGguY2FsbCh0aGlzLCBnbHlwaCwgY2hhcmFjdGVycyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5fdHJhbnNmb3JtR2x5ZlRhYmxlID0gZnVuY3Rpb24gX3RyYW5zZm9ybUdseWZUYWJsZSgpIHtcbiAgICB0aGlzLl9kZWNvbXByZXNzKCk7XG5cbiAgICB0aGlzLnN0cmVhbS5wb3MgPSB0aGlzLmRpcmVjdG9yeS50YWJsZXMuZ2x5Zi5vZmZzZXQ7XG4gICAgdmFyIHRhYmxlID0gR2x5ZlRhYmxlLmRlY29kZSh0aGlzLnN0cmVhbSk7XG4gICAgdmFyIGdseXBocyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRhYmxlLm51bUdseXBoczsgaW5kZXgrKykge1xuICAgICAgdmFyIGdseXBoID0ge307XG4gICAgICB2YXIgbkNvbnRvdXJzID0gdGFibGUubkNvbnRvdXJzLnJlYWRJbnQxNkJFKCk7XG4gICAgICBnbHlwaC5udW1iZXJPZkNvbnRvdXJzID0gbkNvbnRvdXJzO1xuXG4gICAgICBpZiAobkNvbnRvdXJzID4gMCkge1xuICAgICAgICAvLyBzaW1wbGUgZ2x5cGhcbiAgICAgICAgdmFyIG5Qb2ludHMgPSBbXTtcbiAgICAgICAgdmFyIHRvdGFsUG9pbnRzID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5Db250b3VyczsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9yID0gcmVhZDI1NVVJbnQxNih0YWJsZS5uUG9pbnRzKTtcblxuICAgICAgICAgIHRvdGFsUG9pbnRzICs9IF9yO1xuICAgICAgICAgIG5Qb2ludHMucHVzaCh0b3RhbFBvaW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICBnbHlwaC5wb2ludHMgPSBkZWNvZGVUcmlwbGV0KHRhYmxlLmZsYWdzLCB0YWJsZS5nbHlwaHMsIHRvdGFsUG9pbnRzKTtcblxuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbkNvbnRvdXJzOyBfaSsrKSB7XG4gICAgICAgICAgZ2x5cGgucG9pbnRzW25Qb2ludHNbX2ldIC0gMV0uZW5kQ29udG91ciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25TaXplID0gcmVhZDI1NVVJbnQxNih0YWJsZS5nbHlwaHMpO1xuICAgICAgfSBlbHNlIGlmIChuQ29udG91cnMgPCAwKSB7XG4gICAgICAgIC8vIGNvbXBvc2l0ZSBnbHlwaFxuICAgICAgICB2YXIgaGF2ZUluc3RydWN0aW9ucyA9IFRURkdseXBoLnByb3RvdHlwZS5fZGVjb2RlQ29tcG9zaXRlLmNhbGwoe1xuICAgICAgICAgIF9mb250OiB0aGlzXG4gICAgICAgIH0sIGdseXBoLCB0YWJsZS5jb21wb3NpdGVzKTtcblxuICAgICAgICBpZiAoaGF2ZUluc3RydWN0aW9ucykge1xuICAgICAgICAgIHZhciBpbnN0cnVjdGlvblNpemUgPSByZWFkMjU1VUludDE2KHRhYmxlLmdseXBocyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZ2x5cGhzLnB1c2goZ2x5cGgpO1xuICAgIH1cblxuICAgIHRoaXMuX3RyYW5zZm9ybWVkR2x5cGhzID0gZ2x5cGhzO1xuICB9O1xuXG4gIHJldHVybiBXT0ZGMkZvbnQ7XG59KFRURkZvbnQpOyAvLyBTcGVjaWFsIGNsYXNzIHRoYXQgYWNjZXB0cyBhIGxlbmd0aCBhbmQgcmV0dXJucyBhIHN1Yi1zdHJlYW0gZm9yIHRoYXQgZGF0YVxuXG52YXIgU3Vic3RyZWFtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3Vic3RyZWFtKGxlbmd0aCkge1xuICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIHRoaXMuX2J1ZiA9IG5ldyByZXN0cnVjdHVyZS5CdWZmZXIobGVuZ3RoKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8yID0gU3Vic3RyZWFtLnByb3RvdHlwZTtcblxuICBfcHJvdG8yLmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShzdHJlYW0sIHBhcmVudCkge1xuICAgIHJldHVybiBuZXcgcmVzdHJ1Y3R1cmUuRGVjb2RlU3RyZWFtKHRoaXMuX2J1Zi5kZWNvZGUoc3RyZWFtLCBwYXJlbnQpKTtcbiAgfTtcblxuICByZXR1cm4gU3Vic3RyZWFtO1xufSgpOyAvLyBUaGlzIHN0cnVjdCByZXByZXNlbnRzIHRoZSBlbnRpcmUgZ2x5ZiB0YWJsZVxuXG5cbnZhciBHbHlmVGFibGUgPSBuZXcgcmVzdHJ1Y3R1cmUuU3RydWN0KHtcbiAgdmVyc2lvbjogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBudW1HbHlwaHM6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgaW5kZXhGb3JtYXQ6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgbkNvbnRvdXJTdHJlYW1TaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG5Qb2ludHNTdHJlYW1TaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGZsYWdTdHJlYW1TaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGdseXBoU3RyZWFtU2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBjb21wb3NpdGVTdHJlYW1TaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGJib3hTdHJlYW1TaXplOiByZXN0cnVjdHVyZS51aW50MzIsXG4gIGluc3RydWN0aW9uU3RyZWFtU2l6ZTogcmVzdHJ1Y3R1cmUudWludDMyLFxuICBuQ29udG91cnM6IG5ldyBTdWJzdHJlYW0oJ25Db250b3VyU3RyZWFtU2l6ZScpLFxuICBuUG9pbnRzOiBuZXcgU3Vic3RyZWFtKCduUG9pbnRzU3RyZWFtU2l6ZScpLFxuICBmbGFnczogbmV3IFN1YnN0cmVhbSgnZmxhZ1N0cmVhbVNpemUnKSxcbiAgZ2x5cGhzOiBuZXcgU3Vic3RyZWFtKCdnbHlwaFN0cmVhbVNpemUnKSxcbiAgY29tcG9zaXRlczogbmV3IFN1YnN0cmVhbSgnY29tcG9zaXRlU3RyZWFtU2l6ZScpLFxuICBiYm94ZXM6IG5ldyBTdWJzdHJlYW0oJ2Jib3hTdHJlYW1TaXplJyksXG4gIGluc3RydWN0aW9uczogbmV3IFN1YnN0cmVhbSgnaW5zdHJ1Y3Rpb25TdHJlYW1TaXplJylcbn0pO1xudmFyIFdPUkRfQ09ERSA9IDI1MztcbnZhciBPTkVfTU9SRV9CWVRFX0NPREUyID0gMjU0O1xudmFyIE9ORV9NT1JFX0JZVEVfQ09ERTEgPSAyNTU7XG52YXIgTE9XRVNUX1VfQ09ERSA9IDI1MztcblxuZnVuY3Rpb24gcmVhZDI1NVVJbnQxNihzdHJlYW0pIHtcbiAgdmFyIGNvZGUgPSBzdHJlYW0ucmVhZFVJbnQ4KCk7XG5cbiAgaWYgKGNvZGUgPT09IFdPUkRfQ09ERSkge1xuICAgIHJldHVybiBzdHJlYW0ucmVhZFVJbnQxNkJFKCk7XG4gIH1cblxuICBpZiAoY29kZSA9PT0gT05FX01PUkVfQllURV9DT0RFMSkge1xuICAgIHJldHVybiBzdHJlYW0ucmVhZFVJbnQ4KCkgKyBMT1dFU1RfVV9DT0RFO1xuICB9XG5cbiAgaWYgKGNvZGUgPT09IE9ORV9NT1JFX0JZVEVfQ09ERTIpIHtcbiAgICByZXR1cm4gc3RyZWFtLnJlYWRVSW50OCgpICsgTE9XRVNUX1VfQ09ERSAqIDI7XG4gIH1cblxuICByZXR1cm4gY29kZTtcbn1cblxuZnVuY3Rpb24gd2l0aFNpZ24oZmxhZywgYmFzZXZhbCkge1xuICByZXR1cm4gZmxhZyAmIDEgPyBiYXNldmFsIDogLWJhc2V2YWw7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVRyaXBsZXQoZmxhZ3MsIGdseXBocywgblBvaW50cykge1xuICB2YXIgeTtcbiAgdmFyIHggPSB5ID0gMDtcbiAgdmFyIHJlcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgblBvaW50czsgaSsrKSB7XG4gICAgdmFyIGR4ID0gMCxcbiAgICAgICAgZHkgPSAwO1xuICAgIHZhciBmbGFnID0gZmxhZ3MucmVhZFVJbnQ4KCk7XG4gICAgdmFyIG9uQ3VydmUgPSAhKGZsYWcgPj4gNyk7XG4gICAgZmxhZyAmPSAweDdmO1xuXG4gICAgaWYgKGZsYWcgPCAxMCkge1xuICAgICAgZHggPSAwO1xuICAgICAgZHkgPSB3aXRoU2lnbihmbGFnLCAoKGZsYWcgJiAxNCkgPDwgNykgKyBnbHlwaHMucmVhZFVJbnQ4KCkpO1xuICAgIH0gZWxzZSBpZiAoZmxhZyA8IDIwKSB7XG4gICAgICBkeCA9IHdpdGhTaWduKGZsYWcsICgoZmxhZyAtIDEwICYgMTQpIDw8IDcpICsgZ2x5cGhzLnJlYWRVSW50OCgpKTtcbiAgICAgIGR5ID0gMDtcbiAgICB9IGVsc2UgaWYgKGZsYWcgPCA4NCkge1xuICAgICAgdmFyIGIwID0gZmxhZyAtIDIwO1xuICAgICAgdmFyIGIxID0gZ2x5cGhzLnJlYWRVSW50OCgpO1xuICAgICAgZHggPSB3aXRoU2lnbihmbGFnLCAxICsgKGIwICYgMHgzMCkgKyAoYjEgPj4gNCkpO1xuICAgICAgZHkgPSB3aXRoU2lnbihmbGFnID4+IDEsIDEgKyAoKGIwICYgMHgwYykgPDwgMikgKyAoYjEgJiAweDBmKSk7XG4gICAgfSBlbHNlIGlmIChmbGFnIDwgMTIwKSB7XG4gICAgICB2YXIgYjAgPSBmbGFnIC0gODQ7XG4gICAgICBkeCA9IHdpdGhTaWduKGZsYWcsIDEgKyAoYjAgLyAxMiA8PCA4KSArIGdseXBocy5yZWFkVUludDgoKSk7XG4gICAgICBkeSA9IHdpdGhTaWduKGZsYWcgPj4gMSwgMSArIChiMCAlIDEyID4+IDIgPDwgOCkgKyBnbHlwaHMucmVhZFVJbnQ4KCkpO1xuICAgIH0gZWxzZSBpZiAoZmxhZyA8IDEyNCkge1xuICAgICAgdmFyIGIxID0gZ2x5cGhzLnJlYWRVSW50OCgpO1xuICAgICAgdmFyIGIyID0gZ2x5cGhzLnJlYWRVSW50OCgpO1xuICAgICAgZHggPSB3aXRoU2lnbihmbGFnLCAoYjEgPDwgNCkgKyAoYjIgPj4gNCkpO1xuICAgICAgZHkgPSB3aXRoU2lnbihmbGFnID4+IDEsICgoYjIgJiAweDBmKSA8PCA4KSArIGdseXBocy5yZWFkVUludDgoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGR4ID0gd2l0aFNpZ24oZmxhZywgZ2x5cGhzLnJlYWRVSW50MTZCRSgpKTtcbiAgICAgIGR5ID0gd2l0aFNpZ24oZmxhZyA+PiAxLCBnbHlwaHMucmVhZFVJbnQxNkJFKCkpO1xuICAgIH1cblxuICAgIHggKz0gZHg7XG4gICAgeSArPSBkeTtcbiAgICByZXMucHVzaChuZXcgUG9pbnQob25DdXJ2ZSwgZmFsc2UsIHgsIHkpKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UkcyhvKSB7IHZhciBpID0gMDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkcyhvKSkpIHJldHVybiBmdW5jdGlvbiAoKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH07IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSBpID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IHJldHVybiBpLm5leHQuYmluZChpKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkkcyhvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5JHMobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSRzKG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkkcyhhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMkOSh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyQ5KENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMkOShDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJDkoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG52YXIgVFRDSGVhZGVyID0gbmV3IHJlc3RydWN0dXJlLlZlcnNpb25lZFN0cnVjdChyZXN0cnVjdHVyZS51aW50MzIsIHtcbiAgMHgwMDAxMDAwMDoge1xuICAgIG51bUZvbnRzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgb2Zmc2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQzMiwgJ251bUZvbnRzJylcbiAgfSxcbiAgMHgwMDAyMDAwMDoge1xuICAgIG51bUZvbnRzOiByZXN0cnVjdHVyZS51aW50MzIsXG4gICAgb2Zmc2V0czogbmV3IHJlc3RydWN0dXJlLkFycmF5KHJlc3RydWN0dXJlLnVpbnQzMiwgJ251bUZvbnRzJyksXG4gICAgZHNpZ1RhZzogcmVzdHJ1Y3R1cmUudWludDMyLFxuICAgIGRzaWdMZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgICBkc2lnT2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MzJcbiAgfVxufSk7XG5cbnZhciBUcnVlVHlwZUNvbGxlY3Rpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBUcnVlVHlwZUNvbGxlY3Rpb24ucHJvYmUgPSBmdW5jdGlvbiBwcm9iZShidWZmZXIpIHtcbiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCdhc2NpaScsIDAsIDQpID09PSAndHRjZic7XG4gIH07XG5cbiAgZnVuY3Rpb24gVHJ1ZVR5cGVDb2xsZWN0aW9uKHN0cmVhbSkge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuXG4gICAgaWYgKHN0cmVhbS5yZWFkU3RyaW5nKDQpICE9PSAndHRjZicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgVHJ1ZVR5cGUgY29sbGVjdGlvbicpO1xuICAgIH1cblxuICAgIHRoaXMuaGVhZGVyID0gVFRDSGVhZGVyLmRlY29kZShzdHJlYW0pO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFRydWVUeXBlQ29sbGVjdGlvbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmdldEZvbnQgPSBmdW5jdGlvbiBnZXRGb250KG5hbWUpIHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHModGhpcy5oZWFkZXIub2Zmc2V0cyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gX3N0ZXAudmFsdWU7XG4gICAgICB2YXIgc3RyZWFtID0gbmV3IHJlc3RydWN0dXJlLkRlY29kZVN0cmVhbSh0aGlzLnN0cmVhbS5idWZmZXIpO1xuICAgICAgc3RyZWFtLnBvcyA9IG9mZnNldDtcbiAgICAgIHZhciBmb250ID0gbmV3IFRURkZvbnQoc3RyZWFtKTtcblxuICAgICAgaWYgKGZvbnQucG9zdHNjcmlwdE5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZvbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzJDkoVHJ1ZVR5cGVDb2xsZWN0aW9uLCBbe1xuICAgIGtleTogXCJmb250c1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGZvbnRzID0gW107XG5cbiAgICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHModGhpcy5oZWFkZXIub2Zmc2V0cyksIF9zdGVwMjsgIShfc3RlcDIgPSBfaXRlcmF0b3IyKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSBfc3RlcDIudmFsdWU7XG4gICAgICAgIHZhciBzdHJlYW0gPSBuZXcgcmVzdHJ1Y3R1cmUuRGVjb2RlU3RyZWFtKHRoaXMuc3RyZWFtLmJ1ZmZlcik7XG4gICAgICAgIHN0cmVhbS5wb3MgPSBvZmZzZXQ7XG4gICAgICAgIGZvbnRzLnB1c2gobmV3IFRURkZvbnQoc3RyZWFtKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmb250cztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJ1ZVR5cGVDb2xsZWN0aW9uO1xufSgpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHQobykgeyB2YXIgaSA9IDA7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JHQobykpKSByZXR1cm4gZnVuY3Rpb24gKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9OyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gaSA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyByZXR1cm4gaS5uZXh0LmJpbmQoaSk7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5JHQobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheSR0KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkkdChvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5JHQoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzJGEodGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MkYShDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzJGEoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyRhKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxudmFyIERGb250TmFtZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJpbmcocmVzdHJ1Y3R1cmUudWludDgpO1xudmFyIERGb250RGF0YSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBsZW46IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgYnVmOiBuZXcgcmVzdHJ1Y3R1cmUuQnVmZmVyKCdsZW4nKVxufSk7XG52YXIgUmVmID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGlkOiByZXN0cnVjdHVyZS51aW50MTYsXG4gIG5hbWVPZmZzZXQ6IHJlc3RydWN0dXJlLmludDE2LFxuICBhdHRyOiByZXN0cnVjdHVyZS51aW50OCxcbiAgZGF0YU9mZnNldDogcmVzdHJ1Y3R1cmUudWludDI0LFxuICBoYW5kbGU6IHJlc3RydWN0dXJlLnVpbnQzMlxufSk7XG52YXIgVHlwZSA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBuYW1lOiBuZXcgcmVzdHJ1Y3R1cmUuU3RyaW5nKDQpLFxuICBtYXhUeXBlSW5kZXg6IHJlc3RydWN0dXJlLnVpbnQxNixcbiAgcmVmTGlzdDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCBuZXcgcmVzdHJ1Y3R1cmUuQXJyYXkoUmVmLCBmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiB0Lm1heFR5cGVJbmRleCArIDE7XG4gIH0pLCB7XG4gICAgdHlwZTogJ3BhcmVudCdcbiAgfSlcbn0pO1xudmFyIFR5cGVMaXN0ID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIGxlbmd0aDogcmVzdHJ1Y3R1cmUudWludDE2LFxuICB0eXBlczogbmV3IHJlc3RydWN0dXJlLkFycmF5KFR5cGUsIGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQubGVuZ3RoICsgMTtcbiAgfSlcbn0pO1xudmFyIERGb250TWFwID0gbmV3IHJlc3RydWN0dXJlLlN0cnVjdCh7XG4gIHJlc2VydmVkOiBuZXcgcmVzdHJ1Y3R1cmUuUmVzZXJ2ZWQocmVzdHJ1Y3R1cmUudWludDgsIDI0KSxcbiAgdHlwZUxpc3Q6IG5ldyByZXN0cnVjdHVyZS5Qb2ludGVyKHJlc3RydWN0dXJlLnVpbnQxNiwgVHlwZUxpc3QpLFxuICBuYW1lTGlzdE9mZnNldDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDE2LCAndm9pZCcpXG59KTtcbnZhciBERm9udEhlYWRlciA9IG5ldyByZXN0cnVjdHVyZS5TdHJ1Y3Qoe1xuICBkYXRhT2Zmc2V0OiByZXN0cnVjdHVyZS51aW50MzIsXG4gIG1hcDogbmV3IHJlc3RydWN0dXJlLlBvaW50ZXIocmVzdHJ1Y3R1cmUudWludDMyLCBERm9udE1hcCksXG4gIGRhdGFMZW5ndGg6IHJlc3RydWN0dXJlLnVpbnQzMixcbiAgbWFwTGVuZ3RoOiByZXN0cnVjdHVyZS51aW50MzJcbn0pO1xuXG52YXIgREZvbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBERm9udC5wcm9iZSA9IGZ1bmN0aW9uIHByb2JlKGJ1ZmZlcikge1xuICAgIHZhciBzdHJlYW0gPSBuZXcgcmVzdHJ1Y3R1cmUuRGVjb2RlU3RyZWFtKGJ1ZmZlcik7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIGhlYWRlciA9IERGb250SGVhZGVyLmRlY29kZShzdHJlYW0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHQoaGVhZGVyLm1hcC50eXBlTGlzdC50eXBlcyksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgdHlwZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICBpZiAodHlwZS5uYW1lID09PSAnc2ZudCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIERGb250KHN0cmVhbSkge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuaGVhZGVyID0gREZvbnRIZWFkZXIuZGVjb2RlKHRoaXMuc3RyZWFtKTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHQodGhpcy5oZWFkZXIubWFwLnR5cGVMaXN0LnR5cGVzKSwgX3N0ZXAyOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIoKSkuZG9uZTspIHtcbiAgICAgIHZhciB0eXBlID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSR0KHR5cGUucmVmTGlzdCksIF9zdGVwMzsgIShfc3RlcDMgPSBfaXRlcmF0b3IzKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciByZWYgPSBfc3RlcDMudmFsdWU7XG5cbiAgICAgICAgaWYgKHJlZi5uYW1lT2Zmc2V0ID49IDApIHtcbiAgICAgICAgICB0aGlzLnN0cmVhbS5wb3MgPSByZWYubmFtZU9mZnNldCArIHRoaXMuaGVhZGVyLm1hcC5uYW1lTGlzdE9mZnNldDtcbiAgICAgICAgICByZWYubmFtZSA9IERGb250TmFtZS5kZWNvZGUodGhpcy5zdHJlYW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZi5uYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZS5uYW1lID09PSAnc2ZudCcpIHtcbiAgICAgICAgdGhpcy5zZm50ID0gdHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvID0gREZvbnQucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRGb250ID0gZnVuY3Rpb24gZ2V0Rm9udChuYW1lKSB7XG4gICAgaWYgKCF0aGlzLnNmbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlJHQodGhpcy5zZm50LnJlZkxpc3QpLCBfc3RlcDQ7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNCgpKS5kb25lOykge1xuICAgICAgdmFyIHJlZiA9IF9zdGVwNC52YWx1ZTtcbiAgICAgIHZhciBwb3MgPSB0aGlzLmhlYWRlci5kYXRhT2Zmc2V0ICsgcmVmLmRhdGFPZmZzZXQgKyA0O1xuICAgICAgdmFyIHN0cmVhbSA9IG5ldyByZXN0cnVjdHVyZS5EZWNvZGVTdHJlYW0odGhpcy5zdHJlYW0uYnVmZmVyLnNsaWNlKHBvcykpO1xuICAgICAgdmFyIGZvbnQgPSBuZXcgVFRGRm9udChzdHJlYW0pO1xuXG4gICAgICBpZiAoZm9udC5wb3N0c2NyaXB0TmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gZm9udDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MkYShERm9udCwgW3tcbiAgICBrZXk6IFwiZm9udHNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBmb250cyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3I1ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXJMb29zZSR0KHRoaXMuc2ZudC5yZWZMaXN0KSwgX3N0ZXA1OyAhKF9zdGVwNSA9IF9pdGVyYXRvcjUoKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHJlZiA9IF9zdGVwNS52YWx1ZTtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuaGVhZGVyLmRhdGFPZmZzZXQgKyByZWYuZGF0YU9mZnNldCArIDQ7XG4gICAgICAgIHZhciBzdHJlYW0gPSBuZXcgcmVzdHJ1Y3R1cmUuRGVjb2RlU3RyZWFtKHRoaXMuc3RyZWFtLmJ1ZmZlci5zbGljZShwb3MpKTtcbiAgICAgICAgZm9udHMucHVzaChuZXcgVFRGRm9udChzdHJlYW0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvbnRzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBERm9udDtcbn0oKTtcblxuZm9udGtpdC5yZWdpc3RlckZvcm1hdChUVEZGb250KTtcbmZvbnRraXQucmVnaXN0ZXJGb3JtYXQoV09GRkZvbnQpO1xuZm9udGtpdC5yZWdpc3RlckZvcm1hdChXT0ZGMkZvbnQpO1xuZm9udGtpdC5yZWdpc3RlckZvcm1hdChUcnVlVHlwZUNvbGxlY3Rpb24pO1xuZm9udGtpdC5yZWdpc3RlckZvcm1hdChERm9udCk7XG5cbmV4cG9ydCBkZWZhdWx0IGZvbnRraXQ7XG4iLCIvKiB0c2xpbnQ6ZGlzYWJsZSBtYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuaW1wb3J0IHsgZGVjb21wcmVzc0pzb24sIHBhZFN0YXJ0IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgQWxsRW5jb2RpbmdzQ29tcHJlc3NlZCBmcm9tICcuL2FsbC1lbmNvZGluZ3MuY29tcHJlc3NlZC5qc29uJztcbnZhciBkZWNvbXByZXNzZWRFbmNvZGluZ3MgPSBkZWNvbXByZXNzSnNvbihBbGxFbmNvZGluZ3NDb21wcmVzc2VkKTtcbnZhciBhbGxVbmljb2RlTWFwcGluZ3MgPSBKU09OLnBhcnNlKGRlY29tcHJlc3NlZEVuY29kaW5ncyk7XG52YXIgRW5jb2RpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRW5jb2RpbmcobmFtZSwgdW5pY29kZU1hcHBpbmdzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuY2FuRW5jb2RlVW5pY29kZUNvZGVQb2ludCA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2RlUG9pbnQgaW4gX3RoaXMudW5pY29kZU1hcHBpbmdzO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVuY29kZVVuaWNvZGVDb2RlUG9pbnQgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgICAgICAgICB2YXIgbWFwcGVkID0gX3RoaXMudW5pY29kZU1hcHBpbmdzW2NvZGVQb2ludF07XG4gICAgICAgICAgICBpZiAoIW1hcHBlZCkge1xuICAgICAgICAgICAgICAgIHZhciBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG4gICAgICAgICAgICAgICAgdmFyIGhleENvZGUgPSBcIjB4XCIgKyBwYWRTdGFydChjb2RlUG9pbnQudG9TdHJpbmcoMTYpLCA0LCAnMCcpO1xuICAgICAgICAgICAgICAgIHZhciBtc2cgPSBfdGhpcy5uYW1lICsgXCIgY2Fubm90IGVuY29kZSBcXFwiXCIgKyBzdHIgKyBcIlxcXCIgKFwiICsgaGV4Q29kZSArIFwiKVwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgY29kZTogbWFwcGVkWzBdLCBuYW1lOiBtYXBwZWRbMV0gfTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0ZWRDb2RlUG9pbnRzID0gT2JqZWN0LmtleXModW5pY29kZU1hcHBpbmdzKVxuICAgICAgICAgICAgLm1hcChOdW1iZXIpXG4gICAgICAgICAgICAuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pO1xuICAgICAgICB0aGlzLnVuaWNvZGVNYXBwaW5ncyA9IHVuaWNvZGVNYXBwaW5ncztcbiAgICB9XG4gICAgcmV0dXJuIEVuY29kaW5nO1xufSgpKTtcbmV4cG9ydCB2YXIgRW5jb2RpbmdzID0ge1xuICAgIFN5bWJvbDogbmV3IEVuY29kaW5nKCdTeW1ib2wnLCBhbGxVbmljb2RlTWFwcGluZ3Muc3ltYm9sKSxcbiAgICBaYXBmRGluZ2JhdHM6IG5ldyBFbmNvZGluZygnWmFwZkRpbmdiYXRzJywgYWxsVW5pY29kZU1hcHBpbmdzLnphcGZkaW5nYmF0cyksXG4gICAgV2luQW5zaTogbmV3IEVuY29kaW5nKCdXaW5BbnNpJywgYWxsVW5pY29kZU1hcHBpbmdzLndpbjEyNTIpLFxufTtcbiIsImltcG9ydCB7IGRlY29tcHJlc3NKc29uIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgQ291cmllckJvbGRDb21wcmVzc2VkIGZyb20gJy4vQ291cmllci1Cb2xkLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgQ291cmllckJvbGRPYmxpcXVlQ29tcHJlc3NlZCBmcm9tICcuL0NvdXJpZXItQm9sZE9ibGlxdWUuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBDb3VyaWVyT2JsaXF1ZUNvbXByZXNzZWQgZnJvbSAnLi9Db3VyaWVyLU9ibGlxdWUuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBDb3VyaWVyQ29tcHJlc3NlZCBmcm9tICcuL0NvdXJpZXIuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBIZWx2ZXRpY2FCb2xkQ29tcHJlc3NlZCBmcm9tICcuL0hlbHZldGljYS1Cb2xkLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgSGVsdmV0aWNhQm9sZE9ibGlxdWVDb21wcmVzc2VkIGZyb20gJy4vSGVsdmV0aWNhLUJvbGRPYmxpcXVlLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgSGVsdmV0aWNhT2JsaXF1ZUNvbXByZXNzZWQgZnJvbSAnLi9IZWx2ZXRpY2EtT2JsaXF1ZS5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IEhlbHZldGljYUNvbXByZXNzZWQgZnJvbSAnLi9IZWx2ZXRpY2EuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBUaW1lc0JvbGRDb21wcmVzc2VkIGZyb20gJy4vVGltZXMtQm9sZC5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IFRpbWVzQm9sZEl0YWxpY0NvbXByZXNzZWQgZnJvbSAnLi9UaW1lcy1Cb2xkSXRhbGljLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgVGltZXNJdGFsaWNDb21wcmVzc2VkIGZyb20gJy4vVGltZXMtSXRhbGljLmNvbXByZXNzZWQuanNvbic7XG5pbXBvcnQgVGltZXNSb21hbkNvbXByZXNzZWQgZnJvbSAnLi9UaW1lcy1Sb21hbi5jb21wcmVzc2VkLmpzb24nO1xuaW1wb3J0IFN5bWJvbENvbXByZXNzZWQgZnJvbSAnLi9TeW1ib2wuY29tcHJlc3NlZC5qc29uJztcbmltcG9ydCBaYXBmRGluZ2JhdHNDb21wcmVzc2VkIGZyb20gJy4vWmFwZkRpbmdiYXRzLmNvbXByZXNzZWQuanNvbic7XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBjb21wcmVzc2VkSnNvbkZvckZvbnROYW1lID0ge1xuICAgICdDb3VyaWVyJzogQ291cmllckNvbXByZXNzZWQsXG4gICAgJ0NvdXJpZXItQm9sZCc6IENvdXJpZXJCb2xkQ29tcHJlc3NlZCxcbiAgICAnQ291cmllci1PYmxpcXVlJzogQ291cmllck9ibGlxdWVDb21wcmVzc2VkLFxuICAgICdDb3VyaWVyLUJvbGRPYmxpcXVlJzogQ291cmllckJvbGRPYmxpcXVlQ29tcHJlc3NlZCxcbiAgICAnSGVsdmV0aWNhJzogSGVsdmV0aWNhQ29tcHJlc3NlZCxcbiAgICAnSGVsdmV0aWNhLUJvbGQnOiBIZWx2ZXRpY2FCb2xkQ29tcHJlc3NlZCxcbiAgICAnSGVsdmV0aWNhLU9ibGlxdWUnOiBIZWx2ZXRpY2FPYmxpcXVlQ29tcHJlc3NlZCxcbiAgICAnSGVsdmV0aWNhLUJvbGRPYmxpcXVlJzogSGVsdmV0aWNhQm9sZE9ibGlxdWVDb21wcmVzc2VkLFxuICAgICdUaW1lcy1Sb21hbic6IFRpbWVzUm9tYW5Db21wcmVzc2VkLFxuICAgICdUaW1lcy1Cb2xkJzogVGltZXNCb2xkQ29tcHJlc3NlZCxcbiAgICAnVGltZXMtSXRhbGljJzogVGltZXNJdGFsaWNDb21wcmVzc2VkLFxuICAgICdUaW1lcy1Cb2xkSXRhbGljJzogVGltZXNCb2xkSXRhbGljQ29tcHJlc3NlZCxcbiAgICAnU3ltYm9sJzogU3ltYm9sQ29tcHJlc3NlZCxcbiAgICAnWmFwZkRpbmdiYXRzJzogWmFwZkRpbmdiYXRzQ29tcHJlc3NlZCxcbn07XG5leHBvcnQgdmFyIEZvbnROYW1lcztcbihmdW5jdGlvbiAoRm9udE5hbWVzKSB7XG4gICAgRm9udE5hbWVzW1wiQ291cmllclwiXSA9IFwiQ291cmllclwiO1xuICAgIEZvbnROYW1lc1tcIkNvdXJpZXJCb2xkXCJdID0gXCJDb3VyaWVyLUJvbGRcIjtcbiAgICBGb250TmFtZXNbXCJDb3VyaWVyT2JsaXF1ZVwiXSA9IFwiQ291cmllci1PYmxpcXVlXCI7XG4gICAgRm9udE5hbWVzW1wiQ291cmllckJvbGRPYmxpcXVlXCJdID0gXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCI7XG4gICAgRm9udE5hbWVzW1wiSGVsdmV0aWNhXCJdID0gXCJIZWx2ZXRpY2FcIjtcbiAgICBGb250TmFtZXNbXCJIZWx2ZXRpY2FCb2xkXCJdID0gXCJIZWx2ZXRpY2EtQm9sZFwiO1xuICAgIEZvbnROYW1lc1tcIkhlbHZldGljYU9ibGlxdWVcIl0gPSBcIkhlbHZldGljYS1PYmxpcXVlXCI7XG4gICAgRm9udE5hbWVzW1wiSGVsdmV0aWNhQm9sZE9ibGlxdWVcIl0gPSBcIkhlbHZldGljYS1Cb2xkT2JsaXF1ZVwiO1xuICAgIEZvbnROYW1lc1tcIlRpbWVzUm9tYW5cIl0gPSBcIlRpbWVzLVJvbWFuXCI7XG4gICAgRm9udE5hbWVzW1wiVGltZXNSb21hbkJvbGRcIl0gPSBcIlRpbWVzLUJvbGRcIjtcbiAgICBGb250TmFtZXNbXCJUaW1lc1JvbWFuSXRhbGljXCJdID0gXCJUaW1lcy1JdGFsaWNcIjtcbiAgICBGb250TmFtZXNbXCJUaW1lc1JvbWFuQm9sZEl0YWxpY1wiXSA9IFwiVGltZXMtQm9sZEl0YWxpY1wiO1xuICAgIEZvbnROYW1lc1tcIlN5bWJvbFwiXSA9IFwiU3ltYm9sXCI7XG4gICAgRm9udE5hbWVzW1wiWmFwZkRpbmdiYXRzXCJdID0gXCJaYXBmRGluZ2JhdHNcIjtcbn0pKEZvbnROYW1lcyB8fCAoRm9udE5hbWVzID0ge30pKTtcbnZhciBmb250Q2FjaGUgPSB7fTtcbnZhciBGb250ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZvbnQoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZ2V0V2lkdGhPZkdseXBoID0gZnVuY3Rpb24gKGdseXBoTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLkNoYXJXaWR0aHNbZ2x5cGhOYW1lXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRYQXhpc0tlcm5pbmdGb3JQYWlyID0gZnVuY3Rpb24gKGxlZnRHbHlwaE5hbWUsIHJpZ2h0R2x5cGhOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gKF90aGlzLktlcm5QYWlyWEFtb3VudHNbbGVmdEdseXBoTmFtZV0gfHwge30pW3JpZ2h0R2x5cGhOYW1lXTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRm9udC5sb2FkID0gZnVuY3Rpb24gKGZvbnROYW1lKSB7XG4gICAgICAgIHZhciBjYWNoZWRGb250ID0gZm9udENhY2hlW2ZvbnROYW1lXTtcbiAgICAgICAgaWYgKGNhY2hlZEZvbnQpXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkRm9udDtcbiAgICAgICAgdmFyIGpzb24gPSBkZWNvbXByZXNzSnNvbihjb21wcmVzc2VkSnNvbkZvckZvbnROYW1lW2ZvbnROYW1lXSk7XG4gICAgICAgIHZhciBmb250ID0gT2JqZWN0LmFzc2lnbihuZXcgRm9udCgpLCBKU09OLnBhcnNlKGpzb24pKTtcbiAgICAgICAgZm9udC5DaGFyV2lkdGhzID0gZm9udC5DaGFyTWV0cmljcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgbWV0cmljKSB7XG4gICAgICAgICAgICBhY2NbbWV0cmljLk5dID0gbWV0cmljLldYO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuICAgICAgICBmb250Lktlcm5QYWlyWEFtb3VudHMgPSBmb250Lktlcm5QYWlycy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgX2EpIHtcbiAgICAgICAgICAgIHZhciBuYW1lMSA9IF9hWzBdLCBuYW1lMiA9IF9hWzFdLCB3aWR0aCA9IF9hWzJdO1xuICAgICAgICAgICAgaWYgKCFhY2NbbmFtZTFdKVxuICAgICAgICAgICAgICAgIGFjY1tuYW1lMV0gPSB7fTtcbiAgICAgICAgICAgIGFjY1tuYW1lMV1bbmFtZTJdID0gd2lkdGg7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIGZvbnRDYWNoZVtmb250TmFtZV0gPSBmb250O1xuICAgICAgICByZXR1cm4gZm9udDtcbiAgICB9O1xuICAgIHJldHVybiBGb250O1xufSgpKTtcbmV4cG9ydCB7IEZvbnQgfTtcbiIsImV4cG9ydCAqIGZyb20gJy4vRm9udCc7XG5leHBvcnQgKiBmcm9tICcuL0VuY29kaW5nJztcbiIsIi8qXG4gKiBUaGUgYGNoYXJzYCwgYGxvb2t1cGAsIGFuZCBgZGVjb2RlRnJvbUJhc2U2NGAgbWVtYmVycyBvZiB0aGlzIGZpbGUgYXJlXG4gKiBsaWNlbnNlZCB1bmRlciB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAgICBiYXNlNjQtYXJyYXlidWZmZXJcbiAqICAgICBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzdmgvYmFzZTY0LWFycmF5YnVmZmVyXG4gKlxuICogICAgIENvcHlyaWdodCAoYykgMjAxMiBOaWtsYXMgdm9uIEhlcnR6ZW5cbiAqICAgICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICovXG5pbXBvcnQgcGFrbyBmcm9tICdwYWtvJztcbnZhciBjaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcbi8vIFVzZSBhIGxvb2t1cCB0YWJsZSB0byBmaW5kIHRoZSBpbmRleC5cbnZhciBsb29rdXAgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG59XG5leHBvcnQgdmFyIGRlY29kZUZyb21CYXNlNjQgPSBmdW5jdGlvbiAoYmFzZTY0KSB7XG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGJhc2U2NC5sZW5ndGggKiAwLjc1O1xuICAgIHZhciBsZW4gPSBiYXNlNjQubGVuZ3RoO1xuICAgIHZhciBpO1xuICAgIHZhciBwID0gMDtcbiAgICB2YXIgZW5jb2RlZDE7XG4gICAgdmFyIGVuY29kZWQyO1xuICAgIHZhciBlbmNvZGVkMztcbiAgICB2YXIgZW5jb2RlZDQ7XG4gICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMV0gPT09ICc9Jykge1xuICAgICAgICBidWZmZXJMZW5ndGgtLTtcbiAgICAgICAgaWYgKGJhc2U2NFtiYXNlNjQubGVuZ3RoIC0gMl0gPT09ICc9Jykge1xuICAgICAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyTGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICAgICAgZW5jb2RlZDEgPSBsb29rdXBbYmFzZTY0LmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBlbmNvZGVkMiA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMSldO1xuICAgICAgICBlbmNvZGVkMyA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMildO1xuICAgICAgICBlbmNvZGVkNCA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpICsgMyldO1xuICAgICAgICBieXRlc1twKytdID0gKGVuY29kZWQxIDw8IDIpIHwgKGVuY29kZWQyID4+IDQpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMiAmIDE1KSA8PCA0KSB8IChlbmNvZGVkMyA+PiAyKTtcbiAgICAgICAgYnl0ZXNbcCsrXSA9ICgoZW5jb2RlZDMgJiAzKSA8PCA2KSB8IChlbmNvZGVkNCAmIDYzKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufTtcbnZhciBhcnJheVRvU3RyaW5nID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyYXlbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufTtcbmV4cG9ydCB2YXIgZGVjb21wcmVzc0pzb24gPSBmdW5jdGlvbiAoY29tcHJlc3NlZEpzb24pIHtcbiAgICByZXR1cm4gYXJyYXlUb1N0cmluZyhwYWtvLmluZmxhdGUoZGVjb2RlRnJvbUJhc2U2NChjb21wcmVzc2VkSnNvbikpKTtcbn07XG5leHBvcnQgdmFyIHBhZFN0YXJ0ID0gZnVuY3Rpb24gKHZhbHVlLCBsZW5ndGgsIHBhZENoYXIpIHtcbiAgICB2YXIgcGFkZGluZyA9ICcnO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxlbmd0aCAtIHZhbHVlLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBwYWRkaW5nICs9IHBhZENoYXI7XG4gICAgfVxuICAgIHJldHVybiBwYWRkaW5nICsgdmFsdWU7XG59O1xuIiwiaW1wb3J0IHBha28gZnJvbSAncGFrbyc7XG5cbnZhciBVUE5HID0ge307XG5cblx0XG5cblVQTkcudG9SR0JBOCA9IGZ1bmN0aW9uKG91dClcbntcblx0dmFyIHcgPSBvdXQud2lkdGgsIGggPSBvdXQuaGVpZ2h0O1xuXHRpZihvdXQudGFicy5hY1RMPT1udWxsKSByZXR1cm4gW1VQTkcudG9SR0JBOC5kZWNvZGVJbWFnZShvdXQuZGF0YSwgdywgaCwgb3V0KS5idWZmZXJdO1xuXHRcblx0dmFyIGZybXMgPSBbXTtcblx0aWYob3V0LmZyYW1lc1swXS5kYXRhPT1udWxsKSBvdXQuZnJhbWVzWzBdLmRhdGEgPSBvdXQuZGF0YTtcblx0XG5cdHZhciBsZW4gPSB3KmgqNCwgaW1nID0gbmV3IFVpbnQ4QXJyYXkobGVuKSwgZW1wdHkgPSBuZXcgVWludDhBcnJheShsZW4pLCBwcmV2PW5ldyBVaW50OEFycmF5KGxlbik7XG5cdGZvcih2YXIgaT0wOyBpPG91dC5mcmFtZXMubGVuZ3RoOyBpKyspXG5cdHtcblx0XHR2YXIgZnJtID0gb3V0LmZyYW1lc1tpXTtcblx0XHR2YXIgZng9ZnJtLnJlY3QueCwgZnk9ZnJtLnJlY3QueSwgZncgPSBmcm0ucmVjdC53aWR0aCwgZmggPSBmcm0ucmVjdC5oZWlnaHQ7XG5cdFx0dmFyIGZkYXRhID0gVVBORy50b1JHQkE4LmRlY29kZUltYWdlKGZybS5kYXRhLCBmdyxmaCwgb3V0KTtcblx0XHRcblx0XHRpZihpIT0wKSBmb3IodmFyIGo9MDsgajxsZW47IGorKykgcHJldltqXT1pbWdbal07XG5cdFx0XG5cdFx0aWYgICAgIChmcm0uYmxlbmQ9PTApIFVQTkcuX2NvcHlUaWxlKGZkYXRhLCBmdywgZmgsIGltZywgdywgaCwgZngsIGZ5LCAwKTtcblx0XHRlbHNlIGlmKGZybS5ibGVuZD09MSkgVVBORy5fY29weVRpbGUoZmRhdGEsIGZ3LCBmaCwgaW1nLCB3LCBoLCBmeCwgZnksIDEpO1xuXHRcdFxuXHRcdGZybXMucHVzaChpbWcuYnVmZmVyLnNsaWNlKDApKTtcblx0XHRcblx0XHRpZiAgICAgKGZybS5kaXNwb3NlPT0wKSB7fVxuXHRcdGVsc2UgaWYoZnJtLmRpc3Bvc2U9PTEpIFVQTkcuX2NvcHlUaWxlKGVtcHR5LCBmdywgZmgsIGltZywgdywgaCwgZngsIGZ5LCAwKTtcblx0XHRlbHNlIGlmKGZybS5kaXNwb3NlPT0yKSBmb3IodmFyIGo9MDsgajxsZW47IGorKykgaW1nW2pdPXByZXZbal07XG5cdH1cblx0cmV0dXJuIGZybXM7XG59XG5VUE5HLnRvUkdCQTguZGVjb2RlSW1hZ2UgPSBmdW5jdGlvbihkYXRhLCB3LCBoLCBvdXQpXG57XG5cdHZhciBhcmVhID0gdypoLCBicHAgPSBVUE5HLmRlY29kZS5fZ2V0QlBQKG91dCk7XG5cdHZhciBicGwgPSBNYXRoLmNlaWwodypicHAvOCk7XHQvLyBieXRlcyBwZXIgbGluZVxuXG5cdHZhciBiZiA9IG5ldyBVaW50OEFycmF5KGFyZWEqNCksIGJmMzIgPSBuZXcgVWludDMyQXJyYXkoYmYuYnVmZmVyKTtcblx0dmFyIGN0eXBlID0gb3V0LmN0eXBlLCBkZXB0aCA9IG91dC5kZXB0aDtcblx0dmFyIHJzID0gVVBORy5fYmluLnJlYWRVc2hvcnQ7XG5cdFxuXHQvL2NvbnNvbGUubG9nKGN0eXBlLCBkZXB0aCk7XG5cdHZhciB0aW1lID0gRGF0ZS5ub3coKTtcblxuXHRpZiAgICAgKGN0eXBlPT02KSB7IC8vIFJHQiArIGFscGhhXG5cdFx0dmFyIHFhcmVhID0gYXJlYTw8Mjtcblx0XHRpZihkZXB0aD09IDgpIGZvcih2YXIgaT0wOyBpPHFhcmVhO2krPTQpIHsgIGJmW2ldID0gZGF0YVtpXTsgIGJmW2krMV0gPSBkYXRhW2krMV07ICBiZltpKzJdID0gZGF0YVtpKzJdOyAgYmZbaSszXSA9IGRhdGFbaSszXTsgfVxuXHRcdGlmKGRlcHRoPT0xNikgZm9yKHZhciBpPTA7IGk8cWFyZWE7aSsrICkgeyAgYmZbaV0gPSBkYXRhW2k8PDFdOyAgfVxuXHR9XG5cdGVsc2UgaWYoY3R5cGU9PTIpIHtcdC8vIFJHQlxuXHRcdHZhciB0cz1vdXQudGFic1tcInRSTlNcIl07XG5cdFx0aWYodHM9PW51bGwpIHtcblx0XHRcdGlmKGRlcHRoPT0gOCkgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7ICB2YXIgdGk9aSozOyAgYmYzMltpXSA9ICgyNTU8PDI0KXwoZGF0YVt0aSsyXTw8MTYpfChkYXRhW3RpKzFdPDw4KXxkYXRhW3RpXTsgIH1cblx0XHRcdGlmKGRlcHRoPT0xNikgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7ICB2YXIgdGk9aSo2OyAgYmYzMltpXSA9ICgyNTU8PDI0KXwoZGF0YVt0aSs0XTw8MTYpfChkYXRhW3RpKzJdPDw4KXxkYXRhW3RpXTsgIH1cblx0XHR9XG5cdFx0ZWxzZSB7ICB2YXIgdHI9dHNbMF0sIHRnPXRzWzFdLCB0Yj10c1syXTtcblx0XHRcdGlmKGRlcHRoPT0gOCkgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7ICB2YXIgcWk9aTw8MiwgdGk9aSozOyAgYmYzMltpXSA9ICgyNTU8PDI0KXwoZGF0YVt0aSsyXTw8MTYpfChkYXRhW3RpKzFdPDw4KXxkYXRhW3RpXTtcblx0XHRcdFx0aWYoZGF0YVt0aV0gICA9PXRyICYmIGRhdGFbdGkrMV0gICA9PXRnICYmIGRhdGFbdGkrMl0gICA9PXRiKSBiZltxaSszXSA9IDA7ICB9XG5cdFx0XHRpZihkZXB0aD09MTYpIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHFpPWk8PDIsIHRpPWkqNjsgIGJmMzJbaV0gPSAoMjU1PDwyNCl8KGRhdGFbdGkrNF08PDE2KXwoZGF0YVt0aSsyXTw8OCl8ZGF0YVt0aV07XG5cdFx0XHRcdGlmKHJzKGRhdGEsdGkpPT10ciAmJiBycyhkYXRhLHRpKzIpPT10ZyAmJiBycyhkYXRhLHRpKzQpPT10YikgYmZbcWkrM10gPSAwOyAgfVxuXHRcdH1cblx0fVxuXHRlbHNlIGlmKGN0eXBlPT0zKSB7XHQvLyBwYWxldHRlXG5cdFx0dmFyIHA9b3V0LnRhYnNbXCJQTFRFXCJdLCBhcD1vdXQudGFic1tcInRSTlNcIl0sIHRsPWFwP2FwLmxlbmd0aDowO1xuXHRcdC8vY29uc29sZS5sb2cocCwgYXApO1xuXHRcdGlmKGRlcHRoPT0xKSBmb3IodmFyIHk9MDsgeTxoOyB5KyspIHsgIHZhciBzMCA9IHkqYnBsLCB0MCA9IHkqdztcblx0XHRcdGZvcih2YXIgaT0wOyBpPHc7IGkrKykgeyB2YXIgcWk9KHQwK2kpPDwyLCBqPSgoZGF0YVtzMCsoaT4+MyldPj4oNy0oKGkmNyk8PDApKSkmIDEpLCBjaj0zKmo7ICBiZltxaV09cFtjal07ICBiZltxaSsxXT1wW2NqKzFdOyAgYmZbcWkrMl09cFtjaisyXTsgIGJmW3FpKzNdPShqPHRsKT9hcFtqXToyNTU7ICB9XG5cdFx0fVxuXHRcdGlmKGRlcHRoPT0yKSBmb3IodmFyIHk9MDsgeTxoOyB5KyspIHsgIHZhciBzMCA9IHkqYnBsLCB0MCA9IHkqdztcblx0XHRcdGZvcih2YXIgaT0wOyBpPHc7IGkrKykgeyB2YXIgcWk9KHQwK2kpPDwyLCBqPSgoZGF0YVtzMCsoaT4+MildPj4oNi0oKGkmMyk8PDEpKSkmIDMpLCBjaj0zKmo7ICBiZltxaV09cFtjal07ICBiZltxaSsxXT1wW2NqKzFdOyAgYmZbcWkrMl09cFtjaisyXTsgIGJmW3FpKzNdPShqPHRsKT9hcFtqXToyNTU7ICB9XG5cdFx0fVxuXHRcdGlmKGRlcHRoPT00KSBmb3IodmFyIHk9MDsgeTxoOyB5KyspIHsgIHZhciBzMCA9IHkqYnBsLCB0MCA9IHkqdztcblx0XHRcdGZvcih2YXIgaT0wOyBpPHc7IGkrKykgeyB2YXIgcWk9KHQwK2kpPDwyLCBqPSgoZGF0YVtzMCsoaT4+MSldPj4oNC0oKGkmMSk8PDIpKSkmMTUpLCBjaj0zKmo7ICBiZltxaV09cFtjal07ICBiZltxaSsxXT1wW2NqKzFdOyAgYmZbcWkrMl09cFtjaisyXTsgIGJmW3FpKzNdPShqPHRsKT9hcFtqXToyNTU7ICB9XG5cdFx0fVxuXHRcdGlmKGRlcHRoPT04KSBmb3IodmFyIGk9MDsgaTxhcmVhOyBpKysgKSB7ICB2YXIgcWk9aTw8Miwgaj1kYXRhW2ldICAgICAgICAgICAgICAgICAgICAgICwgY2o9MypqOyAgYmZbcWldPXBbY2pdOyAgYmZbcWkrMV09cFtjaisxXTsgIGJmW3FpKzJdPXBbY2orMl07ICBiZltxaSszXT0oajx0bCk/YXBbal06MjU1OyAgfVxuXHR9XG5cdGVsc2UgaWYoY3R5cGU9PTQpIHtcdC8vIGdyYXkgKyBhbHBoYVxuXHRcdGlmKGRlcHRoPT0gOCkgIGZvcih2YXIgaT0wOyBpPGFyZWE7IGkrKykgeyAgdmFyIHFpPWk8PDIsIGRpPWk8PDEsIGdyPWRhdGFbZGldOyAgYmZbcWldPWdyOyAgYmZbcWkrMV09Z3I7ICBiZltxaSsyXT1ncjsgIGJmW3FpKzNdPWRhdGFbZGkrMV07ICB9XG5cdFx0aWYoZGVwdGg9PTE2KSAgZm9yKHZhciBpPTA7IGk8YXJlYTsgaSsrKSB7ICB2YXIgcWk9aTw8MiwgZGk9aTw8MiwgZ3I9ZGF0YVtkaV07ICBiZltxaV09Z3I7ICBiZltxaSsxXT1ncjsgIGJmW3FpKzJdPWdyOyAgYmZbcWkrM109ZGF0YVtkaSsyXTsgIH1cblx0fVxuXHRlbHNlIGlmKGN0eXBlPT0wKSB7XHQvLyBncmF5XG5cdFx0dmFyIHRyID0gb3V0LnRhYnNbXCJ0Uk5TXCJdID8gb3V0LnRhYnNbXCJ0Uk5TXCJdIDogLTE7XG5cdFx0Zm9yKHZhciB5PTA7IHk8aDsgeSsrKSB7XG5cdFx0XHR2YXIgb2ZmID0geSpicGwsIHRvID0geSp3O1xuXHRcdFx0aWYgICAgIChkZXB0aD09IDEpIGZvcih2YXIgeD0wOyB4PHc7IHgrKykgeyAgdmFyIGdyPTI1NSooKGRhdGFbb2ZmKyh4Pj4+MyldPj4+KDcgLSgoeCY3KSAgICkpKSYgMSksIGFsPShncj09dHIqMjU1KT8wOjI1NTsgIGJmMzJbdG8reF09KGFsPDwyNCl8KGdyPDwxNil8KGdyPDw4KXxncjsgIH1cblx0XHRcdGVsc2UgaWYoZGVwdGg9PSAyKSBmb3IodmFyIHg9MDsgeDx3OyB4KyspIHsgIHZhciBncj0gODUqKChkYXRhW29mZisoeD4+PjIpXT4+Pig2IC0oKHgmMyk8PDEpKSkmIDMpLCBhbD0oZ3I9PXRyKiA4NSk/MDoyNTU7ICBiZjMyW3RvK3hdPShhbDw8MjQpfChncjw8MTYpfChncjw8OCl8Z3I7ICB9XG5cdFx0XHRlbHNlIGlmKGRlcHRoPT0gNCkgZm9yKHZhciB4PTA7IHg8dzsgeCsrKSB7ICB2YXIgZ3I9IDE3KigoZGF0YVtvZmYrKHg+Pj4xKV0+Pj4oNCAtKCh4JjEpPDwyKSkpJjE1KSwgYWw9KGdyPT10ciogMTcpPzA6MjU1OyAgYmYzMlt0byt4XT0oYWw8PDI0KXwoZ3I8PDE2KXwoZ3I8PDgpfGdyOyAgfVxuXHRcdFx0ZWxzZSBpZihkZXB0aD09IDgpIGZvcih2YXIgeD0wOyB4PHc7IHgrKykgeyAgdmFyIGdyPWRhdGFbb2ZmKyAgICAgeF0sIGFsPShnciAgICAgICAgICAgICAgICAgPT10cik/MDoyNTU7ICBiZjMyW3RvK3hdPShhbDw8MjQpfChncjw8MTYpfChncjw8OCl8Z3I7ICB9XG5cdFx0XHRlbHNlIGlmKGRlcHRoPT0xNikgZm9yKHZhciB4PTA7IHg8dzsgeCsrKSB7ICB2YXIgZ3I9ZGF0YVtvZmYrKHg8PDEpXSwgYWw9KHJzKGRhdGEsb2ZmKyh4PDxpKSk9PXRyKT8wOjI1NTsgIGJmMzJbdG8reF09KGFsPDwyNCl8KGdyPDwxNil8KGdyPDw4KXxncjsgIH1cblx0XHR9XG5cdH1cblx0Ly9jb25zb2xlLmxvZyhEYXRlLm5vdygpLXRpbWUpO1xuXHRyZXR1cm4gYmY7XG59XG5cblxuXG5VUE5HLmRlY29kZSA9IGZ1bmN0aW9uKGJ1ZmYpXG57XG5cdHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoYnVmZiksIG9mZnNldCA9IDgsIGJpbiA9IFVQTkcuX2JpbiwgclVzID0gYmluLnJlYWRVc2hvcnQsIHJVaSA9IGJpbi5yZWFkVWludDtcblx0dmFyIG91dCA9IHt0YWJzOnt9LCBmcmFtZXM6W119O1xuXHR2YXIgZGQgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCksIGRvZmYgPSAwO1x0IC8vIHB1dCBhbGwgSURBVCBkYXRhIGludG8gaXRcblx0dmFyIGZkLCBmb2ZmID0gMDtcdC8vIGZyYW1lc1xuXHRcblx0dmFyIG1nY2sgPSBbMHg4OSwgMHg1MCwgMHg0ZSwgMHg0NywgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYV07XG5cdGZvcih2YXIgaT0wOyBpPDg7IGkrKykgaWYoZGF0YVtpXSE9bWdja1tpXSkgdGhyb3cgXCJUaGUgaW5wdXQgaXMgbm90IGEgUE5HIGZpbGUhXCI7XG5cblx0d2hpbGUob2Zmc2V0PGRhdGEubGVuZ3RoKVxuXHR7XG5cdFx0dmFyIGxlbiAgPSBiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KTsgIG9mZnNldCArPSA0O1xuXHRcdHZhciB0eXBlID0gYmluLnJlYWRBU0NJSShkYXRhLCBvZmZzZXQsIDQpOyAgb2Zmc2V0ICs9IDQ7XG5cdFx0Ly9jb25zb2xlLmxvZyh0eXBlLGxlbik7XG5cdFx0XG5cdFx0aWYgICAgICh0eXBlPT1cIklIRFJcIikgIHsgIFVQTkcuZGVjb2RlLl9JSERSKGRhdGEsIG9mZnNldCwgb3V0KTsgIH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiSURBVFwiKSB7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTxsZW47IGkrKykgZGRbZG9mZitpXSA9IGRhdGFbb2Zmc2V0K2ldO1xuXHRcdFx0ZG9mZiArPSBsZW47XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJhY1RMXCIpICB7XG5cdFx0XHRvdXQudGFic1t0eXBlXSA9IHsgIG51bV9mcmFtZXM6clVpKGRhdGEsIG9mZnNldCksIG51bV9wbGF5czpyVWkoZGF0YSwgb2Zmc2V0KzQpICB9O1xuXHRcdFx0ZmQgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJmY1RMXCIpICB7XG5cdFx0XHRpZihmb2ZmIT0wKSB7ICB2YXIgZnIgPSBvdXQuZnJhbWVzW291dC5mcmFtZXMubGVuZ3RoLTFdO1xuXHRcdFx0XHRmci5kYXRhID0gVVBORy5kZWNvZGUuX2RlY29tcHJlc3Mob3V0LCBmZC5zbGljZSgwLGZvZmYpLCBmci5yZWN0LndpZHRoLCBmci5yZWN0LmhlaWdodCk7ICBmb2ZmPTA7XG5cdFx0XHR9XG5cdFx0XHR2YXIgcmN0ID0ge3g6clVpKGRhdGEsIG9mZnNldCsxMikseTpyVWkoZGF0YSwgb2Zmc2V0KzE2KSx3aWR0aDpyVWkoZGF0YSwgb2Zmc2V0KzQpLGhlaWdodDpyVWkoZGF0YSwgb2Zmc2V0KzgpfTtcblx0XHRcdHZhciBkZWwgPSByVXMoZGF0YSwgb2Zmc2V0KzIyKTsgIGRlbCA9IHJVcyhkYXRhLCBvZmZzZXQrMjApIC8gKGRlbD09MD8xMDA6ZGVsKTtcblx0XHRcdHZhciBmcm0gPSB7cmVjdDpyY3QsIGRlbGF5Ok1hdGgucm91bmQoZGVsKjEwMDApLCBkaXNwb3NlOmRhdGFbb2Zmc2V0KzI0XSwgYmxlbmQ6ZGF0YVtvZmZzZXQrMjVdfTtcblx0XHRcdC8vY29uc29sZS5sb2coZnJtKTtcblx0XHRcdG91dC5mcmFtZXMucHVzaChmcm0pO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiZmRBVFwiKSB7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTxsZW4tNDsgaSsrKSBmZFtmb2ZmK2ldID0gZGF0YVtvZmZzZXQraSs0XTtcblx0XHRcdGZvZmYgKz0gbGVuLTQ7XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJwSFlzXCIpIHtcblx0XHRcdG91dC50YWJzW3R5cGVdID0gW2Jpbi5yZWFkVWludChkYXRhLCBvZmZzZXQpLCBiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KzQpLCBkYXRhW29mZnNldCs4XV07XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJjSFJNXCIpIHtcblx0XHRcdG91dC50YWJzW3R5cGVdID0gW107XG5cdFx0XHRmb3IodmFyIGk9MDsgaTw4OyBpKyspIG91dC50YWJzW3R5cGVdLnB1c2goYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCtpKjQpKTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cInRFWHRcIikge1xuXHRcdFx0aWYob3V0LnRhYnNbdHlwZV09PW51bGwpIG91dC50YWJzW3R5cGVdID0ge307XG5cdFx0XHR2YXIgbnogPSBiaW4ubmV4dFplcm8oZGF0YSwgb2Zmc2V0KTtcblx0XHRcdHZhciBrZXl3ID0gYmluLnJlYWRBU0NJSShkYXRhLCBvZmZzZXQsIG56LW9mZnNldCk7XG5cdFx0XHR2YXIgdGV4dCA9IGJpbi5yZWFkQVNDSUkoZGF0YSwgbnorMSwgb2Zmc2V0K2xlbi1uei0xKTtcblx0XHRcdG91dC50YWJzW3R5cGVdW2tleXddID0gdGV4dDtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cImlUWHRcIikge1xuXHRcdFx0aWYob3V0LnRhYnNbdHlwZV09PW51bGwpIG91dC50YWJzW3R5cGVdID0ge307XG5cdFx0XHR2YXIgbnogPSAwLCBvZmYgPSBvZmZzZXQ7XG5cdFx0XHRueiA9IGJpbi5uZXh0WmVybyhkYXRhLCBvZmYpO1xuXHRcdFx0dmFyIGtleXcgPSBiaW4ucmVhZEFTQ0lJKGRhdGEsIG9mZiwgbnotb2ZmKTsgIG9mZiA9IG56ICsgMTtcblx0XHRcdHZhciBjZmxhZyA9IGRhdGFbb2ZmXSwgY21ldGggPSBkYXRhW29mZisxXTsgIG9mZis9Mjtcblx0XHRcdG56ID0gYmluLm5leHRaZXJvKGRhdGEsIG9mZik7XG5cdFx0XHR2YXIgbHRhZyA9IGJpbi5yZWFkQVNDSUkoZGF0YSwgb2ZmLCBuei1vZmYpOyAgb2ZmID0gbnogKyAxO1xuXHRcdFx0bnogPSBiaW4ubmV4dFplcm8oZGF0YSwgb2ZmKTtcblx0XHRcdHZhciB0a2V5dyA9IGJpbi5yZWFkVVRGOChkYXRhLCBvZmYsIG56LW9mZik7ICBvZmYgPSBueiArIDE7XG5cdFx0XHR2YXIgdGV4dCAgPSBiaW4ucmVhZFVURjgoZGF0YSwgb2ZmLCBsZW4tKG9mZi1vZmZzZXQpKTtcblx0XHRcdG91dC50YWJzW3R5cGVdW2tleXddID0gdGV4dDtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cIlBMVEVcIikge1xuXHRcdFx0b3V0LnRhYnNbdHlwZV0gPSBiaW4ucmVhZEJ5dGVzKGRhdGEsIG9mZnNldCwgbGVuKTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cImhJU1RcIikge1xuXHRcdFx0dmFyIHBsID0gb3V0LnRhYnNbXCJQTFRFXCJdLmxlbmd0aC8zO1xuXHRcdFx0b3V0LnRhYnNbdHlwZV0gPSBbXTsgIGZvcih2YXIgaT0wOyBpPHBsOyBpKyspIG91dC50YWJzW3R5cGVdLnB1c2goclVzKGRhdGEsIG9mZnNldCtpKjIpKTtcblx0XHR9XG5cdFx0ZWxzZSBpZih0eXBlPT1cInRSTlNcIikge1xuXHRcdFx0aWYgICAgIChvdXQuY3R5cGU9PTMpIG91dC50YWJzW3R5cGVdID0gYmluLnJlYWRCeXRlcyhkYXRhLCBvZmZzZXQsIGxlbik7XG5cdFx0XHRlbHNlIGlmKG91dC5jdHlwZT09MCkgb3V0LnRhYnNbdHlwZV0gPSByVXMoZGF0YSwgb2Zmc2V0KTtcblx0XHRcdGVsc2UgaWYob3V0LmN0eXBlPT0yKSBvdXQudGFic1t0eXBlXSA9IFsgclVzKGRhdGEsb2Zmc2V0KSxyVXMoZGF0YSxvZmZzZXQrMiksclVzKGRhdGEsb2Zmc2V0KzQpIF07XG5cdFx0XHQvL2Vsc2UgY29uc29sZS5sb2coXCJ0Uk5TIGZvciB1bnN1cHBvcnRlZCBjb2xvciB0eXBlXCIsb3V0LmN0eXBlLCBsZW4pO1xuXHRcdH1cblx0XHRlbHNlIGlmKHR5cGU9PVwiZ0FNQVwiKSBvdXQudGFic1t0eXBlXSA9IGJpbi5yZWFkVWludChkYXRhLCBvZmZzZXQpLzEwMDAwMDtcblx0XHRlbHNlIGlmKHR5cGU9PVwic1JHQlwiKSBvdXQudGFic1t0eXBlXSA9IGRhdGFbb2Zmc2V0XTtcblx0XHRlbHNlIGlmKHR5cGU9PVwiYktHRFwiKVxuXHRcdHtcblx0XHRcdGlmICAgICAob3V0LmN0eXBlPT0wIHx8IG91dC5jdHlwZT09NCkgb3V0LnRhYnNbdHlwZV0gPSBbclVzKGRhdGEsIG9mZnNldCldO1xuXHRcdFx0ZWxzZSBpZihvdXQuY3R5cGU9PTIgfHwgb3V0LmN0eXBlPT02KSBvdXQudGFic1t0eXBlXSA9IFtyVXMoZGF0YSwgb2Zmc2V0KSwgclVzKGRhdGEsIG9mZnNldCsyKSwgclVzKGRhdGEsIG9mZnNldCs0KV07XG5cdFx0XHRlbHNlIGlmKG91dC5jdHlwZT09Mykgb3V0LnRhYnNbdHlwZV0gPSBkYXRhW29mZnNldF07XG5cdFx0fVxuXHRcdGVsc2UgaWYodHlwZT09XCJJRU5EXCIpIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHQvL2Vsc2UgeyAgbG9nKFwidW5rbm93biBjaHVuayB0eXBlXCIsIHR5cGUsIGxlbik7ICB9XG5cdFx0b2Zmc2V0ICs9IGxlbjtcblx0XHR2YXIgY3JjID0gYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCk7ICBvZmZzZXQgKz0gNDtcblx0fVxuXHRpZihmb2ZmIT0wKSB7ICB2YXIgZnIgPSBvdXQuZnJhbWVzW291dC5mcmFtZXMubGVuZ3RoLTFdO1xuXHRcdGZyLmRhdGEgPSBVUE5HLmRlY29kZS5fZGVjb21wcmVzcyhvdXQsIGZkLnNsaWNlKDAsZm9mZiksIGZyLnJlY3Qud2lkdGgsIGZyLnJlY3QuaGVpZ2h0KTsgIGZvZmY9MDtcblx0fVx0XG5cdG91dC5kYXRhID0gVVBORy5kZWNvZGUuX2RlY29tcHJlc3Mob3V0LCBkZCwgb3V0LndpZHRoLCBvdXQuaGVpZ2h0KTtcblx0XG5cdGRlbGV0ZSBvdXQuY29tcHJlc3M7ICBkZWxldGUgb3V0LmludGVybGFjZTsgIGRlbGV0ZSBvdXQuZmlsdGVyO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5VUE5HLmRlY29kZS5fZGVjb21wcmVzcyA9IGZ1bmN0aW9uKG91dCwgZGQsIHcsIGgpIHtcblx0dmFyIHRpbWUgPSBEYXRlLm5vdygpO1xuXHR2YXIgYnBwID0gVVBORy5kZWNvZGUuX2dldEJQUChvdXQpLCBicGwgPSBNYXRoLmNlaWwodypicHAvOCksIGJ1ZmYgPSBuZXcgVWludDhBcnJheSgoYnBsKzErb3V0LmludGVybGFjZSkqaCk7XG5cdGRkID0gVVBORy5kZWNvZGUuX2luZmxhdGUoZGQsYnVmZik7XG5cdC8vY29uc29sZS5sb2coZGQubGVuZ3RoLCBidWZmLmxlbmd0aCk7XG5cdC8vY29uc29sZS5sb2coRGF0ZS5ub3coKS10aW1lKTtcblxuXHR2YXIgdGltZT1EYXRlLm5vdygpO1xuXHRpZiAgICAgKG91dC5pbnRlcmxhY2U9PTApIGRkID0gVVBORy5kZWNvZGUuX2ZpbHRlclplcm8oZGQsIG91dCwgMCwgdywgaCk7XG5cdGVsc2UgaWYob3V0LmludGVybGFjZT09MSkgZGQgPSBVUE5HLmRlY29kZS5fcmVhZEludGVybGFjZShkZCwgb3V0KTtcblx0Ly9jb25zb2xlLmxvZyhEYXRlLm5vdygpLXRpbWUpO1xuXHRyZXR1cm4gZGQ7XG59XG5cblVQTkcuZGVjb2RlLl9pbmZsYXRlID0gZnVuY3Rpb24oZGF0YSwgYnVmZikgeyAgdmFyIG91dD1VUE5HW1wiaW5mbGF0ZVJhd1wiXShuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlciwgMixkYXRhLmxlbmd0aC02KSxidWZmKTsgIHJldHVybiBvdXQ7ICB9XG5VUE5HLmluZmxhdGVSYXc9ZnVuY3Rpb24oKXt2YXIgSD17fTtILkg9e307SC5ILk49ZnVuY3Rpb24oTixXKXt2YXIgUj1VaW50OEFycmF5LGk9MCxtPTAsSj0wLGg9MCxRPTAsWD0wLHU9MCx3PTAsZD0wLHYsQztcbmlmKE5bMF09PTMmJk5bMV09PTApcmV0dXJuIFc/VzpuZXcgUigwKTt2YXIgVj1ILkgsbj1WLmIsQT1WLmUsbD1WLlIsTT1WLm4sST1WLkEsZT1WLlosYj1WLm0sWj1XPT1udWxsO1xuaWYoWilXPW5ldyBSKE4ubGVuZ3RoPj4+Mjw8Myk7d2hpbGUoaT09MCl7aT1uKE4sZCwxKTttPW4oTixkKzEsMik7ZCs9MztpZihtPT0wKXtpZigoZCY3KSE9MClkKz04LShkJjcpO1xudmFyIEQ9KGQ+Pj4zKSs0LHE9TltELTRdfE5bRC0zXTw8ODtpZihaKVc9SC5ILlcoVyx3K3EpO1cuc2V0KG5ldyBSKE4uYnVmZmVyLE4uYnl0ZU9mZnNldCtELHEpLHcpO2Q9RCtxPDwzO1xudys9cTtjb250aW51ZX1pZihaKVc9SC5ILlcoVyx3KygxPDwxNykpO2lmKG09PTEpe3Y9Yi5KO0M9Yi5oO1g9KDE8PDkpLTE7dT0oMTw8NSktMX1pZihtPT0yKXtKPUEoTixkLDUpKzI1Nztcbmg9QShOLGQrNSw1KSsxO1E9QShOLGQrMTAsNCkrNDtkKz0xNDt2YXIgRT1kLGo9MTtmb3IodmFyIGM9MDtjPDM4O2MrPTIpe2IuUVtjXT0wO2IuUVtjKzFdPTB9Zm9yKHZhciBjPTA7XG5jPFE7YysrKXt2YXIgSz1BKE4sZCtjKjMsMyk7Yi5RWyhiLlhbY108PDEpKzFdPUs7aWYoSz5qKWo9S31kKz0zKlE7TShiLlEsaik7SShiLlEsaixiLnUpO3Y9Yi53O0M9Yi5kO1xuZD1sKGIudSwoMTw8aiktMSxKK2gsTixkLGIudik7dmFyIHI9Vi5WKGIudiwwLEosYi5DKTtYPSgxPDxyKS0xO3ZhciBTPVYuVihiLnYsSixoLGIuRCk7dT0oMTw8UyktMTtNKGIuQyxyKTtcbkkoYi5DLHIsdik7TShiLkQsUyk7SShiLkQsUyxDKX13aGlsZSghMCl7dmFyIFQ9dltlKE4sZCkmWF07ZCs9VCYxNTt2YXIgcD1UPj4+NDtpZihwPj4+OD09MCl7V1t3KytdPXB9ZWxzZSBpZihwPT0yNTYpe2JyZWFrfWVsc2V7dmFyIHo9dytwLTI1NDtcbmlmKHA+MjY0KXt2YXIgXz1iLnFbcC0yNTddO3o9dysoXz4+PjMpK0EoTixkLF8mNyk7ZCs9XyY3fXZhciAkPUNbZShOLGQpJnVdO2QrPSQmMTU7dmFyIHM9JD4+PjQsWT1iLmNbc10sYT0oWT4+PjQpK24oTixkLFkmMTUpO1xuZCs9WSYxNTt3aGlsZSh3PHope1dbd109V1t3KystYV07V1t3XT1XW3crKy1hXTtXW3ddPVdbdysrLWFdO1dbd109V1t3KystYV19dz16fX19cmV0dXJuIFcubGVuZ3RoPT13P1c6Vy5zbGljZSgwLHcpfTtcbkguSC5XPWZ1bmN0aW9uKE4sVyl7dmFyIFI9Ti5sZW5ndGg7aWYoVzw9UilyZXR1cm4gTjt2YXIgVj1uZXcgVWludDhBcnJheShSPDwxKTtWLnNldChOLDApO3JldHVybiBWfTtcbkguSC5SPWZ1bmN0aW9uKE4sVyxSLFYsbixBKXt2YXIgbD1ILkguZSxNPUguSC5aLEk9MDt3aGlsZShJPFIpe3ZhciBlPU5bTShWLG4pJlddO24rPWUmMTU7dmFyIGI9ZT4+PjQ7XG5pZihiPD0xNSl7QVtJXT1iO0krK31lbHNle3ZhciBaPTAsbT0wO2lmKGI9PTE2KXttPTMrbChWLG4sMik7bis9MjtaPUFbSS0xXX1lbHNlIGlmKGI9PTE3KXttPTMrbChWLG4sMyk7XG5uKz0zfWVsc2UgaWYoYj09MTgpe209MTErbChWLG4sNyk7bis9N312YXIgSj1JK207d2hpbGUoSTxKKXtBW0ldPVo7SSsrfX19cmV0dXJuIG59O0guSC5WPWZ1bmN0aW9uKE4sVyxSLFYpe3ZhciBuPTAsQT0wLGw9Vi5sZW5ndGg+Pj4xO1xud2hpbGUoQTxSKXt2YXIgTT1OW0ErV107VltBPDwxXT0wO1ZbKEE8PDEpKzFdPU07aWYoTT5uKW49TTtBKyt9d2hpbGUoQTxsKXtWW0E8PDFdPTA7VlsoQTw8MSkrMV09MDtBKyt9cmV0dXJuIG59O1xuSC5ILm49ZnVuY3Rpb24oTixXKXt2YXIgUj1ILkgubSxWPU4ubGVuZ3RoLG4sQSxsLE0sSSxlPVIuajtmb3IodmFyIE09MDtNPD1XO00rKyllW01dPTA7Zm9yKE09MTtNPFY7TSs9MillW05bTV1dKys7XG52YXIgYj1SLks7bj0wO2VbMF09MDtmb3IoQT0xO0E8PVc7QSsrKXtuPW4rZVtBLTFdPDwxO2JbQV09bn1mb3IobD0wO2w8VjtsKz0yKXtJPU5bbCsxXTtpZihJIT0wKXtOW2xdPWJbSV07XG5iW0ldKyt9fX07SC5ILkE9ZnVuY3Rpb24oTixXLFIpe3ZhciBWPU4ubGVuZ3RoLG49SC5ILm0sQT1uLnI7Zm9yKHZhciBsPTA7bDxWO2wrPTIpaWYoTltsKzFdIT0wKXt2YXIgTT1sPj4xLEk9TltsKzFdLGU9TTw8NHxJLGI9Vy1JLFo9TltsXTw8YixtPVorKDE8PGIpO1xud2hpbGUoWiE9bSl7dmFyIEo9QVtaXT4+PjE1LVc7UltKXT1lO1orK319fTtILkgubD1mdW5jdGlvbihOLFcpe3ZhciBSPUguSC5tLnIsVj0xNS1XO2Zvcih2YXIgbj0wO248Ti5sZW5ndGg7XG5uKz0yKXt2YXIgQT1OW25dPDxXLU5bbisxXTtOW25dPVJbQV0+Pj5WfX07SC5ILk09ZnVuY3Rpb24oTixXLFIpe1I9Ujw8KFcmNyk7dmFyIFY9Vz4+PjM7TltWXXw9UjtOW1YrMV18PVI+Pj44fTtcbkguSC5JPWZ1bmN0aW9uKE4sVyxSKXtSPVI8PChXJjcpO3ZhciBWPVc+Pj4zO05bVl18PVI7TltWKzFdfD1SPj4+ODtOW1YrMl18PVI+Pj4xNn07SC5ILmU9ZnVuY3Rpb24oTixXLFIpe3JldHVybihOW1c+Pj4zXXxOWyhXPj4+MykrMV08PDgpPj4+KFcmNykmKDE8PFIpLTF9O1xuSC5ILmI9ZnVuY3Rpb24oTixXLFIpe3JldHVybihOW1c+Pj4zXXxOWyhXPj4+MykrMV08PDh8TlsoVz4+PjMpKzJdPDwxNik+Pj4oVyY3KSYoMTw8UiktMX07SC5ILlo9ZnVuY3Rpb24oTixXKXtyZXR1cm4oTltXPj4+M118TlsoVz4+PjMpKzFdPDw4fE5bKFc+Pj4zKSsyXTw8MTYpPj4+KFcmNyl9O1xuSC5ILmk9ZnVuY3Rpb24oTixXKXtyZXR1cm4oTltXPj4+M118TlsoVz4+PjMpKzFdPDw4fE5bKFc+Pj4zKSsyXTw8MTZ8TlsoVz4+PjMpKzNdPDwyNCk+Pj4oVyY3KX07SC5ILm09ZnVuY3Rpb24oKXt2YXIgTj1VaW50MTZBcnJheSxXPVVpbnQzMkFycmF5O1xucmV0dXJue0s6bmV3IE4oMTYpLGo6bmV3IE4oMTYpLFg6WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLFM6WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsOTk5LDk5OSw5OTldLFQ6WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMCwwLDAsMF0scTpuZXcgTigzMikscDpbMSwyLDMsNCw1LDcsOSwxMywxNywyNSwzMyw0OSw2NSw5NywxMjksMTkzLDI1NywzODUsNTEzLDc2OSwxMDI1LDE1MzcsMjA0OSwzMDczLDQwOTcsNjE0NSw4MTkzLDEyMjg5LDE2Mzg1LDI0NTc3LDY1NTM1LDY1NTM1XSx6OlswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzLDAsMF0sYzpuZXcgVygzMiksSjpuZXcgTig1MTIpLF86W10saDpuZXcgTigzMiksJDpbXSx3Om5ldyBOKDMyNzY4KSxDOltdLHY6W10sZDpuZXcgTigzMjc2OCksRDpbXSx1Om5ldyBOKDUxMiksUTpbXSxyOm5ldyBOKDE8PDE1KSxzOm5ldyBXKDI4NiksWTpuZXcgVygzMCksYTpuZXcgVygxOSksdDpuZXcgVygxNWUzKSxrOm5ldyBOKDE8PDE2KSxnOm5ldyBOKDE8PDE1KX19KCk7XG4oZnVuY3Rpb24oKXt2YXIgTj1ILkgubSxXPTE8PDE1O2Zvcih2YXIgUj0wO1I8VztSKyspe3ZhciBWPVI7Vj0oViYyODYzMzExNTMwKT4+PjF8KFYmMTQzMTY1NTc2NSk8PDE7XG5WPShWJjM0MzU5NzM4MzYpPj4+MnwoViY4NTg5OTM0NTkpPDwyO1Y9KFYmNDA0MjMyMjE2MCk+Pj40fChWJjI1MjY0NTEzNSk8PDQ7Vj0oViY0Mjc4MjU1MzYwKT4+Pjh8KFYmMTY3MTE5MzUpPDw4O1xuTi5yW1JdPShWPj4+MTZ8Vjw8MTYpPj4+MTd9ZnVuY3Rpb24gbihBLGwsTSl7d2hpbGUobC0tIT0wKUEucHVzaCgwLE0pfWZvcih2YXIgUj0wO1I8MzI7UisrKXtOLnFbUl09Ti5TW1JdPDwzfE4uVFtSXTtcbk4uY1tSXT1OLnBbUl08PDR8Ti56W1JdfW4oTi5fLDE0NCw4KTtuKE4uXywyNTUtMTQzLDkpO24oTi5fLDI3OS0yNTUsNyk7bihOLl8sMjg3LTI3OSw4KTtILkgubihOLl8sOSk7XG5ILkguQShOLl8sOSxOLkopO0guSC5sKE4uXyw5KTtuKE4uJCwzMiw1KTtILkgubihOLiQsNSk7SC5ILkEoTi4kLDUsTi5oKTtILkgubChOLiQsNSk7bihOLlEsMTksMCk7bihOLkMsMjg2LDApO1xubihOLkQsMzAsMCk7bihOLnYsMzIwLDApfSgpKTtyZXR1cm4gSC5ILk59KClcblxuXG5VUE5HLmRlY29kZS5fcmVhZEludGVybGFjZSA9IGZ1bmN0aW9uKGRhdGEsIG91dClcbntcblx0dmFyIHcgPSBvdXQud2lkdGgsIGggPSBvdXQuaGVpZ2h0O1xuXHR2YXIgYnBwID0gVVBORy5kZWNvZGUuX2dldEJQUChvdXQpLCBjYnBwID0gYnBwPj4zLCBicGwgPSBNYXRoLmNlaWwodypicHAvOCk7XG5cdHZhciBpbWcgPSBuZXcgVWludDhBcnJheSggaCAqIGJwbCApO1xuXHR2YXIgZGkgPSAwO1xuXG5cdHZhciBzdGFydGluZ19yb3cgID0gWyAwLCAwLCA0LCAwLCAyLCAwLCAxIF07XG5cdHZhciBzdGFydGluZ19jb2wgID0gWyAwLCA0LCAwLCAyLCAwLCAxLCAwIF07XG5cdHZhciByb3dfaW5jcmVtZW50ID0gWyA4LCA4LCA4LCA0LCA0LCAyLCAyIF07XG5cdHZhciBjb2xfaW5jcmVtZW50ID0gWyA4LCA4LCA0LCA0LCAyLCAyLCAxIF07XG5cblx0dmFyIHBhc3M9MDtcblx0d2hpbGUocGFzczw3KVxuXHR7XG5cdFx0dmFyIHJpID0gcm93X2luY3JlbWVudFtwYXNzXSwgY2kgPSBjb2xfaW5jcmVtZW50W3Bhc3NdO1xuXHRcdHZhciBzdyA9IDAsIHNoID0gMDtcblx0XHR2YXIgY3IgPSBzdGFydGluZ19yb3dbcGFzc107ICB3aGlsZShjcjxoKSB7ICBjcis9cmk7ICBzaCsrOyAgfVxuXHRcdHZhciBjYyA9IHN0YXJ0aW5nX2NvbFtwYXNzXTsgIHdoaWxlKGNjPHcpIHsgIGNjKz1jaTsgIHN3Kys7ICB9XG5cdFx0dmFyIGJwbGwgPSBNYXRoLmNlaWwoc3cqYnBwLzgpO1xuXHRcdFVQTkcuZGVjb2RlLl9maWx0ZXJaZXJvKGRhdGEsIG91dCwgZGksIHN3LCBzaCk7XG5cblx0XHR2YXIgeT0wLCByb3cgPSBzdGFydGluZ19yb3dbcGFzc107XG5cdFx0d2hpbGUocm93PGgpXG5cdFx0e1xuXHRcdFx0dmFyIGNvbCA9IHN0YXJ0aW5nX2NvbFtwYXNzXTtcblx0XHRcdHZhciBjZGkgPSAoZGkreSpicGxsKTw8MztcblxuXHRcdFx0d2hpbGUoY29sPHcpXG5cdFx0XHR7XG5cdFx0XHRcdGlmKGJwcD09MSkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBkYXRhW2NkaT4+M107ICB2YWwgPSAodmFsPj4oNy0oY2RpJjcpKSkmMTtcblx0XHRcdFx0XHRpbWdbcm93KmJwbCArIChjb2w+PjMpXSB8PSAodmFsIDw8ICg3LSgoY29sJjcpPDwwKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKGJwcD09Mikge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBkYXRhW2NkaT4+M107ICB2YWwgPSAodmFsPj4oNi0oY2RpJjcpKSkmMztcblx0XHRcdFx0XHRpbWdbcm93KmJwbCArIChjb2w+PjIpXSB8PSAodmFsIDw8ICg2LSgoY29sJjMpPDwxKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmKGJwcD09NCkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBkYXRhW2NkaT4+M107ICB2YWwgPSAodmFsPj4oNC0oY2RpJjcpKSkmMTU7XG5cdFx0XHRcdFx0aW1nW3JvdypicGwgKyAoY29sPj4xKV0gfD0gKHZhbCA8PCAoNC0oKGNvbCYxKTw8MikpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZihicHA+PTgpIHtcblx0XHRcdFx0XHR2YXIgaWkgPSByb3cqYnBsK2NvbCpjYnBwO1xuXHRcdFx0XHRcdGZvcih2YXIgaj0wOyBqPGNicHA7IGorKykgaW1nW2lpK2pdID0gZGF0YVsoY2RpPj4zKStqXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjZGkrPWJwcDsgIGNvbCs9Y2k7XG5cdFx0XHR9XG5cdFx0XHR5Kys7ICByb3cgKz0gcmk7XG5cdFx0fVxuXHRcdGlmKHN3KnNoIT0wKSBkaSArPSBzaCAqICgxICsgYnBsbCk7XG5cdFx0cGFzcyA9IHBhc3MgKyAxO1xuXHR9XG5cdHJldHVybiBpbWc7XG59XG5cblVQTkcuZGVjb2RlLl9nZXRCUFAgPSBmdW5jdGlvbihvdXQpIHtcblx0dmFyIG5vYyA9IFsxLG51bGwsMywxLDIsbnVsbCw0XVtvdXQuY3R5cGVdO1xuXHRyZXR1cm4gbm9jICogb3V0LmRlcHRoO1xufVxuXG5VUE5HLmRlY29kZS5fZmlsdGVyWmVybyA9IGZ1bmN0aW9uKGRhdGEsIG91dCwgb2ZmLCB3LCBoKVxue1xuXHR2YXIgYnBwID0gVVBORy5kZWNvZGUuX2dldEJQUChvdXQpLCBicGwgPSBNYXRoLmNlaWwodypicHAvOCksIHBhZXRoID0gVVBORy5kZWNvZGUuX3BhZXRoO1xuXHRicHAgPSBNYXRoLmNlaWwoYnBwLzgpO1xuXHRcblx0dmFyIGk9MCwgZGk9MSwgdHlwZT1kYXRhW29mZl0sIHg9MDtcblx0XG5cdGlmKHR5cGU+MSkgZGF0YVtvZmZdPVswLDAsMV1bdHlwZS0yXTsgIFxuXHRpZih0eXBlPT0zKSBmb3IoeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbeCsxXSA9IChkYXRhW3grMV0gKyAoZGF0YVt4KzEtYnBwXT4+PjEpICkmMjU1O1xuXG5cdGZvcih2YXIgeT0wOyB5PGg7IHkrKykgIHtcblx0XHRpID0gb2ZmK3kqYnBsOyBkaSA9IGkreSsxO1xuXHRcdHR5cGUgPSBkYXRhW2RpLTFdOyB4PTA7XG5cblx0XHRpZiAgICAgKHR5cGU9PTApICAgZm9yKDsgeDxicGw7IHgrKykgZGF0YVtpK3hdID0gZGF0YVtkaSt4XTtcblx0XHRlbHNlIGlmKHR5cGU9PTEpIHsgZm9yKDsgeDxicHA7IHgrKykgZGF0YVtpK3hdID0gZGF0YVtkaSt4XTtcblx0XHRcdFx0XHRcdCAgIGZvcig7IHg8YnBsOyB4KyspIGRhdGFbaSt4XSA9IChkYXRhW2RpK3hdICsgZGF0YVtpK3gtYnBwXSk7ICB9XG5cdFx0ZWxzZSBpZih0eXBlPT0yKSB7IGZvcig7IHg8YnBsOyB4KyspIGRhdGFbaSt4XSA9IChkYXRhW2RpK3hdICsgZGF0YVtpK3gtYnBsXSk7ICB9XG5cdFx0ZWxzZSBpZih0eXBlPT0zKSB7IGZvcig7IHg8YnBwOyB4KyspIGRhdGFbaSt4XSA9IChkYXRhW2RpK3hdICsgKCBkYXRhW2kreC1icGxdPj4+MSkpO1xuXHRcdFx0ICAgICAgICAgICAgICAgZm9yKDsgeDxicGw7IHgrKykgZGF0YVtpK3hdID0gKGRhdGFbZGkreF0gKyAoKGRhdGFbaSt4LWJwbF0rZGF0YVtpK3gtYnBwXSk+Pj4xKSApOyAgfVxuXHRcdGVsc2UgICAgICAgICAgICAgeyBmb3IoOyB4PGJwcDsgeCsrKSBkYXRhW2kreF0gPSAoZGF0YVtkaSt4XSArIHBhZXRoKDAsIGRhdGFbaSt4LWJwbF0sIDApKTtcblx0XHRcdFx0XHRcdCAgIGZvcig7IHg8YnBsOyB4KyspIGRhdGFbaSt4XSA9IChkYXRhW2RpK3hdICsgcGFldGgoZGF0YVtpK3gtYnBwXSwgZGF0YVtpK3gtYnBsXSwgZGF0YVtpK3gtYnBwLWJwbF0pICk7ICB9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cblVQTkcuZGVjb2RlLl9wYWV0aCA9IGZ1bmN0aW9uKGEsYixjKVxue1xuXHR2YXIgcCA9IGErYi1jLCBwYSA9IChwLWEpLCBwYiA9IChwLWIpLCBwYyA9IChwLWMpO1xuXHRpZiAocGEqcGEgPD0gcGIqcGIgJiYgcGEqcGEgPD0gcGMqcGMpICByZXR1cm4gYTtcblx0ZWxzZSBpZiAocGIqcGIgPD0gcGMqcGMpICByZXR1cm4gYjtcblx0cmV0dXJuIGM7XG59XG5cblVQTkcuZGVjb2RlLl9JSERSID0gZnVuY3Rpb24oZGF0YSwgb2Zmc2V0LCBvdXQpXG57XG5cdHZhciBiaW4gPSBVUE5HLl9iaW47XG5cdG91dC53aWR0aCAgPSBiaW4ucmVhZFVpbnQoZGF0YSwgb2Zmc2V0KTsgIG9mZnNldCArPSA0O1xuXHRvdXQuaGVpZ2h0ID0gYmluLnJlYWRVaW50KGRhdGEsIG9mZnNldCk7ICBvZmZzZXQgKz0gNDtcblx0b3V0LmRlcHRoICAgICA9IGRhdGFbb2Zmc2V0XTsgIG9mZnNldCsrO1xuXHRvdXQuY3R5cGUgICAgID0gZGF0YVtvZmZzZXRdOyAgb2Zmc2V0Kys7XG5cdG91dC5jb21wcmVzcyAgPSBkYXRhW29mZnNldF07ICBvZmZzZXQrKztcblx0b3V0LmZpbHRlciAgICA9IGRhdGFbb2Zmc2V0XTsgIG9mZnNldCsrO1xuXHRvdXQuaW50ZXJsYWNlID0gZGF0YVtvZmZzZXRdOyAgb2Zmc2V0Kys7XG59XG5cblVQTkcuX2JpbiA9IHtcblx0bmV4dFplcm8gICA6IGZ1bmN0aW9uKGRhdGEscCkgIHsgIHdoaWxlKGRhdGFbcF0hPTApIHArKzsgIHJldHVybiBwOyAgfSxcblx0cmVhZFVzaG9ydCA6IGZ1bmN0aW9uKGJ1ZmYscCkgIHsgIHJldHVybiAoYnVmZltwXTw8IDgpIHwgYnVmZltwKzFdOyAgfSxcblx0d3JpdGVVc2hvcnQ6IGZ1bmN0aW9uKGJ1ZmYscCxuKXsgIGJ1ZmZbcF0gPSAobj4+OCkmMjU1OyAgYnVmZltwKzFdID0gbiYyNTU7ICB9LFxuXHRyZWFkVWludCAgIDogZnVuY3Rpb24oYnVmZixwKSAgeyAgcmV0dXJuIChidWZmW3BdKigyNTYqMjU2KjI1NikpICsgKChidWZmW3ArMV08PDE2KSB8IChidWZmW3ArMl08PCA4KSB8IGJ1ZmZbcCszXSk7ICB9LFxuXHR3cml0ZVVpbnQgIDogZnVuY3Rpb24oYnVmZixwLG4peyAgYnVmZltwXT0obj4+MjQpJjI1NTsgIGJ1ZmZbcCsxXT0obj4+MTYpJjI1NTsgIGJ1ZmZbcCsyXT0obj4+OCkmMjU1OyAgYnVmZltwKzNdPW4mMjU1OyAgfSxcblx0cmVhZEFTQ0lJICA6IGZ1bmN0aW9uKGJ1ZmYscCxsKXsgIHZhciBzID0gXCJcIjsgIGZvcih2YXIgaT0wOyBpPGw7IGkrKykgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZmZbcCtpXSk7ICByZXR1cm4gczsgICAgfSxcblx0d3JpdGVBU0NJSSA6IGZ1bmN0aW9uKGRhdGEscCxzKXsgIGZvcih2YXIgaT0wOyBpPHMubGVuZ3RoOyBpKyspIGRhdGFbcCtpXSA9IHMuY2hhckNvZGVBdChpKTsgIH0sXG5cdHJlYWRCeXRlcyAgOiBmdW5jdGlvbihidWZmLHAsbCl7ICB2YXIgYXJyID0gW107ICAgZm9yKHZhciBpPTA7IGk8bDsgaSsrKSBhcnIucHVzaChidWZmW3AraV0pOyAgIHJldHVybiBhcnI7ICB9LFxuXHRwYWQgOiBmdW5jdGlvbihuKSB7IHJldHVybiBuLmxlbmd0aCA8IDIgPyBcIjBcIiArIG4gOiBuOyB9LFxuXHRyZWFkVVRGOCA6IGZ1bmN0aW9uKGJ1ZmYsIHAsIGwpIHtcblx0XHR2YXIgcyA9IFwiXCIsIG5zO1xuXHRcdGZvcih2YXIgaT0wOyBpPGw7IGkrKykgcyArPSBcIiVcIiArIFVQTkcuX2Jpbi5wYWQoYnVmZltwK2ldLnRvU3RyaW5nKDE2KSk7XG5cdFx0dHJ5IHsgIG5zID0gZGVjb2RlVVJJQ29tcG9uZW50KHMpOyB9XG5cdFx0Y2F0Y2goZSkgeyAgcmV0dXJuIFVQTkcuX2Jpbi5yZWFkQVNDSUkoYnVmZiwgcCwgbCk7ICB9XG5cdFx0cmV0dXJuICBucztcblx0fVxufVxuVVBORy5fY29weVRpbGUgPSBmdW5jdGlvbihzYiwgc3csIHNoLCB0YiwgdHcsIHRoLCB4b2ZmLCB5b2ZmLCBtb2RlKVxue1xuXHR2YXIgdyA9IE1hdGgubWluKHN3LHR3KSwgaCA9IE1hdGgubWluKHNoLHRoKTtcblx0dmFyIHNpPTAsIHRpPTA7XG5cdGZvcih2YXIgeT0wOyB5PGg7IHkrKylcblx0XHRmb3IodmFyIHg9MDsgeDx3OyB4KyspXG5cdFx0e1xuXHRcdFx0aWYoeG9mZj49MCAmJiB5b2ZmPj0wKSB7ICBzaSA9ICh5KnN3K3gpPDwyOyAgdGkgPSAoKCB5b2ZmK3kpKnR3K3hvZmYreCk8PDI7ICB9XG5cdFx0XHRlbHNlICAgICAgICAgICAgICAgICAgIHsgIHNpID0gKCgteW9mZit5KSpzdy14b2ZmK3gpPDwyOyAgdGkgPSAoeSp0dyt4KTw8MjsgIH1cblx0XHRcdFxuXHRcdFx0aWYgICAgIChtb2RlPT0wKSB7ICB0Ylt0aV0gPSBzYltzaV07ICB0Ylt0aSsxXSA9IHNiW3NpKzFdOyAgdGJbdGkrMl0gPSBzYltzaSsyXTsgIHRiW3RpKzNdID0gc2Jbc2krM107ICB9XG5cdFx0XHRlbHNlIGlmKG1vZGU9PTEpIHtcblx0XHRcdFx0dmFyIGZhID0gc2Jbc2krM10qKDEvMjU1KSwgZnI9c2Jbc2ldKmZhLCBmZz1zYltzaSsxXSpmYSwgZmI9c2Jbc2krMl0qZmE7IFxuXHRcdFx0XHR2YXIgYmEgPSB0Ylt0aSszXSooMS8yNTUpLCBicj10Ylt0aV0qYmEsIGJnPXRiW3RpKzFdKmJhLCBiYj10Ylt0aSsyXSpiYTsgXG5cdFx0XHRcdFxuXHRcdFx0XHR2YXIgaWZhPTEtZmEsIG9hID0gZmErYmEqaWZhLCBpb2EgPSAob2E9PTA/MDoxL29hKTtcblx0XHRcdFx0dGJbdGkrM10gPSAyNTUqb2E7ICBcblx0XHRcdFx0dGJbdGkrMF0gPSAoZnIrYnIqaWZhKSppb2E7ICBcblx0XHRcdFx0dGJbdGkrMV0gPSAoZmcrYmcqaWZhKSppb2E7ICAgXG5cdFx0XHRcdHRiW3RpKzJdID0gKGZiK2JiKmlmYSkqaW9hOyAgXG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKG1vZGU9PTIpe1x0Ly8gY29weSBvbmx5IGRpZmZlcmVuY2VzLCBvdGhlcndpc2UgemVyb1xuXHRcdFx0XHR2YXIgZmEgPSBzYltzaSszXSwgZnI9c2Jbc2ldLCBmZz1zYltzaSsxXSwgZmI9c2Jbc2krMl07IFxuXHRcdFx0XHR2YXIgYmEgPSB0Ylt0aSszXSwgYnI9dGJbdGldLCBiZz10Ylt0aSsxXSwgYmI9dGJbdGkrMl07IFxuXHRcdFx0XHRpZihmYT09YmEgJiYgZnI9PWJyICYmIGZnPT1iZyAmJiBmYj09YmIpIHsgIHRiW3RpXT0wOyAgdGJbdGkrMV09MDsgIHRiW3RpKzJdPTA7ICB0Ylt0aSszXT0wOyAgfVxuXHRcdFx0XHRlbHNlIHsgIHRiW3RpXT1mcjsgIHRiW3RpKzFdPWZnOyAgdGJbdGkrMl09ZmI7ICB0Ylt0aSszXT1mYTsgIH1cblx0XHRcdH1cblx0XHRcdGVsc2UgaWYobW9kZT09Myl7XHQvLyBjaGVjayBpZiBjYW4gYmUgYmxlbmRlZFxuXHRcdFx0XHR2YXIgZmEgPSBzYltzaSszXSwgZnI9c2Jbc2ldLCBmZz1zYltzaSsxXSwgZmI9c2Jbc2krMl07IFxuXHRcdFx0XHR2YXIgYmEgPSB0Ylt0aSszXSwgYnI9dGJbdGldLCBiZz10Ylt0aSsxXSwgYmI9dGJbdGkrMl07IFxuXHRcdFx0XHRpZihmYT09YmEgJiYgZnI9PWJyICYmIGZnPT1iZyAmJiBmYj09YmIpIGNvbnRpbnVlO1xuXHRcdFx0XHQvL2lmKGZhIT0yNTUgJiYgYmEhPTApIHJldHVybiBmYWxzZTtcblx0XHRcdFx0aWYoZmE8MjIwICYmIGJhPjIwKSByZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuXG5cblxuVVBORy5lbmNvZGUgPSBmdW5jdGlvbihidWZzLCB3LCBoLCBwcywgZGVscywgdGFicywgZm9yYmlkUGx0ZSlcbntcblx0aWYocHM9PW51bGwpIHBzPTA7XG5cdGlmKGZvcmJpZFBsdGU9PW51bGwpIGZvcmJpZFBsdGUgPSBmYWxzZTtcblxuXHR2YXIgbmltZyA9IFVQTkcuZW5jb2RlLmNvbXByZXNzKGJ1ZnMsIHcsIGgsIHBzLCBbZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCwgZm9yYmlkUGx0ZV0pO1xuXHRVUE5HLmVuY29kZS5jb21wcmVzc1BORyhuaW1nLCAtMSk7XG5cdFxuXHRyZXR1cm4gVVBORy5lbmNvZGUuX21haW4obmltZywgdywgaCwgZGVscywgdGFicyk7XG59XG5cblVQTkcuZW5jb2RlTEwgPSBmdW5jdGlvbihidWZzLCB3LCBoLCBjYywgYWMsIGRlcHRoLCBkZWxzLCB0YWJzKSB7XG5cdHZhciBuaW1nID0geyAgY3R5cGU6IDAgKyAoY2M9PTEgPyAwIDogMikgKyAoYWM9PTAgPyAwIDogNCksICAgICAgZGVwdGg6IGRlcHRoLCAgZnJhbWVzOiBbXSAgfTtcblx0XG5cdHZhciB0aW1lID0gRGF0ZS5ub3coKTtcblx0dmFyIGJpcHAgPSAoY2MrYWMpKmRlcHRoLCBiaXBsID0gYmlwcCAqIHc7XG5cdGZvcih2YXIgaT0wOyBpPGJ1ZnMubGVuZ3RoOyBpKyspXG5cdFx0bmltZy5mcmFtZXMucHVzaCh7ICByZWN0Ont4OjAseTowLHdpZHRoOncsaGVpZ2h0Omh9LCAgaW1nOm5ldyBVaW50OEFycmF5KGJ1ZnNbaV0pLCBibGVuZDowLCBkaXNwb3NlOjEsIGJwcDpNYXRoLmNlaWwoYmlwcC84KSwgYnBsOk1hdGguY2VpbChiaXBsLzgpICB9KTtcblx0XG5cdFVQTkcuZW5jb2RlLmNvbXByZXNzUE5HKG5pbWcsIDAsIHRydWUpO1xuXHRcblx0dmFyIG91dCA9IFVQTkcuZW5jb2RlLl9tYWluKG5pbWcsIHcsIGgsIGRlbHMsIHRhYnMpO1xuXHRyZXR1cm4gb3V0O1xufVxuXG5VUE5HLmVuY29kZS5fbWFpbiA9IGZ1bmN0aW9uKG5pbWcsIHcsIGgsIGRlbHMsIHRhYnMpIHtcblx0aWYodGFicz09bnVsbCkgdGFicz17fTtcblx0dmFyIGNyYyA9IFVQTkcuY3JjLmNyYywgd1VpID0gVVBORy5fYmluLndyaXRlVWludCwgd1VzID0gVVBORy5fYmluLndyaXRlVXNob3J0LCB3QXMgPSBVUE5HLl9iaW4ud3JpdGVBU0NJSTtcblx0dmFyIG9mZnNldCA9IDgsIGFuaW0gPSBuaW1nLmZyYW1lcy5sZW5ndGg+MSwgcGx0QWxwaGEgPSBmYWxzZTtcblx0XG5cdHZhciBsZW5nID0gOCArICgxNis1KzQpIC8qKyAoOSs0KSovICsgKGFuaW0gPyAyMCA6IDApO1xuXHRpZih0YWJzW1wic1JHQlwiXSE9bnVsbCkgbGVuZyArPSA4KzErNDtcblx0aWYodGFic1tcInBIWXNcIl0hPW51bGwpIGxlbmcgKz0gOCs5KzQ7XG5cdGlmKG5pbWcuY3R5cGU9PTMpIHtcblx0XHR2YXIgZGwgPSBuaW1nLnBsdGUubGVuZ3RoO1xuXHRcdGZvcih2YXIgaT0wOyBpPGRsOyBpKyspIGlmKChuaW1nLnBsdGVbaV0+Pj4yNCkhPTI1NSkgcGx0QWxwaGEgPSB0cnVlO1xuXHRcdGxlbmcgKz0gKDggKyBkbCozICsgNCkgKyAocGx0QWxwaGEgPyAoOCArIGRsKjEgKyA0KSA6IDApO1xuXHR9XG5cdGZvcih2YXIgaj0wOyBqPG5pbWcuZnJhbWVzLmxlbmd0aDsgaisrKVxuXHR7XG5cdFx0dmFyIGZyID0gbmltZy5mcmFtZXNbal07XG5cdFx0aWYoYW5pbSkgbGVuZyArPSAzODtcblx0XHRsZW5nICs9IGZyLmNpbWcubGVuZ3RoICsgMTI7XG5cdFx0aWYoaiE9MCkgbGVuZys9NDtcblx0fVxuXHRsZW5nICs9IDEyOyBcblx0XG5cdHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkobGVuZyk7XG5cdHZhciB3cj1bMHg4OSwgMHg1MCwgMHg0ZSwgMHg0NywgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYV07XG5cdGZvcih2YXIgaT0wOyBpPDg7IGkrKykgZGF0YVtpXT13cltpXTtcblx0XG5cdHdVaShkYXRhLG9mZnNldCwgMTMpOyAgICAgb2Zmc2V0Kz00O1xuXHR3QXMoZGF0YSxvZmZzZXQsXCJJSERSXCIpOyAgb2Zmc2V0Kz00O1xuXHR3VWkoZGF0YSxvZmZzZXQsdyk7ICBvZmZzZXQrPTQ7XG5cdHdVaShkYXRhLG9mZnNldCxoKTsgIG9mZnNldCs9NDtcblx0ZGF0YVtvZmZzZXRdID0gbmltZy5kZXB0aDsgIG9mZnNldCsrOyAgLy8gZGVwdGhcblx0ZGF0YVtvZmZzZXRdID0gbmltZy5jdHlwZTsgIG9mZnNldCsrOyAgLy8gY3R5cGVcblx0ZGF0YVtvZmZzZXRdID0gMDsgIG9mZnNldCsrOyAgLy8gY29tcHJlc3Ncblx0ZGF0YVtvZmZzZXRdID0gMDsgIG9mZnNldCsrOyAgLy8gZmlsdGVyXG5cdGRhdGFbb2Zmc2V0XSA9IDA7ICBvZmZzZXQrKzsgIC8vIGludGVybGFjZVxuXHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTE3LDE3KSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXG5cdC8vIDEzIGJ5dGVzIHRvIHNheSwgdGhhdCBpdCBpcyBzUkdCXG5cdGlmKHRhYnNbXCJzUkdCXCJdIT1udWxsKSB7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCAxKTsgICAgICBvZmZzZXQrPTQ7XG5cdFx0d0FzKGRhdGEsb2Zmc2V0LFwic1JHQlwiKTsgIG9mZnNldCs9NDtcblx0XHRkYXRhW29mZnNldF0gPSB0YWJzW1wic1JHQlwiXTsgIG9mZnNldCsrO1xuXHRcdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtNSw1KSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXHR9XG5cdGlmKHRhYnNbXCJwSFlzXCJdIT1udWxsKSB7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCA5KTsgICAgICBvZmZzZXQrPTQ7XG5cdFx0d0FzKGRhdGEsb2Zmc2V0LFwicEhZc1wiKTsgIG9mZnNldCs9NDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIHRhYnNbXCJwSFlzXCJdWzBdKTsgICAgICBvZmZzZXQrPTQ7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCB0YWJzW1wicEhZc1wiXVsxXSk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdGRhdGFbb2Zmc2V0XT10YWJzW1wicEhZc1wiXVsyXTtcdFx0XHRvZmZzZXQrKztcblx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTEzLDEzKSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXHR9XG5cblx0aWYoYW5pbSkge1xuXHRcdHdVaShkYXRhLG9mZnNldCwgOCk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdHdBcyhkYXRhLG9mZnNldCxcImFjVExcIik7ICBvZmZzZXQrPTQ7XG5cdFx0d1VpKGRhdGEsb2Zmc2V0LCBuaW1nLmZyYW1lcy5sZW5ndGgpOyAgICAgb2Zmc2V0Kz00O1xuXHRcdHdVaShkYXRhLG9mZnNldCwgdGFic1tcImxvb3BcIl0hPW51bGw/dGFic1tcImxvb3BcIl06MCk7ICAgICAgb2Zmc2V0Kz00O1xuXHRcdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtMTIsMTIpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cdH1cblxuXHRpZihuaW1nLmN0eXBlPT0zKSB7XG5cdFx0dmFyIGRsID0gbmltZy5wbHRlLmxlbmd0aDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsIGRsKjMpOyAgb2Zmc2V0Kz00O1xuXHRcdHdBcyhkYXRhLG9mZnNldCxcIlBMVEVcIik7ICBvZmZzZXQrPTQ7XG5cdFx0Zm9yKHZhciBpPTA7IGk8ZGw7IGkrKyl7XG5cdFx0XHR2YXIgdGk9aSozLCBjPW5pbWcucGx0ZVtpXSwgcj0oYykmMjU1LCBnPShjPj4+OCkmMjU1LCBiPShjPj4+MTYpJjI1NTtcblx0XHRcdGRhdGFbb2Zmc2V0K3RpKzBdPXI7ICBkYXRhW29mZnNldCt0aSsxXT1nOyAgZGF0YVtvZmZzZXQrdGkrMl09Yjtcblx0XHR9XG5cdFx0b2Zmc2V0Kz1kbCozO1xuXHRcdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtZGwqMy00LGRsKjMrNCkpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblxuXHRcdGlmKHBsdEFscGhhKSB7XG5cdFx0XHR3VWkoZGF0YSxvZmZzZXQsIGRsKTsgIG9mZnNldCs9NDtcblx0XHRcdHdBcyhkYXRhLG9mZnNldCxcInRSTlNcIik7ICBvZmZzZXQrPTQ7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTxkbDsgaSsrKSAgZGF0YVtvZmZzZXQraV09KG5pbWcucGx0ZVtpXT4+PjI0KSYyNTU7XG5cdFx0XHRvZmZzZXQrPWRsO1xuXHRcdFx0d1VpKGRhdGEsb2Zmc2V0LGNyYyhkYXRhLG9mZnNldC1kbC00LGRsKzQpKTsgIG9mZnNldCs9NDsgLy8gY3JjXG5cdFx0fVxuXHR9XG5cdFxuXHR2YXIgZmkgPSAwO1xuXHRmb3IodmFyIGo9MDsgajxuaW1nLmZyYW1lcy5sZW5ndGg7IGorKylcblx0e1xuXHRcdHZhciBmciA9IG5pbWcuZnJhbWVzW2pdO1xuXHRcdGlmKGFuaW0pIHtcblx0XHRcdHdVaShkYXRhLCBvZmZzZXQsIDI2KTsgICAgIG9mZnNldCs9NDtcblx0XHRcdHdBcyhkYXRhLCBvZmZzZXQsXCJmY1RMXCIpOyAgb2Zmc2V0Kz00O1xuXHRcdFx0d1VpKGRhdGEsIG9mZnNldCwgZmkrKyk7ICAgb2Zmc2V0Kz00O1xuXHRcdFx0d1VpKGRhdGEsIG9mZnNldCwgZnIucmVjdC53aWR0aCApOyAgIG9mZnNldCs9NDtcblx0XHRcdHdVaShkYXRhLCBvZmZzZXQsIGZyLnJlY3QuaGVpZ2h0KTsgICBvZmZzZXQrPTQ7XG5cdFx0XHR3VWkoZGF0YSwgb2Zmc2V0LCBmci5yZWN0LngpOyAgIG9mZnNldCs9NDtcblx0XHRcdHdVaShkYXRhLCBvZmZzZXQsIGZyLnJlY3QueSk7ICAgb2Zmc2V0Kz00O1xuXHRcdFx0d1VzKGRhdGEsIG9mZnNldCwgZGVsc1tqXSk7ICAgb2Zmc2V0Kz0yO1xuXHRcdFx0d1VzKGRhdGEsIG9mZnNldCwgIDEwMDApOyAgIG9mZnNldCs9Mjtcblx0XHRcdGRhdGFbb2Zmc2V0XSA9IGZyLmRpc3Bvc2U7ICBvZmZzZXQrKztcdC8vIGRpc3Bvc2Vcblx0XHRcdGRhdGFbb2Zmc2V0XSA9IGZyLmJsZW5kICA7ICBvZmZzZXQrKztcdC8vIGJsZW5kXG5cdFx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsb2Zmc2V0LTMwLDMwKSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXHRcdH1cblx0XHRcdFx0XG5cdFx0dmFyIGltZ2QgPSBmci5jaW1nLCBkbCA9IGltZ2QubGVuZ3RoO1xuXHRcdHdVaShkYXRhLG9mZnNldCwgZGwrKGo9PTA/MDo0KSk7ICAgICBvZmZzZXQrPTQ7XG5cdFx0dmFyIGlvZmYgPSBvZmZzZXQ7XG5cdFx0d0FzKGRhdGEsb2Zmc2V0LChqPT0wKT9cIklEQVRcIjpcImZkQVRcIik7ICBvZmZzZXQrPTQ7XG5cdFx0aWYoaiE9MCkgeyAgd1VpKGRhdGEsIG9mZnNldCwgZmkrKyk7ICBvZmZzZXQrPTQ7ICB9XG5cdFx0ZGF0YS5zZXQoaW1nZCxvZmZzZXQpO1xuXHRcdG9mZnNldCArPSBkbDtcblx0XHR3VWkoZGF0YSxvZmZzZXQsY3JjKGRhdGEsaW9mZixvZmZzZXQtaW9mZikpOyAgb2Zmc2V0Kz00OyAvLyBjcmNcblx0fVxuXG5cdHdVaShkYXRhLG9mZnNldCwgMCk7ICAgICBvZmZzZXQrPTQ7XG5cdHdBcyhkYXRhLG9mZnNldCxcIklFTkRcIik7ICBvZmZzZXQrPTQ7XG5cdHdVaShkYXRhLG9mZnNldCxjcmMoZGF0YSxvZmZzZXQtNCw0KSk7ICBvZmZzZXQrPTQ7IC8vIGNyY1xuXG5cdHJldHVybiBkYXRhLmJ1ZmZlcjtcbn1cblxuVVBORy5lbmNvZGUuY29tcHJlc3NQTkcgPSBmdW5jdGlvbihvdXQsIGZpbHRlciwgbGV2ZWxaZXJvKSB7XG5cdGZvcih2YXIgaT0wOyBpPG91dC5mcmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgZnJtID0gb3V0LmZyYW1lc1tpXSwgbnc9ZnJtLnJlY3Qud2lkdGgsIG5oPWZybS5yZWN0LmhlaWdodDtcblx0XHR2YXIgZmRhdGEgPSBuZXcgVWludDhBcnJheShuaCpmcm0uYnBsK25oKTtcblx0XHRmcm0uY2ltZyA9IFVQTkcuZW5jb2RlLl9maWx0ZXJaZXJvKGZybS5pbWcsbmgsZnJtLmJwcCxmcm0uYnBsLGZkYXRhLCBmaWx0ZXIsIGxldmVsWmVybyk7XG5cdH1cbn1cblxuXG5cblVQTkcuZW5jb2RlLmNvbXByZXNzID0gZnVuY3Rpb24oYnVmcywgdywgaCwgcHMsIHBybXMpIC8vIHBybXM6ICBvbmx5QmxlbmQsIG1pbkJpdHMsIGZvcmJpZFBsdGVcbntcblx0Ly92YXIgdGltZSA9IERhdGUubm93KCk7XG5cdHZhciBvbmx5QmxlbmQgPSBwcm1zWzBdLCBldmVuQ3JkID0gcHJtc1sxXSwgZm9yYmlkUHJldiA9IHBybXNbMl0sIG1pbkJpdHMgPSBwcm1zWzNdLCBmb3JiaWRQbHRlID0gcHJtc1s0XTtcblx0XG5cdHZhciBjdHlwZSA9IDYsIGRlcHRoID0gOCwgYWxwaGFBbmQ9MjU1XG5cdFxuXHRmb3IodmFyIGo9MDsgajxidWZzLmxlbmd0aDsgaisrKSAgeyAgLy8gd2hlbiBub3QgcXVhbnRpemVkLCBvdGhlciBmcmFtZXMgY2FuIGNvbnRhaW4gY29sb3JzLCB0aGF0IGFyZSBub3QgaW4gYW4gaW5pdGlhbCBmcmFtZVxuXHRcdHZhciBpbWcgPSBuZXcgVWludDhBcnJheShidWZzW2pdKSwgaWxlbiA9IGltZy5sZW5ndGg7XG5cdFx0Zm9yKHZhciBpPTA7IGk8aWxlbjsgaSs9NCkgYWxwaGFBbmQgJj0gaW1nW2krM107XG5cdH1cblx0dmFyIGdvdEFscGhhID0gKGFscGhhQW5kIT0yNTUpO1xuXHRcblx0Ly9jb25zb2xlLmxvZyhcImFscGhhIGNoZWNrXCIsIERhdGUubm93KCktdGltZSk7ICB0aW1lID0gRGF0ZS5ub3coKTtcblx0XG5cdC8vdmFyIGJydXRlID0gZ290QWxwaGEgJiYgZm9yR0lGO1x0XHQvLyBicnV0ZSA6IGZyYW1lcyBjYW4gb25seSBiZSBjb3BpZWQsIG5vdCBcImJsZW5kZWRcIlxuXHR2YXIgZnJtcyA9IFVQTkcuZW5jb2RlLmZyYW1pemUoYnVmcywgdywgaCwgb25seUJsZW5kLCBldmVuQ3JkLCBmb3JiaWRQcmV2KTtcblx0Ly9jb25zb2xlLmxvZyhcImZyYW1pemVcIiwgRGF0ZS5ub3coKS10aW1lKTsgIHRpbWUgPSBEYXRlLm5vdygpO1xuXHRcblx0dmFyIGNtYXA9e30sIHBsdGU9W10sIGluZHM9W107ICBcblx0XG5cdGlmKHBzIT0wKSB7XG5cdFx0dmFyIG5idWZzID0gW107ICBmb3IodmFyIGk9MDsgaTxmcm1zLmxlbmd0aDsgaSsrKSBuYnVmcy5wdXNoKGZybXNbaV0uaW1nLmJ1ZmZlcik7XG5cdFx0XG5cdFx0dmFyIGFidWYgPSBVUE5HLmVuY29kZS5jb25jYXRSR0JBKG5idWZzKSwgcXJlcyA9IFVQTkcucXVhbnRpemUoYWJ1ZiwgcHMpOyAgXG5cdFx0dmFyIGNvZiA9IDAsIGJiID0gbmV3IFVpbnQ4QXJyYXkocXJlcy5hYnVmKTtcblx0XHRmb3IodmFyIGk9MDsgaTxmcm1zLmxlbmd0aDsgaSsrKSB7ICB2YXIgdGk9ZnJtc1tpXS5pbWcsIGJsbj10aS5sZW5ndGg7ICBpbmRzLnB1c2gobmV3IFVpbnQ4QXJyYXkocXJlcy5pbmRzLmJ1ZmZlciwgY29mPj4yLCBibG4+PjIpKTtcblx0XHRcdGZvcih2YXIgaj0wOyBqPGJsbjsgais9NCkgeyAgdGlbal09YmJbY29mK2pdOyAgdGlbaisxXT1iYltjb2YraisxXTsgIHRpW2orMl09YmJbY29mK2orMl07ICB0aVtqKzNdPWJiW2NvZitqKzNdOyAgfSAgICBjb2YrPWJsbjsgIH1cblx0XHRcblx0XHRmb3IodmFyIGk9MDsgaTxxcmVzLnBsdGUubGVuZ3RoOyBpKyspIHBsdGUucHVzaChxcmVzLnBsdGVbaV0uZXN0LnJnYmEpO1xuXHRcdC8vY29uc29sZS5sb2coXCJxdWFudGl6ZVwiLCBEYXRlLm5vdygpLXRpbWUpOyAgdGltZSA9IERhdGUubm93KCk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0Ly8gd2hhdCBpZiBwcz09MCwgYnV0IHRoZXJlIGFyZSA8PTI1NiBjb2xvcnM/ICB3ZSBzdGlsbCBuZWVkIHRvIGRldGVjdCwgaWYgdGhlIHBhbGV0dGUgY291bGQgYmUgdXNlZFxuXHRcdGZvcih2YXIgaj0wOyBqPGZybXMubGVuZ3RoOyBqKyspICB7ICAvLyB3aGVuIG5vdCBxdWFudGl6ZWQsIG90aGVyIGZyYW1lcyBjYW4gY29udGFpbiBjb2xvcnMsIHRoYXQgYXJlIG5vdCBpbiBhbiBpbml0aWFsIGZyYW1lXG5cdFx0XHR2YXIgZnJtID0gZnJtc1tqXSwgaW1nMzIgPSBuZXcgVWludDMyQXJyYXkoZnJtLmltZy5idWZmZXIpLCBudz1mcm0ucmVjdC53aWR0aCwgaWxlbiA9IGltZzMyLmxlbmd0aDtcblx0XHRcdHZhciBpbmQgPSBuZXcgVWludDhBcnJheShpbGVuKTsgIGluZHMucHVzaChpbmQpO1xuXHRcdFx0Zm9yKHZhciBpPTA7IGk8aWxlbjsgaSsrKSB7XG5cdFx0XHRcdHZhciBjID0gaW1nMzJbaV07XG5cdFx0XHRcdGlmICAgICAoaSE9MCAmJiBjPT1pbWczMltpLSAxXSkgaW5kW2ldPWluZFtpLTFdO1xuXHRcdFx0XHRlbHNlIGlmKGk+bncgJiYgYz09aW1nMzJbaS1ud10pIGluZFtpXT1pbmRbaS1ud107XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHZhciBjbWMgPSBjbWFwW2NdO1xuXHRcdFx0XHRcdGlmKGNtYz09bnVsbCkgeyAgY21hcFtjXT1jbWM9cGx0ZS5sZW5ndGg7ICBwbHRlLnB1c2goYyk7ICBpZihwbHRlLmxlbmd0aD49MzAwKSBicmVhazsgIH1cblx0XHRcdFx0XHRpbmRbaV09Y21jO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vY29uc29sZS5sb2coXCJtYWtlIHBhbGV0dGVcIiwgRGF0ZS5ub3coKS10aW1lKTsgIHRpbWUgPSBEYXRlLm5vdygpO1xuXHR9XG5cdFxuXHR2YXIgY2M9cGx0ZS5sZW5ndGg7IC8vY29uc29sZS5sb2coXCJjb2xvcnM6XCIsY2MpO1xuXHRpZihjYzw9MjU2ICYmIGZvcmJpZFBsdGU9PWZhbHNlKSB7XG5cdFx0aWYoY2M8PSAyKSBkZXB0aD0xOyAgZWxzZSBpZihjYzw9IDQpIGRlcHRoPTI7ICBlbHNlIGlmKGNjPD0xNikgZGVwdGg9NDsgIGVsc2UgZGVwdGg9ODtcblx0XHRkZXB0aCA9ICBNYXRoLm1heChkZXB0aCwgbWluQml0cyk7XG5cdH1cblx0XG5cdGZvcih2YXIgaj0wOyBqPGZybXMubGVuZ3RoOyBqKyspXG5cdHtcblx0XHR2YXIgZnJtID0gZnJtc1tqXSwgbng9ZnJtLnJlY3QueCwgbnk9ZnJtLnJlY3QueSwgbnc9ZnJtLnJlY3Qud2lkdGgsIG5oPWZybS5yZWN0LmhlaWdodDtcblx0XHR2YXIgY2ltZyA9IGZybS5pbWcsIGNpbWczMiA9IG5ldyBVaW50MzJBcnJheShjaW1nLmJ1ZmZlcik7XG5cdFx0dmFyIGJwbCA9IDQqbncsIGJwcD00O1xuXHRcdGlmKGNjPD0yNTYgJiYgZm9yYmlkUGx0ZT09ZmFsc2UpIHtcblx0XHRcdGJwbCA9IE1hdGguY2VpbChkZXB0aCpudy84KTtcblx0XHRcdHZhciBuaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnBsKm5oKTtcblx0XHRcdHZhciBpbmogPSBpbmRzW2pdO1xuXHRcdFx0Zm9yKHZhciB5PTA7IHk8bmg7IHkrKykgeyAgdmFyIGk9eSpicGwsIGlpPXkqbnc7XG5cdFx0XHRcdGlmICAgICAoZGVwdGg9PTgpIGZvcih2YXIgeD0wOyB4PG53OyB4KyspIG5pbWdbaSsoeCkgICBdICAgPSAgKGlualtpaSt4XSAgICAgICAgICAgICApO1xuXHRcdFx0XHRlbHNlIGlmKGRlcHRoPT00KSBmb3IodmFyIHg9MDsgeDxudzsgeCsrKSBuaW1nW2krKHg+PjEpXSAgfD0gIChpbmpbaWkreF08PCg0LSh4JjEpKjQpKTtcblx0XHRcdFx0ZWxzZSBpZihkZXB0aD09MikgZm9yKHZhciB4PTA7IHg8bnc7IHgrKykgbmltZ1tpKyh4Pj4yKV0gIHw9ICAoaW5qW2lpK3hdPDwoNi0oeCYzKSoyKSk7XG5cdFx0XHRcdGVsc2UgaWYoZGVwdGg9PTEpIGZvcih2YXIgeD0wOyB4PG53OyB4KyspIG5pbWdbaSsoeD4+MyldICB8PSAgKGlualtpaSt4XTw8KDctKHgmNykqMSkpO1xuXHRcdFx0fVxuXHRcdFx0Y2ltZz1uaW1nOyAgY3R5cGU9MzsgIGJwcD0xO1xuXHRcdH1cblx0XHRlbHNlIGlmKGdvdEFscGhhPT1mYWxzZSAmJiBmcm1zLmxlbmd0aD09MSkge1x0Ly8gc29tZSBuZXh0IFwicmVkdWNlZFwiIGZyYW1lcyBtYXkgY29udGFpbiBhbHBoYSBmb3IgYmxlbmRpbmdcblx0XHRcdHZhciBuaW1nID0gbmV3IFVpbnQ4QXJyYXkobncqbmgqMyksIGFyZWE9bncqbmg7XG5cdFx0XHRmb3IodmFyIGk9MDsgaTxhcmVhOyBpKyspIHsgdmFyIHRpPWkqMywgcWk9aSo0OyAgbmltZ1t0aV09Y2ltZ1txaV07ICBuaW1nW3RpKzFdPWNpbWdbcWkrMV07ICBuaW1nW3RpKzJdPWNpbWdbcWkrMl07ICB9XG5cdFx0XHRjaW1nPW5pbWc7ICBjdHlwZT0yOyAgYnBwPTM7ICBicGw9Mypudztcblx0XHR9XG5cdFx0ZnJtLmltZz1jaW1nOyAgZnJtLmJwbD1icGw7ICBmcm0uYnBwPWJwcDtcblx0fVxuXHQvL2NvbnNvbGUubG9nKFwiY29sb3JzID0+IHBhbGV0dGUgaW5kaWNlc1wiLCBEYXRlLm5vdygpLXRpbWUpOyAgdGltZSA9IERhdGUubm93KCk7XG5cdFxuXHRyZXR1cm4ge2N0eXBlOmN0eXBlLCBkZXB0aDpkZXB0aCwgcGx0ZTpwbHRlLCBmcmFtZXM6ZnJtcyAgfTtcbn1cblVQTkcuZW5jb2RlLmZyYW1pemUgPSBmdW5jdGlvbihidWZzLHcsaCxhbHdheXNCbGVuZCxldmVuQ3JkLGZvcmJpZFByZXYpIHtcblx0LyogIERJU1BPU0Vcblx0ICAgIC0gMCA6IG5vIGNoYW5nZVxuXHRcdC0gMSA6IGNsZWFyIHRvIHRyYW5zcGFyZW50XG5cdFx0LSAyIDogcmV0c3RvcmUgdG8gY29udGVudCBiZWZvcmUgcmVuZGVyaW5nIChwcmV2aW91cyBmcmFtZSBkaXNwb3NlZClcblx0XHRCTEVORFxuXHRcdC0gMCA6IHJlcGxhY2Vcblx0XHQtIDEgOiBibGVuZFxuXHQqL1xuXHR2YXIgZnJtcyA9IFtdO1xuXHRmb3IodmFyIGo9MDsgajxidWZzLmxlbmd0aDsgaisrKSB7XG5cdFx0dmFyIGNpbWcgPSBuZXcgVWludDhBcnJheShidWZzW2pdKSwgY2ltZzMyID0gbmV3IFVpbnQzMkFycmF5KGNpbWcuYnVmZmVyKTtcblx0XHR2YXIgbmltZztcblx0XHRcblx0XHR2YXIgbng9MCwgbnk9MCwgbnc9dywgbmg9aCwgYmxlbmQ9YWx3YXlzQmxlbmQ/MTowO1xuXHRcdGlmKGohPTApIHtcblx0XHRcdHZhciB0bGltID0gKGZvcmJpZFByZXYgfHwgYWx3YXlzQmxlbmQgfHwgaj09MSB8fCBmcm1zW2otMl0uZGlzcG9zZSE9MCk/MToyLCB0c3RwID0gMCwgdGFyZWEgPSAxZTk7XG5cdFx0XHRmb3IodmFyIGl0PTA7IGl0PHRsaW07IGl0KyspXG5cdFx0XHR7XG5cdFx0XHRcdHZhciBwaW1nID0gbmV3IFVpbnQ4QXJyYXkoYnVmc1tqLTEtaXRdKSwgcDMyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZnNbai0xLWl0XSk7XG5cdFx0XHRcdHZhciBtaXg9dyxtaXk9aCxtYXg9LTEsbWF5PS0xO1xuXHRcdFx0XHRmb3IodmFyIHk9MDsgeTxoOyB5KyspIGZvcih2YXIgeD0wOyB4PHc7IHgrKykge1xuXHRcdFx0XHRcdHZhciBpID0geSp3K3g7XG5cdFx0XHRcdFx0aWYoY2ltZzMyW2ldIT1wMzJbaV0pIHtcblx0XHRcdFx0XHRcdGlmKHg8bWl4KSBtaXg9eDsgIGlmKHg+bWF4KSBtYXg9eDtcblx0XHRcdFx0XHRcdGlmKHk8bWl5KSBtaXk9eTsgIGlmKHk+bWF5KSBtYXk9eTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYobWF4PT0tMSkgbWl4PW1peT1tYXg9bWF5PTA7XG5cdFx0XHRcdGlmKGV2ZW5DcmQpIHsgIGlmKChtaXgmMSk9PTEpbWl4LS07ICBpZigobWl5JjEpPT0xKW1peS0tOyAgfVxuXHRcdFx0XHR2YXIgc2FyZWEgPSAobWF4LW1peCsxKSoobWF5LW1peSsxKTtcblx0XHRcdFx0aWYoc2FyZWE8dGFyZWEpIHtcblx0XHRcdFx0XHR0YXJlYSA9IHNhcmVhOyAgdHN0cCA9IGl0O1xuXHRcdFx0XHRcdG54ID0gbWl4OyBueSA9IG1peTsgbncgPSBtYXgtbWl4KzE7IG5oID0gbWF5LW1peSsxO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdC8vIGFsd2F5c0JsZW5kOiBwb2t1ZCB6amlzdMOtbSwgxb5lIGJsZW5kaXQgbmVsemUsIG5hc3RhdsOtbSBwxZllZGNob3rDrW11IHNuw61ta3UgZGlzcG9zZT0xLiBaYWppc3TDrW0sIGFieSBvYnNhaG92YWwgbcWvaiBvYmTDqWxuw61rLlxuXHRcdFx0dmFyIHBpbWcgPSBuZXcgVWludDhBcnJheShidWZzW2otMS10c3RwXSk7XG5cdFx0XHRpZih0c3RwPT0xKSBmcm1zW2otMV0uZGlzcG9zZSA9IDI7XG5cdFx0XHRcblx0XHRcdG5pbWcgPSBuZXcgVWludDhBcnJheShudypuaCo0KTtcblx0XHRcdFVQTkcuX2NvcHlUaWxlKHBpbWcsdyxoLCBuaW1nLG53LG5oLCAtbngsLW55LCAwKTtcblx0XHRcdFxuXHRcdFx0YmxlbmQgPSAgVVBORy5fY29weVRpbGUoY2ltZyx3LGgsIG5pbWcsbncsbmgsIC1ueCwtbnksIDMpID8gMSA6IDA7XG5cdFx0XHRpZihibGVuZD09MSkgVVBORy5lbmNvZGUuX3ByZXBhcmVEaWZmKGNpbWcsdyxoLG5pbWcse3g6bngseTpueSx3aWR0aDpudyxoZWlnaHQ6bmh9KTtcblx0XHRcdGVsc2UgICAgICAgICBVUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgbmltZyxudyxuaCwgLW54LC1ueSwgMCk7XG5cdFx0XHQvL1VQTkcuX2NvcHlUaWxlKGNpbWcsdyxoLCBuaW1nLG53LG5oLCAtbngsLW55LCBibGVuZD09MT8yOjApO1xuXHRcdH1cblx0XHRlbHNlIG5pbWcgPSBjaW1nLnNsaWNlKDApO1x0Ly8gaW1nIG1heSBiZSByZXdyaXR0ZW4gZnVydGhlciAuLi4gZG9uJ3QgcmV3cml0ZSBpbnB1dFxuXHRcdFxuXHRcdGZybXMucHVzaCh7cmVjdDp7eDpueCx5Om55LHdpZHRoOm53LGhlaWdodDpuaH0sIGltZzpuaW1nLCBibGVuZDpibGVuZCwgZGlzcG9zZTowfSk7XG5cdH1cblx0XG5cdFxuXHRpZihhbHdheXNCbGVuZCkgZm9yKHZhciBqPTA7IGo8ZnJtcy5sZW5ndGg7IGorKykge1xuXHRcdHZhciBmcm0gPSBmcm1zW2pdOyAgaWYoZnJtLmJsZW5kPT0xKSBjb250aW51ZTtcblx0XHR2YXIgcjAgPSBmcm0ucmVjdCwgcjEgPSBmcm1zW2otMV0ucmVjdFxuXHRcdHZhciBtaVggPSBNYXRoLm1pbihyMC54LCByMS54KSwgbWlZID0gTWF0aC5taW4ocjAueSwgcjEueSk7XG5cdFx0dmFyIG1hWCA9IE1hdGgubWF4KHIwLngrcjAud2lkdGgsIHIxLngrcjEud2lkdGgpLCBtYVkgPSBNYXRoLm1heChyMC55K3IwLmhlaWdodCwgcjEueStyMS5oZWlnaHQpO1xuXHRcdHZhciByID0ge3g6bWlYLCB5Om1pWSwgd2lkdGg6bWFYLW1pWCwgaGVpZ2h0Om1hWS1taVl9O1xuXHRcdFxuXHRcdGZybXNbai0xXS5kaXNwb3NlID0gMTtcblx0XHRpZihqLTEhPTApIFxuXHRcdFVQTkcuZW5jb2RlLl91cGRhdGVGcmFtZShidWZzLCB3LGgsZnJtcywgai0xLHIsIGV2ZW5DcmQpO1xuXHRcdFVQTkcuZW5jb2RlLl91cGRhdGVGcmFtZShidWZzLCB3LGgsZnJtcywgaiAgLHIsIGV2ZW5DcmQpO1xuXHR9XG5cdHZhciBhcmVhID0gMDtcblx0aWYoYnVmcy5sZW5ndGghPTEpIGZvcih2YXIgaT0wOyBpPGZybXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgZnJtID0gZnJtc1tpXTtcblx0XHRhcmVhICs9IGZybS5yZWN0LndpZHRoKmZybS5yZWN0LmhlaWdodDtcblx0XHQvL2lmKGk9PTAgfHwgZnJtLmJsZW5kIT0xKSBjb250aW51ZTtcblx0XHQvL3ZhciBvYiA9IG5ldyBVaW50OEFycmF5KFxuXHRcdC8vY29uc29sZS5sb2coZnJtLmJsZW5kLCBmcm0uZGlzcG9zZSwgZnJtLnJlY3QpO1xuXHR9XG5cdC8vaWYoYXJlYSE9MCkgY29uc29sZS5sb2coYXJlYSk7XG5cdHJldHVybiBmcm1zO1xufVxuVVBORy5lbmNvZGUuX3VwZGF0ZUZyYW1lID0gZnVuY3Rpb24oYnVmcywgdyxoLCBmcm1zLCBpLCByLCBldmVuQ3JkKSB7XG5cdHZhciBVOCA9IFVpbnQ4QXJyYXksIFUzMiA9IFVpbnQzMkFycmF5O1xuXHR2YXIgcGltZyA9IG5ldyBVOChidWZzW2ktMV0pLCBwaW1nMzIgPSBuZXcgVTMyKGJ1ZnNbaS0xXSksIG5pbWcgPSBpKzE8YnVmcy5sZW5ndGggPyBuZXcgVTgoYnVmc1tpKzFdKTpudWxsO1xuXHR2YXIgY2ltZyA9IG5ldyBVOChidWZzW2ldKSwgY2ltZzMyID0gbmV3IFUzMihjaW1nLmJ1ZmZlcik7XG5cdFxuXHR2YXIgbWl4PXcsbWl5PWgsbWF4PS0xLG1heT0tMTtcblx0Zm9yKHZhciB5PTA7IHk8ci5oZWlnaHQ7IHkrKykgZm9yKHZhciB4PTA7IHg8ci53aWR0aDsgeCsrKSB7XG5cdFx0dmFyIGN4ID0gci54K3gsIGN5ID0gci55K3k7XG5cdFx0dmFyIGogPSBjeSp3K2N4LCBjYyA9IGNpbWczMltqXTtcblx0XHQvLyBubyBuZWVkIHRvIGRyYXcgdHJhbnNwYXJlbmN5LCBvciB0byBkaXNwb3NlIGl0LiBPciwgaWYgd3JpdGluZyB0aGUgc2FtZSBjb2xvciBhbmQgdGhlIG5leHQgb25lIGRvZXMgbm90IG5lZWQgdHJhbnNwYXJlbmN5LlxuXHRcdGlmKGNjPT0wIHx8IChmcm1zW2ktMV0uZGlzcG9zZT09MCAmJiBwaW1nMzJbal09PWNjICYmIChuaW1nPT1udWxsIHx8IG5pbWdbaio0KzNdIT0wKSkvKiovKSB7fVxuXHRcdGVsc2Uge1xuXHRcdFx0aWYoY3g8bWl4KSBtaXg9Y3g7ICBpZihjeD5tYXgpIG1heD1jeDtcblx0XHRcdGlmKGN5PG1peSkgbWl5PWN5OyAgaWYoY3k+bWF5KSBtYXk9Y3k7XG5cdFx0fVxuXHR9XG5cdGlmKG1heD09LTEpIG1peD1taXk9bWF4PW1heT0wO1xuXHRpZihldmVuQ3JkKSB7ICBpZigobWl4JjEpPT0xKW1peC0tOyAgaWYoKG1peSYxKT09MSltaXktLTsgIH1cblx0ciA9IHt4Om1peCwgeTptaXksIHdpZHRoOm1heC1taXgrMSwgaGVpZ2h0Om1heS1taXkrMX07XG5cdFxuXHR2YXIgZnIgPSBmcm1zW2ldOyAgZnIucmVjdCA9IHI7ICBmci5ibGVuZCA9IDE7ICBmci5pbWcgPSBuZXcgVWludDhBcnJheShyLndpZHRoKnIuaGVpZ2h0KjQpO1xuXHRpZihmcm1zW2ktMV0uZGlzcG9zZT09MCkge1xuXHRcdFVQTkcuX2NvcHlUaWxlKHBpbWcsdyxoLCBmci5pbWcsci53aWR0aCxyLmhlaWdodCwgLXIueCwtci55LCAwKTtcblx0XHRVUE5HLmVuY29kZS5fcHJlcGFyZURpZmYoY2ltZyx3LGgsZnIuaW1nLHIpO1xuXHRcdC8vVVBORy5fY29weVRpbGUoY2ltZyx3LGgsIGZyLmltZyxyLndpZHRoLHIuaGVpZ2h0LCAtci54LC1yLnksIDIpO1xuXHR9XG5cdGVsc2Vcblx0XHRVUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgZnIuaW1nLHIud2lkdGgsci5oZWlnaHQsIC1yLngsLXIueSwgMCk7XG59XG5VUE5HLmVuY29kZS5fcHJlcGFyZURpZmYgPSBmdW5jdGlvbihjaW1nLCB3LGgsIG5pbWcsIHJlYykge1xuXHRVUE5HLl9jb3B5VGlsZShjaW1nLHcsaCwgbmltZyxyZWMud2lkdGgscmVjLmhlaWdodCwgLXJlYy54LC1yZWMueSwgMik7XG5cdC8qXG5cdHZhciBuMzIgPSBuZXcgVWludDMyQXJyYXkobmltZy5idWZmZXIpO1xuXHR2YXIgb2cgPSBuZXcgVWludDhBcnJheShyZWMud2lkdGgqcmVjLmhlaWdodCo0KSwgbzMyID0gbmV3IFVpbnQzMkFycmF5KG9nLmJ1ZmZlcik7XG5cdFVQTkcuX2NvcHlUaWxlKGNpbWcsdyxoLCBvZyxyZWMud2lkdGgscmVjLmhlaWdodCwgLXJlYy54LC1yZWMueSwgMCk7XG5cdGZvcih2YXIgaT00OyBpPG5pbWcubGVuZ3RoOyBpKz00KSB7XG5cdFx0aWYobmltZ1tpLTFdIT0wICYmIG5pbWdbaSszXT09MCAmJiBvMzJbaT4+PjJdPT1vMzJbKGk+Pj4yKS0xXSkge1xuXHRcdFx0bjMyW2k+Pj4yXT1vMzJbaT4+PjJdO1xuXHRcdFx0Ly92YXIgaiA9IGksIGM9cDMyWyhpPj4+MiktMV07XG5cdFx0XHQvL3doaWxlKHAzMltqPj4+Ml09PWMpIHsgIG4zMltqPj4+Ml09YzsgIGorPTQ7ICB9XG5cdFx0fVxuXHR9XG5cdGZvcih2YXIgaT1uaW1nLmxlbmd0aC04OyBpPjA7IGktPTQpIHtcblx0XHRpZihuaW1nW2krN10hPTAgJiYgbmltZ1tpKzNdPT0wICYmIG8zMltpPj4+Ml09PW8zMlsoaT4+PjIpKzFdKSB7XG5cdFx0XHRuMzJbaT4+PjJdPW8zMltpPj4+Ml07XG5cdFx0XHQvL3ZhciBqID0gaSwgYz1wMzJbKGk+Pj4yKS0xXTtcblx0XHRcdC8vd2hpbGUocDMyW2o+Pj4yXT09YykgeyAgbjMyW2o+Pj4yXT1jOyAgais9NDsgIH1cblx0XHR9XG5cdH0qL1xufVxuXG5VUE5HLmVuY29kZS5fZmlsdGVyWmVybyA9IGZ1bmN0aW9uKGltZyxoLGJwcCxicGwsZGF0YSwgZmlsdGVyLCBsZXZlbFplcm8pXG57XG5cdHZhciBmbHMgPSBbXSwgZnRyeT1bMCwxLDIsMyw0XTtcblx0aWYgICAgIChmaWx0ZXIhPS0xKSAgICAgICAgICAgICBmdHJ5PVtmaWx0ZXJdO1xuXHRlbHNlIGlmKGgqYnBsPjUwMDAwMCB8fCBicHA9PTEpIGZ0cnk9WzBdO1xuXHR2YXIgb3B0czsgIGlmKGxldmVsWmVybykgb3B0cz17bGV2ZWw6MH07XG5cdFxuXHR2YXIgQ01QUiA9IChsZXZlbFplcm8gJiYgVVpJUCE9bnVsbCkgPyBVWklQIDogcGFrbztcblx0XG5cdGZvcih2YXIgaT0wOyBpPGZ0cnkubGVuZ3RoOyBpKyspIHtcblx0XHRmb3IodmFyIHk9MDsgeTxoOyB5KyspIFVQTkcuZW5jb2RlLl9maWx0ZXJMaW5lKGRhdGEsIGltZywgeSwgYnBsLCBicHAsIGZ0cnlbaV0pO1xuXHRcdC8vdmFyIG5pbWcgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCk7XG5cdFx0Ly92YXIgc3ogPSBVWklQLkYuZGVmbGF0ZShkYXRhLCBuaW1nKTsgIGZscy5wdXNoKG5pbWcuc2xpY2UoMCxzeikpO1xuXHRcdC8vdmFyIGRmbCA9IHBha29bXCJkZWZsYXRlXCJdKGRhdGEpLCBkbD1kZmwubGVuZ3RoLTQ7XG5cdFx0Ly92YXIgY3JjID0gKGRmbFtkbCszXTw8MjQpfChkZmxbZGwrMl08PDE2KXwoZGZsW2RsKzFdPDw4KXwoZGZsW2RsKzBdPDwwKTtcblx0XHQvL2NvbnNvbGUubG9nKGNyYywgVVpJUC5hZGxlcihkYXRhLDIsZGF0YS5sZW5ndGgtNikpO1xuXHRcdGZscy5wdXNoKENNUFJbXCJkZWZsYXRlXCJdKGRhdGEsb3B0cykpO1xuXHR9XG5cdHZhciB0aSwgdHNpemU9MWU5O1xuXHRmb3IodmFyIGk9MDsgaTxmbHMubGVuZ3RoOyBpKyspIGlmKGZsc1tpXS5sZW5ndGg8dHNpemUpIHsgIHRpPWk7ICB0c2l6ZT1mbHNbaV0ubGVuZ3RoOyAgfVxuXHRyZXR1cm4gZmxzW3RpXTtcbn1cblVQTkcuZW5jb2RlLl9maWx0ZXJMaW5lID0gZnVuY3Rpb24oZGF0YSwgaW1nLCB5LCBicGwsIGJwcCwgdHlwZSlcbntcblx0dmFyIGkgPSB5KmJwbCwgZGkgPSBpK3ksIHBhZXRoID0gVVBORy5kZWNvZGUuX3BhZXRoXG5cdGRhdGFbZGldPXR5cGU7ICBkaSsrO1xuXG5cdGlmKHR5cGU9PTApIHtcblx0XHRpZihicGw8NTAwKSBmb3IodmFyIHg9MDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IGltZ1tpK3hdO1xuXHRcdGVsc2UgZGF0YS5zZXQobmV3IFVpbnQ4QXJyYXkoaW1nLmJ1ZmZlcixpLGJwbCksZGkpO1xuXHR9XG5cdGVsc2UgaWYodHlwZT09MSkge1xuXHRcdGZvcih2YXIgeD0gIDA7IHg8YnBwOyB4KyspIGRhdGFbZGkreF0gPSAgaW1nW2kreF07XG5cdFx0Zm9yKHZhciB4PWJwcDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XS1pbWdbaSt4LWJwcF0rMjU2KSYyNTU7XG5cdH1cblx0ZWxzZSBpZih5PT0wKSB7XG5cdFx0Zm9yKHZhciB4PSAgMDsgeDxicHA7IHgrKykgZGF0YVtkaSt4XSA9IGltZ1tpK3hdO1xuXG5cdFx0aWYodHlwZT09MikgZm9yKHZhciB4PWJwcDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IGltZ1tpK3hdO1xuXHRcdGlmKHR5cGU9PTMpIGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0gLSAoaW1nW2kreC1icHBdPj4xKSArMjU2KSYyNTU7XG5cdFx0aWYodHlwZT09NCkgZm9yKHZhciB4PWJwcDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XSAtIHBhZXRoKGltZ1tpK3gtYnBwXSwgMCwgMCkgKzI1NikmMjU1O1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmKHR5cGU9PTIpIHsgZm9yKHZhciB4PSAgMDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XSsyNTYgLSBpbWdbaSt4LWJwbF0pJjI1NTsgIH1cblx0XHRpZih0eXBlPT0zKSB7IGZvcih2YXIgeD0gIDA7IHg8YnBwOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0rMjU2IC0gKGltZ1tpK3gtYnBsXT4+MSkpJjI1NTtcblx0XHRcdFx0XHQgIGZvcih2YXIgeD1icHA7IHg8YnBsOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0rMjU2IC0gKChpbWdbaSt4LWJwbF0raW1nW2kreC1icHBdKT4+MSkpJjI1NTsgIH1cblx0XHRpZih0eXBlPT00KSB7IGZvcih2YXIgeD0gIDA7IHg8YnBwOyB4KyspIGRhdGFbZGkreF0gPSAoaW1nW2kreF0rMjU2IC0gcGFldGgoMCwgaW1nW2kreC1icGxdLCAwKSkmMjU1O1xuXHRcdFx0XHRcdCAgZm9yKHZhciB4PWJwcDsgeDxicGw7IHgrKykgZGF0YVtkaSt4XSA9IChpbWdbaSt4XSsyNTYgLSBwYWV0aChpbWdbaSt4LWJwcF0sIGltZ1tpK3gtYnBsXSwgaW1nW2kreC1icHAtYnBsXSkpJjI1NTsgIH1cblx0fVxufVxuXG5VUE5HLmNyYyA9IHtcblx0dGFibGUgOiAoIGZ1bmN0aW9uKCkge1xuXHQgICB2YXIgdGFiID0gbmV3IFVpbnQzMkFycmF5KDI1Nik7XG5cdCAgIGZvciAodmFyIG49MDsgbjwyNTY7IG4rKykge1xuXHRcdFx0dmFyIGMgPSBuO1xuXHRcdFx0Zm9yICh2YXIgaz0wOyBrPDg7IGsrKykge1xuXHRcdFx0XHRpZiAoYyAmIDEpICBjID0gMHhlZGI4ODMyMCBeIChjID4+PiAxKTtcblx0XHRcdFx0ZWxzZSAgICAgICAgYyA9IGMgPj4+IDE7XG5cdFx0XHR9XG5cdFx0XHR0YWJbbl0gPSBjOyAgfVxuXHRcdHJldHVybiB0YWI7ICB9KSgpLFxuXHR1cGRhdGUgOiBmdW5jdGlvbihjLCBidWYsIG9mZiwgbGVuKSB7XG5cdFx0Zm9yICh2YXIgaT0wOyBpPGxlbjsgaSsrKSAgYyA9IFVQTkcuY3JjLnRhYmxlWyhjIF4gYnVmW29mZitpXSkgJiAweGZmXSBeIChjID4+PiA4KTtcblx0XHRyZXR1cm4gYztcblx0fSxcblx0Y3JjIDogZnVuY3Rpb24oYixvLGwpICB7ICByZXR1cm4gVVBORy5jcmMudXBkYXRlKDB4ZmZmZmZmZmYsYixvLGwpIF4gMHhmZmZmZmZmZjsgIH1cbn1cblxuXG5VUE5HLnF1YW50aXplID0gZnVuY3Rpb24oYWJ1ZiwgcHMpXG57XHRcblx0dmFyIG9pbWcgPSBuZXcgVWludDhBcnJheShhYnVmKSwgbmltZyA9IG9pbWcuc2xpY2UoMCksIG5pbWczMiA9IG5ldyBVaW50MzJBcnJheShuaW1nLmJ1ZmZlcik7XG5cdFxuXHR2YXIgS0QgPSBVUE5HLnF1YW50aXplLmdldEtEdHJlZShuaW1nLCBwcyk7XG5cdHZhciByb290ID0gS0RbMF0sIGxlYWZzID0gS0RbMV07XG5cdFxuXHR2YXIgcGxhbmVEc3QgPSBVUE5HLnF1YW50aXplLnBsYW5lRHN0O1xuXHR2YXIgc2IgPSBvaW1nLCB0YiA9IG5pbWczMiwgbGVuPXNiLmxlbmd0aDtcblx0XHRcblx0dmFyIGluZHMgPSBuZXcgVWludDhBcnJheShvaW1nLmxlbmd0aD4+Mik7XG5cdGZvcih2YXIgaT0wOyBpPGxlbjsgaSs9NCkge1xuXHRcdHZhciByPXNiW2ldKigxLzI1NSksIGc9c2JbaSsxXSooMS8yNTUpLCBiPXNiW2krMl0qKDEvMjU1KSwgYT1zYltpKzNdKigxLzI1NSk7XG5cdFx0XG5cdFx0Ly8gIGV4YWN0LCBidXQgdG9vIHNsb3cgOihcblx0XHR2YXIgbmQgPSBVUE5HLnF1YW50aXplLmdldE5lYXJlc3Qocm9vdCwgciwgZywgYiwgYSk7XG5cdFx0Ly92YXIgbmQgPSByb290O1xuXHRcdC8vd2hpbGUobmQubGVmdCkgbmQgPSAocGxhbmVEc3QobmQuZXN0LHIsZyxiLGEpPD0wKSA/IG5kLmxlZnQgOiBuZC5yaWdodDtcblx0XHRcblx0XHRpbmRzW2k+PjJdID0gbmQuaW5kO1xuXHRcdHRiW2k+PjJdID0gbmQuZXN0LnJnYmE7XG5cdH1cblx0cmV0dXJuIHsgIGFidWY6bmltZy5idWZmZXIsIGluZHM6aW5kcywgcGx0ZTpsZWFmcyAgfTtcbn1cblxuVVBORy5xdWFudGl6ZS5nZXRLRHRyZWUgPSBmdW5jdGlvbihuaW1nLCBwcywgZXJyKSB7XG5cdGlmKGVycj09bnVsbCkgZXJyID0gMC4wMDAxO1xuXHR2YXIgbmltZzMyID0gbmV3IFVpbnQzMkFycmF5KG5pbWcuYnVmZmVyKTtcblx0XG5cdHZhciByb290ID0ge2kwOjAsIGkxOm5pbWcubGVuZ3RoLCBic3Q6bnVsbCwgZXN0Om51bGwsIHRkc3Q6MCwgbGVmdDpudWxsLCByaWdodDpudWxsIH07ICAvLyBiYXNpYyBzdGF0aXN0aWMsIGV4dHJhIHN0YXRpc3RpY1xuXHRyb290LmJzdCA9IFVQTkcucXVhbnRpemUuc3RhdHMoICBuaW1nLHJvb3QuaTAsIHJvb3QuaTEgICk7ICByb290LmVzdCA9IFVQTkcucXVhbnRpemUuZXN0YXRzKCByb290LmJzdCApO1xuXHR2YXIgbGVhZnMgPSBbcm9vdF07XG5cdFxuXHR3aGlsZShsZWFmcy5sZW5ndGg8cHMpXG5cdHtcblx0XHR2YXIgbWF4TCA9IDAsIG1pPTA7XG5cdFx0Zm9yKHZhciBpPTA7IGk8bGVhZnMubGVuZ3RoOyBpKyspIGlmKGxlYWZzW2ldLmVzdC5MID4gbWF4TCkgeyAgbWF4TD1sZWFmc1tpXS5lc3QuTDsgIG1pPWk7ICB9XG5cdFx0aWYobWF4TDxlcnIpIGJyZWFrO1xuXHRcdHZhciBub2RlID0gbGVhZnNbbWldO1xuXHRcdFxuXHRcdHZhciBzMCA9IFVQTkcucXVhbnRpemUuc3BsaXRQaXhlbHMobmltZyxuaW1nMzIsIG5vZGUuaTAsIG5vZGUuaTEsIG5vZGUuZXN0LmUsIG5vZGUuZXN0LmVNcTI1NSk7XG5cdFx0dmFyIHMwd3JvbmcgPSAobm9kZS5pMD49czAgfHwgbm9kZS5pMTw9czApO1xuXHRcdC8vY29uc29sZS5sb2cobWF4TCwgbGVhZnMubGVuZ3RoLCBtaSk7XG5cdFx0aWYoczB3cm9uZykgeyAgbm9kZS5lc3QuTD0wOyAgY29udGludWU7ICB9XG5cdFx0XG5cdFx0XG5cdFx0dmFyIGxuID0ge2kwOm5vZGUuaTAsIGkxOnMwLCBic3Q6bnVsbCwgZXN0Om51bGwsIHRkc3Q6MCwgbGVmdDpudWxsLCByaWdodDpudWxsIH07ICBsbi5ic3QgPSBVUE5HLnF1YW50aXplLnN0YXRzKCBuaW1nLCBsbi5pMCwgbG4uaTEgKTsgIFxuXHRcdGxuLmVzdCA9IFVQTkcucXVhbnRpemUuZXN0YXRzKCBsbi5ic3QgKTtcblx0XHR2YXIgcm4gPSB7aTA6czAsIGkxOm5vZGUuaTEsIGJzdDpudWxsLCBlc3Q6bnVsbCwgdGRzdDowLCBsZWZ0Om51bGwsIHJpZ2h0Om51bGwgfTsgIHJuLmJzdCA9IHtSOltdLCBtOltdLCBOOm5vZGUuYnN0Lk4tbG4uYnN0Lk59O1xuXHRcdGZvcih2YXIgaT0wOyBpPDE2OyBpKyspIHJuLmJzdC5SW2ldID0gbm9kZS5ic3QuUltpXS1sbi5ic3QuUltpXTtcblx0XHRmb3IodmFyIGk9MDsgaTwgNDsgaSsrKSBybi5ic3QubVtpXSA9IG5vZGUuYnN0Lm1baV0tbG4uYnN0Lm1baV07XG5cdFx0cm4uZXN0ID0gVVBORy5xdWFudGl6ZS5lc3RhdHMoIHJuLmJzdCApO1xuXHRcdFxuXHRcdG5vZGUubGVmdCA9IGxuOyAgbm9kZS5yaWdodCA9IHJuO1xuXHRcdGxlYWZzW21pXT1sbjsgIGxlYWZzLnB1c2gocm4pO1xuXHR9XG5cdGxlYWZzLnNvcnQoZnVuY3Rpb24oYSxiKSB7ICByZXR1cm4gYi5ic3QuTi1hLmJzdC5OOyAgfSk7XG5cdGZvcih2YXIgaT0wOyBpPGxlYWZzLmxlbmd0aDsgaSsrKSBsZWFmc1tpXS5pbmQ9aTtcblx0cmV0dXJuIFtyb290LCBsZWFmc107XG59XG5cblVQTkcucXVhbnRpemUuZ2V0TmVhcmVzdCA9IGZ1bmN0aW9uKG5kLCByLGcsYixhKVxue1xuXHRpZihuZC5sZWZ0PT1udWxsKSB7ICBuZC50ZHN0ID0gVVBORy5xdWFudGl6ZS5kaXN0KG5kLmVzdC5xLHIsZyxiLGEpOyAgcmV0dXJuIG5kOyAgfVxuXHR2YXIgcGxhbmVEc3QgPSBVUE5HLnF1YW50aXplLnBsYW5lRHN0KG5kLmVzdCxyLGcsYixhKTtcblx0XG5cdHZhciBub2RlMCA9IG5kLmxlZnQsIG5vZGUxID0gbmQucmlnaHQ7XG5cdGlmKHBsYW5lRHN0PjApIHsgIG5vZGUwPW5kLnJpZ2h0OyAgbm9kZTE9bmQubGVmdDsgIH1cblx0XG5cdHZhciBsbiA9IFVQTkcucXVhbnRpemUuZ2V0TmVhcmVzdChub2RlMCwgcixnLGIsYSk7XG5cdGlmKGxuLnRkc3Q8PXBsYW5lRHN0KnBsYW5lRHN0KSByZXR1cm4gbG47XG5cdHZhciBybiA9IFVQTkcucXVhbnRpemUuZ2V0TmVhcmVzdChub2RlMSwgcixnLGIsYSk7XG5cdHJldHVybiBybi50ZHN0PGxuLnRkc3QgPyBybiA6IGxuO1xufVxuVVBORy5xdWFudGl6ZS5wbGFuZURzdCA9IGZ1bmN0aW9uKGVzdCwgcixnLGIsYSkgeyAgdmFyIGUgPSBlc3QuZTsgIHJldHVybiBlWzBdKnIgKyBlWzFdKmcgKyBlWzJdKmIgKyBlWzNdKmEgLSBlc3QuZU1xOyAgfVxuVVBORy5xdWFudGl6ZS5kaXN0ICAgICA9IGZ1bmN0aW9uKHEsICAgcixnLGIsYSkgeyAgdmFyIGQwPXItcVswXSwgZDE9Zy1xWzFdLCBkMj1iLXFbMl0sIGQzPWEtcVszXTsgIHJldHVybiBkMCpkMCtkMSpkMStkMipkMitkMypkMzsgIH1cblxuVVBORy5xdWFudGl6ZS5zcGxpdFBpeGVscyA9IGZ1bmN0aW9uKG5pbWcsIG5pbWczMiwgaTAsIGkxLCBlLCBlTXEpXG57XG5cdHZhciB2ZWNEb3QgPSBVUE5HLnF1YW50aXplLnZlY0RvdDtcblx0aTEtPTQ7XG5cdHZhciBzaGZzID0gMDtcblx0d2hpbGUoaTA8aTEpXG5cdHtcblx0XHR3aGlsZSh2ZWNEb3QobmltZywgaTAsIGUpPD1lTXEpIGkwKz00O1xuXHRcdHdoaWxlKHZlY0RvdChuaW1nLCBpMSwgZSk+IGVNcSkgaTEtPTQ7XG5cdFx0aWYoaTA+PWkxKSBicmVhaztcblx0XHRcblx0XHR2YXIgdCA9IG5pbWczMltpMD4+Ml07ICBuaW1nMzJbaTA+PjJdID0gbmltZzMyW2kxPj4yXTsgIG5pbWczMltpMT4+Ml09dDtcblx0XHRcblx0XHRpMCs9NDsgIGkxLT00O1xuXHR9XG5cdHdoaWxlKHZlY0RvdChuaW1nLCBpMCwgZSk+ZU1xKSBpMC09NDtcblx0cmV0dXJuIGkwKzQ7XG59XG5VUE5HLnF1YW50aXplLnZlY0RvdCA9IGZ1bmN0aW9uKG5pbWcsIGksIGUpXG57XG5cdHJldHVybiBuaW1nW2ldKmVbMF0gKyBuaW1nW2krMV0qZVsxXSArIG5pbWdbaSsyXSplWzJdICsgbmltZ1tpKzNdKmVbM107XG59XG5VUE5HLnF1YW50aXplLnN0YXRzID0gZnVuY3Rpb24obmltZywgaTAsIGkxKXtcblx0dmFyIFIgPSBbMCwwLDAsMCwgIDAsMCwwLDAsICAwLDAsMCwwLCAgMCwwLDAsMF07XG5cdHZhciBtID0gWzAsMCwwLDBdO1xuXHR2YXIgTiA9IChpMS1pMCk+PjI7XG5cdGZvcih2YXIgaT1pMDsgaTxpMTsgaSs9NClcblx0e1xuXHRcdHZhciByID0gbmltZ1tpXSooMS8yNTUpLCBnID0gbmltZ1tpKzFdKigxLzI1NSksIGIgPSBuaW1nW2krMl0qKDEvMjU1KSwgYSA9IG5pbWdbaSszXSooMS8yNTUpO1xuXHRcdC8vdmFyIHIgPSBuaW1nW2ldLCBnID0gbmltZ1tpKzFdLCBiID0gbmltZ1tpKzJdLCBhID0gbmltZ1tpKzNdO1xuXHRcdG1bMF0rPXI7ICBtWzFdKz1nOyAgbVsyXSs9YjsgIG1bM10rPWE7XG5cdFx0XG5cdFx0UlsgMF0gKz0gcipyOyAgUlsgMV0gKz0gcipnOyAgUlsgMl0gKz0gcipiOyAgUlsgM10gKz0gciphOyAgXG5cdFx0ICAgICAgICAgICAgICAgUlsgNV0gKz0gZypnOyAgUlsgNl0gKz0gZypiOyAgUlsgN10gKz0gZyphOyBcblx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSWzEwXSArPSBiKmI7ICBSWzExXSArPSBiKmE7ICBcblx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSWzE1XSArPSBhKmE7ICBcblx0fVxuXHRSWzRdPVJbMV07ICBSWzhdPVJbMl07ICBSWzldPVJbNl07ICBSWzEyXT1SWzNdOyAgUlsxM109Uls3XTsgIFJbMTRdPVJbMTFdO1xuXHRcblx0cmV0dXJuIHtSOlIsIG06bSwgTjpOfTtcbn1cblVQTkcucXVhbnRpemUuZXN0YXRzID0gZnVuY3Rpb24oc3RhdHMpe1xuXHR2YXIgUiA9IHN0YXRzLlIsIG0gPSBzdGF0cy5tLCBOID0gc3RhdHMuTjtcblx0XG5cdC8vIHdoZW4gYWxsIHNhbXBsZXMgYXJlIGVxdWFsLCBidXQgTiBpcyBsYXJnZSAobWlsbGlvbnMpLCB0aGUgUmogY2FuIGJlIG5vbi16ZXJvICggMC4wMDAzLi4uLiAtIHByZWNpc3Npb24gZXJyb3IpXG5cdHZhciBtMCA9IG1bMF0sIG0xID0gbVsxXSwgbTIgPSBtWzJdLCBtMyA9IG1bM10sIGlOID0gKE49PTAgPyAwIDogMS9OKTtcblx0dmFyIFJqID0gW1xuXHRcdFJbIDBdIC0gbTAqbTAqaU4sICBSWyAxXSAtIG0wKm0xKmlOLCAgUlsgMl0gLSBtMCptMippTiwgIFJbIDNdIC0gbTAqbTMqaU4sICBcblx0XHRSWyA0XSAtIG0xKm0wKmlOLCAgUlsgNV0gLSBtMSptMSppTiwgIFJbIDZdIC0gbTEqbTIqaU4sICBSWyA3XSAtIG0xKm0zKmlOLFxuXHRcdFJbIDhdIC0gbTIqbTAqaU4sICBSWyA5XSAtIG0yKm0xKmlOLCAgUlsxMF0gLSBtMiptMippTiwgIFJbMTFdIC0gbTIqbTMqaU4sICBcblx0XHRSWzEyXSAtIG0zKm0wKmlOLCAgUlsxM10gLSBtMyptMSppTiwgIFJbMTRdIC0gbTMqbTIqaU4sICBSWzE1XSAtIG0zKm0zKmlOIFxuXHRdO1xuXHRcblx0dmFyIEEgPSBSaiwgTSA9IFVQTkcuTTQ7XG5cdHZhciBiID0gWzAuNSwwLjUsMC41LDAuNV0sIG1pID0gMCwgdG1pID0gMDtcblx0XG5cdGlmKE4hPTApXG5cdGZvcih2YXIgaT0wOyBpPDEwOyBpKyspIHtcblx0XHRiID0gTS5tdWx0VmVjKEEsIGIpOyAgdG1pID0gTWF0aC5zcXJ0KE0uZG90KGIsYikpOyAgYiA9IE0uc21sKDEvdG1pLCAgYik7XG5cdFx0aWYoTWF0aC5hYnModG1pLW1pKTwxZS05KSBicmVhazsgIG1pID0gdG1pO1xuXHR9XHRcblx0Ly9iID0gWzAsMCwxLDBdOyAgbWk9Tjtcblx0dmFyIHEgPSBbbTAqaU4sIG0xKmlOLCBtMippTiwgbTMqaU5dO1xuXHR2YXIgZU1xMjU1ID0gTS5kb3QoTS5zbWwoMjU1LHEpLGIpO1xuXHRcblx0cmV0dXJuIHsgIENvdjpSaiwgcTpxLCBlOmIsIEw6bWksICBlTXEyNTU6ZU1xMjU1LCBlTXEgOiBNLmRvdChiLHEpLFxuXHRcdFx0XHRyZ2JhOiAoKChNYXRoLnJvdW5kKDI1NSpxWzNdKTw8MjQpIHwgKE1hdGgucm91bmQoMjU1KnFbMl0pPDwxNikgfCAgKE1hdGgucm91bmQoMjU1KnFbMV0pPDw4KSB8IChNYXRoLnJvdW5kKDI1NSpxWzBdKTw8MCkpPj4+MCkgIH07XG59XG5VUE5HLk00ID0ge1xuXHRtdWx0VmVjIDogZnVuY3Rpb24obSx2KSB7XG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRtWyAwXSp2WzBdICsgbVsgMV0qdlsxXSArIG1bIDJdKnZbMl0gKyBtWyAzXSp2WzNdLFxuXHRcdFx0XHRtWyA0XSp2WzBdICsgbVsgNV0qdlsxXSArIG1bIDZdKnZbMl0gKyBtWyA3XSp2WzNdLFxuXHRcdFx0XHRtWyA4XSp2WzBdICsgbVsgOV0qdlsxXSArIG1bMTBdKnZbMl0gKyBtWzExXSp2WzNdLFxuXHRcdFx0XHRtWzEyXSp2WzBdICsgbVsxM10qdlsxXSArIG1bMTRdKnZbMl0gKyBtWzE1XSp2WzNdXG5cdFx0XHRdO1xuXHR9LFxuXHRkb3QgOiBmdW5jdGlvbih4LHkpIHsgIHJldHVybiAgeFswXSp5WzBdK3hbMV0qeVsxXSt4WzJdKnlbMl0reFszXSp5WzNdOyAgfSxcblx0c21sIDogZnVuY3Rpb24oYSx5KSB7ICByZXR1cm4gW2EqeVswXSxhKnlbMV0sYSp5WzJdLGEqeVszXV07ICB9XG59XG5cblVQTkcuZW5jb2RlLmNvbmNhdFJHQkEgPSBmdW5jdGlvbihidWZzKSB7XG5cdHZhciB0bGVuID0gMDtcblx0Zm9yKHZhciBpPTA7IGk8YnVmcy5sZW5ndGg7IGkrKykgdGxlbiArPSBidWZzW2ldLmJ5dGVMZW5ndGg7XG5cdHZhciBuaW1nID0gbmV3IFVpbnQ4QXJyYXkodGxlbiksIG5vZmY9MDtcblx0Zm9yKHZhciBpPTA7IGk8YnVmcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBpbWcgPSBuZXcgVWludDhBcnJheShidWZzW2ldKSwgaWwgPSBpbWcubGVuZ3RoO1xuXHRcdGZvcih2YXIgaj0wOyBqPGlsOyBqKz00KSB7ICBcblx0XHRcdHZhciByPWltZ1tqXSwgZz1pbWdbaisxXSwgYj1pbWdbaisyXSwgYSA9IGltZ1tqKzNdO1xuXHRcdFx0aWYoYT09MCkgcj1nPWI9MDtcblx0XHRcdG5pbWdbbm9mZitqXT1yOyAgbmltZ1tub2ZmK2orMV09ZzsgIG5pbWdbbm9mZitqKzJdPWI7ICBuaW1nW25vZmYraiszXT1hOyAgfVxuXHRcdG5vZmYgKz0gaWw7XG5cdH1cblx0cmV0dXJuIG5pbWcuYnVmZmVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBVUE5HO1xuXG4iLCJ2YXIgZ2V0RGVmYXVsdFBhcmVudCA9IGZ1bmN0aW9uIChvcmlnaW5hbFRhcmdldCkge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgc2FtcGxlVGFyZ2V0ID0gQXJyYXkuaXNBcnJheShvcmlnaW5hbFRhcmdldCkgPyBvcmlnaW5hbFRhcmdldFswXSA6IG9yaWdpbmFsVGFyZ2V0O1xuICAgIHJldHVybiBzYW1wbGVUYXJnZXQub3duZXJEb2N1bWVudC5ib2R5O1xufTtcbnZhciBjb3VudGVyTWFwID0gbmV3IFdlYWtNYXAoKTtcbnZhciB1bmNvbnRyb2xsZWROb2RlcyA9IG5ldyBXZWFrTWFwKCk7XG52YXIgbWFya2VyTWFwID0ge307XG52YXIgbG9ja0NvdW50ID0gMDtcbnZhciB1bndyYXBIb3N0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZSAmJiAobm9kZS5ob3N0IHx8IHVud3JhcEhvc3Qobm9kZS5wYXJlbnROb2RlKSk7XG59O1xudmFyIGNvcnJlY3RUYXJnZXRzID0gZnVuY3Rpb24gKHBhcmVudCwgdGFyZ2V0cykge1xuICAgIHJldHVybiB0YXJnZXRzXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICBpZiAocGFyZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvcnJlY3RlZFRhcmdldCA9IHVud3JhcEhvc3QodGFyZ2V0KTtcbiAgICAgICAgaWYgKGNvcnJlY3RlZFRhcmdldCAmJiBwYXJlbnQuY29udGFpbnMoY29ycmVjdGVkVGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcnJlY3RlZFRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmVycm9yKCdhcmlhLWhpZGRlbicsIHRhcmdldCwgJ2luIG5vdCBjb250YWluZWQgaW5zaWRlJywgcGFyZW50LCAnLiBEb2luZyBub3RoaW5nJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0pXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIEJvb2xlYW4oeCk7IH0pO1xufTtcbi8qKlxuICogTWFya3MgZXZlcnl0aGluZyBleGNlcHQgZ2l2ZW4gbm9kZShvciBub2RlcykgYXMgYXJpYS1oaWRkZW5cbiAqIEBwYXJhbSB7RWxlbWVudCB8IEVsZW1lbnRbXX0gb3JpZ2luYWxUYXJnZXQgLSBlbGVtZW50cyB0byBrZWVwIG9uIHRoZSBwYWdlXG4gKiBAcGFyYW0gW3BhcmVudE5vZGVdIC0gdG9wIGVsZW1lbnQsIGRlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBbbWFya2VyTmFtZV0gLSBhIHNwZWNpYWwgYXR0cmlidXRlIHRvIG1hcmsgZXZlcnkgbm9kZVxuICogQHBhcmFtIHtTdHJpbmd9IFtjb250cm9sQXR0cmlidXRlXSAtIGh0bWwgQXR0cmlidXRlIHRvIGNvbnRyb2xcbiAqIEByZXR1cm4ge1VuZG99IHVuZG8gY29tbWFuZFxuICovXG52YXIgYXBwbHlBdHRyaWJ1dGVUb090aGVycyA9IGZ1bmN0aW9uIChvcmlnaW5hbFRhcmdldCwgcGFyZW50Tm9kZSwgbWFya2VyTmFtZSwgY29udHJvbEF0dHJpYnV0ZSkge1xuICAgIHZhciB0YXJnZXRzID0gY29ycmVjdFRhcmdldHMocGFyZW50Tm9kZSwgQXJyYXkuaXNBcnJheShvcmlnaW5hbFRhcmdldCkgPyBvcmlnaW5hbFRhcmdldCA6IFtvcmlnaW5hbFRhcmdldF0pO1xuICAgIGlmICghbWFya2VyTWFwW21hcmtlck5hbWVdKSB7XG4gICAgICAgIG1hcmtlck1hcFttYXJrZXJOYW1lXSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgfVxuICAgIHZhciBtYXJrZXJDb3VudGVyID0gbWFya2VyTWFwW21hcmtlck5hbWVdO1xuICAgIHZhciBoaWRkZW5Ob2RlcyA9IFtdO1xuICAgIHZhciBlbGVtZW50c1RvS2VlcCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZWxlbWVudHNUb1N0b3AgPSBuZXcgU2V0KHRhcmdldHMpO1xuICAgIHZhciBrZWVwID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIGlmICghZWwgfHwgZWxlbWVudHNUb0tlZXAuaGFzKGVsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzVG9LZWVwLmFkZChlbCk7XG4gICAgICAgIGtlZXAoZWwucGFyZW50Tm9kZSk7XG4gICAgfTtcbiAgICB0YXJnZXRzLmZvckVhY2goa2VlcCk7XG4gICAgdmFyIGRlZXAgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgIGlmICghcGFyZW50IHx8IGVsZW1lbnRzVG9TdG9wLmhhcyhwYXJlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChwYXJlbnQuY2hpbGRyZW4sIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudHNUb0tlZXAuaGFzKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgZGVlcChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRyID0gbm9kZS5nZXRBdHRyaWJ1dGUoY29udHJvbEF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhbHJlYWR5SGlkZGVuID0gYXR0ciAhPT0gbnVsbCAmJiBhdHRyICE9PSAnZmFsc2UnO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRlclZhbHVlID0gKGNvdW50ZXJNYXAuZ2V0KG5vZGUpIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmtlclZhbHVlID0gKG1hcmtlckNvdW50ZXIuZ2V0KG5vZGUpIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgY291bnRlck1hcC5zZXQobm9kZSwgY291bnRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyQ291bnRlci5zZXQobm9kZSwgbWFya2VyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlclZhbHVlID09PSAxICYmIGFscmVhZHlIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuY29udHJvbGxlZE5vZGVzLnNldChub2RlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobWFya2VyVmFsdWUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG1hcmtlck5hbWUsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5SGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShjb250cm9sQXR0cmlidXRlLCAndHJ1ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2FyaWEtaGlkZGVuOiBjYW5ub3Qgb3BlcmF0ZSBvbiAnLCBub2RlLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgZGVlcChwYXJlbnROb2RlKTtcbiAgICBlbGVtZW50c1RvS2VlcC5jbGVhcigpO1xuICAgIGxvY2tDb3VudCsrO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGhpZGRlbk5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHZhciBjb3VudGVyVmFsdWUgPSBjb3VudGVyTWFwLmdldChub2RlKSAtIDE7XG4gICAgICAgICAgICB2YXIgbWFya2VyVmFsdWUgPSBtYXJrZXJDb3VudGVyLmdldChub2RlKSAtIDE7XG4gICAgICAgICAgICBjb3VudGVyTWFwLnNldChub2RlLCBjb3VudGVyVmFsdWUpO1xuICAgICAgICAgICAgbWFya2VyQ291bnRlci5zZXQobm9kZSwgbWFya2VyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFjb3VudGVyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXVuY29udHJvbGxlZE5vZGVzLmhhcyhub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShjb250cm9sQXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdW5jb250cm9sbGVkTm9kZXMuZGVsZXRlKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtYXJrZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG1hcmtlck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbG9ja0NvdW50LS07XG4gICAgICAgIGlmICghbG9ja0NvdW50KSB7XG4gICAgICAgICAgICAvLyBjbGVhclxuICAgICAgICAgICAgY291bnRlck1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICBjb3VudGVyTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgICAgIHVuY29udHJvbGxlZE5vZGVzID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgICAgIG1hcmtlck1hcCA9IHt9O1xuICAgICAgICB9XG4gICAgfTtcbn07XG4vKipcbiAqIE1hcmtzIGV2ZXJ5dGhpbmcgZXhjZXB0IGdpdmVuIG5vZGUob3Igbm9kZXMpIGFzIGFyaWEtaGlkZGVuXG4gKiBAcGFyYW0ge0VsZW1lbnQgfCBFbGVtZW50W119IG9yaWdpbmFsVGFyZ2V0IC0gZWxlbWVudHMgdG8ga2VlcCBvbiB0aGUgcGFnZVxuICogQHBhcmFtIFtwYXJlbnROb2RlXSAtIHRvcCBlbGVtZW50LCBkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5XG4gKiBAcGFyYW0ge1N0cmluZ30gW21hcmtlck5hbWVdIC0gYSBzcGVjaWFsIGF0dHJpYnV0ZSB0byBtYXJrIGV2ZXJ5IG5vZGVcbiAqIEByZXR1cm4ge1VuZG99IHVuZG8gY29tbWFuZFxuICovXG5leHBvcnQgdmFyIGhpZGVPdGhlcnMgPSBmdW5jdGlvbiAob3JpZ2luYWxUYXJnZXQsIHBhcmVudE5vZGUsIG1hcmtlck5hbWUpIHtcbiAgICBpZiAobWFya2VyTmFtZSA9PT0gdm9pZCAwKSB7IG1hcmtlck5hbWUgPSAnZGF0YS1hcmlhLWhpZGRlbic7IH1cbiAgICB2YXIgdGFyZ2V0cyA9IEFycmF5LmZyb20oQXJyYXkuaXNBcnJheShvcmlnaW5hbFRhcmdldCkgPyBvcmlnaW5hbFRhcmdldCA6IFtvcmlnaW5hbFRhcmdldF0pO1xuICAgIHZhciBhY3RpdmVQYXJlbnROb2RlID0gcGFyZW50Tm9kZSB8fCBnZXREZWZhdWx0UGFyZW50KG9yaWdpbmFsVGFyZ2V0KTtcbiAgICBpZiAoIWFjdGl2ZVBhcmVudE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgfVxuICAgIC8vIHdlIHNob3VsZCBub3QgaGlkZSBhcmlhTGl2ZSBlbGVtZW50cyAtIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVLYXNoZXkvYXJpYS1oaWRkZW4vaXNzdWVzLzEwXG4gICAgdGFyZ2V0cy5wdXNoLmFwcGx5KHRhcmdldHMsIEFycmF5LmZyb20oYWN0aXZlUGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdbYXJpYS1saXZlXScpKSk7XG4gICAgcmV0dXJuIGFwcGx5QXR0cmlidXRlVG9PdGhlcnModGFyZ2V0cywgYWN0aXZlUGFyZW50Tm9kZSwgbWFya2VyTmFtZSwgJ2FyaWEtaGlkZGVuJyk7XG59O1xuLyoqXG4gKiBNYXJrcyBldmVyeXRoaW5nIGV4Y2VwdCBnaXZlbiBub2RlKG9yIG5vZGVzKSBhcyBpbmVydFxuICogQHBhcmFtIHtFbGVtZW50IHwgRWxlbWVudFtdfSBvcmlnaW5hbFRhcmdldCAtIGVsZW1lbnRzIHRvIGtlZXAgb24gdGhlIHBhZ2VcbiAqIEBwYXJhbSBbcGFyZW50Tm9kZV0gLSB0b3AgZWxlbWVudCwgZGVmYXVsdHMgdG8gZG9jdW1lbnQuYm9keVxuICogQHBhcmFtIHtTdHJpbmd9IFttYXJrZXJOYW1lXSAtIGEgc3BlY2lhbCBhdHRyaWJ1dGUgdG8gbWFyayBldmVyeSBub2RlXG4gKiBAcmV0dXJuIHtVbmRvfSB1bmRvIGNvbW1hbmRcbiAqL1xuZXhwb3J0IHZhciBpbmVydE90aGVycyA9IGZ1bmN0aW9uIChvcmlnaW5hbFRhcmdldCwgcGFyZW50Tm9kZSwgbWFya2VyTmFtZSkge1xuICAgIGlmIChtYXJrZXJOYW1lID09PSB2b2lkIDApIHsgbWFya2VyTmFtZSA9ICdkYXRhLWluZXJ0LWVkJzsgfVxuICAgIHZhciBhY3RpdmVQYXJlbnROb2RlID0gcGFyZW50Tm9kZSB8fCBnZXREZWZhdWx0UGFyZW50KG9yaWdpbmFsVGFyZ2V0KTtcbiAgICBpZiAoIWFjdGl2ZVBhcmVudE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgfVxuICAgIHJldHVybiBhcHBseUF0dHJpYnV0ZVRvT3RoZXJzKG9yaWdpbmFsVGFyZ2V0LCBhY3RpdmVQYXJlbnROb2RlLCBtYXJrZXJOYW1lLCAnaW5lcnQnKTtcbn07XG4vKipcbiAqIEByZXR1cm5zIGlmIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBpbmVydFxuICovXG5leHBvcnQgdmFyIHN1cHBvcnRzSW5lcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgSFRNTEVsZW1lbnQucHJvdG90eXBlLmhhc093blByb3BlcnR5KCdpbmVydCcpO1xufTtcbi8qKlxuICogQXV0b21hdGljIGZ1bmN0aW9uIHRvIFwic3VwcHJlc3NcIiBET00gZWxlbWVudHMgLSBfaGlkZV8gb3IgX2luZXJ0XyBpbiB0aGUgYmVzdCBwb3NzaWJsZSB3YXlcbiAqIEBwYXJhbSB7RWxlbWVudCB8IEVsZW1lbnRbXX0gb3JpZ2luYWxUYXJnZXQgLSBlbGVtZW50cyB0byBrZWVwIG9uIHRoZSBwYWdlXG4gKiBAcGFyYW0gW3BhcmVudE5vZGVdIC0gdG9wIGVsZW1lbnQsIGRlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBbbWFya2VyTmFtZV0gLSBhIHNwZWNpYWwgYXR0cmlidXRlIHRvIG1hcmsgZXZlcnkgbm9kZVxuICogQHJldHVybiB7VW5kb30gdW5kbyBjb21tYW5kXG4gKi9cbmV4cG9ydCB2YXIgc3VwcHJlc3NPdGhlcnMgPSBmdW5jdGlvbiAob3JpZ2luYWxUYXJnZXQsIHBhcmVudE5vZGUsIG1hcmtlck5hbWUpIHtcbiAgICBpZiAobWFya2VyTmFtZSA9PT0gdm9pZCAwKSB7IG1hcmtlck5hbWUgPSAnZGF0YS1zdXBwcmVzc2VkJzsgfVxuICAgIHJldHVybiAoc3VwcG9ydHNJbmVydCgpID8gaW5lcnRPdGhlcnMgOiBoaWRlT3RoZXJzKShvcmlnaW5hbFRhcmdldCwgcGFyZW50Tm9kZSwgbWFya2VyTmFtZSk7XG59O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyBIZWxtZXQgfSBmcm9tIFwicmVhY3QtaGVsbWV0XCI7XHJcblxyXG5mdW5jdGlvbiBUaXRsZSh7IHRpdGxlLCBkcml2ZSB9KSB7XHJcbiAgcmV0dXJuIChcclxuICAgIDxIZWxtZXQ+XHJcbiAgICAgIDx0aXRsZT57ZHJpdmUgPyB0aXRsZSA6IGAke3RpdGxlfSAtIE9wZW5TaWdu4oSiYH08L3RpdGxlPlxyXG4gICAgICA8bWV0YSBuYW1lPVwiZGVzY3JpcHRpb25cIiBjb250ZW50PXtgJHt0aXRsZX0gLSBPcGVuU2lnbuKEomB9IC8+XHJcbiAgICAgIDxsaW5rXHJcbiAgICAgICAgcmVsPVwiaWNvblwiXHJcbiAgICAgICAgdHlwZT1cImltYWdlL3BuZ1wiXHJcbiAgICAgICAgaHJlZj17bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJmZXZfSWNvblwiKX1cclxuICAgICAgICBzaXplcz1cIjQweDQwXCJcclxuICAgICAgLz5cclxuICAgIDwvSGVsbWV0PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRpdGxlO1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcblxyXG5mdW5jdGlvbiBCb3JkZXJSZXNpemUoeyByaWdodCwgdG9wIH0pIHtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzc05hbWU9e2Ake3JpZ2h0ID8gYC1yaWdodC1bMTJweF1gIDogXCItcmlnaHQtWzFweF1cIn0gJHtcclxuICAgICAgICB0b3AgPyBgLWJvdHRvbS1bMTFweF1gIDogXCItYm90dG9tLVsxcHhdXCJcclxuICAgICAgfSBhYnNvbHV0ZSBpbmxpbmUtYmxvY2sgdy1bMTRweF0gaC1bMTRweF0gaG92ZXI6Y3Vyc29yLXN3LXJlc2l6ZSBib3JkZXItci1bM3B4XSBib3JkZXItYi1bM3B4XSBib3JkZXItWyMxODhhZTJdYH1cclxuICAgID48L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCb3JkZXJSZXNpemU7XHJcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xyXG5mdW5jdGlvbiBEZWZhdWx0U2lnbmF0dXJlKHsgZGVmYXVsdFNpZ25JbWcsIHh5UG9zdGlvbiwgc2V0RGVmYXVsdFNpZ25BbGVydCB9KSB7XHJcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xyXG5cclxuICBjb25zdCBjb25maXJtVG9hZGREZWZhdWx0U2lnbiA9ICgpID0+IHtcclxuICAgIGlmICh4eVBvc3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICBzZXREZWZhdWx0U2lnbkFsZXJ0KHtcclxuICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgYWxlcnRNZXNzYWdlOiB0KFwiZGVmYXVsdC1zaWduLWFsZXJ0XCIpXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2V0RGVmYXVsdFNpZ25BbGVydCh7XHJcbiAgICAgICAgaXNTaG93OiB0cnVlLFxyXG4gICAgICAgIGFsZXJ0TWVzc2FnZTogdChcInBsZWFzZS1zZWxlY3QtcG9zaXRpb24hXCIpXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGRhdGEtdHV0PVwicmVhY3RvdXJUaGlyZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LTIgcHItMiBwdC0yIHBiLTEgdGV4dC1bMTVweF0gdGV4dC1iYXNlLWNvbnRlbnQgZm9udC1zZW1pYm9sZCBib3JkZXItYi1bMXB4XSBib3JkZXItYmFzZS0zMDBcIj5cclxuICAgICAgICB7dChcInNpZ25hdHVyZVwiKX1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgbXQtWzEwcHhdIGZvbnQtc2VtaWJvbGRcIj5cclxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UtY29udGVudFwiPnt0KFwiWW91ci1TaWduYXR1cmVcIil9PC9wPlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtY2FyZCBzaGFkb3ctbWQgaC1bMTExcHhdIHctWzkwJV0gcC0yXCI+XHJcbiAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgIGFsdD1cInNpZ25hdHVyZVwiXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgb2JqZWN0LWNvbnRhaW5cIlxyXG4gICAgICAgICAgICBzcmM9e2RlZmF1bHRTaWduSW1nfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gbXQtWzEwcHhdXCJcclxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGNvbmZpcm1Ub2FkZERlZmF1bHRTaWduKCl9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3QoXCJhdXRvLXNpZ24tYWxsXCIpfVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERlZmF1bHRTaWduYXR1cmU7XHJcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgUHJldk5leHQgZnJvbSBcIi4vUHJldk5leHRcIjtcclxuaW1wb3J0IHtcclxuICBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlLFxyXG4gIGhhbmRsZURvd25sb2FkUGRmLFxyXG4gIGhhbmRsZVRvUHJpbnRcclxufSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcclxuaW1wb3J0IFwiLi4vLi4vc3R5bGVzL3NpZ25hdHVyZS5jc3NcIjtcclxuaW1wb3J0ICogYXMgRHJvcGRvd25NZW51IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtZHJvcGRvd24tbWVudVwiO1xyXG5pbXBvcnQgTW9kYWxVaSBmcm9tIFwiLi4vLi4vcHJpbWl0aXZlcy9Nb2RhbFVpXCI7XHJcbmltcG9ydCBMb2FkZXIgZnJvbSBcIi4uLy4uL3ByaW1pdGl2ZXMvTG9hZGVyXCI7XHJcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcclxuXHJcbmZ1bmN0aW9uIEhlYWRlcih7XHJcbiAgaXNQZGZSZXF1ZXN0RmlsZXMsXHJcbiAgaXNQbGFjZWhvbGRlcixcclxuICBzZXRJc0RlY2xpbmUsXHJcbiAgcGFnZU51bWJlcixcclxuICBhbGxQYWdlcyxcclxuICBjaGFuZ2VQYWdlLFxyXG4gIHBkZlVybCxcclxuICBlbWJlZFdpZGdldHNEYXRhLFxyXG4gIHBkZkRldGFpbHMsXHJcbiAgc2lnbmVyUG9zLFxyXG4gIHNpZ25lcnNkYXRhLFxyXG4gIGlzTWFpbFNlbmQsXHJcbiAgYWxlcnRTZW5kRW1haWwsXHJcbiAgaXNDb21wbGV0ZWQsXHJcbiAgaXNTaG93SGVhZGVyLFxyXG4gIGRlY2xpbmUsXHJcbiAgY3VycmVudFNpZ25lcixcclxuICBhbHJlYWR5U2lnbixcclxuICBpc1NpZ25Zb3Vyc2VsZixcclxuICBzZXRJc0VtYWlsLFxyXG4gIGNvbXBsZXRlQnRuVGl0bGUsXHJcbiAgc2V0SXNFZGl0VGVtcGxhdGUsXHJcbiAgaXNQdWJsaWNUZW1wbGF0ZSxcclxuICBjbGlja09uWm9vbUluLFxyXG4gIGNsaWNrT25ab29tT3V0LFxyXG4gIGhhbmRsZVJvdGF0aW9uRnVuLFxyXG4gIGlzRGlzYWJsZVJvdGF0ZSxcclxuICB0ZW1wbGF0ZUlkLFxyXG4gIHNldElzRG93bmxvYWRNb2RhbFxyXG59KSB7XHJcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xyXG4gIGNvbnN0IGZpbHRlclByZWZpbGwgPVxyXG4gICAgc2lnbmVyUG9zICYmIHNpZ25lclBvcz8uZmlsdGVyKChkYXRhKSA9PiBkYXRhLlJvbGUgIT09IFwicHJlZmlsbFwiKTtcclxuICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNzY3O1xyXG4gIGNvbnN0IFtpc0Rvd25sb2FkaW5nLCBzZXRJc0Rvd25sb2FkaW5nXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IGlzR3Vlc3RTaWduZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImlzR3Vlc3RTaWduZXJcIik7XHJcblxyXG4gIC8vZnVuY3Rpb24gZm9yIHNob3cgZGVjbGluZSBhbGVydFxyXG4gIGNvbnN0IGhhbmRsZURlY2xpbmVQZGZBbGVydCA9IGFzeW5jICgpID0+IHtcclxuICAgIGNvbnN0IGN1cnJlbnREZWNsaW5lID0geyBjdXJybnQ6IFwiU3VyZVwiLCBpc0RlY2xpbmVkOiB0cnVlIH07XHJcbiAgICBzZXRJc0RlY2xpbmUoY3VycmVudERlY2xpbmUpO1xyXG4gIH07XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBweS1bNXB4XVwiPlxyXG4gICAgICB7aXNNb2JpbGUgJiYgaXNTaG93SGVhZGVyID8gKFxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGlkPVwibmF2YmFyXCJcclxuICAgICAgICAgIGNsYXNzTmFtZT17aXNHdWVzdFNpZ25lciA/IFwic3RpY2t5U2lnbmVySGVhZFwiIDogXCJzdGlja3lIZWFkXCJ9XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICB3aWR0aDogaXNHdWVzdFNpZ25lclxyXG4gICAgICAgICAgICAgID8gd2luZG93LmlubmVyV2lkdGhcclxuICAgICAgICAgICAgICA6IHdpbmRvdy5pbm5lcldpZHRoIC0gMzAgKyBcInB4XCJcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgcHktWzVweF0gcHgtWzEwcHhdIFwiPlxyXG4gICAgICAgICAgICA8ZGl2IG9uQ2xpY2s9eygpID0+IHdpbmRvdy5oaXN0b3J5LmdvKC0yKX0+XHJcbiAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWFycm93LWxlZnQgdGV4dC1iYXNlLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPFByZXZOZXh0XHJcbiAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICBhbGxQYWdlcz17YWxsUGFnZXN9XHJcbiAgICAgICAgICAgICAgY2hhbmdlUGFnZT17Y2hhbmdlUGFnZX1cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAge2lzQ29tcGxldGVkIHx8IGFscmVhZHlTaWduID8gKFxyXG4gICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuUm9vdD5cclxuICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuVHJpZ2dlciBhc0NoaWxkPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm9wLWxpbmsgb3AtbGluay1wcmltYXJ5IG5vLXVuZGVybGluZSB0ZXh0LVsxNnB4XSBmb250LXNlbWlib2xkIHByLVszcHhdIHBsLVs1cHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWVsbGlwc2lzLXZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlBvcnRhbD5cclxuICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Db250ZW50XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51Q29udGVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc2lkZU9mZnNldD17NX1cclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51SXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRG93bmxvYWRNb2RhbCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZFBkZihwZGZEZXRhaWxzLCBzZXRJc0Rvd25sb2FkaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hcnJvdy1kb3duIG1yLVszcHhdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7dChcImRvd25sb2FkXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICB7aXNDb21wbGV0ZWQgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIkRyb3Bkb3duTWVudUl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkQ2VydGlmaWNhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvcmRlci1ub25lIGJnLVsjZmZmXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hd2FyZCBtci1bM3B4XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJjZXJ0aWZpY2F0ZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAge2lzU2lnbllvdXJzZWxmICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJEcm9wZG93bk1lbnVJdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNFbWFpbCh0cnVlKX1cclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWVudmVsb3BlIG1yLVszcHhdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcIm1haWxcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51SXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9QcmludChlLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcsIHBkZkRldGFpbHMpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtcHJpbnQgbXItWzNweF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwicHJpbnRcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxyXG4gICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Db250ZW50PlxyXG4gICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuUG9ydGFsPlxyXG4gICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlJvb3Q+XHJcbiAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYXJvdW5kIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgey8qIGN1cnJlbnQgc2lnbmVyIGlzIGNoZWNraW5nIHVzZXIgc2VuZCByZXF1ZXN0IGFuZCBjaGVjayBzdGF0dXMgb2YgcGRmIHNpZ24gdGhhbiBpZiBjdXJyZW50IFxyXG4gICAgICAgICAgICAgICAgdXNlciBleGlzdCB0aGFuIHNob3cgZmluaXNoIGJ1dHRvbiBlbHNlIG5vXHJcbiAgICAgICAgICAgICAgICAqL31cclxuICAgICAgICAgICAgICAgIHtjdXJyZW50U2lnbmVyICYmIChcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlclwiIGRhdGEtdHV0PVwicmVhY3RvdXJGaWZ0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtkZWNsaW5lICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVjbGluZVBkZkFsZXJ0KCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtW3JlZF0gYm9yZGVyLW5vbmUgZm9udC1bNjUwXSB0ZXh0LVsxNHB4XSBtci0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJkZWNsaW5lXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICB7aXNQbGFjZWhvbGRlciA/IChcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNNYWlsU2VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnRTZW5kRW1haWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNYWlsU2VuZCA/IFwiXCIgOiBcIm9wLWxpbmstcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayBuby11bmRlcmxpbmUgZm9udC1bNjUwXSB0ZXh0LVsxNHB4XWB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdHV0PVwiaGVhZGVyQXJlYVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb21wbGV0ZUJ0blRpdGxlID8gY29tcGxldGVCdG5UaXRsZSA6IHQoXCJzZW5kXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10dXQ9XCJyZWFjdG91clRoaXJkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZW1iZWRXaWRnZXRzRGF0YSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItbm9uZSBmb250LVs2NTBdIHRleHQtWzE0cHhdIG9wLWxpbmsgb3AtbGluay1wcmltYXJ5IG5vLXVuZGVybGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiZmluaXNoXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlJvb3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlRyaWdnZXIgYXNDaGlsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb250LVs2NTBdIHRleHQtWzE4cHhdIHB4LTIgbWwtWzRweF0gdGV4dC1iYXNlLWNvbnRlbnQgbm8tdW5kZXJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWVsbGlwc2lzLXZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LlBvcnRhbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5Db250ZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctd2hpdGUgc2hhZG93LW1kIHJvdW5kZWQtbWQgcHgtMyBweS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlT2Zmc2V0PXs1fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJEcm9wZG93bk1lbnVJdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkUGRmKHBkZkRldGFpbHMsIHNldElzRG93bmxvYWRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXJyb3ctZG93biBtci1bM3B4XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1bNTAwXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiZG93bmxvYWRcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51Lkl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyFpc0Rpc2FibGVSb3RhdGUgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51SXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlUm90YXRpb25GdW4oOTApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1yb3RhdGUtcmlnaHQgdGV4dC1ncmF5LTUwMCAyeGw6dGV4dC1bMzBweF0gbXItWzNweF1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LVs1MDBdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwicm90YXRlLXJpZ2h0XCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd25NZW51Lkl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJEcm9wZG93bk1lbnVJdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVSb3RhdGlvbkZ1bigtOTApfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1yb3RhdGUtbGVmdCB0ZXh0LWdyYXktNTAwIDJ4bDp0ZXh0LVszMHB4XSBtci1bM3B4XVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtWzUwMF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJyb3RhdGUtbGVmdFwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51SXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBjbGlja09uWm9vbUluKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLW1hZ25pZnlpbmctZ2xhc3MtcGx1cyB0ZXh0LWdyYXktNTAwIDJ4bDp0ZXh0LVszMHB4XSBtci1bM3B4XVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1bNTAwXVwiPnt0KFwiem9vbS1pblwiKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5JdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiRHJvcGRvd25NZW51SXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBjbGlja09uWm9vbU91dCgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1tYWduaWZ5aW5nLWdsYXNzLW1pbnVzIHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdIG1yLVszcHhdXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LVs1MDBdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJ6b29tLW91dFwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuSXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuQ29udGVudD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlBvcnRhbD5cclxuICAgICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Sb290PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICB7aXNQdWJsaWNUZW1wbGF0ZSAmJiAoXHJcbiAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLXR1dD1cInJlYWN0b3VyVGhpcmRcIlxyXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGVtYmVkV2lkZ2V0c0RhdGEoKX1cclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItbm9uZSBmb250LVs2NTBdIHRleHQtWzE0cHhdIG9wLWxpbmsgb3AtbGluay1wcmltYXJ5IG5vLXVuZGVybGluZVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7dChcInNpZ24tbm93XCIpfVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgdy1mdWxsIGdhcC15LTEgbWwtMVwiPlxyXG4gICAgICAgICAgPFByZXZOZXh0XHJcbiAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgIGFsbFBhZ2VzPXthbGxQYWdlc31cclxuICAgICAgICAgICAgY2hhbmdlUGFnZT17Y2hhbmdlUGFnZX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICB7aXNQbGFjZWhvbGRlciA/IChcclxuICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggbXgtWzEwMHB4XSBsZzpteC0wIG9yZGVyLWxhc3QgbGc6b3JkZXItbm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgeyFpc01haWxTZW5kICYmXHJcbiAgICAgICAgICAgICAgICAgIHNpZ25lcnNkYXRhLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgc2lnbmVyc2RhdGEubGVuZ3RoICE9PSBmaWx0ZXJQcmVmaWxsLmxlbmd0aCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIHtmaWx0ZXJQcmVmaWxsLmxlbmd0aCA9PT0gMCA/IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1bI2Y1NDA1ZV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImFkZFwiKX0ge3NpZ25lcnNkYXRhLmxlbmd0aCAtIGZpbHRlclByZWZpbGwubGVuZ3RofXtcIiBcIn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInJlY2lwaWVudHNcIil9IHt0KFwid2lkZ2V0cy1uYW1lLnNpZ25hdHVyZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1bI2Y1NDA1ZV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImFkZFwiKX0ge3NpZ25lcnNkYXRhLmxlbmd0aCAtIGZpbHRlclByZWZpbGwubGVuZ3RofXtcIiBcIn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcIm1vcmVcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJyZWNpcGllbnRzXCIpfSB7dChcIndpZGdldHMtbmFtZS5zaWduYXR1cmVcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4XCI+XHJcbiAgICAgICAgICAgICAgICB7c2V0SXNFZGl0VGVtcGxhdGUgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNFZGl0VGVtcGxhdGUodHJ1ZSl9XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3V0bGluZS1ub25lIGJvcmRlci1ub25lIHRleHQtY2VudGVyIG1yLVszcHhdXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWdlYXIgZmEtbGdcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gd2luZG93Lmhpc3RvcnkuZ28oLTIpfVxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdCBvcC1idG4tc20gbXItWzNweF1cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICB7dChcImJhY2tcIil9XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzTWFpbFNlbmQgJiYgdHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgZGF0YS10dXQ9XCJoZWFkZXJBcmVhXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1zbSBtci1bM3B4XVwiXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGFsZXJ0U2VuZEVtYWlsKCl9XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIHtjb21wbGV0ZUJ0blRpdGxlXHJcbiAgICAgICAgICAgICAgICAgICAgPyBjb21wbGV0ZUJ0blRpdGxlXHJcbiAgICAgICAgICAgICAgICAgICAgOiBpc01haWxTZW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICA/IHQoXCJzZW50XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICA6IHQoXCJzZW5kXCIpfVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgKSA6IGlzUGRmUmVxdWVzdEZpbGVzID8gKFxyXG4gICAgICAgICAgICBhbHJlYWR5U2lnbiA/IChcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9QcmludChlLCBwZGZVcmwsIHNldElzRG93bmxvYWRpbmcsIHBkZkRldGFpbHMpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tbmV1dHJhbCBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1wcmludCBweS1bM3B4XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+e3QoXCJwcmludFwiKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIHtpc0NvbXBsZXRlZCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZShwZGZEZXRhaWxzLCBzZXRJc0Rvd25sb2FkaW5nKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXNlY29uZGFyeSBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hd2FyZCBweS1bM3B4XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+e3QoXCJjZXJ0aWZpY2F0ZVwiKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcclxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZE1vZGFsKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZFBkZihwZGZEZXRhaWxzLCBzZXRJc0Rvd25sb2FkaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZG93bmxvYWQgcHktWzNweF1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPnt0KFwiZG93bmxvYWRcIil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4XCIgZGF0YS10dXQ9XCJyZWFjdG91ckZpZnRoXCI+XHJcbiAgICAgICAgICAgICAgICB7IXRlbXBsYXRlSWQgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gd2luZG93Lmhpc3RvcnkuZ28oLTIpfVxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tZ2hvc3Qgb3AtYnRuLXNtIG1yLVszcHhdXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHt0KFwiYmFja1wiKX1cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAge2N1cnJlbnRTaWduZXIgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgICAgIHt0ZW1wbGF0ZUlkICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZFBkZihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkRldGFpbHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0Rvd25sb2FkaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWdob3N0IG9wLWJ0bi1zbSBtci1bM3B4XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPnt0KFwiZG93bmxvYWRcIil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXNlY29uZGFyeSBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcclxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZURlY2xpbmVQZGZBbGVydCgpfVxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIHt0KFwiZGVjbGluZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gbXItWzNweF0gc2hhZG93XCJcclxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGVtYmVkV2lkZ2V0c0RhdGEoKX1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7dChcImZpbmlzaFwiKX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICB7IXRlbXBsYXRlSWQgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1uZXV0cmFsIG9wLWJ0bi1zbSBtci1bM3B4XSBzaGFkb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkUGRmKHBkZkRldGFpbHMsIHNldElzRG93bmxvYWRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXJyb3ctZG93biBmb250LXNlbWlib2xkIGxnOmhpZGRlblwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+e3QoXCJkb3dubG9hZFwiKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICkgOiBpc0NvbXBsZXRlZCA/IChcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgICAge2lzQ29tcGxldGVkICYmIChcclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRDZXJ0aWZpY2F0ZShwZGZEZXRhaWxzLCBzZXRJc0Rvd25sb2FkaW5nKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tc2Vjb25kYXJ5IG9wLWJ0bi1zbSBnYXAtMCBmb250LW1lZGl1bSB0ZXh0LVsxMnB4XSBtci1bM3B4XSBzaGFkb3dcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1hd2FyZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrIG1sLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICB7dChcImNlcnRpZmljYXRlXCIpfVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PlxyXG4gICAgICAgICAgICAgICAgICBoYW5kbGVUb1ByaW50KGUsIHBkZlVybCwgc2V0SXNEb3dubG9hZGluZywgcGRmRGV0YWlscylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1uZXV0cmFsIG9wLWJ0bi1zbSBnYXAtMCBmb250LW1lZGl1bSB0ZXh0LVsxMnB4XSBtci1bM3B4XSBzaGFkb3dcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXByaW50XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrIG1sLTFcIj57dChcInByaW50XCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gZ2FwLTAgZm9udC1tZWRpdW0gdGV4dC1bMTJweF0gbXItWzNweF0gc2hhZG93XCJcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgc2V0SXNEb3dubG9hZE1vZGFsKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1kb3dubG9hZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9jayBtbC0xXCI+e3QoXCJkb3dubG9hZFwiKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLWluZm8gb3AtYnRuLXNtIGdhcC0wIGZvbnQtbWVkaXVtIHRleHQtWzEycHhdIG1yLVszcHhdIHNoYWRvd1wiXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRJc0VtYWlsKHRydWUpfVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWVudmVsb3BlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrIG1sLTFcIj57dChcIm1haWxcIil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICkgOiBpc1B1YmxpY1RlbXBsYXRlID8gKFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXhcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeSBvcC1idG4tc20gIHNoYWRvd1wiXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBlbWJlZFdpZGdldHNEYXRhKCl9XHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3QoXCJzaWduLW5vd1wiKX1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXhcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB3aW5kb3cuaGlzdG9yeS5nbygtMil9XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tZ2hvc3Qgb3AtYnRuLXNtIG1yLVszcHhdXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7dChcImJhY2tcIil9XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnkgb3AtYnRuLXNtIG1yLVszcHhdXCJcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGVtYmVkV2lkZ2V0c0RhdGEoKX1cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7dChcImZpbmlzaFwiKX1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICApfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApfVxyXG4gICAgICB7aXNEb3dubG9hZGluZyA9PT0gXCJwZGZcIiAmJiAoXHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCB6LVsyMDBdIGluc2V0LTAgZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgYmctYmxhY2sgYmctb3BhY2l0eS0zMFwiPlxyXG4gICAgICAgICAgPExvYWRlciAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApfVxyXG4gICAgICA8TW9kYWxVaVxyXG4gICAgICAgIGlzT3Blbj17aXNEb3dubG9hZGluZyA9PT0gXCJjZXJ0aWZpY2F0ZVwifVxyXG4gICAgICAgIHRpdGxlPXtcclxuICAgICAgICAgIGlzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIlxyXG4gICAgICAgICAgICA/IHQoXCJnZW5lcmF0aW5nLWNlcnRpZmljYXRlXCIpXHJcbiAgICAgICAgICAgIDogdChcInBkZi1kb3dubG9hZFwiKVxyXG4gICAgICAgIH1cclxuICAgICAgICBoYW5kbGVDbG9zZT17KCkgPT4gc2V0SXNEb3dubG9hZGluZyhcIlwiKX1cclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC0zIG1kOnAtNSB0ZXh0LVsxM3B4XSBtZDp0ZXh0LWJhc2UgdGV4dC1jZW50ZXIgdGV4dC1iYXNlLWNvbnRlbnRcIj5cclxuICAgICAgICAgIHtpc0Rvd25sb2FkaW5nID09PSBcImNlcnRpZmljYXRlXCJ9e1wiIFwifVxyXG4gICAgICAgICAgPHA+e3QoXCJnZW5lcmF0ZS1jZXJ0aWZpY2F0ZS1hbGVydFwiKX08L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvTW9kYWxVaT5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XHJcblxyXG5mdW5jdGlvbiBQZGZab29tKHByb3BzKSB7XHJcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbigpO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmZsZXggZmxleC1jb2wgZ2FwLTEgdGV4dC1jZW50ZXIgbWQ6dy1bNSVdIG10LVs0M3B4XSAyeGw6bXQtWzYzcHhdXCI+XHJcbiAgICAgIDxzcGFuXHJcbiAgICAgICAgY2xhc3NOYW1lPVwiYmctZ3JheS01MCBweC1bNHB4XSAyeGw6cHgtWzE1cHhdIDJ4bDpweS1bMTBweF0gY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHByb3BzLmNsaWNrT25ab29tSW4oKX1cclxuICAgICAgICB0aXRsZT17dChcInpvb20taW5cIil9XHJcbiAgICAgID5cclxuICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1tYWduaWZ5aW5nLWdsYXNzLXBsdXMgdGV4dC1ncmF5LTUwMCAyeGw6dGV4dC1bMzBweF1cIj48L2k+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgeyFwcm9wcz8uaXNEaXNhYmxlUm90YXRlICYmIChcclxuICAgICAgICA8PlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctZ3JheS01MCBweC1bNHB4XSAyeGw6cHgtWzE1cHhdIDJ4bDpweS1bMTBweF0gY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5oYW5kbGVSb3RhdGlvbkZ1big5MCl9XHJcbiAgICAgICAgICAgIHRpdGxlPXt0KFwicm90YXRlLXJpZ2h0XCIpfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1yb3RhdGUtcmlnaHQgdGV4dC1ncmF5LTUwMCAyeGw6dGV4dC1bMzBweF1cIj48L2k+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJiZy1ncmF5LTUwIHB4LVs0cHhdIDJ4bDpweC1bMTVweF0gMnhsOnB5LVsxMHB4XSBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgIHRpdGxlPXt0KFwicm90YXRlLWxlZnRcIil9XHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHByb3BzLmhhbmRsZVJvdGF0aW9uRnVuKC05MCl9XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXJvdGF0ZS1sZWZ0IHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdXCI+PC9pPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvPlxyXG4gICAgICApfVxyXG4gICAgICA8c3BhblxyXG4gICAgICAgIGNsYXNzTmFtZT1cImJnLWdyYXktNTAgcHgtWzRweF0gMnhsOnB4LVsxNXB4XSAyeGw6cHktWzEwcHhdXCJcclxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5jbGlja09uWm9vbU91dCgpfVxyXG4gICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICBjdXJzb3I6IHByb3BzLnpvb21QZXJjZW50ID4gMCA/IFwicG9pbnRlclwiIDogXCJkZWZhdWx0XCJcclxuICAgICAgICB9fVxyXG4gICAgICAgIHRpdGxlPXt0KFwiem9vbS1vdXRcIil9XHJcbiAgICAgID5cclxuICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1tYWduaWZ5aW5nLWdsYXNzLW1pbnVzIHRleHQtZ3JheS01MDAgMnhsOnRleHQtWzMwcHhdXCI+PC9pPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGRmWm9vbTtcclxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IEJvcmRlclJlc2l6ZSBmcm9tIFwiLi9Cb3JkZXJSZXNpemVcIjtcclxuaW1wb3J0IFBsYWNlaG9sZGVyQm9yZGVyIGZyb20gXCIuL1BsYWNlaG9sZGVyQm9yZGVyXCI7XHJcbmltcG9ydCB7IFJuZCB9IGZyb20gXCJyZWFjdC1ybmRcIjtcclxuaW1wb3J0IHtcclxuICBkZWZhdWx0V2lkdGhIZWlnaHQsXHJcbiAgZm9udENvbG9yQXJyLFxyXG4gIGZvbnRzaXplQXJyLFxyXG4gIGdldENvbnRhaW5lclNjYWxlLFxyXG4gIGhhbmRsZUNvcHlOZXh0VG9XaWRnZXQsXHJcbiAgaXNUYWJBbmRNb2JpbGUsXHJcbiAgb25DaGFuZ2VJbnB1dCxcclxuICByYWRpb0J1dHRvbldpZGdldCxcclxuICB0ZXh0SW5wdXRXaWRnZXQsXHJcbiAgdGV4dFdpZGdldFxyXG59IGZyb20gXCIuLi8uLi9jb25zdGFudC9VdGlsc1wiO1xyXG5pbXBvcnQgUGxhY2Vob2xkZXJUeXBlIGZyb20gXCIuL1BsYWNlaG9sZGVyVHlwZVwiO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuaW1wb3J0IFwiLi4vLi4vc3R5bGVzL29wZW5zaWduZHJpdmUuY3NzXCI7XHJcbmltcG9ydCBNb2RhbFVpIGZyb20gXCIuLi8uLi9wcmltaXRpdmVzL01vZGFsVWlcIjtcclxuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xyXG5cclxuY29uc3Qgc2VsZWN0Rm9ybWF0ID0gKGRhdGEpID0+IHtcclxuICBzd2l0Y2ggKGRhdGEpIHtcclxuICAgIGNhc2UgXCJMXCI6XHJcbiAgICAgIHJldHVybiBcIk1NL2RkL3l5eXlcIjtcclxuICAgIGNhc2UgXCJERC1NTS1ZWVlZXCI6XHJcbiAgICAgIHJldHVybiBcImRkLU1NLXl5eXlcIjtcclxuICAgIGNhc2UgXCJERC9NTS9ZWVlZXCI6XHJcbiAgICAgIHJldHVybiBcImRkL01NL3l5eXlcIjtcclxuICAgIGNhc2UgXCJMTFwiOlxyXG4gICAgICByZXR1cm4gXCJNTU1NIGRkLCB5eXl5XCI7XHJcbiAgICBjYXNlIFwiREQgTU1NLCBZWVlZXCI6XHJcbiAgICAgIHJldHVybiBcImRkIE1NTSwgeXl5eVwiO1xyXG4gICAgY2FzZSBcIllZWVktTU0tRERcIjpcclxuICAgICAgcmV0dXJuIFwieXl5eS1NTS1kZFwiO1xyXG4gICAgY2FzZSBcIk1NLURELVlZWVlcIjpcclxuICAgICAgcmV0dXJuIFwiTU0tZGQteXl5eVwiO1xyXG4gICAgY2FzZSBcIk1NLkRELllZWVlcIjpcclxuICAgICAgcmV0dXJuIFwiTU0uZGQueXl5eVwiO1xyXG4gICAgY2FzZSBcIk1NTSBERCwgWVlZWVwiOlxyXG4gICAgICByZXR1cm4gXCJNTU0gZGQsIHl5eXlcIjtcclxuICAgIGNhc2UgXCJERCBNTU1NLCBZWVlZXCI6XHJcbiAgICAgIHJldHVybiBcImRkIE1NTU0sIHl5eXlcIjtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiBcIk1NL2RkL3l5eXlcIjtcclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQgPSAoZm9ybWF0KSA9PiB7XHJcbiAgc3dpdGNoIChmb3JtYXQpIHtcclxuICAgIGNhc2UgXCJNTS9kZC95eXl5XCI6XHJcbiAgICAgIHJldHVybiBcIkxcIjtcclxuICAgIGNhc2UgXCJkZC1NTS15eXl5XCI6XHJcbiAgICAgIHJldHVybiBcIkRELU1NLVlZWVlcIjtcclxuICAgIGNhc2UgXCJkZC9NTS95eXl5XCI6XHJcbiAgICAgIHJldHVybiBcIkREL01NL1lZWVlcIjtcclxuICAgIGNhc2UgXCJNTU1NIGRkLCB5eXl5XCI6XHJcbiAgICAgIHJldHVybiBcIkxMXCI7XHJcbiAgICBjYXNlIFwiZGQgTU1NLCB5eXl5XCI6XHJcbiAgICAgIHJldHVybiBcIkREIE1NTSwgWVlZWVwiO1xyXG4gICAgY2FzZSBcInl5eXktTU0tZGRcIjpcclxuICAgICAgcmV0dXJuIFwiWVlZWS1NTS1ERFwiO1xyXG4gICAgY2FzZSBcIk1NLWRkLXl5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiTU0tREQtWVlZWVwiO1xyXG4gICAgY2FzZSBcIk1NLmRkLnl5eXlcIjpcclxuICAgICAgcmV0dXJuIFwiTU0uREQuWVlZWVwiO1xyXG4gICAgY2FzZSBcIk1NTSBkZCwgeXl5eVwiOlxyXG4gICAgICByZXR1cm4gXCJNTU0gREQsIFlZWVlcIjtcclxuICAgIGNhc2UgXCJkZCBNTU1NLCB5eXl5XCI6XHJcbiAgICAgIHJldHVybiBcIkREIE1NTU0sIFlZWVlcIjtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiBcIkxcIjtcclxuICB9XHJcbn07XHJcblxyXG4vL2Z1bmN0aW9uIHRvIGdldCBkZWZhdWx0IGRhdGVcclxuY29uc3QgZ2V0RGVmYXVsdGRhdGUgPSAoc2VsZWN0ZWREYXRlLCBmb3JtYXQgPSBcImRkLU1NLXl5eXlcIikgPT4ge1xyXG4gIGxldCBkYXRlO1xyXG4gIGlmIChmb3JtYXQgJiYgZm9ybWF0ID09PSBcImRkLU1NLXl5eXlcIikge1xyXG4gICAgY29uc3QgbmV3ZGF0ZSA9IHNlbGVjdGVkRGF0ZVxyXG4gICAgICA/IHNlbGVjdGVkRGF0ZVxyXG4gICAgICA6IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoY2hhbmdlRGF0ZVRvTW9tZW50Rm9ybWF0KGZvcm1hdCkpO1xyXG4gICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gbmV3ZGF0ZS5zcGxpdChcIi1cIik7XHJcbiAgICBkYXRlID0gbmV3IERhdGUoYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGRhdGUgPSBuZXcgRGF0ZShzZWxlY3RlZERhdGUpO1xyXG4gIH1cclxuICBjb25zdCB2YWx1ZSA9IGRhdGU7XHJcbiAgcmV0dXJuIHZhbHVlO1xyXG59O1xyXG4vL2Z1bmN0aW9uIHRvIGdldCBkZWZhdWx0IGZvcm1hdFxyXG5jb25zdCBnZXREZWZhdWx0Rm9ybWF0ID0gKGRhdGVGb3JtYXQpID0+IGRhdGVGb3JtYXQgfHwgXCJNTS9kZC95eXl5XCI7XHJcblxyXG5mdW5jdGlvbiBQbGFjZWhvbGRlcihwcm9wcykge1xyXG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcclxuICBjb25zdCBbcGxhY2Vob2xkZXJCb3JkZXIsIHNldFBsYWNlaG9sZGVyQm9yZGVyXSA9IHVzZVN0YXRlKHsgdzogMCwgaDogMCB9KTtcclxuICBjb25zdCBbaXNEcmFnZ2luZ0VuYWJsZWQsIHNldERyYWdnaW5nRW5hYmxlZF0gPSB1c2VTdGF0ZSh0cnVlKTtcclxuICBjb25zdCBbaXNEYXRlTW9kYWwsIHNldElzRGF0ZU1vZGFsXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbY29udGFpbmVyU2NhbGUsIHNldENvbnRhaW5lclNjYWxlXSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW3NlbGVjdERhdGUsIHNldFNlbGVjdERhdGVdID0gdXNlU3RhdGUoe1xyXG4gICAgZGF0ZTpcclxuICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiZGF0ZVwiXHJcbiAgICAgICAgPyBtb21lbnQoXHJcbiAgICAgICAgICAgIGdldERlZmF1bHRkYXRlKFxyXG4gICAgICAgICAgICAgIHByb3BzPy5wb3M/Lm9wdGlvbnM/LnJlc3BvbnNlLFxyXG4gICAgICAgICAgICAgIHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XHJcbiAgICAgICAgICAgICkuZ2V0VGltZSgpXHJcbiAgICAgICAgICApLmZvcm1hdChcclxuICAgICAgICAgICAgY2hhbmdlRGF0ZVRvTW9tZW50Rm9ybWF0KHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0KVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIDogXCJcIixcclxuICAgIGZvcm1hdDpcclxuICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiZGF0ZVwiXHJcbiAgICAgICAgPyBnZXREZWZhdWx0Rm9ybWF0KHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0KVxyXG4gICAgICAgIDogXCJcIlxyXG4gIH0pO1xyXG4gIGNvbnN0IFtkYXRlRm9ybWF0LCBzZXREYXRlRm9ybWF0XSA9IHVzZVN0YXRlKFtdKTtcclxuICBjb25zdCBbY2xpY2tvbldpZGdldCwgc2V0Q2xpY2tvbldpZGdldF0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgY29uc3QgW3N0YXJ0RGF0ZSwgc2V0U3RhcnREYXRlXSA9IHVzZVN0YXRlKFxyXG4gICAgcHJvcHMucG9zLnR5cGUgPT09IFwiZGF0ZVwiICYmXHJcbiAgICAgIGdldERlZmF1bHRkYXRlKFxyXG4gICAgICAgIHByb3BzPy5wb3M/Lm9wdGlvbnM/LnJlc3BvbnNlLFxyXG4gICAgICAgIHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XHJcbiAgICAgIClcclxuICApO1xyXG4gIGNvbnN0IFtnZXRDaGVja2JveFJlbmRlcldpZHRoLCBzZXRHZXRDaGVja2JveFJlbmRlcldpZHRoXSA9IHVzZVN0YXRlKHtcclxuICAgIHdpZHRoOiBudWxsLFxyXG4gICAgaGVpZ2h0OiBudWxsXHJcbiAgfSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCBnZXRQZGZQYWdlV2lkdGggPSBwcm9wcy5wZGZPcmlnaW5hbFdILmZpbmQoXHJcbiAgICAgIChkYXRhKSA9PiBkYXRhLnBhZ2VOdW1iZXIgPT09IHByb3BzLnBhZ2VOdW1iZXJcclxuICAgICk7XHJcbiAgICBzZXRDb250YWluZXJTY2FsZShwcm9wcy5jb250YWluZXJXSC53aWR0aCAvIGdldFBkZlBhZ2VXaWR0aC53aWR0aCk7XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXHJcbiAgfSwgW3Byb3BzLmNvbnRhaW5lcldILndpZHRoLCBwcm9wcy5wZGZPcmlnaW5hbFdIXSk7XHJcbiAgY29uc3QgZGF0ZUZvcm1hdEFyciA9IFtcclxuICAgIFwiTFwiLFxyXG4gICAgXCJERC1NTS1ZWVlZXCIsXHJcbiAgICBcIllZWVktTU0tRERcIixcclxuICAgIFwiTU0uREQuWVlZWVwiLFxyXG4gICAgXCJNTS1ERC1ZWVlZXCIsXHJcbiAgICBcIk1NTSBERCwgWVlZWVwiLFxyXG4gICAgXCJMTFwiLFxyXG4gICAgXCJERCBNTU0sIFlZWVlcIixcclxuICAgIFwiREQgTU1NTSwgWVlZWVwiXHJcbiAgXTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IHVwZGF0ZVdpZHRoID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBybmRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHJvcHMucG9zLmtleSk7XHJcbiAgICAgIGlmIChybmRFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBybmRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIHNldEdldENoZWNrYm94UmVuZGVyV2lkdGgoeyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIERlbGF5IHRvIGVuc3VyZSByZW5kZXJpbmcgaXMgY29tcGxldGVcclxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCh1cGRhdGVXaWR0aCwgMCk7XHJcblxyXG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lcik7XHJcbiAgfSwgW3Byb3BzLnBvc10pO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgY2xvc2VNZW51T25PdXRzaWRlQ2xpY2sgPSAoZSkgPT4ge1xyXG4gICAgICBpZiAoIWlzRHJhZ2dpbmdFbmFibGVkICYmICFlLnRhcmdldC5jbG9zZXN0KFwiI2NoYW5nZUlzRHJhZ2dpbmdcIikpIHtcclxuICAgICAgICBzZXREcmFnZ2luZ0VuYWJsZWQodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGNsb3NlTWVudU9uT3V0c2lkZUNsaWNrKTtcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAvLyBDbGVhbnVwIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcclxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGNsb3NlTWVudU9uT3V0c2lkZUNsaWNrKTtcclxuICAgIH07XHJcbiAgfSwgW2lzRHJhZ2dpbmdFbmFibGVkXSk7XHJcbiAgLy9mdW5jdGlvbiBjaGFuZ2UgZm9ybWF0IGFycmF5IGxpc3Qgd2l0aCBzZWxlY3RlZCBkYXRlIGFuZCBmb3JtYXRcclxuICBjb25zdCBjaGFuZ2VEYXRlRm9ybWF0ID0gKCkgPT4ge1xyXG4gICAgY29uc3QgdXBkYXRlRGF0ZSA9IFtdO1xyXG4gICAgZGF0ZUZvcm1hdEFyci5tYXAoKGRhdGEpID0+IHtcclxuICAgICAgbGV0IGRhdGU7XHJcbiAgICAgIGlmIChzZWxlY3REYXRlICYmIHNlbGVjdERhdGUuZm9ybWF0ID09PSBcImRkLU1NLXl5eXlcIikge1xyXG4gICAgICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHNlbGVjdERhdGUuZGF0ZS5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShzZWxlY3REYXRlPy5kYXRlKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFRpbWUoKTtcclxuICAgICAgY29uc3QgbmV3RGF0ZSA9IG1vbWVudChtaWxsaXNlY29uZHMpLmZvcm1hdChkYXRhKTtcclxuICAgICAgY29uc3QgZGF0ZU9iaiA9IHtcclxuICAgICAgICBkYXRlOiBuZXdEYXRlLFxyXG4gICAgICAgIGZvcm1hdDogc2VsZWN0Rm9ybWF0KGRhdGEpXHJcbiAgICAgIH07XHJcbiAgICAgIHVwZGF0ZURhdGUucHVzaChkYXRlT2JqKTtcclxuICAgIH0pO1xyXG4gICAgc2V0RGF0ZUZvcm1hdCh1cGRhdGVEYXRlKTtcclxuICB9O1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHByb3BzLmlzUGxhY2Vob2xkZXIgfHwgcHJvcHMuaXNTaWduWW91cnNlbGYpIHtcclxuICAgICAgc2VsZWN0RGF0ZSAmJiBjaGFuZ2VEYXRlRm9ybWF0KCk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXHJcbiAgfSwgW3NlbGVjdERhdGVdKTtcclxuXHJcbiAgLy9gaGFuZGxlV2lkZ2V0SWRhbmRQb3B1cGAgaXMgdXNlZCB0byBzZXQgY3VycmVudCB3aWRnZXQgaWQgYW5kIG9wZW4gcmVsYXRpdmUgcG9wdXBcclxuICBjb25zdCBoYW5kbGVXaWRnZXRJZGFuZFBvcHVwID0gKCkgPT4ge1xyXG4gICAgaWYgKHByb3BzLnNldFNlbGVjdFdpZGdldElkKSB7XHJcbiAgICAgIHByb3BzLnNldFNlbGVjdFdpZGdldElkKHByb3BzLnBvcy5rZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHdpZGdldFR5cGVFeGlzdCA9IFtcclxuICAgICAgdGV4dElucHV0V2lkZ2V0LFxyXG4gICAgICBcImNoZWNrYm94XCIsXHJcbiAgICAgIFwibmFtZVwiLFxyXG4gICAgICBcImNvbXBhbnlcIixcclxuICAgICAgXCJqb2IgdGl0bGVcIixcclxuICAgICAgXCJkYXRlXCIsXHJcbiAgICAgIFwiZW1haWxcIixcclxuICAgICAgdGV4dFdpZGdldFxyXG4gICAgXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSk7XHJcblxyXG4gICAgaWYgKHdpZGdldFR5cGVFeGlzdCkge1xyXG4gICAgICBzZXREcmFnZ2luZ0VuYWJsZWQoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgaWYgKChwcm9wcy5pc05lZWRTaWduIHx8IHByb3BzLmlzU2lnbllvdXJzZWxmKSAmJiAhcHJvcHMuaXNEcmFnZ2luZykge1xyXG4gICAgICBpZiAocHJvcHM/LmlzcHVibGljVGVtcGxhdGUpIHtcclxuICAgICAgICBwcm9wcy5oYW5kbGVVc2VyRGV0YWlscygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChwcm9wcy5wb3MudHlwZSkge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJzaWduYXR1cmVcIiB8fFxyXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJzdGFtcFwiIHx8XHJcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcImltYWdlXCJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBwcm9wcy5zZXRJc1NpZ25QYWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XHJcbiAgICAgICAgICAgIHByb3BzLnNldElzU3RhbXAocHJvcHMucG9zLmlzU3RhbXApO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5wb3MudHlwZSA9PT0gXCJpbml0aWFsc1wiKSB7XHJcbiAgICAgICAgICAgIHByb3BzLnNldElzU2lnblBhZCh0cnVlKTtcclxuICAgICAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChwcm9wcy5wb3MuaXNTdGFtcCk7XHJcbiAgICAgICAgICAgIHByb3BzLnNldElzSW5pdGlhbCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcHJvcHMuc2V0SXNTaWduUGFkKHRydWUpO1xyXG4gICAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgICAgIHByb3BzLnNldElzU3RhbXAocHJvcHMucG9zPy5pc1N0YW1wID8gcHJvcHMucG9zLmlzU3RhbXAgOiBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBwcm9wcy5pc1BsYWNlaG9sZGVyICYmXHJcbiAgICAgICFwcm9wcy5pc0RyYWdnaW5nICYmXHJcbiAgICAgIHByb3BzLnBvcy50eXBlICE9PSB0ZXh0V2lkZ2V0XHJcbiAgICApIHtcclxuICAgICAgaWYgKHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkKSB7XHJcbiAgICAgICAgcHJvcHMuaGFuZGxlTGlua1VzZXIocHJvcHMuZGF0YS5JZCk7XHJcbiAgICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHMuZGF0YS5JZCk7XHJcbiAgICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCFwcm9wcy5wb3MudHlwZSkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIXByb3BzLnBvcy50eXBlICYmXHJcbiAgICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxyXG4gICAgICAgIHByb3BzLmRhdGEuc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkXHJcbiAgICAgICkge1xyXG4gICAgICAgIHByb3BzLnNldElzU2lnblBhZCh0cnVlKTtcclxuICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICAgIHByb3BzLnNldElzU3RhbXAocHJvcHMucG9zLmlzU3RhbXApO1xyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLnBvcy50eXBlID09PSBcInNpZ25hdHVyZVwiKSB8fFxyXG4gICAgICAgIHByb3BzLnBvcy50eXBlID09PSBcInN0YW1wXCJcclxuICAgICAgKSB7XHJcbiAgICAgICAgcHJvcHMuc2V0SXNTaWduUGFkKHRydWUpO1xyXG4gICAgICAgIHByb3BzLnNldFNpZ25LZXkocHJvcHMucG9zLmtleSk7XHJcbiAgICAgICAgcHJvcHMuc2V0SXNTdGFtcChwcm9wcy5wb3MuaXNTdGFtcCk7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvcHMuaXNOZWVkU2lnbiAmJiBwcm9wcy5wb3MudHlwZSA9PT0gXCJkcm9wZG93blwiKSB7XHJcbiAgICAgICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgY29uc3QgaGFuZGxlT25DbGlja1BsYWNlaG9sZGVyID0gKCkgPT4ge1xyXG4gICAgcHJvcHMuc2V0Q3VycldpZGdldHNEZXRhaWxzICYmIHByb3BzLnNldEN1cnJXaWRnZXRzRGV0YWlscyhwcm9wcy5wb3MpO1xyXG4gICAgaWYgKCFwcm9wcy5pc05lZWRTaWduKSB7XHJcbiAgICAgIHByb3BzLnNldFdpZGdldFR5cGUocHJvcHMucG9zLnR5cGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSB7XHJcbiAgICAgIGhhbmRsZVdpZGdldElkYW5kUG9wdXAoKTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHByb3BzPy5pc05lZWRTaWduICYmXHJcbiAgICAgIHByb3BzPy51bmlxdWVJZCAmJlxyXG4gICAgICBwcm9wcy5kYXRhPy5JZCA9PT0gcHJvcHM/LnVuaXF1ZUlkXHJcbiAgICApIHtcclxuICAgICAgaGFuZGxlV2lkZ2V0SWRhbmRQb3B1cCgpO1xyXG4gICAgfSBlbHNlIGlmIChwcm9wcy5pc1BsYWNlaG9sZGVyIHx8IHByb3BzLmlzU2lnbllvdXJzZWxmKSB7XHJcbiAgICAgIGhhbmRsZVdpZGdldElkYW5kUG9wdXAoKTtcclxuICAgIH1cclxuICB9O1xyXG4gIC8vYGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbmAgaXMgdXNlZCBzZXQgY3VycmVudCB3aWRnZXQgZGV0YWlscyBhbmQgb3BlbiBzZXR0aW5nIG9mIGl0XHJcbiAgY29uc3QgaGFuZGxlT25DbGlja1NldHRpbmdJY29uID0gKCkgPT4ge1xyXG4gICAgaWYgKHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCkge1xyXG4gICAgICBwcm9wcy5zZXRJc1JhZGlvKHRydWUpO1xyXG4gICAgfSBlbHNlIGlmIChwcm9wcy5wb3MudHlwZSA9PT0gXCJkcm9wZG93blwiKSB7XHJcbiAgICAgIHByb3BzPy5zZXRTaG93RHJvcGRvd24odHJ1ZSk7XHJcbiAgICB9IGVsc2UgaWYgKHByb3BzLnBvcy50eXBlID09PSBcImNoZWNrYm94XCIpIHtcclxuICAgICAgcHJvcHM/LnNldElzQ2hlY2tib3godHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgc2V0dGluZyBpY29uIGZvciBzaWdueW91ci1zZWxmIGZsb3cgZm9yIGFsbCB0eXBlIHRleHQgd2lkZ2V0c1xyXG4gICAgZWxzZSBpZiAoXHJcbiAgICAgIFtcclxuICAgICAgICB0ZXh0SW5wdXRXaWRnZXQsXHJcbiAgICAgICAgdGV4dFdpZGdldCxcclxuICAgICAgICBcIm5hbWVcIixcclxuICAgICAgICBcImNvbXBhbnlcIixcclxuICAgICAgICBcImpvYiB0aXRsZVwiLFxyXG4gICAgICAgIFwiZW1haWxcIlxyXG4gICAgICBdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKSAmJlxyXG4gICAgICBwcm9wcy5pc1NpZ25Zb3Vyc2VsZlxyXG4gICAgKSB7XHJcbiAgICAgIHByb3BzLmhhbmRsZVRleHRTZXR0aW5nTW9kYWwodHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9wcz8uaGFuZGxlTmFtZU1vZGFsICYmIHByb3BzPy5oYW5kbGVOYW1lTW9kYWwodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9jb25kaXRpb24gZm9yIG9ubHkgcGxhY2Vob2xkZXIgYW5kIHRlbXBsYXRlIGZsb3dcclxuICAgIGlmIChwcm9wcy5kYXRhICYmIHByb3BzPy5wb3M/LnR5cGUgIT09IHRleHRXaWRnZXQpIHtcclxuICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHM/LmRhdGE/LklkKTtcclxuICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcclxuICAgIH1cclxuICAgIC8vY29uZGl0aW9uIHRvIGhhbmRsZSBpbiBwbGFjZWhvbGRlciBhbmQgdGVtcGxhdGUgZmxvdyBmb3IgdGV4dCB3aWRnZXQgc2lnbmVySWQgZm9yIHRleHQgd2lkZ2V0cyBpIGhhdmUgdG8gc2V0IHVuaXF1ZUlkIGluIHRlbXBTaWduZXJJZCBiZWNhdXNlXHJcbiAgICAvL2l0IGRvZXMgbm90IGhhdmUgYW55IHNpZ25lciB1c2VyIGFuZCBhbnkgc2lnbmVyb2JqSWRcclxuICAgIGVsc2UgaWYgKHByb3BzLmRhdGEgJiYgcHJvcHMucG9zLnR5cGUgPT09IHRleHRXaWRnZXQpIHtcclxuICAgICAgcHJvcHMuc2V0VGVtcFNpZ25lcklkKHByb3BzLnVuaXF1ZUlkKTtcclxuICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHM/LmRhdGE/LklkKTtcclxuICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgKTtcclxuICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xyXG4gICAgfVxyXG4gICAgcHJvcHMuc2V0U2lnbktleShwcm9wcy5wb3Mua2V5KTtcclxuICAgIHByb3BzLnNldFdpZGdldFR5cGUocHJvcHMucG9zLnR5cGUpO1xyXG4gICAgcHJvcHMuc2V0Q3VycldpZGdldHNEZXRhaWxzKHByb3BzLnBvcyk7XHJcbiAgfTtcclxuICAvL2Z1bmN0aW9uIHRvIHNldCByZXF1aXJlZCBzdGF0ZSB2YWx1ZSBvbmNsaWNrIG9uIHdpZGdldCdzIGNvcHkgaWNvblxyXG4gIGNvbnN0IGhhbmRsZUNvcHlQbGFjZWhvbGRlciA9IChlKSA9PiB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgLy9jb25kaXRpb24gdG8gaGFuZGxlIHRleHQgd2lkZ2V0IHNpZ25lciBvYmogaWQgYW5kIHVuaXF1ZSBpZFxyXG4gICAgLy93aGVuIHVzZXIgY2xpY2sgb24gY29weSBpY29uIG9mIHRleHQgd2lkZ2V0IGluIHRoYXQgY29uZGl0aW9uIHRleHQgd2lkZ2V0IGRvZXMgbm90IGhhdmUgYW55IHNpZ25lck9iaklkXHJcbiAgICAvL2luIHRoYXQgY2FzZSBpIGhhdmUgdG8gc2F2ZSBpbiB0ZW1wU2lnbmVySWQgYXMgYSB1bmlxdWUgaWQgb2YgcHJldmlvdXMgc2VsZWN0IHNpZ25lcidzIHVuaXF1ZSBpZFxyXG4gICAgLy9hbmQgb24gc2F2ZSBvciBjYW5jZWwgYnV0dG9uIG9mIGNvcHkgYWxsIHBhZ2UgcG9wdXAgaSBoYXZlIHNldCB0aGlzIHRlbXAgc2lnbmVyIElkIGluIHVuaXF1ZSBpZFxyXG5cclxuICAgIGlmIChwcm9wcy5kYXRhICYmIHByb3BzPy5wb3M/LnR5cGUgIT09IHRleHRXaWRnZXQpIHtcclxuICAgICAgcHJvcHMuc2V0VW5pcXVlSWQocHJvcHM/LmRhdGE/LklkKTtcclxuICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHByb3BzLnNldElzU2VsZWN0SWQoY2hlY2tJbmRleCB8fCAwKTtcclxuICAgIH0gZWxzZSBpZiAocHJvcHMuZGF0YSAmJiBwcm9wcy5wb3MudHlwZSA9PT0gdGV4dFdpZGdldCkge1xyXG4gICAgICBwcm9wcy5zZXRUZW1wU2lnbmVySWQocHJvcHMudW5pcXVlSWQpO1xyXG4gICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcz8uZGF0YT8uSWQpO1xyXG4gICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcclxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5JZCA9PT0gcHJvcHMuZGF0YS5JZFxyXG4gICAgICApO1xyXG4gICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9jaGVja2luZyB3aWRnZXQncyB0eXBlIGFuZCBvcGVuIHdpZGdldCBjb3B5IG1vZGFsIGZvciByZXF1aXJlZCB3aWRnZXRzXHJcbiAgICBpZiAoXHJcbiAgICAgIFtcInNpZ25hdHVyZVwiLCB0ZXh0V2lkZ2V0LCBcInN0YW1wXCIsIFwiaW5pdGlhbFwiXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSlcclxuICAgICkge1xyXG4gICAgICBwcm9wcy5zZXRJc1BhZ2VDb3B5KHRydWUpO1xyXG4gICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9mdW5jdGlvbiB0byBjcmVhdGUgbmV3IHdpZGdldCBuZXh0IHRvIGp1c3Qgd2lkZ2V0XHJcbiAgICAgIGhhbmRsZUNvcHlOZXh0VG9XaWRnZXQoXHJcbiAgICAgICAgcHJvcHMucG9zLFxyXG4gICAgICAgIHByb3BzLnBvcy50eXBlLFxyXG4gICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vZnVuY3Rpb24gdG8gc2F2ZSBkYXRlIGFuZCBmb3JtYXQgb24gbG9jYWwgYXJyYXkgb25jaGFuZ2UgZGF0ZSBhbmQgb25jbGljayBmb3JtYXRcclxuICBjb25zdCBoYW5kbGVTYXZlRGF0ZSA9IChkYXRhLCBpc0RhdGVDaGFuZ2UpID0+IHtcclxuICAgIGxldCB1cGRhdGVEYXRlID0gZGF0YS5kYXRlO1xyXG4gICAgLy9jaGVjayBpZiBkYXRlIGNoYW5nZSBieSB1c2VyXHJcbiAgICBpZiAoaXNEYXRlQ2hhbmdlKSB7XHJcbiAgICAgIC8vYGNoYW5nZURhdGVUb01vbWVudEZvcm1hdGAgaXMgdXNlZCB0byBjb252ZXJ0IGRhdGUgYXMgcGVyIHJlcXVpcmVkIHRvIG1vbWVudCBwYWNrYWdlXHJcbiAgICAgIHVwZGF0ZURhdGUgPSBtb21lbnQoZGF0YS5kYXRlKS5mb3JtYXQoXHJcbiAgICAgICAgY2hhbmdlRGF0ZVRvTW9tZW50Rm9ybWF0KGRhdGEuZm9ybWF0KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy91c2luZyBtb21lbnQgcGFja2FnZSBpcyB1c2VkIHRvIGNoYW5nZSBkYXRlIGFzIHBlciB0aGUgZm9ybWF0IHByb3ZpZGVkIGluIHNlbGVjdERhdGUgb2JqIGUuZy4gLSBNTS9kZC95eXl5IC0+IDAzLzEyLzIwMjRcclxuICAgIC8vYGdldERlZmF1bHRkYXRlYCBpcyB1c2VkIHRvIGNvbnZlcnQgdXBkYXRlIGRhdGUgaW4gbmV3IERhdGUoKSBmb3JtYXRcclxuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQoXHJcbiAgICAgIGdldERlZmF1bHRkYXRlKHVwZGF0ZURhdGUsIGRhdGE/LmZvcm1hdCkuZ2V0VGltZSgpXHJcbiAgICApLmZvcm1hdChjaGFuZ2VEYXRlVG9Nb21lbnRGb3JtYXQoZGF0YT8uZm9ybWF0KSk7XHJcblxyXG4gICAgLy9gb25DaGFuZ2VJbnB1dGAgaXMgdXNlZCB0byBzYXZlIGRhdGEgcmVsYXRlZCB0byBkYXRlIGluIGEgcGxhY2Vob2xkZXIgZmllbGRcclxuICAgIG9uQ2hhbmdlSW5wdXQoXHJcbiAgICAgIGRhdGUsXHJcbiAgICAgIHByb3BzLnBvcy5rZXksXHJcbiAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgcHJvcHMuaW5kZXgsXHJcbiAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcclxuICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhLklkLFxyXG4gICAgICBmYWxzZSxcclxuICAgICAgZGF0YT8uZm9ybWF0LFxyXG4gICAgICBudWxsLFxyXG4gICAgICBudWxsLFxyXG4gICAgICBwcm9wcy5mb250U2l6ZSB8fCBwcm9wcy5wb3M/Lm9wdGlvbnM/LmZvbnRTaXplIHx8IFwiMTJcIixcclxuICAgICAgcHJvcHMuZm9udENvbG9yIHx8IHByb3BzLnBvcz8ub3B0aW9ucz8uZm9udENvbG9yIHx8IFwiYmxhY2tcIlxyXG4gICAgKTtcclxuICAgIHNldFNlbGVjdERhdGUoeyBkYXRlOiBkYXRlLCBmb3JtYXQ6IGRhdGE/LmZvcm1hdCB9KTtcclxuICB9O1xyXG4gIGNvbnN0IFBsYWNlaG9sZGVySWNvbiA9ICgpID0+IHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHByb3BzLmlzU2hvd0JvcmRlciAmJiAoXHJcbiAgICAgICAgPD5cclxuICAgICAgICAgIHsocHJvcHMuaXNQbGFjZWhvbGRlciB8fCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZikgJiYgKFxyXG4gICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgIHsvKiBjb25kaXRpb24gdG8gYWRkIHNldHRpbmcgaWNvbiBmb3Igc2lnbnlvdXItc2VsZiBmbG93IGZvciBwYXJ0aWN1bGFyIHRleHQgd2lkZ2V0c1xyXG4gICAgICAgICAgICBhbmQgYWxzbyBpdCBoYXZlIGRpZmZyZW50IHBvc2l0aW9uIFxyXG4gICAgICAgICAgICAqL31cclxuICAgICAgICAgICAgICB7W1xyXG4gICAgICAgICAgICAgICAgXCJjaGVja2JveFwiLFxyXG4gICAgICAgICAgICAgICAgdGV4dElucHV0V2lkZ2V0LFxyXG4gICAgICAgICAgICAgICAgdGV4dFdpZGdldCxcclxuICAgICAgICAgICAgICAgIFwibmFtZVwiLFxyXG4gICAgICAgICAgICAgICAgXCJjb21wYW55XCIsXHJcbiAgICAgICAgICAgICAgICBcImpvYiB0aXRsZVwiLFxyXG4gICAgICAgICAgICAgICAgXCJlbWFpbFwiXHJcbiAgICAgICAgICAgICAgXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSkgJiYgcHJvcHMuaXNTaWduWW91cnNlbGYgPyAoXHJcbiAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25DbGlja1NldHRpbmdJY29uKCk7XHJcbiAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgIG9uVG91Y2hFbmQ9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbkNsaWNrU2V0dGluZ0ljb24oKTtcclxuICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZ2VhciBpY29uXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCIjMTg4YWUyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IFwiMjlweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogXCItMTlweFwiXHJcbiAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgICAvKiBjb25kaXRpb24gdG8gYWRkIHNldHRpbmcgaWNvbiBmb3IgcGxhY2Vob2xkZXIgJiB0ZW1wbGF0ZSBmbG93IGZvciBhbGwgd2lkZ2V0cyBleGNlcHQgc2lnbmF0dXJlIGFuZCBkYXRlICovXHJcbiAgICAgICAgICAgICAgICAoKCFwcm9wcz8ucG9zPy50eXBlICYmIHByb3BzLnBvcy5pc1N0YW1wKSB8fFxyXG4gICAgICAgICAgICAgICAgICAocHJvcHM/LnBvcz8udHlwZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICFbXCJkYXRlXCIsIFwic2lnbmF0dXJlXCJdLmluY2x1ZGVzKHByb3BzLnBvcy50eXBlKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICFwcm9wcy5pc1NpZ25Zb3Vyc2VsZikpICYmIChcclxuICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9uQ2xpY2tTZXR0aW5nSWNvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbkNsaWNrU2V0dGluZ0ljb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWdlYXIgaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIiMxODhhZTJcIixcclxuICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBwcm9wcz8ucG9zPy50eXBlID09PSB0ZXh0V2lkZ2V0ID8gXCIzMnB4XCIgOiBcIjQ3cHhcIixcclxuICAgICAgICAgICAgICAgICAgICAgIHRvcDogXCItMTlweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgIHsvKiBjb25kaXRpb24gZm9yIHVzZXJpY29uIGZvciBhbGwgd2lkZ2V0cyBleGNlcHQgdGV4dCB3aWRnZXRzIGFuZCBzaWdueW91ci1zZWxmIGZsb3cgKi99XHJcbiAgICAgICAgICAgICAge3Byb3BzLnBvcy50eXBlICE9PSB0ZXh0V2lkZ2V0ICYmICFwcm9wcy5pc1NpZ25Zb3Vyc2VsZiAmJiAoXHJcbiAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICBkYXRhLXR1dD1cImFzc2lnblNpZ25lclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLXVzZXIgaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVMaW5rVXNlcihwcm9wcy5kYXRhLklkKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcy5kYXRhLklkKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLklkID09PSBwcm9wcy5kYXRhLklkXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XHJcbiAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgIG9uVG91Y2hFbmQ9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVMaW5rVXNlcihwcm9wcy5kYXRhLklkKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcy5kYXRhLklkKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZGV4ID0gcHJvcHMueHlQb3N0aW9uLmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLklkID09PSBwcm9wcy5kYXRhLklkXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1NlbGVjdElkKGNoZWNrSW5kZXggfHwgMCk7XHJcbiAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiBcIiMxODhhZTJcIiwgcmlnaHQ6IFwiMzJweFwiLCB0b3A6IFwiLTE4cHhcIiB9fVxyXG4gICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICl9XHJcbiAgICAgICAgICB7Lyogc2V0dGluZyBpY29uIG9ubHkgZm9yIGRhdGUgd2lkZ2V0cyAqL31cclxuICAgICAgICAgIHtwcm9wcy5wb3MudHlwZSA9PT0gXCJkYXRlXCIgJiYgc2VsZWN0RGF0ZSAmJiAoXHJcbiAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHByb3BzLnNldEN1cnJXaWRnZXRzRGV0YWlscyhwcm9wcy5wb3MpO1xyXG4gICAgICAgICAgICAgICAgc2V0SXNEYXRlTW9kYWwoIWlzRGF0ZU1vZGFsKTtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDbGlja29uV2lkZ2V0KHByb3BzLnBvcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcHMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcy5kYXRhLklkKTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgIHByb3BzLnNldEN1cnJXaWRnZXRzRGV0YWlscyhwcm9wcy5wb3MpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHNldElzRGF0ZU1vZGFsKCFpc0RhdGVNb2RhbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcHMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRTaWduS2V5KHByb3BzLnBvcy5rZXkpO1xyXG4gICAgICAgICAgICAgICAgICBwcm9wcy5zZXRVbmlxdWVJZChwcm9wcy5kYXRhLklkKTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tJbmRleCA9IHByb3BzLnh5UG9zdGlvbi5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEuSWQgPT09IHByb3BzLmRhdGEuSWRcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgcHJvcHMuc2V0SXNTZWxlY3RJZChjaGVja0luZGV4IHx8IDApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgIHpJbmRleDogXCI5OVwiLFxyXG4gICAgICAgICAgICAgICAgdG9wOiBcIi0xOHB4XCIsXHJcbiAgICAgICAgICAgICAgICByaWdodDogcHJvcHMuaXNQbGFjZWhvbGRlciA/IFwiNTBweFwiIDogXCIzMHB4XCIsXHJcbiAgICAgICAgICAgICAgICBjb2xvcjogXCIjMTg4YWUyXCIsXHJcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogXCIxNHB4XCJcclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWdlYXIgaWNvblwiXHJcbiAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICApfVxyXG4gICAgICAgICAgey8qIGNvcHkgaWNvbiBmb3IgYWxsIHdpZGdldHMgKi99XHJcbiAgICAgICAgICA8aVxyXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1jb3B5IGljb25cIlxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gaGFuZGxlQ29weVBsYWNlaG9sZGVyKGUpfVxyXG4gICAgICAgICAgICBvblRvdWNoRW5kPXsoZSkgPT4gaGFuZGxlQ29weVBsYWNlaG9sZGVyKGUpfVxyXG4gICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogXCIjMTg4YWUyXCIsIHJpZ2h0OiBcIjEycHhcIiwgdG9wOiBcIi0xOHB4XCIgfX1cclxuICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICB7LyogZGVsZXRlIGljb24gZm9yIGFsbCB3aWRnZXRzICovfVxyXG4gICAgICAgICAgPGlcclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtY2lyY2xlLXhtYXJrIGljb25cIlxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgLy9jb25kaXRpb24gZm9yIHRlbXBsYXRlIGFuZCBwbGFjZWhvbGRlciBmbG93XHJcbiAgICAgICAgICAgICAgaWYgKHByb3BzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgIHByb3BzLmhhbmRsZURlbGV0ZVNpZ24ocHJvcHMucG9zLmtleSwgcHJvcHMuZGF0YS5JZCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIGZvciBzaWdueW91ci1zZWxmIGZsb3dcclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHByb3BzLmhhbmRsZURlbGV0ZVNpZ24ocHJvcHMucG9zLmtleSk7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1N0YW1wKGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIC8vZm9yIG1vYmlsZSBhbmQgdGFibGV0IHRvdWNoIGV2ZW50XHJcbiAgICAgICAgICAgIG9uVG91Y2hFbmQ9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAvL2NvbmRpdGlvbiBmb3IgdGVtcGxhdGUgYW5kIHBsYWNlaG9sZGVyIGZsb3dcclxuICAgICAgICAgICAgICBpZiAocHJvcHMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgcHJvcHMuaGFuZGxlRGVsZXRlU2lnbihwcm9wcy5wb3Mua2V5LCBwcm9wcy5kYXRhPy5JZCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vY29uZGl0aW9uIGZvciBzaWdueW91ci1zZWxmIGZsb3dcclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHByb3BzLmhhbmRsZURlbGV0ZVNpZ24ocHJvcHMucG9zLmtleSk7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5zZXRJc1N0YW1wKGZhbHNlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiBcIiMxODhhZTJcIiwgcmlnaHQ6IFwiLThweFwiLCB0b3A6IFwiLTE4cHhcIiB9fVxyXG4gICAgICAgICAgPjwvaT5cclxuICAgICAgICA8Lz5cclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9O1xyXG4gIGNvbnN0IHhQb3MgPSAocG9zLCBzaWduWW91cnNlbGYpID0+IHtcclxuICAgIGNvbnN0IGNvbnRhaW5lclNjYWxlID0gZ2V0Q29udGFpbmVyU2NhbGUoXHJcbiAgICAgIHByb3BzLnBkZk9yaWdpbmFsV0gsXHJcbiAgICAgIHByb3BzLnBhZ2VOdW1iZXIsXHJcbiAgICAgIHByb3BzLmNvbnRhaW5lcldIXHJcbiAgICApO1xyXG4gICAgY29uc3QgcmVzaXplUG9zID0gcG9zLnhQb3NpdGlvbjtcclxuICAgIGlmIChzaWduWW91cnNlbGYpIHtcclxuICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIGNvbnRhaW5lclNjYWxlICogcHJvcHMuc2NhbGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL2NoZWNraW5nIGJvdGggY29uZGl0aW9uIG1vYmlsZSBhbmQgZGVza3RvcCB2aWV3XHJcbiAgICAgIGlmIChwb3MuaXNNb2JpbGUgJiYgcG9zLnNjYWxlKSB7XHJcbiAgICAgICAgaWYgKHByb3BzLnNjYWxlID4gMSkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlICogcHJvcHMuc2NhbGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gaWYgKHBvcy5zY2FsZSA9PT0gY29udGFpbmVyU2NhbGUpIHtcclxuICAgICAgICAvLyAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGUgKiBwcm9wcy5zY2FsZTtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiByZXNpemVQb3MgKiBjb250YWluZXJTY2FsZSAqIHByb3BzLnNjYWxlO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgY29uc3QgeVBvcyA9IChwb3MsIHNpZ25Zb3Vyc2VsZikgPT4ge1xyXG4gICAgY29uc3QgY29udGFpbmVyU2NhbGUgPSBnZXRDb250YWluZXJTY2FsZShcclxuICAgICAgcHJvcHMucGRmT3JpZ2luYWxXSCxcclxuICAgICAgcHJvcHMucGFnZU51bWJlcixcclxuICAgICAgcHJvcHMuY29udGFpbmVyV0hcclxuICAgICk7XHJcbiAgICBjb25zdCByZXNpemVQb3MgPSBwb3MueVBvc2l0aW9uO1xyXG5cclxuICAgIGlmIChzaWduWW91cnNlbGYpIHtcclxuICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIGNvbnRhaW5lclNjYWxlICogcHJvcHMuc2NhbGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL2NoZWNraW5nIGJvdGggY29uZGl0aW9uIG1vYmlsZSBhbmQgZGVza3RvcCB2aWV3XHJcbiAgICAgIGlmIChwb3MuaXNNb2JpbGUgJiYgcG9zLnNjYWxlKSB7XHJcbiAgICAgICAgaWYgKHByb3BzLnNjYWxlID4gMSkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlICogcHJvcHMuc2NhbGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gZWxzZSBpZiAocG9zLnNjYWxlID09PSBjb250YWluZXJTY2FsZSkge1xyXG4gICAgICAvLyAgIGlmIChwcm9wcy5zY2FsZSA+IDEpIHtcclxuICAgICAgLy8gICAgIHJldHVybiByZXNpemVQb3MgKiBwb3Muc2NhbGUgKiBwcm9wcy5zY2FsZTtcclxuICAgICAgLy8gICB9IGVsc2Uge1xyXG4gICAgICAvLyAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIHBvcy5zY2FsZTtcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcyAqIGNvbnRhaW5lclNjYWxlICogcHJvcHMuc2NhbGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBnZXRDdXJzb3IgPSAoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMuZGF0YSAmJiBwcm9wcy5pc05lZWRTaWduKSB7XHJcbiAgICAgIGlmIChwcm9wcz8uc2lnbmVyT2JqSWQgJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSB7XHJcbiAgICAgICAgcmV0dXJuIFwicG9pbnRlclwiO1xyXG4gICAgICB9IGVsc2UgaWYgKHByb3BzPy51bmlxdWVJZCAmJiBwcm9wcy5kYXRhPy5JZCA9PT0gcHJvcHMudW5pcXVlSWQpIHtcclxuICAgICAgICByZXR1cm4gXCJwb2ludGVyXCI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFwibm90LWFsbG93ZWRcIjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFwiYWxsLXNjcm9sbFwiO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICA8Um5kXHJcbiAgICAgICAgaWQ9e3Byb3BzLnBvcy5rZXl9XHJcbiAgICAgICAgZGF0YS10dXQ9e3Byb3BzLnBvcy5rZXkgPT09IHByb3BzLnVuU2lnbmVkV2lkZ2V0SWQgPyBcIklzU2lnbmVkXCIgOiBcIlwifVxyXG4gICAgICAgIGtleT17cHJvcHMucG9zLmtleX1cclxuICAgICAgICBsb2NrQXNwZWN0UmF0aW89e1xyXG4gICAgICAgICAgIVtcclxuICAgICAgICAgICAgdGV4dFdpZGdldCxcclxuICAgICAgICAgICAgXCJlbWFpbFwiLFxyXG4gICAgICAgICAgICBcIm5hbWVcIixcclxuICAgICAgICAgICAgXCJjb21wYW55XCIsXHJcbiAgICAgICAgICAgIFwiam9iIHRpdGxlXCIsXHJcbiAgICAgICAgICAgIHRleHRJbnB1dFdpZGdldFxyXG4gICAgICAgICAgXS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSkgJiZcclxuICAgICAgICAgIChwcm9wcy5wb3MuV2lkdGhcclxuICAgICAgICAgICAgPyBwcm9wcy5wb3MuV2lkdGggLyBwcm9wcy5wb3MuSGVpZ2h0XHJcbiAgICAgICAgICAgIDogZGVmYXVsdFdpZHRoSGVpZ2h0KHByb3BzLnBvcy50eXBlKS53aWR0aCAvXHJcbiAgICAgICAgICAgICAgZGVmYXVsdFdpZHRoSGVpZ2h0KHByb3BzLnBvcy50eXBlKS5oZWlnaHQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVuYWJsZVJlc2l6aW5nPXt7XHJcbiAgICAgICAgICB0b3A6IGZhbHNlLFxyXG4gICAgICAgICAgcmlnaHQ6IGZhbHNlLFxyXG4gICAgICAgICAgYm90dG9tOiBmYWxzZSxcclxuICAgICAgICAgIGxlZnQ6IGZhbHNlLFxyXG4gICAgICAgICAgdG9wUmlnaHQ6IGZhbHNlLFxyXG4gICAgICAgICAgYm90dG9tUmlnaHQ6XHJcbiAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuaXNOZWVkU2lnblxyXG4gICAgICAgICAgICAgID8gcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkICYmXHJcbiAgICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJjaGVja2JveFwiICYmXHJcbiAgICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gcmFkaW9CdXR0b25XaWRnZXRcclxuICAgICAgICAgICAgICAgID8gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgOiBmYWxzZVxyXG4gICAgICAgICAgICAgIDogcHJvcHMucG9zLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXHJcbiAgICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJjaGVja2JveFwiICYmXHJcbiAgICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJlxyXG4gICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgIGJvdHRvbUxlZnQ6IGZhbHNlLFxyXG4gICAgICAgICAgdG9wTGVmdDogZmFsc2VcclxuICAgICAgICB9fVxyXG4gICAgICAgIGJvdW5kcz1cInBhcmVudFwiXHJcbiAgICAgICAgY2xhc3NOYW1lPVwic2lnbllvdXJzZWxmQmxvY2tcIlxyXG4gICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICMwMDdiZmZcIixcclxuICAgICAgICAgIGJvcmRlclJhZGl1czogXCIycHhcIixcclxuICAgICAgICAgIHRleHRBbGlnbjpcclxuICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IFwibmFtZVwiICYmXHJcbiAgICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSBcImNvbXBhbnlcIiAmJlxyXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJqb2IgdGl0bGVcIiAmJlxyXG4gICAgICAgICAgICBcImNlbnRlclwiLFxyXG4gICAgICAgICAgY3Vyc29yOiBnZXRDdXJzb3IoKSxcclxuICAgICAgICAgIHpJbmRleDpcclxuICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgPyBwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZFxyXG4gICAgICAgICAgICAgICAgPyA5OSArIDFcclxuICAgICAgICAgICAgICAgIDogOTlcclxuICAgICAgICAgICAgICA6IHByb3BzPy5wb3M/LnpJbmRleFxyXG4gICAgICAgICAgICAgICAgPyBwcm9wcy5wb3MuekluZGV4XHJcbiAgICAgICAgICAgICAgICA6IFwiNVwiLFxyXG4gICAgICAgICAgYmFja2dyb3VuZDogcHJvcHMuZGF0YSA/IHByb3BzLmRhdGEuYmxvY2tDb2xvciA6IFwicmdiKDIwMyAyMzMgMjM3KVwiXHJcbiAgICAgICAgfX1cclxuICAgICAgICBvbkRyYWc9eygpID0+IHtcclxuICAgICAgICAgIHNldERyYWdnaW5nRW5hYmxlZCh0cnVlKTtcclxuICAgICAgICAgIHByb3BzLmhhbmRsZVRhYkRyYWcgJiYgcHJvcHMuaGFuZGxlVGFiRHJhZyhwcm9wcy5wb3Mua2V5KTtcclxuICAgICAgICB9fVxyXG4gICAgICAgIHNpemU9e3tcclxuICAgICAgICAgIHdpZHRoOlxyXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQgfHxcclxuICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgID8gXCJhdXRvXCJcclxuICAgICAgICAgICAgICA6IHByb3BzLnBvc1dpZHRoKHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpLFxyXG4gICAgICAgICAgaGVpZ2h0OlxyXG4gICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQgfHxcclxuICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgID8gXCJhdXRvXCJcclxuICAgICAgICAgICAgICA6IHByb3BzLnBvc0hlaWdodChwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKVxyXG4gICAgICAgIH19XHJcbiAgICAgICAgb25SZXNpemVTdGFydD17KCkgPT4ge1xyXG4gICAgICAgICAgc2V0RHJhZ2dpbmdFbmFibGVkKHRydWUpO1xyXG4gICAgICAgICAgcHJvcHMuc2V0SXNSZXNpemUgJiYgcHJvcHMuc2V0SXNSZXNpemUodHJ1ZSk7XHJcbiAgICAgICAgfX1cclxuICAgICAgICBvblJlc2l6ZVN0b3A9eyhlLCBkaXJlY3Rpb24sIHJlZikgPT4ge1xyXG4gICAgICAgICAgcHJvcHMuc2V0SXNSZXNpemUgJiYgcHJvcHMuc2V0SXNSZXNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgcHJvcHMuaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemUgJiZcclxuICAgICAgICAgICAgcHJvcHMuaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemUoXHJcbiAgICAgICAgICAgICAgcmVmLFxyXG4gICAgICAgICAgICAgIHByb3BzLnBvcy5rZXksXHJcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxyXG4gICAgICAgICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICAgICAgICBjb250YWluZXJTY2FsZSxcclxuICAgICAgICAgICAgICBwcm9wcy5zY2FsZSxcclxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGEuSWQsXHJcbiAgICAgICAgICAgICAgcHJvcHMuaXNSZXNpemVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9fVxyXG4gICAgICAgIGRpc2FibGVEcmFnZ2luZz17XHJcbiAgICAgICAgICBwcm9wcy5pc05lZWRTaWduXHJcbiAgICAgICAgICAgID8gdHJ1ZVxyXG4gICAgICAgICAgICA6IHByb3BzLmlzUGxhY2Vob2xkZXIgJiYgIVt0ZXh0V2lkZ2V0XS5pbmNsdWRlcyhwcm9wcy5wb3MudHlwZSlcclxuICAgICAgICAgICAgICA/IGZhbHNlXHJcbiAgICAgICAgICAgICAgOiAhaXNEcmFnZ2luZ0VuYWJsZWRcclxuICAgICAgICB9XHJcbiAgICAgICAgb25EcmFnU3RvcD17KGV2ZW50LCBkcmFnRWxlbWVudCkgPT5cclxuICAgICAgICAgIHByb3BzLmhhbmRsZVN0b3AgJiZcclxuICAgICAgICAgIHByb3BzLmhhbmRsZVN0b3AoZXZlbnQsIGRyYWdFbGVtZW50LCBwcm9wcy5kYXRhPy5JZCwgcHJvcHMucG9zPy5rZXkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBvc2l0aW9uPXt7XHJcbiAgICAgICAgICB4OiB4UG9zKHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpLFxyXG4gICAgICAgICAgeTogeVBvcyhwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKVxyXG4gICAgICAgIH19XHJcbiAgICAgICAgb25SZXNpemU9eyhlLCBkaXJlY3Rpb24sIHJlZikgPT4ge1xyXG4gICAgICAgICAgc2V0UGxhY2Vob2xkZXJCb3JkZXIoe1xyXG4gICAgICAgICAgICB3OiByZWYub2Zmc2V0V2lkdGggLyAocHJvcHMuc2NhbGUgKiBjb250YWluZXJTY2FsZSksXHJcbiAgICAgICAgICAgIGg6IHJlZi5vZmZzZXRIZWlnaHQgLyAocHJvcHMuc2NhbGUgKiBjb250YWluZXJTY2FsZSlcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH19XHJcbiAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlT25DbGlja1BsYWNlaG9sZGVyKCl9XHJcbiAgICAgID5cclxuICAgICAgICB7cHJvcHMuaXNTaG93Qm9yZGVyICYmXHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IFwiY2hlY2tib3hcIiAmJlxyXG4gICAgICAgIHByb3BzLnBvcy5rZXkgPT09IHByb3BzLnNlbGVjdFdpZGdldElkID8gKFxyXG4gICAgICAgICAgPEJvcmRlclJlc2l6ZSByaWdodD17LTEyfSB0b3A9ey0xMX0gLz5cclxuICAgICAgICApIDogcHJvcHMuZGF0YSAmJiBwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLnBvcy50eXBlICE9PSBcImNoZWNrYm94XCIgPyAoXHJcbiAgICAgICAgICBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCA9PT0gcHJvcHMuc2lnbmVyT2JqSWQgJiZcclxuICAgICAgICAgIHByb3BzLnBvcy50eXBlICE9PSByYWRpb0J1dHRvbldpZGdldCAmJlxyXG4gICAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IFwiY2hlY2tib3hcIiA/IChcclxuICAgICAgICAgICAgPEJvcmRlclJlc2l6ZSAvPlxyXG4gICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgPD48Lz5cclxuICAgICAgICAgIClcclxuICAgICAgICApIDogKFxyXG4gICAgICAgICAgcHJvcHMucG9zLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXHJcbiAgICAgICAgICBwcm9wcy5wb3MudHlwZSAhPT0gXCJjaGVja2JveFwiICYmXHJcbiAgICAgICAgICBwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJiA8Qm9yZGVyUmVzaXplIC8+XHJcbiAgICAgICAgKX1cclxuXHJcbiAgICAgICAge3Byb3BzLmlzU2hvd0JvcmRlciAmJiBwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJiAoXHJcbiAgICAgICAgICA8UGxhY2Vob2xkZXJCb3JkZXJcclxuICAgICAgICAgICAgc2V0RHJhZ2dpbmdFbmFibGVkPXtzZXREcmFnZ2luZ0VuYWJsZWR9XHJcbiAgICAgICAgICAgIHBvcz17cHJvcHMucG9zfVxyXG4gICAgICAgICAgICBpc1BsYWNlaG9sZGVyPXtwcm9wcy5pc1BsYWNlaG9sZGVyfVxyXG4gICAgICAgICAgICBnZXRDaGVja2JveFJlbmRlcldpZHRoPXtnZXRDaGVja2JveFJlbmRlcldpZHRofVxyXG4gICAgICAgICAgICBzY2FsZT17cHJvcHMuc2NhbGV9XHJcbiAgICAgICAgICAgIGNvbnRhaW5lclNjYWxlPXtjb250YWluZXJTY2FsZX1cclxuICAgICAgICAgICAgcGxhY2Vob2xkZXJCb3JkZXI9e3BsYWNlaG9sZGVyQm9yZGVyfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApfVxyXG4gICAgICAgIHtpc1RhYkFuZE1vYmlsZSA/IChcclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1zdHJldGNoXCJcclxuICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICBsZWZ0OiB4UG9zKHByb3BzLnBvcywgcHJvcHMuaXNTaWduWW91cnNlbGYpLFxyXG4gICAgICAgICAgICAgIHRvcDogeVBvcyhwcm9wcy5wb3MsIHByb3BzLmlzU2lnbllvdXJzZWxmKSxcclxuICAgICAgICAgICAgICB3aWR0aDpcclxuICAgICAgICAgICAgICAgIHByb3BzLnBvcy50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCB8fFxyXG4gICAgICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICA/IFwiYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgIDogcHJvcHMucG9zV2lkdGgocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiksXHJcbiAgICAgICAgICAgICAgaGVpZ2h0OlxyXG4gICAgICAgICAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IHJhZGlvQnV0dG9uV2lkZ2V0IHx8XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5wb3MudHlwZSA9PT0gXCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgID8gXCJhdXRvXCJcclxuICAgICAgICAgICAgICAgICAgOiBwcm9wcy5wb3NIZWlnaHQocHJvcHMucG9zLCBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiksXHJcbiAgICAgICAgICAgICAgekluZGV4OiBcIjEwXCJcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgb25Ub3VjaEVuZD17KCkgPT4gaGFuZGxlT25DbGlja1BsYWNlaG9sZGVyKCl9XHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZU9uQ2xpY2tQbGFjZWhvbGRlcigpfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7cHJvcHMucG9zLmtleSA9PT0gcHJvcHMuc2VsZWN0V2lkZ2V0SWQgJiYgPFBsYWNlaG9sZGVySWNvbiAvPn1cclxuXHJcbiAgICAgICAgICAgIDxQbGFjZWhvbGRlclR5cGVcclxuICAgICAgICAgICAgICBwb3M9e3Byb3BzLnBvc31cclxuICAgICAgICAgICAgICB4eVBvc3Rpb249e3Byb3BzLnh5UG9zdGlvbn1cclxuICAgICAgICAgICAgICBpbmRleD17cHJvcHMuaW5kZXh9XHJcbiAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtwcm9wcy5zZXRYeVBvc3Rpb259XHJcbiAgICAgICAgICAgICAgZGF0YT17cHJvcHMuZGF0YX1cclxuICAgICAgICAgICAgICBzZXRTaWduS2V5PXtwcm9wcy5zZXRTaWduS2V5fVxyXG4gICAgICAgICAgICAgIGlzU2hvd0Ryb3Bkb3duPXtwcm9wcz8uaXNTaG93RHJvcGRvd259XHJcbiAgICAgICAgICAgICAgaXNQbGFjZWhvbGRlcj17cHJvcHMuaXNQbGFjZWhvbGRlcn1cclxuICAgICAgICAgICAgICBpc1NpZ25Zb3Vyc2VsZj17cHJvcHMuaXNTaWduWW91cnNlbGZ9XHJcbiAgICAgICAgICAgICAgc2lnbmVyT2JqSWQ9e3Byb3BzLnNpZ25lck9iaklkfVxyXG4gICAgICAgICAgICAgIGhhbmRsZVVzZXJOYW1lPXtwcm9wcy5oYW5kbGVVc2VyTmFtZX1cclxuICAgICAgICAgICAgICBzZXREcmFnZ2luZ0VuYWJsZWQ9e3NldERyYWdnaW5nRW5hYmxlZH1cclxuICAgICAgICAgICAgICBwZGZEZXRhaWxzPXtwcm9wcz8ucGRmRGV0YWlscyAmJiBwcm9wcz8ucGRmRGV0YWlsc1swXX1cclxuICAgICAgICAgICAgICBpc05lZWRTaWduPXtwcm9wcy5pc05lZWRTaWdufVxyXG4gICAgICAgICAgICAgIHNldFNlbGVjdERhdGU9e3NldFNlbGVjdERhdGV9XHJcbiAgICAgICAgICAgICAgc2VsZWN0RGF0ZT17c2VsZWN0RGF0ZX1cclxuICAgICAgICAgICAgICBzZXRWYWxpZGF0ZUFsZXJ0PXtwcm9wcy5zZXRWYWxpZGF0ZUFsZXJ0fVxyXG4gICAgICAgICAgICAgIHNldFN0YXJ0RGF0ZT17c2V0U3RhcnREYXRlfVxyXG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZT17c3RhcnREYXRlfVxyXG4gICAgICAgICAgICAgIGhhbmRsZVNhdmVEYXRlPXtoYW5kbGVTYXZlRGF0ZX1cclxuICAgICAgICAgICAgICB4UG9zPXtwcm9wcy54UG9zfVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKSA6IChcclxuICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgIHtwcm9wcy5wb3Mua2V5ID09PSBwcm9wcy5zZWxlY3RXaWRnZXRJZCAmJiA8UGxhY2Vob2xkZXJJY29uIC8+fVxyXG4gICAgICAgICAgICA8UGxhY2Vob2xkZXJUeXBlXHJcbiAgICAgICAgICAgICAgcG9zPXtwcm9wcy5wb3N9XHJcbiAgICAgICAgICAgICAgeHlQb3N0aW9uPXtwcm9wcy54eVBvc3Rpb259XHJcbiAgICAgICAgICAgICAgaW5kZXg9e3Byb3BzLmluZGV4fVxyXG4gICAgICAgICAgICAgIHNldFh5UG9zdGlvbj17cHJvcHMuc2V0WHlQb3N0aW9ufVxyXG4gICAgICAgICAgICAgIGRhdGE9e3Byb3BzLmRhdGF9XHJcbiAgICAgICAgICAgICAgc2V0U2lnbktleT17cHJvcHMuc2V0U2lnbktleX1cclxuICAgICAgICAgICAgICBpc1Nob3dEcm9wZG93bj17cHJvcHM/LmlzU2hvd0Ryb3Bkb3dufVxyXG4gICAgICAgICAgICAgIGlzUGxhY2Vob2xkZXI9e3Byb3BzLmlzUGxhY2Vob2xkZXJ9XHJcbiAgICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e3Byb3BzLmlzU2lnbllvdXJzZWxmfVxyXG4gICAgICAgICAgICAgIHNpZ25lck9iaklkPXtwcm9wcy5zaWduZXJPYmpJZH1cclxuICAgICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17cHJvcHMuaGFuZGxlVXNlck5hbWV9XHJcbiAgICAgICAgICAgICAgc2V0RHJhZ2dpbmdFbmFibGVkPXtzZXREcmFnZ2luZ0VuYWJsZWR9XHJcbiAgICAgICAgICAgICAgcGRmRGV0YWlscz17cHJvcHM/LnBkZkRldGFpbHMgJiYgcHJvcHM/LnBkZkRldGFpbHNbMF19XHJcbiAgICAgICAgICAgICAgaXNOZWVkU2lnbj17cHJvcHMuaXNOZWVkU2lnbn1cclxuICAgICAgICAgICAgICBzZXRTZWxlY3REYXRlPXtzZXRTZWxlY3REYXRlfVxyXG4gICAgICAgICAgICAgIHNlbGVjdERhdGU9e3NlbGVjdERhdGV9XHJcbiAgICAgICAgICAgICAgc2V0VmFsaWRhdGVBbGVydD17cHJvcHMuc2V0VmFsaWRhdGVBbGVydH1cclxuICAgICAgICAgICAgICBzZXRTdGFydERhdGU9e3NldFN0YXJ0RGF0ZX1cclxuICAgICAgICAgICAgICBzdGFydERhdGU9e3N0YXJ0RGF0ZX1cclxuICAgICAgICAgICAgICBoYW5kbGVTYXZlRGF0ZT17aGFuZGxlU2F2ZURhdGV9XHJcbiAgICAgICAgICAgICAgeFBvcz17cHJvcHMueFBvc31cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvPlxyXG4gICAgICAgICl9XHJcbiAgICAgIDwvUm5kPlxyXG4gICAgICA8TW9kYWxVaSBpc09wZW49e2lzRGF0ZU1vZGFsfSB0aXRsZT17dChcIndpZGdldC1pbmZvXCIpfSBzaG93Q2xvc2U9e2ZhbHNlfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtWzEwMCVdIHAtWzIwcHhdXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt0KFwiZm9ybWF0XCIpfSA6IDwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4XCI+XHJcbiAgICAgICAgICAgICAgPHNlbGVjdFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWwtWzdweF0gb3Atc2VsZWN0IG9wLXNlbGVjdC1ib3JkZXJlZCBvcC1zZWxlY3Qtc20gZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdGV4dC14c1wiXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU9e1wiXCJ9XHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICBzZXRTZWxlY3REYXRlKGRhdGVGb3JtYXRbc2VsZWN0ZWRJbmRleF0pO1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgZGlzYWJsZWQ+XHJcbiAgICAgICAgICAgICAgICAgIHt0KFwic2VsZWN0LWRhdGUtZm9ybWF0XCIpfVxyXG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICB7ZGF0ZUZvcm1hdC5tYXAoKGRhdGEsIGluZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gY2xhc3NOYW1lPVwidGV4dC1bMTNweF1cIiB2YWx1ZT17aW5kfSBrZXk9e2luZH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7ZGF0YT8uZGF0ZSA/IGRhdGE/LmRhdGUgOiBcIm5vZGF0YVwifVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtZ3JheS00MDAgbWwtMVwiPlxyXG4gICAgICAgICAgICAgIHtzZWxlY3REYXRlLmZvcm1hdH1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIG10LTQgbWQ6bXQtMlwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57dChcImZvbnQtc2l6ZVwiKX0gOjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNlbGVjdFxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1sLVszcHhdIG1kOm1sOls3cHhdIG9wLXNlbGVjdCBvcC1zZWxlY3QtYm9yZGVyZWQgb3Atc2VsZWN0LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBob3Zlcjpib3JkZXItYmFzZS1jb250ZW50IHRleHQteHNcIlxyXG4gICAgICAgICAgICAgIHZhbHVlPXtwcm9wcy5mb250U2l6ZSB8fCBjbGlja29uV2lkZ2V0Lm9wdGlvbnM/LmZvbnRTaXplIHx8IFwiMTJcIn1cclxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHByb3BzLnNldEZvbnRTaXplKGUudGFyZ2V0LnZhbHVlKX1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHtmb250c2l6ZUFyci5tYXAoKHNpemUsIGluZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiBjbGFzc05hbWU9XCJ0ZXh0LVsxM3B4XVwiIHZhbHVlPXtzaXplfSBrZXk9e2luZH0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NpemV9XHJcbiAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXIgbWwtMiBtZDptbC00IFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt0KFwiY29sb3JcIil9OiA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNlbGVjdFxyXG4gICAgICAgICAgICAgICAgdmFsdWU9e1xyXG4gICAgICAgICAgICAgICAgICBwcm9wcy5mb250Q29sb3IgfHwgY2xpY2tvbldpZGdldC5vcHRpb25zPy5mb250Q29sb3IgfHwgXCJibGFja1wiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHByb3BzLnNldEZvbnRDb2xvcihlLnRhcmdldC52YWx1ZSl9XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtbC1bNHB4XSBtZDptbFs3cHhdIG9wLXNlbGVjdCBvcC1zZWxlY3QtYm9yZGVyZWQgb3Atc2VsZWN0LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBob3Zlcjpib3JkZXItYmFzZS1jb250ZW50IHRleHQteHNcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHtmb250Q29sb3JBcnIubWFwKChjb2xvciwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT17Y29sb3J9IGtleT17aW5kfT5cclxuICAgICAgICAgICAgICAgICAgICAgIHt0KGBjb2xvci10eXBlLiR7Y29sb3J9YCl9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDpcclxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5mb250Q29sb3IgfHwgcHJvcHMucG9zLm9wdGlvbnM/LmZvbnRDb2xvciB8fCBcImJsYWNrXCJcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUgaC1bMTlweF0gbWwtMVwiXHJcbiAgICAgICAgICAgICAgPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtWzFweF0gdy1mdWxsIG15LVsxNXB4XSBiZy1bIzlmOWY5Zl1cIj48L2Rpdj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICBzZXRJc0RhdGVNb2RhbChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgaGFuZGxlU2F2ZURhdGUoc2VsZWN0RGF0ZSk7XHJcbiAgICAgICAgICAgICAgcHJvcHMuc2V0Rm9udENvbG9yKFwiXCIpO1xyXG4gICAgICAgICAgICAgIHByb3BzLnNldEZvbnRTaXplKFwiXCIpO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7dChcInNhdmVcIil9XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9Nb2RhbFVpPlxyXG4gICAgPC8+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXI7XHJcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgdGhlbWVDb2xvciB9IGZyb20gXCIuLi8uLi9jb25zdGFudC9jb25zdFwiO1xyXG5pbXBvcnQge1xyXG4gIGRlZmF1bHRXaWR0aEhlaWdodCxcclxuICBpc01vYmlsZSxcclxuICByYWRpb0J1dHRvbldpZGdldCxcclxuICByZXNpemVCb3JkZXJFeHRyYVdpZHRoLFxyXG4gIHRleHRXaWRnZXRcclxufSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvVXRpbHNcIjtcclxuZnVuY3Rpb24gUGxhY2Vob2xkZXJCb3JkZXIocHJvcHMpIHtcclxuICBjb25zdCBnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoID0gcmVzaXplQm9yZGVyRXh0cmFXaWR0aCgpO1xyXG4gIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGRlZmF1bHRXaWR0aEhlaWdodChwcm9wcy5wb3MudHlwZSkud2lkdGg7XHJcbiAgY29uc3QgZGVmYXVsdEhlaWdodCA9IGRlZmF1bHRXaWR0aEhlaWdodChwcm9wcy5wb3MudHlwZSkuaGVpZ2h0O1xyXG4gIGNvbnN0IHdpZHRoID0gKCkgPT4ge1xyXG4gICAgY29uc3QgZ2V0V2lkdGggPVxyXG4gICAgICBwcm9wcy5wbGFjZWhvbGRlckJvcmRlci53IHx8IHByb3BzLnBvcy5XaWR0aCB8fCBkZWZhdWx0V2lkdGg7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBnZXRXaWR0aCAqIHByb3BzLnNjYWxlICogcHJvcHMuY29udGFpbmVyU2NhbGUgKyBnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoXHJcbiAgICApO1xyXG4gIH07XHJcbiAgY29uc3QgaGVpZ2h0ID0gKCkgPT4ge1xyXG4gICAgY29uc3QgZ2V0SGVpZ2h0ID1cclxuICAgICAgcHJvcHMucGxhY2Vob2xkZXJCb3JkZXIuaCB8fCBwcm9wcy5wb3MuSGVpZ2h0IHx8IGRlZmF1bHRIZWlnaHQ7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgZ2V0SGVpZ2h0ICogcHJvcHMuc2NhbGUgKiBwcm9wcy5jb250YWluZXJTY2FsZSArIGdldFJlc2l6ZUJvcmRlckV4dHJhV2lkdGhcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTWluV2lkdGggPSAoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQpIHtcclxuICAgICAgcmV0dXJuIHByb3BzLmdldENoZWNrYm94UmVuZGVyV2lkdGgud2lkdGggKyBnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHdpZHRoKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBoYW5kbGVNaW5IZWlnaHQgPSAoKSA9PiB7XHJcbiAgICBpZiAocHJvcHMucG9zLnR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCBwcm9wcy5wb3MudHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQpIHtcclxuICAgICAgcmV0dXJuIHByb3BzLmdldENoZWNrYm94UmVuZGVyV2lkdGguaGVpZ2h0ICsgZ2V0UmVzaXplQm9yZGVyRXh0cmFXaWR0aDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBoZWlnaHQoKTtcclxuICAgIH1cclxuICB9O1xyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2XHJcbiAgICAgIG9uTW91c2VFbnRlcj17KCkgPT4gIWlzTW9iaWxlICYmIHByb3BzPy5zZXREcmFnZ2luZ0VuYWJsZWQodHJ1ZSl9XHJcbiAgICAgIG9uVG91Y2hFbmQ9eygpID0+XHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUgPT09IHRleHRXaWRnZXQgJiYgcHJvcHM/LnNldERyYWdnaW5nRW5hYmxlZCh0cnVlKVxyXG4gICAgICB9XHJcbiAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGlubGluZS1ibG9jayB3LVsxNHB4XSBoLVsxNHB4XSAgYm9yZGVyLVswLjJweF0gb3ZlcmZsb3ctaGlkZGVuIGJvcmRlci1kYXNoZWRcIlxyXG4gICAgICBzdHlsZT17e1xyXG4gICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZUNvbG9yLFxyXG4gICAgICAgIG1pbldpZHRoOiBoYW5kbGVNaW5XaWR0aCgpIHx8IDAsXHJcbiAgICAgICAgbWluSGVpZ2h0OiBoYW5kbGVNaW5IZWlnaHQoKSB8fCAwXHJcbiAgICAgIH19XHJcbiAgICA+PC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXJCb3JkZXI7XHJcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCBmb3J3YXJkUmVmLCB1c2VSZWYgfSBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHtcclxuICBnZXRNb250aCxcclxuICBnZXRZZWFyLFxyXG4gIG9uQ2hhbmdlSGVpZ2h0T2ZUZXh0QXJlYSxcclxuICBvbkNoYW5nZUlucHV0LFxyXG4gIHJhZGlvQnV0dG9uV2lkZ2V0LFxyXG4gIHJhbmdlLFxyXG4gIHRleHRJbnB1dFdpZGdldCxcclxuICB0ZXh0V2lkZ2V0XHJcbn0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L1V0aWxzXCI7XHJcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gXCJyZWFjdC1kYXRlcGlja2VyXCI7XHJcbmltcG9ydCBcInJlYWN0LWRhdGVwaWNrZXIvZGlzdC9yZWFjdC1kYXRlcGlja2VyLmNzc1wiO1xyXG5pbXBvcnQgXCIuLi8uLi9zdHlsZXMvc2lnbmF0dXJlLmNzc1wiO1xyXG5pbXBvcnQgUmVnZXhQYXJzZXIgZnJvbSBcInJlZ2V4LXBhcnNlclwiO1xyXG5pbXBvcnQgeyBlbWFpbFJlZ2V4IH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L2NvbnN0XCI7XHJcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSBcInJlYWN0LWkxOG5leHRcIjtcclxuY29uc3QgdGV4dFdpZGdldENscyA9XHJcbiAgXCJ3LWZ1bGwgaC1mdWxsIG1kOm1pbi13LWZ1bGwgbWQ6bWluLWgtZnVsbCB6LVs5OTldIHRleHQtWzEycHhdIHJvdW5kZWQtWzJweF0gYm9yZGVyLVsxcHhdIGJvcmRlci1bIzAwN2JmZl0gb3ZlcmZsb3ctaGlkZGVuIHJlc2l6ZS1ub25lIG91dGxpbmUtbm9uZSB0ZXh0LWJhc2UtY29udGVudCBpdGVtLWNlbnRlciB3aGl0ZXNwYWNlLXByZS13cmFwIGJnLXdoaXRlXCI7XHJcbmNvbnN0IHNlbGVjdFdpZGdldENscyA9XHJcbiAgXCJ3LWZ1bGwgaC1mdWxsIGFic29sdXRlIGxlZnQtMCB0b3AtMCBib3JkZXItWzFweF0gYm9yZGVyLVsjMDA3YmZmXSByb3VuZGVkLVsycHhdIGZvY3VzOm91dGxpbmUtbm9uZSB0ZXh0LWJhc2UtY29udGVudFwiO1xyXG5mdW5jdGlvbiBQbGFjZWhvbGRlclR5cGUocHJvcHMpIHtcclxuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XHJcbiAgY29uc3QgdHlwZSA9IHByb3BzPy5wb3M/LnR5cGU7XHJcbiAgY29uc3Qgd2lkZ2V0VHlwZVRyYXNsYXRpb24gPSB0KGB3aWRnZXRzLW5hbWUuJHtwcm9wcz8ucG9zPy50eXBlfWApO1xyXG4gIGNvbnN0IFtzZWxlY3RPcHRpb24sIHNldFNlbGVjdE9wdGlvbl0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbdmFsaWRhdGVQbGFjZWhvbGRlciwgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcl0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcclxuICBjb25zdCBbdGV4dFZhbHVlLCBzZXRUZXh0VmFsdWVdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbc2VsZWN0ZWRDaGVja2JveCwgc2V0U2VsZWN0ZWRDaGVja2JveF0gPSB1c2VTdGF0ZShbXSk7XHJcbiAgY29uc3QgeWVhcnMgPSByYW5nZSgxOTkwLCBnZXRZZWFyKG5ldyBEYXRlKCkpICsgMTYsIDEpO1xyXG4gIGNvbnN0IGZvbnRTaXplID0gKHByb3BzLnBvcy5vcHRpb25zPy5mb250U2l6ZSB8fCBcIjEyXCIpICsgXCJweFwiO1xyXG4gIGNvbnN0IGZvbnRDb2xvciA9IHByb3BzLnBvcy5vcHRpb25zPy5mb250Q29sb3IgfHwgXCJibGFja1wiO1xyXG4gIGNvbnN0IG1vbnRocyA9IFtcclxuICAgIFwiSmFudWFyeVwiLFxyXG4gICAgXCJGZWJydWFyeVwiLFxyXG4gICAgXCJNYXJjaFwiLFxyXG4gICAgXCJBcHJpbFwiLFxyXG4gICAgXCJNYXlcIixcclxuICAgIFwiSnVuZVwiLFxyXG4gICAgXCJKdWx5XCIsXHJcbiAgICBcIkF1Z3VzdFwiLFxyXG4gICAgXCJTZXB0ZW1iZXJcIixcclxuICAgIFwiT2N0b2JlclwiLFxyXG4gICAgXCJOb3ZlbWJlclwiLFxyXG4gICAgXCJEZWNlbWJlclwiXHJcbiAgXTtcclxuICBjb25zdCB2YWxpZGF0ZUV4cHJlc3Npb24gPSAocmVnZXhWYWxpZGF0aW9uKSA9PiB7XHJcbiAgICBpZiAodGV4dFZhbHVlICYmIHJlZ2V4VmFsaWRhdGlvbikge1xyXG4gICAgICBsZXQgcmVnZXhPYmplY3QgPSByZWdleFZhbGlkYXRpb247XHJcbiAgICAgIGlmIChwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LnR5cGUgPT09IFwicmVnZXhcIikge1xyXG4gICAgICAgIHJlZ2V4T2JqZWN0ID0gUmVnZXhQYXJzZXIocmVnZXhWYWxpZGF0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBuZXcgUmVnRXhwKHJlZ2V4VmFsaWRhdGlvbik7XHJcbiAgICAgIGxldCBpc1ZhbGlkYXRlID0gcmVnZXhPYmplY3QudGVzdCh0ZXh0VmFsdWUpO1xyXG4gICAgICBpZiAoIWlzVmFsaWRhdGUpIHtcclxuICAgICAgICBwcm9wcz8uc2V0VmFsaWRhdGVBbGVydCh0cnVlKTtcclxuICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVJbnB1dEJsdXIgPSAoKSA9PiB7XHJcbiAgICBwcm9wcy5zZXREcmFnZ2luZ0VuYWJsZWQodHJ1ZSk7XHJcbiAgICBjb25zdCB2YWxpZGF0ZVR5cGUgPSBwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbGlkYXRpb24/LnR5cGU7XHJcbiAgICBsZXQgcmVnZXhWYWxpZGF0aW9uO1xyXG4gICAgaWYgKHZhbGlkYXRlVHlwZSAmJiB2YWxpZGF0ZVR5cGUgIT09IFwidGV4dFwiKSB7XHJcbiAgICAgIHN3aXRjaCAodmFsaWRhdGVUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBcImVtYWlsXCI6XHJcbiAgICAgICAgICByZWdleFZhbGlkYXRpb24gPSBlbWFpbFJlZ2V4O1xyXG4gICAgICAgICAgdmFsaWRhdGVFeHByZXNzaW9uKHJlZ2V4VmFsaWRhdGlvbik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICByZWdleFZhbGlkYXRpb24gPSAvXlswLTlcXHNdKiQvO1xyXG4gICAgICAgICAgdmFsaWRhdGVFeHByZXNzaW9uKHJlZ2V4VmFsaWRhdGlvbik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcmVnZXhWYWxpZGF0aW9uID0gcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5wYXR0ZXJuIHx8IFwiXCI7XHJcbiAgICAgICAgICB2YWxpZGF0ZUV4cHJlc3Npb24ocmVnZXhWYWxpZGF0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZVRleHRWYWxpZCA9IChlKSA9PiB7XHJcbiAgICBjb25zdCB0ZXh0SW5wdXQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgIHNldFRleHRWYWx1ZSh0ZXh0SW5wdXQpO1xyXG4gIH07XHJcbiAgZnVuY3Rpb24gY2hlY2tSZWd1bGFyRXhwcmVzcyh2YWxpZGF0ZVR5cGUpIHtcclxuICAgIHN3aXRjaCAodmFsaWRhdGVUeXBlKSB7XHJcbiAgICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICAgIHNldFZhbGlkYXRlUGxhY2Vob2xkZXIoXCJkZW1vQGdtYWlsLmNvbVwiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgIHNldFZhbGlkYXRlUGxhY2Vob2xkZXIoXCIxMjM0NVwiKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcInRleHRcIjpcclxuICAgICAgICBzZXRWYWxpZGF0ZVBsYWNlaG9sZGVyKFwicGxlYXNlIGVudGVyIHRleHRcIik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgc2V0VmFsaWRhdGVQbGFjZWhvbGRlcihcInBsZWFzZSBlbnRlciB2YWx1ZVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAodHlwZSAmJiB0eXBlID09PSBcImNoZWNrYm94XCIgJiYgcHJvcHMuaXNOZWVkU2lnbikge1xyXG4gICAgICBjb25zdCBpc0RlZmF1bHRWYWx1ZSA9IHByb3BzLnBvcy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICAgIGlmIChpc0RlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgIHNldFNlbGVjdGVkQ2hlY2tib3goaXNEZWZhdWx0VmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHByb3BzLnBvcz8ub3B0aW9ucz8uaGludCkge1xyXG4gICAgICBzZXRWYWxpZGF0ZVBsYWNlaG9sZGVyKHByb3BzLnBvcz8ub3B0aW9ucy5oaW50KTtcclxuICAgIH0gZWxzZSBpZiAocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy50eXBlKSB7XHJcbiAgICAgIGNoZWNrUmVndWxhckV4cHJlc3MocHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy50eXBlKTtcclxuICAgIH1cclxuICAgIHNldFRleHRWYWx1ZShcclxuICAgICAgcHJvcHMucG9zPy5vcHRpb25zPy5yZXNwb25zZVxyXG4gICAgICAgID8gcHJvcHMucG9zPy5vcHRpb25zPy5yZXNwb25zZVxyXG4gICAgICAgIDogcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWVcclxuICAgICAgICAgID8gcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWVcclxuICAgICAgICAgIDogXCJcIlxyXG4gICAgKTtcclxuICAgIHNldFNlbGVjdE9wdGlvbihcclxuICAgICAgcHJvcHMucG9zPy5vcHRpb25zPy5yZXNwb25zZVxyXG4gICAgICAgID8gcHJvcHMucG9zPy5vcHRpb25zPy5yZXNwb25zZVxyXG4gICAgICAgIDogcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWVcclxuICAgICAgICAgID8gcHJvcHMucG9zPy5vcHRpb25zPy5kZWZhdWx0VmFsdWVcclxuICAgICAgICAgIDogXCJcIlxyXG4gICAgKTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbXSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoXHJcbiAgICAgIFtcIm5hbWVcIiwgXCJlbWFpbFwiLCBcImpvYiB0aXRsZVwiLCBcImNvbXBhbnlcIl0uaW5jbHVkZXMocHJvcHMucG9zPy50eXBlKSAmJlxyXG4gICAgICBwcm9wcy5pc05lZWRTaWduICYmXHJcbiAgICAgIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcz8uc2lnbmVyT2JqSWRcclxuICAgICkge1xyXG4gICAgICBjb25zdCBkZWZhdWx0RGF0YSA9IHByb3BzLnBvcz8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xyXG4gICAgICBpZiAoZGVmYXVsdERhdGEpIHtcclxuICAgICAgICBzZXRUZXh0VmFsdWUoZGVmYXVsdERhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXHJcbiAgfSwgW3Byb3BzLnBvcz8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlXSk7XHJcblxyXG4gIGNvbnN0IEV4YW1wbGVDdXN0b21JbnB1dCA9IGZvcndhcmRSZWYoKHsgdmFsdWUsIG9uQ2xpY2sgfSwgcmVmKSA9PiAoXHJcbiAgICA8ZGl2XHJcbiAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxyXG4gICAgICAgIGNvbG9yOiBmb250Q29sb3IsXHJcbiAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiXHJcbiAgICAgIH19XHJcbiAgICAgIGNsYXNzTmFtZT17YCR7c2VsZWN0V2lkZ2V0Q2xzfSBvdmVyZmxvdy1oaWRkZW5gfVxyXG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxyXG4gICAgICByZWY9e3JlZn1cclxuICAgID5cclxuICAgICAge3ZhbHVlfVxyXG4gICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1jYWxlbmRhciAgbWwtWzVweF1cIj48L2k+XHJcbiAgICA8L2Rpdj5cclxuICApKTtcclxuICBFeGFtcGxlQ3VzdG9tSW5wdXQuZGlzcGxheU5hbWUgPSBcIkV4YW1wbGVDdXN0b21JbnB1dFwiO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKFxyXG4gICAgICBbXCJuYW1lXCIsIFwiZW1haWxcIiwgXCJqb2IgdGl0bGVcIiwgXCJjb21wYW55XCJdLmluY2x1ZGVzKHR5cGUpICYmXHJcbiAgICAgIHByb3BzLmlzTmVlZFNpZ24gJiZcclxuICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgaXNEZWZhdWx0ID0gdHJ1ZTtcclxuICAgICAgY29uc3Qgc2VuZGVyVXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBFeHRhbmRfQ2xhc3NgKTtcclxuICAgICAgY29uc3QganNvblNlbmRlciA9IEpTT04ucGFyc2Uoc2VuZGVyVXNlcik7XHJcbiAgICAgIG9uQ2hhbmdlSW5wdXQoXHJcbiAgICAgICAganNvblNlbmRlciAmJiBqc29uU2VuZGVyWzBdLFxyXG4gICAgICAgIG51bGwsXHJcbiAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxyXG4gICAgICAgIG51bGwsXHJcbiAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxyXG4gICAgICAgIHByb3BzLmRhdGEuSWQsXHJcbiAgICAgICAgaXNEZWZhdWx0XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXHJcbiAgfSwgW3R5cGVdKTtcclxuICAvL2Z1bmN0aW9uIGZvciBzaG93IGNoZWNrZWQgY2hlY2tib3hcclxuICBjb25zdCBzZWxlY3RDaGVja2JveCA9IChpbmQpID0+IHtcclxuICAgIGNvbnN0IHJlcyA9IHByb3BzLnBvcy5vcHRpb25zPy5yZXNwb25zZTtcclxuICAgIGNvbnN0IGRlZmF1bHRDaGVjayA9IHByb3BzLnBvcy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICBpZiAocmVzICYmIHJlcz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBpc1NlbGVjdEluZGV4ID0gcmVzLmluZGV4T2YoaW5kKTtcclxuICAgICAgaWYgKGlzU2VsZWN0SW5kZXggPiAtMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICAvLyB9XHJcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRDaGVjaykge1xyXG4gICAgICBjb25zdCBpc1NlbGVjdEluZGV4ID0gZGVmYXVsdENoZWNrLmluZGV4T2YoaW5kKTtcclxuICAgICAgaWYgKGlzU2VsZWN0SW5kZXggPiAtMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZVJhZGlvQ2hlY2sgPSAoZGF0YSkgPT4ge1xyXG4gICAgY29uc3QgZGVmYXVsdERhdGEgPSBwcm9wcy5wb3Mub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xyXG4gICAgaWYgKHRleHRWYWx1ZSA9PT0gZGF0YSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAoZGVmYXVsdERhdGEgPT09IGRhdGEpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLy9mdW5jdGlvbiBmb3Igc2V0IGNoZWNrZWQgYW5kIHVuY2hlY2tlZCB2YWx1ZSBvZiBjaGVja2JveFxyXG4gIGNvbnN0IGhhbmRsZUNoZWNrYm94VmFsdWUgPSAoaXNDaGVja2VkLCBpbmQpID0+IHtcclxuICAgIGxldCB1cGRhdGVTZWxlY3RlZENoZWNrYm94ID0gW10sXHJcbiAgICAgIGNoZWNrZWRMaXN0O1xyXG4gICAgbGV0IGlzRGVmYXVsdFZhbHVlLCBpc0RlZmF1bHRFbXB0eTtcclxuICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcclxuICAgICAgdXBkYXRlU2VsZWN0ZWRDaGVja2JveCA9IHNlbGVjdGVkQ2hlY2tib3ggPyBzZWxlY3RlZENoZWNrYm94IDogW107XHJcblxyXG4gICAgICBpZiAoaXNDaGVja2VkKSB7XHJcbiAgICAgICAgdXBkYXRlU2VsZWN0ZWRDaGVja2JveC5wdXNoKGluZCk7XHJcbiAgICAgICAgc2V0U2VsZWN0ZWRDaGVja2JveCh1cGRhdGVTZWxlY3RlZENoZWNrYm94KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjaGVja2VkTGlzdCA9IHNlbGVjdGVkQ2hlY2tib3guZmlsdGVyKChkYXRhKSA9PiBkYXRhICE9PSBpbmQpO1xyXG4gICAgICAgIHNldFNlbGVjdGVkQ2hlY2tib3goY2hlY2tlZExpc3QpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm9wcy5pc05lZWRTaWduKSB7XHJcbiAgICAgICAgaXNEZWZhdWx0VmFsdWUgPSBwcm9wcy5wb3Mub3B0aW9ucz8uZGVmYXVsdFZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc0RlZmF1bHRWYWx1ZSAmJiBpc0RlZmF1bHRWYWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgaXNEZWZhdWx0RW1wdHkgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIG9uQ2hhbmdlSW5wdXQoXHJcbiAgICAgICAgY2hlY2tlZExpc3QgPyBjaGVja2VkTGlzdCA6IHVwZGF0ZVNlbGVjdGVkQ2hlY2tib3gsXHJcbiAgICAgICAgcHJvcHMucG9zLmtleSxcclxuICAgICAgICBwcm9wcy54eVBvc3Rpb24sXHJcbiAgICAgICAgcHJvcHMuaW5kZXgsXHJcbiAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxyXG4gICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YS5JZCxcclxuICAgICAgICBmYWxzZSxcclxuICAgICAgICBudWxsLFxyXG4gICAgICAgIGlzRGVmYXVsdEVtcHR5XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLy9mdW5jdGlvbiB0byBoYW5kbGUgc2VsZWN0IHJhZGlvIHdpZGdldCBhbmQgc2V0IHZhbHVlIHNlbGV0Y2VkIGJ5IHVzZXJcclxuICBjb25zdCBoYW5kbGVDaGVja1JhZGlvID0gKGlzQ2hlY2tlZCwgZGF0YSkgPT4ge1xyXG4gICAgbGV0IGlzRGVmYXVsdFZhbHVlLFxyXG4gICAgICBpc0RlZmF1bHRFbXB0eSxcclxuICAgICAgaXNSYWRpbyA9IHRydWU7XHJcbiAgICBpZiAocHJvcHMuaXNOZWVkU2lnbikge1xyXG4gICAgICBpc0RlZmF1bHRWYWx1ZSA9IHByb3BzLnBvcy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZiAoaXNEZWZhdWx0VmFsdWUpIHtcclxuICAgICAgaXNEZWZhdWx0RW1wdHkgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzQ2hlY2tlZCkge1xyXG4gICAgICBzZXRUZXh0VmFsdWUoZGF0YSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZXRUZXh0VmFsdWUoXCJcIik7XHJcbiAgICB9XHJcbiAgICBvbkNoYW5nZUlucHV0KFxyXG4gICAgICBkYXRhLFxyXG4gICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICBwcm9wcy54eVBvc3Rpb24sXHJcbiAgICAgIHByb3BzLmluZGV4LFxyXG4gICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YS5JZCxcclxuICAgICAgZmFsc2UsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIGlzRGVmYXVsdEVtcHR5LFxyXG4gICAgICBpc1JhZGlvXHJcbiAgICApO1xyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiB0byBzZXQgb25jaGFuZ2UgZGF0ZVxyXG4gIGNvbnN0IGhhbmRsZU9uRGF0ZUNoYW5nZSA9IChkYXRlKSA9PiB7XHJcbiAgICBwcm9wcy5zZXRTdGFydERhdGUoZGF0ZSk7XHJcbiAgICBjb25zdCBpc0RhdGVDaGFuZ2UgPSB0cnVlO1xyXG4gICAgY29uc3QgZGF0ZU9iaiA9IHtcclxuICAgICAgZGF0ZTogZGF0ZSxcclxuICAgICAgZm9ybWF0OiBwcm9wcy5zZWxlY3REYXRlLmZvcm1hdFxyXG4gICAgfTtcclxuICAgIHByb3BzLmhhbmRsZVNhdmVEYXRlKGRhdGVPYmosIGlzRGF0ZUNoYW5nZSk7XHJcbiAgfTtcclxuICAvL2hhbmRsZSBoZWlnaHQgb24gZW50ZXIgcHJlc3MgaW4gdGV4dCBhcmVhXHJcbiAgY29uc3QgaGFuZGxlRW50ZXJQcmVzcyA9IChlKSA9PiB7XHJcbiAgICBjb25zdCBoZWlnaHQgPSAxODtcclxuICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgIC8vZnVuY3Rpb24gdG8gc2F2ZSBoZWlnaHQgb2YgdGV4dCBhcmVhXHJcbiAgICAgIG9uQ2hhbmdlSGVpZ2h0T2ZUZXh0QXJlYShcclxuICAgICAgICBoZWlnaHQsXHJcbiAgICAgICAgcHJvcHMucG9zLnR5cGUsXHJcbiAgICAgICAgcHJvcHMucG9zLmtleSxcclxuICAgICAgICBwcm9wcy54eVBvc3Rpb24sXHJcbiAgICAgICAgcHJvcHMuaW5kZXgsXHJcbiAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxyXG4gICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9O1xyXG4gIHN3aXRjaCAodHlwZSkge1xyXG4gICAgY2FzZSBcInNpZ25hdHVyZVwiOlxyXG4gICAgICByZXR1cm4gcHJvcHMucG9zLlNpZ25VcmwgPyAoXHJcbiAgICAgICAgPGltZ1xyXG4gICAgICAgICAgYWx0PVwic2lnbmF0dXJlXCJcclxuICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcclxuICAgICAgICAgIHNyYz17cHJvcHMucG9zLlNpZ25Vcmx9XHJcbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxyXG4gICAgICAgICAgICBwcm9wcz8uaGFuZGxlVXNlck5hbWUoXHJcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LklkLFxyXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5Sb2xlLFxyXG4gICAgICAgICAgICAgIHdpZGdldFR5cGVUcmFzbGF0aW9uXHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICk7XHJcbiAgICBjYXNlIFwic3RhbXBcIjpcclxuICAgICAgcmV0dXJuIHByb3BzLnBvcy5TaWduVXJsID8gKFxyXG4gICAgICAgIDxpbWdcclxuICAgICAgICAgIGFsdD1cInN0YW1wXCJcclxuICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcclxuICAgICAgICAgIHNyYz17cHJvcHMucG9zLlNpZ25Vcmx9XHJcbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsXCJcclxuICAgICAgICAvPlxyXG4gICAgICApIDogKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gdy1mdWxsIGgtZnVsbCB0ZXh0LWJsYWNrIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICB7cHJvcHM/LmhhbmRsZVVzZXJOYW1lICYmXHJcbiAgICAgICAgICAgIHByb3BzPy5oYW5kbGVVc2VyTmFtZShcclxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uSWQsXHJcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LlJvbGUsXHJcbiAgICAgICAgICAgICAgd2lkZ2V0VHlwZVRyYXNsYXRpb25cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgXCJjaGVja2JveFwiOlxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIDxkaXYgc3R5bGU9e3sgekluZGV4OiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiAmJiBcIjk5XCIgfX0+XHJcbiAgICAgICAgICB7cHJvcHMucG9zLm9wdGlvbnM/LnZhbHVlcz8ubWFwKChkYXRhLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICA8ZGl2IGtleT17aW5kfSBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlciBnYXAtMC41XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogZm9udFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBmb250U2l6ZVxyXG4gICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgICAgICAgICAgIGluZCA9PT0gMCA/IFwibXQtMFwiIDogXCJtdC1bNXB4XVwiXHJcbiAgICAgICAgICAgICAgICAgIH0gZmxleCBqdXN0aWZ5LWNlbnRlciBvcC1jaGVja2JveCByb3VuZGVkLVsxcHhdIGB9XHJcbiAgICAgICAgICAgICAgICAgIG9uQmx1cj17aGFuZGxlSW5wdXRCbHVyfVxyXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgIChwcm9wcy5wb3Mub3B0aW9ucz8uaXNSZWFkT25seSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgIT09IHByb3BzLnNpZ25lck9iaklkKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdENoZWNrYm94KGluZCl9XHJcbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3BzLmlzUGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UmVxdWlyZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnBvcy5vcHRpb25zPy52YWxpZGF0aW9uPy5tYXhSZXF1aXJlZENvdW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhDb3VudEludCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVxdWlyZWQgJiYgcGFyc2VJbnQobWF4UmVxdWlyZWQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heENvdW50SW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hlY2tib3ggJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ2hlY2tib3g/Lmxlbmd0aCA8PSBtYXhDb3VudEludCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoZWNrYm94VmFsdWUoZS50YXJnZXQuY2hlY2tlZCwgaW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tib3hWYWx1ZShlLnRhcmdldC5jaGVja2VkLCBpbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoZWNrYm94VmFsdWUoZS50YXJnZXQuY2hlY2tlZCwgaW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgeyFwcm9wcy5wb3Mub3B0aW9ucz8uaXNIaWRlTGFiZWwgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyBtYi0wIHRleHQtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHtkYXRhfVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0pfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApO1xyXG4gICAgY2FzZSB0ZXh0SW5wdXRXaWRnZXQ6XHJcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxyXG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCkgPyAoXHJcbiAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9e3ZhbGlkYXRlUGxhY2Vob2xkZXIgfHwgXCJwbGVhc2UgZW50ZXIgdmFsdWVcIn1cclxuICAgICAgICAgIHJvd3M9ezF9XHJcbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XHJcbiAgICAgICAgICB2YWx1ZT17dGV4dFZhbHVlfVxyXG4gICAgICAgICAgb25CbHVyPXtoYW5kbGVJbnB1dEJsdXJ9XHJcbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcclxuICAgICAgICAgICAgc2V0VGV4dFZhbHVlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcclxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcclxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcclxuICAgICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcclxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNvbHM9XCI1MFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXHJcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3IsXHJcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuPnt3aWRnZXRUeXBlVHJhc2xhdGlvbn08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICk7XHJcbiAgICBjYXNlIFwiZHJvcGRvd25cIjpcclxuICAgICAgcmV0dXJuIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCA/IChcclxuICAgICAgICA8c2VsZWN0XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXHJcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3JcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICBjbGFzc05hbWU9e2Ake3NlbGVjdFdpZGdldENsc30gdGV4dC1bMTJweF0gYmctaW5oZXJpdGB9XHJcbiAgICAgICAgICBpZD1cIm15RHJvcGRvd25cIlxyXG4gICAgICAgICAgdmFsdWU9e3NlbGVjdE9wdGlvbn1cclxuICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICBzZXRTZWxlY3RPcHRpb24oZS50YXJnZXQudmFsdWUpO1xyXG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxyXG4gICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxyXG4gICAgICAgICAgICAgIHByb3BzLnBvcy5rZXksXHJcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxyXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxyXG4gICAgICAgICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxyXG4gICAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgID5cclxuICAgICAgICAgIHsvKiBEZWZhdWx0L1RpdGxlIG9wdGlvbiAqL31cclxuICAgICAgICAgIDxvcHRpb25cclxuICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXHJcbiAgICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICB2YWx1ZT1cIlwiXHJcbiAgICAgICAgICAgIGRpc2FibGVkXHJcbiAgICAgICAgICAgIGhpZGRlblxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7cHJvcHM/LnBvcz8ub3B0aW9ucz8ubmFtZX1cclxuICAgICAgICAgIDwvb3B0aW9uPlxyXG5cclxuICAgICAgICAgIHtwcm9wcy5wb3M/Lm9wdGlvbnM/LnZhbHVlcz8ubWFwKChkYXRhLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXHJcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3JcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICBrZXk9e2luZH1cclxuICAgICAgICAgICAgICAgIHZhbHVlPXtkYXRhfVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHtkYXRhfVxyXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSl9XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICkgOiAoXHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxyXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yXHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgICAgY2xhc3NOYW1lPVwiIG92ZXJmbG93LWhpZGRlblwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3Byb3BzLnBvcz8ub3B0aW9ucz8ubmFtZVxyXG4gICAgICAgICAgICA/IHByb3BzLnBvcy5vcHRpb25zLm5hbWVcclxuICAgICAgICAgICAgOiB3aWRnZXRUeXBlVHJhc2xhdGlvbn1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgXCJpbml0aWFsc1wiOlxyXG4gICAgICByZXR1cm4gcHJvcHMucG9zLlNpZ25VcmwgPyAoXHJcbiAgICAgICAgPGltZ1xyXG4gICAgICAgICAgYWx0PVwiaW5pdGlhbHNcIlxyXG4gICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxyXG4gICAgICAgICAgc3JjPXtwcm9wcy5wb3MuU2lnblVybH1cclxuICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGxcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICkgOiAoXHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSB3LWZ1bGwgaC1mdWxsIHRleHQtYmxhY2sgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIHtwcm9wcz8uaGFuZGxlVXNlck5hbWUgJiZcclxuICAgICAgICAgICAgcHJvcHM/LmhhbmRsZVVzZXJOYW1lKFxyXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5JZCxcclxuICAgICAgICAgICAgICBwcm9wcz8uZGF0YT8uUm9sZSxcclxuICAgICAgICAgICAgICB3aWRnZXRUeXBlVHJhc2xhdGlvblxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApO1xyXG4gICAgY2FzZSBcIm5hbWVcIjpcclxuICAgICAgcmV0dXJuIHByb3BzLmlzU2lnbllvdXJzZWxmIHx8XHJcbiAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSA/IChcclxuICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj17XCJuYW1lXCJ9XHJcbiAgICAgICAgICByb3dzPXsxfVxyXG4gICAgICAgICAgb25LZXlEb3duPXtoYW5kbGVFbnRlclByZXNzfVxyXG4gICAgICAgICAgdmFsdWU9e3RleHRWYWx1ZX1cclxuICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc0RlZmF1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaGFuZGxlVGV4dFZhbGlkKGUpO1xyXG4gICAgICAgICAgICBvbkNoYW5nZUlucHV0KFxyXG4gICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxyXG4gICAgICAgICAgICAgIHByb3BzLnBvcy5rZXksXHJcbiAgICAgICAgICAgICAgcHJvcHMueHlQb3N0aW9uLFxyXG4gICAgICAgICAgICAgIHByb3BzLmluZGV4LFxyXG4gICAgICAgICAgICAgIHByb3BzLnNldFh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5kYXRhICYmIHByb3BzLmRhdGE/LklkLFxyXG4gICAgICAgICAgICAgIGlzRGVmYXVsdFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcclxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNvbHM9XCI1MFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXHJcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3IsXHJcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWwsIHNhbnMtc2VyaWZcIixcclxuICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4+e3dpZGdldFR5cGVUcmFzbGF0aW9ufTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgXCJjb21wYW55XCI6XHJcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxyXG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCkgPyAoXHJcbiAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICByZWY9e2lucHV0UmVmfVxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB0ZXh0XCJcclxuICAgICAgICAgIHJvd3M9ezF9XHJcbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XHJcbiAgICAgICAgICB2YWx1ZT17dGV4dFZhbHVlfVxyXG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgIGhhbmRsZVRleHRWYWxpZChlKTtcclxuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcclxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcclxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcclxuICAgICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcclxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNvbHM9XCI1MFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXHJcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3IsXHJcbiAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxyXG4gICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsLCBzYW5zLXNlcmlmXCJcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4+e3dpZGdldFR5cGVUcmFzbGF0aW9ufTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgXCJqb2IgdGl0bGVcIjpcclxuICAgICAgcmV0dXJuIHByb3BzLmlzU2lnbllvdXJzZWxmIHx8XHJcbiAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSA/IChcclxuICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj17XCJqb2IgdGl0bGVcIn1cclxuICAgICAgICAgIHJvd3M9ezF9XHJcbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XHJcbiAgICAgICAgICB2YWx1ZT17dGV4dFZhbHVlfVxyXG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgIGhhbmRsZVRleHRWYWxpZChlKTtcclxuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcclxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcclxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcclxuICAgICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcclxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNvbHM9XCI1MFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXHJcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3IsXHJcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWwsIHNhbnMtc2VyaWZcIixcclxuICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4+e3dpZGdldFR5cGVUcmFzbGF0aW9ufTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgXCJkYXRlXCI6XHJcbiAgICAgIHJldHVybiBwcm9wcy5pc1NpZ25Zb3Vyc2VsZiB8fFxyXG4gICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmIHByb3BzLmRhdGE/LnNpZ25lck9iaklkID09PSBwcm9wcy5zaWduZXJPYmpJZCkgPyAoXHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxEYXRlUGlja2VyXHJcbiAgICAgICAgICAgIHJlbmRlckN1c3RvbUhlYWRlcj17KHsgZGF0ZSwgY2hhbmdlWWVhciwgY2hhbmdlTW9udGggfSkgPT4gKFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LXN0YXJ0IG1sLTIgXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLXRyYW5zcGFyZW50IG91dGxpbmUtbm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXttb250aHNbZ2V0TW9udGgoZGF0ZSldfVxyXG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHsgdGFyZ2V0OiB7IHZhbHVlIH0gfSkgPT5cclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VNb250aChtb250aHMuaW5kZXhPZih2YWx1ZSkpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAge21vbnRocy5tYXAoKG9wdGlvbikgPT4gKFxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtvcHRpb259IHZhbHVlPXtvcHRpb259PlxyXG4gICAgICAgICAgICAgICAgICAgICAge29wdGlvbn1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3RcclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctdHJhbnNwYXJlbnQgb3V0bGluZS1ub25lXCJcclxuICAgICAgICAgICAgICAgICAgdmFsdWU9e2dldFllYXIoZGF0ZSl9XHJcbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoeyB0YXJnZXQ6IHsgdmFsdWUgfSB9KSA9PiBjaGFuZ2VZZWFyKHZhbHVlKX1cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAge3llYXJzLm1hcCgob3B0aW9uKSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e29wdGlvbn0gdmFsdWU9e29wdGlvbn0+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7b3B0aW9ufVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICApKX1cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgICAgICBkaXNhYmxlZD17XHJcbiAgICAgICAgICAgICAgcHJvcHMuaXNQbGFjZWhvbGRlciB8fFxyXG4gICAgICAgICAgICAgIChwcm9wcy5pc05lZWRTaWduICYmXHJcbiAgICAgICAgICAgICAgICBwcm9wcy5kYXRhPy5zaWduZXJPYmpJZCAhPT0gcHJvcHMuc2lnbmVyT2JqSWQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb25CbHVyPXtoYW5kbGVJbnB1dEJsdXJ9XHJcbiAgICAgICAgICAgIGNsb3NlT25TY3JvbGw9e3RydWV9XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7c2VsZWN0V2lkZ2V0Q2xzfSBvdXRsaW5lLVsjMDA3YmZmXWB9XHJcbiAgICAgICAgICAgIHNlbGVjdGVkPXtcclxuICAgICAgICAgICAgICBwcm9wcz8uc3RhcnREYXRlXHJcbiAgICAgICAgICAgICAgICA/IHByb3BzPy5zdGFydERhdGVcclxuICAgICAgICAgICAgICAgIDogcHJvcHMucG9zLm9wdGlvbnM/LnJlc3BvbnNlICYmXHJcbiAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKHByb3BzLnBvcy5vcHRpb25zLnJlc3BvbnNlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlPXsoZGF0ZSkgPT4gaGFuZGxlT25EYXRlQ2hhbmdlKGRhdGUpfVxyXG4gICAgICAgICAgICBwb3BwZXJQbGFjZW1lbnQ9XCJ0b3AtZW5kXCJcclxuICAgICAgICAgICAgY3VzdG9tSW5wdXQ9ezxFeGFtcGxlQ3VzdG9tSW5wdXQgLz59XHJcbiAgICAgICAgICAgIGRhdGVGb3JtYXQ9e1xyXG4gICAgICAgICAgICAgIHByb3BzLnNlbGVjdERhdGVcclxuICAgICAgICAgICAgICAgID8gcHJvcHMuc2VsZWN0RGF0ZT8uZm9ybWF0XHJcbiAgICAgICAgICAgICAgICA6IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XHJcbiAgICAgICAgICAgICAgICAgID8gcHJvcHMucG9zPy5vcHRpb25zPy52YWxpZGF0aW9uPy5mb3JtYXRcclxuICAgICAgICAgICAgICAgICAgOiBcIk1NL2RkL3l5eXlcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApIDogKFxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcclxuICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvcixcclxuICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbCwgc2Fucy1zZXJpZlwiXHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgICAgY2xhc3NOYW1lPVwiaXRlbXMtY2VudGVyIG92ZXJmbG93LWhpZGRlblwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgIHtwcm9wcy5zZWxlY3REYXRlXHJcbiAgICAgICAgICAgICAgPyBwcm9wcy5zZWxlY3REYXRlPy5mb3JtYXRcclxuICAgICAgICAgICAgICA6IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XHJcbiAgICAgICAgICAgICAgICA/IHByb3BzLnBvcz8ub3B0aW9ucz8udmFsaWRhdGlvbj8uZm9ybWF0XHJcbiAgICAgICAgICAgICAgICA6IFwiTU0vZGQveXl5eVwifVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApO1xyXG4gICAgY2FzZSBcImltYWdlXCI6XHJcbiAgICAgIHJldHVybiBwcm9wcy5wb3MuU2lnblVybCA/IChcclxuICAgICAgICA8aW1nXHJcbiAgICAgICAgICBhbHQ9XCJpbWFnZVwiXHJcbiAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXHJcbiAgICAgICAgICBzcmM9e3Byb3BzLnBvcy5TaWduVXJsfVxyXG4gICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIHctZnVsbCBoLWZ1bGwgdGV4dC1ibGFjayBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAge3Byb3BzPy5oYW5kbGVVc2VyTmFtZSAmJlxyXG4gICAgICAgICAgICBwcm9wcz8uaGFuZGxlVXNlck5hbWUoXHJcbiAgICAgICAgICAgICAgcHJvcHM/LmRhdGE/LklkLFxyXG4gICAgICAgICAgICAgIHByb3BzPy5kYXRhPy5Sb2xlLFxyXG4gICAgICAgICAgICAgIHdpZGdldFR5cGVUcmFzbGF0aW9uXHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICk7XHJcbiAgICBjYXNlIFwiZW1haWxcIjpcclxuICAgICAgcmV0dXJuIHByb3BzLmlzU2lnbllvdXJzZWxmIHx8XHJcbiAgICAgICAgKHByb3BzLmlzTmVlZFNpZ24gJiYgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgPT09IHByb3BzLnNpZ25lck9iaklkKSA/IChcclxuICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj17XCJlbnRlciBlbWFpbFwifVxyXG4gICAgICAgICAgcm93cz17MX1cclxuICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlRW50ZXJQcmVzc31cclxuICAgICAgICAgIHZhbHVlPXt0ZXh0VmFsdWV9XHJcbiAgICAgICAgICBvbkJsdXI9e2hhbmRsZUlucHV0Qmx1cn1cclxuICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICBoYW5kbGVUZXh0VmFsaWQoZSk7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlSW5wdXQoXHJcbiAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUsXHJcbiAgICAgICAgICAgICAgcHJvcHMucG9zLmtleSxcclxuICAgICAgICAgICAgICBwcm9wcy54eVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuaW5kZXgsXHJcbiAgICAgICAgICAgICAgcHJvcHMuc2V0WHlQb3N0aW9uLFxyXG4gICAgICAgICAgICAgIHByb3BzLmRhdGEgJiYgcHJvcHMuZGF0YT8uSWQsXHJcbiAgICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICBjbGFzc05hbWU9e3RleHRXaWRnZXRDbHN9XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXHJcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3IsXHJcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWwsIHNhbnMtc2VyaWZcIlxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNvbHM9XCI1MFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgKSA6IChcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXHJcbiAgICAgICAgICAgIGNvbG9yOiBmb250Q29sb3IsXHJcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWwsIHNhbnMtc2VyaWZcIixcclxuICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4+e3dpZGdldFR5cGVUcmFzbGF0aW9ufTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICAgIGNhc2UgcmFkaW9CdXR0b25XaWRnZXQ6XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIHtwcm9wcy5wb3Mub3B0aW9ucz8udmFsdWVzLm1hcCgoZGF0YSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgPGRpdiBrZXk9e2luZH0gY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXIgZ2FwLTAuNVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGZvbnRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogZm9udFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiBpbmQgPiAwID8gXCIxMHB4XCIgOiBcIjBweFwiXHJcbiAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgganVzdGlmeS1jZW50ZXIgb3AtcmFkaW9gfVxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuaXNOZWVkU2lnbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgIChwcm9wcy5wb3Mub3B0aW9ucz8uaXNSZWFkT25seSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgcHJvcHMuZGF0YT8uc2lnbmVyT2JqSWQgIT09IHByb3BzLnNpZ25lck9iaklkKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2hhbmRsZVJhZGlvQ2hlY2soZGF0YSl9XHJcbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJvcHMuaXNQbGFjZWhvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tSYWRpbyhlLnRhcmdldC5jaGVja2VkLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgeyFwcm9wcy5wb3Mub3B0aW9ucz8uaXNIaWRlTGFiZWwgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGZvbnRDb2xvclxyXG4gICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyBtYi0wXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIHtkYXRhfVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0pfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApO1xyXG4gICAgY2FzZSB0ZXh0V2lkZ2V0OlxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIDx0ZXh0YXJlYVxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB0ZXh0XCJcclxuICAgICAgICAgIHJvd3M9ezF9XHJcbiAgICAgICAgICBvbktleURvd249e2hhbmRsZUVudGVyUHJlc3N9XHJcbiAgICAgICAgICB2YWx1ZT17dGV4dFZhbHVlfVxyXG4gICAgICAgICAgb25CbHVyPXtoYW5kbGVJbnB1dEJsdXJ9XHJcbiAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHtcclxuICAgICAgICAgICAgc2V0VGV4dFZhbHVlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgb25DaGFuZ2VJbnB1dChcclxuICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcclxuICAgICAgICAgICAgICBwcm9wcy5wb3Mua2V5LFxyXG4gICAgICAgICAgICAgIHByb3BzLnh5UG9zdGlvbixcclxuICAgICAgICAgICAgICBwcm9wcy5pbmRleCxcclxuICAgICAgICAgICAgICBwcm9wcy5zZXRYeVBvc3Rpb24sXHJcbiAgICAgICAgICAgICAgcHJvcHMuZGF0YSAmJiBwcm9wcy5kYXRhPy5JZCxcclxuICAgICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIGNsYXNzTmFtZT17dGV4dFdpZGdldENsc31cclxuICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiQXJpYWwsIHNhbnMtc2VyaWZcIixcclxuICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxyXG4gICAgICAgICAgICBjb2xvcjogZm9udENvbG9yXHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgICAgY29scz1cIjUwXCJcclxuICAgICAgICAvPlxyXG4gICAgICApO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIHByb3BzLnBvcy5TaWduVXJsID8gKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZVwiPlxyXG4gICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICBhbHQ9XCJpbWFnZVwiXHJcbiAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcclxuICAgICAgICAgICAgc3JjPXtwcm9wcy5wb3MuU2lnblVybH1cclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbFwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApIDogKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gdy1mdWxsIGgtZnVsbCB0ZXh0LWJsYWNrIGZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICB7cHJvcHMucG9zLmlzU3RhbXAgPyA8ZGl2PnN0YW1wPC9kaXY+IDogPGRpdj5zaWduYXR1cmU8L2Rpdj59XHJcbiAgICAgICAgICB7cHJvcHM/LmhhbmRsZVVzZXJOYW1lICYmXHJcbiAgICAgICAgICAgIHByb3BzPy5oYW5kbGVVc2VyTmFtZShwcm9wcz8uZGF0YT8uSWQsIHByb3BzPy5kYXRhPy5Sb2xlKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBsYWNlaG9sZGVyVHlwZTtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XHJcblxyXG5mdW5jdGlvbiBQcmV2TmV4dCh7IHBhZ2VOdW1iZXIsIGFsbFBhZ2VzLCBjaGFuZ2VQYWdlIH0pIHtcclxuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XHJcbiAgLy9mb3IgZ28gdG8gcHJldmlvdXMgcGFnZVxyXG4gIGZ1bmN0aW9uIHByZXZpb3VzUGFnZSgpIHtcclxuICAgIGNoYW5nZVBhZ2UoLTEpO1xyXG4gIH1cclxuICAvL2ZvciBnbyB0byBuZXh0IHBhZ2VcclxuICBmdW5jdGlvbiBuZXh0UGFnZSgpIHtcclxuICAgIGNoYW5nZVBhZ2UoMSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1uZXV0cmFsIG9wLWJ0bi14cyBtZDpvcC1idG4tc20gZm9udC1zZW1pYm9sZCB0ZXh0LXhzXCJcclxuICAgICAgICBkaXNhYmxlZD17cGFnZU51bWJlciA8PSAxfVxyXG4gICAgICAgIG9uQ2xpY2s9e3ByZXZpb3VzUGFnZX1cclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJsb2NrXCI+XHJcbiAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1iYWNrd2FyZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtYmFzZS1jb250ZW50IGZvbnQtbWVkaXVtIG14LTIgMnhsOnRleHQtWzMwcHhdXCI+XHJcbiAgICAgICAge3BhZ2VOdW1iZXIgfHwgKGFsbFBhZ2VzID8gMSA6IFwiLS1cIil9IHt0KFwib2ZcIil9IHthbGxQYWdlcyB8fCBcIi0tXCJ9XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tbmV1dHJhbCBvcC1idG4teHMgbWQ6b3AtYnRuLXNtIGZvbnQtc2VtaWJvbGQgdGV4dC14c1wiXHJcbiAgICAgICAgZGlzYWJsZWQ9e3BhZ2VOdW1iZXIgPj0gYWxsUGFnZXN9XHJcbiAgICAgICAgb25DbGljaz17bmV4dFBhZ2V9XHJcbiAgICAgID5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJibG9ja1wiPlxyXG4gICAgICAgICAgPGkgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtZm9yd2FyZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJldk5leHQ7XHJcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xyXG5pbXBvcnQgeyBEb2N1bWVudCwgUGFnZSB9IGZyb20gXCJyZWFjdC1wZGZcIjtcclxuaW1wb3J0IHsgdXNlU2VsZWN0b3IgfSBmcm9tIFwicmVhY3QtcmVkdXhcIjtcclxuXHJcbmZ1bmN0aW9uIFJlbmRlckFsbFBkZlBhZ2Uoe1xyXG4gIHNpZ25QZGZVcmwsXHJcbiAgYWxsUGFnZXMsXHJcbiAgc2V0QWxsUGFnZXMsXHJcbiAgc2V0UGFnZU51bWJlcixcclxuICBzZXRTaWduQnRuUG9zaXRpb24sXHJcbiAgcGFnZU51bWJlcixcclxuICBzaWduZXJQb3MsXHJcbiAgc2lnbmVyT2JqZWN0SWQsXHJcbiAgY29udGFpbmVyV0gsXHJcbiAgcGRmUm90YXRlQmFzZTY0XHJcbn0pIHtcclxuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XHJcbiAgY29uc3QgW3NpZ25QYWdlTnVtYmVyLCBzZXRTaWduUGFnZU51bWJlcl0gPSB1c2VTdGF0ZShbXSk7XHJcbiAgY29uc3QgW2Jvb2ttYXJrQ29sb3IsIHNldEJvb2ttYXJrQ29sb3JdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgLy9zZXQgYWxsIG51bWJlciBvZiBwYWdlcyBhZnRlciBsb2FkIHBkZlxyXG4gIGZ1bmN0aW9uIG9uRG9jdW1lbnRMb2FkKHsgbnVtUGFnZXMgfSkge1xyXG4gICAgc2V0QWxsUGFnZXMobnVtUGFnZXMpO1xyXG4gICAgLy9jaGVjayBpZiBzaWduZXJQb3MgYXJyYXkgZXhpc3QgdGhlbiBzYXZlIHBhZ2UgbnVtYmVyIGV4aXN0IGluIHNpZ25lclBvcyBhcnJheSB0byBzaG93IGJvb2ttYXJrIGljb25cclxuICAgIGlmIChzaWduZXJQb3MpIHtcclxuICAgICAgY29uc3QgY2hlY2tVc2VyID0gc2lnbmVyUG9zLmZpbHRlcihcclxuICAgICAgICAoZGF0YSkgPT4gZGF0YS5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWRcclxuICAgICAgKTtcclxuICAgICAgc2V0Qm9va21hcmtDb2xvcihjaGVja1VzZXJbMF0/LmJsb2NrQ29sb3IpO1xyXG4gICAgICBsZXQgcGFnZU51bWJlckFyciA9IFtdO1xyXG4gICAgICBpZiAoY2hlY2tVc2VyPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY2hlY2tVc2VyWzBdPy5wbGFjZUhvbGRlcj8ubWFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICBwYWdlTnVtYmVyQXJyLnB1c2goZGF0YT8ucGFnZU51bWJlcik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNldFNpZ25QYWdlTnVtYmVyKHBhZ2VOdW1iZXJBcnIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNvbnN0IHBhZ2VDb250YWluZXIgPSB1c2VSZWYoKTtcclxuICBjb25zdCBpc0hlYWRlciA9IHVzZVNlbGVjdG9yKChzdGF0ZSkgPT4gc3RhdGUuc2hvd0hlYWRlcik7XHJcbiAgY29uc3QgW3BhZ2VXaWR0aCwgc2V0UGFnZVdpZHRoXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgdXBkYXRlU2l6ZSA9ICgpID0+IHtcclxuICAgICAgaWYgKHBhZ2VDb250YWluZXIuY3VycmVudCkge1xyXG4gICAgICAgIHNldFBhZ2VXaWR0aChwYWdlQ29udGFpbmVyLmN1cnJlbnQub2Zmc2V0V2lkdGgpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIHdhaXQgZm9yIHRoZSB0cmFuc2l0aW9uIHRvIGNvbXBsZXRlXHJcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQodXBkYXRlU2l6ZSwgMTAwKTsgLy8gbWF0Y2ggdGhlIHRyYW5zaXRpb24gZHVyYXRpb25cclxuXHJcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICB9LCBbaXNIZWFkZXIsIHBhZ2VDb250YWluZXIsIGNvbnRhaW5lcldIXSk7XHJcbiAgLy8nZnVuY3Rpb24gYGFkZFNpZ25hdHVyZUJvb2ttYXJrYCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIHBhZ2Ugd2hlcmUgdGhlIHVzZXIncyBzaWduYXR1cmUgaXMgbG9jYXRlZC5cclxuICBjb25zdCBhZGRTaWduYXR1cmVCb29rbWFyayA9IChpbmRleCkgPT4ge1xyXG4gICAgY29uc3QgaXNwYWdlTnVtYmVyID0gc2lnblBhZ2VOdW1iZXIuaW5jbHVkZXMoaW5kZXggKyAxKTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGlzcGFnZU51bWJlciAmJiAoXHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSB6LTIwIHRvcC1bMXB4XSAtcmlnaHQtWzEzcHhdIC10cmFuc2xhdGUteC0xLzIgLXRyYW5zbGF0ZS15LTEvMlwiPlxyXG4gICAgICAgICAgPGlcclxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6IGJvb2ttYXJrQ29sb3IgfHwgXCJyZWRcIiB9fVxyXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1zb2xpZCBmYS1ib29rbWFya1wiXHJcbiAgICAgICAgICA+PC9pPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH07XHJcbiAgY29uc3QgcGRmRGF0YUJhc2U2NCA9IGBkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsJHtwZGZSb3RhdGVCYXNlNjR9YDtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiByZWY9e3BhZ2VDb250YWluZXJ9IGNsYXNzTmFtZT1cImhpZGRlbiB3LVsyMCVdIGJnLWJhc2UtMTAwIG1kOmJsb2NrXCI+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtMiBwci0yIHB0LTIgcGItMSB0ZXh0LVsxNXB4XSB0ZXh0LWJhc2UtY29udGVudCBmb250LXNlbWlib2xkIGJvcmRlci1iLVsxcHhdIGJvcmRlci1iYXNlLTMwMFwiPlxyXG4gICAgICAgIHt0KFwicGFnZXNcIil9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3NOYW1lPXtgZmxleCBoLVs5MCVdIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBtLTIgIFxyXG4gICAgICAgICBhdXRvU2lnblNjcm9sbCBoaWRlLXNjcm9sbGJhciBtYXgtaC1bMTAwdmhdIGB9XHJcbiAgICAgID5cclxuICAgICAgICA8RG9jdW1lbnRcclxuICAgICAgICAgIGxvYWRpbmc9e3QoXCJsb2FkaW5nLWRvY1wiKX1cclxuICAgICAgICAgIG9uTG9hZFN1Y2Nlc3M9e29uRG9jdW1lbnRMb2FkfVxyXG4gICAgICAgICAgZmlsZT17KHBkZlJvdGF0ZUJhc2U2NCAmJiBwZGZEYXRhQmFzZTY0KSB8fCBzaWduUGRmVXJsfVxyXG4gICAgICAgID5cclxuICAgICAgICAgIHtBcnJheS5mcm9tKG5ldyBBcnJheShhbGxQYWdlcyksIChlbCwgaW5kZXgpID0+IChcclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGtleT17aW5kZXh9XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcclxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIgLSAxID09PSBpbmRleCA/IFwiYm9yZGVyLVtyZWRdXCIgOiBcImJvcmRlci1bIzg3ODc4N11cIlxyXG4gICAgICAgICAgICAgIH0gYm9yZGVyLTIgICBtLVsxMHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciByZWxhdGl2ZWB9XHJcbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2V0UGFnZU51bWJlcihpbmRleCArIDEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNldFNpZ25CdG5Qb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICBzZXRTaWduQnRuUG9zaXRpb24oW10pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7c2lnbmVyUG9zICYmIGFkZFNpZ25hdHVyZUJvb2ttYXJrKGluZGV4KX1cclxuXHJcbiAgICAgICAgICAgICAgey8qIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgei1bMV0gb3ZlcmZsb3ctaGlkZGVuXCI+ICovfVxyXG4gICAgICAgICAgICAgIDxQYWdlXHJcbiAgICAgICAgICAgICAgICBrZXk9e2BwYWdlXyR7aW5kZXggKyAxfWB9XHJcbiAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtpbmRleCArIDF9XHJcbiAgICAgICAgICAgICAgICB3aWR0aD17cGFnZVdpZHRoIC0gNjB9XHJcbiAgICAgICAgICAgICAgICBzY2FsZT17MX1cclxuICAgICAgICAgICAgICAgIHJlbmRlckFubm90YXRpb25MYXllcj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICByZW5kZXJUZXh0TGF5ZXI9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgey8qIDwvZGl2PiAqL31cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICApKX1cclxuICAgICAgICA8L0RvY3VtZW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlbmRlckFsbFBkZlBhZ2U7XHJcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IFJTQyBmcm9tIFwicmVhY3Qtc2Nyb2xsYmFycy1jdXN0b21cIjtcclxuaW1wb3J0IHsgRG9jdW1lbnQsIFBhZ2UgfSBmcm9tIFwicmVhY3QtcGRmXCI7XHJcbmltcG9ydCB7XHJcbiAgZGVmYXVsdFdpZHRoSGVpZ2h0LFxyXG4gIGdldENvbnRhaW5lclNjYWxlLFxyXG4gIGhhbmRsZUltYWdlUmVzaXplLFxyXG4gIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplXHJcbn0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L1V0aWxzXCI7XHJcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwiLi9QbGFjZWhvbGRlclwiO1xyXG5pbXBvcnQgQWxlcnQgZnJvbSBcIi4uLy4uL3ByaW1pdGl2ZXMvQWxlcnRcIjtcclxuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xyXG5cclxuZnVuY3Rpb24gUmVuZGVyUGRmKHtcclxuICBwYWdlTnVtYmVyLFxyXG4gIGRyb3AsXHJcbiAgc2lnbmVyUG9zLFxyXG4gIHN1Y2Nlc3NFbWFpbCxcclxuICBoYW5kbGVUYWJEcmFnLFxyXG4gIGhhbmRsZVN0b3AsXHJcbiAgaXNEcmFnZ2luZyxcclxuICBzZXRJc1NpZ25QYWQsXHJcbiAgc2V0SXNTdGFtcCxcclxuICBoYW5kbGVEZWxldGVTaWduLFxyXG4gIHNldFNpZ25LZXksXHJcbiAgcGRmRGV0YWlscyxcclxuICB4eVBvc3Rpb24sXHJcbiAgcGFnZURldGFpbHMsXHJcbiAgcGRmUmVxdWVzdCxcclxuICBzaWduZXJPYmplY3RJZCxcclxuICBzaWduZWRTaWduZXJzLFxyXG4gIHBkZkxvYWQsXHJcbiAgc2V0UGRmTG9hZCxcclxuICBwbGFjZWhvbGRlcixcclxuICBzZXRTaWduZXJQb3MsXHJcbiAgc2V0WHlQb3N0aW9uLFxyXG4gIGluZGV4LFxyXG4gIGNvbnRhaW5lcldILFxyXG4gIHNldElzUmVzaXplLFxyXG4gIGhhbmRsZUxpbmtVc2VyLFxyXG4gIHNldFVuaXF1ZUlkLFxyXG4gIHNpZ25lcnNkYXRhLFxyXG4gIHNldElzUGFnZUNvcHksXHJcbiAgc2V0U2hvd0Ryb3Bkb3duLFxyXG4gIHNldElzSW5pdGlhbCxcclxuICBzZXRJc1ZhbGlkYXRlLFxyXG4gIHNldFdpZGdldFR5cGUsXHJcbiAgc2V0VmFsaWRhdGVBbGVydCxcclxuICBzZXRJc1JhZGlvLFxyXG4gIHNldEN1cnJXaWRnZXRzRGV0YWlscyxcclxuICBzZXRTZWxlY3RXaWRnZXRJZCxcclxuICBzZWxlY3RXaWRnZXRJZCxcclxuICB1blNpZ25lZFdpZGdldElkLFxyXG4gIHNldElzQ2hlY2tib3gsXHJcbiAgaGFuZGxlTmFtZU1vZGFsLFxyXG4gIGhhbmRsZVRleHRTZXR0aW5nTW9kYWwsXHJcbiAgc2V0VGVtcFNpZ25lcklkLFxyXG4gIHVuaXF1ZUlkLFxyXG4gIHBkZk9yaWdpbmFsV0gsXHJcbiAgc2NhbGUsXHJcbiAgc2V0SXNTZWxlY3RJZCxcclxuICBpc3B1YmxpY1RlbXBsYXRlLFxyXG4gIGhhbmRsZVVzZXJEZXRhaWxzLFxyXG4gIHBkZlJvdGF0ZUJhc2U2NCxcclxuICBmb250U2l6ZSxcclxuICBzZXRGb250U2l6ZSxcclxuICBmb250Q29sb3IsXHJcbiAgc2V0Rm9udENvbG9yXHJcbn0pIHtcclxuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XHJcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDc2NztcclxuXHJcbiAgLy9jaGVjayBpc0d1ZXN0U2lnbmVyIGlzIHByZXNlbnQgaW4gbG9jYWwgaWYgeWVzIHRoYW4gaGFuZGxlIGxvZ2luIGZsb3cgaGVhZGVyIGluIG1vYmlsZSB2aWV3XHJcbiAgY29uc3QgaXNHdWVzdFNpZ25lciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNHdWVzdFNpZ25lclwiKTtcclxuXHJcbiAgLy8gaGFuZGxlIHNpZ25hdHVyZSBibG9jayB3aWR0aCBhbmQgaGVpZ2h0IGFjY29yZGluZyB0byBzY3JlZW5cclxuICBjb25zdCBwb3NXaWR0aCA9IChwb3MsIHNpZ25Zb3Vyc2VsZikgPT4ge1xyXG4gICAgY29uc3QgY29udGFpbmVyU2NhbGUgPSBnZXRDb250YWluZXJTY2FsZShcclxuICAgICAgcGRmT3JpZ2luYWxXSCxcclxuICAgICAgcGFnZU51bWJlcixcclxuICAgICAgY29udGFpbmVyV0hcclxuICAgICk7XHJcbiAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBkZWZhdWx0V2lkdGhIZWlnaHQocG9zLnR5cGUpLndpZHRoO1xyXG4gICAgY29uc3QgcG9zV2lkdGggPSBwb3MuV2lkdGggPyBwb3MuV2lkdGggOiBkZWZhdWx0V2lkdGg7XHJcbiAgICBpZiAoc2lnbllvdXJzZWxmKSB7XHJcbiAgICAgIHJldHVybiBwb3NXaWR0aCAqIHNjYWxlICogY29udGFpbmVyU2NhbGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAocG9zLmlzTW9iaWxlICYmIHBvcy5zY2FsZSkge1xyXG4gICAgICAgIGlmIChwb3MuSXNSZXNpemUpIHtcclxuICAgICAgICAgIGlmIChzY2FsZSA+IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBvc1dpZHRoICogcG9zLnNjYWxlICogY29udGFpbmVyU2NhbGUgKiBzY2FsZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwb3NXaWR0aCAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoc2NhbGUgPiAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwb3NXaWR0aCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlICogc2NhbGU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gcG9zV2lkdGggKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHBvc1dpZHRoICogc2NhbGUgKiBjb250YWluZXJTY2FsZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgY29uc3QgcG9zSGVpZ2h0ID0gKHBvcywgc2lnbllvdXJzZWxmKSA9PiB7XHJcbiAgICBjb25zdCBjb250YWluZXJTY2FsZSA9IGdldENvbnRhaW5lclNjYWxlKFxyXG4gICAgICBwZGZPcmlnaW5hbFdILFxyXG4gICAgICBwYWdlTnVtYmVyLFxyXG4gICAgICBjb250YWluZXJXSFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHBvc0hlaWdodCA9IHBvcy5IZWlnaHQgfHwgZGVmYXVsdFdpZHRoSGVpZ2h0KHBvcy50eXBlKS5oZWlnaHQ7XHJcbiAgICBpZiAoc2lnbllvdXJzZWxmKSB7XHJcbiAgICAgIHJldHVybiBwb3NIZWlnaHQgKiBzY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHBvcy5pc01vYmlsZSAmJiBwb3Muc2NhbGUpIHtcclxuICAgICAgICBpZiAocG9zLklzUmVzaXplKSB7XHJcbiAgICAgICAgICBpZiAoc2NhbGUgPiAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwb3NIZWlnaHQgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZSAqIHNjYWxlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoc2NhbGUgPiAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwb3NIZWlnaHQgKiBwb3Muc2NhbGUgKiBjb250YWluZXJTY2FsZSAqIHNjYWxlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBvc0hlaWdodCAqIHBvcy5zY2FsZSAqIGNvbnRhaW5lclNjYWxlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gcG9zSGVpZ2h0ICogc2NhbGUgKiBjb250YWluZXJTY2FsZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vZnVuY3Rpb24gZm9yIHJlbmRlciBwbGFjZWhvbGRlciBibG9jayBvdmVyIHBkZiBkb2N1bWVudFxyXG4gIGNvbnN0IGNoZWNrU2lnbmVkU2lnbmVycyA9IChkYXRhKSA9PiB7XHJcbiAgICBsZXQgY2hlY2tTaWduID0gW107XHJcbiAgICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgcXVpY2sgc2VuZCBmbG93IGFuZCB1c2luZyBub3JtYWwgcmVxdWVzdCBzaWduIGZsb3dcclxuICAgIGNoZWNrU2lnbiA9IHNpZ25lZFNpZ25lcnNcclxuICAgICAgPyBzaWduZWRTaWduZXJzPy5maWx0ZXIoXHJcbiAgICAgICAgICAoc2lnbikgPT5cclxuICAgICAgICAgICAgc2lnbj8uSWQgPT09IGRhdGE/LklkIHx8IHNpZ24/Lm9iamVjdElkID09PSBkYXRhPy5zaWduZXJPYmpJZFxyXG4gICAgICAgIClcclxuICAgICAgOiBbXTtcclxuICAgIGNvbnN0IGhhbmRsZUFsbFVzZXJOYW1lID0gKElkLCBSb2xlLCB0eXBlKSA9PiB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWJsYWNrIHRleHQtWzhweF0gZm9udC1ib2xkXCI+XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBwZGZEZXRhaWxzWzBdLlNpZ25lcnM/LmZpbmQoXHJcbiAgICAgICAgICAgICAgICAoc2lnbmVyKSA9PiBzaWduZXIub2JqZWN0SWQgPT09IGRhdGEuc2lnbmVyT2JqSWRcclxuICAgICAgICAgICAgICApPy5OYW1lXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAge3R5cGUgJiYgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XSBmb250LWJvbGRcIj57dHlwZX08L2Rpdj59XHJcbiAgICAgICAgICB7Um9sZSAmJiAoXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ibGFjayB0ZXh0LVs4cHhdIGZvbnQtbWVkaXVtXCI+XHJcbiAgICAgICAgICAgICAge2AoJHtSb2xlfSlgfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICl9XHJcbiAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBjaGVja1NpZ24ubGVuZ3RoID09PSAwICYmXHJcbiAgICAgIGRhdGEucGxhY2VIb2xkZXIubWFwKChwbGFjZURhdGEsIGtleSkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtrZXl9PlxyXG4gICAgICAgICAgICB7cGxhY2VEYXRhLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIgJiZcclxuICAgICAgICAgICAgICBwbGFjZURhdGEucG9zLm1hcCgocG9zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICBwb3MgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e3Bvcy5rZXl9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFBsYWNlaG9sZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcz17cG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduS2V5PXtzZXRTaWduS2V5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcD17c2V0SXNTdGFtcH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemU9e2hhbmRsZUltYWdlUmVzaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgeHlQb3N0aW9uPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFh5UG9zdGlvbj17c2V0U2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXtkYXRhfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1Jlc2l6ZT17c2V0SXNSZXNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0JvcmRlcj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lck9iaklkPXtzaWduZXJPYmplY3RJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93RHJvcGRvd249e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTmVlZFNpZ249e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zV2lkdGg9e3Bvc1dpZHRofVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NIZWlnaHQ9e3Bvc0hlaWdodH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e2hhbmRsZUFsbFVzZXJOYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0RyYWdnaW5nPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlQWxlcnQ9e3NldFZhbGlkYXRlQWxlcnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuU2lnbmVkV2lkZ2V0SWQ9e3VuU2lnbmVkV2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e3NldEN1cnJXaWRnZXRzRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQ9e3VuaXF1ZUlkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSD17cGRmT3JpZ2luYWxXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNwdWJsaWNUZW1wbGF0ZT17aXNwdWJsaWNUZW1wbGF0ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlckRldGFpbHM9e2hhbmRsZVVzZXJEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIHJlbmRlciBwbGFjZWhvbGRlciBibG9jayBvdmVyIHBkZiBkb2N1bWVudFxyXG5cclxuICBjb25zdCBoYW5kbGVVc2VyTmFtZSA9IChJZCwgUm9sZSwgdHlwZSkgPT4ge1xyXG4gICAgaWYgKElkKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrU2lnbiA9IHNpZ25lcnNkYXRhLmZpbmQoKHNpZ24pID0+IHNpZ24uSWQgPT09IElkKTtcclxuICAgICAgaWYgKGNoZWNrU2lnbj8uTmFtZSkge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICA8PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtYmxhY2sgdGV4dC1bOHB4XSBmb250LW1lZGl1bVwiPlxyXG4gICAgICAgICAgICAgIHtjaGVja1NpZ24/Lk5hbWV9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB7dHlwZSAmJiA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIGZvbnQtYm9sZFwiPnt0eXBlfTwvZGl2Pn1cclxuICAgICAgICAgICAge1JvbGUgJiYgKFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ibGFjayB0ZXh0LVs4cHhdIGZvbnQtbWVkaXVtXCI+XHJcbiAgICAgICAgICAgICAgICB7YCgke1JvbGV9KWB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICl9XHJcbiAgICAgICAgICA8Lz5cclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICA8PlxyXG4gICAgICAgICAgICB7dHlwZSAmJiA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzExcHhdIGZvbnQtYm9sZFwiPnt0eXBlfTwvZGl2Pn1cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWJsYWNrIHRleHQtWzhweF0gZm9udC1tZWRpdW1cIj57Um9sZX08L2Rpdj5cclxuICAgICAgICAgIDwvPlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgPD5cclxuICAgICAgICAgIHt0eXBlICYmIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gZm9udC1ib2xkXCI+e3R5cGV9PC9kaXY+fVxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWJsYWNrIHRleHQtWzhweF0gZm9udC1tZWRpdW1cIj57Um9sZX08L2Rpdj5cclxuICAgICAgICA8Lz5cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9O1xyXG4gIGNvbnN0IHBkZkRhdGFCYXNlNjQgPSBgZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LCR7cGRmUm90YXRlQmFzZTY0fWA7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICB7c3VjY2Vzc0VtYWlsICYmIChcclxuICAgICAgICA8QWxlcnQgdHlwZT17XCJzdWNjZXNzXCJ9Pnt0KFwic3VjY2Vzcy1lbWFpbC1hbGVydFwiKX08L0FsZXJ0PlxyXG4gICAgICApfVxyXG4gICAgICB7aXNNb2JpbGUgPyAoXHJcbiAgICAgICAgPFJTQ1xyXG4gICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcclxuICAgICAgICAgICAgYm94U2hhZG93OiBcInJnYmEoMTcsIDEyLCA0NiwgMC4xNSkgMHB4IDQ4cHggMTAwcHggMHB4XCIsXHJcbiAgICAgICAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0IC0gMjAwLFxyXG4gICAgICAgICAgICB6SW5kZXg6IDBcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICBjbGFzc05hbWU9XCJoLWZ1bGxcIlxyXG4gICAgICAgICAgbm9TY3JvbGxZPXtmYWxzZX1cclxuICAgICAgICAgIG5vU2Nyb2xsWD17c2NhbGUgPT09IDEgPyB0cnVlIDogZmFsc2V9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBkYXRhLXR1dD1cInJlYWN0b3VyRm9ydGhcIlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgICAgIGlzR3Vlc3RTaWduZXIgPyBcIjMwcHhcIiA6IFwiXCJcclxuICAgICAgICAgICAgfSBib3JkZXItWzAuMXB4XSBib3JkZXItWyNlYmU4ZThdIG92ZXJmbG93LXgtYXV0b2B9XHJcbiAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgd2lkdGg6IGNvbnRhaW5lcldIPy53aWR0aCAmJiBjb250YWluZXJXSD8ud2lkdGggKiBzY2FsZVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICByZWY9e2Ryb3B9XHJcbiAgICAgICAgICAgIGlkPVwiY29udGFpbmVyXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge2NvbnRhaW5lcldIPy53aWR0aCAmJlxyXG4gICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0gubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgIChwZGZSZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHNpZ25lclBvcy5tYXAoKGRhdGEsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtrZXl9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2hlY2tTaWduZWRTaWduZXJzKGRhdGEpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgOiBwbGFjZWhvbGRlciAvLyBwbGFjZWhvbGRlciBtb2JpbGVcclxuICAgICAgICAgICAgICAgICAgPyBzaWduZXJQb3M/Lm1hcCgoZGF0YSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhPy5wbGFjZUhvbGRlciAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT8ucGxhY2VIb2xkZXIubWFwKChwbGFjZURhdGEsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17aW5kZXh9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BsYWNlRGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlRGF0YS5wb3MubWFwKChwb3MpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17cG9zLmtleX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQbGFjZWhvbGRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcz17cG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUGFnZUNvcHk9e3NldElzUGFnZUNvcHl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbktleT17c2V0U2lnbktleX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWxldGVTaWduPXtoYW5kbGVEZWxldGVTaWdufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGFiRHJhZz17aGFuZGxlVGFiRHJhZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdG9wPXtoYW5kbGVTdG9wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUltYWdlUmVzaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17c2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFh5UG9zdGlvbj17c2V0U2lnbmVyUG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9e2RhdGF9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNSZXNpemU9e3NldElzUmVzaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNob3dEcm9wZG93bj17c2V0U2hvd0Ryb3Bkb3dufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hvd0JvcmRlcj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BsYWNlaG9sZGVyPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVuaXF1ZUlkPXtzZXRVbmlxdWVJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVMaW5rVXNlcj17aGFuZGxlTGlua1VzZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXNlck5hbWU9e2hhbmRsZVVzZXJOYW1lfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2lnbllvdXJzZWxmPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NXaWR0aD17cG9zV2lkdGh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zSGVpZ2h0PXtwb3NIZWlnaHR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEcmFnZ2luZz17aXNEcmFnZ2luZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1ZhbGlkYXRlPXtzZXRJc1ZhbGlkYXRlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZGdldFR5cGU9e3NldFdpZGdldFR5cGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNSYWRpbz17c2V0SXNSYWRpb31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0NoZWNrYm94PXtzZXRJc0NoZWNrYm94fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQ9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5hbWVNb2RhbD17aGFuZGxlTmFtZU1vZGFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRlbXBTaWduZXJJZD17c2V0VGVtcFNpZ25lcklkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkPXt1bmlxdWVJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXh0U2V0dGluZ01vZGFsPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU9e3NjYWxlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTZWxlY3RJZD17c2V0SXNTZWxlY3RJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9udFNpemU9e3NldEZvbnRTaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRDb2xvcj17Zm9udENvbG9yfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvbnRDb2xvcj17c2V0Rm9udENvbG9yfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgIDogIXBkZkRldGFpbHM/LlswXT8uSXNDb21wbGV0ZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICB4eVBvc3Rpb24ubWFwKChkYXRhLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2luZH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge2RhdGEucGFnZU51bWJlciA9PT0gcGFnZU51bWJlciAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wb3MubWFwKChwb3MpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFBsYWNlaG9sZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcz17cG9zfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1BhZ2VDb3B5PXtzZXRJc1BhZ2VDb3B5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduS2V5PXtzZXRTaWduS2V5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWxldGVTaWduPXtoYW5kbGVEZWxldGVTaWdufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0YW1wPXtzZXRJc1N0YW1wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUYWJEcmFnPXtoYW5kbGVUYWJEcmFnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdG9wPXtoYW5kbGVTdG9wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj17eHlQb3N0aW9ufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRYeVBvc3Rpb249e3NldFh5UG9zdGlvbn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93Qm9yZGVyPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25Zb3Vyc2VsZj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zV2lkdGg9e3Bvc1dpZHRofVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NIZWlnaHQ9e3Bvc0hlaWdodH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc1swXX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEcmFnZ2luZz17aXNEcmFnZ2luZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZGdldFR5cGU9e3NldFdpZGdldFR5cGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17aGFuZGxlVXNlck5hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzQ2hlY2tib3g9e3NldElzQ2hlY2tib3h9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlQWxlcnQ9e3NldFZhbGlkYXRlQWxlcnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbD17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSD17cGRmT3JpZ2luYWxXSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU9e2ZvbnRTaXplfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb250U2l6ZT17c2V0Rm9udFNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRDb2xvcj17Zm9udENvbG9yfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb250Q29sb3I9e3NldEZvbnRDb2xvcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKX1cclxuXHJcbiAgICAgICAgICAgIDxEb2N1bWVudFxyXG4gICAgICAgICAgICAgIG9uTG9hZEVycm9yPXsoKSA9PiBzZXRQZGZMb2FkKGZhbHNlKX1cclxuICAgICAgICAgICAgICBsb2FkaW5nPXt0KFwibG9hZGluZy1kb2NcIil9XHJcbiAgICAgICAgICAgICAgb25Mb2FkU3VjY2Vzcz17cGFnZURldGFpbHN9XHJcbiAgICAgICAgICAgICAgLy8gcmVmPXtwZGZSZWZ9J1xyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzZXRTZWxlY3RXaWRnZXRJZCkge1xyXG4gICAgICAgICAgICAgICAgICBzZXRTZWxlY3RXaWRnZXRJZChcIlwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIGZpbGU9e1xyXG4gICAgICAgICAgICAgICAgKHBkZlJvdGF0ZUJhc2U2NCAmJiBwZGZEYXRhQmFzZTY0KSB8fFxyXG4gICAgICAgICAgICAgICAgcGRmRGV0YWlsc1swXT8uU2lnbmVkVXJsIHx8XHJcbiAgICAgICAgICAgICAgICBwZGZEZXRhaWxzWzBdLlVSTFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxQYWdlXHJcbiAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGUgfHwgMX1cclxuICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XHJcbiAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgd2lkdGg9e2NvbnRhaW5lcldILndpZHRofVxyXG4gICAgICAgICAgICAgICAgcmVuZGVyQW5ub3RhdGlvbkxheWVyPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgIHJlbmRlclRleHRMYXllcj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICBvbkdldEFubm90YXRpb25zRXJyb3I9eyhlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImFubm90YXRpb24gZXJyb3JcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L0RvY3VtZW50PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9SU0M+XHJcbiAgICAgICkgOiAoXHJcbiAgICAgICAgPFJTQ1xyXG4gICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcclxuICAgICAgICAgICAgYm94U2hhZG93OiBcInJnYmEoMTcsIDEyLCA0NiwgMC4xNSkgMHB4IDQ4cHggMTAwcHggMHB4XCIsXHJcbiAgICAgICAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0ICsgXCJweFwiLFxyXG4gICAgICAgICAgICB6SW5kZXg6IDBcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgICBub1Njcm9sbFk9e2ZhbHNlfVxyXG4gICAgICAgICAgbm9TY3JvbGxYPXtzY2FsZSA9PT0gMSA/IHRydWUgOiBmYWxzZX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgd2lkdGg6IGNvbnRhaW5lcldIPy53aWR0aCAmJiBjb250YWluZXJXSD8ud2lkdGggKiBzY2FsZVxyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICByZWY9e2Ryb3B9XHJcbiAgICAgICAgICAgIGlkPVwiY29udGFpbmVyXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3BkZkxvYWQgJiZcclxuICAgICAgICAgICAgICBjb250YWluZXJXSD8ud2lkdGggJiZcclxuICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdILmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAocGRmUmVxdWVzdCAvL3BkZiByZXF1ZXN0IHNpZ24gZmxvd1xyXG4gICAgICAgICAgICAgICAgPyBzaWduZXJQb3M/Lm1hcCgoZGF0YSwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2tleX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjaGVja1NpZ25lZFNpZ25lcnMoZGF0YSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICA6IHBsYWNlaG9sZGVyIC8vcGxhY2Vob2xkZXIgYW5kIHRlbXBsYXRlIGZsb3dcclxuICAgICAgICAgICAgICAgICAgPyBzaWduZXJQb3MubWFwKChkYXRhLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2luZH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge2RhdGE/LnBsYWNlSG9sZGVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPy5wbGFjZUhvbGRlci5tYXAoKHBsYWNlRGF0YSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmRleH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGxhY2VEYXRhLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VEYXRhLnBvcy5tYXAoKHBvcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtwb3Mua2V5fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFBsYWNlaG9sZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zPXtwb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNQYWdlQ29weT17c2V0SXNQYWdlQ29weX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduS2V5PXtzZXRTaWduS2V5fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURlbGV0ZVNpZ249e2hhbmRsZURlbGV0ZVNpZ259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdGFtcD17c2V0SXNTdGFtcH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUYWJEcmFnPXtoYW5kbGVUYWJEcmFnfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVN0b3A9e2hhbmRsZVN0b3B9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemU9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlSW1hZ2VSZXNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHlQb3N0aW9uPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0WHlQb3N0aW9uPXtzZXRTaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT17ZGF0YX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1Jlc2l6ZT17c2V0SXNSZXNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hvd0Ryb3Bkb3duPXtzZXRTaG93RHJvcGRvd259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93Qm9yZGVyPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGxhY2Vob2xkZXI9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VW5pcXVlSWQ9e3NldFVuaXF1ZUlkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUxpbmtVc2VyPXtoYW5kbGVMaW5rVXNlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17aGFuZGxlVXNlck5hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaWduWW91cnNlbGY9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc1dpZHRoPXtwb3NXaWR0aH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NIZWlnaHQ9e3Bvc0hlaWdodH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RyYWdnaW5nPXtpc0RyYWdnaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVmFsaWRhdGU9e3NldElzVmFsaWRhdGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2lkZ2V0VHlwZT17c2V0V2lkZ2V0VHlwZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1JhZGlvPXtzZXRJc1JhZGlvfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzQ2hlY2tib3g9e3NldElzQ2hlY2tib3h9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RXaWRnZXRJZD17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RXaWRnZXRJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RXaWRnZXRJZD17c2VsZWN0V2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTmFtZU1vZGFsPXtoYW5kbGVOYW1lTW9kYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVtcFNpZ25lcklkPXtzZXRUZW1wU2lnbmVySWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQ9e3VuaXF1ZUlkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRleHRTZXR0aW5nTW9kYWw9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT17c2NhbGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZk9yaWdpbmFsV0g9e3BkZk9yaWdpbmFsV0h9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NlbGVjdElkPXtzZXRJc1NlbGVjdElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRGb250U2l6ZT17c2V0Rm9udFNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udENvbG9yPXtmb250Q29sb3J9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9udENvbG9yPXtzZXRGb250Q29sb3J9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgOiAhcGRmRGV0YWlscz8uWzBdPy5Jc0NvbXBsZXRlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHh5UG9zdGlvbj8ubWFwKChkYXRhLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ255b3Vyc2VsZiBmbG93XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtpbmR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucG9zLm1hcCgocG9zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17cG9zLmtleX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UGxhY2Vob2xkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zPXtwb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUGFnZUNvcHk9e3NldElzUGFnZUNvcHl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZURlbGV0ZVNpZ249e2hhbmRsZURlbGV0ZVNpZ259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzU3RhbXA9e3NldElzU3RhbXB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRhYkRyYWc9e2hhbmRsZVRhYkRyYWd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVN0b3A9eyhldmVudCwgZHJhZ0VsZW1lbnQpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RvcChldmVudCwgZHJhZ0VsZW1lbnQsIHBvcy50eXBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25Zb3Vyc2VsZkltYWdlUmVzaXplPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHlQb3N0aW9uPXt4eVBvc3Rpb259XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFh5UG9zdGlvbj17c2V0WHlQb3N0aW9ufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93Qm9yZGVyPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25Zb3Vyc2VsZj17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zV2lkdGg9e3Bvc1dpZHRofVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NIZWlnaHQ9e3Bvc0hlaWdodH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc1swXX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEcmFnZ2luZz17aXNEcmFnZ2luZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFdpZGdldFR5cGU9e3NldFdpZGdldFR5cGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdFdpZGdldElkPXtzZXRTZWxlY3RXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyTmFtZT17aGFuZGxlVXNlck5hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzQ2hlY2tib3g9e3NldElzQ2hlY2tib3h9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlQWxlcnQ9e3NldFZhbGlkYXRlQWxlcnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbD17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dFNldHRpbmdNb2RhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyPXtwYWdlTnVtYmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvbnRTaXplPXtzZXRGb250U2l6ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udENvbG9yPXtmb250Q29sb3J9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEZvbnRDb2xvcj17c2V0Rm9udENvbG9yfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKX1cclxuXHJcbiAgICAgICAgICAgIHsvKiB0aGlzIGNvbXBvbmVudCBmb3IgcmVuZGVyIHBkZiBkb2N1bWVudCBpcyBpbiBtaWRkbGUgb2YgdGhlIGNvbXBvbmVudCAqL31cclxuICAgICAgICAgICAgPERvY3VtZW50XHJcbiAgICAgICAgICAgICAgb25Mb2FkRXJyb3I9eygpID0+IHNldFBkZkxvYWQoZmFsc2UpfVxyXG4gICAgICAgICAgICAgIGxvYWRpbmc9e3QoXCJsb2FkaW5nLWRvY1wiKX1cclxuICAgICAgICAgICAgICBvbkxvYWRTdWNjZXNzPXtwYWdlRGV0YWlsc31cclxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2V0U2VsZWN0V2lkZ2V0SWQpIHtcclxuICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0V2lkZ2V0SWQoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAvLyByZWY9e3BkZlJlZn1cclxuICAgICAgICAgICAgICBmaWxlPXtcclxuICAgICAgICAgICAgICAgIChwZGZSb3RhdGVCYXNlNjQgJiYgcGRmRGF0YUJhc2U2NCkgfHxcclxuICAgICAgICAgICAgICAgIHBkZkRldGFpbHNbMF0/LlNpZ25lZFVybCB8fFxyXG4gICAgICAgICAgICAgICAgcGRmRGV0YWlsc1swXS5VUkxcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8UGFnZVxyXG4gICAgICAgICAgICAgICAga2V5PXtpbmRleH1cclxuICAgICAgICAgICAgICAgIHdpZHRoPXtjb250YWluZXJXSC53aWR0aH1cclxuICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZSB8fCAxfVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcIi16LVsxXVwifSAvLyB3aGVuIHVzZXIgem9vbS1pbiBpbiB0YWJsZXQgd2lkZ2V0cyBtb3ZlIGJhY2t3YXJkIHRoYXQncyB3aHkgcGFzcyAtei1bMV1cclxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICByZW5kZXJBbm5vdGF0aW9uTGF5ZXI9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgcmVuZGVyVGV4dExheWVyPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgIG9uR2V0QW5ub3RhdGlvbnNFcnJvcj17KGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYW5ub3RhdGlvbiBlcnJvclwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvRG9jdW1lbnQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L1JTQz5cclxuICAgICAgKX1cclxuICAgIDwvPlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJlbmRlclBkZjtcclxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZVJlZiwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XHJcbmltcG9ydCBTaWduYXR1cmVDYW52YXMgZnJvbSBcInJlYWN0LXNpZ25hdHVyZS1jYW52YXNcIjtcclxuZnVuY3Rpb24gU2lnblBhZCh7XHJcbiAgaXNTaWduUGFkLFxyXG4gIGlzU3RhbXAsXHJcbiAgc2V0SXNJbWFnZVNlbGVjdCxcclxuICBvblNhdmVTaWduLFxyXG4gIHNldElzU2lnblBhZCxcclxuICBzZXRJbWFnZSxcclxuICBpc0ltYWdlU2VsZWN0LFxyXG4gIGltYWdlUmVmLFxyXG4gIG9uSW1hZ2VDaGFuZ2UsXHJcbiAgb25TYXZlSW1hZ2UsXHJcbiAgaW1hZ2UsXHJcbiAgZGVmYXVsdFNpZ24sXHJcbiAgc2V0U2lnbmF0dXJlLFxyXG4gIG15SW5pdGlhbCxcclxuICBpc0luaXRpYWwsXHJcbiAgc2V0SXNJbml0aWFsLFxyXG4gIHNldElzU3RhbXAsXHJcbiAgd2lkZ2V0VHlwZSxcclxuICBjdXJyV2lkZ2V0c0RldGFpbHMsXHJcbiAgc2V0Q3VycldpZGdldHNEZXRhaWxzXHJcbn0pIHtcclxuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XHJcbiAgY29uc3QgW3BlbkNvbG9yLCBzZXRQZW5Db2xvcl0gPSB1c2VTdGF0ZShcImJsdWVcIik7XHJcbiAgY29uc3QgYWxsQ29sb3IgPSBbXCJibHVlXCIsIFwicmVkXCIsIFwiYmxhY2tcIl07XHJcbiAgY29uc3QgY2FudmFzUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gIGNvbnN0IFtpc0RlZmF1bHRTaWduLCBzZXRJc0RlZmF1bHRTaWduXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNUYWIsIHNldElzVGFiXSA9IHVzZVN0YXRlKFwiZHJhd1wiKTtcclxuICBjb25zdCBbaXNTaWduSW1nLCBzZXRJc1NpZ25JbWddID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW3NpZ25WYWx1ZSwgc2V0U2lnblZhbHVlXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFt0ZXh0V2lkdGgsIHNldFRleHRXaWR0aF0gPSB1c2VTdGF0ZSgwKTtcclxuICBjb25zdCBbdGV4dEhlaWdodCwgc2V0VGV4dEhlaWdodF0gPSB1c2VTdGF0ZSgwKTtcclxuICBjb25zdCBbc2lnbmF0dXJlVHlwZSwgc2V0U2lnbmF0dXJlVHlwZV0gPSB1c2VTdGF0ZShcImRyYXdcIik7XHJcbiAgY29uc3QgZm9udE9wdGlvbnMgPSBbXHJcbiAgICB7IHZhbHVlOiBcIkZhc3RoYW5kXCIgfSxcclxuICAgIHsgdmFsdWU6IFwiRGFuY2luZyBTY3JpcHRcIiB9LFxyXG4gICAgeyB2YWx1ZTogXCJDZWRhcnZpbGxlIEN1cnNpdmVcIiB9LFxyXG4gICAgeyB2YWx1ZTogXCJEZWxpY2lvdXMgSGFuZHJhd25cIiB9XHJcbiAgICAvLyBBZGQgbW9yZSBmb250IG9wdGlvbnMgYXMgbmVlZGVkXHJcbiAgXTtcclxuICBjb25zdCBbZm9udFNlbGVjdCwgc2V0Rm9udFNlbGVjdF0gPSB1c2VTdGF0ZShmb250T3B0aW9uc1swXS52YWx1ZSk7XHJcblxyXG4gIGNvbnN0IHNlbmRlclVzZXIgPVxyXG4gICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgIGBQYXJzZS8ke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKX0vY3VycmVudFVzZXJgXHJcbiAgICApICYmXHJcbiAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgYFBhcnNlLyR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpfS9jdXJyZW50VXNlcmBcclxuICAgICk7XHJcbiAgY29uc3QganNvblNlbmRlciA9IEpTT04ucGFyc2Uoc2VuZGVyVXNlcik7XHJcbiAgY29uc3QgY3VycmVudFVzZXJOYW1lID0ganNvblNlbmRlciAmJiBqc29uU2VuZGVyPy5uYW1lO1xyXG5cclxuICAvL2Z1bmN0aW9uIGZvciBjbGVhciBzaWduYXR1cmUgaW1hZ2VcclxuICBjb25zdCBoYW5kbGVDbGVhciA9ICgpID0+IHtcclxuICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscyh7fSk7XHJcbiAgICBpZiAoaXNUYWIgPT09IFwiZHJhd1wiKSB7XHJcbiAgICAgIGlmIChjYW52YXNSZWYuY3VycmVudCkge1xyXG4gICAgICAgIGNhbnZhc1JlZi5jdXJyZW50LmNsZWFyKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoaXNTdGFtcCkge1xyXG4gICAgICAgIHNldEltYWdlKFwiXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHNldElzU2lnbkltZyhcIlwiKTtcclxuICAgIH0gZWxzZSBpZiAoaXNUYWIgPT09IFwidXBsb2FkSW1hZ2VcIikge1xyXG4gICAgICBzZXRJbWFnZShcIlwiKTtcclxuICAgIH1cclxuICAgIC8vIHNldElzSW5pdGlhbChmYWxzZSk7XHJcbiAgfTtcclxuICAvL2Z1bmN0aW9uIGZvciBzZXQgc2lnbmF0dXJlIHVybFxyXG4gIGNvbnN0IGhhbmRsZVNpZ25hdHVyZUNoYW5nZSA9IChkYXRhKSA9PiB7XHJcbiAgICBzZXRTaWduYXR1cmUoZGF0YSk7XHJcbiAgICBzZXRJc1NpZ25JbWcoZGF0YSk7XHJcbiAgfTtcclxuICAvL3NhdmUgYnV0dG9uIGNvbXBvbmVudFxyXG4gIGNvbnN0IFNhdmVCdG4gPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIHsoaXNUYWIgPT09IFwiZHJhd1wiIHx8IGlzVGFiID09PSBcInVwbG9hZEltYWdlXCIpICYmIChcclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tZ2hvc3QgbXItMSBtdC1bMnB4XVwiXHJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUNsZWFyKCl9XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt0KFwiY2xlYXJcIil9XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICApfVxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgc2V0Q3VycldpZGdldHNEZXRhaWxzKHt9KTtcclxuICAgICAgICAgICAgaWYgKCFpbWFnZSkge1xyXG4gICAgICAgICAgICAgIGlmIChpc1RhYiA9PT0gXCJteXNpZ25hdHVyZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRJc1NpZ25JbWcoXCJcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNJbml0aWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgIG9uU2F2ZVNpZ24oc2lnbmF0dXJlVHlwZSwgXCJpbml0aWFsc1wiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIG9uU2F2ZVNpZ24obnVsbCwgXCJkZWZhdWx0XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNUYWIgPT09IFwidHlwZVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNldElzU2lnbkltZyhcIlwiKTtcclxuICAgICAgICAgICAgICAgICAgb25TYXZlU2lnbihcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICFpc0luaXRpYWwgJiYgdGV4dFdpZHRoID4gMTUwID8gMTUwIDogdGV4dFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICFpc0luaXRpYWwgJiYgdGV4dEhlaWdodCA+IDM1ID8gMzUgOiB0ZXh0SGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBzZXRJc1NpZ25JbWcoXCJcIik7XHJcbiAgICAgICAgICAgICAgICAgIGNhbnZhc1JlZi5jdXJyZW50LmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgIG9uU2F2ZVNpZ24oc2lnbmF0dXJlVHlwZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBzZXRQZW5Db2xvcihcImJsdWVcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgc2V0SXNTaWduSW1nKFwiXCIpO1xyXG4gICAgICAgICAgICAgIG9uU2F2ZUltYWdlKHNpZ25hdHVyZVR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNldElzU2lnblBhZChmYWxzZSk7XHJcbiAgICAgICAgICAgIHNldElzSW5pdGlhbChmYWxzZSk7XHJcbiAgICAgICAgICAgIHNldElzSW1hZ2VTZWxlY3QoZmFsc2UpO1xyXG4gICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKGZhbHNlKTtcclxuICAgICAgICAgICAgc2V0SW1hZ2UoKTtcclxuICAgICAgICAgICAgc2V0SXNUYWIoXCJkcmF3XCIpO1xyXG4gICAgICAgICAgICBzZXRTaWduVmFsdWUoXCJcIik7XHJcbiAgICAgICAgICAgIHNldElzU3RhbXAoZmFsc2UpO1xyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgY2xhc3NOYW1lPXtgJHtcclxuICAgICAgICAgICAgaXNTaWduSW1nIHx8IGltYWdlIHx8IGlzRGVmYXVsdFNpZ24gfHwgdGV4dFdpZHRoXHJcbiAgICAgICAgICAgICAgPyBcIlwiXHJcbiAgICAgICAgICAgICAgOiBcInBvaW50ZXItZXZlbnRzLW5vbmVcIlxyXG4gICAgICAgICAgfSBvcC1idG4gb3AtYnRuLXByaW1hcnkgc2hhZG93LWxnYH1cclxuICAgICAgICAgIGRpc2FibGVkPXtcclxuICAgICAgICAgICAgKGlzVGFiID09PSBcImRyYXdcIiAmJiBpc1NpZ25JbWcpIHx8XHJcbiAgICAgICAgICAgIChpc1RhYiA9PT0gXCJpbWFnZVwiICYmIGltYWdlKSB8fFxyXG4gICAgICAgICAgICAoaXNUYWIgPT09IFwibXlzaWduYXR1cmVcIiAmJiBpc0RlZmF1bHRTaWduKSB8fFxyXG4gICAgICAgICAgICAoaXNUYWIgPT09IFwidHlwZVwiICYmIHNpZ25WYWx1ZSlcclxuICAgICAgICAgICAgICA/IGZhbHNlXHJcbiAgICAgICAgICAgICAgOiBpbWFnZVxyXG4gICAgICAgICAgICAgICAgPyBmYWxzZVxyXG4gICAgICAgICAgICAgICAgOiB0cnVlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3QoXCJzYXZlXCIpfVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICk7XHJcbiAgfTtcclxuICAvL3VzZUVmZmVjdCBmb3Igc2V0IGFscmVhZHkgZHJhdyBvciBzYXZlIHNpZ25hdHVyZSB1cmwvdGV4dCB1cmwgb2Ygc2lnbmF0dXJlIHRleHQgdHlwZSBhbmQgZHJhdyB0eXBlIGZvciBpbml0aWFsIHR5cGUgYW5kIHNpZ25hdHVyZSB0eXBlIHdpZGdldHNcclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKGN1cnJXaWRnZXRzRGV0YWlscyAmJiBjYW52YXNSZWYuY3VycmVudCkge1xyXG4gICAgICBjb25zdCBpc1dpZGdldFR5cGUgPSBjdXJyV2lkZ2V0c0RldGFpbHM/LnR5cGU7XHJcbiAgICAgIGNvbnN0IHNpZ25hdHVyZVR5cGUgPSBjdXJyV2lkZ2V0c0RldGFpbHM/LnNpZ25hdHVyZVR5cGU7XHJcbiAgICAgIGNvbnN0IHVybCA9IGN1cnJXaWRnZXRzRGV0YWlscz8uU2lnblVybDtcclxuICAgICAgLy9jaGVja2luZyB3aWRnZXQgdHlwZSBhbmQgZHJhdyB0eXBlIHNpZ25hdHVyZSB1cmxcclxuICAgICAgaWYgKGlzSW5pdGlhbCkge1xyXG4gICAgICAgIGlmIChpc1dpZGdldFR5cGUgPT09IFwiaW5pdGlhbHNcIiAmJiBzaWduYXR1cmVUeXBlID09PSBcImRyYXdcIiAmJiB1cmwpIHtcclxuICAgICAgICAgIGNhbnZhc1JlZi5jdXJyZW50LmZyb21EYXRhVVJMKHVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIGlzV2lkZ2V0VHlwZSA9PT0gXCJzaWduYXR1cmVcIiAmJlxyXG4gICAgICAgIHNpZ25hdHVyZVR5cGUgPT09IFwiZHJhd1wiICYmXHJcbiAgICAgICAgdXJsXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNhbnZhc1JlZi5jdXJyZW50LmZyb21EYXRhVVJMKHVybCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmltbWVkTmFtZSA9IGN1cnJlbnRVc2VyTmFtZSAmJiBjdXJyZW50VXNlck5hbWU/LnRyaW0oKTtcclxuICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gdHJpbW1lZE5hbWU/LmNoYXJBdCgwKTtcclxuICAgIGNvbnN0IHVzZXJOYW1lID0gaXNJbml0aWFsID8gZmlyc3RDaGFyYWN0ZXIgOiBjdXJyZW50VXNlck5hbWU7XHJcbiAgICBzZXRTaWduVmFsdWUodXNlck5hbWUgfHwgXCJcIik7XHJcbiAgICBzZXRGb250U2VsZWN0KFwiRmFzdGhhbmRcIik7XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtpc1NpZ25QYWRdKTtcclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgbG9hZEZvbnQgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgZG9jdW1lbnQuZm9udHMubG9hZChgMjBweCAke2ZvbnRTZWxlY3R9YCk7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0Rm9udFNUeWxlID0gZm9udE9wdGlvbnMuZmluZChcclxuICAgICAgICAgIChmb250KSA9PiBmb250LnZhbHVlID09PSBmb250U2VsZWN0XHJcbiAgICAgICAgKTtcclxuICAgICAgICBzZXRGb250U2VsZWN0KHNlbGVjdEZvbnRTVHlsZT8udmFsdWUgfHwgZm9udE9wdGlvbnNbMF0udmFsdWUpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBsb2FkaW5nIGZvbnQ6XCIsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBsb2FkRm9udCgpO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtmb250U2VsZWN0XSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAvLyBMb2FkIHRoZSBkZWZhdWx0IHNpZ25hdHVyZSBhZnRlciB0aGUgY29tcG9uZW50IG1vdW50c1xyXG4gICAgaWYgKGNhbnZhc1JlZi5jdXJyZW50KSB7XHJcbiAgICAgIGNhbnZhc1JlZi5jdXJyZW50LmZyb21EYXRhVVJMKGlzU2lnbkltZyk7XHJcbiAgICB9XHJcbiAgICBpZiAoaXNUYWIgPT09IFwidHlwZVwiKSB7XHJcbiAgICAgIGNvbnN0IHRyaW1tZWROYW1lID0gc2lnblZhbHVlXHJcbiAgICAgICAgPyBzaWduVmFsdWU/LnRyaW0oKVxyXG4gICAgICAgIDogY3VycmVudFVzZXJOYW1lPy50cmltKCk7XHJcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gdHJpbW1lZE5hbWU/LmNoYXJBdCgwKTtcclxuICAgICAgY29uc3QgdXNlck5hbWUgPSBpc0luaXRpYWwgPyBmaXJzdENoYXJhY3RlciA6IHNpZ25WYWx1ZTtcclxuICAgICAgc2V0U2lnblZhbHVlKHVzZXJOYW1lKTtcclxuICAgICAgY29udmVydFRvSW1nKGZvbnRTZWxlY3QsIHVzZXJOYW1lKTtcclxuICAgIH1cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbaXNUYWJdKTtcclxuICAvL2Z1bmN0aW9uIGZvciBjb252ZXJ0IGlucHV0IHRleHQgdmFsdWUgaW4gaW1hZ2VcclxuICBjb25zdCBjb252ZXJ0VG9JbWcgPSBhc3luYyAoZm9udFN0eWxlLCB0ZXh0LCBjb2xvcikgPT4ge1xyXG4gICAgLy9nZXQgdGV4dCBjb250ZW50IHRvIGNvbnZlcnQgaW4gaW1hZ2VcclxuICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGV4dDtcclxuICAgIGNvbnN0IGZvbnRmYW1pbHkgPSBmb250U3R5bGVcclxuICAgICAgPyBmb250U3R5bGVcclxuICAgICAgOiBmb250U2VsZWN0XHJcbiAgICAgICAgPyBmb250U2VsZWN0XHJcbiAgICAgICAgOiBcIkZhc3RoYW5kXCI7XHJcbiAgICBjb25zdCBmb250U2l6ZVZhbHVlID0gXCI0MHB4XCI7XHJcbiAgICAvL2NyZWF0aW5nIHNwYW4gZm9yIGdldHRpbmcgdGV4dCBjb250ZW50IHdpZHRoXHJcbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICBzcGFuLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7XHJcbiAgICBzcGFuLnN0eWxlLmZvbnQgPSBgJHtmb250U2l6ZVZhbHVlfSAke2ZvbnRmYW1pbHl9YDsgLy8gaGVyZSBwdXQgeW91ciB0ZXh0IHNpemUgYW5kIGZvbnQgZmFtaWx5XHJcbiAgICBzcGFuLnN0eWxlLmNvbG9yID0gY29sb3IgPyBjb2xvciA6IHBlbkNvbG9yO1xyXG4gICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJoaWRkZW5cIjtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7IC8vIFJlcGxhY2UgJ2NvbnRhaW5lcicgd2l0aCB0aGUgSUQgb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50XHJcblxyXG4gICAgLy9jcmVhdGUgY2FudmFzIHRvIHJlbmRlciB0ZXh0IGluIGNhbnZhcyBhbmQgY29udmVydCBpbiBpbWFnZVxyXG4gICAgY29uc3QgY2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAvLyBEcmF3IHRoZSB0ZXh0IGNvbnRlbnQgb24gdGhlIGNhbnZhc1xyXG4gICAgY29uc3QgY3R4ID0gY2FudmFzRWxlbWVudC5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICBjb25zdCBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcclxuICAgIGNvbnN0IGFkZEV4dHJhV2lkdGggPSBpc0luaXRpYWwgPyAxMCA6IDUwO1xyXG4gICAgY29uc3Qgd2lkdGggPSBzcGFuLm9mZnNldFdpZHRoICsgYWRkRXh0cmFXaWR0aDtcclxuICAgIGNvbnN0IGhlaWdodCA9IHNwYW4ub2Zmc2V0SGVpZ2h0O1xyXG4gICAgc2V0VGV4dFdpZHRoKHdpZHRoKTtcclxuICAgIHNldFRleHRIZWlnaHQoaGVpZ2h0KTtcclxuICAgIGNvbnN0IGZvbnQgPSBzcGFuLnN0eWxlW1wiZm9udFwiXTtcclxuICAgIC8vIFNldCB0aGUgY2FudmFzIGRpbWVuc2lvbnMgdG8gbWF0Y2ggdGhlIHNwYW5cclxuICAgIGNhbnZhc0VsZW1lbnQud2lkdGggPSB3aWR0aCAqIHBpeGVsUmF0aW87XHJcbiAgICBjYW52YXNFbGVtZW50LmhlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XHJcblxyXG4gICAgLy8gWW91IGNhbiBjdXN0b21pemUgdGV4dCBzdHlsZXMgaWYgbmVlZGVkXHJcbiAgICBjdHguZm9udCA9IGZvbnQ7XHJcbiAgICBjdHguZmlsbFN0eWxlID0gY29sb3IgPyBjb2xvciA6IHBlbkNvbG9yOyAvLyBTZXQgdGhlIHRleHQgY29sb3JcclxuICAgIGN0eC50ZXh0QWxpZ24gPSBcImNlbnRlclwiO1xyXG4gICAgY3R4LnRleHRCYXNlbGluZSA9IFwibWlkZGxlXCI7XHJcbiAgICBjdHguc2NhbGUocGl4ZWxSYXRpbywgcGl4ZWxSYXRpbyk7XHJcbiAgICAvLyBEcmF3IHRoZSBjb250ZW50IG9mIHRoZSBzcGFuIG9udG8gdGhlIGNhbnZhc1xyXG4gICAgY3R4LmZpbGxUZXh0KHNwYW4udGV4dENvbnRlbnQsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7IC8vIEFkanVzdCB0aGUgeCx5LWNvb3JkaW5hdGUgYXMgbmVlZGVkXHJcbiAgICAvL3JlbW92ZSBzcGFuIHRhZ1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcclxuICAgIC8vIENvbnZlcnQgdGhlIGNhbnZhcyB0byBpbWFnZSBkYXRhXHJcbiAgICBjb25zdCBkYXRhVXJsID0gY2FudmFzRWxlbWVudC50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XHJcbiAgICBzZXRTaWduYXR1cmUoZGF0YVVybCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgUGVuQ29sb3JDb21wb25lbnQgPSAocHJvcHMpID0+IHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1zdGFydFwiPlxyXG4gICAgICAgIHthbGxDb2xvci5tYXAoKGRhdGEsIGtleSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgbWFyZ2luOiBcIjVweFwiLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206XHJcbiAgICAgICAgICAgICAgICAgIGtleSA9PT0gMCAmJiBwZW5Db2xvciA9PT0gXCJibHVlXCJcclxuICAgICAgICAgICAgICAgICAgICA/IFwiMnB4IHNvbGlkIGJsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIDoga2V5ID09PSAxICYmIHBlbkNvbG9yID09PSBcInJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiMnB4IHNvbGlkIHJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA6IGtleSA9PT0gMiAmJiBwZW5Db2xvciA9PT0gXCJibGFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCIycHggc29saWQgYmxhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiMnB4IHNvbGlkIHdoaXRlXCJcclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgIHByb3BzPy5jb252ZXJ0VG9JbWcgJiZcclxuICAgICAgICAgICAgICAgICAgcHJvcHM/LmNvbnZlcnRUb0ltZyhmb250U2VsZWN0LCBzaWduVmFsdWUsIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICBzZXRQZW5Db2xvcihcImJsdWVcIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICBzZXRQZW5Db2xvcihcInJlZFwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNldFBlbkNvbG9yKFwiYmxhY2tcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICBrZXk9e2tleX1cclxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1wZW4tbmliXCJcclxuICAgICAgICAgICAgICB3aWR0aD17MjB9XHJcbiAgICAgICAgICAgICAgaGVpZ2h0PXsyMH1cclxuICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSl9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgKTtcclxuICB9O1xyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2PlxyXG4gICAgICB7aXNTaWduUGFkICYmIChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm9wLW1vZGFsIG9wLW1vZGFsLW9wZW5cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbW9kYWwtYm94IHB4LVsxM3B4XSBwdC0yIHBiLTBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiB0ZXh0LWJhc2UtY29udGVudCBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzEuMnJlbV1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gbXQtWzNweF1cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktYmV0d2VlbiBnYXAtWzVweF0gbWQ6Z2FwLVs4cHhdIHRleHQtWzExcHhdIG1kOnRleHQtYmFzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtpc1N0YW1wID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1iYXNlLWNvbnRlbnQgZm9udC1ib2xkIHRleHQtbGdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3dpZGdldFR5cGUgPT09IFwiaW1hZ2VcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyV2lkZ2V0c0RldGFpbHM/LnR5cGUgPT09IFwiaW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gdChcInVwbG9hZC1pbWFnZVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogdChcInVwbG9hZC1zdGFtcC1pbWFnZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICApIDogKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwiZHJhd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2lnbkltZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZShpc1NpZ25JbWcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWIgPT09IFwiZHJhd1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIm9wLWxpbmstcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIm5vLXVuZGVybGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG9wLWxpbmsgdW5kZXJsaW5lLW9mZnNldC04IG1sLVsycHhdYH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImRyYXdcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNUYWIoXCJ1cGxvYWRJbWFnZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlVHlwZShcIlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhYiA9PT0gXCJ1cGxvYWRJbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIm9wLWxpbmstcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIm5vLXVuZGVybGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG9wLWxpbmsgdW5kZXJsaW5lLW9mZnNldC04IG1sLVsycHhdYH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcInVwbG9hZC1pbWFnZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNUYWIoXCJ0eXBlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmVUeXBlKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFiID09PSBcInR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJuby11bmRlcmxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBvcC1saW5rIHVuZGVybGluZS1vZmZzZXQtOCBtbC1bMnB4XWB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJ0eXBlXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHshaXNJbml0aWFsICYmIGRlZmF1bHRTaWduID8gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNEZWZhdWx0U2lnbih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0ltYWdlU2VsZWN0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwibXlzaWduYXR1cmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlVHlwZShcIlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVGFiID09PSBcIm15c2lnbmF0dXJlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIm5vLXVuZGVybGluZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gb3AtbGluayB1bmRlcmxpbmUtb2Zmc2V0LTggbWwtWzJweF1gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcIm15LXNpZ25hdHVyZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0luaXRpYWwgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBteUluaXRpYWwgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlZmF1bHRTaWduKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzVGFiKFwibXlzaWduYXR1cmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmVUeXBlKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhYiA9PT0gXCJteXNpZ25hdHVyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJvcC1saW5rLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwibm8tdW5kZXJsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IG9wLWxpbmsgdW5kZXJsaW5lLW9mZnNldC04IG1sLVsycHhdYH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwibXktaW5pdGlhbHNcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMS41cmVtXSBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHNldFBlbkNvbG9yKFwiYmx1ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgc2V0SXNTaWduUGFkKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgIHNldElzRGVmYXVsdFNpZ24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICBzZXRJbWFnZSgpO1xyXG4gICAgICAgICAgICAgICAgICBzZXRJc1RhYihcImRyYXdcIik7XHJcbiAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZVR5cGUoXCJkcmF3XCIpO1xyXG4gICAgICAgICAgICAgICAgICBzZXRTaWduVmFsdWUoXCJcIik7XHJcbiAgICAgICAgICAgICAgICAgIHNldElzU3RhbXAoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAmdGltZXM7XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtWzIwcHhdIGgtZnVsbFwiPlxyXG4gICAgICAgICAgICAgIHtpc0RlZmF1bHRTaWduID8gKFxyXG4gICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBcIjEuM3B4IHNvbGlkICMwMDdiZmZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogNixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbCA/IFwiaW50aWFsU2lnbmF0dXJlQ2FudmFzXCIgOiBcInNpZ25hdHVyZUNhbnZhc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJzdGFtcCBpbWdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb250YWluIGJnLXdoaXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM9e2lzSW5pdGlhbCA/IG15SW5pdGlhbCA6IGRlZmF1bHRTaWdufVxyXG4gICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTYXZlQnRuIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgICAgKSA6IGlzSW1hZ2VTZWxlY3QgfHwgaXNTdGFtcCA/IChcclxuICAgICAgICAgICAgICAgICFpbWFnZSA/IChcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBcIjEuM3B4IHNvbGlkICMwMDdiZmZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogNixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbCA/IFwiaW50aWFsU2lnbmF0dXJlQ2FudmFzXCIgOiBcInNpZ25hdHVyZUNhbnZhc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBpbWFnZVJlZi5jdXJyZW50LmNsaWNrKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uSW1hZ2VDaGFuZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZpbGV0eXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0PVwiaW1hZ2UvcG5nLGltYWdlL2pwZWdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9e2ltYWdlUmVmfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5cclxuICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1jbG91ZC11cGxvYWQtYWx0IHVwbG9hZEltZ0xvZ29cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzEwcHhdXCI+e3QoXCJ1cGxvYWRcIil9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwiMS4zcHggc29saWQgIzAwN2JmZlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCIycHhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206IDYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0luaXRpYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJpbnRpYWxTaWduYXR1cmVDYW52YXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInNpZ25hdHVyZUNhbnZhc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInByaW50IGltZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXtpbWFnZVJlZn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9e2ltYWdlLnNyY31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiIG9iamVjdC1jb250YWluIGgtZnVsbCB3LWZ1bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8U2F2ZUJ0biAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICApIDogaXNUYWIgPT09IFwidHlwZVwiID8gKFxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtci1bNXB4XSB0ZXh0LVsxMnB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge2lzSW5pdGlhbCA/IHQoXCJpbml0aWFsLXRlYlwiKSA6IHQoXCJzaWduYXR1cmUtdGFiXCIpfTpcclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGg9e2lzSW5pdGlhbCA/IDMgOiAzMH1cclxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGZvbnRGYW1pbHk6IGZvbnRTZWxlY3QsIGNvbG9yOiBwZW5Db2xvciB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWwtMSBvcC1pbnB1dCBvcC1pbnB1dC1ib3JkZXJlZCBvcC1pbnB1dC1zbSBmb2N1czpvdXRsaW5lLW5vbmUgaG92ZXI6Ym9yZGVyLWJhc2UtY29udGVudCB3LWZ1bGwgdGV4dC1bMjBweF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJZb3VyIHNpZ25hdHVyZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2lnblZhbHVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25WYWx1ZShlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb0ltZyhmb250U2VsZWN0LCBlLnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvcmRlci1bMXB4XSBib3JkZXItWyNkNmQzZDNdIG10LVsxMHB4XSBtbC1bNXB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtmb250T3B0aW9ucy5tYXAoKGZvbnQsIGluZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aW5kfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogZm9udC52YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNlbGVjdCA9PT0gZm9udC52YWx1ZSAmJiBcInJnYigyMDYgMjI1IDI0NylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9udFNlbGVjdChmb250LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb0ltZyhmb250LnZhbHVlLCBzaWduVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjVweCAxMHB4IDVweCAxMHB4XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBcIjIwcHhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHBlbkNvbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzaWduVmFsdWUgPyBzaWduVmFsdWUgOiBcIllvdXIgc2lnbmF0dXJlXCJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIG10LVsxMHB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxQZW5Db2xvckNvbXBvbmVudCBjb252ZXJ0VG9JbWc9e2NvbnZlcnRUb0ltZ30gLz5cclxuICAgICAgICAgICAgICAgICAgICA8U2F2ZUJ0biAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgICA8PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8U2lnbmF0dXJlQ2FudmFzXHJcbiAgICAgICAgICAgICAgICAgICAgICByZWY9e2NhbnZhc1JlZn1cclxuICAgICAgICAgICAgICAgICAgICAgIHBlbkNvbG9yPXtwZW5Db2xvcn1cclxuICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc1Byb3BzPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogaXNJbml0aWFsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImludGlhbFNpZ25hdHVyZUNhbnZhc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInNpZ25hdHVyZUNhbnZhc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogXCIxLjZweCBzb2xpZCAjMDA3YmZmXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I9XCJyZ2IoMjU1LCAyNTUsIDI1NSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgb25FbmQ9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNpZ25hdHVyZUNoYW5nZShjYW52YXNSZWYuY3VycmVudD8udG9EYXRhVVJMKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBkb3RTaXplPXsxfVxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIG10LVsxMHB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxQZW5Db2xvckNvbXBvbmVudCAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTYXZlQnRuIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKX1cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNpZ25QYWQ7XHJcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgZGFya2VuQ29sb3IsIGdldEZpcnN0TGV0dGVyIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50L1V0aWxzXCI7XHJcblxyXG5mdW5jdGlvbiBTaWduZXJMaXN0Q29tcG9uZW50KHByb3BzKSB7XHJcbiAgY29uc3QgY2hlY2tTaWduZXJCYWNrQ29sb3IgPSAob2JqKSA9PiB7XHJcbiAgICBpZiAob2JqKSB7XHJcbiAgICAgIGxldCBkYXRhID0gXCJcIjtcclxuICAgICAgaWYgKG9iaj8uSWQpIHtcclxuICAgICAgICBkYXRhID0gcHJvcHMuc2lnbmVyUG9zLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5JZCA9PT0gb2JqLklkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkYXRhID0gcHJvcHMuc2lnbmVyUG9zLmZpbHRlcihcclxuICAgICAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBvYmoub2JqZWN0SWRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCAmJiBkYXRhWzBdLmJsb2NrQ29sb3I7XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBjaGVja1VzZXJOYW1lQ29sb3IgPSAob2JqKSA9PiB7XHJcbiAgICBjb25zdCBnZXRCYWNrQ29sb3IgPSBjaGVja1NpZ25lckJhY2tDb2xvcihvYmopO1xyXG4gICAgaWYgKGdldEJhY2tDb2xvcikge1xyXG4gICAgICBjb25zdCBjb2xvciA9IGRhcmtlbkNvbG9yKGdldEJhY2tDb2xvciwgMC40KTtcclxuICAgICAgcmV0dXJuIGNvbG9yO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFwiI2FiZDFkMFwiO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQteGwgbXgtMSBmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBweS1bMTBweF0gbXQtMVwiXHJcbiAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6IGNoZWNrU2lnbmVyQmFja0NvbG9yKHByb3BzLm9iaikgfX1cclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6IGNoZWNrVXNlck5hbWVDb2xvcihwcm9wcy5vYmopIH19XHJcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleCB3LVszMHB4XSBoLVszMHB4XSByb3VuZGVkLWZ1bGwganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIG14LTFcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTJweF0gdGV4dC1jZW50ZXIgZm9udC1ib2xkIHRleHQtYmxhY2sgdXBwZXJjYXNlXCI+XHJcbiAgICAgICAgICB7Z2V0Rmlyc3RMZXR0ZXIoXHJcbiAgICAgICAgICAgIHByb3BzLm9iaj8uTmFtZSB8fCBwcm9wcy5vYmo/LmVtYWlsIHx8IHByb3BzLm9iaj8uUm9sZVxyXG4gICAgICAgICAgKX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2xcIj5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxMnB4XSBmb250LWJvbGQgdGV4dC1bIzQyNDI0Ml0gdy1bMTAwcHhdIHdoaXRlc3BhY2Utbm93cmFwIG92ZXJmbG93LWhpZGRlbiB0ZXh0LWVsbGlwc2lzXCI+XHJcbiAgICAgICAgICB7cHJvcHMub2JqPy5OYW1lIHx8IHByb3BzPy5vYmo/LlJvbGV9XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtWzEwcHhdIGZvbnQtbWVkaXVtIHRleHQtWyM0MjQyNDJdIHctWzEwMHB4XSB3aGl0ZXNwYWNlLW5vd3JhcCBvdmVyZmxvdy1oaWRkZW4gdGV4dC1lbGxpcHNpc1wiPlxyXG4gICAgICAgICAge3Byb3BzLm9iaj8uRW1haWwgfHwgcHJvcHMub2JqPy5lbWFpbH1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU2lnbmVyTGlzdENvbXBvbmVudDtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgTG9hZGVyIGZyb20gXCIuLi8uLi9wcmltaXRpdmVzL0xvYWRlclwiO1xyXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XHJcblxyXG5mdW5jdGlvbiBWZXJpZnlFbWFpbChwcm9wcykge1xyXG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpYWxvZyBjbGFzc05hbWU9XCJvcC1tb2RhbCBvcC1tb2RhbC1vcGVuIGFic29sdXRlIHotWzE5OTldXCI+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWQ6dy1bNDAlXSB3LVs4MCVdIG9wLW1vZGFsLWJveCBwLTAgb3ZlcmZsb3cteS1hdXRvIGhpZGUtc2Nyb2xsYmFyIHRleHQtc21cIj5cclxuICAgICAgICA8aDMgY2xhc3NOYW1lPVwiZm9udC1ib2xkIHRleHQtbGcgcHQtWzE1cHhdIHB4LVsyMHB4XSB0ZXh0LWJhc2UtY29udGVudFwiPlxyXG4gICAgICAgICAge3QoXCJvdHAtdmVyaWZpY2F0aW9uXCIpfVxyXG4gICAgICAgIDwvaDM+XHJcbiAgICAgICAge3Byb3BzLmlzVmVyaWZ5TW9kYWwgPyAoXHJcbiAgICAgICAgICA8Zm9ybVxyXG4gICAgICAgICAgICBvblN1Ym1pdD17KGUpID0+IHtcclxuICAgICAgICAgICAgICBwcm9wcy5zZXRJc1ZlcmlmeU1vZGFsKGZhbHNlKTtcclxuICAgICAgICAgICAgICBwcm9wcy5oYW5kbGVWZXJpZnlFbWFpbChlKTtcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC02IHB5LTMgdGV4dC1iYXNlLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwibWItMlwiPnt0KFwiZW50ZXItb3RwXCIpfTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBvbkludmFsaWQ9eyhlKSA9PlxyXG4gICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eSh0KFwiaW5wdXQtcmVxdWlyZWRcIikpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvbklucHV0PXsoZSkgPT4gZS50YXJnZXQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIil9XHJcbiAgICAgICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cInRlbFwiXHJcbiAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV17NH1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIG9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkIG9wLWlucHV0LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBob3Zlcjpib3JkZXItYmFzZS1jb250ZW50IHRleHQteHNcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3QoXCJvdHAtcGxhY2Vob2xkZXJcIil9XHJcbiAgICAgICAgICAgICAgICB2YWx1ZT17cHJvcHMub3RwfVxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBwcm9wcy5zZXRPdHAoZS50YXJnZXQudmFsdWUpfVxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LTYgbXktM1wiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tcHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAge3QoXCJ2ZXJpZnlcIil9XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zZWNvbmRhcnkgbWwtMlwiXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gcHJvcHMuaGFuZGxlUmVzZW5kKGUpfVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt0KFwicmVzZW5kXCIpfVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICApIDogcHJvcHMub3RwTG9hZGVyID8gKFxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLVsxNTBweF0gZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPExvYWRlciAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKSA6IChcclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtNiBweS0zIHRleHQtYmFzZS1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm1iLTIgdGV4dC1zbVwiPnt0KFwidmVyaWZ5LWVtYWlsXCIpfTwvcD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC0wIG10LTNcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBwcm9wcy5oYW5kbGVWZXJpZnlCdG4oKX1cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7dChcInNlbmQtb3RwXCIpfVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICl9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaWFsb2c+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgVmVyaWZ5RW1haWw7XHJcbiIsImltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcclxuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgUERGRG9jdW1lbnQsIHJnYiwgZGVncmVlcyB9IGZyb20gXCJwZGYtbGliXCI7XHJcbmltcG9ydCBQYXJzZSBmcm9tIFwicGFyc2VcIjtcclxuaW1wb3J0IHsgYXBwSW5mbyB9IGZyb20gXCIuL2FwcGluZm9cIjtcclxuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSBcImZpbGUtc2F2ZXJcIjtcclxuaW1wb3J0IHByaW50TW9kdWxlIGZyb20gXCJwcmludC1qc1wiO1xyXG5pbXBvcnQgeyB2YWxpZHBsYW4gfSBmcm9tIFwiLi4vanNvbi9wbGFuc0FyclwiO1xyXG5pbXBvcnQgZm9udGtpdCBmcm9tIFwiQHBkZi1saWIvZm9udGtpdFwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IGZvbnRzaXplQXJyID0gWzIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4XTtcclxuZXhwb3J0IGNvbnN0IGZvbnRDb2xvckFyciA9IFtcInJlZFwiLCBcImJsYWNrXCIsIFwiYmx1ZVwiLCBcInllbGxvd1wiXTtcclxuZXhwb3J0IGNvbnN0IGlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPCA3Njc7XHJcbmV4cG9ydCBjb25zdCBpc1RhYkFuZE1vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgMTAyMztcclxuZXhwb3J0IGNvbnN0IHRleHRJbnB1dFdpZGdldCA9IFwidGV4dCBpbnB1dFwiO1xyXG5leHBvcnQgY29uc3QgdGV4dFdpZGdldCA9IFwidGV4dFwiO1xyXG5leHBvcnQgY29uc3QgcmFkaW9CdXR0b25XaWRnZXQgPSBcInJhZGlvIGJ1dHRvblwiO1xyXG5leHBvcnQgY29uc3QgZmlsZWFzYnl0ZXMgPSBhc3luYyAoZmlsZXBhdGgpID0+IHtcclxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZpbGVwYXRoKTsgLy8gQWRqdXN0IHRoZSBwYXRoIGFjY29yZGluZ2x5XHJcbiAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gIHJldHVybiBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgb3BlbkluTmV3VGFiID0gKHVybCwgdGFyZ2V0KSA9PiB7XHJcbiAgaWYgKHRhcmdldCkge1xyXG4gICAgd2luZG93Lm9wZW4odXJsLCB0YXJnZXQsIFwibm9vcGVuZXIsbm9yZWZlcnJlclwiKTtcclxuICB9IGVsc2Uge1xyXG4gICAgd2luZG93Lm9wZW4odXJsLCBcIl9ibGFua1wiLCBcIm5vb3BlbmVyLG5vcmVmZXJyZXJcIik7XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoU3Vic2NyaXB0aW9uKFxyXG4gIGV4dFVzZXJJZCxcclxuICBjb250YWN0T2JqSWQsXHJcbiAgaXNHdWVzdFNpZ24gPSBmYWxzZVxyXG4pIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgRXh0YW5kX0NsYXNzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJFeHRhbmRfQ2xhc3NcIik7XHJcbiAgICBjb25zdCBleHRDbGFzcyA9IEV4dGFuZF9DbGFzcyAmJiBKU09OLnBhcnNlKEV4dGFuZF9DbGFzcyk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcImV4dENsYXNzIFwiLCBleHRDbGFzcyk7XHJcbiAgICBsZXQgZXh0VXNlcjtcclxuICAgIGlmIChleHRDbGFzcyAmJiBleHRDbGFzcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGV4dFVzZXIgPSBleHRDbGFzc1swXS5vYmplY3RJZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGV4dFVzZXIgPSBleHRVc2VySWQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBiYXNlVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpO1xyXG4gICAgY29uc3QgdXJsID0gYCR7YmFzZVVSTH1mdW5jdGlvbnMvZ2V0c3Vic2NyaXB0aW9uc2A7XHJcbiAgICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICB9O1xyXG4gICAgY29uc3QgcGFyYW1zID0gaXNHdWVzdFNpZ25cclxuICAgICAgPyB7IGNvbnRhY3RJZDogY29udGFjdE9iaklkIH1cclxuICAgICAgOiB7IGV4dFVzZXJJZDogZXh0VXNlciB9O1xyXG4gICAgY29uc3QgdGVuYXRSZXMgPSBhd2FpdCBheGlvcy5wb3N0KHVybCwgcGFyYW1zLCB7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XHJcbiAgICBsZXQgcGxhbiwgc3RhdHVzLCBiaWxsaW5nRGF0ZSwgYWRtaW5JZDtcclxuICAgIGlmIChpc0d1ZXN0U2lnbikge1xyXG4gICAgICBwbGFuID0gdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/LnBsYW47XHJcbiAgICAgIHN0YXR1cyA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5pc1N1YnNjcmliZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwbGFuID0gdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/LlBsYW5Db2RlO1xyXG4gICAgICBiaWxsaW5nRGF0ZSA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5OZXh0X2JpbGxpbmdfZGF0ZT8uaXNvO1xyXG4gICAgICBjb25zdCBhbGxvd2VkVXNlcnMgPSB0ZW5hdFJlcy5kYXRhPy5yZXN1bHQ/LnJlc3VsdD8uQWxsb3dlZFVzZXJzIHx8IDA7XHJcbiAgICAgIGFkbWluSWQgPSB0ZW5hdFJlcz8uZGF0YT8ucmVzdWx0Py5yZXN1bHQ/LkV4dFVzZXJQdHI/Lm9iamVjdElkO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImFsbG93ZWRVc2Vyc1wiLCBhbGxvd2VkVXNlcnMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgcGxhbiwgYmlsbGluZ0RhdGUsIHN0YXR1cywgYWRtaW5JZCB9O1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gZmV0Y2ggc3Vic2NyaXB0aW9uXCIsIGVycik7XHJcbiAgICByZXR1cm4geyBwbGFuOiBcIlwiLCBiaWxsaW5nRGF0ZTogXCJcIiwgc3RhdHVzOiBcIlwiLCBhZG1pbklkOiBcIlwiIH07XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdWJzY3JpcHRpb25JbmZvKCkge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBFeHRhbmRfQ2xhc3MgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkV4dGFuZF9DbGFzc1wiKTtcclxuICAgIGNvbnN0IGV4dENsYXNzID0gRXh0YW5kX0NsYXNzICYmIEpTT04ucGFyc2UoRXh0YW5kX0NsYXNzKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwiZXh0Q2xhc3MgXCIsIGV4dENsYXNzKTtcclxuICAgIGlmIChleHRDbGFzcyAmJiBleHRDbGFzcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGV4dFVzZXIgPSBleHRDbGFzc1swXS5vYmplY3RJZDtcclxuICAgICAgY29uc3QgYmFzZVVSTCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKTtcclxuICAgICAgY29uc3QgdXJsID0gYCR7YmFzZVVSTH1mdW5jdGlvbnMvZ2V0c3Vic2NyaXB0aW9uc2A7XHJcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICBzZXNzaW9uVG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgcGFyYW1zID0geyBleHRVc2VySWQ6IGV4dFVzZXIgfTtcclxuICAgICAgY29uc3QgdGVuYXRSZXMgPSBhd2FpdCBheGlvcy5wb3N0KHVybCwgcGFyYW1zLCB7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XHJcblxyXG4gICAgICBjb25zdCBwcmljZSA9XHJcbiAgICAgICAgdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/LlN1YnNjcmlwdGlvbkRldGFpbHM/LmRhdGE/LnN1YnNjcmlwdGlvblxyXG4gICAgICAgICAgPy5wbGFuPy5wcmljZTtcclxuICAgICAgY29uc3QgdG90YWxQcmljZSA9XHJcbiAgICAgICAgdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/LlN1YnNjcmlwdGlvbkRldGFpbHM/LmRhdGE/LnN1YnNjcmlwdGlvblxyXG4gICAgICAgICAgPy5hbW91bnQ7XHJcbiAgICAgIGNvbnN0IHBsYW5JZCA9XHJcbiAgICAgICAgdGVuYXRSZXMuZGF0YT8ucmVzdWx0Py5yZXN1bHQ/LlN1YnNjcmlwdGlvbkRldGFpbHM/LmRhdGE/LnN1YnNjcmlwdGlvblxyXG4gICAgICAgICAgPy5zdWJzY3JpcHRpb25faWQ7XHJcbiAgICAgIGNvbnN0IHBsYW5fY29kZSA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5QbGFuQ29kZTtcclxuICAgICAgY29uc3QgdG90YWxBbGxvd2VkVXNlciA9IHRlbmF0UmVzLmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5BbGxvd2VkVXNlcnMgfHwgMDtcclxuICAgICAgY29uc3QgYWRtaW5JZCA9XHJcbiAgICAgICAgdGVuYXRSZXM/LmRhdGE/LnJlc3VsdD8ucmVzdWx0Py5FeHRVc2VyUHRyPy5vYmplY3RJZCB8fCBcIlwiO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxyXG4gICAgICAgIHByaWNlOiBwcmljZSxcclxuICAgICAgICB0b3RhbFByaWNlOiB0b3RhbFByaWNlLFxyXG4gICAgICAgIHBsYW5JZDogcGxhbklkLFxyXG4gICAgICAgIHBsYW5fY29kZTogcGxhbl9jb2RlLFxyXG4gICAgICAgIHRvdGFsQWxsb3dlZFVzZXI6IHRvdGFsQWxsb3dlZFVzZXIsXHJcbiAgICAgICAgYWRtaW5JZDogYWRtaW5JZFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY29uc29sZS5sb2coXCJFcnIgaW4gZmV0Y2ggc3Vic2NyaXB0aW9uXCIsIGVycik7XHJcbiAgICByZXR1cm4geyBzdGF0dXM6IFwiZXJyb3JcIiwgZXJyb3I6IGVyciB9O1xyXG4gIH1cclxufVxyXG4vL2Z1bmN0aW9uIHRvIGdldCBzdWJjcmlwaXRpb24gZGV0YWlscyBmcm9tIHN1YnNjcmlwdGlvbiBjbGFzc1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tJc1N1YnNjcmliZWQoKSB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoU3Vic2NyaXB0aW9uKCk7XHJcbiAgICBpZiAocmVzLnBsYW4gPT09IFwiZnJlZXBsYW5cIikge1xyXG4gICAgICByZXR1cm4geyBwbGFuOiByZXMucGxhbiwgaXNWYWxpZDogZmFsc2UsIGFkbWluSWQ6IHJlcz8uYWRtaW5JZCB9O1xyXG4gICAgfSBlbHNlIGlmIChyZXMuYmlsbGluZ0RhdGUpIHtcclxuICAgICAgY29uc3QgcGxhbiA9IHZhbGlkcGxhbltyZXMucGxhbl0gfHwgZmFsc2U7XHJcbiAgICAgIGlmIChwbGFuICYmIG5ldyBEYXRlKHJlcy5iaWxsaW5nRGF0ZSkgPiBuZXcgRGF0ZSgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgcGxhbjogcmVzLnBsYW4sIGlzVmFsaWQ6IHRydWUsIGFkbWluSWQ6IHJlcz8uYWRtaW5JZCB9O1xyXG4gICAgICB9IGVsc2UgaWYgKG5ldyBEYXRlKHJlcy5iaWxsaW5nRGF0ZSkgPiBuZXcgRGF0ZSgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgcGxhbjogcmVzLnBsYW4sIGlzVmFsaWQ6IHRydWUsIGFkbWluSWQ6IHJlcz8uYWRtaW5JZCB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB7IHBsYW46IHJlcy5wbGFuLCBpc1ZhbGlkOiBmYWxzZSwgYWRtaW5JZDogcmVzPy5hZG1pbklkIH07XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7IHBsYW46IHJlcy5wbGFuLCBpc1ZhbGlkOiBmYWxzZSwgYWRtaW5JZDogcmVzPy5hZG1pbklkIH07XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIkVyciBpbiBmZXRjaCBzdWJzY3JpcHRpb25cIiwgZXJyKTtcclxuICAgIHJldHVybiB7IHBsYW46IFwibm8tcGxhblwiLCBpc1ZhbGlkOiBmYWxzZSwgYWRtaW5JZDogXCJcIiB9O1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNvbG9yID0gW1xyXG4gIFwiIzkzYTNkYlwiLFxyXG4gIFwiI2U2YzNkYlwiLFxyXG4gIFwiI2MwZTNiY1wiLFxyXG4gIFwiI2JjZTNkYlwiLFxyXG4gIFwiI2I4Y2NkYlwiLFxyXG4gIFwiI2NlYjhkYlwiLFxyXG4gIFwiI2ZmY2NmZlwiLFxyXG4gIFwiIzk5ZmZjY1wiLFxyXG4gIFwiI2NjOTlmZlwiLFxyXG4gIFwiI2ZmY2M5OVwiLFxyXG4gIFwiIzY2Y2NmZlwiLFxyXG4gIFwiI2ZmZmZjY1wiXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgbmFtZUNvbG9yID0gW1xyXG4gIFwiIzMwNGZiZlwiLFxyXG4gIFwiIzdkNTI3MFwiLFxyXG4gIFwiIzVmODI1YlwiLFxyXG4gIFwiIzU3ODA3N1wiLFxyXG4gIFwiIzU3NmU4MFwiLFxyXG4gIFwiIzZkNTI3ZFwiLFxyXG4gIFwiI2NjMDBjY1wiLFxyXG4gIFwiIzAwNjY2NlwiLFxyXG4gIFwiI2NjMDBmZlwiLFxyXG4gIFwiI2ZmOTkwMFwiLFxyXG4gIFwiIzMzNjY5OVwiLFxyXG4gIFwiI2NjOTkwMFwiXHJcbl07XHJcbmV4cG9ydCBjb25zdCB0b0RhdGFVcmwgPSAoZmlsZSkgPT4ge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgcmVhZGVyLm9ubG9hZGVuZCA9IChlKSA9PiB7XHJcbiAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcclxuICAgIH07XHJcbiAgfSk7XHJcbn07XHJcblxyXG4vL2Z1bmN0aW9uIGZvciBnZXR0aW5nIGRvY3VtZW50IGRldGFpbHMgZm9yIGdldERyaXZlIGNsb3VkIGZ1bmN0aW9uXHJcbmV4cG9ydCBjb25zdCBnZXREcml2ZSA9IGFzeW5jIChkb2N1bWVudElkLCBza2lwID0gMCwgbGltaXQgPSAxMDApID0+IHtcclxuICBjb25zdCBkYXRhID0ge1xyXG4gICAgZG9jSWQ6IGRvY3VtZW50SWQgJiYgZG9jdW1lbnRJZCxcclxuICAgIGxpbWl0OiBsaW1pdCxcclxuICAgIHNraXA6IHNraXBcclxuICB9O1xyXG4gIGNvbnN0IGRyaXZlRGVhdGlscyA9IGF3YWl0IGF4aW9zXHJcbiAgICAucG9zdChgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2dldERyaXZlYCwgZGF0YSwge1xyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICBzZXNzaW9udG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC50aGVuKChMaXN0ZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBqc29uID0gTGlzdGRhdGEuZGF0YTtcclxuXHJcbiAgICAgIGlmIChqc29uICYmIGpzb24ucmVzdWx0LmVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgIH0gZWxzZSBpZiAoanNvbiAmJiBqc29uLnJlc3VsdCkge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBqc29uLnJlc3VsdDtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkVyciBpbiBnZXREcml2ZSBjbG91ZCBmdW5jdGlvblwiLCBlcnIpO1xyXG4gICAgICByZXR1cm4gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCI7XHJcbiAgICB9KTtcclxuXHJcbiAgcmV0dXJuIGRyaXZlRGVhdGlscztcclxufTtcclxuXHJcbi8vIGBwZGZOZXdXaWR0aEZ1bmAgZnVuY3Rpb24gaXMgdXNlZCB0byBjYWxjdWxhdGUgcGRmIHdpZHRoIHRvIHJlbmRlciBpbiBtaWRkbGUgY29udGFpbmVyXHJcbmV4cG9ydCBjb25zdCBwZGZOZXdXaWR0aEZ1biA9IChkaXZSZWYpID0+IHtcclxuICBjb25zdCBwZGZXaWR0aCA9IGRpdlJlZi5jdXJyZW50Lm9mZnNldFdpZHRoO1xyXG4gIHJldHVybiBwZGZXaWR0aDtcclxufTtcclxuXHJcbi8vYGNvbnRyYWN0VXNlcnNgIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IGNvbnRyYWN0X1VzZXIgZGV0YWlsc1xyXG5leHBvcnQgY29uc3QgY29udHJhY3RVc2VycyA9IGFzeW5jICgpID0+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgdXNlckRldGFpbHMgPSBhd2FpdCBQYXJzZS5DbG91ZC5ydW4oXCJnZXRVc2VyRGV0YWlsc1wiKTtcclxuICAgIGxldCBkYXRhID0gW107XHJcbiAgICBpZiAodXNlckRldGFpbHMpIHtcclxuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodXNlckRldGFpbHMpKTtcclxuICAgICAgZGF0YS5wdXNoKGpzb24pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIkVyciBpbiBnZXRVc2VyRGV0YWlscyBjbG91ZCBmdW5jdGlvblwiLCBlcnIpO1xyXG4gICAgcmV0dXJuIFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiO1xyXG4gIH1cclxufTtcclxuXHJcbi8vZnVuY3Rpb24gZm9yIHJlc2l6ZSBpbWFnZSBhbmQgdXBkYXRlIHdpZHRoIGFuZCBoZWlnaHQgZm9yIG11bGl0aXNpZ25lcnNcclxuZXhwb3J0IGNvbnN0IGhhbmRsZUltYWdlUmVzaXplID0gKFxyXG4gIHJlZixcclxuICBrZXksXHJcbiAgc2lnbmVyUG9zLFxyXG4gIHNldFNpZ25lclBvcyxcclxuICBwYWdlTnVtYmVyLFxyXG4gIGNvbnRhaW5lclNjYWxlLFxyXG4gIHNjYWxlLFxyXG4gIHNpZ25lcklkLFxyXG4gIHNob3dSZXNpemVcclxuKSA9PiB7XHJcbiAgY29uc3QgZmlsdGVyU2lnbmVyUG9zID0gc2lnbmVyUG9zLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5JZCA9PT0gc2lnbmVySWQpO1xyXG4gIGlmIChmaWx0ZXJTaWduZXJQb3MubGVuZ3RoID4gMCkge1xyXG4gICAgY29uc3QgZ2V0UGxhY2VIb2xkZXIgPSBmaWx0ZXJTaWduZXJQb3NbMF0ucGxhY2VIb2xkZXI7XHJcbiAgICBjb25zdCBnZXRQYWdlTnVtZXIgPSBnZXRQbGFjZUhvbGRlci5maWx0ZXIoXHJcbiAgICAgIChkYXRhKSA9PiBkYXRhLnBhZ2VOdW1iZXIgPT09IHBhZ2VOdW1iZXJcclxuICAgICk7XHJcbiAgICBpZiAoZ2V0UGFnZU51bWVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZ2V0WFlkYXRhID0gZ2V0UGFnZU51bWVyWzBdLnBvcztcclxuICAgICAgY29uc3QgZ2V0UG9zRGF0YSA9IGdldFhZZGF0YTtcclxuICAgICAgY29uc3QgYWRkU2lnblBvcyA9IGdldFBvc0RhdGEubWFwKCh1cmwpID0+IHtcclxuICAgICAgICBpZiAodXJsLmtleSA9PT0ga2V5KSB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi51cmwsXHJcbiAgICAgICAgICAgIFdpZHRoOiByZWYub2Zmc2V0V2lkdGggLyAoY29udGFpbmVyU2NhbGUgKiBzY2FsZSksXHJcbiAgICAgICAgICAgIEhlaWdodDogcmVmLm9mZnNldEhlaWdodCAvIChjb250YWluZXJTY2FsZSAqIHNjYWxlKSxcclxuICAgICAgICAgICAgSXNSZXNpemU6IHNob3dSZXNpemUgPyB0cnVlIDogZmFsc2VcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1cmw7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgbmV3VXBkYXRlU2lnblBvcyA9IGdldFBsYWNlSG9sZGVyLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgICAgaWYgKG9iai5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyKSB7XHJcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBvczogYWRkU2lnblBvcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25lciA9IHNpZ25lclBvcy5tYXAoKG9iaikgPT4ge1xyXG4gICAgICAgIGlmIChvYmouSWQgPT09IHNpZ25lcklkKSB7XHJcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBuZXdVcGRhdGVTaWduUG9zIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgc2V0U2lnbmVyUG9zKG5ld1VwZGF0ZVNpZ25lcik7XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5leHBvcnQgY29uc3Qgd2lkZ2V0cyA9IFtcclxuICB7XHJcbiAgICB0eXBlOiBcInNpZ25hdHVyZVwiLFxyXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1wZW4tbmliXCIsXHJcbiAgICBpY29uU2l6ZTogXCIyMHB4XCJcclxuICB9LFxyXG4gIHtcclxuICAgIHR5cGU6IFwic3RhbXBcIixcclxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtc3RhbXBcIixcclxuICAgIGljb25TaXplOiBcIjE5cHhcIlxyXG4gIH0sXHJcbiAge1xyXG4gICAgdHlwZTogXCJpbml0aWFsc1wiLFxyXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1zaWduYXR1cmVcIixcclxuICAgIGljb25TaXplOiBcIjE1cHhcIlxyXG4gIH0sXHJcbiAge1xyXG4gICAgdHlwZTogXCJuYW1lXCIsXHJcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXVzZXJcIixcclxuICAgIGljb25TaXplOiBcIjIxcHhcIlxyXG4gIH0sXHJcbiAge1xyXG4gICAgdHlwZTogXCJqb2IgdGl0bGVcIixcclxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtYWRkcmVzcy1jYXJkXCIsXHJcbiAgICBpY29uU2l6ZTogXCIxN3B4XCJcclxuICB9LFxyXG4gIHtcclxuICAgIHR5cGU6IFwiY29tcGFueVwiLFxyXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1idWlsZGluZ1wiLFxyXG4gICAgaWNvblNpemU6IFwiMjVweFwiXHJcbiAgfSxcclxuICB7XHJcbiAgICB0eXBlOiBcImRhdGVcIixcclxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtY2FsZW5kYXItZGF5c1wiLFxyXG4gICAgaWNvblNpemU6IFwiMjBweFwiXHJcbiAgfSxcclxuICB7XHJcbiAgICB0eXBlOiB0ZXh0V2lkZ2V0LFxyXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS10ZXh0LXdpZHRoXCIsXHJcbiAgICBpY29uU2l6ZTogXCIyMHB4XCJcclxuICB9LFxyXG4gIHtcclxuICAgIHR5cGU6IHRleHRJbnB1dFdpZGdldCxcclxuICAgIGljb246IFwiZmEtbGlnaHQgZmEtZm9udFwiLFxyXG4gICAgaWNvblNpemU6IFwiMjFweFwiXHJcbiAgfSxcclxuICB7XHJcbiAgICB0eXBlOiBcImNoZWNrYm94XCIsXHJcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLXNxdWFyZS1jaGVja1wiLFxyXG4gICAgaWNvblNpemU6IFwiMjJweFwiXHJcbiAgfSxcclxuICB7XHJcbiAgICB0eXBlOiBcImRyb3Bkb3duXCIsXHJcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLWNpcmNsZS1jaGV2cm9uLWRvd25cIixcclxuICAgIGljb25TaXplOiBcIjE5cHhcIlxyXG4gIH0sXHJcbiAge1xyXG4gICAgdHlwZTogcmFkaW9CdXR0b25XaWRnZXQsXHJcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLWNpcmNsZS1kb3RcIixcclxuICAgIGljb25TaXplOiBcIjIwcHhcIlxyXG4gIH0sXHJcbiAge1xyXG4gICAgdHlwZTogXCJpbWFnZVwiLFxyXG4gICAgaWNvbjogXCJmYS1saWdodCBmYS1pbWFnZVwiLFxyXG4gICAgaWNvblNpemU6IFwiMjBweFwiXHJcbiAgfSxcclxuICB7XHJcbiAgICB0eXBlOiBcImVtYWlsXCIsXHJcbiAgICBpY29uOiBcImZhLWxpZ2h0IGZhLWVudmVsb3BlXCIsXHJcbiAgICBpY29uU2l6ZTogXCIyMHB4XCJcclxuICB9XHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RGF0ZSA9ICgpID0+IHtcclxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFRpbWUoKTtcclxuICBjb25zdCBuZXdEYXRlID0gbW9tZW50KG1pbGxpc2Vjb25kcykuZm9ybWF0KFwiTU0vREQvWVlZWVwiKTtcclxuICByZXR1cm4gbmV3RGF0ZTtcclxufTtcclxuZXhwb3J0IGNvbnN0IGFkZFdpZGdldE9wdGlvbnMgPSAodHlwZSkgPT4ge1xyXG4gIGNvbnN0IGRlZmF1bHRPcHQgPSB7XHJcbiAgICBuYW1lOiB0eXBlLFxyXG4gICAgc3RhdHVzOiBcInJlcXVpcmVkXCJcclxuICB9O1xyXG4gIHN3aXRjaCAodHlwZSkge1xyXG4gICAgY2FzZSBcInNpZ25hdHVyZVwiOlxyXG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcclxuICAgIGNhc2UgXCJzdGFtcFwiOlxyXG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcclxuICAgIGNhc2UgXCJjaGVja2JveFwiOlxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLmRlZmF1bHRPcHQsXHJcbiAgICAgICAgb3B0aW9uczogeyBpc1JlYWRPbmx5OiBmYWxzZSwgaXNIaWRlTGFiZWw6IGZhbHNlIH1cclxuICAgICAgfTtcclxuICAgIGNhc2UgdGV4dElucHV0V2lkZ2V0OlxyXG4gICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0IH07XHJcbiAgICBjYXNlIFwiaW5pdGlhbHNcIjpcclxuICAgICAgcmV0dXJuIGRlZmF1bHRPcHQ7XHJcbiAgICBjYXNlIFwibmFtZVwiOlxyXG4gICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0IH07XHJcbiAgICBjYXNlIFwiY29tcGFueVwiOlxyXG4gICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0IH07XHJcbiAgICBjYXNlIFwiam9iIHRpdGxlXCI6XHJcbiAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRPcHQgfTtcclxuICAgIGNhc2UgXCJkYXRlXCI6XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uZGVmYXVsdE9wdCxcclxuICAgICAgICByZXNwb25zZTogZ2V0RGF0ZSgpLFxyXG4gICAgICAgIHZhbGlkYXRpb246IHsgZm9ybWF0OiBcIk1NL2RkL3l5eXlcIiwgdHlwZTogXCJkYXRlLWZvcm1hdFwiIH1cclxuICAgICAgfTtcclxuICAgIGNhc2UgXCJpbWFnZVwiOlxyXG4gICAgICByZXR1cm4gZGVmYXVsdE9wdDtcclxuICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICByZXR1cm4geyAuLi5kZWZhdWx0T3B0LCB2YWxpZGF0aW9uOiB7IHR5cGU6IFwiZW1haWxcIiwgcGF0dGVybjogXCJcIiB9IH07XHJcbiAgICBjYXNlIFwiZHJvcGRvd25cIjpcclxuICAgICAgcmV0dXJuIGRlZmF1bHRPcHQ7XHJcbiAgICBjYXNlIHJhZGlvQnV0dG9uV2lkZ2V0OlxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLmRlZmF1bHRPcHQsXHJcbiAgICAgICAgdmFsdWVzOiBbXSxcclxuICAgICAgICBpc1JlYWRPbmx5OiBmYWxzZSxcclxuICAgICAgICBpc0hpZGVMYWJlbDogZmFsc2VcclxuICAgICAgfTtcclxuICAgIGNhc2UgdGV4dFdpZGdldDpcclxuICAgICAgcmV0dXJuIGRlZmF1bHRPcHQ7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4ge307XHJcbiAgfVxyXG59O1xyXG5leHBvcnQgY29uc3QgZ2V0V2lkZ2V0VHlwZSA9IChpdGVtLCB3aWRnZXROYW1lKSA9PiB7XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtYnRuIHctZml0IG1kOnctWzEwMCVdIG9wLWJ0bi1wcmltYXJ5IG9wLWJ0bi1vdXRsaW5lIG9wLWJ0bi1zbSBmb2N1czpvdXRsaW5lLW5vbmUgb3V0bGluZSBvdXRsaW5lLVsxLjVweF0gbWwtWzZweF0gbWQ6bWwtMCBwLTAgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGgtZnVsbCBmbGV4IG1kOmp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1zdGFydCBpdGVtcy1jZW50ZXIgdGV4dC1bMTNweF0gbWwtMVwiPlxyXG4gICAgICAgICAgeyFpc01vYmlsZSAmJiA8aSBjbGFzc05hbWU9XCJmYS1saWdodCBmYS1ncmlwLXZlcnRpY2FsIG1sLVszcHhdXCI+PC9pPn1cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1kOmlubGluZS1ibG9jayB0ZXh0LWNlbnRlciB0ZXh0LVsxNXB4XSBtbC1bNXB4XSBmb250LXNlbWlib2xkIHByLTEgbWQ6cHItMFwiPlxyXG4gICAgICAgICAgICB7d2lkZ2V0TmFtZX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzIwcHhdIG9wLWJ0biBvcC1idG4tcHJpbWFyeSByb3VuZGVkLW5vbmUgdy1bNDBweF0gaC1mdWxsIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICA8aSBjbGFzc05hbWU9e2l0ZW0uaWNvbn0+PC9pPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdFdpZHRoSGVpZ2h0ID0gKHR5cGUpID0+IHtcclxuICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgIGNhc2UgXCJzaWduYXR1cmVcIjpcclxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiA2MCB9O1xyXG4gICAgY2FzZSBcInN0YW1wXCI6XHJcbiAgICAgIHJldHVybiB7IHdpZHRoOiAxNTAsIGhlaWdodDogNjAgfTtcclxuICAgIGNhc2UgXCJjaGVja2JveFwiOlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogMTUsIGhlaWdodDogMTUgfTtcclxuICAgIGNhc2UgdGV4dElucHV0V2lkZ2V0OlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDI1IH07XHJcbiAgICBjYXNlIFwiZHJvcGRvd25cIjpcclxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDEyMCwgaGVpZ2h0OiAyMiB9O1xyXG4gICAgY2FzZSBcImluaXRpYWxzXCI6XHJcbiAgICAgIHJldHVybiB7IHdpZHRoOiA1MCwgaGVpZ2h0OiA1MCB9O1xyXG4gICAgY2FzZSBcIm5hbWVcIjpcclxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAyNSB9O1xyXG4gICAgY2FzZSBcImNvbXBhbnlcIjpcclxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAyNSB9O1xyXG4gICAgY2FzZSBcImpvYiB0aXRsZVwiOlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDI1IH07XHJcbiAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICByZXR1cm4geyB3aWR0aDogMTAwLCBoZWlnaHQ6IDIwIH07XHJcbiAgICBjYXNlIFwiaW1hZ2VcIjpcclxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDcwLCBoZWlnaHQ6IDcwIH07XHJcbiAgICBjYXNlIFwiZW1haWxcIjpcclxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAyMCB9O1xyXG4gICAgY2FzZSByYWRpb0J1dHRvbldpZGdldDpcclxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDUsIGhlaWdodDogMTAgfTtcclxuICAgIGNhc2UgdGV4dFdpZGdldDpcclxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAyNSB9O1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuIHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiA2MCB9O1xyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCByZXNpemVCb3JkZXJFeHRyYVdpZHRoID0gKCkgPT4ge1xyXG4gIHJldHVybiAyMDtcclxufTtcclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCYXNlNjRGcm9tVXJsKHVybCwgYXV0b3NpZ24pIHtcclxuICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2godXJsKTtcclxuICBjb25zdCBibG9iID0gYXdhaXQgZGF0YS5ibG9iKCk7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XHJcbiAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBjb25zdCBwZGZCYXNlID0gdGhpcy5yZXN1bHQ7XHJcbiAgICAgIGlmIChhdXRvc2lnbikge1xyXG4gICAgICAgIHJlc29sdmUocGRmQmFzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc3VmZml4YmFzZTY0ID0gcGRmQmFzZS5zcGxpdChcIixcIikucG9wKCk7XHJcbiAgICAgICAgcmVzb2x2ZShzdWZmaXhiYXNlNjQpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH0pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QmFzZTY0RnJvbUlNRyh1cmwpIHtcclxuICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2godXJsKTtcclxuICBjb25zdCBibG9iID0gYXdhaXQgZGF0YS5ibG9iKCk7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XHJcbiAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBjb25zdCBwZGZCYXNlID0gdGhpcy5yZXN1bHQ7XHJcblxyXG4gICAgICByZXNvbHZlKHBkZkJhc2UpO1xyXG4gICAgfTtcclxuICB9KTtcclxufVxyXG4vL2Z1bmN0aW9uIGZvciBjb252ZXJ0IHNpZ25hdHVyZSBwbmcgYmFzZTY0IHVybCB0byBqcGVnIGJhc2U2NFxyXG5leHBvcnQgY29uc3QgY29udmVydFBOR3RvSlBFRyA9IChiYXNlNjREYXRhKSA9PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAgIGltZy5zcmMgPSBiYXNlNjREYXRhO1xyXG5cclxuICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcclxuICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XHJcblxyXG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICBjdHguZmlsbFN0eWxlID0gXCIjZmZmZmZmXCI7IC8vIHdoaXRlIGNvbG9yXHJcbiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG4gICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XHJcbiAgICAgIC8vIENvbnZlcnQgdG8gSlBFRyBieSB1c2luZyB0aGUgY2FudmFzLnRvRGF0YVVSTCgpIG1ldGhvZFxyXG4gICAgICBjb25zdCBqcGVnQmFzZTY0RGF0YSA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9qcGVnXCIpO1xyXG5cclxuICAgICAgcmVzb2x2ZShqcGVnQmFzZTY0RGF0YSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGltZy5vbmVycm9yID0gKGVycm9yKSA9PiB7XHJcbiAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICB9O1xyXG4gIH0pO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3IgcmVzaXplIGltYWdlIGFuZCB1cGRhdGUgd2lkdGggYW5kIGhlaWdodCBmb3Igc2lnbi15b3Vyc2VsZlxyXG5leHBvcnQgY29uc3QgaGFuZGxlU2lnbllvdXJzZWxmSW1hZ2VSZXNpemUgPSAoXHJcbiAgcmVmLFxyXG4gIGtleSxcclxuICB4eVBvc3Rpb24sXHJcbiAgc2V0WHlQb3N0aW9uLFxyXG4gIGluZGV4LFxyXG4gIGNvbnRhaW5lclNjYWxlLFxyXG4gIHNjYWxlXHJcbikgPT4ge1xyXG4gIGNvbnN0IGdldFhZZGF0YSA9IHh5UG9zdGlvbltpbmRleF0ucG9zO1xyXG4gIGNvbnN0IGdldFBvc0RhdGEgPSBnZXRYWWRhdGE7XHJcbiAgY29uc3QgYWRkU2lnbiA9IGdldFBvc0RhdGEubWFwKCh1cmwpID0+IHtcclxuICAgIGlmICh1cmwua2V5ID09PSBrZXkpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi51cmwsXHJcbiAgICAgICAgV2lkdGg6IHJlZi5vZmZzZXRXaWR0aCAvIChzY2FsZSAqIGNvbnRhaW5lclNjYWxlKSxcclxuICAgICAgICBIZWlnaHQ6IHJlZi5vZmZzZXRIZWlnaHQgLyAoc2NhbGUgKiBjb250YWluZXJTY2FsZSksXHJcbiAgICAgICAgSXNSZXNpemU6IHRydWVcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiB1cmw7XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IG5ld1VwZGF0ZVVybCA9IHh5UG9zdGlvbi5tYXAoKG9iaiwgaW5kKSA9PiB7XHJcbiAgICBpZiAoaW5kID09PSBpbmRleCkge1xyXG4gICAgICByZXR1cm4geyAuLi5vYmosIHBvczogYWRkU2lnbiB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9KTtcclxuICBzZXRYeVBvc3Rpb24obmV3VXBkYXRlVXJsKTtcclxufTtcclxuXHJcbi8vZnVuY3Rpb24gZm9yIGNhbGwgY2xvdWQgZnVuY3Rpb24gc2lnblBkZiBhbmQgZ2VuZXJhdGUgZGlnaXRhbCBzaWduYXR1cmVcclxuZXhwb3J0IGNvbnN0IHNpZ25QZGZGdW4gPSBhc3luYyAoXHJcbiAgYmFzZTY0VXJsLFxyXG4gIGRvY3VtZW50SWQsXHJcbiAgc2lnbmVyT2JqZWN0SWQsXHJcbiAgb2JqZWN0SWQsXHJcbiAgaXNTdWJzY3JpYmVkLFxyXG4gIGFjdGl2ZU1haWxBZGFwdGVyLFxyXG4gIHdpZGdldHNcclxuKSA9PiB7XHJcbiAgbGV0IGlzQ3VzdG9tQ29tcGxldGlvbk1haWwgPSBmYWxzZTtcclxuICB0cnkge1xyXG4gICAgLy9nZXQgdGVuYW50IGRldGFpbHNcclxuICAgIGNvbnN0IHRlbmFudERldGFpbHMgPSBhd2FpdCBnZXRUZW5hbnREZXRhaWxzKG9iamVjdElkKTtcclxuICAgIGlmICh0ZW5hbnREZXRhaWxzICYmIHRlbmFudERldGFpbHMgPT09IFwidXNlciBkb2VzIG5vdCBleGlzdCFcIikge1xyXG4gICAgICByZXR1cm4geyBzdGF0dXM6IFwiZXJyb3JcIiwgbWVzc2FnZTogXCJVc2VyIGRvZXMgbm90IGV4aXN0LlwiIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGVuYW50RGV0YWlscz8uQ29tcGxldGlvbkJvZHkgJiZcclxuICAgICAgICB0ZW5hbnREZXRhaWxzPy5Db21wbGV0aW9uU3ViamVjdCAmJlxyXG4gICAgICAgIGlzU3Vic2NyaWJlZFxyXG4gICAgICApIHtcclxuICAgICAgICBpc0N1c3RvbUNvbXBsZXRpb25NYWlsID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGJlbG93IGZvciBsb29wIGlzIHVzZWQgdG8gZ2V0IGZpcnN0IHNpZ25hdHVyZSBvZiB1c2VyIHRvIHNlbmQgaWYgdG8gc2lnbnBkZlxyXG4gICAgLy8gZm9yIGFkZGluZyBpdCBpbiBjb21wbGV0aW9uIGNlcnRpZmljYXRlXHJcbiAgICBsZXQgZ2V0U2lnbmF0dXJlO1xyXG4gICAgZm9yIChsZXQgaXRlbSBvZiB3aWRnZXRzKSB7XHJcbiAgICAgIGlmICghZ2V0U2lnbmF0dXJlKSB7XHJcbiAgICAgICAgY29uc3QgdHlwZUV4aXN0ID0gaXRlbS5wb3Muc29tZSgoZGF0YSkgPT4gZGF0YT8udHlwZSk7XHJcbiAgICAgICAgaWYgKHR5cGVFeGlzdCkge1xyXG4gICAgICAgICAgZ2V0U2lnbmF0dXJlID0gaXRlbS5wb3MuZmluZCgoZGF0YSkgPT4gZGF0YT8udHlwZSA9PT0gXCJzaWduYXR1cmVcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGdldFNpZ25hdHVyZSA9IGl0ZW0ucG9zLmZpbmQoKGRhdGEpID0+ICFkYXRhLmlzU3RhbXApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBiYXNlNjRTaWduID0gZ2V0U2lnbmF0dXJlLlNpZ25Vcmw7XHJcbiAgICAvL2NoZWNrIGh0dHBzIHR5cGUgc2lnbmF0dXJlIChkZWZhdWx0IHNpZ25hdHVyZSBleGlzdCkgdGhlbiBjb252ZXJ0IGluIGJhc2U2NFxyXG4gICAgY29uc3QgaXNVcmwgPSBiYXNlNjRTaWduLmluY2x1ZGVzKFwiaHR0cHNcIik7XHJcbiAgICBpZiAoaXNVcmwpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBiYXNlNjRTaWduID0gYXdhaXQgZmV0Y2hJbWFnZUJhc2U2NChiYXNlNjRTaWduKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3JcIiwgZSk7XHJcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcImVycm9yXCIsIG1lc3NhZ2U6IFwic29tZXRoaW5nIHdlbnQgd3JvbmcuXCIgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9jaGFuZ2UgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCB0byAxMDAvNDAgaW4gcG5nIGJhc2U2NFxyXG4gICAgY29uc3QgZ2V0TmV3c2U2NCA9IGF3YWl0IGNoYW5nZUltYWdlV0goYmFzZTY0U2lnbik7XHJcbiAgICAvL3JlbW92ZSBzdWZmaWl4IG9mIGJhc2U2NFxyXG4gICAgY29uc3Qgc3VmZml4YmFzZTY0ID0gZ2V0TmV3c2U2NCAmJiBnZXROZXdzZTY0LnNwbGl0KFwiLFwiKS5wb3AoKTtcclxuXHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgIG1haWxQcm92aWRlcjogYWN0aXZlTWFpbEFkYXB0ZXIsXHJcbiAgICAgIHBkZkZpbGU6IGJhc2U2NFVybCxcclxuICAgICAgZG9jSWQ6IGRvY3VtZW50SWQsXHJcbiAgICAgIHVzZXJJZDogc2lnbmVyT2JqZWN0SWQsXHJcbiAgICAgIGlzQ3VzdG9tQ29tcGxldGlvbk1haWw6IGlzQ3VzdG9tQ29tcGxldGlvbk1haWwsXHJcbiAgICAgIHNpZ25hdHVyZTogc3VmZml4YmFzZTY0XHJcbiAgICB9O1xyXG4gICAgY29uc3QgcmVzU2lnblBkZiA9IGF3YWl0IFBhcnNlLkNsb3VkLnJ1bihcInNpZ25QZGZcIiwgcGFyYW1zKTtcclxuICAgIGlmIChyZXNTaWduUGRmKSB7XHJcbiAgICAgIGNvbnN0IHNpZ25lZFBkZiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzU2lnblBkZikpO1xyXG4gICAgICByZXR1cm4gc2lnbmVkUGRmO1xyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIHNpZ25QZGYgY2xvdWQgZnVuY3Rpb24gXCIsIGUubWVzc2FnZSk7XHJcbiAgICBpZiAoZSAmJiBlPy5tZXNzYWdlPy5pbmNsdWRlcyhcImlzIGVuY3J5cHRlZC5cIikpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcclxuICAgICAgICBtZXNzYWdlOiBcIkN1cnJlbnRseSBlbmNyeXB0ZWQgcGRmIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkLlwiXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBlLm1lc3NhZ2UgPT09IFwiUEtDUyMxMiBNQUMgY291bGQgbm90IGJlIHZlcmlmaWVkLiBJbnZhbGlkIHBhc3N3b3JkP1wiXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcImVycm9yXCIsIG1lc3NhZ2U6IFwiUEZYIGZpbGUgcGFzc3dvcmQgaXMgaW52YWxpZC5cIiB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcImVycm9yXCIsIG1lc3NhZ2U6IFwic29tZXRoaW5nIHdlbnQgd3JvbmcuXCIgfTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgcmFuZG9tSWQgPSAoKSA9PiB7XHJcbiAgY29uc3QgcmFuZG9tQnl0ZXMgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50MTZBcnJheSgxKSk7XHJcbiAgY29uc3QgcmFuZG9tVmFsdWUgPSByYW5kb21CeXRlc1swXTtcclxuICBjb25zdCByYW5kb21EaWdpdCA9IDEwMDAgKyAocmFuZG9tVmFsdWUgJSA5MDAwKTtcclxuICByZXR1cm4gcmFuZG9tRGlnaXQ7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgY3JlYXRlRG9jdW1lbnQgPSBhc3luYyAoXHJcbiAgdGVtcGxhdGUsXHJcbiAgcGxhY2Vob2xkZXJzLFxyXG4gIHNpZ25lckRhdGEsXHJcbiAgcGRmVXJsXHJcbikgPT4ge1xyXG4gIGlmICh0ZW1wbGF0ZSAmJiB0ZW1wbGF0ZS5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zdCBEb2MgPSB0ZW1wbGF0ZVswXTtcclxuXHJcbiAgICBsZXQgcGxhY2Vob2xkZXJzQXJyID0gW107XHJcbiAgICBpZiAocGxhY2Vob2xkZXJzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHBsYWNlaG9sZGVyc0FyciA9IHBsYWNlaG9sZGVycztcclxuICAgIH1cclxuICAgIGxldCBzaWduZXJzID0gW107XHJcbiAgICBpZiAoc2lnbmVyRGF0YT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBzaWduZXJEYXRhLmZvckVhY2goKHgpID0+IHtcclxuICAgICAgICBpZiAoeC5vYmplY3RJZCkge1xyXG4gICAgICAgICAgY29uc3Qgb2JqID0ge1xyXG4gICAgICAgICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxyXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiY29udHJhY3RzX0NvbnRhY3Rib29rXCIsXHJcbiAgICAgICAgICAgIG9iamVjdElkOiB4Lm9iamVjdElkXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgc2lnbmVycy5wdXNoKG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIE5hbWU6IERvYy5OYW1lLFxyXG4gICAgICBVUkw6IHBkZlVybCxcclxuICAgICAgU2lnbmVkVXJsOiBEb2MuU2lnbmVkVXJsLFxyXG4gICAgICBTZW50VG9PdGhlcnM6IERvYy5TZW50VG9PdGhlcnMsXHJcbiAgICAgIERlc2NyaXB0aW9uOiBEb2MuRGVzY3JpcHRpb24sXHJcbiAgICAgIE5vdGU6IERvYy5Ob3RlLFxyXG4gICAgICBQbGFjZWhvbGRlcnM6IHBsYWNlaG9sZGVyc0FycixcclxuICAgICAgRXh0VXNlclB0cjoge1xyXG4gICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXHJcbiAgICAgICAgY2xhc3NOYW1lOiBcImNvbnRyYWN0c19Vc2Vyc1wiLFxyXG4gICAgICAgIG9iamVjdElkOiBEb2MuRXh0VXNlclB0ci5vYmplY3RJZFxyXG4gICAgICB9LFxyXG4gICAgICBDcmVhdGVkQnk6IHtcclxuICAgICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxyXG4gICAgICAgIGNsYXNzTmFtZTogXCJfVXNlclwiLFxyXG4gICAgICAgIG9iamVjdElkOiBEb2MuQ3JlYXRlZEJ5Lm9iamVjdElkXHJcbiAgICAgIH0sXHJcbiAgICAgIFNpZ25lcnM6IHNpZ25lcnMsXHJcbiAgICAgIFNlbmRpbk9yZGVyOiBEb2M/LlNlbmRpbk9yZGVyIHx8IGZhbHNlLFxyXG4gICAgICBBdXRvbWF0aWNSZW1pbmRlcnM6IERvYz8uQXV0b21hdGljUmVtaW5kZXJzIHx8IGZhbHNlLFxyXG4gICAgICBSZW1pbmRPbmNlSW5FdmVyeTogcGFyc2VJbnQoRG9jPy5SZW1pbmRPbmNlSW5FdmVyeSB8fCA1KSxcclxuICAgICAgSXNFbmFibGVPVFA6IERvYz8uSXNFbmFibGVPVFAgfHwgZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXhpb3MucG9zdChcclxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9Y2xhc3Nlcy9jb250cmFjdHNfRG9jdW1lbnRgLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJzdWNjZXNzXCIsIGlkOiByZXMuZGF0YS5vYmplY3RJZCB9O1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJheG9pcyBlcnIgXCIsIGVycik7XHJcbiAgICAgIHJldHVybiB7IHN0YXR1czogXCJlcnJvclwiLCBpZDogXCJTb21ldGhpbmcgV2VudCBXcm9uZyFcIiB9O1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGaXJzdExldHRlciA9IChuYW1lKSA9PiB7XHJcbiAgY29uc3QgZmlyc3RMZXR0ZXIgPSBuYW1lPy5jaGFyQXQoMCk7XHJcbiAgcmV0dXJuIGZpcnN0TGV0dGVyO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGRhcmtlbkNvbG9yID0gKGNvbG9yLCBmYWN0b3IpID0+IHtcclxuICAvLyBSZW1vdmUgJyMnIGZyb20gdGhlIGNvbG9yIGNvZGUgYW5kIHBhcnNlIGl0IHRvIGdldCBSR0IgdmFsdWVzXHJcbiAgY29uc3QgaGV4ID0gY29sb3IucmVwbGFjZShcIiNcIiwgXCJcIik7XHJcbiAgY29uc3QgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcclxuICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygyLCA0KSwgMTYpO1xyXG4gIGNvbnN0IGIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDQsIDYpLCAxNik7XHJcblxyXG4gIC8vIERhcmtlbiB0aGUgY29sb3IgYnkgcmVkdWNpbmcgZWFjaCBSR0IgY29tcG9uZW50XHJcbiAgY29uc3QgZGFya2VyUiA9IE1hdGguZmxvb3IociAqICgxIC0gZmFjdG9yKSk7XHJcbiAgY29uc3QgZGFya2VyRyA9IE1hdGguZmxvb3IoZyAqICgxIC0gZmFjdG9yKSk7XHJcbiAgY29uc3QgZGFya2VyQiA9IE1hdGguZmxvb3IoYiAqICgxIC0gZmFjdG9yKSk7XHJcblxyXG4gIC8vIENvbnZlcnQgdGhlIGRhcmtlbmVkIFJHQiBjb21wb25lbnRzIGJhY2sgdG8gaGV4XHJcbiAgcmV0dXJuIGAjJHsoKGRhcmtlclIgPDwgMTYpIHwgKGRhcmtlckcgPDwgOCkgfCBkYXJrZXJCKVxyXG4gICAgLnRvU3RyaW5nKDE2KVxyXG4gICAgLnBhZFN0YXJ0KDYsIFwiMFwiKX1gO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGFkZFpJbmRleCA9IChzaWduZXJQb3MsIGtleSwgc2V0WkluZGV4KSA9PiB7XHJcbiAgcmV0dXJuIHNpZ25lclBvcy5tYXAoKGl0ZW0pID0+IHtcclxuICAgIGlmIChpdGVtLnBsYWNlSG9sZGVyICYmIGl0ZW0ucGxhY2VIb2xkZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIG5lc3RlZCBhcnJheSwgcmVjdXJzaXZlbHkgYWRkIHRoZSBmaWVsZCB0byB0aGUgbGFzdCBvYmplY3RcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgIHBsYWNlSG9sZGVyOiBhZGRaSW5kZXgoaXRlbS5wbGFjZUhvbGRlciwga2V5LCBzZXRaSW5kZXgpXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKGl0ZW0ucG9zICYmIGl0ZW0ucG9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbmVzdGVkIGFycmF5LCBhZGQgdGhlIG5ldyBmaWVsZFxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgcG9zOiBhZGRaSW5kZXgoaXRlbS5wb3MsIGtleSwgc2V0WkluZGV4KVxyXG4gICAgICAgIC8vIEFkanVzdCB0aGlzIGxpbmUgdG8gYWRkIHRoZSBkZXNpcmVkIGZpZWxkXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaXRlbS5rZXkgPT09IGtleSkge1xyXG4gICAgICAgIHNldFpJbmRleChpdGVtLnpJbmRleCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICB6SW5kZXg6IGl0ZW0uekluZGV4ID8gaXRlbS56SW5kZXggKyAxIDogMVxyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLml0ZW1cclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcbn07XHJcblxyXG4vL2Z1bmN0aW9uIGZvciBzYXZlIHdpZGdldHMgdmFsdWUgb24gb25jaGFuZ2UgZnVuY3Rpb25cclxuZXhwb3J0IGNvbnN0IG9uQ2hhbmdlSW5wdXQgPSAoXHJcbiAgdmFsdWUsXHJcbiAgc2lnbktleSxcclxuICB4eVBvc3Rpb24sXHJcbiAgaW5kZXgsXHJcbiAgc2V0WHlQb3N0aW9uLFxyXG4gIHVzZXJJZCxcclxuICBpbml0aWFsLFxyXG4gIGRhdGVGb3JtYXQsXHJcbiAgaXNEZWZhdWx0RW1wdHksXHJcbiAgaXNSYWRpbyxcclxuICBmb250U2l6ZSxcclxuICBmb250Q29sb3JcclxuKSA9PiB7XHJcbiAgY29uc3QgaXNTaWduZXJzID0geHlQb3N0aW9uLnNvbWUoKGRhdGEpID0+IGRhdGEuc2lnbmVyUHRyKTtcclxuICBsZXQgZmlsdGVyU2lnbmVyUG9zO1xyXG4gIGlmIChpc1NpZ25lcnMpIHtcclxuICAgIGlmICh1c2VySWQpIHtcclxuICAgICAgZmlsdGVyU2lnbmVyUG9zID0geHlQb3N0aW9uLmZpbHRlcigoZGF0YSkgPT4gZGF0YS5JZCA9PT0gdXNlcklkKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGdldFBsYWNlSG9sZGVyID0gZmlsdGVyU2lnbmVyUG9zWzBdPy5wbGFjZUhvbGRlcjtcclxuICAgIGlmIChpbml0aWFsKSB7XHJcbiAgICAgIGNvbnN0IHh5RGF0YSA9IGFkZEluaXRpYWxEYXRhKHh5UG9zdGlvbiwgc2V0WHlQb3N0aW9uLCB2YWx1ZSwgdXNlcklkKTtcclxuICAgICAgc2V0WHlQb3N0aW9uKHh5RGF0YSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBnZXRQYWdlTnVtZXIgPSBnZXRQbGFjZUhvbGRlci5maWx0ZXIoXHJcbiAgICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gaW5kZXhcclxuICAgICAgKTtcclxuICAgICAgaWYgKGdldFBhZ2VOdW1lci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgZ2V0WFlkYXRhID0gZ2V0UGFnZU51bWVyWzBdLnBvcztcclxuICAgICAgICBjb25zdCBnZXRQb3NEYXRhID0gZ2V0WFlkYXRhO1xyXG4gICAgICAgIGNvbnN0IGFkZFNpZ25Qb3MgPSBnZXRQb3NEYXRhLm1hcCgocG9zaXRpb24pID0+IHtcclxuICAgICAgICAgIGlmIChwb3NpdGlvbi5rZXkgPT09IHNpZ25LZXkpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxyXG4gICAgICAgICAgICAgICAgICBmb250Q29sb3I6IGZvbnRDb2xvcixcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZS1mb3JtYXRcIixcclxuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IGRhdGVGb3JtYXQgLy8gVGhpcyBpbmRpY2F0ZXMgdGhlIHJlcXVpcmVkIGRhdGUgZm9ybWF0IGV4cGxpY2l0bHkuXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRGVmYXVsdEVtcHR5KSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAuLi5wb3NpdGlvbi5vcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTogdmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogaXNSYWRpbyA/IFwiXCIgOiBbXVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAuLi5wb3NpdGlvbi5vcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgICByZXNwb25zZTogdmFsdWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgbmV3VXBkYXRlU2lnblBvcyA9IGdldFBsYWNlSG9sZGVyLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiBhZGRTaWduUG9zIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBuZXdVcGRhdGVTaWduZXIgPSB4eVBvc3Rpb24ubWFwKChvYmopID0+IHtcclxuICAgICAgICAgIGlmIChvYmouSWQgPT09IHVzZXJJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBuZXdVcGRhdGVTaWduUG9zIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzZXRYeVBvc3Rpb24obmV3VXBkYXRlU2lnbmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XHJcbiAgICBjb25zdCB1cGRhdGVQb3NpdGlvbiA9IGdldFhZZGF0YS5tYXAoKHBvc2l0aW9uRGF0YSkgPT4ge1xyXG4gICAgICBpZiAocG9zaXRpb25EYXRhLmtleSA9PT0gc2lnbktleSkge1xyXG4gICAgICAgIGlmIChkYXRlRm9ybWF0KSB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5wb3NpdGlvbkRhdGEsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAuLi5wb3NpdGlvbkRhdGEub3B0aW9ucyxcclxuICAgICAgICAgICAgICByZXNwb25zZTogdmFsdWUsXHJcbiAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxyXG4gICAgICAgICAgICAgIGZvbnRDb2xvcjogZm9udENvbG9yLFxyXG4gICAgICAgICAgICAgIHZhbGlkYXRpb246IHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwiZGF0ZS1mb3JtYXRcIixcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogZGF0ZUZvcm1hdCAvLyBUaGlzIGluZGljYXRlcyB0aGUgcmVxdWlyZWQgZGF0ZSBmb3JtYXQgZXhwbGljaXRseS5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uRGF0YSxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIC4uLnBvc2l0aW9uRGF0YS5vcHRpb25zLFxyXG4gICAgICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcG9zaXRpb25EYXRhO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlUGxhY2Vob2xkZXIgPSB4eVBvc3Rpb24ubWFwKChvYmosIGluZCkgPT4ge1xyXG4gICAgICBpZiAoaW5kID09PSBpbmRleCkge1xyXG4gICAgICAgIHJldHVybiB7IC4uLm9iaiwgcG9zOiB1cGRhdGVQb3NpdGlvbiB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9KTtcclxuICAgIHNldFh5UG9zdGlvbih1cGRhdGVQbGFjZWhvbGRlcik7XHJcbiAgfVxyXG59O1xyXG5cclxuLy9mdW5jdGlvbiB0byBpbmNyZWFzZSBoZWlnaHQgb2YgdGV4dCBhcmVhIG9uIHByZXNzIGVudGVyXHJcbmV4cG9ydCBjb25zdCBvbkNoYW5nZUhlaWdodE9mVGV4dEFyZWEgPSAoXHJcbiAgaGVpZ2h0LFxyXG4gIHdpZGdldFR5cGUsXHJcbiAgc2lnbktleSxcclxuICB4eVBvc3Rpb24sXHJcbiAgaW5kZXgsXHJcbiAgc2V0WHlQb3N0aW9uLFxyXG4gIHVzZXJJZFxyXG4pID0+IHtcclxuICBjb25zdCBpc1NpZ25lcnMgPSB4eVBvc3Rpb24uc29tZSgoZGF0YSkgPT4gZGF0YS5zaWduZXJQdHIpO1xyXG4gIGxldCBmaWx0ZXJTaWduZXJQb3M7XHJcbiAgaWYgKGlzU2lnbmVycykge1xyXG4gICAgaWYgKHVzZXJJZCkge1xyXG4gICAgICBmaWx0ZXJTaWduZXJQb3MgPSB4eVBvc3Rpb24uZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSB1c2VySWQpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZ2V0UGxhY2VIb2xkZXIgPSBmaWx0ZXJTaWduZXJQb3NbMF0/LnBsYWNlSG9sZGVyO1xyXG5cclxuICAgIGNvbnN0IGdldFBhZ2VOdW1lciA9IGdldFBsYWNlSG9sZGVyLmZpbHRlcihcclxuICAgICAgKGRhdGEpID0+IGRhdGEucGFnZU51bWJlciA9PT0gaW5kZXhcclxuICAgICk7XHJcbiAgICBpZiAoZ2V0UGFnZU51bWVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZ2V0WFlkYXRhID0gZ2V0UGFnZU51bWVyWzBdLnBvcztcclxuICAgICAgY29uc3QgZ2V0UG9zRGF0YSA9IGdldFhZZGF0YTtcclxuICAgICAgY29uc3QgYWRkU2lnblBvcyA9IGdldFBvc0RhdGEubWFwKChwb3NpdGlvbikgPT4ge1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi5rZXkgPT09IHNpZ25LZXkpIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgICBIZWlnaHQ6IHBvc2l0aW9uLkhlaWdodFxyXG4gICAgICAgICAgICAgID8gcG9zaXRpb24uSGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgICAgICAgICAgOiBkZWZhdWx0V2lkdGhIZWlnaHQod2lkZ2V0VHlwZSkuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBuZXdVcGRhdGVTaWduUG9zID0gZ2V0UGxhY2VIb2xkZXIubWFwKChvYmopID0+IHtcclxuICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBvczogYWRkU2lnblBvcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IG5ld1VwZGF0ZVNpZ25lciA9IHh5UG9zdGlvbi5tYXAoKG9iaikgPT4ge1xyXG4gICAgICAgIGlmIChvYmouSWQgPT09IHVzZXJJZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwbGFjZUhvbGRlcjogbmV3VXBkYXRlU2lnblBvcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHNldFh5UG9zdGlvbihuZXdVcGRhdGVTaWduZXIpO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSBnZXRYWWRhdGEubWFwKChwb3NpdGlvbikgPT4ge1xyXG4gICAgICBpZiAocG9zaXRpb24ua2V5ID09PSBzaWduS2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgSGVpZ2h0OiBwb3NpdGlvbi5IZWlnaHRcclxuICAgICAgICAgICAgPyBwb3NpdGlvbi5IZWlnaHQgKyBoZWlnaHRcclxuICAgICAgICAgICAgOiBkZWZhdWx0V2lkdGhIZWlnaHQod2lkZ2V0VHlwZSkuaGVpZ2h0ICsgaGVpZ2h0XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcG9zaXRpb247XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVQbGFjZWhvbGRlciA9IHh5UG9zdGlvbi5tYXAoKG9iaiwgaW5kKSA9PiB7XHJcbiAgICAgIGlmIChpbmQgPT09IGluZGV4KSB7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IHVwZGF0ZVBvc2l0aW9uIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG9iajtcclxuICAgIH0pO1xyXG4gICAgc2V0WHlQb3N0aW9uKHVwZGF0ZVBsYWNlaG9sZGVyKTtcclxuICB9XHJcbn07XHJcbi8vY2FsY3VsYXRlIHdpZHRoIGFuZCBoZWlnaHRcclxuZXhwb3J0IGNvbnN0IGNhbGN1bGF0ZUluaXRpYWxXaWR0aEhlaWdodCA9ICh3aWRnZXREYXRhKSA9PiB7XHJcbiAgY29uc3QgaW50aWFsVGV4dCA9IHdpZGdldERhdGE7XHJcbiAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gIHNwYW4udGV4dENvbnRlbnQgPSBpbnRpYWxUZXh0O1xyXG4gIHNwYW4uc3R5bGUuZm9udCA9IGAxNHB4YDsgLy8gaGVyZSBwdXQgeW91ciB0ZXh0IHNpemUgYW5kIGZvbnQgZmFtaWx5XHJcbiAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJoaWRkZW5cIjtcclxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xyXG4gIGNvbnN0IHdpZHRoID0gc3Bhbi5vZmZzZXRXaWR0aDtcclxuICBjb25zdCBoZWlnaHQgPSBzcGFuLm9mZnNldEhlaWdodDtcclxuXHJcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcclxuICByZXR1cm4ge1xyXG4gICAgZ2V0V2lkdGg6IHdpZHRoLFxyXG4gICAgZ2V0SGVpZ2h0OiBoZWlnaHRcclxuICB9O1xyXG59O1xyXG5leHBvcnQgY29uc3QgYWRkSW5pdGlhbERhdGEgPSAoc2lnbmVyUG9zLCBzZXRYeVBvc3Rpb24sIHZhbHVlLCB1c2VySWQpID0+IHtcclxuICBmdW5jdGlvbiB3aWRnZXREYXRhVmFsdWUodHlwZSkge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgXCJuYW1lXCI6XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlPy5OYW1lO1xyXG4gICAgICBjYXNlIFwiY29tcGFueVwiOlxyXG4gICAgICAgIHJldHVybiB2YWx1ZT8uQ29tcGFueTtcclxuICAgICAgY2FzZSBcImpvYiB0aXRsZVwiOlxyXG4gICAgICAgIHJldHVybiB2YWx1ZT8uSm9iVGl0bGU7XHJcbiAgICAgIGNhc2UgXCJlbWFpbFwiOlxyXG4gICAgICAgIHJldHVybiB2YWx1ZT8uRW1haWw7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBzaWduZXJQb3MubWFwKChpdGVtKSA9PiB7XHJcbiAgICBpZiAoaXRlbS5wbGFjZUhvbGRlciAmJiBpdGVtLnBsYWNlSG9sZGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXN0ZWQgYXJyYXksIHJlY3Vyc2l2ZWx5IGFkZCB0aGUgZmllbGQgdG8gdGhlIGxhc3Qgb2JqZWN0XHJcbiAgICAgIGlmIChpdGVtLklkID09PSB1c2VySWQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgIHBsYWNlSG9sZGVyOiBhZGRJbml0aWFsRGF0YShcclxuICAgICAgICAgICAgaXRlbS5wbGFjZUhvbGRlcixcclxuICAgICAgICAgICAgc2V0WHlQb3N0aW9uLFxyXG4gICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgdXNlcklkXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uaXRlbVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoaXRlbS5wb3MgJiYgaXRlbS5wb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyBuZXN0ZWQgYXJyYXksIGFkZCB0aGUgbmV3IGZpZWxkXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICBwb3M6IGFkZEluaXRpYWxEYXRhKGl0ZW0ucG9zLCBzZXRYeVBvc3Rpb24sIHZhbHVlLCB1c2VySWQpXHJcbiAgICAgICAgLy8gQWRqdXN0IHRoaXMgbGluZSB0byBhZGQgdGhlIGRlc2lyZWQgZmllbGRcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHdpZGdldERhdGEgPSB3aWRnZXREYXRhVmFsdWUoaXRlbS50eXBlKTtcclxuICAgICAgaWYgKFtcIm5hbWVcIiwgXCJjb21wYW55XCIsIFwiam9iIHRpdGxlXCIsIFwiZW1haWxcIl0uaW5jbHVkZXMoaXRlbS50eXBlKSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAuLi5pdGVtLm9wdGlvbnMsXHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogd2lkZ2V0RGF0YVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gV2lkdGg6XHJcbiAgICAgICAgICAvLyAgIGNhbGN1bGF0ZUluaXRpYWxXaWR0aEhlaWdodChpdGVtLnR5cGUsIHdpZGdldERhdGEpLmdldFdpZHRoIHx8XHJcbiAgICAgICAgICAvLyAgIGl0ZW0/LldpZHRoLFxyXG4gICAgICAgICAgLy8gSGVpZ2h0OlxyXG4gICAgICAgICAgLy8gICBjYWxjdWxhdGVJbml0aWFsV2lkdGhIZWlnaHQoaXRlbS50eXBlLCB3aWRnZXREYXRhKS5nZXRIZWlnaHQgfHxcclxuICAgICAgICAgIC8vICAgaXRlbT8uSGVpZ2h0XHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgLi4uaXRlbVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxufTtcclxuXHJcbi8vZnVuY3Rpb24gZm9yIGVtYmVkIGRvY3VtZW50IGlkXHJcbmV4cG9ydCBjb25zdCBlbWJlZERvY0lkID0gYXN5bmMgKHBkZkRvYywgZG9jdW1lbnRJZCwgYWxsUGFnZXMpID0+IHtcclxuICAvLyBgZm9udEJ5dGVzYCBpcyB1c2VkIHRvIGVtYmVkIGN1c3RvbSBmb250IGluIHBkZlxyXG4gIGNvbnN0IGZvbnRCeXRlcyA9IGF3YWl0IGZpbGVhc2J5dGVzKFxyXG4gICAgXCJodHRwczovL2Nkbi5vcGVuc2lnbmxhYnMuY29tL3dlYmZvbnRzL3RpbWVzLnR0ZlwiXHJcbiAgKTtcclxuICBwZGZEb2MucmVnaXN0ZXJGb250a2l0KGZvbnRraXQpO1xyXG4gIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KGZvbnRCeXRlcywgeyBzdWJzZXQ6IHRydWUgfSk7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxQYWdlczsgaSsrKSB7XHJcbiAgICBjb25zdCBmb250U2l6ZSA9IDEwO1xyXG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSBkb2N1bWVudElkICYmIGBPcGVuU2lnbuKEoiBEb2N1bWVudElkOiAke2RvY3VtZW50SWR9IGA7XHJcbiAgICBjb25zdCBwYWdlcyA9IHBkZkRvYy5nZXRQYWdlcygpO1xyXG4gICAgY29uc3QgcGFnZSA9IHBhZ2VzW2ldO1xyXG4gICAgY29uc3QgZ2V0T2JqID0gY29tcGVuc2F0ZVJvdGF0aW9uKFxyXG4gICAgICBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGUsXHJcbiAgICAgIDEwLFxyXG4gICAgICA1LFxyXG4gICAgICAxLFxyXG4gICAgICBwYWdlLmdldFNpemUoKSxcclxuICAgICAgZm9udFNpemUsXHJcbiAgICAgIHJnYigwLjUsIDAuNSwgMC41KSxcclxuICAgICAgZm9udCxcclxuICAgICAgcGFnZVxyXG4gICAgKTtcclxuICAgIHBhZ2UuZHJhd1RleHQodGV4dENvbnRlbnQsIGdldE9iaik7XHJcbiAgfVxyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3Igc2F2ZSBidXR0b24gdG8gc2F2ZSBzaWduYXR1cmUgb3IgaW1hZ2UgdXJsXHJcbmV4cG9ydCBmdW5jdGlvbiBvblNhdmVTaWduKFxyXG4gIHR5cGUsXHJcbiAgeHlQb3N0aW9uLFxyXG4gIGluZGV4LFxyXG4gIHNpZ25LZXksXHJcbiAgc2lnbmF0dXJlSW1nLFxyXG4gIGltZ1dILFxyXG4gIGlzRGVmYXVsdFNpZ24sXHJcbiAgaXNUeXBlVGV4dFxyXG4pIHtcclxuICBsZXQgZ2V0SU1HV0g7XHJcbiAgbGV0IGdldFhZZGF0YSA9IHh5UG9zdGlvbltpbmRleF0ucG9zO1xyXG4gIGNvbnN0IHVwZGF0ZVhZRGF0YSA9IGdldFhZZGF0YS5tYXAoKHBvc2l0aW9uKSA9PiB7XHJcbiAgICBpZiAocG9zaXRpb24ua2V5ID09PSBzaWduS2V5KSB7XHJcbiAgICAgIGlmIChpc0RlZmF1bHRTaWduID09PSBcImluaXRpYWxzXCIpIHtcclxuICAgICAgICBsZXQgaW1nV0ggPSB7IHdpZHRoOiBwb3NpdGlvbi5XaWR0aCwgaGVpZ2h0OiBwb3NpdGlvbi5IZWlnaHQgfTtcclxuICAgICAgICBnZXRJTUdXSCA9IGNhbGN1bGF0ZUltZ0FzcGVjdFJhdGlvKGltZ1dILCBwb3NpdGlvbik7XHJcbiAgICAgIH0gZWxzZSBpZiAoaXNEZWZhdWx0U2lnbiA9PT0gXCJkZWZhdWx0XCIpIHtcclxuICAgICAgICBnZXRJTUdXSCA9IGNhbGN1bGF0ZUltZ0FzcGVjdFJhdGlvKGltZ1dILCBwb3NpdGlvbik7XHJcbiAgICAgIH0gZWxzZSBpZiAoaXNUeXBlVGV4dCkge1xyXG4gICAgICAgIGdldElNR1dIID0geyBuZXdXaWR0aDogaW1nV0gud2lkdGgsIG5ld0hlaWdodDogaW1nV0guaGVpZ2h0IH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gZGVmYXVsdFdpZHRoSGVpZ2h0KHBvc2l0aW9uPy50eXBlKS53aWR0aDtcclxuICAgICAgICBjb25zdCBkZWZhdWx0SGVpZ2h0ID0gZGVmYXVsdFdpZHRoSGVpZ2h0KHBvc2l0aW9uPy50eXBlKS5oZWlnaHQ7XHJcblxyXG4gICAgICAgIGdldElNR1dIID0gY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8oXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHdpZHRoOiBkZWZhdWx0V2lkdGggPyBkZWZhdWx0V2lkdGggOiAxNTAsXHJcbiAgICAgICAgICAgIGhlaWdodDogZGVmYXVsdEhlaWdodCA/IGRlZmF1bHRIZWlnaHQgOiA2MFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHBvc2l0aW9uXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcG9zV2lkdGggPSBnZXRJTUdXSCA/IGdldElNR1dILm5ld1dpZHRoIDogMTUwO1xyXG4gICAgICBjb25zdCBwb3NIZWlnaHQgPSBnZXRJTUdXSCA/IGdldElNR1dILm5ld0hlaWdodCA6IDYwO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5wb3NpdGlvbixcclxuICAgICAgICBXaWR0aDogcG9zV2lkdGgsXHJcbiAgICAgICAgSGVpZ2h0OiBwb3NIZWlnaHQsXHJcbiAgICAgICAgU2lnblVybDogc2lnbmF0dXJlSW1nLFxyXG4gICAgICAgIHNpZ25hdHVyZVR5cGU6IHR5cGUgJiYgdHlwZSxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAuLi5wb3NpdGlvbi5vcHRpb25zLFxyXG4gICAgICAgICAgcmVzcG9uc2U6IHNpZ25hdHVyZUltZ1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBwb3NpdGlvbjtcclxuICB9KTtcclxuXHJcbiAgY29uc3QgdXBkYXRlWFlwb3NpdGlvbiA9IHh5UG9zdGlvbi5tYXAoKG9iaiwgaW5kKSA9PiB7XHJcbiAgICBpZiAoaW5kID09PSBpbmRleCkge1xyXG4gICAgICByZXR1cm4geyAuLi5vYmosIHBvczogdXBkYXRlWFlEYXRhIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH0pO1xyXG4gIHJldHVybiB1cGRhdGVYWXBvc2l0aW9uO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8gPSAoaW1nV0gsIHBvcykgPT4ge1xyXG4gIGxldCBuZXdXaWR0aCwgbmV3SGVpZ2h0O1xyXG5cclxuICBjb25zdCBwbGFjZWhvbGRlckhlaWdodCA9IHBvcyAmJiBwb3MuSGVpZ2h0ID8gcG9zLkhlaWdodCA6IDYwO1xyXG4gIGNvbnN0IGFzcGVjdFJhdGlvID0gaW1nV0gud2lkdGggLyBpbWdXSC5oZWlnaHQ7XHJcbiAgbmV3V2lkdGggPSBhc3BlY3RSYXRpbyAqIHBsYWNlaG9sZGVySGVpZ2h0O1xyXG4gIG5ld0hlaWdodCA9IHBsYWNlaG9sZGVySGVpZ2h0O1xyXG5cclxuICByZXR1cm4geyBuZXdIZWlnaHQsIG5ld1dpZHRoIH07XHJcbn07XHJcblxyXG4vL2Z1bmN0aW9uIGZvciB1cGxvYWQgc3RhbXAgb3IgaW1hZ2VcclxuZXhwb3J0IGZ1bmN0aW9uIG9uU2F2ZUltYWdlKHh5UG9zdGlvbiwgaW5kZXgsIHNpZ25LZXksIGltZ1dILCBpbWFnZSkge1xyXG4gIGxldCBnZXRJTUdXSDtcclxuXHJcbiAgLy9nZXQgY3VycmVudCBwYWdlIHBvc2l0aW9uXHJcbiAgY29uc3QgZ2V0WFlEYXRhID0geHlQb3N0aW9uW2luZGV4XS5wb3M7XHJcbiAgY29uc3QgdXBkYXRlWFlEYXRhID0gZ2V0WFlEYXRhLm1hcCgocG9zaXRpb24pID0+IHtcclxuICAgIGlmIChwb3NpdGlvbi5rZXkgPT09IHNpZ25LZXkpIHtcclxuICAgICAgZ2V0SU1HV0ggPSBjYWxjdWxhdGVJbWdBc3BlY3RSYXRpbyhpbWdXSCwgcG9zaXRpb24pO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5wb3NpdGlvbixcclxuICAgICAgICBXaWR0aDogZ2V0SU1HV0gubmV3V2lkdGgsXHJcbiAgICAgICAgSGVpZ2h0OiBnZXRJTUdXSC5uZXdIZWlnaHQsXHJcbiAgICAgICAgU2lnblVybDogaW1hZ2Uuc3JjLFxyXG4gICAgICAgIEltYWdlVHlwZTogaW1hZ2UuaW1nVHlwZSxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAuLi5wb3NpdGlvbi5vcHRpb25zLFxyXG4gICAgICAgICAgcmVzcG9uc2U6IGltYWdlLnNyY1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBwb3NpdGlvbjtcclxuICB9KTtcclxuXHJcbiAgY29uc3QgdXBkYXRlWFlwb3NpdGlvbiA9IHh5UG9zdGlvbi5tYXAoKG9iaiwgaW5kKSA9PiB7XHJcbiAgICBpZiAoaW5kID09PSBpbmRleCkge1xyXG4gICAgICByZXR1cm4geyAuLi5vYmosIHBvczogdXBkYXRlWFlEYXRhIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH0pO1xyXG4gIHJldHVybiB1cGRhdGVYWXBvc2l0aW9uO1xyXG59XHJcblxyXG4vL2Z1bmN0aW9uIGZvciBzZWxlY3QgaW1hZ2UgYW5kIHVwbG9hZCBpbWFnZVxyXG5leHBvcnQgY29uc3Qgb25JbWFnZVNlbGVjdCA9IChldmVudCwgc2V0SW1nV0gsIHNldEltYWdlKSA9PiB7XHJcbiAgY29uc3QgaW1hZ2VUeXBlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdLnR5cGU7XHJcbiAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICByZWFkZXIucmVhZEFzRGF0YVVSTChldmVudC50YXJnZXQuZmlsZXNbMF0pO1xyXG4gIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgbGV0IHdpZHRoLCBoZWlnaHQ7XHJcbiAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG5cclxuICAgIGltYWdlLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgd2lkdGggPSBpbWFnZS53aWR0aDtcclxuICAgICAgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xyXG4gICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IDQ2MCAvIDE4NDtcclxuICAgICAgY29uc3QgaW1nUiA9IHdpZHRoIC8gaGVpZ2h0O1xyXG5cclxuICAgICAgaWYgKGltZ1IgPiBhc3BlY3RSYXRpbykge1xyXG4gICAgICAgIHdpZHRoID0gNDYwO1xyXG4gICAgICAgIGhlaWdodCA9IDQ2MCAvIGltZ1I7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgd2lkdGggPSAxODQgKiBpbWdSO1xyXG4gICAgICAgIGhlaWdodCA9IDE4NDtcclxuICAgICAgfVxyXG4gICAgICBzZXRJbWdXSCh7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGltYWdlLnNyYyA9IHJlYWRlci5yZXN1bHQ7XHJcblxyXG4gICAgc2V0SW1hZ2UoeyBzcmM6IGltYWdlLnNyYywgaW1nVHlwZTogaW1hZ2VUeXBlIH0pO1xyXG4gIH07XHJcbn07XHJcbi8vY29udmVydCBodHRwcyB1cmwgdG8gYmFzZTY0XHJcbmV4cG9ydCBjb25zdCBmZXRjaEltYWdlQmFzZTY0ID0gYXN5bmMgKGltYWdlVXJsKSA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goaW1hZ2VVcmwpO1xyXG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBiYXNlNjRkYXRhID0gcmVhZGVyLnJlc3VsdDtcclxuICAgICAgICByZXNvbHZlKGJhc2U2NGRhdGEpO1xyXG4gICAgICB9O1xyXG4gICAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4ge1xyXG4gICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgY29udmVydGluZyBVUkwgdG8gYmFzZTY0OlwiLCBlcnJvcik7XHJcbiAgfVxyXG59O1xyXG4vL2Z1bmN0aW9uIGZvciBzZWxlY3QgaW1hZ2UgYW5kIHVwbG9hZCBpbWFnZVxyXG5leHBvcnQgY29uc3QgY2hhbmdlSW1hZ2VXSCA9IGFzeW5jIChiYXNlNjRJbWFnZSkgPT4ge1xyXG4gIGNvbnN0IG5ld1dpZHRoID0gMzAwO1xyXG4gIGNvbnN0IG5ld0hlaWdodCA9IDEyMDtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICBpbWcuc3JjID0gYmFzZTY0SW1hZ2U7XHJcbiAgICBpbWcub25sb2FkID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG4gICAgICBjYW52YXMud2lkdGggPSBuZXdXaWR0aDtcclxuICAgICAgY2FudmFzLmhlaWdodCA9IG5ld0hlaWdodDtcclxuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xyXG4gICAgICBjb25zdCByZXNpemVkQmFzZTY0ID0gY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiLCAxLjApO1xyXG4gICAgICByZXNvbHZlKHJlc2l6ZWRCYXNlNjQpO1xyXG4gICAgfTtcclxuICAgIGltZy5vbmVycm9yID0gKGVycm9yKSA9PiB7XHJcbiAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICB9O1xyXG4gIH0pO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiB0byBjYWxjdWxhdGUgZm9udCBzaXplIG9mIHRleHQgYXJlYSB3aWRnZXRzXHJcbmNvbnN0IGNhbGN1bGF0ZUZvbnRTaXplID0gKHBvc2l0aW9uLCBjb250YWluZXJTY2FsZSwgc2lnbnlvdXJzZWxmKSA9PiB7XHJcbiAgY29uc3QgZm9udCA9IHBvc2l0aW9uPy5vcHRpb25zPy5mb250U2l6ZSB8fCAxMjtcclxuICBpZiAoIXNpZ255b3Vyc2VsZiAmJiBwb3NpdGlvbj8uaXNNb2JpbGUgJiYgcG9zaXRpb24/LnNjYWxlKSB7XHJcbiAgICByZXR1cm4gZm9udCAvIHBvc2l0aW9uPy5zY2FsZSAvIGNvbnRhaW5lclNjYWxlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZm9udCAvIGNvbnRhaW5lclNjYWxlO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGdldFdpZGdldHNGb250Q29sb3IgPSAodHlwZSkgPT4ge1xyXG4gIHN3aXRjaCAodHlwZSkge1xyXG4gICAgY2FzZSBcInJlZFwiOlxyXG4gICAgICByZXR1cm4gcmdiKDEsIDAsIDApO1xyXG4gICAgY2FzZSBcImJsYWNrXCI6XHJcbiAgICAgIHJldHVybiByZ2IoMCwgMCwgMCk7XHJcbiAgICBjYXNlIFwiYmx1ZVwiOlxyXG4gICAgICByZXR1cm4gcmdiKDAsIDAsIDEpO1xyXG4gICAgY2FzZSBcInllbGxvd1wiOlxyXG4gICAgICByZXR1cm4gcmdiKDAuOSwgMSwgMCk7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gcmdiKDAsIDAsIDApO1xyXG4gIH1cclxufTtcclxuLy9mdW5jdGlvbiBmb3IgZW1iZWQgbXVsdGlwbGUgc2lnbmF0dXJlIHVzaW5nIHBkZi1saWJcclxuZXhwb3J0IGNvbnN0IG11bHRpU2lnbkVtYmVkID0gYXN5bmMgKFxyXG4gIHdpZGdldHMsXHJcbiAgcGRmRG9jLFxyXG4gIHNpZ255b3Vyc2VsZixcclxuICBzY2FsZSxcclxuICBwZGZPcmlnaW5hbFdILFxyXG4gIGNvbnRhaW5lcldIXHJcbikgPT4ge1xyXG4gIC8vIGBmb250Qnl0ZXNgIGlzIHVzZWQgdG8gZW1iZWQgY3VzdG9tIGZvbnQgaW4gcGRmXHJcbiAgY29uc3QgZm9udEJ5dGVzID0gYXdhaXQgZmlsZWFzYnl0ZXMoXHJcbiAgICBcImh0dHBzOi8vY2RuLm9wZW5zaWdubGFicy5jb20vd2ViZm9udHMvdGltZXMudHRmXCJcclxuICApO1xyXG4gIHBkZkRvYy5yZWdpc3RlckZvbnRraXQoZm9udGtpdCk7XHJcbiAgY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoZm9udEJ5dGVzLCB7IHN1YnNldDogdHJ1ZSB9KTtcclxuICBmb3IgKGxldCBpdGVtIG9mIHdpZGdldHMpIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lclNjYWxlID0gZ2V0Q29udGFpbmVyU2NhbGUoXHJcbiAgICAgIHBkZk9yaWdpbmFsV0gsXHJcbiAgICAgIGl0ZW0/LnBhZ2VOdW1iZXIsXHJcbiAgICAgIGNvbnRhaW5lcldIXHJcbiAgICApO1xyXG4gICAgY29uc3QgdHlwZUV4aXN0ID0gaXRlbS5wb3Muc29tZSgoZGF0YSkgPT4gZGF0YT8udHlwZSk7XHJcbiAgICBsZXQgdXBkYXRlSXRlbTtcclxuXHJcbiAgICBpZiAodHlwZUV4aXN0KSB7XHJcbiAgICAgIGlmIChzaWdueW91cnNlbGYpIHtcclxuICAgICAgICB1cGRhdGVJdGVtID0gaXRlbS5wb3M7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdXBkYXRlSXRlbSA9IGl0ZW0ucG9zLmZpbHRlcihcclxuICAgICAgICAgIChkYXRhKSA9PiBkYXRhPy5vcHRpb25zPy5zdGF0dXMgPT09IFwicmVxdWlyZWRcIlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHVwZGF0ZUl0ZW0gPSBpdGVtLnBvcztcclxuICAgIH1cclxuICAgIGNvbnN0IHBhZ2VObyA9IGl0ZW0ucGFnZU51bWJlcjtcclxuICAgIGNvbnN0IHdpZGdldHNQb3NpdGlvbkFyciA9IHVwZGF0ZUl0ZW07XHJcbiAgICBjb25zdCBwYWdlcyA9IHBkZkRvYy5nZXRQYWdlcygpO1xyXG4gICAgY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKCk7XHJcbiAgICBjb25zdCBwYWdlID0gcGFnZXNbcGFnZU5vIC0gMV07XHJcbiAgICBjb25zdCBpbWFnZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgd2lkZ2V0c1Bvc2l0aW9uQXJyLm1hcChhc3luYyAodXJsKSA9PiB7XHJcbiAgICAgICAgbGV0IHNpZ25VcmwgPSB1cmwuU2lnblVybCAmJiB1cmwuU2lnblVybDtcclxuICAgICAgICBpZiAoc2lnblVybCkge1xyXG4gICAgICAgICAgaWYgKHVybC5JbWFnZVR5cGUgPT09IFwiaW1hZ2UvcG5nXCIpIHtcclxuICAgICAgICAgICAgLy9mdW5jdGlvbiBmb3IgY29udmVydCBzaWduYXR1cmUgcG5nIGJhc2U2NCB1cmwgdG8ganBlZyBiYXNlNjRcclxuICAgICAgICAgICAgY29uc3QgbmV3VXJsID0gYXdhaXQgY29udmVydFBOR3RvSlBFRyhzaWduVXJsKTtcclxuICAgICAgICAgICAgc2lnblVybCA9IG5ld1VybDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHNpZ25VcmwpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlcy5hcnJheUJ1ZmZlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgd2lkZ2V0c1Bvc2l0aW9uQXJyLmZvckVhY2goYXN5bmMgKHBvc2l0aW9uLCBpZCkgPT4ge1xyXG4gICAgICBsZXQgaW1nO1xyXG4gICAgICBpZiAoW1wic2lnbmF0dXJlXCIsIFwic3RhbXBcIiwgXCJpbml0aWFsc1wiLCBcImltYWdlXCJdLmluY2x1ZGVzKHBvc2l0aW9uLnR5cGUpKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgKHBvc2l0aW9uLkltYWdlVHlwZSAmJiBwb3NpdGlvbi5JbWFnZVR5cGUgPT09IFwiaW1hZ2UvcG5nXCIpIHx8XHJcbiAgICAgICAgICBwb3NpdGlvbi5JbWFnZVR5cGUgPT09IFwiaW1hZ2UvanBlZ1wiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBpbWcgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcoaW1hZ2VzW2lkXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGltZyA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZyhpbWFnZXNbaWRdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoIXBvc2l0aW9uLnR5cGUpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAocG9zaXRpb24uSW1hZ2VUeXBlICYmIHBvc2l0aW9uLkltYWdlVHlwZSA9PT0gXCJpbWFnZS9wbmdcIikgfHxcclxuICAgICAgICAgIHBvc2l0aW9uLkltYWdlVHlwZSA9PT0gXCJpbWFnZS9qcGVnXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGltZyA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZyhpbWFnZXNbaWRdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaW1nID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKGltYWdlc1tpZF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgd2lkZ2V0V2lkdGgsIHdpZGdldEhlaWdodDtcclxuICAgICAgd2lkZ2V0V2lkdGggPSBwbGFjZWhvbGRlcldpZHRoKHBvc2l0aW9uKTtcclxuICAgICAgd2lkZ2V0SGVpZ2h0ID0gcGxhY2Vob2xkZXJIZWlnaHQocG9zaXRpb24pO1xyXG4gICAgICBjb25zdCB4UG9zID0gKHBvc2l0aW9uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzaXplUG9zID0gcG9zaXRpb24ueFBvc2l0aW9uO1xyXG4gICAgICAgIC8vZmlyc3QgdHdvIGNvbmRpdGlvbiBoYW5kbGUgdG8gb2xkIGRhdGEgYWxyZWFkeSBzYXZlZCBmcm9tIG1vYmlsZSB2aWV3IHdoaWNoIHNjYWxlIHBvaW50IGRpZmZyZW50XHJcbiAgICAgICAgaWYgKGlzTW9iaWxlICYmIHBvc2l0aW9uLmlzTW9iaWxlKSB7XHJcbiAgICAgICAgICAvL2lmIHBvcy5pc01vYmlsZSBmYWxzZSAtLSBwbGFjZWhvbGRlciBzYXZlZCBmcm9tIGRlc2t0b3AgdmlldyB0aGVuIGhhbmRsZSBwb3NpdGlvbiBpbiBtb2JpbGUgdmlldyBkaXZpZGVkIGJ5IHNjYWxlXHJcbiAgICAgICAgICBjb25zdCB4ID0gcmVzaXplUG9zICogKHBvc2l0aW9uLnNjYWxlIC8gc2NhbGUpO1xyXG4gICAgICAgICAgcmV0dXJuIHggKiBzY2FsZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uLmlzTW9iaWxlICYmIHBvc2l0aW9uLnNjYWxlKSB7XHJcbiAgICAgICAgICBjb25zdCB4ID0gcmVzaXplUG9zICogcG9zaXRpb24uc2NhbGU7XHJcbiAgICAgICAgICByZXR1cm4geDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc2l6ZVBvcztcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IHlQb3MgPSAocG9zaXRpb24pID0+IHtcclxuICAgICAgICBjb25zdCByZXNpemVQb3MgPSBwb3NpdGlvbi55UG9zaXRpb247XHJcblxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5pc01vYmlsZSAmJiBwb3NpdGlvbi5zY2FsZSkge1xyXG4gICAgICAgICAgaWYgKHBvc2l0aW9uLklzUmVzaXplKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSByZXNpemVQb3MgKiBwb3NpdGlvbi5zY2FsZTtcclxuICAgICAgICAgICAgcmV0dXJuIHk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB5ID0gcmVzaXplUG9zICogcG9zaXRpb24uc2NhbGU7XHJcbiAgICAgICAgICAgIHJldHVybiB5O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzaXplUG9zO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgY29uc3QgY29sb3IgPSBwb3NpdGlvbj8ub3B0aW9ucz8uZm9udENvbG9yO1xyXG4gICAgICBjb25zdCB1cGRhdGVDb2xvckluUmdiID0gZ2V0V2lkZ2V0c0ZvbnRDb2xvcihjb2xvcik7XHJcbiAgICAgIGNvbnN0IGZvbnRTaXplID0gcGFyc2VJbnQocG9zaXRpb24/Lm9wdGlvbnM/LmZvbnRTaXplIHx8IDEzKTtcclxuICAgICAgY29uc3Qgd2lkZ2V0VHlwZUV4aXN0ID0gW1xyXG4gICAgICAgIHRleHRXaWRnZXQsXHJcbiAgICAgICAgdGV4dElucHV0V2lkZ2V0LFxyXG4gICAgICAgIFwibmFtZVwiLFxyXG4gICAgICAgIFwiY29tcGFueVwiLFxyXG4gICAgICAgIFwiam9iIHRpdGxlXCIsXHJcbiAgICAgICAgXCJkYXRlXCIsXHJcbiAgICAgICAgXCJlbWFpbFwiXHJcbiAgICAgIF0uaW5jbHVkZXMocG9zaXRpb24udHlwZSk7XHJcbiAgICAgIGlmIChwb3NpdGlvbi50eXBlID09PSBcImNoZWNrYm94XCIpIHtcclxuICAgICAgICBsZXQgY2hlY2tib3hHYXBGcm9tVG9wLCBpc0NoZWNrO1xyXG4gICAgICAgIGxldCB5ID0geVBvcyhwb3NpdGlvbik7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZvbnRTaXplID0gZm9udFNpemUgfHwgMTM7XHJcbiAgICAgICAgY29uc3QgY2hlY2tib3hTaXplID0gZm9udFNpemU7XHJcbiAgICAgICAgY29uc3QgY2hlY2tib3hUZXh0R2FwRnJvbUxlZnQgPSBmb250U2l6ZSArIDUgfHwgMjI7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy52YWx1ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcG9zaXRpb24/Lm9wdGlvbnM/LnZhbHVlcy5mb3JFYWNoKChpdGVtLCBpbmQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2hlY2tib3hSYW5kb21JZCA9IFwiY2hlY2tib3hcIiArIHJhbmRvbUlkKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgcG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlICYmXHJcbiAgICAgICAgICAgICAgcG9zaXRpb24/Lm9wdGlvbnM/LnJlc3BvbnNlPy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGlzQ2hlY2sgPSBwb3NpdGlvbj8ub3B0aW9ucz8ucmVzcG9uc2U/LmluY2x1ZGVzKGluZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgIGlzQ2hlY2sgPSBwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlPy5pbmNsdWRlcyhpbmQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjaGVja2JveCA9IGZvcm0uY3JlYXRlQ2hlY2tCb3goY2hlY2tib3hSYW5kb21JZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kID4gMCkge1xyXG4gICAgICAgICAgICAgIHkgPSB5ICsgY2hlY2tib3hHYXBGcm9tVG9wO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNoZWNrYm94R2FwRnJvbVRvcCA9IGZvbnRTaXplICsgNSB8fCAyNjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFwb3NpdGlvbj8ub3B0aW9ucz8uaXNIaWRlTGFiZWwpIHtcclxuICAgICAgICAgICAgICAvLyBiZWxvdyBsaW5lIG9mIGNvZGUgaXMgdXNlZCB0byBlbWJlZCBsYWJlbCB3aXRoIHJhZGlvIGJ1dHRvbiBpbiBwZGZcclxuICAgICAgICAgICAgICBjb25zdCBvcHRpb25zUG9zaXRpb24gPSBjb21wZW5zYXRlUm90YXRpb24oXHJcbiAgICAgICAgICAgICAgICBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGUsXHJcbiAgICAgICAgICAgICAgICB4UG9zKHBvc2l0aW9uKSArIGNoZWNrYm94VGV4dEdhcEZyb21MZWZ0LFxyXG4gICAgICAgICAgICAgICAgeSxcclxuICAgICAgICAgICAgICAgIDEsXHJcbiAgICAgICAgICAgICAgICBwYWdlLmdldFNpemUoKSxcclxuICAgICAgICAgICAgICAgIG9wdGlvbnNGb250U2l6ZSxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUNvbG9ySW5SZ2IsXHJcbiAgICAgICAgICAgICAgICBmb250LFxyXG4gICAgICAgICAgICAgICAgcGFnZVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgcGFnZS5kcmF3VGV4dChpdGVtLCBvcHRpb25zUG9zaXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBjaGVja2JveE9iaiA9IHtcclxuICAgICAgICAgICAgICB4OiB4UG9zKHBvc2l0aW9uKSxcclxuICAgICAgICAgICAgICB5OiB5LFxyXG4gICAgICAgICAgICAgIHdpZHRoOiBjaGVja2JveFNpemUsXHJcbiAgICAgICAgICAgICAgaGVpZ2h0OiBjaGVja2JveFNpemVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2hlY2tib3hPYmogPSBnZXRXaWRnZXRQb3NpdGlvbihwYWdlLCBjaGVja2JveE9iaiwgMSk7XHJcbiAgICAgICAgICAgIGNoZWNrYm94LmFkZFRvUGFnZShwYWdlLCBjaGVja2JveE9iaik7XHJcblxyXG4gICAgICAgICAgICAvL2FwcGxpZWQgd2hpY2ggY2hlY2tib3ggc2hvdWxkIGJlIGNoZWNrZWRcclxuICAgICAgICAgICAgaWYgKGlzQ2hlY2spIHtcclxuICAgICAgICAgICAgICBjaGVja2JveC5jaGVjaygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNoZWNrYm94LnVuY2hlY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjaGVja2JveC5lbmFibGVSZWFkT25seSgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHdpZGdldFR5cGVFeGlzdCkge1xyXG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gY2FsY3VsYXRlRm9udFNpemUoXHJcbiAgICAgICAgICBwb3NpdGlvbixcclxuICAgICAgICAgIGNvbnRhaW5lclNjYWxlLFxyXG4gICAgICAgICAgc2lnbnlvdXJzZWxmXHJcbiAgICAgICAgKTtcclxuICAgICAgICBwYXJzZUludChmb250U2l6ZSk7XHJcbiAgICAgICAgbGV0IHRleHRDb250ZW50O1xyXG4gICAgICAgIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8ucmVzcG9uc2UpIHtcclxuICAgICAgICAgIHRleHRDb250ZW50ID0gcG9zaXRpb24ub3B0aW9ucz8ucmVzcG9uc2U7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgICB0ZXh0Q29udGVudCA9IHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpeGVkV2lkdGggPSB3aWRnZXRXaWR0aDsgLy8gU2V0IHlvdXIgZml4ZWQgd2lkdGhcclxuICAgICAgICBjb25zdCBpc05ld09uRW50ZXJMaW5lRXhpc3QgPSB0ZXh0Q29udGVudC5pbmNsdWRlcyhcIlxcblwiKTtcclxuXHJcbiAgICAgICAgLy8gRnVuY3Rpb24gdG8gYnJlYWsgdGV4dCBpbnRvIGxpbmVzIGJhc2VkIG9uIHRoZSBmaXhlZCB3aWR0aFxyXG4gICAgICAgIGNvbnN0IE5ld2JyZWFrVGV4dEludG9MaW5lcyA9ICh0ZXh0Q29udGVudCwgd2lkdGgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGxpbmVzID0gW107XHJcbiAgICAgICAgICBsZXQgY3VycmVudExpbmUgPSBcIlwiO1xyXG5cclxuICAgICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiB0ZXh0Q29udGVudC5zcGxpdChcIiBcIikpIHtcclxuICAgICAgICAgICAgLy9nZXQgdGV4dCBsaW5lIHdpZHRoXHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGZvbnQud2lkdGhPZlRleHRBdFNpemUoXHJcbiAgICAgICAgICAgICAgYCR7Y3VycmVudExpbmV9ICR7d29yZH1gLFxyXG4gICAgICAgICAgICAgIGZvbnRTaXplXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIC8vY2hlY2sgdGV4dCBjb250ZW50IGxpbmUgd2lkdGggaXMgbGVzcyBvciBlcXVhbCB0byBjb250YWluZXIgd2lkdGhcclxuICAgICAgICAgICAgaWYgKGxpbmVXaWR0aCA8PSB3aWR0aCkge1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lICs9IGAgJHt3b3JkfWA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZS50cmltKCkpO1xyXG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gYCR7d29yZH1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lLnRyaW0oKSk7XHJcbiAgICAgICAgICByZXR1cm4gbGluZXM7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gRnVuY3Rpb24gdG8gYnJlYWsgdGV4dCBpbnRvIGxpbmVzIGJhc2VkIG9uIHdoZW4gdXNlciBnbyBuZXh0IGxpbmUgb24gcHJlc3MgZW50ZXIgYnV0dG9uXHJcbiAgICAgICAgY29uc3QgYnJlYWtUZXh0SW50b0xpbmVzID0gKHRleHRDb250ZW50LCB3aWR0aCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbGluZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICBmb3IgKGNvbnN0IHdvcmQgb2YgdGV4dENvbnRlbnQuc3BsaXQoXCJcXG5cIikpIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZVdpZHRoID0gZm9udC53aWR0aE9mVGV4dEF0U2l6ZShgJHt3b3JkfWAsIGZvbnRTaXplKTtcclxuICAgICAgICAgICAgLy9jaGVja2luZyBzdHJpbmcgbGVuZ3RoIHRvIGNvbnRhaW5lciB3aWR0aFxyXG4gICAgICAgICAgICAvL2lmIHN0cmluZyBsZW5ndGggaXMgbGVzcyB0aGVuIGNvbnRhaW5lciB3aWR0aCBpdCBtZWFucyB1c2VyIHByZXNzIGVudGVyIGJ1dHRvblxyXG4gICAgICAgICAgICBpZiAobGluZVdpZHRoIDw9IHdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgbGluZXMucHVzaCh3b3JkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2Vsc2UgYWRqdXN0IHRleHQgY29udGVudCBhY2NvcmRpbmcgdG8gd2lkdGggYW5kIHNlbmQgaXQgaW4gbmV3IGxpbmVcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbmV3TGluZSA9IE5ld2JyZWFrVGV4dEludG9MaW5lcyh3b3JkLCB3aWR0aCk7XHJcbiAgICAgICAgICAgICAgbGluZXMucHVzaCguLi5uZXdMaW5lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBsaW5lcztcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL2NoZWNrIGlmIHRleHQgY29udGVudCBoYXZlIGBcXG5gIHN0cmluZyBpdCBtZWFucyB1c2VyIHByZXNzIGVudGVyIHRvIGdvIG5leHQgbGluZSBhbmQgaGFuZGxlIGNvbmRpdGlvblxyXG4gICAgICAgIC8vZWxzZSBhdXRvIGFkanVzdCB0ZXh0IGNvbnRlbnQgYWNjb3JkaW5nIHRvIGNvbnRhaW5lciB3aWR0aFxyXG4gICAgICAgIGNvbnN0IGxpbmVzID0gaXNOZXdPbkVudGVyTGluZUV4aXN0XHJcbiAgICAgICAgICA/IGJyZWFrVGV4dEludG9MaW5lcyh0ZXh0Q29udGVudCwgZml4ZWRXaWR0aClcclxuICAgICAgICAgIDogTmV3YnJlYWtUZXh0SW50b0xpbmVzKHRleHRDb250ZW50LCBmaXhlZFdpZHRoKTtcclxuICAgICAgICAvLyBTZXQgaW5pdGlhbCB5LWNvb3JkaW5hdGUgZm9yIHRoZSBmaXJzdCBsaW5lXHJcbiAgICAgICAgbGV0IHggPSB4UG9zKHBvc2l0aW9uKTtcclxuICAgICAgICBsZXQgeSA9IHlQb3MocG9zaXRpb24pO1xyXG4gICAgICAgIC8vIEVtYmVkIGVhY2ggbGluZSBvbiB0aGUgcGFnZVxyXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xyXG4gICAgICAgICAgY29uc3QgdGV4dFBvc2l0aW9uID0gY29tcGVuc2F0ZVJvdGF0aW9uKFxyXG4gICAgICAgICAgICBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGUsXHJcbiAgICAgICAgICAgIHgsXHJcbiAgICAgICAgICAgIHksXHJcbiAgICAgICAgICAgIDEsXHJcbiAgICAgICAgICAgIHBhZ2UuZ2V0U2l6ZSgpLFxyXG4gICAgICAgICAgICBmb250U2l6ZSxcclxuICAgICAgICAgICAgdXBkYXRlQ29sb3JJblJnYixcclxuICAgICAgICAgICAgZm9udCxcclxuICAgICAgICAgICAgcGFnZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHBhZ2UuZHJhd1RleHQobGluZSwgdGV4dFBvc2l0aW9uKTtcclxuICAgICAgICAgIHkgKz0gMTg7IC8vIEFkanVzdCB0aGUgbGluZSBoZWlnaHQgYXMgbmVlZGVkXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uLnR5cGUgPT09IFwiZHJvcGRvd25cIikge1xyXG4gICAgICAgIGNvbnN0IGZvbnRzaXplID0gcGFyc2VJbnQocG9zaXRpb24/Lm9wdGlvbnM/LmZvbnRTaXplKSB8fCAxMjtcclxuXHJcbiAgICAgICAgY29uc3QgZHJvcGRvd25SYW5kb21JZCA9IFwiZHJvcGRvd25cIiArIHJhbmRvbUlkKCk7XHJcbiAgICAgICAgY29uc3QgZHJvcGRvd24gPSBmb3JtLmNyZWF0ZURyb3Bkb3duKGRyb3Bkb3duUmFuZG9tSWQpO1xyXG4gICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbnMocG9zaXRpb24/Lm9wdGlvbnM/LnZhbHVlcyk7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5yZXNwb25zZSkge1xyXG4gICAgICAgICAgZHJvcGRvd24uc2VsZWN0KHBvc2l0aW9uLm9wdGlvbnM/LnJlc3BvbnNlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpIHtcclxuICAgICAgICAgIGRyb3Bkb3duLnNlbGVjdChwb3NpdGlvbj8ub3B0aW9ucz8uZGVmYXVsdFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRGVmaW5lIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2Ugc3RyaW5nXHJcbiAgICAgICAgLy8gRXhhbXBsZSBmb3JtYXQ6IGAvRm9udE5hbWUgRm9udFNpemUgVGYgMCBnYCB3aGVyZTpcclxuICAgICAgICAvLyAtIGAvRm9udE5hbWVgIGlzIHRoZSBuYW1lIG9mIHRoZSBmb250IChlLmcuLCBgL0hlbHZgIGZvciBIZWx2ZXRpY2EpXHJcbiAgICAgICAgLy8gLSBgRm9udFNpemVgIGlzIHRoZSBzaXplIHlvdSB3YW50IHRvIHNldCAoZS5nLiwgMTIpXHJcbiAgICAgICAgLy8gLSBgVGZgIHNwZWNpZmllcyB0aGUgZm9udCBhbmQgc2l6ZVxyXG4gICAgICAgIC8vIC0gYDAgZ2Agc2V0cyB0aGUgdGV4dCBjb2xvciB0byBibGFja1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRBcHBlYXJhbmNlID0gYC9IZWx2ICR7Zm9udHNpemV9IFRmIDAgZ2A7XHJcbiAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgZm9yIHRoZSBkcm9wZG93biBmaWVsZFxyXG4gICAgICAgIGRyb3Bkb3duLmFjcm9GaWVsZC5zZXREZWZhdWx0QXBwZWFyYW5jZShkZWZhdWx0QXBwZWFyYW5jZSk7XHJcbiAgICAgICAgZHJvcGRvd24uc2V0Rm9udFNpemUoZm9udHNpemUpO1xyXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duT2JqID0ge1xyXG4gICAgICAgICAgeDogeFBvcyhwb3NpdGlvbiksXHJcbiAgICAgICAgICB5OiB5UG9zKHBvc2l0aW9uKSxcclxuICAgICAgICAgIHdpZHRoOiB3aWRnZXRXaWR0aCxcclxuICAgICAgICAgIGhlaWdodDogd2lkZ2V0SGVpZ2h0XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBkcm9wZG93bk9wdGlvbiA9IGdldFdpZGdldFBvc2l0aW9uKHBhZ2UsIGRyb3Bkb3duT2JqLCAxKTtcclxuICAgICAgICBjb25zdCBkcm9wZG93blNlbGVjdGVkID0geyAuLi5kcm9wZG93bk9wdGlvbiwgZm9udDogZm9udCB9O1xyXG4gICAgICAgIGRyb3Bkb3duLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyhmb250KTtcclxuICAgICAgICBkcm9wZG93bi5hZGRUb1BhZ2UocGFnZSwgZHJvcGRvd25TZWxlY3RlZCk7XHJcbiAgICAgICAgZHJvcGRvd24uZW5hYmxlUmVhZE9ubHkoKTtcclxuICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbi50eXBlID09PSByYWRpb0J1dHRvbldpZGdldCkge1xyXG4gICAgICAgIGNvbnN0IHJhZGlvUmFuZG9tSWQgPSBcInJhZGlvXCIgKyByYW5kb21JZCgpO1xyXG4gICAgICAgIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmNyZWF0ZVJhZGlvR3JvdXAocmFkaW9SYW5kb21JZCk7XHJcbiAgICAgICAgbGV0IHJhZGlvT3B0aW9uR2FwRnJvbVRvcDtcclxuICAgICAgICBjb25zdCBvcHRpb25zRm9udFNpemUgPSBmb250U2l6ZSB8fCAxMztcclxuICAgICAgICBjb25zdCByYWRpb1RleHRHYXBGcm9tTGVmdCA9IGZvbnRTaXplICsgNSB8fCAyMDtcclxuICAgICAgICBjb25zdCByYWRpb1NpemUgPSBmb250U2l6ZTtcclxuICAgICAgICBsZXQgeSA9IHlQb3MocG9zaXRpb24pO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8udmFsdWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHBvc2l0aW9uPy5vcHRpb25zPy52YWx1ZXMuZm9yRWFjaCgoaXRlbSwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpbmQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgeSA9IHkgKyByYWRpb09wdGlvbkdhcEZyb21Ub3A7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmFkaW9PcHRpb25HYXBGcm9tVG9wID0gZm9udFNpemUgKyAxMCB8fCAyNTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXBvc2l0aW9uPy5vcHRpb25zPy5pc0hpZGVMYWJlbCkge1xyXG4gICAgICAgICAgICAgIC8vIGJlbG93IGxpbmUgb2YgY29kZSBpcyB1c2VkIHRvIGVtYmVkIGxhYmVsIHdpdGggcmFkaW8gYnV0dG9uIGluIHBkZlxyXG5cclxuICAgICAgICAgICAgICBjb25zdCBvcHRpb25zUG9zaXRpb24gPSBjb21wZW5zYXRlUm90YXRpb24oXHJcbiAgICAgICAgICAgICAgICBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGUsXHJcbiAgICAgICAgICAgICAgICB4UG9zKHBvc2l0aW9uKSArIHJhZGlvVGV4dEdhcEZyb21MZWZ0LFxyXG4gICAgICAgICAgICAgICAgeSxcclxuICAgICAgICAgICAgICAgIDEsXHJcbiAgICAgICAgICAgICAgICBwYWdlLmdldFNpemUoKSxcclxuICAgICAgICAgICAgICAgIG9wdGlvbnNGb250U2l6ZSxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUNvbG9ySW5SZ2IsXHJcbiAgICAgICAgICAgICAgICBmb250LFxyXG4gICAgICAgICAgICAgICAgcGFnZVxyXG4gICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgIHBhZ2UuZHJhd1RleHQoaXRlbSwgb3B0aW9uc1Bvc2l0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcmFkaW9PYmogPSB7XHJcbiAgICAgICAgICAgICAgeDogeFBvcyhwb3NpdGlvbiksXHJcbiAgICAgICAgICAgICAgeTogeSxcclxuICAgICAgICAgICAgICB3aWR0aDogcmFkaW9TaXplLFxyXG4gICAgICAgICAgICAgIGhlaWdodDogcmFkaW9TaXplXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICByYWRpb09iaiA9IGdldFdpZGdldFBvc2l0aW9uKHBhZ2UsIHJhZGlvT2JqLCAxKTtcclxuICAgICAgICAgICAgcmFkaW9Hcm91cC5hZGRPcHRpb25Ub1BhZ2UoaXRlbSwgcGFnZSwgcmFkaW9PYmopO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwb3NpdGlvbj8ub3B0aW9ucz8ucmVzcG9uc2UpIHtcclxuICAgICAgICAgIHJhZGlvR3JvdXAuc2VsZWN0KHBvc2l0aW9uLm9wdGlvbnM/LnJlc3BvbnNlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpIHtcclxuICAgICAgICAgIHJhZGlvR3JvdXAuc2VsZWN0KHBvc2l0aW9uPy5vcHRpb25zPy5kZWZhdWx0VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByYWRpb0dyb3VwLmVuYWJsZVJlYWRPbmx5KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0ge1xyXG4gICAgICAgICAgeDogeFBvcyhwb3NpdGlvbiksXHJcbiAgICAgICAgICB5OiB5UG9zKHBvc2l0aW9uKSxcclxuICAgICAgICAgIHdpZHRoOiB3aWRnZXRXaWR0aCxcclxuICAgICAgICAgIGhlaWdodDogd2lkZ2V0SGVpZ2h0XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgaW1hZ2VPcHRpb25zID0gZ2V0V2lkZ2V0UG9zaXRpb24ocGFnZSwgc2lnbmF0dXJlLCAxKTtcclxuICAgICAgICBwYWdlLmRyYXdJbWFnZShpbWcsIGltYWdlT3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBjb25zdCBwZGZCeXRlcyA9IGF3YWl0IHBkZkRvYy5zYXZlQXNCYXNlNjQoeyB1c2VPYmplY3RTdHJlYW1zOiBmYWxzZSB9KTtcclxuICAvL2NvbnNvbGUubG9nKFwicGRmXCIsIHBkZkJ5dGVzKTtcclxuICByZXR1cm4gcGRmQnl0ZXM7XHJcbn07XHJcblxyXG4vLyBmdW5jdGlvbiBmb3IgdmFsaWRhdGluZyBVUkxzXHJcbmV4cG9ydCBmdW5jdGlvbiB1cmxWYWxpZGF0b3IodXJsKSB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IG5ld1VybCA9IG5ldyBVUkwodXJsKTtcclxuICAgIHJldHVybiBuZXdVcmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIiB8fCBuZXdVcmwucHJvdG9jb2wgPT09IFwiaHR0cHM6XCI7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcbi8vY2FsY3VsYXRlIHBsYWNlaG9sZGVyIHdpZHRoIHRvIGVtYmVkIGluIHBkZlxyXG5leHBvcnQgY29uc3QgcGxhY2Vob2xkZXJXaWR0aCA9IChwb3MpID0+IHtcclxuICBjb25zdCBkZWZhdWx0V2lkdGggPSBkZWZhdWx0V2lkdGhIZWlnaHQocG9zLnR5cGUpLndpZHRoO1xyXG4gIGNvbnN0IHBvc1dpZHRoID0gcG9zLldpZHRoIHx8IGRlZmF1bHRXaWR0aDtcclxuXHJcbiAgLy9jb25kaXRpb24gdG8gaGFuZGxlIG9sZCBkYXRhIHNhdmVkIGZyb20gbW9iaWxlIHZpZXcgdG8gZ2V0IHdpZHRoaFxyXG4gIGlmIChwb3MuaXNNb2JpbGUgJiYgcG9zLnNjYWxlKSB7XHJcbiAgICBpZiAocG9zLklzUmVzaXplKSB7XHJcbiAgICAgIHJldHVybiBwb3NXaWR0aDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBwb3NXaWR0aCAqIHBvcy5zY2FsZTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHBvc1dpZHRoO1xyXG4gIH1cclxufTtcclxuXHJcbi8vY2FsY3VsYXRlIHBsYWNlaG9sZGVyIGhlaWdodCB0byBlbWJlZCBpbiBwZGZcclxuZXhwb3J0IGNvbnN0IHBsYWNlaG9sZGVySGVpZ2h0ID0gKHBvcykgPT4ge1xyXG4gIGNvbnN0IHBvc0hlaWdodCA9IHBvcy5IZWlnaHQ7XHJcbiAgY29uc3QgZGVmYXVsdEhlaWdodCA9IGRlZmF1bHRXaWR0aEhlaWdodChwb3MudHlwZSkuaGVpZ2h0O1xyXG4gIGNvbnN0IHBvc1VwZGF0ZUhlaWdodCA9IHBvc0hlaWdodCB8fCBkZWZhdWx0SGVpZ2h0O1xyXG5cclxuICAvL2NvbmRpdGlvbiB0byBoYW5kbGUgb2xkIGRhdGEgc2F2ZWQgZnJvbSBtb2JpbGUgdmlldyB0byBnZXQgaGVpZ2h0XHJcbiAgaWYgKHBvcy5pc01vYmlsZSAmJiBwb3Muc2NhbGUpIHtcclxuICAgIGlmIChwb3MuSXNSZXNpemUpIHtcclxuICAgICAgcmV0dXJuIHBvc1VwZGF0ZUhlaWdodDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBwb3NVcGRhdGVIZWlnaHQgKiBwb3Muc2NhbGU7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBwb3NVcGRhdGVIZWlnaHQ7XHJcbiAgfVxyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3IgZ2V0dGluZyBjb250cmFjdHNfY29udGFjdGJvb2sgZGV0YWlsc1xyXG5leHBvcnQgY29uc3QgY29udGFjdEJvb2sgPSBhc3luYyAob2JqZWN0SWQpID0+IHtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBheGlvc1xyXG4gICAgLmdldChcclxuICAgICAgYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgICAgXCJiYXNlVXJsXCJcclxuICAgICAgKX1jbGFzc2VzL2NvbnRyYWN0c19Db250YWN0Ym9vaz93aGVyZT17XCJvYmplY3RJZFwiOlwiJHtvYmplY3RJZH1cIn1gLFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKVxyXG4gICAgLnRoZW4oKExpc3RkYXRhKSA9PiB7XHJcbiAgICAgIGNvbnN0IGpzb24gPSBMaXN0ZGF0YS5kYXRhO1xyXG4gICAgICBjb25zdCByZXMgPSBqc29uLnJlc3VsdHM7XHJcbiAgICAgIHJldHVybiByZXM7XHJcbiAgICB9KVxyXG5cclxuICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyIGluIGNvbnRyYWN0c19Db250YWN0Ym9vayBjbGFzcyBcIiwgZXJyKTtcclxuICAgICAgcmV0dXJuIFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiO1xyXG4gICAgfSk7XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufTtcclxuXHJcbi8vZnVuY3Rpb24gZm9yIGdldHRpbmcgZG9jdW1lbnQgZGV0YWlscyBmcm9tIGNvbnRyYWN0X0RvY3VtZW50cyBjbGFzc1xyXG5leHBvcnQgY29uc3QgY29udHJhY3REb2N1bWVudCA9IGFzeW5jIChkb2N1bWVudElkKSA9PiB7XHJcbiAgY29uc3QgZGF0YSA9IHsgZG9jSWQ6IGRvY3VtZW50SWQgfTtcclxuICBjb25zdCBkb2N1bWVudERlYXRpbHMgPSBhd2FpdCBheGlvc1xyXG4gICAgLnBvc3QoYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfWZ1bmN0aW9ucy9nZXREb2N1bWVudGAsIGRhdGEsIHtcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXHJcbiAgICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAudGhlbigoTGlzdGRhdGEpID0+IHtcclxuICAgICAgY29uc3QganNvbiA9IExpc3RkYXRhLmRhdGE7XHJcbiAgICAgIGxldCBkYXRhID0gW107XHJcbiAgICAgIGlmIChqc29uICYmIGpzb24ucmVzdWx0LmVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgIH0gZWxzZSBpZiAoanNvbiAmJiBqc29uLnJlc3VsdCkge1xyXG4gICAgICAgIGRhdGEucHVzaChqc29uLnJlc3VsdCk7XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coXCJFcnIgaW4gZ2V0RG9jdW1lbnQgY2xvdWQgZnVuY3Rpb24gXCIsIGVycik7XHJcbiAgICAgIHJldHVybiBcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIjtcclxuICAgIH0pO1xyXG5cclxuICByZXR1cm4gZG9jdW1lbnREZWF0aWxzO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3IgYWRkIGRlZmF1bHQgc2lnbmF0dXJlIG9yIGltYWdlIGZvciBhbGwgcmVxdWVzdGVkIGxvY2F0aW9uXHJcbmV4cG9ydCBjb25zdCBhZGREZWZhdWx0U2lnbmF0dXJlSW1nID0gKHh5UG9zdGlvbiwgZGVmYXVsdFNpZ25JbWcpID0+IHtcclxuICBsZXQgaW1nV0ggPSB7IHdpZHRoOiBcIlwiLCBoZWlnaHQ6IFwiXCIgfTtcclxuICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICBpbWcuc3JjID0gZGVmYXVsdFNpZ25JbWc7XHJcbiAgaWYgKGltZy5jb21wbGV0ZSkge1xyXG4gICAgaW1nV0ggPSB7XHJcbiAgICAgIHdpZHRoOiBpbWcud2lkdGgsXHJcbiAgICAgIGhlaWdodDogaW1nLmhlaWdodFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGxldCB4eURlZmF1bHRQb3MgPSBbXTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IHh5UG9zdGlvbi5sZW5ndGg7IGkrKykge1xyXG4gICAgbGV0IGdldElNR1dIO1xyXG4gICAgY29uc3QgZ2V0WFlkYXRhID0geHlQb3N0aW9uW2ldLnBvcztcclxuICAgIGNvbnN0IGdldFBhZ2VObyA9IHh5UG9zdGlvbltpXS5wYWdlTnVtYmVyO1xyXG4gICAgY29uc3QgZ2V0UG9zRGF0YSA9IGdldFhZZGF0YTtcclxuXHJcbiAgICBjb25zdCBhZGRTaWduID0gZ2V0UG9zRGF0YS5tYXAoKHBvc2l0aW9uKSA9PiB7XHJcbiAgICAgIGdldElNR1dIID0gY2FsY3VsYXRlSW1nQXNwZWN0UmF0aW8oaW1nV0gsIHBvc2l0aW9uKTtcclxuICAgICAgaWYgKHBvc2l0aW9uLnR5cGUpIHtcclxuICAgICAgICBpZiAocG9zaXRpb24/LnR5cGUgPT09IFwic2lnbmF0dXJlXCIpIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgICBTaWduVXJsOiBkZWZhdWx0U2lnbkltZyxcclxuICAgICAgICAgICAgV2lkdGg6IGdldElNR1dILm5ld1dpZHRoLFxyXG4gICAgICAgICAgICBIZWlnaHQ6IGdldElNR1dILm5ld0hlaWdodCxcclxuICAgICAgICAgICAgSW1hZ2VUeXBlOiBcImRlZmF1bHRcIixcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IGRlZmF1bHRTaWduSW1nXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uICYmICFwb3NpdGlvbi5pc1N0YW1wKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnBvc2l0aW9uLFxyXG4gICAgICAgICAgU2lnblVybDogZGVmYXVsdFNpZ25JbWcsXHJcbiAgICAgICAgICBXaWR0aDogZ2V0SU1HV0gubmV3V2lkdGgsXHJcbiAgICAgICAgICBIZWlnaHQ6IGdldElNR1dILm5ld0hlaWdodCxcclxuICAgICAgICAgIEltYWdlVHlwZTogXCJkZWZhdWx0XCIsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLm9wdGlvbnMsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlOiBkZWZhdWx0U2lnbkltZ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgbmV3WHlwb3MgPSB7XHJcbiAgICAgIHBhZ2VOdW1iZXI6IGdldFBhZ2VObyxcclxuICAgICAgcG9zOiBhZGRTaWduXHJcbiAgICB9O1xyXG4gICAgeHlEZWZhdWx0UG9zLnB1c2gobmV3WHlwb3MpO1xyXG4gIH1cclxuICByZXR1cm4geHlEZWZhdWx0UG9zO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3IgY3JlYXRlIGxpc3Qgb2YgeWVhciBmb3IgZGF0ZSB3aWRnZXRcclxuZXhwb3J0IGNvbnN0IHJhbmdlID0gKHN0YXJ0LCBlbmQsIHN0ZXApID0+IHtcclxuICBjb25zdCByYW5nZSA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkgKz0gc3RlcCkge1xyXG4gICAgcmFuZ2UucHVzaChpKTtcclxuICB9XHJcbiAgcmV0dXJuIHJhbmdlO1xyXG59O1xyXG4vL2Z1bmN0aW9uIGZvciBnZXQgbW9udGhcclxuZXhwb3J0IGNvbnN0IGdldE1vbnRoID0gKGRhdGUpID0+IHtcclxuICBjb25zdCBuZXdNb250aCA9IG5ldyBEYXRlKGRhdGUpLmdldE1vbnRoKCk7XHJcbiAgcmV0dXJuIG5ld01vbnRoO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiBmb3IgZ2V0IHllYXJcclxuZXhwb3J0IGNvbnN0IGdldFllYXIgPSAoZGF0ZSkgPT4ge1xyXG4gIGNvbnN0IG5ld1llYXIgPSBuZXcgRGF0ZShkYXRlKS5nZXRGdWxsWWVhcigpO1xyXG4gIHJldHVybiBuZXdZZWFyO1xyXG59O1xyXG5cclxuLy9mdW5jdGlvbiB0byBjcmVhdGUvY29weSB3aWRnZXQgbmV4dCB0byBhbHJlYWR5IGRyb3BwZWQgd2lkZ2V0XHJcbmV4cG9ydCBjb25zdCBoYW5kbGVDb3B5TmV4dFRvV2lkZ2V0ID0gKFxyXG4gIHBvc2l0aW9uLFxyXG4gIHdpZGdldFR5cGUsXHJcbiAgeHlQb3N0aW9uLFxyXG4gIGluZGV4LFxyXG4gIHNldFh5UG9zdGlvbixcclxuICB1c2VySWRcclxuKSA9PiB7XHJcbiAgbGV0IGZpbHRlclNpZ25lclBvcztcclxuICAvL2dldCBwb3NpdGlvbiBvZiBwcmV2aW91cyB3aWRnZXQgYW5kIGNyZWF0ZSBuZXcgd2lkZ2V0IG5leHQgdG8gdGhhdCB3aWRnZXQgb24gc2FtZSBkYXRhIGV4Y2VwdFxyXG4gIC8vIHhQb3NpdGlvbiBhbmQga2V5XHJcbiAgbGV0IG5ld3Bvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgY29uc3QgY2FsY3VsYXRlWFBvc2l0aW9uID1cclxuICAgIHBhcnNlSW50KHBvc2l0aW9uLnhQb3NpdGlvbikgK1xyXG4gICAgZGVmYXVsdFdpZHRoSGVpZ2h0KHdpZGdldFR5cGUpLndpZHRoICtcclxuICAgIHJlc2l6ZUJvcmRlckV4dHJhV2lkdGgoKTtcclxuICBjb25zdCBuZXdJZCA9IHJhbmRvbUlkKCk7XHJcbiAgbmV3cG9zaXRpb24gPSB7IC4uLm5ld3Bvc2l0aW9uLCB4UG9zaXRpb246IGNhbGN1bGF0ZVhQb3NpdGlvbiwga2V5OiBuZXdJZCB9O1xyXG4gIC8vaWYgY29uZGl0aW9uIHRvIGNyZWF0ZSB3aWRnZXQgaW4gcmVxdWVzdC1zaWduIGZsb3dcclxuICBpZiAodXNlcklkKSB7XHJcbiAgICBmaWx0ZXJTaWduZXJQb3MgPSB4eVBvc3Rpb24uZmlsdGVyKChkYXRhKSA9PiBkYXRhLklkID09PSB1c2VySWQpO1xyXG4gICAgY29uc3QgZ2V0UGxhY2VIb2xkZXIgPSBmaWx0ZXJTaWduZXJQb3MgJiYgZmlsdGVyU2lnbmVyUG9zWzBdPy5wbGFjZUhvbGRlcjtcclxuICAgIGNvbnN0IGdldFBhZ2VOdW1lciA9IGdldFBsYWNlSG9sZGVyPy5maWx0ZXIoXHJcbiAgICAgIChkYXRhKSA9PiBkYXRhLnBhZ2VOdW1iZXIgPT09IGluZGV4XHJcbiAgICApO1xyXG4gICAgY29uc3QgZ2V0WFlkYXRhID0gZ2V0UGFnZU51bWVyICYmIGdldFBhZ2VOdW1lclswXT8ucG9zO1xyXG4gICAgZ2V0WFlkYXRhLnB1c2gobmV3cG9zaXRpb24pO1xyXG4gICAgaWYgKGdldFBhZ2VOdW1lciAmJiBnZXRQYWdlTnVtZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBuZXdVcGRhdGVTaWduUG9zID0gZ2V0UGxhY2VIb2xkZXIubWFwKChvYmopID0+IHtcclxuICAgICAgICBpZiAob2JqLnBhZ2VOdW1iZXIgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBvczogZ2V0WFlkYXRhIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY29uc3QgbmV3VXBkYXRlU2lnbmVyID0geHlQb3N0aW9uLm1hcCgob2JqKSA9PiB7XHJcbiAgICAgICAgaWYgKG9iai5JZCA9PT0gdXNlcklkKSB7XHJcbiAgICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBuZXdVcGRhdGVTaWduUG9zIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgc2V0WHlQb3N0aW9uKG5ld1VwZGF0ZVNpZ25lcik7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCBnZXRYWWRhdGEgPSB4eVBvc3Rpb25baW5kZXhdPy5wb3MgfHwgW107XHJcbiAgICBnZXRYWWRhdGEucHVzaChuZXdwb3NpdGlvbik7XHJcbiAgICBjb25zdCB1cGRhdGVQbGFjZWhvbGRlciA9IHh5UG9zdGlvbi5tYXAoKG9iaiwgaW5kKSA9PiB7XHJcbiAgICAgIGlmIChpbmQgPT09IGluZGV4KSB7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ub2JqLCBwb3M6IGdldFhZZGF0YSB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9KTtcclxuXHJcbiAgICBzZXRYeVBvc3Rpb24odXBkYXRlUGxhY2Vob2xkZXIpO1xyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGaWxlTmFtZSA9IChmaWxlVXJsKSA9PiB7XHJcbiAgaWYgKGZpbGVVcmwpIHtcclxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoZmlsZVVybCk7XHJcbiAgICBjb25zdCBmaWxlbmFtZSA9IHVybC5wYXRobmFtZS5zdWJzdHJpbmcodXJsLnBhdGhuYW1lLmluZGV4T2YoXCJfXCIpICsgMSk7XHJcbiAgICByZXR1cm4gZmlsZW5hbWUgfHwgXCJcIjtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG59O1xyXG5cclxuLy9mZXRjaCB0ZW5hbnQgYXBwIGxvZ28gZnJvbSBgcGFydG5lcnNfVGVuYW50YCBjbGFzcyBieSBkb21haW4gbmFtZVxyXG5leHBvcnQgY29uc3QgZ2V0QXBwTG9nbyA9IGFzeW5jICgpID0+IHtcclxuICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3QgPT09IFwiYXBwLm9wZW5zaWdubGFicy5jb21cIikge1xyXG4gICAgcmV0dXJuIHsgbG9nbzogYXBwSW5mby5hcHBsb2dvLCB1c2VyOiBcImV4aXN0XCIgfTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgZG9tYWluID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCBQYXJzZS5DbG91ZC5ydW4oXCJnZXRsb2dvYnlkb21haW5cIiwge1xyXG4gICAgICAgIGRvbWFpbjogZG9tYWluXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodGVuYW50KSB7XHJcbiAgICAgICAgcmV0dXJuIHsgbG9nbzogdGVuYW50Py5sb2dvLCB1c2VyOiB0ZW5hbnQ/LnVzZXIgfTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGdldGxvZ28gXCIsIGVycik7XHJcbiAgICAgIHJldHVybiB7IGxvZ286IGFwcEluZm8uYXBwbG9nbywgdXNlcjogXCJleGlzdFwiIH07XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFRlbmFudERldGFpbHMgPSBhc3luYyAob2JqZWN0SWQpID0+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgdGVuYW50Q3JlZGl0c1F1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwicGFydG5lcnNfVGVuYW50XCIpO1xyXG4gICAgdGVuYW50Q3JlZGl0c1F1ZXJ5LmVxdWFsVG8oXCJVc2VySWRcIiwge1xyXG4gICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxyXG4gICAgICBjbGFzc05hbWU6IFwiX1VzZXJcIixcclxuICAgICAgb2JqZWN0SWQ6IG9iamVjdElkXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRlbmFudENyZWRpdHNRdWVyeS5maXJzdCgpO1xyXG4gICAgaWYgKHJlcykge1xyXG4gICAgICBjb25zdCB1cGRhdGVSZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpO1xyXG4gICAgICByZXR1cm4gdXBkYXRlUmVzO1xyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIHJldHVybiBcInVzZXIgZG9lcyBub3QgZXhpc3QhXCI7XHJcbiAgfVxyXG59O1xyXG5cclxuLy9mdW5jdGlvbiB0byBjb252ZXJ0IHZhcmlhYmxlIHN0cmluZyBuYW1lIHRvIHZhcmlhYmxlIHZhbHVlIG9mIGVtYWlsIGJvZHkgYW5kIHN1YmplY3RcclxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VNYWlsVmFyaWJsZXMoc3ViamVjdCwgYm9keSwgdmFyaWFibGVzKSB7XHJcbiAgbGV0IHJlcGxhY2VkU3ViamVjdCA9IHN1YmplY3Q7XHJcbiAgbGV0IHJlcGxhY2VkQm9keSA9IGJvZHk7XHJcblxyXG4gIGZvciAoY29uc3QgdmFyaWFibGUgaW4gdmFyaWFibGVzKSB7XHJcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYHt7JHt2YXJpYWJsZX19fWAsIFwiZ1wiKTtcclxuICAgIGlmIChzdWJqZWN0KSB7XHJcbiAgICAgIHJlcGxhY2VkU3ViamVjdCA9IHJlcGxhY2VkU3ViamVjdC5yZXBsYWNlKHJlZ2V4LCB2YXJpYWJsZXNbdmFyaWFibGVdKTtcclxuICAgIH1cclxuICAgIGlmIChib2R5KSB7XHJcbiAgICAgIHJlcGxhY2VkQm9keSA9IHJlcGxhY2VkQm9keS5yZXBsYWNlKHJlZ2V4LCB2YXJpYWJsZXNbdmFyaWFibGVdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc3VsdCA9IHtcclxuICAgIHN1YmplY3Q6IHJlcGxhY2VkU3ViamVjdCxcclxuICAgIGJvZHk6IHJlcGxhY2VkQm9keVxyXG4gIH07XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNvcHl0b0RhdGEgPSAodXJsKSA9PiB7XHJcbiAgLy8gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCk7XHJcbiAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQpIHtcclxuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHVybCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIEZhbGxiYWNrIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgbmF2aWdhdG9yLmNsaXBib2FyZFxyXG4gICAgY29uc3QgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XHJcbiAgICB0ZXh0QXJlYS52YWx1ZSA9IHVybDtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dEFyZWEpO1xyXG4gICAgdGV4dEFyZWEuc2VsZWN0KCk7XHJcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRleHRBcmVhKTtcclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgY29udmVydFBkZkFycmF5QnVmZmVyID0gYXN5bmMgKHVybCkgPT4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XHJcbiAgICAvLyBDaGVjayBpZiB0aGUgcmVzcG9uc2Ugd2FzIHN1Y2Nlc3NmdWwgKHN0YXR1cyAyMDApXHJcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgIHJldHVybiBcIkVycm9yXCI7XHJcbiAgICB9XHJcbiAgICAvLyBDb252ZXJ0IHRoZSByZXNwb25zZSB0byBBcnJheUJ1ZmZlclxyXG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gICAgcmV0dXJuIGFycmF5QnVmZmVyO1xyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgZGF0YTpcIiwgZXJyb3IpO1xyXG4gICAgcmV0dXJuIFwiRXJyb3JcIjtcclxuICB9XHJcbn07XHJcbi8vYGhhbmRsZVNlbmRPVFBgIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBvdHAgb24gdXNlcidzIGVtYWlsIHVzaW5nIGBTZW5kT1RQTWFpbFYxYCBjbG91ZCBmdW5jdGlvblxyXG5leHBvcnQgY29uc3QgaGFuZGxlU2VuZE9UUCA9IGFzeW5jIChlbWFpbCkgPT4ge1xyXG4gIHRyeSB7XHJcbiAgICBsZXQgdXJsID0gYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpfWZ1bmN0aW9ucy9TZW5kT1RQTWFpbFYxYDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpXHJcbiAgICB9O1xyXG4gICAgY29uc3QgYm9keSA9IHsgZW1haWw6IGVtYWlsIH07XHJcbiAgICBhd2FpdCBheGlvcy5wb3N0KHVybCwgYm9keSwgeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICBhbGVydChlcnJvci5tZXNzYWdlKTtcclxuICB9XHJcbn07XHJcbmV4cG9ydCBjb25zdCBmZXRjaFVybCA9IGFzeW5jICh1cmwsIHBkZk5hbWUpID0+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xyXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTmV0d29yayByZXNwb25zZSB3YXMgbm90IG9rXCIpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcclxuICAgIHNhdmVBcyhibG9iLCBgJHtzYW5pdGl6ZUZpbGVOYW1lKHBkZk5hbWUpfV9zaWduZWRfYnlfT3BlblNpZ27ihKIucGRmYCk7XHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIGFsZXJ0KFwic29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCIpO1xyXG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGRvd25sb2FkaW5nIHRoZSBmaWxlOlwiLCBlcnJvcik7XHJcbiAgfVxyXG59O1xyXG4vL2hhbmRsZSBkb3dubG9hZCBzaWduZWQgcGRmXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVEb3dubG9hZFBkZiA9IGFzeW5jIChwZGZEZXRhaWxzLCBzZXRJc0Rvd25sb2FkaW5nKSA9PiB7XHJcbiAgY29uc3QgcGRmTmFtZSA9IHBkZkRldGFpbHNbMF0gJiYgcGRmRGV0YWlsc1swXT8uTmFtZTtcclxuICBjb25zdCBwZGZVcmwgPSBwZGZEZXRhaWxzPy5bMF0/LlNpZ25lZFVybCB8fCBwZGZEZXRhaWxzPy5bMF0/LlVSTDtcclxuICBzZXRJc0Rvd25sb2FkaW5nKFwicGRmXCIpO1xyXG4gIGNvbnN0IGRvY0lkID0gIXBkZkRldGFpbHM/LlswXT8uSXNFbmFibGVPVFAgPyBwZGZEZXRhaWxzPy5bMF0/Lm9iamVjdElkIDogXCJcIjtcclxuICB0cnkge1xyXG4gICAgLy8gY29uc3QgdXJsID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwiZ2V0c2lnbmVkdXJsXCIsIHsgdXJsOiBwZGZVcmwgfSk7XHJcbiAgICBjb25zdCBheGlvc1JlcyA9IGF3YWl0IGF4aW9zLnBvc3QoXHJcbiAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX0vZnVuY3Rpb25zL2dldHNpZ25lZHVybGAsXHJcbiAgICAgIHsgdXJsOiBwZGZVcmwsIGRvY0lkOiBkb2NJZCB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJBcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIGNvbnN0IHVybCA9IGF4aW9zUmVzLmRhdGEucmVzdWx0O1xyXG4gICAgYXdhaXQgZmV0Y2hVcmwodXJsLCBwZGZOYW1lKTtcclxuICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcImVyciBpbiBnZXRzaWduZWR1cmxcIiwgZXJyKTtcclxuICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XHJcbiAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc2FuaXRpemVGaWxlTmFtZSA9IChwZGZOYW1lKSA9PiB7XHJcbiAgLy8gUmVwbGFjZSBzcGFjZXMgd2l0aCB1bmRlcnNjb3JlXHJcbiAgcmV0dXJuIHBkZk5hbWUucmVwbGFjZSgvIC9nLCBcIl9cIik7XHJcbn07XHJcbi8vZnVuY3Rpb24gZm9yIHByaW50IGRpZ2l0YWwgc2lnbiBwZGZcclxuZXhwb3J0IGNvbnN0IGhhbmRsZVRvUHJpbnQgPSBhc3luYyAoXHJcbiAgZXZlbnQsXHJcbiAgcGRmVXJsLFxyXG4gIHNldElzRG93bmxvYWRpbmcsXHJcbiAgcGRmRGV0YWlsc1xyXG4pID0+IHtcclxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIHNldElzRG93bmxvYWRpbmcoXCJwZGZcIik7XHJcbiAgY29uc3QgZG9jSWQgPSAhcGRmRGV0YWlscz8uWzBdPy5Jc0VuYWJsZU9UUCA/IHBkZkRldGFpbHM/LlswXT8ub2JqZWN0SWQgOiBcIlwiO1xyXG4gIHRyeSB7XHJcbiAgICAvLyBjb25zdCB1cmwgPSBhd2FpdCBQYXJzZS5DbG91ZC5ydW4oXCJnZXRzaWduZWR1cmxcIiwgeyB1cmw6IHBkZlVybCB9KTtcclxuICAgIC8vYGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKWAgaXMgYWxzbyB1c2UgaW4gcHVibGljLXByb2ZpbGUgZmxvdyBmb3IgcHVibGljLXNpZ25cclxuICAgIC8vaWYgd2UgZ2l2ZSB0aGlzIGBhcHBJbmZvLmJhc2VVcmxgIGFzIGEgYmFzZSB1cmwgdGhlbiBpbiBwdWJsaWMtcHJvZmlsZSBpdCB3aWxsIGNyZWF0ZSBiYXNlIHVybCBvZiBpdCdzIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gZXgtIG9wZW5zaWduLm1lIHdoaWNoIGlzIG5vdCBiYXNlIHVybFxyXG4gICAgY29uc3QgYXhpb3NSZXMgPSBhd2FpdCBheGlvcy5wb3N0KFxyXG4gICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9L2Z1bmN0aW9ucy9nZXRzaWduZWR1cmxgLFxyXG4gICAgICB7IHVybDogcGRmVXJsLCBkb2NJZDogZG9jSWQgfSxcclxuICAgICAge1xyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgIFwiY29udGVudC10eXBlXCI6IFwiQXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBjb25zdCB1cmwgPSBheGlvc1Jlcy5kYXRhLnJlc3VsdDtcclxuICAgIGNvbnN0IHBkZiA9IGF3YWl0IGdldEJhc2U2NEZyb21VcmwodXJsKTtcclxuICAgIGNvbnN0IGlzQW5kcm9pZERldmljZSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSk7XHJcbiAgICBjb25zdCBpc0FwcGxlRGV2aWNlID1cclxuICAgICAgKC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgfHxcclxuICAgICAgICAobmF2aWdhdG9yLnBsYXRmb3JtID09PSBcIk1hY0ludGVsXCIgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMSkpICYmXHJcbiAgICAgICF3aW5kb3cuTVNTdHJlYW07XHJcbiAgICBpZiAoaXNBbmRyb2lkRGV2aWNlIHx8IGlzQXBwbGVEZXZpY2UpIHtcclxuICAgICAgY29uc3QgYnl0ZUFycmF5ID0gVWludDhBcnJheS5mcm9tKFxyXG4gICAgICAgIGF0b2IocGRmKVxyXG4gICAgICAgICAgLnNwbGl0KFwiXCIpXHJcbiAgICAgICAgICAubWFwKChjaGFyKSA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnl0ZUFycmF5XSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3BkZlwiIH0pO1xyXG4gICAgICBjb25zdCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAgd2luZG93Lm9wZW4oYmxvYlVybCwgXCJfYmxhbmtcIik7XHJcbiAgICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcmludE1vZHVsZSh7IHByaW50YWJsZTogcGRmLCB0eXBlOiBcInBkZlwiLCBiYXNlNjQ6IHRydWUgfSk7XHJcbiAgICAgIHNldElzRG93bmxvYWRpbmcoXCJcIik7XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBzZXRJc0Rvd25sb2FkaW5nKFwiXCIpO1xyXG4gICAgY29uc29sZS5sb2coXCJlcnIgaW4gZ2V0c2lnbmVkdXJsXCIsIGVycik7XHJcbiAgICBhbGVydChcInNvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLlwiKTtcclxuICB9XHJcbn07XHJcblxyXG4vL2hhbmRsZSBkb3dubG9hZCBzaWduZWQgcGRmXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlID0gYXN5bmMgKFxyXG4gIHBkZkRldGFpbHMsXHJcbiAgc2V0SXNEb3dubG9hZGluZyxcclxuICBpc1ppcFxyXG4pID0+IHtcclxuICBpZiAocGRmRGV0YWlscz8ubGVuZ3RoID4gMCAmJiBwZGZEZXRhaWxzWzBdPy5DZXJ0aWZpY2F0ZVVybCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgZmV0Y2gocGRmRGV0YWlsc1swXSAmJiBwZGZEZXRhaWxzWzBdPy5DZXJ0aWZpY2F0ZVVybCk7XHJcbiAgICAgIGNvbnN0IGNlcnRpZmljYXRlVXJsID0gcGRmRGV0YWlsc1swXSAmJiBwZGZEZXRhaWxzWzBdPy5DZXJ0aWZpY2F0ZVVybDtcclxuICAgICAgaWYgKGlzWmlwKSB7XHJcbiAgICAgICAgcmV0dXJuIGNlcnRpZmljYXRlVXJsO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNhdmVBcyhjZXJ0aWZpY2F0ZVVybCwgYENlcnRpZmljYXRlX3NpZ25lZF9ieV9PcGVuU2lnbuKEoi5wZGZgKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGRvd25sb2FkIGluIGNlcnRpZmljYXRlXCIsIGVycik7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHNldElzRG93bmxvYWRpbmcoXCJjZXJ0aWZpY2F0ZVwiKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgZG9jSWQ6IHBkZkRldGFpbHNbMF0/Lm9iamVjdElkXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IGRvY0RldGFpbHMgPSBhd2FpdCBheGlvcy5wb3N0KFxyXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvZ2V0RG9jdW1lbnRgLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgICAgc2Vzc2lvblRva2VuOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoZG9jRGV0YWlscy5kYXRhICYmIGRvY0RldGFpbHMuZGF0YS5yZXN1bHQpIHtcclxuICAgICAgICBjb25zdCBkb2MgPSBkb2NEZXRhaWxzLmRhdGEucmVzdWx0O1xyXG4gICAgICAgIGlmIChkb2M/LkNlcnRpZmljYXRlVXJsKSB7XHJcbiAgICAgICAgICBhd2FpdCBmZXRjaChkb2M/LkNlcnRpZmljYXRlVXJsKTtcclxuICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlVXJsID0gZG9jPy5DZXJ0aWZpY2F0ZVVybDtcclxuICAgICAgICAgIGlmIChpc1ppcCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2VydGlmaWNhdGVVcmw7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzYXZlQXMoY2VydGlmaWNhdGVVcmwsIGBDZXJ0aWZpY2F0ZV9zaWduZWRfYnlfT3BlblNpZ27ihKIucGRmYCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc2V0SXNEb3dubG9hZGluZyhcIlwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2V0SXNEb3dubG9hZGluZyhcImNlcnRpZmljYXRlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyIGluIGRvd25sb2FkIGluIGNlcnRpZmljYXRlXCIsIGVycik7XHJcbiAgICAgIGFsZXJ0KFwic29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXCIpO1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRDb250YWN0KHZhbHVlKSB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gUGFyc2UuVXNlci5jdXJyZW50KCk7XHJcbiAgICBjb25zdCBjb250YWN0Ym9vayA9IG5ldyBQYXJzZS5RdWVyeShcImNvbnRyYWN0c19Db250YWN0Ym9va1wiKTtcclxuICAgIGNvbnRhY3Rib29rLmVxdWFsVG8oXHJcbiAgICAgIFwiQ3JlYXRlZEJ5XCIsXHJcbiAgICAgIFBhcnNlLlVzZXIuY3JlYXRlV2l0aG91dERhdGEoY3VycmVudFVzZXIuaWQpXHJcbiAgICApO1xyXG4gICAgY29udGFjdGJvb2subm90RXF1YWxUbyhcIklzRGVsZXRlZFwiLCB0cnVlKTtcclxuICAgIGNvbnRhY3Rib29rLm1hdGNoZXMoXCJFbWFpbFwiLCBuZXcgUmVnRXhwKHZhbHVlLCBcImlcIikpO1xyXG5cclxuICAgIGNvbnN0IGNvbnRhY3RSZXMgPSBhd2FpdCBjb250YWN0Ym9vay5maW5kKCk7XHJcbiAgICBpZiAoY29udGFjdFJlcykge1xyXG4gICAgICBjb25zdCByZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbnRhY3RSZXMpKTtcclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIHN1Z2dlc3Rpb25zOlwiLCBlcnJvcik7XHJcbiAgfVxyXG59XHJcbi8vIGBjb21wZW5zYXRlUm90YXRpb25gIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHggYW5kIHkgcG9zaXRpb24gb2Ygd2lkZ2V0IG9uIHBvcnRhaXQsIGxhbmRzY2FwZSBwZGYgZm9yIHBkZi1saWJcclxuZnVuY3Rpb24gY29tcGVuc2F0ZVJvdGF0aW9uKFxyXG4gIHBhZ2VSb3RhdGlvbixcclxuICB4LFxyXG4gIHksXHJcbiAgc2NhbGUsXHJcbiAgZGltZW5zaW9ucyxcclxuICBmb250U2l6ZSxcclxuICB1cGRhdGVDb2xvckluUmdiLFxyXG4gIGZvbnQsXHJcbiAgcGFnZVxyXG4pIHtcclxuICAvLyBFbnN1cmUgcGFnZVJvdGF0aW9uIGlzIGJldHdlZW4gMCBhbmQgMzYwIGRlZ3JlZXNcclxuICBwYWdlUm90YXRpb24gPSAoKHBhZ2VSb3RhdGlvbiAlIDM2MCkgKyAzNjApICUgMzYwO1xyXG4gIGxldCByb3RhdGlvblJhZHMgPSAocGFnZVJvdGF0aW9uICogTWF0aC5QSSkgLyAxODA7XHJcblxyXG4gIC8vIENvb3JkaW5hdGVzIGFyZSBmcm9tIGJvdHRvbS1sZWZ0XHJcbiAgbGV0IGNvb3Jkc0Zyb21Cb3R0b21MZWZ0ID0geyB4OiB4IC8gc2NhbGUgfTtcclxuICBpZiAocGFnZVJvdGF0aW9uID09PSA5MCB8fCBwYWdlUm90YXRpb24gPT09IDI3MCkge1xyXG4gICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSA9IGRpbWVuc2lvbnMud2lkdGggLSAoeSArIGZvbnRTaXplKSAvIHNjYWxlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb29yZHNGcm9tQm90dG9tTGVmdC55ID0gZGltZW5zaW9ucy5oZWlnaHQgLSAoeSArIGZvbnRTaXplKSAvIHNjYWxlO1xyXG4gIH1cclxuXHJcbiAgbGV0IGRyYXdYID0gbnVsbDtcclxuICBsZXQgZHJhd1kgPSBudWxsO1xyXG5cclxuICBpZiAocGFnZVJvdGF0aW9uID09PSA5MCkge1xyXG4gICAgZHJhd1ggPVxyXG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC54ICogTWF0aC5jb3Mocm90YXRpb25SYWRzKSAtXHJcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLnNpbihyb3RhdGlvblJhZHMpICtcclxuICAgICAgZGltZW5zaW9ucy53aWR0aDtcclxuICAgIGRyYXdZID1cclxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueCAqIE1hdGguc2luKHJvdGF0aW9uUmFkcykgK1xyXG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC55ICogTWF0aC5jb3Mocm90YXRpb25SYWRzKTtcclxuICB9IGVsc2UgaWYgKHBhZ2VSb3RhdGlvbiA9PT0gMTgwKSB7XHJcbiAgICBkcmF3WCA9XHJcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnggKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpIC1cclxuICAgICAgY29vcmRzRnJvbUJvdHRvbUxlZnQueSAqIE1hdGguc2luKHJvdGF0aW9uUmFkcykgK1xyXG4gICAgICBkaW1lbnNpb25zLndpZHRoO1xyXG4gICAgZHJhd1kgPVxyXG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC54ICogTWF0aC5zaW4ocm90YXRpb25SYWRzKSArXHJcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpICtcclxuICAgICAgZGltZW5zaW9ucy5oZWlnaHQ7XHJcbiAgfSBlbHNlIGlmIChwYWdlUm90YXRpb24gPT09IDI3MCkge1xyXG4gICAgZHJhd1ggPVxyXG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC54ICogTWF0aC5jb3Mocm90YXRpb25SYWRzKSAtXHJcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLnNpbihyb3RhdGlvblJhZHMpO1xyXG4gICAgZHJhd1kgPVxyXG4gICAgICBjb29yZHNGcm9tQm90dG9tTGVmdC54ICogTWF0aC5zaW4ocm90YXRpb25SYWRzKSArXHJcbiAgICAgIGNvb3Jkc0Zyb21Cb3R0b21MZWZ0LnkgKiBNYXRoLmNvcyhyb3RhdGlvblJhZHMpICtcclxuICAgICAgZGltZW5zaW9ucy5oZWlnaHQ7XHJcbiAgfSBlbHNlIGlmIChwYWdlUm90YXRpb24gPT09IDAgfHwgcGFnZVJvdGF0aW9uID09PSAzNjApIHtcclxuICAgIC8vIE5vIHJvdGF0aW9uIG9yIGZ1bGwgcm90YXRpb25cclxuICAgIGRyYXdYID0gY29vcmRzRnJvbUJvdHRvbUxlZnQueDtcclxuICAgIGRyYXdZID0gY29vcmRzRnJvbUJvdHRvbUxlZnQueTtcclxuICB9XHJcbiAgaWYgKGZvbnQpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHg6IGRyYXdYLFxyXG4gICAgICB5OiBkcmF3WSxcclxuICAgICAgZm9udCxcclxuICAgICAgY29sb3I6IHVwZGF0ZUNvbG9ySW5SZ2IsXHJcbiAgICAgIHNpemU6IGZvbnRTaXplLFxyXG4gICAgICByb3RhdGU6IHBhZ2UuZ2V0Um90YXRpb24oKVxyXG4gICAgfTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHsgeDogZHJhd1gsIHk6IGRyYXdZIH07XHJcbiAgfVxyXG59XHJcblxyXG4vLyBgZ2V0V2lkZ2V0UG9zaXRpb25gIGlzIHVzZWQgdG8gY2FsdWxjYXRlIHBvc2l0aW9uIG9mIGltYWdlIHR5cGUgd2lkZ2V0IGxpa2UgeCwgeSwgd2lkdGgsIGhlaWdodCBmb3IgcGRmLWxpYlxyXG5mdW5jdGlvbiBnZXRXaWRnZXRQb3NpdGlvbihwYWdlLCBpbWFnZSwgc2l6ZVJhdGlvKSB7XHJcbiAgbGV0IHBhZ2VXaWR0aDtcclxuICAvLyBwYWdlSGVpZ2h0O1xyXG4gIGlmIChbOTAsIDI3MF0uaW5jbHVkZXMocGFnZS5nZXRSb3RhdGlvbigpLmFuZ2xlKSkge1xyXG4gICAgcGFnZVdpZHRoID0gcGFnZS5nZXRIZWlnaHQoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgcGFnZVdpZHRoID0gcGFnZS5nZXRXaWR0aCgpO1xyXG4gIH1cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICBpZiAoIWltYWdlPy5oYXNPd25Qcm9wZXJ0eShcInZwV2lkdGhcIikpIHtcclxuICAgIGltYWdlW1widnBXaWR0aFwiXSA9IHBhZ2VXaWR0aDtcclxuICB9XHJcblxyXG4gIGNvbnN0IHBhZ2VSYXRpbyA9IHBhZ2VXaWR0aCAvIChpbWFnZS52cFdpZHRoICogc2l6ZVJhdGlvKTtcclxuICBjb25zdCBpbWFnZVdpZHRoID0gaW1hZ2Uud2lkdGggKiBzaXplUmF0aW8gKiBwYWdlUmF0aW87XHJcbiAgY29uc3QgaW1hZ2VIZWlnaHQgPSBpbWFnZS5oZWlnaHQgKiBzaXplUmF0aW8gKiBwYWdlUmF0aW87XHJcbiAgY29uc3QgaW1hZ2VYID0gaW1hZ2UueCAqIHNpemVSYXRpbyAqIHBhZ2VSYXRpbztcclxuICBjb25zdCBpbWFnZVlGcm9tVG9wID0gaW1hZ2UueSAqIHNpemVSYXRpbyAqIHBhZ2VSYXRpbztcclxuXHJcbiAgY29uc3QgY29ycmVjdGlvbiA9IGNvbXBlbnNhdGVSb3RhdGlvbihcclxuICAgIHBhZ2UuZ2V0Um90YXRpb24oKS5hbmdsZSxcclxuICAgIGltYWdlWCxcclxuICAgIGltYWdlWUZyb21Ub3AsXHJcbiAgICAxLFxyXG4gICAgcGFnZS5nZXRTaXplKCksXHJcbiAgICBpbWFnZUhlaWdodFxyXG4gICk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB3aWR0aDogaW1hZ2VXaWR0aCxcclxuICAgIGhlaWdodDogaW1hZ2VIZWlnaHQsXHJcbiAgICB4OiBjb3JyZWN0aW9uLngsXHJcbiAgICB5OiBjb3JyZWN0aW9uLnksXHJcbiAgICByb3RhdGU6IHBhZ2UuZ2V0Um90YXRpb24oKVxyXG4gIH07XHJcbn1cclxuLy9mdW5jdGlvbiB0byB1c2UgY2FsY3VsYXRlIHBkZiByZW5kZXJpbmcgc2NhbGUgaW4gdGhlIGNvbnRhaW5lclxyXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyU2NhbGUgPSAocGRmT3JpZ2luYWxXSCwgcGFnZU51bWJlciwgY29udGFpbmVyV0gpID0+IHtcclxuICBjb25zdCBnZXRQZGZQYWdlV2lkdGggPSBwZGZPcmlnaW5hbFdILmZpbmQoXHJcbiAgICAoZGF0YSkgPT4gZGF0YS5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyXHJcbiAgKTtcclxuICBjb25zdCBjb250YWluZXJTY2FsZSA9IGNvbnRhaW5lcldIPy53aWR0aCAvIGdldFBkZlBhZ2VXaWR0aD8ud2lkdGggfHwgMTtcclxuICByZXR1cm4gY29udGFpbmVyU2NhbGU7XHJcbn07XHJcblxyXG4vL2Z1bmN0aW9uIHRvIGdldCBjdXJyZW50IGxhZ3VhZ2UgYW5kIHNldCBpdCBpbiBsb2NhbFxyXG5leHBvcnQgY29uc3Qgc2F2ZUxhbmd1YWdlSW5Mb2NhbCA9IChpMThuKSA9PiB7XHJcbiAgY29uc3QgZGV0ZWN0ZWRMYW5ndWFnZSA9IGkxOG4ubGFuZ3VhZ2UgfHwgXCJlblwiO1xyXG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaTE4bmV4dExuZ1wiLCBkZXRlY3RlZExhbmd1YWdlKTtcclxufTtcclxuLy9mdW5jdGlvbiB0byBnZXQgZGVmYXVsdCBzaWduYXR1ciBlb2YgY3VycmVudCB1c2VyIGZyb20gYGNvbnRyYWN0c19TaWduYXR1cmVgIGNsYXNzXHJcbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0U2lnbmF0dXJlID0gYXN5bmMgKG9iamVjdElkKSA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiY29udHJhY3RzX1NpZ25hdHVyZVwiKTtcclxuICAgIHF1ZXJ5LmVxdWFsVG8oXCJVc2VySWRcIiwge1xyXG4gICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxyXG4gICAgICBjbGFzc05hbWU6IFwiX1VzZXJcIixcclxuICAgICAgb2JqZWN0SWQ6IG9iamVjdElkXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBxdWVyeS5maXJzdCgpO1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICBjb25zdCByZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xyXG4gICAgICBjb25zdCBkZWZhdWx0U2lnbmF0dXJlID0gcmVzPy5JbWFnZVVSTFxyXG4gICAgICAgID8gYXdhaXQgZ2V0QmFzZTY0RnJvbVVybChyZXM/LkltYWdlVVJMLCB0cnVlKVxyXG4gICAgICAgIDogXCJcIjtcclxuICAgICAgY29uc3QgZGVmYXVsdEluaXRpYWwgPSByZXM/LkluaXRpYWxzXHJcbiAgICAgICAgPyBhd2FpdCBnZXRCYXNlNjRGcm9tVXJsKHJlcz8uSW5pdGlhbHMsIHRydWUpXHJcbiAgICAgICAgOiBcIlwiO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxyXG4gICAgICAgIHJlczoge1xyXG4gICAgICAgICAgZGVmYXVsdFNpZ25hdHVyZTogZGVmYXVsdFNpZ25hdHVyZSxcclxuICAgICAgICAgIGRlZmF1bHRJbml0aWFsOiBkZWZhdWx0SW5pdGlhbFxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH1cclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiRXJyb3I6IGVycm9yIGluIGZldGNoIGRhdGEgaW4gY29udHJhY3RzX1NpZ25hdHVyZVwiLCBlcnIpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RhdHVzOiBcImVycm9yXCJcclxuICAgIH07XHJcbiAgfVxyXG59O1xyXG5cclxuLy9mdW5jdGlvbiB0byByb3RhdGUgcGRmIHBhZ2VcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJvdGF0ZVBkZlBhZ2UoXHJcbiAgdXJsLFxyXG4gIHJvdGF0ZURlZ3JlZSxcclxuICBwYWdlTnVtYmVyLFxyXG4gIHBkZlJvdGF0ZUJhc2U2NFxyXG4pIHtcclxuICBsZXQgZmlsZTtcclxuXHJcbiAgLy9jb25kaXRpb24gdG8gaGFuZGxlIHBkZiBiYXNlNjQgaW4gYXJyYXlCdWZmZXIgZm9ybWF0XHJcbiAgaWYgKHBkZlJvdGF0ZUJhc2U2NCkge1xyXG4gICAgZmlsZSA9IGJhc2U2NFRvQXJyYXlCdWZmZXIocGRmUm90YXRlQmFzZTY0KTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy9jb25kaXRpb24gdG8gaGFuZGxlIHBkZiB1cmwgaW4gYXJyYXlCdWZmZXIgZm9ybWF0XHJcbiAgICBmaWxlID0gYXdhaXQgY29udmVydFBkZkFycmF5QnVmZmVyKHVybCk7XHJcbiAgfVxyXG4gIC8vIExvYWQgdGhlIGV4aXN0aW5nIFBERlxyXG4gIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoZmlsZSk7XHJcbiAgLy8gR2V0IHRoZSBwYWdlIGFjY29yZGluZyB0byBwYWdlIG51bWJlclxyXG4gIGNvbnN0IHBhZ2UgPSBwZGZEb2MuZ2V0UGFnZShwYWdlTnVtYmVyKTtcclxuICAvL2dldCBjdXJyZW50IHBhZ2Ugcm90YXRpb24gYW5nbGVcclxuICBjb25zdCBjdXJyZW50Um90YXRpb24gPSBwYWdlLmdldFJvdGF0aW9uKCkuYW5nbGU7XHJcbiAgLy8gQXBwbHkgdGhlIHJvdGF0aW9uIGluIHRoZSBjb3VudGVyY2xvY2t3aXNlIGRpcmVjdGlvblxyXG4gIGxldCBuZXdSb3RhdGlvbiA9IChjdXJyZW50Um90YXRpb24gKyByb3RhdGVEZWdyZWUpICUgMzYwO1xyXG4gIC8vIEFkanVzdCBmb3IgbmVnYXRpdmUgYW5nbGVzIHRvIGtlZXAgd2l0aGluIDAtMzU5IHJhbmdlXHJcbiAgaWYgKG5ld1JvdGF0aW9uIDwgMCkge1xyXG4gICAgbmV3Um90YXRpb24gKz0gMzYwO1xyXG4gIH1cclxuICBwYWdlLnNldFJvdGF0aW9uKGRlZ3JlZXMobmV3Um90YXRpb24pKTtcclxuICBjb25zdCBwZGZiYXNlNjQgPSBhd2FpdCBwZGZEb2Muc2F2ZUFzQmFzZTY0KHsgdXNlT2JqZWN0U3RyZWFtczogZmFsc2UgfSk7XHJcbiAgLy9jb252ZXJ0IGJhc2U2NCB0byBhcnJheWJ1ZmZlciBpcyB1c2VkIGluIHBkZi1saWJcclxuICAvL3BkZmJhc2U2NCBpcyB1c2VkIHRvIHNob3cgcGRmIHJvdGF0ZWQgZm9ybWF0XHJcbiAgY29uc3QgYXJyYXlCdWZmZXIgPSBiYXNlNjRUb0FycmF5QnVmZmVyKHBkZmJhc2U2NCk7XHJcbiAgLy9gYmFzZTY0YCBpcyB1c2VkIHRvIHNob3cgcGRmXHJcbiAgcmV0dXJuIHsgYXJyYXlCdWZmZXI6IGFycmF5QnVmZmVyLCBiYXNlNjQ6IHBkZmJhc2U2NCB9O1xyXG59XHJcbmZ1bmN0aW9uIGJhc2U2NFRvQXJyYXlCdWZmZXIoYmFzZTY0KSB7XHJcbiAgLy8gRGVjb2RlIHRoZSBiYXNlNjQgc3RyaW5nIHRvIGEgYmluYXJ5IHN0cmluZ1xyXG4gIGNvbnN0IGJpbmFyeVN0cmluZyA9IGF0b2IoYmFzZTY0KTtcclxuICAvLyBDcmVhdGUgYSBuZXcgQXJyYXlCdWZmZXIgd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIGJpbmFyeSBzdHJpbmdcclxuICBjb25zdCBsZW4gPSBiaW5hcnlTdHJpbmcubGVuZ3RoO1xyXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcclxuICAvLyBDb252ZXJ0IHRoZSBiaW5hcnkgc3RyaW5nIHRvIGEgYnl0ZSBhcnJheVxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgIGJ5dGVzW2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgfVxyXG4gIC8vIFJldHVybiB0aGUgQXJyYXlCdWZmZXJcclxuICByZXR1cm4gYnl0ZXMuYnVmZmVyO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY29udmVydEJhc2U2NFRvRmlsZSA9IGFzeW5jIChwZGZOYW1lLCBwZGZCYXNlNjQpID0+IHtcclxuICBjb25zdCBmaWxlTmFtZSA9IHNhbml0aXplRmlsZU5hbWUocGRmTmFtZSkgKyBcIi5wZGZcIjtcclxuICBjb25zdCBwZGZGaWxlID0gbmV3IFBhcnNlLkZpbGUoZmlsZU5hbWUsIHsgYmFzZTY0OiBwZGZCYXNlNjQgfSk7XHJcbiAgLy8gU2F2ZSB0aGUgUGFyc2UgRmlsZSBpZiBuZWVkZWRcclxuICBjb25zdCBwZGZEYXRhID0gYXdhaXQgcGRmRmlsZS5zYXZlKCk7XHJcbiAgY29uc3QgcGRmVXJsID0gcGRmRGF0YS51cmwoKTtcclxuICByZXR1cm4gcGRmVXJsO1xyXG59O1xyXG5leHBvcnQgY29uc3Qgb25DbGlja1pvb21JbiA9IChzY2FsZSwgem9vbVBlcmNlbnQsIHNldFNjYWxlLCBzZXRab29tUGVyY2VudCkgPT4ge1xyXG4gIHNldFNjYWxlKHNjYWxlICsgMC4xICogc2NhbGUpO1xyXG4gIHNldFpvb21QZXJjZW50KHpvb21QZXJjZW50ICsgMTApO1xyXG59O1xyXG5leHBvcnQgY29uc3Qgb25DbGlja1pvb21PdXQgPSAoXHJcbiAgem9vbVBlcmNlbnQsXHJcbiAgc2NhbGUsXHJcbiAgc2V0Wm9vbVBlcmNlbnQsXHJcbiAgc2V0U2NhbGVcclxuKSA9PiB7XHJcbiAgaWYgKHpvb21QZXJjZW50ID4gMCkge1xyXG4gICAgaWYgKHpvb21QZXJjZW50ID09PSAxMCkge1xyXG4gICAgICBzZXRTY2FsZSgxKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNldFNjYWxlKHNjYWxlIC0gMC4xICogc2NhbGUpO1xyXG4gICAgfVxyXG4gICAgc2V0Wm9vbVBlcmNlbnQoem9vbVBlcmNlbnQgLSAxMCk7XHJcbiAgfVxyXG59O1xyXG5cclxuLy9mdW5jdGlvbiB0byB1c2UgcmVtb3ZlIHdpZGdldHMgZnJvbSBjdXJyZW50IHBhZ2Ugd2hlbiB1c2VyIHdhbnQgdG8gcm90YXRlIHBhZ2VcclxuZXhwb3J0IGNvbnN0IGhhbmRsZVJlbW92ZVdpZGdldHMgPSAoXHJcbiAgc2V0U2lnbmVyUG9zLFxyXG4gIHNpZ25lclBvcyxcclxuICBwYWdlTnVtYmVyLFxyXG4gIHNldElzUm90YXRlXHJcbikgPT4ge1xyXG4gIGNvbnN0IHVwZGF0ZWRTaWduZXJQb3MgPSBzaWduZXJQb3MubWFwKChwbGFjZWhvbGRlck9iaikgPT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4ucGxhY2Vob2xkZXJPYmosXHJcbiAgICAgIHBsYWNlSG9sZGVyOiBwbGFjZWhvbGRlck9iaj8ucGxhY2VIb2xkZXI/LmZpbHRlcihcclxuICAgICAgICAoZGF0YSkgPT4gZGF0YT8ucGFnZU51bWJlciAhPT0gcGFnZU51bWJlclxyXG4gICAgICApXHJcbiAgICB9O1xyXG4gIH0pO1xyXG4gIHNldFNpZ25lclBvcyh1cGRhdGVkU2lnbmVyUG9zKTtcclxuICBzZXRJc1JvdGF0ZSh7XHJcbiAgICBzdGF0dXM6IGZhbHNlLFxyXG4gICAgZGVncmVlOiAwXHJcbiAgfSk7XHJcbn07XHJcbi8vZnVuY3Rpb24gdG8gc2hvdyB3YXJuaW5nIHdoZW4gdXNlciByb3RhdGUgcGFnZSBhbmQgdGhlcmUgYXJlIHNvbWUgYWxyZWFkeSB3aWRnZXRzIG9uIHRoYXQgcGFnZVxyXG5leHBvcnQgY29uc3QgaGFuZGxlUm90YXRlV2FybmluZyA9IChzaWduZXJQb3MsIHBhZ2VOdW1iZXIpID0+IHtcclxuICBjb25zdCBwbGFjZWhvbGRlckV4aXN0ID0gc2lnbmVyUG9zPy5zb21lKChwbGFjZWhvbGRlck9iaikgPT5cclxuICAgIHBsYWNlaG9sZGVyT2JqPy5wbGFjZUhvbGRlcj8uc29tZSgoZGF0YSkgPT4gZGF0YT8ucGFnZU51bWJlciA9PT0gcGFnZU51bWJlcilcclxuICApO1xyXG4gIGlmIChwbGFjZWhvbGRlckV4aXN0KSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufTtcclxuIiwiaW1wb3J0IGxvZ28gZnJvbSBcIi4uL2Fzc2V0cy9pbWFnZXMvbG9nby5wbmdcIjtcclxuaW1wb3J0IHsgaXNFbmFibGVTdWJzY3JpcHRpb24gfSBmcm9tIFwiLi9jb25zdFwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNlcnZlclVybF9mbigpIHtcclxuICBsZXQgYmFzZVVybDtcclxuICBpZiAoaXNFbmFibGVTdWJzY3JpcHRpb24pIHtcclxuICAgIGJhc2VVcmwgPSBwcm9jZXNzLmVudi5SRUFDVF9BUFBfU0VSVkVSVVJMXHJcbiAgICAgID8gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NFUlZFUlVSTFxyXG4gICAgICA6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBcIi9hcGkvYXBwXCI7XHJcbiAgfSBlbHNlIHtcclxuICAgIGJhc2VVcmwgPSBwcm9jZXNzLmVudi5SRUFDVF9BUFBfU0VSVkVSVVJMXHJcbiAgICAgID8gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NFUlZFUlVSTFxyXG4gICAgICA6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBcIi9hcHBcIjtcclxuICB9XHJcbiAgcmV0dXJuIGJhc2VVcmw7XHJcbn1cclxuZXhwb3J0IGNvbnN0IGFwcEluZm8gPSB7XHJcbiAgYXBwbG9nbzogbG9nbyxcclxuICBhcHBJZDogcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0FQUElEID8gcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0FQUElEIDogXCJvcGVuc2lnblwiLFxyXG4gIGJhc2VVcmw6IHNlcnZlclVybF9mbigpLFxyXG4gIGRlZmF1bHRSb2xlOiBcImNvbnRyYWN0c19Vc2VyXCIsXHJcbiAgZmJBcHBJZDogcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0ZCQVBQSURcclxuICAgID8gYCR7cHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0ZCQVBQSUR9YFxyXG4gICAgOiBcIlwiLFxyXG4gIGZldl9JY29uOlxyXG4gICAgXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdDQVlBQUFCWEF2bUhBQUFBQVhOU1IwSUFyczRjNlFBQUFMbEpSRUZVYUVQdG1OME53akFNQnBOeFlES1lpTTFZcDkwZzkzQ0tTdEgxTmJJZGZ6OTIxRGtlcjJQYytKczFjREY3TVhBeEFTTUdZa0FpZ0JJNnZoOVp3b1hQNTN1Wm9BWWN2aHdkQTNtQVZiSTJhU2IrOXpGS1U0SVVSQjZqL0hvUFVJRWEyRzNpR0lBaFFRRGxBVUlvRTJkaWFiSWtsSVNTME5vRlBlYm83N1JGNk9lbkVGM1FudE9tMTI4aGUwR0tyd0h5QUNGb3oyTWdCcVNHa3BBRWNIczQ3b0h0TjVBRmFrQUNxTU5qUUVNb0U4U0FCRkNIbjRIRTJ6R0hTTGVFQUFBQUFFbEZUa1N1UW1DQ1wiLFxyXG4gIGdvb2dsZUNsaWV0SWQ6IHByb2Nlc3MuZW52LlJFQUNUX0FQUF9HT09HTEVDTElFTlRJRFxyXG4gICAgPyBgJHtwcm9jZXNzLmVudi5SRUFDVF9BUFBfR09PR0xFQ0xJRU5USUR9YFxyXG4gICAgOiBcIlwiLFxyXG4gIG1ldGFEZXNjcmlwdGlvbjpcclxuICAgIFwiVGhlIGZhc3Rlc3Qgd2F5IHRvIHNpZ24gUERGcyAmIHJlcXVlc3Qgc2lnbmF0dXJlcyBmcm9tIG90aGVycy5cIixcclxuICBzZXR0aW5nczogW1xyXG4gICAge1xyXG4gICAgICByb2xlOiBcImNvbnRyYWN0c19BZG1pblwiLFxyXG4gICAgICBtZW51SWQ6IFwiVlBoOTFoMFpIa1wiLFxyXG4gICAgICBwYWdlVHlwZTogXCJkYXNoYm9hcmRcIixcclxuICAgICAgcGFnZUlkOiBcIjM1S0JvU2dvQUtcIixcclxuICAgICAgZXh0ZW5kZWRfY2xhc3M6IFwiY29udHJhY3RzX1VzZXJzXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHJvbGU6IFwiY29udHJhY3RzX09yZ0FkbWluXCIsXHJcbiAgICAgIG1lbnVJZDogXCJWUGg5MWgwWkhrXCIsXHJcbiAgICAgIHBhZ2VUeXBlOiBcImRhc2hib2FyZFwiLFxyXG4gICAgICBwYWdlSWQ6IFwiMzVLQm9TZ29BS1wiLFxyXG4gICAgICBleHRlbmRlZF9jbGFzczogXCJjb250cmFjdHNfVXNlcnNcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcm9sZTogXCJjb250cmFjdHNfRWRpdG9yXCIsXHJcbiAgICAgIG1lbnVJZDogXCJIOXZSZkVZS2hUXCIsXHJcbiAgICAgIHBhZ2VUeXBlOiBcImRhc2hib2FyZFwiLFxyXG4gICAgICBwYWdlSWQ6IFwiMzVLQm9TZ29BS1wiLFxyXG4gICAgICBleHRlbmRlZF9jbGFzczogXCJjb250cmFjdHNfVXNlcnNcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcm9sZTogXCJjb250cmFjdHNfVXNlclwiLFxyXG4gICAgICBtZW51SWQ6IFwiSDl2UmZFWUtoVFwiLFxyXG4gICAgICBwYWdlVHlwZTogXCJkYXNoYm9hcmRcIixcclxuICAgICAgcGFnZUlkOiBcIjM1S0JvU2dvQUtcIixcclxuICAgICAgZXh0ZW5kZWRfY2xhc3M6IFwiY29udHJhY3RzX1VzZXJzXCJcclxuICAgIH1cclxuICBdXHJcbn07XHJcbiIsImV4cG9ydCBjb25zdCBjb250YWN0Q2xzID0gXCJjb250cmFjdHNfQ29udGFjdGJvb2tcIjtcclxuZXhwb3J0IGNvbnN0IHRlbXBsYXRlQ2xzID0gXCJjb250cmFjdHNfVGVtcGxhdGVcIjtcclxuZXhwb3J0IGNvbnN0IGRvY3VtZW50Q2xzID0gXCJjb250cmFjdHNfRG9jdW1lbnRcIjtcclxuZXhwb3J0IGNvbnN0IHRoZW1lQ29sb3IgPSBcIiM0N2EzYWRcIjtcclxuZXhwb3J0IGNvbnN0IGljb25Db2xvciA9IFwiIzY4Njk2OFwiO1xyXG5leHBvcnQgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcclxuZXhwb3J0IGNvbnN0IGlzRW5hYmxlU3Vic2NyaXB0aW9uID1cclxuICBwcm9jZXNzLmVudi5SRUFDVF9BUFBfRU5BQkxFX1NVQlNDUklQVElPTiAmJlxyXG4gIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9FTkFCTEVfU1VCU0NSSVBUSU9OPy50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIlxyXG4gICAgPyB0cnVlXHJcbiAgICA6IGZhbHNlO1xyXG5leHBvcnQgY29uc3QgaXNTdGFnaW5nID1cclxuICB3aW5kb3cubG9jYXRpb24ub3JpZ2luID09PSBcImh0dHBzOi8vc3RhZ2luZy1hcHAub3BlbnNpZ25sYWJzLmNvbVwiO1xyXG5leHBvcnQgY29uc3QgaXNQdWJsaWNTdGFnaW5nID1cclxuICB3aW5kb3cubG9jYXRpb24ub3JpZ2luID09PSBcImh0dHBzOi8vc3RhZ2luZy5vcGVuc2lnbi5tZVwiO1xyXG4iLCJpbXBvcnQgeyBpc1N0YWdpbmcgfSBmcm9tIFwiLi4vY29uc3RhbnQvY29uc3RcIjtcclxuXHJcbmNvbnN0IHBsYW5zID0gW1xyXG4gIHtcclxuICAgIHBsYW5OYW1lOiBcIk9QRU5TSUdO4oSiIEZSRUVcIixcclxuICAgIGNvZGU6IHsgbW9udGhseTogXCJmcmVlcGxhblwiLCB5ZWFybHk6IFwiZnJlZXBsYW5cIiB9LFxyXG4gICAgaW1nOiBcImZyZWUucG5nXCIsXHJcbiAgICBjdXJyZW5jeTogXCJcIixcclxuICAgIG1vbnRobHlQcmljZTogXCJGcmVlXCIsXHJcbiAgICB5ZWFybHlQcmljZTogXCJGcmVlXCIsXHJcbiAgICBzdWJ0aXRsZTogXCJGcmVlIFVubGltaXRlZCBFLXNpZ25hdHVyZXMsIEZvcmV2ZXIuXCIsXHJcbiAgICBidG46IHsgdGV4dDogXCJTdWJzY3JpYmVcIiwgY29sb3I6IFwib3AtYnRuLXByaW1hcnlcIiB9LFxyXG4gICAgdXJsOiBcIlwiLFxyXG4gICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxyXG4gICAgYmVuZWZpdHM6IFtcclxuICAgICAgXCJVbmxpbWl0ZWQgZGlnaXRhbCBzaWduYXR1cmVzXCIsXHJcbiAgICAgIFwiU2lnbiBkb2N1bWVudHMgeW91cnNlbGZcIixcclxuICAgICAgXCJSZXF1ZXN0IHNpZ25hdHVyZXMgZnJvbSBvdGhlcnNcIixcclxuICAgICAgXCIxNCBmaWVsZCB0eXBlc1wiLFxyXG4gICAgICBcIkF1dG9tYXRpYyBlLXNpZ25hdHVyZXNcIixcclxuICAgICAgXCJDb21wbGV0aW9uIGNlcnRpZmljYXRlc1wiLFxyXG4gICAgICBcIlNlbmQgaW4gb3JkZXJcIixcclxuICAgICAgXCJEb2N1bWVudCB0ZW1wbGF0ZXNcIixcclxuICAgICAgXCJJbXBvcnQgZnJvbSBEcm9wYm94XCIsXHJcbiAgICAgIFwiQ29udGFjdCBib29rXCIsXHJcbiAgICAgIFwiRG9jdW1lbnQgZXhwaXJ5IHN1cHBvcnRcIixcclxuICAgICAgXCJEZWNsaW5lIGRvY3VtZW50IHN1cHBvcnRcIixcclxuICAgICAgXCJFbWFpbCBub3RpZmljYXRpb25zXCIsXHJcbiAgICAgIFwiUmVjaXBpZW50IGF1dGhlbnRpY2F0aW9uIHVzaW5nIE9UUFwiLFxyXG4gICAgICBcIlB1YmxpYyBwcm9maWxlc1wiLFxyXG4gICAgICBcIkFuZCBtdWNoIG1vcmVcIlxyXG4gICAgXSxcclxuICAgIHllYXJseUJlbmVmaXRzOiBbXHJcbiAgICAgIFwiVW5saW1pdGVkIGRpZ2l0YWwgc2lnbmF0dXJlc1wiLFxyXG4gICAgICBcIlNpZ24gZG9jdW1lbnRzIHlvdXJzZWxmXCIsXHJcbiAgICAgIFwiUmVxdWVzdCBzaWduYXR1cmVzIGZyb20gb3RoZXJzXCIsXHJcbiAgICAgIFwiMTQgZmllbGQgdHlwZXNcIixcclxuICAgICAgXCJBdXRvbWF0aWMgZS1zaWduYXR1cmVzXCIsXHJcbiAgICAgIFwiQ29tcGxldGlvbiBjZXJ0aWZpY2F0ZXNcIixcclxuICAgICAgXCJTZW5kIGluIG9yZGVyXCIsXHJcbiAgICAgIFwiRG9jdW1lbnQgdGVtcGxhdGVzXCIsXHJcbiAgICAgIFwiSW1wb3J0IGZyb20gRHJvcGJveFwiLFxyXG4gICAgICBcIkNvbnRhY3QgYm9va1wiLFxyXG4gICAgICBcIkRvY3VtZW50IGV4cGlyeSBzdXBwb3J0XCIsXHJcbiAgICAgIFwiRGVjbGluZSBkb2N1bWVudCBzdXBwb3J0XCIsXHJcbiAgICAgIFwiRW1haWwgbm90aWZpY2F0aW9uc1wiLFxyXG4gICAgICBcIlJlY2lwaWVudCBhdXRoZW50aWNhdGlvbiB1c2luZyBPVFBcIixcclxuICAgICAgXCJQdWJsaWMgcHJvZmlsZXNcIixcclxuICAgICAgXCJBbmQgbXVjaCBtb3JlXCJcclxuICAgIF1cclxuICB9LFxyXG4gIHtcclxuICAgIHBsYW5OYW1lOiBcIk9QRU5TSUdO4oSiIFBST0ZFU1NJT05BTFwiLFxyXG4gICAgY29kZTogaXNTdGFnaW5nXHJcbiAgICAgID8geyBtb250aGx5OiBcInByby13ZWVrbHlcIiwgeWVhcmx5OiBcInByby15ZWFybHlcIiB9XHJcbiAgICAgIDogeyBtb250aGx5OiBcInByb2Zlc3Npb25hbC1tb250aGx5XCIsIHllYXJseTogXCJwcm9mZXNzaW9uYWwteWVhcmx5XCIgfSxcclxuICAgIGltZzogXCJwcm9mZXNzaW9uYWwucG5nXCIsXHJcbiAgICBjdXJyZW5jeTogXCIkXCIsXHJcbiAgICBtb250aGx5UHJpY2U6IFwiMjkuOTlcIixcclxuICAgIHllYXJseVByaWNlOiBgOS45OTxzdXAgc3R5bGU9XCJmb250LXNpemU6IDE3cHg7XCI+L21vbnRoPC9zdXA+YCxcclxuICAgIHN1YnRpdGxlOiBcIkV4Y2x1c2l2ZSBBY2Nlc3MgdG8gYWR2YW5jZWQgZmVhdHVyZXMuXCIsXHJcbiAgICBidG46IHsgdGV4dDogXCJTdWJzY3JpYmVcIiwgY29sb3I6IFwib3AtYnRuLXByaW1hcnlcIiB9LFxyXG4gICAgdXJsOiBpc1N0YWdpbmdcclxuICAgICAgPyBcImh0dHBzOi8vYmlsbGluZy56b2hvLmluL3N1YnNjcmliZS85NjI3ZjYyYTA5ZGYxYzhjZTUwMGYyZjRkYzgzMjhkZDg0ZWNkYTIwZWVhZTEzODc4Y2U1ODFkNjAyNDBmMjA2L3Byby13ZWVrbHlcIlxyXG4gICAgICA6IFwiaHR0cHM6Ly9iaWxsaW5nLm9wZW5zaWdubGFicy5jb20vc3Vic2NyaWJlL2VmNzk4NDg2ZTZhMGExMWVhNjVmMmJhZThmMmFmOTAxZDFhMDlkZmE4MDg1NTg1Y2RkNGVjNGQ3ZjMyMTM3ZjMvcHJvZmVzc2lvbmFsLW1vbnRobHlcIixcclxuICAgIHllYXJseVVybDogaXNTdGFnaW5nXHJcbiAgICAgID8gXCJodHRwczovL2JpbGxpbmcuem9oby5pbi9zdWJzY3JpYmUvOTYyN2Y2MmEwOWRmMWM4Y2U1MDBmMmY0ZGM4MzI4ZGRjMTg0NDExMTI5MjI0ZjFmMjllZDg0ZjZjZWYzYjg2Mi9wcm8teWVhcmx5XCJcclxuICAgICAgOiBcImh0dHBzOi8vYmlsbGluZy5vcGVuc2lnbmxhYnMuY29tL3N1YnNjcmliZS9lZjc5ODQ4NmU2YTBhMTFlYTY1ZjJiYWU4ZjJhZjkwMWQ4YWQxMTM1MTkwZGZmOTUxMzMwMzYwZTQ3NTg1YTcxL3Byb2Zlc3Npb25hbC15ZWFybHlcIixcclxuICAgIHRhcmdldDogXCJfc2VsZlwiLFxyXG4gICAgYmVuZWZpdHM6IFtcclxuICAgICAgXCJFdmVyeXRoaW5nIGluIE9wZW5TaWdu4oSiIGZyZWVcIixcclxuICAgICAgXCJGaWVsZCB2YWxpZGF0aW9uc1wiLFxyXG4gICAgICBcIlJlZ3VsYXIgZXhwcmVzc2lvbiB2YWxpZGF0aW9uc1wiLFxyXG4gICAgICBcIk9yZ2FuaXplIGRvY3MgaW4gT3BlblNpZ27ihKIgRHJpdmVcIixcclxuICAgICAgXCJXZWJob29rc1wiLFxyXG4gICAgICBcIlphcGllciBpbnRlZ3JhdGlvblwiLFxyXG4gICAgICBcIkFQSSBBY2Nlc3NcIixcclxuICAgICAgXCJ1cHRvIDEwMCBBUEkgc2lnbmF0dXJlc1wiLFxyXG4gICAgICBcIkN1c3RvbSBlbWFpbCB0ZW1wbGF0ZXNcIixcclxuICAgICAgXCJBdXRvIHJlbWluZGVyc1wiLFxyXG4gICAgICBcIkJ1bGsgc2VuZCAodXB0byAxMDAgZG9jcylcIixcclxuICAgICAgXCJQcmVtaXVtIFB1YmxpYyBwcm9maWxlIHVzZXJuYW1lc1wiLFxyXG4gICAgICBcIkVtYmVkZGluZyAoY29taW5nIHNvb24pXCJcclxuICAgIF0sXHJcbiAgICB5ZWFybHlCZW5lZml0czogW1xyXG4gICAgICBcIkV2ZXJ5dGhpbmcgaW4gT3BlblNpZ27ihKIgZnJlZVwiLFxyXG4gICAgICBcIkZpZWxkIHZhbGlkYXRpb25zXCIsXHJcbiAgICAgIFwiUmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRpb25zXCIsXHJcbiAgICAgIFwiT3JnYW5pemUgZG9jcyBpbiBPcGVuU2lnbuKEoiBEcml2ZVwiLFxyXG4gICAgICBcIldlYmhvb2tzXCIsXHJcbiAgICAgIFwiWmFwaWVyIGludGVncmF0aW9uXCIsXHJcbiAgICAgIFwiQVBJIEFjY2Vzc1wiLFxyXG4gICAgICBcInVwdG8gMjQwIEFQSSBzaWduYXR1cmVzXCIsXHJcbiAgICAgIFwiQ3VzdG9tIGVtYWlsIHRlbXBsYXRlc1wiLFxyXG4gICAgICBcIkF1dG8gcmVtaW5kZXJzXCIsXHJcbiAgICAgIFwiQnVsayBzZW5kICh1cHRvIDI0MCBkb2NzKVwiLFxyXG4gICAgICBcIlByZW1pdW0gUHVibGljIHByb2ZpbGUgdXNlcm5hbWVzXCIsXHJcbiAgICAgIFwiRW1iZWRkaW5nIChjb21pbmcgc29vbilcIlxyXG4gICAgXVxyXG4gIH0sXHJcbiAge1xyXG4gICAgcGxhbk5hbWU6IFwiT1BFTlNJR07ihKIgVEVBTVNcIixcclxuICAgIGNvZGU6IHsgbW9udGhseTogXCJ0ZWFtcy1tb250aGx5XCIsIHllYXJseTogXCJ0ZWFtcy15ZWFybHlcIiB9LFxyXG4gICAgaW1nOiBcInRlYW1zLnBuZ1wiLFxyXG4gICAgY3VycmVuY3k6IFwiJFwiLFxyXG4gICAgbW9udGhseVByaWNlOiBgMzkuOTk8c3VwIHN0eWxlPVwiZm9udC1zaXplOiAxN3B4O1wiPi91c2VyPC9zdXA+YCxcclxuICAgIHllYXJseVByaWNlOiBgMTkuOTk8c3VwIHN0eWxlPVwiZm9udC1zaXplOiAxN3B4O1wiPi91c2VyL21vbnRoPC9zdXA+YCxcclxuICAgIHN1YnRpdGxlOiBcIkV4Y2x1c2l2ZSBBY2Nlc3MgdG8gYWR2YW5jZWQgZmVhdHVyZXMuXCIsXHJcbiAgICBidG46IHsgdGV4dDogXCJTdWJzY3JpYmVcIiwgY29sb3I6IFwib3AtYnRuLWFjY2VudFwiIH0sXHJcbiAgICB1cmw6IGlzU3RhZ2luZ1xyXG4gICAgICA/IFwiaHR0cHM6Ly9iaWxsaW5nLnpvaG8uaW4vc3Vic2NyaWJlL2VkODA5NzI3M2E4MmI2YmYzOTg5MmMxMWEzYmIzYzM4MWViMjcwNTczNjAxNGNmYmRiZGUxY2NmMWM3YTE4OWQvdGVhbXMtbW9udGhseVwiXHJcbiAgICAgIDogXCJodHRwczovL2JpbGxpbmcub3BlbnNpZ25sYWJzLmNvbS9zdWJzY3JpYmUvZWY3OTg0ODZlNmEwYTExZWE2NWYyYmFlOGYyYWY5MDEyMzdkMDcwMmJmYWE5NTk0MDYzMDY2MzVkODBmMTM4Yy90ZWFtcy1tb250aGx5XCIsXHJcbiAgICB5ZWFybHlVcmw6IGlzU3RhZ2luZ1xyXG4gICAgICA/IFwiaHR0cHM6Ly9iaWxsaW5nLnpvaG8uaW4vc3Vic2NyaWJlL2VkODA5NzI3M2E4MmI2YmYzOTg5MmMxMWEzYmIzYzM4MWViMjcwNTczNjAxNGNmYmRiZGUxY2NmMWM3YTE4OWQvdGVhbXMteWVhcmx5XCJcclxuICAgICAgOiBcImh0dHBzOi8vYmlsbGluZy5vcGVuc2lnbmxhYnMuY29tL3N1YnNjcmliZS9lZjc5ODQ4NmU2YTBhMTFlYTY1ZjJiYWU4ZjJhZjkwMTFhODY0OTk0YmJlZWVjNzFmY2YxMDYxODg2MzAxOTlkL3RlYW1zLXllYXJseVwiLFxyXG4gICAgdGFyZ2V0OiBcIl9zZWxmXCIsXHJcbiAgICBiZW5lZml0czogW1xyXG4gICAgICBcIkV2ZXJ5dGhpbmcgaW4gT3BlblNpZ27ihKIgcHJvZmVzc2lvbmFsXCIsXHJcbiAgICAgIFwidXB0byAxMDAgQVBJIHNpZ25hdHVyZXNcIixcclxuICAgICAgXCJUZWFtcyBhbmQgT3JnYW5pemF0aW9uc1wiLFxyXG4gICAgICBcIlNoYXJlIFRlbXBsYXRlcyB3aXRoIHRlYW1zXCIsXHJcbiAgICAgIFwiU2hhcmUgVGVtcGxhdGVzIHdpdGggaW5kaXZpZHVhbHNcIixcclxuICAgICAgXCJEb2N1bWVudElkIHJlbW92YWwgZnJvbSBzaWduZWQgZG9jc1wiLFxyXG4gICAgICBcIkJ1bGsgc2VuZCAodXB0byAxMDAgZG9jcylcIixcclxuICAgICAgXCJSZXF1ZXN0IFBheW1lbnRzIChjb21pbmcgc29vbilcIixcclxuICAgICAgXCJNb2JpbGUgYXBwIChjb21pbmcgc29vbilcIlxyXG4gICAgXSxcclxuICAgIHllYXJseUJlbmVmaXRzOiBbXHJcbiAgICAgIFwiRXZlcnl0aGluZyBpbiBPcGVuU2lnbuKEoiBwcm9mZXNzaW9uYWxcIixcclxuICAgICAgXCJ1cHRvIDUwMCBBUEkgc2lnbmF0dXJlc1wiLFxyXG4gICAgICBcIlRlYW1zIGFuZCBPcmdhbml6YXRpb25zXCIsXHJcbiAgICAgIFwiU2hhcmUgVGVtcGxhdGVzIHdpdGggdGVhbXNcIixcclxuICAgICAgXCJTaGFyZSBUZW1wbGF0ZXMgd2l0aCBpbmRpdmlkdWFsc1wiLFxyXG4gICAgICBcIkRvY3VtZW50SWQgcmVtb3ZhbCBmcm9tIHNpZ25lZCBkb2NzXCIsXHJcbiAgICAgIFwiQnVsayBzZW5kICh1cHRvIDUwMCBkb2NzKVwiLFxyXG4gICAgICBcIlJlcXVlc3QgUGF5bWVudHMgKGNvbWluZyBzb29uKVwiLFxyXG4gICAgICBcIk1vYmlsZSBhcHAgKGNvbWluZyBzb29uKVwiXHJcbiAgICBdXHJcbiAgfSxcclxuICB7XHJcbiAgICBwbGFuTmFtZTogXCJPUEVOU0lHTuKEoiBFTlRFUlBSSVNFXCIsXHJcbiAgICBpbWc6IFwiZW50ZXJwcmlzZS5wbmdcIixcclxuICAgIGN1cnJlbmN5OiBcIlwiLFxyXG4gICAgbW9udGhseVByaWNlOiBgPHAgc3R5bGU9XCJmb250LXNpemU6IDIycHg7XCI+UmVxdWVzdCBQcmljZTwvcD5gLFxyXG4gICAgeWVhcmx5UHJpY2U6IGA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMjJweDtcIj5SZXF1ZXN0IFByaWNlPC9wPmAsXHJcbiAgICBzdWJ0aXRsZTogXCJTY2FsYWJsZSBGZWF0dXJlcyB3aXRoIHByaW9yaXR5IHN1cHBvcnQuXCIsXHJcbiAgICBidG46IHsgdGV4dDogXCJDb250YWN0IHVzXCIsIGNvbG9yOiBcIm9wLWJ0bi1wcmltYXJ5XCIgfSxcclxuICAgIHVybDogXCJodHRwczovL3d3dy5vcGVuc2lnbmxhYnMuY29tL2NvbnRhY3QtdXNcIixcclxuICAgIHRhcmdldDogXCJfYmxhbmtcIixcclxuICAgIGJlbmVmaXRzOiBbXHJcbiAgICAgIFwiQWxsIGZlYXR1cmVzXCIsXHJcbiAgICAgIFwiQ3VzdG9tIGRvbWFpblwiLFxyXG4gICAgICBcIkN1c3RvbSBicmFuZGluZ1wiLFxyXG4gICAgICBcIlVwdGltZSBTTEFcIixcclxuICAgICAgXCJTU08gc3VwcG9ydFwiLFxyXG4gICAgICBcIlByaW9yaXR5IHN1cHBvcnRcIlxyXG4gICAgXSxcclxuICAgIHllYXJseUJlbmVmaXRzOiBbXHJcbiAgICAgIFwiQWxsIGZlYXR1cmVzXCIsXHJcbiAgICAgIFwiQ3VzdG9tIGRvbWFpblwiLFxyXG4gICAgICBcIkN1c3RvbSBicmFuZGluZ1wiLFxyXG4gICAgICBcIlVwdGltZSBTTEFcIixcclxuICAgICAgXCJTU08gc3VwcG9ydFwiLFxyXG4gICAgICBcIlByaW9yaXR5IHN1cHBvcnRcIlxyXG4gICAgXVxyXG4gIH1cclxuXTtcclxuXHJcbmV4cG9ydCBjb25zdCB2YWxpZHBsYW4gPSB7XHJcbiAgXCJ0ZWFtLXdlZWtseVwiOiB0cnVlLFxyXG4gIFwidGVhbS15ZWFybHlcIjogdHJ1ZSxcclxuICBcInRlYW1zLW1vbnRobHlcIjogdHJ1ZSxcclxuICBcInRlYW1zLXllYXJseVwiOiB0cnVlLFxyXG4gIFwiZW50ZXJwcmlzZS1tb250aGx5XCI6IHRydWUsXHJcbiAgXCJlbnRlcnByaXNlLXllYXJseVwiOiB0cnVlXHJcbn07XHJcbmV4cG9ydCBjb25zdCBwYWlkVXJsID0gKHBsYW4pID0+IHtcclxuICBjb25zdCB0ZWFtcGVyaW9kID0ge1xyXG4gICAgXCJ0ZWFtLXdlZWtseVwiOiBcIm1vbnRobHlcIixcclxuICAgIFwidGVhbS15ZWFybHlcIjogXCJ5ZWFybHlcIixcclxuICAgIFwidGVhbXMtbW9udGhseVwiOiBcIm1vbnRobHlcIixcclxuICAgIFwidGVhbXMteWVhcmx5XCI6IFwieWVhcmx5XCJcclxuICB9O1xyXG4gIGNvbnN0IHBlcmlvZCA9IHRlYW1wZXJpb2RbcGxhbl0gfHwgXCJcIjtcclxuICBpZiAocGVyaW9kKSB7XHJcbiAgICBjb25zdCBleHRVc2VyID1cclxuICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJFeHRhbmRfQ2xhc3NcIikgJiZcclxuICAgICAgSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkV4dGFuZF9DbGFzc1wiKSk/LlswXTtcclxuICAgIGNvbnN0IHVzZXIgPSB7XHJcbiAgICAgIG5hbWU6IGV4dFVzZXI/Lk5hbWUsXHJcbiAgICAgIGVtYWlsOiBleHRVc2VyPy5FbWFpbCxcclxuICAgICAgY29tcGFueTogZXh0VXNlcj8uQ29tcGFueSxcclxuICAgICAgcGhvbmU6IGV4dFVzZXI/LlBob25lXHJcbiAgICB9O1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJ1c2VyRGV0YWlscyBcIiwgdXNlckRldGFpbHMpO1xyXG4gICAgY29uc3QgZnVsbG5hbWUgPSB1c2VyICYmIHVzZXIubmFtZSA/IHVzZXIubmFtZS5zcGxpdChcIiBcIikgOiBcIlwiO1xyXG4gICAgY29uc3QgZmlyc3RuYW1lID0gZnVsbG5hbWU/LlswXVxyXG4gICAgICA/IFwiZmlyc3RfbmFtZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChmdWxsbmFtZT8uWzBdKVxyXG4gICAgICA6IFwiXCI7XHJcbiAgICBjb25zdCBsYXN0bmFtZSA9IGZ1bGxuYW1lPy5bMV1cclxuICAgICAgPyBcIiZsYXN0X25hbWU9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoZnVsbG5hbWU/LlsxXSlcclxuICAgICAgOiBcIlwiO1xyXG4gICAgY29uc3QgbmFtZSA9IGZpcnN0bmFtZSA/IGZpcnN0bmFtZSArIGxhc3RuYW1lIDogXCJcIjtcclxuICAgIGNvbnN0IGVtYWlsID1cclxuICAgICAgdXNlciAmJiB1c2VyLmVtYWlsID8gXCImZW1haWw9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodXNlci5lbWFpbCkgOiBcIlwiO1xyXG4gICAgY29uc3QgY29tcGFueSA9XHJcbiAgICAgIHVzZXIgJiYgdXNlci5jb21wYW55XHJcbiAgICAgICAgPyBcIiZjb21wYW55X25hbWU9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodXNlci5jb21wYW55KVxyXG4gICAgICAgIDogXCJcIjtcclxuICAgIGNvbnN0IHBob25lID1cclxuICAgICAgdXNlciAmJiB1c2VyLnBob25lID8gXCImbW9iaWxlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIucGhvbmUpIDogXCJcIjtcclxuICAgIGNvbnN0IGFsbG93ZWRVc2VycyA9XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWxsb3dlZFVzZXJzXCIpICYmXHJcbiAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWxsb3dlZFVzZXJzXCIpID4gMFxyXG4gICAgICAgID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhbGxvd2VkVXNlcnNcIikgLSAxXHJcbiAgICAgICAgOiBcIlwiO1xyXG4gICAgY29uc3QgcXVhbnRpdHkgPSBhbGxvd2VkVXNlcnNcclxuICAgICAgPyBgYWRkb25fY29kZSU1QjAlNUQ9ZXh0cmEtdGVhbXMtdXNlcnMtJHtwZXJpb2R9JmFkZG9uX3F1YW50aXR5JTVCMCU1RD0ke2FsbG93ZWRVc2Vyc30mYFxyXG4gICAgICA6IFwiXCI7XHJcblxyXG4gICAgY29uc3QgZGV0YWlscyA9XHJcbiAgICAgIFwiP3NoaXBwaW5nX2NvdW50cnlfY29kZT1VUyZiaWxsaW5nX2NvdW50cnlfY29kZT1VUyZiaWxsaW5nX3N0YXRlX2NvZGU9Q0EmXCIgK1xyXG4gICAgICBxdWFudGl0eSArXHJcbiAgICAgIG5hbWUgK1xyXG4gICAgICBlbWFpbCArXHJcbiAgICAgIGNvbXBhbnkgK1xyXG4gICAgICBwaG9uZTtcclxuXHJcbiAgICBpZiAodXNlcikge1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInVzZXJEZXRhaWxzXCIsIEpTT04uc3RyaW5naWZ5KHVzZXIpKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHVybCA9IHtcclxuICAgICAgbW9udGhseTogaXNTdGFnaW5nXHJcbiAgICAgICAgPyBcImh0dHBzOi8vYmlsbGluZy56b2hvLmluL3N1YnNjcmliZS9lZDgwOTcyNzNhODJiNmJmMzk4OTJjMTFhM2JiM2MzODFlYjI3MDU3MzYwMTRjZmJkYmRlMWNjZjFjN2ExODlkL3RlYW1zLW1vbnRobHlcIlxyXG4gICAgICAgIDogXCJodHRwczovL2JpbGxpbmcub3BlbnNpZ25sYWJzLmNvbS9zdWJzY3JpYmUvZWY3OTg0ODZlNmEwYTExZWE2NWYyYmFlOGYyYWY5MDEyMzdkMDcwMmJmYWE5NTk0MDYzMDY2MzVkODBmMTM4Yy90ZWFtcy1tb250aGx5XCIsXHJcbiAgICAgIHllYXJseTogaXNTdGFnaW5nXHJcbiAgICAgICAgPyBcImh0dHBzOi8vYmlsbGluZy56b2hvLmluL3N1YnNjcmliZS9lZDgwOTcyNzNhODJiNmJmMzk4OTJjMTFhM2JiM2MzODFlYjI3MDU3MzYwMTRjZmJkYmRlMWNjZjFjN2ExODlkL3RlYW1zLXllYXJseVwiXHJcbiAgICAgICAgOiBcImh0dHBzOi8vYmlsbGluZy5vcGVuc2lnbmxhYnMuY29tL3N1YnNjcmliZS9lZjc5ODQ4NmU2YTBhMTFlYTY1ZjJiYWU4ZjJhZjkwMTFhODY0OTk0YmJlZWVjNzFmY2YxMDYxODg2MzAxOTlkL3RlYW1zLXllYXJseVwiXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHBsYW51cmwgPSB1cmxbcGVyaW9kXSArIGRldGFpbHM7XHJcbiAgICByZXR1cm4gcGxhbnVybDtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIFwiL3N1YnNjcmlwdGlvblwiO1xyXG4gIH1cclxufTtcclxuZXhwb3J0IGRlZmF1bHQgcGxhbnM7XHJcbiIsImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IHsgaXNFbmFibGVTdWJzY3JpcHRpb24sIGlzU3RhZ2luZywgdGhlbWVDb2xvciB9IGZyb20gXCIuLi9jb25zdGFudC9jb25zdFwiO1xyXG5pbXBvcnQgeyBQREZEb2N1bWVudCB9IGZyb20gXCJwZGYtbGliXCI7XHJcbmltcG9ydCBcIi4uL3N0eWxlcy9zaWduYXR1cmUuY3NzXCI7XHJcbmltcG9ydCBQYXJzZSBmcm9tIFwicGFyc2VcIjtcclxuaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiO1xyXG5pbXBvcnQgeyBEbmRQcm92aWRlciB9IGZyb20gXCJyZWFjdC1kbmRcIjtcclxuaW1wb3J0IHsgSFRNTDVCYWNrZW5kIH0gZnJvbSBcInJlYWN0LWRuZC1odG1sNS1iYWNrZW5kXCI7XHJcbmltcG9ydCBTaWduUGFkIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9TaWduUGFkXCI7XHJcbmltcG9ydCBSZW5kZXJBbGxQZGZQYWdlIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9SZW5kZXJBbGxQZGZQYWdlXCI7XHJcbmltcG9ydCBUb3VyIGZyb20gXCJyZWFjdG91clwiO1xyXG5pbXBvcnQgQ29uZmV0dGkgZnJvbSBcInJlYWN0LWNvbmZldHRpXCI7XHJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5pbXBvcnQge1xyXG4gIGNvbnRyYWN0RG9jdW1lbnQsXHJcbiAgbXVsdGlTaWduRW1iZWQsXHJcbiAgZW1iZWREb2NJZCxcclxuICBwZGZOZXdXaWR0aEZ1bixcclxuICBzaWduUGRmRnVuLFxyXG4gIG9uSW1hZ2VTZWxlY3QsXHJcbiAgb25TYXZlU2lnbixcclxuICBvblNhdmVJbWFnZSxcclxuICBhZGREZWZhdWx0U2lnbmF0dXJlSW1nLFxyXG4gIHJhZGlvQnV0dG9uV2lkZ2V0LFxyXG4gIHJlcGxhY2VNYWlsVmFyaWJsZXMsXHJcbiAgZmV0Y2hTdWJzY3JpcHRpb24sXHJcbiAgY29udmVydFBkZkFycmF5QnVmZmVyLFxyXG4gIGNvbnRyYWN0VXNlcnMsXHJcbiAgaGFuZGxlU2VuZE9UUCxcclxuICBjb250YWN0Qm9vayxcclxuICBoYW5kbGVEb3dubG9hZFBkZixcclxuICBoYW5kbGVUb1ByaW50LFxyXG4gIGhhbmRsZURvd25sb2FkQ2VydGlmaWNhdGUsXHJcbiAgZ2V0RGVmYXVsdFNpZ25hdHVyZSxcclxuICBvbkNsaWNrWm9vbUluLFxyXG4gIG9uQ2xpY2tab29tT3V0LFxyXG4gIGZldGNoVXJsXHJcbn0gZnJvbSBcIi4uL2NvbnN0YW50L1V0aWxzXCI7XHJcbmltcG9ydCBIZWFkZXIgZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL1BkZkhlYWRlclwiO1xyXG5pbXBvcnQgUmVuZGVyUGRmIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9SZW5kZXJQZGZcIjtcclxuaW1wb3J0IFRpdGxlIGZyb20gXCIuLi9jb21wb25lbnRzL1RpdGxlXCI7XHJcbmltcG9ydCBEZWZhdWx0U2lnbmF0dXJlIGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9EZWZhdWx0U2lnbmF0dXJlXCI7XHJcbmltcG9ydCB7IHVzZVNlbGVjdG9yIH0gZnJvbSBcInJlYWN0LXJlZHV4XCI7XHJcbmltcG9ydCBTaWduZXJMaXN0Q29tcG9uZW50IGZyb20gXCIuLi9jb21wb25lbnRzL3BkZi9TaWduZXJMaXN0Q29tcG9uZW50XCI7XHJcbmltcG9ydCBWZXJpZnlFbWFpbCBmcm9tIFwiLi4vY29tcG9uZW50cy9wZGYvVmVyaWZ5RW1haWxcIjtcclxuaW1wb3J0IFBkZlpvb20gZnJvbSBcIi4uL2NvbXBvbmVudHMvcGRmL1BkZlpvb21cIjtcclxuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tIFwicmVhY3QtaTE4bmV4dFwiO1xyXG5pbXBvcnQge1xyXG4gIERvd25sb2FkUGRmWmlwLFxyXG4gIExvYWRlcixcclxuICBUb3VyQ29udGVudFdpdGhCdG4sXHJcbiAgTW9kYWxVaSxcclxuICBQZGZEZWNsaW5lTW9kYWwsXHJcbiAgSGFuZGxlRXJyb3IsXHJcbiAgTG9hZGVyV2l0aE1zZ1xyXG59IGZyb20gXCIuLi9wcmltaXRpdmVzXCI7XHJcblxyXG5mdW5jdGlvbiBQZGZSZXF1ZXN0RmlsZXMocHJvcHMpIHtcclxuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XHJcbiAgY29uc3QgW3BkZkRldGFpbHMsIHNldFBkZkRldGFpbHNdID0gdXNlU3RhdGUoW10pO1xyXG4gIGNvbnN0IFtzaWduZWRTaWduZXJzLCBzZXRTaWduZWRTaWduZXJzXSA9IHVzZVN0YXRlKFtdKTtcclxuICBjb25zdCBbdW5zaWduZWRTaWduZXJzLCBzZXRVblNpZ25lZFNpZ25lcnNdID0gdXNlU3RhdGUoW10pO1xyXG4gIGNvbnN0IFtpc1NpZ25QYWQsIHNldElzU2lnblBhZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3BkZlVybCwgc2V0UGRmVXJsXSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW2FsbFBhZ2VzLCBzZXRBbGxQYWdlc10gPSB1c2VTdGF0ZShudWxsKTtcclxuICBjb25zdCBudW1QYWdlcyA9IDE7XHJcbiAgY29uc3QgW3BhZ2VOdW1iZXIsIHNldFBhZ2VOdW1iZXJdID0gdXNlU3RhdGUoMSk7XHJcbiAgY29uc3QgW2ltYWdlLCBzZXRJbWFnZV0gPSB1c2VTdGF0ZShudWxsKTtcclxuICBjb25zdCBbaXNJbWFnZVNlbGVjdCwgc2V0SXNJbWFnZVNlbGVjdF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3NpZ25hdHVyZSwgc2V0U2lnbmF0dXJlXSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW2lzU3RhbXAsIHNldElzU3RhbXBdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtzaWduS2V5LCBzZXRTaWduS2V5XSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW2ltZ1dILCBzZXRJbWdXSF0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgY29uc3QgaW1hZ2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgY29uc3QgW2hhbmRsZUVycm9yLCBzZXRIYW5kbGVFcnJvcl0gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFtzZWxlY3RXaWRnZXRJZCwgc2V0U2VsZWN0V2lkZ2V0SWRdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW290cExvYWRlciwgc2V0T3RwTG9hZGVyXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNDZWxlYnJhdGlvbiwgc2V0SXNDZWxlYnJhdGlvbl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3JlcXVlc3RTaWduVG91ciwgc2V0UmVxdWVzdFNpZ25Ub3VyXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbdG91clN0YXR1cywgc2V0VG91clN0YXR1c10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0SXNMb2FkaW5nXSA9IHVzZVN0YXRlKHtcclxuICAgIGlzTG9hZDogdHJ1ZSxcclxuICAgIG1lc3NhZ2U6IHQoXCJsb2FkaW5nLW1zc2dcIilcclxuICB9KTtcclxuICBjb25zdCBbZGVmYXVsdFNpZ25JbWcsIHNldERlZmF1bHRTaWduSW1nXSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW2lzRG9jSWQsIHNldElzRG9jSWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtwZGZOZXdXaWR0aCwgc2V0UGRmTmV3V2lkdGhdID0gdXNlU3RhdGUoKTtcclxuICBjb25zdCBbcGRmT3JpZ2luYWxXSCwgc2V0UGRmT3JpZ2luYWxXSF0gPSB1c2VTdGF0ZShbXSk7XHJcbiAgY29uc3QgW3NpZ25lclBvcywgc2V0U2lnbmVyUG9zXSA9IHVzZVN0YXRlKFtdKTtcclxuICBjb25zdCBbc2lnbmVyT2JqZWN0SWQsIHNldFNpZ25lck9iamVjdElkXSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW2lzVWlMb2FkaW5nLCBzZXRJc1VpTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzRGVjbGluZSwgc2V0SXNEZWNsaW5lXSA9IHVzZVN0YXRlKHsgaXNEZWNsaW5lZDogZmFsc2UgfSk7XHJcbiAgY29uc3QgW2N1cnJlbnRTaWduZXIsIHNldEN1cnJlbnRTaWduZXJdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc0FsZXJ0LCBzZXRJc0FsZXJ0XSA9IHVzZVN0YXRlKHsgaXNTaG93OiBmYWxzZSwgYWxlcnRNZXNzYWdlOiBcIlwiIH0pO1xyXG4gIGNvbnN0IFt1blNpZ25lZFdpZGdldElkLCBzZXRVblNpZ25lZFdpZGdldElkXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtleHBpcmVkRGF0ZSwgc2V0RXhwaXJlZERhdGVdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2lzUmVzaXplLCBzZXRJc1Jlc2l6ZV0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3NpZ25lclVzZXJJZCwgc2V0U2lnbmVyVXNlcklkXSA9IHVzZVN0YXRlKCk7XHJcbiAgY29uc3QgW2lzRG9udFNob3csIHNldElzRG9udFNob3ddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc0Rvd25sb2FkaW5nLCBzZXRJc0Rvd25sb2FkaW5nXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtkZWZhdWx0U2lnbkFsZXJ0LCBzZXREZWZhdWx0U2lnbkFsZXJ0XSA9IHVzZVN0YXRlKHtcclxuICAgIGlzU2hvdzogZmFsc2UsXHJcbiAgICBhbGVydE1lc3NhZ2U6IFwiXCJcclxuICB9KTtcclxuICBjb25zdCBbaXNTdWJzY3JpYmVkLCBzZXRJc1N1YnNjcmliZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc0NvbXBsZXRlZCwgc2V0SXNDb21wbGV0ZWRdID0gdXNlU3RhdGUoe1xyXG4gICAgaXNDZXJ0aWZpY2F0ZTogZmFsc2UsXHJcbiAgICBpc01vZGFsOiBmYWxzZVxyXG4gIH0pO1xyXG4gIGNvbnN0IFtteUluaXRpYWwsIHNldE15SW5pdGlhbF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbaXNJbml0aWFsLCBzZXRJc0luaXRpYWxdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtwZGZMb2FkLCBzZXRQZGZMb2FkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNTaWduZWQsIHNldElzU2lnbmVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNFeHBpcmVkLCBzZXRJc0V4cGlyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFthbHJlYWR5U2lnbiwgc2V0QWxyZWFkeVNpZ25dID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtjb250YWluZXJXSCwgc2V0Q29udGFpbmVyV0hdID0gdXNlU3RhdGUoe30pO1xyXG4gIGNvbnN0IFt2YWxpZGF0ZUFsZXJ0LCBzZXRWYWxpZGF0ZUFsZXJ0XSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbd2lkZ2V0c1RvdXIsIHNldFdpZGdldHNUb3VyXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbbWluUmVxdWlyZWRDb3VudCwgc2V0bWluUmVxdWlyZWRDb3VudF0gPSB1c2VTdGF0ZSgpO1xyXG4gIGNvbnN0IFtzZW5kSW5PcmRlciwgc2V0U2VuZEluT3JkZXJdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtjdXJyV2lkZ2V0c0RldGFpbHMsIHNldEN1cnJXaWRnZXRzRGV0YWlsc10gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgY29uc3QgW2lzU3Vic2NyaXB0aW9uRXhwaXJlZCwgc2V0SXNTdWJzY3JpcHRpb25FeHBpcmVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbZXh0VXNlcklkLCBzZXRFeHRVc2VySWRdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2lzRW1haWxWZXJpZmllZCwgc2V0SXNFbWFpbFZlcmlmaWVkXSA9IHVzZVN0YXRlKHRydWUpO1xyXG4gIGNvbnN0IFtpc1ZlcmlmeU1vZGFsLCBzZXRJc1ZlcmlmeU1vZGFsXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbb3RwLCBzZXRPdHBdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW2NvbnRyYWN0TmFtZSwgc2V0Q29udHJhY3ROYW1lXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFt6b29tUGVyY2VudCwgc2V0Wm9vbVBlcmNlbnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgY29uc3QgW3NjYWxlLCBzZXRTY2FsZV0gPSB1c2VTdGF0ZSgxKTtcclxuICBjb25zdCBbdW5pcXVlSWQsIHNldFVuaXF1ZUlkXSA9IHVzZVN0YXRlKFwiXCIpO1xyXG4gIGNvbnN0IFtpc1B1YmxpY1RlbXBsYXRlLCBzZXRJc1B1YmxpY1RlbXBsYXRlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbY29udGFjdCwgc2V0Q29udGFjdF0gPSB1c2VTdGF0ZSh7IG5hbWU6IFwiXCIsIHBob25lOiBcIlwiLCBlbWFpbDogXCJcIiB9KTtcclxuICBjb25zdCBbaXNPdHAsIHNldElzT3RwXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW3Jlcywgc2V0UmVzXSA9IHVzZVN0YXRlKHt9KTtcclxuICBjb25zdCBbZG9jdW1lbnRJZCwgc2V0RG9jdW1lbnRJZF0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBbaXNQdWJsaWNDb250YWN0LCBzZXRJc1B1YmxpY0NvbnRhY3RdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtwZGZBcnJheUJ1ZmZlciwgc2V0UGRmQXJyYXlCdWZmZXJdID0gdXNlU3RhdGUoXCJcIik7XHJcbiAgY29uc3QgW3BsYW5jb2RlLCBzZXRQbGFuQ29kZV0gPSB1c2VTdGF0ZShcIlwiKTtcclxuICBjb25zdCBpc0hlYWRlciA9IHVzZVNlbGVjdG9yKChzdGF0ZSkgPT4gc3RhdGUuc2hvd0hlYWRlcik7XHJcbiAgY29uc3QgZGl2UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gIGNvbnN0IFtpc0Rvd25sb2FkTW9kYWwsIHNldElzRG93bmxvYWRNb2RhbF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIGNvbnN0IGlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPCA3Njc7XHJcblxyXG4gIGxldCBpc0d1ZXN0U2lnbkZsb3cgPSBmYWxzZTtcclxuICBsZXQgc2VuZG1haWw7XHJcbiAgbGV0IGdldERvY0lkID0gXCJcIjtcclxuICBsZXQgY29udGFjdEJvb2tJZCA9IFwiXCI7XHJcbiAgY29uc3Qgcm91dGUgPSAhcHJvcHMudGVtcGxhdGVJZCAmJiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgY29uc3QgZ2V0UXVlcnkgPSAhcHJvcHMudGVtcGxhdGVJZCAmJiB3aW5kb3cubG9jYXRpb24/LnNlYXJjaD8uc3BsaXQoXCI/XCIpOyAvL1snJywnc2VuZG1haWw9ZmFsc2UnXVxyXG4gIGlmIChnZXRRdWVyeSkge1xyXG4gICAgc2VuZG1haWwgPSBnZXRRdWVyeT8uWzFdPy5zcGxpdChcIj1cIilbMV07IC8vZmFsc2VcclxuICB9XHJcblxyXG4gIGNvbnN0IHJvdXRlSWQgPSByb3V0ZSAmJiByb3V0ZT8uc3BsaXQoXCIvXCIpOyAvLyBbJycsICdsb2FkJywgJ3JlY2lwaWVudFNpZ25QZGYnLCAnOmRvY0lkJywgJzpjb250YWN0Qm9va0lkJ11cclxuICBpZiAocm91dGVJZCAmJiByb3V0ZUlkLmxlbmd0aCA+IDQpIHtcclxuICAgIC8vIHRoaXMgY29uZGl0aW9uIHdpbGwgYmUgb2NjdXIgb25seSBpbiBndWVzdCBmbG93IGluIHdoaWNoIGxvYWQgcm91dGVJZCB3aWxsIGJlIGluY2x1ZGVcclxuICAgIGlzR3Vlc3RTaWduRmxvdyA9IHRydWU7XHJcbiAgICBnZXREb2NJZCA9IHJvdXRlSWRbM107XHJcbiAgICBjb250YWN0Qm9va0lkID0gcm91dGVJZFs0XTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gdGhpcyBjb25kaXRpb24gd2lsbCBiZSBvY2N1ciBvbmx5IGluIGlmIHVzZXIgaXMgbG9nZ2VkIGluIGFuZCBsb2FkIHJvdXRlSWQgd2lsbCBiZSBleGNsdWRlXHJcbiAgICBnZXREb2NJZCA9IHJvdXRlSWRbMl07XHJcbiAgICBjb250YWN0Qm9va0lkID0gcm91dGVJZD8uWzNdIHx8IFwiXCI7XHJcbiAgfVxyXG4gIGxldCBnZXREb2N1bWVudElkID0gZ2V0RG9jSWQgfHwgZG9jdW1lbnRJZDtcclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKGdldERvY3VtZW50SWQpIHtcclxuICAgICAgc2V0RG9jdW1lbnRJZChnZXREb2N1bWVudElkKTtcclxuICAgICAgZ2V0RG9jdW1lbnREZXRhaWxzKGdldERvY3VtZW50SWQpO1xyXG4gICAgfSBlbHNlIGlmIChwcm9wcy50ZW1wbGF0ZUlkKSB7XHJcbiAgICAgIGdldFRlbXBsYXRlRGV0YWlscygpO1xyXG4gICAgfVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xyXG4gIH0sIFtwcm9wcy50ZW1wbGF0ZUlkLCBnZXREb2N1bWVudElkXSk7XHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IHVwZGF0ZVNpemUgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChkaXZSZWYuY3VycmVudCkge1xyXG4gICAgICAgIGNvbnN0IHBkZldpZHRoID0gcGRmTmV3V2lkdGhGdW4oZGl2UmVmKTtcclxuICAgICAgICBzZXRQZGZOZXdXaWR0aChwZGZXaWR0aCk7XHJcbiAgICAgICAgc2V0Q29udGFpbmVyV0goe1xyXG4gICAgICAgICAgd2lkdGg6IGRpdlJlZi5jdXJyZW50Lm9mZnNldFdpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBkaXZSZWYuY3VycmVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBVc2Ugc2V0VGltZW91dCB0byB3YWl0IGZvciB0aGUgdHJhbnNpdGlvbiB0byBjb21wbGV0ZVxyXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KHVwZGF0ZVNpemUsIDEwMCk7IC8vIG1hdGNoIHRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uXHJcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcclxuICB9LCBbZGl2UmVmLmN1cnJlbnQsIGlzSGVhZGVyXSk7XHJcbiAgLy9mdW5jdGlvbiB0byB1c2UgcmVzZW5kIG90cCBmb3IgZW1haWwgdmVyaWZpY2F0aW9uXHJcbiAgY29uc3QgaGFuZGxlUmVzZW5kID0gYXN5bmMgKGUpID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHNldE90cExvYWRlcih0cnVlKTtcclxuICAgIGNvbnN0IGxvY2FsdXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShsb2NhbHVzZXIpO1xyXG4gICAgYXdhaXQgaGFuZGxlU2VuZE9UUChjdXJyZW50VXNlcj8uZW1haWwpO1xyXG4gICAgc2V0T3RwTG9hZGVyKGZhbHNlKTtcclxuICAgIGFsZXJ0KHQoXCJvdHAtc2VudC1hbGVydFwiKSk7XHJcbiAgfTtcclxuICAvL2BoYW5kbGVWZXJpZnlFbWFpbGAgZnVuY3Rpb24gaXMgdXNlZCB0byB2ZXJpZnkgZW1haWwgd2l0aCBvdHBcclxuICBjb25zdCBoYW5kbGVWZXJpZnlFbWFpbCA9IGFzeW5jIChlKSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBzZXRPdHBMb2FkZXIodHJ1ZSk7XHJcbiAgICBjb25zdCBsb2NhbHVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgYFBhcnNlLyR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpfS9jdXJyZW50VXNlcmBcclxuICAgICk7XHJcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IEpTT04ucGFyc2UobG9jYWx1c2VyKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc0VtYWlsID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwidmVyaWZ5ZW1haWxcIiwge1xyXG4gICAgICAgIG90cDogb3RwLFxyXG4gICAgICAgIGVtYWlsOiBjdXJyZW50VXNlcj8uZW1haWxcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChyZXNFbWFpbD8ubWVzc2FnZSA9PT0gXCJFbWFpbCBpcyB2ZXJpZmllZC5cIikge1xyXG4gICAgICAgIHNldElzRW1haWxWZXJpZmllZCh0cnVlKTtcclxuICAgICAgICBhbGVydCh0KFwiRW1haWwtdmVyaWZpZWQtYWxlcnQtMVwiKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzRW1haWw/Lm1lc3NhZ2UgPT09IFwiRW1haWwgaXMgYWxyZWFkeSB2ZXJpZmllZC5cIikge1xyXG4gICAgICAgIHNldElzRW1haWxWZXJpZmllZCh0cnVlKTtcclxuICAgICAgICBhbGVydCh0KFwiRW1haWwtdmVyaWZpZWQtYWxlcnQtMlwiKSk7XHJcbiAgICAgIH1cclxuICAgICAgc2V0T3RwKFwiXCIpO1xyXG4gICAgICBzZXRJc1ZlcmlmeU1vZGFsKGZhbHNlKTtcclxuICAgICAgLy9oYW5kbGVSZWNpcGllbnRTaWduKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBhbGVydChlcnJvci5tZXNzYWdlKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHNldE90cExvYWRlcihmYWxzZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuICAvL2BoYW5kbGVWZXJpZnlCdG5gIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBvdHAgb24gdXNlciBtYWlsXHJcbiAgY29uc3QgaGFuZGxlVmVyaWZ5QnRuID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgc2V0SXNWZXJpZnlNb2RhbCh0cnVlKTtcclxuICAgIGNvbnN0IGxvY2FsdXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICBgUGFyc2UvJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIil9L2N1cnJlbnRVc2VyYFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShsb2NhbHVzZXIpO1xyXG4gICAgYXdhaXQgaGFuZGxlU2VuZE9UUChjdXJyZW50VXNlcj8uZW1haWwpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZU5hdmlnYXRpb24gPSAoKSA9PiB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL3N1YnNjcmlwdGlvblwiO1xyXG4gIH07XHJcbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tJc1N1YnNjcmliZWQoZXh0VXNlcklkLCBjb250YWN0SWQpIHtcclxuICAgIGNvbnN0IGlzR3Vlc3RTaWduID0gaXNHdWVzdFNpZ25GbG93IHx8IGZhbHNlO1xyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2hTdWJzY3JpcHRpb24oZXh0VXNlcklkLCBjb250YWN0SWQsIGlzR3Vlc3RTaWduKTtcclxuICAgIGNvbnN0IHBsYW4gPSByZXMucGxhbjtcclxuICAgIGNvbnN0IGJpbGxpbmdEYXRlID0gcmVzPy5iaWxsaW5nRGF0ZTtcclxuICAgIGNvbnN0IHN0YXR1cyA9IHJlcz8uc3RhdHVzO1xyXG4gICAgc2V0UGxhbkNvZGUocGxhbik7XHJcbiAgICBpZiAocGxhbiA9PT0gXCJmcmVlcGxhblwiKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChiaWxsaW5nRGF0ZSkge1xyXG4gICAgICBpZiAobmV3IERhdGUoYmlsbGluZ0RhdGUpID4gbmV3IERhdGUoKSkge1xyXG4gICAgICAgIHNldElzU3Vic2NyaWJlZCh0cnVlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoaXNHdWVzdFNpZ24pIHtcclxuICAgICAgICAgIHNldElzU3Vic2NyaXB0aW9uRXhwaXJlZCh0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaGFuZGxlTmF2aWdhdGlvbihwbGFuKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoaXNHdWVzdFNpZ24pIHtcclxuICAgICAgaWYgKHN0YXR1cykge1xyXG4gICAgICAgIHNldElzU3Vic2NyaWJlZCh0cnVlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXRJc1N1YnNjcmlwdGlvbkV4cGlyZWQodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChpc0d1ZXN0U2lnbikge1xyXG4gICAgICAgIHNldElzU3Vic2NyaXB0aW9uRXhwaXJlZCh0cnVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBoYW5kbGVOYXZpZ2F0aW9uKHJlcy5wbGFuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvL2Z1bmN0aW9uIGZvciBnZXQgZG9jdW1lbnQgZGV0YWlscyBmb3IgcGVydGljdWxhciBzaWduZXIgd2l0aCBzaWduZXInb2JqZWN0IGlkXHJcbiAgY29uc3QgZ2V0VGVtcGxhdGVEZXRhaWxzID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFyYW1zID0geyB0ZW1wbGF0ZUlkOiBwcm9wcy50ZW1wbGF0ZUlkLCBpc3B1YmxpYzogdHJ1ZSB9O1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZURlYXRpbHMgPSBhd2FpdCBheGlvcy5wb3N0KFxyXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvZ2V0VGVtcGxhdGVgLFxyXG4gICAgICAgIHBhcmFtcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgICBzZXNzaW9udG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGRvY3VtZW50RGF0YSA9XHJcbiAgICAgICAgdGVtcGxhdGVEZWF0aWxzLmRhdGEgJiYgdGVtcGxhdGVEZWF0aWxzLmRhdGEucmVzdWx0XHJcbiAgICAgICAgICA/IFt0ZW1wbGF0ZURlYXRpbHMuZGF0YS5yZXN1bHRdXHJcbiAgICAgICAgICA6IFtdO1xyXG4gICAgICBpZiAoZG9jdW1lbnREYXRhICYmIGRvY3VtZW50RGF0YVswXT8uZXJyb3IpIHtcclxuICAgICAgICBwcm9wcz8uc2V0VGVtcGxhdGVTdGF0dXMoe1xyXG4gICAgICAgICAgc3RhdHVzOiBcIkludmFsaWRcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGRvY3VtZW50RGF0YSAmJiBkb2N1bWVudERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGlmIChkb2N1bWVudERhdGFbMF0/LklzUHVibGljKSB7XHJcbiAgICAgICAgICBwcm9wcz8uc2V0VGVtcGxhdGVTdGF0dXMoe1xyXG4gICAgICAgICAgICBzdGF0dXM6IFwiU3VjY2Vzc1wiXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGNvbnN0IHVybCA9XHJcbiAgICAgICAgICAgIGRvY3VtZW50RGF0YVswXSAmJlxyXG4gICAgICAgICAgICAoZG9jdW1lbnREYXRhWzBdPy5TaWduZWRVcmwgfHwgZG9jdW1lbnREYXRhWzBdPy5VUkwpO1xyXG4gICAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICAvL2NvbnZlcnQgZG9jdW1lbnQgdXJsIGluIGFycmF5IGJ1ZmZlciBmb3JtYXQgdG8gdXNlIGVtYmVkIHdpZGdldHMgaW4gcGRmIHVzaW5nIHBkZi1saWJcclxuICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBjb252ZXJ0UGRmQXJyYXlCdWZmZXIodXJsKTtcclxuICAgICAgICAgICAgaWYgKGFycmF5QnVmZmVyID09PSBcIkVycm9yXCIpIHtcclxuICAgICAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgc2V0UGRmQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzZXRJc1B1YmxpY1RlbXBsYXRlKHRydWUpO1xyXG4gICAgICAgICAgY29uc3QgZ2V0UHVibGljUm9sZSA9IGRvY3VtZW50RGF0YVswXT8uUHVibGljUm9sZVswXTtcclxuICAgICAgICAgIGNvbnN0IGdldFVuaXF1ZUlkRGV0YWlscyA9IGRvY3VtZW50RGF0YVswXT8uUGxhY2Vob2xkZXJzLmZpbmQoXHJcbiAgICAgICAgICAgICh4KSA9PiB4LlJvbGUgPT09IGdldFB1YmxpY1JvbGVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoZ2V0VW5pcXVlSWREZXRhaWxzKSB7XHJcbiAgICAgICAgICAgIHNldFVuaXF1ZUlkKGdldFVuaXF1ZUlkRGV0YWlscy5JZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzZXRTaWduZXJQb3MoZG9jdW1lbnREYXRhWzBdPy5QbGFjZWhvbGRlcnMpO1xyXG4gICAgICAgICAgbGV0IHBsYWNlaG9sZGVyc09yU2lnbmVycyA9IFtdO1xyXG4gICAgICAgICAgLy8gY29uc3QgcGxhY2Vob2xkZXIgPSBkb2N1bWVudERhdGFbMF0/LlBsYWNlaG9sZGVycztcclxuICAgICAgICAgIGZvciAoY29uc3QgcGxhY2Vob2xkZXIgb2YgZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycykge1xyXG4gICAgICAgICAgICAvL2BlbWFpbEV4aXN0YCB2YXJpYWJsZSB0byBoYW5kbGUgY29uZGl0aW9uIGZvciBxdWljayBzZW5kIGZsb3cgYW5kIHNob3cgdW5zaWduZWQgc2lnbmVycyBsaXN0XHJcbiAgICAgICAgICAgIGNvbnN0IHNpZ25lcklkRXhpc3QgPSBwbGFjZWhvbGRlcj8uc2lnbmVyT2JqSWQ7XHJcbiAgICAgICAgICAgIGlmIChzaWduZXJJZEV4aXN0KSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZ2V0U2lnbmVyRGF0YSA9IGRvY3VtZW50RGF0YVswXS5TaWduZXJzLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5vYmplY3RJZCA9PT0gcGxhY2Vob2xkZXI/LnNpZ25lck9iaklkXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcnNPclNpZ25lcnMucHVzaChnZXRTaWduZXJEYXRhKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcnNPclNpZ25lcnMucHVzaChwbGFjZWhvbGRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNldFVuU2lnbmVkU2lnbmVycyhwbGFjZWhvbGRlcnNPclNpZ25lcnMpO1xyXG4gICAgICAgICAgc2V0UGRmRGV0YWlscyhkb2N1bWVudERhdGEpO1xyXG4gICAgICAgICAgc2V0SXNMb2FkaW5nKHtcclxuICAgICAgICAgICAgaXNMb2FkOiBmYWxzZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHByb3BzPy5zZXRUZW1wbGF0ZVN0YXR1cyh7XHJcbiAgICAgICAgICAgIHN0YXR1czogXCJQcml2YXRlXCJcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwcm9wcz8uc2V0VGVtcGxhdGVTdGF0dXMoe1xyXG4gICAgICAgICAgc3RhdHVzOiBcIkludmFsaWRcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJlcnIgaW4gZ2V0IHRlbXBsYXRlIGRldGFpbHMgXCIsIGVycik7XHJcbiAgICAgIGlmIChlcnI/LnJlc3BvbnNlPy5kYXRhPy5jb2RlID09PSAxMDEpIHtcclxuICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwiZXJyb3ItdGVtcGxhdGVcIikpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiBmb3IgZ2V0IGRvY3VtZW50IGRldGFpbHMgZm9yIHBlcnRpY3VsYXIgc2lnbmVyIHdpdGggc2lnbmVyJ29iamVjdCBpZFxyXG4gIGNvbnN0IGdldERvY3VtZW50RGV0YWlscyA9IGFzeW5jIChkb2NJZCwgaXNOZXh0VXNlcikgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc2VuZGVyVXNlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICAgIGBQYXJzZS8ke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKX0vY3VycmVudFVzZXJgXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGpzb25TZW5kZXIgPSBKU09OLnBhcnNlKHNlbmRlclVzZXIpO1xyXG4gICAgICAvLyBgY3VyclVzZXJJZGAgd2lsbCBiZSBjb250YWN0SWQgb3IgZXh0VXNlcklkXHJcbiAgICAgIGxldCBjdXJyVXNlcklkO1xyXG4gICAgICAvL2dldHRpbmcgZG9jdW1lbnQgZGV0YWlsc1xyXG4gICAgICBjb25zdCBkb2N1bWVudERhdGEgPSBhd2FpdCBjb250cmFjdERvY3VtZW50KGRvY0lkKTtcclxuICAgICAgaWYgKGRvY3VtZW50RGF0YSAmJiBkb2N1bWVudERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHVybCA9XHJcbiAgICAgICAgICBkb2N1bWVudERhdGFbMF0gJiZcclxuICAgICAgICAgIChkb2N1bWVudERhdGFbMF0/LlNpZ25lZFVybCB8fCBkb2N1bWVudERhdGFbMF0/LlVSTCk7XHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgLy9jb252ZXJ0IGRvY3VtZW50IHVybCBpbiBhcnJheSBidWZmZXIgZm9ybWF0IHRvIHVzZSBlbWJlZCB3aWRnZXRzIGluIHBkZiB1c2luZyBwZGYtbGliXHJcbiAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGNvbnZlcnRQZGZBcnJheUJ1ZmZlcih1cmwpO1xyXG4gICAgICAgICAgaWYgKGFycmF5QnVmZmVyID09PSBcIkVycm9yXCIpIHtcclxuICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2V0UGRmQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEV4dFVzZXJJZChkb2N1bWVudERhdGFbMF0/LkV4dFVzZXJQdHI/Lm9iamVjdElkKTtcclxuICAgICAgICBjb25zdCBpc0NvbXBsZXRlZCA9XHJcbiAgICAgICAgICBkb2N1bWVudERhdGFbMF0uSXNDb21wbGV0ZWQgJiYgZG9jdW1lbnREYXRhWzBdLklzQ29tcGxldGVkO1xyXG4gICAgICAgIGNvbnN0IGV4cGlyZURhdGUgPSBkb2N1bWVudERhdGFbMF0uRXhwaXJ5RGF0ZS5pc287XHJcbiAgICAgICAgY29uc3QgZGVjbGluZWQgPVxyXG4gICAgICAgICAgZG9jdW1lbnREYXRhWzBdLklzRGVjbGluZWQgJiYgZG9jdW1lbnREYXRhWzBdLklzRGVjbGluZWQ7XHJcbiAgICAgICAgY29uc3QgZXhwaXJlVXBkYXRlRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZURhdGUpLmdldFRpbWUoKTtcclxuICAgICAgICBjb25zdCBjdXJyRGF0ZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIGNvbnN0IGdldFNpZ25lcnMgPSBkb2N1bWVudERhdGFbMF0uU2lnbmVycztcclxuICAgICAgICBjb25zdCBnZXRDdXJyZW50U2lnbmVyID0gZ2V0U2lnbmVycz8uZmluZChcclxuICAgICAgICAgIChkYXRhKSA9PiBkYXRhLlVzZXJJZC5vYmplY3RJZCA9PT0ganNvblNlbmRlcj8ub2JqZWN0SWRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjdXJyVXNlcklkID0gZ2V0Q3VycmVudFNpZ25lcj8ub2JqZWN0SWRcclxuICAgICAgICAgID8gZ2V0Q3VycmVudFNpZ25lci5vYmplY3RJZFxyXG4gICAgICAgICAgOiBjb250YWN0Qm9va0lkIHx8IFwiXCI7XHJcbiAgICAgICAgaWYgKGlzRW5hYmxlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICBhd2FpdCBjaGVja0lzU3Vic2NyaWJlZChcclxuICAgICAgICAgICAgZG9jdW1lbnREYXRhWzBdPy5FeHRVc2VyUHRyPy5vYmplY3RJZCxcclxuICAgICAgICAgICAgY3VyclVzZXJJZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1cnJVc2VySWQpIHtcclxuICAgICAgICAgIHNldFNpZ25lck9iamVjdElkKGN1cnJVc2VySWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZG9jdW1lbnREYXRhWzBdLlNpZ25lZFVybCkge1xyXG4gICAgICAgICAgc2V0UGRmVXJsKGRvY3VtZW50RGF0YVswXS5TaWduZWRVcmwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXRQZGZVcmwoZG9jdW1lbnREYXRhWzBdLlVSTCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xyXG4gICAgICAgICAgc2V0SXNTaWduZWQodHJ1ZSk7XHJcbiAgICAgICAgICBjb25zdCBkYXRhID0geyBpc0NlcnRpZmljYXRlOiB0cnVlLCBpc01vZGFsOiB0cnVlIH07XHJcbiAgICAgICAgICBzZXRBbHJlYWR5U2lnbih0cnVlKTtcclxuICAgICAgICAgIHNldElzQ29tcGxldGVkKGRhdGEpO1xyXG4gICAgICAgICAgc2V0SXNDZWxlYnJhdGlvbih0cnVlKTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2V0SXNDZWxlYnJhdGlvbihmYWxzZSksIDUwMDApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGVjbGluZWQpIHtcclxuICAgICAgICAgIGNvbnN0IGN1cnJlbnREZWNsaW5lID0geyBjdXJybnQ6IFwiYW5vdGhlclwiLCBpc0RlY2xpbmVkOiB0cnVlIH07XHJcbiAgICAgICAgICBzZXRJc0RlY2xpbmUoY3VycmVudERlY2xpbmUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY3VyckRhdGUgPiBleHBpcmVVcGRhdGVEYXRlKSB7XHJcbiAgICAgICAgICBjb25zdCBleHBpcmVEYXRlRm9ybWF0ID0gbW9tZW50KG5ldyBEYXRlKGV4cGlyZURhdGUpKS5mb3JtYXQoXHJcbiAgICAgICAgICAgIFwiTU1NIERELCBZWVlZXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBzZXRJc0V4cGlyZWQodHJ1ZSk7XHJcbiAgICAgICAgICBzZXRFeHBpcmVkRGF0ZShleHBpcmVEYXRlRm9ybWF0KTtcclxuICAgICAgICB9IC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHNpZ25lciBpcyBub3QgYSBsYXN0IHNpZ25lciBhbmQgaGFuZGxlIHRoZSBjb21wbGV0ZSBtZXNzYWdlLlxyXG4gICAgICAgIGVsc2UgaWYgKGlzTmV4dFVzZXIpIHtcclxuICAgICAgICAgIHNldElzQ2VsZWJyYXRpb24odHJ1ZSk7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHNldElzQ2VsZWJyYXRpb24oZmFsc2UpLCA1MDAwKTtcclxuICAgICAgICAgIHNldElzQ29tcGxldGVkKHtcclxuICAgICAgICAgICAgaXNNb2RhbDogdHJ1ZSxcclxuICAgICAgICAgICAgbWVzc2FnZTogdChcImRvY3VtZW50LXNpZ25lZC1hbGVydC0xXCIpXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGN1cnJVc2VySWQpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJyZW50VXNlciA9IGRvY3VtZW50RGF0YVswXS5QbGFjZWhvbGRlcnMuZmluZChcclxuICAgICAgICAgICAgICAoZGF0YSkgPT4gZGF0YT8uc2lnbmVyT2JqSWQgPT09IGN1cnJVc2VySWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKGNoZWNrQ3VycmVudFVzZXIpIHtcclxuICAgICAgICAgICAgICBzZXRDdXJyZW50U2lnbmVyKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGF1ZGl0dHJhaWxEYXRhID0gZG9jdW1lbnREYXRhPy5bMF0/LkF1ZGl0VHJhaWw/LmZpbHRlcihcclxuICAgICAgICAgIChkYXRhKSA9PiBkYXRhLkFjdGl2aXR5ID09PSBcIlNpZ25lZFwiXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBjaGVja0FscmVhZHlTaWduID1cclxuICAgICAgICAgIGRvY3VtZW50RGF0YT8uWzBdPy5BdWRpdFRyYWlsPy5zb21lKFxyXG4gICAgICAgICAgICAoZGF0YSkgPT5cclxuICAgICAgICAgICAgICBkYXRhPy5Vc2VyUHRyPy5vYmplY3RJZCA9PT0gY3VyclVzZXJJZCAmJlxyXG4gICAgICAgICAgICAgIGRhdGEuQWN0aXZpdHkgPT09IFwiU2lnbmVkXCJcclxuICAgICAgICAgICkgfHwgZmFsc2U7XHJcbiAgICAgICAgaWYgKGNoZWNrQWxyZWFkeVNpZ24pIHtcclxuICAgICAgICAgIHNldEFscmVhZHlTaWduKHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBvYmogPSBkb2N1bWVudERhdGE/LlswXTtcclxuICAgICAgICAgIHNldFNlbmRJbk9yZGVyKG9iaj8uU2VuZGluT3JkZXIgfHwgZmFsc2UpO1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBvYmogJiZcclxuICAgICAgICAgICAgb2JqPy5TaWduZXJzPy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgIG9iaj8uUGxhY2Vob2xkZXJzPy5sZW5ndGggPiAwXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICAgIGV2ZW50OiBcInZpZXdlZFwiLFxyXG4gICAgICAgICAgICAgIGNvbnRhY3RJZDogY3VyclVzZXJJZCxcclxuICAgICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogZG9jdW1lbnREYXRhPy5bMF0ub2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBmaWxlOiBkb2N1bWVudERhdGE/LlswXT8uU2lnbmVkVXJsIHx8IGRvY3VtZW50RGF0YT8uWzBdPy5VUkwsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBkb2N1bWVudERhdGE/LlswXS5OYW1lLFxyXG4gICAgICAgICAgICAgICAgbm90ZTogZG9jdW1lbnREYXRhPy5bMF0uTm90ZSB8fCBcIlwiLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRvY3VtZW50RGF0YT8uWzBdLkRlc2NyaXB0aW9uIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBzaWduZXJzOiBkb2N1bWVudERhdGE/LlswXS5TaWduZXJzPy5tYXAoKHgpID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHg/Lk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiB4Py5FbWFpbCxcclxuICAgICAgICAgICAgICAgICAgcGhvbmU6IHg/LlBob25lXHJcbiAgICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgICAgICB2aWV3ZWRCeTpcclxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnREYXRhPy5bMF0uU2lnbmVycz8uZmluZChcclxuICAgICAgICAgICAgICAgICAgICAoeCkgPT4geC5vYmplY3RJZCA9PT0gY3VyclVzZXJJZFxyXG4gICAgICAgICAgICAgICAgICApPy5FbWFpbCB8fCBqc29uU2VuZGVyPy5lbWFpbCxcclxuICAgICAgICAgICAgICAgIHZpZXdlZEF0OiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBkb2N1bWVudERhdGE/LlswXS5jcmVhdGVkQXRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IGF4aW9zLnBvc3QoXHJcbiAgICAgICAgICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2NhbGx3ZWJob29rYCxcclxuICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiWC1QYXJzZS1BcHBsaWNhdGlvbi1JZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb250b2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnIgXCIsIGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzaWduZXJzID0gW107XHJcbiAgICAgICAgbGV0IHVuU2lnbmVkU2lnbmVyID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyc09yU2lnbmVycyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgcGxhY2Vob2xkZXIgb2YgZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycykge1xyXG4gICAgICAgICAgLy9gZW1haWxFeGlzdGAgdmFyaWFibGUgdG8gaGFuZGxlIGNvbmRpdGlvbiBmb3IgcXVpY2sgc2VuZCBmbG93IGFuZCBzaG93IHVuc2lnbmVkIHNpZ25lcnMgbGlzdFxyXG4gICAgICAgICAgY29uc3Qgc2lnbmVySWRFeGlzdCA9IHBsYWNlaG9sZGVyPy5zaWduZXJPYmpJZDtcclxuICAgICAgICAgIGlmIChzaWduZXJJZEV4aXN0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdldFNpZ25lckRhdGEgPSBkb2N1bWVudERhdGFbMF0uU2lnbmVycy5maW5kKFxyXG4gICAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLm9iamVjdElkID09PSBwbGFjZWhvbGRlcj8uc2lnbmVyT2JqSWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXJzT3JTaWduZXJzLnB1c2goZ2V0U2lnbmVyRGF0YSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcnNPclNpZ25lcnMucHVzaChwbGFjZWhvbGRlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIGFscmVhZHkgc2lnbmVkIGRvY3VtZW50IGJ5IHNvbWVvbmVcclxuICAgICAgICBpZiAoYXVkaXR0cmFpbERhdGEgJiYgYXVkaXR0cmFpbERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgc2V0SXNEb2NJZCh0cnVlKTtcclxuXHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGxhY2Vob2xkZXJzT3JTaWduZXJzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrRW1haWwgPSBpdGVtPy5lbWFpbDtcclxuICAgICAgICAgICAgLy9pZiBlbWFpbCBleGlzdCB0aGVuIGNvbXBhcmUgdXNlciBzaWduZWQgYnkgdXNpbmcgZW1haWwgZWxzZSBzaWduZXJzIG9iamVjdElkXHJcbiAgICAgICAgICAgIGNvbnN0IGVtYWlsT3JJZCA9IGNoZWNrRW1haWwgPyBpdGVtLmVtYWlsIDogaXRlbT8ub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgIC8vYGlzU2lnbmVkU2lnbmF0dXJlYCB2YXJpYWJsZSB0byBoYW5kbGUgYnJlYWsgbG9vcCB3aGVuZXZlciBpdCBnZXQgdHJ1ZVxyXG4gICAgICAgICAgICBsZXQgaXNTaWduZWRTaWduYXR1cmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy9jaGVja2luZyB0aGUgc2lnbmVyIHdobyBzaWduZWQgdGhlIGRvY3VtZW50IGJ5IHVzaW5nIGF1ZGl0IHRyYWlsIGRldGFpbHMuXHJcbiAgICAgICAgICAgIC8vYW5kIHNhdmUgc2lnbmVkU2lnbmVycyBhbmQgdW5zaWduZWRTaWduZXJzIGRldGFpbHNcclxuICAgICAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgYXVkaXR0cmFpbERhdGEpIHtcclxuICAgICAgICAgICAgICBjb25zdCBzaWduZWRFeGlzdCA9IGNoZWNrRW1haWxcclxuICAgICAgICAgICAgICAgID8gZG9jPy5Vc2VyUHRyPy5FbWFpbFxyXG4gICAgICAgICAgICAgICAgOiBkb2M/LlVzZXJQdHI/Lm9iamVjdElkO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZW1haWxPcklkID09PSBzaWduZWRFeGlzdCkge1xyXG4gICAgICAgICAgICAgICAgc2lnbmVycy5wdXNoKHsgLi4uaXRlbSB9KTtcclxuICAgICAgICAgICAgICAgIGlzU2lnbmVkU2lnbmF0dXJlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWlzU2lnbmVkU2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICAgICAgdW5TaWduZWRTaWduZXIucHVzaCh7IC4uLml0ZW0gfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNldFNpZ25lZFNpZ25lcnMoc2lnbmVycyk7XHJcbiAgICAgICAgICBzZXRVblNpZ25lZFNpZ25lcnModW5TaWduZWRTaWduZXIpO1xyXG4gICAgICAgICAgc2V0U2lnbmVyUG9zKGRvY3VtZW50RGF0YVswXS5QbGFjZWhvbGRlcnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL2Vsc2UgY29uZGl0aW9uIGlzIHNob3cgdGhlcmUgYXJlIG5vIGRldGFpbHMgaW4gYXVkaXQgdHJhaWwgdGhlbiBkaXJlY3QgcHVzaCBhbGwgc2lnbmVycyBkZXRhaWxzXHJcbiAgICAgICAgICAvL2luIHVuc2lnbmVkc2lnbmVycyBhcnJheVxyXG4gICAgICAgICAgc2V0VW5TaWduZWRTaWduZXJzKHBsYWNlaG9sZGVyc09yU2lnbmVycyk7XHJcbiAgICAgICAgICBzZXRTaWduZXJQb3MoZG9jdW1lbnREYXRhWzBdLlBsYWNlaG9sZGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFBkZkRldGFpbHMoZG9jdW1lbnREYXRhKTtcclxuICAgICAgICAvL2NoZWNraW5nIGlmIGNvbmRpdGlvbiBjdXJyZW50IHVzZXIgYWxyZWFkeSBzaWduIG9yIG93bmVyIGRvZXMgbm90IGV4aXN0IGFzIGEgc2lnbmVyIG9yIGRvY3VtZW50IGhhcyBiZWVuIGRlY2xpbmVkIGJ5IHNvbWVvbmUgb3IgZG9jdW1lbnQgaGFzIGJlZW4gZXhwaXJlZFxyXG4gICAgICAgIC8vdGhlbiBzdG9wIHRvIGRpc3BsYXkgdG91ciBtZXNzYWdlXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgY2hlY2tBbHJlYWR5U2lnbiB8fFxyXG4gICAgICAgICAgIWN1cnJVc2VySWQgfHxcclxuICAgICAgICAgIGRlY2xpbmVkIHx8XHJcbiAgICAgICAgICBjdXJyRGF0ZSA+IGV4cGlyZVVwZGF0ZURhdGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHNldFJlcXVlc3RTaWduVG91cih0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgaXNFbmFibGVPVFAgPSBkb2N1bWVudERhdGE/LlswXT8uSXNFbmFibGVPVFAgfHwgZmFsc2U7XHJcbiAgICAgICAgICBpZiAoIWlzRW5hYmxlT1RQKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcmVzQ29udGFjdCA9IGF3YWl0IGF4aW9zLnBvc3QoXHJcbiAgICAgICAgICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL2dldGNvbnRhY3RgLFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBjb250YWN0SWQ6IGN1cnJVc2VySWRcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNvbnRhY3QgPSByZXNDb250YWN0Py5kYXRhPy5yZXN1bHQ7XHJcbiAgICAgICAgICAgICAgc2V0Q29udHJhY3ROYW1lKFwiX0NvbnRhY3Rib29rXCIpO1xyXG4gICAgICAgICAgICAgIHNldFNpZ25lclVzZXJJZChjb250YWN0Py5vYmplY3RJZCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG91ckRhdGEgPSBjb250YWN0Py5Ub3VyU3RhdHVzICYmIGNvbnRhY3Q/LlRvdXJTdGF0dXM7XHJcbiAgICAgICAgICAgICAgaWYgKHRvdXJEYXRhICYmIHRvdXJEYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrVG91clJlcXVlc3QgPVxyXG4gICAgICAgICAgICAgICAgICB0b3VyRGF0YT8uc29tZSgoZGF0YSkgPT4gZGF0YT8ucmVxdWVzdFNpZ24pIHx8IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgc2V0VG91clN0YXR1cyh0b3VyRGF0YSk7XHJcbiAgICAgICAgICAgICAgICBzZXRSZXF1ZXN0U2lnblRvdXIoY2hlY2tUb3VyUmVxdWVzdCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVyciB3aGlsZSBnZXR0aW5nIHRvdXJzdGF0dXNcIiwgZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy9lbHNlIGNvbmRpdGlvbiB0byBjaGVjayBjdXJyZW50IHVzZXIgZXhpc3QgaW4gY29udHJhY3RzX1VzZXJzIGNsYXNzIGFuZCBjaGVjayB0b3VyIG1lc3NhZ2Ugc3RhdHVzXHJcbiAgICAgICAgICAgIC8vaWYgbm90IHRoZW4gY2hlY2sgdXNlciBleGlzdCBpbiBjb250cmFjdHNfQ29udGFjdGJvb2sgY2xhc3MgYW5kIGNoZWNrIHRvdXIgbWVzc2FnZSBzdGF0dXNcclxuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY29udHJhY3RVc2VycygpO1xyXG4gICAgICAgICAgICBpZiAocmVzID09PSBcIkVycm9yOiBTb21ldGhpbmcgd2VudCB3cm9uZyFcIikge1xyXG4gICAgICAgICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNbMF0gJiYgcmVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICBzZXRDb250cmFjdE5hbWUoXCJfVXNlcnNcIik7XHJcbiAgICAgICAgICAgICAgY3VyclVzZXJJZCA9IHJlc1swXS5vYmplY3RJZDtcclxuICAgICAgICAgICAgICBzZXRTaWduZXJVc2VySWQoY3VyclVzZXJJZCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG91ckRhdGEgPSByZXNbMF0uVG91clN0YXR1cyAmJiByZXNbMF0uVG91clN0YXR1cztcclxuICAgICAgICAgICAgICBpZiAodG91ckRhdGEgJiYgdG91ckRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tUb3VyUmVxdWVzdCA9IHRvdXJEYXRhLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGE/LnJlcXVlc3RTaWduXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgc2V0VG91clN0YXR1cyh0b3VyRGF0YSk7XHJcbiAgICAgICAgICAgICAgICBzZXRSZXF1ZXN0U2lnblRvdXIoY2hlY2tUb3VyUmVxdWVzdFswXT8ucmVxdWVzdFNpZ24gfHwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXM/Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvbnRhY3RCb29rKGN1cnJVc2VySWQpO1xyXG4gICAgICAgICAgICAgIGlmIChyZXMgPT09IFwiRXJyb3I6IFNvbWV0aGluZyB3ZW50IHdyb25nIVwiKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNbMF0gJiYgcmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgc2V0Q29udHJhY3ROYW1lKFwiX0NvbnRhY3Rib29rXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSByZXNbMF0ub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgICAgICBzZXRTaWduZXJVc2VySWQob2JqZWN0SWQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdG91ckRhdGEgPSByZXNbMF0uVG91clN0YXR1cyAmJiByZXNbMF0uVG91clN0YXR1cztcclxuICAgICAgICAgICAgICAgIGlmICh0b3VyRGF0YSAmJiB0b3VyRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrVG91clJlcXVlc3QgPSB0b3VyRGF0YS5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgKGRhdGEpID0+IGRhdGE/LnJlcXVlc3RTaWduXHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIHNldFRvdXJTdGF0dXModG91ckRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBzZXRSZXF1ZXN0U2lnblRvdXIoY2hlY2tUb3VyUmVxdWVzdFswXT8ucmVxdWVzdFNpZ24gfHwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgc2V0SGFuZGxlRXJyb3IodChcInVzZXItbm90LWV4aXN0XCIpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNVaUxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIGRvY3VtZW50RGF0YSA9PT0gXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIgfHxcclxuICAgICAgICAoZG9jdW1lbnREYXRhLnJlc3VsdCAmJiBkb2N1bWVudERhdGEucmVzdWx0LmVycm9yKVxyXG4gICAgICApIHtcclxuICAgICAgICBzZXRIYW5kbGVFcnJvcih0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKSk7XHJcbiAgICAgICAgc2V0SXNMb2FkaW5nKHsgaXNMb2FkOiBmYWxzZSB9KTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVyciBpbiAgZ2V0RG9jdW1lbnQgY2xvdWQgZnVuY3Rpb24gXCIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJuby1kYXRhXCIpKTtcclxuICAgICAgICBzZXRJc1VpTG9hZGluZyh7IGlzTG9hZDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy9mdW5jdGlvbiB0byBnZXQgZGVmYXVsdCBzaWduYXR1ciBlb2YgY3VycmVudCB1c2VyIGZyb20gYGNvbnRyYWN0c19TaWduYXR1cmVgIGNsYXNzXHJcbiAgICAgIGNvbnN0IGRlZmF1bHRTaWduUmVzID0gYXdhaXQgZ2V0RGVmYXVsdFNpZ25hdHVyZShqc29uU2VuZGVyPy5vYmplY3RJZCk7XHJcbiAgICAgIGlmIChkZWZhdWx0U2lnblJlcz8uc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgIGNvbnN0IHNpZ24gPSBkZWZhdWx0U2lnblJlcz8ucmVzPy5kZWZhdWx0U2lnbmF0dXJlIHx8IFwiXCI7XHJcbiAgICAgICAgY29uc3QgaW5pdGlhbHMgPSBkZWZhdWx0U2lnblJlcz8ucmVzPy5kZWZhdWx0SW5pdGlhbCB8fCBcIlwiO1xyXG4gICAgICAgIHNldERlZmF1bHRTaWduSW1nKHNpZ24pO1xyXG4gICAgICAgIHNldE15SW5pdGlhbChpbml0aWFscyk7XHJcbiAgICAgIH1cclxuICAgICAgc2V0SXNMb2FkaW5nKHsgaXNMb2FkOiBmYWxzZSB9KTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkVycm9yOiBlcnJvciBpbiBnZXREb2N1bWVudERldGFpbHNcIiwgZXJyKTtcclxuICAgICAgc2V0SGFuZGxlRXJyb3IoXCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3JvbmchXCIpO1xyXG4gICAgICBzZXRJc0xvYWRpbmcoeyBpc0xvYWQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiBmb3IgZW1iZWQgc2lnbmF0dXJlIG9yIGltYWdlIHVybCBpbiBwZGZcclxuICBhc3luYyBmdW5jdGlvbiBlbWJlZFdpZGdldHNEYXRhKCkge1xyXG4gICAgLy9mb3IgZW1haWxWZXJpZmllZCBkYXRhIGNoZWNraW5nIGZpcnN0IGluIGxvY2Fsc3RvcmFnZVxyXG4gICAgY29uc3QgbG9jYWx1c2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgIGBQYXJzZS8ke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKX0vY3VycmVudFVzZXJgXHJcbiAgICApO1xyXG4gICAgbGV0IGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShsb2NhbHVzZXIpO1xyXG4gICAgbGV0IGlzRW1haWxWZXJpZmllZCA9IGN1cnJlbnRVc2VyPy5lbWFpbFZlcmlmaWVkO1xyXG4gICAgY29uc3QgaXNFbmFibGVPVFAgPSBwZGZEZXRhaWxzPy5bMF0/LklzRW5hYmxlT1RQIHx8IGZhbHNlO1xyXG4gICAgLy9pZiBlbWFpbFZlcmlmaWVkIGRhdGEgaXMgbm90IHByZXNlbnQgaW4gbG9jYWwgdXNlciBkZXRhaWxzIHRoZW4gZmV0Y2ggYWdhaW4gaW4gX1VzZXIgY2xhc3NcclxuICAgIGlmIChpc0VuYWJsZU9UUCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmICghY3VycmVudFVzZXI/LmVtYWlsVmVyaWZpZWQpIHtcclxuICAgICAgICAgIGNvbnN0IHVzZXJRdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShQYXJzZS5Vc2VyKTtcclxuICAgICAgICAgIGNvbnN0IGdldFVzZXIgPSBhd2FpdCB1c2VyUXVlcnkuZ2V0KGN1cnJlbnRVc2VyPy5vYmplY3RJZCwge1xyXG4gICAgICAgICAgICBzZXNzaW9uVG9rZW46XHJcbiAgICAgICAgICAgICAgY3VycmVudFVzZXI/LnNlc3Npb25Ub2tlbiB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY2Vzc3Rva2VuXCIpXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmIChnZXRVc2VyKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnZXRVc2VyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlzRW1haWxWZXJpZmllZCA9IGN1cnJlbnRVc2VyPy5lbWFpbFZlcmlmaWVkO1xyXG4gICAgICAgIHNldElzRW1haWxWZXJpZmllZChpc0VtYWlsVmVyaWZpZWQpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVyciBpbiBnZXQgZW1haWwgdmVyaWZpY2F0aW9uIFwiLCBlcnIpO1xyXG4gICAgICAgIHNldEhhbmRsZUVycm9yKHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9jaGVjayBpZiBpc0VtYWlsVmVyaWZpZWQgdGhlbiBnbyBvbiBuZXh0IHN0ZXBcclxuICAgIGlmICghaXNFbmFibGVPVFAgfHwgaXNFbWFpbFZlcmlmaWVkKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgY2hlY2tVc2VyID0gc2lnbmVyUG9zLmZpbHRlcihcclxuICAgICAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGNoZWNrVXNlciAmJiBjaGVja1VzZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGNoZWNrYm94RXhpc3QsXHJcbiAgICAgICAgICAgIHJlcXVpcmVkUmFkaW8sXHJcbiAgICAgICAgICAgIHNob3dBbGVydCA9IGZhbHNlLFxyXG4gICAgICAgICAgICB3aWRnZXRLZXksXHJcbiAgICAgICAgICAgIHJhZGlvRXhpc3QsXHJcbiAgICAgICAgICAgIHJlcXVpcmVkQ2hlY2tib3gsXHJcbiAgICAgICAgICAgIFRvdXJQYWdlTnVtYmVyOyAvLyBgcGFnZU51bWJlcmAgaXMgdXNlZCB0byBjaGVjayBvbiB3aGljaCBwYWdlIHVzZXIgZGlkIG5vdCBmaWxsIHdpZGdldCdzIGRhdGEgdGhlbiBjaGFuZ2UgY3VycmVudCBwYWdlTnVtYmVyIGFuZCBzaG93IHRvdXIgbWVzc2FnZSBvbiB0aGF0IHBhZ2VcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrVXNlclswXS5wbGFjZUhvbGRlci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXS5wb3MubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAvL2dldCBjdXJyZW50IHBhZ2VcclxuICAgICAgICAgICAgICBjb25zdCB1cGRhdGVQYWdlID0gY2hlY2tVc2VyWzBdLnBsYWNlSG9sZGVyW2ldPy5wYWdlTnVtYmVyO1xyXG4gICAgICAgICAgICAgIC8vY2hlY2tpbmcgY2hlY2JveCB0eXBlIHdpZGdldFxyXG4gICAgICAgICAgICAgIGNoZWNrYm94RXhpc3QgPVxyXG4gICAgICAgICAgICAgICAgY2hlY2tVc2VyWzBdLnBsYWNlSG9sZGVyW2ldLnBvc1tqXS50eXBlID09PSBcImNoZWNrYm94XCI7XHJcbiAgICAgICAgICAgICAgLy9jaGVja2luZyByYWRpbyBidXR0b24gdHlwZSB3aWRnZXRcclxuICAgICAgICAgICAgICByYWRpb0V4aXN0ID1cclxuICAgICAgICAgICAgICAgIGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXS5wb3Nbal0udHlwZSA9PT0gcmFkaW9CdXR0b25XaWRnZXQ7XHJcbiAgICAgICAgICAgICAgLy9jb25kaXRpb24gdG8gY2hlY2sgY2hlY2tib3ggd2lkZ2V0IGV4aXN0IG9yIG5vdFxyXG4gICAgICAgICAgICAgIGlmIChjaGVja2JveEV4aXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvL2dldCBhbGwgcmVxdWlyZWQgdHlwZSBjaGVja2JveFxyXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRDaGVja2JveCA9IGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXS5wb3MuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAocG9zaXRpb24pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgIXBvc2l0aW9uLm9wdGlvbnM/LmlzUmVhZE9ubHkgJiZcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi50eXBlID09PSBcImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAvL2lmIHJlcXVpcmVkIHR5cGUgY2hlY2tib3ggZGF0YSBleGl0IHRoZW4gY2hlY2sgdXNlciBjaGVja2VkIGFsbCBjaGVja2JveCBvciBzb21lIGNoZWNrYm94IHJlbWFpbiB0byBjaGVja1xyXG4gICAgICAgICAgICAgICAgLy9hbHNvIHZhbGlkYXRlIHRvIG1pbmltdW0gYW5kIG1heGltdW0gcmVxdWlyZWQgY2hlY2tib3hcclxuICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZENoZWNrYm94ICYmIHJlcXVpcmVkQ2hlY2tib3gubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVpcmVkQ2hlY2tib3gubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2dldCBtaW5pbXVtIHJlcXVpcmVkIGNvdW50IGlmICBleGl0XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWluQ291bnQgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRDaGVja2JveFtpXS5vcHRpb25zPy52YWxpZGF0aW9uPy5taW5SZXF1aXJlZENvdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlTWluID0gbWluQ291bnQgJiYgcGFyc2VJbnQobWluQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vZ2V0IG1heGltdW0gcmVxdWlyZWQgY291bnQgaWYgIGV4aXRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhDb3VudCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZENoZWNrYm94W2ldLm9wdGlvbnM/LnZhbGlkYXRpb24/Lm1heFJlcXVpcmVkQ291bnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VNYXggPSBtYXhDb3VudCAmJiBwYXJzZUludChtYXhDb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9pbiBgcmVzcG9uc2VgIHZhcmlhYmxlIGlzIHVzZWQgdG8gZ2V0IGhvdyBtYW55IGNoZWNrYm94IGNoZWNrZWQgYnkgdXNlclxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID1cclxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2hlY2tib3hbaV0ub3B0aW9ucz8ucmVzcG9uc2U/Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAvL2luIGBkZWZhdWx0VmFsdWVgIHZhcmlhYmxlIGlzIHVzZWQgdG8gZ2V0IGhvdyBtYW55IGNoZWNrYm94IGNoZWNrZWQgYnkgZGVmYXVsdFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZENoZWNrYm94W2ldLm9wdGlvbnM/LmRlZmF1bHRWYWx1ZT8ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrICBwYXJzZU1pbiAgYW5kIHBhcnNlTWF4IGdyZWF0ZXIgdGhhbiAwICB0aGVuIGNvbnNpZGVyIGl0IGFzIGEgcmVxdWlyZWQgY2hlY2sgYm94XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFyc2VNaW4gPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICBwYXJzZU1heCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICFyZXNwb25zZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgIWRlZmF1bHRWYWx1ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgIXNob3dBbGVydFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgc2hvd0FsZXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgIHdpZGdldEtleSA9IHJlcXVpcmVkQ2hlY2tib3hbaV0ua2V5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgVG91clBhZ2VOdW1iZXIgPSB1cGRhdGVQYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0bWluUmVxdWlyZWRDb3VudChwYXJzZU1pbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vZWxzZSBjb25kaXRpb24gdG8gdmFsaWRhdGUgbWluaW11bSByZXF1aXJlZCBjaGVja2JveFxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFyc2VNaW4gPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAocGFyc2VNaW4gPiByZXNwb25zZSB8fCAhcmVzcG9uc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dBbGVydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QWxlcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRLZXkgPSByZXF1aXJlZENoZWNrYm94W2ldLmtleTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVG91clBhZ2VOdW1iZXIgPSB1cGRhdGVQYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRtaW5SZXF1aXJlZENvdW50KHBhcnNlTWluKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy9jb25kaXRpb24gdG8gY2hlY2sgcmFkaW8gd2lkZ2V0IGV4aXN0IG9yIG5vdFxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKHJhZGlvRXhpc3QpIHtcclxuICAgICAgICAgICAgICAgIC8vZ2V0IGFsbCByZXF1aXJlZCB0eXBlIHJhZGlvIGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRSYWRpbyA9IGNoZWNrVXNlclswXS5wbGFjZUhvbGRlcltpXS5wb3MuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAocG9zaXRpb24pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgIXBvc2l0aW9uLm9wdGlvbnM/LmlzUmVhZE9ubHkgJiZcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi50eXBlID09PSByYWRpb0J1dHRvbldpZGdldFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIC8vaWYgcmVxdWlyZWQgdHlwZSByYWRpbyBkYXRhIGV4aXQgdGhlbiBjaGVjayB1c2VyIGNoZWNrZWQgYWxsIHJhZGlvIGJ1dHRvbiBvciBzb21lIHJhZGlvIHJlbWFpbiB0byBjaGVja1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkUmFkaW8gJiYgcmVxdWlyZWRSYWRpbz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY2hlY2tTaWduZWQ7XHJcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWlyZWRSYWRpbz8ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja1NpZ25lZCA9IHJlcXVpcmVkUmFkaW9baV0/Lm9wdGlvbnM/LnJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tTaWduZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGVja0RlZmF1bHRTaWduZWQgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFJhZGlvW2ldPy5vcHRpb25zPy5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrRGVmYXVsdFNpZ25lZCAmJiAhc2hvd0FsZXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBbGVydCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldEtleSA9IHJlcXVpcmVkUmFkaW9baV0ua2V5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBUb3VyUGFnZU51bWJlciA9IHVwZGF0ZVBhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldG1pblJlcXVpcmVkQ291bnQobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIC8vZWxzZSBjb25kaXRpb24gdG8gY2hlY2sgYWxsIHR5cGUgd2lkZ2V0IGRhdGEgZmlsbCBvciBub3QgZXhjZXB0IGNoZWNrYm94IGFuZCByYWRpbyBidXR0b25cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vZ2V0IGFsbCByZXF1aXJlZCB0eXBlIHdpZGdldHMgZXhjZXB0IGNoZWNrYm94IGFuZCByYWRpb1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRXaWRnZXRzID0gY2hlY2tVc2VyWzBdLnBsYWNlSG9sZGVyW2ldLnBvcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgIChwb3NpdGlvbikgPT5cclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi5vcHRpb25zPy5zdGF0dXMgPT09IFwicmVxdWlyZWRcIiAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnR5cGUgIT09IHJhZGlvQnV0dG9uV2lkZ2V0ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24udHlwZSAhPT0gXCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkV2lkZ2V0cyAmJiByZXF1aXJlZFdpZGdldHM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrU2lnbmVkO1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVpcmVkV2lkZ2V0cz8ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja1NpZ25lZCA9IHJlcXVpcmVkV2lkZ2V0c1tpXT8ub3B0aW9ucz8ucmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja1NpZ25lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tTaWduVXJsID0gcmVxdWlyZWRXaWRnZXRzW2ldPy5wb3M/LlNpZ25Vcmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrU2lnblVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tEZWZhdWx0U2lnbmVkID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFdpZGdldHNbaV0/Lm9wdGlvbnM/LmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0RlZmF1bHRTaWduZWQgJiYgIXNob3dBbGVydCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBbGVydCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0S2V5ID0gcmVxdWlyZWRXaWRnZXRzW2ldLmtleTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBUb3VyUGFnZU51bWJlciA9IHVwZGF0ZVBhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0bWluUmVxdWlyZWRDb3VudChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL3doZW4gc2hvd0FsZXJ0IGlzIHRydWUgdGhlbiBicmVhayB0aGUgbG9vcCBhbmQgc2hvdyBhbGVydCB0byBmaWxsIHJlcXVpcmVkIGRhdGEgaW4gd2lkZ2V0c1xyXG4gICAgICAgICAgICBpZiAoc2hvd0FsZXJ0KSB7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChjaGVja2JveEV4aXN0ICYmIHJlcXVpcmVkQ2hlY2tib3ggJiYgc2hvd0FsZXJ0KSB7XHJcbiAgICAgICAgICAgIHNldFVuU2lnbmVkV2lkZ2V0SWQod2lkZ2V0S2V5KTtcclxuICAgICAgICAgICAgc2V0UGFnZU51bWJlcihUb3VyUGFnZU51bWJlcik7XHJcbiAgICAgICAgICAgIHNldFdpZGdldHNUb3VyKHRydWUpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChyYWRpb0V4aXN0ICYmIHNob3dBbGVydCkge1xyXG4gICAgICAgICAgICBzZXRVblNpZ25lZFdpZGdldElkKHdpZGdldEtleSk7XHJcbiAgICAgICAgICAgIHNldFBhZ2VOdW1iZXIoVG91clBhZ2VOdW1iZXIpO1xyXG4gICAgICAgICAgICBzZXRXaWRnZXRzVG91cih0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2hvd0FsZXJ0KSB7XHJcbiAgICAgICAgICAgIHNldFVuU2lnbmVkV2lkZ2V0SWQod2lkZ2V0S2V5KTtcclxuICAgICAgICAgICAgc2V0UGFnZU51bWJlcihUb3VyUGFnZU51bWJlcik7XHJcbiAgICAgICAgICAgIHNldFdpZGdldHNUb3VyKHRydWUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2V0SXNVaUxvYWRpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgIC8vIGB3aWRnZXRzYCBpcyBVc2VkIHRvIHJldHVybiB3aWRnZXRzIGRldGFpbHMgd2l0aCBwYWdlIG51bWJlciBvZiBjdXJyZW50IHVzZXJcclxuICAgICAgICAgICAgY29uc3Qgd2lkZ2V0cyA9IGNoZWNrVXNlcj8uWzBdPy5wbGFjZUhvbGRlcjtcclxuXHJcbiAgICAgICAgICAgIC8vIExvYWQgYSBQREZEb2N1bWVudCBmcm9tIHRoZSBleGlzdGluZyBQREYgYnl0ZXNcclxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdQZGZCeXRlcyA9IHBkZkFycmF5QnVmZmVyO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoZXhpc3RpbmdQZGZCeXRlcyk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaXNTaWduWW91clNlbGZGbG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgY29uc3QgZXh0VXNlclB0ciA9IHBkZkRldGFpbHNbMF0uRXh0VXNlclB0cjtcclxuICAgICAgICAgICAgICBjb25zdCBIZWFkZXJEb2NJZCA9IGV4dFVzZXJQdHI/LkhlYWRlckRvY0lkO1xyXG4gICAgICAgICAgICAgIC8vZW1iZWQgZG9jdW1lbnQncyBvYmplY3QgaWQgdG8gYWxsIHBhZ2VzIGluIHBkZiBkb2N1bWVudFxyXG4gICAgICAgICAgICAgIGlmICghSGVhZGVyRG9jSWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICghaXNEb2NJZCkge1xyXG4gICAgICAgICAgICAgICAgICBhd2FpdCBlbWJlZERvY0lkKHBkZkRvYywgZG9jdW1lbnRJZCwgYWxsUGFnZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAvL2VtYmVkIG11bHRpIHNpZ25hdHVyZSBpbiBwZGZcclxuICAgICAgICAgICAgICBjb25zdCBwZGZCeXRlcyA9IGF3YWl0IG11bHRpU2lnbkVtYmVkKFxyXG4gICAgICAgICAgICAgICAgd2lkZ2V0cyxcclxuICAgICAgICAgICAgICAgIHBkZkRvYyxcclxuICAgICAgICAgICAgICAgIGlzU2lnbllvdXJTZWxmRmxvdyxcclxuICAgICAgICAgICAgICAgIHNjYWxlLFxyXG4gICAgICAgICAgICAgICAgcGRmT3JpZ2luYWxXSCxcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBkZnRlXCIsIHBkZkJ5dGVzKTtcclxuICAgICAgICAgICAgICAvL2dldCBFeGlzdFVzZXJQdHIgb2JqZWN0IGlkIG9mIHVzZXIgY2xhc3MgdG8gZ2V0IHRlbmFudERldGFpbHNcclxuICAgICAgICAgICAgICBjb25zdCBvYmplY3RJZCA9IHBkZkRldGFpbHM/LlswXT8uRXh0VXNlclB0cj8uVXNlcklkPy5vYmplY3RJZDtcclxuICAgICAgICAgICAgICBsZXQgYWN0aXZlTWFpbEFkYXB0ZXIgPVxyXG4gICAgICAgICAgICAgICAgcGRmRGV0YWlscz8uWzBdPy5FeHRVc2VyUHRyPy5hY3RpdmVfbWFpbF9hZGFwdGVyO1xyXG5cclxuICAgICAgICAgICAgICAvL2Z1bmN0aW9uIGZvciBjYWxsIHRvIGVtYmVkIHNpZ25hdHVyZSBpbiBwZGYgYW5kIGdldCBkaWdpdGFsIHNpZ25hdHVyZSBwZGZcclxuICAgICAgICAgICAgICBjb25zdCByZXNTaWduID0gYXdhaXQgc2lnblBkZkZ1bihcclxuICAgICAgICAgICAgICAgIHBkZkJ5dGVzLFxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRJZCxcclxuICAgICAgICAgICAgICAgIHNpZ25lck9iamVjdElkLFxyXG4gICAgICAgICAgICAgICAgb2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBpc1N1YnNjcmliZWQsXHJcbiAgICAgICAgICAgICAgICBhY3RpdmVNYWlsQWRhcHRlcixcclxuICAgICAgICAgICAgICAgIHdpZGdldHNcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIGlmIChyZXNTaWduICYmIHJlc1NpZ24uc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgICAgICAgc2V0UGRmVXJsKHJlc1NpZ24uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBzZXRJc1NpZ25lZCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHNldFNpZ25lZFNpZ25lcnMoW10pO1xyXG4gICAgICAgICAgICAgICAgc2V0VW5TaWduZWRTaWduZXJzKFtdKTtcclxuICAgICAgICAgICAgICAgIGdldERvY3VtZW50RGV0YWlscyhkb2N1bWVudElkLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGRmRGV0YWlscz8uWzBdPy5TaWduZXJzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgICAgICAgKHgpID0+IHgub2JqZWN0SWQgPT09IHNpZ25lck9iamVjdElkXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBpbmRleCArIDE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VybWFpbCA9IHtcclxuICAgICAgICAgICAgICAgICAgRW1haWw6IHBkZkRldGFpbHM/LlswXT8uUGxhY2Vob2xkZXJzW25ld0luZGV4XT8uZW1haWwgfHwgXCJcIlxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSB1c2VybWFpbD8uRW1haWxcclxuICAgICAgICAgICAgICAgICAgPyB1c2VybWFpbFxyXG4gICAgICAgICAgICAgICAgICA6IHBkZkRldGFpbHM/LlswXT8uU2lnbmVyc1tuZXdJbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VuZG1haWwgIT09IFwiZmFsc2VcIiAmJiBzZW5kSW5PcmRlcikge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHBkZkRldGFpbHM/LlswXT8uUmVxdWVzdEJvZHk7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RTdWJqZWN0ID0gcGRmRGV0YWlscz8uWzBdPy5SZXF1ZXN0U3ViamVjdDtcclxuICAgICAgICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBpcmVEYXRlID0gcGRmRGV0YWlscz8uWzBdLkV4cGlyeURhdGUuaXNvO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShleHBpcmVEYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbEV4cGlyZURhdGUgPSBuZXdEYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhcclxuICAgICAgICAgICAgICAgICAgICAgIFwiZW4tVVNcIixcclxuICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF5OiBcIm51bWVyaWNcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGg6IFwibG9uZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbmRlckVtYWlsID0gcGRmRGV0YWlscz8uWzBdLkV4dFVzZXJQdHIuRW1haWw7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbmRlclBob25lID0gcGRmRGV0YWlscz8uWzBdPy5FeHRVc2VyUHRyPy5QaG9uZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZW5kZXJOYW1lID0gYCR7cGRmRGV0YWlscz8uWzBdLkV4dFVzZXJQdHIuTmFtZX1gO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nUG5nID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJodHRwczovL3Fpa2lubm92YXRpb24uYW1zMy5kaWdpdGFsb2NlYW5zcGFjZXMuY29tL2xvZ28ucG5nXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYCR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFzZVVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICApfWZ1bmN0aW9ucy9zZW5kbWFpbHYzYDtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Ub2tlbjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gdXNlcj8ub2JqZWN0SWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0VXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vZW5jb2RlIHRoaXMgdXJsIHZhbHVlIGAke3BkZkRldGFpbHM/LlswXS5vYmplY3RJZH0vJHt1c2VyLkVtYWlsfS8ke29iamVjdElkfWAgdG8gYmFzZTY0IHVzaW5nIGBidG9hYCBmdW5jdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGVuY29kZUJhc2U2NDtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVCYXNlNjQgPSBidG9hKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BkZkRldGFpbHM/LlswXS5vYmplY3RJZH0vJHt1c2VyLkVtYWlsfS8ke29iamVjdElkfWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUJhc2U2NCA9IGJ0b2EoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGRmRGV0YWlscz8uWzBdLm9iamVjdElkfS8ke3VzZXIuRW1haWx9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9zdFB1YmxpY1VybCA9IGlzU3RhZ2luZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiaHR0cHM6Ly9zdGFnaW5nLWFwcC5vcGVuc2lnbmxhYnMuY29tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImh0dHBzOi8vYXBwLm9wZW5zaWdubGFicy5jb21cIjtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBzaWduUGRmID0gcHJvcHM/LnRlbXBsYXRlSWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHtob3N0UHVibGljVXJsfS9sb2dpbi8ke2VuY29kZUJhc2U2NH1gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYCR7aG9zdFVybH0vbG9naW4vJHtlbmNvZGVCYXNlNjR9YDtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5TaWduVXJsID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJodHRwczovL3d3dy5vcGVuc2lnbmxhYnMuY29tL2NvbnRhY3QtdXNcIjtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yZ05hbWUgPSBwZGZEZXRhaWxzWzBdPy5FeHRVc2VyUHRyLkNvbXBhbnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwZGZEZXRhaWxzWzBdLkV4dFVzZXJQdHIuQ29tcGFueVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGVtZUJHY29sb3IgPSB0aGVtZUNvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VWYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdEJvZHkgJiYgcmVxdWVzdFN1YmplY3QgJiYgaXNTdWJzY3JpYmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VkUmVxdWVzdEJvZHkgPSByZXF1ZXN0Qm9keS5yZXBsYWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC9cIi9nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGh0bWxSZXFCb2R5ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9J0NvbnRlbnQtVHlwZScgY29udGVudD0ndGV4dC9odG1sOyBjaGFyc2V0PVVURi04JyAvPjwvaGVhZD48Ym9keT5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWRSZXF1ZXN0Qm9keSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L2JvZHk+IDwvaHRtbD5cIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudF90aXRsZTogcGRmRGV0YWlscz8uWzBdLk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyX25hbWU6IHNlbmRlck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyX21haWw6IHNlbmRlckVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlcl9waG9uZTogc2VuZGVyUGhvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJfbmFtZTogdXNlci5OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyX2VtYWlsOiB1c2VyLkVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyX3Bob25lOiB1c2VyLlBob25lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyeV9kYXRlOiBsb2NhbEV4cGlyZURhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueV9uYW1lOiBvcmdOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25pbmdfdXJsOiBgPGEgaHJlZj0ke3NpZ25QZGZ9PlNpZ24gaGVyZTwvYT5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VWYXIgPSByZXBsYWNlTWFpbFZhcmlibGVzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdWJqZWN0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxSZXFCb2R5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1haWxQcm92aWRlcjogYWN0aXZlTWFpbEFkYXB0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dFVzZXJJZDogZXh0VXNlcklkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNpcGllbnQ6IHVzZXIuRW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3Q6IHJlcXVlc3RTdWJqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZXBsYWNlVmFyPy5zdWJqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBgJHtwZGZEZXRhaWxzPy5bMF0uRXh0VXNlclB0ci5OYW1lfSBoYXMgcmVxdWVzdGVkIHlvdSB0byBzaWduIFwiJHtwZGZEZXRhaWxzPy5bMF0uTmFtZX1cImAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb206IHNlbmRlckVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFuOiBwbGFuY29kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbDogcmVxdWVzdEJvZHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlcGxhY2VWYXI/LmJvZHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiPGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0nQ29udGVudC1UeXBlJyBjb250ZW50PSd0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnIC8+IDwvaGVhZD4gICA8Ym9keT4gPGRpdiBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsgcGFkZGluZzogMjBweCc9PiA8ZGl2ICAgc3R5bGU9JyBib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMSkgMHB4IDRweCAxMnB4O2JhY2tncm91bmQ6IHdoaXRlO3BhZGRpbmctYm90dG9tOiAyMHB4Oyc+IDxkaXYgc3R5bGU9J3BhZGRpbmc6MTBweCAxMHB4IDAgMTBweCc+PGltZyBzcmM9XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nUG5nICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIGhlaWdodD0nNTAnIHN0eWxlPSdwYWRkaW5nOiAyMHB4LHdpZHRoOjE3MHB4LGhlaWdodDo0MHB4JyAvPjwvZGl2PiAgPGRpdiAgc3R5bGU9JyBwYWRkaW5nOiAycHg7Zm9udC1mYW1pbHk6IHN5c3RlbS11aTtiYWNrZ3JvdW5kLWNvbG9yOlwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lQkdjb2xvciArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjsnPjxwIHN0eWxlPSdmb250LXNpemU6IDIwcHg7Zm9udC13ZWlnaHQ6IDQwMDtjb2xvcjogd2hpdGU7cGFkZGluZy1sZWZ0OiAyMHB4OycgPiBEaWdpdGFsIFNpZ25hdHVyZSBSZXF1ZXN0PC9wPjwvZGl2PjxkaXY+PHAgc3R5bGU9J3BhZGRpbmc6IDIwcHg7Zm9udC1mYW1pbHk6IHN5c3RlbS11aTtmb250LXNpemU6IDE0cHg7ICAgbWFyZ2luLWJvdHRvbTogMTBweDsnPiBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzPy5bMF0uRXh0VXNlclB0ci5OYW1lICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIGhhcyByZXF1ZXN0ZWQgeW91IHRvIHJldmlldyBhbmQgc2lnbiA8c3Ryb25nPiBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzPy5bMF0uTmFtZSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvc3Ryb25nPi48L3A+PGRpdiBzdHlsZT0ncGFkZGluZzogNXB4IDBweCA1cHggMjVweDtkaXNwbGF5OiBmbGV4O2ZsZXgtZGlyZWN0aW9uOiByb3c7anVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7Jz48dGFibGU+IDx0cj4gPHRkIHN0eWxlPSdmb250LXdlaWdodDpib2xkO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHgnPlNlbmRlcjwvdGQ+IDx0ZD4gPC90ZD4gPHRkICBzdHlsZT0nY29sb3I6IzYyNjM2Mztmb250LXdlaWdodDpib2xkJz5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXJFbWFpbCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvdGQ+PC90cj48dHI+PHRkIHN0eWxlPSdmb250LXdlaWdodDpib2xkO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHgnPk9yZ2FuaXphdGlvbjwvdGQ+IDx0ZD4gPC90ZD48dGQgc3R5bGU9J2NvbG9yOiM2MjYzNjM7Zm9udC13ZWlnaHQ6Ym9sZCc+IFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZ05hbWUgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L3RkPjwvdHI+IDx0cj4gPHRkIHN0eWxlPSdmb250LXdlaWdodDpib2xkO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHgnPkV4cGlyZXMgb248L3RkPjx0ZD4gPC90ZD4gPHRkIHN0eWxlPSdjb2xvcjojNjI2MzYzO2ZvbnQtd2VpZ2h0OmJvbGQnPlwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRXhwaXJlRGF0ZSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvdGQ+PC90cj48dHI+IDx0ZD48L3RkPiA8dGQ+IDwvdGQ+PC90cj48L3RhYmxlPiA8L2Rpdj4gPGRpdiBzdHlsZT0nbWFyZ2luLWxlZnQ6NzBweCc+PGEgaHJlZj1cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduUGRmICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiPiA8YnV0dG9uIHN0eWxlPSdwYWRkaW5nOiAxMnB4IDEycHggMTJweCAxMnB4O2JhY2tncm91bmQtY29sb3I6ICNkNDZiMGY7Y29sb3I6IHdoaXRlOyAgYm9yZGVyOiAwcHg7Ym94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjA1KSAwcHggNnB4IDI0cHggMHB4LHJnYmEoMCwgMCwgMCwgMC4wOCkgMHB4IDBweCAwcHggMXB4O2ZvbnQtd2VpZ2h0OmJvbGQ7bWFyZ2luLXRvcDozMHB4Jz5TaWduIGhlcmU8L2J1dHRvbj48L2E+IDwvZGl2PiA8ZGl2IHN0eWxlPSdkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjttYXJnaW4tdG9wOiAxMHB4Oyc+IDwvZGl2PjwvZGl2PjwvZGl2PjxkaXY+PHA+IFRoaXMgaXMgYW4gYXV0b21hdGVkIGVtYWlsIGZyb20gT3BlblNpZ27ihKIuIEZvciBhbnkgcXVlcmllcyByZWdhcmRpbmcgdGhpcyBlbWFpbCwgcGxlYXNlIGNvbnRhY3QgdGhlIHNlbmRlciBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXJFbWFpbCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBkaXJlY3RseS5JZiB5b3UgdGhpbmsgdGhpcyBlbWFpbCBpcyBpbmFwcHJvcHJpYXRlIG9yIHNwYW0sIHlvdSBtYXkgZmlsZSBhIGNvbXBsYWludCB3aXRoIE9wZW5TaWdu4oSiICAgPGEgaHJlZj0gXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlblNpZ25VcmwgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgdGFyZ2V0PV9ibGFuaz5oZXJlPC9hPi48L3A+IDwvZGl2PjwvZGl2PjwvYm9keT4gPC9odG1sPlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXhpb3MucG9zdCh1cmwsIHBhcmFtcywgeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yXCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2V0SXNVaUxvYWRpbmcoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7IGlzU2hvdzogdHJ1ZSwgYWxlcnRNZXNzYWdlOiByZXNTaWduLm1lc3NhZ2UgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICBzZXRJc1VpTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgaWYgKGVyciAmJiBlcnIubWVzc2FnZS5pbmNsdWRlcyhcImlzIGVuY3J5cHRlZC5cIikpIHtcclxuICAgICAgICAgICAgICAgIHNldElzQWxlcnQoe1xyXG4gICAgICAgICAgICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIGFsZXJ0TWVzc2FnZTogdChcImVuY3J5cHRlZC1wZGYtbm90LXN1cHBvcnRcIilcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVyciBpbiByZXF1ZXN0IHNpZ25pbmdcIiwgZXJyKTtcclxuICAgICAgICAgICAgICAgIHNldElzQWxlcnQoe1xyXG4gICAgICAgICAgICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIGFsZXJ0TWVzc2FnZTogdChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIilcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2V0SXNTaWduUGFkKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2V0SXNBbGVydCh7XHJcbiAgICAgICAgICAgIGlzU2hvdzogdHJ1ZSxcclxuICAgICAgICAgICAgYWxlcnRNZXNzYWdlOiB0KFwic29tZXRoaW5nLXdlbnQtd3JvbmctbXNzZ1wiKVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVyciBpbiBlbWJlZHNpZ25cIiwgZXJyKTtcclxuICAgICAgICBzZXRJc1VpTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgc2V0SXNBbGVydCh7XHJcbiAgICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgICBhbGVydE1lc3NhZ2U6IHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vZnVuY3Rpb24gZm9yIHVwZGF0ZSBUb3VyU3RhdHVzXHJcbiAgY29uc3QgY2xvc2VUb3VyID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgc2V0V2lkZ2V0c1RvdXIoZmFsc2UpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IHRvdXJDb25maWcgPSBbXHJcbiAgICB7XHJcbiAgICAgIHNlbGVjdG9yOiAnW2RhdGEtdHV0PVwiSXNTaWduZWRcIl0nLFxyXG4gICAgICBjb250ZW50OiBtaW5SZXF1aXJlZENvdW50XHJcbiAgICAgICAgPyB0KFwic2lnbmF0dXJlLXZhbGlkYXRlLWFsZXJ0XCIsIHsgbWluUmVxdWlyZWRDb3VudCB9KVxyXG4gICAgICAgIDogdChcInNpZ25hdHVyZS12YWxpZGF0ZS1hbGVydC0yXCIpLFxyXG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIixcclxuICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cclxuICAgIH1cclxuICBdO1xyXG4gIC8vZnVuY3Rpb24gZm9yIGdldCBwZGYgcGFnZSBkZXRhaWxzXHJcbiAgY29uc3QgcGFnZURldGFpbHMgPSBhc3luYyAocGRmKSA9PiB7XHJcbiAgICBsZXQgcGRmV0hPYmogPSBbXTtcclxuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBwZGYubnVtUGFnZXM7IC8vIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG90YWxQYWdlczsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBnZXRQYWdlID0gYXdhaXQgcGRmLmdldFBhZ2UoaW5kZXggKyAxKTtcclxuICAgICAgY29uc3Qgc2NhbGUgPSAxO1xyXG4gICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldFBhZ2UuZ2V0Vmlld3BvcnQoeyBzY2FsZSB9KTtcclxuICAgICAgcGRmV0hPYmoucHVzaCh7IHBhZ2VOdW1iZXI6IGluZGV4ICsgMSwgd2lkdGgsIGhlaWdodCB9KTtcclxuICAgIH1cclxuICAgIHNldFBkZk9yaWdpbmFsV0gocGRmV0hPYmopO1xyXG4gICAgc2V0UGRmTG9hZCh0cnVlKTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIGNoYW5nZSBwYWdlXHJcbiAgZnVuY3Rpb24gY2hhbmdlUGFnZShvZmZzZXQpIHtcclxuICAgIHNldFBhZ2VOdW1iZXIoKHByZXZQYWdlTnVtYmVyKSA9PiBwcmV2UGFnZU51bWJlciArIG9mZnNldCk7XHJcbiAgfVxyXG5cclxuICAvL2Z1bmN0aW9uIGZvciBpbWFnZSB1cGxvYWQgb3IgdXBkYXRlXHJcbiAgY29uc3Qgb25JbWFnZUNoYW5nZSA9IChldmVudCkgPT4ge1xyXG4gICAgaWYgKGV2ZW50LnRhcmdldC5maWxlcyAmJiBldmVudC50YXJnZXQuZmlsZXNbMF0pIHtcclxuICAgICAgb25JbWFnZVNlbGVjdChldmVudCwgc2V0SW1nV0gsIHNldEltYWdlKTtcclxuICAgIH1cclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gZm9yIHVwbG9hZCBzdGFtcCBpbWFnZVxyXG4gIGNvbnN0IHNhdmVJbWFnZSA9ICgpID0+IHtcclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXHJcbiAgICBjb25zdCBjdXJyZW50U2lnbmVyID0gc2lnbmVyUG9zLmZpbHRlcihcclxuICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkXHJcbiAgICApO1xyXG4gICAgLy9nZXQgY3VycmVudCBwYWdlbnVtYmVyIHBsYWNlaG9sZGVyIGluZGV4XHJcbiAgICBjb25zdCBnZXRJbmRleCA9IGN1cnJlbnRTaWduZXJbMF0ucGxhY2VIb2xkZXIuZmluZEluZGV4KChvYmplY3QpID0+IHtcclxuICAgICAgcmV0dXJuIG9iamVjdC5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyO1xyXG4gICAgfSk7XHJcbiAgICAvL2dldCBjdXJyZW50IHNpZ25lciBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXHJcbiAgICBjb25zdCBwbGFjZWhvbGRlclBvc2l0aW9uID0gY3VycmVudFNpZ25lclswXS5wbGFjZUhvbGRlcjtcclxuICAgIC8vZnVuY3Rpb24gb2Ygc2F2ZSBpbWFnZSBhbmQgZ2V0IHVwZGF0ZWQgcG9zaXRpb24gd2l0aCBpbWFnZSB1cmxcclxuICAgIGNvbnN0IGdldFVwZGF0ZVBvc2l0aW9uID0gb25TYXZlSW1hZ2UoXHJcbiAgICAgIHBsYWNlaG9sZGVyUG9zaXRpb24sXHJcbiAgICAgIGdldEluZGV4LFxyXG4gICAgICBzaWduS2V5LFxyXG4gICAgICBpbWdXSCxcclxuICAgICAgaW1hZ2VcclxuICAgICk7XHJcblxyXG4gICAgLy9yZXBsYWNlIHVwZGF0ZWQgcGxhY2Vob2xkZXIgcG9zaXRpb24gd2l0aCBvbGQgZGF0YVxyXG4gICAgcGxhY2Vob2xkZXJQb3NpdGlvbi5zcGxpY2UoXHJcbiAgICAgIDAsXHJcbiAgICAgIHBsYWNlaG9sZGVyUG9zaXRpb24ubGVuZ3RoLFxyXG4gICAgICAuLi5nZXRVcGRhdGVQb3NpdGlvblxyXG4gICAgKTtcclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhIGluZGV4IG51bWJlciBpbiBhcnJheVxyXG4gICAgY29uc3QgaW5kZXhvZlNpZ25lciA9IHNpZ25lclBvcy5maW5kSW5kZXgoKG9iamVjdCkgPT4ge1xyXG4gICAgICByZXR1cm4gb2JqZWN0LnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZDtcclxuICAgIH0pO1xyXG4gICAgLy91cGRhdGUgY3VycmVudCBzaWduZXJzIGRhdGEgd2l0aCBuZXcgcGxhY2Vob2xkZXIgcG9zaXRpb24gYXJyYXkgZGF0YVxyXG4gICAgc2V0U2lnbmVyUG9zKChwcmV2U3RhdGUpID0+IHtcclxuICAgICAgY29uc3QgbmV3U3RhdGUgPSBbLi4ucHJldlN0YXRlXTsgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgc3RhdGVcclxuICAgICAgbmV3U3RhdGUuc3BsaWNlKGluZGV4b2ZTaWduZXIsIDEsIC4uLmN1cnJlbnRTaWduZXIpOyAvLyBNb2RpZnkgdGhlIGNvcHlcclxuICAgICAgcmV0dXJuIG5ld1N0YXRlOyAvLyBVcGRhdGUgdGhlIHN0YXRlIHdpdGggdGhlIG1vZGlmaWVkIGNvcHlcclxuICAgIH0pO1xyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiBmb3Igc2F2ZSBidXR0b24gdG8gc2F2ZSBzaWduYXR1cmUgb3IgaW1hZ2UgdXJsXHJcbiAgY29uc3Qgc2F2ZVNpZ24gPSAodHlwZSwgaXNEZWZhdWx0U2lnbiwgd2lkdGgsIGhlaWdodCkgPT4ge1xyXG4gICAgY29uc3QgaXNUeXBlVGV4dCA9IHdpZHRoICYmIGhlaWdodCA/IHRydWUgOiBmYWxzZTtcclxuICAgIGNvbnN0IHNpZ25hdHVyZUltZyA9IGlzRGVmYXVsdFNpZ25cclxuICAgICAgPyBpc0RlZmF1bHRTaWduID09PSBcImluaXRpYWxzXCJcclxuICAgICAgICA/IG15SW5pdGlhbFxyXG4gICAgICAgIDogZGVmYXVsdFNpZ25JbWdcclxuICAgICAgOiBzaWduYXR1cmU7XHJcbiAgICBsZXQgaW1nV0ggPSB7IHdpZHRoOiB3aWR0aCA/IHdpZHRoIDogXCJcIiwgaGVpZ2h0OiBoZWlnaHQgPyBoZWlnaHQgOiBcIlwiIH07XHJcbiAgICBzZXRJc1NpZ25QYWQoZmFsc2UpO1xyXG4gICAgc2V0SXNJbWFnZVNlbGVjdChmYWxzZSk7XHJcbiAgICBzZXRJbWFnZSgpO1xyXG5cclxuICAgIC8vZ2V0IGN1cnJlbnQgc2lnbmVycyBwbGFjZWhvbGRlciBwb3NpdGlvbiBkYXRhXHJcbiAgICBjb25zdCBjdXJyZW50U2lnbmVyID0gc2lnbmVyUG9zLmZpbHRlcihcclxuICAgICAgKGRhdGEpID0+IGRhdGEuc2lnbmVyT2JqSWQgPT09IHNpZ25lck9iamVjdElkXHJcbiAgICApO1xyXG4gICAgLy9nZXQgY3VycmVudCBwYWdlbnVtYmVyIHBsYWNlaG9sZGVyIGluZGV4XHJcbiAgICBjb25zdCBnZXRJbmRleCA9IGN1cnJlbnRTaWduZXJbMF0ucGxhY2VIb2xkZXIuZmluZEluZGV4KChvYmplY3QpID0+IHtcclxuICAgICAgcmV0dXJuIG9iamVjdC5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9zZXQgZGVmYXVsdCBzaWduYXR1cmUgaW1hZ2Ugd2lkdGggYW5kIGhlaWdodFxyXG4gICAgaWYgKGlzRGVmYXVsdFNpZ24pIHtcclxuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGltZy5zcmMgPSBkZWZhdWx0U2lnbkltZztcclxuICAgICAgaWYgKGltZy5jb21wbGV0ZSkge1xyXG4gICAgICAgIGltZ1dIID0geyB3aWR0aDogaW1nLndpZHRoLCBoZWlnaHQ6IGltZy5oZWlnaHQgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9nZXQgY3VycmVudCBzaWduZXIgcGxhY2Vob2xkZXIgcG9zaXRpb24gZGF0YVxyXG4gICAgY29uc3QgcGxhY2Vob2xkZXJQb3NpdGlvbiA9IGN1cnJlbnRTaWduZXJbMF0ucGxhY2VIb2xkZXI7XHJcbiAgICAvL2Z1bmN0aW9uIG9mIHNhdmUgc2lnbmF0dXJlIGltYWdlIGFuZCBnZXQgdXBkYXRlZCBwb3NpdGlvbiB3aXRoIHNpZ25hdHVyZSBpbWFnZSB1cmxcclxuICAgIGNvbnN0IGdldFVwZGF0ZVBvc2l0aW9uID0gb25TYXZlU2lnbihcclxuICAgICAgdHlwZSxcclxuICAgICAgcGxhY2Vob2xkZXJQb3NpdGlvbixcclxuICAgICAgZ2V0SW5kZXgsXHJcbiAgICAgIHNpZ25LZXksXHJcbiAgICAgIHNpZ25hdHVyZUltZyxcclxuICAgICAgaW1nV0gsXHJcbiAgICAgIGlzRGVmYXVsdFNpZ24sXHJcbiAgICAgIGlzVHlwZVRleHRcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgdXBkYXRlU2lnbmVyRGF0YSA9IGN1cnJlbnRTaWduZXIubWFwKChvYmopID0+IHtcclxuICAgICAgaWYgKG9iai5zaWduZXJPYmpJZCA9PT0gc2lnbmVyT2JqZWN0SWQpIHtcclxuICAgICAgICByZXR1cm4geyAuLi5vYmosIHBsYWNlSG9sZGVyOiBnZXRVcGRhdGVQb3NpdGlvbiB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBpbmRleCA9IHNpZ25lclBvcy5maW5kSW5kZXgoXHJcbiAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZFxyXG4gICAgKTtcclxuICAgIHNldFNpZ25lclBvcygocHJldlN0YXRlKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld1N0YXRlID0gWy4uLnByZXZTdGF0ZV07XHJcbiAgICAgIG5ld1N0YXRlLnNwbGljZShpbmRleCwgMSwgLi4udXBkYXRlU2lnbmVyRGF0YSk7XHJcbiAgICAgIHJldHVybiBuZXdTdGF0ZTtcclxuICAgIH0pO1xyXG4gIH07XHJcbiAgLy9mdW5jdGlvbiBmb3Igc2V0IGRlY2xpbmUgdHJ1ZSBvbiBwcmVzcyBkZWNsaW5lIGJ1dHRvblxyXG4gIGNvbnN0IGRlY2xpbmVEb2MgPSBhc3luYyAocmVhc29uKSA9PiB7XHJcbiAgICBjb25zdCBzZW5kZXJVc2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgIGBQYXJzZS8ke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKX0vY3VycmVudFVzZXJgXHJcbiAgICApO1xyXG4gICAgY29uc3QganNvblNlbmRlciA9IEpTT04ucGFyc2Uoc2VuZGVyVXNlcik7XHJcbiAgICBzZXRJc0RlY2xpbmUoeyBpc0RlY2xpbmVkOiBmYWxzZSB9KTtcclxuICAgIHNldElzVWlMb2FkaW5nKHRydWUpO1xyXG4gICAgY29uc3QgZW1haWwgPVxyXG4gICAgICBwZGZEZXRhaWxzPy5bMF0uU2lnbmVycz8uZmluZCgoeCkgPT4geC5vYmplY3RJZCA9PT0gc2lnbmVyT2JqZWN0SWQpXHJcbiAgICAgICAgPy5FbWFpbCB8fCBqc29uU2VuZGVyPy5lbWFpbDtcclxuICAgIGNvbnN0IHVzZXJJZCA9XHJcbiAgICAgIHBkZkRldGFpbHM/LlswXS5TaWduZXJzPy5maW5kKCh4KSA9PiB4Lm9iamVjdElkID09PSBzaWduZXJPYmplY3RJZClcclxuICAgICAgICA/LlVzZXJJZD8ub2JqZWN0SWQgfHwganNvblNlbmRlcj8ub2JqZWN0SWQ7XHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgIGRvY0lkOiBwZGZEZXRhaWxzPy5bMF0ub2JqZWN0SWQsXHJcbiAgICAgIHJlYXNvbjogcmVhc29uLFxyXG4gICAgICB1c2VySWQ6IHVzZXJJZFxyXG4gICAgfTtcclxuICAgIGF3YWl0IGF4aW9zXHJcbiAgICAgIC5wb3N0KGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvZGVjbGluZWRvY2AsIHBhcmFtcywge1xyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKSxcclxuICAgICAgICAgIFwiWC1QYXJzZS1TZXNzaW9uLVRva2VuXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC50aGVuKGFzeW5jIChyZXN1bHQpID0+IHtcclxuICAgICAgICBjb25zdCByZXMgPSByZXN1bHQuZGF0YTtcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50RGVjbGluZSA9IHsgY3Vycm50OiBcIllvdURlY2xpbmVkXCIsIGlzRGVjbGluZWQ6IHRydWUgfTtcclxuICAgICAgICAgIHNldElzRGVjbGluZShjdXJyZW50RGVjbGluZSk7XHJcbiAgICAgICAgICBzZXRJc1VpTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIGV2ZW50OiBcImRlY2xpbmVkXCIsXHJcbiAgICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgICBvYmplY3RJZDogcGRmRGV0YWlscz8uWzBdLm9iamVjdElkLFxyXG4gICAgICAgICAgICAgIGZpbGU6IHBkZkRldGFpbHM/LlswXT8uU2lnbmVkVXJsIHx8IHBkZkRldGFpbHM/LlswXT8uVVJMLFxyXG4gICAgICAgICAgICAgIG5hbWU6IHBkZkRldGFpbHM/LlswXS5OYW1lLFxyXG4gICAgICAgICAgICAgIG5vdGU6IHBkZkRldGFpbHM/LlswXS5Ob3RlIHx8IFwiXCIsXHJcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHBkZkRldGFpbHM/LlswXS5EZXNjcmlwdGlvbiB8fCBcIlwiLFxyXG4gICAgICAgICAgICAgIHNpZ25lcnM6IHBkZkRldGFpbHM/LlswXS5TaWduZXJzPy5tYXAoKHgpID0+ICh7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiB4Py5OYW1lLFxyXG4gICAgICAgICAgICAgICAgZW1haWw6IHg/LkVtYWlsLFxyXG4gICAgICAgICAgICAgICAgcGhvbmU6IHg/LlBob25lXHJcbiAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICAgIGRlY2xpbmVkQnk6IGVtYWlsLFxyXG4gICAgICAgICAgICAgIGRlY2xpbmVkUmVhc29uOiByZWFzb24sXHJcbiAgICAgICAgICAgICAgZGVjbGluZWRBdDogbmV3IERhdGUoKSxcclxuICAgICAgICAgICAgICBjcmVhdGVkQXQ6IHBkZkRldGFpbHM/LlswXS5jcmVhdGVkQXRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBheGlvcy5wb3N0KFxyXG4gICAgICAgICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKX1mdW5jdGlvbnMvY2FsbHdlYmhvb2tgLFxyXG4gICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgICAgICAgICBzZXNzaW9udG9rZW46IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzdG9rZW5cIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnIgXCIsIGVycik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgdXBkYXRpbmcgZmllbGQgaXMgZGVjbGluZSBcIiwgZXJyKTtcclxuICAgICAgICBzZXRJc1VpTG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgYWxlcnQodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgICB9KTtcclxuICB9O1xyXG4gIC8vZnVuY3Rpb24gdG8gYWRkIGRlZmF1bHQgc2lnbmF0dXJlIGZvciBhbGwgcmVxdWVzdGVkIHBsYWNlaG9sZGVyIG9mIHNpZ25cclxuICBjb25zdCBhZGREZWZhdWx0U2lnbmF0dXJlID0gKCkgPT4ge1xyXG4gICAgLy9nZXQgY3VycmVudCBzaWduZXJzIHBsYWNlaG9sZGVyIHBvc2l0aW9uIGRhdGFcclxuICAgIGNvbnN0IGN1cnJlbnRTaWduZXJQb3NpdGlvbiA9IHNpZ25lclBvcy5maWx0ZXIoXHJcbiAgICAgIChkYXRhKSA9PiBkYXRhLnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZFxyXG4gICAgKTtcclxuICAgIC8vZnVuY3Rpb24gZm9yIHNhdmUgZGVmYXVsdCBzaWduYXR1cmUgdXJsIGZvciBhbGwgcGxhY2Vob2xkZXIgcG9zaXRpb25cclxuICAgIGNvbnN0IHVwZGF0ZVBsYWNlID0gYWRkRGVmYXVsdFNpZ25hdHVyZUltZyhcclxuICAgICAgY3VycmVudFNpZ25lclBvc2l0aW9uWzBdLnBsYWNlSG9sZGVyLFxyXG4gICAgICBkZWZhdWx0U2lnbkltZ1xyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVzaWduZXJQb3MgPSBzaWduZXJQb3MubWFwKCh4KSA9PlxyXG4gICAgICB4LnNpZ25lck9iaklkID09PSBzaWduZXJPYmplY3RJZCA/IHsgLi4ueCwgcGxhY2VIb2xkZXI6IHVwZGF0ZVBsYWNlIH0gOiB4XHJcbiAgICApO1xyXG4gICAgc2V0U2lnbmVyUG9zKHVwZGF0ZXNpZ25lclBvcyk7XHJcbiAgICBzZXREZWZhdWx0U2lnbkFsZXJ0KHsgaXNTaG93OiBmYWxzZSwgYWxlcnRNZXNzYWdlOiBcIlwiIH0pO1xyXG4gIH07XHJcbiAgY29uc3QgaGFuZGxlRG9udFNob3cgPSAoaXNDaGVja2VkKSA9PiB7XHJcbiAgICBzZXRJc0RvbnRTaG93KGlzQ2hlY2tlZCk7XHJcbiAgfTtcclxuICAvL2Z1bmN0aW9uIHRvIGNsb3NlIHRvdXIgYW5kIHNhdmUgdG91ciBzdGF0dXNcclxuICBjb25zdCBjbG9zZVJlcXVlc3RTaWduVG91ciA9IGFzeW5jICgpID0+IHtcclxuICAgIHNldFJlcXVlc3RTaWduVG91cih0cnVlKTtcclxuICAgIGlmIChpc0RvbnRTaG93KSB7XHJcbiAgICAgIGNvbnN0IGlzRW5hYmxlT1RQID0gcGRmRGV0YWlscz8uWzBdPy5Jc0VuYWJsZU9UUCB8fCBmYWxzZTtcclxuICAgICAgaWYgKCFpc0VuYWJsZU9UUCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCBheGlvcy5wb3N0KFxyXG4gICAgICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9ZnVuY3Rpb25zL3VwZGF0ZWNvbnRhY3R0b3VyYCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbnRhY3RJZDogc2lnbmVyT2JqZWN0SWRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInVwZGF0ZSB0b3VyIG1lc3NhZ2VzIGVycm9yXCIsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgdXBkYXRlZFRvdXJTdGF0dXMgPSBbXTtcclxuICAgICAgICBpZiAodG91clN0YXR1cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB1cGRhdGVkVG91clN0YXR1cyA9IFsuLi50b3VyU3RhdHVzXTtcclxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RTaWduSW5kZXggPSB0b3VyU3RhdHVzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgKG9iaikgPT4gb2JqW1wicmVxdWVzdFNpZ25cIl0gPT09IGZhbHNlIHx8IG9ialtcInJlcXVlc3RTaWduXCJdID09PSB0cnVlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKHJlcXVlc3RTaWduSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZWRUb3VyU3RhdHVzW3JlcXVlc3RTaWduSW5kZXhdID0geyByZXF1ZXN0U2lnbjogdHJ1ZSB9O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdXBkYXRlZFRvdXJTdGF0dXMucHVzaCh7IHJlcXVlc3RTaWduOiB0cnVlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB1cGRhdGVkVG91clN0YXR1cyA9IFt7IHJlcXVlc3RTaWduOiB0cnVlIH1dO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgYXhpb3MucHV0KFxyXG4gICAgICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgICAgICBcImJhc2VVcmxcIlxyXG4gICAgICAgICAgICApfWNsYXNzZXMvY29udHJhY3RzJHtjb250cmFjdE5hbWV9LyR7c2lnbmVyVXNlcklkfWAsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBUb3VyU3RhdHVzOiB1cGRhdGVkVG91clN0YXR1c1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpLFxyXG4gICAgICAgICAgICAgICAgXCJYLVBhcnNlLVNlc3Npb24tVG9rZW5cIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3N0b2tlblwiKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInVwZGF0ZSB0b3VyIG1lc3NhZ2VzIGVycm9yXCIsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgY29uc3QgcmVxdWVzdFNpZ25Ub3VyRnVuY3Rpb24gPSAoKSA9PiB7XHJcbiAgICBjb25zdCB0b3VyQ29uZmlnID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgc2VsZWN0b3I6ICdbZGF0YS10dXQ9XCJyZWFjdG91ckZpcnN0XCJdJyxcclxuICAgICAgICBjb250ZW50OiAoKSA9PiAoXHJcbiAgICAgICAgICA8VG91ckNvbnRlbnRXaXRoQnRuXHJcbiAgICAgICAgICAgIG1lc3NhZ2U9e3QoXCJ0b3VyLW1zc2cucGRmLXJlcXVlc3QtZmlsZS0xXCIpfVxyXG4gICAgICAgICAgICBpc0NoZWNrZWQ9e2hhbmRsZURvbnRTaG93fVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApLFxyXG4gICAgICAgIHBvc2l0aW9uOiBcInRvcFwiLFxyXG4gICAgICAgIHN0eWxlOiB7IGZvbnRTaXplOiBcIjEzcHhcIiB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBzZWxlY3RvcjogJ1tkYXRhLXR1dD1cInBkZkFyZWFcIl0nLFxyXG4gICAgICAgIGNvbnRlbnQ6ICgpID0+IChcclxuICAgICAgICAgIDxUb3VyQ29udGVudFdpdGhCdG5cclxuICAgICAgICAgICAgbWVzc2FnZT17dChcInRvdXItbXNzZy5wZGYtcmVxdWVzdC1maWxlLTJcIil9XHJcbiAgICAgICAgICAgIGlzQ2hlY2tlZD17aGFuZGxlRG9udFNob3d9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICksXHJcbiAgICAgICAgcG9zaXRpb246IFwidG9wXCIsXHJcbiAgICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHNlbGVjdG9yOiAnW2RhdGEtdHV0PVwicmVhY3RvdXJGaWZ0aFwiXScsXHJcbiAgICAgICAgY29udGVudDogKCkgPT4gKFxyXG4gICAgICAgICAgPFRvdXJDb250ZW50V2l0aEJ0blxyXG4gICAgICAgICAgICBtZXNzYWdlPXt0KFwidG91ci1tc3NnLnBkZi1yZXF1ZXN0LWZpbGUtM1wiKX1cclxuICAgICAgICAgICAgaXNDaGVja2VkPXtoYW5kbGVEb250U2hvd31cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgKSxcclxuICAgICAgICBwb3NpdGlvbjogXCJ0b3BcIixcclxuICAgICAgICBzdHlsZTogeyBmb250U2l6ZTogXCIxM3B4XCIgfVxyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gICAgY29uc3Qgc2lnbmVkQnlTdGVwID0ge1xyXG4gICAgICBzZWxlY3RvcjogJ1tkYXRhLXR1dD1cInJlYWN0b3VyU2Vjb25kXCJdJyxcclxuICAgICAgY29udGVudDogKCkgPT4gKFxyXG4gICAgICAgIDxUb3VyQ29udGVudFdpdGhCdG5cclxuICAgICAgICAgIG1lc3NhZ2U9e3QoXCJ0b3VyLW1zc2cucGRmLXJlcXVlc3QtZmlsZS00XCIpfVxyXG4gICAgICAgICAgaXNDaGVja2VkPXtoYW5kbGVEb250U2hvd31cclxuICAgICAgICAvPlxyXG4gICAgICApLFxyXG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIixcclxuICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cclxuICAgIH07XHJcbiAgICAvL2NoZWNraW5nIGlmIHNpZ25lZCBieSB1c2VyIGNvbXBvbmVudCBleGlzdCB0aGVuIGFkZCBzaWduZWQgc3RlcFxyXG4gICAgY29uc3Qgc2lnbmVkQnkgPVxyXG4gICAgICBzaWduZWRTaWduZXJzLmxlbmd0aCA+IDBcclxuICAgICAgICA/IFsuLi50b3VyQ29uZmlnLnNsaWNlKDAsIDApLCBzaWduZWRCeVN0ZXAsIC4uLnRvdXJDb25maWcuc2xpY2UoMCldXHJcbiAgICAgICAgOiB0b3VyQ29uZmlnO1xyXG5cclxuICAgIC8vY2hlY2tpbmcgaWYgZGVmYXVsdCBzaWduYXR1cmUgY29tcG9uZW50IGV4aXN0IHRoZW4gYWRkIGRlZmF1bHRTaWduIHN0ZXBcclxuICAgIGNvbnN0IGRlZmF1bHRTaWduU3RlcCA9IHtcclxuICAgICAgc2VsZWN0b3I6ICdbZGF0YS10dXQ9XCJyZWFjdG91clRoaXJkXCJdJyxcclxuICAgICAgY29udGVudDogKCkgPT4gKFxyXG4gICAgICAgIDxUb3VyQ29udGVudFdpdGhCdG5cclxuICAgICAgICAgIG1lc3NhZ2U9e3QoXCJ0b3VyLW1zc2cucGRmLXJlcXVlc3QtZmlsZS01XCIpfVxyXG4gICAgICAgICAgaXNDaGVja2VkPXtoYW5kbGVEb250U2hvd31cclxuICAgICAgICAvPlxyXG4gICAgICApLFxyXG4gICAgICBwb3NpdGlvbjogXCJ0b3BcIixcclxuICAgICAgc3R5bGU6IHsgZm9udFNpemU6IFwiMTNweFwiIH1cclxuICAgIH07XHJcbiAgICAvL2luZGV4IGlzIGhhbmRsZSBpcyBzaWduZWQgYnkgZXhpc3QgdGhlbiAyIGVsc2UgMSB0byBhZGQgdG91ciBzdGVwXHJcbiAgICBjb25zdCBpbmRleCA9IHNpZ25lZFNpZ25lcnMubGVuZ3RoID4gMCA/IDIgOiAxO1xyXG4gICAgY29uc3QgZGVmYXVsdFNpZ25Ub3VyID0gZGVmYXVsdFNpZ25JbWdcclxuICAgICAgPyBbLi4uc2lnbmVkQnkuc2xpY2UoMCwgaW5kZXgpLCBkZWZhdWx0U2lnblN0ZXAsIC4uLnNpZ25lZEJ5LnNsaWNlKGluZGV4KV1cclxuICAgICAgOiBzaWduZWRCeTtcclxuXHJcbiAgICBpZiAoaXNNb2JpbGUpIHtcclxuICAgICAgdG91ckNvbmZpZy5zaGlmdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIDxUb3VyXHJcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2U9e2Nsb3NlUmVxdWVzdFNpZ25Ub3VyfVxyXG4gICAgICAgIHN0ZXBzPXtpc01vYmlsZSA/IHRvdXJDb25maWcgOiBkZWZhdWx0U2lnblRvdXJ9XHJcbiAgICAgICAgaXNPcGVuPXt0cnVlfVxyXG4gICAgICAgIGNsb3NlV2l0aE1hc2s9e2ZhbHNlfVxyXG4gICAgICAgIHJvdW5kZWQ9ezV9XHJcbiAgICAgIC8+XHJcbiAgICApO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZVVzZXJEZXRhaWxzID0gKCkgPT4ge1xyXG4gICAgc2V0SXNQdWJsaWNDb250YWN0KHRydWUpO1xyXG4gIH07XHJcblxyXG4gIC8vYGhhbmRsZVB1YmxpY1VzZXJgIGZ1bmN0aW9uIHRvIHVzZSBjcmVhdGUgdXNlciBmcm9tIHB1YmxpYyByb2xlIGFuZCBjcmVhdGUgZG9jdW1lbnQgZnJvbSBwdWJsaWMgdGVtcGxhdGVcclxuICBjb25zdCBoYW5kbGVQdWJsaWNVc2VyID0gYXN5bmMgKGUpID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHNldExvYWRpbmcodHJ1ZSk7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgICAgLi4uY29udGFjdCxcclxuICAgICAgICB0ZW1wbGF0ZWlkOiBwZGZEZXRhaWxzWzBdPy5vYmplY3RJZCxcclxuICAgICAgICByb2xlOiBwZGZEZXRhaWxzWzBdPy5QdWJsaWNSb2xlWzBdXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IHVzZXJSZXMgPSBhd2FpdCBheGlvcy5wb3N0KFxyXG4gICAgICAgIGAke2xvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICAgICAgXCJiYXNlVXJsXCJcclxuICAgICAgICApfS9mdW5jdGlvbnMvcHVibGljdXNlcmxpbmtjb250YWN0dG9kb2NgLFxyXG4gICAgICAgIHBhcmFtcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHVzZXJSZXM/LmRhdGE/LnJlc3VsdCkge1xyXG4gICAgICAgIHNldFJlcyh1c2VyUmVzLmRhdGEucmVzdWx0KTtcclxuICAgICAgICBhd2FpdCBTZW5kT3RwKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvciBpbiBwdWJsaWMtc2lnbiB0byBjcmVhdGUgdXNlciBkZXRhaWxzXCIpO1xyXG4gICAgICAgIGFsZXJ0KHQoXCJzb21ldGhpbmctd2VudC13cm9uZy1tc3NnXCIpKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImVcIiwgZSk7XHJcbiAgICAgIC8vICAgc2V0SXNMb2FkZXIoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gKGUpID0+IHtcclxuICAgIGxldCB7IG5hbWUsIHZhbHVlIH0gPSBlLnRhcmdldDtcclxuICAgIGlmIChuYW1lID09PSBcImVtYWlsXCIpIHtcclxuICAgICAgdmFsdWUgPSB2YWx1ZT8udG9Mb3dlckNhc2UoKT8ucmVwbGFjZSgvXFxzL2csIFwiXCIpO1xyXG4gICAgfVxyXG4gICAgc2V0Q29udGFjdCh7IC4uLmNvbnRhY3QsIFtuYW1lXTogdmFsdWUgfSk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgU2VuZE90cCA9IGFzeW5jICgpID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgZW1haWw6IGNvbnRhY3QuZW1haWwsIGRvY0lkOiByZXMuZG9jSWQgfTtcclxuICAgICAgY29uc3QgT3RwID0gYXdhaXQgYXhpb3MucG9zdChcclxuICAgICAgICBgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJhc2VVcmxcIil9L2Z1bmN0aW9ucy9TZW5kT1RQTWFpbFYxYCxcclxuICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgXCJYLVBhcnNlLUFwcGxpY2F0aW9uLUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFyc2VBcHBJZFwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChPdHApIHtcclxuICAgICAgICBzZXRJc090cCh0cnVlKTtcclxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJlcnJvciBpbiB2ZXJpZnkgb3RwIGluIHB1YmxpYy1zaWduXCIsIGVycm9yKTtcclxuICAgICAgYWxlcnQodChcInNvbWV0aGluZy13ZW50LXdyb25nLW1zc2dcIikpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vdmVyaWZ5IE9UUCBzZW5kIG9uIHZpYSBlbWFpbFxyXG4gIGNvbnN0IFZlcmlmeU9UUCA9IGFzeW5jIChlKSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBzZXRMb2FkaW5nKHRydWUpO1xyXG4gICAgY29uc3Qgc2VydmVyVXJsID1cclxuICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJiYXNlVXJsXCIpICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYmFzZVVybFwiKTtcclxuICAgIGNvbnN0IHBhcnNlSWQgPVxyXG4gICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcInBhcnNlQXBwSWRcIikgJiYgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpO1xyXG4gICAgaWYgKG90cCkge1xyXG4gICAgICAvLyBzZXRMb2FkaW5nKHRydWUpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCB1cmwgPSBgJHtzZXJ2ZXJVcmx9L2Z1bmN0aW9ucy9BdXRoTG9naW5Bc01haWwvYDtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICBcIlgtUGFyc2UtQXBwbGljYXRpb24tSWRcIjogcGFyc2VJZFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbGV0IGJvZHkgPSB7IGVtYWlsOiBjb250YWN0LmVtYWlsLCBvdHA6IG90cCB9O1xyXG4gICAgICAgIGxldCB1c2VyID0gYXdhaXQgYXhpb3MucG9zdCh1cmwsIGJvZHksIHsgaGVhZGVyczogaGVhZGVycyB9KTtcclxuICAgICAgICBpZiAodXNlci5kYXRhLnJlc3VsdCA9PT0gXCJJbnZhbGlkIE90cFwiKSB7XHJcbiAgICAgICAgICBhbGVydCh0KFwiaW52YWxpZC1vdHBcIikpO1xyXG4gICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyLmRhdGEucmVzdWx0ID09PSBcInVzZXIgbm90IGZvdW5kIVwiKSB7XHJcbiAgICAgICAgICBhbGVydCh0KFwidXNlci1ub3QtZm91bmRcIikpO1xyXG4gICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBfdXNlciA9IHVzZXIuZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgICBjb25zdCBwYXJzZUlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJzZUFwcElkXCIpO1xyXG4gICAgICAgICAgYXdhaXQgUGFyc2UuVXNlci5iZWNvbWUoX3VzZXIuc2Vzc2lvblRva2VuKTtcclxuICAgICAgICAgIGNvbnN0IGNvbnRyYWN0VXNlckRldGFpbHMgPSBhd2FpdCBjb250cmFjdFVzZXJzKCk7XHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIlVzZXJJbmZvcm1hdGlvblwiLCBKU09OLnN0cmluZ2lmeShfdXNlcikpO1xyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgIGBQYXJzZS8ke3BhcnNlSWR9L2N1cnJlbnRVc2VyYCxcclxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoX3VzZXIpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKGNvbnRyYWN0VXNlckRldGFpbHMgJiYgY29udHJhY3RVc2VyRGV0YWlscy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICAgIFwiRXh0YW5kX0NsYXNzXCIsXHJcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29udHJhY3RVc2VyRGV0YWlscylcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInVzZXJuYW1lXCIsIF91c2VyLm5hbWUpO1xyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2Nlc3N0b2tlblwiLCBfdXNlci5zZXNzaW9uVG9rZW4pO1xyXG4gICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICAvLyBuYXZpZ2F0ZShgL2xvYWQvcmVjaXBpZW50U2lnblBkZi8ke3Jlcz8uZG9jSWR9LyR7cmVzPy5jb250YWN0SWR9YCk7XHJcbiAgICAgICAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm15X21vZGFsXCIpLmNsb3NlKCk7XHJcbiAgICAgICAgICBzZXRJc1B1YmxpY0NvbnRhY3QoZmFsc2UpO1xyXG4gICAgICAgICAgc2V0SXNQdWJsaWNUZW1wbGF0ZShmYWxzZSk7XHJcbiAgICAgICAgICBzZXRJc0xvYWRpbmcoeyBpc0xvYWQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgc2V0RG9jdW1lbnRJZChyZXM/LmRvY0lkKTtcclxuICAgICAgICAgIGdldERvY3VtZW50RGV0YWlscyhyZXM/LmRvY0lkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnIgXCIsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYWxlcnQodChcImVudGVyLW90cC1hbGVydFwiKSk7XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBoYW5kbGVDbG9zZU90cCA9ICgpID0+IHtcclxuICAgIHNldElzUHVibGljQ29udGFjdChmYWxzZSk7XHJcbiAgICBzZXRMb2FkaW5nKGZhbHNlKTtcclxuICAgIHNldElzT3RwKGZhbHNlKTtcclxuICAgIHNldE90cCgpO1xyXG4gICAgc2V0Q29udGFjdCh7IG5hbWU6IFwiXCIsIGVtYWlsOiBcIlwiLCBwaG9uZTogXCJcIiB9KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBjbGlja09uWm9vbUluID0gKCkgPT4ge1xyXG4gICAgb25DbGlja1pvb21JbihzY2FsZSwgem9vbVBlcmNlbnQsIHNldFNjYWxlLCBzZXRab29tUGVyY2VudCk7XHJcbiAgfTtcclxuICBjb25zdCBjbGlja09uWm9vbU91dCA9ICgpID0+IHtcclxuICAgIG9uQ2xpY2tab29tT3V0KHpvb21QZXJjZW50LCBzY2FsZSwgc2V0Wm9vbVBlcmNlbnQsIHNldFNjYWxlKTtcclxuICB9O1xyXG4gIGNvbnN0IGhhbmRsZURvd25sb2FkQnRuID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgY29uc3QgdXJsID0gcGRmRGV0YWlscz8uWzBdPy5TaWduZWRVcmwgfHwgcGRmRGV0YWlscz8uWzBdPy5VUkw7XHJcbiAgICBjb25zdCBuYW1lID0gcGRmRGV0YWlscz8uWzBdPy5OYW1lO1xyXG4gICAgYXdhaXQgZmV0Y2hVcmwodXJsLCBuYW1lKTtcclxuICB9O1xyXG4gIGNvbnN0IGhhbmRsZURlY2xpbmVNc3NnID0gKCkgPT4ge1xyXG4gICAgY29uc3QgdXNlciA9IHBkZkRldGFpbHNbMF0/LkRlY2xpbmVCeT8uZW1haWw7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIHt0KFwiZGVjbGluZS1hbGVydC0zXCIpfVxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMlwiPlxyXG4gICAgICAgICAge1wiIFwifVxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj57dChcImRlY2xpbmUtYnlcIil9PC9zcGFuPiA6IHt1c2VyfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMlwiPlxyXG4gICAgICAgICAge1wiIFwifVxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj57dChcInJlYXNvblwiKX08L3NwYW4+IDp7XCIgXCJ9XHJcbiAgICAgICAgICB7cGRmRGV0YWlsc1swXT8uRGVjbGluZVJlYXNvbn17XCIgXCJ9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgKTtcclxuICB9O1xyXG4gIHJldHVybiAoXHJcbiAgICA8RG5kUHJvdmlkZXIgYmFja2VuZD17SFRNTDVCYWNrZW5kfT5cclxuICAgICAgPFRpdGxlIHRpdGxlPXtwcm9wcy50ZW1wbGF0ZUlkID8gXCJQdWJsaWMgU2lnblwiIDogXCJSZXF1ZXN0IFNpZ25cIn0gLz5cclxuICAgICAge2lzU3Vic2NyaXB0aW9uRXhwaXJlZCA/IChcclxuICAgICAgICA8TW9kYWxVaVxyXG4gICAgICAgICAgdGl0bGU9e3QoXCJzdWJzY3JpcHRpb24tZXhwaXJlZFwiKX1cclxuICAgICAgICAgIGlzT3Blbj17aXNTdWJzY3JpcHRpb25FeHBpcmVkfVxyXG4gICAgICAgICAgc2hvd0Nsb3NlPXtmYWxzZX1cclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHB5LTQgbWQ6cHktNSBnYXAtNVwiPlxyXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIG1kOnRleHQtbGcgZm9udC1ub3JtYWxcIj5cclxuICAgICAgICAgICAgICB7dChcIm93bmVyLXN1YnNjcmlwdGlvbi1leHBpcmVkXCIpfVxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L01vZGFsVWk+XHJcbiAgICAgICkgOiAoXHJcbiAgICAgICAgPD5cclxuICAgICAgICAgIHtpc0xvYWRpbmcuaXNMb2FkID8gKFxyXG4gICAgICAgICAgICA8TG9hZGVyV2l0aE1zZyBpc0xvYWRpbmc9e2lzTG9hZGluZ30gLz5cclxuICAgICAgICAgICkgOiBoYW5kbGVFcnJvciA/IChcclxuICAgICAgICAgICAgPEhhbmRsZUVycm9yIGhhbmRsZUVycm9yPXtoYW5kbGVFcnJvcn0gLz5cclxuICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAge2lzVWlMb2FkaW5nICYmIChcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaC1bMTAwdmhdIHctZnVsbCBmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciB6LVs5OTldIGJnLVsjZTZmMmYyXSBiZy1vcGFjaXR5LTgwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxMb2FkZXIgLz5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1iYXNlLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7dChcImxvYWRpbmctbXNzZ1wiKX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICB7aXNDZWxlYnJhdGlvbiAmJiAoXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHotWzEwMDBdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxDb25mZXR0aVxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPXt3aW5kb3cuaW5uZXJXaWR0aH1cclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9e3dpbmRvdy5pbm5lckhlaWdodH1cclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czpcclxuICAgICAgICAgICAgICAgICAgICBpc0V4cGlyZWQgfHxcclxuICAgICAgICAgICAgICAgICAgICAoaXNEZWNsaW5lLmlzRGVjbGluZWQgJiYgaXNEZWNsaW5lLmN1cnJudCA9PT0gXCJhbm90aGVyXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwiYXV0b1wiXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcclxuICAgICAgICAgICAgICAgICAgKHByb3BzLnRlbXBsYXRlSWQgfHwgaXNHdWVzdFNpZ25GbG93KSAmJlxyXG4gICAgICAgICAgICAgICAgICBcIm14LTIgYm9yZGVyLVswLjVweF0gYm9yZGVyLWdyYXktMzAwXCJcclxuICAgICAgICAgICAgICAgIH0gcmVsYXRpdmUgb3AtY2FyZCBvdmVyZmxvdy1oaWRkZW4gZmxleCBmbGV4LWNvbCBtZDpmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gYmctYmFzZS0zMDBgfVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHshcmVxdWVzdFNpZ25Ub3VyICYmXHJcbiAgICAgICAgICAgICAgICAgIHNpZ25lck9iamVjdElkICYmXHJcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RTaWduVG91ckZ1bmN0aW9uKCl9XHJcbiAgICAgICAgICAgICAgICA8TW9kYWxVaVxyXG4gICAgICAgICAgICAgICAgICBpc09wZW49e2lzQWxlcnQuaXNTaG93fVxyXG4gICAgICAgICAgICAgICAgICB0aXRsZT17dChcImFsZXJ0LW1lc3NhZ2VcIil9XHJcbiAgICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlPXsoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHNldElzQWxlcnQoeyBpc1Nob3c6IGZhbHNlLCBhbGVydE1lc3NhZ2U6IFwiXCIgfSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtZnVsbCBwLVsyMHB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPntpc0FsZXJ0LmFsZXJ0TWVzc2FnZX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7IGlzU2hvdzogZmFsc2UsIGFsZXJ0TWVzc2FnZTogXCJcIiB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnkgbXQtMyBweC00XCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7dChcIm9rXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvTW9kYWxVaT5cclxuXHJcbiAgICAgICAgICAgICAgICA8VG91clxyXG4gICAgICAgICAgICAgICAgICBzaG93TnVtYmVyPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgICAgc2hvd05hdmlnYXRpb249e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgICBzaG93TmF2aWdhdGlvbk51bWJlcj17ZmFsc2V9XHJcbiAgICAgICAgICAgICAgICAgIG9uUmVxdWVzdENsb3NlPXtjbG9zZVRvdXJ9XHJcbiAgICAgICAgICAgICAgICAgIHN0ZXBzPXt0b3VyQ29uZmlnfVxyXG4gICAgICAgICAgICAgICAgICBpc09wZW49e3dpZGdldHNUb3VyfVxyXG4gICAgICAgICAgICAgICAgICByb3VuZGVkPXs1fVxyXG4gICAgICAgICAgICAgICAgICBjbG9zZVdpdGhNYXNrPXtmYWxzZX1cclxuICAgICAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgey8qIHRoaXMgbW9kYWwgaXMgdXNlZCB0byBzaG93IGRlY2xpbmUgYWxlcnQgKi99XHJcbiAgICAgICAgICAgICAgICA8UGRmRGVjbGluZU1vZGFsXHJcbiAgICAgICAgICAgICAgICAgIHNob3c9e2lzRGVjbGluZS5pc0RlY2xpbmVkfVxyXG4gICAgICAgICAgICAgICAgICBoZWFkTXNnPXt0KFwiZG9jdW1lbnQtZGVjbGluZWRcIil9XHJcbiAgICAgICAgICAgICAgICAgIGJvZHlNc3NnPXtcclxuICAgICAgICAgICAgICAgICAgICBpc0RlY2xpbmUuY3Vycm50ID09PSBcIlN1cmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPyB0KFwiZGVjbGluZS1hbGVydC0xXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICA6IGlzRGVjbGluZS5jdXJybnQgPT09IFwiWW91RGVjbGluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHQoXCJkZWNsaW5lLWFsZXJ0LTJcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0RlY2xpbmUuY3Vycm50ID09PSBcImFub3RoZXJcIiAmJiBoYW5kbGVEZWNsaW5lTXNzZygpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZm9vdGVyTWVzc2FnZT17aXNEZWNsaW5lLmN1cnJudCA9PT0gXCJTdXJlXCJ9XHJcbiAgICAgICAgICAgICAgICAgIGRlY2xpbmVEb2M9e2RlY2xpbmVEb2N9XHJcbiAgICAgICAgICAgICAgICAgIHNldElzRGVjbGluZT17c2V0SXNEZWNsaW5lfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIHsvKiB0aGlzIG1vZGFsIGlzIHVzZWQgZm9yIHNob3cgZXhwaXJlZCBhbGVydCAqL31cclxuICAgICAgICAgICAgICAgIDxQZGZEZWNsaW5lTW9kYWxcclxuICAgICAgICAgICAgICAgICAgc2hvdz17aXNFeHBpcmVkfVxyXG4gICAgICAgICAgICAgICAgICBoZWFkTXNnPXt0KFwiZXhwaXJlZC1kb2MtdGl0bGVcIil9XHJcbiAgICAgICAgICAgICAgICAgIGJvZHlNc3NnPXt0KFwiZXhwaXJlZC1vbi1tc3NnXCIsIHsgZXhwaXJlZERhdGUgfSl9XHJcbiAgICAgICAgICAgICAgICAgIGlzRG93bmxvYWRCdG49e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgIGhhbmRsZURvd25sb2FkQnRuPXtoYW5kbGVEb3dubG9hZEJ0bn1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICB7IWlzRW1haWxWZXJpZmllZCAmJiAoXHJcbiAgICAgICAgICAgICAgICAgIDxWZXJpZnlFbWFpbFxyXG4gICAgICAgICAgICAgICAgICAgIGlzVmVyaWZ5TW9kYWw9e2lzVmVyaWZ5TW9kYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNWZXJpZnlNb2RhbD17c2V0SXNWZXJpZnlNb2RhbH1cclxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVWZXJpZnlFbWFpbD17aGFuZGxlVmVyaWZ5RW1haWx9XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0T3RwPXtzZXRPdHB9XHJcbiAgICAgICAgICAgICAgICAgICAgb3RwPXtvdHB9XHJcbiAgICAgICAgICAgICAgICAgICAgb3RwTG9hZGVyPXtvdHBMb2FkZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVmVyaWZ5QnRuPXtoYW5kbGVWZXJpZnlCdG59XHJcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlUmVzZW5kPXtoYW5kbGVSZXNlbmR9XHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgPE1vZGFsVWlcclxuICAgICAgICAgICAgICAgICAgaXNPcGVuPXtpc1B1YmxpY0NvbnRhY3R9XHJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPXtpc090cCA/IHQoXCJ2ZXJpZnktZW1haWwtMVwiKSA6IHQoXCJjb250YWN0LWRldGFpbHNcIil9XHJcbiAgICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlPXsoKSA9PiBoYW5kbGVDbG9zZU90cCgpfVxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtZnVsbCBwLVsyMHB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHtpc090cCA/IChcclxuICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtWZXJpZnlPVFB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLVswLjc1cmVtXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJnZXQtb3RwLWFsZXJ0XCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1bcmVkXVwiPiAqPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJvdHBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3QoXCJvdHAtcGxhY2Vob2xkZXJcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkludmFsaWQ9eyhlKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eSh0KFwiaW5wdXQtcmVxdWlyZWRcIikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbklucHV0PXsoZSkgPT4gZS50YXJnZXQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e290cH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0T3RwKGUudGFyZ2V0LnZhbHVlKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtaW5wdXQgb3AtaW5wdXQtYm9yZGVyZWQgb3AtaW5wdXQtc20gZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdy1mdWxsIHRleHQteHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTYgZmxleCBqdXN0aWZ5LXN0YXJ0IGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gdChcImxvYWRpbmdcIikgOiB0KFwidmVyaWZ5XCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tZ2hvc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlQ2xvc2VPdHAoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImNhbmNlbFwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgIDxmb3JtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtYmFzZS1jb250ZW50IHAtMiBteC1hdXRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25TdWJtaXQ9e2hhbmRsZVB1YmxpY1VzZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItWzAuNzVyZW1dXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJsb2NrIHRleHQteHMgZm9udC1zZW1pYm9sZCBtYi1bNXB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJuYW1lXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1bcmVkXVwiPiAqPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cIm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbnRhY3QubmFtZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW52YWxpZD17KGUpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnNldEN1c3RvbVZhbGlkaXR5KHQoXCJpbnB1dC1yZXF1aXJlZFwiKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5wdXQ9eyhlKSA9PiBlLnRhcmdldC5zZXRDdXN0b21WYWxpZGl0eShcIlwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17bG9hZGluZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkIG9wLWlucHV0LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBob3Zlcjpib3JkZXItYmFzZS1jb250ZW50IHctZnVsbCB0ZXh0LXhzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi1bMC43NXJlbV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC14cyBmb250LXNlbWlib2xkIG1iLVs1cHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImVtYWlsXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gdGV4dC1bcmVkXVwiPiAqPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImVtYWlsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb250YWN0LmVtYWlsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25JbnZhbGlkPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuc2V0Q3VzdG9tVmFsaWRpdHkodChcImlucHV0LXJlcXVpcmVkXCIpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25JbnB1dD17KGUpID0+IGUudGFyZ2V0LnNldEN1c3RvbVZhbGlkaXR5KFwiXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtaW5wdXQgb3AtaW5wdXQtYm9yZGVyZWQgb3AtaW5wdXQtc20gZm9jdXM6b3V0bGluZS1ub25lIGhvdmVyOmJvcmRlci1iYXNlLWNvbnRlbnQgdy1mdWxsIHRleHQteHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLVswLjc1cmVtXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgbWItWzVweF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwicGhvbmVcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb250YWN0LnBob25lfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInBob25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXt0KFwicGhvbmUtb3B0aW9uYWxcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17bG9hZGluZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWlucHV0IG9wLWlucHV0LWJvcmRlcmVkIG9wLWlucHV0LXNtIGZvY3VzOm91dGxpbmUtbm9uZSBob3Zlcjpib3JkZXItYmFzZS1jb250ZW50IHctZnVsbCB0ZXh0LXhzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNiBmbGV4IGp1c3RpZnktc3RhcnQgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2xvYWRpbmcgPyB0KFwibG9hZGluZ1wiKSA6IHQoXCJzdWJtaXRcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1naG9zdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVDbG9zZU90cCgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwiY2xvc2VcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9Nb2RhbFVpPlxyXG4gICAgICAgICAgICAgICAgPE1vZGFsVWlcclxuICAgICAgICAgICAgICAgICAgaXNPcGVuPXtkZWZhdWx0U2lnbkFsZXJ0LmlzU2hvd31cclxuICAgICAgICAgICAgICAgICAgdGl0bGU9e3QoXCJhdXRvLXNpZ24tYWxsXCIpfVxyXG4gICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZT17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICBzZXREZWZhdWx0U2lnbkFsZXJ0KHsgaXNTaG93OiBmYWxzZSwgYWxlcnRNZXNzYWdlOiBcIlwiIH0pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLWZ1bGwgcC1bMjBweF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8cD57ZGVmYXVsdFNpZ25BbGVydC5hbGVydE1lc3NhZ2V9PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1bMXB4XSB3LWZ1bGwgbXktWzE1cHhdIGJnLVsjOWY5ZjlmXVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIHtkZWZhdWx0U2lnbkltZyA/IChcclxuICAgICAgICAgICAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBhZGREZWZhdWx0U2lnbmF0dXJlKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwieWVzXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZWZhdWx0U2lnbkFsZXJ0KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaG93OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnRNZXNzYWdlOiBcIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImNsb3NlXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxyXG4gICAgICAgICAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNBbGVydCh7IGlzU2hvdzogZmFsc2UsIGFsZXJ0TWVzc2FnZTogXCJcIiB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvcC1idG4gb3AtYnRuLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7dChcIm9rXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L01vZGFsVWk+XHJcbiAgICAgICAgICAgICAgICB7LyogdGhpcyBjb21wb25lbnQgdXNlZCB0byByZW5kZXIgYWxsIHBkZiBwYWdlcyBpbiBsZWZ0IHNpZGUgKi99XHJcbiAgICAgICAgICAgICAgICA8UmVuZGVyQWxsUGRmUGFnZVxyXG4gICAgICAgICAgICAgICAgICBzaWduZXJQb3M9e3NpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgc2lnbmVyT2JqZWN0SWQ9e3NpZ25lck9iamVjdElkfVxyXG4gICAgICAgICAgICAgICAgICBzaWduUGRmVXJsPXtcclxuICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzWzBdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgKHBkZkRldGFpbHNbMF0/LlNpZ25lZFVybCB8fCBwZGZEZXRhaWxzWzBdPy5VUkwpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYWxsUGFnZXM9e2FsbFBhZ2VzfVxyXG4gICAgICAgICAgICAgICAgICBzZXRBbGxQYWdlcz17c2V0QWxsUGFnZXN9XHJcbiAgICAgICAgICAgICAgICAgIHNldFBhZ2VOdW1iZXI9e3NldFBhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXI9e3BhZ2VOdW1iZXJ9XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcldIPXtjb250YWluZXJXSH1cclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICB7LyogcGRmIHJlbmRlciB2aWV3ICovfVxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCIgdy1mdWxsIG1kOnctWzU3JV0gZmxleCBtci00XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxQZGZab29tXHJcbiAgICAgICAgICAgICAgICAgICAgY2xpY2tPblpvb21Jbj17Y2xpY2tPblpvb21Jbn1cclxuICAgICAgICAgICAgICAgICAgICBjbGlja09uWm9vbU91dD17Y2xpY2tPblpvb21PdXR9XHJcbiAgICAgICAgICAgICAgICAgICAgaXNEaXNhYmxlUm90YXRlPXt0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIiB3LWZ1bGwgbWQ6dy1bOTUlXSBcIj5cclxuICAgICAgICAgICAgICAgICAgICB7LyogdGhpcyBtb2RhbCBpcyB1c2VkIHNob3cgdGhpcyBkb2N1bWVudCBpcyBhbHJlYWR5IHNpZ24gKi99XHJcbiAgICAgICAgICAgICAgICAgICAgPE1vZGFsVWlcclxuICAgICAgICAgICAgICAgICAgICAgIGlzT3Blbj17aXNDb21wbGV0ZWQuaXNNb2RhbH1cclxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXt0KFwiZG9jdW1lbnQtc2lnbmVkXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldElzQ29tcGxldGVkKChwcmV2KSA9PiAoeyAuLi5wcmV2LCBpc01vZGFsOiBmYWxzZSB9KSlcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZVdpZHRoPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgIWlzQ29tcGxldGVkPy5tZXNzYWdlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibWQ6bWluLXctWzQ0MHB4XSBtZDptYXgtdy1bNDAwcHhdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImgtZnVsbCBwLVsyMHB4XSB0ZXh0LWJhc2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aXNDb21wbGV0ZWQ/Lm1lc3NhZ2UgPyAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e2lzQ29tcGxldGVkPy5tZXNzYWdlfTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB4LVsxNXB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3QoXCJkb2N1bWVudC1zaWduZWQtYWxlcnQtNFwiKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHshaXNDb21wbGV0ZWQ/Lm1lc3NhZ2UgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBtdC00IGdhcC0xIHB4LVsxNXB4XVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUb1ByaW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZlVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRG93bmxvYWRpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb250LVs1MDBdIHRleHQtWzEzcHhdIG1yLVs1cHhdIG9wLWJ0biBvcC1idG4tbmV1dHJhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtcHJpbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBsZzpibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KFwicHJpbnRcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEb3dubG9hZENlcnRpZmljYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzRG93bmxvYWRpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZm9udC1bNTAwXSB0ZXh0LVsxM3B4XSBtci1bNXB4XSBvcC1idG4gb3AtYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmEtbGlnaHQgZmEtYXdhcmQgbXgtWzNweF0gbGc6bXgtMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIGxnOmJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoXCJjZXJ0aWZpY2F0ZVwiKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmb250LVs1MDBdIHRleHQtWzEzcHhdIG1yLVs1cHhdIG9wLWJ0biBvcC1idG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRG93bmxvYWRQZGYocGRmRGV0YWlscywgc2V0SXNEb3dubG9hZGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZhLWxpZ2h0IGZhLWRvd25sb2FkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dChcImRvd25sb2FkXCIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvTW9kYWxVaT5cclxuICAgICAgICAgICAgICAgICAgICB7aXNEb3dubG9hZGluZyA9PT0gXCJwZGZcIiAmJiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIHotWzEwMDBdIGluc2V0LTAgZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgYmctYmxhY2sgYmctb3BhY2l0eS0zMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8TG9hZGVyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgICAgICAgICAgICAgICBpc09wZW49e2lzRG93bmxvYWRpbmcgPT09IFwiY2VydGlmaWNhdGVcIn1cclxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNEb3dubG9hZGluZyA9PT0gXCJjZXJ0aWZpY2F0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0KFwiZ2VuZXJhdGluZy1jZXJ0aWZpY2F0ZVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogdChcInBkZi1kb3dubG9hZFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9eygpID0+IHNldElzRG93bmxvYWRpbmcoXCJcIil9XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTMgbWQ6cC01IHRleHQtWzEzcHhdIG1kOnRleHQtYmFzZSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aXNEb3dubG9hZGluZyA9PT0gXCJjZXJ0aWZpY2F0ZVwifXtcIiBcIn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3QoXCJnZW5lcmF0ZS1jZXJ0aWZpY2F0ZS1hbGVydFwiKX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L01vZGFsVWk+XHJcbiAgICAgICAgICAgICAgICAgICAgey8qIHRoaXMgY29tcG9uZW50IGlzIHVzZWQgZm9yIHNpZ25hdHVyZSBwYWQgbW9kYWwgKi99XHJcbiAgICAgICAgICAgICAgICAgICAgPFNpZ25QYWRcclxuICAgICAgICAgICAgICAgICAgICAgIGlzU2lnblBhZD17aXNTaWduUGFkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaXNTdGFtcD17aXNTdGFtcH1cclxuICAgICAgICAgICAgICAgICAgICAgIHNldElzSW1hZ2VTZWxlY3Q9e3NldElzSW1hZ2VTZWxlY3R9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cclxuICAgICAgICAgICAgICAgICAgICAgIHNldEltYWdlPXtzZXRJbWFnZX1cclxuICAgICAgICAgICAgICAgICAgICAgIGlzSW1hZ2VTZWxlY3Q9e2lzSW1hZ2VTZWxlY3R9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZVJlZj17aW1hZ2VSZWZ9XHJcbiAgICAgICAgICAgICAgICAgICAgICBvbkltYWdlQ2hhbmdlPXtvbkltYWdlQ2hhbmdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlPXtzZXRTaWduYXR1cmV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZT17aW1hZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICBvblNhdmVJbWFnZT17c2F2ZUltYWdlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgb25TYXZlU2lnbj17c2F2ZVNpZ259XHJcbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2lnbj17ZGVmYXVsdFNpZ25JbWd9XHJcbiAgICAgICAgICAgICAgICAgICAgICBteUluaXRpYWw9e215SW5pdGlhbH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlzSW5pdGlhbD17aXNJbml0aWFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbml0aWFsPXtzZXRJc0luaXRpYWx9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0YW1wPXtzZXRJc1N0YW1wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgY3VycldpZGdldHNEZXRhaWxzPXtjdXJyV2lkZ2V0c0RldGFpbHN9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyV2lkZ2V0c0RldGFpbHM9e3NldEN1cnJXaWRnZXRzRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgIHsvKiBwZGYgaGVhZGVyIHdoaWNoIGNvbnRhaW4gZnVuaXNoIGJhY2sgYnV0dG9uICovfVxyXG4gICAgICAgICAgICAgICAgICAgIDxIZWFkZXJcclxuICAgICAgICAgICAgICAgICAgICAgIGlzUGRmUmVxdWVzdEZpbGVzPXtpc1B1YmxpY1RlbXBsYXRlID8gZmFsc2UgOiB0cnVlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgIGFsbFBhZ2VzPXthbGxQYWdlc31cclxuICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVBhZ2U9e2NoYW5nZVBhZ2V9XHJcbiAgICAgICAgICAgICAgICAgICAgICBwZGZEZXRhaWxzPXtwZGZEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgc2lnbmVyUG9zPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpc1NpZ25lZD17aXNTaWduZWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXRlZD17aXNDb21wbGV0ZWQuaXNDZXJ0aWZpY2F0ZX1cclxuICAgICAgICAgICAgICAgICAgICAgIGVtYmVkV2lkZ2V0c0RhdGE9e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1B1YmxpY1RlbXBsYXRlID8gaGFuZGxlVXNlckRldGFpbHMgOiBlbWJlZFdpZGdldHNEYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpc1Nob3dIZWFkZXI9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc0RlY2xpbmU9e3NldElzRGVjbGluZX1cclxuICAgICAgICAgICAgICAgICAgICAgIGRlY2xpbmU9e3RydWV9XHJcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2lnbmVyPXtjdXJyZW50U2lnbmVyfVxyXG4gICAgICAgICAgICAgICAgICAgICAgcGRmVXJsPXtwZGZVcmx9XHJcbiAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5U2lnbj17YWxyZWFkeVNpZ259XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJXSD17Y29udGFpbmVyV0h9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpc1B1YmxpY1RlbXBsYXRlPXtpc1B1YmxpY1RlbXBsYXRlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xpY2tPblpvb21Jbj17Y2xpY2tPblpvb21Jbn1cclxuICAgICAgICAgICAgICAgICAgICAgIGNsaWNrT25ab29tT3V0PXtjbGlja09uWm9vbU91dH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZVJvdGF0ZT17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSWQ9e3Byb3BzLnRlbXBsYXRlSWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc0Rvd25sb2FkTW9kYWw9e3NldElzRG93bmxvYWRNb2RhbH1cclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHJlZj17ZGl2UmVmfSBkYXRhLXR1dD1cInBkZkFyZWFcIiBjbGFzc05hbWU9XCJoLVs5NSVdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7Y29udGFpbmVyV0ggJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8UmVuZGVyUGRmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcj17cGFnZU51bWJlcn1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZPcmlnaW5hbFdIPXtwZGZPcmlnaW5hbFdIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZk5ld1dpZHRoPXtwZGZOZXdXaWR0aH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1NpZ25QYWQ9e3NldElzU2lnblBhZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0YW1wPXtzZXRJc1N0YW1wfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25LZXk9e3NldFNpZ25LZXl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZXJQb3M9e3NpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzRW1haWw9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZlVybD17cGRmVXJsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG51bVBhZ2VzPXtudW1QYWdlc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlRGV0YWlscz17cGFnZURldGFpbHN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmUmVxdWVzdD17dHJ1ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZXJPYmplY3RJZD17c2lnbmVyT2JqZWN0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkU2lnbmVycz17c2lnbmVkU2lnbmVyc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQZGZMb2FkPXtzZXRQZGZMb2FkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkxvYWQ9e3BkZkxvYWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmVyUG9zPXtzZXRTaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyV0g9e2NvbnRhaW5lcldIfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5pdGlhbD17c2V0SXNJbml0aWFsfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbGlkYXRlQWxlcnQ9e3NldFZhbGlkYXRlQWxlcnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5TaWduZWRXaWRnZXRJZD17dW5TaWduZWRXaWRnZXRJZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3RXaWRnZXRJZD17c2V0U2VsZWN0V2lkZ2V0SWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0V2lkZ2V0SWQ9e3NlbGVjdFdpZGdldElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJXaWRnZXRzRGV0YWlscz17c2V0Q3VycldpZGdldHNEZXRhaWxzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpdlJlZj17ZGl2UmVmfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzUmVzaXplPXtzZXRJc1Jlc2l6ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Jlc2l6ZT17aXNSZXNpemV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2NhbGU9e3NldFNjYWxlfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPXtzY2FsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZD17dW5pcXVlSWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNwdWJsaWNUZW1wbGF0ZT17aXNQdWJsaWNUZW1wbGF0ZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVc2VyRGV0YWlscz17aGFuZGxlVXNlckRldGFpbHN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIG1kOnctWzIzJV0gYmctYmFzZS0xMDAgb3ZlcmZsb3cteS1hdXRvIGhpZGUtc2Nyb2xsYmFyIGhpZGRlbiBtZDppbmxpbmUtYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BtYXgtaC1zY3JlZW5gfT5cclxuICAgICAgICAgICAgICAgICAgICB7c2lnbmVkU2lnbmVycy5sZW5ndGggPiAwICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXR1dD1cInJlYWN0b3VyU2Vjb25kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteC0yIHByLTIgcHQtMiBwYi0xIHRleHQtWzE1cHhdIHRleHQtYmFzZS1jb250ZW50IGZvbnQtc2VtaWJvbGQgYm9yZGVyLWItWzFweF0gYm9yZGVyLWJhc2UtMzAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt0KFwic2lnbmVkLWJ5XCIpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtWzJweF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7c2lnbmVkU2lnbmVycy5tYXAoKG9iaiwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17aW5kfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2lnbmVyTGlzdENvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kPXtpbmR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmo9e29ian1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWVudT17aXNIZWFkZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZXJQb3M9e3NpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAge3Vuc2lnbmVkU2lnbmVycy5sZW5ndGggPiAwICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgIDw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXR1dD1cInJlYWN0b3VyRmlyc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14LTIgcHItMiBwdC0yIHBiLTEgdGV4dC1bMTVweF0gdGV4dC1iYXNlLWNvbnRlbnQgZm9udC1zZW1pYm9sZCBib3JkZXItYi1bMXB4XSBib3JkZXItYmFzZS0zMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3QoXCJ5ZXQtdG8tc2lnblwiKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LVs1cHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3Vuc2lnbmVkU2lnbmVycy5tYXAoKG9iaiwgaW5kKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17aW5kfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2lnbmVyTGlzdENvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kPXtpbmR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmo9e29ian1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWVudT17aXNIZWFkZXJ9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZXJQb3M9e3NpZ25lclBvc31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC8+XHJcbiAgICAgICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgICAgICB7ZGVmYXVsdFNpZ25JbWcgJiYgIWFscmVhZHlTaWduICYmIGN1cnJlbnRTaWduZXIgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgPERlZmF1bHRTaWduYXR1cmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFNpZ25JbWc9e2RlZmF1bHRTaWduSW1nfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyT2JqZWN0SWQ9e3NpZ25lck9iamVjdElkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0xvYWRpbmc9e3NldElzTG9hZGluZ31cclxuICAgICAgICAgICAgICAgICAgICAgICAgeHlQb3N0aW9uPXtzaWduZXJQb3N9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldERlZmF1bHRTaWduQWxlcnQ9e3NldERlZmF1bHRTaWduQWxlcnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICl9XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgKX1cclxuICAgICAgICAgIDxNb2RhbFVpXHJcbiAgICAgICAgICAgIGlzT3Blbj17dmFsaWRhdGVBbGVydH1cclxuICAgICAgICAgICAgdGl0bGU9e3QoXCJ2YWxpZGF0aW9uLWFsZXJ0XCIpfVxyXG4gICAgICAgICAgICBoYW5kbGVDbG9zZT17KCkgPT4gc2V0VmFsaWRhdGVBbGVydChmYWxzZSl9XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1bMTAwJV0gcC1bMjBweF1cIj5cclxuICAgICAgICAgICAgICA8cD57dChcInZhbGlkYXRpb24tYWxlcnQtMVwiKX08L3A+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoLVsxcHhdIGJnLVsjOWY5ZjlmXSB3LWZ1bGwgbXktWzE1cHhdXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0VmFsaWRhdGVBbGVydChmYWxzZSl9XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm9wLWJ0biBvcC1idG4tZ2hvc3RcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt0KFwiY2xvc2VcIil9XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9Nb2RhbFVpPlxyXG4gICAgICAgICAgPERvd25sb2FkUGRmWmlwXHJcbiAgICAgICAgICAgIHNldElzRG93bmxvYWRNb2RhbD17c2V0SXNEb3dubG9hZE1vZGFsfVxyXG4gICAgICAgICAgICBpc0Rvd25sb2FkTW9kYWw9e2lzRG93bmxvYWRNb2RhbH1cclxuICAgICAgICAgICAgcGRmRGV0YWlscz17cGRmRGV0YWlsc31cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC8+XHJcbiAgICAgICl9XHJcbiAgICA8L0RuZFByb3ZpZGVyPlxyXG4gICk7XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgUGRmUmVxdWVzdEZpbGVzO1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcblxyXG5jb25zdCBBbGVydCA9ICh7IGNoaWxkcmVuLCB0eXBlLCBjbGFzc05hbWUgfSkgPT4ge1xyXG4gIGNvbnN0IHRleHRjb2xvciA9IHR5cGUgPyB0aGVtZSh0eXBlKSA6IHRoZW1lKCk7XHJcbiAgZnVuY3Rpb24gdGhlbWUoY29sb3IpIHtcclxuICAgIHN3aXRjaCAoY29sb3IpIHtcclxuICAgICAgY2FzZSBcInN1Y2Nlc3NcIjpcclxuICAgICAgICByZXR1cm4gXCJvcC1hbGVydC1zdWNjZXNzXCI7XHJcbiAgICAgIGNhc2UgXCJpbmZvXCI6XHJcbiAgICAgICAgcmV0dXJuIFwib3AtYWxlcnQtaW5mb1wiO1xyXG4gICAgICBjYXNlIFwiZGFuZ2VyXCI6XHJcbiAgICAgICAgcmV0dXJuIFwib3AtYWxlcnQtZXJyb3JcIjtcclxuICAgICAgY2FzZSBcIndhcm5pbmdcIjpcclxuICAgICAgICByZXR1cm4gXCJvcC1hbGVydC13YXJuaW5nXCI7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiAoXHJcbiAgICBjaGlsZHJlbiAmJiAoXHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzc05hbWU9e2Ake1xyXG4gICAgICAgICAgY2xhc3NOYW1lXHJcbiAgICAgICAgICAgID8gY2xhc3NOYW1lXHJcbiAgICAgICAgICAgIDogXCJ6LVsxMDAwXSBmaXhlZCB0b3AtMjAgbGVmdC0xLzIgdHJhbnNmb3JtIC10cmFuc2xhdGUteC0xLzIgdGV4dC1zbVwiXHJcbiAgICAgICAgfSAgYH1cclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgb3AtYWxlcnQgJHt0ZXh0Y29sb3J9YH0+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtbC0zXCI+e2NoaWxkcmVufTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICApXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFsZXJ0O1xyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcblxyXG5jb25zdCBMb2FkZXIgPSAoKSA9PiB7XHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwib3AtbG9hZGluZyBvcC1sb2FkaW5nLWluZmluaXR5IHctWzRyZW1dIHRleHQtbmV1dHJhbFwiPjwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMb2FkZXI7XHJcbiIsImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcclxuXHJcbmNvbnN0IE1vZGFsVWkgPSAoe1xyXG4gIGNoaWxkcmVuLFxyXG4gIHRpdGxlLFxyXG4gIGlzT3BlbixcclxuICBoYW5kbGVDbG9zZSxcclxuICBzaG93SGVhZGVyID0gdHJ1ZSxcclxuICBzaG93Q2xvc2UgPSB0cnVlLFxyXG4gIHJlZHVjZVdpZHRoXHJcbn0pID0+IHtcclxuICBjb25zdCB3aWR0aCA9IHJlZHVjZVdpZHRoO1xyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICB7aXNPcGVuICYmIChcclxuICAgICAgICA8ZGlhbG9nIGNsYXNzTmFtZT1cIm9wLW1vZGFsIG9wLW1vZGFsLW9wZW5cIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtcclxuICAgICAgICAgICAgICB3aWR0aCB8fCBcIm1kOm1pbi13LVs1MDBweF1cIlxyXG4gICAgICAgICAgICB9IG9wLW1vZGFsLWJveCBwLTAgbWF4LWgtOTAgb3ZlcmZsb3cteS1hdXRvIGhpZGUtc2Nyb2xsYmFyIHRleHQtc21gfVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7c2hvd0hlYWRlciAmJiAoXHJcbiAgICAgICAgICAgICAgPD5cclxuICAgICAgICAgICAgICAgIHt0aXRsZSAmJiAoXHJcbiAgICAgICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UtY29udGVudCBmb250LWJvbGQgdGV4dC1sZyBwdC1bMTVweF0gcHgtWzIwcHhdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3RpdGxlfVxyXG4gICAgICAgICAgICAgICAgICA8L2gzPlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICAgIHtzaG93Q2xvc2UgJiYgKFxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3AtYnRuIG9wLWJ0bi1zbSBvcC1idG4tY2lyY2xlIG9wLWJ0bi1naG9zdCB0ZXh0LWJhc2UtY29udGVudCBhYnNvbHV0ZSByaWdodC0yIHRvcC0yXCJcclxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVDbG9zZSAmJiBoYW5kbGVDbG9zZSgpfVxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAg4pyVXHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgICA8Lz5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICAgICAgPGRpdj57Y2hpbGRyZW59PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2RpYWxvZz5cclxuICAgICAgKX1cclxuICAgIDwvPlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNb2RhbFVpO1xyXG4iLCJpbXBvcnQgeyBjcmVhdGVTbGljZSB9IGZyb20gXCJAcmVkdXhqcy90b29sa2l0XCI7XHJcblxyXG5jb25zdCBzaG93VGVuYW50U2xpY2UgPSBjcmVhdGVTbGljZSh7XHJcbiAgbmFtZTogXCJzaG93VGVuYW50XCIsXHJcbiAgaW5pdGlhbFN0YXRlOiBcIlwiLFxyXG4gIHJlZHVjZXJzOiB7XHJcbiAgICBzaG93VGVuYW50OiAoc3RhdGUsIGFjdGlvbikgPT4ge1xyXG4gICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XHJcbiAgICB9LFxyXG4gIH0sXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHsgc2hvd1RlbmFudCB9ID0gc2hvd1RlbmFudFNsaWNlLmFjdGlvbnM7XHJcbmV4cG9ydCBkZWZhdWx0IHNob3dUZW5hbnRTbGljZS5yZWR1Y2VyOyIsImltcG9ydCB7IGNyZWF0ZVNsaWNlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcclxuXHJcbmNvbnN0IHRvdXJTdGVwU2xpY2UgPSBjcmVhdGVTbGljZSh7XHJcbiAgbmFtZTogXCJ0b3VyU3RlcFwiLFxyXG4gIGluaXRpYWxTdGF0ZTogW10sXHJcbiAgcmVkdWNlcnM6IHtcclxuICAgIHNhdmVUb3VyU3RlcHM6IChzdGF0ZSwgYWN0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcclxuICAgIH0sXHJcbiAgICByZW1vdmVUb3VyU3RlcHM6ICgpID0+IHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gIH1cclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgeyBzYXZlVG91clN0ZXBzLCByZW1vdmVUb3VyU3RlcHMgfSA9IHRvdXJTdGVwU2xpY2UuYWN0aW9ucztcclxuZXhwb3J0IGRlZmF1bHQgdG91clN0ZXBTbGljZS5yZWR1Y2VyO1xyXG4iLCJpbXBvcnQgeyBjcmVhdGVTbGljZSB9IGZyb20gXCJAcmVkdXhqcy90b29sa2l0XCI7XHJcbmltcG9ydCB7IGFwcEluZm8gfSBmcm9tIFwiLi4vLi4vY29uc3RhbnQvYXBwaW5mb1wiO1xyXG5cclxuY29uc3QgaW5mb1NsaWNlID0gY3JlYXRlU2xpY2Uoe1xyXG4gIG5hbWU6IFwiaW5mb1wiLFxyXG4gIGluaXRpYWxTdGF0ZToge30sXHJcbiAgcmVkdWNlcnM6IHtcclxuICAgIGZldGNoQXBwSW5mbzogKCkgPT4ge1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImJhc2VVcmxcIiwgYCR7YXBwSW5mby5iYXNlVXJsfS9gKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJwYXJzZUFwcElkXCIsIGFwcEluZm8uYXBwSWQpO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImFwcExvZ29cIiwgYXBwSW5mby5hcHBsb2dvKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJ1c2VyU2V0dGluZ3NcIik7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidXNlclNldHRpbmdzXCIsIEpTT04uc3RyaW5naWZ5KGFwcEluZm8uc2V0dGluZ3MpKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJmZXZfSWNvblwiLCBhcHBJbmZvLmZldl9JY29uKTtcclxuICAgICAgcmV0dXJuIGFwcEluZm87XHJcbiAgICB9XHJcbiAgfVxyXG59KTtcclxuZXhwb3J0IGNvbnN0IHsgZmV0Y2hBcHBJbmZvIH0gPSBpbmZvU2xpY2UuYWN0aW9ucztcclxuZXhwb3J0IGRlZmF1bHQgaW5mb1NsaWNlLnJlZHVjZXI7XHJcbiIsImltcG9ydCB7IGNyZWF0ZVNsaWNlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcclxuXHJcbmNvbnN0IHNob3dIZWFkZXJTbGljZSA9IGNyZWF0ZVNsaWNlKHtcclxuICBuYW1lOiBcInNob3dUZW5hbnRcIixcclxuICBpbml0aWFsU3RhdGU6IFwiXCIsXHJcbiAgcmVkdWNlcnM6IHtcclxuICAgIHNob3dIZWFkZXI6IChzdGF0ZSwgYWN0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiBhY3Rpb24ucGF5bG9hZDtcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHsgc2hvd0hlYWRlciB9ID0gc2hvd0hlYWRlclNsaWNlLmFjdGlvbnM7XHJcbmV4cG9ydCBkZWZhdWx0IHNob3dIZWFkZXJTbGljZS5yZWR1Y2VyO1xyXG4iLCIvLyBpbXBvcnQgeyBjcmVhdGVTdG9yZSwgYXBwbHlNaWRkbGV3YXJlIH0gZnJvbSBcInJlZHV4XCI7XHJcbi8vIGltcG9ydCB0aHVuayBmcm9tIFwicmVkdXgtdGh1bmtcIjtcclxuLy8gaW1wb3J0IHJlZHVjZXJzIGZyb20gXCIuL3JlZHVjZXJzXCI7XHJcblxyXG4vLyBleHBvcnQgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShyZWR1Y2VycywgYXBwbHlNaWRkbGV3YXJlKHRodW5rKSk7XHJcbmltcG9ydCB7IGNvbmZpZ3VyZVN0b3JlIH0gZnJvbSBcIkByZWR1eGpzL3Rvb2xraXRcIjtcclxuaW1wb3J0IGluZm9SZWR1Y2VyIGZyb20gXCIuL3JlZHVjZXJzL2luZm9SZWR1Y2VyXCI7XHJcbmltcG9ydCBTaG93VGVuYW50IGZyb20gXCIuL3JlZHVjZXJzL1Nob3dUZW5hbnRcIjtcclxuaW1wb3J0IFRvdXJTdGVwc1JlZHVjZXIgZnJvbSBcIi4vcmVkdWNlcnMvVG91clN0ZXBzUmVkdWNlclwiO1xyXG5pbXBvcnQgc2hvd0hlYWRlciBmcm9tIFwiLi9yZWR1Y2Vycy9zaG93SGVhZGVyXCI7XHJcbmV4cG9ydCBjb25zdCBzdG9yZSA9IGNvbmZpZ3VyZVN0b3JlKHtcclxuICByZWR1Y2VyOiB7XHJcbiAgICBhcHBJbmZvOiBpbmZvUmVkdWNlcixcclxuICAgIFRvdXJTdGVwczogVG91clN0ZXBzUmVkdWNlcixcclxuICAgIFNob3dUZW5hbnQsXHJcbiAgICBzaG93SGVhZGVyXHJcbiAgfVxyXG59KTtcclxuIiwiaW1wb3J0IGkxOG4gZnJvbSBcImkxOG5leHRcIjtcclxuaW1wb3J0IHsgaW5pdFJlYWN0STE4bmV4dCB9IGZyb20gXCJyZWFjdC1pMThuZXh0XCI7XHJcbmltcG9ydCBMYW5ndWFnZURldGVjdG9yIGZyb20gXCJpMThuZXh0LWJyb3dzZXItbGFuZ3VhZ2VkZXRlY3RvclwiO1xyXG5pbXBvcnQgZW4gZnJvbSBcIi4vbG9jYWxlcy9lbi90cmFuc2xhdGlvbi5qc29uXCI7XHJcbmltcG9ydCBmciBmcm9tIFwiLi9sb2NhbGVzL2ZyL3RyYW5zbGF0aW9uLmpzb25cIjtcclxuXHJcbmkxOG5cclxuICAudXNlKExhbmd1YWdlRGV0ZWN0b3IpXHJcbiAgLnVzZShpbml0UmVhY3RJMThuZXh0KVxyXG4gIC5pbml0KHtcclxuICAgIHJlc291cmNlczoge1xyXG4gICAgICBlbjoge1xyXG4gICAgICAgIHRyYW5zbGF0aW9uOiBlblxyXG4gICAgICB9LFxyXG4gICAgICBmcjoge1xyXG4gICAgICAgIHRyYW5zbGF0aW9uOiBmclxyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGZhbGxiYWNrTG5nOiBcImVuXCIsIC8vIGZhbGxiYWNrIGxhbmd1YWdlXHJcbiAgICBkZXRlY3Rpb246IHtcclxuICAgICAgLy8gU3BlY2lmaWVzIHRoZSBkZWZhdWx0IGxhbmd1YWdlIHRvIGZhbGwgYmFjayB0byBpZiB0aGUgZGV0ZWN0ZWQgbGFuZ3VhZ2UgaXMgbm90IGF2YWlsYWJsZS5cclxuICAgICAgb3JkZXI6IFtcImxvY2FsU3RvcmFnZVwiLCBcIm5hdmlnYXRvclwiXVxyXG4gICAgICAvLyBEZWZpbmVzIHdoZXJlIHRoZSBkZXRlY3RlZCBsYW5ndWFnZSBzaG91bGQgYmUgY2FjaGVkLlxyXG4gICAgfSxcclxuICAgIGRlYnVnOiBmYWxzZSxcclxuICAgIGludGVycG9sYXRpb246IHtcclxuICAgICAgZXNjYXBlVmFsdWU6IGZhbHNlIC8vIFJlYWN0IGFscmVhZHkgZG9lcyBlc2NhcGluZ1xyXG4gICAgfSxcclxuICAgIHdoaXRlbGlzdDogW1wiZW5cIiwgXCJmclwiXSAvLyBMaXN0IG9mIGFsbG93ZWQgbGFuZ3VhZ2VzXHJcbiAgfSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBpMThuO1xyXG4iLCJmdW5jdGlvbiByKGUpe3ZhciBvLHQsZj1cIlwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZSlmKz1lO2Vsc2UgaWYoXCJvYmplY3RcIj09dHlwZW9mIGUpaWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIG49ZS5sZW5ndGg7Zm9yKG89MDtvPG47bysrKWVbb10mJih0PXIoZVtvXSkpJiYoZiYmKGYrPVwiIFwiKSxmKz10KX1lbHNlIGZvcih0IGluIGUpZVt0XSYmKGYmJihmKz1cIiBcIiksZis9dCk7cmV0dXJuIGZ9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgZSxvLHQ9MCxmPVwiXCIsbj1hcmd1bWVudHMubGVuZ3RoO3Q8bjt0KyspKGU9YXJndW1lbnRzW3RdKSYmKG89cihlKSkmJihmJiYoZis9XCIgXCIpLGYrPW8pO3JldHVybiBmfW1vZHVsZS5leHBvcnRzPWUsbW9kdWxlLmV4cG9ydHMuY2xzeD1lOyIsInZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciB0b0NsYXNzTmFtZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKVxuICAgICAgICBzdHIgKz0gdmFsO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHZhciB0bXAgPSB2b2lkIDA7XG4gICAgICAgIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIHZhciBsID0gdmFsLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICAgICAgICAgIHRtcCA9IHRvQ2xhc3NOYW1lKHZhbFtpKytdKTtcbiAgICAgICAgICAgICAgICBpZiAodG1wKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IHRtcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgICAgICAgICBmb3IgKHRtcCBpbiB2YWwpIHtcbiAgICAgICAgICAgICAgICBpZiAodG1wICYmIHZhbFt0bXBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IHRtcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn07XG5leHBvcnQgZnVuY3Rpb24gY25iKCkge1xuICAgIHZhciBsID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIG47XG4gICAgdmFyIHRtcDtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgd2hpbGUgKGkgPCBsKSB7XG4gICAgICAgIG4gPSBhcmd1bWVudHNbaSsrXTtcbiAgICAgICAgaWYgKG4pIHtcbiAgICAgICAgICAgIHRtcCA9IHRvQ2xhc3NOYW1lKG4pO1xuICAgICAgICAgICAgaWYgKHRtcCkge1xuICAgICAgICAgICAgICAgIGlmIChzdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyICs9IHRtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuIiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2VuYy1iYXNlNjRcIiksIHJlcXVpcmUoXCIuL21kNVwiKSwgcmVxdWlyZShcIi4vZXZwa2RmXCIpLCByZXF1aXJlKFwiLi9jaXBoZXItY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9lbmMtYmFzZTY0XCIsIFwiLi9tZDVcIiwgXCIuL2V2cGtkZlwiLCBcIi4vY2lwaGVyLWNvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCbG9ja0NpcGhlciA9IENfbGliLkJsb2NrQ2lwaGVyO1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgLy8gTG9va3VwIHRhYmxlc1xuXHQgICAgdmFyIFNCT1ggPSBbXTtcblx0ICAgIHZhciBJTlZfU0JPWCA9IFtdO1xuXHQgICAgdmFyIFNVQl9NSVhfMCA9IFtdO1xuXHQgICAgdmFyIFNVQl9NSVhfMSA9IFtdO1xuXHQgICAgdmFyIFNVQl9NSVhfMiA9IFtdO1xuXHQgICAgdmFyIFNVQl9NSVhfMyA9IFtdO1xuXHQgICAgdmFyIElOVl9TVUJfTUlYXzAgPSBbXTtcblx0ICAgIHZhciBJTlZfU1VCX01JWF8xID0gW107XG5cdCAgICB2YXIgSU5WX1NVQl9NSVhfMiA9IFtdO1xuXHQgICAgdmFyIElOVl9TVUJfTUlYXzMgPSBbXTtcblxuXHQgICAgLy8gQ29tcHV0ZSBsb29rdXAgdGFibGVzXG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8vIENvbXB1dGUgZG91YmxlIHRhYmxlXG5cdCAgICAgICAgdmFyIGQgPSBbXTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG5cdCAgICAgICAgICAgIGlmIChpIDwgMTI4KSB7XG5cdCAgICAgICAgICAgICAgICBkW2ldID0gaSA8PCAxO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgZFtpXSA9IChpIDw8IDEpIF4gMHgxMWI7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICAvLyBXYWxrIEdGKDJeOClcblx0ICAgICAgICB2YXIgeCA9IDA7XG5cdCAgICAgICAgdmFyIHhpID0gMDtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgc2JveFxuXHQgICAgICAgICAgICB2YXIgc3ggPSB4aSBeICh4aSA8PCAxKSBeICh4aSA8PCAyKSBeICh4aSA8PCAzKSBeICh4aSA8PCA0KTtcblx0ICAgICAgICAgICAgc3ggPSAoc3ggPj4+IDgpIF4gKHN4ICYgMHhmZikgXiAweDYzO1xuXHQgICAgICAgICAgICBTQk9YW3hdID0gc3g7XG5cdCAgICAgICAgICAgIElOVl9TQk9YW3N4XSA9IHg7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBtdWx0aXBsaWNhdGlvblxuXHQgICAgICAgICAgICB2YXIgeDIgPSBkW3hdO1xuXHQgICAgICAgICAgICB2YXIgeDQgPSBkW3gyXTtcblx0ICAgICAgICAgICAgdmFyIHg4ID0gZFt4NF07XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBzdWIgYnl0ZXMsIG1peCBjb2x1bW5zIHRhYmxlc1xuXHQgICAgICAgICAgICB2YXIgdCA9IChkW3N4XSAqIDB4MTAxKSBeIChzeCAqIDB4MTAxMDEwMCk7XG5cdCAgICAgICAgICAgIFNVQl9NSVhfMFt4XSA9ICh0IDw8IDI0KSB8ICh0ID4+PiA4KTtcblx0ICAgICAgICAgICAgU1VCX01JWF8xW3hdID0gKHQgPDwgMTYpIHwgKHQgPj4+IDE2KTtcblx0ICAgICAgICAgICAgU1VCX01JWF8yW3hdID0gKHQgPDwgOCkgIHwgKHQgPj4+IDI0KTtcblx0ICAgICAgICAgICAgU1VCX01JWF8zW3hdID0gdDtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIGludiBzdWIgYnl0ZXMsIGludiBtaXggY29sdW1ucyB0YWJsZXNcblx0ICAgICAgICAgICAgdmFyIHQgPSAoeDggKiAweDEwMTAxMDEpIF4gKHg0ICogMHgxMDAwMSkgXiAoeDIgKiAweDEwMSkgXiAoeCAqIDB4MTAxMDEwMCk7XG5cdCAgICAgICAgICAgIElOVl9TVUJfTUlYXzBbc3hdID0gKHQgPDwgMjQpIHwgKHQgPj4+IDgpO1xuXHQgICAgICAgICAgICBJTlZfU1VCX01JWF8xW3N4XSA9ICh0IDw8IDE2KSB8ICh0ID4+PiAxNik7XG5cdCAgICAgICAgICAgIElOVl9TVUJfTUlYXzJbc3hdID0gKHQgPDwgOCkgIHwgKHQgPj4+IDI0KTtcblx0ICAgICAgICAgICAgSU5WX1NVQl9NSVhfM1tzeF0gPSB0O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgbmV4dCBjb3VudGVyXG5cdCAgICAgICAgICAgIGlmICgheCkge1xuXHQgICAgICAgICAgICAgICAgeCA9IHhpID0gMTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHggPSB4MiBeIGRbZFtkW3g4IF4geDJdXV07XG5cdCAgICAgICAgICAgICAgICB4aSBePSBkW2RbeGldXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0oKSk7XG5cblx0ICAgIC8vIFByZWNvbXB1dGVkIFJjb24gbG9va3VwXG5cdCAgICB2YXIgUkNPTiA9IFsweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweDFiLCAweDM2XTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBRVMgYmxvY2sgY2lwaGVyIGFsZ29yaXRobS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEFFUyA9IENfYWxnby5BRVMgPSBCbG9ja0NpcGhlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciB0O1xuXG5cdCAgICAgICAgICAgIC8vIFNraXAgcmVzZXQgb2YgblJvdW5kcyBoYXMgYmVlbiBzZXQgYmVmb3JlIGFuZCBrZXkgZGlkIG5vdCBjaGFuZ2Vcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX25Sb3VuZHMgJiYgdGhpcy5fa2V5UHJpb3JSZXNldCA9PT0gdGhpcy5fa2V5KSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGtleSA9IHRoaXMuX2tleVByaW9yUmVzZXQgPSB0aGlzLl9rZXk7XG5cdCAgICAgICAgICAgIHZhciBrZXlXb3JkcyA9IGtleS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIGtleVNpemUgPSBrZXkuc2lnQnl0ZXMgLyA0O1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgbnVtYmVyIG9mIHJvdW5kc1xuXHQgICAgICAgICAgICB2YXIgblJvdW5kcyA9IHRoaXMuX25Sb3VuZHMgPSBrZXlTaXplICsgNjtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIG51bWJlciBvZiBrZXkgc2NoZWR1bGUgcm93c1xuXHQgICAgICAgICAgICB2YXIga3NSb3dzID0gKG5Sb3VuZHMgKyAxKSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0ZSBrZXkgc2NoZWR1bGVcblx0ICAgICAgICAgICAgdmFyIGtleVNjaGVkdWxlID0gdGhpcy5fa2V5U2NoZWR1bGUgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIga3NSb3cgPSAwOyBrc1JvdyA8IGtzUm93czsga3NSb3crKykge1xuXHQgICAgICAgICAgICAgICAgaWYgKGtzUm93IDwga2V5U2l6ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGtleVNjaGVkdWxlW2tzUm93XSA9IGtleVdvcmRzW2tzUm93XTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCA9IGtleVNjaGVkdWxlW2tzUm93IC0gMV07XG5cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIShrc1JvdyAlIGtleVNpemUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJvdCB3b3JkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAodCA8PCA4KSB8ICh0ID4+PiAyNCk7XG5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ViIHdvcmRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdCA9IChTQk9YW3QgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsodCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHQgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3QgJiAweGZmXTtcblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaXggUmNvblxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0IF49IFJDT05bKGtzUm93IC8ga2V5U2l6ZSkgfCAwXSA8PCAyNDtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleVNpemUgPiA2ICYmIGtzUm93ICUga2V5U2l6ZSA9PSA0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YiB3b3JkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoU0JPWFt0ID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHQgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyh0ID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFt0ICYgMHhmZl07XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAgICAga2V5U2NoZWR1bGVba3NSb3ddID0ga2V5U2NoZWR1bGVba3NSb3cgLSBrZXlTaXplXSBeIHQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDb21wdXRlIGludiBrZXkgc2NoZWR1bGVcblx0ICAgICAgICAgICAgdmFyIGludktleVNjaGVkdWxlID0gdGhpcy5faW52S2V5U2NoZWR1bGUgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaW52S3NSb3cgPSAwOyBpbnZLc1JvdyA8IGtzUm93czsgaW52S3NSb3crKykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtzUm93ID0ga3NSb3dzIC0gaW52S3NSb3c7XG5cblx0ICAgICAgICAgICAgICAgIGlmIChpbnZLc1JvdyAlIDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGtleVNjaGVkdWxlW2tzUm93XTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBrZXlTY2hlZHVsZVtrc1JvdyAtIDRdO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBpZiAoaW52S3NSb3cgPCA0IHx8IGtzUm93IDw9IDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpbnZLZXlTY2hlZHVsZVtpbnZLc1Jvd10gPSB0O1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBpbnZLZXlTY2hlZHVsZVtpbnZLc1Jvd10gPSBJTlZfU1VCX01JWF8wW1NCT1hbdCA+Pj4gMjRdXSBeIElOVl9TVUJfTUlYXzFbU0JPWFsodCA+Pj4gMTYpICYgMHhmZl1dIF5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZfU1VCX01JWF8yW1NCT1hbKHQgPj4+IDgpICYgMHhmZl1dIF4gSU5WX1NVQl9NSVhfM1tTQk9YW3QgJiAweGZmXV07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgZW5jcnlwdEJsb2NrOiBmdW5jdGlvbiAoTSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2RvQ3J5cHRCbG9jayhNLCBvZmZzZXQsIHRoaXMuX2tleVNjaGVkdWxlLCBTVUJfTUlYXzAsIFNVQl9NSVhfMSwgU1VCX01JWF8yLCBTVUJfTUlYXzMsIFNCT1gpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBkZWNyeXB0QmxvY2s6IGZ1bmN0aW9uIChNLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgLy8gU3dhcCAybmQgYW5kIDR0aCByb3dzXG5cdCAgICAgICAgICAgIHZhciB0ID0gTVtvZmZzZXQgKyAxXTtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAxXSA9IE1bb2Zmc2V0ICsgM107XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgM10gPSB0O1xuXG5cdCAgICAgICAgICAgIHRoaXMuX2RvQ3J5cHRCbG9jayhNLCBvZmZzZXQsIHRoaXMuX2ludktleVNjaGVkdWxlLCBJTlZfU1VCX01JWF8wLCBJTlZfU1VCX01JWF8xLCBJTlZfU1VCX01JWF8yLCBJTlZfU1VCX01JWF8zLCBJTlZfU0JPWCk7XG5cblx0ICAgICAgICAgICAgLy8gSW52IHN3YXAgMm5kIGFuZCA0dGggcm93c1xuXHQgICAgICAgICAgICB2YXIgdCA9IE1bb2Zmc2V0ICsgMV07XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMV0gPSBNW29mZnNldCArIDNdO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDNdID0gdDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvQ3J5cHRCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCwga2V5U2NoZWR1bGUsIFNVQl9NSVhfMCwgU1VCX01JWF8xLCBTVUJfTUlYXzIsIFNVQl9NSVhfMywgU0JPWCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgblJvdW5kcyA9IHRoaXMuX25Sb3VuZHM7XG5cblx0ICAgICAgICAgICAgLy8gR2V0IGlucHV0LCBhZGQgcm91bmQga2V5XG5cdCAgICAgICAgICAgIHZhciBzMCA9IE1bb2Zmc2V0XSAgICAgXiBrZXlTY2hlZHVsZVswXTtcblx0ICAgICAgICAgICAgdmFyIHMxID0gTVtvZmZzZXQgKyAxXSBeIGtleVNjaGVkdWxlWzFdO1xuXHQgICAgICAgICAgICB2YXIgczIgPSBNW29mZnNldCArIDJdIF4ga2V5U2NoZWR1bGVbMl07XG5cdCAgICAgICAgICAgIHZhciBzMyA9IE1bb2Zmc2V0ICsgM10gXiBrZXlTY2hlZHVsZVszXTtcblxuXHQgICAgICAgICAgICAvLyBLZXkgc2NoZWR1bGUgcm93IGNvdW50ZXJcblx0ICAgICAgICAgICAgdmFyIGtzUm93ID0gNDtcblxuXHQgICAgICAgICAgICAvLyBSb3VuZHNcblx0ICAgICAgICAgICAgZm9yICh2YXIgcm91bmQgPSAxOyByb3VuZCA8IG5Sb3VuZHM7IHJvdW5kKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNoaWZ0IHJvd3MsIHN1YiBieXRlcywgbWl4IGNvbHVtbnMsIGFkZCByb3VuZCBrZXlcblx0ICAgICAgICAgICAgICAgIHZhciB0MCA9IFNVQl9NSVhfMFtzMCA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMSA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMyID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MzICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MSA9IFNVQl9NSVhfMFtzMSA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMiA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMzID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MwICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MiA9IFNVQl9NSVhfMFtzMiA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMyA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMwID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MxICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgICAgIHZhciB0MyA9IFNVQl9NSVhfMFtzMyA+Pj4gMjRdIF4gU1VCX01JWF8xWyhzMCA+Pj4gMTYpICYgMHhmZl0gXiBTVUJfTUlYXzJbKHMxID4+PiA4KSAmIDB4ZmZdIF4gU1VCX01JWF8zW3MyICYgMHhmZl0gXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblxuXHQgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHN0YXRlXG5cdCAgICAgICAgICAgICAgICBzMCA9IHQwO1xuXHQgICAgICAgICAgICAgICAgczEgPSB0MTtcblx0ICAgICAgICAgICAgICAgIHMyID0gdDI7XG5cdCAgICAgICAgICAgICAgICBzMyA9IHQzO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gU2hpZnQgcm93cywgc3ViIGJ5dGVzLCBhZGQgcm91bmQga2V5XG5cdCAgICAgICAgICAgIHZhciB0MCA9ICgoU0JPWFtzMCA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMSA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMyID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMyAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXHQgICAgICAgICAgICB2YXIgdDEgPSAoKFNCT1hbczEgPj4+IDI0XSA8PCAyNCkgfCAoU0JPWFsoczIgPj4+IDE2KSAmIDB4ZmZdIDw8IDE2KSB8IChTQk9YWyhzMyA+Pj4gOCkgJiAweGZmXSA8PCA4KSB8IFNCT1hbczAgJiAweGZmXSkgXiBrZXlTY2hlZHVsZVtrc1JvdysrXTtcblx0ICAgICAgICAgICAgdmFyIHQyID0gKChTQk9YW3MyID4+PiAyNF0gPDwgMjQpIHwgKFNCT1hbKHMzID4+PiAxNikgJiAweGZmXSA8PCAxNikgfCAoU0JPWFsoczAgPj4+IDgpICYgMHhmZl0gPDwgOCkgfCBTQk9YW3MxICYgMHhmZl0pIF4ga2V5U2NoZWR1bGVba3NSb3crK107XG5cdCAgICAgICAgICAgIHZhciB0MyA9ICgoU0JPWFtzMyA+Pj4gMjRdIDw8IDI0KSB8IChTQk9YWyhzMCA+Pj4gMTYpICYgMHhmZl0gPDwgMTYpIHwgKFNCT1hbKHMxID4+PiA4KSAmIDB4ZmZdIDw8IDgpIHwgU0JPWFtzMiAmIDB4ZmZdKSBeIGtleVNjaGVkdWxlW2tzUm93KytdO1xuXG5cdCAgICAgICAgICAgIC8vIFNldCBvdXRwdXRcblx0ICAgICAgICAgICAgTVtvZmZzZXRdICAgICA9IHQwO1xuXHQgICAgICAgICAgICBNW29mZnNldCArIDFdID0gdDE7XG5cdCAgICAgICAgICAgIE1bb2Zmc2V0ICsgMl0gPSB0Mjtcblx0ICAgICAgICAgICAgTVtvZmZzZXQgKyAzXSA9IHQzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBrZXlTaXplOiAyNTYvMzJcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9ucyB0byB0aGUgY2lwaGVyJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgY2lwaGVydGV4dCA9IENyeXB0b0pTLkFFUy5lbmNyeXB0KG1lc3NhZ2UsIGtleSwgY2ZnKTtcblx0ICAgICAqICAgICB2YXIgcGxhaW50ZXh0ICA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KGNpcGhlcnRleHQsIGtleSwgY2ZnKTtcblx0ICAgICAqL1xuXHQgICAgQy5BRVMgPSBCbG9ja0NpcGhlci5fY3JlYXRlSGVscGVyKEFFUyk7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuQUVTO1xuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSwgdW5kZWYpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG5cdFx0Ly8gQ29tbW9uSlNcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCIuL2NvcmVcIiksIHJlcXVpcmUoXCIuL2V2cGtkZlwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9ldnBrZGZcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdC8qKlxuXHQgKiBDaXBoZXIgY29yZSBjb21wb25lbnRzLlxuXHQgKi9cblx0Q3J5cHRvSlMubGliLkNpcGhlciB8fCAoZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBDX2xpYi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtO1xuXHQgICAgdmFyIENfZW5jID0gQy5lbmM7XG5cdCAgICB2YXIgVXRmOCA9IENfZW5jLlV0Zjg7XG5cdCAgICB2YXIgQmFzZTY0ID0gQ19lbmMuQmFzZTY0O1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblx0ICAgIHZhciBFdnBLREYgPSBDX2FsZ28uRXZwS0RGO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJhc2UgY2lwaGVyIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBrZXlTaXplIFRoaXMgY2lwaGVyJ3Mga2V5IHNpemUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGl2U2l6ZSBUaGlzIGNpcGhlcidzIElWIHNpemUuIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IF9FTkNfWEZPUk1fTU9ERSBBIGNvbnN0YW50IHJlcHJlc2VudGluZyBlbmNyeXB0aW9uIG1vZGUuXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gX0RFQ19YRk9STV9NT0RFIEEgY29uc3RhbnQgcmVwcmVzZW50aW5nIGRlY3J5cHRpb24gbW9kZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENpcGhlciA9IENfbGliLkNpcGhlciA9IEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gaXYgVGhlIElWIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCgpLFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyB0aGlzIGNpcGhlciBpbiBlbmNyeXB0aW9uIG1vZGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlcn0gQSBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXIgPSBDcnlwdG9KUy5hbGdvLkFFUy5jcmVhdGVFbmNyeXB0b3Ioa2V5V29yZEFycmF5LCB7IGl2OiBpdldvcmRBcnJheSB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjcmVhdGVFbmNyeXB0b3I6IGZ1bmN0aW9uIChrZXksIGNmZykge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fRU5DX1hGT1JNX01PREUsIGtleSwgY2ZnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyB0aGlzIGNpcGhlciBpbiBkZWNyeXB0aW9uIG1vZGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlcn0gQSBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXIgPSBDcnlwdG9KUy5hbGdvLkFFUy5jcmVhdGVEZWNyeXB0b3Ioa2V5V29yZEFycmF5LCB7IGl2OiBpdldvcmRBcnJheSB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjcmVhdGVEZWNyeXB0b3I6IGZ1bmN0aW9uIChrZXksIGNmZykge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5fREVDX1hGT1JNX01PREUsIGtleSwgY2ZnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIGNpcGhlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4Zm9ybU1vZGUgRWl0aGVyIHRoZSBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24gdHJhbnNvcm1hdGlvbiBtb2RlIGNvbnN0YW50LlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVyID0gQ3J5cHRvSlMuYWxnby5BRVMuY3JlYXRlKENyeXB0b0pTLmFsZ28uQUVTLl9FTkNfWEZPUk1fTU9ERSwga2V5V29yZEFycmF5LCB7IGl2OiBpdldvcmRBcnJheSB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBpbml0OiBmdW5jdGlvbiAoeGZvcm1Nb2RlLCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBTdG9yZSB0cmFuc2Zvcm0gbW9kZSBhbmQga2V5XG5cdCAgICAgICAgICAgIHRoaXMuX3hmb3JtTW9kZSA9IHhmb3JtTW9kZTtcblx0ICAgICAgICAgICAgdGhpcy5fa2V5ID0ga2V5O1xuXG5cdCAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlc1xuXHQgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIGNpcGhlciB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgY2lwaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gUmVzZXQgZGF0YSBidWZmZXJcblx0ICAgICAgICAgICAgQnVmZmVyZWRCbG9ja0FsZ29yaXRobS5yZXNldC5jYWxsKHRoaXMpO1xuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtY2lwaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHRoaXMuX2RvUmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWRkcyBkYXRhIHRvIGJlIGVuY3J5cHRlZCBvciBkZWNyeXB0ZWQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGRhdGFVcGRhdGUgVGhlIGRhdGEgdG8gZW5jcnlwdCBvciBkZWNyeXB0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGF0YSBhZnRlciBwcm9jZXNzaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLnByb2Nlc3MoJ2RhdGEnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5wcm9jZXNzKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gKGRhdGFVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gQXBwZW5kXG5cdCAgICAgICAgICAgIHRoaXMuX2FwcGVuZChkYXRhVXBkYXRlKTtcblxuXHQgICAgICAgICAgICAvLyBQcm9jZXNzIGF2YWlsYWJsZSBibG9ja3Ncblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3MoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRmluYWxpemVzIHRoZSBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24gcHJvY2Vzcy5cblx0ICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIGZpbmFsaXplIG9wZXJhdGlvbiBpcyBlZmZlY3RpdmVseSBhIGRlc3RydWN0aXZlLCByZWFkLW9uY2Ugb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBkYXRhVXBkYXRlIFRoZSBmaW5hbCBkYXRhIHRvIGVuY3J5cHQgb3IgZGVjcnlwdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGRhdGEgYWZ0ZXIgZmluYWwgcHJvY2Vzc2luZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5maW5hbGl6ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgZW5jcnlwdGVkID0gY2lwaGVyLmZpbmFsaXplKCdkYXRhJyk7XG5cdCAgICAgICAgICogICAgIHZhciBlbmNyeXB0ZWQgPSBjaXBoZXIuZmluYWxpemUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKGRhdGFVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gRmluYWwgZGF0YSB1cGRhdGVcblx0ICAgICAgICAgICAgaWYgKGRhdGFVcGRhdGUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZChkYXRhVXBkYXRlKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtY2lwaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHZhciBmaW5hbFByb2Nlc3NlZERhdGEgPSB0aGlzLl9kb0ZpbmFsaXplKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZpbmFsUHJvY2Vzc2VkRGF0YTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAga2V5U2l6ZTogMTI4LzMyLFxuXG5cdCAgICAgICAgaXZTaXplOiAxMjgvMzIsXG5cblx0ICAgICAgICBfRU5DX1hGT1JNX01PREU6IDEsXG5cblx0ICAgICAgICBfREVDX1hGT1JNX01PREU6IDIsXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHNob3J0Y3V0IGZ1bmN0aW9ucyB0byBhIGNpcGhlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIFRoZSBjaXBoZXIgdG8gY3JlYXRlIGEgaGVscGVyIGZvci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IHdpdGggZW5jcnlwdCBhbmQgZGVjcnlwdCBzaG9ydGN1dCBmdW5jdGlvbnMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBBRVMgPSBDcnlwdG9KUy5saWIuQ2lwaGVyLl9jcmVhdGVIZWxwZXIoQ3J5cHRvSlMuYWxnby5BRVMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9jcmVhdGVIZWxwZXI6IChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIHNlbGVjdENpcGhlclN0cmF0ZWd5KGtleSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFzc3dvcmRCYXNlZENpcGhlcjtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlcmlhbGl6YWJsZUNpcGhlcjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoY2lwaGVyKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uIChtZXNzYWdlLCBrZXksIGNmZykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0Q2lwaGVyU3RyYXRlZ3koa2V5KS5lbmNyeXB0KGNpcGhlciwgbWVzc2FnZSwga2V5LCBjZmcpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgICAgICAgICBkZWNyeXB0OiBmdW5jdGlvbiAoY2lwaGVydGV4dCwga2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdENpcGhlclN0cmF0ZWd5KGtleSkuZGVjcnlwdChjaXBoZXIsIGNpcGhlcnRleHQsIGtleSwgY2ZnKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH0oKSlcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJhc2Ugc3RyZWFtIGNpcGhlciB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgY2lwaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiAxICgzMiBiaXRzKVxuXHQgICAgICovXG5cdCAgICB2YXIgU3RyZWFtQ2lwaGVyID0gQ19saWIuU3RyZWFtQ2lwaGVyID0gQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gUHJvY2VzcyBwYXJ0aWFsIGJsb2Nrc1xuXHQgICAgICAgICAgICB2YXIgZmluYWxQcm9jZXNzZWRCbG9ja3MgPSB0aGlzLl9wcm9jZXNzKCEhJ2ZsdXNoJyk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGZpbmFsUHJvY2Vzc2VkQmxvY2tzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDFcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIE1vZGUgbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19tb2RlID0gQy5tb2RlID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWJzdHJhY3QgYmFzZSBibG9jayBjaXBoZXIgbW9kZSB0ZW1wbGF0ZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEJsb2NrQ2lwaGVyTW9kZSA9IENfbGliLkJsb2NrQ2lwaGVyTW9kZSA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDcmVhdGVzIHRoaXMgbW9kZSBmb3IgZW5jcnlwdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgQSBibG9jayBjaXBoZXIgaW5zdGFuY2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gaXYgVGhlIElWIHdvcmRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgbW9kZSA9IENyeXB0b0pTLm1vZGUuQ0JDLmNyZWF0ZUVuY3J5cHRvcihjaXBoZXIsIGl2LndvcmRzKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjcmVhdGVFbmNyeXB0b3I6IGZ1bmN0aW9uIChjaXBoZXIsIGl2KSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLkVuY3J5cHRvci5jcmVhdGUoY2lwaGVyLCBpdik7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgdGhpcyBtb2RlIGZvciBkZWNyeXB0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBBIGJsb2NrIGNpcGhlciBpbnN0YW5jZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBpdiBUaGUgSVYgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBtb2RlID0gQ3J5cHRvSlMubW9kZS5DQkMuY3JlYXRlRGVjcnlwdG9yKGNpcGhlciwgaXYud29yZHMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNyZWF0ZURlY3J5cHRvcjogZnVuY3Rpb24gKGNpcGhlciwgaXYpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGVjcnlwdG9yLmNyZWF0ZShjaXBoZXIsIGl2KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIG1vZGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlcn0gY2lwaGVyIEEgYmxvY2sgY2lwaGVyIGluc3RhbmNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGl2IFRoZSBJViB3b3Jkcy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIG1vZGUgPSBDcnlwdG9KUy5tb2RlLkNCQy5FbmNyeXB0b3IuY3JlYXRlKGNpcGhlciwgaXYud29yZHMpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjaXBoZXIsIGl2KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2NpcGhlciA9IGNpcGhlcjtcblx0ICAgICAgICAgICAgdGhpcy5faXYgPSBpdjtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgbW9kZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENCQyA9IENfbW9kZS5DQkMgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEFic3RyYWN0IGJhc2UgQ0JDIG1vZGUuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdmFyIENCQyA9IEJsb2NrQ2lwaGVyTW9kZS5leHRlbmQoKTtcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENCQyBlbmNyeXB0b3IuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgQ0JDLkVuY3J5cHRvciA9IENCQy5leHRlbmQoe1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogUHJvY2Vzc2VzIHRoZSBkYXRhIGJsb2NrIGF0IG9mZnNldC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgVGhlIGRhdGEgd29yZHMgdG8gb3BlcmF0ZSBvbi5cblx0ICAgICAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCBUaGUgb2Zmc2V0IHdoZXJlIHRoZSBibG9jayBzdGFydHMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICBtb2RlLnByb2Nlc3NCbG9jayhkYXRhLndvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICB2YXIgY2lwaGVyID0gdGhpcy5fY2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFhPUiBhbmQgZW5jcnlwdFxuXHQgICAgICAgICAgICAgICAgeG9yQmxvY2suY2FsbCh0aGlzLCB3b3Jkcywgb2Zmc2V0LCBibG9ja1NpemUpO1xuXHQgICAgICAgICAgICAgICAgY2lwaGVyLmVuY3J5cHRCbG9jayh3b3Jkcywgb2Zmc2V0KTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyBibG9jayB0byB1c2Ugd2l0aCBuZXh0IGJsb2NrXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9wcmV2QmxvY2sgPSB3b3Jkcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGJsb2NrU2l6ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENCQyBkZWNyeXB0b3IuXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgQ0JDLkRlY3J5cHRvciA9IENCQy5leHRlbmQoe1xuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogUHJvY2Vzc2VzIHRoZSBkYXRhIGJsb2NrIGF0IG9mZnNldC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgVGhlIGRhdGEgd29yZHMgdG8gb3BlcmF0ZSBvbi5cblx0ICAgICAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCBUaGUgb2Zmc2V0IHdoZXJlIHRoZSBibG9jayBzdGFydHMuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICBtb2RlLnByb2Nlc3NCbG9jayhkYXRhLndvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgcHJvY2Vzc0Jsb2NrOiBmdW5jdGlvbiAod29yZHMsIG9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgICAgICB2YXIgY2lwaGVyID0gdGhpcy5fY2lwaGVyO1xuXHQgICAgICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IGNpcGhlci5ibG9ja1NpemU7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgYmxvY2sgdG8gdXNlIHdpdGggbmV4dCBibG9ja1xuXHQgICAgICAgICAgICAgICAgdmFyIHRoaXNCbG9jayA9IHdvcmRzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmxvY2tTaXplKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gRGVjcnlwdCBhbmQgWE9SXG5cdCAgICAgICAgICAgICAgICBjaXBoZXIuZGVjcnlwdEJsb2NrKHdvcmRzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICAgICAgeG9yQmxvY2suY2FsbCh0aGlzLCB3b3Jkcywgb2Zmc2V0LCBibG9ja1NpemUpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBUaGlzIGJsb2NrIGJlY29tZXMgdGhlIHByZXZpb3VzIGJsb2NrXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9wcmV2QmxvY2sgPSB0aGlzQmxvY2s7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblxuXHQgICAgICAgIGZ1bmN0aW9uIHhvckJsb2NrKHdvcmRzLCBvZmZzZXQsIGJsb2NrU2l6ZSkge1xuXHQgICAgICAgICAgICB2YXIgYmxvY2s7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGl2ID0gdGhpcy5faXY7XG5cblx0ICAgICAgICAgICAgLy8gQ2hvb3NlIG1peGluZyBibG9ja1xuXHQgICAgICAgICAgICBpZiAoaXYpIHtcblx0ICAgICAgICAgICAgICAgIGJsb2NrID0gaXY7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBJViBmb3Igc3Vic2VxdWVudCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIHRoaXMuX2l2ID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYmxvY2sgPSB0aGlzLl9wcmV2QmxvY2s7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBYT1IgYmxvY2tzXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tTaXplOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzW29mZnNldCArIGldIF49IGJsb2NrW2ldO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXG5cdCAgICAgICAgcmV0dXJuIENCQztcblx0ICAgIH0oKSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogUGFkZGluZyBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX3BhZCA9IEMucGFkID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogUEtDUyAjNS83IHBhZGRpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBQa2NzNyA9IENfcGFkLlBrY3M3ID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFBhZHMgZGF0YSB1c2luZyB0aGUgYWxnb3JpdGhtIGRlZmluZWQgaW4gUEtDUyAjNS83LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGRhdGEgVGhlIGRhdGEgdG8gcGFkLlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG11bHRpcGxlIHRoYXQgdGhlIGRhdGEgc2hvdWxkIGJlIHBhZGRlZCB0by5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgQ3J5cHRvSlMucGFkLlBrY3M3LnBhZCh3b3JkQXJyYXksIDQpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhZDogZnVuY3Rpb24gKGRhdGEsIGJsb2NrU2l6ZSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplQnl0ZXMgPSBibG9ja1NpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIENvdW50IHBhZGRpbmcgYnl0ZXNcblx0ICAgICAgICAgICAgdmFyIG5QYWRkaW5nQnl0ZXMgPSBibG9ja1NpemVCeXRlcyAtIGRhdGEuc2lnQnl0ZXMgJSBibG9ja1NpemVCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDcmVhdGUgcGFkZGluZyB3b3JkXG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nV29yZCA9IChuUGFkZGluZ0J5dGVzIDw8IDI0KSB8IChuUGFkZGluZ0J5dGVzIDw8IDE2KSB8IChuUGFkZGluZ0J5dGVzIDw8IDgpIHwgblBhZGRpbmdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDcmVhdGUgcGFkZGluZ1xuXHQgICAgICAgICAgICB2YXIgcGFkZGluZ1dvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgblBhZGRpbmdCeXRlczsgaSArPSA0KSB7XG5cdCAgICAgICAgICAgICAgICBwYWRkaW5nV29yZHMucHVzaChwYWRkaW5nV29yZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFyIHBhZGRpbmcgPSBXb3JkQXJyYXkuY3JlYXRlKHBhZGRpbmdXb3JkcywgblBhZGRpbmdCeXRlcyk7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmdcblx0ICAgICAgICAgICAgZGF0YS5jb25jYXQocGFkZGluZyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFVucGFkcyBkYXRhIHRoYXQgaGFkIGJlZW4gcGFkZGVkIHVzaW5nIHRoZSBhbGdvcml0aG0gZGVmaW5lZCBpbiBQS0NTICM1LzcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gZGF0YSBUaGUgZGF0YSB0byB1bnBhZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgQ3J5cHRvSlMucGFkLlBrY3M3LnVucGFkKHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdW5wYWQ6IGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICAgIC8vIEdldCBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBmcm9tIGxhc3QgYnl0ZVxuXHQgICAgICAgICAgICB2YXIgblBhZGRpbmdCeXRlcyA9IGRhdGEud29yZHNbKGRhdGEuc2lnQnl0ZXMgLSAxKSA+Pj4gMl0gJiAweGZmO1xuXG5cdCAgICAgICAgICAgIC8vIFJlbW92ZSBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgLT0gblBhZGRpbmdCeXRlcztcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJhc2UgYmxvY2sgY2lwaGVyIHRlbXBsYXRlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBibG9ja1NpemUgVGhlIG51bWJlciBvZiAzMi1iaXQgd29yZHMgdGhpcyBjaXBoZXIgb3BlcmF0ZXMgb24uIERlZmF1bHQ6IDQgKDEyOCBiaXRzKVxuXHQgICAgICovXG5cdCAgICB2YXIgQmxvY2tDaXBoZXIgPSBDX2xpYi5CbG9ja0NpcGhlciA9IENpcGhlci5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7TW9kZX0gbW9kZSBUaGUgYmxvY2sgbW9kZSB0byB1c2UuIERlZmF1bHQ6IENCQ1xuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7UGFkZGluZ30gcGFkZGluZyBUaGUgcGFkZGluZyBzdHJhdGVneSB0byB1c2UuIERlZmF1bHQ6IFBrY3M3XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBDaXBoZXIuY2ZnLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIG1vZGU6IENCQyxcblx0ICAgICAgICAgICAgcGFkZGluZzogUGtjczdcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBtb2RlQ3JlYXRvcjtcblxuXHQgICAgICAgICAgICAvLyBSZXNldCBjaXBoZXJcblx0ICAgICAgICAgICAgQ2lwaGVyLnJlc2V0LmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBjZmcgPSB0aGlzLmNmZztcblx0ICAgICAgICAgICAgdmFyIGl2ID0gY2ZnLml2O1xuXHQgICAgICAgICAgICB2YXIgbW9kZSA9IGNmZy5tb2RlO1xuXG5cdCAgICAgICAgICAgIC8vIFJlc2V0IGJsb2NrIG1vZGVcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9FTkNfWEZPUk1fTU9ERSkge1xuXHQgICAgICAgICAgICAgICAgbW9kZUNyZWF0b3IgPSBtb2RlLmNyZWF0ZUVuY3J5cHRvcjtcblx0ICAgICAgICAgICAgfSBlbHNlIC8qIGlmICh0aGlzLl94Zm9ybU1vZGUgPT0gdGhpcy5fREVDX1hGT1JNX01PREUpICovIHtcblx0ICAgICAgICAgICAgICAgIG1vZGVDcmVhdG9yID0gbW9kZS5jcmVhdGVEZWNyeXB0b3I7XG5cdCAgICAgICAgICAgICAgICAvLyBLZWVwIGF0IGxlYXN0IG9uZSBibG9jayBpbiB0aGUgYnVmZmVyIGZvciB1bnBhZGRpbmdcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21pbkJ1ZmZlclNpemUgPSAxO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgaWYgKHRoaXMuX21vZGUgJiYgdGhpcy5fbW9kZS5fX2NyZWF0b3IgPT0gbW9kZUNyZWF0b3IpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX21vZGUuaW5pdCh0aGlzLCBpdiAmJiBpdi53b3Jkcyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9tb2RlID0gbW9kZUNyZWF0b3IuY2FsbChtb2RlLCB0aGlzLCBpdiAmJiBpdi53b3Jkcyk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9tb2RlLl9fY3JlYXRvciA9IG1vZGVDcmVhdG9yO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKHdvcmRzLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbW9kZS5wcm9jZXNzQmxvY2sod29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBmaW5hbFByb2Nlc3NlZEJsb2NrcztcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgcGFkZGluZyA9IHRoaXMuY2ZnLnBhZGRpbmc7XG5cblx0ICAgICAgICAgICAgLy8gRmluYWxpemVcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9FTkNfWEZPUk1fTU9ERSkge1xuXHQgICAgICAgICAgICAgICAgLy8gUGFkIGRhdGFcblx0ICAgICAgICAgICAgICAgIHBhZGRpbmcucGFkKHRoaXMuX2RhdGEsIHRoaXMuYmxvY2tTaXplKTtcblxuXHQgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBmaW5hbCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpO1xuXHQgICAgICAgICAgICB9IGVsc2UgLyogaWYgKHRoaXMuX3hmb3JtTW9kZSA9PSB0aGlzLl9ERUNfWEZPUk1fTU9ERSkgKi8ge1xuXHQgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBmaW5hbCBibG9ja3Ncblx0ICAgICAgICAgICAgICAgIGZpbmFsUHJvY2Vzc2VkQmxvY2tzID0gdGhpcy5fcHJvY2VzcyghISdmbHVzaCcpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBVbnBhZCBkYXRhXG5cdCAgICAgICAgICAgICAgICBwYWRkaW5nLnVucGFkKGZpbmFsUHJvY2Vzc2VkQmxvY2tzKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBmaW5hbFByb2Nlc3NlZEJsb2Nrcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgYmxvY2tTaXplOiAxMjgvMzJcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEEgY29sbGVjdGlvbiBvZiBjaXBoZXIgcGFyYW1ldGVycy5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0gY2lwaGVydGV4dCBUaGUgcmF3IGNpcGhlcnRleHQuXG5cdCAgICAgKiBAcHJvcGVydHkge1dvcmRBcnJheX0ga2V5IFRoZSBrZXkgdG8gdGhpcyBjaXBoZXJ0ZXh0LlxuXHQgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IGl2IFRoZSBJViB1c2VkIGluIHRoZSBjaXBoZXJpbmcgb3BlcmF0aW9uLlxuXHQgICAgICogQHByb3BlcnR5IHtXb3JkQXJyYXl9IHNhbHQgVGhlIHNhbHQgdXNlZCB3aXRoIGEga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge0NpcGhlcn0gYWxnb3JpdGhtIFRoZSBjaXBoZXIgYWxnb3JpdGhtLlxuXHQgICAgICogQHByb3BlcnR5IHtNb2RlfSBtb2RlIFRoZSBibG9jayBtb2RlIHVzZWQgaW4gdGhlIGNpcGhlcmluZyBvcGVyYXRpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge1BhZGRpbmd9IHBhZGRpbmcgVGhlIHBhZGRpbmcgc2NoZW1lIHVzZWQgaW4gdGhlIGNpcGhlcmluZyBvcGVyYXRpb24uXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBibG9jayBzaXplIG9mIHRoZSBjaXBoZXIuXG5cdCAgICAgKiBAcHJvcGVydHkge0Zvcm1hdH0gZm9ybWF0dGVyIFRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gY29udmVydCB0aGlzIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGEgc3RyaW5nLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ2lwaGVyUGFyYW1zID0gQ19saWIuQ2lwaGVyUGFyYW1zID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaXBoZXJQYXJhbXMgQW4gb2JqZWN0IHdpdGggYW55IG9mIHRoZSBwb3NzaWJsZSBjaXBoZXIgcGFyYW1ldGVycy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlclBhcmFtcyA9IENyeXB0b0pTLmxpYi5DaXBoZXJQYXJhbXMuY3JlYXRlKHtcblx0ICAgICAgICAgKiAgICAgICAgIGNpcGhlcnRleHQ6IGNpcGhlcnRleHRXb3JkQXJyYXksXG5cdCAgICAgICAgICogICAgICAgICBrZXk6IGtleVdvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIGl2OiBpdldvcmRBcnJheSxcblx0ICAgICAgICAgKiAgICAgICAgIHNhbHQ6IHNhbHRXb3JkQXJyYXksXG5cdCAgICAgICAgICogICAgICAgICBhbGdvcml0aG06IENyeXB0b0pTLmFsZ28uQUVTLFxuXHQgICAgICAgICAqICAgICAgICAgbW9kZTogQ3J5cHRvSlMubW9kZS5DQkMsXG5cdCAgICAgICAgICogICAgICAgICBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUEtDUzcsXG5cdCAgICAgICAgICogICAgICAgICBibG9ja1NpemU6IDQsXG5cdCAgICAgICAgICogICAgICAgICBmb3JtYXR0ZXI6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMXG5cdCAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjaXBoZXJQYXJhbXMpIHtcblx0ICAgICAgICAgICAgdGhpcy5taXhJbihjaXBoZXJQYXJhbXMpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyB0aGlzIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtGb3JtYXR9IGZvcm1hdHRlciAoT3B0aW9uYWwpIFRoZSBmb3JtYXR0aW5nIHN0cmF0ZWd5IHRvIHVzZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN0cmluZ2lmaWVkIGNpcGhlciBwYXJhbXMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAdGhyb3dzIEVycm9yIElmIG5laXRoZXIgdGhlIGZvcm1hdHRlciBub3IgdGhlIGRlZmF1bHQgZm9ybWF0dGVyIGlzIHNldC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IGNpcGhlclBhcmFtcyArICcnO1xuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gY2lwaGVyUGFyYW1zLnRvU3RyaW5nKCk7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSBjaXBoZXJQYXJhbXMudG9TdHJpbmcoQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoZm9ybWF0dGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoZm9ybWF0dGVyIHx8IHRoaXMuZm9ybWF0dGVyKS5zdHJpbmdpZnkodGhpcyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogRm9ybWF0IG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfZm9ybWF0ID0gQy5mb3JtYXQgPSB7fTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBPcGVuU1NMIGZvcm1hdHRpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBPcGVuU1NMRm9ybWF0dGVyID0gQ19mb3JtYXQuT3BlblNTTCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIGNpcGhlciBwYXJhbXMgb2JqZWN0IHRvIGFuIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0NpcGhlclBhcmFtc30gY2lwaGVyUGFyYW1zIFRoZSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBvcGVuU1NMU3RyaW5nID0gQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wuc3RyaW5naWZ5KGNpcGhlclBhcmFtcyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAoY2lwaGVyUGFyYW1zKSB7XG5cdCAgICAgICAgICAgIHZhciB3b3JkQXJyYXk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gY2lwaGVyUGFyYW1zLmNpcGhlcnRleHQ7XG5cdCAgICAgICAgICAgIHZhciBzYWx0ID0gY2lwaGVyUGFyYW1zLnNhbHQ7XG5cblx0ICAgICAgICAgICAgLy8gRm9ybWF0XG5cdCAgICAgICAgICAgIGlmIChzYWx0KSB7XG5cdCAgICAgICAgICAgICAgICB3b3JkQXJyYXkgPSBXb3JkQXJyYXkuY3JlYXRlKFsweDUzNjE2Yzc0LCAweDY1NjQ1ZjVmXSkuY29uY2F0KHNhbHQpLmNvbmNhdChjaXBoZXJ0ZXh0KTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRBcnJheSA9IGNpcGhlcnRleHQ7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gd29yZEFycmF5LnRvU3RyaW5nKEJhc2U2NCk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGFuIE9wZW5TU0wtY29tcGF0aWJsZSBzdHJpbmcgdG8gYSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVuU1NMU3RyIFRoZSBPcGVuU1NMLWNvbXBhdGlibGUgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBUaGUgY2lwaGVyIHBhcmFtcyBvYmplY3QuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJQYXJhbXMgPSBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTC5wYXJzZShvcGVuU1NMU3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKG9wZW5TU0xTdHIpIHtcblx0ICAgICAgICAgICAgdmFyIHNhbHQ7XG5cblx0ICAgICAgICAgICAgLy8gUGFyc2UgYmFzZTY0XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gQmFzZTY0LnBhcnNlKG9wZW5TU0xTdHIpO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0V29yZHMgPSBjaXBoZXJ0ZXh0LndvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFRlc3QgZm9yIHNhbHRcblx0ICAgICAgICAgICAgaWYgKGNpcGhlcnRleHRXb3Jkc1swXSA9PSAweDUzNjE2Yzc0ICYmIGNpcGhlcnRleHRXb3Jkc1sxXSA9PSAweDY1NjQ1ZjVmKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHNhbHRcblx0ICAgICAgICAgICAgICAgIHNhbHQgPSBXb3JkQXJyYXkuY3JlYXRlKGNpcGhlcnRleHRXb3Jkcy5zbGljZSgyLCA0KSk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzYWx0IGZyb20gY2lwaGVydGV4dFxuXHQgICAgICAgICAgICAgICAgY2lwaGVydGV4dFdvcmRzLnNwbGljZSgwLCA0KTtcblx0ICAgICAgICAgICAgICAgIGNpcGhlcnRleHQuc2lnQnl0ZXMgLT0gMTY7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gQ2lwaGVyUGFyYW1zLmNyZWF0ZSh7IGNpcGhlcnRleHQ6IGNpcGhlcnRleHQsIHNhbHQ6IHNhbHQgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBBIGNpcGhlciB3cmFwcGVyIHRoYXQgcmV0dXJucyBjaXBoZXJ0ZXh0IGFzIGEgc2VyaWFsaXphYmxlIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICovXG5cdCAgICB2YXIgU2VyaWFsaXphYmxlQ2lwaGVyID0gQ19saWIuU2VyaWFsaXphYmxlQ2lwaGVyID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7Rm9ybWF0dGVyfSBmb3JtYXQgVGhlIGZvcm1hdHRpbmcgc3RyYXRlZ3kgdG8gY29udmVydCBjaXBoZXIgcGFyYW0gb2JqZWN0cyB0byBhbmQgZnJvbSBhIHN0cmluZy4gRGVmYXVsdDogT3BlblNTTFxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQmFzZS5leHRlbmQoe1xuXHQgICAgICAgICAgICBmb3JtYXQ6IE9wZW5TU0xGb3JtYXR0ZXJcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEVuY3J5cHRzIGEgbWVzc2FnZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciBhbGdvcml0aG0gdG8gdXNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBlbmNyeXB0LlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSBrZXkgVGhlIGtleS5cblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgb3BlcmF0aW9uLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7Q2lwaGVyUGFyYW1zfSBBIGNpcGhlciBwYXJhbXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgY2lwaGVydGV4dFBhcmFtcyA9IENyeXB0b0pTLmxpYi5TZXJpYWxpemFibGVDaXBoZXIuZW5jcnlwdChDcnlwdG9KUy5hbGdvLkFFUywgbWVzc2FnZSwga2V5KTtcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmVuY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIG1lc3NhZ2UsIGtleSwgeyBpdjogaXYgfSk7XG5cdCAgICAgICAgICogICAgIHZhciBjaXBoZXJ0ZXh0UGFyYW1zID0gQ3J5cHRvSlMubGliLlNlcmlhbGl6YWJsZUNpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCBrZXksIHsgaXY6IGl2LCBmb3JtYXQ6IENyeXB0b0pTLmZvcm1hdC5PcGVuU1NMIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uIChjaXBoZXIsIG1lc3NhZ2UsIGtleSwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBFbmNyeXB0XG5cdCAgICAgICAgICAgIHZhciBlbmNyeXB0b3IgPSBjaXBoZXIuY3JlYXRlRW5jcnlwdG9yKGtleSwgY2ZnKTtcblx0ICAgICAgICAgICAgdmFyIGNpcGhlcnRleHQgPSBlbmNyeXB0b3IuZmluYWxpemUobWVzc2FnZSk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGNpcGhlckNmZyA9IGVuY3J5cHRvci5jZmc7XG5cblx0ICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gc2VyaWFsaXphYmxlIGNpcGhlciBwYXJhbXNcblx0ICAgICAgICAgICAgcmV0dXJuIENpcGhlclBhcmFtcy5jcmVhdGUoe1xuXHQgICAgICAgICAgICAgICAgY2lwaGVydGV4dDogY2lwaGVydGV4dCxcblx0ICAgICAgICAgICAgICAgIGtleToga2V5LFxuXHQgICAgICAgICAgICAgICAgaXY6IGNpcGhlckNmZy5pdixcblx0ICAgICAgICAgICAgICAgIGFsZ29yaXRobTogY2lwaGVyLFxuXHQgICAgICAgICAgICAgICAgbW9kZTogY2lwaGVyQ2ZnLm1vZGUsXG5cdCAgICAgICAgICAgICAgICBwYWRkaW5nOiBjaXBoZXJDZmcucGFkZGluZyxcblx0ICAgICAgICAgICAgICAgIGJsb2NrU2l6ZTogY2lwaGVyLmJsb2NrU2l6ZSxcblx0ICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogY2ZnLmZvcm1hdFxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRGVjcnlwdHMgc2VyaWFsaXplZCBjaXBoZXJ0ZXh0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJ9IGNpcGhlciBUaGUgY2lwaGVyIGFsZ29yaXRobSB0byB1c2UuXG5cdCAgICAgICAgICogQHBhcmFtIHtDaXBoZXJQYXJhbXN8c3RyaW5nfSBjaXBoZXJ0ZXh0IFRoZSBjaXBoZXJ0ZXh0IHRvIGRlY3J5cHQuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IGtleSBUaGUga2V5LlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhpcyBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBwbGFpbnRleHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBwbGFpbnRleHQgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmRlY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIGZvcm1hdHRlZENpcGhlcnRleHQsIGtleSwgeyBpdjogaXYsIGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICogICAgIHZhciBwbGFpbnRleHQgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLmRlY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIGNpcGhlcnRleHRQYXJhbXMsIGtleSwgeyBpdjogaXYsIGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZGVjcnlwdDogZnVuY3Rpb24gKGNpcGhlciwgY2lwaGVydGV4dCwga2V5LCBjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIGNmZyA9IHRoaXMuY2ZnLmV4dGVuZChjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIENpcGhlclBhcmFtc1xuXHQgICAgICAgICAgICBjaXBoZXJ0ZXh0ID0gdGhpcy5fcGFyc2UoY2lwaGVydGV4dCwgY2ZnLmZvcm1hdCk7XG5cblx0ICAgICAgICAgICAgLy8gRGVjcnlwdFxuXHQgICAgICAgICAgICB2YXIgcGxhaW50ZXh0ID0gY2lwaGVyLmNyZWF0ZURlY3J5cHRvcihrZXksIGNmZykuZmluYWxpemUoY2lwaGVydGV4dC5jaXBoZXJ0ZXh0KTtcblxuXHQgICAgICAgICAgICByZXR1cm4gcGxhaW50ZXh0O1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBzZXJpYWxpemVkIGNpcGhlcnRleHQgdG8gQ2lwaGVyUGFyYW1zLFxuXHQgICAgICAgICAqIGVsc2UgYXNzdW1lZCBDaXBoZXJQYXJhbXMgYWxyZWFkeSBhbmQgcmV0dXJucyBjaXBoZXJ0ZXh0IHVuY2hhbmdlZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfHN0cmluZ30gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dC5cblx0ICAgICAgICAgKiBAcGFyYW0ge0Zvcm1hdHRlcn0gZm9ybWF0IFRoZSBmb3JtYXR0aW5nIHN0cmF0ZWd5IHRvIHVzZSB0byBwYXJzZSBzZXJpYWxpemVkIGNpcGhlcnRleHQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtDaXBoZXJQYXJhbXN9IFRoZSB1bnNlcmlhbGl6ZWQgY2lwaGVydGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuU2VyaWFsaXphYmxlQ2lwaGVyLl9wYXJzZShjaXBoZXJ0ZXh0U3RyaW5nT3JQYXJhbXMsIGZvcm1hdCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX3BhcnNlOiBmdW5jdGlvbiAoY2lwaGVydGV4dCwgZm9ybWF0KSB7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY2lwaGVydGV4dCA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdC5wYXJzZShjaXBoZXJ0ZXh0LCB0aGlzKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBjaXBoZXJ0ZXh0O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogS2V5IGRlcml2YXRpb24gZnVuY3Rpb24gbmFtZXNwYWNlLlxuXHQgICAgICovXG5cdCAgICB2YXIgQ19rZGYgPSBDLmtkZiA9IHt9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIE9wZW5TU0wga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uXG5cdCAgICAgKi9cblx0ICAgIHZhciBPcGVuU1NMS2RmID0gQ19rZGYuT3BlblNTTCA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBEZXJpdmVzIGEga2V5IGFuZCBJViBmcm9tIGEgcGFzc3dvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGRlcml2ZSBmcm9tLlxuXHQgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrZXlTaXplIFRoZSBzaXplIGluIHdvcmRzIG9mIHRoZSBrZXkgdG8gZ2VuZXJhdGUuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGl2U2l6ZSBUaGUgc2l6ZSBpbiB3b3JkcyBvZiB0aGUgSVYgdG8gZ2VuZXJhdGUuXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBzYWx0IChPcHRpb25hbCkgQSA2NC1iaXQgc2FsdCB0byB1c2UuIElmIG9taXR0ZWQsIGEgc2FsdCB3aWxsIGJlIGdlbmVyYXRlZCByYW5kb21seS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gQSBjaXBoZXIgcGFyYW1zIG9iamVjdCB3aXRoIHRoZSBrZXksIElWLCBhbmQgc2FsdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGRlcml2ZWRQYXJhbXMgPSBDcnlwdG9KUy5rZGYuT3BlblNTTC5leGVjdXRlKCdQYXNzd29yZCcsIDI1Ni8zMiwgMTI4LzMyKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGRlcml2ZWRQYXJhbXMgPSBDcnlwdG9KUy5rZGYuT3BlblNTTC5leGVjdXRlKCdQYXNzd29yZCcsIDI1Ni8zMiwgMTI4LzMyLCAnc2FsdHNhbHQnKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBleGVjdXRlOiBmdW5jdGlvbiAocGFzc3dvcmQsIGtleVNpemUsIGl2U2l6ZSwgc2FsdCwgaGFzaGVyKSB7XG5cdCAgICAgICAgICAgIC8vIEdlbmVyYXRlIHJhbmRvbSBzYWx0XG5cdCAgICAgICAgICAgIGlmICghc2FsdCkge1xuXHQgICAgICAgICAgICAgICAgc2FsdCA9IFdvcmRBcnJheS5yYW5kb20oNjQvOCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBEZXJpdmUga2V5IGFuZCBJVlxuXHQgICAgICAgICAgICBpZiAoIWhhc2hlcikge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtleSA9IEV2cEtERi5jcmVhdGUoeyBrZXlTaXplOiBrZXlTaXplICsgaXZTaXplIH0pLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdmFyIGtleSA9IEV2cEtERi5jcmVhdGUoeyBrZXlTaXplOiBrZXlTaXplICsgaXZTaXplLCBoYXNoZXI6IGhhc2hlciB9KS5jb21wdXRlKHBhc3N3b3JkLCBzYWx0KTtcblx0ICAgICAgICAgICAgfVxuXG5cblx0ICAgICAgICAgICAgLy8gU2VwYXJhdGUga2V5IGFuZCBJVlxuXHQgICAgICAgICAgICB2YXIgaXYgPSBXb3JkQXJyYXkuY3JlYXRlKGtleS53b3Jkcy5zbGljZShrZXlTaXplKSwgaXZTaXplICogNCk7XG5cdCAgICAgICAgICAgIGtleS5zaWdCeXRlcyA9IGtleVNpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIFJldHVybiBwYXJhbXNcblx0ICAgICAgICAgICAgcmV0dXJuIENpcGhlclBhcmFtcy5jcmVhdGUoeyBrZXk6IGtleSwgaXY6IGl2LCBzYWx0OiBzYWx0IH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cblx0ICAgIC8qKlxuXHQgICAgICogQSBzZXJpYWxpemFibGUgY2lwaGVyIHdyYXBwZXIgdGhhdCBkZXJpdmVzIHRoZSBrZXkgZnJvbSBhIHBhc3N3b3JkLFxuXHQgICAgICogYW5kIHJldHVybnMgY2lwaGVydGV4dCBhcyBhIHNlcmlhbGl6YWJsZSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAqL1xuXHQgICAgdmFyIFBhc3N3b3JkQmFzZWRDaXBoZXIgPSBDX2xpYi5QYXNzd29yZEJhc2VkQ2lwaGVyID0gU2VyaWFsaXphYmxlQ2lwaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtLREZ9IGtkZiBUaGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gdG8gdXNlIHRvIGdlbmVyYXRlIGEga2V5IGFuZCBJViBmcm9tIGEgcGFzc3dvcmQuIERlZmF1bHQ6IE9wZW5TU0xcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjZmc6IFNlcmlhbGl6YWJsZUNpcGhlci5jZmcuZXh0ZW5kKHtcblx0ICAgICAgICAgICAga2RmOiBPcGVuU1NMS2RmXG5cdCAgICAgICAgfSksXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBFbmNyeXB0cyBhIG1lc3NhZ2UgdXNpbmcgYSBwYXNzd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciBhbGdvcml0aG0gdG8gdXNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBlbmNyeXB0LlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0NpcGhlclBhcmFtc30gQSBjaXBoZXIgcGFyYW1zIG9iamVjdC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuUGFzc3dvcmRCYXNlZENpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCAncGFzc3dvcmQnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGNpcGhlcnRleHRQYXJhbXMgPSBDcnlwdG9KUy5saWIuUGFzc3dvcmRCYXNlZENpcGhlci5lbmNyeXB0KENyeXB0b0pTLmFsZ28uQUVTLCBtZXNzYWdlLCAncGFzc3dvcmQnLCB7IGZvcm1hdDogQ3J5cHRvSlMuZm9ybWF0Lk9wZW5TU0wgfSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgZW5jcnlwdDogZnVuY3Rpb24gKGNpcGhlciwgbWVzc2FnZSwgcGFzc3dvcmQsIGNmZykge1xuXHQgICAgICAgICAgICAvLyBBcHBseSBjb25maWcgZGVmYXVsdHNcblx0ICAgICAgICAgICAgY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gRGVyaXZlIGtleSBhbmQgb3RoZXIgcGFyYW1zXG5cdCAgICAgICAgICAgIHZhciBkZXJpdmVkUGFyYW1zID0gY2ZnLmtkZi5leGVjdXRlKHBhc3N3b3JkLCBjaXBoZXIua2V5U2l6ZSwgY2lwaGVyLml2U2l6ZSwgY2ZnLnNhbHQsIGNmZy5oYXNoZXIpO1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBJViB0byBjb25maWdcblx0ICAgICAgICAgICAgY2ZnLml2ID0gZGVyaXZlZFBhcmFtcy5pdjtcblxuXHQgICAgICAgICAgICAvLyBFbmNyeXB0XG5cdCAgICAgICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gU2VyaWFsaXphYmxlQ2lwaGVyLmVuY3J5cHQuY2FsbCh0aGlzLCBjaXBoZXIsIG1lc3NhZ2UsIGRlcml2ZWRQYXJhbXMua2V5LCBjZmcpO1xuXG5cdCAgICAgICAgICAgIC8vIE1peCBpbiBkZXJpdmVkIHBhcmFtc1xuXHQgICAgICAgICAgICBjaXBoZXJ0ZXh0Lm1peEluKGRlcml2ZWRQYXJhbXMpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjaXBoZXJ0ZXh0O1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBEZWNyeXB0cyBzZXJpYWxpemVkIGNpcGhlcnRleHQgdXNpbmcgYSBwYXNzd29yZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyfSBjaXBoZXIgVGhlIGNpcGhlciBhbGdvcml0aG0gdG8gdXNlLlxuXHQgICAgICAgICAqIEBwYXJhbSB7Q2lwaGVyUGFyYW1zfHN0cmluZ30gY2lwaGVydGV4dCBUaGUgY2lwaGVydGV4dCB0byBkZWNyeXB0LlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQuXG5cdCAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyAoT3B0aW9uYWwpIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlIGZvciB0aGlzIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHBsYWludGV4dC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmRlY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIGZvcm1hdHRlZENpcGhlcnRleHQsICdwYXNzd29yZCcsIHsgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKiAgICAgdmFyIHBsYWludGV4dCA9IENyeXB0b0pTLmxpYi5QYXNzd29yZEJhc2VkQ2lwaGVyLmRlY3J5cHQoQ3J5cHRvSlMuYWxnby5BRVMsIGNpcGhlcnRleHRQYXJhbXMsICdwYXNzd29yZCcsIHsgZm9ybWF0OiBDcnlwdG9KUy5mb3JtYXQuT3BlblNTTCB9KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBkZWNyeXB0OiBmdW5jdGlvbiAoY2lwaGVyLCBjaXBoZXJ0ZXh0LCBwYXNzd29yZCwgY2ZnKSB7XG5cdCAgICAgICAgICAgIC8vIEFwcGx5IGNvbmZpZyBkZWZhdWx0c1xuXHQgICAgICAgICAgICBjZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBDaXBoZXJQYXJhbXNcblx0ICAgICAgICAgICAgY2lwaGVydGV4dCA9IHRoaXMuX3BhcnNlKGNpcGhlcnRleHQsIGNmZy5mb3JtYXQpO1xuXG5cdCAgICAgICAgICAgIC8vIERlcml2ZSBrZXkgYW5kIG90aGVyIHBhcmFtc1xuXHQgICAgICAgICAgICB2YXIgZGVyaXZlZFBhcmFtcyA9IGNmZy5rZGYuZXhlY3V0ZShwYXNzd29yZCwgY2lwaGVyLmtleVNpemUsIGNpcGhlci5pdlNpemUsIGNpcGhlcnRleHQuc2FsdCwgY2ZnLmhhc2hlcik7XG5cblx0ICAgICAgICAgICAgLy8gQWRkIElWIHRvIGNvbmZpZ1xuXHQgICAgICAgICAgICBjZmcuaXYgPSBkZXJpdmVkUGFyYW1zLml2O1xuXG5cdCAgICAgICAgICAgIC8vIERlY3J5cHRcblx0ICAgICAgICAgICAgdmFyIHBsYWludGV4dCA9IFNlcmlhbGl6YWJsZUNpcGhlci5kZWNyeXB0LmNhbGwodGhpcywgY2lwaGVyLCBjaXBoZXJ0ZXh0LCBkZXJpdmVkUGFyYW1zLmtleSwgY2ZnKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gcGxhaW50ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9KCkpO1xuXG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeSgpO1xuXHR9XG5cdGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1EXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0cm9vdC5DcnlwdG9KUyA9IGZhY3RvcnkoKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG5cblx0LypnbG9iYWxzIHdpbmRvdywgZ2xvYmFsLCByZXF1aXJlKi9cblxuXHQvKipcblx0ICogQ3J5cHRvSlMgY29yZSBjb21wb25lbnRzLlxuXHQgKi9cblx0dmFyIENyeXB0b0pTID0gQ3J5cHRvSlMgfHwgKGZ1bmN0aW9uIChNYXRoLCB1bmRlZmluZWQpIHtcblxuXHQgICAgdmFyIGNyeXB0bztcblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBmcm9tIHdpbmRvdyAoQnJvd3Nlcilcblx0ICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gd2luZG93LmNyeXB0bztcblx0ICAgIH1cblxuXHQgICAgLy8gTmF0aXZlIGNyeXB0byBpbiB3ZWIgd29ya2VyIChCcm93c2VyKVxuXHQgICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0bykge1xuXHQgICAgICAgIGNyeXB0byA9IHNlbGYuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGZyb20gd29ya2VyXG5cdCAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMuY3J5cHRvKSB7XG5cdCAgICAgICAgY3J5cHRvID0gZ2xvYmFsVGhpcy5jcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSAoZXhwZXJpbWVudGFsIElFIDExKSBjcnlwdG8gZnJvbSB3aW5kb3cgKEJyb3dzZXIpXG5cdCAgICBpZiAoIWNyeXB0byAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubXNDcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSB3aW5kb3cubXNDcnlwdG87XG5cdCAgICB9XG5cblx0ICAgIC8vIE5hdGl2ZSBjcnlwdG8gZnJvbSBnbG9iYWwgKE5vZGVKUylcblx0ICAgIGlmICghY3J5cHRvICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbC5jcnlwdG8pIHtcblx0ICAgICAgICBjcnlwdG8gPSBnbG9iYWwuY3J5cHRvO1xuXHQgICAgfVxuXG5cdCAgICAvLyBOYXRpdmUgY3J5cHRvIGltcG9ydCB2aWEgcmVxdWlyZSAoTm9kZUpTKVxuXHQgICAgaWYgKCFjcnlwdG8gJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblx0ICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cdCAgICB9XG5cblx0ICAgIC8qXG5cdCAgICAgKiBDcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcHNldWRvcmFuZG9tIG51bWJlciBnZW5lcmF0b3Jcblx0ICAgICAqXG5cdCAgICAgKiBBcyBNYXRoLnJhbmRvbSgpIGlzIGNyeXB0b2dyYXBoaWNhbGx5IG5vdCBzYWZlIHRvIHVzZVxuXHQgICAgICovXG5cdCAgICB2YXIgY3J5cHRvU2VjdXJlUmFuZG9tSW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmIChjcnlwdG8pIHtcblx0ICAgICAgICAgICAgLy8gVXNlIGdldFJhbmRvbVZhbHVlcyBtZXRob2QgKEJyb3dzZXIpXG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDMyQXJyYXkoMSkpWzBdO1xuXHQgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gVXNlIHJhbmRvbUJ5dGVzIG1ldGhvZCAoTm9kZUpTKVxuXHQgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0by5yYW5kb21CeXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKDQpLnJlYWRJbnQzMkxFKCk7XG5cdCAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdGl2ZSBjcnlwdG8gbW9kdWxlIGNvdWxkIG5vdCBiZSB1c2VkIHRvIGdldCBzZWN1cmUgcmFuZG9tIG51bWJlci4nKTtcblx0ICAgIH07XG5cblx0ICAgIC8qXG5cdCAgICAgKiBMb2NhbCBwb2x5ZmlsbCBvZiBPYmplY3QuY3JlYXRlXG5cblx0ICAgICAqL1xuXHQgICAgdmFyIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBmdW5jdGlvbiBGKCkge31cblxuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqKSB7XG5cdCAgICAgICAgICAgIHZhciBzdWJ0eXBlO1xuXG5cdCAgICAgICAgICAgIEYucHJvdG90eXBlID0gb2JqO1xuXG5cdCAgICAgICAgICAgIHN1YnR5cGUgPSBuZXcgRigpO1xuXG5cdCAgICAgICAgICAgIEYucHJvdG90eXBlID0gbnVsbDtcblxuXHQgICAgICAgICAgICByZXR1cm4gc3VidHlwZTtcblx0ICAgICAgICB9O1xuXHQgICAgfSgpKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBDcnlwdG9KUyBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogTGlicmFyeSBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2xpYiA9IEMubGliID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogQmFzZSBvYmplY3QgZm9yIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZSA9IChmdW5jdGlvbiAoKSB7XG5cblxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhpcyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdmVycmlkZXMgUHJvcGVydGllcyB0byBjb3B5IGludG8gdGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG5ldyBvYmplY3QuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogICAgIHZhciBNeVR5cGUgPSBDcnlwdG9KUy5saWIuQmFzZS5leHRlbmQoe1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgICAgIG1ldGhvZDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgKiAgICAgICAgIH1cblx0ICAgICAgICAgICAgICogICAgIH0pO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgZXh0ZW5kOiBmdW5jdGlvbiAob3ZlcnJpZGVzKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTcGF3blxuXHQgICAgICAgICAgICAgICAgdmFyIHN1YnR5cGUgPSBjcmVhdGUodGhpcyk7XG5cblx0ICAgICAgICAgICAgICAgIC8vIEF1Z21lbnRcblx0ICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLm1peEluKG92ZXJyaWRlcyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBkZWZhdWx0IGluaXRpYWxpemVyXG5cdCAgICAgICAgICAgICAgICBpZiAoIXN1YnR5cGUuaGFzT3duUHJvcGVydHkoJ2luaXQnKSB8fCB0aGlzLmluaXQgPT09IHN1YnR5cGUuaW5pdCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZS4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemVyJ3MgcHJvdG90eXBlIGlzIHRoZSBzdWJ0eXBlIG9iamVjdFxuXHQgICAgICAgICAgICAgICAgc3VidHlwZS5pbml0LnByb3RvdHlwZSA9IHN1YnR5cGU7XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBzdXBlcnR5cGVcblx0ICAgICAgICAgICAgICAgIHN1YnR5cGUuJHN1cGVyID0gdGhpcztcblxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnR5cGU7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEV4dGVuZHMgdGhpcyBvYmplY3QgYW5kIHJ1bnMgdGhlIGluaXQgbWV0aG9kLlxuXHQgICAgICAgICAgICAgKiBBcmd1bWVudHMgdG8gY3JlYXRlKCkgd2lsbCBiZSBwYXNzZWQgdG8gaW5pdCgpLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBuZXcgb2JqZWN0LlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgaW5zdGFuY2UgPSBNeVR5cGUuY3JlYXRlKCk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZXh0ZW5kKCk7XG5cdCAgICAgICAgICAgICAgICBpbnN0YW5jZS5pbml0LmFwcGx5KGluc3RhbmNlLCBhcmd1bWVudHMpO1xuXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG5cdCAgICAgICAgICAgIH0sXG5cblx0ICAgICAgICAgICAgLyoqXG5cdCAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG5cdCAgICAgICAgICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFkZCBzb21lIGxvZ2ljIHdoZW4geW91ciBvYmplY3RzIGFyZSBjcmVhdGVkLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgdmFyIE15VHlwZSA9IENyeXB0b0pTLmxpYi5CYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgICAqICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgKiAgICAgICAgICAgICAvLyAuLi5cblx0ICAgICAgICAgICAgICogICAgICAgICB9XG5cdCAgICAgICAgICAgICAqICAgICB9KTtcblx0ICAgICAgICAgICAgICovXG5cdCAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgfSxcblxuXHQgICAgICAgICAgICAvKipcblx0ICAgICAgICAgICAgICogQ29waWVzIHByb3BlcnRpZXMgaW50byB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gbWl4IGluLlxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAgICAgKlxuXHQgICAgICAgICAgICAgKiAgICAgTXlUeXBlLm1peEluKHtcblx0ICAgICAgICAgICAgICogICAgICAgICBmaWVsZDogJ3ZhbHVlJ1xuXHQgICAgICAgICAgICAgKiAgICAgfSk7XG5cdCAgICAgICAgICAgICAqL1xuXHQgICAgICAgICAgICBtaXhJbjogZnVuY3Rpb24gKHByb3BlcnRpZXMpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcGVydHlOYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICAvLyBJRSB3b24ndCBjb3B5IHRvU3RyaW5nIHVzaW5nIHRoZSBsb29wIGFib3ZlXG5cdCAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgndG9TdHJpbmcnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9TdHJpbmcgPSBwcm9wZXJ0aWVzLnRvU3RyaW5nO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9LFxuXG5cdCAgICAgICAgICAgIC8qKlxuXHQgICAgICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIG9iamVjdC5cblx0ICAgICAgICAgICAgICpcblx0ICAgICAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICAgICAqXG5cdCAgICAgICAgICAgICAqICAgICB2YXIgY2xvbmUgPSBpbnN0YW5jZS5jbG9uZSgpO1xuXHQgICAgICAgICAgICAgKi9cblx0ICAgICAgICAgICAgY2xvbmU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICB9KCkpO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge0FycmF5fSB3b3JkcyBUaGUgYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuXHQgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNpZ0J5dGVzIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4gdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICovXG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5ID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtBcnJheX0gd29yZHMgKE9wdGlvbmFsKSBBbiBhcnJheSBvZiAzMi1iaXQgd29yZHMuXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpZ0J5dGVzIChPcHRpb25hbCkgVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB0aGUgd29yZHMuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5saWIuV29yZEFycmF5LmNyZWF0ZSgpO1xuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoWzB4MDAwMTAyMDMsIDB4MDQwNTA2MDddKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwMDEwMjAzLCAweDA0MDUwNjA3XSwgNik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaW5pdDogZnVuY3Rpb24gKHdvcmRzLCBzaWdCeXRlcykge1xuXHQgICAgICAgICAgICB3b3JkcyA9IHRoaXMud29yZHMgPSB3b3JkcyB8fCBbXTtcblxuXHQgICAgICAgICAgICBpZiAoc2lnQnl0ZXMgIT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gc2lnQnl0ZXM7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzID0gd29yZHMubGVuZ3RoICogNDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyB0aGlzIHdvcmQgYXJyYXkgdG8gYSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0VuY29kZXJ9IGVuY29kZXIgKE9wdGlvbmFsKSBUaGUgZW5jb2Rpbmcgc3RyYXRlZ3kgdG8gdXNlLiBEZWZhdWx0OiBDcnlwdG9KUy5lbmMuSGV4XG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmdpZmllZCB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgc3RyaW5nID0gd29yZEFycmF5ICsgJyc7XG5cdCAgICAgICAgICogICAgIHZhciBzdHJpbmcgPSB3b3JkQXJyYXkudG9TdHJpbmcoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIHN0cmluZyA9IHdvcmRBcnJheS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIChlbmNvZGVyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAoZW5jb2RlciB8fCBIZXgpLnN0cmluZ2lmeSh0aGlzKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uY2F0ZW5hdGVzIGEgd29yZCBhcnJheSB0byB0aGlzIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5IHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB3b3JkQXJyYXkxLmNvbmNhdCh3b3JkQXJyYXkyKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjb25jYXQ6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB0aGlzV29yZHMgPSB0aGlzLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgdGhhdFdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgdGhpc1NpZ0J5dGVzID0gdGhpcy5zaWdCeXRlcztcblx0ICAgICAgICAgICAgdmFyIHRoYXRTaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDbGFtcCBleGNlc3MgYml0c1xuXHQgICAgICAgICAgICB0aGlzLmNsYW1wKCk7XG5cblx0ICAgICAgICAgICAgLy8gQ29uY2F0XG5cdCAgICAgICAgICAgIGlmICh0aGlzU2lnQnl0ZXMgJSA0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBDb3B5IG9uZSBieXRlIGF0IGEgdGltZVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGF0U2lnQnl0ZXM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0aGF0Qnl0ZSA9ICh0aGF0V29yZHNbaSA+Pj4gMl0gPj4+ICgyNCAtIChpICUgNCkgKiA4KSkgJiAweGZmO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXNXb3Jkc1sodGhpc1NpZ0J5dGVzICsgaSkgPj4+IDJdIHw9IHRoYXRCeXRlIDw8ICgyNCAtICgodGhpc1NpZ0J5dGVzICsgaSkgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgLy8gQ29weSBvbmUgd29yZCBhdCBhIHRpbWVcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhhdFNpZ0J5dGVzOyBqICs9IDQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzV29yZHNbKHRoaXNTaWdCeXRlcyArIGopID4+PiAyXSA9IHRoYXRXb3Jkc1tqID4+PiAyXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnNpZ0J5dGVzICs9IHRoYXRTaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDaGFpbmFibGVcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlbW92ZXMgaW5zaWduaWZpY2FudCBiaXRzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB3b3JkQXJyYXkuY2xhbXAoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbGFtcDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gdGhpcy53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gdGhpcy5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDbGFtcFxuXHQgICAgICAgICAgICB3b3Jkc1tzaWdCeXRlcyA+Pj4gMl0gJj0gMHhmZmZmZmZmZiA8PCAoMzIgLSAoc2lnQnl0ZXMgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICB3b3Jkcy5sZW5ndGggPSBNYXRoLmNlaWwoc2lnQnl0ZXMgLyA0KTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjbG9uZSA9IHdvcmRBcnJheS5jbG9uZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEJhc2UuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUud29yZHMgPSB0aGlzLndvcmRzLnNsaWNlKDApO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHdvcmQgYXJyYXkgZmlsbGVkIHdpdGggcmFuZG9tIGJ5dGVzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG5CeXRlcyBUaGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBnZW5lcmF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHJhbmRvbSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5yYW5kb20oMTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJhbmRvbTogZnVuY3Rpb24gKG5CeXRlcykge1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5CeXRlczsgaSArPSA0KSB7XG5cdCAgICAgICAgICAgICAgICB3b3Jkcy5wdXNoKGNyeXB0b1NlY3VyZVJhbmRvbUludCgpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgV29yZEFycmF5LmluaXQod29yZHMsIG5CeXRlcyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogRW5jb2RlciBuYW1lc3BhY2UuXG5cdCAgICAgKi9cblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jID0ge307XG5cblx0ICAgIC8qKlxuXHQgICAgICogSGV4IGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgSGV4ID0gQ19lbmMuSGV4ID0ge1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgd29yZCBhcnJheSB0byBhIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheX0gd29yZEFycmF5IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGV4IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhleFN0cmluZyA9IENyeXB0b0pTLmVuYy5IZXguc3RyaW5naWZ5KHdvcmRBcnJheSk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAod29yZEFycmF5KSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSB3b3JkQXJyYXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBzaWdCeXRlcyA9IHdvcmRBcnJheS5zaWdCeXRlcztcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHZhciBoZXhDaGFycyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpZ0J5dGVzOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBiaXRlID0gKHdvcmRzW2kgPj4+IDJdID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIGhleENoYXJzLnB1c2goKGJpdGUgPj4+IDQpLnRvU3RyaW5nKDE2KSk7XG5cdCAgICAgICAgICAgICAgICBoZXhDaGFycy5wdXNoKChiaXRlICYgMHgwZikudG9TdHJpbmcoMTYpKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIHJldHVybiBoZXhDaGFycy5qb2luKCcnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBoZXggc3RyaW5nIHRvIGEgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBoZXhTdHIgVGhlIGhleCBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgd29yZEFycmF5ID0gQ3J5cHRvSlMuZW5jLkhleC5wYXJzZShoZXhTdHJpbmcpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoaGV4U3RyKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBoZXhTdHJMZW5ndGggPSBoZXhTdHIubGVuZ3RoO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGV4U3RyTGVuZ3RoOyBpICs9IDIpIHtcblx0ICAgICAgICAgICAgICAgIHdvcmRzW2kgPj4+IDNdIHw9IHBhcnNlSW50KGhleFN0ci5zdWJzdHIoaSwgMiksIDE2KSA8PCAoMjQgLSAoaSAlIDgpICogNCk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHdvcmRzLCBoZXhTdHJMZW5ndGggLyAyKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIExhdGluMSBlbmNvZGluZyBzdHJhdGVneS5cblx0ICAgICAqL1xuXHQgICAgdmFyIExhdGluMSA9IENfZW5jLkxhdGluMSA9IHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIHdvcmQgYXJyYXkgdG8gYSBMYXRpbjEgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIExhdGluMSBzdHJpbmcuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBsYXRpbjFTdHJpbmcgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnN0cmluZ2lmeSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKHdvcmRBcnJheSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIHdvcmRzID0gd29yZEFycmF5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgc2lnQnl0ZXMgPSB3b3JkQXJyYXkuc2lnQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgbGF0aW4xQ2hhcnMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaWdCeXRlczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYml0ZSA9ICh3b3Jkc1tpID4+PiAyXSA+Pj4gKDI0IC0gKGkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICBsYXRpbjFDaGFycy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYml0ZSkpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGxhdGluMUNoYXJzLmpvaW4oJycpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDb252ZXJ0cyBhIExhdGluMSBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGxhdGluMVN0ciBUaGUgTGF0aW4xIHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuTGF0aW4xLnBhcnNlKGxhdGluMVN0cmluZyk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChsYXRpbjFTdHIpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRcblx0ICAgICAgICAgICAgdmFyIGxhdGluMVN0ckxlbmd0aCA9IGxhdGluMVN0ci5sZW5ndGg7XG5cblx0ICAgICAgICAgICAgLy8gQ29udmVydFxuXHQgICAgICAgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXRpbjFTdHJMZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgd29yZHNbaSA+Pj4gMl0gfD0gKGxhdGluMVN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZikgPDwgKDI0IC0gKGkgJSA0KSAqIDgpO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBXb3JkQXJyYXkuaW5pdCh3b3JkcywgbGF0aW4xU3RyTGVuZ3RoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFVURi04IGVuY29kaW5nIHN0cmF0ZWd5LlxuXHQgICAgICovXG5cdCAgICB2YXIgVXRmOCA9IENfZW5jLlV0ZjggPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgVVRGLTggc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl9IHdvcmRBcnJheSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHV0ZjhTdHJpbmcgPSBDcnlwdG9KUy5lbmMuVXRmOC5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKExhdGluMS5zdHJpbmdpZnkod29yZEFycmF5KSkpO1xuXHQgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbGZvcm1lZCBVVEYtOCBkYXRhJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSBVVEYtOCBzdHJpbmcgdG8gYSB3b3JkIGFycmF5LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHV0ZjhTdHIgVGhlIFVURi04IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciB3b3JkQXJyYXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSh1dGY4U3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKHV0ZjhTdHIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIExhdGluMS5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodXRmOFN0cikpKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGJ1ZmZlcmVkIGJsb2NrIGFsZ29yaXRobSB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBUaGUgcHJvcGVydHkgYmxvY2tTaXplIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBjb25jcmV0ZSBzdWJ0eXBlLlxuXHQgICAgICpcblx0ICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBfbWluQnVmZmVyU2l6ZSBUaGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHNob3VsZCBiZSBrZXB0IHVucHJvY2Vzc2VkIGluIHRoZSBidWZmZXIuIERlZmF1bHQ6IDBcblx0ICAgICAqL1xuXHQgICAgdmFyIEJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0gPSBDX2xpYi5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtID0gQmFzZS5leHRlbmQoe1xuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFJlc2V0cyB0aGlzIGJsb2NrIGFsZ29yaXRobSdzIGRhdGEgYnVmZmVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBidWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0KCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdGhpcy5fZGF0YSA9IG5ldyBXb3JkQXJyYXkuaW5pdCgpO1xuXHQgICAgICAgICAgICB0aGlzLl9uRGF0YUJ5dGVzID0gMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQWRkcyBuZXcgZGF0YSB0byB0aGlzIGJsb2NrIGFsZ29yaXRobSdzIGJ1ZmZlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBhcHBlbmQuIFN0cmluZ3MgYXJlIGNvbnZlcnRlZCB0byBhIFdvcmRBcnJheSB1c2luZyBVVEYtOC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fYXBwZW5kKCdkYXRhJyk7XG5cdCAgICAgICAgICogICAgIGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX2FwcGVuZCh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9hcHBlbmQ6IGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIFdvcmRBcnJheSwgZWxzZSBhc3N1bWUgV29yZEFycmF5IGFscmVhZHlcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICBkYXRhID0gVXRmOC5wYXJzZShkYXRhKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIEFwcGVuZFxuXHQgICAgICAgICAgICB0aGlzLl9kYXRhLmNvbmNhdChkYXRhKTtcblx0ICAgICAgICAgICAgdGhpcy5fbkRhdGFCeXRlcyArPSBkYXRhLnNpZ0J5dGVzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBQcm9jZXNzZXMgYXZhaWxhYmxlIGRhdGEgYmxvY2tzLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBfZG9Qcm9jZXNzQmxvY2sob2Zmc2V0KSwgd2hpY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIGNvbmNyZXRlIHN1YnR5cGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRvRmx1c2ggV2hldGhlciBhbGwgYmxvY2tzIGFuZCBwYXJ0aWFsIGJsb2NrcyBzaG91bGQgYmUgcHJvY2Vzc2VkLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgcHJvY2Vzc2VkIGRhdGEuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBwcm9jZXNzZWREYXRhID0gYnVmZmVyZWRCbG9ja0FsZ29yaXRobS5fcHJvY2VzcygpO1xuXHQgICAgICAgICAqICAgICB2YXIgcHJvY2Vzc2VkRGF0YSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uX3Byb2Nlc3MoISEnZmx1c2gnKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBfcHJvY2VzczogZnVuY3Rpb24gKGRvRmx1c2gpIHtcblx0ICAgICAgICAgICAgdmFyIHByb2Nlc3NlZFdvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cdCAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXHQgICAgICAgICAgICB2YXIgZGF0YVNpZ0J5dGVzID0gZGF0YS5zaWdCeXRlcztcblx0ICAgICAgICAgICAgdmFyIGJsb2NrU2l6ZSA9IHRoaXMuYmxvY2tTaXplO1xuXHQgICAgICAgICAgICB2YXIgYmxvY2tTaXplQnl0ZXMgPSBibG9ja1NpemUgKiA0O1xuXG5cdCAgICAgICAgICAgIC8vIENvdW50IGJsb2NrcyByZWFkeVxuXHQgICAgICAgICAgICB2YXIgbkJsb2Nrc1JlYWR5ID0gZGF0YVNpZ0J5dGVzIC8gYmxvY2tTaXplQnl0ZXM7XG5cdCAgICAgICAgICAgIGlmIChkb0ZsdXNoKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBSb3VuZCB1cCB0byBpbmNsdWRlIHBhcnRpYWwgYmxvY2tzXG5cdCAgICAgICAgICAgICAgICBuQmxvY2tzUmVhZHkgPSBNYXRoLmNlaWwobkJsb2Nrc1JlYWR5KTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIFJvdW5kIGRvd24gdG8gaW5jbHVkZSBvbmx5IGZ1bGwgYmxvY2tzLFxuXHQgICAgICAgICAgICAgICAgLy8gbGVzcyB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IG11c3QgcmVtYWluIGluIHRoZSBidWZmZXJcblx0ICAgICAgICAgICAgICAgIG5CbG9ja3NSZWFkeSA9IE1hdGgubWF4KChuQmxvY2tzUmVhZHkgfCAwKSAtIHRoaXMuX21pbkJ1ZmZlclNpemUsIDApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gQ291bnQgd29yZHMgcmVhZHlcblx0ICAgICAgICAgICAgdmFyIG5Xb3Jkc1JlYWR5ID0gbkJsb2Nrc1JlYWR5ICogYmxvY2tTaXplO1xuXG5cdCAgICAgICAgICAgIC8vIENvdW50IGJ5dGVzIHJlYWR5XG5cdCAgICAgICAgICAgIHZhciBuQnl0ZXNSZWFkeSA9IE1hdGgubWluKG5Xb3Jkc1JlYWR5ICogNCwgZGF0YVNpZ0J5dGVzKTtcblxuXHQgICAgICAgICAgICAvLyBQcm9jZXNzIGJsb2Nrc1xuXHQgICAgICAgICAgICBpZiAobldvcmRzUmVhZHkpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IG5Xb3Jkc1JlYWR5OyBvZmZzZXQgKz0gYmxvY2tTaXplKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1hbGdvcml0aG0gbG9naWNcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb1Byb2Nlc3NCbG9jayhkYXRhV29yZHMsIG9mZnNldCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBwcm9jZXNzZWQgd29yZHNcblx0ICAgICAgICAgICAgICAgIHByb2Nlc3NlZFdvcmRzID0gZGF0YVdvcmRzLnNwbGljZSgwLCBuV29yZHNSZWFkeSk7XG5cdCAgICAgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzIC09IG5CeXRlc1JlYWR5O1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIHByb2Nlc3NlZCB3b3Jkc1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFdvcmRBcnJheS5pbml0KHByb2Nlc3NlZFdvcmRzLCBuQnl0ZXNSZWFkeSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgY2xvbmUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBjbG9uZSA9IGJ1ZmZlcmVkQmxvY2tBbGdvcml0aG0uY2xvbmUoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBCYXNlLmNsb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGNsb25lLl9kYXRhID0gdGhpcy5fZGF0YS5jbG9uZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBjbG9uZTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX21pbkJ1ZmZlclNpemU6IDBcblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIEFic3RyYWN0IGhhc2hlciB0ZW1wbGF0ZS5cblx0ICAgICAqXG5cdCAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYmxvY2tTaXplIFRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIHRoaXMgaGFzaGVyIG9wZXJhdGVzIG9uLiBEZWZhdWx0OiAxNiAoNTEyIGJpdHMpXG5cdCAgICAgKi9cblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXIgPSBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGNmZzogQmFzZS5leHRlbmQoKSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBoYXNoZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgaGFzaCBjb21wdXRhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2hlciA9IENyeXB0b0pTLmFsZ28uU0hBMjU2LmNyZWF0ZSgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjZmcpIHtcblx0ICAgICAgICAgICAgLy8gQXBwbHkgY29uZmlnIGRlZmF1bHRzXG5cdCAgICAgICAgICAgIHRoaXMuY2ZnID0gdGhpcy5jZmcuZXh0ZW5kKGNmZyk7XG5cblx0ICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgaGFzaGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLyBSZXNldCBkYXRhIGJ1ZmZlclxuXHQgICAgICAgICAgICBCdWZmZXJlZEJsb2NrQWxnb3JpdGhtLnJlc2V0LmNhbGwodGhpcyk7XG5cblx0ICAgICAgICAgICAgLy8gUGVyZm9ybSBjb25jcmV0ZS1oYXNoZXIgbG9naWNcblx0ICAgICAgICAgICAgdGhpcy5fZG9SZXNldCgpO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBVcGRhdGVzIHRoaXMgaGFzaGVyIHdpdGggYSBtZXNzYWdlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIFRoZSBtZXNzYWdlIHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0hhc2hlcn0gVGhpcyBoYXNoZXIuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIGhhc2hlci51cGRhdGUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgaGFzaGVyLnVwZGF0ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gQXBwZW5kXG5cdCAgICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTtcblxuXHQgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGhhc2hcblx0ICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG5cdCAgICAgICAgICAgIC8vIENoYWluYWJsZVxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRmluYWxpemVzIHRoZSBoYXNoIGNvbXB1dGF0aW9uLlxuXHQgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgZmluYWxpemUgb3BlcmF0aW9uIGlzIGVmZmVjdGl2ZWx5IGEgZGVzdHJ1Y3RpdmUsIHJlYWQtb25jZSBvcGVyYXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IG1lc3NhZ2VVcGRhdGUgKE9wdGlvbmFsKSBBIGZpbmFsIG1lc3NhZ2UgdXBkYXRlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhhc2ggPSBoYXNoZXIuZmluYWxpemUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgLy8gRmluYWwgbWVzc2FnZSB1cGRhdGVcblx0ICAgICAgICAgICAgaWYgKG1lc3NhZ2VVcGRhdGUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZChtZXNzYWdlVXBkYXRlKTtcblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIFBlcmZvcm0gY29uY3JldGUtaGFzaGVyIGxvZ2ljXG5cdCAgICAgICAgICAgIHZhciBoYXNoID0gdGhpcy5fZG9GaW5hbGl6ZSgpO1xuXG5cdCAgICAgICAgICAgIHJldHVybiBoYXNoO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBibG9ja1NpemU6IDUxMi8zMixcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENyZWF0ZXMgYSBzaG9ydGN1dCBmdW5jdGlvbiB0byBhIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoZXIgdG8gY3JlYXRlIGEgaGVscGVyIGZvci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgc2hvcnRjdXQgZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBTSEEyNTYgPSBDcnlwdG9KUy5saWIuSGFzaGVyLl9jcmVhdGVIZWxwZXIoQ3J5cHRvSlMuYWxnby5TSEEyNTYpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIF9jcmVhdGVIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlLCBjZmcpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaGFzaGVyLmluaXQoY2ZnKS5maW5hbGl6ZShtZXNzYWdlKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ3JlYXRlcyBhIHNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBITUFDJ3Mgb2JqZWN0IGludGVyZmFjZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2hlciB0byB1c2UgaW4gdGhpcyBITUFDIGhlbHBlci5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgc2hvcnRjdXQgZnVuY3Rpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAc3RhdGljXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBIbWFjU0hBMjU2ID0gQ3J5cHRvSlMubGliLkhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihDcnlwdG9KUy5hbGdvLlNIQTI1Nik7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgX2NyZWF0ZUhtYWNIZWxwZXI6IGZ1bmN0aW9uIChoYXNoZXIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlLCBrZXkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ19hbGdvLkhNQUMuaW5pdChoYXNoZXIsIGtleSkuZmluYWxpemUobWVzc2FnZSk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogQWxnb3JpdGhtIG5hbWVzcGFjZS5cblx0ICAgICAqL1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbyA9IHt9O1xuXG5cdCAgICByZXR1cm4gQztcblx0fShNYXRoKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlM7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgQ19lbmMgPSBDLmVuYztcblxuXHQgICAgLyoqXG5cdCAgICAgKiBCYXNlNjQgZW5jb2Rpbmcgc3RyYXRlZ3kuXG5cdCAgICAgKi9cblx0ICAgIHZhciBCYXNlNjQgPSBDX2VuYy5CYXNlNjQgPSB7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29udmVydHMgYSB3b3JkIGFycmF5IHRvIGEgQmFzZTY0IHN0cmluZy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fSB3b3JkQXJyYXkgVGhlIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBCYXNlNjQgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHN0YXRpY1xuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgYmFzZTY0U3RyaW5nID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5zdHJpbmdpZnkod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uICh3b3JkQXJyYXkpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciB3b3JkcyA9IHdvcmRBcnJheS53b3Jkcztcblx0ICAgICAgICAgICAgdmFyIHNpZ0J5dGVzID0gd29yZEFycmF5LnNpZ0J5dGVzO1xuXHQgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbWFwO1xuXG5cdCAgICAgICAgICAgIC8vIENsYW1wIGV4Y2VzcyBiaXRzXG5cdCAgICAgICAgICAgIHdvcmRBcnJheS5jbGFtcCgpO1xuXG5cdCAgICAgICAgICAgIC8vIENvbnZlcnRcblx0ICAgICAgICAgICAgdmFyIGJhc2U2NENoYXJzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2lnQnl0ZXM7IGkgKz0gMykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGJ5dGUxID0gKHdvcmRzW2kgPj4+IDJdICAgICAgID4+PiAoMjQgLSAoaSAlIDQpICogOCkpICAgICAgICYgMHhmZjtcblx0ICAgICAgICAgICAgICAgIHZhciBieXRlMiA9ICh3b3Jkc1soaSArIDEpID4+PiAyXSA+Pj4gKDI0IC0gKChpICsgMSkgJSA0KSAqIDgpKSAmIDB4ZmY7XG5cdCAgICAgICAgICAgICAgICB2YXIgYnl0ZTMgPSAod29yZHNbKGkgKyAyKSA+Pj4gMl0gPj4+ICgyNCAtICgoaSArIDIpICUgNCkgKiA4KSkgJiAweGZmO1xuXG5cdCAgICAgICAgICAgICAgICB2YXIgdHJpcGxldCA9IChieXRlMSA8PCAxNikgfCAoYnl0ZTIgPDwgOCkgfCBieXRlMztcblxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IChqIDwgNCkgJiYgKGkgKyBqICogMC43NSA8IHNpZ0J5dGVzKTsgaisrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYmFzZTY0Q2hhcnMucHVzaChtYXAuY2hhckF0KCh0cmlwbGV0ID4+PiAoNiAqICgzIC0gaikpKSAmIDB4M2YpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIHZhciBwYWRkaW5nQ2hhciA9IG1hcC5jaGFyQXQoNjQpO1xuXHQgICAgICAgICAgICBpZiAocGFkZGluZ0NoYXIpIHtcblx0ICAgICAgICAgICAgICAgIHdoaWxlIChiYXNlNjRDaGFycy5sZW5ndGggJSA0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYmFzZTY0Q2hhcnMucHVzaChwYWRkaW5nQ2hhcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICByZXR1cm4gYmFzZTY0Q2hhcnMuam9pbignJyk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIENvbnZlcnRzIGEgQmFzZTY0IHN0cmluZyB0byBhIHdvcmQgYXJyYXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0U3RyIFRoZSBCYXNlNjQgc3RyaW5nLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgd29yZCBhcnJheS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBzdGF0aWNcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIHdvcmRBcnJheSA9IENyeXB0b0pTLmVuYy5CYXNlNjQucGFyc2UoYmFzZTY0U3RyaW5nKTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGJhc2U2NFN0cikge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGJhc2U2NFN0ckxlbmd0aCA9IGJhc2U2NFN0ci5sZW5ndGg7XG5cdCAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXA7XG5cdCAgICAgICAgICAgIHZhciByZXZlcnNlTWFwID0gdGhpcy5fcmV2ZXJzZU1hcDtcblxuXHQgICAgICAgICAgICBpZiAoIXJldmVyc2VNYXApIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXZlcnNlTWFwID0gdGhpcy5fcmV2ZXJzZU1hcCA9IFtdO1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbWFwLmxlbmd0aDsgaisrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VNYXBbbWFwLmNoYXJDb2RlQXQoaildID0gajtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBJZ25vcmUgcGFkZGluZ1xuXHQgICAgICAgICAgICB2YXIgcGFkZGluZ0NoYXIgPSBtYXAuY2hhckF0KDY0KTtcblx0ICAgICAgICAgICAgaWYgKHBhZGRpbmdDaGFyKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcGFkZGluZ0luZGV4ID0gYmFzZTY0U3RyLmluZGV4T2YocGFkZGluZ0NoYXIpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHBhZGRpbmdJbmRleCAhPT0gLTEpIHtcblx0ICAgICAgICAgICAgICAgICAgICBiYXNlNjRTdHJMZW5ndGggPSBwYWRkaW5nSW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0XG5cdCAgICAgICAgICAgIHJldHVybiBwYXJzZUxvb3AoYmFzZTY0U3RyLCBiYXNlNjRTdHJMZW5ndGgsIHJldmVyc2VNYXApO1xuXG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9tYXA6ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSdcblx0ICAgIH07XG5cblx0ICAgIGZ1bmN0aW9uIHBhcnNlTG9vcChiYXNlNjRTdHIsIGJhc2U2NFN0ckxlbmd0aCwgcmV2ZXJzZU1hcCkge1xuXHQgICAgICB2YXIgd29yZHMgPSBbXTtcblx0ICAgICAgdmFyIG5CeXRlcyA9IDA7XG5cdCAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmFzZTY0U3RyTGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgIGlmIChpICUgNCkge1xuXHQgICAgICAgICAgICAgIHZhciBiaXRzMSA9IHJldmVyc2VNYXBbYmFzZTY0U3RyLmNoYXJDb2RlQXQoaSAtIDEpXSA8PCAoKGkgJSA0KSAqIDIpO1xuXHQgICAgICAgICAgICAgIHZhciBiaXRzMiA9IHJldmVyc2VNYXBbYmFzZTY0U3RyLmNoYXJDb2RlQXQoaSldID4+PiAoNiAtIChpICUgNCkgKiAyKTtcblx0ICAgICAgICAgICAgICB2YXIgYml0c0NvbWJpbmVkID0gYml0czEgfCBiaXRzMjtcblx0ICAgICAgICAgICAgICB3b3Jkc1tuQnl0ZXMgPj4+IDJdIHw9IGJpdHNDb21iaW5lZCA8PCAoMjQgLSAobkJ5dGVzICUgNCkgKiA4KTtcblx0ICAgICAgICAgICAgICBuQnl0ZXMrKztcblx0ICAgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gV29yZEFycmF5LmNyZWF0ZSh3b3JkcywgbkJ5dGVzKTtcblx0ICAgIH1cblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5lbmMuQmFzZTY0O1xuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHRyZXR1cm4gQ3J5cHRvSlMuZW5jLlV0Zjg7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5LCB1bmRlZikge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSwgcmVxdWlyZShcIi4vc2hhMVwiKSwgcmVxdWlyZShcIi4vaG1hY1wiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCIsIFwiLi9zaGExXCIsIFwiLi9obWFjXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKCkge1xuXHQgICAgLy8gU2hvcnRjdXRzXG5cdCAgICB2YXIgQyA9IENyeXB0b0pTO1xuXHQgICAgdmFyIENfbGliID0gQy5saWI7XG5cdCAgICB2YXIgQmFzZSA9IENfbGliLkJhc2U7XG5cdCAgICB2YXIgV29yZEFycmF5ID0gQ19saWIuV29yZEFycmF5O1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblx0ICAgIHZhciBNRDUgPSBDX2FsZ28uTUQ1O1xuXG5cdCAgICAvKipcblx0ICAgICAqIFRoaXMga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gaXMgbWVhbnQgdG8gY29uZm9ybSB3aXRoIEVWUF9CeXRlc1RvS2V5LlxuXHQgICAgICogd3d3Lm9wZW5zc2wub3JnL2RvY3MvY3J5cHRvL0VWUF9CeXRlc1RvS2V5Lmh0bWxcblx0ICAgICAqL1xuXHQgICAgdmFyIEV2cEtERiA9IENfYWxnby5FdnBLREYgPSBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGtleVNpemUgVGhlIGtleSBzaXplIGluIHdvcmRzIHRvIGdlbmVyYXRlLiBEZWZhdWx0OiA0ICgxMjggYml0cylcblx0ICAgICAgICAgKiBAcHJvcGVydHkge0hhc2hlcn0gaGFzaGVyIFRoZSBoYXNoIGFsZ29yaXRobSB0byB1c2UuIERlZmF1bHQ6IE1ENVxuXHQgICAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpdGVyYXRpb25zIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBwZXJmb3JtLiBEZWZhdWx0OiAxXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY2ZnOiBCYXNlLmV4dGVuZCh7XG5cdCAgICAgICAgICAgIGtleVNpemU6IDEyOC8zMixcblx0ICAgICAgICAgICAgaGFzaGVyOiBNRDUsXG5cdCAgICAgICAgICAgIGl0ZXJhdGlvbnM6IDFcblx0ICAgICAgICB9KSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3bHkgY3JlYXRlZCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgKE9wdGlvbmFsKSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIGRlcml2YXRpb24uXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLkV2cEtERi5jcmVhdGUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGtkZiA9IENyeXB0b0pTLmFsZ28uRXZwS0RGLmNyZWF0ZSh7IGtleVNpemU6IDggfSk7XG5cdCAgICAgICAgICogICAgIHZhciBrZGYgPSBDcnlwdG9KUy5hbGdvLkV2cEtERi5jcmVhdGUoeyBrZXlTaXplOiA4LCBpdGVyYXRpb25zOiAxMDAwIH0pO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChjZmcpIHtcblx0ICAgICAgICAgICAgdGhpcy5jZmcgPSB0aGlzLmNmZy5leHRlbmQoY2ZnKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogRGVyaXZlcyBhIGtleSBmcm9tIGEgcGFzc3dvcmQuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHNhbHQgQSBzYWx0LlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGVyaXZlZCBrZXkuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAZXhhbXBsZVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogICAgIHZhciBrZXkgPSBrZGYuY29tcHV0ZShwYXNzd29yZCwgc2FsdCk7XG5cdCAgICAgICAgICovXG5cdCAgICAgICAgY29tcHV0ZTogZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0KSB7XG5cdCAgICAgICAgICAgIHZhciBibG9jaztcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgY2ZnID0gdGhpcy5jZmc7XG5cblx0ICAgICAgICAgICAgLy8gSW5pdCBoYXNoZXJcblx0ICAgICAgICAgICAgdmFyIGhhc2hlciA9IGNmZy5oYXNoZXIuY3JlYXRlKCk7XG5cblx0ICAgICAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICAgICAgdmFyIGRlcml2ZWRLZXkgPSBXb3JkQXJyYXkuY3JlYXRlKCk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkZXJpdmVkS2V5V29yZHMgPSBkZXJpdmVkS2V5LndvcmRzO1xuXHQgICAgICAgICAgICB2YXIga2V5U2l6ZSA9IGNmZy5rZXlTaXplO1xuXHQgICAgICAgICAgICB2YXIgaXRlcmF0aW9ucyA9IGNmZy5pdGVyYXRpb25zO1xuXG5cdCAgICAgICAgICAgIC8vIEdlbmVyYXRlIGtleVxuXHQgICAgICAgICAgICB3aGlsZSAoZGVyaXZlZEtleVdvcmRzLmxlbmd0aCA8IGtleVNpemUpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChibG9jaykge1xuXHQgICAgICAgICAgICAgICAgICAgIGhhc2hlci51cGRhdGUoYmxvY2spO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYmxvY2sgPSBoYXNoZXIudXBkYXRlKHBhc3N3b3JkKS5maW5hbGl6ZShzYWx0KTtcblx0ICAgICAgICAgICAgICAgIGhhc2hlci5yZXNldCgpO1xuXG5cdCAgICAgICAgICAgICAgICAvLyBJdGVyYXRpb25zXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gaGFzaGVyLmZpbmFsaXplKGJsb2NrKTtcblx0ICAgICAgICAgICAgICAgICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgZGVyaXZlZEtleS5jb25jYXQoYmxvY2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGRlcml2ZWRLZXkuc2lnQnl0ZXMgPSBrZXlTaXplICogNDtcblxuXHQgICAgICAgICAgICByZXR1cm4gZGVyaXZlZEtleTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBEZXJpdmVzIGEga2V5IGZyb20gYSBwYXNzd29yZC5cblx0ICAgICAqXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZC5cblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gc2FsdCBBIHNhbHQuXG5cdCAgICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIChPcHRpb25hbCkgVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UgZm9yIHRoaXMgY29tcHV0YXRpb24uXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgZGVyaXZlZCBrZXkuXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5FdnBLREYocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgICogICAgIHZhciBrZXkgPSBDcnlwdG9KUy5FdnBLREYocGFzc3dvcmQsIHNhbHQsIHsga2V5U2l6ZTogOCB9KTtcblx0ICAgICAqICAgICB2YXIga2V5ID0gQ3J5cHRvSlMuRXZwS0RGKHBhc3N3b3JkLCBzYWx0LCB7IGtleVNpemU6IDgsIGl0ZXJhdGlvbnM6IDEwMDAgfSk7XG5cdCAgICAgKi9cblx0ICAgIEMuRXZwS0RGID0gZnVuY3Rpb24gKHBhc3N3b3JkLCBzYWx0LCBjZmcpIHtcblx0ICAgICAgICByZXR1cm4gRXZwS0RGLmNyZWF0ZShjZmcpLmNvbXB1dGUocGFzc3dvcmQsIHNhbHQpO1xuXHQgICAgfTtcblx0fSgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5FdnBLREY7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBCYXNlID0gQ19saWIuQmFzZTtcblx0ICAgIHZhciBDX2VuYyA9IEMuZW5jO1xuXHQgICAgdmFyIFV0ZjggPSBDX2VuYy5VdGY4O1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgLyoqXG5cdCAgICAgKiBITUFDIGFsZ29yaXRobS5cblx0ICAgICAqL1xuXHQgICAgdmFyIEhNQUMgPSBDX2FsZ28uSE1BQyA9IEJhc2UuZXh0ZW5kKHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbml0aWFsaXplcyBhIG5ld2x5IGNyZWF0ZWQgSE1BQy5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7SGFzaGVyfSBoYXNoZXIgVGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZS5cblx0ICAgICAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgdmFyIGhtYWNIYXNoZXIgPSBDcnlwdG9KUy5hbGdvLkhNQUMuY3JlYXRlKENyeXB0b0pTLmFsZ28uU0hBMjU2LCBrZXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChoYXNoZXIsIGtleSkge1xuXHQgICAgICAgICAgICAvLyBJbml0IGhhc2hlclxuXHQgICAgICAgICAgICBoYXNoZXIgPSB0aGlzLl9oYXNoZXIgPSBuZXcgaGFzaGVyLmluaXQoKTtcblxuXHQgICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBXb3JkQXJyYXksIGVsc2UgYXNzdW1lIFdvcmRBcnJheSBhbHJlYWR5XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSBVdGY4LnBhcnNlKGtleSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIGhhc2hlckJsb2NrU2l6ZSA9IGhhc2hlci5ibG9ja1NpemU7XG5cdCAgICAgICAgICAgIHZhciBoYXNoZXJCbG9ja1NpemVCeXRlcyA9IGhhc2hlckJsb2NrU2l6ZSAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gQWxsb3cgYXJiaXRyYXJ5IGxlbmd0aCBrZXlzXG5cdCAgICAgICAgICAgIGlmIChrZXkuc2lnQnl0ZXMgPiBoYXNoZXJCbG9ja1NpemVCeXRlcykge1xuXHQgICAgICAgICAgICAgICAga2V5ID0gaGFzaGVyLmZpbmFsaXplKGtleSk7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBDbGFtcCBleGNlc3MgYml0c1xuXHQgICAgICAgICAgICBrZXkuY2xhbXAoKTtcblxuXHQgICAgICAgICAgICAvLyBDbG9uZSBrZXkgZm9yIGlubmVyIGFuZCBvdXRlciBwYWRzXG5cdCAgICAgICAgICAgIHZhciBvS2V5ID0gdGhpcy5fb0tleSA9IGtleS5jbG9uZSgpO1xuXHQgICAgICAgICAgICB2YXIgaUtleSA9IHRoaXMuX2lLZXkgPSBrZXkuY2xvbmUoKTtcblxuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dHNcblx0ICAgICAgICAgICAgdmFyIG9LZXlXb3JkcyA9IG9LZXkud29yZHM7XG5cdCAgICAgICAgICAgIHZhciBpS2V5V29yZHMgPSBpS2V5LndvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFhPUiBrZXlzIHdpdGggcGFkIGNvbnN0YW50c1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhc2hlckJsb2NrU2l6ZTsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBvS2V5V29yZHNbaV0gXj0gMHg1YzVjNWM1Yztcblx0ICAgICAgICAgICAgICAgIGlLZXlXb3Jkc1tpXSBePSAweDM2MzYzNjM2O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIG9LZXkuc2lnQnl0ZXMgPSBpS2V5LnNpZ0J5dGVzID0gaGFzaGVyQmxvY2tTaXplQnl0ZXM7XG5cblx0ICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzXG5cdCAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogUmVzZXRzIHRoaXMgSE1BQyB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgaG1hY0hhc2hlci5yZXNldCgpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0XG5cdCAgICAgICAgICAgIHZhciBoYXNoZXIgPSB0aGlzLl9oYXNoZXI7XG5cblx0ICAgICAgICAgICAgLy8gUmVzZXRcblx0ICAgICAgICAgICAgaGFzaGVyLnJlc2V0KCk7XG5cdCAgICAgICAgICAgIGhhc2hlci51cGRhdGUodGhpcy5faUtleSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIC8qKlxuXHQgICAgICAgICAqIFVwZGF0ZXMgdGhpcyBITUFDIHdpdGggYSBtZXNzYWdlLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlVXBkYXRlIFRoZSBtZXNzYWdlIHRvIGFwcGVuZC5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEByZXR1cm4ge0hNQUN9IFRoaXMgSE1BQyBpbnN0YW5jZS5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiAgICAgaG1hY0hhc2hlci51cGRhdGUoJ21lc3NhZ2UnKTtcblx0ICAgICAgICAgKiAgICAgaG1hY0hhc2hlci51cGRhdGUod29yZEFycmF5KTtcblx0ICAgICAgICAgKi9cblx0ICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uIChtZXNzYWdlVXBkYXRlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2hhc2hlci51cGRhdGUobWVzc2FnZVVwZGF0ZSk7XG5cblx0ICAgICAgICAgICAgLy8gQ2hhaW5hYmxlXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBGaW5hbGl6ZXMgdGhlIEhNQUMgY29tcHV0YXRpb24uXG5cdCAgICAgICAgICogTm90ZSB0aGF0IHRoZSBmaW5hbGl6ZSBvcGVyYXRpb24gaXMgZWZmZWN0aXZlbHkgYSBkZXN0cnVjdGl2ZSwgcmVhZC1vbmNlIG9wZXJhdGlvbi5cblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZVVwZGF0ZSAoT3B0aW9uYWwpIEEgZmluYWwgbWVzc2FnZSB1cGRhdGUuXG5cdCAgICAgICAgICpcblx0ICAgICAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogQGV4YW1wbGVcblx0ICAgICAgICAgKlxuXHQgICAgICAgICAqICAgICB2YXIgaG1hYyA9IGhtYWNIYXNoZXIuZmluYWxpemUoKTtcblx0ICAgICAgICAgKiAgICAgdmFyIGhtYWMgPSBobWFjSGFzaGVyLmZpbmFsaXplKCdtZXNzYWdlJyk7XG5cdCAgICAgICAgICogICAgIHZhciBobWFjID0gaG1hY0hhc2hlci5maW5hbGl6ZSh3b3JkQXJyYXkpO1xuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGZpbmFsaXplOiBmdW5jdGlvbiAobWVzc2FnZVVwZGF0ZSkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgaGFzaGVyID0gdGhpcy5faGFzaGVyO1xuXG5cdCAgICAgICAgICAgIC8vIENvbXB1dGUgSE1BQ1xuXHQgICAgICAgICAgICB2YXIgaW5uZXJIYXNoID0gaGFzaGVyLmZpbmFsaXplKG1lc3NhZ2VVcGRhdGUpO1xuXHQgICAgICAgICAgICBoYXNoZXIucmVzZXQoKTtcblx0ICAgICAgICAgICAgdmFyIGhtYWMgPSBoYXNoZXIuZmluYWxpemUodGhpcy5fb0tleS5jbG9uZSgpLmNvbmNhdChpbm5lckhhc2gpKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gaG1hYztcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0fSgpKTtcblxuXG59KSk7IiwiOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcIi4vY29yZVwiKSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTURcblx0XHRkZWZpbmUoW1wiLi9jb3JlXCJdLCBmYWN0b3J5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBHbG9iYWwgKGJyb3dzZXIpXG5cdFx0ZmFjdG9yeShyb290LkNyeXB0b0pTKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoQ3J5cHRvSlMpIHtcblxuXHQoZnVuY3Rpb24gKE1hdGgpIHtcblx0ICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgdmFyIEMgPSBDcnlwdG9KUztcblx0ICAgIHZhciBDX2xpYiA9IEMubGliO1xuXHQgICAgdmFyIFdvcmRBcnJheSA9IENfbGliLldvcmRBcnJheTtcblx0ICAgIHZhciBIYXNoZXIgPSBDX2xpYi5IYXNoZXI7XG5cdCAgICB2YXIgQ19hbGdvID0gQy5hbGdvO1xuXG5cdCAgICAvLyBDb25zdGFudHMgdGFibGVcblx0ICAgIHZhciBUID0gW107XG5cblx0ICAgIC8vIENvbXB1dGUgY29uc3RhbnRzXG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuXHQgICAgICAgICAgICBUW2ldID0gKE1hdGguYWJzKE1hdGguc2luKGkgKyAxKSkgKiAweDEwMDAwMDAwMCkgfCAwO1xuXHQgICAgICAgIH1cblx0ICAgIH0oKSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogTUQ1IGhhc2ggYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgTUQ1ID0gQ19hbGdvLk1ENSA9IEhhc2hlci5leHRlbmQoe1xuXHQgICAgICAgIF9kb1Jlc2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2hhc2ggPSBuZXcgV29yZEFycmF5LmluaXQoW1xuXHQgICAgICAgICAgICAgICAgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSxcblx0ICAgICAgICAgICAgICAgIDB4OThiYWRjZmUsIDB4MTAzMjU0NzZcblx0ICAgICAgICAgICAgXSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTd2FwIGVuZGlhblxuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICAgICAgdmFyIG9mZnNldF9pID0gb2Zmc2V0ICsgaTtcblx0ICAgICAgICAgICAgICAgIHZhciBNX29mZnNldF9pID0gTVtvZmZzZXRfaV07XG5cblx0ICAgICAgICAgICAgICAgIE1bb2Zmc2V0X2ldID0gKFxuXHQgICAgICAgICAgICAgICAgICAgICgoKE1fb2Zmc2V0X2kgPDwgOCkgIHwgKE1fb2Zmc2V0X2kgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAgICAgKCgoTV9vZmZzZXRfaSA8PCAyNCkgfCAoTV9vZmZzZXRfaSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApXG5cdCAgICAgICAgICAgICAgICApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBIID0gdGhpcy5faGFzaC53b3JkcztcblxuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMCAgPSBNW29mZnNldCArIDBdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMSAgPSBNW29mZnNldCArIDFdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMiAgPSBNW29mZnNldCArIDJdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMyAgPSBNW29mZnNldCArIDNdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfNCAgPSBNW29mZnNldCArIDRdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfNSAgPSBNW29mZnNldCArIDVdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfNiAgPSBNW29mZnNldCArIDZdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfNyAgPSBNW29mZnNldCArIDddO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfOCAgPSBNW29mZnNldCArIDhdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfOSAgPSBNW29mZnNldCArIDldO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTAgPSBNW29mZnNldCArIDEwXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzExID0gTVtvZmZzZXQgKyAxMV07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xMiA9IE1bb2Zmc2V0ICsgMTJdO1xuXHQgICAgICAgICAgICB2YXIgTV9vZmZzZXRfMTMgPSBNW29mZnNldCArIDEzXTtcblx0ICAgICAgICAgICAgdmFyIE1fb2Zmc2V0XzE0ID0gTVtvZmZzZXQgKyAxNF07XG5cdCAgICAgICAgICAgIHZhciBNX29mZnNldF8xNSA9IE1bb2Zmc2V0ICsgMTVdO1xuXG5cdCAgICAgICAgICAgIC8vIFdvcmtpbmcgdmFyaWFibGVzXG5cdCAgICAgICAgICAgIHZhciBhID0gSFswXTtcblx0ICAgICAgICAgICAgdmFyIGIgPSBIWzFdO1xuXHQgICAgICAgICAgICB2YXIgYyA9IEhbMl07XG5cdCAgICAgICAgICAgIHZhciBkID0gSFszXTtcblxuXHQgICAgICAgICAgICAvLyBDb21wdXRhdGlvblxuXHQgICAgICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgTV9vZmZzZXRfMCwgIDcsICBUWzBdKTtcblx0ICAgICAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzEsICAxMiwgVFsxXSk7XG5cdCAgICAgICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCBNX29mZnNldF8yLCAgMTcsIFRbMl0pO1xuXHQgICAgICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfMywgIDIyLCBUWzNdKTtcblx0ICAgICAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzQsICA3LCAgVFs0XSk7XG5cdCAgICAgICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCBNX29mZnNldF81LCAgMTIsIFRbNV0pO1xuXHQgICAgICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgTV9vZmZzZXRfNiwgIDE3LCBUWzZdKTtcblx0ICAgICAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzcsICAyMiwgVFs3XSk7XG5cdCAgICAgICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCBNX29mZnNldF84LCAgNywgIFRbOF0pO1xuXHQgICAgICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgTV9vZmZzZXRfOSwgIDEyLCBUWzldKTtcblx0ICAgICAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzEwLCAxNywgVFsxMF0pO1xuXHQgICAgICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTEsIDIyLCBUWzExXSk7XG5cdCAgICAgICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCBNX29mZnNldF8xMiwgNywgIFRbMTJdKTtcblx0ICAgICAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzEzLCAxMiwgVFsxM10pO1xuXHQgICAgICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTQsIDE3LCBUWzE0XSk7XG5cdCAgICAgICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCBNX29mZnNldF8xNSwgMjIsIFRbMTVdKTtcblxuXHQgICAgICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgTV9vZmZzZXRfMSwgIDUsICBUWzE2XSk7XG5cdCAgICAgICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBNX29mZnNldF82LCAgOSwgIFRbMTddKTtcblx0ICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzExLCAxNCwgVFsxOF0pO1xuXHQgICAgICAgICAgICBiID0gR0coYiwgYywgZCwgYSwgTV9vZmZzZXRfMCwgIDIwLCBUWzE5XSk7XG5cdCAgICAgICAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCBNX29mZnNldF81LCAgNSwgIFRbMjBdKTtcblx0ICAgICAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzEwLCA5LCAgVFsyMV0pO1xuXHQgICAgICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgTV9vZmZzZXRfMTUsIDE0LCBUWzIyXSk7XG5cdCAgICAgICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCBNX29mZnNldF80LCAgMjAsIFRbMjNdKTtcblx0ICAgICAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzksICA1LCAgVFsyNF0pO1xuXHQgICAgICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgTV9vZmZzZXRfMTQsIDksICBUWzI1XSk7XG5cdCAgICAgICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCBNX29mZnNldF8zLCAgMTQsIFRbMjZdKTtcblx0ICAgICAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzgsICAyMCwgVFsyN10pO1xuXHQgICAgICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgTV9vZmZzZXRfMTMsIDUsICBUWzI4XSk7XG5cdCAgICAgICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCBNX29mZnNldF8yLCAgOSwgIFRbMjldKTtcblx0ICAgICAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzcsICAxNCwgVFszMF0pO1xuXHQgICAgICAgICAgICBiID0gR0coYiwgYywgZCwgYSwgTV9vZmZzZXRfMTIsIDIwLCBUWzMxXSk7XG5cblx0ICAgICAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzUsICA0LCAgVFszMl0pO1xuXHQgICAgICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgTV9vZmZzZXRfOCwgIDExLCBUWzMzXSk7XG5cdCAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF8xMSwgMTYsIFRbMzRdKTtcblx0ICAgICAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzE0LCAyMywgVFszNV0pO1xuXHQgICAgICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgTV9vZmZzZXRfMSwgIDQsICBUWzM2XSk7XG5cdCAgICAgICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCBNX29mZnNldF80LCAgMTEsIFRbMzddKTtcblx0ICAgICAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzcsICAxNiwgVFszOF0pO1xuXHQgICAgICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTAsIDIzLCBUWzM5XSk7XG5cdCAgICAgICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCBNX29mZnNldF8xMywgNCwgIFRbNDBdKTtcblx0ICAgICAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzAsICAxMSwgVFs0MV0pO1xuXHQgICAgICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgTV9vZmZzZXRfMywgIDE2LCBUWzQyXSk7XG5cdCAgICAgICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCBNX29mZnNldF82LCAgMjMsIFRbNDNdKTtcblx0ICAgICAgICAgICAgYSA9IEhIKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzksICA0LCAgVFs0NF0pO1xuXHQgICAgICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgTV9vZmZzZXRfMTIsIDExLCBUWzQ1XSk7XG5cdCAgICAgICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCBNX29mZnNldF8xNSwgMTYsIFRbNDZdKTtcblx0ICAgICAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzIsICAyMywgVFs0N10pO1xuXG5cdCAgICAgICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCBNX29mZnNldF8wLCAgNiwgIFRbNDhdKTtcblx0ICAgICAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzcsICAxMCwgVFs0OV0pO1xuXHQgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfMTQsIDE1LCBUWzUwXSk7XG5cdCAgICAgICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCBNX29mZnNldF81LCAgMjEsIFRbNTFdKTtcblx0ICAgICAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIE1fb2Zmc2V0XzEyLCA2LCAgVFs1Ml0pO1xuXHQgICAgICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgTV9vZmZzZXRfMywgIDEwLCBUWzUzXSk7XG5cdCAgICAgICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCBNX29mZnNldF8xMCwgMTUsIFRbNTRdKTtcblx0ICAgICAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIE1fb2Zmc2V0XzEsICAyMSwgVFs1NV0pO1xuXHQgICAgICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgTV9vZmZzZXRfOCwgIDYsICBUWzU2XSk7XG5cdCAgICAgICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCBNX29mZnNldF8xNSwgMTAsIFRbNTddKTtcblx0ICAgICAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIE1fb2Zmc2V0XzYsICAxNSwgVFs1OF0pO1xuXHQgICAgICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgTV9vZmZzZXRfMTMsIDIxLCBUWzU5XSk7XG5cdCAgICAgICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCBNX29mZnNldF80LCAgNiwgIFRbNjBdKTtcblx0ICAgICAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIE1fb2Zmc2V0XzExLCAxMCwgVFs2MV0pO1xuXHQgICAgICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgTV9vZmZzZXRfMiwgIDE1LCBUWzYyXSk7XG5cdCAgICAgICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCBNX29mZnNldF85LCAgMjEsIFRbNjNdKTtcblxuXHQgICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZVxuXHQgICAgICAgICAgICBIWzBdID0gKEhbMF0gKyBhKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMV0gPSAoSFsxXSArIGIpIHwgMDtcblx0ICAgICAgICAgICAgSFsyXSA9IChIWzJdICsgYykgfCAwO1xuXHQgICAgICAgICAgICBIWzNdID0gKEhbM10gKyBkKSB8IDA7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb0ZpbmFsaXplOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIFNob3J0Y3V0c1xuXHQgICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cdCAgICAgICAgICAgIHZhciBkYXRhV29yZHMgPSBkYXRhLndvcmRzO1xuXG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsID0gdGhpcy5fbkRhdGFCeXRlcyAqIDg7XG5cdCAgICAgICAgICAgIHZhciBuQml0c0xlZnQgPSBkYXRhLnNpZ0J5dGVzICogODtcblxuXHQgICAgICAgICAgICAvLyBBZGQgcGFkZGluZ1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbbkJpdHNMZWZ0ID4+PiA1XSB8PSAweDgwIDw8ICgyNCAtIG5CaXRzTGVmdCAlIDMyKTtcblxuXHQgICAgICAgICAgICB2YXIgbkJpdHNUb3RhbEggPSBNYXRoLmZsb29yKG5CaXRzVG90YWwgLyAweDEwMDAwMDAwMCk7XG5cdCAgICAgICAgICAgIHZhciBuQml0c1RvdGFsTCA9IG5CaXRzVG90YWw7XG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1soKChuQml0c0xlZnQgKyA2NCkgPj4+IDkpIDw8IDQpICsgMTVdID0gKFxuXHQgICAgICAgICAgICAgICAgKCgobkJpdHNUb3RhbEggPDwgOCkgIHwgKG5CaXRzVG90YWxIID4+PiAyNCkpICYgMHgwMGZmMDBmZikgfFxuXHQgICAgICAgICAgICAgICAgKCgobkJpdHNUb3RhbEggPDwgMjQpIHwgKG5CaXRzVG90YWxIID4+PiA4KSkgICYgMHhmZjAwZmYwMClcblx0ICAgICAgICAgICAgKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNF0gPSAoXG5cdCAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsTCA8PCA4KSAgfCAobkJpdHNUb3RhbEwgPj4+IDI0KSkgJiAweDAwZmYwMGZmKSB8XG5cdCAgICAgICAgICAgICAgICAoKChuQml0c1RvdGFsTCA8PCAyNCkgfCAobkJpdHNUb3RhbEwgPj4+IDgpKSAgJiAweGZmMDBmZjAwKVxuXHQgICAgICAgICAgICApO1xuXG5cdCAgICAgICAgICAgIGRhdGEuc2lnQnl0ZXMgPSAoZGF0YVdvcmRzLmxlbmd0aCArIDEpICogNDtcblxuXHQgICAgICAgICAgICAvLyBIYXNoIGZpbmFsIGJsb2Nrc1xuXHQgICAgICAgICAgICB0aGlzLl9wcm9jZXNzKCk7XG5cblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBoYXNoID0gdGhpcy5faGFzaDtcblx0ICAgICAgICAgICAgdmFyIEggPSBoYXNoLndvcmRzO1xuXG5cdCAgICAgICAgICAgIC8vIFN3YXAgZW5kaWFuXG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICAgICAgdmFyIEhfaSA9IEhbaV07XG5cblx0ICAgICAgICAgICAgICAgIEhbaV0gPSAoKChIX2kgPDwgOCkgIHwgKEhfaSA+Pj4gMjQpKSAmIDB4MDBmZjAwZmYpIHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAoKChIX2kgPDwgMjQpIHwgKEhfaSA+Pj4gOCkpICAmIDB4ZmYwMGZmMDApO1xuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgLy8gUmV0dXJuIGZpbmFsIGNvbXB1dGVkIGhhc2hcblx0ICAgICAgICAgICAgcmV0dXJuIGhhc2g7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBjbG9uZSA9IEhhc2hlci5jbG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICBjbG9uZS5faGFzaCA9IHRoaXMuX2hhc2guY2xvbmUoKTtcblxuXHQgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cblx0ICAgIGZ1bmN0aW9uIEZGKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcblx0ICAgICAgICB2YXIgbiA9IGEgKyAoKGIgJiBjKSB8ICh+YiAmIGQpKSArIHggKyB0O1xuXHQgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7XG5cdCAgICB9XG5cblx0ICAgIGZ1bmN0aW9uIEdHKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcblx0ICAgICAgICB2YXIgbiA9IGEgKyAoKGIgJiBkKSB8IChjICYgfmQpKSArIHggKyB0O1xuXHQgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7XG5cdCAgICB9XG5cblx0ICAgIGZ1bmN0aW9uIEhIKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcblx0ICAgICAgICB2YXIgbiA9IGEgKyAoYiBeIGMgXiBkKSArIHggKyB0O1xuXHQgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7XG5cdCAgICB9XG5cblx0ICAgIGZ1bmN0aW9uIElJKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcblx0ICAgICAgICB2YXIgbiA9IGEgKyAoYyBeIChiIHwgfmQpKSArIHggKyB0O1xuXHQgICAgICAgIHJldHVybiAoKG4gPDwgcykgfCAobiA+Pj4gKDMyIC0gcykpKSArIGI7XG5cdCAgICB9XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIGhhc2hlcidzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgaGFzaC5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhhc2ggPSBDcnlwdG9KUy5NRDUoJ21lc3NhZ2UnKTtcblx0ICAgICAqICAgICB2YXIgaGFzaCA9IENyeXB0b0pTLk1ENSh3b3JkQXJyYXkpO1xuXHQgICAgICovXG5cdCAgICBDLk1ENSA9IEhhc2hlci5fY3JlYXRlSGVscGVyKE1ENSk7XG5cblx0ICAgIC8qKlxuXHQgICAgICogU2hvcnRjdXQgZnVuY3Rpb24gdG8gdGhlIEhNQUMncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBrZXkgVGhlIHNlY3JldCBrZXkuXG5cdCAgICAgKlxuXHQgICAgICogQHJldHVybiB7V29yZEFycmF5fSBUaGUgSE1BQy5cblx0ICAgICAqXG5cdCAgICAgKiBAc3RhdGljXG5cdCAgICAgKlxuXHQgICAgICogQGV4YW1wbGVcblx0ICAgICAqXG5cdCAgICAgKiAgICAgdmFyIGhtYWMgPSBDcnlwdG9KUy5IbWFjTUQ1KG1lc3NhZ2UsIGtleSk7XG5cdCAgICAgKi9cblx0ICAgIEMuSG1hY01ENSA9IEhhc2hlci5fY3JlYXRlSG1hY0hlbHBlcihNRDUpO1xuXHR9KE1hdGgpKTtcblxuXG5cdHJldHVybiBDcnlwdG9KUy5NRDU7XG5cbn0pKTsiLCI7KGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuXHRcdC8vIENvbW1vbkpTXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiLi9jb3JlXCIpKTtcblx0fVxuXHRlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRFxuXHRcdGRlZmluZShbXCIuL2NvcmVcIl0sIGZhY3RvcnkpO1xuXHR9XG5cdGVsc2Uge1xuXHRcdC8vIEdsb2JhbCAoYnJvd3Nlcilcblx0XHRmYWN0b3J5KHJvb3QuQ3J5cHRvSlMpO1xuXHR9XG59KHRoaXMsIGZ1bmN0aW9uIChDcnlwdG9KUykge1xuXG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICAvLyBTaG9ydGN1dHNcblx0ICAgIHZhciBDID0gQ3J5cHRvSlM7XG5cdCAgICB2YXIgQ19saWIgPSBDLmxpYjtcblx0ICAgIHZhciBXb3JkQXJyYXkgPSBDX2xpYi5Xb3JkQXJyYXk7XG5cdCAgICB2YXIgSGFzaGVyID0gQ19saWIuSGFzaGVyO1xuXHQgICAgdmFyIENfYWxnbyA9IEMuYWxnbztcblxuXHQgICAgLy8gUmV1c2FibGUgb2JqZWN0XG5cdCAgICB2YXIgVyA9IFtdO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNIQS0xIGhhc2ggYWxnb3JpdGhtLlxuXHQgICAgICovXG5cdCAgICB2YXIgU0hBMSA9IENfYWxnby5TSEExID0gSGFzaGVyLmV4dGVuZCh7XG5cdCAgICAgICAgX2RvUmVzZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5faGFzaCA9IG5ldyBXb3JkQXJyYXkuaW5pdChbXG5cdCAgICAgICAgICAgICAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LFxuXHQgICAgICAgICAgICAgICAgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3Nixcblx0ICAgICAgICAgICAgICAgIDB4YzNkMmUxZjBcblx0ICAgICAgICAgICAgXSk7XG5cdCAgICAgICAgfSxcblxuXHQgICAgICAgIF9kb1Byb2Nlc3NCbG9jazogZnVuY3Rpb24gKE0sIG9mZnNldCkge1xuXHQgICAgICAgICAgICAvLyBTaG9ydGN1dFxuXHQgICAgICAgICAgICB2YXIgSCA9IHRoaXMuX2hhc2gud29yZHM7XG5cblx0ICAgICAgICAgICAgLy8gV29ya2luZyB2YXJpYWJsZXNcblx0ICAgICAgICAgICAgdmFyIGEgPSBIWzBdO1xuXHQgICAgICAgICAgICB2YXIgYiA9IEhbMV07XG5cdCAgICAgICAgICAgIHZhciBjID0gSFsyXTtcblx0ICAgICAgICAgICAgdmFyIGQgPSBIWzNdO1xuXHQgICAgICAgICAgICB2YXIgZSA9IEhbNF07XG5cblx0ICAgICAgICAgICAgLy8gQ29tcHV0YXRpb25cblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA4MDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoaSA8IDE2KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgV1tpXSA9IE1bb2Zmc2V0ICsgaV0gfCAwO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl07XG5cdCAgICAgICAgICAgICAgICAgICAgV1tpXSA9IChuIDw8IDEpIHwgKG4gPj4+IDMxKTtcblx0ICAgICAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAgICAgdmFyIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGUgKyBXW2ldO1xuXHQgICAgICAgICAgICAgICAgaWYgKGkgPCAyMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgKz0gKChiICYgYykgfCAofmIgJiBkKSkgKyAweDVhODI3OTk5O1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgNDApIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ICs9IChiIF4gYyBeIGQpICsgMHg2ZWQ5ZWJhMTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDYwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdCArPSAoKGIgJiBjKSB8IChiICYgZCkgfCAoYyAmIGQpKSAtIDB4NzBlNDQzMjQ7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2UgLyogaWYgKGkgPCA4MCkgKi8ge1xuXHQgICAgICAgICAgICAgICAgICAgIHQgKz0gKGIgXiBjIF4gZCkgLSAweDM1OWQzZTJhO1xuXHQgICAgICAgICAgICAgICAgfVxuXG5cdCAgICAgICAgICAgICAgICBlID0gZDtcblx0ICAgICAgICAgICAgICAgIGQgPSBjO1xuXHQgICAgICAgICAgICAgICAgYyA9IChiIDw8IDMwKSB8IChiID4+PiAyKTtcblx0ICAgICAgICAgICAgICAgIGIgPSBhO1xuXHQgICAgICAgICAgICAgICAgYSA9IHQ7XG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICAvLyBJbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZVxuXHQgICAgICAgICAgICBIWzBdID0gKEhbMF0gKyBhKSB8IDA7XG5cdCAgICAgICAgICAgIEhbMV0gPSAoSFsxXSArIGIpIHwgMDtcblx0ICAgICAgICAgICAgSFsyXSA9IChIWzJdICsgYykgfCAwO1xuXHQgICAgICAgICAgICBIWzNdID0gKEhbM10gKyBkKSB8IDA7XG5cdCAgICAgICAgICAgIEhbNF0gPSAoSFs0XSArIGUpIHwgMDtcblx0ICAgICAgICB9LFxuXG5cdCAgICAgICAgX2RvRmluYWxpemU6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy8gU2hvcnRjdXRzXG5cdCAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZGF0YTtcblx0ICAgICAgICAgICAgdmFyIGRhdGFXb3JkcyA9IGRhdGEud29yZHM7XG5cblx0ICAgICAgICAgICAgdmFyIG5CaXRzVG90YWwgPSB0aGlzLl9uRGF0YUJ5dGVzICogODtcblx0ICAgICAgICAgICAgdmFyIG5CaXRzTGVmdCA9IGRhdGEuc2lnQnl0ZXMgKiA4O1xuXG5cdCAgICAgICAgICAgIC8vIEFkZCBwYWRkaW5nXG5cdCAgICAgICAgICAgIGRhdGFXb3Jkc1tuQml0c0xlZnQgPj4+IDVdIHw9IDB4ODAgPDwgKDI0IC0gbkJpdHNMZWZ0ICUgMzIpO1xuXHQgICAgICAgICAgICBkYXRhV29yZHNbKCgobkJpdHNMZWZ0ICsgNjQpID4+PiA5KSA8PCA0KSArIDE0XSA9IE1hdGguZmxvb3IobkJpdHNUb3RhbCAvIDB4MTAwMDAwMDAwKTtcblx0ICAgICAgICAgICAgZGF0YVdvcmRzWygoKG5CaXRzTGVmdCArIDY0KSA+Pj4gOSkgPDwgNCkgKyAxNV0gPSBuQml0c1RvdGFsO1xuXHQgICAgICAgICAgICBkYXRhLnNpZ0J5dGVzID0gZGF0YVdvcmRzLmxlbmd0aCAqIDQ7XG5cblx0ICAgICAgICAgICAgLy8gSGFzaCBmaW5hbCBibG9ja3Ncblx0ICAgICAgICAgICAgdGhpcy5fcHJvY2VzcygpO1xuXG5cdCAgICAgICAgICAgIC8vIFJldHVybiBmaW5hbCBjb21wdXRlZCBoYXNoXG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNoO1xuXHQgICAgICAgIH0sXG5cblx0ICAgICAgICBjbG9uZTogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgY2xvbmUgPSBIYXNoZXIuY2xvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAgICAgY2xvbmUuX2hhc2ggPSB0aGlzLl9oYXNoLmNsb25lKCk7XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXG5cdCAgICAvKipcblx0ICAgICAqIFNob3J0Y3V0IGZ1bmN0aW9uIHRvIHRoZSBoYXNoZXIncyBvYmplY3QgaW50ZXJmYWNlLlxuXHQgICAgICpcblx0ICAgICAqIEBwYXJhbSB7V29yZEFycmF5fHN0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBoYXNoLlxuXHQgICAgICpcblx0ICAgICAqIEByZXR1cm4ge1dvcmRBcnJheX0gVGhlIGhhc2guXG5cdCAgICAgKlxuXHQgICAgICogQHN0YXRpY1xuXHQgICAgICpcblx0ICAgICAqIEBleGFtcGxlXG5cdCAgICAgKlxuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMSgnbWVzc2FnZScpO1xuXHQgICAgICogICAgIHZhciBoYXNoID0gQ3J5cHRvSlMuU0hBMSh3b3JkQXJyYXkpO1xuXHQgICAgICovXG5cdCAgICBDLlNIQTEgPSBIYXNoZXIuX2NyZWF0ZUhlbHBlcihTSEExKTtcblxuXHQgICAgLyoqXG5cdCAgICAgKiBTaG9ydGN1dCBmdW5jdGlvbiB0byB0aGUgSE1BQydzIG9iamVjdCBpbnRlcmZhY2UuXG5cdCAgICAgKlxuXHQgICAgICogQHBhcmFtIHtXb3JkQXJyYXl8c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGhhc2guXG5cdCAgICAgKiBAcGFyYW0ge1dvcmRBcnJheXxzdHJpbmd9IGtleSBUaGUgc2VjcmV0IGtleS5cblx0ICAgICAqXG5cdCAgICAgKiBAcmV0dXJuIHtXb3JkQXJyYXl9IFRoZSBITUFDLlxuXHQgICAgICpcblx0ICAgICAqIEBzdGF0aWNcblx0ICAgICAqXG5cdCAgICAgKiBAZXhhbXBsZVxuXHQgICAgICpcblx0ICAgICAqICAgICB2YXIgaG1hYyA9IENyeXB0b0pTLkhtYWNTSEExKG1lc3NhZ2UsIGtleSk7XG5cdCAgICAgKi9cblx0ICAgIEMuSG1hY1NIQTEgPSBIYXNoZXIuX2NyZWF0ZUhtYWNIZWxwZXIoU0hBMSk7XG5cdH0oKSk7XG5cblxuXHRyZXR1cm4gQ3J5cHRvSlMuU0hBMTtcblxufSkpOyIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3Qge1xuICAtLWJsYWNrLWExOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xuICAtLWJsYWNrLWEyOiByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIC0tYmxhY2stYTM6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIC0tYmxhY2stYTQ6IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgLS1ibGFjay1hNTogcmdiYSgwLCAwLCAwLCAwLjMpO1xuICAtLWJsYWNrLWE2OiByZ2JhKDAsIDAsIDAsIDAuNCk7XG4gIC0tYmxhY2stYTc6IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgLS1ibGFjay1hODogcmdiYSgwLCAwLCAwLCAwLjYpO1xuICAtLWJsYWNrLWE5OiByZ2JhKDAsIDAsIDAsIDAuNyk7XG4gIC0tYmxhY2stYTEwOiByZ2JhKDAsIDAsIDAsIDAuOCk7XG4gIC0tYmxhY2stYTExOiByZ2JhKDAsIDAsIDAsIDAuOSk7XG4gIC0tYmxhY2stYTEyOiByZ2JhKDAsIDAsIDAsIDAuOTUpO1xufVxuXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSkge1xuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xuICAgIDpyb290IHtcbiAgICAgIC0tYmxhY2stYTE6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjA1KTtcbiAgICAgIC0tYmxhY2stYTI6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjEpO1xuICAgICAgLS1ibGFjay1hMzogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMTUpO1xuICAgICAgLS1ibGFjay1hNDogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMik7XG4gICAgICAtLWJsYWNrLWE1OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4zKTtcbiAgICAgIC0tYmxhY2stYTY6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjQpO1xuICAgICAgLS1ibGFjay1hNzogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuNSk7XG4gICAgICAtLWJsYWNrLWE4OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC42KTtcbiAgICAgIC0tYmxhY2stYTk6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjcpO1xuICAgICAgLS1ibGFjay1hMTA6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjgpO1xuICAgICAgLS1ibGFjay1hMTE6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjkpO1xuICAgICAgLS1ibGFjay1hMTI6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjk1KTtcbiAgICB9XG4gIH1cbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL2JsYWNrLWFscGhhLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtFQUNFLCtCQUErQjtFQUMvQiw4QkFBOEI7RUFDOUIsK0JBQStCO0VBQy9CLDhCQUE4QjtFQUM5Qiw4QkFBOEI7RUFDOUIsOEJBQThCO0VBQzlCLDhCQUE4QjtFQUM5Qiw4QkFBOEI7RUFDOUIsOEJBQThCO0VBQzlCLCtCQUErQjtFQUMvQiwrQkFBK0I7RUFDL0IsZ0NBQWdDO0FBQ2xDOztBQUVBO0VBQ0U7SUFDRTtNQUNFLDBDQUEwQztNQUMxQyx5Q0FBeUM7TUFDekMsMENBQTBDO01BQzFDLHlDQUF5QztNQUN6Qyx5Q0FBeUM7TUFDekMseUNBQXlDO01BQ3pDLHlDQUF5QztNQUN6Qyx5Q0FBeUM7TUFDekMseUNBQXlDO01BQ3pDLDBDQUEwQztNQUMxQywwQ0FBMEM7TUFDMUMsMkNBQTJDO0lBQzdDO0VBQ0Y7QUFDRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI6cm9vdCB7XFxuICAtLWJsYWNrLWExOiByZ2JhKDAsIDAsIDAsIDAuMDUpO1xcbiAgLS1ibGFjay1hMjogcmdiYSgwLCAwLCAwLCAwLjEpO1xcbiAgLS1ibGFjay1hMzogcmdiYSgwLCAwLCAwLCAwLjE1KTtcXG4gIC0tYmxhY2stYTQ6IHJnYmEoMCwgMCwgMCwgMC4yKTtcXG4gIC0tYmxhY2stYTU6IHJnYmEoMCwgMCwgMCwgMC4zKTtcXG4gIC0tYmxhY2stYTY6IHJnYmEoMCwgMCwgMCwgMC40KTtcXG4gIC0tYmxhY2stYTc6IHJnYmEoMCwgMCwgMCwgMC41KTtcXG4gIC0tYmxhY2stYTg6IHJnYmEoMCwgMCwgMCwgMC42KTtcXG4gIC0tYmxhY2stYTk6IHJnYmEoMCwgMCwgMCwgMC43KTtcXG4gIC0tYmxhY2stYTEwOiByZ2JhKDAsIDAsIDAsIDAuOCk7XFxuICAtLWJsYWNrLWExMTogcmdiYSgwLCAwLCAwLCAwLjkpO1xcbiAgLS1ibGFjay1hMTI6IHJnYmEoMCwgMCwgMCwgMC45NSk7XFxufVxcblxcbkBzdXBwb3J0cyAoY29sb3I6IGNvbG9yKGRpc3BsYXktcDMgMSAxIDEpKSB7XFxuICBAbWVkaWEgKGNvbG9yLWdhbXV0OiBwMykge1xcbiAgICA6cm9vdCB7XFxuICAgICAgLS1ibGFjay1hMTogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuMDUpO1xcbiAgICAgIC0tYmxhY2stYTI6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjEpO1xcbiAgICAgIC0tYmxhY2stYTM6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjE1KTtcXG4gICAgICAtLWJsYWNrLWE0OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4yKTtcXG4gICAgICAtLWJsYWNrLWE1OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC4zKTtcXG4gICAgICAtLWJsYWNrLWE2OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC40KTtcXG4gICAgICAtLWJsYWNrLWE3OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC41KTtcXG4gICAgICAtLWJsYWNrLWE4OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC42KTtcXG4gICAgICAtLWJsYWNrLWE5OiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC43KTtcXG4gICAgICAtLWJsYWNrLWExMDogY29sb3IoZGlzcGxheS1wMyAwIDAgMCAvIDAuOCk7XFxuICAgICAgLS1ibGFjay1hMTE6IGNvbG9yKGRpc3BsYXktcDMgMCAwIDAgLyAwLjkpO1xcbiAgICAgIC0tYmxhY2stYTEyOiBjb2xvcihkaXNwbGF5LXAzIDAgMCAwIC8gMC45NSk7XFxuICAgIH1cXG4gIH1cXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcbiAgLS1tYXV2ZS0xOiAjZmRmY2ZkO1xuICAtLW1hdXZlLTI6ICNmYWY5ZmI7XG4gIC0tbWF1dmUtMzogI2YyZWZmMztcbiAgLS1tYXV2ZS00OiAjZWFlN2VjO1xuICAtLW1hdXZlLTU6ICNlM2RmZTY7XG4gIC0tbWF1dmUtNjogI2RiZDhlMDtcbiAgLS1tYXV2ZS03OiAjZDBjZGQ3O1xuICAtLW1hdXZlLTg6ICNiY2JhYzc7XG4gIC0tbWF1dmUtOTogIzhlOGM5OTtcbiAgLS1tYXV2ZS0xMDogIzg0ODI4ZTtcbiAgLS1tYXV2ZS0xMTogIzY1NjM2ZDtcbiAgLS1tYXV2ZS0xMjogIzIxMWYyNjtcbn1cblxuQHN1cHBvcnRzIChjb2xvcjogY29sb3IoZGlzcGxheS1wMyAxIDEgMSkpIHtcbiAgQG1lZGlhIChjb2xvci1nYW11dDogcDMpIHtcbiAgICA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xuICAgICAgLS1tYXV2ZS0xOiBjb2xvcihkaXNwbGF5LXAzIDAuOTkxIDAuOTg4IDAuOTkyKTtcbiAgICAgIC0tbWF1dmUtMjogY29sb3IoZGlzcGxheS1wMyAwLjk4IDAuOTc2IDAuOTg0KTtcbiAgICAgIC0tbWF1dmUtMzogY29sb3IoZGlzcGxheS1wMyAwLjk0NiAwLjkzOCAwLjk1Mik7XG4gICAgICAtLW1hdXZlLTQ6IGNvbG9yKGRpc3BsYXktcDMgMC45MTUgMC45MDYgMC45MjUpO1xuICAgICAgLS1tYXV2ZS01OiBjb2xvcihkaXNwbGF5LXAzIDAuODg2IDAuODc2IDAuOTAxKTtcbiAgICAgIC0tbWF1dmUtNjogY29sb3IoZGlzcGxheS1wMyAwLjg1NiAwLjg0NiAwLjg3NSk7XG4gICAgICAtLW1hdXZlLTc6IGNvbG9yKGRpc3BsYXktcDMgMC44MTQgMC44MDQgMC44NCk7XG4gICAgICAtLW1hdXZlLTg6IGNvbG9yKGRpc3BsYXktcDMgMC43MzUgMC43MjggMC43NzcpO1xuICAgICAgLS1tYXV2ZS05OiBjb2xvcihkaXNwbGF5LXAzIDAuNTU1IDAuNTQ5IDAuNTk2KTtcbiAgICAgIC0tbWF1dmUtMTA6IGNvbG9yKGRpc3BsYXktcDMgMC41MTQgMC41MDggMC41NTIpO1xuICAgICAgLS1tYXV2ZS0xMTogY29sb3IoZGlzcGxheS1wMyAwLjM5NSAwLjM4OCAwLjQyNCk7XG4gICAgICAtLW1hdXZlLTEyOiBjb2xvcihkaXNwbGF5LXAzIDAuMTI4IDAuMTIyIDAuMTQ3KTtcbiAgICB9XG4gIH1cbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL21hdXZlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtFQUNFLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0U7SUFDRTtNQUNFLDhDQUE4QztNQUM5Qyw2Q0FBNkM7TUFDN0MsOENBQThDO01BQzlDLDhDQUE4QztNQUM5Qyw4Q0FBOEM7TUFDOUMsOENBQThDO01BQzlDLDZDQUE2QztNQUM3Qyw4Q0FBOEM7TUFDOUMsOENBQThDO01BQzlDLCtDQUErQztNQUMvQywrQ0FBK0M7TUFDL0MsK0NBQStDO0lBQ2pEO0VBQ0Y7QUFDRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xcbiAgLS1tYXV2ZS0xOiAjZmRmY2ZkO1xcbiAgLS1tYXV2ZS0yOiAjZmFmOWZiO1xcbiAgLS1tYXV2ZS0zOiAjZjJlZmYzO1xcbiAgLS1tYXV2ZS00OiAjZWFlN2VjO1xcbiAgLS1tYXV2ZS01OiAjZTNkZmU2O1xcbiAgLS1tYXV2ZS02OiAjZGJkOGUwO1xcbiAgLS1tYXV2ZS03OiAjZDBjZGQ3O1xcbiAgLS1tYXV2ZS04OiAjYmNiYWM3O1xcbiAgLS1tYXV2ZS05OiAjOGU4Yzk5O1xcbiAgLS1tYXV2ZS0xMDogIzg0ODI4ZTtcXG4gIC0tbWF1dmUtMTE6ICM2NTYzNmQ7XFxuICAtLW1hdXZlLTEyOiAjMjExZjI2O1xcbn1cXG5cXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSkge1xcbiAgQG1lZGlhIChjb2xvci1nYW11dDogcDMpIHtcXG4gICAgOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcXG4gICAgICAtLW1hdXZlLTE6IGNvbG9yKGRpc3BsYXktcDMgMC45OTEgMC45ODggMC45OTIpO1xcbiAgICAgIC0tbWF1dmUtMjogY29sb3IoZGlzcGxheS1wMyAwLjk4IDAuOTc2IDAuOTg0KTtcXG4gICAgICAtLW1hdXZlLTM6IGNvbG9yKGRpc3BsYXktcDMgMC45NDYgMC45MzggMC45NTIpO1xcbiAgICAgIC0tbWF1dmUtNDogY29sb3IoZGlzcGxheS1wMyAwLjkxNSAwLjkwNiAwLjkyNSk7XFxuICAgICAgLS1tYXV2ZS01OiBjb2xvcihkaXNwbGF5LXAzIDAuODg2IDAuODc2IDAuOTAxKTtcXG4gICAgICAtLW1hdXZlLTY6IGNvbG9yKGRpc3BsYXktcDMgMC44NTYgMC44NDYgMC44NzUpO1xcbiAgICAgIC0tbWF1dmUtNzogY29sb3IoZGlzcGxheS1wMyAwLjgxNCAwLjgwNCAwLjg0KTtcXG4gICAgICAtLW1hdXZlLTg6IGNvbG9yKGRpc3BsYXktcDMgMC43MzUgMC43MjggMC43NzcpO1xcbiAgICAgIC0tbWF1dmUtOTogY29sb3IoZGlzcGxheS1wMyAwLjU1NSAwLjU0OSAwLjU5Nik7XFxuICAgICAgLS1tYXV2ZS0xMDogY29sb3IoZGlzcGxheS1wMyAwLjUxNCAwLjUwOCAwLjU1Mik7XFxuICAgICAgLS1tYXV2ZS0xMTogY29sb3IoZGlzcGxheS1wMyAwLjM5NSAwLjM4OCAwLjQyNCk7XFxuICAgICAgLS1tYXV2ZS0xMjogY29sb3IoZGlzcGxheS1wMyAwLjEyOCAwLjEyMiAwLjE0Nyk7XFxuICAgIH1cXG4gIH1cXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcbiAgLS12aW9sZXQtMTogI2ZkZmNmZTtcbiAgLS12aW9sZXQtMjogI2ZhZjhmZjtcbiAgLS12aW9sZXQtMzogI2Y0ZjBmZTtcbiAgLS12aW9sZXQtNDogI2ViZTRmZjtcbiAgLS12aW9sZXQtNTogI2UxZDlmZjtcbiAgLS12aW9sZXQtNjogI2Q0Y2FmZTtcbiAgLS12aW9sZXQtNzogI2MyYjVmNTtcbiAgLS12aW9sZXQtODogI2FhOTllYztcbiAgLS12aW9sZXQtOTogIzZlNTZjZjtcbiAgLS12aW9sZXQtMTA6ICM2NTRkYzQ7XG4gIC0tdmlvbGV0LTExOiAjNjU1MGI5O1xuICAtLXZpb2xldC0xMjogIzJmMjY1Zjtcbn1cblxuQHN1cHBvcnRzIChjb2xvcjogY29sb3IoZGlzcGxheS1wMyAxIDEgMSkpIHtcbiAgQG1lZGlhIChjb2xvci1nYW11dDogcDMpIHtcbiAgICA6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xuICAgICAgLS12aW9sZXQtMTogY29sb3IoZGlzcGxheS1wMyAwLjk5MSAwLjk4OCAwLjk5NSk7XG4gICAgICAtLXZpb2xldC0yOiBjb2xvcihkaXNwbGF5LXAzIDAuOTc4IDAuOTc0IDAuOTk4KTtcbiAgICAgIC0tdmlvbGV0LTM6IGNvbG9yKGRpc3BsYXktcDMgMC45NTMgMC45NDMgMC45OTMpO1xuICAgICAgLS12aW9sZXQtNDogY29sb3IoZGlzcGxheS1wMyAwLjkxNiAwLjg5NyAxKTtcbiAgICAgIC0tdmlvbGV0LTU6IGNvbG9yKGRpc3BsYXktcDMgMC44NzYgMC44NTEgMSk7XG4gICAgICAtLXZpb2xldC02OiBjb2xvcihkaXNwbGF5LXAzIDAuODI1IDAuNzkzIDAuOTgxKTtcbiAgICAgIC0tdmlvbGV0LTc6IGNvbG9yKGRpc3BsYXktcDMgMC43NTIgMC43MTIgMC45NDMpO1xuICAgICAgLS12aW9sZXQtODogY29sb3IoZGlzcGxheS1wMyAwLjY1NCAwLjYwMiAwLjkwMik7XG4gICAgICAtLXZpb2xldC05OiBjb2xvcihkaXNwbGF5LXAzIDAuNDE3IDAuMzQxIDAuNzg0KTtcbiAgICAgIC0tdmlvbGV0LTEwOiBjb2xvcihkaXNwbGF5LXAzIDAuMzgxIDAuMzA2IDAuNzQxKTtcbiAgICAgIC0tdmlvbGV0LTExOiBjb2xvcihkaXNwbGF5LXAzIDAuMzgzIDAuMzE3IDAuNzAyKTtcbiAgICAgIC0tdmlvbGV0LTEyOiBjb2xvcihkaXNwbGF5LXAzIDAuMTc5IDAuMTUgMC4zNTkpO1xuICAgIH1cbiAgfVxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvdmlvbGV0LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtFQUNFLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLG9CQUFvQjtFQUNwQixvQkFBb0I7RUFDcEIsb0JBQW9CO0FBQ3RCOztBQUVBO0VBQ0U7SUFDRTtNQUNFLCtDQUErQztNQUMvQywrQ0FBK0M7TUFDL0MsK0NBQStDO01BQy9DLDJDQUEyQztNQUMzQywyQ0FBMkM7TUFDM0MsK0NBQStDO01BQy9DLCtDQUErQztNQUMvQywrQ0FBK0M7TUFDL0MsK0NBQStDO01BQy9DLGdEQUFnRDtNQUNoRCxnREFBZ0Q7TUFDaEQsK0NBQStDO0lBQ2pEO0VBQ0Y7QUFDRlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI6cm9vdCwgLmxpZ2h0LCAubGlnaHQtdGhlbWUge1xcbiAgLS12aW9sZXQtMTogI2ZkZmNmZTtcXG4gIC0tdmlvbGV0LTI6ICNmYWY4ZmY7XFxuICAtLXZpb2xldC0zOiAjZjRmMGZlO1xcbiAgLS12aW9sZXQtNDogI2ViZTRmZjtcXG4gIC0tdmlvbGV0LTU6ICNlMWQ5ZmY7XFxuICAtLXZpb2xldC02OiAjZDRjYWZlO1xcbiAgLS12aW9sZXQtNzogI2MyYjVmNTtcXG4gIC0tdmlvbGV0LTg6ICNhYTk5ZWM7XFxuICAtLXZpb2xldC05OiAjNmU1NmNmO1xcbiAgLS12aW9sZXQtMTA6ICM2NTRkYzQ7XFxuICAtLXZpb2xldC0xMTogIzY1NTBiOTtcXG4gIC0tdmlvbGV0LTEyOiAjMmYyNjVmO1xcbn1cXG5cXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvcihkaXNwbGF5LXAzIDEgMSAxKSkge1xcbiAgQG1lZGlhIChjb2xvci1nYW11dDogcDMpIHtcXG4gICAgOnJvb3QsIC5saWdodCwgLmxpZ2h0LXRoZW1lIHtcXG4gICAgICAtLXZpb2xldC0xOiBjb2xvcihkaXNwbGF5LXAzIDAuOTkxIDAuOTg4IDAuOTk1KTtcXG4gICAgICAtLXZpb2xldC0yOiBjb2xvcihkaXNwbGF5LXAzIDAuOTc4IDAuOTc0IDAuOTk4KTtcXG4gICAgICAtLXZpb2xldC0zOiBjb2xvcihkaXNwbGF5LXAzIDAuOTUzIDAuOTQzIDAuOTkzKTtcXG4gICAgICAtLXZpb2xldC00OiBjb2xvcihkaXNwbGF5LXAzIDAuOTE2IDAuODk3IDEpO1xcbiAgICAgIC0tdmlvbGV0LTU6IGNvbG9yKGRpc3BsYXktcDMgMC44NzYgMC44NTEgMSk7XFxuICAgICAgLS12aW9sZXQtNjogY29sb3IoZGlzcGxheS1wMyAwLjgyNSAwLjc5MyAwLjk4MSk7XFxuICAgICAgLS12aW9sZXQtNzogY29sb3IoZGlzcGxheS1wMyAwLjc1MiAwLjcxMiAwLjk0Myk7XFxuICAgICAgLS12aW9sZXQtODogY29sb3IoZGlzcGxheS1wMyAwLjY1NCAwLjYwMiAwLjkwMik7XFxuICAgICAgLS12aW9sZXQtOTogY29sb3IoZGlzcGxheS1wMyAwLjQxNyAwLjM0MSAwLjc4NCk7XFxuICAgICAgLS12aW9sZXQtMTA6IGNvbG9yKGRpc3BsYXktcDMgMC4zODEgMC4zMDYgMC43NDEpO1xcbiAgICAgIC0tdmlvbGV0LTExOiBjb2xvcihkaXNwbGF5LXAzIDAuMzgzIDAuMzE3IDAuNzAyKTtcXG4gICAgICAtLXZpb2xldC0xMjogY29sb3IoZGlzcGxheS1wMyAwLjE3OSAwLjE1IDAuMzU5KTtcXG4gICAgfVxcbiAgfVxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGBAY2hhcnNldCBcIlVURi04XCI7XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3LS1kb3duLWFycm93LCAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uOjpiZWZvcmUge1xuICBib3JkZXItY29sb3I6ICNjY2M7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIGJvcmRlci13aWR0aDogM3B4IDNweCAwIDA7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDlweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDZweDtcbiAgd2lkdGg6IDlweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyLXdyYXBwZXIge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogMDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXIge1xuICBmb250LWZhbWlseTogXCJIZWx2ZXRpY2EgTmV1ZVwiLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDAuOHJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY29sb3I6ICMwMDA7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNhZWFlYWU7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGxpbmUtaGVpZ2h0OiBpbml0aWFsO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5IC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciB7XG4gIGJvcmRlci1sZWZ0OiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXItLXRpbWUtb25seSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSxcbi5yZWFjdC1kYXRlcGlja2VyLS10aW1lLW9ubHkgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMC4zcmVtO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXIge1xuICB6LWluZGV4OiAxO1xuICBsaW5lLWhlaWdodDogMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlciAucmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGUge1xuICBzdHJva2U6ICNhZWFlYWU7XG59XG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXJbZGF0YS1wbGFjZW1lbnRePWJvdHRvbV0gLnJlYWN0LWRhdGVwaWNrZXJfX3RyaWFuZ2xlIHtcbiAgZmlsbDogI2YwZjBmMDtcbiAgY29sb3I6ICNmMGYwZjA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXJbZGF0YS1wbGFjZW1lbnRePXRvcF0gLnJlYWN0LWRhdGVwaWNrZXJfX3RyaWFuZ2xlIHtcbiAgZmlsbDogI2ZmZjtcbiAgY29sb3I6ICNmZmY7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWVhZWFlO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwLjNyZW07XG4gIHBhZGRpbmc6IDhweCAwO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lIHtcbiAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgcGFkZGluZy1sZWZ0OiA1cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWU6bm90KC5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWUtLW9ubHkpIHtcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXI6bm90KC5yZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLWhhcy10aW1lLXNlbGVjdCkge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi1jb250YWluZXItLXNlbGVjdCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi1jb250YWluZXItLXNlbGVjdCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2VsZWN0LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tY29udGFpbmVyLS1zY3JvbGwsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tY29udGFpbmVyLS1zY3JvbGwsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi1jb250YWluZXItLXNjcm9sbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luOiAwIDE1cHg7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLFxuLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faGVhZGVyLFxuLnJlYWN0LWRhdGVwaWNrZXIteWVhci1oZWFkZXIge1xuICBtYXJnaW4tdG9wOiAwO1xuICBjb2xvcjogIzAwMDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGZvbnQtc2l6ZTogMC45NDRyZW07XG59XG5cbmgyLnJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlciB7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbiB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDJweDtcbiAgcGFkZGluZzogMDtcbiAgYm9yZGVyOiBub25lO1xuICB6LWluZGV4OiAxO1xuICBoZWlnaHQ6IDMycHg7XG4gIHdpZHRoOiAzMnB4O1xuICB0ZXh0LWluZGVudDogLTk5OWVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXByZXZpb3VzIHtcbiAgbGVmdDogMnB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQge1xuICByaWdodDogMnB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLXdpdGgtdGltZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLW5leHQtLXdpdGgtdG9kYXktYnV0dG9uKSB7XG4gIHJpZ2h0OiA4NXB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IDA7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzIHtcbiAgdG9wOiA0cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcge1xuICB0b3A6IC00cHg7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbjpob3ZlciAqOjpiZWZvcmUge1xuICBib3JkZXItY29sb3I6ICNhNmE2YTY7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogLTFweDtcbiAgZm9udC1zaXplOiAyMHB4O1xuICB3aWR0aDogMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLW5leHQge1xuICBsZWZ0OiAtMnB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tbmV4dDo6YmVmb3JlIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICBsZWZ0OiAtN3B4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tcHJldmlvdXMge1xuICByaWdodDogLTJweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLXByZXZpb3VzOjpiZWZvcmUge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgyMjVkZWcpO1xuICByaWdodDogLTdweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWNvbnRhaW5lciB7XG4gIGZsb2F0OiBsZWZ0O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhciB7XG4gIG1hcmdpbjogMC40cmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBtYXgtd2lkdGg6IDE4MHB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDRyZW07XG4gIG1hcmdpbjogMnB4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgge1xuICBtYXJnaW46IDAuNHJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoIC5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHdpZHRoOiA0cmVtO1xuICBtYXJnaW46IDJweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIHtcbiAgY2xlYXI6IGJvdGg7XG4gIHdpZHRoOiAxMDAlO1xuICBmbG9hdDogbGVmdDtcbiAgbWFyZ2luOiA1cHggMCAxMHB4IDE1cHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9fY2FwdGlvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4tbGVmdDogMTBweDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXQge1xuICB3aWR0aDogYXV0bztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXRbdHlwZT10aW1lXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXRbdHlwZT10aW1lXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgbWFyZ2luOiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dCBpbnB1dFt0eXBlPXRpbWVdIHtcbiAgLW1vei1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2RlbGltaXRlciB7XG4gIG1hcmdpbi1sZWZ0OiA1cHg7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIHtcbiAgZmxvYXQ6IHJpZ2h0O1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNhZWFlYWU7XG4gIHdpZHRoOiA4NXB4O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyLS13aXRoLXRvZGF5LWJ1dHRvbiB7XG4gIGRpc3BsYXk6IGlubGluZTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2FlYWVhZTtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiAtODdweDtcbiAgdG9wOiAwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuM3JlbTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3gge1xuICB3aWR0aDogODVweDtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICBtYXJnaW46IDAgYXV0bztcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3Qge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBtYXJnaW46IDA7XG4gIGhlaWdodDogY2FsYygxOTVweCArIDEuN3JlbSAvIDIpO1xuICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gIHBhZGRpbmctcmlnaHQ6IDA7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0ge1xuICBoZWlnaHQ6IDMwcHg7XG4gIHBhZGRpbmc6IDVweCAxMHB4O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW06aG92ZXIge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tc2VsZWN0ZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xuICBjb2xvcjogd2hpdGU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLXNlbGVjdGVkOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1ib3ggdWwucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0IGxpLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1kaXNhYmxlZCB7XG4gIGNvbG9yOiAjY2NjO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLWRpc2FibGVkOmhvdmVyIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyIHtcbiAgY29sb3I6ICNjY2M7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDEuN3JlbTtcbiAgbGluZS1oZWlnaHQ6IDEuN3JlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBtYXJnaW46IDAuMTY2cmVtO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1jbGlja2FibGUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXIucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWNsaWNrYWJsZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0ta2V5Ym9hcmQtc2VsZWN0ZWQpOmhvdmVyIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcbiAgY29sb3I6ICNmZmY7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzFkNWQ5MDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0ta2V5Ym9hcmQtc2VsZWN0ZWQge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICMyYTg3ZDA7XG4gIGNvbG9yOiAjZmZmO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZXMge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBtYXJnaW4tYm90dG9tOiAtOHB4O1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2VlayB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZSxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1uYW1lIHtcbiAgY29sb3I6ICMwMDA7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDEuN3JlbTtcbiAgbGluZS1oZWlnaHQ6IDEuN3JlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBtYXJnaW46IDAuMTY2cmVtO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dCB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXk6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0OmhvdmVyIHtcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tdG9kYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tdG9kYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS10b2RheSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXRvZGF5IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taGlnaGxpZ2h0ZWQge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICMzZGNjNGE7XG4gIGNvbG9yOiAjZmZmO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMyYmUzZjtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkLWN1c3RvbS0xLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0xLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTEsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMSB7XG4gIGNvbG9yOiBtYWdlbnRhO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0yIHtcbiAgY29sb3I6IGdyZWVuO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXMsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXMsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5cyxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjY4MDM7XG4gIGNvbG9yOiAjZmZmO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXMgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXMgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5cyAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzIC5vdmVybGF5IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDEwMCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xuICBjb2xvcjogI2ZmZjtcbiAgcGFkZGluZzogNHB4O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwcywgb3BhY2l0eSAwLjNzIGVhc2UtaW4tb3V0O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXM6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXM6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1ob2xpZGF5czpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NmNTMwMDtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1ob2xpZGF5czpob3ZlciAub3ZlcmxheSB7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIG9wYWNpdHk6IDE7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RlZCwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSB7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcbiAgY29sb3I6ICNmZmY7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RlZDpob3ZlciwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2U6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1zZWxlY3RlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0ZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1rZXlib2FyZC1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQge1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNiYWQ5ZjE7XG4gIGNvbG9yOiByZ2IoMCwgMCwgMCk7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1rZXlib2FyZC1zZWxlY3RlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMzMsIDEwNywgMTY1LCAwLjUpO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLCAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcbiAgY29sb3I6ICMwMDA7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWQge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIGNvbG9yOiAjY2NjO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tZGlzYWJsZWQ6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1kaXNhYmxlZDpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZCAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZCAub3ZlcmxheSxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkIC5vdmVybGF5LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWQgLm92ZXJsYXkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogNzAlO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcbiAgY29sb3I6ICNmZmY7XG4gIHBhZGRpbmc6IDRweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMHMsIG9wYWNpdHkgMC4zcyBlYXNlLWluLW91dDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMTAwJTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX2NhbGVuZGFyLWljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHBhZGRpbmc6IDAuNXJlbTtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX192aWV3LWNhbGVuZGFyLWljb24gaW5wdXQge1xuICBwYWRkaW5nOiA2cHggMTBweCA1cHggMjVweDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldyB7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldzpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXc6aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXc6aG92ZXIge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3OmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyB7XG4gIGJvcmRlci10b3AtY29sb3I6ICNiM2IzYjM7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3LS1kb3duLWFycm93IHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTtcbiAgcmlnaHQ6IC0xNnB4O1xuICB0b3A6IDA7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiA1MCU7XG4gIGxlZnQ6IDI1JTtcbiAgdG9wOiAzMHB4O1xuICB6LWluZGV4OiAxO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2FlYWVhZTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duOmhvdmVyLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd246aG92ZXIge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi0tc2Nyb2xsYWJsZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1kcm9wZG93bi0tc2Nyb2xsYWJsZSxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLS1zY3JvbGxhYmxlIHtcbiAgaGVpZ2h0OiAxNTBweDtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xufVxuXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb24sXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uIHtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpmaXJzdC1vZi10eXBlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpmaXJzdC1vZi10eXBlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmZpcnN0LW9mLXR5cGUge1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwLjNyZW07XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwLjNyZW07XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246bGFzdC1vZi10eXBlLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpsYXN0LW9mLXR5cGUsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246bGFzdC1vZi10eXBlIHtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAuM3JlbTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuM3JlbTtcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpob3Zlcixcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246aG92ZXIsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyB7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6ICNiM2IzYjM7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzLFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2IzYjNiMztcbn1cbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbi0tc2VsZWN0ZWQsXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLS1zZWxlY3RlZCxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbi0tc2VsZWN0ZWQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDE1cHg7XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiAwO1xuICBvdXRsaW5lOiAwO1xuICBwYWRkaW5nOiAwIDZweCAwIDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb246OmFmdGVyIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xuICBjb2xvcjogI2ZmZjtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBoZWlnaHQ6IDE2cHg7XG4gIHdpZHRoOiAxNnB4O1xuICBwYWRkaW5nOiAycHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgY29udGVudDogXCLDl1wiO1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb24tLWRpc2FibGVkIHtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuLnJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb24tLWRpc2FibGVkOjphZnRlciB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYztcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3RvZGF5LWJ1dHRvbiB7XG4gIGJhY2tncm91bmQ6ICNmMGYwZjA7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYWVhZWFlO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHBhZGRpbmc6IDVweCAwO1xuICBjbGVhcjogbGVmdDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgd2lkdGg6IDEwMHZ3O1xuICBoZWlnaHQ6IDEwMHZoO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHotaW5kZXg6IDIxNDc0ODM2NDc7XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZSxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbmFtZSB7XG4gIHdpZHRoOiAzcmVtO1xuICBsaW5lLWhlaWdodDogM3JlbTtcbn1cbkBtZWRpYSAobWF4LXdpZHRoOiA0MDBweCksIChtYXgtaGVpZ2h0OiA1NTBweCkge1xuICAucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZSxcbiAgLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxuICAucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLW5hbWUge1xuICAgIHdpZHRoOiAycmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAycmVtO1xuICB9XG59XG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoLFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19oZWFkZXIge1xuICBmb250LXNpemU6IDEuNDRyZW07XG59XG5cbi5yZWFjdC1kYXRlcGlja2VyX19jaGlsZHJlbi1jb250YWluZXIge1xuICB3aWR0aDogMTMuOHJlbTtcbiAgbWFyZ2luOiAwLjRyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuMnJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwLjJyZW07XG4gIGhlaWdodDogYXV0bztcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2FyaWEtbGl2ZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgY2xpcC1wYXRoOiBjaXJjbGUoMCk7XG4gIGJvcmRlcjogMDtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMDtcbiAgd2lkdGg6IDFweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLnJlYWN0LWRhdGVwaWNrZXJfX2NhbGVuZGFyLWljb24ge1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgdmVydGljYWwtYWxpZ246IC0wLjEyNWVtO1xufVxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ub2RlX21vZHVsZXMvcmVhY3QtZGF0ZXBpY2tlci9kaXN0L3JlYWN0LWRhdGVwaWNrZXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLGdCQUFnQjtBQUNoQjs7O0VBR0Usa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQix5QkFBeUI7RUFDekIsV0FBVztFQUNYLGNBQWM7RUFDZCxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLFFBQVE7RUFDUixVQUFVO0FBQ1o7QUFDQTtFQUNFLHFCQUFxQjtFQUNyQixVQUFVO0VBQ1YsU0FBUztBQUNYOztBQUVBO0VBQ0UsMkRBQTJEO0VBQzNELGlCQUFpQjtFQUNqQixzQkFBc0I7RUFDdEIsV0FBVztFQUNYLHlCQUF5QjtFQUN6QixxQkFBcUI7RUFDckIscUJBQXFCO0VBQ3JCLGtCQUFrQjtFQUNsQixvQkFBb0I7QUFDdEI7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCO0FBQ0E7O0VBRUUsaUNBQWlDO0VBQ2pDLGtDQUFrQztBQUNwQzs7QUFFQTtFQUNFLFVBQVU7RUFDVixjQUFjO0FBQ2hCO0FBQ0E7RUFDRSxlQUFlO0FBQ2pCO0FBQ0E7RUFDRSxhQUFhO0VBQ2IsY0FBYztBQUNoQjtBQUNBO0VBQ0UsVUFBVTtFQUNWLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQix5QkFBeUI7RUFDekIsZ0NBQWdDO0VBQ2hDLDhCQUE4QjtFQUM5QixjQUFjO0VBQ2Qsa0JBQWtCO0FBQ3BCO0FBQ0E7RUFDRSxtQkFBbUI7RUFDbkIsaUJBQWlCO0VBQ2pCLGtCQUFrQjtBQUNwQjtBQUNBO0VBQ0UseUJBQXlCO0FBQzNCO0FBQ0E7RUFDRSwrQkFBK0I7QUFDakM7O0FBRUE7Ozs7OztFQU1FLHFCQUFxQjtFQUNyQixjQUFjO0FBQ2hCOztBQUVBOzs7RUFHRSxhQUFhO0VBQ2IsV0FBVztFQUNYLGlCQUFpQjtFQUNqQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxVQUFVO0VBQ1YsU0FBUztBQUNYOztBQUVBO0VBQ0UsdUJBQXVCO0VBQ3ZCLG1CQUFtQjtFQUNuQixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxtQkFBbUI7RUFDbkIsZ0JBQWdCO0VBQ2hCLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsa0JBQWtCO0VBQ2xCLGVBQWU7RUFDZixrQkFBa0I7RUFDbEIsUUFBUTtFQUNSLFVBQVU7RUFDVixZQUFZO0VBQ1osVUFBVTtFQUNWLFlBQVk7RUFDWixXQUFXO0VBQ1gsbUJBQW1CO0VBQ25CLGdCQUFnQjtBQUNsQjtBQUNBO0VBQ0UsU0FBUztBQUNYO0FBQ0E7RUFDRSxVQUFVO0FBQ1o7QUFDQTtFQUNFLFdBQVc7QUFDYjtBQUNBO0VBQ0Usa0JBQWtCO0VBQ2xCLE1BQU07RUFDTixjQUFjO0VBQ2QsaUJBQWlCO0VBQ2pCLGtCQUFrQjtBQUNwQjtBQUNBO0VBQ0UsUUFBUTtBQUNWO0FBQ0E7RUFDRSxTQUFTO0FBQ1g7QUFDQTtFQUNFLHFCQUFxQjtBQUN2Qjs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixTQUFTO0VBQ1QsZUFBZTtFQUNmLFFBQVE7QUFDVjtBQUNBO0VBQ0UsVUFBVTtBQUNaO0FBQ0E7RUFDRSx3QkFBd0I7RUFDeEIsVUFBVTtBQUNaO0FBQ0E7RUFDRSxXQUFXO0FBQ2I7QUFDQTtFQUNFLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxXQUFXO0FBQ2I7O0FBRUE7RUFDRSxjQUFjO0VBQ2Qsa0JBQWtCO0FBQ3BCO0FBQ0E7RUFDRSxhQUFhO0VBQ2IsZUFBZTtFQUNmLGdCQUFnQjtBQUNsQjtBQUNBO0VBQ0UscUJBQXFCO0VBQ3JCLFdBQVc7RUFDWCxXQUFXO0FBQ2I7O0FBRUE7RUFDRSxjQUFjO0VBQ2Qsa0JBQWtCO0FBQ3BCO0FBQ0E7O0VBRUUscUJBQXFCO0VBQ3JCLFdBQVc7RUFDWCxXQUFXO0FBQ2I7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsV0FBVztFQUNYLFdBQVc7RUFDWCx1QkFBdUI7RUFDdkIsZ0JBQWdCO0FBQ2xCO0FBQ0E7RUFDRSxxQkFBcUI7QUFDdkI7QUFDQTtFQUNFLHFCQUFxQjtBQUN2QjtBQUNBO0VBQ0UscUJBQXFCO0VBQ3JCLGlCQUFpQjtBQUNuQjtBQUNBO0VBQ0UsV0FBVztBQUNiO0FBQ0E7O0VBRUUsd0JBQXdCO0VBQ3hCLFNBQVM7QUFDWDtBQUNBO0VBQ0UsMEJBQTBCO0FBQzVCO0FBQ0E7RUFDRSxnQkFBZ0I7RUFDaEIscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0UsWUFBWTtFQUNaLDhCQUE4QjtFQUM5QixXQUFXO0FBQ2I7QUFDQTtFQUNFLGVBQWU7RUFDZix5QkFBeUI7RUFDekIscUJBQXFCO0VBQ3JCLGtCQUFrQjtFQUNsQixZQUFZO0VBQ1osTUFBTTtBQUNSO0FBQ0E7RUFDRSxrQkFBa0I7RUFDbEIsaUJBQWlCO0VBQ2pCLGtDQUFrQztBQUNwQztBQUNBO0VBQ0UsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixjQUFjO0VBQ2Qsa0JBQWtCO0VBQ2xCLGtDQUFrQztBQUNwQztBQUNBO0VBQ0UsZ0JBQWdCO0VBQ2hCLFNBQVM7RUFDVCxnQ0FBZ0M7RUFDaEMsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQixlQUFlO0VBQ2YsV0FBVztFQUNYLHVCQUF1QjtBQUN6QjtBQUNBO0VBQ0UsWUFBWTtFQUNaLGlCQUFpQjtFQUNqQixtQkFBbUI7QUFDckI7QUFDQTtFQUNFLGVBQWU7RUFDZix5QkFBeUI7QUFDM0I7QUFDQTtFQUNFLHlCQUF5QjtFQUN6QixZQUFZO0VBQ1osaUJBQWlCO0FBQ25CO0FBQ0E7RUFDRSx5QkFBeUI7QUFDM0I7QUFDQTtFQUNFLFdBQVc7QUFDYjtBQUNBO0VBQ0UsZUFBZTtFQUNmLDZCQUE2QjtBQUMvQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxxQkFBcUI7RUFDckIsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIsZ0JBQWdCO0FBQ2xCO0FBQ0E7RUFDRSxlQUFlO0FBQ2pCO0FBQ0E7O0VBRUUscUJBQXFCO0VBQ3JCLHlCQUF5QjtBQUMzQjtBQUNBO0VBQ0UscUJBQXFCO0VBQ3JCLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7QUFDQTtFQUNFLHlCQUF5QjtBQUMzQjtBQUNBO0VBQ0UscUJBQXFCO0VBQ3JCLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7QUFDQTtFQUNFLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQixtQkFBbUI7QUFDckI7O0FBRUE7RUFDRSxtQkFBbUI7QUFDckI7O0FBRUE7OztFQUdFLFdBQVc7RUFDWCxxQkFBcUI7RUFDckIsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQixrQkFBa0I7RUFDbEIsZ0JBQWdCO0FBQ2xCOztBQUVBOzs7O0VBSUUsZUFBZTtBQUNqQjtBQUNBOzs7O0VBSUUscUJBQXFCO0VBQ3JCLHlCQUF5QjtBQUMzQjtBQUNBOzs7O0VBSUUsaUJBQWlCO0FBQ25CO0FBQ0E7Ozs7RUFJRSxxQkFBcUI7RUFDckIseUJBQXlCO0VBQ3pCLFdBQVc7QUFDYjtBQUNBOzs7O0VBSUUseUJBQXlCO0FBQzNCO0FBQ0E7Ozs7RUFJRSxjQUFjO0FBQ2hCO0FBQ0E7Ozs7RUFJRSxZQUFZO0FBQ2Q7QUFDQTs7OztFQUlFLGtCQUFrQjtFQUNsQixxQkFBcUI7RUFDckIseUJBQXlCO0VBQ3pCLFdBQVc7QUFDYjtBQUNBOzs7O0VBSUUsa0JBQWtCO0VBQ2xCLFlBQVk7RUFDWixTQUFTO0VBQ1QsMkJBQTJCO0VBQzNCLHNCQUFzQjtFQUN0QixXQUFXO0VBQ1gsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLFVBQVU7RUFDVixtREFBbUQ7QUFDckQ7QUFDQTs7OztFQUlFLHlCQUF5QjtBQUMzQjtBQUNBOzs7O0VBSUUsbUJBQW1CO0VBQ25CLFVBQVU7QUFDWjtBQUNBOzs7Ozs7Ozs7O0VBVUUscUJBQXFCO0VBQ3JCLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7QUFDQTs7Ozs7Ozs7OztFQVVFLHlCQUF5QjtBQUMzQjtBQUNBOzs7O0VBSUUscUJBQXFCO0VBQ3JCLHlCQUF5QjtFQUN6QixtQkFBbUI7QUFDckI7QUFDQTs7OztFQUlFLHlCQUF5QjtBQUMzQjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0VBZ0JFLHlDQUF5QztBQUMzQztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBK0JFLHlCQUF5QjtFQUN6QixXQUFXO0FBQ2I7QUFDQTs7OztFQUlFLGVBQWU7RUFDZixXQUFXO0FBQ2I7QUFDQTs7OztFQUlFLDZCQUE2QjtBQUMvQjtBQUNBOzs7O0VBSUUsa0JBQWtCO0VBQ2xCLFdBQVc7RUFDWCxTQUFTO0VBQ1QsMkJBQTJCO0VBQzNCLHNCQUFzQjtFQUN0QixXQUFXO0VBQ1gsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLFVBQVU7RUFDVixtREFBbUQ7QUFDckQ7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIscUJBQXFCO0VBQ3JCLFdBQVc7QUFDYjtBQUNBO0VBQ0Usa0JBQWtCO0VBQ2xCLGVBQWU7RUFDZix1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSwwQkFBMEI7QUFDNUI7O0FBRUE7OztFQUdFLDZCQUE2QjtFQUM3QixxQkFBcUI7RUFDckIsa0JBQWtCO0FBQ3BCO0FBQ0E7OztFQUdFLGVBQWU7QUFDakI7QUFDQTs7Ozs7O0VBTUUseUJBQXlCO0FBQzNCO0FBQ0E7OztFQUdFLHlCQUF5QjtFQUN6QixZQUFZO0VBQ1osTUFBTTtBQUNSOztBQUVBOzs7RUFHRSx5QkFBeUI7RUFDekIsa0JBQWtCO0VBQ2xCLFVBQVU7RUFDVixTQUFTO0VBQ1QsU0FBUztFQUNULFVBQVU7RUFDVixrQkFBa0I7RUFDbEIscUJBQXFCO0VBQ3JCLHlCQUF5QjtBQUMzQjtBQUNBOzs7RUFHRSxlQUFlO0FBQ2pCO0FBQ0E7OztFQUdFLGFBQWE7RUFDYixrQkFBa0I7QUFDcEI7O0FBRUE7OztFQUdFLGlCQUFpQjtFQUNqQixXQUFXO0VBQ1gsY0FBYztFQUNkLGlCQUFpQjtFQUNqQixrQkFBa0I7QUFDcEI7QUFDQTs7O0VBR0UsOEJBQThCO0VBQzlCLCtCQUErQjtBQUNqQztBQUNBOzs7RUFHRSx5QkFBeUI7RUFHekIsaUJBQWlCO0VBQ2pCLGlDQUFpQztFQUNqQyxrQ0FBa0M7QUFDcEM7QUFDQTs7O0VBR0Usc0JBQXNCO0FBQ3hCO0FBQ0E7OztFQUdFLDRCQUE0QjtBQUM5QjtBQUNBOzs7RUFHRSx5QkFBeUI7QUFDM0I7QUFDQTs7O0VBR0Usa0JBQWtCO0VBQ2xCLFVBQVU7QUFDWjs7QUFFQTtFQUNFLGVBQWU7RUFDZiw2QkFBNkI7RUFDN0IsU0FBUztFQUNULFVBQVU7RUFDVixrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLE1BQU07RUFDTixRQUFRO0VBQ1IsWUFBWTtFQUNaLG1CQUFtQjtFQUNuQixzQkFBc0I7QUFDeEI7QUFDQTtFQUNFLGVBQWU7RUFDZix5QkFBeUI7RUFDekIsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixZQUFZO0VBQ1osV0FBVztFQUNYLFlBQVk7RUFDWixlQUFlO0VBQ2YsY0FBYztFQUNkLGtCQUFrQjtFQUNsQixtQkFBbUI7RUFDbkIsc0JBQXNCO0VBQ3RCLFlBQVk7QUFDZDtBQUNBO0VBQ0UsZUFBZTtBQUNqQjtBQUNBO0VBQ0UsZUFBZTtFQUNmLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQiw2QkFBNkI7RUFDN0IsZUFBZTtFQUNmLGtCQUFrQjtFQUNsQixpQkFBaUI7RUFDakIsY0FBYztFQUNkLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGVBQWU7RUFDZixZQUFZO0VBQ1osYUFBYTtFQUNiLG9DQUFvQztFQUNwQyxPQUFPO0VBQ1AsTUFBTTtFQUNOLHVCQUF1QjtFQUN2QixtQkFBbUI7RUFDbkIsYUFBYTtFQUNiLG1CQUFtQjtBQUNyQjtBQUNBOzs7RUFHRSxXQUFXO0VBQ1gsaUJBQWlCO0FBQ25CO0FBQ0E7RUFDRTs7O0lBR0UsV0FBVztJQUNYLGlCQUFpQjtFQUNuQjtBQUNGO0FBQ0E7O0VBRUUsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsY0FBYztFQUNkLGNBQWM7RUFDZCxxQkFBcUI7RUFDckIsb0JBQW9CO0VBQ3BCLFlBQVk7QUFDZDs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixvQkFBb0I7RUFDcEIsU0FBUztFQUNULFdBQVc7RUFDWCxZQUFZO0VBQ1osZ0JBQWdCO0VBQ2hCLFVBQVU7RUFDVixVQUFVO0VBQ1YsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsVUFBVTtFQUNWLFdBQVc7RUFDWCx3QkFBd0I7QUFDMUJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiQGNoYXJzZXQgXFxcIlVURi04XFxcIjtcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXctLWRvd24tYXJyb3csIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb246OmJlZm9yZSB7XFxuICBib3JkZXItY29sb3I6ICNjY2M7XFxuICBib3JkZXItc3R5bGU6IHNvbGlkO1xcbiAgYm9yZGVyLXdpZHRoOiAzcHggM3B4IDAgMDtcXG4gIGNvbnRlbnQ6IFxcXCJcXFwiO1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBoZWlnaHQ6IDlweDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogNnB4O1xcbiAgd2lkdGg6IDlweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXItd3JhcHBlciB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBwYWRkaW5nOiAwO1xcbiAgYm9yZGVyOiAwO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlciB7XFxuICBmb250LWZhbWlseTogXFxcIkhlbHZldGljYSBOZXVlXFxcIiwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc2l6ZTogMC44cmVtO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgYm9yZGVyOiAxcHggc29saWQgI2FlYWVhZTtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGxpbmUtaGVpZ2h0OiBpbml0aWFsO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5IC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciB7XFxuICBib3JkZXItbGVmdDogMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXItLXRpbWUtb25seSAucmVhY3QtZGF0ZXBpY2tlcl9fdGltZSxcXG4ucmVhY3QtZGF0ZXBpY2tlci0tdGltZS1vbmx5IC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB7XFxuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwLjNyZW07XFxuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXIge1xcbiAgei1pbmRleDogMTtcXG4gIGxpbmUtaGVpZ2h0OiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlci1wb3BwZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RyaWFuZ2xlIHtcXG4gIHN0cm9rZTogI2FlYWVhZTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXItcG9wcGVyW2RhdGEtcGxhY2VtZW50Xj1ib3R0b21dIC5yZWFjdC1kYXRlcGlja2VyX190cmlhbmdsZSB7XFxuICBmaWxsOiAjZjBmMGYwO1xcbiAgY29sb3I6ICNmMGYwZjA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyLXBvcHBlcltkYXRhLXBsYWNlbWVudF49dG9wXSAucmVhY3QtZGF0ZXBpY2tlcl9fdHJpYW5nbGUge1xcbiAgZmlsbDogI2ZmZjtcXG4gIGNvbG9yOiAjZmZmO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2FlYWVhZTtcXG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuM3JlbTtcXG4gIHBhZGRpbmc6IDhweCAwO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lIHtcXG4gIHBhZGRpbmctYm90dG9tOiA4cHg7XFxuICBwYWRkaW5nLWxlZnQ6IDVweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tdGltZS0tb25seSkge1xcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlcjpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0taGFzLXRpbWUtc2VsZWN0KSB7XFxuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bi1jb250YWluZXItLXNlbGVjdCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tY29udGFpbmVyLS1zZWxlY3QsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24tY29udGFpbmVyLS1zZWxlY3QsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tY29udGFpbmVyLS1zY3JvbGwsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLWNvbnRhaW5lci0tc2Nyb2xsLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tc2Nyb2xsIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIG1hcmdpbjogMCAxNXB4O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aCxcXG4ucmVhY3QtZGF0ZXBpY2tlci10aW1lX19oZWFkZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXIteWVhci1oZWFkZXIge1xcbiAgbWFyZ2luLXRvcDogMDtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICBmb250LXNpemU6IDAuOTQ0cmVtO1xcbn1cXG5cXG5oMi5yZWFjdC1kYXRlcGlja2VyX19jdXJyZW50LW1vbnRoIHtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlciB7XFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbiB7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMnB4O1xcbiAgcGFkZGluZzogMDtcXG4gIGJvcmRlcjogbm9uZTtcXG4gIHotaW5kZXg6IDE7XFxuICBoZWlnaHQ6IDMycHg7XFxuICB3aWR0aDogMzJweDtcXG4gIHRleHQtaW5kZW50OiAtOTk5ZW07XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tcHJldmlvdXMge1xcbiAgbGVmdDogMnB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dCB7XFxuICByaWdodDogMnB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10aW1lOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10b2RheS1idXR0b24pIHtcXG4gIHJpZ2h0OiA4NXB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgdG9wOiAwO1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzIHtcXG4gIHRvcDogNHB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcge1xcbiAgdG9wOiAtNHB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbjpob3ZlciAqOjpiZWZvcmUge1xcbiAgYm9yZGVyLWNvbG9yOiAjYTZhNmE2O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHRvcDogLTFweDtcXG4gIGZvbnQtc2l6ZTogMjBweDtcXG4gIHdpZHRoOiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1uZXh0IHtcXG4gIGxlZnQ6IC0ycHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb24tLW5leHQ6OmJlZm9yZSB7XFxuICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XFxuICBsZWZ0OiAtN3B4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi1pY29uLS1wcmV2aW91cyB7XFxuICByaWdodDogLTJweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tcHJldmlvdXM6OmJlZm9yZSB7XFxuICB0cmFuc2Zvcm06IHJvdGF0ZSgyMjVkZWcpO1xcbiAgcmlnaHQ6IC03cHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1jb250YWluZXIge1xcbiAgZmxvYXQ6IGxlZnQ7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyIHtcXG4gIG1hcmdpbjogMC40cmVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci13cmFwcGVyIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmbGV4LXdyYXA6IHdyYXA7XFxuICBtYXgtd2lkdGg6IDE4MHB4O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhciAucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0IHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdpZHRoOiA0cmVtO1xcbiAgbWFyZ2luOiAycHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aCB7XFxuICBtYXJnaW46IDAuNHJlbTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aCAucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0IHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdpZHRoOiA0cmVtO1xcbiAgbWFyZ2luOiAycHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciB7XFxuICBjbGVhcjogYm90aDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgZmxvYXQ6IGxlZnQ7XFxuICBtYXJnaW46IDVweCAwIDEwcHggMTVweDtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19jYXB0aW9uIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0LWNvbnRhaW5lciB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQge1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXQge1xcbiAgd2lkdGg6IGF1dG87XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQgaW5wdXRbdHlwZT10aW1lXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IGlucHV0W3R5cGU9dGltZV06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgbWFyZ2luOiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0IGlucHV0W3R5cGU9dGltZV0ge1xcbiAgLW1vei1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC10aW1lLWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlci10aW1lX19pbnB1dC1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXItdGltZV9fZGVsaW1pdGVyIHtcXG4gIG1hcmdpbi1sZWZ0OiA1cHg7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lciB7XFxuICBmbG9hdDogcmlnaHQ7XFxuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNhZWFlYWU7XFxuICB3aWR0aDogODVweDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyLS13aXRoLXRvZGF5LWJ1dHRvbiB7XFxuICBkaXNwbGF5OiBpbmxpbmU7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjYWVhZWFlO1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IC04N3B4O1xcbiAgdG9wOiAwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUge1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgYmFja2dyb3VuZDogd2hpdGU7XFxuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHtcXG4gIHdpZHRoOiA4NXB4O1xcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xcbiAgbWFyZ2luOiAwIGF1dG87XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMC4zcmVtO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCB7XFxuICBsaXN0LXN0eWxlOiBub25lO1xcbiAgbWFyZ2luOiAwO1xcbiAgaGVpZ2h0OiBjYWxjKDE5NXB4ICsgMS43cmVtIC8gMik7XFxuICBvdmVyZmxvdy15OiBzY3JvbGw7XFxuICBwYWRkaW5nLXJpZ2h0OiAwO1xcbiAgcGFkZGluZy1sZWZ0OiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0ge1xcbiAgaGVpZ2h0OiAzMHB4O1xcbiAgcGFkZGluZzogNXB4IDEwcHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbTpob3ZlciB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tc2VsZWN0ZWQge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcXG4gIGNvbG9yOiB3aGl0ZTtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIxNmJhNTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtY29udGFpbmVyIC5yZWFjdC1kYXRlcGlja2VyX190aW1lIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWJveCB1bC5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QgbGkucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLWRpc2FibGVkIHtcXG4gIGNvbG9yOiAjY2NjO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtYm94IHVsLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdCBsaS5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tZGlzYWJsZWQ6aG92ZXIge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlciB7XFxuICBjb2xvcjogI2NjYztcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdpZHRoOiAxLjdyZW07XFxuICBsaW5lLWhlaWdodDogMS43cmVtO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgbWFyZ2luOiAwLjE2NnJlbTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1jbGlja2FibGUge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXIucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWNsaWNrYWJsZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkKTpob3ZlciB7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyMTZiYTU7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1zZWxlY3RlZDpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLWtleWJvYXJkLXNlbGVjdGVkIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMyYTg3ZDA7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyLS1rZXlib2FyZC1zZWxlY3RlZDpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWQ1ZDkwO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWVzIHtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBtYXJnaW4tYm90dG9tOiAtOHB4O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fd2VlayB7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1uYW1lIHtcXG4gIGNvbG9yOiAjMDAwO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgd2lkdGg6IDEuN3JlbTtcXG4gIGxpbmUtaGVpZ2h0OiAxLjdyZW07XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBtYXJnaW46IDAuMTY2cmVtO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dCB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXk6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0OmhvdmVyIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLXRvZGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS10b2RheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS10b2RheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS10b2RheSB7XFxuICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkIHtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzZGNjNGE7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzMmJlM2Y7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWhpZ2hsaWdodGVkLWN1c3RvbS0xLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1oaWdobGlnaHRlZC1jdXN0b20tMSB7XFxuICBjb2xvcjogbWFnZW50YTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taGlnaGxpZ2h0ZWQtY3VzdG9tLTIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0yLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0yLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhpZ2hsaWdodGVkLWN1c3RvbS0yIHtcXG4gIGNvbG9yOiBncmVlbjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXMsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGJvcmRlci1yYWRpdXM6IDAuM3JlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjY4MDM7XFxuICBjb2xvcjogI2ZmZjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXMgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzIC5vdmVybGF5IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJvdHRvbTogMTAwJTtcXG4gIGxlZnQ6IDUwJTtcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMzMzM7XFxuICBjb2xvcjogI2ZmZjtcXG4gIHBhZGRpbmc6IDRweDtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICB2aXNpYmlsaXR5OiBoaWRkZW47XFxuICBvcGFjaXR5OiAwO1xcbiAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwcywgb3BhY2l0eSAwLjNzIGVhc2UtaW4tb3V0O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5czpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taG9saWRheXM6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taG9saWRheXM6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taG9saWRheXM6aG92ZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2NmNTMwMDtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taG9saWRheXM6aG92ZXIgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5LFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWhvbGlkYXlzOmhvdmVyIC5vdmVybGF5IHtcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RlZCwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tc2VsZWN0ZWQsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSB7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xcbiAgY29sb3I6ICNmZmY7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkOmhvdmVyLCAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZTpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1zZWxlY3RlZDpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2U6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tc2VsZWN0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWtleWJvYXJkLXNlbGVjdGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZCB7XFxuICBib3JkZXItcmFkaXVzOiAwLjNyZW07XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmFkOWYxO1xcbiAgY29sb3I6IHJnYigwLCAwLCAwKTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0ta2V5Ym9hcmQtc2VsZWN0ZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICMxZDVkOTA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1yYW5nZSkge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgzMywgMTA3LCAxNjUsIDAuNSk7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSwgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGluZy1yYW5nZSAucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1yYW5nZTpub3QoLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLS1zZWxlY3RpbmctcmFuZ2UgLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2U6bm90KC5yZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UpLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlIC5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWluLXJhbmdlOm5vdCgucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1pbi1zZWxlY3RpbmctcmFuZ2UsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlKSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xcbiAgY29sb3I6ICMwMDA7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19kYXktLWRpc2FibGVkLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1kaXNhYmxlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1kaXNhYmxlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1kaXNhYmxlZCB7XFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxuICBjb2xvcjogI2NjYztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2RheS0tZGlzYWJsZWQ6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWRpc2FibGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWRpc2FibGVkOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWRpc2FibGVkOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZCAub3ZlcmxheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tZGlzYWJsZWQgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tZGlzYWJsZWQgLm92ZXJsYXksXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWQgLm92ZXJsYXkge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm90dG9tOiA3MCU7XFxuICBsZWZ0OiA1MCU7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xcbiAgY29sb3I6ICNmZmY7XFxuICBwYWRkaW5nOiA0cHg7XFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgb3BhY2l0eTogMDtcXG4gIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMHMsIG9wYWNpdHkgMC4zcyBlYXNlLWluLW91dDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lciB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogMTAwJTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lciAucmVhY3QtZGF0ZXBpY2tlcl9fY2FsZW5kYXItaWNvbiB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBwYWRkaW5nOiAwLjVyZW07XFxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3ZpZXctY2FsZW5kYXItaWNvbiBpbnB1dCB7XFxuICBwYWRkaW5nOiA2cHggMTBweCA1cHggMjVweDtcXG59XFxuXFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXcsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3IHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXc6aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldzpob3ZlcixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXc6aG92ZXIge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1yZWFkLXZpZXc6aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldzpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93IHtcXG4gIGJvcmRlci10b3AtY29sb3I6ICNiM2IzYjM7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93LFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvdyB7XFxuICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpO1xcbiAgcmlnaHQ6IC0xNnB4O1xcbiAgdG9wOiAwO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1kcm9wZG93bixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24sXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItZHJvcGRvd24ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHdpZHRoOiA1MCU7XFxuICBsZWZ0OiAyNSU7XFxuICB0b3A6IDMwcHg7XFxuICB6LWluZGV4OiAxO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgYm9yZGVyLXJhZGl1czogMC4zcmVtO1xcbiAgYm9yZGVyOiAxcHggc29saWQgI2FlYWVhZTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd246aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duOmhvdmVyIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tLXNjcm9sbGFibGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLS1zY3JvbGxhYmxlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLS1zY3JvbGxhYmxlIHtcXG4gIGhlaWdodDogMTUwcHg7XFxuICBvdmVyZmxvdy15OiBzY3JvbGw7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbixcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbiB7XFxuICBsaW5lLWhlaWdodDogMjBweDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmZpcnN0LW9mLXR5cGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpmaXJzdC1vZi10eXBlLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpmaXJzdC1vZi10eXBlIHtcXG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAuM3JlbTtcXG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwLjNyZW07XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpsYXN0LW9mLXR5cGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpsYXN0LW9mLXR5cGUsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmxhc3Qtb2YtdHlwZSB7XFxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcbiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcXG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMC4zcmVtO1xcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAuM3JlbTtcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uOmhvdmVyLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246aG92ZXIsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmhvdmVyIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtdXBjb21pbmcsXFxuLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uOmhvdmVyIC5yZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS15ZWFycy11cGNvbWluZyB7XFxuICBib3JkZXItYm90dG9tLWNvbG9yOiAjYjNiM2IzO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb246aG92ZXIgLnJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXByZXZpb3VzLFxcbi5yZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLW9wdGlvbjpob3ZlciAucmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXMge1xcbiAgYm9yZGVyLXRvcC1jb2xvcjogI2IzYjNiMztcXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uLS1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtb3B0aW9uLS1zZWxlY3RlZCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb24tLXNlbGVjdGVkIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDE1cHg7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uIHtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyOiAwO1xcbiAgb3V0bGluZTogMDtcXG4gIHBhZGRpbmc6IDAgNnB4IDAgMDtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogMDtcXG4gIHJpZ2h0OiAwO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19jbG9zZS1pY29uOjphZnRlciB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjE2YmE1O1xcbiAgY29sb3I6ICNmZmY7XFxuICBib3JkZXItcmFkaXVzOiA1MCU7XFxuICBoZWlnaHQ6IDE2cHg7XFxuICB3aWR0aDogMTZweDtcXG4gIHBhZGRpbmc6IDJweDtcXG4gIGZvbnQtc2l6ZTogMTJweDtcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBjb250ZW50OiBcXFwiw5dcXFwiO1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbi0tZGlzYWJsZWQge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbn1cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2xvc2UtaWNvbi0tZGlzYWJsZWQ6OmFmdGVyIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX190b2RheS1idXR0b24ge1xcbiAgYmFja2dyb3VuZDogI2YwZjBmMDtcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYWVhZWFlO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICBwYWRkaW5nOiA1cHggMDtcXG4gIGNsZWFyOiBsZWZ0O1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIHtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIHdpZHRoOiAxMDB2dztcXG4gIGhlaWdodDogMTAwdmg7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiAwO1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgZGlzcGxheTogZmxleDtcXG4gIHotaW5kZXg6IDIxNDc0ODM2NDc7XFxufVxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lLFxcbi5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX190aW1lLW5hbWUge1xcbiAgd2lkdGg6IDNyZW07XFxuICBsaW5lLWhlaWdodDogM3JlbTtcXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDQwMHB4KSwgKG1heC1oZWlnaHQ6IDU1MHB4KSB7XFxuICAucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZSxcXG4gIC5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX2RheSxcXG4gIC5yZWFjdC1kYXRlcGlja2VyX19wb3J0YWwgLnJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbmFtZSB7XFxuICAgIHdpZHRoOiAycmVtO1xcbiAgICBsaW5lLWhlaWdodDogMnJlbTtcXG4gIH1cXG59XFxuLnJlYWN0LWRhdGVwaWNrZXJfX3BvcnRhbCAucmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aCxcXG4ucmVhY3QtZGF0ZXBpY2tlcl9fcG9ydGFsIC5yZWFjdC1kYXRlcGlja2VyLXRpbWVfX2hlYWRlciB7XFxuICBmb250LXNpemU6IDEuNDRyZW07XFxufVxcblxcbi5yZWFjdC1kYXRlcGlja2VyX19jaGlsZHJlbi1jb250YWluZXIge1xcbiAgd2lkdGg6IDEzLjhyZW07XFxuICBtYXJnaW46IDAuNHJlbTtcXG4gIHBhZGRpbmctcmlnaHQ6IDAuMnJlbTtcXG4gIHBhZGRpbmctbGVmdDogMC4ycmVtO1xcbiAgaGVpZ2h0OiBhdXRvO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fYXJpYS1saXZlIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGNsaXAtcGF0aDogY2lyY2xlKDApO1xcbiAgYm9yZGVyOiAwO1xcbiAgaGVpZ2h0OiAxcHg7XFxuICBtYXJnaW46IC0xcHg7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgcGFkZGluZzogMDtcXG4gIHdpZHRoOiAxcHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG5cXG4ucmVhY3QtZGF0ZXBpY2tlcl9fY2FsZW5kYXItaWNvbiB7XFxuICB3aWR0aDogMWVtO1xcbiAgaGVpZ2h0OiAxZW07XFxuICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTI1ZW07XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fIGZyb20gXCIuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzBfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0lMjcyNCUyNyBoZWlnaHQ9JTI3MjQlMjcgc3Ryb2tlPSUyNyUyMzAwMCUyNyB2aWV3Qm94PSUyNzAgMCAyNCAyNCUyNyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyUzRSUzQ3N0eWxlJTNFLnNwaW5uZXJfVjhtMSU3QnRyYW5zZm9ybS1vcmlnaW46Y2VudGVyO2FuaW1hdGlvbjpzcGlubmVyX3pLb2EgMnMgbGluZWFyIGluZmluaXRlJTdELnNwaW5uZXJfVjhtMSBjaXJjbGUlN0JzdHJva2UtbGluZWNhcDpyb3VuZDthbmltYXRpb246c3Bpbm5lcl9ZcFpTIDEuNXMgZWFzZS1vdXQgaW5maW5pdGUlN0QlNDBrZXlmcmFtZXMgc3Bpbm5lcl96S29hJTdCMTAwJTI1JTdCdHJhbnNmb3JtOnJvdGF0ZSUyODM2MGRlZyUyOSU3RCU3RCU0MGtleWZyYW1lcyBzcGlubmVyX1lwWlMlN0IwJTI1JTdCc3Ryb2tlLWRhc2hhcnJheTowIDE1MDtzdHJva2UtZGFzaG9mZnNldDowJTdENDcuNSUyNSU3QnN0cm9rZS1kYXNoYXJyYXk6NDIgMTUwO3N0cm9rZS1kYXNob2Zmc2V0Oi0xNiU3RDk1JTI1JTJDMTAwJTI1JTdCc3Ryb2tlLWRhc2hhcnJheTo0MiAxNTA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTU5JTdEJTdEJTNDJTJGc3R5bGUlM0UlM0NnIGNsYXNzPSUyN3NwaW5uZXJfVjhtMSUyNyUzRSUzQ2NpcmNsZSBjeD0lMjcxMiUyNyBjeT0lMjcxMiUyNyByPSUyNzkuNSUyNyBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjclM0UlM0MlMkZjaXJjbGUlM0UlM0MlMkZnJTNFJTNDJTJGc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB4bWxuczp4bGluaz0lMjdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJTI3IHN0eWxlPSUyN3NoYXBlLXJlbmRlcmluZzogYXV0bzslMjcgd2lkdGg9JTI3MjAwcHglMjcgaGVpZ2h0PSUyNzIwMHB4JTI3IHZpZXdCb3g9JTI3MCAwIDEwMCAxMDAlMjcgcHJlc2VydmVBc3BlY3RSYXRpbz0lMjd4TWlkWU1pZCUyNyUzRSUzQ3BhdGggZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjMwYTBhMGElMjcgc3Ryb2tlLXdpZHRoPSUyNzEwJTI3IHN0cm9rZS1kYXNoYXJyYXk9JTI3MjA1LjI3MTE0MjU3ODEyNSA1MS4zMTc3ODU2NDQ1MzEyNTYlMjcgZD0lMjdNMjQuMyAzMEMxMS40IDMwIDUgNDMuMyA1IDUwczYuNCAyMCAxOS4zIDIwYzE5LjMgMCAzMi4xLTQwIDUxLjQtNDAgQzg4LjYgMzAgOTUgNDMuMyA5NSA1MHMtNi40IDIwLTE5LjMgMjBDNTYuNCA3MCA0My42IDMwIDI0LjMgMzB6JTI3IHN0cm9rZS1saW5lY2FwPSUyN3JvdW5kJTI3IHN0eWxlPSUyN3RyYW5zZm9ybTpzY2FsZSUyODAuOCUyOTt0cmFuc2Zvcm0tb3JpZ2luOjUwcHggNTBweCUyNyUzRSUzQ2FuaW1hdGUgYXR0cmlidXRlTmFtZT0lMjdzdHJva2UtZGFzaG9mZnNldCUyNyByZXBlYXRDb3VudD0lMjdpbmRlZmluaXRlJTI3IGR1cj0lMjcycyUyNyBrZXlUaW1lcz0lMjcwOzElMjcgdmFsdWVzPSUyNzA7MjU2LjU4ODkyODIyMjY1NjI1JTI3JTNFJTNDL2FuaW1hdGUlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMl9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQVNFbEVRVlI0bkdOZ3dBTWtKU1VicEtTa092Q3BJYVQ1UHhTVGJvZ1VRak1ZTXd4ZUlJWG1WRkl4QThVR0REeVFHZzBEbklEaTZKS1VsQ3hITXFDZVpBT2doalNBTUQ1RkFLZmVhVVJkVUZ4Q0FBQUFBRWxGVGtTdVFtQ0NcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzJfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLypcbiEgdGFpbHdpbmRjc3MgdjMuNC4xMCB8IE1JVCBMaWNlbnNlIHwgaHR0cHM6Ly90YWlsd2luZGNzcy5jb21cbiovLypcbjEuIFByZXZlbnQgcGFkZGluZyBhbmQgYm9yZGVyIGZyb20gYWZmZWN0aW5nIGVsZW1lbnQgd2lkdGguIChodHRwczovL2dpdGh1Yi5jb20vbW96ZGV2cy9jc3NyZW1lZHkvaXNzdWVzLzQpXG4yLiBBbGxvdyBhZGRpbmcgYSBib3JkZXIgdG8gYW4gZWxlbWVudCBieSBqdXN0IGFkZGluZyBhIGJvcmRlci13aWR0aC4gKGh0dHBzOi8vZ2l0aHViLmNvbS90YWlsd2luZGNzcy90YWlsd2luZGNzcy9wdWxsLzExNilcbiovXG5cbiosXG46OmJlZm9yZSxcbjo6YWZ0ZXIge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94OyAvKiAxICovXG4gIGJvcmRlci13aWR0aDogMDsgLyogMiAqL1xuICBib3JkZXItc3R5bGU6IHNvbGlkOyAvKiAyICovXG4gIGJvcmRlci1jb2xvcjogI2U1ZTdlYjsgLyogMiAqL1xufVxuXG46OmJlZm9yZSxcbjo6YWZ0ZXIge1xuICAtLXR3LWNvbnRlbnQ6ICcnO1xufVxuXG4vKlxuMS4gVXNlIGEgY29uc2lzdGVudCBzZW5zaWJsZSBsaW5lLWhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXG4yLiBQcmV2ZW50IGFkanVzdG1lbnRzIG9mIGZvbnQgc2l6ZSBhZnRlciBvcmllbnRhdGlvbiBjaGFuZ2VzIGluIGlPUy5cbjMuIFVzZSBhIG1vcmUgcmVhZGFibGUgdGFiIHNpemUuXG40LiBVc2UgdGhlIHVzZXIncyBjb25maWd1cmVkIFxcYHNhbnNcXGAgZm9udC1mYW1pbHkgYnkgZGVmYXVsdC5cbjUuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgc2Fuc1xcYCBmb250LWZlYXR1cmUtc2V0dGluZ3MgYnkgZGVmYXVsdC5cbjYuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgc2Fuc1xcYCBmb250LXZhcmlhdGlvbi1zZXR0aW5ncyBieSBkZWZhdWx0LlxuNy4gRGlzYWJsZSB0YXAgaGlnaGxpZ2h0cyBvbiBpT1NcbiovXG5cbmh0bWwsXG46aG9zdCB7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7IC8qIDEgKi9cbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovIC8qIDMgKi9cbiAgdGFiLXNpemU6IDQ7IC8qIDMgKi9cbiAgZm9udC1mYW1pbHk6IHVpLXNhbnMtc2VyaWYsIHN5c3RlbS11aSwgc2Fucy1zZXJpZiwgXCJBcHBsZSBDb2xvciBFbW9qaVwiLCBcIlNlZ29lIFVJIEVtb2ppXCIsIFwiU2Vnb2UgVUkgU3ltYm9sXCIsIFwiTm90byBDb2xvciBFbW9qaVwiOyAvKiA0ICovXG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogbm9ybWFsOyAvKiA1ICovXG4gIGZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOiBub3JtYWw7IC8qIDYgKi9cbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsgLyogNyAqL1xufVxuXG4vKlxuMS4gUmVtb3ZlIHRoZSBtYXJnaW4gaW4gYWxsIGJyb3dzZXJzLlxuMi4gSW5oZXJpdCBsaW5lLWhlaWdodCBmcm9tIFxcYGh0bWxcXGAgc28gdXNlcnMgY2FuIHNldCB0aGVtIGFzIGEgY2xhc3MgZGlyZWN0bHkgb24gdGhlIFxcYGh0bWxcXGAgZWxlbWVudC5cbiovXG5cbmJvZHkge1xuICBtYXJnaW46IDA7IC8qIDEgKi9cbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IC8qIDIgKi9cbn1cblxuLypcbjEuIEFkZCB0aGUgY29ycmVjdCBoZWlnaHQgaW4gRmlyZWZveC5cbjIuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIG9mIGJvcmRlciBjb2xvciBpbiBGaXJlZm94LiAoaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTkwNjU1KVxuMy4gRW5zdXJlIGhvcml6b250YWwgcnVsZXMgYXJlIHZpc2libGUgYnkgZGVmYXVsdC5cbiovXG5cbmhyIHtcbiAgaGVpZ2h0OiAwOyAvKiAxICovXG4gIGNvbG9yOiBpbmhlcml0OyAvKiAyICovXG4gIGJvcmRlci10b3Atd2lkdGg6IDFweDsgLyogMyAqL1xufVxuXG4vKlxuQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIGFuZCBTYWZhcmkuXG4qL1xuXG5hYmJyOndoZXJlKFt0aXRsZV0pIHtcbiAgLXdlYmtpdC10ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBkb3R0ZWQ7XG4gICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xufVxuXG4vKlxuUmVtb3ZlIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBhbmQgd2VpZ2h0IGZvciBoZWFkaW5ncy5cbiovXG5cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7XG59XG5cbi8qXG5SZXNldCBsaW5rcyB0byBvcHRpbWl6ZSBmb3Igb3B0LWluIHN0eWxpbmcgaW5zdGVhZCBvZiBvcHQtb3V0LlxuKi9cblxuYSB7XG4gIGNvbG9yOiBpbmhlcml0O1xuICB0ZXh0LWRlY29yYXRpb246IGluaGVyaXQ7XG59XG5cbi8qXG5BZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gRWRnZSBhbmQgU2FmYXJpLlxuKi9cblxuYixcbnN0cm9uZyB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkZXI7XG59XG5cbi8qXG4xLiBVc2UgdGhlIHVzZXIncyBjb25maWd1cmVkIFxcYG1vbm9cXGAgZm9udC1mYW1pbHkgYnkgZGVmYXVsdC5cbjIuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgbW9ub1xcYCBmb250LWZlYXR1cmUtc2V0dGluZ3MgYnkgZGVmYXVsdC5cbjMuIFVzZSB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgXFxgbW9ub1xcYCBmb250LXZhcmlhdGlvbi1zZXR0aW5ncyBieSBkZWZhdWx0LlxuNC4gQ29ycmVjdCB0aGUgb2RkIFxcYGVtXFxgIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiovXG5cbmNvZGUsXG5rYmQsXG5zYW1wLFxucHJlIHtcbiAgZm9udC1mYW1pbHk6IHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkxpYmVyYXRpb24gTW9ub1wiLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZTsgLyogMSAqL1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6IG5vcm1hbDsgLyogMiAqL1xuICBmb250LXZhcmlhdGlvbi1zZXR0aW5nczogbm9ybWFsOyAvKiAzICovXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiA0ICovXG59XG5cbi8qXG5BZGQgdGhlIGNvcnJlY3QgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiovXG5cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG5cbi8qXG5QcmV2ZW50IFxcYHN1YlxcYCBhbmQgXFxgc3VwXFxgIGVsZW1lbnRzIGZyb20gYWZmZWN0aW5nIHRoZSBsaW5lIGhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXG4qL1xuXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07XG59XG5cbnN1cCB7XG4gIHRvcDogLTAuNWVtO1xufVxuXG4vKlxuMS4gUmVtb3ZlIHRleHQgaW5kZW50YXRpb24gZnJvbSB0YWJsZSBjb250ZW50cyBpbiBDaHJvbWUgYW5kIFNhZmFyaS4gKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTk5OTA4OCwgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwMTI5NylcbjIuIENvcnJlY3QgdGFibGUgYm9yZGVyIGNvbG9yIGluaGVyaXRhbmNlIGluIGFsbCBDaHJvbWUgYW5kIFNhZmFyaS4gKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTkzNTcyOSwgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5NTAxNilcbjMuIFJlbW92ZSBnYXBzIGJldHdlZW4gdGFibGUgYm9yZGVycyBieSBkZWZhdWx0LlxuKi9cblxudGFibGUge1xuICB0ZXh0LWluZGVudDogMDsgLyogMSAqL1xuICBib3JkZXItY29sb3I6IGluaGVyaXQ7IC8qIDIgKi9cbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgLyogMyAqL1xufVxuXG4vKlxuMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXG4yLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXG4zLiBSZW1vdmUgZGVmYXVsdCBwYWRkaW5nIGluIGFsbCBicm93c2Vycy5cbiovXG5cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0OyAvKiAxICovXG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogaW5oZXJpdDsgLyogMSAqL1xuICBmb250LXZhcmlhdGlvbi1zZXR0aW5nczogaW5oZXJpdDsgLyogMSAqL1xuICBmb250LXNpemU6IDEwMCU7IC8qIDEgKi9cbiAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7IC8qIDEgKi9cbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IC8qIDEgKi9cbiAgbGV0dGVyLXNwYWNpbmc6IGluaGVyaXQ7IC8qIDEgKi9cbiAgY29sb3I6IGluaGVyaXQ7IC8qIDEgKi9cbiAgbWFyZ2luOiAwOyAvKiAyICovXG4gIHBhZGRpbmc6IDA7IC8qIDMgKi9cbn1cblxuLypcblJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSBhbmQgRmlyZWZveC5cbiovXG5cbmJ1dHRvbixcbnNlbGVjdCB7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4vKlxuMS4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cbjIuIFJlbW92ZSBkZWZhdWx0IGJ1dHRvbiBzdHlsZXMuXG4qL1xuXG5idXR0b24sXG5pbnB1dDp3aGVyZShbdHlwZT0nYnV0dG9uJ10pLFxuaW5wdXQ6d2hlcmUoW3R5cGU9J3Jlc2V0J10pLFxuaW5wdXQ6d2hlcmUoW3R5cGU9J3N1Ym1pdCddKSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvKiAxICovXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyAvKiAyICovXG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8qIDIgKi9cbn1cblxuLypcblVzZSB0aGUgbW9kZXJuIEZpcmVmb3ggZm9jdXMgc3R5bGUgZm9yIGFsbCBmb2N1c2FibGUgZWxlbWVudHMuXG4qL1xuXG46LW1vei1mb2N1c3Jpbmcge1xuICBvdXRsaW5lOiBhdXRvO1xufVxuXG4vKlxuUmVtb3ZlIHRoZSBhZGRpdGlvbmFsIFxcYDppbnZhbGlkXFxgIHN0eWxlcyBpbiBGaXJlZm94LiAoaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvZ2Vja28tZGV2L2Jsb2IvMmY5ZWFjZDlkM2Q5OTVjOTM3YjQyNTFhNTU1N2Q5NWQ0OTRjOWJlMS9sYXlvdXQvc3R5bGUvcmVzL2Zvcm1zLmNzcyNMNzI4LUw3MzcpXG4qL1xuXG46LW1vei11aS1pbnZhbGlkIHtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cblxuLypcbkFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lIGFuZCBGaXJlZm94LlxuKi9cblxucHJvZ3Jlc3Mge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbi8qXG5Db3JyZWN0IHRoZSBjdXJzb3Igc3R5bGUgb2YgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYnV0dG9ucyBpbiBTYWZhcmkuXG4qL1xuXG46Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG46Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi8qXG4xLiBDb3JyZWN0IHRoZSBvZGQgYXBwZWFyYW5jZSBpbiBDaHJvbWUgYW5kIFNhZmFyaS5cbjIuIENvcnJlY3QgdGhlIG91dGxpbmUgc3R5bGUgaW4gU2FmYXJpLlxuKi9cblxuW3R5cGU9J3NlYXJjaCddIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7IC8qIDEgKi9cbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IC8qIDIgKi9cbn1cblxuLypcblJlbW92ZSB0aGUgaW5uZXIgcGFkZGluZyBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBtYWNPUy5cbiovXG5cbjo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLypcbjEuIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXG4yLiBDaGFuZ2UgZm9udCBwcm9wZXJ0aWVzIHRvIFxcYGluaGVyaXRcXGAgaW4gU2FmYXJpLlxuKi9cblxuOjotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvKiAxICovXG4gIGZvbnQ6IGluaGVyaXQ7IC8qIDIgKi9cbn1cblxuLypcbkFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIENocm9tZSBhbmQgU2FmYXJpLlxuKi9cblxuc3VtbWFyeSB7XG4gIGRpc3BsYXk6IGxpc3QtaXRlbTtcbn1cblxuLypcblJlbW92ZXMgdGhlIGRlZmF1bHQgc3BhY2luZyBhbmQgYm9yZGVyIGZvciBhcHByb3ByaWF0ZSBlbGVtZW50cy5cbiovXG5cbmJsb2NrcXVvdGUsXG5kbCxcbmRkLFxuaDEsXG5oMixcbmgzLFxuaDQsXG5oNSxcbmg2LFxuaHIsXG5maWd1cmUsXG5wLFxucHJlIHtcbiAgbWFyZ2luOiAwO1xufVxuXG5maWVsZHNldCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxubGVnZW5kIHtcbiAgcGFkZGluZzogMDtcbn1cblxub2wsXG51bCxcbm1lbnUge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi8qXG5SZXNldCBkZWZhdWx0IHN0eWxpbmcgZm9yIGRpYWxvZ3MuXG4qL1xuZGlhbG9nIHtcbiAgcGFkZGluZzogMDtcbn1cblxuLypcblByZXZlbnQgcmVzaXppbmcgdGV4dGFyZWFzIGhvcml6b250YWxseSBieSBkZWZhdWx0LlxuKi9cblxudGV4dGFyZWEge1xuICByZXNpemU6IHZlcnRpY2FsO1xufVxuXG4vKlxuMS4gUmVzZXQgdGhlIGRlZmF1bHQgcGxhY2Vob2xkZXIgb3BhY2l0eSBpbiBGaXJlZm94LiAoaHR0cHM6Ly9naXRodWIuY29tL3RhaWx3aW5kbGFicy90YWlsd2luZGNzcy9pc3N1ZXMvMzMwMClcbjIuIFNldCB0aGUgZGVmYXVsdCBwbGFjZWhvbGRlciBjb2xvciB0byB0aGUgdXNlcidzIGNvbmZpZ3VyZWQgZ3JheSA0MDAgY29sb3IuXG4qL1xuXG5pbnB1dDo6cGxhY2Vob2xkZXIsXG50ZXh0YXJlYTo6cGxhY2Vob2xkZXIge1xuICBvcGFjaXR5OiAxOyAvKiAxICovXG4gIGNvbG9yOiAjOWNhM2FmOyAvKiAyICovXG59XG5cbi8qXG5TZXQgdGhlIGRlZmF1bHQgY3Vyc29yIGZvciBidXR0b25zLlxuKi9cblxuYnV0dG9uLFxuW3JvbGU9XCJidXR0b25cIl0ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi8qXG5NYWtlIHN1cmUgZGlzYWJsZWQgYnV0dG9ucyBkb24ndCBnZXQgdGhlIHBvaW50ZXIgY3Vyc29yLlxuKi9cbjpkaXNhYmxlZCB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLypcbjEuIE1ha2UgcmVwbGFjZWQgZWxlbWVudHMgXFxgZGlzcGxheTogYmxvY2tcXGAgYnkgZGVmYXVsdC4gKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3pkZXZzL2Nzc3JlbWVkeS9pc3N1ZXMvMTQpXG4yLiBBZGQgXFxgdmVydGljYWwtYWxpZ246IG1pZGRsZVxcYCB0byBhbGlnbiByZXBsYWNlZCBlbGVtZW50cyBtb3JlIHNlbnNpYmx5IGJ5IGRlZmF1bHQuIChodHRwczovL2dpdGh1Yi5jb20vamVuc2ltbW9ucy9jc3NyZW1lZHkvaXNzdWVzLzE0I2lzc3VlY29tbWVudC02MzQ5MzQyMTApXG4gICBUaGlzIGNhbiB0cmlnZ2VyIGEgcG9vcmx5IGNvbnNpZGVyZWQgbGludCBlcnJvciBpbiBzb21lIHRvb2xzIGJ1dCBpcyBpbmNsdWRlZCBieSBkZXNpZ24uXG4qL1xuXG5pbWcsXG5zdmcsXG52aWRlbyxcbmNhbnZhcyxcbmF1ZGlvLFxuaWZyYW1lLFxuZW1iZWQsXG5vYmplY3Qge1xuICBkaXNwbGF5OiBibG9jazsgLyogMSAqL1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyAvKiAyICovXG59XG5cbi8qXG5Db25zdHJhaW4gaW1hZ2VzIGFuZCB2aWRlb3MgdG8gdGhlIHBhcmVudCB3aWR0aCBhbmQgcHJlc2VydmUgdGhlaXIgaW50cmluc2ljIGFzcGVjdCByYXRpby4gKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3pkZXZzL2Nzc3JlbWVkeS9pc3N1ZXMvMTQpXG4qL1xuXG5pbWcsXG52aWRlbyB7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vKiBNYWtlIGVsZW1lbnRzIHdpdGggdGhlIEhUTUwgaGlkZGVuIGF0dHJpYnV0ZSBzdGF5IGhpZGRlbiBieSBkZWZhdWx0ICovXG5baGlkZGVuXSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbjpyb290LFxuW2RhdGEtdGhlbWVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8xKSk7XG59XG5cbkBzdXBwb3J0cyBub3QgKGNvbG9yOiBva2xjaCgwJSAwIDApKSB7XG5cbiAgOnJvb3Qge1xuICAgIGNvbG9yLXNjaGVtZTogbGlnaHQ7XG4gICAgLS1mYWxsYmFjay1wOiAjNDkxZWZmO1xuICAgIC0tZmFsbGJhY2stcGM6ICNkNGRiZmY7XG4gICAgLS1mYWxsYmFjay1zOiAjZmY0MWM3O1xuICAgIC0tZmFsbGJhY2stc2M6ICNmZmY5ZmM7XG4gICAgLS1mYWxsYmFjay1hOiAjMDBjZmJkO1xuICAgIC0tZmFsbGJhY2stYWM6ICMwMDEwMGQ7XG4gICAgLS1mYWxsYmFjay1uOiAjMmIzNDQwO1xuICAgIC0tZmFsbGJhY2stbmM6ICNkN2RkZTQ7XG4gICAgLS1mYWxsYmFjay1iMTogI2ZmZmZmZjtcbiAgICAtLWZhbGxiYWNrLWIyOiAjZTVlNmU2O1xuICAgIC0tZmFsbGJhY2stYjM6ICNlNWU2ZTY7XG4gICAgLS1mYWxsYmFjay1iYzogIzFmMjkzNztcbiAgICAtLWZhbGxiYWNrLWluOiAjMDBiM2YwO1xuICAgIC0tZmFsbGJhY2staW5jOiAjMDAwMDAwO1xuICAgIC0tZmFsbGJhY2stc3U6ICMwMGNhOTI7XG4gICAgLS1mYWxsYmFjay1zdWM6ICMwMDAwMDA7XG4gICAgLS1mYWxsYmFjay13YTogI2ZmYzIyZDtcbiAgICAtLWZhbGxiYWNrLXdhYzogIzAwMDAwMDtcbiAgICAtLWZhbGxiYWNrLWVyOiAjZmY2ZjcwO1xuICAgIC0tZmFsbGJhY2stZXJjOiAjMDAwMDAwO1xuICB9XG5cbiAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xuXG4gICAgOnJvb3Qge1xuICAgICAgY29sb3Itc2NoZW1lOiBkYXJrO1xuICAgICAgLS1mYWxsYmFjay1wOiAjNzU4MmZmO1xuICAgICAgLS1mYWxsYmFjay1wYzogIzA1MDYxNztcbiAgICAgIC0tZmFsbGJhY2stczogI2ZmNzFjZjtcbiAgICAgIC0tZmFsbGJhY2stc2M6ICMxOTAyMTE7XG4gICAgICAtLWZhbGxiYWNrLWE6ICMwMGM3YjU7XG4gICAgICAtLWZhbGxiYWNrLWFjOiAjMDAwZTBjO1xuICAgICAgLS1mYWxsYmFjay1uOiAjMmEzMjNjO1xuICAgICAgLS1mYWxsYmFjay1uYzogI2E2YWRiYjtcbiAgICAgIC0tZmFsbGJhY2stYjE6ICMxZDIzMmE7XG4gICAgICAtLWZhbGxiYWNrLWIyOiAjMTkxZTI0O1xuICAgICAgLS1mYWxsYmFjay1iMzogIzE1MTkxZTtcbiAgICAgIC0tZmFsbGJhY2stYmM6ICNhNmFkYmI7XG4gICAgICAtLWZhbGxiYWNrLWluOiAjMDBiM2YwO1xuICAgICAgLS1mYWxsYmFjay1pbmM6ICMwMDAwMDA7XG4gICAgICAtLWZhbGxiYWNrLXN1OiAjMDBjYTkyO1xuICAgICAgLS1mYWxsYmFjay1zdWM6ICMwMDAwMDA7XG4gICAgICAtLWZhbGxiYWNrLXdhOiAjZmZjMjJkO1xuICAgICAgLS1mYWxsYmFjay13YWM6ICMwMDAwMDA7XG4gICAgICAtLWZhbGxiYWNrLWVyOiAjZmY2ZjcwO1xuICAgICAgLS1mYWxsYmFjay1lcmM6ICMwMDAwMDA7XG4gICAgfVxuICB9XG59XG5cbmh0bWwge1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4qIHtcbiAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsY2gsIGN1cnJlbnRDb2xvciAzNSUsIHRyYW5zcGFyZW50KSB0cmFuc3BhcmVudDtcbn1cblxuKjpob3ZlciB7XG4gIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGNoLCBjdXJyZW50Q29sb3IgNjAlLCB0cmFuc3BhcmVudCkgdHJhbnNwYXJlbnQ7XG59XG5cbjpyb290IHtcbiAgY29sb3Itc2NoZW1lOiBkYXJrO1xuICAtLWluOiA3Mi4wNiUgMC4xOTEgMjMxLjY7XG4gIC0tc3U6IDY0LjglIDAuMTUwIDE2MDtcbiAgLS13YTogODQuNzElIDAuMTk5IDgzLjg3O1xuICAtLWVyOiA3MS43NiUgMC4yMjEgMjIuMTg7XG4gIC0tcGM6IDEzLjEzOCUgMC4wMzkyIDI3NS43NTtcbiAgLS1zYzogMTQuOTYlIDAuMDUyIDM0Mi41NTtcbiAgLS1hYzogMTQuOTAyJSAwLjAzMzQgMTgzLjYxO1xuICAtLWluYzogMCUgMCAwO1xuICAtLXN1YzogMCUgMCAwO1xuICAtLXdhYzogMCUgMCAwO1xuICAtLWVyYzogMCUgMCAwO1xuICAtLXJvdW5kZWQtYm94OiAxcmVtO1xuICAtLXJvdW5kZWQtYnRuOiAwLjVyZW07XG4gIC0tcm91bmRlZC1iYWRnZTogMS45cmVtO1xuICAtLWFuaW1hdGlvbi1idG46IDAuMjVzO1xuICAtLWFuaW1hdGlvbi1pbnB1dDogLjJzO1xuICAtLWJ0bi1mb2N1cy1zY2FsZTogMC45NTtcbiAgLS1ib3JkZXItYnRuOiAxcHg7XG4gIC0tdGFiLWJvcmRlcjogMXB4O1xuICAtLXRhYi1yYWRpdXM6IDAuNXJlbTtcbiAgLS1wOiA2NS42OSUgMC4xOTYgMjc1Ljc1O1xuICAtLXM6IDc0LjglIDAuMjYgMzQyLjU1O1xuICAtLWE6IDc0LjUxJSAwLjE2NyAxODMuNjE7XG4gIC0tbjogMzEuMzgxNSUgMC4wMjExMDggMjU0LjEzOTE3NTtcbiAgLS1uYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG4gIC0tYjE6IDI1LjMyNjclIDAuMDE1ODk2IDI1Mi40MTc1Njg7XG4gIC0tYjI6IDIzLjI2MDclIDAuMDEzODA3IDI1My4xMDA2NzU7XG4gIC0tYjM6IDIxLjE0ODQlIDAuMDExNjUgMjU0LjA4NzkzOTtcbiAgLS1iYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG59XG5cbltkYXRhLXRoZW1lPWRhcmtdIHtcbiAgY29sb3Itc2NoZW1lOiBkYXJrO1xuICAtLWluOiA3Mi4wNiUgMC4xOTEgMjMxLjY7XG4gIC0tc3U6IDY0LjglIDAuMTUwIDE2MDtcbiAgLS13YTogODQuNzElIDAuMTk5IDgzLjg3O1xuICAtLWVyOiA3MS43NiUgMC4yMjEgMjIuMTg7XG4gIC0tcGM6IDEzLjEzOCUgMC4wMzkyIDI3NS43NTtcbiAgLS1zYzogMTQuOTYlIDAuMDUyIDM0Mi41NTtcbiAgLS1hYzogMTQuOTAyJSAwLjAzMzQgMTgzLjYxO1xuICAtLWluYzogMCUgMCAwO1xuICAtLXN1YzogMCUgMCAwO1xuICAtLXdhYzogMCUgMCAwO1xuICAtLWVyYzogMCUgMCAwO1xuICAtLXJvdW5kZWQtYm94OiAxcmVtO1xuICAtLXJvdW5kZWQtYnRuOiAwLjVyZW07XG4gIC0tcm91bmRlZC1iYWRnZTogMS45cmVtO1xuICAtLWFuaW1hdGlvbi1idG46IDAuMjVzO1xuICAtLWFuaW1hdGlvbi1pbnB1dDogLjJzO1xuICAtLWJ0bi1mb2N1cy1zY2FsZTogMC45NTtcbiAgLS1ib3JkZXItYnRuOiAxcHg7XG4gIC0tdGFiLWJvcmRlcjogMXB4O1xuICAtLXRhYi1yYWRpdXM6IDAuNXJlbTtcbiAgLS1wOiA2NS42OSUgMC4xOTYgMjc1Ljc1O1xuICAtLXM6IDc0LjglIDAuMjYgMzQyLjU1O1xuICAtLWE6IDc0LjUxJSAwLjE2NyAxODMuNjE7XG4gIC0tbjogMzEuMzgxNSUgMC4wMjExMDggMjU0LjEzOTE3NTtcbiAgLS1uYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG4gIC0tYjE6IDI1LjMyNjclIDAuMDE1ODk2IDI1Mi40MTc1Njg7XG4gIC0tYjI6IDIzLjI2MDclIDAuMDEzODA3IDI1My4xMDA2NzU7XG4gIC0tYjM6IDIxLjE0ODQlIDAuMDExNjUgMjU0LjA4NzkzOTtcbiAgLS1iYzogNzQuNjQ3NyUgMC4wMjE2IDI2NC40MzU5NjQ7XG59XG5cbltkYXRhLXRoZW1lPW9wZW5zaWduY3NzXSB7XG4gIC0tcDogMjkuNDY1MyUgMC4xMTQ1NDggMjU5LjA2MDEyOTtcbiAgLS1yb3VuZGVkLWJveDogMXJlbTtcbiAgLS1yb3VuZGVkLWJhZGdlOiAxLjlyZW07XG4gIC0tYW5pbWF0aW9uLWJ0bjogMC4yNXM7XG4gIC0tYW5pbWF0aW9uLWlucHV0OiAuMnM7XG4gIC0tYnRuLWZvY3VzLXNjYWxlOiAwLjk1O1xuICAtLWJvcmRlci1idG46IDFweDtcbiAgLS1wYzogODQuNDUzMSUgMC4wMDQ3MDIgMjU4LjMyNjc5MTtcbiAgLS1zOiAzMi43ODM3JSAwLjA0MDg4NSAyNjEuMzQ2ODc7XG4gIC0tc2M6IDg1LjgzMzklIDAuMDIzMDA2IDI2MC43MTk0NDI7XG4gIC0tYTogNTcuNDQzOCUgMC4yMzE0OTEgMjIuMTc5OTA5O1xuICAtLWFjOiA5MS40MjQ3JSAwLjA0MzkzNSAyMy4xNzk1Nzk7XG4gIC0tbjogODQuMTM3MyUgMC4wMjQxNTcgMjU2LjExNDE7XG4gIC0tbmM6IDE4LjQwODElIDAuMDAzNzU4IDE2NC41OTc2NTQ7XG4gIC0tYjE6IDEwMCUgMCAwO1xuICAtLWIyOiA5MC4wNjAxJSAwIDA7XG4gIC0tYjM6IDgwLjE1MTclIDAgMDtcbiAgLS1iYzogMjAuMDE5MyUgMCAwO1xuICAtLWluOiA3My40NTkyJSAwLjE1ODg3NCAyMzYuMzU3NTE0O1xuICAtLWluYzogOTYuOTg3MSUgMC4wMDEzMjQgMTA2LjQyMzgyMTtcbiAgLS1zdTogNjQuODE1OSUgMC4xNDc0MDUgMTU5LjY3MjY2NjtcbiAgLS1zdWM6IDk2Ljk4NzElIDAuMDAxMzI0IDEwNi40MjM4MjE7XG4gIC0td2E6IDgzLjgzOTglIDAuMTcyMjA5IDgzLjU3Mzk2NztcbiAgLS13YWM6IDg4LjAwMDUlIDAuMDI1MDQgMjUxLjkxNjk4O1xuICAtLWVyOiA4MC40OTAyJSAwLjExMjAxNyAxNS43Mjc1MjI7XG4gIC0tZXJjOiAxNS45OTclIDAuMDIzMjg0IDE0Ljg5ODUxNztcbiAgLS1yb3VuZGVkLWJ0bjogMS45cmVtO1xuICAtLXRhYi1ib3JkZXI6IDJweDtcbiAgLS10YWItcmFkaXVzOiAwLjdyZW07XG59XG5cbiosIDo6YmVmb3JlLCA6OmFmdGVyIHtcbiAgLS10dy1ib3JkZXItc3BhY2luZy14OiAwO1xuICAtLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7XG4gIC0tdHctdHJhbnNsYXRlLXg6IDA7XG4gIC0tdHctdHJhbnNsYXRlLXk6IDA7XG4gIC0tdHctcm90YXRlOiAwO1xuICAtLXR3LXNrZXcteDogMDtcbiAgLS10dy1za2V3LXk6IDA7XG4gIC0tdHctc2NhbGUteDogMTtcbiAgLS10dy1zY2FsZS15OiAxO1xuICAtLXR3LXBhbi14OiAgO1xuICAtLXR3LXBhbi15OiAgO1xuICAtLXR3LXBpbmNoLXpvb206ICA7XG4gIC0tdHctc2Nyb2xsLXNuYXAtc3RyaWN0bmVzczogcHJveGltaXR5O1xuICAtLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246ICA7XG4gIC0tdHctZ3JhZGllbnQtdmlhLXBvc2l0aW9uOiAgO1xuICAtLXR3LWdyYWRpZW50LXRvLXBvc2l0aW9uOiAgO1xuICAtLXR3LW9yZGluYWw6ICA7XG4gIC0tdHctc2xhc2hlZC16ZXJvOiAgO1xuICAtLXR3LW51bWVyaWMtZmlndXJlOiAgO1xuICAtLXR3LW51bWVyaWMtc3BhY2luZzogIDtcbiAgLS10dy1udW1lcmljLWZyYWN0aW9uOiAgO1xuICAtLXR3LXJpbmctaW5zZXQ6ICA7XG4gIC0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDtcbiAgLS10dy1yaW5nLW9mZnNldC1jb2xvcjogI2ZmZjtcbiAgLS10dy1yaW5nLWNvbG9yOiByZ2IoNTkgMTMwIDI0NiAvIDAuNSk7XG4gIC0tdHctcmluZy1vZmZzZXQtc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctcmluZy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwO1xuICAtLXR3LWJsdXI6ICA7XG4gIC0tdHctYnJpZ2h0bmVzczogIDtcbiAgLS10dy1jb250cmFzdDogIDtcbiAgLS10dy1ncmF5c2NhbGU6ICA7XG4gIC0tdHctaHVlLXJvdGF0ZTogIDtcbiAgLS10dy1pbnZlcnQ6ICA7XG4gIC0tdHctc2F0dXJhdGU6ICA7XG4gIC0tdHctc2VwaWE6ICA7XG4gIC0tdHctZHJvcC1zaGFkb3c6ICA7XG4gIC0tdHctYmFja2Ryb3AtYmx1cjogIDtcbiAgLS10dy1iYWNrZHJvcC1icmlnaHRuZXNzOiAgO1xuICAtLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiAgO1xuICAtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZTogIDtcbiAgLS10dy1iYWNrZHJvcC1odWUtcm90YXRlOiAgO1xuICAtLXR3LWJhY2tkcm9wLWludmVydDogIDtcbiAgLS10dy1iYWNrZHJvcC1vcGFjaXR5OiAgO1xuICAtLXR3LWJhY2tkcm9wLXNhdHVyYXRlOiAgO1xuICAtLXR3LWJhY2tkcm9wLXNlcGlhOiAgO1xuICAtLXR3LWNvbnRhaW4tc2l6ZTogIDtcbiAgLS10dy1jb250YWluLWxheW91dDogIDtcbiAgLS10dy1jb250YWluLXBhaW50OiAgO1xuICAtLXR3LWNvbnRhaW4tc3R5bGU6ICA7XG59XG5cbjo6YmFja2Ryb3Age1xuICAtLXR3LWJvcmRlci1zcGFjaW5nLXg6IDA7XG4gIC0tdHctYm9yZGVyLXNwYWNpbmcteTogMDtcbiAgLS10dy10cmFuc2xhdGUteDogMDtcbiAgLS10dy10cmFuc2xhdGUteTogMDtcbiAgLS10dy1yb3RhdGU6IDA7XG4gIC0tdHctc2tldy14OiAwO1xuICAtLXR3LXNrZXcteTogMDtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIC0tdHctcGFuLXg6ICA7XG4gIC0tdHctcGFuLXk6ICA7XG4gIC0tdHctcGluY2gtem9vbTogIDtcbiAgLS10dy1zY3JvbGwtc25hcC1zdHJpY3RuZXNzOiBwcm94aW1pdHk7XG4gIC0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbjogIDtcbiAgLS10dy1ncmFkaWVudC12aWEtcG9zaXRpb246ICA7XG4gIC0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246ICA7XG4gIC0tdHctb3JkaW5hbDogIDtcbiAgLS10dy1zbGFzaGVkLXplcm86ICA7XG4gIC0tdHctbnVtZXJpYy1maWd1cmU6ICA7XG4gIC0tdHctbnVtZXJpYy1zcGFjaW5nOiAgO1xuICAtLXR3LW51bWVyaWMtZnJhY3Rpb246ICA7XG4gIC0tdHctcmluZy1pbnNldDogIDtcbiAgLS10dy1yaW5nLW9mZnNldC13aWR0aDogMHB4O1xuICAtLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmO1xuICAtLXR3LXJpbmctY29sb3I6IHJnYig1OSAxMzAgMjQ2IC8gMC41KTtcbiAgLS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1yaW5nLXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7XG4gIC0tdHctYmx1cjogIDtcbiAgLS10dy1icmlnaHRuZXNzOiAgO1xuICAtLXR3LWNvbnRyYXN0OiAgO1xuICAtLXR3LWdyYXlzY2FsZTogIDtcbiAgLS10dy1odWUtcm90YXRlOiAgO1xuICAtLXR3LWludmVydDogIDtcbiAgLS10dy1zYXR1cmF0ZTogIDtcbiAgLS10dy1zZXBpYTogIDtcbiAgLS10dy1kcm9wLXNoYWRvdzogIDtcbiAgLS10dy1iYWNrZHJvcC1ibHVyOiAgO1xuICAtLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6ICA7XG4gIC0tdHctYmFja2Ryb3AtY29udHJhc3Q6ICA7XG4gIC0tdHctYmFja2Ryb3AtZ3JheXNjYWxlOiAgO1xuICAtLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6ICA7XG4gIC0tdHctYmFja2Ryb3AtaW52ZXJ0OiAgO1xuICAtLXR3LWJhY2tkcm9wLW9wYWNpdHk6ICA7XG4gIC0tdHctYmFja2Ryb3Atc2F0dXJhdGU6ICA7XG4gIC0tdHctYmFja2Ryb3Atc2VwaWE6ICA7XG4gIC0tdHctY29udGFpbi1zaXplOiAgO1xuICAtLXR3LWNvbnRhaW4tbGF5b3V0OiAgO1xuICAtLXR3LWNvbnRhaW4tcGFpbnQ6ICA7XG4gIC0tdHctY29udGFpbi1zdHlsZTogIDtcbn1cclxuLmNvbnRhaW5lciB7XG4gIHdpZHRoOiAxMDAlO1xufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogNjQwcHgpIHtcblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDY0MHB4O1xuICB9XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuXG4gIC5jb250YWluZXIge1xuICAgIG1heC13aWR0aDogNzY4cHg7XG4gIH1cbn1cclxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuXG4gIC5jb250YWluZXIge1xuICAgIG1heC13aWR0aDogMTAyNHB4O1xuICB9XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiAxMjgwcHgpIHtcblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDEyODBweDtcbiAgfVxufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogMTUzNnB4KSB7XG5cbiAgLmNvbnRhaW5lciB7XG4gICAgbWF4LXdpZHRoOiAxNTM2cHg7XG4gIH1cbn1cclxuLm9wLWFsZXJ0IHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgd2lkdGg6IDEwMCU7XG4gIGdyaWQtYXV0by1mbG93OiByb3c7XG4gIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktaXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAxcmVtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICBwYWRkaW5nOiAxcmVtO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tYWxlcnQtYmc6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS8xKSk7XG4gIC0tYWxlcnQtYmctbWl4OiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hbGVydC1iZyk7XG59XHJcbkBtZWRpYSAobWluLXdpZHRoOiA2NDBweCkge1xuXG4gIC5vcC1hbGVydCB7XG4gICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gbWlubWF4KGF1dG8sMWZyKTtcbiAgICBqdXN0aWZ5LWl0ZW1zOiBzdGFydDtcbiAgICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgfVxufVxyXG4ub3AtYmFkZ2Uge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICBoZWlnaHQ6IDEuMjVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gIHBhZGRpbmctbGVmdDogMC41NjNyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNTYzcmVtO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJhZGdlLCAxLjlyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuQG1lZGlhIChob3Zlcjpob3Zlcikge1xuXG4gIC5vcC1tZW51IGxpID4gKjpub3QodWwsIC5vcC1tZW51LXRpdGxlLCBkZXRhaWxzLCAub3AtYnRuKTphY3RpdmUsXG4ub3AtbWVudSBsaSA+ICo6bm90KHVsLCAub3AtbWVudS10aXRsZSwgZGV0YWlscywgLm9wLWJ0bikub3AtYWN0aXZlLFxuLm9wLW1lbnUgbGkgPiBkZXRhaWxzID4gc3VtbWFyeTphY3RpdmUge1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW5jLG9rbGNoKHZhcigtLW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICAub3AtdGFiOmhvdmVyIHtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgfVxuXG4gIC5vcC10YWJzLWJveGVkIDppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmhvdmVyLCAub3AtdGFicy1ib3hlZCA6aXMoaW5wdXQ6Y2hlY2tlZCk6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgLm9wLXRhYmxlIHRyLm9wLWhvdmVyOmhvdmVyLFxuICAub3AtdGFibGUgdHIub3AtaG92ZXI6bnRoLWNoaWxkKGV2ZW4pOmhvdmVyIHtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIH1cbn1cclxuLm9wLWJ0biB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBoZWlnaHQ6IDNyZW07XG4gIG1pbi1oZWlnaHQ6IDNyZW07XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItY29sb3I6IG9rbGNoKHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tYjIpKSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMWVtO1xuICBnYXA6IDAuNXJlbTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIGJvcmRlci13aWR0aDogdmFyKC0tYm9yZGVyLWJ0biwgMXB4KTtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctc2hhZG93OiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjA1KTtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAxcHggMnB4IDAgdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMikpIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG59XHJcbi5vcC1idG4tZGlzYWJsZWQsXG4gIC5vcC1idG5bZGlzYWJsZWRdLFxuICAub3AtYnRuOmRpc2FibGVkIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XHJcbi5vcC1idG4tc3F1YXJlIHtcbiAgaGVpZ2h0OiAzcmVtO1xuICB3aWR0aDogM3JlbTtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLWNpcmNsZSB7XG4gIGhlaWdodDogM3JlbTtcbiAgd2lkdGg6IDNyZW07XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgcGFkZGluZzogMHB4O1xufVxyXG46d2hlcmUoLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0pKSxcbjp3aGVyZSgub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJyYWRpb1wiXSkpIHtcbiAgd2lkdGg6IGF1dG87XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xufVxyXG4ub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSk6YWZ0ZXIsXG4ub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJyYWRpb1wiXSk6YWZ0ZXIge1xuICAtLXR3LWNvbnRlbnQ6IGF0dHIoYXJpYS1sYWJlbCk7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xufVxyXG4ub3AtY2FyZCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xufVxyXG4ub3AtY2FyZDpmb2N1cyB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWNhcmQtYm9keSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nLWNhcmQsIDJyZW0pO1xuICBnYXA6IDAuNXJlbTtcbn1cclxuLm9wLWNhcmQtYm9keSA6d2hlcmUocCkge1xuICBmbGV4LWdyb3c6IDE7XG59XHJcbi5vcC1jYXJkLWFjdGlvbnMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICBnYXA6IDAuNXJlbTtcbn1cclxuLm9wLWNhcmQgZmlndXJlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGwge1xuICBkaXNwbGF5OiBncmlkO1xufVxyXG4ub3AtY2FyZC5vcC1pbWFnZS1mdWxsOmJlZm9yZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgY29udGVudDogXCJcIjtcbiAgei1pbmRleDogMTA7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1uLG9rbGNoKHZhcigtLW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuNzU7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGw6YmVmb3JlLFxuICAgIC5vcC1jYXJkLm9wLWltYWdlLWZ1bGwgPiAqIHtcbiAgZ3JpZC1jb2x1bW4tc3RhcnQ6IDE7XG4gIGdyaWQtcm93LXN0YXJ0OiAxO1xufVxyXG4ub3AtY2FyZC5vcC1pbWFnZS1mdWxsID4gZmlndXJlIGltZyB7XG4gIGhlaWdodDogMTAwJTtcbiAgb2JqZWN0LWZpdDogY292ZXI7XG59XHJcbi5vcC1jYXJkLm9wLWltYWdlLWZ1bGwgPiAub3AtY2FyZC1ib2R5IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyMDtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1uYyxva2xjaCh2YXIoLS1uYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtY2hlY2tib3gge1xuICBmbGV4LXNocmluazogMDtcbiAgLS1jaGtiZzogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbiAgLS1jaGtmZzogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHdpZHRoOiAxLjVyZW07XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWRpdmlkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBtYXJnaW4tdG9wOiAxcmVtO1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xuICBoZWlnaHQ6IDFyZW07XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XHJcbi5vcC1kaXZpZGVyOmJlZm9yZSxcbiAgLm9wLWRpdmlkZXI6YWZ0ZXIge1xuICBoZWlnaHQ6IDAuMTI1cmVtO1xuICB3aWR0aDogMTAwJTtcbiAgZmxleC1ncm93OiAxO1xuICAtLXR3LWNvbnRlbnQ6ICcnO1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMSkpO1xufVxyXG4ub3AtZHJvcGRvd24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cclxuLm9wLWRyb3Bkb3duID4gKjpub3Qoc3VtbWFyeSk6Zm9jdXMge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1kcm9wZG93biAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cclxuLm9wLWRyb3Bkb3duOmlzKDpub3QoZGV0YWlscykpIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3A7XG4gIC0tdHctc2NhbGUteDogLjk1O1xuICAtLXR3LXNjYWxlLXk6IC45NTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xufVxyXG4ub3AtZHJvcGRvd24tZW5kIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgaW5zZXQtaW5saW5lLWVuZDogMHB4O1xufVxyXG4ub3AtZHJvcGRvd24tbGVmdCAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogYXV0bztcbiAgaW5zZXQtaW5saW5lLWVuZDogMTAwJTtcbiAgdG9wOiAwcHg7XG4gIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0O1xufVxyXG4ub3AtZHJvcGRvd24tcmlnaHQgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICBib3R0b206IGF1dG87XG4gIGluc2V0LWlubGluZS1zdGFydDogMTAwJTtcbiAgdG9wOiAwcHg7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQ7XG59XHJcbi5vcC1kcm9wZG93bi1ib3R0b20gLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICBib3R0b206IGF1dG87XG4gIHRvcDogMTAwJTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogdG9wO1xufVxyXG4ub3AtZHJvcGRvd24tdG9wIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgYm90dG9tOiAxMDAlO1xuICB0b3A6IGF1dG87XG4gIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbTtcbn1cclxuLm9wLWRyb3Bkb3duLWVuZC5vcC1kcm9wZG93bi1yaWdodCAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogMHB4O1xuICB0b3A6IGF1dG87XG59XHJcbi5vcC1kcm9wZG93bi1lbmQub3AtZHJvcGRvd24tbGVmdCAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIGJvdHRvbTogMHB4O1xuICB0b3A6IGF1dG87XG59XHJcbi5vcC1kcm9wZG93bi5vcC1kcm9wZG93bi1vcGVuIC5vcC1kcm9wZG93bi1jb250ZW50LFxuLm9wLWRyb3Bkb3duOm5vdCgub3AtZHJvcGRvd24taG92ZXIpOmZvY3VzIC5vcC1kcm9wZG93bi1jb250ZW50LFxuLm9wLWRyb3Bkb3duOmZvY3VzLXdpdGhpbiAub3AtZHJvcGRvd24tY29udGVudCB7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIG9wYWNpdHk6IDE7XG59XHJcbkBtZWRpYSAoaG92ZXI6IGhvdmVyKSB7XG5cbiAgLm9wLWRyb3Bkb3duLm9wLWRyb3Bkb3duLWhvdmVyOmhvdmVyIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICAub3AtYnRuOmhvdmVyIHtcbiAgICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjMsb2tsY2godmFyKC0tYjMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMyxva2xjaCh2YXIoLS1iMykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoXG4gICAgICAgICAgICBpbiBva2xhYixcbiAgICAgICAgICAgIG9rbGNoKHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tYjIpKSAvIHZhcigtLXR3LWJnLW9wYWNpdHksIDEpKSA5MCUsXG4gICAgICAgICAgICBibGFja1xuICAgICAgICAgICk7XG4gICAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChcbiAgICAgICAgICAgIGluIG9rbGFiLFxuICAgICAgICAgICAgb2tsY2godmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1iMikpIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHksIDEpKSA5MCUsXG4gICAgICAgICAgICBibGFja1xuICAgICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQHN1cHBvcnRzIG5vdCAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAgIC5vcC1idG46aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1mYWxsYmFjay1iMikpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idG4tY29sb3IsIHZhcigtLWZhbGxiYWNrLWIyKSk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi5vcC1nbGFzczpob3ZlciB7XG4gICAgLS1nbGFzcy1vcGFjaXR5OiAyNSU7XG4gICAgLS1nbGFzcy1ib3JkZXItb3BhY2l0eTogMTUlO1xuICB9XG5cbiAgLm9wLWJ0bi1naG9zdDpob3ZlciB7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAgIC5vcC1idG4tZ2hvc3Q6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZTpob3ZlciB7XG4gICAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnk6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXByaW1hcnk6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICB9XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLXNlY29uZGFyeTpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXNjLG9rbGNoKHZhcigtLXNjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG4tb3V0bGluZS5vcC1idG4tc2Vjb25kYXJ5OmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSkgOTAlLCBibGFjayk7XG4gICAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1hY2NlbnQ6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1hYyxva2xjaCh2YXIoLS1hYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tc3VjY2Vzczpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1Yyxva2xjaCh2YXIoLS1zdWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zdWNjZXNzOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zdSxva2xjaCh2YXIoLS1zdSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4taW5mbzpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWluYyxva2xjaCh2YXIoLS1pbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1pbmZvOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4td2FybmluZzpob3ZlciB7XG4gICAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gICAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhYyxva2xjaCh2YXIoLS13YWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgfVxuXG4gIEBzdXBwb3J0cyAoY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgYmxhY2ssIGJsYWNrKSkge1xuXG4gICAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi13YXJuaW5nOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIH1cbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3I6aG92ZXIge1xuICAgIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICAgIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcmMsb2tsY2godmFyKC0tZXJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAgIC5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3I6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpIDkwJSwgYmxhY2spO1xuICAgICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWVyLG9rbGNoKHZhcigtLWVyKS8xKSkgOTAlLCBibGFjayk7XG4gICAgfVxuICB9XG5cbiAgLm9wLWJ0bi1kaXNhYmxlZDpob3ZlcixcbiAgICAub3AtYnRuW2Rpc2FibGVkXTpob3ZlcixcbiAgICAub3AtYnRuOmRpc2FibGVkOmhvdmVyIHtcbiAgICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgICAtLXR3LWJnLW9wYWNpdHk6IDAuMjtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMC4yO1xuICB9XG5cbiAgQHN1cHBvcnRzIChjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCBibGFjaywgYmxhY2spKSB7XG5cbiAgICAub3AtYnRuOmlzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpjaGVja2VkKTpob3ZlciwgLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl06Y2hlY2tlZCk6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKSA5MCUsIGJsYWNrKTtcbiAgICB9XG4gIH1cblxuICAub3AtZHJvcGRvd24ub3AtZHJvcGRvd24taG92ZXI6aG92ZXIgLm9wLWRyb3Bkb3duLWNvbnRlbnQge1xuICAgIC0tdHctc2NhbGUteDogMTtcbiAgICAtLXR3LXNjYWxlLXk6IDE7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIH1cblxuICA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIH1cblxuICBAc3VwcG9ydHMgKGNvbG9yOiBva2xjaCgwJSAwIDApKSB7XG5cbiAgICA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gKjpub3QodWwsIGRldGFpbHMsIC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjEpKTtcbiAgICB9XG4gIH1cblxuICAub3AtdGFiW2Rpc2FibGVkXSxcbiAgICAub3AtdGFiW2Rpc2FibGVkXTpob3ZlciB7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgICAtLXR3LXRleHQtb3BhY2l0eTogMC4yO1xuICB9XG59XHJcbi5vcC1kcm9wZG93bjppcyhkZXRhaWxzKSBzdW1tYXJ5Ojotd2Via2l0LWRldGFpbHMtbWFya2VyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cclxuLm9wLWZpbGUtaW5wdXQge1xuICBoZWlnaHQ6IDNyZW07XG4gIGZsZXgtc2hyaW5rOiAxO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IDFyZW07XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDA7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC1maWxlLWlucHV0OjpmaWxlLXNlbGVjdG9yLWJ1dHRvbiB7XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiAxcmVtO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmbGV4LXNocmluazogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBwYWRkaW5nLWxlZnQ6IDFyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDFyZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxZW07XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDIwMG1zO1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBmb250LXdlaWdodDogNjAwO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW5jLG9rbGNoKHZhcigtLW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiBub25lO1xuICBib3JkZXItd2lkdGg6IHZhcigtLWJvcmRlci1idG4sIDFweCk7XG4gIGFuaW1hdGlvbjogYnV0dG9uLXBvcCB2YXIoLS1hbmltYXRpb24tYnRuLCAwLjI1cykgZWFzZS1vdXQ7XG59XHJcbi5vcC1mb290ZXIge1xuICBkaXNwbGF5OiBncmlkO1xuICB3aWR0aDogMTAwJTtcbiAgZ3JpZC1hdXRvLWZsb3c6IHJvdztcbiAgcGxhY2UtaXRlbXM6IHN0YXJ0O1xuICBjb2x1bW4tZ2FwOiAxcmVtO1xuICByb3ctZ2FwOiAyLjVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xufVxyXG4ub3AtZm9vdGVyID4gKiB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIHBsYWNlLWl0ZW1zOiBzdGFydDtcbiAgZ2FwOiAwLjVyZW07XG59XHJcbi5vcC1mb290ZXItY2VudGVyIHtcbiAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxyXG4ub3AtZm9vdGVyLWNlbnRlciA+ICoge1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xufVxyXG5AbWVkaWEgKG1pbi13aWR0aDogNDhyZW0pIHtcblxuICAub3AtZm9vdGVyIHtcbiAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICB9XG5cbiAgLm9wLWZvb3Rlci1jZW50ZXIge1xuICAgIGdyaWQtYXV0by1mbG93OiByb3cgZGVuc2U7XG4gIH1cbn1cclxuLm9wLWlucHV0IHtcbiAgZmxleC1zaHJpbms6IDE7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICBoZWlnaHQ6IDNyZW07XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgbGluZS1oZWlnaHQ6IDEuNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4ub3AtaW5wdXRbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbi5vcC1pbnB1dC1tZFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcbiAgbWFyZ2luLXRvcDogLTFyZW07XG4gIG1hcmdpbi1ib3R0b206IC0xcmVtO1xuICBtYXJnaW4taW5saW5lLWVuZDogLTFyZW07XG59XHJcbi5vcC1pbnB1dC14c1t0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcbiAgbWFyZ2luLXRvcDogLTAuMjVyZW07XG4gIG1hcmdpbi1ib3R0b206IC0wLjI1cmVtO1xuICBtYXJnaW4taW5saW5lLWVuZDogLTBweDtcbn1cclxuLm9wLWlucHV0LXNtW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xuICBtYXJnaW4tdG9wOiAwcHg7XG4gIG1hcmdpbi1ib3R0b206IDBweDtcbiAgbWFyZ2luLWlubGluZS1lbmQ6IC0wcHg7XG59XHJcbi5vcC1qb2luIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbn1cclxuLm9wLWpvaW4gOndoZXJlKC5vcC1qb2luLWl0ZW0pIHtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IDA7XG59XHJcbi5vcC1qb2luIC5vcC1qb2luLWl0ZW06bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSxcbiAgLm9wLWpvaW4gKjpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogMDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogMDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogMDtcbn1cclxuLm9wLWpvaW4gLm9wLWpvaW4taXRlbTpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpLFxuICAub3Atam9pbiAqOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IDA7XG59XHJcbi5vcC1qb2luIC5vcC1kcm9wZG93biAub3Atam9pbi1pdGVtOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCksXG4gIC5vcC1qb2luICo6Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSAub3AtZHJvcGRvd24gLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbi5vcC1qb2luIDp3aGVyZSgub3Atam9pbi1pdGVtOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkpLFxuICAub3Atam9pbiA6d2hlcmUoKjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0pIHtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbi5vcC1qb2luIC5vcC1qb2luLWl0ZW06bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSxcbiAgLm9wLWpvaW4gKjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogMDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogMDtcbn1cclxuLm9wLWpvaW4gOndoZXJlKC5vcC1qb2luLWl0ZW06bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSksXG4gIC5vcC1qb2luIDp3aGVyZSgqOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSkge1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG5Ac3VwcG9ydHMgbm90IHNlbGVjdG9yKDpoYXMoKikpIHtcblxuICA6d2hlcmUoLm9wLWpvaW4gKikge1xuICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG4gIH1cbn1cclxuQHN1cHBvcnRzIHNlbGVjdG9yKDpoYXMoKikpIHtcblxuICA6d2hlcmUoLm9wLWpvaW4gKjpoYXMoLm9wLWpvaW4taXRlbSkpIHtcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICB9XG59XHJcbi5vcC1saW5rIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lO1xufVxyXG4ub3AtbWVudSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIHBhZGRpbmc6IDAuNXJlbTtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpIHVsKSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgbWFyZ2luLWlubGluZS1zdGFydDogMXJlbTtcbiAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IDAuNXJlbTtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUsIC5vcC1idG4pKSwgLm9wLW1lbnUgOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKSB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC41cmVtO1xuICBncmlkLWF1dG8tY29sdW1uczogbWlubWF4KGF1dG8sIG1heC1jb250ZW50KSBhdXRvIG1heC1jb250ZW50O1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxyXG4ub3AtbWVudSBsaS5vcC1kaXNhYmxlZCB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4zKSk7XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaSA+IC5vcC1tZW51LWRyb3Bkb3duOm5vdCgub3AtbWVudS1kcm9wZG93bi1zaG93KSkge1xuICBkaXNwbGF5OiBub25lO1xufVxyXG46d2hlcmUoLm9wLW1lbnUgbGkpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXNocmluazogMDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbn1cclxuOndoZXJlKC5vcC1tZW51IGxpKSAub3AtYmFkZ2Uge1xuICBqdXN0aWZ5LXNlbGY6IGVuZDtcbn1cclxuLm9wLW1vZGFsIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgaW5zZXQ6IDBweDtcbiAgbWFyZ2luOiAwcHg7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGhlaWdodDogMTAwJTtcbiAgbWF4LWhlaWdodDogbm9uZTtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogbm9uZTtcbiAganVzdGlmeS1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nOiAwcHg7XG4gIG9wYWNpdHk6IDA7XG4gIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47XG4gIHotaW5kZXg6IDk5OTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiBpbmhlcml0O1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAyMDBtcztcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG9wYWNpdHksIHZpc2liaWxpdHk7XG4gIG92ZXJmbG93LXk6IGhpZGRlbjtcbn1cclxuOndoZXJlKC5vcC1tb2RhbCkge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxyXG4ub3AtbW9kYWwtYm94IHtcbiAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDVlbSk7XG4gIGdyaWQtY29sdW1uLXN0YXJ0OiAxO1xuICBncmlkLXJvdy1zdGFydDogMTtcbiAgd2lkdGg6IDkxLjY2NjY2NyU7XG4gIG1heC13aWR0aDogMzJyZW07XG4gIC0tdHctc2NhbGUteDogLjk7XG4gIC0tdHctc2NhbGUteTogLjk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgcGFkZGluZzogMS41cmVtO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXIsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyO1xuICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAyMDBtcztcbiAgYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjI1KSAwcHggMjVweCA1MHB4IC0xMnB4O1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluO1xufVxyXG4ub3AtbW9kYWwtb3Blbixcbi5vcC1tb2RhbDp0YXJnZXQsXG4ub3AtbW9kYWwtdG9nZ2xlOmNoZWNrZWQgKyAub3AtbW9kYWwsXG4ub3AtbW9kYWxbb3Blbl0ge1xuICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgb3BhY2l0eTogMTtcbn1cclxuOnJvb3Q6aGFzKDppcygub3AtbW9kYWwtb3BlbiwgLm9wLW1vZGFsOnRhcmdldCwgLm9wLW1vZGFsLXRvZ2dsZTpjaGVja2VkICsgLm9wLW1vZGFsLCAub3AtbW9kYWxbb3Blbl0pKSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHNjcm9sbGJhci1ndXR0ZXI6IHN0YWJsZTtcbn1cclxuLm9wLW5hdmJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IHZhcigtLW5hdmJhci1wYWRkaW5nLCAwLjVyZW0pO1xuICBtaW4taGVpZ2h0OiA0cmVtO1xuICB3aWR0aDogMTAwJTtcbn1cclxuOndoZXJlKC5vcC1uYXZiYXIgPiAqOm5vdChzY3JpcHQsIHN0eWxlKSkge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cclxuLm9wLXJhZGlvIHtcbiAgZmxleC1zaHJpbms6IDA7XG4gIC0tY2hrYmc6IHZhcigtLWJjKTtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHdpZHRoOiAxLjVyZW07XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1zZWxlY3Qge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgaGVpZ2h0OiAzcmVtO1xuICBtaW4taGVpZ2h0OiAzcmVtO1xuICBwYWRkaW5nLWlubGluZS1zdGFydDogMXJlbTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiAyLjVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHRyYW5zcGFyZW50IDUwJSwgY3VycmVudENvbG9yIDUwJSksXG4gICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgY3VycmVudENvbG9yIDUwJSwgdHJhbnNwYXJlbnQgNTAlKTtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2FsYygxMDAlIC0gMjBweCkgY2FsYygxcHggKyA1MCUpLFxuICAgIGNhbGMoMTAwJSAtIDE2LjFweCkgY2FsYygxcHggKyA1MCUpO1xuICBiYWNrZ3JvdW5kLXNpemU6IDRweCA0cHgsXG4gICAgNHB4IDRweDtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbn1cclxuLm9wLXNlbGVjdFttdWx0aXBsZV0ge1xuICBoZWlnaHQ6IGF1dG87XG59XHJcbi5vcC10YWJzIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xufVxyXG4ub3AtdGFicy1saWZ0ZWQ6aGFzKC5vcC10YWItY29udGVudFtjbGFzc149XCJvcC1yb3VuZGVkLVwiXSlcbiAgICAub3AtdGFiOmZpcnN0LWNoaWxkOm5vdCg6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkpLCAub3AtdGFicy1saWZ0ZWQ6aGFzKC5vcC10YWItY29udGVudFtjbGFzcyo9XCIgb3Atcm91bmRlZC1cIl0pXG4gICAgLm9wLXRhYjpmaXJzdC1jaGlsZDpub3QoOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pKSB7XG4gIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50O1xufVxyXG4ub3AtdGFiIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBncmlkLXJvdy1zdGFydDogMTtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGhlaWdodDogMnJlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgZmxleC13cmFwOiB3cmFwO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbiAgbGluZS1oZWlnaHQ6IDI7XG4gIC0tdGFiLXBhZGRpbmc6IDFyZW07XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjU7XG4gIC0tdGFiLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpO1xuICAtLXRhYi1iZzogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgLS10YWItYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMyxva2xjaCh2YXIoLS1iMykvMSkpO1xuICBjb2xvcjogdmFyKC0tdGFiLWNvbG9yKTtcbiAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLXRhYi1wYWRkaW5nLCAxcmVtKTtcbiAgcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS10YWItcGFkZGluZywgMXJlbSk7XG59XHJcbi5vcC10YWI6aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdKSB7XG4gIHdpZHRoOiBhdXRvO1xuICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMHB4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwcHg7XG59XHJcbi5vcC10YWI6aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdKTphZnRlciB7XG4gIC0tdHctY29udGVudDogYXR0cihhcmlhLWxhYmVsKTtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG59XHJcbi5vcC10YWI6bm90KGlucHV0KTplbXB0eSB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbiAgZ3JpZC1jb2x1bW4tc3RhcnQ6IHNwYW4gOTk5OTtcbn1cclxuOmNoZWNrZWQgKyAub3AtdGFiLWNvbnRlbnQ6bnRoLWNoaWxkKDIpLFxuICA6aXMoLm9wLXRhYi1hY3RpdmUsIFthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXSkgKyAub3AtdGFiLWNvbnRlbnQ6bnRoLWNoaWxkKDIpIHtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogMHB4O1xufVxyXG5pbnB1dC5vcC10YWI6Y2hlY2tlZCArIC5vcC10YWItY29udGVudCxcbjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKSArIC5vcC10YWItY29udGVudCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxyXG4ub3AtdGFibGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAxMDAlO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xufVxyXG4ub3AtdGFibGUgOndoZXJlKC5vcC10YWJsZS1waW4tcm93cyB0aGVhZCB0cikge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICB0b3A6IDBweDtcbiAgei1pbmRleDogMTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRhYmxlIDp3aGVyZSgub3AtdGFibGUtcGluLXJvd3MgdGZvb3QgdHIpIHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgYm90dG9tOiAwcHg7XG4gIHotaW5kZXg6IDE7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC10YWJsZSA6d2hlcmUoLm9wLXRhYmxlLXBpbi1jb2xzIHRyIHRoKSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIGxlZnQ6IDBweDtcbiAgcmlnaHQ6IDBweDtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRleHRhcmVhIHtcbiAgbWluLWhlaWdodDogM3JlbTtcbiAgZmxleC1zaHJpbms6IDE7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgcGFkZGluZy10b3A6IDAuNXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC10b2dnbGUge1xuICBmbGV4LXNocmluazogMDtcbiAgLS10Z2xiZzogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbiAgLS1oYW5kbGVvZmZzZXQ6IDEuNXJlbTtcbiAgLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yOiBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgKiAtMSk7XG4gIC0tdG9nZ2xlaGFuZGxlYm9yZGVyOiAwIDA7XG4gIGhlaWdodDogMS41cmVtO1xuICB3aWR0aDogM3JlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1iYWRnZSwgMS45cmVtKTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogY3VycmVudENvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC41KSk7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQsXG4gICAgYm94LXNoYWRvdyB2YXIoLS1hbmltYXRpb24taW5wdXQsIDAuMnMpIGVhc2Utb3V0O1xuICBib3gtc2hhZG93OiB2YXIoLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yKSAwIDAgMnB4IHZhcigtLXRnbGJnKSBpbnNldCxcbiAgICAwIDAgMCAycHggdmFyKC0tdGdsYmcpIGluc2V0LFxuICAgIHZhcigtLXRvZ2dsZWhhbmRsZWJvcmRlcik7XG59XHJcbi5vcC1hbGVydC1pbmZvIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMC4yKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW5jLG9rbGNoKHZhcigtLWluYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLWFsZXJ0LWJnOiB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpO1xuICAtLWFsZXJ0LWJnLW1peDogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKTtcbn1cclxuLm9wLWFsZXJ0LXN1Y2Nlc3Mge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8wLjIpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zdWMsb2tsY2godmFyKC0tc3VjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tYWxlcnQtYmc6IHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8xKSk7XG4gIC0tYWxlcnQtYmctbWl4OiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpO1xufVxyXG4ub3AtYWxlcnQtd2FybmluZyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzAuMikpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhYyxva2xjaCh2YXIoLS13YWMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS1hbGVydC1iZzogdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKTtcbiAgLS1hbGVydC1iZy1taXg6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSk7XG59XHJcbi5vcC1hbGVydC1lcnJvciB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stZXIsb2tsY2godmFyKC0tZXIpLzAuMikpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyYyxva2xjaCh2YXIoLS1lcmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS1hbGVydC1iZzogdmFyKC0tZmFsbGJhY2stZXIsb2tsY2godmFyKC0tZXIpLzEpKTtcbiAgLS1hbGVydC1iZy1taXg6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSk7XG59XHJcbi5vcC1iYWRnZS1wcmltYXJ5IHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wYyxva2xjaCh2YXIoLS1wYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYmFkZ2Utb3V0bGluZS5vcC1iYWRnZS1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiBuby1wcmVmZXJlbmNlKSB7XG5cbiAgLm9wLWJ0biB7XG4gICAgYW5pbWF0aW9uOiBidXR0b24tcG9wIHZhcigtLWFuaW1hdGlvbi1idG4sIDAuMjVzKSBlYXNlLW91dDtcbiAgfVxufVxyXG4ub3AtYnRuOmFjdGl2ZTpob3ZlcixcbiAgLm9wLWJ0bjphY3RpdmU6Zm9jdXMge1xuICBhbmltYXRpb246IGJ1dHRvbi1wb3AgMHMgZWFzZS1vdXQ7XG4gIHRyYW5zZm9ybTogc2NhbGUodmFyKC0tYnRuLWZvY3VzLXNjYWxlLCAwLjk3KSk7XG59XHJcbkBzdXBwb3J0cyBub3QgKGNvbG9yOiBva2xjaCgwJSAwIDApKSB7XG5cbiAgLm9wLWJ0biB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1mYWxsYmFjay1iMikpO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYnRuLWNvbG9yLCB2YXIoLS1mYWxsYmFjay1iMikpO1xuICB9XG5cbiAgLm9wLWJ0bi1wcmltYXJ5IHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCk7XG4gIH1cblxuICAub3AtYnRuLXNlY29uZGFyeSB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWZhbGxiYWNrLXMpO1xuICB9XG5cbiAgLm9wLWJ0bi1hY2NlbnQge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1hKTtcbiAgfVxuXG4gIC5vcC1idG4tbmV1dHJhbCB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWZhbGxiYWNrLW4pO1xuICB9XG5cbiAgLm9wLWJ0bi1pbmZvIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZmFsbGJhY2staW4pO1xuICB9XG5cbiAgLm9wLWJ0bi1lcnJvciB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyKTtcbiAgfVxufVxyXG5Ac3VwcG9ydHMgKGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIGJsYWNrLCBibGFjaykpIHtcblxuICAub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KFxuICAgICAgICAgIGluIG9rbGFiLFxuICAgICAgICAgIG9rbGNoKHZhcigtLWJ0bi1jb2xvciwgdmFyKC0tYjMpKSAvIHZhcigtLXR3LWJnLW9wYWNpdHksIDEpKSA5MCUsXG4gICAgICAgICAgYmxhY2tcbiAgICAgICAgKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChcbiAgICAgICAgICBpbiBva2xhYixcbiAgICAgICAgICBva2xjaCh2YXIoLS1idG4tY29sb3IsIHZhcigtLWIzKSkgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSwgMSkpIDkwJSxcbiAgICAgICAgICBibGFja1xuICAgICAgICApO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1wcmltYXJ5Lm9wLWJ0bi1hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvMSkpIDkwJSwgYmxhY2spO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zZWNvbmRhcnkub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS8xKSkgOTAlLCBibGFjayk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudC5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1hLG9rbGNoKHZhcigtLWEpLzEpKSA5MCUsIGJsYWNrKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tc3VjY2Vzcy5vcC1idG4tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8xKSkgOTAlLCBibGFjayk7XG4gICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsIHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS8xKSkgOTAlLCBibGFjayk7XG4gIH1cblxuICAub3AtYnRuLW91dGxpbmUub3AtYnRuLWluZm8ub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1pbixva2xjaCh2YXIoLS1pbikvMSkpIDkwJSwgYmxhY2spO1xuICB9XG5cbiAgLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi13YXJuaW5nLm9wLWJ0bi1hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKSA5MCUsIGJsYWNrKTtcbiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBva2xhYiwgdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpLzEpKSA5MCUsIGJsYWNrKTtcbiAgfVxuXG4gIC5vcC1idG4tb3V0bGluZS5vcC1idG4tZXJyb3Iub3AtYnRuLWFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpIDkwJSwgYmxhY2spO1xuICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLCB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpIDkwJSwgYmxhY2spO1xuICB9XG59XHJcbi5vcC1idG46Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICBvdXRsaW5lLXdpZHRoOiAycHg7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1idG4tcHJpbWFyeSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcGMsb2tsY2godmFyKC0tcGMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS8xKSk7XG59XHJcbkBzdXBwb3J0cyAoY29sb3I6IG9rbGNoKDAlIDAgMCkpIHtcblxuICAub3AtYnRuLXByaW1hcnkge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1wKTtcbiAgfVxuXG4gIC5vcC1idG4tc2Vjb25kYXJ5IHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tcyk7XG4gIH1cblxuICAub3AtYnRuLWFjY2VudCB7XG4gICAgLS1idG4tY29sb3I6IHZhcigtLWEpO1xuICB9XG5cbiAgLm9wLWJ0bi1uZXV0cmFsIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tbik7XG4gIH1cblxuICAub3AtYnRuLWluZm8ge1xuICAgIC0tYnRuLWNvbG9yOiB2YXIoLS1pbik7XG4gIH1cblxuICAub3AtYnRuLWVycm9yIHtcbiAgICAtLWJ0bi1jb2xvcjogdmFyKC0tZXIpO1xuICB9XG59XHJcbi5vcC1idG4tc2Vjb25kYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zYyxva2xjaCh2YXIoLS1zYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKTtcbn1cclxuLm9wLWJ0bi1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWFjLG9rbGNoKHZhcigtLWFjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpO1xufVxyXG4ub3AtYnRuLW5ldXRyYWwge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLW5jLG9rbGNoKHZhcigtLW5jKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvMSkpO1xufVxyXG4ub3AtYnRuLWluZm8ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWluYyxva2xjaCh2YXIoLS1pbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pLzEpKTtcbn1cclxuLm9wLWJ0bi1lcnJvciB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stZXJjLG9rbGNoKHZhcigtLWVyYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvMSkpO1xufVxyXG4ub3AtYnRuLm9wLWdsYXNzIHtcbiAgLS10dy1zaGFkb3c6IDAgMCAjMDAwMDtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCAwICMwMDAwO1xuICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpO1xuICBvdXRsaW5lLWNvbG9yOiBjdXJyZW50Q29sb3I7XG59XHJcbi5vcC1idG4ub3AtZ2xhc3Mub3AtYnRuLWFjdGl2ZSB7XG4gIC0tZ2xhc3Mtb3BhY2l0eTogMjUlO1xuICAtLWdsYXNzLWJvcmRlci1vcGFjaXR5OiAxNSU7XG59XHJcbi5vcC1idG4tZ2hvc3Qge1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIC0tdHctc2hhZG93OiAwIDAgIzAwMDA7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMCAjMDAwMDtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbiAgb3V0bGluZS1jb2xvcjogY3VycmVudENvbG9yO1xufVxyXG4ub3AtYnRuLWdob3N0Lm9wLWJ0bi1hY3RpdmUge1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC1idG4tbGluay5vcC1idG4tYWN0aXZlIHtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiB1bmRlcmxpbmU7XG59XHJcbi5vcC1idG4tb3V0bGluZSB7XG4gIGJvcmRlci1jb2xvcjogY3VycmVudENvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICAtLXR3LXNoYWRvdzogMCAwICMwMDAwO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXNoYWRvdyk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1wcmltYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1wcmltYXJ5Lm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tc2Vjb25kYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1zZWNvbmRhcnkub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc2Msb2tsY2godmFyKC0tc2MpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWFjY2VudC5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1hYyxva2xjaCh2YXIoLS1hYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXN1Y2Nlc3Mge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXN1LG9rbGNoKHZhcigtLXN1KS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4tc3VjY2Vzcy5vcC1idG4tYWN0aXZlIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zdWMsb2tsY2godmFyKC0tc3VjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG4tb3V0bGluZS5vcC1idG4taW5mbyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi1pbmZvLm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWluYyxva2xjaCh2YXIoLS1pbmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi1vdXRsaW5lLm9wLWJ0bi13YXJuaW5nIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay13YSxva2xjaCh2YXIoLS13YSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLXdhcm5pbmcub3AtYnRuLWFjdGl2ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2std2FjLG9rbGNoKHZhcigtLXdhYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWVycm9yIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1lcixva2xjaCh2YXIoLS1lcikvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtYnRuLW91dGxpbmUub3AtYnRuLWVycm9yLm9wLWJ0bi1hY3RpdmUge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWVyYyxva2xjaCh2YXIoLS1lcmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLWJ0bi5vcC1idG4tZGlzYWJsZWQsXG4gIC5vcC1idG5bZGlzYWJsZWRdLFxuICAub3AtYnRuOmRpc2FibGVkIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuMjtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1idG46aXMoaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQpLFxuLm9wLWJ0bjppcyhpbnB1dFt0eXBlPVwicmFkaW9cIl06Y2hlY2tlZCkge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1idG46aXMoaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQpOmZvY3VzLXZpc2libGUsIC5vcC1idG46aXMoaW5wdXRbdHlwZT1cInJhZGlvXCJdOmNoZWNrZWQpOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApLzEpKTtcbn1cclxuQGtleWZyYW1lcyBidXR0b24tcG9wIHtcblxuICAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSh2YXIoLS1idG4tZm9jdXMtc2NhbGUsIDAuOTgpKTtcbiAgfVxuXG4gIDQwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTtcbiAgfVxuXG4gIDEwMCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbn1cclxuLm9wLWNhcmQgOndoZXJlKGZpZ3VyZTpmaXJzdC1jaGlsZCkge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiBpbmhlcml0O1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IHVuc2V0O1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IHVuc2V0O1xufVxyXG4ub3AtY2FyZCA6d2hlcmUoZmlndXJlOmxhc3QtY2hpbGQpIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogdW5zZXQ7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiB1bnNldDtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWNhcmQ6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1jYXJkLm9wLWJvcmRlcmVkIHtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4ub3AtY2FyZC5vcC1jb21wYWN0IC5vcC1jYXJkLWJvZHkge1xuICBwYWRkaW5nOiAxcmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbn1cclxuLm9wLWNhcmQtdGl0bGUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuNXJlbTtcbiAgZm9udC1zaXplOiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbn1cclxuLm9wLWNhcmQub3AtaW1hZ2UtZnVsbCA6d2hlcmUoZmlndXJlKSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG59XHJcbi5vcC1jaGVja2JveDpmb2N1cyB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG59XHJcbi5vcC1jaGVja2JveDpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzEpKTtcbn1cclxuLm9wLWNoZWNrYm94OmRpc2FibGVkIHtcbiAgYm9yZGVyLXdpZHRoOiAwcHg7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWNoZWNrYm94OmNoZWNrZWQsXG4gIC5vcC1jaGVja2JveFthcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdIHtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgYW5pbWF0aW9uOiBjaGVja21hcmsgdmFyKC0tYW5pbWF0aW9uLWlucHV0LCAwLjJzKSBlYXNlLW91dDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2hrYmcpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoLTQ1ZGVnLCB0cmFuc3BhcmVudCA2NSUsIHZhcigtLWNoa2JnKSA2NS45OSUpLFxuICAgICAgbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCB0cmFuc3BhcmVudCA3NSUsIHZhcigtLWNoa2JnKSA3NS45OSUpLFxuICAgICAgbGluZWFyLWdyYWRpZW50KC00NWRlZywgdmFyKC0tY2hrYmcpIDQwJSwgdHJhbnNwYXJlbnQgNDAuOTklKSxcbiAgICAgIGxpbmVhci1ncmFkaWVudChcbiAgICAgICAgNDVkZWcsXG4gICAgICAgIHZhcigtLWNoa2JnKSAzMCUsXG4gICAgICAgIHZhcigtLWNoa2ZnKSAzMC45OSUsXG4gICAgICAgIHZhcigtLWNoa2ZnKSA0MCUsXG4gICAgICAgIHRyYW5zcGFyZW50IDQwLjk5JVxuICAgICAgKSxcbiAgICAgIGxpbmVhci1ncmFkaWVudCgtNDVkZWcsIHZhcigtLWNoa2ZnKSA1MCUsIHZhcigtLWNoa2JnKSA1MC45OSUpO1xufVxyXG4ub3AtY2hlY2tib3g6aW5kZXRlcm1pbmF0ZSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIGFuaW1hdGlvbjogY2hlY2ttYXJrIHZhcigtLWFuaW1hdGlvbi1pbnB1dCwgMC4ycykgZWFzZS1vdXQ7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQgODAlLCB2YXIoLS1jaGtiZykgODAlKSxcbiAgICAgIGxpbmVhci1ncmFkaWVudCgtOTBkZWcsIHRyYW5zcGFyZW50IDgwJSwgdmFyKC0tY2hrYmcpIDgwJSksXG4gICAgICBsaW5lYXItZ3JhZGllbnQoMGRlZywgdmFyKC0tY2hrYmcpIDQzJSwgdmFyKC0tY2hrZmcpIDQzJSwgdmFyKC0tY2hrZmcpIDU3JSwgdmFyKC0tY2hrYmcpIDU3JSk7XG59XHJcbkBrZXlmcmFtZXMgY2hlY2ttYXJrIHtcblxuICAwJSB7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbi15OiA1cHg7XG4gIH1cblxuICA1MCUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb24teTogLTJweDtcbiAgfVxuXG4gIDEwMCUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb24teTogMDtcbiAgfVxufVxyXG4ub3AtZGl2aWRlcjpub3QoOmVtcHR5KSB7XG4gIGdhcDogMXJlbTtcbn1cclxuLm9wLWRyb3Bkb3duLm9wLWRyb3Bkb3duLW9wZW4gLm9wLWRyb3Bkb3duLWNvbnRlbnQsXG4ub3AtZHJvcGRvd246Zm9jdXMgLm9wLWRyb3Bkb3duLWNvbnRlbnQsXG4ub3AtZHJvcGRvd246Zm9jdXMtd2l0aGluIC5vcC1kcm9wZG93bi1jb250ZW50IHtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4ub3AtZmlsZS1pbnB1dC1ib3JkZXJlZCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWZpbGUtaW5wdXQ6Zm9jdXMge1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC1maWxlLWlucHV0LWRpc2FibGVkLFxuICAub3AtZmlsZS1pbnB1dFtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWZpbGUtaW5wdXQtZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3AtZmlsZS1pbnB1dFtkaXNhYmxlZF06OnBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5KSkpO1xuICAtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLWZpbGUtaW5wdXQtZGlzYWJsZWQ6OmZpbGUtc2VsZWN0b3ItYnV0dG9uLCAub3AtZmlsZS1pbnB1dFtkaXNhYmxlZF06OmZpbGUtc2VsZWN0b3ItYnV0dG9uIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuMjtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1pbnB1dCBpbnB1dCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cclxuLm9wLWlucHV0IGlucHV0OmZvY3VzIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3AtaW5wdXRbbGlzdF06Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvciB7XG4gIGxpbmUtaGVpZ2h0OiAxZW07XG59XHJcbi5vcC1pbnB1dC1ib3JkZXJlZCB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3AtaW5wdXQ6Zm9jdXMsXG4gIC5vcC1pbnB1dDpmb2N1cy13aXRoaW4ge1xuICBib3gtc2hhZG93OiBub25lO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3AtaW5wdXQ6aGFzKD4gaW5wdXRbZGlzYWJsZWRdKSxcbiAgLm9wLWlucHV0LWRpc2FibGVkLFxuICAub3AtaW5wdXQ6ZGlzYWJsZWQsXG4gIC5vcC1pbnB1dFtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjQpKTtcbn1cclxuLm9wLWlucHV0Omhhcyg+IGlucHV0W2Rpc2FibGVkXSk6OnBsYWNlaG9sZGVyLFxuICAub3AtaW5wdXQtZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3AtaW5wdXQ6ZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3AtaW5wdXRbZGlzYWJsZWRdOjpwbGFjZWhvbGRlciB7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5OiAwLjI7XG59XHJcbi5vcC1pbnB1dDpoYXMoPiBpbnB1dFtkaXNhYmxlZF0pID4gaW5wdXRbZGlzYWJsZWRdIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cclxuLm9wLWlucHV0Ojotd2Via2l0LWRhdGUtYW5kLXRpbWUtdmFsdWUge1xuICB0ZXh0LWFsaWduOiBpbmhlcml0O1xufVxyXG4ub3Atam9pbiA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKSB7XG4gIG1hcmdpbi10b3A6IDBweDtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiAtMXB4O1xufVxyXG4ub3Atam9pbiA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKTppcygub3AtYnRuKSB7XG4gIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IGNhbGModmFyKC0tYm9yZGVyLWJ0bikgKiAtMSk7XG59XHJcbi5vcC1qb2luLWl0ZW06Zm9jdXMge1xuICBpc29sYXRpb246IGlzb2xhdGU7XG59XHJcbi5vcC1saW5rLXByaW1hcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5Ac3VwcG9ydHMgKGNvbG9yOmNvbG9yLW1peChpbiBva2xhYixibGFjayxibGFjaykpIHtcblxuICBAbWVkaWEgKGhvdmVyOmhvdmVyKSB7XG5cbiAgICAub3AtbGluay1wcmltYXJ5OmhvdmVyIHtcbiAgICAgIGNvbG9yOiBjb2xvci1taXgoaW4gb2tsYWIsdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS8xKSkgODAlLGJsYWNrKTtcbiAgICB9XG5cbiAgICAub3AtbGluay1zZWNvbmRhcnk6aG92ZXIge1xuICAgICAgY29sb3I6IGNvbG9yLW1peChpbiBva2xhYix2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpLzEpKSA4MCUsYmxhY2spO1xuICAgIH1cblxuICAgIC5vcC1saW5rLWFjY2VudDpob3ZlciB7XG4gICAgICBjb2xvcjogY29sb3ItbWl4KGluIG9rbGFiLHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvMSkpIDgwJSxibGFjayk7XG4gICAgfVxuICB9XG59XHJcbi5vcC1saW5rLXNlY29uZGFyeSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcyxva2xjaCh2YXIoLS1zKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1saW5rLWFjY2VudCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC1saW5rOmZvY3VzIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3AtbGluazpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm9wLWxvYWRpbmcge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBhc3BlY3QtcmF0aW86IDEgLyAxO1xuICB3aWR0aDogMS41cmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIC13ZWJraXQtbWFzay1zaXplOiAxMDAlO1xuICAgICAgICAgIG1hc2stc2l6ZTogMTAwJTtcbiAgLXdlYmtpdC1tYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICAgIG1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gIC13ZWJraXQtbWFzay1wb3NpdGlvbjogY2VudGVyO1xuICAgICAgICAgIG1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19ffSk7XG4gICAgICAgICAgbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xufVxyXG4ub3AtbG9hZGluZy1pbmZpbml0eSB7XG4gIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xuICAgICAgICAgIG1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX199KTtcbn1cclxuOndoZXJlKC5vcC1tZW51IGxpOmVtcHR5KSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuMTtcbiAgbWFyZ2luOiAwLjVyZW0gMXJlbTtcbiAgaGVpZ2h0OiAxcHg7XG59XHJcbi5vcC1tZW51IDp3aGVyZShsaSB1bCk6YmVmb3JlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDAuNzVyZW07XG4gIGluc2V0LWlubGluZS1zdGFydDogMHB4O1xuICB0b3A6IDAuNzVyZW07XG4gIHdpZHRoOiAxcHg7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIG9wYWNpdHk6IDAuMTtcbiAgY29udGVudDogXCJcIjtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUsIC5vcC1idG4pKSxcbi5vcC1tZW51IDp3aGVyZShsaTpub3QoLm9wLW1lbnUtdGl0bGUpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSkge1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAxcmVtO1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xuICB0ZXh0LWFsaWduOiBzdGFydDtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMjAwbXM7XG4gIHRleHQtd3JhcDogYmFsYW5jZTtcbn1cclxuOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSkpOm5vdChzdW1tYXJ5LCAub3AtYWN0aXZlLCAub3AtYnRuKS5vcC1mb2N1cywgOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSkpOm5vdChzdW1tYXJ5LCAub3AtYWN0aXZlLCAub3AtYnRuKTpmb2N1cywgOndoZXJlKC5vcC1tZW51IGxpOm5vdCgub3AtbWVudS10aXRsZSwgLm9wLWRpc2FibGVkKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSkpOmlzKHN1bW1hcnkpOm5vdCgub3AtYWN0aXZlLCAub3AtYnRuKTpmb2N1cy12aXNpYmxlLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KHN1bW1hcnksIC5vcC1hY3RpdmUsIC5vcC1idG4pLm9wLWZvY3VzLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6bm90KHN1bW1hcnksIC5vcC1hY3RpdmUsIC5vcC1idG4pOmZvY3VzLCA6d2hlcmUoLm9wLW1lbnUgbGk6bm90KC5vcC1tZW51LXRpdGxlLCAub3AtZGlzYWJsZWQpID4gZGV0YWlscyA+IHN1bW1hcnk6bm90KC5vcC1tZW51LXRpdGxlKSk6aXMoc3VtbWFyeSk6bm90KC5vcC1hY3RpdmUsIC5vcC1idG4pOmZvY3VzLXZpc2libGUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjEpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcbi5vcC1tZW51IGxpID4gKjpub3QodWwsIC5vcC1tZW51LXRpdGxlLCBkZXRhaWxzLCAub3AtYnRuKTphY3RpdmUsXG4ub3AtbWVudSBsaSA+ICo6bm90KHVsLCAub3AtbWVudS10aXRsZSwgZGV0YWlscywgLm9wLWJ0bikub3AtYWN0aXZlLFxuLm9wLW1lbnUgbGkgPiBkZXRhaWxzID4gc3VtbWFyeTphY3RpdmUge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLW4sb2tsY2godmFyKC0tbikvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1uYyxva2xjaCh2YXIoLS1uYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGkgPiBkZXRhaWxzID4gc3VtbWFyeSk6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuICBkaXNwbGF5OiBub25lO1xufVxyXG4ub3AtbWVudSA6d2hlcmUobGkgPiBkZXRhaWxzID4gc3VtbWFyeSk6YWZ0ZXIsXG4ub3AtbWVudSA6d2hlcmUobGkgPiAub3AtbWVudS1kcm9wZG93bi10b2dnbGUpOmFmdGVyIHtcbiAganVzdGlmeS1zZWxmOiBlbmQ7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tdG9wOiAtMC41cmVtO1xuICBoZWlnaHQ6IDAuNXJlbTtcbiAgd2lkdGg6IDAuNXJlbTtcbiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIG1hcmdpbi10b3A7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICBjb250ZW50OiBcIlwiO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiA3NSUgNzUlO1xuICBib3gtc2hhZG93OiAycHggMnB4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cclxuLm9wLW1lbnUgOndoZXJlKGxpID4gZGV0YWlsc1tvcGVuXSA+IHN1bW1hcnkpOmFmdGVyLFxuLm9wLW1lbnUgOndoZXJlKGxpID4gLm9wLW1lbnUtZHJvcGRvd24tdG9nZ2xlLm9wLW1lbnUtZHJvcGRvd24tc2hvdyk6YWZ0ZXIge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgyMjVkZWcpO1xuICBtYXJnaW4tdG9wOiAwO1xufVxyXG4ub3AtbW9ja3VwLWJyb3dzZXIgLm9wLW1vY2t1cC1icm93c2VyLXRvb2xiYXIgLm9wLWlucHV0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiAxLjc1cmVtO1xuICB3aWR0aDogMjRyZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBwYWRkaW5nLWxlZnQ6IDJyZW07XG4gIGRpcmVjdGlvbjogbHRyO1xufVxyXG4ub3AtbW9ja3VwLWJyb3dzZXIgLm9wLW1vY2t1cC1icm93c2VyLXRvb2xiYXIgLm9wLWlucHV0OmJlZm9yZSB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMC41cmVtO1xuICB0b3A6IDUwJTtcbiAgYXNwZWN0LXJhdGlvOiAxIC8gMTtcbiAgaGVpZ2h0OiAwLjc1cmVtO1xuICAtLXR3LXRyYW5zbGF0ZS15OiAtNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICBib3JkZXItd2lkdGg6IDJweDtcbiAgYm9yZGVyLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIG9wYWNpdHk6IDAuNjtcbn1cclxuLm9wLW1vY2t1cC1icm93c2VyIC5vcC1tb2NrdXAtYnJvd3Nlci10b29sYmFyIC5vcC1pbnB1dDphZnRlciB7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMS4yNXJlbTtcbiAgdG9wOiA1MCU7XG4gIGhlaWdodDogMC41cmVtO1xuICAtLXR3LXRyYW5zbGF0ZS15OiAyNSU7XG4gIC0tdHctcm90YXRlOiAtNDVkZWc7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgb3BhY2l0eTogMC42O1xufVxyXG4ub3AtbW9kYWw6bm90KGRpYWxvZzpub3QoLm9wLW1vZGFsLW9wZW4pKSxcbiAgLm9wLW1vZGFsOjpiYWNrZHJvcCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwMDA2O1xuICBhbmltYXRpb246IG1vZGFsLXBvcCAwLjJzIGVhc2Utb3V0O1xufVxyXG4ub3AtbW9kYWwtb3BlbiAub3AtbW9kYWwtYm94LFxuLm9wLW1vZGFsLXRvZ2dsZTpjaGVja2VkICsgLm9wLW1vZGFsIC5vcC1tb2RhbC1ib3gsXG4ub3AtbW9kYWw6dGFyZ2V0IC5vcC1tb2RhbC1ib3gsXG4ub3AtbW9kYWxbb3Blbl0gLm9wLW1vZGFsLWJveCB7XG4gIC0tdHctdHJhbnNsYXRlLXk6IDBweDtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG5Aa2V5ZnJhbWVzIG1vZGFsLXBvcCB7XG5cbiAgMCUge1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cbn1cclxuQGtleWZyYW1lcyBwcm9ncmVzcy1sb2FkaW5nIHtcblxuICA1MCUge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb24teDogLTExNSU7XG4gIH1cbn1cclxuLm9wLXJhZGlvOmZvY3VzIHtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cclxuLm9wLXJhZGlvOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMSkpO1xufVxyXG4ub3AtcmFkaW86Y2hlY2tlZCxcbiAgLm9wLXJhZGlvW2FyaWEtY2hlY2tlZD1cInRydWVcIl0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICBhbmltYXRpb246IHJhZGlvbWFyayB2YXIoLS1hbmltYXRpb24taW5wdXQsIDAuMnMpIGVhc2Utb3V0O1xuICBib3gtc2hhZG93OiAwIDAgMCA0cHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldCxcbiAgICAgIDAgMCAwIDRweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0O1xufVxyXG4ub3AtcmFkaW86ZGlzYWJsZWQge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICBvcGFjaXR5OiAwLjI7XG59XHJcbkBrZXlmcmFtZXMgcmFkaW9tYXJrIHtcblxuICAwJSB7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMTJweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0LFxuICAgICAgMCAwIDAgMTJweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0O1xuICB9XG5cbiAgNTAlIHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldCxcbiAgICAgIDAgMCAwIDNweCB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvMSkpIGluc2V0O1xuICB9XG5cbiAgMTAwJSB7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgNHB4IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS8xKSkgaW5zZXQsXG4gICAgICAwIDAgMCA0cHggdmFyKC0tZmFsbGJhY2stYjEsb2tsY2godmFyKC0tYjEpLzEpKSBpbnNldDtcbiAgfVxufVxyXG5Aa2V5ZnJhbWVzIHJhdGluZy1wb3Age1xuXG4gIDAlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuMTI1ZW0pO1xuICB9XG5cbiAgNDAlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuMTI1ZW0pO1xuICB9XG5cbiAgMTAwJSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICB9XG59XHJcbi5vcC1zZWxlY3QtYm9yZGVyZWQge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbn1cclxuLm9wLXNlbGVjdDpmb2N1cyB7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbiAgb3V0bGluZS13aWR0aDogMnB4O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBvdXRsaW5lLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4yKSk7XG59XHJcbi5vcC1zZWxlY3QtZGlzYWJsZWQsXG4gIC5vcC1zZWxlY3Q6ZGlzYWJsZWQsXG4gIC5vcC1zZWxlY3RbZGlzYWJsZWRdIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC40KSk7XG59XHJcbi5vcC1zZWxlY3QtZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3Atc2VsZWN0OmRpc2FibGVkOjpwbGFjZWhvbGRlcixcbiAgLm9wLXNlbGVjdFtkaXNhYmxlZF06OnBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5KSkpO1xuICAtLXR3LXBsYWNlaG9sZGVyLW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLXNlbGVjdC1tdWx0aXBsZSxcbiAgLm9wLXNlbGVjdFttdWx0aXBsZV0sXG4gIC5vcC1zZWxlY3Rbc2l6ZV0ub3Atc2VsZWN0Om5vdChbc2l6ZT1cIjFcIl0pIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbn1cclxuW2Rpcj1cInJ0bFwiXSAub3Atc2VsZWN0IHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2FsYygwJSArIDEycHgpIGNhbGMoMXB4ICsgNTAlKSxcbiAgICBjYWxjKDAlICsgMTZweCkgY2FsYygxcHggKyA1MCUpO1xufVxyXG5Aa2V5ZnJhbWVzIHNrZWxldG9uIHtcblxuICBmcm9tIHtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAxNTAlO1xuICB9XG5cbiAgdG8ge1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IC01MCU7XG4gIH1cbn1cclxuLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjpmb2N1cy12aXNpYmxlIHtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogMDtcbn1cclxuLm9wLXRhYjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pLCAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xufVxyXG4ub3AtdGFiOmZvY3VzIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG4ub3AtdGFiOmZvY3VzLXZpc2libGUge1xuICBvdXRsaW5lOiAycHggc29saWQgY3VycmVudENvbG9yO1xuICBvdXRsaW5lLW9mZnNldDogLTVweDtcbn1cclxuLm9wLXRhYi1kaXNhYmxlZCxcbiAgLm9wLXRhYltkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDAuMjtcbn1cclxuLm9wLXRhYnMtYm9yZGVyZWQgPiAub3AtdGFiIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDAuMjtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogY2FsYyh2YXIoLS10YWItYm9yZGVyLCAxcHgpICsgMXB4KTtcbn1cclxuLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYiB7XG4gIGJvcmRlcjogdmFyKC0tdGFiLWJvcmRlciwgMXB4KSBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXdpZHRoOiAwIDAgdmFyKC0tdGFiLWJvcmRlciwgMXB4KSAwO1xuICBib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOiB2YXIoLS10YWItcmFkaXVzLCAwLjVyZW0pO1xuICBib3JkZXItc3RhcnQtZW5kLXJhZGl1czogdmFyKC0tdGFiLXJhZGl1cywgMC41cmVtKTtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tdGFiLWJvcmRlci1jb2xvcik7XG4gIHBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS10YWItcGFkZGluZywgMXJlbSk7XG4gIHBhZGRpbmctaW5saW5lLWVuZDogdmFyKC0tdGFiLXBhZGRpbmcsIDFyZW0pO1xuICBwYWRkaW5nLXRvcDogdmFyKC0tdGFiLWJvcmRlciwgMXB4KTtcbn1cclxuLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pLCAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGFiLWJnKTtcbiAgYm9yZGVyLXdpZHRoOiB2YXIoLS10YWItYm9yZGVyLCAxcHgpIHZhcigtLXRhYi1ib3JkZXIsIDFweCkgMCB2YXIoLS10YWItYm9yZGVyLCAxcHgpO1xuICBib3JkZXItaW5saW5lLXN0YXJ0LWNvbG9yOiB2YXIoLS10YWItYm9yZGVyLWNvbG9yKTtcbiAgYm9yZGVyLWlubGluZS1lbmQtY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpO1xuICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS10YWItYm9yZGVyLWNvbG9yKTtcbiAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IGNhbGModmFyKC0tdGFiLXBhZGRpbmcsIDFyZW0pIC0gdmFyKC0tdGFiLWJvcmRlciwgMXB4KSk7XG4gIHBhZGRpbmctaW5saW5lLWVuZDogY2FsYyh2YXIoLS10YWItcGFkZGluZywgMXJlbSkgLSB2YXIoLS10YWItYm9yZGVyLCAxcHgpKTtcbiAgcGFkZGluZy1ib3R0b206IHZhcigtLXRhYi1ib3JkZXIsIDFweCk7XG4gIHBhZGRpbmctdG9wOiAwO1xufVxyXG4ub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSk6YmVmb3JlLCAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpOmJlZm9yZSB7XG4gIHotaW5kZXg6IDE7XG4gIGNvbnRlbnQ6IFwiXCI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiBjYWxjKDEwMCUgKyB2YXIoLS10YWItcmFkaXVzLCAwLjVyZW0pICogMik7XG4gIGhlaWdodDogdmFyKC0tdGFiLXJhZGl1cywgMC41cmVtKTtcbiAgYm90dG9tOiAwO1xuICBiYWNrZ3JvdW5kLXNpemU6IHZhcigtLXRhYi1yYWRpdXMsIDAuNXJlbSk7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCBsZWZ0LFxuICAgICAgICB0b3AgcmlnaHQ7XG4gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gIC0tdGFiLWdyYWQ6IGNhbGMoNjklIC0gdmFyKC0tdGFiLWJvcmRlciwgMXB4KSk7XG4gIC0tcmFkaXVzLXN0YXJ0OiByYWRpYWwtZ3JhZGllbnQoXG4gICAgICAgIGNpcmNsZSBhdCB0b3AgbGVmdCxcbiAgICAgICAgdHJhbnNwYXJlbnQgdmFyKC0tdGFiLWdyYWQpLFxuICAgICAgICB2YXIoLS10YWItYm9yZGVyLWNvbG9yKSBjYWxjKHZhcigtLXRhYi1ncmFkKSArIDAuMjVweCksXG4gICAgICAgIHZhcigtLXRhYi1ib3JkZXItY29sb3IpIGNhbGModmFyKC0tdGFiLWdyYWQpICsgdmFyKC0tdGFiLWJvcmRlciwgMXB4KSksXG4gICAgICAgIHZhcigtLXRhYi1iZykgY2FsYyh2YXIoLS10YWItZ3JhZCkgKyB2YXIoLS10YWItYm9yZGVyLCAxcHgpICsgMC4yNXB4KVxuICAgICAgKTtcbiAgLS1yYWRpdXMtZW5kOiByYWRpYWwtZ3JhZGllbnQoXG4gICAgICAgIGNpcmNsZSBhdCB0b3AgcmlnaHQsXG4gICAgICAgIHRyYW5zcGFyZW50IHZhcigtLXRhYi1ncmFkKSxcbiAgICAgICAgdmFyKC0tdGFiLWJvcmRlci1jb2xvcikgY2FsYyh2YXIoLS10YWItZ3JhZCkgKyAwLjI1cHgpLFxuICAgICAgICB2YXIoLS10YWItYm9yZGVyLWNvbG9yKSBjYWxjKHZhcigtLXRhYi1ncmFkKSArIHZhcigtLXRhYi1ib3JkZXIsIDFweCkpLFxuICAgICAgICB2YXIoLS10YWItYmcpIGNhbGModmFyKC0tdGFiLWdyYWQpICsgdmFyKC0tdGFiLWJvcmRlciwgMXB4KSArIDAuMjVweClcbiAgICAgICk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLXJhZGl1cy1zdGFydCksIHZhcigtLXJhZGl1cy1lbmQpO1xufVxyXG4ub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSk6Zmlyc3QtY2hpbGQ6YmVmb3JlLCAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpOmZpcnN0LWNoaWxkOmJlZm9yZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLXJhZGl1cy1lbmQpO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgcmlnaHQ7XG59XHJcbltkaXI9XCJydGxcIl0gLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmZpcnN0LWNoaWxkOmJlZm9yZSwgW2Rpcj1cInJ0bFwiXSAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpOmZpcnN0LWNoaWxkOmJlZm9yZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLXJhZGl1cy1zdGFydCk7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCBsZWZ0O1xufVxyXG4ub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSk6bGFzdC1jaGlsZDpiZWZvcmUsIC5vcC10YWJzLWxpZnRlZCA+IC5vcC10YWI6aXMoaW5wdXQ6Y2hlY2tlZCk6bGFzdC1jaGlsZDpiZWZvcmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB2YXIoLS1yYWRpdXMtc3RhcnQpO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDtcbn1cclxuW2Rpcj1cInJ0bFwiXSAub3AtdGFicy1saWZ0ZWQgPiAub3AtdGFiOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSk6bGFzdC1jaGlsZDpiZWZvcmUsIFtkaXI9XCJydGxcIl0gLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKTpsYXN0LWNoaWxkOmJlZm9yZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLXJhZGl1cy1lbmQpO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgcmlnaHQ7XG59XHJcbi5vcC10YWJzLWxpZnRlZFxuICA+IDppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pXG4gICsgLm9wLXRhYnMtbGlmdGVkXG4gIDppcygub3AtdGFiLWFjdGl2ZSwgW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdKTpub3QoLm9wLXRhYi1kaXNhYmxlZCk6bm90KFtkaXNhYmxlZF0pOmJlZm9yZSwgLm9wLXRhYnMtbGlmdGVkID4gLm9wLXRhYjppcyhpbnB1dDpjaGVja2VkKSArIC5vcC10YWJzLWxpZnRlZCAub3AtdGFiOmlzKGlucHV0OmNoZWNrZWQpOmJlZm9yZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLXJhZGl1cy1lbmQpO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgcmlnaHQ7XG59XHJcbi5vcC10YWJzLWJveGVkIHtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcm91bmRlZC1idG4sIDAuNXJlbSk7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIHBhZGRpbmc6IDAuMjVyZW07XG59XHJcbi5vcC10YWJzLWJveGVkIC5vcC10YWIge1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJ0biwgMC41cmVtKTtcbn1cclxuLm9wLXRhYnMtYm94ZWQgOmlzKC5vcC10YWItYWN0aXZlLCBbYXJpYS1zZWxlY3RlZD1cInRydWVcIl0pOm5vdCgub3AtdGFiLWRpc2FibGVkKTpub3QoW2Rpc2FibGVkXSksIC5vcC10YWJzLWJveGVkIDppcyhpbnB1dDpjaGVja2VkKSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stcCxva2xjaCh2YXIoLS1wKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXBjLG9rbGNoKHZhcigtLXBjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi5vcC10YWJsZTp3aGVyZShbZGlyPVwicnRsXCJdLCBbZGlyPVwicnRsXCJdICopIHtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG59XHJcbi5vcC10YWJsZSA6d2hlcmUodGgsIHRkKSB7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgcGFkZGluZy10b3A6IDAuNzVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAwLjc1cmVtO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxyXG4ub3AtdGFibGUgdHIub3AtYWN0aXZlLFxuICAub3AtdGFibGUgdHIub3AtYWN0aXZlOm50aC1jaGlsZChldmVuKSxcbiAgLm9wLXRhYmxlLXplYnJhIHRib2R5IHRyOm50aC1jaGlsZChldmVuKSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcbi5vcC10YWJsZSA6d2hlcmUodGhlYWQgdHIsIHRib2R5IHRyOm5vdCg6bGFzdC1jaGlsZCksIHRib2R5IHRyOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQpIHtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4O1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcbi5vcC10YWJsZSA6d2hlcmUodGhlYWQsIHRmb290KSB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDFyZW07XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC42KSk7XG59XHJcbi5vcC10YWJsZSA6d2hlcmUodGZvb3QpIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMXB4O1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcbi5vcC10ZXh0YXJlYS1ib3JkZXJlZCB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3AtdGV4dGFyZWE6Zm9jdXMge1xuICBib3gtc2hhZG93OiBub25lO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8wLjIpKTtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3AtdGV4dGFyZWEtZGlzYWJsZWQsXG4gIC5vcC10ZXh0YXJlYTpkaXNhYmxlZCxcbiAgLm9wLXRleHRhcmVhW2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYjIsb2tsY2godmFyKC0tYjIpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuNCkpO1xufVxyXG4ub3AtdGV4dGFyZWEtZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3AtdGV4dGFyZWE6ZGlzYWJsZWQ6OnBsYWNlaG9sZGVyLFxuICAub3AtdGV4dGFyZWFbZGlzYWJsZWRdOjpwbGFjZWhvbGRlciB7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctcGxhY2Vob2xkZXItb3BhY2l0eSkpKTtcbiAgLS10dy1wbGFjZWhvbGRlci1vcGFjaXR5OiAwLjI7XG59XHJcbkBrZXlmcmFtZXMgdG9hc3QtcG9wIHtcblxuICAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkpO1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cblxuICAxMDAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cclxuW2Rpcj1cInJ0bFwiXSAub3AtdG9nZ2xlIHtcbiAgLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yOiBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgKiAxKTtcbn1cclxuLm9wLXRvZ2dsZTpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZS1zdHlsZTogc29saWQ7XG4gIG91dGxpbmUtd2lkdGg6IDJweDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbiAgb3V0bGluZS1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpLzAuMikpO1xufVxyXG4ub3AtdG9nZ2xlOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogY3VycmVudENvbG9yO1xufVxyXG4ub3AtdG9nZ2xlOmNoZWNrZWQsXG4gIC5vcC10b2dnbGVbYXJpYS1jaGVja2VkPVwidHJ1ZVwiXSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIC0taGFuZGxlb2Zmc2V0Y2FsY3VsYXRvcjogdmFyKC0taGFuZGxlb2Zmc2V0KTtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5bZGlyPVwicnRsXCJdIC5vcC10b2dnbGU6Y2hlY2tlZCwgW2Rpcj1cInJ0bFwiXSAub3AtdG9nZ2xlW2FyaWEtY2hlY2tlZD1cInRydWVcIl0ge1xuICAtLWhhbmRsZW9mZnNldGNhbGN1bGF0b3I6IGNhbGModmFyKC0taGFuZGxlb2Zmc2V0KSAqIC0xKTtcbn1cclxuLm9wLXRvZ2dsZTppbmRldGVybWluYXRlIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xuICBib3gtc2hhZG93OiBjYWxjKHZhcigtLWhhbmRsZW9mZnNldCkgLyAyKSAwIDAgMnB4IHZhcigtLXRnbGJnKSBpbnNldCxcbiAgICAgIGNhbGModmFyKC0taGFuZGxlb2Zmc2V0KSAvIC0yKSAwIDAgMnB4IHZhcigtLXRnbGJnKSBpbnNldCxcbiAgICAgIDAgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQ7XG59XHJcbltkaXI9XCJydGxcIl0gLm9wLXRvZ2dsZTppbmRldGVybWluYXRlIHtcbiAgYm94LXNoYWRvdzogY2FsYyh2YXIoLS1oYW5kbGVvZmZzZXQpIC8gMikgMCAwIDJweCB2YXIoLS10Z2xiZykgaW5zZXQsXG4gICAgICAgIGNhbGModmFyKC0taGFuZGxlb2Zmc2V0KSAvIC0yKSAwIDAgMnB4IHZhcigtLXRnbGJnKSBpbnNldCxcbiAgICAgICAgMCAwIDAgMnB4IHZhcigtLXRnbGJnKSBpbnNldDtcbn1cclxuLm9wLXRvZ2dsZS1zZWNvbmRhcnk6Zm9jdXMtdmlzaWJsZSB7XG4gIG91dGxpbmUtY29sb3I6IHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvMSkpO1xufVxyXG4ub3AtdG9nZ2xlLXNlY29uZGFyeTpjaGVja2VkLFxuICAgIC5vcC10b2dnbGUtc2Vjb25kYXJ5W2FyaWEtY2hlY2tlZD1cInRydWVcIl0ge1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLXMsb2tsY2godmFyKC0tcykvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDAuMTtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc2Msb2tsY2godmFyKC0tc2MpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLm9wLXRvZ2dsZTpkaXNhYmxlZCB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgb3BhY2l0eTogMC4zO1xuICAtLXRvZ2dsZWhhbmRsZWJvcmRlcjogMCAwIDAgM3B4IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8xKSkgaW5zZXQsXG4gICAgICB2YXIoLS1oYW5kbGVvZmZzZXRjYWxjdWxhdG9yKSAwIDAgM3B4IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS8xKSkgaW5zZXQ7XG59XHJcbi5uby1hbmltYXRpb24ge1xuICAtLWJ0bi1mb2N1cy1zY2FsZTogMTtcbiAgLS1hbmltYXRpb24tYnRuOiAwO1xuICAtLWFuaW1hdGlvbi1pbnB1dDogMDtcbn1cclxuLm9wLWJ0bi14cyB7XG4gIGhlaWdodDogMS41cmVtO1xuICBtaW4taGVpZ2h0OiAxLjVyZW07XG4gIHBhZGRpbmctbGVmdDogMC41cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVyZW07XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbn1cclxuLm9wLWJ0bi1zbSB7XG4gIGhlaWdodDogMnJlbTtcbiAgbWluLWhlaWdodDogMnJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjc1cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xufVxyXG4ub3AtYnRuLXNxdWFyZTp3aGVyZSgub3AtYnRuLXhzKSB7XG4gIGhlaWdodDogMS41cmVtO1xuICB3aWR0aDogMS41cmVtO1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tc3F1YXJlOndoZXJlKC5vcC1idG4tc20pIHtcbiAgaGVpZ2h0OiAycmVtO1xuICB3aWR0aDogMnJlbTtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLXNxdWFyZTp3aGVyZSgub3AtYnRuLW1kKSB7XG4gIGhlaWdodDogM3JlbTtcbiAgd2lkdGg6IDNyZW07XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLm9wLWJ0bi1zcXVhcmU6d2hlcmUoLm9wLWJ0bi1sZykge1xuICBoZWlnaHQ6IDRyZW07XG4gIHdpZHRoOiA0cmVtO1xuICBwYWRkaW5nOiAwcHg7XG59XHJcbi5vcC1idG4tY2lyY2xlOndoZXJlKC5vcC1idG4teHMpIHtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIHdpZHRoOiAxLjVyZW07XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLWNpcmNsZTp3aGVyZSgub3AtYnRuLXNtKSB7XG4gIGhlaWdodDogMnJlbTtcbiAgd2lkdGg6IDJyZW07XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLWNpcmNsZTp3aGVyZSgub3AtYnRuLW1kKSB7XG4gIGhlaWdodDogM3JlbTtcbiAgd2lkdGg6IDNyZW07XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgcGFkZGluZzogMHB4O1xufVxyXG4ub3AtYnRuLWNpcmNsZTp3aGVyZSgub3AtYnRuLWxnKSB7XG4gIGhlaWdodDogNHJlbTtcbiAgd2lkdGg6IDRyZW07XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgcGFkZGluZzogMHB4O1xufVxyXG5bdHlwZT1cImNoZWNrYm94XCJdLm9wLWNoZWNrYm94LXhzIHtcbiAgaGVpZ2h0OiAxcmVtO1xuICB3aWR0aDogMXJlbTtcbn1cclxuW3R5cGU9XCJjaGVja2JveFwiXS5vcC1jaGVja2JveC1zbSB7XG4gIGhlaWdodDogMS4yNXJlbTtcbiAgd2lkdGg6IDEuMjVyZW07XG59XHJcbi5vcC1maWxlLWlucHV0LXNtIHtcbiAgaGVpZ2h0OiAycmVtO1xuICBwYWRkaW5nLWlubGluZS1lbmQ6IDAuNzVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xuICBsaW5lLWhlaWdodDogMjtcbn1cclxuLm9wLWZpbGUtaW5wdXQtc206OmZpbGUtc2VsZWN0b3ItYnV0dG9uIHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjc1cmVtO1xuICBmb250LXNpemU6IDAuODc1cmVtO1xufVxyXG4ub3AtaW5wdXQteHMge1xuICBoZWlnaHQ6IDEuNXJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwLjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNXJlbTtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xuICBsaW5lLWhlaWdodDogMXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNjI1O1xufVxyXG4ub3AtaW5wdXQtc20ge1xuICBoZWlnaHQ6IDJyZW07XG4gIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbiAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDJyZW07XG59XHJcbi5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwge1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxyXG4ub3Atam9pbi5vcC1qb2luLXZlcnRpY2FsIC5vcC1qb2luLWl0ZW06Zmlyc3QtY2hpbGQ6bm90KDpsYXN0LWNoaWxkKSxcbiAgLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCAqOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1lbmQtc3RhcnQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IGluaGVyaXQ7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG4ub3Atam9pbi5vcC1qb2luLXZlcnRpY2FsIC5vcC1qb2luLWl0ZW06bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSxcbiAgLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCAqOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkgLm9wLWpvaW4taXRlbSB7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLWVuZC1lbmQtcmFkaXVzOiBpbmhlcml0O1xufVxyXG4ub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwge1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xufVxyXG4ub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwgLm9wLWpvaW4taXRlbTpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpLFxuICAub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwgKjpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIC5vcC1qb2luLWl0ZW0ge1xuICBib3JkZXItZW5kLWVuZC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1lbmQtcmFkaXVzOiAwO1xuICBib3JkZXItZW5kLXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czogaW5oZXJpdDtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsIC5vcC1qb2luLWl0ZW06bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSxcbiAgLm9wLWpvaW4ub3Atam9pbi1ob3Jpem9udGFsICo6bGFzdC1jaGlsZDpub3QoOmZpcnN0LWNoaWxkKSAub3Atam9pbi1pdGVtIHtcbiAgYm9yZGVyLWVuZC1zdGFydC1yYWRpdXM6IDA7XG4gIGJvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6IDA7XG4gIGJvcmRlci1lbmQtZW5kLXJhZGl1czogaW5oZXJpdDtcbiAgYm9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6IGluaGVyaXQ7XG59XHJcblt0eXBlPVwicmFkaW9cIl0ub3AtcmFkaW8teHMge1xuICBoZWlnaHQ6IDFyZW07XG4gIHdpZHRoOiAxcmVtO1xufVxyXG4ub3Atc2VsZWN0LXNtIHtcbiAgaGVpZ2h0OiAycmVtO1xuICBtaW4taGVpZ2h0OiAycmVtO1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDJyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAycmVtO1xufVxyXG5bZGlyPVwicnRsXCJdIC5vcC1zZWxlY3Qtc20ge1xuICBwYWRkaW5nLWxlZnQ6IDJyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG59XHJcbi5vcC10YWJzLW1kIDp3aGVyZSgub3AtdGFiKSB7XG4gIGhlaWdodDogMnJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAyO1xuICAtLXRhYi1wYWRkaW5nOiAxcmVtO1xufVxyXG4ub3AtdGFicy1sZyA6d2hlcmUoLm9wLXRhYikge1xuICBoZWlnaHQ6IDNyZW07XG4gIGZvbnQtc2l6ZTogMS4xMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjc1cmVtO1xuICBsaW5lLWhlaWdodDogMjtcbiAgLS10YWItcGFkZGluZzogMS4yNXJlbTtcbn1cclxuLm9wLXRhYnMtc20gOndoZXJlKC5vcC10YWIpIHtcbiAgaGVpZ2h0OiAxLjVyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAuNzVyZW07XG4gIC0tdGFiLXBhZGRpbmc6IDAuNzVyZW07XG59XHJcbi5vcC10YWJzLXhzIDp3aGVyZSgub3AtdGFiKSB7XG4gIGhlaWdodDogMS4yNXJlbTtcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xuICBsaW5lLWhlaWdodDogLjc1cmVtO1xuICAtLXRhYi1wYWRkaW5nOiAwLjVyZW07XG59XHJcbi5vcC1jYXJkLWNvbXBhY3QgLm9wLWNhcmQtYm9keSB7XG4gIHBhZGRpbmc6IDFyZW07XG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjI1cmVtO1xufVxyXG4ub3AtY2FyZC1jb21wYWN0IC5vcC1jYXJkLXRpdGxlIHtcbiAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTtcbn1cclxuLm9wLWNhcmQtbm9ybWFsIC5vcC1jYXJkLWJvZHkge1xuICBwYWRkaW5nOiB2YXIoLS1wYWRkaW5nLWNhcmQsIDJyZW0pO1xuICBmb250LXNpemU6IDFyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG59XHJcbi5vcC1jYXJkLW5vcm1hbCAub3AtY2FyZC10aXRsZSB7XG4gIG1hcmdpbi1ib3R0b206IDAuNzVyZW07XG59XHJcbi5vcC1qb2luLm9wLWpvaW4tdmVydGljYWwgPiA6d2hlcmUoKjpub3QoOmZpcnN0LWNoaWxkKSkge1xuICBtYXJnaW4tbGVmdDogMHB4O1xuICBtYXJnaW4tcmlnaHQ6IDBweDtcbiAgbWFyZ2luLXRvcDogLTFweDtcbn1cclxuLm9wLWpvaW4ub3Atam9pbi12ZXJ0aWNhbCA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKTppcygub3AtYnRuKSB7XG4gIG1hcmdpbi10b3A6IGNhbGModmFyKC0tYm9yZGVyLWJ0bikgKiAtMSk7XG59XHJcbi5vcC1qb2luLm9wLWpvaW4taG9yaXpvbnRhbCA+IDp3aGVyZSgqOm5vdCg6Zmlyc3QtY2hpbGQpKSB7XG4gIG1hcmdpbi10b3A6IDBweDtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiAtMXB4O1xufVxyXG4ub3Atam9pbi5vcC1qb2luLWhvcml6b250YWwgPiA6d2hlcmUoKjpub3QoOmZpcnN0LWNoaWxkKSk6aXMoLm9wLWJ0bikge1xuICBtYXJnaW4taW5saW5lLXN0YXJ0OiBjYWxjKHZhcigtLWJvcmRlci1idG4pICogLTEpO1xufVxyXG4ub3AtbWVudS14cyA6d2hlcmUobGk6bm90KC5vcC1tZW51LXRpdGxlKSA+ICo6bm90KHVsLCBkZXRhaWxzLCAub3AtbWVudS10aXRsZSkpLCAub3AtbWVudS14cyA6d2hlcmUobGk6bm90KC5vcC1tZW51LXRpdGxlKSA+IGRldGFpbHMgPiBzdW1tYXJ5Om5vdCgub3AtbWVudS10aXRsZSkpIHtcbiAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwLjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNXJlbTtcbiAgcGFkZGluZy10b3A6IDAuMjVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAwLjI1cmVtO1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxcmVtO1xufVxyXG4ub3AtbWVudS14cyAub3AtbWVudS10aXRsZSB7XG4gIHBhZGRpbmctbGVmdDogMC41cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVyZW07XG4gIHBhZGRpbmctdG9wOiAwLjI1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC4yNXJlbTtcbn1cclxuLm9wLW1lbnUtc20gOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiAqOm5vdCh1bCwgZGV0YWlscywgLm9wLW1lbnUtdGl0bGUpKSwgLm9wLW1lbnUtc20gOndoZXJlKGxpOm5vdCgub3AtbWVudS10aXRsZSkgPiBkZXRhaWxzID4gc3VtbWFyeTpub3QoLm9wLW1lbnUtdGl0bGUpKSB7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYnRuLCAwLjVyZW0pO1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gIHBhZGRpbmctdG9wOiAwLjI1cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC4yNXJlbTtcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG59XHJcbi5vcC1tZW51LXNtIC5vcC1tZW51LXRpdGxlIHtcbiAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xufVxyXG4ub3AtbW9kYWwtdG9wIDp3aGVyZSgub3AtbW9kYWwtYm94KSB7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IG5vbmU7XG4gIC0tdHctdHJhbnNsYXRlLXk6IC0yLjVyZW07XG4gIC0tdHctc2NhbGUteDogMTtcbiAgLS10dy1zY2FsZS15OiAxO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwcHg7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7XG59XHJcbi5vcC1tb2RhbC1taWRkbGUgOndoZXJlKC5vcC1tb2RhbC1ib3gpIHtcbiAgd2lkdGg6IDkxLjY2NjY2NyU7XG4gIG1heC13aWR0aDogMzJyZW07XG4gIC0tdHctdHJhbnNsYXRlLXk6IDBweDtcbiAgLS10dy1zY2FsZS14OiAuOTtcbiAgLS10dy1zY2FsZS15OiAuOTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IHZhcigtLXJvdW5kZWQtYm94LCAxcmVtKTtcbiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogdmFyKC0tcm91bmRlZC1ib3gsIDFyZW0pO1xufVxyXG4ub3AtbW9kYWwtYm90dG9tIDp3aGVyZSgub3AtbW9kYWwtYm94KSB7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXgtd2lkdGg6IG5vbmU7XG4gIC0tdHctdHJhbnNsYXRlLXk6IDIuNXJlbTtcbiAgLS10dy1zY2FsZS14OiAxO1xuICAtLXR3LXNjYWxlLXk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDBweDtcbn1cclxuLnNyLW9ubHkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG4gIGhlaWdodDogMXB4O1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IC0xcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwgMCwgMCwgMCk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGJvcmRlci13aWR0aDogMDtcbn1cclxuLnBvaW50ZXItZXZlbnRzLW5vbmUge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cclxuLnZpc2libGUge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xufVxyXG4uZml4ZWQge1xuICBwb3NpdGlvbjogZml4ZWQ7XG59XHJcbi5hYnNvbHV0ZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cclxuLnJlbGF0aXZlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxyXG4uc3RpY2t5IHtcbiAgcG9zaXRpb246IHN0aWNreTtcbn1cclxuLmluc2V0LTAge1xuICBpbnNldDogMHB4O1xufVxyXG4uLWJvdHRvbS1cXFxcWzExcHhcXFxcXSB7XG4gIGJvdHRvbTogLTExcHg7XG59XHJcbi4tYm90dG9tLVxcXFxbMXB4XFxcXF0ge1xuICBib3R0b206IC0xcHg7XG59XHJcbi4tcmlnaHQtMSB7XG4gIHJpZ2h0OiAtMC4yNXJlbTtcbn1cclxuLi1yaWdodC0zIHtcbiAgcmlnaHQ6IC0wLjc1cmVtO1xufVxyXG4uLXJpZ2h0LVxcXFxbMTJweFxcXFxdIHtcbiAgcmlnaHQ6IC0xMnB4O1xufVxyXG4uLXJpZ2h0LVxcXFxbMTNweFxcXFxdIHtcbiAgcmlnaHQ6IC0xM3B4O1xufVxyXG4uLXJpZ2h0LVxcXFxbMXB4XFxcXF0ge1xuICByaWdodDogLTFweDtcbn1cclxuLi10b3AtMTIge1xuICB0b3A6IC0zcmVtO1xufVxyXG4uYm90dG9tLTAge1xuICBib3R0b206IDBweDtcbn1cclxuLmJvdHRvbS00IHtcbiAgYm90dG9tOiAxcmVtO1xufVxyXG4ubGVmdC0wIHtcbiAgbGVmdDogMHB4O1xufVxyXG4ubGVmdC0xXFxcXC8yIHtcbiAgbGVmdDogNTAlO1xufVxyXG4ucmlnaHQtMCB7XG4gIHJpZ2h0OiAwcHg7XG59XHJcbi5yaWdodC0xIHtcbiAgcmlnaHQ6IDAuMjVyZW07XG59XHJcbi5yaWdodC0yIHtcbiAgcmlnaHQ6IDAuNXJlbTtcbn1cclxuLnJpZ2h0LTMge1xuICByaWdodDogMC43NXJlbTtcbn1cclxuLnJpZ2h0LTQge1xuICByaWdodDogMXJlbTtcbn1cclxuLnJpZ2h0LTUge1xuICByaWdodDogMS4yNXJlbTtcbn1cclxuLnJpZ2h0LVxcXFxbMTBweFxcXFxdIHtcbiAgcmlnaHQ6IDEwcHg7XG59XHJcbi50b3AtMCB7XG4gIHRvcDogMHB4O1xufVxyXG4udG9wLTEge1xuICB0b3A6IDAuMjVyZW07XG59XHJcbi50b3AtMiB7XG4gIHRvcDogMC41cmVtO1xufVxyXG4udG9wLTIwIHtcbiAgdG9wOiA1cmVtO1xufVxyXG4udG9wLTMge1xuICB0b3A6IDAuNzVyZW07XG59XHJcbi50b3AtXFxcXFsxMFxcXFwlXFxcXF0ge1xuICB0b3A6IDEwJTtcbn1cclxuLnRvcC1cXFxcWzFweFxcXFxdIHtcbiAgdG9wOiAxcHg7XG59XHJcbi50b3AtXFxcXFsyXFxcXC41NXJlbVxcXFxdIHtcbiAgdG9wOiAyLjU1cmVtO1xufVxyXG4udG9wLVxcXFxbNTBcXFxcJVxcXFxdIHtcbiAgdG9wOiA1MCU7XG59XHJcbi50b3AtYXV0byB7XG4gIHRvcDogYXV0bztcbn1cclxuLi16LVxcXFxbMVxcXFxdIHtcbiAgei1pbmRleDogLTE7XG59XHJcbi56LTEwIHtcbiAgei1pbmRleDogMTA7XG59XHJcbi56LTIwIHtcbiAgei1pbmRleDogMjA7XG59XHJcbi56LTMwIHtcbiAgei1pbmRleDogMzA7XG59XHJcbi56LTQwIHtcbiAgei1pbmRleDogNDA7XG59XHJcbi56LTUwIHtcbiAgei1pbmRleDogNTA7XG59XHJcbi56LVxcXFxbMTAwMFxcXFxdIHtcbiAgei1pbmRleDogMTAwMDtcbn1cclxuLnotXFxcXFsxMDBcXFxcXSB7XG4gIHotaW5kZXg6IDEwMDtcbn1cclxuLnotXFxcXFsxMzAwXFxcXF0ge1xuICB6LWluZGV4OiAxMzAwO1xufVxyXG4uei1cXFxcWzE5OTlcXFxcXSB7XG4gIHotaW5kZXg6IDE5OTk7XG59XHJcbi56LVxcXFxbMVxcXFxdIHtcbiAgei1pbmRleDogMTtcbn1cclxuLnotXFxcXFsyMDBcXFxcXSB7XG4gIHotaW5kZXg6IDIwMDtcbn1cclxuLnotXFxcXFsyMFxcXFxdIHtcbiAgei1pbmRleDogMjA7XG59XHJcbi56LVxcXFxbMzBcXFxcXSB7XG4gIHotaW5kZXg6IDMwO1xufVxyXG4uei1cXFxcWzQ0OFxcXFxdIHtcbiAgei1pbmRleDogNDQ4O1xufVxyXG4uei1cXFxcWzUwMFxcXFxdIHtcbiAgei1pbmRleDogNTAwO1xufVxyXG4uei1cXFxcWzUwMVxcXFxdIHtcbiAgei1pbmRleDogNTAxO1xufVxyXG4uei1cXFxcWzcwXFxcXF0ge1xuICB6LWluZGV4OiA3MDtcbn1cclxuLnotXFxcXFs5OTlcXFxcXSB7XG4gIHotaW5kZXg6IDk5OTtcbn1cclxuLnotXFxcXFs5OVxcXFxdIHtcbiAgei1pbmRleDogOTk7XG59XHJcbi5vcmRlci1sYXN0IHtcbiAgb3JkZXI6IDk5OTk7XG59XHJcbi5jb2wtc3Bhbi0xMiB7XG4gIGdyaWQtY29sdW1uOiBzcGFuIDEyIC8gc3BhbiAxMjtcbn1cclxuLm0tMSB7XG4gIG1hcmdpbjogMC4yNXJlbTtcbn1cclxuLm0tMiB7XG4gIG1hcmdpbjogMC41cmVtO1xufVxyXG4ubS04IHtcbiAgbWFyZ2luOiAycmVtO1xufVxyXG4ubS1cXFxcWzEwcHhcXFxcXSB7XG4gIG1hcmdpbjogMTBweDtcbn1cclxuLm0tXFxcXFsxNXB4XFxcXF0ge1xuICBtYXJnaW46IDE1cHg7XG59XHJcbi5tLVxcXFxbMjBweFxcXFxdIHtcbiAgbWFyZ2luOiAyMHB4O1xufVxyXG4ubS1cXFxcWzJweFxcXFxdIHtcbiAgbWFyZ2luOiAycHg7XG59XHJcbi5tLVxcXFxbNHB4XFxcXF0ge1xuICBtYXJnaW46IDRweDtcbn1cclxuLm14LTEge1xuICBtYXJnaW4tbGVmdDogMC4yNXJlbTtcbiAgbWFyZ2luLXJpZ2h0OiAwLjI1cmVtO1xufVxyXG4ubXgtMiB7XG4gIG1hcmdpbi1sZWZ0OiAwLjVyZW07XG4gIG1hcmdpbi1yaWdodDogMC41cmVtO1xufVxyXG4ubXgtMyB7XG4gIG1hcmdpbi1sZWZ0OiAwLjc1cmVtO1xuICBtYXJnaW4tcmlnaHQ6IDAuNzVyZW07XG59XHJcbi5teC00IHtcbiAgbWFyZ2luLWxlZnQ6IDFyZW07XG4gIG1hcmdpbi1yaWdodDogMXJlbTtcbn1cclxuLm14LTgge1xuICBtYXJnaW4tbGVmdDogMnJlbTtcbiAgbWFyZ2luLXJpZ2h0OiAycmVtO1xufVxyXG4ubXgtXFxcXFsxMDBweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDEwMHB4O1xuICBtYXJnaW4tcmlnaHQ6IDEwMHB4O1xufVxyXG4ubXgtXFxcXFsyNVxcXFwlXFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMjUlO1xuICBtYXJnaW4tcmlnaHQ6IDI1JTtcbn1cclxuLm14LVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMnB4O1xuICBtYXJnaW4tcmlnaHQ6IDJweDtcbn1cclxuLm14LVxcXFxbM3B4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogM3B4O1xuICBtYXJnaW4tcmlnaHQ6IDNweDtcbn1cclxuLm14LVxcXFxbNHB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogNHB4O1xuICBtYXJnaW4tcmlnaHQ6IDRweDtcbn1cclxuLm14LVxcXFxbNXB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogNXB4O1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cclxuLm14LWF1dG8ge1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xufVxyXG4ubXktMFxcXFwuNSB7XG4gIG1hcmdpbi10b3A6IDAuMTI1cmVtO1xuICBtYXJnaW4tYm90dG9tOiAwLjEyNXJlbTtcbn1cclxuLm15LTEge1xuICBtYXJnaW4tdG9wOiAwLjI1cmVtO1xuICBtYXJnaW4tYm90dG9tOiAwLjI1cmVtO1xufVxyXG4ubXktMiB7XG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xufVxyXG4ubXktMyB7XG4gIG1hcmdpbi10b3A6IDAuNzVyZW07XG4gIG1hcmdpbi1ib3R0b206IDAuNzVyZW07XG59XHJcbi5teS00IHtcbiAgbWFyZ2luLXRvcDogMXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbn1cclxuLm15LVxcXFxbMTBweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn1cclxuLm15LVxcXFxbMTVweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMTVweDtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cclxuLm15LVxcXFxbMXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxcHg7XG4gIG1hcmdpbi1ib3R0b206IDFweDtcbn1cclxuLm15LVxcXFxbMjBweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cclxuLm15LVxcXFxbMnB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAycHg7XG4gIG1hcmdpbi1ib3R0b206IDJweDtcbn1cclxuLm15LVxcXFxbNXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cclxuLm1iLTAge1xuICBtYXJnaW4tYm90dG9tOiAwcHg7XG59XHJcbi5tYi0wXFxcXC41IHtcbiAgbWFyZ2luLWJvdHRvbTogMC4xMjVyZW07XG59XHJcbi5tYi0xIHtcbiAgbWFyZ2luLWJvdHRvbTogMC4yNXJlbTtcbn1cclxuLm1iLTExIHtcbiAgbWFyZ2luLWJvdHRvbTogMi43NXJlbTtcbn1cclxuLm1iLTIge1xuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG59XHJcbi5tYi0yXFxcXC41IHtcbiAgbWFyZ2luLWJvdHRvbTogMC42MjVyZW07XG59XHJcbi5tYi0zIHtcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcbn1cclxuLm1iLTQge1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xufVxyXG4ubWItOCB7XG4gIG1hcmdpbi1ib3R0b206IDJyZW07XG59XHJcbi5tYi1cXFxcWzBcXFxcLjM1cmVtXFxcXF0ge1xuICBtYXJnaW4tYm90dG9tOiAwLjM1cmVtO1xufVxyXG4ubWItXFxcXFswXFxcXC41cmVtXFxcXF0ge1xuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG59XHJcbi5tYi1cXFxcWzBcXFxcLjc1cmVtXFxcXF0ge1xuICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtO1xufVxyXG4ubWItXFxcXFsxMHB4XFxcXF0ge1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xufVxyXG4ubWItXFxcXFsxNXB4XFxcXF0ge1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xufVxyXG4ubWItXFxcXFsxNnB4XFxcXF0ge1xuICBtYXJnaW4tYm90dG9tOiAxNnB4O1xufVxyXG4ubWItXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbi1ib3R0b206IDJweDtcbn1cclxuLm1iLVxcXFxbNXB4XFxcXF0ge1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG59XHJcbi5tbC0wXFxcXC41IHtcbiAgbWFyZ2luLWxlZnQ6IDAuMTI1cmVtO1xufVxyXG4ubWwtMSB7XG4gIG1hcmdpbi1sZWZ0OiAwLjI1cmVtO1xufVxyXG4ubWwtMVxcXFwuNSB7XG4gIG1hcmdpbi1sZWZ0OiAwLjM3NXJlbTtcbn1cclxuLm1sLTIge1xuICBtYXJnaW4tbGVmdDogMC41cmVtO1xufVxyXG4ubWwtMyB7XG4gIG1hcmdpbi1sZWZ0OiAwLjc1cmVtO1xufVxyXG4ubWwtNCB7XG4gIG1hcmdpbi1sZWZ0OiAxcmVtO1xufVxyXG4ubWwtXFxcXFswXFxcXC41cmVtXFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMC41cmVtO1xufVxyXG4ubWwtXFxcXFsxMHB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogMTBweDtcbn1cclxuLm1sLVxcXFxbMTNweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDEzcHg7XG59XHJcbi5tbC1cXFxcWzIwcHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAyMHB4O1xufVxyXG4ubWwtXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG59XHJcbi5tbC1cXFxcWzNweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDNweDtcbn1cclxuLm1sLVxcXFxbNHB4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogNHB4O1xufVxyXG4ubWwtXFxcXFs1cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA1cHg7XG59XHJcbi5tbC1cXFxcWzZweFxcXFxdIHtcbiAgbWFyZ2luLWxlZnQ6IDZweDtcbn1cclxuLm1sLVxcXFxbN3B4XFxcXF0ge1xuICBtYXJnaW4tbGVmdDogN3B4O1xufVxyXG4ubWwtXFxcXFs4cHhcXFxcXSB7XG4gIG1hcmdpbi1sZWZ0OiA4cHg7XG59XHJcbi5tci0xIHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjI1cmVtO1xufVxyXG4ubXItMVxcXFwuNSB7XG4gIG1hcmdpbi1yaWdodDogMC4zNzVyZW07XG59XHJcbi5tci0yIHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjVyZW07XG59XHJcbi5tci00IHtcbiAgbWFyZ2luLXJpZ2h0OiAxcmVtO1xufVxyXG4ubXItXFxcXFsxMHB4XFxcXF0ge1xuICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG59XHJcbi5tci1cXFxcWzJweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiAycHg7XG59XHJcbi5tci1cXFxcWzNweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiAzcHg7XG59XHJcbi5tci1cXFxcWzRweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiA0cHg7XG59XHJcbi5tci1cXFxcWzVweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiA1cHg7XG59XHJcbi5tci1cXFxcWzhweFxcXFxdIHtcbiAgbWFyZ2luLXJpZ2h0OiA4cHg7XG59XHJcbi5tdC0wIHtcbiAgbWFyZ2luLXRvcDogMHB4O1xufVxyXG4ubXQtMFxcXFwuNSB7XG4gIG1hcmdpbi10b3A6IDAuMTI1cmVtO1xufVxyXG4ubXQtMSB7XG4gIG1hcmdpbi10b3A6IDAuMjVyZW07XG59XHJcbi5tdC0xXFxcXC41IHtcbiAgbWFyZ2luLXRvcDogMC4zNzVyZW07XG59XHJcbi5tdC0yIHtcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xufVxyXG4ubXQtMlxcXFwuNSB7XG4gIG1hcmdpbi10b3A6IDAuNjI1cmVtO1xufVxyXG4ubXQtMyB7XG4gIG1hcmdpbi10b3A6IDAuNzVyZW07XG59XHJcbi5tdC00IHtcbiAgbWFyZ2luLXRvcDogMXJlbTtcbn1cclxuLm10LTYge1xuICBtYXJnaW4tdG9wOiAxLjVyZW07XG59XHJcbi5tdC1cXFxcWzBcXFxcLjRyZW1cXFxcXSB7XG4gIG1hcmdpbi10b3A6IDAuNHJlbTtcbn1cclxuLm10LVxcXFxbMFxcXFwuNXJlbVxcXFxdIHtcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xufVxyXG4ubXQtXFxcXFswXFxcXC43NTByZW1cXFxcXSB7XG4gIG1hcmdpbi10b3A6IDAuNzUwcmVtO1xufVxyXG4ubXQtXFxcXFsxMHB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxMHB4O1xufVxyXG4ubXQtXFxcXFsxNHB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxNHB4O1xufVxyXG4ubXQtXFxcXFsxNXB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xufVxyXG4ubXQtXFxcXFsxcmVtXFxcXF0ge1xuICBtYXJnaW4tdG9wOiAxcmVtO1xufVxyXG4ubXQtXFxcXFsycHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDJweDtcbn1cclxuLm10LVxcXFxbM3B4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiAzcHg7XG59XHJcbi5tdC1cXFxcWzQzcHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDQzcHg7XG59XHJcbi5tdC1cXFxcWzVweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xufVxyXG4ubXQtXFxcXFs2cHhcXFxcXSB7XG4gIG1hcmdpbi10b3A6IDZweDtcbn1cclxuLm10LVxcXFxbOHB4XFxcXF0ge1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XHJcbi5tdC1cXFxcWzlweFxcXFxdIHtcbiAgbWFyZ2luLXRvcDogOXB4O1xufVxyXG4uYmxvY2sge1xuICBkaXNwbGF5OiBibG9jaztcbn1cclxuLmlubGluZS1ibG9jayB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cclxuLmlubGluZSB7XG4gIGRpc3BsYXk6IGlubGluZTtcbn1cclxuLmZsZXgge1xuICBkaXNwbGF5OiBmbGV4O1xufVxyXG4uaW5saW5lLWZsZXgge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbn1cclxuLnRhYmxlIHtcbiAgZGlzcGxheTogdGFibGU7XG59XHJcbi5ncmlkIHtcbiAgZGlzcGxheTogZ3JpZDtcbn1cclxuLmNvbnRlbnRzIHtcbiAgZGlzcGxheTogY29udGVudHM7XG59XHJcbi5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxyXG4uaC0yIHtcbiAgaGVpZ2h0OiAwLjVyZW07XG59XHJcbi5oLTUge1xuICBoZWlnaHQ6IDEuMjVyZW07XG59XHJcbi5oLVxcXFxbMFxcXFwuNXB4XFxcXF0ge1xuICBoZWlnaHQ6IDAuNXB4O1xufVxyXG4uaC1cXFxcWzFcXFxcLjRyZW1cXFxcXSB7XG4gIGhlaWdodDogMS40cmVtO1xufVxyXG4uaC1cXFxcWzFcXFxcLjdyZW1cXFxcXSB7XG4gIGhlaWdodDogMS43cmVtO1xufVxyXG4uaC1cXFxcWzEwMFxcXFwlXFxcXF0ge1xuICBoZWlnaHQ6IDEwMCU7XG59XHJcbi5oLVxcXFxbMTAwcHhcXFxcXSB7XG4gIGhlaWdodDogMTAwcHg7XG59XHJcbi5oLVxcXFxbMTAwdmhcXFxcXSB7XG4gIGhlaWdodDogMTAwdmg7XG59XHJcbi5oLVxcXFxbMTExcHhcXFxcXSB7XG4gIGhlaWdodDogMTExcHg7XG59XHJcbi5oLVxcXFxbMTIwcHhcXFxcXSB7XG4gIGhlaWdodDogMTIwcHg7XG59XHJcbi5oLVxcXFxbMTMwcHhcXFxcXSB7XG4gIGhlaWdodDogMTMwcHg7XG59XHJcbi5oLVxcXFxbMTQwcHhcXFxcXSB7XG4gIGhlaWdodDogMTQwcHg7XG59XHJcbi5oLVxcXFxbMTRweFxcXFxdIHtcbiAgaGVpZ2h0OiAxNHB4O1xufVxyXG4uaC1cXFxcWzE1MHB4XFxcXF0ge1xuICBoZWlnaHQ6IDE1MHB4O1xufVxyXG4uaC1cXFxcWzE5cHhcXFxcXSB7XG4gIGhlaWdodDogMTlweDtcbn1cclxuLmgtXFxcXFsxcHhcXFxcXSB7XG4gIGhlaWdodDogMXB4O1xufVxyXG4uaC1cXFxcWzIwMHB4XFxcXF0ge1xuICBoZWlnaHQ6IDIwMHB4O1xufVxyXG4uaC1cXFxcWzIwcHhcXFxcXSB7XG4gIGhlaWdodDogMjBweDtcbn1cclxuLmgtXFxcXFsyNTBweFxcXFxdIHtcbiAgaGVpZ2h0OiAyNTBweDtcbn1cclxuLmgtXFxcXFsyNXB4XFxcXF0ge1xuICBoZWlnaHQ6IDI1cHg7XG59XHJcbi5oLVxcXFxbMjZweFxcXFxdIHtcbiAgaGVpZ2h0OiAyNnB4O1xufVxyXG4uaC1cXFxcWzMwMHB4XFxcXF0ge1xuICBoZWlnaHQ6IDMwMHB4O1xufVxyXG4uaC1cXFxcWzMwcHhcXFxcXSB7XG4gIGhlaWdodDogMzBweDtcbn1cclxuLmgtXFxcXFszMTdweFxcXFxdIHtcbiAgaGVpZ2h0OiAzMTdweDtcbn1cclxuLmgtXFxcXFszMnB4XFxcXF0ge1xuICBoZWlnaHQ6IDMycHg7XG59XHJcbi5oLVxcXFxbMzVweFxcXFxdIHtcbiAgaGVpZ2h0OiAzNXB4O1xufVxyXG4uaC1cXFxcWzM4cHhcXFxcXSB7XG4gIGhlaWdodDogMzhweDtcbn1cclxuLmgtXFxcXFs0MHB4XFxcXF0ge1xuICBoZWlnaHQ6IDQwcHg7XG59XHJcbi5oLVxcXFxbNTAwcHhcXFxcXSB7XG4gIGhlaWdodDogNTAwcHg7XG59XHJcbi5oLVxcXFxbNTB2aFxcXFxdIHtcbiAgaGVpZ2h0OiA1MHZoO1xufVxyXG4uaC1cXFxcWzYwcHhcXFxcXSB7XG4gIGhlaWdodDogNjBweDtcbn1cclxuLmgtXFxcXFs2NnB4XFxcXF0ge1xuICBoZWlnaHQ6IDY2cHg7XG59XHJcbi5oLVxcXFxbNzBweFxcXFxdIHtcbiAgaGVpZ2h0OiA3MHB4O1xufVxyXG4uaC1cXFxcWzc1cHhcXFxcXSB7XG4gIGhlaWdodDogNzVweDtcbn1cclxuLmgtXFxcXFs5MFxcXFwlXFxcXF0ge1xuICBoZWlnaHQ6IDkwJTtcbn1cclxuLmgtXFxcXFs5NVxcXFwlXFxcXF0ge1xuICBoZWlnaHQ6IDk1JTtcbn1cclxuLmgtZnVsbCB7XG4gIGhlaWdodDogMTAwJTtcbn1cclxuLmgtc2NyZWVuIHtcbiAgaGVpZ2h0OiAxMDB2aDtcbn1cclxuLm1heC1oLTk2IHtcbiAgbWF4LWhlaWdodDogMjRyZW07XG59XHJcbi5tYXgtaC1cXFxcWzEwMHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAxMDBweDtcbn1cclxuLm1heC1oLVxcXFxbMTAwdmhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDEwMHZoO1xufVxyXG4ubWF4LWgtXFxcXFsxODBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMTgwcHg7XG59XHJcbi5tYXgtaC1cXFxcWzIxMHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAyMTBweDtcbn1cclxuLm1heC1oLVxcXFxbMjUwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDI1MHB4O1xufVxyXG4ubWF4LWgtXFxcXFszMDBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogMzAwcHg7XG59XHJcbi5tYXgtaC1cXFxcWzMxMHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAzMTBweDtcbn1cclxuLm1heC1oLVxcXFxbMzQwcHhcXFxcXSB7XG4gIG1heC1oZWlnaHQ6IDM0MHB4O1xufVxyXG4ubWF4LWgtXFxcXFszNXB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAzNXB4O1xufVxyXG4ubWF4LWgtXFxcXFszOHB4XFxcXF0ge1xuICBtYXgtaGVpZ2h0OiAzOHB4O1xufVxyXG4ubWF4LWgtXFxcXFs2MDBweFxcXFxdIHtcbiAgbWF4LWhlaWdodDogNjAwcHg7XG59XHJcbi5tYXgtaC1mdWxsIHtcbiAgbWF4LWhlaWdodDogMTAwJTtcbn1cclxuLm1heC1oLXNjcmVlbiB7XG4gIG1heC1oZWlnaHQ6IDEwMHZoO1xufVxyXG4ubWluLWgtbWF4IHtcbiAgbWluLWhlaWdodDogbWF4LWNvbnRlbnQ7XG59XHJcbi5taW4taC1zY3JlZW4ge1xuICBtaW4taGVpZ2h0OiAxMDB2aDtcbn1cclxuLnctMCB7XG4gIHdpZHRoOiAwcHg7XG59XHJcbi53LTFcXFxcLzQge1xuICB3aWR0aDogMjUlO1xufVxyXG4udy01IHtcbiAgd2lkdGg6IDEuMjVyZW07XG59XHJcbi53LTUyIHtcbiAgd2lkdGg6IDEzcmVtO1xufVxyXG4udy05IHtcbiAgd2lkdGg6IDIuMjVyZW07XG59XHJcbi53LVxcXFxbMVxcXFwuNHJlbVxcXFxdIHtcbiAgd2lkdGg6IDEuNHJlbTtcbn1cclxuLnctXFxcXFsxXFxcXC43cmVtXFxcXF0ge1xuICB3aWR0aDogMS43cmVtO1xufVxyXG4udy1cXFxcWzEwMHB4XFxcXF0ge1xuICB3aWR0aDogMTAwcHg7XG59XHJcbi53LVxcXFxbMTBweFxcXFxdIHtcbiAgd2lkdGg6IDEwcHg7XG59XHJcbi53LVxcXFxbMTEwcHhcXFxcXSB7XG4gIHdpZHRoOiAxMTBweDtcbn1cclxuLnctXFxcXFsxMjBweFxcXFxdIHtcbiAgd2lkdGg6IDEyMHB4O1xufVxyXG4udy1cXFxcWzE0cHhcXFxcXSB7XG4gIHdpZHRoOiAxNHB4O1xufVxyXG4udy1cXFxcWzE1MHB4XFxcXF0ge1xuICB3aWR0aDogMTUwcHg7XG59XHJcbi53LVxcXFxbMThcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDE4JTtcbn1cclxuLnctXFxcXFsxODBweFxcXFxdIHtcbiAgd2lkdGg6IDE4MHB4O1xufVxyXG4udy1cXFxcWzE4M3B4XFxcXF0ge1xuICB3aWR0aDogMTgzcHg7XG59XHJcbi53LVxcXFxbMjBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDIwJTtcbn1cclxuLnctXFxcXFsyMDBweFxcXFxdIHtcbiAgd2lkdGg6IDIwMHB4O1xufVxyXG4udy1cXFxcWzIxMHB4XFxcXF0ge1xuICB3aWR0aDogMjEwcHg7XG59XHJcbi53LVxcXFxbMjIwcHhcXFxcXSB7XG4gIHdpZHRoOiAyMjBweDtcbn1cclxuLnctXFxcXFsyM1xcXFwlXFxcXF0ge1xuICB3aWR0aDogMjMlO1xufVxyXG4udy1cXFxcWzIzcHhcXFxcXSB7XG4gIHdpZHRoOiAyM3B4O1xufVxyXG4udy1cXFxcWzI1MHB4XFxcXF0ge1xuICB3aWR0aDogMjUwcHg7XG59XHJcbi53LVxcXFxbMjVweFxcXFxdIHtcbiAgd2lkdGg6IDI1cHg7XG59XHJcbi53LVxcXFxbMjZweFxcXFxdIHtcbiAgd2lkdGg6IDI2cHg7XG59XHJcbi53LVxcXFxbMjgwcHhcXFxcXSB7XG4gIHdpZHRoOiAyODBweDtcbn1cclxuLnctXFxcXFszMFxcXFwlXFxcXF0ge1xuICB3aWR0aDogMzAlO1xufVxyXG4udy1cXFxcWzMwcHhcXFxcXSB7XG4gIHdpZHRoOiAzMHB4O1xufVxyXG4udy1cXFxcWzM1cHhcXFxcXSB7XG4gIHdpZHRoOiAzNXB4O1xufVxyXG4udy1cXFxcWzQwcHhcXFxcXSB7XG4gIHdpZHRoOiA0MHB4O1xufVxyXG4udy1cXFxcWzQ1MHB4XFxcXF0ge1xuICB3aWR0aDogNDUwcHg7XG59XHJcbi53LVxcXFxbNHJlbVxcXFxdIHtcbiAgd2lkdGg6IDRyZW07XG59XHJcbi53LVxcXFxbNTBcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDUwJTtcbn1cclxuLnctXFxcXFs1MHB4XFxcXF0ge1xuICB3aWR0aDogNTBweDtcbn1cclxuLnctXFxcXFs2MHB4XFxcXF0ge1xuICB3aWR0aDogNjBweDtcbn1cclxuLnctXFxcXFs2NXB4XFxcXF0ge1xuICB3aWR0aDogNjVweDtcbn1cclxuLnctXFxcXFs3MFxcXFwlXFxcXF0ge1xuICB3aWR0aDogNzAlO1xufVxyXG4udy1cXFxcWzc1cHhcXFxcXSB7XG4gIHdpZHRoOiA3NXB4O1xufVxyXG4udy1cXFxcWzgwXFxcXCVcXFxcXSB7XG4gIHdpZHRoOiA4MCU7XG59XHJcbi53LVxcXFxbODdcXFxcJVxcXFxdIHtcbiAgd2lkdGg6IDg3JTtcbn1cclxuLnctXFxcXFs5MFxcXFwlXFxcXF0ge1xuICB3aWR0aDogOTAlO1xufVxyXG4udy1cXFxcWzkwcHhcXFxcXSB7XG4gIHdpZHRoOiA5MHB4O1xufVxyXG4udy1cXFxcWzk1XFxcXCVcXFxcXSB7XG4gIHdpZHRoOiA5NSU7XG59XHJcbi53LWF1dG8ge1xuICB3aWR0aDogYXV0bztcbn1cclxuLnctZml0IHtcbiAgd2lkdGg6IGZpdC1jb250ZW50O1xufVxyXG4udy1mdWxsIHtcbiAgd2lkdGg6IDEwMCU7XG59XHJcbi53LW1heCB7XG4gIHdpZHRoOiBtYXgtY29udGVudDtcbn1cclxuLm1pbi13LTU2IHtcbiAgbWluLXdpZHRoOiAxNHJlbTtcbn1cclxuLm1pbi13LVxcXFxbMzAwcHhcXFxcXSB7XG4gIG1pbi13aWR0aDogMzAwcHg7XG59XHJcbi5taW4tdy1cXFxcWzQ4cHhcXFxcXSB7XG4gIG1pbi13aWR0aDogNDhweDtcbn1cclxuLm1pbi13LVxcXFxbOTBcXFxcJVxcXFxdIHtcbiAgbWluLXdpZHRoOiA5MCU7XG59XHJcbi5tYXgtdy01NiB7XG4gIG1heC13aWR0aDogMTRyZW07XG59XHJcbi5tYXgtdy1cXFxcWzIwMHB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDIwMHB4O1xufVxyXG4ubWF4LXctXFxcXFsyNTBweFxcXFxdIHtcbiAgbWF4LXdpZHRoOiAyNTBweDtcbn1cclxuLm1heC13LVxcXFxbMjcwcHhcXFxcXSB7XG4gIG1heC13aWR0aDogMjcwcHg7XG59XHJcbi5tYXgtdy1cXFxcWzM1MHB4XFxcXF0ge1xuICBtYXgtd2lkdGg6IDM1MHB4O1xufVxyXG4ubWF4LXctXFxcXFs0NTBweFxcXFxdIHtcbiAgbWF4LXdpZHRoOiA0NTBweDtcbn1cclxuLm1heC13LVxcXFxbNDVweFxcXFxdIHtcbiAgbWF4LXdpZHRoOiA0NXB4O1xufVxyXG4ubWF4LXctXFxcXFs1MDBweFxcXFxdIHtcbiAgbWF4LXdpZHRoOiA1MDBweDtcbn1cclxuLm1heC13LXNtIHtcbiAgbWF4LXdpZHRoOiAyNHJlbTtcbn1cclxuLmZsZXgtMSB7XG4gIGZsZXg6IDEgMSAwJTtcbn1cclxuLmZsZXgtbm9uZSB7XG4gIGZsZXg6IG5vbmU7XG59XHJcbi5ib3JkZXItY29sbGFwc2Uge1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xufVxyXG4uLXRyYW5zbGF0ZS14LTFcXFxcLzIge1xuICAtLXR3LXRyYW5zbGF0ZS14OiAtNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbn1cclxuLi10cmFuc2xhdGUteS0xXFxcXC8yIHtcbiAgLS10dy10cmFuc2xhdGUteTogLTUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcbi4tdHJhbnNsYXRlLXktXFxcXFs1MFxcXFwlXFxcXF0ge1xuICAtLXR3LXRyYW5zbGF0ZS15OiAtNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksIHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXdYKHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKTtcbn1cclxuLnRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSwgdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tld1godmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpO1xufVxyXG4uY3Vyc29yLVxcXFxbdXJsXFxcXChcXFxcJ2RhdGFcXFxcOmltYWdlXFxcXC9wbmdcXFxcO2Jhc2U2NFxcXFwyYyBpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOFxcXFwvOWhBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQVNFbEVRVlI0bkdOZ3dBTWtKU1VicEtTa092Q3BJYVQ1UHhTVGJvZ1VRak1ZTXd4ZUlJWG1WRkl4QThVR0REeVFHZzBEbklEaTZKS1VsQ3hITXFDZVpBT2doalNBTUQ1RkFLZmVhVVJkVUZ4Q0FBQUFBRWxGVGtTdVFtQ0NcXFxcJ1xcXFwpXFxcXDJjIF9wb2ludGVyXFxcXF0ge1xuICBjdXJzb3I6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzJfX199KSwgcG9pbnRlcjtcbn1cclxuLmN1cnNvci1hbGwtc2Nyb2xsIHtcbiAgY3Vyc29yOiBhbGwtc2Nyb2xsO1xufVxyXG4uY3Vyc29yLWNyb3NzaGFpciB7XG4gIGN1cnNvcjogY3Jvc3NoYWlyO1xufVxyXG4uY3Vyc29yLWRlZmF1bHQge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XHJcbi5jdXJzb3ItcG9pbnRlciB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cclxuLmN1cnNvci1wcm9ncmVzcyB7XG4gIGN1cnNvcjogcHJvZ3Jlc3M7XG59XHJcbi5zZWxlY3Qtbm9uZSB7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XHJcbi5yZXNpemUtbm9uZSB7XG4gIHJlc2l6ZTogbm9uZTtcbn1cclxuLnJlc2l6ZSB7XG4gIHJlc2l6ZTogYm90aDtcbn1cclxuLmxpc3QtZGlzYyB7XG4gIGxpc3Qtc3R5bGUtdHlwZTogZGlzYztcbn1cclxuLmxpc3Qtbm9uZSB7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbn1cclxuLmdyaWQtY29scy0xIHtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMSwgbWlubWF4KDAsIDFmcikpO1xufVxyXG4uZ3JpZC1jb2xzLTEyIHtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMTIsIG1pbm1heCgwLCAxZnIpKTtcbn1cclxuLmdyaWQtY29scy0yIHtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgbWlubWF4KDAsIDFmcikpO1xufVxyXG4uZmxleC1yb3cge1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xufVxyXG4uZmxleC1jb2wge1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxyXG4uZmxleC13cmFwIHtcbiAgZmxleC13cmFwOiB3cmFwO1xufVxyXG4uaXRlbXMtc3RhcnQge1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbn1cclxuLml0ZW1zLWNlbnRlciB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XHJcbi5pdGVtcy1zdHJldGNoIHtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG59XHJcbi5qdXN0aWZ5LXN0YXJ0IHtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xufVxyXG4uanVzdGlmeS1lbmQge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xufVxyXG4uanVzdGlmeS1jZW50ZXIge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cclxuLmp1c3RpZnktYmV0d2VlbiB7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcbn1cclxuLmp1c3RpZnktYXJvdW5kIHtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG59XHJcbi5nYXAtMCB7XG4gIGdhcDogMHB4O1xufVxyXG4uZ2FwLTBcXFxcLjUge1xuICBnYXA6IDAuMTI1cmVtO1xufVxyXG4uZ2FwLTEge1xuICBnYXA6IDAuMjVyZW07XG59XHJcbi5nYXAtMiB7XG4gIGdhcDogMC41cmVtO1xufVxyXG4uZ2FwLTMge1xuICBnYXA6IDAuNzVyZW07XG59XHJcbi5nYXAtNCB7XG4gIGdhcDogMXJlbTtcbn1cclxuLmdhcC01IHtcbiAgZ2FwOiAxLjI1cmVtO1xufVxyXG4uZ2FwLTgge1xuICBnYXA6IDJyZW07XG59XHJcbi5nYXAtXFxcXFsxMHB4XFxcXF0ge1xuICBnYXA6IDEwcHg7XG59XHJcbi5nYXAtXFxcXFs1cHhcXFxcXSB7XG4gIGdhcDogNXB4O1xufVxyXG4uZ2FwLVxcXFxbOHB4XFxcXF0ge1xuICBnYXA6IDhweDtcbn1cclxuLmdhcC14LTIge1xuICBjb2x1bW4tZ2FwOiAwLjVyZW07XG59XHJcbi5nYXAteC00IHtcbiAgY29sdW1uLWdhcDogMXJlbTtcbn1cclxuLmdhcC14LTUge1xuICBjb2x1bW4tZ2FwOiAxLjI1cmVtO1xufVxyXG4uZ2FwLXgtXFxcXFsycHhcXFxcXSB7XG4gIGNvbHVtbi1nYXA6IDJweDtcbn1cclxuLmdhcC14LVxcXFxbNXB4XFxcXF0ge1xuICBjb2x1bW4tZ2FwOiA1cHg7XG59XHJcbi5nYXAteS0xIHtcbiAgcm93LWdhcDogMC4yNXJlbTtcbn1cclxuLmdhcC15LTIge1xuICByb3ctZ2FwOiAwLjVyZW07XG59XHJcbi5nYXAteS0zIHtcbiAgcm93LWdhcDogMC43NXJlbTtcbn1cclxuLmdhcC15LVxcXFxbMnB4XFxcXF0ge1xuICByb3ctZ2FwOiAycHg7XG59XHJcbi5wbGFjZS1zZWxmLWNlbnRlciB7XG4gIHBsYWNlLXNlbGY6IGNlbnRlcjtcbn1cclxuLnNlbGYtc3RhcnQge1xuICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xufVxyXG4uc2VsZi1jZW50ZXIge1xuICBhbGlnbi1zZWxmOiBjZW50ZXI7XG59XHJcbi5vdmVyZmxvdy1hdXRvIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XHJcbi5vdmVyZmxvdy1oaWRkZW4ge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxyXG4ub3ZlcmZsb3cteC1hdXRvIHtcbiAgb3ZlcmZsb3cteDogYXV0bztcbn1cclxuLm92ZXJmbG93LXktYXV0byB7XG4gIG92ZXJmbG93LXk6IGF1dG87XG59XHJcbi5vdmVyZmxvdy14LXNjcm9sbCB7XG4gIG92ZXJmbG93LXg6IHNjcm9sbDtcbn1cclxuLm92ZXJmbG93LXktc2Nyb2xsIHtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsO1xufVxyXG4udGV4dC1lbGxpcHNpcyB7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxyXG4ud2hpdGVzcGFjZS1ub3dyYXAge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxyXG4ud2hpdGVzcGFjZS1wcmUtd3JhcCB7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cclxuLmJyZWFrLXdvcmRzIHtcbiAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDtcbn1cclxuLmJyZWFrLWFsbCB7XG4gIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbn1cclxuLnJvdW5kZWQge1xuICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xufVxyXG4ucm91bmRlZC1cXFxcWzFweFxcXFxdIHtcbiAgYm9yZGVyLXJhZGl1czogMXB4O1xufVxyXG4ucm91bmRlZC1cXFxcWzJweFxcXFxdIHtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xufVxyXG4ucm91bmRlZC1ib3gge1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yb3VuZGVkLWJveCwgMXJlbSk7XG59XHJcbi5yb3VuZGVkLWZ1bGwge1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG59XHJcbi5yb3VuZGVkLWxnIHtcbiAgYm9yZGVyLXJhZGl1czogMC41cmVtO1xufVxyXG4ucm91bmRlZC1tZCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuMzc1cmVtO1xufVxyXG4ucm91bmRlZC1ub25lIHtcbiAgYm9yZGVyLXJhZGl1czogMHB4O1xufVxyXG4ucm91bmRlZC1zbSB7XG4gIGJvcmRlci1yYWRpdXM6IDAuMTI1cmVtO1xufVxyXG4ucm91bmRlZC14bCB7XG4gIGJvcmRlci1yYWRpdXM6IDAuNzVyZW07XG59XHJcbi5yb3VuZGVkLXItbm9uZSB7XG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwcHg7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwcHg7XG59XHJcbi5ib3JkZXIge1xuICBib3JkZXItd2lkdGg6IDFweDtcbn1cclxuLmJvcmRlci0yIHtcbiAgYm9yZGVyLXdpZHRoOiAycHg7XG59XHJcbi5ib3JkZXItXFxcXFswXFxcXC4xcHhcXFxcXSB7XG4gIGJvcmRlci13aWR0aDogMC4xcHg7XG59XHJcbi5ib3JkZXItXFxcXFswXFxcXC4ycHhcXFxcXSB7XG4gIGJvcmRlci13aWR0aDogMC4ycHg7XG59XHJcbi5ib3JkZXItXFxcXFswXFxcXC41cHhcXFxcXSB7XG4gIGJvcmRlci13aWR0aDogMC41cHg7XG59XHJcbi5ib3JkZXItXFxcXFsxXFxcXC4zcHhcXFxcXSB7XG4gIGJvcmRlci13aWR0aDogMS4zcHg7XG59XHJcbi5ib3JkZXItXFxcXFsxXFxcXC41cHhcXFxcXSB7XG4gIGJvcmRlci13aWR0aDogMS41cHg7XG59XHJcbi5ib3JkZXItXFxcXFsxcHhcXFxcXSB7XG4gIGJvcmRlci13aWR0aDogMXB4O1xufVxyXG4uYm9yZGVyLVxcXFxbMnB4XFxcXF0ge1xuICBib3JkZXItd2lkdGg6IDJweDtcbn1cclxuLmJvcmRlci15LVxcXFxbMXB4XFxcXF0ge1xuICBib3JkZXItdG9wLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDFweDtcbn1cclxuLmJvcmRlci1iLVxcXFxbMXB4XFxcXF0ge1xuICBib3JkZXItYm90dG9tLXdpZHRoOiAxcHg7XG59XHJcbi5ib3JkZXItYi1cXFxcWzNweFxcXFxdIHtcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogM3B4O1xufVxyXG4uYm9yZGVyLXItXFxcXFszcHhcXFxcXSB7XG4gIGJvcmRlci1yaWdodC13aWR0aDogM3B4O1xufVxyXG4uYm9yZGVyLXQtXFxcXFsxcHhcXFxcXSB7XG4gIGJvcmRlci10b3Atd2lkdGg6IDFweDtcbn1cclxuLmJvcmRlci1kYXNoZWQge1xuICBib3JkZXItc3R5bGU6IGRhc2hlZDtcbn1cclxuLmJvcmRlci1ub25lIHtcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCMwMDdiZmZcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDAgMTIzIDI1NSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcIzE4OGFlMlxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjQgMTM4IDIyNiAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcIzMzYmJmZlxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoNTEgMTg3IDI1NSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcIzg3ODc4N1xcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMTM1IDEzNSAxMzUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCM4ODhcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDEzNiAxMzYgMTM2IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjOGE4YThhXFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigxMzggMTM4IDEzOCAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtcXFxcI2NlY2VjZVxcXFxdIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjA2IDIwNiAyMDYgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLVxcXFxbXFxcXCNkNmQzZDNcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDIxNCAyMTEgMjExIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1cXFxcW1xcXFwjZWJlOGU4XFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyMzUgMjMyIDIzMiAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtncmF5XFxcXF0ge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigxMjggMTI4IDEyOCAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcbi5ib3JkZXItXFxcXFtyZWRcXFxcXSB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDI1NSAwIDAgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG4uYm9yZGVyLWJhc2UtMjAwIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMixva2xjaCh2YXIoLS1iMikvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcbi5ib3JkZXItYmFzZS0zMDAge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuLmJvcmRlci1iYXNlLWNvbnRlbnQge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuLmJvcmRlci1ncmF5LTMwMCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDIwOSAyMTMgMjE5IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1ncmF5LTQwMCB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDE1NiAxNjMgMTc1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci1pbmRpZ28tODAwIHtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoNTUgNDggMTYzIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuLmJvcmRlci10LXByaW1hcnkge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG4uYmctXFxcXFtcXFxcIzJlZDhiNlxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNDYgMjE2IDE4MiAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCM1NzYwODFcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDg3IDk2IDEyOSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCM4YThhOGFcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEzOCAxMzggMTM4IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcIzkzYTNkYlxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTQ3IDE2MyAyMTkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjOWY5ZjlmXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigxNTkgMTU5IDE1OSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNDQUU0RkFcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwMiAyMjggMjUwIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcI2I3YjNiM1xcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTgzIDE3OSAxNzkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjY2NjXFxcXF0ge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMDQgMjA0IDIwNCAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLVxcXFxbXFxcXCNlM2UyZTFcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyNyAyMjYgMjI1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctXFxcXFtcXFxcI2U2ZjJmMlxcXFxdIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjMwIDI0MiAyNDIgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1cXFxcW1xcXFwjZTZmMmYyXFxcXF1cXFxcLzcwIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzMCAyNDIgMjQyIC8gMC43KTtcbn1cclxuLmJnLVxcXFxbXFxcXCNmZmZcXFxcXSB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctYmFzZS0xMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIxLG9rbGNoKHZhcigtLWIxKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4uYmctYmFzZS0yMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIyLG9rbGNoKHZhcigtLWIyKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4uYmctYmFzZS0zMDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG4uYmctYmFzZS1jb250ZW50IHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvdmFyKC0tdHctYmctb3BhY2l0eSkpKTtcbn1cclxuLmJnLWJhc2UtY29udGVudFxcXFwvMzAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1iYyxva2xjaCh2YXIoLS1iYykvMC4zKSk7XG59XHJcbi5iZy1ibGFjayB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDAgMCAwIC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctYmxhY2tcXFxcLzMwIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDAgMCAwIC8gMC4zKTtcbn1cclxuLmJnLWJsdWUtNTAwIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNTkgMTMwIDI0NiAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLWdyYXktMjAwIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI5IDIzMSAyMzUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy1ncmF5LTMwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIwOSAyMTMgMjE5IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpO1xufVxyXG4uYmctZ3JheS00MDAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigxNTYgMTYzIDE3NSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLWdyYXktNTAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNDkgMjUwIDI1MSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuLmJnLWluaGVyaXQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xufVxyXG4uYmctdHJhbnNwYXJlbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cclxuLmJnLXdoaXRlIHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG59XHJcbi5iZy13aGl0ZVxcXFwvMjAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyAwLjIpO1xufVxyXG4uYmctb3BhY2l0eS0yMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMC4yO1xufVxyXG4uYmctb3BhY2l0eS0yNSB7XG4gIC0tdHctYmctb3BhY2l0eTogMC4yNTtcbn1cclxuLmJnLW9wYWNpdHktMzAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuMztcbn1cclxuLmJnLW9wYWNpdHktNTAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuNTtcbn1cclxuLmJnLW9wYWNpdHktODAge1xuICAtLXR3LWJnLW9wYWNpdHk6IDAuODtcbn1cclxuLmZpbGwtY3VycmVudCB7XG4gIGZpbGw6IGN1cnJlbnRDb2xvcjtcbn1cclxuLm9iamVjdC1jb250YWluIHtcbiAgb2JqZWN0LWZpdDogY29udGFpbjtcbn1cclxuLnAtMCB7XG4gIHBhZGRpbmc6IDBweDtcbn1cclxuLnAtMSB7XG4gIHBhZGRpbmc6IDAuMjVyZW07XG59XHJcbi5wLTE0IHtcbiAgcGFkZGluZzogMy41cmVtO1xufVxyXG4ucC0yIHtcbiAgcGFkZGluZzogMC41cmVtO1xufVxyXG4ucC0zIHtcbiAgcGFkZGluZzogMC43NXJlbTtcbn1cclxuLnAtNCB7XG4gIHBhZGRpbmc6IDFyZW07XG59XHJcbi5wLVxcXFxbMTBweFxcXFxdIHtcbiAgcGFkZGluZzogMTBweDtcbn1cclxuLnAtXFxcXFsxNXB4XFxcXF0ge1xuICBwYWRkaW5nOiAxNXB4O1xufVxyXG4ucC1cXFxcWzE2cHhcXFxcXSB7XG4gIHBhZGRpbmc6IDE2cHg7XG59XHJcbi5wLVxcXFxbMXB4XFxcXF0ge1xuICBwYWRkaW5nOiAxcHg7XG59XHJcbi5wLVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZzogMjBweDtcbn1cclxuLnAtXFxcXFsycHhcXFxcXSB7XG4gIHBhZGRpbmc6IDJweDtcbn1cclxuLnAtXFxcXFszMHB4XFxcXF0ge1xuICBwYWRkaW5nOiAzMHB4O1xufVxyXG4ucC1cXFxcWzNweFxcXFxdIHtcbiAgcGFkZGluZzogM3B4O1xufVxyXG4ucC1cXFxcWzVweFxcXFxdIHtcbiAgcGFkZGluZzogNXB4O1xufVxyXG4ucC1cXFxcWzhweFxcXFxdIHtcbiAgcGFkZGluZzogOHB4O1xufVxyXG4ucHgtMCB7XG4gIHBhZGRpbmctbGVmdDogMHB4O1xuICBwYWRkaW5nLXJpZ2h0OiAwcHg7XG59XHJcbi5weC0xIHtcbiAgcGFkZGluZy1sZWZ0OiAwLjI1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjI1cmVtO1xufVxyXG4ucHgtMiB7XG4gIHBhZGRpbmctbGVmdDogMC41cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVyZW07XG59XHJcbi5weC0zIHtcbiAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtO1xuICBwYWRkaW5nLXJpZ2h0OiAwLjc1cmVtO1xufVxyXG4ucHgtNCB7XG4gIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgcGFkZGluZy1yaWdodDogMXJlbTtcbn1cclxuLnB4LTYge1xuICBwYWRkaW5nLWxlZnQ6IDEuNXJlbTtcbiAgcGFkZGluZy1yaWdodDogMS41cmVtO1xufVxyXG4ucHgtNyB7XG4gIHBhZGRpbmctbGVmdDogMS43NXJlbTtcbiAgcGFkZGluZy1yaWdodDogMS43NXJlbTtcbn1cclxuLnB4LTgge1xuICBwYWRkaW5nLWxlZnQ6IDJyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDJyZW07XG59XHJcbi5weC1cXFxcWzFcXFxcLjI1cmVtXFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDEuMjVyZW07XG4gIHBhZGRpbmctcmlnaHQ6IDEuMjVyZW07XG59XHJcbi5weC1cXFxcWzEwcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbiAgcGFkZGluZy1yaWdodDogMTBweDtcbn1cclxuLnB4LVxcXFxbMTJweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xuICBwYWRkaW5nLXJpZ2h0OiAxMnB4O1xufVxyXG4ucHgtXFxcXFsxM3B4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDEzcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDEzcHg7XG59XHJcbi5weC1cXFxcWzE1cHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMTVweDtcbiAgcGFkZGluZy1yaWdodDogMTVweDtcbn1cclxuLnB4LVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICBwYWRkaW5nLXJpZ2h0OiAyMHB4O1xufVxyXG4ucHgtXFxcXFsyNXB4XFxcXF0ge1xuICBwYWRkaW5nLWxlZnQ6IDI1cHg7XG4gIHBhZGRpbmctcmlnaHQ6IDI1cHg7XG59XHJcbi5weC1cXFxcWzNweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAzcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDNweDtcbn1cclxuLnB4LVxcXFxbNDBweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiA0MHB4O1xuICBwYWRkaW5nLXJpZ2h0OiA0MHB4O1xufVxyXG4ucHgtXFxcXFs0cHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogNHB4O1xuICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG59XHJcbi5weS0xIHtcbiAgcGFkZGluZy10b3A6IDAuMjVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAwLjI1cmVtO1xufVxyXG4ucHktMVxcXFwuNSB7XG4gIHBhZGRpbmctdG9wOiAwLjM3NXJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuMzc1cmVtO1xufVxyXG4ucHktMTAge1xuICBwYWRkaW5nLXRvcDogMi41cmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMi41cmVtO1xufVxyXG4ucHktMiB7XG4gIHBhZGRpbmctdG9wOiAwLjVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAwLjVyZW07XG59XHJcbi5weS0zIHtcbiAgcGFkZGluZy10b3A6IDAuNzVyZW07XG4gIHBhZGRpbmctYm90dG9tOiAwLjc1cmVtO1xufVxyXG4ucHktNCB7XG4gIHBhZGRpbmctdG9wOiAxcmVtO1xuICBwYWRkaW5nLWJvdHRvbTogMXJlbTtcbn1cclxuLnB5LVxcXFxbXFxcXC43NXJlbVxcXFxdIHtcbiAgcGFkZGluZy10b3A6IC43NXJlbTtcbiAgcGFkZGluZy1ib3R0b206IC43NXJlbTtcbn1cclxuLnB5LVxcXFxbMVxcXFwuNXB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMS41cHg7XG4gIHBhZGRpbmctYm90dG9tOiAxLjVweDtcbn1cclxuLnB5LVxcXFxbMTBweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDEwcHg7XG4gIHBhZGRpbmctYm90dG9tOiAxMHB4O1xufVxyXG4ucHktXFxcXFsxcHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAxcHg7XG4gIHBhZGRpbmctYm90dG9tOiAxcHg7XG59XHJcbi5weS1cXFxcWzIwcHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAyMHB4O1xuICBwYWRkaW5nLWJvdHRvbTogMjBweDtcbn1cclxuLnB5LVxcXFxbM3B4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogM3B4O1xuICBwYWRkaW5nLWJvdHRvbTogM3B4O1xufVxyXG4ucHktXFxcXFs1cHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiA1cHg7XG4gIHBhZGRpbmctYm90dG9tOiA1cHg7XG59XHJcbi5weS1cXFxcWzhweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDhweDtcbiAgcGFkZGluZy1ib3R0b206IDhweDtcbn1cclxuLnBiLTAge1xuICBwYWRkaW5nLWJvdHRvbTogMHB4O1xufVxyXG4ucGItMSB7XG4gIHBhZGRpbmctYm90dG9tOiAwLjI1cmVtO1xufVxyXG4ucGItMiB7XG4gIHBhZGRpbmctYm90dG9tOiAwLjVyZW07XG59XHJcbi5wYi0zIHtcbiAgcGFkZGluZy1ib3R0b206IDAuNzVyZW07XG59XHJcbi5wYi02IHtcbiAgcGFkZGluZy1ib3R0b206IDEuNXJlbTtcbn1cclxuLnBiLVxcXFxbMTVweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDE1cHg7XG59XHJcbi5wYi1cXFxcWzFweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDFweDtcbn1cclxuLnBiLVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XG59XHJcbi5wYi1cXFxcWzVweFxcXFxdIHtcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbn1cclxuLnBsLTMge1xuICBwYWRkaW5nLWxlZnQ6IDAuNzVyZW07XG59XHJcbi5wbC02IHtcbiAgcGFkZGluZy1sZWZ0OiAxLjVyZW07XG59XHJcbi5wbC1cXFxcWzEwcHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbn1cclxuLnBsLVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xufVxyXG4ucGwtXFxcXFs1cHhcXFxcXSB7XG4gIHBhZGRpbmctbGVmdDogNXB4O1xufVxyXG4ucHItMSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuMjVyZW07XG59XHJcbi5wci0yIHtcbiAgcGFkZGluZy1yaWdodDogMC41cmVtO1xufVxyXG4ucHItXFxcXFszcHhcXFxcXSB7XG4gIHBhZGRpbmctcmlnaHQ6IDNweDtcbn1cclxuLnByLVxcXFxbNXB4XFxcXF0ge1xuICBwYWRkaW5nLXJpZ2h0OiA1cHg7XG59XHJcbi5wdC0wIHtcbiAgcGFkZGluZy10b3A6IDBweDtcbn1cclxuLnB0LTEge1xuICBwYWRkaW5nLXRvcDogMC4yNXJlbTtcbn1cclxuLnB0LTIge1xuICBwYWRkaW5nLXRvcDogMC41cmVtO1xufVxyXG4ucHQtMyB7XG4gIHBhZGRpbmctdG9wOiAwLjc1cmVtO1xufVxyXG4ucHQtNCB7XG4gIHBhZGRpbmctdG9wOiAxcmVtO1xufVxyXG4ucHQtNiB7XG4gIHBhZGRpbmctdG9wOiAxLjVyZW07XG59XHJcbi5wdC1cXFxcWzEwcHhcXFxcXSB7XG4gIHBhZGRpbmctdG9wOiAxMHB4O1xufVxyXG4ucHQtXFxcXFsxNXB4XFxcXF0ge1xuICBwYWRkaW5nLXRvcDogMTVweDtcbn1cclxuLnB0LVxcXFxbMjBweFxcXFxdIHtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG59XHJcbi50ZXh0LWxlZnQge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxyXG4udGV4dC1jZW50ZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XHJcbi5hbGlnbi1iYXNlbGluZSB7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cclxuLnRleHQtMnhsIHtcbiAgZm9udC1zaXplOiAxLjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAycmVtO1xufVxyXG4udGV4dC0zeGwge1xuICBmb250LXNpemU6IDEuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMi4yNXJlbTtcbn1cclxuLnRleHQtXFxcXFsxXFxcXC4ycmVtXFxcXF0ge1xuICBmb250LXNpemU6IDEuMnJlbTtcbn1cclxuLnRleHQtXFxcXFsxXFxcXC41cmVtXFxcXF0ge1xuICBmb250LXNpemU6IDEuNXJlbTtcbn1cclxuLnRleHQtXFxcXFsxMHB4XFxcXF0ge1xuICBmb250LXNpemU6IDEwcHg7XG59XHJcbi50ZXh0LVxcXFxbMTFweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxMXB4O1xufVxyXG4udGV4dC1cXFxcWzEycHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbn1cclxuLnRleHQtXFxcXFsxM3B4XFxcXF0ge1xuICBmb250LXNpemU6IDEzcHg7XG59XHJcbi50ZXh0LVxcXFxbMTRweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxyXG4udGV4dC1cXFxcWzE1cHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMTVweDtcbn1cclxuLnRleHQtXFxcXFsxNnB4XFxcXF0ge1xuICBmb250LXNpemU6IDE2cHg7XG59XHJcbi50ZXh0LVxcXFxbMThweFxcXFxdIHtcbiAgZm9udC1zaXplOiAxOHB4O1xufVxyXG4udGV4dC1cXFxcWzIwcHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogMjBweDtcbn1cclxuLnRleHQtXFxcXFsyNXB4XFxcXF0ge1xuICBmb250LXNpemU6IDI1cHg7XG59XHJcbi50ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgZm9udC1zaXplOiAzMHB4O1xufVxyXG4udGV4dC1cXFxcWzQwcHhcXFxcXSB7XG4gIGZvbnQtc2l6ZTogNDBweDtcbn1cclxuLnRleHQtXFxcXFs2MHB4XFxcXF0ge1xuICBmb250LXNpemU6IDYwcHg7XG59XHJcbi50ZXh0LVxcXFxbOHB4XFxcXF0ge1xuICBmb250LXNpemU6IDhweDtcbn1cclxuLnRleHQtYmFzZSB7XG4gIGZvbnQtc2l6ZTogMXJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuNXJlbTtcbn1cclxuLnRleHQtbGcge1xuICBmb250LXNpemU6IDEuMTI1cmVtO1xuICBsaW5lLWhlaWdodDogMS43NXJlbTtcbn1cclxuLnRleHQtc20ge1xuICBmb250LXNpemU6IDAuODc1cmVtO1xuICBsaW5lLWhlaWdodDogMS4yNXJlbTtcbn1cclxuLnRleHQteGwge1xuICBmb250LXNpemU6IDEuMjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjc1cmVtO1xufVxyXG4udGV4dC14cyB7XG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgbGluZS1oZWlnaHQ6IDFyZW07XG59XHJcbi5mb250LVxcXFxbNDAwXFxcXF0ge1xuICBmb250LXdlaWdodDogNDAwO1xufVxyXG4uZm9udC1cXFxcWzUwMFxcXFxdIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cclxuLmZvbnQtXFxcXFs2NTBcXFxcXSB7XG4gIGZvbnQtd2VpZ2h0OiA2NTA7XG59XHJcbi5mb250LVxcXFxbNzAwXFxcXF0ge1xuICBmb250LXdlaWdodDogNzAwO1xufVxyXG4uZm9udC1ib2xkIHtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbn1cclxuLmZvbnQtZXh0cmFsaWdodCB7XG4gIGZvbnQtd2VpZ2h0OiAyMDA7XG59XHJcbi5mb250LWxpZ2h0IHtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbn1cclxuLmZvbnQtbWVkaXVtIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cclxuLmZvbnQtbm9ybWFsIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbn1cclxuLmZvbnQtc2VtaWJvbGQge1xuICBmb250LXdlaWdodDogNjAwO1xufVxyXG4udXBwZXJjYXNlIHtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cclxuLmxvd2VyY2FzZSB7XG4gIHRleHQtdHJhbnNmb3JtOiBsb3dlcmNhc2U7XG59XHJcbi5jYXBpdGFsaXplIHtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG59XHJcbi5pdGFsaWMge1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XHJcbi50ZXh0LVxcXFxbXFxcXCMwMDI4NjJcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDAgNDAgOTggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcIzMzYmJmZlxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoNTEgMTg3IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjNDI0MjQyXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYig2NiA2NiA2NiAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjODc4Nzg3XFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxMzUgMTM1IDEzNSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjYTY0YjRlXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigxNjYgNzUgNzggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtcXFxcI2FjNDg0OFxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMTcyIDcyIDcyIC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbXFxcXCNmNTQwNWVcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDI0NSA2NCA5NCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW1xcXFwjZmFiMDA1XFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyNTAgMTc2IDUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtibHVlXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigwIDAgMjU1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbZ3JheVxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMTI4IDEyOCAxMjggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtXFxcXFtncmVlblxcXFxdIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMCAxMjggMCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1cXFxcW2dyZXlcXFxcXSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDEyOCAxMjggMTI4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LVxcXFxbcmVkXFxcXF0ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyNTUgMCAwIC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWFjY2VudCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYSxva2xjaCh2YXIoLS1hKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi50ZXh0LWJhc2UtMTAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1iMSxva2xjaCh2YXIoLS1iMSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG4udGV4dC1iYXNlLWNvbnRlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi50ZXh0LWJsYWNrIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMCAwIDAgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtYmx1ZS02MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigzNyA5OSAyMzUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtYmx1ZS04MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigzMCA2NCAxNzUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtZ3JheS0zMDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyMDkgMjEzIDIxOSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1ncmF5LTQwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDE1NiAxNjMgMTc1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LWdyYXktNTAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMTA3IDExNCAxMjggLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtZ3JheS03MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYig1NSA2NSA4MSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1ncmVlbi02MDAge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHJnYigyMiAxNjMgNzQgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuLnRleHQtbmV1dHJhbCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stbixva2xjaCh2YXIoLS1uKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcbi50ZXh0LXByaW1hcnktY29udGVudCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stcGMsb2tsY2godmFyKC0tcGMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuLnRleHQtcmVkLTUwMCB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDIzOSA2OCA2OCAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG4udGV4dC1yZWQtNjAwIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjIwIDM4IDM4IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi50ZXh0LXRyYW5zcGFyZW50IHtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xufVxyXG4udGV4dC13aGl0ZSB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctdGV4dC1vcGFjaXR5KSk7XG59XHJcbi51bmRlcmxpbmUge1xuICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lO1xufVxyXG4ubm8tdW5kZXJsaW5lIHtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7XG59XHJcbi51bmRlcmxpbmUtb2Zmc2V0LTEge1xuICB0ZXh0LXVuZGVybGluZS1vZmZzZXQ6IDFweDtcbn1cclxuLnVuZGVybGluZS1vZmZzZXQtMiB7XG4gIHRleHQtdW5kZXJsaW5lLW9mZnNldDogMnB4O1xufVxyXG4udW5kZXJsaW5lLW9mZnNldC04IHtcbiAgdGV4dC11bmRlcmxpbmUtb2Zmc2V0OiA4cHg7XG59XHJcbi5vcGFjaXR5LTUwIHtcbiAgb3BhY2l0eTogMC41O1xufVxyXG4uc2hhZG93IHtcbiAgLS10dy1zaGFkb3c6IDAgMXB4IDNweCAwIHJnYigwIDAgMCAvIDAuMSksIDAgMXB4IDJweCAtMXB4IHJnYigwIDAgMCAvIDAuMSk7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMXB4IDNweCAwIHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgMXB4IDJweCAtMXB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXNoYWRvdyk7XG59XHJcbi5zaGFkb3ctbGcge1xuICAtLXR3LXNoYWRvdzogMCAxMHB4IDE1cHggLTNweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDRweCA2cHggLTRweCByZ2IoMCAwIDAgLyAwLjEpO1xuICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDEwcHggMTVweCAtM3B4IHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgNHB4IDZweCAtNHB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXNoYWRvdyk7XG59XHJcbi5zaGFkb3ctbWQge1xuICAtLXR3LXNoYWRvdzogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC4xKTtcbiAgLS10dy1zaGFkb3ctY29sb3JlZDogMCA0cHggNnB4IC0xcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCAycHggNHB4IC0ycHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuLm91dGxpbmUtbm9uZSB7XG4gIG91dGxpbmU6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cclxuLm91dGxpbmUge1xuICBvdXRsaW5lLXN0eWxlOiBzb2xpZDtcbn1cclxuLm91dGxpbmUtMSB7XG4gIG91dGxpbmUtd2lkdGg6IDFweDtcbn1cclxuLm91dGxpbmUtXFxcXFsxXFxcXC41cHhcXFxcXSB7XG4gIG91dGxpbmUtd2lkdGg6IDEuNXB4O1xufVxyXG4ub3V0bGluZS1cXFxcW1xcXFwjMDA3YmZmXFxcXF0ge1xuICBvdXRsaW5lLWNvbG9yOiAjMDA3YmZmO1xufVxyXG4ub3V0bGluZS1zbGF0ZS0zMDBcXFxcLzUwIHtcbiAgb3V0bGluZS1jb2xvcjogcmdiKDIwMyAyMTMgMjI1IC8gMC41KTtcbn1cclxuLnJpbmctXFxcXFsxcHhcXFxcXSB7XG4gIC0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpO1xuICAtLXR3LXJpbmctc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCBjYWxjKDFweCArIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSkgdmFyKC0tdHctcmluZy1jb2xvcik7XG4gIGJveC1zaGFkb3c6IHZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksIHZhcigtLXR3LXJpbmctc2hhZG93KSwgdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApO1xufVxyXG4ucmluZy1cXFxcWzJweFxcXFxdIHtcbiAgLS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7XG4gIC0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMnB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSwgdmFyKC0tdHctcmluZy1zaGFkb3cpLCB2YXIoLS10dy1zaGFkb3csIDAgMCAjMDAwMCk7XG59XHJcbi5yaW5nLVxcXFxbXFxcXCMwMDI4NjJcXFxcXSB7XG4gIC0tdHctcmluZy1vcGFjaXR5OiAxO1xuICAtLXR3LXJpbmctY29sb3I6IHJnYigwIDQwIDk4IC8gdmFyKC0tdHctcmluZy1vcGFjaXR5KSk7XG59XHJcbi5yaW5nLWdyYXktNDAwIHtcbiAgLS10dy1yaW5nLW9wYWNpdHk6IDE7XG4gIC0tdHctcmluZy1jb2xvcjogcmdiKDE1NiAxNjMgMTc1IC8gdmFyKC0tdHctcmluZy1vcGFjaXR5KSk7XG59XHJcbi5yaW5nLW9mZnNldC0yIHtcbiAgLS10dy1yaW5nLW9mZnNldC13aWR0aDogMnB4O1xufVxyXG4uYmx1ciB7XG4gIC0tdHctYmx1cjogYmx1cig4cHgpO1xuICBmaWx0ZXI6IHZhcigtLXR3LWJsdXIpIHZhcigtLXR3LWJyaWdodG5lc3MpIHZhcigtLXR3LWNvbnRyYXN0KSB2YXIoLS10dy1ncmF5c2NhbGUpIHZhcigtLXR3LWh1ZS1yb3RhdGUpIHZhcigtLXR3LWludmVydCkgdmFyKC0tdHctc2F0dXJhdGUpIHZhcigtLXR3LXNlcGlhKSB2YXIoLS10dy1kcm9wLXNoYWRvdyk7XG59XHJcbi5maWx0ZXIge1xuICBmaWx0ZXI6IHZhcigtLXR3LWJsdXIpIHZhcigtLXR3LWJyaWdodG5lc3MpIHZhcigtLXR3LWNvbnRyYXN0KSB2YXIoLS10dy1ncmF5c2NhbGUpIHZhcigtLXR3LWh1ZS1yb3RhdGUpIHZhcigtLXR3LWludmVydCkgdmFyKC0tdHctc2F0dXJhdGUpIHZhcigtLXR3LXNlcGlhKSB2YXIoLS10dy1kcm9wLXNoYWRvdyk7XG59XHJcbi50cmFuc2l0aW9uIHtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogY29sb3IsIGJhY2tncm91bmQtY29sb3IsIGJvcmRlci1jb2xvciwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBmaWxsLCBzdHJva2UsIG9wYWNpdHksIGJveC1zaGFkb3csIHRyYW5zZm9ybSwgZmlsdGVyLCBiYWNrZHJvcC1maWx0ZXI7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZmlsbCwgc3Ryb2tlLCBvcGFjaXR5LCBib3gtc2hhZG93LCB0cmFuc2Zvcm0sIGZpbHRlciwgYmFja2Ryb3AtZmlsdGVyLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDE1MG1zO1xufVxyXG4udHJhbnNpdGlvbi1hbGwge1xuICB0cmFuc2l0aW9uLXByb3BlcnR5OiBhbGw7XG4gIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAxNTBtcztcbn1cclxuXHJcbmJvZHkge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG59XHJcblxyXG4vKiBDdXN0b20gQ1NTIHRvIGhpZGUgc2Nyb2xsYmFyICovXHJcbi5oaWRlLXNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi5oaWRlLXNjcm9sbGJhciB7XHJcbiAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lO1xyXG4gIC8qIElFIGFuZCBFZGdlICovXHJcbiAgc2Nyb2xsYmFyLXdpZHRoOiBub25lO1xyXG4gIC8qIEZpcmVmb3ggKi9cclxufVxyXG5cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY2cHgpIHtcclxuICAuYkJvZkdyIHtcclxuICAgIHdpZHRoOiAxNHB4ICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG59XHJcblxyXG4vKiBiZWxvdyBjc3MgY2xhc3MgcmVwbGFjZSBib290c3RyYXAgYmFja2dyb3VuZCBjb2xvciB3aXRoIGRhaXN5ICovXHJcbi5vcC1iZy1wcmltYXJ5IHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1wLG9rbGNoKHZhcigtLXApL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcblxyXG4ub3AtYmctc2Vjb25kYXJ5IHtcbiAgLS10dy1iZy1vcGFjaXR5OiAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcblxyXG4ub3AtYmctaW5mbyB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2staW4sb2tsY2godmFyKC0taW4pL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcblxyXG4ub3AtYmctc3VjY2VzcyB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcblxyXG4ub3AtYmctd2FybmluZyB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmFsbGJhY2std2Esb2tsY2godmFyKC0td2EpL3ZhcigtLXR3LWJnLW9wYWNpdHkpKSk7XG59XHJcblxyXG4vKiBiZWxvdyBjc3MgY2xhc3MgcmVwbGFjZSBib290c3RyYXAgdGV4dCBjb2xvciB3aXRoIGRhaXN5ICovXHJcbi5vcC10ZXh0LXByaW1hcnkge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5cclxuLm9wLXRleHQtc2Vjb25kYXJ5IHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiB2YXIoLS1mYWxsYmFjay1zLG9rbGNoKHZhcigtLXMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuXHJcbi5vcC10ZXh0LWluZm8ge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWluLG9rbGNoKHZhcigtLWluKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcblxyXG4ub3AtdGV4dC1hY2NlbnQge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLWEsb2tsY2godmFyKC0tYSkvdmFyKC0tdHctdGV4dC1vcGFjaXR5KSkpO1xufVxyXG5cclxuLm9wLXRleHQtc3VjY2VzcyB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stc3Usb2tsY2godmFyKC0tc3UpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuXHJcbi5vcC10ZXh0LXdhcm5pbmcge1xuICAtLXR3LXRleHQtb3BhY2l0eTogMTtcbiAgY29sb3I6IHZhcigtLWZhbGxiYWNrLXdhLG9rbGNoKHZhcigtLXdhKS92YXIoLS10dy10ZXh0LW9wYWNpdHkpKSk7XG59XHJcblxyXG4ub3AtYm9yZGVyLXByaW1hcnkge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLXAsb2tsY2godmFyKC0tcCkvdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKSk7XG59XHJcblxyXG4vKiBDU1MgZm9yIHNjcm9sbGJhciBjdXN0b21pemF0aW9uICovXHJcbioge1xyXG4gIHNjcm9sbGJhci13aWR0aDogdGhpbjtcclxuICAvKiBGb3IgRmlyZWZveCAqL1xyXG4gIHNjcm9sbGJhci1jb2xvcjogZ3JheTtcclxuICAvKiBGb3IgRmlyZWZveCAqL1xyXG59XHJcblxyXG4vKiBGb3Igd2Via2l0LWJhc2VkIGJyb3dzZXJzIGxpa2UgQ2hyb21lLCBTYWZhcmkgKi9cclxuKjo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIHdpZHRoOiA1cHg7XHJcbn1cclxuXHJcbio6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcclxufVxyXG5cclxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XHJcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcclxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG5cbiAgLm1kXFxcXDpvcC1idG4tc20ge1xuICAgIGhlaWdodDogMnJlbTtcbiAgICBtaW4taGVpZ2h0OiAycmVtO1xuICAgIHBhZGRpbmctbGVmdDogMC43NXJlbTtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjc1cmVtO1xuICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gIH1cblxuICAubWRcXFxcOm9wLWJ0bi1tZCB7XG4gICAgaGVpZ2h0OiAzcmVtO1xuICAgIG1pbi1oZWlnaHQ6IDNyZW07XG4gICAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICAgIHBhZGRpbmctcmlnaHQ6IDFyZW07XG4gICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgfVxuXG4gIC5vcC1idG4tc3F1YXJlOndoZXJlKC5tZFxcXFw6b3AtYnRuLXNtKSB7XG4gICAgaGVpZ2h0OiAycmVtO1xuICAgIHdpZHRoOiAycmVtO1xuICAgIHBhZGRpbmc6IDBweDtcbiAgfVxuXG4gIC5vcC1idG4tc3F1YXJlOndoZXJlKC5tZFxcXFw6b3AtYnRuLW1kKSB7XG4gICAgaGVpZ2h0OiAzcmVtO1xuICAgIHdpZHRoOiAzcmVtO1xuICAgIHBhZGRpbmc6IDBweDtcbiAgfVxuXG4gIC5vcC1idG4tY2lyY2xlOndoZXJlKC5tZFxcXFw6b3AtYnRuLXNtKSB7XG4gICAgaGVpZ2h0OiAycmVtO1xuICAgIHdpZHRoOiAycmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICBwYWRkaW5nOiAwcHg7XG4gIH1cblxuICAub3AtYnRuLWNpcmNsZTp3aGVyZSgubWRcXFxcOm9wLWJ0bi1tZCkge1xuICAgIGhlaWdodDogM3JlbTtcbiAgICB3aWR0aDogM3JlbTtcbiAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgcGFkZGluZzogMHB4O1xuICB9XG59XHJcblxyXG4uYWZ0ZXJcXFxcOmFic29sdXRlOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOnN0YXJ0LVxcXFxbMnB4XFxcXF06OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIGluc2V0LWlubGluZS1zdGFydDogMnB4O1xufVxyXG5cclxuLmFmdGVyXFxcXDp0b3AtXFxcXFsycHhcXFxcXTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgdG9wOiAycHg7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOmgtNDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgaGVpZ2h0OiAxcmVtO1xufVxyXG5cclxuLmFmdGVyXFxcXDp3LTQ6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIHdpZHRoOiAxcmVtO1xufVxyXG5cclxuLmFmdGVyXFxcXDpyb3VuZGVkLWZ1bGw6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbn1cclxuXHJcbi5hZnRlclxcXFw6Ym9yZGVyOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICBib3JkZXItd2lkdGg6IDFweDtcbn1cclxuXHJcbi5hZnRlclxcXFw6Ym9yZGVyLWdyYXktMzAwOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHJnYigyMDkgMjEzIDIxOSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG59XHJcblxyXG4uYWZ0ZXJcXFxcOmJnLXdoaXRlOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuXHJcbi5hZnRlclxcXFw6dHJhbnNpdGlvbi1hbGw6OmFmdGVyIHtcbiAgY29udGVudDogdmFyKC0tdHctY29udGVudCk7XG4gIHRyYW5zaXRpb24tcHJvcGVydHk6IGFsbDtcbiAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDE1MG1zO1xufVxyXG5cclxuLmFmdGVyXFxcXDpjb250ZW50LVxcXFxbXFxcXCdcXFxcJ1xcXFxdOjphZnRlciB7XG4gIC0tdHctY29udGVudDogJyc7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xufVxyXG5cclxuLmxhc3RcXFxcOm1iLTBcXFxcLjU6bGFzdC1jaGlsZCB7XG4gIG1hcmdpbi1ib3R0b206IDAuMTI1cmVtO1xufVxyXG5cclxuLmNoZWNrZWRcXFxcOmJnLXdoaXRlOmNoZWNrZWQge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuXHJcbi5jaGVja2VkXFxcXDpcXFxcWy0tdGdsYmdcXFxcOlxcXFwjMzM2OGZmXFxcXF06Y2hlY2tlZCB7XG4gIC0tdGdsYmc6ICMzMzY4ZmY7XG59XHJcblxyXG4uaG92ZXJcXFxcOmN1cnNvci1zdy1yZXNpemU6aG92ZXIge1xuICBjdXJzb3I6IHN3LXJlc2l6ZTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6Ym9yZGVyLVxcXFxbXFxcXCNkMmUzZmNcXFxcXTpob3ZlciB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogcmdiKDIxMCAyMjcgMjUyIC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6Ym9yZGVyLWJhc2UtY29udGVudDpob3ZlciB7XG4gIC0tdHctYm9yZGVyLW9wYWNpdHk6IDE7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSkpO1xufVxyXG5cclxuLmhvdmVyXFxcXDpiZy1cXFxcW1xcXFwjZWNmM2ZlYjdcXFxcXTpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlY2YzZmViNztcbn1cclxuXHJcbi5ob3ZlclxcXFw6YmctYmFzZS0zMDA6aG92ZXIge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLmhvdmVyXFxcXDpiZy10cmFuc3BhcmVudDpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxyXG5cclxuLmhvdmVyXFxcXDp0ZXh0LWJhc2UtY29udGVudDpob3ZlciB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogdmFyKC0tZmFsbGJhY2stYmMsb2tsY2godmFyKC0tYmMpL3ZhcigtLXR3LXRleHQtb3BhY2l0eSkpKTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6dGV4dC1ibHVlLTgwMDpob3ZlciB7XG4gIC0tdHctdGV4dC1vcGFjaXR5OiAxO1xuICBjb2xvcjogcmdiKDMwIDY0IDE3NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpO1xufVxyXG5cclxuLmhvdmVyXFxcXDp0ZXh0LXdoaXRlOmhvdmVyIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6dW5kZXJsaW5lOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTtcbn1cclxuXHJcbi5ob3ZlclxcXFw6bm8tdW5kZXJsaW5lOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IG5vbmU7XG59XHJcblxyXG4uaG92ZXJcXFxcOnNoYWRvdy1sZzpob3ZlciB7XG4gIC0tdHctc2hhZG93OiAwIDEwcHggMTVweCAtM3B4IHJnYigwIDAgMCAvIDAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIDAuMSk7XG4gIC0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMTBweCAxNXB4IC0zcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCA0cHggNnB4IC00cHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1yaW5nLXNoYWRvdywgMCAwICMwMDAwKSwgdmFyKC0tdHctc2hhZG93KTtcbn1cclxuXHJcbi5mb2N1c1xcXFw6YmctYmFzZS0zMDA6Zm9jdXMge1xuICAtLXR3LWJnLW9wYWNpdHk6IDE7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWZhbGxiYWNrLWIzLG9rbGNoKHZhcigtLWIzKS92YXIoLS10dy1iZy1vcGFjaXR5KSkpO1xufVxyXG5cclxuLmZvY3VzXFxcXDpvdXRsaW5lLW5vbmU6Zm9jdXMge1xuICBvdXRsaW5lOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIG91dGxpbmUtb2Zmc2V0OiAycHg7XG59XHJcblxyXG4uZGlzYWJsZWRcXFxcOnRleHQtXFxcXFtcXFxcIzVjNWM1Y1xcXFxdOmRpc2FibGVkIHtcbiAgLS10dy10ZXh0LW9wYWNpdHk6IDE7XG4gIGNvbG9yOiByZ2IoOTIgOTIgOTIgLyB2YXIoLS10dy10ZXh0LW9wYWNpdHkpKTtcbn1cclxuXHJcbi5ncm91cDpob3ZlciAuZ3JvdXAtaG92ZXJcXFxcOmJvcmRlci1iYXNlLWNvbnRlbnQge1xuICAtLXR3LWJvcmRlci1vcGFjaXR5OiAxO1xuICBib3JkZXItY29sb3I6IHZhcigtLWZhbGxiYWNrLWJjLG9rbGNoKHZhcigtLWJjKS92YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpKTtcbn1cclxuXHJcbi5wZWVyOmNoZWNrZWQgfiAucGVlci1jaGVja2VkXFxcXDpiZy1ibHVlLTYwMCB7XG4gIC0tdHctYmctb3BhY2l0eTogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDM3IDk5IDIzNSAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKTtcbn1cclxuXHJcbi5wZWVyOmNoZWNrZWQgfiAucGVlci1jaGVja2VkXFxcXDphZnRlclxcXFw6dHJhbnNsYXRlLXgtZnVsbDo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgLS10dy10cmFuc2xhdGUteDogMTAwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcblxyXG4ucGVlcjpjaGVja2VkIH4gLnBlZXItY2hlY2tlZFxcXFw6YWZ0ZXJcXFxcOmJvcmRlci13aGl0ZTo6YWZ0ZXIge1xuICBjb250ZW50OiB2YXIoLS10dy1jb250ZW50KTtcbiAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjU1IDI1NSAyNTUgLyB2YXIoLS10dy1ib3JkZXItb3BhY2l0eSkpO1xufVxyXG5cclxuLnBlZXI6Zm9jdXMgfiAucGVlci1mb2N1c1xcXFw6b3V0bGluZS1ub25lIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xufVxyXG5cclxuLnBlZXI6Zm9jdXMgfiAucGVlci1mb2N1c1xcXFw6cmluZy0xIHtcbiAgLS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7XG4gIC0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMXB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSwgdmFyKC0tdHctcmluZy1zaGFkb3cpLCB2YXIoLS10dy1zaGFkb3csIDAgMCAjMDAwMCk7XG59XHJcblxyXG4ucGVlcjpmb2N1cyB+IC5wZWVyLWZvY3VzXFxcXDpyaW5nLWJsYWNrIHtcbiAgLS10dy1yaW5nLW9wYWNpdHk6IDE7XG4gIC0tdHctcmluZy1jb2xvcjogcmdiKDAgMCAwIC8gdmFyKC0tdHctcmluZy1vcGFjaXR5KSk7XG59XHJcblxyXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcblxuICAubWRcXFxcOmNvbC1zcGFuLTEyIHtcbiAgICBncmlkLWNvbHVtbjogc3BhbiAxMiAvIHNwYW4gMTI7XG4gIH1cblxuICAubWRcXFxcOmNvbC1zcGFuLTYge1xuICAgIGdyaWQtY29sdW1uOiBzcGFuIDYgLyBzcGFuIDY7XG4gIH1cblxuICAubWRcXFxcOm0tMCB7XG4gICAgbWFyZ2luOiAwcHg7XG4gIH1cblxuICAubWRcXFxcOm0tMTAge1xuICAgIG1hcmdpbjogMi41cmVtO1xuICB9XG5cbiAgLm1kXFxcXDptLTIge1xuICAgIG1hcmdpbjogMC41cmVtO1xuICB9XG5cbiAgLm1kXFxcXDptLVxcXFxbMjBweFxcXFxdIHtcbiAgICBtYXJnaW46IDIwcHg7XG4gIH1cblxuICAubWRcXFxcOm14LTAge1xuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubWRcXFxcOm1iLTAge1xuICAgIG1hcmdpbi1ib3R0b206IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWItMyB7XG4gICAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6bWwtMCB7XG4gICAgbWFyZ2luLWxlZnQ6IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWwtNCB7XG4gICAgbWFyZ2luLWxlZnQ6IDFyZW07XG4gIH1cblxuICAubWRcXFxcOm1yLTAge1xuICAgIG1hcmdpbi1yaWdodDogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDptdC0yIHtcbiAgICBtYXJnaW4tdG9wOiAwLjVyZW07XG4gIH1cblxuICAubWRcXFxcOmJsb2NrIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gIC5tZFxcXFw6aW5saW5lLWJsb2NrIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cblxuICAubWRcXFxcOmZsZXgge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gIH1cblxuICAubWRcXFxcOmhpZGRlbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC5tZFxcXFw6aC1cXFxcWzIwMHB4XFxcXF0ge1xuICAgIGhlaWdodDogMjAwcHg7XG4gIH1cblxuICAubWRcXFxcOmgtXFxcXFszMDBweFxcXFxdIHtcbiAgICBoZWlnaHQ6IDMwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpoLVxcXFxbNDAwcHhcXFxcXSB7XG4gICAgaGVpZ2h0OiA0MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6aC1cXFxcWzQwcHhcXFxcXSB7XG4gICAgaGVpZ2h0OiA0MHB4O1xuICB9XG5cbiAgLm1kXFxcXDpoLVxcXFxbNjZweFxcXFxdIHtcbiAgICBoZWlnaHQ6IDY2cHg7XG4gIH1cblxuICAubWRcXFxcOmgtXFxcXFs5NVxcXFwlXFxcXF0ge1xuICAgIGhlaWdodDogOTUlO1xuICB9XG5cbiAgLm1kXFxcXDptYXgtaC1cXFxcWzQwMHB4XFxcXF0ge1xuICAgIG1heC1oZWlnaHQ6IDQwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDptaW4taC1mdWxsIHtcbiAgICBtaW4taGVpZ2h0OiAxMDAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbMTAwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFsxNVxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiAxNSU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFsxNTBweFxcXFxdIHtcbiAgICB3aWR0aDogMTUwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFsyMDBweFxcXFxdIHtcbiAgICB3aWR0aDogMjAwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFsyM1xcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiAyMyU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFsyNTBweFxcXFxdIHtcbiAgICB3aWR0aDogMjUwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFszMDBweFxcXFxdIHtcbiAgICB3aWR0aDogMzAwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFszNTBweFxcXFxdIHtcbiAgICB3aWR0aDogMzUwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs0MFxcXFwlXFxcXF0ge1xuICAgIHdpZHRoOiA0MCU7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs0MDBweFxcXFxdIHtcbiAgICB3aWR0aDogNDAwcHg7XG4gIH1cblxuICAubWRcXFxcOnctXFxcXFs1XFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDUlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNTBcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNTAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNTAwcHhcXFxcXSB7XG4gICAgd2lkdGg6IDUwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNTVcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNTUlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNTdcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNTclO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNjBcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNjAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbNzBcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogNzAlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbOTJcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogOTIlO1xuICB9XG5cbiAgLm1kXFxcXDp3LVxcXFxbOTVcXFxcJVxcXFxdIHtcbiAgICB3aWR0aDogOTUlO1xuICB9XG5cbiAgLm1kXFxcXDp3LWF1dG8ge1xuICAgIHdpZHRoOiBhdXRvO1xuICB9XG5cbiAgLm1kXFxcXDpcXFxcIW1pbi13LVxcXFxbNjUwcHhcXFxcXSB7XG4gICAgbWluLXdpZHRoOiA2NTBweCAhaW1wb3J0YW50O1xuICB9XG5cbiAgLm1kXFxcXDptaW4tdy1cXFxcWzQ0MHB4XFxcXF0ge1xuICAgIG1pbi13aWR0aDogNDQwcHg7XG4gIH1cblxuICAubWRcXFxcOm1pbi13LVxcXFxbNTAwcHhcXFxcXSB7XG4gICAgbWluLXdpZHRoOiA1MDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWluLXctZnVsbCB7XG4gICAgbWluLXdpZHRoOiAxMDAlO1xuICB9XG5cbiAgLm1kXFxcXDptYXgtdy1cXFxcWzQwMHB4XFxcXF0ge1xuICAgIG1heC13aWR0aDogNDAwcHg7XG4gIH1cblxuICAubWRcXFxcOm1heC13LVxcXFxbNDUwcHhcXFxcXSB7XG4gICAgbWF4LXdpZHRoOiA0NTBweDtcbiAgfVxuXG4gIC5tZFxcXFw6bWF4LXctXFxcXFs1MDBweFxcXFxdIHtcbiAgICBtYXgtd2lkdGg6IDUwMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpncmlkLWNvbHMtMiB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgbWlubWF4KDAsIDFmcikpO1xuICB9XG5cbiAgLm1kXFxcXDpmbGV4LXJvdyB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuXG4gIC5tZFxcXFw6aXRlbXMtY2VudGVyIHtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG5cbiAgLm1kXFxcXDpqdXN0aWZ5LXN0YXJ0IHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIH1cblxuICAubWRcXFxcOmp1c3RpZnktYmV0d2VlbiB7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICB9XG5cbiAgLm1kXFxcXDpnYXAtMSB7XG4gICAgZ2FwOiAwLjI1cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpnYXAtNiB7XG4gICAgZ2FwOiAxLjVyZW07XG4gIH1cblxuICAubWRcXFxcOmdhcC1cXFxcWzEycHhcXFxcXSB7XG4gICAgZ2FwOiAxMnB4O1xuICB9XG5cbiAgLm1kXFxcXDpnYXAtXFxcXFs4cHhcXFxcXSB7XG4gICAgZ2FwOiA4cHg7XG4gIH1cblxuICAubWRcXFxcOmdhcC15LTAge1xuICAgIHJvdy1nYXA6IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6cC0xMCB7XG4gICAgcGFkZGluZzogMi41cmVtO1xuICB9XG5cbiAgLm1kXFxcXDpwLTQge1xuICAgIHBhZGRpbmc6IDFyZW07XG4gIH1cblxuICAubWRcXFxcOnAtNSB7XG4gICAgcGFkZGluZzogMS4yNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cHktMCB7XG4gICAgcGFkZGluZy10b3A6IDBweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpweS01IHtcbiAgICBwYWRkaW5nLXRvcDogMS4yNXJlbTtcbiAgICBwYWRkaW5nLWJvdHRvbTogMS4yNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cGItMCB7XG4gICAgcGFkZGluZy1ib3R0b206IDBweDtcbiAgfVxuXG4gIC5tZFxcXFw6cGItNCB7XG4gICAgcGFkZGluZy1ib3R0b206IDFyZW07XG4gIH1cblxuICAubWRcXFxcOnBsLTgge1xuICAgIHBhZGRpbmctbGVmdDogMnJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6cHItMCB7XG4gICAgcGFkZGluZy1yaWdodDogMHB4O1xuICB9XG5cbiAgLm1kXFxcXDpwdC0zIHtcbiAgICBwYWRkaW5nLXRvcDogMC43NXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6dGV4dC1lbmQge1xuICAgIHRleHQtYWxpZ246IGVuZDtcbiAgfVxuXG4gIC5tZFxcXFw6dGV4dC0yeGwge1xuICAgIGZvbnQtc2l6ZTogMS41cmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAycmVtO1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LTN4bCB7XG4gICAgZm9udC1zaXplOiAxLjg3NXJlbTtcbiAgICBsaW5lLWhlaWdodDogMi4yNXJlbTtcbiAgfVxuXG4gIC5tZFxcXFw6dGV4dC1cXFxcWzEzcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAxM3B4O1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LVxcXFxbMTVweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDE1cHg7XG4gIH1cblxuICAubWRcXFxcOnRleHQtXFxcXFsyM3B4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogMjNweDtcbiAgfVxuXG4gIC5tZFxcXFw6dGV4dC1cXFxcWzMwcHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAzMHB4O1xuICB9XG5cbiAgLm1kXFxcXDp0ZXh0LVxcXFxbNDBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDQwcHg7XG4gIH1cblxuICAubWRcXFxcOnRleHQtYmFzZSB7XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQtbGcge1xuICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuNzVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQtc20ge1xuICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuMjVyZW07XG4gIH1cblxuICAubWRcXFxcOnRleHQteGwge1xuICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgfVxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDEwMjRweCkge1xuXG4gIC5sZ1xcXFw6cmVsYXRpdmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgfVxuXG4gIC5sZ1xcXFw6b3JkZXItbm9uZSB7XG4gICAgb3JkZXI6IDA7XG4gIH1cblxuICAubGdcXFxcOmNvbC1zcGFuLTEyIHtcbiAgICBncmlkLWNvbHVtbjogc3BhbiAxMiAvIHNwYW4gMTI7XG4gIH1cblxuICAubGdcXFxcOmNvbC1zcGFuLTYge1xuICAgIGdyaWQtY29sdW1uOiBzcGFuIDYgLyBzcGFuIDY7XG4gIH1cblxuICAubGdcXFxcOm14LTAge1xuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gIH1cblxuICAubGdcXFxcOm1sLTQge1xuICAgIG1hcmdpbi1sZWZ0OiAxcmVtO1xuICB9XG5cbiAgLmxnXFxcXDpibG9jayB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICAubGdcXFxcOmhpZGRlbiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzQwXFxcXCVcXFxcXSB7XG4gICAgd2lkdGg6IDQwJTtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzQwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA0MDBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6dy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA1MDBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6cC0xMCB7XG4gICAgcGFkZGluZzogMi41cmVtO1xuICB9XG5cbiAgLmxnXFxcXDpwLTE2IHtcbiAgICBwYWRkaW5nOiA0cmVtO1xuICB9XG5cbiAgLmxnXFxcXDpwLTQge1xuICAgIHBhZGRpbmc6IDFyZW07XG4gIH1cblxuICAubGdcXFxcOnRleHQtXFxcXFsxMjBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDEyMHB4O1xuICB9XG5cbiAgLmxnXFxcXDp0ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDMwcHg7XG4gIH1cblxuICAubGdcXFxcOnRleHQtXFxcXFs1MHB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogNTBweDtcbiAgfVxuXG4gIC5sZ1xcXFw6dGV4dC1sZyB7XG4gICAgZm9udC1zaXplOiAxLjEyNXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS43NXJlbTtcbiAgfVxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDEyODBweCkge1xuXG4gIC54bFxcXFw6dy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIHdpZHRoOiA1MDBweDtcbiAgfVxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDE1MzZweCkge1xuXG4gIC5cXFxcMzJ4bFxcXFw6bS01IHtcbiAgICBtYXJnaW46IDEuMjVyZW07XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOm10LVxcXFxbNjNweFxcXFxdIHtcbiAgICBtYXJnaW4tdG9wOiA2M3B4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDptYXgtdy1cXFxcWzUwMHB4XFxcXF0ge1xuICAgIG1heC13aWR0aDogNTAwcHg7XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOnAtMyB7XG4gICAgcGFkZGluZzogMC43NXJlbTtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6cHgtXFxcXFsxNXB4XFxcXF0ge1xuICAgIHBhZGRpbmctbGVmdDogMTVweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAxNXB4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDpweS1cXFxcWzEwcHhcXFxcXSB7XG4gICAgcGFkZGluZy10b3A6IDEwcHg7XG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XG4gIH1cblxuICAuXFxcXDMyeGxcXFxcOnRleHQtXFxcXFsyMHB4XFxcXF0ge1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgfVxuXG4gIC5cXFxcMzJ4bFxcXFw6dGV4dC1cXFxcWzI1cHhcXFxcXSB7XG4gICAgZm9udC1zaXplOiAyNXB4O1xuICB9XG5cbiAgLlxcXFwzMnhsXFxcXDp0ZXh0LVxcXFxbMzBweFxcXFxdIHtcbiAgICBmb250LXNpemU6IDMwcHg7XG4gIH1cbn1cclxuXHJcbi5wZWVyOmNoZWNrZWQgfiAucnRsXFxcXDpwZWVyLWNoZWNrZWRcXFxcOmFmdGVyXFxcXDotdHJhbnNsYXRlLXgtZnVsbDp3aGVyZShbZGlyPVwicnRsXCJdLCBbZGlyPVwicnRsXCJdICopOjphZnRlciB7XG4gIGNvbnRlbnQ6IHZhcigtLXR3LWNvbnRlbnQpO1xuICAtLXR3LXRyYW5zbGF0ZS14OiAtMTAwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLCB2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3WCh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSk7XG59XHJcblxyXG5AbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7XG5cbiAgLmRhcmtcXFxcOmJvcmRlci1ibGFjayB7XG4gICAgLS10dy1ib3JkZXItb3BhY2l0eTogMTtcbiAgICBib3JkZXItY29sb3I6IHJnYigwIDAgMCAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSk7XG4gIH1cblxuICAuZGFya1xcXFw6YmctZ3JheS03MDAge1xuICAgIC0tdHctYmctb3BhY2l0eTogMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNTUgNjUgODEgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSk7XG4gIH1cbn1gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9pbmRleC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7O0NBQWMsQ0FBZDs7O0NBQWM7O0FBQWQ7OztFQUFBLHNCQUFjLEVBQWQsTUFBYztFQUFkLGVBQWMsRUFBZCxNQUFjO0VBQWQsbUJBQWMsRUFBZCxNQUFjO0VBQWQscUJBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7O0VBQUEsZ0JBQWM7QUFBQTs7QUFBZDs7Ozs7Ozs7Q0FBYzs7QUFBZDs7RUFBQSxnQkFBYyxFQUFkLE1BQWM7RUFBZCw4QkFBYyxFQUFkLE1BQWMsRUFBZCxNQUFjO0VBQWQsV0FBYyxFQUFkLE1BQWM7RUFBZCwrSEFBYyxFQUFkLE1BQWM7RUFBZCw2QkFBYyxFQUFkLE1BQWM7RUFBZCwrQkFBYyxFQUFkLE1BQWM7RUFBZCx3Q0FBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7O0NBQWM7O0FBQWQ7RUFBQSxTQUFjLEVBQWQsTUFBYztFQUFkLG9CQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOzs7O0NBQWM7O0FBQWQ7RUFBQSxTQUFjLEVBQWQsTUFBYztFQUFkLGNBQWMsRUFBZCxNQUFjO0VBQWQscUJBQWMsRUFBZCxNQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7RUFBQSx5Q0FBYztVQUFkLGlDQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7Ozs7OztFQUFBLGtCQUFjO0VBQWQsb0JBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLGNBQWM7RUFBZCx3QkFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkOztFQUFBLG1CQUFjO0FBQUE7O0FBQWQ7Ozs7O0NBQWM7O0FBQWQ7Ozs7RUFBQSwrR0FBYyxFQUFkLE1BQWM7RUFBZCw2QkFBYyxFQUFkLE1BQWM7RUFBZCwrQkFBYyxFQUFkLE1BQWM7RUFBZCxjQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkO0VBQUEsY0FBYztBQUFBOztBQUFkOztDQUFjOztBQUFkOztFQUFBLGNBQWM7RUFBZCxjQUFjO0VBQWQsa0JBQWM7RUFBZCx3QkFBYztBQUFBOztBQUFkO0VBQUEsZUFBYztBQUFBOztBQUFkO0VBQUEsV0FBYztBQUFBOztBQUFkOzs7O0NBQWM7O0FBQWQ7RUFBQSxjQUFjLEVBQWQsTUFBYztFQUFkLHFCQUFjLEVBQWQsTUFBYztFQUFkLHlCQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOzs7O0NBQWM7O0FBQWQ7Ozs7O0VBQUEsb0JBQWMsRUFBZCxNQUFjO0VBQWQsOEJBQWMsRUFBZCxNQUFjO0VBQWQsZ0NBQWMsRUFBZCxNQUFjO0VBQWQsZUFBYyxFQUFkLE1BQWM7RUFBZCxvQkFBYyxFQUFkLE1BQWM7RUFBZCxvQkFBYyxFQUFkLE1BQWM7RUFBZCx1QkFBYyxFQUFkLE1BQWM7RUFBZCxjQUFjLEVBQWQsTUFBYztFQUFkLFNBQWMsRUFBZCxNQUFjO0VBQWQsVUFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7RUFBQSxvQkFBYztBQUFBOztBQUFkOzs7Q0FBYzs7QUFBZDs7OztFQUFBLDBCQUFjLEVBQWQsTUFBYztFQUFkLDZCQUFjLEVBQWQsTUFBYztFQUFkLHNCQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkO0VBQUEsYUFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkO0VBQUEsZ0JBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDtFQUFBLHdCQUFjO0FBQUE7O0FBQWQ7O0NBQWM7O0FBQWQ7O0VBQUEsWUFBYztBQUFBOztBQUFkOzs7Q0FBYzs7QUFBZDtFQUFBLDZCQUFjLEVBQWQsTUFBYztFQUFkLG9CQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkO0VBQUEsd0JBQWM7QUFBQTs7QUFBZDs7O0NBQWM7O0FBQWQ7RUFBQSwwQkFBYyxFQUFkLE1BQWM7RUFBZCxhQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkO0VBQUEsa0JBQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7Ozs7Ozs7Ozs7OztFQUFBLFNBQWM7QUFBQTs7QUFBZDtFQUFBLFNBQWM7RUFBZCxVQUFjO0FBQUE7O0FBQWQ7RUFBQSxVQUFjO0FBQUE7O0FBQWQ7OztFQUFBLGdCQUFjO0VBQWQsU0FBYztFQUFkLFVBQWM7QUFBQTs7QUFBZDs7Q0FBYztBQUFkO0VBQUEsVUFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkO0VBQUEsZ0JBQWM7QUFBQTs7QUFBZDs7O0NBQWM7O0FBQWQ7O0VBQUEsVUFBYyxFQUFkLE1BQWM7RUFBZCxjQUFjLEVBQWQsTUFBYztBQUFBOztBQUFkOztDQUFjOztBQUFkOztFQUFBLGVBQWM7QUFBQTs7QUFBZDs7Q0FBYztBQUFkO0VBQUEsZUFBYztBQUFBOztBQUFkOzs7O0NBQWM7O0FBQWQ7Ozs7Ozs7O0VBQUEsY0FBYyxFQUFkLE1BQWM7RUFBZCxzQkFBYyxFQUFkLE1BQWM7QUFBQTs7QUFBZDs7Q0FBYzs7QUFBZDs7RUFBQSxlQUFjO0VBQWQsWUFBYztBQUFBOztBQUFkLHdFQUFjO0FBQWQ7RUFBQSxhQUFjO0FBQUE7O0FBQWQ7O0VBQUEsdURBQWM7RUFBZDtBQUFjOztBQUFkOztFQUFBO0lBQUEsbUJBQWM7SUFBZCxxQkFBYztJQUFkLHNCQUFjO0lBQWQscUJBQWM7SUFBZCxzQkFBYztJQUFkLHFCQUFjO0lBQWQsc0JBQWM7SUFBZCxxQkFBYztJQUFkLHNCQUFjO0lBQWQsc0JBQWM7SUFBZCxzQkFBYztJQUFkLHNCQUFjO0lBQWQsc0JBQWM7SUFBZCxzQkFBYztJQUFkLHVCQUFjO0lBQWQsc0JBQWM7SUFBZCx1QkFBYztJQUFkLHNCQUFjO0lBQWQsdUJBQWM7SUFBZCxzQkFBYztJQUFkO0VBQWM7O0VBQWQ7O0lBQUE7TUFBQSxrQkFBYztNQUFkLHFCQUFjO01BQWQsc0JBQWM7TUFBZCxxQkFBYztNQUFkLHNCQUFjO01BQWQscUJBQWM7TUFBZCxzQkFBYztNQUFkLHFCQUFjO01BQWQsc0JBQWM7TUFBZCxzQkFBYztNQUFkLHNCQUFjO01BQWQsc0JBQWM7TUFBZCxzQkFBYztNQUFkLHNCQUFjO01BQWQsdUJBQWM7TUFBZCxzQkFB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QUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxlQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGdCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsZUFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEseUJBQW1CO1VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLDRCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLHFCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLHNCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLGtCQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxxQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxvQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxrQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxnQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQSxpQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQSxtQkFBbUI7RUFBbkI7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLGVBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsbUJBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUEsa0JBQW1CO0VBQW5CO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBO0FBQW1CO0FBQW5CO0VBQUE7QUFBbUI7QUFBbkI7RUFBQTtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtFQUFBLG9CQUFtQjtFQUFuQjtBQUFtQjtBQUFuQjtF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QkFnR0M7SUFoR0Qsc0JBZ0dDO0lBaEdEO0VBZ0dDOztFQWhHRDtJQUFBLFlBZ0dDO0lBaEdELGdCQWdHQztJQWhHRCxrQkFnR0M7SUFoR0QsbUJBZ0dDO0lBaEdEO0VBZ0dDOztFQWhHRDtJQUFBLFlBZ0dDO0lBaEdELFdBZ0dDO0lBaEdEO0VBZ0dDOztFQWhHRDtJQUFBLFlBZ0dDO0lBaEdELFdBZ0dDO0lBaEdEO0VBZ0dDOztFQWhHRDtJQUFBLFlBZ0dDO0lBaEdELFdBZ0dDO0lBaEdELHFCQWdHQztJQWhHRDtFQWdHQzs7RUFoR0Q7SUFBQSxZQWdHQztJQWhHRCxXQWdHQztJQWhHRCxxQkFnR0M7SUFoR0Q7RUFnR0M7QUFBQTs7QUFoR0Q7RUFBQSwwQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsMEJBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLDBCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSwwQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsMEJBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLDBCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSwwQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsMEJBZ0dDO0VBaEdELHNCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSwwQkFnR0M7RUFoR0Qsa0JBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLDBCQWdHQztFQWhHRCx3QkFnR0M7RUFoR0Qsd0RBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLGdCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQTtBQWdHQzs7QUFoR0Q7RUFBQSxrQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUE7QUFnR0M7O0FBaEdEO0VBQUE7QUFnR0M7O0FBaEdEO0VBQUEsc0JBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLHNCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQTtBQWdHQzs7QUFoR0Q7RUFBQSxrQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUE7QUFnR0M7O0FBaEdEO0VBQUEsb0JBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLG9CQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSxvQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUE7QUFnR0M7O0FBaEdEO0VBQUE7QUFnR0M7O0FBaEdEO0VBQUEsK0VBZ0dDO0VBaEdELG1HQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSxrQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsOEJBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLG9CQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSxzQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsa0JBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDtFQUFBLDBCQWdHQztFQWhHRCxzQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsMEJBZ0dDO0VBaEdELHNCQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSw4QkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEO0VBQUEsMkdBZ0dDO0VBaEdELHlHQWdHQztFQWhHRDtBQWdHQzs7QUFoR0Q7RUFBQSxvQkFnR0M7RUFoR0Q7QUFnR0M7O0FBaEdEOztFQUFBO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUEsZ0JBZ0dDO0lBaEdEO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBLGdCQWdHQztJQWhHRDtFQWdHQzs7RUFoR0Q7SUFBQSxvQkFnR0M7SUFoR0Q7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUEsaUJBZ0dDO0lBaEdEO0VBZ0dDOztFQWhHRDtJQUFBLG1CQWdHQztJQWhHRDtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQSxlQWdHQztJQWhHRDtFQWdHQzs7RUFoR0Q7SUFBQSxtQkFnR0M7SUFoR0Q7RUFnR0M7O0VBaEdEO0lBQUEsbUJBZ0dDO0lBaEdEO0VBZ0dDOztFQWhHRDtJQUFBLGtCQWdHQztJQWhHRDtFQWdHQztBQUFBOztBQWhHRDs7RUFBQTtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBLGdCQWdHQztJQWhHRDtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQTtFQWdHQzs7RUFoR0Q7SUFBQSxtQkFnR0M7SUFoR0Q7RUFnR0M7QUFBQTs7QUFoR0Q7O0VBQUE7SUFBQTtFQWdHQztBQUFBOztBQWhHRDs7RUFBQTtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBO0VBZ0dDOztFQWhHRDtJQUFBLGtCQWdHQztJQWhHRDtFQWdHQzs7RUFoR0Q7SUFBQSxpQkFnR0M7SUFoR0Q7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7O0VBaEdEO0lBQUE7RUFnR0M7QUFBQTs7QUFoR0Q7RUFBQSwwQkFnR0M7RUFoR0QsdUJBZ0dDO0VBaEdEO0FBZ0dDOztBQWhHRDs7RUFBQTtJQUFBLHNCQWdHQztJQWhHRDtFQWdHQzs7RUFoR0Q7SUFBQSxrQkFnR0M7SUFoR0Q7RUFnR0M7QUFBQVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJAdGFpbHdpbmQgYmFzZTtcXHJcXG5AdGFpbHdpbmQgY29tcG9uZW50cztcXHJcXG5AdGFpbHdpbmQgdXRpbGl0aWVzO1xcclxcblxcclxcbmJvZHkge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi8qIEN1c3RvbSBDU1MgdG8gaGlkZSBzY3JvbGxiYXIgKi9cXHJcXG4uaGlkZS1zY3JvbGxiYXI6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcXHJcXG4gIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5oaWRlLXNjcm9sbGJhciB7XFxyXFxuICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7XFxyXFxuICAvKiBJRSBhbmQgRWRnZSAqL1xcclxcbiAgc2Nyb2xsYmFyLXdpZHRoOiBub25lO1xcclxcbiAgLyogRmlyZWZveCAqL1xcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjZweCkge1xcclxcbiAgLmJCb2ZHciB7XFxyXFxuICAgIHdpZHRoOiAxNHB4ICFpbXBvcnRhbnQ7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbi8qIGJlbG93IGNzcyBjbGFzcyByZXBsYWNlIGJvb3RzdHJhcCBiYWNrZ3JvdW5kIGNvbG9yIHdpdGggZGFpc3kgKi9cXHJcXG4ub3AtYmctcHJpbWFyeSB7XFxyXFxuICBAYXBwbHkgYmctcHJpbWFyeTtcXHJcXG59XFxyXFxuXFxyXFxuLm9wLWJnLXNlY29uZGFyeSB7XFxyXFxuICBAYXBwbHkgYmctc2Vjb25kYXJ5O1xcclxcbn1cXHJcXG5cXHJcXG4ub3AtYmctaW5mbyB7XFxyXFxuICBAYXBwbHkgYmctaW5mbztcXHJcXG59XFxyXFxuXFxyXFxuLm9wLWJnLXN1Y2Nlc3Mge1xcclxcbiAgQGFwcGx5IGJnLXN1Y2Nlc3M7XFxyXFxufVxcclxcblxcclxcbi5vcC1iZy13YXJuaW5nIHtcXHJcXG4gIEBhcHBseSBiZy13YXJuaW5nO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBiZWxvdyBjc3MgY2xhc3MgcmVwbGFjZSBib290c3RyYXAgdGV4dCBjb2xvciB3aXRoIGRhaXN5ICovXFxyXFxuLm9wLXRleHQtcHJpbWFyeSB7XFxyXFxuICBAYXBwbHkgdGV4dC1wcmltYXJ5O1xcclxcbn1cXHJcXG5cXHJcXG4ub3AtdGV4dC1zZWNvbmRhcnkge1xcclxcbiAgQGFwcGx5IHRleHQtc2Vjb25kYXJ5O1xcclxcbn1cXHJcXG5cXHJcXG4ub3AtdGV4dC1pbmZvIHtcXHJcXG4gIEBhcHBseSB0ZXh0LWluZm87XFxyXFxufVxcclxcblxcclxcbi5vcC10ZXh0LWFjY2VudCB7XFxyXFxuICBAYXBwbHkgdGV4dC1hY2NlbnQ7XFxyXFxufVxcclxcblxcclxcbi5vcC10ZXh0LXN1Y2Nlc3Mge1xcclxcbiAgQGFwcGx5IHRleHQtc3VjY2VzcztcXHJcXG59XFxyXFxuXFxyXFxuLm9wLXRleHQtd2FybmluZyB7XFxyXFxuICBAYXBwbHkgdGV4dC13YXJuaW5nO1xcclxcbn1cXHJcXG5cXHJcXG4ub3AtYm9yZGVyLXByaW1hcnkge1xcclxcbiAgQGFwcGx5IGJvcmRlci1wcmltYXJ5O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBDU1MgZm9yIHNjcm9sbGJhciBjdXN0b21pemF0aW9uICovXFxyXFxuKiB7XFxyXFxuICBzY3JvbGxiYXItd2lkdGg6IHRoaW47XFxyXFxuICAvKiBGb3IgRmlyZWZveCAqL1xcclxcbiAgc2Nyb2xsYmFyLWNvbG9yOiBncmF5O1xcclxcbiAgLyogRm9yIEZpcmVmb3ggKi9cXHJcXG59XFxyXFxuXFxyXFxuLyogRm9yIHdlYmtpdC1iYXNlZCBicm93c2VycyBsaWtlIENocm9tZSwgU2FmYXJpICovXFxyXFxuKjo6LXdlYmtpdC1zY3JvbGxiYXIge1xcclxcbiAgd2lkdGg6IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuKjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxyXFxufVxcclxcblxcclxcbio6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGdyYXk7XFxyXFxuICBib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BVF9SVUxFX0lNUE9SVF8wX19fIGZyb20gXCItIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9AcmFkaXgtdWkvY29sb3JzL2JsYWNrLWFscGhhLmNzc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVRfUlVMRV9JTVBPUlRfMV9fXyBmcm9tIFwiLSEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvQHJhZGl4LXVpL2NvbG9ycy9tYXV2ZS5jc3NcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzJfX18gZnJvbSBcIi0hLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL0ByYWRpeC11aS9jb2xvcnMvdmlvbGV0LmNzc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18uaShfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzBfX18pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18uaShfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzFfX18pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18uaShfX19DU1NfTE9BREVSX0FUX1JVTEVfSU1QT1JUXzJfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuQ29udGV4dE1lbnVDb250ZW50LFxyXG4uQ29udGV4dE1lbnVTdWJDb250ZW50IHtcclxuICBtaW4td2lkdGg6IDEzNXB4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIHBhZGRpbmc6IDVweDtcclxuICBib3gtc2hhZG93OlxyXG4gICAgMHB4IDEwcHggMzhweCAtMTBweCByZ2JhKDIyLCAyMywgMjQsIDAuMzUpLFxyXG4gICAgMHB4IDEwcHggMjBweCAtMTVweCByZ2JhKDIyLCAyMywgMjQsIDAuMik7XHJcbiAgei1pbmRleDogOTk7XHJcbn1cclxuXHJcbi5Db250ZXh0TWVudUl0ZW0sXHJcbi5Db250ZXh0TWVudUNoZWNrYm94SXRlbSxcclxuLkNvbnRleHRNZW51UmFkaW9JdGVtLFxyXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyIHtcclxuICBmb250LXNpemU6IDEzcHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XHJcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBoZWlnaHQ6IDI1cHg7XHJcbiAgcGFkZGluZzogMCA1cHg7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHBhZGRpbmctbGVmdDogMTVweDtcclxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgb3V0bGluZTogbm9uZTtcclxufVxyXG5cclxuLkNvbnRleHRNZW51U3ViVHJpZ2dlcltkYXRhLXN0YXRlPVwib3BlblwiXSB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcclxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcclxufVxyXG5cclxuLkNvbnRleHRNZW51SXRlbVtkYXRhLWRpc2FibGVkXSxcclxuLkNvbnRleHRNZW51Q2hlY2tib3hJdGVtW2RhdGEtZGlzYWJsZWRdLFxyXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW1bZGF0YS1kaXNhYmxlZF0sXHJcbi5Db250ZXh0TWVudVN1YlRyaWdnZXJbZGF0YS1kaXNhYmxlZF0ge1xyXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS04KTtcclxuICBwb2ludGVyLWV2ZW50czogXCJub25lXCI7XHJcbn1cclxuXHJcbi5Db250ZXh0TWVudUl0ZW1bZGF0YS1oaWdobGlnaHRlZF0sXHJcbi5Db250ZXh0TWVudUNoZWNrYm94SXRlbVtkYXRhLWhpZ2hsaWdodGVkXSxcclxuLkNvbnRleHRNZW51UmFkaW9JdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdLFxyXG4uQ29udGV4dE1lbnVTdWJUcmlnZ2VyW2RhdGEtaGlnaGxpZ2h0ZWRdIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkOWRiO1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xyXG59XHJcblxyXG4uQ29udGV4dE1lbnVMYWJlbCB7XHJcbiAgcGFkZGluZy1sZWZ0OiAyNXB4O1xyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxuICBsaW5lLWhlaWdodDogMjVweDtcclxuICBjb2xvcjogdmFyKC0tbWF1dmUtMTEpO1xyXG59XHJcblxyXG4uQ29udGV4dE1lbnVJdGVtSW5kaWNhdG9yIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgbGVmdDogMDtcclxuICB3aWR0aDogMjVweDtcclxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG59XHJcblxyXG4uUmlnaHRTbG90IHtcclxuICBtYXJnaW4tbGVmdDogYXV0bztcclxuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XHJcbiAgY29sb3I6IHZhcigtLW1hdXZlLTExKTtcclxufVxyXG5cclxuW2RhdGEtaGlnaGxpZ2h0ZWRdID4gLlJpZ2h0U2xvdCB7XHJcbiAgY29sb3I6IHdoaXRlO1xyXG59XHJcblxyXG5bZGF0YS1kaXNhYmxlZF0gLlJpZ2h0U2xvdCB7XHJcbiAgY29sb3I6IHZhcigtLW1hdXZlLTgpO1xyXG59XHJcblxyXG4uZHJvcGRvd24tbWVudSB7XHJcbiAgbWluLXdpZHRoOiAxMHJlbTtcclxufVxyXG5cclxuLmRyb3Bkb3duLWl0ZW0ge1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIHBhZGRpbmc6IDAuM3JlbSAxLjJyZW07XHJcbiAgY2xlYXI6IGJvdGg7XHJcbiAgZm9udC13ZWlnaHQ6IDQwMDtcclxuICBjb2xvcjogIzM5M2EzOTtcclxuICB0ZXh0LWFsaWduOiBpbmhlcml0O1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XHJcbiAgYm9yZGVyOiAwO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLmRyb3Bkb3duLWl0ZW06aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNkYWQ5ZGI7XHJcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XHJcbn1cclxuXHJcbi5tb2RhbCB7XHJcbiAgbWFyZ2luLXRvcDogNTBweDtcclxufVxyXG4ucGRmTmFtZSB7XHJcbiAgZm9udC1zaXplOiAxMHB4O1xyXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbn1cclxuXHJcblxyXG4uaHJTdHlsZSB7XHJcbiAgbWFyZ2luLXRvcDogMHJlbSAhaW1wb3J0YW50O1xyXG4gIG1hcmdpbi1ib3R0b206IDByZW0gIWltcG9ydGFudDtcclxuICBib3JkZXI6IDA7XHJcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcclxufVxyXG5cclxuLnN0YXR1cy1iYWRnZSB7XHJcbiAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gIHRvcDogMDtcclxuICByaWdodDogMDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xyXG4gIHdpZHRoOiAyNHB4O1xyXG4gIGhlaWdodDogMjRweDtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbn1cclxuXHJcbi5zdGF0dXMtYmFkZ2UgaSB7XHJcbiAgZm9udC1zaXplOiAxMnB4O1xyXG59XHJcblxyXG4vKiBTdGF0dXMtc3BlY2lmaWMgY29sb3JzICovXHJcbi5jb21wbGV0ZWQge1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICM0Y2FmNTA7XHJcbiAgY29sb3I6ICNmZmY7XHJcbn1cclxuXHJcbi5pbi1wcm9ncmVzcyB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYzEwNztcclxuICBjb2xvcjogI2ZmZjtcclxufVxyXG5cclxuLmRlY2xpbmVkIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2O1xyXG4gIGNvbG9yOiAjZmZmO1xyXG59XHJcblxyXG4uZXhwaXJlZCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzllOWU5ZTtcclxuICBjb2xvcjogI2ZmZjtcclxufVxyXG5cclxuLmRyYWZ0IHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDc5Y2RjO1xyXG4gIGNvbG9yOiAjZmZmO1xyXG59XHJcblxyXG5cclxuLnNvcnQge1xyXG4gIHBhZGRpbmc6IDhweCAxNXB4O1xyXG4gIG1hcmdpbjogNXB4O1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5zb3J0OmhvdmVyIHtcclxuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgxNjgsIDIwNCwgMjA2LCAwLjEpO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1hdXZlLTMpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDJweDtcclxufVxyXG5cclxuLmZpbGVOYW1lIHtcclxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgd2lkdGg6IDEwMHB4O1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gIGZvbnQtc2l6ZTogMTFweDtcclxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgZm9udC13ZWlnaHQ6IDQ4MDtcclxufVxyXG5cclxuYSB7XHJcbiAgYWxsOiB1bnNldDtcclxufVxyXG5cclxuLkhvdmVyQ2FyZENvbnRlbnQge1xyXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcclxuICBwYWRkaW5nOiA1cHggMTBweDtcclxuICB3aWR0aDogMTcwcHg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgYm94LXNoYWRvdzpcclxuICAgIGhzbCgyMDYgMjIlIDclIC8gMzUlKSAwcHggMTBweCAzOHB4IC0xMHB4LFxyXG4gICAgaHNsKDIwNiAyMiUgNyUgLyAyMCUpIDBweCAxMHB4IDIwcHggLTE1cHg7XHJcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiA0MDBtcztcclxuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcclxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG59XHJcblxyXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XCJ0b3BcIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZURvd25BbmRGYWRlO1xyXG59XHJcblxyXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XCJyaWdodFwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlTGVmdEFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cImJvdHRvbVwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlVXBBbmRGYWRlO1xyXG59XHJcblxyXG4uSG92ZXJDYXJkQ29udGVudFtkYXRhLXNpZGU9XCJsZWZ0XCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVSaWdodEFuZEZhZGU7XHJcbn1cclxuXHJcbi5Ib3ZlckNhcmRBcnJvdyB7XHJcbiAgZmlsbDogd2hpdGU7XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgc2xpZGVVcEFuZEZhZGUge1xyXG4gIDAlIHtcclxuICAgIG9wYWNpdHk6IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KTtcclxuICB9XHJcblxyXG4gIDEwMCUge1xyXG4gICAgb3BhY2l0eTogMTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcclxuICB9XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgc2xpZGVSaWdodEFuZEZhZGUge1xyXG4gIDAlIHtcclxuICAgIG9wYWNpdHk6IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTJweCk7XHJcbiAgfVxyXG5cclxuICAxMDAlIHtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XHJcbiAgfVxyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIHNsaWRlRG93bkFuZEZhZGUge1xyXG4gIDAlIHtcclxuICAgIG9wYWNpdHk6IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7XHJcbiAgfVxyXG5cclxuICAxMDAlIHtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XHJcbiAgfVxyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIHNsaWRlTGVmdEFuZEZhZGUge1xyXG4gIDAlIHtcclxuICAgIG9wYWNpdHk6IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMnB4KTtcclxuICB9XHJcblxyXG4gIDEwMCUge1xyXG4gICAgb3BhY2l0eTogMTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSAobWluLXdpZHRoOiAzMTBweCkgYW5kIChtYXgtd2lkdGg6IDU1MHB4KSB7XHJcbiAgLnNvcnQge1xyXG4gICAgcGFkZGluZzogMnB4O1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzA5cHgpIHtcclxuICAuc29ydCB7XHJcbiAgICBwYWRkaW5nOiAycHg7XHJcbiAgfVxyXG59XHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL3N0eWxlcy9vcGVuc2lnbmRyaXZlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFJQTs7RUFFRSxnQkFBZ0I7RUFDaEIs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QTBCO0VBQzVCOztFQUVBO0lBQ0UsVUFBVTtJQUNWLHdCQUF3QjtFQUMxQjtBQUNGOztBQUVBO0VBQ0U7SUFDRSxVQUFVO0lBQ1YsMkJBQTJCO0VBQzdCOztFQUVBO0lBQ0UsVUFBVTtJQUNWLHdCQUF3QjtFQUMxQjtBQUNGOztBQUVBO0VBQ0U7SUFDRSxVQUFVO0lBQ1YsMkJBQTJCO0VBQzdCOztFQUVBO0lBQ0UsVUFBVTtJQUNWLHdCQUF3QjtFQUMxQjtBQUNGOztBQUVBO0VBQ0U7SUFDRSxVQUFVO0lBQ1YsMEJBQTBCO0VBQzVCOztFQUVBO0lBQ0UsVUFBVTtJQUNWLHdCQUF3QjtFQUMxQjtBQUNGOztBQUVBO0VBQ0U7SUFDRSxZQUFZO0VBQ2Q7QUFDRjs7QUFFQTtFQUNFO0lBQ0UsWUFBWTtFQUNkO0FBQ0ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiQGltcG9ydCBcXFwiQHJhZGl4LXVpL2NvbG9ycy9ibGFjay1hbHBoYS5jc3NcXFwiO1xcclxcbkBpbXBvcnQgXFxcIkByYWRpeC11aS9jb2xvcnMvbWF1dmUuY3NzXFxcIjtcXHJcXG5AaW1wb3J0IFxcXCJAcmFkaXgtdWkvY29sb3JzL3Zpb2xldC5jc3NcXFwiO1xcclxcblxcclxcbi5Db250ZXh0TWVudUNvbnRlbnQsXFxyXFxuLkNvbnRleHRNZW51U3ViQ29udGVudCB7XFxyXFxuICBtaW4td2lkdGg6IDEzNXB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBib3JkZXItcmFkaXVzOiA2cHg7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgcGFkZGluZzogNXB4O1xcclxcbiAgYm94LXNoYWRvdzpcXHJcXG4gICAgMHB4IDEwcHggMzhweCAtMTBweCByZ2JhKDIyLCAyMywgMjQsIDAuMzUpLFxcclxcbiAgICAwcHggMTBweCAyMHB4IC0xNXB4IHJnYmEoMjIsIDIzLCAyNCwgMC4yKTtcXHJcXG4gIHotaW5kZXg6IDk5O1xcclxcbn1cXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVJdGVtLFxcclxcbi5Db250ZXh0TWVudUNoZWNrYm94SXRlbSxcXHJcXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW0sXFxyXFxuLkNvbnRleHRNZW51U3ViVHJpZ2dlciB7XFxyXFxuICBmb250LXNpemU6IDEzcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMTtcXHJcXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBoZWlnaHQ6IDI1cHg7XFxyXFxuICBwYWRkaW5nOiAwIDVweDtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHBhZGRpbmctbGVmdDogMTVweDtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLkNvbnRleHRNZW51U3ViVHJpZ2dlcltkYXRhLXN0YXRlPVxcXCJvcGVuXFxcIl0ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogZ3JheTtcXHJcXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xcclxcbn1cXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVJdGVtW2RhdGEtZGlzYWJsZWRdLFxcclxcbi5Db250ZXh0TWVudUNoZWNrYm94SXRlbVtkYXRhLWRpc2FibGVkXSxcXHJcXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW1bZGF0YS1kaXNhYmxlZF0sXFxyXFxuLkNvbnRleHRNZW51U3ViVHJpZ2dlcltkYXRhLWRpc2FibGVkXSB7XFxyXFxuICBjb2xvcjogdmFyKC0tbWF1dmUtOCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogXFxcIm5vbmVcXFwiO1xcclxcbn1cXHJcXG5cXHJcXG4uQ29udGV4dE1lbnVJdGVtW2RhdGEtaGlnaGxpZ2h0ZWRdLFxcclxcbi5Db250ZXh0TWVudUNoZWNrYm94SXRlbVtkYXRhLWhpZ2hsaWdodGVkXSxcXHJcXG4uQ29udGV4dE1lbnVSYWRpb0l0ZW1bZGF0YS1oaWdobGlnaHRlZF0sXFxyXFxuLkNvbnRleHRNZW51U3ViVHJpZ2dlcltkYXRhLWhpZ2hsaWdodGVkXSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkOWRiO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxufVxcclxcblxcclxcbi5Db250ZXh0TWVudUxhYmVsIHtcXHJcXG4gIHBhZGRpbmctbGVmdDogMjVweDtcXHJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyNXB4O1xcclxcbiAgY29sb3I6IHZhcigtLW1hdXZlLTExKTtcXHJcXG59XFxyXFxuXFxyXFxuLkNvbnRleHRNZW51SXRlbUluZGljYXRvciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgd2lkdGg6IDI1cHg7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLlJpZ2h0U2xvdCB7XFxyXFxuICBtYXJnaW4tbGVmdDogYXV0bztcXHJcXG4gIHBhZGRpbmctbGVmdDogMjBweDtcXHJcXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS0xMSk7XFxyXFxufVxcclxcblxcclxcbltkYXRhLWhpZ2hsaWdodGVkXSA+IC5SaWdodFNsb3Qge1xcclxcbiAgY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG5bZGF0YS1kaXNhYmxlZF0gLlJpZ2h0U2xvdCB7XFxyXFxuICBjb2xvcjogdmFyKC0tbWF1dmUtOCk7XFxyXFxufVxcclxcblxcclxcbi5kcm9wZG93bi1tZW51IHtcXHJcXG4gIG1pbi13aWR0aDogMTByZW07XFxyXFxufVxcclxcblxcclxcbi5kcm9wZG93bi1pdGVtIHtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBwYWRkaW5nOiAwLjNyZW0gMS4ycmVtO1xcclxcbiAgY2xlYXI6IGJvdGg7XFxyXFxuICBmb250LXdlaWdodDogNDAwO1xcclxcbiAgY29sb3I6ICMzOTNhMzk7XFxyXFxuICB0ZXh0LWFsaWduOiBpbmhlcml0O1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyOiAwO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uZHJvcGRvd24taXRlbTpob3ZlciB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkOWRiO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxufVxcclxcblxcclxcbi5tb2RhbCB7XFxyXFxuICBtYXJnaW4tdG9wOiA1MHB4O1xcclxcbn1cXHJcXG4ucGRmTmFtZSB7XFxyXFxuICBmb250LXNpemU6IDEwcHg7XFxyXFxuICBmb250LXdlaWdodDogNjAwO1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4uaHJTdHlsZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAwcmVtICFpbXBvcnRhbnQ7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwcmVtICFpbXBvcnRhbnQ7XFxyXFxuICBib3JkZXI6IDA7XFxyXFxuICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpO1xcclxcbn1cXHJcXG5cXHJcXG4uc3RhdHVzLWJhZGdlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXHJcXG4gIHdpZHRoOiAyNHB4O1xcclxcbiAgaGVpZ2h0OiAyNHB4O1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxufVxcclxcblxcclxcbi5zdGF0dXMtYmFkZ2UgaSB7XFxyXFxuICBmb250LXNpemU6IDEycHg7XFxyXFxufVxcclxcblxcclxcbi8qIFN0YXR1cy1zcGVjaWZpYyBjb2xvcnMgKi9cXHJcXG4uY29tcGxldGVkIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICM0Y2FmNTA7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLmluLXByb2dyZXNzIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmMxMDc7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLmRlY2xpbmVkIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLmV4cGlyZWQge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzllOWU5ZTtcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG4uZHJhZnQge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA3OWNkYztcXHJcXG4gIGNvbG9yOiAjZmZmO1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4uc29ydCB7XFxyXFxuICBwYWRkaW5nOiA4cHggMTVweDtcXHJcXG4gIG1hcmdpbjogNXB4O1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLnNvcnQ6aG92ZXIge1xcclxcbiAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMTY4LCAyMDQsIDIwNiwgMC4xKTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1hdXZlLTMpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xcclxcbn1cXHJcXG5cXHJcXG4uZmlsZU5hbWUge1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgd2lkdGg6IDEwMHB4O1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgZm9udC1zaXplOiAxMXB4O1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgZm9udC13ZWlnaHQ6IDQ4MDtcXHJcXG59XFxyXFxuXFxyXFxuYSB7XFxyXFxuICBhbGw6IHVuc2V0O1xcclxcbn1cXHJcXG5cXHJcXG4uSG92ZXJDYXJkQ29udGVudCB7XFxyXFxuICBib3JkZXItcmFkaXVzOiA2cHg7XFxyXFxuICBwYWRkaW5nOiA1cHggMTBweDtcXHJcXG4gIHdpZHRoOiAxNzBweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgYm94LXNoYWRvdzpcXHJcXG4gICAgaHNsKDIwNiAyMiUgNyUgLyAzNSUpIDBweCAxMHB4IDM4cHggLTEwcHgsXFxyXFxuICAgIGhzbCgyMDYgMjIlIDclIC8gMjAlKSAwcHggMTBweCAyMHB4IC0xNXB4O1xcclxcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiA0MDBtcztcXHJcXG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xcclxcbiAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybSwgb3BhY2l0eTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cXFwidG9wXFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlRG93bkFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cXFwicmlnaHRcXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVMZWZ0QW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkhvdmVyQ2FyZENvbnRlbnRbZGF0YS1zaWRlPVxcXCJib3R0b21cXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVVcEFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ib3ZlckNhcmRDb250ZW50W2RhdGEtc2lkZT1cXFwibGVmdFxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVJpZ2h0QW5kRmFkZTtcXHJcXG59XFxyXFxuXFxyXFxuLkhvdmVyQ2FyZEFycm93IHtcXHJcXG4gIGZpbGw6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlVXBBbmRGYWRlIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDJweCk7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAxMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlUmlnaHRBbmRGYWRlIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0ycHgpO1xcclxcbiAgfVxcclxcblxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQGtleWZyYW1lcyBzbGlkZURvd25BbmRGYWRlIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpO1xcclxcbiAgfVxcclxcblxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQGtleWZyYW1lcyBzbGlkZUxlZnRBbmRGYWRlIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDJweCk7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAxMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMTtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgfVxcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgKG1pbi13aWR0aDogMzEwcHgpIGFuZCAobWF4LXdpZHRoOiA1NTBweCkge1xcclxcbiAgLnNvcnQge1xcclxcbiAgICBwYWRkaW5nOiAycHg7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMwOXB4KSB7XFxyXFxuICAuc29ydCB7XFxyXFxuICAgIHBhZGRpbmc6IDJweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIkBpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RmFzdGhhbmQmZGlzcGxheT1zd2FwKTtcIl0pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIkBpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RGFuY2luZytTY3JpcHQmZGlzcGxheT1zd2FwKTtcIl0pO1xuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIkBpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RGVsaWNpb3VzK0hhbmRyYXduJmRpc3BsYXk9c3dhcCk7XCJdKTtcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCJAaW1wb3J0IHVybChodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUNlZGFydmlsbGUrQ3Vyc2l2ZSZkaXNwbGF5PXN3YXApO1wiXSk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5yZWFjdC1kYXRlcGlja2VyX19pbnB1dC1jb250YWluZXIge1xyXG4gIHBvc2l0aW9uOiBpbml0aWFsICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi53aWRnZXRzIHtcclxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xyXG4gIC8qIERpc2FibGUgdGV4dCBzZWxlY3Rpb24gaW4gV2ViS2l0IGJyb3dzZXJzICovXHJcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbn1cclxuXHJcbi5yYWRpb0J1dHRvbiB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBsZWZ0OiAwcHg7XHJcbiAgdG9wOiAwcHg7XHJcbiAgZm9udC1zaXplOiAxMnB4O1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkICMwMDdiZmY7XHJcbiAgYm9yZGVyLXJhZGl1czogNTBweDtcclxufVxyXG5cclxuLnNpZ25hdHVyZUNhbnZhcyB7XHJcbiAgYm9yZGVyOiAycHggc29saWQgIzg4ODtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XHJcbiAgd2lkdGg6IDQ2MHB4O1xyXG4gIGhlaWdodDogMTg0cHg7XHJcbn1cclxuXHJcbi5pbnRpYWxTaWduYXR1cmVDYW52YXMge1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4ODg7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xyXG4gIHdpZHRoOiAxNTBweDtcclxuICBoZWlnaHQ6IDE1MHB4O1xyXG59XHJcblxyXG4uaW50aWFsU2lnbmF0dXJlIHtcclxuICBib3JkZXI6IDJweCBzb2xpZCAjODg4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcclxuICB3aWR0aDogMTgzcHg7XHJcbiAgaGVpZ2h0OiAxODNweDtcclxufVxyXG5cclxuLnBlbkNvbnRhaW5lckRlZmF1bHQge1xyXG4gIHdpZHRoOiA0NjBweDtcclxufVxyXG5cclxuLmljb24ge1xyXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICBmb250LXNpemU6IDE0cHg7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIHotaW5kZXg6IDI7XHJcbiAgYmFja2dyb3VuZDogd2hpdGU7XHJcbn1cclxuXHJcbi5TY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWSB7XHJcbiAgd2lkdGg6IDRweCAhaW1wb3J0YW50O1xyXG59XHJcbi5TY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWCB7XHJcbiAgaGVpZ2h0OiA0cHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLnNpZ25Zb3Vyc2VsZkJsb2NrIHtcclxuICBwYWRkaW5nOiAwcHg7XHJcbiAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyICFpbXBvcnRhbnQ7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uc2VuZE1haWwge1xyXG4gIGJveC1zaGFkb3c6XHJcbiAgICAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEpLFxyXG4gICAgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7XHJcbiAgcGFkZGluZzogM3B4IDMwcHg7XHJcbiAgY29sb3I6IHdoaXRlO1xyXG4gIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcclxuICBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XHJcbn1cclxuXHJcbi51c2VyIHtcclxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcclxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxufVxyXG4uZGlzYWJsZWQge1xyXG4gIG9wYWNpdHk6IDAuNTtcclxuICAvKiBFeGFtcGxlOiByZWR1Y2Ugb3BhY2l0eSB0byB2aXN1YWxseSBpbmRpY2F0ZSBkaXNhYmxlZCBzdGF0ZSAqL1xyXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xyXG4gIC8qIFByZXZlbnRzIG1vdXNlIGNsaWNrcyBhbmQgb3RoZXIgZXZlbnRzICovXHJcbiAgLyogYmFja2dyb3VuZC1jb2xvcjogIzg4ODsgKi9cclxufVxyXG5cclxuLnNpZ25UYWIge1xyXG4gIGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50O1xyXG4gIGZvbnQtd2VpZ2h0OiA0MDAgIWltcG9ydGFudDtcclxuICBtYXJnaW46IDdweCAhaW1wb3J0YW50O1xyXG4gIGZvbnQtc2l6ZTogMTVweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uc2lnbmVyQ29tcG9uZW50IHtcclxuICAvKiBib3gtc2hhZG93OiByZ2JhKDE3LCAxMiwgNDYsIDAuMTUpIDBweCA0OHB4IDEwMHB4IDBweDsgKi9cclxuICAvKiB3aWR0aDogMTgwcHg7ICovXHJcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi51cGxvYWRJbWdMb2dvIHtcclxuICBmb250LXNpemU6IDUwcHg7XHJcbn1cclxuXHJcbi5Ecm9wZG93bk1lbnVDb250ZW50LFxyXG4uRHJvcGRvd25NZW51U3ViQ29udGVudCB7XHJcbiAgbWluLXdpZHRoOiAxMzBweDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xNSk7XHJcbiAgYm9yZGVyLXJhZGl1czogMC4yNXJlbTtcclxuICBwYWRkaW5nOiA1cHg7XHJcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiA0MDBtcztcclxuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcclxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xyXG4gIHotaW5kZXg6IDMwICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5Ecm9wZG93bk1lbnVDb250ZW50W2RhdGEtc2lkZT1cInRvcFwiXSxcclxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVwidG9wXCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVEb3duQW5kRmFkZTtcclxufVxyXG5cclxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVwicmlnaHRcIl0sXHJcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cInJpZ2h0XCJdIHtcclxuICBhbmltYXRpb24tbmFtZTogc2xpZGVMZWZ0QW5kRmFkZTtcclxufVxyXG5cclxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVwiYm90dG9tXCJdLFxyXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XCJib3R0b21cIl0ge1xyXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZVVwQW5kRmFkZTtcclxufVxyXG5cclxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVwibGVmdFwiXSxcclxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVwibGVmdFwiXSB7XHJcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlUmlnaHRBbmRGYWRlO1xyXG59XHJcblxyXG4uRHJvcGRvd25NZW51SXRlbSB7XHJcbiAgZm9udC1zaXplOiAxM3B4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxO1xyXG4gIGNvbG9yOiBibGFjaztcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBoZWlnaHQ6IDI1cHg7XHJcbiAgcGFkZGluZzogMCA1cHg7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHBhZGRpbmctbGVmdDogMjBweDtcclxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgb3V0bGluZTogbm9uZTtcclxuICBib3JkZXI6IG5vbmU7XHJcbn1cclxuXHJcbi5TZWxlY3RUcmlnZ2VyIHtcclxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBwYWRkaW5nOiAwIDcwcHg7XHJcbiAgZm9udC1zaXplOiAxM3B4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxO1xyXG4gIGhlaWdodDogMzVweDtcclxuICBnYXA6IDVweDtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzg4N2FiZjtcclxuICB3aWR0aDogMTAwcHg7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbn1cclxuXHJcbi5zZWxlY3RFbWFpbCB7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgcGFkZGluZzogMCAxNXB4O1xyXG4gIGZvbnQtc2l6ZTogMTNweDtcclxuICBsaW5lLWhlaWdodDogMTtcclxuICBoZWlnaHQ6IDM1cHg7XHJcbiAgZ2FwOiA1cHg7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICM4ODdhYmY7XHJcbiAgd2lkdGg6IDIwMHB4O1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG59XHJcblxyXG5vcHRpb24ge1xyXG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcclxufVxyXG5cclxuLlNlbGVjdFRyaWdnZXI6aG92ZXIge1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4uc2VsZWN0RW1haWw6aG92ZXIge1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4uU2VsZWN0VHJpZ2dlcjpmb2N1cyB7XHJcbiAgLyogYm94LXNoYWRvdzogMCAwIDAgMnB4IGJsYWNrOyAqL1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4uc2VsZWN0RW1haWw6Zm9jdXMge1xyXG4gIC8qIGJveC1zaGFkb3c6IDAgMCAwIDJweCBibGFjazsgKi9cclxuICBib3JkZXI6IG5vbmU7XHJcbiAgb3V0bGluZTogbm9uZTtcclxufVxyXG5cclxuLlNlbGVjdFRyaWdnZXJbZGF0YS1wbGFjZWhvbGRlcl0ge1xyXG4gIGNvbG9yOiBibGFjaztcclxufVxyXG5cclxuLlNlbGVjdEljb24ge1xyXG4gIGNvbG9yOiBWYXIoLS12aW9sZXQtMTEpO1xyXG59XHJcblxyXG4uU2VsZWN0Q29udGVudCB7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICBib3JkZXItcmFkaXVzOiA2cHg7XHJcbiAgYm94LXNoYWRvdzpcclxuICAgIDBweCAxMHB4IDM4cHggLTEwcHggcmdiYSgyMiwgMjMsIDI0LCAwLjM1KSxcclxuICAgIDBweCAxMHB4IDIwcHggLTE1cHggcmdiYSgyMiwgMjMsIDI0LCAwLjIpO1xyXG59XHJcblxyXG4uU2VsZWN0Vmlld3BvcnQge1xyXG4gIHBhZGRpbmc6IDVweDtcclxufVxyXG5cclxuLlNlbGVjdEl0ZW0ge1xyXG4gIGZvbnQtc2l6ZTogMTNweDtcclxuICBsaW5lLWhlaWdodDogMTtcclxuICBjb2xvcjogdmFyKC0tdmlvbGV0LTExKTtcclxuICBib3JkZXItcmFkaXVzOiAzcHg7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGhlaWdodDogMjVweDtcclxuICBwYWRkaW5nOiAwIDM1cHggMCAyNXB4O1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgei1pbmRleDogMTAgIWltcG9ydGFudDtcclxufVxyXG5cclxuLlNlbGVjdEl0ZW1bZGF0YS1kaXNhYmxlZF0ge1xyXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS04KTtcclxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxufVxyXG5cclxuLlNlbGVjdEl0ZW1bZGF0YS1oaWdobGlnaHRlZF0ge1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdmlvbGV0LTkpO1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMSk7XHJcbn1cclxuXHJcbi5TZWxlY3RMYWJlbCB7XHJcbiAgcGFkZGluZzogMCAyNXB4O1xyXG4gIGZvbnQtc2l6ZTogMTJweDtcclxuICBsaW5lLWhlaWdodDogMjVweDtcclxuICBjb2xvcjogdmFyKC0tbWF1dmUtMTEpO1xyXG59XHJcblxyXG4uU2VsZWN0U2VwYXJhdG9yIHtcclxuICBoZWlnaHQ6IDFweDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS12aW9sZXQtNik7XHJcbiAgbWFyZ2luOiA1cHg7XHJcbn1cclxuXHJcbi5TZWxlY3RJdGVtSW5kaWNhdG9yIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgbGVmdDogMDtcclxuICB3aWR0aDogMjVweDtcclxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG59XHJcblxyXG4uU2VsZWN0U2Nyb2xsQnV0dG9uIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgaGVpZ2h0OiAyNXB4O1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xyXG4gIGN1cnNvcjogZGVmYXVsdDtcclxufVxyXG5cclxuLmRyb3BEb3duU3R5bGUge1xyXG4gIHdpZHRoOiBhdXRvO1xyXG59XHJcblxyXG4uYXV0b1NpZ25TY3JvbGwge1xyXG4gIG92ZXJmbG93LXk6IGF1dG87XHJcbn1cclxuXHJcbi5hdXRvU2lnblNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi52YWxpZGF0ZUlucHV0VGV4dCB7XHJcbiAgd2lkdGg6IDc2JTtcclxufVxyXG5cclxuLnJhZGlvR3JvdXBJbnB1dCB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5yYWRpb0dyb3VwIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xyXG59XHJcblxyXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjZweCkge1xyXG4gIC52YWxpZGF0ZUlucHV0VGV4dCB7XHJcbiAgICB3aWR0aDogOTMlO1xyXG4gIH1cclxuXHJcbiAgLmRyb3Bkb3duLW1lbnUge1xyXG4gICAgbWluLXdpZHRoOiAwcmVtICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG5cclxuICAjbmF2YmFyIHtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB6LWluZGV4OiA0OTtcclxuICB9XHJcblxyXG4gIC8qIE5hdmJhciBsaW5rcyAqL1xyXG4gICNuYXZiYXIgYSB7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgY29sb3I6ICNmMmYyZjI7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBwYWRkaW5nOiAxNHB4O1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gIH1cclxuXHJcbiAgI25hdmJhciBhLmFjdGl2ZSB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGNhZjUwO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gIH1cclxuXHJcbiAgLyogUGFnZSBjb250ZW50ICovXHJcbiAgLmNvbnRlbnQge1xyXG4gICAgcGFkZGluZzogMTZweDtcclxuICB9XHJcblxyXG4gIC8qIFRoZSBzdGlja3kgY2xhc3MgaXMgYWRkZWQgdG8gdGhlIG5hdmJhclxyXG4gIHdpdGggSlMgd2hlbiBpdCByZWFjaGVzIGl0cyBzY3JvbGwgcG9zaXRpb24gKi9cclxuICAuc3RpY2t5SGVhZCB7XHJcbiAgICB0b3A6IDUwcHg7XHJcbiAgICBsZWZ0OiAwLjlyZW07XHJcbiAgfVxyXG5cclxuICAuc3RpY2t5U2lnbmVySGVhZCB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgfVxyXG5cclxuICAvKiBBZGQgc29tZSB0b3AgcGFkZGluZyB0byB0aGUgcGFnZSBjb250ZW50XHJcbiAgdG8gcHJldmVudCBzdWRkZW4gcXVpY2sgbW92ZW1lbnQgKGFzIHRoZVxyXG4gIG5hdmlnYXRpb24gYmFyIGdldHMgYSBuZXcgcG9zaXRpb24gYXQgdGhlIHRvcCBvZiB0aGVcclxuICBwYWdlIChwb3NpdGlvbjpmaXhlZCBhbmQgdG9wOjApICovXHJcbiAgLnN0aWNreUhlYWQgKyAuY29udGVudCB7XHJcbiAgICBwYWRkaW5nLXRvcDogNjBweDtcclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4N3B4KSBhbmQgKG1pbi13aWR0aDogMzUxcHgpIHtcclxuICAuc2lnbmF0dXJlQ2FudmFzIHtcclxuICAgIHdpZHRoOiAzMDBweDtcclxuICAgIGhlaWdodDogMTIwcHg7XHJcbiAgfVxyXG5cclxuICAucGVuQ29udGFpbmVyRGVmYXVsdCB7XHJcbiAgICB3aWR0aDogMzAwcHg7XHJcbiAgfVxyXG5cclxuICAudXBsb2FkSW1nTG9nbyB7XHJcbiAgICBmb250LXNpemU6IDMwcHg7XHJcbiAgfVxyXG5cclxuICAuc2lnblRhYiB7XHJcbiAgICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XHJcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcclxuICB9XHJcbn1cclxuXHJcbi5zY3JvbGwtaGlkZTo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzUwcHgpIGFuZCAobWluLXdpZHRoOiAzMTFweCkge1xyXG4gIC5zaWduYXR1cmVDYW52YXMge1xyXG4gICAgd2lkdGg6IDI4MHB4O1xyXG4gICAgaGVpZ2h0OiAxMTJweDtcclxuICB9XHJcblxyXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcclxuICAgIHdpZHRoOiAyODBweDtcclxuICB9XHJcblxyXG4gIC5zaWduVGFiIHtcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcclxuXHJcbiAgICBmb250LXNpemU6IDEwcHggIWltcG9ydGFudDtcclxuICB9XHJcblxyXG4gIC51cGxvYWRJbWdMb2dvIHtcclxuICAgIGZvbnQtc2l6ZTogMjVweDtcclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMxMHB4KSB7XHJcbiAgLnNpZ25hdHVyZUNhbnZhcyB7XHJcbiAgICB3aWR0aDogMjMwcHg7XHJcbiAgICBoZWlnaHQ6IDkycHg7XHJcbiAgfVxyXG5cclxuICAucGVuQ29udGFpbmVyRGVmYXVsdCB7XHJcbiAgICB3aWR0aDogMjMwcHg7XHJcbiAgfVxyXG5cclxuICAuc2lnblRhYiB7XHJcbiAgICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XHJcbiAgICBmb250LXNpemU6IDhweCAhaW1wb3J0YW50O1xyXG4gIH1cclxuXHJcbiAgLnVwbG9hZEltZ0xvZ28ge1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gIH1cclxufVxyXG5gLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9zdHlsZXMvc2lnbmF0dXJlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFLQTtFQUNFLDRCQUE0QjtBQUM5Qjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6Qiw4Q0FBOEM7RUFFOUMsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsV0FBVztFQUNYLFlBQVk7RUFDWixrQkFBa0I7RUFDbEIsU0FBUztFQUNULFFBQVE7RUFDUixlQUFlO0VBQ2YseUJBQXlCO0VBQ3pCLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0QixvQ0FBb0M7RUFDcEMsWUFBWTtFQUNaLGFBQWE7QUFDZjs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0QixvQ0FBb0M7RUFDcEMsWUFBWTtF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O0FBRUE7RUFDRTtJQUNFLFlBQVk7SUFDWixhQUFhO0VBQ2Y7O0VBRUE7SUFDRSxZQUFZO0VBQ2Q7O0VBRUE7SUFDRSxlQUFlO0VBQ2pCOztFQUVBO0lBQ0UsMkJBQTJCO0lBQzNCLDBCQUEwQjtFQUM1QjtBQUNGOztBQUVBO0VBQ0UsYUFBYTtBQUNmO0FBQ0E7RUFDRTtJQUNFLFlBQVk7SUFDWixhQUFhO0VBQ2Y7O0VBRUE7SUFDRSxZQUFZO0VBQ2Q7O0VBRUE7SUFDRSwyQkFBMkI7O0lBRTNCLDBCQUEwQjtFQUM1Qjs7RUFFQTtJQUNFLGVBQWU7RUFDakI7QUFDRjs7QUFFQTtFQUNFO0lBQ0UsWUFBWTtJQUNaLFlBQVk7RUFDZDs7RUFFQTtJQUNFLFlBQVk7RUFDZDs7RUFFQTtJQUNFLDJCQUEyQjtJQUMzQix5QkFBeUI7RUFDM0I7O0VBRUE7SUFDRSxlQUFlO0VBQ2pCO0FBQ0ZcIixcInNvdXJjZXNDb250ZW50XCI6W1wiQGltcG9ydCB1cmwoXFxcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RmFzdGhhbmQmZGlzcGxheT1zd2FwXFxcIik7XFxyXFxuQGltcG9ydCB1cmwoXFxcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RGFuY2luZytTY3JpcHQmZGlzcGxheT1zd2FwXFxcIik7XFxyXFxuQGltcG9ydCB1cmwoXFxcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9RGVsaWNpb3VzK0hhbmRyYXduJmRpc3BsYXk9c3dhcFxcXCIpO1xcclxcbkBpbXBvcnQgdXJsKFxcXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUNlZGFydmlsbGUrQ3Vyc2l2ZSZkaXNwbGF5PXN3YXBcXFwiKTtcXHJcXG5cXHJcXG4ucmVhY3QtZGF0ZXBpY2tlcl9faW5wdXQtY29udGFpbmVyIHtcXHJcXG4gIHBvc2l0aW9uOiBpbml0aWFsICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi53aWRnZXRzIHtcXHJcXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICAvKiBEaXNhYmxlIHRleHQgc2VsZWN0aW9uIGluIFdlYktpdCBicm93c2VycyAqL1xcclxcbiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4ucmFkaW9CdXR0b24ge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBoZWlnaHQ6IDEwMCU7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBsZWZ0OiAwcHg7XFxyXFxuICB0b3A6IDBweDtcXHJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICMwMDdiZmY7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1MHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uc2lnbmF0dXJlQ2FudmFzIHtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4ODg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxyXFxuICB3aWR0aDogNDYwcHg7XFxyXFxuICBoZWlnaHQ6IDE4NHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uaW50aWFsU2lnbmF0dXJlQ2FudmFzIHtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4ODg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxyXFxuICB3aWR0aDogMTUwcHg7XFxyXFxuICBoZWlnaHQ6IDE1MHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uaW50aWFsU2lnbmF0dXJlIHtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkICM4ODg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxyXFxuICB3aWR0aDogMTgzcHg7XFxyXFxuICBoZWlnaHQ6IDE4M3B4O1xcclxcbn1cXHJcXG5cXHJcXG4ucGVuQ29udGFpbmVyRGVmYXVsdCB7XFxyXFxuICB3aWR0aDogNDYwcHg7XFxyXFxufVxcclxcblxcclxcbi5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGZvbnQtc2l6ZTogMTRweDtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLlNjcm9sbGJhcnNDdXN0b20tVHJhY2tZIHtcXHJcXG4gIHdpZHRoOiA0cHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuLlNjcm9sbGJhcnNDdXN0b20tVHJhY2tYIHtcXHJcXG4gIGhlaWdodDogNHB4ICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5zaWduWW91cnNlbGZCbG9jayB7XFxyXFxuICBwYWRkaW5nOiAwcHg7XFxyXFxuICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uc2VuZE1haWwge1xcclxcbiAgYm94LXNoYWRvdzpcXHJcXG4gICAgMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xKSxcXHJcXG4gICAgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7XFxyXFxuICBwYWRkaW5nOiAzcHggMzBweDtcXHJcXG4gIGNvbG9yOiB3aGl0ZTtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcXHJcXG4gIGZvbnQtc2l6ZTogMTRweCAhaW1wb3J0YW50O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxyXFxufVxcclxcblxcclxcbi51c2VyIHtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG59XFxyXFxuLmRpc2FibGVkIHtcXHJcXG4gIG9wYWNpdHk6IDAuNTtcXHJcXG4gIC8qIEV4YW1wbGU6IHJlZHVjZSBvcGFjaXR5IHRvIHZpc3VhbGx5IGluZGljYXRlIGRpc2FibGVkIHN0YXRlICovXFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG4gIC8qIFByZXZlbnRzIG1vdXNlIGNsaWNrcyBhbmQgb3RoZXIgZXZlbnRzICovXFxyXFxuICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiAjODg4OyAqL1xcclxcbn1cXHJcXG5cXHJcXG4uc2lnblRhYiB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXIgIWltcG9ydGFudDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA0MDAgIWltcG9ydGFudDtcXHJcXG4gIG1hcmdpbjogN3B4ICFpbXBvcnRhbnQ7XFxyXFxuICBmb250LXNpemU6IDE1cHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLnNpZ25lckNvbXBvbmVudCB7XFxyXFxuICAvKiBib3gtc2hhZG93OiByZ2JhKDE3LCAxMiwgNDYsIDAuMTUpIDBweCA0OHB4IDEwMHB4IDBweDsgKi9cXHJcXG4gIC8qIHdpZHRoOiAxODBweDsgKi9cXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4udXBsb2FkSW1nTG9nbyB7XFxyXFxuICBmb250LXNpemU6IDUwcHg7XFxyXFxufVxcclxcblxcclxcbi5Ecm9wZG93bk1lbnVDb250ZW50LFxcclxcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50IHtcXHJcXG4gIG1pbi13aWR0aDogMTMwcHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE1KTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDAuMjVyZW07XFxyXFxuICBwYWRkaW5nOiA1cHg7XFxyXFxuICBhbmltYXRpb24tZHVyYXRpb246IDQwMG1zO1xcclxcbiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSk7XFxyXFxuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtLCBvcGFjaXR5O1xcclxcbiAgei1pbmRleDogMzAgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLkRyb3Bkb3duTWVudUNvbnRlbnRbZGF0YS1zaWRlPVxcXCJ0b3BcXFwiXSxcXHJcXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XFxcInRvcFxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZURvd25BbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XFxcInJpZ2h0XFxcIl0sXFxyXFxuLkRyb3Bkb3duTWVudVN1YkNvbnRlbnRbZGF0YS1zaWRlPVxcXCJyaWdodFxcXCJdIHtcXHJcXG4gIGFuaW1hdGlvbi1uYW1lOiBzbGlkZUxlZnRBbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XFxcImJvdHRvbVxcXCJdLFxcclxcbi5Ecm9wZG93bk1lbnVTdWJDb250ZW50W2RhdGEtc2lkZT1cXFwiYm90dG9tXFxcIl0ge1xcclxcbiAgYW5pbWF0aW9uLW5hbWU6IHNsaWRlVXBBbmRGYWRlO1xcclxcbn1cXHJcXG5cXHJcXG4uRHJvcGRvd25NZW51Q29udGVudFtkYXRhLXNpZGU9XFxcImxlZnRcXFwiXSxcXHJcXG4uRHJvcGRvd25NZW51U3ViQ29udGVudFtkYXRhLXNpZGU9XFxcImxlZnRcXFwiXSB7XFxyXFxuICBhbmltYXRpb24tbmFtZTogc2xpZGVSaWdodEFuZEZhZGU7XFxyXFxufVxcclxcblxcclxcbi5Ecm9wZG93bk1lbnVJdGVtIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTNweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcclxcbiAgY29sb3I6IGJsYWNrO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgaGVpZ2h0OiAyNXB4O1xcclxcbiAgcGFkZGluZzogMCA1cHg7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RUcmlnZ2VyIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgcGFkZGluZzogMCA3MHB4O1xcclxcbiAgZm9udC1zaXplOiAxM3B4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDE7XFxyXFxuICBoZWlnaHQ6IDM1cHg7XFxyXFxuICBnYXA6IDVweDtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICM4ODdhYmY7XFxyXFxuICB3aWR0aDogMTAwcHg7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxufVxcclxcblxcclxcbi5zZWxlY3RFbWFpbCB7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBwYWRkaW5nOiAwIDE1cHg7XFxyXFxuICBmb250LXNpemU6IDEzcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMTtcXHJcXG4gIGhlaWdodDogMzVweDtcXHJcXG4gIGdhcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzg4N2FiZjtcXHJcXG4gIHdpZHRoOiAyMDBweDtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG59XFxyXFxuXFxyXFxub3B0aW9uIHtcXHJcXG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdFRyaWdnZXI6aG92ZXIge1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLnNlbGVjdEVtYWlsOmhvdmVyIHtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RUcmlnZ2VyOmZvY3VzIHtcXHJcXG4gIC8qIGJveC1zaGFkb3c6IDAgMCAwIDJweCBibGFjazsgKi9cXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5zZWxlY3RFbWFpbDpmb2N1cyB7XFxyXFxuICAvKiBib3gtc2hhZG93OiAwIDAgMCAycHggYmxhY2s7ICovXFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0VHJpZ2dlcltkYXRhLXBsYWNlaG9sZGVyXSB7XFxyXFxuICBjb2xvcjogYmxhY2s7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RJY29uIHtcXHJcXG4gIGNvbG9yOiBWYXIoLS12aW9sZXQtMTEpO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0Q29udGVudCB7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBib3JkZXItcmFkaXVzOiA2cHg7XFxyXFxuICBib3gtc2hhZG93OlxcclxcbiAgICAwcHggMTBweCAzOHB4IC0xMHB4IHJnYmEoMjIsIDIzLCAyNCwgMC4zNSksXFxyXFxuICAgIDBweCAxMHB4IDIwcHggLTE1cHggcmdiYSgyMiwgMjMsIDI0LCAwLjIpO1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0Vmlld3BvcnQge1xcclxcbiAgcGFkZGluZzogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0SXRlbSB7XFxyXFxuICBmb250LXNpemU6IDEzcHg7XFxyXFxuICBsaW5lLWhlaWdodDogMTtcXHJcXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMTEpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBoZWlnaHQ6IDI1cHg7XFxyXFxuICBwYWRkaW5nOiAwIDM1cHggMCAyNXB4O1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICB6LWluZGV4OiAxMCAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uU2VsZWN0SXRlbVtkYXRhLWRpc2FibGVkXSB7XFxyXFxuICBjb2xvcjogdmFyKC0tbWF1dmUtOCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdEl0ZW1bZGF0YS1oaWdobGlnaHRlZF0ge1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXZpb2xldC05KTtcXHJcXG4gIGNvbG9yOiB2YXIoLS12aW9sZXQtMSk7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RMYWJlbCB7XFxyXFxuICBwYWRkaW5nOiAwIDI1cHg7XFxyXFxuICBmb250LXNpemU6IDEycHg7XFxyXFxuICBsaW5lLWhlaWdodDogMjVweDtcXHJcXG4gIGNvbG9yOiB2YXIoLS1tYXV2ZS0xMSk7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RTZXBhcmF0b3Ige1xcclxcbiAgaGVpZ2h0OiAxcHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS12aW9sZXQtNik7XFxyXFxuICBtYXJnaW46IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuLlNlbGVjdEl0ZW1JbmRpY2F0b3Ige1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIHdpZHRoOiAyNXB4O1xcclxcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5TZWxlY3RTY3JvbGxCdXR0b24ge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGhlaWdodDogMjVweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgY29sb3I6IHZhcigtLXZpb2xldC0xMSk7XFxyXFxuICBjdXJzb3I6IGRlZmF1bHQ7XFxyXFxufVxcclxcblxcclxcbi5kcm9wRG93blN0eWxlIHtcXHJcXG4gIHdpZHRoOiBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG4uYXV0b1NpZ25TY3JvbGwge1xcclxcbiAgb3ZlcmZsb3cteTogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmF1dG9TaWduU2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciB7XFxyXFxuICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4udmFsaWRhdGVJbnB1dFRleHQge1xcclxcbiAgd2lkdGg6IDc2JTtcXHJcXG59XFxyXFxuXFxyXFxuLnJhZGlvR3JvdXBJbnB1dCB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuLnJhZGlvR3JvdXAge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2NnB4KSB7XFxyXFxuICAudmFsaWRhdGVJbnB1dFRleHQge1xcclxcbiAgICB3aWR0aDogOTMlO1xcclxcbiAgfVxcclxcblxcclxcbiAgLmRyb3Bkb3duLW1lbnUge1xcclxcbiAgICBtaW4td2lkdGg6IDByZW0gIWltcG9ydGFudDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gICNuYXZiYXIge1xcclxcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgICB6LWluZGV4OiA0OTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC8qIE5hdmJhciBsaW5rcyAqL1xcclxcbiAgI25hdmJhciBhIHtcXHJcXG4gICAgZmxvYXQ6IGxlZnQ7XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgICBjb2xvcjogI2YyZjJmMjtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICBwYWRkaW5nOiAxNHB4O1xcclxcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAjbmF2YmFyIGEuYWN0aXZlIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzRjYWY1MDtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbiAgfVxcclxcblxcclxcbiAgLyogUGFnZSBjb250ZW50ICovXFxyXFxuICAuY29udGVudCB7XFxyXFxuICAgIHBhZGRpbmc6IDE2cHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAvKiBUaGUgc3RpY2t5IGNsYXNzIGlzIGFkZGVkIHRvIHRoZSBuYXZiYXJcXHJcXG4gIHdpdGggSlMgd2hlbiBpdCByZWFjaGVzIGl0cyBzY3JvbGwgcG9zaXRpb24gKi9cXHJcXG4gIC5zdGlja3lIZWFkIHtcXHJcXG4gICAgdG9wOiA1MHB4O1xcclxcbiAgICBsZWZ0OiAwLjlyZW07XFxyXFxuICB9XFxyXFxuXFxyXFxuICAuc3RpY2t5U2lnbmVySGVhZCB7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC8qIEFkZCBzb21lIHRvcCBwYWRkaW5nIHRvIHRoZSBwYWdlIGNvbnRlbnRcXHJcXG4gIHRvIHByZXZlbnQgc3VkZGVuIHF1aWNrIG1vdmVtZW50IChhcyB0aGVcXHJcXG4gIG5hdmlnYXRpb24gYmFyIGdldHMgYSBuZXcgcG9zaXRpb24gYXQgdGhlIHRvcCBvZiB0aGVcXHJcXG4gIHBhZ2UgKHBvc2l0aW9uOmZpeGVkIGFuZCB0b3A6MCkgKi9cXHJcXG4gIC5zdGlja3lIZWFkICsgLmNvbnRlbnQge1xcclxcbiAgICBwYWRkaW5nLXRvcDogNjBweDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDg3cHgpIGFuZCAobWluLXdpZHRoOiAzNTFweCkge1xcclxcbiAgLnNpZ25hdHVyZUNhbnZhcyB7XFxyXFxuICAgIHdpZHRoOiAzMDBweDtcXHJcXG4gICAgaGVpZ2h0OiAxMjBweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcXHJcXG4gICAgd2lkdGg6IDMwMHB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnVwbG9hZEltZ0xvZ28ge1xcclxcbiAgICBmb250LXNpemU6IDMwcHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAuc2lnblRhYiB7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiA1MDAgIWltcG9ydGFudDtcXHJcXG4gICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbi5zY3JvbGwtaGlkZTo6LXdlYmtpdC1zY3JvbGxiYXIge1xcclxcbiAgZGlzcGxheTogbm9uZTtcXHJcXG59XFxyXFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMzUwcHgpIGFuZCAobWluLXdpZHRoOiAzMTFweCkge1xcclxcbiAgLnNpZ25hdHVyZUNhbnZhcyB7XFxyXFxuICAgIHdpZHRoOiAyODBweDtcXHJcXG4gICAgaGVpZ2h0OiAxMTJweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5wZW5Db250YWluZXJEZWZhdWx0IHtcXHJcXG4gICAgd2lkdGg6IDI4MHB4O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnNpZ25UYWIge1xcclxcbiAgICBmb250LXdlaWdodDogNTAwICFpbXBvcnRhbnQ7XFxyXFxuXFxyXFxuICAgIGZvbnQtc2l6ZTogMTBweCAhaW1wb3J0YW50O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnVwbG9hZEltZ0xvZ28ge1xcclxcbiAgICBmb250LXNpemU6IDI1cHg7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDMxMHB4KSB7XFxyXFxuICAuc2lnbmF0dXJlQ2FudmFzIHtcXHJcXG4gICAgd2lkdGg6IDIzMHB4O1xcclxcbiAgICBoZWlnaHQ6IDkycHg7XFxyXFxuICB9XFxyXFxuXFxyXFxuICAucGVuQ29udGFpbmVyRGVmYXVsdCB7XFxyXFxuICAgIHdpZHRoOiAyMzBweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5zaWduVGFiIHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IDUwMCAhaW1wb3J0YW50O1xcclxcbiAgICBmb250LXNpemU6IDhweCAhaW1wb3J0YW50O1xcclxcbiAgfVxcclxcblxcclxcbiAgLnVwbG9hZEltZ0xvZ28ge1xcclxcbiAgICBmb250LXNpemU6IDIwcHg7XFxyXFxuICB9XFxyXFxufVxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICB1cmwgPSBTdHJpbmcodXJsLl9fZXNNb2R1bGUgPyB1cmwuZGVmYXVsdCA6IHVybCk7XG5cbiAgLy8gSWYgdXJsIGlzIGFscmVhZHkgd3JhcHBlZCBpbiBxdW90ZXMsIHJlbW92ZSB0aGVtXG4gIGlmICgvXlsnXCJdLipbJ1wiXSQvLnRlc3QodXJsKSkge1xuICAgIHVybCA9IHVybC5zbGljZSgxLCAtMSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuaGFzaCkge1xuICAgIHVybCArPSBvcHRpb25zLmhhc2g7XG4gIH1cblxuICAvLyBTaG91bGQgdXJsIGJlIHdyYXBwZWQ/XG4gIC8vIFNlZSBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXZhbHVlcy0zLyN1cmxzXG4gIGlmICgvW1wiJygpIFxcdFxcbl18KCUyMCkvLnRlc3QodXJsKSB8fCBvcHRpb25zLm5lZWRRdW90ZXMpIHtcbiAgICByZXR1cm4gXCJcXFwiXCIuY29uY2F0KHVybC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIiksIFwiXFxcIlwiKTtcbiAgfVxuICByZXR1cm4gdXJsO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDInO1xuXG4vKipcbiAqIEFkYXB0ZWQgZnJvbSBSZWFjdDogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3NoYXJlZC9mb3JtYXRQcm9kRXJyb3JNZXNzYWdlLmpzXG4gKlxuICogRG8gbm90IHJlcXVpcmUgdGhpcyBtb2R1bGUgZGlyZWN0bHkhIFVzZSBub3JtYWwgdGhyb3cgZXJyb3IgY2FsbHMuIFRoZXNlIG1lc3NhZ2VzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBlcnJvciBjb2Rlc1xuICogZHVyaW5nIGJ1aWxkLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvZGVcbiAqL1xuZnVuY3Rpb24gZm9ybWF0UHJvZEVycm9yTWVzc2FnZShjb2RlKSB7XG4gIHJldHVybiBcIk1pbmlmaWVkIFJlZHV4IGVycm9yICNcIiArIGNvZGUgKyBcIjsgdmlzaXQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvRXJyb3JzP2NvZGU9XCIgKyBjb2RlICsgXCIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgXCIgKyAndXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycy4gJztcbn1cblxuLy8gSW5saW5lZCB2ZXJzaW9uIG9mIHRoZSBgc3ltYm9sLW9ic2VydmFibGVgIHBvbHlmaWxsXG52YXIgJCRvYnNlcnZhYmxlID0gKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgJ0BAb2JzZXJ2YWJsZSc7XG59KSgpO1xuXG4vKipcbiAqIFRoZXNlIGFyZSBwcml2YXRlIGFjdGlvbiB0eXBlcyByZXNlcnZlZCBieSBSZWR1eC5cbiAqIEZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB5b3UgbXVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuXG4gKiBJZiB0aGUgY3VycmVudCBzdGF0ZSBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAqIERvIG5vdCByZWZlcmVuY2UgdGhlc2UgYWN0aW9uIHR5cGVzIGRpcmVjdGx5IGluIHlvdXIgY29kZS5cbiAqL1xudmFyIHJhbmRvbVN0cmluZyA9IGZ1bmN0aW9uIHJhbmRvbVN0cmluZygpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KS5zcGxpdCgnJykuam9pbignLicpO1xufTtcblxudmFyIEFjdGlvblR5cGVzID0ge1xuICBJTklUOiBcIkBAcmVkdXgvSU5JVFwiICsgcmFuZG9tU3RyaW5nKCksXG4gIFJFUExBQ0U6IFwiQEByZWR1eC9SRVBMQUNFXCIgKyByYW5kb21TdHJpbmcoKSxcbiAgUFJPQkVfVU5LTk9XTl9BQ1RJT046IGZ1bmN0aW9uIFBST0JFX1VOS05PV05fQUNUSU9OKCkge1xuICAgIHJldHVybiBcIkBAcmVkdXgvUFJPQkVfVU5LTk9XTl9BQ1RJT05cIiArIHJhbmRvbVN0cmluZygpO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFyZ3VtZW50IGFwcGVhcnMgdG8gYmUgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgdmFyIHByb3RvID0gb2JqO1xuXG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90bztcbn1cblxuLy8gSW5saW5lZCAvIHNob3J0ZW5lZCB2ZXJzaW9uIG9mIGBraW5kT2ZgIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQva2luZC1vZlxuZnVuY3Rpb24gbWluaUtpbmRPZih2YWwpIHtcbiAgaWYgKHZhbCA9PT0gdm9pZCAwKSByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gIGlmICh2YWwgPT09IG51bGwpIHJldHVybiAnbnVsbCc7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuICdhcnJheSc7XG4gIGlmIChpc0RhdGUodmFsKSkgcmV0dXJuICdkYXRlJztcbiAgaWYgKGlzRXJyb3IodmFsKSkgcmV0dXJuICdlcnJvcic7XG4gIHZhciBjb25zdHJ1Y3Rvck5hbWUgPSBjdG9yTmFtZSh2YWwpO1xuXG4gIHN3aXRjaCAoY29uc3RydWN0b3JOYW1lKSB7XG4gICAgY2FzZSAnU3ltYm9sJzpcbiAgICBjYXNlICdQcm9taXNlJzpcbiAgICBjYXNlICdXZWFrTWFwJzpcbiAgICBjYXNlICdXZWFrU2V0JzpcbiAgICBjYXNlICdNYXAnOlxuICAgIGNhc2UgJ1NldCc6XG4gICAgICByZXR1cm4gY29uc3RydWN0b3JOYW1lO1xuICB9IC8vIG90aGVyXG5cblxuICByZXR1cm4gdHlwZS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgJycpO1xufVxuXG5mdW5jdGlvbiBjdG9yTmFtZSh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgPyB2YWwuY29uc3RydWN0b3IubmFtZSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzRXJyb3IodmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgdmFsLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIHZhbC5jb25zdHJ1Y3RvciAmJiB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yLnN0YWNrVHJhY2VMaW1pdCA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB0cnVlO1xuICByZXR1cm4gdHlwZW9mIHZhbC50b0RhdGVTdHJpbmcgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbC5nZXREYXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWwuc2V0RGF0ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24ga2luZE9mKHZhbCkge1xuICB2YXIgdHlwZU9mVmFsID0gdHlwZW9mIHZhbDtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHR5cGVPZlZhbCA9IG1pbmlLaW5kT2YodmFsKTtcbiAgfVxuXG4gIHJldHVybiB0eXBlT2ZWYWw7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqXG4gKiAqKldlIHJlY29tbWVuZCB1c2luZyB0aGUgYGNvbmZpZ3VyZVN0b3JlYCBtZXRob2RcbiAqIG9mIHRoZSBgQHJlZHV4anMvdG9vbGtpdGAgcGFja2FnZSoqLCB3aGljaCByZXBsYWNlcyBgY3JlYXRlU3RvcmVgLlxuICpcbiAqIFJlZHV4IFRvb2xraXQgaXMgb3VyIHJlY29tbWVuZGVkIGFwcHJvYWNoIGZvciB3cml0aW5nIFJlZHV4IGxvZ2ljIHRvZGF5LFxuICogaW5jbHVkaW5nIHN0b3JlIHNldHVwLCByZWR1Y2VycywgZGF0YSBmZXRjaGluZywgYW5kIG1vcmUuXG4gKlxuICogKipGb3IgbW9yZSBkZXRhaWxzLCBwbGVhc2UgcmVhZCB0aGlzIFJlZHV4IGRvY3MgcGFnZToqKlxuICogKipodHRwczovL3JlZHV4LmpzLm9yZy9pbnRyb2R1Y3Rpb24vd2h5LXJ0ay1pcy1yZWR1eC10b2RheSoqXG4gKlxuICogYGNvbmZpZ3VyZVN0b3JlYCBmcm9tIFJlZHV4IFRvb2xraXQgaXMgYW4gaW1wcm92ZWQgdmVyc2lvbiBvZiBgY3JlYXRlU3RvcmVgIHRoYXRcbiAqIHNpbXBsaWZpZXMgc2V0dXAgYW5kIGhlbHBzIGF2b2lkIGNvbW1vbiBidWdzLlxuICpcbiAqIFlvdSBzaG91bGQgbm90IGJlIHVzaW5nIHRoZSBgcmVkdXhgIGNvcmUgcGFja2FnZSBieSBpdHNlbGYgdG9kYXksIGV4Y2VwdCBmb3IgbGVhcm5pbmcgcHVycG9zZXMuXG4gKiBUaGUgYGNyZWF0ZVN0b3JlYCBtZXRob2QgZnJvbSB0aGUgY29yZSBgcmVkdXhgIHBhY2thZ2Ugd2lsbCBub3QgYmUgcmVtb3ZlZCwgYnV0IHdlIGVuY291cmFnZVxuICogYWxsIHVzZXJzIHRvIG1pZ3JhdGUgdG8gdXNpbmcgUmVkdXggVG9vbGtpdCBmb3IgYWxsIFJlZHV4IGNvZGUuXG4gKlxuICogSWYgeW91IHdhbnQgdG8gdXNlIGBjcmVhdGVTdG9yZWAgd2l0aG91dCB0aGlzIHZpc3VhbCBkZXByZWNhdGlvbiB3YXJuaW5nLCB1c2VcbiAqIHRoZSBgbGVnYWN5X2NyZWF0ZVN0b3JlYCBpbXBvcnQgaW5zdGVhZDpcbiAqXG4gKiBgaW1wb3J0IHsgbGVnYWN5X2NyZWF0ZVN0b3JlIGFzIGNyZWF0ZVN0b3JlfSBmcm9tICdyZWR1eCdgXG4gKlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICB2YXIgX3JlZjI7XG5cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZW5oYW5jZXIgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGVuaGFuY2VyID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgwKSA6ICdJdCBsb29rcyBsaWtlIHlvdSBhcmUgcGFzc2luZyBzZXZlcmFsIHN0b3JlIGVuaGFuY2VycyB0byAnICsgJ2NyZWF0ZVN0b3JlKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCwgY29tcG9zZSB0aGVtICcgKyAndG9nZXRoZXIgdG8gYSBzaW5nbGUgZnVuY3Rpb24uIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy90dXRvcmlhbHMvZnVuZGFtZW50YWxzL3BhcnQtNC1zdG9yZSNjcmVhdGluZy1hLXN0b3JlLXdpdGgtZW5oYW5jZXJzIGZvciBhbiBleGFtcGxlLicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZW5oYW5jZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZW5oYW5jZXIgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgICBwcmVsb2FkZWRTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMSkgOiBcIkV4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKGVuaGFuY2VyKSArIFwiJ1wiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5oYW5jZXIoY3JlYXRlU3RvcmUpKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVkdWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIpIDogXCJFeHBlY3RlZCB0aGUgcm9vdCByZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2YocmVkdWNlcikgKyBcIidcIik7XG4gIH1cblxuICB2YXIgY3VycmVudFJlZHVjZXIgPSByZWR1Y2VyO1xuICB2YXIgY3VycmVudFN0YXRlID0gcHJlbG9hZGVkU3RhdGU7XG4gIHZhciBjdXJyZW50TGlzdGVuZXJzID0gW107XG4gIHZhciBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycztcbiAgdmFyIGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRoaXMgbWFrZXMgYSBzaGFsbG93IGNvcHkgb2YgY3VycmVudExpc3RlbmVycyBzbyB3ZSBjYW4gdXNlXG4gICAqIG5leHRMaXN0ZW5lcnMgYXMgYSB0ZW1wb3JhcnkgbGlzdCB3aGlsZSBkaXNwYXRjaGluZy5cbiAgICpcbiAgICogVGhpcyBwcmV2ZW50cyBhbnkgYnVncyBhcm91bmQgY29uc3VtZXJzIGNhbGxpbmdcbiAgICogc3Vic2NyaWJlL3Vuc3Vic2NyaWJlIGluIHRoZSBtaWRkbGUgb2YgYSBkaXNwYXRjaC5cbiAgICovXG5cbiAgZnVuY3Rpb24gZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpIHtcbiAgICBpZiAobmV4dExpc3RlbmVycyA9PT0gY3VycmVudExpc3RlbmVycykge1xuICAgICAgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBzdGF0ZSB0cmVlIG1hbmFnZWQgYnkgdGhlIHN0b3JlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7YW55fSBUaGUgY3VycmVudCBzdGF0ZSB0cmVlIG9mIHlvdXIgYXBwbGljYXRpb24uXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMpIDogJ1lvdSBtYXkgbm90IGNhbGwgc3RvcmUuZ2V0U3RhdGUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnVGhlIHJlZHVjZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHN0YXRlIGFzIGFuIGFyZ3VtZW50LiAnICsgJ1Bhc3MgaXQgZG93biBmcm9tIHRoZSB0b3AgcmVkdWNlciBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQgZnJvbSB0aGUgc3RvcmUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGNoYW5nZSBsaXN0ZW5lci4gSXQgd2lsbCBiZSBjYWxsZWQgYW55IHRpbWUgYW4gYWN0aW9uIGlzIGRpc3BhdGNoZWQsXG4gICAqIGFuZCBzb21lIHBhcnQgb2YgdGhlIHN0YXRlIHRyZWUgbWF5IHBvdGVudGlhbGx5IGhhdmUgY2hhbmdlZC4gWW91IG1heSB0aGVuXG4gICAqIGNhbGwgYGdldFN0YXRlKClgIHRvIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBZb3UgbWF5IGNhbGwgYGRpc3BhdGNoKClgIGZyb20gYSBjaGFuZ2UgbGlzdGVuZXIsIHdpdGggdGhlIGZvbGxvd2luZ1xuICAgKiBjYXZlYXRzOlxuICAgKlxuICAgKiAxLiBUaGUgc3Vic2NyaXB0aW9ucyBhcmUgc25hcHNob3R0ZWQganVzdCBiZWZvcmUgZXZlcnkgYGRpc3BhdGNoKClgIGNhbGwuXG4gICAqIElmIHlvdSBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgd2hpbGUgdGhlIGxpc3RlbmVycyBhcmUgYmVpbmcgaW52b2tlZCwgdGhpc1xuICAgKiB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3Qgb24gdGhlIGBkaXNwYXRjaCgpYCB0aGF0IGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcy5cbiAgICogSG93ZXZlciwgdGhlIG5leHQgYGRpc3BhdGNoKClgIGNhbGwsIHdoZXRoZXIgbmVzdGVkIG9yIG5vdCwgd2lsbCB1c2UgYSBtb3JlXG4gICAqIHJlY2VudCBzbmFwc2hvdCBvZiB0aGUgc3Vic2NyaXB0aW9uIGxpc3QuXG4gICAqXG4gICAqIDIuIFRoZSBsaXN0ZW5lciBzaG91bGQgbm90IGV4cGVjdCB0byBzZWUgYWxsIHN0YXRlIGNoYW5nZXMsIGFzIHRoZSBzdGF0ZVxuICAgKiBtaWdodCBoYXZlIGJlZW4gdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYSBuZXN0ZWQgYGRpc3BhdGNoKClgIGJlZm9yZVxuICAgKiB0aGUgbGlzdGVuZXIgaXMgY2FsbGVkLiBJdCBpcywgaG93ZXZlciwgZ3VhcmFudGVlZCB0aGF0IGFsbCBzdWJzY3JpYmVyc1xuICAgKiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgYGRpc3BhdGNoKClgIHN0YXJ0ZWQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgbGF0ZXN0XG4gICAqIHN0YXRlIGJ5IHRoZSB0aW1lIGl0IGV4aXRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBBIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgb24gZXZlcnkgZGlzcGF0Y2guXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0byByZW1vdmUgdGhpcyBjaGFuZ2UgbGlzdGVuZXIuXG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNCkgOiBcIkV4cGVjdGVkIHRoZSBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJ1wiICsga2luZE9mKGxpc3RlbmVyKSArIFwiJ1wiKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNSkgOiAnWW91IG1heSBub3QgY2FsbCBzdG9yZS5zdWJzY3JpYmUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnSWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgbm90aWZpZWQgYWZ0ZXIgdGhlIHN0b3JlIGhhcyBiZWVuIHVwZGF0ZWQsIHN1YnNjcmliZSBmcm9tIGEgJyArICdjb21wb25lbnQgYW5kIGludm9rZSBzdG9yZS5nZXRTdGF0ZSgpIGluIHRoZSBjYWxsYmFjayB0byBhY2Nlc3MgdGhlIGxhdGVzdCBzdGF0ZS4gJyArICdTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpL3N0b3JlI3N1YnNjcmliZWxpc3RlbmVyIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgfVxuXG4gICAgdmFyIGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgIG5leHRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKCFpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg2KSA6ICdZb3UgbWF5IG5vdCB1bnN1YnNjcmliZSBmcm9tIGEgc3RvcmUgbGlzdGVuZXIgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICAgIH1cblxuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgICB2YXIgaW5kZXggPSBuZXh0TGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgbmV4dExpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgY3VycmVudExpc3RlbmVycyA9IG51bGw7XG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24uIEl0IGlzIHRoZSBvbmx5IHdheSB0byB0cmlnZ2VyIGEgc3RhdGUgY2hhbmdlLlxuICAgKlxuICAgKiBUaGUgYHJlZHVjZXJgIGZ1bmN0aW9uLCB1c2VkIHRvIGNyZWF0ZSB0aGUgc3RvcmUsIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlXG4gICAqIGN1cnJlbnQgc3RhdGUgdHJlZSBhbmQgdGhlIGdpdmVuIGBhY3Rpb25gLiBJdHMgcmV0dXJuIHZhbHVlIHdpbGxcbiAgICogYmUgY29uc2lkZXJlZCB0aGUgKipuZXh0Kiogc3RhdGUgb2YgdGhlIHRyZWUsIGFuZCB0aGUgY2hhbmdlIGxpc3RlbmVyc1xuICAgKiB3aWxsIGJlIG5vdGlmaWVkLlxuICAgKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHBsYWluIG9iamVjdCBhY3Rpb25zLiBJZiB5b3Ugd2FudCB0b1xuICAgKiBkaXNwYXRjaCBhIFByb21pc2UsIGFuIE9ic2VydmFibGUsIGEgdGh1bmssIG9yIHNvbWV0aGluZyBlbHNlLCB5b3UgbmVlZCB0b1xuICAgKiB3cmFwIHlvdXIgc3RvcmUgY3JlYXRpbmcgZnVuY3Rpb24gaW50byB0aGUgY29ycmVzcG9uZGluZyBtaWRkbGV3YXJlLiBGb3JcbiAgICogZXhhbXBsZSwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYHJlZHV4LXRodW5rYCBwYWNrYWdlLiBFdmVuIHRoZVxuICAgKiBtaWRkbGV3YXJlIHdpbGwgZXZlbnR1YWxseSBkaXNwYXRjaCBwbGFpbiBvYmplY3QgYWN0aW9ucyB1c2luZyB0aGlzIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbiBBIHBsYWluIG9iamVjdCByZXByZXNlbnRpbmcg4oCcd2hhdCBjaGFuZ2Vk4oCdLiBJdCBpc1xuICAgKiBhIGdvb2QgaWRlYSB0byBrZWVwIGFjdGlvbnMgc2VyaWFsaXphYmxlIHNvIHlvdSBjYW4gcmVjb3JkIGFuZCByZXBsYXkgdXNlclxuICAgKiBzZXNzaW9ucywgb3IgdXNlIHRoZSB0aW1lIHRyYXZlbGxpbmcgYHJlZHV4LWRldnRvb2xzYC4gQW4gYWN0aW9uIG11c3QgaGF2ZVxuICAgKiBhIGB0eXBlYCBwcm9wZXJ0eSB3aGljaCBtYXkgbm90IGJlIGB1bmRlZmluZWRgLiBJdCBpcyBhIGdvb2QgaWRlYSB0byB1c2VcbiAgICogc3RyaW5nIGNvbnN0YW50cyBmb3IgYWN0aW9uIHR5cGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBGb3IgY29udmVuaWVuY2UsIHRoZSBzYW1lIGFjdGlvbiBvYmplY3QgeW91IGRpc3BhdGNoZWQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCwgaWYgeW91IHVzZSBhIGN1c3RvbSBtaWRkbGV3YXJlLCBpdCBtYXkgd3JhcCBgZGlzcGF0Y2goKWAgdG9cbiAgICogcmV0dXJuIHNvbWV0aGluZyBlbHNlIChmb3IgZXhhbXBsZSwgYSBQcm9taXNlIHlvdSBjYW4gYXdhaXQpLlxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIGRpc3BhdGNoKGFjdGlvbikge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg3KSA6IFwiQWN0aW9ucyBtdXN0IGJlIHBsYWluIG9iamVjdHMuIEluc3RlYWQsIHRoZSBhY3R1YWwgdHlwZSB3YXM6ICdcIiArIGtpbmRPZihhY3Rpb24pICsgXCInLiBZb3UgbWF5IG5lZWQgdG8gYWRkIG1pZGRsZXdhcmUgdG8geW91ciBzdG9yZSBzZXR1cCB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgb3RoZXIgdmFsdWVzLCBzdWNoIGFzICdyZWR1eC10aHVuaycgdG8gaGFuZGxlIGRpc3BhdGNoaW5nIGZ1bmN0aW9ucy4gU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC00LXN0b3JlI21pZGRsZXdhcmUgYW5kIGh0dHBzOi8vcmVkdXguanMub3JnL3R1dG9yaWFscy9mdW5kYW1lbnRhbHMvcGFydC02LWFzeW5jLWxvZ2ljI3VzaW5nLXRoZS1yZWR1eC10aHVuay1taWRkbGV3YXJlIGZvciBleGFtcGxlcy5cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDgpIDogJ0FjdGlvbnMgbWF5IG5vdCBoYXZlIGFuIHVuZGVmaW5lZCBcInR5cGVcIiBwcm9wZXJ0eS4gWW91IG1heSBoYXZlIG1pc3NwZWxsZWQgYW4gYWN0aW9uIHR5cGUgc3RyaW5nIGNvbnN0YW50LicpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg5KSA6ICdSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMgPSBuZXh0TGlzdGVuZXJzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIHJlZHVjZXIgY3VycmVudGx5IHVzZWQgYnkgdGhlIHN0b3JlIHRvIGNhbGN1bGF0ZSB0aGUgc3RhdGUuXG4gICAqXG4gICAqIFlvdSBtaWdodCBuZWVkIHRoaXMgaWYgeW91ciBhcHAgaW1wbGVtZW50cyBjb2RlIHNwbGl0dGluZyBhbmQgeW91IHdhbnQgdG9cbiAgICogbG9hZCBzb21lIG9mIHRoZSByZWR1Y2VycyBkeW5hbWljYWxseS4gWW91IG1pZ2h0IGFsc28gbmVlZCB0aGlzIGlmIHlvdVxuICAgKiBpbXBsZW1lbnQgYSBob3QgcmVsb2FkaW5nIG1lY2hhbmlzbSBmb3IgUmVkdXguXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHRSZWR1Y2VyIFRoZSByZWR1Y2VyIGZvciB0aGUgc3RvcmUgdG8gdXNlIGluc3RlYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHJlcGxhY2VSZWR1Y2VyKG5leHRSZWR1Y2VyKSB7XG4gICAgaWYgKHR5cGVvZiBuZXh0UmVkdWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTApIDogXCJFeHBlY3RlZCB0aGUgbmV4dFJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCwgcmVjZWl2ZWQ6ICdcIiArIGtpbmRPZihuZXh0UmVkdWNlcikpO1xuICAgIH1cblxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7IC8vIFRoaXMgYWN0aW9uIGhhcyBhIHNpbWlsaWFyIGVmZmVjdCB0byBBY3Rpb25UeXBlcy5JTklULlxuICAgIC8vIEFueSByZWR1Y2VycyB0aGF0IGV4aXN0ZWQgaW4gYm90aCB0aGUgbmV3IGFuZCBvbGQgcm9vdFJlZHVjZXJcbiAgICAvLyB3aWxsIHJlY2VpdmUgdGhlIHByZXZpb3VzIHN0YXRlLiBUaGlzIGVmZmVjdGl2ZWx5IHBvcHVsYXRlc1xuICAgIC8vIHRoZSBuZXcgc3RhdGUgdHJlZSB3aXRoIGFueSByZWxldmFudCBkYXRhIGZyb20gdGhlIG9sZCBvbmUuXG5cbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRVBMQUNFXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEludGVyb3BlcmFiaWxpdHkgcG9pbnQgZm9yIG9ic2VydmFibGUvcmVhY3RpdmUgbGlicmFyaWVzLlxuICAgKiBAcmV0dXJucyB7b2JzZXJ2YWJsZX0gQSBtaW5pbWFsIG9ic2VydmFibGUgb2Ygc3RhdGUgY2hhbmdlcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgb2JzZXJ2YWJsZSBwcm9wb3NhbDpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIG9ic2VydmFibGUoKSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICB2YXIgb3V0ZXJTdWJzY3JpYmUgPSBzdWJzY3JpYmU7XG4gICAgcmV0dXJuIF9yZWYgPSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBtaW5pbWFsIG9ic2VydmFibGUgc3Vic2NyaXB0aW9uIG1ldGhvZC5cbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYnNlcnZlciBBbnkgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gb2JzZXJ2ZXIuXG4gICAgICAgKiBUaGUgb2JzZXJ2ZXIgb2JqZWN0IHNob3VsZCBoYXZlIGEgYG5leHRgIG1ldGhvZC5cbiAgICAgICAqIEByZXR1cm5zIHtzdWJzY3JpcHRpb259IEFuIG9iamVjdCB3aXRoIGFuIGB1bnN1YnNjcmliZWAgbWV0aG9kIHRoYXQgY2FuXG4gICAgICAgKiBiZSB1c2VkIHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIGZyb20gdGhlIHN0b3JlLCBhbmQgcHJldmVudCBmdXJ0aGVyXG4gICAgICAgKiBlbWlzc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgb2JzZXJ2YWJsZS5cbiAgICAgICAqL1xuICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYnNlcnZlciAhPT0gJ29iamVjdCcgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMSkgOiBcIkV4cGVjdGVkIHRoZSBvYnNlcnZlciB0byBiZSBhbiBvYmplY3QuIEluc3RlYWQsIHJlY2VpdmVkOiAnXCIgKyBraW5kT2Yob2JzZXJ2ZXIpICsgXCInXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlKCkge1xuICAgICAgICAgIGlmIChvYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGdldFN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVTdGF0ZSgpO1xuICAgICAgICB2YXIgdW5zdWJzY3JpYmUgPSBvdXRlclN1YnNjcmliZShvYnNlcnZlU3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVuc3Vic2NyaWJlOiB1bnN1YnNjcmliZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sIF9yZWZbJCRvYnNlcnZhYmxlXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIF9yZWY7XG4gIH0gLy8gV2hlbiBhIHN0b3JlIGlzIGNyZWF0ZWQsIGFuIFwiSU5JVFwiIGFjdGlvbiBpcyBkaXNwYXRjaGVkIHNvIHRoYXQgZXZlcnlcbiAgLy8gcmVkdWNlciByZXR1cm5zIHRoZWlyIGluaXRpYWwgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gIC8vIHRoZSBpbml0aWFsIHN0YXRlIHRyZWUuXG5cblxuICBkaXNwYXRjaCh7XG4gICAgdHlwZTogQWN0aW9uVHlwZXMuSU5JVFxuICB9KTtcbiAgcmV0dXJuIF9yZWYyID0ge1xuICAgIGRpc3BhdGNoOiBkaXNwYXRjaCxcbiAgICBzdWJzY3JpYmU6IHN1YnNjcmliZSxcbiAgICBnZXRTdGF0ZTogZ2V0U3RhdGUsXG4gICAgcmVwbGFjZVJlZHVjZXI6IHJlcGxhY2VSZWR1Y2VyXG4gIH0sIF9yZWYyWyQkb2JzZXJ2YWJsZV0gPSBvYnNlcnZhYmxlLCBfcmVmMjtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIFJlZHV4IHN0b3JlIHRoYXQgaG9sZHMgdGhlIHN0YXRlIHRyZWUuXG4gKlxuICogKipXZSByZWNvbW1lbmQgdXNpbmcgYGNvbmZpZ3VyZVN0b3JlYCBmcm9tIHRoZVxuICogYEByZWR1eGpzL3Rvb2xraXRgIHBhY2thZ2UqKiwgd2hpY2ggcmVwbGFjZXMgYGNyZWF0ZVN0b3JlYDpcbiAqICoqaHR0cHM6Ly9yZWR1eC5qcy5vcmcvaW50cm9kdWN0aW9uL3doeS1ydGstaXMtcmVkdXgtdG9kYXkqKlxuICpcbiAqIFRoZSBvbmx5IHdheSB0byBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHN0b3JlIGlzIHRvIGNhbGwgYGRpc3BhdGNoKClgIG9uIGl0LlxuICpcbiAqIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHN0b3JlIGluIHlvdXIgYXBwLiBUbyBzcGVjaWZ5IGhvdyBkaWZmZXJlbnRcbiAqIHBhcnRzIG9mIHRoZSBzdGF0ZSB0cmVlIHJlc3BvbmQgdG8gYWN0aW9ucywgeW91IG1heSBjb21iaW5lIHNldmVyYWwgcmVkdWNlcnNcbiAqIGludG8gYSBzaW5nbGUgcmVkdWNlciBmdW5jdGlvbiBieSB1c2luZyBgY29tYmluZVJlZHVjZXJzYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHN0YXRlIHRyZWUsIGdpdmVuXG4gKiB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgYWN0aW9uIHRvIGhhbmRsZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gW3ByZWxvYWRlZFN0YXRlXSBUaGUgaW5pdGlhbCBzdGF0ZS4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGh5ZHJhdGUgdGhlIHN0YXRlIGZyb20gdGhlIHNlcnZlciBpbiB1bml2ZXJzYWwgYXBwcywgb3IgdG8gcmVzdG9yZSBhXG4gKiBwcmV2aW91c2x5IHNlcmlhbGl6ZWQgdXNlciBzZXNzaW9uLlxuICogSWYgeW91IHVzZSBgY29tYmluZVJlZHVjZXJzYCB0byBwcm9kdWNlIHRoZSByb290IHJlZHVjZXIgZnVuY3Rpb24sIHRoaXMgbXVzdCBiZVxuICogYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYGNvbWJpbmVSZWR1Y2Vyc2Aga2V5cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZW5oYW5jZXJdIFRoZSBzdG9yZSBlbmhhbmNlci4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGVuaGFuY2UgdGhlIHN0b3JlIHdpdGggdGhpcmQtcGFydHkgY2FwYWJpbGl0aWVzIHN1Y2ggYXMgbWlkZGxld2FyZSxcbiAqIHRpbWUgdHJhdmVsLCBwZXJzaXN0ZW5jZSwgZXRjLiBUaGUgb25seSBzdG9yZSBlbmhhbmNlciB0aGF0IHNoaXBzIHdpdGggUmVkdXhcbiAqIGlzIGBhcHBseU1pZGRsZXdhcmUoKWAuXG4gKlxuICogQHJldHVybnMge1N0b3JlfSBBIFJlZHV4IHN0b3JlIHRoYXQgbGV0cyB5b3UgcmVhZCB0aGUgc3RhdGUsIGRpc3BhdGNoIGFjdGlvbnNcbiAqIGFuZCBzdWJzY3JpYmUgdG8gY2hhbmdlcy5cbiAqL1xuXG52YXIgbGVnYWN5X2NyZWF0ZVN0b3JlID0gY3JlYXRlU3RvcmU7XG5cbi8qKlxuICogUHJpbnRzIGEgd2FybmluZyBpbiB0aGUgY29uc29sZSBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIHdhcm5pbmcgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cblxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcblxufVxuXG5mdW5jdGlvbiBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKGlucHV0U3RhdGUsIHJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSkge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IEFjdGlvblR5cGVzLklOSVQgPyAncHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlJyA6ICdwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlcic7XG5cbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkICcgKyAndG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLic7XG4gIH1cblxuICBpZiAoIWlzUGxhaW5PYmplY3QoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gXCJUaGUgXCIgKyBhcmd1bWVudE5hbWUgKyBcIiBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFxcXCJcIiArIGtpbmRPZihpbnB1dFN0YXRlKSArIFwiXFxcIi4gRXhwZWN0ZWQgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBcIiArIChcImtleXM6IFxcXCJcIiArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgXCJcXFwiXCIpO1xuICB9XG5cbiAgdmFyIHVuZXhwZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoaW5wdXRTdGF0ZSkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gIXJlZHVjZXJzLmhhc093blByb3BlcnR5KGtleSkgJiYgIXVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldO1xuICB9KTtcbiAgdW5leHBlY3RlZEtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlW2tleV0gPSB0cnVlO1xuICB9KTtcbiAgaWYgKGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZXMuUkVQTEFDRSkgcmV0dXJuO1xuXG4gIGlmICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIFwiVW5leHBlY3RlZCBcIiArICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAxID8gJ2tleXMnIDogJ2tleScpICsgXCIgXCIgKyAoXCJcXFwiXCIgKyB1bmV4cGVjdGVkS2V5cy5qb2luKCdcIiwgXCInKSArIFwiXFxcIiBmb3VuZCBpbiBcIiArIGFyZ3VtZW50TmFtZSArIFwiLiBcIikgKyBcIkV4cGVjdGVkIHRvIGZpbmQgb25lIG9mIHRoZSBrbm93biByZWR1Y2VyIGtleXMgaW5zdGVhZDogXCIgKyAoXCJcXFwiXCIgKyByZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKSArIFwiXFxcIi4gVW5leHBlY3RlZCBrZXlzIHdpbGwgYmUgaWdub3JlZC5cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0UmVkdWNlclNoYXBlKHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgdmFyIGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodW5kZWZpbmVkLCB7XG4gICAgICB0eXBlOiBBY3Rpb25UeXBlcy5JTklUXG4gICAgfSk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEyKSA6IFwiVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gXCIgKyBcIklmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCBcIiArIFwiZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBcIiArIFwibm90IGJlIHVuZGVmaW5lZC4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGEgdmFsdWUgZm9yIHRoaXMgcmVkdWNlciwgXCIgKyBcInlvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcih1bmRlZmluZWQsIHtcbiAgICAgIHR5cGU6IEFjdGlvblR5cGVzLlBST0JFX1VOS05PV05fQUNUSU9OKClcbiAgICB9KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEzKSA6IFwiVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gcHJvYmVkIHdpdGggYSByYW5kb20gdHlwZS4gXCIgKyAoXCJEb24ndCB0cnkgdG8gaGFuZGxlICdcIiArIEFjdGlvblR5cGVzLklOSVQgKyBcIicgb3Igb3RoZXIgYWN0aW9ucyBpbiBcXFwicmVkdXgvKlxcXCIgXCIpICsgXCJuYW1lc3BhY2UuIFRoZXkgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4gSW5zdGVhZCwgeW91IG11c3QgcmV0dXJuIHRoZSBcIiArIFwiY3VycmVudCBzdGF0ZSBmb3IgYW55IHVua25vd24gYWN0aW9ucywgdW5sZXNzIGl0IGlzIHVuZGVmaW5lZCwgXCIgKyBcImluIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSBcIiArIFwiYWN0aW9uIHR5cGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLCBidXQgY2FuIGJlIG51bGwuXCIpO1xuICAgIH1cbiAgfSk7XG59XG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCByZWR1Y2VyIGZ1bmN0aW9ucywgaW50byBhIHNpbmdsZVxuICogcmVkdWNlciBmdW5jdGlvbi4gSXQgd2lsbCBjYWxsIGV2ZXJ5IGNoaWxkIHJlZHVjZXIsIGFuZCBnYXRoZXIgdGhlaXIgcmVzdWx0c1xuICogaW50byBhIHNpbmdsZSBzdGF0ZSBvYmplY3QsIHdob3NlIGtleXMgY29ycmVzcG9uZCB0byB0aGUga2V5cyBvZiB0aGUgcGFzc2VkXG4gKiByZWR1Y2VyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVkdWNlcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBjb3JyZXNwb25kIHRvIGRpZmZlcmVudFxuICogcmVkdWNlciBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGNvbWJpbmVkIGludG8gb25lLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpblxuICogaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXMgcmVkdWNlcnNgIHN5bnRheC4gVGhlIHJlZHVjZXJzIG1heSBuZXZlciByZXR1cm5cbiAqIHVuZGVmaW5lZCBmb3IgYW55IGFjdGlvbi4gSW5zdGVhZCwgdGhleSBzaG91bGQgcmV0dXJuIHRoZWlyIGluaXRpYWwgc3RhdGVcbiAqIGlmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlbSB3YXMgdW5kZWZpbmVkLCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGFueVxuICogdW5yZWNvZ25pemVkIGFjdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgcmVkdWNlciBmdW5jdGlvbiB0aGF0IGludm9rZXMgZXZlcnkgcmVkdWNlciBpbnNpZGUgdGhlXG4gKiBwYXNzZWQgb2JqZWN0LCBhbmQgYnVpbGRzIGEgc3RhdGUgb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUuXG4gKi9cblxuXG5mdW5jdGlvbiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpIHtcbiAgdmFyIHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICB2YXIgZmluYWxSZWR1Y2VycyA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gcmVkdWNlcktleXNbaV07XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3YXJuaW5nKFwiTm8gcmVkdWNlciBwcm92aWRlZCBmb3Iga2V5IFxcXCJcIiArIGtleSArIFwiXFxcIlwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpbmFsUmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhmaW5hbFJlZHVjZXJzKTsgLy8gVGhpcyBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB3YXJuIGFib3V0IHRoZSBzYW1lXG4gIC8vIGtleXMgbXVsdGlwbGUgdGltZXMuXG5cbiAgdmFyIHVuZXhwZWN0ZWRLZXlDYWNoZTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHt9O1xuICB9XG5cbiAgdmFyIHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG5cbiAgdHJ5IHtcbiAgICBhc3NlcnRSZWR1Y2VyU2hhcGUoZmluYWxSZWR1Y2Vycyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaGFwZUFzc2VydGlvbkVycm9yID0gZTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBjb21iaW5hdGlvbihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgaWYgKHN0YXRlID09PSB2b2lkIDApIHtcbiAgICAgIHN0YXRlID0ge307XG4gICAgfVxuXG4gICAgaWYgKHNoYXBlQXNzZXJ0aW9uRXJyb3IpIHtcbiAgICAgIHRocm93IHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciB3YXJuaW5nTWVzc2FnZSA9IGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2Uoc3RhdGUsIGZpbmFsUmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKTtcblxuICAgICAgaWYgKHdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICAgIHdhcm5pbmcod2FybmluZ01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIG5leHRTdGF0ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2tleSA9IGZpbmFsUmVkdWNlcktleXNbX2ldO1xuICAgICAgdmFyIHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW19rZXldO1xuICAgICAgdmFyIHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtfa2V5XTtcbiAgICAgIHZhciBuZXh0U3RhdGVGb3JLZXkgPSByZWR1Y2VyKHByZXZpb3VzU3RhdGVGb3JLZXksIGFjdGlvbik7XG5cbiAgICAgIGlmICh0eXBlb2YgbmV4dFN0YXRlRm9yS2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgYWN0aW9uVHlwZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTQpIDogXCJXaGVuIGNhbGxlZCB3aXRoIGFuIGFjdGlvbiBvZiB0eXBlIFwiICsgKGFjdGlvblR5cGUgPyBcIlxcXCJcIiArIFN0cmluZyhhY3Rpb25UeXBlKSArIFwiXFxcIlwiIDogJyh1bmtub3duIHR5cGUpJykgKyBcIiwgdGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcXFwiXCIgKyBfa2V5ICsgXCJcXFwiIHJldHVybmVkIHVuZGVmaW5lZC4gXCIgKyBcIlRvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4gXCIgKyBcIklmIHlvdSB3YW50IHRoaXMgcmVkdWNlciB0byBob2xkIG5vIHZhbHVlLCB5b3UgY2FuIHJldHVybiBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLlwiKTtcbiAgICAgIH1cblxuICAgICAgbmV4dFN0YXRlW19rZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cblxuICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzdGF0ZSkubGVuZ3RoO1xuICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV4dFN0YXRlIDogc3RhdGU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvbiBjcmVhdG9ycywgaW50byBhbiBvYmplY3Qgd2l0aCB0aGVcbiAqIHNhbWUga2V5cywgYnV0IHdpdGggZXZlcnkgZnVuY3Rpb24gd3JhcHBlZCBpbnRvIGEgYGRpc3BhdGNoYCBjYWxsIHNvIHRoZXlcbiAqIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5LiBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QsIGFzIHlvdSBjYW4gY2FsbFxuICogYHN0b3JlLmRpc3BhdGNoKE15QWN0aW9uQ3JlYXRvcnMuZG9Tb21ldGhpbmcoKSlgIHlvdXJzZWxmIGp1c3QgZmluZS5cbiAqXG4gKiBGb3IgY29udmVuaWVuY2UsIHlvdSBjYW4gYWxzbyBwYXNzIGFuIGFjdGlvbiBjcmVhdG9yIGFzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqIGFuZCBnZXQgYSBkaXNwYXRjaCB3cmFwcGVkIGZ1bmN0aW9uIGluIHJldHVybi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gYWN0aW9uQ3JlYXRvcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgYWN0aW9uXG4gKiBjcmVhdG9yIGZ1bmN0aW9ucy4gT25lIGhhbmR5IHdheSB0byBvYnRhaW4gaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXNgXG4gKiBzeW50YXguIFlvdSBtYXkgYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc3BhdGNoIFRoZSBgZGlzcGF0Y2hgIGZ1bmN0aW9uIGF2YWlsYWJsZSBvbiB5b3VyIFJlZHV4XG4gKiBzdG9yZS5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBUaGUgb2JqZWN0IG1pbWlja2luZyB0aGUgb3JpZ2luYWwgb2JqZWN0LCBidXQgd2l0aFxuICogZXZlcnkgYWN0aW9uIGNyZWF0b3Igd3JhcHBlZCBpbnRvIHRoZSBgZGlzcGF0Y2hgIGNhbGwuIElmIHlvdSBwYXNzZWQgYVxuICogZnVuY3Rpb24gYXMgYGFjdGlvbkNyZWF0b3JzYCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGFsc28gYmUgYSBzaW5nbGVcbiAqIGZ1bmN0aW9uLlxuICovXG5cblxuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzICE9PSAnb2JqZWN0JyB8fCBhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSA6IFwiYmluZEFjdGlvbkNyZWF0b3JzIGV4cGVjdGVkIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLCBidXQgaW5zdGVhZCByZWNlaXZlZDogJ1wiICsga2luZE9mKGFjdGlvbkNyZWF0b3JzKSArIFwiJy4gXCIgKyBcIkRpZCB5b3Ugd3JpdGUgXFxcImltcG9ydCBBY3Rpb25DcmVhdG9ycyBmcm9tXFxcIiBpbnN0ZWFkIG9mIFxcXCJpbXBvcnQgKiBhcyBBY3Rpb25DcmVhdG9ycyBmcm9tXFxcIj9cIik7XG4gIH1cblxuICB2YXIgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuXG4gIGZvciAodmFyIGtleSBpbiBhY3Rpb25DcmVhdG9ycykge1xuICAgIHZhciBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufVxuXG4vKipcbiAqIENvbXBvc2VzIHNpbmdsZS1hcmd1bWVudCBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LiBUaGUgcmlnaHRtb3N0XG4gKiBmdW5jdGlvbiBjYW4gdGFrZSBtdWx0aXBsZSBhcmd1bWVudHMgYXMgaXQgcHJvdmlkZXMgdGhlIHNpZ25hdHVyZSBmb3JcbiAqIHRoZSByZXN1bHRpbmcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZ1bmNzIFRoZSBmdW5jdGlvbnMgdG8gY29tcG9zZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiBvYnRhaW5lZCBieSBjb21wb3NpbmcgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uc1xuICogZnJvbSByaWdodCB0byBsZWZ0LiBGb3IgZXhhbXBsZSwgY29tcG9zZShmLCBnLCBoKSBpcyBpZGVudGljYWwgdG8gZG9pbmdcbiAqICguLi5hcmdzKSA9PiBmKGcoaCguLi5hcmdzKSkpLlxuICovXG5mdW5jdGlvbiBjb21wb3NlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZnVuY3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgZnVuY3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZnVuY3NbMF07XG4gIH1cblxuICByZXR1cm4gZnVuY3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhKGIuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RvcmUgZW5oYW5jZXIgdGhhdCBhcHBsaWVzIG1pZGRsZXdhcmUgdG8gdGhlIGRpc3BhdGNoIG1ldGhvZFxuICogb2YgdGhlIFJlZHV4IHN0b3JlLiBUaGlzIGlzIGhhbmR5IGZvciBhIHZhcmlldHkgb2YgdGFza3MsIHN1Y2ggYXMgZXhwcmVzc2luZ1xuICogYXN5bmNocm9ub3VzIGFjdGlvbnMgaW4gYSBjb25jaXNlIG1hbm5lciwgb3IgbG9nZ2luZyBldmVyeSBhY3Rpb24gcGF5bG9hZC5cbiAqXG4gKiBTZWUgYHJlZHV4LXRodW5rYCBwYWNrYWdlIGFzIGFuIGV4YW1wbGUgb2YgdGhlIFJlZHV4IG1pZGRsZXdhcmUuXG4gKlxuICogQmVjYXVzZSBtaWRkbGV3YXJlIGlzIHBvdGVudGlhbGx5IGFzeW5jaHJvbm91cywgdGhpcyBzaG91bGQgYmUgdGhlIGZpcnN0XG4gKiBzdG9yZSBlbmhhbmNlciBpbiB0aGUgY29tcG9zaXRpb24gY2hhaW4uXG4gKlxuICogTm90ZSB0aGF0IGVhY2ggbWlkZGxld2FyZSB3aWxsIGJlIGdpdmVuIHRoZSBgZGlzcGF0Y2hgIGFuZCBgZ2V0U3RhdGVgIGZ1bmN0aW9uc1xuICogYXMgbmFtZWQgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IG1pZGRsZXdhcmVzIFRoZSBtaWRkbGV3YXJlIGNoYWluIHRvIGJlIGFwcGxpZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgc3RvcmUgZW5oYW5jZXIgYXBwbHlpbmcgdGhlIG1pZGRsZXdhcmUuXG4gKi9cblxuZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWlkZGxld2FyZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgbWlkZGxld2FyZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGNyZWF0ZVN0b3JlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdG9yZSA9IGNyZWF0ZVN0b3JlLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcblxuICAgICAgdmFyIF9kaXNwYXRjaCA9IGZ1bmN0aW9uIGRpc3BhdGNoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNSkgOiAnRGlzcGF0Y2hpbmcgd2hpbGUgY29uc3RydWN0aW5nIHlvdXIgbWlkZGxld2FyZSBpcyBub3QgYWxsb3dlZC4gJyArICdPdGhlciBtaWRkbGV3YXJlIHdvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIHRoaXMgZGlzcGF0Y2guJyk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgbWlkZGxld2FyZUFQSSA9IHtcbiAgICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgICBkaXNwYXRjaDogZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaC5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgY2hhaW4gPSBtaWRkbGV3YXJlcy5tYXAoZnVuY3Rpb24gKG1pZGRsZXdhcmUpIHtcbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmUobWlkZGxld2FyZUFQSSk7XG4gICAgICB9KTtcbiAgICAgIF9kaXNwYXRjaCA9IGNvbXBvc2UuYXBwbHkodm9pZCAwLCBjaGFpbikoc3RvcmUuZGlzcGF0Y2gpO1xuICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3RvcmUpLCB7fSwge1xuICAgICAgICBkaXNwYXRjaDogX2Rpc3BhdGNoXG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgeyBBY3Rpb25UeXBlcyBhcyBfX0RPX05PVF9VU0VfX0FjdGlvblR5cGVzLCBhcHBseU1pZGRsZXdhcmUsIGJpbmRBY3Rpb25DcmVhdG9ycywgY29tYmluZVJlZHVjZXJzLCBjb21wb3NlLCBjcmVhdGVTdG9yZSwgbGVnYWN5X2NyZWF0ZVN0b3JlIH07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xubW9kdWxlLmV4cG9ydHMub25jZSA9IG9uY2U7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5mdW5jdGlvbiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gX2dldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIEVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZiBhbmQgb25seSBpZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZm9yIChpID0gbGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHtcbiAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gIGlmIChldmxpc3RlbmVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIFtdO1xuXG4gIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJylcbiAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07XG5cbiAgcmV0dXJuIHVud3JhcCA/XG4gICAgdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpIDogYXJyYXlDbG9uZShldmxpc3RlbmVyLCBldmxpc3RlbmVyLmxlbmd0aCk7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgdHJ1ZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7XG4gIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIG4pIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkobik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKVxuICAgIGNvcHlbaV0gPSBhcnJbaV07XG4gIHJldHVybiBjb3B5O1xufVxuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICg7IGluZGV4ICsgMSA8IGxpc3QubGVuZ3RoOyBpbmRleCsrKVxuICAgIGxpc3RbaW5kZXhdID0gbGlzdFtpbmRleCArIDFdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBvbmNlKGVtaXR0ZXIsIG5hbWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBlcnJvckxpc3RlbmVyKGVycikge1xuICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihuYW1lLCByZXNvbHZlcik7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlcigpIHtcbiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIH07XG5cbiAgICBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgcmVzb2x2ZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBpZiAobmFtZSAhPT0gJ2Vycm9yJykge1xuICAgICAgYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgZXJyb3JMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIGxpc3RlbmVyLCBmbGFncykge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgZW1pdHRlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1pdHRlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBFdmVudFRhcmdldCBkb2VzIG5vdCBoYXZlIGBlcnJvcmAgZXZlbnQgc2VtYW50aWNzIGxpa2UgTm9kZVxuICAgIC8vIEV2ZW50RW1pdHRlcnMsIHdlIGRvIG5vdCBsaXN0ZW4gZm9yIGBlcnJvcmAgZXZlbnRzIGhlcmUuXG4gICAgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmN0aW9uIHdyYXBMaXN0ZW5lcihhcmcpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgYnVpbHRpbiBgeyBvbmNlOiB0cnVlIH1gIHN1cHBvcnQgc28gd2VcbiAgICAgIC8vIGhhdmUgdG8gZG8gaXQgbWFudWFsbHkuXG4gICAgICBpZiAoZmxhZ3Mub25jZSkge1xuICAgICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgd3JhcExpc3RlbmVyKTtcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVyKGFyZyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiZW1pdHRlclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTtcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImFzc2V0cy9pbWFnZXMvbG9nby4yYTdiZmYwYzExODkxODNmYWZlNzFkN2Q1Yjk0ZTBjZC5wbmdcIjsiLCIoZnVuY3Rpb24oYSxiKXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtdLGIpO2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGV4cG9ydHMpYigpO2Vsc2V7YigpLGEuRmlsZVNhdmVyPXtleHBvcnRzOnt9fS5leHBvcnRzfX0pKHRoaXMsZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBiKGEsYil7cmV0dXJuXCJ1bmRlZmluZWRcIj09dHlwZW9mIGI/Yj17YXV0b0JvbTohMX06XCJvYmplY3RcIiE9dHlwZW9mIGImJihjb25zb2xlLndhcm4oXCJEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdFwiKSxiPXthdXRvQm9tOiFifSksYi5hdXRvQm9tJiYvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChhLnR5cGUpP25ldyBCbG9iKFtcIlxcdUZFRkZcIixhXSx7dHlwZTphLnR5cGV9KTphfWZ1bmN0aW9uIGMoYSxiLGMpe3ZhciBkPW5ldyBYTUxIdHRwUmVxdWVzdDtkLm9wZW4oXCJHRVRcIixhKSxkLnJlc3BvbnNlVHlwZT1cImJsb2JcIixkLm9ubG9hZD1mdW5jdGlvbigpe2coZC5yZXNwb25zZSxiLGMpfSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKFwiY291bGQgbm90IGRvd25sb2FkIGZpbGVcIil9LGQuc2VuZCgpfWZ1bmN0aW9uIGQoYSl7dmFyIGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Iub3BlbihcIkhFQURcIixhLCExKTt0cnl7Yi5zZW5kKCl9Y2F0Y2goYSl7fXJldHVybiAyMDA8PWIuc3RhdHVzJiYyOTk+PWIuc3RhdHVzfWZ1bmN0aW9uIGUoYSl7dHJ5e2EuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudChcImNsaWNrXCIpKX1jYXRjaChjKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFdmVudChcIk1vdXNlRXZlbnRzXCIpO2IuaW5pdE1vdXNlRXZlbnQoXCJjbGlja1wiLCEwLCEwLHdpbmRvdywwLDAsMCw4MCwyMCwhMSwhMSwhMSwhMSwwLG51bGwpLGEuZGlzcGF0Y2hFdmVudChiKX19dmFyIGY9XCJvYmplY3RcIj09dHlwZW9mIHdpbmRvdyYmd2luZG93LndpbmRvdz09PXdpbmRvdz93aW5kb3c6XCJvYmplY3RcIj09dHlwZW9mIHNlbGYmJnNlbGYuc2VsZj09PXNlbGY/c2VsZjpcIm9iamVjdFwiPT10eXBlb2YgZ2xvYmFsJiZnbG9iYWwuZ2xvYmFsPT09Z2xvYmFsP2dsb2JhbDp2b2lkIDAsYT1mLm5hdmlnYXRvciYmL01hY2ludG9zaC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmL0FwcGxlV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhL1NhZmFyaS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxnPWYuc2F2ZUFzfHwoXCJvYmplY3RcIiE9dHlwZW9mIHdpbmRvd3x8d2luZG93IT09Zj9mdW5jdGlvbigpe306XCJkb3dubG9hZFwiaW4gSFRNTEFuY2hvckVsZW1lbnQucHJvdG90eXBlJiYhYT9mdW5jdGlvbihiLGcsaCl7dmFyIGk9Zi5VUkx8fGYud2Via2l0VVJMLGo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7Zz1nfHxiLm5hbWV8fFwiZG93bmxvYWRcIixqLmRvd25sb2FkPWcsai5yZWw9XCJub29wZW5lclwiLFwic3RyaW5nXCI9PXR5cGVvZiBiPyhqLmhyZWY9YixqLm9yaWdpbj09PWxvY2F0aW9uLm9yaWdpbj9lKGopOmQoai5ocmVmKT9jKGIsZyxoKTplKGosai50YXJnZXQ9XCJfYmxhbmtcIikpOihqLmhyZWY9aS5jcmVhdGVPYmplY3RVUkwoYiksc2V0VGltZW91dChmdW5jdGlvbigpe2kucmV2b2tlT2JqZWN0VVJMKGouaHJlZil9LDRFNCksc2V0VGltZW91dChmdW5jdGlvbigpe2Uoail9LDApKX06XCJtc1NhdmVPck9wZW5CbG9iXCJpbiBuYXZpZ2F0b3I/ZnVuY3Rpb24oZixnLGgpe2lmKGc9Z3x8Zi5uYW1lfHxcImRvd25sb2FkXCIsXCJzdHJpbmdcIiE9dHlwZW9mIGYpbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoYihmLGgpLGcpO2Vsc2UgaWYoZChmKSljKGYsZyxoKTtlbHNle3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO2kuaHJlZj1mLGkudGFyZ2V0PVwiX2JsYW5rXCIsc2V0VGltZW91dChmdW5jdGlvbigpe2UoaSl9KX19OmZ1bmN0aW9uKGIsZCxlLGcpe2lmKGc9Z3x8b3BlbihcIlwiLFwiX2JsYW5rXCIpLGcmJihnLmRvY3VtZW50LnRpdGxlPWcuZG9jdW1lbnQuYm9keS5pbm5lclRleHQ9XCJkb3dubG9hZGluZy4uLlwiKSxcInN0cmluZ1wiPT10eXBlb2YgYilyZXR1cm4gYyhiLGQsZSk7dmFyIGg9XCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIj09PWIudHlwZSxpPS9jb25zdHJ1Y3Rvci9pLnRlc3QoZi5IVE1MRWxlbWVudCl8fGYuc2FmYXJpLGo9L0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKChqfHxoJiZpfHxhKSYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIEZpbGVSZWFkZXIpe3ZhciBrPW5ldyBGaWxlUmVhZGVyO2sub25sb2FkZW5kPWZ1bmN0aW9uKCl7dmFyIGE9ay5yZXN1bHQ7YT1qP2E6YS5yZXBsYWNlKC9eZGF0YTpbXjtdKjsvLFwiZGF0YTphdHRhY2htZW50L2ZpbGU7XCIpLGc/Zy5sb2NhdGlvbi5ocmVmPWE6bG9jYXRpb249YSxnPW51bGx9LGsucmVhZEFzRGF0YVVSTChiKX1lbHNle3ZhciBsPWYuVVJMfHxmLndlYmtpdFVSTCxtPWwuY3JlYXRlT2JqZWN0VVJMKGIpO2c/Zy5sb2NhdGlvbj1tOmxvY2F0aW9uLmhyZWY9bSxnPW51bGwsc2V0VGltZW91dChmdW5jdGlvbigpe2wucmV2b2tlT2JqZWN0VVJMKG0pfSw0RTQpfX0pO2Yuc2F2ZUFzPWcuc2F2ZUFzPWcsXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZSYmKG1vZHVsZS5leHBvcnRzPWcpfSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpbGVTYXZlci5taW4uanMubWFwIiwiZXhwb3J0IHZhciBmb2N1c09uID0gZnVuY3Rpb24gKHRhcmdldCwgZm9jdXNPcHRpb25zKSB7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgLy8gbm90IGNsZWFyIGhvdywgYnV0IGlzIHBvc3NpYmxlIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVLYXNoZXkvZm9jdXMtbG9jay9pc3N1ZXMvNTNcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoJ2ZvY3VzJyBpbiB0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmZvY3VzKGZvY3VzT3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICgnY29udGVudFdpbmRvdycgaW4gdGFyZ2V0ICYmIHRhcmdldC5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHRhcmdldC5jb250ZW50V2luZG93LmZvY3VzKCk7XG4gICAgfVxufTtcbiIsIi8qKlxuICogZGVmaW5lcyBhIGZvY3VzIGdyb3VwXG4gKi9cbmV4cG9ydCB2YXIgRk9DVVNfR1JPVVAgPSAnZGF0YS1mb2N1cy1sb2NrJztcbi8qKlxuICogZGlzYWJsZXMgZWxlbWVudCBkaXNjb3ZlcnkgaW5zaWRlIGEgZ3JvdXAgbWFya2VkIGJ5IGtleVxuICovXG5leHBvcnQgdmFyIEZPQ1VTX0RJU0FCTEVEID0gJ2RhdGEtZm9jdXMtbG9jay1kaXNhYmxlZCc7XG4vKipcbiAqIGFsbG93cyB1bmNvbnRyb2xsZWQgZm9jdXMgd2l0aGluIHRoZSBtYXJrZWQgYXJlYSwgZWZmZWN0aXZlbHkgZGlzYWJsaW5nIGZvY3VzIGxvY2sgZm9yIGl0J3MgY29udGVudFxuICovXG5leHBvcnQgdmFyIEZPQ1VTX0FMTE9XID0gJ2RhdGEtbm8tZm9jdXMtbG9jayc7XG4vKipcbiAqIGluc3RydWN0cyBhdXRvZm9jdXMgZW5naW5lIHRvIHBpY2sgZGVmYXVsdCBhdXRvZm9jdXMgaW5zaWRlIGEgZ2l2ZW4gbm9kZVxuICogY2FuIGJlIHNldCBvbiB0aGUgZWxlbWVudCBvciBjb250YWluZXJcbiAqL1xuZXhwb3J0IHZhciBGT0NVU19BVVRPID0gJ2RhdGEtYXV0b2ZvY3VzLWluc2lkZSc7XG4vKipcbiAqIGluc3RydWN0cyBhdXRvZm9jdXMgdG8gaWdub3JlIGVsZW1lbnRzIHdpdGhpbiBhIGdpdmVuIG5vZGVcbiAqIGNhbiBiZSBzZXQgb24gdGhlIGVsZW1lbnQgb3IgY29udGFpbmVyXG4gKi9cbmV4cG9ydCB2YXIgRk9DVVNfTk9fQVVUT0ZPQ1VTID0gJ2RhdGEtbm8tYXV0b2ZvY3VzJztcbiIsImltcG9ydCB7IGNvbnRhaW5zIH0gZnJvbSAnLi91dGlscy9ET011dGlscyc7XG5pbXBvcnQgeyBnZXRBbGxBZmZlY3RlZE5vZGVzIH0gZnJvbSAnLi91dGlscy9hbGwtYWZmZWN0ZWQnO1xuaW1wb3J0IHsgZ2V0Rmlyc3QsIHRvQXJyYXkgfSBmcm9tICcuL3V0aWxzL2FycmF5JztcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnQgfSBmcm9tICcuL3V0aWxzL2dldEFjdGl2ZUVsZW1lbnQnO1xudmFyIGZvY3VzSW5GcmFtZSA9IGZ1bmN0aW9uIChmcmFtZSwgYWN0aXZlRWxlbWVudCkgeyByZXR1cm4gZnJhbWUgPT09IGFjdGl2ZUVsZW1lbnQ7IH07XG52YXIgZm9jdXNJbnNpZGVJZnJhbWUgPSBmdW5jdGlvbiAodG9wTm9kZSwgYWN0aXZlRWxlbWVudCkge1xuICAgIHJldHVybiBCb29sZWFuKHRvQXJyYXkodG9wTm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKSkuc29tZShmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gZm9jdXNJbkZyYW1lKG5vZGUsIGFjdGl2ZUVsZW1lbnQpOyB9KSk7XG59O1xuLyoqXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSwgaWYgdGhlIGN1cnJlbnQgZm9jdXMgaXMgaW5zaWRlIGdpdmVuIG5vZGUgb3Igbm9kZXMuXG4gKiBTdXBwb3J0cyBub2RlcyBoaWRkZW4gaW5zaWRlIHNoYWRvd0RvbVxuICovXG5leHBvcnQgdmFyIGZvY3VzSW5zaWRlID0gZnVuY3Rpb24gKHRvcE5vZGUsIGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAvLyBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQgJiYgZ2V0QWN0aXZlRWxlbWVudCgpO1xuICAgIGlmIChhY3RpdmVFbGVtZW50ID09PSB2b2lkIDApIHsgYWN0aXZlRWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoZ2V0Rmlyc3QodG9wTm9kZSkub3duZXJEb2N1bWVudCk7IH1cbiAgICBpZiAoIWFjdGl2ZUVsZW1lbnQgfHwgKGFjdGl2ZUVsZW1lbnQuZGF0YXNldCAmJiBhY3RpdmVFbGVtZW50LmRhdGFzZXQuZm9jdXNHdWFyZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0QWxsQWZmZWN0ZWROb2Rlcyh0b3BOb2RlKS5zb21lKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBjb250YWlucyhub2RlLCBhY3RpdmVFbGVtZW50KSB8fCBmb2N1c0luc2lkZUlmcmFtZShub2RlLCBhY3RpdmVFbGVtZW50KTtcbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyBGT0NVU19BTExPVyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGNvbnRhaW5zIH0gZnJvbSAnLi91dGlscy9ET011dGlscyc7XG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi91dGlscy9hcnJheSc7XG5pbXBvcnQgeyBnZXRBY3RpdmVFbGVtZW50IH0gZnJvbSAnLi91dGlscy9nZXRBY3RpdmVFbGVtZW50Jztcbi8qKlxuICogY2hlY2tzIGlmIGZvY3VzIGlzIGhpZGRlbiBGUk9NIHRoZSBmb2N1cy1sb2NrXG4gKiBpZSBjb250YWluZWQgaW5zaWRlIGEgbm9kZSBmb2N1cy1sb2NrIHNoYWxsIGlnbm9yZVxuICpcbiAqIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGNvdXBsZWQgd2l0aCB7QGxpbmsgRk9DVVNfQUxMT1d9IGNvbnN0YW50XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGZvY3VzIGlzIGN1cnJlbnRseSBpcyBpbiBcImFsbG93XCIgYXJlYVxuICovXG5leHBvcnQgdmFyIGZvY3VzSXNIaWRkZW4gPSBmdW5jdGlvbiAoaW5Eb2N1bWVudCkge1xuICAgIGlmIChpbkRvY3VtZW50ID09PSB2b2lkIDApIHsgaW5Eb2N1bWVudCA9IGRvY3VtZW50OyB9XG4gICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KGluRG9jdW1lbnQpO1xuICAgIGlmICghYWN0aXZlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIHRoaXMgZG9lcyBub3Qgc3VwcG9ydCBzZXR0aW5nIEZPQ1VTX0FMTE9XIHdpdGhpbiBzaGFkb3cgZG9tXG4gICAgcmV0dXJuIHRvQXJyYXkoaW5Eb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW1wiLmNvbmNhdChGT0NVU19BTExPVywgXCJdXCIpKSkuc29tZShmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gY29udGFpbnMobm9kZSwgYWN0aXZlRWxlbWVudCk7IH0pO1xufTtcbiIsImltcG9ydCB7IE5FV19GT0NVUywgbmV3Rm9jdXMgfSBmcm9tICcuL3NvbHZlcic7XG5pbXBvcnQgeyBnZXRGb2N1c2FibGVOb2RlcyB9IGZyb20gJy4vdXRpbHMvRE9NdXRpbHMnO1xuaW1wb3J0IHsgZ2V0QWxsQWZmZWN0ZWROb2RlcyB9IGZyb20gJy4vdXRpbHMvYWxsLWFmZmVjdGVkJztcbmltcG9ydCB7IGFzQXJyYXksIGdldEZpcnN0IH0gZnJvbSAnLi91dGlscy9hcnJheSc7XG5pbXBvcnQgeyBwaWNrQXV0b2ZvY3VzIH0gZnJvbSAnLi91dGlscy9hdXRvLWZvY3VzJztcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnQgfSBmcm9tICcuL3V0aWxzL2dldEFjdGl2ZUVsZW1lbnQnO1xuaW1wb3J0IHsgaXNEZWZpbmVkLCBpc05vdEFHdWFyZCB9IGZyb20gJy4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgYWxsUGFyZW50QXV0b2ZvY3VzYWJsZXMsIGdldFRvcENvbW1vblBhcmVudCB9IGZyb20gJy4vdXRpbHMvcGFyZW50aW5nJztcbnZhciByZW9yZGVyTm9kZXMgPSBmdW5jdGlvbiAoc3JjTm9kZXMsIGRzdE5vZGVzKSB7XG4gICAgdmFyIHJlbWFwID0gbmV3IE1hcCgpO1xuICAgIC8vIG5vIFNldChkc3ROb2RlcykgZm9yIElFMTEgOihcbiAgICBkc3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHkpIHsgcmV0dXJuIHJlbWFwLnNldChlbnRpdHkubm9kZSwgZW50aXR5KTsgfSk7XG4gICAgLy8gcmVtYXAgdG8gZHN0Tm9kZXNcbiAgICByZXR1cm4gc3JjTm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiByZW1hcC5nZXQobm9kZSk7IH0pLmZpbHRlcihpc0RlZmluZWQpO1xufTtcbi8qKlxuICogY29udGFpbnMgdGhlIG1haW4gbG9naWMgb2YgdGhlIGBmb2N1cy1sb2NrYCBwYWNrYWdlLlxuICpcbiAqICEgeW91IHByb2JhYmx5IGRvbnQgbmVlZCB0aGlzIGZ1bmN0aW9uICFcbiAqXG4gKiBnaXZlbiB0b3Agbm9kZShzKSBhbmQgdGhlIGxhc3QgYWN0aXZlIGVsZW1lbnQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBiZSBmb2N1c2VkIG5leHRcbiAqIEByZXR1cm5zIGVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIGZvY3VzZWQgdG8gbW92ZSBmb2N1cyBpbnNpZGVcbiAqIEBwYXJhbSB0b3BOb2RlXG4gKiBAcGFyYW0gbGFzdE5vZGVcbiAqL1xuZXhwb3J0IHZhciBmb2N1c1NvbHZlciA9IGZ1bmN0aW9uICh0b3BOb2RlLCBsYXN0Tm9kZSkge1xuICAgIHZhciBhY3RpdmVFbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudChhc0FycmF5KHRvcE5vZGUpLmxlbmd0aCA+IDAgPyBkb2N1bWVudCA6IGdldEZpcnN0KHRvcE5vZGUpLm93bmVyRG9jdW1lbnQpO1xuICAgIHZhciBlbnRyaWVzID0gZ2V0QWxsQWZmZWN0ZWROb2Rlcyh0b3BOb2RlKS5maWx0ZXIoaXNOb3RBR3VhcmQpO1xuICAgIHZhciBjb21tb25QYXJlbnQgPSBnZXRUb3BDb21tb25QYXJlbnQoYWN0aXZlRWxlbWVudCB8fCB0b3BOb2RlLCB0b3BOb2RlLCBlbnRyaWVzKTtcbiAgICB2YXIgdmlzaWJpbGl0eUNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHZhciBhbnlGb2N1c2FibGUgPSBnZXRGb2N1c2FibGVOb2RlcyhlbnRyaWVzLCB2aXNpYmlsaXR5Q2FjaGUpO1xuICAgIHZhciBpbm5lckVsZW1lbnRzID0gYW55Rm9jdXNhYmxlLmZpbHRlcihmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBfYS5ub2RlO1xuICAgICAgICByZXR1cm4gaXNOb3RBR3VhcmQobm9kZSk7XG4gICAgfSk7XG4gICAgaWYgKCFpbm5lckVsZW1lbnRzWzBdKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBvdXRlck5vZGVzID0gZ2V0Rm9jdXNhYmxlTm9kZXMoW2NvbW1vblBhcmVudF0sIHZpc2liaWxpdHlDYWNoZSkubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuICAgIHZhciBvcmRlcmVkSW5uZXJFbGVtZW50cyA9IHJlb3JkZXJOb2RlcyhvdXRlck5vZGVzLCBpbm5lckVsZW1lbnRzKTtcbiAgICAvLyBjb2xsZWN0IGlubmVyIGZvY3VzYWJsZSBhbmQgc2VwYXJhdGVseSB0YWJiYWJsZXNcbiAgICB2YXIgaW5uZXJGb2N1c2FibGVzID0gb3JkZXJlZElubmVyRWxlbWVudHMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuICAgIHZhciBpbm5lclRhYmJhYmxlID0gb3JkZXJlZElubmVyRWxlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgdGFiSW5kZXggPSBfYS50YWJJbmRleDtcbiAgICAgICAgcmV0dXJuIHRhYkluZGV4ID49IDA7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbm9kZSA9IF9hLm5vZGU7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuICAgIHZhciBuZXdJZCA9IG5ld0ZvY3VzKGlubmVyRm9jdXNhYmxlcywgaW5uZXJUYWJiYWJsZSwgb3V0ZXJOb2RlcywgYWN0aXZlRWxlbWVudCwgbGFzdE5vZGUpO1xuICAgIGlmIChuZXdJZCA9PT0gTkVXX0ZPQ1VTKSB7XG4gICAgICAgIHZhciBmb2N1c05vZGUgPSBcbiAgICAgICAgLy8gZmlyc3QgdHJ5IG9ubHkgdGFiYmFibGUsIGFuZCB0aGUgZmFsbGJhY2sgdG8gYWxsIGZvY3VzYWJsZSwgYXMgbG9uZyBhcyBhdCBsZWFzdCBvbmUgZWxlbWVudCBzaG91bGQgYmUgcGlja2VkIGZvciBmb2N1c1xuICAgICAgICBwaWNrQXV0b2ZvY3VzKGFueUZvY3VzYWJsZSwgaW5uZXJUYWJiYWJsZSwgYWxsUGFyZW50QXV0b2ZvY3VzYWJsZXMoZW50cmllcywgdmlzaWJpbGl0eUNhY2hlKSkgfHxcbiAgICAgICAgICAgIHBpY2tBdXRvZm9jdXMoYW55Rm9jdXNhYmxlLCBpbm5lckZvY3VzYWJsZXMsIGFsbFBhcmVudEF1dG9mb2N1c2FibGVzKGVudHJpZXMsIHZpc2liaWxpdHlDYWNoZSkpO1xuICAgICAgICBpZiAoZm9jdXNOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBmb2N1c05vZGUgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignZm9jdXMtbG9jazogY2Fubm90IGZpbmQgYW55IG5vZGUgdG8gbW92ZSBmb2N1cyBpbnRvJyk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChuZXdJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBuZXdJZDtcbiAgICB9XG4gICAgcmV0dXJuIG9yZGVyZWRJbm5lckVsZW1lbnRzW25ld0lkXTtcbn07XG4iLCJpbXBvcnQgeyBnZXRBbGxBZmZlY3RlZE5vZGVzIH0gZnJvbSAnLi91dGlscy9hbGwtYWZmZWN0ZWQnO1xuaW1wb3J0IHsgaXNHdWFyZCwgaXNOb3RBR3VhcmQgfSBmcm9tICcuL3V0aWxzL2lzJztcbmltcG9ydCB7IGdldFRvcENvbW1vblBhcmVudCB9IGZyb20gJy4vdXRpbHMvcGFyZW50aW5nJztcbmltcG9ydCB7IG9yZGVyQnlUYWJJbmRleCB9IGZyb20gJy4vdXRpbHMvdGFiT3JkZXInO1xuaW1wb3J0IHsgZ2V0Rm9jdXNhYmxlcyB9IGZyb20gJy4vdXRpbHMvdGFiVXRpbHMnO1xuLyoqXG4gKiB0cmF2ZXJzZXMgYWxsIHJlbGF0ZWQgbm9kZXMgKGluY2x1ZGluZyBncm91cHMpIHJldHVybmluZyBhIGxpc3Qgb2YgYWxsIG5vZGVzKG91dGVyIGFuZCBpbnRlcm5hbCkgd2l0aCBtZXRhIGluZm9ybWF0aW9uXG4gKiBUaGlzIGlzIGxvdy1sZXZlbCBBUEkhXG4gKiBAcmV0dXJucyBsaXN0IG9mIGZvY3VzYWJsZSBlbGVtZW50cyBpbnNpZGUgYSBnaXZlbiB0b3AoISkgbm9kZS5cbiAqIEBzZWUge0BsaW5rIGdldEZvY3VzYWJsZU5vZGVzfSBwcm92aWRpbmcgYSBzaW1wbGVyIEFQSVxuICovXG5leHBvcnQgdmFyIGV4cGFuZEZvY3VzYWJsZU5vZGVzID0gZnVuY3Rpb24gKHRvcE5vZGUpIHtcbiAgICB2YXIgZW50cmllcyA9IGdldEFsbEFmZmVjdGVkTm9kZXModG9wTm9kZSkuZmlsdGVyKGlzTm90QUd1YXJkKTtcbiAgICB2YXIgY29tbW9uUGFyZW50ID0gZ2V0VG9wQ29tbW9uUGFyZW50KHRvcE5vZGUsIHRvcE5vZGUsIGVudHJpZXMpO1xuICAgIHZhciBvdXRlck5vZGVzID0gb3JkZXJCeVRhYkluZGV4KGdldEZvY3VzYWJsZXMoW2NvbW1vblBhcmVudF0sIHRydWUpLCB0cnVlLCB0cnVlKTtcbiAgICB2YXIgaW5uZXJFbGVtZW50cyA9IGdldEZvY3VzYWJsZXMoZW50cmllcywgZmFsc2UpO1xuICAgIHJldHVybiBvdXRlck5vZGVzLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBfYS5ub2RlLCBpbmRleCA9IF9hLmluZGV4O1xuICAgICAgICByZXR1cm4gKHtcbiAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICBsb2NrSXRlbTogaW5uZXJFbGVtZW50cy5pbmRleE9mKG5vZGUpID49IDAsXG4gICAgICAgICAgICBndWFyZDogaXNHdWFyZChub2RlKSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuIiwiaW1wb3J0IHsgZm9jdXNPbiB9IGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IHsgZm9jdXNTb2x2ZXIgfSBmcm9tICcuL2ZvY3VzU29sdmVyJztcbnZhciBndWFyZENvdW50ID0gMDtcbnZhciBsb2NrRGlzYWJsZWQgPSBmYWxzZTtcbi8qKlxuICogVGhlIG1haW4gZnVuY3Rpb25hbGl0eSBvZiB0aGUgZm9jdXMtbG9jayBwYWNrYWdlXG4gKlxuICogQ29udGFpbnMgZm9jdXMgYXQgYSBnaXZlbiBub2RlLlxuICogVGhlIGxhc3QgZm9jdXNlZCBlbGVtZW50IHdpbGwgaGVscCB0byBkZXRlcm1pbmUgd2hpY2ggZWxlbWVudChmaXJzdCBvciBsYXN0KSBzaG91bGQgYmUgZm9jdXNlZC5cbiAqIFRoZSBmb3VuZCBlbGVtZW50IHdpbGwgYmUgZm9jdXNlZC5cbiAqXG4gKiBUaGlzIGlzIG9uZSB0aW1lIGFjdGlvbiAobW92ZSksIG5vdCBhIHBlcnNpc3RlbnQgZm9jdXMtbG9ja1xuICpcbiAqIEhUTUwgbWFya2VycyAoc2VlIHtAbGluayBpbXBvcnQoJy4vY29uc3RhbnRzJykuRk9DVVNfQVVUT30gY29uc3RhbnRzKSBjYW4gY29udHJvbCBhdXRvZm9jdXNcbiAqIEBzZWUge0BsaW5rIGZvY3VzU29sdmVyfSBmb3IgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSB3aXRob3V0IGF1dG9mb2N1c1xuICovXG5leHBvcnQgdmFyIG1vdmVGb2N1c0luc2lkZSA9IGZ1bmN0aW9uICh0b3BOb2RlLCBsYXN0Tm9kZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgdmFyIGZvY3VzYWJsZSA9IGZvY3VzU29sdmVyKHRvcE5vZGUsIGxhc3ROb2RlKTtcbiAgICAvLyBnbG9iYWwgbG9jYWwgc2lkZSBlZmZlY3QgdG8gY291bnRhaW4gcmVjdXJzaXZlIGxvY2sgYWN0aXZhdGlvbiBhbmQgcmVzb2x2ZSBmb2N1cy1maWdodGluZ1xuICAgIGlmIChsb2NrRGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZm9jdXNhYmxlKSB7XG4gICAgICAgIC8qKiArRk9DVVMtRklHSFRJTkcgcHJldmVudGlvbiAqKi9cbiAgICAgICAgaWYgKGd1YXJkQ291bnQgPiAyKSB7XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIHJlY3Vyc2l2ZSBlbnRlcmVkIGJhY2sgdGhlIGxvY2sgYWN0aXZhdGlvblxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRm9jdXNMb2NrOiBmb2N1cy1maWdodGluZyBkZXRlY3RlZC4gT25seSBvbmUgZm9jdXMgbWFuYWdlbWVudCBzeXN0ZW0gY291bGQgYmUgYWN0aXZlLiAnICtcbiAgICAgICAgICAgICAgICAnU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVLYXNoZXkvZm9jdXMtbG9jay8jZm9jdXMtZmlnaHRpbmcnKTtcbiAgICAgICAgICAgIGxvY2tEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsb2NrRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sIDEpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGd1YXJkQ291bnQrKztcbiAgICAgICAgZm9jdXNPbihmb2N1c2FibGUubm9kZSwgb3B0aW9ucy5mb2N1c09wdGlvbnMpO1xuICAgICAgICBndWFyZENvdW50LS07XG4gICAgfVxufTtcbiIsImltcG9ydCB7IGdldFRhYmJhYmxlTm9kZXMgfSBmcm9tICcuL3V0aWxzL0RPTXV0aWxzJztcbmZ1bmN0aW9uIHdlYWtSZWYodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAvLyAjNjggU2FmYXJpIDE0LjEgZG9udCBoYXZlIGl0IHlldFxuICAgIC8vIEZJWE1FOiByZW1vdmUgaW4gMjAyNVxuICAgIGlmICh0eXBlb2YgV2Vha1JlZiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlIHx8IG51bGw7IH07XG4gICAgfVxuICAgIHZhciB3ID0gdmFsdWUgPyBuZXcgV2Vha1JlZih2YWx1ZSkgOiBudWxsO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiAodyA9PT0gbnVsbCB8fCB3ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3LmRlcmVmKCkpIHx8IG51bGw7IH07XG59XG5leHBvcnQgdmFyIHJlY29yZEVsZW1lbnRMb2NhdGlvbiA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgc3RhY2sgPSBbXTtcbiAgICB2YXIgY3VycmVudEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IHdlYWtSZWYoY3VycmVudEVsZW1lbnQpLFxuICAgICAgICAgICAgcGFyZW50OiB3ZWFrUmVmKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpLFxuICAgICAgICAgICAgbGVmdDogd2Vha1JlZihjdXJyZW50RWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSxcbiAgICAgICAgICAgIHJpZ2h0OiB3ZWFrUmVmKGN1cnJlbnRFbGVtZW50Lm5leHRFbGVtZW50U2libGluZyksXG4gICAgICAgIH0pO1xuICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnQ6IHdlYWtSZWYoZWxlbWVudCksXG4gICAgICAgIHN0YWNrOiBzdGFjayxcbiAgICAgICAgb3duZXJEb2N1bWVudDogZWxlbWVudC5vd25lckRvY3VtZW50LFxuICAgIH07XG59O1xudmFyIHJlc3RvcmVGb2N1c1RvID0gZnVuY3Rpb24gKGxvY2F0aW9uKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICBpZiAoIWxvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBzdGFjayA9IGxvY2F0aW9uLnN0YWNrLCBvd25lckRvY3VtZW50ID0gbG9jYXRpb24ub3duZXJEb2N1bWVudDtcbiAgICB2YXIgdmlzaWJpbGl0eUNhY2hlID0gbmV3IE1hcCgpO1xuICAgIGZvciAodmFyIF9pID0gMCwgc3RhY2tfMSA9IHN0YWNrOyBfaSA8IHN0YWNrXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gc3RhY2tfMVtfaV07XG4gICAgICAgIHZhciBwYXJlbnRfMSA9IChfYSA9IGxpbmUucGFyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChsaW5lKTtcbiAgICAgICAgLy8gaXMgaXQgc3RpbGwgaGVyZT9cbiAgICAgICAgaWYgKHBhcmVudF8xICYmIG93bmVyRG9jdW1lbnQuY29udGFpbnMocGFyZW50XzEpKSB7XG4gICAgICAgICAgICB2YXIgbGVmdCA9IChfYiA9IGxpbmUubGVmdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwobGluZSk7XG4gICAgICAgICAgICB2YXIgc2F2ZWRDdXJyZW50ID0gbGluZS5jdXJyZW50KCk7XG4gICAgICAgICAgICB2YXIgY3VycmVudCA9IHBhcmVudF8xLmNvbnRhaW5zKHNhdmVkQ3VycmVudCkgPyBzYXZlZEN1cnJlbnQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2YXIgcmlnaHQgPSAoX2MgPSBsaW5lLnJpZ2h0KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY2FsbChsaW5lKTtcbiAgICAgICAgICAgIHZhciBmb2N1c2FibGVzID0gZ2V0VGFiYmFibGVOb2RlcyhbcGFyZW50XzFdLCB2aXNpYmlsaXR5Q2FjaGUpO1xuICAgICAgICAgICAgdmFyIGFpbSA9IFxuICAgICAgICAgICAgLy8gdGhhdCBpcyBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgKF9lID0gKF9kID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50ICE9PSB2b2lkIDAgPyBjdXJyZW50IDogXG4gICAgICAgICAgICAvLyBvciBzb21ldGhpbmcgaW4gaXQncyBwbGFjZVxuICAgICAgICAgICAgbGVmdCA9PT0gbnVsbCB8fCBsZWZ0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsZWZ0Lm5leHRFbGVtZW50U2libGluZykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogXG4gICAgICAgICAgICAvLyBvciBzb21lYm9keSB0byB0aGUgcmlnaHQsIHN0aWxsIGNsb3NlIGVub3VnaFxuICAgICAgICAgICAgcmlnaHQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IFxuICAgICAgICAgICAgLy8gb3Igc29tZWJvZHkgdG8gdGhlIGxlZnQsIHNvbWV0aGluZz9cbiAgICAgICAgICAgIGxlZnQ7XG4gICAgICAgICAgICB3aGlsZSAoYWltKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2YgPSAwLCBmb2N1c2FibGVzXzEgPSBmb2N1c2FibGVzOyBfZiA8IGZvY3VzYWJsZXNfMS5sZW5ndGg7IF9mKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvY3VzYWJsZSA9IGZvY3VzYWJsZXNfMVtfZl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhaW0gPT09IG51bGwgfHwgYWltID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhaW0uY29udGFpbnMoZm9jdXNhYmxlLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNhYmxlLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWltID0gYWltLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb2N1c2FibGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHBhcmVudCBjb250YWlucyBhIGZvY3VzYWJsZSAtIG1vdmUgdGhlcmVcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNhYmxlc1swXS5ub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG5vdGhpbmcgbWF0Y2hlZFxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuLyoqXG4gKiBDYXB0dXJlcyB0aGUgY3VycmVudCBmb2N1c2VkIGVsZW1lbnQgdG8gcmVzdG9yZSBmb2N1cyBhcyBjbG9zZSBhcyBwb3NzaWJsZSBpbiB0aGUgZnV0dXJlXG4gKiBIYW5kbGVzIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGZvY3VzZWQgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gdGhlIERPTSBvciBubyBsb25nZXIgZm9jdXNhYmxlXG4gKiBtb3ZpbmcgZm9jdXMgdG8gdGhlIGNsb3Nlc3QgZm9jdXNhYmxlIGVsZW1lbnRcbiAqIEBwYXJhbSB0YXJnZXRFbGVtZW50IC0gZWxlbWVudCB3aGVyZSBmb2N1cyBzaG91bGQgYmUgcmVzdG9yZWRcbiAqIEByZXR1cm5zIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgbmV3IGVsZW1lbnQgdG8gZm9jdXNcbiAqL1xuZXhwb3J0IHZhciBjYXB0dXJlRm9jdXNSZXN0b3JlID0gZnVuY3Rpb24gKHRhcmdldEVsZW1lbnQpIHtcbiAgICB2YXIgbG9jYXRpb24gPSByZWNvcmRFbGVtZW50TG9jYXRpb24odGFyZ2V0RWxlbWVudCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHJlc3RvcmVGb2N1c1RvKGxvY2F0aW9uKTtcbiAgICB9O1xufTtcbiIsImltcG9ydCB7IGZvY3VzT24gfSBmcm9tICcuL2NvbW1hbmRzJztcbmltcG9ydCB7IGdldFRhYmJhYmxlTm9kZXMsIGNvbnRhaW5zLCBnZXRGb2N1c2FibGVOb2RlcyB9IGZyb20gJy4vdXRpbHMvRE9NdXRpbHMnO1xuaW1wb3J0IHsgYXNBcnJheSB9IGZyb20gJy4vdXRpbHMvYXJyYXknO1xuLyoqXG4gKiBmb3IgYSBnaXZlbiBgZWxlbWVudGAgaW4gYSBnaXZlbiBgc2NvcGVgIHJldHVybnMgZm9jdXNhYmxlIHNpYmxpbmdzXG4gKiBAcGFyYW0gZWxlbWVudCAtIGJhc2UgZWxlbWVudFxuICogQHBhcmFtIHNjb3BlIC0gY29tbW9uIHBhcmVudC4gQ2FuIGJlIGRvY3VtZW50LCBidXQgYmV0dGVyIHRvIG5hcnJvdyBpdCBkb3duIGZvciBwZXJmb3JtYW5jZSByZWFzb25zXG4gKiBAcmV0dXJucyB7cHJldixuZXh0fSAtIHJlZmVyZW5jZXMgdG8gYSBmb2N1c2FibGUgZWxlbWVudCBiZWZvcmUgYW5kIGFmdGVyXG4gKiBAcmV0dXJucyB1bmRlZmluZWQgLSBpZiBvcGVyYXRpb24gaXMgbm90IGFwcGxpY2FibGVcbiAqL1xuZXhwb3J0IHZhciBnZXRSZWxhdGl2ZUZvY3VzYWJsZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBzY29wZSwgdXNlVGFiYmFibGVzKSB7XG4gICAgaWYgKCFlbGVtZW50IHx8ICFzY29wZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdubyBlbGVtZW50IG9yIHNjb3BlIGdpdmVuJyk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgdmFyIHNoYXJkcyA9IGFzQXJyYXkoc2NvcGUpO1xuICAgIGlmIChzaGFyZHMuZXZlcnkoZnVuY3Rpb24gKHNoYXJkKSB7IHJldHVybiAhY29udGFpbnMoc2hhcmQsIGVsZW1lbnQpOyB9KSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBY3RpdmUgZWxlbWVudCBpcyBub3QgY29udGFpbmVkIGluIHRoZSBzY29wZScpO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHZhciBmb2N1c2FibGVzID0gdXNlVGFiYmFibGVzXG4gICAgICAgID8gZ2V0VGFiYmFibGVOb2RlcyhzaGFyZHMsIG5ldyBNYXAoKSlcbiAgICAgICAgOiBnZXRGb2N1c2FibGVOb2RlcyhzaGFyZHMsIG5ldyBNYXAoKSk7XG4gICAgdmFyIGN1cnJlbnQgPSBmb2N1c2FibGVzLmZpbmRJbmRleChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBfYS5ub2RlO1xuICAgICAgICByZXR1cm4gbm9kZSA9PT0gZWxlbWVudDtcbiAgICB9KTtcbiAgICBpZiAoY3VycmVudCA9PT0gLTEpIHtcbiAgICAgICAgLy8gYW4gZWRnZSBjYXNlLCB3aGVuIGFuY2hvciBlbGVtZW50IGlzIG5vdCBmb3VuZFxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBwcmV2OiBmb2N1c2FibGVzW2N1cnJlbnQgLSAxXSxcbiAgICAgICAgbmV4dDogZm9jdXNhYmxlc1tjdXJyZW50ICsgMV0sXG4gICAgICAgIGZpcnN0OiBmb2N1c2FibGVzWzBdLFxuICAgICAgICBsYXN0OiBmb2N1c2FibGVzW2ZvY3VzYWJsZXMubGVuZ3RoIC0gMV0sXG4gICAgfTtcbn07XG52YXIgZ2V0Qm91bmRhcnkgPSBmdW5jdGlvbiAoc2hhcmRzLCB1c2VUYWJiYWJsZXMpIHtcbiAgICB2YXIgc2V0ID0gdXNlVGFiYmFibGVzXG4gICAgICAgID8gZ2V0VGFiYmFibGVOb2Rlcyhhc0FycmF5KHNoYXJkcyksIG5ldyBNYXAoKSlcbiAgICAgICAgOiBnZXRGb2N1c2FibGVOb2Rlcyhhc0FycmF5KHNoYXJkcyksIG5ldyBNYXAoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmlyc3Q6IHNldFswXSxcbiAgICAgICAgbGFzdDogc2V0W3NldC5sZW5ndGggLSAxXSxcbiAgICB9O1xufTtcbnZhciBkZWZhdWx0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBzY29wZTogZG9jdW1lbnQuYm9keSxcbiAgICAgICAgY3ljbGU6IHRydWUsXG4gICAgICAgIG9ubHlUYWJiYWJsZTogdHJ1ZSxcbiAgICB9LCBvcHRpb25zKTtcbn07XG52YXIgbW92ZUZvY3VzID0gZnVuY3Rpb24gKGZyb21FbGVtZW50LCBvcHRpb25zLCBjYikge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgdmFyIG5ld09wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucyhvcHRpb25zKTtcbiAgICB2YXIgc29sdXRpb24gPSBnZXRSZWxhdGl2ZUZvY3VzYWJsZShmcm9tRWxlbWVudCwgbmV3T3B0aW9ucy5zY29wZSwgbmV3T3B0aW9ucy5vbmx5VGFiYmFibGUpO1xuICAgIGlmICghc29sdXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGFyZ2V0ID0gY2Ioc29sdXRpb24sIG5ld09wdGlvbnMuY3ljbGUpO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgZm9jdXNPbih0YXJnZXQubm9kZSwgbmV3T3B0aW9ucy5mb2N1c09wdGlvbnMpO1xuICAgIH1cbn07XG4vKipcbiAqIGZvY3VzZXMgbmV4dCBlbGVtZW50IGluIHRoZSB0YWItb3JkZXJcbiAqIEBwYXJhbSBmcm9tRWxlbWVudCAtIGNvbW1vbiBwYXJlbnQgdG8gc2NvcGUgYWN0aXZlIGVsZW1lbnQgc2VhcmNoIG9yIHRhYiBjeWNsZSBvcmRlclxuICogQHBhcmFtIHtGb2N1c05leHRPcHRpb25zfSBbb3B0aW9uc10gLSBmb2N1cyBvcHRpb25zXG4gKi9cbmV4cG9ydCB2YXIgZm9jdXNOZXh0RWxlbWVudCA9IGZ1bmN0aW9uIChmcm9tRWxlbWVudCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgbW92ZUZvY3VzKGZyb21FbGVtZW50LCBvcHRpb25zLCBmdW5jdGlvbiAoX2EsIGN5Y2xlKSB7XG4gICAgICAgIHZhciBuZXh0ID0gX2EubmV4dCwgZmlyc3QgPSBfYS5maXJzdDtcbiAgICAgICAgcmV0dXJuIG5leHQgfHwgKGN5Y2xlICYmIGZpcnN0KTtcbiAgICB9KTtcbn07XG4vKipcbiAqIGZvY3VzZXMgcHJldiBlbGVtZW50IGluIHRoZSB0YWIgb3JkZXJcbiAqIEBwYXJhbSBmcm9tRWxlbWVudCAtIGNvbW1vbiBwYXJlbnQgdG8gc2NvcGUgYWN0aXZlIGVsZW1lbnQgc2VhcmNoIG9yIHRhYiBjeWNsZSBvcmRlclxuICogQHBhcmFtIHtGb2N1c05leHRPcHRpb25zfSBbb3B0aW9uc10gLSBmb2N1cyBvcHRpb25zXG4gKi9cbmV4cG9ydCB2YXIgZm9jdXNQcmV2RWxlbWVudCA9IGZ1bmN0aW9uIChmcm9tRWxlbWVudCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgbW92ZUZvY3VzKGZyb21FbGVtZW50LCBvcHRpb25zLCBmdW5jdGlvbiAoX2EsIGN5Y2xlKSB7XG4gICAgICAgIHZhciBwcmV2ID0gX2EucHJldiwgbGFzdCA9IF9hLmxhc3Q7XG4gICAgICAgIHJldHVybiBwcmV2IHx8IChjeWNsZSAmJiBsYXN0KTtcbiAgICB9KTtcbn07XG52YXIgcGlja0JvdW5kYXJ5ID0gZnVuY3Rpb24gKHNjb3BlLCBvcHRpb25zLCB3aGF0KSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBib3VuZGFyeSA9IGdldEJvdW5kYXJ5KHNjb3BlLCAoX2EgPSBvcHRpb25zLm9ubHlUYWJiYWJsZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZSk7XG4gICAgdmFyIG5vZGUgPSBib3VuZGFyeVt3aGF0XTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgICBmb2N1c09uKG5vZGUubm9kZSwgb3B0aW9ucy5mb2N1c09wdGlvbnMpO1xuICAgIH1cbn07XG4vKipcbiAqIGZvY3VzZXMgZmlyc3QgZWxlbWVudCBpbiB0aGUgdGFiLW9yZGVyXG4gKiBAcGFyYW0ge0ZvY3VzTmV4dE9wdGlvbnN9IG9wdGlvbnMgLSBmb2N1cyBvcHRpb25zXG4gKi9cbmV4cG9ydCB2YXIgZm9jdXNGaXJzdEVsZW1lbnQgPSBmdW5jdGlvbiAoc2NvcGUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHBpY2tCb3VuZGFyeShzY29wZSwgb3B0aW9ucywgJ2ZpcnN0Jyk7XG59O1xuLyoqXG4gKiBmb2N1c2VzIGxhc3QgZWxlbWVudCBpbiB0aGUgdGFiIG9yZGVyXG4gKiBAcGFyYW0ge0ZvY3VzTmV4dE9wdGlvbnN9IG9wdGlvbnMgLSBmb2N1cyBvcHRpb25zXG4gKi9cbmV4cG9ydCB2YXIgZm9jdXNMYXN0RWxlbWVudCA9IGZ1bmN0aW9uIChzY29wZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgcGlja0JvdW5kYXJ5KHNjb3BlLCBvcHRpb25zLCAnbGFzdCcpO1xufTtcbiIsImltcG9ydCB7IGNvcnJlY3ROb2RlcyB9IGZyb20gJy4vdXRpbHMvY29ycmVjdEZvY3VzJztcbmltcG9ydCB7IHBpY2tGb2N1c2FibGUgfSBmcm9tICcuL3V0aWxzL2ZpcnN0Rm9jdXMnO1xuaW1wb3J0IHsgaXNHdWFyZCB9IGZyb20gJy4vdXRpbHMvaXMnO1xuZXhwb3J0IHZhciBORVdfRk9DVVMgPSAnTkVXX0ZPQ1VTJztcbi8qKlxuICogTWFpbiBzb2x2ZXIgZm9yIHRoZSBcImZpbmQgbmV4dCBmb2N1c1wiIHF1ZXN0aW9uXG4gKiBAcGFyYW0gaW5uZXJOb2RlcyAtIHVzZWQgdG8gY29udHJvbCBcInJldHVybiBmb2N1c1wiXG4gKiBAcGFyYW0gaW5uZXJUYWJiYWJsZXMgLSB1c2VkIHRvIGNvbnRyb2wgXCJhdXRvZm9jdXNcIlxuICogQHBhcmFtIG91dGVyTm9kZXNcbiAqIEBwYXJhbSBhY3RpdmVFbGVtZW50XG4gKiBAcGFyYW0gbGFzdE5vZGVcbiAqIEByZXR1cm5zIHtudW1iZXJ8c3RyaW5nfHVuZGVmaW5lZHwqfVxuICovXG5leHBvcnQgdmFyIG5ld0ZvY3VzID0gZnVuY3Rpb24gKGlubmVyTm9kZXMsIGlubmVyVGFiYmFibGVzLCBvdXRlck5vZGVzLCBhY3RpdmVFbGVtZW50LCBsYXN0Tm9kZSkge1xuICAgIHZhciBjbnQgPSBpbm5lck5vZGVzLmxlbmd0aDtcbiAgICB2YXIgZmlyc3RGb2N1cyA9IGlubmVyTm9kZXNbMF07XG4gICAgdmFyIGxhc3RGb2N1cyA9IGlubmVyTm9kZXNbY250IC0gMV07XG4gICAgdmFyIGlzT25HdWFyZCA9IGlzR3VhcmQoYWN0aXZlRWxlbWVudCk7XG4gICAgLy8gZm9jdXMgaXMgaW5zaWRlXG4gICAgaWYgKGFjdGl2ZUVsZW1lbnQgJiYgaW5uZXJOb2Rlcy5pbmRleE9mKGFjdGl2ZUVsZW1lbnQpID49IDApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gYWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gb3V0ZXJOb2Rlcy5pbmRleE9mKGFjdGl2ZUVsZW1lbnQpIDogLTE7XG4gICAgdmFyIGxhc3RJbmRleCA9IGxhc3ROb2RlID8gb3V0ZXJOb2Rlcy5pbmRleE9mKGxhc3ROb2RlKSA6IGFjdGl2ZUluZGV4O1xuICAgIHZhciBsYXN0Tm9kZUluc2lkZSA9IGxhc3ROb2RlID8gaW5uZXJOb2Rlcy5pbmRleE9mKGxhc3ROb2RlKSA6IC0xO1xuICAgIC8vIG5vIGFjdGl2ZSBmb2N1cyAob3IgZm9jdXMgaXMgb24gdGhlIGJvZHkpXG4gICAgaWYgKGFjdGl2ZUluZGV4ID09PSAtMSkge1xuICAgICAgICAvLyBrbm93biBmYWxsYmFja1xuICAgICAgICBpZiAobGFzdE5vZGVJbnNpZGUgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbGFzdE5vZGVJbnNpZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE5FV19GT0NVUztcbiAgICB9XG4gICAgLy8gbmV3IGZvY3VzLCBub3RoaW5nIHRvIGNhbGN1bGF0ZVxuICAgIGlmIChsYXN0Tm9kZUluc2lkZSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIE5FV19GT0NVUztcbiAgICB9XG4gICAgdmFyIGluZGV4RGlmZiA9IGFjdGl2ZUluZGV4IC0gbGFzdEluZGV4O1xuICAgIHZhciBmaXJzdE5vZGVJbmRleCA9IG91dGVyTm9kZXMuaW5kZXhPZihmaXJzdEZvY3VzKTtcbiAgICB2YXIgbGFzdE5vZGVJbmRleCA9IG91dGVyTm9kZXMuaW5kZXhPZihsYXN0Rm9jdXMpO1xuICAgIHZhciBjb3JyZWN0ZWROb2RlcyA9IGNvcnJlY3ROb2RlcyhvdXRlck5vZGVzKTtcbiAgICB2YXIgY29ycmVjdGVkSW5kZXggPSBhY3RpdmVFbGVtZW50ICE9PSB1bmRlZmluZWQgPyBjb3JyZWN0ZWROb2Rlcy5pbmRleE9mKGFjdGl2ZUVsZW1lbnQpIDogLTE7XG4gICAgdmFyIGNvcnJlY3RlZEluZGV4RGlmZiA9IGNvcnJlY3RlZEluZGV4IC0gKGxhc3ROb2RlID8gY29ycmVjdGVkTm9kZXMuaW5kZXhPZihsYXN0Tm9kZSkgOiBhY3RpdmVJbmRleCk7XG4gICAgLy8gb2xkIGZvY3VzXG4gICAgaWYgKCFpbmRleERpZmYgJiYgbGFzdE5vZGVJbnNpZGUgPj0gMCkge1xuICAgICAgICByZXR1cm4gbGFzdE5vZGVJbnNpZGU7XG4gICAgfVxuICAgIC8vIG5vIHRhYmJhYmxlIGVsZW1lbnRzLCBhdXRvZm9jdXMgaXMgbm90IHBvc3NpYmxlXG4gICAgaWYgKGlubmVyVGFiYmFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBhbiBlZGdlIGNhc2Ugd2l0aCBubyB0YWJiYWJsZSBlbGVtZW50c1xuICAgICAgICAvLyByZXR1cm4gdGhlIGxhc3QgZm9jdXNhYmxlIG9uZVxuICAgICAgICAvLyB3aXRoIHNvbWUgcHJvYmFiaWxpdHkgdGhpcyB3aWxsIHByZXZlbnQgZm9jdXMgZnJvbSBjeWNsaW5nIGFjcm9zcyB0aGUgbG9jaywgYnV0IHRoZXJlIGlzIG5vIHRhYmJhbGUgZWxlbWVudHMgdG8gY3ljbGUgdG9cbiAgICAgICAgcmV0dXJuIGxhc3ROb2RlSW5zaWRlO1xuICAgIH1cbiAgICB2YXIgcmV0dXJuRmlyc3ROb2RlID0gcGlja0ZvY3VzYWJsZShpbm5lck5vZGVzLCBpbm5lclRhYmJhYmxlc1swXSk7XG4gICAgdmFyIHJldHVybkxhc3ROb2RlID0gcGlja0ZvY3VzYWJsZShpbm5lck5vZGVzLCBpbm5lclRhYmJhYmxlc1tpbm5lclRhYmJhYmxlcy5sZW5ndGggLSAxXSk7XG4gICAgLy8gZmlyc3QgZWxlbWVudFxuICAgIGlmIChhY3RpdmVJbmRleCA8PSBmaXJzdE5vZGVJbmRleCAmJiBpc09uR3VhcmQgJiYgTWF0aC5hYnMoaW5kZXhEaWZmKSA+IDEpIHtcbiAgICAgICAgcmV0dXJuIHJldHVybkxhc3ROb2RlO1xuICAgIH1cbiAgICAvLyBsYXN0IGVsZW1lbnRcbiAgICBpZiAoYWN0aXZlSW5kZXggPj0gbGFzdE5vZGVJbmRleCAmJiBpc09uR3VhcmQgJiYgTWF0aC5hYnMoaW5kZXhEaWZmKSA+IDEpIHtcbiAgICAgICAgcmV0dXJuIHJldHVybkZpcnN0Tm9kZTtcbiAgICB9XG4gICAgLy8ganVtcCBvdXQsIGJ1dCBub3Qgb24gdGhlIGd1YXJkXG4gICAgaWYgKGluZGV4RGlmZiAmJiBNYXRoLmFicyhjb3JyZWN0ZWRJbmRleERpZmYpID4gMSkge1xuICAgICAgICByZXR1cm4gbGFzdE5vZGVJbnNpZGU7XG4gICAgfVxuICAgIC8vIGZvY3VzIGFib3ZlIGxvY2tcbiAgICBpZiAoYWN0aXZlSW5kZXggPD0gZmlyc3ROb2RlSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHJldHVybkxhc3ROb2RlO1xuICAgIH1cbiAgICAvLyBmb2N1cyBiZWxvdyBsb2NrXG4gICAgaWYgKGFjdGl2ZUluZGV4ID4gbGFzdE5vZGVJbmRleCkge1xuICAgICAgICByZXR1cm4gcmV0dXJuRmlyc3ROb2RlO1xuICAgIH1cbiAgICAvLyBpbmRleCBpcyBpbnNpZGUgdGFiIG9yZGVyLCBidXQgb3V0c2lkZSBMb2NrXG4gICAgaWYgKGluZGV4RGlmZikge1xuICAgICAgICBpZiAoTWF0aC5hYnMoaW5kZXhEaWZmKSA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXN0Tm9kZUluc2lkZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGNudCArIGxhc3ROb2RlSW5zaWRlICsgaW5kZXhEaWZmKSAlIGNudDtcbiAgICB9XG4gICAgLy8gZG8gbm90aGluZ1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuIiwiaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gJy4vYXJyYXknO1xuaW1wb3J0IHsgaXNBdXRvRm9jdXNBbGxvd2VkQ2FjaGVkLCBpc1Zpc2libGVDYWNoZWQsIG5vdEhpZGRlbklucHV0IH0gZnJvbSAnLi9pcyc7XG5pbXBvcnQgeyBvcmRlckJ5VGFiSW5kZXggfSBmcm9tICcuL3RhYk9yZGVyJztcbmltcG9ydCB7IGdldEZvY3VzYWJsZXMsIGdldFBhcmVudEF1dG9mb2N1c2FibGVzIH0gZnJvbSAnLi90YWJVdGlscyc7XG4vKipcbiAqIGdpdmVuIGxpc3Qgb2YgZm9jdXNhYmxlIGVsZW1lbnRzIGtlZXBzIHRoZSBvbmVzIHVzZXIgY2FuIGludGVyYWN0IHdpdGhcbiAqIEBwYXJhbSBub2Rlc1xuICogQHBhcmFtIHZpc2liaWxpdHlDYWNoZVxuICovXG5leHBvcnQgdmFyIGZpbHRlckZvY3VzYWJsZSA9IGZ1bmN0aW9uIChub2RlcywgdmlzaWJpbGl0eUNhY2hlKSB7XG4gICAgcmV0dXJuIHRvQXJyYXkobm9kZXMpXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGlzVmlzaWJsZUNhY2hlZCh2aXNpYmlsaXR5Q2FjaGUsIG5vZGUpOyB9KVxuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub3RIaWRkZW5JbnB1dChub2RlKTsgfSk7XG59O1xuZXhwb3J0IHZhciBmaWx0ZXJBdXRvRm9jdXNhYmxlID0gZnVuY3Rpb24gKG5vZGVzLCBjYWNoZSkge1xuICAgIGlmIChjYWNoZSA9PT0gdm9pZCAwKSB7IGNhY2hlID0gbmV3IE1hcCgpOyB9XG4gICAgcmV0dXJuIHRvQXJyYXkobm9kZXMpLmZpbHRlcihmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gaXNBdXRvRm9jdXNBbGxvd2VkQ2FjaGVkKGNhY2hlLCBub2RlKTsgfSk7XG59O1xuLyoqXG4gKiAhX19XQVJOSU5HX18hIExvdyBsZXZlbCBBUEkuXG4gKiBAcmV0dXJucyBhbGwgdGFiYmFibGUgbm9kZXNcbiAqXG4gKiBAc2VlIHtAbGluayBnZXRGb2N1c2FibGVOb2Rlc30gdG8gZ2V0IGFueSBmb2N1c2FibGUgZWxlbWVudFxuICpcbiAqIEBwYXJhbSB0b3BOb2RlcyAtIGFycmF5IG9mIHRvcCBsZXZlbCBIVE1MRWxlbWVudHMgdG8gc2VhcmNoIGluc2lkZVxuICogQHBhcmFtIHZpc2liaWxpdHlDYWNoZSAtIGFuIGNhY2hlIHRvIHN0b3JlIGludGVybWVkaWF0ZSBtZWFzdXJlbWVudHMuIEV4cGVjdGVkIHRvIGJlIGEgZnJlc2ggYG5ldyBNYXBgIG9uIGV2ZXJ5IGNhbGxcbiAqL1xuZXhwb3J0IHZhciBnZXRUYWJiYWJsZU5vZGVzID0gZnVuY3Rpb24gKHRvcE5vZGVzLCB2aXNpYmlsaXR5Q2FjaGUsIHdpdGhHdWFyZHMpIHtcbiAgICByZXR1cm4gb3JkZXJCeVRhYkluZGV4KGZpbHRlckZvY3VzYWJsZShnZXRGb2N1c2FibGVzKHRvcE5vZGVzLCB3aXRoR3VhcmRzKSwgdmlzaWJpbGl0eUNhY2hlKSwgdHJ1ZSwgd2l0aEd1YXJkcyk7XG59O1xuLyoqXG4gKiAhX19XQVJOSU5HX18hIExvdyBsZXZlbCBBUEkuXG4gKlxuICogQHJldHVybnMgYW55dGhpbmcgXCJmb2N1c2FibGVcIiwgbm90IG9ubHkgdGFiYmFibGUuIFRoZSBkaWZmZXJlbmNlIGlzIGluIGB0YWJJbmRleD0tMWBcbiAqICh3aXRob3V0IGd1YXJkcywgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3QgZXhwZWN0ZWQgdG8gYmUgZXZlciBmb2N1c2VkKVxuICpcbiAqIEBzZWUge0BsaW5rIGdldFRhYmJhYmxlTm9kZXN9IHRvIGdldCBvbmx5IHRhYmJsZSBub2RlcyBlbGVtZW50XG4gKlxuICogQHBhcmFtIHRvcE5vZGVzIC0gYXJyYXkgb2YgdG9wIGxldmVsIEhUTUxFbGVtZW50cyB0byBzZWFyY2ggaW5zaWRlXG4gKiBAcGFyYW0gdmlzaWJpbGl0eUNhY2hlIC0gYW4gY2FjaGUgdG8gc3RvcmUgaW50ZXJtZWRpYXRlIG1lYXN1cmVtZW50cy4gRXhwZWN0ZWQgdG8gYmUgYSBmcmVzaCBgbmV3IE1hcGAgb24gZXZlcnkgY2FsbFxuICovXG5leHBvcnQgdmFyIGdldEZvY3VzYWJsZU5vZGVzID0gZnVuY3Rpb24gKHRvcE5vZGVzLCB2aXNpYmlsaXR5Q2FjaGUpIHtcbiAgICByZXR1cm4gb3JkZXJCeVRhYkluZGV4KGZpbHRlckZvY3VzYWJsZShnZXRGb2N1c2FibGVzKHRvcE5vZGVzKSwgdmlzaWJpbGl0eUNhY2hlKSwgZmFsc2UpO1xufTtcbi8qKlxuICogcmV0dXJuIGxpc3Qgb2Ygbm9kZXMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvIGJlIGF1dG8tZm9jdXNlZFxuICogQHBhcmFtIHRvcE5vZGVcbiAqIEBwYXJhbSB2aXNpYmlsaXR5Q2FjaGVcbiAqL1xuZXhwb3J0IHZhciBwYXJlbnRBdXRvZm9jdXNhYmxlcyA9IGZ1bmN0aW9uICh0b3BOb2RlLCB2aXNpYmlsaXR5Q2FjaGUpIHtcbiAgICByZXR1cm4gZmlsdGVyRm9jdXNhYmxlKGdldFBhcmVudEF1dG9mb2N1c2FibGVzKHRvcE5vZGUpLCB2aXNpYmlsaXR5Q2FjaGUpO1xufTtcbi8qXG4gKiBEZXRlcm1pbmVzIGlmIGVsZW1lbnQgaXMgY29udGFpbmVkIGluIHNjb3BlLCBpbmNsdWRpbmcgbmVzdGVkIHNoYWRvdyBET01zXG4gKi9cbmV4cG9ydCB2YXIgY29udGFpbnMgPSBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQpIHtcbiAgICBpZiAoc2NvcGUuc2hhZG93Um9vdCkge1xuICAgICAgICByZXR1cm4gY29udGFpbnMoc2NvcGUuc2hhZG93Um9vdCwgZWxlbWVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHNjb3BlKS5jb250YWlucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc2NvcGUpLmNvbnRhaW5zLmNhbGwoc2NvcGUsIGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9BcnJheShzY29wZS5jaGlsZHJlbikuc29tZShmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGlmcmFtZUJvZHkgPSAoX2EgPSBjaGlsZC5jb250ZW50RG9jdW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ib2R5O1xuICAgICAgICAgICAgICAgIGlmIChpZnJhbWVCb2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWlucyhpZnJhbWVCb2R5LCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKGNoaWxkLCBlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcbiIsImltcG9ydCB7IEZPQ1VTX0RJU0FCTEVELCBGT0NVU19HUk9VUCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBhc0FycmF5LCB0b0FycmF5IH0gZnJvbSAnLi9hcnJheSc7XG4vKipcbiAqIGluIGNhc2Ugb2YgbXVsdGlwbGUgbm9kZXMgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyXG4gKiBrZWVwcyBvbmx5IHRvcCBvbmVzXG4gKiB0aGlzIGlzIE8obmxvZ24pXG4gKiBAcGFyYW0gbm9kZXNcbiAqIEByZXR1cm5zIHsqfVxuICovXG52YXIgZmlsdGVyTmVzdGVkID0gZnVuY3Rpb24gKG5vZGVzKSB7XG4gICAgdmFyIGNvbnRhaW5lZCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgbCA9IG5vZGVzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkgKz0gMSkge1xuICAgICAgICBmb3IgKHZhciBqID0gaSArIDE7IGogPCBsOyBqICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IG5vZGVzW2ldLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGVzW2pdKTtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cbiAgICAgICAgICAgIGlmICgocG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVkLmFkZChqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgocG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TKSA+IDApIHtcbiAgICAgICAgICAgICAgICBjb250YWluZWQuYWRkKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSAqL1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKF8sIGluZGV4KSB7IHJldHVybiAhY29udGFpbmVkLmhhcyhpbmRleCk7IH0pO1xufTtcbi8qKlxuICogZmluZHMgdG9wIG1vc3QgcGFyZW50IGZvciBhIG5vZGVcbiAqIEBwYXJhbSBub2RlXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xudmFyIGdldFRvcFBhcmVudCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZSA/IGdldFRvcFBhcmVudChub2RlLnBhcmVudE5vZGUpIDogbm9kZTtcbn07XG4vKipcbiAqIHJldHVybnMgYWxsIFwiZm9jdXMgY29udGFpbmVyc1wiIGluc2lkZSBhIGdpdmVuIG5vZGVcbiAqIEBwYXJhbSBub2RlIC0gbm9kZSBvciBub2RlcyB0byBsb29rIGluc2lkZVxuICogQHJldHVybnMgRWxlbWVudFtdXG4gKi9cbmV4cG9ydCB2YXIgZ2V0QWxsQWZmZWN0ZWROb2RlcyA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIG5vZGVzID0gYXNBcnJheShub2RlKTtcbiAgICByZXR1cm4gbm9kZXMuZmlsdGVyKEJvb2xlYW4pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjdXJyZW50Tm9kZSkge1xuICAgICAgICB2YXIgZ3JvdXAgPSBjdXJyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoRk9DVVNfR1JPVVApO1xuICAgICAgICBhY2MucHVzaC5hcHBseShhY2MsIChncm91cFxuICAgICAgICAgICAgPyBmaWx0ZXJOZXN0ZWQodG9BcnJheShnZXRUb3BQYXJlbnQoY3VycmVudE5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbXCIuY29uY2F0KEZPQ1VTX0dST1VQLCBcIj1cXFwiXCIpLmNvbmNhdChncm91cCwgXCJcXFwiXTpub3QoW1wiKS5jb25jYXQoRk9DVVNfRElTQUJMRUQsIFwiPVxcXCJkaXNhYmxlZFxcXCJdKVwiKSkpKVxuICAgICAgICAgICAgOiBbY3VycmVudE5vZGVdKSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xufTtcbiIsIi8qXG5JRTExIHN1cHBvcnRcbiAqL1xuZXhwb3J0IHZhciB0b0FycmF5ID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgcmV0ID0gQXJyYXkoYS5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkge1xuICAgICAgICByZXRbaV0gPSBhW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufTtcbmV4cG9ydCB2YXIgYXNBcnJheSA9IGZ1bmN0aW9uIChhKSB7IHJldHVybiAoQXJyYXkuaXNBcnJheShhKSA/IGEgOiBbYV0pOyB9O1xuZXhwb3J0IHZhciBnZXRGaXJzdCA9IGZ1bmN0aW9uIChhKSB7IHJldHVybiAoQXJyYXkuaXNBcnJheShhKSA/IGFbMF0gOiBhKTsgfTtcbiIsImltcG9ydCB7IGZpbHRlckF1dG9Gb2N1c2FibGUgfSBmcm9tICcuL0RPTXV0aWxzJztcbmltcG9ydCB7IHBpY2tGaXJzdEZvY3VzIH0gZnJvbSAnLi9maXJzdEZvY3VzJztcbmltcG9ydCB7IGdldERhdGFzZXQgfSBmcm9tICcuL2lzJztcbnZhciBmaW5kQXV0b0ZvY3VzZWQgPSBmdW5jdGlvbiAoYXV0b0ZvY3VzYWJsZXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYXV0b2ZvY3VzID0gKF9hID0gZ2V0RGF0YXNldChub2RlKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmF1dG9mb2N1cztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBub2RlLmF1dG9mb2N1cyB8fFxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIChhdXRvZm9jdXMgIT09IHVuZGVmaW5lZCAmJiBhdXRvZm9jdXMgIT09ICdmYWxzZScpIHx8XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgYXV0b0ZvY3VzYWJsZXMuaW5kZXhPZihub2RlKSA+PSAwKTtcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgcGlja0F1dG9mb2N1cyA9IGZ1bmN0aW9uIChub2Rlc0luZGV4ZXMsIG9yZGVyZWROb2RlcywgZ3JvdXBzKSB7XG4gICAgdmFyIG5vZGVzID0gbm9kZXNJbmRleGVzLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBfYS5ub2RlO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9KTtcbiAgICB2YXIgYXV0b0ZvY3VzYWJsZSA9IGZpbHRlckF1dG9Gb2N1c2FibGUobm9kZXMuZmlsdGVyKGZpbmRBdXRvRm9jdXNlZChncm91cHMpKSk7XG4gICAgaWYgKGF1dG9Gb2N1c2FibGUgJiYgYXV0b0ZvY3VzYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHBpY2tGaXJzdEZvY3VzKGF1dG9Gb2N1c2FibGUpO1xuICAgIH1cbiAgICByZXR1cm4gcGlja0ZpcnN0Rm9jdXMoZmlsdGVyQXV0b0ZvY3VzYWJsZShvcmRlcmVkTm9kZXMpKTtcbn07XG4iLCJpbXBvcnQgeyBpc1JhZGlvRWxlbWVudCB9IGZyb20gJy4vaXMnO1xudmFyIGZpbmRTZWxlY3RlZFJhZGlvID0gZnVuY3Rpb24gKG5vZGUsIG5vZGVzKSB7XG4gICAgcmV0dXJuIG5vZGVzXG4gICAgICAgIC5maWx0ZXIoaXNSYWRpb0VsZW1lbnQpXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5uYW1lID09PSBub2RlLm5hbWU7IH0pXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5jaGVja2VkOyB9KVswXSB8fCBub2RlO1xufTtcbmV4cG9ydCB2YXIgY29ycmVjdE5vZGUgPSBmdW5jdGlvbiAobm9kZSwgbm9kZXMpIHtcbiAgICBpZiAoaXNSYWRpb0VsZW1lbnQobm9kZSkgJiYgbm9kZS5uYW1lKSB7XG4gICAgICAgIHJldHVybiBmaW5kU2VsZWN0ZWRSYWRpbyhub2RlLCBub2Rlcyk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xufTtcbi8qKlxuICogZ2l2aW5nIGEgc2V0IG9mIHJhZGlvIGlucHV0cyBrZWVwcyBvbmx5IHNlbGVjdGVkICh0YWJiYWJsZSkgb25lc1xuICogQHBhcmFtIG5vZGVzXG4gKi9cbmV4cG9ydCB2YXIgY29ycmVjdE5vZGVzID0gZnVuY3Rpb24gKG5vZGVzKSB7XG4gICAgLy8gSUUxMSBoYXMgbm8gU2V0KGFycmF5KSBjb25zdHJ1Y3RvclxuICAgIHZhciByZXN1bHRTZXQgPSBuZXcgU2V0KCk7XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gcmVzdWx0U2V0LmFkZChjb3JyZWN0Tm9kZShub2RlLCBub2RlcykpOyB9KTtcbiAgICAvLyB1c2luZyBmaWx0ZXIgdG8gc3VwcG9ydCBJRTExXG4gICAgcmV0dXJuIG5vZGVzLmZpbHRlcihmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gcmVzdWx0U2V0Lmhhcyhub2RlKTsgfSk7XG59O1xuIiwiaW1wb3J0IHsgY29ycmVjdE5vZGUgfSBmcm9tICcuL2NvcnJlY3RGb2N1cyc7XG5leHBvcnQgdmFyIHBpY2tGaXJzdEZvY3VzID0gZnVuY3Rpb24gKG5vZGVzKSB7XG4gICAgaWYgKG5vZGVzWzBdICYmIG5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIGNvcnJlY3ROb2RlKG5vZGVzWzBdLCBub2Rlcyk7XG4gICAgfVxuICAgIHJldHVybiBub2Rlc1swXTtcbn07XG5leHBvcnQgdmFyIHBpY2tGb2N1c2FibGUgPSBmdW5jdGlvbiAobm9kZXMsIG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZXMuaW5kZXhPZihjb3JyZWN0Tm9kZShub2RlLCBub2RlcykpO1xufTtcbiIsIi8qKlxuICogcmV0dXJucyBhY3RpdmUgZWxlbWVudCBmcm9tIGRvY3VtZW50IG9yIGZyb20gbmVzdGVkIHNoYWRvd2RvbXNcbiAqL1xuaW1wb3J0IHsgc2FmZVByb2JlIH0gZnJvbSAnLi9zYWZlJztcbi8qKlxuICogcmV0dXJucyBjdXJyZW50IGFjdGl2ZSBlbGVtZW50LiBJZiB0aGUgYWN0aXZlIGVsZW1lbnQgaXMgYSBcImNvbnRhaW5lclwiIGl0c2VsZihzaGFkb3dSb290IG9yIGlmcmFtZSkgcmV0dXJucyBhY3RpdmUgZWxlbWVudCBpbnNpZGUgaXRcbiAqIEBwYXJhbSBbaW5Eb2N1bWVudF1cbiAqL1xuZXhwb3J0IHZhciBnZXRBY3RpdmVFbGVtZW50ID0gZnVuY3Rpb24gKGluRG9jdW1lbnQpIHtcbiAgICBpZiAoaW5Eb2N1bWVudCA9PT0gdm9pZCAwKSB7IGluRG9jdW1lbnQgPSBkb2N1bWVudDsgfVxuICAgIGlmICghaW5Eb2N1bWVudCB8fCAhaW5Eb2N1bWVudC5hY3RpdmVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBhY3RpdmVFbGVtZW50ID0gaW5Eb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIHJldHVybiAoYWN0aXZlRWxlbWVudC5zaGFkb3dSb290XG4gICAgICAgID8gZ2V0QWN0aXZlRWxlbWVudChhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3QpXG4gICAgICAgIDogYWN0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJRnJhbWVFbGVtZW50ICYmIHNhZmVQcm9iZShmdW5jdGlvbiAoKSB7IHJldHVybiBhY3RpdmVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7IH0pXG4gICAgICAgICAgICA/IGdldEFjdGl2ZUVsZW1lbnQoYWN0aXZlRWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50KVxuICAgICAgICAgICAgOiBhY3RpdmVFbGVtZW50KTtcbn07XG4iLCJpbXBvcnQgeyBGT0NVU19OT19BVVRPRk9DVVMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xudmFyIGlzRWxlbWVudEhpZGRlbiA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gd2UgY2FuIG1lYXN1cmUgb25seSBcImVsZW1lbnRzXCJcbiAgICAvLyBjb25zaWRlciBvdGhlcnMgYXMgXCJ2aXNpYmxlXCJcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpO1xuICAgIGlmICghY29tcHV0ZWRTdHlsZSB8fCAhY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAnaGlkZGVuJyk7XG59O1xudmFyIGdldFBhcmVudE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIC8vIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgY2FuIGFsc28gcG9pbnQgb24gU2hhZG93Um9vdC4gSW4gdGhpcyBjYXNlIC5ob3N0IHdpbGwgcG9pbnQgb24gdGhlIG5leHQgbm9kZVxuICAgIHJldHVybiBub2RlLnBhcmVudE5vZGUgJiYgbm9kZS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREVcbiAgICAgICAgPyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLmhvc3RcbiAgICAgICAgOiBub2RlLnBhcmVudE5vZGU7XG59O1xudmFyIGlzVG9wTm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBub2RlID09PSBkb2N1bWVudCB8fCAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSBOb2RlLkRPQ1VNRU5UX05PREUpO1xufTtcbnZhciBpc0luZXJ0ID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUuaGFzQXR0cmlidXRlKCdpbmVydCcpOyB9O1xuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90ZXN0aW5nLWxpYnJhcnkvamVzdC1kb20vYmxvYi9tYWluL3NyYy90by1iZS12aXNpYmxlLmpzXG4gKi9cbnZhciBpc1Zpc2libGVVbmNhY2hlZCA9IGZ1bmN0aW9uIChub2RlLCBjaGVja1BhcmVudCkge1xuICAgIHJldHVybiAhbm9kZSB8fCBpc1RvcE5vZGUobm9kZSkgfHwgKCFpc0VsZW1lbnRIaWRkZW4obm9kZSkgJiYgIWlzSW5lcnQobm9kZSkgJiYgY2hlY2tQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSkpO1xufTtcbmV4cG9ydCB2YXIgaXNWaXNpYmxlQ2FjaGVkID0gZnVuY3Rpb24gKHZpc2liaWxpdHlDYWNoZSwgbm9kZSkge1xuICAgIHZhciBjYWNoZWQgPSB2aXNpYmlsaXR5Q2FjaGUuZ2V0KG5vZGUpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gaXNWaXNpYmxlVW5jYWNoZWQobm9kZSwgaXNWaXNpYmxlQ2FjaGVkLmJpbmQodW5kZWZpbmVkLCB2aXNpYmlsaXR5Q2FjaGUpKTtcbiAgICB2aXNpYmlsaXR5Q2FjaGUuc2V0KG5vZGUsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgaXNBdXRvRm9jdXNBbGxvd2VkVW5jYWNoZWQgPSBmdW5jdGlvbiAobm9kZSwgY2hlY2tQYXJlbnQpIHtcbiAgICByZXR1cm4gbm9kZSAmJiAhaXNUb3BOb2RlKG5vZGUpID8gKGlzQXV0b0ZvY3VzQWxsb3dlZChub2RlKSA/IGNoZWNrUGFyZW50KGdldFBhcmVudE5vZGUobm9kZSkpIDogZmFsc2UpIDogdHJ1ZTtcbn07XG5leHBvcnQgdmFyIGlzQXV0b0ZvY3VzQWxsb3dlZENhY2hlZCA9IGZ1bmN0aW9uIChjYWNoZSwgbm9kZSkge1xuICAgIHZhciBjYWNoZWQgPSBjYWNoZS5nZXQobm9kZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBpc0F1dG9Gb2N1c0FsbG93ZWRVbmNhY2hlZChub2RlLCBpc0F1dG9Gb2N1c0FsbG93ZWRDYWNoZWQuYmluZCh1bmRlZmluZWQsIGNhY2hlKSk7XG4gICAgY2FjaGUuc2V0KG5vZGUsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgdmFyIGdldERhdGFzZXQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gbm9kZS5kYXRhc2V0O1xufTtcbmV4cG9ydCB2YXIgaXNIVE1MQnV0dG9uRWxlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdCVVRUT04nOyB9O1xuZXhwb3J0IHZhciBpc0hUTUxJbnB1dEVsZW1lbnQgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS50YWdOYW1lID09PSAnSU5QVVQnOyB9O1xuZXhwb3J0IHZhciBpc1JhZGlvRWxlbWVudCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIGlzSFRNTElucHV0RWxlbWVudChub2RlKSAmJiBub2RlLnR5cGUgPT09ICdyYWRpbyc7XG59O1xuZXhwb3J0IHZhciBub3RIaWRkZW5JbnB1dCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuICEoKGlzSFRNTElucHV0RWxlbWVudChub2RlKSB8fCBpc0hUTUxCdXR0b25FbGVtZW50KG5vZGUpKSAmJiAobm9kZS50eXBlID09PSAnaGlkZGVuJyB8fCBub2RlLmRpc2FibGVkKSk7XG59O1xuZXhwb3J0IHZhciBpc0F1dG9Gb2N1c0FsbG93ZWQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBhdHRyaWJ1dGUgPSBub2RlLmdldEF0dHJpYnV0ZShGT0NVU19OT19BVVRPRk9DVVMpO1xuICAgIHJldHVybiAhW3RydWUsICd0cnVlJywgJyddLmluY2x1ZGVzKGF0dHJpYnV0ZSk7XG59O1xuZXhwb3J0IHZhciBpc0d1YXJkID0gZnVuY3Rpb24gKG5vZGUpIHsgdmFyIF9hOyByZXR1cm4gQm9vbGVhbihub2RlICYmICgoX2EgPSBnZXREYXRhc2V0KG5vZGUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9jdXNHdWFyZCkpOyB9O1xuZXhwb3J0IHZhciBpc05vdEFHdWFyZCA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiAhaXNHdWFyZChub2RlKTsgfTtcbmV4cG9ydCB2YXIgaXNEZWZpbmVkID0gZnVuY3Rpb24gKHgpIHsgcmV0dXJuIEJvb2xlYW4oeCk7IH07XG4iLCJpbXBvcnQgeyBwYXJlbnRBdXRvZm9jdXNhYmxlcyB9IGZyb20gJy4vRE9NdXRpbHMnO1xuaW1wb3J0IHsgY29udGFpbnMgfSBmcm9tICcuL0RPTXV0aWxzJztcbmltcG9ydCB7IGFzQXJyYXkgfSBmcm9tICcuL2FycmF5JztcbnZhciBnZXRQYXJlbnRzID0gZnVuY3Rpb24gKG5vZGUsIHBhcmVudHMpIHtcbiAgICBpZiAocGFyZW50cyA9PT0gdm9pZCAwKSB7IHBhcmVudHMgPSBbXTsgfVxuICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIGdldFBhcmVudHMobm9kZS5wYXJlbnROb2RlLmhvc3QgfHwgbm9kZS5wYXJlbnROb2RlLCBwYXJlbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudHM7XG59O1xuLyoqXG4gKiBmaW5kcyBhIHBhcmVudCBmb3IgYm90aCBub2RlQSBhbmQgbm9kZUJcbiAqIEBwYXJhbSBub2RlQVxuICogQHBhcmFtIG5vZGVCXG4gKiBAcmV0dXJucyB7Ym9vbGVhbnwqfVxuICovXG5leHBvcnQgdmFyIGdldENvbW1vblBhcmVudCA9IGZ1bmN0aW9uIChub2RlQSwgbm9kZUIpIHtcbiAgICB2YXIgcGFyZW50c0EgPSBnZXRQYXJlbnRzKG5vZGVBKTtcbiAgICB2YXIgcGFyZW50c0IgPSBnZXRQYXJlbnRzKG5vZGVCKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cHJlZmVyLWZvci1vZlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50c0EubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRQYXJlbnQgPSBwYXJlbnRzQVtpXTtcbiAgICAgICAgaWYgKHBhcmVudHNCLmluZGV4T2YoY3VycmVudFBhcmVudCkgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmV4cG9ydCB2YXIgZ2V0VG9wQ29tbW9uUGFyZW50ID0gZnVuY3Rpb24gKGJhc2VBY3RpdmVFbGVtZW50LCBsZWZ0RW50cnksIHJpZ2h0RW50cmllcykge1xuICAgIHZhciBhY3RpdmVFbGVtZW50cyA9IGFzQXJyYXkoYmFzZUFjdGl2ZUVsZW1lbnQpO1xuICAgIHZhciBsZWZ0RW50cmllcyA9IGFzQXJyYXkobGVmdEVudHJ5KTtcbiAgICB2YXIgYWN0aXZlRWxlbWVudCA9IGFjdGl2ZUVsZW1lbnRzWzBdO1xuICAgIHZhciB0b3BDb21tb24gPSBmYWxzZTtcbiAgICBsZWZ0RW50cmllcy5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgdG9wQ29tbW9uID0gZ2V0Q29tbW9uUGFyZW50KHRvcENvbW1vbiB8fCBlbnRyeSwgZW50cnkpIHx8IHRvcENvbW1vbjtcbiAgICAgICAgcmlnaHRFbnRyaWVzLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChzdWJFbnRyeSkge1xuICAgICAgICAgICAgdmFyIGNvbW1vbiA9IGdldENvbW1vblBhcmVudChhY3RpdmVFbGVtZW50LCBzdWJFbnRyeSk7XG4gICAgICAgICAgICBpZiAoY29tbW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0b3BDb21tb24gfHwgY29udGFpbnMoY29tbW9uLCB0b3BDb21tb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcENvbW1vbiA9IGNvbW1vbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcENvbW1vbiA9IGdldENvbW1vblBhcmVudChjb21tb24sIHRvcENvbW1vbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBUT0RPOiBhZGQgYXNzZXJ0IGhlcmU/XG4gICAgcmV0dXJuIHRvcENvbW1vbjtcbn07XG4vKipcbiAqIHJldHVybiBsaXN0IG9mIG5vZGVzIHdoaWNoIGFyZSBleHBlY3RlZCB0byBiZSBhdXRvZm9jdXNlZCBpbnNpZGUgYSBnaXZlbiB0b3Agbm9kZXNcbiAqIEBwYXJhbSBlbnRyaWVzXG4gKiBAcGFyYW0gdmlzaWJpbGl0eUNhY2hlXG4gKi9cbmV4cG9ydCB2YXIgYWxsUGFyZW50QXV0b2ZvY3VzYWJsZXMgPSBmdW5jdGlvbiAoZW50cmllcywgdmlzaWJpbGl0eUNhY2hlKSB7XG4gICAgcmV0dXJuIGVudHJpZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIG5vZGUpIHsgcmV0dXJuIGFjYy5jb25jYXQocGFyZW50QXV0b2ZvY3VzYWJsZXMobm9kZSwgdmlzaWJpbGl0eUNhY2hlKSk7IH0sIFtdKTtcbn07XG4iLCJleHBvcnQgdmFyIHNhZmVQcm9iZSA9IGZ1bmN0aW9uIChjYikge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjYigpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn07XG4iLCJpbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi9hcnJheSc7XG5leHBvcnQgdmFyIHRhYlNvcnQgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBhVGFiID0gTWF0aC5tYXgoMCwgYS50YWJJbmRleCk7XG4gICAgdmFyIGJUYWIgPSBNYXRoLm1heCgwLCBiLnRhYkluZGV4KTtcbiAgICB2YXIgdGFiRGlmZiA9IGFUYWIgLSBiVGFiO1xuICAgIHZhciBpbmRleERpZmYgPSBhLmluZGV4IC0gYi5pbmRleDtcbiAgICBpZiAodGFiRGlmZikge1xuICAgICAgICBpZiAoIWFUYWIpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYlRhYikge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YWJEaWZmIHx8IGluZGV4RGlmZjtcbn07XG52YXIgZ2V0VGFiSW5kZXggPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChub2RlLnRhYkluZGV4IDwgMCkge1xuICAgICAgICAvLyBhbGwgXCJmb2N1c2FibGVcIiBlbGVtZW50cyBhcmUgYWxyZWFkeSBwcmVzZWxlY3RlZFxuICAgICAgICAvLyBidXQgc29tZSBtaWdodCBoYXZlIGltcGxpY2l0IG5lZ2F0aXZlIHRhYkluZGV4XG4gICAgICAgIC8vIHJldHVybiAwIGZvciA8YXVkaW8gd2l0aG91dCB0YWJJbmRleCBhdHRyaWJ1dGUgLSBpdCBpcyBcInRhYmJhYmxlXCJcbiAgICAgICAgaWYgKCFub2RlLmhhc0F0dHJpYnV0ZSgndGFiaW5kZXgnKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGUudGFiSW5kZXg7XG59O1xuZXhwb3J0IHZhciBvcmRlckJ5VGFiSW5kZXggPSBmdW5jdGlvbiAobm9kZXMsIGZpbHRlck5lZ2F0aXZlLCBrZWVwR3VhcmRzKSB7XG4gICAgcmV0dXJuIHRvQXJyYXkobm9kZXMpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKG5vZGUsIGluZGV4KSB7XG4gICAgICAgIHZhciB0YWJJbmRleCA9IGdldFRhYkluZGV4KG5vZGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIHRhYkluZGV4OiBrZWVwR3VhcmRzICYmIHRhYkluZGV4ID09PSAtMSA/ICgobm9kZS5kYXRhc2V0IHx8IHt9KS5mb2N1c0d1YXJkID8gMCA6IC0xKSA6IHRhYkluZGV4LFxuICAgICAgICB9O1xuICAgIH0pXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuICFmaWx0ZXJOZWdhdGl2ZSB8fCBkYXRhLnRhYkluZGV4ID49IDA7IH0pXG4gICAgICAgIC5zb3J0KHRhYlNvcnQpO1xufTtcbiIsImltcG9ydCB7IEZPQ1VTX0FVVE8gfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gJy4vYXJyYXknO1xuaW1wb3J0IHsgdGFiYmFibGVzIH0gZnJvbSAnLi90YWJiYWJsZXMnO1xudmFyIHF1ZXJ5VGFiYmFibGVzID0gdGFiYmFibGVzLmpvaW4oJywnKTtcbnZhciBxdWVyeUd1YXJkVGFiYmFibGVzID0gXCJcIi5jb25jYXQocXVlcnlUYWJiYWJsZXMsIFwiLCBbZGF0YS1mb2N1cy1ndWFyZF1cIik7XG52YXIgZ2V0Rm9jdXNhYmxlc1dpdGhTaGFkb3dEb20gPSBmdW5jdGlvbiAocGFyZW50LCB3aXRoR3VhcmRzKSB7XG4gICAgcmV0dXJuIHRvQXJyYXkoKHBhcmVudC5zaGFkb3dSb290IHx8IHBhcmVudCkuY2hpbGRyZW4pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjaGlsZCkge1xuICAgICAgICByZXR1cm4gYWNjLmNvbmNhdChjaGlsZC5tYXRjaGVzKHdpdGhHdWFyZHMgPyBxdWVyeUd1YXJkVGFiYmFibGVzIDogcXVlcnlUYWJiYWJsZXMpID8gW2NoaWxkXSA6IFtdLCBnZXRGb2N1c2FibGVzV2l0aFNoYWRvd0RvbShjaGlsZCkpO1xuICAgIH0sIFtdKTtcbn07XG52YXIgZ2V0Rm9jdXNhYmxlc1dpdGhJRnJhbWUgPSBmdW5jdGlvbiAocGFyZW50LCB3aXRoR3VhcmRzKSB7XG4gICAgdmFyIF9hO1xuICAgIC8vIGNvbnRlbnREb2N1bWVudCBvZiBpZnJhbWUgd2lsbCBiZSBudWxsIGlmIGN1cnJlbnQgb3JpZ2luIGNhbm5vdCBhY2Nlc3MgaXRcbiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSFRNTElGcmFtZUVsZW1lbnQgJiYgKChfYSA9IHBhcmVudC5jb250ZW50RG9jdW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ib2R5KSkge1xuICAgICAgICByZXR1cm4gZ2V0Rm9jdXNhYmxlcyhbcGFyZW50LmNvbnRlbnREb2N1bWVudC5ib2R5XSwgd2l0aEd1YXJkcyk7XG4gICAgfVxuICAgIHJldHVybiBbcGFyZW50XTtcbn07XG5leHBvcnQgdmFyIGdldEZvY3VzYWJsZXMgPSBmdW5jdGlvbiAocGFyZW50cywgd2l0aEd1YXJkcykge1xuICAgIHJldHVybiBwYXJlbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwYXJlbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgZm9jdXNhYmxlV2l0aFNoYWRvd0RvbSA9IGdldEZvY3VzYWJsZXNXaXRoU2hhZG93RG9tKHBhcmVudCwgd2l0aEd1YXJkcyk7XG4gICAgICAgIHZhciBmb2N1c2FibGVXaXRoSWZyYW1lcyA9IChfYSA9IFtdKS5jb25jYXQuYXBwbHkoX2EsIGZvY3VzYWJsZVdpdGhTaGFkb3dEb20ubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBnZXRGb2N1c2FibGVzV2l0aElGcmFtZShub2RlLCB3aXRoR3VhcmRzKTsgfSkpO1xuICAgICAgICByZXR1cm4gYWNjLmNvbmNhdChcbiAgICAgICAgLy8gYWRkIGFsbCB0YWJiYWJsZXMgaW5zaWRlIGFuZCB3aXRoaW4gc2hhZG93IERPTXMgaW4gRE9NIG9yZGVyXG4gICAgICAgIGZvY3VzYWJsZVdpdGhJZnJhbWVzLCBcbiAgICAgICAgLy8gYWRkIGlmIG5vZGUgaXMgdGFiYmFibGUgaXRzZWxmXG4gICAgICAgIHBhcmVudC5wYXJlbnROb2RlXG4gICAgICAgICAgICA/IHRvQXJyYXkocGFyZW50LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeVRhYmJhYmxlcykpLmZpbHRlcihmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZSA9PT0gcGFyZW50OyB9KVxuICAgICAgICAgICAgOiBbXSk7XG4gICAgfSwgW10pO1xufTtcbi8qKlxuICogcmV0dXJuIGEgbGlzdCBvZiBmb2N1c2FibGUgbm9kZXMgd2l0aGluIGFuIGFyZWEgbWFya2VkIGFzIFwiYXV0by1mb2N1c2FibGVcIlxuICogQHBhcmFtIHBhcmVudFxuICovXG5leHBvcnQgdmFyIGdldFBhcmVudEF1dG9mb2N1c2FibGVzID0gZnVuY3Rpb24gKHBhcmVudCkge1xuICAgIHZhciBwYXJlbnRGb2N1cyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW1wiLmNvbmNhdChGT0NVU19BVVRPLCBcIl1cIikpO1xuICAgIHJldHVybiB0b0FycmF5KHBhcmVudEZvY3VzKVxuICAgICAgICAubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBnZXRGb2N1c2FibGVzKFtub2RlXSk7IH0pXG4gICAgICAgIC5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgbm9kZXMpIHsgcmV0dXJuIGFjYy5jb25jYXQobm9kZXMpOyB9LCBbXSk7XG59O1xuIiwiLyoqXG4gKiBsaXN0IG9mIHRoZSBvYmplY3QgdG8gYmUgY29uc2lkZXJlZCBhcyBmb2N1c2FibGVcbiAqL1xuZXhwb3J0IHZhciB0YWJiYWJsZXMgPSBbXG4gICAgJ2J1dHRvbjplbmFibGVkJyxcbiAgICAnc2VsZWN0OmVuYWJsZWQnLFxuICAgICd0ZXh0YXJlYTplbmFibGVkJyxcbiAgICAnaW5wdXQ6ZW5hYmxlZCcsXG4gICAgLy8gZWxlbWVudHMgd2l0aCBleHBsaWNpdCByb2xlcyB3aWxsIGFsc28gdXNlIGV4cGxpY2l0IHRhYmluZGV4XG4gICAgLy8gJ1tyb2xlPVwiYnV0dG9uXCJdJyxcbiAgICAnYVtocmVmXScsXG4gICAgJ2FyZWFbaHJlZl0nLFxuICAgICdzdW1tYXJ5JyxcbiAgICAnaWZyYW1lJyxcbiAgICAnb2JqZWN0JyxcbiAgICAnZW1iZWQnLFxuICAgICdhdWRpb1tjb250cm9sc10nLFxuICAgICd2aWRlb1tjb250cm9sc10nLFxuICAgICdbdGFiaW5kZXhdJyxcbiAgICAnW2NvbnRlbnRlZGl0YWJsZV0nLFxuICAgICdbYXV0b2ZvY3VzXScsXG5dO1xuIiwiLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLCBWbGFkaW1pcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLlxuXG4vKipcbiAqIGZvY3VzLW91dGxpbmUtbWFuYWdlclxuICpcbiAqIFdhdGNoIHVzZXJzIGtleWJvYXJkIGlucHV0IGFuZCBtYW5hZ2UgdGhlIGZvY3VzIG91dGxpbmUgdmlzaWJpbGl0eVxuICovXG5cbi8qKlxuICogVGhlIGNsYXNzIG5hbWUgdG8gc2V0IG9uIHRoZSBkb2N1bWVudCBlbGVtZW50LlxuICogQGNvbnN0XG4gKi9cbnZhciBDTEFTU19OQU1FID0gJ2ZvY3VzLW91dGxpbmUtaGlkZGVuJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIHNldHMgYSBDU1MgY2xhc3MgbmFtZSBvbiB0aGUgSFRNTCBlbGVtZW50IHdoZW4gYSB1c2VyIHByZXNzZXMgdGhlXG4gKiB0YWIga2V5LiBJdCByZW1vdmVzIHRoZSBjbGFzcyBuYW1lIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGFueXdoZXJlLlxuICpcbiAqIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZSBDU1MgbGlrZSB0aGlzOlxuICpcbiAqIGh0bWwuZm9jdXMtb3V0bGluZS1oaWRkZW4gKjpmb2N1cyB7XG4gKiAgICAgb3V0bGluZTogbm9uZTtcbiAqIH1cbiAqXG4gKiBBbmQgdGhlIG91dGxpbmUgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZSB1c2VyIHVzZXMgdGhlIGtleWJvYXJkIHRvIGdldCB0byBpdC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gRm9jdXNPdXRsaW5lTWFuYWdlciAoKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoYXQuZm9jdXNCeUtleWJvYXJkID0gdHJ1ZTtcbiAgICB9LCB0cnVlKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoYXQuZm9jdXNCeUtleWJvYXJkID0gZmFsc2U7XG4gICAgfSwgdHJ1ZSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyBVcGRhdGUgdmlzaWJpbGl0eSBvbmx5IHdoZW4gZm9jdXMgaXMgYWN0dWFsbHkgY2hhbmdlZC5cbiAgICAgICAgdGhhdC51cGRhdGVWaXNpYmlsaXR5KCk7XG4gICAgfSwgdHJ1ZSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50Lmhhc0ZvY3VzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGF0LmZvY3VzQnlLZXlib2FyZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhhdC51cGRhdGVWaXNpYmlsaXR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KCk7XG59XG5cbkZvY3VzT3V0bGluZU1hbmFnZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgZm9jdXMgY2hhbmdlIGlzIHRyaWdnZXJlZCBieSBUQUIga2V5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZm9jdXNCeUtleWJvYXJkOiB0cnVlLFxuXG4gICAgdXBkYXRlVmlzaWJpbGl0eTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhpZGRlbiA9ICF0aGlzLmZvY3VzQnlLZXlib2FyZDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgZm9jdXMgb3V0bGluZSBzaG91bGQgYmUgaGlkZGVuLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHNldCBoaWRkZW4oaGlkZGVuKSB7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKENMQVNTX05BTUUsIGhpZGRlbik7XG4gICAgfSxcblxuICAgIGdldCBoaWRkZW4oKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUUpO1xuICAgIH1cbn07XG5cbm5ldyBGb2N1c091dGxpbmVNYW5hZ2VyKCk7XG4iLCJ2YXIgY3VycmVudE5vbmNlO1xuZXhwb3J0IHZhciBzZXROb25jZSA9IGZ1bmN0aW9uIChub25jZSkge1xuICAgIGN1cnJlbnROb25jZSA9IG5vbmNlO1xufTtcbmV4cG9ydCB2YXIgZ2V0Tm9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGN1cnJlbnROb25jZSkge1xuICAgICAgICByZXR1cm4gY3VycmVudE5vbmNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gX193ZWJwYWNrX25vbmNlX187XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vISBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbnZhciBSRUFDVF9TVEFUSUNTID0ge1xuICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgY29udGV4dFR5cGU6IHRydWUsXG4gIGNvbnRleHRUeXBlczogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgZ2V0RGVmYXVsdFByb3BzOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogdHJ1ZSxcbiAgbWl4aW5zOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgbGVuZ3RoOiB0cnVlLFxuICBwcm90b3R5cGU6IHRydWUsXG4gIGNhbGxlcjogdHJ1ZSxcbiAgY2FsbGVlOiB0cnVlLFxuICBhcmd1bWVudHM6IHRydWUsXG4gIGFyaXR5OiB0cnVlXG59O1xudmFyIEZPUldBUkRfUkVGX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlXG59O1xudmFyIE1FTU9fU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgY29tcGFyZTogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIFRZUEVfU1RBVElDUyA9IHt9O1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuRm9yd2FyZFJlZl0gPSBGT1JXQVJEX1JFRl9TVEFUSUNTO1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuTWVtb10gPSBNRU1PX1NUQVRJQ1M7XG5cbmZ1bmN0aW9uIGdldFN0YXRpY3MoY29tcG9uZW50KSB7XG4gIC8vIFJlYWN0IHYxNi4xMSBhbmQgYmVsb3dcbiAgaWYgKHJlYWN0SXMuaXNNZW1vKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gTUVNT19TVEFUSUNTO1xuICB9IC8vIFJlYWN0IHYxNi4xMiBhbmQgYWJvdmVcblxuXG4gIHJldHVybiBUWVBFX1NUQVRJQ1NbY29tcG9uZW50WyckJHR5cGVvZiddXSB8fCBSRUFDVF9TVEFUSUNTO1xufVxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQsIGJsYWNrbGlzdCkge1xuICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBkb24ndCBob2lzdCBvdmVyIHN0cmluZyAoaHRtbCkgY29tcG9uZW50c1xuICAgIGlmIChvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgIHZhciBpbmhlcml0ZWRDb21wb25lbnQgPSBnZXRQcm90b3R5cGVPZihzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgICBpZiAoaW5oZXJpdGVkQ29tcG9uZW50ICYmIGluaGVyaXRlZENvbXBvbmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgaW5oZXJpdGVkQ29tcG9uZW50LCBibGFja2xpc3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgaWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAga2V5cyA9IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0U3RhdGljcyA9IGdldFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50KTtcbiAgICB2YXIgc291cmNlU3RhdGljcyA9IGdldFN0YXRpY3Moc291cmNlQ29tcG9uZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghS05PV05fU1RBVElDU1trZXldICYmICEoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdFtrZXldKSAmJiAhKHNvdXJjZVN0YXRpY3MgJiYgc291cmNlU3RhdGljc1trZXldKSAmJiAhKHRhcmdldFN0YXRpY3MgJiYgdGFyZ2V0U3RhdGljc1trZXldKSkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VDb21wb25lbnQsIGtleSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBdm9pZCBmYWlsdXJlcyBmcm9tIHJlYWQtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29tcG9uZW50LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaG9pc3ROb25SZWFjdFN0YXRpY3M7XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0IGUgZnJvbVwidm9pZC1lbGVtZW50c1wiO3ZhciB0PS9cXHMoW14nXCIvXFxzPjxdKz8pW1xccy8+XXwoW15cXHM9XSspPVxccz8oXCIuKj9cInwnLio/JykvZztmdW5jdGlvbiBuKG4pe3ZhciByPXt0eXBlOlwidGFnXCIsbmFtZTpcIlwiLHZvaWRFbGVtZW50OiExLGF0dHJzOnt9LGNoaWxkcmVuOltdfSxpPW4ubWF0Y2goLzxcXC8/KFteXFxzXSs/KVsvXFxzPl0vKTtpZihpJiYoci5uYW1lPWlbMV0sKGVbaVsxXV18fFwiL1wiPT09bi5jaGFyQXQobi5sZW5ndGgtMikpJiYoci52b2lkRWxlbWVudD0hMCksci5uYW1lLnN0YXJ0c1dpdGgoXCIhLS1cIikpKXt2YXIgcz1uLmluZGV4T2YoXCItLVxceDNlXCIpO3JldHVybnt0eXBlOlwiY29tbWVudFwiLGNvbW1lbnQ6LTEhPT1zP24uc2xpY2UoNCxzKTpcIlwifX1mb3IodmFyIGE9bmV3IFJlZ0V4cCh0KSxjPW51bGw7bnVsbCE9PShjPWEuZXhlYyhuKSk7KWlmKGNbMF0udHJpbSgpKWlmKGNbMV0pe3ZhciBvPWNbMV0udHJpbSgpLGw9W28sXCJcIl07by5pbmRleE9mKFwiPVwiKT4tMSYmKGw9by5zcGxpdChcIj1cIikpLHIuYXR0cnNbbFswXV09bFsxXSxhLmxhc3RJbmRleC0tfWVsc2UgY1syXSYmKHIuYXR0cnNbY1syXV09Y1szXS50cmltKCkuc3Vic3RyaW5nKDEsY1szXS5sZW5ndGgtMSkpO3JldHVybiByfXZhciByPS88W2EtekEtWjAtOVxcLVxcIVxcL10oPzpcIlteXCJdKlwifCdbXiddKid8W14nXCI+XSkqPi9nLGk9L15cXHMqJC8scz1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIGEoZSx0KXtzd2l0Y2godC50eXBlKXtjYXNlXCJ0ZXh0XCI6cmV0dXJuIGUrdC5jb250ZW50O2Nhc2VcInRhZ1wiOnJldHVybiBlKz1cIjxcIit0Lm5hbWUrKHQuYXR0cnM/ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpdC5wdXNoKG4rJz1cIicrZVtuXSsnXCInKTtyZXR1cm4gdC5sZW5ndGg/XCIgXCIrdC5qb2luKFwiIFwiKTpcIlwifSh0LmF0dHJzKTpcIlwiKSsodC52b2lkRWxlbWVudD9cIi8+XCI6XCI+XCIpLHQudm9pZEVsZW1lbnQ/ZTplK3QuY2hpbGRyZW4ucmVkdWNlKGEsXCJcIikrXCI8L1wiK3QubmFtZStcIj5cIjtjYXNlXCJjb21tZW50XCI6cmV0dXJuIGUrXCJcXHgzYyEtLVwiK3QuY29tbWVudCtcIi0tXFx4M2VcIn19dmFyIGM9e3BhcnNlOmZ1bmN0aW9uKGUsdCl7dHx8KHQ9e30pLHQuY29tcG9uZW50c3x8KHQuY29tcG9uZW50cz1zKTt2YXIgYSxjPVtdLG89W10sbD0tMSxtPSExO2lmKDAhPT1lLmluZGV4T2YoXCI8XCIpKXt2YXIgdT1lLmluZGV4T2YoXCI8XCIpO2MucHVzaCh7dHlwZTpcInRleHRcIixjb250ZW50Oi0xPT09dT9lOmUuc3Vic3RyaW5nKDAsdSl9KX1yZXR1cm4gZS5yZXBsYWNlKHIsZnVuY3Rpb24ocixzKXtpZihtKXtpZihyIT09XCI8L1wiK2EubmFtZStcIj5cIilyZXR1cm47bT0hMX12YXIgdSxmPVwiL1wiIT09ci5jaGFyQXQoMSksaD1yLnN0YXJ0c1dpdGgoXCJcXHgzYyEtLVwiKSxwPXMrci5sZW5ndGgsZD1lLmNoYXJBdChwKTtpZihoKXt2YXIgdj1uKHIpO3JldHVybiBsPDA/KGMucHVzaCh2KSxjKTooKHU9b1tsXSkuY2hpbGRyZW4ucHVzaCh2KSxjKX1pZihmJiYobCsrLFwidGFnXCI9PT0oYT1uKHIpKS50eXBlJiZ0LmNvbXBvbmVudHNbYS5uYW1lXSYmKGEudHlwZT1cImNvbXBvbmVudFwiLG09ITApLGEudm9pZEVsZW1lbnR8fG18fCFkfHxcIjxcIj09PWR8fGEuY2hpbGRyZW4ucHVzaCh7dHlwZTpcInRleHRcIixjb250ZW50OmUuc2xpY2UocCxlLmluZGV4T2YoXCI8XCIscCkpfSksMD09PWwmJmMucHVzaChhKSwodT1vW2wtMV0pJiZ1LmNoaWxkcmVuLnB1c2goYSksb1tsXT1hKSwoIWZ8fGEudm9pZEVsZW1lbnQpJiYobD4tMSYmKGEudm9pZEVsZW1lbnR8fGEubmFtZT09PXIuc2xpY2UoMiwtMSkpJiYobC0tLGE9LTE9PT1sP2M6b1tsXSksIW0mJlwiPFwiIT09ZCYmZCkpe3U9LTE9PT1sP2M6b1tsXS5jaGlsZHJlbjt2YXIgeD1lLmluZGV4T2YoXCI8XCIscCksZz1lLnNsaWNlKHAsLTE9PT14P3ZvaWQgMDp4KTtpLnRlc3QoZykmJihnPVwiIFwiKSwoeD4tMSYmbCt1Lmxlbmd0aD49MHx8XCIgXCIhPT1nKSYmdS5wdXNoKHt0eXBlOlwidGV4dFwiLGNvbnRlbnQ6Z30pfX0pLGN9LHN0cmluZ2lmeTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSthKFwiXCIsdCl9LFwiXCIpfX07ZXhwb3J0IGRlZmF1bHQgYztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0bWwtcGFyc2Utc3RyaW5naWZ5Lm1vZHVsZS5qcy5tYXBcbiIsIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyB0aGUgYFR5cGVFcnJvcmAgbWVzc2FnZSBmb3IgXCJGdW5jdGlvbnNcIiBtZXRob2RzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgcmVzdWx0ID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgcmV0dXJuIG1heGluZyA/IG5hdGl2ZU1pbihyZXN1bHQsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBZnJpa2FhbnMgW2FmXVxuLy8hIGF1dGhvciA6IFdlcm5lciBNb2xsZW50emUgOiBodHRwczovL2dpdGh1Yi5jb20vd2VybmVybVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGFmID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYWYnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcmllX0ZlYnJ1YXJpZV9NYWFydF9BcHJpbF9NZWlfSnVuaWVfSnVsaWVfQXVndXN0dXNfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGVzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NcnRfQXByX01laV9KdW5fSnVsX0F1Z19TZXBfT2t0X05vdl9EZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU29uZGFnX01hYW5kYWdfRGluc2RhZ19Xb2Vuc2RhZ19Eb25kZXJkYWdfVnJ5ZGFnX1NhdGVyZGFnJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU29uX01hYV9EaW5fV29lX0Rvbl9WcnlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NvX01hX0RpX1dvX0RvX1ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvdm18bm0vaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL15ubSQvaS50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICd2bScgOiAnVk0nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdubScgOiAnTk0nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1ZhbmRhZyBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tNw7RyZSBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tHaXN0ZXIgb21dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhYXNdIGRkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ29vciAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgZ2VsZWRlJyxcbiAgICAgICAgICAgIHM6IFwiJ24gcGFhciBzZWtvbmRlc1wiLFxuICAgICAgICAgICAgc3M6ICclZCBzZWtvbmRlcycsXG4gICAgICAgICAgICBtOiBcIiduIG1pbnV1dFwiLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGUnLFxuICAgICAgICAgICAgaDogXCInbiB1dXJcIixcbiAgICAgICAgICAgIGhoOiAnJWQgdXJlJyxcbiAgICAgICAgICAgIGQ6IFwiJ24gZGFnXCIsXG4gICAgICAgICAgICBkZDogJyVkIGRhZScsXG4gICAgICAgICAgICBNOiBcIiduIG1hYW5kXCIsXG4gICAgICAgICAgICBNTTogJyVkIG1hYW5kZScsXG4gICAgICAgICAgICB5OiBcIiduIGphYXJcIixcbiAgICAgICAgICAgIHl5OiAnJWQgamFhcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdGV8ZGUpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBudW1iZXIgK1xuICAgICAgICAgICAgICAgIChudW1iZXIgPT09IDEgfHwgbnVtYmVyID09PSA4IHx8IG51bWJlciA+PSAyMCA/ICdzdGUnIDogJ2RlJylcbiAgICAgICAgICAgICk7IC8vIFRoYW5rcyB0byBKb3JpcyBSw7ZsaW5nIDogaHR0cHM6Ly9naXRodWIuY29tL2pqdXBpdGVyXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTWFhbmRhZyBpcyBkaWUgZWVyc3RlIGRhZyB2YW4gZGllIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIERpZSB3ZWVrIHdhdCBkaWUgNGRlIEphbnVhcmllIGJldmF0IGlzIGRpZSBlZXJzdGUgd2VlayB2YW4gZGllIGphYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWY7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJhYmljIChBbGdlcmlhKSBbYXItZHpdXG4vLyEgYXV0aG9yIDogQW1pbmUgUm91a2g6IGh0dHBzOi8vZ2l0aHViLmNvbS9BbWluZTI3XG4vLyEgYXV0aG9yIDogQWJkZWwgU2FpZDogaHR0cHM6Ly9naXRodWIuY29tL2FiZGVsc2FpZFxuLy8hIGF1dGhvciA6IEFobWVkIEVsa2hhdGliXG4vLyEgYXV0aG9yIDogZm9yYWJpIGh0dHBzOi8vZ2l0aHViLmNvbS9mb3JhYmlcbi8vISBhdXRob3IgOiBOb3VyZWRkaW5lIExPVUFIRURKIDogaHR0cHM6Ly9naXRodWIuY29tL25vdXJlZGRpbmVtXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgcGx1cmFsRm9ybSA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gbiA9PT0gMFxuICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgIDogbiA9PT0gMVxuICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICA6IG4gPT09IDJcbiAgICAgICAgICAgICAgICAgICAgPyAyXG4gICAgICAgICAgICAgICAgICAgIDogbiAlIDEwMCA+PSAzICYmIG4gJSAxMDAgPD0gMTBcbiAgICAgICAgICAgICAgICAgICAgICA/IDNcbiAgICAgICAgICAgICAgICAgICAgICA6IG4gJSAxMDAgPj0gMTFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gNFxuICAgICAgICAgICAgICAgICAgICAgICAgOiA1O1xuICAgICAgICB9LFxuICAgICAgICBwbHVyYWxzID0ge1xuICAgICAgICAgICAgczogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYq9in2YbZitipJyxcbiAgICAgICAgICAgICAgICAn2KvYp9mG2YrYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9ir2KfZhtmK2KrYp9mGJywgJ9ir2KfZhtmK2KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINir2YjYp9mGJyxcbiAgICAgICAgICAgICAgICAnJWQg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICAgICAgJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJ9iv2YLZitmC2Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYr9mC2YrZgtiq2KfZhicsICfYr9mC2YrZgtiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgICAgICAnJWQg2K/ZgtmK2YLYqScsXG4gICAgICAgICAgICAgICAgJyVkINiv2YLZitmC2KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGg6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LPYp9i52KknLFxuICAgICAgICAgICAgICAgICfYs9in2LnYqSDZiNin2K3Yr9ipJyxcbiAgICAgICAgICAgICAgICBbJ9iz2KfYudiq2KfZhicsICfYs9in2LnYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KfYqicsXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudipJyxcbiAgICAgICAgICAgICAgICAnJWQg2LPYp9i52KknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGQ6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2YrZiNmFJyxcbiAgICAgICAgICAgICAgICAn2YrZiNmFINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9mK2YjZhdin2YYnLCAn2YrZiNmF2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINmK2YjZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDZitmI2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIE06IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2LTZh9ixJyxcbiAgICAgICAgICAgICAgICAn2LTZh9ixINmI2KfYrdivJyxcbiAgICAgICAgICAgICAgICBbJ9i02YfYsdin2YYnLCAn2LTZh9ix2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICAgICAgJyVkINi02YfYsdinJyxcbiAgICAgICAgICAgICAgICAnJWQg2LTZh9ixJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB5OiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINi52KfZhScsXG4gICAgICAgICAgICAgICAgJ9i52KfZhSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfYudin2YXYp9mGJywgJ9i52KfZhdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPYudmI2KfZhScsXG4gICAgICAgICAgICAgICAgJyVkINi52KfZhdmL2KcnLFxuICAgICAgICAgICAgICAgICclZCDYudin2YUnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFsaXplID0gZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGYgPSBwbHVyYWxGb3JtKG51bWJlciksXG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHBsdXJhbHNbdV1bcGx1cmFsRm9ybShudW1iZXIpXTtcbiAgICAgICAgICAgICAgICBpZiAoZiA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHJbd2l0aG91dFN1ZmZpeCA/IDAgOiAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9is2KfZhtmB2YonLFxuICAgICAgICAgICAgJ9mB2YrZgdix2YonLFxuICAgICAgICAgICAgJ9mF2KfYsdizJyxcbiAgICAgICAgICAgICfYo9mB2LHZitmEJyxcbiAgICAgICAgICAgICfZhdin2YonLFxuICAgICAgICAgICAgJ9is2YjYp9mGJyxcbiAgICAgICAgICAgICfYrNmI2YrZhNmK2KknLFxuICAgICAgICAgICAgJ9ij2YjYqicsXG4gICAgICAgICAgICAn2LPYqNiq2YXYqNixJyxcbiAgICAgICAgICAgICfYo9mD2KrZiNio2LEnLFxuICAgICAgICAgICAgJ9mG2YjZgdmF2KjYsScsXG4gICAgICAgICAgICAn2K/Zitiz2YXYqNixJyxcbiAgICAgICAgXTtcblxuICAgIHZhciBhckR6ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXItZHonLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9ij2K3Yr1/Ypdir2YbZitmGX9ir2YTYp9ir2KfYoV/Yo9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdEL1xcdTIwMEZNL1xcdTIwMEZZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LV82YUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i1JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZhSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2YvYpyDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfYqNi52K8gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiBwbHVyYWxpemUoJ3MnKSxcbiAgICAgICAgICAgIHNzOiBwbHVyYWxpemUoJ3MnKSxcbiAgICAgICAgICAgIG06IHBsdXJhbGl6ZSgnbScpLFxuICAgICAgICAgICAgbW06IHBsdXJhbGl6ZSgnbScpLFxuICAgICAgICAgICAgaDogcGx1cmFsaXplKCdoJyksXG4gICAgICAgICAgICBoaDogcGx1cmFsaXplKCdoJyksXG4gICAgICAgICAgICBkOiBwbHVyYWxpemUoJ2QnKSxcbiAgICAgICAgICAgIGRkOiBwbHVyYWxpemUoJ2QnKSxcbiAgICAgICAgICAgIE06IHBsdXJhbGl6ZSgnTScpLFxuICAgICAgICAgICAgTU06IHBsdXJhbGl6ZSgnTScpLFxuICAgICAgICAgICAgeTogcGx1cmFsaXplKCd5JyksXG4gICAgICAgICAgICB5eTogcGx1cmFsaXplKCd5JyksXG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyRHo7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJhYmljIChLdXdhaXQpIFthci1rd11cbi8vISBhdXRob3IgOiBOdXNyZXQgUGFybGFrOiBodHRwczovL2dpdGh1Yi5jb20vbnVzcmV0cGFybGFrXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgYXJLdyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLWt3Jywge1xuICAgICAgICBtb250aHM6ICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZil/ZitmI2YbZitmIX9mK2YjZhNmK2YjYsl/Yuti02Kpf2LTYqtmG2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmG2KjYsV/Yr9is2YbYqNixJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZil/ZitmI2YbZitmIX9mK2YjZhNmK2YjYsl/Yuti02Kpf2LTYqtmG2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmG2KjYsV/Yr9is2YbYqNixJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYqtmG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KfYrdivX9in2KrZhtmK2YZf2KvZhNin2KvYp9ihX9in2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2Kcg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2YHZiiAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6ICfYq9mI2KfZhicsXG4gICAgICAgICAgICBzczogJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgbTogJ9iv2YLZitmC2KknLFxuICAgICAgICAgICAgbW06ICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgIGg6ICfYs9in2LnYqScsXG4gICAgICAgICAgICBoaDogJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgZDogJ9mK2YjZhScsXG4gICAgICAgICAgICBkZDogJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgIE06ICfYtNmH2LEnLFxuICAgICAgICAgICAgTU06ICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICB5OiAn2LPZhtipJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPZhtmI2KfYqicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDEyLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxMnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyS3c7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJhYmljIChMaWJ5YSkgW2FyLWx5XVxuLy8hIGF1dGhvciA6IEFsaSBIbWVyOiBodHRwczovL2dpdGh1Yi5jb20va2lrb2FuaXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAnMScsXG4gICAgICAgICAgICAyOiAnMicsXG4gICAgICAgICAgICAzOiAnMycsXG4gICAgICAgICAgICA0OiAnNCcsXG4gICAgICAgICAgICA1OiAnNScsXG4gICAgICAgICAgICA2OiAnNicsXG4gICAgICAgICAgICA3OiAnNycsXG4gICAgICAgICAgICA4OiAnOCcsXG4gICAgICAgICAgICA5OiAnOScsXG4gICAgICAgICAgICAwOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbEZvcm0gPSBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgcmV0dXJuIG4gPT09IDBcbiAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICA6IG4gPT09IDFcbiAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgOiBuID09PSAyXG4gICAgICAgICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICAgICAgICA6IG4gJSAxMDAgPj0gMyAmJiBuICUgMTAwIDw9IDEwXG4gICAgICAgICAgICAgICAgICAgICAgPyAzXG4gICAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDExXG4gICAgICAgICAgICAgICAgICAgICAgICA/IDRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogNTtcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFscyA9IHtcbiAgICAgICAgICAgIHM6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICAgICAgJ9ir2KfZhtmK2Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYq9in2YbZitiq2KfZhicsICfYq9in2YbZitiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYq9mI2KfZhicsXG4gICAgICAgICAgICAgICAgJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBtOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINiv2YLZitmC2KknLFxuICAgICAgICAgICAgICAgICfYr9mC2YrZgtipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2K/ZgtmK2YLYqtin2YYnLCAn2K/ZgtmK2YLYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICAgICAgJyVkINiv2YLZitmC2KknLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBoOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINiz2KfYudipJyxcbiAgICAgICAgICAgICAgICAn2LPYp9i52Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYs9in2LnYqtin2YYnLCAn2LPYp9i52KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINmK2YjZhScsXG4gICAgICAgICAgICAgICAgJ9mK2YjZhSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfZitmI2YXYp9mGJywgJ9mK2YjZhdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgICAgICclZCDZitmI2YXZi9inJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmFJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBNOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINi02YfYsScsXG4gICAgICAgICAgICAgICAgJ9i02YfYsSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfYtNmH2LHYp9mGJywgJ9i02YfYsdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LHYpycsXG4gICAgICAgICAgICAgICAgJyVkINi02YfYsScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYudin2YUnLFxuICAgICAgICAgICAgICAgICfYudin2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LnYp9mF2KfZhicsICfYudin2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LnZiNin2YUnLFxuICAgICAgICAgICAgICAgICclZCDYudin2YXZi9inJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mFJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbGl6ZSA9IGZ1bmN0aW9uICh1KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgIHZhciBmID0gcGx1cmFsRm9ybShudW1iZXIpLFxuICAgICAgICAgICAgICAgICAgICBzdHIgPSBwbHVyYWxzW3VdW3BsdXJhbEZvcm0obnVtYmVyKV07XG4gICAgICAgICAgICAgICAgaWYgKGYgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyW3dpdGhvdXRTdWZmaXggPyAwIDogMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRocyA9IFtcbiAgICAgICAgICAgICfZitmG2KfZitixJyxcbiAgICAgICAgICAgICfZgdio2LHYp9mK2LEnLFxuICAgICAgICAgICAgJ9mF2KfYsdizJyxcbiAgICAgICAgICAgICfYo9io2LHZitmEJyxcbiAgICAgICAgICAgICfZhdin2YrZiCcsXG4gICAgICAgICAgICAn2YrZiNmG2YrZiCcsXG4gICAgICAgICAgICAn2YrZiNmE2YrZiCcsXG4gICAgICAgICAgICAn2KPYutiz2LfYsycsXG4gICAgICAgICAgICAn2LPYqNiq2YXYqNixJyxcbiAgICAgICAgICAgICfYo9mD2KrZiNio2LEnLFxuICAgICAgICAgICAgJ9mG2YjZgdmF2KjYsScsXG4gICAgICAgICAgICAn2K/Zitiz2YXYqNixJyxcbiAgICAgICAgXTtcblxuICAgIHZhciBhckx5ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXItbHknLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9ij2K3Yr1/Ypdir2YbZitmGX9ir2YTYp9ir2KfYoV/Yo9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdEL1xcdTIwMEZNL1xcdTIwMEZZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LV82YUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i1JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZhSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2YvYpyDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9i52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KPZhdizINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfYqNi52K8gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiBwbHVyYWxpemUoJ3MnKSxcbiAgICAgICAgICAgIHNzOiBwbHVyYWxpemUoJ3MnKSxcbiAgICAgICAgICAgIG06IHBsdXJhbGl6ZSgnbScpLFxuICAgICAgICAgICAgbW06IHBsdXJhbGl6ZSgnbScpLFxuICAgICAgICAgICAgaDogcGx1cmFsaXplKCdoJyksXG4gICAgICAgICAgICBoaDogcGx1cmFsaXplKCdoJyksXG4gICAgICAgICAgICBkOiBwbHVyYWxpemUoJ2QnKSxcbiAgICAgICAgICAgIGRkOiBwbHVyYWxpemUoJ2QnKSxcbiAgICAgICAgICAgIE06IHBsdXJhbGl6ZSgnTScpLFxuICAgICAgICAgICAgTU06IHBsdXJhbGl6ZSgnTScpLFxuICAgICAgICAgICAgeTogcGx1cmFsaXplKCd5JyksXG4gICAgICAgICAgICB5eTogcGx1cmFsaXplKCd5JyksXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDEyLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxMnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyTHk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJhYmljIChNb3JvY2NvKSBbYXItbWFdXG4vLyEgYXV0aG9yIDogRWxGYWRpbGkgWWFzc2luZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9FbEZhZGlsaVlcbi8vISBhdXRob3IgOiBBYmRlbCBTYWlkIDogaHR0cHM6Ly9naXRodWIuY29tL2FiZGVsc2FpZFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGFyTWEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdhci1tYScsIHtcbiAgICAgICAgbW9udGhzOiAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2YrZhtin2YrYsV/Zgdio2LHYp9mK2LFf2YXYp9ix2LNf2KPYqNix2YrZhF/Zhdin2Ypf2YrZiNmG2YrZiF/ZitmI2YTZitmI2LJf2LrYtNiqX9i02KrZhtio2LFf2KPZg9iq2YjYqNixX9mG2YjZhtio2LFf2K/YrNmG2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9in2K3Yr1/Yp9ir2YbZitmGX9ir2YTYp9ir2KfYoV/Yp9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9inINi52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vYo9mF2LMg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9mB2YogJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9mF2YbYsCAlcycsXG4gICAgICAgICAgICBzOiAn2KvZiNin2YYnLFxuICAgICAgICAgICAgc3M6ICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIG06ICfYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICBoOiAn2LPYp9i52KknLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2LnYp9iqJyxcbiAgICAgICAgICAgIGQ6ICfZitmI2YUnLFxuICAgICAgICAgICAgZGQ6ICclZCDYo9mK2KfZhScsXG4gICAgICAgICAgICBNOiAn2LTZh9ixJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgeTogJ9iz2YbYqScsXG4gICAgICAgICAgICB5eTogJyVkINiz2YbZiNin2KonLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJNYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBcmFiaWMgKFBhbGVzdGluZSkgW2FyLXBzXVxuLy8hIGF1dGhvciA6IE1hamQgQWwtU2hpaGFiaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYWpkYWxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn2aEnLFxuICAgICAgICAgICAgMjogJ9miJyxcbiAgICAgICAgICAgIDM6ICfZoycsXG4gICAgICAgICAgICA0OiAn2aQnLFxuICAgICAgICAgICAgNTogJ9mlJyxcbiAgICAgICAgICAgIDY6ICfZpicsXG4gICAgICAgICAgICA3OiAn2acnLFxuICAgICAgICAgICAgODogJ9moJyxcbiAgICAgICAgICAgIDk6ICfZqScsXG4gICAgICAgICAgICAwOiAn2aAnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn2aEnOiAnMScsXG4gICAgICAgICAgICAn2aInOiAnMicsXG4gICAgICAgICAgICAn2aMnOiAnMycsXG4gICAgICAgICAgICAn2aQnOiAnNCcsXG4gICAgICAgICAgICAn2aUnOiAnNScsXG4gICAgICAgICAgICAn2aYnOiAnNicsXG4gICAgICAgICAgICAn2acnOiAnNycsXG4gICAgICAgICAgICAn2agnOiAnOCcsXG4gICAgICAgICAgICAn2aknOiAnOScsXG4gICAgICAgICAgICAn2aAnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgYXJQcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyLXBzJywge1xuICAgICAgICBtb250aHM6ICfZg9in2YbZiNmGINin2YTYq9in2YbZil/YtNio2KfYt1/Yotiw2KfYsV/ZhtmK2LPYp9mGX9ij2YrZkdin2LFf2K3YstmK2LHYp9mGX9iq2YXZkdmI2LJf2KLYqF/Yo9mK2YTZiNmEX9iq2LTYsdmKINin2YTYo9mI2ZHZhF/Yqti02LHZitmGINin2YTYq9in2YbZil/Zg9in2YbZiNmGINin2YTYo9mI2ZHZhCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2YPZol/YtNio2KfYt1/Yotiw2KfYsV/ZhtmK2LPYp9mGX9ij2YrZkdin2LFf2K3YstmK2LHYp9mGX9iq2YXZkdmI2LJf2KLYqF/Yo9mK2YTZiNmEX9iq2aFf2KrZol/Zg9mhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9ij2K3Yr1/Ypdir2YbZitmGX9ir2YTYp9ir2KfYoV/Yo9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LV82YUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i1JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZhSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2Kcg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2YHZiiAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6ICfYq9mI2KfZhicsXG4gICAgICAgICAgICBzczogJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgbTogJ9iv2YLZitmC2KknLFxuICAgICAgICAgICAgbW06ICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgIGg6ICfYs9in2LnYqScsXG4gICAgICAgICAgICBoaDogJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgZDogJ9mK2YjZhScsXG4gICAgICAgICAgICBkZDogJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgIE06ICfYtNmH2LEnLFxuICAgICAgICAgICAgTU06ICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICB5OiAn2LPZhtipJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPZhtmI2KfYqicsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1vZo9mk2aXZptmn2ajZqdmgXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc3BsaXQoJycpIC8vIHJldmVyc2VkIHNpbmNlIG5lZ2F0aXZlIGxvb2tiZWhpbmQgbm90IHN1cHBvcnRlZCBldmVyeXdoZXJlXG4gICAgICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgICAgIC5qb2luKCcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b2aHZol0oPyFbXFx1MDYyYVxcdTA2NDNdKS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgICAgIC5qb2luKCcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyUHM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQXJhYmljIChTYXVkaSBBcmFiaWEpIFthci1zYV1cbi8vISBhdXRob3IgOiBTdWhhaWwgQWxrb3dhaWxlZXQgOiBodHRwczovL2dpdGh1Yi5jb20veHNvaFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfZoScsXG4gICAgICAgICAgICAyOiAn2aInLFxuICAgICAgICAgICAgMzogJ9mjJyxcbiAgICAgICAgICAgIDQ6ICfZpCcsXG4gICAgICAgICAgICA1OiAn2aUnLFxuICAgICAgICAgICAgNjogJ9mmJyxcbiAgICAgICAgICAgIDc6ICfZpycsXG4gICAgICAgICAgICA4OiAn2agnLFxuICAgICAgICAgICAgOTogJ9mpJyxcbiAgICAgICAgICAgIDA6ICfZoCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfZoSc6ICcxJyxcbiAgICAgICAgICAgICfZoic6ICcyJyxcbiAgICAgICAgICAgICfZoyc6ICczJyxcbiAgICAgICAgICAgICfZpCc6ICc0JyxcbiAgICAgICAgICAgICfZpSc6ICc1JyxcbiAgICAgICAgICAgICfZpic6ICc2JyxcbiAgICAgICAgICAgICfZpyc6ICc3JyxcbiAgICAgICAgICAgICfZqCc6ICc4JyxcbiAgICAgICAgICAgICfZqSc6ICc5JyxcbiAgICAgICAgICAgICfZoCc6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBhclNhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXItc2EnLCB7XG4gICAgICAgIG1vbnRoczogJ9mK2YbYp9mK2LFf2YHYqNix2KfZitixX9mF2KfYsdizX9ij2KjYsdmK2YRf2YXYp9mK2Yhf2YrZiNmG2YrZiF/ZitmI2YTZitmIX9ij2LrYs9i32LNf2LPYqNiq2YXYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YHZhdio2LFf2K/Zitiz2YXYqNixJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfZitmG2KfZitixX9mB2KjYsdin2YrYsV/Zhdin2LHYs1/Yo9io2LHZitmEX9mF2KfZitmIX9mK2YjZhtmK2Yhf2YrZiNmE2YrZiF/Yo9i62LPYt9izX9iz2KjYqtmF2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmB2YXYqNixX9iv2YrYs9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ9in2YTYo9it2K9f2KfZhNil2KvZhtmK2YZf2KfZhNir2YTYp9ir2KfYoV/Yp9mE2KPYsdio2LnYp9ihX9in2YTYrtmF2YrYs1/Yp9mE2KzZhdi52Klf2KfZhNiz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9ij2K3Yr1/Ypdir2YbZitmGX9ir2YTYp9ir2KfYoV/Yo9ix2KjYudin2KFf2K7ZhdmK2LNf2KzZhdi52Klf2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9itX9mGX9irX9ixX9iuX9isX9izJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LV82YUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i1JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZhSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2Kcg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2YHZiiAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6ICfYq9mI2KfZhicsXG4gICAgICAgICAgICBzczogJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgbTogJ9iv2YLZitmC2KknLFxuICAgICAgICAgICAgbW06ICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgIGg6ICfYs9in2LnYqScsXG4gICAgICAgICAgICBoaDogJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgZDogJ9mK2YjZhScsXG4gICAgICAgICAgICBkZDogJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgIE06ICfYtNmH2LEnLFxuICAgICAgICAgICAgTU06ICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICB5OiAn2LPZhtipJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPZhtmI2KfYqicsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1vZodmi2aPZpNml2abZp9mo2anZoF0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL9iML2csICcsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJTYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgIDogIEFyYWJpYyAoVHVuaXNpYSkgW2FyLXRuXVxuLy8hIGF1dGhvciA6IE5hZGVyIFRvdWthYnJpIDogaHR0cHM6Ly9naXRodWIuY29tL25hZGVyaW9cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBhclRuID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXItdG4nLCB7XG4gICAgICAgIG1vbnRoczogJ9is2KfZhtmB2Ypf2YHZitmB2LHZil/Zhdin2LHYs1/Yo9mB2LHZitmEX9mF2KfZil/YrNmI2KfZhl/YrNmI2YrZhNmK2Klf2KPZiNiqX9iz2KjYqtmF2KjYsV/Yo9mD2KrZiNio2LFf2YbZiNmB2YXYqNixX9iv2YrYs9mF2KjYsScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn2KzYp9mG2YHZil/ZgdmK2YHYsdmKX9mF2KfYsdizX9ij2YHYsdmK2YRf2YXYp9mKX9is2YjYp9mGX9is2YjZitmE2YrYqV/Yo9mI2Kpf2LPYqNiq2YXYqNixX9ij2YPYqtmI2KjYsV/ZhtmI2YHZhdio2LFf2K/Zitiz2YXYqNixJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn2KfZhNij2K3Yr1/Yp9mE2KXYq9mG2YrZhl/Yp9mE2KvZhNin2KvYp9ihX9in2YTYo9ix2KjYudin2KFf2KfZhNiu2YXZitizX9in2YTYrNmF2LnYqV/Yp9mE2LPYqNiqJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2KPYrdivX9il2KvZhtmK2YZf2KvZhNin2KvYp9ihX9ij2LHYqNi52KfYoV/YrtmF2YrYs1/YrNmF2LnYqV/Ys9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn2K1f2YZf2Ktf2LFf2K5f2Kxf2LMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YTZitmI2YUg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vYutiv2Kcg2LnZhNmJINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmE2Ykg2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YTZiSDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2YHZiiAlcycsXG4gICAgICAgICAgICBwYXN0OiAn2YXZhtiwICVzJyxcbiAgICAgICAgICAgIHM6ICfYq9mI2KfZhicsXG4gICAgICAgICAgICBzczogJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgbTogJ9iv2YLZitmC2KknLFxuICAgICAgICAgICAgbW06ICclZCDYr9mC2KfYptmCJyxcbiAgICAgICAgICAgIGg6ICfYs9in2LnYqScsXG4gICAgICAgICAgICBoaDogJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgZDogJ9mK2YjZhScsXG4gICAgICAgICAgICBkZDogJyVkINij2YrYp9mFJyxcbiAgICAgICAgICAgIE06ICfYtNmH2LEnLFxuICAgICAgICAgICAgTU06ICclZCDYo9i02YfYsScsXG4gICAgICAgICAgICB5OiAn2LPZhtipJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPZhtmI2KfYqicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhclRuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFyYWJpYyBbYXJdXG4vLyEgYXV0aG9yIDogQWJkZWwgU2FpZDogaHR0cHM6Ly9naXRodWIuY29tL2FiZGVsc2FpZFxuLy8hIGF1dGhvciA6IEFobWVkIEVsa2hhdGliXG4vLyEgYXV0aG9yIDogZm9yYWJpIGh0dHBzOi8vZ2l0aHViLmNvbS9mb3JhYmlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn2aEnLFxuICAgICAgICAgICAgMjogJ9miJyxcbiAgICAgICAgICAgIDM6ICfZoycsXG4gICAgICAgICAgICA0OiAn2aQnLFxuICAgICAgICAgICAgNTogJ9mlJyxcbiAgICAgICAgICAgIDY6ICfZpicsXG4gICAgICAgICAgICA3OiAn2acnLFxuICAgICAgICAgICAgODogJ9moJyxcbiAgICAgICAgICAgIDk6ICfZqScsXG4gICAgICAgICAgICAwOiAn2aAnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn2aEnOiAnMScsXG4gICAgICAgICAgICAn2aInOiAnMicsXG4gICAgICAgICAgICAn2aMnOiAnMycsXG4gICAgICAgICAgICAn2aQnOiAnNCcsXG4gICAgICAgICAgICAn2aUnOiAnNScsXG4gICAgICAgICAgICAn2aYnOiAnNicsXG4gICAgICAgICAgICAn2acnOiAnNycsXG4gICAgICAgICAgICAn2agnOiAnOCcsXG4gICAgICAgICAgICAn2aknOiAnOScsXG4gICAgICAgICAgICAn2aAnOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbEZvcm0gPSBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgcmV0dXJuIG4gPT09IDBcbiAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICA6IG4gPT09IDFcbiAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgOiBuID09PSAyXG4gICAgICAgICAgICAgICAgICAgID8gMlxuICAgICAgICAgICAgICAgICAgICA6IG4gJSAxMDAgPj0gMyAmJiBuICUgMTAwIDw9IDEwXG4gICAgICAgICAgICAgICAgICAgICAgPyAzXG4gICAgICAgICAgICAgICAgICAgICAgOiBuICUgMTAwID49IDExXG4gICAgICAgICAgICAgICAgICAgICAgICA/IDRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogNTtcbiAgICAgICAgfSxcbiAgICAgICAgcGx1cmFscyA9IHtcbiAgICAgICAgICAgIHM6IFtcbiAgICAgICAgICAgICAgICAn2KPZgtmEINmF2YYg2KvYp9mG2YrYqScsXG4gICAgICAgICAgICAgICAgJ9ir2KfZhtmK2Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYq9in2YbZitiq2KfZhicsICfYq9in2YbZitiq2YrZhiddLFxuICAgICAgICAgICAgICAgICclZCDYq9mI2KfZhicsXG4gICAgICAgICAgICAgICAgJyVkINir2KfZhtmK2KknLFxuICAgICAgICAgICAgICAgICclZCDYq9in2YbZitipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBtOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINiv2YLZitmC2KknLFxuICAgICAgICAgICAgICAgICfYr9mC2YrZgtipINmI2KfYrdiv2KknLFxuICAgICAgICAgICAgICAgIFsn2K/ZgtmK2YLYqtin2YYnLCAn2K/ZgtmK2YLYqtmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2K/Zgtin2KbZgicsXG4gICAgICAgICAgICAgICAgJyVkINiv2YLZitmC2KknLFxuICAgICAgICAgICAgICAgICclZCDYr9mC2YrZgtipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBoOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINiz2KfYudipJyxcbiAgICAgICAgICAgICAgICAn2LPYp9i52Kkg2YjYp9it2K/YqScsXG4gICAgICAgICAgICAgICAgWyfYs9in2LnYqtin2YYnLCAn2LPYp9i52KrZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudin2KonLFxuICAgICAgICAgICAgICAgICclZCDYs9in2LnYqScsXG4gICAgICAgICAgICAgICAgJyVkINiz2KfYudipJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBkOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINmK2YjZhScsXG4gICAgICAgICAgICAgICAgJ9mK2YjZhSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfZitmI2YXYp9mGJywgJ9mK2YjZhdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPZitin2YUnLFxuICAgICAgICAgICAgICAgICclZCDZitmI2YXZi9inJyxcbiAgICAgICAgICAgICAgICAnJWQg2YrZiNmFJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBNOiBbXG4gICAgICAgICAgICAgICAgJ9ij2YLZhCDZhdmGINi02YfYsScsXG4gICAgICAgICAgICAgICAgJ9i02YfYsSDZiNin2K3YrycsXG4gICAgICAgICAgICAgICAgWyfYtNmH2LHYp9mGJywgJ9i02YfYsdmK2YYnXSxcbiAgICAgICAgICAgICAgICAnJWQg2KPYtNmH2LEnLFxuICAgICAgICAgICAgICAgICclZCDYtNmH2LHYpycsXG4gICAgICAgICAgICAgICAgJyVkINi02YfYsScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeTogW1xuICAgICAgICAgICAgICAgICfYo9mC2YQg2YXZhiDYudin2YUnLFxuICAgICAgICAgICAgICAgICfYudin2YUg2YjYp9it2K8nLFxuICAgICAgICAgICAgICAgIFsn2LnYp9mF2KfZhicsICfYudin2YXZitmGJ10sXG4gICAgICAgICAgICAgICAgJyVkINij2LnZiNin2YUnLFxuICAgICAgICAgICAgICAgICclZCDYudin2YXZi9inJyxcbiAgICAgICAgICAgICAgICAnJWQg2LnYp9mFJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHBsdXJhbGl6ZSA9IGZ1bmN0aW9uICh1KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgIHZhciBmID0gcGx1cmFsRm9ybShudW1iZXIpLFxuICAgICAgICAgICAgICAgICAgICBzdHIgPSBwbHVyYWxzW3VdW3BsdXJhbEZvcm0obnVtYmVyKV07XG4gICAgICAgICAgICAgICAgaWYgKGYgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyW3dpdGhvdXRTdWZmaXggPyAwIDogMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRocyA9IFtcbiAgICAgICAgICAgICfZitmG2KfZitixJyxcbiAgICAgICAgICAgICfZgdio2LHYp9mK2LEnLFxuICAgICAgICAgICAgJ9mF2KfYsdizJyxcbiAgICAgICAgICAgICfYo9io2LHZitmEJyxcbiAgICAgICAgICAgICfZhdin2YrZiCcsXG4gICAgICAgICAgICAn2YrZiNmG2YrZiCcsXG4gICAgICAgICAgICAn2YrZiNmE2YrZiCcsXG4gICAgICAgICAgICAn2KPYutiz2LfYsycsXG4gICAgICAgICAgICAn2LPYqNiq2YXYqNixJyxcbiAgICAgICAgICAgICfYo9mD2KrZiNio2LEnLFxuICAgICAgICAgICAgJ9mG2YjZgdmF2KjYsScsXG4gICAgICAgICAgICAn2K/Zitiz2YXYqNixJyxcbiAgICAgICAgXTtcblxuICAgIHZhciBhciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2FyJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6ICfYp9mE2KPYrdivX9in2YTYpdir2YbZitmGX9in2YTYq9mE2KfYq9in2KFf2KfZhNij2LHYqNi52KfYoV/Yp9mE2K7ZhdmK2LNf2KfZhNis2YXYudipX9in2YTYs9io2KonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfYo9it2K9f2KXYq9mG2YrZhl/Yq9mE2KfYq9in2KFf2KPYsdio2LnYp9ihX9iu2YXZitizX9is2YXYudipX9iz2KjYqicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfYrV/Zhl/Yq1/YsV/Yrl/YrF/Ysycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC9cXHUyMDBGTS9cXHUyMDBGWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i1fNmFLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gJ9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn2YUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYp9mE2YrZiNmFINi52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LrYr9mL2Kcg2LnZhtivINin2YTYs9in2LnYqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9ij2YXYsyDYudmG2K8g2KfZhNiz2KfYudipXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW9i52YbYryDYp9mE2LPYp9i52KldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2KjYudivICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfZhdmG2LAgJXMnLFxuICAgICAgICAgICAgczogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBzczogcGx1cmFsaXplKCdzJyksXG4gICAgICAgICAgICBtOiBwbHVyYWxpemUoJ20nKSxcbiAgICAgICAgICAgIG1tOiBwbHVyYWxpemUoJ20nKSxcbiAgICAgICAgICAgIGg6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgaGg6IHBsdXJhbGl6ZSgnaCcpLFxuICAgICAgICAgICAgZDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBkZDogcGx1cmFsaXplKCdkJyksXG4gICAgICAgICAgICBNOiBwbHVyYWxpemUoJ00nKSxcbiAgICAgICAgICAgIE1NOiBwbHVyYWxpemUoJ00nKSxcbiAgICAgICAgICAgIHk6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICAgICAgeXk6IHBsdXJhbGl6ZSgneScpLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9b2aHZotmj2aTZpdmm2afZqNmp2aBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvLC9nLCAn2IwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiA2LCAvLyBTYXR1cmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiAxMiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMTJ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhcjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBemVyYmFpamFuaSBbYXpdXG4vLyEgYXV0aG9yIDogdG9wY2hpeWV2IDogaHR0cHM6Ly9naXRodWIuY29tL3RvcGNoaXlldlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN1ZmZpeGVzID0ge1xuICAgICAgICAxOiAnLWluY2knLFxuICAgICAgICA1OiAnLWluY2knLFxuICAgICAgICA4OiAnLWluY2knLFxuICAgICAgICA3MDogJy1pbmNpJyxcbiAgICAgICAgODA6ICctaW5jaScsXG4gICAgICAgIDI6ICctbmNpJyxcbiAgICAgICAgNzogJy1uY2knLFxuICAgICAgICAyMDogJy1uY2knLFxuICAgICAgICA1MDogJy1uY2knLFxuICAgICAgICAzOiAnLcO8bmPDvCcsXG4gICAgICAgIDQ6ICctw7xuY8O8JyxcbiAgICAgICAgMTAwOiAnLcO8bmPDvCcsXG4gICAgICAgIDY6ICctbmPEsScsXG4gICAgICAgIDk6ICctdW5jdScsXG4gICAgICAgIDEwOiAnLXVuY3UnLFxuICAgICAgICAzMDogJy11bmN1JyxcbiAgICAgICAgNjA6ICctxLFuY8SxJyxcbiAgICAgICAgOTA6ICctxLFuY8SxJyxcbiAgICB9O1xuXG4gICAgdmFyIGF6ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYXonLCB7XG4gICAgICAgIG1vbnRoczogJ3lhbnZhcl9mZXZyYWxfbWFydF9hcHJlbF9tYXlfaXl1bl9peXVsX2F2cXVzdF9zZW50eWFicl9va3R5YWJyX25veWFicl9kZWthYnInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAneWFuX2Zldl9tYXJfYXByX21heV9peW5faXlsX2F2cV9zZW5fb2t0X25veV9kZWsnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ0JhemFyX0JhemFyIGVydMmZc2lfw4fJmXLFn8mZbmLJmSBheMWfYW3EsV/Dh8mZcsWfyZluYsmZX0PDvG3JmSBheMWfYW3EsV9Dw7xtyZlfxZ7JmW5iyZknLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0Jhel9CekVfw4dBeF/Dh8mZcl9DQXhfQ8O8bV/FnsmZbicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdCel9CRV/Dh0Ffw4fJmV9DQV9Dw7xfxZ7JmScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2J1Z8O8biBzYWF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3NhYmFoIHNhYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW2fJmWzJmW4gaMmZZnTJmV0gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tkw7xuyZluXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1trZcOnyZluIGjJmWZ0yZldIGRkZGQgW3NhYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgc29ucmEnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMmZdnbJmWwnLFxuICAgICAgICAgICAgczogJ2JpciBuZcOnyZkgc2FuaXnJmScsXG4gICAgICAgICAgICBzczogJyVkIHNhbml5yZknLFxuICAgICAgICAgICAgbTogJ2JpciBkyZlxaXHJmScsXG4gICAgICAgICAgICBtbTogJyVkIGTJmXFpccmZJyxcbiAgICAgICAgICAgIGg6ICdiaXIgc2FhdCcsXG4gICAgICAgICAgICBoaDogJyVkIHNhYXQnLFxuICAgICAgICAgICAgZDogJ2JpciBnw7xuJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZ8O8bicsXG4gICAgICAgICAgICBNOiAnYmlyIGF5JyxcbiAgICAgICAgICAgIE1NOiAnJWQgYXknLFxuICAgICAgICAgICAgeTogJ2JpciBpbCcsXG4gICAgICAgICAgICB5eTogJyVkIGlsJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2dlY8mZfHPJmWjJmXJ8Z8O8bmTDvHp8YXjFn2FtLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14oZ8O8bmTDvHp8YXjFn2FtKSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdnZWPJmSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc8mZaMmZcic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZ8O8bmTDvHonO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2F4xZ9hbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0oxLFuY8SxfGluY2l8bmNpfMO8bmPDvHxuY8SxfHVuY3UpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgemVyb1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLcSxbmPEsSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYSA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGIgPSAobnVtYmVyICUgMTAwKSAtIGEsXG4gICAgICAgICAgICAgICAgYyA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChzdWZmaXhlc1thXSB8fCBzdWZmaXhlc1tiXSB8fCBzdWZmaXhlc1tjXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBhejtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCZWxhcnVzaWFuIFtiZV1cbi8vISBhdXRob3IgOiBEbWl0cnkgRGVtaWRvdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9kZW1pZG92OTFcbi8vISBhdXRob3I6IFByYWxlc2thOiBodHRwOi8vcHJhbGVza2EucHJvL1xuLy8hIEF1dGhvciA6IE1lbmVsaW9uIEVsZW5zw7psZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwbHVyYWwod29yZCwgbnVtKSB7XG4gICAgICAgIHZhciBmb3JtcyA9IHdvcmQuc3BsaXQoJ18nKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDEwID09PSAxICYmIG51bSAlIDEwMCAhPT0gMTFcbiAgICAgICAgICAgID8gZm9ybXNbMF1cbiAgICAgICAgICAgIDogbnVtICUgMTAgPj0gMiAmJiBudW0gJSAxMCA8PSA0ICYmIChudW0gJSAxMDAgPCAxMCB8fCBudW0gJSAxMDAgPj0gMjApXG4gICAgICAgICAgICAgID8gZm9ybXNbMV1cbiAgICAgICAgICAgICAgOiBmb3Jtc1syXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFBsdXJhbChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgc3M6IHdpdGhvdXRTdWZmaXggPyAn0YHQtdC60YPQvdC00LBf0YHQtdC60YPQvdC00Ytf0YHQtdC60YPQvdC0JyA6ICfRgdC10LrRg9C90LTRg1/RgdC10LrRg9C90LTRi1/RgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbW06IHdpdGhvdXRTdWZmaXggPyAn0YXQstGW0LvRltC90LBf0YXQstGW0LvRltC90Ytf0YXQstGW0LvRltC9JyA6ICfRhdCy0ZbQu9GW0L3Rg1/RhdCy0ZbQu9GW0L3Ri1/RhdCy0ZbQu9GW0L0nLFxuICAgICAgICAgICAgaGg6IHdpdGhvdXRTdWZmaXggPyAn0LPQsNC00LfRltC90LBf0LPQsNC00LfRltC90Ytf0LPQsNC00LfRltC9JyA6ICfQs9Cw0LTQt9GW0L3Rg1/Qs9Cw0LTQt9GW0L3Ri1/Qs9Cw0LTQt9GW0L0nLFxuICAgICAgICAgICAgZGQ6ICfQtNC30LXQvdGMX9C00L3Rll/QtNC30ZHQvScsXG4gICAgICAgICAgICBNTTogJ9C80LXRgdGP0YZf0LzQtdGB0Y/RhtGLX9C80LXRgdGP0YbQsNGeJyxcbiAgICAgICAgICAgIHl5OiAn0LPQvtC0X9Cz0LDQtNGLX9Cz0LDQtNC+0Z4nLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoa2V5ID09PSAnbScpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9GF0LLRltC70ZbQvdCwJyA6ICfRhdCy0ZbQu9GW0L3Rgyc7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaCcpIHtcbiAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ9Cz0LDQtNC30ZbQvdCwJyA6ICfQs9Cw0LTQt9GW0L3Rgyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgcGx1cmFsKGZvcm1hdFtrZXldLCArbnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBiZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JlJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ9GB0YLRg9C00LfQtdC90Y9f0LvRjtGC0LDQs9CwX9GB0LDQutCw0LLRltC60LBf0LrRgNCw0YHQsNCy0ZbQutCwX9GC0YDQsNGe0L3Rj1/Rh9GN0YDQstC10L3Rj1/Qu9GW0L/QtdC90Y9f0LbQvdGW0Z7QvdGPX9Cy0LXRgNCw0YHQvdGPX9C60LDRgdGC0YDRi9GH0L3RltC60LBf0LvRltGB0YLQsNC/0LDQtNCwX9GB0L3QtdC20L3Rjycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn0YHRgtGD0LTQt9C10L3RjF/Qu9GO0YLRi1/RgdCw0LrQsNCy0ZbQul/QutGA0LDRgdCw0LLRltC6X9GC0YDQsNCy0LXQvdGMX9GH0Y3RgNCy0LXQvdGMX9C70ZbQv9C10L3RjF/QttC90ZbQstC10L3RjF/QstC10YDQsNGB0LXQvdGMX9C60LDRgdGC0YDRi9GH0L3RltC6X9C70ZbRgdGC0LDQv9Cw0LRf0YHQvdC10LbQsNC90YwnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfRgdGC0YPQtF/Qu9GO0YJf0YHQsNC6X9C60YDQsNGBX9GC0YDQsNCyX9GH0Y3RgNCyX9C70ZbQv1/QttC90ZbQsl/QstC10YBf0LrQsNGB0YJf0LvRltGB0YJf0YHQvdC10LYnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfQvdGP0LTQt9C10LvRjl/Qv9Cw0L3Rj9C00LfQtdC70LDQul/QsNGe0YLQvtGA0LDQul/RgdC10YDQsNC00YNf0YfQsNGG0LLQtdGAX9C/0Y/RgtC90ZbRhtGDX9GB0YPQsdC+0YLRgycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn0L3Rj9C00LfQtdC70Y9f0L/QsNC90Y/QtNC30LXQu9Cw0Lpf0LDRntGC0L7RgNCw0Lpf0YHQtdGA0LDQtNCwX9GH0LDRhtCy0LXRgF/Qv9GP0YLQvdGW0YbQsF/RgdGD0LHQvtGC0LAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9cXFsgP1vQo9GD0Z5dID8oPzrQvNGW0L3Rg9C70YPRjnzQvdCw0YHRgtGD0L/QvdGD0Y4pPyA/XFxdID9kZGRkLyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C90LRf0L/QvV/QsNGCX9GB0YBf0YfRhl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0L3QtF/Qv9C9X9Cw0YJf0YHRgF/Rh9GGX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWSDQsy4nLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkg0LMuLCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkg0LMuLCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9Ch0ZHQvdC90Y8g0Z5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0JfQsNGe0YLRgNCwINGeXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9Cj0YfQvtGA0LAg0Z5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdb0KNdIGRkZGQgW9GeXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0KMg0LzRltC90YPQu9GD0Y5dIGRkZGQgW9GeXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQoyDQvNGW0L3Rg9C70YtdIGRkZGQgW9GeXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0L/RgNCw0LcgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzINGC0LDQvNGDJyxcbiAgICAgICAgICAgIHM6ICfQvdC10LrQsNC70YzQutGWINGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkOiAn0LTQt9C10L3RjCcsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE06ICfQvNC10YHRj9GGJyxcbiAgICAgICAgICAgIE1NOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeTogJ9Cz0L7QtCcsXG4gICAgICAgICAgICB5eTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9C90L7Rh9GLfNGA0LDQvdGW0YbRi3zQtNC90Y980LLQtdGH0LDRgNCwLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL14o0LTQvdGPfNCy0LXRh9Cw0YDQsCkkLy50ZXN0KGlucHV0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0L3QvtGH0YsnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GA0LDQvdGW0YbRiyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LTQvdGPJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQstC10YfQsNGA0LAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNGWfNGLfNCz0LApLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVtYmVyICUgMTAgPT09IDIgfHwgbnVtYmVyICUgMTAgPT09IDMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgJSAxMDAgIT09IDEyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgJSAxMDAgIT09IDEzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG51bWJlciArICct0ZYnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bWJlciArICct0YsnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Qs9CwJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYmU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQnVsZ2FyaWFuIFtiZ11cbi8vISBhdXRob3IgOiBLcmFzZW4gQm9yaXNvdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rcmF6XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgYmcgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdiZycsIHtcbiAgICAgICAgbW9udGhzOiAn0Y/QvdGD0LDRgNC4X9GE0LXQstGA0YPQsNGA0Lhf0LzQsNGA0YJf0LDQv9GA0LjQu1/QvNCw0Llf0Y7QvdC4X9GO0LvQuF/QsNCy0LPRg9GB0YJf0YHQtdC/0YLQtdC80LLRgNC4X9C+0LrRgtC+0LzQstGA0Lhf0L3QvtC10LzQstGA0Lhf0LTQtdC60LXQvNCy0YDQuCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfRj9C90YNf0YTQtdCyX9C80LDRgF/QsNC/0YBf0LzQsNC5X9GO0L3QuF/RjtC70Lhf0LDQstCzX9GB0LXQv1/QvtC60YJf0L3QvtC1X9C00LXQuicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfQvdC10LTQtdC70Y9f0L/QvtC90LXQtNC10LvQvdC40Lpf0LLRgtC+0YDQvdC40Lpf0YHRgNGP0LTQsF/Rh9C10YLQstGK0YDRgtGK0Lpf0L/QtdGC0YrQul/RgdGK0LHQvtGC0LAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfQvdC10LRf0L/QvtC9X9Cy0YLQvl/RgdGA0Y9f0YfQtdGCX9C/0LXRgl/RgdGK0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0L3QtF/Qv9C9X9Cy0YJf0YHRgF/Rh9GCX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0JTQvdC10YEg0LJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0KPRgtGA0LUg0LJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb0LJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0JLRh9C10YDQsCDQsl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9Cc0LjQvdCw0LvQsNGC0LBdIGRkZGQgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9Cc0LjQvdCw0LvQuNGPXSBkZGRkIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9GB0LvQtdC0ICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfQv9GA0LXQtNC4ICVzJyxcbiAgICAgICAgICAgIHM6ICfQvdGP0LrQvtC70LrQviDRgdC10LrRg9C90LTQuCcsXG4gICAgICAgICAgICBzczogJyVkINGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIG06ICfQvNC40L3Rg9GC0LAnLFxuICAgICAgICAgICAgbW06ICclZCDQvNC40L3Rg9GC0LgnLFxuICAgICAgICAgICAgaDogJ9GH0LDRgScsXG4gICAgICAgICAgICBoaDogJyVkINGH0LDRgdCwJyxcbiAgICAgICAgICAgIGQ6ICfQtNC10L0nLFxuICAgICAgICAgICAgZGQ6ICclZCDQtNC10L3QsCcsXG4gICAgICAgICAgICB3OiAn0YHQtdC00LzQuNGG0LAnLFxuICAgICAgICAgICAgd3c6ICclZCDRgdC10LTQvNC40YbQuCcsXG4gICAgICAgICAgICBNOiAn0LzQtdGB0LXRhicsXG4gICAgICAgICAgICBNTTogJyVkINC80LXRgdC10YbQsCcsXG4gICAgICAgICAgICB5OiAn0LPQvtC00LjQvdCwJyxcbiAgICAgICAgICAgIHl5OiAnJWQg0LPQvtC00LjQvdC4JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQtdCyfNC10L180YLQuHzQstC4fNGA0Lh80LzQuCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgbGFzdERpZ2l0ID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgbGFzdDJEaWdpdHMgPSBudW1iZXIgJSAxMDA7XG4gICAgICAgICAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LXQsic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3QyRGlnaXRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LXQvSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3QyRGlnaXRzID4gMTAgJiYgbGFzdDJEaWdpdHMgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdGC0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QstC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0YDQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gNyB8fCBsYXN0RGlnaXQgPT09IDgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QvNC4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0YLQuCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBiZztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCYW1iYXJhIFtibV1cbi8vISBhdXRob3IgOiBFc3RlbGxlIENvbW1lbnQgOiBodHRwczovL2dpdGh1Yi5jb20vZXN0ZWxsZWNvbW1lbnRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBibSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JtJywge1xuICAgICAgICBtb250aHM6ICdaYW53dXlla2Fsb19GZXd1cnV5ZWthbG9fTWFyaXNpa2Fsb19Bd2lyaWxpa2Fsb19NyZtrYWxvX1p1d8mbbmthbG9fWnVsdXlla2Fsb19VdGlrYWxvX1PJm3RhbmJ1cnVrYWxvX8mUa3V0yZRidXJ1a2Fsb19Ob3dhbmJ1cnVrYWxvX0Rlc2FuYnVydWthbG8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnWmFuX0Zld19NYXJfQXdpX03Jm19adXdfWnVsX1V0aV9TyZt0X8mUa3VfTm93X0Rlcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdLYXJpX050yZtuyZtuX1RhcmF0YV9BcmFiYV9BbGFtaXNhX0p1bWFfU2liaXJpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnS2FyX050yZtfVGFyX0FyYV9BbGFfSnVtX1NpYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdLYV9OdF9UYV9Bcl9BbF9KdV9TaScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdNTU1NIFt0aWxlXSBEIFtzYW5dIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnTU1NTSBbdGlsZV0gRCBbc2FuXSBZWVlZIFtsyZtyyZtdIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIE1NTU0gW3RpbGVdIEQgW3Nhbl0gWVlZWSBbbMmbcsmbXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0JpIGzJm3LJm10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tTaW5pIGzJm3LJm10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtkb24gbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0t1bnUgbMmbcsmbXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3TJm23Jm25lbiBsyZtyyZtdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMga8mUbsmUJyxcbiAgICAgICAgICAgIHBhc3Q6ICdhIGLJmyAlcyBiyZQnLFxuICAgICAgICAgICAgczogJ3NhbmdhIGRhbWEgZGFtYScsXG4gICAgICAgICAgICBzczogJ3Nla29uZGkgJWQnLFxuICAgICAgICAgICAgbTogJ21pbml0aSBrZWxlbicsXG4gICAgICAgICAgICBtbTogJ21pbml0aSAlZCcsXG4gICAgICAgICAgICBoOiAnbMmbcsmbIGtlbGVuJyxcbiAgICAgICAgICAgIGhoOiAnbMmbcsmbICVkJyxcbiAgICAgICAgICAgIGQ6ICd0aWxlIGtlbGVuJyxcbiAgICAgICAgICAgIGRkOiAndGlsZSAlZCcsXG4gICAgICAgICAgICBNOiAna2FsbyBrZWxlbicsXG4gICAgICAgICAgICBNTTogJ2thbG8gJWQnLFxuICAgICAgICAgICAgeTogJ3NhbiBrZWxlbicsXG4gICAgICAgICAgICB5eTogJ3NhbiAlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBibTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCZW5nYWxpIChCYW5nbGFkZXNoKSBbYm4tYmRdXG4vLyEgYXV0aG9yIDogQXNyYWYgSG9zc2FpbiBQYXRvYXJ5IDogaHR0cHM6Ly9naXRodWIuY29tL2FzaHdvb2xmb3JkXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+CnpycsXG4gICAgICAgICAgICAyOiAn4KeoJyxcbiAgICAgICAgICAgIDM6ICfgp6knLFxuICAgICAgICAgICAgNDogJ+CnqicsXG4gICAgICAgICAgICA1OiAn4KerJyxcbiAgICAgICAgICAgIDY6ICfgp6wnLFxuICAgICAgICAgICAgNzogJ+CnrScsXG4gICAgICAgICAgICA4OiAn4KeuJyxcbiAgICAgICAgICAgIDk6ICfgp68nLFxuICAgICAgICAgICAgMDogJ+CnpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgp6cnOiAnMScsXG4gICAgICAgICAgICAn4KeoJzogJzInLFxuICAgICAgICAgICAgJ+CnqSc6ICczJyxcbiAgICAgICAgICAgICfgp6onOiAnNCcsXG4gICAgICAgICAgICAn4KerJzogJzUnLFxuICAgICAgICAgICAgJ+CnrCc6ICc2JyxcbiAgICAgICAgICAgICfgp60nOiAnNycsXG4gICAgICAgICAgICAn4KeuJzogJzgnLFxuICAgICAgICAgICAgJ+Cnryc6ICc5JyxcbiAgICAgICAgICAgICfgp6YnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgYm5CZCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JuLWJkJywge1xuICAgICAgICBtb250aHM6ICfgppzgpr7gpqjgp4Hgp5/gpr7gprDgpr9f4Kar4KeH4Kas4KeN4Kaw4KeB4Kef4Ka+4Kaw4Ka/X+CmruCmvuCmsOCnjeCmml/gpo/gpqrgp43gprDgpr/gprJf4Kau4KeHX+CmnOCngeCmqF/gppzgp4HgprLgpr7gpodf4KaG4KaX4Ka44KeN4KafX+CmuOCnh+CmquCnjeCmn+Cnh+CmruCnjeCmrOCmsF/gpoXgppXgp43gpp/gp4vgpqzgprBf4Kao4Kat4KeH4Kau4KeN4Kas4KawX+CmoeCmv+CmuOCnh+CmruCnjeCmrOCmsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4Kac4Ka+4Kao4KeBX+Cmq+Cnh+CmrOCnjeCmsOCngV/gpq7gpr7gprDgp43gpppf4KaP4Kaq4KeN4Kaw4Ka/4KayX+CmruCnh1/gppzgp4Hgpqhf4Kac4KeB4Kay4Ka+4KaHX+CmhuCml+CmuOCnjeCmn1/gprjgp4fgpqrgp43gpp9f4KaF4KaV4KeN4Kaf4KeLX+CmqOCmreCnh1/gpqHgpr/gprjgp4cnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfgprDgpqzgpr/gpqzgpr7gprBf4Ka44KeL4Kau4Kas4Ka+4KawX+CmruCmmeCnjeCml+CmsuCmrOCmvuCmsF/gpqzgp4Hgpqfgpqzgpr7gprBf4Kas4KeD4Ka54Ka44KeN4Kaq4Kak4Ka/4Kas4Ka+4KawX+CmtuCngeCmleCnjeCmsOCmrOCmvuCmsF/gprbgpqjgpr/gpqzgpr7gprAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgprDgpqzgpr9f4Ka44KeL4KauX+CmruCmmeCnjeCml+Cmsl/gpqzgp4Hgpqdf4Kas4KeD4Ka54Ka44KeN4Kaq4Kak4Ka/X+CmtuCngeCmleCnjeCmsF/gprbgpqjgpr8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4Kaw4Kas4Ka/X+CmuOCni+Cmrl/gpq7gppngp43gppfgprJf4Kas4KeB4KanX+CmrOCng+CmuV/gprbgp4HgppXgp43gprBf4Ka24Kao4Ka/Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyDgprjgpq7gp58nLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSDgprjgpq7gp58nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgpobgppxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KaG4KaX4Ka+4Kau4KeA4KaV4Ka+4KayXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KaX4Kak4KaV4Ka+4KayXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgppfgpqRdIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4Kaq4Kaw4KeHJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgpobgppfgp4cnLFxuICAgICAgICAgICAgczogJ+CmleCnn+Cnh+CmlSDgprjgp4fgppXgp4fgpqjgp43gpqEnLFxuICAgICAgICAgICAgc3M6ICclZCDgprjgp4fgppXgp4fgpqjgp43gpqEnLFxuICAgICAgICAgICAgbTogJ+Cmj+CmlSDgpq7gpr/gpqjgpr/gpp8nLFxuICAgICAgICAgICAgbW06ICclZCDgpq7gpr/gpqjgpr/gpp8nLFxuICAgICAgICAgICAgaDogJ+Cmj+CmlSDgppjgpqjgp43gpp/gpr4nLFxuICAgICAgICAgICAgaGg6ICclZCDgppjgpqjgp43gpp/gpr4nLFxuICAgICAgICAgICAgZDogJ+Cmj+CmlSDgpqbgpr/gpqgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgpqbgpr/gpqgnLFxuICAgICAgICAgICAgTTogJ+Cmj+CmlSDgpq7gpr7gprgnLFxuICAgICAgICAgICAgTU06ICclZCDgpq7gpr7gprgnLFxuICAgICAgICAgICAgeTogJ+Cmj+CmlSDgpqzgppvgprAnLFxuICAgICAgICAgICAgeXk6ICclZCDgpqzgppvgprAnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4Ken4Keo4Kep4Keq4Ker4Kes4Ket4Keu4Kev4KemXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gprDgpr7gpqR84Kat4KeL4KawfOCmuOCmleCmvuCmsnzgpqbgp4Hgpqrgp4HgprB84Kas4Ka/4KaV4Ka+4KayfOCmuOCmqOCnjeCmp+CnjeCmr+CmvnzgprDgpr7gpqQvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgprDgpr7gpqQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpq3gp4vgprAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4Ka44KaV4Ka+4KayJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CmpuCngeCmquCngeCmsCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAzID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpqzgpr/gppXgpr7gprInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgprjgpqjgp43gpqfgp43gpq/gpr4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprDgpr7gpqQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kat4KeL4KawJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprjgppXgpr7gprInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmpuCngeCmquCngeCmsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kas4Ka/4KaV4Ka+4KayJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgprjgpqjgp43gpqfgp43gpq/gpr4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmsOCmvuCmpCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBibkJkO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEJlbmdhbGkgW2JuXVxuLy8hIGF1dGhvciA6IEthdXNoaWsgR2FuZGhpIDogaHR0cHM6Ly9naXRodWIuY29tL2thdXNoaWtnYW5kaGlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KenJyxcbiAgICAgICAgICAgIDI6ICfgp6gnLFxuICAgICAgICAgICAgMzogJ+CnqScsXG4gICAgICAgICAgICA0OiAn4KeqJyxcbiAgICAgICAgICAgIDU6ICfgp6snLFxuICAgICAgICAgICAgNjogJ+CnrCcsXG4gICAgICAgICAgICA3OiAn4KetJyxcbiAgICAgICAgICAgIDg6ICfgp64nLFxuICAgICAgICAgICAgOTogJ+CnrycsXG4gICAgICAgICAgICAwOiAn4KemJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Cnpyc6ICcxJyxcbiAgICAgICAgICAgICfgp6gnOiAnMicsXG4gICAgICAgICAgICAn4KepJzogJzMnLFxuICAgICAgICAgICAgJ+Cnqic6ICc0JyxcbiAgICAgICAgICAgICfgp6snOiAnNScsXG4gICAgICAgICAgICAn4KesJzogJzYnLFxuICAgICAgICAgICAgJ+CnrSc6ICc3JyxcbiAgICAgICAgICAgICfgp64nOiAnOCcsXG4gICAgICAgICAgICAn4KevJzogJzknLFxuICAgICAgICAgICAgJ+Cnpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBibiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JuJywge1xuICAgICAgICBtb250aHM6ICfgppzgpr7gpqjgp4Hgp5/gpr7gprDgpr9f4Kar4KeH4Kas4KeN4Kaw4KeB4Kef4Ka+4Kaw4Ka/X+CmruCmvuCmsOCnjeCmml/gpo/gpqrgp43gprDgpr/gprJf4Kau4KeHX+CmnOCngeCmqF/gppzgp4HgprLgpr7gpodf4KaG4KaX4Ka44KeN4KafX+CmuOCnh+CmquCnjeCmn+Cnh+CmruCnjeCmrOCmsF/gpoXgppXgp43gpp/gp4vgpqzgprBf4Kao4Kat4KeH4Kau4KeN4Kas4KawX+CmoeCmv+CmuOCnh+CmruCnjeCmrOCmsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4Kac4Ka+4Kao4KeBX+Cmq+Cnh+CmrOCnjeCmsOCngV/gpq7gpr7gprDgp43gpppf4KaP4Kaq4KeN4Kaw4Ka/4KayX+CmruCnh1/gppzgp4Hgpqhf4Kac4KeB4Kay4Ka+4KaHX+CmhuCml+CmuOCnjeCmn1/gprjgp4fgpqrgp43gpp9f4KaF4KaV4KeN4Kaf4KeLX+CmqOCmreCnh1/gpqHgpr/gprjgp4cnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfgprDgpqzgpr/gpqzgpr7gprBf4Ka44KeL4Kau4Kas4Ka+4KawX+CmruCmmeCnjeCml+CmsuCmrOCmvuCmsF/gpqzgp4Hgpqfgpqzgpr7gprBf4Kas4KeD4Ka54Ka44KeN4Kaq4Kak4Ka/4Kas4Ka+4KawX+CmtuCngeCmleCnjeCmsOCmrOCmvuCmsF/gprbgpqjgpr/gpqzgpr7gprAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgprDgpqzgpr9f4Ka44KeL4KauX+CmruCmmeCnjeCml+Cmsl/gpqzgp4Hgpqdf4Kas4KeD4Ka54Ka44KeN4Kaq4Kak4Ka/X+CmtuCngeCmleCnjeCmsF/gprbgpqjgpr8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4Kaw4Kas4Ka/X+CmuOCni+Cmrl/gpq7gppngp43gppfgprJf4Kas4KeB4KanX+CmrOCng+CmuV/gprbgp4HgppXgp43gprBf4Ka24Kao4Ka/Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0g4Ka44Kau4KefJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyDgprjgpq7gp58nLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCmuOCmruCnnycsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSDgprjgpq7gp58nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgpobgppxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KaG4KaX4Ka+4Kau4KeA4KaV4Ka+4KayXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KaX4Kak4KaV4Ka+4KayXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgppfgpqRdIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4Kaq4Kaw4KeHJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgpobgppfgp4cnLFxuICAgICAgICAgICAgczogJ+CmleCnn+Cnh+CmlSDgprjgp4fgppXgp4fgpqjgp43gpqEnLFxuICAgICAgICAgICAgc3M6ICclZCDgprjgp4fgppXgp4fgpqjgp43gpqEnLFxuICAgICAgICAgICAgbTogJ+Cmj+CmlSDgpq7gpr/gpqjgpr/gpp8nLFxuICAgICAgICAgICAgbW06ICclZCDgpq7gpr/gpqjgpr/gpp8nLFxuICAgICAgICAgICAgaDogJ+Cmj+CmlSDgppjgpqjgp43gpp/gpr4nLFxuICAgICAgICAgICAgaGg6ICclZCDgppjgpqjgp43gpp/gpr4nLFxuICAgICAgICAgICAgZDogJ+Cmj+CmlSDgpqbgpr/gpqgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgpqbgpr/gpqgnLFxuICAgICAgICAgICAgTTogJ+Cmj+CmlSDgpq7gpr7gprgnLFxuICAgICAgICAgICAgTU06ICclZCDgpq7gpr7gprgnLFxuICAgICAgICAgICAgeTogJ+Cmj+CmlSDgpqzgppvgprAnLFxuICAgICAgICAgICAgeXk6ICclZCDgpqzgppvgprAnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4Ken4Keo4Kep4Keq4Ker4Kes4Ket4Keu4Kev4KemXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4Kaw4Ka+4KakfOCmuOCmleCmvuCmsnzgpqbgp4Hgpqrgp4HgprB84Kas4Ka/4KaV4Ka+4KayfOCmsOCmvuCmpC8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobWVyaWRpZW0gPT09ICfgprDgpr7gpqQnICYmIGhvdXIgPj0gNCkgfHxcbiAgICAgICAgICAgICAgICAobWVyaWRpZW0gPT09ICfgpqbgp4Hgpqrgp4HgprAnICYmIGhvdXIgPCA1KSB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4Kas4Ka/4KaV4Ka+4KayJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmsOCmvuCmpCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Ka44KaV4Ka+4KayJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpqbgp4Hgpqrgp4HgprAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CmrOCmv+CmleCmvuCmsic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kaw4Ka+4KakJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRpYmV0YW4gW2JvXVxuLy8hIGF1dGhvciA6IFRodXB0ZW4gTi4gQ2hha3Jpc2hhciA6IGh0dHBzOi8vZ2l0aHViLmNvbS92YWpyYWRvZ1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgvKEnLFxuICAgICAgICAgICAgMjogJ+C8oicsXG4gICAgICAgICAgICAzOiAn4LyjJyxcbiAgICAgICAgICAgIDQ6ICfgvKQnLFxuICAgICAgICAgICAgNTogJ+C8pScsXG4gICAgICAgICAgICA2OiAn4LymJyxcbiAgICAgICAgICAgIDc6ICfgvKcnLFxuICAgICAgICAgICAgODogJ+C8qCcsXG4gICAgICAgICAgICA5OiAn4LypJyxcbiAgICAgICAgICAgIDA6ICfgvKAnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4LyhJzogJzEnLFxuICAgICAgICAgICAgJ+C8oic6ICcyJyxcbiAgICAgICAgICAgICfgvKMnOiAnMycsXG4gICAgICAgICAgICAn4LykJzogJzQnLFxuICAgICAgICAgICAgJ+C8pSc6ICc1JyxcbiAgICAgICAgICAgICfgvKYnOiAnNicsXG4gICAgICAgICAgICAn4LynJzogJzcnLFxuICAgICAgICAgICAgJ+C8qCc6ICc4JyxcbiAgICAgICAgICAgICfgvKknOiAnOScsXG4gICAgICAgICAgICAn4LygJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGJvID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYm8nLCB7XG4gICAgICAgIG1vbnRoczogJ+C9n+C+s+C8i+C9luC8i+C9keC9hOC8i+C9lOC9vF/gvZ/gvrPgvIvgvZbgvIvgvYLgvYngvbLgvabgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2C4L2m4L204L2Y4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9nuC9suC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvaPgvpTgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2R4L6y4L204L2C4LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9keC9tOC9k+C8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvaLgvpLgvrHgvZHgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2R4L2C4L204LyL4L2UX+C9n+C+s+C8i+C9luC8i+C9luC9heC9tOC8i+C9lF/gvZ/gvrPgvIvgvZbgvIvgvZbgvYXgvbTgvIvgvYLgvYXgvbLgvYLgvIvgvZRf4L2f4L6z4LyL4L2W4LyL4L2W4L2F4L204LyL4L2C4L2J4L2y4L2m4LyL4L2UJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgvZ/gvrPgvIsxX+C9n+C+s+C8izJf4L2f4L6z4LyLM1/gvZ/gvrPgvIs0X+C9n+C+s+C8izVf4L2f4L6z4LyLNl/gvZ/gvrPgvIs3X+C9n+C+s+C8izhf4L2f4L6z4LyLOV/gvZ/gvrPgvIsxMF/gvZ/gvrPgvIsxMV/gvZ/gvrPgvIsxMicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiAvXijgvZ/gvrPgvItcXGR7MSwyfSkvLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICfgvYLgvZ/gvaDgvIvgvYngvbLgvIvgvZjgvItf4L2C4L2f4L2g4LyL4L2f4L6z4LyL4L2W4LyLX+C9guC9n+C9oOC8i+C9mOC9suC9guC8i+C9keC9mOC9ouC8i1/gvYLgvZ/gvaDgvIvgvaPgvrfgvYLgvIvgvZTgvItf4L2C4L2f4L2g4LyL4L2V4L204L2i4LyL4L2W4L20X+C9guC9n+C9oOC8i+C9lOC8i+C9puC9hOC9puC8i1/gvYLgvZ/gvaDgvIvgvabgvqTgvbrgvZPgvIvgvZTgvIsnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+C9ieC9suC8i+C9mOC8i1/gvZ/gvrPgvIvgvZbgvItf4L2Y4L2y4L2C4LyL4L2R4L2Y4L2i4LyLX+C9o+C+t+C9guC8i+C9lOC8i1/gvZXgvbTgvaLgvIvgvZbgvbRf4L2U4LyL4L2m4L2E4L2m4LyLX+C9puC+pOC9uuC9k+C8i+C9lOC8iycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgvYngvbJf4L2f4L6zX+C9mOC9suC9gl/gvaPgvrfgvYJf4L2V4L204L2iX+C9puC9hOC9pl/gvabgvqTgvbrgvZMnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbScsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4L2R4L2y4LyL4L2i4L2y4L2EXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+C9puC9hOC8i+C9ieC9suC9k10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4L2W4L2R4L204L2T4LyL4L2V4L6y4L2C4LyL4L2i4L6X4L264L2m4LyL4L2YXSwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgvYHgvIvgvabgvYRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+C9luC9keC9tOC9k+C8i+C9leC+suC9guC8i+C9mOC9kOC9oOC8i+C9mF0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgvaPgvIsnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOC9puC+lOC9k+C8i+C9oycsXG4gICAgICAgICAgICBzOiAn4L2j4L2Y4LyL4L2m4L2EJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4L2m4L6Q4L2i4LyL4L2G4LyNJyxcbiAgICAgICAgICAgIG06ICfgvabgvpDgvaLgvIvgvZjgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgbW06ICclZCDgvabgvpDgvaLgvIvgvZgnLFxuICAgICAgICAgICAgaDogJ+C9huC9tOC8i+C9muC9vOC9keC8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICBoaDogJyVkIOC9huC9tOC8i+C9muC9vOC9kScsXG4gICAgICAgICAgICBkOiAn4L2J4L2y4L2T4LyL4L2C4L2F4L2y4L2CJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4L2J4L2y4L2T4LyLJyxcbiAgICAgICAgICAgIE06ICfgvZ/gvrPgvIvgvZbgvIvgvYLgvYXgvbLgvYInLFxuICAgICAgICAgICAgTU06ICclZCDgvZ/gvrPgvIvgvZYnLFxuICAgICAgICAgICAgeTogJ+C9o+C9vOC8i+C9guC9heC9suC9gicsXG4gICAgICAgICAgICB5eTogJyVkIOC9o+C9vCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgvKHgvKLgvKPgvKTgvKXgvKbgvKfgvKjgvKngvKBdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gvZjgvZrgvZPgvIvgvZjgvbx84L2e4L284L2C4L2m4LyL4L2A4L2mfOC9ieC9suC9k+C8i+C9guC9tOC9hHzgvZHgvYLgvbzgvYTgvIvgvZHgvYJ84L2Y4L2a4L2T4LyL4L2Y4L28LyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+C9mOC9muC9k+C8i+C9mOC9vCcgJiYgaG91ciA+PSA0KSB8fFxuICAgICAgICAgICAgICAgIChtZXJpZGllbSA9PT0gJ+C9ieC9suC9k+C8i+C9guC9tOC9hCcgJiYgaG91ciA8IDUpIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgvZHgvYLgvbzgvYTgvIvgvZHgvYInXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2Y4L2a4L2T4LyL4L2Y4L28JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvZ7gvbzgvYLgvabgvIvgvYDgvaYnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C9ieC9suC9k+C8i+C9guC9tOC9hCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4L2R4L2C4L284L2E4LyL4L2R4L2CJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgvZjgvZrgvZPgvIvgvZjgvbwnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYm87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQnJldG9uIFticl1cbi8vISBhdXRob3IgOiBKZWFuLUJhcHRpc3RlIExlIER1aWdvdSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYmxlZHVpZ291XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoTXV0YXRpb24obnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIG1tOiAnbXVudXRlbm4nLFxuICAgICAgICAgICAgTU06ICdtaXonLFxuICAgICAgICAgICAgZGQ6ICdkZXZlemgnLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbnVtYmVyICsgJyAnICsgbXV0YXRpb24oZm9ybWF0W2tleV0sIG51bWJlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNwZWNpYWxNdXRhdGlvbkZvclllYXJzKG51bWJlcikge1xuICAgICAgICBzd2l0Y2ggKGxhc3ROdW1iZXIobnVtYmVyKSkge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnIGJsb2F6JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgdmxvYXonO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxhc3ROdW1iZXIobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPiA5KSB7XG4gICAgICAgICAgICByZXR1cm4gbGFzdE51bWJlcihudW1iZXIgJSAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gbXV0YXRpb24odGV4dCwgbnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBzb2Z0TXV0YXRpb24odGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNvZnRNdXRhdGlvbih0ZXh0KSB7XG4gICAgICAgIHZhciBtdXRhdGlvblRhYmxlID0ge1xuICAgICAgICAgICAgbTogJ3YnLFxuICAgICAgICAgICAgYjogJ3YnLFxuICAgICAgICAgICAgZDogJ3onLFxuICAgICAgICB9O1xuICAgICAgICBpZiAobXV0YXRpb25UYWJsZVt0ZXh0LmNoYXJBdCgwKV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG11dGF0aW9uVGFibGVbdGV4dC5jaGFyQXQoMCldICsgdGV4dC5zdWJzdHJpbmcoMSk7XG4gICAgfVxuXG4gICAgdmFyIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15nZW4vaSxcbiAgICAgICAgICAgIC9eY1vKvFxcJ11od2UvaSxcbiAgICAgICAgICAgIC9ebWV1L2ksXG4gICAgICAgICAgICAvXmVici9pLFxuICAgICAgICAgICAgL15tYWUvaSxcbiAgICAgICAgICAgIC9eKG1lenxldmUpL2ksXG4gICAgICAgICAgICAvXmdvdS9pLFxuICAgICAgICAgICAgL15lb3MvaSxcbiAgICAgICAgICAgIC9eZ3dlL2ksXG4gICAgICAgICAgICAvXmhlci9pLFxuICAgICAgICAgICAgL15kdS9pLFxuICAgICAgICAgICAgL15rZXIvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbW9udGhzUmVnZXggPVxuICAgICAgICAgICAgL14oZ2VudmVyfGNbyrxcXCddaHdldnJlcnxtZXVyemh8ZWJyZWx8bWFlfG1lemhldmVufGdvdWVyZXxlb3N0fGd3ZW5nb2xvfGhlcmV8ZHV8a2VyenV8Z2VufGNbyrxcXCddaHdlfG1ldXxlYnJ8bWFlfGV2ZXxnb3V8ZW9zfGd3ZXxoZXJ8ZHV8a2VyKS9pLFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleCA9XG4gICAgICAgICAgICAvXihnZW52ZXJ8Y1vKvFxcJ11od2V2cmVyfG1ldXJ6aHxlYnJlbHxtYWV8bWV6aGV2ZW58Z291ZXJlfGVvc3R8Z3dlbmdvbG98aGVyZXxkdXxrZXJ6dSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9XG4gICAgICAgICAgICAvXihnZW58Y1vKvFxcJ11od2V8bWV1fGVicnxtYWV8ZXZlfGdvdXxlb3N8Z3dlfGhlcnxkdXxrZXIpL2ksXG4gICAgICAgIGZ1bGxXZWVrZGF5c1BhcnNlID0gW1xuICAgICAgICAgICAgL15zdWwvaSxcbiAgICAgICAgICAgIC9ebHVuL2ksXG4gICAgICAgICAgICAvXm1ldXJ6aC9pLFxuICAgICAgICAgICAgL15tZXJjW8q8XFwnXWhlci9pLFxuICAgICAgICAgICAgL155YW91L2ksXG4gICAgICAgICAgICAvXmd3ZW5lci9pLFxuICAgICAgICAgICAgL15zYWRvcm4vaSxcbiAgICAgICAgXSxcbiAgICAgICAgc2hvcnRXZWVrZGF5c1BhcnNlID0gW1xuICAgICAgICAgICAgL15TdWwvaSxcbiAgICAgICAgICAgIC9eTHVuL2ksXG4gICAgICAgICAgICAvXk1ldS9pLFxuICAgICAgICAgICAgL15NZXIvaSxcbiAgICAgICAgICAgIC9eWWFvL2ksXG4gICAgICAgICAgICAvXkd3ZS9pLFxuICAgICAgICAgICAgL15TYWQvaSxcbiAgICAgICAgXSxcbiAgICAgICAgbWluV2Vla2RheXNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eU3UvaSxcbiAgICAgICAgICAgIC9eTHUvaSxcbiAgICAgICAgICAgIC9eTWUoW15yXXwkKS9pLFxuICAgICAgICAgICAgL15NZXIvaSxcbiAgICAgICAgICAgIC9eWWEvaSxcbiAgICAgICAgICAgIC9eR3cvaSxcbiAgICAgICAgICAgIC9eU2EvaSxcbiAgICAgICAgXTtcblxuICAgIHZhciBiciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2JyJywge1xuICAgICAgICBtb250aHM6ICdHZW52ZXJfQ8q8aHdldnJlcl9NZXVyemhfRWJyZWxfTWFlX01lemhldmVuX0dvdWVyZV9Fb3N0X0d3ZW5nb2xvX0hlcmVfRHVfS2VyenUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnR2VuX0PKvGh3ZV9NZXVfRWJyX01hZV9FdmVfR291X0Vvc19Hd2VfSGVyX0R1X0tlcicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdWxfTHVuX01ldXJ6aF9NZXJjyrxoZXJfWWFvdV9Hd2VuZXJfU2Fkb3JuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VsX0x1bl9NZXVfTWVyX1lhb19Hd2VfU2FkJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X0x1X01lX01lcl9ZYV9Hd19TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZTogbWluV2Vla2RheXNQYXJzZSxcbiAgICAgICAgZnVsbFdlZWtkYXlzUGFyc2U6IGZ1bGxXZWVrZGF5c1BhcnNlLFxuICAgICAgICBzaG9ydFdlZWtkYXlzUGFyc2U6IHNob3J0V2Vla2RheXNQYXJzZSxcbiAgICAgICAgbWluV2Vla2RheXNQYXJzZTogbWluV2Vla2RheXNQYXJzZSxcblxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDogbW9udGhzU3RyaWN0UmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6IG1vbnRoc1Nob3J0U3RyaWN0UmVnZXgsXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG5cbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIFthIHZpel0gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2Egdml6XSBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW2Egdml6XSBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIaXppdiBkYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tXYXJjyrxob2F6aCBkYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtkYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tEZWPKvGggZGFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbcGFzZXQgZGFdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnYS1iZW5uICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDKvHpvJyxcbiAgICAgICAgICAgIHM6ICd1biBuZWJldWQgc2Vnb25kZW5ub8O5JyxcbiAgICAgICAgICAgIHNzOiAnJWQgZWlsZW5uJyxcbiAgICAgICAgICAgIG06ICd1ciB2dW51dGVubicsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aE11dGF0aW9uLFxuICAgICAgICAgICAgaDogJ3VuIGV1cicsXG4gICAgICAgICAgICBoaDogJyVkIGV1cicsXG4gICAgICAgICAgICBkOiAndW4gZGV2ZXpoJyxcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVXaXRoTXV0YXRpb24sXG4gICAgICAgICAgICBNOiAndXIgbWl6JyxcbiAgICAgICAgICAgIE1NOiByZWxhdGl2ZVRpbWVXaXRoTXV0YXRpb24sXG4gICAgICAgICAgICB5OiAndXIgYmxvYXonLFxuICAgICAgICAgICAgeXk6IHNwZWNpYWxNdXRhdGlvbkZvclllYXJzLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oYcOxfHZldCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbnVtYmVyID09PSAxID8gJ2HDsScgOiAndmV0JztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2EubS58Zy5tLi8sIC8vIGdvdWRlIG1lcmVubiB8IGEtcmFvayBtZXJlbm5cbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW4gPT09ICdnLm0uJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBob3VyIDwgMTIgPyAnYS5tLicgOiAnZy5tLic7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYnI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQm9zbmlhbiBbYnNdXG4vLyEgYXV0aG9yIDogTmVkaW0gQ2hvbGljaCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9mcm9udHlhcmRcbi8vISBhdXRob3IgOiBSYXNpZCBSZWR6aWMgOiBodHRwczovL2dpdGh1Yi5jb20vcmFzaWRyZVxuLy8hIGJhc2VkIG9uIChocikgdHJhbnNsYXRpb24gYnkgQm9qYW4gTWFya292acSHXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXhcbiAgICAgICAgICAgICAgICAgICAgPyAnamVkbmEgbWludXRhJ1xuICAgICAgICAgICAgICAgICAgICA6IGlzRnV0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgPyAnamVkbnUgbWludXR1J1xuICAgICAgICAgICAgICAgICAgICAgIDogJ2plZG5lIG1pbnV0ZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0YSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0ZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnamVkYW4gc2F0JyA6ICdqZWRhbiBzYXQnO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyIHx8IG51bWJlciA9PT0gMyB8fCBudW1iZXIgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzYXRhJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdGknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdkYW4nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZGFuYSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlYyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21qZXNlY2EnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdnb2RpbmEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnYnMnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcnRfYXByaWxfbWFqX2p1bmlfanVsaV9hdWd1c3Rfc2VwdGVtYmFyX29rdG9iYXJfbm92ZW1iYXJfZGVjZW1iYXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tYXIuX2Fwci5fbWFqLl9qdW4uX2p1bC5fYXVnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkamVsamFfcG9uZWRqZWxqYWtfdXRvcmFrX3NyaWplZGFfxI1ldHZydGFrX3BldGFrX3N1Ym90YScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lZC5fcG9uLl91dG8uX3NyaS5fxI1ldC5fcGV0Ll9zdWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3V0X3NyX8SNZV9wZV9zdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZGFuYXMgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tzdXRyYSB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbbmVkamVsanVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzcmlqZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3Vib3R1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbanXEjWVyIHVdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWxlXSBbc3Vib3RlXSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcm/FoWxpXSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByaWplICVzJyxcbiAgICAgICAgICAgIHM6ICdwYXIgc2VrdW5kaScsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogJ2RhbicsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogJ21qZXNlYycsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogJ2dvZGludScsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGJzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENhdGFsYW4gW2NhXVxuLy8hIGF1dGhvciA6IEp1YW4gRy4gSHVydGFkbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qdWFuZ2h1cnRhZG9cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBjYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2NhJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ2dlbmVyX2ZlYnJlcl9tYXLDp19hYnJpbF9tYWlnX2p1bnlfanVsaW9sX2Fnb3N0X3NldGVtYnJlX29jdHVicmVfbm92ZW1icmVfZGVzZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiBcImRlIGdlbmVyX2RlIGZlYnJlcl9kZSBtYXLDp19kJ2FicmlsX2RlIG1haWdfZGUganVueV9kZSBqdWxpb2xfZCdhZ29zdF9kZSBzZXRlbWJyZV9kJ29jdHVicmVfZGUgbm92ZW1icmVfZGUgZGVzZW1icmVcIi5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL0Rbb0RdPyhcXHMpK01NTU0vLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdnZW4uX2ZlYnIuX21hcsOnX2Fici5fbWFpZ19qdW55X2p1bC5fYWcuX3NldC5fb2N0Ll9ub3YuX2Rlcy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnZGl1bWVuZ2VfZGlsbHVuc19kaW1hcnRzX2RpbWVjcmVzX2Rpam91c19kaXZlbmRyZXNfZGlzc2FidGUnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RnLl9kbC5fZHQuX2RjLl9kai5fZHYuX2RzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkZ19kbF9kdF9kY19kal9kdl9kcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIGxsOiAnRCBNTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gW2RlXSBZWVlZIFthIGxlc10gSDptbScsXG4gICAgICAgICAgICBsbGw6ICdEIE1NTSBZWVlZLCBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBbZGVdIFlZWVkgW2EgbGVzXSBIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQgRCBNTU0gWVlZWSwgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYXZ1aSBhICcgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ2xlcycgOiAnbGEnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbZGVtw6AgYSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdsZXMnIDogJ2xhJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW2EgJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnbGVzJyA6ICdsYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1thaGlyIGEgJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnbGVzJyA6ICdsYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tlbF0gZGRkZCBbcGFzc2F0IGEgJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnbGVzJyA6ICdsYScpICtcbiAgICAgICAgICAgICAgICAgICAgJ10gTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogXCJkJ2FxdcOtICVzXCIsXG4gICAgICAgICAgICBwYXN0OiAnZmEgJXMnLFxuICAgICAgICAgICAgczogJ3VucyBzZWdvbnMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWdvbnMnLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRzJyxcbiAgICAgICAgICAgIGg6ICd1bmEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmVzJyxcbiAgICAgICAgICAgIGQ6ICd1biBkaWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkaWVzJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNvcycsXG4gICAgICAgICAgICB5OiAndW4gYW55JyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW55cycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShyfG58dHzDqHxhKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgbnVtYmVyID09PSAxXG4gICAgICAgICAgICAgICAgICAgID8gJ3InXG4gICAgICAgICAgICAgICAgICAgIDogbnVtYmVyID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgPyAnbidcbiAgICAgICAgICAgICAgICAgICAgICA6IG51bWJlciA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAncidcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVtYmVyID09PSA0XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogJ8OoJztcbiAgICAgICAgICAgIGlmIChwZXJpb2QgPT09ICd3JyB8fCBwZXJpb2QgPT09ICdXJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9ICdhJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDemVjaCBbY3NdXG4vLyEgYXV0aG9yIDogcGV0cmJlbGEgOiBodHRwczovL2dpdGh1Yi5jb20vcGV0cmJlbGFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPSB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdsZWRlbl/Dum5vcl9ixZllemVuX2R1YmVuX2t2xJt0ZW5fxI1lcnZlbl/EjWVydmVuZWNfc3JwZW5fesOhxZnDrV/FmcOtamVuX2xpc3RvcGFkX3Byb3NpbmVjJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogJ2xlZG5hX8O6bm9yYV9ixZllem5hX2R1Ym5hX2t2xJt0bmFfxI1lcnZuYV/EjWVydmVuY2Vfc3JwbmFfesOhxZnDrV/FmcOtam5hX2xpc3RvcGFkdV9wcm9zaW5jZScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9ERD9bby5dPyhcXFtbXlxcW1xcXV0qXFxdfFxccykrTU1NTS8sXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2xlZF/Dum5vX2LFmWVfZHViX2t2xJtfxI12bl/EjXZjX3NycF96w6HFmV/FmcOtal9saXNfcHJvJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9ebGVkL2ksXG4gICAgICAgICAgICAvXsO6bm8vaSxcbiAgICAgICAgICAgIC9eYsWZZS9pLFxuICAgICAgICAgICAgL15kdWIvaSxcbiAgICAgICAgICAgIC9ea3bEmy9pLFxuICAgICAgICAgICAgL14oxI12bnzEjWVydmVuJHzEjWVydm5hKS9pLFxuICAgICAgICAgICAgL14oxI12Y3zEjWVydmVuZWN8xI1lcnZlbmNlKS9pLFxuICAgICAgICAgICAgL15zcnAvaSxcbiAgICAgICAgICAgIC9eesOhxZkvaSxcbiAgICAgICAgICAgIC9exZnDrWovaSxcbiAgICAgICAgICAgIC9ebGlzL2ksXG4gICAgICAgICAgICAvXnByby9pLFxuICAgICAgICBdLFxuICAgICAgICAvLyBOT1RFOiAnxI1lcnZlbicgaXMgc3Vic3RyaW5nIG9mICfEjWVydmVuZWMnOyB0aGVyZWZvcmUgJ8SNZXJ2ZW5lYycgbXVzdCBwcmVjZWRlICfEjWVydmVuJyBpbiB0aGUgcmVnZXggdG8gYmUgZnVsbHkgbWF0Y2hlZC5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIHBhcnNlciBtYXRjaGVzICcxLiDEjWVydmVuZWMnIGFzICcxLiDEjWVydmVuJyArICdlYycuXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGxlZGVufMO6bm9yfGLFmWV6ZW58ZHViZW58a3bEm3RlbnzEjWVydmVuZWN8xI1lcnZlbmNlfMSNZXJ2ZW58xI1lcnZuYXxzcnBlbnx6w6HFmcOtfMWZw61qZW58bGlzdG9wYWR8cHJvc2luZWN8bGVkfMO6bm98YsWZZXxkdWJ8a3bEm3zEjXZufMSNdmN8c3JwfHrDocWZfMWZw61qfGxpc3xwcm8pL2k7XG5cbiAgICBmdW5jdGlvbiBwbHVyYWwobikge1xuICAgICAgICByZXR1cm4gbiA+IDEgJiYgbiA8IDUgJiYgfn4obiAvIDEwKSAhPT0gMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAncyc6IC8vIGEgZmV3IHNlY29uZHMgLyBpbiBhIGZldyBzZWNvbmRzIC8gYSBmZXcgc2Vjb25kcyBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdww6FyIHNla3VuZCcgOiAncMOhciBzZWt1bmRhbWknO1xuICAgICAgICAgICAgY2FzZSAnc3MnOiAvLyA5IHNlY29uZHMgLyBpbiA5IHNlY29uZHMgLyA5IHNlY29uZHMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdzZWt1bmR5JyA6ICdzZWt1bmQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ3Nla3VuZGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbSc6IC8vIGEgbWludXRlIC8gaW4gYSBtaW51dGUgLyBhIG1pbnV0ZSBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdtaW51dGEnIDogaXNGdXR1cmUgPyAnbWludXR1JyA6ICdtaW51dG91JztcbiAgICAgICAgICAgIGNhc2UgJ21tJzogLy8gOSBtaW51dGVzIC8gaW4gOSBtaW51dGVzIC8gOSBtaW51dGVzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbWludXR5JyA6ICdtaW51dCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnbWludXRhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2gnOiAvLyBhbiBob3VyIC8gaW4gYW4gaG91ciAvIGFuIGhvdXIgYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnaG9kaW5hJyA6IGlzRnV0dXJlID8gJ2hvZGludScgOiAnaG9kaW5vdSc7XG4gICAgICAgICAgICBjYXNlICdoaCc6IC8vIDkgaG91cnMgLyBpbiA5IGhvdXJzIC8gOSBob3VycyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2hvZGlueScgOiAnaG9kaW4nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2hvZGluYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdkJzogLy8gYSBkYXkgLyBpbiBhIGRheSAvIGEgZGF5IGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2RlbicgOiAnZG5lbSc7XG4gICAgICAgICAgICBjYXNlICdkZCc6IC8vIDkgZGF5cyAvIGluIDkgZGF5cyAvIDkgZGF5cyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ2RueScgOiAnZG7DrScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnZG55JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdNJzogLy8gYSBtb250aCAvIGluIGEgbW9udGggLyBhIG1vbnRoIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ23Em3PDrWMnIDogJ23Em3PDrWNlbSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6IC8vIDkgbW9udGhzIC8gaW4gOSBtb250aHMgLyA5IG1vbnRocyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ23Em3PDrWNlJyA6ICdtxJtzw61jxa8nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ23Em3PDrWNpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICd5JzogLy8gYSB5ZWFyIC8gaW4gYSB5ZWFyIC8gYSB5ZWFyIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3JvaycgOiAncm9rZW0nO1xuICAgICAgICAgICAgY2FzZSAneXknOiAvLyA5IHllYXJzIC8gaW4gOSB5ZWFycyAvIDkgeWVhcnMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdyb2t5JyA6ICdsZXQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2xldHknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2NzJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRoc1Nob3J0LFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICAvLyBOT1RFOiAnxI1lcnZlbicgaXMgc3Vic3RyaW5nIG9mICfEjWVydmVuZWMnOyB0aGVyZWZvcmUgJ8SNZXJ2ZW5lYycgbXVzdCBwcmVjZWRlICfEjWVydmVuJyBpbiB0aGUgcmVnZXggdG8gYmUgZnVsbHkgbWF0Y2hlZC5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIHBhcnNlciBtYXRjaGVzICcxLiDEjWVydmVuZWMnIGFzICcxLiDEjWVydmVuJyArICdlYycuXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14obGVkZW58bGVkbmF8w7pub3JhfMO6bm9yfGLFmWV6ZW58YsWZZXpuYXxkdWJlbnxkdWJuYXxrdsSbdGVufGt2xJt0bmF8xI1lcnZlbmVjfMSNZXJ2ZW5jZXzEjWVydmVufMSNZXJ2bmF8c3JwZW58c3JwbmF8esOhxZnDrXzFmcOtamVufMWZw61qbmF8bGlzdG9wYWR1fGxpc3RvcGFkfHByb3NpbmVjfHByb3NpbmNlKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14obGVkfMO6bm98YsWZZXxkdWJ8a3bEm3zEjXZufMSNdmN8c3JwfHrDocWZfMWZw61qfGxpc3xwcm8pL2ksXG4gICAgICAgIG1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgbG9uZ01vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgc2hvcnRNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkxJtsZV9wb25kxJtsw61fw7p0ZXLDvV9zdMWZZWRhX8SNdHZydGVrX3DDoXRla19zb2JvdGEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZV9wb1/DunRfc3RfxI10X3DDoV9zbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb1/DunRfc3RfxI10X3DDoV9zbycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIGw6ICdELiBNLiBZWVlZJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZG5lcyB2XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW3rDrXRyYSB2XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IG5lZMSbbGkgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIGRkZGQgW3ZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdmUgc3TFmWVkdSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZlIMSNdHZydGVrIHZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBww6F0ZWsgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHNvYm90dSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbdsSNZXJhIHZdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsb3UgbmVkxJtsaSB2XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDqV0gZGRkZCBbdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bG91IHN0xZllZHUgdl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw71dIGRkZGQgW3ZdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWxvdSBzb2JvdHUgdl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3phICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwxZllZCAlcycsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3M7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2h1dmFzaCBbY3ZdXG4vLyEgYXV0aG9yIDogQW5hdG9seSBNaXJvbm92IDogaHR0cHM6Ly9naXRodWIuY29tL21pcm9udG9saVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGN2ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnY3YnLCB7XG4gICAgICAgIG1vbnRoczogJ9C605HRgNC70LDRh1/QvdCw0YDTkdGBX9C/0YPRiF/QsNC60LBf0LzQsNC5X9Kr05fRgNGC0LzQtV/Rg9GC05Ff0qvRg9GA0LvQsF/QsNCy05HQvV/RjtC/0LBf0YfTs9C6X9GA0LDRiNGC0LDQsicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfQutOR0YBf0L3QsNGAX9C/0YPRiF/QsNC60LBf0LzQsNC5X9Kr05fRgF/Rg9GC05Ff0qvRg9GAX9Cw0LLQvV/RjtC/0LBf0YfTs9C6X9GA0LDRiCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn0LLRi9GA0YHQsNGA0L3QuNC60YPQvV/RgtGD0L3RgtC40LrRg9C9X9GL0YLQu9Cw0YDQuNC60YPQvV/RjtC90LrRg9C9X9C605fSq9C90LXRgNC90LjQutGD0L1f0Y3RgNC90LXQutGD0L1f0YjTkdC80LDRgtC60YPQvScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0LLRi9GAX9GC0YPQvV/Ri9GC0Ltf0Y7QvV/QutOX0qtf0Y3RgNC9X9GI05HQvCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQstGAX9GC0L1f0YvRgl/RjtC9X9C60qtf0Y3RgF/RiNC8Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQtTU0tWVlZWScsXG4gICAgICAgICAgICBMTDogJ1lZWVkgW9Kr0YPQu9GF0LhdIE1NTU0gW9GD0LnTkdGF05fQvV0gRFst0LzTl9GI05ddJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkgW9Kr0YPQu9GF0LhdIE1NTU0gW9GD0LnTkdGF05fQvV0gRFst0LzTl9GI05ddLCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgWVlZWSBb0qvRg9C70YXQuF0gTU1NTSBb0YPQudOR0YXTl9C9XSBEWy3QvNOX0YjTl10sIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0J/QsNGP0L1dIExUIFvRgdC10YXQtdGC0YDQtV0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQq9GA0LDQvV0gTFQgW9GB0LXRhdC10YLRgNC1XScsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9OW0L3QtdGAXSBMVCBb0YHQtdGF0LXRgtGA0LVdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW9Kq0LjRgtC10YFdIGRkZGQgTFQgW9GB0LXRhdC10YLRgNC1XScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vQmNGA0YLQvdOXXSBkZGRkIExUIFvRgdC10YXQtdGC0YDQtV0nLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6IGZ1bmN0aW9uIChvdXRwdXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWZmaXggPSAv0YHQtdGF0LXRgiQvaS5leGVjKG91dHB1dClcbiAgICAgICAgICAgICAgICAgICAgPyAn0YDQtdC9J1xuICAgICAgICAgICAgICAgICAgICA6IC/Sq9GD0LskL2kuZXhlYyhvdXRwdXQpXG4gICAgICAgICAgICAgICAgICAgICAgPyAn0YLQsNC9J1xuICAgICAgICAgICAgICAgICAgICAgIDogJ9GA0LDQvSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dCArIGFmZml4O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDQutCw0Y/Qu9C70LAnLFxuICAgICAgICAgICAgczogJ9C/05fRgC3QuNC6INKr0LXQutC60YPQvdGCJyxcbiAgICAgICAgICAgIHNzOiAnJWQg0qvQtdC60LrRg9C90YInLFxuICAgICAgICAgICAgbTogJ9C/05fRgCDQvNC40L3Rg9GCJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LzQuNC90YPRgicsXG4gICAgICAgICAgICBoOiAn0L/Tl9GAINGB0LXRhdC10YInLFxuICAgICAgICAgICAgaGg6ICclZCDRgdC10YXQtdGCJyxcbiAgICAgICAgICAgIGQ6ICfQv9OX0YAg0LrRg9C9JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0LrRg9C9JyxcbiAgICAgICAgICAgIE06ICfQv9OX0YAg0YPQudOR0YUnLFxuICAgICAgICAgICAgTU06ICclZCDRg9C505HRhScsXG4gICAgICAgICAgICB5OiAn0L/Tl9GAINKr0YPQuycsXG4gICAgICAgICAgICB5eTogJyVkINKr0YPQuycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS3QvNOX0YgvLFxuICAgICAgICBvcmRpbmFsOiAnJWQt0LzTl9GIJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGN2O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFdlbHNoIFtjeV1cbi8vISBhdXRob3IgOiBSb2JlcnQgQWxsZW4gOiBodHRwczovL2dpdGh1Yi5jb20vcm9iZ2FsbGVuXG4vLyEgYXV0aG9yIDogaHR0cHM6Ly9naXRodWIuY29tL3J5YW5ncmVhdmVzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgY3kgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdjeScsIHtcbiAgICAgICAgbW9udGhzOiAnSW9uYXdyX0Nod2Vmcm9yX01hd3J0aF9FYnJpbGxfTWFpX01laGVmaW5fR29yZmZlbm5hZl9Bd3N0X01lZGlfSHlkcmVmX1RhY2h3ZWRkX1JoYWdmeXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSW9uX0Nod2VfTWF3X0Vicl9NYWlfTWVoX0dvcl9Bd3NfTWVkX0h5ZF9UYWNoX1JoYWcnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ0R5ZGQgU3VsX0R5ZGQgTGx1bl9EeWRkIE1hd3J0aF9EeWRkIE1lcmNoZXJfRHlkZCBJYXVfRHlkZCBHd2VuZXJfRHlkZCBTYWR3cm4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bF9MbHVuX01hd19NZXJfSWF1X0d3ZV9TYWQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTGxfTWFfTWVfSWFfR3dfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgLy8gdGltZSBmb3JtYXRzIGFyZSB0aGUgc2FtZSBhcyBlbi1nYlxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0hlZGRpdyBhbV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tZZm9yeSBhbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthbV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tEZG9lIGFtXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2Rpd2V0aGFmIGFtXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ21ld24gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHluIMO0bCcsXG4gICAgICAgICAgICBzOiAneWNoeWRpZyBlaWxpYWRhdScsXG4gICAgICAgICAgICBzczogJyVkIGVpbGlhZCcsXG4gICAgICAgICAgICBtOiAnbXVudWQnLFxuICAgICAgICAgICAgbW06ICclZCBtdW51ZCcsXG4gICAgICAgICAgICBoOiAnYXdyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgYXdyJyxcbiAgICAgICAgICAgIGQ6ICdkaXdybm9kJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGl3cm5vZCcsXG4gICAgICAgICAgICBNOiAnbWlzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWlzJyxcbiAgICAgICAgICAgIHk6ICdibHd5ZGR5bicsXG4gICAgICAgICAgICB5eTogJyVkIGZseW5lZGQnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZmVkfGFpbnxhZnxpbHx5ZGR8ZWR8ZWcpLyxcbiAgICAgICAgLy8gdHJhZGl0aW9uYWwgb3JkaW5hbCBudW1iZXJzIGFib3ZlIDMxIGFyZSBub3QgY29tbW9ubHkgdXNlZCBpbiBjb2xsb3F1aWFsIFdlbHNoXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICcnLFxuICAgICAgICAgICAgICAgIGxvb2t1cCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICdhZicsXG4gICAgICAgICAgICAgICAgICAgICdpbCcsXG4gICAgICAgICAgICAgICAgICAgICd5ZGQnLFxuICAgICAgICAgICAgICAgICAgICAneWRkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJywgLy8gMWFmIHRvIDEwZmVkXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZWcnLFxuICAgICAgICAgICAgICAgICAgICAnZmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZlZCcsXG4gICAgICAgICAgICAgICAgICAgICdlZycsXG4gICAgICAgICAgICAgICAgICAgICdmZWQnLCAvLyAxMWVnIHRvIDIwZmVkXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChiID4gMjApIHtcbiAgICAgICAgICAgICAgICBpZiAoYiA9PT0gNDAgfHwgYiA9PT0gNTAgfHwgYiA9PT0gNjAgfHwgYiA9PT0gODAgfHwgYiA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICdmZWQnOyAvLyBub3QgMzBhaW4sIDcwYWluIG9yIDkwYWluXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ2Fpbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChiID4gMCkge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9IGxvb2t1cFtiXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjeTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBEYW5pc2ggW2RhXVxuLy8hIGF1dGhvciA6IFVscmlrIE5pZWxzZW4gOiBodHRwczovL2dpdGh1Yi5jb20vbXJiYXNlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZGEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkYScsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFydHNfYXByaWxfbWFqX2p1bmlfanVsaV9hdWd1c3Rfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnamFuX2ZlYl9tYXJfYXByX21hal9qdW5fanVsX2F1Z19zZXBfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnc8O4bmRhZ19tYW5kYWdfdGlyc2RhZ19vbnNkYWdfdG9yc2RhZ19mcmVkYWdfbMO4cmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3PDuG5fbWFuX3Rpcl9vbnNfdG9yX2ZyZV9sw7hyJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3PDuF9tYV90aV9vbl90b19mcl9sw7gnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBbZC5dIEQuIE1NTU0gWVlZWSBba2wuXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2kgZGFnIGtsLl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tpIG1vcmdlbiBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAncMOlIGRkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpIGfDpXIga2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tpXSBkZGRkW3Mga2wuXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ29tICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBzaWRlbicsXG4gICAgICAgICAgICBzOiAnZsOlIHNla3VuZGVyJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kZXInLFxuICAgICAgICAgICAgbTogJ2V0IG1pbnV0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXR0ZXInLFxuICAgICAgICAgICAgaDogJ2VuIHRpbWUnLFxuICAgICAgICAgICAgaGg6ICclZCB0aW1lcicsXG4gICAgICAgICAgICBkOiAnZW4gZGFnJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnZScsXG4gICAgICAgICAgICBNOiAnZW4gbcOlbmVkJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOlbmVkZXInLFxuICAgICAgICAgICAgeTogJ2V0IMOlcicsXG4gICAgICAgICAgICB5eTogJyVkIMOlcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGE7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR2VybWFuIChBdXN0cmlhKSBbZGUtYXRdXG4vLyEgYXV0aG9yIDogbGx1Y2hzIDogaHR0cHM6Ly9naXRodWIuY29tL2xsdWNoc1xuLy8hIGF1dGhvcjogTWVuZWxpb24gRWxlbnPDumxlOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuLy8hIGF1dGhvciA6IE1hcnRpbiBHcm9sbGVyIDogaHR0cHM6Ly9naXRodWIuY29tL01hZE1HXG4vLyEgYXV0aG9yIDogTWlrb2xhaiBEYWRlbGEgOiBodHRwczovL2dpdGh1Yi5jb20vbWlrMDFhalxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIG06IFsnZWluZSBNaW51dGUnLCAnZWluZXIgTWludXRlJ10sXG4gICAgICAgICAgICBoOiBbJ2VpbmUgU3R1bmRlJywgJ2VpbmVyIFN0dW5kZSddLFxuICAgICAgICAgICAgZDogWydlaW4gVGFnJywgJ2VpbmVtIFRhZyddLFxuICAgICAgICAgICAgZGQ6IFtudW1iZXIgKyAnIFRhZ2UnLCBudW1iZXIgKyAnIFRhZ2VuJ10sXG4gICAgICAgICAgICB3OiBbJ2VpbmUgV29jaGUnLCAnZWluZXIgV29jaGUnXSxcbiAgICAgICAgICAgIE06IFsnZWluIE1vbmF0JywgJ2VpbmVtIE1vbmF0J10sXG4gICAgICAgICAgICBNTTogW251bWJlciArICcgTW9uYXRlJywgbnVtYmVyICsgJyBNb25hdGVuJ10sXG4gICAgICAgICAgICB5OiBbJ2VpbiBKYWhyJywgJ2VpbmVtIEphaHInXSxcbiAgICAgICAgICAgIHl5OiBbbnVtYmVyICsgJyBKYWhyZScsIG51bWJlciArICcgSmFocmVuJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG5cbiAgICB2YXIgZGVBdCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2RlLWF0Jywge1xuICAgICAgICBtb250aHM6ICdKw6RubmVyX0ZlYnJ1YXJfTcOkcnpfQXByaWxfTWFpX0p1bmlfSnVsaV9BdWd1c3RfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGV6ZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0rDpG4uX0ZlYi5fTcOkcnpfQXByLl9NYWlfSnVuaV9KdWxpX0F1Zy5fU2VwLl9Pa3QuX05vdi5fRGV6Licuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnU29ubnRhZ19Nb250YWdfRGllbnN0YWdfTWl0dHdvY2hfRG9ubmVyc3RhZ19GcmVpdGFnX1NhbXN0YWcnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1NvLl9Nby5fRGkuX01pLl9Eby5fRnIuX1NhLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTb19Nb19EaV9NaV9Eb19Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2hldXRlIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb3JnZW4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZ2VzdGVybiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbbGV0enRlbl0gZGRkZCBbdW1dIExUIFtVaHJdJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAndm9yICVzJyxcbiAgICAgICAgICAgIHM6ICdlaW4gcGFhciBTZWt1bmRlbicsXG4gICAgICAgICAgICBzczogJyVkIFNla3VuZGVuJyxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogJyVkIE1pbnV0ZW4nLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiAnJWQgU3R1bmRlbicsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgd3c6ICclZCBXb2NoZW4nLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRlQXQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR2VybWFuIChTd2l0emVybGFuZCkgW2RlLWNoXVxuLy8hIGF1dGhvciA6IHNzY2h1ZWxsZXIgOiBodHRwczovL2dpdGh1Yi5jb20vc3NjaHVlbGxlclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIG06IFsnZWluZSBNaW51dGUnLCAnZWluZXIgTWludXRlJ10sXG4gICAgICAgICAgICBoOiBbJ2VpbmUgU3R1bmRlJywgJ2VpbmVyIFN0dW5kZSddLFxuICAgICAgICAgICAgZDogWydlaW4gVGFnJywgJ2VpbmVtIFRhZyddLFxuICAgICAgICAgICAgZGQ6IFtudW1iZXIgKyAnIFRhZ2UnLCBudW1iZXIgKyAnIFRhZ2VuJ10sXG4gICAgICAgICAgICB3OiBbJ2VpbmUgV29jaGUnLCAnZWluZXIgV29jaGUnXSxcbiAgICAgICAgICAgIE06IFsnZWluIE1vbmF0JywgJ2VpbmVtIE1vbmF0J10sXG4gICAgICAgICAgICBNTTogW251bWJlciArICcgTW9uYXRlJywgbnVtYmVyICsgJyBNb25hdGVuJ10sXG4gICAgICAgICAgICB5OiBbJ2VpbiBKYWhyJywgJ2VpbmVtIEphaHInXSxcbiAgICAgICAgICAgIHl5OiBbbnVtYmVyICsgJyBKYWhyZScsIG51bWJlciArICcgSmFocmVuJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG5cbiAgICB2YXIgZGVDaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2RlLWNoJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJfRmVicnVhcl9Nw6Ryel9BcHJpbF9NYWlfSnVuaV9KdWxpX0F1Z3VzdF9TZXB0ZW1iZXJfT2t0b2Jlcl9Ob3ZlbWJlcl9EZXplbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnSmFuLl9GZWIuX03DpHJ6X0Fwci5fTWFpX0p1bmlfSnVsaV9BdWcuX1NlcC5fT2t0Ll9Ob3YuX0Rlei4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1Nvbm50YWdfTW9udGFnX0RpZW5zdGFnX01pdHR3b2NoX0Rvbm5lcnN0YWdfRnJlaXRhZ19TYW1zdGFnJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTb19Nb19EaV9NaV9Eb19Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTb19Nb19EaV9NaV9Eb19Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2hldXRlIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICAgICAgbmV4dERheTogJ1ttb3JnZW4gdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbZ2VzdGVybiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbbGV0enRlbl0gZGRkZCBbdW1dIExUIFtVaHJdJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAndm9yICVzJyxcbiAgICAgICAgICAgIHM6ICdlaW4gcGFhciBTZWt1bmRlbicsXG4gICAgICAgICAgICBzczogJyVkIFNla3VuZGVuJyxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogJyVkIE1pbnV0ZW4nLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiAnJWQgU3R1bmRlbicsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgd3c6ICclZCBXb2NoZW4nLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHl5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRlQ2g7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogR2VybWFuIFtkZV1cbi8vISBhdXRob3IgOiBsbHVjaHMgOiBodHRwczovL2dpdGh1Yi5jb20vbGx1Y2hzXG4vLyEgYXV0aG9yOiBNZW5lbGlvbiBFbGVuc8O6bGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9PaXJlXG4vLyEgYXV0aG9yIDogTWlrb2xhaiBEYWRlbGEgOiBodHRwczovL2dpdGh1Yi5jb20vbWlrMDFhalxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIG06IFsnZWluZSBNaW51dGUnLCAnZWluZXIgTWludXRlJ10sXG4gICAgICAgICAgICBoOiBbJ2VpbmUgU3R1bmRlJywgJ2VpbmVyIFN0dW5kZSddLFxuICAgICAgICAgICAgZDogWydlaW4gVGFnJywgJ2VpbmVtIFRhZyddLFxuICAgICAgICAgICAgZGQ6IFtudW1iZXIgKyAnIFRhZ2UnLCBudW1iZXIgKyAnIFRhZ2VuJ10sXG4gICAgICAgICAgICB3OiBbJ2VpbmUgV29jaGUnLCAnZWluZXIgV29jaGUnXSxcbiAgICAgICAgICAgIE06IFsnZWluIE1vbmF0JywgJ2VpbmVtIE1vbmF0J10sXG4gICAgICAgICAgICBNTTogW251bWJlciArICcgTW9uYXRlJywgbnVtYmVyICsgJyBNb25hdGVuJ10sXG4gICAgICAgICAgICB5OiBbJ2VpbiBKYWhyJywgJ2VpbmVtIEphaHInXSxcbiAgICAgICAgICAgIHl5OiBbbnVtYmVyICsgJyBKYWhyZScsIG51bWJlciArICcgSmFocmVuJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG5cbiAgICB2YXIgZGUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdkZScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyX0ZlYnJ1YXJfTcOkcnpfQXByaWxfTWFpX0p1bmlfSnVsaV9BdWd1c3RfU2VwdGVtYmVyX09rdG9iZXJfTm92ZW1iZXJfRGV6ZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0phbi5fRmViLl9Nw6Ryel9BcHIuX01haV9KdW5pX0p1bGlfQXVnLl9TZXAuX09rdC5fTm92Ll9EZXouJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdTb25udGFnX01vbnRhZ19EaWVuc3RhZ19NaXR0d29jaF9Eb25uZXJzdGFnX0ZyZWl0YWdfU2Ftc3RhZycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU28uX01vLl9EaS5fTWkuX0RvLl9Gci5fU2EuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NvX01vX0RpX01pX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbaGV1dGUgdW1dIExUIFtVaHJdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vcmdlbiB1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1tnZXN0ZXJuIHVtXSBMVCBbVWhyXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tsZXR6dGVuXSBkZGRkIFt1bV0gTFQgW1Vocl0nLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICd2b3IgJXMnLFxuICAgICAgICAgICAgczogJ2VpbiBwYWFyIFNla3VuZGVuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgU2VrdW5kZW4nLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiAnJWQgTWludXRlbicsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6ICclZCBTdHVuZGVuJyxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHc6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3dzogJyVkIFdvY2hlbicsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFsZGl2aWFuIFtkdl1cbi8vISBhdXRob3IgOiBKYXdpc2ggSGFtZWVkIDogaHR0cHM6Ly9naXRodWIuY29tL2phd2lzaFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9IFtcbiAgICAgICAgICAgICfelt6s3oLeqt6H3qbeg96pJyxcbiAgICAgICAgICAgICfeit6s3oTesN6D3qreh96m3oPeqScsXG4gICAgICAgICAgICAn3onep96D3qjel96qJyxcbiAgICAgICAgICAgICfeh96t3pXesN6D3qnejd6qJyxcbiAgICAgICAgICAgICfeid6tJyxcbiAgICAgICAgICAgICfelt6r3oLesCcsXG4gICAgICAgICAgICAn3pbeqt6N3qbeh96oJyxcbiAgICAgICAgICAgICfeh96v3o7ept6Q3rDek96qJyxcbiAgICAgICAgICAgICfekN6s3pXesN6T3qzeid6w3oTept6D3qonLFxuICAgICAgICAgICAgJ96H3q7eht6w3pPer96E3qbeg96qJyxcbiAgICAgICAgICAgICfegt6u3ojerN6J3rDehN6m3oPeqicsXG4gICAgICAgICAgICAn3pHeqN6Q3qzeid6w3oTept6D3qonLFxuICAgICAgICBdLFxuICAgICAgICB3ZWVrZGF5cyA9IFtcbiAgICAgICAgICAgICfeh96n3oveqN6H3rDejN6mJyxcbiAgICAgICAgICAgICfegN6v3onepicsXG4gICAgICAgICAgICAn3ofept6C3rDejt6n3oPepicsXG4gICAgICAgICAgICAn3oTeqt6L3qYnLFxuICAgICAgICAgICAgJ96E3qreg96n3pDesN6K3qbejN6oJyxcbiAgICAgICAgICAgICfegN6q3obeqt6D3qonLFxuICAgICAgICAgICAgJ96A3q7egt6o3oDeqN6D3qonLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGR2ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZHYnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzLFxuICAgICAgICB3ZWVrZGF5czogd2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IHdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ96H3qfei96oX96A3q/eid6mX96H3qbegt6wX96E3qrei96mX96E3qreg96nX96A3qreht6qX96A3q7egt6oJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC9NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/eid6GfN6J3oovLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn3oneiicgPT09IGlucHV0O1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn3onehic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn3oneiic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW96J3qjeh96m3oveql0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1veid6n3ovept6J3qddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW96H3qjeh96w3pTerF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb3orep96H3qjejN6q3ojeqF0gZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ96M3qzeg96t3o7ept6H3qggJXMnLFxuICAgICAgICAgICAgcGFzdDogJ96G3qreg96o3oLesCAlcycsXG4gICAgICAgICAgICBzOiAn3pDeqN6G3qregt6w3ozeqt6G3q7ehd6s3ofesCcsXG4gICAgICAgICAgICBzczogJ2QlIN6Q3qjeht6q3oLesN6M3qonLFxuICAgICAgICAgICAgbTogJ96J3qjegt6o3pPerN6H3rAnLFxuICAgICAgICAgICAgbW06ICfeid6o3oLeqN6T3qogJWQnLFxuICAgICAgICAgICAgaDogJ96O3qbekd6o3ofeqN6D3qzeh96wJyxcbiAgICAgICAgICAgIGhoOiAn3o7ept6R3qjeh96o3oPeqiAlZCcsXG4gICAgICAgICAgICBkOiAn3oveqt6I3qbegN6s3ofesCcsXG4gICAgICAgICAgICBkZDogJ96L3qreiN6m3pDesCAlZCcsXG4gICAgICAgICAgICBNOiAn3onept6A3qzeh96wJyxcbiAgICAgICAgICAgIE1NOiAn3onept6Q3rAgJWQnLFxuICAgICAgICAgICAgeTogJ96H3qbegN6m3oPerN6H3rAnLFxuICAgICAgICAgICAgeXk6ICfeh96m3oDept6D3qogJWQnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC/YjC9nLCAnLCcpO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNywgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDEyLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxMnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGR2O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdyZWVrIFtlbF1cbi8vISBhdXRob3IgOiBBZ2dlbG9zIEthcmFsaWFzIDogaHR0cHM6Ly9naXRodWIuY29tL21laGllbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHR5cGVvZiBGdW5jdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbikgfHxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgZWwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbCcsIHtcbiAgICAgICAgbW9udGhzTm9taW5hdGl2ZUVsOlxuICAgICAgICAgICAgJ86ZzrHOvc6/z4XOrM+BzrnOv8+CX86mzrXOss+Bzr/Phc6sz4HOuc6/z4JfzpzOrM+Bz4TOuc6/z4JfzpHPgM+Bzq/Ou865zr/Pgl/OnM6szrnOv8+CX86Zzr/Pjc69zrnOv8+CX86Zzr/Pjc67zrnOv8+CX86Rz43Os86/z4XPg8+Ezr/Pgl/Oo861z4DPhM6tzrzOss+BzrnOv8+CX86fzrrPhM+OzrLPgc65zr/Pgl/Onc6/zq3OvM6yz4HOuc6/z4JfzpTOtc66zq3OvM6yz4HOuc6/z4InLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzR2VuaXRpdmVFbDpcbiAgICAgICAgICAgICfOmc6xzr3Ov8+FzrHPgc6vzr/PhV/Ops61zrLPgc6/z4XOsc+Bzq/Ov8+FX86czrHPgc+Ezq/Ov8+FX86Rz4DPgc65zrvOr86/z4VfzpzOsc6Qzr/PhV/Omc6/z4XOvc6vzr/PhV/Omc6/z4XOu86vzr/PhV/Okc+FzrPOv8+Nz4PPhM6/z4VfzqPOtc+Az4TOtc68zrLPgc6vzr/PhV/On866z4TPic6yz4HOr86/z4Vfzp3Ov861zrzOss+Bzq/Ov8+FX86UzrXOus61zrzOss+Bzq/Ov8+FJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoczogZnVuY3Rpb24gKG1vbWVudFRvRm9ybWF0LCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbW9tZW50VG9Gb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzTm9taW5hdGl2ZUVsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgZm9ybWF0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIC9ELy50ZXN0KGZvcm1hdC5zdWJzdHJpbmcoMCwgZm9ybWF0LmluZGV4T2YoJ01NTU0nKSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIGRheSBudW1iZXIgYmVmb3JlICdNTU1NJ1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNHZW5pdGl2ZUVsW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzTm9taW5hdGl2ZUVsW21vbWVudFRvRm9ybWF0Lm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDogJ86ZzrHOvV/Ops61zrJfzpzOsc+BX86Rz4DPgV/OnM6xz4pfzpnOv8+Fzr1fzpnOv8+FzrtfzpHPhc6zX86jzrXPgF/On866z4Rfzp3Ov861X86UzrXOuicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfOms+Fz4HOuc6xzrrOrl/OlM61z4XPhM6tz4HOsV/OpM+Bzq/PhM63X86kzrXPhM6sz4HPhM63X86gzq3OvM+Az4TOt1/OoM6xz4HOsc+DzrrOtc+Fzq5fzqPOrM6yzrLOsc+Ezr8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfOms+Fz4FfzpTOtc+FX86kz4HOuV/OpM61z4RfzqDOtc68X86gzrHPgV/Oo86xzrInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnzprPhV/OlM61X86kz4FfzqTOtV/OoM61X86gzrFfzqPOsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfOvM68JyA6ICfOnM6cJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnz4DOvCcgOiAnzqDOnCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIChpbnB1dCArICcnKS50b0xvd2VyQ2FzZSgpWzBdID09PSAnzrwnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvW86gzpxdXFwuP86cP1xcLj8vaSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXJFbDoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vOo86uzrzOtc+BzrEge31dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbzpHPjc+BzrnOvyB7fV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt7fV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vOp864zrXPgiB7fV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbz4TOvyDPgM+Bzr/Ot86zzr/Pjc68zrXOvc6/XSBkZGRkIFt7fV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbz4TOt869IM+Az4HOv863zrPOv8+NzrzOtc69zrddIGRkZGQgW3t9XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiBmdW5jdGlvbiAoa2V5LCBtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9jYWxlbmRhckVsW2tleV0sXG4gICAgICAgICAgICAgICAgaG91cnMgPSBtb20gJiYgbW9tLmhvdXJzKCk7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihvdXRwdXQpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LmFwcGx5KG1vbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0LnJlcGxhY2UoJ3t9JywgaG91cnMgJSAxMiA9PT0gMSA/ICfPg8+EzrcnIDogJ8+Dz4TOuc+CJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnz4POtSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgz4DPgc65zr0nLFxuICAgICAgICAgICAgczogJ867zq/Os86xIM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsScsXG4gICAgICAgICAgICBzczogJyVkIM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsScsXG4gICAgICAgICAgICBtOiAnzq3Ovc6xIM67zrXPgM+Ez4wnLFxuICAgICAgICAgICAgbW06ICclZCDOu861z4DPhM6sJyxcbiAgICAgICAgICAgIGg6ICfOvM6vzrEgz47Pgc6xJyxcbiAgICAgICAgICAgIGhoOiAnJWQgz47Pgc61z4InLFxuICAgICAgICAgICAgZDogJ868zq/OsSDOvM6tz4HOsScsXG4gICAgICAgICAgICBkZDogJyVkIM68zq3Pgc61z4InLFxuICAgICAgICAgICAgTTogJ86tzr3Osc+CIM68zq7Ovc6xz4InLFxuICAgICAgICAgICAgTU06ICclZCDOvM6uzr3Otc+CJyxcbiAgICAgICAgICAgIHk6ICfOrc69zrHPgiDPh8+Bz4zOvc6/z4InLFxuICAgICAgICAgICAgeXk6ICclZCDPh8+Bz4zOvc65zrEnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Oty8sXG4gICAgICAgIG9yZGluYWw6ICclZM63JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKEF1c3RyYWxpYSkgW2VuLWF1XVxuLy8hIGF1dGhvciA6IEphcmVkIE1vcnNlIDogaHR0cHM6Ly9naXRodWIuY29tL2phcmNvYWxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbkF1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4tYXUnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuQXU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoQ2FuYWRhKSBbZW4tY2FdXG4vLyEgYXV0aG9yIDogSm9uYXRoYW4gQWJvdXJiaWggOiBodHRwczovL2dpdGh1Yi5jb20vam9uYmNhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5DYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWNhJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnTU1NTSBELCBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5DYTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChVbml0ZWQgS2luZ2RvbSkgW2VuLWdiXVxuLy8hIGF1dGhvciA6IENocmlzIEdlZHJpbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc2dlZHJpbVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuR2IgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1nYicsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbkdiO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKElyZWxhbmQpIFtlbi1pZV1cbi8vISBhdXRob3IgOiBDaHJpcyBDYXJ0bGlkZ2UgOiBodHRwczovL2dpdGh1Yi5jb20vY2hyaXNjYXJ0bGlkZ2VcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbkllID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4taWUnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbkllO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKElzcmFlbCkgW2VuLWlsXVxuLy8hIGF1dGhvciA6IENocmlzIEdlZHJpbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc2dlZHJpbVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVuSWwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlbi1pbCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5JbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFbmdsaXNoIChJbmRpYSkgW2VuLWluXVxuLy8hIGF1dGhvciA6IEphdGluIEFncmF3YWwgOiBodHRwczovL2dpdGh1Yi5jb20vamF0aW5hZzIyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZW5JbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2VuLWluJywge1xuICAgICAgICBtb250aHM6ICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tUb21vcnJvdyBhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2luICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICAgICAgczogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ2FuIGhvdXInLFxuICAgICAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgICAgICBkOiAnYSBkYXknLFxuICAgICAgICAgICAgZGQ6ICclZCBkYXlzJyxcbiAgICAgICAgICAgIE06ICdhIG1vbnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9udGhzJyxcbiAgICAgICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICAgICAgeXk6ICclZCB5ZWFycycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdHxuZHxyZHx0aCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIH5+KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbkluO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVuZ2xpc2ggKE5ldyBaZWFsYW5kKSBbZW4tbnpdXG4vLyEgYXV0aG9yIDogTHVrZSBNY0dyZWdvciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlbWNncmVnb3JcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlbk56ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4tbnonLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ2g6bW0gQScsXG4gICAgICAgICAgICBMVFM6ICdoOm1tOnNzIEEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGFnbycsXG4gICAgICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZHMnLFxuICAgICAgICAgICAgbTogJ2EgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAnYW4gaG91cicsXG4gICAgICAgICAgICBoaDogJyVkIGhvdXJzJyxcbiAgICAgICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgICAgICBkZDogJyVkIGRheXMnLFxuICAgICAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICAgICAgTU06ICclZCBtb250aHMnLFxuICAgICAgICAgICAgeTogJ2EgeWVhcicsXG4gICAgICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVuTno7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRW5nbGlzaCAoU2luZ2Fwb3JlKSBbZW4tc2ddXG4vLyEgYXV0aG9yIDogTWF0dGhldyBDYXN0cmlsbG9uLU1hZHJpZ2FsIDogaHR0cHM6Ly9naXRodWIuY29tL3RlY2hkaW1lbnNpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBlblNnID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW4tc2cnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYWdvJyxcbiAgICAgICAgICAgIHM6ICdhIGZldyBzZWNvbmRzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgICAgICBtOiAnYSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG91cnMnLFxuICAgICAgICAgICAgZDogJ2EgZGF5JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgICAgICBNOiAnYSBtb250aCcsXG4gICAgICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgICAgICB5OiAnYSB5ZWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgeWVhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3R8bmR8cmR8dGgpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5TZztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBFc3BlcmFudG8gW2VvXVxuLy8hIGF1dGhvciA6IENvbGluIERlYW4gOiBodHRwczovL2dpdGh1Yi5jb20vY29saW5kZWFuXG4vLyEgYXV0aG9yIDogTWlhIE5vcmRlbnRvZnQgSW1wZXJhdG9yaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWVzdGFzbWlhXG4vLyEgY29tbWVudCA6IG1pZXN0YXNtaWEgY29ycmVjdGVkIHRoZSB0cmFuc2xhdGlvbiBieSBjb2xpbmRlYW5cbi8vISBjb21tZW50IDogVml2YWt2byBjb3JyZWN0ZWQgdGhlIHRyYW5zbGF0aW9uIGJ5IGNvbGluZGVhbiBhbmQgbWllc3Rhc21pYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGVvID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZW8nLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcm9fZmVicnVhcm9fbWFydG9fYXByaWxvX21ham9fanVuaW9fanVsaW9fYcWtZ3VzdG9fc2VwdGVtYnJvX29rdG9icm9fbm92ZW1icm9fZGVjZW1icm8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnamFuX2ZlYl9tYXJ0X2Fwcl9tYWpfanVuX2p1bF9hxa1nX3NlcHRfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnZGltYW7EiW9fbHVuZG9fbWFyZG9fbWVya3JlZG9fxLVhxa1kb192ZW5kcmVkb19zYWJhdG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkaW1fbHVuX21hcmRfbWVya1/EtWHFrV92ZW5fc2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RpX2x1X21hX21lX8S1YV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdbbGFdIERbLWFuIGRlXSBNTU1NLCBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ1tsYV0gRFstYW4gZGVdIE1NTU0sIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGRbbl0sIFtsYV0gRFstYW4gZGVdIE1NTU0sIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCwgW2xhXSBEWy1hbiBkZV0gTU1NLCBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL1thcF1cXC50XFwubS9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSA9PT0gJ3AnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3AudC5tLicgOiAnUC5ULk0uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYS50Lm0uJyA6ICdBLlQuTS4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tIb2RpYcWtIGplXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW01vcmdhxa0gamVdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZFtuIGplXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0hpZXJhxa0gamVdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW3Bhc2ludGFuXSBkZGRkW24gamVdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAncG9zdCAlcycsXG4gICAgICAgICAgICBwYXN0OiAnYW50YcWtICVzJyxcbiAgICAgICAgICAgIHM6ICdrZWxrYWogc2VrdW5kb2onLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmRvaicsXG4gICAgICAgICAgICBtOiAndW51IG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b2onLFxuICAgICAgICAgICAgaDogJ3VudSBob3JvJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yb2onLFxuICAgICAgICAgICAgZDogJ3VudSB0YWdvJywgLy9uZSAnZGl1cm5vJywgxIlhciBlc3RhcyB1eml0YSBwb3IgcHJva3NpbXVtb1xuICAgICAgICAgICAgZGQ6ICclZCB0YWdvaicsXG4gICAgICAgICAgICBNOiAndW51IG1vbmF0bycsXG4gICAgICAgICAgICBNTTogJyVkIG1vbmF0b2onLFxuICAgICAgICAgICAgeTogJ3VudSBqYXJvJyxcbiAgICAgICAgICAgIHl5OiAnJWQgamFyb2onLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1hLyxcbiAgICAgICAgb3JkaW5hbDogJyVkYScsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBlbztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTcGFuaXNoIChEb21pbmljYW4gUmVwdWJsaWMpIFtlcy1kb11cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTaG9ydERvdCA9XG4gICAgICAgICAgICAnZW5lLl9mZWIuX21hci5fYWJyLl9tYXkuX2p1bi5fanVsLl9hZ28uX3NlcC5fb2N0Ll9ub3YuX2RpYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnZW5lX2ZlYl9tYXJfYWJyX21heV9qdW5fanVsX2Fnb19zZXBfb2N0X25vdl9kaWMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15lbmUvaSxcbiAgICAgICAgICAgIC9eZmViL2ksXG4gICAgICAgICAgICAvXm1hci9pLFxuICAgICAgICAgICAgL15hYnIvaSxcbiAgICAgICAgICAgIC9ebWF5L2ksXG4gICAgICAgICAgICAvXmp1bi9pLFxuICAgICAgICAgICAgL15qdWwvaSxcbiAgICAgICAgICAgIC9eYWdvL2ksXG4gICAgICAgICAgICAvXnNlcC9pLFxuICAgICAgICAgICAgL15vY3QvaSxcbiAgICAgICAgICAgIC9ebm92L2ksXG4gICAgICAgICAgICAvXmRpYy9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlfGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pO1xuXG4gICAgdmFyIGVzRG8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlcy1kbycsIHtcbiAgICAgICAgbW9udGhzOiAnZW5lcm9fZmVicmVyb19tYXJ6b19hYnJpbF9tYXlvX2p1bmlvX2p1bGlvX2Fnb3N0b19zZXB0aWVtYnJlX29jdHVicmVfbm92aWVtYnJlX2RpY2llbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGZ1bmN0aW9uIChtLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90W20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWluZ29fbHVuZXNfbWFydGVzX21pw6lyY29sZXNfanVldmVzX3ZpZXJuZXNfc8OhYmFkbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbS5fbHVuLl9tYXIuX21pw6kuX2p1ZS5fdmllLl9zw6FiLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb19sdV9tYV9taV9qdV92aV9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tob3kgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1ttYcOxYW5hIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1theWVyIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbZWxdIGRkZGQgW3Bhc2FkbyBhIGxhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnXSBMVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2hhY2UgJXMnLFxuICAgICAgICAgICAgczogJ3Vub3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW5hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW4gZMOtYScsXG4gICAgICAgICAgICBkZDogJyVkIGTDrWFzJyxcbiAgICAgICAgICAgIHc6ICd1bmEgc2VtYW5hJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2VtYW5hcycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VuIGHDsW8nLFxuICAgICAgICAgICAgeXk6ICclZCBhw7FvcycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXNEbztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTcGFuaXNoIChNZXhpY28pIFtlcy1teF1cbi8vISBhdXRob3IgOiBKQyBGcmFuY28gOiBodHRwczovL2dpdGh1Yi5jb20vamNmcmFuY29cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTaG9ydERvdCA9XG4gICAgICAgICAgICAnZW5lLl9mZWIuX21hci5fYWJyLl9tYXkuX2p1bi5fanVsLl9hZ28uX3NlcC5fb2N0Ll9ub3YuX2RpYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnZW5lX2ZlYl9tYXJfYWJyX21heV9qdW5fanVsX2Fnb19zZXBfb2N0X25vdl9kaWMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15lbmUvaSxcbiAgICAgICAgICAgIC9eZmViL2ksXG4gICAgICAgICAgICAvXm1hci9pLFxuICAgICAgICAgICAgL15hYnIvaSxcbiAgICAgICAgICAgIC9ebWF5L2ksXG4gICAgICAgICAgICAvXmp1bi9pLFxuICAgICAgICAgICAgL15qdWwvaSxcbiAgICAgICAgICAgIC9eYWdvL2ksXG4gICAgICAgICAgICAvXnNlcC9pLFxuICAgICAgICAgICAgL15vY3QvaSxcbiAgICAgICAgICAgIC9ebm92L2ksXG4gICAgICAgICAgICAvXmRpYy9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlfGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pO1xuXG4gICAgdmFyIGVzTXggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlcy1teCcsIHtcbiAgICAgICAgbW9udGhzOiAnZW5lcm9fZmVicmVyb19tYXJ6b19hYnJpbF9tYXlvX2p1bmlvX2p1bGlvX2Fnb3N0b19zZXB0aWVtYnJlX29jdHVicmVfbm92aWVtYnJlX2RpY2llbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGZ1bmN0aW9uIChtLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90W20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWluZ29fbHVuZXNfbWFydGVzX21pw6lyY29sZXNfanVldmVzX3ZpZXJuZXNfc8OhYmFkbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbS5fbHVuLl9tYXIuX21pw6kuX2p1ZS5fdmllLl9zw6FiLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb19sdV9tYV9taV9qdV92aV9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbaG95IGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbbWHDsWFuYSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgW2EgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbYXllciBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW2VsXSBkZGRkIFtwYXNhZG8gYSBsYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ10gTFQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2VuICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdoYWNlICVzJyxcbiAgICAgICAgICAgIHM6ICd1bm9zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VuYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGTDrWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkw61hcycsXG4gICAgICAgICAgICB3OiAndW5hIHNlbWFuYScsXG4gICAgICAgICAgICB3dzogJyVkIHNlbWFuYXMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1biBhw7FvJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYcOxb3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgICAgICBpbnZhbGlkRGF0ZTogJ0ZlY2hhIGludsOhbGlkYScsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXNNeDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTcGFuaXNoIChVbml0ZWQgU3RhdGVzKSBbZXMtdXNdXG4vLyEgYXV0aG9yIDogYnVzdHRhIDogaHR0cHM6Ly9naXRodWIuY29tL2J1c3R0YVxuLy8hIGF1dGhvciA6IGNocmlzcm9keiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3JvZHpcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTaG9ydERvdCA9XG4gICAgICAgICAgICAnZW5lLl9mZWIuX21hci5fYWJyLl9tYXkuX2p1bi5fanVsLl9hZ28uX3NlcC5fb2N0Ll9ub3YuX2RpYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnZW5lX2ZlYl9tYXJfYWJyX21heV9qdW5fanVsX2Fnb19zZXBfb2N0X25vdl9kaWMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15lbmUvaSxcbiAgICAgICAgICAgIC9eZmViL2ksXG4gICAgICAgICAgICAvXm1hci9pLFxuICAgICAgICAgICAgL15hYnIvaSxcbiAgICAgICAgICAgIC9ebWF5L2ksXG4gICAgICAgICAgICAvXmp1bi9pLFxuICAgICAgICAgICAgL15qdWwvaSxcbiAgICAgICAgICAgIC9eYWdvL2ksXG4gICAgICAgICAgICAvXnNlcC9pLFxuICAgICAgICAgICAgL15vY3QvaSxcbiAgICAgICAgICAgIC9ebm92L2ksXG4gICAgICAgICAgICAvXmRpYy9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlfGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pO1xuXG4gICAgdmFyIGVzVXMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdlcy11cycsIHtcbiAgICAgICAgbW9udGhzOiAnZW5lcm9fZmVicmVyb19tYXJ6b19hYnJpbF9tYXlvX2p1bmlvX2p1bGlvX2Fnb3N0b19zZXB0aWVtYnJlX29jdHVicmVfbm92aWVtYnJlX2RpY2llbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGZ1bmN0aW9uIChtLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoLy1NTU0tLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnRbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0RG90W20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1JlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oZW5lcm98ZmVicmVyb3xtYXJ6b3xhYnJpbHxtYXlvfGp1bmlvfGp1bGlvfGFnb3N0b3xzZXB0aWVtYnJlfG9jdHVicmV8bm92aWVtYnJlfGRpY2llbWJyZSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWluZ29fbHVuZXNfbWFydGVzX21pw6lyY29sZXNfanVldmVzX3ZpZXJuZXNfc8OhYmFkbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbS5fbHVuLl9tYXIuX21pw6kuX2p1ZS5fdmllLl9zw6FiLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb19sdV9tYV9taV9qdV92aV9zw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnTU0vREQvWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIFtkZV0gTU1NTSBbZGVdIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tob3kgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1ttYcOxYW5hIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBbYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1theWVyIGEgbGEnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICdbZWxdIGRkZGQgW3Bhc2FkbyBhIGxhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnXSBMVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2hhY2UgJXMnLFxuICAgICAgICAgICAgczogJ3Vub3Mgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW5hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW4gZMOtYScsXG4gICAgICAgICAgICBkZDogJyVkIGTDrWFzJyxcbiAgICAgICAgICAgIHc6ICd1bmEgc2VtYW5hJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2VtYW5hcycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VuIGHDsW8nLFxuICAgICAgICAgICAgeXk6ICclZCBhw7FvcycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXNVcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTcGFuaXNoIFtlc11cbi8vISBhdXRob3IgOiBKdWxpbyBOYXB1csOtIDogaHR0cHM6Ly9naXRodWIuY29tL2p1bGlvbmNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHNTaG9ydERvdCA9XG4gICAgICAgICAgICAnZW5lLl9mZWIuX21hci5fYWJyLl9tYXkuX2p1bi5fanVsLl9hZ28uX3NlcC5fb2N0Ll9ub3YuX2RpYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQgPSAnZW5lX2ZlYl9tYXJfYWJyX21heV9qdW5fanVsX2Fnb19zZXBfb2N0X25vdl9kaWMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15lbmUvaSxcbiAgICAgICAgICAgIC9eZmViL2ksXG4gICAgICAgICAgICAvXm1hci9pLFxuICAgICAgICAgICAgL15hYnIvaSxcbiAgICAgICAgICAgIC9ebWF5L2ksXG4gICAgICAgICAgICAvXmp1bi9pLFxuICAgICAgICAgICAgL15qdWwvaSxcbiAgICAgICAgICAgIC9eYWdvL2ksXG4gICAgICAgICAgICAvXnNlcC9pLFxuICAgICAgICAgICAgL15vY3QvaSxcbiAgICAgICAgICAgIC9ebm92L2ksXG4gICAgICAgICAgICAvXmRpYy9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihlbmVyb3xmZWJyZXJvfG1hcnpvfGFicmlsfG1heW98anVuaW98anVsaW98YWdvc3RvfHNlcHRpZW1icmV8b2N0dWJyZXxub3ZpZW1icmV8ZGljaWVtYnJlfGVuZVxcLj98ZmViXFwuP3xtYXJcXC4/fGFiclxcLj98bWF5XFwuP3xqdW5cXC4/fGp1bFxcLj98YWdvXFwuP3xzZXBcXC4/fG9jdFxcLj98bm92XFwuP3xkaWNcXC4/KS9pO1xuXG4gICAgdmFyIGVzID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXMnLCB7XG4gICAgICAgIG1vbnRoczogJ2VuZXJvX2ZlYnJlcm9fbWFyem9fYWJyaWxfbWF5b19qdW5pb19qdWxpb19hZ29zdG9fc2VwdGllbWJyZV9vY3R1YnJlX25vdmllbWJyZV9kaWNpZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiBmdW5jdGlvbiAobSwgZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU2hvcnREb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0W20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydERvdFttLm1vbnRoKCldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGVuZXJvfGZlYnJlcm98bWFyem98YWJyaWx8bWF5b3xqdW5pb3xqdWxpb3xhZ29zdG98c2VwdGllbWJyZXxvY3R1YnJlfG5vdmllbWJyZXxkaWNpZW1icmUpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihlbmVcXC4/fGZlYlxcLj98bWFyXFwuP3xhYnJcXC4/fG1heVxcLj98anVuXFwuP3xqdWxcXC4/fGFnb1xcLj98c2VwXFwuP3xvY3RcXC4/fG5vdlxcLj98ZGljXFwuPykvaSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21pbmdvX2x1bmVzX21hcnRlc19tacOpcmNvbGVzX2p1ZXZlc192aWVybmVzX3PDoWJhZG8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb20uX2x1bi5fbWFyLl9tacOpLl9qdWUuX3ZpZS5fc8OhYi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWlfanVfdmlfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2hveSBhIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW21hw7FhbmEgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFthIGxhJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAncycgOiAnJykgKyAnXSBMVCc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2F5ZXIgYSBsYScgKyAodGhpcy5ob3VycygpICE9PSAxID8gJ3MnIDogJycpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tlbF0gZGRkZCBbcGFzYWRvIGEgbGEnICtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICdzJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICddIExUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlbiAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaGFjZSAlcycsXG4gICAgICAgICAgICBzOiAndW5vcyBzZWd1bmRvcycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dG9zJyxcbiAgICAgICAgICAgIGg6ICd1bmEgaG9yYScsXG4gICAgICAgICAgICBoaDogJyVkIGhvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1biBkw61hJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZMOtYXMnLFxuICAgICAgICAgICAgdzogJ3VuYSBzZW1hbmEnLFxuICAgICAgICAgICAgd3c6ICclZCBzZW1hbmFzJyxcbiAgICAgICAgICAgIE06ICd1biBtZXMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW4gYcOxbycsXG4gICAgICAgICAgICB5eTogJyVkIGHDsW9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICAgICAgaW52YWxpZERhdGU6ICdGZWNoYSBpbnbDoWxpZGEnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEVzdG9uaWFuIFtldF1cbi8vISBhdXRob3IgOiBIZW5yeSBLZWhsbWFubiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYWRoZW5yeVxuLy8hIGltcHJvdmVtZW50cyA6IElsbGltYXIgVGFtYmVrIDogaHR0cHM6Ly9naXRodWIuY29tL3JhZ3Vsa2FcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzOiBbJ23DtW5lIHNla3VuZGknLCAnbcO1bmkgc2VrdW5kJywgJ3BhYXIgc2VrdW5kaXQnXSxcbiAgICAgICAgICAgIHNzOiBbbnVtYmVyICsgJ3Nla3VuZGknLCBudW1iZXIgKyAnc2VrdW5kaXQnXSxcbiAgICAgICAgICAgIG06IFsnw7xoZSBtaW51dGknLCAnw7xrcyBtaW51dCddLFxuICAgICAgICAgICAgbW06IFtudW1iZXIgKyAnIG1pbnV0aScsIG51bWJlciArICcgbWludXRpdCddLFxuICAgICAgICAgICAgaDogWyfDvGhlIHR1bm5pJywgJ3R1bmQgYWVnYScsICfDvGtzIHR1bmQnXSxcbiAgICAgICAgICAgIGhoOiBbbnVtYmVyICsgJyB0dW5uaScsIG51bWJlciArICcgdHVuZGknXSxcbiAgICAgICAgICAgIGQ6IFsnw7xoZSBww6RldmEnLCAnw7xrcyBww6RldiddLFxuICAgICAgICAgICAgTTogWydrdXUgYWphJywgJ2t1dSBhZWdhJywgJ8O8a3Mga3V1J10sXG4gICAgICAgICAgICBNTTogW251bWJlciArICcga3V1JywgbnVtYmVyICsgJyBrdXVkJ10sXG4gICAgICAgICAgICB5OiBbJ8O8aGUgYWFzdGEnLCAnYWFzdGEnLCAnw7xrcyBhYXN0YSddLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIGFhc3RhJywgbnVtYmVyICsgJyBhYXN0YXQnXSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRba2V5XVsyXSA/IGZvcm1hdFtrZXldWzJdIDogZm9ybWF0W2tleV1bMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG5cbiAgICB2YXIgZXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdldCcsIHtcbiAgICAgICAgbW9udGhzOiAnamFhbnVhcl92ZWVicnVhcl9tw6RydHNfYXByaWxsX21haV9qdXVuaV9qdXVsaV9hdWd1c3Rfc2VwdGVtYmVyX29rdG9vYmVyX25vdmVtYmVyX2RldHNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFhbl92ZWVicl9tw6RydHNfYXByX21haV9qdXVuaV9qdXVsaV9hdWdfc2VwdF9va3Rfbm92X2RldHMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3DDvGhhcMOkZXZfZXNtYXNww6Rldl90ZWlzaXDDpGV2X2tvbG1hcMOkZXZfbmVsamFww6Rldl9yZWVkZV9sYXVww6Rldicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnUF9FX1RfS19OX1JfTCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdQX0VfVF9LX05fUl9MJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdELiBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbVMOkbmEsXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0hvbW1lLF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbSsOkcmdtaW5lXSBkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbRWlsZSxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0VlbG1pbmVdIGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBww6RyYXN0JyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB0YWdhc2knLFxuICAgICAgICAgICAgczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHNzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG1tOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGhoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGRkOiAnJWQgcMOkZXZhJyxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBldDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCYXNxdWUgW2V1XVxuLy8hIGF1dGhvciA6IEVuZWtvIElsbGFycmFtZW5kaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9laWxsYXJyYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGV1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZXUnLCB7XG4gICAgICAgIG1vbnRoczogJ3VydGFycmlsYV9vdHNhaWxhX21hcnR4b2FfYXBpcmlsYV9tYWlhdHphX2VrYWluYV91enRhaWxhX2FidXp0dWFfaXJhaWxhX3VycmlhX2F6YXJvYV9hYmVuZHVhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICd1cnQuX290cy5fbWFyLl9hcGkuX21haS5fZWthLl91enQuX2FidS5faXJhLl91cnIuX2F6YS5fYWJlLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdpZ2FuZGVhX2FzdGVsZWhlbmFfYXN0ZWFydGVhX2FzdGVhemtlbmFfb3N0ZWd1bmFfb3N0aXJhbGFfbGFydW5iYXRhJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdpZy5fYWwuX2FyLl9hei5fb2cuX29sLl9sci4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnaWdfYWxfYXJfYXpfb2dfb2xfbHInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZW2tvXSBNTU1NW3Jlbl0gRFthXScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZW2tvXSBNTU1NW3Jlbl0gRFthXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgWVlZWVtrb10gTU1NTVtyZW5dIERbYV0gSEg6bW0nLFxuICAgICAgICAgICAgbDogJ1lZWVktTS1EJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWVtrb10gTU1NIERbYV0nLFxuICAgICAgICAgICAgbGxsOiAnWVlZWVtrb10gTU1NIERbYV0gSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCwgWVlZWVtrb10gTU1NIERbYV0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tnYXVyXSBMVFtldGFuXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2JpaGFyXSBMVFtldGFuXScsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgTFRbZXRhbl0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1thdHpvXSBMVFtldGFuXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1thdXJyZWtvXSBkZGRkIExUW2V0YW5dJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgYmFycnUnLFxuICAgICAgICAgICAgcGFzdDogJ2R1ZWxhICVzJyxcbiAgICAgICAgICAgIHM6ICdzZWd1bmRvIGJhdHp1aycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG8nLFxuICAgICAgICAgICAgbTogJ21pbnV0dSBiYXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHUnLFxuICAgICAgICAgICAgaDogJ29yZHUgYmF0JyxcbiAgICAgICAgICAgIGhoOiAnJWQgb3JkdScsXG4gICAgICAgICAgICBkOiAnZWd1biBiYXQnLFxuICAgICAgICAgICAgZGQ6ICclZCBlZ3VuJyxcbiAgICAgICAgICAgIE06ICdoaWxhYmV0ZSBiYXQnLFxuICAgICAgICAgICAgTU06ICclZCBoaWxhYmV0ZScsXG4gICAgICAgICAgICB5OiAndXJ0ZSBiYXQnLFxuICAgICAgICAgICAgeXk6ICclZCB1cnRlJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBldTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBQZXJzaWFuIFtmYV1cbi8vISBhdXRob3IgOiBFYnJhaGltIEJ5YWdvd2kgOiBodHRwczovL2dpdGh1Yi5jb20vZWJyYW1pbmlvXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ9uxJyxcbiAgICAgICAgICAgIDI6ICfbsicsXG4gICAgICAgICAgICAzOiAn27MnLFxuICAgICAgICAgICAgNDogJ9u0JyxcbiAgICAgICAgICAgIDU6ICfbtScsXG4gICAgICAgICAgICA2OiAn27YnLFxuICAgICAgICAgICAgNzogJ9u3JyxcbiAgICAgICAgICAgIDg6ICfbuCcsXG4gICAgICAgICAgICA5OiAn27knLFxuICAgICAgICAgICAgMDogJ9uwJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ9uxJzogJzEnLFxuICAgICAgICAgICAgJ9uyJzogJzInLFxuICAgICAgICAgICAgJ9uzJzogJzMnLFxuICAgICAgICAgICAgJ9u0JzogJzQnLFxuICAgICAgICAgICAgJ9u1JzogJzUnLFxuICAgICAgICAgICAgJ9u2JzogJzYnLFxuICAgICAgICAgICAgJ9u3JzogJzcnLFxuICAgICAgICAgICAgJ9u4JzogJzgnLFxuICAgICAgICAgICAgJ9u5JzogJzknLFxuICAgICAgICAgICAgJ9uwJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIGZhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZmEnLCB7XG4gICAgICAgIG1vbnRoczogJ9qY2KfZhtmI24zZh1/ZgdmI2LHbjNmHX9mF2KfYsdizX9ii2YjYsduM2YRf2YXZh1/amNmI2KbZhl/amNmI2KbbjNmHX9in2YjYql/Ys9m+2KrYp9mF2KjYsV/Yp9qp2KrYqNixX9mG2YjYp9mF2KjYsV/Yr9iz2KfZhdio2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9qY2KfZhtmI24zZh1/ZgdmI2LHbjNmHX9mF2KfYsdizX9ii2YjYsduM2YRf2YXZh1/amNmI2KbZhl/amNmI2KbbjNmHX9in2YjYql/Ys9m+2KrYp9mF2KjYsV/Yp9qp2KrYqNixX9mG2YjYp9mF2KjYsV/Yr9iz2KfZhdio2LEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn24zaqVxcdTIwMGPYtNmG2KjZh1/Yr9mI2LTZhtio2Ydf2LPZh1xcdTIwMGPYtNmG2KjZh1/ahtmH2KfYsdi02YbYqNmHX9m+2YbYrFxcdTIwMGPYtNmG2KjZh1/YrNmF2LnZh1/YtNmG2KjZhycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OlxuICAgICAgICAgICAgJ9uM2qlcXHUyMDBj2LTZhtio2Ydf2K/ZiNi02YbYqNmHX9iz2YdcXHUyMDBj2LTZhtio2Ydf2obZh9in2LHYtNmG2KjZh1/ZvtmG2KxcXHUyMDBj2LTZhtio2Ydf2KzZhdi52Ydf2LTZhtio2YcnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfbjF/Yr1/Ys1/ahl/Zvl/YrF/YtCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/Zgtio2YQg2KfYsiDYuNmH2LF82KjYudivINin2LIg2LjZh9ixLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL9io2LnYryDYp9iyINi42YfYsS8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZgtio2YQg2KfYsiDYuNmH2LEnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9io2LnYryDYp9iyINi42YfYsSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2YXYsdmI2LIg2LPYp9i52KpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2YHYsdiv2Kcg2LPYp9i52KpdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2LPYp9i52KpdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2K/bjNix2YjYsiDYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFvZvtuM2LRdIFvYs9in2LnYql0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfYr9ixICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDZvtuM2LQnLFxuICAgICAgICAgICAgczogJ9qG2YbYryDYq9in2YbbjNmHJyxcbiAgICAgICAgICAgIHNzOiAnJWQg2KvYp9mG24zZhycsXG4gICAgICAgICAgICBtOiAn24zaqSDYr9mC24zZgtmHJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K/ZgtuM2YLZhycsXG4gICAgICAgICAgICBoOiAn24zaqSDYs9in2LnYqicsXG4gICAgICAgICAgICBoaDogJyVkINiz2KfYudiqJyxcbiAgICAgICAgICAgIGQ6ICfbjNqpINix2YjYsicsXG4gICAgICAgICAgICBkZDogJyVkINix2YjYsicsXG4gICAgICAgICAgICBNOiAn24zaqSDZhdin2YcnLFxuICAgICAgICAgICAgTU06ICclZCDZhdin2YcnLFxuICAgICAgICAgICAgeTogJ9uM2qkg2LPYp9mEJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPYp9mEJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9uwLdu5XS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfdmFLyxcbiAgICAgICAgb3JkaW5hbDogJyVk2YUnLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDEyLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxMnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEZpbm5pc2ggW2ZpXVxuLy8hIGF1dGhvciA6IFRhcm1vIEFpZGFudGF1c3RhIDogaHR0cHM6Ly9naXRodWIuY29tL2JsZWFkb2ZcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBudW1iZXJzUGFzdCA9XG4gICAgICAgICAgICAnbm9sbGEgeWtzaSBrYWtzaSBrb2xtZSBuZWxqw6Qgdmlpc2kga3V1c2kgc2VpdHNlbcOkbiBrYWhkZWtzYW4geWhkZWtzw6RuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnICdcbiAgICAgICAgICAgICksXG4gICAgICAgIG51bWJlcnNGdXR1cmUgPSBbXG4gICAgICAgICAgICAnbm9sbGEnLFxuICAgICAgICAgICAgJ3loZGVuJyxcbiAgICAgICAgICAgICdrYWhkZW4nLFxuICAgICAgICAgICAgJ2tvbG1lbicsXG4gICAgICAgICAgICAnbmVsasOkbicsXG4gICAgICAgICAgICAndmlpZGVuJyxcbiAgICAgICAgICAgICdrdXVkZW4nLFxuICAgICAgICAgICAgbnVtYmVyc1Bhc3RbN10sXG4gICAgICAgICAgICBudW1iZXJzUGFzdFs4XSxcbiAgICAgICAgICAgIG51bWJlcnNQYXN0WzldLFxuICAgICAgICBdO1xuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ211dXRhbWFuIHNla3VubmluJyA6ICdtdXV0YW1hIHNla3VudGknO1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ3Nla3VubmluJyA6ICdzZWt1bnRpYSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAnbWludXV0aW4nIDogJ21pbnV1dHRpJztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICdtaW51dXRpbicgOiAnbWludXV0dGlhJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICd0dW5uaW4nIDogJ3R1bnRpJztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICd0dW5uaW4nIDogJ3R1bnRpYSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAncMOkaXbDpG4nIDogJ3DDpGl2w6QnO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ3DDpGl2w6RuJyA6ICdww6RpdsOkw6QnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ2t1dWthdWRlbicgOiAna3V1a2F1c2knO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzRnV0dXJlID8gJ2t1dWthdWRlbicgOiAna3V1a2F1dHRhJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Z1dHVyZSA/ICd2dW9kZW4nIDogJ3Z1b3NpJztcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBpc0Z1dHVyZSA/ICd2dW9kZW4nIDogJ3Z1b3R0YSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdmVyYmFsTnVtYmVyKG51bWJlciwgaXNGdXR1cmUpICsgJyAnICsgcmVzdWx0O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmdW5jdGlvbiB2ZXJiYWxOdW1iZXIobnVtYmVyLCBpc0Z1dHVyZSkge1xuICAgICAgICByZXR1cm4gbnVtYmVyIDwgMTBcbiAgICAgICAgICAgID8gaXNGdXR1cmVcbiAgICAgICAgICAgICAgICA/IG51bWJlcnNGdXR1cmVbbnVtYmVyXVxuICAgICAgICAgICAgICAgIDogbnVtYmVyc1Bhc3RbbnVtYmVyXVxuICAgICAgICAgICAgOiBudW1iZXI7XG4gICAgfVxuXG4gICAgdmFyIGZpID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZmknLCB7XG4gICAgICAgIG1vbnRoczogJ3RhbW1pa3V1X2hlbG1pa3V1X21hYWxpc2t1dV9odWh0aWt1dV90b3Vrb2t1dV9rZXPDpGt1dV9oZWluw6RrdXVfZWxva3V1X3N5eXNrdXVfbG9rYWt1dV9tYXJyYXNrdXVfam91bHVrdXUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ3RhbW1pX2hlbG1pX21hYWxpc19odWh0aV90b3Vrb19rZXPDpF9oZWluw6RfZWxvX3N5eXNfbG9rYV9tYXJyYXNfam91bHUnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnc3VubnVudGFpX21hYW5hbnRhaV90aWlzdGFpX2tlc2tpdmlpa2tvX3RvcnN0YWlfcGVyamFudGFpX2xhdWFudGFpJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzdV9tYV90aV9rZV90b19wZV9sYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzdV9tYV90aV9rZV90b19wZV9sYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEgubW0nLFxuICAgICAgICAgICAgTFRTOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEbyBNTU1NW3RhXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0RvIE1NTU1bdGFdIFlZWVksIFtrbG9dIEhILm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEbyBNTU1NW3RhXSBZWVlZLCBba2xvXSBISC5tbScsXG4gICAgICAgICAgICBsOiAnRC5NLllZWVknLFxuICAgICAgICAgICAgbGw6ICdEbyBNTU0gWVlZWScsXG4gICAgICAgICAgICBsbGw6ICdEbyBNTU0gWVlZWSwgW2tsb10gSEgubW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCwgRG8gTU1NIFlZWVksIFtrbG9dIEhILm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbdMOkbsOkw6RuXSBba2xvXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2h1b21lbm5hXSBba2xvXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2tsb10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tlaWxlbl0gW2tsb10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbdmlpbWVdIGRkZGRbbmFdIFtrbG9dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgcMOkw6RzdMOkJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBzaXR0ZW4nLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEZpbGlwaW5vIFtmaWxdXG4vLyEgYXV0aG9yIDogRGFuIEhhZ21hbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYWdtYW5kYW5cbi8vISBhdXRob3IgOiBNYXR0aGV3IENvIDogaHR0cHM6Ly9naXRodWIuY29tL21hdHRoZXdkZWVjb1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGZpbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZpbCcsIHtcbiAgICAgICAgbW9udGhzOiAnRW5lcm9fUGVicmVyb19NYXJzb19BYnJpbF9NYXlvX0h1bnlvX0h1bHlvX0Fnb3N0b19TZXR5ZW1icmVfT2t0dWJyZV9Ob2J5ZW1icmVfRGlzeWVtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0VuZV9QZWJfTWFyX0Ficl9NYXlfSHVuX0h1bF9BZ29fU2V0X09rdF9Ob2JfRGlzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0xpbmdnb19MdW5lc19NYXJ0ZXNfTWl5ZXJrdWxlc19IdXdlYmVzX0JpeWVybmVzX1NhYmFkbycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0xpbl9MdW5fTWFyX01peV9IdXdfQml5X1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdMaV9MdV9NYV9NaV9IdV9CaV9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdNTS9EL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnTU1NTSBELCBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIERELCBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdMVCBbbmdheW9uZyBhcmF3XScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0J1a2FzIG5nXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ0xUIFtzYSBzdXN1bm9kIG5hXSBkZGRkJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdMVCBba2FoYXBvbl0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdMVCBbbm9vbmcgbmFrYXJhYW5nXSBkZGRkJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnc2EgbG9vYiBuZyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgYW5nIG5ha2FsaXBhcycsXG4gICAgICAgICAgICBzOiAnaWxhbmcgc2VndW5kbycsXG4gICAgICAgICAgICBzczogJyVkIHNlZ3VuZG8nLFxuICAgICAgICAgICAgbTogJ2lzYW5nIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0bycsXG4gICAgICAgICAgICBoOiAnaXNhbmcgb3JhcycsXG4gICAgICAgICAgICBoaDogJyVkIG9yYXMnLFxuICAgICAgICAgICAgZDogJ2lzYW5nIGFyYXcnLFxuICAgICAgICAgICAgZGQ6ICclZCBhcmF3JyxcbiAgICAgICAgICAgIE06ICdpc2FuZyBidXdhbicsXG4gICAgICAgICAgICBNTTogJyVkIGJ1d2FuJyxcbiAgICAgICAgICAgIHk6ICdpc2FuZyB0YW9uJyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGFvbicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRmFyb2VzZSBbZm9dXG4vLyEgYXV0aG9yIDogUmFnbmFyIEpvaGFubmVzZW4gOiBodHRwczovL2dpdGh1Yi5jb20vcmFnbmFyMTIzXG4vLyEgYXV0aG9yIDogS3Jpc3RpYW4gU2FrYXJpc3NvbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYWthcmlzc29uXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZm8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmbycsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFyc19hcHLDrWxfbWFpX2p1bmlfanVsaV9hdWd1c3Rfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnamFuX2ZlYl9tYXJfYXByX21haV9qdW5fanVsX2F1Z19zZXBfb2t0X25vdl9kZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3N1bm51ZGFndXJfbcOhbmFkYWd1cl90w71zZGFndXJfbWlrdWRhZ3VyX2jDs3NkYWd1cl9mcsOtZ2dqYWRhZ3VyX2xleWdhcmRhZ3VyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzdW5fbcOhbl90w71zX21pa19ow7NzX2Zyw61fbGV5Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3N1X23DoV90w71fbWlfaMOzX2ZyX2xlJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQuIE1NTU0sIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vDjSBkYWcga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW8ONIG1vcmdpbiBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW8ONIGdqw6FyIGtsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbc8Otw7BzdHVdIGRkZGQgW2tsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3VtICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBzw63DsGFuaScsXG4gICAgICAgICAgICBzOiAnZsOhIHNla3VuZCcsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZGlyJyxcbiAgICAgICAgICAgIG06ICdlaW4gbWludXR0dXInLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHRpcicsXG4gICAgICAgICAgICBoOiAnZWluIHTDrW1pJyxcbiAgICAgICAgICAgIGhoOiAnJWQgdMOtbWFyJyxcbiAgICAgICAgICAgIGQ6ICdlaW4gZGFndXInLFxuICAgICAgICAgICAgZGQ6ICclZCBkYWdhcicsXG4gICAgICAgICAgICBNOiAnZWluIG3DoW5hw7B1cicsXG4gICAgICAgICAgICBNTTogJyVkIG3DoW5hw7BpcicsXG4gICAgICAgICAgICB5OiAnZWl0dCDDoXInLFxuICAgICAgICAgICAgeXk6ICclZCDDoXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZvO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEZyZW5jaCAoQ2FuYWRhKSBbZnItY2FdXG4vLyEgYXV0aG9yIDogSm9uYXRoYW4gQWJvdXJiaWggOiBodHRwczovL2dpdGh1Yi5jb20vam9uYmNhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZnJDYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2ZyLWNhJywge1xuICAgICAgICBtb250aHM6ICdqYW52aWVyX2bDqXZyaWVyX21hcnNfYXZyaWxfbWFpX2p1aW5fanVpbGxldF9hb8O7dF9zZXB0ZW1icmVfb2N0b2JyZV9ub3ZlbWJyZV9kw6ljZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbnYuX2bDqXZyLl9tYXJzX2F2ci5fbWFpX2p1aW5fanVpbC5fYW/Du3Rfc2VwdC5fb2N0Ll9ub3YuX2TDqWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnZGltYW5jaGVfbHVuZGlfbWFyZGlfbWVyY3JlZGlfamV1ZGlfdmVuZHJlZGlfc2FtZWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGltLl9sdW4uX21hci5fbWVyLl9qZXUuX3Zlbi5fc2FtLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkaV9sdV9tYV9tZV9qZV92ZV9zYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbQXVqb3VyZOKAmWh1aSDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tEZW1haW4gw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSGllciDDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtkZXJuaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhbnMgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2lsIHkgYSAlcycsXG4gICAgICAgICAgICBzOiAncXVlbHF1ZXMgc2Vjb25kZXMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRlcycsXG4gICAgICAgICAgICBtOiAndW5lIG1pbnV0ZScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZXMnLFxuICAgICAgICAgICAgaDogJ3VuZSBoZXVyZScsXG4gICAgICAgICAgICBoaDogJyVkIGhldXJlcycsXG4gICAgICAgICAgICBkOiAndW4gam91cicsXG4gICAgICAgICAgICBkZDogJyVkIGpvdXJzJyxcbiAgICAgICAgICAgIE06ICd1biBtb2lzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbW9pcycsXG4gICAgICAgICAgICB5OiAndW4gYW4nLFxuICAgICAgICAgICAgeXk6ICclZCBhbnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oZXJ8ZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBtYXNjdWxpbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBtb2lzLCB0cmltZXN0cmUsIGpvdXJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ2VyJyA6ICdlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIGZlbWluaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogc2VtYWluZVxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdyZScgOiAnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZyQ2E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRnJlbmNoIChTd2l0emVybGFuZCkgW2ZyLWNoXVxuLy8hIGF1dGhvciA6IEdhc3BhcmQgQnVjaGVyIDogaHR0cHM6Ly9naXRodWIuY29tL2dhc3BhcmRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBmckNoID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZnItY2gnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnZpZXJfZsOpdnJpZXJfbWFyc19hdnJpbF9tYWlfanVpbl9qdWlsbGV0X2Fvw7t0X3NlcHRlbWJyZV9vY3RvYnJlX25vdmVtYnJlX2TDqWNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFudi5fZsOpdnIuX21hcnNfYXZyLl9tYWlfanVpbl9qdWlsLl9hb8O7dF9zZXB0Ll9vY3QuX25vdi5fZMOpYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdkaW1hbmNoZV9sdW5kaV9tYXJkaV9tZXJjcmVkaV9qZXVkaV92ZW5kcmVkaV9zYW1lZGknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkaW0uX2x1bi5fbWFyLl9tZXIuX2pldS5fdmVuLl9zYW0uJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RpX2x1X21hX21lX2plX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tBdWpvdXJk4oCZaHVpIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0RlbWFpbiDDoF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tIaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2Rlcm5pZXIgw6BdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFucyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnaWwgeSBhICVzJyxcbiAgICAgICAgICAgIHM6ICdxdWVscXVlcyBzZWNvbmRlcycsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGVzJyxcbiAgICAgICAgICAgIG06ICd1bmUgbWludXRlJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgICAgICBoOiAndW5lIGhldXJlJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaGV1cmVzJyxcbiAgICAgICAgICAgIGQ6ICd1biBqb3VyJyxcbiAgICAgICAgICAgIGRkOiAnJWQgam91cnMnLFxuICAgICAgICAgICAgTTogJ3VuIG1vaXMnLFxuICAgICAgICAgICAgTU06ICclZCBtb2lzJyxcbiAgICAgICAgICAgIHk6ICd1biBhbicsXG4gICAgICAgICAgICB5eTogJyVkIGFucycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShlcnxlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIG1hc2N1bGluZSBncmFtbWF0aWNhbCBnZW5kZXI6IG1vaXMsIHRyaW1lc3RyZSwgam91clxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJ2UnKTtcblxuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggZmVtaW5pbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBzZW1haW5lXG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ3JlJyA6ICdlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBmckNoO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEZyZW5jaCBbZnJdXG4vLyEgYXV0aG9yIDogSm9obiBGaXNjaGVyIDogaHR0cHM6Ly9naXRodWIuY29tL2pmcm9mZmljZVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1N0cmljdFJlZ2V4ID1cbiAgICAgICAgICAgIC9eKGphbnZpZXJ8ZsOpdnJpZXJ8bWFyc3xhdnJpbHxtYWl8anVpbnxqdWlsbGV0fGFvw7t0fHNlcHRlbWJyZXxvY3RvYnJlfG5vdmVtYnJlfGTDqWNlbWJyZSkvaSxcbiAgICAgICAgbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9XG4gICAgICAgICAgICAvKGphbnZcXC4/fGbDqXZyXFwuP3xtYXJzfGF2clxcLj98bWFpfGp1aW58anVpbFxcLj98YW/Du3R8c2VwdFxcLj98b2N0XFwuP3xub3ZcXC4/fGTDqWNcXC4/KS9pLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvKGphbnZcXC4/fGbDqXZyXFwuP3xtYXJzfGF2clxcLj98bWFpfGp1aW58anVpbFxcLj98YW/Du3R8c2VwdFxcLj98b2N0XFwuP3xub3ZcXC4/fGTDqWNcXC4/fGphbnZpZXJ8ZsOpdnJpZXJ8bWFyc3xhdnJpbHxtYWl8anVpbnxqdWlsbGV0fGFvw7t0fHNlcHRlbWJyZXxvY3RvYnJlfG5vdmVtYnJlfGTDqWNlbWJyZSkvaSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXmphbnYvaSxcbiAgICAgICAgICAgIC9eZsOpdnIvaSxcbiAgICAgICAgICAgIC9ebWFycy9pLFxuICAgICAgICAgICAgL15hdnIvaSxcbiAgICAgICAgICAgIC9ebWFpL2ksXG4gICAgICAgICAgICAvXmp1aW4vaSxcbiAgICAgICAgICAgIC9eanVpbC9pLFxuICAgICAgICAgICAgL15hb8O7dC9pLFxuICAgICAgICAgICAgL15zZXB0L2ksXG4gICAgICAgICAgICAvXm9jdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZMOpYy9pLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGZyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZnInLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnZpZXJfZsOpdnJpZXJfbWFyc19hdnJpbF9tYWlfanVpbl9qdWlsbGV0X2Fvw7t0X3NlcHRlbWJyZV9vY3RvYnJlX25vdmVtYnJlX2TDqWNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnamFudi5fZsOpdnIuX21hcnNfYXZyLl9tYWlfanVpbl9qdWlsLl9hb8O7dF9zZXB0Ll9vY3QuX25vdi5fZMOpYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6IG1vbnRoc1N0cmljdFJlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OiBtb250aHNTaG9ydFN0cmljdFJlZ2V4LFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5czogJ2RpbWFuY2hlX2x1bmRpX21hcmRpX21lcmNyZWRpX2pldWRpX3ZlbmRyZWRpX3NhbWVkaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RpbS5fbHVuLl9tYXIuX21lci5famV1Ll92ZW4uX3NhbS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZGlfbHVfbWFfbWVfamVfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0F1am91cmTigJlodWkgw6BdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRGVtYWluIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8OgXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0hpZXIgw6BdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZGVybmllciDDoF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkYW5zICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdpbCB5IGEgJXMnLFxuICAgICAgICAgICAgczogJ3F1ZWxxdWVzIHNlY29uZGVzJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kZXMnLFxuICAgICAgICAgICAgbTogJ3VuZSBtaW51dGUnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGg6ICd1bmUgaGV1cmUnLFxuICAgICAgICAgICAgaGg6ICclZCBoZXVyZXMnLFxuICAgICAgICAgICAgZDogJ3VuIGpvdXInLFxuICAgICAgICAgICAgZGQ6ICclZCBqb3VycycsXG4gICAgICAgICAgICB3OiAndW5lIHNlbWFpbmUnLFxuICAgICAgICAgICAgd3c6ICclZCBzZW1haW5lcycsXG4gICAgICAgICAgICBNOiAndW4gbW9pcycsXG4gICAgICAgICAgICBNTTogJyVkIG1vaXMnLFxuICAgICAgICAgICAgeTogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5zJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGVyfCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogUmV0dXJuICdlJyB3aGVuIGRheSBvZiBtb250aCA+IDEuIE1vdmUgdGhpcyBjYXNlIGluc2lkZVxuICAgICAgICAgICAgICAgIC8vIGJsb2NrIGZvciBtYXNjdWxpbmUgd29yZHMgYmVsb3cuXG4gICAgICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8zMzc1XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ2VyJyA6ICcnKTtcblxuICAgICAgICAgICAgICAgIC8vIFdvcmRzIHdpdGggbWFzY3VsaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogbW9pcywgdHJpbWVzdHJlLCBqb3VyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdlcicgOiAnZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBmZW1pbmluZSBncmFtbWF0aWNhbCBnZW5kZXI6IHNlbWFpbmVcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAncmUnIDogJ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEZyaXNpYW4gW2Z5XVxuLy8hIGF1dGhvciA6IFJvYmluIHZhbiBkZXIgVmxpZXQgOiBodHRwczovL2dpdGh1Yi5jb20vcm9iaW4wdmFuMGRlcjB2XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnRXaXRoRG90cyA9XG4gICAgICAgICAgICAnamFuLl9mZWIuX21ydC5fYXByLl9tYWlfanVuLl9qdWwuX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVzLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnRXaXRob3V0RG90cyA9XG4gICAgICAgICAgICAnamFuX2ZlYl9tcnRfYXByX21haV9qdW5fanVsX2F1Z19zZXBfb2t0X25vdl9kZXMnLnNwbGl0KCdfJyk7XG5cbiAgICB2YXIgZnkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdmeScsIHtcbiAgICAgICAgbW9udGhzOiAnamFubmV3YXJpc19mZWJyZXdhcmlzX21hYXJ0X2FwcmlsX21hYWllX2p1bnlfanVseV9hdWd1c3R1c19zZXB0aW1iZXJfb2t0b2Jlcl9ub3ZpbWJlcl9kZXNpbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGZ1bmN0aW9uIChtLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhEb3RzO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhvdXREb3RzW20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhEb3RzW20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnc25laW5fbW9hbmRlaV90aWlzZGVpX3dvYW5zZGVpX3RvbmdlcnNkZWlfZnJlZWRfc25lb24nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzaS5fbW8uX3RpLl93by5fdG8uX2ZyLl9zby4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU2lfTW9fVGlfV29fVG9fRnJfU28nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELU1NLVlZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2hqb2VkIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vYXJuIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2p1c3RlciBvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbw7RmcsO7bmVdIGRkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ29lciAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgbHluJyxcbiAgICAgICAgICAgIHM6ICdpbiBwZWFyIHNla29uZGVuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vrb25kZW4nLFxuICAgICAgICAgICAgbTogJ2llbiBtaW7DunQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVuJyxcbiAgICAgICAgICAgIGg6ICdpZW4gb2VyZScsXG4gICAgICAgICAgICBoaDogJyVkIG9lcmVuJyxcbiAgICAgICAgICAgIGQ6ICdpZW4gZGVpJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnZW4nLFxuICAgICAgICAgICAgTTogJ2llbiBtb2FubmUnLFxuICAgICAgICAgICAgTU06ICclZCBtb2FubmVuJyxcbiAgICAgICAgICAgIHk6ICdpZW4gamllcicsXG4gICAgICAgICAgICB5eTogJyVkIGppZXJyZW4nLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oc3RlfGRlKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICtcbiAgICAgICAgICAgICAgICAobnVtYmVyID09PSAxIHx8IG51bWJlciA9PT0gOCB8fCBudW1iZXIgPj0gMjAgPyAnc3RlJyA6ICdkZScpXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSXJpc2ggb3IgSXJpc2ggR2FlbGljIFtnYV1cbi8vISBhdXRob3IgOiBBbmRyw6kgU2lsdmEgOiBodHRwczovL2dpdGh1Yi5jb20vYXNrcHRcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICAgICAnRWFuw6FpcicsXG4gICAgICAgICAgICAnRmVhYmhyYScsXG4gICAgICAgICAgICAnTcOhcnRhJyxcbiAgICAgICAgICAgICdBaWJyZcOhbicsXG4gICAgICAgICAgICAnQmVhbHRhaW5lJyxcbiAgICAgICAgICAgICdNZWl0aGVhbWgnLFxuICAgICAgICAgICAgJ0nDumlsJyxcbiAgICAgICAgICAgICdMw7puYXNhJyxcbiAgICAgICAgICAgICdNZcOhbiBGw7NtaGFpcicsXG4gICAgICAgICAgICAnRGVpcmVhZGggRsOzbWhhaXInLFxuICAgICAgICAgICAgJ1NhbWhhaW4nLFxuICAgICAgICAgICAgJ05vbGxhaWcnLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNTaG9ydCA9IFtcbiAgICAgICAgICAgICdFYW4nLFxuICAgICAgICAgICAgJ0ZlYWJoJyxcbiAgICAgICAgICAgICdNw6FydCcsXG4gICAgICAgICAgICAnQWliJyxcbiAgICAgICAgICAgICdCZWFsJyxcbiAgICAgICAgICAgICdNZWl0aCcsXG4gICAgICAgICAgICAnScO6aWwnLFxuICAgICAgICAgICAgJ0zDum4nLFxuICAgICAgICAgICAgJ00uRi4nLFxuICAgICAgICAgICAgJ0QuRi4nLFxuICAgICAgICAgICAgJ1NhbWgnLFxuICAgICAgICAgICAgJ05vbGwnLFxuICAgICAgICBdLFxuICAgICAgICB3ZWVrZGF5cyA9IFtcbiAgICAgICAgICAgICdEw6kgRG9taG5haWdoJyxcbiAgICAgICAgICAgICdEw6kgTHVhaW4nLFxuICAgICAgICAgICAgJ0TDqSBNw6FpcnQnLFxuICAgICAgICAgICAgJ0TDqSBDw6lhZGFvaW4nLFxuICAgICAgICAgICAgJ0TDqWFyZGFvaW4nLFxuICAgICAgICAgICAgJ0TDqSBoQW9pbmUnLFxuICAgICAgICAgICAgJ0TDqSBTYXRoYWlybicsXG4gICAgICAgIF0sXG4gICAgICAgIHdlZWtkYXlzU2hvcnQgPSBbJ0RvbWgnLCAnTHVhbicsICdNw6FpcnQnLCAnQ8OpYWQnLCAnRMOpYXInLCAnQW9pbmUnLCAnU2F0aCddLFxuICAgICAgICB3ZWVrZGF5c01pbiA9IFsnRG8nLCAnTHUnLCAnTcOhJywgJ0PDqScsICdEw6knLCAnQScsICdTYSddO1xuXG4gICAgdmFyIGdhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ2EnLCB7XG4gICAgICAgIG1vbnRoczogbW9udGhzLFxuICAgICAgICBtb250aHNTaG9ydDogbW9udGhzU2hvcnQsXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiB3ZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogd2Vla2RheXNTaG9ydCxcbiAgICAgICAgd2Vla2RheXNNaW46IHdlZWtkYXlzTWluLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0lubml1IGFnXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW0Ftw6FyYWNoIGFnXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2FnXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0lubsOpIGFnXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3NlbyBjYWl0ZV0gW2FnXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2kgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMOzIHNoaW4nLFxuICAgICAgICAgICAgczogJ2PDunBsYSBzb2ljaW5kJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc29pY2luZCcsXG4gICAgICAgICAgICBtOiAnbsOzaW3DqWFkJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbsOzaW3DqWFkJyxcbiAgICAgICAgICAgIGg6ICd1YWlyIGFuIGNobG9pZycsXG4gICAgICAgICAgICBoaDogJyVkIHVhaXIgYW4gY2hsb2lnJyxcbiAgICAgICAgICAgIGQ6ICdsw6EnLFxuICAgICAgICAgICAgZGQ6ICclZCBsw6EnLFxuICAgICAgICAgICAgTTogJ23DrScsXG4gICAgICAgICAgICBNTTogJyVkIG3DrW9ubmEnLFxuICAgICAgICAgICAgeTogJ2JsaWFpbicsXG4gICAgICAgICAgICB5eTogJyVkIGJsaWFpbicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShkfG5hfG1oKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSBudW1iZXIgPT09IDEgPyAnZCcgOiBudW1iZXIgJSAxMCA9PT0gMiA/ICduYScgOiAnbWgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNjb3R0aXNoIEdhZWxpYyBbZ2RdXG4vLyEgYXV0aG9yIDogSm9uIEFzaGRvd24gOiBodHRwczovL2dpdGh1Yi5jb20vam9uYXNoZG93blxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRocyA9IFtcbiAgICAgICAgICAgICdBbSBGYW9pbGxlYWNoJyxcbiAgICAgICAgICAgICdBbiBHZWFycmFuJyxcbiAgICAgICAgICAgICdBbSBNw6BydCcsXG4gICAgICAgICAgICAnQW4gR2libGVhbicsXG4gICAgICAgICAgICAnQW4gQ8OoaXRlYW4nLFxuICAgICAgICAgICAgJ0FuIHQtw5JnbWhpb3MnLFxuICAgICAgICAgICAgJ0FuIHQtSXVjaGFyJyxcbiAgICAgICAgICAgICdBbiBMw7luYXN0YWwnLFxuICAgICAgICAgICAgJ0FuIHQtU3VsdGFpbicsXG4gICAgICAgICAgICAnQW4gRMOgbWhhaXInLFxuICAgICAgICAgICAgJ0FuIHQtU2FtaGFpbicsXG4gICAgICAgICAgICAnQW4gRMO5YmhsYWNoZCcsXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gW1xuICAgICAgICAgICAgJ0Zhb2knLFxuICAgICAgICAgICAgJ0dlYXInLFxuICAgICAgICAgICAgJ03DoHJ0JyxcbiAgICAgICAgICAgICdHaWJsJyxcbiAgICAgICAgICAgICdDw6hpdCcsXG4gICAgICAgICAgICAnw5JnbWgnLFxuICAgICAgICAgICAgJ0l1Y2gnLFxuICAgICAgICAgICAgJ0zDuW4nLFxuICAgICAgICAgICAgJ1N1bHQnLFxuICAgICAgICAgICAgJ0TDoG1oJyxcbiAgICAgICAgICAgICdTYW1oJyxcbiAgICAgICAgICAgICdEw7liaCcsXG4gICAgICAgIF0sXG4gICAgICAgIHdlZWtkYXlzID0gW1xuICAgICAgICAgICAgJ0RpZMOybWhuYWljaCcsXG4gICAgICAgICAgICAnRGlsdWFpbicsXG4gICAgICAgICAgICAnRGltw6BpcnQnLFxuICAgICAgICAgICAgJ0RpY2lhZGFpbicsXG4gICAgICAgICAgICAnRGlhcmRhb2luJyxcbiAgICAgICAgICAgICdEaWhhb2luZScsXG4gICAgICAgICAgICAnRGlzYXRoYWlybmUnLFxuICAgICAgICBdLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0ID0gWydEaWQnLCAnRGlsJywgJ0RpbScsICdEaWMnLCAnRGlhJywgJ0RpaCcsICdEaXMnXSxcbiAgICAgICAgd2Vla2RheXNNaW4gPSBbJ0TDsicsICdMdScsICdNw6AnLCAnQ2knLCAnQXInLCAnSGEnLCAnU2EnXTtcblxuICAgIHZhciBnZCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2dkJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRoc1Nob3J0LFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogd2Vla2RheXMsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IHdlZWtkYXlzU2hvcnQsXG4gICAgICAgIHdlZWtkYXlzTWluOiB3ZWVrZGF5c01pbixcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tBbi1kaXVnaCBhaWddIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQS1tw6BpcmVhY2ggYWlnXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2FpZ10gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tBbi1kw6ggYWlnXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3NlbyBjaGFpZGhdIFthaWddIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnYW5uIGFuICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdiaG8gY2hpb25uICVzJyxcbiAgICAgICAgICAgIHM6ICdiZWFnYW4gZGlvZ2FuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgZGlvZ2FuJyxcbiAgICAgICAgICAgIG06ICdtaW9uYWlkJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWlvbmFpZGVhbicsXG4gICAgICAgICAgICBoOiAndWFpcicsXG4gICAgICAgICAgICBoaDogJyVkIHVhaXJlYW4nLFxuICAgICAgICAgICAgZDogJ2xhdGhhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgbGF0aGEnLFxuICAgICAgICAgICAgTTogJ23DrG9zJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOsb3NhbicsXG4gICAgICAgICAgICB5OiAnYmxpYWRobmEnLFxuICAgICAgICAgICAgeXk6ICclZCBibGlhZGhuYScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShkfG5hfG1oKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSBudW1iZXIgPT09IDEgPyAnZCcgOiBudW1iZXIgJSAxMCA9PT0gMiA/ICduYScgOiAnbWgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdkO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEdhbGljaWFuIFtnbF1cbi8vISBhdXRob3IgOiBKdWFuIEcuIEh1cnRhZG8gOiBodHRwczovL2dpdGh1Yi5jb20vanVhbmdodXJ0YWRvXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgZ2wgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdnbCcsIHtcbiAgICAgICAgbW9udGhzOiAneGFuZWlyb19mZWJyZWlyb19tYXJ6b19hYnJpbF9tYWlvX3h1w7FvX3h1bGxvX2Fnb3N0b19zZXRlbWJyb19vdXR1YnJvX25vdmVtYnJvX2RlY2VtYnJvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICd4YW4uX2ZlYi5fbWFyLl9hYnIuX21haS5feHXDsS5feHVsLl9hZ28uX3NldC5fb3V0Ll9ub3YuX2RlYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21pbmdvX2x1bnNfbWFydGVzX23DqXJjb3Jlc194b3Zlc192ZW5yZXNfc8OhYmFkbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ2RvbS5fbHVuLl9tYXIuX23DqXIuX3hvdi5fdmVuLl9zw6FiLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdkb19sdV9tYV9tw6lfeG9fdmVfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFtkZV0gTU1NTSBbZGVdIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW2hveGUgJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnw6FzJyA6ICfDoScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1ttYcOxw6EgJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnw6FzJyA6ICfDoScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFsnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICfDoXMnIDogJ2EnKSArICddIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbb250ZSAnICsgKHRoaXMuaG91cnMoKSAhPT0gMSA/ICfDoScgOiAnYScpICsgJ10gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgJ1tvXSBkZGRkIFtwYXNhZG8gJyArICh0aGlzLmhvdXJzKCkgIT09IDEgPyAnw6FzJyA6ICdhJykgKyAnXSBMVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0ci5pbmRleE9mKCd1bicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnbicgKyBzdHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnZW4gJyArIHN0cjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXN0OiAnaGFpICVzJyxcbiAgICAgICAgICAgIHM6ICd1bnMgc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW5oYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VuIGTDrWEnLFxuICAgICAgICAgICAgZGQ6ICclZCBkw61hcycsXG4gICAgICAgICAgICBNOiAndW4gbWVzJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzZXMnLFxuICAgICAgICAgICAgeTogJ3VuIGFubycsXG4gICAgICAgICAgICB5eTogJyVkIGFub3MnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEtvbmthbmkgRGV2YW5hZ2FyaSBzY3JpcHQgW2dvbS1kZXZhXVxuLy8hIGF1dGhvciA6IFRoZSBEaXNjb3ZlcmVyIDogaHR0cHM6Ly9naXRodWIuY29tL1dpa2lEaXNjb3ZlcmVyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgczogWyfgpKXgpYvgpKHgpK/gpL4g4KS44KWF4KSV4KSC4KSh4KS+4KSC4KSo4KWAJywgJ+CkpeCli+CkoeClhyDgpLjgpYXgpJXgpILgpKEnXSxcbiAgICAgICAgICAgIHNzOiBbbnVtYmVyICsgJyDgpLjgpYXgpJXgpILgpKHgpL7gpILgpKjgpYAnLCBudW1iZXIgKyAnIOCkuOClheCkleCkguCkoSddLFxuICAgICAgICAgICAgbTogWyfgpI/gpJXgpL4g4KSu4KS/4KSj4KSf4KS+4KSoJywgJ+Ckj+CklSDgpK7gpL/gpKjgpYLgpJ8nXSxcbiAgICAgICAgICAgIG1tOiBbbnVtYmVyICsgJyDgpK7gpL/gpKPgpJ/gpL7gpILgpKjgpYAnLCBudW1iZXIgKyAnIOCkruCkv+Cko+Ckn+CkvuCkgiddLFxuICAgICAgICAgICAgaDogWyfgpI/gpJXgpL4g4KS14KSw4KS+4KSoJywgJ+Ckj+CklSDgpLXgpLAnXSxcbiAgICAgICAgICAgIGhoOiBbbnVtYmVyICsgJyDgpLXgpLDgpL7gpILgpKjgpYAnLCBudW1iZXIgKyAnIOCkteCksOCkvuCkgiddLFxuICAgICAgICAgICAgZDogWyfgpI/gpJXgpL4g4KSm4KS/4KS44KS+4KSoJywgJ+Ckj+CklSDgpKbgpYDgpLgnXSxcbiAgICAgICAgICAgIGRkOiBbbnVtYmVyICsgJyDgpKbgpL/gpLjgpL7gpILgpKjgpYAnLCBudW1iZXIgKyAnIOCkpuClgOCkuCddLFxuICAgICAgICAgICAgTTogWyfgpI/gpJXgpL4g4KSu4KWN4KS54KSv4KSo4KWN4KSv4KS+4KSoJywgJ+Ckj+CklSDgpK7gpY3gpLngpK/gpKjgpYsnXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyDgpK7gpY3gpLngpK/gpKjgpY3gpK/gpL7gpKjgpYAnLCBudW1iZXIgKyAnIOCkruCljeCkueCkr+CkqOClhyddLFxuICAgICAgICAgICAgeTogWyfgpI/gpJXgpL4g4KS14KSw4KWN4KS44KS+4KSoJywgJ+Ckj+CklSDgpLXgpLDgpY3gpLgnXSxcbiAgICAgICAgICAgIHl5OiBbbnVtYmVyICsgJyDgpLXgpLDgpY3gpLjgpL7gpILgpKjgpYAnLCBudW1iZXIgKyAnIOCkteCksOCljeCkuOCkvuCkgiddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cblxuICAgIHZhciBnb21EZXZhID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZ29tLWRldmEnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn4KSc4KS+4KSo4KWH4KS14KS+4KSw4KWAX+Ckq+Clh+CkrOCljeCksOClgeCkteCkvuCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSP4KSq4KWN4KSw4KWA4KSyX+CkruClh1/gpJzgpYLgpKhf4KSc4KWB4KSy4KSvX+CkkeCkl+CkuOCljeCkn1/gpLjgpKrgpY3gpJ/gpYfgpILgpKzgpLBf4KSR4KSV4KWN4KSf4KWL4KSs4KSwX+CkqOCli+CkteCljeCkueClh+CkguCkrOCksF/gpKHgpL/gpLjgpYfgpILgpKzgpLAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiAn4KSc4KS+4KSo4KWH4KS14KS+4KSw4KWA4KSa4KWN4KSv4KS+X+Ckq+Clh+CkrOCljeCksOClgeCkteCkvuCksOClgOCkmuCljeCkr+Ckvl/gpK7gpL7gpLDgpY3gpJrgpL7gpJrgpY3gpK/gpL5f4KSP4KSq4KWN4KSw4KWA4KSy4KS+4KSa4KWN4KSv4KS+X+CkruClh+Ckr+CkvuCkmuCljeCkr+Ckvl/gpJzgpYLgpKjgpL7gpJrgpY3gpK/gpL5f4KSc4KWB4KSy4KSv4KS+4KSa4KWN4KSv4KS+X+CkkeCkl+CkuOCljeCkn+CkvuCkmuCljeCkr+Ckvl/gpLjgpKrgpY3gpJ/gpYfgpILgpKzgpLDgpL7gpJrgpY3gpK/gpL5f4KSR4KSV4KWN4KSf4KWL4KSs4KSw4KS+4KSa4KWN4KSv4KS+X+CkqOCli+CkteCljeCkueClh+CkguCkrOCksOCkvuCkmuCljeCkr+Ckvl/gpKHgpL/gpLjgpYfgpILgpKzgpLDgpL7gpJrgpY3gpK/gpL4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvTU1NTShcXHMpK0Rbb0RdPy8sXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CknOCkvuCkqOClhy5f4KSr4KWH4KSs4KWN4KSw4KWBLl/gpK7gpL7gpLDgpY3gpJpf4KSP4KSq4KWN4KSw4KWALl/gpK7gpYdf4KSc4KWC4KSoX+CknOClgeCksi5f4KSR4KSXLl/gpLjgpKrgpY3gpJ/gpYfgpIIuX+CkkeCkleCljeCkn+Cliy5f4KSo4KWL4KS14KWN4KS54KWH4KSCLl/gpKHgpL/gpLjgpYfgpIIuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn4KSG4KSv4KSk4KS+4KSwX+CkuOCli+CkruCkvuCksF/gpK7gpILgpJfgpLPgpL7gpLBf4KSs4KWB4KSn4KS14KS+4KSwX+CkrOCkv+CksOClh+CkuOCljeCkpOCkvuCksF/gpLjgpYHgpJXgpY3gpLDgpL7gpLBf4KS24KWH4KSo4KS14KS+4KSwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4KSG4KSv4KSkLl/gpLjgpYvgpK4uX+CkruCkguCkl+Cksy5f4KSs4KWB4KSnLl/gpKzgpY3gpLDgpYfgpLjgpY3gpKQuX+CkuOClgeCkleCljeCksC5f4KS24KWH4KSoLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgpIZf4KS44KWLX+CkruCkgl/gpKzgpYFf4KSs4KWN4KSw4KWHX+CkuOClgV/gpLbgpYcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIFvgpLXgpL7gpJzgpKTgpL7gpIJdJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyBb4KS14KS+4KSc4KSk4KS+4KSCXScsXG4gICAgICAgICAgICBMOiAnREQtTU0tWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEEgaDptbSBb4KS14KS+4KSc4KSk4KS+4KSCXScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBEbywgWVlZWSwgQSBoOm1tIFvgpLXgpL7gpJzgpKTgpL7gpIJdJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQsIEQgTU1NIFlZWVksIEEgaDptbSBb4KS14KS+4KSc4KSk4KS+4KSCXScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CkhuCkr+CknF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgpKvgpL7gpLLgpY3gpK/gpL7gpIJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+Ckq+ClgeCkoeCksuCli10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CkleCkvuCksl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KSr4KS+4KSf4KSy4KWLXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCkhuCkpuClgOCkgicsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjgpLXgpYfgpLApLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRpbmFsICfgpLXgpYfgpLAnIG9ubHkgYXBwbGllcyB0byBkYXkgb2YgdGhlIG1vbnRoXG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn4KS14KWH4KSwJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWtcbiAgICAgICAgICAgIGRveTogMywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyICg3ICsgMCAtIDQpXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gpLDgpL7gpKTgpYB84KS44KSV4KS+4KSz4KWA4KSCfOCkpuCkqOCkquCkvuCksOCkvuCkgnzgpLjgpL7gpILgpJzgpYcvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgpLDgpL7gpKTgpYAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgpLjgpJXgpL7gpLPgpYDgpIInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KSm4KSo4KSq4KS+4KSw4KS+4KSCJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID4gMTIgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkuOCkvuCkguCknOClhycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLDgpL7gpKTgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOCkleCkvuCks+ClgOCkgic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSm4KSo4KSq4KS+4KSw4KS+4KSCJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpLjgpL7gpILgpJzgpYcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOClgCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ29tRGV2YTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLb25rYW5pIExhdGluIHNjcmlwdCBbZ29tLWxhdG5dXG4vLyEgYXV0aG9yIDogVGhlIERpc2NvdmVyZXIgOiBodHRwczovL2dpdGh1Yi5jb20vV2lraURpc2NvdmVyZXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzOiBbJ3Rob2RkZWEgc2Vrb25kYW1uaScsICd0aG9kZGUgc2Vrb25kJ10sXG4gICAgICAgICAgICBzczogW251bWJlciArICcgc2Vrb25kYW1uaScsIG51bWJlciArICcgc2Vrb25kJ10sXG4gICAgICAgICAgICBtOiBbJ2VrYSBtaW50YW4nLCAnZWsgbWludXQnXSxcbiAgICAgICAgICAgIG1tOiBbbnVtYmVyICsgJyBtaW50YW1uaScsIG51bWJlciArICcgbWludGFtJ10sXG4gICAgICAgICAgICBoOiBbJ2VrYSB2b3JhbicsICdlayB2b3InXSxcbiAgICAgICAgICAgIGhoOiBbbnVtYmVyICsgJyB2b3JhbW5pJywgbnVtYmVyICsgJyB2b3JhbSddLFxuICAgICAgICAgICAgZDogWydla2EgZGlzYW4nLCAnZWsgZGlzJ10sXG4gICAgICAgICAgICBkZDogW251bWJlciArICcgZGlzYW1uaScsIG51bWJlciArICcgZGlzJ10sXG4gICAgICAgICAgICBNOiBbJ2VrYSBtaG9pbmVhbicsICdlayBtaG9pbm8nXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyBtaG9pbmVhbW5pJywgbnVtYmVyICsgJyBtaG9pbmUnXSxcbiAgICAgICAgICAgIHk6IFsnZWthIHZvcnNhbicsICdlayB2b3JvcyddLFxuICAgICAgICAgICAgeXk6IFtudW1iZXIgKyAnIHZvcnNhbW5pJywgbnVtYmVyICsgJyB2b3JzYW0nXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gZm9ybWF0W2tleV1bMF0gOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG5cbiAgICB2YXIgZ29tTGF0biA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2dvbS1sYXRuJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ0phbmVyX0ZlYnJlcl9NYXJzX0FicmlsX01haV9KdW5fSnVsYWlfQWdvc3RfU2V0ZW1icl9PdHVicl9Ob3ZlbWJyX0RlemVtYnInLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZm9ybWF0OiAnSmFuZXJhY2hlYV9GZWJyZXJhY2hlYV9NYXJzYWNoZWFfQWJyaWxhY2hlYV9NYWlhY2hlYV9KdW5hY2hlYV9KdWxhaWFjaGVhX0Fnb3N0YWNoZWFfU2V0ZW1icmFjaGVhX090dWJyYWNoZWFfTm92ZW1icmFjaGVhX0RlemVtYnJhY2hlYScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9NTU1NKFxccykrRFtvRF0/LyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnSmFuLl9GZWIuX01hcnNfQWJyLl9NYWlfSnVuX0p1bC5fQWdvLl9TZXQuX090dS5fTm92Ll9EZXouJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogXCJBaXRhcl9Tb21hcl9Nb25nbGxhcl9CdWRodmFyX0JpcmVzdGFyX1N1a3Jhcl9Tb24ndmFyXCIuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0FpdC5fU29tLl9Nb24uX0J1ZC5fQnJlLl9TdWsuX1Nvbi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnQWlfU21fTW9fQnVfQnJfU3VfU24nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIFt2YXp0YV0nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIFt2YXp0YV0nLFxuICAgICAgICAgICAgTDogJ0RELU1NLVlZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBBIGg6bW0gW3ZhenRhXScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgTU1NTSBEbywgWVlZWSwgQSBoOm1tIFt2YXp0YV0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCwgRCBNTU0gWVlZWSwgQSBoOm1tIFt2YXp0YV0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tBaXpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRmFsZWFtXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1tGdWRkbG9dIGRkZGRbLF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tLYWxdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0ZhdHRsb10gZGRkZFssXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhZGltJyxcbiAgICAgICAgICAgIHM6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBzczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KGVyKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgb3JkaW5hbCAnZXInIG9ubHkgYXBwbGllcyB0byBkYXkgb2YgdGhlIG1vbnRoXG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnZXInO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vla1xuICAgICAgICAgICAgZG95OiAzLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIgKDcgKyAwIC0gNClcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL3JhdGl8c29rYWxsaW18ZG9ucGFyYW18c2FuamUvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdyYXRpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnc29rYWxsaW0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnZG9ucGFyYW0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPiAxMiA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnc2FuamUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncmF0aSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc29rYWxsaW0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvbnBhcmFtJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzYW5qZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAncmF0aSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ29tTGF0bjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHdWphcmF0aSBbZ3VdXG4vLyEgYXV0aG9yIDogS2F1c2hpayBUaGFua2kgOiBodHRwczovL2dpdGh1Yi5jb20vS2F1c2hpazE5ODdcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KunJyxcbiAgICAgICAgICAgIDI6ICfgq6gnLFxuICAgICAgICAgICAgMzogJ+CrqScsXG4gICAgICAgICAgICA0OiAn4KuqJyxcbiAgICAgICAgICAgIDU6ICfgq6snLFxuICAgICAgICAgICAgNjogJ+CrrCcsXG4gICAgICAgICAgICA3OiAn4KutJyxcbiAgICAgICAgICAgIDg6ICfgq64nLFxuICAgICAgICAgICAgOTogJ+CrrycsXG4gICAgICAgICAgICAwOiAn4KumJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Crpyc6ICcxJyxcbiAgICAgICAgICAgICfgq6gnOiAnMicsXG4gICAgICAgICAgICAn4KupJzogJzMnLFxuICAgICAgICAgICAgJ+Crqic6ICc0JyxcbiAgICAgICAgICAgICfgq6snOiAnNScsXG4gICAgICAgICAgICAn4KusJzogJzYnLFxuICAgICAgICAgICAgJ+CrrSc6ICc3JyxcbiAgICAgICAgICAgICfgq64nOiAnOCcsXG4gICAgICAgICAgICAn4KuvJzogJzknLFxuICAgICAgICAgICAgJ+Crpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBndSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2d1Jywge1xuICAgICAgICBtb250aHM6ICfgqpzgqr7gqqjgq43gqq/gq4HgqobgqrDgq4Bf4Kqr4KuH4Kqs4KuN4Kqw4KuB4KqG4Kqw4KuAX+CqruCqvuCqsOCrjeCqml/gqo/gqqrgq43gqrDgqr/gqrJf4Kqu4KuHX+CqnOCrguCqqF/gqpzgq4HgqrLgqr7gqohf4KqR4KqX4Kq44KuN4KqfX+CquOCqquCrjeCqn+Crh+CqruCrjeCqrOCqsF/gqpHgqpXgq43gqp/gq43gqqzgqrBf4Kqo4Kq14KuH4Kqu4KuN4Kqs4KqwX+CqoeCqv+CquOCrh+CqruCrjeCqrOCqsCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4Kqc4Kq+4Kqo4KuN4Kqv4KuBLl/gqqvgq4fgqqzgq43gqrDgq4EuX+CqruCqvuCqsOCrjeCqml/gqo/gqqrgq43gqrDgqr8uX+CqruCrh1/gqpzgq4Lgqqhf4Kqc4KuB4Kqy4Kq+Ll/gqpHgqpcuX+CquOCqquCrjeCqn+Crhy5f4KqR4KqV4KuN4Kqf4KuNLl/gqqjgqrXgq4cuX+CqoeCqv+CquOCrhy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfgqrDgqrXgqr/gqrXgqr7gqrBf4Kq44KuL4Kqu4Kq14Kq+4KqwX+CqruCqguCql+Cqs+CqteCqvuCqsF/gqqzgq4Hgqqfgq43gqrXgqr7gqrBf4KqX4KuB4Kqw4KuB4Kq14Kq+4KqwX+CqtuCrgeCqleCrjeCqsOCqteCqvuCqsF/gqrbgqqjgqr/gqrXgqr7gqrAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgqrDgqrXgqr9f4Kq44KuL4KquX+CqruCqguCql+Cqs1/gqqzgq4Hgqqfgq41f4KqX4KuB4Kqw4KuBX+CqtuCrgeCqleCrjeCqsF/gqrbgqqjgqr8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4KqwX+CquOCri1/gqq7gqoJf4Kqs4KuBX+Cql+CrgV/gqrbgq4Ff4Kq2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0g4Kq14Kq+4KqX4KuN4Kqv4KuHJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyDgqrXgqr7gqpfgq43gqq/gq4cnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCqteCqvuCql+CrjeCqr+CrhycsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSDgqrXgqr7gqpfgq43gqq/gq4cnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgqobgqpxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KqV4Kq+4Kqy4KuHXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KqX4KqH4KqV4Kq+4Kqy4KuHXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgqqrgqr7gqpvgqrLgqr5dIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4Kqu4Kq+JyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgqqrgqrngq4fgqrLgqr4nLFxuICAgICAgICAgICAgczogJ+CqheCqruCrgeCqlSDgqqrgqrPgq4snLFxuICAgICAgICAgICAgc3M6ICclZCDgqrjgq4fgqpXgqoLgqqEnLFxuICAgICAgICAgICAgbTogJ+Cqj+CqlSDgqq7gqr/gqqjgqr/gqp8nLFxuICAgICAgICAgICAgbW06ICclZCDgqq7gqr/gqqjgqr/gqp8nLFxuICAgICAgICAgICAgaDogJ+Cqj+CqlSDgqpXgqrLgqr7gqpUnLFxuICAgICAgICAgICAgaGg6ICclZCDgqpXgqrLgqr7gqpUnLFxuICAgICAgICAgICAgZDogJ+Cqj+CqlSDgqqbgqr/gqrXgqrgnLFxuICAgICAgICAgICAgZGQ6ICclZCDgqqbgqr/gqrXgqrgnLFxuICAgICAgICAgICAgTTogJ+Cqj+CqlSDgqq7gqrngqr/gqqjgq4snLFxuICAgICAgICAgICAgTU06ICclZCDgqq7gqrngqr/gqqjgq4snLFxuICAgICAgICAgICAgeTogJ+Cqj+CqlSDgqrXgqrDgq43gqrcnLFxuICAgICAgICAgICAgeXk6ICclZCDgqrXgqrDgq43gqrcnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4Kun4Kuo4Kup4Kuq4Kur4Kus4Kut4Kuu4Kuv4KumXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvLyBHdWphcmF0aSBub3RhdGlvbiBmb3IgbWVyaWRpZW1zIGFyZSBxdWl0ZSBmdXp6eSBpbiBwcmFjdGljZS4gV2hpbGUgdGhlcmUgZXhpc3RzXG4gICAgICAgIC8vIGEgcmlnaWQgbm90aW9uIG9mIGEgJ1BhaGFyJyBpdCBpcyBub3QgdXNlZCBhcyByaWdpZGx5IGluIG1vZGVybiBHdWphcmF0aS5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CqsOCqvuCqpHzgqqzgqqrgq4vgqrB84Kq44Kq14Kq+4KqwfOCquOCqvuCqguCqnC8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CqsOCqvuCqpCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CquOCqteCqvuCqsCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqqzgqqrgq4vgqrAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CquOCqvuCqguCqnCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqrDgqr7gqqQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CquOCqteCqvuCqsCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kqs4Kqq4KuL4KqwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqrjgqr7gqoLgqpwnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CqsOCqvuCqpCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBndTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBIZWJyZXcgW2hlXVxuLy8hIGF1dGhvciA6IFRvbWVyIENvaGVuIDogaHR0cHM6Ly9naXRodWIuY29tL3RvbWVyXG4vLyEgYXV0aG9yIDogTW9zaGUgU2ltYW50b3YgOiBodHRwczovL2dpdGh1Yi5jb20vRGV2ZWxvcG1lbnRJTFxuLy8hIGF1dGhvciA6IFRhbCBBdGVyIDogaHR0cHM6Ly9naXRodWIuY29tL1RhbEF0ZXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBoZSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2hlJywge1xuICAgICAgICBtb250aHM6ICfXmdeg15XXkNeoX9ek15HXqNeV15DXqF/Xnteo16Vf15DXpNeo15nXnF/XnteQ15lf15nXldeg15lf15nXldec15lf15DXldeS15XXodeYX9eh16TXmNee15HXqF/XkNeV16fXmNeV15HXqF/XoNeV15HXnteR16hf15PXptee15HXqCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn15nXoNeV17Nf16TXkdeo17Nf157XqNelX9eQ16TXqNezX9ee15DXmV/XmdeV16DXmV/XmdeV15zXmV/XkNeV15LXs1/Xodek15jXs1/XkNeV16fXs1/XoNeV15HXs1/Xk9em157Xsycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfXqNeQ16nXldefX9ep16DXmV/Xqdec15nXqdeZX9eo15HXmdei15lf15fXnteZ16nXmV/XqdeZ16nXmV/XqdeR16onLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfXkNezX9eR17Nf15LXs1/Xk9ezX9eU17Nf15XXs1/XqdezJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9eQX9eRX9eSX9eTX9eUX9eVX9epJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgW9eRXU1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIFvXkV1NTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgW9eRXU1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBsOiAnRC9NL1lZWVknLFxuICAgICAgICAgICAgbGw6ICdEIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIGxsbDogJ0QgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCwgRCBNTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9eU15nXldedINeR1r5dTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vXnteX16gg15HWvl1MVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9eR16nXoteUXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9eQ16rXnteV15wg15HWvl1MVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vXkdeZ15XXnV0gZGRkZCBb15TXkNeX16jXldefINeR16nXoteUXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9eR16LXldeTICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICfXnNek16DXmSAlcycsXG4gICAgICAgICAgICBzOiAn157Xodek16gg16nXoNeZ15XXqicsXG4gICAgICAgICAgICBzczogJyVkINep16DXmdeV16onLFxuICAgICAgICAgICAgbTogJ9eT16fXlCcsXG4gICAgICAgICAgICBtbTogJyVkINeT16fXldeqJyxcbiAgICAgICAgICAgIGg6ICfXqdei15QnLFxuICAgICAgICAgICAgaGg6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAn16nXoteq15nXmdedJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg16nXoteV16onO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGQ6ICfXmdeV150nLFxuICAgICAgICAgICAgZGQ6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAn15nXldee15nXmdedJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg15nXnteZ150nO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIE06ICfXl9eV15PXqScsXG4gICAgICAgICAgICBNTTogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfXl9eV15PXqdeZ15nXnSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINeX15XXk9ep15nXnSc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeTogJ9ep16DXlCcsXG4gICAgICAgICAgICB5eTogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfXqdeg16rXmdeZ150nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyICUgMTAgPT09IDAgJiYgbnVtYmVyICE9PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDXqdeg15QnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJyDXqdeg15nXnSc7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOlxuICAgICAgICAgICAgL9eQ15fXlFwi16Z815zXpNeg15RcItemfNeQ15fXqNeZINeU16bXlNeo15nXmdedfNec16TXoNeZINeU16bXlNeo15nXmdedfNec16TXoNeV16og15HXlden16h815HXkdeV16fXqHzXkdei16jXkS9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijXkNeX15RcItemfNeQ15fXqNeZINeU16bXlNeo15nXmdedfNeR16LXqNeRKSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfXnNek16DXldeqINeR15XXp9eoJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfXkdeR15XXp9eoJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAn15zXpNeg15RcItemJyA6ICfXnNek16DXmSDXlNem15TXqNeZ15nXnSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ9eQ15fXlFwi16YnIDogJ9eQ15fXqNeZINeU16bXlNeo15nXmdedJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfXkdei16jXkSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSGluZGkgW2hpXVxuLy8hIGF1dGhvciA6IE1heWFuayBTaW5naGFsIDogaHR0cHM6Ly9naXRodWIuY29tL21heWFua3NpbmdoYWxcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4KWnJyxcbiAgICAgICAgICAgIDI6ICfgpagnLFxuICAgICAgICAgICAgMzogJ+ClqScsXG4gICAgICAgICAgICA0OiAn4KWqJyxcbiAgICAgICAgICAgIDU6ICfgpasnLFxuICAgICAgICAgICAgNjogJ+ClrCcsXG4gICAgICAgICAgICA3OiAn4KWtJyxcbiAgICAgICAgICAgIDg6ICfgpa4nLFxuICAgICAgICAgICAgOTogJ+ClrycsXG4gICAgICAgICAgICAwOiAn4KWmJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Clpyc6ICcxJyxcbiAgICAgICAgICAgICfgpagnOiAnMicsXG4gICAgICAgICAgICAn4KWpJzogJzMnLFxuICAgICAgICAgICAgJ+Clqic6ICc0JyxcbiAgICAgICAgICAgICfgpasnOiAnNScsXG4gICAgICAgICAgICAn4KWsJzogJzYnLFxuICAgICAgICAgICAgJ+ClrSc6ICc3JyxcbiAgICAgICAgICAgICfgpa4nOiAnOCcsXG4gICAgICAgICAgICAn4KWvJzogJzknLFxuICAgICAgICAgICAgJ+Clpic6ICcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzUGFyc2UgPSBbXG4gICAgICAgICAgICAvXuCknOCkqC9pLFxuICAgICAgICAgICAgL17gpKvgpLzgpLB84KSr4KSwL2ksXG4gICAgICAgICAgICAvXuCkruCkvuCksOCljeCkmi9pLFxuICAgICAgICAgICAgL17gpIXgpKrgpY3gpLDgpYgvaSxcbiAgICAgICAgICAgIC9e4KSu4KSIL2ksXG4gICAgICAgICAgICAvXuCknOClguCkqC9pLFxuICAgICAgICAgICAgL17gpJzgpYHgpLIvaSxcbiAgICAgICAgICAgIC9e4KSF4KSXL2ksXG4gICAgICAgICAgICAvXuCkuOCkv+CkpOCkgnzgpLjgpL/gpKQvaSxcbiAgICAgICAgICAgIC9e4KSF4KSV4KWN4KSf4KWCL2ksXG4gICAgICAgICAgICAvXuCkqOCktXzgpKjgpLXgpIIvaSxcbiAgICAgICAgICAgIC9e4KSm4KS/4KS44KSCfOCkpuCkv+CkuC9pLFxuICAgICAgICBdLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL17gpJzgpKgvaSxcbiAgICAgICAgICAgIC9e4KSr4KS84KSwL2ksXG4gICAgICAgICAgICAvXuCkruCkvuCksOCljeCkmi9pLFxuICAgICAgICAgICAgL17gpIXgpKrgpY3gpLDgpYgvaSxcbiAgICAgICAgICAgIC9e4KSu4KSIL2ksXG4gICAgICAgICAgICAvXuCknOClguCkqC9pLFxuICAgICAgICAgICAgL17gpJzgpYHgpLIvaSxcbiAgICAgICAgICAgIC9e4KSF4KSXL2ksXG4gICAgICAgICAgICAvXuCkuOCkv+CkpC9pLFxuICAgICAgICAgICAgL17gpIXgpJXgpY3gpJ/gpYIvaSxcbiAgICAgICAgICAgIC9e4KSo4KS1L2ksXG4gICAgICAgICAgICAvXuCkpuCkv+CkuC9pLFxuICAgICAgICBdO1xuXG4gICAgdmFyIGhpID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaGknLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAn4KSc4KSo4KS14KSw4KWAX+Ckq+CkvOCksOCkteCksOClgF/gpK7gpL7gpLDgpY3gpJpf4KSF4KSq4KWN4KSw4KWI4KSyX+CkruCkiF/gpJzgpYLgpKhf4KSc4KWB4KSy4KS+4KSIX+CkheCkl+CkuOCljeCkpF/gpLjgpL/gpKTgpK7gpY3gpKzgpLBf4KSF4KSV4KWN4KSf4KWC4KSs4KSwX+CkqOCkteCkruCljeCkrOCksF/gpKbgpL/gpLjgpK7gpY3gpKzgpLAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ+CknOCkqOCkteCksOClgF/gpKvgpLDgpLXgpLDgpYBf4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCliOCksl/gpK7gpIhf4KSc4KWC4KSoX+CknOClgeCksuCkvuCkiF/gpIXgpJfgpLjgpY3gpKRf4KS44KS/4KSk4KSC4KSs4KSwX+CkheCkleCljeCkn+ClguCkrOCksF/gpKjgpLXgpILgpKzgpLBf4KSm4KS/4KS44KSC4KSs4KSwJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4KSc4KSoLl/gpKvgpLzgpLAuX+CkruCkvuCksOCljeCkml/gpIXgpKrgpY3gpLDgpYguX+CkruCkiF/gpJzgpYLgpKhf4KSc4KWB4KSyLl/gpIXgpJcuX+CkuOCkv+CkpC5f4KSF4KSV4KWN4KSf4KWCLl/gpKjgpLUuX+CkpuCkv+CkuC4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAn4KSw4KS14KS/4KS14KS+4KSwX+CkuOCli+CkruCkteCkvuCksF/gpK7gpILgpJfgpLLgpLXgpL7gpLBf4KSs4KWB4KSn4KS14KS+4KSwX+Ckl+ClgeCksOClguCkteCkvuCksF/gpLbgpYHgpJXgpY3gpLDgpLXgpL7gpLBf4KS24KSo4KS/4KS14KS+4KSwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4KSw4KS14KS/X+CkuOCli+Ckrl/gpK7gpILgpJfgpLJf4KSs4KWB4KSnX+Ckl+ClgeCksOClgl/gpLbgpYHgpJXgpY3gpLBf4KS24KSo4KS/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CksF/gpLjgpYtf4KSu4KSCX+CkrOClgV/gpJfgpYFf4KS24KWBX+Ckticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIOCkrOCknOClhycsXG4gICAgICAgICAgICBMVFM6ICdBIGg6bW06c3Mg4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgfSxcblxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IHNob3J0TW9udGhzUGFyc2UsXG5cbiAgICAgICAgbW9udGhzUmVnZXg6XG4gICAgICAgICAgICAvXijgpJzgpKjgpLXgpLDgpYB84KSc4KSoXFwuP3zgpKvgpLzgpLDgpLXgpLDgpYB84KSr4KSw4KS14KSw4KWAfOCkq+CkvOCksFxcLj984KSu4KS+4KSw4KWN4KSaP3zgpIXgpKrgpY3gpLDgpYjgpLJ84KSF4KSq4KWN4KSw4KWIXFwuP3zgpK7gpIg/fOCknOClguCkqD984KSc4KWB4KSy4KS+4KSIfOCknOClgeCkslxcLj984KSF4KSX4KS44KWN4KSkfOCkheCkl1xcLj984KS44KS/4KSk4KSu4KWN4KSs4KSwfOCkuOCkv+CkpOCkguCkrOCksHzgpLjgpL/gpKRcXC4/fOCkheCkleCljeCkn+ClguCkrOCksHzgpIXgpJXgpY3gpJ/gpYJcXC4/fOCkqOCkteCkruCljeCkrOCksHzgpKjgpLXgpILgpKzgpLB84KSo4KS1XFwuP3zgpKbgpL/gpLjgpK7gpY3gpKzgpLB84KSm4KS/4KS44KSC4KSs4KSwfOCkpuCkv+CkuFxcLj8pL2ksXG5cbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDpcbiAgICAgICAgICAgIC9eKOCknOCkqOCkteCksOClgHzgpJzgpKhcXC4/fOCkq+CkvOCksOCkteCksOClgHzgpKvgpLDgpLXgpLDgpYB84KSr4KS84KSwXFwuP3zgpK7gpL7gpLDgpY3gpJo/fOCkheCkquCljeCksOCliOCksnzgpIXgpKrgpY3gpLDgpYhcXC4/fOCkruCkiD984KSc4KWC4KSoP3zgpJzgpYHgpLLgpL7gpIh84KSc4KWB4KSyXFwuP3zgpIXgpJfgpLjgpY3gpKR84KSF4KSXXFwuP3zgpLjgpL/gpKTgpK7gpY3gpKzgpLB84KS44KS/4KSk4KSC4KSs4KSwfOCkuOCkv+CkpFxcLj984KSF4KSV4KWN4KSf4KWC4KSs4KSwfOCkheCkleCljeCkn+ClglxcLj984KSo4KS14KSu4KWN4KSs4KSwfOCkqOCkteCkguCkrOCksHzgpKjgpLVcXC4/fOCkpuCkv+CkuOCkruCljeCkrOCksHzgpKbgpL/gpLjgpILgpKzgpLB84KSm4KS/4KS4XFwuPykvaSxcblxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKOCknOCkqOCkteCksOClgD984KSr4KS84KSw4KS14KSw4KWAfOCkq+CksOCkteCksOClgD984KSu4KS+4KSw4KWN4KSaP3zgpIXgpKrgpY3gpLDgpYjgpLI/fOCkruCkiD984KSc4KWC4KSoP3zgpJzgpYHgpLLgpL7gpIg/fOCkheCkl+CkuOCljeCkpD984KS44KS/4KSk4KSu4KWN4KSs4KSwfOCkuOCkv+CkpOCkguCkrOCksHzgpLjgpL/gpKQ/XFwuP3zgpIXgpJXgpY3gpJ/gpYLgpKzgpLB84KSF4KSV4KWN4KSf4KWCXFwuP3zgpKjgpLXgpK7gpY3gpKzgpLB84KSo4KS14KSC4KSs4KSwP3zgpKbgpL/gpLjgpK7gpY3gpKzgpLB84KSm4KS/4KS44KSC4KSs4KSwPykvaSxcblxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14o4KSc4KSoXFwuP3zgpKvgpLzgpLBcXC4/fOCkruCkvuCksOCljeCkmj984KSF4KSq4KWN4KSw4KWIXFwuP3zgpK7gpIg/fOCknOClguCkqD984KSc4KWB4KSyXFwuP3zgpIXgpJdcXC4/fOCkuOCkv+CkpFxcLj984KSF4KSV4KWN4KSf4KWCXFwuP3zgpKjgpLVcXC4/fOCkpuCkv+CkuFxcLj8pL2ksXG5cbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KSG4KScXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CkleCksl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkLCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+CkleCksl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4KSq4KS/4KSb4KSy4KWHXSBkZGRkLCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIOCkruClh+CkgicsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4KSq4KS54KSy4KWHJyxcbiAgICAgICAgICAgIHM6ICfgpJXgpYHgpJsg4KS54KWAIOCkleCljeCkt+CkoycsXG4gICAgICAgICAgICBzczogJyVkIOCkuOClh+CkleCkguCkoScsXG4gICAgICAgICAgICBtOiAn4KSP4KSVIOCkruCkv+CkqOCknycsXG4gICAgICAgICAgICBtbTogJyVkIOCkruCkv+CkqOCknycsXG4gICAgICAgICAgICBoOiAn4KSP4KSVIOCkmOCkguCkn+CkvicsXG4gICAgICAgICAgICBoaDogJyVkIOCkmOCkguCkn+ClhycsXG4gICAgICAgICAgICBkOiAn4KSP4KSVIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCkpuCkv+CkqCcsXG4gICAgICAgICAgICBNOiAn4KSP4KSVIOCkruCkueClgOCkqOClhycsXG4gICAgICAgICAgICBNTTogJyVkIOCkruCkueClgOCkqOClhycsXG4gICAgICAgICAgICB5OiAn4KSP4KSVIOCkteCksOCljeCktycsXG4gICAgICAgICAgICB5eTogJyVkIOCkteCksOCljeCktycsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgpafgpajgpangpargpavgpazgpa3gpa7gpa/gpaZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIEhpbmRpIG5vdGF0aW9uIGZvciBtZXJpZGllbXMgYXJlIHF1aXRlIGZ1enp5IGluIHByYWN0aWNlLiBXaGlsZSB0aGVyZSBleGlzdHNcbiAgICAgICAgLy8gYSByaWdpZCBub3Rpb24gb2YgYSAnUGFoYXInIGl0IGlzIG5vdCB1c2VkIGFzIHJpZ2lkbHkgaW4gbW9kZXJuIEhpbmRpLlxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4KSw4KS+4KSkfOCkuOClgeCkrOCkuXzgpKbgpYvgpKrgpLngpLB84KS24KS+4KSuLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4KSw4KS+4KSkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KS44KWB4KSs4KS5Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkpuCli+CkquCkueCksCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KS24KS+4KSuJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KWB4KSs4KS5JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKbgpYvgpKrgpLngpLAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CktuCkvuCkric7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhpO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENyb2F0aWFuIFtocl1cbi8vISBhdXRob3IgOiBCb2phbiBNYXJrb3ZpxIcgOiBodHRwczovL2dpdGh1Yi5jb20vYm1hcmtvdmljXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3Nla3VuZGUnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2VrdW5kaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdqZWRuYSBtaW51dGEnIDogJ2plZG5lIG1pbnV0ZSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0YSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ21pbnV0ZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtaW51dGEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnamVkYW4gc2F0JyA6ICdqZWRub2cgc2F0YSc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIgfHwgbnVtYmVyID09PSAzIHx8IG51bWJlciA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ3NhdGEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnc2F0aSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2Rhbic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdkYW5hJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnbWplc2VjYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdtamVzZWNpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMiB8fCBudW1iZXIgPT09IDMgfHwgbnVtYmVyID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnZ29kaW5lJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ2dvZGluYSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaHIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdocicsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdzaWplxI1uamFfdmVsamHEjWVfb8W+dWprYV90cmF2bmphX3N2aWJuamFfbGlwbmphX3NycG5qYV9rb2xvdm96YV9ydWpuYV9saXN0b3BhZGFfc3R1ZGVub2dhX3Byb3NpbmNhJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICdzaWplxI1hbmpfdmVsamHEjWFfb8W+dWpha190cmF2YW5qX3N2aWJhbmpfbGlwYW5qX3NycGFual9rb2xvdm96X3J1amFuX2xpc3RvcGFkX3N0dWRlbmlfcHJvc2luYWMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdzaWouX3ZlbGouX2/FvnUuX3RyYS5fc3ZpLl9saXAuX3NycC5fa29sLl9ydWouX2xpcy5fc3R1Ll9wcm8uJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkamVsamFfcG9uZWRqZWxqYWtfdXRvcmFrX3NyaWplZGFfxI1ldHZydGFrX3BldGFrX3N1Ym90YScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lZC5fcG9uLl91dG8uX3NyaS5fxI1ldC5fcGV0Ll9zdWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3V0X3NyX8SNZV9wZV9zdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEbyBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRG8gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIERvIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbZGFuYXMgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tzdXRyYSB1XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbbmVkamVsanVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzcmlqZWR1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3Vib3R1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBkZGRkIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbanXEjWVyIHVdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbHVdIFtuZWRqZWxqdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJvxaFsdV0gW3NyaWplZHVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbGVdIFtzdWJvdGVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Byb8WhbGldIGRkZGQgW3VdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJpamUgJXMnLFxuICAgICAgICAgICAgczogJ3BhciBzZWt1bmRpJyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGQ6ICdkYW4nLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06ICdtamVzZWMnLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6ICdnb2RpbnUnLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBocjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBIdW5nYXJpYW4gW2h1XVxuLy8hIGF1dGhvciA6IEFkYW0gQnJ1bm5lciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hZGFtYnJ1bm5lclxuLy8hIGF1dGhvciA6IFBldGVyIFZpc3p0ICA6IGh0dHBzOi8vZ2l0aHViLmNvbS9wYXNzYXRndFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHdlZWtFbmRpbmdzID1cbiAgICAgICAgJ3Zhc8Ohcm5hcCBow6l0ZsWRbiBrZWRkZW4gc3plcmTDoW4gY3PDvHTDtnJ0w7Zrw7ZuIHDDqW50ZWtlbiBzem9tYmF0b24nLnNwbGl0KCcgJyk7XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgbnVtID0gbnVtYmVyO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlIHx8IHdpdGhvdXRTdWZmaXhcbiAgICAgICAgICAgICAgICAgICAgPyAnbsOpaMOhbnkgbcOhc29kcGVyYydcbiAgICAgICAgICAgICAgICAgICAgOiAnbsOpaMOhbnkgbcOhc29kcGVyY2UnO1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeClcbiAgICAgICAgICAgICAgICAgICAgPyAnIG3DoXNvZHBlcmMnXG4gICAgICAgICAgICAgICAgICAgIDogJyBtw6Fzb2RwZXJjZSc7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VneScgKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgcGVyYycgOiAnIHBlcmNlJyk7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBwZXJjJyA6ICcgcGVyY2UnKTtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyDDs3JhJyA6ICcgw7Nyw6FqYScpO1xuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgw7NyYScgOiAnIMOzcsOhamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBuYXAnIDogJyBuYXBqYScpO1xuICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgbmFwJyA6ICcgbmFwamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyBow7NuYXAnIDogJyBow7NuYXBqYScpO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKyAoaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/ICcgaMOzbmFwJyA6ICcgaMOzbmFwamEnKTtcbiAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZWd5JyArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyDDqXYnIDogJyDDqXZlJyk7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bSArIChpc0Z1dHVyZSB8fCB3aXRob3V0U3VmZml4ID8gJyDDqXYnIDogJyDDqXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3ZWVrKGlzRnV0dXJlKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoaXNGdXR1cmUgPyAnJyA6ICdbbcO6bHRdICcpICtcbiAgICAgICAgICAgICdbJyArXG4gICAgICAgICAgICB3ZWVrRW5kaW5nc1t0aGlzLmRheSgpXSArXG4gICAgICAgICAgICAnXSBMVFsta29yXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgaHUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdodScsIHtcbiAgICAgICAgbW9udGhzOiAnamFudcOhcl9mZWJydcOhcl9tw6FyY2l1c1/DoXByaWxpc19tw6FqdXNfasO6bml1c19qw7psaXVzX2F1Z3VzenR1c19zemVwdGVtYmVyX29rdMOzYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbcOhcmMuX8OhcHIuX23DoWouX2rDum4uX2rDumwuX2F1Zy5fc3plcHQuX29rdC5fbm92Ll9kZWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAndmFzw6FybmFwX2jDqXRmxZFfa2VkZF9zemVyZGFfY3PDvHTDtnJ0w7ZrX3DDqW50ZWtfc3pvbWJhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3Zhc19ow6l0X2tlZGRfc3plX2Nzw7x0X3DDqW5fc3pvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3ZfaF9rX3N6ZV9jc19wX3N6bycuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLk1NLkRELicsXG4gICAgICAgICAgICBMTDogJ1lZWVkuIE1NTU0gRC4nLFxuICAgICAgICAgICAgTExMOiAnWVlZWS4gTU1NTSBELiBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZLiBNTU1NIEQuLCBkZGRkIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvZGV8ZHUvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQuY2hhckF0KDEpLnRvTG93ZXJDYXNlKCkgPT09ICd1JztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA9PT0gdHJ1ZSA/ICdkZScgOiAnREUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA9PT0gdHJ1ZSA/ICdkdScgOiAnRFUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1ttYV0gTFRbLWtvcl0nLFxuICAgICAgICAgICAgbmV4dERheTogJ1tob2xuYXBdIExUWy1rb3JdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdlZWsuY2FsbCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW3RlZ25hcF0gTFRbLWtvcl0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2Vlay5jYWxsKHRoaXMsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIG3Dumx2YScsXG4gICAgICAgICAgICBwYXN0OiAnJXMnLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGh1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEFybWVuaWFuIFtoeS1hbV1cbi8vISBhdXRob3IgOiBBcm1lbmRhcmFieWFuIDogaHR0cHM6Ly9naXRodWIuY29tL2FybWVuZGFyYWJ5YW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBoeUFtID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaHktYW0nLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAn1bDVuNaC1bbVvtWh1oDVq1/Wg9Wl1b/WgNW+1aHWgNWrX9W01aHWgNW/1atf1aHVutaA1avVrNWrX9W01aHVtdWr1b3Vq1/VsNW41oLVttWr1b3Vq1/VsNW41oLVrNWr1b3Vq1/WhdWj1bjVvdW/1bjVvdWrX9W91aXVutW/1aXVtNWi1aXWgNWrX9Ww1bjVr9W/1aXVtNWi1aXWgNWrX9W21bjVtdWl1bTVotWl1oDVq1/VpNWl1a/Vv9Wl1bTVotWl1oDVqycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn1bDVuNaC1bbVvtWh1oBf1oPVpdW/1oDVvtWh1oBf1bTVodaA1b9f1aHVutaA1avVrF/VtNWh1bXVq9W9X9Ww1bjWgtW21avVvV/VsNW41oLVrNWr1b1f1oXVo9W41b3Vv9W41b1f1b3VpdW61b/VpdW01aLVpdaAX9Ww1bjVr9W/1aXVtNWi1aXWgF/VttW41bXVpdW01aLVpdaAX9Wk1aXVr9W/1aXVtNWi1aXWgCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn1bDVttW+X9aD1b/WgF/VtNaA1b9f1aHVutaAX9W01bXVvV/VsNW21b1f1bDVrNW9X9aF1aPVvV/VvdW61b9f1bDVr9W/X9W21bTVol/VpNWv1b8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ9Wv1avWgNWh1a/Vq1/VpdaA1a/VuNaC1bfVodWi1anVq1/VpdaA1aXWhNW31aHVotWp1atf1bnVuNaA1aXWhNW31aHVotWp1atf1bDVq9W21aPVt9Wh1aLVqdWrX9W41oLWgNWi1aHVqV/Vt9Wh1aLVodWpJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfVr9aA1a9f1aXWgNWvX9Wl1oDWhF/VudaA1oRf1bDVttWjX9W41oLWgNWiX9W31aLVqScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfVr9aA1a9f1aXWgNWvX9Wl1oDWhF/VudaA1oRf1bDVttWjX9W41oLWgNWiX9W31aLVqScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWSDVqS4nLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkg1akuLCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkg1akuLCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9Wh1bXVvdaF1oBdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb1b7VodWy1ahdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb1aXWgNWl1a9dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkZGRkIFvWhdaA1agg1arVodW01ahdIExUJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnW9Wh1bbWgdWh1a5dIGRkZGQgW9aF1oDVqCDVqtWh1bTVqF0gTFQnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg1bDVpdW/1bgnLFxuICAgICAgICAgICAgcGFzdDogJyVzINWh1bzVodW7JyxcbiAgICAgICAgICAgIHM6ICfVtNWrINaE1aHVttWrINW+1aHVtdaA1a/VtdWh1bYnLFxuICAgICAgICAgICAgc3M6ICclZCDVvtWh1bXWgNWv1bXVodW2JyxcbiAgICAgICAgICAgIG06ICfWgNW41brVpScsXG4gICAgICAgICAgICBtbTogJyVkINaA1bjVutWlJyxcbiAgICAgICAgICAgIGg6ICfVqtWh1bQnLFxuICAgICAgICAgICAgaGg6ICclZCDVqtWh1bQnLFxuICAgICAgICAgICAgZDogJ9aF1oAnLFxuICAgICAgICAgICAgZGQ6ICclZCDWhdaAJyxcbiAgICAgICAgICAgIE06ICfVodW01avVvScsXG4gICAgICAgICAgICBNTTogJyVkINWh1bTVq9W9JyxcbiAgICAgICAgICAgIHk6ICfVv9Wh1oDVqycsXG4gICAgICAgICAgICB5eTogJyVkINW/1aHWgNWrJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9Wj1avVt9Wl1oDVvtWhfNWh1bzVodW+1bjVv9W+1aF81oHVpdaA1aXVr9W+1aF81aXWgNWl1a/VuNW11aHVti8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIC9eKNaB1aXWgNWl1a/VvtWhfNWl1oDVpdWv1bjVtdWh1bYpJC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfVo9Wr1bfVpdaA1b7VoSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1aHVvNWh1b7VuNW/1b7VoSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn1oHVpdaA1aXVr9W+1aEnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Wl1oDVpdWv1bjVtdWh1bYnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn18XFxkezEsMn0tKNWr1bZ81oDVpCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICBjYXNlICdERERvJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct1avVtic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct1oDVpCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGh5QW07XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogSW5kb25lc2lhbiBbaWRdXG4vLyEgYXV0aG9yIDogTW9oYW1tYWQgU2F0cmlvIFV0b21vIDogaHR0cHM6Ly9naXRodWIuY29tL3R5b2tcbi8vISByZWZlcmVuY2U6IGh0dHA6Ly9pZC53aWtpc291cmNlLm9yZy93aWtpL1BlZG9tYW5fVW11bV9FamFhbl9CYWhhc2FfSW5kb25lc2lhX3lhbmdfRGlzZW1wdXJuYWthblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGlkID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaWQnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcmlfRmVicnVhcmlfTWFyZXRfQXByaWxfTWVpX0p1bmlfSnVsaV9BZ3VzdHVzX1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFyX0Fwcl9NZWlfSnVuX0p1bF9BZ3RfU2VwX09rdF9Ob3ZfRGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ01pbmdndV9TZW5pbl9TZWxhc2FfUmFidV9LYW1pc19KdW1hdF9TYWJ0dScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ01pbl9TZW5fU2VsX1JhYl9LYW1fSnVtX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdNZ19Tbl9TbF9SYl9LbV9KbV9TYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEgubW0nLFxuICAgICAgICAgICAgTFRTOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL3BhZ2l8c2lhbmd8c29yZXxtYWxhbS8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ3BhZ2knKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAnc2lhbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NvcmUnIHx8IG1lcmlkaWVtID09PSAnbWFsYW0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BhZ2knO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzaWFuZyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NvcmUnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21hbGFtJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGFyaSBpbmkgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQmVzb2sgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS2VtYXJpbiBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtsYWx1IHB1a3VsXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RhbGFtICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyB5YW5nIGxhbHUnLFxuICAgICAgICAgICAgczogJ2JlYmVyYXBhIGRldGlrJyxcbiAgICAgICAgICAgIHNzOiAnJWQgZGV0aWsnLFxuICAgICAgICAgICAgbTogJ3NlbWVuaXQnLFxuICAgICAgICAgICAgbW06ICclZCBtZW5pdCcsXG4gICAgICAgICAgICBoOiAnc2VqYW0nLFxuICAgICAgICAgICAgaGg6ICclZCBqYW0nLFxuICAgICAgICAgICAgZDogJ3NlaGFyaScsXG4gICAgICAgICAgICBkZDogJyVkIGhhcmknLFxuICAgICAgICAgICAgTTogJ3NlYnVsYW4nLFxuICAgICAgICAgICAgTU06ICclZCBidWxhbicsXG4gICAgICAgICAgICB5OiAnc2V0YWh1bicsXG4gICAgICAgICAgICB5eTogJyVkIHRhaHVuJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlkO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEljZWxhbmRpYyBbaXNdXG4vLyEgYXV0aG9yIDogSGlucmlrIMOWcm4gU2lndXLDsHNzb24gOiBodHRwczovL2dpdGh1Yi5jb20vaGlucmlrXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwbHVyYWwobikge1xuICAgICAgICBpZiAobiAlIDEwMCA9PT0gMTEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKG4gJSAxMCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZVxuICAgICAgICAgICAgICAgICAgICA/ICdub2trcmFyIHNla8O6bmR1cidcbiAgICAgICAgICAgICAgICAgICAgOiAnbm9ra3J1bSBzZWvDum5kdW0nO1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIGlmIChwbHVyYWwobnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ3Nla8O6bmR1cicgOiAnc2Vrw7puZHVtJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdzZWvDum5kYSc7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdtw61uw7p0YScgOiAnbcOtbsO6dHUnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgIGlmIChwbHVyYWwobnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICsgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbcOtbsO6dHVyJyA6ICdtw61uw7p0dW0nKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ23DrW7DunRhJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtw61uw7p0dSc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdrbHVra3VzdHVuZGlyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2tsdWtrdXN0dW5kdW0nKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2tsdWtrdXN0dW5kJztcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZGFndXInO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAnZGFnJyA6ICdkZWdpJztcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICBpZiAocGx1cmFsKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnZGFnYXInO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoaXNGdXR1cmUgPyAnZGFnYScgOiAnZMO2Z3VtJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnZGFndXInO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKGlzRnV0dXJlID8gJ2RhZycgOiAnZGVnaScpO1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdtw6FudcOwdXInO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgPyAnbcOhbnXDsCcgOiAnbcOhbnXDsGknO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIGlmIChwbHVyYWwobnVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtw6FudcOwaXInO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoaXNGdXR1cmUgPyAnbcOhbnXDsGknIDogJ23DoW51w7B1bScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ23DoW51w7B1cic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoaXNGdXR1cmUgPyAnbcOhbnXDsCcgOiAnbcOhbnXDsGknKTtcbiAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ8OhcicgOiAnw6FyaSc7XG4gICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgaWYgKHBsdXJhbChudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICfDoXInIDogJ8OhcnVtJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICfDoXInIDogJ8OhcmknKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpcyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2lzJywge1xuICAgICAgICBtb250aHM6ICdqYW7DumFyX2ZlYnLDumFyX21hcnNfYXByw61sX21hw61fasO6bsOtX2rDumzDrV/DoWfDunN0X3NlcHRlbWJlcl9va3TDs2Jlcl9uw7N2ZW1iZXJfZGVzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnamFuX2ZlYl9tYXJfYXByX21hw61fasO6bl9qw7psX8OhZ8O6X3NlcF9va3RfbsOzdl9kZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3N1bm51ZGFndXJfbcOhbnVkYWd1cl/DvnJpw7BqdWRhZ3VyX21pw7B2aWt1ZGFndXJfZmltbXR1ZGFndXJfZsO2c3R1ZGFndXJfbGF1Z2FyZGFndXInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3N1bl9tw6FuX8O+cmlfbWnDsF9maW1fZsO2c19sYXUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU3VfTcOhX8Oecl9NaV9GaV9Gw7ZfTGEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgW2tsLl0gSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIFtrbC5dIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vDrSBkYWcga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW8OhIG1vcmd1biBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBba2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW8OtIGfDpnIga2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tzw63DsGFzdGFdIGRkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdlZnRpciAlcycsXG4gICAgICAgICAgICBwYXN0OiAnZnlyaXIgJXMgc8Otw7BhbicsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6ICdrbHVra3VzdHVuZCcsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlzO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEl0YWxpYW4gKFN3aXR6ZXJsYW5kKSBbaXQtY2hdXG4vLyEgYXV0aG9yIDogeGZoIDogaHR0cHM6Ly9naXRodWIuY29tL3hmaFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGl0Q2ggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdpdC1jaCcsIHtcbiAgICAgICAgbW9udGhzOiAnZ2VubmFpb19mZWJicmFpb19tYXJ6b19hcHJpbGVfbWFnZ2lvX2dpdWdub19sdWdsaW9fYWdvc3RvX3NldHRlbWJyZV9vdHRvYnJlX25vdmVtYnJlX2RpY2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2dlbl9mZWJfbWFyX2Fwcl9tYWdfZ2l1X2x1Z19hZ29fc2V0X290dF9ub3ZfZGljJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ2RvbWVuaWNhX2x1bmVkw6xfbWFydGVkw6xfbWVyY29sZWTDrF9naW92ZWTDrF92ZW5lcmTDrF9zYWJhdG8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb21fbHVuX21hcl9tZXJfZ2lvX3Zlbl9zYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnZG9fbHVfbWFfbWVfZ2lfdmVfc2EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tPZ2dpIGFsbGVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRG9tYW5pIGFsbGVdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYWxsZV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJZXJpIGFsbGVdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW2xhIHNjb3JzYV0gZGRkZCBbYWxsZV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbG8gc2NvcnNvXSBkZGRkIFthbGxlXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoL15bMC05XS4rJC8udGVzdChzKSA/ICd0cmEnIDogJ2luJykgKyAnICcgKyBzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBmYScsXG4gICAgICAgICAgICBzOiAnYWxjdW5pIHNlY29uZGknLFxuICAgICAgICAgICAgc3M6ICclZCBzZWNvbmRpJyxcbiAgICAgICAgICAgIG06ICd1biBtaW51dG8nLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGknLFxuICAgICAgICAgICAgaDogXCJ1bidvcmFcIixcbiAgICAgICAgICAgIGhoOiAnJWQgb3JlJyxcbiAgICAgICAgICAgIGQ6ICd1biBnaW9ybm8nLFxuICAgICAgICAgICAgZGQ6ICclZCBnaW9ybmknLFxuICAgICAgICAgICAgTTogJ3VuIG1lc2UnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNpJyxcbiAgICAgICAgICAgIHk6ICd1biBhbm5vJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5uaScsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXRDaDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBJdGFsaWFuIFtpdF1cbi8vISBhdXRob3IgOiBMb3JlbnpvIDogaHR0cHM6Ly9naXRodWIuY29tL2FsaWVtXG4vLyEgYXV0aG9yOiBNYXR0aWEgTGFyZW50aXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub3N0YWxnaWF6XG4vLyEgYXV0aG9yOiBNYXJjbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9NYW5mcmU5OFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGl0ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnaXQnLCB7XG4gICAgICAgIG1vbnRoczogJ2dlbm5haW9fZmViYnJhaW9fbWFyem9fYXByaWxlX21hZ2dpb19naXVnbm9fbHVnbGlvX2Fnb3N0b19zZXR0ZW1icmVfb3R0b2JyZV9ub3ZlbWJyZV9kaWNlbWJyZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdnZW5fZmViX21hcl9hcHJfbWFnX2dpdV9sdWdfYWdvX3NldF9vdHRfbm92X2RpYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdkb21lbmljYV9sdW5lZMOsX21hcnRlZMOsX21lcmNvbGVkw6xfZ2lvdmVkw6xfdmVuZXJkw6xfc2FiYXRvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZG9tX2x1bl9tYXJfbWVyX2dpb192ZW5fc2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvX2x1X21hX21lX2dpX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW09nZ2kgYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpID4gMSA/ICdsbGUgJyA6IHRoaXMuaG91cnMoKSA9PT0gMCA/ICcgJyA6IFwibGwnXCIpICtcbiAgICAgICAgICAgICAgICAgICAgJ11MVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHREYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW0RvbWFuaSBhJyArXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmhvdXJzKCkgPiAxID8gJ2xsZSAnIDogdGhpcy5ob3VycygpID09PSAwID8gJyAnIDogXCJsbCdcIikgK1xuICAgICAgICAgICAgICAgICAgICAnXUxUJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnZGRkZCBbYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpID4gMSA/ICdsbGUgJyA6IHRoaXMuaG91cnMoKSA9PT0gMCA/ICcgJyA6IFwibGwnXCIpICtcbiAgICAgICAgICAgICAgICAgICAgJ11MVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAnW0llcmkgYScgK1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpID4gMSA/ICdsbGUgJyA6IHRoaXMuaG91cnMoKSA9PT0gMCA/ICcgJyA6IFwibGwnXCIpICtcbiAgICAgICAgICAgICAgICAgICAgJ11MVCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1tMYSBzY29yc2FdIGRkZGQgW2EnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5ob3VycygpID4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdsbGUgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuaG91cnMoKSA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJyAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImxsJ1wiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ11MVCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbTG8gc2NvcnNvXSBkZGRkIFthJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuaG91cnMoKSA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbGxlICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmhvdXJzKCkgPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJsbCdcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICddTFQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ3RyYSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgZmEnLFxuICAgICAgICAgICAgczogJ2FsY3VuaSBzZWNvbmRpJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kaScsXG4gICAgICAgICAgICBtOiAndW4gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRpJyxcbiAgICAgICAgICAgIGg6IFwidW4nb3JhXCIsXG4gICAgICAgICAgICBoaDogJyVkIG9yZScsXG4gICAgICAgICAgICBkOiAndW4gZ2lvcm5vJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZ2lvcm5pJyxcbiAgICAgICAgICAgIHc6ICd1bmEgc2V0dGltYW5hJyxcbiAgICAgICAgICAgIHd3OiAnJWQgc2V0dGltYW5lJyxcbiAgICAgICAgICAgIE06ICd1biBtZXNlJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWVzaScsXG4gICAgICAgICAgICB5OiAndW4gYW5ubycsXG4gICAgICAgICAgICB5eTogJyVkIGFubmknLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEphcGFuZXNlIFtqYV1cbi8vISBhdXRob3IgOiBMSSBMb25nIDogaHR0cHM6Ly9naXRodWIuY29tL2JhcnlvblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGphID0gbW9tZW50LmRlZmluZUxvY2FsZSgnamEnLCB7XG4gICAgICAgIGVyYXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzIwMTktMDUtMDEnLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn5Luk5ZKMJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICfji78nLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdSJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcxOTg5LTAxLTA4JyxcbiAgICAgICAgICAgICAgICB1bnRpbDogJzIwMTktMDQtMzAnLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn5bmz5oiQJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICfjjbsnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdIJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcxOTI2LTEyLTI1JyxcbiAgICAgICAgICAgICAgICB1bnRpbDogJzE5ODktMDEtMDcnLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn5pit5ZKMJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICfjjbwnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdTJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcxOTEyLTA3LTMwJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogJzE5MjYtMTItMjQnLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn5aSn5q2jJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICfjjb0nLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdUJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcxODczLTAxLTAxJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogJzE5MTItMDctMjknLFxuICAgICAgICAgICAgICAgIG9mZnNldDogNixcbiAgICAgICAgICAgICAgICBuYW1lOiAn5piO5rK7JyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICfjjb4nLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdNJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcwMDAxLTAxLTAxJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogJzE4NzMtMTItMzEnLFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn6KW/5pqmJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICdBRCcsXG4gICAgICAgICAgICAgICAgYWJicjogJ0FEJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcwMDAwLTEyLTMxJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogLUluZmluaXR5LFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAn57SA5YWD5YmNJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICdCQycsXG4gICAgICAgICAgICAgICAgYWJicjogJ0JDJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGVyYVllYXJPcmRpbmFsUmVnZXg6IC8o5YWDfFxcZCsp5bm0LyxcbiAgICAgICAgZXJhWWVhck9yZGluYWxQYXJzZTogZnVuY3Rpb24gKGlucHV0LCBtYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdID09PSAn5YWDJyA/IDEgOiBwYXJzZUludChtYXRjaFsxXSB8fCBpbnB1dCwgMTApO1xuICAgICAgICB9LFxuICAgICAgICBtb250aHM6ICcx5pyIXzLmnIhfM+aciF805pyIXzXmnIhfNuaciF835pyIXzjmnIhfOeaciF8xMOaciF8xMeaciF8xMuaciCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICcx5pyIXzLmnIhfM+aciF805pyIXzXmnIhfNuaciF835pyIXzjmnIhfOeaciF8xMOaciF8xMeaciF8xMuaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfml6Xmm5zml6Vf5pyI5puc5pelX+eBq+abnOaXpV/msLTmm5zml6Vf5pyo5puc5pelX+mHkeabnOaXpV/lnJ/mm5zml6UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfml6Vf5pyIX+eBq1/msLRf5pyoX+mHkV/lnJ8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn5pelX+aciF/ngatf5rC0X+acqF/ph5Ff5ZyfJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVnlubRN5pyIROaXpSBkZGRkIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnWVlZWeW5tE3mnIhE5pelKGRkZCkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv5Y2I5YmNfOWNiOW+jC9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ+WNiOW+jCc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfljYjliY0nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+WNiOW+jCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuaXpV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vmmI7ml6VdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdy53ZWVrKCkgIT09IHRoaXMud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+adpemAsV1kZGRkIExUJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RkZGQgTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+aYqOaXpV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53ZWVrKCkgIT09IG5vdy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5YWI6YCxXWRkZGQgTFQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZGRkZCBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfeaXpS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciA9PT0gMSA/ICflhYPlubQnIDogbnVtYmVyICsgJ+W5tCc7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfml6UnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPlvownLFxuICAgICAgICAgICAgcGFzdDogJyVz5YmNJyxcbiAgICAgICAgICAgIHM6ICfmlbDnp5InLFxuICAgICAgICAgICAgc3M6ICclZOenkicsXG4gICAgICAgICAgICBtOiAnMeWIhicsXG4gICAgICAgICAgICBtbTogJyVk5YiGJyxcbiAgICAgICAgICAgIGg6ICcx5pmC6ZaTJyxcbiAgICAgICAgICAgIGhoOiAnJWTmmYLplpMnLFxuICAgICAgICAgICAgZDogJzHml6UnLFxuICAgICAgICAgICAgZGQ6ICclZOaXpScsXG4gICAgICAgICAgICBNOiAnMeODtuaciCcsXG4gICAgICAgICAgICBNTTogJyVk44O25pyIJyxcbiAgICAgICAgICAgIHk6ICcx5bm0JyxcbiAgICAgICAgICAgIHl5OiAnJWTlubQnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGphO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEphdmFuZXNlIFtqdl1cbi8vISBhdXRob3IgOiBSb255IExhbnRpcCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9sYW50aXBcbi8vISByZWZlcmVuY2U6IGh0dHA6Ly9qdi53aWtpcGVkaWEub3JnL3dpa2kvQmFzYV9KYXdhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIganYgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdqdicsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyaV9GZWJydWFyaV9NYXJldF9BcHJpbF9NZWlfSnVuaV9KdWxpX0FndXN0dXNfU2VwdGVtYmVyX09rdG9iZXJfTm9wZW1iZXJfRGVzZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZlYl9NYXJfQXByX01laV9KdW5fSnVsX0Fnc19TZXBfT2t0X05vcF9EZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnTWluZ2d1X1NlbmVuX1NlbG9zb19SZWJ1X0tlbWlzX0plbXV3YWhfU2VwdHUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdNaW5fU2VuX1NlbF9SZWJfS2VtX0plbV9TZXAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnTWdfU25fU2xfUmJfS21fSm1fU3AnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hILm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgW3B1a3VsXSBISC5tbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9lbmppbmd8c2l5YW5nfHNvbnRlbnxuZGFsdS8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ2VuamluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdzaXlhbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTEgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ3NvbnRlbicgfHwgbWVyaWRpZW0gPT09ICduZGFsdScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZW5qaW5nJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxNSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc2l5YW5nJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPCAxOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnc29udGVuJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICduZGFsdSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0RpbnRlbiBwdW5pa28gcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbTWJlbmphbmcgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbcHVrdWxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS2FsYSB3aW5naSBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtrZXBlbmdrZXIgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnd29udGVuIGluZyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgaW5na2FuZyBrZXBlbmdrZXInLFxuICAgICAgICAgICAgczogJ3Nhd2V0YXdpcyBkZXRpaycsXG4gICAgICAgICAgICBzczogJyVkIGRldGlrJyxcbiAgICAgICAgICAgIG06ICdzZXR1bmdnYWwgbWVuaXQnLFxuICAgICAgICAgICAgbW06ICclZCBtZW5pdCcsXG4gICAgICAgICAgICBoOiAnc2V0dW5nZ2FsIGphbScsXG4gICAgICAgICAgICBoaDogJyVkIGphbScsXG4gICAgICAgICAgICBkOiAnc2VkaW50ZW4nLFxuICAgICAgICAgICAgZGQ6ICclZCBkaW50ZW4nLFxuICAgICAgICAgICAgTTogJ3Nld3VsYW4nLFxuICAgICAgICAgICAgTU06ICclZCB3dWxhbicsXG4gICAgICAgICAgICB5OiAnc2V0YXVuJyxcbiAgICAgICAgICAgIHl5OiAnJWQgdGF1bicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBqdjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBHZW9yZ2lhbiBba2FdXG4vLyEgYXV0aG9yIDogSXJha2xpIEphbmlhc2h2aWxpIDogaHR0cHM6Ly9naXRodWIuY29tL0lyYWtsaUphbmlcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBrYSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2thJywge1xuICAgICAgICBtb250aHM6ICfhg5jhg5Dhg5zhg5Xhg5Dhg6Dhg5hf4YOX4YOU4YOR4YOU4YOg4YOV4YOQ4YOa4YOYX+GDm+GDkOGDoOGDouGDmF/hg5Dhg57hg6Dhg5jhg5rhg5hf4YOb4YOQ4YOY4YOh4YOYX+GDmOGDleGDnOGDmOGDoeGDmF/hg5jhg5Xhg5rhg5jhg6Hhg5hf4YOQ4YOS4YOV4YOY4YOh4YOi4YOdX+GDoeGDlOGDpeGDouGDlOGDm+GDkeGDlOGDoOGDmF/hg53hg6Xhg6Lhg53hg5vhg5Hhg5Thg6Dhg5hf4YOc4YOd4YOU4YOb4YOR4YOU4YOg4YOYX+GDk+GDlOGDmeGDlOGDm+GDkeGDlOGDoOGDmCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfhg5jhg5Dhg5xf4YOX4YOU4YORX+GDm+GDkOGDoF/hg5Dhg57hg6Bf4YOb4YOQ4YOYX+GDmOGDleGDnF/hg5jhg5Xhg5pf4YOQ4YOS4YOVX+GDoeGDlOGDpV/hg53hg6Xhg6Jf4YOc4YOd4YOUX+GDk+GDlOGDmScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ+GDmeGDleGDmOGDoOGDkF/hg53hg6Dhg6jhg5Dhg5Hhg5Dhg5fhg5hf4YOh4YOQ4YOb4YOo4YOQ4YOR4YOQ4YOX4YOYX+GDneGDl+GDruGDqOGDkOGDkeGDkOGDl+GDmF/hg67hg6Phg5fhg6jhg5Dhg5Hhg5Dhg5fhg5hf4YOe4YOQ4YOg4YOQ4YOh4YOZ4YOU4YOV4YOYX+GDqOGDkOGDkeGDkOGDl+GDmCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6ICfhg5nhg5Xhg5jhg6Dhg5Dhg6Ff4YOd4YOg4YOo4YOQ4YOR4YOQ4YOX4YOhX+GDoeGDkOGDm+GDqOGDkOGDkeGDkOGDl+GDoV/hg53hg5fhg67hg6jhg5Dhg5Hhg5Dhg5fhg6Ff4YOu4YOj4YOX4YOo4YOQ4YOR4YOQ4YOX4YOhX+GDnuGDkOGDoOGDkOGDoeGDmeGDlOGDleGDoV/hg6jhg5Dhg5Hhg5Dhg5fhg6EnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvKOGDrOGDmOGDnOGDkHzhg6jhg5Thg5vhg5Phg5Thg5IpLyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+GDmeGDleGDmF/hg53hg6Dhg6hf4YOh4YOQ4YObX+GDneGDl+GDrl/hg67hg6Phg5df4YOe4YOQ4YOgX+GDqOGDkOGDkScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfhg5nhg5Vf4YOd4YOgX+GDoeGDkF/hg53hg5df4YOu4YOjX+GDnuGDkF/hg6jhg5AnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4YOT4YOm4YOU4YOhXSBMVFst4YOW4YOUXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+GDruGDleGDkOGDml0gTFRbLeGDluGDlF0nLFxuICAgICAgICAgICAgbGFzdERheTogJ1vhg5Lhg6Phg6jhg5jhg5xdIExUWy3hg5bhg5RdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+GDqOGDlOGDm+GDk+GDlOGDkl0gZGRkZCBMVFst4YOW4YOUXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vhg6zhg5jhg5zhg5BdIGRkZGQgTFQt4YOW4YOUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIC8o4YOs4YOQ4YObfOGDrOGDo+GDl3zhg6Hhg5Dhg5Dhg5d84YOs4YOU4YOafOGDk+GDpnzhg5fhg5UpKOGDmHzhg5QpLyxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCQwLCAkMSwgJDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkMiA9PT0gJ+GDmCcgPyAkMSArICfhg6jhg5gnIDogJDEgKyAkMiArICfhg6jhg5gnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXN0OiBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICAgIGlmICgvKOGDrOGDkOGDm+GDmHzhg6zhg6Phg5fhg5h84YOh4YOQ4YOQ4YOX4YOYfOGDk+GDpuGDlHzhg5fhg5Xhg5QpLy50ZXN0KHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoLyjhg5h84YOUKSQvLCAn4YOY4YOhIOGDrOGDmOGDnCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoL+GDrOGDlOGDmuGDmC8udGVzdChzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC/hg6zhg5Thg5rhg5gkLywgJ+GDrOGDmuGDmOGDoSDhg6zhg5jhg5wnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgczogJ+GDoOGDkOGDm+GDk+GDlOGDnOGDmOGDm+GDlCDhg6zhg5Dhg5vhg5gnLFxuICAgICAgICAgICAgc3M6ICclZCDhg6zhg5Dhg5vhg5gnLFxuICAgICAgICAgICAgbTogJ+GDrOGDo+GDl+GDmCcsXG4gICAgICAgICAgICBtbTogJyVkIOGDrOGDo+GDl+GDmCcsXG4gICAgICAgICAgICBoOiAn4YOh4YOQ4YOQ4YOX4YOYJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4YOh4YOQ4YOQ4YOX4YOYJyxcbiAgICAgICAgICAgIGQ6ICfhg5Phg6bhg5QnLFxuICAgICAgICAgICAgZGQ6ICclZCDhg5Phg6bhg5QnLFxuICAgICAgICAgICAgTTogJ+GDl+GDleGDlCcsXG4gICAgICAgICAgICBNTTogJyVkIOGDl+GDleGDlCcsXG4gICAgICAgICAgICB5OiAn4YOs4YOU4YOa4YOYJyxcbiAgICAgICAgICAgIHl5OiAnJWQg4YOs4YOU4YOa4YOYJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogLzB8MS3hg5rhg5h84YOb4YOULVxcZHsxLDJ9fFxcZHsxLDJ9LeGDlC8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLeGDmuGDmCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyIDwgMjAgfHxcbiAgICAgICAgICAgICAgICAobnVtYmVyIDw9IDEwMCAmJiBudW1iZXIgJSAyMCA9PT0gMCkgfHxcbiAgICAgICAgICAgICAgICBudW1iZXIgJSAxMDAgPT09IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4YOb4YOULScgKyBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3hg5QnO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsXG4gICAgICAgICAgICBkb3k6IDcsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga2E7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS2F6YWtoIFtra11cbi8vISBhdXRob3JzIDogTnVybGFuIFJha2hpbXpoYW5vdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9udXJsYW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzdWZmaXhlcyA9IHtcbiAgICAgICAgMDogJy3RiNGWJyxcbiAgICAgICAgMTogJy3RiNGWJyxcbiAgICAgICAgMjogJy3RiNGWJyxcbiAgICAgICAgMzogJy3RiNGWJyxcbiAgICAgICAgNDogJy3RiNGWJyxcbiAgICAgICAgNTogJy3RiNGWJyxcbiAgICAgICAgNjogJy3RiNGLJyxcbiAgICAgICAgNzogJy3RiNGWJyxcbiAgICAgICAgODogJy3RiNGWJyxcbiAgICAgICAgOTogJy3RiNGLJyxcbiAgICAgICAgMTA6ICct0YjRiycsXG4gICAgICAgIDIwOiAnLdGI0YsnLFxuICAgICAgICAzMDogJy3RiNGLJyxcbiAgICAgICAgNDA6ICct0YjRiycsXG4gICAgICAgIDUwOiAnLdGI0ZYnLFxuICAgICAgICA2MDogJy3RiNGLJyxcbiAgICAgICAgNzA6ICct0YjRlicsXG4gICAgICAgIDgwOiAnLdGI0ZYnLFxuICAgICAgICA5MDogJy3RiNGLJyxcbiAgICAgICAgMTAwOiAnLdGI0ZYnLFxuICAgIH07XG5cbiAgICB2YXIga2sgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdraycsIHtcbiAgICAgICAgbW9udGhzOiAn0pvQsNKj0YLQsNGAX9Cw0pvQv9Cw0L1f0L3QsNGD0YDRi9C3X9GB05nRg9GW0YBf0LzQsNC80YvRgF/QvNCw0YPRgdGL0Lxf0YjRltC70LTQtV/RgtCw0LzRi9C3X9Kb0YvRgNC60q/QudC10Lpf0pvQsNC30LDQvV/Sm9Cw0YDQsNGI0LBf0LbQtdC70YLQvtKb0YHQsNC9Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9Kb0LDSo1/QsNKb0L9f0L3QsNGDX9GB05nRg1/QvNCw0Lxf0LzQsNGDX9GI0ZbQu1/RgtCw0Lxf0pvRi9GAX9Kb0LDQt1/Sm9Cw0YBf0LbQtdC7Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9C20LXQutGB0LXQvdCx0ZZf0LTSr9C50YHQtdC90LHRll/RgdC10LnRgdC10L3QsdGWX9GB05nRgNGB0LXQvdCx0ZZf0LHQtdC50YHQtdC90LHRll/QttKx0LzQsF/RgdC10L3QsdGWJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0LbQtdC6X9C00q/QuV/RgdC10Llf0YHTmdGAX9Cx0LXQuV/QttKx0Lxf0YHQtdC9Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9C20Lpf0LTQuV/RgdC5X9GB0YBf0LHQuV/QttC8X9GB0L0nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0JHSr9Cz0ZbQvSDRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9CV0YDRgtC10qMg0YHQsNKT0LDRgl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvRgdCw0pPQsNGCXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9Ca0LXRiNC1INGB0LDSk9Cw0YJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9Oo0YLQutC10L0g0LDQv9GC0LDQvdGL0qNdIGRkZGQgW9GB0LDSk9Cw0YJdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg0ZbRiNGW0L3QtNC1JyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDQsdKx0YDRi9C9JyxcbiAgICAgICAgICAgIHM6ICfQsdGW0YDQvdC10YjQtSDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgc3M6ICclZCDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbTogJ9Cx0ZbRgCDQvNC40L3Rg9GCJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LzQuNC90YPRgicsXG4gICAgICAgICAgICBoOiAn0LHRltGAINGB0LDSk9Cw0YInLFxuICAgICAgICAgICAgaGg6ICclZCDRgdCw0pPQsNGCJyxcbiAgICAgICAgICAgIGQ6ICfQsdGW0YAg0LrSr9C9JyxcbiAgICAgICAgICAgIGRkOiAnJWQg0LrSr9C9JyxcbiAgICAgICAgICAgIE06ICfQsdGW0YAg0LDQuScsXG4gICAgICAgICAgICBNTTogJyVkINCw0LknLFxuICAgICAgICAgICAgeTogJ9Cx0ZbRgCDQttGL0LsnLFxuICAgICAgICAgICAgeXk6ICclZCDQttGL0LsnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNGI0ZZ80YjRiykvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYSA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGIgPSBudW1iZXIgPj0gMTAwID8gMTAwIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoc3VmZml4ZXNbbnVtYmVyXSB8fCBzdWZmaXhlc1thXSB8fCBzdWZmaXhlc1tiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBraztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDYW1ib2RpYW4gW2ttXVxuLy8hIGF1dGhvciA6IEtydXkgVmFubmEgOiBodHRwczovL2dpdGh1Yi5jb20va3J1eXZhbm5hXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+GfoScsXG4gICAgICAgICAgICAyOiAn4Z+iJyxcbiAgICAgICAgICAgIDM6ICfhn6MnLFxuICAgICAgICAgICAgNDogJ+GfpCcsXG4gICAgICAgICAgICA1OiAn4Z+lJyxcbiAgICAgICAgICAgIDY6ICfhn6YnLFxuICAgICAgICAgICAgNzogJ+GfpycsXG4gICAgICAgICAgICA4OiAn4Z+oJyxcbiAgICAgICAgICAgIDk6ICfhn6knLFxuICAgICAgICAgICAgMDogJ+GfoCcsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfhn6EnOiAnMScsXG4gICAgICAgICAgICAn4Z+iJzogJzInLFxuICAgICAgICAgICAgJ+Gfoyc6ICczJyxcbiAgICAgICAgICAgICfhn6QnOiAnNCcsXG4gICAgICAgICAgICAn4Z+lJzogJzUnLFxuICAgICAgICAgICAgJ+Gfpic6ICc2JyxcbiAgICAgICAgICAgICfhn6cnOiAnNycsXG4gICAgICAgICAgICAn4Z+oJzogJzgnLFxuICAgICAgICAgICAgJ+GfqSc6ICc5JyxcbiAgICAgICAgICAgICfhn6AnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIga20gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdrbScsIHtcbiAgICAgICAgbW9udGhzOiAn4Z6Y4Z6A4Z6a4Z62X+GegOGeu+GemOGfkuGel+GfiF/hnpjhnrjhnpPhnrZf4Z6Y4Z+B4Z6f4Z62X+Gep+Gen+Gel+Getl/hnpjhnrfhnpDhnrvhnpPhnrZf4Z6A4Z6A4Z+S4Z6A4Z6K4Z62X+Gen+GeuOGeoOGetl/hnoDhnonhn5LhnonhnrZf4Z6P4Z674Z6b4Z62X+GenOGet+GeheGfkuGehuGet+GegOGetl/hnpLhn5LhnpPhnrwnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+GemOGegOGemuGetl/hnoDhnrvhnpjhn5Lhnpfhn4hf4Z6Y4Z644Z6T4Z62X+GemOGfgeGen+Getl/hnqfhnp/hnpfhnrZf4Z6Y4Z634Z6Q4Z674Z6T4Z62X+GegOGegOGfkuGegOGeiuGetl/hnp/hnrjhnqDhnrZf4Z6A4Z6J4Z+S4Z6J4Z62X+Gej+Geu+Gem+Getl/hnpzhnrfhnoXhn5LhnobhnrfhnoDhnrZf4Z6S4Z+S4Z6T4Z68Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn4Z6i4Z624Z6R4Z634Z6P4Z+S4Z6ZX+GeheGfkOGek+GfkuGekV/hnqLhnoThn5LhnoLhnrbhnppf4Z6W4Z674Z6SX+GeluGfkuGemuGeoOGen+GfkuGelOGej+Get+GfjV/hnp/hnrvhnoDhn5Lhnppf4Z6f4Z+F4Z6a4Z+NJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4Z6i4Z62X+GehV/hnqJf4Z6WX+GeluGfkuGeml/hnp/hnrtf4Z6fJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+GeouGetl/hnoVf4Z6iX+Gell/hnpbhn5Lhnppf4Z6f4Z67X+Genycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/hnpbhn5LhnprhnrnhnoB84Z6b4Z+S4Z6E4Z624Z6FLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfhnpvhn5LhnoThnrbhnoUnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Z6W4Z+S4Z6a4Z654Z6AJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfhnpvhn5LhnoThnrbhnoUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vhnpDhn5LhnoThn4PhnpPhn4Hhn4cg4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+Gen+GfkuGeouGfguGegCDhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+GemOGfkuGen+Get+Gem+GemOGet+GeiSDhnpjhn4nhn4ThnoRdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb4Z6f4Z6U4Z+S4Z6P4Z624Z6g4Z+N4Z6Y4Z674Z6TXSBb4Z6Y4Z+J4Z+E4Z6EXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz4Z6R4Z+A4Z6PJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+GemOGeu+GekycsXG4gICAgICAgICAgICBzOiAn4Z6U4Z+J4Z674Z6T4Z+S4Z6Y4Z624Z6T4Z6c4Z634Z6T4Z624Z6R4Z64JyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Z6c4Z634Z6T4Z624Z6R4Z64JyxcbiAgICAgICAgICAgIG06ICfhnpjhnr3hnpnhnpPhnrbhnpHhnrgnLFxuICAgICAgICAgICAgbW06ICclZCDhnpPhnrbhnpHhnrgnLFxuICAgICAgICAgICAgaDogJ+GemOGeveGemeGemOGfieGfhOGehCcsXG4gICAgICAgICAgICBoaDogJyVkIOGemOGfieGfhOGehCcsXG4gICAgICAgICAgICBkOiAn4Z6Y4Z694Z6Z4Z6Q4Z+S4Z6E4Z+DJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Z6Q4Z+S4Z6E4Z+DJyxcbiAgICAgICAgICAgIE06ICfhnpjhnr3hnpnhnoHhn4InLFxuICAgICAgICAgICAgTU06ICclZCDhnoHhn4InLFxuICAgICAgICAgICAgeTogJ+GemOGeveGemeGehuGfkuGek+GetuGfhicsXG4gICAgICAgICAgICB5eTogJyVkIOGehuGfkuGek+GetuGfhicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC/hnpHhnrhcXGR7MSwyfS8sXG4gICAgICAgIG9yZGluYWw6ICfhnpHhnrglZCcsXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vhn6Hhn6Lhn6Phn6Thn6Xhn6bhn6fhn6jhn6nhn6BdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBrbTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBLYW5uYWRhIFtrbl1cbi8vISBhdXRob3IgOiBSYWplZXYgTmFpayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYWplZXZuYWlrdGVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4LOnJyxcbiAgICAgICAgICAgIDI6ICfgs6gnLFxuICAgICAgICAgICAgMzogJ+CzqScsXG4gICAgICAgICAgICA0OiAn4LOqJyxcbiAgICAgICAgICAgIDU6ICfgs6snLFxuICAgICAgICAgICAgNjogJ+CzrCcsXG4gICAgICAgICAgICA3OiAn4LOtJyxcbiAgICAgICAgICAgIDg6ICfgs64nLFxuICAgICAgICAgICAgOTogJ+CzrycsXG4gICAgICAgICAgICAwOiAn4LOmJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+Czpyc6ICcxJyxcbiAgICAgICAgICAgICfgs6gnOiAnMicsXG4gICAgICAgICAgICAn4LOpJzogJzMnLFxuICAgICAgICAgICAgJ+Czqic6ICc0JyxcbiAgICAgICAgICAgICfgs6snOiAnNScsXG4gICAgICAgICAgICAn4LOsJzogJzYnLFxuICAgICAgICAgICAgJ+CzrSc6ICc3JyxcbiAgICAgICAgICAgICfgs64nOiAnOCcsXG4gICAgICAgICAgICAn4LOvJzogJzknLFxuICAgICAgICAgICAgJ+Czpic6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBrbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2tuJywge1xuICAgICAgICBtb250aHM6ICfgspzgsqjgsrXgsrDgsr9f4LKr4LOG4LKs4LON4LKw4LK14LKw4LK/X+CyruCyvuCysOCzjeCymuCzjV/gso/gsqrgs43gsrDgsr/gsrLgs41f4LKu4LOG4LOVX+CynOCzguCyqOCzjV/gspzgs4HgsrLgs4bgs5Zf4LKG4LKX4LK44LON4LKf4LONX+CyuOCzhuCyquCzjeCyn+CzhuCyguCyrOCysOCzjV/gsoXgspXgs43gsp/gs4bgs4Lgs5XgsqzgsrDgs41f4LKo4LK14LOG4LKC4LKs4LKw4LONX+CyoeCyv+CyuOCzhuCyguCyrOCysOCzjScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4LKc4LKoX+Cyq+CzhuCyrOCzjeCysF/gsq7gsr7gsrDgs43gsprgs41f4LKP4LKq4LON4LKw4LK/4LKy4LONX+CyruCzhuCzlV/gspzgs4Lgsqjgs41f4LKc4LOB4LKy4LOG4LOWX+CyhuCyl+CyuOCzjeCyn+CzjV/gsrjgs4bgsqrgs43gsp/gs4bgsoJf4LKF4LKV4LON4LKf4LOG4LOC4LOVX+CyqOCyteCzhuCygl/gsqHgsr/gsrjgs4bgsoInLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfgsq3gsr7gsqjgs4HgsrXgsr7gsrBf4LK44LOG4LOC4LOV4LKu4LK14LK+4LKwX+CyruCyguCyl+Cys+CyteCyvuCysF/gsqzgs4HgsqfgsrXgsr7gsrBf4LKX4LOB4LKw4LOB4LK14LK+4LKwX+CytuCzgeCyleCzjeCysOCyteCyvuCysF/gsrbgsqjgsr/gsrXgsr7gsrAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgsq3gsr7gsqjgs4Ff4LK44LOG4LOC4LOV4LKuX+CyruCyguCyl+Cys1/gsqzgs4Hgsqdf4LKX4LOB4LKw4LOBX+CytuCzgeCyleCzjeCysF/gsrbgsqjgsr8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4LKt4LK+X+CyuOCzhuCzguCzlV/gsq7gsoJf4LKs4LOBX+Cyl+CzgV/gsrbgs4Ff4LK2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+Cyh+CyguCypuCzgV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgsqjgsr7gsrPgs4ZdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgsqjgsr/gsqjgs43gsqjgs4ZdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CyleCzhuCzguCyqOCzhuCyr10gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgsqjgsoLgsqTgsrAnLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCyueCyv+CyguCypuCzhicsXG4gICAgICAgICAgICBzOiAn4LKV4LOG4LKy4LK14LOBIOCyleCzjeCyt+Cyo+Cyl+Cys+CzgScsXG4gICAgICAgICAgICBzczogJyVkIOCyuOCzhuCyleCzhuCyguCyoeCzgeCyl+Cys+CzgScsXG4gICAgICAgICAgICBtOiAn4LKS4LKC4LKm4LOBIOCyqOCyv+CyruCyv+CytycsXG4gICAgICAgICAgICBtbTogJyVkIOCyqOCyv+CyruCyv+CytycsXG4gICAgICAgICAgICBoOiAn4LKS4LKC4LKm4LOBIOCyl+CyguCyn+CzhicsXG4gICAgICAgICAgICBoaDogJyVkIOCyl+CyguCyn+CzhicsXG4gICAgICAgICAgICBkOiAn4LKS4LKC4LKm4LOBIOCypuCyv+CyqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCypuCyv+CyqCcsXG4gICAgICAgICAgICBNOiAn4LKS4LKC4LKm4LOBIOCypOCyv+CyguCyl+Cys+CzgScsXG4gICAgICAgICAgICBNTTogJyVkIOCypOCyv+CyguCyl+Cys+CzgScsXG4gICAgICAgICAgICB5OiAn4LKS4LKC4LKm4LOBIOCyteCysOCzjeCytycsXG4gICAgICAgICAgICB5eTogJyVkIOCyteCysOCzjeCytycsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgs6fgs6jgs6ngs6rgs6vgs6zgs63gs67gs6/gs6ZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gsrDgsr7gsqTgs43gsrDgsr984LKs4LOG4LKz4LK/4LKX4LON4LKX4LOGfOCyruCyp+CzjeCyr+CyvuCyueCzjeCyqHzgsrjgsoLgspzgs4YvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgsrDgsr7gsqTgs43gsrDgsr8nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPCA0ID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsqzgs4bgsrPgsr/gspfgs43gspfgs4YnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LKu4LKn4LON4LKv4LK+4LK54LON4LKoJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgsrjgsoLgspzgs4YnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LKw4LK+4LKk4LON4LKw4LK/JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsqzgs4bgsrPgsr/gspfgs43gspfgs4YnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CyruCyp+CzjeCyr+CyvuCyueCzjeCyqCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAyMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LK44LKC4LKc4LOGJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsrDgsr7gsqTgs43gsrDgsr8nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o4LKo4LOG4LOVKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn4LKo4LOG4LOVJztcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGtuO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IEtvcmVhbiBba29dXG4vLyEgYXV0aG9yIDogS3l1bmd3b29rLCBQYXJrIDogaHR0cHM6Ly9naXRodWIuY29tL2t5dW5ndzAwa1xuLy8hIGF1dGhvciA6IEplZWV5dWwgTGVlIDxqZWVleXVsQGdtYWlsLmNvbT5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBrbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2tvJywge1xuICAgICAgICBtb250aHM6ICcx7JuUXzLsm5RfM+yblF807JuUXzXsm5RfNuyblF837JuUXzjsm5RfOeyblF8xMOyblF8xMeyblF8xMuyblCcuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICcx7JuUXzLsm5RfM+yblF807JuUXzXsm5RfNuyblF837JuUXzjsm5RfOeyblF8xMOyblF8xMeyblF8xMuyblCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfsnbzsmpTsnbxf7JuU7JqU7J28X+2ZlOyalOydvF/siJjsmpTsnbxf66qp7JqU7J28X+q4iOyalOydvF/thqDsmpTsnbwnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfsnbxf7JuUX+2ZlF/siJhf66qpX+q4iF/thqAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn7J28X+yblF/tmZRf7IiYX+uqqV/quIhf7YagJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLk1NLkRELicsXG4gICAgICAgICAgICBMTDogJ1lZWVnrhYQgTU1NTSBE7J28JyxcbiAgICAgICAgICAgIExMTDogJ1lZWVnrhYQgTU1NTSBE7J28IEEgaDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeuFhCBNTU1NIETsnbwgZGRkZCBBIGg6bW0nLFxuICAgICAgICAgICAgbDogJ1lZWVkuTU0uREQuJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWeuFhCBNTU1NIETsnbwnLFxuICAgICAgICAgICAgbGxsOiAnWVlZWeuFhCBNTU1NIETsnbwgQSBoOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdZWVlZ64WEIE1NTU0gROydvCBkZGRkIEEgaDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAn7Jik64qYIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICfrgrTsnbwgTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICfslrTsoJwgTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICfsp4Drgpzso7wgZGRkZCBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzIO2bhCcsXG4gICAgICAgICAgICBwYXN0OiAnJXMg7KCEJyxcbiAgICAgICAgICAgIHM6ICfrqocg7LSIJyxcbiAgICAgICAgICAgIHNzOiAnJWTstIgnLFxuICAgICAgICAgICAgbTogJzHrtoQnLFxuICAgICAgICAgICAgbW06ICclZOu2hCcsXG4gICAgICAgICAgICBoOiAn7ZWcIOyLnOqwhCcsXG4gICAgICAgICAgICBoaDogJyVk7Iuc6rCEJyxcbiAgICAgICAgICAgIGQ6ICftlZjro6gnLFxuICAgICAgICAgICAgZGQ6ICclZOydvCcsXG4gICAgICAgICAgICBNOiAn7ZWcIOuLrCcsXG4gICAgICAgICAgICBNTTogJyVk64usJyxcbiAgICAgICAgICAgIHk6ICfsnbwg64WEJyxcbiAgICAgICAgICAgIHl5OiAnJWTrhYQnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0o7J28fOyblHzso7wpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn7J28JztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfsm5QnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+yjvCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+yYpOyghHzsmKTtm4QvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbiA9PT0gJ+yYpO2bhCc7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc1VwcGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gaG91ciA8IDEyID8gJ+yYpOyghCcgOiAn7Jik7ZuEJztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBrbztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBOb3J0aGVybiBLdXJkaXNoIFtrdS1rbXJdXG4vLyEgYXV0aG9ycyA6IE1hemx1bSDDlnpkb2dhbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZXJnZWhlelxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW0sIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHM6IFsnw6dlbmQgc2Fuw655ZScsICfDp2VuZCBzYW7DrnlleWFuJ10sXG4gICAgICAgICAgICBzczogW251bSArICcgc2Fuw655ZScsIG51bSArICcgc2Fuw655ZXlhbiddLFxuICAgICAgICAgICAgbTogWydkZXHDrnFleWVrJywgJ2RlccOucWV5ZWvDqiddLFxuICAgICAgICAgICAgbW06IFtudW0gKyAnIGRlccOucWUnLCBudW0gKyAnIGRlccOucWV5YW4nXSxcbiAgICAgICAgICAgIGg6IFsnc2FldGVrJywgJ3NhZXRla8OqJ10sXG4gICAgICAgICAgICBoaDogW251bSArICcgc2FldCcsIG51bSArICcgc2FldGFuJ10sXG4gICAgICAgICAgICBkOiBbJ3JvamVrJywgJ3JvamVrw6onXSxcbiAgICAgICAgICAgIGRkOiBbbnVtICsgJyByb2onLCBudW0gKyAnIHJvamFuJ10sXG4gICAgICAgICAgICB3OiBbJ2hlZnRleWVrJywgJ2hlZnRleWVrw6onXSxcbiAgICAgICAgICAgIHd3OiBbbnVtICsgJyBoZWZ0ZScsIG51bSArICcgaGVmdGV5YW4nXSxcbiAgICAgICAgICAgIE06IFsnbWVoZWsnLCAnbWVoZWvDqiddLFxuICAgICAgICAgICAgTU06IFtudW0gKyAnIG1laCcsIG51bSArICcgbWVoYW4nXSxcbiAgICAgICAgICAgIHk6IFsnc2FsZWsnLCAnc2FsZWvDqiddLFxuICAgICAgICAgICAgeXk6IFtudW0gKyAnIHNhbCcsIG51bSArICcgc2FsYW4nXSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyBmb3JtYXRba2V5XVswXSA6IGZvcm1hdFtrZXldWzFdO1xuICAgIH1cbiAgICAvLyBmdW5jdGlvbiBvYmxpcXVlTnVtU3VmZml4KG51bSkge1xuICAgIC8vICAgICBpZihudW0uaW5jbHVkZXMoJzonKSlcbiAgICAvLyAgICAgICAgIG51bSA9IHBhcnNlSW50KG51bS5zcGxpdCgnOicpWzBdKTtcbiAgICAvLyAgICAgZWxzZVxuICAgIC8vICAgICAgICAgbnVtID0gcGFyc2VJbnQobnVtKTtcbiAgICAvLyAgICAgcmV0dXJuIG51bSA9PSAwIHx8IG51bSAlIDEwID09IDEgPyAnw6onXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgOiAobnVtID4gMTAgJiYgbnVtICUgMTAgPT0gMCA/ICfDricgOiAnYW4nKTtcbiAgICAvLyB9XG4gICAgZnVuY3Rpb24gZXphZmVOdW1TdWZmaXgobnVtKSB7XG4gICAgICAgIG51bSA9ICcnICsgbnVtO1xuICAgICAgICB2YXIgbCA9IG51bS5zdWJzdHJpbmcobnVtLmxlbmd0aCAtIDEpLFxuICAgICAgICAgICAgbGwgPSBudW0ubGVuZ3RoID4gMSA/IG51bS5zdWJzdHJpbmcobnVtLmxlbmd0aCAtIDIpIDogJyc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICEobGwgPT0gMTIgfHwgbGwgPT0gMTMpICYmXG4gICAgICAgICAgICAobCA9PSAnMicgfHwgbCA9PSAnMycgfHwgbGwgPT0gJzUwJyB8fCBsID09ICc3MCcgfHwgbCA9PSAnODAnKVxuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gJ3nDqic7XG4gICAgICAgIHJldHVybiAnw6onO1xuICAgIH1cblxuICAgIHZhciBrdUttciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2t1LWttcicsIHtcbiAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVsbGluZyBydWxlcyBkZWZpbmVkIGJ5IHRoZSB3b3JrIGdyb3VwIG9mIFdlcWZhIE1lem9wb3RhbXlhecOqIChNZXNvcG90YW1pYSBGb3VuZGF0aW9uKVxuICAgICAgICAvLyB0aGlzIHNob3VsZCBiZTogJ0thbsO7bmEgUGHFn8Oubl9TaWJhdF9BZGFyX07DrnNhbl9HdWxhbl9IZXrDrnJhbl9Uw65ybWVoX1RlYmF4X8OObG9uX8OHaXLDrnlhIFDDqsWfw65uX8OHaXLDrnlhIFBhxZ/Drm5fS2Fuw7tuYSBQw6rFn8OubidcbiAgICAgICAgLy8gQnV0IHRoZSBuYW1lcyBiZWxvdyBhcmUgbW9yZSB3ZWxsIGtub3duIGFuZCBoYW5keVxuICAgICAgICBtb250aHM6ICdSw6piZW5kYW5fU2liYXRfQWRhcl9Ow65zYW5fR3VsYW5fSGV6w65yYW5fVMOucm1laF9UZWJheF/Djmxvbl9Db3RtZWhfTWlqZGFyX0JlcmZhbmJhcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdSw6piX1NpYl9BZGFfTsOuc19HdWxfSGV6X1TDrnJfVGViX8OObG9fQ290X01pal9CZXInLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnWWVrxZ9lbV9EdcWfZW1fU8OqxZ9lbV/Dh2FyxZ9lbV9Qw6puY8WfZW1fw45uX8WeZW3Dricuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1lla19EdV9Tw6pfw4dhcl9Qw6puX8OObl/FnmVtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1llX0R1X1PDql/Dh2FfUMOqX8OObl/FnmUnLnNwbGl0KCdfJyksXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYm4nIDogJ0JOJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAncG4nIDogJ1BOJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2JufEJOfHBufFBOLyxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEbyBNTU1NW2FdIFlZWVlbYW5dJyxcbiAgICAgICAgICAgIExMTDogJ0RvIE1NTU1bYV0gWVlZWVthbl0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIERvIE1NTU1bYV0gWVlZWVthbl0gSEg6bW0nLFxuICAgICAgICAgICAgbGw6ICdEbyBNTU1bLl0gWVlZWVthbl0nLFxuICAgICAgICAgICAgbGxsOiAnRG8gTU1NWy5dIFlZWVlbYW5dIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGRbLl0sIERvIE1NTVsuXSBZWVlZW2FuXSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW8OOcm8gZGkgc2FldF0gTFQgW2RlXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1NpYsOqIGRpIHNhZXRdIExUIFtkZV0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtkaSBzYWV0XSBMVCBbZGVdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbRHVoIGRpIHNhZXRdIExUIFtkZV0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkW2EgYm9yw64gZGkgc2FldF0gTFQgW2RlXScsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2RpICVzIGRlJyxcbiAgICAgICAgICAgIHBhc3Q6ICdiZXLDriAlcycsXG4gICAgICAgICAgICBzOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgc3M6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgZGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB3OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgd3c6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgTU06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5OiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgeXk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSg/OnnDqnzDqnxcXC4pLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bSwgcGVyaW9kKSB7XG4gICAgICAgICAgICB2YXIgcCA9IHBlcmlvZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHAuaW5jbHVkZXMoJ3cnKSB8fCBwLmluY2x1ZGVzKCdtJykpIHJldHVybiBudW0gKyAnLic7XG5cbiAgICAgICAgICAgIHJldHVybiBudW0gKyBlemFmZU51bVN1ZmZpeChudW0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga3VLbXI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS3VyZGlzaCBba3VdXG4vLyEgYXV0aG9yIDogU2hhaHJhbSBNZWJhc2hhciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9TaGFocmFtTWViYXNoYXJcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn2aEnLFxuICAgICAgICAgICAgMjogJ9miJyxcbiAgICAgICAgICAgIDM6ICfZoycsXG4gICAgICAgICAgICA0OiAn2aQnLFxuICAgICAgICAgICAgNTogJ9mlJyxcbiAgICAgICAgICAgIDY6ICfZpicsXG4gICAgICAgICAgICA3OiAn2acnLFxuICAgICAgICAgICAgODogJ9moJyxcbiAgICAgICAgICAgIDk6ICfZqScsXG4gICAgICAgICAgICAwOiAn2aAnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn2aEnOiAnMScsXG4gICAgICAgICAgICAn2aInOiAnMicsXG4gICAgICAgICAgICAn2aMnOiAnMycsXG4gICAgICAgICAgICAn2aQnOiAnNCcsXG4gICAgICAgICAgICAn2aUnOiAnNScsXG4gICAgICAgICAgICAn2aYnOiAnNicsXG4gICAgICAgICAgICAn2acnOiAnNycsXG4gICAgICAgICAgICAn2agnOiAnOCcsXG4gICAgICAgICAgICAn2aknOiAnOScsXG4gICAgICAgICAgICAn2aAnOiAnMCcsXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRocyA9IFtcbiAgICAgICAgICAgICfaqdin2YbZiNmG24wg2K/ZiNmI25XZhScsXG4gICAgICAgICAgICAn2LTZiNio2KfYqicsXG4gICAgICAgICAgICAn2KbYp9iy2KfYsScsXG4gICAgICAgICAgICAn2YbbjNiz2KfZhicsXG4gICAgICAgICAgICAn2KbYp9uM2KfYsScsXG4gICAgICAgICAgICAn2K3ZiNiy25XbjNix2KfZhicsXG4gICAgICAgICAgICAn2KrbldmF2YXZiNiyJyxcbiAgICAgICAgICAgICfYptin2KgnLFxuICAgICAgICAgICAgJ9im25XbjNmE2YjZiNmEJyxcbiAgICAgICAgICAgICfYqti02LHbjNmG24wg24zbldmD25XZhScsXG4gICAgICAgICAgICAn2KrYtNix24zZhtuMINiv2YjZiNuV2YUnLFxuICAgICAgICAgICAgJ9mD2KfZhtmI2YbbjCDbjNuV2qnbldmFJyxcbiAgICAgICAgXTtcblxuICAgIHZhciBrdSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2t1Jywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAn24zZh+KAjNmD2LTZh+KAjNmF2YXZh+KAjF/Yr9mI2YjYtNmH4oCM2YXZhdmH4oCMX9iz247YtNmH4oCM2YXZhdmH4oCMX9qG2YjYp9ix2LTZh+KAjNmF2YXZh+KAjF/ZvtuO2YbYrNi02YfigIzZhdmF2YfigIxf2YfZh+KAjNuM2YbbjF/YtNmH4oCM2YXZhdmH4oCMJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6XG4gICAgICAgICAgICAn24zZh+KAjNmD2LTZh+KAjNmFX9iv2YjZiNi02YfigIzZhV/Ys9uO2LTZh+KAjNmFX9qG2YjYp9ix2LTZh+KAjNmFX9m+247Zhtis2LTZh+KAjNmFX9mH2YfigIzbjNmG24xf2LTZh+KAjNmF2YXZh+KAjCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfbjF/Yr1/Ys1/ahl/Zvl/Zh1/YtCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/YptuO2YjYp9ix2YfigIx82KjZh+KAjNuM2KfZhtuMLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gL9im247ZiNin2LHZh+KAjC8udGVzdChpbnB1dCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYqNmH4oCM24zYp9mG24wnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9im247ZiNin2LHZh+KAjCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9im2YfigIzZhdix24Yg2YPYp9iq2pjZhduO2LFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2KjZh+KAjNuM2KfZhtuMINmD2KfYqtqY2YXbjtixXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9mD2KfYqtqY2YXbjtixXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9iv2YjbjtmG244g2YPYp9iq2pjZhduO2LFdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBb2YPYp9iq2pjZhduO2LFdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn2YTZh+KAjCAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMnLFxuICAgICAgICAgICAgczogJ9qG2YfigIzZhtivINqG2LHZg9mH4oCM24zZh+KAjNmDJyxcbiAgICAgICAgICAgIHNzOiAn2obYsdmD2YfigIwgJWQnLFxuICAgICAgICAgICAgbTogJ9uM2YfigIzZgyDYrtmI2YTZh+KAjNmDJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2K7ZiNmE2YfigIzZgycsXG4gICAgICAgICAgICBoOiAn24zZh+KAjNmDINmD2KfYqtqY2YXbjtixJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2YPYp9iq2pjZhduO2LEnLFxuICAgICAgICAgICAgZDogJ9uM2YfigIzZgyDalduG2pgnLFxuICAgICAgICAgICAgZGQ6ICclZCDalduG2pgnLFxuICAgICAgICAgICAgTTogJ9uM2YfigIzZgyDZhdin2YbarycsXG4gICAgICAgICAgICBNTTogJyVkINmF2KfZhtqvJyxcbiAgICAgICAgICAgIHk6ICfbjNmH4oCM2YMg2LPYp9q1JyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPYp9q1JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW9mh2aLZo9mk2aXZptmn2ajZqdmgXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLywvZywgJ9iMJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ga3U7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS3lyZ3l6IFtreV1cbi8vISBhdXRob3IgOiBDaHluZ3l6IEFyeXN0YW4gdXVsdSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaHluZ3l6XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3VmZml4ZXMgPSB7XG4gICAgICAgIDA6ICct0YfSrycsXG4gICAgICAgIDE6ICct0YfQuCcsXG4gICAgICAgIDI6ICct0YfQuCcsXG4gICAgICAgIDM6ICct0YfSrycsXG4gICAgICAgIDQ6ICct0YfSrycsXG4gICAgICAgIDU6ICct0YfQuCcsXG4gICAgICAgIDY6ICct0YfRiycsXG4gICAgICAgIDc6ICct0YfQuCcsXG4gICAgICAgIDg6ICct0YfQuCcsXG4gICAgICAgIDk6ICct0YfRgycsXG4gICAgICAgIDEwOiAnLdGH0YMnLFxuICAgICAgICAyMDogJy3Rh9GLJyxcbiAgICAgICAgMzA6ICct0YfRgycsXG4gICAgICAgIDQwOiAnLdGH0YsnLFxuICAgICAgICA1MDogJy3Rh9KvJyxcbiAgICAgICAgNjA6ICct0YfRiycsXG4gICAgICAgIDcwOiAnLdGH0LgnLFxuICAgICAgICA4MDogJy3Rh9C4JyxcbiAgICAgICAgOTA6ICct0YfRgycsXG4gICAgICAgIDEwMDogJy3Rh9KvJyxcbiAgICB9O1xuXG4gICAgdmFyIGt5ID0gbW9tZW50LmRlZmluZUxvY2FsZSgna3knLCB7XG4gICAgICAgIG1vbnRoczogJ9GP0L3QstCw0YDRjF/RhNC10LLRgNCw0LvRjF/QvNCw0YDRgl/QsNC/0YDQtdC70Yxf0LzQsNC5X9C40Y7QvdGMX9C40Y7Qu9GMX9Cw0LLQs9GD0YHRgl/RgdC10L3RgtGP0LHRgNGMX9C+0LrRgtGP0LHRgNGMX9C90L7Rj9Cx0YDRjF/QtNC10LrQsNCx0YDRjCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfRj9C90LJf0YTQtdCyX9C80LDRgNGCX9Cw0L/RgF/QvNCw0Llf0LjRjtC90Yxf0LjRjtC70Yxf0LDQstCzX9GB0LXQvV/QvtC60YJf0L3QvtGPX9C00LXQuicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfQltC10LrRiNC10LzQsdC4X9CU0q/QudGI06nQvNCx0q9f0KjQtdC50YjQtdC80LHQuF/QqNCw0YDRiNC10LzQsdC4X9CR0LXQudGI0LXQvNCx0Lhf0JbRg9C80LBf0JjRiNC10LzQsdC4Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0JbQtdC6X9CU0q/QuV/QqNC10Llf0KjQsNGAX9CR0LXQuV/QltGD0Lxf0JjRiNC1Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9CW0Lpf0JTQuV/QqNC5X9Co0YBf0JHQuV/QltC8X9CY0YgnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0JHSr9Cz0q/QvSDRgdCw0LDRgl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQrdGA0YLQtdKjINGB0LDQsNGCXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW9GB0LDQsNGCXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9Ca0LXRh9GN0Y0g0YHQsNCw0YJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9Oo0YLQutOp0L0g0LDQv9GC0LDQvdGL0L1dIGRkZGQgW9C60q/QvdKvXSBb0YHQsNCw0YJdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg0LjRh9C40L3QtNC1JyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDQvNGD0YDRg9C9JyxcbiAgICAgICAgICAgIHM6ICfQsdC40YDQvdC10YfQtSDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgc3M6ICclZCDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgbTogJ9Cx0LjRgCDQvNKv0L3TqdGCJyxcbiAgICAgICAgICAgIG1tOiAnJWQg0LzSr9C906nRgicsXG4gICAgICAgICAgICBoOiAn0LHQuNGAINGB0LDQsNGCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YHQsNCw0YInLFxuICAgICAgICAgICAgZDogJ9Cx0LjRgCDQutKv0L0nLFxuICAgICAgICAgICAgZGQ6ICclZCDQutKv0L0nLFxuICAgICAgICAgICAgTTogJ9Cx0LjRgCDQsNC5JyxcbiAgICAgICAgICAgIE1NOiAnJWQg0LDQuScsXG4gICAgICAgICAgICB5OiAn0LHQuNGAINC20YvQuycsXG4gICAgICAgICAgICB5eTogJyVkINC20YvQuycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0YfQuHzRh9GLfNGH0q980YfRgykvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYSA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIGIgPSBudW1iZXIgPj0gMTAwID8gMTAwIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoc3VmZml4ZXNbbnVtYmVyXSB8fCBzdWZmaXhlc1thXSB8fCBzdWZmaXhlc1tiXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBreTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBMdXhlbWJvdXJnaXNoIFtsYl1cbi8vISBhdXRob3IgOiBtd2VpbWVyc2tpcmNoIDogaHR0cHM6Ly9naXRodWIuY29tL213ZWltZXJza2lyY2hcbi8vISBhdXRob3IgOiBEYXZpZCBSYWlzb24gOiBodHRwczovL2dpdGh1Yi5jb20va3dpc2F0elxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1JlbGF0aXZlVGltZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIG06IFsnZW5nIE1pbnV0dCcsICdlbmdlciBNaW51dHQnXSxcbiAgICAgICAgICAgIGg6IFsnZW5nIFN0b25uJywgJ2VuZ2VyIFN0b25uJ10sXG4gICAgICAgICAgICBkOiBbJ2VlbiBEYWcnLCAnZW5nZW0gRGFnJ10sXG4gICAgICAgICAgICBNOiBbJ2VlIE1vdW50JywgJ2VuZ2VtIE1vdW50J10sXG4gICAgICAgICAgICB5OiBbJ2VlIEpvZXInLCAnZW5nZW0gSm9lciddLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/IGZvcm1hdFtrZXldWzBdIDogZm9ybWF0W2tleV1bMV07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NGdXR1cmVUaW1lKHN0cmluZykge1xuICAgICAgICB2YXIgbnVtYmVyID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZignICcpKTtcbiAgICAgICAgaWYgKGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihudW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2EgJyArIHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2FuICcgKyBzdHJpbmc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NQYXN0VGltZShzdHJpbmcpIHtcbiAgICAgICAgdmFyIG51bWJlciA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YoJyAnKSk7XG4gICAgICAgIGlmIChlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobnVtYmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuICd2aXJ1ICcgKyBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICd2aXJ1biAnICsgc3RyaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdvcmQgYmVmb3JlIHRoZSBnaXZlbiBudW1iZXIgbG9zZXMgdGhlICctbicgZW5kaW5nLlxuICAgICAqIGUuZy4gJ2FuIDEwIERlZWcnIGJ1dCAnYSA1IERlZWcnXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbnVtYmVyIHtpbnRlZ2VyfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihudW1iZXIpIHtcbiAgICAgICAgbnVtYmVyID0gcGFyc2VJbnQobnVtYmVyLCAxMCk7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIE5lZ2F0aXZlIE51bWJlciAtLT4gYWx3YXlzIHRydWVcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDEwKSB7XG4gICAgICAgICAgICAvLyBPbmx5IDEgZGlnaXRcbiAgICAgICAgICAgIGlmICg0IDw9IG51bWJlciAmJiBudW1iZXIgPD0gNykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDEwMCkge1xuICAgICAgICAgICAgLy8gMiBkaWdpdHNcbiAgICAgICAgICAgIHZhciBsYXN0RGlnaXQgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBmaXJzdERpZ2l0ID0gbnVtYmVyIC8gMTA7XG4gICAgICAgICAgICBpZiAobGFzdERpZ2l0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihmaXJzdERpZ2l0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobGFzdERpZ2l0KTtcbiAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCAxMDAwMCkge1xuICAgICAgICAgICAgLy8gMyBvciA0IGRpZ2l0cyAtLT4gcmVjdXJzaXZlbHkgY2hlY2sgZmlyc3QgZGlnaXRcbiAgICAgICAgICAgIHdoaWxlIChudW1iZXIgPj0gMTApIHtcbiAgICAgICAgICAgICAgICBudW1iZXIgPSBudW1iZXIgLyAxMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlaWZlbGVyUmVnZWxBcHBsaWVzVG9OdW1iZXIobnVtYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFueXRoaW5nIGxhcmdlciB0aGFuIDQgZGlnaXRzOiByZWN1cnNpdmVseSBjaGVjayBmaXJzdCBuLTMgZGlnaXRzXG4gICAgICAgICAgICBudW1iZXIgPSBudW1iZXIgLyAxMDAwO1xuICAgICAgICAgICAgcmV0dXJuIGVpZmVsZXJSZWdlbEFwcGxpZXNUb051bWJlcihudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxiID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbGInLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcl9GZWJydWFyX03DpGVyel9BYnLDq2xsX01lZV9KdW5pX0p1bGlfQXVndXN0X1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0RlemVtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKYW4uX0ZlYnIuX01yei5fQWJyLl9NZWVfSnVuLl9KdWwuX0F1Zy5fU2VwdC5fT2t0Ll9Ob3YuX0Rlei4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnU29ubmRlZ19Nw6lpbmRlZ19Ew6tuc2NoZGVnX03Dq3R0d29jaF9Eb25uZXNjaGRlZ19GcmVpZGVnX1NhbXNjaGRlZycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU28uX03DqS5fRMOrLl9Nw6suX0RvLl9Gci5fU2EuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1NvX03DqV9Ew6tfTcOrX0RvX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0gW0F1ZXJdJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MgW0F1ZXJdJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tIFtBdWVyXScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0gW0F1ZXJdJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGF1dCB1bV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbTXVlciB1bV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFt1bV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tHw6tzY2h0ZXIgdW1dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gRGlmZmVyZW50IGRhdGUgc3RyaW5nIGZvciAnRMOrbnNjaGRlZycgKFR1ZXNkYXkpIGFuZCAnRG9ubmVzY2hkZWcnIChUaHVyc2RheSkgZHVlIHRvIHBob25vbG9naWNhbCBydWxlXG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbTGVzY2h0ZW5dIGRkZGQgW3VtXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tMZXNjaHRlXSBkZGRkIFt1bV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiBwcm9jZXNzRnV0dXJlVGltZSxcbiAgICAgICAgICAgIHBhc3Q6IHByb2Nlc3NQYXN0VGltZSxcbiAgICAgICAgICAgIHM6ICdlIHB1ZXIgU2Vrb25uZW4nLFxuICAgICAgICAgICAgc3M6ICclZCBTZWtvbm5lbicsXG4gICAgICAgICAgICBtOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgbW06ICclZCBNaW51dHRlbicsXG4gICAgICAgICAgICBoOiBwcm9jZXNzUmVsYXRpdmVUaW1lLFxuICAgICAgICAgICAgaGg6ICclZCBTdG9ubmVuJyxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogJyVkIERlZWcnLFxuICAgICAgICAgICAgTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE1NOiAnJWQgTcOpaW50JyxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogJyVkIEpvZXInLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxiO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IExhbyBbbG9dXG4vLyEgYXV0aG9yIDogUnlhbiBIYXJ0IDogaHR0cHM6Ly9naXRodWIuY29tL3J5YW5oYXJ0MlxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIGxvID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbG8nLCB7XG4gICAgICAgIG1vbnRoczogJ+C6oeC6seC6h+C6geC6reC6mV/guoHgurjguqHgup7gurJf4Lqh4Lq14LqZ4LqyX+C7gOC6oeC6quC6sl/gup7gurbgupTguqrgurDgup7gurJf4Lqh4Lq04LqW4Lq44LqZ4LqyX+C6geC7jeC6peC6sOC6geC6u+C6lF/guqrgurTguofguqvgurJf4LqB4Lqx4LqZ4LqN4LqyX+C6leC6uOC6peC6sl/gup7gurDguojgurTguoFf4LqX4Lqx4LqZ4Lqn4LqyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfguqHgurHguofguoHguq3guplf4LqB4Lq44Lqh4Lqe4LqyX+C6oeC6teC6meC6sl/gu4DguqHguqrgurJf4Lqe4Lq24LqU4Lqq4Lqw4Lqe4LqyX+C6oeC6tOC6luC6uOC6meC6sl/guoHgu43guqXgurDguoHgurvgupRf4Lqq4Lq04LqH4Lqr4LqyX+C6geC6seC6meC6jeC6sl/gupXgurjguqXgurJf4Lqe4Lqw4LqI4Lq04LqBX+C6l+C6seC6meC6p+C6sicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+C6reC6suC6l+C6tOC6lF/guojgurHguplf4Lqt4Lqx4LqH4LqE4Lqy4LqZX+C6nuC6uOC6lF/gup7gurDguqvgurHgupRf4Lqq4Lq44LqBX+C7gOC6quC6u+C6sicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+C6l+C6tOC6lF/guojgurHguplf4Lqt4Lqx4LqH4LqE4Lqy4LqZX+C6nuC6uOC6lF/gup7gurDguqvgurHgupRf4Lqq4Lq44LqBX+C7gOC6quC6u+C6sicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgupdf4LqIX+C6reC6hF/gup5f4Lqe4LqrX+C6quC6gV/guqonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAn4Lqn4Lqx4LqZZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gupXguq3gupngu4Dguorgurvgu4ngurJ84LqV4Lqt4LqZ4LuB4Lql4LqHLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfgupXguq3gupngu4HguqXguocnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LqV4Lqt4LqZ4LuA4LqK4Lq74LuJ4LqyJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgupXguq3gupngu4HguqXguocnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vguqHgurfgu4ngupngurXgu4ngu4DguqfguqXgurJdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4Lqh4Lq34LuJ4Lqt4Lq34LuI4LqZ4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vguqfgurHgupldZGRkZFvgu5zgu4ngurLgu4DguqfguqXgurJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4Lqh4Lq34LuJ4Lqn4Lqy4LqZ4LqZ4Lq14LuJ4LuA4Lqn4Lql4LqyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vguqfgurHgupldZGRkZFvgu4HguqXgu4nguqfgupngurXgu4ngu4DguqfguqXgurJdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn4Lqt4Lq14LqBICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+C6nOC7iOC6suC6meC6oeC6sicsXG4gICAgICAgICAgICBzOiAn4Lqa4LuN4LuI4LuA4LqX4Lq74LuI4Lqy4LuD4LqU4Lqn4Lq04LqZ4Lqy4LqX4Lq1JyxcbiAgICAgICAgICAgIHNzOiAnJWQg4Lqn4Lq04LqZ4Lqy4LqX4Lq1JyxcbiAgICAgICAgICAgIG06ICcxIOC6meC6suC6l+C6tScsXG4gICAgICAgICAgICBtbTogJyVkIOC6meC6suC6l+C6tScsXG4gICAgICAgICAgICBoOiAnMSDguorgurvgu4jguqfgu4LguqHguocnLFxuICAgICAgICAgICAgaGg6ICclZCDguorgurvgu4jguqfgu4LguqHguocnLFxuICAgICAgICAgICAgZDogJzEg4Lqh4Lq34LuJJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4Lqh4Lq34LuJJyxcbiAgICAgICAgICAgIE06ICcxIOC7gOC6lOC6t+C6reC6mScsXG4gICAgICAgICAgICBNTTogJyVkIOC7gOC6lOC6t+C6reC6mScsXG4gICAgICAgICAgICB5OiAnMSDgupvgurUnLFxuICAgICAgICAgICAgeXk6ICclZCDgupvgurUnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvKOC6l+C6teC7iClcXGR7MSwyfS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAn4LqX4Lq14LuIJyArIG51bWJlcjtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBsbztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBMaXRodWFuaWFuIFtsdF1cbi8vISBhdXRob3IgOiBNaW5kYXVnYXMgTW96xatyYXMgOiBodHRwczovL2dpdGh1Yi5jb20vbW1venVyYXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB1bml0cyA9IHtcbiAgICAgICAgc3M6ICdzZWt1bmTEl19zZWt1bmTFvmnFs19zZWt1bmRlcycsXG4gICAgICAgIG06ICdtaW51dMSXX21pbnV0xJdzX21pbnV0xJknLFxuICAgICAgICBtbTogJ21pbnV0xJdzX21pbnXEjWnFs19taW51dGVzJyxcbiAgICAgICAgaDogJ3ZhbGFuZGFfdmFsYW5kb3NfdmFsYW5kxIUnLFxuICAgICAgICBoaDogJ3ZhbGFuZG9zX3ZhbGFuZMWzX3ZhbGFuZGFzJyxcbiAgICAgICAgZDogJ2RpZW5hX2RpZW5vc19kaWVuxIUnLFxuICAgICAgICBkZDogJ2RpZW5vc19kaWVuxbNfZGllbmFzJyxcbiAgICAgICAgTTogJ23El251b19txJduZXNpb19txJduZXPErycsXG4gICAgICAgIE1NOiAnbcSXbmVzaWFpX23El25lc2nFs19txJduZXNpdXMnLFxuICAgICAgICB5OiAnbWV0YWlfbWV0xbNfbWV0dXMnLFxuICAgICAgICB5eTogJ21ldGFpX21ldMWzX21ldHVzJyxcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVNlY29uZHMobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIGlmICh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gJ2tlbGlvcyBzZWt1bmTEl3MnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzRnV0dXJlID8gJ2tlbGnFsyBzZWt1bmTFvmnFsycgOiAna2VsaWFzIHNla3VuZGVzJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVTaW5ndWxhcihudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXhcbiAgICAgICAgICAgID8gZm9ybXMoa2V5KVswXVxuICAgICAgICAgICAgOiBpc0Z1dHVyZVxuICAgICAgICAgICAgICA/IGZvcm1zKGtleSlbMV1cbiAgICAgICAgICAgICAgOiBmb3JtcyhrZXkpWzJdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzcGVjaWFsKG51bWJlcikge1xuICAgICAgICByZXR1cm4gbnVtYmVyICUgMTAgPT09IDAgfHwgKG51bWJlciA+IDEwICYmIG51bWJlciA8IDIwKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZm9ybXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB1bml0c1trZXldLnNwbGl0KCdfJyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciArICcgJztcbiAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICByZXN1bHQgKyB0cmFuc2xhdGVTaW5ndWxhcihudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleVswXSwgaXNGdXR1cmUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoc3BlY2lhbChudW1iZXIpID8gZm9ybXMoa2V5KVsxXSA6IGZvcm1zKGtleSlbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIGZvcm1zKGtleSlbMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoc3BlY2lhbChudW1iZXIpID8gZm9ybXMoa2V5KVsxXSA6IGZvcm1zKGtleSlbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBsdCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ2x0Jywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ3NhdXNpb192YXNhcmlvX2tvdm9fYmFsYW5kxb5pb19nZWd1xb7El3NfYmlyxb5lbGlvX2xpZXBvc19ydWdwasWrxI1pb19ydWdzxJdqb19zcGFsaW9fbGFwa3JpxI1pb19ncnVvZMW+aW8nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ3NhdXNpc192YXNhcmlzX2tvdmFzX2JhbGFuZGlzX2dlZ3XFvsSXX2JpcsW+ZWxpc19saWVwYV9ydWdwasWrdGlzX3J1Z3PEl2ppc19zcGFsaXNfbGFwa3JpdGlzX2dydW9kaXMnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9EW29EXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK01NTU0/fE1NTU0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStEW29EXT8vLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDogJ3NhdV92YXNfa292X2JhbF9nZWdfYmlyX2xpZV9yZ3BfcmdzX3NwYV9sYXBfZ3JkJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czoge1xuICAgICAgICAgICAgZm9ybWF0OiAnc2VrbWFkaWVuxK9fcGlybWFkaWVuxK9fYW50cmFkaWVuxK9fdHJlxI1pYWRpZW7Er19rZXR2aXJ0YWRpZW7Er19wZW5rdGFkaWVuxK9fxaFlxaF0YWRpZW7Erycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAnc2VrbWFkaWVuaXNfcGlybWFkaWVuaXNfYW50cmFkaWVuaXNfdHJlxI1pYWRpZW5pc19rZXR2aXJ0YWRpZW5pc19wZW5rdGFkaWVuaXNfxaFlxaF0YWRpZW5pcycuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBpc0Zvcm1hdDogL2RkZGQgSEg6bW0vLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnU2VrX1Bpcl9BbnRfVHJlX0tldF9QZW5fxaBlxaEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnU19QX0FfVF9LX1BuX8WgJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dJyxcbiAgICAgICAgICAgIExMTDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXSwgSEg6bW0gW3ZhbC5dJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0sIGRkZGQsIEhIOm1tIFt2YWwuXScsXG4gICAgICAgICAgICBsOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBsbDogJ1lZWVkgW20uXSBNTU1NIEQgW2QuXScsXG4gICAgICAgICAgICBsbGw6ICdZWVlZIFttLl0gTU1NTSBEIFtkLl0sIEhIOm1tIFt2YWwuXScsXG4gICAgICAgICAgICBsbGxsOiAnWVlZWSBbbS5dIE1NTU0gRCBbZC5dLCBkZGQsIEhIOm1tIFt2YWwuXScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW8WgaWFuZGllbl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tSeXRval0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbVmFrYXJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW1ByYcSXanVzxK9dIGRkZGQgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdwbyAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJpZcWhICVzJyxcbiAgICAgICAgICAgIHM6IHRyYW5zbGF0ZVNlY29uZHMsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlU2luZ3VsYXIsXG4gICAgICAgICAgICBtbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRlU2luZ3VsYXIsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRlU2luZ3VsYXIsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRlU2luZ3VsYXIsXG4gICAgICAgICAgICBNTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRlU2luZ3VsYXIsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tb2ppLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICctb2ppJztcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGx0O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IExhdHZpYW4gW2x2XVxuLy8hIGF1dGhvciA6IEtyaXN0YXBzIEthcmxzb25zIDogaHR0cHM6Ly9naXRodWIuY29tL3NrYWtyaVxuLy8hIGF1dGhvciA6IErEgW5pcyBFbG1lcmlzIDogaHR0cHM6Ly9naXRodWIuY29tL0phbmlzRVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHVuaXRzID0ge1xuICAgICAgICBzczogJ3Nla3VuZGVzX3Nla3VuZMSTbV9zZWt1bmRlX3Nla3VuZGVzJy5zcGxpdCgnXycpLFxuICAgICAgICBtOiAnbWluxat0ZXNfbWluxat0xJNtX21pbsWrdGVfbWluxat0ZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1tOiAnbWluxat0ZXNfbWluxat0xJNtX21pbsWrdGVfbWluxat0ZXMnLnNwbGl0KCdfJyksXG4gICAgICAgIGg6ICdzdHVuZGFzX3N0dW5kxIFtX3N0dW5kYV9zdHVuZGFzJy5zcGxpdCgnXycpLFxuICAgICAgICBoaDogJ3N0dW5kYXNfc3R1bmTEgW1fc3R1bmRhX3N0dW5kYXMnLnNwbGl0KCdfJyksXG4gICAgICAgIGQ6ICdkaWVuYXNfZGllbsSBbV9kaWVuYV9kaWVuYXMnLnNwbGl0KCdfJyksXG4gICAgICAgIGRkOiAnZGllbmFzX2RpZW7EgW1fZGllbmFfZGllbmFzJy5zcGxpdCgnXycpLFxuICAgICAgICBNOiAnbcSTbmXFoWFfbcSTbmXFoWllbV9txJNuZXNpc19txJNuZcWhaScuc3BsaXQoJ18nKSxcbiAgICAgICAgTU06ICdtxJNuZcWhYV9txJNuZcWhaWVtX23Ek25lc2lzX23Ek25lxaFpJy5zcGxpdCgnXycpLFxuICAgICAgICB5OiAnZ2FkYV9nYWRpZW1fZ2Fkc19nYWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB5eTogJ2dhZGFfZ2FkaWVtX2dhZHNfZ2FkaScuc3BsaXQoJ18nKSxcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB3aXRob3V0U3VmZml4IGJvb2xlYW4gdHJ1ZSA9IGEgbGVuZ3RoIG9mIHRpbWU7IGZhbHNlID0gYmVmb3JlL2FmdGVyIGEgcGVyaW9kIG9mIHRpbWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ybWF0KGZvcm1zLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgICAgIC8vIEUuZy4gXCIyMSBtaW7Fq3RlXCIsIFwiMyBtaW7Fq3Rlc1wiLlxuICAgICAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAxICYmIG51bWJlciAlIDEwMCAhPT0gMTEgPyBmb3Jtc1syXSA6IGZvcm1zWzNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRS5nLiBcIjIxIG1pbsWrdGVzXCIgYXMgaW4gXCJwxJNjIDIxIG1pbsWrdGVzXCIuXG4gICAgICAgICAgICAvLyBFLmcuIFwiMyBtaW7Fq3TEk21cIiBhcyBpbiBcInDEk2MgMyBtaW7Fq3TEk21cIi5cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgJSAxMCA9PT0gMSAmJiBudW1iZXIgJSAxMDAgIT09IDExID8gZm9ybXNbMF0gOiBmb3Jtc1sxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyBmb3JtYXQodW5pdHNba2V5XSwgbnVtYmVyLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQodW5pdHNba2V5XSwgbnVtYmVyLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsYXRpdmVTZWNvbmRzKG51bWJlciwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdkYcW+YXMgc2VrdW5kZXMnIDogJ2Rhxb7EgW0gc2VrdW5kxJNtJztcbiAgICB9XG5cbiAgICB2YXIgbHYgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdsdicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudsSBcmlzX2ZlYnJ1xIFyaXNfbWFydHNfYXByxKtsaXNfbWFpanNfasWrbmlqc19qxatsaWpzX2F1Z3VzdHNfc2VwdGVtYnJpc19va3RvYnJpc19ub3ZlbWJyaXNfZGVjZW1icmlzJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ2phbl9mZWJfbWFyX2Fwcl9tYWlfasWrbl9qxatsX2F1Z19zZXBfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3N2xJN0ZGllbmFfcGlybWRpZW5hX290cmRpZW5hX3RyZcWhZGllbmFfY2V0dXJ0ZGllbmFfcGlla3RkaWVuYV9zZXN0ZGllbmEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N2X1BfT19UX0NfUGtfUycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTdl9QX09fVF9DX1BrX1MnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVkuJyxcbiAgICAgICAgICAgIExMOiAnWVlZWS4gW2dhZGFdIEQuIE1NTU0nLFxuICAgICAgICAgICAgTExMOiAnWVlZWS4gW2dhZGFdIEQuIE1NTU0sIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdZWVlZLiBbZ2FkYV0gRC4gTU1NTSwgZGRkZCwgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vFoG9kaWVuIHB1bGtzdGVuXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1LEq3QgcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbVmFrYXIgcHVsa3N0ZW5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW1BhZ8SBanXFocSBXSBkZGRkIFtwdWxrc3Rlbl0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdwxJNjICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwaXJtcyAlcycsXG4gICAgICAgICAgICBzOiByZWxhdGl2ZVNlY29uZHMsXG4gICAgICAgICAgICBzczogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG06IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaDogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgaGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkOiByZWxhdGl2ZVRpbWVXaXRoU2luZ3VsYXIsXG4gICAgICAgICAgICBkZDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE06IHJlbGF0aXZlVGltZVdpdGhTaW5ndWxhcixcbiAgICAgICAgICAgIE1NOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeTogcmVsYXRpdmVUaW1lV2l0aFNpbmd1bGFyLFxuICAgICAgICAgICAgeXk6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbHY7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTW9udGVuZWdyaW4gW21lXVxuLy8hIGF1dGhvciA6IE1pb2RyYWcgTmlrYcSNIDxtaW9kcmFnQHJlc3RhcnRpdC5tZT4gOiBodHRwczovL2dpdGh1Yi5jb20vbWlvZHJhZ25pa2FjXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdHJhbnNsYXRvciA9IHtcbiAgICAgICAgd29yZHM6IHtcbiAgICAgICAgICAgIC8vRGlmZmVyZW50IGdyYW1tYXRpY2FsIGNhc2VzXG4gICAgICAgICAgICBzczogWydzZWt1bmQnLCAnc2VrdW5kYScsICdzZWt1bmRpJ10sXG4gICAgICAgICAgICBtOiBbJ2plZGFuIG1pbnV0JywgJ2plZG5vZyBtaW51dGEnXSxcbiAgICAgICAgICAgIG1tOiBbJ21pbnV0JywgJ21pbnV0YScsICdtaW51dGEnXSxcbiAgICAgICAgICAgIGg6IFsnamVkYW4gc2F0JywgJ2plZG5vZyBzYXRhJ10sXG4gICAgICAgICAgICBoaDogWydzYXQnLCAnc2F0YScsICdzYXRpJ10sXG4gICAgICAgICAgICBkZDogWydkYW4nLCAnZGFuYScsICdkYW5hJ10sXG4gICAgICAgICAgICBNTTogWydtamVzZWMnLCAnbWplc2VjYScsICdtamVzZWNpJ10sXG4gICAgICAgICAgICB5eTogWydnb2RpbmEnLCAnZ29kaW5lJywgJ2dvZGluYSddLFxuICAgICAgICB9LFxuICAgICAgICBjb3JyZWN0R3JhbW1hdGljYWxDYXNlOiBmdW5jdGlvbiAobnVtYmVyLCB3b3JkS2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyID09PSAxXG4gICAgICAgICAgICAgICAgPyB3b3JkS2V5WzBdXG4gICAgICAgICAgICAgICAgOiBudW1iZXIgPj0gMiAmJiBudW1iZXIgPD0gNFxuICAgICAgICAgICAgICAgICAgPyB3b3JkS2V5WzFdXG4gICAgICAgICAgICAgICAgICA6IHdvcmRLZXlbMl07XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgICAgICB2YXIgd29yZEtleSA9IHRyYW5zbGF0b3Iud29yZHNba2V5XTtcbiAgICAgICAgICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyB3b3JkS2V5WzBdIDogd29yZEtleVsxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyICtcbiAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRvci5jb3JyZWN0R3JhbW1hdGljYWxDYXNlKG51bWJlciwgd29yZEtleSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG5cbiAgICB2YXIgbWUgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtZScsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFydF9hcHJpbF9tYWpfanVuX2p1bF9hdmd1c3Rfc2VwdGVtYmFyX29rdG9iYXJfbm92ZW1iYXJfZGVjZW1iYXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tYXIuX2Fwci5fbWFqX2p1bl9qdWxfYXZnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGplbGphX3BvbmVkamVsamFrX3V0b3Jha19zcmlqZWRhX8SNZXR2cnRha19wZXRha19zdWJvdGEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICduZWQuX3Bvbi5fdXRvLl9zcmkuX8SNZXQuX3BldC5fc3ViLicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb191dF9zcl/EjWVfcGVfc3UnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmFzIHVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc2p1dHJhIHVdIExUJyxcblxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW25lZGplbGp1XSBbdV0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t1XSBbc3JpamVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2p1xI1lIHVdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RXZWVrRGF5cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbbmVkamVsamVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFtwb25lZGplbGprYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3V0b3JrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbc3JpamVkZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW8SNZXR2cnRrYV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3BldGthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbGVdIFtzdWJvdGVdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFdlZWtEYXlzW3RoaXMuZGF5KCldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3ByaWplICVzJyxcbiAgICAgICAgICAgIHM6ICduZWtvbGlrbyBzZWt1bmRpJyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiAnZGFuJyxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06ICdtamVzZWMnLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogJ2dvZGludScsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFvcmkgW21pXVxuLy8hIGF1dGhvciA6IEpvaG4gQ29ycmlnYW4gPHJvYmJpZWNsb3NldEBnbWFpbC5jb20+IDogaHR0cHM6Ly9naXRodWIuY29tL2pvaG5pZGVhbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1pID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbWknLCB7XG4gICAgICAgIG1vbnRoczogJ0tvaGktdMSBdGVfSHVpLXRhbmd1cnVfUG91dMWrLXRlLXJhbmdpX1BhZW5nYS13aMSBd2jEgV9IYXJhdHVhX1BpcGlyaV9IxY1uZ29pbmdvaV9IZXJlLXR1cmkta8WNa8SBX01haHVydV9XaGlyaW5nYS3EgS1udWt1X1doaXJpbmdhLcSBLXJhbmdpX0hha2loZWEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ0tvaGlfSHVpX1BvdV9QYWVfSGFyYV9QaXBpX0jFjW5nb2lfSGVyZV9NYWh1X1doaS1udV9XaGktcmFfSGFraScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNSZWdleDogLyg/OlsnYS16XFx1MDEwMVxcdTAxNERcXHUwMTZCXStcXC0/KXsxLDN9L2ksXG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OiAvKD86WydhLXpcXHUwMTAxXFx1MDE0RFxcdTAxNkJdK1xcLT8pezEsM30vaSxcbiAgICAgICAgbW9udGhzU2hvcnRSZWdleDogLyg/OlsnYS16XFx1MDEwMVxcdTAxNERcXHUwMTZCXStcXC0/KXsxLDN9L2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6IC8oPzpbJ2EtelxcdTAxMDFcXHUwMTREXFx1MDE2Ql0rXFwtPyl7MSwyfS9pLFxuICAgICAgICB3ZWVrZGF5czogJ1LEgXRhcHVfTWFuZV9UxatyZWlfV2VuZXJlaV9UxIFpdGVfUGFyYWlyZV9IxIF0YXJlaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1RhX01hX1TFq19XZV9UxIFpX1BhX0jEgScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdUYV9NYV9UxatfV2VfVMSBaV9QYV9IxIEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgW2ldIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBbaV0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tpIHRlaWUgbWFoYW5hLCBpXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2Fwb3BvIGldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbaV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpbmFuYWhpIGldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbd2hha2FtdXR1bmdhIGldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnaSByb3RvIGkgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGkgbXVhJyxcbiAgICAgICAgICAgIHM6ICd0ZSBoxJNrb25hIHJ1YXJ1YScsXG4gICAgICAgICAgICBzczogJyVkIGjEk2tvbmEnLFxuICAgICAgICAgICAgbTogJ2hlIG1lbmV0aScsXG4gICAgICAgICAgICBtbTogJyVkIG1lbmV0aScsXG4gICAgICAgICAgICBoOiAndGUgaGFvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBoYW9yYScsXG4gICAgICAgICAgICBkOiAnaGUgcmEnLFxuICAgICAgICAgICAgZGQ6ICclZCByYScsXG4gICAgICAgICAgICBNOiAnaGUgbWFyYW1hJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbWFyYW1hJyxcbiAgICAgICAgICAgIHk6ICdoZSB0YXUnLFxuICAgICAgICAgICAgeXk6ICclZCB0YXUnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3Cui8sXG4gICAgICAgIG9yZGluYWw6ICclZMK6JyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1pO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hY2Vkb25pYW4gW21rXVxuLy8hIGF1dGhvciA6IEJvcmlzbGF2IE1pY2tvdiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9CMGswXG4vLyEgYXV0aG9yIDogU2FzaGtvIFRvZG9yb3YgOiBodHRwczovL2dpdGh1Yi5jb20vYmt5Y2VoXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbWsgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtaycsIHtcbiAgICAgICAgbW9udGhzOiAn0ZjQsNC90YPQsNGA0Lhf0YTQtdCy0YDRg9Cw0YDQuF/QvNCw0YDRgl/QsNC/0YDQuNC7X9C80LDRmF/RmNGD0L3QuF/RmNGD0LvQuF/QsNCy0LPRg9GB0YJf0YHQtdC/0YLQtdC80LLRgNC4X9C+0LrRgtC+0LzQstGA0Lhf0L3QvtC10LzQstGA0Lhf0LTQtdC60LXQvNCy0YDQuCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfRmNCw0L1f0YTQtdCyX9C80LDRgF/QsNC/0YBf0LzQsNGYX9GY0YPQvV/RmNGD0Ltf0LDQstCzX9GB0LXQv1/QvtC60YJf0L3QvtC1X9C00LXQuicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfQvdC10LTQtdC70LBf0L/QvtC90LXQtNC10LvQvdC40Lpf0LLRgtC+0YDQvdC40Lpf0YHRgNC10LTQsF/Rh9C10YLQstGA0YLQvtC6X9C/0LXRgtC+0Lpf0YHQsNCx0L7RgtCwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0L3QtdC0X9C/0L7QvV/QstGC0L5f0YHRgNC1X9GH0LXRgl/Qv9C10YJf0YHQsNCxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9C9ZV/Qv29f0LLRgl/RgdGAX9GH0LVf0L/QtV/RgWEnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnRC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9CU0LXQvdC10YEg0LLQvl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQo9GC0YDQtSDQstC+XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vQktC+XSBkZGRkIFvQstC+XSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9CS0YfQtdGA0LAg0LLQvl0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CY0LfQvNC40L3QsNGC0LDRgtCwXSBkZGRkIFvQstC+XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CY0LfQvNC40L3QsNGC0LjQvtGCXSBkZGRkIFvQstC+XSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0LfQsCAlcycsXG4gICAgICAgICAgICBwYXN0OiAn0L/RgNC10LQgJXMnLFxuICAgICAgICAgICAgczogJ9C90LXQutC+0LvQutGDINGB0LXQutGD0L3QtNC4JyxcbiAgICAgICAgICAgIHNzOiAnJWQg0YHQtdC60YPQvdC00LgnLFxuICAgICAgICAgICAgbTogJ9C10LTQvdCwINC80LjQvdGD0YLQsCcsXG4gICAgICAgICAgICBtbTogJyVkINC80LjQvdGD0YLQuCcsXG4gICAgICAgICAgICBoOiAn0LXQtNC10L0g0YfQsNGBJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YfQsNGB0LAnLFxuICAgICAgICAgICAgZDogJ9C10LTQtdC9INC00LXQvScsXG4gICAgICAgICAgICBkZDogJyVkINC00LXQvdCwJyxcbiAgICAgICAgICAgIE06ICfQtdC00LXQvSDQvNC10YHQtdGGJyxcbiAgICAgICAgICAgIE1NOiAnJWQg0LzQtdGB0LXRhtC4JyxcbiAgICAgICAgICAgIHk6ICfQtdC00L3QsCDQs9C+0LTQuNC90LAnLFxuICAgICAgICAgICAgeXk6ICclZCDQs9C+0LTQuNC90LgnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNC10LJ80LXQvXzRgtC4fNCy0Lh80YDQuHzQvNC4KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBsYXN0RGlnaXQgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBsYXN0MkRpZ2l0cyA9IG51bWJlciAlIDEwMDtcbiAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QtdCyJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdDJEaWdpdHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QtdC9JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdDJEaWdpdHMgPiAxMCAmJiBsYXN0MkRpZ2l0cyA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0YLQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3REaWdpdCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCy0LgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0RGlnaXQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgNC4JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdERpZ2l0ID09PSA3IHx8IGxhc3REaWdpdCA9PT0gOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC80LgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3RgtC4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1rO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hbGF5YWxhbSBbbWxdXG4vLyEgYXV0aG9yIDogRmxveWQgUGluayA6IGh0dHBzOi8vZ2l0aHViLmNvbS9mbG95ZHBpbmtcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtbCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21sJywge1xuICAgICAgICBtb250aHM6ICfgtJzgtKjgtYHgtLXgtLDgtL9f4LSr4LWG4LSs4LWN4LSw4LWB4LS14LSw4LS/X+C0ruC0vuC1vOC0muC1jeC0muC1jV/gtI/gtKrgtY3gtLDgtL/gtb1f4LSu4LWH4LSv4LWNX+C0nOC1guC1ul/gtJzgtYLgtLLgtYhf4LST4LSX4LS44LWN4LSx4LWN4LSx4LWNX+C0uOC1huC0quC1jeC0seC1jeC0seC0guC0rOC1vF/gtJLgtJXgtY3gtJ/gtYvgtKzgtbxf4LSo4LS14LSC4LSs4LW8X+C0oeC0v+C0uOC0guC0rOC1vCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4LSc4LSo4LWBLl/gtKvgtYbgtKzgtY3gtLDgtYEuX+C0ruC0vuC1vC5f4LSP4LSq4LWN4LSw4LS/Ll/gtK7gtYfgtK/gtY1f4LSc4LWC4LW6X+C0nOC1guC0suC1iC5f4LST4LSXLl/gtLjgtYbgtKrgtY3gtLHgtY3gtLEuX+C0kuC0leC1jeC0n+C1iy5f4LSo4LS14LSCLl/gtKHgtL/gtLjgtIIuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ+C0nuC0vuC0r+C0seC0vuC0tOC1jeC0ml/gtKTgtL/gtJngtY3gtJXgtLPgtL7gtLTgtY3gtJpf4LSa4LWK4LS14LWN4LS14LS+4LS04LWN4LSaX+C0rOC1geC0p+C0qOC0vuC0tOC1jeC0ml/gtLXgtY3gtK/gtL7gtLTgtL7gtLTgtY3gtJpf4LS14LWG4LSz4LWN4LSz4LS/4LSv4LS+4LS04LWN4LSaX+C0tuC0qOC0v+C0r+C0vuC0tOC1jeC0micuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4LSe4LS+4LSv4LW8X+C0pOC0v+C0meC1jeC0leC1vl/gtJrgtYrgtLXgtY3gtLVf4LSs4LWB4LSn4LW7X+C0teC1jeC0r+C0vuC0tOC0gl/gtLXgtYbgtLPgtY3gtLPgtL9f4LS24LSo4LS/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+C0nuC0vl/gtKTgtL9f4LSa4LWKX+C0rOC1gV/gtLXgtY3gtK/gtL5f4LS14LWGX+C0ticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tIC3gtKjgtYEnLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIC3gtKjgtYEnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIC3gtKjgtYEnLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0gLeC0qOC1gScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+C0h+C0qOC1jeC0qOC1jV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgtKjgtL7gtLPgtYZdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgtIfgtKjgtY3gtKjgtLLgtYZdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+C0leC0tOC0v+C0nuC1jeC0nl0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgtJXgtLTgtL/gtJ7gtY3gtJ7gtY0nLFxuICAgICAgICAgICAgcGFzdDogJyVzIOC0ruC1geC1u+C0quC1jScsXG4gICAgICAgICAgICBzOiAn4LSF4LW94LSqIOC0qOC0v+C0ruC0v+C0t+C0meC1jeC0meC1vicsXG4gICAgICAgICAgICBzczogJyVkIOC0uOC1huC0leC1jeC0leC1u+C0oeC1jScsXG4gICAgICAgICAgICBtOiAn4LSS4LSw4LWBIOC0ruC0v+C0qOC0v+C0seC1jeC0seC1jScsXG4gICAgICAgICAgICBtbTogJyVkIOC0ruC0v+C0qOC0v+C0seC1jeC0seC1jScsXG4gICAgICAgICAgICBoOiAn4LSS4LSw4LWBIOC0ruC0o+C0v+C0leC1jeC0leC1guC1vCcsXG4gICAgICAgICAgICBoaDogJyVkIOC0ruC0o+C0v+C0leC1jeC0leC1guC1vCcsXG4gICAgICAgICAgICBkOiAn4LSS4LSw4LWBIOC0puC0v+C0teC0uOC0gicsXG4gICAgICAgICAgICBkZDogJyVkIOC0puC0v+C0teC0uOC0gicsXG4gICAgICAgICAgICBNOiAn4LSS4LSw4LWBIOC0ruC0vuC0uOC0gicsXG4gICAgICAgICAgICBNTTogJyVkIOC0ruC0vuC0uOC0gicsXG4gICAgICAgICAgICB5OiAn4LSS4LSw4LWBIOC0teC1vOC0t+C0gicsXG4gICAgICAgICAgICB5eTogJyVkIOC0teC1vOC0t+C0gicsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/gtLDgtL7gtKTgtY3gtLDgtL984LSw4LS+4LS14LS/4LSy4LWGfOC0ieC0muC1jeC0miDgtJXgtLTgtL/gtJ7gtY3gtJ7gtY184LS14LWI4LSV4LWB4LSo4LWN4LSo4LWH4LSw4LSCfOC0sOC0vuC0pOC1jeC0sOC0vy9pLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKG1lcmlkaWVtID09PSAn4LSw4LS+4LSk4LWN4LSw4LS/JyAmJiBob3VyID49IDQpIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfgtIngtJrgtY3gtJog4LSV4LS04LS/4LSe4LWN4LSe4LWNJyB8fFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn4LS14LWI4LSV4LWB4LSo4LWN4LSo4LWH4LSw4LSCJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C0sOC0vuC0pOC1jeC0sOC0vyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LSw4LS+4LS14LS/4LSy4LWGJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtIngtJrgtY3gtJog4LSV4LS04LS/4LSe4LWN4LSe4LWNJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgtLXgtYjgtJXgtYHgtKjgtY3gtKjgtYfgtLDgtIInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C0sOC0vuC0pOC1jeC0sOC0vyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWw7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTW9uZ29saWFuIFttbl1cbi8vISBhdXRob3IgOiBKYXZraGxhbnR1Z3MgTnlhbWRvcmogOiBodHRwczovL2dpdGh1Yi5jb20vamF2a2hhYW5qN1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0YXRjdC00YXRjdC9INGB0LXQutGD0L3QtCcgOiAn0YXRjdC00YXRjdC9INGB0LXQutGD0L3QtNGL0L0nO1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg0YHQtdC60YPQvdC0JyA6ICcg0YHQtdC60YPQvdC00YvQvScpO1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICh3aXRob3V0U3VmZml4ID8gJyDQvNC40L3Rg9GCJyA6ICcg0LzQuNC90YPRgtGL0L0nKTtcbiAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg0YbQsNCzJyA6ICcg0YbQsNCz0LjQudC9Jyk7XG4gICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINOp0LTTqdGAJyA6ICcg06nQtNGA0LjQudC9Jyk7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKHdpdGhvdXRTdWZmaXggPyAnINGB0LDRgCcgOiAnINGB0LDRgNGL0L0nKTtcbiAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAod2l0aG91dFN1ZmZpeCA/ICcg0LbQuNC7JyA6ICcg0LbQuNC70LjQudC9Jyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbW4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtbicsIHtcbiAgICAgICAgbW9udGhzOiAn0J3RjdCz0LTSr9Cz0Y3RjdGAINGB0LDRgF/QpdC+0ZHRgNC00YPQs9Cw0LDRgCDRgdCw0YBf0JPRg9GA0LDQstC00YPQs9Cw0LDRgCDRgdCw0YBf0JTTqdGA06nQstC00q/Qs9GN0Y3RgCDRgdCw0YBf0KLQsNCy0LTRg9Cz0LDQsNGAINGB0LDRgF/Ql9GD0YDQs9Cw0LTRg9Cz0LDQsNGAINGB0LDRgF/QlNC+0LvQtNGD0LPQsNCw0YAg0YHQsNGAX9Cd0LDQudC80LTRg9Cz0LDQsNGAINGB0LDRgF/QldGB0LTSr9Cz0Y3RjdGAINGB0LDRgF/QkNGA0LDQstC00YPQs9Cw0LDRgCDRgdCw0YBf0JDRgNCy0LDQvSDQvdGN0LPQtNKv0LPRjdGN0YAg0YHQsNGAX9CQ0YDQstCw0L0g0YXQvtGR0YDQtNGD0LPQsNCw0YAg0YHQsNGAJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICcxINGB0LDRgF8yINGB0LDRgF8zINGB0LDRgF80INGB0LDRgF81INGB0LDRgF82INGB0LDRgF83INGB0LDRgF84INGB0LDRgF85INGB0LDRgF8xMCDRgdCw0YBfMTEg0YHQsNGAXzEyINGB0LDRgCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ9Cd0Y/QvF/QlNCw0LLQsNCwX9Cc0Y/Qs9C80LDRgF/Qm9GF0LDQs9Cy0LBf0J/Sr9GA0Y3Qsl/QkdCw0LDRgdCw0L1f0JHRj9C80LHQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9Cd0Y/QvF/QlNCw0LJf0JzRj9CzX9Cb0YXQsF/Qn9Kv0YBf0JHQsNCwX9CR0Y/QvCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfQndGPX9CU0LBf0JzRj1/Qm9GFX9Cf0q9f0JHQsF/QkdGPJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZLU1NLUREJyxcbiAgICAgICAgICAgIExMOiAnWVlZWSDQvtC90YsgTU1NTdGL0L0gRCcsXG4gICAgICAgICAgICBMTEw6ICdZWVlZINC+0L3RiyBNTU1N0YvQvSBEIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBZWVlZINC+0L3RiyBNTU1N0YvQvSBEIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9Ku06h80q7QpS9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCA9PT0gJ9Ku0KUnO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0q7TqCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0q7QpSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9Oo0L3TqdOp0LTTqdGAXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9Cc0LDRgNCz0LDQsNGIXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ1vQmNGA0Y3RhV0gZGRkZCBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9Oo0YfQuNCz0LTTqdGAXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vTqNC90LPTqdGA0YHTqdC9XSBkZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg0LTQsNGA0LDQsCcsXG4gICAgICAgICAgICBwYXN0OiAnJXMg06nQvNC906knLFxuICAgICAgICAgICAgczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgc3M6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgZGQ6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0g06nQtNOp0YAvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg06nQtNOp0YAnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbW47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFyYXRoaSBbbXJdXG4vLyEgYXV0aG9yIDogSGFyc2hhZCBLYWxlIDogaHR0cHM6Ly9naXRodWIuY29tL2thbGVodlxuLy8hIGF1dGhvciA6IFZpdmVrIEF0aGFseWUgOiBodHRwczovL2dpdGh1Yi5jb20vdm5hdGhhbHllXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+ClpycsXG4gICAgICAgICAgICAyOiAn4KWoJyxcbiAgICAgICAgICAgIDM6ICfgpaknLFxuICAgICAgICAgICAgNDogJ+ClqicsXG4gICAgICAgICAgICA1OiAn4KWrJyxcbiAgICAgICAgICAgIDY6ICfgpawnLFxuICAgICAgICAgICAgNzogJ+ClrScsXG4gICAgICAgICAgICA4OiAn4KWuJyxcbiAgICAgICAgICAgIDk6ICfgpa8nLFxuICAgICAgICAgICAgMDogJ+ClpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgpacnOiAnMScsXG4gICAgICAgICAgICAn4KWoJzogJzInLFxuICAgICAgICAgICAgJ+ClqSc6ICczJyxcbiAgICAgICAgICAgICfgpaonOiAnNCcsXG4gICAgICAgICAgICAn4KWrJzogJzUnLFxuICAgICAgICAgICAgJ+ClrCc6ICc2JyxcbiAgICAgICAgICAgICfgpa0nOiAnNycsXG4gICAgICAgICAgICAn4KWuJzogJzgnLFxuICAgICAgICAgICAgJ+Clryc6ICc5JyxcbiAgICAgICAgICAgICfgpaYnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVNcihudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIG91dHB1dCA9ICcnO1xuICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICAgICAgc3dpdGNoIChzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+CkleCkvuCkueClgCDgpLjgpYfgpJXgpILgpKYnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpLjgpYfgpJXgpILgpKYnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CklSDgpK7gpL/gpKjgpL/gpJ8nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpK7gpL/gpKjgpL/gpJ/gpYcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CklSDgpKTgpL7gpLgnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpKTgpL7gpLgnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CklSDgpKbgpL/gpLXgpLgnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpKbgpL/gpLXgpLgnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CklSDgpK7gpLngpL/gpKjgpL4nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpK7gpLngpL/gpKjgpYcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gJ+Ckj+CklSDgpLXgpLDgpY3gpLcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICclZCDgpLXgpLDgpY3gpLfgpYcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAoc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpJXgpL7gpLngpYAg4KS44KWH4KSV4KSC4KSm4KS+4KSCJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KS44KWH4KSV4KSC4KSm4KS+4KSCJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJXgpL4g4KSu4KS/4KSo4KS/4KSf4KS+JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSu4KS/4KSo4KS/4KSf4KS+4KSCJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJXgpL4g4KSk4KS+4KS44KS+JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaGgnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSk4KS+4KS44KS+4KSCJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJXgpL4g4KSm4KS/4KS14KS44KS+JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGQnOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSm4KS/4KS14KS44KS+4KSCJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJXgpL4g4KSu4KS54KS/4KSo4KWN4KSv4KS+JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KSu4KS54KS/4KSo4KWN4KSv4KS+4KSCJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICfgpI/gpJXgpL4g4KS14KSw4KWN4KS34KS+JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAnJWQg4KS14KSw4KWN4KS34KS+4KSCJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dC5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xuICAgIH1cblxuICAgIHZhciBtciA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ21yJywge1xuICAgICAgICBtb250aHM6ICfgpJzgpL7gpKjgpYfgpLXgpL7gpLDgpYBf4KSr4KWH4KSs4KWN4KSw4KWB4KS14KS+4KSw4KWAX+CkruCkvuCksOCljeCkml/gpI/gpKrgpY3gpLDgpL/gpLJf4KSu4KWHX+CknOClguCkqF/gpJzgpYHgpLLgpYhf4KSR4KSX4KS44KWN4KSfX+CkuOCkquCljeCkn+Clh+CkguCkrOCksF/gpJHgpJXgpY3gpJ/gpYvgpKzgpLBf4KSo4KWL4KS14KWN4KS54KWH4KSC4KSs4KSwX+CkoeCkv+CkuOClh+CkguCkrOCksCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4KSc4KS+4KSo4KWHLl/gpKvgpYfgpKzgpY3gpLDgpYEuX+CkruCkvuCksOCljeCkmi5f4KSP4KSq4KWN4KSw4KS/Ll/gpK7gpYcuX+CknOClguCkqC5f4KSc4KWB4KSy4KWILl/gpJHgpJcuX+CkuOCkquCljeCkn+Clh+Ckgi5f4KSR4KSV4KWN4KSf4KWLLl/gpKjgpYvgpLXgpY3gpLngpYfgpIIuX+CkoeCkv+CkuOClh+Ckgi4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICfgpLDgpLXgpL/gpLXgpL7gpLBf4KS44KWL4KSu4KS14KS+4KSwX+CkruCkguCkl+Cks+CkteCkvuCksF/gpKzgpYHgpKfgpLXgpL7gpLBf4KSX4KWB4KSw4KWC4KS14KS+4KSwX+CktuClgeCkleCljeCksOCkteCkvuCksF/gpLbgpKjgpL/gpLXgpL7gpLAnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfgpLDgpLXgpL9f4KS44KWL4KSuX+CkruCkguCkl+Cks1/gpKzgpYHgpKdf4KSX4KWB4KSw4KWCX+CktuClgeCkleCljeCksF/gpLbgpKjgpL8nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4KSwX+CkuOCli1/gpK7gpIJf4KSs4KWBX+Ckl+ClgV/gpLbgpYFf4KS2Jy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdBIGg6bW0g4KS14KS+4KSc4KSk4KS+JyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcyDgpLXgpL7gpJzgpKTgpL4nLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQSBoOm1tIOCkteCkvuCknOCkpOCkvicsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEEgaDptbSDgpLXgpL7gpJzgpKTgpL4nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgpIbgpJxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4KSJ4KSm4KWN4KSv4KS+XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KSV4KS+4KSyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgpK7gpL7gpJfgpYDgpLJdIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPgpK7gpKfgpY3gpK/gpYcnLFxuICAgICAgICAgICAgcGFzdDogJyVz4KSq4KWC4KSw4KWN4KS14KWAJyxcbiAgICAgICAgICAgIHM6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgc3M6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgbTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBoOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIGhoOiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIGQ6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZU1yLFxuICAgICAgICAgICAgTTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lTXIsXG4gICAgICAgICAgICB5OiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVNcixcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvW+Clp+ClqOClqeClquClq+ClrOClreClruClr+Clpl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlck1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXGQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE1hcFttYXRjaF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CkquCkueCkvuCkn+Clh3zgpLjgpJXgpL7gpLPgpYB84KSm4KWB4KSq4KS+4KSw4KWAfOCkuOCkvuCkr+CkguCkleCkvuCks+ClgHzgpLDgpL7gpKTgpY3gpLDgpYAvLFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICfgpKrgpLngpL7gpJ/gpYcnIHx8IG1lcmlkaWVtID09PSAn4KS44KSV4KS+4KSz4KWAJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+CkpuClgeCkquCkvuCksOClgCcgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+CkuOCkvuCkr+CkguCkleCkvuCks+ClgCcgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ+CksOCkvuCkpOCljeCksOClgCdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEyID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyID49IDAgJiYgaG91ciA8IDYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkquCkueCkvuCkn+Clhyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KS44KSV4KS+4KSz4KWAJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKbgpYHgpKrgpL7gpLDgpYAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOCkvuCkr+CkguCkleCkvuCks+ClgCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSk4KWN4KSw4KWAJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1yO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hbGF5IFttcy1teV1cbi8vISBub3RlIDogREVQUkVDQVRFRCwgdGhlIGNvcnJlY3Qgb25lIGlzIFttc11cbi8vISBhdXRob3IgOiBXZWxkYW4gSmFtaWxpIDogaHR0cHM6Ly9naXRodWIuY29tL3dlbGRhblxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1zTXkgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtcy1teScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyaV9GZWJydWFyaV9NYWNfQXByaWxfTWVpX0p1bl9KdWxhaV9PZ29zX1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0Rpc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFjX0Fwcl9NZWlfSnVuX0p1bF9PZ3NfU2VwX09rdF9Ob3ZfRGlzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0FoYWRfSXNuaW5fU2VsYXNhX1JhYnVfS2hhbWlzX0p1bWFhdF9TYWJ0dScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0FoZF9Jc25fU2VsX1JhYl9LaGFfSnVtX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdBaF9Jc19TbF9SYl9LbV9KbV9TYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEgubW0nLFxuICAgICAgICAgICAgTFRTOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL3BhZ2l8dGVuZ2FoYXJpfHBldGFuZ3xtYWxhbS8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ3BhZ2knKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAndGVuZ2FoYXJpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdwZXRhbmcnIHx8IG1lcmlkaWVtID09PSAnbWFsYW0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BhZ2knO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd0ZW5nYWhhcmknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdwZXRhbmcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21hbGFtJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGFyaSBpbmkgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRXNvayBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tLZWxtYXJpbiBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtsZXBhcyBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkYWxhbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgeWFuZyBsZXBhcycsXG4gICAgICAgICAgICBzOiAnYmViZXJhcGEgc2FhdCcsXG4gICAgICAgICAgICBzczogJyVkIHNhYXQnLFxuICAgICAgICAgICAgbTogJ3NlbWluaXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW5pdCcsXG4gICAgICAgICAgICBoOiAnc2VqYW0nLFxuICAgICAgICAgICAgaGg6ICclZCBqYW0nLFxuICAgICAgICAgICAgZDogJ3NlaGFyaScsXG4gICAgICAgICAgICBkZDogJyVkIGhhcmknLFxuICAgICAgICAgICAgTTogJ3NlYnVsYW4nLFxuICAgICAgICAgICAgTU06ICclZCBidWxhbicsXG4gICAgICAgICAgICB5OiAnc2V0YWh1bicsXG4gICAgICAgICAgICB5eTogJyVkIHRhaHVuJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1zTXk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTWFsYXkgW21zXVxuLy8hIGF1dGhvciA6IFdlbGRhbiBKYW1pbGkgOiBodHRwczovL2dpdGh1Yi5jb20vd2VsZGFuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbXMgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdtcycsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyaV9GZWJydWFyaV9NYWNfQXByaWxfTWVpX0p1bl9KdWxhaV9PZ29zX1NlcHRlbWJlcl9Pa3RvYmVyX05vdmVtYmVyX0Rpc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFjX0Fwcl9NZWlfSnVuX0p1bF9PZ3NfU2VwX09rdF9Ob3ZfRGlzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0FoYWRfSXNuaW5fU2VsYXNhX1JhYnVfS2hhbWlzX0p1bWFhdF9TYWJ0dScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0FoZF9Jc25fU2VsX1JhYl9LaGFfSnVtX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdBaF9Jc19TbF9SYl9LbV9KbV9TYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEgubW0nLFxuICAgICAgICAgICAgTFRTOiAnSEgubW0uc3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBbcHVrdWxdIEhILm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL3BhZ2l8dGVuZ2FoYXJpfHBldGFuZ3xtYWxhbS8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ3BhZ2knKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAndGVuZ2FoYXJpJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdwZXRhbmcnIHx8IG1lcmlkaWVtID09PSAnbWFsYW0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3BhZ2knO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd0ZW5nYWhhcmknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdwZXRhbmcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21hbGFtJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSGFyaSBpbmkgcHVrdWxdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRXNvayBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tLZWxtYXJpbiBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtsZXBhcyBwdWt1bF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdkYWxhbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgeWFuZyBsZXBhcycsXG4gICAgICAgICAgICBzOiAnYmViZXJhcGEgc2FhdCcsXG4gICAgICAgICAgICBzczogJyVkIHNhYXQnLFxuICAgICAgICAgICAgbTogJ3NlbWluaXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW5pdCcsXG4gICAgICAgICAgICBoOiAnc2VqYW0nLFxuICAgICAgICAgICAgaGg6ICclZCBqYW0nLFxuICAgICAgICAgICAgZDogJ3NlaGFyaScsXG4gICAgICAgICAgICBkZDogJyVkIGhhcmknLFxuICAgICAgICAgICAgTTogJ3NlYnVsYW4nLFxuICAgICAgICAgICAgTU06ICclZCBidWxhbicsXG4gICAgICAgICAgICB5OiAnc2V0YWh1bicsXG4gICAgICAgICAgICB5eTogJyVkIHRhaHVuJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1zO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IE1hbHRlc2UgKE1hbHRhKSBbbXRdXG4vLyEgYXV0aG9yIDogQWxlc3NhbmRybyBNYXJ1Y2NpYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGVzbWFcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtdCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ210Jywge1xuICAgICAgICBtb250aHM6ICdKYW5uYXJfRnJhcl9NYXJ6dV9BcHJpbF9NZWpqdV/EoHVuanVfTHVsanVfQXd3aXNzdV9TZXR0ZW1icnVfT3R0dWJydV9Ob3ZlbWJydV9EacSLZW1icnUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0ZyYV9NYXJfQXByX01lal/EoHVuX0x1bF9Bd3dfU2V0X090dF9Ob3ZfRGnEiycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6XG4gICAgICAgICAgICAnSWwtxKZhZGRfSXQtVG5lam5fSXQtVGxpZXRhX0wtRXJiZ8SnYV9JbC3EpmFtaXNfSWwtxKBpbWfEp2FfSXMtU2lidCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnxKZhZF9UbmVfVGxpX0VyYl/EpmFtX8SgaW1fU2liJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ8SmYV9Ubl9UbF9Fcl/EpmFfxKBpX1NpJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0lsbHVtIGZpbC1dTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tHxKdhZGEgZmlsLV1MVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2ZpbC1dTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJbC1iaWVyYcSnIGZpbC1dTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFtsaSBnxKdhZGRhXSBbZmlsLV1MVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ2bigJkgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGlsdScsXG4gICAgICAgICAgICBzOiAnZnRpdCBzZWtvbmRpJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vrb25kaScsXG4gICAgICAgICAgICBtOiAnbWludXRhJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRpJyxcbiAgICAgICAgICAgIGg6ICdzaWVnxKdhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgc2llZ8SnYXQnLFxuICAgICAgICAgICAgZDogJ8ShdXJuYXRhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgxKFyYW5ldCcsXG4gICAgICAgICAgICBNOiAneGFoYXInLFxuICAgICAgICAgICAgTU06ICclZCB4aHVyJyxcbiAgICAgICAgICAgIHk6ICdzZW5hJyxcbiAgICAgICAgICAgIHl5OiAnJWQgc25pJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9wrovLFxuICAgICAgICBvcmRpbmFsOiAnJWTCuicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBtdDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBCdXJtZXNlIFtteV1cbi8vISBhdXRob3IgOiBTcXVhciB0ZWFtLCBteXNxdWFyLmNvbVxuLy8hIGF1dGhvciA6IERhdmlkIFJvc3NlbGxhdCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9naG9sYWRyXG4vLyEgYXV0aG9yIDogVGluIEF1bmcgTGluIDogaHR0cHM6Ly9naXRodWIuY29tL3RoYW55YXd6aW5taW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBzeW1ib2xNYXAgPSB7XG4gICAgICAgICAgICAxOiAn4YGBJyxcbiAgICAgICAgICAgIDI6ICfhgYInLFxuICAgICAgICAgICAgMzogJ+GBgycsXG4gICAgICAgICAgICA0OiAn4YGEJyxcbiAgICAgICAgICAgIDU6ICfhgYUnLFxuICAgICAgICAgICAgNjogJ+GBhicsXG4gICAgICAgICAgICA3OiAn4YGHJyxcbiAgICAgICAgICAgIDg6ICfhgYgnLFxuICAgICAgICAgICAgOTogJ+GBiScsXG4gICAgICAgICAgICAwOiAn4YGAJyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyTWFwID0ge1xuICAgICAgICAgICAgJ+GBgSc6ICcxJyxcbiAgICAgICAgICAgICfhgYInOiAnMicsXG4gICAgICAgICAgICAn4YGDJzogJzMnLFxuICAgICAgICAgICAgJ+GBhCc6ICc0JyxcbiAgICAgICAgICAgICfhgYUnOiAnNScsXG4gICAgICAgICAgICAn4YGGJzogJzYnLFxuICAgICAgICAgICAgJ+GBhyc6ICc3JyxcbiAgICAgICAgICAgICfhgYgnOiAnOCcsXG4gICAgICAgICAgICAn4YGJJzogJzknLFxuICAgICAgICAgICAgJ+GBgCc6ICcwJyxcbiAgICAgICAgfTtcblxuICAgIHZhciBteSA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ215Jywge1xuICAgICAgICBtb250aHM6ICfhgIfhgJThgLrhgJThgJ3hgKvhgJvhgK5f4YCW4YCx4YCW4YCx4YCs4YC64YCd4YCr4YCb4YCuX+GAmeGAkOGAul/hgKfhgJXhgLzhgK5f4YCZ4YCxX+GAh+GAveGAlOGAul/hgIfhgLDhgJzhgK3hgK/hgIThgLpf4YCe4YC84YCC4YCv4YCQ4YC6X+GAheGAgOGAuuGAkOGAhOGAuuGAmOGArF/hgKHhgLHhgKzhgIDhgLrhgJDhgK3hgK/hgJjhgKxf4YCU4YCt4YCv4YCd4YCE4YC64YCY4YCsX+GAkuGAruGAh+GAhOGAuuGAmOGArCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfhgIfhgJThgLpf4YCW4YCxX+GAmeGAkOGAul/hgJXhgLzhgK5f4YCZ4YCxX+GAh+GAveGAlOGAul/hgJzhgK3hgK/hgIThgLpf4YCe4YC8X+GAheGAgOGAul/hgKHhgLHhgKzhgIDhgLpf4YCU4YCt4YCvX+GAkuGAricuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICfhgJDhgJThgIThgLrhgLnhgILhgJThgL3hgLFf4YCQ4YCU4YCE4YC64YC54YCc4YCsX+GAoeGAhOGAuuGAueGAguGAq1/hgJfhgK/hgJLhgLnhgJPhgJ/hgLDhgLhf4YCA4YC84YCs4YCe4YCV4YCQ4YCx4YC4X+GAnuGAseGArOGAgOGAvOGArF/hgIXhgJThgLEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfhgJThgL3hgLFf4YCc4YCsX+GAguGAq1/hgJ/hgLDhgLhf4YCA4YC84YCsX+GAnuGAseGArF/hgJThgLEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4YCU4YC94YCxX+GAnOGArF/hgILhgKtf4YCf4YCw4YC4X+GAgOGAvOGArF/hgJ7hgLHhgKxf4YCU4YCxJy5zcGxpdCgnXycpLFxuXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vhgJrhgJThgLEuXSBMVCBb4YCZ4YC+4YCsXScsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+GAmeGAlOGAgOGAuuGAluGAvOGAlOGAul0gTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIExUIFvhgJnhgL7hgKxdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4YCZ4YCU4YCxLuGAgF0gTFQgW+GAmeGAvuGArF0nLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdb4YCV4YC84YCu4YC44YCB4YCy4YC34YCe4YCx4YCsXSBkZGRkIExUIFvhgJnhgL7hgKxdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn4YCc4YCs4YCZ4YCK4YC64YC3ICVzIOGAmeGAvuGArCcsXG4gICAgICAgICAgICBwYXN0OiAn4YCc4YC94YCU4YC64YCB4YCy4YC34YCe4YCx4YCsICVzIOGAgCcsXG4gICAgICAgICAgICBzOiAn4YCF4YCA4YC54YCA4YCU4YC6LuGAoeGAlOGAiuGAuuGAuOGAhOGAmuGAuicsXG4gICAgICAgICAgICBzczogJyVkIOGAheGAgOGAueGAgOGAlOGAt+GAuicsXG4gICAgICAgICAgICBtOiAn4YCQ4YCF4YC64YCZ4YCt4YCU4YCF4YC6JyxcbiAgICAgICAgICAgIG1tOiAnJWQg4YCZ4YCt4YCU4YCF4YC6JyxcbiAgICAgICAgICAgIGg6ICfhgJDhgIXhgLrhgJThgKzhgJvhgK4nLFxuICAgICAgICAgICAgaGg6ICclZCDhgJThgKzhgJvhgK4nLFxuICAgICAgICAgICAgZDogJ+GAkOGAheGAuuGAm+GAgOGAuicsXG4gICAgICAgICAgICBkZDogJyVkIOGAm+GAgOGAuicsXG4gICAgICAgICAgICBNOiAn4YCQ4YCF4YC64YCcJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4YCcJyxcbiAgICAgICAgICAgIHk6ICfhgJDhgIXhgLrhgJThgL7hgIXhgLonLFxuICAgICAgICAgICAgeXk6ICclZCDhgJThgL7hgIXhgLonLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4YGB4YGC4YGD4YGE4YGF4YGG4YGH4YGI4YGJ4YGAXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbXk7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTm9yd2VnaWFuIEJva23DpWwgW25iXVxuLy8hIGF1dGhvcnMgOiBFc3BlbiBIb3ZsYW5kc2RhbCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZXh4YXJzXG4vLyEgICAgICAgICAgIFNpZ3VyZCBHYXJ0bWFubiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zaWd1cmRnYVxuLy8hICAgICAgICAgICBTdGVwaGVuIFJhbXRodW4gOiBodHRwczovL2dpdGh1Yi5jb20vc3RlcGhlbnJhbXRodW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBuYiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ25iJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJzX2FwcmlsX21haV9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbWFyc19hcHIuX21haV9qdW5pX2p1bGlfYXVnLl9zZXAuX29rdC5fbm92Ll9kZXMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ3PDuG5kYWdfbWFuZGFnX3RpcnNkYWdfb25zZGFnX3RvcnNkYWdfZnJlZGFnX2zDuHJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzw7guX21hLl90aS5fb24uX3RvLl9mci5fbMO4Licuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzw7hfbWFfdGlfb25fdG9fZnJfbMO4Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gWVlZWSBba2wuXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBELiBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tpIGRhZyBrbC5dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbaSBtb3JnZW4ga2wuXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2tsLl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpIGfDpXIga2wuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tmb3JyaWdlXSBkZGRkIFtrbC5dIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb20gJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHNpZGVuJyxcbiAgICAgICAgICAgIHM6ICdub2VuIHNla3VuZGVyJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kZXInLFxuICAgICAgICAgICAgbTogJ2V0dCBtaW51dHQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dHRlcicsXG4gICAgICAgICAgICBoOiAnw6luIHRpbWUnLFxuICAgICAgICAgICAgaGg6ICclZCB0aW1lcicsXG4gICAgICAgICAgICBkOiAnw6luIGRhZycsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2VyJyxcbiAgICAgICAgICAgIHc6ICfDqW4gdWtlJyxcbiAgICAgICAgICAgIHd3OiAnJWQgdWtlcicsXG4gICAgICAgICAgICBNOiAnw6luIG3DpW5lZCcsXG4gICAgICAgICAgICBNTTogJyVkIG3DpW5lZGVyJyxcbiAgICAgICAgICAgIHk6ICdldHQgw6VyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw6VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBuYjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBOZXBhbGVzZSBbbmVdXG4vLyEgYXV0aG9yIDogc3V2YXNoIDogaHR0cHM6Ly9naXRodWIuY29tL3N1dmFzaFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN5bWJvbE1hcCA9IHtcbiAgICAgICAgICAgIDE6ICfgpacnLFxuICAgICAgICAgICAgMjogJ+ClqCcsXG4gICAgICAgICAgICAzOiAn4KWpJyxcbiAgICAgICAgICAgIDQ6ICfgpaonLFxuICAgICAgICAgICAgNTogJ+ClqycsXG4gICAgICAgICAgICA2OiAn4KWsJyxcbiAgICAgICAgICAgIDc6ICfgpa0nLFxuICAgICAgICAgICAgODogJ+ClricsXG4gICAgICAgICAgICA5OiAn4KWvJyxcbiAgICAgICAgICAgIDA6ICfgpaYnLFxuICAgICAgICB9LFxuICAgICAgICBudW1iZXJNYXAgPSB7XG4gICAgICAgICAgICAn4KWnJzogJzEnLFxuICAgICAgICAgICAgJ+ClqCc6ICcyJyxcbiAgICAgICAgICAgICfgpaknOiAnMycsXG4gICAgICAgICAgICAn4KWqJzogJzQnLFxuICAgICAgICAgICAgJ+Clqyc6ICc1JyxcbiAgICAgICAgICAgICfgpawnOiAnNicsXG4gICAgICAgICAgICAn4KWtJzogJzcnLFxuICAgICAgICAgICAgJ+Clric6ICc4JyxcbiAgICAgICAgICAgICfgpa8nOiAnOScsXG4gICAgICAgICAgICAn4KWmJzogJzAnLFxuICAgICAgICB9O1xuXG4gICAgdmFyIG5lID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbmUnLCB7XG4gICAgICAgIG1vbnRoczogJ+CknOCkqOCkteCksOClgF/gpKvgpYfgpKzgpY3gpLDgpYHgpLXgpLDgpYBf4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCkv+Cksl/gpK7gpIhf4KSc4KWB4KSoX+CknOClgeCksuCkvuCkiF/gpIXgpJfgpLfgpY3gpJ9f4KS44KWH4KSq4KWN4KSf4KWH4KSu4KWN4KSs4KSwX+CkheCkleCljeCkn+Cli+CkrOCksF/gpKjgpYvgpK3gpYfgpK7gpY3gpKzgpLBf4KSh4KS/4KS44KWH4KSu4KWN4KSs4KSwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgpJzgpKguX+Ckq+Clh+CkrOCljeCksOClgS5f4KSu4KS+4KSw4KWN4KSaX+CkheCkquCljeCksOCkvy5f4KSu4KSIX+CknOClgeCkqF/gpJzgpYHgpLLgpL7gpIguX+CkheCkly5f4KS44KWH4KSq4KWN4KSfLl/gpIXgpJXgpY3gpJ/gpYsuX+CkqOCli+CkreClhy5f4KSh4KS/4KS44KWHLicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ+CkhuCkh+CkpOCkrOCkvuCksF/gpLjgpYvgpK7gpKzgpL7gpLBf4KSu4KSZ4KWN4KSX4KSy4KSs4KS+4KSwX+CkrOClgeCkp+CkrOCkvuCksF/gpKzgpL/gpLngpL/gpKzgpL7gpLBf4KS24KWB4KSV4KWN4KSw4KSs4KS+4KSwX+CktuCkqOCkv+CkrOCkvuCksCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CkhuCkh+CkpC5f4KS44KWL4KSuLl/gpK7gpJngpY3gpJfgpLIuX+CkrOClgeCkpy5f4KSs4KS/4KS54KS/Ll/gpLbgpYHgpJXgpY3gpLAuX+CktuCkqOCkvy4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4KSGLl/gpLjgpYsuX+CkruCkgi5f4KSs4KWBLl/gpKzgpL8uX+CktuClgS5f4KS2Licuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdB4KSV4KWLIGg6bW0g4KSs4KSc4KWHJyxcbiAgICAgICAgICAgIExUUzogJ0HgpJXgpYsgaDptbTpzcyDgpKzgpJzgpYcnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgQeCkleCliyBoOm1tIOCkrOCknOClhycsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVksIEHgpJXgpYsgaDptbSDgpKzgpJzgpYcnLFxuICAgICAgICB9LFxuICAgICAgICBwcmVwYXJzZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9b4KWn4KWo4KWp4KWq4KWr4KWs4KWt4KWu4KWv4KWmXS9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBwb3N0Zm9ybWF0OiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1xcZC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ltYm9sTWFwW21hdGNoXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4KSw4KS+4KSk4KS/fOCkrOCkv+CkueCkvuCkqHzgpKbgpL/gpIngpIHgpLjgpYt84KS44KS+4KSB4KSdLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4KSw4KS+4KSk4KS/Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KSs4KS/4KS54KS+4KSoJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CkpuCkv+CkieCkgeCkuOCliycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4KS44KS+4KSB4KSdJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CksOCkvuCkpOCkvyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSs4KS/4KS54KS+4KSoJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgpKbgpL/gpIngpIHgpLjgpYsnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CkuOCkvuCkgeCknSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4KSw4KS+4KSk4KS/JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4KSG4KScXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+CkreCli+CksuCkv10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb4KSG4KSJ4KSB4KSm4KWLXSBkZGRkWyxdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4KS54KS/4KSc4KWLXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgpJfgpI/gpJXgpYtdIGRkZGRbLF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclc+CkruCkvicsXG4gICAgICAgICAgICBwYXN0OiAnJXMg4KSF4KSX4KS+4KSh4KS/JyxcbiAgICAgICAgICAgIHM6ICfgpJXgpYfgpLngpYAg4KSV4KWN4KS34KSjJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4KS44KWH4KSV4KWH4KSj4KWN4KShJyxcbiAgICAgICAgICAgIG06ICfgpI/gpJUg4KSu4KS/4KSo4KWH4KSfJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4KSu4KS/4KSo4KWH4KSfJyxcbiAgICAgICAgICAgIGg6ICfgpI/gpJUg4KSY4KSj4KWN4KSf4KS+JyxcbiAgICAgICAgICAgIGhoOiAnJWQg4KSY4KSj4KWN4KSf4KS+JyxcbiAgICAgICAgICAgIGQ6ICfgpI/gpJUg4KSm4KS/4KSoJyxcbiAgICAgICAgICAgIGRkOiAnJWQg4KSm4KS/4KSoJyxcbiAgICAgICAgICAgIE06ICfgpI/gpJUg4KSu4KS54KS/4KSo4KS+JyxcbiAgICAgICAgICAgIE1NOiAnJWQg4KSu4KS54KS/4KSo4KS+JyxcbiAgICAgICAgICAgIHk6ICfgpI/gpJUg4KSs4KSw4KWN4KS3JyxcbiAgICAgICAgICAgIHl5OiAnJWQg4KSs4KSw4KWN4KS3JyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5lO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IER1dGNoIChCZWxnaXVtKSBbbmwtYmVdXG4vLyEgYXV0aG9yIDogSm9yaXMgUsO2bGluZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3Jpc3JvbGluZ1xuLy8hIGF1dGhvciA6IEphY29iIE1pZGRhZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWRkYWdqXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzU2hvcnRXaXRoRG90cyA9XG4gICAgICAgICAgICAnamFuLl9mZWIuX21ydC5fYXByLl9tZWlfanVuLl9qdWwuX2F1Zy5fc2VwLl9va3QuX25vdi5fZGVjLicuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzU2hvcnRXaXRob3V0RG90cyA9XG4gICAgICAgICAgICAnamFuX2ZlYl9tcnRfYXByX21laV9qdW5fanVsX2F1Z19zZXBfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15qYW4vaSxcbiAgICAgICAgICAgIC9eZmViL2ksXG4gICAgICAgICAgICAvXihtYWFydHxtcnRcXC4/KSQvaSxcbiAgICAgICAgICAgIC9eYXByL2ksXG4gICAgICAgICAgICAvXm1laSQvaSxcbiAgICAgICAgICAgIC9eanVuW2kuXT8kL2ksXG4gICAgICAgICAgICAvXmp1bFtpLl0/JC9pLFxuICAgICAgICAgICAgL15hdWcvaSxcbiAgICAgICAgICAgIC9ec2VwL2ksXG4gICAgICAgICAgICAvXm9rdC9pLFxuICAgICAgICAgICAgL15ub3YvaSxcbiAgICAgICAgICAgIC9eZGVjL2ksXG4gICAgICAgIF0sXG4gICAgICAgIG1vbnRoc1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKGphbnVhcml8ZmVicnVhcml8bWFhcnR8YXByaWx8bWVpfGp1W25sXWl8YXVndXN0dXN8c2VwdGVtYmVyfG9rdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXJ8amFuXFwuP3xmZWJcXC4/fG1ydFxcLj98YXByXFwuP3xqdVtubF1cXC4/fGF1Z1xcLj98c2VwXFwuP3xva3RcXC4/fG5vdlxcLj98ZGVjXFwuPykvaTtcblxuICAgIHZhciBubEJlID0gbW9tZW50LmRlZmluZUxvY2FsZSgnbmwtYmUnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcmlfZmVicnVhcmlfbWFhcnRfYXByaWxfbWVpX2p1bmlfanVsaV9hdWd1c3R1c19zZXB0ZW1iZXJfb2t0b2Jlcl9ub3ZlbWJlcl9kZWNlbWJlcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGZ1bmN0aW9uIChtLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhEb3RzO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvLU1NTS0vLnRlc3QoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhvdXREb3RzW20ubW9udGgoKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNTaG9ydFdpdGhEb3RzW20ubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgbW9udGhzUmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTaG9ydFJlZ2V4OiBtb250aHNSZWdleCxcbiAgICAgICAgbW9udGhzU3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihqYW51YXJpfGZlYnJ1YXJpfG1hYXJ0fGFwcmlsfG1laXxqdVtubF1pfGF1Z3VzdHVzfHNlcHRlbWJlcnxva3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pLFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14oamFuXFwuP3xmZWJcXC4/fG1ydFxcLj98YXByXFwuP3xtZWl8anVbbmxdXFwuP3xhdWdcXC4/fHNlcFxcLj98b2t0XFwuP3xub3ZcXC4/fGRlY1xcLj8pL2ksXG5cbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcblxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICd6b25kYWdfbWFhbmRhZ19kaW5zZGFnX3dvZW5zZGFnX2RvbmRlcmRhZ192cmlqZGFnX3phdGVyZGFnJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnem8uX21hLl9kaS5fd28uX2RvLl92ci5femEuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3pvX21hX2RpX3dvX2RvX3ZyX3phJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1t2YW5kYWFnIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW21vcmdlbiBvbV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tnaXN0ZXJlbiBvbV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbYWZnZWxvcGVuXSBkZGRkIFtvbV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvdmVyICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBnZWxlZGVuJyxcbiAgICAgICAgICAgIHM6ICdlZW4gcGFhciBzZWNvbmRlbicsXG4gICAgICAgICAgICBzczogJyVkIHNlY29uZGVuJyxcbiAgICAgICAgICAgIG06ICfDqcOpbiBtaW51dXQnLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGVuJyxcbiAgICAgICAgICAgIGg6ICfDqcOpbiB1dXInLFxuICAgICAgICAgICAgaGg6ICclZCB1dXInLFxuICAgICAgICAgICAgZDogJ8Opw6luIGRhZycsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2VuJyxcbiAgICAgICAgICAgIE06ICfDqcOpbiBtYWFuZCcsXG4gICAgICAgICAgICBNTTogJyVkIG1hYW5kZW4nLFxuICAgICAgICAgICAgeTogJ8Opw6luIGphYXInLFxuICAgICAgICAgICAgeXk6ICclZCBqYWFyJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0ZXxkZSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIG51bWJlciArXG4gICAgICAgICAgICAgICAgKG51bWJlciA9PT0gMSB8fCBudW1iZXIgPT09IDggfHwgbnVtYmVyID49IDIwID8gJ3N0ZScgOiAnZGUnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5sQmU7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogRHV0Y2ggW25sXVxuLy8hIGF1dGhvciA6IEpvcmlzIFLDtmxpbmcgOiBodHRwczovL2dpdGh1Yi5jb20vam9yaXNyb2xpbmdcbi8vISBhdXRob3IgOiBKYWNvYiBNaWRkYWcgOiBodHRwczovL2dpdGh1Yi5jb20vbWlkZGFnalxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc1Nob3J0V2l0aERvdHMgPVxuICAgICAgICAgICAgJ2phbi5fZmViLl9tcnQuX2Fwci5fbWVpX2p1bi5fanVsLl9hdWcuX3NlcC5fb2t0Ll9ub3YuX2RlYy4nLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0V2l0aG91dERvdHMgPVxuICAgICAgICAgICAgJ2phbl9mZWJfbXJ0X2Fwcl9tZWlfanVuX2p1bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZSA9IFtcbiAgICAgICAgICAgIC9eamFuL2ksXG4gICAgICAgICAgICAvXmZlYi9pLFxuICAgICAgICAgICAgL14obWFhcnR8bXJ0XFwuPykkL2ksXG4gICAgICAgICAgICAvXmFwci9pLFxuICAgICAgICAgICAgL15tZWkkL2ksXG4gICAgICAgICAgICAvXmp1bltpLl0/JC9pLFxuICAgICAgICAgICAgL15qdWxbaS5dPyQvaSxcbiAgICAgICAgICAgIC9eYXVnL2ksXG4gICAgICAgICAgICAvXnNlcC9pLFxuICAgICAgICAgICAgL15va3QvaSxcbiAgICAgICAgICAgIC9ebm92L2ksXG4gICAgICAgICAgICAvXmRlYy9pLFxuICAgICAgICBdLFxuICAgICAgICBtb250aHNSZWdleCA9XG4gICAgICAgICAgICAvXihqYW51YXJpfGZlYnJ1YXJpfG1hYXJ0fGFwcmlsfG1laXxqdVtubF1pfGF1Z3VzdHVzfHNlcHRlbWJlcnxva3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyfGphblxcLj98ZmViXFwuP3xtcnRcXC4/fGFwclxcLj98anVbbmxdXFwuP3xhdWdcXC4/fHNlcFxcLj98b2t0XFwuP3xub3ZcXC4/fGRlY1xcLj8pL2k7XG5cbiAgICB2YXIgbmwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdubCcsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyaV9mZWJydWFyaV9tYWFydF9hcHJpbF9tZWlfanVuaV9qdWxpX2F1Z3VzdHVzX3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogZnVuY3Rpb24gKG0sIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC8tTU1NLS8udGVzdChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aG91dERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc1Nob3J0V2l0aERvdHNbbS5tb250aCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBtb250aHNSZWdleDogbW9udGhzUmVnZXgsXG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6IG1vbnRoc1JlZ2V4LFxuICAgICAgICBtb250aHNTdHJpY3RSZWdleDpcbiAgICAgICAgICAgIC9eKGphbnVhcml8ZmVicnVhcml8bWFhcnR8YXByaWx8bWVpfGp1W25sXWl8YXVndXN0dXN8c2VwdGVtYmVyfG9rdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpL2ksXG4gICAgICAgIG1vbnRoc1Nob3J0U3RyaWN0UmVnZXg6XG4gICAgICAgICAgICAvXihqYW5cXC4/fGZlYlxcLj98bXJ0XFwuP3xhcHJcXC4/fG1laXxqdVtubF1cXC4/fGF1Z1xcLj98c2VwXFwuP3xva3RcXC4/fG5vdlxcLj98ZGVjXFwuPykvaSxcblxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ3pvbmRhZ19tYWFuZGFnX2RpbnNkYWdfd29lbnNkYWdfZG9uZGVyZGFnX3ZyaWpkYWdfemF0ZXJkYWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICd6by5fbWEuX2RpLl93by5fZG8uX3ZyLl96YS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnem9fbWFfZGlfd29fZG9fdnJfemEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELU1NLVlZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW3ZhbmRhYWcgb21dIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbbW9yZ2VuIG9tXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2dpc3RlcmVuIG9tXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1thZmdlbG9wZW5dIGRkZGQgW29tXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ292ZXIgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGdlbGVkZW4nLFxuICAgICAgICAgICAgczogJ2VlbiBwYWFyIHNlY29uZGVuJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2Vjb25kZW4nLFxuICAgICAgICAgICAgbTogJ8Opw6luIG1pbnV1dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0ZW4nLFxuICAgICAgICAgICAgaDogJ8Opw6luIHV1cicsXG4gICAgICAgICAgICBoaDogJyVkIHV1cicsXG4gICAgICAgICAgICBkOiAnw6nDqW4gZGFnJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGFnZW4nLFxuICAgICAgICAgICAgdzogJ8Opw6luIHdlZWsnLFxuICAgICAgICAgICAgd3c6ICclZCB3ZWtlbicsXG4gICAgICAgICAgICBNOiAnw6nDqW4gbWFhbmQnLFxuICAgICAgICAgICAgTU06ICclZCBtYWFuZGVuJyxcbiAgICAgICAgICAgIHk6ICfDqcOpbiBqYWFyJyxcbiAgICAgICAgICAgIHl5OiAnJWQgamFhcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShzdGV8ZGUpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBudW1iZXIgK1xuICAgICAgICAgICAgICAgIChudW1iZXIgPT09IDEgfHwgbnVtYmVyID09PSA4IHx8IG51bWJlciA+PSAyMCA/ICdzdGUnIDogJ2RlJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBubDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBOeW5vcnNrIFtubl1cbi8vISBhdXRob3JzIDogaHR0cHM6Ly9naXRodWIuY29tL21lY2h1d2luZFxuLy8hICAgICAgICAgICBTdGVwaGVuIFJhbXRodW4gOiBodHRwczovL2dpdGh1Yi5jb20vc3RlcGhlbnJhbXRodW5cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBubiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ25uJywge1xuICAgICAgICBtb250aHM6ICdqYW51YXJfZmVicnVhcl9tYXJzX2FwcmlsX21haV9qdW5pX2p1bGlfYXVndXN0X3NlcHRlbWJlcl9va3RvYmVyX25vdmVtYmVyX2Rlc2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYW4uX2ZlYi5fbWFyc19hcHIuX21haV9qdW5pX2p1bGlfYXVnLl9zZXAuX29rdC5fbm92Ll9kZXMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ3N1bmRhZ19tw6VuZGFnX3R5c2RhZ19vbnNkYWdfdG9yc2RhZ19mcmVkYWdfbGF1cmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3N1Ll9tw6UuX3R5Ll9vbi5fdG8uX2ZyLl9sYXUuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3N1X23DpV90eV9vbl90b19mcl9sYScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgW2tsLl0gSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBELiBNTU1NIFlZWVkgW2tsLl0gSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tJIGRhZyBrbG9ra2FdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbSSBtb3Jnb24ga2xva2thXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2tsb2trYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJIGfDpXIga2xva2thXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tGw7hyZWfDpWFuZGVdIGRkZGQgW2tsb2trYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgc2lkYW4nLFxuICAgICAgICAgICAgczogJ25va3JlIHNla3VuZCcsXG4gICAgICAgICAgICBzczogJyVkIHNla3VuZCcsXG4gICAgICAgICAgICBtOiAnZWl0IG1pbnV0dCcsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0dCcsXG4gICAgICAgICAgICBoOiAnZWluIHRpbWUnLFxuICAgICAgICAgICAgaGg6ICclZCB0aW1hcicsXG4gICAgICAgICAgICBkOiAnZWluIGRhZycsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2FyJyxcbiAgICAgICAgICAgIHc6ICdlaSB2ZWtlJyxcbiAgICAgICAgICAgIHd3OiAnJWQgdmVrZXInLFxuICAgICAgICAgICAgTTogJ2VpbiBtw6VuYWQnLFxuICAgICAgICAgICAgTU06ICclZCBtw6VuYWRlcicsXG4gICAgICAgICAgICB5OiAnZWl0IMOlcicsXG4gICAgICAgICAgICB5eTogJyVkIMOlcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogT2NjaXRhbiwgbGVuZ2Fkb2NpYW4gZGlhbGVjdGUgW29jLWxuY11cbi8vISBhdXRob3IgOiBRdWVudGluIFBBR8OIUyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9RdWVudHkzMVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG9jTG5jID0gbW9tZW50LmRlZmluZUxvY2FsZSgnb2MtbG5jJywge1xuICAgICAgICBtb250aHM6IHtcbiAgICAgICAgICAgIHN0YW5kYWxvbmU6XG4gICAgICAgICAgICAgICAgJ2dlbmnDqHJfZmVicmnDqHJfbWFyw6dfYWJyaWxfbWFpX2p1bmhfanVsaGV0X2Fnb3N0X3NldGVtYnJlX29jdMOyYnJlX25vdmVtYnJlX2RlY2VtYnJlJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZvcm1hdDogXCJkZSBnZW5pw6hyX2RlIGZlYnJpw6hyX2RlIG1hcsOnX2QnYWJyaWxfZGUgbWFpX2RlIGp1bmhfZGUganVsaGV0X2QnYWdvc3RfZGUgc2V0ZW1icmVfZCdvY3TDsmJyZV9kZSBub3ZlbWJyZV9kZSBkZWNlbWJyZVwiLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlzRm9ybWF0OiAvRFtvRF0/KFxccykrTU1NTS8sXG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2dlbi5fZmVici5fbWFyw6dfYWJyLl9tYWlfanVuaF9qdWxoLl9hZ28uX3NldC5fb2N0Ll9ub3YuX2RlYy4nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgbW9udGhzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXM6ICdkaW1lbmdlX2RpbHVuc19kaW1hcnNfZGltw6hjcmVzX2RpasOydXNfZGl2ZW5kcmVzX2Rpc3NhYnRlJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnZGcuX2RsLl9kbS5fZGMuX2RqLl9kdi5fZHMuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RnX2RsX2RtX2RjX2RqX2R2X2RzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBbZGVdIFlZWVknLFxuICAgICAgICAgICAgbGw6ICdEIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBbZGVdIFlZWVkgW2FdIEg6bW0nLFxuICAgICAgICAgICAgbGxsOiAnRCBNTU0gWVlZWSwgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gW2RlXSBZWVlZIFthXSBIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQgRCBNTU0gWVlZWSwgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW3XDqGkgYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tkZW1hbiBhXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW2FdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbacOociBhXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3Bhc3NhdCBhXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogXCJkJ2FxdcOtICVzXCIsXG4gICAgICAgICAgICBwYXN0OiAnZmEgJXMnLFxuICAgICAgICAgICAgczogJ3VuYXMgc2Vnb25kYXMnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWdvbmRhcycsXG4gICAgICAgICAgICBtOiAndW5hIG1pbnV0YScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0YXMnLFxuICAgICAgICAgICAgaDogJ3VuYSBvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBvcmFzJyxcbiAgICAgICAgICAgIGQ6ICd1biBqb3JuJyxcbiAgICAgICAgICAgIGRkOiAnJWQgam9ybnMnLFxuICAgICAgICAgICAgTTogJ3VuIG1lcycsXG4gICAgICAgICAgICBNTTogJyVkIG1lc2VzJyxcbiAgICAgICAgICAgIHk6ICd1biBhbicsXG4gICAgICAgICAgICB5eTogJyVkIGFucycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShyfG58dHzDqHxhKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgbnVtYmVyID09PSAxXG4gICAgICAgICAgICAgICAgICAgID8gJ3InXG4gICAgICAgICAgICAgICAgICAgIDogbnVtYmVyID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgPyAnbidcbiAgICAgICAgICAgICAgICAgICAgICA6IG51bWJlciA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAncidcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVtYmVyID09PSA0XG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogJ8OoJztcbiAgICAgICAgICAgIGlmIChwZXJpb2QgPT09ICd3JyB8fCBwZXJpb2QgPT09ICdXJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9ICdhJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2NMbmM7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUHVuamFiaSAoSW5kaWEpIFtwYS1pbl1cbi8vISBhdXRob3IgOiBIYXJwcmVldCBTaW5naCA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJwcmVldGtoYWxzYWd0Yml0XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+CppycsXG4gICAgICAgICAgICAyOiAn4KmoJyxcbiAgICAgICAgICAgIDM6ICfgqaknLFxuICAgICAgICAgICAgNDogJ+CpqicsXG4gICAgICAgICAgICA1OiAn4KmrJyxcbiAgICAgICAgICAgIDY6ICfgqawnLFxuICAgICAgICAgICAgNzogJ+CprScsXG4gICAgICAgICAgICA4OiAn4KmuJyxcbiAgICAgICAgICAgIDk6ICfgqa8nLFxuICAgICAgICAgICAgMDogJ+CppicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgqacnOiAnMScsXG4gICAgICAgICAgICAn4KmoJzogJzInLFxuICAgICAgICAgICAgJ+CpqSc6ICczJyxcbiAgICAgICAgICAgICfgqaonOiAnNCcsXG4gICAgICAgICAgICAn4KmrJzogJzUnLFxuICAgICAgICAgICAgJ+CprCc6ICc2JyxcbiAgICAgICAgICAgICfgqa0nOiAnNycsXG4gICAgICAgICAgICAn4KmuJzogJzgnLFxuICAgICAgICAgICAgJ+Cpryc6ICc5JyxcbiAgICAgICAgICAgICfgqaYnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgcGFJbiA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3BhLWluJywge1xuICAgICAgICAvLyBUaGVyZSBhcmUgbW9udGhzIG5hbWUgYXMgcGVyIE5hbmFrc2hhaGkgQ2FsZW5kYXIgYnV0IHRoZXkgYXJlIG5vdCB1c2VkIGFzIHJpZ2lkbHkgaW4gbW9kZXJuIFB1bmphYmkuXG4gICAgICAgIG1vbnRoczogJ+ConOCoqOCoteCosOCpgF/gqKvgqLzgqLDgqLXgqLDgqYBf4Kiu4Ki+4Kiw4KiaX+CoheCoquCpjeCosOCpiOCosl/gqK7gqIhf4Kic4KmC4KioX+ConOCpgeCosuCovuCoiF/gqIXgqJfgqLjgqKRf4Ki44Kik4Kmw4Kis4KiwX+CoheColeCopOCpguCorOCosF/gqKjgqLXgqbDgqKzgqLBf4Kim4Ki44Kmw4Kis4KiwJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgqJzgqKjgqLXgqLDgqYBf4Kir4Ki84Kiw4Ki14Kiw4KmAX+CoruCovuCosOComl/gqIXgqKrgqY3gqLDgqYjgqLJf4Kiu4KiIX+ConOCpguCoqF/gqJzgqYHgqLLgqL7gqIhf4KiF4KiX4Ki44KikX+CouOCopOCpsOCorOCosF/gqIXgqJXgqKTgqYLgqKzgqLBf4Kio4Ki14Kmw4Kis4KiwX+CopuCouOCpsOCorOCosCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ+CokOCopOCoteCovuCosF/gqLjgqYvgqK7gqLXgqL7gqLBf4Kiu4Kmw4KiX4Kiy4Ki14Ki+4KiwX+CorOCpgeCop+CoteCovuCosF/gqLXgqYDgqLDgqLXgqL7gqLBf4Ki44Ki84KmB4Kmx4KiV4Kiw4Ki14Ki+4KiwX+CouOCovOCoqOCpgOComuCosOCoteCovuCosCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ+CokOCopF/gqLjgqYvgqK5f4Kiu4Kmw4KiX4KiyX+CorOCpgeCop1/gqLXgqYDgqLBf4Ki44Ki84KmB4KiV4KiwX+CouOCovOCoqOCpgCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfgqJDgqKRf4Ki44KmL4KiuX+CoruCpsOCol+Cosl/gqKzgqYHgqKdf4Ki14KmA4KiwX+CouOCovOCpgeColeCosF/gqLjgqLzgqKjgqYAnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0EgaDptbSDgqLXgqJzgqYcnLFxuICAgICAgICAgICAgTFRTOiAnQSBoOm1tOnNzIOCoteConOCphycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0g4Ki14Kic4KmHJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSwgQSBoOm1tIOCoteConOCphycsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+CoheConF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgqJXgqLJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW+CoheCol+CosuCovl0gZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgqJXgqLJdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CoquCov+Com+CosuCph10gZGRkZCwgTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyDgqLXgqL/gqbHgqJonLFxuICAgICAgICAgICAgcGFzdDogJyVzIOCoquCov+Com+CosuCphycsXG4gICAgICAgICAgICBzOiAn4KiV4KmB4KidIOCouOColeCov+CpsOConycsXG4gICAgICAgICAgICBzczogJyVkIOCouOColeCov+CpsOConycsXG4gICAgICAgICAgICBtOiAn4KiH4KiVIOCoruCov+CpsOConycsXG4gICAgICAgICAgICBtbTogJyVkIOCoruCov+CpsOConycsXG4gICAgICAgICAgICBoOiAn4KiH4Kmx4KiVIOComOCpsOCon+CovicsXG4gICAgICAgICAgICBoaDogJyVkIOComOCpsOCon+CphycsXG4gICAgICAgICAgICBkOiAn4KiH4Kmx4KiVIOCopuCov+CoqCcsXG4gICAgICAgICAgICBkZDogJyVkIOCopuCov+CoqCcsXG4gICAgICAgICAgICBNOiAn4KiH4Kmx4KiVIOCoruCoueCpgOCoqOCovicsXG4gICAgICAgICAgICBNTTogJyVkIOCoruCoueCpgOCoqOCphycsXG4gICAgICAgICAgICB5OiAn4KiH4Kmx4KiVIOCouOCovuCosicsXG4gICAgICAgICAgICB5eTogJyVkIOCouOCovuCosicsXG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgqafgqajgqangqargqavgqazgqa3gqa7gqa/gqaZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFB1bmphYmkgbm90YXRpb24gZm9yIG1lcmlkaWVtcyBhcmUgcXVpdGUgZnV6enkgaW4gcHJhY3RpY2UuIFdoaWxlIHRoZXJlIGV4aXN0c1xuICAgICAgICAvLyBhIHJpZ2lkIG5vdGlvbiBvZiBhICdQYWhhcicgaXQgaXMgbm90IHVzZWQgYXMgcmlnaWRseSBpbiBtb2Rlcm4gUHVuamFiaS5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+CosOCovuCopHzgqLjgqLXgqYfgqLB84Kim4KmB4Kiq4Ki54Ki/4KiwfOCouOCovOCovuCori8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+CosOCovuCopCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CouOCoteCph+CosCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICfgqKbgqYHgqKrgqLngqL/gqLAnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgPj0gMTAgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CouOCovOCovuCoricpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqLDgqL7gqKQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CouOCoteCph+CosCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Kim4KmB4Kiq4Ki54Ki/4KiwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgqLjgqLzgqL7gqK4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CosOCovuCopCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMCwgLy8gU3VuZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBwYUluO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFBvbGlzaCBbcGxdXG4vLyEgYXV0aG9yIDogUmFmYWwgSGlyc3ogOiBodHRwczovL2dpdGh1Yi5jb20vZXZvTFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIG1vbnRoc05vbWluYXRpdmUgPVxuICAgICAgICAgICAgJ3N0eWN6ZcWEX2x1dHlfbWFyemVjX2t3aWVjaWXFhF9tYWpfY3plcndpZWNfbGlwaWVjX3NpZXJwaWXFhF93cnplc2llxYRfcGHFumR6aWVybmlrX2xpc3RvcGFkX2dydWR6aWXFhCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNTdWJqZWN0aXZlID1cbiAgICAgICAgICAgICdzdHljem5pYV9sdXRlZ29fbWFyY2Ffa3dpZXRuaWFfbWFqYV9jemVyd2NhX2xpcGNhX3NpZXJwbmlhX3dyemXFm25pYV9wYcW6ZHppZXJuaWthX2xpc3RvcGFkYV9ncnVkbmlhJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAgICAgL15zdHkvaSxcbiAgICAgICAgICAgIC9ebHV0L2ksXG4gICAgICAgICAgICAvXm1hci9pLFxuICAgICAgICAgICAgL15rd2kvaSxcbiAgICAgICAgICAgIC9ebWFqL2ksXG4gICAgICAgICAgICAvXmN6ZS9pLFxuICAgICAgICAgICAgL15saXAvaSxcbiAgICAgICAgICAgIC9ec2llL2ksXG4gICAgICAgICAgICAvXndyei9pLFxuICAgICAgICAgICAgL15wYcW6L2ksXG4gICAgICAgICAgICAvXmxpcy9pLFxuICAgICAgICAgICAgL15ncnUvaSxcbiAgICAgICAgXTtcbiAgICBmdW5jdGlvbiBwbHVyYWwobikge1xuICAgICAgICByZXR1cm4gbiAlIDEwIDwgNSAmJiBuICUgMTAgPiAxICYmIH5+KG4gLyAxMCkgJSAxMCAhPT0gMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudW1iZXIgKyAnICc7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdzZWt1bmR5JyA6ICdzZWt1bmQnKTtcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ21pbnV0YScgOiAnbWludXTEmSc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtaW51dHknIDogJ21pbnV0Jyk7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdnb2R6aW5hJyA6ICdnb2R6aW7EmSc7XG4gICAgICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdnb2R6aW55JyA6ICdnb2R6aW4nKTtcbiAgICAgICAgICAgIGNhc2UgJ3d3JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ3R5Z29kbmllJyA6ICd0eWdvZG5pJyk7XG4gICAgICAgICAgICBjYXNlICdNTSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtaWVzacSFY2UnIDogJ21pZXNpxJljeScpO1xuICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnbGF0YScgOiAnbGF0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcGwgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdwbCcsIHtcbiAgICAgICAgbW9udGhzOiBmdW5jdGlvbiAobW9tZW50VG9Gb3JtYXQsIGZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKCFtb21lbnRUb0Zvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHNOb21pbmF0aXZlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvRCBNTU1NLy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzU3ViamVjdGl2ZVttb21lbnRUb0Zvcm1hdC5tb250aCgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoc05vbWluYXRpdmVbbW9tZW50VG9Gb3JtYXQubW9udGgoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnc3R5X2x1dF9tYXJfa3dpX21hal9jemVfbGlwX3NpZV93cnpfcGHFul9saXNfZ3J1Jy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIGxvbmdNb250aHNQYXJzZTogbW9udGhzUGFyc2UsXG4gICAgICAgIHNob3J0TW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICduaWVkemllbGFfcG9uaWVkemlhxYJla193dG9yZWtfxZtyb2RhX2N6d2FydGVrX3BpxIV0ZWtfc29ib3RhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnbmR6X3Bvbl93dF/Fm3JfY3p3X3B0X3NvYicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdOZF9Qbl9XdF/FmnJfQ3pfUHRfU28nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbRHppxZsgb10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tKdXRybyBvXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXIG5pZWR6aWVsxJkgb10gTFQnO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW1dlIHd0b3JlayBvXSBMVCc7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyDFm3JvZMSZIG9dIExUJztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXIHNvYm90xJkgb10gTFQnO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXXSBkZGRkIFtvXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbV2N6b3JhaiBvXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXIHplc3rFgsSFIG5pZWR6aWVsxJkgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXIHplc3rFgsSFIMWbcm9kxJkgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tXIHplc3rFgsSFIHNvYm90xJkgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbVyB6ZXN6xYJ5XSBkZGRkIFtvXSBMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnemEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIHRlbXUnLFxuICAgICAgICAgICAgczogJ2tpbGthIHNla3VuZCcsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiAnMSBkemllxYQnLFxuICAgICAgICAgICAgZGQ6ICclZCBkbmknLFxuICAgICAgICAgICAgdzogJ3R5ZHppZcWEJyxcbiAgICAgICAgICAgIHd3OiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiAnbWllc2nEhWMnLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6ICdyb2snLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBwbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBQb3J0dWd1ZXNlIChCcmF6aWwpIFtwdC1icl1cbi8vISBhdXRob3IgOiBDYWlvIFJpYmVpcm8gUGVyZWlyYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jYWlvLXJpYmVpcm8tcGVyZWlyYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHB0QnIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdwdC1icicsIHtcbiAgICAgICAgbW9udGhzOiAnamFuZWlyb19mZXZlcmVpcm9fbWFyw6dvX2FicmlsX21haW9fanVuaG9fanVsaG9fYWdvc3RvX3NldGVtYnJvX291dHVicm9fbm92ZW1icm9fZGV6ZW1icm8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnamFuX2Zldl9tYXJfYWJyX21haV9qdW5fanVsX2Fnb19zZXRfb3V0X25vdl9kZXonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ2RvbWluZ29fc2VndW5kYS1mZWlyYV90ZXLDp2EtZmVpcmFfcXVhcnRhLWZlaXJhX3F1aW50YS1mZWlyYV9zZXh0YS1mZWlyYV9zw6FiYWRvJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdkb21fc2VnX3Rlcl9xdWFfcXVpX3NleF9zw6FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2RvXzLCql8zwqpfNMKqXzXCql82wqpfc8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBbw6BzXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIFvDoHNdIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSG9qZSDDoHNdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQW1hbmjDoyDDoHNdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BzXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW09udGVtIMOgc10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKSA9PT0gMCB8fCB0aGlzLmRheSgpID09PSA2XG4gICAgICAgICAgICAgICAgICAgID8gJ1vDmmx0aW1vXSBkZGRkIFvDoHNdIExUJyAvLyBTYXR1cmRheSArIFN1bmRheVxuICAgICAgICAgICAgICAgICAgICA6ICdbw5psdGltYV0gZGRkZCBbw6BzXSBMVCc7IC8vIE1vbmRheSAtIEZyaWRheVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZW0gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2jDoSAlcycsXG4gICAgICAgICAgICBzOiAncG91Y29zIHNlZ3VuZG9zJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kb3MnLFxuICAgICAgICAgICAgbTogJ3VtIG1pbnV0bycsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnV0b3MnLFxuICAgICAgICAgICAgaDogJ3VtYSBob3JhJyxcbiAgICAgICAgICAgIGhoOiAnJWQgaG9yYXMnLFxuICAgICAgICAgICAgZDogJ3VtIGRpYScsXG4gICAgICAgICAgICBkZDogJyVkIGRpYXMnLFxuICAgICAgICAgICAgTTogJ3VtIG3DqnMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW0gYW5vJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5vcycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICBpbnZhbGlkRGF0ZTogJ0RhdGEgaW52w6FsaWRhJyxcbiAgICB9KTtcblxuICAgIHJldHVybiBwdEJyO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFBvcnR1Z3Vlc2UgW3B0XVxuLy8hIGF1dGhvciA6IEplZmZlcnNvbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qYWxleDc5XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgcHQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdwdCcsIHtcbiAgICAgICAgbW9udGhzOiAnamFuZWlyb19mZXZlcmVpcm9fbWFyw6dvX2FicmlsX21haW9fanVuaG9fanVsaG9fYWdvc3RvX3NldGVtYnJvX291dHVicm9fbm92ZW1icm9fZGV6ZW1icm8nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnamFuX2Zldl9tYXJfYWJyX21haV9qdW5fanVsX2Fnb19zZXRfb3V0X25vdl9kZXonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ0RvbWluZ29fU2VndW5kYS1mZWlyYV9UZXLDp2EtZmVpcmFfUXVhcnRhLWZlaXJhX1F1aW50YS1mZWlyYV9TZXh0YS1mZWlyYV9Tw6FiYWRvJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdEb21fU2VnX1Rlcl9RdWFfUXVpX1NleF9Tw6FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0RvXzLCql8zwqpfNMKqXzXCql82wqpfU8OhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBbZGVdIE1NTU0gW2RlXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgW2RlXSBNTU1NIFtkZV0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBbZGVdIE1NTU0gW2RlXSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbSG9qZSDDoHNdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQW1hbmjDoyDDoHNdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbw6BzXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW09udGVtIMOgc10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKSA9PT0gMCB8fCB0aGlzLmRheSgpID09PSA2XG4gICAgICAgICAgICAgICAgICAgID8gJ1vDmmx0aW1vXSBkZGRkIFvDoHNdIExUJyAvLyBTYXR1cmRheSArIFN1bmRheVxuICAgICAgICAgICAgICAgICAgICA6ICdbw5psdGltYV0gZGRkZCBbw6BzXSBMVCc7IC8vIE1vbmRheSAtIEZyaWRheVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZW0gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ2jDoSAlcycsXG4gICAgICAgICAgICBzOiAnc2VndW5kb3MnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWd1bmRvcycsXG4gICAgICAgICAgICBtOiAndW0gbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvcycsXG4gICAgICAgICAgICBoOiAndW1hIGhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBob3JhcycsXG4gICAgICAgICAgICBkOiAndW0gZGlhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZGlhcycsXG4gICAgICAgICAgICB3OiAndW1hIHNlbWFuYScsXG4gICAgICAgICAgICB3dzogJyVkIHNlbWFuYXMnLFxuICAgICAgICAgICAgTTogJ3VtIG3DqnMnLFxuICAgICAgICAgICAgTU06ICclZCBtZXNlcycsXG4gICAgICAgICAgICB5OiAndW0gYW5vJyxcbiAgICAgICAgICAgIHl5OiAnJWQgYW5vcycsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfcK6LyxcbiAgICAgICAgb3JkaW5hbDogJyVkwronLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHQ7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUm9tYW5pYW4gW3JvXVxuLy8hIGF1dGhvciA6IFZsYWQgR3VyZGlnYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ndXJkaWdhXG4vLyEgYXV0aG9yIDogVmFsZW50aW4gQWdhY2hpIDogaHR0cHM6Ly9naXRodWIuY29tL2F2YWx5XG4vLyEgYXV0aG9yIDogRW1hbnVlbCBDZXBvaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9jZXBlbVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lV2l0aFBsdXJhbChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0ID0ge1xuICAgICAgICAgICAgICAgIHNzOiAnc2VjdW5kZScsXG4gICAgICAgICAgICAgICAgbW06ICdtaW51dGUnLFxuICAgICAgICAgICAgICAgIGhoOiAnb3JlJyxcbiAgICAgICAgICAgICAgICBkZDogJ3ppbGUnLFxuICAgICAgICAgICAgICAgIHd3OiAnc8SDcHTEg23Dom5pJyxcbiAgICAgICAgICAgICAgICBNTTogJ2x1bmknLFxuICAgICAgICAgICAgICAgIHl5OiAnYW5pJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXBhcmF0b3IgPSAnICc7XG4gICAgICAgIGlmIChudW1iZXIgJSAxMDAgPj0gMjAgfHwgKG51bWJlciA+PSAxMDAgJiYgbnVtYmVyICUgMTAwID09PSAwKSkge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gJyBkZSAnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1iZXIgKyBzZXBhcmF0b3IgKyBmb3JtYXRba2V5XTtcbiAgICB9XG5cbiAgICB2YXIgcm8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdybycsIHtcbiAgICAgICAgbW9udGhzOiAnaWFudWFyaWVfZmVicnVhcmllX21hcnRpZV9hcHJpbGllX21haV9pdW5pZV9pdWxpZV9hdWd1c3Rfc2VwdGVtYnJpZV9vY3RvbWJyaWVfbm9pZW1icmllX2RlY2VtYnJpZScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnaWFuLl9mZWIuX21hcnQuX2Fwci5fbWFpX2l1bi5faXVsLl9hdWcuX3NlcHQuX29jdC5fbm92Ll9kZWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnZHVtaW5pY8SDX2x1bmlfbWFyyJtpX21pZXJjdXJpX2pvaV92aW5lcmlfc8OibWLEg3TEgycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0R1bV9MdW5fTWFyX01pZV9Kb2lfVmluX1PDom0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnRHVfTHVfTWFfTWlfSm9fVmlfU8OiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbYXppIGxhXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW23DomluZSBsYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtsYV0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tpZXJpIGxhXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tmb3N0YV0gZGRkZCBbbGFdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAncGVzdGUgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMOubiB1cm3EgycsXG4gICAgICAgICAgICBzOiAnY8OidGV2YSBzZWN1bmRlJyxcbiAgICAgICAgICAgIHNzOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbTogJ3VuIG1pbnV0JyxcbiAgICAgICAgICAgIG1tOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgaDogJ28gb3LEgycsXG4gICAgICAgICAgICBoaDogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGQ6ICdvIHppJyxcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgdzogJ28gc8SDcHTEg23Dom7EgycsXG4gICAgICAgICAgICB3dzogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIE06ICdvIGx1bsSDJyxcbiAgICAgICAgICAgIE1NOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgeTogJ3VuIGFuJyxcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogUnVzc2lhbiBbcnVdXG4vLyEgYXV0aG9yIDogVmlrdG9ybWluYXRvciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9WaWt0b3JtaW5hdG9yXG4vLyEgYXV0aG9yIDogTWVuZWxpb24gRWxlbnPDumxlIDogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcbi8vISBhdXRob3IgOiDQmtC+0YDQtdC90LHQtdGA0LMg0JzQsNGA0LogOiBodHRwczovL2dpdGh1Yi5jb20vc29ja2V0cGFpclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgZnVuY3Rpb24gcGx1cmFsKHdvcmQsIG51bSkge1xuICAgICAgICB2YXIgZm9ybXMgPSB3b3JkLnNwbGl0KCdfJyk7XG4gICAgICAgIHJldHVybiBudW0gJSAxMCA9PT0gMSAmJiBudW0gJSAxMDAgIT09IDExXG4gICAgICAgICAgICA/IGZvcm1zWzBdXG4gICAgICAgICAgICA6IG51bSAlIDEwID49IDIgJiYgbnVtICUgMTAgPD0gNCAmJiAobnVtICUgMTAwIDwgMTAgfHwgbnVtICUgMTAwID49IDIwKVxuICAgICAgICAgICAgICA/IGZvcm1zWzFdXG4gICAgICAgICAgICAgIDogZm9ybXNbMl07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGF0aXZlVGltZVdpdGhQbHVyYWwobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHtcbiAgICAgICAgICAgIHNzOiB3aXRob3V0U3VmZml4ID8gJ9GB0LXQutGD0L3QtNCwX9GB0LXQutGD0L3QtNGLX9GB0LXQutGD0L3QtCcgOiAn0YHQtdC60YPQvdC00YNf0YHQtdC60YPQvdC00Ytf0YHQtdC60YPQvdC0JyxcbiAgICAgICAgICAgIG1tOiB3aXRob3V0U3VmZml4ID8gJ9C80LjQvdGD0YLQsF/QvNC40L3Rg9GC0Ytf0LzQuNC90YPRgicgOiAn0LzQuNC90YPRgtGDX9C80LjQvdGD0YLRi1/QvNC40L3Rg9GCJyxcbiAgICAgICAgICAgIGhoOiAn0YfQsNGBX9GH0LDRgdCwX9GH0LDRgdC+0LInLFxuICAgICAgICAgICAgZGQ6ICfQtNC10L3RjF/QtNC90Y9f0LTQvdC10LknLFxuICAgICAgICAgICAgd3c6ICfQvdC10LTQtdC70Y9f0L3QtdC00LXQu9C4X9C90LXQtNC10LvRjCcsXG4gICAgICAgICAgICBNTTogJ9C80LXRgdGP0YZf0LzQtdGB0Y/RhtCwX9C80LXRgdGP0YbQtdCyJyxcbiAgICAgICAgICAgIHl5OiAn0LPQvtC0X9Cz0L7QtNCwX9C70LXRgicsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChrZXkgPT09ICdtJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0LzQuNC90YPRgtCwJyA6ICfQvNC40L3Rg9GC0YMnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIHBsdXJhbChmb3JtYXRba2V5XSwgK251bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIG1vbnRoc1BhcnNlID0gW1xuICAgICAgICAvXtGP0L3Qsi9pLFxuICAgICAgICAvXtGE0LXQsi9pLFxuICAgICAgICAvXtC80LDRgC9pLFxuICAgICAgICAvXtCw0L/RgC9pLFxuICAgICAgICAvXtC80LBb0LnRj10vaSxcbiAgICAgICAgL17QuNGO0L0vaSxcbiAgICAgICAgL17QuNGO0LsvaSxcbiAgICAgICAgL17QsNCy0LMvaSxcbiAgICAgICAgL17RgdC10L0vaSxcbiAgICAgICAgL17QvtC60YIvaSxcbiAgICAgICAgL17QvdC+0Y8vaSxcbiAgICAgICAgL17QtNC10LovaSxcbiAgICBdO1xuXG4gICAgLy8gaHR0cDovL25ldy5ncmFtb3RhLnJ1L3NwcmF2a2EvcnVsZXMvMTM5LXByb3AgOiDCpyAxMDNcbiAgICAvLyDQodC+0LrRgNCw0YnQtdC90LjRjyDQvNC10YHRj9GG0LXQsjogaHR0cDovL25ldy5ncmFtb3RhLnJ1L3NwcmF2a2EvYnVyby9zZWFyY2gtYW5zd2VyP3M9MjQyNjM3XG4gICAgLy8gQ0xEUiBkYXRhOiAgICAgICAgICBodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NsZHIvY2hhcnRzLzI4L3N1bW1hcnkvcnUuaHRtbCMxNzUzXG4gICAgdmFyIHJ1ID0gbW9tZW50LmRlZmluZUxvY2FsZSgncnUnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAn0Y/QvdCy0LDRgNGPX9GE0LXQstGA0LDQu9GPX9C80LDRgNGC0LBf0LDQv9GA0LXQu9GPX9C80LDRj1/QuNGO0L3Rj1/QuNGO0LvRj1/QsNCy0LPRg9GB0YLQsF/RgdC10L3RgtGP0LHRgNGPX9C+0LrRgtGP0LHRgNGPX9C90L7Rj9Cx0YDRj1/QtNC10LrQsNCx0YDRjycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn0Y/QvdCy0LDRgNGMX9GE0LXQstGA0LDQu9GMX9C80LDRgNGCX9Cw0L/RgNC10LvRjF/QvNCw0Llf0LjRjtC90Yxf0LjRjtC70Yxf0LDQstCz0YPRgdGCX9GB0LXQvdGC0Y/QsdGA0Yxf0L7QutGC0Y/QsdGA0Yxf0L3QvtGP0LHRgNGMX9C00LXQutCw0LHRgNGMJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6IHtcbiAgICAgICAgICAgIC8vINC/0L4gQ0xEUiDQuNC80LXQvdC90L4gXCLQuNGO0LsuXCIg0LggXCLQuNGO0L0uXCIsINC90L4g0LrQsNC60L7QuSDRgdC80YvRgdC7INC80LXQvdGP0YLRjCDQsdGD0LrQstGDINC90LAg0YLQvtGH0LrRgz9cbiAgICAgICAgICAgIGZvcm1hdDogJ9GP0L3Qsi5f0YTQtdCy0YAuX9C80LDRgC5f0LDQv9GALl/QvNCw0Y9f0LjRjtC90Y9f0LjRjtC70Y9f0LDQstCzLl/RgdC10L3Rgi5f0L7QutGCLl/QvdC+0Y/QsS5f0LTQtdC6Licuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn0Y/QvdCyLl/RhNC10LLRgC5f0LzQsNGA0YJf0LDQv9GALl/QvNCw0Llf0LjRjtC90Yxf0LjRjtC70Yxf0LDQstCzLl/RgdC10L3Rgi5f0L7QutGCLl/QvdC+0Y/QsS5f0LTQtdC6Licuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWtkYXlzOiB7XG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfQstC+0YHQutGA0LXRgdC10L3RjNC1X9C/0L7QvdC10LTQtdC70YzQvdC40Lpf0LLRgtC+0YDQvdC40Lpf0YHRgNC10LTQsF/Rh9C10YLQstC10YDQs1/Qv9GP0YLQvdC40YbQsF/RgdGD0LHQsdC+0YLQsCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBmb3JtYXQ6ICfQstC+0YHQutGA0LXRgdC10L3RjNC1X9C/0L7QvdC10LTQtdC70YzQvdC40Lpf0LLRgtC+0YDQvdC40Lpf0YHRgNC10LTRg1/Rh9C10YLQstC10YDQs1/Qv9GP0YLQvdC40YbRg1/RgdGD0LHQsdC+0YLRgycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgaXNGb3JtYXQ6IC9cXFsgP1vQktCyXSA/KD860L/RgNC+0YjQu9GD0Y580YHQu9C10LTRg9GO0YnRg9GOfNGN0YLRgyk/ID9dID9kZGRkLyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9Cy0YFf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0LLRgV/Qv9C9X9Cy0YJf0YHRgF/Rh9GCX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBsb25nTW9udGhzUGFyc2U6IG1vbnRoc1BhcnNlLFxuICAgICAgICBzaG9ydE1vbnRoc1BhcnNlOiBtb250aHNQYXJzZSxcblxuICAgICAgICAvLyDQv9C+0LvQvdGL0LUg0L3QsNC30LLQsNC90LjRjyDRgSDQv9Cw0LTQtdC20LDQvNC4LCDQv9C+INGC0YDQuCDQsdGD0LrQstGLLCDQtNC70Y8g0L3QtdC60L7RgtC+0YDRi9GFLCDQv9C+IDQg0LHRg9C60LLRiywg0YHQvtC60YDQsNGJ0LXQvdC40Y8g0YEg0YLQvtGH0LrQvtC5INC4INCx0LXQtyDRgtC+0YfQutC4XG4gICAgICAgIG1vbnRoc1JlZ2V4OlxuICAgICAgICAgICAgL14o0Y/QvdCy0LDRgFvRjNGPXXzRj9C90LJcXC4/fNGE0LXQstGA0LDQu1vRjNGPXXzRhNC10LLRgD9cXC4/fNC80LDRgNGC0LA/fNC80LDRgFxcLj980LDQv9GA0LXQu1vRjNGPXXzQsNC/0YBcXC4/fNC80LBb0LnRj1180LjRjtC9W9GM0Y9dfNC40Y7QvVxcLj980LjRjtC7W9GM0Y9dfNC40Y7Qu1xcLj980LDQstCz0YPRgdGC0LA/fNCw0LLQs1xcLj980YHQtdC90YLRj9Cx0YBb0YzRj1180YHQtdC90YI/XFwuP3zQvtC60YLRj9Cx0YBb0YzRj1180L7QutGCXFwuP3zQvdC+0Y/QsdGAW9GM0Y9dfNC90L7Rj9CxP1xcLj980LTQtdC60LDQsdGAW9GM0Y9dfNC00LXQulxcLj8pL2ksXG5cbiAgICAgICAgLy8g0LrQvtC/0LjRjyDQv9GA0LXQtNGL0LTRg9GJ0LXQs9C+XG4gICAgICAgIG1vbnRoc1Nob3J0UmVnZXg6XG4gICAgICAgICAgICAvXijRj9C90LLQsNGAW9GM0Y9dfNGP0L3QslxcLj980YTQtdCy0YDQsNC7W9GM0Y9dfNGE0LXQstGAP1xcLj980LzQsNGA0YLQsD980LzQsNGAXFwuP3zQsNC/0YDQtdC7W9GM0Y9dfNCw0L/RgFxcLj980LzQsFvQudGPXXzQuNGO0L1b0YzRj1180LjRjtC9XFwuP3zQuNGO0Ltb0YzRj1180LjRjtC7XFwuP3zQsNCy0LPRg9GB0YLQsD980LDQstCzXFwuP3zRgdC10L3RgtGP0LHRgFvRjNGPXXzRgdC10L3Rgj9cXC4/fNC+0LrRgtGP0LHRgFvRjNGPXXzQvtC60YJcXC4/fNC90L7Rj9Cx0YBb0YzRj1180L3QvtGP0LE/XFwuP3zQtNC10LrQsNCx0YBb0YzRj1180LTQtdC6XFwuPykvaSxcblxuICAgICAgICAvLyDQv9C+0LvQvdGL0LUg0L3QsNC30LLQsNC90LjRjyDRgSDQv9Cw0LTQtdC20LDQvNC4XG4gICAgICAgIG1vbnRoc1N0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14o0Y/QvdCy0LDRgFvRj9GMXXzRhNC10LLRgNCw0Ltb0Y/RjF180LzQsNGA0YLQsD980LDQv9GA0LXQu1vRj9GMXXzQvNCwW9GP0LldfNC40Y7QvVvRj9GMXXzQuNGO0Ltb0Y/RjF180LDQstCz0YPRgdGC0LA/fNGB0LXQvdGC0Y/QsdGAW9GP0YxdfNC+0LrRgtGP0LHRgFvRj9GMXXzQvdC+0Y/QsdGAW9GP0YxdfNC00LXQutCw0LHRgFvRj9GMXSkvaSxcblxuICAgICAgICAvLyDQktGL0YDQsNC20LXQvdC40LUsINC60L7RgtC+0YDQvtC1INGB0L7QvtGC0LLQtdGC0YHRgtCy0YPQtdGCINGC0L7Qu9GM0LrQviDRgdC+0LrRgNCw0YnRkdC90L3Ri9C8INGE0L7RgNC80LDQvFxuICAgICAgICBtb250aHNTaG9ydFN0cmljdFJlZ2V4OlxuICAgICAgICAgICAgL14o0Y/QvdCyXFwufNGE0LXQstGAP1xcLnzQvNCw0YBb0YIuXXzQsNC/0YBcXC580LzQsFvRj9C5XXzQuNGO0L1b0YzRjy5dfNC40Y7Qu1vRjNGPLl180LDQstCzXFwufNGB0LXQvdGCP1xcLnzQvtC60YJcXC580L3QvtGP0LE/XFwufNC00LXQulxcLikvaSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVkg0LMuJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZINCzLiwgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkg0LMuLCBIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0KHQtdCz0L7QtNC90Y8sINCyXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9CX0LDQstGC0YDQsCwg0LJdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0JLRh9C10YDQsCwg0LJdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdy53ZWVrKCkgIT09IHRoaXMud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINGB0LvQtdC00YPRjtGJ0LXQtV0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0YHQu9C10LTRg9GO0YnQuNC5XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDRgdC70LXQtNGD0Y7RidGD0Y5dIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF5KCkgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CS0L5dIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JJdIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAobm93KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vdy53ZWVrKCkgIT09IHRoaXMud2VlaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CSINC/0YDQvtGI0LvQvtC1XSBkZGRkLCBb0LJdIExUJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vQkiDQv9GA0L7RiNC70YvQuV0gZGRkZCwgW9CyXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JIg0L/RgNC+0YjQu9GD0Y5dIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF5KCkgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9CS0L5dIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0JJdIGRkZGQsIFvQsl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0YfQtdGA0LXQtyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg0L3QsNC30LDQtCcsXG4gICAgICAgICAgICBzOiAn0L3QtdGB0LrQvtC70YzQutC+INGB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBzczogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIG06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtbTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIGg6ICfRh9Cw0YEnLFxuICAgICAgICAgICAgaGg6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBkOiAn0LTQtdC90YwnLFxuICAgICAgICAgICAgZGQ6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB3OiAn0L3QtdC00LXQu9GPJyxcbiAgICAgICAgICAgIHd3OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgTTogJ9C80LXRgdGP0YYnLFxuICAgICAgICAgICAgTU06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICB5OiAn0LPQvtC0JyxcbiAgICAgICAgICAgIHl5OiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv0L3QvtGH0Lh80YPRgtGA0LB80LTQvdGPfNCy0LXRh9C10YDQsC9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijQtNC90Y980LLQtdGH0LXRgNCwKSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQvdC+0YfQuCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YPRgtGA0LAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9C00L3Rjyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LLQtdGH0LXRgNCwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LSjQuXzQs9C+fNGPKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3QuSc7XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdCz0L4nO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJy3Rjyc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJ1O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNpbmRoaSBbc2RdXG4vLyEgYXV0aG9yIDogTmFyYWluIFNhZ2FyIDogaHR0cHM6Ly9naXRodWIuY29tL25hcmFpbnNhZ2FyXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID0gW1xuICAgICAgICAgICAgJ9is2YbZiNix2YonLFxuICAgICAgICAgICAgJ9mB2YrYqNix2YjYsdmKJyxcbiAgICAgICAgICAgICfZhdin2LHahicsXG4gICAgICAgICAgICAn2KfZvtix2YrZhCcsXG4gICAgICAgICAgICAn2YXYptmKJyxcbiAgICAgICAgICAgICfYrNmI2YYnLFxuICAgICAgICAgICAgJ9is2YjZhNin2KHZkCcsXG4gICAgICAgICAgICAn2KLar9iz2b0nLFxuICAgICAgICAgICAgJ9iz2YrZvtm92YXYqNixJyxcbiAgICAgICAgICAgICfYotqq2b3ZiNio2LEnLFxuICAgICAgICAgICAgJ9mG2YjZhdio2LEnLFxuICAgICAgICAgICAgJ9qK2LPZhdio2LEnLFxuICAgICAgICBdLFxuICAgICAgICBkYXlzID0gWyfYotqG2LEnLCAn2LPZiNmF2LEnLCAn2Kfasdin2LHZiCcsICfYp9ix2KjYuScsICfYrtmF2YrYsycsICfYrNmF2LknLCAn2ofZhtqH2LEnXTtcblxuICAgIHZhciBzZCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3NkJywge1xuICAgICAgICBtb250aHM6IG1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IG1vbnRocyxcbiAgICAgICAgd2Vla2RheXM6IGRheXMsXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6IGRheXMsXG4gICAgICAgIHdlZWtkYXlzTWluOiBkYXlzLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRk2IwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv2LXYqNitfNi02KfZhS8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuICfYtNin2YUnID09PSBpbnB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9i12KjYrSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ9i02KfZhSc7XG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9in2oRdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2LPagNin2rvZil0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvYp9qz2YrZhiDZh9mB2KrZiiDYqtmKXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9qq2KfZhNmH2YddIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9qv2LLYsdmK2YQg2YfZgdiq2YpdIGRkZGQgW9iq2YpdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg2b7ZiNihJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDYp9qzJyxcbiAgICAgICAgICAgIHM6ICfahtmG2K8g2LPZitqq2YbaiicsXG4gICAgICAgICAgICBzczogJyVkINiz2YraqtmG2oonLFxuICAgICAgICAgICAgbTogJ9mH2qog2YXZhtm9JyxcbiAgICAgICAgICAgIG1tOiAnJWQg2YXZhtm9JyxcbiAgICAgICAgICAgIGg6ICfZh9qqINqq2YTYp9qqJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2qrZhNin2qonLFxuICAgICAgICAgICAgZDogJ9mH2qog2o/ZitmG2YfZhicsXG4gICAgICAgICAgICBkZDogJyVkINqP2YrZhtmH2YYnLFxuICAgICAgICAgICAgTTogJ9mH2qog2YXZh9mK2YbZiCcsXG4gICAgICAgICAgICBNTTogJyVkINmF2YfZitmG2KcnLFxuICAgICAgICAgICAgeTogJ9mH2qog2LPYp9mEJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPYp9mEJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2Q7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogTm9ydGhlcm4gU2FtaSBbc2VdXG4vLyEgYXV0aG9ycyA6IELDpXJkIFJvbHN0YWQgSGVucmlrc2VuIDogaHR0cHM6Ly9naXRodWIuY29tL2thcmFtZWxsXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc2UgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzZScsIHtcbiAgICAgICAgbW9udGhzOiAnb8SRxJFhamFnZW3DoW5udV9ndW92dmFtw6FubnVfbmp1a8SNYW3DoW5udV9jdW/Fi29tw6FubnVfbWllc3NlbcOhbm51X2dlYXNzZW3DoW5udV9zdW9pZG5lbcOhbm51X2JvcmdlbcOhbm51X8SNYWvEjWFtw6FubnVfZ29sZ2dvdG3DoW5udV9za8OhYm1hbcOhbm51X2p1b3ZsYW3DoW5udScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnb8SRxJFqX2d1b3Zfbmp1a19jdW9fbWllc19nZWFzX3N1b2lfYm9yZ1/EjWFrxI1fZ29sZ19za8OhYl9qdW92Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdzb3RuYWJlYWl2aV92dW9zc8OhcmdhX21hxYvFi2Viw6FyZ2FfZ2Fza2F2YWhra3VfZHVvcmFzdGF0X2JlYXJqYWRhdF9sw6F2dmFyZGF0Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdzb3RuX3Z1b3NfbWHFi19nYXNrX2R1b3JfYmVhcl9sw6F2Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ3Nfdl9tX2dfZF9iX0wnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnTU1NTSBELiBbYi5dIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnTU1NTSBELiBbYi5dIFlZWVkgW3RpLl0gSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gRC4gW2IuXSBZWVlZIFt0aS5dIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbb3RuZSB0aV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tpaHR0aW4gdGldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbdGldIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbaWt0ZSB0aV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbb3ZkZGl0XSBkZGRkIFt0aV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyBnZWHFvmVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdtYcWLaXQgJXMnLFxuICAgICAgICAgICAgczogJ21vYWRkZSBzZWt1bmRkYXQnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWt1bmRkYXQnLFxuICAgICAgICAgICAgbTogJ29rdGEgbWludWh0YScsXG4gICAgICAgICAgICBtbTogJyVkIG1pbnVodGF0JyxcbiAgICAgICAgICAgIGg6ICdva3RhIGRpaW1tdScsXG4gICAgICAgICAgICBoaDogJyVkIGRpaW1tdXQnLFxuICAgICAgICAgICAgZDogJ29rdGEgYmVhaXZpJyxcbiAgICAgICAgICAgIGRkOiAnJWQgYmVhaXZ2aXQnLFxuICAgICAgICAgICAgTTogJ29rdGEgbcOhbm51JyxcbiAgICAgICAgICAgIE1NOiAnJWQgbcOhbnV0JyxcbiAgICAgICAgICAgIHk6ICdva3RhIGphaGtpJyxcbiAgICAgICAgICAgIHl5OiAnJWQgamFnaXQnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNlO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFNpbmhhbGVzZSBbc2ldXG4vLyEgYXV0aG9yIDogU2FtcGF0aCBTaXRpbmFtYWx1d2EgOiBodHRwczovL2dpdGh1Yi5jb20vc2FtcGF0aHNyaXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIC8qanNoaW50IC1XMTAwKi9cbiAgICB2YXIgc2kgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzaScsIHtcbiAgICAgICAgbW9udGhzOiAn4Lai4Lax4LeA4LeP4La74LeSX+C2tOC3meC2tuC2u+C3gOC3j+C2u+C3kl/gtrjgt4/gtrvgt4rgtq3gt5Rf4LaF4La04LeK4oCN4La74Lea4La94LeKX+C2uOC3kOC2uuC3kl/gtqLgt5bgtrHgt5Jf4Lai4LeW4La94LeSX+C2heC2nOC3neC3g+C3iuC2reC3lF/gt4Pgt5DgtrTgt4rgtq3gt5Dgtrjgt4rgtrbgtrvgt4pf4LaU4Laa4LeK4Lat4Led4La24La74LeKX+C2seC3nOC3gOC3kOC2uOC3iuC2tuC2u+C3il/gtq/gt5ngt4Pgt5Dgtrjgt4rgtrbgtrvgt4onLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAn4Lai4LaxX+C2tOC3meC2tl/gtrjgt4/gtrvgt4pf4LaF4La04LeKX+C2uOC3kOC2uuC3kl/gtqLgt5bgtrHgt5Jf4Lai4LeW4La94LeSX+C2heC2nOC3nV/gt4Pgt5DgtrTgt4pf4LaU4Laa4LeKX+C2seC3nOC3gOC3kF/gtq/gt5ngt4Pgt5AnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ+C2ieC2u+C3kuC2r+C3j1/gt4PgtrPgt5Tgtq/gt49f4LaF4Laf4LeE4La74LeU4LeA4LeP4Lav4LePX+C2tuC2r+C3j+C2r+C3j1/gtrbgt4rigI3gtrvgt4Tgt4Pgt4rgtrTgtq3gt5LgtrHgt4rgtq/gt49f4LeD4LeS4Laa4LeU4La74LeP4Lav4LePX+C3g+C3meC2seC3g+C3lOC2u+C3j+C2r+C3jycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4LaJ4La74LeSX+C3g+C2s+C3lF/gtoXgtp9f4La24Lav4LePX+C2tuC3iuKAjeC2u+C3hF/gt4Pgt5Lgtprgt5Rf4LeD4LeZ4LaxJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+C2iV/gt4Nf4LaFX+C2tl/gtrbgt4rigI3gtrtf4LeD4LeSX+C3g+C3mScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdhIGg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnYSBoOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdZWVlZL01NL0REJyxcbiAgICAgICAgICAgIExMOiAnWVlZWSBNTU1NIEQnLFxuICAgICAgICAgICAgTExMOiAnWVlZWSBNTU1NIEQsIGEgaDptbScsXG4gICAgICAgICAgICBMTExMOiAnWVlZWSBNTU1NIEQgW+C3gOC3kOC2seC3kl0gZGRkZCwgYSBoOm1tOnNzJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4LaF4LavXSBMVFvgtqddJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4LeE4LeZ4LanXSBMVFvgtqddJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBMVFvgtqddJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4LaK4La64LeaXSBMVFvgtqddJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+C2tOC3g+C3lOC2nOC3kuC2ul0gZGRkZCBMVFvgtqddJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXPgtprgt5LgtrHgt4onLFxuICAgICAgICAgICAgcGFzdDogJyVz4Laa4LanIOC2tOC3meC2uycsXG4gICAgICAgICAgICBzOiAn4Lat4Lat4LeK4La04La7IOC2muC3kuC3hOC3kuC2tOC2uicsXG4gICAgICAgICAgICBzczogJ+C2reC2reC3iuC2tOC2uyAlZCcsXG4gICAgICAgICAgICBtOiAn4La44LeS4Lax4LeS4Lat4LeK4Lat4LeU4LeAJyxcbiAgICAgICAgICAgIG1tOiAn4La44LeS4Lax4LeS4Lat4LeK4Lat4LeUICVkJyxcbiAgICAgICAgICAgIGg6ICfgtrTgt5DgtronLFxuICAgICAgICAgICAgaGg6ICfgtrTgt5DgtrogJWQnLFxuICAgICAgICAgICAgZDogJ+C2r+C3kuC2seC2uicsXG4gICAgICAgICAgICBkZDogJ+C2r+C3kuC2sSAlZCcsXG4gICAgICAgICAgICBNOiAn4La44LeP4LeD4La6JyxcbiAgICAgICAgICAgIE1NOiAn4La44LeP4LeDICVkJyxcbiAgICAgICAgICAgIHk6ICfgt4Dgt4PgtrsnLFxuICAgICAgICAgICAgeXk6ICfgt4Dgt4PgtrsgJWQnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0g4LeA4LeQ4Lax4LeSLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcg4LeA4LeQ4Lax4LeSJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL+C2tOC3meC2uyDgt4Dgtrvgt5R84La04LeD4LeKIOC3gOC2u+C3lHzgtrTgt5ku4LeAfOC2tC7gt4AuLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfgtrQu4LeALicgfHwgaW5wdXQgPT09ICfgtrTgt4Pgt4og4LeA4La74LeUJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICfgtrQu4LeALicgOiAn4La04LeD4LeKIOC3gOC2u+C3lCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ+C2tOC3mS7gt4AuJyA6ICfgtrTgt5ngtrsg4LeA4La74LeUJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzaTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTbG92YWsgW3NrXVxuLy8hIGF1dGhvciA6IE1hcnRpbiBNaW5rYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9rMnNcbi8vISBiYXNlZCBvbiB3b3JrIG9mIHBldHJiZWxhIDogaHR0cHM6Ly9naXRodWIuY29tL3BldHJiZWxhXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbW9udGhzID1cbiAgICAgICAgICAgICdqYW51w6FyX2ZlYnJ1w6FyX21hcmVjX2FwcsOtbF9tw6FqX2rDum5fasO6bF9hdWd1c3Rfc2VwdGVtYmVyX29rdMOzYmVyX25vdmVtYmVyX2RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0ID0gJ2phbl9mZWJfbWFyX2Fwcl9tw6FqX2rDum5fasO6bF9hdWdfc2VwX29rdF9ub3ZfZGVjJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7XG4gICAgICAgIHJldHVybiBuID4gMSAmJiBuIDwgNTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAncyc6IC8vIGEgZmV3IHNlY29uZHMgLyBpbiBhIGZldyBzZWNvbmRzIC8gYSBmZXcgc2Vjb25kcyBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdww6FyIHNla8O6bmQnIDogJ3DDoXIgc2VrdW5kYW1pJztcbiAgICAgICAgICAgIGNhc2UgJ3NzJzogLy8gOSBzZWNvbmRzIC8gaW4gOSBzZWNvbmRzIC8gOSBzZWNvbmRzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnc2VrdW5keScgOiAnc2Vrw7puZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnc2VrdW5kYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtJzogLy8gYSBtaW51dGUgLyBpbiBhIG1pbnV0ZSAvIGEgbWludXRlIGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4ID8gJ21pbsO6dGEnIDogaXNGdXR1cmUgPyAnbWluw7p0dScgOiAnbWluw7p0b3UnO1xuICAgICAgICAgICAgY2FzZSAnbW0nOiAvLyA5IG1pbnV0ZXMgLyBpbiA5IG1pbnV0ZXMgLyA5IG1pbnV0ZXMgYWdvXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChwbHVyYWwobnVtYmVyKSA/ICdtaW7DunR5JyA6ICdtaW7DunQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ21pbsO6dGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnaCc6IC8vIGFuIGhvdXIgLyBpbiBhbiBob3VyIC8gYW4gaG91ciBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdob2RpbmEnIDogaXNGdXR1cmUgPyAnaG9kaW51JyA6ICdob2Rpbm91JztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzogLy8gOSBob3VycyAvIGluIDkgaG91cnMgLyA5IGhvdXJzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnaG9kaW55JyA6ICdob2TDrW4nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ2hvZGluYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdkJzogLy8gYSBkYXkgLyBpbiBhIGRheSAvIGEgZGF5IGFnb1xuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2RlxYgnIDogJ2TFiG9tJztcbiAgICAgICAgICAgIGNhc2UgJ2RkJzogLy8gOSBkYXlzIC8gaW4gOSBkYXlzIC8gOSBkYXlzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAnZG5pJyA6ICdkbsOtJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdkxYhhbWknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ00nOiAvLyBhIG1vbnRoIC8gaW4gYSBtb250aCAvIGEgbW9udGggYWdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWVzaWFjJyA6ICdtZXNpYWNvbSc7XG4gICAgICAgICAgICBjYXNlICdNTSc6IC8vIDkgbW9udGhzIC8gaW4gOSBtb250aHMgLyA5IG1vbnRocyBhZ29cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKHBsdXJhbChudW1iZXIpID8gJ21lc2lhY2UnIDogJ21lc2lhY292Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICdtZXNpYWNtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAneSc6IC8vIGEgeWVhciAvIGluIGEgeWVhciAvIGEgeWVhciBhZ29cbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdyb2snIDogJ3Jva29tJztcbiAgICAgICAgICAgIGNhc2UgJ3l5JzogLy8gOSB5ZWFycyAvIGluIDkgeWVhcnMgLyA5IHllYXJzIGFnb1xuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAocGx1cmFsKG51bWJlcikgPyAncm9reScgOiAncm9rb3YnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ3Jva21pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2sgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzaycsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHNTaG9ydCxcbiAgICAgICAgd2Vla2RheXM6ICduZWRlxL5hX3BvbmRlbG9rX3V0b3Jva19zdHJlZGFfxaF0dnJ0b2tfcGlhdG9rX3NvYm90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lX3BvX3V0X3N0X8WhdF9waV9zbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICduZV9wb191dF9zdF/FoXRfcGlfc28nLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0g6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RuZXMgb10gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1t6YWp0cmEgb10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdiBuZWRlxL51IG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBkZGRkIFtvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Ygc3RyZWR1IG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdm8gxaF0dnJ0b2sgb10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2IHBpYXRvayBvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3Ygc29ib3R1IG9dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdERheTogJ1t2xI1lcmEgb10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbbWludWzDuiBuZWRlxL51IG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO9XSBkZGRkIFtvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw7ogc3RyZWR1IG9dIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ttaW51bMO9XSBkZGRkIFtvXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW21pbnVsw7ogc29ib3R1IG9dIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJlZCAlcycsXG4gICAgICAgICAgICBzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTTogdHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2s7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU2xvdmVuaWFuIFtzbF1cbi8vISBhdXRob3IgOiBSb2JlcnQgU2Vkb3bFoWVrIDogaHR0cHM6Ly9naXRodWIuY29tL3NlZG92c2VrXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICBmdW5jdGlvbiBwcm9jZXNzUmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5LCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbnVtYmVyICsgJyAnO1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmVcbiAgICAgICAgICAgICAgICAgICAgPyAnbmVrYWogc2VrdW5kJ1xuICAgICAgICAgICAgICAgICAgICA6ICduZWthaiBzZWt1bmRhbWknO1xuICAgICAgICAgICAgY2FzZSAnc3MnOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggPyAnc2VrdW5kbycgOiAnc2VrdW5kaSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnc2VrdW5kaScgOiAnc2VrdW5kYWgnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdzZWt1bmRlJyA6ICdzZWt1bmRhaCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdzZWt1bmQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAnZW5hIG1pbnV0YScgOiAnZW5vIG1pbnV0byc7XG4gICAgICAgICAgICBjYXNlICdtbSc6XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCA/ICdtaW51dGEnIDogJ21pbnV0byc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWludXRpJyA6ICdtaW51dGFtYSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPCA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21pbnV0ZScgOiAnbWludXRhbWknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21pbnV0JyA6ICdtaW51dGFtaSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA/ICdlbmEgdXJhJyA6ICdlbm8gdXJvJztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4ID8gJ3VyYScgOiAndXJvJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICd1cmknIDogJ3VyYW1hJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAndXJlJyA6ICd1cmFtaSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAndXInIDogJ3VyYW1pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2VuIGRhbicgOiAnZW5pbSBkbmVtJztcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2RhbicgOiAnZG5lbSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnZG5pJyA6ICdkbmV2b21hJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdkbmknIDogJ2RuZXZpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2VuIG1lc2VjJyA6ICdlbmltIG1lc2VjZW0nO1xuICAgICAgICAgICAgY2FzZSAnTU0nOlxuICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWVzZWMnIDogJ21lc2VjZW0nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ21lc2VjYScgOiAnbWVzZWNlbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdtZXNlY2UnIDogJ21lc2VjaSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHdpdGhvdXRTdWZmaXggfHwgaXNGdXR1cmUgPyAnbWVzZWNldicgOiAnbWVzZWNpJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2VubyBsZXRvJyA6ICdlbmltIGxldG9tJztcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB3aXRob3V0U3VmZml4IHx8IGlzRnV0dXJlID8gJ2xldG8nIDogJ2xldG9tJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdsZXRpJyA6ICdsZXRvbWEnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVyIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdsZXRhJyA6ICdsZXRpJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gd2l0aG91dFN1ZmZpeCB8fCBpc0Z1dHVyZSA/ICdsZXQnIDogJ2xldGknO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc2wnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcl9mZWJydWFyX21hcmVjX2FwcmlsX21hal9qdW5pal9qdWxpal9hdmd1c3Rfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tYXIuX2Fwci5fbWFqLl9qdW4uX2p1bC5fYXZnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnbmVkZWxqYV9wb25lZGVsamVrX3RvcmVrX3NyZWRhX8SNZXRydGVrX3BldGVrX3NvYm90YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lZC5fcG9uLl90b3IuX3NyZS5fxI1ldC5fcGV0Ll9zb2IuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3RvX3NyX8SNZV9wZV9zbycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELiBNTS4gWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QuIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkgSDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRC4gTU1NTSBZWVlZIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tkYW5lcyBvYl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tqdXRyaSBvYl0gTFQnLFxuXG4gICAgICAgICAgICBuZXh0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBbbmVkZWxqb10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIFtzcmVkb10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ZdIFtzb2JvdG9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1t2XSBkZGRkIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW3bEjWVyYWogb2JdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ByZWrFoW5qb10gW25lZGVsam9dIFtvYl0gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1twcmVqxaFuam9dIFtzcmVkb10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ByZWrFoW5qb10gW3NvYm90b10gW29iXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ByZWrFoW5qaV0gZGRkZCBbb2JdIExUJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfEjWV6ICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdwcmVkICVzJyxcbiAgICAgICAgICAgIHM6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBzczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzbDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBBbGJhbmlhbiBbc3FdXG4vLyEgYXV0aG9yIDogRmxha8OrcmltIElzbWFuaSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9mbGFrZXJpbWlcbi8vISBhdXRob3IgOiBNZW5lbGlvbiBFbGVuc8O6bGUgOiBodHRwczovL2dpdGh1Yi5jb20vT2lyZVxuLy8hIGF1dGhvciA6IE9lcmQgQ3VrYWxsYSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9vZXJkXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3EgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzcScsIHtcbiAgICAgICAgbW9udGhzOiAnSmFuYXJfU2hrdXJ0X01hcnNfUHJpbGxfTWFqX1FlcnNob3JfS29ycmlrX0d1c2h0X1NodGF0b3JfVGV0b3JfTsOrbnRvcl9EaGpldG9yJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9TaGtfTWFyX1ByaV9NYWpfUWVyX0tvcl9HdXNfU2h0X1RldF9Ow6tuX0Roaicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdFIERpZWxfRSBIw6tuw6tfRSBNYXJ0w6tfRSBNw6tya3Vyw6tfRSBFbmp0ZV9FIFByZW10ZV9FIFNodHVuw6snLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdEaWVfSMOrbl9NYXJfTcOrcl9FbmpfUHJlX1NodCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdEX0hfTWFfTcOrX0VfUF9TaCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvUER8TUQvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5jaGFyQXQoMCkgPT09ICdNJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXJzIDwgMTIgPyAnUEQnIDogJ01EJztcbiAgICAgICAgfSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tTb3QgbsOrXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW05lc8OrciBuw6tdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbbsOrXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0RqZSBuw6tdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnZGRkZCBbZSBrYWx1YXIgbsOrXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ27DqyAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgbcOrIHBhcsOrJyxcbiAgICAgICAgICAgIHM6ICdkaXNhIHNla29uZGEnLFxuICAgICAgICAgICAgc3M6ICclZCBzZWtvbmRhJyxcbiAgICAgICAgICAgIG06ICduasOrIG1pbnV0w6snLFxuICAgICAgICAgICAgbW06ICclZCBtaW51dGEnLFxuICAgICAgICAgICAgaDogJ25qw6sgb3LDqycsXG4gICAgICAgICAgICBoaDogJyVkIG9yw6snLFxuICAgICAgICAgICAgZDogJ25qw6sgZGl0w6snLFxuICAgICAgICAgICAgZGQ6ICclZCBkaXTDqycsXG4gICAgICAgICAgICBNOiAnbmrDqyBtdWFqJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbXVhaicsXG4gICAgICAgICAgICB5OiAnbmrDqyB2aXQnLFxuICAgICAgICAgICAgeXk6ICclZCB2aXRlJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzcTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTZXJiaWFuIEN5cmlsbGljIFtzci1jeXJsXVxuLy8hIGF1dGhvciA6IE1pbGFuIEphbmHEjWtvdmnEhzxtaWxhbmphbmFja292aWNAZ21haWwuY29tPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWxhbi1qXG4vLyEgYXV0aG9yIDogU3RlZmFuIENybmpha292acSHIDxzdGVmYW5AaG90bWFpbC5ycz4gOiBodHRwczovL2dpdGh1Yi5jb20vY3JuamFrb3ZpY1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRyYW5zbGF0b3IgPSB7XG4gICAgICAgIHdvcmRzOiB7XG4gICAgICAgICAgICAvL0RpZmZlcmVudCBncmFtbWF0aWNhbCBjYXNlc1xuICAgICAgICAgICAgc3M6IFsn0YHQtdC60YPQvdC00LAnLCAn0YHQtdC60YPQvdC00LUnLCAn0YHQtdC60YPQvdC00LgnXSxcbiAgICAgICAgICAgIG06IFsn0ZjQtdC00LDQvSDQvNC40L3Rg9GCJywgJ9GY0LXQtNC90L7QsyDQvNC40L3Rg9GC0LAnXSxcbiAgICAgICAgICAgIG1tOiBbJ9C80LjQvdGD0YInLCAn0LzQuNC90YPRgtCwJywgJ9C80LjQvdGD0YLQsCddLFxuICAgICAgICAgICAgaDogWyfRmNC10LTQsNC9INGB0LDRgicsICfRmNC10LTQvdC+0LMg0YHQsNGC0LAnXSxcbiAgICAgICAgICAgIGhoOiBbJ9GB0LDRgicsICfRgdCw0YLQsCcsICfRgdCw0YLQuCddLFxuICAgICAgICAgICAgZDogWyfRmNC10LTQsNC9INC00LDQvScsICfRmNC10LTQvdC+0LMg0LTQsNC90LAnXSxcbiAgICAgICAgICAgIGRkOiBbJ9C00LDQvScsICfQtNCw0L3QsCcsICfQtNCw0L3QsCddLFxuICAgICAgICAgICAgTTogWyfRmNC10LTQsNC9INC80LXRgdC10YYnLCAn0ZjQtdC00L3QvtCzINC80LXRgdC10YbQsCddLFxuICAgICAgICAgICAgTU06IFsn0LzQtdGB0LXRhicsICfQvNC10YHQtdGG0LAnLCAn0LzQtdGB0LXRhtC4J10sXG4gICAgICAgICAgICB5OiBbJ9GY0LXQtNC90YMg0LPQvtC00LjQvdGDJywgJ9GY0LXQtNC90LUg0LPQvtC00LjQvdC1J10sXG4gICAgICAgICAgICB5eTogWyfQs9C+0LTQuNC90YMnLCAn0LPQvtC00LjQvdC1JywgJ9Cz0L7QtNC40L3QsCddLFxuICAgICAgICB9LFxuICAgICAgICBjb3JyZWN0R3JhbW1hdGljYWxDYXNlOiBmdW5jdGlvbiAobnVtYmVyLCB3b3JkS2V5KSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbnVtYmVyICUgMTAgPj0gMSAmJlxuICAgICAgICAgICAgICAgIG51bWJlciAlIDEwIDw9IDQgJiZcbiAgICAgICAgICAgICAgICAobnVtYmVyICUgMTAwIDwgMTAgfHwgbnVtYmVyICUgMTAwID49IDIwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciAlIDEwID09PSAxID8gd29yZEtleVswXSA6IHdvcmRLZXlbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd29yZEtleVsyXTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgICAgICB2YXIgd29yZEtleSA9IHRyYW5zbGF0b3Iud29yZHNba2V5XSxcbiAgICAgICAgICAgICAgICB3b3JkO1xuXG4gICAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIE5vbWluYXRpdlxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICd5JyAmJiB3aXRob3V0U3VmZml4KSByZXR1cm4gJ9GY0LXQtNC90LAg0LPQvtC00LjQvdCwJztcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3b3JkID0gdHJhbnNsYXRvci5jb3JyZWN0R3JhbW1hdGljYWxDYXNlKG51bWJlciwgd29yZEtleSk7XG4gICAgICAgICAgICAvLyBOb21pbmF0aXZcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd5eScgJiYgd2l0aG91dFN1ZmZpeCAmJiB3b3JkID09PSAn0LPQvtC00LjQvdGDJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnINCz0L7QtNC40L3QsCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyB3b3JkO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICB2YXIgc3JDeXJsID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3ItY3lybCcsIHtcbiAgICAgICAgbW9udGhzOiAn0ZjQsNC90YPQsNGAX9GE0LXQsdGA0YPQsNGAX9C80LDRgNGCX9Cw0L/RgNC40Ltf0LzQsNGYX9GY0YPQvV/RmNGD0Ltf0LDQstCz0YPRgdGCX9GB0LXQv9GC0LXQvNCx0LDRgF/QvtC60YLQvtCx0LDRgF/QvdC+0LLQtdC80LHQsNGAX9C00LXRhtC10LzQsdCw0YAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9GY0LDQvS5f0YTQtdCxLl/QvNCw0YAuX9Cw0L/RgC5f0LzQsNGYX9GY0YPQvV/RmNGD0Ltf0LDQstCzLl/RgdC10L8uX9C+0LrRgi5f0L3QvtCyLl/QtNC10YYuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ9C90LXQtNC10ZnQsF/Qv9C+0L3QtdC00LXRmdCw0Lpf0YPRgtC+0YDQsNC6X9GB0YDQtdC00LBf0YfQtdGC0LLRgNGC0LDQul/Qv9C10YLQsNC6X9GB0YPQsdC+0YLQsCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C90LXQtC5f0L/QvtC9Ll/Rg9GC0L4uX9GB0YDQtS5f0YfQtdGCLl/Qv9C10YIuX9GB0YPQsS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0L3QtV/Qv9C+X9GD0YJf0YHRgF/Rh9C1X9C/0LVf0YHRgycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QuIE0uIFlZWVkuJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZLicsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkuIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWS4gSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9C00LDQvdCw0YEg0YNdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0YHRg9GC0YDQsCDRg10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb0YNdIFvQvdC10LTQtdGZ0YNdIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gW9GB0YDQtdC00YNdIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vRg10gW9GB0YPQsdC+0YLRg10gW9GDXSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW9GDXSBkZGRkIFvRg10gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW9GY0YPRh9C1INGDXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBsYXN0V2Vla0RheXMgPSBbXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C1XSBb0L3QtdC00LXRmdC1XSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70L7Qs10gW9C/0L7QvdC10LTQtdGZ0LrQsF0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C+0LNdIFvRg9GC0L7RgNC60LBdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQtV0gW9GB0YDQtdC00LVdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW9C/0YDQvtGI0LvQvtCzXSBb0YfQtdGC0LLRgNGC0LrQsF0gW9GDXSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdb0L/RgNC+0YjQu9C+0LNdIFvQv9C10YLQutCwXSBb0YNdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1vQv9GA0L7RiNC70LVdIFvRgdGD0LHQvtGC0LVdIFvRg10gTFQnLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RXZWVrRGF5c1t0aGlzLmRheSgpXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ9C30LAgJXMnLFxuICAgICAgICAgICAgcGFzdDogJ9C/0YDQtSAlcycsXG4gICAgICAgICAgICBzOiAn0L3QtdC60L7Qu9C40LrQviDRgdC10LrRg9C90LTQuCcsXG4gICAgICAgICAgICBzczogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaGg6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgZDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBkZDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIHk6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgeXk6IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn1cXC4vLFxuICAgICAgICBvcmRpbmFsOiAnJWQuJyxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXN0IGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNyQ3lybDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTZXJiaWFuIFtzcl1cbi8vISBhdXRob3IgOiBNaWxhbiBKYW5hxI1rb3ZpxIc8bWlsYW5qYW5hY2tvdmljQGdtYWlsLmNvbT4gOiBodHRwczovL2dpdGh1Yi5jb20vbWlsYW4talxuLy8hIGF1dGhvciA6IFN0ZWZhbiBDcm5qYWtvdmnEhyA8c3RlZmFuQGhvdG1haWwucnM+IDogaHR0cHM6Ly9naXRodWIuY29tL2Nybmpha292aWNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0cmFuc2xhdG9yID0ge1xuICAgICAgICB3b3Jkczoge1xuICAgICAgICAgICAgLy9EaWZmZXJlbnQgZ3JhbW1hdGljYWwgY2FzZXNcbiAgICAgICAgICAgIHNzOiBbJ3Nla3VuZGEnLCAnc2VrdW5kZScsICdzZWt1bmRpJ10sXG4gICAgICAgICAgICBtOiBbJ2plZGFuIG1pbnV0JywgJ2plZG5vZyBtaW51dGEnXSxcbiAgICAgICAgICAgIG1tOiBbJ21pbnV0JywgJ21pbnV0YScsICdtaW51dGEnXSxcbiAgICAgICAgICAgIGg6IFsnamVkYW4gc2F0JywgJ2plZG5vZyBzYXRhJ10sXG4gICAgICAgICAgICBoaDogWydzYXQnLCAnc2F0YScsICdzYXRpJ10sXG4gICAgICAgICAgICBkOiBbJ2plZGFuIGRhbicsICdqZWRub2cgZGFuYSddLFxuICAgICAgICAgICAgZGQ6IFsnZGFuJywgJ2RhbmEnLCAnZGFuYSddLFxuICAgICAgICAgICAgTTogWydqZWRhbiBtZXNlYycsICdqZWRub2cgbWVzZWNhJ10sXG4gICAgICAgICAgICBNTTogWydtZXNlYycsICdtZXNlY2EnLCAnbWVzZWNpJ10sXG4gICAgICAgICAgICB5OiBbJ2plZG51IGdvZGludScsICdqZWRuZSBnb2RpbmUnXSxcbiAgICAgICAgICAgIHl5OiBbJ2dvZGludScsICdnb2RpbmUnLCAnZ29kaW5hJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGNvcnJlY3RHcmFtbWF0aWNhbENhc2U6IGZ1bmN0aW9uIChudW1iZXIsIHdvcmRLZXkpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBudW1iZXIgJSAxMCA+PSAxICYmXG4gICAgICAgICAgICAgICAgbnVtYmVyICUgMTAgPD0gNCAmJlxuICAgICAgICAgICAgICAgIChudW1iZXIgJSAxMDAgPCAxMCB8fCBudW1iZXIgJSAxMDAgPj0gMjApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICUgMTAgPT09IDEgPyB3b3JkS2V5WzBdIDogd29yZEtleVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3JkS2V5WzJdO1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uIChudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGtleSwgaXNGdXR1cmUpIHtcbiAgICAgICAgICAgIHZhciB3b3JkS2V5ID0gdHJhbnNsYXRvci53b3Jkc1trZXldLFxuICAgICAgICAgICAgICAgIHdvcmQ7XG5cbiAgICAgICAgICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gTm9taW5hdGl2XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3knICYmIHdpdGhvdXRTdWZmaXgpIHJldHVybiAnamVkbmEgZ29kaW5hJztcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNGdXR1cmUgfHwgd2l0aG91dFN1ZmZpeCA/IHdvcmRLZXlbMF0gOiB3b3JkS2V5WzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3b3JkID0gdHJhbnNsYXRvci5jb3JyZWN0R3JhbW1hdGljYWxDYXNlKG51bWJlciwgd29yZEtleSk7XG4gICAgICAgICAgICAvLyBOb21pbmF0aXZcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICd5eScgJiYgd2l0aG91dFN1ZmZpeCAmJiB3b3JkID09PSAnZ29kaW51Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnIGdvZGluYSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnICcgKyB3b3JkO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICB2YXIgc3IgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzcicsIHtcbiAgICAgICAgbW9udGhzOiAnamFudWFyX2ZlYnJ1YXJfbWFydF9hcHJpbF9tYWpfanVuX2p1bF9hdmd1c3Rfc2VwdGVtYmFyX29rdG9iYXJfbm92ZW1iYXJfZGVjZW1iYXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ2phbi5fZmViLl9tYXIuX2Fwci5fbWFqX2p1bl9qdWxfYXZnLl9zZXAuX29rdC5fbm92Ll9kZWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ25lZGVsamFfcG9uZWRlbGpha191dG9yYWtfc3JlZGFfxI1ldHZydGFrX3BldGFrX3N1Ym90YScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ25lZC5fcG9uLl91dG8uX3NyZS5fxI1ldC5fcGV0Ll9zdWIuJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ25lX3BvX3V0X3NyX8SNZV9wZV9zdScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0g6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0QuIE0uIFlZWVkuJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBZWVlZLicsXG4gICAgICAgICAgICBMTEw6ICdELiBNTU1NIFlZWVkuIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQuIE1NTU0gWVlZWS4gSDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2RhbmFzIHVdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbc3V0cmEgdV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW25lZGVsanVdIFt1XSBMVCc7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3VdIFtzcmVkdV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gW3N1Ym90dV0gW3VdIExUJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbdV0gZGRkZCBbdV0gTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2p1xI1lIHVdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3RXZWVrRGF5cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxlXSBbbmVkZWxqZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICAgICAgJ1twcm/FoWxvZ10gW3BvbmVkZWxqa2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsb2ddIFt1dG9ya2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW3NyZWRlXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbxI1ldHZydGthXSBbdV0gTFQnLFxuICAgICAgICAgICAgICAgICAgICAnW3Byb8WhbG9nXSBbcGV0a2FdIFt1XSBMVCcsXG4gICAgICAgICAgICAgICAgICAgICdbcHJvxaFsZV0gW3N1Ym90ZV0gW3VdIExUJyxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXN0V2Vla0RheXNbdGhpcy5kYXkoKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICd6YSAlcycsXG4gICAgICAgICAgICBwYXN0OiAncHJlICVzJyxcbiAgICAgICAgICAgIHM6ICduZWtvbGlrbyBzZWt1bmRpJyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIG06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgbW06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgaDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBoaDogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdG9yLnRyYW5zbGF0ZSxcbiAgICAgICAgICAgIE06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgTU06IHRyYW5zbGF0b3IudHJhbnNsYXRlLFxuICAgICAgICAgICAgeTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgICAgICB5eTogdHJhbnNsYXRvci50cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3I7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogc2lTd2F0aSBbc3NdXG4vLyEgYXV0aG9yIDogTmljb2xhaSBEYXZpZXM8bWFpbEBuaWNvbGFpLmlvPiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9uaWNvbGFpZGF2aWVzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3MgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCdzcycsIHtcbiAgICAgICAgbW9udGhzOiBcIkJoaW1iaWR2d2FuZV9JbmRsb3ZhbmFfSW5kbG92J2xlbmtodWx1X01hYmFzYV9Jbmtod2VraHdldGlfSW5obGFiYV9LaG9sd2FuZV9JbmdjaV9JbnlvbmlfSW1waGFsYV9Md2V0aV9JbmdvbmdvbmlcIi5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0JoaV9JbmFfSW51X01hYl9JbmtfSW5oX0tob19JZ2NfSW55X0ltcF9Md2VfSWdvJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdMaXNvbnRmb19VbXNvbWJ1bHVrb19MZXNpYmlsaV9MZXNpdHNhdGZ1X0xlc2luZV9MZXNpaGxhbnVfVW1nY2liZWxvJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdMaXNfVW1iX0xzYl9MZXNfTHNpX0xzaF9VbWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnTGlfVXNfTGJfTHRfTHNfTGhfVWcnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ2g6bW06c3MgQScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIGg6bW0gQScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbTmFtdWhsYSBuZ2FdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbS3VzYXNhIG5nYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtuZ2FdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSXRvbG8gbmdhXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2xlbGlwaGVsaWxlXSBbbmdhXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ25nYSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnd2VudGVrYSBuZ2EgJXMnLFxuICAgICAgICAgICAgczogJ2VtaXp1endhbmEgbG9tY2FuZScsXG4gICAgICAgICAgICBzczogJyVkIG16dXp3YW5hJyxcbiAgICAgICAgICAgIG06ICd1bXp1enUnLFxuICAgICAgICAgICAgbW06ICclZCBlbWl6dXp1JyxcbiAgICAgICAgICAgIGg6ICdsaWhvcmEnLFxuICAgICAgICAgICAgaGg6ICclZCBlbWFob3JhJyxcbiAgICAgICAgICAgIGQ6ICdsaWxhbmdhJyxcbiAgICAgICAgICAgIGRkOiAnJWQgZW1hbGFuZ2EnLFxuICAgICAgICAgICAgTTogJ2lueWFuZ2EnLFxuICAgICAgICAgICAgTU06ICclZCB0aW55YW5nYScsXG4gICAgICAgICAgICB5OiAndW1ueWFrYScsXG4gICAgICAgICAgICB5eTogJyVkIGltaW55YWthJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL2VrdXNlbml8ZW1pbml8ZW50c2FtYmFtYXxlYnVzdWt1LyxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzIDwgMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VrdXNlbmknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VycyA8IDE1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdlbWluaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VudHNhbWJhbWEnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VidXN1a3UnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbUhvdXI6IGZ1bmN0aW9uIChob3VyLCBtZXJpZGllbSkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVyaWRpZW0gPT09ICdla3VzZW5pJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ2VtaW5pJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDExID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyaWRpZW0gPT09ICdlbnRzYW1iYW1hJyB8fCBtZXJpZGllbSA9PT0gJ2VidXN1a3UnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS8sXG4gICAgICAgIG9yZGluYWw6ICclZCcsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBTd2VkaXNoIFtzdl1cbi8vISBhdXRob3IgOiBKZW5zIEFsbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS91bG11c1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN2ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3YnLCB7XG4gICAgICAgIG1vbnRoczogJ2phbnVhcmlfZmVicnVhcmlfbWFyc19hcHJpbF9tYWpfanVuaV9qdWxpX2F1Z3VzdGlfc2VwdGVtYmVyX29rdG9iZXJfbm92ZW1iZXJfZGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnamFuX2ZlYl9tYXJfYXByX21hal9qdW5fanVsX2F1Z19zZXBfb2t0X25vdl9kZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnc8O2bmRhZ19tw6VuZGFnX3Rpc2RhZ19vbnNkYWdfdG9yc2RhZ19mcmVkYWdfbMO2cmRhZycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ3PDtm5fbcOlbl90aXNfb25zX3Rvcl9mcmVfbMO2cicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdzw7ZfbcOlX3RpX29uX3RvX2ZyX2zDticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVktTU0tREQnLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBba2wuXSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCBEIE1NTU0gWVlZWSBba2wuXSBISDptbScsXG4gICAgICAgICAgICBsbGw6ICdEIE1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGxsbGw6ICdkZGQgRCBNTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0lkYWddIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbSW1vcmdvbl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tJZ8Olcl0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbUMOlXSBkZGRkIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW0ldIGRkZGRbc10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdvbSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnZsO2ciAlcyBzZWRhbicsXG4gICAgICAgICAgICBzOiAnbsOlZ3JhIHNla3VuZGVyJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VrdW5kZXInLFxuICAgICAgICAgICAgbTogJ2VuIG1pbnV0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRlcicsXG4gICAgICAgICAgICBoOiAnZW4gdGltbWUnLFxuICAgICAgICAgICAgaGg6ICclZCB0aW1tYXInLFxuICAgICAgICAgICAgZDogJ2VuIGRhZycsXG4gICAgICAgICAgICBkZDogJyVkIGRhZ2FyJyxcbiAgICAgICAgICAgIE06ICdlbiBtw6VuYWQnLFxuICAgICAgICAgICAgTU06ICclZCBtw6VuYWRlcicsXG4gICAgICAgICAgICB5OiAnZXR0IMOlcicsXG4gICAgICAgICAgICB5eTogJyVkIMOlcicsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShcXDplfFxcOmEpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnOmUnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnOmEnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJzphJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnOmUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICc6ZSc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3Y7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogU3dhaGlsaSBbc3ddXG4vLyEgYXV0aG9yIDogRmFoYWQgS2Fzc2ltIDogaHR0cHM6Ly9naXRodWIuY29tL2ZhZHNlbFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN3ID0gbW9tZW50LmRlZmluZUxvY2FsZSgnc3cnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbnVhcmlfRmVicnVhcmlfTWFjaGlfQXByaWxpX01laV9KdW5pX0p1bGFpX0Fnb3N0aV9TZXB0ZW1iYV9Pa3RvYmFfTm92ZW1iYV9EZXNlbWJhJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZWJfTWFjX0Fwcl9NZWlfSnVuX0p1bF9BZ29fU2VwX09rdF9Ob3ZfRGVzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdKdW1hcGlsaV9KdW1hdGF0dV9KdW1hbm5lX0p1bWF0YW5vX0FsaGFtaXNpX0lqdW1hYV9KdW1hbW9zaScuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnSnBsX0p0YXRfSm5uZV9KdGFuX0FsaF9Jam1fSm1vcycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdKMl9KM19KNF9KNV9BbF9Jal9KMScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoaDptbSBBJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdbbGVvIHNhYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1trZXNobyBzYWFdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnW3dpa2kgaWpheW9dIGRkZGQgW3NhYXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbamFuYV0gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdbd2lraSBpbGl5b3BpdGFdIGRkZGQgW3NhYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgYmFhZGF5ZScsXG4gICAgICAgICAgICBwYXN0OiAndG9rZWEgJXMnLFxuICAgICAgICAgICAgczogJ2hpdmkgcHVuZGUnLFxuICAgICAgICAgICAgc3M6ICdzZWt1bmRlICVkJyxcbiAgICAgICAgICAgIG06ICdkYWtpa2EgbW9qYScsXG4gICAgICAgICAgICBtbTogJ2Rha2lrYSAlZCcsXG4gICAgICAgICAgICBoOiAnc2FhIGxpbW9qYScsXG4gICAgICAgICAgICBoaDogJ21hc2FhICVkJyxcbiAgICAgICAgICAgIGQ6ICdzaWt1IG1vamEnLFxuICAgICAgICAgICAgZGQ6ICdzaWt1ICVkJyxcbiAgICAgICAgICAgIE06ICdtd2V6aSBtbW9qYScsXG4gICAgICAgICAgICBNTTogJ21pZXppICVkJyxcbiAgICAgICAgICAgIHk6ICdtd2FrYSBtbW9qYScsXG4gICAgICAgICAgICB5eTogJ21pYWthICVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN3O1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRhbWlsIFt0YV1cbi8vISBhdXRob3IgOiBBcmp1bmt1bWFyIEtyaXNobmFtb29ydGh5IDogaHR0cHM6Ly9naXRodWIuY29tL3RrMTIwNDA0XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgc3ltYm9sTWFwID0ge1xuICAgICAgICAgICAgMTogJ+CvpycsXG4gICAgICAgICAgICAyOiAn4K+oJyxcbiAgICAgICAgICAgIDM6ICfgr6knLFxuICAgICAgICAgICAgNDogJ+CvqicsXG4gICAgICAgICAgICA1OiAn4K+rJyxcbiAgICAgICAgICAgIDY6ICfgr6wnLFxuICAgICAgICAgICAgNzogJ+CvrScsXG4gICAgICAgICAgICA4OiAn4K+uJyxcbiAgICAgICAgICAgIDk6ICfgr68nLFxuICAgICAgICAgICAgMDogJ+CvpicsXG4gICAgICAgIH0sXG4gICAgICAgIG51bWJlck1hcCA9IHtcbiAgICAgICAgICAgICfgr6cnOiAnMScsXG4gICAgICAgICAgICAn4K+oJzogJzInLFxuICAgICAgICAgICAgJ+CvqSc6ICczJyxcbiAgICAgICAgICAgICfgr6onOiAnNCcsXG4gICAgICAgICAgICAn4K+rJzogJzUnLFxuICAgICAgICAgICAgJ+CvrCc6ICc2JyxcbiAgICAgICAgICAgICfgr60nOiAnNycsXG4gICAgICAgICAgICAn4K+uJzogJzgnLFxuICAgICAgICAgICAgJ+Cvryc6ICc5JyxcbiAgICAgICAgICAgICfgr6YnOiAnMCcsXG4gICAgICAgIH07XG5cbiAgICB2YXIgdGEgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0YScsIHtcbiAgICAgICAgbW9udGhzOiAn4K6c4K6p4K614K6w4K6/X+CuquCuv+CuquCvjeCusOCuteCusOCuv1/grq7grr7grrDgr43grprgr41f4K6P4K6q4K+N4K6w4K6y4K+NX+CuruCvh1/grpzgr4Lgrqngr41f4K6c4K+C4K6y4K+IX+CuhuCuleCuuOCvjeCun+CvjV/grprgr4bgrqrgr43grp/gr4bgrq7gr43grqrgrrDgr41f4K6F4K6V4K+N4K6f4K+H4K6+4K6q4K6w4K+NX+CuqOCuteCuruCvjeCuquCusOCvjV/grp/grr/grprgrq7gr43grqrgrrDgr40nLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+CunOCuqeCuteCusOCuv1/grqrgrr/grqrgr43grrDgrrXgrrDgrr9f4K6u4K6+4K6w4K+N4K6a4K+NX+Cuj+CuquCvjeCusOCusuCvjV/grq7gr4df4K6c4K+C4K6p4K+NX+CunOCvguCusuCviF/grobgrpXgrrjgr43grp/gr41f4K6a4K+G4K6q4K+N4K6f4K+G4K6u4K+N4K6q4K6w4K+NX+CuheCuleCvjeCun+Cvh+CuvuCuquCusOCvjV/grqjgrrXgrq7gr43grqrgrrDgr41f4K6f4K6/4K6a4K6u4K+N4K6q4K6w4K+NJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ+CunuCuvuCur+Cuv+CuseCvjeCuseCvgeCuleCvjeCuleCuv+CutOCuruCviF/grqTgrr/grpngr43grpXgrp/gr43grpXgrr/grrTgrq7gr4hf4K6a4K+G4K614K+N4K614K6+4K6v4K+N4K6V4K6/4K604K6u4K+IX+CuquCvgeCupOCuqeCvjeCuleCuv+CutOCuruCviF/grrXgrr/grq/grr7grrTgrpXgr43grpXgrr/grrTgrq7gr4hf4K614K+G4K6z4K+N4K6z4K6/4K6V4K+N4K6V4K6/4K604K6u4K+IX+CumuCuqeCuv+CuleCvjeCuleCuv+CutOCuruCviCcuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4K6e4K6+4K6v4K6/4K6x4K+BX+CupOCuv+CumeCvjeCuleCus+CvjV/grprgr4bgrrXgr43grrXgrr7grq/gr41f4K6q4K+B4K6k4K6p4K+NX+CuteCuv+Cur+CuvuCutOCuqeCvjV/grrXgr4bgrrPgr43grrPgrr9f4K6a4K6p4K6/Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+CunuCuvl/grqTgrr9f4K6a4K+GX+CuquCvgV/grrXgrr9f4K614K+GX+Cumicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSwgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW+Cuh+CuqeCvjeCuseCvgV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vgrqjgrr7grrPgr4hdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCwgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vgrqjgr4fgrrHgr43grrHgr4FdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+CuleCun+CuqOCvjeCupCDgrrXgrr7grrDgrq7gr41dIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4K6H4K6y4K+NJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgrq7gr4Hgrqngr40nLFxuICAgICAgICAgICAgczogJ+CukuCusOCvgSDgrprgrr/grrIg4K614K6/4K6o4K6+4K6f4K6/4K6V4K6z4K+NJyxcbiAgICAgICAgICAgIHNzOiAnJWQg4K614K6/4K6o4K6+4K6f4K6/4K6V4K6z4K+NJyxcbiAgICAgICAgICAgIG06ICfgrpLgrrDgr4Eg4K6o4K6/4K6u4K6/4K6f4K6u4K+NJyxcbiAgICAgICAgICAgIG1tOiAnJWQg4K6o4K6/4K6u4K6/4K6f4K6Z4K+N4K6V4K6z4K+NJyxcbiAgICAgICAgICAgIGg6ICfgrpLgrrDgr4Eg4K6u4K6j4K6/IOCuqOCvh+CusOCuruCvjScsXG4gICAgICAgICAgICBoaDogJyVkIOCuruCuo+CuvyDgrqjgr4fgrrDgrq7gr40nLFxuICAgICAgICAgICAgZDogJ+CukuCusOCvgSDgrqjgrr7grrPgr40nLFxuICAgICAgICAgICAgZGQ6ICclZCDgrqjgrr7grp/gr43grpXgrrPgr40nLFxuICAgICAgICAgICAgTTogJ+CukuCusOCvgSDgrq7grr7grqTgrq7gr40nLFxuICAgICAgICAgICAgTU06ICclZCDgrq7grr7grqTgrpngr43grpXgrrPgr40nLFxuICAgICAgICAgICAgeTogJ+CukuCusOCvgSDgrrXgrrDgr4Hgrp/grq7gr40nLFxuICAgICAgICAgICAgeXk6ICclZCDgrobgrqPgr43grp/gr4HgrpXgrrPgr40nLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3grrXgrqTgr4EvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+CuteCupOCvgSc7XG4gICAgICAgIH0sXG4gICAgICAgIHByZXBhcnNlOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1vgr6fgr6jgr6ngr6rgr6vgr6zgr63gr67gr6/gr6ZdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvc3Rmb3JtYXQ6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFxkL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2xNYXBbbWF0Y2hdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIHJlZmVyIGh0dHA6Ly90YS53aWtpcGVkaWEub3JnL3MvMWVyMVxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4K6v4K6+4K6u4K6u4K+NfOCuteCviOCuleCuseCviHzgrpXgrr7grrLgr4h84K6o4K6j4K+N4K6q4K6V4K6y4K+NfOCujuCuseCvjeCuquCuvuCun+CvgXzgrq7grr7grrLgr4gvLFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6v4K6+4K6u4K6u4K+NJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgrrXgr4jgrpXgrrHgr4gnOyAvLyDgrrXgr4jgrpXgrrHgr4hcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDEwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6V4K6+4K6y4K+IJzsgLy8g4K6V4K6+4K6y4K+IXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCuqOCuo+CvjeCuquCuleCusuCvjSc7IC8vIOCuqOCuo+CvjeCuquCuleCusuCvjVxuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyDgro7grrHgr43grqrgrr7grp/gr4EnOyAvLyDgro7grrHgr43grqrgrr7grp/gr4FcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDIyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcg4K6u4K6+4K6y4K+IJzsgLy8g4K6u4K6+4K6y4K+IXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnIOCur+CuvuCuruCuruCvjSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+Cur+CuvuCuruCuruCvjScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDIgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CuteCviOCuleCuseCviCcgfHwgbWVyaWRpZW0gPT09ICfgrpXgrr7grrLgr4gnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4K6o4K6j4K+N4K6q4K6V4K6y4K+NJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyID49IDEwID8gaG91ciA6IGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRhO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRlbHVndSBbdGVdXG4vLyEgYXV0aG9yIDogS3Jpc2huYSBDaGFpdGFueWEgVGhvdGEgOiBodHRwczovL2dpdGh1Yi5jb20va2N0aG90YVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHRlID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGUnLCB7XG4gICAgICAgIG1vbnRoczogJ+CwnOCwqOCwteCwsOCwv1/gsKvgsL/gsKzgsY3gsLDgsLXgsLDgsL9f4LCu4LC+4LCw4LGN4LCa4LC/X+Cwj+CwquCxjeCwsOCwv+CwsuCxjV/gsK7gsYdf4LCc4LGC4LCo4LGNX+CwnOCxgeCwsuCxiF/gsIbgsJfgsLjgsY3gsJ/gsYFf4LC44LGG4LCq4LGN4LCf4LGG4LCC4LCs4LCw4LGNX+CwheCwleCxjeCwn+Cxi+CwrOCwsOCxjV/gsKjgsLXgsILgsKzgsLDgsY1f4LCh4LC/4LC44LGG4LCC4LCs4LCw4LGNJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICfgsJzgsKguX+Cwq+Cwv+CwrOCxjeCwsC5f4LCu4LC+4LCw4LGN4LCa4LC/X+Cwj+CwquCxjeCwsOCwvy5f4LCu4LGHX+CwnOCxguCwqOCxjV/gsJzgsYHgsLLgsYhf4LCG4LCXLl/gsLjgsYbgsKrgsY0uX+CwheCwleCxjeCwn+Cxiy5f4LCo4LC1Ll/gsKHgsL/gsLjgsYYuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ+CwhuCwpuCwv+CwteCwvuCwsOCwgl/gsLjgsYvgsK7gsLXgsL7gsLDgsIJf4LCu4LCC4LCX4LCz4LC14LC+4LCw4LCCX+CwrOCxgeCwp+CwteCwvuCwsOCwgl/gsJfgsYHgsLDgsYHgsLXgsL7gsLDgsIJf4LC24LGB4LCV4LGN4LCw4LC14LC+4LCw4LCCX+CwtuCwqOCwv+CwteCwvuCwsOCwgicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4LCG4LCm4LC/X+CwuOCxi+Cwrl/gsK7gsILgsJfgsLNf4LCs4LGB4LCnX+Cwl+CxgeCwsOCxgV/gsLbgsYHgsJXgsY3gsLBf4LC24LCo4LC/Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+Cwhl/gsLjgsYtf4LCu4LCCX+CwrOCxgV/gsJfgsYFf4LC24LGBX+Cwticuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnQSBoOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0EgaDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIEQgTU1NTSBZWVlZLCBBIGg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vgsKjgsYfgsKHgsYFdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb4LCw4LGH4LCq4LGBXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQsIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb4LCo4LC/4LCo4LGN4LCoXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vgsJfgsKRdIGRkZGQsIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg4LCy4LGLJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDgsJXgsY3gsLDgsL/gsKTgsIInLFxuICAgICAgICAgICAgczogJ+CwleCxiuCwqOCxjeCwqOCwvyDgsJXgsY3gsLfgsKPgsL7gsLLgsYEnLFxuICAgICAgICAgICAgc3M6ICclZCDgsLjgsYbgsJXgsKjgsY3gsLLgsYEnLFxuICAgICAgICAgICAgbTogJ+CwkuCwlSDgsKjgsL/gsK7gsL/gsLfgsIInLFxuICAgICAgICAgICAgbW06ICclZCDgsKjgsL/gsK7gsL/gsLfgsL7gsLLgsYEnLFxuICAgICAgICAgICAgaDogJ+CwkuCwlSDgsJfgsILgsJ8nLFxuICAgICAgICAgICAgaGg6ICclZCDgsJfgsILgsJ/gsLLgsYEnLFxuICAgICAgICAgICAgZDogJ+CwkuCwlSDgsLDgsYvgsJzgsYEnLFxuICAgICAgICAgICAgZGQ6ICclZCDgsLDgsYvgsJzgsYHgsLLgsYEnLFxuICAgICAgICAgICAgTTogJ+CwkuCwlSDgsKjgsYbgsLInLFxuICAgICAgICAgICAgTU06ICclZCDgsKjgsYbgsLLgsLLgsYEnLFxuICAgICAgICAgICAgeTogJ+CwkuCwlSDgsLjgsILgsLXgsKTgsY3gsLjgsLDgsIInLFxuICAgICAgICAgICAgeXk6ICclZCDgsLjgsILgsLXgsKTgsY3gsLjgsLDgsL7gsLLgsYEnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn3gsLUvLFxuICAgICAgICBvcmRpbmFsOiAnJWTgsLUnLFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LCw4LC+4LCk4LGN4LCw4LC/fOCwieCwpuCwr+CwgnzgsK7gsKfgsY3gsK/gsL7gsLngsY3gsKjgsIJ84LC44LC+4LCv4LCC4LCk4LGN4LCw4LCCLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09PSAn4LCw4LC+4LCk4LGN4LCw4LC/Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyIDwgNCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LCJ4LCm4LCv4LCCJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+CwruCwp+CxjeCwr+CwvuCwueCxjeCwqOCwgicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMCA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn4LC44LC+4LCv4LCC4LCk4LGN4LCw4LCCJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CwsOCwvuCwpOCxjeCwsOCwvyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LCJ4LCm4LCv4LCCJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfgsK7gsKfgsY3gsK/gsL7gsLngsY3gsKjgsIInO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMjApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+CwuOCwvuCwr+CwguCwpOCxjeCwsOCwgic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4LCw4LC+4LCk4LGN4LCw4LC/JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNiwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRlO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRldHVuIERpbGkgKEVhc3QgVGltb3IpIFt0ZXRdXG4vLyEgYXV0aG9yIDogSm9zaHVhIEJyb29rcyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3NoYnJvb2tzXG4vLyEgYXV0aG9yIDogT25vcmlvIERlIEouIEFmb25zbyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJvYm9cbi8vISBhdXRob3IgOiBTb25pYSBTaW1vZXMgOiBodHRwczovL2dpdGh1Yi5jb20vc29uaWFzaW1vZXNcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB0ZXQgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0ZXQnLCB7XG4gICAgICAgIG1vbnRoczogJ0phbmVpcnVfRmV2ZXJlaXJ1X01hcnN1X0FicmlsX01haXVfSnXDsXVfSnVsbHVfQWd1c3R1X1NldGVtYnJ1X091dHVicnVfTm92ZW1icnVfRGV6ZW1icnUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnSmFuX0Zldl9NYXJfQWJyX01haV9KdW5fSnVsX0Fnb19TZXRfT3V0X05vdl9EZXonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnRG9taW5ndV9TZWd1bmRhX1RlcnNhX0t1YXJ0YV9LaW50YV9TZXN0YV9TYWJhZHUnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdEb21fU2VnX1RlcnNfS3VhX0tpbnRfU2VzdF9TYWInLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnRG9fU2VnX1RlX0t1X0tpX1Nlc19TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tPaGluIGloYV0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tBYmFuIGloYV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtpaGFdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSG9yaXNlaWsgaWhhXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW3NlbWFuYSBrb3R1a10gW2loYV0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdpaGEgJXMnLFxuICAgICAgICAgICAgcGFzdDogJyVzIGxpdWJhJyxcbiAgICAgICAgICAgIHM6ICdzZWd1bmR1IGJhbHVuJyxcbiAgICAgICAgICAgIHNzOiAnc2VndW5kdSAlZCcsXG4gICAgICAgICAgICBtOiAnbWludXR1IGlkYScsXG4gICAgICAgICAgICBtbTogJ21pbnV0dSAlZCcsXG4gICAgICAgICAgICBoOiAnb3JhcyBpZGEnLFxuICAgICAgICAgICAgaGg6ICdvcmFzICVkJyxcbiAgICAgICAgICAgIGQ6ICdsb3JvbiBpZGEnLFxuICAgICAgICAgICAgZGQ6ICdsb3JvbiAlZCcsXG4gICAgICAgICAgICBNOiAnZnVsYW4gaWRhJyxcbiAgICAgICAgICAgIE1NOiAnZnVsYW4gJWQnLFxuICAgICAgICAgICAgeTogJ3RpbmFuIGlkYScsXG4gICAgICAgICAgICB5eTogJ3RpbmFuICVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHN0fG5kfHJkfHRoKS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBiID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgICAgICAgICAgfn4oKG51bWJlciAlIDEwMCkgLyAxMCkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3JkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndGgnO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRldDtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUYWppayBbdGddXG4vLyEgYXV0aG9yIDogT3JpZiBOLiBKci4gOiBodHRwczovL2dpdGh1Yi5jb20vb3JpZi1qclxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN1ZmZpeGVzID0ge1xuICAgICAgICAwOiAnLdGD0LwnLFxuICAgICAgICAxOiAnLdGD0LwnLFxuICAgICAgICAyOiAnLdGO0LwnLFxuICAgICAgICAzOiAnLdGO0LwnLFxuICAgICAgICA0OiAnLdGD0LwnLFxuICAgICAgICA1OiAnLdGD0LwnLFxuICAgICAgICA2OiAnLdGD0LwnLFxuICAgICAgICA3OiAnLdGD0LwnLFxuICAgICAgICA4OiAnLdGD0LwnLFxuICAgICAgICA5OiAnLdGD0LwnLFxuICAgICAgICAxMDogJy3Rg9C8JyxcbiAgICAgICAgMTI6ICct0YPQvCcsXG4gICAgICAgIDEzOiAnLdGD0LwnLFxuICAgICAgICAyMDogJy3Rg9C8JyxcbiAgICAgICAgMzA6ICct0Y7QvCcsXG4gICAgICAgIDQwOiAnLdGD0LwnLFxuICAgICAgICA1MDogJy3Rg9C8JyxcbiAgICAgICAgNjA6ICct0YPQvCcsXG4gICAgICAgIDcwOiAnLdGD0LwnLFxuICAgICAgICA4MDogJy3Rg9C8JyxcbiAgICAgICAgOTA6ICct0YPQvCcsXG4gICAgICAgIDEwMDogJy3Rg9C8JyxcbiAgICB9O1xuXG4gICAgdmFyIHRnID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGcnLCB7XG4gICAgICAgIG1vbnRoczoge1xuICAgICAgICAgICAgZm9ybWF0OiAn0Y/QvdCy0LDRgNC4X9GE0LXQstGA0LDQu9C4X9C80LDRgNGC0Lhf0LDQv9GA0LXQu9C4X9C80LDQudC4X9C40Y7QvdC4X9C40Y7Qu9C4X9Cw0LLQs9GD0YHRgtC4X9GB0LXQvdGC0Y/QsdGA0Lhf0L7QutGC0Y/QsdGA0Lhf0L3QvtGP0LHRgNC4X9C00LXQutCw0LHRgNC4Jy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFuZGFsb25lOlxuICAgICAgICAgICAgICAgICfRj9C90LLQsNGAX9GE0LXQstGA0LDQu1/QvNCw0YDRgl/QsNC/0YDQtdC7X9C80LDQuV/QuNGO0L1f0LjRjtC7X9Cw0LLQs9GD0YHRgl/RgdC10L3RgtGP0LHRgF/QvtC60YLRj9Cx0YBf0L3QvtGP0LHRgF/QtNC10LrQsNCx0YAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBtb250aHNTaG9ydDogJ9GP0L3Qsl/RhNC10LJf0LzQsNGAX9Cw0L/RgF/QvNCw0Llf0LjRjtC9X9C40Y7Qu1/QsNCy0LNf0YHQtdC9X9C+0LrRgl/QvdC+0Y9f0LTQtdC6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9GP0LrRiNCw0L3QsdC1X9C00YPRiNCw0L3QsdC1X9GB0LXRiNCw0L3QsdC1X9GH0L7RgNGI0LDQvdCx0LVf0L/QsNC90rfRiNCw0L3QsdC1X9K30YPQvNGK0LBf0YjQsNC90LHQtScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9GP0YjQsV/QtNGI0LFf0YHRiNCxX9GH0YjQsV/Qv9GI0LFf0rfRg9C8X9GI0L3QsScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfRj9GIX9C00Yhf0YHRiF/Rh9GIX9C/0Yhf0rfQvF/RiNCxJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW9CY0LzRgNOv0Lcg0YHQvtCw0YLQuF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vQpNCw0YDQtNC+INGB0L7QsNGC0LhdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0JTQuNGA06/QtyDRgdC+0LDRgtC4XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGRb0LhdIFvSs9Cw0YTRgtCw0Lgg0L7Rj9C90LTQsCDRgdC+0LDRgtC4XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGRb0LhdIFvSs9Cw0YTRgtCw0Lgg0LPRg9C30LDRiNGC0LAg0YHQvtCw0YLQuF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQsdCw0YrQtNC4ICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDQv9C10YgnLFxuICAgICAgICAgICAgczogJ9GP0LrRh9Cw0L3QtCDRgdC+0L3QuNGPJyxcbiAgICAgICAgICAgIG06ICfRj9C6INC00LDSm9C40pvQsCcsXG4gICAgICAgICAgICBtbTogJyVkINC00LDSm9C40pvQsCcsXG4gICAgICAgICAgICBoOiAn0Y/QuiDRgdC+0LDRgicsXG4gICAgICAgICAgICBoaDogJyVkINGB0L7QsNGCJyxcbiAgICAgICAgICAgIGQ6ICfRj9C6INGA06/QtycsXG4gICAgICAgICAgICBkZDogJyVkINGA06/QtycsXG4gICAgICAgICAgICBNOiAn0Y/QuiDQvNC+0rMnLFxuICAgICAgICAgICAgTU06ICclZCDQvNC+0rMnLFxuICAgICAgICAgICAgeTogJ9GP0Log0YHQvtC7JyxcbiAgICAgICAgICAgIHl5OiAnJWQg0YHQvtC7JyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9GI0LDQsXzRgdGD0LHSs3zRgNOv0Ld80LHQtdCz0L7Ssy8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ9GI0LDQsScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA8IDQgPyBob3VyIDogaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ9GB0YPQsdKzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ9GA06/QtycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn0LHQtdCz0L7SsycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRiNCw0LEnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GB0YPQsdKzJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ciA8IDE2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfRgNOv0LcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3VyIDwgMTkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9Cx0LXQs9C+0rMnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9GI0LDQsSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfS0o0YPQvHzRjtC8KS8sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgICAgIHZhciBhID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICAgICAgYiA9IG51bWJlciA+PSAxMDAgPyAxMDAgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChzdWZmaXhlc1tudW1iZXJdIHx8IHN1ZmZpeGVzW2FdIHx8IHN1ZmZpeGVzW2JdKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gMXRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRnO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFRoYWkgW3RoXVxuLy8hIGF1dGhvciA6IEtyaWRzYWRhIFRoYW5hYnVscG9uZyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zaXJuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdGggPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0aCcsIHtcbiAgICAgICAgbW9udGhzOiAn4Lih4LiB4Lij4Liy4LiE4LihX+C4geC4uOC4oeC4oOC4suC4nuC4seC4meC4mOC5jF/guKHguLXguJnguLLguITguKFf4LmA4Lih4Lip4Liy4Lii4LiZX+C4nuC4pOC4qeC4oOC4suC4hOC4oV/guKHguLTguJbguLjguJnguLLguKLguJlf4LiB4Lij4LiB4LiO4Liy4LiE4LihX+C4quC4tOC4h+C4q+C4suC4hOC4oV/guIHguLHguJnguKLguLLguKLguJlf4LiV4Li44Lil4Liy4LiE4LihX+C4nuC4pOC4qOC4iOC4tOC4geC4suC4ouC4mV/guJjguLHguJnguKfguLLguITguKEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ+C4oS7guIQuX+C4gS7guJ4uX+C4oeC4tS7guIQuX+C5gOC4oS7guKIuX+C4ni7guIQuX+C4oeC4tC7guKIuX+C4gS7guIQuX+C4qi7guIQuX+C4gS7guKIuX+C4lS7guIQuX+C4ni7guKIuX+C4mC7guIQuJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAn4Lit4Liy4LiX4Li04LiV4Lii4LmMX+C4iOC4seC4meC4l+C4o+C5jF/guK3guLHguIfguITguLLguKNf4Lie4Li44LiYX+C4nuC4pOC4q+C4seC4quC4muC4lOC4tV/guKjguLjguIHguKPguYxf4LmA4Liq4Liy4Lij4LmMJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn4Lit4Liy4LiX4Li04LiV4Lii4LmMX+C4iOC4seC4meC4l+C4o+C5jF/guK3guLHguIfguITguLLguKNf4Lie4Li44LiYX+C4nuC4pOC4q+C4seC4ql/guKjguLjguIHguKPguYxf4LmA4Liq4Liy4Lij4LmMJy5zcGxpdCgnXycpLCAvLyB5ZXMsIHRocmVlIGNoYXJhY3RlcnMgZGlmZmVyZW5jZVxuICAgICAgICB3ZWVrZGF5c01pbjogJ+C4reC4si5f4LiILl/guK0uX+C4ni5f4Lie4LikLl/guKguX+C4qi4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzUGFyc2VFeGFjdDogdHJ1ZSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSDptbScsXG4gICAgICAgICAgICBMVFM6ICdIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkg4LmA4Lin4Lil4LiyIEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ+C4p+C4seC4mWRkZGTguJfguLXguYggRCBNTU1NIFlZWVkg4LmA4Lin4Lil4LiyIEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAv4LiB4LmI4Lit4LiZ4LmA4LiX4Li14LmI4Lii4LiHfOC4q+C4peC4seC4h+C5gOC4l+C4teC5iOC4ouC4hy8sXG4gICAgICAgIGlzUE06IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09PSAn4Lir4Lil4Lix4LiH4LmA4LiX4Li14LmI4Lii4LiHJztcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VyLCBtaW51dGUsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+C4geC5iOC4reC4meC5gOC4l+C4teC5iOC4ouC4hyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn4Lir4Lil4Lix4LiH4LmA4LiX4Li14LmI4Lii4LiHJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4Lin4Lix4LiZ4LiZ4Li14LmJIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vguJ7guKPguLjguYjguIfguJnguLXguYkg4LmA4Lin4Lil4LiyXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGRb4Lir4LiZ4LmJ4LiyIOC5gOC4p+C4peC4sl0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vguYDguKHguLfguYjguK3guKfguLLguJnguJnguLXguYkg4LmA4Lin4Lil4LiyXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vguKfguLHguJldZGRkZFvguJfguLXguYjguYHguKXguYnguKcg4LmA4Lin4Lil4LiyXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJ+C4reC4teC4gSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXPguJfguLXguYjguYHguKXguYnguKcnLFxuICAgICAgICAgICAgczogJ+C5hOC4oeC5iOC4geC4teC5iOC4p+C4tOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBzczogJyVkIOC4p+C4tOC4meC4suC4l+C4tScsXG4gICAgICAgICAgICBtOiAnMSDguJnguLLguJfguLUnLFxuICAgICAgICAgICAgbW06ICclZCDguJnguLLguJfguLUnLFxuICAgICAgICAgICAgaDogJzEg4LiK4Lix4LmI4Lin4LmC4Lih4LiHJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4LiK4Lix4LmI4Lin4LmC4Lih4LiHJyxcbiAgICAgICAgICAgIGQ6ICcxIOC4p+C4seC4mScsXG4gICAgICAgICAgICBkZDogJyVkIOC4p+C4seC4mScsXG4gICAgICAgICAgICB3OiAnMSDguKrguLHguJvguJTguLLguKvguYwnLFxuICAgICAgICAgICAgd3c6ICclZCDguKrguLHguJvguJTguLLguKvguYwnLFxuICAgICAgICAgICAgTTogJzEg4LmA4LiU4Li34Lit4LiZJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4LmA4LiU4Li34Lit4LiZJyxcbiAgICAgICAgICAgIHk6ICcxIOC4m+C4tScsXG4gICAgICAgICAgICB5eTogJyVkIOC4m+C4tScsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGg7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVHVya21lbiBbdGtdXG4vLyEgYXV0aG9yIDogQXRhbXlyYXQgQWJkeXJhaG1hbm92IDogaHR0cHM6Ly9naXRodWIuY29tL2F0YW15cmF0YWJkeVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN1ZmZpeGVzID0ge1xuICAgICAgICAxOiBcIidpbmppXCIsXG4gICAgICAgIDU6IFwiJ2luamlcIixcbiAgICAgICAgODogXCInaW5qaVwiLFxuICAgICAgICA3MDogXCInaW5qaVwiLFxuICAgICAgICA4MDogXCInaW5qaVwiLFxuICAgICAgICAyOiBcIiduamlcIixcbiAgICAgICAgNzogXCInbmppXCIsXG4gICAgICAgIDIwOiBcIiduamlcIixcbiAgICAgICAgNTA6IFwiJ25qaVwiLFxuICAgICAgICAzOiBcIifDvG5qaVwiLFxuICAgICAgICA0OiBcIifDvG5qaVwiLFxuICAgICAgICAxMDA6IFwiJ8O8bmppXCIsXG4gICAgICAgIDY6IFwiJ25qeVwiLFxuICAgICAgICA5OiBcIid1bmp5XCIsXG4gICAgICAgIDEwOiBcIid1bmp5XCIsXG4gICAgICAgIDMwOiBcIid1bmp5XCIsXG4gICAgICAgIDYwOiBcIid5bmp5XCIsXG4gICAgICAgIDkwOiBcIid5bmp5XCIsXG4gICAgfTtcblxuICAgIHZhciB0ayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RrJywge1xuICAgICAgICBtb250aHM6ICfDnWFud2FyX0Zld3JhbF9NYXJ0X0FwcmVsX01hw71fScO9dW5fScO9dWxfQXdndXN0X1NlbnTDvWFicl9Pa3TDvWFicl9Ob8O9YWJyX0Rla2Ficicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfDnWFuX0Zld19NYXJfQXByX01hw71fScO9bl9Jw71sX0F3Z19TZW5fT2t0X05vw71fRGVrJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ8OdZWvFn2VuYmVfRHXFn2VuYmVfU2nFn2VuYmVfw4dhcsWfZW5iZV9QZW7Fn2VuYmVfQW5uYV/FnmVuYmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfDnWVrX0R1xZ9fU2nFn1/Dh2FyX1Blbl9Bbm5fxZ5lbicuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfDnWtfRMWfX1PFn1/Dh3JfUG5fQW5fxZ5uJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW2J1Z8O8biBzYWdhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1tlcnRpciBzYWdhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbaW5kaWtpXSBkZGRkIFtzYWdhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tkw7zDvW5dIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW2dlw6dlbl0gZGRkZCBbc2FnYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgc2/FiCcsXG4gICAgICAgICAgICBwYXN0OiAnJXMgw7bFiCcsXG4gICAgICAgICAgICBzOiAnYmlybsOkw6dlIHNla3VudCcsXG4gICAgICAgICAgICBtOiAnYmlyIG1pbnV0JyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXQnLFxuICAgICAgICAgICAgaDogJ2JpciBzYWdhdCcsXG4gICAgICAgICAgICBoaDogJyVkIHNhZ2F0JyxcbiAgICAgICAgICAgIGQ6ICdiaXIgZ8O8bicsXG4gICAgICAgICAgICBkZDogJyVkIGfDvG4nLFxuICAgICAgICAgICAgTTogJ2JpciBhw70nLFxuICAgICAgICAgICAgTU06ICclZCBhw70nLFxuICAgICAgICAgICAgeTogJ2JpciDDvXlsJyxcbiAgICAgICAgICAgIHl5OiAnJWQgw715bCcsXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEbyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgemVyb1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIFwiJ3VuanlcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChudW1iZXIgJSAxMDApIC0gYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBudW1iZXIgPj0gMTAwID8gMTAwIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChzdWZmaXhlc1thXSB8fCBzdWZmaXhlc1tiXSB8fCBzdWZmaXhlc1tjXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBUYWdhbG9nIChQaGlsaXBwaW5lcykgW3RsLXBoXVxuLy8hIGF1dGhvciA6IERhbiBIYWdtYW4gOiBodHRwczovL2dpdGh1Yi5jb20vaGFnbWFuZGFuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdGxQaCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3RsLXBoJywge1xuICAgICAgICBtb250aHM6ICdFbmVyb19QZWJyZXJvX01hcnNvX0FicmlsX01heW9fSHVueW9fSHVseW9fQWdvc3RvX1NldHllbWJyZV9Pa3R1YnJlX05vYnllbWJyZV9EaXN5ZW1icmUnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnRW5lX1BlYl9NYXJfQWJyX01heV9IdW5fSHVsX0Fnb19TZXRfT2t0X05vYl9EaXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnTGluZ2dvX0x1bmVzX01hcnRlc19NaXllcmt1bGVzX0h1d2ViZXNfQml5ZXJuZXNfU2FiYWRvJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnTGluX0x1bl9NYXJfTWl5X0h1d19CaXlfU2FiJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0xpX0x1X01hX01pX0h1X0JpX1NhYicuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ01NL0QvWVlZWScsXG4gICAgICAgICAgICBMTDogJ01NTU0gRCwgWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdNTU1NIEQsIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQsIE1NTU0gREQsIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ0xUIFtuZ2F5b25nIGFyYXddJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbQnVrYXMgbmddIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnTFQgW3NhIHN1c3Vub2QgbmFdIGRkZGQnLFxuICAgICAgICAgICAgbGFzdERheTogJ0xUIFtrYWhhcG9uXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ0xUIFtub29uZyBuYWthcmFhbmddIGRkZGQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICdzYSBsb29iIG5nICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyBhbmcgbmFrYWxpcGFzJyxcbiAgICAgICAgICAgIHM6ICdpbGFuZyBzZWd1bmRvJyxcbiAgICAgICAgICAgIHNzOiAnJWQgc2VndW5kbycsXG4gICAgICAgICAgICBtOiAnaXNhbmcgbWludXRvJyxcbiAgICAgICAgICAgIG1tOiAnJWQgbWludXRvJyxcbiAgICAgICAgICAgIGg6ICdpc2FuZyBvcmFzJyxcbiAgICAgICAgICAgIGhoOiAnJWQgb3JhcycsXG4gICAgICAgICAgICBkOiAnaXNhbmcgYXJhdycsXG4gICAgICAgICAgICBkZDogJyVkIGFyYXcnLFxuICAgICAgICAgICAgTTogJ2lzYW5nIGJ1d2FuJyxcbiAgICAgICAgICAgIE1NOiAnJWQgYnV3YW4nLFxuICAgICAgICAgICAgeTogJ2lzYW5nIHRhb24nLFxuICAgICAgICAgICAgeXk6ICclZCB0YW9uJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRsUGg7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogS2xpbmdvbiBbdGxoXVxuLy8hIGF1dGhvciA6IERvbWluaWthIEtydWsgOiBodHRwczovL2dpdGh1Yi5jb20vYW1hcmFudGhyb3NlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgbnVtYmVyc05vdW5zID0gJ3BhZ2hfd2HigJlfY2hh4oCZX3dlal9sb1NfdmFnaF9qYXZfU29jaF9jaG9yZ2hfSHV0Jy5zcGxpdCgnXycpO1xuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlRnV0dXJlKG91dHB1dCkge1xuICAgICAgICB2YXIgdGltZSA9IG91dHB1dDtcbiAgICAgICAgdGltZSA9XG4gICAgICAgICAgICBvdXRwdXQuaW5kZXhPZignamFqJykgIT09IC0xXG4gICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICdsZVMnXG4gICAgICAgICAgICAgICAgOiBvdXRwdXQuaW5kZXhPZignamFyJykgIT09IC0xXG4gICAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ3dhUSdcbiAgICAgICAgICAgICAgICAgIDogb3V0cHV0LmluZGV4T2YoJ0RJUycpICE9PSAtMVxuICAgICAgICAgICAgICAgICAgICA/IHRpbWUuc2xpY2UoMCwgLTMpICsgJ25lbSdcbiAgICAgICAgICAgICAgICAgICAgOiB0aW1lICsgJyBwSXEnO1xuICAgICAgICByZXR1cm4gdGltZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVQYXN0KG91dHB1dCkge1xuICAgICAgICB2YXIgdGltZSA9IG91dHB1dDtcbiAgICAgICAgdGltZSA9XG4gICAgICAgICAgICBvdXRwdXQuaW5kZXhPZignamFqJykgIT09IC0xXG4gICAgICAgICAgICAgICAgPyB0aW1lLnNsaWNlKDAsIC0zKSArICdIdeKAmSdcbiAgICAgICAgICAgICAgICA6IG91dHB1dC5pbmRleE9mKCdqYXInKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnd2VuJ1xuICAgICAgICAgICAgICAgICAgOiBvdXRwdXQuaW5kZXhPZignRElTJykgIT09IC0xXG4gICAgICAgICAgICAgICAgICAgID8gdGltZS5zbGljZSgwLCAtMykgKyAnYmVuJ1xuICAgICAgICAgICAgICAgICAgICA6IHRpbWUgKyAnIHJldCc7XG4gICAgICAgIHJldHVybiB0aW1lO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZShudW1iZXIsIHdpdGhvdXRTdWZmaXgsIHN0cmluZywgaXNGdXR1cmUpIHtcbiAgICAgICAgdmFyIG51bWJlck5vdW4gPSBudW1iZXJBc05vdW4obnVtYmVyKTtcbiAgICAgICAgc3dpdGNoIChzdHJpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTm91biArICcgbHVwJztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTm91biArICcgdHVwJztcbiAgICAgICAgICAgIGNhc2UgJ2hoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTm91biArICcgcmVwJztcbiAgICAgICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTm91biArICcgamFqJztcbiAgICAgICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTm91biArICcgamFyJztcbiAgICAgICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyTm91biArICcgRElTJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG51bWJlckFzTm91bihudW1iZXIpIHtcbiAgICAgICAgdmFyIGh1bmRyZWQgPSBNYXRoLmZsb29yKChudW1iZXIgJSAxMDAwKSAvIDEwMCksXG4gICAgICAgICAgICB0ZW4gPSBNYXRoLmZsb29yKChudW1iZXIgJSAxMDApIC8gMTApLFxuICAgICAgICAgICAgb25lID0gbnVtYmVyICUgMTAsXG4gICAgICAgICAgICB3b3JkID0gJyc7XG4gICAgICAgIGlmIChodW5kcmVkID4gMCkge1xuICAgICAgICAgICAgd29yZCArPSBudW1iZXJzTm91bnNbaHVuZHJlZF0gKyAndmF0bGgnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZW4gPiAwKSB7XG4gICAgICAgICAgICB3b3JkICs9ICh3b3JkICE9PSAnJyA/ICcgJyA6ICcnKSArIG51bWJlcnNOb3Vuc1t0ZW5dICsgJ21hSCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uZSA+IDApIHtcbiAgICAgICAgICAgIHdvcmQgKz0gKHdvcmQgIT09ICcnID8gJyAnIDogJycpICsgbnVtYmVyc05vdW5zW29uZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdvcmQgPT09ICcnID8gJ3BhZ2gnIDogd29yZDtcbiAgICB9XG5cbiAgICB2YXIgdGxoID0gbW9tZW50LmRlZmluZUxvY2FsZSgndGxoJywge1xuICAgICAgICBtb250aHM6ICd0ZXJh4oCZIGphciB3YeKAmV90ZXJh4oCZIGphciBjaGHigJlfdGVyYeKAmSBqYXIgd2VqX3RlcmHigJkgamFyIGxvU190ZXJh4oCZIGphciB2YWdoX3RlcmHigJkgamFyIGphdl90ZXJh4oCZIGphciBTb2NoX3RlcmHigJkgamFyIGNob3JnaF90ZXJh4oCZIGphciBIdXRfdGVyYeKAmSBqYXIgd2HigJltYUhfdGVyYeKAmSBqYXIgd2HigJltYUggd2HigJlfdGVyYeKAmSBqYXIgd2HigJltYUggY2hh4oCZJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdqYXIgd2HigJlfamFyIGNoYeKAmV9qYXIgd2VqX2phciBsb1NfamFyIHZhZ2hfamFyIGphdl9qYXIgU29jaF9qYXIgY2hvcmdoX2phciBIdXRfamFyIHdh4oCZbWFIX2phciB3YeKAmW1hSCB3YeKAmV9qYXIgd2HigJltYUggY2hh4oCZJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOiAnbG9qbUl0amFqX0RhU2phal9wb3ZqYWpfZ2hJdGxoamFqX2xvZ2hqYWpfYnVxamFqX2doSW5qYWonLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6XG4gICAgICAgICAgICAnbG9qbUl0amFqX0RhU2phal9wb3ZqYWpfZ2hJdGxoamFqX2xvZ2hqYWpfYnVxamFqX2doSW5qYWonLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOlxuICAgICAgICAgICAgJ2xvam1JdGphal9EYVNqYWpfcG92amFqX2doSXRsaGphal9sb2doamFqX2J1cWphal9naEluamFqJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQuTU0uWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0RhSGphal0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1t3YeKAmWxlU10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdMTEwnLFxuICAgICAgICAgICAgbGFzdERheTogJ1t3YeKAmUh14oCZXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ0xMTCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogdHJhbnNsYXRlRnV0dXJlLFxuICAgICAgICAgICAgcGFzdDogdHJhbnNsYXRlUGFzdCxcbiAgICAgICAgICAgIHM6ICdwdVMgbHVwJyxcbiAgICAgICAgICAgIHNzOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBtOiAnd2HigJkgdHVwJyxcbiAgICAgICAgICAgIG1tOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBoOiAnd2HigJkgcmVwJyxcbiAgICAgICAgICAgIGhoOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBkOiAnd2HigJkgamFqJyxcbiAgICAgICAgICAgIGRkOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICBNOiAnd2HigJkgamFyJyxcbiAgICAgICAgICAgIE1NOiB0cmFuc2xhdGUsXG4gICAgICAgICAgICB5OiAnd2HigJkgRElTJyxcbiAgICAgICAgICAgIHl5OiB0cmFuc2xhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfVxcLi8sXG4gICAgICAgIG9yZGluYWw6ICclZC4nLFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGxoO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFR1cmtpc2ggW3RyXVxuLy8hIGF1dGhvcnMgOiBFcmhhbiBHdW5kb2dhbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9lcmhhbmd1bmRvZ2FuLFxuLy8hICAgICAgICAgICBCdXJhayBZacSfaXQgS2F5YTogaHR0cHM6Ly9naXRodWIuY29tL0JZS1xuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHN1ZmZpeGVzID0ge1xuICAgICAgICAxOiBcIidpbmNpXCIsXG4gICAgICAgIDU6IFwiJ2luY2lcIixcbiAgICAgICAgODogXCInaW5jaVwiLFxuICAgICAgICA3MDogXCInaW5jaVwiLFxuICAgICAgICA4MDogXCInaW5jaVwiLFxuICAgICAgICAyOiBcIiduY2lcIixcbiAgICAgICAgNzogXCInbmNpXCIsXG4gICAgICAgIDIwOiBcIiduY2lcIixcbiAgICAgICAgNTA6IFwiJ25jaVwiLFxuICAgICAgICAzOiBcIifDvG5jw7xcIixcbiAgICAgICAgNDogXCInw7xuY8O8XCIsXG4gICAgICAgIDEwMDogXCInw7xuY8O8XCIsXG4gICAgICAgIDY6IFwiJ25jxLFcIixcbiAgICAgICAgOTogXCIndW5jdVwiLFxuICAgICAgICAxMDogXCIndW5jdVwiLFxuICAgICAgICAzMDogXCIndW5jdVwiLFxuICAgICAgICA2MDogXCInxLFuY8SxXCIsXG4gICAgICAgIDkwOiBcIifEsW5jxLFcIixcbiAgICB9O1xuXG4gICAgdmFyIHRyID0gbW9tZW50LmRlZmluZUxvY2FsZSgndHInLCB7XG4gICAgICAgIG1vbnRoczogJ09jYWtfxZ51YmF0X01hcnRfTmlzYW5fTWF5xLFzX0hhemlyYW5fVGVtbXV6X0HEn3VzdG9zX0V5bMO8bF9Fa2ltX0thc8SxbV9BcmFsxLFrJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ09jYV/FnnViX01hcl9OaXNfTWF5X0hhel9UZW1fQcSfdV9FeWxfRWtpX0thc19BcmEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzOiAnUGF6YXJfUGF6YXJ0ZXNpX1NhbMSxX8OHYXLFn2FtYmFfUGVyxZ9lbWJlX0N1bWFfQ3VtYXJ0ZXNpJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAnUGF6X1B6dF9TYWxfw4dhcl9QZXJfQ3VtX0NtdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdQel9QdF9TYV/Dh2FfUGVfQ3VfQ3QnLnNwbGl0KCdfJyksXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICAgICAgICAgIGlmIChob3VycyA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnw7bDticgOiAnw5bDlic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ8O2cycgOiAnw5ZTJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL8O2w7Z8w5bDlnzDtnN8w5ZTLyxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgPT09ICfDtnMnIHx8IGlucHV0ID09PSAnw5ZTJztcbiAgICAgICAgfSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tidWfDvG4gc2FhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1t5YXLEsW4gc2FhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdbZ2VsZWNla10gZGRkZCBbc2FhdF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1tkw7xuXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tnZcOnZW5dIGRkZGQgW3NhYXRdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMgc29ucmEnLFxuICAgICAgICAgICAgcGFzdDogJyVzIMO2bmNlJyxcbiAgICAgICAgICAgIHM6ICdiaXJrYcOnIHNhbml5ZScsXG4gICAgICAgICAgICBzczogJyVkIHNhbml5ZScsXG4gICAgICAgICAgICBtOiAnYmlyIGRha2lrYScsXG4gICAgICAgICAgICBtbTogJyVkIGRha2lrYScsXG4gICAgICAgICAgICBoOiAnYmlyIHNhYXQnLFxuICAgICAgICAgICAgaGg6ICclZCBzYWF0JyxcbiAgICAgICAgICAgIGQ6ICdiaXIgZ8O8bicsXG4gICAgICAgICAgICBkZDogJyVkIGfDvG4nLFxuICAgICAgICAgICAgdzogJ2JpciBoYWZ0YScsXG4gICAgICAgICAgICB3dzogJyVkIGhhZnRhJyxcbiAgICAgICAgICAgIE06ICdiaXIgYXknLFxuICAgICAgICAgICAgTU06ICclZCBheScsXG4gICAgICAgICAgICB5OiAnYmlyIHnEsWwnLFxuICAgICAgICAgICAgeXk6ICclZCB5xLFsJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RvJzpcbiAgICAgICAgICAgICAgICBjYXNlICdERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB6ZXJvXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgXCInxLFuY8SxXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAobnVtYmVyICUgMTAwKSAtIGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gbnVtYmVyID49IDEwMCA/IDEwMCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAoc3VmZml4ZXNbYV0gfHwgc3VmZml4ZXNbYl0gfHwgc3VmZml4ZXNbY10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA3dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVGFsb3NzYW4gW3R6bF1cbi8vISBhdXRob3IgOiBSb2JpbiB2YW4gZGVyIFZsaWV0IDogaHR0cHM6Ly9naXRodWIuY29tL3JvYmluMHZhbjBkZXIwdlxuLy8hIGF1dGhvciA6IEl1c3TDrCBDYW51blxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgLy8gQWZ0ZXIgdGhlIHllYXIgdGhlcmUgc2hvdWxkIGJlIGEgc2xhc2ggYW5kIHRoZSBhbW91bnQgb2YgeWVhcnMgc2luY2UgRGVjZW1iZXIgMjYsIDE5NzkgaW4gUm9tYW4gbnVtZXJhbHMuXG4gICAgLy8gVGhpcyBpcyBjdXJyZW50bHkgdG9vIGRpZmZpY3VsdCAobWF5YmUgZXZlbiBpbXBvc3NpYmxlKSB0byBhZGQuXG4gICAgdmFyIHR6bCA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3R6bCcsIHtcbiAgICAgICAgbW9udGhzOiAnSmFudWFyX0ZldnJhZ2xoX01hcsOnX0F2csOvdV9NYWlfR8O8bl9KdWxpYV9HdXNjaHRfU2V0ZW12YXJfTGlzdG9ww6R0c19Ob2VtdmFyX1plY2VtdmFyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ0phbl9GZXZfTWFyX0F2cl9NYWlfR8O8bl9KdWxfR3VzX1NldF9MaXNfTm9lX1plYycuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXM6ICdTw7psYWRpX0zDum5lw6dpX01haXR6aV9Nw6FyY3VyaV9YaMO6YWRpX1Zpw6luZXLDp2lfU8OhdHVyaScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1PDumxfTMO6bl9NYWlfTcOhcl9YaMO6X1Zpw6lfU8OhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdTw7pfTMO6X01hX03DoV9YaF9WaV9Tw6EnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hILm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hILm1tLnNzJyxcbiAgICAgICAgICAgIEw6ICdERC5NTS5ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRC4gTU1NTSBbZGFsbGFzXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QuIE1NTU0gW2RhbGxhc10gWVlZWSBISC5tbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgW2xpXSBELiBNTU1NIFtkYWxsYXNdIFlZWVkgSEgubW0nLFxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbVBhcnNlOiAvZFxcJ298ZFxcJ2EvaSxcbiAgICAgICAgaXNQTTogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gXCJkJ29cIiA9PT0gaW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW06IGZ1bmN0aW9uIChob3VycywgbWludXRlcywgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXJzID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/IFwiZCdvXCIgOiBcIkQnT1wiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/IFwiZCdhXCIgOiBcIkQnQVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tveGhpIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2RlbcOgIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW8OgXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2llaXJpIMOgXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tzw7xyIGVsXSBkZGRkIFtsYXN0ZXUgw6BdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnb3NwcmVpICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICdqYSVzJyxcbiAgICAgICAgICAgIHM6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBzczogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIG06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBtbTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGg6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBoaDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIGQ6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBkZDogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIE06IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICBNTTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgICAgIHk6IHByb2Nlc3NSZWxhdGl2ZVRpbWUsXG4gICAgICAgICAgICB5eTogcHJvY2Vzc1JlbGF0aXZlVGltZSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9XFwuLyxcbiAgICAgICAgb3JkaW5hbDogJyVkLicsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSZWxhdGl2ZVRpbWUobnVtYmVyLCB3aXRob3V0U3VmZml4LCBrZXksIGlzRnV0dXJlKSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzOiBbJ3ZpZW5zYXMgc2VjdW5kcycsIFwiJ2llbnNhcyBzZWN1bmRzXCJdLFxuICAgICAgICAgICAgc3M6IFtudW1iZXIgKyAnIHNlY3VuZHMnLCAnJyArIG51bWJlciArICcgc2VjdW5kcyddLFxuICAgICAgICAgICAgbTogW1wiJ24gbcOtdXRcIiwgXCInaWVucyBtw611dFwiXSxcbiAgICAgICAgICAgIG1tOiBbbnVtYmVyICsgJyBtw611dHMnLCAnJyArIG51bWJlciArICcgbcOtdXRzJ10sXG4gICAgICAgICAgICBoOiBbXCInbiDDvm9yYVwiLCBcIidpZW5zYSDDvm9yYVwiXSxcbiAgICAgICAgICAgIGhoOiBbbnVtYmVyICsgJyDDvm9yYXMnLCAnJyArIG51bWJlciArICcgw75vcmFzJ10sXG4gICAgICAgICAgICBkOiBbXCInbiB6aXVhXCIsIFwiJ2llbnNhIHppdWFcIl0sXG4gICAgICAgICAgICBkZDogW251bWJlciArICcgeml1YXMnLCAnJyArIG51bWJlciArICcgeml1YXMnXSxcbiAgICAgICAgICAgIE06IFtcIiduIG1lc1wiLCBcIidpZW5zIG1lc1wiXSxcbiAgICAgICAgICAgIE1NOiBbbnVtYmVyICsgJyBtZXNlbicsICcnICsgbnVtYmVyICsgJyBtZXNlbiddLFxuICAgICAgICAgICAgeTogW1wiJ24gYXJcIiwgXCInaWVucyBhclwiXSxcbiAgICAgICAgICAgIHl5OiBbbnVtYmVyICsgJyBhcnMnLCAnJyArIG51bWJlciArICcgYXJzJ10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc0Z1dHVyZVxuICAgICAgICAgICAgPyBmb3JtYXRba2V5XVswXVxuICAgICAgICAgICAgOiB3aXRob3V0U3VmZml4XG4gICAgICAgICAgICAgID8gZm9ybWF0W2tleV1bMF1cbiAgICAgICAgICAgICAgOiBmb3JtYXRba2V5XVsxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHpsO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IENlbnRyYWwgQXRsYXMgVGFtYXppZ2h0IExhdGluIFt0em0tbGF0bl1cbi8vISBhdXRob3IgOiBBYmRlbCBTYWlkIDogaHR0cHM6Ly9naXRodWIuY29tL2FiZGVsc2FpZFxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHR6bUxhdG4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd0em0tbGF0bicsIHtcbiAgICAgICAgbW9udGhzOiAnaW5uYXlyX2Jyy6RheXLLpF9tYXLLpHPLpF9pYnJpcl9tYXl5d195d255d195d2x5d3pfyaN3xaF0X8Whd3RhbmJpcl9rdMukd2Jyy6Rfbnd3YW5iaXJfZHdqbmJpcicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAnaW5uYXlyX2Jyy6RheXLLpF9tYXLLpHPLpF9pYnJpcl9tYXl5d195d255d195d2x5d3pfyaN3xaF0X8Whd3RhbmJpcl9rdMukd2Jyy6Rfbnd3YW5iaXJfZHdqbmJpcicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogJ2FzYW1hc19heW5hc19hc2luYXNfYWtyYXNfYWt3YXNfYXNpbXdhc19hc2nhuI15YXMnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICdhc2FtYXNfYXluYXNfYXNpbmFzX2FrcmFzX2Frd2FzX2FzaW13YXNfYXNp4biNeWFzJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ2FzYW1hc19heW5hc19hc2luYXNfYWtyYXNfYWt3YXNfYXNpbXdhc19hc2nhuI15YXMnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ2RkZGQgRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1thc2RraCBnXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW2Fza2EgZ10gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFtnXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW2Fzc2FudCBnXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW2ddIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnZGFka2ggcyB5YW4gJXMnLFxuICAgICAgICAgICAgcGFzdDogJ3lhbiAlcycsXG4gICAgICAgICAgICBzOiAnaW1paycsXG4gICAgICAgICAgICBzczogJyVkIGltaWsnLFxuICAgICAgICAgICAgbTogJ21pbnXhuI0nLFxuICAgICAgICAgICAgbW06ICclZCBtaW514biNJyxcbiAgICAgICAgICAgIGg6ICdzYcmbYScsXG4gICAgICAgICAgICBoaDogJyVkIHRhc3NhyZtpbicsXG4gICAgICAgICAgICBkOiAnYXNzJyxcbiAgICAgICAgICAgIGRkOiAnJWQgb3NzYW4nLFxuICAgICAgICAgICAgTTogJ2F5b3dyJyxcbiAgICAgICAgICAgIE1NOiAnJWQgaXl5aXJuJyxcbiAgICAgICAgICAgIHk6ICdhc2dhcycsXG4gICAgICAgICAgICB5eTogJyVkIGlzZ2FzbicsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogNiwgLy8gU2F0dXJkYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogMTIsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDEydGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHptTGF0bjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDZW50cmFsIEF0bGFzIFRhbWF6aWdodCBbdHptXVxuLy8hIGF1dGhvciA6IEFiZGVsIFNhaWQgOiBodHRwczovL2dpdGh1Yi5jb20vYWJkZWxzYWlkXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdHptID0gbW9tZW50LmRlZmluZUxvY2FsZSgndHptJywge1xuICAgICAgICBtb250aHM6ICfitYnitY/itY/itLDitaLitZRf4rSx4rWV4rSw4rWi4rWVX+K1juK0sOK1leK1ml/itYnitLHitZTitYnitZRf4rWO4rSw4rWi4rWi4rWTX+K1ouK1k+K1j+K1ouK1k1/itaLitZPitY3itaLitZPitaNf4rWW4rWT4rWb4rWcX+K1m+K1k+K1nOK0sOK1j+K0seK1ieK1lF/itL3itZ/itZPitLHitZVf4rWP4rWT4rWh4rSw4rWP4rSx4rWJ4rWUX+K0t+K1k+K1iuK1j+K0seK1ieK1lCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6XG4gICAgICAgICAgICAn4rWJ4rWP4rWP4rSw4rWi4rWUX+K0seK1leK0sOK1ouK1lV/itY7itLDitZXitZpf4rWJ4rSx4rWU4rWJ4rWUX+K1juK0sOK1ouK1ouK1k1/itaLitZPitY/itaLitZNf4rWi4rWT4rWN4rWi4rWT4rWjX+K1luK1k+K1m+K1nF/itZvitZPitZzitLDitY/itLHitYnitZRf4rS94rWf4rWT4rSx4rWVX+K1j+K1k+K1oeK0sOK1j+K0seK1ieK1lF/itLfitZPitYritY/itLHitYnitZQnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfitLDitZnitLDitY7itLDitZlf4rSw4rWi4rWP4rSw4rWZX+K0sOK1meK1ieK1j+K0sOK1mV/itLDitL3itZTitLDitZlf4rSw4rS94rWh4rSw4rWZX+K0sOK1meK1ieK1juK1oeK0sOK1mV/itLDitZnitYnitLnitaLitLDitZknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfitLDitZnitLDitY7itLDitZlf4rSw4rWi4rWP4rSw4rWZX+K0sOK1meK1ieK1j+K0sOK1mV/itLDitL3itZTitLDitZlf4rSw4rS94rWh4rSw4rWZX+K0sOK1meK1ieK1juK1oeK0sOK1mV/itLDitZnitYnitLnitaLitLDitZknLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn4rSw4rWZ4rSw4rWO4rSw4rWZX+K0sOK1ouK1j+K0sOK1mV/itLDitZnitYnitY/itLDitZlf4rSw4rS94rWU4rSw4rWZX+K0sOK0veK1oeK0sOK1mV/itLDitZnitYnitY7itaHitLDitZlf4rSw4rWZ4rWJ4rS54rWi4rSw4rWZJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb4rSw4rWZ4rS34rWFIOK0tF0gTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vitLDitZnitL3itLAg4rS0XSBMVCcsXG4gICAgICAgICAgICBuZXh0V2VlazogJ2RkZGQgW+K0tF0gTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vitLDitZritLDitY/itZwg4rS0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW+K0tF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfitLfitLDitLfitYUg4rWZIOK1ouK0sOK1jyAlcycsXG4gICAgICAgICAgICBwYXN0OiAn4rWi4rSw4rWPICVzJyxcbiAgICAgICAgICAgIHM6ICfitYnitY7itYnitL0nLFxuICAgICAgICAgICAgc3M6ICclZCDitYnitY7itYnitL0nLFxuICAgICAgICAgICAgbTogJ+K1juK1ieK1j+K1k+K0uicsXG4gICAgICAgICAgICBtbTogJyVkIOK1juK1ieK1j+K1k+K0uicsXG4gICAgICAgICAgICBoOiAn4rWZ4rSw4rWE4rSwJyxcbiAgICAgICAgICAgIGhoOiAnJWQg4rWc4rSw4rWZ4rWZ4rSw4rWE4rWJ4rWPJyxcbiAgICAgICAgICAgIGQ6ICfitLDitZnitZknLFxuICAgICAgICAgICAgZGQ6ICclZCBv4rWZ4rWZ4rSw4rWPJyxcbiAgICAgICAgICAgIE06ICfitLDitaJv4rWT4rWUJyxcbiAgICAgICAgICAgIE1NOiAnJWQg4rWJ4rWi4rWi4rWJ4rWU4rWPJyxcbiAgICAgICAgICAgIHk6ICfitLDitZnitLPitLDitZknLFxuICAgICAgICAgICAgeXk6ICclZCDitYnitZnitLPitLDitZnitY8nLFxuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDYsIC8vIFNhdHVyZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDEyLCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxMnRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHR6bTtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBVeWdodXIgKENoaW5hKSBbdWctY25dXG4vLyEgYXV0aG9yOiBib3lhcSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9ib3lhcVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHVnQ24gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd1Zy1jbicsIHtcbiAgICAgICAgbW9udGhzOiAn2YrYp9mG24vYp9ixX9mB25Dbi9ix2KfZhF/Zhdin2LHYql/Yptin2b7YsduQ2YRf2YXYp9mKX9im2YnZituH2YZf2KbZidmK24fZhF/Yptin24vYutuH2LPYql/Ys9uQ2YbYqtuV2KjZidixX9im24bZg9iq25XYqNmJ2LFf2YbZiNmK2KfYqNmJ2LFf2K/bkNmD2KfYqNmJ2LEnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OlxuICAgICAgICAgICAgJ9mK2KfZhtuL2KfYsV/ZgduQ24vYsdin2YRf2YXYp9ix2Kpf2KbYp9m+2LHbkNmEX9mF2KfZil/YptmJ2Yrbh9mGX9im2YnZituH2YRf2KbYp9uL2Lrbh9iz2Kpf2LPbkNmG2Krbldio2YnYsV/YptuG2YPYqtuV2KjZidixX9mG2YjZitin2KjZidixX9iv25DZg9in2KjZidixJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn2YrbldmD2LTbldmG2KjblV/Yr9uI2LTbldmG2KjblV/Ys9uV2YrYtNuV2YbYqNuVX9qG2KfYsdi025XZhtio25Vf2b7bldmK2LTbldmG2KjblV/YrNuI2YXblV/YtNuV2YbYqNuVJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn2YrblV/Yr9uIX9iz25Vf2obYp1/ZvtuVX9is24hf2LTblScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICfZituVX9iv24hf2LPblV/ahtinX9m+25Vf2KzbiF/YtNuVJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS1NTS1ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVkt2YrZidmE2YlNLdim2KfZitmG2YnarUQt2YPbiNmG2YknLFxuICAgICAgICAgICAgTExMOiAnWVlZWS3ZitmJ2YTZiU0t2KbYp9mK2YbZidqtRC3Zg9uI2YbZidiMIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRk2IwgWVlZWS3ZitmJ2YTZiU0t2KbYp9mK2YbZidqtRC3Zg9uI2YbZidiMIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9mK25DYsdmJ2YUg2YPbkNqG25V82LPbldq+25XYsXzahtuI2LTYqtmJ2YYg2Kjbh9ix24fZhnzahtuI2LR82obbiNi02KrZidmGINmD25DZitmJ2YZ82YPbldqGLyxcbiAgICAgICAgbWVyaWRpZW1Ib3VyOiBmdW5jdGlvbiAoaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgICAgIGlmIChob3VyID09PSAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG1lcmlkaWVtID09PSAn2YrbkNix2YnZhSDZg9uQ2obblScgfHxcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9PT0gJ9iz25XavtuV2LEnIHx8XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPT09ICfahtuI2LTYqtmJ2YYg2Kjbh9ix24fZhidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ9qG24jYtNiq2YnZhiDZg9uQ2YrZidmGJyB8fCBtZXJpZGllbSA9PT0gJ9mD25XahicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZituQ2LHZidmFINmD25DahtuVJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCA5MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9iz25XavtuV2LEnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDExMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9qG24jYtNiq2YnZhiDYqNuH2LHbh9mGJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMjMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfahtuI2LQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDE4MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ9qG24jYtNiq2YnZhiDZg9uQ2YrZidmGJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfZg9uV2oYnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYqNuI2q/biNmGINiz2KfYptuV2KpdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb2Kbbldiq25Ug2LPYp9im25XYql0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb2YPbkNmE25XYsdmD2YldIGRkZGQgW9iz2KfYptuV2KpdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2KrbhtmG24jar9uI2YZdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9im2KfZhNiv2YnZhtmC2YldIGRkZGQgW9iz2KfYptuV2KpdIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnJXMg2YPbkNmK2YnZhicsXG4gICAgICAgICAgICBwYXN0OiAnJXMg2Kjbh9ix24fZhicsXG4gICAgICAgICAgICBzOiAn2YbbldqG2obblSDYs9uQ2YPZiNmG2KonLFxuICAgICAgICAgICAgc3M6ICclZCDYs9uQ2YPZiNmG2KonLFxuICAgICAgICAgICAgbTogJ9io2YnYsSDZhdmJ2Ybbh9iqJyxcbiAgICAgICAgICAgIG1tOiAnJWQg2YXZidmG24fYqicsXG4gICAgICAgICAgICBoOiAn2KjZidixINiz2KfYptuV2KonLFxuICAgICAgICAgICAgaGg6ICclZCDYs9in2KbbldiqJyxcbiAgICAgICAgICAgIGQ6ICfYqNmJ2LEg2YPbiNmGJyxcbiAgICAgICAgICAgIGRkOiAnJWQg2YPbiNmGJyxcbiAgICAgICAgICAgIE06ICfYqNmJ2LEg2KbYp9mKJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2KbYp9mKJyxcbiAgICAgICAgICAgIHk6ICfYqNmJ2LEg2YrZidmEJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2YrZidmEJyxcbiAgICAgICAgfSxcblxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0oLdmD24jZhtmJfC3Yptin2Yp8Ldq+25XZvtiq25UpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdmD24jZhtmJJztcbiAgICAgICAgICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct2r7bldm+2KrblSc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICAvLyBHQi9UIDc0MDgtMTk5NOOAiuaVsOaNruWFg+WSjOS6pOaNouagvOW8j8K35L+h5oGv5Lqk5o2iwrfml6XmnJ/lkozml7bpl7TooajnpLrms5XjgIvkuI5JU08gODYwMToxOTg4562J5pWIXG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA3LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiAxc3QgaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdWdDbjtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBVa3JhaW5pYW4gW3VrXVxuLy8hIGF1dGhvciA6IHplbWxhbmluIDogaHR0cHM6Ly9naXRodWIuY29tL3plbWxhbmluXG4vLyEgQXV0aG9yIDogTWVuZWxpb24gRWxlbnPDumxlIDogaHR0cHM6Ly9naXRodWIuY29tL09pcmVcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIGZ1bmN0aW9uIHBsdXJhbCh3b3JkLCBudW0pIHtcbiAgICAgICAgdmFyIGZvcm1zID0gd29yZC5zcGxpdCgnXycpO1xuICAgICAgICByZXR1cm4gbnVtICUgMTAgPT09IDEgJiYgbnVtICUgMTAwICE9PSAxMVxuICAgICAgICAgICAgPyBmb3Jtc1swXVxuICAgICAgICAgICAgOiBudW0gJSAxMCA+PSAyICYmIG51bSAlIDEwIDw9IDQgJiYgKG51bSAlIDEwMCA8IDEwIHx8IG51bSAlIDEwMCA+PSAyMClcbiAgICAgICAgICAgICAgPyBmb3Jtc1sxXVxuICAgICAgICAgICAgICA6IGZvcm1zWzJdO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsKG51bWJlciwgd2l0aG91dFN1ZmZpeCwga2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB7XG4gICAgICAgICAgICBzczogd2l0aG91dFN1ZmZpeCA/ICfRgdC10LrRg9C90LTQsF/RgdC10LrRg9C90LTQuF/RgdC10LrRg9C90LQnIDogJ9GB0LXQutGD0L3QtNGDX9GB0LXQutGD0L3QtNC4X9GB0LXQutGD0L3QtCcsXG4gICAgICAgICAgICBtbTogd2l0aG91dFN1ZmZpeCA/ICfRhdCy0LjQu9C40L3QsF/RhdCy0LjQu9C40L3QuF/RhdCy0LjQu9C40L0nIDogJ9GF0LLQuNC70LjQvdGDX9GF0LLQuNC70LjQvdC4X9GF0LLQuNC70LjQvScsXG4gICAgICAgICAgICBoaDogd2l0aG91dFN1ZmZpeCA/ICfQs9C+0LTQuNC90LBf0LPQvtC00LjQvdC4X9Cz0L7QtNC40L0nIDogJ9Cz0L7QtNC40L3Rg1/Qs9C+0LTQuNC90Lhf0LPQvtC00LjQvScsXG4gICAgICAgICAgICBkZDogJ9C00LXQvdGMX9C00L3Rll/QtNC90ZbQsicsXG4gICAgICAgICAgICBNTTogJ9C80ZbRgdGP0YbRjF/QvNGW0YHRj9GG0ZZf0LzRltGB0Y/RhtGW0LInLFxuICAgICAgICAgICAgeXk6ICfRgNGW0Lpf0YDQvtC60Lhf0YDQvtC60ZbQsicsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChrZXkgPT09ICdtJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0YXQstC40LvQuNC90LAnIDogJ9GF0LLQuNC70LjQvdGDJztcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdoJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpdGhvdXRTdWZmaXggPyAn0LPQvtC00LjQvdCwJyA6ICfQs9C+0LTQuNC90YMnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICcgJyArIHBsdXJhbChmb3JtYXRba2V5XSwgK251bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gd2Vla2RheXNDYXNlUmVwbGFjZShtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIHdlZWtkYXlzID0ge1xuICAgICAgICAgICAgICAgIG5vbWluYXRpdmU6XG4gICAgICAgICAgICAgICAgICAgICfQvdC10LTRltC70Y9f0L/QvtC90LXQtNGW0LvQvtC6X9Cy0ZbQstGC0L7RgNC+0Lpf0YHQtdGA0LXQtNCwX9GH0LXRgtCy0LXRgF/Qv+KAmdGP0YLQvdC40YbRj1/RgdGD0LHQvtGC0LAnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgYWNjdXNhdGl2ZTpcbiAgICAgICAgICAgICAgICAgICAgJ9C90LXQtNGW0LvRjl/Qv9C+0L3QtdC00ZbQu9C+0Lpf0LLRltCy0YLQvtGA0L7Qul/RgdC10YDQtdC00YNf0YfQtdGC0LLQtdGAX9C/4oCZ0Y/RgtC90LjRhtGOX9GB0YPQsdC+0YLRgycuc3BsaXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBnZW5pdGl2ZTpcbiAgICAgICAgICAgICAgICAgICAgJ9C90LXQtNGW0LvRll/Qv9C+0L3QtdC00ZbQu9C60LBf0LLRltCy0YLQvtGA0LrQsF/RgdC10YDQtdC00Lhf0YfQtdGC0LLQtdGA0LPQsF/Qv+KAmdGP0YLQvdC40YbRll/RgdGD0LHQvtGC0LgnLnNwbGl0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm91bkNhc2U7XG5cbiAgICAgICAgaWYgKG0gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5c1snbm9taW5hdGl2ZSddXG4gICAgICAgICAgICAgICAgLnNsaWNlKDEsIDcpXG4gICAgICAgICAgICAgICAgLmNvbmNhdCh3ZWVrZGF5c1snbm9taW5hdGl2ZSddLnNsaWNlKDAsIDEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWVrZGF5c1snbm9taW5hdGl2ZSddO1xuICAgICAgICB9XG5cbiAgICAgICAgbm91bkNhc2UgPSAvKFxcW1vQktCy0KPRg11cXF0pID9kZGRkLy50ZXN0KGZvcm1hdClcbiAgICAgICAgICAgID8gJ2FjY3VzYXRpdmUnXG4gICAgICAgICAgICA6IC9cXFs/KD860LzQuNC90YPQu9C+0Zd80L3QsNGB0YLRg9C/0L3QvtGXKT8gP1xcXSA/ZGRkZC8udGVzdChmb3JtYXQpXG4gICAgICAgICAgICAgID8gJ2dlbml0aXZlJ1xuICAgICAgICAgICAgICA6ICdub21pbmF0aXZlJztcbiAgICAgICAgcmV0dXJuIHdlZWtkYXlzW25vdW5DYXNlXVttLmRheSgpXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvY2Vzc0hvdXJzRnVuY3Rpb24oc3RyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyICsgJ9C+JyArICh0aGlzLmhvdXJzKCkgPT09IDExID8gJ9CxJyA6ICcnKSArICddIExUJztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgdWsgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd1aycsIHtcbiAgICAgICAgbW9udGhzOiB7XG4gICAgICAgICAgICBmb3JtYXQ6ICfRgdGW0YfQvdGPX9C70Y7RgtC+0LPQvl/QsdC10YDQtdC30L3Rj1/QutCy0ZbRgtC90Y9f0YLRgNCw0LLQvdGPX9GH0LXRgNCy0L3Rj1/Qu9C40L/QvdGPX9GB0LXRgNC/0L3Rj1/QstC10YDQtdGB0L3Rj1/QttC+0LLRgtC90Y9f0LvQuNGB0YLQvtC/0LDQtNCwX9Cz0YDRg9C00L3Rjycuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhbmRhbG9uZTpcbiAgICAgICAgICAgICAgICAn0YHRltGH0LXQvdGMX9C70Y7RgtC40Llf0LHQtdGA0LXQt9C10L3RjF/QutCy0ZbRgtC10L3RjF/RgtGA0LDQstC10L3RjF/Rh9C10YDQstC10L3RjF/Qu9C40L/QtdC90Yxf0YHQtdGA0L/QtdC90Yxf0LLQtdGA0LXRgdC10L3RjF/QttC+0LLRgtC10L3RjF/Qu9C40YHRgtC+0L/QsNC0X9Cz0YDRg9C00LXQvdGMJy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICfRgdGW0Ydf0LvRjtGCX9Cx0LXRgF/QutCy0ZbRgl/RgtGA0LDQsl/Rh9C10YDQsl/Qu9C40L9f0YHQtdGA0L9f0LLQtdGAX9C20L7QstGCX9C70LjRgdGCX9Cz0YDRg9C0Jy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICB3ZWVrZGF5czogd2Vla2RheXNDYXNlUmVwbGFjZSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ9C90LRf0L/QvV/QstGCX9GB0YBf0YfRgl/Qv9GCX9GB0LEnLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn0L3QtF/Qv9C9X9Cy0YJf0YHRgF/Rh9GCX9C/0YJf0YHQsScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0RELk1NLllZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWSDRgC4nLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkg0YAuLCBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFlZWVkg0YAuLCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9Ch0YzQvtCz0L7QtNC90ZYgJyksXG4gICAgICAgICAgICBuZXh0RGF5OiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9CX0LDQstGC0YDQsCAnKSxcbiAgICAgICAgICAgIGxhc3REYXk6IHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0JLRh9C+0YDQsCAnKSxcbiAgICAgICAgICAgIG5leHRXZWVrOiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9CjXSBkZGRkIFsnKSxcbiAgICAgICAgICAgIGxhc3RXZWVrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzSG91cnNGdW5jdGlvbignW9Cc0LjQvdGD0LvQvtGXXSBkZGRkIFsnKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NIb3Vyc0Z1bmN0aW9uKCdb0JzQuNC90YPQu9C+0LPQvl0gZGRkZCBbJykuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfQt9CwICVzJyxcbiAgICAgICAgICAgIHBhc3Q6ICclcyDRgtC+0LzRgycsXG4gICAgICAgICAgICBzOiAn0LTQtdC60ZbQu9GM0LrQsCDRgdC10LrRg9C90LQnLFxuICAgICAgICAgICAgc3M6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBtOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgbW06IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgICAgICBoOiAn0LPQvtC00LjQvdGDJyxcbiAgICAgICAgICAgIGhoOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgZDogJ9C00LXQvdGMJyxcbiAgICAgICAgICAgIGRkOiByZWxhdGl2ZVRpbWVXaXRoUGx1cmFsLFxuICAgICAgICAgICAgTTogJ9C80ZbRgdGP0YbRjCcsXG4gICAgICAgICAgICBNTTogcmVsYXRpdmVUaW1lV2l0aFBsdXJhbCxcbiAgICAgICAgICAgIHk6ICfRgNGW0LonLFxuICAgICAgICAgICAgeXk6IHJlbGF0aXZlVGltZVdpdGhQbHVyYWwsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIE0uIEUuOiB0aG9zZSB0d28gYXJlIHZpcnR1YWxseSB1bnVzZWQgYnV0IGEgdXNlciBtaWdodCB3YW50IHRvIGltcGxlbWVudCB0aGVtIGZvciBoaXMvaGVyIHdlYnNpdGUgZm9yIHNvbWUgcmVhc29uXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/QvdC+0YfRlnzRgNCw0L3QutGDfNC00L3Rj3zQstC10YfQvtGA0LAvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXijQtNC90Y980LLQtdGH0L7RgNCwKSQvLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCA0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQvdC+0YfRlic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0YDQsNC90LrRgyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXIgPCAxNykge1xuICAgICAgICAgICAgICAgIHJldHVybiAn0LTQvdGPJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfQstC10YfQvtGA0LAnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0tKNC5fNCz0L4pLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlciwgcGVyaW9kKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBlcmlvZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAnLdC5JztcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICct0LPQvic7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNywgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gN3RoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHVrO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFVyZHUgW3VyXVxuLy8hIGF1dGhvciA6IFNhd29vZCBBbGFtIDogaHR0cHM6Ly9naXRodWIuY29tL2libmVzYXllZWRcbi8vISBhdXRob3IgOiBaYWNrIDogaHR0cHM6Ly9naXRodWIuY29tL1phY2tWaXNpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciBtb250aHMgPSBbXG4gICAgICAgICAgICAn2KzZhtmI2LHbjCcsXG4gICAgICAgICAgICAn2YHYsdmI2LHbjCcsXG4gICAgICAgICAgICAn2YXYp9ix2oYnLFxuICAgICAgICAgICAgJ9in2b7YsduM2YQnLFxuICAgICAgICAgICAgJ9mF2KbbjCcsXG4gICAgICAgICAgICAn2KzZiNmGJyxcbiAgICAgICAgICAgICfYrNmI2YTYp9im24wnLFxuICAgICAgICAgICAgJ9in2q/Ys9iqJyxcbiAgICAgICAgICAgICfYs9iq2YXYqNixJyxcbiAgICAgICAgICAgICfYp9qp2KrZiNio2LEnLFxuICAgICAgICAgICAgJ9mG2YjZhdio2LEnLFxuICAgICAgICAgICAgJ9iv2LPZhdio2LEnLFxuICAgICAgICBdLFxuICAgICAgICBkYXlzID0gWyfYp9iq2YjYp9ixJywgJ9m+24zYsScsICfZhdmG2q/ZhCcsICfYqNiv2r4nLCAn2KzZhdi52LHYp9iqJywgJ9is2YXYuduBJywgJ9uB2YHYqtuBJ107XG5cbiAgICB2YXIgdXIgPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd1cicsIHtcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBtb250aHMsXG4gICAgICAgIHdlZWtkYXlzOiBkYXlzLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGF5cyxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZNiMIEQgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyaWRpZW1QYXJzZTogL9i12KjYrXzYtNin2YUvLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAn2LTYp9mFJyA9PT0gaW5wdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfYtdio2K0nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICfYtNin2YUnO1xuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vYotisINio2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW9qp2YQg2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBb2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb2q/YsNi02KrbgSDYsdmI2LIg2KjZiNmC2KpdIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW9qv2LDYtNiq24FdIGRkZGQgW9io2YjZgtiqXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVzINio2LnYrycsXG4gICAgICAgICAgICBwYXN0OiAnJXMg2YLYqNmEJyxcbiAgICAgICAgICAgIHM6ICfahtmG2K8g2LPbjNqp2YbaiCcsXG4gICAgICAgICAgICBzczogJyVkINiz24zaqdmG2ognLFxuICAgICAgICAgICAgbTogJ9in24zaqSDZhdmG2bknLFxuICAgICAgICAgICAgbW06ICclZCDZhdmG2bknLFxuICAgICAgICAgICAgaDogJ9in24zaqSDar9q+2YbZuduBJyxcbiAgICAgICAgICAgIGhoOiAnJWQg2q/avtmG2bnbkicsXG4gICAgICAgICAgICBkOiAn2KfbjNqpINiv2YYnLFxuICAgICAgICAgICAgZGQ6ICclZCDYr9mGJyxcbiAgICAgICAgICAgIE06ICfYp9uM2qkg2YXYp9uBJyxcbiAgICAgICAgICAgIE1NOiAnJWQg2YXYp9uBJyxcbiAgICAgICAgICAgIHk6ICfYp9uM2qkg2LPYp9mEJyxcbiAgICAgICAgICAgIHl5OiAnJWQg2LPYp9mEJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgv2IwvZywgJywnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9zdGZvcm1hdDogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8sL2csICfYjCcpO1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdXI7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVXpiZWsgTGF0aW4gW3V6LWxhdG5dXG4vLyEgYXV0aG9yIDogUmFzdWxiZWsgTWlyemF5ZXYgOiBnaXRodWIuY29tL1Jhc3VsYmVlZWtcblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuICAgIHZhciB1ekxhdG4gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd1ei1sYXRuJywge1xuICAgICAgICBtb250aHM6ICdZYW52YXJfRmV2cmFsX01hcnRfQXByZWxfTWF5X0l5dW5fSXl1bF9Bdmd1c3RfU2VudGFicl9Pa3RhYnJfTm95YWJyX0Rla2Ficicuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICdZYW5fRmV2X01hcl9BcHJfTWF5X0l5dW5fSXl1bF9BdmdfU2VuX09rdF9Ob3lfRGVrJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czpcbiAgICAgICAgICAgICdZYWtzaGFuYmFfRHVzaGFuYmFfU2VzaGFuYmFfQ2hvcnNoYW5iYV9QYXlzaGFuYmFfSnVtYV9TaGFuYmEnLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1lha19EdXNoX1Nlc2hfQ2hvcl9QYXlfSnVtX1NoYW4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAnWWFfRHVfU2VfQ2hvX1BhX0p1X1NoYScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEw6ICdEIE1NTU0gWVlZWScsXG4gICAgICAgICAgICBMTEw6ICdEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnRCBNTU1NIFlZWVksIGRkZGQgSEg6bW0nLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tCdWd1biBzb2F0XSBMVCBbZGFdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbRXJ0YWdhXSBMVCBbZGFdJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBba3VuaSBzb2F0XSBMVCBbZGFdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbS2VjaGEgc29hdF0gTFQgW2RhXScsXG4gICAgICAgICAgICBsYXN0V2VlazogXCJbTyd0Z2FuXSBkZGRkIFtrdW5pIHNvYXRdIExUIFtkYV1cIixcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnWWFxaW4gJXMgaWNoaWRhJyxcbiAgICAgICAgICAgIHBhc3Q6ICdCaXIgbmVjaGEgJXMgb2xkaW4nLFxuICAgICAgICAgICAgczogJ3Nvbml5YScsXG4gICAgICAgICAgICBzczogJyVkIHNvbml5YScsXG4gICAgICAgICAgICBtOiAnYmlyIGRhcWlxYScsXG4gICAgICAgICAgICBtbTogJyVkIGRhcWlxYScsXG4gICAgICAgICAgICBoOiAnYmlyIHNvYXQnLFxuICAgICAgICAgICAgaGg6ICclZCBzb2F0JyxcbiAgICAgICAgICAgIGQ6ICdiaXIga3VuJyxcbiAgICAgICAgICAgIGRkOiAnJWQga3VuJyxcbiAgICAgICAgICAgIE06ICdiaXIgb3knLFxuICAgICAgICAgICAgTU06ICclZCBveScsXG4gICAgICAgICAgICB5OiAnYmlyIHlpbCcsXG4gICAgICAgICAgICB5eTogJyVkIHlpbCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDd0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB1ekxhdG47XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogVXpiZWsgW3V6XVxuLy8hIGF1dGhvciA6IFNhcmRvciBNdW1pbm92IDogaHR0cHM6Ly9naXRodWIuY29tL211bWlub2ZmXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgdXogPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd1eicsIHtcbiAgICAgICAgbW9udGhzOiAn0Y/QvdCy0LDRgF/RhNC10LLRgNCw0Ltf0LzQsNGA0YJf0LDQv9GA0LXQu1/QvNCw0Llf0LjRjtC9X9C40Y7Qu1/QsNCy0LPRg9GB0YJf0YHQtdC90YLRj9Cx0YBf0L7QutGC0Y/QsdGAX9C90L7Rj9Cx0YBf0LTQtdC60LDQsdGAJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDogJ9GP0L3Qsl/RhNC10LJf0LzQsNGAX9Cw0L/RgF/QvNCw0Llf0LjRjtC9X9C40Y7Qu1/QsNCy0LNf0YHQtdC9X9C+0LrRgl/QvdC+0Y9f0LTQtdC6Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ9Cv0LrRiNCw0L3QsdCwX9CU0YPRiNCw0L3QsdCwX9Ch0LXRiNCw0L3QsdCwX9Cn0L7RgNGI0LDQvdCx0LBf0J/QsNC50YjQsNC90LHQsF/QltGD0LzQsF/QqNCw0L3QsdCwJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn0K/QutGIX9CU0YPRiF/QodC10Yhf0KfQvtGAX9Cf0LDQuV/QltGD0Lxf0KjQsNC9Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ9Cv0Lpf0JTRg1/QodC1X9Cn0L5f0J/QsF/QltGDX9Co0LAnLnNwbGl0KCdfJyksXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ0QgTU1NTSBZWVlZLCBkZGRkIEhIOm1tJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb0JHRg9Cz0YPQvSDRgdC+0LDRgl0gTFQgW9C00LBdJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdb0K3RgNGC0LDQs9CwXSBMVCBb0LTQsF0nLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvQutGD0L3QuCDRgdC+0LDRgl0gTFQgW9C00LBdJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdb0JrQtdGH0LAg0YHQvtCw0YJdIExUIFvQtNCwXScsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vQo9GC0LPQsNC9XSBkZGRkIFvQutGD0L3QuCDRgdC+0LDRgl0gTFQgW9C00LBdJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAn0K/QutC40L0gJXMg0LjRh9C40LTQsCcsXG4gICAgICAgICAgICBwYXN0OiAn0JHQuNGAINC90LXRh9CwICVzINC+0LvQtNC40L0nLFxuICAgICAgICAgICAgczogJ9GE0YPRgNGB0LDRgicsXG4gICAgICAgICAgICBzczogJyVkINGE0YPRgNGB0LDRgicsXG4gICAgICAgICAgICBtOiAn0LHQuNGAINC00LDQutC40LrQsCcsXG4gICAgICAgICAgICBtbTogJyVkINC00LDQutC40LrQsCcsXG4gICAgICAgICAgICBoOiAn0LHQuNGAINGB0L7QsNGCJyxcbiAgICAgICAgICAgIGhoOiAnJWQg0YHQvtCw0YInLFxuICAgICAgICAgICAgZDogJ9Cx0LjRgCDQutGD0L0nLFxuICAgICAgICAgICAgZGQ6ICclZCDQutGD0L0nLFxuICAgICAgICAgICAgTTogJ9Cx0LjRgCDQvtC5JyxcbiAgICAgICAgICAgIE1NOiAnJWQg0L7QuScsXG4gICAgICAgICAgICB5OiAn0LHQuNGAINC50LjQuycsXG4gICAgICAgICAgICB5eTogJyVkINC50LjQuycsXG4gICAgICAgIH0sXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDcsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB1ejtcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBWaWV0bmFtZXNlIFt2aV1cbi8vISBhdXRob3IgOiBCYW5nIE5ndXllbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYW5nbmtcbi8vISBhdXRob3IgOiBDaGllbiBLaXJhIDogaHR0cHM6Ly9naXRodWIuY29tL2NoaWVua2lyYVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHZpID0gbW9tZW50LmRlZmluZUxvY2FsZSgndmknLCB7XG4gICAgICAgIG1vbnRoczogJ3Row6FuZyAxX3Row6FuZyAyX3Row6FuZyAzX3Row6FuZyA0X3Row6FuZyA1X3Row6FuZyA2X3Row6FuZyA3X3Row6FuZyA4X3Row6FuZyA5X3Row6FuZyAxMF90aMOhbmcgMTFfdGjDoW5nIDEyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdUaGcgMDFfVGhnIDAyX1RoZyAwM19UaGcgMDRfVGhnIDA1X1RoZyAwNl9UaGcgMDdfVGhnIDA4X1RoZyAwOV9UaGcgMTBfVGhnIDExX1RoZyAxMicuc3BsaXQoXG4gICAgICAgICAgICAgICAgJ18nXG4gICAgICAgICAgICApLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICB3ZWVrZGF5czogJ2No4bunIG5o4bqtdF90aOG7qSBoYWlfdGjhu6kgYmFfdGjhu6kgdMawX3Ro4bupIG7Eg21fdGjhu6kgc8OhdV90aOG7qSBi4bqjeScuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0NOX1QyX1QzX1Q0X1Q1X1Q2X1Q3Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ0NOX1QyX1QzX1Q0X1Q1X1Q2X1Q3Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC9zYXxjaC9pLFxuICAgICAgICBpc1BNOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiAvXmNoJC9pLnRlc3QoaW5wdXQpO1xuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICBpZiAoaG91cnMgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ3NhJyA6ICdTQSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2NoJyA6ICdDSCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiB7XG4gICAgICAgICAgICBMVDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUzogJ0hIOm1tOnNzJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFtuxINtXSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBbbsSDbV0gWVlZWSBISDptbScsXG4gICAgICAgICAgICBMTExMOiAnZGRkZCwgRCBNTU1NIFtuxINtXSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIGw6ICdERC9NL1lZWVknLFxuICAgICAgICAgICAgbGw6ICdEIE1NTSBZWVlZJyxcbiAgICAgICAgICAgIGxsbDogJ0QgTU1NIFlZWVkgSEg6bW0nLFxuICAgICAgICAgICAgbGxsbDogJ2RkZCwgRCBNTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW0jDtG0gbmF5IGzDumNdIExUJyxcbiAgICAgICAgICAgIG5leHREYXk6ICdbTmfDoHkgbWFpIGzDumNdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCBbdHXhuqduIHThu5tpIGzDumNdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbSMO0bSBxdWEgbMO6Y10gTFQnLFxuICAgICAgICAgICAgbGFzdFdlZWs6ICdkZGRkIFt0deG6p24gdHLGsOG7m2MgbMO6Y10gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICclcyB04bubaScsXG4gICAgICAgICAgICBwYXN0OiAnJXMgdHLGsOG7m2MnLFxuICAgICAgICAgICAgczogJ3bDoGkgZ2nDonknLFxuICAgICAgICAgICAgc3M6ICclZCBnacOieScsXG4gICAgICAgICAgICBtOiAnbeG7mXQgcGjDunQnLFxuICAgICAgICAgICAgbW06ICclZCBwaMO6dCcsXG4gICAgICAgICAgICBoOiAnbeG7mXQgZ2nhu50nLFxuICAgICAgICAgICAgaGg6ICclZCBnaeG7nScsXG4gICAgICAgICAgICBkOiAnbeG7mXQgbmfDoHknLFxuICAgICAgICAgICAgZGQ6ICclZCBuZ8OgeScsXG4gICAgICAgICAgICB3OiAnbeG7mXQgdHXhuqduJyxcbiAgICAgICAgICAgIHd3OiAnJWQgdHXhuqduJyxcbiAgICAgICAgICAgIE06ICdt4buZdCB0aMOhbmcnLFxuICAgICAgICAgICAgTU06ICclZCB0aMOhbmcnLFxuICAgICAgICAgICAgeTogJ23hu5l0IG7Eg20nLFxuICAgICAgICAgICAgeXk6ICclZCBuxINtJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHZpO1xuXG59KSkpO1xuIiwiLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuLy8hIGxvY2FsZSA6IFBzZXVkbyBbeC1wc2V1ZG9dXG4vLyEgYXV0aG9yIDogQW5kcmV3IEhvb2QgOiBodHRwczovL2dpdGh1Yi5jb20vYW5kcmV3aG9vZDEyNVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHhQc2V1ZG8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd4LXBzZXVkbycsIHtcbiAgICAgICAgbW9udGhzOiAnSn7DocOxw7rDoX5yw71fRn7DqWJyw7p+w6Fyw71ffk3DoXJjfmhfw4FwfnLDrWxffk3DocO9X35Kw7rDscOpfl9Kw7psfsO9X8OBw7p+Z8O6c3R+X1PDqXB+dMOpbWJ+w6lyX8OTfmN0w7NifsOpcl/DkX7Ds3bDqW1+YsOpcl9+RMOpY8Opfm1iw6lyJy5zcGxpdChcbiAgICAgICAgICAgICdfJ1xuICAgICAgICApLFxuICAgICAgICBtb250aHNTaG9ydDpcbiAgICAgICAgICAgICdKfsOhw7FffkbDqWJffk3DoXJffsOBcHJffk3DocO9X35Kw7rDsV9+SsO6bF9+w4HDumdfflPDqXBffsOTY3RffsORw7N2X35Ew6ljJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIG1vbnRoc1BhcnNlRXhhY3Q6IHRydWUsXG4gICAgICAgIHdlZWtkYXlzOlxuICAgICAgICAgICAgJ1N+w7rDsWTDoX7DvV9Nw7N+w7Fkw6HDvX5fVMO6w6l+c2TDocO9fl9Xw6lkfsOxw6lzZH7DocO9X1R+aMO6cnN+ZMOhw71ffkZyw61kfsOhw71fU37DoXTDunJ+ZMOhw70nLnNwbGl0KFxuICAgICAgICAgICAgICAgICdfJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ1N+w7rDsV9+TcOzw7FfflTDusOpX35Xw6lkX35UaMO6X35GcsOtX35Tw6F0Jy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ1N+w7pfTcOzfl9Uw7pfflfDqV9UfmhfRnJ+X1PDoScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNQYXJzZUV4YWN0OiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ0QgTU1NTSBZWVlZJyxcbiAgICAgICAgICAgIExMTDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgICAgICBzYW1lRGF5OiAnW1R+w7Nkw6F+w70gw6F0XSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW1R+w7Ntw7N+cnLDs353IMOhdF0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFvDoXRdIExUJyxcbiAgICAgICAgICAgIGxhc3REYXk6ICdbw51+w6lzdH7DqXJkw6F+w70gw6F0XSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1tMfsOhc3RdIGRkZGQgW8OhdF0gTFQnLFxuICAgICAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiB7XG4gICAgICAgICAgICBmdXR1cmU6ICfDrX7DsSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMgw6F+Z8OzJyxcbiAgICAgICAgICAgIHM6ICfDoSB+ZsOpdyB+c8OpY8OzfsOxZHMnLFxuICAgICAgICAgICAgc3M6ICclZCBzfsOpY8Ozw7F+ZHMnLFxuICAgICAgICAgICAgbTogJ8OhIH5tw63DsX7DunTDqScsXG4gICAgICAgICAgICBtbTogJyVkIG1+w63DscO6fnTDqXMnLFxuICAgICAgICAgICAgaDogJ8OhfsOxIGjDs37DunInLFxuICAgICAgICAgICAgaGg6ICclZCBofsOzw7pycycsXG4gICAgICAgICAgICBkOiAnw6EgfmTDocO9JyxcbiAgICAgICAgICAgIGRkOiAnJWQgZH7DocO9cycsXG4gICAgICAgICAgICBNOiAnw6Egfm3Ds8OxfnRoJyxcbiAgICAgICAgICAgIE1NOiAnJWQgbX7Ds8OxdH5ocycsXG4gICAgICAgICAgICB5OiAnw6EgfsO9w6nDoXInLFxuICAgICAgICAgICAgeXk6ICclZCDDvX7DqcOhcnMnLFxuICAgICAgICB9LFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB+figobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ25kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgICAgICB3ZWVrOiB7XG4gICAgICAgICAgICBkb3c6IDEsIC8vIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICAgICAgZG95OiA0LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4geFBzZXVkbztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBZb3J1YmEgTmlnZXJpYSBbeW9dXG4vLyEgYXV0aG9yIDogQXRvbGFnYmUgQWJpc295ZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRlbGEtYmF0b2xhZ2JlXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgeW8gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd5bycsIHtcbiAgICAgICAgbW9udGhzOiAnU+G6ucyBcuG6ucyBX0XMgHJlzIBsZcyAX+G6uHLhurnMgG5hzIBfScyAZ2JlzIFfRcyAYmliaV9PzIBrdcyAZHVfQWfhurltb19PzIBndcyBbl9Pd2V3ZV/hu4zMgHdhzIByYcyAX0JlzIFsdcyBX+G7jMyAcOG6ucyAzIAnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnU+G6ucyBcl9FzIBybF/hurhybl9JzIBnYl9FzIBiaV9PzIBrdcyAX0Fn4bq5X0/MgGd1zIFfT3dlX+G7jMyAd2HMgF9CZcyBbF/hu4zMgHDhurnMgMyAJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5czogJ0HMgGnMgGt1zIFfQWplzIFfScyAc+G6ucyBZ3VuX+G7jGrhu43MgXJ1zIFf4buMauG7jcyBYuG7jV/hurh0acyAX0HMgGJhzIFt4bq5zIF0YScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNTaG9ydDogJ0HMgGnMgGtfQWplzIFfScyAc+G6ucyBX+G7jGpyX+G7jGpiX+G6uHRpzIBfQcyAYmHMgScuc3BsaXQoJ18nKSxcbiAgICAgICAgd2Vla2RheXNNaW46ICdBzIBpzIBfQWpfScyAc1/hu4xyX+G7jGJf4bq4dF9BzIBiJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgICAgIEw6ICdERC9NTS9ZWVlZJyxcbiAgICAgICAgICAgIExMOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMOiAnRCBNTU1NIFlZWVkgaDptbSBBJyxcbiAgICAgICAgICAgIExMTEw6ICdkZGRkLCBEIE1NTU0gWVlZWSBoOm1tIEEnLFxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1tPzIBuacyAIG5pXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+G7jMyAbGEgbmldIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrOiBcImRkZGQgW+G7jHPhurnMgCB0b8yBbidi4buNXSBbbmldIExUXCIsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW0HMgG5hIG5pXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ2RkZGQgW+G7jHPhurnMgCB0b8yBbOG7jcyBXSBbbmldIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0aXZlVGltZToge1xuICAgICAgICAgICAgZnV0dXJlOiAnbmnMgSAlcycsXG4gICAgICAgICAgICBwYXN0OiAnJXMga+G7jWphzIEnLFxuICAgICAgICAgICAgczogJ2nMgHPhurlqdcyBIGFheWHMgSBkaWUnLFxuICAgICAgICAgICAgc3M6ICdhYXlhzIEgJWQnLFxuICAgICAgICAgICAgbTogJ2nMgHPhurlqdcyBIGthbicsXG4gICAgICAgICAgICBtbTogJ2nMgHPhurlqdcyBICVkJyxcbiAgICAgICAgICAgIGg6ICd3YcyBa2F0aSBrYW4nLFxuICAgICAgICAgICAgaGg6ICd3YcyBa2F0aSAlZCcsXG4gICAgICAgICAgICBkOiAn4buNauG7jcyBIGthbicsXG4gICAgICAgICAgICBkZDogJ+G7jWrhu43MgSAlZCcsXG4gICAgICAgICAgICBNOiAnb3N1zIAga2FuJyxcbiAgICAgICAgICAgIE1NOiAnb3N1zIAgJWQnLFxuICAgICAgICAgICAgeTogJ+G7jWR1zIFuIGthbicsXG4gICAgICAgICAgICB5eTogJ+G7jWR1zIFuICVkJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL+G7jWrhu43MgVxcc1xcZHsxLDJ9LyxcbiAgICAgICAgb3JkaW5hbDogJ+G7jWrhu43MgSAlZCcsXG4gICAgICAgIHdlZWs6IHtcbiAgICAgICAgICAgIGRvdzogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3k6IDQsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDR0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB5bztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vISBsb2NhbGUgOiBDaGluZXNlIChDaGluYSkgW3poLWNuXVxuLy8hIGF1dGhvciA6IHN1dXBpYyA6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdXVwaWNcbi8vISBhdXRob3IgOiBaZW5vIFplbmcgOiBodHRwczovL2dpdGh1Yi5jb20vemVub3plbmdcbi8vISBhdXRob3IgOiB1dTEwOSA6IGh0dHBzOi8vZ2l0aHViLmNvbS91dTEwOVxuXG47KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nID8gZmFjdG9yeShyZXF1aXJlKCcuLi9tb21lbnQnKSkgOlxuICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vbW9tZW50J10sIGZhY3RvcnkpIDpcbiAgIGZhY3RvcnkoZ2xvYmFsLm1vbWVudClcbn0odGhpcywgKGZ1bmN0aW9uIChtb21lbnQpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8hIG1vbWVudC5qcyBsb2NhbGUgY29uZmlndXJhdGlvblxuXG4gICAgdmFyIHpoQ24gPSBtb21lbnQuZGVmaW5lTG9jYWxlKCd6aC1jbicsIHtcbiAgICAgICAgbW9udGhzOiAn5LiA5pyIX+S6jOaciF/kuInmnIhf5Zub5pyIX+S6lOaciF/lha3mnIhf5LiD5pyIX+WFq+aciF/kuZ3mnIhf5Y2B5pyIX+WNgeS4gOaciF/ljYHkuozmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIG1vbnRoc1Nob3J0OiAnMeaciF8y5pyIXzPmnIhfNOaciF815pyIXzbmnIhfN+aciF845pyIXznmnIhfMTDmnIhfMTHmnIhfMTLmnIgnLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIHdlZWtkYXlzOiAn5pif5pyf5pelX+aYn+acn+S4gF/mmJ/mnJ/kuoxf5pif5pyf5LiJX+aYn+acn+Wbm1/mmJ/mnJ/kupRf5pif5pyf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiAn5ZGo5pelX+WRqOS4gF/lkajkuoxf5ZGo5LiJX+WRqOWbm1/lkajkupRf5ZGo5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c01pbjogJ+aXpV/kuIBf5LqMX+S4iV/lm5tf5LqUX+WFrScuc3BsaXQoJ18nKSxcbiAgICAgICAgbG9uZ0RhdGVGb3JtYXQ6IHtcbiAgICAgICAgICAgIExUOiAnSEg6bW0nLFxuICAgICAgICAgICAgTFRTOiAnSEg6bW06c3MnLFxuICAgICAgICAgICAgTDogJ1lZWVkvTU0vREQnLFxuICAgICAgICAgICAgTEw6ICdZWVlZ5bm0TeaciETml6UnLFxuICAgICAgICAgICAgTExMOiAnWVlZWeW5tE3mnIhE5pelQWjngrltbeWIhicsXG4gICAgICAgICAgICBMTExMOiAnWVlZWeW5tE3mnIhE5pelZGRkZEFo54K5bW3liIYnLFxuICAgICAgICAgICAgbDogJ1lZWVkvTS9EJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/lh4zmmah85pep5LiKfOS4iuWNiHzkuK3ljYh85LiL5Y2IfOaZmuS4ii8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+WHjOaZqCcgfHwgbWVyaWRpZW0gPT09ICfml6nkuIonIHx8IG1lcmlkaWVtID09PSAn5LiK5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4i+WNiCcgfHwgbWVyaWRpZW0gPT09ICfmmZrkuIonKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdXIgKyAxMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gJ+S4reWNiCdcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtOiBmdW5jdGlvbiAoaG91ciwgbWludXRlLCBpc0xvd2VyKSB7XG4gICAgICAgICAgICB2YXIgaG0gPSBob3VyICogMTAwICsgbWludXRlO1xuICAgICAgICAgICAgaWYgKGhtIDwgNjAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICflh4zmmagnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDkwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pep5LiKJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMTMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuIrljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDEyMzApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4reWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiL5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfmmZrkuIonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vku4rlpKldTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vmmI7lpKldTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgICAgICAgICBpZiAobm93LndlZWsoKSAhPT0gdGhpcy53ZWVrKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdb5LiLXWRkZExUJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vmnKxdZGRkTFQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+aYqOWkqV1MVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogZnVuY3Rpb24gKG5vdykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLndlZWsoKSAhPT0gbm93LndlZWsoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1vkuIpdZGRkTFQnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnW+acrF1kZGRMVCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjml6V85pyIfOWRqCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfml6UnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aciCc7XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn5ZGoJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz5ZCOJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+WJjScsXG4gICAgICAgICAgICBzOiAn5Yeg56eSJyxcbiAgICAgICAgICAgIHNzOiAnJWQg56eSJyxcbiAgICAgICAgICAgIG06ICcxIOWIhumSnycsXG4gICAgICAgICAgICBtbTogJyVkIOWIhumSnycsXG4gICAgICAgICAgICBoOiAnMSDlsI/ml7YnLFxuICAgICAgICAgICAgaGg6ICclZCDlsI/ml7YnLFxuICAgICAgICAgICAgZDogJzEg5aSpJyxcbiAgICAgICAgICAgIGRkOiAnJWQg5aSpJyxcbiAgICAgICAgICAgIHc6ICcxIOWRqCcsXG4gICAgICAgICAgICB3dzogJyVkIOWRqCcsXG4gICAgICAgICAgICBNOiAnMSDkuKrmnIgnLFxuICAgICAgICAgICAgTU06ICclZCDkuKrmnIgnLFxuICAgICAgICAgICAgeTogJzEg5bm0JyxcbiAgICAgICAgICAgIHl5OiAnJWQg5bm0JyxcbiAgICAgICAgfSxcbiAgICAgICAgd2Vlazoge1xuICAgICAgICAgICAgLy8gR0IvVCA3NDA4LTE5OTTjgIrmlbDmja7lhYPlkozkuqTmjaLmoLzlvI/Ct+S/oeaBr+S6pOaNosK35pel5pyf5ZKM5pe26Ze06KGo56S65rOV44CL5LiOSVNPIDg2MDE6MTk4OOetieaViFxuICAgICAgICAgICAgZG93OiAxLCAvLyBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgICAgIGRveTogNCwgLy8gVGhlIHdlZWsgdGhhdCBjb250YWlucyBKYW4gNHRoIGlzIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyLlxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHpoQ247XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2hpbmVzZSAoSG9uZyBLb25nKSBbemgtaGtdXG4vLyEgYXV0aG9yIDogQmVuIDogaHR0cHM6Ly9naXRodWIuY29tL2Jlbi1saW5cbi8vISBhdXRob3IgOiBDaHJpcyBMYW0gOiBodHRwczovL2dpdGh1Yi5jb20vaGVoYWNocmlzXG4vLyEgYXV0aG9yIDogS29uc3RhbnRpbiA6IGh0dHBzOi8vZ2l0aHViLmNvbS9za2ZkXG4vLyEgYXV0aG9yIDogQW50aG9ueSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnRob255bGF1XG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgemhIayA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3poLWhrJywge1xuICAgICAgICBtb250aHM6ICfkuIDmnIhf5LqM5pyIX+S4ieaciF/lm5vmnIhf5LqU5pyIX+WFreaciF/kuIPmnIhf5YWr5pyIX+S5neaciF/ljYHmnIhf5Y2B5LiA5pyIX+WNgeS6jOaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICcx5pyIXzLmnIhfM+aciF805pyIXzXmnIhfNuaciF835pyIXzjmnIhfOeaciF8xMOaciF8xMeaciF8xMuaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfmmJ/mnJ/ml6Vf5pif5pyf5LiAX+aYn+acn+S6jF/mmJ/mnJ/kuIlf5pif5pyf5ZubX+aYn+acn+S6lF/mmJ/mnJ/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfpgLHml6Vf6YCx5LiAX+mAseS6jF/pgLHkuIlf6YCx5ZubX+mAseS6lF/pgLHlha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn5pelX+S4gF/kuoxf5LiJX+Wbm1/kupRf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICAgICAgbDogJ1lZWVkvTS9EJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/lh4zmmah85pep5LiKfOS4iuWNiHzkuK3ljYh85LiL5Y2IfOaZmuS4ii8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+WHjOaZqCcgfHwgbWVyaWRpZW0gPT09ICfml6nkuIonIHx8IG1lcmlkaWVtID09PSAn5LiK5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4reWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5LiL5Y2IJyB8fCBtZXJpZGllbSA9PT0gJ+aZmuS4iicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgdmFyIGhtID0gaG91ciAqIDEwMCArIG1pbnV0ZTtcbiAgICAgICAgICAgIGlmIChobSA8IDYwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5YeM5pmoJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCA5MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aXqeS4iic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTIwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiK5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPT09IDEyMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4reWNiCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTgwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiL5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfmmZrkuIonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYWxlbmRhcjoge1xuICAgICAgICAgICAgc2FtZURheTogJ1vku4rlpKldTFQnLFxuICAgICAgICAgICAgbmV4dERheTogJ1vmmI7lpKldTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb5LiLXWRkZGRMVCcsXG4gICAgICAgICAgICBsYXN0RGF5OiAnW+aYqOWkqV1MVCcsXG4gICAgICAgICAgICBsYXN0V2VlazogJ1vkuIpdZGRkZExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjml6V85pyIfOmAsSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfml6UnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aciCc7XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn6YCxJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz5b6MJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+WJjScsXG4gICAgICAgICAgICBzOiAn5bm+56eSJyxcbiAgICAgICAgICAgIHNzOiAnJWQg56eSJyxcbiAgICAgICAgICAgIG06ICcxIOWIhumQmCcsXG4gICAgICAgICAgICBtbTogJyVkIOWIhumQmCcsXG4gICAgICAgICAgICBoOiAnMSDlsI/mmYInLFxuICAgICAgICAgICAgaGg6ICclZCDlsI/mmYInLFxuICAgICAgICAgICAgZDogJzEg5aSpJyxcbiAgICAgICAgICAgIGRkOiAnJWQg5aSpJyxcbiAgICAgICAgICAgIE06ICcxIOWAi+aciCcsXG4gICAgICAgICAgICBNTTogJyVkIOWAi+aciCcsXG4gICAgICAgICAgICB5OiAnMSDlubQnLFxuICAgICAgICAgICAgeXk6ICclZCDlubQnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHpoSGs7XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2hpbmVzZSAoTWFjYXUpIFt6aC1tb11cbi8vISBhdXRob3IgOiBCZW4gOiBodHRwczovL2dpdGh1Yi5jb20vYmVuLWxpblxuLy8hIGF1dGhvciA6IENocmlzIExhbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9oZWhhY2hyaXNcbi8vISBhdXRob3IgOiBUYW4gWXVhbmhvbmcgOiBodHRwczovL2dpdGh1Yi5jb20vbGUwdGFuXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgemhNbyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3poLW1vJywge1xuICAgICAgICBtb250aHM6ICfkuIDmnIhf5LqM5pyIX+S4ieaciF/lm5vmnIhf5LqU5pyIX+WFreaciF/kuIPmnIhf5YWr5pyIX+S5neaciF/ljYHmnIhf5Y2B5LiA5pyIX+WNgeS6jOaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICcx5pyIXzLmnIhfM+aciF805pyIXzXmnIhfNuaciF835pyIXzjmnIhfOeaciF8xMOaciF8xMeaciF8xMuaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfmmJ/mnJ/ml6Vf5pif5pyf5LiAX+aYn+acn+S6jF/mmJ/mnJ/kuIlf5pif5pyf5ZubX+aYn+acn+S6lF/mmJ/mnJ/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfpgLHml6Vf6YCx5LiAX+mAseS6jF/pgLHkuIlf6YCx5ZubX+mAseS6lF/pgLHlha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn5pelX+S4gF/kuoxf5LiJX+Wbm1/kupRf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnREQvTU0vWVlZWScsXG4gICAgICAgICAgICBMTDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICAgICAgbDogJ0QvTS9ZWVlZJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/lh4zmmah85pep5LiKfOS4iuWNiHzkuK3ljYh85LiL5Y2IfOaZmuS4ii8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+WHjOaZqCcgfHwgbWVyaWRpZW0gPT09ICfml6nkuIonIHx8IG1lcmlkaWVtID09PSAn5LiK5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4reWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5LiL5Y2IJyB8fCBtZXJpZGllbSA9PT0gJ+aZmuS4iicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgdmFyIGhtID0gaG91ciAqIDEwMCArIG1pbnV0ZTtcbiAgICAgICAgICAgIGlmIChobSA8IDYwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5YeM5pmoJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCA5MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aXqeS4iic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTEzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiK5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMjMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuK3ljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDE4MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4i+WNiCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pma5LiKJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb5LuK5aSpXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+aYjuWkqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb5LiLXWRkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vmmKjlpKldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+S4il1kZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjml6V85pyIfOmAsSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfml6UnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aciCc7XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn6YCxJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz5YWnJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+WJjScsXG4gICAgICAgICAgICBzOiAn5bm+56eSJyxcbiAgICAgICAgICAgIHNzOiAnJWQg56eSJyxcbiAgICAgICAgICAgIG06ICcxIOWIhumQmCcsXG4gICAgICAgICAgICBtbTogJyVkIOWIhumQmCcsXG4gICAgICAgICAgICBoOiAnMSDlsI/mmYInLFxuICAgICAgICAgICAgaGg6ICclZCDlsI/mmYInLFxuICAgICAgICAgICAgZDogJzEg5aSpJyxcbiAgICAgICAgICAgIGRkOiAnJWQg5aSpJyxcbiAgICAgICAgICAgIE06ICcxIOWAi+aciCcsXG4gICAgICAgICAgICBNTTogJyVkIOWAi+aciCcsXG4gICAgICAgICAgICB5OiAnMSDlubQnLFxuICAgICAgICAgICAgeXk6ICclZCDlubQnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHpoTW87XG5cbn0pKSk7XG4iLCIvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG4vLyEgbG9jYWxlIDogQ2hpbmVzZSAoVGFpd2FuKSBbemgtdHddXG4vLyEgYXV0aG9yIDogQmVuIDogaHR0cHM6Ly9naXRodWIuY29tL2Jlbi1saW5cbi8vISBhdXRob3IgOiBDaHJpcyBMYW0gOiBodHRwczovL2dpdGh1Yi5jb20vaGVoYWNocmlzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgPyBmYWN0b3J5KHJlcXVpcmUoJy4uL21vbWVudCcpKSA6XG4gICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9tb21lbnQnXSwgZmFjdG9yeSkgOlxuICAgZmFjdG9yeShnbG9iYWwubW9tZW50KVxufSh0aGlzLCAoZnVuY3Rpb24gKG1vbWVudCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICAvLyEgbW9tZW50LmpzIGxvY2FsZSBjb25maWd1cmF0aW9uXG5cbiAgICB2YXIgemhUdyA9IG1vbWVudC5kZWZpbmVMb2NhbGUoJ3poLXR3Jywge1xuICAgICAgICBtb250aHM6ICfkuIDmnIhf5LqM5pyIX+S4ieaciF/lm5vmnIhf5LqU5pyIX+WFreaciF/kuIPmnIhf5YWr5pyIX+S5neaciF/ljYHmnIhf5Y2B5LiA5pyIX+WNgeS6jOaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgbW9udGhzU2hvcnQ6ICcx5pyIXzLmnIhfM+aciF805pyIXzXmnIhfNuaciF835pyIXzjmnIhfOeaciF8xMOaciF8xMeaciF8xMuaciCcuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgd2Vla2RheXM6ICfmmJ/mnJ/ml6Vf5pif5pyf5LiAX+aYn+acn+S6jF/mmJ/mnJ/kuIlf5pif5pyf5ZubX+aYn+acn+S6lF/mmJ/mnJ/lha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzU2hvcnQ6ICfpgLHml6Vf6YCx5LiAX+mAseS6jF/pgLHkuIlf6YCx5ZubX+mAseS6lF/pgLHlha0nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluOiAn5pelX+S4gF/kuoxf5LiJX+Wbm1/kupRf5YWtJy5zcGxpdCgnXycpLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDoge1xuICAgICAgICAgICAgTFQ6ICdISDptbScsXG4gICAgICAgICAgICBMVFM6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMOiAnWVlZWS9NTS9ERCcsXG4gICAgICAgICAgICBMTDogJ1lZWVnlubRN5pyIROaXpScsXG4gICAgICAgICAgICBMTEw6ICdZWVlZ5bm0TeaciETml6UgSEg6bW0nLFxuICAgICAgICAgICAgTExMTDogJ1lZWVnlubRN5pyIROaXpWRkZGQgSEg6bW0nLFxuICAgICAgICAgICAgbDogJ1lZWVkvTS9EJyxcbiAgICAgICAgICAgIGxsOiAnWVlZWeW5tE3mnIhE5pelJyxcbiAgICAgICAgICAgIGxsbDogJ1lZWVnlubRN5pyIROaXpSBISDptbScsXG4gICAgICAgICAgICBsbGxsOiAnWVlZWeW5tE3mnIhE5pelZGRkZCBISDptbScsXG4gICAgICAgIH0sXG4gICAgICAgIG1lcmlkaWVtUGFyc2U6IC/lh4zmmah85pep5LiKfOS4iuWNiHzkuK3ljYh85LiL5Y2IfOaZmuS4ii8sXG4gICAgICAgIG1lcmlkaWVtSG91cjogZnVuY3Rpb24gKGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtZXJpZGllbSA9PT0gJ+WHjOaZqCcgfHwgbWVyaWRpZW0gPT09ICfml6nkuIonIHx8IG1lcmlkaWVtID09PSAn5LiK5Y2IJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJpZGllbSA9PT0gJ+S4reWNiCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciA+PSAxMSA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmlkaWVtID09PSAn5LiL5Y2IJyB8fCBtZXJpZGllbSA9PT0gJ+aZmuS4iicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXJpZGllbTogZnVuY3Rpb24gKGhvdXIsIG1pbnV0ZSwgaXNMb3dlcikge1xuICAgICAgICAgICAgdmFyIGhtID0gaG91ciAqIDEwMCArIG1pbnV0ZTtcbiAgICAgICAgICAgIGlmIChobSA8IDYwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5YeM5pmoJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCA5MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aXqeS4iic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhtIDwgMTEzMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5LiK5Y2IJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0gPCAxMjMwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICfkuK3ljYgnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChobSA8IDE4MDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+S4i+WNiCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAn5pma5LiKJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXI6IHtcbiAgICAgICAgICAgIHNhbWVEYXk6ICdb5LuK5aSpXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5OiAnW+aYjuWkqV0gTFQnLFxuICAgICAgICAgICAgbmV4dFdlZWs6ICdb5LiLXWRkZGQgTFQnLFxuICAgICAgICAgICAgbGFzdERheTogJ1vmmKjlpKldIExUJyxcbiAgICAgICAgICAgIGxhc3RXZWVrOiAnW+S4il1kZGRkIExUJyxcbiAgICAgICAgICAgIHNhbWVFbHNlOiAnTCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSjml6V85pyIfOmAsSkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGVyaW9kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREREJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArICfml6UnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgJ+aciCc7XG4gICAgICAgICAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAn6YCxJztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWU6IHtcbiAgICAgICAgICAgIGZ1dHVyZTogJyVz5b6MJyxcbiAgICAgICAgICAgIHBhc3Q6ICclc+WJjScsXG4gICAgICAgICAgICBzOiAn5bm+56eSJyxcbiAgICAgICAgICAgIHNzOiAnJWQg56eSJyxcbiAgICAgICAgICAgIG06ICcxIOWIhumQmCcsXG4gICAgICAgICAgICBtbTogJyVkIOWIhumQmCcsXG4gICAgICAgICAgICBoOiAnMSDlsI/mmYInLFxuICAgICAgICAgICAgaGg6ICclZCDlsI/mmYInLFxuICAgICAgICAgICAgZDogJzEg5aSpJyxcbiAgICAgICAgICAgIGRkOiAnJWQg5aSpJyxcbiAgICAgICAgICAgIE06ICcxIOWAi+aciCcsXG4gICAgICAgICAgICBNTTogJyVkIOWAi+aciCcsXG4gICAgICAgICAgICB5OiAnMSDlubQnLFxuICAgICAgICAgICAgeXk6ICclZCDlubQnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHpoVHc7XG5cbn0pKSk7XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vYWZcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FmLmpzXCIsXG5cdFwiLi9hZi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYWYuanNcIixcblx0XCIuL2FyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci5qc1wiLFxuXHRcIi4vYXItZHpcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWR6LmpzXCIsXG5cdFwiLi9hci1kei5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItZHouanNcIixcblx0XCIuL2FyLWt3XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1rdy5qc1wiLFxuXHRcIi4vYXIta3cuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLWt3LmpzXCIsXG5cdFwiLi9hci1seVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItbHkuanNcIixcblx0XCIuL2FyLWx5LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1seS5qc1wiLFxuXHRcIi4vYXItbWFcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLW1hLmpzXCIsXG5cdFwiLi9hci1tYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItbWEuanNcIixcblx0XCIuL2FyLXBzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1wcy5qc1wiLFxuXHRcIi4vYXItcHMuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXBzLmpzXCIsXG5cdFwiLi9hci1zYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItc2EuanNcIixcblx0XCIuL2FyLXNhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci1zYS5qc1wiLFxuXHRcIi4vYXItdG5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2FyLXRuLmpzXCIsXG5cdFwiLi9hci10bi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXItdG4uanNcIixcblx0XCIuL2FyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9hci5qc1wiLFxuXHRcIi4vYXpcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2F6LmpzXCIsXG5cdFwiLi9hei5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYXouanNcIixcblx0XCIuL2JlXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iZS5qc1wiLFxuXHRcIi4vYmUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JlLmpzXCIsXG5cdFwiLi9iZ1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYmcuanNcIixcblx0XCIuL2JnLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9iZy5qc1wiLFxuXHRcIi4vYm1cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JtLmpzXCIsXG5cdFwiLi9ibS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm0uanNcIixcblx0XCIuL2JuXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibi5qc1wiLFxuXHRcIi4vYm4tYmRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JuLWJkLmpzXCIsXG5cdFwiLi9ibi1iZC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm4tYmQuanNcIixcblx0XCIuL2JuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ibi5qc1wiLFxuXHRcIi4vYm9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JvLmpzXCIsXG5cdFwiLi9iby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYm8uanNcIixcblx0XCIuL2JyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ici5qc1wiLFxuXHRcIi4vYnIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2JyLmpzXCIsXG5cdFwiLi9ic1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvYnMuanNcIixcblx0XCIuL2JzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9icy5qc1wiLFxuXHRcIi4vY2FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2NhLmpzXCIsXG5cdFwiLi9jYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY2EuanNcIixcblx0XCIuL2NzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jcy5qc1wiLFxuXHRcIi4vY3MuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2NzLmpzXCIsXG5cdFwiLi9jdlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3YuanNcIixcblx0XCIuL2N2LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9jdi5qc1wiLFxuXHRcIi4vY3lcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2N5LmpzXCIsXG5cdFwiLi9jeS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvY3kuanNcIixcblx0XCIuL2RhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kYS5qc1wiLFxuXHRcIi4vZGEuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RhLmpzXCIsXG5cdFwiLi9kZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUuanNcIixcblx0XCIuL2RlLWF0XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS1hdC5qc1wiLFxuXHRcIi4vZGUtYXQuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLWF0LmpzXCIsXG5cdFwiLi9kZS1jaFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZGUtY2guanNcIixcblx0XCIuL2RlLWNoLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kZS1jaC5qc1wiLFxuXHRcIi4vZGUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2RlLmpzXCIsXG5cdFwiLi9kdlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZHYuanNcIixcblx0XCIuL2R2LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9kdi5qc1wiLFxuXHRcIi4vZWxcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VsLmpzXCIsXG5cdFwiLi9lbC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZWwuanNcIixcblx0XCIuL2VuLWF1XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1hdS5qc1wiLFxuXHRcIi4vZW4tYXUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWF1LmpzXCIsXG5cdFwiLi9lbi1jYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tY2EuanNcIixcblx0XCIuL2VuLWNhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1jYS5qc1wiLFxuXHRcIi4vZW4tZ2JcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWdiLmpzXCIsXG5cdFwiLi9lbi1nYi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tZ2IuanNcIixcblx0XCIuL2VuLWllXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pZS5qc1wiLFxuXHRcIi4vZW4taWUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWllLmpzXCIsXG5cdFwiLi9lbi1pbFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taWwuanNcIixcblx0XCIuL2VuLWlsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1pbC5qc1wiLFxuXHRcIi4vZW4taW5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLWluLmpzXCIsXG5cdFwiLi9lbi1pbi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4taW4uanNcIixcblx0XCIuL2VuLW56XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1uei5qc1wiLFxuXHRcIi4vZW4tbnouanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VuLW56LmpzXCIsXG5cdFwiLi9lbi1zZ1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW4tc2cuanNcIixcblx0XCIuL2VuLXNnLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lbi1zZy5qc1wiLFxuXHRcIi4vZW9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VvLmpzXCIsXG5cdFwiLi9lby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZW8uanNcIixcblx0XCIuL2VzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy5qc1wiLFxuXHRcIi4vZXMtZG9cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLWRvLmpzXCIsXG5cdFwiLi9lcy1kby5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtZG8uanNcIixcblx0XCIuL2VzLW14XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy1teC5qc1wiLFxuXHRcIi4vZXMtbXguanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLW14LmpzXCIsXG5cdFwiLi9lcy11c1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXMtdXMuanNcIixcblx0XCIuL2VzLXVzLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9lcy11cy5qc1wiLFxuXHRcIi4vZXMuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2VzLmpzXCIsXG5cdFwiLi9ldFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXQuanNcIixcblx0XCIuL2V0LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ldC5qc1wiLFxuXHRcIi4vZXVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2V1LmpzXCIsXG5cdFwiLi9ldS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZXUuanNcIixcblx0XCIuL2ZhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mYS5qc1wiLFxuXHRcIi4vZmEuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZhLmpzXCIsXG5cdFwiLi9maVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmkuanNcIixcblx0XCIuL2ZpLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9maS5qc1wiLFxuXHRcIi4vZmlsXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9maWwuanNcIixcblx0XCIuL2ZpbC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZmlsLmpzXCIsXG5cdFwiLi9mb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZm8uanNcIixcblx0XCIuL2ZvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mby5qc1wiLFxuXHRcIi4vZnJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLmpzXCIsXG5cdFwiLi9mci1jYVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2EuanNcIixcblx0XCIuL2ZyLWNhLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci1jYS5qc1wiLFxuXHRcIi4vZnItY2hcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2ZyLWNoLmpzXCIsXG5cdFwiLi9mci1jaC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnItY2guanNcIixcblx0XCIuL2ZyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9mci5qc1wiLFxuXHRcIi4vZnlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2Z5LmpzXCIsXG5cdFwiLi9meS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZnkuanNcIixcblx0XCIuL2dhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nYS5qc1wiLFxuXHRcIi4vZ2EuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dhLmpzXCIsXG5cdFwiLi9nZFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2QuanNcIixcblx0XCIuL2dkLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nZC5qc1wiLFxuXHRcIi4vZ2xcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dsLmpzXCIsXG5cdFwiLi9nbC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ2wuanNcIixcblx0XCIuL2dvbS1kZXZhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nb20tZGV2YS5qc1wiLFxuXHRcIi4vZ29tLWRldmEuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2dvbS1kZXZhLmpzXCIsXG5cdFwiLi9nb20tbGF0blwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ29tLWxhdG4uanNcIixcblx0XCIuL2dvbS1sYXRuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9nb20tbGF0bi5qc1wiLFxuXHRcIi4vZ3VcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2d1LmpzXCIsXG5cdFwiLi9ndS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvZ3UuanNcIixcblx0XCIuL2hlXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oZS5qc1wiLFxuXHRcIi4vaGUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hlLmpzXCIsXG5cdFwiLi9oaVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaGkuanNcIixcblx0XCIuL2hpLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oaS5qc1wiLFxuXHRcIi4vaHJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2hyLmpzXCIsXG5cdFwiLi9oci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHIuanNcIixcblx0XCIuL2h1XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9odS5qc1wiLFxuXHRcIi4vaHUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2h1LmpzXCIsXG5cdFwiLi9oeS1hbVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaHktYW0uanNcIixcblx0XCIuL2h5LWFtLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9oeS1hbS5qc1wiLFxuXHRcIi4vaWRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2lkLmpzXCIsXG5cdFwiLi9pZC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaWQuanNcIixcblx0XCIuL2lzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pcy5qc1wiLFxuXHRcIi4vaXMuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2lzLmpzXCIsXG5cdFwiLi9pdFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXQuanNcIixcblx0XCIuL2l0LWNoXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9pdC1jaC5qc1wiLFxuXHRcIi4vaXQtY2guanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2l0LWNoLmpzXCIsXG5cdFwiLi9pdC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvaXQuanNcIixcblx0XCIuL2phXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9qYS5qc1wiLFxuXHRcIi4vamEuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2phLmpzXCIsXG5cdFwiLi9qdlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvanYuanNcIixcblx0XCIuL2p2LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9qdi5qc1wiLFxuXHRcIi4va2FcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2thLmpzXCIsXG5cdFwiLi9rYS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva2EuanNcIixcblx0XCIuL2trXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ray5qc1wiLFxuXHRcIi4va2suanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2trLmpzXCIsXG5cdFwiLi9rbVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva20uanNcIixcblx0XCIuL2ttLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rbS5qc1wiLFxuXHRcIi4va25cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2tuLmpzXCIsXG5cdFwiLi9rbi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva24uanNcIixcblx0XCIuL2tvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9rby5qc1wiLFxuXHRcIi4va28uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2tvLmpzXCIsXG5cdFwiLi9rdVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3UuanNcIixcblx0XCIuL2t1LWttclwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3Uta21yLmpzXCIsXG5cdFwiLi9rdS1rbXIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t1LWttci5qc1wiLFxuXHRcIi4va3UuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2t1LmpzXCIsXG5cdFwiLi9reVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUva3kuanNcIixcblx0XCIuL2t5LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9reS5qc1wiLFxuXHRcIi4vbGJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2xiLmpzXCIsXG5cdFwiLi9sYi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbGIuanNcIixcblx0XCIuL2xvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sby5qc1wiLFxuXHRcIi4vbG8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2xvLmpzXCIsXG5cdFwiLi9sdFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbHQuanNcIixcblx0XCIuL2x0LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9sdC5qc1wiLFxuXHRcIi4vbHZcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL2x2LmpzXCIsXG5cdFwiLi9sdi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbHYuanNcIixcblx0XCIuL21lXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tZS5qc1wiLFxuXHRcIi4vbWUuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21lLmpzXCIsXG5cdFwiLi9taVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWkuanNcIixcblx0XCIuL21pLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9taS5qc1wiLFxuXHRcIi4vbWtcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21rLmpzXCIsXG5cdFwiLi9tay5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbWsuanNcIixcblx0XCIuL21sXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tbC5qc1wiLFxuXHRcIi4vbWwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21sLmpzXCIsXG5cdFwiLi9tblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbW4uanNcIixcblx0XCIuL21uLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tbi5qc1wiLFxuXHRcIi4vbXJcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21yLmpzXCIsXG5cdFwiLi9tci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXIuanNcIixcblx0XCIuL21zXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tcy5qc1wiLFxuXHRcIi4vbXMtbXlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL21zLW15LmpzXCIsXG5cdFwiLi9tcy1teS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXMtbXkuanNcIixcblx0XCIuL21zLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9tcy5qc1wiLFxuXHRcIi4vbXRcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL210LmpzXCIsXG5cdFwiLi9tdC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbXQuanNcIixcblx0XCIuL215XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9teS5qc1wiLFxuXHRcIi4vbXkuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL215LmpzXCIsXG5cdFwiLi9uYlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmIuanNcIixcblx0XCIuL25iLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9uYi5qc1wiLFxuXHRcIi4vbmVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25lLmpzXCIsXG5cdFwiLi9uZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmUuanNcIixcblx0XCIuL25sXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC5qc1wiLFxuXHRcIi4vbmwtYmVcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25sLWJlLmpzXCIsXG5cdFwiLi9ubC1iZS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbmwtYmUuanNcIixcblx0XCIuL25sLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ubC5qc1wiLFxuXHRcIi4vbm5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL25uLmpzXCIsXG5cdFwiLi9ubi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvbm4uanNcIixcblx0XCIuL29jLWxuY1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvb2MtbG5jLmpzXCIsXG5cdFwiLi9vYy1sbmMuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL29jLWxuYy5qc1wiLFxuXHRcIi4vcGEtaW5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3BhLWluLmpzXCIsXG5cdFwiLi9wYS1pbi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcGEtaW4uanNcIixcblx0XCIuL3BsXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wbC5qc1wiLFxuXHRcIi4vcGwuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3BsLmpzXCIsXG5cdFwiLi9wdFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcHQuanNcIixcblx0XCIuL3B0LWJyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9wdC1ici5qc1wiLFxuXHRcIi4vcHQtYnIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3B0LWJyLmpzXCIsXG5cdFwiLi9wdC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcHQuanNcIixcblx0XCIuL3JvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9yby5qc1wiLFxuXHRcIi4vcm8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3JvLmpzXCIsXG5cdFwiLi9ydVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvcnUuanNcIixcblx0XCIuL3J1LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9ydS5qc1wiLFxuXHRcIi4vc2RcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NkLmpzXCIsXG5cdFwiLi9zZC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2QuanNcIixcblx0XCIuL3NlXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zZS5qc1wiLFxuXHRcIi4vc2UuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NlLmpzXCIsXG5cdFwiLi9zaVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2kuanNcIixcblx0XCIuL3NpLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zaS5qc1wiLFxuXHRcIi4vc2tcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NrLmpzXCIsXG5cdFwiLi9zay5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc2suanNcIixcblx0XCIuL3NsXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zbC5qc1wiLFxuXHRcIi4vc2wuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NsLmpzXCIsXG5cdFwiLi9zcVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3EuanNcIixcblx0XCIuL3NxLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zcS5qc1wiLFxuXHRcIi4vc3JcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NyLmpzXCIsXG5cdFwiLi9zci1jeXJsXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zci1jeXJsLmpzXCIsXG5cdFwiLi9zci1jeXJsLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zci1jeXJsLmpzXCIsXG5cdFwiLi9zci5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3IuanNcIixcblx0XCIuL3NzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zcy5qc1wiLFxuXHRcIi4vc3MuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3NzLmpzXCIsXG5cdFwiLi9zdlwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3YuanNcIixcblx0XCIuL3N2LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS9zdi5qc1wiLFxuXHRcIi4vc3dcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3N3LmpzXCIsXG5cdFwiLi9zdy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvc3cuanNcIixcblx0XCIuL3RhXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90YS5qc1wiLFxuXHRcIi4vdGEuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RhLmpzXCIsXG5cdFwiLi90ZVwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGUuanNcIixcblx0XCIuL3RlLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ZS5qc1wiLFxuXHRcIi4vdGV0XCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ZXQuanNcIixcblx0XCIuL3RldC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGV0LmpzXCIsXG5cdFwiLi90Z1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGcuanNcIixcblx0XCIuL3RnLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90Zy5qc1wiLFxuXHRcIi4vdGhcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RoLmpzXCIsXG5cdFwiLi90aC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGguanNcIixcblx0XCIuL3RrXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ay5qc1wiLFxuXHRcIi4vdGsuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3RrLmpzXCIsXG5cdFwiLi90bC1waFwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGwtcGguanNcIixcblx0XCIuL3RsLXBoLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bC1waC5qc1wiLFxuXHRcIi4vdGxoXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90bGguanNcIixcblx0XCIuL3RsaC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdGxoLmpzXCIsXG5cdFwiLi90clwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHIuanNcIixcblx0XCIuL3RyLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90ci5qc1wiLFxuXHRcIi4vdHpsXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS90emwuanNcIixcblx0XCIuL3R6bC5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHpsLmpzXCIsXG5cdFwiLi90em1cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bS5qc1wiLFxuXHRcIi4vdHptLWxhdG5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3R6bS1sYXRuLmpzXCIsXG5cdFwiLi90em0tbGF0bi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHptLWxhdG4uanNcIixcblx0XCIuL3R6bS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdHptLmpzXCIsXG5cdFwiLi91Zy1jblwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdWctY24uanNcIixcblx0XCIuL3VnLWNuLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91Zy1jbi5qc1wiLFxuXHRcIi4vdWtcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VrLmpzXCIsXG5cdFwiLi91ay5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdWsuanNcIixcblx0XCIuL3VyXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ci5qc1wiLFxuXHRcIi4vdXIuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3VyLmpzXCIsXG5cdFwiLi91elwiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdXouanNcIixcblx0XCIuL3V6LWxhdG5cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3V6LWxhdG4uanNcIixcblx0XCIuL3V6LWxhdG4uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3V6LWxhdG4uanNcIixcblx0XCIuL3V6LmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS91ei5qc1wiLFxuXHRcIi4vdmlcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3ZpLmpzXCIsXG5cdFwiLi92aS5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvdmkuanNcIixcblx0XCIuL3gtcHNldWRvXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS94LXBzZXVkby5qc1wiLFxuXHRcIi4veC1wc2V1ZG8uanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3gtcHNldWRvLmpzXCIsXG5cdFwiLi95b1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUveW8uanNcIixcblx0XCIuL3lvLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS95by5qc1wiLFxuXHRcIi4vemgtY25cIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLWNuLmpzXCIsXG5cdFwiLi96aC1jbi5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtY24uanNcIixcblx0XCIuL3poLWhrXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1oay5qc1wiLFxuXHRcIi4vemgtaGsuanNcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLWhrLmpzXCIsXG5cdFwiLi96aC1tb1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtbW8uanNcIixcblx0XCIuL3poLW1vLmpzXCI6IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZS96aC1tby5qc1wiLFxuXHRcIi4vemgtdHdcIjogXCIuL25vZGVfbW9kdWxlcy9tb21lbnQvbG9jYWxlL3poLXR3LmpzXCIsXG5cdFwiLi96aC10dy5qc1wiOiBcIi4vbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGUvemgtdHcuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi9ub2RlX21vZHVsZXMvbW9tZW50L2xvY2FsZSBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qJFwiOyIsIi8vISBtb21lbnQuanNcbi8vISB2ZXJzaW9uIDogMi4zMC4xXG4vLyEgYXV0aG9ycyA6IFRpbSBXb29kLCBJc2tyZW4gQ2hlcm5ldiwgTW9tZW50LmpzIGNvbnRyaWJ1dG9yc1xuLy8hIGxpY2Vuc2UgOiBNSVRcbi8vISBtb21lbnRqcy5jb21cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgZ2xvYmFsLm1vbWVudCA9IGZhY3RvcnkoKVxufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgaG9va0NhbGxiYWNrO1xuXG4gICAgZnVuY3Rpb24gaG9va3MoKSB7XG4gICAgICAgIHJldHVybiBob29rQ2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIGRvbmUgdG8gcmVnaXN0ZXIgdGhlIG1ldGhvZCBjYWxsZWQgd2l0aCBtb21lbnQoKVxuICAgIC8vIHdpdGhvdXQgY3JlYXRpbmcgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxuICAgIGZ1bmN0aW9uIHNldEhvb2tDYWxsYmFjayhjYWxsYmFjaykge1xuICAgICAgICBob29rQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FycmF5KGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEFycmF5IHx8XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBBcnJheV0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3QoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IHdpbGwgdHJlYXQgdW5kZWZpbmVkIGFuZCBudWxsIGFzIG9iamVjdCBpZiBpdCB3YXNuJ3QgZm9yXG4gICAgICAgIC8vIGlucHV0ICE9IG51bGxcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlucHV0ICE9IG51bGwgJiZcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IE9iamVjdF0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzT3duUHJvcChhLCBiKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5sZW5ndGggPT09IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaztcbiAgICAgICAgICAgIGZvciAoayBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChvYmosIGspKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PT0gdm9pZCAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBOdW1iZXJdJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF0ZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBEYXRlXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXAoYXJyLCBmbikge1xuICAgICAgICB2YXIgcmVzID0gW10sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgYXJyTGVuID0gYXJyLmxlbmd0aDtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyckxlbjsgKytpKSB7XG4gICAgICAgICAgICByZXMucHVzaChmbihhcnJbaV0sIGkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVuZChhLCBiKSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gYikge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoYiwgaSkpIHtcbiAgICAgICAgICAgICAgICBhW2ldID0gYltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGIsICd0b1N0cmluZycpKSB7XG4gICAgICAgICAgICBhLnRvU3RyaW5nID0gYi50b1N0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGIsICd2YWx1ZU9mJykpIHtcbiAgICAgICAgICAgIGEudmFsdWVPZiA9IGIudmFsdWVPZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgdHJ1ZSkudXRjKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVmYXVsdFBhcnNpbmdGbGFncygpIHtcbiAgICAgICAgLy8gV2UgbmVlZCB0byBkZWVwIGNsb25lIHRoaXMgb2JqZWN0LlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZW1wdHk6IGZhbHNlLFxuICAgICAgICAgICAgdW51c2VkVG9rZW5zOiBbXSxcbiAgICAgICAgICAgIHVudXNlZElucHV0OiBbXSxcbiAgICAgICAgICAgIG92ZXJmbG93OiAtMixcbiAgICAgICAgICAgIGNoYXJzTGVmdE92ZXI6IDAsXG4gICAgICAgICAgICBudWxsSW5wdXQ6IGZhbHNlLFxuICAgICAgICAgICAgaW52YWxpZEVyYTogbnVsbCxcbiAgICAgICAgICAgIGludmFsaWRNb250aDogbnVsbCxcbiAgICAgICAgICAgIGludmFsaWRGb3JtYXQ6IGZhbHNlLFxuICAgICAgICAgICAgdXNlckludmFsaWRhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGlzbzogZmFsc2UsXG4gICAgICAgICAgICBwYXJzZWREYXRlUGFydHM6IFtdLFxuICAgICAgICAgICAgZXJhOiBudWxsLFxuICAgICAgICAgICAgbWVyaWRpZW06IG51bGwsXG4gICAgICAgICAgICByZmMyODIyOiBmYWxzZSxcbiAgICAgICAgICAgIHdlZWtkYXlNaXNtYXRjaDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2luZ0ZsYWdzKG0pIHtcbiAgICAgICAgaWYgKG0uX3BmID09IG51bGwpIHtcbiAgICAgICAgICAgIG0uX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9wZjtcbiAgICB9XG5cbiAgICB2YXIgc29tZTtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLnNvbWUpIHtcbiAgICAgICAgc29tZSA9IEFycmF5LnByb3RvdHlwZS5zb21lO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNvbWUgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgICAgICAgICB2YXIgdCA9IE9iamVjdCh0aGlzKSxcbiAgICAgICAgICAgICAgICBsZW4gPSB0Lmxlbmd0aCA+Pj4gMCxcbiAgICAgICAgICAgICAgICBpO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiB0ICYmIGZ1bi5jYWxsKHRoaXMsIHRbaV0sIGksIHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQobSkge1xuICAgICAgICB2YXIgZmxhZ3MgPSBudWxsLFxuICAgICAgICAgICAgcGFyc2VkUGFydHMgPSBmYWxzZSxcbiAgICAgICAgICAgIGlzTm93VmFsaWQgPSBtLl9kICYmICFpc05hTihtLl9kLmdldFRpbWUoKSk7XG4gICAgICAgIGlmIChpc05vd1ZhbGlkKSB7XG4gICAgICAgICAgICBmbGFncyA9IGdldFBhcnNpbmdGbGFncyhtKTtcbiAgICAgICAgICAgIHBhcnNlZFBhcnRzID0gc29tZS5jYWxsKGZsYWdzLnBhcnNlZERhdGVQYXJ0cywgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAhPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpc05vd1ZhbGlkID1cbiAgICAgICAgICAgICAgICBmbGFncy5vdmVyZmxvdyA8IDAgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuZW1wdHkgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZEVyYSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkTW9udGggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZFdlZWtkYXkgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3Mud2Vla2RheU1pc21hdGNoICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLm51bGxJbnB1dCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkRm9ybWF0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLnVzZXJJbnZhbGlkYXRlZCAmJlxuICAgICAgICAgICAgICAgICghZmxhZ3MubWVyaWRpZW0gfHwgKGZsYWdzLm1lcmlkaWVtICYmIHBhcnNlZFBhcnRzKSk7XG4gICAgICAgICAgICBpZiAobS5fc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgaXNOb3dWYWxpZCA9XG4gICAgICAgICAgICAgICAgICAgIGlzTm93VmFsaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY2hhcnNMZWZ0T3ZlciA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy51bnVzZWRUb2tlbnMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmJpZ0hvdXIgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuID09IG51bGwgfHwgIU9iamVjdC5pc0Zyb3plbihtKSkge1xuICAgICAgICAgICAgbS5faXNWYWxpZCA9IGlzTm93VmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNOb3dWYWxpZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkKGZsYWdzKSB7XG4gICAgICAgIHZhciBtID0gY3JlYXRlVVRDKE5hTik7XG4gICAgICAgIGlmIChmbGFncyAhPSBudWxsKSB7XG4gICAgICAgICAgICBleHRlbmQoZ2V0UGFyc2luZ0ZsYWdzKG0pLCBmbGFncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkudXNlckludmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIC8vIFBsdWdpbnMgdGhhdCBhZGQgcHJvcGVydGllcyBzaG91bGQgYWxzbyBhZGQgdGhlIGtleSBoZXJlIChudWxsIHZhbHVlKSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJvcGVybHkgY2xvbmUgb3Vyc2VsdmVzLlxuICAgIHZhciBtb21lbnRQcm9wZXJ0aWVzID0gKGhvb2tzLm1vbWVudFByb3BlcnRpZXMgPSBbXSksXG4gICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBwcm9wLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgbW9tZW50UHJvcGVydGllc0xlbiA9IG1vbWVudFByb3BlcnRpZXMubGVuZ3RoO1xuXG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faXNBTW9tZW50T2JqZWN0KSkge1xuICAgICAgICAgICAgdG8uX2lzQU1vbWVudE9iamVjdCA9IGZyb20uX2lzQU1vbWVudE9iamVjdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2kpKSB7XG4gICAgICAgICAgICB0by5faSA9IGZyb20uX2k7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9mKSkge1xuICAgICAgICAgICAgdG8uX2YgPSBmcm9tLl9mO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fbCkpIHtcbiAgICAgICAgICAgIHRvLl9sID0gZnJvbS5fbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3N0cmljdCkpIHtcbiAgICAgICAgICAgIHRvLl9zdHJpY3QgPSBmcm9tLl9zdHJpY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl90em0pKSB7XG4gICAgICAgICAgICB0by5fdHptID0gZnJvbS5fdHptO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faXNVVEMpKSB7XG4gICAgICAgICAgICB0by5faXNVVEMgPSBmcm9tLl9pc1VUQztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX29mZnNldCkpIHtcbiAgICAgICAgICAgIHRvLl9vZmZzZXQgPSBmcm9tLl9vZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9wZikpIHtcbiAgICAgICAgICAgIHRvLl9wZiA9IGdldFBhcnNpbmdGbGFncyhmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2xvY2FsZSkpIHtcbiAgICAgICAgICAgIHRvLl9sb2NhbGUgPSBmcm9tLl9sb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9tZW50UHJvcGVydGllc0xlbiA+IDApIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb21lbnRQcm9wZXJ0aWVzTGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gbW9tZW50UHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICB2YWwgPSBmcm9tW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB0b1twcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgLy8gTW9tZW50IHByb3RvdHlwZSBvYmplY3RcbiAgICBmdW5jdGlvbiBNb21lbnQoY29uZmlnKSB7XG4gICAgICAgIGNvcHlDb25maWcodGhpcywgY29uZmlnKTtcbiAgICAgICAgdGhpcy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5fZCAhPSBudWxsID8gY29uZmlnLl9kLmdldFRpbWUoKSA6IE5hTik7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcCBpbiBjYXNlIHVwZGF0ZU9mZnNldCBjcmVhdGVzIG5ldyBtb21lbnRcbiAgICAgICAgLy8gb2JqZWN0cy5cbiAgICAgICAgaWYgKHVwZGF0ZUluUHJvZ3Jlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTW9tZW50KG9iaikge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgb2JqIGluc3RhbmNlb2YgTW9tZW50IHx8IChvYmogIT0gbnVsbCAmJiBvYmouX2lzQU1vbWVudE9iamVjdCAhPSBudWxsKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgY29uc29sZS53YXJuXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEZXByZWNhdGlvbiB3YXJuaW5nOiAnICsgbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZShtc2csIGZuKSB7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICAgICAgICAgICAgYXJnLFxuICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIGFyZ0xlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ0xlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSAnXFxuWycgKyBpICsgJ10gJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIGFyZ3VtZW50c1swXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGFyZ3VtZW50c1swXSwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0ga2V5ICsgJzogJyArIGFyZ3VtZW50c1swXVtrZXldICsgJywgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcuc2xpY2UoMCwgLTIpOyAvLyBSZW1vdmUgdHJhaWxpbmcgY29tbWEgYW5kIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKGFyZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgICAgICAgIG1zZyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuQXJndW1lbnRzOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpLmpvaW4oJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFcnJvcigpLnN0YWNrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBmaXJzdFRpbWUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9LCBmbik7XG4gICAgfVxuXG4gICAgdmFyIGRlcHJlY2F0aW9ucyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gZGVwcmVjYXRlU2ltcGxlKG5hbWUsIG1zZykge1xuICAgICAgICBpZiAoaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlcihuYW1lLCBtc2cpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGVwcmVjYXRpb25zW25hbWVdKSB7XG4gICAgICAgICAgICB3YXJuKG1zZyk7XG4gICAgICAgICAgICBkZXByZWNhdGlvbnNbbmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG9va3Muc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzID0gZmFsc2U7XG4gICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyID0gbnVsbDtcblxuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0eXBlb2YgRnVuY3Rpb24gIT09ICd1bmRlZmluZWQnICYmIGlucHV0IGluc3RhbmNlb2YgRnVuY3Rpb24pIHx8XG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBGdW5jdGlvbl0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0KGNvbmZpZykge1xuICAgICAgICB2YXIgcHJvcCwgaTtcbiAgICAgICAgZm9yIChpIGluIGNvbmZpZykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoY29uZmlnLCBpKSkge1xuICAgICAgICAgICAgICAgIHByb3AgPSBjb25maWdbaV07XG4gICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24ocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tpXSA9IHByb3A7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1snXycgKyBpXSA9IHByb3A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgLy8gTGVuaWVudCBvcmRpbmFsIHBhcnNpbmcgYWNjZXB0cyBqdXN0IGEgbnVtYmVyIGluIGFkZGl0aW9uIHRvXG4gICAgICAgIC8vIG51bWJlciArIChwb3NzaWJseSkgc3R1ZmYgY29taW5nIGZyb20gX2RheU9mTW9udGhPcmRpbmFsUGFyc2UuXG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBcIm9yZGluYWxQYXJzZVwiIGZhbGxiYWNrIGluIG5leHQgbWFqb3IgcmVsZWFzZS5cbiAgICAgICAgdGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZUxlbmllbnQgPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgKHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2Uuc291cmNlIHx8IHRoaXMuX29yZGluYWxQYXJzZS5zb3VyY2UpICtcbiAgICAgICAgICAgICAgICAnfCcgK1xuICAgICAgICAgICAgICAgIC9cXGR7MSwyfS8uc291cmNlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY2hpbGRDb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IGV4dGVuZCh7fSwgcGFyZW50Q29uZmlnKSxcbiAgICAgICAgICAgIHByb3A7XG4gICAgICAgIGZvciAocHJvcCBpbiBjaGlsZENvbmZpZykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkgJiYgaXNPYmplY3QoY2hpbGRDb25maWdbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBwYXJlbnRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBjaGlsZENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZENvbmZpZ1twcm9wXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGNoaWxkQ29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocHJvcCBpbiBwYXJlbnRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBoYXNPd25Qcm9wKHBhcmVudENvbmZpZywgcHJvcCkgJiZcbiAgICAgICAgICAgICAgICAhaGFzT3duUHJvcChjaGlsZENvbmZpZywgcHJvcCkgJiZcbiAgICAgICAgICAgICAgICBpc09iamVjdChwYXJlbnRDb25maWdbcHJvcF0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgY2hhbmdlcyB0byBwcm9wZXJ0aWVzIGRvbid0IG1vZGlmeSBwYXJlbnQgY29uZmlnXG4gICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gZXh0ZW5kKHt9LCByZXNbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9jYWxlKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cztcblxuICAgIGlmIChPYmplY3Qua2V5cykge1xuICAgICAgICBrZXlzID0gT2JqZWN0LmtleXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAga2V5cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHZhciBpLFxuICAgICAgICAgICAgICAgIHJlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKG9iaiwgaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdENhbGVuZGFyID0ge1xuICAgICAgICBzYW1lRGF5OiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgICAgIG5leHREYXk6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgbmV4dFdlZWs6ICdkZGRkIFthdF0gTFQnLFxuICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgICAgICBsYXN0V2VlazogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICBzYW1lRWxzZTogJ0wnLFxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhcihrZXksIG1vbSwgbm93KSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLl9jYWxlbmRhcltrZXldIHx8IHRoaXMuX2NhbGVuZGFyWydzYW1lRWxzZSddO1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihvdXRwdXQpID8gb3V0cHV0LmNhbGwobW9tLCBub3cpIDogb3V0cHV0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHplcm9GaWxsKG51bWJlciwgdGFyZ2V0TGVuZ3RoLCBmb3JjZVNpZ24pIHtcbiAgICAgICAgdmFyIGFic051bWJlciA9ICcnICsgTWF0aC5hYnMobnVtYmVyKSxcbiAgICAgICAgICAgIHplcm9zVG9GaWxsID0gdGFyZ2V0TGVuZ3RoIC0gYWJzTnVtYmVyLmxlbmd0aCxcbiAgICAgICAgICAgIHNpZ24gPSBudW1iZXIgPj0gMDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChzaWduID8gKGZvcmNlU2lnbiA/ICcrJyA6ICcnKSA6ICctJykgK1xuICAgICAgICAgICAgTWF0aC5wb3coMTAsIE1hdGgubWF4KDAsIHplcm9zVG9GaWxsKSkudG9TdHJpbmcoKS5zdWJzdHIoMSkgK1xuICAgICAgICAgICAgYWJzTnVtYmVyXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHRpbmdUb2tlbnMgPVxuICAgICAgICAgICAgLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KFtIaF1tbShzcyk/fE1vfE1NP00/TT98RG98REREb3xERD9EP0Q/fGRkZD9kP3xkbz98d1tvfHddP3xXW298V10/fFFvP3xOezEsNX18WVlZWVlZfFlZWVlZfFlZWVl8WVl8eXsyLDR9fHlvP3xnZyhnZ2c/KT98R0coR0dHPyk/fGV8RXxhfEF8aGg/fEhIP3xraz98bW0/fHNzP3xTezEsOX18eHxYfHp6P3xaWj98LikvZyxcbiAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KExUU3xMVHxMTD9MP0w/fGx7MSw0fSkvZyxcbiAgICAgICAgZm9ybWF0RnVuY3Rpb25zID0ge30sXG4gICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zID0ge307XG5cbiAgICAvLyB0b2tlbjogICAgJ00nXG4gICAgLy8gcGFkZGVkOiAgIFsnTU0nLCAyXVxuICAgIC8vIG9yZGluYWw6ICAnTW8nXG4gICAgLy8gY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHsgdGhpcy5tb250aCgpICsgMSB9XG4gICAgZnVuY3Rpb24gYWRkRm9ybWF0VG9rZW4odG9rZW4sIHBhZGRlZCwgb3JkaW5hbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGJhY2tdKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGVkKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1twYWRkZWRbMF1dID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvRmlsbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHBhZGRlZFsxXSwgcGFkZGVkWzJdKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yZGluYWwpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW29yZGluYWxdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5vcmRpbmFsKFxuICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgICAgICAgICAgIHRva2VuXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmVGb3JtYXR0aW5nVG9rZW5zKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5tYXRjaCgvXFxbW1xcc1xcU10vKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL15cXFt8XFxdJC9nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gZm9ybWF0Lm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSAnJyxcbiAgICAgICAgICAgICAgICBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGlzRnVuY3Rpb24oYXJyYXlbaV0pXG4gICAgICAgICAgICAgICAgICAgID8gYXJyYXlbaV0uY2FsbChtb20sIGZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgOiBhcnJheVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IGRhdGUgdXNpbmcgbmF0aXZlIGRhdGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gZm9ybWF0TW9tZW50KG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbS5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGV4cGFuZEZvcm1hdChmb3JtYXQsIG0ubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gPVxuICAgICAgICAgICAgZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gfHwgbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdKG0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGFuZEZvcm1hdChmb3JtYXQsIGxvY2FsZSkge1xuICAgICAgICB2YXIgaSA9IDU7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLmxvbmdEYXRlRm9ybWF0KGlucHV0KSB8fCBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2VucyxcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb25nRGF0ZUZvcm1hdCA9IHtcbiAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICBMOiAnTU0vREQvWVlZWScsXG4gICAgICAgIExMOiAnTU1NTSBELCBZWVlZJyxcbiAgICAgICAgTExMOiAnTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9uZ0RhdGVGb3JtYXQoa2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldLFxuICAgICAgICAgICAgZm9ybWF0VXBwZXIgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXkudG9VcHBlckNhc2UoKV07XG5cbiAgICAgICAgaWYgKGZvcm1hdCB8fCAhZm9ybWF0VXBwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldID0gZm9ybWF0VXBwZXJcbiAgICAgICAgICAgIC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAodG9rKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdNTU1NJyB8fFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdNTScgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnREQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ2RkZGQnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2suc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0b2s7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0SW52YWxpZERhdGUgPSAnSW52YWxpZCBkYXRlJztcblxuICAgIGZ1bmN0aW9uIGludmFsaWREYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52YWxpZERhdGU7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRPcmRpbmFsID0gJyVkJyxcbiAgICAgICAgZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UgPSAvXFxkezEsMn0vO1xuXG4gICAgZnVuY3Rpb24gb3JkaW5hbChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29yZGluYWwucmVwbGFjZSgnJWQnLCBudW1iZXIpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0UmVsYXRpdmVUaW1lID0ge1xuICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgIHc6ICdhIHdlZWsnLFxuICAgICAgICB3dzogJyVkIHdlZWtzJyxcbiAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG91dHB1dClcbiAgICAgICAgICAgID8gb3V0cHV0KG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSlcbiAgICAgICAgICAgIDogb3V0cHV0LnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFzdEZ1dHVyZShkaWZmLCBvdXRwdXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFsaWFzZXMgPSB7XG4gICAgICAgIEQ6ICdkYXRlJyxcbiAgICAgICAgZGF0ZXM6ICdkYXRlJyxcbiAgICAgICAgZGF0ZTogJ2RhdGUnLFxuICAgICAgICBkOiAnZGF5JyxcbiAgICAgICAgZGF5czogJ2RheScsXG4gICAgICAgIGRheTogJ2RheScsXG4gICAgICAgIGU6ICd3ZWVrZGF5JyxcbiAgICAgICAgd2Vla2RheXM6ICd3ZWVrZGF5JyxcbiAgICAgICAgd2Vla2RheTogJ3dlZWtkYXknLFxuICAgICAgICBFOiAnaXNvV2Vla2RheScsXG4gICAgICAgIGlzb3dlZWtkYXlzOiAnaXNvV2Vla2RheScsXG4gICAgICAgIGlzb3dlZWtkYXk6ICdpc29XZWVrZGF5JyxcbiAgICAgICAgREREOiAnZGF5T2ZZZWFyJyxcbiAgICAgICAgZGF5b2Z5ZWFyczogJ2RheU9mWWVhcicsXG4gICAgICAgIGRheW9meWVhcjogJ2RheU9mWWVhcicsXG4gICAgICAgIGg6ICdob3VyJyxcbiAgICAgICAgaG91cnM6ICdob3VyJyxcbiAgICAgICAgaG91cjogJ2hvdXInLFxuICAgICAgICBtczogJ21pbGxpc2Vjb25kJyxcbiAgICAgICAgbWlsbGlzZWNvbmRzOiAnbWlsbGlzZWNvbmQnLFxuICAgICAgICBtaWxsaXNlY29uZDogJ21pbGxpc2Vjb25kJyxcbiAgICAgICAgbTogJ21pbnV0ZScsXG4gICAgICAgIG1pbnV0ZXM6ICdtaW51dGUnLFxuICAgICAgICBtaW51dGU6ICdtaW51dGUnLFxuICAgICAgICBNOiAnbW9udGgnLFxuICAgICAgICBtb250aHM6ICdtb250aCcsXG4gICAgICAgIG1vbnRoOiAnbW9udGgnLFxuICAgICAgICBROiAncXVhcnRlcicsXG4gICAgICAgIHF1YXJ0ZXJzOiAncXVhcnRlcicsXG4gICAgICAgIHF1YXJ0ZXI6ICdxdWFydGVyJyxcbiAgICAgICAgczogJ3NlY29uZCcsXG4gICAgICAgIHNlY29uZHM6ICdzZWNvbmQnLFxuICAgICAgICBzZWNvbmQ6ICdzZWNvbmQnLFxuICAgICAgICBnZzogJ3dlZWtZZWFyJyxcbiAgICAgICAgd2Vla3llYXJzOiAnd2Vla1llYXInLFxuICAgICAgICB3ZWVreWVhcjogJ3dlZWtZZWFyJyxcbiAgICAgICAgR0c6ICdpc29XZWVrWWVhcicsXG4gICAgICAgIGlzb3dlZWt5ZWFyczogJ2lzb1dlZWtZZWFyJyxcbiAgICAgICAgaXNvd2Vla3llYXI6ICdpc29XZWVrWWVhcicsXG4gICAgICAgIHc6ICd3ZWVrJyxcbiAgICAgICAgd2Vla3M6ICd3ZWVrJyxcbiAgICAgICAgd2VlazogJ3dlZWsnLFxuICAgICAgICBXOiAnaXNvV2VlaycsXG4gICAgICAgIGlzb3dlZWtzOiAnaXNvV2VlaycsXG4gICAgICAgIGlzb3dlZWs6ICdpc29XZWVrJyxcbiAgICAgICAgeTogJ3llYXInLFxuICAgICAgICB5ZWFyczogJ3llYXInLFxuICAgICAgICB5ZWFyOiAneWVhcicsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdW5pdHMgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGFsaWFzZXNbdW5pdHNdIHx8IGFsaWFzZXNbdW5pdHMudG9Mb3dlckNhc2UoKV1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdFVuaXRzKGlucHV0T2JqZWN0KSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSB7fSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wLFxuICAgICAgICAgICAgcHJvcDtcblxuICAgICAgICBmb3IgKHByb3AgaW4gaW5wdXRPYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGlucHV0T2JqZWN0LCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wID0gbm9ybWFsaXplVW5pdHMocHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dFtub3JtYWxpemVkUHJvcF0gPSBpbnB1dE9iamVjdFtwcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZElucHV0O1xuICAgIH1cblxuICAgIHZhciBwcmlvcml0aWVzID0ge1xuICAgICAgICBkYXRlOiA5LFxuICAgICAgICBkYXk6IDExLFxuICAgICAgICB3ZWVrZGF5OiAxMSxcbiAgICAgICAgaXNvV2Vla2RheTogMTEsXG4gICAgICAgIGRheU9mWWVhcjogNCxcbiAgICAgICAgaG91cjogMTMsXG4gICAgICAgIG1pbGxpc2Vjb25kOiAxNixcbiAgICAgICAgbWludXRlOiAxNCxcbiAgICAgICAgbW9udGg6IDgsXG4gICAgICAgIHF1YXJ0ZXI6IDcsXG4gICAgICAgIHNlY29uZDogMTUsXG4gICAgICAgIHdlZWtZZWFyOiAxLFxuICAgICAgICBpc29XZWVrWWVhcjogMSxcbiAgICAgICAgd2VlazogNSxcbiAgICAgICAgaXNvV2VlazogNSxcbiAgICAgICAgeWVhcjogMSxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2V0UHJpb3JpdGl6ZWRVbml0cyh1bml0c09iaikge1xuICAgICAgICB2YXIgdW5pdHMgPSBbXSxcbiAgICAgICAgICAgIHU7XG4gICAgICAgIGZvciAodSBpbiB1bml0c09iaikge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AodW5pdHNPYmosIHUpKSB7XG4gICAgICAgICAgICAgICAgdW5pdHMucHVzaCh7IHVuaXQ6IHUsIHByaW9yaXR5OiBwcmlvcml0aWVzW3VdIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVuaXRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB1bml0cztcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2gxID0gL1xcZC8sIC8vICAgICAgIDAgLSA5XG4gICAgICAgIG1hdGNoMiA9IC9cXGRcXGQvLCAvLyAgICAgIDAwIC0gOTlcbiAgICAgICAgbWF0Y2gzID0gL1xcZHszfS8sIC8vICAgICAwMDAgLSA5OTlcbiAgICAgICAgbWF0Y2g0ID0gL1xcZHs0fS8sIC8vICAgIDAwMDAgLSA5OTk5XG4gICAgICAgIG1hdGNoNiA9IC9bKy1dP1xcZHs2fS8sIC8vIC05OTk5OTkgLSA5OTk5OTlcbiAgICAgICAgbWF0Y2gxdG8yID0gL1xcZFxcZD8vLCAvLyAgICAgICAwIC0gOTlcbiAgICAgICAgbWF0Y2gzdG80ID0gL1xcZFxcZFxcZFxcZD8vLCAvLyAgICAgOTk5IC0gOTk5OVxuICAgICAgICBtYXRjaDV0bzYgPSAvXFxkXFxkXFxkXFxkXFxkXFxkPy8sIC8vICAgOTk5OTkgLSA5OTk5OTlcbiAgICAgICAgbWF0Y2gxdG8zID0gL1xcZHsxLDN9LywgLy8gICAgICAgMCAtIDk5OVxuICAgICAgICBtYXRjaDF0bzQgPSAvXFxkezEsNH0vLCAvLyAgICAgICAwIC0gOTk5OVxuICAgICAgICBtYXRjaDF0bzYgPSAvWystXT9cXGR7MSw2fS8sIC8vIC05OTk5OTkgLSA5OTk5OTlcbiAgICAgICAgbWF0Y2hVbnNpZ25lZCA9IC9cXGQrLywgLy8gICAgICAgMCAtIGluZlxuICAgICAgICBtYXRjaFNpZ25lZCA9IC9bKy1dP1xcZCsvLCAvLyAgICAtaW5mIC0gaW5mXG4gICAgICAgIG1hdGNoT2Zmc2V0ID0gL1p8WystXVxcZFxcZDo/XFxkXFxkL2dpLCAvLyArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcbiAgICAgICAgbWF0Y2hTaG9ydE9mZnNldCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/L2dpLCAvLyArMDAgLTAwICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuICAgICAgICBtYXRjaFRpbWVzdGFtcCA9IC9bKy1dP1xcZCsoXFwuXFxkezEsM30pPy8sIC8vIDEyMzQ1Njc4OSAxMjM0NTY3ODkuMTIzXG4gICAgICAgIC8vIGFueSB3b3JkIChvciB0d28pIGNoYXJhY3RlcnMgb3IgbnVtYmVycyBpbmNsdWRpbmcgdHdvL3RocmVlIHdvcmQgbW9udGggaW4gYXJhYmljLlxuICAgICAgICAvLyBpbmNsdWRlcyBzY290dGlzaCBnYWVsaWMgdHdvIHdvcmQgYW5kIGh5cGhlbmF0ZWQgbW9udGhzXG4gICAgICAgIG1hdGNoV29yZCA9XG4gICAgICAgICAgICAvWzAtOV17MCwyNTZ9WydhLXpcXHUwMEEwLVxcdTA1RkZcXHUwNzAwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGMDdcXHVGRjEwLVxcdUZGRUZdezEsMjU2fXxbXFx1MDYwMC1cXHUwNkZGXFwvXXsxLDI1Nn0oXFxzKj9bXFx1MDYwMC1cXHUwNkZGXXsxLDI1Nn0pezEsMn0vaSxcbiAgICAgICAgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyA9IC9eWzEtOV1cXGQ/LywgLy8gICAgICAgICAxLTk5XG4gICAgICAgIG1hdGNoMXRvMkhhc1plcm8gPSAvXihbMS05XVxcZHxcXGQpLywgLy8gICAgICAgICAgIDAtOTlcbiAgICAgICAgcmVnZXhlcztcblxuICAgIHJlZ2V4ZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFJlZ2V4VG9rZW4odG9rZW4sIHJlZ2V4LCBzdHJpY3RSZWdleCkge1xuICAgICAgICByZWdleGVzW3Rva2VuXSA9IGlzRnVuY3Rpb24ocmVnZXgpXG4gICAgICAgICAgICA/IHJlZ2V4XG4gICAgICAgICAgICA6IGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlRGF0YSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzU3RyaWN0ICYmIHN0cmljdFJlZ2V4ID8gc3RyaWN0UmVnZXggOiByZWdleDtcbiAgICAgICAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykge1xuICAgICAgICBpZiAoIWhhc093blByb3AocmVnZXhlcywgdG9rZW4pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh1bmVzY2FwZUZvcm1hdCh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlZ2V4ZXNbdG9rZW5dKGNvbmZpZy5fc3RyaWN0LCBjb25maWcuX2xvY2FsZSk7XG4gICAgfVxuXG4gICAgLy8gQ29kZSBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU2MTQ5My9pcy10aGVyZS1hLXJlZ2V4cC1lc2NhcGUtZnVuY3Rpb24taW4tamF2YXNjcmlwdFxuICAgIGZ1bmN0aW9uIHVuZXNjYXBlRm9ybWF0KHMpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2V4RXNjYXBlKFxuICAgICAgICAgICAgc1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdcXFxcJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIC9cXFxcKFxcWyl8XFxcXChcXF0pfFxcWyhbXlxcXVxcW10qKVxcXXxcXFxcKC4pL2csXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChtYXRjaGVkLCBwMSwgcDIsIHAzLCBwNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAxIHx8IHAyIHx8IHAzIHx8IHA0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlZ2V4RXNjYXBlKHMpIHtcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzRmxvb3IobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICAvLyAtMCAtPiAwXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcikgfHwgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0ludChhcmd1bWVudEZvckNvZXJjaW9uKSB7XG4gICAgICAgIHZhciBjb2VyY2VkTnVtYmVyID0gK2FyZ3VtZW50Rm9yQ29lcmNpb24sXG4gICAgICAgICAgICB2YWx1ZSA9IDA7XG5cbiAgICAgICAgaWYgKGNvZXJjZWROdW1iZXIgIT09IDAgJiYgaXNGaW5pdGUoY29lcmNlZE51bWJlcikpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYWJzRmxvb3IoY29lcmNlZE51bWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIHRva2VucyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkUGFyc2VUb2tlbih0b2tlbiwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBmdW5jID0gY2FsbGJhY2ssXG4gICAgICAgICAgICB0b2tlbkxlbjtcbiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRva2VuID0gW3Rva2VuXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOdW1iZXIoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICBmdW5jID0gZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2NhbGxiYWNrXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5MZW4gPSB0b2tlbi5sZW5ndGg7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbkxlbjsgaSsrKSB7XG4gICAgICAgICAgICB0b2tlbnNbdG9rZW5baV1dID0gZnVuYztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtQYXJzZVRva2VuKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgICAgICBjYWxsYmFjayhpbnB1dCwgY29uZmlnLl93LCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIGlucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaGFzT3duUHJvcCh0b2tlbnMsIHRva2VuKSkge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuXShpbnB1dCwgY29uZmlnLl9hLCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApIHx8IHllYXIgJSA0MDAgPT09IDA7XG4gICAgfVxuXG4gICAgdmFyIFlFQVIgPSAwLFxuICAgICAgICBNT05USCA9IDEsXG4gICAgICAgIERBVEUgPSAyLFxuICAgICAgICBIT1VSID0gMyxcbiAgICAgICAgTUlOVVRFID0gNCxcbiAgICAgICAgU0VDT05EID0gNSxcbiAgICAgICAgTUlMTElTRUNPTkQgPSA2LFxuICAgICAgICBXRUVLID0gNyxcbiAgICAgICAgV0VFS0RBWSA9IDg7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignWScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHkgPSB0aGlzLnllYXIoKTtcbiAgICAgICAgcmV0dXJuIHkgPD0gOTk5OSA/IHplcm9GaWxsKHksIDQpIDogJysnICsgeTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVknLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy55ZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVknLCA0XSwgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZJywgNV0sIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWVknLCA2LCB0cnVlXSwgMCwgJ3llYXInKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1knLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVknLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWScsIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZWVknLCBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnWVlZWVknLCAnWVlZWVlZJ10sIFlFQVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1lZWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID1cbiAgICAgICAgICAgIGlucHV0Lmxlbmd0aCA9PT0gMiA/IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KSA6IHRvSW50KGlucHV0KTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBwYXJzZUludChpbnB1dCwgMTApO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgZnVuY3Rpb24gZGF5c0luWWVhcih5ZWFyKSB7XG4gICAgICAgIHJldHVybiBpc0xlYXBZZWFyKHllYXIpID8gMzY2IDogMzY1O1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICBob29rcy5wYXJzZVR3b0RpZ2l0WWVhciA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gdG9JbnQoaW5wdXQpICsgKHRvSW50KGlucHV0KSA+IDY4ID8gMTkwMCA6IDIwMDApO1xuICAgIH07XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0WWVhciA9IG1ha2VHZXRTZXQoJ0Z1bGxZZWFyJywgdHJ1ZSk7XG5cbiAgICBmdW5jdGlvbiBnZXRJc0xlYXBZZWFyKCkge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih0aGlzLnllYXIoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldFNldCh1bml0LCBrZWVwVGltZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHNldCQxKHRoaXMsIHVuaXQsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywga2VlcFRpbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KHRoaXMsIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldChtb20sIHVuaXQpIHtcbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGQgPSBtb20uX2QsXG4gICAgICAgICAgICBpc1VUQyA9IG1vbS5faXNVVEM7XG5cbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdNaWxsaXNlY29uZHMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCkgOiBkLmdldE1pbGxpc2Vjb25kcygpO1xuICAgICAgICAgICAgY2FzZSAnU2Vjb25kcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENTZWNvbmRzKCkgOiBkLmdldFNlY29uZHMoKTtcbiAgICAgICAgICAgIGNhc2UgJ01pbnV0ZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDTWludXRlcygpIDogZC5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICBjYXNlICdIb3Vycyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENIb3VycygpIDogZC5nZXRIb3VycygpO1xuICAgICAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENEYXRlKCkgOiBkLmdldERhdGUoKTtcbiAgICAgICAgICAgIGNhc2UgJ0RheSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENEYXkoKSA6IGQuZ2V0RGF5KCk7XG4gICAgICAgICAgICBjYXNlICdNb250aCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVVRDID8gZC5nZXRVVENNb250aCgpIDogZC5nZXRNb250aCgpO1xuICAgICAgICAgICAgY2FzZSAnRnVsbFllYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc1VUQyA/IGQuZ2V0VVRDRnVsbFllYXIoKSA6IGQuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsgLy8gSnVzdCBpbiBjYXNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXQkMShtb20sIHVuaXQsIHZhbHVlKSB7XG4gICAgICAgIHZhciBkLCBpc1VUQywgeWVhciwgbW9udGgsIGRhdGU7XG5cbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpIHx8IGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZCA9IG1vbS5fZDtcbiAgICAgICAgaXNVVEMgPSBtb20uX2lzVVRDO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgICAgICAgY2FzZSAnTWlsbGlzZWNvbmRzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoaXNVVENcbiAgICAgICAgICAgICAgICAgICAgPyBkLnNldFVUQ01pbGxpc2Vjb25kcyh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiBkLnNldE1pbGxpc2Vjb25kcyh2YWx1ZSkpO1xuICAgICAgICAgICAgY2FzZSAnU2Vjb25kcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKGlzVVRDID8gZC5zZXRVVENTZWNvbmRzKHZhbHVlKSA6IGQuc2V0U2Vjb25kcyh2YWx1ZSkpO1xuICAgICAgICAgICAgY2FzZSAnTWludXRlcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKGlzVVRDID8gZC5zZXRVVENNaW51dGVzKHZhbHVlKSA6IGQuc2V0TWludXRlcyh2YWx1ZSkpO1xuICAgICAgICAgICAgY2FzZSAnSG91cnMnOlxuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChpc1VUQyA/IGQuc2V0VVRDSG91cnModmFsdWUpIDogZC5zZXRIb3Vycyh2YWx1ZSkpO1xuICAgICAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKGlzVVRDID8gZC5zZXRVVENEYXRlKHZhbHVlKSA6IGQuc2V0RGF0ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgLy8gY2FzZSAnRGF5JzogLy8gTm90IHJlYWxcbiAgICAgICAgICAgIC8vICAgIHJldHVybiB2b2lkIChpc1VUQyA/IGQuc2V0VVRDRGF5KHZhbHVlKSA6IGQuc2V0RGF5KHZhbHVlKSk7XG4gICAgICAgICAgICAvLyBjYXNlICdNb250aCc6IC8vIE5vdCB1c2VkIGJlY2F1c2Ugd2UgbmVlZCB0byBwYXNzIHR3byB2YXJpYWJsZXNcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gdm9pZCAoaXNVVEMgPyBkLnNldFVUQ01vbnRoKHZhbHVlKSA6IGQuc2V0TW9udGgodmFsdWUpKTtcbiAgICAgICAgICAgIGNhc2UgJ0Z1bGxZZWFyJzpcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gU2VlIGJlbG93IC4uLlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIEp1c3QgaW4gY2FzZVxuICAgICAgICB9XG5cbiAgICAgICAgeWVhciA9IHZhbHVlO1xuICAgICAgICBtb250aCA9IG1vbS5tb250aCgpO1xuICAgICAgICBkYXRlID0gbW9tLmRhdGUoKTtcbiAgICAgICAgZGF0ZSA9IGRhdGUgPT09IDI5ICYmIG1vbnRoID09PSAxICYmICFpc0xlYXBZZWFyKHllYXIpID8gMjggOiBkYXRlO1xuICAgICAgICB2b2lkIChpc1VUQ1xuICAgICAgICAgICAgPyBkLnNldFVUQ0Z1bGxZZWFyKHllYXIsIG1vbnRoLCBkYXRlKVxuICAgICAgICAgICAgOiBkLnNldEZ1bGxZZWFyKHllYXIsIG1vbnRoLCBkYXRlKSk7XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gc3RyaW5nR2V0KHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW3VuaXRzXSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0cmluZ1NldCh1bml0cywgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB1bml0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplT2JqZWN0VW5pdHModW5pdHMpO1xuICAgICAgICAgICAgdmFyIHByaW9yaXRpemVkID0gZ2V0UHJpb3JpdGl6ZWRVbml0cyh1bml0cyksXG4gICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICBwcmlvcml0aXplZExlbiA9IHByaW9yaXRpemVkLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmlvcml0aXplZExlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpc1twcmlvcml0aXplZFtpXS51bml0XSh1bml0c1twcmlvcml0aXplZFtpXS51bml0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3VuaXRzXSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9kKG4sIHgpIHtcbiAgICAgICAgcmV0dXJuICgobiAlIHgpICsgeCkgJSB4O1xuICAgIH1cblxuICAgIHZhciBpbmRleE9mO1xuXG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XG4gICAgICAgIGluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpbmRleE9mID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIC8vIEkga25vd1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW2ldID09PSBvKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgICBpZiAoaXNOYU4oeWVhcikgfHwgaXNOYU4obW9udGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtb2RNb250aCA9IG1vZChtb250aCwgMTIpO1xuICAgICAgICB5ZWFyICs9IChtb250aCAtIG1vZE1vbnRoKSAvIDEyO1xuICAgICAgICByZXR1cm4gbW9kTW9udGggPT09IDFcbiAgICAgICAgICAgID8gaXNMZWFwWWVhcih5ZWFyKVxuICAgICAgICAgICAgICAgID8gMjlcbiAgICAgICAgICAgICAgICA6IDI4XG4gICAgICAgICAgICA6IDMxIC0gKChtb2RNb250aCAlIDcpICUgMik7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ00nLCBbJ01NJywgMl0sICdNbycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9udGgoKSArIDE7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTU1NJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubW9udGhzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU1NJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubW9udGhzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdNJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJOb0xlYWRpbmdaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdNTScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdNTU0nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NTU0nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydNJywgJ01NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTU9OVEhdID0gdG9JbnQoaW5wdXQpIC0gMTtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydNTU0nLCAnTU1NTSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciBtb250aCA9IGNvbmZpZy5fbG9jYWxlLm1vbnRoc1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhIG1vbnRoIG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZC5cbiAgICAgICAgaWYgKG1vbnRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFycmF5W01PTlRIXSA9IG1vbnRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZE1vbnRoID0gaW5wdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIHZhciBkZWZhdWx0TG9jYWxlTW9udGhzID1cbiAgICAgICAgICAgICdKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyJy5zcGxpdChcbiAgICAgICAgICAgICAgICAnXydcbiAgICAgICAgICAgICksXG4gICAgICAgIGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCA9XG4gICAgICAgICAgICAnSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWMnLnNwbGl0KCdfJyksXG4gICAgICAgIE1PTlRIU19JTl9GT1JNQVQgPSAvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NPy8sXG4gICAgICAgIGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4ID0gbWF0Y2hXb3JkLFxuICAgICAgICBkZWZhdWx0TW9udGhzUmVnZXggPSBtYXRjaFdvcmQ7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHMobSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzKVxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzXG4gICAgICAgICAgICAgICAgOiB0aGlzLl9tb250aHNbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHMpXG4gICAgICAgICAgICA/IHRoaXMuX21vbnRoc1ttLm1vbnRoKCldXG4gICAgICAgICAgICA6IHRoaXMuX21vbnRoc1tcbiAgICAgICAgICAgICAgICAgICh0aGlzLl9tb250aHMuaXNGb3JtYXQgfHwgTU9OVEhTX0lOX0ZPUk1BVCkudGVzdChmb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgICAgPyAnZm9ybWF0J1xuICAgICAgICAgICAgICAgICAgICAgIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF1bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNTaG9ydChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydClcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21vbnRoc1Nob3J0XG4gICAgICAgICAgICAgICAgOiB0aGlzLl9tb250aHNTaG9ydFsnc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRoc1Nob3J0KVxuICAgICAgICAgICAgPyB0aGlzLl9tb250aHNTaG9ydFttLm1vbnRoKCldXG4gICAgICAgICAgICA6IHRoaXMuX21vbnRoc1Nob3J0W1xuICAgICAgICAgICAgICAgICAgTU9OVEhTX0lOX0ZPUk1BVC50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ1xuICAgICAgICAgICAgICBdW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGlpLFxuICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgbGxjID0gbW9udGhOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHVzZWRcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzU2hvcnQoXG4gICAgICAgICAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICApLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldID0gdGhpcy5tb250aHMobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdNTU0nKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdNTU0nKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlTW9udGhzUGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSwgbW9tLCByZWdleDtcblxuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlLmNhbGwodGhpcywgbW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhZGQgc29ydGluZ1xuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyXG4gICAgICAgIC8vIHNlZSBzb3J0aW5nIGluIGNvbXB1dGVNb250aHNQYXJzZVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsXG4gICAgICAgICAgICAgICAgICAgICdpJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc3RyaWN0ICYmICF0aGlzLl9tb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID1cbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykgKyAnfF4nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRlc3QgdGhlIHJlZ2V4XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnTU1NTScgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnTU1NJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCAmJiB0aGlzLl9tb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHNldE1vbnRoKG1vbSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCFtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBObyBvcFxuICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoL15cXGQrJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvSW50KHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBtb20ubG9jYWxlRGF0YSgpLm1vbnRoc1BhcnNlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBBbm90aGVyIHNpbGVudCBmYWlsdXJlP1xuICAgICAgICAgICAgICAgIGlmICghaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb207XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1vbnRoID0gdmFsdWUsXG4gICAgICAgICAgICBkYXRlID0gbW9tLmRhdGUoKTtcblxuICAgICAgICBkYXRlID0gZGF0ZSA8IDI5ID8gZGF0ZSA6IE1hdGgubWluKGRhdGUsIGRheXNJbk1vbnRoKG1vbS55ZWFyKCksIG1vbnRoKSk7XG4gICAgICAgIHZvaWQgKG1vbS5faXNVVENcbiAgICAgICAgICAgID8gbW9tLl9kLnNldFVUQ01vbnRoKG1vbnRoLCBkYXRlKVxuICAgICAgICAgICAgOiBtb20uX2Quc2V0TW9udGgobW9udGgsIGRhdGUpKTtcbiAgICAgICAgcmV0dXJuIG1vbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRNb250aCh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0TW9udGgodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0KHRoaXMsICdNb250aCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF5c0luTW9udGgoKSB7XG4gICAgICAgIHJldHVybiBkYXlzSW5Nb250aCh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNTaG9ydFJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZU1vbnRoc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFJlZ2V4ID0gZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1JlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZU1vbnRoc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNSZWdleCA9IGRlZmF1bHRNb250aHNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZU1vbnRoc1BhcnNlKCkge1xuICAgICAgICBmdW5jdGlvbiBjbXBMZW5SZXYoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2hvcnRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGxvbmdQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgc2hvcnRQLFxuICAgICAgICAgICAgbG9uZ1A7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgc2hvcnRQID0gcmVnZXhFc2NhcGUodGhpcy5tb250aHNTaG9ydChtb20sICcnKSk7XG4gICAgICAgICAgICBsb25nUCA9IHJlZ2V4RXNjYXBlKHRoaXMubW9udGhzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2goc2hvcnRQKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaChsb25nUCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGxvbmdQKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2goc2hvcnRQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuXG4gICAgICAgIHRoaXMuX21vbnRoc1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9tb250aHNTaG9ydFJlZ2V4ID0gdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgICAgIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKSB7XG4gICAgICAgIC8vIGNhbid0IGp1c3QgYXBwbHkoKSB0byBjcmVhdGUgYSBkYXRlOlxuICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3EvMTgxMzQ4XG4gICAgICAgIHZhciBkYXRlO1xuICAgICAgICAvLyB0aGUgZGF0ZSBjb25zdHJ1Y3RvciByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHkgKyA0MDAsIG0sIGQsIGgsIE0sIHMsIG1zKTtcbiAgICAgICAgICAgIGlmIChpc0Zpbml0ZShkYXRlLmdldEZ1bGxZZWFyKCkpKSB7XG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcih5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh5LCBtLCBkLCBoLCBNLCBzLCBtcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVENEYXRlKHkpIHtcbiAgICAgICAgdmFyIGRhdGUsIGFyZ3M7XG4gICAgICAgIC8vIHRoZSBEYXRlLlVUQyBmdW5jdGlvbiByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICBhcmdzWzBdID0geSArIDQwMDtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmdzKSk7XG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAvLyBzdGFydC1vZi1maXJzdC13ZWVrIC0gc3RhcnQtb2YteWVhclxuICAgIGZ1bmN0aW9uIGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgLy8gZmlyc3Qtd2VlayBkYXkgLS0gd2hpY2ggamFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgKDQgZm9yIGlzbywgMSBmb3Igb3RoZXIpXG4gICAgICAgICAgICBmd2QgPSA3ICsgZG93IC0gZG95LFxuICAgICAgICAgICAgLy8gZmlyc3Qtd2VlayBkYXkgbG9jYWwgd2Vla2RheSAtLSB3aGljaCBsb2NhbCB3ZWVrZGF5IGlzIGZ3ZFxuICAgICAgICAgICAgZndkbHcgPSAoNyArIGNyZWF0ZVVUQ0RhdGUoeWVhciwgMCwgZndkKS5nZXRVVENEYXkoKSAtIGRvdykgJSA3O1xuXG4gICAgICAgIHJldHVybiAtZndkbHcgKyBmd2QgLSAxO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGUjQ2FsY3VsYXRpbmdfYV9kYXRlX2dpdmVuX3RoZV95ZWFyLjJDX3dlZWtfbnVtYmVyX2FuZF93ZWVrZGF5XG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtzKHllYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBsb2NhbFdlZWtkYXkgPSAoNyArIHdlZWtkYXkgLSBkb3cpICUgNyxcbiAgICAgICAgICAgIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF5T2ZZZWFyID0gMSArIDcgKiAod2VlayAtIDEpICsgbG9jYWxXZWVrZGF5ICsgd2Vla09mZnNldCxcbiAgICAgICAgICAgIHJlc1llYXIsXG4gICAgICAgICAgICByZXNEYXlPZlllYXI7XG5cbiAgICAgICAgaWYgKGRheU9mWWVhciA8PSAwKSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhciAtIDE7XG4gICAgICAgICAgICByZXNEYXlPZlllYXIgPSBkYXlzSW5ZZWFyKHJlc1llYXIpICsgZGF5T2ZZZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKGRheU9mWWVhciA+IGRheXNJblllYXIoeWVhcikpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyICsgMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheU9mWWVhciAtIGRheXNJblllYXIoeWVhcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNZZWFyID0geWVhcjtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheU9mWWVhcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyOiByZXNZZWFyLFxuICAgICAgICAgICAgZGF5T2ZZZWFyOiByZXNEYXlPZlllYXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla09mWWVhcihtb20sIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KG1vbS55ZWFyKCksIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWsgPSBNYXRoLmZsb29yKChtb20uZGF5T2ZZZWFyKCkgLSB3ZWVrT2Zmc2V0IC0gMSkgLyA3KSArIDEsXG4gICAgICAgICAgICByZXNXZWVrLFxuICAgICAgICAgICAgcmVzWWVhcjtcblxuICAgICAgICBpZiAod2VlayA8IDEpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpIC0gMTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrICsgd2Vla3NJblllYXIocmVzWWVhciwgZG93LCBkb3kpO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWsgPiB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrIC0gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCk7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3ZWVrOiByZXNXZWVrLFxuICAgICAgICAgICAgeWVhcjogcmVzWWVhcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrc0luWWVhcih5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrT2Zmc2V0TmV4dCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyICsgMSwgZG93LCBkb3kpO1xuICAgICAgICByZXR1cm4gKGRheXNJblllYXIoeWVhcikgLSB3ZWVrT2Zmc2V0ICsgd2Vla09mZnNldE5leHQpIC8gNztcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigndycsIFsnd3cnLCAyXSwgJ3dvJywgJ3dlZWsnKTtcbiAgICBhZGRGb3JtYXRUb2tlbignVycsIFsnV1cnLCAyXSwgJ1dvJywgJ2lzb1dlZWsnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3cnLCBtYXRjaDF0bzIsIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3d3JywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1cnLCBtYXRjaDF0bzIsIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1dXJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oXG4gICAgICAgIFsndycsICd3dycsICdXJywgJ1dXJ10sXG4gICAgICAgIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICAgICAgd2Vla1t0b2tlbi5zdWJzdHIoMCwgMSldID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWsobW9tKSB7XG4gICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKG1vbSwgdGhpcy5fd2Vlay5kb3csIHRoaXMuX3dlZWsuZG95KS53ZWVrO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2VlayA9IHtcbiAgICAgICAgZG93OiAwLCAvLyBTdW5kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgICAgZG95OiA2LCAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZXZWVrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3c7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZlllYXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRveTtcbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRXZWVrKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gdGhpcy5sb2NhbGVEYXRhKCkud2Vlayh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWsoaW5wdXQpIHtcbiAgICAgICAgdmFyIHdlZWsgPSB3ZWVrT2ZZZWFyKHRoaXMsIDEsIDQpLndlZWs7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKChpbnB1dCAtIHdlZWspICogNywgJ2QnKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignZCcsIDAsICdkbycsICdkYXknKTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzTWluKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5cyh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2UnLCAwLCAwLCAnd2Vla2RheScpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdFJywgMCwgMCwgJ2lzb1dlZWtkYXknKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2QnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2UnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0UnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c01pblJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdkZGQnLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkZCcsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2RkJywgJ2RkZCcsICdkZGRkJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgd2Vla2RheSA9IGNvbmZpZy5fbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBnZXQgYSB3ZWVrZGF5IG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZFxuICAgICAgICBpZiAod2Vla2RheSAhPSBudWxsKSB7XG4gICAgICAgICAgICB3ZWVrLmQgPSB3ZWVrZGF5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZFdlZWtkYXkgPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydkJywgJ2UnLCAnRSddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICBmdW5jdGlvbiBwYXJzZVdlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05hTihpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbnB1dCwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQgPSBsb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCk7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KSAlIDcgfHwgNztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNOYU4oaW5wdXQpID8gbnVsbCA6IGlucHV0O1xuICAgIH1cblxuICAgIC8vIExPQ0FMRVNcbiAgICBmdW5jdGlvbiBzaGlmdFdlZWtkYXlzKHdzLCBuKSB7XG4gICAgICAgIHJldHVybiB3cy5zbGljZShuLCA3KS5jb25jYXQod3Muc2xpY2UoMCwgbikpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXMgPVxuICAgICAgICAgICAgJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdCgnXycpLFxuICAgICAgICBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCA9ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyksXG4gICAgICAgIGRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbiA9ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKSxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzUmVnZXggPSBtYXRjaFdvcmQsXG4gICAgICAgIGRlZmF1bHRXZWVrZGF5c1Nob3J0UmVnZXggPSBtYXRjaFdvcmQsXG4gICAgICAgIGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4ID0gbWF0Y2hXb3JkO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXMobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciB3ZWVrZGF5cyA9IGlzQXJyYXkodGhpcy5fd2Vla2RheXMpXG4gICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzXG4gICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzW1xuICAgICAgICAgICAgICAgICAgbSAmJiBtICE9PSB0cnVlICYmIHRoaXMuX3dlZWtkYXlzLmlzRm9ybWF0LnRlc3QoZm9ybWF0KVxuICAgICAgICAgICAgICAgICAgICAgID8gJ2Zvcm1hdCdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdzdGFuZGFsb25lJ1xuICAgICAgICAgICAgICBdO1xuICAgICAgICByZXR1cm4gbSA9PT0gdHJ1ZVxuICAgICAgICAgICAgPyBzaGlmdFdlZWtkYXlzKHdlZWtkYXlzLCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogbVxuICAgICAgICAgICAgICA/IHdlZWtkYXlzW20uZGF5KCldXG4gICAgICAgICAgICAgIDogd2Vla2RheXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNTaG9ydChtKSB7XG4gICAgICAgIHJldHVybiBtID09PSB0cnVlXG4gICAgICAgICAgICA/IHNoaWZ0V2Vla2RheXModGhpcy5fd2Vla2RheXNTaG9ydCwgdGhpcy5fd2Vlay5kb3cpXG4gICAgICAgICAgICA6IG1cbiAgICAgICAgICAgICAgPyB0aGlzLl93ZWVrZGF5c1Nob3J0W20uZGF5KCldXG4gICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNTaG9ydDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c01pbihtKSB7XG4gICAgICAgIHJldHVybiBtID09PSB0cnVlXG4gICAgICAgICAgICA/IHNoaWZ0V2Vla2RheXModGhpcy5fd2Vla2RheXNNaW4sIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNNaW5bbS5kYXkoKV1cbiAgICAgICAgICAgICAgOiB0aGlzLl93ZWVrZGF5c01pbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZSQxKHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGlpLFxuICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgbGxjID0gd2Vla2RheU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2UgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7ICsraSkge1xuICAgICAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5c01pbihcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzU2hvcnQoXG4gICAgICAgICAgICAgICAgICAgIG1vbSxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICApLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXMobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnZGRkZCcpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzUGFyc2Uod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVTdHJpY3RQYXJzZSQxLmNhbGwodGhpcywgd2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG5cbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLndlZWtkYXlzKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFxcXC4/JykgKyAnJCcsXG4gICAgICAgICAgICAgICAgICAgICdpJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy53ZWVrZGF5c1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFxcXC4/JykgKyAnJCcsXG4gICAgICAgICAgICAgICAgICAgICdpJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID1cbiAgICAgICAgICAgICAgICAgICAgJ14nICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWVrZGF5cyhtb20sICcnKSArXG4gICAgICAgICAgICAgICAgICAgICd8XicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykgK1xuICAgICAgICAgICAgICAgICAgICAnfF4nICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdkZGRkJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnZGRkJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ2RkJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mV2VlayhpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGF5ID0gZ2V0KHRoaXMsICdEYXknKTtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlucHV0ID0gcGFyc2VXZWVrZGF5KGlucHV0LCB0aGlzLmxvY2FsZURhdGEoKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoaW5wdXQgLSBkYXksICdkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2Vla2RheSA9ICh0aGlzLmRheSgpICsgNyAtIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdykgJSA3O1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWtkYXkgOiB0aGlzLmFkZChpbnB1dCAtIHdlZWtkYXksICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPRGF5T2ZXZWVrKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGJlaGF2ZXMgdGhlIHNhbWUgYXMgbW9tZW50I2RheSBleGNlcHRcbiAgICAgICAgLy8gYXMgYSBnZXR0ZXIsIHJldHVybnMgNyBpbnN0ZWFkIG9mIDAgKDEtNyByYW5nZSBpbnN0ZWFkIG9mIDAtNilcbiAgICAgICAgLy8gYXMgYSBzZXR0ZXIsIHN1bmRheSBzaG91bGQgYmVsb25nIHRvIHRoZSBwcmV2aW91cyB3ZWVrLlxuXG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgd2Vla2RheSA9IHBhcnNlSXNvV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KHRoaXMuZGF5KCkgJSA3ID8gd2Vla2RheSA6IHdlZWtkYXkgLSA3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpIHx8IDc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla2RheXNNaW5SZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNNaW5SZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlV2Vla2RheXNQYXJzZSgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1pblBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgc2hvcnRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGxvbmdQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgbWlucCxcbiAgICAgICAgICAgIHNob3J0cCxcbiAgICAgICAgICAgIGxvbmdwO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIG1pbnAgPSByZWdleEVzY2FwZSh0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpKTtcbiAgICAgICAgICAgIHNob3J0cCA9IHJlZ2V4RXNjYXBlKHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSk7XG4gICAgICAgICAgICBsb25ncCA9IHJlZ2V4RXNjYXBlKHRoaXMud2Vla2RheXMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWluUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHNob3J0cCk7XG4gICAgICAgICAgICBsb25nUGllY2VzLnB1c2gobG9uZ3ApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobG9uZ3ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgd2Vla2RheSAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlciBpdFxuICAgICAgICAvLyB3aWxsIG1hdGNoIHRoZSBsb25nZXIgcGllY2UuXG4gICAgICAgIG1pblBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIHNob3J0UGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbG9uZ1BpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIG1peGVkUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBtaW5QaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgZnVuY3Rpb24gaEZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG91cnMoKSAlIDEyIHx8IDEyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGtGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgfHwgMjQ7XG4gICAgfVxuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0gnLCBbJ0hIJywgMl0sIDAsICdob3VyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ2gnLCBbJ2hoJywgMl0sIDAsIGhGb3JtYXQpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdrJywgWydraycsIDJdLCAwLCBrRm9ybWF0KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdobW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIGhGb3JtYXQuYXBwbHkodGhpcykgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMik7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tc3MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAnJyArXG4gICAgICAgICAgICBoRm9ybWF0LmFwcGx5KHRoaXMpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLnNlY29uZHMoKSwgMilcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICcnICtcbiAgICAgICAgICAgIHRoaXMuaG91cnMoKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMikgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5zZWNvbmRzKCksIDIpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtZXJpZGllbSh0b2tlbiwgbG93ZXJjYXNlKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0oXG4gICAgICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgICAgIGxvd2VyY2FzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyaWRpZW0oJ2EnLCB0cnVlKTtcbiAgICBtZXJpZGllbSgnQScsIGZhbHNlKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGZ1bmN0aW9uIG1hdGNoTWVyaWRpZW0oaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLl9tZXJpZGllbVBhcnNlO1xuICAgIH1cblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2EnLCBtYXRjaE1lcmlkaWVtKTtcbiAgICBhZGRSZWdleFRva2VuKCdBJywgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignSCcsIG1hdGNoMXRvMiwgbWF0Y2gxdG8ySGFzWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignaCcsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignaycsIG1hdGNoMXRvMiwgbWF0Y2gxdG8yTm9MZWFkaW5nWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignSEgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignaGgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbigna2snLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRSZWdleFRva2VuKCdobW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbXNzJywgbWF0Y2g1dG82KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbXNzJywgbWF0Y2g1dG82KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydIJywgJ0hIJ10sIEhPVVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydrJywgJ2trJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIga0lucHV0ID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBhcnJheVtIT1VSXSA9IGtJbnB1dCA9PT0gMjQgPyAwIDoga0lucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydhJywgJ0EnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgICAgICBjb25maWcuX21lcmlkaWVtID0gaW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQsXG4gICAgICAgICAgICBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0LFxuICAgICAgICAgICAgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlSXNQTShpbnB1dCkge1xuICAgICAgICAvLyBJRTggUXVpcmtzIE1vZGUgJiBJRTcgU3RhbmRhcmRzIE1vZGUgZG8gbm90IGFsbG93IGFjY2Vzc2luZyBzdHJpbmdzIGxpa2UgYXJyYXlzXG4gICAgICAgIC8vIFVzaW5nIGNoYXJBdCBzaG91bGQgYmUgbW9yZSBjb21wYXRpYmxlLlxuICAgICAgICByZXR1cm4gKGlucHV0ICsgJycpLnRvTG93ZXJDYXNlKCkuY2hhckF0KDApID09PSAncCc7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2ksXG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGhvdXIgc2hvdWxkIGtlZXAgdGhlIHRpbWUsIGJlY2F1c2UgdGhlIHVzZXIgZXhwbGljaXRseVxuICAgICAgICAvLyBzcGVjaWZpZWQgd2hpY2ggaG91ciB0aGV5IHdhbnQuIFNvIHRyeWluZyB0byBtYWludGFpbiB0aGUgc2FtZSBob3VyIChpblxuICAgICAgICAvLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbiAgICAgICAgLy8gdGhpcyBydWxlLlxuICAgICAgICBnZXRTZXRIb3VyID0gbWFrZUdldFNldCgnSG91cnMnLCB0cnVlKTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1lcmlkaWVtKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYW0nIDogJ0FNJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBiYXNlQ29uZmlnID0ge1xuICAgICAgICBjYWxlbmRhcjogZGVmYXVsdENhbGVuZGFyLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDogZGVmYXVsdExvbmdEYXRlRm9ybWF0LFxuICAgICAgICBpbnZhbGlkRGF0ZTogZGVmYXVsdEludmFsaWREYXRlLFxuICAgICAgICBvcmRpbmFsOiBkZWZhdWx0T3JkaW5hbCxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UsXG4gICAgICAgIHJlbGF0aXZlVGltZTogZGVmYXVsdFJlbGF0aXZlVGltZSxcblxuICAgICAgICBtb250aHM6IGRlZmF1bHRMb2NhbGVNb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQsXG5cbiAgICAgICAgd2VlazogZGVmYXVsdExvY2FsZVdlZWssXG5cbiAgICAgICAgd2Vla2RheXM6IGRlZmF1bHRMb2NhbGVXZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNNaW46IGRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbixcbiAgICAgICAgd2Vla2RheXNTaG9ydDogZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQsXG5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogZGVmYXVsdExvY2FsZU1lcmlkaWVtUGFyc2UsXG4gICAgfTtcblxuICAgIC8vIGludGVybmFsIHN0b3JhZ2UgZm9yIGxvY2FsZSBjb25maWcgZmlsZXNcbiAgICB2YXIgbG9jYWxlcyA9IHt9LFxuICAgICAgICBsb2NhbGVGYW1pbGllcyA9IHt9LFxuICAgICAgICBnbG9iYWxMb2NhbGU7XG5cbiAgICBmdW5jdGlvbiBjb21tb25QcmVmaXgoYXJyMSwgYXJyMikge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIG1pbmwgPSBNYXRoLm1pbihhcnIxLmxlbmd0aCwgYXJyMi5sZW5ndGgpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWlubDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAoYXJyMVtpXSAhPT0gYXJyMltpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW5sO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2FsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIGtleSA/IGtleS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ18nLCAnLScpIDoga2V5O1xuICAgIH1cblxuICAgIC8vIHBpY2sgdGhlIGxvY2FsZSBmcm9tIHRoZSBhcnJheVxuICAgIC8vIHRyeSBbJ2VuLWF1JywgJ2VuLWdiJ10gYXMgJ2VuLWF1JywgJ2VuLWdiJywgJ2VuJywgYXMgaW4gbW92ZSB0aHJvdWdoIHRoZSBsaXN0IHRyeWluZyBlYWNoXG4gICAgLy8gc3Vic3RyaW5nIGZyb20gbW9zdCBzcGVjaWZpYyB0byBsZWFzdCwgYnV0IG1vdmUgdG8gdGhlIG5leHQgYXJyYXkgaXRlbSBpZiBpdCdzIGEgbW9yZSBzcGVjaWZpYyB2YXJpYW50IHRoYW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgIGZ1bmN0aW9uIGNob29zZUxvY2FsZShuYW1lcykge1xuICAgICAgICB2YXIgaSA9IDAsXG4gICAgICAgICAgICBqLFxuICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgIHNwbGl0O1xuXG4gICAgICAgIHdoaWxlIChpIDwgbmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzcGxpdCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpXSkuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGogPSBzcGxpdC5sZW5ndGg7XG4gICAgICAgICAgICBuZXh0ID0gbm9ybWFsaXplTG9jYWxlKG5hbWVzW2kgKyAxXSk7XG4gICAgICAgICAgICBuZXh0ID0gbmV4dCA/IG5leHQuc3BsaXQoJy0nKSA6IG51bGw7XG4gICAgICAgICAgICB3aGlsZSAoaiA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKHNwbGl0LnNsaWNlKDAsIGopLmpvaW4oJy0nKSk7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG5leHQgJiZcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5sZW5ndGggPj0gaiAmJlxuICAgICAgICAgICAgICAgICAgICBjb21tb25QcmVmaXgoc3BsaXQsIG5leHQpID49IGogLSAxXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgYXJyYXkgaXRlbSBpcyBiZXR0ZXIgdGhhbiBhIHNoYWxsb3dlciBzdWJzdHJpbmcgb2YgdGhpcyBvbmVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTG9jYWxlTmFtZVNhbmUobmFtZSkge1xuICAgICAgICAvLyBQcmV2ZW50IG5hbWVzIHRoYXQgbG9vayBsaWtlIGZpbGVzeXN0ZW0gcGF0aHMsIGkuZSBjb250YWluICcvJyBvciAnXFwnXG4gICAgICAgIC8vIEVuc3VyZSBuYW1lIGlzIGF2YWlsYWJsZSBhbmQgZnVuY3Rpb24gcmV0dXJucyBib29sZWFuXG4gICAgICAgIHJldHVybiAhIShuYW1lICYmIG5hbWUubWF0Y2goJ15bXi9cXFxcXFxcXF0qJCcpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkTG9jYWxlKG5hbWUpIHtcbiAgICAgICAgdmFyIG9sZExvY2FsZSA9IG51bGwsXG4gICAgICAgICAgICBhbGlhc2VkUmVxdWlyZTtcbiAgICAgICAgLy8gVE9ETzogRmluZCBhIGJldHRlciB3YXkgdG8gcmVnaXN0ZXIgYW5kIGxvYWQgYWxsIHRoZSBsb2NhbGVzIGluIE5vZGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgbW9kdWxlICYmXG4gICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyAmJlxuICAgICAgICAgICAgaXNMb2NhbGVOYW1lU2FuZShuYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb2xkTG9jYWxlID0gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlID0gcmVxdWlyZTtcbiAgICAgICAgICAgICAgICBhbGlhc2VkUmVxdWlyZSgnLi9sb2NhbGUvJyArIG5hbWUpO1xuICAgICAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShvbGRMb2NhbGUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgbm90IGZvdW5kIHRvIGF2b2lkIHJlcGVhdGluZyBleHBlbnNpdmUgZmlsZSByZXF1aXJlIGNhbGwgY2F1c2luZyBoaWdoIENQVVxuICAgICAgICAgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGZpbmQgZW4tVVMsIGVuX1VTLCBlbi11cyBmb3IgZXZlcnkgZm9ybWF0IGNhbGxcbiAgICAgICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbnVsbDsgLy8gbnVsbCBtZWFucyBub3QgZm91bmRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgbG9hZCBsb2NhbGUgYW5kIHRoZW4gc2V0IHRoZSBnbG9iYWwgbG9jYWxlLiAgSWZcbiAgICAvLyBubyBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiwgaXQgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IGdsb2JhbFxuICAgIC8vIGxvY2FsZSBrZXkuXG4gICAgZnVuY3Rpb24gZ2V0U2V0R2xvYmFsTG9jYWxlKGtleSwgdmFsdWVzKSB7XG4gICAgICAgIHZhciBkYXRhO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGRlZmluZUxvY2FsZShrZXksIHZhbHVlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gbW9tZW50LmR1cmF0aW9uLl9sb2NhbGUgPSBtb21lbnQuX2xvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgZ2xvYmFsTG9jYWxlID0gZGF0YTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy93YXJuIHVzZXIgaWYgYXJndW1lbnRzIGFyZSBwYXNzZWQgYnV0IHRoZSBsb2NhbGUgY291bGQgbm90IGJlIHNldFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAnTG9jYWxlICcgKyBrZXkgKyAnIG5vdCBmb3VuZC4gRGlkIHlvdSBmb3JnZXQgdG8gbG9hZCBpdD8nXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVMb2NhbGUobmFtZSwgY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUsXG4gICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gYmFzZUNvbmZpZztcbiAgICAgICAgICAgIGNvbmZpZy5hYmJyID0gbmFtZTtcbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUoXG4gICAgICAgICAgICAgICAgICAgICdkZWZpbmVMb2NhbGVPdmVycmlkZScsXG4gICAgICAgICAgICAgICAgICAgICd1c2UgbW9tZW50LnVwZGF0ZUxvY2FsZShsb2NhbGVOYW1lLCBjb25maWcpIHRvIGNoYW5nZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdhbiBleGlzdGluZyBsb2NhbGUuIG1vbWVudC5kZWZpbmVMb2NhbGUobG9jYWxlTmFtZSwgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlnKSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGUgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZGVmaW5lLWxvY2FsZS8gZm9yIG1vcmUgaW5mby4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW25hbWVdLl9jb25maWc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlc1tjb25maWcucGFyZW50TG9jYWxlXS5fY29uZmlnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoY29uZmlnLnBhcmVudExvY2FsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlLl9jb25maWc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IG5ldyBMb2NhbGUobWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKSk7XG5cbiAgICAgICAgICAgIGlmIChsb2NhbGVGYW1pbGllc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGxvY2FsZUZhbWlsaWVzW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lTG9jYWxlKHgubmFtZSwgeC5jb25maWcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBub3c6IGFsc28gc2V0IHRoZSBsb2NhbGVcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGxvY2FsZSBBRlRFUiBhbGwgY2hpbGQgbG9jYWxlcyBoYXZlIGJlZW5cbiAgICAgICAgICAgIC8vIGNyZWF0ZWQsIHNvIHdlIHdvbid0IGVuZCB1cCB3aXRoIHRoZSBjaGlsZCBsb2NhbGUgc2V0LlxuICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG5hbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZ1xuICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxlLFxuICAgICAgICAgICAgICAgIHRtcExvY2FsZSxcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsICYmIGxvY2FsZXNbbmFtZV0ucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgY2hpbGQgbG9jYWxlIGluLXBsYWNlIHRvIGF2b2lkIG1lbW9yeS1sZWFrc1xuICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0uc2V0KG1lcmdlQ29uZmlncyhsb2NhbGVzW25hbWVdLl9jb25maWcsIGNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNRVJHRVxuICAgICAgICAgICAgICAgIHRtcExvY2FsZSA9IGxvYWRMb2NhbGUobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRtcExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IHRtcExvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25maWcgPSBtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjb25maWcpO1xuICAgICAgICAgICAgICAgIGlmICh0bXBMb2NhbGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVMb2NhbGUgaXMgY2FsbGVkIGZvciBjcmVhdGluZyBhIG5ldyBsb2NhbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGFiYnIgc28gaXQgd2lsbCBoYXZlIGEgbmFtZSAoZ2V0dGVycyByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkIG90aGVyd2lzZSkuXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hYmJyID0gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZShjb25maWcpO1xuICAgICAgICAgICAgICAgIGxvY2FsZS5wYXJlbnRMb2NhbGUgPSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIG5vdzogYWxzbyBzZXQgdGhlIGxvY2FsZVxuICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFzcyBudWxsIGZvciBjb25maWcgdG8gdW51cGRhdGUsIHVzZWZ1bCBmb3IgdGVzdHNcbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBnZXRTZXRHbG9iYWxMb2NhbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgbG9jYWxlIGRhdGFcbiAgICBmdW5jdGlvbiBnZXRMb2NhbGUoa2V5KSB7XG4gICAgICAgIHZhciBsb2NhbGU7XG5cbiAgICAgICAgaWYgKGtleSAmJiBrZXkuX2xvY2FsZSAmJiBrZXkuX2xvY2FsZS5fYWJicikge1xuICAgICAgICAgICAga2V5ID0ga2V5Ll9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICAvL3Nob3J0LWNpcmN1aXQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleSA9IFtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNob29zZUxvY2FsZShrZXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RMb2NhbGVzKCkge1xuICAgICAgICByZXR1cm4ga2V5cyhsb2NhbGVzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja092ZXJmbG93KG0pIHtcbiAgICAgICAgdmFyIG92ZXJmbG93LFxuICAgICAgICAgICAgYSA9IG0uX2E7XG5cbiAgICAgICAgaWYgKGEgJiYgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID09PSAtMikge1xuICAgICAgICAgICAgb3ZlcmZsb3cgPVxuICAgICAgICAgICAgICAgIGFbTU9OVEhdIDwgMCB8fCBhW01PTlRIXSA+IDExXG4gICAgICAgICAgICAgICAgICAgID8gTU9OVEhcbiAgICAgICAgICAgICAgICAgICAgOiBhW0RBVEVdIDwgMSB8fCBhW0RBVEVdID4gZGF5c0luTW9udGgoYVtZRUFSXSwgYVtNT05USF0pXG4gICAgICAgICAgICAgICAgICAgICAgPyBEQVRFXG4gICAgICAgICAgICAgICAgICAgICAgOiBhW0hPVVJdIDwgMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhW0hPVVJdID4gMjQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGFbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYVtNSU5VVEVdICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtTRUNPTkRdICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtNSUxMSVNFQ09ORF0gIT09IDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBIT1VSXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFbTUlOVVRFXSA8IDAgfHwgYVtNSU5VVEVdID4gNTlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNSU5VVEVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhW1NFQ09ORF0gPCAwIHx8IGFbU0VDT05EXSA+IDU5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTRUNPTkRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFbTUlMTElTRUNPTkRdIDwgMCB8fCBhW01JTExJU0VDT05EXSA+IDk5OVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNSUxMSVNFQ09ORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAtMTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dEYXlPZlllYXIgJiZcbiAgICAgICAgICAgICAgICAob3ZlcmZsb3cgPCBZRUFSIHx8IG92ZXJmbG93ID4gREFURSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gREFURTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla3MgJiYgb3ZlcmZsb3cgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dXZWVrZGF5ICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFS0RBWTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID0gb3ZlcmZsb3c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBpc28gODYwMSByZWdleFxuICAgIC8vIDAwMDAtMDAtMDAgMDAwMC1XMDAgb3IgMDAwMC1XMDAtMCArIFQgKyAwMCBvciAwMDowMCBvciAwMDowMDowMCBvciAwMDowMDowMC4wMDAgKyArMDA6MDAgb3IgKzAwMDAgb3IgKzAwKVxuICAgIHZhciBleHRlbmRlZElzb1JlZ2V4ID1cbiAgICAgICAgICAgIC9eXFxzKigoPzpbKy1dXFxkezZ9fFxcZHs0fSktKD86XFxkXFxkLVxcZFxcZHxXXFxkXFxkLVxcZHxXXFxkXFxkfFxcZFxcZFxcZHxcXGRcXGQpKSg/OihUfCApKFxcZFxcZCg/OjpcXGRcXGQoPzo6XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvLFxuICAgICAgICBiYXNpY0lzb1JlZ2V4ID1cbiAgICAgICAgICAgIC9eXFxzKigoPzpbKy1dXFxkezZ9fFxcZHs0fSkoPzpcXGRcXGRcXGRcXGR8V1xcZFxcZFxcZHxXXFxkXFxkfFxcZFxcZFxcZHxcXGRcXGR8KSkoPzooVHwgKShcXGRcXGQoPzpcXGRcXGQoPzpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoWystXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC8sXG4gICAgICAgIHR6UmVnZXggPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy8sXG4gICAgICAgIGlzb0RhdGVzID0gW1xuICAgICAgICAgICAgWydZWVlZWVktTU0tREQnLCAvWystXVxcZHs2fS1cXGRcXGQtXFxkXFxkL10sXG4gICAgICAgICAgICBbJ1lZWVktTU0tREQnLCAvXFxkezR9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgICAgIFsnR0dHRy1bV11XVy1FJywgL1xcZHs0fS1XXFxkXFxkLVxcZC9dLFxuICAgICAgICAgICAgWydHR0dHLVtXXVdXJywgL1xcZHs0fS1XXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICAgICAgWydZWVlZLURERCcsIC9cXGR7NH0tXFxkezN9L10sXG4gICAgICAgICAgICBbJ1lZWVktTU0nLCAvXFxkezR9LVxcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWVlZTU1ERCcsIC9bKy1dXFxkezEwfS9dLFxuICAgICAgICAgICAgWydZWVlZTU1ERCcsIC9cXGR7OH0vXSxcbiAgICAgICAgICAgIFsnR0dHR1tXXVdXRScsIC9cXGR7NH1XXFxkezN9L10sXG4gICAgICAgICAgICBbJ0dHR0dbV11XVycsIC9cXGR7NH1XXFxkezJ9LywgZmFsc2VdLFxuICAgICAgICAgICAgWydZWVlZREREJywgL1xcZHs3fS9dLFxuICAgICAgICAgICAgWydZWVlZTU0nLCAvXFxkezZ9LywgZmFsc2VdLFxuICAgICAgICAgICAgWydZWVlZJywgL1xcZHs0fS8sIGZhbHNlXSxcbiAgICAgICAgXSxcbiAgICAgICAgLy8gaXNvIHRpbWUgZm9ybWF0cyBhbmQgcmVnZXhlc1xuICAgICAgICBpc29UaW1lcyA9IFtcbiAgICAgICAgICAgIFsnSEg6bW06c3MuU1NTUycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgICAgIFsnSEg6bW06c3MsU1NTUycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZCxcXGQrL10sXG4gICAgICAgICAgICBbJ0hIOm1tOnNzJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgICAgICBbJ0hIOm1tJywgL1xcZFxcZDpcXGRcXGQvXSxcbiAgICAgICAgICAgIFsnSEhtbXNzLlNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICAgICAgWydISG1tc3MsU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGQsXFxkKy9dLFxuICAgICAgICAgICAgWydISG1tc3MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkL10sXG4gICAgICAgICAgICBbJ0hIbW0nLCAvXFxkXFxkXFxkXFxkL10sXG4gICAgICAgICAgICBbJ0hIJywgL1xcZFxcZC9dLFxuICAgICAgICBdLFxuICAgICAgICBhc3BOZXRKc29uUmVnZXggPSAvXlxcLz9EYXRlXFwoKC0/XFxkKykvaSxcbiAgICAgICAgLy8gUkZDIDI4MjIgcmVnZXg6IEZvciBkZXRhaWxzIHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjgyMiNzZWN0aW9uLTMuM1xuICAgICAgICByZmMyODIyID1cbiAgICAgICAgICAgIC9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksP1xccyk/KFxcZHsxLDJ9KVxccyhKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMoXFxkezIsNH0pXFxzKFxcZFxcZCk6KFxcZFxcZCkoPzo6KFxcZFxcZCkpP1xccyg/OihVVHxHTVR8W0VDTVBdW1NEXVQpfChbWnpdKXwoWystXVxcZHs0fSkpJC8sXG4gICAgICAgIG9ic09mZnNldHMgPSB7XG4gICAgICAgICAgICBVVDogMCxcbiAgICAgICAgICAgIEdNVDogMCxcbiAgICAgICAgICAgIEVEVDogLTQgKiA2MCxcbiAgICAgICAgICAgIEVTVDogLTUgKiA2MCxcbiAgICAgICAgICAgIENEVDogLTUgKiA2MCxcbiAgICAgICAgICAgIENTVDogLTYgKiA2MCxcbiAgICAgICAgICAgIE1EVDogLTYgKiA2MCxcbiAgICAgICAgICAgIE1TVDogLTcgKiA2MCxcbiAgICAgICAgICAgIFBEVDogLTcgKiA2MCxcbiAgICAgICAgICAgIFBTVDogLTggKiA2MCxcbiAgICAgICAgfTtcblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlTTyhjb25maWcpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgc3RyaW5nID0gY29uZmlnLl9pLFxuICAgICAgICAgICAgbWF0Y2ggPSBleHRlbmRlZElzb1JlZ2V4LmV4ZWMoc3RyaW5nKSB8fCBiYXNpY0lzb1JlZ2V4LmV4ZWMoc3RyaW5nKSxcbiAgICAgICAgICAgIGFsbG93VGltZSxcbiAgICAgICAgICAgIGRhdGVGb3JtYXQsXG4gICAgICAgICAgICB0aW1lRm9ybWF0LFxuICAgICAgICAgICAgdHpGb3JtYXQsXG4gICAgICAgICAgICBpc29EYXRlc0xlbiA9IGlzb0RhdGVzLmxlbmd0aCxcbiAgICAgICAgICAgIGlzb1RpbWVzTGVuID0gaXNvVGltZXMubGVuZ3RoO1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaXNvID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29EYXRlc0xlbjsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc29EYXRlc1tpXVsxXS5leGVjKG1hdGNoWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0ID0gaXNvRGF0ZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGFsbG93VGltZSA9IGlzb0RhdGVzW2ldWzJdICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29UaW1lc0xlbjsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNvVGltZXNbaV1bMV0uZXhlYyhtYXRjaFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzJdIHNob3VsZCBiZSAnVCcgb3Igc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVGb3JtYXQgPSAobWF0Y2hbMl0gfHwgJyAnKSArIGlzb1RpbWVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYWxsb3dUaW1lICYmIHRpbWVGb3JtYXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFs0XSkge1xuICAgICAgICAgICAgICAgIGlmICh0elJlZ2V4LmV4ZWMobWF0Y2hbNF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHR6Rm9ybWF0ID0gJ1onO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnLl9mID0gZGF0ZUZvcm1hdCArICh0aW1lRm9ybWF0IHx8ICcnKSArICh0ekZvcm1hdCB8fCAnJyk7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MoXG4gICAgICAgIHllYXJTdHIsXG4gICAgICAgIG1vbnRoU3RyLFxuICAgICAgICBkYXlTdHIsXG4gICAgICAgIGhvdXJTdHIsXG4gICAgICAgIG1pbnV0ZVN0cixcbiAgICAgICAgc2Vjb25kU3RyXG4gICAgKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXG4gICAgICAgICAgICB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSxcbiAgICAgICAgICAgIGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydC5pbmRleE9mKG1vbnRoU3RyKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGRheVN0ciwgMTApLFxuICAgICAgICAgICAgcGFyc2VJbnQoaG91clN0ciwgMTApLFxuICAgICAgICAgICAgcGFyc2VJbnQobWludXRlU3RyLCAxMCksXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHNlY29uZFN0cikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VJbnQoc2Vjb25kU3RyLCAxMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSB7XG4gICAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQoeWVhclN0ciwgMTApO1xuICAgICAgICBpZiAoeWVhciA8PSA0OSkge1xuICAgICAgICAgICAgcmV0dXJuIDIwMDAgKyB5ZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXIgPD0gOTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gMTkwMCArIHllYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHllYXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAgICAgICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICAgICAgICByZXR1cm4gc1xuICAgICAgICAgICAgLnJlcGxhY2UoL1xcKFteKCldKlxcKXxbXFxuXFx0XS9nLCAnICcpXG4gICAgICAgICAgICAucmVwbGFjZSgvKFxcc1xccyspL2csICcgJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFxzXFxzKi8sICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcc1xccyokLywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrV2Vla2RheSh3ZWVrZGF5U3RyLCBwYXJzZWRJbnB1dCwgY29uZmlnKSB7XG4gICAgICAgIGlmICh3ZWVrZGF5U3RyKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBSZXBsYWNlIHRoZSB2YW5pbGxhIEpTIERhdGUgb2JqZWN0IHdpdGggYW4gaW5kZXBlbmRlbnQgZGF5LW9mLXdlZWsgY2hlY2suXG4gICAgICAgICAgICB2YXIgd2Vla2RheVByb3ZpZGVkID0gZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQuaW5kZXhPZih3ZWVrZGF5U3RyKSxcbiAgICAgICAgICAgICAgICB3ZWVrZGF5QWN0dWFsID0gbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZElucHV0WzBdLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRJbnB1dFsxXSxcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSW5wdXRbMl1cbiAgICAgICAgICAgICAgICApLmdldERheSgpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXlQcm92aWRlZCAhPT0gd2Vla2RheUFjdHVhbCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLndlZWtkYXlNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZU9mZnNldChvYnNPZmZzZXQsIG1pbGl0YXJ5T2Zmc2V0LCBudW1PZmZzZXQpIHtcbiAgICAgICAgaWYgKG9ic09mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgICAgICAgfSBlbHNlIGlmIChtaWxpdGFyeU9mZnNldCkge1xuICAgICAgICAgICAgLy8gdGhlIG9ubHkgYWxsb3dlZCBtaWxpdGFyeSB0eiBpcyBaXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBobSA9IHBhcnNlSW50KG51bU9mZnNldCwgMTApLFxuICAgICAgICAgICAgICAgIG0gPSBobSAlIDEwMCxcbiAgICAgICAgICAgICAgICBoID0gKGhtIC0gbSkgLyAxMDA7XG4gICAgICAgICAgICByZXR1cm4gaCAqIDYwICsgbTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgYW5kIHRpbWUgZnJvbSByZWYgMjgyMiBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tUkZDMjgyMihjb25maWcpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gcmZjMjgyMi5leGVjKHByZXByb2Nlc3NSRkMyODIyKGNvbmZpZy5faSkpLFxuICAgICAgICAgICAgcGFyc2VkQXJyYXk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgcGFyc2VkQXJyYXkgPSBleHRyYWN0RnJvbVJGQzI4MjJTdHJpbmdzKFxuICAgICAgICAgICAgICAgIG1hdGNoWzRdLFxuICAgICAgICAgICAgICAgIG1hdGNoWzNdLFxuICAgICAgICAgICAgICAgIG1hdGNoWzJdLFxuICAgICAgICAgICAgICAgIG1hdGNoWzVdLFxuICAgICAgICAgICAgICAgIG1hdGNoWzZdLFxuICAgICAgICAgICAgICAgIG1hdGNoWzddXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFjaGVja1dlZWtkYXkobWF0Y2hbMV0sIHBhcnNlZEFycmF5LCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25maWcuX2EgPSBwYXJzZWRBcnJheTtcbiAgICAgICAgICAgIGNvbmZpZy5fdHptID0gY2FsY3VsYXRlT2Zmc2V0KG1hdGNoWzhdLCBtYXRjaFs5XSwgbWF0Y2hbMTBdKTtcblxuICAgICAgICAgICAgY29uZmlnLl9kID0gY3JlYXRlVVRDRGF0ZS5hcHBseShudWxsLCBjb25maWcuX2EpO1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucmZjMjgyMiA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSAxKSBBU1AuTkVULCAyKSBJU08sIDMpIFJGQyAyODIyIGZvcm1hdHMsIG9yIDQpIG9wdGlvbmFsIGZhbGxiYWNrIGlmIHBhcnNpbmcgaXNuJ3Qgc3RyaWN0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZyhjb25maWcpIHtcbiAgICAgICAgdmFyIG1hdGNoZWQgPSBhc3BOZXRKc29uUmVnZXguZXhlYyhjb25maWcuX2kpO1xuICAgICAgICBpZiAobWF0Y2hlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoK21hdGNoZWRbMV0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5faXNWYWxpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fc3RyaWN0KSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZpbmFsIGF0dGVtcHQsIHVzZSBJbnB1dCBGYWxsYmFja1xuICAgICAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrID0gZGVwcmVjYXRlKFxuICAgICAgICAndmFsdWUgcHJvdmlkZWQgaXMgbm90IGluIGEgcmVjb2duaXplZCBSRkMyODIyIG9yIElTTyBmb3JtYXQuIG1vbWVudCBjb25zdHJ1Y3Rpb24gZmFsbHMgYmFjayB0byBqcyBEYXRlKCksICcgK1xuICAgICAgICAgICAgJ3doaWNoIGlzIG5vdCByZWxpYWJsZSBhY3Jvc3MgYWxsIGJyb3dzZXJzIGFuZCB2ZXJzaW9ucy4gTm9uIFJGQzI4MjIvSVNPIGRhdGUgZm9ybWF0cyBhcmUgJyArXG4gICAgICAgICAgICAnZGlzY291cmFnZWQuIFBsZWFzZSByZWZlciB0byBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2pzLWRhdGUvIGZvciBtb3JlIGluZm8uJyxcbiAgICAgICAgZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoY29uZmlnLl9pICsgKGNvbmZpZy5fdXNlVVRDID8gJyBVVEMnIDogJycpKTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBQaWNrIHRoZSBmaXJzdCBkZWZpbmVkIG9mIHR3byBvciB0aHJlZSBhcmd1bWVudHMuXG4gICAgZnVuY3Rpb24gZGVmYXVsdHMoYSwgYiwgYykge1xuICAgICAgICBpZiAoYSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZykge1xuICAgICAgICAvLyBob29rcyBpcyBhY3R1YWxseSB0aGUgZXhwb3J0ZWQgbW9tZW50IG9iamVjdFxuICAgICAgICB2YXIgbm93VmFsdWUgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIGlmIChjb25maWcuX3VzZVVUQykge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBub3dWYWx1ZS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICAgICAgICAgIG5vd1ZhbHVlLmdldFVUQ01vbnRoKCksXG4gICAgICAgICAgICAgICAgbm93VmFsdWUuZ2V0VVRDRGF0ZSgpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25vd1ZhbHVlLmdldEZ1bGxZZWFyKCksIG5vd1ZhbHVlLmdldE1vbnRoKCksIG5vd1ZhbHVlLmdldERhdGUoKV07XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXG4gICAgLy8gdGhlIGFycmF5IHNob3VsZCBtaXJyb3IgdGhlIHBhcmFtZXRlcnMgYmVsb3dcbiAgICAvLyBub3RlOiBhbGwgdmFsdWVzIHBhc3QgdGhlIHllYXIgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cbiAgICAvLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGlucHV0ID0gW10sXG4gICAgICAgICAgICBjdXJyZW50RGF0ZSxcbiAgICAgICAgICAgIGV4cGVjdGVkV2Vla2RheSxcbiAgICAgICAgICAgIHllYXJUb1VzZTtcblxuICAgICAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKTtcblxuICAgICAgICAvL2NvbXB1dGUgZGF5IG9mIHRoZSB5ZWFyIGZyb20gd2Vla3MgYW5kIHdlZWtkYXlzXG4gICAgICAgIGlmIChjb25maWcuX3cgJiYgY29uZmlnLl9hW0RBVEVdID09IG51bGwgJiYgY29uZmlnLl9hW01PTlRIXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBkYXlPZlllYXJGcm9tV2Vla0luZm8oY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWYgdGhlIGRheSBvZiB0aGUgeWVhciBpcyBzZXQsIGZpZ3VyZSBvdXQgd2hhdCBpdCBpc1xuICAgICAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgeWVhclRvVXNlID0gZGVmYXVsdHMoY29uZmlnLl9hW1lFQVJdLCBjdXJyZW50RGF0ZVtZRUFSXSk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA+IGRheXNJblllYXIoeWVhclRvVXNlKSB8fFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dEYXlPZlllYXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZSh5ZWFyVG9Vc2UsIDAsIGNvbmZpZy5fZGF5T2ZZZWFyKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNT05USF0gPSBkYXRlLmdldFVUQ01vbnRoKCk7XG4gICAgICAgICAgICBjb25maWcuX2FbREFURV0gPSBkYXRlLmdldFVUQ0RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCBkYXRlLlxuICAgICAgICAvLyAqIGlmIG5vIHllYXIsIG1vbnRoLCBkYXkgb2YgbW9udGggYXJlIGdpdmVuLCBkZWZhdWx0IHRvIHRvZGF5XG4gICAgICAgIC8vICogaWYgZGF5IG9mIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG1vbnRoIGFuZCB5ZWFyXG4gICAgICAgIC8vICogaWYgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgb25seSB5ZWFyXG4gICAgICAgIC8vICogaWYgeWVhciBpcyBnaXZlbiwgZG9uJ3QgZGVmYXVsdCBhbnl0aGluZ1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiBjb25maWcuX2FbaV0gPT0gbnVsbDsgKytpKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9IGN1cnJlbnREYXRlW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWmVybyBvdXQgd2hhdGV2ZXIgd2FzIG5vdCBkZWZhdWx0ZWQsIGluY2x1ZGluZyB0aW1lXG4gICAgICAgIGZvciAoOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBjb25maWcuX2FbaV0gPSBpbnB1dFtpXSA9XG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW2ldID09IG51bGwgPyAoaSA9PT0gMiA/IDEgOiAwKSA6IGNvbmZpZy5fYVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciAyNDowMDowMC4wMDBcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID09PSAyNCAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW01JTlVURV0gPT09IDAgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtTRUNPTkRdID09PSAwICYmXG4gICAgICAgICAgICBjb25maWcuX2FbTUlMTElTRUNPTkRdID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uZmlnLl9uZXh0RGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWcuX2QgPSAoY29uZmlnLl91c2VVVEMgPyBjcmVhdGVVVENEYXRlIDogY3JlYXRlRGF0ZSkuYXBwbHkoXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgaW5wdXRcbiAgICAgICAgKTtcbiAgICAgICAgZXhwZWN0ZWRXZWVrZGF5ID0gY29uZmlnLl91c2VVVENcbiAgICAgICAgICAgID8gY29uZmlnLl9kLmdldFVUQ0RheSgpXG4gICAgICAgICAgICA6IGNvbmZpZy5fZC5nZXREYXkoKTtcblxuICAgICAgICAvLyBBcHBseSB0aW1lem9uZSBvZmZzZXQgZnJvbSBpbnB1dC4gVGhlIGFjdHVhbCB1dGNPZmZzZXQgY2FuIGJlIGNoYW5nZWRcbiAgICAgICAgLy8gd2l0aCBwYXJzZVpvbmUuXG4gICAgICAgIGlmIChjb25maWcuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5fbmV4dERheSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMjQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBmb3IgbWlzbWF0Y2hpbmcgZGF5IG9mIHdlZWtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnLl93ICYmXG4gICAgICAgICAgICB0eXBlb2YgY29uZmlnLl93LmQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBjb25maWcuX3cuZCAhPT0gZXhwZWN0ZWRXZWVrZGF5XG4gICAgICAgICkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpIHtcbiAgICAgICAgdmFyIHcsIHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSwgdGVtcCwgd2Vla2RheU92ZXJmbG93LCBjdXJXZWVrO1xuXG4gICAgICAgIHcgPSBjb25maWcuX3c7XG4gICAgICAgIGlmICh3LkdHICE9IG51bGwgfHwgdy5XICE9IG51bGwgfHwgdy5FICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRvdyA9IDE7XG4gICAgICAgICAgICBkb3kgPSA0O1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBXZSBuZWVkIHRvIHRha2UgdGhlIGN1cnJlbnQgaXNvV2Vla1llYXIsIGJ1dCB0aGF0IGRlcGVuZHMgb25cbiAgICAgICAgICAgIC8vIGhvdyB3ZSBpbnRlcnByZXQgbm93IChsb2NhbCwgdXRjLCBmaXhlZCBvZmZzZXQpLiBTbyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGEgbm93IHZlcnNpb24gb2YgY3VycmVudCBjb25maWcgKHRha2UgbG9jYWwvdXRjL29mZnNldCBmbGFncywgYW5kXG4gICAgICAgICAgICAvLyBjcmVhdGUgbm93KS5cbiAgICAgICAgICAgIHdlZWtZZWFyID0gZGVmYXVsdHMoXG4gICAgICAgICAgICAgICAgdy5HRyxcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbWUVBUl0sXG4gICAgICAgICAgICAgICAgd2Vla09mWWVhcihjcmVhdGVMb2NhbCgpLCAxLCA0KS55ZWFyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcuVywgMSk7XG4gICAgICAgICAgICB3ZWVrZGF5ID0gZGVmYXVsdHMody5FLCAxKTtcbiAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMSB8fCB3ZWVrZGF5ID4gNykge1xuICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkb3cgPSBjb25maWcuX2xvY2FsZS5fd2Vlay5kb3c7XG4gICAgICAgICAgICBkb3kgPSBjb25maWcuX2xvY2FsZS5fd2Vlay5kb3k7XG5cbiAgICAgICAgICAgIGN1cldlZWsgPSB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIGRvdywgZG95KTtcblxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LmdnLCBjb25maWcuX2FbWUVBUl0sIGN1cldlZWsueWVhcik7XG5cbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCB3ZWVrLlxuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgY3VyV2Vlay53ZWVrKTtcblxuICAgICAgICAgICAgaWYgKHcuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gd2Vla2RheSAtLSBsb3cgZGF5IG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgbmV4dCB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgICAgICBpZiAod2Vla2RheSA8IDAgfHwgd2Vla2RheSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHcuZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9jYWwgd2Vla2RheSAtLSBjb3VudGluZyBzdGFydHMgZnJvbSBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmUgKyBkb3c7XG4gICAgICAgICAgICAgICAgaWYgKHcuZSA8IDAgfHwgdy5lID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSBkb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlZWsgPCAxIHx8IHdlZWsgPiB3ZWVrc0luWWVhcih3ZWVrWWVhciwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla2RheU92ZXJmbG93ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtkYXkgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGVtcCA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gdGVtcC55ZWFyO1xuICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0ZW1wLmRheU9mWWVhcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBJU08gc3RhbmRhcmRcbiAgICBob29rcy5JU09fODYwMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIFJGQyAyODIyIGZvcm1cbiAgICBob29rcy5SRkNfMjgyMiA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyB0byBhbm90aGVyIHBhcnQgb2YgdGhlIGNyZWF0aW9uIGZsb3cgdG8gcHJldmVudCBjaXJjdWxhciBkZXBzXG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLklTT184NjAxKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuUkZDXzI4MjIpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnLl9hID0gW107XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gdHJ1ZTtcblxuICAgICAgICAvLyBUaGlzIGFycmF5IGlzIHVzZWQgdG8gbWFrZSBhIERhdGUsIGVpdGhlciB3aXRoIGBuZXcgRGF0ZWAgb3IgYERhdGUuVVRDYFxuICAgICAgICB2YXIgc3RyaW5nID0gJycgKyBjb25maWcuX2ksXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgcGFyc2VkSW5wdXQsXG4gICAgICAgICAgICB0b2tlbnMsXG4gICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgIHNraXBwZWQsXG4gICAgICAgICAgICBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCA9IDAsXG4gICAgICAgICAgICBlcmEsXG4gICAgICAgICAgICB0b2tlbkxlbjtcblxuICAgICAgICB0b2tlbnMgPVxuICAgICAgICAgICAgZXhwYW5kRm9ybWF0KGNvbmZpZy5fZiwgY29uZmlnLl9sb2NhbGUpLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpIHx8IFtdO1xuICAgICAgICB0b2tlbkxlbiA9IHRva2Vucy5sZW5ndGg7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbkxlbjsgaSsrKSB7XG4gICAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXTtcbiAgICAgICAgICAgIHBhcnNlZElucHV0ID0gKHN0cmluZy5tYXRjaChnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykpIHx8XG4gICAgICAgICAgICAgICAgW10pWzBdO1xuICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgc2tpcHBlZCA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc2tpcHBlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpICsgcGFyc2VkSW5wdXQubGVuZ3RoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoICs9IHBhcnNlZElucHV0Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRvbid0IHBhcnNlIGlmIGl0J3Mgbm90IGEga25vd24gdG9rZW5cbiAgICAgICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBwYXJzZWRJbnB1dCwgY29uZmlnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLl9zdHJpY3QgJiYgIXBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkVG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHJlbWFpbmluZyB1bnBhcnNlZCBpbnB1dCBsZW5ndGggdG8gdGhlIHN0cmluZ1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5jaGFyc0xlZnRPdmVyID1cbiAgICAgICAgICAgIHN0cmluZ0xlbmd0aCAtIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGg7XG4gICAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChzdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgXzEyaCBmbGFnIGlmIGhvdXIgaXMgPD0gMTJcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdIDw9IDEyICYmXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID09PSB0cnVlICYmXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnBhcnNlZERhdGVQYXJ0cyA9IGNvbmZpZy5fYS5zbGljZSgwKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykubWVyaWRpZW0gPSBjb25maWcuX21lcmlkaWVtO1xuICAgICAgICAvLyBoYW5kbGUgbWVyaWRpZW1cbiAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gbWVyaWRpZW1GaXhXcmFwKFxuICAgICAgICAgICAgY29uZmlnLl9sb2NhbGUsXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0sXG4gICAgICAgICAgICBjb25maWcuX21lcmlkaWVtXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gaGFuZGxlIGVyYVxuICAgICAgICBlcmEgPSBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lcmE7XG4gICAgICAgIGlmIChlcmEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IGNvbmZpZy5fbG9jYWxlLmVyYXNDb252ZXJ0WWVhcihlcmEsIGNvbmZpZy5fYVtZRUFSXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgY2hlY2tPdmVyZmxvdyhjb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtRml4V3JhcChsb2NhbGUsIGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgICAgIHZhciBpc1BtO1xuXG4gICAgICAgIGlmIChtZXJpZGllbSA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxlLm1lcmlkaWVtSG91ciAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLm1lcmlkaWVtSG91cihob3VyLCBtZXJpZGllbSk7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYWxlLmlzUE0gIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2tcbiAgICAgICAgICAgIGlzUG0gPSBsb2NhbGUuaXNQTShtZXJpZGllbSk7XG4gICAgICAgICAgICBpZiAoaXNQbSAmJiBob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyICs9IDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1BtICYmIGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlblxuICAgICAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBhcnJheSBvZiBmb3JtYXQgc3RyaW5nc1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpIHtcbiAgICAgICAgdmFyIHRlbXBDb25maWcsXG4gICAgICAgICAgICBiZXN0TW9tZW50LFxuICAgICAgICAgICAgc2NvcmVUb0JlYXQsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgY3VycmVudFNjb3JlLFxuICAgICAgICAgICAgdmFsaWRGb3JtYXRGb3VuZCxcbiAgICAgICAgICAgIGJlc3RGb3JtYXRJc1ZhbGlkID0gZmFsc2UsXG4gICAgICAgICAgICBjb25maWdmTGVuID0gY29uZmlnLl9mLmxlbmd0aDtcblxuICAgICAgICBpZiAoY29uZmlnZkxlbiA9PT0gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZEZvcm1hdCA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZ2ZMZW47IGkrKykge1xuICAgICAgICAgICAgY3VycmVudFNjb3JlID0gMDtcbiAgICAgICAgICAgIHZhbGlkRm9ybWF0Rm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRlbXBDb25maWcgPSBjb3B5Q29uZmlnKHt9LCBjb25maWcpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZW1wQ29uZmlnLl91c2VVVEMgPSBjb25maWcuX3VzZVVUQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRlbXBDb25maWcuX2YgPSBjb25maWcuX2ZbaV07XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KHRlbXBDb25maWcpO1xuXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCh0ZW1wQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHZhbGlkRm9ybWF0Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbnkgaW5wdXQgdGhhdCB3YXMgbm90IHBhcnNlZCBhZGQgYSBwZW5hbHR5IGZvciB0aGF0IGZvcm1hdFxuICAgICAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5jaGFyc0xlZnRPdmVyO1xuXG4gICAgICAgICAgICAvL29yIHRva2Vuc1xuICAgICAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS51bnVzZWRUb2tlbnMubGVuZ3RoICogMTA7XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5zY29yZSA9IGN1cnJlbnRTY29yZTtcblxuICAgICAgICAgICAgaWYgKCFiZXN0Rm9ybWF0SXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCB8fFxuICAgICAgICAgICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID0gY3VycmVudFNjb3JlO1xuICAgICAgICAgICAgICAgICAgICBiZXN0TW9tZW50ID0gdGVtcENvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkRm9ybWF0Rm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RGb3JtYXRJc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTY29yZSA8IHNjb3JlVG9CZWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID0gY3VycmVudFNjb3JlO1xuICAgICAgICAgICAgICAgICAgICBiZXN0TW9tZW50ID0gdGVtcENvbmZpZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBleHRlbmQoY29uZmlnLCBiZXN0TW9tZW50IHx8IHRlbXBDb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoY29uZmlnLl9pKSxcbiAgICAgICAgICAgIGRheU9yRGF0ZSA9IGkuZGF5ID09PSB1bmRlZmluZWQgPyBpLmRhdGUgOiBpLmRheTtcbiAgICAgICAgY29uZmlnLl9hID0gbWFwKFxuICAgICAgICAgICAgW2kueWVhciwgaS5tb250aCwgZGF5T3JEYXRlLCBpLmhvdXIsIGkubWludXRlLCBpLnNlY29uZCwgaS5taWxsaXNlY29uZF0sXG4gICAgICAgICAgICBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVGcm9tQ29uZmlnKGNvbmZpZykge1xuICAgICAgICB2YXIgcmVzID0gbmV3IE1vbWVudChjaGVja092ZXJmbG93KHByZXBhcmVDb25maWcoY29uZmlnKSkpO1xuICAgICAgICBpZiAocmVzLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgaXMgc21hcnQgZW5vdWdoIGFyb3VuZCBEU1RcbiAgICAgICAgICAgIHJlcy5hZGQoMSwgJ2QnKTtcbiAgICAgICAgICAgIHJlcy5fbmV4dERheSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcGFyZUNvbmZpZyhjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pLFxuICAgICAgICAgICAgZm9ybWF0ID0gY29uZmlnLl9mO1xuXG4gICAgICAgIGNvbmZpZy5fbG9jYWxlID0gY29uZmlnLl9sb2NhbGUgfHwgZ2V0TG9jYWxlKGNvbmZpZy5fbCk7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSBudWxsIHx8IChmb3JtYXQgPT09IHVuZGVmaW5lZCAmJiBpbnB1dCA9PT0gJycpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCh7IG51bGxJbnB1dDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWcuX2kgPSBpbnB1dCA9IGNvbmZpZy5fbG9jYWxlLnByZXBhcnNlKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc01vbWVudChpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3coaW5wdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBpbnB1dDtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnRnJvbUlucHV0KGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWQoY29uZmlnKSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlucHV0KGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2k7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGhvb2tzLm5vdygpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dC52YWx1ZU9mKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9hID0gbWFwKGlucHV0LnNsaWNlKDApLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgaXNVVEMpIHtcbiAgICAgICAgdmFyIGMgPSB7fTtcblxuICAgICAgICBpZiAoZm9ybWF0ID09PSB0cnVlIHx8IGZvcm1hdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2NhbGUgPT09IHRydWUgfHwgbG9jYWxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgc3RyaWN0ID0gbG9jYWxlO1xuICAgICAgICAgICAgbG9jYWxlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGlzT2JqZWN0KGlucHV0KSAmJiBpc09iamVjdEVtcHR5KGlucHV0KSkgfHxcbiAgICAgICAgICAgIChpc0FycmF5KGlucHV0KSAmJiBpbnB1dC5sZW5ndGggPT09IDApXG4gICAgICAgICkge1xuICAgICAgICAgICAgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb2JqZWN0IGNvbnN0cnVjdGlvbiBtdXN0IGJlIGRvbmUgdGhpcyB3YXkuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDIzXG4gICAgICAgIGMuX2lzQU1vbWVudE9iamVjdCA9IHRydWU7XG4gICAgICAgIGMuX3VzZVVUQyA9IGMuX2lzVVRDID0gaXNVVEM7XG4gICAgICAgIGMuX2wgPSBsb2NhbGU7XG4gICAgICAgIGMuX2kgPSBpbnB1dDtcbiAgICAgICAgYy5fZiA9IGZvcm1hdDtcbiAgICAgICAgYy5fc3RyaWN0ID0gc3RyaWN0O1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVGcm9tQ29uZmlnKGMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvdHlwZU1pbiA9IGRlcHJlY2F0ZShcbiAgICAgICAgICAgICdtb21lbnQoKS5taW4gaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5tYXggaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LycsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA8IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIHByb3RvdHlwZU1heCA9IGRlcHJlY2F0ZShcbiAgICAgICAgICAgICdtb21lbnQoKS5tYXggaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5taW4gaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LycsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA+IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAvLyBQaWNrIGEgbW9tZW50IG0gZnJvbSBtb21lbnRzIHNvIHRoYXQgbVtmbl0ob3RoZXIpIGlzIHRydWUgZm9yIGFsbFxuICAgIC8vIG90aGVyLiBUaGlzIHJlbGllcyBvbiB0aGUgZnVuY3Rpb24gZm4gdG8gYmUgdHJhbnNpdGl2ZS5cbiAgICAvL1xuICAgIC8vIG1vbWVudHMgc2hvdWxkIGVpdGhlciBiZSBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cyBvciBhbiBhcnJheSwgd2hvc2VcbiAgICAvLyBmaXJzdCBlbGVtZW50IGlzIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzLlxuICAgIGZ1bmN0aW9uIHBpY2tCeShmbiwgbW9tZW50cykge1xuICAgICAgICB2YXIgcmVzLCBpO1xuICAgICAgICBpZiAobW9tZW50cy5sZW5ndGggPT09IDEgJiYgaXNBcnJheShtb21lbnRzWzBdKSkge1xuICAgICAgICAgICAgbW9tZW50cyA9IG1vbWVudHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzID0gbW9tZW50c1swXTtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IG1vbWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmICghbW9tZW50c1tpXS5pc1ZhbGlkKCkgfHwgbW9tZW50c1tpXVtmbl0ocmVzKSkge1xuICAgICAgICAgICAgICAgIHJlcyA9IG1vbWVudHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBVc2UgW10uc29ydCBpbnN0ZWFkP1xuICAgIGZ1bmN0aW9uIG1pbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNCZWZvcmUnLCBhcmdzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXgoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQWZ0ZXInLCBhcmdzKTtcbiAgICB9XG5cbiAgICB2YXIgbm93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3cgPyBEYXRlLm5vdygpIDogK25ldyBEYXRlKCk7XG4gICAgfTtcblxuICAgIHZhciBvcmRlcmluZyA9IFtcbiAgICAgICAgJ3llYXInLFxuICAgICAgICAncXVhcnRlcicsXG4gICAgICAgICdtb250aCcsXG4gICAgICAgICd3ZWVrJyxcbiAgICAgICAgJ2RheScsXG4gICAgICAgICdob3VyJyxcbiAgICAgICAgJ21pbnV0ZScsXG4gICAgICAgICdzZWNvbmQnLFxuICAgICAgICAnbWlsbGlzZWNvbmQnLFxuICAgIF07XG5cbiAgICBmdW5jdGlvbiBpc0R1cmF0aW9uVmFsaWQobSkge1xuICAgICAgICB2YXIga2V5LFxuICAgICAgICAgICAgdW5pdEhhc0RlY2ltYWwgPSBmYWxzZSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBvcmRlckxlbiA9IG9yZGVyaW5nLmxlbmd0aDtcbiAgICAgICAgZm9yIChrZXkgaW4gbSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGhhc093blByb3AobSwga2V5KSAmJlxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIGluZGV4T2YuY2FsbChvcmRlcmluZywga2V5KSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgKG1ba2V5XSA9PSBudWxsIHx8ICFpc05hTihtW2tleV0pKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlckxlbjsgKytpKSB7XG4gICAgICAgICAgICBpZiAobVtvcmRlcmluZ1tpXV0pIHtcbiAgICAgICAgICAgICAgICBpZiAodW5pdEhhc0RlY2ltYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBvbmx5IGFsbG93IG5vbi1pbnRlZ2VycyBmb3Igc21hbGxlc3QgdW5pdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtW29yZGVyaW5nW2ldXSkgIT09IHRvSW50KG1bb3JkZXJpbmdbaV1dKSkge1xuICAgICAgICAgICAgICAgICAgICB1bml0SGFzRGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZCQxKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihOYU4pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIER1cmF0aW9uKGR1cmF0aW9uKSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSBub3JtYWxpemVPYmplY3RVbml0cyhkdXJhdGlvbiksXG4gICAgICAgICAgICB5ZWFycyA9IG5vcm1hbGl6ZWRJbnB1dC55ZWFyIHx8IDAsXG4gICAgICAgICAgICBxdWFydGVycyA9IG5vcm1hbGl6ZWRJbnB1dC5xdWFydGVyIHx8IDAsXG4gICAgICAgICAgICBtb250aHMgPSBub3JtYWxpemVkSW5wdXQubW9udGggfHwgMCxcbiAgICAgICAgICAgIHdlZWtzID0gbm9ybWFsaXplZElucHV0LndlZWsgfHwgbm9ybWFsaXplZElucHV0Lmlzb1dlZWsgfHwgMCxcbiAgICAgICAgICAgIGRheXMgPSBub3JtYWxpemVkSW5wdXQuZGF5IHx8IDAsXG4gICAgICAgICAgICBob3VycyA9IG5vcm1hbGl6ZWRJbnB1dC5ob3VyIHx8IDAsXG4gICAgICAgICAgICBtaW51dGVzID0gbm9ybWFsaXplZElucHV0Lm1pbnV0ZSB8fCAwLFxuICAgICAgICAgICAgc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5zZWNvbmQgfHwgMCxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IG5vcm1hbGl6ZWRJbnB1dC5taWxsaXNlY29uZCB8fCAwO1xuXG4gICAgICAgIHRoaXMuX2lzVmFsaWQgPSBpc0R1cmF0aW9uVmFsaWQobm9ybWFsaXplZElucHV0KTtcblxuICAgICAgICAvLyByZXByZXNlbnRhdGlvbiBmb3IgZGF0ZUFkZFJlbW92ZVxuICAgICAgICB0aGlzLl9taWxsaXNlY29uZHMgPVxuICAgICAgICAgICAgK21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICBzZWNvbmRzICogMWUzICsgLy8gMTAwMFxuICAgICAgICAgICAgbWludXRlcyAqIDZlNCArIC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgaG91cnMgKiAxMDAwICogNjAgKiA2MDsgLy91c2luZyAxMDAwICogNjAgKiA2MCBpbnN0ZWFkIG9mIDM2ZTUgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yOTc4XG4gICAgICAgIC8vIEJlY2F1c2Ugb2YgZGF0ZUFkZFJlbW92ZSB0cmVhdHMgMjQgaG91cnMgYXMgZGlmZmVyZW50IGZyb20gYVxuICAgICAgICAvLyBkYXkgd2hlbiB3b3JraW5nIGFyb3VuZCBEU1QsIHdlIG5lZWQgdG8gc3RvcmUgdGhlbSBzZXBhcmF0ZWx5XG4gICAgICAgIHRoaXMuX2RheXMgPSArZGF5cyArIHdlZWtzICogNztcbiAgICAgICAgLy8gSXQgaXMgaW1wb3NzaWJsZSB0byB0cmFuc2xhdGUgbW9udGhzIGludG8gZGF5cyB3aXRob3V0IGtub3dpbmdcbiAgICAgICAgLy8gd2hpY2ggbW9udGhzIHlvdSBhcmUgYXJlIHRhbGtpbmcgYWJvdXQsIHNvIHdlIGhhdmUgdG8gc3RvcmVcbiAgICAgICAgLy8gaXQgc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fbW9udGhzID0gK21vbnRocyArIHF1YXJ0ZXJzICogMyArIHllYXJzICogMTI7XG5cbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IGdldExvY2FsZSgpO1xuXG4gICAgICAgIHRoaXMuX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRHVyYXRpb24ob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNSb3VuZChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKC0xICogbnVtYmVyKSAqIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbXBhcmUgdHdvIGFycmF5cywgcmV0dXJuIHRoZSBudW1iZXIgb2YgZGlmZmVyZW5jZXNcbiAgICBmdW5jdGlvbiBjb21wYXJlQXJyYXlzKGFycmF5MSwgYXJyYXkyLCBkb250Q29udmVydCkge1xuICAgICAgICB2YXIgbGVuID0gTWF0aC5taW4oYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBsZW5ndGhEaWZmID0gTWF0aC5hYnMoYXJyYXkxLmxlbmd0aCAtIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgZGlmZnMgPSAwLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGRvbnRDb252ZXJ0ICYmIGFycmF5MVtpXSAhPT0gYXJyYXkyW2ldKSB8fFxuICAgICAgICAgICAgICAgICghZG9udENvbnZlcnQgJiYgdG9JbnQoYXJyYXkxW2ldKSAhPT0gdG9JbnQoYXJyYXkyW2ldKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGRpZmZzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpZmZzICsgbGVuZ3RoRGlmZjtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBmdW5jdGlvbiBvZmZzZXQodG9rZW4sIHNlcGFyYXRvcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbih0b2tlbiwgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMudXRjT2Zmc2V0KCksXG4gICAgICAgICAgICAgICAgc2lnbiA9ICcrJztcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDtcbiAgICAgICAgICAgICAgICBzaWduID0gJy0nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBzaWduICtcbiAgICAgICAgICAgICAgICB6ZXJvRmlsbCh+fihvZmZzZXQgLyA2MCksIDIpICtcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3IgK1xuICAgICAgICAgICAgICAgIHplcm9GaWxsKH5+b2Zmc2V0ICUgNjAsIDIpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvZmZzZXQoJ1onLCAnOicpO1xuICAgIG9mZnNldCgnWlonLCAnJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdaJywgbWF0Y2hTaG9ydE9mZnNldCk7XG4gICAgYWRkUmVnZXhUb2tlbignWlonLCBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRQYXJzZVRva2VuKFsnWicsICdaWiddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl91c2VVVEMgPSB0cnVlO1xuICAgICAgICBjb25maWcuX3R6bSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gdGltZXpvbmUgY2h1bmtlclxuICAgIC8vICcrMTA6MDAnID4gWycxMCcsICAnMDAnXVxuICAgIC8vICctMTUzMCcgID4gWyctMTUnLCAnMzAnXVxuICAgIHZhciBjaHVua09mZnNldCA9IC8oW1xcK1xcLV18XFxkXFxkKS9naTtcblxuICAgIGZ1bmN0aW9uIG9mZnNldEZyb21TdHJpbmcobWF0Y2hlciwgc3RyaW5nKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gKHN0cmluZyB8fCAnJykubWF0Y2gobWF0Y2hlciksXG4gICAgICAgICAgICBjaHVuayxcbiAgICAgICAgICAgIHBhcnRzLFxuICAgICAgICAgICAgbWludXRlcztcblxuICAgICAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjaHVuayA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXSB8fCBbXTtcbiAgICAgICAgcGFydHMgPSAoY2h1bmsgKyAnJykubWF0Y2goY2h1bmtPZmZzZXQpIHx8IFsnLScsIDAsIDBdO1xuICAgICAgICBtaW51dGVzID0gKyhwYXJ0c1sxXSAqIDYwKSArIHRvSW50KHBhcnRzWzJdKTtcblxuICAgICAgICByZXR1cm4gbWludXRlcyA9PT0gMCA/IDAgOiBwYXJ0c1swXSA9PT0gJysnID8gbWludXRlcyA6IC1taW51dGVzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBhIG1vbWVudCBmcm9tIGlucHV0LCB0aGF0IGlzIGxvY2FsL3V0Yy96b25lIGVxdWl2YWxlbnQgdG8gbW9kZWwuXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCBtb2RlbCkge1xuICAgICAgICB2YXIgcmVzLCBkaWZmO1xuICAgICAgICBpZiAobW9kZWwuX2lzVVRDKSB7XG4gICAgICAgICAgICByZXMgPSBtb2RlbC5jbG9uZSgpO1xuICAgICAgICAgICAgZGlmZiA9XG4gICAgICAgICAgICAgICAgKGlzTW9tZW50KGlucHV0KSB8fCBpc0RhdGUoaW5wdXQpXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXQudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgICAgIDogY3JlYXRlTG9jYWwoaW5wdXQpLnZhbHVlT2YoKSkgLSByZXMudmFsdWVPZigpO1xuICAgICAgICAgICAgLy8gVXNlIGxvdy1sZXZlbCBhcGksIGJlY2F1c2UgdGhpcyBmbiBpcyBsb3ctbGV2ZWwgYXBpLlxuICAgICAgICAgICAgcmVzLl9kLnNldFRpbWUocmVzLl9kLnZhbHVlT2YoKSArIGRpZmYpO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHJlcywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCkubG9jYWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERhdGVPZmZzZXQobSkge1xuICAgICAgICAvLyBPbiBGaXJlZm94LjI0IERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyBhIGZsb2F0aW5nIHBvaW50LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9wdWxsLzE4NzFcbiAgICAgICAgcmV0dXJuIC1NYXRoLnJvdW5kKG0uX2QuZ2V0VGltZXpvbmVPZmZzZXQoKSk7XG4gICAgfVxuXG4gICAgLy8gSE9PS1NcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBtb21lbnQgaXMgbXV0YXRlZC5cbiAgICAvLyBJdCBpcyBpbnRlbmRlZCB0byBrZWVwIHRoZSBvZmZzZXQgaW4gc3luYyB3aXRoIHRoZSB0aW1lem9uZS5cbiAgICBob29rcy51cGRhdGVPZmZzZXQgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIC8vIGtlZXBMb2NhbFRpbWUgPSB0cnVlIG1lYW5zIG9ubHkgY2hhbmdlIHRoZSB0aW1lem9uZSwgd2l0aG91dFxuICAgIC8vIGFmZmVjdGluZyB0aGUgbG9jYWwgaG91ci4gU28gNTozMToyNiArMDMwMCAtLVt1dGNPZmZzZXQoMiwgdHJ1ZSldLS0+XG4gICAgLy8gNTozMToyNiArMDIwMCBJdCBpcyBwb3NzaWJsZSB0aGF0IDU6MzE6MjYgZG9lc24ndCBleGlzdCB3aXRoIG9mZnNldFxuICAgIC8vICswMjAwLCBzbyB3ZSBhZGp1c3QgdGhlIHRpbWUgYXMgbmVlZGVkLCB0byBiZSB2YWxpZC5cbiAgICAvL1xuICAgIC8vIEtlZXBpbmcgdGhlIHRpbWUgYWN0dWFsbHkgYWRkcy9zdWJ0cmFjdHMgKG9uZSBob3VyKVxuICAgIC8vIGZyb20gdGhlIGFjdHVhbCByZXByZXNlbnRlZCB0aW1lLiBUaGF0IGlzIHdoeSB3ZSBjYWxsIHVwZGF0ZU9mZnNldFxuICAgIC8vIGEgc2Vjb25kIHRpbWUuIEluIGNhc2UgaXQgd2FudHMgdXMgdG8gY2hhbmdlIHRoZSBvZmZzZXQgYWdhaW5cbiAgICAvLyBfY2hhbmdlSW5Qcm9ncmVzcyA9PSB0cnVlIGNhc2UsIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QsIGJlY2F1c2VcbiAgICAvLyB0aGVyZSBpcyBubyBzdWNoIHRpbWUgaW4gdGhlIGdpdmVuIHRpbWV6b25lLlxuICAgIGZ1bmN0aW9uIGdldFNldE9mZnNldChpbnB1dCwga2VlcExvY2FsVGltZSwga2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX29mZnNldCB8fCAwLFxuICAgICAgICAgICAgbG9jYWxBZGp1c3Q7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGlucHV0KSA8IDE2ICYmICFrZWVwTWludXRlcykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQgKiA2MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5faXNVVEMgJiYga2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgIGxvY2FsQWRqdXN0ID0gZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IGlucHV0O1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGxvY2FsQWRqdXN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZChsb2NhbEFkanVzdCwgJ20nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvZmZzZXQgIT09IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZWVwTG9jYWxUaW1lIHx8IHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkU3VidHJhY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRHVyYXRpb24oaW5wdXQgLSBvZmZzZXQsICdtJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gb2Zmc2V0IDogZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFpvbmUoaW5wdXQsIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSAtaW5wdXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KGlucHV0LCBrZWVwTG9jYWxUaW1lKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gLXRoaXMudXRjT2Zmc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb1VUQyhrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb0xvY2FsKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzVVRDKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJ0cmFjdChnZXREYXRlT2Zmc2V0KHRoaXMpLCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0KCkge1xuICAgICAgICBpZiAodGhpcy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRoaXMuX3R6bSwgZmFsc2UsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9pID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIHRab25lID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaE9mZnNldCwgdGhpcy5faSk7XG4gICAgICAgICAgICBpZiAodFpvbmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KHRab25lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzQWxpZ25lZEhvdXJPZmZzZXQoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0ID0gaW5wdXQgPyBjcmVhdGVMb2NhbChpbnB1dCkudXRjT2Zmc2V0KCkgOiAwO1xuXG4gICAgICAgIHJldHVybiAodGhpcy51dGNPZmZzZXQoKSAtIGlucHV0KSAlIDYwID09PSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCgwKS51dGNPZmZzZXQoKSB8fFxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoKSA+IHRoaXMuY2xvbmUoKS5tb250aCg1KS51dGNPZmZzZXQoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZCgpIHtcbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9pc0RTVFNoaWZ0ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGMgPSB7fSxcbiAgICAgICAgICAgIG90aGVyO1xuXG4gICAgICAgIGNvcHlDb25maWcoYywgdGhpcyk7XG4gICAgICAgIGMgPSBwcmVwYXJlQ29uZmlnKGMpO1xuXG4gICAgICAgIGlmIChjLl9hKSB7XG4gICAgICAgICAgICBvdGhlciA9IGMuX2lzVVRDID8gY3JlYXRlVVRDKGMuX2EpIDogY3JlYXRlTG9jYWwoYy5fYSk7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPVxuICAgICAgICAgICAgICAgIHRoaXMuaXNWYWxpZCgpICYmIGNvbXBhcmVBcnJheXMoYy5fYSwgb3RoZXIudG9BcnJheSgpKSA+IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc0RTVFNoaWZ0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNMb2NhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gIXRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGNPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDICYmIHRoaXMuX29mZnNldCA9PT0gMCA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFTUC5ORVQganNvbiBkYXRlIGZvcm1hdCByZWdleFxuICAgIHZhciBhc3BOZXRSZWdleCA9IC9eKC18XFwrKT8oPzooXFxkKilbLiBdKT8oXFxkKyk6KFxcZCspKD86OihcXGQrKShcXC5cXGQqKT8pPyQvLFxuICAgICAgICAvLyBmcm9tIGh0dHA6Ly9kb2NzLmNsb3N1cmUtbGlicmFyeS5nb29nbGVjb2RlLmNvbS9naXQvY2xvc3VyZV9nb29nX2RhdGVfZGF0ZS5qcy5zb3VyY2UuaHRtbFxuICAgICAgICAvLyBzb21ld2hhdCBtb3JlIGluIGxpbmUgd2l0aCA0LjQuMy4yIDIwMDQgc3BlYywgYnV0IGFsbG93cyBkZWNpbWFsIGFueXdoZXJlXG4gICAgICAgIC8vIGFuZCBmdXJ0aGVyIG1vZGlmaWVkIHRvIGFsbG93IGZvciBzdHJpbmdzIGNvbnRhaW5pbmcgYm90aCB3ZWVrIGFuZCBkYXlcbiAgICAgICAgaXNvUmVnZXggPVxuICAgICAgICAgICAgL14oLXxcXCspP1AoPzooWy0rXT9bMC05LC5dKilZKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilXKT8oPzooWy0rXT9bMC05LC5dKilEKT8oPzpUKD86KFstK10/WzAtOSwuXSopSCk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopUyk/KT8kLztcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUR1cmF0aW9uKGlucHV0LCBrZXkpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gaW5wdXQsXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBhZ2FpbnN0IHJlZ2V4cCBpcyBleHBlbnNpdmUsIGRvIGl0IG9uIGRlbWFuZFxuICAgICAgICAgICAgbWF0Y2ggPSBudWxsLFxuICAgICAgICAgICAgc2lnbixcbiAgICAgICAgICAgIHJldCxcbiAgICAgICAgICAgIGRpZmZSZXM7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBtczogaW5wdXQuX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgICAgICBkOiBpbnB1dC5fZGF5cyxcbiAgICAgICAgICAgICAgICBNOiBpbnB1dC5fbW9udGhzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkgfHwgIWlzTmFOKCtpbnB1dCkpIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb25ba2V5XSA9ICtpbnB1dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb24ubWlsbGlzZWNvbmRzID0gK2lucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKChtYXRjaCA9IGFzcE5ldFJlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IG1hdGNoWzFdID09PSAnLScgPyAtMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICAgIGQ6IHRvSW50KG1hdGNoW0RBVEVdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgaDogdG9JbnQobWF0Y2hbSE9VUl0pICogc2lnbixcbiAgICAgICAgICAgICAgICBtOiB0b0ludChtYXRjaFtNSU5VVEVdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgczogdG9JbnQobWF0Y2hbU0VDT05EXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIG1zOiB0b0ludChhYnNSb3VuZChtYXRjaFtNSUxMSVNFQ09ORF0gKiAxMDAwKSkgKiBzaWduLCAvLyB0aGUgbWlsbGlzZWNvbmQgZGVjaW1hbCBwb2ludCBpcyBpbmNsdWRlZCBpbiB0aGUgbWF0Y2hcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoKG1hdGNoID0gaXNvUmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgICAgICBzaWduID0gbWF0Y2hbMV0gPT09ICctJyA/IC0xIDogMTtcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHk6IHBhcnNlSXNvKG1hdGNoWzJdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBNOiBwYXJzZUlzbyhtYXRjaFszXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgdzogcGFyc2VJc28obWF0Y2hbNF0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGQ6IHBhcnNlSXNvKG1hdGNoWzVdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBoOiBwYXJzZUlzbyhtYXRjaFs2XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgbTogcGFyc2VJc28obWF0Y2hbN10sIHNpZ24pLFxuICAgICAgICAgICAgICAgIHM6IHBhcnNlSXNvKG1hdGNoWzhdLCBzaWduKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoZHVyYXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBkdXJhdGlvbiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICgnZnJvbScgaW4gZHVyYXRpb24gfHwgJ3RvJyBpbiBkdXJhdGlvbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBkaWZmUmVzID0gbW9tZW50c0RpZmZlcmVuY2UoXG4gICAgICAgICAgICAgICAgY3JlYXRlTG9jYWwoZHVyYXRpb24uZnJvbSksXG4gICAgICAgICAgICAgICAgY3JlYXRlTG9jYWwoZHVyYXRpb24udG8pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgZHVyYXRpb24ubXMgPSBkaWZmUmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIGR1cmF0aW9uLk0gPSBkaWZmUmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldCA9IG5ldyBEdXJhdGlvbihkdXJhdGlvbik7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfbG9jYWxlJykpIHtcbiAgICAgICAgICAgIHJldC5fbG9jYWxlID0gaW5wdXQuX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSAmJiBoYXNPd25Qcm9wKGlucHV0LCAnX2lzVmFsaWQnKSkge1xuICAgICAgICAgICAgcmV0Ll9pc1ZhbGlkID0gaW5wdXQuX2lzVmFsaWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGNyZWF0ZUR1cmF0aW9uLmZuID0gRHVyYXRpb24ucHJvdG90eXBlO1xuICAgIGNyZWF0ZUR1cmF0aW9uLmludmFsaWQgPSBjcmVhdGVJbnZhbGlkJDE7XG5cbiAgICBmdW5jdGlvbiBwYXJzZUlzbyhpbnAsIHNpZ24pIHtcbiAgICAgICAgLy8gV2UnZCBub3JtYWxseSB1c2Ugfn5pbnAgZm9yIHRoaXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IGl0IGFsc29cbiAgICAgICAgLy8gY29udmVydHMgZmxvYXRzIHRvIGludHMuXG4gICAgICAgIC8vIGlucCBtYXkgYmUgdW5kZWZpbmVkLCBzbyBjYXJlZnVsIGNhbGxpbmcgcmVwbGFjZSBvbiBpdC5cbiAgICAgICAgdmFyIHJlcyA9IGlucCAmJiBwYXJzZUZsb2F0KGlucC5yZXBsYWNlKCcsJywgJy4nKSk7XG4gICAgICAgIC8vIGFwcGx5IHNpZ24gd2hpbGUgd2UncmUgYXQgaXRcbiAgICAgICAgcmV0dXJuIChpc05hTihyZXMpID8gMCA6IHJlcykgKiBzaWduO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcyA9IHt9O1xuXG4gICAgICAgIHJlcy5tb250aHMgPVxuICAgICAgICAgICAgb3RoZXIubW9udGgoKSAtIGJhc2UubW9udGgoKSArIChvdGhlci55ZWFyKCkgLSBiYXNlLnllYXIoKSkgKiAxMjtcbiAgICAgICAgaWYgKGJhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKS5pc0FmdGVyKG90aGVyKSkge1xuICAgICAgICAgICAgLS1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9ICtvdGhlciAtICtiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJyk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb21lbnRzRGlmZmVyZW5jZShiYXNlLCBvdGhlcikge1xuICAgICAgICB2YXIgcmVzO1xuICAgICAgICBpZiAoIShiYXNlLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtaWxsaXNlY29uZHM6IDAsIG1vbnRoczogMCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXIgPSBjbG9uZVdpdGhPZmZzZXQob3RoZXIsIGJhc2UpO1xuICAgICAgICBpZiAoYmFzZS5pc0JlZm9yZShvdGhlcikpIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShvdGhlciwgYmFzZSk7XG4gICAgICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gLXJlcy5taWxsaXNlY29uZHM7XG4gICAgICAgICAgICByZXMubW9udGhzID0gLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHJlbW92ZSAnbmFtZScgYXJnIGFmdGVyIGRlcHJlY2F0aW9uIGlzIHJlbW92ZWRcbiAgICBmdW5jdGlvbiBjcmVhdGVBZGRlcihkaXJlY3Rpb24sIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwsIHBlcmlvZCkge1xuICAgICAgICAgICAgdmFyIGR1ciwgdG1wO1xuICAgICAgICAgICAgLy9pbnZlcnQgdGhlIGFyZ3VtZW50cywgYnV0IGNvbXBsYWluIGFib3V0IGl0XG4gICAgICAgICAgICBpZiAocGVyaW9kICE9PSBudWxsICYmICFpc05hTigrcGVyaW9kKSkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZShcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgJ21vbWVudCgpLicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKHBlcmlvZCwgbnVtYmVyKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIG1vbWVudCgpLicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKG51bWJlciwgcGVyaW9kKS4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvYWRkLWludmVydGVkLXBhcmFtLyBmb3IgbW9yZSBpbmZvLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRtcCA9IHZhbDtcbiAgICAgICAgICAgICAgICB2YWwgPSBwZXJpb2Q7XG4gICAgICAgICAgICAgICAgcGVyaW9kID0gdG1wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkdXIgPSBjcmVhdGVEdXJhdGlvbih2YWwsIHBlcmlvZCk7XG4gICAgICAgICAgICBhZGRTdWJ0cmFjdCh0aGlzLCBkdXIsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdChtb20sIGR1cmF0aW9uLCBpc0FkZGluZywgdXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSBkdXJhdGlvbi5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgZGF5cyA9IGFic1JvdW5kKGR1cmF0aW9uLl9kYXlzKSxcbiAgICAgICAgICAgIG1vbnRocyA9IGFic1JvdW5kKGR1cmF0aW9uLl9tb250aHMpO1xuXG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gTm8gb3BcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZU9mZnNldCA9IHVwZGF0ZU9mZnNldCA9PSBudWxsID8gdHJ1ZSA6IHVwZGF0ZU9mZnNldDtcblxuICAgICAgICBpZiAobW9udGhzKSB7XG4gICAgICAgICAgICBzZXRNb250aChtb20sIGdldChtb20sICdNb250aCcpICsgbW9udGhzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXlzKSB7XG4gICAgICAgICAgICBzZXQkMShtb20sICdEYXRlJywgZ2V0KG1vbSwgJ0RhdGUnKSArIGRheXMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbGxpc2Vjb25kcykge1xuICAgICAgICAgICAgbW9tLl9kLnNldFRpbWUobW9tLl9kLnZhbHVlT2YoKSArIG1pbGxpc2Vjb25kcyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQobW9tLCBkYXlzIHx8IG1vbnRocyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYWRkID0gY3JlYXRlQWRkZXIoMSwgJ2FkZCcpLFxuICAgICAgICBzdWJ0cmFjdCA9IGNyZWF0ZUFkZGVyKC0xLCAnc3VidHJhY3QnKTtcblxuICAgIGZ1bmN0aW9uIGlzU3RyaW5nKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8IGlucHV0IGluc3RhbmNlb2YgU3RyaW5nO1xuICAgIH1cblxuICAgIC8vIHR5cGUgTW9tZW50SW5wdXQgPSBNb21lbnQgfCBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgKG51bWJlciB8IHN0cmluZylbXSB8IE1vbWVudElucHV0T2JqZWN0IHwgdm9pZDsgLy8gbnVsbCB8IHVuZGVmaW5lZFxuICAgIGZ1bmN0aW9uIGlzTW9tZW50SW5wdXQoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlzTW9tZW50KGlucHV0KSB8fFxuICAgICAgICAgICAgaXNEYXRlKGlucHV0KSB8fFxuICAgICAgICAgICAgaXNTdHJpbmcoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc051bWJlcihpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzTnVtYmVyT3JTdHJpbmdBcnJheShpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzTW9tZW50SW5wdXRPYmplY3QoaW5wdXQpIHx8XG4gICAgICAgICAgICBpbnB1dCA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgaW5wdXQgPT09IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTW9tZW50SW5wdXRPYmplY3QoaW5wdXQpIHtcbiAgICAgICAgdmFyIG9iamVjdFRlc3QgPSBpc09iamVjdChpbnB1dCkgJiYgIWlzT2JqZWN0RW1wdHkoaW5wdXQpLFxuICAgICAgICAgICAgcHJvcGVydHlUZXN0ID0gZmFsc2UsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0gW1xuICAgICAgICAgICAgICAgICd5ZWFycycsXG4gICAgICAgICAgICAgICAgJ3llYXInLFxuICAgICAgICAgICAgICAgICd5JyxcbiAgICAgICAgICAgICAgICAnbW9udGhzJyxcbiAgICAgICAgICAgICAgICAnbW9udGgnLFxuICAgICAgICAgICAgICAgICdNJyxcbiAgICAgICAgICAgICAgICAnZGF5cycsXG4gICAgICAgICAgICAgICAgJ2RheScsXG4gICAgICAgICAgICAgICAgJ2QnLFxuICAgICAgICAgICAgICAgICdkYXRlcycsXG4gICAgICAgICAgICAgICAgJ2RhdGUnLFxuICAgICAgICAgICAgICAgICdEJyxcbiAgICAgICAgICAgICAgICAnaG91cnMnLFxuICAgICAgICAgICAgICAgICdob3VyJyxcbiAgICAgICAgICAgICAgICAnaCcsXG4gICAgICAgICAgICAgICAgJ21pbnV0ZXMnLFxuICAgICAgICAgICAgICAgICdtaW51dGUnLFxuICAgICAgICAgICAgICAgICdtJyxcbiAgICAgICAgICAgICAgICAnc2Vjb25kcycsXG4gICAgICAgICAgICAgICAgJ3NlY29uZCcsXG4gICAgICAgICAgICAgICAgJ3MnLFxuICAgICAgICAgICAgICAgICdtaWxsaXNlY29uZHMnLFxuICAgICAgICAgICAgICAgICdtaWxsaXNlY29uZCcsXG4gICAgICAgICAgICAgICAgJ21zJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICBwcm9wZXJ0eUxlbiA9IHByb3BlcnRpZXMubGVuZ3RoO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wZXJ0eUxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBwcm9wZXJ0eVRlc3QgfHwgaGFzT3duUHJvcChpbnB1dCwgcHJvcGVydHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9iamVjdFRlc3QgJiYgcHJvcGVydHlUZXN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTnVtYmVyT3JTdHJpbmdBcnJheShpbnB1dCkge1xuICAgICAgICB2YXIgYXJyYXlUZXN0ID0gaXNBcnJheShpbnB1dCksXG4gICAgICAgICAgICBkYXRhVHlwZVRlc3QgPSBmYWxzZTtcbiAgICAgICAgaWYgKGFycmF5VGVzdCkge1xuICAgICAgICAgICAgZGF0YVR5cGVUZXN0ID1cbiAgICAgICAgICAgICAgICBpbnB1dC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpc051bWJlcihpdGVtKSAmJiBpc1N0cmluZyhpbnB1dCk7XG4gICAgICAgICAgICAgICAgfSkubGVuZ3RoID09PSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheVRlc3QgJiYgZGF0YVR5cGVUZXN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQ2FsZW5kYXJTcGVjKGlucHV0KSB7XG4gICAgICAgIHZhciBvYmplY3RUZXN0ID0gaXNPYmplY3QoaW5wdXQpICYmICFpc09iamVjdEVtcHR5KGlucHV0KSxcbiAgICAgICAgICAgIHByb3BlcnR5VGVzdCA9IGZhbHNlLFxuICAgICAgICAgICAgcHJvcGVydGllcyA9IFtcbiAgICAgICAgICAgICAgICAnc2FtZURheScsXG4gICAgICAgICAgICAgICAgJ25leHREYXknLFxuICAgICAgICAgICAgICAgICdsYXN0RGF5JyxcbiAgICAgICAgICAgICAgICAnbmV4dFdlZWsnLFxuICAgICAgICAgICAgICAgICdsYXN0V2VlaycsXG4gICAgICAgICAgICAgICAgJ3NhbWVFbHNlJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgcHJvcGVydHk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgIHByb3BlcnR5VGVzdCA9IHByb3BlcnR5VGVzdCB8fCBoYXNPd25Qcm9wKGlucHV0LCBwcm9wZXJ0eSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2JqZWN0VGVzdCAmJiBwcm9wZXJ0eVRlc3Q7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2FsZW5kYXJGb3JtYXQobXlNb21lbnQsIG5vdykge1xuICAgICAgICB2YXIgZGlmZiA9IG15TW9tZW50LmRpZmYobm93LCAnZGF5cycsIHRydWUpO1xuICAgICAgICByZXR1cm4gZGlmZiA8IC02XG4gICAgICAgICAgICA/ICdzYW1lRWxzZSdcbiAgICAgICAgICAgIDogZGlmZiA8IC0xXG4gICAgICAgICAgICAgID8gJ2xhc3RXZWVrJ1xuICAgICAgICAgICAgICA6IGRpZmYgPCAwXG4gICAgICAgICAgICAgICAgPyAnbGFzdERheSdcbiAgICAgICAgICAgICAgICA6IGRpZmYgPCAxXG4gICAgICAgICAgICAgICAgICA/ICdzYW1lRGF5J1xuICAgICAgICAgICAgICAgICAgOiBkaWZmIDwgMlxuICAgICAgICAgICAgICAgICAgICA/ICduZXh0RGF5J1xuICAgICAgICAgICAgICAgICAgICA6IGRpZmYgPCA3XG4gICAgICAgICAgICAgICAgICAgICAgPyAnbmV4dFdlZWsnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnc2FtZUVsc2UnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGVuZGFyJDEodGltZSwgZm9ybWF0cykge1xuICAgICAgICAvLyBTdXBwb3J0IGZvciBzaW5nbGUgcGFyYW1ldGVyLCBmb3JtYXRzIG9ubHkgb3ZlcmxvYWQgdG8gdGhlIGNhbGVuZGFyIGZ1bmN0aW9uXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoIWFyZ3VtZW50c1swXSkge1xuICAgICAgICAgICAgICAgIHRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNNb21lbnRJbnB1dChhcmd1bWVudHNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdGltZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgICAgICBmb3JtYXRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0NhbGVuZGFyU3BlYyhhcmd1bWVudHNbMF0pKSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0cyA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgICAgICB0aW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gY29tcGFyZSB0aGUgc3RhcnQgb2YgdG9kYXksIHZzIHRoaXMuXG4gICAgICAgIC8vIEdldHRpbmcgc3RhcnQtb2YtdG9kYXkgZGVwZW5kcyBvbiB3aGV0aGVyIHdlJ3JlIGxvY2FsL3V0Yy9vZmZzZXQgb3Igbm90LlxuICAgICAgICB2YXIgbm93ID0gdGltZSB8fCBjcmVhdGVMb2NhbCgpLFxuICAgICAgICAgICAgc29kID0gY2xvbmVXaXRoT2Zmc2V0KG5vdywgdGhpcykuc3RhcnRPZignZGF5JyksXG4gICAgICAgICAgICBmb3JtYXQgPSBob29rcy5jYWxlbmRhckZvcm1hdCh0aGlzLCBzb2QpIHx8ICdzYW1lRWxzZScsXG4gICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgIGZvcm1hdHMgJiZcbiAgICAgICAgICAgICAgICAoaXNGdW5jdGlvbihmb3JtYXRzW2Zvcm1hdF0pXG4gICAgICAgICAgICAgICAgICAgID8gZm9ybWF0c1tmb3JtYXRdLmNhbGwodGhpcywgbm93KVxuICAgICAgICAgICAgICAgICAgICA6IGZvcm1hdHNbZm9ybWF0XSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KFxuICAgICAgICAgICAgb3V0cHV0IHx8IHRoaXMubG9jYWxlRGF0YSgpLmNhbGVuZGFyKGZvcm1hdCwgdGhpcywgY3JlYXRlTG9jYWwobm93KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBZnRlcihpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cykgfHwgJ21pbGxpc2Vjb25kJztcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPiBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbElucHV0LnZhbHVlT2YoKSA8IHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0JlZm9yZShpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cykgfHwgJ21pbGxpc2Vjb25kJztcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKSA8IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZXR3ZWVuKGZyb20sIHRvLCB1bml0cywgaW5jbHVzaXZpdHkpIHtcbiAgICAgICAgdmFyIGxvY2FsRnJvbSA9IGlzTW9tZW50KGZyb20pID8gZnJvbSA6IGNyZWF0ZUxvY2FsKGZyb20pLFxuICAgICAgICAgICAgbG9jYWxUbyA9IGlzTW9tZW50KHRvKSA/IHRvIDogY3JlYXRlTG9jYWwodG8pO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbEZyb20uaXNWYWxpZCgpICYmIGxvY2FsVG8uaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGluY2x1c2l2aXR5ID0gaW5jbHVzaXZpdHkgfHwgJygpJztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVswXSA9PT0gJygnXG4gICAgICAgICAgICAgICAgPyB0aGlzLmlzQWZ0ZXIobG9jYWxGcm9tLCB1bml0cylcbiAgICAgICAgICAgICAgICA6ICF0aGlzLmlzQmVmb3JlKGxvY2FsRnJvbSwgdW5pdHMpKSAmJlxuICAgICAgICAgICAgKGluY2x1c2l2aXR5WzFdID09PSAnKSdcbiAgICAgICAgICAgICAgICA/IHRoaXMuaXNCZWZvcmUobG9jYWxUbywgdW5pdHMpXG4gICAgICAgICAgICAgICAgOiAhdGhpcy5pc0FmdGVyKGxvY2FsVG8sIHVuaXRzKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWUoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCksXG4gICAgICAgICAgICBpbnB1dE1zO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB8fCAnbWlsbGlzZWNvbmQnO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA9PT0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dE1zID0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCkgPD0gaW5wdXRNcyAmJlxuICAgICAgICAgICAgICAgIGlucHV0TXMgPD0gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckFmdGVyKGlucHV0LCB1bml0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NhbWUoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQWZ0ZXIoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckJlZm9yZShpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lKGlucHV0LCB1bml0cykgfHwgdGhpcy5pc0JlZm9yZShpbnB1dCwgdW5pdHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpZmYoaW5wdXQsIHVuaXRzLCBhc0Zsb2F0KSB7XG4gICAgICAgIHZhciB0aGF0LCB6b25lRGVsdGEsIG91dHB1dDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhhdCA9IGNsb25lV2l0aE9mZnNldChpbnB1dCwgdGhpcyk7XG5cbiAgICAgICAgaWYgKCF0aGF0LmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHpvbmVEZWx0YSA9ICh0aGF0LnV0Y09mZnNldCgpIC0gdGhpcy51dGNPZmZzZXQoKSkgKiA2ZTQ7XG5cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpIC8gMTI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpIC8gMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDFlMztcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMFxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gNmU0O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAzNmU1O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwICogMjQsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA2MDQ4ZTU7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwICogMjQgKiA3LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IHRoaXMgLSB0aGF0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFzRmxvYXQgPyBvdXRwdXQgOiBhYnNGbG9vcihvdXRwdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoRGlmZihhLCBiKSB7XG4gICAgICAgIGlmIChhLmRhdGUoKSA8IGIuZGF0ZSgpKSB7XG4gICAgICAgICAgICAvLyBlbmQtb2YtbW9udGggY2FsY3VsYXRpb25zIHdvcmsgY29ycmVjdCB3aGVuIHRoZSBzdGFydCBtb250aCBoYXMgbW9yZVxuICAgICAgICAgICAgLy8gZGF5cyB0aGFuIHRoZSBlbmQgbW9udGguXG4gICAgICAgICAgICByZXR1cm4gLW1vbnRoRGlmZihiLCBhKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkaWZmZXJlbmNlIGluIG1vbnRoc1xuICAgICAgICB2YXIgd2hvbGVNb250aERpZmYgPSAoYi55ZWFyKCkgLSBhLnllYXIoKSkgKiAxMiArIChiLm1vbnRoKCkgLSBhLm1vbnRoKCkpLFxuICAgICAgICAgICAgLy8gYiBpcyBpbiAoYW5jaG9yIC0gMSBtb250aCwgYW5jaG9yICsgMSBtb250aClcbiAgICAgICAgICAgIGFuY2hvciA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYsICdtb250aHMnKSxcbiAgICAgICAgICAgIGFuY2hvcjIsXG4gICAgICAgICAgICBhZGp1c3Q7XG5cbiAgICAgICAgaWYgKGIgLSBhbmNob3IgPCAwKSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiAtIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yIC0gYW5jaG9yMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiArIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yMiAtIGFuY2hvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGZvciBuZWdhdGl2ZSB6ZXJvLCByZXR1cm4gemVybyBpZiBuZWdhdGl2ZSB6ZXJvXG4gICAgICAgIHJldHVybiAtKHdob2xlTW9udGhEaWZmICsgYWRqdXN0KSB8fCAwO1xuICAgIH1cblxuICAgIGhvb2tzLmRlZmF1bHRGb3JtYXQgPSAnWVlZWS1NTS1ERFRISDptbTpzc1onO1xuICAgIGhvb2tzLmRlZmF1bHRGb3JtYXRVdGMgPSAnWVlZWS1NTS1ERFRISDptbTpzc1taXSc7XG5cbiAgICBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5sb2NhbGUoJ2VuJykuZm9ybWF0KCdkZGQgTU1NIEREIFlZWVkgSEg6bW06c3MgW0dNVF1aWicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSVNPU3RyaW5nKGtlZXBPZmZzZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHV0YyA9IGtlZXBPZmZzZXQgIT09IHRydWUsXG4gICAgICAgICAgICBtID0gdXRjID8gdGhpcy5jbG9uZSgpLnV0YygpIDogdGhpcztcbiAgICAgICAgaWYgKG0ueWVhcigpIDwgMCB8fCBtLnllYXIoKSA+IDk5OTkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRNb21lbnQoXG4gICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICB1dGNcbiAgICAgICAgICAgICAgICAgICAgPyAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJ1xuICAgICAgICAgICAgICAgICAgICA6ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGdW5jdGlvbihEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZykpIHtcbiAgICAgICAgICAgIC8vIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB+NTB4IGZhc3RlciwgdXNlIGl0IHdoZW4gd2UgY2FuXG4gICAgICAgICAgICBpZiAodXRjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpICsgdGhpcy51dGNPZmZzZXQoKSAqIDYwICogMTAwMClcbiAgICAgICAgICAgICAgICAgICAgLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1onLCBmb3JtYXRNb21lbnQobSwgJ1onKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChcbiAgICAgICAgICAgIG0sXG4gICAgICAgICAgICB1dGMgPyAnWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXScgOiAnWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1onXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgaHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgYSBtb21lbnQgdGhhdCBjYW5cbiAgICAgKiBhbHNvIGJlIGV2YWx1YXRlZCB0byBnZXQgYSBuZXcgbW9tZW50IHdoaWNoIGlzIHRoZSBzYW1lXG4gICAgICpcbiAgICAgKiBAbGluayBodHRwczovL25vZGVqcy5vcmcvZGlzdC9sYXRlc3QvZG9jcy9hcGkvdXRpbC5odG1sI3V0aWxfY3VzdG9tX2luc3BlY3RfZnVuY3Rpb25fb25fb2JqZWN0c1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnbW9tZW50LmludmFsaWQoLyogJyArIHRoaXMuX2kgKyAnICovKSc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZ1bmMgPSAnbW9tZW50JyxcbiAgICAgICAgICAgIHpvbmUgPSAnJyxcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgIHllYXIsXG4gICAgICAgICAgICBkYXRldGltZSxcbiAgICAgICAgICAgIHN1ZmZpeDtcbiAgICAgICAgaWYgKCF0aGlzLmlzTG9jYWwoKSkge1xuICAgICAgICAgICAgZnVuYyA9IHRoaXMudXRjT2Zmc2V0KCkgPT09IDAgPyAnbW9tZW50LnV0YycgOiAnbW9tZW50LnBhcnNlWm9uZSc7XG4gICAgICAgICAgICB6b25lID0gJ1onO1xuICAgICAgICB9XG4gICAgICAgIHByZWZpeCA9ICdbJyArIGZ1bmMgKyAnKFwiXSc7XG4gICAgICAgIHllYXIgPSAwIDw9IHRoaXMueWVhcigpICYmIHRoaXMueWVhcigpIDw9IDk5OTkgPyAnWVlZWScgOiAnWVlZWVlZJztcbiAgICAgICAgZGF0ZXRpbWUgPSAnLU1NLUREW1RdSEg6bW06c3MuU1NTJztcbiAgICAgICAgc3VmZml4ID0gem9uZSArICdbXCIpXSc7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KHByZWZpeCArIHllYXIgKyBkYXRldGltZSArIHN1ZmZpeCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm9ybWF0KGlucHV0U3RyaW5nKSB7XG4gICAgICAgIGlmICghaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgICAgIGlucHV0U3RyaW5nID0gdGhpcy5pc1V0YygpXG4gICAgICAgICAgICAgICAgPyBob29rcy5kZWZhdWx0Rm9ybWF0VXRjXG4gICAgICAgICAgICAgICAgOiBob29rcy5kZWZhdWx0Rm9ybWF0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSBmb3JtYXRNb21lbnQodGhpcywgaW5wdXRTdHJpbmcpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZyb20odGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgKChpc01vbWVudCh0aW1lKSAmJiB0aW1lLmlzVmFsaWQoKSkgfHwgY3JlYXRlTG9jYWwodGltZSkuaXNWYWxpZCgpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7IHRvOiB0aGlzLCBmcm9tOiB0aW1lIH0pXG4gICAgICAgICAgICAgICAgLmxvY2FsZSh0aGlzLmxvY2FsZSgpKVxuICAgICAgICAgICAgICAgIC5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZyb21Ob3cod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8IGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oeyBmcm9tOiB0aGlzLCB0bzogdGltZSB9KVxuICAgICAgICAgICAgICAgIC5sb2NhbGUodGhpcy5sb2NhbGUoKSlcbiAgICAgICAgICAgICAgICAuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b05vdyh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIC8vIElmIHBhc3NlZCBhIGxvY2FsZSBrZXksIGl0IHdpbGwgc2V0IHRoZSBsb2NhbGUgZm9yIHRoaXNcbiAgICAvLyBpbnN0YW5jZS4gIE90aGVyd2lzZSwgaXQgd2lsbCByZXR1cm4gdGhlIGxvY2FsZSBjb25maWd1cmF0aW9uXG4gICAgLy8gdmFyaWFibGVzIGZvciB0aGlzIGluc3RhbmNlLlxuICAgIGZ1bmN0aW9uIGxvY2FsZShrZXkpIHtcbiAgICAgICAgdmFyIG5ld0xvY2FsZURhdGE7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlLl9hYmJyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TG9jYWxlRGF0YSA9IGdldExvY2FsZShrZXkpO1xuICAgICAgICAgICAgaWYgKG5ld0xvY2FsZURhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IG5ld0xvY2FsZURhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsYW5nID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50KCkubGFuZygpIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBtb21lbnQoKS5sb2NhbGVEYXRhKCkgdG8gZ2V0IHRoZSBsYW5ndWFnZSBjb25maWd1cmF0aW9uLiBVc2UgbW9tZW50KCkubG9jYWxlKCkgdG8gY2hhbmdlIGxhbmd1YWdlcy4nLFxuICAgICAgICBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZURhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgdmFyIE1TX1BFUl9TRUNPTkQgPSAxMDAwLFxuICAgICAgICBNU19QRVJfTUlOVVRFID0gNjAgKiBNU19QRVJfU0VDT05ELFxuICAgICAgICBNU19QRVJfSE9VUiA9IDYwICogTVNfUEVSX01JTlVURSxcbiAgICAgICAgTVNfUEVSXzQwMF9ZRUFSUyA9ICgzNjUgKiA0MDAgKyA5NykgKiAyNCAqIE1TX1BFUl9IT1VSO1xuXG4gICAgLy8gYWN0dWFsIG1vZHVsbyAtIGhhbmRsZXMgbmVnYXRpdmUgbnVtYmVycyAoZm9yIGRhdGVzIGJlZm9yZSAxOTcwKTpcbiAgICBmdW5jdGlvbiBtb2QkMShkaXZpZGVuZCwgZGl2aXNvcikge1xuICAgICAgICByZXR1cm4gKChkaXZpZGVuZCAlIGRpdmlzb3IpICsgZGl2aXNvcikgJSBkaXZpc29yO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsU3RhcnRPZkRhdGUoeSwgbSwgZCkge1xuICAgICAgICAvLyB0aGUgZGF0ZSBjb25zdHJ1Y3RvciByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHkgKyA0MDAsIG0sIGQpIC0gTVNfUEVSXzQwMF9ZRUFSUztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh5LCBtLCBkKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1dGNTdGFydE9mRGF0ZSh5LCBtLCBkKSB7XG4gICAgICAgIC8vIERhdGUuVVRDIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICByZXR1cm4gRGF0ZS5VVEMoeSArIDQwMCwgbSwgZCkgLSBNU19QRVJfNDAwX1lFQVJTO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIERhdGUuVVRDKHksIG0sIGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RhcnRPZih1bml0cykge1xuICAgICAgICB2YXIgdGltZSwgc3RhcnRPZkRhdGU7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICBpZiAodW5pdHMgPT09IHVuZGVmaW5lZCB8fCB1bml0cyA9PT0gJ21pbGxpc2Vjb25kJyB8fCAhdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnRPZkRhdGUgPSB0aGlzLl9pc1VUQyA/IHV0Y1N0YXJ0T2ZEYXRlIDogbG9jYWxTdGFydE9mRGF0ZTtcblxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIDAsIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpIC0gKHRoaXMubW9udGgoKSAlIDMpLFxuICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gdGhpcy53ZWVrZGF5KClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaXNvV2Vlayc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEoXG4gICAgICAgICAgICAgICAgICAgIHRpbWUgKyAodGhpcy5faXNVVEMgPyAwIDogdGhpcy51dGNPZmZzZXQoKSAqIE1TX1BFUl9NSU5VVEUpLFxuICAgICAgICAgICAgICAgICAgICBNU19QRVJfSE9VUlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKHRpbWUsIE1TX1BFUl9NSU5VVEUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSAtPSBtb2QkMSh0aW1lLCBNU19QRVJfU0VDT05EKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Quc2V0VGltZSh0aW1lKTtcbiAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmRPZih1bml0cykge1xuICAgICAgICB2YXIgdGltZSwgc3RhcnRPZkRhdGU7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICBpZiAodW5pdHMgPT09IHVuZGVmaW5lZCB8fCB1bml0cyA9PT0gJ21pbGxpc2Vjb25kJyB8fCAhdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnRPZkRhdGUgPSB0aGlzLl9pc1VUQyA/IHV0Y1N0YXJ0T2ZEYXRlIDogbG9jYWxTdGFydE9mRGF0ZTtcblxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCkgKyAxLCAwLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICB0aW1lID1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSAtICh0aGlzLm1vbnRoKCkgJSAzKSArIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgICkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpICsgMSwgMSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgdGltZSA9XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUoKSAtIHRoaXMud2Vla2RheSgpICsgN1xuICAgICAgICAgICAgICAgICAgICApIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgICAgICAgICBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSAodGhpcy5pc29XZWVrZGF5KCkgLSAxKSArIDdcbiAgICAgICAgICAgICAgICAgICAgKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCksIHRoaXMuZGF0ZSgpICsgMSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgKz1cbiAgICAgICAgICAgICAgICAgICAgTVNfUEVSX0hPVVIgLVxuICAgICAgICAgICAgICAgICAgICBtb2QkMShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgKyAodGhpcy5faXNVVEMgPyAwIDogdGhpcy51dGNPZmZzZXQoKSAqIE1TX1BFUl9NSU5VVEUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgTVNfUEVSX0hPVVJcbiAgICAgICAgICAgICAgICAgICAgKSAtXG4gICAgICAgICAgICAgICAgICAgIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9NSU5VVEUgLSBtb2QkMSh0aW1lLCBNU19QRVJfTUlOVVRFKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9TRUNPTkQgLSBtb2QkMSh0aW1lLCBNU19QRVJfU0VDT05EKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kLnNldFRpbWUodGltZSk7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsdWVPZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2QudmFsdWVPZigpIC0gKHRoaXMuX29mZnNldCB8fCAwKSAqIDYwMDAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuaXgoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9EYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG0ueWVhcigpLFxuICAgICAgICAgICAgbS5tb250aCgpLFxuICAgICAgICAgICAgbS5kYXRlKCksXG4gICAgICAgICAgICBtLmhvdXIoKSxcbiAgICAgICAgICAgIG0ubWludXRlKCksXG4gICAgICAgICAgICBtLnNlY29uZCgpLFxuICAgICAgICAgICAgbS5taWxsaXNlY29uZCgpLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvT2JqZWN0KCkge1xuICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyczogbS55ZWFyKCksXG4gICAgICAgICAgICBtb250aHM6IG0ubW9udGgoKSxcbiAgICAgICAgICAgIGRhdGU6IG0uZGF0ZSgpLFxuICAgICAgICAgICAgaG91cnM6IG0uaG91cnMoKSxcbiAgICAgICAgICAgIG1pbnV0ZXM6IG0ubWludXRlcygpLFxuICAgICAgICAgICAgc2Vjb25kczogbS5zZWNvbmRzKCksXG4gICAgICAgICAgICBtaWxsaXNlY29uZHM6IG0ubWlsbGlzZWNvbmRzKCksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgICAvLyBuZXcgRGF0ZShOYU4pLnRvSlNPTigpID09PSBudWxsXG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMudG9JU09TdHJpbmcoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZCQyKCkge1xuICAgICAgICByZXR1cm4gaXNWYWxpZCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzaW5nRmxhZ3MoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIGdldFBhcnNpbmdGbGFncyh0aGlzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52YWxpZEF0KCkge1xuICAgICAgICByZXR1cm4gZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpLm92ZXJmbG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0aW9uRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlucHV0OiB0aGlzLl9pLFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLl9mLFxuICAgICAgICAgICAgbG9jYWxlOiB0aGlzLl9sb2NhbGUsXG4gICAgICAgICAgICBpc1VUQzogdGhpcy5faXNVVEMsXG4gICAgICAgICAgICBzdHJpY3Q6IHRoaXMuX3N0cmljdCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTicsIDAsIDAsICdlcmFBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OJywgMCwgMCwgJ2VyYUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignTk5OJywgMCwgMCwgJ2VyYUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignTk5OTicsIDAsIDAsICdlcmFOYW1lJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OTk5OJywgMCwgMCwgJ2VyYU5hcnJvdycpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3knLCAxXSwgJ3lvJywgJ2VyYVllYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigneScsIFsneXknLCAyXSwgMCwgJ2VyYVllYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigneScsIFsneXl5JywgM10sIDAsICdlcmFZZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3l5eXknLCA0XSwgMCwgJ2VyYVllYXInKTtcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ04nLCBtYXRjaEVyYUFiYnIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ05OJywgbWF0Y2hFcmFBYmJyKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTk4nLCBtYXRjaEVyYUFiYnIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ05OTk4nLCBtYXRjaEVyYU5hbWUpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ05OTk5OJywgbWF0Y2hFcmFOYXJyb3cpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihcbiAgICAgICAgWydOJywgJ05OJywgJ05OTicsICdOTk5OJywgJ05OTk5OJ10sXG4gICAgICAgIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgICAgIHZhciBlcmEgPSBjb25maWcuX2xvY2FsZS5lcmFzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgICAgICBpZiAoZXJhKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZXJhID0gZXJhO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkRXJhID0gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgYWRkUmVnZXhUb2tlbigneScsIG1hdGNoVW5zaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3l5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneXl5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneXl5eScsIG1hdGNoVW5zaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3lvJywgbWF0Y2hFcmFZZWFyT3JkaW5hbCk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsneScsICd5eScsICd5eXknLCAneXl5eSddLCBZRUFSKTtcbiAgICBhZGRQYXJzZVRva2VuKFsneW8nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgbWF0Y2g7XG4gICAgICAgIGlmIChjb25maWcuX2xvY2FsZS5fZXJhWWVhck9yZGluYWxSZWdleCkge1xuICAgICAgICAgICAgbWF0Y2ggPSBpbnB1dC5tYXRjaChjb25maWcuX2xvY2FsZS5fZXJhWWVhck9yZGluYWxSZWdleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9sb2NhbGUuZXJhWWVhck9yZGluYWxQYXJzZSkge1xuICAgICAgICAgICAgYXJyYXlbWUVBUl0gPSBjb25maWcuX2xvY2FsZS5lcmFZZWFyT3JkaW5hbFBhcnNlKGlucHV0LCBtYXRjaCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcnJheVtZRUFSXSA9IHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUVyYXMobSwgZm9ybWF0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5fZXJhcyB8fCBnZXRMb2NhbGUoJ2VuJykuX2VyYXM7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGhvb2tzKGVyYXNbaV0uc2luY2UpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLnNpbmNlID0gZGF0ZS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgICAgICAgICAgICAgZXJhc1tpXS51bnRpbCA9ICtJbmZpbml0eTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gaG9va3MoZXJhc1tpXS51bnRpbCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLnVudGlsID0gZGF0ZS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcmFzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUVyYXNQYXJzZShlcmFOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5lcmFzKCksXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgYWJicixcbiAgICAgICAgICAgIG5hcnJvdztcbiAgICAgICAgZXJhTmFtZSA9IGVyYU5hbWUudG9VcHBlckNhc2UoKTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIG5hbWUgPSBlcmFzW2ldLm5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGFiYnIgPSBlcmFzW2ldLmFiYnIudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIG5hcnJvdyA9IGVyYXNbaV0ubmFycm93LnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdOJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTk4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFiYnIgPT09IGVyYU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OTk4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGVyYU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OTk5OJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXJyb3cgPT09IGVyYU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoW25hbWUsIGFiYnIsIG5hcnJvd10uaW5kZXhPZihlcmFOYW1lKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVFcmFzQ29udmVydFllYXIoZXJhLCB5ZWFyKSB7XG4gICAgICAgIHZhciBkaXIgPSBlcmEuc2luY2UgPD0gZXJhLnVudGlsID8gKzEgOiAtMTtcbiAgICAgICAgaWYgKHllYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhvb2tzKGVyYS5zaW5jZSkueWVhcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhvb2tzKGVyYS5zaW5jZSkueWVhcigpICsgKHllYXIgLSBlcmEub2Zmc2V0KSAqIGRpcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYU5hbWUoKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhTmFycm93KCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5sb2NhbGVEYXRhKCkuZXJhcygpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnNpbmNlIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS51bnRpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLm5hcnJvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLm5hcnJvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFcmFBYmJyKCkge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlcmFzID0gdGhpcy5sb2NhbGVEYXRhKCkuZXJhcygpO1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gZXJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgIC8vIHRydW5jYXRlIHRpbWVcbiAgICAgICAgICAgIHZhbCA9IHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnNpbmNlIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS51bnRpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLmFiYnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJhc1tpXS51bnRpbCA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0uc2luY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5hYmJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYVllYXIoKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGRpcixcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgZGlyID0gZXJhc1tpXS5zaW5jZSA8PSBlcmFzW2ldLnVudGlsID8gKzEgOiAtMTtcblxuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChlcmFzW2ldLnNpbmNlIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS51bnRpbCkgfHxcbiAgICAgICAgICAgICAgICAoZXJhc1tpXS51bnRpbCA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0uc2luY2UpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAodGhpcy55ZWFyKCkgLSBob29rcyhlcmFzW2ldLnNpbmNlKS55ZWFyKCkpICogZGlyICtcbiAgICAgICAgICAgICAgICAgICAgZXJhc1tpXS5vZmZzZXRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMueWVhcigpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVyYXNOYW1lUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfZXJhc05hbWVSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlRXJhc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID8gdGhpcy5fZXJhc05hbWVSZWdleCA6IHRoaXMuX2VyYXNSZWdleDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcmFzQWJiclJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX2VyYXNBYmJyUmVnZXgnKSkge1xuICAgICAgICAgICAgY29tcHV0ZUVyYXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1N0cmljdCA/IHRoaXMuX2VyYXNBYmJyUmVnZXggOiB0aGlzLl9lcmFzUmVnZXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJhc05hcnJvd1JlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX2VyYXNOYXJyb3dSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlRXJhc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID8gdGhpcy5fZXJhc05hcnJvd1JlZ2V4IDogdGhpcy5fZXJhc1JlZ2V4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhQWJicihpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZXJhc0FiYnJSZWdleChpc1N0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hFcmFOYW1lKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5lcmFzTmFtZVJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYU5hcnJvdyhpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZXJhc05hcnJvd1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYVllYXJPcmRpbmFsKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fZXJhWWVhck9yZGluYWxSZWdleCB8fCBtYXRjaFVuc2lnbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVFcmFzUGFyc2UoKSB7XG4gICAgICAgIHZhciBhYmJyUGllY2VzID0gW10sXG4gICAgICAgICAgICBuYW1lUGllY2VzID0gW10sXG4gICAgICAgICAgICBuYXJyb3dQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGVyYXNOYW1lLFxuICAgICAgICAgICAgZXJhc0FiYnIsXG4gICAgICAgICAgICBlcmFzTmFycm93LFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMuZXJhcygpO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgZXJhc05hbWUgPSByZWdleEVzY2FwZShlcmFzW2ldLm5hbWUpO1xuICAgICAgICAgICAgZXJhc0FiYnIgPSByZWdleEVzY2FwZShlcmFzW2ldLmFiYnIpO1xuICAgICAgICAgICAgZXJhc05hcnJvdyA9IHJlZ2V4RXNjYXBlKGVyYXNbaV0ubmFycm93KTtcblxuICAgICAgICAgICAgbmFtZVBpZWNlcy5wdXNoKGVyYXNOYW1lKTtcbiAgICAgICAgICAgIGFiYnJQaWVjZXMucHVzaChlcmFzQWJicik7XG4gICAgICAgICAgICBuYXJyb3dQaWVjZXMucHVzaChlcmFzTmFycm93KTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2goZXJhc05hbWUpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChlcmFzQWJicik7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGVyYXNOYXJyb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZXJhc1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9lcmFzTmFtZVJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbmFtZVBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX2VyYXNBYmJyUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBhYmJyUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fZXJhc05hcnJvd1JlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBuYXJyb3dQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydnZycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ0dHJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4odG9rZW4sIGdldHRlcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbigwLCBbdG9rZW4sIHRva2VuLmxlbmd0aF0sIDAsIGdldHRlcik7XG4gICAgfVxuXG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZycsICd3ZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2dnJywgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHRycsICdpc29XZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdHJywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2cnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHRycsIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdnZ2dnJywgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHR0dHJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2dnJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oXG4gICAgICAgIFsnZ2dnZycsICdnZ2dnZycsICdHR0dHJywgJ0dHR0dHJ10sXG4gICAgICAgIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICAgICAgd2Vla1t0b2tlbi5zdWJzdHIoMCwgMildID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICB9XG4gICAgKTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZ2cnLCAnR0cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW5dID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB0aGlzLndlZWsoKSxcbiAgICAgICAgICAgIHRoaXMud2Vla2RheSgpICsgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93LFxuICAgICAgICAgICAgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93LFxuICAgICAgICAgICAgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG95XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2Vla1llYXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB0aGlzLmlzb1dlZWsoKSxcbiAgICAgICAgICAgIHRoaXMuaXNvV2Vla2RheSgpLFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIDRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJU09XZWVrc0luWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJU09XZWVrc0luSVNPV2Vla1llYXIoKSB7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLmlzb1dlZWtZZWFyKCksIDEsIDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFdlZWtzSW5ZZWFyKCkge1xuICAgICAgICB2YXIgd2Vla0luZm8gPSB0aGlzLmxvY2FsZURhdGEoKS5fd2VlaztcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCB3ZWVrSW5mby5kb3csIHdlZWtJbmZvLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0V2Vla3NJbldlZWtZZWFyKCkge1xuICAgICAgICB2YXIgd2Vla0luZm8gPSB0aGlzLmxvY2FsZURhdGEoKS5fd2VlaztcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMud2Vla1llYXIoKSwgd2Vla0luZm8uZG93LCB3ZWVrSW5mby5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFySGVscGVyKGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla3NUYXJnZXQ7XG4gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla09mWWVhcih0aGlzLCBkb3csIGRveSkueWVhcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdlZWtzVGFyZ2V0ID0gd2Vla3NJblllYXIoaW5wdXQsIGRvdywgZG95KTtcbiAgICAgICAgICAgIGlmICh3ZWVrID4gd2Vla3NUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICB3ZWVrID0gd2Vla3NUYXJnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2V0V2Vla0FsbC5jYWxsKHRoaXMsIGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRXZWVrQWxsKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgZGF5T2ZZZWFyRGF0YSA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoZGF5T2ZZZWFyRGF0YS55ZWFyLCAwLCBkYXlPZlllYXJEYXRhLmRheU9mWWVhcik7XG5cbiAgICAgICAgdGhpcy55ZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSk7XG4gICAgICAgIHRoaXMubW9udGgoZGF0ZS5nZXRVVENNb250aCgpKTtcbiAgICAgICAgdGhpcy5kYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1EnLCAwLCAnUW8nLCAncXVhcnRlcicpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUScsIG1hdGNoMSk7XG4gICAgYWRkUGFyc2VUb2tlbignUScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTU9OVEhdID0gKHRvSW50KGlucHV0KSAtIDEpICogMztcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFF1YXJ0ZXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGxcbiAgICAgICAgICAgID8gTWF0aC5jZWlsKCh0aGlzLm1vbnRoKCkgKyAxKSAvIDMpXG4gICAgICAgICAgICA6IHRoaXMubW9udGgoKGlucHV0IC0gMSkgKiAzICsgKHRoaXMubW9udGgoKSAlIDMpKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignRCcsIFsnREQnLCAyXSwgJ0RvJywgJ2RhdGUnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0QnLCBtYXRjaDF0bzIsIG1hdGNoMXRvMk5vTGVhZGluZ1plcm8pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0REJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICByZXR1cm4gaXNTdHJpY3RcbiAgICAgICAgICAgID8gbG9jYWxlLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlIHx8IGxvY2FsZS5fb3JkaW5hbFBhcnNlXG4gICAgICAgICAgICA6IGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZUxlbmllbnQ7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnRCcsICdERCddLCBEQVRFKTtcbiAgICBhZGRQYXJzZVRva2VuKCdEbycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbREFURV0gPSB0b0ludChpbnB1dC5tYXRjaChtYXRjaDF0bzIpWzBdKTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXREYXlPZk1vbnRoID0gbWFrZUdldFNldCgnRGF0ZScsIHRydWUpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0RERCcsIFsnRERERCcsIDNdLCAnREREbycsICdkYXlPZlllYXInKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0RERCcsIG1hdGNoMXRvMyk7XG4gICAgYWRkUmVnZXhUb2tlbignRERERCcsIG1hdGNoMyk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ0RERCcsICdEREREJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mWWVhcihpbnB1dCkge1xuICAgICAgICB2YXIgZGF5T2ZZZWFyID1cbiAgICAgICAgICAgIE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgKHRoaXMuY2xvbmUoKS5zdGFydE9mKCdkYXknKSAtIHRoaXMuY2xvbmUoKS5zdGFydE9mKCd5ZWFyJykpIC8gODY0ZTVcbiAgICAgICAgICAgICkgKyAxO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IGRheU9mWWVhciA6IHRoaXMuYWRkKGlucHV0IC0gZGF5T2ZZZWFyLCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdtJywgWydtbScsIDJdLCAwLCAnbWludXRlJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdtJywgbWF0Y2gxdG8yLCBtYXRjaDF0bzJIYXNaZXJvKTtcbiAgICBhZGRSZWdleFRva2VuKCdtbScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnbScsICdtbSddLCBNSU5VVEUpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldE1pbnV0ZSA9IG1ha2VHZXRTZXQoJ01pbnV0ZXMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigncycsIFsnc3MnLCAyXSwgMCwgJ3NlY29uZCcpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigncycsIG1hdGNoMXRvMiwgbWF0Y2gxdG8ySGFzWmVybyk7XG4gICAgYWRkUmVnZXhUb2tlbignc3MnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUGFyc2VUb2tlbihbJ3MnLCAnc3MnXSwgU0VDT05EKTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRTZWNvbmQgPSBtYWtlR2V0U2V0KCdTZWNvbmRzJywgZmFsc2UpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMDApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTUycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB+fih0aGlzLm1pbGxpc2Vjb25kKCkgLyAxMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTUycsIDNdLCAwLCAnbWlsbGlzZWNvbmQnKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1MnLCA0XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTUycsIDVdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1MnLCA2XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1MnLCA3XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTUycsIDhdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTU1MnLCA5XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwMDtcbiAgICB9KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1MnLCBtYXRjaDF0bzMsIG1hdGNoMSk7XG4gICAgYWRkUmVnZXhUb2tlbignU1MnLCBtYXRjaDF0bzMsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignU1NTJywgbWF0Y2gxdG8zLCBtYXRjaDMpO1xuXG4gICAgdmFyIHRva2VuLCBnZXRTZXRNaWxsaXNlY29uZDtcbiAgICBmb3IgKHRva2VuID0gJ1NTU1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgICAgIGFkZFJlZ2V4VG9rZW4odG9rZW4sIG1hdGNoVW5zaWduZWQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlTXMoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01JTExJU0VDT05EXSA9IHRvSW50KCgnMC4nICsgaW5wdXQpICogMTAwMCk7XG4gICAgfVxuXG4gICAgZm9yICh0b2tlbiA9ICdTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBwYXJzZU1zKTtcbiAgICB9XG5cbiAgICBnZXRTZXRNaWxsaXNlY29uZCA9IG1ha2VHZXRTZXQoJ01pbGxpc2Vjb25kcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd6JywgMCwgMCwgJ3pvbmVBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3p6JywgMCwgMCwgJ3pvbmVOYW1lJyk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRab25lQWJicigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gJ1VUQycgOiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRab25lTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gJ0Nvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lJyA6ICcnO1xuICAgIH1cblxuICAgIHZhciBwcm90byA9IE1vbWVudC5wcm90b3R5cGU7XG5cbiAgICBwcm90by5hZGQgPSBhZGQ7XG4gICAgcHJvdG8uY2FsZW5kYXIgPSBjYWxlbmRhciQxO1xuICAgIHByb3RvLmNsb25lID0gY2xvbmU7XG4gICAgcHJvdG8uZGlmZiA9IGRpZmY7XG4gICAgcHJvdG8uZW5kT2YgPSBlbmRPZjtcbiAgICBwcm90by5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgcHJvdG8uZnJvbSA9IGZyb207XG4gICAgcHJvdG8uZnJvbU5vdyA9IGZyb21Ob3c7XG4gICAgcHJvdG8udG8gPSB0bztcbiAgICBwcm90by50b05vdyA9IHRvTm93O1xuICAgIHByb3RvLmdldCA9IHN0cmluZ0dldDtcbiAgICBwcm90by5pbnZhbGlkQXQgPSBpbnZhbGlkQXQ7XG4gICAgcHJvdG8uaXNBZnRlciA9IGlzQWZ0ZXI7XG4gICAgcHJvdG8uaXNCZWZvcmUgPSBpc0JlZm9yZTtcbiAgICBwcm90by5pc0JldHdlZW4gPSBpc0JldHdlZW47XG4gICAgcHJvdG8uaXNTYW1lID0gaXNTYW1lO1xuICAgIHByb3RvLmlzU2FtZU9yQWZ0ZXIgPSBpc1NhbWVPckFmdGVyO1xuICAgIHByb3RvLmlzU2FtZU9yQmVmb3JlID0gaXNTYW1lT3JCZWZvcmU7XG4gICAgcHJvdG8uaXNWYWxpZCA9IGlzVmFsaWQkMjtcbiAgICBwcm90by5sYW5nID0gbGFuZztcbiAgICBwcm90by5sb2NhbGUgPSBsb2NhbGU7XG4gICAgcHJvdG8ubG9jYWxlRGF0YSA9IGxvY2FsZURhdGE7XG4gICAgcHJvdG8ubWF4ID0gcHJvdG90eXBlTWF4O1xuICAgIHByb3RvLm1pbiA9IHByb3RvdHlwZU1pbjtcbiAgICBwcm90by5wYXJzaW5nRmxhZ3MgPSBwYXJzaW5nRmxhZ3M7XG4gICAgcHJvdG8uc2V0ID0gc3RyaW5nU2V0O1xuICAgIHByb3RvLnN0YXJ0T2YgPSBzdGFydE9mO1xuICAgIHByb3RvLnN1YnRyYWN0ID0gc3VidHJhY3Q7XG4gICAgcHJvdG8udG9BcnJheSA9IHRvQXJyYXk7XG4gICAgcHJvdG8udG9PYmplY3QgPSB0b09iamVjdDtcbiAgICBwcm90by50b0RhdGUgPSB0b0RhdGU7XG4gICAgcHJvdG8udG9JU09TdHJpbmcgPSB0b0lTT1N0cmluZztcbiAgICBwcm90by5pbnNwZWN0ID0gaW5zcGVjdDtcbiAgICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLmZvciAhPSBudWxsKSB7XG4gICAgICAgIHByb3RvW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuICdNb21lbnQ8JyArIHRoaXMuZm9ybWF0KCkgKyAnPic7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHByb3RvLnRvSlNPTiA9IHRvSlNPTjtcbiAgICBwcm90by50b1N0cmluZyA9IHRvU3RyaW5nO1xuICAgIHByb3RvLnVuaXggPSB1bml4O1xuICAgIHByb3RvLnZhbHVlT2YgPSB2YWx1ZU9mO1xuICAgIHByb3RvLmNyZWF0aW9uRGF0YSA9IGNyZWF0aW9uRGF0YTtcbiAgICBwcm90by5lcmFOYW1lID0gZ2V0RXJhTmFtZTtcbiAgICBwcm90by5lcmFOYXJyb3cgPSBnZXRFcmFOYXJyb3c7XG4gICAgcHJvdG8uZXJhQWJiciA9IGdldEVyYUFiYnI7XG4gICAgcHJvdG8uZXJhWWVhciA9IGdldEVyYVllYXI7XG4gICAgcHJvdG8ueWVhciA9IGdldFNldFllYXI7XG4gICAgcHJvdG8uaXNMZWFwWWVhciA9IGdldElzTGVhcFllYXI7XG4gICAgcHJvdG8ud2Vla1llYXIgPSBnZXRTZXRXZWVrWWVhcjtcbiAgICBwcm90by5pc29XZWVrWWVhciA9IGdldFNldElTT1dlZWtZZWFyO1xuICAgIHByb3RvLnF1YXJ0ZXIgPSBwcm90by5xdWFydGVycyA9IGdldFNldFF1YXJ0ZXI7XG4gICAgcHJvdG8ubW9udGggPSBnZXRTZXRNb250aDtcbiAgICBwcm90by5kYXlzSW5Nb250aCA9IGdldERheXNJbk1vbnRoO1xuICAgIHByb3RvLndlZWsgPSBwcm90by53ZWVrcyA9IGdldFNldFdlZWs7XG4gICAgcHJvdG8uaXNvV2VlayA9IHByb3RvLmlzb1dlZWtzID0gZ2V0U2V0SVNPV2VlaztcbiAgICBwcm90by53ZWVrc0luWWVhciA9IGdldFdlZWtzSW5ZZWFyO1xuICAgIHByb3RvLndlZWtzSW5XZWVrWWVhciA9IGdldFdlZWtzSW5XZWVrWWVhcjtcbiAgICBwcm90by5pc29XZWVrc0luWWVhciA9IGdldElTT1dlZWtzSW5ZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtzSW5JU09XZWVrWWVhciA9IGdldElTT1dlZWtzSW5JU09XZWVrWWVhcjtcbiAgICBwcm90by5kYXRlID0gZ2V0U2V0RGF5T2ZNb250aDtcbiAgICBwcm90by5kYXkgPSBwcm90by5kYXlzID0gZ2V0U2V0RGF5T2ZXZWVrO1xuICAgIHByb3RvLndlZWtkYXkgPSBnZXRTZXRMb2NhbGVEYXlPZldlZWs7XG4gICAgcHJvdG8uaXNvV2Vla2RheSA9IGdldFNldElTT0RheU9mV2VlaztcbiAgICBwcm90by5kYXlPZlllYXIgPSBnZXRTZXREYXlPZlllYXI7XG4gICAgcHJvdG8uaG91ciA9IHByb3RvLmhvdXJzID0gZ2V0U2V0SG91cjtcbiAgICBwcm90by5taW51dGUgPSBwcm90by5taW51dGVzID0gZ2V0U2V0TWludXRlO1xuICAgIHByb3RvLnNlY29uZCA9IHByb3RvLnNlY29uZHMgPSBnZXRTZXRTZWNvbmQ7XG4gICAgcHJvdG8ubWlsbGlzZWNvbmQgPSBwcm90by5taWxsaXNlY29uZHMgPSBnZXRTZXRNaWxsaXNlY29uZDtcbiAgICBwcm90by51dGNPZmZzZXQgPSBnZXRTZXRPZmZzZXQ7XG4gICAgcHJvdG8udXRjID0gc2V0T2Zmc2V0VG9VVEM7XG4gICAgcHJvdG8ubG9jYWwgPSBzZXRPZmZzZXRUb0xvY2FsO1xuICAgIHByb3RvLnBhcnNlWm9uZSA9IHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0O1xuICAgIHByb3RvLmhhc0FsaWduZWRIb3VyT2Zmc2V0ID0gaGFzQWxpZ25lZEhvdXJPZmZzZXQ7XG4gICAgcHJvdG8uaXNEU1QgPSBpc0RheWxpZ2h0U2F2aW5nVGltZTtcbiAgICBwcm90by5pc0xvY2FsID0gaXNMb2NhbDtcbiAgICBwcm90by5pc1V0Y09mZnNldCA9IGlzVXRjT2Zmc2V0O1xuICAgIHByb3RvLmlzVXRjID0gaXNVdGM7XG4gICAgcHJvdG8uaXNVVEMgPSBpc1V0YztcbiAgICBwcm90by56b25lQWJiciA9IGdldFpvbmVBYmJyO1xuICAgIHByb3RvLnpvbmVOYW1lID0gZ2V0Wm9uZU5hbWU7XG4gICAgcHJvdG8uZGF0ZXMgPSBkZXByZWNhdGUoXG4gICAgICAgICdkYXRlcyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgZGF0ZSBpbnN0ZWFkLicsXG4gICAgICAgIGdldFNldERheU9mTW9udGhcbiAgICApO1xuICAgIHByb3RvLm1vbnRocyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbnRocyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgbW9udGggaW5zdGVhZCcsXG4gICAgICAgIGdldFNldE1vbnRoXG4gICAgKTtcbiAgICBwcm90by55ZWFycyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ3llYXJzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSB5ZWFyIGluc3RlYWQnLFxuICAgICAgICBnZXRTZXRZZWFyXG4gICAgKTtcbiAgICBwcm90by56b25lID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50KCkuem9uZSBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50KCkudXRjT2Zmc2V0IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3Mvem9uZS8nLFxuICAgICAgICBnZXRTZXRab25lXG4gICAgKTtcbiAgICBwcm90by5pc0RTVFNoaWZ0ZWQgPSBkZXByZWNhdGUoXG4gICAgICAgICdpc0RTVFNoaWZ0ZWQgaXMgZGVwcmVjYXRlZC4gU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZHN0LXNoaWZ0ZWQvIGZvciBtb3JlIGluZm9ybWF0aW9uJyxcbiAgICAgICAgaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkXG4gICAgKTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVuaXgoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0ICogMTAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW5ab25lKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5wYXJzZVpvbmUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVQYXJzZVBvc3RGb3JtYXQoc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvJDEgPSBMb2NhbGUucHJvdG90eXBlO1xuXG4gICAgcHJvdG8kMS5jYWxlbmRhciA9IGNhbGVuZGFyO1xuICAgIHByb3RvJDEubG9uZ0RhdGVGb3JtYXQgPSBsb25nRGF0ZUZvcm1hdDtcbiAgICBwcm90byQxLmludmFsaWREYXRlID0gaW52YWxpZERhdGU7XG4gICAgcHJvdG8kMS5vcmRpbmFsID0gb3JkaW5hbDtcbiAgICBwcm90byQxLnByZXBhcnNlID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucG9zdGZvcm1hdCA9IHByZVBhcnNlUG9zdEZvcm1hdDtcbiAgICBwcm90byQxLnJlbGF0aXZlVGltZSA9IHJlbGF0aXZlVGltZTtcbiAgICBwcm90byQxLnBhc3RGdXR1cmUgPSBwYXN0RnV0dXJlO1xuICAgIHByb3RvJDEuc2V0ID0gc2V0O1xuICAgIHByb3RvJDEuZXJhcyA9IGxvY2FsZUVyYXM7XG4gICAgcHJvdG8kMS5lcmFzUGFyc2UgPSBsb2NhbGVFcmFzUGFyc2U7XG4gICAgcHJvdG8kMS5lcmFzQ29udmVydFllYXIgPSBsb2NhbGVFcmFzQ29udmVydFllYXI7XG4gICAgcHJvdG8kMS5lcmFzQWJiclJlZ2V4ID0gZXJhc0FiYnJSZWdleDtcbiAgICBwcm90byQxLmVyYXNOYW1lUmVnZXggPSBlcmFzTmFtZVJlZ2V4O1xuICAgIHByb3RvJDEuZXJhc05hcnJvd1JlZ2V4ID0gZXJhc05hcnJvd1JlZ2V4O1xuXG4gICAgcHJvdG8kMS5tb250aHMgPSBsb2NhbGVNb250aHM7XG4gICAgcHJvdG8kMS5tb250aHNTaG9ydCA9IGxvY2FsZU1vbnRoc1Nob3J0O1xuICAgIHByb3RvJDEubW9udGhzUGFyc2UgPSBsb2NhbGVNb250aHNQYXJzZTtcbiAgICBwcm90byQxLm1vbnRoc1JlZ2V4ID0gbW9udGhzUmVnZXg7XG4gICAgcHJvdG8kMS5tb250aHNTaG9ydFJlZ2V4ID0gbW9udGhzU2hvcnRSZWdleDtcbiAgICBwcm90byQxLndlZWsgPSBsb2NhbGVXZWVrO1xuICAgIHByb3RvJDEuZmlyc3REYXlPZlllYXIgPSBsb2NhbGVGaXJzdERheU9mWWVhcjtcbiAgICBwcm90byQxLmZpcnN0RGF5T2ZXZWVrID0gbG9jYWxlRmlyc3REYXlPZldlZWs7XG5cbiAgICBwcm90byQxLndlZWtkYXlzID0gbG9jYWxlV2Vla2RheXM7XG4gICAgcHJvdG8kMS53ZWVrZGF5c01pbiA9IGxvY2FsZVdlZWtkYXlzTWluO1xuICAgIHByb3RvJDEud2Vla2RheXNTaG9ydCA9IGxvY2FsZVdlZWtkYXlzU2hvcnQ7XG4gICAgcHJvdG8kMS53ZWVrZGF5c1BhcnNlID0gbG9jYWxlV2Vla2RheXNQYXJzZTtcblxuICAgIHByb3RvJDEud2Vla2RheXNSZWdleCA9IHdlZWtkYXlzUmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrZGF5c1Nob3J0UmVnZXggPSB3ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrZGF5c01pblJlZ2V4ID0gd2Vla2RheXNNaW5SZWdleDtcblxuICAgIHByb3RvJDEuaXNQTSA9IGxvY2FsZUlzUE07XG4gICAgcHJvdG8kMS5tZXJpZGllbSA9IGxvY2FsZU1lcmlkaWVtO1xuXG4gICAgZnVuY3Rpb24gZ2V0JDEoZm9ybWF0LCBpbmRleCwgZmllbGQsIHNldHRlcikge1xuICAgICAgICB2YXIgbG9jYWxlID0gZ2V0TG9jYWxlKCksXG4gICAgICAgICAgICB1dGMgPSBjcmVhdGVVVEMoKS5zZXQoc2V0dGVyLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBsb2NhbGVbZmllbGRdKHV0YywgZm9ybWF0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQkMShmb3JtYXQsIGluZGV4LCBmaWVsZCwgJ21vbnRoJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIG91dCA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCBpLCBmaWVsZCwgJ21vbnRoJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICAvLyAoKVxuICAgIC8vICg1KVxuICAgIC8vIChmbXQsIDUpXG4gICAgLy8gKGZtdClcbiAgICAvLyAodHJ1ZSlcbiAgICAvLyAodHJ1ZSwgNSlcbiAgICAvLyAodHJ1ZSwgZm10LCA1KVxuICAgIC8vICh0cnVlLCBmbXQpXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsIGZpZWxkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxlU29ydGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBsb2NhbGVTb3J0ZWQ7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGxvY2FsZVNvcnRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpLFxuICAgICAgICAgICAgc2hpZnQgPSBsb2NhbGVTb3J0ZWQgPyBsb2NhbGUuX3dlZWsuZG93IDogMCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBvdXQgPSBbXTtcblxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgKGluZGV4ICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgKGkgKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRocyhmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRoc1Nob3J0KGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHNTaG9ydCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5cyhsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXMnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNTaG9ydChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXNTaG9ydCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c01pbihsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXNNaW4nKTtcbiAgICB9XG5cbiAgICBnZXRTZXRHbG9iYWxMb2NhbGUoJ2VuJywge1xuICAgICAgICBlcmFzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcwMDAxLTAxLTAxJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogK0luZmluaXR5LFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnQW5ubyBEb21pbmknLFxuICAgICAgICAgICAgICAgIG5hcnJvdzogJ0FEJyxcbiAgICAgICAgICAgICAgICBhYmJyOiAnQUQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaW5jZTogJzAwMDAtMTItMzEnLFxuICAgICAgICAgICAgICAgIHVudGlsOiAtSW5maW5pdHksXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdCZWZvcmUgQ2hyaXN0JyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICdCQycsXG4gICAgICAgICAgICAgICAgYWJicjogJ0JDJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfSh0aHxzdHxuZHxyZCkvLFxuICAgICAgICBvcmRpbmFsOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9XG4gICAgICAgICAgICAgICAgICAgIHRvSW50KChudW1iZXIgJSAxMDApIC8gMTApID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICd0aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdzdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnbmQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RoJztcbiAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBTaWRlIGVmZmVjdCBpbXBvcnRzXG5cbiAgICBob29rcy5sYW5nID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50LmxhbmcgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGUgaW5zdGVhZC4nLFxuICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGVcbiAgICApO1xuICAgIGhvb2tzLmxhbmdEYXRhID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50LmxhbmdEYXRhIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlRGF0YSBpbnN0ZWFkLicsXG4gICAgICAgIGdldExvY2FsZVxuICAgICk7XG5cbiAgICB2YXIgbWF0aEFicyA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gYWJzKCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7XG5cbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gbWF0aEFicyh0aGlzLl9taWxsaXNlY29uZHMpO1xuICAgICAgICB0aGlzLl9kYXlzID0gbWF0aEFicyh0aGlzLl9kYXlzKTtcbiAgICAgICAgdGhpcy5fbW9udGhzID0gbWF0aEFicyh0aGlzLl9tb250aHMpO1xuXG4gICAgICAgIGRhdGEubWlsbGlzZWNvbmRzID0gbWF0aEFicyhkYXRhLm1pbGxpc2Vjb25kcyk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyA9IG1hdGhBYnMoZGF0YS5zZWNvbmRzKTtcbiAgICAgICAgZGF0YS5taW51dGVzID0gbWF0aEFicyhkYXRhLm1pbnV0ZXMpO1xuICAgICAgICBkYXRhLmhvdXJzID0gbWF0aEFicyhkYXRhLmhvdXJzKTtcbiAgICAgICAgZGF0YS5tb250aHMgPSBtYXRoQWJzKGRhdGEubW9udGhzKTtcbiAgICAgICAgZGF0YS55ZWFycyA9IG1hdGhBYnMoZGF0YS55ZWFycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkU3VidHJhY3QkMShkdXJhdGlvbiwgaW5wdXQsIHZhbHVlLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlRHVyYXRpb24oaW5wdXQsIHZhbHVlKTtcblxuICAgICAgICBkdXJhdGlvbi5fbWlsbGlzZWNvbmRzICs9IGRpcmVjdGlvbiAqIG90aGVyLl9taWxsaXNlY29uZHM7XG4gICAgICAgIGR1cmF0aW9uLl9kYXlzICs9IGRpcmVjdGlvbiAqIG90aGVyLl9kYXlzO1xuICAgICAgICBkdXJhdGlvbi5fbW9udGhzICs9IGRpcmVjdGlvbiAqIG90aGVyLl9tb250aHM7XG5cbiAgICAgICAgcmV0dXJuIGR1cmF0aW9uLl9idWJibGUoKTtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0cyBvbmx5IDIuMC1zdHlsZSBhZGQoMSwgJ3MnKSBvciBhZGQoZHVyYXRpb24pXG4gICAgZnVuY3Rpb24gYWRkJDEoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgMSk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgc3VidHJhY3QoMSwgJ3MnKSBvciBzdWJ0cmFjdChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBzdWJ0cmFjdCQxKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIC0xKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhYnNDZWlsKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJ1YmJsZSgpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzLFxuICAgICAgICAgICAgbW9udGhzID0gdGhpcy5fbW9udGhzLFxuICAgICAgICAgICAgZGF0YSA9IHRoaXMuX2RhdGEsXG4gICAgICAgICAgICBzZWNvbmRzLFxuICAgICAgICAgICAgbWludXRlcyxcbiAgICAgICAgICAgIGhvdXJzLFxuICAgICAgICAgICAgeWVhcnMsXG4gICAgICAgICAgICBtb250aHNGcm9tRGF5cztcblxuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbWl4IG9mIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB2YWx1ZXMsIGJ1YmJsZSBkb3duIGZpcnN0XG4gICAgICAgIC8vIGNoZWNrOiBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMjE2NlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIChtaWxsaXNlY29uZHMgPj0gMCAmJiBkYXlzID49IDAgJiYgbW9udGhzID49IDApIHx8XG4gICAgICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA8PSAwICYmIGRheXMgPD0gMCAmJiBtb250aHMgPD0gMClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBtaWxsaXNlY29uZHMgKz0gYWJzQ2VpbChtb250aHNUb0RheXMobW9udGhzKSArIGRheXMpICogODY0ZTU7XG4gICAgICAgICAgICBkYXlzID0gMDtcbiAgICAgICAgICAgIG1vbnRocyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgYnViYmxlcyB1cCB2YWx1ZXMsIHNlZSB0aGUgdGVzdHMgZm9yXG4gICAgICAgIC8vIGV4YW1wbGVzIG9mIHdoYXQgdGhhdCBtZWFucy5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHMgJSAxMDAwO1xuXG4gICAgICAgIHNlY29uZHMgPSBhYnNGbG9vcihtaWxsaXNlY29uZHMgLyAxMDAwKTtcbiAgICAgICAgZGF0YS5zZWNvbmRzID0gc2Vjb25kcyAlIDYwO1xuXG4gICAgICAgIG1pbnV0ZXMgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgICAgICBkYXRhLm1pbnV0ZXMgPSBtaW51dGVzICUgNjA7XG5cbiAgICAgICAgaG91cnMgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBkYXRhLmhvdXJzID0gaG91cnMgJSAyNDtcblxuICAgICAgICBkYXlzICs9IGFic0Zsb29yKGhvdXJzIC8gMjQpO1xuXG4gICAgICAgIC8vIGNvbnZlcnQgZGF5cyB0byBtb250aHNcbiAgICAgICAgbW9udGhzRnJvbURheXMgPSBhYnNGbG9vcihkYXlzVG9Nb250aHMoZGF5cykpO1xuICAgICAgICBtb250aHMgKz0gbW9udGhzRnJvbURheXM7XG4gICAgICAgIGRheXMgLT0gYWJzQ2VpbChtb250aHNUb0RheXMobW9udGhzRnJvbURheXMpKTtcblxuICAgICAgICAvLyAxMiBtb250aHMgLT4gMSB5ZWFyXG4gICAgICAgIHllYXJzID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cbiAgICAgICAgZGF0YS5kYXlzID0gZGF5cztcbiAgICAgICAgZGF0YS5tb250aHMgPSBtb250aHM7XG4gICAgICAgIGRhdGEueWVhcnMgPSB5ZWFycztcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlzVG9Nb250aHMoZGF5cykge1xuICAgICAgICAvLyA0MDAgeWVhcnMgaGF2ZSAxNDYwOTcgZGF5cyAodGFraW5nIGludG8gYWNjb3VudCBsZWFwIHllYXIgcnVsZXMpXG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDEyIG1vbnRocyA9PT0gNDgwMFxuICAgICAgICByZXR1cm4gKGRheXMgKiA0ODAwKSAvIDE0NjA5NztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNUb0RheXMobW9udGhzKSB7XG4gICAgICAgIC8vIHRoZSByZXZlcnNlIG9mIGRheXNUb01vbnRoc1xuICAgICAgICByZXR1cm4gKG1vbnRocyAqIDE0NjA5NykgLyA0ODAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFzKHVuaXRzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRheXMsXG4gICAgICAgICAgICBtb250aHMsXG4gICAgICAgICAgICBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHM7XG5cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICAgICAgaWYgKHVuaXRzID09PSAnbW9udGgnIHx8IHVuaXRzID09PSAncXVhcnRlcicgfHwgdW5pdHMgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMgKyBtaWxsaXNlY29uZHMgLyA4NjRlNTtcbiAgICAgICAgICAgIG1vbnRocyA9IHRoaXMuX21vbnRocyArIGRheXNUb01vbnRocyhkYXlzKTtcbiAgICAgICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb250aHM7XG4gICAgICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb250aHMgLyAzO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzIC8gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgbWlsbGlzZWNvbmRzIHNlcGFyYXRlbHkgYmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyAoaXNzdWUgIzE4NjcpXG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIE1hdGgucm91bmQobW9udGhzVG9EYXlzKHRoaXMuX21vbnRocykpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAvIDcgKyBtaWxsaXNlY29uZHMgLyA2MDQ4ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheXMgKyBtaWxsaXNlY29uZHMgLyA4NjRlNTtcbiAgICAgICAgICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheXMgKiAyNCArIG1pbGxpc2Vjb25kcyAvIDM2ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheXMgKiAxNDQwICsgbWlsbGlzZWNvbmRzIC8gNmU0O1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzICogODY0MDAgKyBtaWxsaXNlY29uZHMgLyAxMDAwO1xuICAgICAgICAgICAgICAgIC8vIE1hdGguZmxvb3IgcHJldmVudHMgZmxvYXRpbmcgcG9pbnQgbWF0aCBlcnJvcnMgaGVyZVxuICAgICAgICAgICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoZGF5cyAqIDg2NGU1KSArIG1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdW5pdCAnICsgdW5pdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcyhhbGlhcyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGFzTWlsbGlzZWNvbmRzID0gbWFrZUFzKCdtcycpLFxuICAgICAgICBhc1NlY29uZHMgPSBtYWtlQXMoJ3MnKSxcbiAgICAgICAgYXNNaW51dGVzID0gbWFrZUFzKCdtJyksXG4gICAgICAgIGFzSG91cnMgPSBtYWtlQXMoJ2gnKSxcbiAgICAgICAgYXNEYXlzID0gbWFrZUFzKCdkJyksXG4gICAgICAgIGFzV2Vla3MgPSBtYWtlQXMoJ3cnKSxcbiAgICAgICAgYXNNb250aHMgPSBtYWtlQXMoJ00nKSxcbiAgICAgICAgYXNRdWFydGVycyA9IG1ha2VBcygnUScpLFxuICAgICAgICBhc1llYXJzID0gbWFrZUFzKCd5JyksXG4gICAgICAgIHZhbHVlT2YkMSA9IGFzTWlsbGlzZWNvbmRzO1xuXG4gICAgZnVuY3Rpb24gY2xvbmUkMSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHRoaXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldCQyKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzW3VuaXRzICsgJ3MnXSgpIDogTmFOO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXR0ZXIobmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5fZGF0YVtuYW1lXSA6IE5hTjtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gbWFrZUdldHRlcignbWlsbGlzZWNvbmRzJyksXG4gICAgICAgIHNlY29uZHMgPSBtYWtlR2V0dGVyKCdzZWNvbmRzJyksXG4gICAgICAgIG1pbnV0ZXMgPSBtYWtlR2V0dGVyKCdtaW51dGVzJyksXG4gICAgICAgIGhvdXJzID0gbWFrZUdldHRlcignaG91cnMnKSxcbiAgICAgICAgZGF5cyA9IG1ha2VHZXR0ZXIoJ2RheXMnKSxcbiAgICAgICAgbW9udGhzID0gbWFrZUdldHRlcignbW9udGhzJyksXG4gICAgICAgIHllYXJzID0gbWFrZUdldHRlcigneWVhcnMnKTtcblxuICAgIGZ1bmN0aW9uIHdlZWtzKCkge1xuICAgICAgICByZXR1cm4gYWJzRmxvb3IodGhpcy5kYXlzKCkgLyA3KTtcbiAgICB9XG5cbiAgICB2YXIgcm91bmQgPSBNYXRoLnJvdW5kLFxuICAgICAgICB0aHJlc2hvbGRzID0ge1xuICAgICAgICAgICAgc3M6IDQ0LCAvLyBhIGZldyBzZWNvbmRzIHRvIHNlY29uZHNcbiAgICAgICAgICAgIHM6IDQ1LCAvLyBzZWNvbmRzIHRvIG1pbnV0ZVxuICAgICAgICAgICAgbTogNDUsIC8vIG1pbnV0ZXMgdG8gaG91clxuICAgICAgICAgICAgaDogMjIsIC8vIGhvdXJzIHRvIGRheVxuICAgICAgICAgICAgZDogMjYsIC8vIGRheXMgdG8gbW9udGgvd2Vla1xuICAgICAgICAgICAgdzogbnVsbCwgLy8gd2Vla3MgdG8gbW9udGhcbiAgICAgICAgICAgIE06IDExLCAvLyBtb250aHMgdG8geWVhclxuICAgICAgICB9O1xuXG4gICAgLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBtb21lbnQuZm4uZnJvbSwgbW9tZW50LmZuLmZyb21Ob3csIGFuZCBtb21lbnQuZHVyYXRpb24uZm4uaHVtYW5pemVcbiAgICBmdW5jdGlvbiBzdWJzdGl0dXRlVGltZUFnbyhzdHJpbmcsIG51bWJlciwgd2l0aG91dFN1ZmZpeCwgaXNGdXR1cmUsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLnJlbGF0aXZlVGltZShudW1iZXIgfHwgMSwgISF3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUkMShwb3NOZWdEdXJhdGlvbiwgd2l0aG91dFN1ZmZpeCwgdGhyZXNob2xkcywgbG9jYWxlKSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IGNyZWF0ZUR1cmF0aW9uKHBvc05lZ0R1cmF0aW9uKS5hYnMoKSxcbiAgICAgICAgICAgIHNlY29uZHMgPSByb3VuZChkdXJhdGlvbi5hcygncycpKSxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSByb3VuZChkdXJhdGlvbi5hcygnbScpKSxcbiAgICAgICAgICAgIGhvdXJzID0gcm91bmQoZHVyYXRpb24uYXMoJ2gnKSksXG4gICAgICAgICAgICBkYXlzID0gcm91bmQoZHVyYXRpb24uYXMoJ2QnKSksXG4gICAgICAgICAgICBtb250aHMgPSByb3VuZChkdXJhdGlvbi5hcygnTScpKSxcbiAgICAgICAgICAgIHdlZWtzID0gcm91bmQoZHVyYXRpb24uYXMoJ3cnKSksXG4gICAgICAgICAgICB5ZWFycyA9IHJvdW5kKGR1cmF0aW9uLmFzKCd5JykpLFxuICAgICAgICAgICAgYSA9XG4gICAgICAgICAgICAgICAgKHNlY29uZHMgPD0gdGhyZXNob2xkcy5zcyAmJiBbJ3MnLCBzZWNvbmRzXSkgfHxcbiAgICAgICAgICAgICAgICAoc2Vjb25kcyA8IHRocmVzaG9sZHMucyAmJiBbJ3NzJywgc2Vjb25kc10pIHx8XG4gICAgICAgICAgICAgICAgKG1pbnV0ZXMgPD0gMSAmJiBbJ20nXSkgfHxcbiAgICAgICAgICAgICAgICAobWludXRlcyA8IHRocmVzaG9sZHMubSAmJiBbJ21tJywgbWludXRlc10pIHx8XG4gICAgICAgICAgICAgICAgKGhvdXJzIDw9IDEgJiYgWydoJ10pIHx8XG4gICAgICAgICAgICAgICAgKGhvdXJzIDwgdGhyZXNob2xkcy5oICYmIFsnaGgnLCBob3Vyc10pIHx8XG4gICAgICAgICAgICAgICAgKGRheXMgPD0gMSAmJiBbJ2QnXSkgfHxcbiAgICAgICAgICAgICAgICAoZGF5cyA8IHRocmVzaG9sZHMuZCAmJiBbJ2RkJywgZGF5c10pO1xuXG4gICAgICAgIGlmICh0aHJlc2hvbGRzLncgIT0gbnVsbCkge1xuICAgICAgICAgICAgYSA9XG4gICAgICAgICAgICAgICAgYSB8fFxuICAgICAgICAgICAgICAgICh3ZWVrcyA8PSAxICYmIFsndyddKSB8fFxuICAgICAgICAgICAgICAgICh3ZWVrcyA8IHRocmVzaG9sZHMudyAmJiBbJ3d3Jywgd2Vla3NdKTtcbiAgICAgICAgfVxuICAgICAgICBhID0gYSB8fFxuICAgICAgICAgICAgKG1vbnRocyA8PSAxICYmIFsnTSddKSB8fFxuICAgICAgICAgICAgKG1vbnRocyA8IHRocmVzaG9sZHMuTSAmJiBbJ01NJywgbW9udGhzXSkgfHxcbiAgICAgICAgICAgICh5ZWFycyA8PSAxICYmIFsneSddKSB8fCBbJ3l5JywgeWVhcnNdO1xuXG4gICAgICAgIGFbMl0gPSB3aXRob3V0U3VmZml4O1xuICAgICAgICBhWzNdID0gK3Bvc05lZ0R1cmF0aW9uID4gMDtcbiAgICAgICAgYVs0XSA9IGxvY2FsZTtcbiAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGVUaW1lQWdvLmFwcGx5KG51bGwsIGEpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgdGhlIHJvdW5kaW5nIGZ1bmN0aW9uIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBmdW5jdGlvbiBnZXRTZXRSZWxhdGl2ZVRpbWVSb3VuZGluZyhyb3VuZGluZ0Z1bmN0aW9uKSB7XG4gICAgICAgIGlmIChyb3VuZGluZ0Z1bmN0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByb3VuZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJvdW5kaW5nRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJvdW5kID0gcm91bmRpbmdGdW5jdGlvbjtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IGEgdGhyZXNob2xkIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBmdW5jdGlvbiBnZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQodGhyZXNob2xkLCBsaW1pdCkge1xuICAgICAgICBpZiAodGhyZXNob2xkc1t0aHJlc2hvbGRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZHNbdGhyZXNob2xkXTtcbiAgICAgICAgfVxuICAgICAgICB0aHJlc2hvbGRzW3RocmVzaG9sZF0gPSBsaW1pdDtcbiAgICAgICAgaWYgKHRocmVzaG9sZCA9PT0gJ3MnKSB7XG4gICAgICAgICAgICB0aHJlc2hvbGRzLnNzID0gbGltaXQgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGh1bWFuaXplKGFyZ1dpdGhTdWZmaXgsIGFyZ1RocmVzaG9sZHMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd2l0aFN1ZmZpeCA9IGZhbHNlLFxuICAgICAgICAgICAgdGggPSB0aHJlc2hvbGRzLFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgb3V0cHV0O1xuXG4gICAgICAgIGlmICh0eXBlb2YgYXJnV2l0aFN1ZmZpeCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGFyZ1RocmVzaG9sZHMgPSBhcmdXaXRoU3VmZml4O1xuICAgICAgICAgICAgYXJnV2l0aFN1ZmZpeCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnV2l0aFN1ZmZpeCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB3aXRoU3VmZml4ID0gYXJnV2l0aFN1ZmZpeDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFyZ1RocmVzaG9sZHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aCA9IE9iamVjdC5hc3NpZ24oe30sIHRocmVzaG9sZHMsIGFyZ1RocmVzaG9sZHMpO1xuICAgICAgICAgICAgaWYgKGFyZ1RocmVzaG9sZHMucyAhPSBudWxsICYmIGFyZ1RocmVzaG9sZHMuc3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoLnNzID0gYXJnVGhyZXNob2xkcy5zIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsZSA9IHRoaXMubG9jYWxlRGF0YSgpO1xuICAgICAgICBvdXRwdXQgPSByZWxhdGl2ZVRpbWUkMSh0aGlzLCAhd2l0aFN1ZmZpeCwgdGgsIGxvY2FsZSk7XG5cbiAgICAgICAgaWYgKHdpdGhTdWZmaXgpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IGxvY2FsZS5wYXN0RnV0dXJlKCt0aGlzLCBvdXRwdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxvY2FsZS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFicyQxID0gTWF0aC5hYnM7XG5cbiAgICBmdW5jdGlvbiBzaWduKHgpIHtcbiAgICAgICAgcmV0dXJuICh4ID4gMCkgLSAoeCA8IDApIHx8ICt4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSVNPU3RyaW5nJDEoKSB7XG4gICAgICAgIC8vIGZvciBJU08gc3RyaW5ncyB3ZSBkbyBub3QgdXNlIHRoZSBub3JtYWwgYnViYmxpbmcgcnVsZXM6XG4gICAgICAgIC8vICAqIG1pbGxpc2Vjb25kcyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgaG91cnNcbiAgICAgICAgLy8gICogZGF5cyBkbyBub3QgYnViYmxlIGF0IGFsbFxuICAgICAgICAvLyAgKiBtb250aHMgYnViYmxlIHVwIHVudGlsIHRoZXkgYmVjb21lIHllYXJzXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBjb250ZXh0LWZyZWUgY29udmVyc2lvbiBiZXR3ZWVuIGhvdXJzIGFuZCBkYXlzXG4gICAgICAgIC8vICh0aGluayBvZiBjbG9jayBjaGFuZ2VzKVxuICAgICAgICAvLyBhbmQgYWxzbyBub3QgYmV0d2VlbiBkYXlzIGFuZCBtb250aHMgKDI4LTMxIGRheXMgcGVyIG1vbnRoKVxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWNvbmRzID0gYWJzJDEodGhpcy5fbWlsbGlzZWNvbmRzKSAvIDEwMDAsXG4gICAgICAgICAgICBkYXlzID0gYWJzJDEodGhpcy5fZGF5cyksXG4gICAgICAgICAgICBtb250aHMgPSBhYnMkMSh0aGlzLl9tb250aHMpLFxuICAgICAgICAgICAgbWludXRlcyxcbiAgICAgICAgICAgIGhvdXJzLFxuICAgICAgICAgICAgeWVhcnMsXG4gICAgICAgICAgICBzLFxuICAgICAgICAgICAgdG90YWwgPSB0aGlzLmFzU2Vjb25kcygpLFxuICAgICAgICAgICAgdG90YWxTaWduLFxuICAgICAgICAgICAgeW1TaWduLFxuICAgICAgICAgICAgZGF5c1NpZ24sXG4gICAgICAgICAgICBobXNTaWduO1xuXG4gICAgICAgIGlmICghdG90YWwpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHNhbWUgYXMgQyMncyAoTm9kYSkgYW5kIHB5dGhvbiAoaXNvZGF0ZSkuLi5cbiAgICAgICAgICAgIC8vIGJ1dCBub3Qgb3RoZXIgSlMgKGdvb2cuZGF0ZSlcbiAgICAgICAgICAgIHJldHVybiAnUDBEJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDM2MDAgc2Vjb25kcyAtPiA2MCBtaW51dGVzIC0+IDEgaG91clxuICAgICAgICBtaW51dGVzID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgaG91cnMgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBzZWNvbmRzICU9IDYwO1xuICAgICAgICBtaW51dGVzICU9IDYwO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuICAgICAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZG9yZGlsbGUvbW9tZW50LWlzb2R1cmF0aW9uL2Jsb2IvbWFzdGVyL21vbWVudC5pc29kdXJhdGlvbi5qc1xuICAgICAgICBzID0gc2Vjb25kcyA/IHNlY29uZHMudG9GaXhlZCgzKS5yZXBsYWNlKC9cXC4/MCskLywgJycpIDogJyc7XG5cbiAgICAgICAgdG90YWxTaWduID0gdG90YWwgPCAwID8gJy0nIDogJyc7XG4gICAgICAgIHltU2lnbiA9IHNpZ24odGhpcy5fbW9udGhzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcbiAgICAgICAgZGF5c1NpZ24gPSBzaWduKHRoaXMuX2RheXMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICBobXNTaWduID0gc2lnbih0aGlzLl9taWxsaXNlY29uZHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0b3RhbFNpZ24gK1xuICAgICAgICAgICAgJ1AnICtcbiAgICAgICAgICAgICh5ZWFycyA/IHltU2lnbiArIHllYXJzICsgJ1knIDogJycpICtcbiAgICAgICAgICAgIChtb250aHMgPyB5bVNpZ24gKyBtb250aHMgKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKGRheXMgPyBkYXlzU2lnbiArIGRheXMgKyAnRCcgOiAnJykgK1xuICAgICAgICAgICAgKGhvdXJzIHx8IG1pbnV0ZXMgfHwgc2Vjb25kcyA/ICdUJyA6ICcnKSArXG4gICAgICAgICAgICAoaG91cnMgPyBobXNTaWduICsgaG91cnMgKyAnSCcgOiAnJykgK1xuICAgICAgICAgICAgKG1pbnV0ZXMgPyBobXNTaWduICsgbWludXRlcyArICdNJyA6ICcnKSArXG4gICAgICAgICAgICAoc2Vjb25kcyA/IGhtc1NpZ24gKyBzICsgJ1MnIDogJycpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvJDIgPSBEdXJhdGlvbi5wcm90b3R5cGU7XG5cbiAgICBwcm90byQyLmlzVmFsaWQgPSBpc1ZhbGlkJDE7XG4gICAgcHJvdG8kMi5hYnMgPSBhYnM7XG4gICAgcHJvdG8kMi5hZGQgPSBhZGQkMTtcbiAgICBwcm90byQyLnN1YnRyYWN0ID0gc3VidHJhY3QkMTtcbiAgICBwcm90byQyLmFzID0gYXM7XG4gICAgcHJvdG8kMi5hc01pbGxpc2Vjb25kcyA9IGFzTWlsbGlzZWNvbmRzO1xuICAgIHByb3RvJDIuYXNTZWNvbmRzID0gYXNTZWNvbmRzO1xuICAgIHByb3RvJDIuYXNNaW51dGVzID0gYXNNaW51dGVzO1xuICAgIHByb3RvJDIuYXNIb3VycyA9IGFzSG91cnM7XG4gICAgcHJvdG8kMi5hc0RheXMgPSBhc0RheXM7XG4gICAgcHJvdG8kMi5hc1dlZWtzID0gYXNXZWVrcztcbiAgICBwcm90byQyLmFzTW9udGhzID0gYXNNb250aHM7XG4gICAgcHJvdG8kMi5hc1F1YXJ0ZXJzID0gYXNRdWFydGVycztcbiAgICBwcm90byQyLmFzWWVhcnMgPSBhc1llYXJzO1xuICAgIHByb3RvJDIudmFsdWVPZiA9IHZhbHVlT2YkMTtcbiAgICBwcm90byQyLl9idWJibGUgPSBidWJibGU7XG4gICAgcHJvdG8kMi5jbG9uZSA9IGNsb25lJDE7XG4gICAgcHJvdG8kMi5nZXQgPSBnZXQkMjtcbiAgICBwcm90byQyLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLnNlY29uZHMgPSBzZWNvbmRzO1xuICAgIHByb3RvJDIubWludXRlcyA9IG1pbnV0ZXM7XG4gICAgcHJvdG8kMi5ob3VycyA9IGhvdXJzO1xuICAgIHByb3RvJDIuZGF5cyA9IGRheXM7XG4gICAgcHJvdG8kMi53ZWVrcyA9IHdlZWtzO1xuICAgIHByb3RvJDIubW9udGhzID0gbW9udGhzO1xuICAgIHByb3RvJDIueWVhcnMgPSB5ZWFycztcbiAgICBwcm90byQyLmh1bWFuaXplID0gaHVtYW5pemU7XG4gICAgcHJvdG8kMi50b0lTT1N0cmluZyA9IHRvSVNPU3RyaW5nJDE7XG4gICAgcHJvdG8kMi50b1N0cmluZyA9IHRvSVNPU3RyaW5nJDE7XG4gICAgcHJvdG8kMi50b0pTT04gPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIubG9jYWxlID0gbG9jYWxlO1xuICAgIHByb3RvJDIubG9jYWxlRGF0YSA9IGxvY2FsZURhdGE7XG5cbiAgICBwcm90byQyLnRvSXNvU3RyaW5nID0gZGVwcmVjYXRlKFxuICAgICAgICAndG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAobm90aWNlIHRoZSBjYXBpdGFscyknLFxuICAgICAgICB0b0lTT1N0cmluZyQxXG4gICAgKTtcbiAgICBwcm90byQyLmxhbmcgPSBsYW5nO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1gnLCAwLCAwLCAndW5peCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd4JywgMCwgMCwgJ3ZhbHVlT2YnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3gnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignWCcsIG1hdGNoVGltZXN0YW1wKTtcbiAgICBhZGRQYXJzZVRva2VuKCdYJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHBhcnNlRmxvYXQoaW5wdXQpICogMTAwMCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbigneCcsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSh0b0ludChpbnB1dCkpO1xuICAgIH0pO1xuXG4gICAgLy8hIG1vbWVudC5qc1xuXG4gICAgaG9va3MudmVyc2lvbiA9ICcyLjMwLjEnO1xuXG4gICAgc2V0SG9va0NhbGxiYWNrKGNyZWF0ZUxvY2FsKTtcblxuICAgIGhvb2tzLmZuID0gcHJvdG87XG4gICAgaG9va3MubWluID0gbWluO1xuICAgIGhvb2tzLm1heCA9IG1heDtcbiAgICBob29rcy5ub3cgPSBub3c7XG4gICAgaG9va3MudXRjID0gY3JlYXRlVVRDO1xuICAgIGhvb2tzLnVuaXggPSBjcmVhdGVVbml4O1xuICAgIGhvb2tzLm1vbnRocyA9IGxpc3RNb250aHM7XG4gICAgaG9va3MuaXNEYXRlID0gaXNEYXRlO1xuICAgIGhvb2tzLmxvY2FsZSA9IGdldFNldEdsb2JhbExvY2FsZTtcbiAgICBob29rcy5pbnZhbGlkID0gY3JlYXRlSW52YWxpZDtcbiAgICBob29rcy5kdXJhdGlvbiA9IGNyZWF0ZUR1cmF0aW9uO1xuICAgIGhvb2tzLmlzTW9tZW50ID0gaXNNb21lbnQ7XG4gICAgaG9va3Mud2Vla2RheXMgPSBsaXN0V2Vla2RheXM7XG4gICAgaG9va3MucGFyc2Vab25lID0gY3JlYXRlSW5ab25lO1xuICAgIGhvb2tzLmxvY2FsZURhdGEgPSBnZXRMb2NhbGU7XG4gICAgaG9va3MuaXNEdXJhdGlvbiA9IGlzRHVyYXRpb247XG4gICAgaG9va3MubW9udGhzU2hvcnQgPSBsaXN0TW9udGhzU2hvcnQ7XG4gICAgaG9va3Mud2Vla2RheXNNaW4gPSBsaXN0V2Vla2RheXNNaW47XG4gICAgaG9va3MuZGVmaW5lTG9jYWxlID0gZGVmaW5lTG9jYWxlO1xuICAgIGhvb2tzLnVwZGF0ZUxvY2FsZSA9IHVwZGF0ZUxvY2FsZTtcbiAgICBob29rcy5sb2NhbGVzID0gbGlzdExvY2FsZXM7XG4gICAgaG9va3Mud2Vla2RheXNTaG9ydCA9IGxpc3RXZWVrZGF5c1Nob3J0O1xuICAgIGhvb2tzLm5vcm1hbGl6ZVVuaXRzID0gbm9ybWFsaXplVW5pdHM7XG4gICAgaG9va3MucmVsYXRpdmVUaW1lUm91bmRpbmcgPSBnZXRTZXRSZWxhdGl2ZVRpbWVSb3VuZGluZztcbiAgICBob29rcy5yZWxhdGl2ZVRpbWVUaHJlc2hvbGQgPSBnZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQ7XG4gICAgaG9va3MuY2FsZW5kYXJGb3JtYXQgPSBnZXRDYWxlbmRhckZvcm1hdDtcbiAgICBob29rcy5wcm90b3R5cGUgPSBwcm90bztcblxuICAgIC8vIGN1cnJlbnRseSBIVE1MNSBpbnB1dCB0eXBlIG9ubHkgc3VwcG9ydHMgMjQtaG91ciBmb3JtYXRzXG4gICAgaG9va3MuSFRNTDVfRk1UID0ge1xuICAgICAgICBEQVRFVElNRV9MT0NBTDogJ1lZWVktTU0tRERUSEg6bW0nLCAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfU0VDT05EUzogJ1lZWVktTU0tRERUSEg6bW06c3MnLCAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICBEQVRFVElNRV9MT0NBTF9NUzogJ1lZWVktTU0tRERUSEg6bW06c3MuU1NTJywgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIERBVEU6ICdZWVlZLU1NLUREJywgLy8gPGlucHV0IHR5cGU9XCJkYXRlXCIgLz5cbiAgICAgICAgVElNRTogJ0hIOm1tJywgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgLz5cbiAgICAgICAgVElNRV9TRUNPTkRTOiAnSEg6bW06c3MnLCAvLyA8aW5wdXQgdHlwZT1cInRpbWVcIiBzdGVwPVwiMVwiIC8+XG4gICAgICAgIFRJTUVfTVM6ICdISDptbTpzcy5TU1MnLCAvLyA8aW5wdXQgdHlwZT1cInRpbWVcIiBzdGVwPVwiMC4wMDFcIiAvPlxuICAgICAgICBXRUVLOiAnR0dHRy1bV11XVycsIC8vIDxpbnB1dCB0eXBlPVwid2Vla1wiIC8+XG4gICAgICAgIE1PTlRIOiAnWVlZWS1NTScsIC8vIDxpbnB1dCB0eXBlPVwibW9udGhcIiAvPlxuICAgIH07XG5cbiAgICByZXR1cm4gaG9va3M7XG5cbn0pKSk7XG4iLCIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwiLy8gVG9wIGxldmVsIGZpbGUgaXMganVzdCBhIG1peGluIG9mIHN1Ym1vZHVsZXMgJiBjb25zdGFudHNcbid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2lnbiAgICA9IHJlcXVpcmUoJy4vbGliL3V0aWxzL2NvbW1vbicpLmFzc2lnbjtcblxudmFyIGRlZmxhdGUgICA9IHJlcXVpcmUoJy4vbGliL2RlZmxhdGUnKTtcbnZhciBpbmZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9pbmZsYXRlJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9saWIvemxpYi9jb25zdGFudHMnKTtcblxudmFyIHBha28gPSB7fTtcblxuYXNzaWduKHBha28sIGRlZmxhdGUsIGluZmxhdGUsIGNvbnN0YW50cyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFrbztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9kZWZsYXRlID0gcmVxdWlyZSgnLi96bGliL2RlZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG52YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xuXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG5cbnZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSAtMTtcblxudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyoqXG4gKiBjbGFzcyBEZWZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbZGVmbGF0ZV1dLFxuICogW1tkZWZsYXRlUmF3XV0gYW5kIFtbZ3ppcF1dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogRGVmbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbRGVmbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGRlbi5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5XG4gKlxuICogQ29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbRGVmbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbRGVmbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pICBvciBpZiB5b3VcbiAqIHB1c2ggYSBjaHVuayB3aXRoIGV4cGxpY2l0IGZsdXNoIChjYWxsIFtbRGVmbGF0ZSNwdXNoXV0gd2l0aFxuICogYFpfU1lOQ19GTFVTSGAgcGFyYW0pLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUuZXJyIC0+IE51bWJlclxuICpcbiAqIEVycm9yIGNvZGUgYWZ0ZXIgZGVmbGF0ZSBmaW5pc2hlZC4gMCAoWl9PSykgb24gc3VjY2Vzcy5cbiAqIFlvdSB3aWxsIG5vdCBuZWVkIGl0IGluIHJlYWwgbGlmZSwgYmVjYXVzZSBkZWZsYXRlIGVycm9yc1xuICogYXJlIHBvc3NpYmxlIG9ubHkgb24gd3Jvbmcgb3B0aW9ucyBvciBiYWQgYG9uRGF0YWAgLyBgb25FbmRgXG4gKiBjdXN0b20gaGFuZGxlcnMuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tEZWZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBEZWZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGRlZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgbGV2ZWxgXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgbWVtTGV2ZWxgXG4gKiAtIGBzdHJhdGVneWBcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGRlZmxhdGVcbiAqIC0gYGd6aXBgIChCb29sZWFuKSAtIGNyZWF0ZSBnemlwIHdyYXBwZXJcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIFwiYmluYXJ5IHN0cmluZ1wiXG4gKiAgICAoZWFjaCBjaGFyIGNvZGUgWzAuLjI1NV0pXG4gKiAtIGBoZWFkZXJgIChPYmplY3QpIC0gY3VzdG9tIGhlYWRlciBmb3IgZ3ppcFxuICogICAtIGB0ZXh0YCAoQm9vbGVhbikgLSB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0XG4gKiAgIC0gYHRpbWVgIChOdW1iZXIpIC0gbW9kaWZpY2F0aW9uIHRpbWUsIHVuaXggdGltZXN0YW1wXG4gKiAgIC0gYG9zYCAoTnVtYmVyKSAtIG9wZXJhdGlvbiBzeXN0ZW0gY29kZVxuICogICAtIGBleHRyYWAgKEFycmF5KSAtIGFycmF5IG9mIGJ5dGVzIHdpdGggZXh0cmEgZGF0YSAobWF4IDY1NTM2KVxuICogICAtIGBuYW1lYCAoU3RyaW5nKSAtIGZpbGUgbmFtZSAoYmluYXJ5IHN0cmluZylcbiAqICAgLSBgY29tbWVudGAgKFN0cmluZykgLSBjb21tZW50IChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBoY3JjYCAoQm9vbGVhbikgLSB0cnVlIGlmIGhlYWRlciBjcmMgc2hvdWxkIGJlIGFkZGVkXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGNodW5rMSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBjaHVuazIgPSBVaW50OEFycmF5KFsxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOV0pO1xuICpcbiAqIHZhciBkZWZsYXRlID0gbmV3IHBha28uRGVmbGF0ZSh7IGxldmVsOiAzfSk7XG4gKlxuICogZGVmbGF0ZS5wdXNoKGNodW5rMSwgZmFsc2UpO1xuICogZGVmbGF0ZS5wdXNoKGNodW5rMiwgdHJ1ZSk7ICAvLyB0cnVlIC0+IGxhc3QgY2h1bmtcbiAqXG4gKiBpZiAoZGVmbGF0ZS5lcnIpIHsgdGhyb3cgbmV3IEVycm9yKGRlZmxhdGUuZXJyKTsgfVxuICpcbiAqIGNvbnNvbGUubG9nKGRlZmxhdGUucmVzdWx0KTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gRGVmbGF0ZShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWZsYXRlKSkgcmV0dXJuIG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmFzc2lnbih7XG4gICAgbGV2ZWw6IFpfREVGQVVMVF9DT01QUkVTU0lPTixcbiAgICBtZXRob2Q6IFpfREVGTEFURUQsXG4gICAgY2h1bmtTaXplOiAxNjM4NCxcbiAgICB3aW5kb3dCaXRzOiAxNSxcbiAgICBtZW1MZXZlbDogOCxcbiAgICBzdHJhdGVneTogWl9ERUZBVUxUX1NUUkFURUdZLFxuICAgIHRvOiAnJ1xuICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICB2YXIgb3B0ID0gdGhpcy5vcHRpb25zO1xuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+IDApKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmIChvcHQuZ3ppcCAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAxNjtcbiAgfVxuXG4gIHRoaXMuZXJyICAgID0gMDsgICAgICAvLyBlcnJvciBjb2RlLCBpZiBoYXBwZW5zICgwID0gWl9PSylcbiAgdGhpcy5tc2cgICAgPSAnJzsgICAgIC8vIGVycm9yIG1lc3NhZ2VcbiAgdGhpcy5lbmRlZCAgPSBmYWxzZTsgIC8vIHVzZWQgdG8gYXZvaWQgbXVsdGlwbGUgb25FbmQoKSBjYWxsc1xuICB0aGlzLmNodW5rcyA9IFtdOyAgICAgLy8gY2h1bmtzIG9mIGNvbXByZXNzZWQgZGF0YVxuXG4gIHRoaXMuc3RybSA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUluaXQyKFxuICAgIHRoaXMuc3RybSxcbiAgICBvcHQubGV2ZWwsXG4gICAgb3B0Lm1ldGhvZCxcbiAgICBvcHQud2luZG93Qml0cyxcbiAgICBvcHQubWVtTGV2ZWwsXG4gICAgb3B0LnN0cmF0ZWd5XG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gWl9PSykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gIH1cblxuICBpZiAob3B0LmhlYWRlcikge1xuICAgIHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSwgb3B0LmhlYWRlcik7XG4gIH1cblxuICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICB2YXIgZGljdDtcbiAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICBkaWN0ID0gbmV3IFVpbnQ4QXJyYXkob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWN0ID0gb3B0LmRpY3Rpb25hcnk7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdCk7XG5cbiAgICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICAgIH1cblxuICAgIHRoaXMuX2RpY3Rfc2V0ID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIERlZmxhdGUjcHVzaChkYXRhWywgbW9kZV0pIC0+IEJvb2xlYW5cbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxBcnJheUJ1ZmZlcnxTdHJpbmcpOiBpbnB1dCBkYXRhLiBTdHJpbmdzIHdpbGwgYmVcbiAqICAgY29udmVydGVkIHRvIHV0ZjggYnl0ZSBzZXF1ZW5jZS5cbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFucyBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGRlZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0RlZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IGNvbXByZXNzZWQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tEZWZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgY29tcHJlc3Npb24gY29udGV4dC5cbiAqXG4gKiBPbiBmYWlsIGNhbGwgW1tEZWZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBgVWludDhBcnJheWAgb24gaW5wdXQgZm9yIGJlc3Qgc3BlZWQgKG91dHB1dFxuICogYXJyYXkgZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5c1xuICogdXNlIHRoZSBzYW1lIHR5cGUgaW4geW91ciBjb2RlIChib29sZWFuIG9yIG51bWJlcikuIFRoYXQgd2lsbCBpbXByb3ZlIEpTIHNwZWVkLlxuICpcbiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIG1vZGUpIHtcbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICB2YXIgc3RhdHVzLCBfbW9kZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBfbW9kZSA9IChtb2RlID09PSB+fm1vZGUpID8gbW9kZSA6ICgobW9kZSA9PT0gdHJ1ZSkgPyBaX0ZJTklTSCA6IFpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlKHN0cm0sIF9tb2RlKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gWl9PSykge1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IFpfRklOSVNIIHx8IF9tb2RlID09PSBaX1NZTkNfRkxVU0gpKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5vbkRhdGEoc3RyaW5ncy5idWYyYmluc3RyaW5nKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IFpfU1RSRUFNX0VORCk7XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBaX09LO1xuICB9XG5cbiAgLy8gY2FsbGJhY2sgaW50ZXJpbSByZXN1bHRzIGlmIFpfU1lOQ19GTFVTSC5cbiAgaWYgKF9tb2RlID09PSBaX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKFpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIERlZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91dHB1dCBkYXRhLiBUeXBlIG9mIGFycmF5IGRlcGVuZHNcbiAqICAgb24ganMgZW5naW5lIHN1cHBvcnQuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsIGVhY2ggY2h1bmtcbiAqICAgd2lsbCBiZSBzdHJpbmcuXG4gKlxuICogQnkgZGVmYXVsdCwgc3RvcmVzIGRhdGEgYmxvY2tzIGluIGBjaHVua3NbXWAgcHJvcGVydHkgYW5kIGdsdWVcbiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkVuZChzdGF0dXMpIC0+IFZvaWRcbiAqIC0gc3RhdHVzIChOdW1iZXIpOiBkZWZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcyxcbiAqICAgb3RoZXIgaWYgbm90LlxuICpcbiAqIENhbGxlZCBvbmNlIGFmdGVyIHlvdSB0ZWxsIGRlZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpO1xuICAgIH1cbiAgfVxuICB0aGlzLmNodW5rcyA9IFtdO1xuICB0aGlzLmVyciA9IHN0YXR1cztcbiAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnO1xufTtcblxuXG4vKipcbiAqIGRlZmxhdGUoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENvbXByZXNzIGBkYXRhYCB3aXRoIGRlZmxhdGUgYWxnb3JpdGhtIGFuZCBgb3B0aW9uc2AuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gbGV2ZWxcbiAqIC0gd2luZG93Qml0c1xuICogLSBtZW1MZXZlbFxuICogLSBzdHJhdGVneVxuICogLSBkaWN0aW9uYXJ5XG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgZGF0YSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSk7XG4gKlxuICogY29uc29sZS5sb2cocGFrby5kZWZsYXRlKGRhdGEpKTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZGVmbGF0b3IgPSBuZXcgRGVmbGF0ZShvcHRpb25zKTtcblxuICBkZWZsYXRvci5wdXNoKGlucHV0LCB0cnVlKTtcblxuICAvLyBUaGF0IHdpbGwgbmV2ZXIgaGFwcGVucywgaWYgeW91IGRvbid0IGNoZWF0IHdpdGggb3B0aW9ucyA6KVxuICBpZiAoZGVmbGF0b3IuZXJyKSB7IHRocm93IGRlZmxhdG9yLm1zZyB8fCBtc2dbZGVmbGF0b3IuZXJyXTsgfVxuXG4gIHJldHVybiBkZWZsYXRvci5yZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBkZWZsYXRlUmF3KGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiBnemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCBvZlxuICogZGVmbGF0ZSBvbmUuXG4gKiovXG5mdW5jdGlvbiBnemlwKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLmd6aXAgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuZXhwb3J0cy5EZWZsYXRlID0gRGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGVSYXcgPSBkZWZsYXRlUmF3O1xuZXhwb3J0cy5nemlwID0gZ3ppcDtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9pbmZsYXRlID0gcmVxdWlyZSgnLi96bGliL2luZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIGMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9jb25zdGFudHMnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xudmFyIEdaaGVhZGVyICAgICA9IHJlcXVpcmUoJy4vemxpYi9nemhlYWRlcicpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIGNsYXNzIEluZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tpbmZsYXRlXV1cbiAqIGFuZCBbW2luZmxhdGVSYXddXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIGluZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0luZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRkZW4uXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5yZXN1bHQgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqXG4gKiBVbmNvbXByZXNzZWQgcmVzdWx0LCBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBbW0luZmxhdGUjb25EYXRhXV1cbiAqIGFuZCBbW0luZmxhdGUjb25FbmRdXSBoYW5kbGVycy4gRmlsbGVkIGFmdGVyIHlvdSBwdXNoIGxhc3QgY2h1bmtcbiAqIChjYWxsIFtbSW5mbGF0ZSNwdXNoXV0gd2l0aCBgWl9GSU5JU0hgIC8gYHRydWVgIHBhcmFtKSBvciBpZiB5b3VcbiAqIHB1c2ggYSBjaHVuayB3aXRoIGV4cGxpY2l0IGZsdXNoIChjYWxsIFtbSW5mbGF0ZSNwdXNoXV0gd2l0aFxuICogYFpfU1lOQ19GTFVTSGAgcGFyYW0pLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUuZXJyIC0+IE51bWJlclxuICpcbiAqIEVycm9yIGNvZGUgYWZ0ZXIgaW5mbGF0ZSBmaW5pc2hlZC4gMCAoWl9PSykgb24gc3VjY2Vzcy5cbiAqIFNob3VsZCBiZSBjaGVja2VkIGlmIGJyb2tlbiBkYXRhIHBvc3NpYmxlLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUubXNnIC0+IFN0cmluZ1xuICpcbiAqIEVycm9yIG1lc3NhZ2UsIGlmIFtbSW5mbGF0ZS5lcnJdXSAhPSAwXG4gKiovXG5cblxuLyoqXG4gKiBuZXcgSW5mbGF0ZShvcHRpb25zKVxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBDcmVhdGVzIG5ldyBpbmZsYXRvciBpbnN0YW5jZSB3aXRoIHNwZWNpZmllZCBwYXJhbXMuIFRocm93cyBleGNlcHRpb25cbiAqIG9uIGJhZCBwYXJhbXMuIFN1cHBvcnRlZCBvcHRpb25zOlxuICpcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBkaWN0aW9uYXJ5YFxuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlLlxuICpcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucywgZm9yIGludGVybmFsIG5lZWRzOlxuICpcbiAqIC0gYGNodW5rU2l6ZWAgLSBzaXplIG9mIGdlbmVyYXRlZCBkYXRhIGNodW5rcyAoMTZLIGJ5IGRlZmF1bHQpXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIGRvIHJhdyBpbmZsYXRlXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBjb252ZXJ0ZWRcbiAqICAgZnJvbSB1dGY4IHRvIHV0ZjE2IChqYXZhc2NyaXB0KSBzdHJpbmcuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsXG4gKiAgIGNodW5rIGxlbmd0aCBjYW4gZGlmZmVyIGZyb20gYGNodW5rU2l6ZWAsIGRlcGVuZGluZyBvbiBjb250ZW50LlxuICpcbiAqIEJ5IGRlZmF1bHQsIHdoZW4gbm8gb3B0aW9ucyBzZXQsIGF1dG9kZXRlY3QgZGVmbGF0ZS9nemlwIGRhdGEgZm9ybWF0IHZpYVxuICogd3JhcHBlciBoZWFkZXIuXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGNodW5rMSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBjaHVuazIgPSBVaW50OEFycmF5KFsxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOV0pO1xuICpcbiAqIHZhciBpbmZsYXRlID0gbmV3IHBha28uSW5mbGF0ZSh7IGxldmVsOiAzfSk7XG4gKlxuICogaW5mbGF0ZS5wdXNoKGNodW5rMSwgZmFsc2UpO1xuICogaW5mbGF0ZS5wdXNoKGNodW5rMiwgdHJ1ZSk7ICAvLyB0cnVlIC0+IGxhc3QgY2h1bmtcbiAqXG4gKiBpZiAoaW5mbGF0ZS5lcnIpIHsgdGhyb3cgbmV3IEVycm9yKGluZmxhdGUuZXJyKTsgfVxuICpcbiAqIGNvbnNvbGUubG9nKGluZmxhdGUucmVzdWx0KTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gSW5mbGF0ZShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBJbmZsYXRlKSkgcmV0dXJuIG5ldyBJbmZsYXRlKG9wdGlvbnMpO1xuXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmFzc2lnbih7XG4gICAgY2h1bmtTaXplOiAxNjM4NCxcbiAgICB3aW5kb3dCaXRzOiAwLFxuICAgIHRvOiAnJ1xuICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICB2YXIgb3B0ID0gdGhpcy5vcHRpb25zO1xuXG4gIC8vIEZvcmNlIHdpbmRvdyBzaXplIGZvciBgcmF3YCBkYXRhLCBpZiBub3Qgc2V0IGRpcmVjdGx5LFxuICAvLyBiZWNhdXNlIHdlIGhhdmUgbm8gaGVhZGVyIGZvciBhdXRvZGV0ZWN0LlxuICBpZiAob3B0LnJhdyAmJiAob3B0LndpbmRvd0JpdHMgPj0gMCkgJiYgKG9wdC53aW5kb3dCaXRzIDwgMTYpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7XG4gICAgaWYgKG9wdC53aW5kb3dCaXRzID09PSAwKSB7IG9wdC53aW5kb3dCaXRzID0gLTE1OyB9XG4gIH1cblxuICAvLyBJZiBgd2luZG93Qml0c2Agbm90IGRlZmluZWQgKGFuZCBtb2RlIG5vdCByYXcpIC0gc2V0IGF1dG9kZXRlY3QgZmxhZyBmb3IgZ3ppcC9kZWZsYXRlXG4gIGlmICgob3B0LndpbmRvd0JpdHMgPj0gMCkgJiYgKG9wdC53aW5kb3dCaXRzIDwgMTYpICYmXG4gICAgICAhKG9wdGlvbnMgJiYgb3B0aW9ucy53aW5kb3dCaXRzKSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDMyO1xuICB9XG5cbiAgLy8gR3ppcCBoZWFkZXIgaGFzIG5vIGluZm8gYWJvdXQgd2luZG93cyBzaXplLCB3ZSBjYW4gZG8gYXV0b2RldGVjdCBvbmx5XG4gIC8vIGZvciBkZWZsYXRlLiBTbywgaWYgd2luZG93IHNpemUgbm90IHNldCwgZm9yY2UgaXQgdG8gbWF4IHdoZW4gZ3ppcCBwb3NzaWJsZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID4gMTUpICYmIChvcHQud2luZG93Qml0cyA8IDQ4KSkge1xuICAgIC8vIGJpdCAzICgxNikgLT4gZ3ppcHBlZCBkYXRhXG4gICAgLy8gYml0IDQgKDMyKSAtPiBhdXRvZGV0ZWN0IGd6aXAvZGVmbGF0ZVxuICAgIGlmICgob3B0LndpbmRvd0JpdHMgJiAxNSkgPT09IDApIHtcbiAgICAgIG9wdC53aW5kb3dCaXRzIHw9IDE1O1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuZXJyICAgID0gMDsgICAgICAvLyBlcnJvciBjb2RlLCBpZiBoYXBwZW5zICgwID0gWl9PSylcbiAgdGhpcy5tc2cgICAgPSAnJzsgICAgIC8vIGVycm9yIG1lc3NhZ2VcbiAgdGhpcy5lbmRlZCAgPSBmYWxzZTsgIC8vIHVzZWQgdG8gYXZvaWQgbXVsdGlwbGUgb25FbmQoKSBjYWxsc1xuICB0aGlzLmNodW5rcyA9IFtdOyAgICAgLy8gY2h1bmtzIG9mIGNvbXByZXNzZWQgZGF0YVxuXG4gIHRoaXMuc3RybSAgID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyAgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUluaXQyKFxuICAgIHRoaXMuc3RybSxcbiAgICBvcHQud2luZG93Qml0c1xuICApO1xuXG4gIGlmIChzdGF0dXMgIT09IGMuWl9PSykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gIH1cblxuICB0aGlzLmhlYWRlciA9IG5ldyBHWmhlYWRlcigpO1xuXG4gIHpsaWJfaW5mbGF0ZS5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSwgdGhpcy5oZWFkZXIpO1xuXG4gIC8vIFNldHVwIGRpY3Rpb25hcnlcbiAgaWYgKG9wdC5kaWN0aW9uYXJ5KSB7XG4gICAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2Ygb3B0LmRpY3Rpb25hcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHQuZGljdGlvbmFyeSA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKG9wdC5kaWN0aW9uYXJ5KSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgICAgb3B0LmRpY3Rpb25hcnkgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfVxuICAgIGlmIChvcHQucmF3KSB7IC8vSW4gcmF3IG1vZGUgd2UgbmVlZCB0byBzZXQgdGhlIGRpY3Rpb25hcnkgZWFybHlcbiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIG9wdC5kaWN0aW9uYXJ5KTtcbiAgICAgIGlmIChzdGF0dXMgIT09IGMuWl9PSykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEluZmxhdGUjcHVzaChkYXRhWywgbW9kZV0pIC0+IEJvb2xlYW5cbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxBcnJheUJ1ZmZlcnxTdHJpbmcpOiBpbnB1dCBkYXRhXG4gKiAtIG1vZGUgKE51bWJlcnxCb29sZWFuKTogMC4uNiBmb3IgY29ycmVzcG9uZGluZyBaX05PX0ZMVVNILi5aX1RSRUUgbW9kZXMuXG4gKiAgIFNlZSBjb25zdGFudHMuIFNraXBwZWQgb3IgYGZhbHNlYCBtZWFucyBaX05PX0ZMVVNILCBgdHJ1ZWAgbWVhbnMgWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBpbmZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tJbmZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBvdXRwdXQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tJbmZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgZGVjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0luZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBkaWN0aW9uYXJ5ID0gdGhpcy5vcHRpb25zLmRpY3Rpb25hcnk7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuICB2YXIgbmV4dF9vdXRfdXRmOCwgdGFpbCwgdXRmOHN0cjtcblxuICAvLyBGbGFnIHRvIHByb3Blcmx5IHByb2Nlc3MgWl9CVUZfRVJST1Igb24gdGVzdGluZyBpbmZsYXRlIGNhbGxcbiAgLy8gd2hlbiB3ZSBjaGVjayB0aGF0IGFsbCBvdXRwdXQgZGF0YSB3YXMgZmx1c2hlZC5cbiAgdmFyIGFsbG93QnVmRXJyb3IgPSBmYWxzZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gYy5aX0ZJTklTSCA6IGMuWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gT25seSBiaW5hcnkgc3RyaW5ncyBjYW4gYmUgZGVjb21wcmVzc2VkIG9uIHByYWN0aWNlXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3MuYmluc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGUoc3RybSwgYy5aX05PX0ZMVVNIKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX05FRURfRElDVCAmJiBkaWN0aW9uYXJ5KSB7XG4gICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0aW9uYXJ5KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSBjLlpfQlVGX0VSUk9SICYmIGFsbG93QnVmRXJyb3IgPT09IHRydWUpIHtcbiAgICAgIHN0YXR1cyA9IGMuWl9PSztcbiAgICAgIGFsbG93QnVmRXJyb3IgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzICE9PSBjLlpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IGMuWl9PSykge1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0cm0ubmV4dF9vdXQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCBzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EIHx8IChzdHJtLmF2YWlsX2luID09PSAwICYmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCB8fCBfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpKSkge1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgICAgICBuZXh0X291dF91dGY4ID0gc3RyaW5ncy51dGY4Ym9yZGVyKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KTtcblxuICAgICAgICAgIHRhaWwgPSBzdHJtLm5leHRfb3V0IC0gbmV4dF9vdXRfdXRmODtcbiAgICAgICAgICB1dGY4c3RyID0gc3RyaW5ncy5idWYyc3RyaW5nKHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4KTtcblxuICAgICAgICAgIC8vIG1vdmUgdGFpbFxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSB0YWlsO1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplIC0gdGFpbDtcbiAgICAgICAgICBpZiAodGFpbCkgeyB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgsIHRhaWwsIDApOyB9XG5cbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGY4c3RyKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2hlbiBubyBtb3JlIGlucHV0IGRhdGEsIHdlIHNob3VsZCBjaGVjayB0aGF0IGludGVybmFsIGluZmxhdGUgYnVmZmVyc1xuICAgIC8vIGFyZSBmbHVzaGVkLiBUaGUgb25seSB3YXkgdG8gZG8gaXQgd2hlbiBhdmFpbF9vdXQgPSAwIC0gcnVuIG9uZSBtb3JlXG4gICAgLy8gaW5mbGF0ZSBwYXNzLiBCdXQgaWYgb3V0cHV0IGRhdGEgbm90IGV4aXN0cywgaW5mbGF0ZSByZXR1cm4gWl9CVUZfRVJST1IuXG4gICAgLy8gSGVyZSB3ZSBzZXQgZmxhZyB0byBwcm9jZXNzIHRoaXMgZXJyb3IgcHJvcGVybHkuXG4gICAgLy9cbiAgICAvLyBOT1RFLiBEZWZsYXRlIGRvZXMgbm90IHJldHVybiBlcnJvciBpbiB0aGlzIGNhc2UgYW5kIGRvZXMgbm90IG5lZWRzIHN1Y2hcbiAgICAvLyBsb2dpYy5cbiAgICBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiBzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgYWxsb3dCdWZFcnJvciA9IHRydWU7XG4gICAgfVxuXG4gIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBjLlpfU1RSRUFNX0VORCk7XG5cbiAgaWYgKHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQpIHtcbiAgICBfbW9kZSA9IGMuWl9GSU5JU0g7XG4gIH1cblxuICAvLyBGaW5hbGl6ZSBvbiB0aGUgbGFzdCBjaHVuay5cbiAgaWYgKF9tb2RlID09PSBjLlpfRklOSVNIKSB7XG4gICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gYy5aX09LO1xuICB9XG5cbiAgLy8gY2FsbGJhY2sgaW50ZXJpbSByZXN1bHRzIGlmIFpfU1lOQ19GTFVTSC5cbiAgaWYgKF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkge1xuICAgIHRoaXMub25FbmQoYy5aX09LKTtcbiAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXRwdXQgZGF0YS4gVHlwZSBvZiBhcnJheSBkZXBlbmRzXG4gKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rXG4gKiAgIHdpbGwgYmUgc3RyaW5nLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogaW5mbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgZWl0aGVyIGFmdGVyIHlvdSB0ZWxsIGluZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gYy5aX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEdsdWUgJiBjb252ZXJ0IGhlcmUsIHVudGlsIHdlIHRlYWNoIHBha28gdG8gc2VuZFxuICAgICAgLy8gdXRmOCBhbGlnbmVkIHN0cmluZ3MgdG8gb25EYXRhXG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpO1xuICAgIH1cbiAgfVxuICB0aGlzLmNodW5rcyA9IFtdO1xuICB0aGlzLmVyciA9IHN0YXR1cztcbiAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnO1xufTtcblxuXG4vKipcbiAqIGluZmxhdGUoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogRGVjb21wcmVzcyBgZGF0YWAgd2l0aCBpbmZsYXRlL3VuZ3ppcCBhbmQgYG9wdGlvbnNgLiBBdXRvZGV0ZWN0XG4gKiBmb3JtYXQgdmlhIHdyYXBwZXIgaGVhZGVyIGJ5IGRlZmF1bHQuIFRoYXQncyB3aHkgd2UgZG9uJ3QgcHJvdmlkZVxuICogc2VwYXJhdGUgYHVuZ3ppcGAgbWV0aG9kLlxuICpcbiAqIFN1cHBvcnRlZCBvcHRpb25zIGFyZTpcbiAqXG4gKiAtIHdpbmRvd0JpdHNcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBjb252ZXJ0ZWRcbiAqICAgZnJvbSB1dGY4IHRvIHV0ZjE2IChqYXZhc2NyaXB0KSBzdHJpbmcuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsXG4gKiAgIGNodW5rIGxlbmd0aCBjYW4gZGlmZmVyIGZyb20gYGNodW5rU2l6ZWAsIGRlcGVuZGluZyBvbiBjb250ZW50LlxuICpcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgaW5wdXQgPSBwYWtvLmRlZmxhdGUoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBvdXRwdXQ7XG4gKlxuICogdHJ5IHtcbiAqICAgb3V0cHV0ID0gcGFrby5pbmZsYXRlKGlucHV0KTtcbiAqIH0gY2F0Y2ggKGVycilcbiAqICAgY29uc29sZS5sb2coZXJyKTtcbiAqIH1cbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgaW5mbGF0b3IgPSBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICBpbmZsYXRvci5wdXNoKGlucHV0LCB0cnVlKTtcblxuICAvLyBUaGF0IHdpbGwgbmV2ZXIgaGFwcGVucywgaWYgeW91IGRvbid0IGNoZWF0IHdpdGggb3B0aW9ucyA6KVxuICBpZiAoaW5mbGF0b3IuZXJyKSB7IHRocm93IGluZmxhdG9yLm1zZyB8fCBtc2dbaW5mbGF0b3IuZXJyXTsgfVxuXG4gIHJldHVybiBpbmZsYXRvci5yZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBpbmZsYXRlUmF3KGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbaW5mbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIHVuZ3ppcChkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBKdXN0IHNob3J0Y3V0IHRvIFtbaW5mbGF0ZV1dLCBiZWNhdXNlIGl0IGF1dG9kZXRlY3RzIGZvcm1hdFxuICogYnkgaGVhZGVyLmNvbnRlbnQuIERvbmUgZm9yIGNvbnZlbmllbmNlLlxuICoqL1xuXG5cbmV4cG9ydHMuSW5mbGF0ZSA9IEluZmxhdGU7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlUmF3ID0gaW5mbGF0ZVJhdztcbmV4cG9ydHMudW5nemlwICA9IGluZmxhdGU7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIFRZUEVEX09LID0gICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBVaW50MTZBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7XG5cbmZ1bmN0aW9uIF9oYXMob2JqLCBrZXkpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG5cbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKF9oYXMoc291cmNlLCBwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgdmFyIGksIGwsIGxlbiwgcG9zLCBjaHVuaywgcmVzdWx0O1xuXG4gICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoXG4gICAgbGVuID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gam9pbiBjaHVua3NcbiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHBvcyA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgcmVzdWx0LnNldChjaHVuaywgcG9zKTtcbiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGZuVW50eXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7XG4gIH1cbn07XG5cblxuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5leHBvcnRzLnNldFR5cGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbikge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBVaW50MTZBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gSW50MzJBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblVudHlwZWQpO1xuICB9XG59O1xuXG5leHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTtcbiIsIi8vIFN0cmluZyBlbmNvZGUvZGVjb2RlIGhlbHBlcnNcbid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbi8vIFF1aWNrIGNoZWNrIGlmIHdlIGNhbiB1c2UgZmFzdCBhcnJheSB0byBiaW4gc3RyaW5nIGNvbnZlcnNpb25cbi8vXG4vLyAtIGFwcGx5KEFycmF5KSBjYW4gZmFpbCBvbiBBbmRyb2lkIDIuMlxuLy8gLSBhcHBseShVaW50OEFycmF5KSBjYW4gZmFpbCBvbiBpT1MgNS4xIFNhZmFyaVxuLy9cbnZhciBTVFJfQVBQTFlfT0sgPSB0cnVlO1xudmFyIFNUUl9BUFBMWV9VSUFfT0sgPSB0cnVlO1xuXG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFsgMCBdKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX09LID0gZmFsc2U7IH1cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoMSkpOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfVUlBX09LID0gZmFsc2U7IH1cblxuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyB1dGlscy5CdWY4KDI1Nik7XG5mb3IgKHZhciBxID0gMDsgcSA8IDI1NjsgcSsrKSB7XG4gIF91dGY4bGVuW3FdID0gKHEgPj0gMjUyID8gNiA6IHEgPj0gMjQ4ID8gNSA6IHEgPj0gMjQwID8gNCA6IHEgPj0gMjI0ID8gMyA6IHEgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XSA9IF91dGY4bGVuWzI1NF0gPSAxOyAvLyBJbnZhbGlkIHNlcXVlbmNlIHN0YXJ0XG5cblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDtcblxuICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICBmb3IgKG1fcG9zID0gMDsgbV9wb3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICB9XG5cbiAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KGJ1Zl9sZW4pO1xuXG4gIC8vIGNvbnZlcnRcbiAgZm9yIChpID0gMCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgYnVmW2krK10gPSBjO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhDMCB8IChjID4+PiA2KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIEhlbHBlciAodXNlZCBpbiAyIHBsYWNlcylcbmZ1bmN0aW9uIGJ1ZjJiaW5zdHJpbmcoYnVmLCBsZW4pIHtcbiAgLy8gT24gQ2hyb21lLCB0aGUgYXJndW1lbnRzIGluIGEgZnVuY3Rpb24gY2FsbCB0aGF0IGFyZSBhbGxvd2VkIGlzIGA2NTUzNGAuXG4gIC8vIElmIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gdGhhdCwgd2UgY2FuIHVzZSB0aGlzIG9wdGltaXphdGlvbixcbiAgLy8gb3RoZXJ3aXNlIHdlIHdpbGwgdGFrZSBhIHNsb3dlciBwYXRoLlxuICBpZiAobGVuIDwgNjU1MzQpIHtcbiAgICBpZiAoKGJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfVUlBX09LKSB8fCAoIWJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfT0spKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1dGlscy5zaHJpbmtCdWYoYnVmLCBsZW4pKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuLy8gQ29udmVydCBieXRlIGFycmF5IHRvIGJpbmFyeSBzdHJpbmdcbmV4cG9ydHMuYnVmMmJpbnN0cmluZyA9IGZ1bmN0aW9uIChidWYpIHtcbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcoYnVmLCBidWYubGVuZ3RoKTtcbn07XG5cblxuLy8gQ29udmVydCBiaW5hcnkgc3RyaW5nICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuYmluc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KHN0ci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYnVmW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbmV4cG9ydHMuYnVmMnN0cmluZyA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgaSwgb3V0LCBjLCBjX2xlbjtcbiAgdmFyIGxlbiA9IG1heCB8fCBidWYubGVuZ3RoO1xuXG4gIC8vIFJlc2VydmUgbWF4IHBvc3NpYmxlIGxlbmd0aCAoMiB3b3JkcyBwZXIgY2hhcilcbiAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gIC8vICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5IHRoYW4gVWludDE2QXJyYXkuXG4gIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4gKiAyKTtcblxuICBmb3IgKG91dCA9IDAsIGkgPSAwOyBpIDwgbGVuOykge1xuICAgIGMgPSBidWZbaSsrXTtcbiAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgaWYgKGMgPCAweDgwKSB7IHV0ZjE2YnVmW291dCsrXSA9IGM7IGNvbnRpbnVlOyB9XG5cbiAgICBjX2xlbiA9IF91dGY4bGVuW2NdO1xuICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgIGlmIChjX2xlbiA+IDQpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBpICs9IGNfbGVuIC0gMTsgY29udGludWU7IH1cblxuICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgIGMgJj0gY19sZW4gPT09IDIgPyAweDFmIDogY19sZW4gPT09IDMgPyAweDBmIDogMHgwNztcbiAgICAvLyBqb2luIHRoZSByZXN0XG4gICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgIGNfbGVuLS07XG4gICAgfVxuXG4gICAgLy8gdGVybWluYXRlZCBieSBlbmQgb2Ygc3RyaW5nP1xuICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjO1xuICAgIH0gZWxzZSB7XG4gICAgICBjIC09IDB4MTAwMDA7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGQ4MDAgfCAoKGMgPj4gMTApICYgMHgzZmYpO1xuICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkYzAwIHwgKGMgJiAweDNmZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcodXRmMTZidWYsIG91dCk7XG59O1xuXG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG5leHBvcnRzLnV0Zjhib3JkZXIgPSBmdW5jdGlvbiAoYnVmLCBtYXgpIHtcbiAgdmFyIHBvcztcblxuICBtYXggPSBtYXggfHwgYnVmLmxlbmd0aDtcbiAgaWYgKG1heCA+IGJ1Zi5sZW5ndGgpIHsgbWF4ID0gYnVmLmxlbmd0aDsgfVxuXG4gIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICBwb3MgPSBtYXggLSAxO1xuICB3aGlsZSAocG9zID49IDAgJiYgKGJ1Zltwb3NdICYgMHhDMCkgPT09IDB4ODApIHsgcG9zLS07IH1cblxuICAvLyBWZXJ5IHNtYWxsIGFuZCBicm9rZW4gc2VxdWVuY2UsXG4gIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICBpZiAocG9zIDwgMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgLy8gSWYgd2UgY2FtZSB0byBzdGFydCBvZiBidWZmZXIgLSB0aGF0IG1lYW5zIGJ1ZmZlciBpcyB0b28gc21hbGwsXG4gIC8vIHJldHVybiBtYXggdG9vLlxuICBpZiAocG9zID09PSAwKSB7IHJldHVybiBtYXg7IH1cblxuICByZXR1cm4gKHBvcyArIF91dGY4bGVuW2J1Zltwb3NdXSA+IG1heCkgPyBwb3MgOiBtYXg7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiBhZGxlcjMyIHRha2VzIDEyJSBmb3IgbGV2ZWwgMCBhbmQgMiUgZm9yIGxldmVsIDYuXG4vLyBJdCBpc24ndCB3b3J0aCBpdCB0byBtYWtlIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBhcyBpbiBvcmlnaW5hbC5cbi8vIFNtYWxsIHNpemUgaXMgcHJlZmVyYWJsZS5cblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5mdW5jdGlvbiBhZGxlcjMyKGFkbGVyLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciBzMSA9IChhZGxlciAmIDB4ZmZmZikgfDAsXG4gICAgICBzMiA9ICgoYWRsZXIgPj4+IDE2KSAmIDB4ZmZmZikgfDAsXG4gICAgICBuID0gMDtcblxuICB3aGlsZSAobGVuICE9PSAwKSB7XG4gICAgLy8gU2V0IGxpbWl0IH4gdHdpY2UgbGVzcyB0aGFuIDU1NTIsIHRvIGtlZXBcbiAgICAvLyBzMiBpbiAzMS1iaXRzLCBiZWNhdXNlIHdlIGZvcmNlIHNpZ25lZCBpbnRzLlxuICAgIC8vIGluIG90aGVyIGNhc2UgJT0gd2lsbCBmYWlsLlxuICAgIG4gPSBsZW4gPiAyMDAwID8gMjAwMCA6IGxlbjtcbiAgICBsZW4gLT0gbjtcblxuICAgIGRvIHtcbiAgICAgIHMxID0gKHMxICsgYnVmW3BvcysrXSkgfDA7XG4gICAgICBzMiA9IChzMiArIHMxKSB8MDtcbiAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgczEgJT0gNjU1MjE7XG4gICAgczIgJT0gNjU1MjE7XG4gIH1cblxuICByZXR1cm4gKHMxIHwgKHMyIDw8IDE2KSkgfDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBhZGxlcjMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbiAgWl9OT19GTFVTSDogICAgICAgICAwLFxuICBaX1BBUlRJQUxfRkxVU0g6ICAgIDEsXG4gIFpfU1lOQ19GTFVTSDogICAgICAgMixcbiAgWl9GVUxMX0ZMVVNIOiAgICAgICAzLFxuICBaX0ZJTklTSDogICAgICAgICAgIDQsXG4gIFpfQkxPQ0s6ICAgICAgICAgICAgNSxcbiAgWl9UUkVFUzogICAgICAgICAgICA2LFxuXG4gIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gICovXG4gIFpfT0s6ICAgICAgICAgICAgICAgMCxcbiAgWl9TVFJFQU1fRU5EOiAgICAgICAxLFxuICBaX05FRURfRElDVDogICAgICAgIDIsXG4gIFpfRVJSTk86ICAgICAgICAgICAtMSxcbiAgWl9TVFJFQU1fRVJST1I6ICAgIC0yLFxuICBaX0RBVEFfRVJST1I6ICAgICAgLTMsXG4gIC8vWl9NRU1fRVJST1I6ICAgICAtNCxcbiAgWl9CVUZfRVJST1I6ICAgICAgIC01LFxuICAvL1pfVkVSU0lPTl9FUlJPUjogLTYsXG5cbiAgLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4gIFpfTk9fQ09NUFJFU1NJT046ICAgICAgICAgMCxcbiAgWl9CRVNUX1NQRUVEOiAgICAgICAgICAgICAxLFxuICBaX0JFU1RfQ09NUFJFU1NJT046ICAgICAgIDksXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTjogICAtMSxcblxuXG4gIFpfRklMVEVSRUQ6ICAgICAgICAgICAgICAgMSxcbiAgWl9IVUZGTUFOX09OTFk6ICAgICAgICAgICAyLFxuICBaX1JMRTogICAgICAgICAgICAgICAgICAgIDMsXG4gIFpfRklYRUQ6ICAgICAgICAgICAgICAgICAgNCxcbiAgWl9ERUZBVUxUX1NUUkFURUdZOiAgICAgICAwLFxuXG4gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbiAgWl9CSU5BUlk6ICAgICAgICAgICAgICAgICAwLFxuICBaX1RFWFQ6ICAgICAgICAgICAgICAgICAgIDEsXG4gIC8vWl9BU0NJSTogICAgICAgICAgICAgICAgMSwgLy8gPSBaX1RFWFQgKGRlcHJlY2F0ZWQpXG4gIFpfVU5LTk9XTjogICAgICAgICAgICAgICAgMixcblxuICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbiAgWl9ERUZMQVRFRDogICAgICAgICAgICAgICA4XG4gIC8vWl9OVUxMOiAgICAgICAgICAgICAgICAgbnVsbCAvLyBVc2UgLTEgb3IgbnVsbCBpbmxpbmUsIGRlcGVuZGluZyBvbiB2YXIgdHlwZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmMzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIHRyZWVzICAgPSByZXF1aXJlKCcuL3RyZWVzJyk7XG52YXIgYWRsZXIzMiA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgbXNnICAgICA9IHJlcXVpcmUoJy4vbWVzc2FnZXMnKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbi8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbi8vdmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cblxudmFyIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7XG52YXIgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjtcbnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuLy92YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbi8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX01FTV9MRVZFTCA9IDg7XG5cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG52YXIgTUFYX0JJVFMgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIE1JTl9NQVRDSCA9IDM7XG52YXIgTUFYX01BVENIID0gMjU4O1xudmFyIE1JTl9MT09LQUhFQUQgPSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSk7XG5cbnZhciBQUkVTRVRfRElDVCA9IDB4MjA7XG5cbnZhciBJTklUX1NUQVRFID0gNDI7XG52YXIgRVhUUkFfU1RBVEUgPSA2OTtcbnZhciBOQU1FX1NUQVRFID0gNzM7XG52YXIgQ09NTUVOVF9TVEFURSA9IDkxO1xudmFyIEhDUkNfU1RBVEUgPSAxMDM7XG52YXIgQlVTWV9TVEFURSA9IDExMztcbnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7XG5cbnZhciBCU19ORUVEX01PUkUgICAgICA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xudmFyIEJTX0JMT0NLX0RPTkUgICAgID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovXG52YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOyAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqL1xudmFyIEJTX0ZJTklTSF9ET05FICAgID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG52YXIgT1NfQ09ERSA9IDB4MDM7IC8vIFVuaXggOikgLiBEb24ndCBkZXRlY3QsIHVzZSB0aGlzIGRlZmF1bHQuXG5cbmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHtcbiAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTtcbiAgcmV0dXJuIGVycm9yQ29kZTtcbn1cblxuZnVuY3Rpb24gcmFuayhmKSB7XG4gIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7XG59XG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXNcbiAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXRcbiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuXG4gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkge1xuICB2YXIgcyA9IHN0cm0uc3RhdGU7XG5cbiAgLy9fdHJfZmx1c2hfYml0cyhzKTtcbiAgdmFyIGxlbiA9IHMucGVuZGluZztcbiAgaWYgKGxlbiA+IHN0cm0uYXZhaWxfb3V0KSB7XG4gICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm47IH1cblxuICB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nX291dCwgbGVuLCBzdHJtLm5leHRfb3V0KTtcbiAgc3RybS5uZXh0X291dCArPSBsZW47XG4gIHMucGVuZGluZ19vdXQgKz0gbGVuO1xuICBzdHJtLnRvdGFsX291dCArPSBsZW47XG4gIHN0cm0uYXZhaWxfb3V0IC09IGxlbjtcbiAgcy5wZW5kaW5nIC09IGxlbjtcbiAgaWYgKHMucGVuZGluZyA9PT0gMCkge1xuICAgIHMucGVuZGluZ19vdXQgPSAwO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZmx1c2hfYmxvY2tfb25seShzLCBsYXN0KSB7XG4gIHRyZWVzLl90cl9mbHVzaF9ibG9jayhzLCAocy5ibG9ja19zdGFydCA+PSAwID8gcy5ibG9ja19zdGFydCA6IC0xKSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xufVxuXG5cbmZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluXG4gKiBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikge1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGIgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMlxuICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2hcbiAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkXG4gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuXG4gKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS5cbiAqL1xuZnVuY3Rpb24gcmVhZF9idWYoc3RybSwgYnVmLCBzdGFydCwgc2l6ZSkge1xuICB2YXIgbGVuID0gc3RybS5hdmFpbF9pbjtcblxuICBpZiAobGVuID4gc2l6ZSkgeyBsZW4gPSBzaXplOyB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuIDA7IH1cblxuICBzdHJtLmF2YWlsX2luIC09IGxlbjtcblxuICAvLyB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTtcbiAgdXRpbHMuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpO1xuICBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAxKSB7XG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikge1xuICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgc3RybS5uZXh0X2luICs9IGxlbjtcbiAgc3RybS50b3RhbF9pbiArPSBsZW47XG5cbiAgcmV0dXJuIGxlbjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZFxuICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpc1xuICogZ2FyYmFnZS5cbiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnRcbiAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDFcbiAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKSB7XG4gIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7ICAgICAgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovXG4gIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi9cbiAgdmFyIG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqL1xuICB2YXIgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovXG4gIHZhciBuaWNlX21hdGNoID0gcy5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovXG4gIHZhciBsaW1pdCA9IChzLnN0cnN0YXJ0ID4gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpID9cbiAgICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSA6IDAvKk5JTCovO1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7IC8vIHNob3J0Y3V0XG5cbiAgdmFyIHdtYXNrID0gcy53X21hc2s7XG4gIHZhciBwcmV2ICA9IHMucHJldjtcblxuICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLFxuICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLlxuICAgKi9cblxuICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgdmFyIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICB2YXIgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOyB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICAgICAhPT0gc2Nhbl9lbmQgIHx8XG4gICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHxcbiAgICAgICAgX3dpblttYXRjaF0gICAgICAgICAgICAgICAgIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgICAgX3dpblsrK21hdGNoXSAgICAgICAgICAgICAgIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcblxuICAgIC8vIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcblxuICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIO1xuXG4gICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7XG4gICAgICBzLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoO1xuICAgICAgYmVzdF9sZW4gPSBsZW47XG4gICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG4gICAgfVxuICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApO1xuXG4gIGlmIChiZXN0X2xlbiA8PSBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBiZXN0X2xlbjtcbiAgfVxuICByZXR1cm4gcy5sb29rYWhlYWQ7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LlxuICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLlxuICpcbiAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRFxuICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQURcbiAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZVxuICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2xcbiAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLlxuICovXG5mdW5jdGlvbiBmaWxsX3dpbmRvdyhzKSB7XG4gIHZhciBfd19zaXplID0gcy53X3NpemU7XG4gIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7XG5cbiAgLy9Bc3NlcnQocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCwgXCJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0O1xuXG4gICAgLy8gSlMgaW50cyBoYXZlIDMyIGJpdCwgYmxvY2sgYmVsb3cgbm90IG5lZWRlZFxuICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovXG4gICAgLy9pZiAoc2l6ZW9mKGludCkgPD0gMikge1xuICAgIC8vICAgIGlmIChtb3JlID09IDAgJiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkge1xuICAgIC8vICAgICAgICBtb3JlID0gd3NpemU7XG4gICAgLy9cbiAgICAvLyAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7XG4gICAgLy8gICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZlxuICAgIC8vICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKVxuICAgIC8vICAgICAgICAgKi9cbiAgICAvLyAgICAgICAgbW9yZS0tO1xuICAgIC8vICAgIH1cbiAgICAvL31cblxuXG4gICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCxcbiAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0ID49IF93X3NpemUgKyAoX3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG5cbiAgICAgIHV0aWxzLmFycmF5U2V0KHMud2luZG93LCBzLndpbmRvdywgX3dfc2l6ZSwgX3dfc2l6ZSwgMCk7XG4gICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7XG4gICAgICBzLnN0cnN0YXJ0IC09IF93X3NpemU7XG4gICAgICAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVCAqL1xuICAgICAgcy5ibG9ja19zdGFydCAtPSBfd19zaXplO1xuXG4gICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXNcbiAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMFxuICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDBcbiAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2ZcbiAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKVxuICAgICAgICovXG5cbiAgICAgIG4gPSBzLmhhc2hfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5oZWFkWy0tcF07XG4gICAgICAgIHMuaGVhZFtwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbiA9IF93X3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMucHJldlstLXBdO1xuICAgICAgICBzLnByZXZbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXRcbiAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICovXG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBtb3JlICs9IF93X3NpemU7XG4gICAgfVxuICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOlxuICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmXG4gICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0XG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpXG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyXG4gICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksXG4gICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiZcbiAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELlxuICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuXG4gICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLlxuICAgICAqL1xuICAgIC8vQXNzZXJ0KG1vcmUgPj0gMiwgXCJtb3JlIDwgMlwiKTtcbiAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTtcbiAgICBzLmxvb2thaGVhZCArPSBuO1xuXG4gICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovXG4gICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7XG4gICAgICBzdHIgPSBzLnN0cnN0YXJ0IC0gcy5pbnNlcnQ7XG4gICAgICBzLmluc19oID0gcy53aW5kb3dbc3RyXTtcblxuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzaztcbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICAgIHN0cisrO1xuICAgICAgICBzLmluc2VydC0tO1xuICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSxcbiAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgICovXG5cbiAgfSB3aGlsZSAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMuc3RybS5hdmFpbF9pbiAhPT0gMCk7XG5cbiAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW5cbiAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mXG4gICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieVxuICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVwZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dFxuICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC5cbiAgICovXG4vLyAgaWYgKHMuaGlnaF93YXRlciA8IHMud2luZG93X3NpemUpIHtcbi8vICAgIHZhciBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuLy8gICAgdmFyIGluaXQgPSAwO1xuLy9cbi8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4vLyAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVFxuLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3Vycjtcbi8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbi8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuLy8gICAgfVxuLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7XG4vLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbi8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcilcbi8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDtcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbi8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2VcbiAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkXG4gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uXG4gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tXG4gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSB7XG4gIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkXG4gICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOlxuICAgKi9cbiAgdmFyIG1heF9ibG9ja19zaXplID0gMHhmZmZmO1xuXG4gIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMucGVuZGluZ19idWZfc2l6ZSAtIDUpIHtcbiAgICBtYXhfYmxvY2tfc2l6ZSA9IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG4gIH1cblxuICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkge1xuXG4gICAgICAvL0Fzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fFxuICAgICAgLy8gIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgaWYgKCEocy5zdHJzdGFydCA8IHMud19zaXplICsgKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgfHxcbi8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkge1xuLy8gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgfVxuXG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuXG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cbiAgICAvL0Fzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgXCJibG9jayBnb25lXCIpO1xuLy8gICAgaWYgKHMuYmxvY2tfc3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBnb25lXCIpO1xuXG4gICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgICBzLmxvb2thaGVhZCA9IDA7XG5cbiAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi9cbiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplO1xuXG4gICAgaWYgKHMuc3Ryc3RhcnQgPT09IDAgfHwgcy5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHtcbiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovXG4gICAgICBzLmxvb2thaGVhZCA9IHMuc3Ryc3RhcnQgLSBtYXhfc3RhcnQ7XG4gICAgICBzLnN0cnN0YXJ0ID0gbWF4X3N0YXJ0O1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cblxuXG4gICAgfVxuICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZVxuICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6XG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuXG4gIHMuaW5zZXJ0ID0gMDtcblxuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cblxuICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfTkVFRF9NT1JFO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnRcbiAqIGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzXG4gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnRcbiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgKChzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkKSA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkpIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuICAgIH1cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvLyBjaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCk7IC8vIGZvciBkZWJ1ZyBvbmx5XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuXG4gICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgICAgICovXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZVxuICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuXG4gICAgICAgICAgICovXG4gICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApO1xuICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICB9IGVsc2VcbiAgICAgIHtcbiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQrMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgMV0pICYgcy5oYXNoX21hc2s7XG5cbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3RcbiAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC5cbiAgICAgICAgICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy53aW5kb3dbcy5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAoKHMuc3Ryc3RhcnQgPCAoTUlOX01BVENIIC0gMSkpID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDEpO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eVxuICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpc1xuICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgdmFyIG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKi9cbiAgICBzLnByZXZfbGVuZ3RoID0gcy5tYXRjaF9sZW5ndGg7XG4gICAgcy5wcmV2X21hdGNoID0gcy5tYXRjaF9zdGFydDtcbiAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG5cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJlxuICAgICAgICBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpLypNQVhfRElTVChzKSovKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5Ni8qVE9PX0ZBUiovKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudFxuICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6XG4gICAgICovXG4gICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHtcbiAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7XG4gICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi9cblxuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LTEsIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCk7XG5cbiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7KioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGggLSAxO1xuICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKytzLnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHtcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7XG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiovXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYVxuICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaFxuICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC5cbiAgICAgICAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIH1cbiAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0IDwgTUlOX01BVENIIC0gMSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZVxuICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mXG4gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi9cbiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkge1xuICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG4gICAgfVxuXG4gICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqL1xuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5zdHJzdGFydCAtIDEsIHMubWF0Y2hfbGVuZ3RoKTtcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG4gIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDtcbiAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5O1xuICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7XG4gIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluO1xuICB0aGlzLmZ1bmMgPSBmdW5jO1xufVxuXG52YXIgY29uZmlndXJhdGlvbl90YWJsZTtcblxuY29uZmlndXJhdGlvbl90YWJsZSA9IFtcbiAgLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqL1xuICBuZXcgQ29uZmlnKDAsIDAsIDAsIDAsIGRlZmxhdGVfc3RvcmVkKSwgICAgICAgICAgLyogMCBzdG9yZSBvbmx5ICovXG4gIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgICAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoNCwgNSwgMTYsIDgsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAvKiAyICovXG4gIG5ldyBDb25maWcoNCwgNiwgMzIsIDMyLCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAvKiAzICovXG5cbiAgbmV3IENvbmZpZyg0LCA0LCAxNiwgMTYsIGRlZmxhdGVfc2xvdyksICAgICAgICAgIC8qIDQgbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAvKiA1ICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA2ICovXG4gIG5ldyBDb25maWcoOCwgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA3ICovXG4gIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3cpLCAgICAvKiA4ICovXG4gIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpICAgICAvKiA5IG1heCBjb21wcmVzc2lvbiAqL1xuXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIFwibG9uZ2VzdCBtYXRjaFwiIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbVxuICovXG5mdW5jdGlvbiBsbV9pbml0KHMpIHtcbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn1cblxuXG5mdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi9cbiAgdGhpcy5zdGF0dXMgPSAwOyAgICAgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi9cbiAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7ICAgICAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi9cbiAgdGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgIC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi9cbiAgdGhpcy5wZW5kaW5nX291dCA9IDA7ICAgICAgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovXG4gIHRoaXMucGVuZGluZyA9IDA7ICAgICAgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5nemhlYWQgPSBudWxsOyAgICAgICAgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovXG4gIHRoaXMuZ3ppbmRleCA9IDA7ICAgICAgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqL1xuICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovXG4gIHRoaXMubGFzdF9mbHVzaCA9IC0xOyAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi9cbiAgdGhpcy53X2JpdHMgPSAwOyAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgIC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAgIC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7ICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMuaGFzaF9zaXplID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqL1xuICB0aGlzLmhhc2hfYml0cyA9IDA7ICAgLyogbG9nMihoYXNoX3NpemUpICovXG4gIHRoaXMuaGFzaF9tYXNrID0gMDsgICAvKiBoYXNoX3NpemUtMSAqL1xuXG4gIHRoaXMuaGFzaF9zaGlmdCA9IDA7XG4gIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0XG4gICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdFxuICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczpcbiAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0c1xuICAgKi9cblxuICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzXG4gICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuXG4gICAqL1xuXG4gIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqL1xuICB0aGlzLnByZXZfbWF0Y2ggPSAwOyAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi9cbiAgdGhpcy5tYXRjaF9hdmFpbGFibGUgPSAwOyAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi9cbiAgdGhpcy5zdHJzdGFydCA9IDA7ICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi9cbiAgdGhpcy5tYXRjaF9zdGFydCA9IDA7ICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqL1xuICB0aGlzLmxvb2thaGVhZCA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqL1xuXG4gIHRoaXMucHJldl9sZW5ndGggPSAwO1xuICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXNcbiAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uXG4gICAqL1xuXG4gIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7XG4gIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzXG4gICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGVcbiAgICogc3BlZWQuXG4gICAqL1xuXG4gIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwO1xuICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5XG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uXG4gICAqIGxldmVscyA+PSA0LlxuICAgKi9cbiAgLy8gVGhhdCdzIGFsaWFzIHRvIG1heF9sYXp5X21hdGNoLCBkb24ndCB1c2UgZGlyZWN0bHlcbiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDtcbiAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3RcbiAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLlxuICAgKi9cblxuICB0aGlzLmxldmVsID0gMDsgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqL1xuICB0aGlzLnN0cmF0ZWd5ID0gMDsgIC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi9cblxuICB0aGlzLmdvb2RfbWF0Y2ggPSAwO1xuICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi9cblxuICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovXG5cbiAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqL1xuXG4gIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi9cblxuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi9cblxuICAvLyBVc2UgZmxhdCBhcnJheSBvZiBET1VCTEUgc2l6ZSwgd2l0aCBpbnRlcmxlYXZlZCBmYXRhLFxuICAvLyBiZWNhdXNlIEpTIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0aXZlXG4gIHRoaXMuZHluX2x0cmVlICA9IG5ldyB1dGlscy5CdWYxNihIRUFQX1NJWkUgKiAyKTtcbiAgdGhpcy5keW5fZHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7XG4gIHRoaXMuYmxfdHJlZSAgICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTtcbiAgemVybyh0aGlzLmR5bl9sdHJlZSk7XG4gIHplcm8odGhpcy5keW5fZHRyZWUpO1xuICB6ZXJvKHRoaXMuYmxfdHJlZSk7XG5cbiAgdGhpcy5sX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHRoaXMuaGVhcCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHplcm8odGhpcy5oZWFwKTtcblxuICB0aGlzLmhlYXBfbGVuID0gMDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLlxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8vdWNoIGRlcHRoWzIqTF9DT0RFUysxXTtcbiAgemVybyh0aGlzLmRlcHRoKTtcbiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeVxuICAgKi9cblxuICB0aGlzLmxfYnVmID0gMDsgICAgICAgICAgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovXG5cbiAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7XG4gIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3JcbiAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOlxuICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXRcbiAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuXG4gICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvclxuICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhblxuICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLlxuICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuXG4gICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3RcbiAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3JcbiAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieVxuICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmVcbiAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZ1xuICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LlxuICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0XG4gICAqL1xuXG4gIHRoaXMubGFzdF9saXQgPSAwOyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cblxuICB0aGlzLmRfYnVmID0gMDtcbiAgLyogQnVmZmVyIGluZGV4IGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZVxuICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZ1xuICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuXG4gICAqL1xuXG4gIHRoaXMub3B0X2xlbiA9IDA7ICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi9cbiAgdGhpcy5zdGF0aWNfbGVuID0gMDsgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovXG4gIHRoaXMubWF0Y2hlcyA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovXG4gIHRoaXMuaW5zZXJ0ID0gMDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi9cblxuXG4gIHRoaXMuYmlfYnVmID0gMDtcbiAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3RcbiAgICogc2lnbmlmaWNhbnQgYml0cykuXG4gICAqL1xuICB0aGlzLmJpX3ZhbGlkID0gMDtcbiAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0XG4gICAqIGFyZSBhbHdheXMgemVyby5cbiAgICovXG5cbiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlc1xuICAvLyBzZW5zZSBvbmx5IGZvciBwb2ludGVycyBhbmQgbWVtb3J5IGNoZWNrIHRvb2xzLlxuICAvL3RoaXMuaGlnaF93YXRlciA9IDA7XG4gIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZVxuICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlblxuICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlblxuICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLlxuICAgKi9cbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHM7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwO1xuICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjtcblxuICBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPSAocy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEUpO1xuICBzdHJtLmFkbGVyID0gKHMud3JhcCA9PT0gMikgP1xuICAgIDAgIC8vIGNyYzMyKDAsIFpfTlVMTCwgMClcbiAgOlxuICAgIDE7IC8vIGFkbGVyMzIoMCwgWl9OVUxMLCAwKVxuICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIO1xuICB0cmVlcy5fdHJfaW5pdChzKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0spIHtcbiAgICBsbV9pbml0KHN0cm0uc3RhdGUpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7XG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIHZhciB3cmFwID0gMTtcblxuICBpZiAobGV2ZWwgPT09IFpfREVGQVVMVF9DT01QUkVTU0lPTikge1xuICAgIGxldmVsID0gNjtcbiAgfVxuXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi9cbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHtcbiAgICB3cmFwID0gMjsgICAgICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovXG4gICAgd2luZG93Qml0cyAtPSAxNjtcbiAgfVxuXG5cbiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuXG4gIGlmICh3aW5kb3dCaXRzID09PSA4KSB7XG4gICAgd2luZG93Qml0cyA9IDk7XG4gIH1cbiAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqL1xuXG4gIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpO1xuXG4gIHN0cm0uc3RhdGUgPSBzO1xuICBzLnN0cm0gPSBzdHJtO1xuXG4gIHMud3JhcCA9IHdyYXA7XG4gIHMuZ3poZWFkID0gbnVsbDtcbiAgcy53X2JpdHMgPSB3aW5kb3dCaXRzO1xuICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7XG4gIHMud19tYXNrID0gcy53X3NpemUgLSAxO1xuXG4gIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3O1xuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgdXRpbHMuQnVmMTYocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgdXRpbHMuQnVmMTYocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0O1xuXG4gIC8vb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7XG4gIC8vcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5O1xuICBzLnBlbmRpbmdfYnVmID0gbmV3IHV0aWxzLkJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTtcblxuICAvLyBJdCBpcyBvZmZzZXQgZnJvbSBgcy5wZW5kaW5nX2J1ZmAgKHNpemUgaXMgYHMubGl0X2J1ZnNpemUgKiAyYClcbiAgLy9zLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTtcbiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplO1xuXG4gIC8vcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTtcbiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplO1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkge1xuICByZXR1cm4gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSk7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgb2xkX2ZsdXNoLCBzO1xuICB2YXIgYmVnLCB2YWw7IC8vIGZvciBnemlwIGhlYWRlciB3cml0ZSBvbmx5XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8XG4gICAgZmx1c2ggPiBaX0JMT0NLIHx8IGZsdXNoIDwgMCkge1xuICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKSA6IFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKCFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHx8XG4gICAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCAoc3RybS5hdmFpbF9vdXQgPT09IDApID8gWl9CVUZfRVJST1IgOiBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzLnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi9cbiAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoO1xuICBzLmxhc3RfZmx1c2ggPSBmbHVzaDtcblxuICAvKiBXcml0ZSB0aGUgaGVhZGVyICovXG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuXG4gICAgaWYgKHMud3JhcCA9PT0gMikgeyAvLyBHWklQIGhlYWRlclxuICAgICAgc3RybS5hZGxlciA9IDA7ICAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgcHV0X2J5dGUocywgMzEpO1xuICAgICAgcHV0X2J5dGUocywgMTM5KTtcbiAgICAgIHB1dF9ieXRlKHMsIDgpO1xuICAgICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KVxuICAgICAgICApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDgpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDB4ZmYpO1xuICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZik7XG4gICAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSAvLyBERUZMQVRFIGhlYWRlclxuICAgIHtcbiAgICAgIHZhciBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODtcbiAgICAgIHZhciBsZXZlbF9mbGFncyA9IC0xO1xuXG4gICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPCA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA9PT0gNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDM7XG4gICAgICB9XG4gICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHsgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOyB9XG4gICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpO1xuXG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi9cbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gIH1cblxuLy8jaWZkZWYgR1pJUFxuICBpZiAocy5zdGF0dXMgPT09IEVYVFJBX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmV4dHJhLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cblxuICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSAmIDB4ZmYpO1xuICAgICAgICBzLmd6aW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3ppbmRleCA9PT0gcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gTkFNRV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5uYW1lLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmNvbW1lbnQvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5jb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgaWYgKHMucGVuZGluZyArIDIgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyIDw9IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgICAgIHN0cm0uYWRsZXIgPSAwOyAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgIH1cbiAgfVxuLy8jZW5kaWZcblxuICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovXG4gIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aFxuICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmRcbiAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLFxuICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZTpcbiAgICAgICAqL1xuICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICByZXR1cm4gWl9PSztcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmVcbiAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcFxuICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi5cbiAgICAgKi9cbiAgfSBlbHNlIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHJhbmsoZmx1c2gpIDw9IHJhbmsob2xkX2ZsdXNoKSAmJlxuICAgIGZsdXNoICE9PSBaX0ZJTklTSCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi9cbiAgaWYgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLlxuICAgKi9cbiAgaWYgKHN0cm0uYXZhaWxfaW4gIT09IDAgfHwgcy5sb29rYWhlYWQgIT09IDAgfHxcbiAgICAoZmx1c2ggIT09IFpfTk9fRkxVU0ggJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHtcbiAgICB2YXIgYnN0YXRlID0gKHMuc3RyYXRlZ3kgPT09IFpfSFVGRk1BTl9PTkxZKSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOlxuICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfUkxFID8gZGVmbGF0ZV9ybGUocywgZmx1c2gpIDpcbiAgICAgICAgY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsIGZsdXNoKSk7XG5cbiAgICBpZiAoYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9ET05FKSB7XG4gICAgICBzLnN0YXR1cyA9IEZJTklTSF9TVEFURTtcbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfTkVFRF9NT1JFIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICB9XG4gICAgICByZXR1cm4gWl9PSztcbiAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGxcbiAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlXG4gICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW5cbiAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvXG4gICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3RcbiAgICAgICAqIG9uZSBlbXB0eSBibG9jay5cbiAgICAgICAqL1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19CTE9DS19ET05FKSB7XG4gICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkge1xuICAgICAgICB0cmVlcy5fdHJfYWxpZ24ocyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmbHVzaCAhPT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi9cblxuICAgICAgICB0cmVlcy5fdHJfc3RvcmVkX2Jsb2NrKHMsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWRcbiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9GVUxMX0ZMVVNIKSB7XG4gICAgICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovICAgICAgICAgICAgIC8qIGZvcmdldCBoaXN0b3J5ICovXG4gICAgICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5pbnNlcnQgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICAgIHJldHVybiBaX09LO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0Fzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCBcImJ1ZzJcIik7XG4gIC8vaWYgKHN0cm0uYXZhaWxfb3V0IDw9IDApIHsgdGhyb3cgbmV3IEVycm9yKFwiYnVnMlwiKTt9XG5cbiAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCkgeyByZXR1cm4gWl9PSzsgfVxuICBpZiAocy53cmFwIDw9IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VORDsgfVxuXG4gIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovXG4gIGlmIChzLndyYXAgPT09IDIpIHtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAyNCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAyNCkgJiAweGZmKTtcbiAgfVxuICBlbHNlXG4gIHtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gIH1cblxuICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluXG4gICAqIHRvIGZsdXNoIHRoZSByZXN0LlxuICAgKi9cbiAgaWYgKHMud3JhcCA+IDApIHsgcy53cmFwID0gLXMud3JhcDsgfVxuICAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovXG4gIHJldHVybiBzLnBlbmRpbmcgIT09IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlRW5kKHN0cm0pIHtcbiAgdmFyIHN0YXR1cztcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSBJTklUX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBFWFRSQV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQ09NTUVOVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gSENSQ19TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRklOSVNIX1NUQVRFXG4gICkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG5cbiAgcmV0dXJuIHN0YXR1cyA9PT0gQlVTWV9TVEFURSA/IGVycihzdHJtLCBaX0RBVEFfRVJST1IpIDogWl9PSztcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlXG4gKiBzZXF1ZW5jZSB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgcztcbiAgdmFyIHN0ciwgbjtcbiAgdmFyIHdyYXA7XG4gIHZhciBhdmFpbDtcbiAgdmFyIG5leHQ7XG4gIHZhciBpbnB1dDtcbiAgdmFyIHRtcERpY3Q7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzID0gc3RybS5zdGF0ZTtcbiAgd3JhcCA9IHMud3JhcDtcblxuICBpZiAod3JhcCA9PT0gMiB8fCAod3JhcCA9PT0gMSAmJiBzLnN0YXR1cyAhPT0gSU5JVF9TVEFURSkgfHwgcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi9cbiAgaWYgKHdyYXAgPT09IDEpIHtcbiAgICAvKiBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMihzdHJtLmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgfVxuXG4gIHMud3JhcCA9IDA7ICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovXG5cbiAgLyogaWYgZGljdGlvbmFyeSB3b3VsZCBmaWxsIHdpbmRvdywganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5ICovXG4gIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7XG4gICAgaWYgKHdyYXAgPT09IDApIHsgICAgICAgICAgICAvKiBhbHJlYWR5IGVtcHR5IG90aGVyd2lzZSAqL1xuICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG4gICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgcy5pbnNlcnQgPSAwO1xuICAgIH1cbiAgICAvKiB1c2UgdGhlIHRhaWwgKi9cbiAgICAvLyBkaWN0aW9uYXJ5ID0gZGljdGlvbmFyeS5zbGljZShkaWN0TGVuZ3RoIC0gcy53X3NpemUpO1xuICAgIHRtcERpY3QgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSk7XG4gICAgdXRpbHMuYXJyYXlTZXQodG1wRGljdCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCAtIHMud19zaXplLCBzLndfc2l6ZSwgMCk7XG4gICAgZGljdGlvbmFyeSA9IHRtcERpY3Q7XG4gICAgZGljdExlbmd0aCA9IHMud19zaXplO1xuICB9XG4gIC8qIGluc2VydCBkaWN0aW9uYXJ5IGludG8gd2luZG93IGFuZCBoYXNoICovXG4gIGF2YWlsID0gc3RybS5hdmFpbF9pbjtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gZGljdExlbmd0aDtcbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7XG4gIGZpbGxfd2luZG93KHMpO1xuICB3aGlsZSAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgc3RyID0gcy5zdHJzdGFydDtcbiAgICBuID0gcy5sb29rYWhlYWQgLSAoTUlOX01BVENIIC0gMSk7XG4gICAgZG8ge1xuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG5cbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgIHN0cisrO1xuICAgIH0gd2hpbGUgKC0tbik7XG4gICAgcy5zdHJzdGFydCA9IHN0cjtcbiAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgZmlsbF93aW5kb3cocyk7XG4gIH1cbiAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIHMuaW5zZXJ0ID0gcy5sb29rYWhlYWQ7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmlucHV0ID0gaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBhdmFpbDtcbiAgcy53cmFwID0gd3JhcDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZXhwb3J0cy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0O1xuZXhwb3J0cy5kZWZsYXRlSW5pdDIgPSBkZWZsYXRlSW5pdDI7XG5leHBvcnRzLmRlZmxhdGVSZXNldCA9IGRlZmxhdGVSZXNldDtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmRlZmxhdGVTZXRIZWFkZXIgPSBkZWZsYXRlU2V0SGVhZGVyO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZUVuZCA9IGRlZmxhdGVFbmQ7XG5leHBvcnRzLmRlZmxhdGVTZXREaWN0aW9uYXJ5ID0gZGVmbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmRlZmxhdGVJbmZvID0gJ3Bha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuZGVmbGF0ZUJvdW5kID0gZGVmbGF0ZUJvdW5kO1xuZXhwb3J0cy5kZWZsYXRlQ29weSA9IGRlZmxhdGVDb3B5O1xuZXhwb3J0cy5kZWZsYXRlUGFyYW1zID0gZGVmbGF0ZVBhcmFtcztcbmV4cG9ydHMuZGVmbGF0ZVBlbmRpbmcgPSBkZWZsYXRlUGVuZGluZztcbmV4cG9ydHMuZGVmbGF0ZVByaW1lID0gZGVmbGF0ZVByaW1lO1xuZXhwb3J0cy5kZWZsYXRlVHVuZSA9IGRlZmxhdGVUdW5lO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5mdW5jdGlvbiBHWmhlYWRlcigpIHtcbiAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqL1xuICB0aGlzLnRleHQgICAgICAgPSAwO1xuICAvKiBtb2RpZmljYXRpb24gdGltZSAqL1xuICB0aGlzLnRpbWUgICAgICAgPSAwO1xuICAvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLnhmbGFncyAgICAgPSAwO1xuICAvKiBvcGVyYXRpbmcgc3lzdGVtICovXG4gIHRoaXMub3MgICAgICAgICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi9cbiAgdGhpcy5leHRyYSAgICAgID0gbnVsbDtcbiAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovXG4gIHRoaXMuZXh0cmFfbGVuICA9IDA7IC8vIEFjdHVhbGx5LCB3ZSBkb24ndCBuZWVkIGl0IGluIEpTLFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbGVhdmUgZm9yIGZldyBjb2RlIG1vZGlmaWNhdGlvbnNcblxuICAvL1xuICAvLyBTZXR1cCBsaW1pdHMgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5XG4gIC8vIGZvciBpbmZsYXRlIHVzZSBjb25zdGFudCBsaW1pdCBpbiA2NTUzNiBieXRlc1xuICAvL1xuXG4gIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuZXh0cmFfbWF4ICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi9cbiAgdGhpcy5uYW1lICAgICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5uYW1lX21heCAgID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi9cbiAgdGhpcy5jb21tZW50ICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5jb21tX21heCAgID0gMDtcbiAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi9cbiAgdGhpcy5oY3JjICAgICAgID0gMDtcbiAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLmRvbmUgICAgICAgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHWmhlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vLyBTZWUgc3RhdGUgZGVmcyBmcm9tIGluZmxhdGUuanNcbnZhciBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyIFRZUEUgPSAxMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG5cbi8qXG4gICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nXG4gICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXNcbiAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuXG4gICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yXG4gICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlXG4gICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS5cblxuICAgRW50cnkgYXNzdW1wdGlvbnM6XG5cbiAgICAgICAgc3RhdGUubW9kZSA9PT0gTEVOXG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPj0gNlxuICAgICAgICBzdHJtLmF2YWlsX291dCA+PSAyNThcbiAgICAgICAgc3RhcnQgPj0gc3RybS5hdmFpbF9vdXRcbiAgICAgICAgc3RhdGUuYml0cyA8IDhcblxuICAgT24gcmV0dXJuLCBzdGF0ZS5tb2RlIGlzIG9uZSBvZjpcblxuICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXRcbiAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2tcbiAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGFcblxuICAgTm90ZXM6XG5cbiAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZVxuICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsXG4gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLlxuICAgICAgVGhlcmVmb3JlIGlmIHN0cm0uYXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWRcbiAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuXG5cbiAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNThcbiAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKVxuICAgICAgcmVxdWlyZXMgc3RybS5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yXG4gICAgICBvdXRwdXQgc3BhY2UuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIF9pbjsgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaW5wdXQgKi9cbiAgdmFyIGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqL1xuICB2YXIgX291dDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGJlZzsgICAgICAgICAgICAgICAgICAgIC8qIGluZmxhdGUoKSdzIGluaXRpYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqL1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgdmFyIGRtYXg7ICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqL1xuLy8jZW5kaWZcbiAgdmFyIHdzaXplOyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqL1xuICB2YXIgd2hhdmU7ICAgICAgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqL1xuICB2YXIgd25leHQ7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovXG4gIC8vIFVzZSBgc193aW5kb3dgIGluc3RlYWQgYHdpbmRvd2AsIGF2b2lkIGNvbmZsaWN0IHdpdGggaW5zdHJ1bWVudGF0aW9uIHRvb2xzXG4gIHZhciBzX3dpbmRvdzsgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaG9sZCAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5iaXRzICovXG4gIHZhciBsY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmxlbmNvZGUgKi9cbiAgdmFyIGRjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uZGlzdGNvZGUgKi9cbiAgdmFyIGxtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGxlbmd0aCBjb2RlcyAqL1xuICB2YXIgZG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi9cbiAgdmFyIGhlcmU7ICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqL1xuICB2YXIgb3A7ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBiaXRzLCBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIG9yICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqL1xuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi9cbiAgdmFyIGRpc3Q7ICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGRpc3RhbmNlICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuXG5cbiAgdmFyIGlucHV0LCBvdXRwdXQ7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcblxuICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqL1xuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIC8vaGVyZSA9IHN0YXRlLmhlcmU7XG4gIF9pbiA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBsYXN0ID0gX2luICsgKHN0cm0uYXZhaWxfaW4gLSA1KTtcbiAgX291dCA9IHN0cm0ubmV4dF9vdXQ7XG4gIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICBiZWcgPSBfb3V0IC0gKHN0YXJ0IC0gc3RybS5hdmFpbF9vdXQpO1xuICBlbmQgPSBfb3V0ICsgKHN0cm0uYXZhaWxfb3V0IC0gMjU3KTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIGRtYXggPSBzdGF0ZS5kbWF4O1xuLy8jZW5kaWZcbiAgd3NpemUgPSBzdGF0ZS53c2l6ZTtcbiAgd2hhdmUgPSBzdGF0ZS53aGF2ZTtcbiAgd25leHQgPSBzdGF0ZS53bmV4dDtcbiAgc193aW5kb3cgPSBzdGF0ZS53aW5kb3c7XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgbGNvZGUgPSBzdGF0ZS5sZW5jb2RlO1xuICBkY29kZSA9IHN0YXRlLmRpc3Rjb2RlO1xuICBsbWFzayA9ICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMTtcbiAgZG1hc2sgPSAoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxO1xuXG5cbiAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoXG4gICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovXG5cbiAgdG9wOlxuICBkbyB7XG4gICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgfVxuXG4gICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107XG5cbiAgICBkb2xlbjpcbiAgICBmb3IgKDs7KSB7IC8vIEdvdG8gZW11bGF0aW9uXG4gICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgIGJpdHMgLT0gb3A7XG4gICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG4gICAgICBpZiAob3AgPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgb3V0cHV0W19vdXQrK10gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovXG4gICAgICAgIGxlbiA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgIGlmIChvcCkge1xuICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbiArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIGxlbikpO1xuICAgICAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaGVyZSA9IGRjb2RlW2hvbGQgJiBkbWFza107XG5cbiAgICAgICAgZG9kaXN0OlxuICAgICAgICBmb3IgKDs7KSB7IC8vIGdvdG8gZW11bGF0aW9uXG4gICAgICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuXG4gICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqL1xuICAgICAgICAgICAgZGlzdCA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIGRpc3QpKTtcbiAgICAgICAgICAgIG9wID0gX291dCAtIGJlZzsgICAgICAgICAgICAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqL1xuICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgICAgIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhdWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSBvcCAtIHdoYXZlKSB7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgbGVuIC09IG9wIC0gd2hhdmU7XG4vLyAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3AgPiB3aGF2ZSk7XG4vLyAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0O1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZyb20gPSAwOyAvLyB3aW5kb3cgaW5kZXhcbiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBzX3dpbmRvdztcbiAgICAgICAgICAgICAgaWYgKHduZXh0ID09PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIG9wIC09IHduZXh0O1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7XG4gICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovXG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpO1xuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgICAgICBoZXJlID0gZGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgICAgIC8qIDJuZCBsZXZlbCBsZW5ndGggY29kZSAqL1xuICAgICAgICBoZXJlID0gbGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgY29udGludWUgZG9sZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgfVxuICB9IHdoaWxlIChfaW4gPCBsYXN0ICYmIF9vdXQgPCBlbmQpO1xuXG4gIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqL1xuICBsZW4gPSBiaXRzID4+IDM7XG4gIF9pbiAtPSBsZW47XG4gIGJpdHMgLT0gbGVuIDw8IDM7XG4gIGhvbGQgJj0gKDEgPDwgYml0cykgLSAxO1xuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovXG4gIHN0cm0ubmV4dF9pbiA9IF9pbjtcbiAgc3RybS5uZXh0X291dCA9IF9vdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSAoX2luIDwgbGFzdCA/IDUgKyAobGFzdCAtIF9pbikgOiA1IC0gKF9pbiAtIGxhc3QpKTtcbiAgc3RybS5hdmFpbF9vdXQgPSAoX291dCA8IGVuZCA/IDI1NyArIChlbmQgLSBfb3V0KSA6IDI1NyAtIChfb3V0IC0gZW5kKSk7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgcmV0dXJuO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgICAgICAgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIGFkbGVyMzIgICAgICAgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgICAgICAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIGluZmxhdGVfZmFzdCAgPSByZXF1aXJlKCcuL2luZmZhc3QnKTtcbnZhciBpbmZsYXRlX3RhYmxlID0gcmVxdWlyZSgnLi9pbmZ0cmVlcycpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuLy92YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbi8vdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuLy92YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG52YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xudmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgICAgSEVBRCA9IDE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xudmFyICAgIEZMQUdTID0gMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqL1xudmFyICAgIFRJTUUgPSAzOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi9cbnZhciAgICBPUyA9IDQ7ICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG52YXIgICAgRVhMRU4gPSA1OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBFWFRSQSA9IDY7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovXG52YXIgICAgTkFNRSA9IDc7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovXG52YXIgICAgQ09NTUVOVCA9IDg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqL1xudmFyICAgIEhDUkMgPSA5OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqL1xudmFyICAgIERJQ1RJRCA9IDEwOyAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovXG52YXIgICAgRElDVCA9IDExOyAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqL1xudmFyICAgICAgICBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xudmFyICAgICAgICBUWVBFRE8gPSAxMzsgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqL1xudmFyICAgICAgICBTVE9SRUQgPSAxNDsgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi9cbnZhciAgICAgICAgQ09QWV8gPSAxNTsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgIENPUFkgPSAxNjsgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqL1xudmFyICAgICAgICBUQUJMRSA9IDE3OyAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovXG52YXIgICAgICAgIExFTkxFTlMgPSAxODsgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgQ09ERUxFTlMgPSAxOTsgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICAgICAgTEVOXyA9IDIwOyAgICAgIC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgICAgICBMRU4gPSAyMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xudmFyICAgICAgICAgICAgTEVORVhUID0gMjI7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBESVNUID0gMjM7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqL1xudmFyICAgICAgICAgICAgRElTVEVYVCA9IDI0OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIE1BVENIID0gMjU7ICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi9cbnZhciAgICAgICAgICAgIExJVCA9IDI2OyAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqL1xudmFyICAgIENIRUNLID0gMjc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBMRU5HVEggPSAyODsgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBET05FID0gMjk7ICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIE1FTSA9IDMxOyAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIFNZTkMgPSAzMjsgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5cbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAgKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9XQklUUyA9IE1BWF9XQklUUztcblxuXG5mdW5jdGlvbiB6c3dhcDMyKHEpIHtcbiAgcmV0dXJuICAoKChxID4+PiAyNCkgJiAweGZmKSArXG4gICAgICAgICAgKChxID4+PiA4KSAmIDB4ZmYwMCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYwMCkgPDwgOCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYpIDw8IDI0KSk7XG59XG5cblxuZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCkge1xuICB0aGlzLm1vZGUgPSAwOyAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqL1xuICB0aGlzLmxhc3QgPSBmYWxzZTsgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5oYXZlZGljdCA9IGZhbHNlOyAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqL1xuICB0aGlzLmZsYWdzID0gMDsgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqL1xuICB0aGlzLmRtYXggPSAwOyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi9cbiAgdGhpcy5jaGVjayA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovXG4gIHRoaXMudG90YWwgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi9cbiAgLy8gVE9ETzogbWF5IGJlIHt9XG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovXG5cbiAgLyogc2xpZGluZyB3aW5kb3cgKi9cbiAgdGhpcy53Yml0cyA9IDA7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovXG4gIHRoaXMud3NpemUgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdGhpcy53aGF2ZSA9IDA7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdGhpcy53bmV4dCA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICB0aGlzLndpbmRvdyA9IG51bGw7ICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi9cblxuICAvKiBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5ob2xkID0gMDsgICAgICAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmJpdHMgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gXCJpblwiICovXG5cbiAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi9cbiAgdGhpcy5sZW5ndGggPSAwOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqL1xuICB0aGlzLm9mZnNldCA9IDA7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovXG5cbiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovXG4gIHRoaXMuZXh0cmEgPSAwOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqL1xuXG4gIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuY29kZSA9IG51bGw7ICAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqL1xuICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi9cbiAgdGhpcy5sZW5iaXRzID0gMDsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi9cbiAgdGhpcy5kaXN0Yml0cyA9IDA7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovXG5cbiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqL1xuICB0aGlzLm5jb2RlID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5sZW4gPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5uZGlzdCA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovXG4gIHRoaXMubmV4dCA9IG51bGw7ICAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovXG5cbiAgdGhpcy5sZW5zID0gbmV3IHV0aWxzLkJ1ZjE2KDMyMCk7IC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy53b3JrID0gbmV3IHV0aWxzLkJ1ZjE2KDI4OCk7IC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqL1xuXG4gIC8qXG4gICBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcG9pbnRlcnMgaW4ganMsIHdlIHVzZSBsZW5jb2RlIGFuZCBkaXN0Y29kZSBkaXJlY3RseVxuICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzXG4gICovXG4gIC8vdGhpcy5jb2RlcyA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqL1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7XG4gIHN0cm0ubXNnID0gJyc7IC8qWl9OVUxMKi9cbiAgaWYgKHN0YXRlLndyYXApIHsgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqL1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTtcbiAgfVxuICBzdGF0ZS5tb2RlID0gSEVBRDtcbiAgc3RhdGUubGFzdCA9IDA7XG4gIHN0YXRlLmhhdmVkaWN0ID0gMDtcbiAgc3RhdGUuZG1heCA9IDMyNzY4O1xuICBzdGF0ZS5oZWFkID0gbnVsbC8qWl9OVUxMKi87XG4gIHN0YXRlLmhvbGQgPSAwO1xuICBzdGF0ZS5iaXRzID0gMDtcbiAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0xFTlMpO1xuICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0RJU1RTKTtcblxuICBzdGF0ZS5zYW5lID0gMTtcbiAgc3RhdGUuYmFjayA9IC0xO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IHJlc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RhdGUud3NpemUgPSAwO1xuICBzdGF0ZS53aGF2ZSA9IDA7XG4gIHN0YXRlLnduZXh0ID0gMDtcbiAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7XG5cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciB3cmFwO1xuICB2YXIgc3RhdGU7XG5cbiAgLyogZ2V0IHRoZSBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkge1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuICBlbHNlIHtcbiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxO1xuICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHtcbiAgICAgIHdpbmRvd0JpdHMgJj0gMTU7XG4gICAgfVxuICB9XG5cbiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovXG4gIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIGlmIChzdGF0ZS53aW5kb3cgIT09IG51bGwgJiYgc3RhdGUud2JpdHMgIT09IHdpbmRvd0JpdHMpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXNldCB0aGUgcmVzdCBvZiBpdCAqL1xuICBzdGF0ZS53cmFwID0gd3JhcDtcbiAgc3RhdGUud2JpdHMgPSB3aW5kb3dCaXRzO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgcmV0O1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICAvL3N0cm0ubXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi9cblxuICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTtcblxuICAvL2lmIChzdGF0ZSA9PT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogYWxsb2NhdGVkXFxuXCIpKTtcbiAgc3RybS5zdGF0ZSA9IHN0YXRlO1xuICBzdGF0ZS53aW5kb3cgPSBudWxsLypaX05VTEwqLztcbiAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTtcbiAgaWYgKHJldCAhPT0gWl9PSykge1xuICAgIHN0cm0uc3RhdGUgPSBudWxsLypaX05VTEwqLztcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKSB7XG4gIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTtcbn1cblxuXG4vKlxuIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG9cbiBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguXG4gSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZVxuIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmRcbiB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpblxuIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZVxuIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW5cbiBtYXkgbm90IGJlIHRocmVhZC1zYWZlLlxuICovXG52YXIgdmlyZ2luID0gdHJ1ZTtcblxudmFyIGxlbmZpeCwgZGlzdGZpeDsgLy8gV2UgaGF2ZSBubyBwb2ludGVycyBpbiBKUywgc28ga2VlcCB0YWJsZXMgc2VwYXJhdGVcblxuZnVuY3Rpb24gZml4ZWR0YWJsZXMoc3RhdGUpIHtcbiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi9cbiAgaWYgKHZpcmdpbikge1xuICAgIHZhciBzeW07XG5cbiAgICBsZW5maXggPSBuZXcgdXRpbHMuQnVmMzIoNTEyKTtcbiAgICBkaXN0Zml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDMyKTtcblxuICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuICAgIHdoaWxlIChzeW0gPCAyNTYpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA5OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4MCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjg4KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShMRU5TLCAgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsICAgMCwgc3RhdGUud29yaywgeyBiaXRzOiA5IH0pO1xuXG4gICAgLyogZGlzdGFuY2UgdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAzMikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7IH1cblxuICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCAgIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogNSB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9XG4gIGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpO1xuICAgIGNvcHkgLT0gZGlzdDtcbiAgICBpZiAoY29weSkge1xuICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpO1xuICAgICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgaW5wdXQsIG91dHB1dDsgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGJ1ZmZlcnNcbiAgdmFyIG5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgaW5wdXQgSU5ERVggKi9cbiAgdmFyIHB1dDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7ICAgICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqL1xuICB2YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICB2YXIgb3B0cztcblxuICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3IgTkVFRF9CSVRTXG5cbiAgdmFyIG9yZGVyID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovXG4gICAgWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1IF07XG5cblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7IHN0YXRlLm1vZGUgPSBUWVBFRE87IH0gICAgLyogc2tpcCBjaGVjayAqL1xuXG5cbiAgLy8tLS0gTE9BRCgpIC0tLVxuICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIC8vLS0tXG5cbiAgX2luID0gaGF2ZTtcbiAgX291dCA9IGxlZnQ7XG4gIHJldCA9IFpfT0s7XG5cbiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvblxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgICBjYXNlIEhFQUQ6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gMC8qY3JjMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuXG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubW9kZSA9IEZMQUdTO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZsYWdzID0gMDsgICAgICAgICAgIC8qIGV4cGVjdCB6bGliIGhlYWRlciAqL1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGhlYWRlciBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgICBzdGF0ZS53Yml0cyA9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgd2luZG93IHNpemUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcXG5cIikpO1xuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxLyphZGxlcjMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZMQUdTOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkO1xuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHhmZikgIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gVElNRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUSU1FOlxuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpXG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzNdID0gKGhvbGQgPj4+IDI0KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgICAgLy89PT1cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IE9TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE9TOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7XG4gICAgICAgICAgc3RhdGUuaGVhZC5vcyA9IChob2xkID4+IDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBFWExFTjpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkO1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX2xlbiA9IGhvbGQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG51bGwvKlpfTlVMTCovO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBFWFRSQTpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB1bnR5cGVkIGFycmF5IGZvciBtb3JlIGNvbnZlbmllbnQgcHJvY2Vzc2luZyBsYXRlclxuICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHV0aWxzLmFycmF5U2V0KFxuICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2tcbiAgICAgICAgICAgICAgICBjb3B5LFxuICAgICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgICAgbGVuXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID9cbiAgICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuIDogY29weSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGgpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IE5BTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTkFNRTpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwODAwKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgY29weSA9IDA7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5uYW1lX21heCovKSkge1xuICAgICAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG5cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT01NRU5UO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPTU1FTlQ6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MTAwMCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGNvcHkgPSAwO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQuY29tbV9tYXgqLykpIHtcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGlmIChsZW4pIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IEhDUkM7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgSENSQzpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLmNoZWNrICYgMHhmZmZmKSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaGVhZGVyIGNyYyBtaXNtYXRjaCc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBESUNUSUQ6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSB6c3dhcDMyKGhvbGQpO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IERJQ1Q7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElDVDpcbiAgICAgICAgaWYgKHN0YXRlLmhhdmVkaWN0ID09PSAwKSB7XG4gICAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gICAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgICAgLy8tLS1cbiAgICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7XG4gICAgICAgIH1cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUWVBFOlxuICAgICAgICBpZiAoZmx1c2ggPT09IFpfQkxPQ0sgfHwgZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRURPOlxuICAgICAgICBpZiAoc3RhdGUubGFzdCkge1xuICAgICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkvKkJJVFMoMSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDE7XG4gICAgICAgIGJpdHMgLT0gMTtcbiAgICAgICAgLy8tLS0vL1xuXG4gICAgICAgIHN3aXRjaCAoKGhvbGQgJiAweDAzKS8qQklUUygyKSovKSB7XG4gICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqL1xuICAgICAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpO1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi9cbiAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykge1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi9cbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYmxvY2sgdHlwZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNUT1JFRDpcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vLyAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovXG4gICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPT0gKChob2xkID4+PiAxNikgXiAweGZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcXG5cIixcbiAgICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IENPUFlfO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09QWV86XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFk6XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgLy8tLS0gem1lbWNweShwdXQsIG5leHQsIGNvcHkpOyAtLS1cbiAgICAgICAgICB1dGlscy5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgICBwdXQgKz0gY29weTtcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRBQkxFOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNCk7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTQpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDI1NztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDU7XG4gICAgICAgIGJpdHMgLT0gNTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5uZGlzdCA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDE7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA0O1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNDtcbiAgICAgICAgYml0cyAtPSA0O1xuICAgICAgICAvLy0tLS8vXG4vLyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkRcbiAgICAgICAgaWYgKHN0YXRlLm5sZW4gPiAyODYgfHwgc3RhdGUubmRpc3QgPiAzMCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3RvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHRhYmxlIHNpemVzIG9rXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkxFTlM6XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmNvZGUpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgMTkpIHtcbiAgICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvL3N0YXRlLm5leHQgPSBzdGF0ZS5jb2RlcztcbiAgICAgICAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICAgIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW47XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSA3O1xuXG4gICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUubGVucywgMCwgMTksIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IENPREVMRU5TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPREVMRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07LypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGhlcmVfdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAyO1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBpZiAoc3RhdGUuaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiAweDAzKTsvL0JJVFMoMik7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhlcmVfdmFsID09PSAxNykge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICAgIGNvcHkgPSAxMSArIChob2xkICYgMHg3Zik7Ly9CSVRTKDcpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyg3KSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gNztcbiAgICAgICAgICAgICAgYml0cyAtPSA3O1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuaGF2ZSArIGNvcHkgPiBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkge1xuICAgICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqL1xuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7IGJyZWFrOyB9XG5cbiAgICAgICAgLyogY2hlY2sgZm9yIGVuZC1vZi1ibG9jayBjb2RlIChiZXR0ZXIgaGF2ZSBvbmUpICovXG4gICAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAtLSBub3RlOiBkbyBub3QgY2hhbmdlIHRoZSBsZW5iaXRzIG9yIGRpc3RiaXRzXG4gICAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gOTtcblxuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSA2O1xuICAgICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgICAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluO1xuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5kaXN0Yml0cyB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCBzdGF0ZS5ubGVuLCBzdGF0ZS5uZGlzdCwgc3RhdGUuZGlzdGNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAgIC8vIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dDtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZXMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsICdpbmZsYXRlOiAgICAgICBjb2RlcyBva1xcbicpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTl87XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5fOlxuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTjpcbiAgICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkge1xuICAgICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAgIC8vLS0tXG4gICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpO1xuICAgICAgICAgIC8vLS0tIExPQUQoKSAtLS1cbiAgICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICAgICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICAgICAgICAgIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICAgICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgICAgICAgICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgICAgICAgICBob2xkID0gc3RhdGUuaG9sZDtcbiAgICAgICAgICBiaXRzID0gc3RhdGUuYml0cztcbiAgICAgICAgICAvLy0tLVxuXG4gICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHtcbiAgICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuYmFjayA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOyAgLypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKGhlcmVfYml0cyA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDtcbiAgICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHtcbiAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgP1xuICAgICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gTElUO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYgMzIpIHtcbiAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5FWFQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVORVhUOlxuICAgICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgICBzdGF0ZS53YXMgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBESVNUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJU1Q6XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxKV07LypCSVRTKHN0YXRlLmRpc3RiaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUub2Zmc2V0ID0gaGVyZV92YWw7XG4gICAgICAgIHN0YXRlLmV4dHJhID0gKGhlcmVfb3ApICYgMTU7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJU1RFWFQ6XG4gICAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUub2Zmc2V0ICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICAgIH1cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBzdGF0ZS5kbWF4KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgc3RhdGUub2Zmc2V0KSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBNQVRDSDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBNQVRDSDpcbiAgICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSBfb3V0IC0gbGVmdDtcbiAgICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IGNvcHkpIHsgICAgICAgICAvKiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53aGF2ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYXVsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsIFwiaW5mbGF0ZS5jIHRvbyBmYXJcXG5cIikpO1xuLy8gICAgICAgICAgY29weSAtPSBzdGF0ZS53aGF2ZTtcbi8vICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbi8vICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuLy8gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuLy8gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4vLyAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSAwO1xuLy8gICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbi8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuLy8gICAgICAgICAgYnJlYWs7XG4vLyNlbmRpZlxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLnduZXh0KSB7XG4gICAgICAgICAgICBjb3B5IC09IHN0YXRlLnduZXh0O1xuICAgICAgICAgICAgZnJvbSA9IHN0YXRlLndzaXplIC0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmcm9tID0gc3RhdGUud25leHQgLSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4gICAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZS53aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS5vZmZzZXQ7XG4gICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIG91dHB1dFtwdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExJVDpcbiAgICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGxlZnQtLTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENIRUNLOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIC8vIFVzZSAnfCcgaW5zdGVhZCBvZiAnKycgdG8gbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHNpZ25lZFxuICAgICAgICAgICAgaG9sZCB8PSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBfb3V0IC09IGxlZnQ7XG4gICAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgICAgICAgICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICAgICAgICAgIGlmIChfb3V0KSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPVxuICAgICAgICAgICAgICAgIC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBwdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgICAgICAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSk7XG5cbiAgICAgICAgICB9XG4gICAgICAgICAgX291dCA9IGxlZnQ7XG4gICAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQgMzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b29cbiAgICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGRhdGEgY2hlY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkdUSDpcbiAgICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRE9ORTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBET05FOlxuICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7XG4gICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgIGNhc2UgQkFEOlxuICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7XG4gICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgIGNhc2UgTUVNOlxuICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgICBjYXNlIFNZTkM6XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgICB9XG4gIH1cblxuICAvLyBpbmZfbGVhdmUgPC0gaGVyZSBpcyByZWFsIHBsYWNlIGZvciBcImdvdG8gaW5mX2xlYXZlXCIsIGVtdWxhdGVkIHZpYSBcImJyZWFrIGluZl9sZWF2ZVwiXG5cbiAgLypcbiAgICAgUmV0dXJuIGZyb20gaW5mbGF0ZSgpLCB1cGRhdGluZyB0aGUgdG90YWwgY291bnRzIGFuZCB0aGUgY2hlY2sgdmFsdWUuXG4gICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXJcbiAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuXG4gICAgIE5vdGU6IGEgbWVtb3J5IGVycm9yIGZyb20gaW5mbGF0ZSgpIGlzIG5vbi1yZWNvdmVyYWJsZS5cbiAgICovXG5cbiAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIC8vLS0tXG5cbiAgaWYgKHN0YXRlLndzaXplIHx8IChfb3V0ICE9PSBzdHJtLmF2YWlsX291dCAmJiBzdGF0ZS5tb2RlIDwgQkFEICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gpKSkge1xuICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIHtcbiAgICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgfVxuICB9XG4gIF9pbiAtPSBzdHJtLmF2YWlsX2luO1xuICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0O1xuICBzdHJtLnRvdGFsX2luICs9IF9pbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgaWYgKHN0YXRlLndyYXAgJiYgX291dCkge1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki9cbiAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTtcbiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCkgJiYgcmV0ID09PSBaX09LKSB7XG4gICAgcmV0ID0gWl9CVUZfRVJST1I7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKSB7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIC8qfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUud2luZG93KSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuICBzdHJtLnN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICB2YXIgc3RhdGU7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmICgoc3RhdGUud3JhcCAmIDIpID09PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuXG4gIC8qIHNhdmUgaGVhZGVyIHN0cnVjdHVyZSAqL1xuICBzdGF0ZS5oZWFkID0gaGVhZDtcbiAgaGVhZC5kb25lID0gZmFsc2U7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHN0YXRlO1xuICB2YXIgZGljdGlkO1xuICB2YXIgcmV0O1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSAvKiA9PSBaX05VTEwgKi8gfHwgIXN0cm0uc3RhdGUgLyogPT0gWl9OVUxMICovKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqL1xuICBpZiAoc3RhdGUubW9kZSA9PT0gRElDVCkge1xuICAgIGRpY3RpZCA9IDE7IC8qIGFkbGVyMzIoMCwgbnVsbCwgMCkqL1xuICAgIC8qIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7XG4gICAgfVxuICB9XG4gIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlXG4gICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovXG4gIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTtcbiAgaWYgKHJldCkge1xuICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICB9XG4gIHN0YXRlLmhhdmVkaWN0ID0gMTtcbiAgLy8gVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5leHBvcnRzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7XG5leHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0O1xuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlRW5kID0gaW5mbGF0ZUVuZDtcbmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7XG5leHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG52YXIgTUFYQklUUyA9IDE1O1xudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9IChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxudmFyIGxiYXNlID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqL1xuICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuXTtcblxudmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCxcbiAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OFxuXTtcblxudmFyIGRiYXNlID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovXG4gIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MyxcbiAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LFxuICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwXG5dO1xuXG52YXIgZGV4dCA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsXG4gIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LFxuICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0XG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgbGVuc19pbmRleCwgY29kZXMsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cylcbntcbiAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvL2hlcmUgPSBvcHRzLmhlcmU7IC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqL1xuXG4gIHZhciBsZW4gPSAwOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovXG4gIHZhciBzeW0gPSAwOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqL1xuICB2YXIgbWluID0gMCwgbWF4ID0gMDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi9cbiAgdmFyIHJvb3QgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi9cbiAgdmFyIGN1cnIgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi9cbiAgdmFyIGRyb3AgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqL1xuICB2YXIgbGVmdCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovXG4gIHZhciB1c2VkID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovXG4gIHZhciBodWZmID0gMDsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqL1xuICB2YXIgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi9cbiAgdmFyIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqL1xuICB2YXIgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cbiAgdmFyIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqL1xuICB2YXIgYmFzZSA9IG51bGw7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgYmFzZV9pbmRleCA9IDA7XG4vLyAgdmFyIHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi9cbiAgdmFyIGNvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG4gIHZhciBleHRyYSA9IG51bGw7XG4gIHZhciBleHRyYV9pbmRleCA9IDA7XG5cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7XG5cbiAgLypcbiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGVcbiAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGVcbiAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyXG4gICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzXG4gICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlclxuICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGhcbiAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHNcbiAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzXG4gICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLlxuXG4gICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpblxuICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy5cbiAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0XG4gICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLlxuXG4gICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsXG4gICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGVcbiAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZFxuICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5XG4gICB0aGUgY2FsbGVyLlxuXG4gICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nXG4gICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnlcbiAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkXG4gICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcy5cbiAgICovXG5cbiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovXG4gIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgY291bnRbbGVuXSA9IDA7XG4gIH1cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrO1xuICB9XG5cbiAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi9cbiAgcm9vdCA9IGJpdHM7XG4gIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7XG4gICAgaWYgKGNvdW50W21heF0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA+IG1heCkge1xuICAgIHJvb3QgPSBtYXg7XG4gIH1cbiAgaWYgKG1heCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi9cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7ICAvL2hlcmUub3AgPSAodmFyIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7ICAgLy9oZXJlLnZhbCA9ICh2YXIgc2hvcnQpMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG5cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7XG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG4gICAgb3B0cy5iaXRzID0gMTtcbiAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi9cbiAgfVxuICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspIHtcbiAgICBpZiAoY291bnRbbWluXSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290IDwgbWluKSB7XG4gICAgcm9vdCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqL1xuICBsZWZ0ID0gMTtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBsZWZ0IDw8PSAxO1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi9cbiAgfVxuICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT09IENPREVTIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUykge1xuICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgIGVuZCA9IDE5O1xuXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykge1xuICAgIGJhc2UgPSBsYmFzZTtcbiAgICBiYXNlX2luZGV4IC09IDI1NztcbiAgICBleHRyYSA9IGxleHQ7XG4gICAgZXh0cmFfaW5kZXggLT0gMjU3O1xuICAgIGVuZCA9IDI1NjtcblxuICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRElTVFMgKi9cbiAgICBiYXNlID0gZGJhc2U7XG4gICAgZXh0cmEgPSBkZXh0O1xuICAgIGVuZCA9IC0xO1xuICB9XG5cbiAgLyogaW5pdGlhbGl6ZSBvcHRzIGZvciBsb29wICovXG4gIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovXG4gIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqL1xuICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi9cbiAgbmV4dCA9IHRhYmxlX2luZGV4OyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovXG4gIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi9cbiAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi9cbiAgbG93ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi9cbiAgdXNlZCA9IDEgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqL1xuICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqL1xuXG4gIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqL1xuICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLyogcHJvY2VzcyBhbGwgY29kZXMgYW5kIG1ha2UgdGFibGUgZW50cmllcyAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH1cbiAgICBlbHNlIGlmICh3b3JrW3N5bV0gPiBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8MDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkgeyBicmVhazsgfVxuICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG5cbiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi9cbiAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqL1xuICAgICAgaWYgKGRyb3AgPT09IDApIHtcbiAgICAgICAgZHJvcCA9IHJvb3Q7XG4gICAgICB9XG5cbiAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi9cbiAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfVxuICAgICAgICBjdXJyKys7XG4gICAgICAgIGxlZnQgPDw9IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi9cbiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyO1xuICAgICAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8MDtcbiAgICB9XG4gIH1cblxuICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZVxuICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGVcbiAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi9cbiAgaWYgKGh1ZmYgIT09IDApIHtcbiAgICAvL3RhYmxlLm9wW25leHQgKyBodWZmXSA9IDY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbbmV4dCArIGh1ZmZdID0gbGVuIC0gZHJvcDtcbiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwO1xuICAgIHRhYmxlW25leHQgKyBodWZmXSA9ICgobGVuIC0gZHJvcCkgPDwgMjQpIHwgKDY0IDw8IDE2KSB8MDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAyOiAgICAgICduZWVkIGRpY3Rpb25hcnknLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi9cbiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovXG4gIDA6ICAgICAgJycsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqL1xuICAnLTEnOiAgICdmaWxlIGVycm9yJywgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi9cbiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovXG4gICctMyc6ICAgJ2RhdGEgZXJyb3InLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqL1xuICAnLTQnOiAgICdpbnN1ZmZpY2llbnQgbWVtb3J5JywgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi9cbiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovXG4gICctNic6ICAgJ2luY29tcGF0aWJsZSB2ZXJzaW9uJyAvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqL1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBzcGFjZS11bmFyeS1vcHMgKi9cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xudmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCAgICA9IDM7XG52YXIgTUFYX01BVENIICAgID0gMjU4O1xuLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqL1xuXG4vLyBGcm9tIGRlZmxhdGUuaFxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS5cbiAqL1xuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG5cbnZhciBNQVhfQklUUyAgICAgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIEJ1Zl9zaXplICAgICAgPSAxNjtcbi8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi9cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0YW50c1xuICovXG5cbnZhciBNQVhfQkxfQklUUyA9IDc7XG4vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovXG5cbnZhciBFTkRfQkxPQ0sgICA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxudmFyIFJFUF8zXzYgICAgID0gMTY7XG4vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzNfMTAgICA9IDE3O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbnZhciBleHRyYV9sYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi9cbiAgWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTtcblxudmFyIGJsX29yZGVyID1cbiAgWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO1xuLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xuXG4vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nXG4gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy5cbiAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuXG4gKi9cblxuLy8gV2UgcHJlLWZpbGwgYXJyYXlzIHdpdGggMCB0byBhdm9pZCB1bmluaXRpYWxpemVkIGdhcHNcblxudmFyIERJU1RfQ09ERV9MRU4gPSA1MTI7IC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqL1xuXG4vLyAhISEhIFVzZSBmbGF0IGFycmF5IGluc3RlYWQgb2Ygc3RydWN0dXJlLCBGcmVxID0gaSoyLCBMZW4gPSBpKjIrMVxudmFyIHN0YXRpY19sdHJlZSAgPSBuZXcgQXJyYXkoKExfQ09ERVMgKyAyKSAqIDIpO1xuemVybyhzdGF0aWNfbHRyZWUpO1xuLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm9cbiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyXG4gKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXRcbiAqIGJlbG93KS5cbiAqL1xuXG52YXIgc3RhdGljX2R0cmVlICA9IG5ldyBBcnJheShEX0NPREVTICogMik7XG56ZXJvKHN0YXRpY19kdHJlZSk7XG4vKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlXG4gKiA1IGJpdHMuKVxuICovXG5cbnZhciBfZGlzdF9jb2RlICAgID0gbmV3IEFycmF5KERJU1RfQ09ERV9MRU4pO1xuemVybyhfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbnZhciBfbGVuZ3RoX2NvZGUgID0gbmV3IEFycmF5KE1BWF9NQVRDSCAtIE1JTl9NQVRDSCArIDEpO1xuemVybyhfbGVuZ3RoX2NvZGUpO1xuLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9sZW5ndGggICA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMpO1xuemVybyhiYXNlX2xlbmd0aCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9kaXN0ICAgICA9IG5ldyBBcnJheShEX0NPREVTKTtcbnplcm8oYmFzZV9kaXN0KTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovXG5cblxuZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsIGV4dHJhX2JpdHMsIGV4dHJhX2Jhc2UsIGVsZW1zLCBtYXhfbGVuZ3RoKSB7XG5cbiAgdGhpcy5zdGF0aWNfdHJlZSAgPSBzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iaXRzICAgPSBleHRyYV9iaXRzOyAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYmFzZSAgID0gZXh0cmFfYmFzZTsgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovXG4gIHRoaXMuZWxlbXMgICAgICAgID0gZWxlbXM7ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovXG4gIHRoaXMubWF4X2xlbmd0aCAgID0gbWF4X2xlbmd0aDsgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovXG5cbiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzXG4gIHRoaXMuaGFzX3N0cmVlICAgID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoO1xufVxuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxuZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7ICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgICAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqL1xufVxuXG5cblxuZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHtcbiAgcmV0dXJuIGRpc3QgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYgKyAoZGlzdCA+Pj4gNyldO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uXG4gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuXG4gKi9cbmZ1bmN0aW9uIHB1dF9zaG9ydChzLCB3KSB7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodyA+Pj4gOCkgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPiAoQnVmX3NpemUgLSBsZW5ndGgpKSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSB2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLmJpX3ZhbGlkKTtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplO1xuICB9IGVsc2Uge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlbmRfY29kZShzLCBjLCB0cmVlKSB7XG4gIHNlbmRfYml0cyhzLCB0cmVlW2MgKiAyXS8qLkNvZGUqLywgdHJlZVtjICogMiArIDFdLyouTGVuKi8pO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLCBsZW4pIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGRvIHtcbiAgICByZXMgfD0gY29kZSAmIDE7XG4gICAgY29kZSA+Pj49IDE7XG4gICAgcmVzIDw8PSAxO1xuICB9IHdoaWxlICgtLWxlbiA+IDApO1xuICByZXR1cm4gcmVzID4+PiAxO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGJpX2ZsdXNoKHMpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IDA7XG4gICAgcy5iaV92YWxpZCA9IDA7XG5cbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID49IDgpIHtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMHhmZjtcbiAgICBzLmJpX2J1ZiA+Pj0gODtcbiAgICBzLmJpX3ZhbGlkIC09IDg7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2JpdGxlbihzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgICAgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIG1heF9jb2RlICAgICAgICA9IGRlc2MubWF4X2NvZGU7XG4gIHZhciBzdHJlZSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGV4dHJhICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7XG4gIHZhciBiYXNlICAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlO1xuICB2YXIgbWF4X2xlbmd0aCAgICAgID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgdmFyIGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovXG4gIHZhciBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqL1xuICB2YXIgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi9cbiAgdmFyIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi9cbiAgdmFyIG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIHMuYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXlcbiAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuXG4gICAqL1xuICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXS8qLkxlbiovID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqL1xuXG4gIGZvciAoaCA9IHMuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHtcbiAgICBuID0gcy5oZWFwW2hdO1xuICAgIGJpdHMgPSB0cmVlW3RyZWVbbiAqIDIgKyAxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi9cblxuICAgIGlmIChuID4gbWF4X2NvZGUpIHsgY29udGludWU7IH0gLyogbm90IGEgbGVhZiBub2RlICovXG5cbiAgICBzLmJsX2NvdW50W2JpdHNdKys7XG4gICAgeGJpdHMgPSAwO1xuICAgIGlmIChuID49IGJhc2UpIHtcbiAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VdO1xuICAgIH1cbiAgICBmID0gdHJlZVtuICogMl0vKi5GcmVxKi87XG4gICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTtcbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7XG4gICAgfVxuICB9XG4gIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkgeyBiaXRzLS07IH1cbiAgICBzLmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovXG4gICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqL1xuICAgIHMuYmxfY291bnRbbWF4X2xlbmd0aF0tLTtcbiAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLFxuICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXVxuICAgICAqL1xuICAgIG92ZXJmbG93IC09IDI7XG4gIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7XG5cbiAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsXG4gICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuXG4gICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKVxuICAgKi9cbiAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7XG4gICAgbiA9IHMuYmxfY291bnRbYml0c107XG4gICAgd2hpbGUgKG4gIT09IDApIHtcbiAgICAgIG0gPSBzLmhlYXBbLS1oXTtcbiAgICAgIGlmIChtID4gbWF4X2NvZGUpIHsgY29udGludWU7IH1cbiAgICAgIGlmICh0cmVlW20gKiAyICsgMV0vKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0vKi5MZW4qLykgKiB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlXG4gKiBvcHRpbWFsKS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yXG4gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub25cbiAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KVxuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuLy8gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqL1xue1xuICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIHZhciBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi9cbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICB2YXIgbGVuID0gdHJlZVtuICogMiArIDFdLyouTGVuKi87XG4gICAgaWYgKGxlbiA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovXG4gICAgdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7XG5cbiAgICAvL1RyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsXCJcXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpIFwiLFxuICAgIC8vICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpO1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLlxuICovXG5mdW5jdGlvbiB0cl9zdGF0aWNfaW5pdCgpIHtcbiAgdmFyIG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqL1xuICB2YXIgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqL1xuICB2YXIgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqL1xuICB2YXIgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTtcbiAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzO1xuICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHtcbiAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAobGVuZ3RoID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NlwiKTtcbiAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWRcbiAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2VcbiAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOlxuICAgKi9cbiAgX2xlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTtcblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi9cbiAgZGlzdCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTZcIik7XG4gIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqL1xuICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgbiA9IDA7XG4gIHdoaWxlIChuIDw9IDE0Mykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA5O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs5XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI3OSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA3O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs3XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI4Nykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSwgYmxfY291bnQpO1xuXG4gIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMgKyAxLCBMX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLlxuICovXG5mdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHtcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgeyBzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSB7IHMuZHluX2R0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXS8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5XG4gKi9cbmZ1bmN0aW9uIGJpX3dpbmR1cChzKVxue1xuICBpZiAocy5iaV92YWxpZCA+IDgpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7XG4gICAgLy9wdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWY7XG4gIH1cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0c1xuICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcilcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAgICAqYnVmOyAgICAvKiB0aGUgaW5wdXQgZGF0YSAqL1xuLy91bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovXG4vL2ludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqL1xue1xuICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG5cbiAgaWYgKGhlYWRlcikge1xuICAgIHB1dF9zaG9ydChzLCBsZW4pO1xuICAgIHB1dF9zaG9ydChzLCB+bGVuKTtcbiAgfVxuLy8gIHdoaWxlIChsZW4tLSkge1xuLy8gICAgcHV0X2J5dGUocywgKmJ1ZisrKTtcbi8vICB9XG4gIHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTtcbiAgcy5wZW5kaW5nICs9IGxlbjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlblxuICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIHtcbiAgdmFyIF9uMiA9IG4gKiAyO1xuICB2YXIgX20yID0gbSAqIDI7XG4gIHJldHVybiAodHJlZVtfbjJdLyouRnJlcSovIDwgdHJlZVtfbTJdLyouRnJlcSovIHx8XG4gICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19tMl0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqL1xuLy8gICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi9cbntcbiAgdmFyIHYgPSBzLmhlYXBba107XG4gIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsgYnJlYWs7IH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn1cblxuXG4vLyBpbmxpbmVkIG1hbnVhbGx5XG4vLyB2YXIgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5mdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqL1xuLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbntcbiAgdmFyIGRpc3Q7ICAgICAgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqL1xuICB2YXIgbHggPSAwOyAgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cbiAgdmFyIGNvZGU7ICAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIHZhciBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDJdIDw8IDgpIHwgKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTtcbiAgICAgICAgLy9Bc3NlcnQgKGNvZGUgPCBEX0NPREVTLCBcImJhZCBkX2NvZGVcIik7XG5cbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqL1xuXG4gICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LFxuICAgICAgLy8gICAgICAgXCJwZW5kaW5nQnVmIG92ZXJmbG93XCIpO1xuXG4gICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTtcbiAgfVxuXG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLlxuICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhcbiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpc1xuICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgc3RyZWUgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGVsZW1zICAgID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7XG4gIHZhciBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqL1xuICB2YXIgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHZhciBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovXG5cbiAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpblxuICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS5cbiAgICogaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHMuaGVhcF9sZW4gPSAwO1xuICBzLmhlYXBfbWF4ID0gSEVBUF9TSVpFO1xuXG4gIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7XG4gICAgaWYgKHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjtcbiAgICAgIHMuZGVwdGhbbl0gPSAwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV0vKi5MZW4qLztcbiAgICB9XG4gICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovXG4gIH1cbiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlO1xuXG4gIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSxcbiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6XG4gICAqL1xuICBmb3IgKG4gPSAocy5oZWFwX2xlbiA+PiAxLyppbnQgLzIqLyk7IG4gPj0gMTsgbi0tKSB7IHBxZG93bmhlYXAocywgdHJlZSwgbik7IH1cblxuICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvXG4gICAqIGZyZXF1ZW50IG5vZGVzLlxuICAgKi9cbiAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovXG4gIGRvIHtcbiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovXG4gICAgLyoqKiBwcXJlbW92ZSAqKiovXG4gICAgbiA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuICAgIC8qKiovXG5cbiAgICBtID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqL1xuXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBtO1xuXG4gICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi9cbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IHRyZWVbbiAqIDJdLyouRnJlcSovICsgdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxO1xuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkRhZCovID0gdHJlZVttICogMiArIDFdLyouRGFkKi8gPSBub2RlO1xuXG4gICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi9cbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3dcbiAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLlxuICAgKi9cbiAgZ2VuX2JpdGxlbihzLCBkZXNjKTtcblxuICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovXG4gIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzXG4gKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLlxuICovXG5mdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8gKz0gY291bnQ7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuXG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9XG4gICAgICBzLmJsX3RyZWVbUkVQXzNfNiAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXS8qLkZyZXEqLysrO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuXG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluXG4gKiBibF90cmVlLlxuICovXG5mdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBkbyB7IHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT09IDApO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgICAgY291bnQtLTtcbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgXCIgM182P1wiKTtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX2JsX3RyZWUocykge1xuICB2YXIgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTtcbiAgc2Nhbl90cmVlKHMsIHMuZHluX2R0cmVlLCBzLmRfZGVzYy5tYXhfY29kZSk7XG5cbiAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi9cbiAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpO1xuICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0XG4gICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuXG4gICAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdFxuICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5c1xuICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pXG4gICAqL1xuICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0vKi5MZW4qLyAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovXG4gIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZFwiLFxuICAvLyAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpO1xuXG4gIHJldHVybiBtYXhfYmxpbmRleDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZVxuICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuXG4gKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi9cbntcbiAgdmFyIHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCAgIDUpO1xuICBzZW5kX2JpdHMocywgYmxjb2RlcyAtIDQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06XG4gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6XG4gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcImJsYWNrIGxpc3RcIiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLlxuICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJ3aGl0ZSBsaXN0XCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLlxuICogLSBCSU5BUlkgb3RoZXJ3aXNlLlxuICogLSBUaGUgZm9sbG93aW5nIHBhcnRpYWxseS1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgZm9ybSBhXG4gKiAgIFwiZ3JheSBsaXN0XCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobTpcbiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHtcbiAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzXG4gICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMVxuICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExXG4gICAqL1xuICB2YXIgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2Y7XG4gIHZhciBuO1xuXG4gIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoXCJibGFjay1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHtcbiAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdLyouRnJlcSovICE9PSAwIHx8XG4gICAgICBzLmR5bl9sdHJlZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVDtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsYWNrLWxpc3RlZFwiIG9yIFwid2hpdGUtbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpXG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovXG4gIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi9cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX3RyX2FsaWduKHMpIHtcbiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7ICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqL1xuICBpZiAocy5sZXZlbCA+IDApIHtcblxuICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovXG4gICAgaWYgKHMuc3RybS5kYXRhX3R5cGUgPT09IFpfVU5LTk9XTikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzO1xuICAgIHN0YXRpY19sZW5iID0gKHMuc3RhdGljX2xlbiArIDMgKyA3KSA+Pj4gMztcblxuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1IFwiLFxuICAgIC8vICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sXG4gICAgLy8gICAgICAgIHMtPmxhc3RfbGl0KSk7XG5cbiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsgfVxuXG4gIH0gZWxzZSB7XG4gICAgLy8gQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgXCJsb3N0IGJ1ZlwiKTtcbiAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovXG4gIH1cblxuICBpZiAoKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iKSAmJiAoYnVmICE9PSAtMSkpIHtcbiAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovXG5cbiAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLlxuICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2VcbiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG9cbiAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLlxuICAgICAqL1xuICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTtcblxuICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmXG4gKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbi8vICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqL1xue1xuICAvL3ZhciBvdXRfbGVuZ3RoLCBpbl9sZW5ndGgsIGRjb2RlO1xuXG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyXSAgICAgPSAoZGlzdCA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMiArIDFdID0gZGlzdCAmIDB4ZmY7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDB4ZmY7XG4gIHMubGFzdF9saXQrKztcblxuICBpZiAoZGlzdCA9PT0gMCkge1xuICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqL1xuICAgIHMuZHluX2x0cmVlW2xjICogMl0vKi5GcmVxKi8rKztcbiAgfSBlbHNlIHtcbiAgICBzLm1hdGNoZXMrKztcbiAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgLy9Bc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJlxuICAgIC8vICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiZcbiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgIFwiX3RyX3RhbGx5OiBiYWQgbWF0Y2hcIik7XG5cbiAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMSkgKiAyXS8qLkZyZXEqLysrO1xuICAgIHMuZHluX2R0cmVlW2RfY29kZShkaXN0KSAqIDJdLyouRnJlcSovKys7XG4gIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhdWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcblxuLy8jaWZkZWYgVFJVTkNBVEVfQkxPQ0tcbi8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi9cbi8vICBpZiAoKHMubGFzdF9saXQgJiAweDFmZmYpID09PSAwICYmIHMubGV2ZWwgPiAyKSB7XG4vLyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi9cbi8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7XG4vLyAgICBpbl9sZW5ndGggPSBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydDtcbi8vXG4vLyAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7XG4vLyAgICAgIG91dF9sZW5ndGggKz0gcy5keW5fZHRyZWVbZGNvZGUqMl0vKi5GcmVxKi8gKiAoNSArIGV4dHJhX2RiaXRzW2Rjb2RlXSk7XG4vLyAgICB9XG4vLyAgICBvdXRfbGVuZ3RoID4+Pj0gMztcbi8vICAgIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgXCIsXG4vLyAgICAvLyAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLFxuLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTtcbi8vICAgIGlmIChzLm1hdGNoZXMgPCAocy5sYXN0X2xpdD4+MSkvKmludCAvMiovICYmIG91dF9sZW5ndGggPCAoaW5fbGVuZ3RoPj4xKS8qaW50IC8yKi8pIHtcbi8vICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICB9XG4vLyAgfVxuLy8jZW5kaWZcblxuICByZXR1cm4gKHMubGFzdF9saXQgPT09IHMubGl0X2J1ZnNpemUgLSAxKTtcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLXG4gICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvXG4gICAqIDY0Sy0xIGJ5dGVzLlxuICAgKi9cbn1cblxuZXhwb3J0cy5fdHJfaW5pdCAgPSBfdHJfaW5pdDtcbmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7XG5leHBvcnRzLl90cl9mbHVzaF9ibG9jayAgPSBfdHJfZmx1c2hfYmxvY2s7XG5leHBvcnRzLl90cl90YWxseSA9IF90cl90YWxseTtcbmV4cG9ydHMuX3RyX2FsaWduID0gX3RyX2FsaWduO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvYnJvd3Nlci9QYXJzZS5qcycpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudHJhY2sgPSB0cmFjaztcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbi8qKlxuICogUGFyc2UuQW5hbHl0aWNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byBQYXJzZSdzIGxvZ2dpbmcgYW5kIGFuYWx5dGljc1xuICogYmFja2VuZC5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuQW5hbHl0aWNzXG4gKiBAc3RhdGljXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKi9cblxuLyoqXG4gKiBUcmFja3MgdGhlIG9jY3VycmVuY2Ugb2YgYSBjdXN0b20gZXZlbnQgd2l0aCBhZGRpdGlvbmFsIGRpbWVuc2lvbnMuXG4gKiBQYXJzZSB3aWxsIHN0b3JlIGEgZGF0YSBwb2ludCBhdCB0aGUgdGltZSBvZiBpbnZvY2F0aW9uIHdpdGggdGhlIGdpdmVuXG4gKiBldmVudCBuYW1lLlxuICpcbiAqIERpbWVuc2lvbnMgd2lsbCBhbGxvdyBzZWdtZW50YXRpb24gb2YgdGhlIG9jY3VycmVuY2VzIG9mIHRoaXMgY3VzdG9tXG4gKiBldmVudC4gS2V5cyBhbmQgdmFsdWVzIHNob3VsZCBiZSB7QGNvZGUgU3RyaW5nfXMsIGFuZCB3aWxsIHRocm93XG4gKiBvdGhlcndpc2UuXG4gKlxuICogVG8gdHJhY2sgYSB1c2VyIHNpZ251cCBhbG9uZyB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGEsIGNvbnNpZGVyIHRoZVxuICogZm9sbG93aW5nOlxuICogPHByZT5cbiAqIHZhciBkaW1lbnNpb25zID0ge1xuICogIGdlbmRlcjogJ20nLFxuICogIHNvdXJjZTogJ3dlYicsXG4gKiAgZGF5VHlwZTogJ3dlZWtlbmQnXG4gKiB9O1xuICogUGFyc2UuQW5hbHl0aWNzLnRyYWNrKCdzaWdudXAnLCBkaW1lbnNpb25zKTtcbiAqIDwvcHJlPlxuICpcbiAqIFRoZXJlIGlzIGEgZGVmYXVsdCBsaW1pdCBvZiA4IGRpbWVuc2lvbnMgcGVyIGV2ZW50IHRyYWNrZWQuXG4gKlxuICogQGZ1bmN0aW9uIHRyYWNrXG4gKiBAbmFtZSBQYXJzZS5BbmFseXRpY3MudHJhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gZXZlbnQgdG8gcmVwb3J0IHRvIFBhcnNlIGFzXG4gKiBoYXZpbmcgaGFwcGVuZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gZGltZW5zaW9ucyBUaGUgZGljdGlvbmFyeSBvZiBpbmZvcm1hdGlvbiBieSB3aGljaCB0b1xuICogc2VnbWVudCB0aGlzIGV2ZW50LlxuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIHJvdW5kLXRyaXBcbiAqIHRvIHRoZSBzZXJ2ZXIgY29tcGxldGVzLlxuICovXG5mdW5jdGlvbiB0cmFjayhuYW1lLCBkaW1lbnNpb25zKSB7XG4gIG5hbWUgPSBuYW1lIHx8ICcnO1xuICBuYW1lID0gbmFtZS5yZXBsYWNlKC9eXFxzKi8sICcnKTtcbiAgbmFtZSA9IG5hbWUucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG4gIGlmIChuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgbmFtZSBmb3IgdGhlIGN1c3RvbSBldmVudCBtdXN0IGJlIHByb3ZpZGVkJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gZGltZW5zaW9ucykge1xuICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZGltZW5zaW9uc1trZXldICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJhY2soKSBkaW1lbnNpb25zIGV4cGVjdHMga2V5cyBhbmQgdmFsdWVzIG9mIHR5cGUgXCJzdHJpbmdcIi4nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFuYWx5dGljc0NvbnRyb2xsZXIoKS50cmFjayhuYW1lLCBkaW1lbnNpb25zKTtcbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICB0cmFjayhuYW1lLCBkaW1lbnNpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2V2ZW50cy8nICsgbmFtZSwge1xuICAgICAgZGltZW5zaW9uc1xuICAgIH0pO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0QW5hbHl0aWNzQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfUGFyc2VVc2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVVzZXJcIikpO1xudmFyIF91dWlkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dWlkXCIpKTtcbmxldCByZWdpc3RlcmVkID0gZmFsc2U7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBBbm9ueW1vdXNseSBsb2dnZWQtaW4gdXNlcnMuIDxiciAvPlxuICogQW5vbnltb3VzIHVzZXJzIGhhdmUgc29tZSB1bmlxdWUgY2hhcmFjdGVyaXN0aWNzOlxuICogPHVsPlxuICogIDxsaT5Bbm9ueW1vdXMgdXNlcnMgZG9uJ3QgbmVlZCBhIHVzZXIgbmFtZSBvciBwYXNzd29yZC48L2xpPlxuICogIDx1bD5cbiAqICAgIDxsaT5PbmNlIGxvZ2dlZCBvdXQsIGFuIGFub255bW91cyB1c2VyIGNhbm5vdCBiZSByZWNvdmVyZWQuPC9saT5cbiAqICA8L3VsPlxuICogIDxsaT5zaWduVXAgY29udmVydHMgYW4gYW5vbnltb3VzIHVzZXIgdG8gYSBzdGFuZGFyZCB1c2VyIHdpdGggdGhlIGdpdmVuIHVzZXJuYW1lIGFuZCBwYXNzd29yZC48L2xpPlxuICogIDx1bD5cbiAqICAgIDxsaT5EYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW5vbnltb3VzIHVzZXIgaXMgcmV0YWluZWQuPC9saT5cbiAqICA8L3VsPlxuICogIDxsaT5sb2dJbiBzd2l0Y2hlcyB1c2VycyB3aXRob3V0IGNvbnZlcnRpbmcgdGhlIGFub255bW91cyB1c2VyLjwvbGk+XG4gKiAgPHVsPlxuICogICAgPGxpPkRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbm9ueW1vdXMgdXNlciB3aWxsIGJlIGxvc3QuPC9saT5cbiAqICA8L3VsPlxuICogIDxsaT5TZXJ2aWNlIGxvZ0luIChlLmcuIEZhY2Vib29rLCBUd2l0dGVyKSB3aWxsIGF0dGVtcHQgdG8gY29udmVydFxuICogIHRoZSBhbm9ueW1vdXMgdXNlciBpbnRvIGEgc3RhbmRhcmQgdXNlciBieSBsaW5raW5nIGl0IHRvIHRoZSBzZXJ2aWNlLjwvbGk+XG4gKiAgPHVsPlxuICogICAgPGxpPklmIGEgdXNlciBhbHJlYWR5IGV4aXN0cyB0aGF0IGlzIGxpbmtlZCB0byB0aGUgc2VydmljZSwgaXQgd2lsbCBpbnN0ZWFkIHN3aXRjaCB0byB0aGUgZXhpc3RpbmcgdXNlci48L2xpPlxuICogIDwvdWw+XG4gKiAgPGxpPlNlcnZpY2UgbGlua2luZyAoZS5nLiBGYWNlYm9vaywgVHdpdHRlcikgd2lsbCBjb252ZXJ0IHRoZSBhbm9ueW1vdXMgdXNlclxuICogIGludG8gYSBzdGFuZGFyZCB1c2VyIGJ5IGxpbmtpbmcgaXQgdG8gdGhlIHNlcnZpY2UuPC9saT5cbiAqIDwvdWw+XG4gKlxuICogQGNsYXNzIFBhcnNlLkFub255bW91c1V0aWxzXG4gKiBAc3RhdGljXG4gKi9cbmNvbnN0IEFub255bW91c1V0aWxzID0ge1xuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSB1c2VyIGhhcyB0aGVpciBhY2NvdW50IGxpbmtlZCB0byBhbm9ueW1vdXMgdXNlci5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGlzTGlua2VkXG4gICAqIEBuYW1lIFBhcnNlLkFub255bW91c1V0aWxzLmlzTGlua2VkXG4gICAqIEBwYXJhbSB7UGFyc2UuVXNlcn0gdXNlciBVc2VyIHRvIGNoZWNrIGZvci5cbiAgICogICAgIFRoZSB1c2VyIG11c3QgYmUgbG9nZ2VkIGluIG9uIHRoaXMgZGV2aWNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgaGFzIHRoZWlyIGFjY291bnRcbiAgICogICAgIGxpbmtlZCB0byBhbiBhbm9ueW1vdXMgdXNlci5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgaXNMaW5rZWQodXNlcikge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5fZ2V0QXV0aFByb3ZpZGVyKCk7XG4gICAgcmV0dXJuIHVzZXIuX2lzTGlua2VkKHByb3ZpZGVyLmdldEF1dGhUeXBlKCkpO1xuICB9LFxuICAvKipcbiAgICogTG9ncyBpbiBhIHVzZXIgQW5vbnltb3VzbHkuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBsb2dJblxuICAgKiBAbmFtZSBQYXJzZS5Bbm9ueW1vdXNVdGlscy5sb2dJblxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBNYXN0ZXJLZXkgLyBTZXNzaW9uVG9rZW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBMb2dnZWQgaW4gdXNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICBsb2dJbihvcHRpb25zKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLl9nZXRBdXRoUHJvdmlkZXIoKTtcbiAgICByZXR1cm4gX1BhcnNlVXNlci5kZWZhdWx0LmxvZ0luV2l0aChwcm92aWRlci5nZXRBdXRoVHlwZSgpLCBwcm92aWRlci5nZXRBdXRoRGF0YSgpLCBvcHRpb25zKTtcbiAgfSxcbiAgLyoqXG4gICAqIExpbmtzIEFub255bW91cyBVc2VyIHRvIGFuIGV4aXN0aW5nIFBGVXNlci5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGxpbmtcbiAgICogQG5hbWUgUGFyc2UuQW5vbnltb3VzVXRpbHMubGlua1xuICAgKiBAcGFyYW0ge1BhcnNlLlVzZXJ9IHVzZXIgVXNlciB0byBsaW5rLiBUaGlzIG11c3QgYmUgdGhlIGN1cnJlbnQgdXNlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgTWFzdGVyS2V5IC8gU2Vzc2lvblRva2VuLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gTGlua2VkIHdpdGggVXNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICBsaW5rKHVzZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuX2dldEF1dGhQcm92aWRlcigpO1xuICAgIHJldHVybiB1c2VyLmxpbmtXaXRoKHByb3ZpZGVyLmdldEF1dGhUeXBlKCksIHByb3ZpZGVyLmdldEF1dGhEYXRhKCksIG9wdGlvbnMpO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIEF1dGhlbnRpY2F0aW9uIFByb3ZpZGVyIGhhcyBiZWVuIHJlZ2lzdGVyZWQgZm9yIHVzZS5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGlzUmVnaXN0ZXJlZFxuICAgKiBAbmFtZSBQYXJzZS5Bbm9ueW1vdXNVdGlscy5pc1JlZ2lzdGVyZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGlzUmVnaXN0ZXJlZCgpIHtcbiAgICByZXR1cm4gcmVnaXN0ZXJlZDtcbiAgfSxcbiAgX2dldEF1dGhQcm92aWRlcigpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IHtcbiAgICAgIHJlc3RvcmVBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgICAgZ2V0QXV0aFR5cGUoKSB7XG4gICAgICAgIHJldHVybiAnYW5vbnltb3VzJztcbiAgICAgIH0sXG4gICAgICBnZXRBdXRoRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhdXRoRGF0YToge1xuICAgICAgICAgICAgaWQ6ICgwLCBfdXVpZC5kZWZhdWx0KSgpXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKCFyZWdpc3RlcmVkKSB7XG4gICAgICBfUGFyc2VVc2VyLmRlZmF1bHQuX3JlZ2lzdGVyQXV0aGVudGljYXRpb25Qcm92aWRlcihwcm92aWRlcik7XG4gICAgICByZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3ZpZGVyO1xuICB9XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gQW5vbnltb3VzVXRpbHM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0Sm9iU3RhdHVzID0gZ2V0Sm9iU3RhdHVzO1xuZXhwb3J0cy5nZXRKb2JzRGF0YSA9IGdldEpvYnNEYXRhO1xuZXhwb3J0cy5ydW4gPSBydW47XG5leHBvcnRzLnN0YXJ0Sm9iID0gc3RhcnRKb2I7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2RlY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGVjb2RlXCIpKTtcbnZhciBfZW5jb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lbmNvZGVcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfUGFyc2VRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VRdWVyeVwiKSk7XG4vKipcbiAqIENvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgY2FsbGluZyBhbmQgZGVjbGFyaW5nXG4gKiA8YSBocmVmPVwiL2RvY3MvY2xvdWRfY29kZV9ndWlkZSNmdW5jdGlvbnNcIj5jbG91ZCBmdW5jdGlvbnM8L2E+LlxuICogPHA+PHN0cm9uZz48ZW0+XG4gKiAgIFNvbWUgZnVuY3Rpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBmcm9tIENsb3VkIENvZGUuXG4gKiA8L2VtPjwvc3Ryb25nPjwvcD5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuQ2xvdWRcbiAqIEBzdGF0aWNcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqL1xuXG4vKipcbiAqIE1ha2VzIGEgY2FsbCB0byBhIGNsb3VkIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBydW5cbiAqIEBuYW1lIFBhcnNlLkNsb3VkLnJ1blxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIGZ1bmN0aW9uIG5hbWUuXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YSBUaGUgcGFyYW1ldGVycyB0byBzZW5kIHRvIHRoZSBjbG91ZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHRcbiAqIG9mIHRoZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gcnVuKG5hbWUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDbG91ZCBmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gIH1cbiAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB7fTtcbiAgaWYgKG9wdGlvbnMudXNlTWFzdGVyS2V5KSB7XG4gICAgcmVxdWVzdE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuc2Vzc2lvblRva2VuKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gIH1cbiAgaWYgKG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5pbnN0YWxsYXRpb25JZCA9IG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQ7XG4gIH1cbiAgaWYgKG9wdGlvbnMuY29udGV4dCAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgIHJlcXVlc3RPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENsb3VkQ29udHJvbGxlcigpLnJ1bihuYW1lLCBkYXRhLCByZXF1ZXN0T3B0aW9ucyk7XG59XG5cbi8qKlxuICogR2V0cyBkYXRhIGZvciB0aGUgY3VycmVudCBzZXQgb2YgY2xvdWQgam9icy5cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0Sm9ic0RhdGFcbiAqIEBuYW1lIFBhcnNlLkNsb3VkLmdldEpvYnNEYXRhXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHRcbiAqIG9mIHRoZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gZ2V0Sm9ic0RhdGEoKSB7XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDbG91ZENvbnRyb2xsZXIoKS5nZXRKb2JzRGF0YSh7XG4gICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YXJ0cyBhIGdpdmVuIGNsb3VkIGpvYiwgd2hpY2ggd2lsbCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEBmdW5jdGlvbiBzdGFydEpvYlxuICogQG5hbWUgUGFyc2UuQ2xvdWQuc3RhcnRKb2JcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBmdW5jdGlvbiBuYW1lLlxuICogQHBhcmFtIHtvYmplY3R9IGRhdGEgVGhlIHBhcmFtZXRlcnMgdG8gc2VuZCB0byB0aGUgY2xvdWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIHRoZSBqb2JTdGF0dXNJZFxuICogb2YgdGhlIGpvYi5cbiAqL1xuZnVuY3Rpb24gc3RhcnRKb2IobmFtZSwgZGF0YSkge1xuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2xvdWQgam9iIG5hbWUgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgfVxuICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q2xvdWRDb250cm9sbGVyKCkuc3RhcnRKb2IobmFtZSwgZGF0YSwge1xuICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXRzIGpvYiBzdGF0dXMgYnkgSWRcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0Sm9iU3RhdHVzXG4gKiBAbmFtZSBQYXJzZS5DbG91ZC5nZXRKb2JTdGF0dXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBqb2JTdGF0dXNJZCBUaGUgSWQgb2YgSm9iIFN0YXR1cy5cbiAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9IFN0YXR1cyBvZiBKb2IuXG4gKi9cbmZ1bmN0aW9uIGdldEpvYlN0YXR1cyhqb2JTdGF0dXNJZCkge1xuICBjb25zdCBxdWVyeSA9IG5ldyBfUGFyc2VRdWVyeS5kZWZhdWx0KCdfSm9iU3RhdHVzJyk7XG4gIHJldHVybiBxdWVyeS5nZXQoam9iU3RhdHVzSWQsIHtcbiAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgfSk7XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgcnVuKG5hbWUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGF5bG9hZCA9ICgwLCBfZW5jb2RlLmRlZmF1bHQpKGRhdGEsIHRydWUpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ2Z1bmN0aW9ucy8nICsgbmFtZSwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJlcXVlc3QudGhlbihyZXMgPT4ge1xuICAgICAgaWYgKHR5cGVvZiByZXMgPT09ICdvYmplY3QnICYmICgwLCBfa2V5cy5kZWZhdWx0KShyZXMpLmxlbmd0aCA+IDAgJiYgIXJlcy5oYXNPd25Qcm9wZXJ0eSgncmVzdWx0JykpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0pTT04sICdUaGUgc2VydmVyIHJldHVybmVkIGFuIGludmFsaWQgcmVzcG9uc2UuJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWNvZGVkID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkocmVzKTtcbiAgICAgIGlmIChkZWNvZGVkICYmIGRlY29kZWQuaGFzT3duUHJvcGVydHkoJ3Jlc3VsdCcpKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoZGVjb2RlZC5yZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9LFxuICBnZXRKb2JzRGF0YShvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAnY2xvdWRfY29kZS9qb2JzL2RhdGEnLCBudWxsLCBvcHRpb25zKTtcbiAgfSxcbiAgYXN5bmMgc3RhcnRKb2IobmFtZSwgZGF0YSwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwYXlsb2FkID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkoZGF0YSwgdHJ1ZSk7XG4gICAgb3B0aW9ucy5yZXR1cm5TdGF0dXMgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdqb2JzLycgKyBuYW1lLCBwYXlsb2FkLCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuX2hlYWRlcnM/LlsnWC1QYXJzZS1Kb2ItU3RhdHVzLUlkJ107XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRDbG91ZENvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbi8qKiBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtbmF0aXZlLWFzeW5jLXN0b3JhZ2UvYXN5bmMtc3RvcmFnZS9ibG9iL21haW4vcGFja2FnZXMvZGVmYXVsdC1zdG9yYWdlLWJhY2tlbmQvc3JjL3R5cGVzLnRzICovXG5cbmNvbnN0IGNvbmZpZyA9IHtcbiAgSVNfTk9ERTogdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICEhcHJvY2Vzcy52ZXJzaW9ucyAmJiAhIXByb2Nlc3MudmVyc2lvbnMubm9kZSAmJiAhcHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbixcbiAgUkVRVUVTVF9BVFRFTVBUX0xJTUlUOiA1LFxuICBSRVFVRVNUX0JBVENIX1NJWkU6IDIwLFxuICBSRVFVRVNUX0hFQURFUlM6IHt9LFxuICBTRVJWRVJfVVJMOiAnaHR0cHM6Ly9hcGkucGFyc2UuY29tLzEnLFxuICBTRVJWRVJfQVVUSF9UWVBFOiBudWxsLFxuICBTRVJWRVJfQVVUSF9UT0tFTjogbnVsbCxcbiAgTElWRVFVRVJZX1NFUlZFUl9VUkw6IG51bGwsXG4gIEVOQ1JZUFRFRF9LRVk6IG51bGwsXG4gIFZFUlNJT046ICdqcycgKyBcIjUuMy4wXCIsXG4gIEFQUExJQ0FUSU9OX0lEOiBudWxsLFxuICBKQVZBU0NSSVBUX0tFWTogbnVsbCxcbiAgTUFTVEVSX0tFWTogbnVsbCxcbiAgVVNFX01BU1RFUl9LRVk6IGZhbHNlLFxuICBQRVJGT1JNX1VTRVJfUkVXUklURTogdHJ1ZSxcbiAgRk9SQ0VfUkVWT0NBQkxFX1NFU1NJT046IGZhbHNlLFxuICBFTkNSWVBURURfVVNFUjogZmFsc2UsXG4gIElERU1QT1RFTkNZOiBmYWxzZSxcbiAgQUxMT1dfQ1VTVE9NX09CSkVDVF9JRDogZmFsc2UsXG4gIFBBUlNFX0VSUk9SUzogW11cbn07XG5mdW5jdGlvbiByZXF1aXJlTWV0aG9kcyhuYW1lLCBtZXRob2RzLCBjb250cm9sbGVyKSB7XG4gICgwLCBfZm9yRWFjaC5kZWZhdWx0KShtZXRob2RzKS5jYWxsKG1ldGhvZHMsIGZ1bmMgPT4ge1xuICAgIGlmICh0eXBlb2YgY29udHJvbGxlcltmdW5jXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWV9IG11c3QgaW1wbGVtZW50ICR7ZnVuY30oKWApO1xuICAgIH1cbiAgfSk7XG59XG5jb25zdCBDb3JlTWFuYWdlciA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKGNvbmZpZy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXR1cm4gY29uZmlnW2tleV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlndXJhdGlvbiBrZXkgbm90IGZvdW5kOiAnICsga2V5KTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIGNvbmZpZ1trZXldID0gdmFsdWU7XG4gIH0sXG4gIHNldElmTmVlZGVkOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbmZpZ1trZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBjb25maWdba2V5XTtcbiAgfSxcbiAgLyogU3BlY2lhbGl6ZWQgQ29udHJvbGxlciBTZXR0ZXJzL0dldHRlcnMgKi9cblxuICBzZXRBbmFseXRpY3NDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnQW5hbHl0aWNzQ29udHJvbGxlcicsIFsndHJhY2snXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydBbmFseXRpY3NDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRBbmFseXRpY3NDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0FuYWx5dGljc0NvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0Q2xvdWRDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnQ2xvdWRDb250cm9sbGVyJywgWydydW4nLCAnZ2V0Sm9ic0RhdGEnLCAnc3RhcnRKb2InXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydDbG91ZENvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldENsb3VkQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydDbG91ZENvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0Q29uZmlnQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0NvbmZpZ0NvbnRyb2xsZXInLCBbJ2N1cnJlbnQnLCAnZ2V0JywgJ3NhdmUnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydDb25maWdDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRDb25maWdDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0NvbmZpZ0NvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0Q3J5cHRvQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0NyeXB0b0NvbnRyb2xsZXInLCBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0NyeXB0b0NvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldENyeXB0b0NvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snQ3J5cHRvQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRFdmVudEVtaXR0ZXIoZXZlbnRFbWl0dGVyKSB7XG4gICAgY29uZmlnWydFdmVudEVtaXR0ZXInXSA9IGV2ZW50RW1pdHRlcjtcbiAgfSxcbiAgZ2V0RXZlbnRFbWl0dGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0V2ZW50RW1pdHRlciddO1xuICB9LFxuICBzZXRGaWxlQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0ZpbGVDb250cm9sbGVyJywgWydzYXZlRmlsZScsICdzYXZlQmFzZTY0J10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snRmlsZUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIHNldEV2ZW50dWFsbHlRdWV1ZShjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0V2ZW50dWFsbHlRdWV1ZScsIFsncG9sbCcsICdzYXZlJywgJ2Rlc3Ryb3knXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydFdmVudHVhbGx5UXVldWUnXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldEV2ZW50dWFsbHlRdWV1ZSgpIHtcbiAgICByZXR1cm4gY29uZmlnWydFdmVudHVhbGx5UXVldWUnXTtcbiAgfSxcbiAgZ2V0RmlsZUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snRmlsZUNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0luc3RhbGxhdGlvbkNvbnRyb2xsZXInLCBbJ2N1cnJlbnRJbnN0YWxsYXRpb25JZCcsICdjdXJyZW50SW5zdGFsbGF0aW9uJywgJ3VwZGF0ZUluc3RhbGxhdGlvbk9uRGlzayddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0luc3RhbGxhdGlvbkNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snSW5zdGFsbGF0aW9uQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRMaXZlUXVlcnkobGl2ZVF1ZXJ5KSB7XG4gICAgY29uZmlnWydMaXZlUXVlcnknXSA9IGxpdmVRdWVyeTtcbiAgfSxcbiAgZ2V0TGl2ZVF1ZXJ5KCkge1xuICAgIHJldHVybiBjb25maWdbJ0xpdmVRdWVyeSddO1xuICB9LFxuICBzZXRPYmplY3RDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnT2JqZWN0Q29udHJvbGxlcicsIFsnc2F2ZScsICdmZXRjaCcsICdkZXN0cm95J10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snT2JqZWN0Q29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0T2JqZWN0Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydPYmplY3RDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldE9iamVjdFN0YXRlQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ09iamVjdFN0YXRlQ29udHJvbGxlcicsIFsnZ2V0U3RhdGUnLCAnaW5pdGlhbGl6ZVN0YXRlJywgJ3JlbW92ZVN0YXRlJywgJ2dldFNlcnZlckRhdGEnLCAnc2V0U2VydmVyRGF0YScsICdnZXRQZW5kaW5nT3BzJywgJ3NldFBlbmRpbmdPcCcsICdwdXNoUGVuZGluZ1N0YXRlJywgJ3BvcFBlbmRpbmdTdGF0ZScsICdtZXJnZUZpcnN0UGVuZGluZ1N0YXRlJywgJ2dldE9iamVjdENhY2hlJywgJ2VzdGltYXRlQXR0cmlidXRlJywgJ2VzdGltYXRlQXR0cmlidXRlcycsICdjb21taXRTZXJ2ZXJDaGFuZ2VzJywgJ2VucXVldWVUYXNrJywgJ2NsZWFyQWxsU3RhdGUnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydPYmplY3RTdGF0ZUNvbnRyb2xsZXInXSA9IGNvbnRyb2xsZXI7XG4gIH0sXG4gIGdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydPYmplY3RTdGF0ZUNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0UHVzaENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdQdXNoQ29udHJvbGxlcicsIFsnc2VuZCddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ1B1c2hDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRQdXNoQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydQdXNoQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRRdWVyeUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdRdWVyeUNvbnRyb2xsZXInLCBbJ2ZpbmQnLCAnYWdncmVnYXRlJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snUXVlcnlDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRRdWVyeUNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snUXVlcnlDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldFJFU1RDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnUkVTVENvbnRyb2xsZXInLCBbJ3JlcXVlc3QnLCAnYWpheCddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ1JFU1RDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRSRVNUQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydSRVNUQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRTY2hlbWFDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnU2NoZW1hQ29udHJvbGxlcicsIFsnZ2V0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJywgJ3NlbmQnLCAncHVyZ2UnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydTY2hlbWFDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRTY2hlbWFDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1NjaGVtYUNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0U2Vzc2lvbkNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIHJlcXVpcmVNZXRob2RzKCdTZXNzaW9uQ29udHJvbGxlcicsIFsnZ2V0U2Vzc2lvbiddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ1Nlc3Npb25Db250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRTZXNzaW9uQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydTZXNzaW9uQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRTdG9yYWdlQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMpIHtcbiAgICAgIHJlcXVpcmVNZXRob2RzKCdBbiBhc3luYyBTdG9yYWdlQ29udHJvbGxlcicsIFsnZ2V0SXRlbUFzeW5jJywgJ3NldEl0ZW1Bc3luYycsICdyZW1vdmVJdGVtQXN5bmMnLCAnZ2V0QWxsS2V5c0FzeW5jJ10sIGNvbnRyb2xsZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXF1aXJlTWV0aG9kcygnQSBzeW5jaHJvbm91cyBTdG9yYWdlQ29udHJvbGxlcicsIFsnZ2V0SXRlbScsICdzZXRJdGVtJywgJ3JlbW92ZUl0ZW0nLCAnZ2V0QWxsS2V5cyddLCBjb250cm9sbGVyKTtcbiAgICB9XG4gICAgY29uZmlnWydTdG9yYWdlQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgc2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyJywgWydwaW5XaXRoTmFtZScsICdmcm9tUGluV2l0aE5hbWUnLCAndW5QaW5XaXRoTmFtZScsICdnZXRBbGxDb250ZW50cycsICdjbGVhciddLCBjb250cm9sbGVyKTtcbiAgICBjb25maWdbJ0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKCkge1xuICAgIHJldHVybiBjb25maWdbJ0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRMb2NhbERhdGFzdG9yZShzdG9yZSkge1xuICAgIGNvbmZpZ1snTG9jYWxEYXRhc3RvcmUnXSA9IHN0b3JlO1xuICB9LFxuICBnZXRMb2NhbERhdGFzdG9yZSgpIHtcbiAgICByZXR1cm4gY29uZmlnWydMb2NhbERhdGFzdG9yZSddO1xuICB9LFxuICBnZXRTdG9yYWdlQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydTdG9yYWdlQ29udHJvbGxlciddO1xuICB9LFxuICBzZXRBc3luY1N0b3JhZ2Uoc3RvcmFnZSkge1xuICAgIGNvbmZpZ1snQXN5bmNTdG9yYWdlJ10gPSBzdG9yYWdlO1xuICB9LFxuICBnZXRBc3luY1N0b3JhZ2UoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snQXN5bmNTdG9yYWdlJ107XG4gIH0sXG4gIHNldFdlYlNvY2tldENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIGNvbmZpZ1snV2ViU29ja2V0Q29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0V2ViU29ja2V0Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydXZWJTb2NrZXRDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldFVzZXJDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICByZXF1aXJlTWV0aG9kcygnVXNlckNvbnRyb2xsZXInLCBbJ3NldEN1cnJlbnRVc2VyJywgJ2N1cnJlbnRVc2VyJywgJ2N1cnJlbnRVc2VyQXN5bmMnLCAnc2lnblVwJywgJ2xvZ0luJywgJ2JlY29tZScsICdsb2dPdXQnLCAnbWUnLCAncmVxdWVzdFBhc3N3b3JkUmVzZXQnLCAndXBncmFkZVRvUmV2b2NhYmxlU2Vzc2lvbicsICdyZXF1ZXN0RW1haWxWZXJpZmljYXRpb24nLCAndmVyaWZ5UGFzc3dvcmQnLCAnbGlua1dpdGgnXSwgY29udHJvbGxlcik7XG4gICAgY29uZmlnWydVc2VyQ29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0VXNlckNvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snVXNlckNvbnRyb2xsZXInXTtcbiAgfSxcbiAgc2V0TGl2ZVF1ZXJ5Q29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0xpdmVRdWVyeUNvbnRyb2xsZXInLCBbJ3NldERlZmF1bHRMaXZlUXVlcnlDbGllbnQnLCAnZ2V0RGVmYXVsdExpdmVRdWVyeUNsaWVudCcsICdfY2xlYXJDYWNoZWREZWZhdWx0Q2xpZW50J10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snTGl2ZVF1ZXJ5Q29udHJvbGxlciddID0gY29udHJvbGxlcjtcbiAgfSxcbiAgZ2V0TGl2ZVF1ZXJ5Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gY29uZmlnWydMaXZlUXVlcnlDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldEhvb2tzQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgcmVxdWlyZU1ldGhvZHMoJ0hvb2tzQ29udHJvbGxlcicsIFsnY3JlYXRlJywgJ2dldCcsICd1cGRhdGUnLCAncmVtb3ZlJ10sIGNvbnRyb2xsZXIpO1xuICAgIGNvbmZpZ1snSG9va3NDb250cm9sbGVyJ10gPSBjb250cm9sbGVyO1xuICB9LFxuICBnZXRIb29rc0NvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1snSG9va3NDb250cm9sbGVyJ107XG4gIH0sXG4gIHNldFBhcnNlT3Aob3ApIHtcbiAgICBjb25maWdbJ1BhcnNlT3AnXSA9IG9wO1xuICB9LFxuICBnZXRQYXJzZU9wKCkge1xuICAgIHJldHVybiBjb25maWdbJ1BhcnNlT3AnXTtcbiAgfSxcbiAgc2V0UGFyc2VPYmplY3Qob2JqZWN0KSB7XG4gICAgY29uZmlnWydQYXJzZU9iamVjdCddID0gb2JqZWN0O1xuICB9LFxuICBnZXRQYXJzZU9iamVjdCgpIHtcbiAgICByZXR1cm4gY29uZmlnWydQYXJzZU9iamVjdCddO1xuICB9LFxuICBzZXRQYXJzZVF1ZXJ5KHF1ZXJ5KSB7XG4gICAgY29uZmlnWydQYXJzZVF1ZXJ5J10gPSBxdWVyeTtcbiAgfSxcbiAgZ2V0UGFyc2VRdWVyeSgpIHtcbiAgICByZXR1cm4gY29uZmlnWydQYXJzZVF1ZXJ5J107XG4gIH0sXG4gIHNldFBhcnNlUm9sZShyb2xlKSB7XG4gICAgY29uZmlnWydQYXJzZVJvbGUnXSA9IHJvbGU7XG4gIH0sXG4gIGdldFBhcnNlUm9sZSgpIHtcbiAgICByZXR1cm4gY29uZmlnWydQYXJzZVJvbGUnXTtcbiAgfSxcbiAgc2V0UGFyc2VVc2VyKHVzZXIpIHtcbiAgICBjb25maWdbJ1BhcnNlVXNlciddID0gdXNlcjtcbiAgfSxcbiAgZ2V0UGFyc2VVc2VyKCkge1xuICAgIHJldHVybiBjb25maWdbJ1BhcnNlVXNlciddO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBDb3JlTWFuYWdlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IENvcmVNYW5hZ2VyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xubGV0IEFFUztcbmxldCBFTkM7XG5BRVMgPSByZXF1aXJlKCdjcnlwdG8tanMvYWVzJyk7XG5FTkMgPSByZXF1aXJlKCdjcnlwdG8tanMvZW5jLXV0ZjgnKTtcbmNvbnN0IENyeXB0b0NvbnRyb2xsZXIgPSB7XG4gIGVuY3J5cHQob2JqLCBzZWNyZXRLZXkpIHtcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSBBRVMuZW5jcnlwdCgoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShvYmopLCBzZWNyZXRLZXkpO1xuICAgIHJldHVybiBlbmNyeXB0ZWQudG9TdHJpbmcoKTtcbiAgfSxcbiAgZGVjcnlwdChlbmNyeXB0ZWRUZXh0LCBzZWNyZXRLZXkpIHtcbiAgICBjb25zdCBkZWNyeXB0ZWRTdHIgPSBBRVMuZGVjcnlwdChlbmNyeXB0ZWRUZXh0LCBzZWNyZXRLZXkpLnRvU3RyaW5nKEVOQyk7XG4gICAgcmV0dXJuIGRlY3J5cHRlZFN0cjtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gQ3J5cHRvQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IENyeXB0b0NvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuLyoqXG4gKiBUaGlzIGlzIGEgc2ltcGxlIHdyYXBwZXIgdG8gdW5pZnkgRXZlbnRFbWl0dGVyIGltcGxlbWVudGF0aW9ucyBhY3Jvc3MgcGxhdGZvcm1zLlxuICovXG5cbmxldCBFdmVudEVtaXR0ZXI7XG50cnkge1xuICBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG59IGNhdGNoIChfKSB7XG4gIC8vIEV2ZW50RW1pdHRlciB1bmF2YWlsYWJsZVxufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBFdmVudEVtaXR0ZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX3NwbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3BsaWNlXCIpKTtcbnZhciBfZmluZEluZGV4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maW5kLWluZGV4XCIpKTtcbnZhciBfc2V0SW50ZXJ2YWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9zZXQtaW50ZXJ2YWxcIikpO1xudmFyIF9maW5kID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maW5kXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG52YXIgX1BhcnNlUXVlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUXVlcnlcIikpO1xudmFyIF9TdG9yYWdlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlXCIpKTtcbmNvbnN0IFFVRVVFX0tFWSA9ICdQYXJzZS9FdmVudHVhbGx5L1F1ZXVlJztcbmxldCBxdWV1ZUNhY2hlID0gW107XG5sZXQgZGlydHlDYWNoZSA9IHRydWU7XG5sZXQgcG9sbGluZyA9IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBQcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyB0byBxdWV1ZSBvYmplY3RzIHRoYXQgd2lsbCBiZVxuICogc2F2ZWQgdG8gdGhlIHNlcnZlciBhdCBhIGxhdGVyIGRhdGUuXG4gKlxuICogQGNsYXNzIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZVxuICogQHN0YXRpY1xuICovXG5jb25zdCBFdmVudHVhbGx5UXVldWUgPSB7XG4gIC8qKlxuICAgKiBBZGQgb2JqZWN0IHRvIHF1ZXVlIHdpdGggc2F2ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBmdW5jdGlvbiBzYXZlXG4gICAqIEBuYW1lIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZS5zYXZlXG4gICAqIEBwYXJhbSB7UGFyc2VPYmplY3R9IG9iamVjdCBQYXJzZS5PYmplY3QgdG8gYmUgc2F2ZWQgZXZlbnR1YWxseVxuICAgKiBAcGFyYW0ge29iamVjdH0gW3NlcnZlck9wdGlvbnNdIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5PYmplY3QuaHRtbCNzYXZlIFBhcnNlLk9iamVjdC5zYXZlfSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIGlmIG9iamVjdCBpcyBhZGRlZCB0byBxdWV1ZS5cbiAgICogQHN0YXRpY1xuICAgKiBAc2VlIFBhcnNlLk9iamVjdCNzYXZlRXZlbnR1YWxseVxuICAgKi9cbiAgc2F2ZShvYmplY3QpIHtcbiAgICBsZXQgc2VydmVyT3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgnc2F2ZScsIG9iamVjdCwgc2VydmVyT3B0aW9ucyk7XG4gIH0sXG4gIC8qKlxuICAgKiBBZGQgb2JqZWN0IHRvIHF1ZXVlIHdpdGggc2F2ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBmdW5jdGlvbiBkZXN0cm95XG4gICAqIEBuYW1lIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZS5kZXN0cm95XG4gICAqIEBwYXJhbSB7UGFyc2VPYmplY3R9IG9iamVjdCBQYXJzZS5PYmplY3QgdG8gYmUgZGVzdHJveWVkIGV2ZW50dWFsbHlcbiAgICogQHBhcmFtIHtvYmplY3R9IFtzZXJ2ZXJPcHRpb25zXSBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuT2JqZWN0Lmh0bWwjZGVzdHJveSBQYXJzZS5PYmplY3QuZGVzdHJveX0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIGlmIG9iamVjdCBpcyBhZGRlZCB0byBxdWV1ZS5cbiAgICogQHN0YXRpY1xuICAgKiBAc2VlIFBhcnNlLk9iamVjdCNkZXN0cm95RXZlbnR1YWxseVxuICAgKi9cbiAgZGVzdHJveShvYmplY3QpIHtcbiAgICBsZXQgc2VydmVyT3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgnZGVzdHJveScsIG9iamVjdCwgc2VydmVyT3B0aW9ucyk7XG4gIH0sXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB1bmlxdWUgaWRlbnRpZmllciB0byBhdm9pZCBkdXBsaWNhdGVzIGFuZCBtYWludGFpbiBwcmV2aW91cyBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiBzYXZlIC8gZGVzdHJveVxuICAgKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0IFBhcnNlLk9iamVjdCB0byBiZSBxdWV1ZWRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQHN0YXRpY1xuICAgKiBAaWdub3JlXG4gICAqL1xuICBnZW5lcmF0ZVF1ZXVlSWQoYWN0aW9uLCBvYmplY3QpIHtcbiAgICBvYmplY3QuX2dldElkKCk7XG4gICAgY29uc3Qge1xuICAgICAgY2xhc3NOYW1lLFxuICAgICAgaWQsXG4gICAgICBfbG9jYWxJZFxuICAgIH0gPSBvYmplY3Q7XG4gICAgY29uc3QgdW5pcXVlSWQgPSBvYmplY3QuZ2V0KCdoYXNoJykgfHwgX2xvY2FsSWQ7XG4gICAgcmV0dXJuIFthY3Rpb24sIGNsYXNzTmFtZSwgaWQsIHVuaXF1ZUlkXS5qb2luKCdfJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBCdWlsZCBxdWV1ZSBvYmplY3QgYW5kIGFkZCB0byBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiBzYXZlIC8gZGVzdHJveVxuICAgKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0IFBhcnNlLk9iamVjdCB0byBiZSBxdWV1ZWRcbiAgICogQHBhcmFtIHtvYmplY3R9IFtzZXJ2ZXJPcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIGlmIG9iamVjdCBpcyBhZGRlZCB0byBxdWV1ZS5cbiAgICogQHN0YXRpY1xuICAgKiBAaWdub3JlXG4gICAqL1xuICBhc3luYyBlbnF1ZXVlKGFjdGlvbiwgb2JqZWN0LCBzZXJ2ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgcXVldWVEYXRhID0gYXdhaXQgdGhpcy5nZXRRdWV1ZSgpO1xuICAgIGNvbnN0IHF1ZXVlSWQgPSB0aGlzLmdlbmVyYXRlUXVldWVJZChhY3Rpb24sIG9iamVjdCk7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5xdWV1ZUl0ZW1FeGlzdHMocXVldWVEYXRhLCBxdWV1ZUlkKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgLy8gQWRkIGNhY2hlZCB2YWx1ZXMgdG8gbmV3IG9iamVjdCBpZiB0aGV5IGRvbid0IGV4aXN0XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcXVldWVEYXRhW2luZGV4XS5vYmplY3QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QuZ2V0KHByb3ApID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIG9iamVjdC5zZXQocHJvcCwgcXVldWVEYXRhW2luZGV4XS5vYmplY3RbcHJvcF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4ID0gcXVldWVEYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgcXVldWVEYXRhW2luZGV4XSA9IHtcbiAgICAgIHF1ZXVlSWQsXG4gICAgICBhY3Rpb24sXG4gICAgICBvYmplY3Q6IG9iamVjdC50b0pTT04oKSxcbiAgICAgIHNlcnZlck9wdGlvbnMsXG4gICAgICBpZDogb2JqZWN0LmlkLFxuICAgICAgY2xhc3NOYW1lOiBvYmplY3QuY2xhc3NOYW1lLFxuICAgICAgaGFzaDogb2JqZWN0LmdldCgnaGFzaCcpLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5zZXRRdWV1ZShxdWV1ZURhdGEpO1xuICB9LFxuICBzdG9yZShkYXRhKSB7XG4gICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQuc2V0SXRlbUFzeW5jKFFVRVVFX0tFWSwgKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoZGF0YSkpO1xuICB9LFxuICBsb2FkKCkge1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhRVUVVRV9LRVkpO1xuICB9LFxuICAvKipcbiAgICogU2V0cyB0aGUgaW4tbWVtb3J5IHF1ZXVlIGZyb20gbG9jYWwgc3RvcmFnZSBhbmQgcmV0dXJucy5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGdldFF1ZXVlXG4gICAqIEBuYW1lIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZS5nZXRRdWV1ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxRdWV1ZU9iamVjdFtdPn1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgYXN5bmMgZ2V0UXVldWUoKSB7XG4gICAgaWYgKGRpcnR5Q2FjaGUpIHtcbiAgICAgIHF1ZXVlQ2FjaGUgPSBKU09OLnBhcnNlKChhd2FpdCB0aGlzLmxvYWQoKSkgfHwgJ1tdJyk7XG4gICAgICBkaXJ0eUNhY2hlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBxdWV1ZUNhY2hlO1xuICB9LFxuICAvKipcbiAgICogU2F2ZXMgdGhlIHF1ZXVlIHRvIGxvY2FsIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIHtRdWV1ZX0gcXVldWUgUXVldWUgY29udGFpbmluZyBQYXJzZS5PYmplY3QgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHF1ZXVlIGlzIHN0b3JlZC5cbiAgICogQHN0YXRpY1xuICAgKiBAaWdub3JlXG4gICAqL1xuICBzZXRRdWV1ZShxdWV1ZSkge1xuICAgIHF1ZXVlQ2FjaGUgPSBxdWV1ZTtcbiAgICByZXR1cm4gdGhpcy5zdG9yZShxdWV1ZUNhY2hlKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZXMgUGFyc2UuT2JqZWN0IGRhdGEgZnJvbSBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIFBhcnNlLk9iamVjdCBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gcXVldWUgaXMgc3RvcmVkLlxuICAgKiBAc3RhdGljXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGFzeW5jIHJlbW92ZShxdWV1ZUlkKSB7XG4gICAgY29uc3QgcXVldWVEYXRhID0gYXdhaXQgdGhpcy5nZXRRdWV1ZSgpO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5xdWV1ZUl0ZW1FeGlzdHMocXVldWVEYXRhLCBxdWV1ZUlkKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgKDAsIF9zcGxpY2UuZGVmYXVsdCkocXVldWVEYXRhKS5jYWxsKHF1ZXVlRGF0YSwgaW5kZXgsIDEpO1xuICAgICAgYXdhaXQgdGhpcy5zZXRRdWV1ZShxdWV1ZURhdGEpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIG9iamVjdHMgZnJvbSBxdWV1ZS5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGNsZWFyXG4gICAqIEBuYW1lIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZS5jbGVhclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gcXVldWUgaXMgY2xlYXJlZC5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgcXVldWVDYWNoZSA9IFtdO1xuICAgIHJldHVybiB0aGlzLnN0b3JlKFtdKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybiB0aGUgaW5kZXggb2YgYSBxdWV1ZUlkIGluIHRoZSBxdWV1ZS4gUmV0dXJucyAtMSBpZiBub3QgZm91bmQuXG4gICAqXG4gICAqIEBwYXJhbSB7UXVldWV9IHF1ZXVlIFF1ZXVlIGNvbnRhaW5pbmcgUGFyc2UuT2JqZWN0IGRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWV1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBQYXJzZS5PYmplY3QgZGF0YS5cbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICogQHN0YXRpY1xuICAgKiBAaWdub3JlXG4gICAqL1xuICBxdWV1ZUl0ZW1FeGlzdHMocXVldWUsIHF1ZXVlSWQpIHtcbiAgICByZXR1cm4gKDAsIF9maW5kSW5kZXguZGVmYXVsdCkocXVldWUpLmNhbGwocXVldWUsIGRhdGEgPT4gZGF0YS5xdWV1ZUlkID09PSBxdWV1ZUlkKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbGVuZ3RoXG4gICAqIEBuYW1lIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZS5sZW5ndGhcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgYXN5bmMgbGVuZ3RoKCkge1xuICAgIGNvbnN0IHF1ZXVlRGF0YSA9IGF3YWl0IHRoaXMuZ2V0UXVldWUoKTtcbiAgICByZXR1cm4gcXVldWVEYXRhLmxlbmd0aDtcbiAgfSxcbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBxdWV1ZSB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gc2VuZFF1ZXVlXG4gICAqIEBuYW1lIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZS5zZW5kUXVldWVcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFJldHVybnMgdHJ1ZSBpZiBxdWV1ZSB3YXMgc2VudCBzdWNjZXNzZnVsbHkuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGFzeW5jIHNlbmRRdWV1ZSgpIHtcbiAgICBjb25zdCBxdWV1ZSA9IGF3YWl0IHRoaXMuZ2V0UXVldWUoKTtcbiAgICBjb25zdCBxdWV1ZURhdGEgPSBbLi4ucXVldWVdO1xuICAgIGlmIChxdWV1ZURhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVldWVEYXRhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBxdWV1ZU9iamVjdCA9IHF1ZXVlRGF0YVtpXTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaWQsXG4gICAgICAgIGhhc2gsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgfSA9IHF1ZXVlT2JqZWN0O1xuICAgICAgY29uc3QgT2JqZWN0VHlwZSA9IF9QYXJzZU9iamVjdC5kZWZhdWx0LmV4dGVuZChjbGFzc05hbWUpO1xuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzcy5ieUlkKE9iamVjdFR5cGUsIHF1ZXVlT2JqZWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzaCkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3MuYnlIYXNoKE9iamVjdFR5cGUsIHF1ZXVlT2JqZWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzcy5jcmVhdGUoT2JqZWN0VHlwZSwgcXVldWVPYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIEJ1aWxkIHF1ZXVlIG9iamVjdCBhbmQgYWRkIHRvIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1BhcnNlT2JqZWN0fSBvYmplY3QgUGFyc2UuT2JqZWN0IHRvIGJlIHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge1F1ZXVlT2JqZWN0fSBxdWV1ZU9iamVjdCBQYXJzZS5PYmplY3QgZGF0YSBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC5cbiAgICogQHN0YXRpY1xuICAgKiBAaWdub3JlXG4gICAqL1xuICBhc3luYyBzZW5kUXVldWVDYWxsYmFjayhvYmplY3QsIHF1ZXVlT2JqZWN0KSB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZShxdWV1ZU9iamVjdC5xdWV1ZUlkKTtcbiAgICB9XG4gICAgc3dpdGNoIChxdWV1ZU9iamVjdC5hY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3NhdmUnOlxuICAgICAgICAvLyBRdWV1ZWQgdXBkYXRlIHdhcyBvdmVyd3JpdHRlbiBieSBvdGhlciByZXF1ZXN0LiBEbyBub3Qgc2F2ZVxuICAgICAgICBpZiAodHlwZW9mIG9iamVjdC51cGRhdGVkQXQgIT09ICd1bmRlZmluZWQnICYmIG9iamVjdC51cGRhdGVkQXQgPiBuZXcgRGF0ZShxdWV1ZU9iamVjdC5vYmplY3QuY3JlYXRlZEF0KSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZShxdWV1ZU9iamVjdC5xdWV1ZUlkKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9iamVjdC5zYXZlKHF1ZXVlT2JqZWN0Lm9iamVjdCwgcXVldWVPYmplY3Quc2VydmVyT3B0aW9ucyk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUocXVldWVPYmplY3QucXVldWVJZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZS5jb2RlICE9PSBfUGFyc2VFcnJvci5kZWZhdWx0LkNPTk5FQ1RJT05fRkFJTEVEKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZShxdWV1ZU9iamVjdC5xdWV1ZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZXN0cm95JzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvYmplY3QuZGVzdHJveShxdWV1ZU9iamVjdC5zZXJ2ZXJPcHRpb25zKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZShxdWV1ZU9iamVjdC5xdWV1ZUlkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlLmNvZGUgIT09IF9QYXJzZUVycm9yLmRlZmF1bHQuQ09OTkVDVElPTl9GQUlMRUQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlKHF1ZXVlT2JqZWN0LnF1ZXVlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBTdGFydCBwb2xsaW5nIHNlcnZlciBmb3IgbmV0d29yayBjb25uZWN0aW9uLlxuICAgKiBXaWxsIHNlbmQgcXVldWUgaWYgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogQGZ1bmN0aW9uIHBvbGxcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLnBvbGxcbiAgICogQHBhcmFtIFttc10gTWlsbGlzZWNvbmRzIHRvIHBpbmcgdGhlIHNlcnZlci4gRGVmYXVsdCAyMDAwbXNcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcG9sbCgpIHtcbiAgICBsZXQgbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDIwMDA7XG4gICAgaWYgKHBvbGxpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcG9sbGluZyA9ICgwLCBfc2V0SW50ZXJ2YWwyLmRlZmF1bHQpKCgpID0+IHtcbiAgICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICAgIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICdoZWFsdGgnKS50aGVuKF9yZWYgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHN0YXR1c1xuICAgICAgICB9ID0gX3JlZjtcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ29rJykge1xuICAgICAgICAgIHRoaXMuc3RvcFBvbGwoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2goZSA9PiBlKTtcbiAgICB9LCBtcyk7XG4gIH0sXG4gIC8qKlxuICAgKiBUdXJucyBvZmYgcG9sbGluZy5cbiAgICpcbiAgICogQGZ1bmN0aW9uIHN0b3BQb2xsXG4gICAqIEBuYW1lIFBhcnNlLkV2ZW50dWFsbHlRdWV1ZS5zdG9wUG9sbFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdG9wUG9sbCgpIHtcbiAgICBjbGVhckludGVydmFsKHBvbGxpbmcpO1xuICAgIHBvbGxpbmcgPSB1bmRlZmluZWQ7XG4gIH0sXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSBpZiBwaW5naW5nIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBmdW5jdGlvbiBpc1BvbGxpbmdcbiAgICogQG5hbWUgUGFyc2UuRXZlbnR1YWxseVF1ZXVlLmlzUG9sbGluZ1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgaXNQb2xsaW5nKCkge1xuICAgIHJldHVybiAhIXBvbGxpbmc7XG4gIH0sXG4gIF9zZXRQb2xsaW5nKGZsYWcpIHtcbiAgICBwb2xsaW5nID0gZmxhZztcbiAgfSxcbiAgcHJvY2Vzczoge1xuICAgIGNyZWF0ZShPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCkge1xuICAgICAgY29uc3Qgb2JqZWN0ID0gbmV3IE9iamVjdFR5cGUoKTtcbiAgICAgIHJldHVybiBFdmVudHVhbGx5UXVldWUuc2VuZFF1ZXVlQ2FsbGJhY2sob2JqZWN0LCBxdWV1ZU9iamVjdCk7XG4gICAgfSxcbiAgICBhc3luYyBieUlkKE9iamVjdFR5cGUsIHF1ZXVlT2JqZWN0KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHNlc3Npb25Ub2tlblxuICAgICAgfSA9IHF1ZXVlT2JqZWN0LnNlcnZlck9wdGlvbnM7XG4gICAgICBjb25zdCBxdWVyeSA9IG5ldyBfUGFyc2VRdWVyeS5kZWZhdWx0KE9iamVjdFR5cGUpO1xuICAgICAgcXVlcnkuZXF1YWxUbygnb2JqZWN0SWQnLCBxdWV1ZU9iamVjdC5pZCk7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgKDAsIF9maW5kLmRlZmF1bHQpKHF1ZXJ5KS5jYWxsKHF1ZXJ5LCB7XG4gICAgICAgIHNlc3Npb25Ub2tlblxuICAgICAgfSk7XG4gICAgICByZXR1cm4gRXZlbnR1YWxseVF1ZXVlLnNlbmRRdWV1ZUNhbGxiYWNrKHJlc3VsdHNbMF0sIHF1ZXVlT2JqZWN0KTtcbiAgICB9LFxuICAgIGFzeW5jIGJ5SGFzaChPYmplY3RUeXBlLCBxdWV1ZU9iamVjdCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzZXNzaW9uVG9rZW5cbiAgICAgIH0gPSBxdWV1ZU9iamVjdC5zZXJ2ZXJPcHRpb25zO1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgX1BhcnNlUXVlcnkuZGVmYXVsdChPYmplY3RUeXBlKTtcbiAgICAgIHF1ZXJ5LmVxdWFsVG8oJ2hhc2gnLCBxdWV1ZU9iamVjdC5oYXNoKTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCAoMCwgX2ZpbmQuZGVmYXVsdCkocXVlcnkpLmNhbGwocXVlcnksIHtcbiAgICAgICAgc2Vzc2lvblRva2VuXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50dWFsbHlRdWV1ZS5zZW5kUXVldWVDYWxsYmFjayhyZXN1bHRzWzBdLCBxdWV1ZU9iamVjdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gRXZlbnR1YWxseVF1ZXVlLnByb2Nlc3MuY3JlYXRlKE9iamVjdFR5cGUsIHF1ZXVlT2JqZWN0KTtcbiAgICB9XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50dWFsbHlRdWV1ZTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEV2ZW50dWFsbHlRdWV1ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9QYXJzZVVzZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlVXNlclwiKSk7XG4vKiBnbG9iYWwgRkIgKi9cblxubGV0IGluaXRpYWxpemVkID0gZmFsc2U7XG5sZXQgcmVxdWVzdGVkUGVybWlzc2lvbnM7XG5sZXQgaW5pdE9wdGlvbnM7XG5jb25zdCBwcm92aWRlciA9IHtcbiAgYXV0aGVudGljYXRlKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIEZCID09PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0aW9ucy5lcnJvcih0aGlzLCAnRmFjZWJvb2sgU0RLIG5vdCBmb3VuZC4nKTtcbiAgICB9XG4gICAgRkIubG9naW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLmF1dGhSZXNwb25zZSkge1xuICAgICAgICBpZiAob3B0aW9ucy5zdWNjZXNzKSB7XG4gICAgICAgICAgb3B0aW9ucy5zdWNjZXNzKHRoaXMsIHtcbiAgICAgICAgICAgIGlkOiByZXNwb25zZS5hdXRoUmVzcG9uc2UudXNlcklELFxuICAgICAgICAgICAgYWNjZXNzX3Rva2VuOiByZXNwb25zZS5hdXRoUmVzcG9uc2UuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICBleHBpcmF0aW9uX2RhdGU6IG5ldyBEYXRlKHJlc3BvbnNlLmF1dGhSZXNwb25zZS5leHBpcmVzSW4gKiAxMDAwICsgbmV3IERhdGUoKS5nZXRUaW1lKCkpLnRvSlNPTigpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcHRpb25zLmVycm9yKSB7XG4gICAgICAgICAgb3B0aW9ucy5lcnJvcih0aGlzLCByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBzY29wZTogcmVxdWVzdGVkUGVybWlzc2lvbnNcbiAgICB9KTtcbiAgfSxcbiAgcmVzdG9yZUF1dGhlbnRpY2F0aW9uKGF1dGhEYXRhKSB7XG4gICAgaWYgKGF1dGhEYXRhKSB7XG4gICAgICBjb25zdCBuZXdPcHRpb25zID0ge307XG4gICAgICBpZiAoaW5pdE9wdGlvbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gaW5pdE9wdGlvbnMpIHtcbiAgICAgICAgICBuZXdPcHRpb25zW2tleV0gPSBpbml0T3B0aW9uc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTdXBwcmVzcyBjaGVja3MgZm9yIGxvZ2luIHN0YXR1cyBmcm9tIHRoZSBicm93c2VyLlxuICAgICAgbmV3T3B0aW9ucy5zdGF0dXMgPSBmYWxzZTtcblxuICAgICAgLy8gSWYgdGhlIHVzZXIgZG9lc24ndCBtYXRjaCB0aGUgb25lIGtub3duIGJ5IHRoZSBGQiBTREssIGxvZyBvdXQuXG4gICAgICAvLyBNb3N0IG9mIHRoZSB0aW1lLCB0aGUgdXNlcnMgd2lsbCBtYXRjaCAtLSBpdCdzIG9ubHkgaW4gY2FzZXMgd2hlcmVcbiAgICAgIC8vIHRoZSBGQiBTREsga25vd3Mgb2YgYSBkaWZmZXJlbnQgdXNlciB0aGFuIHRoZSBvbmUgYmVpbmcgcmVzdG9yZWRcbiAgICAgIC8vIGZyb20gYSBQYXJzZSBVc2VyIHRoYXQgbG9nZ2VkIGluIHdpdGggdXNlcm5hbWUvcGFzc3dvcmQuXG4gICAgICBjb25zdCBleGlzdGluZ1Jlc3BvbnNlID0gRkIuZ2V0QXV0aFJlc3BvbnNlKCk7XG4gICAgICBpZiAoZXhpc3RpbmdSZXNwb25zZSAmJiBleGlzdGluZ1Jlc3BvbnNlLnVzZXJJRCAhPT0gYXV0aERhdGEuaWQpIHtcbiAgICAgICAgRkIubG9nb3V0KCk7XG4gICAgICB9XG4gICAgICBGQi5pbml0KG5ld09wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgZ2V0QXV0aFR5cGUoKSB7XG4gICAgcmV0dXJuICdmYWNlYm9vayc7XG4gIH0sXG4gIGRlYXV0aGVudGljYXRlKCkge1xuICAgIHRoaXMucmVzdG9yZUF1dGhlbnRpY2F0aW9uKG51bGwpO1xuICB9XG59O1xuXG4vKipcbiAqIFByb3ZpZGVzIGEgc2V0IG9mIHV0aWxpdGllcyBmb3IgdXNpbmcgUGFyc2Ugd2l0aCBGYWNlYm9vay5cbiAqXG4gKiBAY2xhc3MgUGFyc2UuRmFjZWJvb2tVdGlsc1xuICogQHN0YXRpY1xuICogQGhpZGVjb25zdHJ1Y3RvclxuICovXG5jb25zdCBGYWNlYm9va1V0aWxzID0ge1xuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgUGFyc2UgRmFjZWJvb2sgaW50ZWdyYXRpb24uICBDYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgeW91XG4gICAqIGhhdmUgbG9hZGVkIHRoZSBGYWNlYm9vayBKYXZhc2NyaXB0IFNESyB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnNcbiAgICogYXMgeW91IHdvdWxkIHBhc3MgdG88Y29kZT5cbiAgICogPGEgaHJlZj1cbiAgICogXCJodHRwczovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvRkIuaW5pdC9cIj5cbiAgICogRkIuaW5pdCgpPC9hPjwvY29kZT4uICBQYXJzZS5GYWNlYm9va1V0aWxzIHdpbGwgaW52b2tlIEZCLmluaXQoKSBmb3IgeW91XG4gICAqIHdpdGggdGhlc2UgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gaW5pdFxuICAgKiBAbmFtZSBQYXJzZS5GYWNlYm9va1V0aWxzLmluaXRcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgRmFjZWJvb2sgb3B0aW9ucyBhcmd1bWVudCBhcyBkZXNjcmliZWQgaGVyZTpcbiAgICogICA8YSBocmVmPVxuICAgKiAgIFwiaHR0cHM6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L0ZCLmluaXQvXCI+XG4gICAqICAgRkIuaW5pdCgpPC9hPi4gVGhlIHN0YXR1cyBmbGFnIHdpbGwgYmUgY29lcmNlZCB0byAnZmFsc2UnIGJlY2F1c2UgaXRcbiAgICogICBpbnRlcmZlcmVzIHdpdGggUGFyc2UgRmFjZWJvb2sgaW50ZWdyYXRpb24uIENhbGwgRkIuZ2V0TG9naW5TdGF0dXMoKVxuICAgKiAgIGV4cGxpY2l0bHkgaWYgdGhpcyBiZWhhdmlvciBpcyByZXF1aXJlZCBieSB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgaW5pdChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBGQiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIEZhY2Vib29rIEphdmFTY3JpcHQgU0RLIG11c3QgYmUgbG9hZGVkIGJlZm9yZSBjYWxsaW5nIGluaXQuJyk7XG4gICAgfVxuICAgIGluaXRPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICAgICAgaW5pdE9wdGlvbnNba2V5XSA9IG9wdGlvbnNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluaXRPcHRpb25zLnN0YXR1cyAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IHdhcm4gPSBjb25zb2xlLndhcm4gfHwgY29uc29sZS5sb2cgfHwgZnVuY3Rpb24gKCkge307IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgd2Fybi5jYWxsKGNvbnNvbGUsICdUaGUgXCJzdGF0dXNcIiBmbGFnIHBhc3NlZCBpbnRvJyArICcgRkIuaW5pdCwgd2hlbiBzZXQgdG8gdHJ1ZSwgY2FuIGludGVyZmVyZSB3aXRoIFBhcnNlIEZhY2Vib29rJyArICcgaW50ZWdyYXRpb24sIHNvIGl0IGhhcyBiZWVuIHN1cHByZXNzZWQuIFBsZWFzZSBjYWxsJyArICcgRkIuZ2V0TG9naW5TdGF0dXMoKSBleHBsaWNpdGx5IGlmIHlvdSByZXF1aXJlIHRoaXMgYmVoYXZpb3IuJyk7XG4gICAgfVxuICAgIGluaXRPcHRpb25zLnN0YXR1cyA9IGZhbHNlO1xuICAgIEZCLmluaXQoaW5pdE9wdGlvbnMpO1xuICAgIF9QYXJzZVVzZXIuZGVmYXVsdC5fcmVnaXN0ZXJBdXRoZW50aWNhdGlvblByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gIH0sXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZWlyIGFjY291bnQgbGlua2VkIHRvIEZhY2Vib29rLlxuICAgKlxuICAgKiBAZnVuY3Rpb24gaXNMaW5rZWRcbiAgICogQG5hbWUgUGFyc2UuRmFjZWJvb2tVdGlscy5pc0xpbmtlZFxuICAgKiBAcGFyYW0ge1BhcnNlLlVzZXJ9IHVzZXIgVXNlciB0byBjaGVjayBmb3IgYSBmYWNlYm9vayBsaW5rLlxuICAgKiAgICAgVGhlIHVzZXIgbXVzdCBiZSBsb2dnZWQgaW4gb24gdGhpcyBkZXZpY2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBoYXMgdGhlaXIgYWNjb3VudFxuICAgKiAgICAgbGlua2VkIHRvIEZhY2Vib29rLlxuICAgKi9cbiAgaXNMaW5rZWQodXNlcikge1xuICAgIHJldHVybiB1c2VyLl9pc0xpbmtlZCgnZmFjZWJvb2snKTtcbiAgfSxcbiAgLyoqXG4gICAqIExvZ3MgaW4gYSB1c2VyIHVzaW5nIEZhY2Vib29rLiBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhlIEZhY2Vib29rXG4gICAqIFNESyB0byBhdXRoZW50aWNhdGUgdGhlIHVzZXIsIGFuZCB0aGVuIGF1dG9tYXRpY2FsbHkgbG9ncyBpbiAob3JcbiAgICogY3JlYXRlcywgaW4gdGhlIGNhc2Ugd2hlcmUgaXQgaXMgYSBuZXcgdXNlcikgYSBQYXJzZS5Vc2VyLlxuICAgKlxuICAgKiBTdGFuZGFyZCBBUEk6XG4gICAqXG4gICAqIDxjb2RlPmxvZ0luKHBlcm1pc3Npb246IHN0cmluZywgYXV0aERhdGE6IE9iamVjdCk7PC9jb2RlPlxuICAgKlxuICAgKiBBZHZhbmNlZCBBUEk6IFVzZWQgZm9yIGhhbmRsaW5nIHlvdXIgb3duIG9BdXRoIHRva2Vuc1xuICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL3Jlc3QvZ3VpZGUvI2xpbmtpbmctdXNlcnN9XG4gICAqXG4gICAqIDxjb2RlPmxvZ0luKGF1dGhEYXRhOiBPYmplY3QsIG9wdGlvbnM/OiBPYmplY3QpOzwvY29kZT5cbiAgICpcbiAgICogQGZ1bmN0aW9uIGxvZ0luXG4gICAqIEBuYW1lIFBhcnNlLkZhY2Vib29rVXRpbHMubG9nSW5cbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgb2JqZWN0KX0gcGVybWlzc2lvbnMgVGhlIHBlcm1pc3Npb25zIHJlcXVpcmVkIGZvciBGYWNlYm9va1xuICAgKiAgICBsb2cgaW4uICBUaGlzIGlzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyBvZiBwZXJtaXNzaW9ucy5cbiAgICogICAgQWx0ZXJuYXRpdmVseSwgc3VwcGx5IGEgRmFjZWJvb2sgYXV0aERhdGEgb2JqZWN0IGFzIGRlc2NyaWJlZCBpbiBvdXJcbiAgICogICAgUkVTVCBBUEkgZG9jcyBpZiB5b3Ugd2FudCB0byBoYW5kbGUgZ2V0dGluZyBmYWNlYm9vayBhdXRoIHRva2Vuc1xuICAgKiAgICB5b3Vyc2VsZi5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgTWFzdGVyS2V5IC8gU2Vzc2lvblRva2VuLiBBbHRlcm5hdGl2ZWx5IGNhbiBiZSB1c2VkIGZvciBhdXRoRGF0YSBpZiBwZXJtaXNzaW9ucyBpcyBhIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIGxvZ0luKHBlcm1pc3Npb25zLCBvcHRpb25zKSB7XG4gICAgaWYgKCFwZXJtaXNzaW9ucyB8fCB0eXBlb2YgcGVybWlzc2lvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoIWluaXRpYWxpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgaW5pdGlhbGl6ZSBGYWNlYm9va1V0aWxzIGJlZm9yZSBjYWxsaW5nIGxvZ0luLicpO1xuICAgICAgfVxuICAgICAgcmVxdWVzdGVkUGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICAgIHJldHVybiBfUGFyc2VVc2VyLmRlZmF1bHQubG9nSW5XaXRoKCdmYWNlYm9vaycsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gX1BhcnNlVXNlci5kZWZhdWx0LmxvZ0luV2l0aCgnZmFjZWJvb2snLCB7XG4gICAgICBhdXRoRGF0YTogcGVybWlzc2lvbnNcbiAgICB9LCBvcHRpb25zKTtcbiAgfSxcbiAgLyoqXG4gICAqIExpbmtzIEZhY2Vib29rIHRvIGFuIGV4aXN0aW5nIFBGVXNlci4gVGhpcyBtZXRob2QgZGVsZWdhdGVzIHRvIHRoZVxuICAgKiBGYWNlYm9vayBTREsgdG8gYXV0aGVudGljYXRlIHRoZSB1c2VyLCBhbmQgdGhlbiBhdXRvbWF0aWNhbGx5IGxpbmtzXG4gICAqIHRoZSBhY2NvdW50IHRvIHRoZSBQYXJzZS5Vc2VyLlxuICAgKlxuICAgKiBTdGFuZGFyZCBBUEk6XG4gICAqXG4gICAqIDxjb2RlPmxpbmsodXNlcjogUGFyc2UuVXNlciwgcGVybWlzc2lvbjogc3RyaW5nLCBhdXRoRGF0YT86IE9iamVjdCk7PC9jb2RlPlxuICAgKlxuICAgKiBBZHZhbmNlZCBBUEk6IFVzZWQgZm9yIGhhbmRsaW5nIHlvdXIgb3duIG9BdXRoIHRva2Vuc1xuICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL3Jlc3QvZ3VpZGUvI2xpbmtpbmctdXNlcnN9XG4gICAqXG4gICAqIDxjb2RlPmxpbmsodXNlcjogUGFyc2UuVXNlciwgYXV0aERhdGE6IE9iamVjdCwgb3B0aW9ucz86IEZ1bGxPcHRpb25zKTs8L2NvZGU+XG4gICAqXG4gICAqIEBmdW5jdGlvbiBsaW5rXG4gICAqIEBuYW1lIFBhcnNlLkZhY2Vib29rVXRpbHMubGlua1xuICAgKiBAcGFyYW0ge1BhcnNlLlVzZXJ9IHVzZXIgVXNlciB0byBsaW5rIHRvIEZhY2Vib29rLiBUaGlzIG11c3QgYmUgdGhlXG4gICAqICAgICBjdXJyZW50IHVzZXIuXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IG9iamVjdCl9IHBlcm1pc3Npb25zIFRoZSBwZXJtaXNzaW9ucyByZXF1aXJlZCBmb3IgRmFjZWJvb2tcbiAgICogICAgbG9nIGluLiAgVGhpcyBpcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcgb2YgcGVybWlzc2lvbnMuXG4gICAqICAgIEFsdGVybmF0aXZlbHksIHN1cHBseSBhIEZhY2Vib29rIGF1dGhEYXRhIG9iamVjdCBhcyBkZXNjcmliZWQgaW4gb3VyXG4gICAqICAgIFJFU1QgQVBJIGRvY3MgaWYgeW91IHdhbnQgdG8gaGFuZGxlIGdldHRpbmcgZmFjZWJvb2sgYXV0aCB0b2tlbnNcbiAgICogICAgeW91cnNlbGYuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE1hc3RlcktleSAvIFNlc3Npb25Ub2tlbi4gQWx0ZXJuYXRpdmVseSBjYW4gYmUgdXNlZCBmb3IgYXV0aERhdGEgaWYgcGVybWlzc2lvbnMgaXMgYSBzdHJpbmdcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBsaW5rKHVzZXIsIHBlcm1pc3Npb25zLCBvcHRpb25zKSB7XG4gICAgaWYgKCFwZXJtaXNzaW9ucyB8fCB0eXBlb2YgcGVybWlzc2lvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoIWluaXRpYWxpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgaW5pdGlhbGl6ZSBGYWNlYm9va1V0aWxzIGJlZm9yZSBjYWxsaW5nIGxpbmsuJyk7XG4gICAgICB9XG4gICAgICByZXF1ZXN0ZWRQZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xuICAgICAgcmV0dXJuIHVzZXIubGlua1dpdGgoJ2ZhY2Vib29rJywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyLmxpbmtXaXRoKCdmYWNlYm9vaycsIHtcbiAgICAgIGF1dGhEYXRhOiBwZXJtaXNzaW9uc1xuICAgIH0sIG9wdGlvbnMpO1xuICB9LFxuICAvKipcbiAgICogVW5saW5rcyB0aGUgUGFyc2UuVXNlciBmcm9tIGEgRmFjZWJvb2sgYWNjb3VudC5cbiAgICpcbiAgICogQGZ1bmN0aW9uIHVubGlua1xuICAgKiBAbmFtZSBQYXJzZS5GYWNlYm9va1V0aWxzLnVubGlua1xuICAgKiBAcGFyYW0ge1BhcnNlLlVzZXJ9IHVzZXIgVXNlciB0byB1bmxpbmsgZnJvbSBGYWNlYm9vay4gVGhpcyBtdXN0IGJlIHRoZVxuICAgKiAgICAgY3VycmVudCB1c2VyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTdGFuZGFyZCBvcHRpb25zIG9iamVjdCB3aXRoIHN1Y2Nlc3MgYW5kIGVycm9yXG4gICAqICAgIGNhbGxiYWNrcy5cbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICB1bmxpbms6IGZ1bmN0aW9uICh1c2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBpbml0aWFsaXplIEZhY2Vib29rVXRpbHMgYmVmb3JlIGNhbGxpbmcgdW5saW5rLicpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlci5fdW5saW5rRnJvbSgnZmFjZWJvb2snLCBvcHRpb25zKTtcbiAgfSxcbiAgLy8gVXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlc1xuICBfZ2V0QXV0aFByb3ZpZGVyKCkge1xuICAgIHJldHVybiBwcm92aWRlcjtcbiAgfVxufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IEZhY2Vib29rVXRpbHM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfa2V5c0luc3RhbmNlUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9rZXlzXCIpO1xudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2lkYktleXZhbCA9IHJlcXVpcmUoXCJpZGIta2V5dmFsXCIpO1xuLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG5sZXQgSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXI7XG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmluZGV4ZWREQikge1xuICB0cnkge1xuICAgIGNvbnN0IFBhcnNlU3RvcmUgPSAoMCwgX2lkYktleXZhbC5jcmVhdGVTdG9yZSkoJ3BhcnNlREInLCAncGFyc2VTdG9yZScpO1xuICAgIEluZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyID0ge1xuICAgICAgYXN5bmM6IDEsXG4gICAgICBnZXRJdGVtQXN5bmMocGF0aCkge1xuICAgICAgICByZXR1cm4gKDAsIF9pZGJLZXl2YWwuZ2V0KShwYXRoLCBQYXJzZVN0b3JlKTtcbiAgICAgIH0sXG4gICAgICBzZXRJdGVtQXN5bmMocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaWRiS2V5dmFsLnNldCkocGF0aCwgdmFsdWUsIFBhcnNlU3RvcmUpO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUl0ZW1Bc3luYyhwYXRoKSB7XG4gICAgICAgIHJldHVybiAoMCwgX2lkYktleXZhbC5kZWwpKHBhdGgsIFBhcnNlU3RvcmUpO1xuICAgICAgfSxcbiAgICAgIGdldEFsbEtleXNBc3luYygpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfa2V5c0luc3RhbmNlUHJvcGVydHkoX2lkYktleXZhbCkpKFBhcnNlU3RvcmUpO1xuICAgICAgfSxcbiAgICAgIGNsZWFyKCkge1xuICAgICAgICByZXR1cm4gKDAsIF9pZGJLZXl2YWwuY2xlYXIpKFBhcnNlU3RvcmUpO1xuICAgICAgfVxuICAgIH07XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICAvLyBJbmRleGVkREIgbm90IGFjY2Vzc2libGVcbiAgICBJbmRleGVkREJTdG9yYWdlQ29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgfVxufSBlbHNlIHtcbiAgLy8gSW5kZXhlZERCIG5vdCBzdXBwb3J0ZWRcbiAgSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXIgPSB1bmRlZmluZWQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEluZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1N0b3JhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VcIikpO1xudmFyIF9QYXJzZUluc3RhbGxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VJbnN0YWxsYXRpb25cIikpO1xudmFyIF91dWlkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dWlkXCIpKTtcbmNvbnN0IENVUlJFTlRfSU5TVEFMTEFUSU9OX0tFWSA9ICdjdXJyZW50SW5zdGFsbGF0aW9uJztcbmNvbnN0IENVUlJFTlRfSU5TVEFMTEFUSU9OX0lEX0tFWSA9ICdjdXJyZW50SW5zdGFsbGF0aW9uSWQnO1xubGV0IGlpZENhY2hlID0gbnVsbDtcbmxldCBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUgPSBudWxsO1xubGV0IGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZU1hdGNoZXNEaXNrID0gZmFsc2U7XG5jb25zdCBJbnN0YWxsYXRpb25Db250cm9sbGVyID0ge1xuICBhc3luYyB1cGRhdGVJbnN0YWxsYXRpb25PbkRpc2soaW5zdGFsbGF0aW9uKSB7XG4gICAgY29uc3QgcGF0aCA9IF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfSU5TVEFMTEFUSU9OX0tFWSk7XG4gICAgYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMocGF0aCwgKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoaW5zdGFsbGF0aW9uLnRvSlNPTigpKSk7XG4gICAgdGhpcy5fc2V0Q3VycmVudEluc3RhbGxhdGlvbkNhY2hlKGluc3RhbGxhdGlvbik7XG4gIH0sXG4gIGFzeW5jIGN1cnJlbnRJbnN0YWxsYXRpb25JZCgpIHtcbiAgICBpZiAodHlwZW9mIGlpZENhY2hlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGlpZENhY2hlO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gX1N0b3JhZ2UuZGVmYXVsdC5nZW5lcmF0ZVBhdGgoQ1VSUkVOVF9JTlNUQUxMQVRJT05fSURfS0VZKTtcbiAgICBsZXQgaWlkID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtQXN5bmMocGF0aCk7XG4gICAgaWYgKCFpaWQpIHtcbiAgICAgIGlpZCA9ICgwLCBfdXVpZC5kZWZhdWx0KSgpO1xuICAgICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQuc2V0SXRlbUFzeW5jKHBhdGgsIGlpZCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlpZENhY2hlID0gaWlkO1xuICAgICAgICByZXR1cm4gaWlkO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlpZENhY2hlID0gaWlkO1xuICAgIHJldHVybiBpaWQ7XG4gIH0sXG4gIGFzeW5jIGN1cnJlbnRJbnN0YWxsYXRpb24oKSB7XG4gICAgaWYgKGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZU1hdGNoZXNEaXNrKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfSU5TVEFMTEFUSU9OX0tFWSk7XG4gICAgbGV0IGluc3RhbGxhdGlvbkRhdGEgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhwYXRoKTtcbiAgICBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGVNYXRjaGVzRGlzayA9IHRydWU7XG4gICAgaWYgKGluc3RhbGxhdGlvbkRhdGEpIHtcbiAgICAgIGluc3RhbGxhdGlvbkRhdGEgPSBKU09OLnBhcnNlKGluc3RhbGxhdGlvbkRhdGEpO1xuICAgICAgaW5zdGFsbGF0aW9uRGF0YS5jbGFzc05hbWUgPSAnX0luc3RhbGxhdGlvbic7XG4gICAgICBjb25zdCBjdXJyZW50ID0gX1BhcnNlSW5zdGFsbGF0aW9uLmRlZmF1bHQuZnJvbUpTT04oaW5zdGFsbGF0aW9uRGF0YSk7XG4gICAgICBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGUgPSBjdXJyZW50O1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbGxhdGlvbklkID0gYXdhaXQgdGhpcy5jdXJyZW50SW5zdGFsbGF0aW9uSWQoKTtcbiAgICBjb25zdCBpbnN0YWxsYXRpb24gPSBuZXcgX1BhcnNlSW5zdGFsbGF0aW9uLmRlZmF1bHQoKTtcbiAgICBpbnN0YWxsYXRpb24uc2V0KCdkZXZpY2VUeXBlJywgX1BhcnNlSW5zdGFsbGF0aW9uLmRlZmF1bHQuREVWSUNFX1RZUEVTLldFQik7XG4gICAgaW5zdGFsbGF0aW9uLnNldCgnaW5zdGFsbGF0aW9uSWQnLCBpbnN0YWxsYXRpb25JZCk7XG4gICAgaW5zdGFsbGF0aW9uLnNldCgncGFyc2VWZXJzaW9uJywgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdWRVJTSU9OJykpO1xuICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZSA9IGluc3RhbGxhdGlvbjtcbiAgICBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LnNldEl0ZW1Bc3luYyhwYXRoLCAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShpbnN0YWxsYXRpb24udG9KU09OKCkpKTtcbiAgICByZXR1cm4gaW5zdGFsbGF0aW9uO1xuICB9LFxuICBfY2xlYXJDYWNoZSgpIHtcbiAgICBpaWRDYWNoZSA9IG51bGw7XG4gICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlID0gbnVsbDtcbiAgICBjdXJyZW50SW5zdGFsbGF0aW9uQ2FjaGVNYXRjaGVzRGlzayA9IGZhbHNlO1xuICB9LFxuICBfc2V0SW5zdGFsbGF0aW9uSWRDYWNoZShpaWQpIHtcbiAgICBpaWRDYWNoZSA9IGlpZDtcbiAgfSxcbiAgX3NldEN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZShpbnN0YWxsYXRpb24pIHtcbiAgICBsZXQgbWF0Y2hlc0Rpc2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgY3VycmVudEluc3RhbGxhdGlvbkNhY2hlID0gaW5zdGFsbGF0aW9uO1xuICAgIGN1cnJlbnRJbnN0YWxsYXRpb25DYWNoZU1hdGNoZXNEaXNrID0gbWF0Y2hlc0Rpc2s7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IEluc3RhbGxhdGlvbkNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBJbnN0YWxsYXRpb25Db250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9tYXBcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9rZXlzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfdmFsdWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS92YWx1ZXNcIikpO1xudmFyIF9zZXRUaW1lb3V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvc2V0LXRpbWVvdXRcIikpO1xudmFyIF9iaW5kID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9iaW5kXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBfTGl2ZVF1ZXJ5U3Vic2NyaXB0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9MaXZlUXVlcnlTdWJzY3JpcHRpb25cIikpO1xudmFyIF9wcm9taXNlVXRpbHMgPSByZXF1aXJlKFwiLi9wcm9taXNlVXRpbHNcIik7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xuLy8gVGhlIExpdmVRdWVyeSBjbGllbnQgaW5uZXIgc3RhdGVcbmNvbnN0IENMSUVOVF9TVEFURSA9IHtcbiAgSU5JVElBTElaRUQ6ICdpbml0aWFsaXplZCcsXG4gIENPTk5FQ1RJTkc6ICdjb25uZWN0aW5nJyxcbiAgQ09OTkVDVEVEOiAnY29ubmVjdGVkJyxcbiAgQ0xPU0VEOiAnY2xvc2VkJyxcbiAgUkVDT05ORUNUSU5HOiAncmVjb25uZWN0aW5nJyxcbiAgRElTQ09OTkVDVEVEOiAnZGlzY29ubmVjdGVkJ1xufTtcblxuLy8gVGhlIGV2ZW50IHR5cGUgdGhlIExpdmVRdWVyeSBjbGllbnQgc2hvdWxkIHNlbnQgdG8gc2VydmVyXG5jb25zdCBPUF9UWVBFUyA9IHtcbiAgQ09OTkVDVDogJ2Nvbm5lY3QnLFxuICBTVUJTQ1JJQkU6ICdzdWJzY3JpYmUnLFxuICBVTlNVQlNDUklCRTogJ3Vuc3Vic2NyaWJlJyxcbiAgRVJST1I6ICdlcnJvcidcbn07XG5cbi8vIFRoZSBldmVudCB3ZSBnZXQgYmFjayBmcm9tIExpdmVRdWVyeSBzZXJ2ZXJcbmNvbnN0IE9QX0VWRU5UUyA9IHtcbiAgQ09OTkVDVEVEOiAnY29ubmVjdGVkJyxcbiAgU1VCU0NSSUJFRDogJ3N1YnNjcmliZWQnLFxuICBVTlNVQlNDUklCRUQ6ICd1bnN1YnNjcmliZWQnLFxuICBFUlJPUjogJ2Vycm9yJyxcbiAgQ1JFQVRFOiAnY3JlYXRlJyxcbiAgVVBEQVRFOiAndXBkYXRlJyxcbiAgRU5URVI6ICdlbnRlcicsXG4gIExFQVZFOiAnbGVhdmUnLFxuICBERUxFVEU6ICdkZWxldGUnXG59O1xuXG4vLyBUaGUgZXZlbnQgdGhlIExpdmVRdWVyeSBjbGllbnQgc2hvdWxkIGVtaXRcbmNvbnN0IENMSUVOVF9FTU1JVEVSX1RZUEVTID0ge1xuICBDTE9TRTogJ2Nsb3NlJyxcbiAgRVJST1I6ICdlcnJvcicsXG4gIE9QRU46ICdvcGVuJ1xufTtcblxuLy8gVGhlIGV2ZW50IHRoZSBMaXZlUXVlcnkgc3Vic2NyaXB0aW9uIHNob3VsZCBlbWl0XG5jb25zdCBTVUJTQ1JJUFRJT05fRU1NSVRFUl9UWVBFUyA9IHtcbiAgT1BFTjogJ29wZW4nLFxuICBDTE9TRTogJ2Nsb3NlJyxcbiAgRVJST1I6ICdlcnJvcicsXG4gIENSRUFURTogJ2NyZWF0ZScsXG4gIFVQREFURTogJ3VwZGF0ZScsXG4gIEVOVEVSOiAnZW50ZXInLFxuICBMRUFWRTogJ2xlYXZlJyxcbiAgREVMRVRFOiAnZGVsZXRlJ1xufTtcblxuLy8gRXhwb25lbnRpYWxseS1ncm93aW5nIHJhbmRvbSBkZWxheVxuY29uc3QgZ2VuZXJhdGVJbnRlcnZhbCA9IGsgPT4ge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIE1hdGgubWluKDMwLCBNYXRoLnBvdygyLCBrKSAtIDEpICogMTAwMDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBMaXZlUXVlcnlDbGllbnQuXG4gKiA8YSBocmVmPVwiaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9ldmVudHMuaHRtbCNldmVudHNfY2xhc3NfZXZlbnRlbWl0dGVyXCI+Y2xvdWQgZnVuY3Rpb25zPC9hPi5cbiAqXG4gKiBBIHdyYXBwZXIgb2YgYSBzdGFuZGFyZCBXZWJTb2NrZXQgY2xpZW50LiBXZSBhZGQgc2V2ZXJhbCB1c2VmdWwgbWV0aG9kcyB0b1xuICogaGVscCB5b3UgY29ubmVjdC9kaXNjb25uZWN0IHRvIExpdmVRdWVyeVNlcnZlciwgc3Vic2NyaWJlL3Vuc3Vic2NyaWJlIGEgUGFyc2VRdWVyeSBlYXNpbHkuXG4gKlxuICogamF2YXNjcmlwdEtleSBhbmQgbWFzdGVyS2V5IGFyZSB1c2VkIGZvciB2ZXJpZnlpbmcgdGhlIExpdmVRdWVyeUNsaWVudCB3aGVuIGl0IHRyaWVzXG4gKiB0byBjb25uZWN0IHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyXG4gKlxuICogV2UgZXhwb3NlIHRocmVlIGV2ZW50cyB0byBoZWxwIHlvdSBtb25pdG9yIHRoZSBzdGF0dXMgb2YgdGhlIExpdmVRdWVyeUNsaWVudC5cbiAqXG4gKiA8cHJlPlxuICogY29uc3QgTGl2ZVF1ZXJ5Q2xpZW50ID0gUGFyc2UuTGl2ZVF1ZXJ5Q2xpZW50O1xuICogY29uc3QgY2xpZW50ID0gbmV3IExpdmVRdWVyeUNsaWVudCh7XG4gKiAgIGFwcGxpY2F0aW9uSWQ6ICcnLFxuICogICBzZXJ2ZXJVUkw6ICcnLFxuICogICBqYXZhc2NyaXB0S2V5OiAnJyxcbiAqICAgbWFzdGVyS2V5OiAnJ1xuICogIH0pO1xuICogPC9wcmU+XG4gKlxuICogT3BlbiAtIFdoZW4gd2UgZXN0YWJsaXNoIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciwgeW91J2xsIGdldCB0aGlzIGV2ZW50LlxuICogPHByZT5cbiAqIGNsaWVudC5vbignb3BlbicsICgpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT5cbiAqXG4gKiBDbG9zZSAtIFdoZW4gd2UgbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqIDxwcmU+XG4gKiBjbGllbnQub24oJ2Nsb3NlJywgKCkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPlxuICpcbiAqIEVycm9yIC0gV2hlbiBzb21lIG5ldHdvcmsgZXJyb3Igb3IgTGl2ZVF1ZXJ5IHNlcnZlciBlcnJvciBoYXBwZW5zLCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuXG4gKiA8cHJlPlxuICogY2xpZW50Lm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICpcbiAqIH0pOzwvcHJlPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5MaXZlUXVlcnlDbGllbnRcbiAqL1xuY2xhc3MgTGl2ZVF1ZXJ5Q2xpZW50IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmFwcGxpY2F0aW9uSWQgLSBhcHBsaWNhdGlvbklkIG9mIHlvdXIgUGFyc2UgYXBwXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnNlcnZlclVSTCAtIDxiPnRoZSBVUkwgb2YgeW91ciBMaXZlUXVlcnkgc2VydmVyPC9iPlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5qYXZhc2NyaXB0S2V5IChvcHRpb25hbClcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubWFzdGVyS2V5IChvcHRpb25hbCkgWW91ciBQYXJzZSBNYXN0ZXIgS2V5LiAoTm9kZS5qcyBvbmx5ISlcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuc2Vzc2lvblRva2VuIChvcHRpb25hbClcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQgKG9wdGlvbmFsKVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3JlZikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IHtcbiAgICAgIGFwcGxpY2F0aW9uSWQsXG4gICAgICBzZXJ2ZXJVUkwsXG4gICAgICBqYXZhc2NyaXB0S2V5LFxuICAgICAgbWFzdGVyS2V5LFxuICAgICAgc2Vzc2lvblRva2VuLFxuICAgICAgaW5zdGFsbGF0aW9uSWRcbiAgICB9ID0gX3JlZjtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImF0dGVtcHRzXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJpZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVxdWVzdElkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJhcHBsaWNhdGlvbklkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzZXJ2ZXJVUkxcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImphdmFzY3JpcHRLZXlcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm1hc3RlcktleVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic2Vzc2lvblRva2VuXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJpbnN0YWxsYXRpb25JZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImNvbm5lY3RQcm9taXNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzdWJzY3JpcHRpb25zXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzb2NrZXRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInN0YXRlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZWNvbm5lY3RIYW5kbGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImVtaXR0ZXJcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJlbWl0XCIsIHZvaWQgMCk7XG4gICAgaWYgKCFzZXJ2ZXJVUkwgfHwgKDAsIF9pbmRleE9mLmRlZmF1bHQpKHNlcnZlclVSTCkuY2FsbChzZXJ2ZXJVUkwsICd3cycpICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHNldCBhIHByb3BlciBQYXJzZSBMaXZlUXVlcnkgc2VydmVyIHVybCBiZWZvcmUgdXNpbmcgTGl2ZVF1ZXJ5Q2xpZW50Jyk7XG4gICAgfVxuICAgIHRoaXMucmVjb25uZWN0SGFuZGxlID0gbnVsbDtcbiAgICB0aGlzLmF0dGVtcHRzID0gMTtcbiAgICB0aGlzLmlkID0gMDtcbiAgICB0aGlzLnJlcXVlc3RJZCA9IDE7XG4gICAgdGhpcy5zZXJ2ZXJVUkwgPSBzZXJ2ZXJVUkw7XG4gICAgdGhpcy5hcHBsaWNhdGlvbklkID0gYXBwbGljYXRpb25JZDtcbiAgICB0aGlzLmphdmFzY3JpcHRLZXkgPSBqYXZhc2NyaXB0S2V5IHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hc3RlcktleSA9IG1hc3RlcktleSB8fCB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZXNzaW9uVG9rZW4gPSBzZXNzaW9uVG9rZW4gfHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuaW5zdGFsbGF0aW9uSWQgPSBpbnN0YWxsYXRpb25JZCB8fCB1bmRlZmluZWQ7XG4gICAgdGhpcy5hZGRpdGlvbmFsUHJvcGVydGllcyA9IHRydWU7XG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9ICgwLCBfcHJvbWlzZVV0aWxzLnJlc29sdmluZ1Byb21pc2UpKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gbmV3IF9tYXAuZGVmYXVsdCgpO1xuICAgIHRoaXMuc3RhdGUgPSBDTElFTlRfU1RBVEUuSU5JVElBTElaRUQ7XG4gICAgY29uc3QgRXZlbnRFbWl0dGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMub24gPSAoZXZlbnROYW1lLCBsaXN0ZW5lcikgPT4gdGhpcy5lbWl0dGVyLm9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIHRoaXMuZW1pdCA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gX3RoaXMuZW1pdHRlci5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7XG4gICAgfTtcbiAgICAvLyBhZGRpbmcgbGlzdGVuZXIgc28gcHJvY2VzcyBkb2VzIG5vdCBjcmFzaFxuICAgIC8vIGJlc3QgcHJhY3RpY2UgaXMgZm9yIGRldmVsb3BlciB0byByZWdpc3RlciB0aGVpciBvd24gbGlzdGVuZXJcbiAgICB0aGlzLm9uKCdlcnJvcicsICgpID0+IHt9KTtcbiAgfVxuICBzaG91bGRPcGVuKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuSU5JVElBTElaRUQgfHwgdGhpcy5zdGF0ZSA9PT0gQ0xJRU5UX1NUQVRFLkRJU0NPTk5FQ1RFRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIGEgUGFyc2VRdWVyeVxuICAgKlxuICAgKiBJZiB5b3UgcHJvdmlkZSB0aGUgc2Vzc2lvblRva2VuLCB3aGVuIHRoZSBMaXZlUXVlcnkgc2VydmVyIGdldHMgUGFyc2VPYmplY3Qnc1xuICAgKiB1cGRhdGVzIGZyb20gcGFyc2Ugc2VydmVyLCBpdCdsbCB0cnkgdG8gY2hlY2sgd2hldGhlciB0aGUgc2Vzc2lvblRva2VuIGZ1bGZpbGxzXG4gICAqIHRoZSBQYXJzZU9iamVjdCdzIEFDTC4gVGhlIExpdmVRdWVyeSBzZXJ2ZXIgd2lsbCBvbmx5IHNlbmQgdXBkYXRlcyB0byBjbGllbnRzIHdob3NlXG4gICAqIHNlc3Npb25Ub2tlbiBpcyBmaXQgZm9yIHRoZSBQYXJzZU9iamVjdCdzIEFDTC4gWW91IGNhbiBjaGVjayB0aGUgTGl2ZVF1ZXJ5IHByb3RvY29sXG4gICAqIDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vcGFyc2UtY29tbXVuaXR5L3BhcnNlLXNlcnZlci93aWtpL1BhcnNlLUxpdmVRdWVyeS1Qcm90b2NvbC1TcGVjaWZpY2F0aW9uXCI+aGVyZTwvYT4gZm9yIG1vcmUgZGV0YWlscy4gVGhlIHN1YnNjcmlwdGlvbiB5b3UgZ2V0IGlzIHRoZSBzYW1lIHN1YnNjcmlwdGlvbiB5b3UgZ2V0XG4gICAqIGZyb20gb3VyIFN0YW5kYXJkIEFQSS5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZVF1ZXJ5fSBxdWVyeSAtIHRoZSBQYXJzZVF1ZXJ5IHlvdSB3YW50IHRvIHN1YnNjcmliZSB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblRva2VuIChvcHRpb25hbClcbiAgICogQHJldHVybnMge0xpdmVRdWVyeVN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHN1YnNjcmliZShxdWVyeSwgc2Vzc2lvblRva2VuKSB7XG4gICAgaWYgKCFxdWVyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBxdWVyeS5jbGFzc05hbWU7XG4gICAgY29uc3QgcXVlcnlKU09OID0gcXVlcnkudG9KU09OKCk7XG4gICAgY29uc3Qgd2hlcmUgPSBxdWVyeUpTT04ud2hlcmU7XG4gICAgY29uc3Qga2V5cyA9ICgwLCBfa2V5cy5kZWZhdWx0KShxdWVyeUpTT04pPy5zcGxpdCgnLCcpO1xuICAgIGNvbnN0IHdhdGNoID0gcXVlcnlKU09OLndhdGNoPy5zcGxpdCgnLCcpO1xuICAgIGNvbnN0IHN1YnNjcmliZVJlcXVlc3QgPSB7XG4gICAgICBvcDogT1BfVFlQRVMuU1VCU0NSSUJFLFxuICAgICAgcmVxdWVzdElkOiB0aGlzLnJlcXVlc3RJZCxcbiAgICAgIHF1ZXJ5OiB7XG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgd2hlcmUsXG4gICAgICAgIGtleXMsXG4gICAgICAgIHdhdGNoXG4gICAgICB9LFxuICAgICAgc2Vzc2lvblRva2VuOiB1bmRlZmluZWRcbiAgICB9O1xuICAgIGlmIChzZXNzaW9uVG9rZW4pIHtcbiAgICAgIHN1YnNjcmliZVJlcXVlc3Quc2Vzc2lvblRva2VuID0gc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgX0xpdmVRdWVyeVN1YnNjcmlwdGlvbi5kZWZhdWx0KHRoaXMucmVxdWVzdElkLCBxdWVyeSwgc2Vzc2lvblRva2VuKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KHRoaXMucmVxdWVzdElkLCBzdWJzY3JpcHRpb24pO1xuICAgIHRoaXMucmVxdWVzdElkICs9IDE7XG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoc3Vic2NyaWJlUmVxdWVzdCkpO1xuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZnRlciBjYWxsaW5nIHVuc3Vic2NyaWJlIHlvdSdsbCBzdG9wIHJlY2VpdmluZyBldmVudHMgZnJvbSB0aGUgc3Vic2NyaXB0aW9uIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHN1YnNjcmlwdGlvbiAtIHN1YnNjcmlwdGlvbiB5b3Ugd291bGQgbGlrZSB0byB1bnN1YnNjcmliZSBmcm9tLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZSB8IHVuZGVmaW5lZH1cbiAgICovXG4gIGFzeW5jIHVuc3Vic2NyaWJlKHN1YnNjcmlwdGlvbikge1xuICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHVuc3Vic2NyaWJlUmVxdWVzdCA9IHtcbiAgICAgIG9wOiBPUF9UWVBFUy5VTlNVQlNDUklCRSxcbiAgICAgIHJlcXVlc3RJZDogc3Vic2NyaXB0aW9uLmlkXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0UHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnNvY2tldC5zZW5kKCgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHVuc3Vic2NyaWJlUmVxdWVzdCkpO1xuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZVByb21pc2U7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWZ0ZXIgb3BlbiBpcyBjYWxsZWQsIHRoZSBMaXZlUXVlcnlDbGllbnQgd2lsbCB0cnkgdG8gc2VuZCBhIGNvbm5lY3QgcmVxdWVzdFxuICAgKiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlci5cbiAgICpcbiAgICovXG4gIG9wZW4oKSB7XG4gICAgY29uc3QgV2ViU29ja2V0SW1wbGVtZW50YXRpb24gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRXZWJTb2NrZXRDb250cm9sbGVyKCk7XG4gICAgaWYgKCFXZWJTb2NrZXRJbXBsZW1lbnRhdGlvbikge1xuICAgICAgdGhpcy5lbWl0KENMSUVOVF9FTU1JVEVSX1RZUEVTLkVSUk9SLCAnQ2FuIG5vdCBmaW5kIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gQ0xJRU5UX1NUQVRFLlJFQ09OTkVDVElORykge1xuICAgICAgdGhpcy5zdGF0ZSA9IENMSUVOVF9TVEFURS5DT05ORUNUSU5HO1xuICAgIH1cbiAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXRJbXBsZW1lbnRhdGlvbih0aGlzLnNlcnZlclVSTCk7XG4gICAgdGhpcy5zb2NrZXQuY2xvc2luZ1Byb21pc2UgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuXG4gICAgLy8gQmluZCBXZWJTb2NrZXQgY2FsbGJhY2tzXG4gICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgdGhpcy5faGFuZGxlV2ViU29ja2V0T3BlbigpO1xuICAgIH07XG4gICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gZXZlbnQgPT4ge1xuICAgICAgdGhpcy5faGFuZGxlV2ViU29ja2V0TWVzc2FnZShldmVudCk7XG4gICAgfTtcbiAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gZXZlbnQgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQuY2xvc2luZ1Byb21pc2U/LnJlc29sdmUoZXZlbnQpO1xuICAgICAgdGhpcy5faGFuZGxlV2ViU29ja2V0Q2xvc2UoKTtcbiAgICB9O1xuICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICB0aGlzLl9oYW5kbGVXZWJTb2NrZXRFcnJvcihlcnJvcik7XG4gICAgfTtcbiAgfVxuICByZXN1YnNjcmliZSgpIHtcbiAgICB2YXIgX2NvbnRleHQ7XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0ID0gdGhpcy5zdWJzY3JpcHRpb25zKS5jYWxsKF9jb250ZXh0LCAoc3Vic2NyaXB0aW9uLCByZXF1ZXN0SWQpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gc3Vic2NyaXB0aW9uLnF1ZXJ5O1xuICAgICAgY29uc3QgcXVlcnlKU09OID0gcXVlcnkudG9KU09OKCk7XG4gICAgICBjb25zdCB3aGVyZSA9IHF1ZXJ5SlNPTi53aGVyZTtcbiAgICAgIGNvbnN0IGtleXMgPSAoMCwgX2tleXMuZGVmYXVsdCkocXVlcnlKU09OKT8uc3BsaXQoJywnKTtcbiAgICAgIGNvbnN0IHdhdGNoID0gcXVlcnlKU09OLndhdGNoPy5zcGxpdCgnLCcpO1xuICAgICAgY29uc3QgY2xhc3NOYW1lID0gcXVlcnkuY2xhc3NOYW1lO1xuICAgICAgY29uc3Qgc2Vzc2lvblRva2VuID0gc3Vic2NyaXB0aW9uLnNlc3Npb25Ub2tlbjtcbiAgICAgIGNvbnN0IHN1YnNjcmliZVJlcXVlc3QgPSB7XG4gICAgICAgIG9wOiBPUF9UWVBFUy5TVUJTQ1JJQkUsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgd2hlcmUsXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICB3YXRjaFxuICAgICAgICB9LFxuICAgICAgICBzZXNzaW9uVG9rZW46IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICAgIGlmIChzZXNzaW9uVG9rZW4pIHtcbiAgICAgICAgc3Vic2NyaWJlUmVxdWVzdC5zZXNzaW9uVG9rZW4gPSBzZXNzaW9uVG9rZW47XG4gICAgICB9XG4gICAgICB0aGlzLmNvbm5lY3RQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKCgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHN1YnNjcmliZVJlcXVlc3QpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoaXMgTGl2ZVF1ZXJ5Q2xpZW50LFxuICAgKiBjYW5jZWwgdGhlIGF1dG8gcmVjb25uZWN0IGFuZCB1bnN1YnNjcmliZSBhbGwgc3Vic2NyaXB0aW9ucyBiYXNlZCBvbiBpdC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2UgfCB1bmRlZmluZWR9IENsb3NlRXZlbnQge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJTb2NrZXQvY2xvc2VfZXZlbnR9XG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQ0xJRU5UX1NUQVRFLklOSVRJQUxJWkVEIHx8IHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5ESVNDT05ORUNURUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IENMSUVOVF9TVEFURS5ESVNDT05ORUNURUQ7XG4gICAgdGhpcy5zb2NrZXQ/LmNsb3NlKCk7XG4gICAgLy8gTm90aWZ5IGVhY2ggc3Vic2NyaXB0aW9uIGFib3V0IHRoZSBjbG9zZVxuICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mICgwLCBfdmFsdWVzLmRlZmF1bHQpKF9jb250ZXh0MiA9IHRoaXMuc3Vic2NyaXB0aW9ucykuY2FsbChfY29udGV4dDIpKSB7XG4gICAgICB2YXIgX2NvbnRleHQyO1xuICAgICAgc3Vic2NyaXB0aW9uLnN1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIHN1YnNjcmlwdGlvbi5lbWl0KFNVQlNDUklQVElPTl9FTU1JVEVSX1RZUEVTLkNMT1NFKTtcbiAgICB9XG4gICAgdGhpcy5faGFuZGxlUmVzZXQoKTtcbiAgICB0aGlzLmVtaXQoQ0xJRU5UX0VNTUlURVJfVFlQRVMuQ0xPU0UpO1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8uY2xvc2luZ1Byb21pc2U7XG4gIH1cblxuICAvLyBlbnN1cmUgd2Ugc3RhcnQgd2l0aCB2YWxpZCBzdGF0ZSBpZiBjb25uZWN0IGlzIGNhbGxlZCBhZ2FpbiBhZnRlciBjbG9zZVxuICBfaGFuZGxlUmVzZXQoKSB7XG4gICAgdGhpcy5hdHRlbXB0cyA9IDE7XG4gICAgdGhpcy5pZCA9IDA7XG4gICAgdGhpcy5yZXF1ZXN0SWQgPSAxO1xuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IG5ldyBfbWFwLmRlZmF1bHQoKTtcbiAgfVxuICBfaGFuZGxlV2ViU29ja2V0T3BlbigpIHtcbiAgICBjb25zdCBjb25uZWN0UmVxdWVzdCA9IHtcbiAgICAgIG9wOiBPUF9UWVBFUy5DT05ORUNULFxuICAgICAgYXBwbGljYXRpb25JZDogdGhpcy5hcHBsaWNhdGlvbklkLFxuICAgICAgamF2YXNjcmlwdEtleTogdGhpcy5qYXZhc2NyaXB0S2V5LFxuICAgICAgbWFzdGVyS2V5OiB0aGlzLm1hc3RlcktleSxcbiAgICAgIHNlc3Npb25Ub2tlbjogdGhpcy5zZXNzaW9uVG9rZW4sXG4gICAgICBpbnN0YWxsYXRpb25JZDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBpZiAodGhpcy5hZGRpdGlvbmFsUHJvcGVydGllcykge1xuICAgICAgY29ubmVjdFJlcXVlc3QuaW5zdGFsbGF0aW9uSWQgPSB0aGlzLmluc3RhbGxhdGlvbklkO1xuICAgIH1cbiAgICB0aGlzLnNvY2tldC5zZW5kKCgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKGNvbm5lY3RSZXF1ZXN0KSk7XG4gIH1cbiAgX2hhbmRsZVdlYlNvY2tldE1lc3NhZ2UoZXZlbnQpIHtcbiAgICBsZXQgZGF0YSA9IGV2ZW50LmRhdGE7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgfVxuICAgIGxldCBzdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIGlmIChkYXRhLnJlcXVlc3RJZCkge1xuICAgICAgc3Vic2NyaXB0aW9uID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChkYXRhLnJlcXVlc3RJZCkgfHwgbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICBjbGllbnRJZDogZGF0YS5jbGllbnRJZCxcbiAgICAgIGluc3RhbGxhdGlvbklkOiBkYXRhLmluc3RhbGxhdGlvbklkXG4gICAgfTtcbiAgICBzd2l0Y2ggKGRhdGEub3ApIHtcbiAgICAgIGNhc2UgT1BfRVZFTlRTLkNPTk5FQ1RFRDpcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IENMSUVOVF9TVEFURS5SRUNPTk5FQ1RJTkcpIHtcbiAgICAgICAgICB0aGlzLnJlc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KENMSUVOVF9FTU1JVEVSX1RZUEVTLk9QRU4pO1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5jbGllbnRJZDtcbiAgICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBDTElFTlRfU1RBVEUuQ09OTkVDVEVEO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT1BfRVZFTlRTLlNVQlNDUklCRUQ6XG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICB0aGlzLmF0dGVtcHRzID0gMTtcbiAgICAgICAgICBzdWJzY3JpcHRpb24uc3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uLnN1YnNjcmliZVByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICgwLCBfc2V0VGltZW91dDIuZGVmYXVsdCkoKCkgPT4gc3Vic2NyaXB0aW9uLmVtaXQoU1VCU0NSSVBUSU9OX0VNTUlURVJfVFlQRVMuT1BFTiwgcmVzcG9uc2UpLCAyMDApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPUF9FVkVOVFMuRVJST1I6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBwYXJzZUVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoZGF0YS5jb2RlLCBkYXRhLmVycm9yKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdFByb21pc2UucmVqZWN0KHBhcnNlRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENMSUVOVF9TVEFURS5ESVNDT05ORUNURUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkYXRhLnJlcXVlc3RJZCkge1xuICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uc3Vic2NyaWJlUHJvbWlzZS5yZWplY3QocGFyc2VFcnJvcik7XG4gICAgICAgICAgICAgICgwLCBfc2V0VGltZW91dDIuZGVmYXVsdCkoKCkgPT4gc3Vic2NyaXB0aW9uLmVtaXQoU1VCU0NSSVBUSU9OX0VNTUlURVJfVFlQRVMuRVJST1IsIGRhdGEuZXJyb3IpLCAyMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoQ0xJRU5UX0VNTUlURVJfVFlQRVMuRVJST1IsIGRhdGEuZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGF0YS5lcnJvciA9PT0gJ0FkZGl0aW9uYWwgcHJvcGVydGllcyBub3QgYWxsb3dlZCcpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRhdGEucmVjb25uZWN0KSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVSZWNvbm5lY3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgT1BfRVZFTlRTLlVOU1VCU0NSSUJFRDpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoZGF0YS5yZXF1ZXN0SWQpO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnN1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZVByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIGNyZWF0ZSwgdXBkYXRlLCBlbnRlciwgbGVhdmUsIGRlbGV0ZSBjYXNlc1xuICAgICAgICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IG92ZXJyaWRlID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGRhdGEub3JpZ2luYWwpIHtcbiAgICAgICAgICAgIG92ZXJyaWRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhLm9yaWdpbmFsLl9fdHlwZTtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciByZW1vdmVkIGZpZWxkc1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBkYXRhLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICAgIGlmICghKGZpZWxkIGluIGRhdGEub2JqZWN0KSkge1xuICAgICAgICAgICAgICAgIGRhdGEub2JqZWN0W2ZpZWxkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YS5vcmlnaW5hbCA9IF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKGRhdGEub3JpZ2luYWwsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGRhdGEub2JqZWN0Ll9fdHlwZTtcbiAgICAgICAgICBjb25zdCBwYXJzZU9iamVjdCA9IF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKGRhdGEub2JqZWN0LCAhKHN1YnNjcmlwdGlvbi5xdWVyeSAmJiBzdWJzY3JpcHRpb24ucXVlcnkuX3NlbGVjdCkgPyBvdmVycmlkZSA6IGZhbHNlKTtcbiAgICAgICAgICBpZiAoZGF0YS5vcmlnaW5hbCkge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmVtaXQoZGF0YS5vcCwgcGFyc2VPYmplY3QsIGRhdGEub3JpZ2luYWwsIHJlc3BvbnNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmVtaXQoZGF0YS5vcCwgcGFyc2VPYmplY3QsIHJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgICAgICAgIGlmIChvdmVycmlkZSAmJiBsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIGxvY2FsRGF0YXN0b3JlLl91cGRhdGVPYmplY3RJZlBpbm5lZChwYXJzZU9iamVjdCkudGhlbigoKSA9PiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG4gIF9oYW5kbGVXZWJTb2NrZXRDbG9zZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gQ0xJRU5UX1NUQVRFLkRJU0NPTk5FQ1RFRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gQ0xJRU5UX1NUQVRFLkNMT1NFRDtcbiAgICB0aGlzLmVtaXQoQ0xJRU5UX0VNTUlURVJfVFlQRVMuQ0xPU0UpO1xuICAgIC8vIE5vdGlmeSBlYWNoIHN1YnNjcmlwdGlvbiBhYm91dCB0aGUgY2xvc2VcbiAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiAoMCwgX3ZhbHVlcy5kZWZhdWx0KShfY29udGV4dDMgPSB0aGlzLnN1YnNjcmlwdGlvbnMpLmNhbGwoX2NvbnRleHQzKSkge1xuICAgICAgdmFyIF9jb250ZXh0MztcbiAgICAgIHN1YnNjcmlwdGlvbi5lbWl0KFNVQlNDUklQVElPTl9FTU1JVEVSX1RZUEVTLkNMT1NFKTtcbiAgICB9XG4gICAgdGhpcy5faGFuZGxlUmVjb25uZWN0KCk7XG4gIH1cbiAgX2hhbmRsZVdlYlNvY2tldEVycm9yKGVycm9yKSB7XG4gICAgdGhpcy5lbWl0KENMSUVOVF9FTU1JVEVSX1RZUEVTLkVSUk9SLCBlcnJvcik7XG4gICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgKDAsIF92YWx1ZXMuZGVmYXVsdCkoX2NvbnRleHQ0ID0gdGhpcy5zdWJzY3JpcHRpb25zKS5jYWxsKF9jb250ZXh0NCkpIHtcbiAgICAgIHZhciBfY29udGV4dDQ7XG4gICAgICBzdWJzY3JpcHRpb24uZW1pdChTVUJTQ1JJUFRJT05fRU1NSVRFUl9UWVBFUy5FUlJPUiwgZXJyb3IpO1xuICAgIH1cbiAgICB0aGlzLl9oYW5kbGVSZWNvbm5lY3QoKTtcbiAgfVxuICBfaGFuZGxlUmVjb25uZWN0KCkge1xuICAgIHZhciBfY29udGV4dDU7XG4gICAgLy8gaWYgY2xvc2VkIG9yIGN1cnJlbnRseSByZWNvbm5lY3Rpbmcgd2Ugc3RvcCBhdHRlbXB0aW5nIHRvIHJlY29ubmVjdFxuICAgIGlmICh0aGlzLnN0YXRlID09PSBDTElFTlRfU1RBVEUuRElTQ09OTkVDVEVEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSBDTElFTlRfU1RBVEUuUkVDT05ORUNUSU5HO1xuICAgIGNvbnN0IHRpbWUgPSBnZW5lcmF0ZUludGVydmFsKHRoaXMuYXR0ZW1wdHMpO1xuXG4gICAgLy8gaGFuZGxlIGNhc2Ugd2hlbiBib3RoIGNsb3NlL2Vycm9yIG9jY3VyIGF0IGZyZXF1ZW50IHJhdGVzIHdlIGVuc3VyZSB3ZSBkbyBub3QgcmVjb25uZWN0IHVubmVjZXNzYXJpbHkuXG4gICAgLy8gd2UncmUgdW5hYmxlIHRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBiZXR3ZWVuIGNsb3NlL2Vycm9yIHdoZW4gd2UncmUgdW5hYmxlIHRvIHJlY29ubmVjdCB0aGVyZWZvcmVcbiAgICAvLyB3ZSB0cnkgdG8gcmVjb25uZWN0IGluIGJvdGggY2FzZXNcbiAgICAvLyBzZXJ2ZXIgc2lkZSB3cyBhbmQgYnJvd3NlciBXZWJTb2NrZXQgYmVoYXZlIGRpZmZlcmVudGx5IGluIHdoZW4gY2xvc2UvZXJyb3IgZ2V0IHRyaWdnZXJlZFxuICAgIGlmICh0aGlzLnJlY29ubmVjdEhhbmRsZSkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0SGFuZGxlKTtcbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RIYW5kbGUgPSAoMCwgX3NldFRpbWVvdXQyLmRlZmF1bHQpKCgwLCBfYmluZC5kZWZhdWx0KShfY29udGV4dDUgPSAoKSA9PiB7XG4gICAgICB0aGlzLmF0dGVtcHRzKys7XG4gICAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH0pLmNhbGwoX2NvbnRleHQ1LCB0aGlzKSwgdGltZSk7XG4gIH1cbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IExpdmVRdWVyeUNsaWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9wcm9taXNlVXRpbHMgPSByZXF1aXJlKFwiLi9wcm9taXNlVXRpbHNcIik7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgTGl2ZVF1ZXJ5IFN1YnNjcmlwdGlvbi5cbiAqIDxhIGhyZWY9XCJodHRwczovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sI2V2ZW50c19jbGFzc19ldmVudGVtaXR0ZXJcIj5jbG91ZCBmdW5jdGlvbnM8L2E+LlxuICpcbiAqIDxwPlJlc3BvbnNlIE9iamVjdCAtIENvbnRhaW5zIGRhdGEgZnJvbSB0aGUgY2xpZW50IHRoYXQgbWFkZSB0aGUgcmVxdWVzdFxuICogPHVsPlxuICogPGxpPmNsaWVudElkPC9saT5cbiAqIDxsaT5pbnN0YWxsYXRpb25JZCAtIHJlcXVpcmVzIFBhcnNlIFNlcnZlciA0LjAuMCs8L2xpPlxuICogPC91bD5cbiAqIDwvcD5cbiAqXG4gKiA8cD5PcGVuIEV2ZW50IC0gV2hlbiB5b3UgY2FsbCBxdWVyeS5zdWJzY3JpYmUoKSwgd2Ugc2VuZCBhIHN1YnNjcmliZSByZXF1ZXN0IHRvXG4gKiB0aGUgTGl2ZVF1ZXJ5IHNlcnZlciwgd2hlbiB3ZSBnZXQgdGhlIGNvbmZpcm1hdGlvbiBmcm9tIHRoZSBMaXZlUXVlcnkgc2VydmVyLFxuICogdGhpcyBldmVudCB3aWxsIGJlIGVtaXR0ZWQuIFdoZW4gdGhlIGNsaWVudCBsb3NlcyBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGVcbiAqIExpdmVRdWVyeSBzZXJ2ZXIsIHdlIHdpbGwgdHJ5IHRvIGF1dG8gcmVjb25uZWN0IHRoZSBMaXZlUXVlcnkgc2VydmVyLiBJZiB3ZVxuICogcmVjb25uZWN0IHRoZSBMaXZlUXVlcnkgc2VydmVyIGFuZCBzdWNjZXNzZnVsbHkgcmVzdWJzY3JpYmUgdGhlIFBhcnNlUXVlcnksXG4gKiB5b3UnbGwgYWxzbyBnZXQgdGhpcyBldmVudC5cbiAqXG4gKiA8cHJlPlxuICogc3Vic2NyaXB0aW9uLm9uKCdvcGVuJywgKHJlc3BvbnNlKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIDxwPkNyZWF0ZSBFdmVudCAtIFdoZW4gYSBuZXcgUGFyc2VPYmplY3QgaXMgY3JlYXRlZCBhbmQgaXQgZnVsZmlsbHMgdGhlIFBhcnNlUXVlcnkgeW91IHN1YnNjcmliZSxcbiAqIHlvdSdsbCBnZXQgdGhpcyBldmVudC4gVGhlIG9iamVjdCBpcyB0aGUgUGFyc2VPYmplY3Qgd2hpY2ggaXMgY3JlYXRlZC5cbiAqXG4gKiA8cHJlPlxuICogc3Vic2NyaXB0aW9uLm9uKCdjcmVhdGUnLCAob2JqZWN0LCByZXNwb25zZSkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiA8cD5VcGRhdGUgRXZlbnQgLSBXaGVuIGFuIGV4aXN0aW5nIFBhcnNlT2JqZWN0IChvcmlnaW5hbCkgd2hpY2ggZnVsZmlsbHMgdGhlIFBhcnNlUXVlcnkgeW91IHN1YnNjcmliZVxuICogaXMgdXBkYXRlZCAoVGhlIFBhcnNlT2JqZWN0IGZ1bGZpbGxzIHRoZSBQYXJzZVF1ZXJ5IGJlZm9yZSBhbmQgYWZ0ZXIgY2hhbmdlcyksXG4gKiB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuIFRoZSBvYmplY3QgaXMgdGhlIFBhcnNlT2JqZWN0IHdoaWNoIGlzIHVwZGF0ZWQuXG4gKiBJdHMgY29udGVudCBpcyB0aGUgbGF0ZXN0IHZhbHVlIG9mIHRoZSBQYXJzZU9iamVjdC5cbiAqXG4gKiBQYXJzZS1TZXJ2ZXIgMy4xLjMrIFJlcXVpcmVkIGZvciBvcmlnaW5hbCBvYmplY3QgcGFyYW1ldGVyXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbigndXBkYXRlJywgKG9iamVjdCwgb3JpZ2luYWwsIHJlc3BvbnNlKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIDxwPkVudGVyIEV2ZW50IC0gV2hlbiBhbiBleGlzdGluZyBQYXJzZU9iamVjdCdzIChvcmlnaW5hbCkgb2xkIHZhbHVlIGRvZXNuJ3QgZnVsZmlsbCB0aGUgUGFyc2VRdWVyeVxuICogYnV0IGl0cyBuZXcgdmFsdWUgZnVsZmlsbHMgdGhlIFBhcnNlUXVlcnksIHlvdSdsbCBnZXQgdGhpcyBldmVudC4gVGhlIG9iamVjdCBpcyB0aGVcbiAqIFBhcnNlT2JqZWN0IHdoaWNoIGVudGVycyB0aGUgUGFyc2VRdWVyeS4gSXRzIGNvbnRlbnQgaXMgdGhlIGxhdGVzdCB2YWx1ZSBvZiB0aGUgUGFyc2VPYmplY3QuXG4gKlxuICogUGFyc2UtU2VydmVyIDMuMS4zKyBSZXF1aXJlZCBmb3Igb3JpZ2luYWwgb2JqZWN0IHBhcmFtZXRlclxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ2VudGVyJywgKG9iamVjdCwgb3JpZ2luYWwsIHJlc3BvbnNlKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqXG4gKiA8cD5VcGRhdGUgRXZlbnQgLSBXaGVuIGFuIGV4aXN0aW5nIFBhcnNlT2JqZWN0J3Mgb2xkIHZhbHVlIGZ1bGZpbGxzIHRoZSBQYXJzZVF1ZXJ5IGJ1dCBpdHMgbmV3IHZhbHVlXG4gKiBkb2Vzbid0IGZ1bGZpbGwgdGhlIFBhcnNlUXVlcnksIHlvdSdsbCBnZXQgdGhpcyBldmVudC4gVGhlIG9iamVjdCBpcyB0aGUgUGFyc2VPYmplY3RcbiAqIHdoaWNoIGxlYXZlcyB0aGUgUGFyc2VRdWVyeS4gSXRzIGNvbnRlbnQgaXMgdGhlIGxhdGVzdCB2YWx1ZSBvZiB0aGUgUGFyc2VPYmplY3QuXG4gKlxuICogPHByZT5cbiAqIHN1YnNjcmlwdGlvbi5vbignbGVhdmUnLCAob2JqZWN0LCByZXNwb25zZSkgPT4ge1xuICpcbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKlxuICogPHA+RGVsZXRlIEV2ZW50IC0gV2hlbiBhbiBleGlzdGluZyBQYXJzZU9iamVjdCB3aGljaCBmdWxmaWxscyB0aGUgUGFyc2VRdWVyeSBpcyBkZWxldGVkLCB5b3UnbGxcbiAqIGdldCB0aGlzIGV2ZW50LiBUaGUgb2JqZWN0IGlzIHRoZSBQYXJzZU9iamVjdCB3aGljaCBpcyBkZWxldGVkLlxuICpcbiAqIDxwcmU+XG4gKiBzdWJzY3JpcHRpb24ub24oJ2RlbGV0ZScsIChvYmplY3QsIHJlc3BvbnNlKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqXG4gKiA8cD5DbG9zZSBFdmVudCAtIFdoZW4gdGhlIGNsaWVudCBsb3NlcyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIExpdmVRdWVyeVxuICogc2VydmVyIGFuZCB3ZSBzdG9wIHJlY2VpdmluZyBldmVudHMsIHlvdSdsbCBnZXQgdGhpcyBldmVudC5cbiAqXG4gKiA8cHJlPlxuICogc3Vic2NyaXB0aW9uLm9uKCdjbG9zZScsICgpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKi9cbmNsYXNzIFN1YnNjcmlwdGlvbiB7XG4gIC8qXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIHN1YnNjcmlwdGlvbiBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgLSBxdWVyeSB0byBzdWJzY3JpYmUgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25Ub2tlbiAtIG9wdGlvbmFsIHNlc3Npb24gdG9rZW5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGlkLCBxdWVyeSwgc2Vzc2lvblRva2VuKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImlkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJxdWVyeVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic2Vzc2lvblRva2VuXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJzdWJzY3JpYmVQcm9taXNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJ1bnN1YnNjcmliZVByb21pc2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInN1YnNjcmliZWRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImVtaXR0ZXJcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9uXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJlbWl0XCIsIHZvaWQgMCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcbiAgICB0aGlzLnNlc3Npb25Ub2tlbiA9IHNlc3Npb25Ub2tlbjtcbiAgICB0aGlzLnN1YnNjcmliZVByb21pc2UgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVQcm9taXNlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICB0aGlzLnN1YnNjcmliZWQgPSBmYWxzZTtcbiAgICBjb25zdCBFdmVudEVtaXR0ZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5vbiA9IChldmVudE5hbWUsIGxpc3RlbmVyKSA9PiB0aGlzLmVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGhpcy5lbWl0dGVyLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTtcbiAgICB9O1xuICAgIC8vIGFkZGluZyBsaXN0ZW5lciBzbyBwcm9jZXNzIGRvZXMgbm90IGNyYXNoXG4gICAgLy8gYmVzdCBwcmFjdGljZSBpcyBmb3IgZGV2ZWxvcGVyIHRvIHJlZ2lzdGVyIHRoZWlyIG93biBsaXN0ZW5lclxuICAgIHRoaXMub24oJ2Vycm9yJywgKCkgPT4ge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBzdWJzY3JpcHRpb25cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICB1bnN1YnNjcmliZSgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TGl2ZVF1ZXJ5Q29udHJvbGxlcigpLmdldERlZmF1bHRMaXZlUXVlcnlDbGllbnQoKS50aGVuKGxpdmVRdWVyeUNsaWVudCA9PiB7XG4gICAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gICAgICByZXR1cm4gbGl2ZVF1ZXJ5Q2xpZW50LnVuc3Vic2NyaWJlKHRoaXMpO1xuICAgIH0pO1xuICB9XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdWJzY3JpcHRpb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX3NldCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvc2V0XCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9maWx0ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbHRlclwiKSk7XG52YXIgX2luY2x1ZGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmNsdWRlc1wiKSk7XG52YXIgX3N0YXJ0c1dpdGggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3N0YXJ0cy13aXRoXCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX2NvbmNhdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpKTtcbnZhciBfZnJvbSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvZnJvbVwiKSk7XG52YXIgX2ZpbmQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbmRcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlclwiKSk7XG52YXIgX1BhcnNlUXVlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUXVlcnlcIikpO1xudmFyIF9Mb2NhbERhdGFzdG9yZVV0aWxzID0gcmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVVdGlsc1wiKTtcbi8qKlxuICogUHJvdmlkZXMgYSBsb2NhbCBkYXRhc3RvcmUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uIDxiciAvPlxuICogVG8gZW5hYmxlIHRoaXMgZnVuY3Rpb25hbGl0eSwgY2FsbCA8Y29kZT5QYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpPC9jb2RlPi5cbiAqXG4gKiBQaW4gb2JqZWN0IHRvIGFkZCB0byBsb2NhbCBkYXRhc3RvcmVcbiAqXG4gKiA8cHJlPmF3YWl0IG9iamVjdC5waW4oKTs8L3ByZT5cbiAqIDxwcmU+YXdhaXQgb2JqZWN0LnBpbldpdGhOYW1lKCdwaW5OYW1lJyk7PC9wcmU+XG4gKlxuICogUXVlcnkgcGlubmVkIG9iamVjdHNcbiAqXG4gKiA8cHJlPnF1ZXJ5LmZyb21Mb2NhbERhdGFzdG9yZSgpOzwvcHJlPlxuICogPHByZT5xdWVyeS5mcm9tUGluKCk7PC9wcmU+XG4gKiA8cHJlPnF1ZXJ5LmZyb21QaW5XaXRoTmFtZSgpOzwvcHJlPlxuICpcbiAqIDxwcmU+Y29uc3QgbG9jYWxPYmplY3RzID0gYXdhaXQgcXVlcnkuZmluZCgpOzwvcHJlPlxuICpcbiAqIEBjbGFzcyBQYXJzZS5Mb2NhbERhdGFzdG9yZVxuICogQHN0YXRpY1xuICovXG5jb25zdCBMb2NhbERhdGFzdG9yZSA9IHtcbiAgaXNFbmFibGVkOiBmYWxzZSxcbiAgaXNTeW5jaW5nOiBmYWxzZSxcbiAgZnJvbVBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZnJvbVBpbldpdGhOYW1lKG5hbWUpO1xuICB9LFxuICBhc3luYyBwaW5XaXRoTmFtZShuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5waW5XaXRoTmFtZShuYW1lLCB2YWx1ZSk7XG4gIH0sXG4gIGFzeW5jIHVuUGluV2l0aE5hbWUobmFtZSkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci51blBpbldpdGhOYW1lKG5hbWUpO1xuICB9LFxuICBfZ2V0QWxsQ29udGVudHMoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmdldEFsbENvbnRlbnRzKCk7XG4gIH0sXG4gIC8vIFVzZSBmb3IgdGVzdGluZ1xuICBhc3luYyBfZ2V0UmF3U3RvcmFnZSgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0UmF3U3RvcmFnZSgpO1xuICB9LFxuICBhc3luYyBfY2xlYXIoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmNsZWFyKCk7XG4gIH0sXG4gIC8vIFBpbiB0aGUgb2JqZWN0IGFuZCBjaGlsZHJlbiByZWN1cnNpdmVseVxuICAvLyBTYXZlcyB0aGUgb2JqZWN0IGFuZCBjaGlsZHJlbiBrZXkgdG8gUGluIE5hbWVcbiAgYXN5bmMgX2hhbmRsZVBpbkFsbFdpdGhOYW1lKG5hbWUsIG9iamVjdHMpIHtcbiAgICBjb25zdCBwaW5OYW1lID0gdGhpcy5nZXRQaW5OYW1lKG5hbWUpO1xuICAgIGNvbnN0IHRvUGluUHJvbWlzZXMgPSBbXTtcbiAgICBjb25zdCBvYmplY3RLZXlzID0gW107XG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2Ygb2JqZWN0cykge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRDaGlsZHJlbihwYXJlbnQpO1xuICAgICAgY29uc3QgcGFyZW50S2V5ID0gdGhpcy5nZXRLZXlGb3JPYmplY3QocGFyZW50KTtcbiAgICAgIGNvbnN0IGpzb24gPSBwYXJlbnQuX3RvRnVsbEpTT04odW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgIGlmIChwYXJlbnQuX2xvY2FsSWQpIHtcbiAgICAgICAganNvbi5fbG9jYWxJZCA9IHBhcmVudC5fbG9jYWxJZDtcbiAgICAgIH1cbiAgICAgIGNoaWxkcmVuW3BhcmVudEtleV0gPSBqc29uO1xuICAgICAgZm9yIChjb25zdCBvYmplY3RLZXkgaW4gY2hpbGRyZW4pIHtcbiAgICAgICAgb2JqZWN0S2V5cy5wdXNoKG9iamVjdEtleSk7XG4gICAgICAgIHRvUGluUHJvbWlzZXMucHVzaCh0aGlzLnBpbldpdGhOYW1lKG9iamVjdEtleSwgW2NoaWxkcmVuW29iamVjdEtleV1dKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGZyb21QaW5Qcm9taXNlID0gdGhpcy5mcm9tUGluV2l0aE5hbWUocGluTmFtZSk7XG4gICAgY29uc3QgW3Bpbm5lZF0gPSBhd2FpdCBfcHJvbWlzZS5kZWZhdWx0LmFsbChbZnJvbVBpblByb21pc2UsIHRvUGluUHJvbWlzZXNdKTtcbiAgICBjb25zdCB0b1BpbiA9IFsuLi5uZXcgX3NldC5kZWZhdWx0KFsuLi4ocGlubmVkIHx8IFtdKSwgLi4ub2JqZWN0S2V5c10pXTtcbiAgICByZXR1cm4gdGhpcy5waW5XaXRoTmFtZShwaW5OYW1lLCB0b1Bpbik7XG4gIH0sXG4gIC8vIFJlbW92ZXMgb2JqZWN0IGFuZCBjaGlsZHJlbiBrZXlzIGZyb20gcGluIG5hbWVcbiAgLy8gS2VlcHMgdGhlIG9iamVjdCBhbmQgY2hpbGRyZW4gcGlubmVkXG4gIGFzeW5jIF9oYW5kbGVVblBpbkFsbFdpdGhOYW1lKG5hbWUsIG9iamVjdHMpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IGF3YWl0IHRoaXMuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgY29uc3QgcGluTmFtZSA9IHRoaXMuZ2V0UGluTmFtZShuYW1lKTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGxldCBvYmplY3RLZXlzID0gW107XG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2Ygb2JqZWN0cykge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRDaGlsZHJlbihwYXJlbnQpO1xuICAgICAgY29uc3QgcGFyZW50S2V5ID0gdGhpcy5nZXRLZXlGb3JPYmplY3QocGFyZW50KTtcbiAgICAgIG9iamVjdEtleXMucHVzaChwYXJlbnRLZXksIC4uLigwLCBfa2V5cy5kZWZhdWx0KShjaGlsZHJlbikpO1xuICAgIH1cbiAgICBvYmplY3RLZXlzID0gWy4uLm5ldyBfc2V0LmRlZmF1bHQob2JqZWN0S2V5cyldO1xuICAgIGxldCBwaW5uZWQgPSBsb2NhbERhdGFzdG9yZVtwaW5OYW1lXSB8fCBbXTtcbiAgICBwaW5uZWQgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShwaW5uZWQpLmNhbGwocGlubmVkLCBpdGVtID0+ICEoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKG9iamVjdEtleXMpLmNhbGwob2JqZWN0S2V5cywgaXRlbSkpO1xuICAgIGlmIChwaW5uZWQubGVuZ3RoID09IDApIHtcbiAgICAgIHByb21pc2VzLnB1c2godGhpcy51blBpbldpdGhOYW1lKHBpbk5hbWUpKTtcbiAgICAgIGRlbGV0ZSBsb2NhbERhdGFzdG9yZVtwaW5OYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnBpbldpdGhOYW1lKHBpbk5hbWUsIHBpbm5lZCkpO1xuICAgICAgbG9jYWxEYXRhc3RvcmVbcGluTmFtZV0gPSBwaW5uZWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb2JqZWN0S2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICAgIGxldCBoYXNSZWZlcmVuY2UgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsRGF0YXN0b3JlKSB7XG4gICAgICAgIGlmIChrZXkgPT09IF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOIHx8ICgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCBfTG9jYWxEYXRhc3RvcmVVdGlscy5QSU5fUFJFRklYKSkge1xuICAgICAgICAgIGNvbnN0IHBpbm5lZE9iamVjdHMgPSBsb2NhbERhdGFzdG9yZVtrZXldIHx8IFtdO1xuICAgICAgICAgIGlmICgoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKHBpbm5lZE9iamVjdHMpLmNhbGwocGlubmVkT2JqZWN0cywgb2JqZWN0S2V5KSkge1xuICAgICAgICAgICAgaGFzUmVmZXJlbmNlID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFoYXNSZWZlcmVuY2UpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnVuUGluV2l0aE5hbWUob2JqZWN0S2V5KSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LmFsbChwcm9taXNlcyk7XG4gIH0sXG4gIC8vIFJldHJpZXZlIGFsbCBwb2ludGVyIGZpZWxkcyBmcm9tIG9iamVjdCByZWN1cnNpdmVseVxuICBfZ2V0Q2hpbGRyZW4ob2JqZWN0KSB7XG4gICAgY29uc3QgZW5jb3VudGVyZWQgPSB7fTtcbiAgICBjb25zdCBqc29uID0gb2JqZWN0Ll90b0Z1bGxKU09OKHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4ganNvbikge1xuICAgICAgaWYgKGpzb25ba2V5XSAmJiBqc29uW2tleV0uX190eXBlICYmIGpzb25ba2V5XS5fX3R5cGUgPT09ICdPYmplY3QnKSB7XG4gICAgICAgIHRoaXMuX3RyYXZlcnNlKGpzb25ba2V5XSwgZW5jb3VudGVyZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW5jb3VudGVyZWQ7XG4gIH0sXG4gIF90cmF2ZXJzZShvYmplY3QsIGVuY291bnRlcmVkKSB7XG4gICAgaWYgKCFvYmplY3Qub2JqZWN0SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb2JqZWN0S2V5ID0gdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0KTtcbiAgICAgIGlmIChlbmNvdW50ZXJlZFtvYmplY3RLZXldKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVuY291bnRlcmVkW29iamVjdEtleV0gPSBvYmplY3Q7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgbGV0IGpzb24gPSBvYmplY3Rba2V5XTtcbiAgICAgIGlmICghb2JqZWN0W2tleV0pIHtcbiAgICAgICAganNvbiA9IG9iamVjdDtcbiAgICAgIH1cbiAgICAgIGlmIChqc29uLl9fdHlwZSAmJiBqc29uLl9fdHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICAgICAgdGhpcy5fdHJhdmVyc2UoanNvbiwgZW5jb3VudGVyZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gVHJhbnNmb3JtIGtleXMgaW4gcGluIG5hbWUgdG8gb2JqZWN0c1xuICBhc3luYyBfc2VyaWFsaXplT2JqZWN0c0Zyb21QaW5OYW1lKG5hbWUpIHtcbiAgICB2YXIgX2NvbnRleHQ7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBhd2FpdCB0aGlzLl9nZXRBbGxDb250ZW50cygpO1xuICAgIGNvbnN0IGFsbE9iamVjdHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbERhdGFzdG9yZSkge1xuICAgICAgaWYgKCgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCBfTG9jYWxEYXRhc3RvcmVVdGlscy5PQkpFQ1RfUFJFRklYKSkge1xuICAgICAgICBhbGxPYmplY3RzLnB1c2gobG9jYWxEYXRhc3RvcmVba2V5XVswXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghbmFtZSkge1xuICAgICAgcmV0dXJuIGFsbE9iamVjdHM7XG4gICAgfVxuICAgIGNvbnN0IHBpbk5hbWUgPSB0aGlzLmdldFBpbk5hbWUobmFtZSk7XG4gICAgY29uc3QgcGlubmVkID0gbG9jYWxEYXRhc3RvcmVbcGluTmFtZV07XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkocGlubmVkKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlcyA9ICgwLCBfbWFwLmRlZmF1bHQpKHBpbm5lZCkuY2FsbChwaW5uZWQsIG9iamVjdEtleSA9PiB0aGlzLmZyb21QaW5XaXRoTmFtZShvYmplY3RLZXkpKTtcbiAgICBsZXQgb2JqZWN0cyA9IGF3YWl0IF9wcm9taXNlLmRlZmF1bHQuYWxsKHByb21pc2VzKTtcbiAgICBvYmplY3RzID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQgPSBbXSkuY2FsbChfY29udGV4dCwgLi4ub2JqZWN0cyk7XG4gICAgcmV0dXJuICgwLCBfZmlsdGVyLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgb2JqZWN0ID0+IG9iamVjdCAhPSBudWxsKTtcbiAgfSxcbiAgLy8gUmVwbGFjZXMgb2JqZWN0IHBvaW50ZXJzIHdpdGggcGlubmVkIHBvaW50ZXJzXG4gIC8vIFRoZSBvYmplY3QgcG9pbnRlcnMgbWF5IGNvbnRhaW4gb2xkIGRhdGFcbiAgLy8gVXNlcyBCcmVhZHRoIEZpcnN0IFNlYXJjaCBBbGdvcml0aG1cbiAgYXN5bmMgX3NlcmlhbGl6ZU9iamVjdChvYmplY3RLZXksIGxvY2FsRGF0YXN0b3JlKSB7XG4gICAgbGV0IExEUyA9IGxvY2FsRGF0YXN0b3JlO1xuICAgIGlmICghTERTKSB7XG4gICAgICBMRFMgPSBhd2FpdCB0aGlzLl9nZXRBbGxDb250ZW50cygpO1xuICAgIH1cbiAgICBpZiAoIUxEU1tvYmplY3RLZXldIHx8IExEU1tvYmplY3RLZXldLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJvb3QgPSBMRFNbb2JqZWN0S2V5XVswXTtcbiAgICBjb25zdCBxdWV1ZSA9IFtdO1xuICAgIGNvbnN0IG1ldGEgPSB7fTtcbiAgICBsZXQgdW5pcXVlSWQgPSAwO1xuICAgIG1ldGFbdW5pcXVlSWRdID0gcm9vdDtcbiAgICBxdWV1ZS5wdXNoKHVuaXF1ZUlkKTtcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjb25zdCBub2RlSWQgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgY29uc3Qgc3ViVHJlZVJvb3QgPSBtZXRhW25vZGVJZF07XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHN1YlRyZWVSb290KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3ViVHJlZVJvb3RbZmllbGRdO1xuICAgICAgICBpZiAodmFsdWUuX190eXBlICYmIHZhbHVlLl9fdHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleUZvck9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKExEU1trZXldICYmIExEU1trZXldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ZXIgPSBMRFNba2V5XVswXTtcbiAgICAgICAgICAgIHVuaXF1ZUlkKys7XG4gICAgICAgICAgICBtZXRhW3VuaXF1ZUlkXSA9IHBvaW50ZXI7XG4gICAgICAgICAgICBzdWJUcmVlUm9vdFtmaWVsZF0gPSBwb2ludGVyO1xuICAgICAgICAgICAgcXVldWUucHVzaCh1bmlxdWVJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9LFxuICAvLyBDYWxsZWQgd2hlbiBhbiBvYmplY3QgaXMgc2F2ZSAvIGZldGNoZWRcbiAgLy8gVXBkYXRlIG9iamVjdCBwaW4gdmFsdWVcbiAgYXN5bmMgX3VwZGF0ZU9iamVjdElmUGlubmVkKG9iamVjdCkge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0KTtcbiAgICBjb25zdCBwaW5uZWQgPSBhd2FpdCB0aGlzLmZyb21QaW5XaXRoTmFtZShvYmplY3RLZXkpO1xuICAgIGlmICghcGlubmVkIHx8IHBpbm5lZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGluV2l0aE5hbWUob2JqZWN0S2V5LCBbb2JqZWN0Ll90b0Z1bGxKU09OKCldKTtcbiAgfSxcbiAgLy8gQ2FsbGVkIHdoZW4gb2JqZWN0IGlzIGRlc3Ryb3llZFxuICAvLyBVbnBpbiBvYmplY3QgYW5kIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyBmcm9tIHBpbiBuYW1lc1xuICAvLyBUT0RPOiBEZXN0cm95IGNoaWxkcmVuP1xuICBhc3luYyBfZGVzdHJveU9iamVjdElmUGlubmVkKG9iamVjdCkge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBhd2FpdCB0aGlzLl9nZXRBbGxDb250ZW50cygpO1xuICAgIGNvbnN0IG9iamVjdEtleSA9IHRoaXMuZ2V0S2V5Rm9yT2JqZWN0KG9iamVjdCk7XG4gICAgY29uc3QgcGluID0gbG9jYWxEYXRhc3RvcmVbb2JqZWN0S2V5XTtcbiAgICBpZiAoIXBpbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlcyA9IFt0aGlzLnVuUGluV2l0aE5hbWUob2JqZWN0S2V5KV07XG4gICAgZGVsZXRlIGxvY2FsRGF0YXN0b3JlW29iamVjdEtleV07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgIGlmIChrZXkgPT09IF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOIHx8ICgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCBfTG9jYWxEYXRhc3RvcmVVdGlscy5QSU5fUFJFRklYKSkge1xuICAgICAgICBsZXQgcGlubmVkID0gbG9jYWxEYXRhc3RvcmVba2V5XSB8fCBbXTtcbiAgICAgICAgaWYgKCgwLCBfaW5jbHVkZXMuZGVmYXVsdCkocGlubmVkKS5jYWxsKHBpbm5lZCwgb2JqZWN0S2V5KSkge1xuICAgICAgICAgIHBpbm5lZCA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKHBpbm5lZCkuY2FsbChwaW5uZWQsIGl0ZW0gPT4gaXRlbSAhPT0gb2JqZWN0S2V5KTtcbiAgICAgICAgICBpZiAocGlubmVkLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMudW5QaW5XaXRoTmFtZShrZXkpKTtcbiAgICAgICAgICAgIGRlbGV0ZSBsb2NhbERhdGFzdG9yZVtrZXldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMucGluV2l0aE5hbWUoa2V5LCBwaW5uZWQpKTtcbiAgICAgICAgICAgIGxvY2FsRGF0YXN0b3JlW2tleV0gPSBwaW5uZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LmFsbChwcm9taXNlcyk7XG4gIH0sXG4gIC8vIFVwZGF0ZSBwaW4gYW5kIHJlZmVyZW5jZXMgb2YgdGhlIHVuc2F2ZWQgb2JqZWN0XG4gIGFzeW5jIF91cGRhdGVMb2NhbElkRm9yT2JqZWN0KGxvY2FsSWQsIG9iamVjdCkge1xuICAgIGlmICghdGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbG9jYWxLZXkgPSBgJHtfTG9jYWxEYXRhc3RvcmVVdGlscy5PQkpFQ1RfUFJFRklYfSR7b2JqZWN0LmNsYXNzTmFtZX1fJHtsb2NhbElkfWA7XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0KTtcbiAgICBjb25zdCB1bnNhdmVkID0gYXdhaXQgdGhpcy5mcm9tUGluV2l0aE5hbWUobG9jYWxLZXkpO1xuICAgIGlmICghdW5zYXZlZCB8fCB1bnNhdmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlcyA9IFt0aGlzLnVuUGluV2l0aE5hbWUobG9jYWxLZXkpLCB0aGlzLnBpbldpdGhOYW1lKG9iamVjdEtleSwgdW5zYXZlZCldO1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gYXdhaXQgdGhpcy5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsb2NhbERhdGFzdG9yZSkge1xuICAgICAgaWYgKGtleSA9PT0gX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4gfHwgKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIF9Mb2NhbERhdGFzdG9yZVV0aWxzLlBJTl9QUkVGSVgpKSB7XG4gICAgICAgIGxldCBwaW5uZWQgPSBsb2NhbERhdGFzdG9yZVtrZXldIHx8IFtdO1xuICAgICAgICBpZiAoKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShwaW5uZWQpLmNhbGwocGlubmVkLCBsb2NhbEtleSkpIHtcbiAgICAgICAgICBwaW5uZWQgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShwaW5uZWQpLmNhbGwocGlubmVkLCBpdGVtID0+IGl0ZW0gIT09IGxvY2FsS2V5KTtcbiAgICAgICAgICBwaW5uZWQucHVzaChvYmplY3RLZXkpO1xuICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5waW5XaXRoTmFtZShrZXksIHBpbm5lZCkpO1xuICAgICAgICAgIGxvY2FsRGF0YXN0b3JlW2tleV0gPSBwaW5uZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQuYWxsKHByb21pc2VzKTtcbiAgfSxcbiAgLyoqXG4gICAqIFVwZGF0ZXMgTG9jYWwgRGF0YXN0b3JlIGZyb20gU2VydmVyXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLkxvY2FsRGF0YXN0b3JlLnVwZGF0ZUZyb21TZXJ2ZXIoKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBmdW5jdGlvbiB1cGRhdGVGcm9tU2VydmVyXG4gICAqIEBuYW1lIFBhcnNlLkxvY2FsRGF0YXN0b3JlLnVwZGF0ZUZyb21TZXJ2ZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlRnJvbVNlcnZlcigpIHtcbiAgICB2YXIgX2NvbnRleHQyO1xuICAgIGlmICghdGhpcy5jaGVja0lmRW5hYmxlZCgpIHx8IHRoaXMuaXNTeW5jaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gYXdhaXQgdGhpcy5fZ2V0QWxsQ29udGVudHMoKTtcbiAgICBjb25zdCBrZXlzID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9jYWxEYXRhc3RvcmUpIHtcbiAgICAgIGlmICgoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoa2V5KS5jYWxsKGtleSwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuT0JKRUNUX1BSRUZJWCkpIHtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzU3luY2luZyA9IHRydWU7XG4gICAgY29uc3QgcG9pbnRlcnNIYXNoID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgLy8gSWdub3JlIHRoZSBPQkpFQ1RfUFJFRklYXG4gICAgICBsZXQgWywsIGNsYXNzTmFtZSwgb2JqZWN0SWRdID0ga2V5LnNwbGl0KCdfJyk7XG5cbiAgICAgIC8vIFVzZXIga2V5IGlzIHNwbGl0IGludG8gWyAnUGFyc2UnLCAnTERTJywgJycsICdVc2VyJywgJ29iamVjdElkJyBdXG4gICAgICBpZiAoa2V5LnNwbGl0KCdfJykubGVuZ3RoID09PSA1ICYmIGtleS5zcGxpdCgnXycpWzNdID09PSAnVXNlcicpIHtcbiAgICAgICAgY2xhc3NOYW1lID0gJ19Vc2VyJztcbiAgICAgICAgb2JqZWN0SWQgPSBrZXkuc3BsaXQoJ18nKVs0XTtcbiAgICAgIH1cbiAgICAgIGlmICgoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkob2JqZWN0SWQpLmNhbGwob2JqZWN0SWQsICdsb2NhbCcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEoY2xhc3NOYW1lIGluIHBvaW50ZXJzSGFzaCkpIHtcbiAgICAgICAgcG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0gPSBuZXcgX3NldC5kZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICBwb2ludGVyc0hhc2hbY2xhc3NOYW1lXS5hZGQob2JqZWN0SWQpO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVByb21pc2VzID0gKDAsIF9tYXAuZGVmYXVsdCkoX2NvbnRleHQyID0gKDAsIF9rZXlzLmRlZmF1bHQpKHBvaW50ZXJzSGFzaCkpLmNhbGwoX2NvbnRleHQyLCBjbGFzc05hbWUgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0SWRzID0gKDAsIF9mcm9tLmRlZmF1bHQpKHBvaW50ZXJzSGFzaFtjbGFzc05hbWVdKTtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IF9QYXJzZVF1ZXJ5LmRlZmF1bHQoY2xhc3NOYW1lKTtcbiAgICAgIHF1ZXJ5LmxpbWl0KG9iamVjdElkcy5sZW5ndGgpO1xuICAgICAgaWYgKG9iamVjdElkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcXVlcnkuZXF1YWxUbygnb2JqZWN0SWQnLCBvYmplY3RJZHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkuY29udGFpbmVkSW4oJ29iamVjdElkJywgb2JqZWN0SWRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoMCwgX2ZpbmQuZGVmYXVsdCkocXVlcnkpLmNhbGwocXVlcnkpO1xuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZXMgPSBhd2FpdCBfcHJvbWlzZS5kZWZhdWx0LmFsbChxdWVyeVByb21pc2VzKTtcbiAgICAgIGNvbnN0IG9iamVjdHMgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShbXSkuYXBwbHkoW10sIHJlc3BvbnNlcyk7XG4gICAgICBjb25zdCBwaW5Qcm9taXNlcyA9ICgwLCBfbWFwLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgb2JqZWN0ID0+IHtcbiAgICAgICAgY29uc3Qgb2JqZWN0S2V5ID0gdGhpcy5nZXRLZXlGb3JPYmplY3Qob2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGluV2l0aE5hbWUob2JqZWN0S2V5LCBvYmplY3QuX3RvRnVsbEpTT04oKSk7XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IF9wcm9taXNlLmRlZmF1bHQuYWxsKHBpblByb21pc2VzKTtcbiAgICAgIHRoaXMuaXNTeW5jaW5nID0gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN5bmNpbmcgTG9jYWxEYXRhc3RvcmU6ICcsIGVycm9yKTtcbiAgICAgIHRoaXMuaXNTeW5jaW5nID0gZmFsc2U7XG4gICAgfVxuICB9LFxuICBnZXRLZXlGb3JPYmplY3Qob2JqZWN0KSB7XG4gICAgY29uc3Qgb2JqZWN0SWQgPSBvYmplY3Qub2JqZWN0SWQgfHwgb2JqZWN0Ll9nZXRJZCgpO1xuICAgIHJldHVybiBgJHtfTG9jYWxEYXRhc3RvcmVVdGlscy5PQkpFQ1RfUFJFRklYfSR7b2JqZWN0LmNsYXNzTmFtZX1fJHtvYmplY3RJZH1gO1xuICB9LFxuICBnZXRQaW5OYW1lKHBpbk5hbWUpIHtcbiAgICBpZiAoIXBpbk5hbWUgfHwgcGluTmFtZSA9PT0gX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4pIHtcbiAgICAgIHJldHVybiBfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTjtcbiAgICB9XG4gICAgcmV0dXJuIF9Mb2NhbERhdGFzdG9yZVV0aWxzLlBJTl9QUkVGSVggKyBwaW5OYW1lO1xuICB9LFxuICBjaGVja0lmRW5hYmxlZCgpIHtcbiAgICBpZiAoIXRoaXMuaXNFbmFibGVkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmlzRW5hYmxlZDtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gTG9jYWxEYXRhc3RvcmU7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBMb2NhbERhdGFzdG9yZTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcihfTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyLmRlZmF1bHQpO1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0TG9jYWxEYXRhc3RvcmUoTG9jYWxEYXRhc3RvcmUpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9yZWR1Y2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3JlZHVjZVwiKSk7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX0xvY2FsRGF0YXN0b3JlVXRpbHMgPSByZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZVV0aWxzXCIpO1xudmFyIF9TdG9yYWdlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlXCIpKTtcbmNvbnN0IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlciA9IHtcbiAgYXN5bmMgZnJvbVBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhuYW1lKTtcbiAgICBpZiAoIXZhbHVlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBvYmplY3RzID0gSlNPTi5wYXJzZSh2YWx1ZXMpO1xuICAgIHJldHVybiBvYmplY3RzO1xuICB9LFxuICBwaW5XaXRoTmFtZShuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IHZhbHVlcyA9ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHZhbHVlKTtcbiAgICByZXR1cm4gX1N0b3JhZ2UuZGVmYXVsdC5zZXRJdGVtQXN5bmMobmFtZSwgdmFsdWVzKTtcbiAgfSxcbiAgdW5QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQucmVtb3ZlSXRlbUFzeW5jKG5hbWUpO1xuICB9LFxuICBhc3luYyBnZXRBbGxDb250ZW50cygpIHtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgX1N0b3JhZ2UuZGVmYXVsdC5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICByZXR1cm4gKDAsIF9yZWR1Y2UuZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBhc3luYyAocHJldmlvdXNQcm9taXNlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IExEUyA9IGF3YWl0IHByZXZpb3VzUHJvbWlzZTtcbiAgICAgIGlmICgoMCwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuaXNMb2NhbERhdGFzdG9yZUtleSkoa2V5KSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKGtleSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgTERTW2tleV0gPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZXRBbGxDb250ZW50czogJywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gTERTO1xuICAgIH0sIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh7fSkpO1xuICB9LFxuICAvLyBVc2VkIGZvciB0ZXN0aW5nXG4gIGFzeW5jIGdldFJhd1N0b3JhZ2UoKSB7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0QWxsS2V5c0FzeW5jKCk7XG4gICAgcmV0dXJuICgwLCBfcmVkdWNlLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywgYXN5bmMgKHByZXZpb3VzUHJvbWlzZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBMRFMgPSBhd2FpdCBwcmV2aW91c1Byb21pc2U7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKGtleSk7XG4gICAgICBMRFNba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIExEUztcbiAgICB9LCBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoe30pKTtcbiAgfSxcbiAgYXN5bmMgY2xlYXIoKSB7XG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IF9TdG9yYWdlLmRlZmF1bHQuZ2V0QWxsS2V5c0FzeW5jKCk7XG4gICAgY29uc3QgdG9SZW1vdmUgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoKDAsIF9Mb2NhbERhdGFzdG9yZVV0aWxzLmlzTG9jYWxEYXRhc3RvcmVLZXkpKGtleSkpIHtcbiAgICAgICAgdG9SZW1vdmUucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9taXNlcyA9ICgwLCBfbWFwLmRlZmF1bHQpKHRvUmVtb3ZlKS5jYWxsKHRvUmVtb3ZlLCB0aGlzLnVuUGluV2l0aE5hbWUpO1xuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LmFsbChwcm9taXNlcyk7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlci5yZWFjdC1uYXRpdmVcIikpO1xudmFyIF9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIuZGVmYXVsdFwiKSk7XG5sZXQgTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyID0gX0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlcjIuZGVmYXVsdDtcbm1vZHVsZS5leHBvcnRzID0gTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9mb3JFYWNoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9mb3ItZWFjaFwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfTG9jYWxEYXRhc3RvcmVVdGlscyA9IHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlVXRpbHNcIik7XG52YXIgX1N0b3JhZ2VDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlQ29udHJvbGxlci5yZWFjdC1uYXRpdmVcIikpO1xuY29uc3QgTG9jYWxEYXRhc3RvcmVDb250cm9sbGVyID0ge1xuICBhc3luYyBmcm9tUGluV2l0aE5hbWUobmFtZSkge1xuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IF9TdG9yYWdlQ29udHJvbGxlci5kZWZhdWx0LmdldEl0ZW1Bc3luYyhuYW1lKTtcbiAgICBpZiAoIXZhbHVlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBvYmplY3RzID0gSlNPTi5wYXJzZSh2YWx1ZXMpO1xuICAgIHJldHVybiBvYmplY3RzO1xuICB9LFxuICBhc3luYyBwaW5XaXRoTmFtZShuYW1lLCB2YWx1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KSh2YWx1ZSk7XG4gICAgICBhd2FpdCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5zZXRJdGVtQXN5bmMobmFtZSwgdmFsdWVzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBRdW90YSBleGNlZWRlZCwgcG9zc2libHkgZHVlIHRvIFNhZmFyaSBQcml2YXRlIEJyb3dzaW5nIG1vZGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICB9XG4gIH0sXG4gIHVuUGluV2l0aE5hbWUobmFtZSkge1xuICAgIHJldHVybiBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5yZW1vdmVJdGVtQXN5bmMobmFtZSk7XG4gIH0sXG4gIGFzeW5jIGdldEFsbENvbnRlbnRzKCkge1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5nZXRBbGxLZXlzQXN5bmMoKTtcbiAgICBjb25zdCBiYXRjaCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmICgoMCwgX0xvY2FsRGF0YXN0b3JlVXRpbHMuaXNMb2NhbERhdGFzdG9yZUtleSkoa2V5KSkge1xuICAgICAgICBiYXRjaC5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IExEUyA9IHt9O1xuICAgIGxldCByZXN1bHRzID0gW107XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdHMgPSBhd2FpdCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5tdWx0aUdldChiYXRjaCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdldEFsbENvbnRlbnRzOiAnLCBlcnJvcik7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShyZXN1bHRzKS5jYWxsKHJlc3VsdHMsIHBhaXIgPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gcGFpcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIExEU1trZXldID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBMRFNba2V5XSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIExEUztcbiAgfSxcbiAgLy8gVXNlZCBmb3IgdGVzdGluZ1xuICBhc3luYyBnZXRSYXdTdG9yYWdlKCkge1xuICAgIHZhciBfY29udGV4dDtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQuZ2V0QWxsS2V5c0FzeW5jKCk7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5tdWx0aUdldChrZXlzKTtcbiAgICAoMCwgX21hcC5kZWZhdWx0KShfY29udGV4dCA9IHJlc3VsdHMpLmNhbGwoX2NvbnRleHQsIHBhaXIgPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gcGFpcjtcbiAgICAgIHN0b3JhZ2Vba2V5XSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiBzdG9yYWdlO1xuICB9LFxuICBhc3luYyBjbGVhcigpIHtcbiAgICBjb25zdCBrZXlzID0gYXdhaXQgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQuZ2V0QWxsS2V5c0FzeW5jKCk7XG4gICAgY29uc3QgYmF0Y2ggPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoKDAsIF9Mb2NhbERhdGFzdG9yZVV0aWxzLmlzTG9jYWxEYXRhc3RvcmVLZXkpKGtleSkpIHtcbiAgICAgICAgYmF0Y2gucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBfU3RvcmFnZUNvbnRyb2xsZXIuZGVmYXVsdC5tdWx0aVJlbW92ZShiYXRjaCkuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5lcnJvcignRXJyb3IgY2xlYXJpbmcgbG9jYWwgZGF0YXN0b3JlOiAnLCBlcnJvcikpO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXI7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuUElOX1BSRUZJWCA9IGV4cG9ydHMuT0JKRUNUX1BSRUZJWCA9IGV4cG9ydHMuREVGQVVMVF9QSU4gPSB2b2lkIDA7XG5leHBvcnRzLmlzTG9jYWxEYXRhc3RvcmVLZXkgPSBpc0xvY2FsRGF0YXN0b3JlS2V5O1xudmFyIF9zdGFydHNXaXRoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zdGFydHMtd2l0aFwiKSk7XG5jb25zdCBERUZBVUxUX1BJTiA9IGV4cG9ydHMuREVGQVVMVF9QSU4gPSAnX2RlZmF1bHQnO1xuY29uc3QgUElOX1BSRUZJWCA9IGV4cG9ydHMuUElOX1BSRUZJWCA9ICdwYXJzZVBpbl8nO1xuY29uc3QgT0JKRUNUX1BSRUZJWCA9IGV4cG9ydHMuT0JKRUNUX1BSRUZJWCA9ICdQYXJzZV9MRFNfJztcbmZ1bmN0aW9uIGlzTG9jYWxEYXRhc3RvcmVLZXkoa2V5KSB7XG4gIHJldHVybiAhIShrZXkgJiYgKGtleSA9PT0gREVGQVVMVF9QSU4gfHwgKDAsIF9zdGFydHNXaXRoLmRlZmF1bHQpKGtleSkuY2FsbChrZXksIFBJTl9QUkVGSVgpIHx8ICgwLCBfc3RhcnRzV2l0aC5kZWZhdWx0KShrZXkpLmNhbGwoa2V5LCBPQkpFQ1RfUFJFRklYKSkpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNvbW1pdFNlcnZlckNoYW5nZXMgPSBjb21taXRTZXJ2ZXJDaGFuZ2VzO1xuZXhwb3J0cy5kZWZhdWx0U3RhdGUgPSBkZWZhdWx0U3RhdGU7XG5leHBvcnRzLmVzdGltYXRlQXR0cmlidXRlID0gZXN0aW1hdGVBdHRyaWJ1dGU7XG5leHBvcnRzLmVzdGltYXRlQXR0cmlidXRlcyA9IGVzdGltYXRlQXR0cmlidXRlcztcbmV4cG9ydHMubWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZSA9IG1lcmdlRmlyc3RQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnBvcFBlbmRpbmdTdGF0ZSA9IHBvcFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucHVzaFBlbmRpbmdTdGF0ZSA9IHB1c2hQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnNldFBlbmRpbmdPcCA9IHNldFBlbmRpbmdPcDtcbmV4cG9ydHMuc2V0U2VydmVyRGF0YSA9IHNldFNlcnZlckRhdGE7XG52YXIgX2luY2x1ZGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmNsdWRlc1wiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX2VuY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZW5jb2RlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbnZhciBfVGFza1F1ZXVlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UYXNrUXVldWVcIikpO1xudmFyIF9QYXJzZU9wID0gcmVxdWlyZShcIi4vUGFyc2VPcFwiKTtcbmZ1bmN0aW9uIGRlZmF1bHRTdGF0ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBzZXJ2ZXJEYXRhOiB7fSxcbiAgICBwZW5kaW5nT3BzOiBbe31dLFxuICAgIG9iamVjdENhY2hlOiB7fSxcbiAgICB0YXNrczogbmV3IF9UYXNrUXVldWUuZGVmYXVsdCgpLFxuICAgIGV4aXN0ZWQ6IGZhbHNlXG4gIH07XG59XG5mdW5jdGlvbiBzZXRTZXJ2ZXJEYXRhKHNlcnZlckRhdGEsIGF0dHJpYnV0ZXMpIHtcbiAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXNbYXR0cl0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBzZXJ2ZXJEYXRhW2F0dHJdID0gYXR0cmlidXRlc1thdHRyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHNlcnZlckRhdGFbYXR0cl07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRQZW5kaW5nT3AocGVuZGluZ09wcywgYXR0ciwgb3ApIHtcbiAgY29uc3QgbGFzdCA9IHBlbmRpbmdPcHMubGVuZ3RoIC0gMTtcbiAgaWYgKG9wKSB7XG4gICAgcGVuZGluZ09wc1tsYXN0XVthdHRyXSA9IG9wO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBwZW5kaW5nT3BzW2xhc3RdW2F0dHJdO1xuICB9XG59XG5mdW5jdGlvbiBwdXNoUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpIHtcbiAgcGVuZGluZ09wcy5wdXNoKHt9KTtcbn1cbmZ1bmN0aW9uIHBvcFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKSB7XG4gIGNvbnN0IGZpcnN0ID0gcGVuZGluZ09wcy5zaGlmdCgpO1xuICBpZiAoIXBlbmRpbmdPcHMubGVuZ3RoKSB7XG4gICAgcGVuZGluZ09wc1swXSA9IHt9O1xuICB9XG4gIHJldHVybiBmaXJzdDtcbn1cbmZ1bmN0aW9uIG1lcmdlRmlyc3RQZW5kaW5nU3RhdGUocGVuZGluZ09wcykge1xuICBjb25zdCBmaXJzdCA9IHBvcFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKTtcbiAgY29uc3QgbmV4dCA9IHBlbmRpbmdPcHNbMF07XG4gIGZvciAoY29uc3QgYXR0ciBpbiBmaXJzdCkge1xuICAgIGlmIChuZXh0W2F0dHJdICYmIGZpcnN0W2F0dHJdKSB7XG4gICAgICBjb25zdCBtZXJnZWQgPSBuZXh0W2F0dHJdLm1lcmdlV2l0aChmaXJzdFthdHRyXSk7XG4gICAgICBpZiAobWVyZ2VkKSB7XG4gICAgICAgIG5leHRbYXR0cl0gPSBtZXJnZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRbYXR0cl0gPSBmaXJzdFthdHRyXTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVzdGltYXRlQXR0cmlidXRlKHNlcnZlckRhdGEsIHBlbmRpbmdPcHMsIG9iamVjdCwgYXR0cikge1xuICBsZXQgdmFsdWUgPSBzZXJ2ZXJEYXRhW2F0dHJdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBlbmRpbmdPcHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocGVuZGluZ09wc1tpXVthdHRyXSkge1xuICAgICAgaWYgKHBlbmRpbmdPcHNbaV1bYXR0cl0gaW5zdGFuY2VvZiBfUGFyc2VPcC5SZWxhdGlvbk9wKSB7XG4gICAgICAgIGlmIChvYmplY3QuaWQpIHtcbiAgICAgICAgICB2YWx1ZSA9IHBlbmRpbmdPcHNbaV1bYXR0cl0uYXBwbHlUbyh2YWx1ZSwgb2JqZWN0LCBhdHRyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBwZW5kaW5nT3BzW2ldW2F0dHJdLmFwcGx5VG8odmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBlc3RpbWF0ZUF0dHJpYnV0ZXMoc2VydmVyRGF0YSwgcGVuZGluZ09wcywgb2JqZWN0KSB7XG4gIGNvbnN0IGRhdGEgPSB7fTtcbiAgZm9yICh2YXIgYXR0ciBpbiBzZXJ2ZXJEYXRhKSB7XG4gICAgZGF0YVthdHRyXSA9IHNlcnZlckRhdGFbYXR0cl07XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwZW5kaW5nT3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChhdHRyIGluIHBlbmRpbmdPcHNbaV0pIHtcbiAgICAgIGlmIChwZW5kaW5nT3BzW2ldW2F0dHJdIGluc3RhbmNlb2YgX1BhcnNlT3AuUmVsYXRpb25PcCkge1xuICAgICAgICBpZiAob2JqZWN0LmlkKSB7XG4gICAgICAgICAgZGF0YVthdHRyXSA9IHBlbmRpbmdPcHNbaV1bYXR0cl0uYXBwbHlUbyhkYXRhW2F0dHJdLCBvYmplY3QsIGF0dHIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShhdHRyKS5jYWxsKGF0dHIsICcuJykpIHtcbiAgICAgICAgICAvLyBzaW1pbGFyIHRvIG5lc3RlZFNldCBmdW5jdGlvblxuICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IGF0dHIuc3BsaXQoJy4nKTtcbiAgICAgICAgICBjb25zdCBsYXN0ID0gZmllbGRzW2ZpZWxkcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICBsZXQgb2JqZWN0ID0gZGF0YTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGZpZWxkc1tpXTtcbiAgICAgICAgICAgIGlmICghKGtleSBpbiBvYmplY3QpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5leHRLZXkgPSBmaWVsZHNbaSArIDFdO1xuICAgICAgICAgICAgICBpZiAoIWlzTmFOKG5leHRLZXkpKSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSBbXTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IHt9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9iamVjdFtrZXldKSkge1xuICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gWy4uLm9iamVjdFtrZXldXTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgIC4uLm9iamVjdFtrZXldXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICAgIG9iamVjdFtsYXN0XSA9IHBlbmRpbmdPcHNbaV1bYXR0cl0uYXBwbHlUbyhvYmplY3RbbGFzdF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGFbYXR0cl0gPSBwZW5kaW5nT3BzW2ldW2F0dHJdLmFwcGx5VG8oZGF0YVthdHRyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8qKlxuICogQWxsb3dzIHNldHRpbmcgcHJvcGVydGllcy92YXJpYWJsZXMgZGVlcCBpbiBhbiBvYmplY3QuXG4gKiBDb252ZXJ0cyBhLmIgaW50byB7IGE6IHsgYjogdmFsdWUgfSB9IGZvciBkb3Qgbm90YXRpb24gb24gT2JqZWN0c1xuICogQ29udmVydHMgYS4wLmIgaW50byB7IGE6IFt7IGI6IHZhbHVlIH1dIH0gZm9yIGRvdCBub3RhdGlvbiBvbiBBcnJheXNcbiAqXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gYXNzaWduIHRoZSB2YWx1ZSB0b1xuICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGFzc2lnbi4gSWYgaXQncyBpbiBhIGRlZXBlciBwYXRoLCB0aGVuIHVzZSBkb3Qgbm90YXRpb24gKGBwcm9wMS5wcm9wMi5wcm9wM2ApXG4gKiBOb3RlIHRoYXQgaW50ZXJtZWRpYXRlIG9iamVjdChzKSBpbiB0aGUgbmVzdGVkIHBhdGggYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBpZiB0aGV5IGRvbid0IGV4aXN0LlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uIElmIGl0J3MgYW4gYHVuZGVmaW5lZGAgdGhlbiB0aGUga2V5IGlzIGRlbGV0ZWQuXG4gKi9cbmZ1bmN0aW9uIG5lc3RlZFNldChvYmosIGtleSwgdmFsdWUpIHtcbiAgY29uc3QgcGF0aHMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBwYXRoID0gcGF0aHNbaV07XG4gICAgaWYgKCEocGF0aCBpbiBvYmopKSB7XG4gICAgICBjb25zdCBuZXh0UGF0aCA9IHBhdGhzW2kgKyAxXTtcbiAgICAgIGlmICghaXNOYU4obmV4dFBhdGgpKSB7XG4gICAgICAgIG9ialtwYXRoXSA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW3BhdGhdID0ge307XG4gICAgICB9XG4gICAgfVxuICAgIG9iaiA9IG9ialtwYXRoXTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIGRlbGV0ZSBvYmpbcGF0aHNbcGF0aHMubGVuZ3RoIC0gMV1dO1xuICB9IGVsc2Uge1xuICAgIG9ialtwYXRoc1twYXRocy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0U2VydmVyQ2hhbmdlcyhzZXJ2ZXJEYXRhLCBvYmplY3RDYWNoZSwgY2hhbmdlcykge1xuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGZvciAoY29uc3QgYXR0ciBpbiBjaGFuZ2VzKSB7XG4gICAgY29uc3QgdmFsID0gY2hhbmdlc1thdHRyXTtcbiAgICBuZXN0ZWRTZXQoc2VydmVyRGF0YSwgYXR0ciwgdmFsKTtcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICEodmFsIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpICYmICEodmFsIGluc3RhbmNlb2YgX1BhcnNlRmlsZS5kZWZhdWx0KSAmJiAhKHZhbCBpbnN0YW5jZW9mIF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQpKSB7XG4gICAgICBjb25zdCBqc29uID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkodmFsLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICBvYmplY3RDYWNoZVthdHRyXSA9ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKGpzb24pO1xuICAgIH1cbiAgfVxufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9maWx0ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbHRlclwiKSk7XG52YXIgX3NsaWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zbGljZVwiKSk7XG52YXIgX2lzSW50ZWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvbnVtYmVyL2lzLWludGVnZXJcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9lcXVhbHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VxdWFsc1wiKSk7XG52YXIgX2RlY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGVjb2RlXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlUG9seWdvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VQb2x5Z29uXCIpKTtcbnZhciBfUGFyc2VHZW9Qb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VHZW9Qb2ludFwiKSk7XG4vKipcbiAqIGNvbnRhaW5zIC0tIERldGVybWluZXMgaWYgYW4gb2JqZWN0IGlzIGNvbnRhaW5lZCBpbiBhIGxpc3Qgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciBQYXJzZSBwb2ludGVycy5cbiAqXG4gKiBAcGFyYW0gaGF5c3RhY2tcbiAqIEBwYXJhbSBuZWVkbGVcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29udGFpbnMoaGF5c3RhY2ssIG5lZWRsZSkge1xuICBpZiAobmVlZGxlICYmIG5lZWRsZS5fX3R5cGUgJiYgKG5lZWRsZS5fX3R5cGUgPT09ICdQb2ludGVyJyB8fCBuZWVkbGUuX190eXBlID09PSAnT2JqZWN0JykpIHtcbiAgICBmb3IgKGNvbnN0IGkgaW4gaGF5c3RhY2spIHtcbiAgICAgIGNvbnN0IHB0ciA9IGhheXN0YWNrW2ldO1xuICAgICAgaWYgKHR5cGVvZiBwdHIgPT09ICdzdHJpbmcnICYmIHB0ciA9PT0gbmVlZGxlLm9iamVjdElkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHB0ci5jbGFzc05hbWUgPT09IG5lZWRsZS5jbGFzc05hbWUgJiYgcHRyLm9iamVjdElkID09PSBuZWVkbGUub2JqZWN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKG5lZWRsZSkpIHtcbiAgICBmb3IgKGNvbnN0IG5lZWQgb2YgbmVlZGxlKSB7XG4gICAgICBpZiAoY29udGFpbnMoaGF5c3RhY2ssIG5lZWQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gKDAsIF9pbmRleE9mLmRlZmF1bHQpKGhheXN0YWNrKS5jYWxsKGhheXN0YWNrLCBuZWVkbGUpID4gLTE7XG59XG5mdW5jdGlvbiB0cmFuc2Zvcm1PYmplY3Qob2JqZWN0KSB7XG4gIGlmIChvYmplY3QuX3RvRnVsbEpTT04pIHtcbiAgICByZXR1cm4gb2JqZWN0Ll90b0Z1bGxKU09OKCk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuLyoqXG4gKiBtYXRjaGVzUXVlcnkgLS0gRGV0ZXJtaW5lcyBpZiBhbiBvYmplY3Qgd291bGQgYmUgcmV0dXJuZWQgYnkgYSBQYXJzZSBRdWVyeVxuICogSXQncyBhIGxpZ2h0d2VpZ2h0LCB3aGVyZS1jbGF1c2Ugb25seSBpbXBsZW1lbnRhdGlvbiBvZiBhIGZ1bGwgcXVlcnkgZW5naW5lLlxuICogU2luY2Ugd2UgZmluZCBxdWVyaWVzIHRoYXQgbWF0Y2ggb2JqZWN0cywgcmF0aGVyIHRoYW4gb2JqZWN0cyB0aGF0IG1hdGNoXG4gKiBxdWVyaWVzLCB3ZSBjYW4gYXZvaWQgYnVpbGRpbmcgYSBmdWxsLWJsb3duIHF1ZXJ5IHRvb2wuXG4gKlxuICogQHBhcmFtIGNsYXNzTmFtZVxuICogQHBhcmFtIG9iamVjdFxuICogQHBhcmFtIG9iamVjdHNcbiAqIEBwYXJhbSBxdWVyeVxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBtYXRjaGVzUXVlcnkoY2xhc3NOYW1lLCBvYmplY3QsIG9iamVjdHMsIHF1ZXJ5KSB7XG4gIGlmIChvYmplY3QuY2xhc3NOYW1lICE9PSBjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IG9iaiA9IG9iamVjdDtcbiAgbGV0IHEgPSBxdWVyeTtcbiAgaWYgKG9iamVjdC50b0pTT04pIHtcbiAgICBvYmogPSBvYmplY3QudG9KU09OKCk7XG4gIH1cbiAgaWYgKHF1ZXJ5LnRvSlNPTikge1xuICAgIHEgPSBxdWVyeS50b0pTT04oKS53aGVyZTtcbiAgfVxuICBvYmouY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICBmb3IgKGNvbnN0IGZpZWxkIGluIHEpIHtcbiAgICBpZiAoIW1hdGNoZXNLZXlDb25zdHJhaW50cyhjbGFzc05hbWUsIG9iaiwgb2JqZWN0cywgZmllbGQsIHFbZmllbGRdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGVxdWFsT2JqZWN0c0dlbmVyaWMob2JqLCBjb21wYXJlVG8sIGVxbEZuKSB7XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkob2JqKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZXFsRm4ob2JqW2ldLCBjb21wYXJlVG8pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGVxbEZuKG9iaiwgY29tcGFyZVRvKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWxhdGl2ZVRpbWVUb0RhdGVSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGF0dXMgVGhlIGNvbnZlcnNpb24gc3RhdHVzLCBgZXJyb3JgIGlmIGNvbnZlcnNpb24gZmFpbGVkIG9yXG4gKiBgc3VjY2Vzc2AgaWYgY29udmVyc2lvbiBzdWNjZWVkZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5mbyBUaGUgZXJyb3IgbWVzc2FnZSBpZiBjb252ZXJzaW9uIGZhaWxlZCwgb3IgdGhlIHJlbGF0aXZlXG4gKiB0aW1lIGluZGljYXRpb24gKGBwYXN0YCwgYHByZXNlbnRgLCBgZnV0dXJlYCkgaWYgY29udmVyc2lvbiBzdWNjZWVkZWQuXG4gKiBAcHJvcGVydHkge0RhdGV8dW5kZWZpbmVkfSByZXN1bHQgVGhlIGNvbnZlcnRlZCBkYXRlLCBvciBgdW5kZWZpbmVkYCBpZiBjb252ZXJzaW9uXG4gKiBmYWlsZWQuXG4gKi9cbi8qKlxuICogQ29udmVydHMgaHVtYW4gcmVhZGFibGUgcmVsYXRpdmUgZGF0ZSBzdHJpbmcsIGZvciBleGFtcGxlLCAnaW4gMTAgZGF5cycgdG8gYSBkYXRlXG4gKiByZWxhdGl2ZSB0byBub3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHRleHQgdG8gY29udmVydC5cbiAqIEBwYXJhbSB7RGF0ZX0gW25vd10gVGhlIGRhdGUgZnJvbSB3aGljaCBhZGQgb3Igc3VidHJhY3QuIERlZmF1bHQgaXMgbm93LlxuICogQHJldHVybnMge1JlbGF0aXZlVGltZVRvRGF0ZVJlc3VsdH1cbiAqL1xuZnVuY3Rpb24gcmVsYXRpdmVUaW1lVG9EYXRlKHRleHQpIHtcbiAgbGV0IG5vdyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbmV3IERhdGUoKTtcbiAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgbGV0IHBhcnRzID0gdGV4dC5zcGxpdCgnICcpO1xuXG4gIC8vIEZpbHRlciBvdXQgd2hpdGVzcGFjZVxuICBwYXJ0cyA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKHBhcnRzKS5jYWxsKHBhcnRzLCBwYXJ0ID0+IHBhcnQgIT09ICcnKTtcbiAgY29uc3QgZnV0dXJlID0gcGFydHNbMF0gPT09ICdpbic7XG4gIGNvbnN0IHBhc3QgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PT0gJ2Fnbyc7XG4gIGlmICghZnV0dXJlICYmICFwYXN0ICYmIHRleHQgIT09ICdub3cnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgIGluZm86IFwiVGltZSBzaG91bGQgZWl0aGVyIHN0YXJ0IHdpdGggJ2luJyBvciBlbmQgd2l0aCAnYWdvJ1wiXG4gICAgfTtcbiAgfVxuICBpZiAoZnV0dXJlICYmIHBhc3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgaW5mbzogXCJUaW1lIGNhbm5vdCBoYXZlIGJvdGggJ2luJyBhbmQgJ2FnbydcIlxuICAgIH07XG4gIH1cblxuICAvLyBzdHJpcCB0aGUgJ2Fnbycgb3IgJ2luJ1xuICBpZiAoZnV0dXJlKSB7XG4gICAgcGFydHMgPSAoMCwgX3NsaWNlLmRlZmF1bHQpKHBhcnRzKS5jYWxsKHBhcnRzLCAxKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBwYXN0XG4gICAgcGFydHMgPSAoMCwgX3NsaWNlLmRlZmF1bHQpKHBhcnRzKS5jYWxsKHBhcnRzLCAwLCBwYXJ0cy5sZW5ndGggLSAxKTtcbiAgfVxuICBpZiAocGFydHMubGVuZ3RoICUgMiAhPT0gMCAmJiB0ZXh0ICE9PSAnbm93Jykge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBpbmZvOiAnSW52YWxpZCB0aW1lIHN0cmluZy4gRGFuZ2xpbmcgdW5pdCBvciBudW1iZXIuJ1xuICAgIH07XG4gIH1cbiAgY29uc3QgcGFpcnMgPSBbXTtcbiAgd2hpbGUgKHBhcnRzLmxlbmd0aCkge1xuICAgIHBhaXJzLnB1c2goW3BhcnRzLnNoaWZ0KCksIHBhcnRzLnNoaWZ0KCldKTtcbiAgfVxuICBsZXQgc2Vjb25kcyA9IDA7XG4gIGZvciAoY29uc3QgW251bSwgaW50ZXJ2YWxdIG9mIHBhaXJzKSB7XG4gICAgY29uc3QgdmFsID0gTnVtYmVyKG51bSk7XG4gICAgaWYgKCEoMCwgX2lzSW50ZWdlci5kZWZhdWx0KSh2YWwpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgIGluZm86IGAnJHtudW19JyBpcyBub3QgYW4gaW50ZWdlci5gXG4gICAgICB9O1xuICAgIH1cbiAgICBzd2l0Y2ggKGludGVydmFsKSB7XG4gICAgICBjYXNlICd5cic6XG4gICAgICBjYXNlICd5cnMnOlxuICAgICAgY2FzZSAneWVhcic6XG4gICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIHNlY29uZHMgKz0gdmFsICogMzE1MzYwMDA7IC8vIDM2NSAqIDI0ICogNjAgKiA2MFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3drJzpcbiAgICAgIGNhc2UgJ3drcyc6XG4gICAgICBjYXNlICd3ZWVrJzpcbiAgICAgIGNhc2UgJ3dlZWtzJzpcbiAgICAgICAgc2Vjb25kcyArPSB2YWwgKiA2MDQ4MDA7IC8vIDcgKiAyNCAqIDYwICogNjBcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkJzpcbiAgICAgIGNhc2UgJ2RheSc6XG4gICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgc2Vjb25kcyArPSB2YWwgKiA4NjQwMDsgLy8gMjQgKiA2MCAqIDYwXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaHInOlxuICAgICAgY2FzZSAnaHJzJzpcbiAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICBzZWNvbmRzICs9IHZhbCAqIDM2MDA7IC8vIDYwICogNjBcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtaW4nOlxuICAgICAgY2FzZSAnbWlucyc6XG4gICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgIHNlY29uZHMgKz0gdmFsICogNjA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VjJzpcbiAgICAgIGNhc2UgJ3NlY3MnOlxuICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICBzZWNvbmRzICs9IHZhbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICBpbmZvOiBgSW52YWxpZCBpbnRlcnZhbDogJyR7aW50ZXJ2YWx9J2BcbiAgICAgICAgfTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWlsbGlzZWNvbmRzID0gc2Vjb25kcyAqIDEwMDA7XG4gIGlmIChmdXR1cmUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICBpbmZvOiAnZnV0dXJlJyxcbiAgICAgIHJlc3VsdDogbmV3IERhdGUobm93LnZhbHVlT2YoKSArIG1pbGxpc2Vjb25kcylcbiAgICB9O1xuICB9IGVsc2UgaWYgKHBhc3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICBpbmZvOiAncGFzdCcsXG4gICAgICByZXN1bHQ6IG5ldyBEYXRlKG5vdy52YWx1ZU9mKCkgLSBtaWxsaXNlY29uZHMpXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICBpbmZvOiAncHJlc2VudCcsXG4gICAgICByZXN1bHQ6IG5ldyBEYXRlKG5vdy52YWx1ZU9mKCkpXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhbiBvYmplY3QgbWF0Y2hlcyBhIHNpbmdsZSBrZXkncyBjb25zdHJhaW50c1xuICpcbiAqIEBwYXJhbSBjbGFzc05hbWVcbiAqIEBwYXJhbSBvYmplY3RcbiAqIEBwYXJhbSBvYmplY3RzXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gY29uc3RyYWludHNcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc0tleUNvbnN0cmFpbnRzKGNsYXNzTmFtZSwgb2JqZWN0LCBvYmplY3RzLCBrZXksIGNvbnN0cmFpbnRzKSB7XG4gIGlmIChjb25zdHJhaW50cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKGtleSkuY2FsbChrZXksICcuJykgPj0gMCkge1xuICAgIC8vIEtleSByZWZlcmVuY2VzIGEgc3Vib2JqZWN0XG4gICAgY29uc3Qga2V5Q29tcG9uZW50cyA9IGtleS5zcGxpdCgnLicpO1xuICAgIGNvbnN0IHN1Yk9iamVjdEtleSA9IGtleUNvbXBvbmVudHNbMF07XG4gICAgY29uc3Qga2V5UmVtYWluZGVyID0gKDAsIF9zbGljZS5kZWZhdWx0KShrZXlDb21wb25lbnRzKS5jYWxsKGtleUNvbXBvbmVudHMsIDEpLmpvaW4oJy4nKTtcbiAgICByZXR1cm4gbWF0Y2hlc0tleUNvbnN0cmFpbnRzKGNsYXNzTmFtZSwgb2JqZWN0W3N1Yk9iamVjdEtleV0gfHwge30sIG9iamVjdHMsIGtleVJlbWFpbmRlciwgY29uc3RyYWludHMpO1xuICB9XG4gIGxldCBpO1xuICBpZiAoa2V5ID09PSAnJG9yJykge1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG1hdGNoZXNRdWVyeShjbGFzc05hbWUsIG9iamVjdCwgb2JqZWN0cywgY29uc3RyYWludHNbaV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gJyRhbmQnKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW1hdGNoZXNRdWVyeShjbGFzc05hbWUsIG9iamVjdCwgb2JqZWN0cywgY29uc3RyYWludHNbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGtleSA9PT0gJyRub3InKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobWF0Y2hlc1F1ZXJ5KGNsYXNzTmFtZSwgb2JqZWN0LCBvYmplY3RzLCBjb25zdHJhaW50c1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoa2V5ID09PSAnJHJlbGF0ZWRUbycpIHtcbiAgICAvLyBCYWlsISBXZSBjYW4ndCBoYW5kbGUgcmVsYXRpb25hbCBxdWVyaWVzIGxvY2FsbHlcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCEvXltBLVphLXpdWzAtOUEtWmEtel9dKiQvLnRlc3Qoa2V5KSkge1xuICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9LRVlfTkFNRSwgYEludmFsaWQgS2V5OiAke2tleX1gKTtcbiAgfVxuICAvLyBFcXVhbGl0eSAob3IgQXJyYXkgY29udGFpbnMpIGNhc2VzXG4gIGlmICh0eXBlb2YgY29uc3RyYWludHMgIT09ICdvYmplY3QnKSB7XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShvYmplY3Rba2V5XSkpIHtcbiAgICAgIHZhciBfY29udGV4dDtcbiAgICAgIHJldHVybiAoMCwgX2luZGV4T2YuZGVmYXVsdCkoX2NvbnRleHQgPSBvYmplY3Rba2V5XSkuY2FsbChfY29udGV4dCwgY29uc3RyYWludHMpID4gLTE7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gY29uc3RyYWludHM7XG4gIH1cbiAgbGV0IGNvbXBhcmVUbztcbiAgaWYgKGNvbnN0cmFpbnRzLl9fdHlwZSkge1xuICAgIGlmIChjb25zdHJhaW50cy5fX3R5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgcmV0dXJuIGVxdWFsT2JqZWN0c0dlbmVyaWMob2JqZWN0W2tleV0sIGNvbnN0cmFpbnRzLCBmdW5jdGlvbiAob2JqLCBwdHIpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogIT09ICd1bmRlZmluZWQnICYmIHB0ci5jbGFzc05hbWUgPT09IG9iai5jbGFzc05hbWUgJiYgcHRyLm9iamVjdElkID09PSBvYmoub2JqZWN0SWQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGVxdWFsT2JqZWN0c0dlbmVyaWMoKDAsIF9kZWNvZGUuZGVmYXVsdCkob2JqZWN0W2tleV0pLCAoMCwgX2RlY29kZS5kZWZhdWx0KShjb25zdHJhaW50cyksIF9lcXVhbHMuZGVmYXVsdCk7XG4gIH1cbiAgLy8gTW9yZSBjb21wbGV4IGNhc2VzXG4gIGZvciAoY29uc3QgY29uZGl0aW9uIGluIGNvbnN0cmFpbnRzKSB7XG4gICAgY29tcGFyZVRvID0gY29uc3RyYWludHNbY29uZGl0aW9uXTtcbiAgICBpZiAoY29tcGFyZVRvPy5fX3R5cGUpIHtcbiAgICAgIGNvbXBhcmVUbyA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKGNvbXBhcmVUbyk7XG4gICAgfVxuICAgIC8vIGlzIGl0IGEgJHJlbGF0aXZlVGltZT8gY29udmVydCB0byBkYXRlXG4gICAgaWYgKGNvbXBhcmVUbz8uWyckcmVsYXRpdmVUaW1lJ10pIHtcbiAgICAgIGNvbnN0IHBhcnNlclJlc3VsdCA9IHJlbGF0aXZlVGltZVRvRGF0ZShjb21wYXJlVG9bJyRyZWxhdGl2ZVRpbWUnXSk7XG4gICAgICBpZiAocGFyc2VyUmVzdWx0LnN0YXR1cyAhPT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9KU09OLCBgYmFkICRyZWxhdGl2ZVRpbWUgKCR7a2V5fSkgdmFsdWUuICR7cGFyc2VyUmVzdWx0LmluZm99YCk7XG4gICAgICB9XG4gICAgICBjb21wYXJlVG8gPSBwYXJzZXJSZXN1bHQucmVzdWx0O1xuICAgIH1cbiAgICAvLyBDb21wYXJlIERhdGUgT2JqZWN0IG9yIERhdGUgU3RyaW5nXG4gICAgaWYgKHRvU3RyaW5nLmNhbGwoY29tcGFyZVRvKSA9PT0gJ1tvYmplY3QgRGF0ZV0nIHx8IHR5cGVvZiBjb21wYXJlVG8gPT09ICdzdHJpbmcnICYmXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG5ldyBEYXRlKGNvbXBhcmVUbykgIT09ICdJbnZhbGlkIERhdGUnICYmXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgICFpc05hTihuZXcgRGF0ZShjb21wYXJlVG8pKSkge1xuICAgICAgb2JqZWN0W2tleV0gPSBuZXcgRGF0ZShvYmplY3Rba2V5XS5pc28gPyBvYmplY3Rba2V5XS5pc28gOiBvYmplY3Rba2V5XSk7XG4gICAgfVxuICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7XG4gICAgICBjYXNlICckbHQnOlxuICAgICAgICBpZiAob2JqZWN0W2tleV0gPj0gY29tcGFyZVRvKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGx0ZSc6XG4gICAgICAgIGlmIChvYmplY3Rba2V5XSA+IGNvbXBhcmVUbykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRndCc6XG4gICAgICAgIGlmIChvYmplY3Rba2V5XSA8PSBjb21wYXJlVG8pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckZ3RlJzpcbiAgICAgICAgaWYgKG9iamVjdFtrZXldIDwgY29tcGFyZVRvKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJG5lJzpcbiAgICAgICAgaWYgKCgwLCBfZXF1YWxzLmRlZmF1bHQpKG9iamVjdFtrZXldLCBjb21wYXJlVG8pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGluJzpcbiAgICAgICAgaWYgKCFjb250YWlucyhjb21wYXJlVG8sIG9iamVjdFtrZXldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRuaW4nOlxuICAgICAgICBpZiAoY29udGFpbnMoY29tcGFyZVRvLCBvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckYWxsJzpcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBhcmVUby5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBfY29udGV4dDI7XG4gICAgICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShfY29udGV4dDIgPSBvYmplY3Rba2V5XSkuY2FsbChfY29udGV4dDIsIGNvbXBhcmVUb1tpXSkgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGV4aXN0cyc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eUV4aXN0cyA9IHR5cGVvZiBvYmplY3Rba2V5XSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgY29uc3QgZXhpc3RlbmNlSXNSZXF1aXJlZCA9IGNvbnN0cmFpbnRzWyckZXhpc3RzJ107XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJhaW50c1snJGV4aXN0cyddICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIC8vIFRoZSBTREsgd2lsbCBuZXZlciBzdWJtaXQgYSBub24tYm9vbGVhbiBmb3IgJGV4aXN0cywgYnV0IGlmIHNvbWVvbmVcbiAgICAgICAgICAgIC8vIHRyaWVzIHRvIHN1Ym1pdCBhIG5vbi1ib29sZWFuIGZvciAkZXhpdHMgb3V0c2lkZSB0aGUgU0RLcywganVzdCBpZ25vcmUgaXQuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFwcm9wZXJ0eUV4aXN0cyAmJiBleGlzdGVuY2VJc1JlcXVpcmVkIHx8IHByb3BlcnR5RXhpc3RzICYmICFleGlzdGVuY2VJc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlICckcmVnZXgnOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb21wYXJlVG8gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcGFyZVRvLnRlc3Qob2JqZWN0W2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBKUyBkb2Vzbid0IHN1cHBvcnQgcGVybC1zdHlsZSBlc2NhcGluZ1xuICAgICAgICAgIGxldCBleHBTdHJpbmcgPSAnJztcbiAgICAgICAgICBsZXQgZXNjYXBlRW5kID0gLTI7XG4gICAgICAgICAgbGV0IGVzY2FwZVN0YXJ0ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKGNvbXBhcmVUbykuY2FsbChjb21wYXJlVG8sICdcXFxcUScpO1xuICAgICAgICAgIHdoaWxlIChlc2NhcGVTdGFydCA+IC0xKSB7XG4gICAgICAgICAgICAvLyBBZGQgdGhlIHVuZXNjYXBlZCBwb3J0aW9uXG4gICAgICAgICAgICBleHBTdHJpbmcgKz0gY29tcGFyZVRvLnN1YnN0cmluZyhlc2NhcGVFbmQgKyAyLCBlc2NhcGVTdGFydCk7XG4gICAgICAgICAgICBlc2NhcGVFbmQgPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkoY29tcGFyZVRvKS5jYWxsKGNvbXBhcmVUbywgJ1xcXFxFJywgZXNjYXBlU3RhcnQpO1xuICAgICAgICAgICAgaWYgKGVzY2FwZUVuZCA+IC0xKSB7XG4gICAgICAgICAgICAgIGV4cFN0cmluZyArPSBjb21wYXJlVG8uc3Vic3RyaW5nKGVzY2FwZVN0YXJ0ICsgMiwgZXNjYXBlRW5kKS5yZXBsYWNlKC9cXFxcXFxcXFxcXFxcXFxcRS9nLCAnXFxcXEUnKS5yZXBsYWNlKC9cXFcvZywgJ1xcXFwkJicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXNjYXBlU3RhcnQgPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkoY29tcGFyZVRvKS5jYWxsKGNvbXBhcmVUbywgJ1xcXFxRJywgZXNjYXBlRW5kKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXhwU3RyaW5nICs9IGNvbXBhcmVUby5zdWJzdHJpbmcoTWF0aC5tYXgoZXNjYXBlU3RhcnQsIGVzY2FwZUVuZCArIDIpKTtcbiAgICAgICAgICBsZXQgbW9kaWZpZXJzID0gY29uc3RyYWludHMuJG9wdGlvbnMgfHwgJyc7XG4gICAgICAgICAgbW9kaWZpZXJzID0gbW9kaWZpZXJzLnJlcGxhY2UoJ3gnLCAnJykucmVwbGFjZSgncycsICcnKTtcbiAgICAgICAgICAvLyBQYXJzZSBTZXJ2ZXIgLyBNb25nbyBzdXBwb3J0IHggYW5kIHMgbW9kaWZpZXJzIGJ1dCBKUyBSZWdFeHAgZG9lc24ndFxuICAgICAgICAgIGNvbnN0IGV4cCA9IG5ldyBSZWdFeHAoZXhwU3RyaW5nLCBtb2RpZmllcnMpO1xuICAgICAgICAgIGlmICghZXhwLnRlc3Qob2JqZWN0W2tleV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICBjYXNlICckbmVhclNwaGVyZSc6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIWNvbXBhcmVUbyB8fCAhb2JqZWN0W2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBjb21wYXJlVG8ucmFkaWFuc1RvKG9iamVjdFtrZXldKTtcbiAgICAgICAgICBjb25zdCBtYXggPSBjb25zdHJhaW50cy4kbWF4RGlzdGFuY2UgfHwgSW5maW5pdHk7XG4gICAgICAgICAgcmV0dXJuIGRpc3RhbmNlIDw9IG1heDtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJHdpdGhpbic6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIWNvbXBhcmVUbyB8fCAhb2JqZWN0W2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc291dGhXZXN0ID0gY29tcGFyZVRvLiRib3hbMF07XG4gICAgICAgICAgY29uc3Qgbm9ydGhFYXN0ID0gY29tcGFyZVRvLiRib3hbMV07XG4gICAgICAgICAgaWYgKHNvdXRoV2VzdC5sYXRpdHVkZSA+IG5vcnRoRWFzdC5sYXRpdHVkZSB8fCBzb3V0aFdlc3QubG9uZ2l0dWRlID4gbm9ydGhFYXN0LmxvbmdpdHVkZSkge1xuICAgICAgICAgICAgLy8gSW52YWxpZCBib3gsIGNyb3NzZXMgdGhlIGRhdGUgbGluZVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqZWN0W2tleV0ubGF0aXR1ZGUgPiBzb3V0aFdlc3QubGF0aXR1ZGUgJiYgb2JqZWN0W2tleV0ubGF0aXR1ZGUgPCBub3J0aEVhc3QubGF0aXR1ZGUgJiYgb2JqZWN0W2tleV0ubG9uZ2l0dWRlID4gc291dGhXZXN0LmxvbmdpdHVkZSAmJiBvYmplY3Rba2V5XS5sb25naXR1ZGUgPCBub3J0aEVhc3QubG9uZ2l0dWRlO1xuICAgICAgICB9XG4gICAgICBjYXNlICckb3B0aW9ucyc6XG4gICAgICAgIC8vIE5vdCBhIHF1ZXJ5IHR5cGUsIGJ1dCBhIHdheSB0byBhZGQgb3B0aW9ucyB0byAkcmVnZXguIElnbm9yZSBhbmRcbiAgICAgICAgLy8gYXZvaWQgdGhlIGRlZmF1bHRcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckbWF4RGlzdGFuY2UnOlxuICAgICAgICAvLyBOb3QgYSBxdWVyeSB0eXBlLCBidXQgYSB3YXkgdG8gYWRkIGEgY2FwIHRvICRuZWFyU3BoZXJlLiBJZ25vcmUgYW5kXG4gICAgICAgIC8vIGF2b2lkIHRoZSBkZWZhdWx0XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJHNlbGVjdCc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBzdWJRdWVyeU9iamVjdHMgPSAoMCwgX2ZpbHRlci5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIChvYmosIGluZGV4LCBhcnIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzUXVlcnkoY29tcGFyZVRvLnF1ZXJ5LmNsYXNzTmFtZSwgb2JqLCBhcnIsIGNvbXBhcmVUby5xdWVyeS53aGVyZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJRdWVyeU9iamVjdHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Yk9iamVjdCA9IHRyYW5zZm9ybU9iamVjdChzdWJRdWVyeU9iamVjdHNbaV0pO1xuICAgICAgICAgICAgcmV0dXJuICgwLCBfZXF1YWxzLmRlZmF1bHQpKG9iamVjdFtrZXldLCBzdWJPYmplY3RbY29tcGFyZVRvLmtleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRkb250U2VsZWN0JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHN1YlF1ZXJ5T2JqZWN0cyA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgKG9iaiwgaW5kZXgsIGFycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNRdWVyeShjb21wYXJlVG8ucXVlcnkuY2xhc3NOYW1lLCBvYmosIGFyciwgY29tcGFyZVRvLnF1ZXJ5LndoZXJlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YlF1ZXJ5T2JqZWN0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViT2JqZWN0ID0gdHJhbnNmb3JtT2JqZWN0KHN1YlF1ZXJ5T2JqZWN0c1tpXSk7XG4gICAgICAgICAgICByZXR1cm4gISgwLCBfZXF1YWxzLmRlZmF1bHQpKG9iamVjdFtrZXldLCBzdWJPYmplY3RbY29tcGFyZVRvLmtleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRpblF1ZXJ5JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHN1YlF1ZXJ5T2JqZWN0cyA9ICgwLCBfZmlsdGVyLmRlZmF1bHQpKG9iamVjdHMpLmNhbGwob2JqZWN0cywgKG9iaiwgaW5kZXgsIGFycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNRdWVyeShjb21wYXJlVG8uY2xhc3NOYW1lLCBvYmosIGFyciwgY29tcGFyZVRvLndoZXJlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YlF1ZXJ5T2JqZWN0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViT2JqZWN0ID0gdHJhbnNmb3JtT2JqZWN0KHN1YlF1ZXJ5T2JqZWN0c1tpXSk7XG4gICAgICAgICAgICBpZiAob2JqZWN0W2tleV0uY2xhc3NOYW1lID09PSBzdWJPYmplY3QuY2xhc3NOYW1lICYmIG9iamVjdFtrZXldLm9iamVjdElkID09PSBzdWJPYmplY3Qub2JqZWN0SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnJG5vdEluUXVlcnknOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qgc3ViUXVlcnlPYmplY3RzID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkob2JqZWN0cykuY2FsbChvYmplY3RzLCAob2JqLCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1F1ZXJ5KGNvbXBhcmVUby5jbGFzc05hbWUsIG9iaiwgYXJyLCBjb21wYXJlVG8ud2hlcmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUXVlcnlPYmplY3RzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJPYmplY3QgPSB0cmFuc2Zvcm1PYmplY3Qoc3ViUXVlcnlPYmplY3RzW2ldKTtcbiAgICAgICAgICAgIGlmIChvYmplY3Rba2V5XS5jbGFzc05hbWUgPT09IHN1Yk9iamVjdC5jbGFzc05hbWUgJiYgb2JqZWN0W2tleV0ub2JqZWN0SWQgPT09IHN1Yk9iamVjdC5vYmplY3RJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICBjYXNlICckY29udGFpbmVkQnknOlxuICAgICAgICB7XG4gICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBvYmplY3Rba2V5XSkge1xuICAgICAgICAgICAgaWYgKCFjb250YWlucyhjb21wYXJlVG8sIHZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICBjYXNlICckZ2VvV2l0aGluJzpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChjb21wYXJlVG8uJHBvbHlnb24pIHtcbiAgICAgICAgICAgIHZhciBfY29udGV4dDM7XG4gICAgICAgICAgICBjb25zdCBwb2ludHMgPSAoMCwgX21hcC5kZWZhdWx0KShfY29udGV4dDMgPSBjb21wYXJlVG8uJHBvbHlnb24pLmNhbGwoX2NvbnRleHQzLCBnZW9Qb2ludCA9PiBbZ2VvUG9pbnQubGF0aXR1ZGUsIGdlb1BvaW50LmxvbmdpdHVkZV0pO1xuICAgICAgICAgICAgY29uc3QgcG9seWdvbiA9IG5ldyBfUGFyc2VQb2x5Z29uLmRlZmF1bHQocG9pbnRzKTtcbiAgICAgICAgICAgIHJldHVybiBwb2x5Z29uLmNvbnRhaW5zUG9pbnQob2JqZWN0W2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29tcGFyZVRvLiRjZW50ZXJTcGhlcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtXR1M4NFBvaW50LCBtYXhEaXN0YW5jZV0gPSBjb21wYXJlVG8uJGNlbnRlclNwaGVyZTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlclBvaW50ID0gbmV3IF9QYXJzZUdlb1BvaW50LmRlZmF1bHQoe1xuICAgICAgICAgICAgICBsYXRpdHVkZTogV0dTODRQb2ludFsxXSxcbiAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBXR1M4NFBvaW50WzBdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gbmV3IF9QYXJzZUdlb1BvaW50LmRlZmF1bHQob2JqZWN0W2tleV0pO1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBwb2ludC5yYWRpYW5zVG8oY2VudGVyUG9pbnQpO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlIDw9IG1heERpc3RhbmNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJyRnZW9JbnRlcnNlY3RzJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHBvbHlnb24gPSBuZXcgX1BhcnNlUG9seWdvbi5kZWZhdWx0KG9iamVjdFtrZXldLmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICBjb25zdCBwb2ludCA9IG5ldyBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KGNvbXBhcmVUby4kcG9pbnQpO1xuICAgICAgICAgIHJldHVybiBwb2x5Z29uLmNvbnRhaW5zUG9pbnQocG9pbnQpO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVRdWVyeShxdWVyeSkge1xuICB2YXIgX2NvbnRleHQ0O1xuICBsZXQgcSA9IHF1ZXJ5O1xuICBpZiAocXVlcnkudG9KU09OKSB7XG4gICAgcSA9IHF1ZXJ5LnRvSlNPTigpLndoZXJlO1xuICB9XG4gIGNvbnN0IHNwZWNpYWxRdWVyeWtleXMgPSBbJyRhbmQnLCAnJG9yJywgJyRub3InLCAnX3JwZXJtJywgJ193cGVybScsICdfcGVyaXNoYWJsZV90b2tlbicsICdfZW1haWxfdmVyaWZ5X3Rva2VuJywgJ19lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCcsICdfYWNjb3VudF9sb2Nrb3V0X2V4cGlyZXNfYXQnLCAnX2ZhaWxlZF9sb2dpbl9jb3VudCddO1xuICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ0ID0gKDAsIF9rZXlzLmRlZmF1bHQpKHEpKS5jYWxsKF9jb250ZXh0NCwga2V5ID0+IHtcbiAgICBpZiAocSAmJiBxW2tleV0gJiYgcVtrZXldLiRyZWdleCkge1xuICAgICAgaWYgKHR5cGVvZiBxW2tleV0uJG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghcVtrZXldLiRvcHRpb25zLm1hdGNoKC9eW2lteHNdKyQvKSkge1xuICAgICAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9RVUVSWSwgYEJhZCAkb3B0aW9ucyB2YWx1ZSBmb3IgcXVlcnk6ICR7cVtrZXldLiRvcHRpb25zfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkoc3BlY2lhbFF1ZXJ5a2V5cykuY2FsbChzcGVjaWFsUXVlcnlrZXlzLCBrZXkpIDwgMCAmJiAha2V5Lm1hdGNoKC9eW2EtekEtWl1bYS16QS1aMC05X1xcLl0qJC8pKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfS0VZX05BTUUsIGBJbnZhbGlkIGtleSBuYW1lOiAke2tleX1gKTtcbiAgICB9XG4gIH0pO1xufVxuY29uc3QgT2ZmbGluZVF1ZXJ5ID0ge1xuICBtYXRjaGVzUXVlcnk6IG1hdGNoZXNRdWVyeSxcbiAgdmFsaWRhdGVRdWVyeTogdmFsaWRhdGVRdWVyeVxufTtcbm1vZHVsZS5leHBvcnRzID0gT2ZmbGluZVF1ZXJ5O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gT2ZmbGluZVF1ZXJ5OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX1dlYWtNYXAgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS93ZWFrLW1hcFwiKTtcbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9kZWNvZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9lbmNvZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lbmNvZGVcIikpO1xudmFyIF9DcnlwdG9Db250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9DcnlwdG9Db250cm9sbGVyXCIpKTtcbnZhciBfRXZlbnR1YWxseVF1ZXVlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9FdmVudHVhbGx5UXVldWVcIikpO1xudmFyIF9JbmRleGVkREJTdG9yYWdlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSW5kZXhlZERCU3RvcmFnZUNvbnRyb2xsZXJcIikpO1xudmFyIF9JbnN0YWxsYXRpb25Db250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9JbnN0YWxsYXRpb25Db250cm9sbGVyXCIpKTtcbnZhciBQYXJzZU9wID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vUGFyc2VPcFwiKSk7XG52YXIgX1JFU1RDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9SRVNUQ29udHJvbGxlclwiKSk7XG52YXIgX1BhcnNlQUNMID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUFDTFwiKSk7XG52YXIgQW5hbHl0aWNzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vQW5hbHl0aWNzXCIpKTtcbnZhciBfQW5vbnltb3VzVXRpbHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0Fub255bW91c1V0aWxzXCIpKTtcbnZhciBDbG91ZCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL0Nsb3VkXCIpKTtcbnZhciBfUGFyc2VDTFAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQ0xQXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfRXZlbnRFbWl0dGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9FdmVudEVtaXR0ZXJcIikpO1xudmFyIF9QYXJzZUNvbmZpZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VDb25maWdcIikpO1xudmFyIF9QYXJzZUVycm9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUVycm9yXCIpKTtcbnZhciBfRmFjZWJvb2tVdGlscyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRmFjZWJvb2tVdGlsc1wiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBIb29rcyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL1BhcnNlSG9va3NcIikpO1xudmFyIF9QYXJzZUdlb1BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUdlb1BvaW50XCIpKTtcbnZhciBfUGFyc2VQb2x5Z29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVBvbHlnb25cIikpO1xudmFyIF9QYXJzZUluc3RhbGxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VJbnN0YWxsYXRpb25cIikpO1xudmFyIF9Mb2NhbERhdGFzdG9yZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xudmFyIFB1c2ggPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9QdXNoXCIpKTtcbnZhciBfUGFyc2VRdWVyeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VRdWVyeVwiKSk7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xudmFyIF9QYXJzZVJvbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUm9sZVwiKSk7XG52YXIgX1BhcnNlU2NoZW1hID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVNjaGVtYVwiKSk7XG52YXIgX1BhcnNlU2Vzc2lvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VTZXNzaW9uXCIpKTtcbnZhciBfU3RvcmFnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZVwiKSk7XG52YXIgX1BhcnNlVXNlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VVc2VyXCIpKTtcbnZhciBfUGFyc2VMaXZlUXVlcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlTGl2ZVF1ZXJ5XCIpKTtcbnZhciBfTGl2ZVF1ZXJ5Q2xpZW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9MaXZlUXVlcnlDbGllbnRcIikpO1xudmFyIF9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlclwiKSk7XG52YXIgX1N0b3JhZ2VDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlQ29udHJvbGxlclwiKSk7XG52YXIgX1dlYlNvY2tldENvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1dlYlNvY2tldENvbnRyb2xsZXJcIikpO1xuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgX1dlYWtNYXApIHJldHVybiBudWxsO1xuICB2YXIgciA9IG5ldyBfV2Vha01hcCgpLFxuICAgIHQgPSBuZXcgX1dlYWtNYXAoKTtcbiAgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBlID8gdCA6IHI7XG4gIH0pKGUpO1xufVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoZSwgcikge1xuICBpZiAoIXIgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICBkZWZhdWx0OiBlXG4gIH07XG4gIHZhciB0ID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKHIpO1xuICBpZiAodCAmJiB0LmhhcyhlKSkgcmV0dXJuIHQuZ2V0KGUpO1xuICB2YXIgbiA9IHtcbiAgICBfX3Byb3RvX186IG51bGxcbiAgfTtcbiAgZm9yICh2YXIgdSBpbiBlKSBpZiAoXCJkZWZhdWx0XCIgIT09IHUgJiYge30uaGFzT3duUHJvcGVydHkuY2FsbChlLCB1KSkge1xuICAgIHZhciBpID0gX09iamVjdCRkZWZpbmVQcm9wZXJ0eSAmJiBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA/IF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHUpIDogbnVsbDtcbiAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBfT2JqZWN0JGRlZmluZVByb3BlcnR5KG4sIHUsIGkpIDogblt1XSA9IGVbdV07XG4gIH1cbiAgcmV0dXJuIG4uZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgbiksIG47XG59XG4vKipcbiAqIENvbnRhaW5zIGFsbCBQYXJzZSBBUEkgY2xhc3NlcyBhbmQgZnVuY3Rpb25zLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBnbG9iYWxcbiAqIEBjbGFzc1xuICogQGhpZGVjb25zdHJ1Y3RvclxuICovXG5cbmNvbnN0IFBhcnNlID0ge1xuICBBQ0w6IF9QYXJzZUFDTC5kZWZhdWx0LFxuICBBbmFseXRpY3M6IEFuYWx5dGljcyxcbiAgQW5vbnltb3VzVXRpbHM6IF9Bbm9ueW1vdXNVdGlscy5kZWZhdWx0LFxuICBDbG91ZDogQ2xvdWQsXG4gIENMUDogX1BhcnNlQ0xQLmRlZmF1bHQsXG4gIENvcmVNYW5hZ2VyOiBfQ29yZU1hbmFnZXIuZGVmYXVsdCxcbiAgQ29uZmlnOiBfUGFyc2VDb25maWcuZGVmYXVsdCxcbiAgRXJyb3I6IF9QYXJzZUVycm9yLmRlZmF1bHQsXG4gIEZhY2Vib29rVXRpbHM6IF9GYWNlYm9va1V0aWxzLmRlZmF1bHQsXG4gIEZpbGU6IF9QYXJzZUZpbGUuZGVmYXVsdCxcbiAgR2VvUG9pbnQ6IF9QYXJzZUdlb1BvaW50LmRlZmF1bHQsXG4gIFBvbHlnb246IF9QYXJzZVBvbHlnb24uZGVmYXVsdCxcbiAgSW5zdGFsbGF0aW9uOiBfUGFyc2VJbnN0YWxsYXRpb24uZGVmYXVsdCxcbiAgTG9jYWxEYXRhc3RvcmU6IF9Mb2NhbERhdGFzdG9yZS5kZWZhdWx0LFxuICBPYmplY3Q6IF9QYXJzZU9iamVjdC5kZWZhdWx0LFxuICBPcDoge1xuICAgIFNldDogUGFyc2VPcC5TZXRPcCxcbiAgICBVbnNldDogUGFyc2VPcC5VbnNldE9wLFxuICAgIEluY3JlbWVudDogUGFyc2VPcC5JbmNyZW1lbnRPcCxcbiAgICBBZGQ6IFBhcnNlT3AuQWRkT3AsXG4gICAgUmVtb3ZlOiBQYXJzZU9wLlJlbW92ZU9wLFxuICAgIEFkZFVuaXF1ZTogUGFyc2VPcC5BZGRVbmlxdWVPcCxcbiAgICBSZWxhdGlvbjogUGFyc2VPcC5SZWxhdGlvbk9wXG4gIH0sXG4gIFB1c2g6IFB1c2gsXG4gIFF1ZXJ5OiBfUGFyc2VRdWVyeS5kZWZhdWx0LFxuICBSZWxhdGlvbjogX1BhcnNlUmVsYXRpb24uZGVmYXVsdCxcbiAgUm9sZTogX1BhcnNlUm9sZS5kZWZhdWx0LFxuICBTY2hlbWE6IF9QYXJzZVNjaGVtYS5kZWZhdWx0LFxuICBTZXNzaW9uOiBfUGFyc2VTZXNzaW9uLmRlZmF1bHQsXG4gIFN0b3JhZ2U6IF9TdG9yYWdlLmRlZmF1bHQsXG4gIFVzZXI6IF9QYXJzZVVzZXIuZGVmYXVsdCxcbiAgTGl2ZVF1ZXJ5Q2xpZW50OiBfTGl2ZVF1ZXJ5Q2xpZW50LmRlZmF1bHQsXG4gIEluZGV4ZWREQjogdW5kZWZpbmVkLFxuICBIb29rczogdW5kZWZpbmVkLFxuICBQYXJzZTogdW5kZWZpbmVkLFxuICAvKipcbiAgICogQG1lbWJlciB7RXZlbnR1YWxseVF1ZXVlfSBQYXJzZS5FdmVudHVhbGx5UXVldWVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IEV2ZW50dWFsbHlRdWV1ZShxdWV1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldEV2ZW50dWFsbHlRdWV1ZShxdWV1ZSk7XG4gIH0sXG4gIGdldCBFdmVudHVhbGx5UXVldWUoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEV2ZW50dWFsbHlRdWV1ZSgpO1xuICB9LFxuICAvKipcbiAgICogQ2FsbCB0aGlzIG1ldGhvZCBmaXJzdCB0byBzZXQgdXAgeW91ciBhdXRoZW50aWNhdGlvbiB0b2tlbnMgZm9yIFBhcnNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwbGljYXRpb25JZCBZb3VyIFBhcnNlIEFwcGxpY2F0aW9uIElELlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2phdmFTY3JpcHRLZXldIFlvdXIgUGFyc2UgSmF2YVNjcmlwdCBLZXkgKE5vdCBuZWVkZWQgZm9yIHBhcnNlLXNlcnZlcilcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttYXN0ZXJLZXldIFlvdXIgUGFyc2UgTWFzdGVyIEtleS4gKE5vZGUuanMgb25seSEpXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGluaXRpYWxpemUoYXBwbGljYXRpb25JZCwgamF2YVNjcmlwdEtleSkge1xuICAgIGlmIChcImJyb3dzZXJcIiA9PT0gJ2Jyb3dzZXInICYmIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSVNfTk9ERScpICYmICFwcm9jZXNzLmVudi5TRVJWRVJfUkVOREVSSU5HKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgICBjb25zb2xlLmxvZyhcIkl0IGxvb2tzIGxpa2UgeW91J3JlIHVzaW5nIHRoZSBicm93c2VyIHZlcnNpb24gb2YgdGhlIFNESyBpbiBhIFwiICsgXCJub2RlLmpzIGVudmlyb25tZW50LiBZb3Ugc2hvdWxkIHJlcXVpcmUoJ3BhcnNlL25vZGUnKSBpbnN0ZWFkLlwiKTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgIH1cbiAgICBQYXJzZS5faW5pdGlhbGl6ZShhcHBsaWNhdGlvbklkLCBqYXZhU2NyaXB0S2V5KTtcbiAgfSxcbiAgX2luaXRpYWxpemUoYXBwbGljYXRpb25JZCwgamF2YVNjcmlwdEtleSwgbWFzdGVyS2V5KSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdBUFBMSUNBVElPTl9JRCcsIGFwcGxpY2F0aW9uSWQpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnSkFWQVNDUklQVF9LRVknLCBqYXZhU2NyaXB0S2V5KTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ01BU1RFUl9LRVknLCBtYXN0ZXJLZXkpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnVVNFX01BU1RFUl9LRVknLCBmYWxzZSk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ0V2ZW50RW1pdHRlcicsIF9FdmVudEVtaXR0ZXIuZGVmYXVsdCk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ0xpdmVRdWVyeScsIG5ldyBfUGFyc2VMaXZlUXVlcnkuZGVmYXVsdCgpKTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRJZk5lZWRlZCgnQ3J5cHRvQ29udHJvbGxlcicsIF9DcnlwdG9Db250cm9sbGVyLmRlZmF1bHQpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdFdmVudHVhbGx5UXVldWUnLCBfRXZlbnR1YWxseVF1ZXVlLmRlZmF1bHQpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdJbnN0YWxsYXRpb25Db250cm9sbGVyJywgX0luc3RhbGxhdGlvbkNvbnRyb2xsZXIuZGVmYXVsdCk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ0xvY2FsRGF0YXN0b3JlQ29udHJvbGxlcicsIF9Mb2NhbERhdGFzdG9yZUNvbnRyb2xsZXIuZGVmYXVsdCk7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ1N0b3JhZ2VDb250cm9sbGVyJywgX1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQpO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldElmTmVlZGVkKCdXZWJTb2NrZXRDb250cm9sbGVyJywgX1dlYlNvY2tldENvbnRyb2xsZXIuZGVmYXVsdCk7XG4gICAgUGFyc2UuSW5kZXhlZERCID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SWZOZWVkZWQoJ0luZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyJywgX0luZGV4ZWREQlN0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHQpO1xuICB9LFxuICAvKipcbiAgICogQ2FsbCB0aGlzIG1ldGhvZCB0byBzZXQgeW91ciBBc3luY1N0b3JhZ2UgZW5naW5lXG4gICAqIFN0YXJ0aW5nIFBhcnNlQDEuMTEsIHRoZSBQYXJzZVNESyBkbyBub3QgcHJvdmlkZSBhIFJlYWN0IEFzeW5jU3RvcmFnZSBhcyB0aGUgUmVhY3ROYXRpdmUgbW9kdWxlXG4gICAqIGlzIG5vdCBwcm92aWRlZCBhdCBhIHN0YWJsZSBwYXRoIGFuZCBjaGFuZ2VzIG92ZXIgdmVyc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXN5bmNTdG9yYWdlfSBzdG9yYWdlIGEgcmVhY3QgbmF0aXZlIGFzeW5jIHN0b3JhZ2UuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldEFzeW5jU3RvcmFnZShzdG9yYWdlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0QXN5bmNTdG9yYWdlKHN0b3JhZ2UpO1xuICB9LFxuICAvKipcbiAgICogQ2FsbCB0aGlzIG1ldGhvZCB0byBzZXQgeW91ciBMb2NhbERhdGFzdG9yZVN0b3JhZ2UgZW5naW5lXG4gICAqIElmIHVzaW5nIFJlYWN0LU5hdGl2ZSB1c2Uge0BsaW5rIFBhcnNlLnNldEFzeW5jU3RvcmFnZSBQYXJzZS5zZXRBc3luY1N0b3JhZ2UoKX1cbiAgICpcbiAgICogQHBhcmFtIHtMb2NhbERhdGFzdG9yZUNvbnRyb2xsZXJ9IGNvbnRyb2xsZXIgYSBkYXRhIHN0b3JhZ2UuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldExvY2FsRGF0YXN0b3JlQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0TG9jYWxEYXRhc3RvcmVDb250cm9sbGVyKGNvbnRyb2xsZXIpO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJucyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGN1cnJlbnQgc2VydmVyJ3MgaGVhbHRoXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBnZXRTZXJ2ZXJIZWFsdGgoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkucmVxdWVzdCgnR0VUJywgJ2hlYWx0aCcpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5hcHBsaWNhdGlvbklkXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBhcHBsaWNhdGlvbklkKHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdBUFBMSUNBVElPTl9JRCcsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IGFwcGxpY2F0aW9uSWQoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQVBQTElDQVRJT05fSUQnKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge3N0cmluZ30gUGFyc2UuamF2YVNjcmlwdEtleVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgamF2YVNjcmlwdEtleSh2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnSkFWQVNDUklQVF9LRVknLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBqYXZhU2NyaXB0S2V5KCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0pBVkFTQ1JJUFRfS0VZJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtzdHJpbmd9IFBhcnNlLm1hc3RlcktleVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgbWFzdGVyS2V5KHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdNQVNURVJfS0VZJywgdmFsdWUpO1xuICB9LFxuICBnZXQgbWFzdGVyS2V5KCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ01BU1RFUl9LRVknKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge3N0cmluZ30gUGFyc2Uuc2VydmVyVVJMXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBzZXJ2ZXJVUkwodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ1NFUlZFUl9VUkwnLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBzZXJ2ZXJVUkwoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX1VSTCcpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7c3RyaW5nfSBQYXJzZS5zZXJ2ZXJBdXRoVG9rZW5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IHNlcnZlckF1dGhUb2tlbih2YWx1ZSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldCgnU0VSVkVSX0FVVEhfVE9LRU4nLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBzZXJ2ZXJBdXRoVG9rZW4oKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX0FVVEhfVE9LRU4nKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge3N0cmluZ30gUGFyc2Uuc2VydmVyQXV0aFR5cGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IHNlcnZlckF1dGhUeXBlKHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdTRVJWRVJfQVVUSF9UWVBFJywgdmFsdWUpO1xuICB9LFxuICBnZXQgc2VydmVyQXV0aFR5cGUoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX0FVVEhfVFlQRScpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7UGFyc2VMaXZlUXVlcnl9IFBhcnNlLkxpdmVRdWVyeVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzZXQgTGl2ZVF1ZXJ5KGxpdmVRdWVyeSkge1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldExpdmVRdWVyeShsaXZlUXVlcnkpO1xuICB9LFxuICBnZXQgTGl2ZVF1ZXJ5KCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMaXZlUXVlcnkoKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge3N0cmluZ30gUGFyc2UubGl2ZVF1ZXJ5U2VydmVyVVJMXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBsaXZlUXVlcnlTZXJ2ZXJVUkwodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0xJVkVRVUVSWV9TRVJWRVJfVVJMJywgdmFsdWUpO1xuICB9LFxuICBnZXQgbGl2ZVF1ZXJ5U2VydmVyVVJMKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0xJVkVRVUVSWV9TRVJWRVJfVVJMJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtib29sZWFufSBQYXJzZS5lbmNyeXB0ZWRVc2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBlbmNyeXB0ZWRVc2VyKHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdFTkNSWVBURURfVVNFUicsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IGVuY3J5cHRlZFVzZXIoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRU5DUllQVEVEX1VTRVInKTtcbiAgfSxcbiAgLyoqXG4gICAqIEBtZW1iZXIge3N0cmluZ30gUGFyc2Uuc2VjcmV0XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBzZWNyZXQodmFsdWUpIHtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0VOQ1JZUFRFRF9LRVknLCB2YWx1ZSk7XG4gIH0sXG4gIGdldCBzZWNyZXQoKSB7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRU5DUllQVEVEX0tFWScpO1xuICB9LFxuICAvKipcbiAgICogQG1lbWJlciB7Ym9vbGVhbn0gUGFyc2UuaWRlbXBvdGVuY3lcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc2V0IGlkZW1wb3RlbmN5KHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdJREVNUE9URU5DWScsIHZhbHVlKTtcbiAgfSxcbiAgZ2V0IGlkZW1wb3RlbmN5KCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0lERU1QT1RFTkNZJyk7XG4gIH0sXG4gIC8qKlxuICAgKiBAbWVtYmVyIHtib29sZWFufSBQYXJzZS5hbGxvd0N1c3RvbU9iamVjdElkXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHNldCBhbGxvd0N1c3RvbU9iamVjdElkKHZhbHVlKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdBTExPV19DVVNUT01fT0JKRUNUX0lEJywgdmFsdWUpO1xuICB9LFxuICBnZXQgYWxsb3dDdXN0b21PYmplY3RJZCgpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBTExPV19DVVNUT01fT0JKRUNUX0lEJyk7XG4gIH0sXG4gIF9yZXF1ZXN0KCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkucmVxdWVzdC5hcHBseShudWxsLCBhcmdzKTtcbiAgfSxcbiAgX2FqYXgoKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLmFqYXguYXBwbHkobnVsbCwgYXJncyk7XG4gIH0sXG4gIC8vIFdlIGF0dGVtcHQgdG8gbWF0Y2ggdGhlIHNpZ25hdHVyZXMgb2YgdGhlIGxlZ2FjeSB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzXG4gIF9kZWNvZGUoXywgdmFsdWUpIHtcbiAgICByZXR1cm4gKDAsIF9kZWNvZGUyLmRlZmF1bHQpKHZhbHVlKTtcbiAgfSxcbiAgX2VuY29kZSh2YWx1ZSwgXywgZGlzYWxsb3dPYmplY3RzKSB7XG4gICAgcmV0dXJuICgwLCBfZW5jb2RlMi5kZWZhdWx0KSh2YWx1ZSwgZGlzYWxsb3dPYmplY3RzKTtcbiAgfSxcbiAgX2dldEluc3RhbGxhdGlvbklkKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRJbnN0YWxsYXRpb25Db250cm9sbGVyKCkuY3VycmVudEluc3RhbGxhdGlvbklkKCk7XG4gIH0sXG4gIC8qKlxuICAgKiBFbmFibGUgcGlubmluZyBpbiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGBQYXJzZS5pbml0aWFsaXplYCBpbiB5b3VyIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gW3BvbGxpbmddIEFsbG93IHBpbmdpbmcgdGhlIHNlcnZlciAvaGVhbHRoIGVuZHBvaW50LiBEZWZhdWx0IHRydWVcbiAgICogQHBhcmFtIFttc10gTWlsbGlzZWNvbmRzIHRvIHBpbmcgdGhlIHNlcnZlci4gRGVmYXVsdCAyMDAwbXNcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSB7XG4gICAgbGV0IHBvbGxpbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gICAgbGV0IG1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAyMDAwO1xuICAgIGlmICghdGhpcy5hcHBsaWNhdGlvbklkKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIidlbmFibGVMb2NhbERhdGFTdG9yZScgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgJ2luaXRpYWxpemUnXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuTG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICB0aGlzLkxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCA9IHRydWU7XG4gICAgICBpZiAocG9sbGluZykge1xuICAgICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudHVhbGx5UXVldWUoKS5wb2xsKG1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgTG9jYWwgRGF0YXN0b3JlIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0xvY2FsRGF0YXN0b3JlRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5Mb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQ7XG4gIH0sXG4gIC8qKlxuICAgKiBHZXRzIGFsbCBjb250ZW50cyBmcm9tIExvY2FsIERhdGFzdG9yZVxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5kdW1wTG9jYWxEYXRhc3RvcmUoKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIGR1bXBMb2NhbERhdGFzdG9yZSgpIHtcbiAgICBpZiAoIXRoaXMuTG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICBjb25zb2xlLmxvZygnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoe30pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUGFyc2UuTG9jYWxEYXRhc3RvcmUuX2dldEFsbENvbnRlbnRzKCk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogRW5hYmxlIHRoZSBjdXJyZW50IHVzZXIgZW5jcnlwdGlvbi5cbiAgICogVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgbG9naW4gYW55IHVzZXIuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIGVuYWJsZUVuY3J5cHRlZFVzZXIoKSB7XG4gICAgdGhpcy5lbmNyeXB0ZWRVc2VyID0gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBFbmNyeXB0ZWQgVXNlciBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNFbmNyeXB0ZWRVc2VyRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbmNyeXB0ZWRVc2VyO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UkVTVENvbnRyb2xsZXIoX1JFU1RDb250cm9sbGVyLmRlZmF1bHQpO1xuLy8gRm9yIGxlZ2FjeSByZXF1aXJlcywgb2YgdGhlIGZvcm0gYHZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlJykuUGFyc2VgXG5QYXJzZS5QYXJzZSA9IFBhcnNlO1xubW9kdWxlLmV4cG9ydHMgPSBQYXJzZTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbmNvbnN0IFBVQkxJQ19LRVkgPSAnKic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBBQ0wuXG4gKiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIEFDTCBoYXMgbm8gcGVybWlzc2lvbnMgZm9yIGFueW9uZS5cbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIFBhcnNlLlVzZXIsIHRoZSBBQ0wgd2lsbCBoYXZlIHJlYWQgYW5kIHdyaXRlXG4gKiAgIHBlcm1pc3Npb24gZm9yIG9ubHkgdGhhdCB1c2VyLlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGFueSBvdGhlciBKU09OIG9iamVjdCwgdGhhdCBvYmplY3Qgd2lsbCBiZSBpbnRlcnByZXR0ZWRcbiAqICAgYXMgYSBzZXJpYWxpemVkIEFDTCBjcmVhdGVkIHdpdGggdG9KU09OKCkuXG4gKlxuICogPHA+QW4gQUNMLCBvciBBY2Nlc3MgQ29udHJvbCBMaXN0IGNhbiBiZSBhZGRlZCB0byBhbnlcbiAqIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4gdG8gcmVzdHJpY3QgYWNjZXNzIHRvIG9ubHkgYSBzdWJzZXQgb2YgdXNlcnNcbiAqIG9mIHlvdXIgYXBwbGljYXRpb24uPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5BQ0xcbiAqL1xuY2xhc3MgUGFyc2VBQ0wge1xuICAvKipcbiAgICogQHBhcmFtIHsoUGFyc2UuVXNlciB8IG9iamVjdCl9IGFyZzEgVGhlIHVzZXIgdG8gaW5pdGlhbGl6ZSB0aGUgQUNMIGZvclxuICAgKi9cbiAgY29uc3RydWN0b3IoYXJnMSkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicGVybWlzc2lvbnNCeUlkXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5wZXJtaXNzaW9uc0J5SWQgPSB7fTtcbiAgICBpZiAoYXJnMSAmJiB0eXBlb2YgYXJnMSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IFBhcnNlVXNlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlVXNlcigpO1xuICAgICAgaWYgKGFyZzEgaW5zdGFuY2VvZiBQYXJzZVVzZXIpIHtcbiAgICAgICAgdGhpcy5zZXRSZWFkQWNjZXNzKGFyZzEsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFdyaXRlQWNjZXNzKGFyZzEsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCB1c2VySWQgaW4gYXJnMSkge1xuICAgICAgICAgIGNvbnN0IGFjY2Vzc0xpc3QgPSBhcmcxW3VzZXJJZF07XG4gICAgICAgICAgdGhpcy5wZXJtaXNzaW9uc0J5SWRbdXNlcklkXSA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBpbiBhY2Nlc3NMaXN0KSB7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkID0gYWNjZXNzTGlzdFtwZXJtaXNzaW9uXTtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uICE9PSAncmVhZCcgJiYgcGVybWlzc2lvbiAhPT0gJ3dyaXRlJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBjcmVhdGUgYW4gQUNMIHdpdGggYW4gaW52YWxpZCBwZXJtaXNzaW9uIHR5cGUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFsbG93ZWQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBjcmVhdGUgYW4gQUNMIHdpdGggYW4gaW52YWxpZCBwZXJtaXNzaW9uIHZhbHVlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uc0J5SWRbdXNlcklkXVtwZXJtaXNzaW9uXSA9IGFsbG93ZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnMSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGFyc2VBQ0wgY29uc3RydWN0ZWQgd2l0aCBhIGZ1bmN0aW9uLiBEaWQgeW91IGZvcmdldCAoKT8nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04tZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBBQ0wuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHAgaW4gdGhpcy5wZXJtaXNzaW9uc0J5SWQpIHtcbiAgICAgIHBlcm1pc3Npb25zW3BdID0gdGhpcy5wZXJtaXNzaW9uc0J5SWRbcF07XG4gICAgfVxuICAgIHJldHVybiBwZXJtaXNzaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBBQ0wgaXMgZXF1YWwgdG8gYW5vdGhlciBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZUFDTH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCdzIEFDTCB0byBjb21wYXJlIHRvXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBQYXJzZUFDTCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdXNlcnMgPSAoMCwgX2tleXMuZGVmYXVsdCkodGhpcy5wZXJtaXNzaW9uc0J5SWQpO1xuICAgIGNvbnN0IG90aGVyVXNlcnMgPSAoMCwgX2tleXMuZGVmYXVsdCkob3RoZXIucGVybWlzc2lvbnNCeUlkKTtcbiAgICBpZiAodXNlcnMubGVuZ3RoICE9PSBvdGhlclVzZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHUgaW4gdGhpcy5wZXJtaXNzaW9uc0J5SWQpIHtcbiAgICAgIGlmICghb3RoZXIucGVybWlzc2lvbnNCeUlkW3VdKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25zQnlJZFt1XS5yZWFkICE9PSBvdGhlci5wZXJtaXNzaW9uc0J5SWRbdV0ucmVhZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wZXJtaXNzaW9uc0J5SWRbdV0ud3JpdGUgIT09IG90aGVyLnBlcm1pc3Npb25zQnlJZFt1XS53cml0ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIF9zZXRBY2Nlc3MoYWNjZXNzVHlwZSwgdXNlcklkLCBhbGxvd2VkKSB7XG4gICAgY29uc3QgUGFyc2VSb2xlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VSb2xlKCk7XG4gICAgY29uc3QgUGFyc2VVc2VyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VVc2VyKCk7XG4gICAgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIFBhcnNlVXNlcikge1xuICAgICAgdXNlcklkID0gdXNlcklkLmlkO1xuICAgIH0gZWxzZSBpZiAodXNlcklkIGluc3RhbmNlb2YgUGFyc2VSb2xlKSB7XG4gICAgICBjb25zdCBuYW1lID0gdXNlcklkLmdldE5hbWUoKTtcbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSb2xlIG11c3QgaGF2ZSBhIG5hbWUnKTtcbiAgICAgIH1cbiAgICAgIHVzZXJJZCA9ICdyb2xlOicgKyBuYW1lO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHVzZXJJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VzZXJJZCBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFsbG93ZWQgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYWxsb3dlZCBtdXN0IGJlIGVpdGhlciB0cnVlIG9yIGZhbHNlLicpO1xuICAgIH1cbiAgICBsZXQgcGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zQnlJZFt1c2VySWRdO1xuICAgIGlmICghcGVybWlzc2lvbnMpIHtcbiAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICAvLyBUaGUgdXNlciBhbHJlYWR5IGRvZXNuJ3QgaGF2ZSB0aGlzIHBlcm1pc3Npb24sIHNvIG5vIGFjdGlvbiBpcyBuZWVkZWRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVybWlzc2lvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uc0J5SWRbdXNlcklkXSA9IHBlcm1pc3Npb25zO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsb3dlZCkge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc0J5SWRbdXNlcklkXVthY2Nlc3NUeXBlXSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBwZXJtaXNzaW9uc1thY2Nlc3NUeXBlXTtcbiAgICAgIGlmICgoMCwgX2tleXMuZGVmYXVsdCkocGVybWlzc2lvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy5wZXJtaXNzaW9uc0J5SWRbdXNlcklkXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2dldEFjY2VzcyhhY2Nlc3NUeXBlLCB1c2VySWQpIHtcbiAgICBjb25zdCBQYXJzZVJvbGUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVJvbGUoKTtcbiAgICBjb25zdCBQYXJzZVVzZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVVzZXIoKTtcbiAgICBpZiAodXNlcklkIGluc3RhbmNlb2YgUGFyc2VVc2VyKSB7XG4gICAgICB1c2VySWQgPSB1c2VySWQuaWQ7XG4gICAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgYWNjZXNzIGZvciBhIFBhcnNlVXNlciB3aXRob3V0IGFuIElEJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh1c2VySWQgaW5zdGFuY2VvZiBQYXJzZVJvbGUpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB1c2VySWQuZ2V0TmFtZSgpO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JvbGUgbXVzdCBoYXZlIGEgbmFtZScpO1xuICAgICAgfVxuICAgICAgdXNlcklkID0gJ3JvbGU6JyArIG5hbWU7XG4gICAgfVxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc0J5SWRbdXNlcklkXTtcbiAgICBpZiAoIXBlcm1pc3Npb25zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIXBlcm1pc3Npb25zW2FjY2Vzc1R5cGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpcyBhbGxvd2VkIHRvIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCBXaGV0aGVyIHRoYXQgdXNlciBzaG91bGQgaGF2ZSByZWFkIGFjY2Vzcy5cbiAgICovXG4gIHNldFJlYWRBY2Nlc3ModXNlcklkLCBhbGxvd2VkKSB7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCdyZWFkJywgdXNlcklkLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpZCBpcyAqZXhwbGljaXRseSogYWxsb3dlZCB0byByZWFkIHRoaXMgb2JqZWN0LlxuICAgKiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHVzZXIgbWF5IHN0aWxsIGJlIGFibGUgdG8gYWNjZXNzIGl0IGlmXG4gICAqIGdldFB1YmxpY1JlYWRBY2Nlc3MgcmV0dXJucyB0cnVlIG9yIGEgcm9sZSB0aGF0IHRoZSB1c2VyIGJlbG9uZ3MgdG8gaGFzXG4gICAqIHdyaXRlIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZCwgb3IgYSBQYXJzZS5Sb2xlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFJlYWRBY2Nlc3ModXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcygncmVhZCcsIHVzZXJJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlkIGlzIGFsbG93ZWQgdG8gd3JpdGUgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQsIG9yIGEgUGFyc2UuUm9sZS4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCBXaGV0aGVyIHRoYXQgdXNlciBzaG91bGQgaGF2ZSB3cml0ZSBhY2Nlc3MuXG4gICAqL1xuICBzZXRXcml0ZUFjY2Vzcyh1c2VySWQsIGFsbG93ZWQpIHtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ3dyaXRlJywgdXNlcklkLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaWQgaXMgKmV4cGxpY2l0bHkqIGFsbG93ZWQgdG8gd3JpdGUgdGhpcyBvYmplY3QuXG4gICAqIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgdXNlciBtYXkgc3RpbGwgYmUgYWJsZSB0byB3cml0ZSBpdCBpZlxuICAgKiBnZXRQdWJsaWNXcml0ZUFjY2VzcyByZXR1cm5zIHRydWUgb3IgYSByb2xlIHRoYXQgdGhlIHVzZXIgYmVsb25ncyB0byBoYXNcbiAgICogd3JpdGUgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0V3JpdGVBY2Nlc3ModXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEFjY2Vzcygnd3JpdGUnLCB1c2VySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gcmVhZCB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkXG4gICAqL1xuICBzZXRQdWJsaWNSZWFkQWNjZXNzKGFsbG93ZWQpIHtcbiAgICB0aGlzLnNldFJlYWRBY2Nlc3MoUFVCTElDX0tFWSwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byByZWFkIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFB1YmxpY1JlYWRBY2Nlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVhZEFjY2VzcyhQVUJMSUNfS0VZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHdyaXRlIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWRcbiAgICovXG4gIHNldFB1YmxpY1dyaXRlQWNjZXNzKGFsbG93ZWQpIHtcbiAgICB0aGlzLnNldFdyaXRlQWNjZXNzKFBVQkxJQ19LRVksIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gd3JpdGUgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0UHVibGljV3JpdGVBY2Nlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V3JpdGVBY2Nlc3MoUFVCTElDX0tFWSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byByZWFkIHRoaXMgb2JqZWN0LiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvbGUgbWF5XG4gICAqIHN0aWxsIGJlIGFibGUgdG8gd3JpdGUgaXQgaWYgYSBwYXJlbnQgcm9sZSBoYXMgcmVhZCBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgcm9sZSBoYXMgcmVhZCBhY2Nlc3MuIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIGdldFJvbGVSZWFkQWNjZXNzKHJvbGUpIHtcbiAgICBjb25zdCBQYXJzZVJvbGUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVJvbGUoKTtcbiAgICBpZiAocm9sZSBpbnN0YW5jZW9mIFBhcnNlUm9sZSkge1xuICAgICAgLy8gTm9ybWFsaXplIHRvIHRoZSBTdHJpbmcgbmFtZVxuICAgICAgcm9sZSA9IHJvbGUuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJvbGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyb2xlIG11c3QgYmUgYSBQYXJzZVJvbGUgb3IgYSBTdHJpbmcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVhZEFjY2Vzcygncm9sZTonICsgcm9sZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byB3cml0ZSB0aGlzIG9iamVjdC4gRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSByb2xlIG1heVxuICAgKiBzdGlsbCBiZSBhYmxlIHRvIHdyaXRlIGl0IGlmIGEgcGFyZW50IHJvbGUgaGFzIHdyaXRlIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSByb2xlIGhhcyB3cml0ZSBhY2Nlc3MuIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIGdldFJvbGVXcml0ZUFjY2Vzcyhyb2xlKSB7XG4gICAgY29uc3QgUGFyc2VSb2xlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VSb2xlKCk7XG4gICAgaWYgKHJvbGUgaW5zdGFuY2VvZiBQYXJzZVJvbGUpIHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0byB0aGUgU3RyaW5nIG5hbWVcbiAgICAgIHJvbGUgPSByb2xlLmdldE5hbWUoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByb2xlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm9sZSBtdXN0IGJlIGEgUGFyc2VSb2xlIG9yIGEgU3RyaW5nJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFdyaXRlQWNjZXNzKCdyb2xlOicgKyByb2xlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHJlYWQgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGUgZ2l2ZW4gcm9sZSBjYW4gcmVhZCB0aGlzIG9iamVjdC5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIHNldFJvbGVSZWFkQWNjZXNzKHJvbGUsIGFsbG93ZWQpIHtcbiAgICBjb25zdCBQYXJzZVJvbGUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVJvbGUoKTtcbiAgICBpZiAocm9sZSBpbnN0YW5jZW9mIFBhcnNlUm9sZSkge1xuICAgICAgLy8gTm9ybWFsaXplIHRvIHRoZSBTdHJpbmcgbmFtZVxuICAgICAgcm9sZSA9IHJvbGUuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJvbGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyb2xlIG11c3QgYmUgYSBQYXJzZVJvbGUgb3IgYSBTdHJpbmcnKTtcbiAgICB9XG4gICAgdGhpcy5zZXRSZWFkQWNjZXNzKCdyb2xlOicgKyByb2xlLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHdyaXRlIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhlIGdpdmVuIHJvbGUgY2FuIHdyaXRlIHRoaXMgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHJvbGUgaXMgbmVpdGhlciBhIFBhcnNlLlJvbGUgbm9yIGEgU3RyaW5nLlxuICAgKi9cbiAgc2V0Um9sZVdyaXRlQWNjZXNzKHJvbGUsIGFsbG93ZWQpIHtcbiAgICBjb25zdCBQYXJzZVJvbGUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVJvbGUoKTtcbiAgICBpZiAocm9sZSBpbnN0YW5jZW9mIFBhcnNlUm9sZSkge1xuICAgICAgLy8gTm9ybWFsaXplIHRvIHRoZSBTdHJpbmcgbmFtZVxuICAgICAgcm9sZSA9IHJvbGUuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJvbGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyb2xlIG11c3QgYmUgYSBQYXJzZVJvbGUgb3IgYSBTdHJpbmcnKTtcbiAgICB9XG4gICAgdGhpcy5zZXRXcml0ZUFjY2Vzcygncm9sZTonICsgcm9sZSwgYWxsb3dlZCk7XG4gIH1cbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlQUNMOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvbWFwXCIpKTtcbnZhciBfZW50cmllcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZW50cmllc1wiKSk7XG52YXIgX2Fzc2lnbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2Fzc2lnblwiKSk7XG52YXIgX3NsaWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zbGljZVwiKSk7XG52YXIgX2luY2x1ZGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmNsdWRlc1wiKSk7XG52YXIgX2V2ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9ldmVyeVwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9QYXJzZVJvbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUm9sZVwiKSk7XG52YXIgX1BhcnNlVXNlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VVc2VyXCIpKTtcbmNvbnN0IFBVQkxJQ19LRVkgPSAnKic7XG5jb25zdCBWQUxJRF9QRVJNSVNTSU9OUyA9IG5ldyBfbWFwLmRlZmF1bHQoKTtcblZBTElEX1BFUk1JU1NJT05TLnNldCgnZ2V0Jywge30pO1xuVkFMSURfUEVSTUlTU0lPTlMuc2V0KCdmaW5kJywge30pO1xuVkFMSURfUEVSTUlTU0lPTlMuc2V0KCdjb3VudCcsIHt9KTtcblZBTElEX1BFUk1JU1NJT05TLnNldCgnY3JlYXRlJywge30pO1xuVkFMSURfUEVSTUlTU0lPTlMuc2V0KCd1cGRhdGUnLCB7fSk7XG5WQUxJRF9QRVJNSVNTSU9OUy5zZXQoJ2RlbGV0ZScsIHt9KTtcblZBTElEX1BFUk1JU1NJT05TLnNldCgnYWRkRmllbGQnLCB7fSk7XG5jb25zdCBWQUxJRF9QRVJNSVNTSU9OU19FWFRFTkRFRCA9IG5ldyBfbWFwLmRlZmF1bHQoKTtcblZBTElEX1BFUk1JU1NJT05TX0VYVEVOREVELnNldCgncHJvdGVjdGVkRmllbGRzJywge30pO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgQ0xQLlxuICogSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBDTFAgaGFzIG5vIHBlcm1pc3Npb25zIGZvciBhbnlvbmUuXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBQYXJzZS5Vc2VyIG9yIFBhcnNlLlJvbGUsIHRoZSBDTFAgd2lsbCBoYXZlIHJlYWQgYW5kIHdyaXRlXG4gKiAgIHBlcm1pc3Npb24gZm9yIG9ubHkgdGhhdCB1c2VyIG9yIHJvbGUuXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW55IG90aGVyIEpTT04gb2JqZWN0LCB0aGF0IG9iamVjdCB3aWxsIGJlIGludGVycHJldHRlZFxuICogICBhcyBhIHNlcmlhbGl6ZWQgQ0xQIGNyZWF0ZWQgd2l0aCB0b0pTT04oKS5cbiAqXG4gKiA8cD5BIENMUCwgb3IgQ2xhc3MgTGV2ZWwgUGVybWlzc2lvbnMgY2FuIGJlIGFkZGVkIHRvIGFueVxuICogPGNvZGU+UGFyc2UuU2NoZW1hPC9jb2RlPiB0byByZXN0cmljdCBhY2Nlc3MgdG8gb25seSBhIHN1YnNldCBvZiB1c2Vyc1xuICogb2YgeW91ciBhcHBsaWNhdGlvbi48L3A+XG4gKlxuICogPHA+XG4gKiBGb3IgZ2V0L2NvdW50L2ZpbmQvY3JlYXRlL3VwZGF0ZS9kZWxldGUvYWRkRmllbGQgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6XG4gKlxuICogRW50aXR5IGlzIHR5cGUgUGFyc2UuVXNlciBvciBQYXJzZS5Sb2xlIG9yIHN0cmluZ1xuICogUm9sZSBpcyB0eXBlIFBhcnNlLlJvbGUgb3IgTmFtZSBvZiBQYXJzZS5Sb2xlXG4gKlxuICogZ2V0R2V0UmVxdWlyZXNBdXRoZW50aWNhdGlvbigpXG4gKiBzZXRHZXRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRHZXRQb2ludGVyRmllbGRzKClcbiAqIHNldEdldFBvaW50ZXJGaWVsZHMocG9pbnRlckZpZWxkczogc3RyaW5nW10pXG4gKiBnZXRHZXRBY2Nlc3MoZW50aXR5OiBFbnRpdHkpXG4gKiBzZXRHZXRBY2Nlc3MoZW50aXR5OiBFbnRpdHksIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRQdWJsaWNHZXRBY2Nlc3MoKVxuICogc2V0UHVibGljR2V0QWNjZXNzKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRSb2xlR2V0QWNjZXNzKHJvbGU6IFJvbGUpXG4gKiBzZXRSb2xlR2V0QWNjZXNzKHJvbGU6IFJvbGUsIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRGaW5kUmVxdWlyZXNBdXRoZW50aWNhdGlvbigpXG4gKiBzZXRGaW5kUmVxdWlyZXNBdXRoZW50aWNhdGlvbihhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0RmluZFBvaW50ZXJGaWVsZHMoKVxuICogc2V0RmluZFBvaW50ZXJGaWVsZHMocG9pbnRlckZpZWxkczogc3RyaW5nW10pXG4gKiBnZXRGaW5kQWNjZXNzKGVudGl0eTogRW50aXR5KVxuICogc2V0RmluZEFjY2VzcyhlbnRpdHk6IEVudGl0eSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFB1YmxpY0ZpbmRBY2Nlc3MoKVxuICogc2V0UHVibGljRmluZEFjY2VzcyhhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Um9sZUZpbmRBY2Nlc3Mocm9sZTogUm9sZSlcbiAqIHNldFJvbGVGaW5kQWNjZXNzKHJvbGU6IFJvbGUsIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRDb3VudFJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0Q291bnRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRDb3VudFBvaW50ZXJGaWVsZHMoKVxuICogc2V0Q291bnRQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0Q291bnRBY2Nlc3MoZW50aXR5OiBFbnRpdHkpXG4gKiBzZXRDb3VudEFjY2VzcyhlbnRpdHk6IEVudGl0eSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFB1YmxpY0NvdW50QWNjZXNzKClcbiAqIHNldFB1YmxpY0NvdW50QWNjZXNzKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRSb2xlQ291bnRBY2Nlc3Mocm9sZTogUm9sZSlcbiAqIHNldFJvbGVDb3VudEFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Q3JlYXRlUmVxdWlyZXNBdXRoZW50aWNhdGlvbigpXG4gKiBzZXRDcmVhdGVSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRDcmVhdGVQb2ludGVyRmllbGRzKClcbiAqIHNldENyZWF0ZVBvaW50ZXJGaWVsZHMocG9pbnRlckZpZWxkczogc3RyaW5nW10pXG4gKiBnZXRDcmVhdGVBY2Nlc3MoZW50aXR5OiBFbnRpdHkpXG4gKiBzZXRDcmVhdGVBY2Nlc3MoZW50aXR5OiBFbnRpdHksIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRQdWJsaWNDcmVhdGVBY2Nlc3MoKVxuICogc2V0UHVibGljQ3JlYXRlQWNjZXNzKGFsbG93ZWQ6IEJvb2xlYW4pXG4gKiBnZXRSb2xlQ3JlYXRlQWNjZXNzKHJvbGU6IFJvbGUpXG4gKiBzZXRSb2xlQ3JlYXRlQWNjZXNzKHJvbGU6IFJvbGUsIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRVcGRhdGVSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldFVwZGF0ZVJlcXVpcmVzQXV0aGVudGljYXRpb24oYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFVwZGF0ZVBvaW50ZXJGaWVsZHMoKVxuICogc2V0VXBkYXRlUG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldFVwZGF0ZUFjY2VzcyhlbnRpdHk6IEVudGl0eSlcbiAqIHNldFVwZGF0ZUFjY2VzcyhlbnRpdHk6IEVudGl0eSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFB1YmxpY1VwZGF0ZUFjY2VzcygpXG4gKiBzZXRQdWJsaWNVcGRhdGVBY2Nlc3MoYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldFJvbGVVcGRhdGVBY2Nlc3Mocm9sZTogUm9sZSlcbiAqIHNldFJvbGVVcGRhdGVBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIGdldERlbGV0ZVJlcXVpcmVzQXV0aGVudGljYXRpb24oKVxuICogc2V0RGVsZXRlUmVxdWlyZXNBdXRoZW50aWNhdGlvbihhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0RGVsZXRlUG9pbnRlckZpZWxkcygpXG4gKiBzZXREZWxldGVQb2ludGVyRmllbGRzKHBvaW50ZXJGaWVsZHM6IHN0cmluZ1tdKVxuICogZ2V0RGVsZXRlQWNjZXNzKGVudGl0eTogRW50aXR5KVxuICogc2V0RGVsZXRlQWNjZXNzKGVudGl0eTogRW50aXR5LCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0UHVibGljRGVsZXRlQWNjZXNzKClcbiAqIHNldFB1YmxpY0RlbGV0ZUFjY2VzcyhhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Um9sZURlbGV0ZUFjY2Vzcyhyb2xlOiBSb2xlKVxuICogc2V0Um9sZURlbGV0ZUFjY2Vzcyhyb2xlOiBSb2xlLCBhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0QWRkRmllbGRSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKClcbiAqIHNldEFkZEZpZWxkUmVxdWlyZXNBdXRoZW50aWNhdGlvbihhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0QWRkRmllbGRQb2ludGVyRmllbGRzKClcbiAqIHNldEFkZEZpZWxkUG9pbnRlckZpZWxkcyhwb2ludGVyRmllbGRzOiBzdHJpbmdbXSlcbiAqIGdldEFkZEZpZWxkQWNjZXNzKGVudGl0eTogRW50aXR5KVxuICogc2V0QWRkRmllbGRBY2Nlc3MoZW50aXR5OiBFbnRpdHksIGFsbG93ZWQ6IGJvb2xlYW4pXG4gKiBnZXRQdWJsaWNBZGRGaWVsZEFjY2VzcygpXG4gKiBzZXRQdWJsaWNBZGRGaWVsZEFjY2VzcyhhbGxvd2VkOiBib29sZWFuKVxuICogZ2V0Um9sZUFkZEZpZWxkQWNjZXNzKHJvbGU6IFJvbGUpXG4gKiBzZXRSb2xlQWRkRmllbGRBY2Nlc3Mocm9sZTogUm9sZSwgYWxsb3dlZDogYm9vbGVhbilcbiAqIDwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuQ0xQXG4gKi9cbmNsYXNzIFBhcnNlQ0xQIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7KFBhcnNlLlVzZXIgfCBQYXJzZS5Sb2xlIHwgb2JqZWN0KX0gdXNlcklkIFRoZSB1c2VyIHRvIGluaXRpYWxpemUgdGhlIENMUCBmb3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKHVzZXJJZCkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicGVybWlzc2lvbnNNYXBcIiwgdm9pZCAwKTtcbiAgICB0aGlzLnBlcm1pc3Npb25zTWFwID0ge307XG4gICAgLy8gSW5pdGlhbGl6ZSBwZXJtaXNzaW9ucyBNYXAgd2l0aCBkZWZhdWx0IHBlcm1pc3Npb25zXG4gICAgZm9yIChjb25zdCBbb3BlcmF0aW9uLCBncm91cF0gb2YgKDAsIF9lbnRyaWVzLmRlZmF1bHQpKFZBTElEX1BFUk1JU1NJT05TKS5jYWxsKFZBTElEX1BFUk1JU1NJT05TKSkge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtvcGVyYXRpb25dID0gKDAsIF9hc3NpZ24uZGVmYXVsdCkoe30sIGdyb3VwKTtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IG9wZXJhdGlvbi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArICgwLCBfc2xpY2UuZGVmYXVsdCkob3BlcmF0aW9uKS5jYWxsKG9wZXJhdGlvbiwgMSk7XG4gICAgICB0aGlzW2BnZXQke2FjdGlvbn1SZXF1aXJlc0F1dGhlbnRpY2F0aW9uYF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3Mob3BlcmF0aW9uLCAncmVxdWlyZXNBdXRoZW50aWNhdGlvbicpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYHNldCR7YWN0aW9ufVJlcXVpcmVzQXV0aGVudGljYXRpb25gXSA9IGZ1bmN0aW9uIChhbGxvd2VkKSB7XG4gICAgICAgIHRoaXMuX3NldEFjY2VzcyhvcGVyYXRpb24sICdyZXF1aXJlc0F1dGhlbnRpY2F0aW9uJywgYWxsb3dlZCk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgZ2V0JHthY3Rpb259UG9pbnRlckZpZWxkc2BdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKG9wZXJhdGlvbiwgJ3BvaW50ZXJGaWVsZHMnLCBmYWxzZSk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgc2V0JHthY3Rpb259UG9pbnRlckZpZWxkc2BdID0gZnVuY3Rpb24gKHBvaW50ZXJGaWVsZHMpIHtcbiAgICAgICAgdGhpcy5fc2V0QXJyYXlBY2Nlc3Mob3BlcmF0aW9uLCAncG9pbnRlckZpZWxkcycsIHBvaW50ZXJGaWVsZHMpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYGdldCR7YWN0aW9ufUFjY2Vzc2BdID0gZnVuY3Rpb24gKGVudGl0eSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKG9wZXJhdGlvbiwgZW50aXR5KTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BzZXQke2FjdGlvbn1BY2Nlc3NgXSA9IGZ1bmN0aW9uIChlbnRpdHksIGFsbG93ZWQpIHtcbiAgICAgICAgdGhpcy5fc2V0QWNjZXNzKG9wZXJhdGlvbiwgZW50aXR5LCBhbGxvd2VkKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BnZXRQdWJsaWMke2FjdGlvbn1BY2Nlc3NgXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbYGdldCR7YWN0aW9ufUFjY2Vzc2BdKFBVQkxJQ19LRVkpO1xuICAgICAgfTtcbiAgICAgIHRoaXNbYHNldFB1YmxpYyR7YWN0aW9ufUFjY2Vzc2BdID0gZnVuY3Rpb24gKGFsbG93ZWQpIHtcbiAgICAgICAgdGhpc1tgc2V0JHthY3Rpb259QWNjZXNzYF0oUFVCTElDX0tFWSwgYWxsb3dlZCk7XG4gICAgICB9O1xuICAgICAgdGhpc1tgZ2V0Um9sZSR7YWN0aW9ufUFjY2Vzc2BdID0gZnVuY3Rpb24gKHJvbGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbYGdldCR7YWN0aW9ufUFjY2Vzc2BdKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpKTtcbiAgICAgIH07XG4gICAgICB0aGlzW2BzZXRSb2xlJHthY3Rpb259QWNjZXNzYF0gPSBmdW5jdGlvbiAocm9sZSwgYWxsb3dlZCkge1xuICAgICAgICB0aGlzW2BzZXQke2FjdGlvbn1BY2Nlc3NgXSh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSwgYWxsb3dlZCk7XG4gICAgICB9O1xuICAgIH1cbiAgICAvLyBJbml0aWFsaXplIHBlcm1pc3Npb25zIE1hcCB3aXRoIGRlZmF1bHQgZXh0ZW5kZWQgcGVybWlzc2lvbnNcbiAgICBmb3IgKGNvbnN0IFtvcGVyYXRpb24sIGdyb3VwXSBvZiAoMCwgX2VudHJpZXMuZGVmYXVsdCkoVkFMSURfUEVSTUlTU0lPTlNfRVhURU5ERUQpLmNhbGwoVkFMSURfUEVSTUlTU0lPTlNfRVhURU5ERUQpKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl0gPSAoMCwgX2Fzc2lnbi5kZWZhdWx0KSh7fSwgZ3JvdXApO1xuICAgIH1cbiAgICBpZiAodXNlcklkICYmIHR5cGVvZiB1c2VySWQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodXNlcklkIGluc3RhbmNlb2YgX1BhcnNlVXNlci5kZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuc2V0UmVhZEFjY2Vzcyh1c2VySWQsIHRydWUpO1xuICAgICAgICB0aGlzLnNldFdyaXRlQWNjZXNzKHVzZXJJZCwgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIF9QYXJzZVJvbGUuZGVmYXVsdCkge1xuICAgICAgICB0aGlzLnNldFJvbGVSZWFkQWNjZXNzKHVzZXJJZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0Um9sZVdyaXRlQWNjZXNzKHVzZXJJZCwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gaW4gdXNlcklkKSB7XG4gICAgICAgICAgdmFyIF9jb250ZXh0O1xuICAgICAgICAgIGNvbnN0IHVzZXJzID0gdXNlcklkW3Blcm1pc3Npb25dO1xuICAgICAgICAgIGNvbnN0IGlzVmFsaWRQZXJtaXNzaW9uID0gISFWQUxJRF9QRVJNSVNTSU9OUy5nZXQocGVybWlzc2lvbik7XG4gICAgICAgICAgY29uc3QgaXNWYWxpZFBlcm1pc3Npb25FeHRlbmRlZCA9ICEhVkFMSURfUEVSTUlTU0lPTlNfRVhURU5ERUQuZ2V0KHBlcm1pc3Npb24pO1xuICAgICAgICAgIGNvbnN0IGlzVmFsaWRHcm91cFBlcm1pc3Npb24gPSAoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKF9jb250ZXh0ID0gWydyZWFkVXNlckZpZWxkcycsICd3cml0ZVVzZXJGaWVsZHMnXSkuY2FsbChfY29udGV4dCwgcGVybWlzc2lvbik7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwZXJtaXNzaW9uICE9PSAnc3RyaW5nJyB8fCAhKGlzVmFsaWRQZXJtaXNzaW9uIHx8IGlzVmFsaWRQZXJtaXNzaW9uRXh0ZW5kZWQgfHwgaXNWYWxpZEdyb3VwUGVybWlzc2lvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIGNyZWF0ZSBhbiBDTFAgd2l0aCBhbiBpbnZhbGlkIHBlcm1pc3Npb24gdHlwZS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzVmFsaWRHcm91cFBlcm1pc3Npb24pIHtcbiAgICAgICAgICAgIGlmICgoMCwgX2V2ZXJ5LmRlZmF1bHQpKHVzZXJzKS5jYWxsKHVzZXJzLCBwb2ludGVyID0+IHR5cGVvZiBwb2ludGVyID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXSA9IHVzZXJzO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIGNyZWF0ZSBhbiBDTFAgd2l0aCBhbiBpbnZhbGlkIHBlcm1pc3Npb24gdmFsdWUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgdXNlciBpbiB1c2Vycykge1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZCA9IHVzZXJzW3VzZXJdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhbGxvd2VkICE9PSAnYm9vbGVhbicgJiYgIWlzVmFsaWRQZXJtaXNzaW9uRXh0ZW5kZWQgJiYgdXNlciAhPT0gJ3BvaW50ZXJGaWVsZHMnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RyaWVkIHRvIGNyZWF0ZSBhbiBDTFAgd2l0aCBhbiBpbnZhbGlkIHBlcm1pc3Npb24gdmFsdWUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJdID0gYWxsb3dlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB1c2VySWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhcnNlQ0xQIGNvbnN0cnVjdGVkIHdpdGggYSBmdW5jdGlvbi4gRGlkIHlvdSBmb3JnZXQgKCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OLWVuY29kZWQgdmVyc2lvbiBvZiB0aGUgQ0xQLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnBlcm1pc3Npb25zTWFwXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBDTFAgaXMgZXF1YWwgdG8gYW5vdGhlciBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZSB0b1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGVxdWFscyhvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgUGFyc2VDTFApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gKDAsIF9rZXlzLmRlZmF1bHQpKHRoaXMucGVybWlzc2lvbnNNYXApO1xuICAgIGNvbnN0IG90aGVyUGVybWlzc2lvbnMgPSAoMCwgX2tleXMuZGVmYXVsdCkob3RoZXIucGVybWlzc2lvbnNNYXApO1xuICAgIGlmIChwZXJtaXNzaW9ucy5sZW5ndGggIT09IG90aGVyUGVybWlzc2lvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBpbiB0aGlzLnBlcm1pc3Npb25zTWFwKSB7XG4gICAgICBpZiAoIW90aGVyLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXJzID0gKDAsIF9rZXlzLmRlZmF1bHQpKHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl0pO1xuICAgICAgY29uc3Qgb3RoZXJVc2VycyA9ICgwLCBfa2V5cy5kZWZhdWx0KShvdGhlci5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXSk7XG4gICAgICBpZiAodXNlcnMubGVuZ3RoICE9PSBvdGhlclVzZXJzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHVzZXIgaW4gdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXSkge1xuICAgICAgICBpZiAoIW90aGVyLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJdKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJdICE9PSBvdGhlci5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VyXSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBfZ2V0Um9sZU5hbWUocm9sZSkge1xuICAgIGxldCBuYW1lID0gcm9sZTtcbiAgICBpZiAocm9sZSBpbnN0YW5jZW9mIF9QYXJzZVJvbGUuZGVmYXVsdCkge1xuICAgICAgLy8gTm9ybWFsaXplIHRvIHRoZSBTdHJpbmcgbmFtZVxuICAgICAgbmFtZSA9IHJvbGUuZ2V0TmFtZSgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyb2xlIG11c3QgYmUgYSBQYXJzZS5Sb2xlIG9yIGEgU3RyaW5nJyk7XG4gICAgfVxuICAgIHJldHVybiBgcm9sZToke25hbWV9YDtcbiAgfVxuICBfcGFyc2VFbnRpdHkoZW50aXR5KSB7XG4gICAgbGV0IHVzZXJJZCA9IGVudGl0eTtcbiAgICBpZiAodXNlcklkIGluc3RhbmNlb2YgX1BhcnNlVXNlci5kZWZhdWx0KSB7XG4gICAgICB1c2VySWQgPSB1c2VySWQuaWQ7XG4gICAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgYWNjZXNzIGZvciBhIFBhcnNlLlVzZXIgd2l0aG91dCBhbiBpZC4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHVzZXJJZCBpbnN0YW5jZW9mIF9QYXJzZVJvbGUuZGVmYXVsdCkge1xuICAgICAgdXNlcklkID0gdGhpcy5fZ2V0Um9sZU5hbWUodXNlcklkKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1c2VySWQgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXJJZDtcbiAgfVxuICBfc2V0QWNjZXNzKHBlcm1pc3Npb24sIHVzZXJJZCwgYWxsb3dlZCkge1xuICAgIHVzZXJJZCA9IHRoaXMuX3BhcnNlRW50aXR5KHVzZXJJZCk7XG4gICAgaWYgKHR5cGVvZiBhbGxvd2VkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FsbG93ZWQgbXVzdCBiZSBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4nKTtcbiAgICB9XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF07XG4gICAgaWYgKCFwZXJtaXNzaW9ucykge1xuICAgICAgaWYgKCFhbGxvd2VkKSB7XG4gICAgICAgIC8vIFRoZSB1c2VyIGFscmVhZHkgZG9lc24ndCBoYXZlIHRoaXMgcGVybWlzc2lvbiwgc28gbm8gYWN0aW9uIGlzIG5lZWRlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF0gPSB7fTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbG93ZWQpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF07XG4gICAgfVxuICB9XG4gIF9nZXRBY2Nlc3MocGVybWlzc2lvbiwgdXNlcklkKSB7XG4gICAgbGV0IHJldHVybkJvb2xlYW4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG4gICAgdXNlcklkID0gdGhpcy5fcGFyc2VFbnRpdHkodXNlcklkKTtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXTtcbiAgICBpZiAocmV0dXJuQm9vbGVhbikge1xuICAgICAgaWYgKCFwZXJtaXNzaW9ucykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gISF0aGlzLnBlcm1pc3Npb25zTWFwW3Blcm1pc3Npb25dW3VzZXJJZF07XG4gICAgfVxuICAgIHJldHVybiBwZXJtaXNzaW9ucztcbiAgfVxuICBfc2V0QXJyYXlBY2Nlc3MocGVybWlzc2lvbiwgdXNlcklkLCBmaWVsZHMpIHtcbiAgICB1c2VySWQgPSB0aGlzLl9wYXJzZUVudGl0eSh1c2VySWQpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdO1xuICAgIGlmICghcGVybWlzc2lvbnMpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbcGVybWlzc2lvbl1bdXNlcklkXSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIWZpZWxkcyB8fCAoMCwgX2lzQXJyYXkuZGVmYXVsdCkoZmllbGRzKSAmJiBmaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdO1xuICAgIH0gZWxzZSBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGZpZWxkcykgJiYgKDAsIF9ldmVyeS5kZWZhdWx0KShmaWVsZHMpLmNhbGwoZmllbGRzLCBmaWVsZCA9PiB0eXBlb2YgZmllbGQgPT09ICdzdHJpbmcnKSkge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc01hcFtwZXJtaXNzaW9uXVt1c2VySWRdID0gZmllbGRzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaWVsZHMgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIG9yIHVuZGVmaW5lZC4nKTtcbiAgICB9XG4gIH1cbiAgX3NldEdyb3VwUG9pbnRlclBlcm1pc3Npb24ob3BlcmF0aW9uLCBwb2ludGVyRmllbGRzKSB7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5wZXJtaXNzaW9uc01hcFtvcGVyYXRpb25dO1xuICAgIGlmICghZmllbGRzKSB7XG4gICAgICB0aGlzLnBlcm1pc3Npb25zTWFwW29wZXJhdGlvbl0gPSBbXTtcbiAgICB9XG4gICAgaWYgKCFwb2ludGVyRmllbGRzIHx8ICgwLCBfaXNBcnJheS5kZWZhdWx0KShwb2ludGVyRmllbGRzKSAmJiBwb2ludGVyRmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXTtcbiAgICB9IGVsc2UgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShwb2ludGVyRmllbGRzKSAmJiAoMCwgX2V2ZXJ5LmRlZmF1bHQpKHBvaW50ZXJGaWVsZHMpLmNhbGwocG9pbnRlckZpZWxkcywgZmllbGQgPT4gdHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJykpIHtcbiAgICAgIHRoaXMucGVybWlzc2lvbnNNYXBbb3BlcmF0aW9uXSA9IHBvaW50ZXJGaWVsZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7b3BlcmF0aW9ufS5wb2ludGVyRmllbGRzIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyBvciB1bmRlZmluZWQuYCk7XG4gICAgfVxuICB9XG4gIF9nZXRHcm91cFBvaW50ZXJQZXJtaXNzaW9ucyhvcGVyYXRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uc01hcFtvcGVyYXRpb25dIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXNlciBwb2ludGVyIGZpZWxkcyB0byBhbGxvdyBwZXJtaXNzaW9uIGZvciBnZXQvY291bnQvZmluZCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwb2ludGVyRmllbGRzIFVzZXIgcG9pbnRlciBmaWVsZHNcbiAgICovXG4gIHNldFJlYWRVc2VyRmllbGRzKHBvaW50ZXJGaWVsZHMpIHtcbiAgICB0aGlzLl9zZXRHcm91cFBvaW50ZXJQZXJtaXNzaW9uKCdyZWFkVXNlckZpZWxkcycsIHBvaW50ZXJGaWVsZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVXNlciBwb2ludGVyIGZpZWxkc1xuICAgKi9cbiAgZ2V0UmVhZFVzZXJGaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEdyb3VwUG9pbnRlclBlcm1pc3Npb25zKCdyZWFkVXNlckZpZWxkcycpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXNlciBwb2ludGVyIGZpZWxkcyB0byBhbGxvdyBwZXJtaXNzaW9uIGZvciBjcmVhdGUvZGVsZXRlL3VwZGF0ZS9hZGRGaWVsZCBvcGVyYXRpb25zXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBvaW50ZXJGaWVsZHMgVXNlciBwb2ludGVyIGZpZWxkc1xuICAgKi9cbiAgc2V0V3JpdGVVc2VyRmllbGRzKHBvaW50ZXJGaWVsZHMpIHtcbiAgICB0aGlzLl9zZXRHcm91cFBvaW50ZXJQZXJtaXNzaW9uKCd3cml0ZVVzZXJGaWVsZHMnLCBwb2ludGVyRmllbGRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IFVzZXIgcG9pbnRlciBmaWVsZHNcbiAgICovXG4gIGdldFdyaXRlVXNlckZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0R3JvdXBQb2ludGVyUGVybWlzc2lvbnMoJ3dyaXRlVXNlckZpZWxkcycpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpcyBhbGxvd2VkIHRvIHJldHJpZXZlIGZpZWxkcyBmcm9tIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGZpZWxkcyBmaWVsZHMgdG8gYmUgcHJvdGVjdGVkXG4gICAqL1xuICBzZXRQcm90ZWN0ZWRGaWVsZHModXNlcklkLCBmaWVsZHMpIHtcbiAgICB0aGlzLl9zZXRBcnJheUFjY2VzcygncHJvdGVjdGVkRmllbGRzJywgdXNlcklkLCBmaWVsZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYXJyYXkgb2YgZmllbGRzIGFyZSBhY2Nlc3NhYmxlIHRvIHRoaXMgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZCwgb3IgYSBQYXJzZS5Sb2xlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBnZXRQcm90ZWN0ZWRGaWVsZHModXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEFjY2VzcygncHJvdGVjdGVkRmllbGRzJywgdXNlcklkLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlzIGFsbG93ZWQgdG8gcmVhZCBmcm9tIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWQgQW4gaW5zdGFuY2Ugb2YgUGFyc2UuVXNlciBvciBpdHMgb2JqZWN0SWQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCB3aGV0aGVyIHRoYXQgdXNlciBzaG91bGQgaGF2ZSByZWFkIGFjY2Vzcy5cbiAgICovXG4gIHNldFJlYWRBY2Nlc3ModXNlcklkLCBhbGxvd2VkKSB7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCdmaW5kJywgdXNlcklkLCBhbGxvd2VkKTtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ2dldCcsIHVzZXJJZCwgYWxsb3dlZCk7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCdjb3VudCcsIHVzZXJJZCwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdoZXRoZXIgdGhlIGdpdmVuIHVzZXIgaWQgaXMgKmV4cGxpY2l0bHkqIGFsbG93ZWQgdG8gcmVhZCBmcm9tIHRoaXMgY2xhc3MuXG4gICAqIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgdXNlciBtYXkgc3RpbGwgYmUgYWJsZSB0byBhY2Nlc3MgaXQgaWZcbiAgICogZ2V0UHVibGljUmVhZEFjY2VzcyByZXR1cm5zIHRydWUgb3IgYSByb2xlIHRoYXQgdGhlIHVzZXIgYmVsb25ncyB0byBoYXNcbiAgICogd3JpdGUgYWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIEFuIGluc3RhbmNlIG9mIFBhcnNlLlVzZXIgb3IgaXRzIG9iamVjdElkLCBvciBhIFBhcnNlLlJvbGUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZ2V0UmVhZEFjY2Vzcyh1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0QWNjZXNzKCdmaW5kJywgdXNlcklkKSAmJiB0aGlzLl9nZXRBY2Nlc3MoJ2dldCcsIHVzZXJJZCkgJiYgdGhpcy5fZ2V0QWNjZXNzKCdjb3VudCcsIHVzZXJJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiB1c2VyIGlkIGlzIGFsbG93ZWQgdG8gd3JpdGUgdG8gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZCwgb3IgYSBQYXJzZS5Sb2xlLi5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbGxvd2VkIFdoZXRoZXIgdGhhdCB1c2VyIHNob3VsZCBoYXZlIHdyaXRlIGFjY2Vzcy5cbiAgICovXG4gIHNldFdyaXRlQWNjZXNzKHVzZXJJZCwgYWxsb3dlZCkge1xuICAgIHRoaXMuX3NldEFjY2VzcygnY3JlYXRlJywgdXNlcklkLCBhbGxvd2VkKTtcbiAgICB0aGlzLl9zZXRBY2Nlc3MoJ3VwZGF0ZScsIHVzZXJJZCwgYWxsb3dlZCk7XG4gICAgdGhpcy5fc2V0QWNjZXNzKCdkZWxldGUnLCB1c2VySWQsIGFsbG93ZWQpO1xuICAgIHRoaXMuX3NldEFjY2VzcygnYWRkRmllbGQnLCB1c2VySWQsIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgZ2l2ZW4gdXNlciBpZCBpcyAqZXhwbGljaXRseSogYWxsb3dlZCB0byB3cml0ZSB0byB0aGlzIGNsYXNzLlxuICAgKiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHVzZXIgbWF5IHN0aWxsIGJlIGFibGUgdG8gd3JpdGUgaXQgaWZcbiAgICogZ2V0UHVibGljV3JpdGVBY2Nlc3MgcmV0dXJucyB0cnVlIG9yIGEgcm9sZSB0aGF0IHRoZSB1c2VyIGJlbG9uZ3MgdG8gaGFzXG4gICAqIHdyaXRlIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5Vc2VyIG9yIGl0cyBvYmplY3RJZCwgb3IgYSBQYXJzZS5Sb2xlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFdyaXRlQWNjZXNzKHVzZXJJZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRBY2Nlc3MoJ2NyZWF0ZScsIHVzZXJJZCkgJiYgdGhpcy5fZ2V0QWNjZXNzKCd1cGRhdGUnLCB1c2VySWQpICYmIHRoaXMuX2dldEFjY2VzcygnZGVsZXRlJywgdXNlcklkKSAmJiB0aGlzLl9nZXRBY2Nlc3MoJ2FkZEZpZWxkJywgdXNlcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHJlYWQgZnJvbSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWRcbiAgICovXG4gIHNldFB1YmxpY1JlYWRBY2Nlc3MoYWxsb3dlZCkge1xuICAgIHRoaXMuc2V0UmVhZEFjY2VzcyhQVUJMSUNfS0VZLCBhbGxvd2VkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHJlYWQgZnJvbSB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFB1YmxpY1JlYWRBY2Nlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVhZEFjY2VzcyhQVUJMSUNfS0VZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHdyaXRlIHRvIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZFxuICAgKi9cbiAgc2V0UHVibGljV3JpdGVBY2Nlc3MoYWxsb3dlZCkge1xuICAgIHRoaXMuc2V0V3JpdGVBY2Nlc3MoUFVCTElDX0tFWSwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBwdWJsaWMgaXMgYWxsb3dlZCB0byB3cml0ZSB0byB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGdldFB1YmxpY1dyaXRlQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFdyaXRlQWNjZXNzKFBVQkxJQ19LRVkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB0aGUgcHVibGljIGlzIGFsbG93ZWQgdG8gcHJvdGVjdCBmaWVsZHMgaW4gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gZmllbGRzXG4gICAqL1xuICBzZXRQdWJsaWNQcm90ZWN0ZWRGaWVsZHMoZmllbGRzKSB7XG4gICAgdGhpcy5zZXRQcm90ZWN0ZWRGaWVsZHMoUFVCTElDX0tFWSwgZmllbGRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIHB1YmxpYyBpcyBhbGxvd2VkIHRvIHJlYWQgZmllbGRzIGZyb20gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZ2V0UHVibGljUHJvdGVjdGVkRmllbGRzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3RlY3RlZEZpZWxkcyhQVUJMSUNfS0VZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHJlYWQgZnJvbSB0aGlzIGNsYXNzLiBFdmVuIGlmIHRoaXMgcmV0dXJucyBmYWxzZSwgdGhlIHJvbGUgbWF5XG4gICAqIHN0aWxsIGJlIGFibGUgdG8gd3JpdGUgaXQgaWYgYSBwYXJlbnQgcm9sZSBoYXMgcmVhZCBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgcm9sZSBoYXMgcmVhZCBhY2Nlc3MuIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIGdldFJvbGVSZWFkQWNjZXNzKHJvbGUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZWFkQWNjZXNzKHRoaXMuX2dldFJvbGVOYW1lKHJvbGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiByb2xlIGFyZSBhbGxvd2VkXG4gICAqIHRvIHdyaXRlIHRvIHRoaXMgdXNlci4gRXZlbiBpZiB0aGlzIHJldHVybnMgZmFsc2UsIHRoZSByb2xlIG1heVxuICAgKiBzdGlsbCBiZSBhYmxlIHRvIHdyaXRlIGl0IGlmIGEgcGFyZW50IHJvbGUgaGFzIHdyaXRlIGFjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSByb2xlIGhhcyB3cml0ZSBhY2Nlc3MuIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIGdldFJvbGVXcml0ZUFjY2Vzcyhyb2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V3JpdGVBY2Nlc3ModGhpcy5fZ2V0Um9sZU5hbWUocm9sZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gcmVhZCBmcm9tIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93ZWQgV2hldGhlciB0aGUgZ2l2ZW4gcm9sZSBjYW4gcmVhZCB0aGlzIG9iamVjdC5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIHNldFJvbGVSZWFkQWNjZXNzKHJvbGUsIGFsbG93ZWQpIHtcbiAgICB0aGlzLnNldFJlYWRBY2Nlc3ModGhpcy5fZ2V0Um9sZU5hbWUocm9sZSksIGFsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gd3JpdGUgdG8gdGhpcyBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHJvbGUgVGhlIG5hbWUgb2YgdGhlIHJvbGUsIG9yIGEgUGFyc2UuUm9sZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dlZCBXaGV0aGVyIHRoZSBnaXZlbiByb2xlIGNhbiB3cml0ZSB0aGlzIG9iamVjdC5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIHNldFJvbGVXcml0ZUFjY2Vzcyhyb2xlLCBhbGxvd2VkKSB7XG4gICAgdGhpcy5zZXRXcml0ZUFjY2Vzcyh0aGlzLl9nZXRSb2xlTmFtZShyb2xlKSwgYWxsb3dlZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHVzZXJzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgYWxsb3dlZFxuICAgKiB0byBjb3VudCB0byB0aGlzIHVzZXIuIEV2ZW4gaWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgcm9sZSBtYXlcbiAgICogc3RpbGwgYmUgYWJsZSB0byBjb3VudCBpdCBpZiBhIHBhcmVudCByb2xlIGhhcyBjb3VudCBhY2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIFRoZSBuYW1lIG9mIHRoZSByb2xlLCBvciBhIFBhcnNlLlJvbGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgcm9sZSBpcyBuZWl0aGVyIGEgUGFyc2UuUm9sZSBub3IgYSBTdHJpbmcuXG4gICAqL1xuICBnZXRSb2xlUHJvdGVjdGVkRmllbGRzKHJvbGUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm90ZWN0ZWRGaWVsZHModGhpcy5fZ2V0Um9sZU5hbWUocm9sZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciB1c2VycyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHJvbGUgYXJlIGFsbG93ZWRcbiAgICogdG8gc2V0IGFjY2VzcyBmaWVsZCBpbiB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSwgb3IgYSBQYXJzZS5Sb2xlIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gZmllbGRzIEZpZWxkcyB0byBiZSBwcm90ZWN0ZWQgYnkgUm9sZS5cbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiByb2xlIGlzIG5laXRoZXIgYSBQYXJzZS5Sb2xlIG5vciBhIFN0cmluZy5cbiAgICovXG4gIHNldFJvbGVQcm90ZWN0ZWRGaWVsZHMocm9sZSwgZmllbGRzKSB7XG4gICAgdGhpcy5zZXRQcm90ZWN0ZWRGaWVsZHModGhpcy5fZ2V0Um9sZU5hbWUocm9sZSksIGZpZWxkcyk7XG4gIH1cbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlQ0xQOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfZGVjb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZWNvZGVcIikpO1xudmFyIF9lbmNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VuY29kZVwiKSk7XG52YXIgX2VzY2FwZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZXNjYXBlXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1N0b3JhZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VcIikpO1xuLyoqXG4gKiBQYXJzZS5Db25maWcgaXMgYSBsb2NhbCByZXByZXNlbnRhdGlvbiBvZiBjb25maWd1cmF0aW9uIGRhdGEgdGhhdFxuICogY2FuIGJlIHNldCBmcm9tIHRoZSBQYXJzZSBkYXNoYm9hcmQuXG4gKlxuICogQGFsaWFzIFBhcnNlLkNvbmZpZ1xuICovXG5jbGFzcyBQYXJzZUNvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiYXR0cmlidXRlc1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2VzY2FwZWRBdHRyaWJ1dGVzXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgdGhpcy5fZXNjYXBlZEF0dHJpYnV0ZXMgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBnZXQoYXR0cikge1xuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbYXR0cl07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgSFRNTC1lc2NhcGVkIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZXNjYXBlKGF0dHIpIHtcbiAgICBjb25zdCBodG1sID0gdGhpcy5fZXNjYXBlZEF0dHJpYnV0ZXNbYXR0cl07XG4gICAgaWYgKGh0bWwpIHtcbiAgICAgIHJldHVybiBodG1sO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSB0aGlzLmF0dHJpYnV0ZXNbYXR0cl07XG4gICAgbGV0IGVzY2FwZWQgPSAnJztcbiAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgIGVzY2FwZWQgPSAoMCwgX2VzY2FwZS5kZWZhdWx0KSh2YWwudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIHRoaXMuX2VzY2FwZWRBdHRyaWJ1dGVzW2F0dHJdID0gZXNjYXBlZDtcbiAgICByZXR1cm4gZXNjYXBlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50bHktZmV0Y2hlZCBjb25maWd1cmF0aW9uIG9iamVjdCwgZWl0aGVyIGZyb21cbiAgICogbWVtb3J5IG9yIGZyb20gbG9jYWwgc3RvcmFnZSBpZiBuZWNlc3NhcnkuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLkNvbmZpZ30gVGhlIG1vc3QgcmVjZW50bHktZmV0Y2hlZCBQYXJzZS5Db25maWcgaWYgaXRcbiAgICogICAgIGV4aXN0cywgZWxzZSBhbiBlbXB0eSBQYXJzZS5Db25maWcuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0Q29uZmlnQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmN1cnJlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgbmV3IGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZyb20gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggYSBuZXdseS1jcmVhdGVkXG4gICAqICAgICBjb25maWd1cmF0aW9uIG9iamVjdCB3aGVuIHRoZSBnZXQgY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGdldCgpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENvbmZpZ0NvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5nZXQob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB2YWx1ZSBrZXlzIHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJzIFRoZSBjb25maWcgcGFyYW1ldGVycyBhbmQgdmFsdWVzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gbWFzdGVyS2V5T25seUZsYWdzIFRoZSBmbGFncyB0aGF0IGRlZmluZSB3aGV0aGVyIGNvbmZpZyBwYXJhbWV0ZXJzIGxpc3RlZFxuICAgKiBpbiBgYXR0cnNgIHNob3VsZCBiZSByZXRyaWV2YWJsZSBvbmx5IGJ5IHVzaW5nIHRoZSBtYXN0ZXIga2V5LlxuICAgKiBGb3IgZXhhbXBsZTogYHBhcmFtMTogdHJ1ZWAgbWFrZXMgYHBhcmFtMWAgb25seSByZXRyaWV2YWJsZSBieSB1c2luZyB0aGUgbWFzdGVyIGtleS5cbiAgICogSWYgYSBwYXJhbWV0ZXIgaXMgbm90IHByb3ZpZGVkIG9yIHNldCB0byBgZmFsc2VgLCBpdCBjYW4gYmUgcmV0cmlldmVkIHdpdGhvdXRcbiAgICogdXNpbmcgdGhlIG1hc3RlciBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIGEgbmV3bHktY3JlYXRlZFxuICAgKiAgICAgY29uZmlndXJhdGlvbiBvYmplY3Qgb3Igd2l0aCB0aGUgY3VycmVudCB3aXRoIHRoZSB1cGRhdGUuXG4gICAqL1xuICBzdGF0aWMgc2F2ZShhdHRycywgbWFzdGVyS2V5T25seUZsYWdzKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENvbmZpZ0NvbnRyb2xsZXIoKTtcbiAgICAvL1RvIGF2b2lkIGEgbWlzbWF0Y2ggd2l0aCB0aGUgbG9jYWwgYW5kIHRoZSBjbG91ZCBjb25maWcgd2UgZ2V0IGEgbmV3IHZlcnNpb25cbiAgICByZXR1cm4gY29udHJvbGxlci5zYXZlKGF0dHJzLCBtYXN0ZXJLZXlPbmx5RmxhZ3MpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0KHtcbiAgICAgICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gICAgICB9KTtcbiAgICB9LCBlcnJvciA9PiB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgZm9yIHRlc3RpbmdcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXRpYyBfY2xlYXJDYWNoZSgpIHtcbiAgICBjdXJyZW50Q29uZmlnID0gbnVsbDtcbiAgfVxufVxubGV0IGN1cnJlbnRDb25maWcgPSBudWxsO1xuY29uc3QgQ1VSUkVOVF9DT05GSUdfS0VZID0gJ2N1cnJlbnRDb25maWcnO1xuZnVuY3Rpb24gZGVjb2RlUGF5bG9hZChkYXRhKSB7XG4gIHRyeSB7XG4gICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgaWYgKGpzb24gJiYgdHlwZW9mIGpzb24gPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbik7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBjdXJyZW50KCkge1xuICAgIGlmIChjdXJyZW50Q29uZmlnKSB7XG4gICAgICByZXR1cm4gY3VycmVudENvbmZpZztcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gbmV3IFBhcnNlQ29uZmlnKCk7XG4gICAgY29uc3Qgc3RvcmFnZVBhdGggPSBfU3RvcmFnZS5kZWZhdWx0LmdlbmVyYXRlUGF0aChDVVJSRU5UX0NPTkZJR19LRVkpO1xuICAgIGlmICghX1N0b3JhZ2UuZGVmYXVsdC5hc3luYygpKSB7XG4gICAgICBjb25zdCBjb25maWdEYXRhID0gX1N0b3JhZ2UuZGVmYXVsdC5nZXRJdGVtKHN0b3JhZ2VQYXRoKTtcbiAgICAgIGlmIChjb25maWdEYXRhKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkZWNvZGVQYXlsb2FkKGNvbmZpZ0RhdGEpO1xuICAgICAgICBpZiAoYXR0cmlidXRlcykge1xuICAgICAgICAgIGNvbmZpZy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICAgICAgICBjdXJyZW50Q29uZmlnID0gY29uZmlnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gYSBwcm9taXNlIGZvciBhc3luYyBzdG9yYWdlIGNvbnRyb2xsZXJzXG4gICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbUFzeW5jKHN0b3JhZ2VQYXRoKS50aGVuKGNvbmZpZ0RhdGEgPT4ge1xuICAgICAgaWYgKGNvbmZpZ0RhdGEpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGRlY29kZVBheWxvYWQoY29uZmlnRGF0YSk7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgY29uZmlnLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgICAgICAgIGN1cnJlbnRDb25maWcgPSBjb25maWc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSk7XG4gIH0sXG4gIGdldCgpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAnY29uZmlnJywge30sIG9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKCFyZXNwb25zZSB8fCAhcmVzcG9uc2UucGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0pTT04sICdDb25maWcgSlNPTiByZXNwb25zZSBpbnZhbGlkLicpO1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlnID0gbmV3IFBhcnNlQ29uZmlnKCk7XG4gICAgICBjb25maWcuYXR0cmlidXRlcyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBhdHRyIGluIHJlc3BvbnNlLnBhcmFtcykge1xuICAgICAgICBjb25maWcuYXR0cmlidXRlc1thdHRyXSA9ICgwLCBfZGVjb2RlLmRlZmF1bHQpKHJlc3BvbnNlLnBhcmFtc1thdHRyXSk7XG4gICAgICB9XG4gICAgICBjdXJyZW50Q29uZmlnID0gY29uZmlnO1xuICAgICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQuc2V0SXRlbUFzeW5jKF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfQ09ORklHX0tFWSksICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHJlc3BvbnNlLnBhcmFtcykpLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIHNhdmUoYXR0cnMsIG1hc3RlcktleU9ubHlGbGFncykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBlbmNvZGVkQXR0cnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgICAgZW5jb2RlZEF0dHJzW2tleV0gPSAoMCwgX2VuY29kZS5kZWZhdWx0KShhdHRyc1trZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BVVCcsICdjb25maWcnLCB7XG4gICAgICBwYXJhbXM6IGVuY29kZWRBdHRycyxcbiAgICAgIG1hc3RlcktleU9ubHk6IG1hc3RlcktleU9ubHlGbGFnc1xuICAgIH0sIHtcbiAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3VsdCkge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAnRXJyb3Igb2NjdXJlZCB1cGRhdGluZyBDb25maWcuJyk7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRDb25maWdDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlQ29uZmlnOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkyKGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IFBhcnNlLkVycm9yIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBjb2RlIGFuZCBtZXNzYWdlLlxuICpcbiAqIFBhcnNlLkNvcmVNYW5hZ2VyLnNldCgnUEFSU0VfRVJST1JTJywgW3sgY29kZSwgbWVzc2FnZSB9XSkgY2FuIGJlIHVzZSB0byBvdmVycmlkZSBlcnJvciBtZXNzYWdlcy5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuRXJyb3JcbiAqL1xuY2xhc3MgUGFyc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlIEFuIGVycm9yIGNvZGUgY29uc3RhbnQgZnJvbSA8Y29kZT5QYXJzZS5FcnJvcjwvY29kZT4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIEEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY29kZSwgbWVzc2FnZSkge1xuICAgIHZhciBfY29udGV4dDtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KSh0aGlzLCBcImNvZGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KSh0aGlzLCBcIm1lc3NhZ2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KSh0aGlzLCBcIm9iamVjdFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKHRoaXMsIFwiZXJyb3JzXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICBsZXQgY3VzdG9tTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdQQVJTRV9FUlJPUlMnKSkuY2FsbChfY29udGV4dCwgZXJyb3IgPT4ge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09IGNvZGUgJiYgZXJyb3IuY29kZSkge1xuICAgICAgICBjdXN0b21NZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCAnbWVzc2FnZScsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogY3VzdG9tTWVzc2FnZVxuICAgIH0pO1xuICB9XG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnUGFyc2VFcnJvcjogJyArIHRoaXMuY29kZSArICcgJyArIHRoaXMubWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgc29tZSBlcnJvciBvdGhlciB0aGFuIHRob3NlIGVudW1lcmF0ZWQgaGVyZS5cbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IE9USEVSX0NBVVNFXG4gICAqIEBzdGF0aWNcbiAgICovXG59XG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk9USEVSX0NBVVNFXCIsIC0xKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgc29tZXRoaW5nIGhhcyBnb25lIHdyb25nIHdpdGggdGhlIHNlcnZlci5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5URVJOQUxfU0VSVkVSX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCIsIDEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIFBhcnNlIHNlcnZlcnMgZmFpbGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBDT05ORUNUSU9OX0ZBSUxFRFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkNPTk5FQ1RJT05fRkFJTEVEXCIsIDEwMCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGUgc3BlY2lmaWVkIG9iamVjdCBkb2Vzbid0IGV4aXN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBPQkpFQ1RfTk9UX0ZPVU5EXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiT0JKRUNUX05PVF9GT1VORFwiLCAxMDEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgeW91IHRyaWVkIHRvIHF1ZXJ5IHdpdGggYSBkYXRhdHlwZSB0aGF0IGRvZXNuJ3RcbiAqIHN1cHBvcnQgaXQsIGxpa2UgZXhhY3QgbWF0Y2hpbmcgYW4gYXJyYXkgb3Igb2JqZWN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX1FVRVJZXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9RVUVSWVwiLCAxMDIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYSBtaXNzaW5nIG9yIGludmFsaWQgY2xhc3NuYW1lLiBDbGFzc25hbWVzIGFyZVxuICogY2FzZS1zZW5zaXRpdmUuIFRoZXkgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyLCBhbmQgYS16QS1aMC05XyBhcmUgdGhlXG4gKiBvbmx5IHZhbGlkIGNoYXJhY3RlcnMuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfQ0xBU1NfTkFNRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfQ0xBU1NfTkFNRVwiLCAxMDMpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gdW5zcGVjaWZpZWQgb2JqZWN0IGlkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBNSVNTSU5HX09CSkVDVF9JRFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk1JU1NJTkdfT0JKRUNUX0lEXCIsIDEwNCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBpbnZhbGlkIGtleSBuYW1lLiBLZXlzIGFyZSBjYXNlLXNlbnNpdGl2ZS4gVGhleVxuICogbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyLCBhbmQgYS16QS1aMC05XyBhcmUgdGhlIG9ubHkgdmFsaWQgY2hhcmFjdGVycy5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9LRVlfTkFNRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfS0VZX05BTUVcIiwgMTA1KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGEgbWFsZm9ybWVkIHBvaW50ZXIuIFlvdSBzaG91bGQgbm90IHNlZSB0aGlzIHVubGVzc1xuICogeW91IGhhdmUgYmVlbiBtdWNraW5nIGFib3V0IGNoYW5naW5nIGludGVybmFsIFBhcnNlIGNvZGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfUE9JTlRFUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfUE9JTlRFUlwiLCAxMDYpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBiYWRseSBmb3JtZWQgSlNPTiB3YXMgcmVjZWl2ZWQgdXBzdHJlYW0uIFRoaXNcbiAqIGVpdGhlciBpbmRpY2F0ZXMgeW91IGhhdmUgZG9uZSBzb21ldGhpbmcgdW51c3VhbCB3aXRoIG1vZGlmeWluZyBob3dcbiAqIHRoaW5ncyBlbmNvZGUgdG8gSlNPTiwgb3IgdGhlIG5ldHdvcmsgaXMgZmFpbGluZyBiYWRseS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9KU09OXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9KU09OXCIsIDEwNyk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBmZWF0dXJlIHlvdSB0cmllZCB0byBhY2Nlc3MgaXMgb25seVxuICogYXZhaWxhYmxlIGludGVybmFsbHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IENPTU1BTkRfVU5BVkFJTEFCTEVcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJDT01NQU5EX1VOQVZBSUxBQkxFXCIsIDEwOCk7XG4vKipcbiAqIFlvdSBtdXN0IGNhbGwgUGFyc2UuaW5pdGlhbGl6ZSBiZWZvcmUgdXNpbmcgdGhlIFBhcnNlIGxpYnJhcnkuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE5PVF9JTklUSUFMSVpFRFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk5PVF9JTklUSUFMSVpFRFwiLCAxMDkpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIGZpZWxkIHdhcyBzZXQgdG8gYW4gaW5jb25zaXN0ZW50IHR5cGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOQ09SUkVDVF9UWVBFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5DT1JSRUNUX1RZUEVcIiwgMTExKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQgY2hhbm5lbCBuYW1lLiBBIGNoYW5uZWwgbmFtZSBpcyBlaXRoZXJcbiAqIGFuIGVtcHR5IHN0cmluZyAodGhlIGJyb2FkY2FzdCBjaGFubmVsKSBvciBjb250YWlucyBvbmx5IGEtekEtWjAtOV9cbiAqIGNoYXJhY3RlcnMgYW5kIHN0YXJ0cyB3aXRoIGEgbGV0dGVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0NIQU5ORUxfTkFNRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfQ0hBTk5FTF9OQU1FXCIsIDExMik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHB1c2ggaXMgbWlzY29uZmlndXJlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gUFVTSF9NSVNDT05GSUdVUkVEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiUFVTSF9NSVNDT05GSUdVUkVEXCIsIDExNSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBvYmplY3QgaXMgdG9vIGxhcmdlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBPQkpFQ1RfVE9PX0xBUkdFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiT0JKRUNUX1RPT19MQVJHRVwiLCAxMTYpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uIGlzbid0IGFsbG93ZWQgZm9yIGNsaWVudHMuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE9QRVJBVElPTl9GT1JCSURERU5cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJPUEVSQVRJT05fRk9SQklEREVOXCIsIDExOSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGUgcmVzdWx0IHdhcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBDQUNIRV9NSVNTXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiQ0FDSEVfTUlTU1wiLCAxMjApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhbiBpbnZhbGlkIGtleSB3YXMgdXNlZCBpbiBhIG5lc3RlZFxuICogSlNPTk9iamVjdC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9ORVNURURfS0VZXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9ORVNURURfS0VZXCIsIDEyMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGFuIGludmFsaWQgZmlsZW5hbWUgd2FzIHVzZWQgZm9yIFBhcnNlRmlsZS5cbiAqIEEgdmFsaWQgZmlsZSBuYW1lIGNvbnRhaW5zIG9ubHkgYS16QS1aMC05Xy4gY2hhcmFjdGVycyBhbmQgaXMgYmV0d2VlbiAxXG4gKiBhbmQgMTI4IGNoYXJhY3RlcnMuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfRklMRV9OQU1FXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9GSUxFX05BTUVcIiwgMTIyKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIGludmFsaWQgQUNMIHdhcyBwcm92aWRlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9BQ0xcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0FDTFwiLCAxMjMpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdCB0aW1lZCBvdXQgb24gdGhlIHNlcnZlci4gVHlwaWNhbGx5XG4gKiB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0IGlzIHRvbyBleHBlbnNpdmUgdG8gcnVuLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBUSU1FT1VUXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiVElNRU9VVFwiLCAxMjQpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgZW1haWwgYWRkcmVzcyB3YXMgaW52YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9FTUFJTF9BRERSRVNTXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9FTUFJTF9BRERSRVNTXCIsIDEyNSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhIG1pc3NpbmcgY29udGVudCB0eXBlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBNSVNTSU5HX0NPTlRFTlRfVFlQRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk1JU1NJTkdfQ09OVEVOVF9UWVBFXCIsIDEyNik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhIG1pc3NpbmcgY29udGVudCBsZW5ndGguXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE1JU1NJTkdfQ09OVEVOVF9MRU5HVEhcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJNSVNTSU5HX0NPTlRFTlRfTEVOR1RIXCIsIDEyNyk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBpbnZhbGlkIGNvbnRlbnQgbGVuZ3RoLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0NPTlRFTlRfTEVOR1RIXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9DT05URU5UX0xFTkdUSFwiLCAxMjgpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYSBmaWxlIHRoYXQgd2FzIHRvbyBsYXJnZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRklMRV9UT09fTEFSR0VcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJGSUxFX1RPT19MQVJHRVwiLCAxMjkpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gZXJyb3Igc2F2aW5nIGEgZmlsZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRklMRV9TQVZFX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRklMRV9TQVZFX0VSUk9SXCIsIDEzMCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgdW5pcXVlIGZpZWxkIHdhcyBnaXZlbiBhIHZhbHVlIHRoYXQgaXNcbiAqIGFscmVhZHkgdGFrZW4uXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IERVUExJQ0FURV9WQUxVRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkRVUExJQ0FURV9WQUxVRVwiLCAxMzcpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHJvbGUncyBuYW1lIGlzIGludmFsaWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfUk9MRV9OQU1FXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9ST0xFX05BTUVcIiwgMTM5KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYW4gYXBwbGljYXRpb24gcXVvdGEgd2FzIGV4Y2VlZGVkLiAgVXBncmFkZSB0b1xuICogcmVzb2x2ZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRVhDRUVERURfUVVPVEFcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJFWENFRURFRF9RVU9UQVwiLCAxNDApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIENsb3VkIENvZGUgc2NyaXB0IGZhaWxlZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gU0NSSVBUX0ZBSUxFRFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlNDUklQVF9GQUlMRURcIiwgMTQxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBDbG91ZCBDb2RlIHZhbGlkYXRpb24gZmFpbGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBWQUxJREFUSU9OX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiVkFMSURBVElPTl9FUlJPUlwiLCAxNDIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBpbnZhbGlkIGltYWdlIGRhdGEgd2FzIHByb3ZpZGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX0lNQUdFX0RBVEFcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX0lNQUdFX0RBVEFcIiwgMTQzKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIGFuIHVuc2F2ZWQgZmlsZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gVU5TQVZFRF9GSUxFX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiVU5TQVZFRF9GSUxFX0VSUk9SXCIsIDE1MSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBpbnZhbGlkIHB1c2ggdGltZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9QVVNIX1RJTUVfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1BVU0hfVElNRV9FUlJPUlwiLCAxNTIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgYW4gZXJyb3IgZGVsZXRpbmcgYSBmaWxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBGSUxFX0RFTEVURV9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkZJTEVfREVMRVRFX0VSUk9SXCIsIDE1Myk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBlcnJvciBkZWxldGluZyBhbiB1bm5hbWVkIGZpbGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEZJTEVfREVMRVRFX1VOTkFNRURfRVJST1JcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJGSUxFX0RFTEVURV9VTk5BTUVEX0VSUk9SXCIsIDE2MSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBoYXMgZXhjZWVkZWQgaXRzIHJlcXVlc3RcbiAqIGxpbWl0LlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBSRVFVRVNUX0xJTUlUX0VYQ0VFREVEXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiUkVRVUVTVF9MSU1JVF9FWENFRURFRFwiLCAxNTUpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdCB3YXMgYSBkdXBsaWNhdGUgYW5kIGhhcyBiZWVuIGRpc2NhcmRlZCBkdWUgdG9cbiAqIGlkZW1wb3RlbmN5IHJ1bGVzLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBEVVBMSUNBVEVfUkVRVUVTVFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkRVUExJQ0FURV9SRVFVRVNUXCIsIDE1OSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBpbnZhbGlkIGV2ZW50IG5hbWUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IElOVkFMSURfRVZFTlRfTkFNRVxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfRVZFTlRfTkFNRVwiLCAxNjApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIGZpZWxkIGhhZCBhbiBpbnZhbGlkIHZhbHVlLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX1ZBTFVFXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9WQUxVRVwiLCAxNjIpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlcm5hbWUgaXMgbWlzc2luZyBvciBlbXB0eS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gVVNFUk5BTUVfTUlTU0lOR1xuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlVTRVJOQU1FX01JU1NJTkdcIiwgMjAwKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhc3N3b3JkIGlzIG1pc3Npbmcgb3IgZW1wdHkuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFBBU1NXT1JEX01JU1NJTkdcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJQQVNTV09SRF9NSVNTSU5HXCIsIDIwMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VybmFtZSBoYXMgYWxyZWFkeSBiZWVuIHRha2VuLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBVU0VSTkFNRV9UQUtFTlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIlVTRVJOQU1FX1RBS0VOXCIsIDIwMik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBlbWFpbCBoYXMgYWxyZWFkeSBiZWVuIHRha2VuLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBFTUFJTF9UQUtFTlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkVNQUlMX1RBS0VOXCIsIDIwMyk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBlbWFpbCBpcyBtaXNzaW5nLCBidXQgbXVzdCBiZSBzcGVjaWZpZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEVNQUlMX01JU1NJTkdcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJFTUFJTF9NSVNTSU5HXCIsIDIwNCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgZW1haWwgd2FzIG5vdCBmb3VuZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRU1BSUxfTk9UX0ZPVU5EXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRU1BSUxfTk9UX0ZPVU5EXCIsIDIwNSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGEgdXNlciBvYmplY3Qgd2l0aG91dCBhIHZhbGlkIHNlc3Npb24gY291bGRcbiAqIG5vdCBiZSBhbHRlcmVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBTRVNTSU9OX01JU1NJTkdcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJTRVNTSU9OX01JU1NJTkdcIiwgMjA2KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSB1c2VyIGNhbiBvbmx5IGJlIGNyZWF0ZWQgdGhyb3VnaCBzaWdudXAuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE1VU1RfQ1JFQVRFX1VTRVJfVEhST1VHSF9TSUdOVVBcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJNVVNUX0NSRUFURV9VU0VSX1RIUk9VR0hfU0lHTlVQXCIsIDIwNyk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IGFuIGFuIGFjY291bnQgYmVpbmcgbGlua2VkIGlzIGFscmVhZHkgbGlua2VkXG4gKiB0byBhbm90aGVyIHVzZXIuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEFDQ09VTlRfQUxSRUFEWV9MSU5LRURcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJBQ0NPVU5UX0FMUkVBRFlfTElOS0VEXCIsIDIwOCk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBjdXJyZW50IHNlc3Npb24gdG9rZW4gaXMgaW52YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9TRVNTSU9OX1RPS0VOXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiSU5WQUxJRF9TRVNTSU9OX1RPS0VOXCIsIDIwOSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBlcnJvciBlbmFibGluZyBvciB2ZXJpZnlpbmcgTUZBXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE1GQV9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk1GQV9FUlJPUlwiLCAyMTApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHZhbGlkIE1GQSB0b2tlbiBtdXN0IGJlIHByb3ZpZGVkXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IE1GQV9UT0tFTl9SRVFVSVJFRFxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIk1GQV9UT0tFTl9SRVFVSVJFRFwiLCAyMTEpO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHVzZXIgY2Fubm90IGJlIGxpbmtlZCB0byBhbiBhY2NvdW50IGJlY2F1c2VcbiAqIHRoYXQgYWNjb3VudCdzIGlkIGNvdWxkIG5vdCBiZSBmb3VuZC5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gTElOS0VEX0lEX01JU1NJTkdcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJMSU5LRURfSURfTUlTU0lOR1wiLCAyNTApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHVzZXIgd2l0aCBhIGxpbmtlZCAoZS5nLiBGYWNlYm9vaykgYWNjb3VudFxuICogaGFzIGFuIGludmFsaWQgc2Vzc2lvbi5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gSU5WQUxJRF9MSU5LRURfU0VTU0lPTlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIklOVkFMSURfTElOS0VEX1NFU1NJT05cIiwgMjUxKTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgYSBzZXJ2aWNlIGJlaW5nIGxpbmtlZCAoZS5nLiBGYWNlYm9vayBvclxuICogVHdpdHRlcikgaXMgdW5zdXBwb3J0ZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFVOU1VQUE9SVEVEX1NFUlZJQ0VcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJVTlNVUFBPUlRFRF9TRVJWSUNFXCIsIDI1Mik7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhbiBpbnZhbGlkIG9wZXJhdGlvbiBvY2N1cmVkIG9uIHNjaGVtYVxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBJTlZBTElEX1NDSEVNQV9PUEVSQVRJT05cbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJJTlZBTElEX1NDSEVNQV9PUEVSQVRJT05cIiwgMjU1KTtcbi8qKlxuICogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgd2VyZSBtdWx0aXBsZSBlcnJvcnMuIEFnZ3JlZ2F0ZSBlcnJvcnNcbiAqIGhhdmUgYW4gXCJlcnJvcnNcIiBwcm9wZXJ0eSwgd2hpY2ggaXMgYW4gYXJyYXkgb2YgZXJyb3Igb2JqZWN0cyB3aXRoIG1vcmVcbiAqIGRldGFpbCBhYm91dCBlYWNoIGVycm9yIHRoYXQgb2NjdXJyZWQuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IEFHR1JFR0FURV9FUlJPUlxuICogQHN0YXRpY1xuICovXG4oMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZUVycm9yLCBcIkFHR1JFR0FURV9FUlJPUlwiLCA2MDApO1xuLyoqXG4gKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhlIGNsaWVudCB3YXMgdW5hYmxlIHRvIHJlYWQgYW4gaW5wdXQgZmlsZS5cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gRklMRV9SRUFEX0VSUk9SXG4gKiBAc3RhdGljXG4gKi9cbigwLCBfZGVmaW5lUHJvcGVydHkzLmRlZmF1bHQpKFBhcnNlRXJyb3IsIFwiRklMRV9SRUFEX0VSUk9SXCIsIDYwMSk7XG4vKipcbiAqIEVycm9yIGNvZGUgaW5kaWNhdGluZyBhIHJlYWwgZXJyb3IgY29kZSBpcyB1bmF2YWlsYWJsZSBiZWNhdXNlXG4gKiB3ZSBoYWQgdG8gdXNlIGFuIFhEb21haW5SZXF1ZXN0IG9iamVjdCB0byBhbGxvdyBDT1JTIHJlcXVlc3RzIGluXG4gKiBJbnRlcm5ldCBFeHBsb3Jlciwgd2hpY2ggc3RyaXBzIHRoZSBib2R5IGZyb20gSFRUUCByZXNwb25zZXMgdGhhdCBoYXZlXG4gKiBhIG5vbi0yWFggc3RhdHVzIGNvZGUuXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFhfRE9NQUlOX1JFUVVFU1RcbiAqIEBzdGF0aWNcbiAqL1xuKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VFcnJvciwgXCJYX0RPTUFJTl9SRVFVRVNUXCIsIDYwMik7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZUVycm9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfc2xpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NsaWNlXCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9YaHIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1hoci53ZWFwcFwiKSk7XG4vKiBnbG9iYWwgWE1MSHR0cFJlcXVlc3QsIEJsb2IgKi9cblxubGV0IFhIUiA9IG51bGw7XG5pZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICBYSFIgPSBYTUxIdHRwUmVxdWVzdDtcbn1cbmZ1bmN0aW9uIGI2NERpZ2l0KG51bWJlcikge1xuICBpZiAobnVtYmVyIDwgMjYpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg2NSArIG51bWJlcik7XG4gIH1cbiAgaWYgKG51bWJlciA8IDUyKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoOTcgKyAobnVtYmVyIC0gMjYpKTtcbiAgfVxuICBpZiAobnVtYmVyIDwgNjIpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg0OCArIChudW1iZXIgLSA1MikpO1xuICB9XG4gIGlmIChudW1iZXIgPT09IDYyKSB7XG4gICAgcmV0dXJuICcrJztcbiAgfVxuICBpZiAobnVtYmVyID09PSA2Mykge1xuICAgIHJldHVybiAnLyc7XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gZW5jb2RlIGxhcmdlIGRpZ2l0ICcgKyBudW1iZXIgKyAnIGluIGJhc2U2NC4nKTtcbn1cblxuLyoqXG4gKiBBIFBhcnNlLkZpbGUgaXMgYSBsb2NhbCByZXByZXNlbnRhdGlvbiBvZiBhIGZpbGUgdGhhdCBpcyBzYXZlZCB0byB0aGUgUGFyc2VcbiAqIGNsb3VkLlxuICpcbiAqIEBhbGlhcyBQYXJzZS5GaWxlXG4gKi9cbmNsYXNzIFBhcnNlRmlsZSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gbmFtZSB7U3RyaW5nfSBUaGUgZmlsZSdzIG5hbWUuIFRoaXMgd2lsbCBiZSBwcmVmaXhlZCBieSBhIHVuaXF1ZVxuICAgKiAgICAgdmFsdWUgb25jZSB0aGUgZmlsZSBoYXMgZmluaXNoZWQgc2F2aW5nLiBUaGUgZmlsZSBuYW1lIG11c3QgYmVnaW4gd2l0aFxuICAgKiAgICAgYW4gYWxwaGFudW1lcmljIGNoYXJhY3RlciwgYW5kIGNvbnNpc3Qgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsXG4gICAqICAgICBwZXJpb2RzLCBzcGFjZXMsIHVuZGVyc2NvcmVzLCBvciBkYXNoZXMuXG4gICAqIEBwYXJhbSBkYXRhIHtBcnJheX0gVGhlIGRhdGEgZm9yIHRoZSBmaWxlLCBhcyBlaXRoZXI6XG4gICAqICAgICAxLiBhbiBBcnJheSBvZiBieXRlIHZhbHVlIE51bWJlcnMsIG9yXG4gICAqICAgICAyLiBhbiBPYmplY3QgbGlrZSB7IGJhc2U2NDogXCIuLi5cIiB9IHdpdGggYSBiYXNlNjQtZW5jb2RlZCBTdHJpbmcuXG4gICAqICAgICAzLiBhbiBPYmplY3QgbGlrZSB7IHVyaTogXCIuLi5cIiB9IHdpdGggYSB1cmkgU3RyaW5nLlxuICAgKiAgICAgNC4gYSBGaWxlIG9iamVjdCBzZWxlY3RlZCB3aXRoIGEgZmlsZSB1cGxvYWQgY29udHJvbC4gKDMpIG9ubHkgd29ya3NcbiAgICogICAgICAgIGluIEZpcmVmb3ggMy42KywgU2FmYXJpIDYuMC4yKywgQ2hyb21lIDcrLCBhbmQgSUUgMTArLlxuICAgKiAgICAgICAgRm9yIGV4YW1wbGU6XG4gICAqIDxwcmU+XG4gICAqIHZhciBmaWxlVXBsb2FkQ29udHJvbCA9ICQoXCIjcHJvZmlsZVBob3RvRmlsZVVwbG9hZFwiKVswXTtcbiAgICogaWYgKGZpbGVVcGxvYWRDb250cm9sLmZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICogICB2YXIgZmlsZSA9IGZpbGVVcGxvYWRDb250cm9sLmZpbGVzWzBdO1xuICAgKiAgIHZhciBuYW1lID0gXCJwaG90by5qcGdcIjtcbiAgICogICB2YXIgcGFyc2VGaWxlID0gbmV3IFBhcnNlLkZpbGUobmFtZSwgZmlsZSk7XG4gICAqICAgcGFyc2VGaWxlLnNhdmUoKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgKiAgICAgLy8gVGhlIGZpbGUgaGFzIGJlZW4gc2F2ZWQgdG8gUGFyc2UuXG4gICAqICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICogICAgIC8vIFRoZSBmaWxlIGVpdGhlciBjb3VsZCBub3QgYmUgcmVhZCwgb3IgY291bGQgbm90IGJlIHNhdmVkIHRvIFBhcnNlLlxuICAgKiAgIH0pO1xuICAgKiB9PC9wcmU+XG4gICAqIEBwYXJhbSB0eXBlIHtTdHJpbmd9IE9wdGlvbmFsIENvbnRlbnQtVHlwZSBoZWFkZXIgdG8gdXNlIGZvciB0aGUgZmlsZS4gSWZcbiAgICogICAgIHRoaXMgaXMgb21pdHRlZCwgdGhlIGNvbnRlbnQgdHlwZSB3aWxsIGJlIGluZmVycmVkIGZyb20gdGhlIG5hbWUnc1xuICAgKiAgICAgZXh0ZW5zaW9uLlxuICAgKiBAcGFyYW0gbWV0YWRhdGEge29iamVjdH0gT3B0aW9uYWwga2V5IHZhbHVlIHBhaXJzIHRvIGJlIHN0b3JlZCB3aXRoIGZpbGUgb2JqZWN0XG4gICAqIEBwYXJhbSB0YWdzIHtvYmplY3R9IE9wdGlvbmFsIGtleSB2YWx1ZSBwYWlycyB0byBiZSBzdG9yZWQgd2l0aCBmaWxlIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZSwgZGF0YSwgdHlwZSwgbWV0YWRhdGEsIHRhZ3MpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9uYW1lXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdXJsXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfc291cmNlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfcHJldmlvdXNTYXZlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfZGF0YVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3JlcXVlc3RUYXNrXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfbWV0YWRhdGFcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl90YWdzXCIsIHZvaWQgMCk7XG4gICAgY29uc3Qgc3BlY2lmaWVkVHlwZSA9IHR5cGUgfHwgJyc7XG4gICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fbWV0YWRhdGEgPSBtZXRhZGF0YSB8fCB7fTtcbiAgICB0aGlzLl90YWdzID0gdGFncyB8fCB7fTtcbiAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGRhdGEpKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBQYXJzZUZpbGUuZW5jb2RlQmFzZTY0KGRhdGEpO1xuICAgICAgICB0aGlzLl9zb3VyY2UgPSB7XG4gICAgICAgICAgZm9ybWF0OiAnYmFzZTY0JyxcbiAgICAgICAgICBiYXNlNjQ6IHRoaXMuX2RhdGEsXG4gICAgICAgICAgdHlwZTogc3BlY2lmaWVkVHlwZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgdGhpcy5fc291cmNlID0ge1xuICAgICAgICAgIGZvcm1hdDogJ2ZpbGUnLFxuICAgICAgICAgIGZpbGU6IGRhdGEsXG4gICAgICAgICAgdHlwZTogc3BlY2lmaWVkVHlwZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhLnVyaSA9PT0gJ3N0cmluZycgJiYgZGF0YS51cmkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9zb3VyY2UgPSB7XG4gICAgICAgICAgZm9ybWF0OiAndXJpJyxcbiAgICAgICAgICB1cmk6IGRhdGEudXJpLFxuICAgICAgICAgIHR5cGU6IHNwZWNpZmllZFR5cGVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YS5iYXNlNjQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBfY29udGV4dCwgX2NvbnRleHQyLCBfY29udGV4dDM7XG4gICAgICAgIGNvbnN0IGJhc2U2NCA9ICgwLCBfc2xpY2UuZGVmYXVsdCkoX2NvbnRleHQgPSBkYXRhLmJhc2U2NC5zcGxpdCgnLCcpKS5jYWxsKF9jb250ZXh0LCAtMSlbMF07XG4gICAgICAgIGNvbnN0IGRhdGFUeXBlID0gc3BlY2lmaWVkVHlwZSB8fCAoMCwgX3NsaWNlLmRlZmF1bHQpKF9jb250ZXh0MiA9ICgwLCBfc2xpY2UuZGVmYXVsdCkoX2NvbnRleHQzID0gZGF0YS5iYXNlNjQuc3BsaXQoJzsnKSkuY2FsbChfY29udGV4dDMsIDAsIDEpWzBdLnNwbGl0KCc6JykpLmNhbGwoX2NvbnRleHQyLCAxLCAyKVswXSB8fCAndGV4dC9wbGFpbic7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBiYXNlNjQ7XG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHtcbiAgICAgICAgICBmb3JtYXQ6ICdiYXNlNjQnLFxuICAgICAgICAgIGJhc2U2NCxcbiAgICAgICAgICB0eXBlOiBkYXRhVHlwZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNyZWF0ZSBhIFBhcnNlLkZpbGUgd2l0aCB0aGF0IGRhdGEuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZGF0YSBmb3IgdGhlIGZpbGUsIGRvd25sb2FkaW5nIGl0IGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuXG4gICAqIERhdGEgaXMgcHJlc2VudCBpZiBpbml0aWFsaXplZCB3aXRoIEJ5dGUgQXJyYXksIEJhc2U2NCBvciBTYXZlZCB3aXRoIFVyaS5cbiAgICogRGF0YSBpcyBjbGVhcmVkIGlmIHNhdmVkIHdpdGggRmlsZSBvYmplY3Qgc2VsZWN0ZWQgd2l0aCBhIGZpbGUgdXBsb2FkIGNvbnRyb2xcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlIHdpdGggYmFzZTY0IGRhdGFcbiAgICovXG4gIGFzeW5jIGdldERhdGEoKSB7XG4gICAgaWYgKHRoaXMuX2RhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3VybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmV0cmlldmUgZGF0YSBmb3IgdW5zYXZlZCBQYXJzZUZpbGUuJyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRGaWxlQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRyb2xsZXIuZG93bmxvYWQodGhpcy5fdXJsLCB7XG4gICAgICByZXF1ZXN0VGFzazogdGFzayA9PiB0aGlzLl9yZXF1ZXN0VGFzayA9IHRhc2tcbiAgICB9KTtcbiAgICB0aGlzLl9kYXRhID0gcmVzdWx0LmJhc2U2NDtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiBCZWZvcmUgc2F2ZSBpcyBjYWxsZWQsIHRoaXMgaXMgdGhlIGZpbGVuYW1lXG4gICAqIGdpdmVuIGJ5IHRoZSB1c2VyLiBBZnRlciBzYXZlIGlzIGNhbGxlZCwgdGhhdCBuYW1lIGdldHMgcHJlZml4ZWQgd2l0aCBhXG4gICAqIHVuaXF1ZSBpZGVudGlmaWVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1cmwgb2YgdGhlIGZpbGUuIEl0IGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHlvdSBzYXZlIHRoZSBmaWxlIG9yXG4gICAqIGFmdGVyIHlvdSBnZXQgdGhlIGZpbGUgZnJvbSBhIFBhcnNlLk9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgQW4gb2JqZWN0IHRvIHNwZWNpZnkgdXJsIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mb3JjZVNlY3VyZV0gZm9yY2UgdGhlIHVybCB0byBiZSBzZWN1cmVcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHVybChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKCF0aGlzLl91cmwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZm9yY2VTZWN1cmUpIHtcbiAgICAgIHJldHVybiB0aGlzLl91cmwucmVwbGFjZSgvXmh0dHA6XFwvXFwvL2ksICdodHRwczovLycpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fdXJsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBvZiB0aGUgZmlsZS5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIG1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0YWdzIG9mIHRoZSBmaWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgdGFncygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgZmlsZSB0byB0aGUgUGFyc2UgY2xvdWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+cHJvZ3Jlc3M6IEluIEJyb3dzZXIgb25seSwgY2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcy4gRm9yIGV4YW1wbGU6XG4gICAqIDxwcmU+XG4gICAqIGxldCBwYXJzZUZpbGUgPSBuZXcgUGFyc2UuRmlsZShuYW1lLCBmaWxlKTtcbiAgICogcGFyc2VGaWxlLnNhdmUoe1xuICAgKiAgIHByb2dyZXNzOiAocHJvZ3Jlc3NWYWx1ZSwgbG9hZGVkLCB0b3RhbCwgeyB0eXBlIH0pID0+IHtcbiAgICogICAgIGlmICh0eXBlID09PSBcInVwbG9hZFwiICYmIHByb2dyZXNzVmFsdWUgIT09IG51bGwpIHtcbiAgICogICAgICAgLy8gVXBkYXRlIHRoZSBVSSB1c2luZyBwcm9ncmVzc1ZhbHVlXG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICogPC9wcmU+XG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlIHwgdW5kZWZpbmVkfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgc2F2ZSBmaW5pc2hlcy5cbiAgICovXG4gIHNhdmUob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMucmVxdWVzdFRhc2sgPSB0YXNrID0+IHRoaXMuX3JlcXVlc3RUYXNrID0gdGFzaztcbiAgICBvcHRpb25zLm1ldGFkYXRhID0gdGhpcy5fbWV0YWRhdGE7XG4gICAgb3B0aW9ucy50YWdzID0gdGhpcy5fdGFncztcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RmlsZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoIXRoaXMuX3ByZXZpb3VzU2F2ZSkge1xuICAgICAgaWYgKHRoaXMuX3NvdXJjZS5mb3JtYXQgPT09ICdmaWxlJykge1xuICAgICAgICB0aGlzLl9wcmV2aW91c1NhdmUgPSBjb250cm9sbGVyLnNhdmVGaWxlKHRoaXMuX25hbWUsIHRoaXMuX3NvdXJjZSwgb3B0aW9ucykudGhlbihyZXMgPT4ge1xuICAgICAgICAgIHRoaXMuX25hbWUgPSByZXMubmFtZTtcbiAgICAgICAgICB0aGlzLl91cmwgPSByZXMudXJsO1xuICAgICAgICAgIHRoaXMuX2RhdGEgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZS5mb3JtYXQgPT09ICd1cmknKSB7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU2F2ZSA9IGNvbnRyb2xsZXIuZG93bmxvYWQodGhpcy5fc291cmNlLnVyaSwgb3B0aW9ucykudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmICghKHJlc3VsdCAmJiByZXN1bHQuYmFzZTY0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuZXdTb3VyY2UgPSB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdiYXNlNjQnLFxuICAgICAgICAgICAgYmFzZTY0OiByZXN1bHQuYmFzZTY0LFxuICAgICAgICAgICAgdHlwZTogcmVzdWx0LmNvbnRlbnRUeXBlXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLl9kYXRhID0gcmVzdWx0LmJhc2U2NDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuc2F2ZUJhc2U2NCh0aGlzLl9uYW1lLCBuZXdTb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgICB9KS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5fbmFtZSA9IHJlcy5uYW1lO1xuICAgICAgICAgIHRoaXMuX3VybCA9IHJlcy51cmw7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU2F2ZSA9IGNvbnRyb2xsZXIuc2F2ZUJhc2U2NCh0aGlzLl9uYW1lLCB0aGlzLl9zb3VyY2UsIG9wdGlvbnMpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLl9uYW1lID0gcmVzLm5hbWU7XG4gICAgICAgICAgdGhpcy5fdXJsID0gcmVzLnVybDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5fcHJldmlvdXNTYXZlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJldmlvdXNTYXZlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgdGhlIHJlcXVlc3QgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBzZW50LlxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLl9yZXF1ZXN0VGFzayAmJiB0eXBlb2YgdGhpcy5fcmVxdWVzdFRhc2suYWJvcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RUYXNrLl9hYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3JlcXVlc3RUYXNrLmFib3J0KCk7XG4gICAgfVxuICAgIHRoaXMuX3JlcXVlc3RUYXNrID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSBmaWxlIGZyb20gdGhlIFBhcnNlIGNsb3VkLlxuICAgKiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHkgd2l0aCBNYXN0ZXIgS2V5LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogPHByZT5cbiAgICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHRoZSBkZWxldGUgZmluaXNoZXMuXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBpZiAoIXRoaXMuX25hbWUpIHtcbiAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuRklMRV9ERUxFVEVfVU5OQU1FRF9FUlJPUiwgJ0Nhbm5vdCBkZWxldGUgYW4gdW5uYW1lZCBmaWxlLicpO1xuICAgIH1cbiAgICBjb25zdCBkZXN0cm95T3B0aW9ucyA9IHtcbiAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBkZXN0cm95T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSAhIW9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RmlsZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5kZWxldGVGaWxlKHRoaXMuX25hbWUsIGRlc3Ryb3lPcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX2RhdGEgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9yZXF1ZXN0VGFzayA9IG51bGw7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9KTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ0ZpbGUnLFxuICAgICAgbmFtZTogdGhpcy5fbmFtZSxcbiAgICAgIHVybDogdGhpcy5fdXJsXG4gICAgfTtcbiAgfVxuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAodGhpcyA9PT0gb3RoZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBVbnNhdmVkIEZpbGVzIGFyZSBuZXZlciBlcXVhbCwgc2luY2UgdGhleSB3aWxsIGJlIHNhdmVkIHRvIGRpZmZlcmVudCBVUkxzXG4gICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgUGFyc2VGaWxlICYmIHRoaXMubmFtZSgpID09PSBvdGhlci5uYW1lKCkgJiYgdGhpcy51cmwoKSA9PT0gb3RoZXIudXJsKCkgJiYgdHlwZW9mIHRoaXMudXJsKCkgIT09ICd1bmRlZmluZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbWV0YWRhdGEgdG8gYmUgc2F2ZWQgd2l0aCBmaWxlIG9iamVjdC4gT3ZlcndyaXRlcyBleGlzdGluZyBtZXRhZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gbWV0YWRhdGEgS2V5IHZhbHVlIHBhaXJzIHRvIGJlIHN0b3JlZCB3aXRoIGZpbGUgb2JqZWN0XG4gICAqL1xuICBzZXRNZXRhZGF0YShtZXRhZGF0YSkge1xuICAgIGlmIChtZXRhZGF0YSAmJiB0eXBlb2YgbWV0YWRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX2NvbnRleHQ0O1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NCA9ICgwLCBfa2V5cy5kZWZhdWx0KShtZXRhZGF0YSkpLmNhbGwoX2NvbnRleHQ0LCBrZXkgPT4ge1xuICAgICAgICB0aGlzLmFkZE1ldGFkYXRhKGtleSwgbWV0YWRhdGFba2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBtZXRhZGF0YSB0byBiZSBzYXZlZCB3aXRoIGZpbGUgb2JqZWN0LiBBZGRzIHRvIGV4aXN0aW5nIG1ldGFkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IGtleSB0byBzdG9yZSB0aGUgbWV0YWRhdGFcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBtZXRhZGF0YVxuICAgKi9cbiAgYWRkTWV0YWRhdGEoa2V5LCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fbWV0YWRhdGFba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRhZ3MgdG8gYmUgc2F2ZWQgd2l0aCBmaWxlIG9iamVjdC4gT3ZlcndyaXRlcyBleGlzdGluZyB0YWdzXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB0YWdzIEtleSB2YWx1ZSBwYWlycyB0byBiZSBzdG9yZWQgd2l0aCBmaWxlIG9iamVjdFxuICAgKi9cbiAgc2V0VGFncyh0YWdzKSB7XG4gICAgaWYgKHRhZ3MgJiYgdHlwZW9mIHRhZ3MgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgX2NvbnRleHQ1O1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NSA9ICgwLCBfa2V5cy5kZWZhdWx0KSh0YWdzKSkuY2FsbChfY29udGV4dDUsIGtleSA9PiB7XG4gICAgICAgIHRoaXMuYWRkVGFnKGtleSwgdGFnc1trZXldKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRhZ3MgdG8gYmUgc2F2ZWQgd2l0aCBmaWxlIG9iamVjdC4gQWRkcyB0byBleGlzdGluZyB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IGtleSB0byBzdG9yZSB0YWdzXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgdGFnXG4gICAqL1xuICBhZGRUYWcoa2V5LCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fdGFnc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBmcm9tSlNPTihvYmopIHtcbiAgICBpZiAob2JqLl9fdHlwZSAhPT0gJ0ZpbGUnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdKU09OIG9iamVjdCBkb2VzIG5vdCByZXByZXNlbnQgYSBQYXJzZUZpbGUnKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZSA9IG5ldyBQYXJzZUZpbGUob2JqLm5hbWUpO1xuICAgIGZpbGUuX3VybCA9IG9iai51cmw7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cbiAgc3RhdGljIGVuY29kZUJhc2U2NChieXRlcykge1xuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGNodW5rcy5sZW5ndGggPSBNYXRoLmNlaWwoYnl0ZXMubGVuZ3RoIC8gMyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGIxID0gYnl0ZXNbaSAqIDNdO1xuICAgICAgY29uc3QgYjIgPSBieXRlc1tpICogMyArIDFdIHx8IDA7XG4gICAgICBjb25zdCBiMyA9IGJ5dGVzW2kgKiAzICsgMl0gfHwgMDtcbiAgICAgIGNvbnN0IGhhczIgPSBpICogMyArIDEgPCBieXRlcy5sZW5ndGg7XG4gICAgICBjb25zdCBoYXMzID0gaSAqIDMgKyAyIDwgYnl0ZXMubGVuZ3RoO1xuICAgICAgY2h1bmtzW2ldID0gW2I2NERpZ2l0KGIxID4+IDIgJiAweDNmKSwgYjY0RGlnaXQoYjEgPDwgNCAmIDB4MzAgfCBiMiA+PiA0ICYgMHgwZiksIGhhczIgPyBiNjREaWdpdChiMiA8PCAyICYgMHgzYyB8IGIzID4+IDYgJiAweDAzKSA6ICc9JywgaGFzMyA/IGI2NERpZ2l0KGIzICYgMHgzZikgOiAnPSddLmpvaW4oJycpO1xuICAgIH1cbiAgICByZXR1cm4gY2h1bmtzLmpvaW4oJycpO1xuICB9XG59XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgc2F2ZUZpbGU6IGFzeW5jIGZ1bmN0aW9uIChuYW1lLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICBpZiAoc291cmNlLmZvcm1hdCAhPT0gJ2ZpbGUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NhdmVGaWxlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGaWxlLXR5cGUgc291cmNlcy4nKTtcbiAgICB9XG4gICAgY29uc3QgYmFzZTY0RGF0YSA9IGF3YWl0IG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXMsIHJlaikgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlcyhyZWFkZXIucmVzdWx0KTtcbiAgICAgIHJlYWRlci5vbmVycm9yID0gZXJyb3IgPT4gcmVqKGVycm9yKTtcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHNvdXJjZS5maWxlKTtcbiAgICB9KTtcbiAgICAvLyB3ZSBvbmx5IHdhbnQgdGhlIGRhdGEgYWZ0ZXIgdGhlIGNvbW1hXG4gICAgLy8gRm9yIGV4YW1wbGU6IFwiZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LEpWQkVSaTB4TGpRS0ouLi5cIiB3ZSB3b3VsZCBvbmx5IHdhbnQgXCJKVkJFUmkweExqUUtKLi4uXCJcbiAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBiYXNlNjREYXRhLnNwbGl0KCcsJyk7XG4gICAgLy8gaW4gdGhlIGV2ZW50IHRoZXJlIGlzIG5vICdkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBiYXNlNjQgc3RyaW5nXG4gICAgLy8gdXNlIHRoZSBlbnRpcmUgc3RyaW5nIGluc3RlYWRcbiAgICBjb25zdCBkYXRhID0gc2Vjb25kID8gc2Vjb25kIDogZmlyc3Q7XG4gICAgY29uc3QgbmV3U291cmNlID0ge1xuICAgICAgZm9ybWF0OiAnYmFzZTY0JyxcbiAgICAgIGJhc2U2NDogZGF0YSxcbiAgICAgIHR5cGU6IHNvdXJjZS50eXBlIHx8IChzb3VyY2UuZmlsZSA/IHNvdXJjZS5maWxlLnR5cGUgOiB1bmRlZmluZWQpXG4gICAgfTtcbiAgICByZXR1cm4gYXdhaXQgRGVmYXVsdENvbnRyb2xsZXIuc2F2ZUJhc2U2NChuYW1lLCBuZXdTb3VyY2UsIG9wdGlvbnMpO1xuICB9LFxuICBzYXZlQmFzZTY0OiBmdW5jdGlvbiAobmFtZSwgc291cmNlKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIGlmIChzb3VyY2UuZm9ybWF0ICE9PSAnYmFzZTY0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzYXZlQmFzZTY0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYXNlNjQtdHlwZSBzb3VyY2VzLicpO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYmFzZTY0OiBzb3VyY2UuYmFzZTY0LFxuICAgICAgZmlsZURhdGE6IHtcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLm1ldGFkYXRhXG4gICAgICAgIH0sXG4gICAgICAgIHRhZ3M6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLnRhZ3NcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgZGVsZXRlIG9wdGlvbnMubWV0YWRhdGE7XG4gICAgZGVsZXRlIG9wdGlvbnMudGFncztcbiAgICBpZiAoc291cmNlLnR5cGUpIHtcbiAgICAgIGRhdGEuX0NvbnRlbnRUeXBlID0gc291cmNlLnR5cGU7XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpLnJlcXVlc3QoJ1BPU1QnLCAnZmlsZXMvJyArIG5hbWUsIGRhdGEsIG9wdGlvbnMpO1xuICB9LFxuICBkb3dubG9hZDogZnVuY3Rpb24gKHVyaSwgb3B0aW9ucykge1xuICAgIGlmIChYSFIpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkQWpheCh1cmksIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ0Nhbm5vdCBtYWtlIGEgcmVxdWVzdDogTm8gZGVmaW5pdGlvbiBvZiBYTUxIdHRwUmVxdWVzdCB3YXMgZm91bmQuJyk7XG4gICAgfVxuICB9LFxuICBkb3dubG9hZEFqYXg6IGZ1bmN0aW9uICh1cmksIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgeGhyID0gbmV3IFhIUigpO1xuICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVyaSwgdHJ1ZSk7XG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfTtcbiAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSAhPT0geGhyLkRPTkUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5yZXNwb25zZSk7XG4gICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgIGJhc2U2NDogUGFyc2VGaWxlLmVuY29kZUJhc2U2NChieXRlcyksXG4gICAgICAgICAgY29udGVudFR5cGU6IHhoci5nZXRSZXNwb25zZUhlYWRlcignY29udGVudC10eXBlJylcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgb3B0aW9ucy5yZXF1ZXN0VGFzayh4aHIpO1xuICAgICAgeGhyLnNlbmQoKTtcbiAgICB9KTtcbiAgfSxcbiAgZGVsZXRlRmlsZTogZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ1gtUGFyc2UtQXBwbGljYXRpb24tSUQnOiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FQUExJQ0FUSU9OX0lEJylcbiAgICB9O1xuICAgIGlmIChvcHRpb25zLnVzZU1hc3RlcktleSkge1xuICAgICAgaGVhZGVyc1snWC1QYXJzZS1NYXN0ZXItS2V5J10gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ01BU1RFUl9LRVknKTtcbiAgICB9XG4gICAgbGV0IHVybCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX1VSTCcpO1xuICAgIGlmICh1cmxbdXJsLmxlbmd0aCAtIDFdICE9PSAnLycpIHtcbiAgICAgIHVybCArPSAnLyc7XG4gICAgfVxuICAgIHVybCArPSAnZmlsZXMvJyArIG5hbWU7XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkuYWpheCgnREVMRVRFJywgdXJsLCAnJywgaGVhZGVycykuY2F0Y2gocmVzcG9uc2UgPT4ge1xuICAgICAgLy8gVE9ETzogcmV0dXJuIEpTT04gb2JqZWN0IGluIHNlcnZlclxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZSA9PT0gJ1N5bnRheEVycm9yOiBVbmV4cGVjdGVkIGVuZCBvZiBKU09OIGlucHV0Jykge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5oYW5kbGVFcnJvcihyZXNwb25zZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIF9zZXRYSFIoeGhyKSB7XG4gICAgWEhSID0geGhyO1xuICB9LFxuICBfZ2V0WEhSKCkge1xuICAgIHJldHVybiBYSFI7XG4gIH1cbn07XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRGaWxlQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZUZpbGU7XG5leHBvcnRzLmI2NERpZ2l0ID0gYjY0RGlnaXQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBHZW9Qb2ludCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOjxicj5cbiAqICAgPHByZT5cbiAqICAgbmV3IEdlb1BvaW50KG90aGVyR2VvUG9pbnQpXG4gKiAgIG5ldyBHZW9Qb2ludCgzMCwgMzApXG4gKiAgIG5ldyBHZW9Qb2ludChbMzAsIDMwXSlcbiAqICAgbmV3IEdlb1BvaW50KHtsYXRpdHVkZTogMzAsIGxvbmdpdHVkZTogMzB9KVxuICogICBuZXcgR2VvUG9pbnQoKSAgLy8gZGVmYXVsdHMgdG8gKDAsIDApXG4gKiAgIDwvcHJlPlxuICogPHA+UmVwcmVzZW50cyBhIGxhdGl0dWRlIC8gbG9uZ2l0dWRlIHBvaW50IHRoYXQgbWF5IGJlIGFzc29jaWF0ZWRcbiAqIHdpdGggYSBrZXkgaW4gYSBQYXJzZU9iamVjdCBvciB1c2VkIGFzIGEgcmVmZXJlbmNlIHBvaW50IGZvciBnZW8gcXVlcmllcy5cbiAqIFRoaXMgYWxsb3dzIHByb3hpbWl0eS1iYXNlZCBxdWVyaWVzIG9uIHRoZSBrZXkuPC9wPlxuICpcbiAqIDxwPk9ubHkgb25lIGtleSBpbiBhIGNsYXNzIG1heSBjb250YWluIGEgR2VvUG9pbnQuPC9wPlxuICpcbiAqIDxwPkV4YW1wbGU6PHByZT5cbiAqICAgdmFyIHBvaW50ID0gbmV3IFBhcnNlLkdlb1BvaW50KDMwLjAsIC0yMC4wKTtcbiAqICAgdmFyIG9iamVjdCA9IG5ldyBQYXJzZS5PYmplY3QoXCJQbGFjZU9iamVjdFwiKTtcbiAqICAgb2JqZWN0LnNldChcImxvY2F0aW9uXCIsIHBvaW50KTtcbiAqICAgb2JqZWN0LnNhdmUoKTs8L3ByZT48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLkdlb1BvaW50XG4gKi9cbi8qIGdsb2JhbCBuYXZpZ2F0b3IgKi9cbmNsYXNzIFBhcnNlR2VvUG9pbnQge1xuICAvKipcbiAgICogQHBhcmFtIHsobnVtYmVyW10gfCBvYmplY3QgfCBudW1iZXIpfSBhcmcxIEVpdGhlciBhIGxpc3Qgb2YgY29vcmRpbmF0ZSBwYWlycywgYW4gb2JqZWN0IHdpdGggYGxhdGl0dWRlYCwgYGxvbmdpdHVkZWAsIG9yIHRoZSBsYXRpdHVkZSBvciB0aGUgcG9pbnQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmcyIFRoZSBsb25naXR1ZGUgb2YgdGhlIEdlb1BvaW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcihhcmcxLCBhcmcyKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfbGF0aXR1ZGVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9sb25naXR1ZGVcIiwgdm9pZCAwKTtcbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGFyZzEpKSB7XG4gICAgICBQYXJzZUdlb1BvaW50Ll92YWxpZGF0ZShhcmcxWzBdLCBhcmcxWzFdKTtcbiAgICAgIHRoaXMuX2xhdGl0dWRlID0gYXJnMVswXTtcbiAgICAgIHRoaXMuX2xvbmdpdHVkZSA9IGFyZzFbMV07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnMSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIFBhcnNlR2VvUG9pbnQuX3ZhbGlkYXRlKGFyZzEubGF0aXR1ZGUsIGFyZzEubG9uZ2l0dWRlKTtcbiAgICAgIHRoaXMuX2xhdGl0dWRlID0gYXJnMS5sYXRpdHVkZTtcbiAgICAgIHRoaXMuX2xvbmdpdHVkZSA9IGFyZzEubG9uZ2l0dWRlO1xuICAgIH0gZWxzZSBpZiAoYXJnMSAhPT0gdW5kZWZpbmVkICYmIGFyZzIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgUGFyc2VHZW9Qb2ludC5fdmFsaWRhdGUoYXJnMSwgYXJnMik7XG4gICAgICB0aGlzLl9sYXRpdHVkZSA9IGFyZzE7XG4gICAgICB0aGlzLl9sb25naXR1ZGUgPSBhcmcyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sYXRpdHVkZSA9IDA7XG4gICAgICB0aGlzLl9sb25naXR1ZGUgPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3J0aC1zb3V0aCBwb3J0aW9uIG9mIHRoZSBjb29yZGluYXRlLCBpbiByYW5nZSBbLTkwLCA5MF0uXG4gICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgc2V0IG91dCBvZiByYW5nZSBpbiBhIG1vZGVybiBicm93c2VyLlxuICAgKlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gbGF0aXR1ZGVcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldCBsYXRpdHVkZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF0aXR1ZGU7XG4gIH1cbiAgc2V0IGxhdGl0dWRlKHZhbCkge1xuICAgIFBhcnNlR2VvUG9pbnQuX3ZhbGlkYXRlKHZhbCwgdGhpcy5sb25naXR1ZGUpO1xuICAgIHRoaXMuX2xhdGl0dWRlID0gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEVhc3Qtd2VzdCBwb3J0aW9uIG9mIHRoZSBjb29yZGluYXRlLCBpbiByYW5nZSBbLTE4MCwgMTgwXS5cbiAgICogVGhyb3dzIGlmIHNldCBvdXQgb2YgcmFuZ2UgaW4gYSBtb2Rlcm4gYnJvd3Nlci5cbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGxvbmdpdHVkZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGxvbmdpdHVkZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbG9uZ2l0dWRlO1xuICB9XG4gIHNldCBsb25naXR1ZGUodmFsKSB7XG4gICAgUGFyc2VHZW9Qb2ludC5fdmFsaWRhdGUodGhpcy5sYXRpdHVkZSwgdmFsKTtcbiAgICB0aGlzLl9sb25naXR1ZGUgPSB2YWw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIEdlb1BvaW50LCBzdWl0YWJsZSBmb3IgUGFyc2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgUGFyc2VHZW9Qb2ludC5fdmFsaWRhdGUodGhpcy5fbGF0aXR1ZGUsIHRoaXMuX2xvbmdpdHVkZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ0dlb1BvaW50JyxcbiAgICAgIGxhdGl0dWRlOiB0aGlzLl9sYXRpdHVkZSxcbiAgICAgIGxvbmdpdHVkZTogdGhpcy5fbG9uZ2l0dWRlXG4gICAgfTtcbiAgfVxuICBlcXVhbHMob3RoZXIpIHtcbiAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBQYXJzZUdlb1BvaW50ICYmIHRoaXMubGF0aXR1ZGUgPT09IG90aGVyLmxhdGl0dWRlICYmIHRoaXMubG9uZ2l0dWRlID09PSBvdGhlci5sb25naXR1ZGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIEdlb1BvaW50IHRvIGFub3RoZXIgaW4gcmFkaWFucy5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgdGhlIG90aGVyIFBhcnNlLkdlb1BvaW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgcmFkaWFuc1RvKHBvaW50KSB7XG4gICAgY29uc3QgZDJyID0gTWF0aC5QSSAvIDE4MC4wO1xuICAgIGNvbnN0IGxhdDFyYWQgPSB0aGlzLmxhdGl0dWRlICogZDJyO1xuICAgIGNvbnN0IGxvbmcxcmFkID0gdGhpcy5sb25naXR1ZGUgKiBkMnI7XG4gICAgY29uc3QgbGF0MnJhZCA9IHBvaW50LmxhdGl0dWRlICogZDJyO1xuICAgIGNvbnN0IGxvbmcycmFkID0gcG9pbnQubG9uZ2l0dWRlICogZDJyO1xuICAgIGNvbnN0IHNpbkRlbHRhTGF0RGl2MiA9IE1hdGguc2luKChsYXQxcmFkIC0gbGF0MnJhZCkgLyAyKTtcbiAgICBjb25zdCBzaW5EZWx0YUxvbmdEaXYyID0gTWF0aC5zaW4oKGxvbmcxcmFkIC0gbG9uZzJyYWQpIC8gMik7XG4gICAgLy8gU3F1YXJlIG9mIGhhbGYgdGhlIHN0cmFpZ2h0IGxpbmUgY2hvcmQgZGlzdGFuY2UgYmV0d2VlbiBib3RoIHBvaW50cy5cbiAgICBsZXQgYSA9IHNpbkRlbHRhTGF0RGl2MiAqIHNpbkRlbHRhTGF0RGl2MiArIE1hdGguY29zKGxhdDFyYWQpICogTWF0aC5jb3MobGF0MnJhZCkgKiBzaW5EZWx0YUxvbmdEaXYyICogc2luRGVsdGFMb25nRGl2MjtcbiAgICBhID0gTWF0aC5taW4oMS4wLCBhKTtcbiAgICByZXR1cm4gMiAqIE1hdGguYXNpbihNYXRoLnNxcnQoYSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBHZW9Qb2ludCB0byBhbm90aGVyIGluIGtpbG9tZXRlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50IHRoZSBvdGhlciBQYXJzZS5HZW9Qb2ludC5cbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGtpbG9tZXRlcnNUbyhwb2ludCkge1xuICAgIHJldHVybiB0aGlzLnJhZGlhbnNUbyhwb2ludCkgKiA2MzcxLjA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIEdlb1BvaW50IHRvIGFub3RoZXIgaW4gbWlsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50IHRoZSBvdGhlciBQYXJzZS5HZW9Qb2ludC5cbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIG1pbGVzVG8ocG9pbnQpIHtcbiAgICByZXR1cm4gdGhpcy5yYWRpYW5zVG8ocG9pbnQpICogMzk1OC44O1xuICB9XG5cbiAgLypcbiAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbGF0LWxvbmcgaXMgb3V0IG9mIGJvdW5kcy5cbiAgICovXG4gIHN0YXRpYyBfdmFsaWRhdGUobGF0aXR1ZGUsIGxvbmdpdHVkZSkge1xuICAgIGlmIChpc05hTihsYXRpdHVkZSkgfHwgaXNOYU4obG9uZ2l0dWRlKSB8fCB0eXBlb2YgbGF0aXR1ZGUgIT09ICdudW1iZXInIHx8IHR5cGVvZiBsb25naXR1ZGUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW9Qb2ludCBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIG11c3QgYmUgdmFsaWQgbnVtYmVycycpO1xuICAgIH1cbiAgICBpZiAobGF0aXR1ZGUgPCAtOTAuMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VvUG9pbnQgbGF0aXR1ZGUgb3V0IG9mIGJvdW5kczogJyArIGxhdGl0dWRlICsgJyA8IC05MC4wLicpO1xuICAgIH1cbiAgICBpZiAobGF0aXR1ZGUgPiA5MC4wKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW9Qb2ludCBsYXRpdHVkZSBvdXQgb2YgYm91bmRzOiAnICsgbGF0aXR1ZGUgKyAnID4gOTAuMC4nKTtcbiAgICB9XG4gICAgaWYgKGxvbmdpdHVkZSA8IC0xODAuMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VvUG9pbnQgbG9uZ2l0dWRlIG91dCBvZiBib3VuZHM6ICcgKyBsb25naXR1ZGUgKyAnIDwgLTE4MC4wLicpO1xuICAgIH1cbiAgICBpZiAobG9uZ2l0dWRlID4gMTgwLjApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dlb1BvaW50IGxvbmdpdHVkZSBvdXQgb2YgYm91bmRzOiAnICsgbG9uZ2l0dWRlICsgJyA+IDE4MC4wLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgR2VvUG9pbnQgd2l0aCB0aGUgdXNlcidzIGN1cnJlbnQgbG9jYXRpb24sIGlmIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVGhlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZW5hYmxlSGlnaEFjY3VyYWN5XSBBIGJvb2xlYW4gdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhlIGFwcGxpY2F0aW9uIHdvdWxkIGxpa2UgdG8gcmVjZWl2ZSB0aGUgYmVzdCBwb3NzaWJsZSByZXN1bHRzLlxuICAgKiAgSWYgdHJ1ZSBhbmQgaWYgdGhlIGRldmljZSBpcyBhYmxlIHRvIHByb3ZpZGUgYSBtb3JlIGFjY3VyYXRlIHBvc2l0aW9uLCBpdCB3aWxsIGRvIHNvLlxuICAgKiAgTm90ZSB0aGF0IHRoaXMgY2FuIHJlc3VsdCBpbiBzbG93ZXIgcmVzcG9uc2UgdGltZXMgb3IgaW5jcmVhc2VkIHBvd2VyIGNvbnN1bXB0aW9uICh3aXRoIGEgR1BTIGNoaXAgb24gYSBtb2JpbGUgZGV2aWNlIGZvciBleGFtcGxlKS5cbiAgICogIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBmYWxzZSwgdGhlIGRldmljZSBjYW4gdGFrZSB0aGUgbGliZXJ0eSB0byBzYXZlIHJlc291cmNlcyBieSByZXNwb25kaW5nIG1vcmUgcXVpY2tseSBhbmQvb3IgdXNpbmcgbGVzcyBwb3dlci4gRGVmYXVsdDogZmFsc2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50aW1lb3V0XSBBIHBvc2l0aXZlIGxvbmcgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRoZSBkZXZpY2UgaXMgYWxsb3dlZCB0byB0YWtlIGluIG9yZGVyIHRvIHJldHVybiBhIHBvc2l0aW9uLlxuICAgKiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgSW5maW5pdHksIG1lYW5pbmcgdGhhdCBnZXRDdXJyZW50UG9zaXRpb24oKSB3b24ndCByZXR1cm4gdW50aWwgdGhlIHBvc2l0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heGltdW1BZ2VdIEEgcG9zaXRpdmUgbG9uZyB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBtYXhpbXVtIGFnZSBpbiBtaWxsaXNlY29uZHMgb2YgYSBwb3NzaWJsZSBjYWNoZWQgcG9zaXRpb24gdGhhdCBpcyBhY2NlcHRhYmxlIHRvIHJldHVybi5cbiAgICogIElmIHNldCB0byAwLCBpdCBtZWFucyB0aGF0IHRoZSBkZXZpY2UgY2Fubm90IHVzZSBhIGNhY2hlZCBwb3NpdGlvbiBhbmQgbXVzdCBhdHRlbXB0IHRvIHJldHJpZXZlIHRoZSByZWFsIGN1cnJlbnQgcG9zaXRpb24uXG4gICAqICBJZiBzZXQgdG8gSW5maW5pdHkgdGhlIGRldmljZSBtdXN0IHJldHVybiBhIGNhY2hlZCBwb3NpdGlvbiByZWdhcmRsZXNzIG9mIGl0cyBhZ2UuIERlZmF1bHQ6IDAuXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2U8UGFyc2UuR2VvUG9pbnQ+fSBVc2VyJ3MgY3VycmVudCBsb2NhdGlvblxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGxvY2F0aW9uID0+IHtcbiAgICAgICAgcmVzb2x2ZShuZXcgUGFyc2VHZW9Qb2ludChsb2NhdGlvbi5jb29yZHMubGF0aXR1ZGUsIGxvY2F0aW9uLmNvb3Jkcy5sb25naXR1ZGUpKTtcbiAgICAgIH0sIHJlamVjdCwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlR2VvUG9pbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY3JlYXRlID0gY3JlYXRlO1xuZXhwb3J0cy5jcmVhdGVGdW5jdGlvbiA9IGNyZWF0ZUZ1bmN0aW9uO1xuZXhwb3J0cy5jcmVhdGVUcmlnZ2VyID0gY3JlYXRlVHJpZ2dlcjtcbmV4cG9ydHMuZ2V0RnVuY3Rpb24gPSBnZXRGdW5jdGlvbjtcbmV4cG9ydHMuZ2V0RnVuY3Rpb25zID0gZ2V0RnVuY3Rpb25zO1xuZXhwb3J0cy5nZXRUcmlnZ2VyID0gZ2V0VHJpZ2dlcjtcbmV4cG9ydHMuZ2V0VHJpZ2dlcnMgPSBnZXRUcmlnZ2VycztcbmV4cG9ydHMucmVtb3ZlID0gcmVtb3ZlO1xuZXhwb3J0cy5yZW1vdmVGdW5jdGlvbiA9IHJlbW92ZUZ1bmN0aW9uO1xuZXhwb3J0cy5yZW1vdmVUcmlnZ2VyID0gcmVtb3ZlVHJpZ2dlcjtcbmV4cG9ydHMudXBkYXRlID0gdXBkYXRlO1xuZXhwb3J0cy51cGRhdGVGdW5jdGlvbiA9IHVwZGF0ZUZ1bmN0aW9uO1xuZXhwb3J0cy51cGRhdGVUcmlnZ2VyID0gdXBkYXRlVHJpZ2dlcjtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX2RlY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGVjb2RlXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG5mdW5jdGlvbiBnZXRGdW5jdGlvbnMoKSB7XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRIb29rc0NvbnRyb2xsZXIoKS5nZXQoJ2Z1bmN0aW9ucycpO1xufVxuZnVuY3Rpb24gZ2V0VHJpZ2dlcnMoKSB7XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRIb29rc0NvbnRyb2xsZXIoKS5nZXQoJ3RyaWdnZXJzJyk7XG59XG5mdW5jdGlvbiBnZXRGdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRIb29rc0NvbnRyb2xsZXIoKS5nZXQoJ2Z1bmN0aW9ucycsIG5hbWUpO1xufVxuZnVuY3Rpb24gZ2V0VHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJOYW1lKSB7XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRIb29rc0NvbnRyb2xsZXIoKS5nZXQoJ3RyaWdnZXJzJywgY2xhc3NOYW1lLCB0cmlnZ2VyTmFtZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbihmdW5jdGlvbk5hbWUsIHVybCkge1xuICByZXR1cm4gY3JlYXRlKHtcbiAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICB1cmw6IHVybFxuICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRyaWdnZXIoY2xhc3NOYW1lLCB0cmlnZ2VyTmFtZSwgdXJsKSB7XG4gIHJldHVybiBjcmVhdGUoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHRyaWdnZXJOYW1lOiB0cmlnZ2VyTmFtZSxcbiAgICB1cmw6IHVybFxuICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZShob29rKSB7XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRIb29rc0NvbnRyb2xsZXIoKS5jcmVhdGUoaG9vayk7XG59XG5mdW5jdGlvbiB1cGRhdGVGdW5jdGlvbihmdW5jdGlvbk5hbWUsIHVybCkge1xuICByZXR1cm4gdXBkYXRlKHtcbiAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICB1cmw6IHVybFxuICB9KTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVRyaWdnZXIoY2xhc3NOYW1lLCB0cmlnZ2VyTmFtZSwgdXJsKSB7XG4gIHJldHVybiB1cGRhdGUoe1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIHRyaWdnZXJOYW1lOiB0cmlnZ2VyTmFtZSxcbiAgICB1cmw6IHVybFxuICB9KTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZShob29rKSB7XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRIb29rc0NvbnRyb2xsZXIoKS51cGRhdGUoaG9vayk7XG59XG5mdW5jdGlvbiByZW1vdmVGdW5jdGlvbihmdW5jdGlvbk5hbWUpIHtcbiAgcmV0dXJuIHJlbW92ZSh7XG4gICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWVcbiAgfSk7XG59XG5mdW5jdGlvbiByZW1vdmVUcmlnZ2VyKGNsYXNzTmFtZSwgdHJpZ2dlck5hbWUpIHtcbiAgcmV0dXJuIHJlbW92ZSh7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lXG4gIH0pO1xufVxuZnVuY3Rpb24gcmVtb3ZlKGhvb2spIHtcbiAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEhvb2tzQ29udHJvbGxlcigpLnJlbW92ZShob29rKTtcbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBnZXQodHlwZSwgZnVuY3Rpb25OYW1lLCB0cmlnZ2VyTmFtZSkge1xuICAgIGxldCB1cmwgPSAnL2hvb2tzLycgKyB0eXBlO1xuICAgIGlmIChmdW5jdGlvbk5hbWUpIHtcbiAgICAgIHVybCArPSAnLycgKyBmdW5jdGlvbk5hbWU7XG4gICAgICBpZiAodHJpZ2dlck5hbWUpIHtcbiAgICAgICAgdXJsICs9ICcvJyArIHRyaWdnZXJOYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdCgnR0VUJywgdXJsKTtcbiAgfSxcbiAgY3JlYXRlKGhvb2spIHtcbiAgICBsZXQgdXJsO1xuICAgIGlmIChob29rLmZ1bmN0aW9uTmFtZSAmJiBob29rLnVybCkge1xuICAgICAgdXJsID0gJy9ob29rcy9mdW5jdGlvbnMnO1xuICAgIH0gZWxzZSBpZiAoaG9vay5jbGFzc05hbWUgJiYgaG9vay50cmlnZ2VyTmFtZSAmJiBob29rLnVybCkge1xuICAgICAgdXJsID0gJy9ob29rcy90cmlnZ2Vycyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCh7XG4gICAgICAgIGVycm9yOiAnaW52YWxpZCBob29rIGRlY2xhcmF0aW9uJyxcbiAgICAgICAgY29kZTogMTQzXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlcXVlc3QoJ1BPU1QnLCB1cmwsIGhvb2spO1xuICB9LFxuICByZW1vdmUoaG9vaykge1xuICAgIGxldCB1cmw7XG4gICAgaWYgKGhvb2suZnVuY3Rpb25OYW1lKSB7XG4gICAgICB1cmwgPSAnL2hvb2tzL2Z1bmN0aW9ucy8nICsgaG9vay5mdW5jdGlvbk5hbWU7XG4gICAgICBkZWxldGUgaG9vay5mdW5jdGlvbk5hbWU7XG4gICAgfSBlbHNlIGlmIChob29rLmNsYXNzTmFtZSAmJiBob29rLnRyaWdnZXJOYW1lKSB7XG4gICAgICB1cmwgPSAnL2hvb2tzL3RyaWdnZXJzLycgKyBob29rLmNsYXNzTmFtZSArICcvJyArIGhvb2sudHJpZ2dlck5hbWU7XG4gICAgICBkZWxldGUgaG9vay5jbGFzc05hbWU7XG4gICAgICBkZWxldGUgaG9vay50cmlnZ2VyTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KHtcbiAgICAgICAgZXJyb3I6ICdpbnZhbGlkIGhvb2sgZGVjbGFyYXRpb24nLFxuICAgICAgICBjb2RlOiAxNDNcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdCgnUFVUJywgdXJsLCB7XG4gICAgICBfX29wOiAnRGVsZXRlJ1xuICAgIH0pO1xuICB9LFxuICB1cGRhdGUoaG9vaykge1xuICAgIGxldCB1cmw7XG4gICAgaWYgKGhvb2suZnVuY3Rpb25OYW1lICYmIGhvb2sudXJsKSB7XG4gICAgICB1cmwgPSAnL2hvb2tzL2Z1bmN0aW9ucy8nICsgaG9vay5mdW5jdGlvbk5hbWU7XG4gICAgICBkZWxldGUgaG9vay5mdW5jdGlvbk5hbWU7XG4gICAgfSBlbHNlIGlmIChob29rLmNsYXNzTmFtZSAmJiBob29rLnRyaWdnZXJOYW1lICYmIGhvb2sudXJsKSB7XG4gICAgICB1cmwgPSAnL2hvb2tzL3RyaWdnZXJzLycgKyBob29rLmNsYXNzTmFtZSArICcvJyArIGhvb2sudHJpZ2dlck5hbWU7XG4gICAgICBkZWxldGUgaG9vay5jbGFzc05hbWU7XG4gICAgICBkZWxldGUgaG9vay50cmlnZ2VyTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KHtcbiAgICAgICAgZXJyb3I6ICdpbnZhbGlkIGhvb2sgZGVjbGFyYXRpb24nLFxuICAgICAgICBjb2RlOiAxNDNcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdCgnUFVUJywgdXJsLCBob29rKTtcbiAgfSxcbiAgc2VuZFJlcXVlc3QobWV0aG9kLCB1cmwsIGJvZHkpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKS5yZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5LCB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9KS50aGVuKHJlcyA9PiB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkocmVzKTtcbiAgICAgIGlmIChkZWNvZGVkKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoZGVjb2RlZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0pTT04sICdUaGUgc2VydmVyIHJldHVybmVkIGFuIGludmFsaWQgcmVzcG9uc2UuJykpO1xuICAgIH0pO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0SG9va3NDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9lbnRyaWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZW50cmllc1wiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xuY29uc3QgREVWSUNFX1RZUEVTID0ge1xuICBJT1M6ICdpb3MnLFxuICBNQUNPUzogJ21hY29zJyxcbiAgVFZPUzogJ3R2b3MnLFxuICBGQ006ICdmY20nLFxuICBBTkRST0lEOiAnYW5kcm9pZCcsXG4gIFdFQjogJ3dlYidcbn07XG5cbi8qKlxuICogUGFyc2UuSW5zdGFsbGF0aW9uIGlzIGEgbG9jYWwgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFsbGF0aW9uIGRhdGEgdGhhdCBjYW4gYmUgc2F2ZWQgYW5kIHJldHJpZXZlZCBmcm9tIHRoZSBQYXJzZSBjbG91ZC5cbiAqIFRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiBhIFBhcnNlLk9iamVjdCwgYW5kIHJldGFpbnMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBvZiBhIFBhcnNlLk9iamVjdCwgYnV0IGFsc28gZXh0ZW5kcyBpdCB3aXRoIGluc3RhbGxhdGlvbi1zcGVjaWZpYyBmZWF0dXJlcy5cbiAqXG4gKiA8cD5BIHZhbGlkIFBhcnNlLkluc3RhbGxhdGlvbiBjYW4gb25seSBiZSBpbnN0YW50aWF0ZWQgdmlhIDxjb2RlPlBhcnNlLkluc3RhbGxhdGlvbi5jdXJyZW50SW5zdGFsbGF0aW9uKCk8L2NvZGU+XG4gKlxuICogUGFyc2UuSW5zdGFsbGF0aW9uIG9iamVjdHMgd2hpY2ggaGF2ZSBhIHZhbGlkIDxjb2RlPmRldmljZVRva2VuPC9jb2RlPiBhbmQgYXJlIHNhdmVkIHRvIHRoZSBQYXJzZSBjbG91ZCBjYW4gYmUgdXNlZCB0byB0YXJnZXQgcHVzaCBub3RpZmljYXRpb25zLlxuICogPC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5JbnN0YWxsYXRpb25cbiAqL1xuY2xhc3MgUGFyc2VJbnN0YWxsYXRpb24gZXh0ZW5kcyBfUGFyc2VPYmplY3QuZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyBUaGUgaW5pdGlhbCBzZXQgb2YgZGF0YSB0byBzdG9yZSBpbiB0aGUgb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykge1xuICAgIHN1cGVyKCdfSW5zdGFsbGF0aW9uJyk7XG4gICAgaWYgKGF0dHJpYnV0ZXMgJiYgdHlwZW9mIGF0dHJpYnV0ZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoIXRoaXMuc2V0KGF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSBhbiBpbnZhbGlkIEluc3RhbGxhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBpbnN0YWxsYXRpb27igJlzIGNsaWVudCBhcHBsaWNhdGlvbi4gSW4gaU9TLCB0aGlzIGlzIHRoZSBCdW5kbGUgSWRlbnRpZmllci5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcElkZW50aWZpZXJcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGFwcElkZW50aWZpZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdhcHBJZGVudGlmaWVyJyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBjbGllbnQgYXBwbGljYXRpb24gdG8gd2hpY2ggdGhpcyBpbnN0YWxsYXRpb24gYmVsb25ncy5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFZlcnNpb25cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGFwcFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdhcHBWZXJzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHRvIHdoaWNoIHRoaXMgaW5zdGFsbGF0aW9uIGJlbG9uZ3MuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBOYW1lXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBhcHBOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnYXBwTmFtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpY29uIGJhZGdlIGZvciBpT1MgYXBwcy5cbiAgICogQ2hhbmdlcyB0byB0aGlzIHZhbHVlIG9uIHRoZSBzZXJ2ZXIgd2lsbCBiZSB1c2VkXG4gICAqIGZvciBmdXR1cmUgYmFkZ2UtaW5jcmVtZW50IHB1c2ggbm90aWZpY2F0aW9ucy5cbiAgICpcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJhZGdlXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGdldCBiYWRnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2JhZGdlJyk7XG4gIH1cblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgdGhlIGNoYW5uZWxzIHRvIHdoaWNoIGEgZGV2aWNlIGlzIGN1cnJlbnRseSBzdWJzY3JpYmVkLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ1tdfSBjaGFubmVsc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGdldCBjaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2NoYW5uZWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogVG9rZW4gdXNlZCB0byBkZWxpdmVyIHB1c2ggbm90aWZpY2F0aW9ucyB0byB0aGUgZGV2aWNlLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZGV2aWNlVG9rZW5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGRldmljZVRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnZGV2aWNlVG9rZW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBkZXZpY2UsIOKAnGlvc+KAnSwg4oCcYW5kcm9pZOKAnSwg4oCcd2Vi4oCdLCBldGMuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXZpY2VUeXBlXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBkZXZpY2VUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnZGV2aWNlVHlwZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEdDTSBzZW5kZXIgaWRlbnRpZmllciBmb3IgdGhpcyBpbnN0YWxsYXRpb25cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IEdDTVNlbmRlcklkXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBHQ01TZW5kZXJJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ0dDTVNlbmRlcklkJyk7XG4gIH1cblxuICAvKipcbiAgICogVW5pdmVyc2FsbHkgVW5pcXVlIElkZW50aWZpZXIgKFVVSUQpIGZvciB0aGUgZGV2aWNlIHVzZWQgYnkgUGFyc2UuIEl0IG11c3QgYmUgdW5pcXVlIGFjcm9zcyBhbGwgb2YgYW4gYXBw4oCZcyBpbnN0YWxsYXRpb25zLlxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbGF0aW9uSWRcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGluc3RhbGxhdGlvbklkKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnaW5zdGFsbGF0aW9uSWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsb2NhbCBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbGxhdGlvblxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gbG9jYWxlSWRlbnRpZmllclxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbG9jYWxlSWRlbnRpZmllcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2xvY2FsZUlkZW50aWZpZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXJzZSBzZXJ2ZXIgdmVyc2lvbiBmb3IgdGhpcyBpbnN0YWxsYXRpb25cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcnNlVmVyc2lvblxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcGFyc2VWZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgncGFyc2VWZXJzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmaWVsZCBpcyByZXNlcnZlZCBmb3IgZGlyZWN0aW5nIFBhcnNlIHRvIHRoZSBwdXNoIGRlbGl2ZXJ5IG5ldHdvcmsgdG8gYmUgdXNlZC5cbiAgICpcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHB1c2hUeXBlXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldCBwdXNoVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3B1c2hUeXBlJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGltZSB6b25lIGZvciB0aGlzIGluc3RhbGxhdGlvblxuICAgKlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGltZVpvbmVcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWVab25lKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgndGltZVpvbmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZXZpY2UgdHlwZXMgZm9yIHVzZWQgZm9yIFB1c2ggTm90aWZpY2F0aW9ucy5cbiAgICpcbiAgICogPHByZT5cbiAgICogUGFyc2UuSW5zdGFsbGF0aW9uLkRFVklDRV9UWVBFUy5JT1NcbiAgICogUGFyc2UuSW5zdGFsbGF0aW9uLkRFVklDRV9UWVBFUy5NQUNPU1xuICAgKiBQYXJzZS5JbnN0YWxsYXRpb24uREVWSUNFX1RZUEVTLlRWT1NcbiAgICogUGFyc2UuSW5zdGFsbGF0aW9uLkRFVklDRV9UWVBFUy5GQ01cbiAgICogUGFyc2UuSW5zdGFsbGF0aW9uLkRFVklDRV9UWVBFUy5BTkRST0lEXG4gICAqIFBhcnNlLkluc3RhbGxhdGlvbi5ERVZJQ0VfVFlQRVMuV0VCXG4gICAqIDwvcHJlXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBERVZJQ0VfVFlQRVNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAgc3RhdGljIGdldCBERVZJQ0VfVFlQRVMoKSB7XG4gICAgcmV0dXJuIERFVklDRV9UWVBFUztcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBkZWZhdWx0IGZldGNoIGJlaGF2aW9yIHdpdGggZnVuY3Rpb25hbGl0eSB0byB1cGRhdGUgbG9jYWwgc3RvcmFnZS5cbiAgICogSWYgdGhlIGluc3RhbGxhdGlvbiBpcyBkZWxldGVkIG9uIHRoZSBzZXJ2ZXIsIHJldHJ5IHRoZSBmZXRjaCBhcyBhIHNhdmUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIGFzeW5jIGZldGNoKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLmZldGNoLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLmNvZGUgIT09IF9QYXJzZUVycm9yLmRlZmF1bHQuT0JKRUNUX05PVF9GT1VORCkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGluc3RhbGxhdGlvbiB3YXMgZGVsZXRlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICAvLyBXZSBhbHdheXMgd2FudCBmZXRjaCB0byBzdWNjZWVkLlxuICAgICAgZGVsZXRlIHRoaXMuaWQ7XG4gICAgICB0aGlzLl9nZXRJZCgpOyAvLyBHZW5lcmF0ZSBsb2NhbElkXG4gICAgICB0aGlzLl9tYXJrQWxsRmllbGRzRGlydHkoKTtcbiAgICAgIGF3YWl0IHN1cGVyLnNhdmUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIGF3YWl0IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoKS51cGRhdGVJbnN0YWxsYXRpb25PbkRpc2sodGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZGVmYXVsdCBzYXZlIGJlaGF2aW9yIHdpdGggZnVuY3Rpb25hbGl0eSB0byB1cGRhdGUgdGhlIGxvY2FsIHN0b3JhZ2UuXG4gICAqIElmIHRoZSBpbnN0YWxsYXRpb24gaXMgZGVsZXRlZCBvbiB0aGUgc2VydmVyLCByZXRyeSBzYXZpbmcgYSBuZXcgaW5zdGFsbGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIGFzeW5jIHNhdmUoKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdXBlci5zYXZlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLmNvZGUgIT09IF9QYXJzZUVycm9yLmRlZmF1bHQuT0JKRUNUX05PVF9GT1VORCkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGluc3RhbGxhdGlvbiB3YXMgZGVsZXRlZCBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICAvLyBXZSBhbHdheXMgd2FudCBzYXZlIHRvIHN1Y2NlZWQuXG4gICAgICBkZWxldGUgdGhpcy5pZDtcbiAgICAgIHRoaXMuX2dldElkKCk7IC8vIEdlbmVyYXRlIGxvY2FsSWRcbiAgICAgIHRoaXMuX21hcmtBbGxGaWVsZHNEaXJ0eSgpO1xuICAgICAgYXdhaXQgc3VwZXIuc2F2ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gICAgYXdhaXQgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcigpLnVwZGF0ZUluc3RhbGxhdGlvbk9uRGlzayh0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBfbWFya0FsbEZpZWxkc0RpcnR5KCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mICgwLCBfZW50cmllcy5kZWZhdWx0KSh0aGlzLmF0dHJpYnV0ZXMpKSB7XG4gICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IFBhcnNlLkluc3RhbGxhdGlvbiBmcm9tIGRpc2suIElmIGRvZXNuJ3QgZXhpc3RzLCBjcmVhdGUgYW4gbmV3IGluc3RhbGxhdGlvbi5cbiAgICpcbiAgICogPHByZT5cbiAgICogY29uc3QgaW5zdGFsbGF0aW9uID0gYXdhaXQgUGFyc2UuSW5zdGFsbGF0aW9uLmN1cnJlbnRJbnN0YWxsYXRpb24oKTtcbiAgICogaW5zdGFsbGF0aW9uLnNldCgnZGV2aWNlVG9rZW4nLCAnMTIzJyk7XG4gICAqIGF3YWl0IGluc3RhbGxhdGlvbi5zYXZlKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxvY2FsIGluc3RhbGxhdGlvbiBvYmplY3QuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudEluc3RhbGxhdGlvbigpIHtcbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcigpLmN1cnJlbnRJbnN0YWxsYXRpb24oKTtcbiAgfVxufVxuX1BhcnNlT2JqZWN0LmRlZmF1bHQucmVnaXN0ZXJTdWJjbGFzcygnX0luc3RhbGxhdGlvbicsIFBhcnNlSW5zdGFsbGF0aW9uKTtcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VJbnN0YWxsYXRpb247XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZUluc3RhbGxhdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9MaXZlUXVlcnlDbGllbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0xpdmVRdWVyeUNsaWVudFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG5mdW5jdGlvbiBnZXRMaXZlUXVlcnlDbGllbnQoKSB7XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMaXZlUXVlcnlDb250cm9sbGVyKCkuZ2V0RGVmYXVsdExpdmVRdWVyeUNsaWVudCgpO1xufVxuXG4vKipcbiAqIFdlIGV4cG9zZSB0aHJlZSBldmVudHMgdG8gaGVscCB5b3UgbW9uaXRvciB0aGUgc3RhdHVzIG9mIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbjpcbiAqXG4gKiA8cD5PcGVuIC0gV2hlbiB3ZSBlc3RhYmxpc2ggdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuXG4gKlxuICogPHByZT5cbiAqIFBhcnNlLkxpdmVRdWVyeS5vbignb3BlbicsICgpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogPHA+Q2xvc2UgLSBXaGVuIHdlIGxvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBMaXZlUXVlcnkgc2VydmVyLCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuXG4gKlxuICogPHByZT5cbiAqIFBhcnNlLkxpdmVRdWVyeS5vbignY2xvc2UnLCAoKSA9PiB7XG4gKlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIDxwPkVycm9yIC0gV2hlbiBzb21lIG5ldHdvcmsgZXJyb3Igb3IgTGl2ZVF1ZXJ5IHNlcnZlciBlcnJvciBoYXBwZW5zLCB5b3UnbGwgZ2V0IHRoaXMgZXZlbnQuXG4gKlxuICogPHByZT5cbiAqIFBhcnNlLkxpdmVRdWVyeS5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAqXG4gKiB9KTs8L3ByZT48L3A+XG4gKlxuICogQGNsYXNzIFBhcnNlLkxpdmVRdWVyeVxuICogQHN0YXRpY1xuICovXG5jbGFzcyBMaXZlUXVlcnkge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiZW1pdHRlclwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25cIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImVtaXRcIiwgdm9pZCAwKTtcbiAgICBjb25zdCBFdmVudEVtaXR0ZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5vbiA9IChldmVudE5hbWUsIGxpc3RlbmVyKSA9PiB0aGlzLmVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfdGhpcy5lbWl0dGVyLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTtcbiAgICB9O1xuICAgIC8vIGFkZGluZyBsaXN0ZW5lciBzbyBwcm9jZXNzIGRvZXMgbm90IGNyYXNoXG4gICAgLy8gYmVzdCBwcmFjdGljZSBpcyBmb3IgZGV2ZWxvcGVyIHRvIHJlZ2lzdGVyIHRoZWlyIG93biBsaXN0ZW5lclxuICAgIHRoaXMub24oJ2Vycm9yJywgKCkgPT4ge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFmdGVyIG9wZW4gaXMgY2FsbGVkLCB0aGUgTGl2ZVF1ZXJ5IHdpbGwgdHJ5IHRvIHNlbmQgYSBjb25uZWN0IHJlcXVlc3RcbiAgICogdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIuXG4gICAqL1xuICBhc3luYyBvcGVuKCkge1xuICAgIGNvbnN0IGxpdmVRdWVyeUNsaWVudCA9IGF3YWl0IGdldExpdmVRdWVyeUNsaWVudCgpO1xuICAgIGxpdmVRdWVyeUNsaWVudC5vcGVuKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiB5b3UncmUgZG9uZSB1c2luZyBMaXZlUXVlcnksIHlvdSBjYW4gY2FsbCBQYXJzZS5MaXZlUXVlcnkuY2xvc2UoKS5cbiAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGNsb3NlIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgTGl2ZVF1ZXJ5IHNlcnZlcixcbiAgICogY2FuY2VsIHRoZSBhdXRvIHJlY29ubmVjdCwgYW5kIHVuc3Vic2NyaWJlIGFsbCBzdWJzY3JpcHRpb25zIGJhc2VkIG9uIGl0LlxuICAgKiBJZiB5b3UgY2FsbCBxdWVyeS5zdWJzY3JpYmUoKSBhZnRlciB0aGlzLCB3ZSdsbCBjcmVhdGUgYSBuZXcgV2ViU29ja2V0XG4gICAqIGNvbm5lY3Rpb24gdG8gdGhlIExpdmVRdWVyeSBzZXJ2ZXIuXG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICBjb25zdCBsaXZlUXVlcnlDbGllbnQgPSBhd2FpdCBnZXRMaXZlUXVlcnlDbGllbnQoKTtcbiAgICBsaXZlUXVlcnlDbGllbnQuY2xvc2UoKTtcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gTGl2ZVF1ZXJ5O1xubGV0IGRlZmF1bHRMaXZlUXVlcnlDbGllbnQ7XG5jb25zdCBEZWZhdWx0TGl2ZVF1ZXJ5Q29udHJvbGxlciA9IHtcbiAgc2V0RGVmYXVsdExpdmVRdWVyeUNsaWVudChsaXZlUXVlcnlDbGllbnQpIHtcbiAgICBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50ID0gbGl2ZVF1ZXJ5Q2xpZW50O1xuICB9LFxuICBhc3luYyBnZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50KCkge1xuICAgIGlmIChkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50KSB7XG4gICAgICByZXR1cm4gZGVmYXVsdExpdmVRdWVyeUNsaWVudDtcbiAgICB9XG4gICAgY29uc3QgW2N1cnJlbnRVc2VyLCBpbnN0YWxsYXRpb25JZF0gPSBhd2FpdCBfcHJvbWlzZS5kZWZhdWx0LmFsbChbX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKS5jdXJyZW50VXNlckFzeW5jKCksIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEluc3RhbGxhdGlvbkNvbnRyb2xsZXIoKS5jdXJyZW50SW5zdGFsbGF0aW9uSWQoKV0pO1xuICAgIGNvbnN0IHNlc3Npb25Ub2tlbiA9IGN1cnJlbnRVc2VyID8gY3VycmVudFVzZXIuZ2V0U2Vzc2lvblRva2VuKCkgOiB1bmRlZmluZWQ7XG4gICAgbGV0IGxpdmVRdWVyeVNlcnZlclVSTCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTElWRVFVRVJZX1NFUlZFUl9VUkwnKTtcbiAgICBpZiAobGl2ZVF1ZXJ5U2VydmVyVVJMICYmICgwLCBfaW5kZXhPZi5kZWZhdWx0KShsaXZlUXVlcnlTZXJ2ZXJVUkwpLmNhbGwobGl2ZVF1ZXJ5U2VydmVyVVJMLCAnd3MnKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzZXQgYSBwcm9wZXIgUGFyc2UgTGl2ZVF1ZXJ5IHNlcnZlciB1cmwgYmVmb3JlIHVzaW5nIExpdmVRdWVyeUNsaWVudCcpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGNhbiBub3QgZmluZCBQYXJzZS5saXZlUXVlcnlTZXJ2ZXJVUkwsIHdlIHRyeSB0byBleHRyYWN0IGl0IGZyb20gUGFyc2Uuc2VydmVyVVJMXG4gICAgaWYgKCFsaXZlUXVlcnlTZXJ2ZXJVUkwpIHtcbiAgICAgIGNvbnN0IHNlcnZlclVSTCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX1VSTCcpO1xuICAgICAgY29uc3QgcHJvdG9jb2wgPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkoc2VydmVyVVJMKS5jYWxsKHNlcnZlclVSTCwgJ2h0dHBzJykgPT09IDAgPyAnd3NzOi8vJyA6ICd3czovLyc7XG4gICAgICBjb25zdCBob3N0ID0gc2VydmVyVVJMLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgJycpO1xuICAgICAgbGl2ZVF1ZXJ5U2VydmVyVVJMID0gcHJvdG9jb2wgKyBob3N0O1xuICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdMSVZFUVVFUllfU0VSVkVSX1VSTCcsIGxpdmVRdWVyeVNlcnZlclVSTCk7XG4gICAgfVxuICAgIGNvbnN0IGFwcGxpY2F0aW9uSWQgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FQUExJQ0FUSU9OX0lEJyk7XG4gICAgY29uc3QgamF2YXNjcmlwdEtleSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSkFWQVNDUklQVF9LRVknKTtcbiAgICBjb25zdCBtYXN0ZXJLZXkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ01BU1RFUl9LRVknKTtcbiAgICBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50ID0gbmV3IF9MaXZlUXVlcnlDbGllbnQuZGVmYXVsdCh7XG4gICAgICBhcHBsaWNhdGlvbklkLFxuICAgICAgc2VydmVyVVJMOiBsaXZlUXVlcnlTZXJ2ZXJVUkwsXG4gICAgICBqYXZhc2NyaXB0S2V5LFxuICAgICAgbWFzdGVyS2V5LFxuICAgICAgc2Vzc2lvblRva2VuLFxuICAgICAgaW5zdGFsbGF0aW9uSWRcbiAgICB9KTtcbiAgICBjb25zdCBMaXZlUXVlcnkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMaXZlUXVlcnkoKTtcbiAgICBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50Lm9uKCdlcnJvcicsIGVycm9yID0+IHtcbiAgICAgIExpdmVRdWVyeS5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICB9KTtcbiAgICBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50Lm9uKCdvcGVuJywgKCkgPT4ge1xuICAgICAgTGl2ZVF1ZXJ5LmVtaXQoJ29wZW4nKTtcbiAgICB9KTtcbiAgICBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIExpdmVRdWVyeS5lbWl0KCdjbG9zZScpO1xuICAgIH0pO1xuICAgIHJldHVybiBkZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50O1xuICB9LFxuICBfY2xlYXJDYWNoZWREZWZhdWx0Q2xpZW50KCkge1xuICAgIGRlZmF1bHRMaXZlUXVlcnlDbGllbnQgPSBudWxsO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0TGl2ZVF1ZXJ5Q29udHJvbGxlcihEZWZhdWx0TGl2ZVF1ZXJ5Q29udHJvbGxlcik7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfV2Vha01hcCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3dlYWstbWFwXCIpO1xudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkyID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eTIoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2ZyZWV6ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2ZyZWV6ZVwiKSk7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9rZXlzXCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9zdHJpbmdpZnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpKTtcbnZhciBfaW5jbHVkZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpKTtcbnZhciBfZ2V0UHJvdG90eXBlT2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9nZXQtcHJvdG90eXBlLW9mXCIpKTtcbnZhciBfY29uY2F0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXRcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9jcmVhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9jcmVhdGVcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIikpO1xudmFyIF9maW5kID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maW5kXCIpKTtcbnZhciBfbWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9tYXBcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9jYW5CZVNlcmlhbGl6ZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NhbkJlU2VyaWFsaXplZFwiKSk7XG52YXIgX2RlY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGVjb2RlXCIpKTtcbnZhciBfZW5jb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lbmNvZGVcIikpO1xudmFyIF9lc2NhcGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VzY2FwZVwiKSk7XG52YXIgX1BhcnNlQUNMID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUFDTFwiKSk7XG52YXIgX3BhcnNlRGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFyc2VEYXRlXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBfcHJvbWlzZVV0aWxzID0gcmVxdWlyZShcIi4vcHJvbWlzZVV0aWxzXCIpO1xudmFyIF9Mb2NhbERhdGFzdG9yZVV0aWxzID0gcmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVVdGlsc1wiKTtcbnZhciBfdXVpZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXVpZFwiKSk7XG52YXIgX1BhcnNlT3AgPSByZXF1aXJlKFwiLi9QYXJzZU9wXCIpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbnZhciBTaW5nbGVJbnN0YW5jZVN0YXRlQ29udHJvbGxlciA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL1NpbmdsZUluc3RhbmNlU3RhdGVDb250cm9sbGVyXCIpKTtcbnZhciBfdW5pcXVlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91bmlxdWVcIikpO1xudmFyIFVuaXF1ZUluc3RhbmNlU3RhdGVDb250cm9sbGVyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vVW5pcXVlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXJcIikpO1xudmFyIF91bnNhdmVkQ2hpbGRyZW4gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Vuc2F2ZWRDaGlsZHJlblwiKSk7XG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoZSkge1xuICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBfV2Vha01hcCkgcmV0dXJuIG51bGw7XG4gIHZhciByID0gbmV3IF9XZWFrTWFwKCksXG4gICAgdCA9IG5ldyBfV2Vha01hcCgpO1xuICByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGUgPyB0IDogcjtcbiAgfSkoZSk7XG59XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChlLCByKSB7XG4gIGlmICghciAmJiBlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gIGlmIChudWxsID09PSBlIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGUgJiYgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlKSByZXR1cm4ge1xuICAgIGRlZmF1bHQ6IGVcbiAgfTtcbiAgdmFyIHQgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUocik7XG4gIGlmICh0ICYmIHQuaGFzKGUpKSByZXR1cm4gdC5nZXQoZSk7XG4gIHZhciBuID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbFxuICB9O1xuICBmb3IgKHZhciB1IGluIGUpIGlmIChcImRlZmF1bHRcIiAhPT0gdSAmJiB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHUpKSB7XG4gICAgdmFyIGkgPSBfT2JqZWN0JGRlZmluZVByb3BlcnR5MiAmJiBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA/IF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHUpIDogbnVsbDtcbiAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBfT2JqZWN0JGRlZmluZVByb3BlcnR5MihuLCB1LCBpKSA6IG5bdV0gPSBlW3VdO1xuICB9XG4gIHJldHVybiBuLmRlZmF1bHQgPSBlLCB0ICYmIHQuc2V0KGUsIG4pLCBuO1xufVxuLy8gTWFwcGluZyBvZiBjbGFzcyBuYW1lcyB0byBjb25zdHJ1Y3RvcnMsIHNvIHdlIGNhbiBwb3B1bGF0ZSBvYmplY3RzIGZyb20gdGhlXG4vLyBzZXJ2ZXIgd2l0aCBhcHByb3ByaWF0ZSBzdWJjbGFzc2VzIG9mIFBhcnNlT2JqZWN0XG5jb25zdCBjbGFzc01hcCA9IHt9O1xuXG4vLyBHbG9iYWwgY291bnRlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgSWRzIGZvciBub24tc2luZ2xlLWluc3RhbmNlIG9iamVjdHNcbmxldCBvYmplY3RDb3VudCA9IDA7XG4vLyBPbiB3ZWIgY2xpZW50cywgb2JqZWN0cyBhcmUgc2luZ2xlLWluc3RhbmNlOiBhbnkgdHdvIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBJZFxuLy8gd2lsbCBoYXZlIHRoZSBzYW1lIGF0dHJpYnV0ZXMuIEhvd2V2ZXIsIHRoaXMgbWF5IGJlIGRhbmdlcm91cyBkZWZhdWx0XG4vLyBiZWhhdmlvciBpbiBhIHNlcnZlciBzY2VuYXJpb1xubGV0IHNpbmdsZUluc3RhbmNlID0gIV9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSVNfTk9ERScpO1xuaWYgKHNpbmdsZUluc3RhbmNlKSB7XG4gIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldE9iamVjdFN0YXRlQ29udHJvbGxlcihTaW5nbGVJbnN0YW5jZVN0YXRlQ29udHJvbGxlcik7XG59IGVsc2Uge1xuICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoVW5pcXVlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIpO1xufVxuZnVuY3Rpb24gZ2V0U2VydmVyVXJsUGF0aCgpIHtcbiAgbGV0IHNlcnZlclVybCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX1VSTCcpO1xuICBpZiAoc2VydmVyVXJsW3NlcnZlclVybC5sZW5ndGggLSAxXSAhPT0gJy8nKSB7XG4gICAgc2VydmVyVXJsICs9ICcvJztcbiAgfVxuICBjb25zdCB1cmwgPSBzZXJ2ZXJVcmwucmVwbGFjZSgvaHR0cHM/OlxcL1xcLy8sICcnKTtcbiAgcmV0dXJuIHVybC5zdWJzdHIoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHVybCkuY2FsbCh1cmwsICcvJykpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbW9kZWwgd2l0aCBkZWZpbmVkIGF0dHJpYnV0ZXMuXG4gKlxuICogPHA+WW91IHdvbid0IG5vcm1hbGx5IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0XG4gKiB5b3UgdXNlIGEgc3ViY2xhc3Mgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPiBpbnN0ZWFkLCBjcmVhdGVkIGJ5IGNhbGxpbmdcbiAqIDxjb2RlPmV4dGVuZDwvY29kZT4uPC9wPlxuICpcbiAqIDxwPkhvd2V2ZXIsIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSBhIHN1YmNsYXNzLCBvciBhcmVuJ3Qgc3VyZSB3aGljaFxuICogc3ViY2xhc3MgaXMgYXBwcm9wcmlhdGUsIHlvdSBjYW4gdXNlIHRoaXMgZm9ybTo8cHJlPlxuICogICAgIHZhciBvYmplY3QgPSBuZXcgUGFyc2UuT2JqZWN0KFwiQ2xhc3NOYW1lXCIpO1xuICogPC9wcmU+XG4gKiBUaGF0IGlzIGJhc2ljYWxseSBlcXVpdmFsZW50IHRvOjxwcmU+XG4gKiAgICAgdmFyIE15Q2xhc3MgPSBQYXJzZS5PYmplY3QuZXh0ZW5kKFwiQ2xhc3NOYW1lXCIpO1xuICogICAgIHZhciBvYmplY3QgPSBuZXcgTXlDbGFzcygpO1xuICogPC9wcmU+PC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5PYmplY3RcbiAqL1xuY2xhc3MgUGFyc2VPYmplY3Qge1xuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBUaGUgY2xhc3MgbmFtZSBmb3IgdGhlIG9iamVjdFxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyBUaGUgaW5pdGlhbCBzZXQgb2YgZGF0YSB0byBzdG9yZSBpbiB0aGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgdGhpcyBvYmplY3QgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaWdub3JlVmFsaWRhdGlvbl0gU2V0IHRvIGB0cnVlYCBpZ25vcmUgYW55IGF0dHJpYnV0ZSB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNsYXNzTmFtZSwgYXR0cmlidXRlcywgb3B0aW9ucykge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGlzIG9iamVjdCwgdW5pcXVlIHdpdGhpbiBpdHMgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gaWRcbiAgICAgKi9cbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImlkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfbG9jYWxJZFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX29iakNvdW50XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJjbGFzc05hbWVcIiwgdm9pZCAwKTtcbiAgICAvLyBFbmFibGUgbGVnYWN5IGluaXRpYWxpemVyc1xuICAgIGlmICh0eXBlb2YgdGhpcy5pbml0aWFsaXplID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgbGV0IHRvU2V0ID0gbnVsbDtcbiAgICB0aGlzLl9vYmpDb3VudCA9IG9iamVjdENvdW50Kys7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgIGlmIChhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzID09PSAnb2JqZWN0Jykge1xuICAgICAgICB0b1NldCA9IGF0dHJpYnV0ZXM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjbGFzc05hbWUgJiYgdHlwZW9mIGNsYXNzTmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lLmNsYXNzTmFtZTtcbiAgICAgIHRvU2V0ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gY2xhc3NOYW1lKSB7XG4gICAgICAgIGlmIChhdHRyICE9PSAnY2xhc3NOYW1lJykge1xuICAgICAgICAgIHRvU2V0W2F0dHJdID0gY2xhc3NOYW1lW2F0dHJdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IGF0dHJpYnV0ZXM7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0b1NldCAmJiAhdGhpcy5zZXQodG9TZXQsIG9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgYW4gaW52YWxpZCBQYXJzZSBPYmplY3RcIik7XG4gICAgfVxuICB9XG4gIC8qIFByb3RvdHlwZSBnZXR0ZXJzIC8gc2V0dGVycyAqL1xuXG4gIGdldCBhdHRyaWJ1dGVzKCkge1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiAoMCwgX2ZyZWV6ZS5kZWZhdWx0KShzdGF0ZUNvbnRyb2xsZXIuZXN0aW1hdGVBdHRyaWJ1dGVzKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZpcnN0IHRpbWUgdGhpcyBvYmplY3Qgd2FzIHNhdmVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7RGF0ZX0gY3JlYXRlZEF0XG4gICAqIEByZXR1cm5zIHtEYXRlfVxuICAgKi9cbiAgZ2V0IGNyZWF0ZWRBdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0U2VydmVyRGF0YSgpLmNyZWF0ZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCB0aW1lIHRoaXMgb2JqZWN0IHdhcyB1cGRhdGVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7RGF0ZX0gdXBkYXRlZEF0XG4gICAqIEByZXR1cm5zIHtEYXRlfVxuICAgKi9cbiAgZ2V0IHVwZGF0ZWRBdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0U2VydmVyRGF0YSgpLnVwZGF0ZWRBdDtcbiAgfVxuXG4gIC8qIFByaXZhdGUgbWV0aG9kcyAqL1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbG9jYWwgb3Igc2VydmVyIElkIHVzZWQgdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBvYmplY3RcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIF9nZXRJZCgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9sb2NhbElkID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsSWQ7XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsSWQgPSAnbG9jYWwnICsgKDAsIF91dWlkLmRlZmF1bHQpKCk7XG4gICAgdGhpcy5fbG9jYWxJZCA9IGxvY2FsSWQ7XG4gICAgcmV0dXJuIGxvY2FsSWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHVuaXF1ZSBpZGVudGlmaWVyIHVzZWQgdG8gcHVsbCBkYXRhIGZyb20gdGhlIFN0YXRlIENvbnRyb2xsZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R8b2JqZWN0fVxuICAgKi9cbiAgX2dldFN0YXRlSWRlbnRpZmllcigpIHtcbiAgICBpZiAoc2luZ2xlSW5zdGFuY2UpIHtcbiAgICAgIGxldCBpZCA9IHRoaXMuaWQ7XG4gICAgICBpZiAoIWlkKSB7XG4gICAgICAgIGlkID0gdGhpcy5fZ2V0SWQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG4gIF9nZXRTZXJ2ZXJEYXRhKCkge1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBzdGF0ZUNvbnRyb2xsZXIuZ2V0U2VydmVyRGF0YSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gIH1cbiAgX2NsZWFyU2VydmVyRGF0YSgpIHtcbiAgICBjb25zdCBzZXJ2ZXJEYXRhID0gdGhpcy5fZ2V0U2VydmVyRGF0YSgpO1xuICAgIGNvbnN0IHVuc2V0ID0ge307XG4gICAgZm9yIChjb25zdCBhdHRyIGluIHNlcnZlckRhdGEpIHtcbiAgICAgIHVuc2V0W2F0dHJdID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBzdGF0ZUNvbnRyb2xsZXIuc2V0U2VydmVyRGF0YSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgdW5zZXQpO1xuICB9XG4gIF9nZXRQZW5kaW5nT3BzKCkge1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBzdGF0ZUNvbnRyb2xsZXIuZ2V0UGVuZGluZ09wcyh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBba2V5c1RvQ2xlYXJdIC0gaWYgc3BlY2lmaWVkLCBvbmx5IG9wcyBtYXRjaGluZ1xuICAgKiB0aGVzZSBmaWVsZHMgd2lsbCBiZSBjbGVhcmVkXG4gICAqL1xuICBfY2xlYXJQZW5kaW5nT3BzKGtleXNUb0NsZWFyKSB7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMuX2dldFBlbmRpbmdPcHMoKTtcbiAgICBjb25zdCBsYXRlc3QgPSBwZW5kaW5nW3BlbmRpbmcubGVuZ3RoIC0gMV07XG4gICAgY29uc3Qga2V5cyA9IGtleXNUb0NsZWFyIHx8ICgwLCBfa2V5cy5kZWZhdWx0KShsYXRlc3QpO1xuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSA9PiB7XG4gICAgICBkZWxldGUgbGF0ZXN0W2tleV07XG4gICAgfSk7XG4gIH1cbiAgX2dldERpcnR5T2JqZWN0QXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IG9iamVjdENhY2hlID0gc3RhdGVDb250cm9sbGVyLmdldE9iamVjdENhY2hlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICBjb25zdCBkaXJ0eSA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCB2YWwgPSBhdHRyaWJ1dGVzW2F0dHJdO1xuICAgICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhKHZhbCBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSAmJiAhKHZhbCBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCkgJiYgISh2YWwgaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSkge1xuICAgICAgICAvLyBEdWUgdG8gdGhlIHdheSBicm93c2VycyBjb25zdHJ1Y3QgbWFwcywgdGhlIGtleSBvcmRlciB3aWxsIG5vdCBjaGFuZ2VcbiAgICAgICAgLy8gdW5sZXNzIHRoZSBvYmplY3QgaXMgY2hhbmdlZFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGpzb24gPSAoMCwgX2VuY29kZS5kZWZhdWx0KSh2YWwsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICBjb25zdCBzdHJpbmdpZmllZCA9ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKGpzb24pO1xuICAgICAgICAgIGlmIChvYmplY3RDYWNoZVthdHRyXSAhPT0gc3RyaW5naWZpZWQpIHtcbiAgICAgICAgICAgIGRpcnR5W2F0dHJdID0gdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIEVycm9yIG9jY3VycmVkLCBwb3NzaWJseSBieSBhIG5lc3RlZCB1bnNhdmVkIHBvaW50ZXIgaW4gYSBtdXRhYmxlIGNvbnRhaW5lclxuICAgICAgICAgIC8vIE5vIG1hdHRlciBob3cgaXQgaGFwcGVuZWQsIGl0IGluZGljYXRlcyBhIGNoYW5nZSBpbiB0aGUgYXR0cmlidXRlXG4gICAgICAgICAgZGlydHlbYXR0cl0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpcnR5O1xuICB9XG4gIF90b0Z1bGxKU09OKHNlZW4sIG9mZmxpbmUpIHtcbiAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oc2Vlbiwgb2ZmbGluZSk7XG4gICAganNvbi5fX3R5cGUgPSAnT2JqZWN0JztcbiAgICBqc29uLmNsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lO1xuICAgIHJldHVybiBqc29uO1xuICB9XG4gIF9nZXRTYXZlSlNPTigpIHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGNvbnN0IGRpcnR5T2JqZWN0cyA9IHRoaXMuX2dldERpcnR5T2JqZWN0QXR0cmlidXRlcygpO1xuICAgIGNvbnN0IGpzb24gPSB7fTtcbiAgICBmb3IgKHZhciBhdHRyIGluIGRpcnR5T2JqZWN0cykge1xuICAgICAgbGV0IGlzRG90Tm90YXRpb24gPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHBlbmRpbmdbaV0pIHtcbiAgICAgICAgICAvLyBEb3Qgbm90YXRpb24gb3BlcmF0aW9ucyBhcmUgaGFuZGxlZCBsYXRlclxuICAgICAgICAgIGlmICgoMCwgX2luY2x1ZGVzLmRlZmF1bHQpKGZpZWxkKS5jYWxsKGZpZWxkLCAnLicpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBmaWVsZC5zcGxpdCgnLicpWzBdO1xuICAgICAgICAgICAgaWYgKGZpZWxkTmFtZSA9PT0gYXR0cikge1xuICAgICAgICAgICAgICBpc0RvdE5vdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzRG90Tm90YXRpb24pIHtcbiAgICAgICAganNvblthdHRyXSA9IG5ldyBfUGFyc2VPcC5TZXRPcChkaXJ0eU9iamVjdHNbYXR0cl0pLnRvSlNPTigpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGF0dHIgaW4gcGVuZGluZ1swXSkge1xuICAgICAganNvblthdHRyXSA9IHBlbmRpbmdbMF1bYXR0cl0udG9KU09OKCk7XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xuICB9XG4gIF9nZXRTYXZlUGFyYW1zKCkge1xuICAgIGxldCBtZXRob2QgPSB0aGlzLmlkID8gJ1BVVCcgOiAnUE9TVCc7XG4gICAgY29uc3QgYm9keSA9IHRoaXMuX2dldFNhdmVKU09OKCk7XG4gICAgbGV0IHBhdGggPSAnY2xhc3Nlcy8nICsgdGhpcy5jbGFzc05hbWU7XG4gICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnQUxMT1dfQ1VTVE9NX09CSkVDVF9JRCcpKSB7XG4gICAgICBpZiAoIXRoaXMuY3JlYXRlZEF0KSB7XG4gICAgICAgIG1ldGhvZCA9ICdQT1NUJztcbiAgICAgICAgYm9keS5vYmplY3RJZCA9IHRoaXMuaWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRob2QgPSAnUFVUJztcbiAgICAgICAgcGF0aCArPSAnLycgKyB0aGlzLmlkO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pZCkge1xuICAgICAgcGF0aCArPSAnLycgKyB0aGlzLmlkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicpIHtcbiAgICAgIHBhdGggPSAndXNlcnMnO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kLFxuICAgICAgYm9keSxcbiAgICAgIHBhdGhcbiAgICB9O1xuICB9XG4gIF9maW5pc2hGZXRjaChzZXJ2ZXJEYXRhKSB7XG4gICAgaWYgKCF0aGlzLmlkICYmIHNlcnZlckRhdGEub2JqZWN0SWQpIHtcbiAgICAgIHRoaXMuaWQgPSBzZXJ2ZXJEYXRhLm9iamVjdElkO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBzdGF0ZUNvbnRyb2xsZXIuaW5pdGlhbGl6ZVN0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICBjb25zdCBkZWNvZGVkID0ge307XG4gICAgZm9yIChjb25zdCBhdHRyIGluIHNlcnZlckRhdGEpIHtcbiAgICAgIGlmIChhdHRyID09PSAnQUNMJykge1xuICAgICAgICBkZWNvZGVkW2F0dHJdID0gbmV3IF9QYXJzZUFDTC5kZWZhdWx0KHNlcnZlckRhdGFbYXR0cl0pO1xuICAgICAgfSBlbHNlIGlmIChhdHRyICE9PSAnb2JqZWN0SWQnKSB7XG4gICAgICAgIGRlY29kZWRbYXR0cl0gPSAoMCwgX2RlY29kZS5kZWZhdWx0KShzZXJ2ZXJEYXRhW2F0dHJdKTtcbiAgICAgICAgaWYgKGRlY29kZWRbYXR0cl0gaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSB7XG4gICAgICAgICAgZGVjb2RlZFthdHRyXS5fZW5zdXJlUGFyZW50QW5kS2V5KHRoaXMsIGF0dHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWNvZGVkLmNyZWF0ZWRBdCAmJiB0eXBlb2YgZGVjb2RlZC5jcmVhdGVkQXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkZWNvZGVkLmNyZWF0ZWRBdCA9ICgwLCBfcGFyc2VEYXRlLmRlZmF1bHQpKGRlY29kZWQuY3JlYXRlZEF0KTtcbiAgICB9XG4gICAgaWYgKGRlY29kZWQudXBkYXRlZEF0ICYmIHR5cGVvZiBkZWNvZGVkLnVwZGF0ZWRBdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRlY29kZWQudXBkYXRlZEF0ID0gKDAsIF9wYXJzZURhdGUuZGVmYXVsdCkoZGVjb2RlZC51cGRhdGVkQXQpO1xuICAgIH1cbiAgICBpZiAoIWRlY29kZWQudXBkYXRlZEF0ICYmIGRlY29kZWQuY3JlYXRlZEF0KSB7XG4gICAgICBkZWNvZGVkLnVwZGF0ZWRBdCA9IGRlY29kZWQuY3JlYXRlZEF0O1xuICAgIH1cbiAgICBzdGF0ZUNvbnRyb2xsZXIuY29tbWl0U2VydmVyQ2hhbmdlcyh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgZGVjb2RlZCk7XG4gIH1cbiAgX3NldEV4aXN0ZWQoZXhpc3RlZCkge1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHN0YXRlID0gc3RhdGVDb250cm9sbGVyLmdldFN0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIHN0YXRlLmV4aXN0ZWQgPSBleGlzdGVkO1xuICAgIH1cbiAgfVxuICBfbWlncmF0ZUlkKHNlcnZlcklkKSB7XG4gICAgaWYgKHRoaXMuX2xvY2FsSWQgJiYgc2VydmVySWQpIHtcbiAgICAgIGlmIChzaW5nbGVJbnN0YW5jZSkge1xuICAgICAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICAgICAgY29uc3Qgb2xkU3RhdGUgPSBzdGF0ZUNvbnRyb2xsZXIucmVtb3ZlU3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgICAgICB0aGlzLmlkID0gc2VydmVySWQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sb2NhbElkO1xuICAgICAgICBpZiAob2xkU3RhdGUpIHtcbiAgICAgICAgICBzdGF0ZUNvbnRyb2xsZXIuaW5pdGlhbGl6ZVN0YXRlKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpLCBvbGRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaWQgPSBzZXJ2ZXJJZDtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xvY2FsSWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9oYW5kbGVTYXZlUmVzcG9uc2UocmVzcG9uc2UsIHN0YXR1cykge1xuICAgIGNvbnN0IGNoYW5nZXMgPSB7fTtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwZW5kaW5nID0gc3RhdGVDb250cm9sbGVyLnBvcFBlbmRpbmdTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSk7XG4gICAgZm9yICh2YXIgYXR0ciBpbiBwZW5kaW5nKSB7XG4gICAgICBpZiAocGVuZGluZ1thdHRyXSBpbnN0YW5jZW9mIF9QYXJzZU9wLlJlbGF0aW9uT3ApIHtcbiAgICAgICAgY2hhbmdlc1thdHRyXSA9IHBlbmRpbmdbYXR0cl0uYXBwbHlUbyh1bmRlZmluZWQsIHRoaXMsIGF0dHIpO1xuICAgICAgfSBlbHNlIGlmICghKGF0dHIgaW4gcmVzcG9uc2UpKSB7XG4gICAgICAgIC8vIE9ubHkgU2V0T3BzIGFuZCBVbnNldE9wcyBzaG91bGQgbm90IGNvbWUgYmFjayB3aXRoIHJlc3VsdHNcbiAgICAgICAgY2hhbmdlc1thdHRyXSA9IHBlbmRpbmdbYXR0cl0uYXBwbHlUbyh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGF0dHIgaW4gcmVzcG9uc2UpIHtcbiAgICAgIGlmICgoYXR0ciA9PT0gJ2NyZWF0ZWRBdCcgfHwgYXR0ciA9PT0gJ3VwZGF0ZWRBdCcpICYmIHR5cGVvZiByZXNwb25zZVthdHRyXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY2hhbmdlc1thdHRyXSA9ICgwLCBfcGFyc2VEYXRlLmRlZmF1bHQpKHJlc3BvbnNlW2F0dHJdKTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0ciA9PT0gJ0FDTCcpIHtcbiAgICAgICAgY2hhbmdlc1thdHRyXSA9IG5ldyBfUGFyc2VBQ0wuZGVmYXVsdChyZXNwb25zZVthdHRyXSk7XG4gICAgICB9IGVsc2UgaWYgKGF0dHIgIT09ICdvYmplY3RJZCcpIHtcbiAgICAgICAgY29uc3QgdmFsID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkocmVzcG9uc2VbYXR0cl0pO1xuICAgICAgICBpZiAodmFsICYmICgwLCBfZ2V0UHJvdG90eXBlT2YuZGVmYXVsdCkodmFsKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICAgIGNoYW5nZXNbYXR0cl0gPSB7XG4gICAgICAgICAgICAuLi50aGlzLmF0dHJpYnV0ZXNbYXR0cl0sXG4gICAgICAgICAgICAuLi52YWxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoYW5nZXNbYXR0cl0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbYXR0cl0gaW5zdGFuY2VvZiBfUGFyc2VPcC5VbnNldE9wKSB7XG4gICAgICAgICAgY2hhbmdlc1thdHRyXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5jcmVhdGVkQXQgJiYgIWNoYW5nZXMudXBkYXRlZEF0KSB7XG4gICAgICBjaGFuZ2VzLnVwZGF0ZWRBdCA9IGNoYW5nZXMuY3JlYXRlZEF0O1xuICAgIH1cbiAgICB0aGlzLl9taWdyYXRlSWQocmVzcG9uc2Uub2JqZWN0SWQpO1xuICAgIGlmIChzdGF0dXMgIT09IDIwMSkge1xuICAgICAgdGhpcy5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICB9XG4gICAgc3RhdGVDb250cm9sbGVyLmNvbW1pdFNlcnZlckNoYW5nZXModGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCksIGNoYW5nZXMpO1xuICB9XG4gIF9oYW5kbGVTYXZlRXJyb3IoKSB7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgc3RhdGVDb250cm9sbGVyLm1lcmdlRmlyc3RQZW5kaW5nU3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICB9XG4gIHN0YXRpYyBfZ2V0Q2xhc3NNYXAoKSB7XG4gICAgcmV0dXJuIGNsYXNzTWFwO1xuICB9XG5cbiAgLyogUHVibGljIG1ldGhvZHMgKi9cblxuICBpbml0aWFsaXplKCkge1xuICAgIC8vIE5PT1BcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTiB2ZXJzaW9uIG9mIHRoZSBvYmplY3Qgc3VpdGFibGUgZm9yIHNhdmluZyB0byBQYXJzZS5cbiAgICpcbiAgICogQHBhcmFtIHNlZW5cbiAgICogQHBhcmFtIG9mZmxpbmVcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIHRvSlNPTihzZWVuLCBvZmZsaW5lKSB7XG4gICAgY29uc3Qgc2VlbkVudHJ5ID0gdGhpcy5pZCA/IHRoaXMuY2xhc3NOYW1lICsgJzonICsgdGhpcy5pZCA6IHRoaXM7XG4gICAgc2VlbiA9IHNlZW4gfHwgW3NlZW5FbnRyeV07XG4gICAgY29uc3QganNvbiA9IHt9O1xuICAgIGNvbnN0IGF0dHJzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBhdHRycykge1xuICAgICAgaWYgKChhdHRyID09PSAnY3JlYXRlZEF0JyB8fCBhdHRyID09PSAndXBkYXRlZEF0JykgJiYgYXR0cnNbYXR0cl0udG9KU09OKSB7XG4gICAgICAgIGpzb25bYXR0cl0gPSBhdHRyc1thdHRyXS50b0pTT04oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb25bYXR0cl0gPSAoMCwgX2VuY29kZS5kZWZhdWx0KShhdHRyc1thdHRyXSwgZmFsc2UsIGZhbHNlLCBzZWVuLCBvZmZsaW5lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMuX2dldFBlbmRpbmdPcHMoKTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gcGVuZGluZ1swXSkge1xuICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShhdHRyKS5jYWxsKGF0dHIsICcuJykgPCAwKSB7XG4gICAgICAgIGpzb25bYXR0cl0gPSBwZW5kaW5nWzBdW2F0dHJdLnRvSlNPTihvZmZsaW5lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaWQpIHtcbiAgICAgIGpzb24ub2JqZWN0SWQgPSB0aGlzLmlkO1xuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBQYXJzZU9iamVjdCBpcyBlcXVhbCB0byBhbm90aGVyIFBhcnNlT2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvdGhlciAtIEFuIG90aGVyIG9iamVjdCBvdCBjb21wYXJlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZXF1YWxzKG90aGVyKSB7XG4gICAgaWYgKHRoaXMgPT09IG90aGVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgUGFyc2VPYmplY3QgJiYgdGhpcy5jbGFzc05hbWUgPT09IG90aGVyLmNsYXNzTmFtZSAmJiB0aGlzLmlkID09PSBvdGhlci5pZCAmJiB0eXBlb2YgdGhpcy5pZCAhPT0gJ3VuZGVmaW5lZCc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0cyBsYXN0XG4gICAqIHNhdmUvcmVmcmVzaC4gIElmIGFuIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIGl0IHJldHVybnMgdHJ1ZSBvbmx5IGlmIHRoYXRcbiAgICogcGFydGljdWxhciBhdHRyaWJ1dGUgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGxhc3Qgc2F2ZS9yZWZyZXNoLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBBbiBhdHRyaWJ1dGUgbmFtZSAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGRpcnR5KGF0dHIpIHtcbiAgICBpZiAoIXRoaXMuaWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwZW5kaW5nT3BzID0gdGhpcy5fZ2V0UGVuZGluZ09wcygpO1xuICAgIGNvbnN0IGRpcnR5T2JqZWN0cyA9IHRoaXMuX2dldERpcnR5T2JqZWN0QXR0cmlidXRlcygpO1xuICAgIGlmIChhdHRyKSB7XG4gICAgICBpZiAoZGlydHlPYmplY3RzLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwZW5kaW5nT3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwZW5kaW5nT3BzW2ldLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCgwLCBfa2V5cy5kZWZhdWx0KShwZW5kaW5nT3BzWzBdKS5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoKDAsIF9rZXlzLmRlZmF1bHQpKGRpcnR5T2JqZWN0cykubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2Yga2V5cyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBzaW5jZSBsYXN0IHNhdmUvcmVmcmVzaFxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBkaXJ0eUtleXMoKSB7XG4gICAgY29uc3QgcGVuZGluZ09wcyA9IHRoaXMuX2dldFBlbmRpbmdPcHMoKTtcbiAgICBjb25zdCBrZXlzID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwZW5kaW5nT3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gcGVuZGluZ09wc1tpXSkge1xuICAgICAgICBrZXlzW2F0dHJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGlydHlPYmplY3RzID0gdGhpcy5fZ2V0RGlydHlPYmplY3RBdHRyaWJ1dGVzKCk7XG4gICAgZm9yIChjb25zdCBhdHRyIGluIGRpcnR5T2JqZWN0cykge1xuICAgICAga2V5c1thdHRyXSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX2tleXMuZGVmYXVsdCkoa2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gZmV0Y2hlZC5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0RhdGFBdmFpbGFibGUoKSB7XG4gICAgY29uc3Qgc2VydmVyRGF0YSA9IHRoaXMuX2dldFNlcnZlckRhdGEoKTtcbiAgICByZXR1cm4gISEoMCwgX2tleXMuZGVmYXVsdCkoc2VydmVyRGF0YSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBQb2ludGVyIHJlZmVyZW5jaW5nIHRoaXMgT2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UG9pbnRlcn1cbiAgICovXG4gIHRvUG9pbnRlcigpIHtcbiAgICBpZiAoIXRoaXMuaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBhIHBvaW50ZXIgdG8gYW4gdW5zYXZlZCBQYXJzZU9iamVjdCcpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLFxuICAgICAgb2JqZWN0SWQ6IHRoaXMuaWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBQb2ludGVyIHJlZmVyZW5jaW5nIHRoaXMgT2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UG9pbnRlcn1cbiAgICovXG4gIHRvT2ZmbGluZVBvaW50ZXIoKSB7XG4gICAgaWYgKCF0aGlzLl9sb2NhbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBvZmZsaW5lIHBvaW50ZXIgdG8gYSBzYXZlZCBQYXJzZU9iamVjdCcpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnT2JqZWN0JyxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICBfbG9jYWxJZDogdGhpcy5fbG9jYWxJZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgc3RyaW5nIG5hbWUgb2YgYW4gYXR0cmlidXRlLlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGdldChhdHRyKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlc1thdHRyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVsYXRpb24gb24gdGhlIGdpdmVuIGNsYXNzIGZvciB0aGUgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgYXR0cmlidXRlIHRvIGdldCB0aGUgcmVsYXRpb24gZm9yLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUmVsYXRpb259XG4gICAqL1xuICByZWxhdGlvbihhdHRyKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldChhdHRyKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsZWQgcmVsYXRpb24oKSBvbiBub24tcmVsYXRpb24gZmllbGQgJyArIGF0dHIpO1xuICAgICAgfVxuICAgICAgdmFsdWUuX2Vuc3VyZVBhcmVudEFuZEtleSh0aGlzLCBhdHRyKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KHRoaXMsIGF0dHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEhUTUwtZXNjYXBlZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBzdHJpbmcgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlc2NhcGUoYXR0cikge1xuICAgIGxldCB2YWwgPSB0aGlzLmF0dHJpYnV0ZXNbYXR0cl07XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsICE9PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHR5cGVvZiB2YWwudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgdmFsID0gdmFsLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX2VzY2FwZS5kZWZhdWx0KSh2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGF0dHJpYnV0ZSBjb250YWlucyBhIHZhbHVlIHRoYXQgaXMgbm90XG4gICAqIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgc3RyaW5nIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBoYXMoYXR0cikge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgaWYgKGF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzW2F0dHJdICE9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgaGFzaCBvZiBtb2RlbCBhdHRyaWJ1dGVzIG9uIHRoZSBvYmplY3QuXG4gICAqXG4gICAqIDxwPllvdSBjYW4gY2FsbCBpdCB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIGtleXMgYW5kIHZhbHVlcywgd2l0aCBvbmVcbiAgICoga2V5IGFuZCB2YWx1ZSwgb3IgZG90IG5vdGF0aW9uLiAgRm9yIGV4YW1wbGU6PHByZT5cbiAgICogICBnYW1lVHVybi5zZXQoe1xuICAgKiAgICAgcGxheWVyOiBwbGF5ZXIxLFxuICAgKiAgICAgZGljZVJvbGw6IDJcbiAgICogICB9LCB7XG4gICAqICAgICBlcnJvcjogZnVuY3Rpb24oZ2FtZVR1cm5BZ2FpbiwgZXJyb3IpIHtcbiAgICogICAgICAgLy8gVGhlIHNldCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICogICAgIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogICBnYW1lLnNldChcImN1cnJlbnRQbGF5ZXJcIiwgcGxheWVyMiwge1xuICAgKiAgICAgZXJyb3I6IGZ1bmN0aW9uKGdhbWVUdXJuQWdhaW4sIGVycm9yKSB7XG4gICAqICAgICAgIC8vIFRoZSBzZXQgZmFpbGVkIHZhbGlkYXRpb24uXG4gICAqICAgICB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqICAgZ2FtZS5zZXQoXCJmaW5pc2hlZFwiLCB0cnVlKTs8L3ByZT48L3A+XG4gICAqXG4gICAqICAgZ2FtZS5zZXQoXCJwbGF5ZXIuc2NvcmVcIiwgMTApOzwvcHJlPjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdCl9IGtleSBUaGUga2V5IHRvIHNldC5cbiAgICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdCl9IHZhbHVlIFRoZSB2YWx1ZSB0byBnaXZlIGl0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBBIHNldCBvZiBvcHRpb25zIGZvciB0aGUgc2V0LlxuICAgKiAgICAgVGhlIG9ubHkgc3VwcG9ydGVkIG9wdGlvbiBpcyA8Y29kZT5lcnJvcjwvY29kZT4uXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3R8Ym9vbGVhbil9IHRydWUgaWYgdGhlIHNldCBzdWNjZWVkZWQuXG4gICAqL1xuICBzZXQoa2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIGxldCBjaGFuZ2VzID0ge307XG4gICAgY29uc3QgbmV3T3BzID0ge307XG4gICAgaWYgKGtleSAmJiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgY2hhbmdlcyA9IGtleTtcbiAgICAgIG9wdGlvbnMgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjaGFuZ2VzW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGxldCByZWFkb25seSA9IFtdO1xuICAgIGlmICh0eXBlb2YgdGhpcy5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlYWRvbmx5ID0gKDAsIF9jb25jYXQuZGVmYXVsdCkocmVhZG9ubHkpLmNhbGwocmVhZG9ubHksIHRoaXMuY29uc3RydWN0b3IucmVhZE9ubHlBdHRyaWJ1dGVzKCkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGsgaW4gY2hhbmdlcykge1xuICAgICAgaWYgKGsgPT09ICdjcmVhdGVkQXQnIHx8IGsgPT09ICd1cGRhdGVkQXQnKSB7XG4gICAgICAgIC8vIFRoaXMgcHJvcGVydHkgaXMgcmVhZC1vbmx5LCBidXQgZm9yIGxlZ2FjeSByZWFzb25zIHdlIHNpbGVudGx5XG4gICAgICAgIC8vIGlnbm9yZSBpdFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkocmVhZG9ubHkpLmNhbGwocmVhZG9ubHksIGspID4gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbW9kaWZ5IHJlYWRvbmx5IGF0dHJpYnV0ZTogJyArIGspO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMudW5zZXQpIHtcbiAgICAgICAgbmV3T3BzW2tdID0gbmV3IF9QYXJzZU9wLlVuc2V0T3AoKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlc1trXSBpbnN0YW5jZW9mIF9QYXJzZU9wLk9wKSB7XG4gICAgICAgIG5ld09wc1trXSA9IGNoYW5nZXNba107XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXNba10gJiYgdHlwZW9mIGNoYW5nZXNba10gPT09ICdvYmplY3QnICYmIHR5cGVvZiBjaGFuZ2VzW2tdLl9fb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG5ld09wc1trXSA9ICgwLCBfUGFyc2VPcC5vcEZyb21KU09OKShjaGFuZ2VzW2tdKTtcbiAgICAgIH0gZWxzZSBpZiAoayA9PT0gJ29iamVjdElkJyB8fCBrID09PSAnaWQnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2hhbmdlc1trXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLmlkID0gY2hhbmdlc1trXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrID09PSAnQUNMJyAmJiB0eXBlb2YgY2hhbmdlc1trXSA9PT0gJ29iamVjdCcgJiYgIShjaGFuZ2VzW2tdIGluc3RhbmNlb2YgX1BhcnNlQUNMLmRlZmF1bHQpKSB7XG4gICAgICAgIG5ld09wc1trXSA9IG5ldyBfUGFyc2VPcC5TZXRPcChuZXcgX1BhcnNlQUNMLmRlZmF1bHQoY2hhbmdlc1trXSkpO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzW2tdIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkge1xuICAgICAgICBjb25zdCByZWxhdGlvbiA9IG5ldyBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KHRoaXMsIGspO1xuICAgICAgICByZWxhdGlvbi50YXJnZXRDbGFzc05hbWUgPSBjaGFuZ2VzW2tdLnRhcmdldENsYXNzTmFtZTtcbiAgICAgICAgbmV3T3BzW2tdID0gbmV3IF9QYXJzZU9wLlNldE9wKHJlbGF0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld09wc1trXSA9IG5ldyBfUGFyc2VPcC5TZXRPcChjaGFuZ2VzW2tdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY3VycmVudEF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHZhbHVlc1xuICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHt9O1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBuZXdPcHMpIHtcbiAgICAgIGlmIChuZXdPcHNbYXR0cl0gaW5zdGFuY2VvZiBfUGFyc2VPcC5SZWxhdGlvbk9wKSB7XG4gICAgICAgIG5ld1ZhbHVlc1thdHRyXSA9IG5ld09wc1thdHRyXS5hcHBseVRvKGN1cnJlbnRBdHRyaWJ1dGVzW2F0dHJdLCB0aGlzLCBhdHRyKTtcbiAgICAgIH0gZWxzZSBpZiAoIShuZXdPcHNbYXR0cl0gaW5zdGFuY2VvZiBfUGFyc2VPcC5VbnNldE9wKSkge1xuICAgICAgICBuZXdWYWx1ZXNbYXR0cl0gPSBuZXdPcHNbYXR0cl0uYXBwbHlUbyhjdXJyZW50QXR0cmlidXRlc1thdHRyXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbmdlc1xuICAgIGlmICghb3B0aW9ucy5pZ25vcmVWYWxpZGF0aW9uKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZShuZXdWYWx1ZXMpO1xuICAgICAgaWYgKHZhbGlkYXRpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb3B0aW9ucy5lcnJvcih0aGlzLCB2YWxpZGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29uc29saWRhdGUgT3BzXG4gICAgY29uc3QgcGVuZGluZ09wcyA9IHRoaXMuX2dldFBlbmRpbmdPcHMoKTtcbiAgICBjb25zdCBsYXN0ID0gcGVuZGluZ09wcy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiBuZXdPcHMpIHtcbiAgICAgIGNvbnN0IG5leHRPcCA9IG5ld09wc1thdHRyXS5tZXJnZVdpdGgocGVuZGluZ09wc1tsYXN0XVthdHRyXSk7XG4gICAgICBzdGF0ZUNvbnRyb2xsZXIuc2V0UGVuZGluZ09wKHRoaXMuX2dldFN0YXRlSWRlbnRpZmllcigpLCBhdHRyLCBuZXh0T3ApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gYXR0cmlidXRlIGZyb20gdGhlIG1vZGVsLiBUaGlzIGlzIGEgbm9vcCBpZiB0aGUgYXR0cmlidXRlIGRvZXNuJ3RcbiAgICogZXhpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBzdHJpbmcgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIHVuc2V0KGF0dHIsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLnVuc2V0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbnVsbCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSBpbmNyZW1lbnRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHRoZSBuZXh0IHRpbWUgdGhlXG4gICAqIG9iamVjdCBpcyBzYXZlZC4gSWYgbm8gYW1vdW50IGlzIHNwZWNpZmllZCwgMSBpcyB1c2VkIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBhbW91bnQge051bWJlcn0gVGhlIGFtb3VudCB0byBpbmNyZW1lbnQgYnkgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdHxib29sZWFuKX1cbiAgICovXG4gIGluY3JlbWVudChhdHRyLCBhbW91bnQpIHtcbiAgICBpZiAodHlwZW9mIGFtb3VudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGFtb3VudCA9IDE7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgaW5jcmVtZW50IGJ5IGEgbm9uLW51bWVyaWMgYW1vdW50LicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbmV3IF9QYXJzZU9wLkluY3JlbWVudE9wKGFtb3VudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZSB0aGUgbmV4dCB0aW1lIHRoZVxuICAgKiBvYmplY3QgaXMgc2F2ZWQuIElmIG5vIGFtb3VudCBpcyBzcGVjaWZpZWQsIDEgaXMgdXNlZCBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gYW1vdW50IHtOdW1iZXJ9IFRoZSBhbW91bnQgdG8gZGVjcmVtZW50IGJ5IChvcHRpb25hbCkuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIGRlY3JlbWVudChhdHRyLCBhbW91bnQpIHtcbiAgICBpZiAodHlwZW9mIGFtb3VudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGFtb3VudCA9IDE7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGVjcmVtZW50IGJ5IGEgbm9uLW51bWVyaWMgYW1vdW50LicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbmV3IF9QYXJzZU9wLkluY3JlbWVudE9wKGFtb3VudCAqIC0xKSk7XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSBhZGQgYW4gb2JqZWN0IHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuXG4gICAqIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGF0dHIge1N0cmluZ30gVGhlIGtleS5cbiAgICogQHBhcmFtIGl0ZW0ge30gVGhlIGl0ZW0gdG8gYWRkLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICBhZGQoYXR0ciwgaXRlbSkge1xuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuQWRkT3AoW2l0ZW1dKSk7XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSBhZGQgdGhlIG9iamVjdHMgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW5cbiAgICoga2V5LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gaXRlbXMge09iamVjdFtdfSBUaGUgaXRlbXMgdG8gYWRkLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICBhZGRBbGwoYXR0ciwgaXRlbXMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbmV3IF9QYXJzZU9wLkFkZE9wKGl0ZW1zKSk7XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSBhZGQgYW4gb2JqZWN0IHRvIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBrZXksIG9ubHlcbiAgICogaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgYXJyYXkuIFRoZSBwb3NpdGlvbiBvZiB0aGUgaW5zZXJ0IGlzXG4gICAqIG5vdCBndWFyYW50ZWVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gaXRlbSB7fSBUaGUgb2JqZWN0IHRvIGFkZC5cbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgYWRkVW5pcXVlKGF0dHIsIGl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbmV3IF9QYXJzZU9wLkFkZFVuaXF1ZU9wKFtpdGVtXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgYWRkIHRoZSBvYmplY3RzIHRvIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBrZXksIG9ubHlcbiAgICogaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudCBpbiB0aGUgYXJyYXkuIFRoZSBwb3NpdGlvbiBvZiB0aGUgaW5zZXJ0IGlzXG4gICAqIG5vdCBndWFyYW50ZWVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcGFyYW0gaXRlbXMge09iamVjdFtdfSBUaGUgb2JqZWN0cyB0byBhZGQuXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX1cbiAgICovXG4gIGFkZEFsbFVuaXF1ZShhdHRyLCBpdGVtcykge1xuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuQWRkVW5pcXVlT3AoaXRlbXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IHJlbW92ZSBhbGwgaW5zdGFuY2VzIG9mIGFuIG9iamVjdCBmcm9tIHRoZSBhcnJheSBhc3NvY2lhdGVkXG4gICAqIHdpdGggYSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBpdGVtIHt9IFRoZSBvYmplY3QgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICByZW1vdmUoYXR0ciwgaXRlbSkge1xuICAgIHJldHVybiB0aGlzLnNldChhdHRyLCBuZXcgX1BhcnNlT3AuUmVtb3ZlT3AoW2l0ZW1dKSk7XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSByZW1vdmUgYWxsIGluc3RhbmNlcyBvZiB0aGUgb2JqZWN0cyBmcm9tIHRoZSBhcnJheSBhc3NvY2lhdGVkXG4gICAqIHdpdGggYSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRyIHtTdHJpbmd9IFRoZSBrZXkuXG4gICAqIEBwYXJhbSBpdGVtcyB7T2JqZWN0W119IFRoZSBvYmplY3QgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0IHwgYm9vbGVhbil9XG4gICAqL1xuICByZW1vdmVBbGwoYXR0ciwgaXRlbXMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgbmV3IF9QYXJzZU9wLlJlbW92ZU9wKGl0ZW1zKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIFBhcnNlLk9wIGRlc2NyaWJpbmcgd2hhdCBraW5kIG9mXG4gICAqIG1vZGlmaWNhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQgb24gdGhpcyBmaWVsZCBzaW5jZSB0aGUgbGFzdCB0aW1lIGl0IHdhc1xuICAgKiBzYXZlZC4gRm9yIGV4YW1wbGUsIGFmdGVyIGNhbGxpbmcgb2JqZWN0LmluY3JlbWVudChcInhcIiksIGNhbGxpbmdcbiAgICogb2JqZWN0Lm9wKFwieFwiKSB3b3VsZCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgUGFyc2UuT3AuSW5jcmVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0ciB7U3RyaW5nfSBUaGUga2V5LlxuICAgKiBAcmV0dXJucyB7UGFyc2UuT3AgfCB1bmRlZmluZWR9IFRoZSBvcGVyYXRpb24sIG9yIHVuZGVmaW5lZCBpZiBub25lLlxuICAgKi9cbiAgb3AoYXR0cikge1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLl9nZXRQZW5kaW5nT3BzKCk7XG4gICAgZm9yIChsZXQgaSA9IHBlbmRpbmcubGVuZ3RoOyBpLS07KSB7XG4gICAgICBpZiAocGVuZGluZ1tpXVthdHRyXSkge1xuICAgICAgICByZXR1cm4gcGVuZGluZ1tpXVthdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBtb2RlbCB3aXRoIGlkZW50aWNhbCBhdHRyaWJ1dGVzIHRvIHRoaXMgb25lLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fVxuICAgKi9cbiAgY2xvbmUoKSB7XG4gICAgY29uc3QgY2xvbmUgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmNsYXNzTmFtZSk7XG4gICAgbGV0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgcmVhZG9ubHkgPSB0aGlzLmNvbnN0cnVjdG9yLnJlYWRPbmx5QXR0cmlidXRlcygpIHx8IFtdO1xuICAgICAgLy8gQXR0cmlidXRlcyBhcmUgZnJvemVuLCBzbyB3ZSBoYXZlIHRvIHJlYnVpbGQgYW4gb2JqZWN0LFxuICAgICAgLy8gcmF0aGVyIHRoYW4gZGVsZXRlIHJlYWRvbmx5IGtleXNcbiAgICAgIGNvbnN0IGNvcHkgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgYSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkocmVhZG9ubHkpLmNhbGwocmVhZG9ubHksIGEpIDwgMCkge1xuICAgICAgICAgIGNvcHlbYV0gPSBhdHRyaWJ1dGVzW2FdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhdHRyaWJ1dGVzID0gY29weTtcbiAgICB9XG4gICAgaWYgKGNsb25lLnNldCkge1xuICAgICAgY2xvbmUuc2V0KGF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIG9iamVjdC4gTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggY2xvbmUoKVxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fVxuICAgKi9cbiAgbmV3SW5zdGFuY2UoKSB7XG4gICAgY29uc3QgY2xvbmUgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmNsYXNzTmFtZSk7XG4gICAgY2xvbmUuaWQgPSB0aGlzLmlkO1xuICAgIGlmIChzaW5nbGVJbnN0YW5jZSkge1xuICAgICAgLy8gSnVzdCByZXR1cm4gYW4gb2JqZWN0IHdpdGggdGhlIHJpZ2h0IGlkXG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIGlmIChzdGF0ZUNvbnRyb2xsZXIpIHtcbiAgICAgIHN0YXRlQ29udHJvbGxlci5kdXBsaWNhdGVTdGF0ZSh0aGlzLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgY2xvbmUuX2dldFN0YXRlSWRlbnRpZmllcigpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9iamVjdCBoYXMgbmV2ZXIgYmVlbiBzYXZlZCB0byBQYXJzZS5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc05ldygpIHtcbiAgICByZXR1cm4gIXRoaXMuaWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgb2JqZWN0IHdhcyBjcmVhdGVkIGJ5IHRoZSBQYXJzZSBzZXJ2ZXIgd2hlbiB0aGVcbiAgICogb2JqZWN0IG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIHRoZXJlIChlLmcuIGluIHRoZSBjYXNlIG9mIGEgRmFjZWJvb2tcbiAgICogbG9naW4pXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZXhpc3RlZCgpIHtcbiAgICBpZiAoIXRoaXMuaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgc3RhdGUgPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0U3RhdGUodGhpcy5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgcmV0dXJuIHN0YXRlLmV4aXN0ZWQ7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvYmplY3QgZXhpc3RzIG9uIHRoZSBTZXJ2ZXJcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIGJvb2xlYW4gcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBpZiBvYmplY3QgZXhpc3RzLlxuICAgKi9cbiAgYXN5bmMgZXhpc3RzKG9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMuaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFBhcnNlUXVlcnkgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZVF1ZXJ5KCk7XG4gICAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KHRoaXMuY2xhc3NOYW1lKTtcbiAgICAgIGF3YWl0IHF1ZXJ5LmdldCh0aGlzLmlkLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLmNvZGUgPT09IF9QYXJzZUVycm9yLmRlZmF1bHQuT0JKRUNUX05PVF9GT1VORCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIG1vZGVsIGlzIGN1cnJlbnRseSBpbiBhIHZhbGlkIHN0YXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuICF0aGlzLnZhbGlkYXRlKHRoaXMuYXR0cmlidXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogWW91IHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IHVubGVzcyB5b3Ugc3ViY2xhc3NcbiAgICogPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPiwgaW4gd2hpY2ggY2FzZSB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kXG4gICAqIHRvIHByb3ZpZGUgYWRkaXRpb25hbCB2YWxpZGF0aW9uIG9uIDxjb2RlPnNldDwvY29kZT4gYW5kXG4gICAqIDxjb2RlPnNhdmU8L2NvZGU+LiAgWW91ciBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRycyBUaGUgY3VycmVudCBkYXRhIHRvIHZhbGlkYXRlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuRXJyb3J8Ym9vbGVhbn0gRmFsc2UgaWYgdGhlIGRhdGEgaXMgdmFsaWQuICBBbiBlcnJvciBvYmplY3Qgb3RoZXJ3aXNlLlxuICAgKiBAc2VlIFBhcnNlLk9iamVjdCNzZXRcbiAgICovXG4gIHZhbGlkYXRlKGF0dHJzKSB7XG4gICAgaWYgKGF0dHJzLmhhc093blByb3BlcnR5KCdBQ0wnKSAmJiAhKGF0dHJzLkFDTCBpbnN0YW5jZW9mIF9QYXJzZUFDTC5kZWZhdWx0KSkge1xuICAgICAgcmV0dXJuIG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdBQ0wgbXVzdCBiZSBhIFBhcnNlIEFDTC4nKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgIGlmICghL15bQS1aYS16XVswLTlBLVphLXpfLl0qJC8udGVzdChrZXkpKSB7XG4gICAgICAgIHJldHVybiBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LklOVkFMSURfS0VZX05BTUUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQUNMIGZvciB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLkFDTHxudWxsfSBBbiBpbnN0YW5jZSBvZiBQYXJzZS5BQ0wuXG4gICAqIEBzZWUgUGFyc2UuT2JqZWN0I2dldFxuICAgKi9cbiAgZ2V0QUNMKCkge1xuICAgIGNvbnN0IGFjbCA9IHRoaXMuZ2V0KCdBQ0wnKTtcbiAgICBpZiAoYWNsIGluc3RhbmNlb2YgX1BhcnNlQUNMLmRlZmF1bHQpIHtcbiAgICAgIHJldHVybiBhY2w7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIEFDTCB0byBiZSB1c2VkIGZvciB0aGlzIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZS5BQ0x9IGFjbCBBbiBpbnN0YW5jZSBvZiBQYXJzZS5BQ0wuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsoUGFyc2VPYmplY3QgfCBib29sZWFuKX0gV2hldGhlciB0aGUgc2V0IHBhc3NlZCB2YWxpZGF0aW9uLlxuICAgKiBAc2VlIFBhcnNlLk9iamVjdCNzZXRcbiAgICovXG4gIHNldEFDTChhY2wsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoJ0FDTCcsIGFjbCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFueSAob3Igc3BlY2lmaWMpIGNoYW5nZXMgdG8gdGhpcyBvYmplY3QgbWFkZSBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHNhdmUoKVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleXNdIC0gc3BlY2lmeSB3aGljaCBmaWVsZHMgdG8gcmV2ZXJ0XG4gICAqL1xuICByZXZlcnQoKSB7XG4gICAgbGV0IGtleXNUb1JldmVydDtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGtleXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAga2V5c1RvUmV2ZXJ0ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGtleXNUb1JldmVydC5wdXNoKGtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJzZS5PYmplY3QjcmV2ZXJ0IGV4cGVjdHMgZWl0aGVyIG5vLCBvciBhIGxpc3Qgb2Ygc3RyaW5nLCBhcmd1bWVudHMuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fY2xlYXJQZW5kaW5nT3BzKGtleXNUb1JldmVydCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFsbCBhdHRyaWJ1dGVzIG9uIGEgbW9kZWxcbiAgICpcbiAgICogQHJldHVybnMgeyhQYXJzZU9iamVjdCB8IGJvb2xlYW4pfVxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcbiAgICBjb25zdCBlcmFzYWJsZSA9IHt9O1xuICAgIGxldCByZWFkb25seSA9IFsnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCddO1xuICAgIGlmICh0eXBlb2YgdGhpcy5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlYWRvbmx5ID0gKDAsIF9jb25jYXQuZGVmYXVsdCkocmVhZG9ubHkpLmNhbGwocmVhZG9ubHksIHRoaXMuY29uc3RydWN0b3IucmVhZE9ubHlBdHRyaWJ1dGVzKCkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gYXR0cmlidXRlcykge1xuICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShyZWFkb25seSkuY2FsbChyZWFkb25seSwgYXR0cikgPCAwKSB7XG4gICAgICAgIGVyYXNhYmxlW2F0dHJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2V0KGVyYXNhYmxlLCB7XG4gICAgICB1bnNldDogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSBtb2RlbCBmcm9tIHRoZSBzZXJ2ZXIuIElmIHRoZSBzZXJ2ZXIncyByZXByZXNlbnRhdGlvbiBvZiB0aGVcbiAgICogbW9kZWwgZGlmZmVycyBmcm9tIGl0cyBjdXJyZW50IGF0dHJpYnV0ZXMsIHRoZXkgd2lsbCBiZSBvdmVycmlkZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5pbmNsdWRlOiBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGluY2x1ZGUuIENhbiBiZSBhIHN0cmluZywgYW4gYXJyYXkgb2Ygc3RyaW5ncyxcbiAgICogICAgICAgb3IgYW4gYXJyYXkgb2YgYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICogICA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVGaW5kYCB0cmlnZ2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIGZldGNoXG4gICAqICAgICBjb21wbGV0ZXMuXG4gICAqL1xuICBmZXRjaChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZmV0Y2hPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBmZXRjaE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZmV0Y2hPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBmZXRjaE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2luY2x1ZGUnKSkge1xuICAgICAgZmV0Y2hPcHRpb25zLmluY2x1ZGUgPSBbXTtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkob3B0aW9ucy5pbmNsdWRlKSkge1xuICAgICAgICB2YXIgX2NvbnRleHQ7XG4gICAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dCA9IG9wdGlvbnMuaW5jbHVkZSkuY2FsbChfY29udGV4dCwga2V5ID0+IHtcbiAgICAgICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAgICAgIHZhciBfY29udGV4dDI7XG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuaW5jbHVkZSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0MiA9IGZldGNoT3B0aW9ucy5pbmNsdWRlKS5jYWxsKF9jb250ZXh0Miwga2V5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmluY2x1ZGUucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmZXRjaE9wdGlvbnMuaW5jbHVkZS5wdXNoKG9wdGlvbnMuaW5jbHVkZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZmV0Y2godGhpcywgdHJ1ZSwgZmV0Y2hPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgbW9kZWwgZnJvbSB0aGUgc2VydmVyLiBJZiB0aGUgc2VydmVyJ3MgcmVwcmVzZW50YXRpb24gb2YgdGhlXG4gICAqIG1vZGVsIGRpZmZlcnMgZnJvbSBpdHMgY3VycmVudCBhdHRyaWJ1dGVzLCB0aGV5IHdpbGwgYmUgb3ZlcnJpZGVuLlxuICAgKlxuICAgKiBJbmNsdWRlcyBuZXN0ZWQgUGFyc2UuT2JqZWN0cyBmb3IgdGhlIHByb3ZpZGVkIGtleS4gWW91IGNhbiB1c2UgZG90XG4gICAqIG5vdGF0aW9uIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGluIHRoZSBpbmNsdWRlZCBvYmplY3QgYXJlIGFsc28gZmV0Y2hlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBBcnJheTxzdHJpbmc+Pn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIGZldGNoXG4gICAqICAgICBjb21wbGV0ZXMuXG4gICAqL1xuICBmZXRjaFdpdGhJbmNsdWRlKGtleXMsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmluY2x1ZGUgPSBrZXlzO1xuICAgIHJldHVybiB0aGlzLmZldGNoKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoaXMgb2JqZWN0IHRvIHRoZSBzZXJ2ZXIgYXQgc29tZSB1bnNwZWNpZmllZCB0aW1lIGluIHRoZSBmdXR1cmUsXG4gICAqIGV2ZW4gaWYgUGFyc2UgaXMgY3VycmVudGx5IGluYWNjZXNzaWJsZS5cbiAgICpcbiAgICogVXNlIHRoaXMgd2hlbiB5b3UgbWF5IG5vdCBoYXZlIGEgc29saWQgbmV0d29yayBjb25uZWN0aW9uLCBhbmQgZG9uJ3QgbmVlZCB0byBrbm93IHdoZW4gdGhlIHNhdmUgY29tcGxldGVzLlxuICAgKiBJZiB0aGVyZSBpcyBzb21lIHByb2JsZW0gd2l0aCB0aGUgb2JqZWN0IHN1Y2ggdGhhdCBpdCBjYW4ndCBiZSBzYXZlZCwgaXQgd2lsbCBiZSBzaWxlbnRseSBkaXNjYXJkZWQuXG4gICAqXG4gICAqIE9iamVjdHMgc2F2ZWQgd2l0aCB0aGlzIG1ldGhvZCB3aWxsIGJlIHN0b3JlZCBsb2NhbGx5IGluIGFuIG9uLWRpc2sgY2FjaGUgdW50aWwgdGhleSBjYW4gYmUgZGVsaXZlcmVkIHRvIFBhcnNlLlxuICAgKiBUaGV5IHdpbGwgYmUgc2VudCBpbW1lZGlhdGVseSBpZiBwb3NzaWJsZS4gT3RoZXJ3aXNlLCB0aGV5IHdpbGwgYmUgc2VudCB0aGUgbmV4dCB0aW1lIGEgbmV0d29yayBjb25uZWN0aW9uIGlzXG4gICAqIGF2YWlsYWJsZS4gT2JqZWN0cyBzYXZlZCB0aGlzIHdheSB3aWxsIHBlcnNpc3QgZXZlbiBhZnRlciB0aGUgYXBwIGlzIGNsb3NlZCwgaW4gd2hpY2ggY2FzZSB0aGV5IHdpbGwgYmUgc2VudCB0aGVcbiAgICogbmV4dCB0aW1lIHRoZSBhcHAgaXMgb3BlbmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gICAqIFVzZWQgdG8gcGFzcyBvcHRpb24gcGFyYW1ldGVycyB0byBtZXRob2QgaWYgYXJnMSBhbmQgYXJnMiB3ZXJlIGJvdGggcGFzc2VkIGFzIHN0cmluZ3MuXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOlxuICAgKiA8dWw+XG4gICAqIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8bGk+Y2FzY2FkZVNhdmU6IElmIGBmYWxzZWAsIG5lc3RlZCBvYmplY3RzIHdpbGwgbm90IGJlIHNhdmVkIChkZWZhdWx0IGlzIGB0cnVlYCkuXG4gICAqIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZVNhdmVgIGFuZCBgYWZ0ZXJTYXZlYCB0cmlnZ2Vycy5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBzYXZlXG4gICAqIGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIHNhdmVFdmVudHVhbGx5KG9wdGlvbnMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKG51bGwsIG9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLmNvZGUgPT09IF9QYXJzZUVycm9yLmRlZmF1bHQuQ09OTkVDVElPTl9GQUlMRUQpIHtcbiAgICAgICAgYXdhaXQgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnR1YWxseVF1ZXVlKCkuc2F2ZSh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnR1YWxseVF1ZXVlKCkucG9sbCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBoYXNoIG9mIG1vZGVsIGF0dHJpYnV0ZXMsIGFuZCBzYXZlIHRoZSBtb2RlbCB0byB0aGUgc2VydmVyLlxuICAgKiB1cGRhdGVkQXQgd2lsbCBiZSB1cGRhdGVkIHdoZW4gdGhlIHJlcXVlc3QgcmV0dXJucy5cbiAgICogWW91IGNhbiBlaXRoZXIgY2FsbCBpdCBhczo8cHJlPlxuICAgKiBvYmplY3Quc2F2ZSgpOzwvcHJlPlxuICAgKiBvcjxwcmU+XG4gICAqIG9iamVjdC5zYXZlKGF0dHJzKTs8L3ByZT5cbiAgICogb3I8cHJlPlxuICAgKiBvYmplY3Quc2F2ZShudWxsLCBvcHRpb25zKTs8L3ByZT5cbiAgICogb3I8cHJlPlxuICAgKiBvYmplY3Quc2F2ZShhdHRycywgb3B0aW9ucyk7PC9wcmU+XG4gICAqIG9yPHByZT5cbiAgICogb2JqZWN0LnNhdmUoa2V5LCB2YWx1ZSk7PC9wcmU+XG4gICAqIG9yPHByZT5cbiAgICogb2JqZWN0LnNhdmUoa2V5LCB2YWx1ZSwgb3B0aW9ucyk7PC9wcmU+XG4gICAqXG4gICAqIEV4YW1wbGUgMTogPHByZT5cbiAgICogZ2FtZVR1cm4uc2F2ZSh7XG4gICAqIHBsYXllcjogXCJKYWtlIEN1dHRlclwiLFxuICAgKiBkaWNlUm9sbDogMlxuICAgKiB9KS50aGVuKGZ1bmN0aW9uKGdhbWVUdXJuQWdhaW4pIHtcbiAgICogLy8gVGhlIHNhdmUgd2FzIHN1Y2Nlc3NmdWwuXG4gICAqIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAqIC8vIFRoZSBzYXZlIGZhaWxlZC4gIEVycm9yIGlzIGFuIGluc3RhbmNlIG9mIFBhcnNlLkVycm9yLlxuICAgKiB9KTs8L3ByZT5cbiAgICpcbiAgICogRXhhbXBsZSAyOiA8cHJlPlxuICAgKiBnYW1lVHVybi5zYXZlKFwicGxheWVyXCIsIFwiSmFrZSBDdXR0ZXJcIik7PC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgb2JqZWN0IHwgbnVsbH0gW2FyZzFdXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogPGxpPmBPYmplY3RgIC0gS2V5L3ZhbHVlIHBhaXJzIHRvIHVwZGF0ZSBvbiB0aGUgb2JqZWN0LjwvbGk+XG4gICAqIDxsaT5gU3RyaW5nYCBLZXkgLSBLZXkgb2YgYXR0cmlidXRlIHRvIHVwZGF0ZSAocmVxdWlyZXMgYXJnMiB0byBhbHNvIGJlIHN0cmluZyk8L2xpPlxuICAgKiA8bGk+YG51bGxgIC0gUGFzc2luZyBudWxsIGZvciBhcmcxIGFsbG93cyB5b3UgdG8gc2F2ZSB0aGUgb2JqZWN0IHdpdGggb3B0aW9ucyBwYXNzZWQgaW4gYXJnMi48L2xpPlxuICAgKiA8L3VsPlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG9iamVjdH0gW2FyZzJdXG4gICAqIDx1bD5cbiAgICogPGxpPmBTdHJpbmdgIFZhbHVlIC0gSWYgYXJnMSB3YXMgcGFzc2VkIGFzIGEga2V5LCBhcmcyIGlzIHRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBzZXQgb24gdGhhdCBrZXkuPC9saT5cbiAgICogPGxpPmBPYmplY3RgIE9wdGlvbnMgLSBWYWxpZCBvcHRpb25zIGFyZTpcbiAgICogPHVsPlxuICAgKiA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8bGk+Y2FzY2FkZVNhdmU6IElmIGBmYWxzZWAsIG5lc3RlZCBvYmplY3RzIHdpbGwgbm90IGJlIHNhdmVkIChkZWZhdWx0IGlzIGB0cnVlYCkuXG4gICAqIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZVNhdmVgIGFuZCBgYWZ0ZXJTYXZlYCB0cmlnZ2Vycy5cbiAgICogPC91bD5cbiAgICogPC9saT5cbiAgICogPC91bD5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmczXVxuICAgKiBVc2VkIHRvIHBhc3Mgb3B0aW9uIHBhcmFtZXRlcnMgdG8gbWV0aG9kIGlmIGFyZzEgYW5kIGFyZzIgd2VyZSBib3RoIHBhc3NlZCBhcyBzdHJpbmdzLlxuICAgKiBWYWxpZCBvcHRpb25zIGFyZTpcbiAgICogPHVsPlxuICAgKiA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8bGk+Y2FzY2FkZVNhdmU6IElmIGBmYWxzZWAsIG5lc3RlZCBvYmplY3RzIHdpbGwgbm90IGJlIHNhdmVkIChkZWZhdWx0IGlzIGB0cnVlYCkuXG4gICAqIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZVNhdmVgIGFuZCBgYWZ0ZXJTYXZlYCB0cmlnZ2Vycy5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBzYXZlXG4gICAqIGNvbXBsZXRlcy5cbiAgICovXG4gIHNhdmUoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGxldCBhdHRycztcbiAgICBsZXQgb3B0aW9ucztcbiAgICBpZiAodHlwZW9mIGFyZzEgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBhcmcxID09PSAndW5kZWZpbmVkJykge1xuICAgICAgYXR0cnMgPSBhcmcxO1xuICAgICAgaWYgKHR5cGVvZiBhcmcyID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRpb25zID0gYXJnMjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXR0cnMgPSB7fTtcbiAgICAgIGF0dHJzW2FyZzFdID0gYXJnMjtcbiAgICAgIG9wdGlvbnMgPSBhcmczO1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoYXR0cnMpIHtcbiAgICAgIGxldCB2YWxpZGF0aW9uRXJyb3I7XG4gICAgICBvcHRpb25zLmVycm9yID0gKF8sIHZhbGlkYXRpb24pID0+IHtcbiAgICAgICAgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGlvbjtcbiAgICAgIH07XG4gICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5zZXQoYXR0cnMsIG9wdGlvbnMpO1xuICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCh2YWxpZGF0aW9uRXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzYXZlT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgc2F2ZU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gISFvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpICYmIHR5cGVvZiBvcHRpb25zLnNlc3Npb25Ub2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNhdmVPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaW5zdGFsbGF0aW9uSWQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5pbnN0YWxsYXRpb25JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNhdmVPcHRpb25zLmluc3RhbGxhdGlvbklkID0gb3B0aW9ucy5pbnN0YWxsYXRpb25JZDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgc2F2ZU9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB1bnNhdmVkID0gb3B0aW9ucy5jYXNjYWRlU2F2ZSAhPT0gZmFsc2UgPyAoMCwgX3Vuc2F2ZWRDaGlsZHJlbi5kZWZhdWx0KSh0aGlzKSA6IG51bGw7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuc2F2ZSh1bnNhdmVkLCBzYXZlT3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5zYXZlKHRoaXMsIHNhdmVPcHRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHRoaXMgb2JqZWN0IGZyb20gdGhlIHNlcnZlciBhdCBzb21lIHVuc3BlY2lmaWVkIHRpbWUgaW4gdGhlIGZ1dHVyZSxcbiAgICogZXZlbiBpZiBQYXJzZSBpcyBjdXJyZW50bHkgaW5hY2Nlc3NpYmxlLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIHlvdSBtYXkgbm90IGhhdmUgYSBzb2xpZCBuZXR3b3JrIGNvbm5lY3Rpb24sXG4gICAqIGFuZCBkb24ndCBuZWVkIHRvIGtub3cgd2hlbiB0aGUgZGVsZXRlIGNvbXBsZXRlcy4gSWYgdGhlcmUgaXMgc29tZSBwcm9ibGVtIHdpdGggdGhlIG9iamVjdFxuICAgKiBzdWNoIHRoYXQgaXQgY2FuJ3QgYmUgZGVsZXRlZCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSBzaWxlbnRseSBkaXNjYXJkZWQuXG4gICAqXG4gICAqIERlbGV0ZSBpbnN0cnVjdGlvbnMgbWFkZSB3aXRoIHRoaXMgbWV0aG9kIHdpbGwgYmUgc3RvcmVkIGxvY2FsbHkgaW4gYW4gb24tZGlzayBjYWNoZSB1bnRpbCB0aGV5IGNhbiBiZSB0cmFuc21pdHRlZFxuICAgKiB0byBQYXJzZS4gVGhleSB3aWxsIGJlIHNlbnQgaW1tZWRpYXRlbHkgaWYgcG9zc2libGUuIE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIHNlbnQgdGhlIG5leHQgdGltZSBhIG5ldHdvcmsgY29ubmVjdGlvblxuICAgKiBpcyBhdmFpbGFibGUuIERlbGV0ZSByZXF1ZXN0cyB3aWxsIHBlcnNpc3QgZXZlbiBhZnRlciB0aGUgYXBwIGlzIGNsb3NlZCwgaW4gd2hpY2ggY2FzZSB0aGV5IHdpbGwgYmUgc2VudCB0aGVcbiAgICogbmV4dCB0aW1lIHRoZSBhcHAgaXMgb3BlbmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVEZWxldGVgIGFuZCBgYWZ0ZXJEZWxldGVgIHRyaWdnZXJzLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIGRlc3Ryb3lcbiAgICogICAgIGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIGRlc3Ryb3lFdmVudHVhbGx5KG9wdGlvbnMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KG9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLmNvZGUgPT09IF9QYXJzZUVycm9yLmRlZmF1bHQuQ09OTkVDVElPTl9GQUlMRUQpIHtcbiAgICAgICAgYXdhaXQgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnR1YWxseVF1ZXVlKCkuZGVzdHJveSh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0RXZlbnR1YWxseVF1ZXVlKCkucG9sbCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IHRoaXMgbW9kZWwgb24gdGhlIHNlcnZlciBpZiBpdCB3YXMgYWxyZWFkeSBwZXJzaXN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiAgIDxsaT5jb250ZXh0OiBBIGRpY3Rpb25hcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGluIENsb3VkIENvZGUgYGJlZm9yZURlbGV0ZWAgYW5kIGBhZnRlckRlbGV0ZWAgdHJpZ2dlcnMuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgZGVzdHJveVxuICAgKiAgICAgY29tcGxldGVzLlxuICAgKi9cbiAgZGVzdHJveShvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZGVzdHJveU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBkZXN0cm95T3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdENvbnRyb2xsZXIoKS5kZXN0cm95KHRoaXMsIGRlc3Ryb3lPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSBzdG9yZXMgdGhlIG9iamVjdCBhbmQgZXZlcnkgb2JqZWN0IGl0IHBvaW50cyB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLFxuICAgKiByZWN1cnNpdmVseSwgdXNpbmcgYSBkZWZhdWx0IHBpbiBuYW1lOiBfZGVmYXVsdC5cbiAgICpcbiAgICogSWYgdGhvc2Ugb3RoZXIgb2JqZWN0cyBoYXZlIG5vdCBiZWVuIGZldGNoZWQgZnJvbSBQYXJzZSwgdGhleSB3aWxsIG5vdCBiZSBzdG9yZWQuXG4gICAqIEhvd2V2ZXIsIGlmIHRoZXkgaGF2ZSBjaGFuZ2VkIGRhdGEsIGFsbCB0aGUgY2hhbmdlcyB3aWxsIGJlIHJldGFpbmVkLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBvYmplY3QucGluKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBUbyByZXRyaWV2ZSBvYmplY3Q6XG4gICAqIDxjb2RlPnF1ZXJ5LmZyb21Mb2NhbERhdGFzdG9yZSgpPC9jb2RlPiBvciA8Y29kZT5xdWVyeS5mcm9tUGluKCk8L2NvZGU+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgcGluIGNvbXBsZXRlcy5cbiAgICovXG4gIHBpbigpIHtcbiAgICByZXR1cm4gUGFyc2VPYmplY3QucGluQWxsV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4sIFt0aGlzXSk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgcmVtb3ZlcyB0aGUgb2JqZWN0IGFuZCBldmVyeSBvYmplY3QgaXQgcG9pbnRzIHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsXG4gICAqIHJlY3Vyc2l2ZWx5LCB1c2luZyBhIGRlZmF1bHQgcGluIG5hbWU6IF9kZWZhdWx0LlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBvYmplY3QudW5QaW4oKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgdW5QaW4gY29tcGxldGVzLlxuICAgKi9cbiAgdW5QaW4oKSB7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LnVuUGluQWxsV2l0aE5hbWUoX0xvY2FsRGF0YXN0b3JlVXRpbHMuREVGQVVMVF9QSU4sIFt0aGlzXSk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgcmV0dXJucyBpZiB0aGUgb2JqZWN0IGlzIHBpbm5lZFxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBjb25zdCBpc1Bpbm5lZCA9IGF3YWl0IG9iamVjdC5pc1Bpbm5lZCgpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgYm9vbGVhbiBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIGlmIG9iamVjdCBpcyBwaW5uZWQuXG4gICAqL1xuICBhc3luYyBpc1Bpbm5lZCgpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICBjb25zdCBvYmplY3RLZXkgPSBsb2NhbERhdGFzdG9yZS5nZXRLZXlGb3JPYmplY3QodGhpcyk7XG4gICAgY29uc3QgcGluID0gYXdhaXQgbG9jYWxEYXRhc3RvcmUuZnJvbVBpbldpdGhOYW1lKG9iamVjdEtleSk7XG4gICAgcmV0dXJuIHBpbi5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHN0b3JlcyB0aGUgb2JqZWN0cyBhbmQgZXZlcnkgb2JqZWN0IHRoZXkgcG9pbnQgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSwgcmVjdXJzaXZlbHkuXG4gICAqXG4gICAqIElmIHRob3NlIG90aGVyIG9iamVjdHMgaGF2ZSBub3QgYmVlbiBmZXRjaGVkIGZyb20gUGFyc2UsIHRoZXkgd2lsbCBub3QgYmUgc3RvcmVkLlxuICAgKiBIb3dldmVyLCBpZiB0aGV5IGhhdmUgY2hhbmdlZCBkYXRhLCBhbGwgdGhlIGNoYW5nZXMgd2lsbCBiZSByZXRhaW5lZC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgb2JqZWN0LnBpbldpdGhOYW1lKG5hbWUpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogVG8gcmV0cmlldmUgb2JqZWN0OlxuICAgKiA8Y29kZT5xdWVyeS5mcm9tTG9jYWxEYXRhc3RvcmUoKTwvY29kZT4gb3IgPGNvZGU+cXVlcnkuZnJvbVBpbldpdGhOYW1lKG5hbWUpPC9jb2RlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIFBpbi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBwaW4gY29tcGxldGVzLlxuICAgKi9cbiAgcGluV2l0aE5hbWUobmFtZSkge1xuICAgIHJldHVybiBQYXJzZU9iamVjdC5waW5BbGxXaXRoTmFtZShuYW1lLCBbdGhpc10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgdGhlIG9iamVjdCBhbmQgZXZlcnkgb2JqZWN0IGl0IHBvaW50cyB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLCByZWN1cnNpdmVseS5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgb2JqZWN0LnVuUGluV2l0aE5hbWUobmFtZSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIFBpbi5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1blBpbiBjb21wbGV0ZXMuXG4gICAqL1xuICB1blBpbldpdGhOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gUGFyc2VPYmplY3QudW5QaW5BbGxXaXRoTmFtZShuYW1lLCBbdGhpc10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IGxvYWRzIGRhdGEgZnJvbSB0aGUgbG9jYWwgZGF0YXN0b3JlIGludG8gdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IG9iamVjdC5mZXRjaEZyb21Mb2NhbERhdGFzdG9yZSgpO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogWW91IGNhbiBjcmVhdGUgYW4gdW5mZXRjaGVkIHBvaW50ZXIgd2l0aCA8Y29kZT5QYXJzZS5PYmplY3QuY3JlYXRlV2l0aG91dERhdGEoKTwvY29kZT5cbiAgICogYW5kIHRoZW4gY2FsbCA8Y29kZT5mZXRjaEZyb21Mb2NhbERhdGFzdG9yZSgpPC9jb2RlPiBvbiBpdC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSBmZXRjaCBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBmZXRjaEZyb21Mb2NhbERhdGFzdG9yZSgpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICBjb25zdCBvYmplY3RLZXkgPSBsb2NhbERhdGFzdG9yZS5nZXRLZXlGb3JPYmplY3QodGhpcyk7XG4gICAgY29uc3QgcGlubmVkID0gYXdhaXQgbG9jYWxEYXRhc3RvcmUuX3NlcmlhbGl6ZU9iamVjdChvYmplY3RLZXkpO1xuICAgIGlmICghcGlubmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmZXRjaCBhbiB1bnNhdmVkIFBhcnNlT2JqZWN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IFBhcnNlT2JqZWN0LmZyb21KU09OKHBpbm5lZCk7XG4gICAgdGhpcy5fZmluaXNoRmV0Y2gocmVzdWx0LnRvSlNPTigpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qIFN0YXRpYyBtZXRob2RzICovXG5cbiAgc3RhdGljIF9jbGVhckFsbFN0YXRlKCkge1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIHN0YXRlQ29udHJvbGxlci5jbGVhckFsbFN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgZ2l2ZW4gbGlzdCBvZiBQYXJzZS5PYmplY3QuXG4gICAqIElmIGFueSBlcnJvciBpcyBlbmNvdW50ZXJlZCwgc3RvcHMgYW5kIGNhbGxzIHRoZSBlcnJvciBoYW5kbGVyLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiAgIFBhcnNlLk9iamVjdC5mZXRjaEFsbChbb2JqZWN0MSwgb2JqZWN0MiwgLi4uXSlcbiAgICogICAgLnRoZW4oKGxpc3QpID0+IHtcbiAgICogICAgICAvLyBBbGwgdGhlIG9iamVjdHMgd2VyZSBmZXRjaGVkLlxuICAgKiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICogICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBmZXRjaGluZyBvbmUgb2YgdGhlIG9iamVjdHMuXG4gICAqICAgIH0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gbGlzdCBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmluY2x1ZGU6IFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gaW5jbHVkZS4gQ2FuIGJlIGEgc3RyaW5nLCBhbiBhcnJheSBvZiBzdHJpbmdzLFxuICAgKiAgICAgICBvciBhbiBhcnJheSBvZiBhcnJheSBvZiBzdHJpbmdzLlxuICAgKiA8L3VsPlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3RbXX1cbiAgICovXG4gIHN0YXRpYyBmZXRjaEFsbChsaXN0KSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNvbnN0IHF1ZXJ5T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgcXVlcnlPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIHF1ZXJ5T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2luY2x1ZGUnKSkge1xuICAgICAgcXVlcnlPcHRpb25zLmluY2x1ZGUgPSBQYXJzZU9iamVjdC5oYW5kbGVJbmNsdWRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdENvbnRyb2xsZXIoKS5mZXRjaChsaXN0LCB0cnVlLCBxdWVyeU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGdpdmVuIGxpc3Qgb2YgUGFyc2UuT2JqZWN0LlxuICAgKlxuICAgKiBJbmNsdWRlcyBuZXN0ZWQgUGFyc2UuT2JqZWN0cyBmb3IgdGhlIHByb3ZpZGVkIGtleS4gWW91IGNhbiB1c2UgZG90XG4gICAqIG5vdGF0aW9uIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGluIHRoZSBpbmNsdWRlZCBvYmplY3QgYXJlIGFsc28gZmV0Y2hlZC5cbiAgICpcbiAgICogSWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkLCBzdG9wcyBhbmQgY2FsbHMgdGhlIGVycm9yIGhhbmRsZXIuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqICAgUGFyc2UuT2JqZWN0LmZldGNoQWxsV2l0aEluY2x1ZGUoW29iamVjdDEsIG9iamVjdDIsIC4uLl0sIFtwb2ludGVyMSwgcG9pbnRlcjIsIC4uLl0pXG4gICAqICAgIC50aGVuKChsaXN0KSA9PiB7XG4gICAqICAgICAgLy8gQWxsIHRoZSBvYmplY3RzIHdlcmUgZmV0Y2hlZC5cbiAgICogICAgfSwgKGVycm9yKSA9PiB7XG4gICAqICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZmV0Y2hpbmcgb25lIG9mIHRoZSBvYmplY3RzLlxuICAgKiAgICB9KTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgQXJyYXk8c3RyaW5nPj59IGtleXMgVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0W119XG4gICAqL1xuICBzdGF0aWMgZmV0Y2hBbGxXaXRoSW5jbHVkZShsaXN0LCBrZXlzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5pbmNsdWRlID0ga2V5cztcbiAgICByZXR1cm4gUGFyc2VPYmplY3QuZmV0Y2hBbGwobGlzdCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgZ2l2ZW4gbGlzdCBvZiBQYXJzZS5PYmplY3QgaWYgbmVlZGVkLlxuICAgKiBJZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWQsIHN0b3BzIGFuZCBjYWxscyB0aGUgZXJyb3IgaGFuZGxlci5cbiAgICpcbiAgICogSW5jbHVkZXMgbmVzdGVkIFBhcnNlLk9iamVjdHMgZm9yIHRoZSBwcm92aWRlZCBrZXkuIFlvdSBjYW4gdXNlIGRvdFxuICAgKiBub3RhdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGZpZWxkcyBpbiB0aGUgaW5jbHVkZWQgb2JqZWN0IGFyZSBhbHNvIGZldGNoZWQuXG4gICAqXG4gICAqIElmIGFueSBlcnJvciBpcyBlbmNvdW50ZXJlZCwgc3RvcHMgYW5kIGNhbGxzIHRoZSBlcnJvciBoYW5kbGVyLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiAgIFBhcnNlLk9iamVjdC5mZXRjaEFsbElmTmVlZGVkV2l0aEluY2x1ZGUoW29iamVjdDEsIG9iamVjdDIsIC4uLl0sIFtwb2ludGVyMSwgcG9pbnRlcjIsIC4uLl0pXG4gICAqICAgIC50aGVuKChsaXN0KSA9PiB7XG4gICAqICAgICAgLy8gQWxsIHRoZSBvYmplY3RzIHdlcmUgZmV0Y2hlZC5cbiAgICogICAgfSwgKGVycm9yKSA9PiB7XG4gICAqICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZmV0Y2hpbmcgb25lIG9mIHRoZSBvYmplY3RzLlxuICAgKiAgICB9KTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgQXJyYXk8c3RyaW5nPj59IGtleXMgVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0W119XG4gICAqL1xuICBzdGF0aWMgZmV0Y2hBbGxJZk5lZWRlZFdpdGhJbmNsdWRlKGxpc3QsIGtleXMsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmluY2x1ZGUgPSBrZXlzO1xuICAgIHJldHVybiBQYXJzZU9iamVjdC5mZXRjaEFsbElmTmVlZGVkKGxpc3QsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGdpdmVuIGxpc3Qgb2YgUGFyc2UuT2JqZWN0IGlmIG5lZWRlZC5cbiAgICogSWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkLCBzdG9wcyBhbmQgY2FsbHMgdGhlIGVycm9yIGhhbmRsZXIuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqICAgUGFyc2UuT2JqZWN0LmZldGNoQWxsSWZOZWVkZWQoW29iamVjdDEsIC4uLl0pXG4gICAqICAgIC50aGVuKChsaXN0KSA9PiB7XG4gICAqICAgICAgLy8gT2JqZWN0cyB3ZXJlIGZldGNoZWQgYW5kIHVwZGF0ZWQuXG4gICAqICAgIH0sIChlcnJvcikgPT4ge1xuICAgKiAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGZldGNoaW5nIG9uZSBvZiB0aGUgb2JqZWN0cy5cbiAgICogICAgfSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBsaXN0IEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3RbXX1cbiAgICovXG4gIHN0YXRpYyBmZXRjaEFsbElmTmVlZGVkKGxpc3QsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBxdWVyeU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHF1ZXJ5T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBxdWVyeU9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdpbmNsdWRlJykpIHtcbiAgICAgIHF1ZXJ5T3B0aW9ucy5pbmNsdWRlID0gUGFyc2VPYmplY3QuaGFuZGxlSW5jbHVkZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRPYmplY3RDb250cm9sbGVyKCkuZmV0Y2gobGlzdCwgZmFsc2UsIHF1ZXJ5T3B0aW9ucyk7XG4gIH1cbiAgc3RhdGljIGhhbmRsZUluY2x1ZGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBsZXQgaW5jbHVkZSA9IFtdO1xuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkob3B0aW9ucy5pbmNsdWRlKSkge1xuICAgICAgdmFyIF9jb250ZXh0MztcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDMgPSBvcHRpb25zLmluY2x1ZGUpLmNhbGwoX2NvbnRleHQzLCBrZXkgPT4ge1xuICAgICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAgICBpbmNsdWRlID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoaW5jbHVkZSkuY2FsbChpbmNsdWRlLCBrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluY2x1ZGUucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5jbHVkZS5wdXNoKG9wdGlvbnMuaW5jbHVkZSk7XG4gICAgfVxuICAgIHJldHVybiBpbmNsdWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGdpdmVuIGxpc3Qgb2YgbW9kZWxzIG9uIHRoZSBzZXJ2ZXIgaWYgaXQgd2FzIGFscmVhZHkgcGVyc2lzdGVkLlxuICAgKlxuICAgKiA8cD5Vbmxpa2Ugc2F2ZUFsbCwgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGRlbGV0aW5nIGFuIGluZGl2aWR1YWwgbW9kZWwsXG4gICAqIHRoaXMgbWV0aG9kIHdpbGwgY29udGludWUgdHJ5aW5nIHRvIGRlbGV0ZSB0aGUgcmVzdCBvZiB0aGUgbW9kZWxzIGlmXG4gICAqIHBvc3NpYmxlLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgYSBmYXRhbCBlcnJvciBsaWtlIGEgY29ubmVjdGlvbiBlcnJvci5cbiAgICpcbiAgICogPHA+SW4gcGFydGljdWxhciwgdGhlIFBhcnNlLkVycm9yIG9iamVjdCByZXR1cm5lZCBpbiB0aGUgY2FzZSBvZiBlcnJvciBtYXlcbiAgICogYmUgb25lIG9mIHR3byB0eXBlczpcbiAgICpcbiAgICogPHVsPlxuICAgKiA8bGk+QSBQYXJzZS5FcnJvci5BR0dSRUdBVEVfRVJST1IuIFRoaXMgb2JqZWN0J3MgXCJlcnJvcnNcIiBwcm9wZXJ0eSBpcyBhblxuICAgKiBhcnJheSBvZiBvdGhlciBQYXJzZS5FcnJvciBvYmplY3RzLiBFYWNoIGVycm9yIG9iamVjdCBpbiB0aGlzIGFycmF5XG4gICAqIGhhcyBhbiBcIm9iamVjdFwiIHByb3BlcnR5IHRoYXQgcmVmZXJlbmNlcyB0aGUgb2JqZWN0IHRoYXQgY291bGQgbm90IGJlXG4gICAqIGRlbGV0ZWQgKGZvciBpbnN0YW5jZSwgYmVjYXVzZSB0aGF0IG9iamVjdCBjb3VsZCBub3QgYmUgZm91bmQpLjwvbGk+XG4gICAqIDxsaT5BIG5vbi1hZ2dyZWdhdGUgUGFyc2UuRXJyb3IuIFRoaXMgaW5kaWNhdGVzIGEgc2VyaW91cyBlcnJvciB0aGF0XG4gICAqIGNhdXNlZCB0aGUgZGVsZXRlIG9wZXJhdGlvbiB0byBiZSBhYm9ydGVkIHBhcnR3YXkgdGhyb3VnaCAoZm9yXG4gICAqIGluc3RhbmNlLCBhIGNvbm5lY3Rpb24gZmFpbHVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBkZWxldGUpLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqIDxwcmU+XG4gICAqIFBhcnNlLk9iamVjdC5kZXN0cm95QWxsKFtvYmplY3QxLCBvYmplY3QyLCAuLi5dKVxuICAgKiAudGhlbigobGlzdCkgPT4ge1xuICAgKiAvLyBBbGwgdGhlIG9iamVjdHMgd2VyZSBkZWxldGVkLlxuICAgKiB9LCAoZXJyb3IpID0+IHtcbiAgICogLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZGVsZXRpbmcgb25lIG9yIG1vcmUgb2YgdGhlIG9iamVjdHMuXG4gICAqIC8vIElmIHRoaXMgaXMgYW4gYWdncmVnYXRlIGVycm9yLCB0aGVuIHdlIGNhbiBpbnNwZWN0IGVhY2ggZXJyb3JcbiAgICogLy8gb2JqZWN0IGluZGl2aWR1YWxseSB0byBkZXRlcm1pbmUgdGhlIHJlYXNvbiB3aHkgYSBwYXJ0aWN1bGFyXG4gICAqIC8vIG9iamVjdCB3YXMgbm90IGRlbGV0ZWQuXG4gICAqIGlmIChlcnJvci5jb2RlID09PSBQYXJzZS5FcnJvci5BR0dSRUdBVEVfRVJST1IpIHtcbiAgICogZm9yICh2YXIgaSA9IDA7IGkgPCBlcnJvci5lcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICogY29uc29sZS5sb2coXCJDb3VsZG4ndCBkZWxldGUgXCIgKyBlcnJvci5lcnJvcnNbaV0ub2JqZWN0LmlkICtcbiAgICogXCJkdWUgdG8gXCIgKyBlcnJvci5lcnJvcnNbaV0ubWVzc2FnZSk7XG4gICAqIH1cbiAgICogfSBlbHNlIHtcbiAgICogY29uc29sZS5sb2coXCJEZWxldGUgYWJvcnRlZCBiZWNhdXNlIG9mIFwiICsgZXJyb3IubWVzc2FnZSk7XG4gICAqIH1cbiAgICogfSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBsaXN0IEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgZGVzdHJveUFsbFxuICAgKiBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgZGVzdHJveUFsbChsaXN0KSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNvbnN0IGRlc3Ryb3lPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBkZXN0cm95T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBkZXN0cm95T3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2JhdGNoU2l6ZScpICYmIHR5cGVvZiBvcHRpb25zLmJhdGNoU2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGRlc3Ryb3lPcHRpb25zLmJhdGNoU2l6ZSA9IG9wdGlvbnMuYmF0Y2hTaXplO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBkZXN0cm95T3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpLmRlc3Ryb3kobGlzdCwgZGVzdHJveU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBnaXZlbiBsaXN0IG9mIFBhcnNlLk9iamVjdC5cbiAgICogSWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkLCBzdG9wcyBhbmQgY2FsbHMgdGhlIGVycm9yIGhhbmRsZXIuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIFBhcnNlLk9iamVjdC5zYXZlQWxsKFtvYmplY3QxLCBvYmplY3QyLCAuLi5dKVxuICAgKiAudGhlbigobGlzdCkgPT4ge1xuICAgKiAvLyBBbGwgdGhlIG9iamVjdHMgd2VyZSBzYXZlZC5cbiAgICogfSwgKGVycm9yKSA9PiB7XG4gICAqIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNhdmluZyBvbmUgb2YgdGhlIG9iamVjdHMuXG4gICAqIH0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gbGlzdCBBIGxpc3Qgb2YgPGNvZGU+UGFyc2UuT2JqZWN0PC9jb2RlPi5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0W119XG4gICAqL1xuICBzdGF0aWMgc2F2ZUFsbChsaXN0KSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNvbnN0IHNhdmVPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBzYXZlT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBzYXZlT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2JhdGNoU2l6ZScpICYmIHR5cGVvZiBvcHRpb25zLmJhdGNoU2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHNhdmVPcHRpb25zLmJhdGNoU2l6ZSA9IG9wdGlvbnMuYmF0Y2hTaXplO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBzYXZlT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0Q29udHJvbGxlcigpLnNhdmUobGlzdCwgc2F2ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSByZWZlcmVuY2UgdG8gYSBzdWJjbGFzcyBvZiBQYXJzZS5PYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQuIFRoaXNcbiAgICogZG9lcyBub3QgZXhpc3Qgb24gUGFyc2UuT2JqZWN0LCBvbmx5IG9uIHN1YmNsYXNzZXMuXG4gICAqXG4gICAqIDxwPkEgc2hvcnRjdXQgZm9yOiA8cHJlPlxuICAgKiAgdmFyIEZvbyA9IFBhcnNlLk9iamVjdC5leHRlbmQoXCJGb29cIik7XG4gICAqICB2YXIgcG9pbnRlclRvRm9vID0gbmV3IEZvbygpO1xuICAgKiAgcG9pbnRlclRvRm9vLmlkID0gXCJteU9iamVjdElkXCI7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBvYmplY3QgdG8gY3JlYXRlIGEgcmVmZXJlbmNlIHRvLlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9IEEgUGFyc2UuT2JqZWN0IHJlZmVyZW5jZS5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGVXaXRob3V0RGF0YShpZCkge1xuICAgIGNvbnN0IG9iaiA9IG5ldyB0aGlzKCk7XG4gICAgb2JqLmlkID0gaWQ7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGEgUGFyc2UgT2JqZWN0IGZyb20gYSBKU09OIHJlcHJlc2VudGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0ganNvbiBUaGUgSlNPTiBtYXAgb2YgdGhlIE9iamVjdCdzIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBvdmVycmlkZSBJbiBzaW5nbGUgaW5zdGFuY2UgbW9kZSwgYWxsIG9sZCBzZXJ2ZXIgZGF0YVxuICAgKiAgIGlzIG92ZXJ3cml0dGVuIGlmIHRoaXMgaXMgc2V0IHRvIHRydWVcbiAgICogQHBhcmFtIHtib29sZWFufSBkaXJ0eSBXaGV0aGVyIHRoZSBQYXJzZS5PYmplY3Qgc2hvdWxkIHNldCBKU09OIGtleXMgdG8gZGlydHlcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuT2JqZWN0fSBBIFBhcnNlLk9iamVjdCByZWZlcmVuY2VcbiAgICovXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBvdmVycmlkZSwgZGlydHkpIHtcbiAgICBpZiAoIWpzb24uY2xhc3NOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYW4gb2JqZWN0IHdpdGhvdXQgYSBjbGFzc05hbWUnKTtcbiAgICB9XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBjbGFzc01hcFtqc29uLmNsYXNzTmFtZV07XG4gICAgY29uc3QgbyA9IGNvbnN0cnVjdG9yID8gbmV3IGNvbnN0cnVjdG9yKGpzb24uY2xhc3NOYW1lKSA6IG5ldyBQYXJzZU9iamVjdChqc29uLmNsYXNzTmFtZSk7XG4gICAgY29uc3Qgb3RoZXJBdHRyaWJ1dGVzID0ge307XG4gICAgZm9yIChjb25zdCBhdHRyIGluIGpzb24pIHtcbiAgICAgIGlmIChhdHRyICE9PSAnY2xhc3NOYW1lJyAmJiBhdHRyICE9PSAnX190eXBlJykge1xuICAgICAgICBvdGhlckF0dHJpYnV0ZXNbYXR0cl0gPSBqc29uW2F0dHJdO1xuICAgICAgICBpZiAoZGlydHkpIHtcbiAgICAgICAgICBvLnNldChhdHRyLCBqc29uW2F0dHJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3ZlcnJpZGUpIHtcbiAgICAgIC8vIGlkIG5lZWRzIHRvIGJlIHNldCBiZWZvcmUgY2xlYXJTZXJ2ZXJEYXRhIGNhbiB3b3JrXG4gICAgICBpZiAob3RoZXJBdHRyaWJ1dGVzLm9iamVjdElkKSB7XG4gICAgICAgIG8uaWQgPSBvdGhlckF0dHJpYnV0ZXMub2JqZWN0SWQ7XG4gICAgICB9XG4gICAgICBsZXQgcHJlc2VydmVkID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2Ygby5fcHJlc2VydmVGaWVsZHNPbkZldGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByZXNlcnZlZCA9IG8uX3ByZXNlcnZlRmllbGRzT25GZXRjaCgpO1xuICAgICAgfVxuICAgICAgby5fY2xlYXJTZXJ2ZXJEYXRhKCk7XG4gICAgICBpZiAocHJlc2VydmVkKSB7XG4gICAgICAgIG8uX2ZpbmlzaEZldGNoKHByZXNlcnZlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIG8uX2ZpbmlzaEZldGNoKG90aGVyQXR0cmlidXRlcyk7XG4gICAgaWYgKGpzb24ub2JqZWN0SWQpIHtcbiAgICAgIG8uX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBvO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHN1YmNsYXNzIG9mIFBhcnNlLk9iamVjdCB3aXRoIGEgc3BlY2lmaWMgY2xhc3MgbmFtZS5cbiAgICogV2hlbiBvYmplY3RzIG9mIHRoYXQgY2xhc3MgYXJlIHJldHJpZXZlZCBmcm9tIGEgcXVlcnksIHRoZXkgd2lsbCBiZVxuICAgKiBpbnN0YW50aWF0ZWQgd2l0aCB0aGlzIHN1YmNsYXNzLlxuICAgKiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gdXNpbmcgRVM2IHN1YmNsYXNzaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzdWJjbGFzc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvciBUaGUgc3ViY2xhc3NcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlclN1YmNsYXNzKGNsYXNzTmFtZSwgY29uc3RydWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgdmFsaWQgY2xhc3MgbmFtZS4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHN1cHBseSBhIHN1YmNsYXNzIGNvbnN0cnVjdG9yLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCByZWdpc3RlciB0aGUgc3ViY2xhc3MgY29uc3RydWN0b3IuICcgKyAnRGlkIHlvdSBhdHRlbXB0IHRvIHJlZ2lzdGVyIGFuIGluc3RhbmNlIG9mIHRoZSBzdWJjbGFzcz8nKTtcbiAgICB9XG4gICAgY2xhc3NNYXBbY2xhc3NOYW1lXSA9IGNvbnN0cnVjdG9yO1xuICAgIGlmICghY29uc3RydWN0b3IuY2xhc3NOYW1lKSB7XG4gICAgICBjb25zdHJ1Y3Rvci5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuZWdpc3RlcnMgYSBzdWJjbGFzcyBvZiBQYXJzZS5PYmplY3Qgd2l0aCBhIHNwZWNpZmljIGNsYXNzIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgVGhlIGNsYXNzIG5hbWUgb2YgdGhlIHN1YmNsYXNzXG4gICAqL1xuICBzdGF0aWMgdW5yZWdpc3RlclN1YmNsYXNzKGNsYXNzTmFtZSkge1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCBjbGFzcyBuYW1lLicpO1xuICAgIH1cbiAgICBkZWxldGUgY2xhc3NNYXBbY2xhc3NOYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHN1YmNsYXNzIG9mIFBhcnNlLk9iamVjdCBmb3IgdGhlIGdpdmVuIFBhcnNlIGNsYXNzIG5hbWUuXG4gICAqXG4gICAqIDxwPkV2ZXJ5IGV4dGVuc2lvbiBvZiBhIFBhcnNlIGNsYXNzIHdpbGwgaW5oZXJpdCBmcm9tIHRoZSBtb3N0IHJlY2VudFxuICAgKiBwcmV2aW91cyBleHRlbnNpb24gb2YgdGhhdCBjbGFzcy4gV2hlbiBhIFBhcnNlLk9iamVjdCBpcyBhdXRvbWF0aWNhbGx5XG4gICAqIGNyZWF0ZWQgYnkgcGFyc2luZyBKU09OLCBpdCB3aWxsIHVzZSB0aGUgbW9zdCByZWNlbnQgZXh0ZW5zaW9uIG9mIHRoYXRcbiAgICogY2xhc3MuPC9wPlxuICAgKlxuICAgKiA8cD5Zb3Ugc2hvdWxkIGNhbGwgZWl0aGVyOjxwcmU+XG4gICAqICAgICB2YXIgTXlDbGFzcyA9IFBhcnNlLk9iamVjdC5leHRlbmQoXCJNeUNsYXNzXCIsIHtcbiAgICogICAgICAgICA8aT5JbnN0YW5jZSBtZXRob2RzPC9pPixcbiAgICogICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihhdHRycywgb3B0aW9ucykge1xuICAgKiAgICAgICAgICAgICB0aGlzLnNvbWVJbnN0YW5jZVByb3BlcnR5ID0gW10sXG4gICAqICAgICAgICAgICAgIDxpPk90aGVyIGluc3RhbmNlIHByb3BlcnRpZXM8L2k+XG4gICAqICAgICAgICAgfVxuICAgKiAgICAgfSwge1xuICAgKiAgICAgICAgIDxpPkNsYXNzIHByb3BlcnRpZXM8L2k+XG4gICAqICAgICB9KTs8L3ByZT5cbiAgICogb3IsIGZvciBCYWNrYm9uZSBjb21wYXRpYmlsaXR5OjxwcmU+XG4gICAqICAgICB2YXIgTXlDbGFzcyA9IFBhcnNlLk9iamVjdC5leHRlbmQoe1xuICAgKiAgICAgICAgIGNsYXNzTmFtZTogXCJNeUNsYXNzXCIsXG4gICAqICAgICAgICAgPGk+SW5zdGFuY2UgbWV0aG9kczwvaT4sXG4gICAqICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXR0cnMsIG9wdGlvbnMpIHtcbiAgICogICAgICAgICAgICAgdGhpcy5zb21lSW5zdGFuY2VQcm9wZXJ0eSA9IFtdLFxuICAgKiAgICAgICAgICAgICA8aT5PdGhlciBpbnN0YW5jZSBwcm9wZXJ0aWVzPC9pPlxuICAgKiAgICAgICAgIH1cbiAgICogICAgIH0sIHtcbiAgICogICAgICAgICA8aT5DbGFzcyBwcm9wZXJ0aWVzPC9pPlxuICAgKiAgICAgfSk7PC9wcmU+PC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSBQYXJzZSBjbGFzcyBiYWNraW5nIHRoaXMgbW9kZWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvdG9Qcm9wc10gSW5zdGFuY2UgcHJvcGVydGllcyB0byBhZGQgdG8gaW5zdGFuY2VzIG9mIHRoZVxuICAgKiAgICAgY2xhc3MgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IFtjbGFzc1Byb3BzXSBDbGFzcyBwcm9wZXJ0aWVzIHRvIGFkZCB0aGUgY2xhc3MgcmV0dXJuZWQgZnJvbVxuICAgKiAgICAgdGhpcyBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9IEEgbmV3IHN1YmNsYXNzIG9mIFBhcnNlLk9iamVjdC5cbiAgICovXG4gIHN0YXRpYyBleHRlbmQoY2xhc3NOYW1lLCBwcm90b1Byb3BzLCBjbGFzc1Byb3BzKSB7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoY2xhc3NOYW1lICYmIHR5cGVvZiBjbGFzc05hbWUuY2xhc3NOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gUGFyc2VPYmplY3QuZXh0ZW5kKGNsYXNzTmFtZS5jbGFzc05hbWUsIGNsYXNzTmFtZSwgcHJvdG9Qcm9wcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXJzZS5PYmplY3QuZXh0ZW5kJ3MgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBjbGFzc05hbWUuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgYWRqdXN0ZWRDbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgaWYgKGFkanVzdGVkQ2xhc3NOYW1lID09PSAnVXNlcicgJiYgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdQRVJGT1JNX1VTRVJfUkVXUklURScpKSB7XG4gICAgICBhZGp1c3RlZENsYXNzTmFtZSA9ICdfVXNlcic7XG4gICAgfVxuICAgIGxldCBwYXJlbnRQcm90byA9IFBhcnNlT2JqZWN0LnByb3RvdHlwZTtcbiAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19zdXBlcl9fJykgJiYgdGhpcy5fX3N1cGVyX18pIHtcbiAgICAgIHBhcmVudFByb3RvID0gdGhpcy5wcm90b3R5cGU7XG4gICAgfVxuICAgIGxldCBQYXJzZU9iamVjdFN1YmNsYXNzID0gZnVuY3Rpb24gKGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gYWRqdXN0ZWRDbGFzc05hbWU7XG4gICAgICB0aGlzLl9vYmpDb3VudCA9IG9iamVjdENvdW50Kys7XG4gICAgICAvLyBFbmFibGUgbGVnYWN5IGluaXRpYWxpemVyc1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLmluaXRpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaW5pdGlhbGl6ZXIgb2YgdGhpcy5faW5pdGlhbGl6ZXJzKSB7XG4gICAgICAgICAgaW5pdGlhbGl6ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGF0dHJpYnV0ZXMgJiYgdHlwZW9mIGF0dHJpYnV0ZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICghdGhpcy5zZXQoYXR0cmlidXRlcyB8fCB7fSwgb3B0aW9ucykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgYW4gaW52YWxpZCBQYXJzZSBPYmplY3RcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChjbGFzc01hcFthZGp1c3RlZENsYXNzTmFtZV0pIHtcbiAgICAgIFBhcnNlT2JqZWN0U3ViY2xhc3MgPSBjbGFzc01hcFthZGp1c3RlZENsYXNzTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIFBhcnNlT2JqZWN0U3ViY2xhc3MuZXh0ZW5kID0gZnVuY3Rpb24gKG5hbWUsIHByb3RvUHJvcHMsIGNsYXNzUHJvcHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBQYXJzZU9iamVjdC5leHRlbmQuY2FsbChQYXJzZU9iamVjdFN1YmNsYXNzLCBuYW1lLCBwcm90b1Byb3BzLCBjbGFzc1Byb3BzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUGFyc2VPYmplY3QuZXh0ZW5kLmNhbGwoUGFyc2VPYmplY3RTdWJjbGFzcywgYWRqdXN0ZWRDbGFzc05hbWUsIG5hbWUsIHByb3RvUHJvcHMpO1xuICAgICAgfTtcbiAgICAgIFBhcnNlT2JqZWN0U3ViY2xhc3MuY3JlYXRlV2l0aG91dERhdGEgPSBQYXJzZU9iamVjdC5jcmVhdGVXaXRob3V0RGF0YTtcbiAgICAgIFBhcnNlT2JqZWN0U3ViY2xhc3MuY2xhc3NOYW1lID0gYWRqdXN0ZWRDbGFzc05hbWU7XG4gICAgICBQYXJzZU9iamVjdFN1YmNsYXNzLl9fc3VwZXJfXyA9IHBhcmVudFByb3RvO1xuICAgICAgUGFyc2VPYmplY3RTdWJjbGFzcy5wcm90b3R5cGUgPSAoMCwgX2NyZWF0ZS5kZWZhdWx0KShwYXJlbnRQcm90bywge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgIHZhbHVlOiBQYXJzZU9iamVjdFN1YmNsYXNzLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHByb3RvUHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwcm90b1Byb3BzKSB7XG4gICAgICAgIGlmIChwcm9wID09PSAnaW5pdGlhbGl6ZScpIHtcbiAgICAgICAgICAoMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZU9iamVjdFN1YmNsYXNzLnByb3RvdHlwZSwgJ19pbml0aWFsaXplcnMnLCB7XG4gICAgICAgICAgICB2YWx1ZTogWy4uLihQYXJzZU9iamVjdFN1YmNsYXNzLnByb3RvdHlwZS5faW5pdGlhbGl6ZXJzIHx8IFtdKSwgcHJvdG9Qcm9wc1twcm9wXV0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AgIT09ICdjbGFzc05hbWUnKSB7XG4gICAgICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTMuZGVmYXVsdCkoUGFyc2VPYmplY3RTdWJjbGFzcy5wcm90b3R5cGUsIHByb3AsIHtcbiAgICAgICAgICAgIHZhbHVlOiBwcm90b1Byb3BzW3Byb3BdLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjbGFzc1Byb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gY2xhc3NQcm9wcykge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2NsYXNzTmFtZScpIHtcbiAgICAgICAgICAoMCwgX2RlZmluZVByb3BlcnR5My5kZWZhdWx0KShQYXJzZU9iamVjdFN1YmNsYXNzLCBwcm9wLCB7XG4gICAgICAgICAgICB2YWx1ZTogY2xhc3NQcm9wc1twcm9wXSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjbGFzc01hcFthZGp1c3RlZENsYXNzTmFtZV0gPSBQYXJzZU9iamVjdFN1YmNsYXNzO1xuICAgIHJldHVybiBQYXJzZU9iamVjdFN1YmNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBzaW5nbGUgaW5zdGFuY2Ugb2JqZWN0cywgd2hlcmUgYW55IGxvY2FsIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBJZFxuICAgKiBzaGFyZSB0aGUgc2FtZSBhdHRyaWJ1dGVzLCBhbmQgc3RheSBzeW5jaHJvbml6ZWQgd2l0aCBlYWNoIG90aGVyLlxuICAgKiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgaW4gc2VydmVyIGVudmlyb25tZW50cywgc2luY2UgaXQgY2FuIGxlYWQgdG9cbiAgICogc2VjdXJpdHkgaXNzdWVzLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlU2luZ2xlSW5zdGFuY2UoKSB7XG4gICAgc2luZ2xlSW5zdGFuY2UgPSB0cnVlO1xuICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LnNldE9iamVjdFN0YXRlQ29udHJvbGxlcihTaW5nbGVJbnN0YW5jZVN0YXRlQ29udHJvbGxlcik7XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBzaW5nbGUgaW5zdGFuY2Ugb2JqZWN0cywgd2hlcmUgYW55IGxvY2FsIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBJZFxuICAgKiBzaGFyZSB0aGUgc2FtZSBhdHRyaWJ1dGVzLCBhbmQgc3RheSBzeW5jaHJvbml6ZWQgd2l0aCBlYWNoIG90aGVyLlxuICAgKiBXaGVuIGRpc2FibGVkLCB5b3UgY2FuIGhhdmUgdHdvIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBvYmplY3QgaW4gbWVtb3J5XG4gICAqIHdpdGhvdXQgdGhlbSBzaGFyaW5nIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBkaXNhYmxlU2luZ2xlSW5zdGFuY2UoKSB7XG4gICAgc2luZ2xlSW5zdGFuY2UgPSBmYWxzZTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoVW5pcXVlSW5zdGFuY2VTdGF0ZUNvbnRyb2xsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHN0b3JlcyB0aGUgb2JqZWN0cyBhbmQgZXZlcnkgb2JqZWN0IHRoZXkgcG9pbnQgdG8gaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSxcbiAgICogcmVjdXJzaXZlbHksIHVzaW5nIGEgZGVmYXVsdCBwaW4gbmFtZTogX2RlZmF1bHQuXG4gICAqXG4gICAqIElmIHRob3NlIG90aGVyIG9iamVjdHMgaGF2ZSBub3QgYmVlbiBmZXRjaGVkIGZyb20gUGFyc2UsIHRoZXkgd2lsbCBub3QgYmUgc3RvcmVkLlxuICAgKiBIb3dldmVyLCBpZiB0aGV5IGhhdmUgY2hhbmdlZCBkYXRhLCBhbGwgdGhlIGNoYW5nZXMgd2lsbCBiZSByZXRhaW5lZC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuT2JqZWN0LnBpbkFsbChbLi4uXSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBUbyByZXRyaWV2ZSBvYmplY3Q6XG4gICAqIDxjb2RlPnF1ZXJ5LmZyb21Mb2NhbERhdGFzdG9yZSgpPC9jb2RlPiBvciA8Y29kZT5xdWVyeS5mcm9tUGluKCk8L2NvZGU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9iamVjdHMgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgcGluIGNvbXBsZXRlcy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHBpbkFsbChvYmplY3RzKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LnBpbkFsbFdpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOLCBvYmplY3RzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSBzdG9yZXMgdGhlIG9iamVjdHMgYW5kIGV2ZXJ5IG9iamVjdCB0aGV5IHBvaW50IHRvIGluIHRoZSBsb2NhbCBkYXRhc3RvcmUsIHJlY3Vyc2l2ZWx5LlxuICAgKlxuICAgKiBJZiB0aG9zZSBvdGhlciBvYmplY3RzIGhhdmUgbm90IGJlZW4gZmV0Y2hlZCBmcm9tIFBhcnNlLCB0aGV5IHdpbGwgbm90IGJlIHN0b3JlZC5cbiAgICogSG93ZXZlciwgaWYgdGhleSBoYXZlIGNoYW5nZWQgZGF0YSwgYWxsIHRoZSBjaGFuZ2VzIHdpbGwgYmUgcmV0YWluZWQuXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLk9iamVjdC5waW5BbGxXaXRoTmFtZShuYW1lLCBbb2JqMSwgb2JqMiwgLi4uXSk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBUbyByZXRyaWV2ZSBvYmplY3Q6XG4gICAqIDxjb2RlPnF1ZXJ5LmZyb21Mb2NhbERhdGFzdG9yZSgpPC9jb2RlPiBvciA8Y29kZT5xdWVyeS5mcm9tUGluV2l0aE5hbWUobmFtZSk8L2NvZGU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgUGluLlxuICAgKiBAcGFyYW0ge0FycmF5fSBvYmplY3RzIEEgbGlzdCBvZiA8Y29kZT5QYXJzZS5PYmplY3Q8L2NvZGU+LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHBpbiBjb21wbGV0ZXMuXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBwaW5BbGxXaXRoTmFtZShuYW1lLCBvYmplY3RzKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsRGF0YXN0b3JlLl9oYW5kbGVQaW5BbGxXaXRoTmFtZShuYW1lLCBvYmplY3RzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZW1vdmVzIHRoZSBvYmplY3RzIGFuZCBldmVyeSBvYmplY3QgdGhleSBwb2ludCB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLFxuICAgKiByZWN1cnNpdmVseSwgdXNpbmcgYSBkZWZhdWx0IHBpbiBuYW1lOiBfZGVmYXVsdC5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuT2JqZWN0LnVuUGluQWxsKFsuLi5dKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9iamVjdHMgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgdW5QaW4gY29tcGxldGVzLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgdW5QaW5BbGwob2JqZWN0cykge1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBpZiAoIWxvY2FsRGF0YXN0b3JlLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdQYXJzZS5lbmFibGVMb2NhbERhdGFzdG9yZSgpIG11c3QgYmUgY2FsbGVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBQYXJzZU9iamVjdC51blBpbkFsbFdpdGhOYW1lKF9Mb2NhbERhdGFzdG9yZVV0aWxzLkRFRkFVTFRfUElOLCBvYmplY3RzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSByZW1vdmVzIHRoZSBvYmplY3RzIGFuZCBldmVyeSBvYmplY3QgdGhleSBwb2ludCB0byBpbiB0aGUgbG9jYWwgZGF0YXN0b3JlLCByZWN1cnNpdmVseS5cbiAgICpcbiAgICogPHByZT5cbiAgICogYXdhaXQgUGFyc2UuT2JqZWN0LnVuUGluQWxsV2l0aE5hbWUobmFtZSwgW29iajEsIG9iajIsIC4uLl0pO1xuICAgKiA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBQaW4uXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9iamVjdHMgQSBsaXN0IG9mIDxjb2RlPlBhcnNlLk9iamVjdDwvY29kZT4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgdW5QaW4gY29tcGxldGVzLlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgdW5QaW5BbGxXaXRoTmFtZShuYW1lLCBvYmplY3RzKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmICghbG9jYWxEYXRhc3RvcmUuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1BhcnNlLmVuYWJsZUxvY2FsRGF0YXN0b3JlKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsRGF0YXN0b3JlLl9oYW5kbGVVblBpbkFsbFdpdGhOYW1lKG5hbWUsIG9iamVjdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91c2x5IHJlbW92ZXMgYWxsIG9iamVjdHMgaW4gdGhlIGxvY2FsIGRhdGFzdG9yZSB1c2luZyBhIGRlZmF1bHQgcGluIG5hbWU6IF9kZWZhdWx0LlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBhd2FpdCBQYXJzZS5PYmplY3QudW5QaW5BbGxPYmplY3RzKCk7XG4gICAqIDwvcHJlPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVuUGluIGNvbXBsZXRlcy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHVuUGluQWxsT2JqZWN0cygpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxEYXRhc3RvcmUudW5QaW5XaXRoTmFtZShfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTik7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgcmVtb3ZlcyBhbGwgb2JqZWN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcGluIG5hbWUuXG4gICAqIERlbGV0ZXMgdGhlIHBpbiBuYW1lIGFsc28uXG4gICAqXG4gICAqIDxwcmU+XG4gICAqIGF3YWl0IFBhcnNlLk9iamVjdC51blBpbkFsbE9iamVjdHNXaXRoTmFtZShuYW1lKTtcbiAgICogPC9wcmU+XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgUGluLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHVuUGluIGNvbXBsZXRlcy5cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHVuUGluQWxsT2JqZWN0c1dpdGhOYW1lKG5hbWUpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCFsb2NhbERhdGFzdG9yZS5pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdCgnUGFyc2UuZW5hYmxlTG9jYWxEYXRhc3RvcmUoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYWxEYXRhc3RvcmUudW5QaW5XaXRoTmFtZShfTG9jYWxEYXRhc3RvcmVVdGlscy5QSU5fUFJFRklYICsgbmFtZSk7XG4gIH1cbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBmZXRjaCh0YXJnZXQsIGZvcmNlRmV0Y2gsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2NhbERhdGFzdG9yZSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExvY2FsRGF0YXN0b3JlKCk7XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh0YXJnZXQpKSB7XG4gICAgICBpZiAodGFyZ2V0Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShbXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvYmpzID0gW107XG4gICAgICBjb25zdCBpZHMgPSBbXTtcbiAgICAgIGxldCBjbGFzc05hbWUgPSBudWxsO1xuICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KSh0YXJnZXQpLmNhbGwodGFyZ2V0LCBlbCA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgICAgIGNsYXNzTmFtZSA9IGVsLmNsYXNzTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xhc3NOYW1lICE9PSBlbC5jbGFzc05hbWUpIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9DTEFTU19OQU1FLCAnQWxsIG9iamVjdHMgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIGNsYXNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbC5pZCkge1xuICAgICAgICAgIGVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5NSVNTSU5HX09CSkVDVF9JRCwgJ0FsbCBvYmplY3RzIG11c3QgaGF2ZSBhbiBJRCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JjZUZldGNoIHx8ICFlbC5pc0RhdGFBdmFpbGFibGUoKSkge1xuICAgICAgICAgIGlkcy5wdXNoKGVsLmlkKTtcbiAgICAgICAgICBvYmpzLnB1c2goZWwpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdHMucHVzaChlbCk7XG4gICAgICB9KTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgICAgY29uc3QgUGFyc2VRdWVyeSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUXVlcnkoKTtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkoY2xhc3NOYW1lKTtcbiAgICAgIHF1ZXJ5LmNvbnRhaW5lZEluKCdvYmplY3RJZCcsIGlkcyk7XG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgICAgcXVlcnkuaW5jbHVkZShvcHRpb25zLmluY2x1ZGUpO1xuICAgICAgfVxuICAgICAgcXVlcnkuX2xpbWl0ID0gaWRzLmxlbmd0aDtcbiAgICAgIHJldHVybiAoMCwgX2ZpbmQuZGVmYXVsdCkocXVlcnkpLmNhbGwocXVlcnksIG9wdGlvbnMpLnRoZW4oYXN5bmMgb2JqZWN0cyA9PiB7XG4gICAgICAgIGNvbnN0IGlkTWFwID0ge307XG4gICAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIG8gPT4ge1xuICAgICAgICAgIGlkTWFwW28uaWRdID0gbztcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9iaiA9IG9ianNbaV07XG4gICAgICAgICAgaWYgKCFvYmogfHwgIW9iai5pZCB8fCAhaWRNYXBbb2JqLmlkXSkge1xuICAgICAgICAgICAgaWYgKGZvcmNlRmV0Y2gpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT0JKRUNUX05PVF9GT1VORCwgJ0FsbCBvYmplY3RzIG11c3QgZXhpc3Qgb24gdGhlIHNlcnZlci4nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghc2luZ2xlSW5zdGFuY2UpIHtcbiAgICAgICAgICAvLyBJZiBzaW5nbGUgaW5zdGFuY2Ugb2JqZWN0cyBhcmUgZGlzYWJsZWQsIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGVcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IHJlc3VsdHNbaV07XG4gICAgICAgICAgICBpZiAob2JqICYmIG9iai5pZCAmJiBpZE1hcFtvYmouaWRdKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gb2JqLmlkO1xuICAgICAgICAgICAgICBvYmouX2ZpbmlzaEZldGNoKGlkTWFwW2lkXS50b0pTT04oKSk7XG4gICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBpZE1hcFtpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICBhd2FpdCBsb2NhbERhdGFzdG9yZS5fdXBkYXRlT2JqZWN0SWZQaW5uZWQob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHJlc3VsdHMpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgaWYgKCF0YXJnZXQuaWQpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuTUlTU0lOR19PQkpFQ1RfSUQsICdPYmplY3QgZG9lcyBub3QgaGF2ZSBhbiBJRCcpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNsdWRlKSB7XG4gICAgICAgIHBhcmFtcy5pbmNsdWRlID0gb3B0aW9ucy5pbmNsdWRlLmpvaW4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAnY2xhc3Nlcy8nICsgdGFyZ2V0LmNsYXNzTmFtZSArICcvJyArIHRhcmdldC5fZ2V0SWQoKSwgcGFyYW1zLCBvcHRpb25zKS50aGVuKGFzeW5jIHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGFyZ2V0Ll9jbGVhclBlbmRpbmdPcHMoKTtcbiAgICAgICAgdGFyZ2V0Ll9jbGVhclNlcnZlckRhdGEoKTtcbiAgICAgICAgdGFyZ2V0Ll9maW5pc2hGZXRjaChyZXNwb25zZSk7XG4gICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl91cGRhdGVPYmplY3RJZlBpbm5lZCh0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfSxcbiAgYXN5bmMgZGVzdHJveSh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBvcHRpb25zICYmIG9wdGlvbnMuYmF0Y2hTaXplID8gb3B0aW9ucy5iYXRjaFNpemUgOiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1JFUVVFU1RfQkFUQ0hfU0laRScpO1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh0YXJnZXQpKSB7XG4gICAgICBpZiAodGFyZ2V0Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShbXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBiYXRjaGVzID0gW1tdXTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KSh0YXJnZXQpLmNhbGwodGFyZ2V0LCBvYmogPT4ge1xuICAgICAgICBpZiAoIW9iai5pZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBiYXRjaGVzW2JhdGNoZXMubGVuZ3RoIC0gMV0ucHVzaChvYmopO1xuICAgICAgICBpZiAoYmF0Y2hlc1tiYXRjaGVzLmxlbmd0aCAtIDFdLmxlbmd0aCA+PSBiYXRjaFNpemUpIHtcbiAgICAgICAgICBiYXRjaGVzLnB1c2goW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChiYXRjaGVzW2JhdGNoZXMubGVuZ3RoIC0gMV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIElmIHRoZSBsYXN0IGJhdGNoIGlzIGVtcHR5LCByZW1vdmUgaXRcbiAgICAgICAgYmF0Y2hlcy5wb3AoKTtcbiAgICAgIH1cbiAgICAgIGxldCBkZWxldGVDb21wbGV0ZWQgPSBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoKTtcbiAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGJhdGNoZXMpLmNhbGwoYmF0Y2hlcywgYmF0Y2ggPT4ge1xuICAgICAgICBkZWxldGVDb21wbGV0ZWQgPSBkZWxldGVDb21wbGV0ZWQudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnYmF0Y2gnLCB7XG4gICAgICAgICAgICByZXF1ZXN0czogKDAsIF9tYXAuZGVmYXVsdCkoYmF0Y2gpLmNhbGwoYmF0Y2gsIG9iaiA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgICAgICAgICBwYXRoOiBnZXRTZXJ2ZXJVcmxQYXRoKCkgKyAnY2xhc3Nlcy8nICsgb2JqLmNsYXNzTmFtZSArICcvJyArIG9iai5fZ2V0SWQoKSxcbiAgICAgICAgICAgICAgICBib2R5OiB7fVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9LCBvcHRpb25zKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChyZXN1bHRzW2ldICYmIHJlc3VsdHNbaV0uaGFzT3duUHJvcGVydHkoJ2Vycm9yJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChyZXN1bHRzW2ldLmVycm9yLmNvZGUsIHJlc3VsdHNbaV0uZXJyb3IuZXJyb3IpO1xuICAgICAgICAgICAgICAgIGVyci5vYmplY3QgPSBiYXRjaFtpXTtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGVsZXRlQ29tcGxldGVkLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGFnZ3JlZ2F0ZSA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuQUdHUkVHQVRFX0VSUk9SKTtcbiAgICAgICAgICBhZ2dyZWdhdGUuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChhZ2dyZWdhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIHRhcmdldCkge1xuICAgICAgICAgIGF3YWl0IGxvY2FsRGF0YXN0b3JlLl9kZXN0cm95T2JqZWN0SWZQaW5uZWQob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHRhcmdldCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnREVMRVRFJywgJ2NsYXNzZXMvJyArIHRhcmdldC5jbGFzc05hbWUgKyAnLycgKyB0YXJnZXQuX2dldElkKCksIHt9LCBvcHRpb25zKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgbG9jYWxEYXRhc3RvcmUuX2Rlc3Ryb3lPYmplY3RJZlBpbm5lZCh0YXJnZXQpO1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHRhcmdldCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh0YXJnZXQpO1xuICB9LFxuICBzYXZlKHRhcmdldCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5iYXRjaFNpemUgPyBvcHRpb25zLmJhdGNoU2l6ZSA6IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnUkVRVUVTVF9CQVRDSF9TSVpFJyk7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGNvbnN0IG1hcElkRm9yUGluID0ge307XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IGFsbG93Q3VzdG9tT2JqZWN0SWQgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FMTE9XX0NVU1RPTV9PQkpFQ1RfSUQnKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLnJldHVyblN0YXR1cyA9IG9wdGlvbnMucmV0dXJuU3RhdHVzIHx8IHRydWU7XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh0YXJnZXQpKSB7XG4gICAgICBpZiAodGFyZ2V0Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShbXSk7XG4gICAgICB9XG4gICAgICBsZXQgdW5zYXZlZCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHRhcmdldCkuY2FsbCh0YXJnZXQpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0X2kgPSB0YXJnZXRbaV07XG4gICAgICAgIGlmICh0YXJnZXRfaSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICAgICAgdW5zYXZlZCA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHVuc2F2ZWQpLmNhbGwodW5zYXZlZCwgKDAsIF91bnNhdmVkQ2hpbGRyZW4uZGVmYXVsdCkodGFyZ2V0X2ksIHRydWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdW5zYXZlZCA9ICgwLCBfdW5pcXVlLmRlZmF1bHQpKHVuc2F2ZWQpO1xuICAgICAgY29uc3QgZmlsZXNTYXZlZCA9IFtdO1xuICAgICAgbGV0IHBlbmRpbmcgPSBbXTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KSh1bnNhdmVkKS5jYWxsKHVuc2F2ZWQsIGVsID0+IHtcbiAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgX1BhcnNlRmlsZS5kZWZhdWx0KSB7XG4gICAgICAgICAgZmlsZXNTYXZlZC5wdXNoKGVsLnNhdmUob3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKGVsIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgICAgICBwZW5kaW5nLnB1c2goZWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LmFsbChmaWxlc1NhdmVkKS50aGVuKCgpID0+IHtcbiAgICAgICAgbGV0IG9iamVjdEVycm9yID0gbnVsbDtcbiAgICAgICAgcmV0dXJuICgwLCBfcHJvbWlzZVV0aWxzLmNvbnRpbnVlV2hpbGUpKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gcGVuZGluZy5sZW5ndGggPiAwO1xuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYmF0Y2ggPSBbXTtcbiAgICAgICAgICBjb25zdCBuZXh0UGVuZGluZyA9IFtdO1xuICAgICAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShwZW5kaW5nKS5jYWxsKHBlbmRpbmcsIGVsID0+IHtcbiAgICAgICAgICAgIGlmIChhbGxvd0N1c3RvbU9iamVjdElkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlbCwgJ2lkJykgJiYgIWVsLmlkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuTUlTU0lOR19PQkpFQ1RfSUQsICdvYmplY3RJZCBtdXN0IG5vdCBiZSBlbXB0eSBvciBudWxsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoIDwgYmF0Y2hTaXplICYmICgwLCBfY2FuQmVTZXJpYWxpemVkLmRlZmF1bHQpKGVsKSkge1xuICAgICAgICAgICAgICBiYXRjaC5wdXNoKGVsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5leHRQZW5kaW5nLnB1c2goZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBlbmRpbmcgPSBuZXh0UGVuZGluZztcbiAgICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdUcmllZCB0byBzYXZlIGEgYmF0Y2ggd2l0aCBhIGN5Y2xlLicpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBRdWV1ZSB1cCB0YXNrcyBmb3IgZWFjaCBvYmplY3QgaW4gdGhlIGJhdGNoLlxuICAgICAgICAgIC8vIFdoZW4gZXZlcnkgdGFzayBpcyByZWFkeSwgdGhlIEFQSSByZXF1ZXN0IHdpbGwgZXhlY3V0ZVxuICAgICAgICAgIGNvbnN0IGJhdGNoUmV0dXJuZWQgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgICAgICAgIGNvbnN0IGJhdGNoUmVhZHkgPSBbXTtcbiAgICAgICAgICBjb25zdCBiYXRjaFRhc2tzID0gW107XG4gICAgICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGJhdGNoKS5jYWxsKGJhdGNoLCAob2JqLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhZHkgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgICAgICAgICAgYmF0Y2hSZWFkeS5wdXNoKHJlYWR5KTtcbiAgICAgICAgICAgIHN0YXRlQ29udHJvbGxlci5wdXNoUGVuZGluZ1N0YXRlKG9iai5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgICAgICAgICAgYmF0Y2hUYXNrcy5wdXNoKHN0YXRlQ29udHJvbGxlci5lbnF1ZXVlVGFzayhvYmouX2dldFN0YXRlSWRlbnRpZmllcigpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJlYWR5LnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGJhdGNoUmV0dXJuZWQudGhlbihyZXNwb25zZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZXNbaW5kZXhdLmhhc093blByb3BlcnR5KCdzdWNjZXNzJykpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gcmVzcG9uc2VzW2luZGV4XS5zdWNjZXNzLm9iamVjdElkO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2VzW2luZGV4XS5fc3RhdHVzO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3BvbnNlc1tpbmRleF0uX3N0YXR1cztcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNwb25zZXNbaW5kZXhdLl9oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3BvbnNlc1tpbmRleF0uX3hocjtcbiAgICAgICAgICAgICAgICAgIG1hcElkRm9yUGluW29iamVjdElkXSA9IG9iai5fbG9jYWxJZDtcbiAgICAgICAgICAgICAgICAgIG9iai5faGFuZGxlU2F2ZVJlc3BvbnNlKHJlc3BvbnNlc1tpbmRleF0uc3VjY2Vzcywgc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKCFvYmplY3RFcnJvciAmJiByZXNwb25zZXNbaW5kZXhdLmhhc093blByb3BlcnR5KCdlcnJvcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZlckVycm9yID0gcmVzcG9uc2VzW2luZGV4XS5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0RXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChzZXJ2ZXJFcnJvci5jb2RlLCBzZXJ2ZXJFcnJvci5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbmNlbCB0aGUgcmVzdCBvZiB0aGUgc2F2ZVxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nID0gW107XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBvYmouX2hhbmRsZVNhdmVFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgKDAsIF9wcm9taXNlVXRpbHMud2hlbikoYmF0Y2hSZWFkeSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBLaWNrIG9mZiB0aGUgYmF0Y2ggcmVxdWVzdFxuICAgICAgICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnYmF0Y2gnLCB7XG4gICAgICAgICAgICAgIHJlcXVlc3RzOiAoMCwgX21hcC5kZWZhdWx0KShiYXRjaCkuY2FsbChiYXRjaCwgb2JqID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBvYmouX2dldFNhdmVQYXJhbXMoKTtcbiAgICAgICAgICAgICAgICBwYXJhbXMucGF0aCA9IGdldFNlcnZlclVybFBhdGgoKSArIHBhcmFtcy5wYXRoO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgICB9KS50aGVuKGJhdGNoUmV0dXJuZWQucmVzb2x2ZSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgYmF0Y2hSZXR1cm5lZC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTkNPUlJFQ1RfVFlQRSwgZXJyb3IubWVzc2FnZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiAoMCwgX3Byb21pc2VVdGlscy53aGVuKShiYXRjaFRhc2tzKTtcbiAgICAgICAgfSkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKG9iamVjdEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3Qob2JqZWN0RXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IG9iamVjdCBvZiB0YXJnZXQpIHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGl0IGlzIGEgUGFyc2VPYmplY3QgYmVmb3JlIHVwZGF0aW5nIGl0IGludG8gdGhlIGxvY2FsRGF0YVN0b3JlXG4gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgICAgICAgICAgYXdhaXQgbG9jYWxEYXRhc3RvcmUuX3VwZGF0ZUxvY2FsSWRGb3JPYmplY3QobWFwSWRGb3JQaW5bb2JqZWN0LmlkXSwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgYXdhaXQgbG9jYWxEYXRhc3RvcmUuX3VwZGF0ZU9iamVjdElmUGlubmVkKG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodGFyZ2V0KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICBpZiAoYWxsb3dDdXN0b21PYmplY3RJZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCAnaWQnKSAmJiAhdGFyZ2V0LmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuTUlTU0lOR19PQkpFQ1RfSUQsICdvYmplY3RJZCBtdXN0IG5vdCBiZSBlbXB0eSBvciBudWxsJyk7XG4gICAgICB9XG4gICAgICAvLyBnZW5lcmF0ZSBfbG9jYWxJZCBpbiBjYXNlIGlmIGNhc2NhZGVTYXZlPWZhbHNlXG4gICAgICB0YXJnZXQuX2dldElkKCk7XG4gICAgICBjb25zdCBsb2NhbElkID0gdGFyZ2V0Ll9sb2NhbElkO1xuICAgICAgLy8gY29weWluZyB0YXJnZXQgbGV0cyBndWFyYW50ZWUgdGhlIHBvaW50ZXIgaXNuJ3QgbW9kaWZpZWQgZWxzZXdoZXJlXG4gICAgICBjb25zdCB0YXJnZXRDb3B5ID0gdGFyZ2V0O1xuICAgICAgY29uc3QgdGFzayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gdGFyZ2V0Q29weS5fZ2V0U2F2ZVBhcmFtcygpO1xuICAgICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdChwYXJhbXMubWV0aG9kLCBwYXJhbXMucGF0aCwgcGFyYW1zLmJvZHksIG9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLl9zdGF0dXM7XG4gICAgICAgICAgZGVsZXRlIHJlc3BvbnNlLl9zdGF0dXM7XG4gICAgICAgICAgZGVsZXRlIHJlc3BvbnNlLl9oZWFkZXJzO1xuICAgICAgICAgIGRlbGV0ZSByZXNwb25zZS5feGhyO1xuICAgICAgICAgIHRhcmdldENvcHkuX2hhbmRsZVNhdmVSZXNwb25zZShyZXNwb25zZSwgc3RhdHVzKTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgIHRhcmdldENvcHkuX2hhbmRsZVNhdmVFcnJvcigpO1xuICAgICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHN0YXRlQ29udHJvbGxlci5wdXNoUGVuZGluZ1N0YXRlKHRhcmdldC5fZ2V0U3RhdGVJZGVudGlmaWVyKCkpO1xuICAgICAgcmV0dXJuIHN0YXRlQ29udHJvbGxlci5lbnF1ZXVlVGFzayh0YXJnZXQuX2dldFN0YXRlSWRlbnRpZmllcigpLCB0YXNrKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgbG9jYWxEYXRhc3RvcmUuX3VwZGF0ZUxvY2FsSWRGb3JPYmplY3QobG9jYWxJZCwgdGFyZ2V0KTtcbiAgICAgICAgYXdhaXQgbG9jYWxEYXRhc3RvcmUuX3VwZGF0ZU9iamVjdElmUGlubmVkKHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UGFyc2VPYmplY3QoUGFyc2VPYmplY3QpO1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0T2JqZWN0Q29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZU9iamVjdDsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5VbnNldE9wID0gZXhwb3J0cy5TZXRPcCA9IGV4cG9ydHMuUmVtb3ZlT3AgPSBleHBvcnRzLlJlbGF0aW9uT3AgPSBleHBvcnRzLk9wID0gZXhwb3J0cy5JbmNyZW1lbnRPcCA9IGV4cG9ydHMuQWRkVW5pcXVlT3AgPSBleHBvcnRzLkFkZE9wID0gdm9pZCAwO1xuZXhwb3J0cy5vcEZyb21KU09OID0gb3BGcm9tSlNPTjtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9jb25jYXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2NvbmNhdFwiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9zcGxpY2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL3NwbGljZVwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfYXJyYXlDb250YWluc09iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vYXJyYXlDb250YWluc09iamVjdFwiKSk7XG52YXIgX2RlY29kZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGVjb2RlXCIpKTtcbnZhciBfZW5jb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lbmNvZGVcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbnZhciBfdW5pcXVlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91bmlxdWVcIikpO1xuZnVuY3Rpb24gb3BGcm9tSlNPTihqc29uKSB7XG4gIGlmICghanNvbiB8fCAhanNvbi5fX29wKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgc3dpdGNoIChqc29uLl9fb3ApIHtcbiAgICBjYXNlICdEZWxldGUnOlxuICAgICAgcmV0dXJuIG5ldyBVbnNldE9wKCk7XG4gICAgY2FzZSAnSW5jcmVtZW50JzpcbiAgICAgIHJldHVybiBuZXcgSW5jcmVtZW50T3AoanNvbi5hbW91bnQpO1xuICAgIGNhc2UgJ0FkZCc6XG4gICAgICByZXR1cm4gbmV3IEFkZE9wKCgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24ub2JqZWN0cykpO1xuICAgIGNhc2UgJ0FkZFVuaXF1ZSc6XG4gICAgICByZXR1cm4gbmV3IEFkZFVuaXF1ZU9wKCgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24ub2JqZWN0cykpO1xuICAgIGNhc2UgJ1JlbW92ZSc6XG4gICAgICByZXR1cm4gbmV3IFJlbW92ZU9wKCgwLCBfZGVjb2RlLmRlZmF1bHQpKGpzb24ub2JqZWN0cykpO1xuICAgIGNhc2UgJ0FkZFJlbGF0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgdG9BZGQgPSAoMCwgX2RlY29kZS5kZWZhdWx0KShqc29uLm9iamVjdHMpO1xuICAgICAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KSh0b0FkZCkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uT3AoW10sIFtdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uT3AodG9BZGQsIFtdKTtcbiAgICAgIH1cbiAgICBjYXNlICdSZW1vdmVSZWxhdGlvbic6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbi5vYmplY3RzKTtcbiAgICAgICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkodG9SZW1vdmUpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbk9wKFtdLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWxhdGlvbk9wKFtdLCB0b1JlbW92ZSk7XG4gICAgICB9XG4gICAgY2FzZSAnQmF0Y2gnOlxuICAgICAge1xuICAgICAgICBsZXQgdG9BZGQgPSBbXTtcbiAgICAgICAgbGV0IHRvUmVtb3ZlID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwganNvbi5vcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoanNvbi5vcHNbaV0uX19vcCA9PT0gJ0FkZFJlbGF0aW9uJykge1xuICAgICAgICAgICAgdG9BZGQgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KSh0b0FkZCkuY2FsbCh0b0FkZCwgKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbi5vcHNbaV0ub2JqZWN0cykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoanNvbi5vcHNbaV0uX19vcCA9PT0gJ1JlbW92ZVJlbGF0aW9uJykge1xuICAgICAgICAgICAgdG9SZW1vdmUgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KSh0b1JlbW92ZSkuY2FsbCh0b1JlbW92ZSwgKDAsIF9kZWNvZGUuZGVmYXVsdCkoanNvbi5vcHNbaV0ub2JqZWN0cykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uT3AodG9BZGQsIHRvUmVtb3ZlKTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmNsYXNzIE9wIHtcbiAgLy8gRW1wdHkgcGFyZW50IGNsYXNzXG4gIGFwcGx5VG8oKSB7fSAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICBtZXJnZVdpdGgoKSB7fSAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICB0b0pTT04oKSB7fSAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xufVxuZXhwb3J0cy5PcCA9IE9wO1xuY2xhc3MgU2V0T3AgZXh0ZW5kcyBPcCB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgc3VwZXIoKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl92YWx1ZVwiLCB2b2lkIDApO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cbiAgYXBwbHlUbygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgbWVyZ2VXaXRoKCkge1xuICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5fdmFsdWUpO1xuICB9XG4gIHRvSlNPTihvZmZsaW5lKSB7XG4gICAgcmV0dXJuICgwLCBfZW5jb2RlLmRlZmF1bHQpKHRoaXMuX3ZhbHVlLCBmYWxzZSwgdHJ1ZSwgdW5kZWZpbmVkLCBvZmZsaW5lKTtcbiAgfVxufVxuZXhwb3J0cy5TZXRPcCA9IFNldE9wO1xuY2xhc3MgVW5zZXRPcCBleHRlbmRzIE9wIHtcbiAgYXBwbHlUbygpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIG1lcmdlV2l0aCgpIHtcbiAgICByZXR1cm4gbmV3IFVuc2V0T3AoKTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fb3A6ICdEZWxldGUnXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0cy5VbnNldE9wID0gVW5zZXRPcDtcbmNsYXNzIEluY3JlbWVudE9wIGV4dGVuZHMgT3Age1xuICBjb25zdHJ1Y3RvcihhbW91bnQpIHtcbiAgICBzdXBlcigpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2Ftb3VudFwiLCB2b2lkIDApO1xuICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW5jcmVtZW50IE9wIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIG51bWVyaWMgYW1vdW50LicpO1xuICAgIH1cbiAgICB0aGlzLl9hbW91bnQgPSBhbW91bnQ7XG4gIH1cbiAgYXBwbHlUbyh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYW1vdW50O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGluY3JlbWVudCBhIG5vbi1udW1lcmljIHZhbHVlLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYW1vdW50ICsgdmFsdWU7XG4gIH1cbiAgbWVyZ2VXaXRoKHByZXZpb3VzKSB7XG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fdmFsdWUpKTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgVW5zZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLl9hbW91bnQpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBJbmNyZW1lbnRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBJbmNyZW1lbnRPcCh0aGlzLmFwcGx5VG8ocHJldmlvdXMuX2Ftb3VudCkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtZXJnZSBJbmNyZW1lbnQgT3Agd2l0aCB0aGUgcHJldmlvdXMgT3AnKTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fb3A6ICdJbmNyZW1lbnQnLFxuICAgICAgYW1vdW50OiB0aGlzLl9hbW91bnRcbiAgICB9O1xuICB9XG59XG5leHBvcnRzLkluY3JlbWVudE9wID0gSW5jcmVtZW50T3A7XG5jbGFzcyBBZGRPcCBleHRlbmRzIE9wIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICBzdXBlcigpO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3ZhbHVlXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5fdmFsdWUgPSAoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICB9XG4gIGFwcGx5VG8odmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSkge1xuICAgICAgcmV0dXJuICgwLCBfY29uY2F0LmRlZmF1bHQpKHZhbHVlKS5jYWxsKHZhbHVlLCB0aGlzLl92YWx1ZSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBlbGVtZW50cyB0byBhIG5vbi1hcnJheSB2YWx1ZScpO1xuICB9XG4gIG1lcmdlV2l0aChwcmV2aW91cykge1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBTZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBTZXRPcCh0aGlzLmFwcGx5VG8ocHJldmlvdXMuX3ZhbHVlKSk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFVuc2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBBZGRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBBZGRPcCh0aGlzLmFwcGx5VG8ocHJldmlvdXMuX3ZhbHVlKSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1lcmdlIEFkZCBPcCB3aXRoIHRoZSBwcmV2aW91cyBPcCcpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19vcDogJ0FkZCcsXG4gICAgICBvYmplY3RzOiAoMCwgX2VuY29kZS5kZWZhdWx0KSh0aGlzLl92YWx1ZSwgZmFsc2UsIHRydWUpXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0cy5BZGRPcCA9IEFkZE9wO1xuY2xhc3MgQWRkVW5pcXVlT3AgZXh0ZW5kcyBPcCB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlKSB7XG4gICAgc3VwZXIoKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl92YWx1ZVwiLCB2b2lkIDApO1xuICAgIHRoaXMuX3ZhbHVlID0gKDAsIF91bmlxdWUuZGVmYXVsdCkoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSk7XG4gIH1cbiAgYXBwbHlUbyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWUgfHwgW107XG4gICAgfVxuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgICB2YXIgX2NvbnRleHQ7XG4gICAgICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gICAgICBjb25zdCB0b0FkZCA9IFtdO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0ID0gdGhpcy5fdmFsdWUpLmNhbGwoX2NvbnRleHQsIHYgPT4ge1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgICAgICAgaWYgKCEoMCwgX2FycmF5Q29udGFpbnNPYmplY3QuZGVmYXVsdCkodmFsdWUsIHYpKSB7XG4gICAgICAgICAgICB0b0FkZC5wdXNoKHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKHZhbHVlKS5jYWxsKHZhbHVlLCB2KSA8IDApIHtcbiAgICAgICAgICAgIHRvQWRkLnB1c2godik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoMCwgX2NvbmNhdC5kZWZhdWx0KSh2YWx1ZSkuY2FsbCh2YWx1ZSwgdG9BZGQpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgZWxlbWVudHMgdG8gYSBub24tYXJyYXkgdmFsdWUnKTtcbiAgfVxuICBtZXJnZVdpdGgocHJldmlvdXMpIHtcbiAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgU2V0T3ApIHtcbiAgICAgIHJldHVybiBuZXcgU2V0T3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl92YWx1ZSkpO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBVbnNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgQWRkVW5pcXVlT3ApIHtcbiAgICAgIHJldHVybiBuZXcgQWRkVW5pcXVlT3AodGhpcy5hcHBseVRvKHByZXZpb3VzLl92YWx1ZSkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtZXJnZSBBZGRVbmlxdWUgT3Agd2l0aCB0aGUgcHJldmlvdXMgT3AnKTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fb3A6ICdBZGRVbmlxdWUnLFxuICAgICAgb2JqZWN0czogKDAsIF9lbmNvZGUuZGVmYXVsdCkodGhpcy5fdmFsdWUsIGZhbHNlLCB0cnVlKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydHMuQWRkVW5pcXVlT3AgPSBBZGRVbmlxdWVPcDtcbmNsYXNzIFJlbW92ZU9wIGV4dGVuZHMgT3Age1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHN1cGVyKCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfdmFsdWVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLl92YWx1ZSA9ICgwLCBfdW5pcXVlLmRlZmF1bHQpKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuICB9XG4gIGFwcGx5VG8odmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSkge1xuICAgICAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICAgICAgLy8gdmFyIGkgPSB2YWx1ZS5pbmRleE9mKHRoaXMuX3ZhbHVlKTtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KSh2YWx1ZSkuY2FsbCh2YWx1ZSwgW10pO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl92YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgaW5kZXggPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkocmVtb3ZlZCkuY2FsbChyZW1vdmVkLCB0aGlzLl92YWx1ZVtpXSk7XG4gICAgICAgIHdoaWxlIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgKDAsIF9zcGxpY2UuZGVmYXVsdCkocmVtb3ZlZCkuY2FsbChyZW1vdmVkLCBpbmRleCwgMSk7XG4gICAgICAgICAgaW5kZXggPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkocmVtb3ZlZCkuY2FsbChyZW1vdmVkLCB0aGlzLl92YWx1ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlW2ldIGluc3RhbmNlb2YgUGFyc2VPYmplY3QgJiYgdGhpcy5fdmFsdWVbaV0uaWQpIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlbW92ZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkW2pdIGluc3RhbmNlb2YgUGFyc2VPYmplY3QgJiYgdGhpcy5fdmFsdWVbaV0uaWQgPT09IHJlbW92ZWRbal0uaWQpIHtcbiAgICAgICAgICAgICAgKDAsIF9zcGxpY2UuZGVmYXVsdCkocmVtb3ZlZCkuY2FsbChyZW1vdmVkLCBqLCAxKTtcbiAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlbW92ZSBlbGVtZW50cyBmcm9tIGEgbm9uLWFycmF5IHZhbHVlJyk7XG4gIH1cbiAgbWVyZ2VXaXRoKHByZXZpb3VzKSB7XG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFNldE9wKSB7XG4gICAgICByZXR1cm4gbmV3IFNldE9wKHRoaXMuYXBwbHlUbyhwcmV2aW91cy5fdmFsdWUpKTtcbiAgICB9XG4gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgVW5zZXRPcCkge1xuICAgICAgcmV0dXJuIG5ldyBVbnNldE9wKCk7XG4gICAgfVxuICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIFJlbW92ZU9wKSB7XG4gICAgICB2YXIgX2NvbnRleHQyO1xuICAgICAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICAgICAgY29uc3QgdW5pcXVlcyA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0MiA9IHByZXZpb3VzLl92YWx1ZSkuY2FsbChfY29udGV4dDIsIFtdKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlW2ldIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICAgICAgICBpZiAoISgwLCBfYXJyYXlDb250YWluc09iamVjdC5kZWZhdWx0KSh1bmlxdWVzLCB0aGlzLl92YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgIHVuaXF1ZXMucHVzaCh0aGlzLl92YWx1ZVtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkodW5pcXVlcykuY2FsbCh1bmlxdWVzLCB0aGlzLl92YWx1ZVtpXSkgPCAwKSB7XG4gICAgICAgICAgICB1bmlxdWVzLnB1c2godGhpcy5fdmFsdWVbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSZW1vdmVPcCh1bmlxdWVzKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbWVyZ2UgUmVtb3ZlIE9wIHdpdGggdGhlIHByZXZpb3VzIE9wJyk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBfX29wOiAnUmVtb3ZlJyxcbiAgICAgIG9iamVjdHM6ICgwLCBfZW5jb2RlLmRlZmF1bHQpKHRoaXMuX3ZhbHVlLCBmYWxzZSwgdHJ1ZSlcbiAgICB9O1xuICB9XG59XG5leHBvcnRzLlJlbW92ZU9wID0gUmVtb3ZlT3A7XG5jbGFzcyBSZWxhdGlvbk9wIGV4dGVuZHMgT3Age1xuICBjb25zdHJ1Y3RvcihhZGRzLCByZW1vdmVzKSB7XG4gICAgc3VwZXIoKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl90YXJnZXRDbGFzc05hbWVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlbGF0aW9uc1RvQWRkXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZWxhdGlvbnNUb1JlbW92ZVwiLCB2b2lkIDApO1xuICAgIHRoaXMuX3RhcmdldENsYXNzTmFtZSA9IG51bGw7XG4gICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShhZGRzKSkge1xuICAgICAgdGhpcy5yZWxhdGlvbnNUb0FkZCA9ICgwLCBfdW5pcXVlLmRlZmF1bHQpKCgwLCBfbWFwLmRlZmF1bHQpKGFkZHMpLmNhbGwoYWRkcywgdGhpcy5fZXh0cmFjdElkLCB0aGlzKSk7XG4gICAgfVxuICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkocmVtb3ZlcykpIHtcbiAgICAgIHRoaXMucmVsYXRpb25zVG9SZW1vdmUgPSAoMCwgX3VuaXF1ZS5kZWZhdWx0KSgoMCwgX21hcC5kZWZhdWx0KShyZW1vdmVzKS5jYWxsKHJlbW92ZXMsIHRoaXMuX2V4dHJhY3RJZCwgdGhpcykpO1xuICAgIH1cbiAgfVxuICBfZXh0cmFjdElkKG9iaikge1xuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgaWYgKCFvYmouaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBhZGQgb3IgcmVtb3ZlIGFuIHVuc2F2ZWQgUGFyc2UgT2JqZWN0IGZyb20gYSByZWxhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3RhcmdldENsYXNzTmFtZSkge1xuICAgICAgdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lID0gb2JqLmNsYXNzTmFtZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RhcmdldENsYXNzTmFtZSAhPT0gb2JqLmNsYXNzTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byBjcmVhdGUgYSBSZWxhdGlvbiB3aXRoIDIgZGlmZmVyZW50IG9iamVjdCB0eXBlczogJyArIHRoaXMuX3RhcmdldENsYXNzTmFtZSArICcgYW5kICcgKyBvYmouY2xhc3NOYW1lICsgJy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iai5pZDtcbiAgfVxuICBhcHBseVRvKHZhbHVlLCBwYXJlbnQsIGtleSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGlmICghcGFyZW50IHx8ICFrZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYXBwbHkgYSBSZWxhdGlvbk9wIHdpdGhvdXQgZWl0aGVyIGEgcHJldmlvdXMgdmFsdWUsIG9yIGFuIG9iamVjdCBhbmQgYSBrZXknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0aW9uID0gbmV3IF9QYXJzZVJlbGF0aW9uLmRlZmF1bHQocGFyZW50LCBrZXkpO1xuICAgICAgcmVsYXRpb24udGFyZ2V0Q2xhc3NOYW1lID0gdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lO1xuICAgICAgcmV0dXJuIHJlbGF0aW9uO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSB7XG4gICAgICBpZiAodGhpcy5fdGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZS50YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgICAgICBpZiAodGhpcy5fdGFyZ2V0Q2xhc3NOYW1lICE9PSB2YWx1ZS50YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVsYXRlZCBvYmplY3QgbXVzdCBiZSBhICcgKyB2YWx1ZS50YXJnZXRDbGFzc05hbWUgKyAnLCBidXQgYSAnICsgdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lICsgJyB3YXMgcGFzc2VkIGluLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZS50YXJnZXRDbGFzc05hbWUgPSB0aGlzLl90YXJnZXRDbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWxhdGlvbiBjYW5ub3QgYmUgYXBwbGllZCB0byBhIG5vbi1yZWxhdGlvbiBmaWVsZCcpO1xuICAgIH1cbiAgfVxuICBtZXJnZVdpdGgocHJldmlvdXMpIHtcbiAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2UgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgVW5zZXRPcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IG1vZGlmeSBhIHJlbGF0aW9uIGFmdGVyIGRlbGV0aW5nIGl0LicpO1xuICAgIH0gZWxzZSBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBTZXRPcCAmJiBwcmV2aW91cy5fdmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2UgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgUmVsYXRpb25PcCkge1xuICAgICAgdmFyIF9jb250ZXh0MywgX2NvbnRleHQ0LCBfY29udGV4dDUsIF9jb250ZXh0NiwgX2NvbnRleHQ3LCBfY29udGV4dDg7XG4gICAgICBpZiAocHJldmlvdXMuX3RhcmdldENsYXNzTmFtZSAmJiBwcmV2aW91cy5fdGFyZ2V0Q2xhc3NOYW1lICE9PSB0aGlzLl90YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWxhdGVkIG9iamVjdCBtdXN0IGJlIG9mIGNsYXNzICcgKyBwcmV2aW91cy5fdGFyZ2V0Q2xhc3NOYW1lICsgJywgYnV0ICcgKyAodGhpcy5fdGFyZ2V0Q2xhc3NOYW1lIHx8ICdudWxsJykgKyAnIHdhcyBwYXNzZWQgaW4uJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdBZGQgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDMgPSBwcmV2aW91cy5yZWxhdGlvbnNUb0FkZCkuY2FsbChfY29udGV4dDMsIFtdKTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDQgPSB0aGlzLnJlbGF0aW9uc1RvUmVtb3ZlKS5jYWxsKF9jb250ZXh0NCwgciA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKG5ld0FkZCkuY2FsbChuZXdBZGQsIHIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICgwLCBfc3BsaWNlLmRlZmF1bHQpKG5ld0FkZCkuY2FsbChuZXdBZGQsIGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ1ID0gdGhpcy5yZWxhdGlvbnNUb0FkZCkuY2FsbChfY29udGV4dDUsIHIgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShuZXdBZGQpLmNhbGwobmV3QWRkLCByKTtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgIG5ld0FkZC5wdXNoKHIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG5ld1JlbW92ZSA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0NiA9IHByZXZpb3VzLnJlbGF0aW9uc1RvUmVtb3ZlKS5jYWxsKF9jb250ZXh0NiwgW10pO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKF9jb250ZXh0NyA9IHRoaXMucmVsYXRpb25zVG9BZGQpLmNhbGwoX2NvbnRleHQ3LCByID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkobmV3UmVtb3ZlKS5jYWxsKG5ld1JlbW92ZSwgcik7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgKDAsIF9zcGxpY2UuZGVmYXVsdCkobmV3UmVtb3ZlKS5jYWxsKG5ld1JlbW92ZSwgaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDggPSB0aGlzLnJlbGF0aW9uc1RvUmVtb3ZlKS5jYWxsKF9jb250ZXh0OCwgciA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKDAsIF9pbmRleE9mLmRlZmF1bHQpKG5ld1JlbW92ZSkuY2FsbChuZXdSZW1vdmUsIHIpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgbmV3UmVtb3ZlLnB1c2gocik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV3UmVsYXRpb24gPSBuZXcgUmVsYXRpb25PcChuZXdBZGQsIG5ld1JlbW92ZSk7XG4gICAgICBuZXdSZWxhdGlvbi5fdGFyZ2V0Q2xhc3NOYW1lID0gdGhpcy5fdGFyZ2V0Q2xhc3NOYW1lO1xuICAgICAgcmV0dXJuIG5ld1JlbGF0aW9uO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtZXJnZSBSZWxhdGlvbiBPcCB3aXRoIHRoZSBwcmV2aW91cyBPcCcpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBpZFRvUG9pbnRlciA9IGlkID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICBjbGFzc05hbWU6IHRoaXMuX3RhcmdldENsYXNzTmFtZSxcbiAgICAgICAgb2JqZWN0SWQ6IGlkXG4gICAgICB9O1xuICAgIH07XG4gICAgbGV0IHBvaW50ZXJzID0gbnVsbDtcbiAgICBsZXQgYWRkcyA9IG51bGw7XG4gICAgbGV0IHJlbW92ZXMgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlbGF0aW9uc1RvQWRkLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBfY29udGV4dDk7XG4gICAgICBwb2ludGVycyA9ICgwLCBfbWFwLmRlZmF1bHQpKF9jb250ZXh0OSA9IHRoaXMucmVsYXRpb25zVG9BZGQpLmNhbGwoX2NvbnRleHQ5LCBpZFRvUG9pbnRlcik7XG4gICAgICBhZGRzID0ge1xuICAgICAgICBfX29wOiAnQWRkUmVsYXRpb24nLFxuICAgICAgICBvYmplY3RzOiBwb2ludGVyc1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVsYXRpb25zVG9SZW1vdmUubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIF9jb250ZXh0MTA7XG4gICAgICBwb2ludGVycyA9ICgwLCBfbWFwLmRlZmF1bHQpKF9jb250ZXh0MTAgPSB0aGlzLnJlbGF0aW9uc1RvUmVtb3ZlKS5jYWxsKF9jb250ZXh0MTAsIGlkVG9Qb2ludGVyKTtcbiAgICAgIHJlbW92ZXMgPSB7XG4gICAgICAgIF9fb3A6ICdSZW1vdmVSZWxhdGlvbicsXG4gICAgICAgIG9iamVjdHM6IHBvaW50ZXJzXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoYWRkcyAmJiByZW1vdmVzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX29wOiAnQmF0Y2gnLFxuICAgICAgICBvcHM6IFthZGRzLCByZW1vdmVzXVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZHMgfHwgcmVtb3ZlcyB8fCB7fTtcbiAgfVxufVxuZXhwb3J0cy5SZWxhdGlvbk9wID0gUmVsYXRpb25PcDtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFBhcnNlT3Aoe1xuICBPcCxcbiAgb3BGcm9tSlNPTixcbiAgU2V0T3AsXG4gIFVuc2V0T3AsXG4gIEluY3JlbWVudE9wLFxuICBBZGRPcCxcbiAgUmVsYXRpb25PcCxcbiAgUmVtb3ZlT3AsXG4gIEFkZFVuaXF1ZU9wXG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX1BhcnNlR2VvUG9pbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlR2VvUG9pbnRcIikpO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFBvbHlnb24gd2l0aCBhbnkgb2YgdGhlIGZvbGxvd2luZyBmb3Jtczo8YnI+XG4gKiAgIDxwcmU+XG4gKiAgIG5ldyBQb2x5Z29uKFtbMCwwXSxbMCwxXSxbMSwxXSxbMSwwXV0pXG4gKiAgIG5ldyBQb2x5Z29uKFtHZW9Qb2ludCwgR2VvUG9pbnQsIEdlb1BvaW50XSlcbiAqICAgPC9wcmU+XG4gKlxuICogPHA+UmVwcmVzZW50cyBhIGNvb3JkaW5hdGVzIHRoYXQgbWF5IGJlIGFzc29jaWF0ZWRcbiAqIHdpdGggYSBrZXkgaW4gYSBQYXJzZU9iamVjdCBvciB1c2VkIGFzIGEgcmVmZXJlbmNlIHBvaW50IGZvciBnZW8gcXVlcmllcy5cbiAqIFRoaXMgYWxsb3dzIHByb3hpbWl0eS1iYXNlZCBxdWVyaWVzIG9uIHRoZSBrZXkuPC9wPlxuICpcbiAqIDxwPkV4YW1wbGU6PHByZT5cbiAqICAgdmFyIHBvbHlnb24gPSBuZXcgUGFyc2UuUG9seWdvbihbWzAsMF0sWzAsMV0sWzEsMV0sWzEsMF1dKTtcbiAqICAgdmFyIG9iamVjdCA9IG5ldyBQYXJzZS5PYmplY3QoXCJQbGFjZU9iamVjdFwiKTtcbiAqICAgb2JqZWN0LnNldChcImFyZWFcIiwgcG9seWdvbik7XG4gKiAgIG9iamVjdC5zYXZlKCk7PC9wcmU+PC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5Qb2x5Z29uXG4gKi9cbmNsYXNzIFBhcnNlUG9seWdvbiB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyhDb29yZGluYXRlcyB8IFBhcnNlLkdlb1BvaW50W10pfSBjb29yZGluYXRlcyBBbiBBcnJheSBvZiBjb29yZGluYXRlIHBhaXJzXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb29yZGluYXRlcykge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2Nvb3JkaW5hdGVzXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5fY29vcmRpbmF0ZXMgPSBQYXJzZVBvbHlnb24uX3ZhbGlkYXRlKGNvb3JkaW5hdGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb29yZGluYXRlcyB2YWx1ZSBmb3IgdGhpcyBQb2x5Z29uLlxuICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIG5vdCB2YWxpZCB0eXBlLlxuICAgKlxuICAgKiBAcHJvcGVydHkgeyhDb29yZGluYXRlcyB8IFBhcnNlLkdlb1BvaW50W10pfSBjb29yZGluYXRlcyBsaXN0IG9mIGNvb3JkaW5hdGVzXG4gICAqIEByZXR1cm5zIHtDb29yZGluYXRlc31cbiAgICovXG4gIGdldCBjb29yZGluYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXM7XG4gIH1cbiAgc2V0IGNvb3JkaW5hdGVzKGNvb3Jkcykge1xuICAgIHRoaXMuX2Nvb3JkaW5hdGVzID0gUGFyc2VQb2x5Z29uLl92YWxpZGF0ZShjb29yZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBQb2x5Z29uLCBzdWl0YWJsZSBmb3IgUGFyc2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgUGFyc2VQb2x5Z29uLl92YWxpZGF0ZSh0aGlzLl9jb29yZGluYXRlcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ1BvbHlnb24nLFxuICAgICAgY29vcmRpbmF0ZXM6IHRoaXMuX2Nvb3JkaW5hdGVzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdHdvIHBvbHlnb25zIGFyZSBlcXVhbFxuICAgKlxuICAgKiBAcGFyYW0geyhQYXJzZS5Qb2x5Z29uIHwgb2JqZWN0KX0gb3RoZXJcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFBhcnNlUG9seWdvbikgfHwgdGhpcy5jb29yZGluYXRlcy5sZW5ndGggIT09IG90aGVyLmNvb3JkaW5hdGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgaXNFcXVhbCA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKHRoaXMuX2Nvb3JkaW5hdGVzW2ldWzBdICE9IG90aGVyLmNvb3JkaW5hdGVzW2ldWzBdIHx8IHRoaXMuX2Nvb3JkaW5hdGVzW2ldWzFdICE9IG90aGVyLmNvb3JkaW5hdGVzW2ldWzFdKSB7XG4gICAgICAgIGlzRXF1YWwgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpc0VxdWFsO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGlmIHRoZSBwb2ludCBpcyBjb250YWluZWQgaW4gdGhlIHBvbHlnb25cbiAgICovXG4gIGNvbnRhaW5zUG9pbnQocG9pbnQpIHtcbiAgICBsZXQgbWluWCA9IHRoaXMuX2Nvb3JkaW5hdGVzWzBdWzBdO1xuICAgIGxldCBtYXhYID0gdGhpcy5fY29vcmRpbmF0ZXNbMF1bMF07XG4gICAgbGV0IG1pblkgPSB0aGlzLl9jb29yZGluYXRlc1swXVsxXTtcbiAgICBsZXQgbWF4WSA9IHRoaXMuX2Nvb3JkaW5hdGVzWzBdWzFdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHAgPSB0aGlzLl9jb29yZGluYXRlc1tpXTtcbiAgICAgIG1pblggPSBNYXRoLm1pbihwWzBdLCBtaW5YKTtcbiAgICAgIG1heFggPSBNYXRoLm1heChwWzBdLCBtYXhYKTtcbiAgICAgIG1pblkgPSBNYXRoLm1pbihwWzFdLCBtaW5ZKTtcbiAgICAgIG1heFkgPSBNYXRoLm1heChwWzFdLCBtYXhZKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0c2lkZSA9IHBvaW50LmxhdGl0dWRlIDwgbWluWCB8fCBwb2ludC5sYXRpdHVkZSA+IG1heFggfHwgcG9pbnQubG9uZ2l0dWRlIDwgbWluWSB8fCBwb2ludC5sb25naXR1ZGUgPiBtYXhZO1xuICAgIGlmIChvdXRzaWRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBpbnNpZGUgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDE7IGkgPCB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7IGogPSBpKyspIHtcbiAgICAgIGNvbnN0IHN0YXJ0WCA9IHRoaXMuX2Nvb3JkaW5hdGVzW2ldWzBdO1xuICAgICAgY29uc3Qgc3RhcnRZID0gdGhpcy5fY29vcmRpbmF0ZXNbaV1bMV07XG4gICAgICBjb25zdCBlbmRYID0gdGhpcy5fY29vcmRpbmF0ZXNbal1bMF07XG4gICAgICBjb25zdCBlbmRZID0gdGhpcy5fY29vcmRpbmF0ZXNbal1bMV07XG4gICAgICBjb25zdCBpbnRlcnNlY3QgPSBzdGFydFkgPiBwb2ludC5sb25naXR1ZGUgIT0gZW5kWSA+IHBvaW50LmxvbmdpdHVkZSAmJiBwb2ludC5sYXRpdHVkZSA8IChlbmRYIC0gc3RhcnRYKSAqIChwb2ludC5sb25naXR1ZGUgLSBzdGFydFkpIC8gKGVuZFkgLSBzdGFydFkpICsgc3RhcnRYO1xuICAgICAgaWYgKGludGVyc2VjdCkge1xuICAgICAgICBpbnNpZGUgPSAhaW5zaWRlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5zaWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBsaXN0IG9mIGNvb3JkaW5hdGVzIGNhbiBmb3JtIGEgdmFsaWQgcG9seWdvblxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb29yZHMgdGhlIGxpc3Qgb2YgY29vcmRpbmF0ZXMgdG8gdmFsaWRhdGUgYXMgYSBwb2x5Z29uXG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn1cbiAgICogQHJldHVybnMge251bWJlcltdW119IEFycmF5IG9mIGNvb3JkaW5hdGVzIGlmIHZhbGlkYXRlZC5cbiAgICovXG4gIHN0YXRpYyBfdmFsaWRhdGUoY29vcmRzKSB7XG4gICAgaWYgKCEoMCwgX2lzQXJyYXkuZGVmYXVsdCkoY29vcmRzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheScpO1xuICAgIH1cbiAgICBpZiAoY29vcmRzLmxlbmd0aCA8IDMpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BvbHlnb24gbXVzdCBoYXZlIGF0IGxlYXN0IDMgR2VvUG9pbnRzIG9yIFBvaW50cycpO1xuICAgIH1cbiAgICBjb25zdCBwb2ludHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgY29vcmQgPSBjb29yZHNbaV07XG4gICAgICBsZXQgZ2VvUG9pbnQ7XG4gICAgICBpZiAoY29vcmQgaW5zdGFuY2VvZiBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KSB7XG4gICAgICAgIGdlb1BvaW50ID0gY29vcmQ7XG4gICAgICB9IGVsc2UgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShjb29yZCkgJiYgY29vcmQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGdlb1BvaW50ID0gbmV3IF9QYXJzZUdlb1BvaW50LmRlZmF1bHQoY29vcmRbMF0sIGNvb3JkWzFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nvb3JkaW5hdGVzIG11c3QgYmUgYW4gQXJyYXkgb2YgR2VvUG9pbnRzIG9yIFBvaW50cycpO1xuICAgICAgfVxuICAgICAgcG9pbnRzLnB1c2goW2dlb1BvaW50LmxhdGl0dWRlLCBnZW9Qb2ludC5sb25naXR1ZGVdKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VQb2x5Z29uOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX3NsaWNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zbGljZVwiKSk7XG52YXIgX21hcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvbWFwXCIpKTtcbnZhciBfZmlsdGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9maWx0ZXJcIikpO1xudmFyIF9rZXlzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uva2V5c1wiKSk7XG52YXIgX2NvbmNhdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpKTtcbnZhciBfaW5jbHVkZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luY2x1ZGVzXCIpKTtcbnZhciBfc29ydCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc29ydFwiKSk7XG52YXIgX3NwbGljZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2Uvc3BsaWNlXCIpKTtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX2ZpbmQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2ZpbmRcIikpO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2VudHJpZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9lbnRyaWVzXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfZW5jb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9lbmNvZGVcIikpO1xudmFyIF9wcm9taXNlVXRpbHMgPSByZXF1aXJlKFwiLi9wcm9taXNlVXRpbHNcIik7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZUdlb1BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUdlb1BvaW50XCIpKTtcbnZhciBfUGFyc2VPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlT2JqZWN0XCIpKTtcbnZhciBfT2ZmbGluZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9PZmZsaW5lUXVlcnlcIikpO1xudmFyIF9Mb2NhbERhdGFzdG9yZVV0aWxzID0gcmVxdWlyZShcIi4vTG9jYWxEYXRhc3RvcmVVdGlsc1wiKTtcbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgaW50byBhIHJlZ2V4IHRoYXQgbWF0Y2hlcyBpdC5cbiAqIFN1cnJvdW5kaW5nIHdpdGggXFxRIC4uIFxcRSBkb2VzIHRoaXMsIHdlIGp1c3QgbmVlZCB0byBlc2NhcGUgYW55IFxcRSdzIGluXG4gKiB0aGUgdGV4dCBzZXBhcmF0ZWx5LlxuICpcbiAqIEBwYXJhbSBzXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcXVvdGUocykge1xuICByZXR1cm4gJ1xcXFxRJyArIHMucmVwbGFjZSgnXFxcXEUnLCAnXFxcXEVcXFxcXFxcXEVcXFxcUScpICsgJ1xcXFxFJztcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgY2xhc3MgbmFtZSBmcm9tIHF1ZXJpZXMuIElmIG5vdCBhbGwgcXVlcmllcyBoYXZlIHRoZSBzYW1lXG4gKiBjbGFzcyBuYW1lIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICpcbiAqIEBwYXJhbSBxdWVyaWVzXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX2dldENsYXNzTmFtZUZyb21RdWVyaWVzKHF1ZXJpZXMpIHtcbiAgbGV0IGNsYXNzTmFtZSA9IG51bGw7XG4gICgwLCBfZm9yRWFjaC5kZWZhdWx0KShxdWVyaWVzKS5jYWxsKHF1ZXJpZXMsIHEgPT4ge1xuICAgIGlmICghY2xhc3NOYW1lKSB7XG4gICAgICBjbGFzc05hbWUgPSBxLmNsYXNzTmFtZTtcbiAgICB9XG4gICAgaWYgKGNsYXNzTmFtZSAhPT0gcS5jbGFzc05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHF1ZXJpZXMgbXVzdCBiZSBmb3IgdGhlIHNhbWUgY2xhc3MuJyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNsYXNzTmFtZTtcbn1cblxuLypcbiAqIEhhbmRsZXMgcHJlLXBvcHVsYXRpbmcgdGhlIHJlc3VsdCBkYXRhIG9mIGEgcXVlcnkgd2l0aCBzZWxlY3QgZmllbGRzLFxuICogbWFraW5nIHN1cmUgdGhhdCB0aGUgZGF0YSBvYmplY3QgY29udGFpbnMga2V5cyBmb3IgYWxsIG9iamVjdHMgdGhhdCBoYXZlXG4gKiBiZWVuIHJlcXVlc3RlZCB3aXRoIGEgc2VsZWN0LCBzbyB0aGF0IG91ciBjYWNoZWQgc3RhdGUgdXBkYXRlcyBjb3JyZWN0bHkuXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVNlbGVjdFJlc3VsdChkYXRhLCBzZWxlY3QpIHtcbiAgY29uc3Qgc2VydmVyRGF0YU1hc2sgPSB7fTtcbiAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHNlbGVjdCkuY2FsbChzZWxlY3QsIGZpZWxkID0+IHtcbiAgICBjb25zdCBoYXNTdWJPYmplY3RTZWxlY3QgPSAoMCwgX2luZGV4T2YuZGVmYXVsdCkoZmllbGQpLmNhbGwoZmllbGQsICcuJykgIT09IC0xO1xuICAgIGlmICghaGFzU3ViT2JqZWN0U2VsZWN0ICYmICFkYXRhLmhhc093blByb3BlcnR5KGZpZWxkKSkge1xuICAgICAgLy8gdGhpcyBmaWVsZCB3YXMgc2VsZWN0ZWQsIGJ1dCBpcyBtaXNzaW5nIGZyb20gdGhlIHJldHJpZXZlZCBkYXRhXG4gICAgICBkYXRhW2ZpZWxkXSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKGhhc1N1Yk9iamVjdFNlbGVjdCkge1xuICAgICAgLy8gdGhpcyBmaWVsZCByZWZlcmVuY2VzIGEgc3ViLW9iamVjdCxcbiAgICAgIC8vIHNvIHdlIG5lZWQgdG8gd2FsayBkb3duIHRoZSBwYXRoIGNvbXBvbmVudHNcbiAgICAgIGNvbnN0IHBhdGhDb21wb25lbnRzID0gZmllbGQuc3BsaXQoJy4nKTtcbiAgICAgIGxldCBvYmogPSBkYXRhO1xuICAgICAgbGV0IHNlcnZlck1hc2sgPSBzZXJ2ZXJEYXRhTWFzaztcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShwYXRoQ29tcG9uZW50cykuY2FsbChwYXRoQ29tcG9uZW50cywgKGNvbXBvbmVudCwgaW5kZXgsIGFycikgPT4ge1xuICAgICAgICAvLyBhZGQga2V5cyBpZiB0aGUgZXhwZWN0ZWQgZGF0YSBpcyBtaXNzaW5nXG4gICAgICAgIGlmIChvYmogJiYgIW9iai5oYXNPd25Qcm9wZXJ0eShjb21wb25lbnQpKSB7XG4gICAgICAgICAgb2JqW2NvbXBvbmVudF0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIG9iaiA9IG9ialtjb21wb25lbnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9hZGQgdGhpcyBwYXRoIGNvbXBvbmVudCB0byB0aGUgc2VydmVyIG1hc2sgc28gd2UgY2FuIGZpbGwgaXQgaW4gbGF0ZXIgaWYgbmVlZGVkXG4gICAgICAgIGlmIChpbmRleCA8IGFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgaWYgKCFzZXJ2ZXJNYXNrW2NvbXBvbmVudF0pIHtcbiAgICAgICAgICAgIHNlcnZlck1hc2tbY29tcG9uZW50XSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXJ2ZXJNYXNrID0gc2VydmVyTWFza1tjb21wb25lbnRdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICBpZiAoKDAsIF9rZXlzLmRlZmF1bHQpKHNlcnZlckRhdGFNYXNrKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gV2hlbiBzZWxlY3RpbmcgZnJvbSBzdWItb2JqZWN0cywgd2UgZG9uJ3Qgd2FudCB0byBibG93IGF3YXkgdGhlIG1pc3NpbmdcbiAgICAvLyBpbmZvcm1hdGlvbiB0aGF0IHdlIG1heSBoYXZlIHJldHJpZXZlZCBiZWZvcmUuIFdlJ3ZlIGFscmVhZHkgYWRkZWQgYW55XG4gICAgLy8gbWlzc2luZyBzZWxlY3RlZCBrZXlzIHRvIHN1Yi1vYmplY3RzLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBhZGQgaW4gdGhlXG4gICAgLy8gZGF0YSBmb3IgYW55IHByZXZpb3VzbHkgcmV0cmlldmVkIHN1Yi1vYmplY3RzIHRoYXQgd2VyZSBub3Qgc2VsZWN0ZWQuXG5cbiAgICBjb25zdCBzZXJ2ZXJEYXRhID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCkuZ2V0U2VydmVyRGF0YSh7XG4gICAgICBpZDogZGF0YS5vYmplY3RJZCxcbiAgICAgIGNsYXNzTmFtZTogZGF0YS5jbGFzc05hbWVcbiAgICB9KTtcbiAgICBjb3B5TWlzc2luZ0RhdGFXaXRoTWFzayhzZXJ2ZXJEYXRhLCBkYXRhLCBzZXJ2ZXJEYXRhTWFzaywgZmFsc2UpO1xuICB9XG59XG5mdW5jdGlvbiBjb3B5TWlzc2luZ0RhdGFXaXRoTWFzayhzcmMsIGRlc3QsIG1hc2ssIGNvcHlUaGlzTGV2ZWwpIHtcbiAgLy9jb3B5IG1pc3NpbmcgZWxlbWVudHMgYXQgdGhpcyBsZXZlbFxuICBpZiAoY29weVRoaXNMZXZlbCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNyYykge1xuICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFkZXN0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgZGVzdFtrZXldID0gc3JjW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG1hc2spIHtcbiAgICBpZiAoZGVzdFtrZXldICE9PSB1bmRlZmluZWQgJiYgZGVzdFtrZXldICE9PSBudWxsICYmIHNyYyAhPT0gdW5kZWZpbmVkICYmIHNyYyAhPT0gbnVsbCkge1xuICAgICAgLy90cmF2ZXJzZSBpbnRvIG9iamVjdHMgYXMgbmVlZGVkXG4gICAgICBjb3B5TWlzc2luZ0RhdGFXaXRoTWFzayhzcmNba2V5XSwgZGVzdFtrZXldLCBtYXNrW2tleV0sIHRydWUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gaGFuZGxlT2ZmbGluZVNvcnQoYSwgYiwgc29ydHMpIHtcbiAgbGV0IG9yZGVyID0gc29ydHNbMF07XG4gIGNvbnN0IG9wZXJhdG9yID0gKDAsIF9zbGljZS5kZWZhdWx0KShvcmRlcikuY2FsbChvcmRlciwgMCwgMSk7XG4gIGNvbnN0IGlzRGVzY2VuZGluZyA9IG9wZXJhdG9yID09PSAnLSc7XG4gIGlmIChpc0Rlc2NlbmRpbmcpIHtcbiAgICBvcmRlciA9IG9yZGVyLnN1YnN0cmluZygxKTtcbiAgfVxuICBpZiAob3JkZXIgPT09ICdfY3JlYXRlZF9hdCcpIHtcbiAgICBvcmRlciA9ICdjcmVhdGVkQXQnO1xuICB9XG4gIGlmIChvcmRlciA9PT0gJ191cGRhdGVkX2F0Jykge1xuICAgIG9yZGVyID0gJ3VwZGF0ZWRBdCc7XG4gIH1cbiAgaWYgKCEvXltBLVphLXpdWzAtOUEtWmEtel9dKiQvLnRlc3Qob3JkZXIpIHx8IG9yZGVyID09PSAncGFzc3dvcmQnKSB7XG4gICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5JTlZBTElEX0tFWV9OQU1FLCBgSW52YWxpZCBLZXk6ICR7b3JkZXJ9YCk7XG4gIH1cbiAgY29uc3QgZmllbGQxID0gYS5nZXQob3JkZXIpO1xuICBjb25zdCBmaWVsZDIgPSBiLmdldChvcmRlcik7XG4gIGlmIChmaWVsZDEgPCBmaWVsZDIpIHtcbiAgICByZXR1cm4gaXNEZXNjZW5kaW5nID8gMSA6IC0xO1xuICB9XG4gIGlmIChmaWVsZDEgPiBmaWVsZDIpIHtcbiAgICByZXR1cm4gaXNEZXNjZW5kaW5nID8gLTEgOiAxO1xuICB9XG4gIGlmIChzb3J0cy5sZW5ndGggPiAxKSB7XG4gICAgY29uc3QgcmVtYWluaW5nU29ydHMgPSAoMCwgX3NsaWNlLmRlZmF1bHQpKHNvcnRzKS5jYWxsKHNvcnRzLCAxKTtcbiAgICByZXR1cm4gaGFuZGxlT2ZmbGluZVNvcnQoYSwgYiwgcmVtYWluaW5nU29ydHMpO1xuICB9XG4gIHJldHVybiAwO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHBhcnNlIFBhcnNlLlF1ZXJ5IGZvciB0aGUgZ2l2ZW4gUGFyc2UuT2JqZWN0IHN1YmNsYXNzLlxuICpcbiAqIDxwPlBhcnNlLlF1ZXJ5IGRlZmluZXMgYSBxdWVyeSB0aGF0IGlzIHVzZWQgdG8gZmV0Y2ggUGFyc2UuT2JqZWN0cy4gVGhlXG4gKiBtb3N0IGNvbW1vbiB1c2UgY2FzZSBpcyBmaW5kaW5nIGFsbCBvYmplY3RzIHRoYXQgbWF0Y2ggYSBxdWVyeSB0aHJvdWdoIHRoZVxuICogPGNvZGU+ZmluZDwvY29kZT4gbWV0aG9kLiBmb3IgZXhhbXBsZSwgdGhpcyBzYW1wbGUgY29kZSBmZXRjaGVzIGFsbCBvYmplY3RzXG4gKiBvZiBjbGFzcyA8Y29kZT5teWNsYXNzPC9jb2RlPi4gaXQgY2FsbHMgYSBkaWZmZXJlbnQgZnVuY3Rpb24gZGVwZW5kaW5nIG9uXG4gKiB3aGV0aGVyIHRoZSBmZXRjaCBzdWNjZWVkZWQgb3Igbm90LlxuICpcbiAqIDxwcmU+XG4gKiB2YXIgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkobXljbGFzcyk7XG4gKiBxdWVyeS5maW5kKCkudGhlbigocmVzdWx0cykgPT4ge1xuICogICAvLyByZXN1bHRzIGlzIGFuIGFycmF5IG9mIHBhcnNlLm9iamVjdC5cbiAqIH0pLmNhdGNoKChlcnJvcikgPT4gIHtcbiAqICAvLyBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiBwYXJzZS5lcnJvci5cbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiA8cD5hIFBhcnNlLlF1ZXJ5IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBzaW5nbGUgb2JqZWN0IHdob3NlIGlkIGlzXG4gKiBrbm93biwgdGhyb3VnaCB0aGUgZ2V0IG1ldGhvZC4gZm9yIGV4YW1wbGUsIHRoaXMgc2FtcGxlIGNvZGUgZmV0Y2hlcyBhblxuICogb2JqZWN0IG9mIGNsYXNzIDxjb2RlPm15Y2xhc3M8L2NvZGU+IGFuZCBpZCA8Y29kZT5teWlkPC9jb2RlPi4gaXQgY2FsbHMgYVxuICogZGlmZmVyZW50IGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBmZXRjaCBzdWNjZWVkZWQgb3Igbm90LlxuICpcbiAqIDxwcmU+XG4gKiB2YXIgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkobXljbGFzcyk7XG4gKiBxdWVyeS5nZXQobXlpZCkudGhlbigob2JqZWN0KSA9PiB7XG4gKiAgICAgLy8gb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIHBhcnNlLm9iamVjdC5cbiAqIH0pLmNhdGNoKChlcnJvcikgPT4gIHtcbiAqICAvLyBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiBwYXJzZS5lcnJvci5cbiAqIH0pOzwvcHJlPjwvcD5cbiAqXG4gKiA8cD5hIFBhcnNlLlF1ZXJ5IGNhbiBhbHNvIGJlIHVzZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiBvYmplY3RzIHRoYXQgbWF0Y2hcbiAqIHRoZSBxdWVyeSB3aXRob3V0IHJldHJpZXZpbmcgYWxsIG9mIHRob3NlIG9iamVjdHMuIGZvciBleGFtcGxlLCB0aGlzXG4gKiBzYW1wbGUgY29kZSBjb3VudHMgdGhlIG51bWJlciBvZiBvYmplY3RzIG9mIHRoZSBjbGFzcyA8Y29kZT5teWNsYXNzPC9jb2RlPlxuICogPHByZT5cbiAqIHZhciBxdWVyeSA9IG5ldyBQYXJzZS5RdWVyeShteWNsYXNzKTtcbiAqIHF1ZXJ5LmNvdW50KCkudGhlbigobnVtYmVyKSA9PiB7XG4gKiAgICAgLy8gdGhlcmUgYXJlIG51bWJlciBpbnN0YW5jZXMgb2YgbXljbGFzcy5cbiAqIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICogICAgIC8vIGVycm9yIGlzIGFuIGluc3RhbmNlIG9mIFBhcnNlLkVycm9yLlxuICogfSk7PC9wcmU+PC9wPlxuICpcbiAqIEBhbGlhcyBQYXJzZS5RdWVyeVxuICovXG5jbGFzcyBQYXJzZVF1ZXJ5IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IFBhcnNlLk9iamVjdCl9IG9iamVjdENsYXNzIEFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgUGFyc2UuT2JqZWN0LCBvciBhIFBhcnNlIGNsYXNzTmFtZSBzdHJpbmcuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvYmplY3RDbGFzcykge1xuICAgIC8qKlxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjbGFzc05hbWVcbiAgICAgKi9cbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImNsYXNzTmFtZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3doZXJlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfd2F0Y2hcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9pbmNsdWRlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfZXhjbHVkZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3NlbGVjdFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2xpbWl0XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfc2tpcFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2NvdW50XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfb3JkZXJcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9yZWFkUHJlZmVyZW5jZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2luY2x1ZGVSZWFkUHJlZmVyZW5jZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2VcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9xdWVyaWVzTG9jYWxEYXRhc3RvcmVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9sb2NhbERhdGFzdG9yZVBpbk5hbWVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9leHRyYU9wdGlvbnNcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9oaW50XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfZXhwbGFpblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX3hoclJlcXVlc3RcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIl9jb21tZW50XCIsIHZvaWQgMCk7XG4gICAgaWYgKHR5cGVvZiBvYmplY3RDbGFzcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChvYmplY3RDbGFzcyA9PT0gJ1VzZXInICYmIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnUEVSRk9STV9VU0VSX1JFV1JJVEUnKSkge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICdfVXNlcic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IG9iamVjdENsYXNzO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob2JqZWN0Q2xhc3MgaW5zdGFuY2VvZiBfUGFyc2VPYmplY3QuZGVmYXVsdCkge1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBvYmplY3RDbGFzcy5jbGFzc05hbWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0Q2xhc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IG9iakNsYXNzID0gb2JqZWN0Q2xhc3M7XG4gICAgICBpZiAodHlwZW9mIG9iakNsYXNzLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBvYmpDbGFzcy5jbGFzc05hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBvYmogPSBuZXcgb2JqQ2xhc3MoKTtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBvYmouY2xhc3NOYW1lO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIFBhcnNlUXVlcnkgbXVzdCBiZSBjb25zdHJ1Y3RlZCB3aXRoIGEgUGFyc2VPYmplY3Qgb3IgY2xhc3MgbmFtZS4nKTtcbiAgICB9XG4gICAgdGhpcy5fd2hlcmUgPSB7fTtcbiAgICB0aGlzLl93YXRjaCA9IFtdO1xuICAgIHRoaXMuX2luY2x1ZGUgPSBbXTtcbiAgICB0aGlzLl9leGNsdWRlID0gW107XG4gICAgdGhpcy5fY291bnQgPSBmYWxzZTtcbiAgICB0aGlzLl9saW1pdCA9IC0xOyAvLyBuZWdhdGl2ZSBsaW1pdCBpcyBub3Qgc2VudCBpbiB0aGUgc2VydmVyIHJlcXVlc3RcbiAgICB0aGlzLl9za2lwID0gMDtcbiAgICB0aGlzLl9yZWFkUHJlZmVyZW5jZSA9IG51bGw7XG4gICAgdGhpcy5faW5jbHVkZVJlYWRQcmVmZXJlbmNlID0gbnVsbDtcbiAgICB0aGlzLl9zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0gbnVsbDtcbiAgICB0aGlzLl9xdWVyaWVzTG9jYWxEYXRhc3RvcmUgPSBmYWxzZTtcbiAgICB0aGlzLl9sb2NhbERhdGFzdG9yZVBpbk5hbWUgPSBudWxsO1xuICAgIHRoaXMuX2V4dHJhT3B0aW9ucyA9IHt9O1xuICAgIHRoaXMuX3hoclJlcXVlc3QgPSB7XG4gICAgICB0YXNrOiBudWxsLFxuICAgICAgb25jaGFuZ2U6ICgpID0+IHt9XG4gICAgfTtcbiAgICB0aGlzLl9jb21tZW50ID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGNvbnN0cmFpbnQgdGhhdCBhdCBsZWFzdCBvbmUgb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzIG1hdGNoZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHF1ZXJpZXNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBfb3JRdWVyeShxdWVyaWVzKSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gKDAsIF9tYXAuZGVmYXVsdCkocXVlcmllcykuY2FsbChxdWVyaWVzLCBxID0+IHtcbiAgICAgIHJldHVybiBxLnRvSlNPTigpLndoZXJlO1xuICAgIH0pO1xuICAgIHRoaXMuX3doZXJlLiRvciA9IHF1ZXJ5SlNPTjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGNvbnN0cmFpbnQgdGhhdCBhbGwgb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzIG1hdGNoLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBxdWVyaWVzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgX2FuZFF1ZXJ5KHF1ZXJpZXMpIHtcbiAgICBjb25zdCBxdWVyeUpTT04gPSAoMCwgX21hcC5kZWZhdWx0KShxdWVyaWVzKS5jYWxsKHF1ZXJpZXMsIHEgPT4ge1xuICAgICAgcmV0dXJuIHEudG9KU09OKCkud2hlcmU7XG4gICAgfSk7XG4gICAgdGhpcy5fd2hlcmUuJGFuZCA9IHF1ZXJ5SlNPTjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGNvbnN0cmFpbnQgdGhhdCBub25lIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcyBtYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gcXVlcmllc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIF9ub3JRdWVyeShxdWVyaWVzKSB7XG4gICAgY29uc3QgcXVlcnlKU09OID0gKDAsIF9tYXAuZGVmYXVsdCkocXVlcmllcykuY2FsbChxdWVyaWVzLCBxID0+IHtcbiAgICAgIHJldHVybiBxLnRvSlNPTigpLndoZXJlO1xuICAgIH0pO1xuICAgIHRoaXMuX3doZXJlLiRub3IgPSBxdWVyeUpTT047XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZvciBjb25kaXRpb24gcXVlcmllc1xuICAgKlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEBwYXJhbSBjb25kaXRpb25cbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX1cbiAgICovXG4gIF9hZGRDb25kaXRpb24oa2V5LCBjb25kaXRpb24sIHZhbHVlKSB7XG4gICAgaWYgKCF0aGlzLl93aGVyZVtrZXldIHx8IHR5cGVvZiB0aGlzLl93aGVyZVtrZXldID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fd2hlcmVba2V5XSA9IHt9O1xuICAgIH1cbiAgICB0aGlzLl93aGVyZVtrZXldW2NvbmRpdGlvbl0gPSAoMCwgX2VuY29kZS5kZWZhdWx0KSh2YWx1ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHN0cmluZyBmb3IgcmVndWxhciBleHByZXNzaW9uIGF0IHRoZSBiZWdpbm5pbmdcbiAgICpcbiAgICogQHBhcmFtIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgX3JlZ2V4U3RhcnRXaXRoKHN0cmluZykge1xuICAgIHJldHVybiAnXicgKyBxdW90ZShzdHJpbmcpO1xuICB9XG4gIGFzeW5jIF9oYW5kbGVPZmZsaW5lUXVlcnkocGFyYW1zKSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgIF9PZmZsaW5lUXVlcnkuZGVmYXVsdC52YWxpZGF0ZVF1ZXJ5KHRoaXMpO1xuICAgIGNvbnN0IGxvY2FsRGF0YXN0b3JlID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0TG9jYWxEYXRhc3RvcmUoKTtcbiAgICBjb25zdCBvYmplY3RzID0gYXdhaXQgbG9jYWxEYXRhc3RvcmUuX3NlcmlhbGl6ZU9iamVjdHNGcm9tUGluTmFtZSh0aGlzLl9sb2NhbERhdGFzdG9yZVBpbk5hbWUpO1xuICAgIGxldCByZXN1bHRzID0gKDAsIF9maWx0ZXIuZGVmYXVsdCkoX2NvbnRleHQgPSAoMCwgX21hcC5kZWZhdWx0KShvYmplY3RzKS5jYWxsKG9iamVjdHMsIChqc29uLCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICBjb25zdCBvYmplY3QgPSBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTihqc29uLCBmYWxzZSk7XG4gICAgICBpZiAoanNvbi5fbG9jYWxJZCAmJiAhanNvbi5vYmplY3RJZCkge1xuICAgICAgICBvYmplY3QuX2xvY2FsSWQgPSBqc29uLl9sb2NhbElkO1xuICAgICAgfVxuICAgICAgaWYgKCFfT2ZmbGluZVF1ZXJ5LmRlZmF1bHQubWF0Y2hlc1F1ZXJ5KHRoaXMuY2xhc3NOYW1lLCBvYmplY3QsIGFyciwgdGhpcykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pKS5jYWxsKF9jb250ZXh0LCBvYmplY3QgPT4gb2JqZWN0ICE9PSBudWxsKTtcbiAgICBpZiAoKDAsIF9rZXlzMi5kZWZhdWx0KShwYXJhbXMpKSB7XG4gICAgICBsZXQga2V5cyA9ICgwLCBfa2V5czIuZGVmYXVsdCkocGFyYW1zKS5zcGxpdCgnLCcpO1xuICAgICAga2V5cyA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywgWydjbGFzc05hbWUnLCAnb2JqZWN0SWQnLCAnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCcsICdBQ0wnXSk7XG4gICAgICByZXN1bHRzID0gKDAsIF9tYXAuZGVmYXVsdCkocmVzdWx0cykuY2FsbChyZXN1bHRzLCBvYmplY3QgPT4ge1xuICAgICAgICB2YXIgX2NvbnRleHQyO1xuICAgICAgICBjb25zdCBqc29uID0gb2JqZWN0Ll90b0Z1bGxKU09OKCk7XG4gICAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDIgPSAoMCwgX2tleXMuZGVmYXVsdCkoanNvbikpLmNhbGwoX2NvbnRleHQyLCBrZXkgPT4ge1xuICAgICAgICAgIGlmICghKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBqc29uW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKGpzb24sIGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLm9yZGVyKSB7XG4gICAgICBjb25zdCBzb3J0cyA9IHBhcmFtcy5vcmRlci5zcGxpdCgnLCcpO1xuICAgICAgKDAsIF9zb3J0LmRlZmF1bHQpKHJlc3VsdHMpLmNhbGwocmVzdWx0cywgKGEsIGIpID0+IHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZU9mZmxpbmVTb3J0KGEsIGIsIHNvcnRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgY291bnQ7IC8vIGNvdW50IHRvdGFsIGJlZm9yZSBhcHBseWluZyBsaW1pdC9za2lwXG4gICAgaWYgKHBhcmFtcy5jb3VudCkge1xuICAgICAgY291bnQgPSByZXN1bHRzLmxlbmd0aDsgLy8gdG90YWwgY291bnQgZnJvbSByZXNwb25zZVxuICAgIH1cbiAgICBpZiAocGFyYW1zLnNraXApIHtcbiAgICAgIGlmIChwYXJhbXMuc2tpcCA+PSByZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRzID0gKDAsIF9zcGxpY2UuZGVmYXVsdCkocmVzdWx0cykuY2FsbChyZXN1bHRzLCBwYXJhbXMuc2tpcCwgcmVzdWx0cy5sZW5ndGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgbGltaXQgPSByZXN1bHRzLmxlbmd0aDtcbiAgICBpZiAocGFyYW1zLmxpbWl0ICE9PSAwICYmIHBhcmFtcy5saW1pdCA8IHJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICBsaW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG4gICAgcmVzdWx0cyA9ICgwLCBfc3BsaWNlLmRlZmF1bHQpKHJlc3VsdHMpLmNhbGwocmVzdWx0cywgMCwgbGltaXQpO1xuICAgIGlmICh0eXBlb2YgY291bnQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHRzLFxuICAgICAgICBjb3VudFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBxdWVyeS5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH0gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIHdoZXJlOiB0aGlzLl93aGVyZVxuICAgIH07XG4gICAgaWYgKHRoaXMuX3dhdGNoLmxlbmd0aCkge1xuICAgICAgcGFyYW1zLndhdGNoID0gdGhpcy5fd2F0Y2guam9pbignLCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5faW5jbHVkZS5sZW5ndGgpIHtcbiAgICAgIHBhcmFtcy5pbmNsdWRlID0gdGhpcy5faW5jbHVkZS5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9leGNsdWRlLmxlbmd0aCkge1xuICAgICAgcGFyYW1zLmV4Y2x1ZGVLZXlzID0gdGhpcy5fZXhjbHVkZS5qb2luKCcsJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zZWxlY3QpIHtcbiAgICAgIHBhcmFtcy5rZXlzID0gdGhpcy5fc2VsZWN0LmpvaW4oJywnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvdW50KSB7XG4gICAgICBwYXJhbXMuY291bnQgPSAxO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGltaXQgPj0gMCkge1xuICAgICAgcGFyYW1zLmxpbWl0ID0gdGhpcy5fbGltaXQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9za2lwID4gMCkge1xuICAgICAgcGFyYW1zLnNraXAgPSB0aGlzLl9za2lwO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3JkZXIpIHtcbiAgICAgIHBhcmFtcy5vcmRlciA9IHRoaXMuX29yZGVyLmpvaW4oJywnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlYWRQcmVmZXJlbmNlKSB7XG4gICAgICBwYXJhbXMucmVhZFByZWZlcmVuY2UgPSB0aGlzLl9yZWFkUHJlZmVyZW5jZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZSkge1xuICAgICAgcGFyYW1zLmluY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IHRoaXMuX2luY2x1ZGVSZWFkUHJlZmVyZW5jZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHBhcmFtcy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0gdGhpcy5fc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2hpbnQpIHtcbiAgICAgIHBhcmFtcy5oaW50ID0gdGhpcy5faGludDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V4cGxhaW4pIHtcbiAgICAgIHBhcmFtcy5leHBsYWluID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbW1lbnQpIHtcbiAgICAgIHBhcmFtcy5jb21tZW50ID0gdGhpcy5fY29tbWVudDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5fZXh0cmFPcHRpb25zKSB7XG4gICAgICBwYXJhbXNba2V5XSA9IHRoaXMuX2V4dHJhT3B0aW9uc1trZXldO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHF1ZXJ5IHdpdGggY29uZGl0aW9ucyBmcm9tIGpzb24sIGNhbiBiZSB1c2VmdWwgdG8gc2VuZCBxdWVyeSBmcm9tIHNlcnZlciBzaWRlIHRvIGNsaWVudFxuICAgKiBOb3Qgc3RhdGljLCBhbGwgcXVlcnkgY29uZGl0aW9ucyB3YXMgc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgYmUgZGVsZXRlZC5cbiAgICogRm9yIGV4YW1wbGUgb24gdGhlIHNlcnZlciBzaWRlIHdlIGhhdmVcbiAgICogdmFyIHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiY2xhc3NOYW1lXCIpO1xuICAgKiBxdWVyeS5lcXVhbFRvKGtleTogdmFsdWUpO1xuICAgKiBxdWVyeS5saW1pdCgxMDApO1xuICAgKiAuLi4gKG90aGVycyBxdWVyaWVzKVxuICAgKiBDcmVhdGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBRdWVyeSBPYmplY3RcbiAgICogdmFyIGpzb25Gcm9tU2VydmVyID0gcXVlcnkuZnJvbUpTT04oKTtcbiAgICpcbiAgICogT24gY2xpZW50IHNpZGUgZ2V0dGluZyBxdWVyeTpcbiAgICogdmFyIHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiY2xhc3NOYW1lXCIpO1xuICAgKiBxdWVyeS5mcm9tSlNPTihqc29uRnJvbVNlcnZlcik7XG4gICAqXG4gICAqIGFuZCBjb250aW51ZSB0byBxdWVyeS4uLlxuICAgKiBxdWVyeS5za2lwKDEwMCkuZmluZCgpLnRoZW4oLi4uKTtcbiAgICpcbiAgICogQHBhcmFtIHtRdWVyeUpTT059IGpzb24gZnJvbSBQYXJzZS5RdWVyeS50b0pTT04oKSBtZXRob2RcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3aXRoSlNPTihqc29uKSB7XG4gICAgaWYgKGpzb24ud2hlcmUpIHtcbiAgICAgIHRoaXMuX3doZXJlID0ganNvbi53aGVyZTtcbiAgICB9XG4gICAgaWYgKGpzb24ud2F0Y2gpIHtcbiAgICAgIHRoaXMuX3dhdGNoID0ganNvbi53YXRjaC5zcGxpdCgnLCcpO1xuICAgIH1cbiAgICBpZiAoanNvbi5pbmNsdWRlKSB7XG4gICAgICB0aGlzLl9pbmNsdWRlID0ganNvbi5pbmNsdWRlLnNwbGl0KCcsJyk7XG4gICAgfVxuICAgIGlmICgoMCwgX2tleXMyLmRlZmF1bHQpKGpzb24pKSB7XG4gICAgICB0aGlzLl9zZWxlY3QgPSAoMCwgX2tleXMyLmRlZmF1bHQpKGpzb24pLnNwbGl0KCcsJyk7XG4gICAgfVxuICAgIGlmIChqc29uLmV4Y2x1ZGVLZXlzKSB7XG4gICAgICB0aGlzLl9leGNsdWRlID0ganNvbi5leGNsdWRlS2V5cy5zcGxpdCgnLCcpO1xuICAgIH1cbiAgICBpZiAoanNvbi5jb3VudCkge1xuICAgICAgdGhpcy5fY291bnQgPSBqc29uLmNvdW50ID09PSAxO1xuICAgIH1cbiAgICBpZiAoanNvbi5saW1pdCkge1xuICAgICAgdGhpcy5fbGltaXQgPSBqc29uLmxpbWl0O1xuICAgIH1cbiAgICBpZiAoanNvbi5za2lwKSB7XG4gICAgICB0aGlzLl9za2lwID0ganNvbi5za2lwO1xuICAgIH1cbiAgICBpZiAoanNvbi5vcmRlcikge1xuICAgICAgdGhpcy5fb3JkZXIgPSBqc29uLm9yZGVyLnNwbGl0KCcsJyk7XG4gICAgfVxuICAgIGlmIChqc29uLnJlYWRQcmVmZXJlbmNlKSB7XG4gICAgICB0aGlzLl9yZWFkUHJlZmVyZW5jZSA9IGpzb24ucmVhZFByZWZlcmVuY2U7XG4gICAgfVxuICAgIGlmIChqc29uLmluY2x1ZGVSZWFkUHJlZmVyZW5jZSkge1xuICAgICAgdGhpcy5faW5jbHVkZVJlYWRQcmVmZXJlbmNlID0ganNvbi5pbmNsdWRlUmVhZFByZWZlcmVuY2U7XG4gICAgfVxuICAgIGlmIChqc29uLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHRoaXMuX3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSBqc29uLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gICAgfVxuICAgIGlmIChqc29uLmhpbnQpIHtcbiAgICAgIHRoaXMuX2hpbnQgPSBqc29uLmhpbnQ7XG4gICAgfVxuICAgIGlmIChqc29uLmV4cGxhaW4pIHtcbiAgICAgIHRoaXMuX2V4cGxhaW4gPSAhIWpzb24uZXhwbGFpbjtcbiAgICB9XG4gICAgaWYgKGpzb24uY29tbWVudCkge1xuICAgICAgdGhpcy5fY29tbWVudCA9IGpzb24uY29tbWVudDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4ganNvbikge1xuICAgICAgaWYgKGpzb24uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB2YXIgX2NvbnRleHQzO1xuICAgICAgICBpZiAoKDAsIF9pbmRleE9mLmRlZmF1bHQpKF9jb250ZXh0MyA9IFsnd2hlcmUnLCAnaW5jbHVkZScsICdrZXlzJywgJ2NvdW50JywgJ2xpbWl0JywgJ3NraXAnLCAnb3JkZXInLCAncmVhZFByZWZlcmVuY2UnLCAnaW5jbHVkZVJlYWRQcmVmZXJlbmNlJywgJ3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2UnLCAnaGludCcsICdleHBsYWluJywgJ2NvbW1lbnQnXSkuY2FsbChfY29udGV4dDMsIGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5fZXh0cmFPcHRpb25zW2tleV0gPSBqc29uW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCB0byByZXN0b3JlIFBhcnNlLlF1ZXJ5IGJ5IGpzb24gcmVwcmVzZW50YXRpb25cbiAgICogSW50ZXJuYWxseSBjYWxsaW5nIFBhcnNlLlF1ZXJ5LndpdGhKU09OXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAgICogQHBhcmFtIHtRdWVyeUpTT059IGpzb24gZnJvbSBQYXJzZS5RdWVyeS50b0pTT04oKSBtZXRob2RcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBuZXcgY3JlYXRlZCBxdWVyeVxuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKGNsYXNzTmFtZSwganNvbikge1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkoY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gcXVlcnkud2l0aEpTT04oanNvbik7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIFBhcnNlLk9iamVjdCB3aG9zZSBpZCBpcyBhbHJlYWR5IGtub3duIGJ5IGZldGNoaW5nIGRhdGEgZnJvbVxuICAgKiB0aGUgc2VydmVyLiBVbmxpa2UgdGhlIDxjb2RlPmZpcnN0PC9jb2RlPiBtZXRob2QsIGl0IG5ldmVyIHJldHVybnMgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0SWQgVGhlIGlkIG9mIHRoZSBvYmplY3QgdG8gYmUgZmV0Y2hlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRmluZGAgdHJpZ2dlci5cbiAgICogICA8bGk+anNvbjogUmV0dXJuIHJhdyBqc29uIHdpdGhvdXQgY29udmVydGluZyB0byBQYXJzZS5PYmplY3RcbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBnZXQob2JqZWN0SWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmVxdWFsVG8oJ29iamVjdElkJywgb2JqZWN0SWQpO1xuICAgIGNvbnN0IGZpcnN0T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBmaXJzdE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBmaXJzdE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZmlyc3RPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2pzb24nKSkge1xuICAgICAgZmlyc3RPcHRpb25zLmpzb24gPSBvcHRpb25zLmpzb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpcnN0KGZpcnN0T3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3JPYmplY3QgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kLicpO1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KGVycm9yT2JqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIFBhcnNlT2JqZWN0cyB0aGF0IHNhdGlzZnkgdGhpcyBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9uc1xuICAgKiBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqICAgPGxpPmNvbnRleHQ6IEEgZGljdGlvbmFyeSB0aGF0IGlzIGFjY2Vzc2libGUgaW4gQ2xvdWQgQ29kZSBgYmVmb3JlRmluZGAgdHJpZ2dlci5cbiAgICogICA8bGk+anNvbjogUmV0dXJuIHJhdyBqc29uIHdpdGhvdXQgY29udmVydGluZyB0byBQYXJzZS5PYmplY3RcbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdHMgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgZmluZChvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZmluZE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvblRva2VuJykpIHtcbiAgICAgIGZpbmRPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBmaW5kT3B0aW9ucy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgICB0aGlzLl9zZXRSZXF1ZXN0VGFzayhmaW5kT3B0aW9ucyk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFF1ZXJ5Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMuX3NlbGVjdDtcbiAgICBpZiAodGhpcy5fcXVlcmllc0xvY2FsRGF0YXN0b3JlKSB7XG4gICAgICByZXR1cm4gdGhpcy5faGFuZGxlT2ZmbGluZVF1ZXJ5KHRoaXMudG9KU09OKCkpO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIF9maW5kLmRlZmF1bHQpKGNvbnRyb2xsZXIpLmNhbGwoY29udHJvbGxlciwgdGhpcy5jbGFzc05hbWUsIHRoaXMudG9KU09OKCksIGZpbmRPcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIC8vIFJldHVybiBnZW5lcmljIG9iamVjdCB3aGVuIGV4cGxhaW4gaXMgdXNlZFxuICAgICAgaWYgKHRoaXMuX2V4cGxhaW4pIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdHM7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRzID0gcmVzcG9uc2UucmVzdWx0cz8ubWFwKGRhdGEgPT4ge1xuICAgICAgICAvLyBJbiBjYXNlcyBvZiByZWxhdGlvbnMsIHRoZSBzZXJ2ZXIgbWF5IHNlbmQgYmFjayBhIGNsYXNzTmFtZVxuICAgICAgICAvLyBvbiB0aGUgdG9wIGxldmVsIG9mIHRoZSBwYXlsb2FkXG4gICAgICAgIGNvbnN0IG92ZXJyaWRlID0gcmVzcG9uc2UuY2xhc3NOYW1lIHx8IHRoaXMuY2xhc3NOYW1lO1xuICAgICAgICBpZiAoIWRhdGEuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgZGF0YS5jbGFzc05hbWUgPSBvdmVycmlkZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGF0YSBvYmplY3QgY29udGFpbnMga2V5cyBmb3IgYWxsIG9iamVjdHMgdGhhdFxuICAgICAgICAvLyBoYXZlIGJlZW4gcmVxdWVzdGVkIHdpdGggYSBzZWxlY3QsIHNvIHRoYXQgb3VyIGNhY2hlZCBzdGF0ZVxuICAgICAgICAvLyB1cGRhdGVzIGNvcnJlY3RseS5cbiAgICAgICAgaWYgKHNlbGVjdCkge1xuICAgICAgICAgIGhhbmRsZVNlbGVjdFJlc3VsdChkYXRhLCBzZWxlY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04oZGF0YSwgIXNlbGVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgY291bnQgPSByZXNwb25zZS5jb3VudDtcbiAgICAgIGlmICh0eXBlb2YgY291bnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzdWx0cyxcbiAgICAgICAgICBjb3VudFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgY29tcGxldGUgbGlzdCBvZiBQYXJzZU9iamVjdHMgdGhhdCBzYXRpc2Z5IHRoaXMgcXVlcnkuXG4gICAqIFVzaW5nIGBlYWNoQmF0Y2hgIHVuZGVyIHRoZSBob29kIHRvIGZldGNoIGFsbCB0aGUgdmFsaWQgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT5iYXRjaFNpemU6IEhvdyBtYW55IG9iamVjdHMgdG8geWllbGQgaW4gZWFjaCBiYXRjaCAoZGVmYXVsdDogMTAwKVxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHRzIHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIGZpbmRBbGwob3B0aW9ucykge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBhd2FpdCB0aGlzLmVhY2hCYXRjaChvYmplY3RzID0+IHtcbiAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIC4uLm9iamVjdHNdO1xuICAgIH0sIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ291bnRzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IG1hdGNoIHRoaXMgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudXNlTWFzdGVyS2V5XVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc2Vzc2lvblRva2VuXVxuICAgKiBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIGNvdW50IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGNvdW50KG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBmaW5kT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZmluZE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZmluZE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIHRoaXMuX3NldFJlcXVlc3RUYXNrKGZpbmRPcHRpb25zKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UXVlcnlDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy50b0pTT04oKTtcbiAgICBwYXJhbXMubGltaXQgPSAwO1xuICAgIHBhcmFtcy5jb3VudCA9IDE7XG4gICAgcmV0dXJuICgwLCBfZmluZC5kZWZhdWx0KShjb250cm9sbGVyKS5jYWxsKGNvbnRyb2xsZXIsIHRoaXMuY2xhc3NOYW1lLCBwYXJhbXMsIGZpbmRPcHRpb25zKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICByZXR1cm4gcmVzdWx0LmNvdW50O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgZGlzdGluY3QgcXVlcnkgYW5kIHJldHVybnMgdW5pcXVlIHZhbHVlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IEEgZmllbGQgdG8gZmluZCBkaXN0aW5jdCB2YWx1ZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNlc3Npb25Ub2tlbl0gQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBkaXN0aW5jdChrZXksIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBkaXN0aW5jdE9wdGlvbnMgPSB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZGlzdGluY3RPcHRpb25zLnNlc3Npb25Ub2tlbiA9IG9wdGlvbnMuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICB0aGlzLl9zZXRSZXF1ZXN0VGFzayhkaXN0aW5jdE9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRRdWVyeUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBkaXN0aW5jdDoga2V5LFxuICAgICAgd2hlcmU6IHRoaXMuX3doZXJlLFxuICAgICAgaGludDogdGhpcy5faGludFxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuYWdncmVnYXRlKHRoaXMuY2xhc3NOYW1lLCBwYXJhbXMsIGRpc3RpbmN0T3B0aW9ucykudGhlbihyZXN1bHRzID0+IHtcbiAgICAgIHJldHVybiByZXN1bHRzLnJlc3VsdHM7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYW4gYWdncmVnYXRlIHF1ZXJ5IGFuZCByZXR1cm5zIGFnZ3JlZ2F0ZSByZXN1bHRzXG4gICAqXG4gICAqIEBwYXJhbSB7KEFycmF5fG9iamVjdCl9IHBpcGVsaW5lIEFycmF5IG9yIE9iamVjdCBvZiBzdGFnZXMgdG8gcHJvY2VzcyBxdWVyeVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc2Vzc2lvblRva2VuXSBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb24gYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGFnZ3JlZ2F0ZShwaXBlbGluZSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZU9wdGlvbnMgPSB7XG4gICAgICB1c2VNYXN0ZXJLZXk6IHRydWVcbiAgICB9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgYWdncmVnYXRlT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgdGhpcy5fc2V0UmVxdWVzdFRhc2soYWdncmVnYXRlT3B0aW9ucyk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFF1ZXJ5Q29udHJvbGxlcigpO1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKHBpcGVsaW5lKSAmJiB0eXBlb2YgcGlwZWxpbmUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGlwZWxpbmUgbXVzdCBiZSBBcnJheSBvciBPYmplY3QnKTtcbiAgICB9XG4gICAgaWYgKCgwLCBfa2V5cy5kZWZhdWx0KSh0aGlzLl93aGVyZSB8fCB7fSkubGVuZ3RoKSB7XG4gICAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KShwaXBlbGluZSkpIHtcbiAgICAgICAgcGlwZWxpbmUgPSBbcGlwZWxpbmVdO1xuICAgICAgfVxuICAgICAgcGlwZWxpbmUudW5zaGlmdCh7XG4gICAgICAgICRtYXRjaDogdGhpcy5fd2hlcmVcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBwaXBlbGluZSxcbiAgICAgIGhpbnQ6IHRoaXMuX2hpbnQsXG4gICAgICBleHBsYWluOiB0aGlzLl9leHBsYWluLFxuICAgICAgcmVhZFByZWZlcmVuY2U6IHRoaXMuX3JlYWRQcmVmZXJlbmNlXG4gICAgfTtcbiAgICByZXR1cm4gY29udHJvbGxlci5hZ2dyZWdhdGUodGhpcy5jbGFzc05hbWUsIHBhcmFtcywgYWdncmVnYXRlT3B0aW9ucykudGhlbihyZXN1bHRzID0+IHtcbiAgICAgIHJldHVybiByZXN1bHRzLnJlc3VsdHM7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGF0IG1vc3Qgb25lIFBhcnNlLk9iamVjdCB0aGF0IHNhdGlzZmllcyB0aGlzIHF1ZXJ5LlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgaWYgdGhlcmUgaXMgb25lLCBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVGaW5kYCB0cmlnZ2VyLlxuICAgKiAgIDxsaT5qc29uOiBSZXR1cm4gcmF3IGpzb24gd2l0aG91dCBjb252ZXJ0aW5nIHRvIFBhcnNlLk9iamVjdFxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgb2JqZWN0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGZpcnN0KCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBjb25zdCBmaW5kT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgZmluZE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdzZXNzaW9uVG9rZW4nKSkge1xuICAgICAgZmluZE9wdGlvbnMuc2Vzc2lvblRva2VuID0gb3B0aW9ucy5zZXNzaW9uVG9rZW47XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdjb250ZXh0JykgJiYgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZpbmRPcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIHRoaXMuX3NldFJlcXVlc3RUYXNrKGZpbmRPcHRpb25zKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UXVlcnlDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy50b0pTT04oKTtcbiAgICBwYXJhbXMubGltaXQgPSAxO1xuICAgIGNvbnN0IHNlbGVjdCA9IHRoaXMuX3NlbGVjdDtcbiAgICBpZiAodGhpcy5fcXVlcmllc0xvY2FsRGF0YXN0b3JlKSB7XG4gICAgICByZXR1cm4gdGhpcy5faGFuZGxlT2ZmbGluZVF1ZXJ5KHBhcmFtcykudGhlbihvYmplY3RzID0+IHtcbiAgICAgICAgaWYgKCFvYmplY3RzWzBdKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0c1swXTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIF9maW5kLmRlZmF1bHQpKGNvbnRyb2xsZXIpLmNhbGwoY29udHJvbGxlciwgdGhpcy5jbGFzc05hbWUsIHBhcmFtcywgZmluZE9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0cyA9IHJlc3BvbnNlLnJlc3VsdHM7XG4gICAgICBpZiAoIW9iamVjdHNbMF0pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICghb2JqZWN0c1swXS5jbGFzc05hbWUpIHtcbiAgICAgICAgb2JqZWN0c1swXS5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIHRoZSBkYXRhIG9iamVjdCBjb250YWlucyBrZXlzIGZvciBhbGwgb2JqZWN0cyB0aGF0XG4gICAgICAvLyBoYXZlIGJlZW4gcmVxdWVzdGVkIHdpdGggYSBzZWxlY3QsIHNvIHRoYXQgb3VyIGNhY2hlZCBzdGF0ZVxuICAgICAgLy8gdXBkYXRlcyBjb3JyZWN0bHkuXG4gICAgICBpZiAoc2VsZWN0KSB7XG4gICAgICAgIGhhbmRsZVNlbGVjdFJlc3VsdChvYmplY3RzWzBdLCBzZWxlY3QpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICByZXR1cm4gb2JqZWN0c1swXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBfUGFyc2VPYmplY3QuZGVmYXVsdC5mcm9tSlNPTihvYmplY3RzWzBdLCAhc2VsZWN0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIG9iamVjdHMgbWF0Y2hpbmcgYSBxdWVyeSwgY2FsbGluZyBhIGNhbGxiYWNrIGZvciBlYWNoIGJhdGNoLlxuICAgKiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHByb21pc2UsIHRoZSBpdGVyYXRpb24gd2lsbCBub3QgY29udGludWUgdW50aWxcbiAgICogdGhhdCBwcm9taXNlIGhhcyBiZWVuIGZ1bGZpbGxlZC4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSByZWplY3RlZFxuICAgKiBwcm9taXNlLCB0aGVuIGl0ZXJhdGlvbiB3aWxsIHN0b3Agd2l0aCB0aGF0IGVycm9yLiBUaGUgaXRlbXMgYXJlIHByb2Nlc3NlZFxuICAgKiBpbiBhbiB1bnNwZWNpZmllZCBvcmRlci4gVGhlIHF1ZXJ5IG1heSBub3QgaGF2ZSBhbnkgc29ydCBvcmRlciwgYW5kIG1heVxuICAgKiBub3QgdXNlIGxpbWl0IG9yIHNraXAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBlYWNoIHJlc3VsdFxuICAgKiAgICAgb2YgdGhlIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPmJhdGNoU2l6ZTogSG93IG1hbnkgb2JqZWN0cyB0byB5aWVsZCBpbiBlYWNoIGJhdGNoIChkZWZhdWx0OiAxMDApXG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+Y29udGV4dDogQSBkaWN0aW9uYXJ5IHRoYXQgaXMgYWNjZXNzaWJsZSBpbiBDbG91ZCBDb2RlIGBiZWZvcmVGaW5kYCB0cmlnZ2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgb25jZSB0aGVcbiAgICogICAgIGl0ZXJhdGlvbiBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgZWFjaEJhdGNoKGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKHRoaXMuX29yZGVyIHx8IHRoaXMuX3NraXAgfHwgdGhpcy5fbGltaXQgPj0gMCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KCdDYW5ub3QgaXRlcmF0ZSBvbiBhIHF1ZXJ5IHdpdGggc29ydCwgc2tpcCwgb3IgbGltaXQuJyk7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkodGhpcy5jbGFzc05hbWUpO1xuICAgIHF1ZXJ5Ll9saW1pdCA9IG9wdGlvbnMuYmF0Y2hTaXplIHx8IDEwMDtcbiAgICBxdWVyeS5faW5jbHVkZSA9IFsuLi50aGlzLl9pbmNsdWRlXTtcbiAgICBxdWVyeS5fZXhjbHVkZSA9IFsuLi50aGlzLl9leGNsdWRlXTtcbiAgICBpZiAodGhpcy5fc2VsZWN0KSB7XG4gICAgICBxdWVyeS5fc2VsZWN0ID0gWy4uLnRoaXMuX3NlbGVjdF07XG4gICAgfVxuICAgIHF1ZXJ5Ll9oaW50ID0gdGhpcy5faGludDtcbiAgICBxdWVyeS5fd2hlcmUgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gdGhpcy5fd2hlcmUpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuX3doZXJlW2F0dHJdO1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWwpKSB7XG4gICAgICAgIHF1ZXJ5Ll93aGVyZVthdHRyXSA9ICgwLCBfbWFwLmRlZmF1bHQpKHZhbCkuY2FsbCh2YWwsIHYgPT4ge1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbk1hcCA9IHt9O1xuICAgICAgICBxdWVyeS5fd2hlcmVbYXR0cl0gPSBjb25kaXRpb25NYXA7XG4gICAgICAgIGZvciAoY29uc3QgY29uZCBpbiB2YWwpIHtcbiAgICAgICAgICBjb25kaXRpb25NYXBbY29uZF0gPSB2YWxbY29uZF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5Ll93aGVyZVthdHRyXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcXVlcnkuYXNjZW5kaW5nKCdvYmplY3RJZCcpO1xuICAgIGNvbnN0IGZpbmRPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICBmaW5kT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3Nlc3Npb25Ub2tlbicpKSB7XG4gICAgICBmaW5kT3B0aW9ucy5zZXNzaW9uVG9rZW4gPSBvcHRpb25zLnNlc3Npb25Ub2tlbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiB0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgZmluZE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2pzb24nKSkge1xuICAgICAgZmluZE9wdGlvbnMuanNvbiA9IG9wdGlvbnMuanNvbjtcbiAgICB9XG4gICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gICAgbGV0IHByZXZpb3VzUmVzdWx0cyA9IFtdO1xuICAgIHJldHVybiAoMCwgX3Byb21pc2VVdGlscy5jb250aW51ZVdoaWxlKSgoKSA9PiB7XG4gICAgICByZXR1cm4gIWZpbmlzaGVkO1xuICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IFtyZXN1bHRzXSA9IGF3YWl0IF9wcm9taXNlLmRlZmF1bHQuYWxsKFsoMCwgX2ZpbmQuZGVmYXVsdCkocXVlcnkpLmNhbGwocXVlcnksIGZpbmRPcHRpb25zKSwgX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKHByZXZpb3VzUmVzdWx0cy5sZW5ndGggPiAwICYmIGNhbGxiYWNrKHByZXZpb3VzUmVzdWx0cykpXSk7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPj0gcXVlcnkuX2xpbWl0KSB7XG4gICAgICAgIHF1ZXJ5LmdyZWF0ZXJUaGFuKCdvYmplY3RJZCcsIHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXS5pZCk7XG4gICAgICAgIHByZXZpb3VzUmVzdWx0cyA9IHJlc3VsdHM7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY2FsbGJhY2socmVzdWx0cykpO1xuICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciBlYWNoIHJlc3VsdCBvZiBhIHF1ZXJ5LCBjYWxsaW5nIGEgY2FsbGJhY2sgZm9yIGVhY2ggb25lLiBJZlxuICAgKiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHByb21pc2UsIHRoZSBpdGVyYXRpb24gd2lsbCBub3QgY29udGludWUgdW50aWxcbiAgICogdGhhdCBwcm9taXNlIGhhcyBiZWVuIGZ1bGZpbGxlZC4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSByZWplY3RlZFxuICAgKiBwcm9taXNlLCB0aGVuIGl0ZXJhdGlvbiB3aWxsIHN0b3Agd2l0aCB0aGF0IGVycm9yLiBUaGUgaXRlbXMgYXJlXG4gICAqIHByb2Nlc3NlZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlci4gVGhlIHF1ZXJ5IG1heSBub3QgaGF2ZSBhbnkgc29ydCBvcmRlcixcbiAgICogYW5kIG1heSBub3QgdXNlIGxpbWl0IG9yIHNraXAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBlYWNoIHJlc3VsdFxuICAgKiAgICAgb2YgdGhlIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogICA8bGk+anNvbjogUmV0dXJuIHJhdyBqc29uIHdpdGhvdXQgY29udmVydGluZyB0byBQYXJzZS5PYmplY3RcbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlXG4gICAqICAgICBpdGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIGVhY2goY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoQmF0Y2gocmVzdWx0cyA9PiB7XG4gICAgICBsZXQgY2FsbGJhY2tzRG9uZSA9IF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xuICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHJlc3VsdHMpLmNhbGwocmVzdWx0cywgcmVzdWx0ID0+IHtcbiAgICAgICAgY2FsbGJhY2tzRG9uZSA9IGNhbGxiYWNrc0RvbmUudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2FsbGJhY2tzRG9uZTtcbiAgICB9LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgaGludCB0byBmb3JjZSBpbmRleCBzZWxlY3Rpb24uIChodHRwczovL2RvY3MubW9uZ29kYi5jb20vbWFudWFsL3JlZmVyZW5jZS9vcGVyYXRvci9tZXRhL2hpbnQvKVxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8b2JqZWN0KX0gdmFsdWUgU3RyaW5nIG9yIE9iamVjdCBvZiBpbmRleCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gZXhlY3V0aW5nIHF1ZXJ5XG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgaGludCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBkZWxldGUgdGhpcy5faGludDtcbiAgICB9XG4gICAgdGhpcy5faGludCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEludmVzdGlnYXRlcyB0aGUgcXVlcnkgZXhlY3V0aW9uIHBsYW4uIFVzZWZ1bCBmb3Igb3B0aW1pemluZyBxdWVyaWVzLiAoaHR0cHM6Ly9kb2NzLm1vbmdvZGIuY29tL21hbnVhbC9yZWZlcmVuY2Uvb3BlcmF0b3IvbWV0YS9leHBsYWluLylcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBleHBsYWluIFVzZWQgdG8gdG9nZ2xlIHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgcXVlcnkgcGxhbi5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBleHBsYWluKCkge1xuICAgIGxldCBleHBsYWluID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0cnVlO1xuICAgIGlmICh0eXBlb2YgZXhwbGFpbiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW4gb25seSBzZXQgZXhwbGFpbiB0byBhIGJvb2xlYW4gdmFsdWUnKTtcbiAgICB9XG4gICAgdGhpcy5fZXhwbGFpbiA9IGV4cGxhaW47XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciBlYWNoIHJlc3VsdCBvZiBhIHF1ZXJ5LCBjYWxsaW5nIGEgY2FsbGJhY2sgZm9yIGVhY2ggb25lLiBJZlxuICAgKiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHByb21pc2UsIHRoZSBpdGVyYXRpb24gd2lsbCBub3QgY29udGludWUgdW50aWxcbiAgICogdGhhdCBwcm9taXNlIGhhcyBiZWVuIGZ1bGZpbGxlZC4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgYSByZWplY3RlZFxuICAgKiBwcm9taXNlLCB0aGVuIGl0ZXJhdGlvbiB3aWxsIHN0b3Agd2l0aCB0aGF0IGVycm9yLiBUaGUgaXRlbXMgYXJlXG4gICAqIHByb2Nlc3NlZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlci4gVGhlIHF1ZXJ5IG1heSBub3QgaGF2ZSBhbnkgc29ydCBvcmRlcixcbiAgICogYW5kIG1heSBub3QgdXNlIGxpbWl0IG9yIHNraXAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIDx1bD5cbiAgICogICA8bGk+Y3VycmVudE9iamVjdDogVGhlIGN1cnJlbnQgUGFyc2UuT2JqZWN0IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgYXJyYXkuPC9saT5cbiAgICogICA8bGk+aW5kZXg6IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBQYXJzZS5PYmplY3QgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBhcnJheS48L2xpPlxuICAgKiAgIDxsaT5xdWVyeTogVGhlIHF1ZXJ5IG1hcCB3YXMgY2FsbGVkIHVwb24uPC9saT5cbiAgICogPC91bD5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gICAqICAgICBiZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QuXG4gICAqICAgPGxpPnNlc3Npb25Ub2tlbjogQSB2YWxpZCBzZXNzaW9uIHRva2VuLCB1c2VkIGZvciBtYWtpbmcgYSByZXF1ZXN0IG9uXG4gICAqICAgICAgIGJlaGFsZiBvZiBhIHNwZWNpZmljIHVzZXIuXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBvbmNlIHRoZVxuICAgKiAgICAgaXRlcmF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBhc3luYyBtYXAoY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBjb25zdCBhcnJheSA9IFtdO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgYXdhaXQgdGhpcy5lYWNoKG9iamVjdCA9PiB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNhbGxiYWNrKG9iamVjdCwgaW5kZXgsIHRoaXMpKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGFycmF5LnB1c2gocmVzdWx0KTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH0pO1xuICAgIH0sIG9wdGlvbnMpO1xuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIGVhY2ggcmVzdWx0IG9mIGEgcXVlcnksIGNhbGxpbmcgYSBjYWxsYmFjayBmb3IgZWFjaCBvbmUuIElmXG4gICAqIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcHJvbWlzZSwgdGhlIGl0ZXJhdGlvbiB3aWxsIG5vdCBjb250aW51ZSB1bnRpbFxuICAgKiB0aGF0IHByb21pc2UgaGFzIGJlZW4gZnVsZmlsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHJlamVjdGVkXG4gICAqIHByb21pc2UsIHRoZW4gaXRlcmF0aW9uIHdpbGwgc3RvcCB3aXRoIHRoYXQgZXJyb3IuIFRoZSBpdGVtcyBhcmVcbiAgICogcHJvY2Vzc2VkIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLiBUaGUgcXVlcnkgbWF5IG5vdCBoYXZlIGFueSBzb3J0IG9yZGVyLFxuICAgKiBhbmQgbWF5IG5vdCB1c2UgbGltaXQgb3Igc2tpcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgPHVsPlxuICAgKiAgIDxsaT5hY2N1bXVsYXRvcjogVGhlIGFjY3VtdWxhdG9yIGFjY3VtdWxhdGVzIHRoZSBjYWxsYmFjaydzIHJldHVybiB2YWx1ZXMuIEl0IGlzIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGluIHRoZSBsYXN0IGludm9jYXRpb24gb2YgdGhlIGNhbGxiYWNrLjwvbGk+XG4gICAqICAgPGxpPmN1cnJlbnRPYmplY3Q6IFRoZSBjdXJyZW50IFBhcnNlLk9iamVjdCBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIGFycmF5LjwvbGk+XG4gICAqICAgPGxpPmluZGV4OiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgUGFyc2UuT2JqZWN0IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgYXJyYXkuPC9saT5cbiAgICogPC91bD5cbiAgICogQHBhcmFtIHsqfSBpbml0aWFsVmFsdWUgQSB2YWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay4gSWYgbm8gaW5pdGlhbFZhbHVlIGlzIHN1cHBsaWVkLCB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBxdWVyeSB3aWxsIGJlIHVzZWQgYW5kIHNraXBwZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnMgYXJlOjx1bD5cbiAgICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICAgKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICAgKiAgIDxsaT5zZXNzaW9uVG9rZW46IEEgdmFsaWQgc2Vzc2lvbiB0b2tlbiwgdXNlZCBmb3IgbWFraW5nIGEgcmVxdWVzdCBvblxuICAgKiAgICAgICBiZWhhbGYgb2YgYSBzcGVjaWZpYyB1c2VyLlxuICAgKiA8L3VsPlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgb25jZSB0aGVcbiAgICogICAgIGl0ZXJhdGlvbiBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgYXN5bmMgcmVkdWNlKGNhbGxiYWNrLCBpbml0aWFsVmFsdWUsIG9wdGlvbnMpIHtcbiAgICBsZXQgYWNjdW11bGF0b3IgPSBpbml0aWFsVmFsdWU7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBhd2FpdCB0aGlzLmVhY2gob2JqZWN0ID0+IHtcbiAgICAgIC8vIElmIG5vIGluaXRpYWwgdmFsdWUgd2FzIGdpdmVuLCB3ZSB0YWtlIHRoZSBmaXJzdCBvYmplY3QgZnJvbSB0aGUgcXVlcnlcbiAgICAgIC8vIGFzIHRoZSBpbml0aWFsIHZhbHVlIGFuZCBkb24ndCBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIGl0LlxuICAgICAgaWYgKGluZGV4ID09PSAwICYmIGluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjY3VtdWxhdG9yID0gb2JqZWN0O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNhbGxiYWNrKGFjY3VtdWxhdG9yLCBvYmplY3QsIGluZGV4KSkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBhY2N1bXVsYXRvciA9IHJlc3VsdDtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH0pO1xuICAgIH0sIG9wdGlvbnMpO1xuICAgIGlmIChpbmRleCA9PT0gMCAmJiBpbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gTWF0Y2ggQXJyYXkucmVkdWNlIGJlaGF2aW9yOiBcIkNhbGxpbmcgcmVkdWNlKCkgb24gYW4gZW1wdHkgYXJyYXlcbiAgICAgIC8vIHdpdGhvdXQgYW4gaW5pdGlhbFZhbHVlIHdpbGwgdGhyb3cgYSBUeXBlRXJyb3JcIi5cbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZHVjaW5nIGVtcHR5IHF1ZXJ5IHJlc3VsdCBzZXQgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIGVhY2ggcmVzdWx0IG9mIGEgcXVlcnksIGNhbGxpbmcgYSBjYWxsYmFjayBmb3IgZWFjaCBvbmUuIElmXG4gICAqIHRoZSBjYWxsYmFjayByZXR1cm5zIGEgcHJvbWlzZSwgdGhlIGl0ZXJhdGlvbiB3aWxsIG5vdCBjb250aW51ZSB1bnRpbFxuICAgKiB0aGF0IHByb21pc2UgaGFzIGJlZW4gZnVsZmlsbGVkLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBhIHJlamVjdGVkXG4gICAqIHByb21pc2UsIHRoZW4gaXRlcmF0aW9uIHdpbGwgc3RvcCB3aXRoIHRoYXQgZXJyb3IuIFRoZSBpdGVtcyBhcmVcbiAgICogcHJvY2Vzc2VkIGluIGFuIHVuc3BlY2lmaWVkIG9yZGVyLiBUaGUgcXVlcnkgbWF5IG5vdCBoYXZlIGFueSBzb3J0IG9yZGVyLFxuICAgKiBhbmQgbWF5IG5vdCB1c2UgbGltaXQgb3Igc2tpcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgPHVsPlxuICAgKiAgIDxsaT5jdXJyZW50T2JqZWN0OiBUaGUgY3VycmVudCBQYXJzZS5PYmplY3QgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZSBhcnJheS48L2xpPlxuICAgKiAgIDxsaT5pbmRleDogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IFBhcnNlLk9iamVjdCBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIGFycmF5LjwvbGk+XG4gICAqICAgPGxpPnF1ZXJ5OiBUaGUgcXVlcnkgZmlsdGVyIHdhcyBjYWxsZWQgdXBvbi48L2xpPlxuICAgKiA8L3VsPlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zIGFyZTo8dWw+XG4gICAqICAgPGxpPnVzZU1hc3RlcktleTogSW4gQ2xvdWQgQ29kZSBhbmQgTm9kZSBvbmx5LCBjYXVzZXMgdGhlIE1hc3RlciBLZXkgdG9cbiAgICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICogICA8bGk+c2Vzc2lvblRva2VuOiBBIHZhbGlkIHNlc3Npb24gdG9rZW4sIHVzZWQgZm9yIG1ha2luZyBhIHJlcXVlc3Qgb25cbiAgICogICAgICAgYmVoYWxmIG9mIGEgc3BlY2lmaWMgdXNlci5cbiAgICogPC91bD5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIG9uY2UgdGhlXG4gICAqICAgICBpdGVyYXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIGFzeW5jIGZpbHRlcihjYWxsYmFjaywgb3B0aW9ucykge1xuICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBhd2FpdCB0aGlzLmVhY2gob2JqZWN0ID0+IHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY2FsbGJhY2sob2JqZWN0LCBpbmRleCwgdGhpcykpLnRoZW4oZmxhZyA9PiB7XG4gICAgICAgIGlmIChmbGFnKSB7XG4gICAgICAgICAgYXJyYXkucHVzaChvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9KTtcbiAgICB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKiBRdWVyeSBDb25kaXRpb25zICovXG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBlcXVhbCB0byB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHRoZSBQYXJzZS5PYmplY3QgbXVzdCBjb250YWluLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGVxdWFsVG8oa2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgJiYgdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBfY29udGV4dDQ7XG4gICAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoX2NvbnRleHQ0ID0gKDAsIF9lbnRyaWVzLmRlZmF1bHQpKGtleSkpLmNhbGwoX2NvbnRleHQ0LCBfcmVmID0+IHtcbiAgICAgICAgbGV0IFtrLCB2YWxdID0gX3JlZjtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxUbyhrLCB2YWwpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvZXNOb3RFeGlzdChrZXkpO1xuICAgIH1cbiAgICB0aGlzLl93aGVyZVtrZXldID0gKDAsIF9lbmNvZGUuZGVmYXVsdCkodmFsdWUsIGZhbHNlLCB0cnVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgbm90IGVxdWFsIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgbXVzdCBub3QgYmUgZXF1YWxsZWQuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbm90RXF1YWxUbyhrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSAmJiB0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIF9jb250ZXh0NTtcbiAgICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShfY29udGV4dDUgPSAoMCwgX2VudHJpZXMuZGVmYXVsdCkoa2V5KSkuY2FsbChfY29udGV4dDUsIF9yZWYyID0+IHtcbiAgICAgICAgbGV0IFtrLCB2YWxdID0gX3JlZjI7XG4gICAgICAgIHJldHVybiB0aGlzLm5vdEVxdWFsVG8oaywgdmFsKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJG5lJywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBiZSBsZXNzIHRoYW4gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdGhhdCBwcm92aWRlcyBhbiB1cHBlciBib3VuZC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBsZXNzVGhhbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckbHQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGdyZWF0ZXIgdGhhbiB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHByb3ZpZGVzIGFuIGxvd2VyIGJvdW5kLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGdyZWF0ZXJUaGFuKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRndCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgcHJvdmlkZXMgYW4gdXBwZXIgYm91bmQuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbGVzc1RoYW5PckVxdWFsVG8oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGx0ZScsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0aGF0IHByb3ZpZGVzIGFuIGxvd2VyIGJvdW5kLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGdyZWF0ZXJUaGFuT3JFcXVhbFRvKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRndGUnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzIHZhbHVlIHRvXG4gICAqIGJlIGNvbnRhaW5lZCBpbiB0aGUgcHJvdmlkZWQgbGlzdCBvZiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICogQHBhcmFtIHtBcnJheTwqPn0gdmFsdWUgVGhlIHZhbHVlcyB0aGF0IHdpbGwgbWF0Y2guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgY29udGFpbmVkSW4oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGluJywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXkncyB2YWx1ZSB0b1xuICAgKiBub3QgYmUgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZCBsaXN0IG9mIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0ge0FycmF5PCo+fSB2YWx1ZSBUaGUgdmFsdWVzIHRoYXQgd2lsbCBub3QgbWF0Y2guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbm90Q29udGFpbmVkSW4oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJG5pbicsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogYmUgY29udGFpbmVkIGJ5IHRoZSBwcm92aWRlZCBsaXN0IG9mIHZhbHVlcy4gR2V0IG9iamVjdHMgd2hlcmUgYWxsIGFycmF5IGVsZW1lbnRzIG1hdGNoLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRoYXQgd2lsbCBtYXRjaC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjb250YWluZWRCeShrZXksIHZhbHVlcykge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGNvbnRhaW5lZEJ5JywgdmFsdWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogY29udGFpbiBlYWNoIG9uZSBvZiB0aGUgcHJvdmlkZWQgbGlzdCBvZiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay4gIFRoaXMga2V5J3MgdmFsdWUgbXVzdCBiZSBhbiBhcnJheS5cbiAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdGhhdCB3aWxsIG1hdGNoLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNvbnRhaW5zQWxsKGtleSwgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckYWxsJywgdmFsdWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3MgdmFsdWUgdG9cbiAgICogY29udGFpbiBlYWNoIG9uZSBvZiB0aGUgcHJvdmlkZWQgbGlzdCBvZiB2YWx1ZXMgc3RhcnRpbmcgd2l0aCBnaXZlbiBzdHJpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suICBUaGlzIGtleSdzIHZhbHVlIG11c3QgYmUgYW4gYXJyYXkuXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdmFsdWVzIFRoZSBzdHJpbmcgdmFsdWVzIHRoYXQgd2lsbCBtYXRjaCBhcyBzdGFydGluZyBzdHJpbmcuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgY29udGFpbnNBbGxTdGFydGluZ1dpdGgoa2V5LCB2YWx1ZXMpIHtcbiAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZXMpKSB7XG4gICAgICB2YWx1ZXMgPSBbdmFsdWVzXTtcbiAgICB9XG4gICAgY29uc3QgcmVnZXhPYmplY3QgPSAoMCwgX21hcC5kZWZhdWx0KSh2YWx1ZXMpLmNhbGwodmFsdWVzLCB2YWx1ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAkcmVnZXg6IHRoaXMuX3JlZ2V4U3RhcnRXaXRoKHZhbHVlKVxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluc0FsbChrZXksIHJlZ2V4T2JqZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29uc3RyYWludCBmb3IgZmluZGluZyBvYmplY3RzIHRoYXQgY29udGFpbiB0aGUgZ2l2ZW4ga2V5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCBzaG91bGQgZXhpc3QuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZXhpc3RzKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGV4aXN0cycsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IGZvciBmaW5kaW5nIG9iamVjdHMgdGhhdCBkbyBub3QgY29udGFpbiBhIGdpdmVuIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgc2hvdWxkIG5vdCBleGlzdFxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGRvZXNOb3RFeGlzdChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRleGlzdHMnLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb25zdHJhaW50IGZvciBmaW5kaW5nIHN0cmluZyB2YWx1ZXMgdGhhdCBtYXRjaFxuICAgKiB0aGUgcHJvdmlkZWQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKiBUaGlzIG1heSBiZSBzbG93IGZvciBsYXJnZSBkYXRhc2V0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIHN0cmluZyB0byBtYXRjaCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7UmVnRXhwIHwgc3RyaW5nfSByZWdleCBUaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2guXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RpZmllcnMgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtb2RlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIG1hdGNoZXMoa2V5LCByZWdleCwgbW9kaWZpZXJzKSB7XG4gICAgdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRyZWdleCcsIHJlZ2V4KTtcbiAgICBpZiAoIW1vZGlmaWVycykge1xuICAgICAgbW9kaWZpZXJzID0gJyc7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVnZXggIT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAocmVnZXguaWdub3JlQ2FzZSkge1xuICAgICAgICBtb2RpZmllcnMgKz0gJ2knO1xuICAgICAgfVxuICAgICAgaWYgKHJlZ2V4Lm11bHRpbGluZSkge1xuICAgICAgICBtb2RpZmllcnMgKz0gJ20nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobW9kaWZpZXJzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRvcHRpb25zJywgbW9kaWZpZXJzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdGhhdCByZXF1aXJlcyB0aGF0IGEga2V5J3MgdmFsdWUgbWF0Y2hlcyBhIFBhcnNlLlF1ZXJ5XG4gICAqIGNvbnN0cmFpbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBjb250YWlucyB0aGUgb2JqZWN0IHRvIG1hdGNoIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge1BhcnNlLlF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgdGhhdCBzaG91bGQgbWF0Y2guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbWF0Y2hlc1F1ZXJ5KGtleSwgcXVlcnkpIHtcbiAgICBjb25zdCBxdWVyeUpTT04gPSBxdWVyeS50b0pTT04oKTtcbiAgICBxdWVyeUpTT04uY2xhc3NOYW1lID0gcXVlcnkuY2xhc3NOYW1lO1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGluUXVlcnknLCBxdWVyeUpTT04pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRoYXQgcmVxdWlyZXMgdGhhdCBhIGtleSdzIHZhbHVlIG5vdCBtYXRjaGVzIGFcbiAgICogUGFyc2UuUXVlcnkgY29uc3RyYWludC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIGNvbnRhaW5zIHRoZSBvYmplY3QgdG8gbWF0Y2ggdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICAgcXVlcnkuXG4gICAqIEBwYXJhbSB7UGFyc2UuUXVlcnl9IHF1ZXJ5IFRoZSBxdWVyeSB0aGF0IHNob3VsZCBub3QgbWF0Y2guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZG9lc05vdE1hdGNoUXVlcnkoa2V5LCBxdWVyeSkge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9IHF1ZXJ5LnRvSlNPTigpO1xuICAgIHF1ZXJ5SlNPTi5jbGFzc05hbWUgPSBxdWVyeS5jbGFzc05hbWU7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckbm90SW5RdWVyeScsIHF1ZXJ5SlNPTik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdGhhdCByZXF1aXJlcyB0aGF0IGEga2V5J3MgdmFsdWUgbWF0Y2hlcyBhIHZhbHVlIGluXG4gICAqIGFuIG9iamVjdCByZXR1cm5lZCBieSBhIGRpZmZlcmVudCBQYXJzZS5RdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIHRoYXQgaXMgYmVpbmdcbiAgICogICAgICAgICAgICAgICAgICAgICBtYXRjaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlLZXkgVGhlIGtleSBpbiB0aGUgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUgcXVlcnkgdG9cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSB7UGFyc2UuUXVlcnl9IHF1ZXJ5IFRoZSBxdWVyeSB0byBydW4uXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgbWF0Y2hlc0tleUluUXVlcnkoa2V5LCBxdWVyeUtleSwgcXVlcnkpIHtcbiAgICBjb25zdCBxdWVyeUpTT04gPSBxdWVyeS50b0pTT04oKTtcbiAgICBxdWVyeUpTT04uY2xhc3NOYW1lID0gcXVlcnkuY2xhc3NOYW1lO1xuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJHNlbGVjdCcsIHtcbiAgICAgIGtleTogcXVlcnlLZXksXG4gICAgICBxdWVyeTogcXVlcnlKU09OXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdGhhdCByZXF1aXJlcyB0aGF0IGEga2V5J3MgdmFsdWUgbm90IG1hdGNoIGEgdmFsdWUgaW5cbiAgICogYW4gb2JqZWN0IHJldHVybmVkIGJ5IGEgZGlmZmVyZW50IFBhcnNlLlF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCBjb250YWlucyB0aGUgdmFsdWUgdGhhdCBpcyBiZWluZ1xuICAgKiAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlLZXkgVGhlIGtleSBpbiB0aGUgb2JqZWN0cyByZXR1cm5lZCBieSB0aGUgcXVlcnkgdG9cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIGFnYWluc3QuXG4gICAqIEBwYXJhbSB7UGFyc2UuUXVlcnl9IHF1ZXJ5IFRoZSBxdWVyeSB0byBydW4uXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZG9lc05vdE1hdGNoS2V5SW5RdWVyeShrZXksIHF1ZXJ5S2V5LCBxdWVyeSkge1xuICAgIGNvbnN0IHF1ZXJ5SlNPTiA9IHF1ZXJ5LnRvSlNPTigpO1xuICAgIHF1ZXJ5SlNPTi5jbGFzc05hbWUgPSBxdWVyeS5jbGFzc05hbWU7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZG9udFNlbGVjdCcsIHtcbiAgICAgIGtleTogcXVlcnlLZXksXG4gICAgICBxdWVyeTogcXVlcnlKU09OXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgc3RyaW5nIHZhbHVlcyB0aGF0IGNvbnRhaW4gYSBwcm92aWRlZFxuICAgKiBzdHJpbmcuICBUaGlzIG1heSBiZSBzbG93IGZvciBsYXJnZSBkYXRhc2V0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIHN0cmluZyB0byBtYXRjaCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWJzdHJpbmcgVGhlIHN1YnN0cmluZyB0aGF0IHRoZSB2YWx1ZSBtdXN0IGNvbnRhaW4uXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgY29udGFpbnMoa2V5LCBzdWJzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHN1YnN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHZhbHVlIGJlaW5nIHNlYXJjaGVkIGZvciBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRyZWdleCcsIHF1b3RlKHN1YnN0cmluZykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IGZvciBmaW5kaW5nIHN0cmluZyB2YWx1ZXMgdGhhdCBjb250YWluIGEgcHJvdmlkZWRcbiAgICogc3RyaW5nLiBUaGlzIG1heSBiZSBzbG93IGZvciBsYXJnZSBkYXRhc2V0cy4gUmVxdWlyZXMgUGFyc2UtU2VydmVyID4gMi41LjBcbiAgICpcbiAgICogSW4gb3JkZXIgdG8gc29ydCB5b3UgbXVzdCB1c2Ugc2VsZWN0IGFuZCBhc2NlbmRpbmcgKCRzY29yZSBpcyByZXF1aXJlZClcbiAgICogIDxwcmU+XG4gICAqICAgcXVlcnkuZnVsbFRleHQoJ2ZpZWxkJywgJ3Rlcm0nKTtcbiAgICogICBxdWVyeS5hc2NlbmRpbmcoJyRzY29yZScpO1xuICAgKiAgIHF1ZXJ5LnNlbGVjdCgnJHNjb3JlJyk7XG4gICAqICA8L3ByZT5cbiAgICpcbiAgICogVG8gcmV0cmlldmUgdGhlIHdlaWdodCAvIHJhbmtcbiAgICogIDxwcmU+XG4gICAqICAgb2JqZWN0LT5nZXQoJ3Njb3JlJyk7XG4gICAqICA8L3ByZT5cbiAgICpcbiAgICogWW91IGNhbiBkZWZpbmUgb3B0aW9uYWxzIGJ5IHByb3ZpZGluZyBhbiBvYmplY3QgYXMgYSB0aGlyZCBwYXJhbWV0ZXJcbiAgICogIDxwcmU+XG4gICAqICAgcXVlcnkuZnVsbFRleHQoJ2ZpZWxkJywgJ3Rlcm0nLCB7IGxhbmd1YWdlOiAnZXMnLCBkaWFjcml0aWNTZW5zaXRpdmU6IHRydWUgfSk7XG4gICAqICA8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIHN0cmluZyB0byBtYXRjaCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUaGUgc3RyaW5nIHRvIHNlYXJjaFxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAoT3B0aW9uYWwpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmxhbmd1YWdlIFRoZSBsYW5ndWFnZSB0aGF0IGRldGVybWluZXMgdGhlIGxpc3Qgb2Ygc3RvcCB3b3JkcyBmb3IgdGhlIHNlYXJjaCBhbmQgdGhlIHJ1bGVzIGZvciB0aGUgc3RlbW1lciBhbmQgdG9rZW5pemVyLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuY2FzZVNlbnNpdGl2ZSBBIGJvb2xlYW4gZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBjYXNlIHNlbnNpdGl2ZSBzZWFyY2guXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5kaWFjcml0aWNTZW5zaXRpdmUgQSBib29sZWFuIGZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGlhY3JpdGljIHNlbnNpdGl2ZSBzZWFyY2guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZnVsbFRleHQoa2V5LCB2YWx1ZSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIWtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGtleSBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHNlYXJjaCB0ZXJtIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB2YWx1ZSBiZWluZyBzZWFyY2hlZCBmb3IgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgY29uc3QgZnVsbE9wdGlvbnMgPSB7fTtcbiAgICBmdWxsT3B0aW9ucy4kdGVybSA9IHZhbHVlO1xuICAgIGZvciAoY29uc3Qgb3B0aW9uIGluIG9wdGlvbnMpIHtcbiAgICAgIHN3aXRjaCAob3B0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2xhbmd1YWdlJzpcbiAgICAgICAgICBmdWxsT3B0aW9ucy4kbGFuZ3VhZ2UgPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Nhc2VTZW5zaXRpdmUnOlxuICAgICAgICAgIGZ1bGxPcHRpb25zLiRjYXNlU2Vuc2l0aXZlID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkaWFjcml0aWNTZW5zaXRpdmUnOlxuICAgICAgICAgIGZ1bGxPcHRpb25zLiRkaWFjcml0aWNTZW5zaXRpdmUgPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9wdGlvbjogJHtvcHRpb259YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJHRleHQnLCB7XG4gICAgICAkc2VhcmNoOiBmdWxsT3B0aW9uc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBzb3J0IHRoZSBmdWxsIHRleHQgc2VhcmNoIGJ5IHRleHQgc2NvcmVcbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBzb3J0QnlUZXh0U2NvcmUoKSB7XG4gICAgdGhpcy5hc2NlbmRpbmcoJyRzY29yZScpO1xuICAgIHRoaXMuc2VsZWN0KFsnJHNjb3JlJ10pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IGZvciBmaW5kaW5nIHN0cmluZyB2YWx1ZXMgdGhhdCBzdGFydCB3aXRoIGEgcHJvdmlkZWRcbiAgICogc3RyaW5nLiAgVGhpcyBxdWVyeSB3aWxsIHVzZSB0aGUgYmFja2VuZCBpbmRleCwgc28gaXQgd2lsbCBiZSBmYXN0IGV2ZW5cbiAgICogZm9yIGxhcmdlIGRhdGFzZXRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgc3RyaW5nIHRvIG1hdGNoIGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeCBUaGUgc3Vic3RyaW5nIHRoYXQgdGhlIHZhbHVlIG11c3Qgc3RhcnQgd2l0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGlmaWVycyBUaGUgcmVndWxhciBleHByZXNzaW9uIG1vZGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgc3RhcnRzV2l0aChrZXksIHByZWZpeCwgbW9kaWZpZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBwcmVmaXggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB2YWx1ZSBiZWluZyBzZWFyY2hlZCBmb3IgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhrZXksIHRoaXMuX3JlZ2V4U3RhcnRXaXRoKHByZWZpeCksIG1vZGlmaWVycyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgc3RyaW5nIHZhbHVlcyB0aGF0IGVuZCB3aXRoIGEgcHJvdmlkZWRcbiAgICogc3RyaW5nLiAgVGhpcyB3aWxsIGJlIHNsb3cgZm9yIGxhcmdlIGRhdGFzZXRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgc3RyaW5nIHRvIG1hdGNoIGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeCBUaGUgc3Vic3RyaW5nIHRoYXQgdGhlIHZhbHVlIG11c3QgZW5kIHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RpZmllcnMgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtb2RlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGVuZHNXaXRoKGtleSwgc3VmZml4LCBtb2RpZmllcnMpIHtcbiAgICBpZiAodHlwZW9mIHN1ZmZpeCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHZhbHVlIGJlaW5nIHNlYXJjaGVkIGZvciBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKGtleSwgcXVvdGUoc3VmZml4KSArICckJywgbW9kaWZpZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcHJveGltaXR5IGJhc2VkIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgb2JqZWN0cyB3aXRoIGtleSBwb2ludFxuICAgKiB2YWx1ZXMgbmVhciB0aGUgcG9pbnQgZ2l2ZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBQYXJzZS5HZW9Qb2ludCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50IFRoZSByZWZlcmVuY2UgUGFyc2UuR2VvUG9pbnQgdGhhdCBpcyB1c2VkLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIG5lYXIoa2V5LCBwb2ludCkge1xuICAgIGlmICghKHBvaW50IGluc3RhbmNlb2YgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdCkpIHtcbiAgICAgIC8vIFRyeSB0byBjYXN0IGl0IGFzIGEgR2VvUG9pbnRcbiAgICAgIHBvaW50ID0gbmV3IF9QYXJzZUdlb1BvaW50LmRlZmF1bHQocG9pbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRuZWFyU3BoZXJlJywgcG9pbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwcm94aW1pdHkgYmFzZWQgY29uc3RyYWludCBmb3IgZmluZGluZyBvYmplY3RzIHdpdGgga2V5IHBvaW50XG4gICAqIHZhbHVlcyBuZWFyIHRoZSBwb2ludCBnaXZlbiBhbmQgd2l0aGluIHRoZSBtYXhpbXVtIGRpc3RhbmNlIGdpdmVuLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdGhhdCB0aGUgUGFyc2UuR2VvUG9pbnQgaXMgc3RvcmVkIGluLlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludCBUaGUgcmVmZXJlbmNlIFBhcnNlLkdlb1BvaW50IHRoYXQgaXMgdXNlZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1heERpc3RhbmNlIE1heGltdW0gZGlzdGFuY2UgKGluIHJhZGlhbnMpIG9mIHJlc3VsdHMgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNvcnRlZCBBIEJvb2wgdmFsdWUgdGhhdCBpcyB0cnVlIGlmIHJlc3VsdHMgc2hvdWxkIGJlXG4gICAqIHNvcnRlZCBieSBkaXN0YW5jZSBhc2NlbmRpbmcsIGZhbHNlIGlzIG5vIHNvcnRpbmcgaXMgcmVxdWlyZWQsXG4gICAqIGRlZmF1bHRzIHRvIHRydWUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aGluUmFkaWFucyhrZXksIHBvaW50LCBtYXhEaXN0YW5jZSwgc29ydGVkKSB7XG4gICAgaWYgKHNvcnRlZCB8fCBzb3J0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5uZWFyKGtleSwgcG9pbnQpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckbWF4RGlzdGFuY2UnLCBtYXhEaXN0YW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9hZGRDb25kaXRpb24oa2V5LCAnJGdlb1dpdGhpbicsIHtcbiAgICAgICAgJGNlbnRlclNwaGVyZTogW1twb2ludC5sb25naXR1ZGUsIHBvaW50LmxhdGl0dWRlXSwgbWF4RGlzdGFuY2VdXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHByb3hpbWl0eSBiYXNlZCBjb25zdHJhaW50IGZvciBmaW5kaW5nIG9iamVjdHMgd2l0aCBrZXkgcG9pbnRcbiAgICogdmFsdWVzIG5lYXIgdGhlIHBvaW50IGdpdmVuIGFuZCB3aXRoaW4gdGhlIG1heGltdW0gZGlzdGFuY2UgZ2l2ZW4uXG4gICAqIFJhZGl1cyBvZiBlYXJ0aCB1c2VkIGlzIDM5NTguOCBtaWxlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRoYXQgdGhlIFBhcnNlLkdlb1BvaW50IGlzIHN0b3JlZCBpbi5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gcG9pbnQgVGhlIHJlZmVyZW5jZSBQYXJzZS5HZW9Qb2ludCB0aGF0IGlzIHVzZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhEaXN0YW5jZSBNYXhpbXVtIGRpc3RhbmNlIChpbiBtaWxlcykgb2YgcmVzdWx0cyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc29ydGVkIEEgQm9vbCB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgcmVzdWx0cyBzaG91bGQgYmVcbiAgICogc29ydGVkIGJ5IGRpc3RhbmNlIGFzY2VuZGluZywgZmFsc2UgaXMgbm8gc29ydGluZyBpcyByZXF1aXJlZCxcbiAgICogZGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3aXRoaW5NaWxlcyhrZXksIHBvaW50LCBtYXhEaXN0YW5jZSwgc29ydGVkKSB7XG4gICAgcmV0dXJuIHRoaXMud2l0aGluUmFkaWFucyhrZXksIHBvaW50LCBtYXhEaXN0YW5jZSAvIDM5NTguOCwgc29ydGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcHJveGltaXR5IGJhc2VkIGNvbnN0cmFpbnQgZm9yIGZpbmRpbmcgb2JqZWN0cyB3aXRoIGtleSBwb2ludFxuICAgKiB2YWx1ZXMgbmVhciB0aGUgcG9pbnQgZ2l2ZW4gYW5kIHdpdGhpbiB0aGUgbWF4aW11bSBkaXN0YW5jZSBnaXZlbi5cbiAgICogUmFkaXVzIG9mIGVhcnRoIHVzZWQgaXMgNjM3MS4wIGtpbG9tZXRlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0aGF0IHRoZSBQYXJzZS5HZW9Qb2ludCBpcyBzdG9yZWQgaW4uXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IHBvaW50IFRoZSByZWZlcmVuY2UgUGFyc2UuR2VvUG9pbnQgdGhhdCBpcyB1c2VkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4RGlzdGFuY2UgTWF4aW11bSBkaXN0YW5jZSAoaW4ga2lsb21ldGVycykgb2YgcmVzdWx0cyB0byByZXR1cm4uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc29ydGVkIEEgQm9vbCB2YWx1ZSB0aGF0IGlzIHRydWUgaWYgcmVzdWx0cyBzaG91bGQgYmVcbiAgICogc29ydGVkIGJ5IGRpc3RhbmNlIGFzY2VuZGluZywgZmFsc2UgaXMgbm8gc29ydGluZyBpcyByZXF1aXJlZCxcbiAgICogZGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3aXRoaW5LaWxvbWV0ZXJzKGtleSwgcG9pbnQsIG1heERpc3RhbmNlLCBzb3J0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy53aXRoaW5SYWRpYW5zKGtleSwgcG9pbnQsIG1heERpc3RhbmNlIC8gNjM3MS4wLCBzb3J0ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb25zdHJhaW50IHRvIHRoZSBxdWVyeSB0aGF0IHJlcXVpcmVzIGEgcGFydGljdWxhciBrZXknc1xuICAgKiBjb29yZGluYXRlcyBiZSBjb250YWluZWQgd2l0aGluIGEgZ2l2ZW4gcmVjdGFuZ3VsYXIgZ2VvZ3JhcGhpYyBib3VuZGluZ1xuICAgKiBib3guXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBiZSBjb25zdHJhaW5lZC5cbiAgICogQHBhcmFtIHtQYXJzZS5HZW9Qb2ludH0gc291dGh3ZXN0XG4gICAqICAgICBUaGUgbG93ZXItbGVmdCBpbmNsdXNpdmUgY29ybmVyIG9mIHRoZSBib3guXG4gICAqIEBwYXJhbSB7UGFyc2UuR2VvUG9pbnR9IG5vcnRoZWFzdFxuICAgKiAgICAgVGhlIHVwcGVyLXJpZ2h0IGluY2x1c2l2ZSBjb3JuZXIgb2YgdGhlIGJveC5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICB3aXRoaW5HZW9Cb3goa2V5LCBzb3V0aHdlc3QsIG5vcnRoZWFzdCkge1xuICAgIGlmICghKHNvdXRod2VzdCBpbnN0YW5jZW9mIF9QYXJzZUdlb1BvaW50LmRlZmF1bHQpKSB7XG4gICAgICBzb3V0aHdlc3QgPSBuZXcgX1BhcnNlR2VvUG9pbnQuZGVmYXVsdChzb3V0aHdlc3QpO1xuICAgIH1cbiAgICBpZiAoIShub3J0aGVhc3QgaW5zdGFuY2VvZiBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0KSkge1xuICAgICAgbm9ydGhlYXN0ID0gbmV3IF9QYXJzZUdlb1BvaW50LmRlZmF1bHQobm9ydGhlYXN0KTtcbiAgICB9XG4gICAgdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyR3aXRoaW4nLCB7XG4gICAgICAkYm94OiBbc291dGh3ZXN0LCBub3J0aGVhc3RdXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXJ5IHRoYXQgcmVxdWlyZXMgYSBwYXJ0aWN1bGFyIGtleSdzXG4gICAqIGNvb3JkaW5hdGVzIGJlIGNvbnRhaW5lZCB3aXRoaW4gYW5kIG9uIHRoZSBib3VuZHMgb2YgYSBnaXZlbiBwb2x5Z29uLlxuICAgKiBTdXBwb3J0cyBjbG9zZWQgYW5kIG9wZW4gKGxhc3QgcG9pbnQgaXMgY29ubmVjdGVkIHRvIGZpcnN0KSBwYXRoc1xuICAgKlxuICAgKiBQb2x5Z29uIG11c3QgaGF2ZSBhdCBsZWFzdCAzIHBvaW50c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gYmUgY29uc3RyYWluZWQuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHBvaW50cyBBcnJheSBvZiBDb29yZGluYXRlcyAvIEdlb1BvaW50c1xuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHdpdGhpblBvbHlnb24oa2V5LCBwb2ludHMpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ29uZGl0aW9uKGtleSwgJyRnZW9XaXRoaW4nLCB7XG4gICAgICAkcG9seWdvbjogcG9pbnRzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29uc3RyYWludCB0byB0aGUgcXVlcnkgdGhhdCByZXF1aXJlcyBhIHBhcnRpY3VsYXIga2V5J3NcbiAgICogY29vcmRpbmF0ZXMgdGhhdCBjb250YWlucyBhIFBhcnNlR2VvUG9pbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGJlIGNvbnN0cmFpbmVkLlxuICAgKiBAcGFyYW0ge1BhcnNlLkdlb1BvaW50fSBwb2ludFxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHBvbHlnb25Db250YWlucyhrZXksIHBvaW50KSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENvbmRpdGlvbihrZXksICckZ2VvSW50ZXJzZWN0cycsIHtcbiAgICAgICRwb2ludDogcG9pbnRcbiAgICB9KTtcbiAgfVxuXG4gIC8qIFF1ZXJ5IE9yZGVyaW5ncyAqL1xuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgcmVzdWx0cyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGdpdmVuIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0ga2V5cyBUaGUga2V5IHRvIG9yZGVyIGJ5LCB3aGljaCBpcyBhXG4gICAqIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzLCBvciBhbiBBcnJheSBvZiBrZXlzLCBvciBtdWx0aXBsZSBrZXlzLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFzY2VuZGluZygpIHtcbiAgICB0aGlzLl9vcmRlciA9IFtdO1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAga2V5c1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWRkQXNjZW5kaW5nLmFwcGx5KHRoaXMsIGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSByZXN1bHRzIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgZ2l2ZW4ga2V5LFxuICAgKiBidXQgY2FuIGFsc28gYWRkIHNlY29uZGFyeSBzb3J0IGRlc2NyaXB0b3JzIHdpdGhvdXQgb3ZlcndyaXRpbmcgX29yZGVyLlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBrZXlzIFRoZSBrZXkgdG8gb3JkZXIgYnksIHdoaWNoIGlzIGFcbiAgICogc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMsIG9yIGFuIEFycmF5IG9mIGtleXMsIG9yIG11bHRpcGxlIGtleXMuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkQXNjZW5kaW5nKCkge1xuICAgIGlmICghdGhpcy5fb3JkZXIpIHtcbiAgICAgIHRoaXMuX29yZGVyID0gW107XG4gICAgfVxuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAga2V5c1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkgPT4ge1xuICAgICAgdmFyIF9jb250ZXh0NjtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICBrZXkgPSBrZXkuam9pbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5fb3JkZXIgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDYgPSB0aGlzLl9vcmRlcikuY2FsbChfY29udGV4dDYsIGtleS5yZXBsYWNlKC9cXHMvZywgJycpLnNwbGl0KCcsJykpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGdpdmVuIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfHN0cmluZ1tdKX0ga2V5cyBUaGUga2V5IHRvIG9yZGVyIGJ5LCB3aGljaCBpcyBhXG4gICAqIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzLCBvciBhbiBBcnJheSBvZiBrZXlzLCBvciBtdWx0aXBsZSBrZXlzLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGRlc2NlbmRpbmcoKSB7XG4gICAgdGhpcy5fb3JkZXIgPSBbXTtcbiAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgIGtleXNbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWRkRGVzY2VuZGluZy5hcHBseSh0aGlzLCBrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgcmVzdWx0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBnaXZlbiBrZXksXG4gICAqIGJ1dCBjYW4gYWxzbyBhZGQgc2Vjb25kYXJ5IHNvcnQgZGVzY3JpcHRvcnMgd2l0aG91dCBvdmVyd3JpdGluZyBfb3JkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xzdHJpbmdbXSl9IGtleXMgVGhlIGtleSB0byBvcmRlciBieSwgd2hpY2ggaXMgYVxuICAgKiBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcywgb3IgYW4gQXJyYXkgb2Yga2V5cywgb3IgbXVsdGlwbGUga2V5cy5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGREZXNjZW5kaW5nKCkge1xuICAgIGlmICghdGhpcy5fb3JkZXIpIHtcbiAgICAgIHRoaXMuX29yZGVyID0gW107XG4gICAgfVxuICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgICAga2V5c1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuICAgIH1cbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkgPT4ge1xuICAgICAgdmFyIF9jb250ZXh0NywgX2NvbnRleHQ4O1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgIGtleSA9IGtleS5qb2luKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9vcmRlciA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKF9jb250ZXh0NyA9IHRoaXMuX29yZGVyKS5jYWxsKF9jb250ZXh0NywgKDAsIF9tYXAuZGVmYXVsdCkoX2NvbnRleHQ4ID0ga2V5LnJlcGxhY2UoL1xccy9nLCAnJykuc3BsaXQoJywnKSkuY2FsbChfY29udGV4dDgsIGsgPT4ge1xuICAgICAgICByZXR1cm4gJy0nICsgaztcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qIFF1ZXJ5IE9wdGlvbnMgKi9cblxuICAvKipcbiAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHJlc3VsdHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIGFueSByZXN1bHRzLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGFnaW5hdGlvbi5cbiAgICogRGVmYXVsdCBpcyB0byBza2lwIHplcm8gcmVzdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gdGhlIG51bWJlciBvZiByZXN1bHRzIHRvIHNraXAuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgc2tpcChuKSB7XG4gICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2FuIG9ubHkgc2tpcCBieSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICAgIH1cbiAgICB0aGlzLl9za2lwID0gbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBsaW1pdCBvZiB0aGUgbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuLiBUaGUgZGVmYXVsdCBsaW1pdCBpcyAxMDAuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIHRoZSBudW1iZXIgb2YgcmVzdWx0cyB0byBsaW1pdCB0by5cbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBsaW1pdChuKSB7XG4gICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2FuIG9ubHkgc2V0IHRoZSBsaW1pdCB0byBhIG51bWVyaWMgdmFsdWUnKTtcbiAgICB9XG4gICAgdGhpcy5fbGltaXQgPSBuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZsYWcgdG8gaW5jbHVkZSB3aXRoIHJlc3BvbnNlIHRoZSB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0cyBzYXRpc2Z5aW5nIHRoaXMgcXVlcnksXG4gICAqIGRlc3BpdGUgbGltaXRzL3NraXAuIE1pZ2h0IGJlIHVzZWZ1bCBmb3IgcGFnaW5hdGlvbi5cbiAgICogTm90ZSB0aGF0IHJlc3VsdCBvZiB0aGlzIHF1ZXJ5IHdpbGwgYmUgd3JhcHBlZCBhcyBhbiBvYmplY3Qgd2l0aFxuICAgKiBgcmVzdWx0c2A6IGhvbGRpbmcge1BhcnNlT2JqZWN0fSBhcnJheSBhbmQgYGNvdW50YDogaW50ZWdlciBob2xkaW5nIHRvdGFsIG51bWJlclxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVDb3VudCBmYWxzZSAtIGRpc2FibGUsIHRydWUgLSBlbmFibGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2l0aENvdW50KCkge1xuICAgIGxldCBpbmNsdWRlQ291bnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gICAgaWYgKHR5cGVvZiBpbmNsdWRlQ291bnQgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgY2FuIG9ubHkgc2V0IHdpdGhDb3VudCB0byBhIGJvb2xlYW4gdmFsdWUnKTtcbiAgICB9XG4gICAgdGhpcy5fY291bnQgPSBpbmNsdWRlQ291bnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEluY2x1ZGVzIG5lc3RlZCBQYXJzZS5PYmplY3RzIGZvciB0aGUgcHJvdmlkZWQga2V5LiAgWW91IGNhbiB1c2UgZG90XG4gICAqIG5vdGF0aW9uIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGluIHRoZSBpbmNsdWRlZCBvYmplY3QgYXJlIGFsc28gZmV0Y2hlZC5cbiAgICpcbiAgICogWW91IGNhbiBpbmNsdWRlIGFsbCBuZXN0ZWQgUGFyc2UuT2JqZWN0cyBieSBwYXNzaW5nIGluICcqJy5cbiAgICogUmVxdWlyZXMgUGFyc2UgU2VydmVyIDMuMC4wK1xuICAgKiA8cHJlPnF1ZXJ5LmluY2x1ZGUoJyonKTs8L3ByZT5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5zdHJpbmd8QXJyYXk8c3RyaW5nPn0ga2V5cyBUaGUgbmFtZShzKSBvZiB0aGUga2V5KHMpIHRvIGluY2x1ZGUuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgaW5jbHVkZSgpIHtcbiAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjUpLCBfa2V5NSA9IDA7IF9rZXk1IDwgX2xlbjU7IF9rZXk1KyspIHtcbiAgICAgIGtleXNbX2tleTVdID0gYXJndW1lbnRzW19rZXk1XTtcbiAgICB9XG4gICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKGtleXMpLmNhbGwoa2V5cywga2V5ID0+IHtcbiAgICAgIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkoa2V5KSkge1xuICAgICAgICB2YXIgX2NvbnRleHQ5O1xuICAgICAgICB0aGlzLl9pbmNsdWRlID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQ5ID0gdGhpcy5faW5jbHVkZSkuY2FsbChfY29udGV4dDksIGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbmNsdWRlLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNsdWRlcyBhbGwgbmVzdGVkIFBhcnNlLk9iamVjdHMgb25lIGxldmVsIGRlZXAuXG4gICAqXG4gICAqIFJlcXVpcmVzIFBhcnNlIFNlcnZlciAzLjAuMCtcbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBpbmNsdWRlQWxsKCkge1xuICAgIHJldHVybiB0aGlzLmluY2x1ZGUoJyonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0cmljdHMgdGhlIGZpZWxkcyBvZiB0aGUgcmV0dXJuZWQgUGFyc2UuT2JqZWN0cyB0byBpbmNsdWRlIG9ubHkgdGhlXG4gICAqIHByb3ZpZGVkIGtleXMuICBJZiB0aGlzIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgdGhlbiBhbGwgb2YgdGhlIGtleXNcbiAgICogc3BlY2lmaWVkIGluIGVhY2ggb2YgdGhlIGNhbGxzIHdpbGwgYmUgaW5jbHVkZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uc3RyaW5nfEFycmF5PHN0cmluZz59IGtleXMgVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBpbmNsdWRlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIHNlbGVjdCgpIHtcbiAgICBpZiAoIXRoaXMuX3NlbGVjdCkge1xuICAgICAgdGhpcy5fc2VsZWN0ID0gW107XG4gICAgfVxuICAgIGZvciAodmFyIF9sZW42ID0gYXJndW1lbnRzLmxlbmd0aCwga2V5cyA9IG5ldyBBcnJheShfbGVuNiksIF9rZXk2ID0gMDsgX2tleTYgPCBfbGVuNjsgX2tleTYrKykge1xuICAgICAga2V5c1tfa2V5Nl0gPSBhcmd1bWVudHNbX2tleTZdO1xuICAgIH1cbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoa2V5cykuY2FsbChrZXlzLCBrZXkgPT4ge1xuICAgICAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShrZXkpKSB7XG4gICAgICAgIHZhciBfY29udGV4dDEwO1xuICAgICAgICB0aGlzLl9zZWxlY3QgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDEwID0gdGhpcy5fc2VsZWN0KS5jYWxsKF9jb250ZXh0MTAsIGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zZWxlY3QucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyaWN0cyB0aGUgZmllbGRzIG9mIHRoZSByZXR1cm5lZCBQYXJzZS5PYmplY3RzIHRvIGFsbCBrZXlzIGV4Y2VwdCB0aGVcbiAgICogcHJvdmlkZWQga2V5cy4gRXhjbHVkZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgc2VsZWN0IGFuZCBpbmNsdWRlLlxuICAgKlxuICAgKiBSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgMy42LjArXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uc3RyaW5nfEFycmF5PHN0cmluZz59IGtleXMgVGhlIG5hbWUocykgb2YgdGhlIGtleShzKSB0byBleGNsdWRlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGV4Y2x1ZGUoKSB7XG4gICAgZm9yICh2YXIgX2xlbjcgPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW43KSwgX2tleTcgPSAwOyBfa2V5NyA8IF9sZW43OyBfa2V5NysrKSB7XG4gICAgICBrZXlzW19rZXk3XSA9IGFyZ3VtZW50c1tfa2V5N107XG4gICAgfVxuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSA9PiB7XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0MTE7XG4gICAgICAgIHRoaXMuX2V4Y2x1ZGUgPSAoMCwgX2NvbmNhdC5kZWZhdWx0KShfY29udGV4dDExID0gdGhpcy5fZXhjbHVkZSkuY2FsbChfY29udGV4dDExLCBrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZXhjbHVkZS5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVzdHJpY3RzIGxpdmUgcXVlcnkgdG8gdHJpZ2dlciBvbmx5IGZvciB3YXRjaGVkIGZpZWxkcy5cbiAgICpcbiAgICogUmVxdWlyZXMgUGFyc2UgU2VydmVyIDYuMC4wK1xuICAgKlxuICAgKiBAcGFyYW0gey4uLnN0cmluZ3xBcnJheTxzdHJpbmc+fSBrZXlzIFRoZSBuYW1lKHMpIG9mIHRoZSBrZXkocykgdG8gd2F0Y2guXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgd2F0Y2goKSB7XG4gICAgZm9yICh2YXIgX2xlbjggPSBhcmd1bWVudHMubGVuZ3RoLCBrZXlzID0gbmV3IEFycmF5KF9sZW44KSwgX2tleTggPSAwOyBfa2V5OCA8IF9sZW44OyBfa2V5OCsrKSB7XG4gICAgICBrZXlzW19rZXk4XSA9IGFyZ3VtZW50c1tfa2V5OF07XG4gICAgfVxuICAgICgwLCBfZm9yRWFjaC5kZWZhdWx0KShrZXlzKS5jYWxsKGtleXMsIGtleSA9PiB7XG4gICAgICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKGtleSkpIHtcbiAgICAgICAgdmFyIF9jb250ZXh0MTI7XG4gICAgICAgIHRoaXMuX3dhdGNoID0gKDAsIF9jb25jYXQuZGVmYXVsdCkoX2NvbnRleHQxMiA9IHRoaXMuX3dhdGNoKS5jYWxsKF9jb250ZXh0MTIsIGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl93YXRjaC5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgcmVhZCBwcmVmZXJlbmNlIHRoYXQgdGhlIGJhY2tlbmQgd2lsbCB1c2Ugd2hlbiBwZXJmb3JtaW5nIHRoZSBxdWVyeSB0byB0aGUgZGF0YWJhc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFkUHJlZmVyZW5jZSBUaGUgcmVhZCBwcmVmZXJlbmNlIGZvciB0aGUgbWFpbiBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluY2x1ZGVSZWFkUHJlZmVyZW5jZSBUaGUgcmVhZCBwcmVmZXJlbmNlIGZvciB0aGUgcXVlcmllcyB0byBpbmNsdWRlIHBvaW50ZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VicXVlcnlSZWFkUHJlZmVyZW5jZSBUaGUgcmVhZCBwcmVmZXJlbmNlIGZvciB0aGUgc3ViIHF1ZXJpZXMuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgcmVhZFByZWZlcmVuY2UocmVhZFByZWZlcmVuY2UsIGluY2x1ZGVSZWFkUHJlZmVyZW5jZSwgc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgIHRoaXMuX3JlYWRQcmVmZXJlbmNlID0gcmVhZFByZWZlcmVuY2U7XG4gICAgdGhpcy5faW5jbHVkZVJlYWRQcmVmZXJlbmNlID0gaW5jbHVkZVJlYWRQcmVmZXJlbmNlIHx8IG51bGw7XG4gICAgdGhpcy5fc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IHN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgfHwgbnVsbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdGhpcyBxdWVyeSB0byBnZXQgbGl2ZVF1ZXJ5IHVwZGF0ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25Ub2tlbiAob3B0aW9uYWwpIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50VXNlclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMaXZlUXVlcnlTdWJzY3JpcHRpb24+fSBSZXR1cm5zIHRoZSBsaXZlUXVlcnlTdWJzY3JpcHRpb24sIGl0J3MgYW4gZXZlbnQgZW1pdHRlclxuICAgKiB3aGljaCBjYW4gYmUgdXNlZCB0byBnZXQgbGl2ZVF1ZXJ5IHVwZGF0ZXMuXG4gICAqL1xuICBhc3luYyBzdWJzY3JpYmUoc2Vzc2lvblRva2VuKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpLmN1cnJlbnRVc2VyQXN5bmMoKTtcbiAgICBpZiAoIXNlc3Npb25Ub2tlbikge1xuICAgICAgc2Vzc2lvblRva2VuID0gY3VycmVudFVzZXIgPyBjdXJyZW50VXNlci5nZXRTZXNzaW9uVG9rZW4oKSB8fCB1bmRlZmluZWQgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGxpdmVRdWVyeUNsaWVudCA9IGF3YWl0IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldExpdmVRdWVyeUNvbnRyb2xsZXIoKS5nZXREZWZhdWx0TGl2ZVF1ZXJ5Q2xpZW50KCk7XG4gICAgaWYgKGxpdmVRdWVyeUNsaWVudC5zaG91bGRPcGVuKCkpIHtcbiAgICAgIGxpdmVRdWVyeUNsaWVudC5vcGVuKCk7XG4gICAgfVxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGxpdmVRdWVyeUNsaWVudC5zdWJzY3JpYmUodGhpcywgc2Vzc2lvblRva2VuKTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uLnN1YnNjcmliZVByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBQYXJzZS5RdWVyeSB0aGF0IGlzIHRoZSBPUiBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMuICBGb3JcbiAgICogZXhhbXBsZTpcbiAgICogPHByZT52YXIgY29tcG91bmRRdWVyeSA9IFBhcnNlLlF1ZXJ5Lm9yKHF1ZXJ5MSwgcXVlcnkyLCBxdWVyeTMpOzwvcHJlPlxuICAgKlxuICAgKiB3aWxsIGNyZWF0ZSBhIGNvbXBvdW5kUXVlcnkgdGhhdCBpcyBhbiBvciBvZiB0aGUgcXVlcnkxLCBxdWVyeTIsIGFuZFxuICAgKiBxdWVyeTMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uUGFyc2UuUXVlcnl9IHF1ZXJpZXMgVGhlIGxpc3Qgb2YgcXVlcmllcyB0byBPUi5cbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFRoZSBxdWVyeSB0aGF0IGlzIHRoZSBPUiBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMuXG4gICAqL1xuICBzdGF0aWMgb3IoKSB7XG4gICAgZm9yICh2YXIgX2xlbjkgPSBhcmd1bWVudHMubGVuZ3RoLCBxdWVyaWVzID0gbmV3IEFycmF5KF9sZW45KSwgX2tleTkgPSAwOyBfa2V5OSA8IF9sZW45OyBfa2V5OSsrKSB7XG4gICAgICBxdWVyaWVzW19rZXk5XSA9IGFyZ3VtZW50c1tfa2V5OV07XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IF9nZXRDbGFzc05hbWVGcm9tUXVlcmllcyhxdWVyaWVzKTtcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KGNsYXNzTmFtZSk7XG4gICAgcXVlcnkuX29yUXVlcnkocXVlcmllcyk7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBQYXJzZS5RdWVyeSB0aGF0IGlzIHRoZSBBTkQgb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzLiAgRm9yXG4gICAqIGV4YW1wbGU6XG4gICAqIDxwcmU+dmFyIGNvbXBvdW5kUXVlcnkgPSBQYXJzZS5RdWVyeS5hbmQocXVlcnkxLCBxdWVyeTIsIHF1ZXJ5Myk7PC9wcmU+XG4gICAqXG4gICAqIHdpbGwgY3JlYXRlIGEgY29tcG91bmRRdWVyeSB0aGF0IGlzIGFuIGFuZCBvZiB0aGUgcXVlcnkxLCBxdWVyeTIsIGFuZFxuICAgKiBxdWVyeTMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uUGFyc2UuUXVlcnl9IHF1ZXJpZXMgVGhlIGxpc3Qgb2YgcXVlcmllcyB0byBBTkQuXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBUaGUgcXVlcnkgdGhhdCBpcyB0aGUgQU5EIG9mIHRoZSBwYXNzZWQgaW4gcXVlcmllcy5cbiAgICovXG4gIHN0YXRpYyBhbmQoKSB7XG4gICAgZm9yICh2YXIgX2xlbjEwID0gYXJndW1lbnRzLmxlbmd0aCwgcXVlcmllcyA9IG5ldyBBcnJheShfbGVuMTApLCBfa2V5MTAgPSAwOyBfa2V5MTAgPCBfbGVuMTA7IF9rZXkxMCsrKSB7XG4gICAgICBxdWVyaWVzW19rZXkxMF0gPSBhcmd1bWVudHNbX2tleTEwXTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NOYW1lID0gX2dldENsYXNzTmFtZUZyb21RdWVyaWVzKHF1ZXJpZXMpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFBhcnNlUXVlcnkoY2xhc3NOYW1lKTtcbiAgICBxdWVyeS5fYW5kUXVlcnkocXVlcmllcyk7XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBQYXJzZS5RdWVyeSB0aGF0IGlzIHRoZSBOT1Igb2YgdGhlIHBhc3NlZCBpbiBxdWVyaWVzLiAgRm9yXG4gICAqIGV4YW1wbGU6XG4gICAqIDxwcmU+Y29uc3QgY29tcG91bmRRdWVyeSA9IFBhcnNlLlF1ZXJ5Lm5vcihxdWVyeTEsIHF1ZXJ5MiwgcXVlcnkzKTs8L3ByZT5cbiAgICpcbiAgICogd2lsbCBjcmVhdGUgYSBjb21wb3VuZFF1ZXJ5IHRoYXQgaXMgYSBub3Igb2YgdGhlIHF1ZXJ5MSwgcXVlcnkyLCBhbmRcbiAgICogcXVlcnkzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLlBhcnNlLlF1ZXJ5fSBxdWVyaWVzIFRoZSBsaXN0IG9mIHF1ZXJpZXMgdG8gTk9SLlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gVGhlIHF1ZXJ5IHRoYXQgaXMgdGhlIE5PUiBvZiB0aGUgcGFzc2VkIGluIHF1ZXJpZXMuXG4gICAqL1xuICBzdGF0aWMgbm9yKCkge1xuICAgIGZvciAodmFyIF9sZW4xMSA9IGFyZ3VtZW50cy5sZW5ndGgsIHF1ZXJpZXMgPSBuZXcgQXJyYXkoX2xlbjExKSwgX2tleTExID0gMDsgX2tleTExIDwgX2xlbjExOyBfa2V5MTErKykge1xuICAgICAgcXVlcmllc1tfa2V5MTFdID0gYXJndW1lbnRzW19rZXkxMV07XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IF9nZXRDbGFzc05hbWVGcm9tUXVlcmllcyhxdWVyaWVzKTtcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KGNsYXNzTmFtZSk7XG4gICAgcXVlcnkuX25vclF1ZXJ5KHF1ZXJpZXMpO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIHNvdXJjZSBvZiB0aGlzIHF1ZXJ5IHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZnJvbU5ldHdvcmsoKSB7XG4gICAgdGhpcy5fcXVlcmllc0xvY2FsRGF0YXN0b3JlID0gZmFsc2U7XG4gICAgdGhpcy5fbG9jYWxEYXRhc3RvcmVQaW5OYW1lID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRoZSBzb3VyY2Ugb2YgdGhpcyBxdWVyeSB0byBhbGwgcGlubmVkIG9iamVjdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQYXJzZS5RdWVyeX0gUmV0dXJucyB0aGUgcXVlcnksIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgZnJvbUxvY2FsRGF0YXN0b3JlKCkge1xuICAgIHJldHVybiB0aGlzLmZyb21QaW5XaXRoTmFtZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2VzIHRoZSBzb3VyY2Ugb2YgdGhpcyBxdWVyeSB0byB0aGUgZGVmYXVsdCBncm91cCBvZiBwaW5uZWQgb2JqZWN0cy5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBmcm9tUGluKCkge1xuICAgIHJldHVybiB0aGlzLmZyb21QaW5XaXRoTmFtZShfTG9jYWxEYXRhc3RvcmVVdGlscy5ERUZBVUxUX1BJTik7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgc291cmNlIG9mIHRoaXMgcXVlcnkgdG8gYSBzcGVjaWZpYyBncm91cCBvZiBwaW5uZWQgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgcXVlcnkgc291cmNlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGZyb21QaW5XaXRoTmFtZShuYW1lKSB7XG4gICAgY29uc3QgbG9jYWxEYXRhc3RvcmUgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRMb2NhbERhdGFzdG9yZSgpO1xuICAgIGlmIChsb2NhbERhdGFzdG9yZS5jaGVja0lmRW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLl9xdWVyaWVzTG9jYWxEYXRhc3RvcmUgPSB0cnVlO1xuICAgICAgdGhpcy5fbG9jYWxEYXRhc3RvcmVQaW5OYW1lID0gbmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyB0aGUgY3VycmVudCBuZXR3b3JrIHJlcXVlc3QgKGlmIGFueSBpcyBydW5uaW5nKS5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlF1ZXJ5fSBSZXR1cm5zIHRoZSBxdWVyeSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMuX3hoclJlcXVlc3QudGFzayAmJiB0eXBlb2YgdGhpcy5feGhyUmVxdWVzdC50YXNrLmFib3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl94aHJSZXF1ZXN0LnRhc2suX2Fib3J0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5feGhyUmVxdWVzdC50YXNrLmFib3J0KCk7XG4gICAgICB0aGlzLl94aHJSZXF1ZXN0LnRhc2sgPSBudWxsO1xuICAgICAgdGhpcy5feGhyUmVxdWVzdC5vbmNoYW5nZSA9ICgpID0+IHt9O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX3hoclJlcXVlc3Qub25jaGFuZ2UgPSAoKSA9PiB0aGlzLmNhbmNlbCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIF9zZXRSZXF1ZXN0VGFzayhvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5yZXF1ZXN0VGFzayA9IHRhc2sgPT4ge1xuICAgICAgdGhpcy5feGhyUmVxdWVzdC50YXNrID0gdGFzaztcbiAgICAgIHRoaXMuX3hoclJlcXVlc3Qub25jaGFuZ2UoKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBjb21tZW50IHRvIHRoZSBxdWVyeSBzbyB0aGF0IHRoZSBxdWVyeVxuICAgKiBjYW4gYmUgaWRlbnRpZmllZCB3aGVuIHVzaW5nIGEgdGhlIHByb2ZpbGVyIGZvciBNb25nb0RCLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgYSBjb21tZW50IGNhbiBtYWtlIHlvdXIgcHJvZmlsZSBkYXRhIGVhc2llciB0byBpbnRlcnByZXQgYW5kIHRyYWNlLlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJldHVybnMgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGNvbW1lbnQodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgZGVsZXRlIHRoaXMuX2NvbW1lbnQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHZhbHVlIG9mIGEgY29tbWVudCB0byBiZSBzZW50IHdpdGggdGhpcyBxdWVyeSBtdXN0IGJlIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICB0aGlzLl9jb21tZW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmNvbnN0IERlZmF1bHRDb250cm9sbGVyID0ge1xuICBmaW5kKGNsYXNzTmFtZSwgcGFyYW1zLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAnY2xhc3Nlcy8nICsgY2xhc3NOYW1lLCBwYXJhbXMsIG9wdGlvbnMpO1xuICB9LFxuICBhZ2dyZWdhdGUoY2xhc3NOYW1lLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICdhZ2dyZWdhdGUvJyArIGNsYXNzTmFtZSwgcGFyYW1zLCBvcHRpb25zKTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFBhcnNlUXVlcnkoUGFyc2VRdWVyeSk7XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRRdWVyeUNvbnRyb2xsZXIoRGVmYXVsdENvbnRyb2xsZXIpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gUGFyc2VRdWVyeTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgUmVsYXRpb24gZm9yIHRoZSBnaXZlbiBwYXJlbnQgb2JqZWN0IGFuZCBrZXkuIFRoaXNcbiAqIGNvbnN0cnVjdG9yIHNob3VsZCByYXJlbHkgYmUgdXNlZCBkaXJlY3RseSwgYnV0IHJhdGhlciBjcmVhdGVkIGJ5XG4gKiBQYXJzZS5PYmplY3QucmVsYXRpb24uXG4gKlxuICogPHA+XG4gKiBBIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBhY2Nlc3MgYWxsIG9mIHRoZSBjaGlsZHJlbiBvZiBhIG1hbnktdG8tbWFueVxuICogcmVsYXRpb25zaGlwLiAgRWFjaCBpbnN0YW5jZSBvZiBQYXJzZS5SZWxhdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYVxuICogcGFydGljdWxhciBwYXJlbnQgb2JqZWN0IGFuZCBrZXkuXG4gKiA8L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLlJlbGF0aW9uXG4gKi9cbmNsYXNzIFBhcnNlUmVsYXRpb24ge1xuICAvKipcbiAgICogQHBhcmFtIHtQYXJzZS5PYmplY3R9IHBhcmVudCBUaGUgcGFyZW50IG9mIHRoaXMgcmVsYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBmb3IgdGhpcyByZWxhdGlvbiBvbiB0aGUgcGFyZW50LlxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50LCBrZXkpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInBhcmVudFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwia2V5XCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJ0YXJnZXRDbGFzc05hbWVcIiwgdm9pZCAwKTtcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICB0aGlzLnRhcmdldENsYXNzTmFtZSA9IG51bGw7XG4gIH1cblxuICAvKlxuICAgKiBNYWtlcyBzdXJlIHRoYXQgdGhpcyByZWxhdGlvbiBoYXMgdGhlIHJpZ2h0IHBhcmVudCBhbmQga2V5LlxuICAgKi9cbiAgX2Vuc3VyZVBhcmVudEFuZEtleShwYXJlbnQsIGtleSkge1xuICAgIHRoaXMua2V5ID0gdGhpcy5rZXkgfHwga2V5O1xuICAgIGlmICh0aGlzLmtleSAhPT0ga2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIEVycm9yLiBSZWxhdGlvbiByZXRyaWV2ZWQgZnJvbSB0d28gZGlmZmVyZW50IGtleXMuJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgaWYgKHRoaXMucGFyZW50LmNsYXNzTmFtZSAhPT0gcGFyZW50LmNsYXNzTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIEVycm9yLiBSZWxhdGlvbiByZXRyaWV2ZWQgZnJvbSB0d28gZGlmZmVyZW50IE9iamVjdHMuJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wYXJlbnQuaWQpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50LmlkICE9PSBwYXJlbnQuaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIEVycm9yLiBSZWxhdGlvbiByZXRyaWV2ZWQgZnJvbSB0d28gZGlmZmVyZW50IE9iamVjdHMuJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyZW50LmlkKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIFBhcnNlLk9iamVjdCBvciBhbiBhcnJheSBvZiBQYXJzZS5PYmplY3RzIHRvIHRoZSByZWxhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsoUGFyc2UuT2JqZWN0fEFycmF5KX0gb2JqZWN0cyBUaGUgaXRlbSBvciBpdGVtcyB0byBhZGQuXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9IFRoZSBwYXJlbnQgb2YgdGhlIHJlbGF0aW9uLlxuICAgKi9cbiAgYWRkKG9iamVjdHMpIHtcbiAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KShvYmplY3RzKSkge1xuICAgICAgb2JqZWN0cyA9IFtvYmplY3RzXTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgUmVsYXRpb25PcFxuICAgIH0gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9wKCk7XG4gICAgY29uc3QgY2hhbmdlID0gbmV3IFJlbGF0aW9uT3Aob2JqZWN0cywgW10pO1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgdG8gYSBSZWxhdGlvbiB3aXRob3V0IGEgcGFyZW50Jyk7XG4gICAgfVxuICAgIGlmIChvYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50LnNldCh0aGlzLmtleSwgY2hhbmdlKTtcbiAgICB0aGlzLnRhcmdldENsYXNzTmFtZSA9IGNoYW5nZS5fdGFyZ2V0Q2xhc3NOYW1lO1xuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIFBhcnNlLk9iamVjdCBvciBhbiBhcnJheSBvZiBQYXJzZS5PYmplY3RzIGZyb20gdGhpcyByZWxhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsoUGFyc2UuT2JqZWN0fEFycmF5KX0gb2JqZWN0cyBUaGUgaXRlbSBvciBpdGVtcyB0byByZW1vdmUuXG4gICAqL1xuICByZW1vdmUob2JqZWN0cykge1xuICAgIGlmICghKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9iamVjdHMpKSB7XG4gICAgICBvYmplY3RzID0gW29iamVjdHNdO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBSZWxhdGlvbk9wXG4gICAgfSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT3AoKTtcbiAgICBjb25zdCBjaGFuZ2UgPSBuZXcgUmVsYXRpb25PcChbXSwgb2JqZWN0cyk7XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVtb3ZlIGZyb20gYSBSZWxhdGlvbiB3aXRob3V0IGEgcGFyZW50Jyk7XG4gICAgfVxuICAgIGlmIChvYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudC5zZXQodGhpcy5rZXksIGNoYW5nZSk7XG4gICAgdGhpcy50YXJnZXRDbGFzc05hbWUgPSBjaGFuZ2UuX3RhcmdldENsYXNzTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTiB2ZXJzaW9uIG9mIHRoZSBvYmplY3Qgc3VpdGFibGUgZm9yIHNhdmluZyB0byBkaXNrLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIFJlbGF0aW9uXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ1JlbGF0aW9uJyxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy50YXJnZXRDbGFzc05hbWVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBQYXJzZS5RdWVyeSB0aGF0IGlzIGxpbWl0ZWQgdG8gb2JqZWN0cyBpbiB0aGlzXG4gICAqIHJlbGF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUXVlcnl9IFJlbGF0aW9uIFF1ZXJ5XG4gICAqL1xuICBxdWVyeSgpIHtcbiAgICBsZXQgcXVlcnk7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbnN0cnVjdCBhIHF1ZXJ5IGZvciBhIFJlbGF0aW9uIHdpdGhvdXQgYSBwYXJlbnQnKTtcbiAgICB9XG4gICAgY29uc3QgUGFyc2VRdWVyeSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlUXVlcnkoKTtcbiAgICBpZiAoIXRoaXMudGFyZ2V0Q2xhc3NOYW1lKSB7XG4gICAgICBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KHBhcmVudC5jbGFzc05hbWUpO1xuICAgICAgcXVlcnkuX2V4dHJhT3B0aW9ucy5yZWRpcmVjdENsYXNzTmFtZUZvcktleSA9IHRoaXMua2V5O1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSA9IG5ldyBQYXJzZVF1ZXJ5KHRoaXMudGFyZ2V0Q2xhc3NOYW1lKTtcbiAgICB9XG4gICAgcXVlcnkuX2FkZENvbmRpdGlvbignJHJlbGF0ZWRUbycsICdvYmplY3QnLCB7XG4gICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgIGNsYXNzTmFtZTogcGFyZW50LmNsYXNzTmFtZSxcbiAgICAgIG9iamVjdElkOiBwYXJlbnQuaWRcbiAgICB9KTtcbiAgICBxdWVyeS5fYWRkQ29uZGl0aW9uKCckcmVsYXRlZFRvJywgJ2tleScsIHRoaXMua2V5KTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlUmVsYXRpb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VBQ0wgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlQUNMXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX1BhcnNlT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZU9iamVjdFwiKSk7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBSb2xlIG9uIHRoZSBQYXJzZSBzZXJ2ZXIuIFJvbGVzIHJlcHJlc2VudCBncm91cGluZ3Mgb2ZcbiAqIFVzZXJzIGZvciB0aGUgcHVycG9zZXMgb2YgZ3JhbnRpbmcgcGVybWlzc2lvbnMgKGUuZy4gc3BlY2lmeWluZyBhbiBBQ0xcbiAqIGZvciBhbiBPYmplY3QpLiBSb2xlcyBhcmUgc3BlY2lmaWVkIGJ5IHRoZWlyIHNldHMgb2YgY2hpbGQgdXNlcnMgYW5kXG4gKiBjaGlsZCByb2xlcywgYWxsIG9mIHdoaWNoIGFyZSBncmFudGVkIGFueSBwZXJtaXNzaW9ucyB0aGF0IHRoZSBwYXJlbnRcbiAqIHJvbGUgaGFzLlxuICpcbiAqIDxwPlJvbGVzIG11c3QgaGF2ZSBhIG5hbWUgKHdoaWNoIGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyIGNyZWF0aW9uIG9mIHRoZVxuICogcm9sZSksIGFuZCBtdXN0IHNwZWNpZnkgYW4gQUNMLjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuUm9sZVxuICogQGF1Z21lbnRzIFBhcnNlLk9iamVjdFxuICovXG5jbGFzcyBQYXJzZVJvbGUgZXh0ZW5kcyBfUGFyc2VPYmplY3QuZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgUm9sZSB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7UGFyc2UuQUNMfSBhY2wgVGhlIEFDTCBmb3IgdGhpcyByb2xlLiBSb2xlcyBtdXN0IGhhdmUgYW4gQUNMLlxuICAgKiBBIFBhcnNlLlJvbGUgaXMgYSBsb2NhbCByZXByZXNlbnRhdGlvbiBvZiBhIHJvbGUgcGVyc2lzdGVkIHRvIHRoZSBQYXJzZVxuICAgKiBjbG91ZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIGFjbCkge1xuICAgIHN1cGVyKCdfUm9sZScpO1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgYWNsIGluc3RhbmNlb2YgX1BhcnNlQUNMLmRlZmF1bHQpIHtcbiAgICAgIHRoaXMuc2V0TmFtZShuYW1lKTtcbiAgICAgIHRoaXMuc2V0QUNMKGFjbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHJvbGUuICBZb3UgY2FuIGFsdGVybmF0aXZlbHkgY2FsbCByb2xlLmdldChcIm5hbWVcIilcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIG5hbWUgb2YgdGhlIHJvbGUuXG4gICAqL1xuICBnZXROYW1lKCkge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldCgnbmFtZScpO1xuICAgIGlmIChuYW1lID09IG51bGwgfHwgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5hbWUgZm9yIGEgcm9sZS4gVGhpcyB2YWx1ZSBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIHJvbGUgaGFzXG4gICAqIGJlZW4gc2F2ZWQgdG8gdGhlIHNlcnZlciwgYW5kIGNhbm5vdCBiZSBzZXQgb25jZSB0aGUgcm9sZSBoYXMgYmVlblxuICAgKiBzYXZlZC5cbiAgICpcbiAgICogPHA+XG4gICAqICAgQSByb2xlJ3MgbmFtZSBjYW4gb25seSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBfLCAtLCBhbmRcbiAgICogICBzcGFjZXMuXG4gICAqIDwvcD5cbiAgICpcbiAgICogPHA+VGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgcm9sZS5zZXQoXCJuYW1lXCIsIG5hbWUpPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcm9sZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU3RhbmRhcmQgb3B0aW9ucyBvYmplY3Qgd2l0aCBzdWNjZXNzIGFuZCBlcnJvclxuICAgKiAgICAgY2FsbGJhY2tzLlxuICAgKiBAcmV0dXJucyB7KFBhcnNlT2JqZWN0fGJvb2xlYW4pfSB0cnVlIGlmIHRoZSBzZXQgc3VjY2VlZGVkLlxuICAgKi9cbiAgc2V0TmFtZShuYW1lLCBvcHRpb25zKSB7XG4gICAgdGhpcy5fdmFsaWRhdGVOYW1lKG5hbWUpO1xuICAgIHJldHVybiB0aGlzLnNldCgnbmFtZScsIG5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFBhcnNlLlJlbGF0aW9uIGZvciB0aGUgUGFyc2UuVXNlcnMgdGhhdCBhcmUgZGlyZWN0XG4gICAqIGNoaWxkcmVuIG9mIHRoaXMgcm9sZS4gVGhlc2UgdXNlcnMgYXJlIGdyYW50ZWQgYW55IHByaXZpbGVnZXMgdGhhdCB0aGlzXG4gICAqIHJvbGUgaGFzIGJlZW4gZ3JhbnRlZCAoZS5nLiByZWFkIG9yIHdyaXRlIGFjY2VzcyB0aHJvdWdoIEFDTHMpLiBZb3UgY2FuXG4gICAqIGFkZCBvciByZW1vdmUgdXNlcnMgZnJvbSB0aGUgcm9sZSB0aHJvdWdoIHRoaXMgcmVsYXRpb24uXG4gICAqXG4gICAqIDxwPlRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIHJvbGUucmVsYXRpb24oXCJ1c2Vyc1wiKTwvcD5cbiAgICpcbiAgICogQHJldHVybnMge1BhcnNlLlJlbGF0aW9ufSB0aGUgcmVsYXRpb24gZm9yIHRoZSB1c2VycyBiZWxvbmdpbmcgdG8gdGhpc1xuICAgKiAgICAgcm9sZS5cbiAgICovXG4gIGdldFVzZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnJlbGF0aW9uKCd1c2VycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFBhcnNlLlJlbGF0aW9uIGZvciB0aGUgUGFyc2UuUm9sZXMgdGhhdCBhcmUgZGlyZWN0XG4gICAqIGNoaWxkcmVuIG9mIHRoaXMgcm9sZS4gVGhlc2Ugcm9sZXMnIHVzZXJzIGFyZSBncmFudGVkIGFueSBwcml2aWxlZ2VzIHRoYXRcbiAgICogdGhpcyByb2xlIGhhcyBiZWVuIGdyYW50ZWQgKGUuZy4gcmVhZCBvciB3cml0ZSBhY2Nlc3MgdGhyb3VnaCBBQ0xzKS4gWW91XG4gICAqIGNhbiBhZGQgb3IgcmVtb3ZlIGNoaWxkIHJvbGVzIGZyb20gdGhpcyByb2xlIHRocm91Z2ggdGhpcyByZWxhdGlvbi5cbiAgICpcbiAgICogPHA+VGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgcm9sZS5yZWxhdGlvbihcInJvbGVzXCIpPC9wPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UGFyc2UuUmVsYXRpb259IHRoZSByZWxhdGlvbiBmb3IgdGhlIHJvbGVzIGJlbG9uZ2luZyB0byB0aGlzXG4gICAqICAgICByb2xlLlxuICAgKi9cbiAgZ2V0Um9sZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVsYXRpb24oJ3JvbGVzJyk7XG4gIH1cbiAgX3ZhbGlkYXRlTmFtZShuZXdOYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgXCJBIHJvbGUncyBuYW1lIG11c3QgYmUgYSBTdHJpbmcuXCIpO1xuICAgIH1cbiAgICBpZiAoIS9eWzAtOWEtekEtWlxcLV8gXSskLy50ZXN0KG5ld05hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCBcIkEgcm9sZSdzIG5hbWUgY2FuIGJlIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgXywgXCIgKyAnLSwgYW5kIHNwYWNlcy4nKTtcbiAgICB9XG4gIH1cbiAgdmFsaWRhdGUoYXR0cnMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBpc0ludmFsaWQgPSBzdXBlci52YWxpZGF0ZShhdHRycywgb3B0aW9ucyk7XG4gICAgaWYgKGlzSW52YWxpZCkge1xuICAgICAgcmV0dXJuIGlzSW52YWxpZDtcbiAgICB9XG4gICAgaWYgKCduYW1lJyBpbiBhdHRycyAmJiBhdHRycy5uYW1lICE9PSB0aGlzLmdldE5hbWUoKSkge1xuICAgICAgY29uc3QgbmV3TmFtZSA9IGF0dHJzLm5hbWU7XG4gICAgICBpZiAodGhpcy5pZCAmJiB0aGlzLmlkICE9PSBhdHRycy5vYmplY3RJZCkge1xuICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG9iamVjdElkIGJlaW5nIHNldCBtYXRjaGVzIHRoaXMuaWRcbiAgICAgICAgLy8gVGhpcyBoYXBwZW5zIGR1cmluZyBhIGZldGNoIC0tIHRoZSBpZCBpcyBzZXQgYmVmb3JlIGNhbGxpbmcgZmV0Y2hcbiAgICAgICAgLy8gTGV0IHRoZSBuYW1lIGJlIHNldCBpbiB0aGlzIGNhc2VcbiAgICAgICAgcmV0dXJuIG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsIFwiQSByb2xlJ3MgbmFtZSBjYW4gb25seSBiZSBzZXQgYmVmb3JlIGl0IGhhcyBiZWVuIHNhdmVkLlwiKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlTmFtZShuZXdOYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UGFyc2VSb2xlKFBhcnNlUm9sZSk7XG5fUGFyc2VPYmplY3QuZGVmYXVsdC5yZWdpc3RlclN1YmNsYXNzKCdfUm9sZScsIFBhcnNlUm9sZSk7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZVJvbGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xudmFyIF9QYXJzZUNMUCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VDTFBcIikpO1xuY29uc3QgRklFTERfVFlQRVMgPSBbJ1N0cmluZycsICdOdW1iZXInLCAnQm9vbGVhbicsICdCeXRlcycsICdEYXRlJywgJ0ZpbGUnLCAnR2VvUG9pbnQnLCAnUG9seWdvbicsICdBcnJheScsICdPYmplY3QnLCAnUG9pbnRlcicsICdSZWxhdGlvbiddO1xuLyoqXG4gKiBBIFBhcnNlLlNjaGVtYSBvYmplY3QgaXMgZm9yIGhhbmRsaW5nIHNjaGVtYSBkYXRhIGZyb20gUGFyc2UuXG4gKiA8cD5BbGwgdGhlIHNjaGVtYXMgbWV0aG9kcyByZXF1aXJlIE1hc3RlcktleS5cbiAqXG4gKiBXaGVuIGFkZGluZyBmaWVsZHMsIHlvdSBtYXkgc2V0IHJlcXVpcmVkIGFuZCBkZWZhdWx0IHZhbHVlcy4gKFJlcXVpcmVzIFBhcnNlIFNlcnZlciAzLjcuMCspXG4gKlxuICogPHByZT5cbiAqIGNvbnN0IG9wdGlvbnMgPSB7IHJlcXVpcmVkOiB0cnVlLCBkZWZhdWx0VmFsdWU6ICdoZWxsbyB3b3JsZCcgfTtcbiAqIGNvbnN0IHNjaGVtYSA9IG5ldyBQYXJzZS5TY2hlbWEoJ015Q2xhc3MnKTtcbiAqIHNjaGVtYS5hZGRTdHJpbmcoJ2ZpZWxkJywgb3B0aW9ucyk7XG4gKiBzY2hlbWEuYWRkSW5kZXgoJ2luZGV4X25hbWUnLCB7ICdmaWVsZCc6IDEgfSk7XG4gKiBzY2hlbWEuc2F2ZSgpO1xuICogPC9wcmU+XG4gKiA8L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLlNjaGVtYVxuICovXG5jbGFzcyBQYXJzZVNjaGVtYSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFBhcnNlIENsYXNzIHN0cmluZy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNsYXNzTmFtZSkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiY2xhc3NOYW1lXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfZmllbGRzXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJfaW5kZXhlc1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiX2NscFwiLCB2b2lkIDApO1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gJ1VzZXInICYmIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnUEVSRk9STV9VU0VSX1JFV1JJVEUnKSkge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICdfVXNlcic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZmllbGRzID0ge307XG4gICAgdGhpcy5faW5kZXhlcyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2QgdG8gZ2V0IGFsbCBzY2hlbWFzXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGFsbCgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U2NoZW1hQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmdldCgnJykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UucmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTY2hlbWEgbm90IGZvdW5kLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdHM7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBTY2hlbWEgZnJvbSBQYXJzZVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGdldCgpIHtcbiAgICB0aGlzLmFzc2VydENsYXNzTmFtZSgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTY2hlbWFDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0KHRoaXMuY2xhc3NOYW1lKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTY2hlbWEgbm90IGZvdW5kLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBTY2hlbWEgb24gUGFyc2VcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICBzYXZlKCkge1xuICAgIHRoaXMuYXNzZXJ0Q2xhc3NOYW1lKCk7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFNjaGVtYUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLFxuICAgICAgZmllbGRzOiB0aGlzLl9maWVsZHMsXG4gICAgICBpbmRleGVzOiB0aGlzLl9pbmRleGVzLFxuICAgICAgY2xhc3NMZXZlbFBlcm1pc3Npb25zOiB0aGlzLl9jbHBcbiAgICB9O1xuICAgIHJldHVybiBjb250cm9sbGVyLmNyZWF0ZSh0aGlzLmNsYXNzTmFtZSwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSBTY2hlbWEgb24gUGFyc2VcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIHJlc3VsdCB3aGVuXG4gICAqIHRoZSBxdWVyeSBjb21wbGV0ZXMuXG4gICAqL1xuICB1cGRhdGUoKSB7XG4gICAgdGhpcy5hc3NlcnRDbGFzc05hbWUoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U2NoZW1hQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUsXG4gICAgICBmaWVsZHM6IHRoaXMuX2ZpZWxkcyxcbiAgICAgIGluZGV4ZXM6IHRoaXMuX2luZGV4ZXMsXG4gICAgICBjbGFzc0xldmVsUGVybWlzc2lvbnM6IHRoaXMuX2NscFxuICAgIH07XG4gICAgdGhpcy5fZmllbGRzID0ge307XG4gICAgdGhpcy5faW5kZXhlcyA9IHt9O1xuICAgIHJldHVybiBjb250cm9sbGVyLnVwZGF0ZSh0aGlzLmNsYXNzTmFtZSwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmluZyBhIFNjaGVtYSBmcm9tIFBhcnNlXG4gICAqIENhbiBvbmx5IGJlIHVzZWQgb24gU2NoZW1hIHdpdGhvdXQgb2JqZWN0c1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgcmVzdWx0IHdoZW5cbiAgICogdGhlIHF1ZXJ5IGNvbXBsZXRlcy5cbiAgICovXG4gIGRlbGV0ZSgpIHtcbiAgICB0aGlzLmFzc2VydENsYXNzTmFtZSgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTY2hlbWFDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuZGVsZXRlKHRoaXMuY2xhc3NOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBvYmplY3RzIGZyb20gYSBTY2hlbWEgKGNsYXNzKSBpbiBQYXJzZS5cbiAgICogRVhFUkNJU0UgQ0FVVElPTiwgcnVubmluZyB0aGlzIHdpbGwgZGVsZXRlIGFsbCBvYmplY3RzIGZvciB0aGlzIHNjaGVtYSBhbmQgY2Fubm90IGJlIHJldmVyc2VkXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXN1bHQgd2hlblxuICAgKiB0aGUgcXVlcnkgY29tcGxldGVzLlxuICAgKi9cbiAgcHVyZ2UoKSB7XG4gICAgdGhpcy5hc3NlcnRDbGFzc05hbWUoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U2NoZW1hQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnB1cmdlKHRoaXMuY2xhc3NOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlcnQgaWYgQ2xhc3NOYW1lIGhhcyBiZWVuIGZpbGxlZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYXNzZXJ0Q2xhc3NOYW1lKCkge1xuICAgIGlmICghdGhpcy5jbGFzc05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3Qgc2V0IGEgQ2xhc3MgTmFtZSBiZWZvcmUgbWFraW5nIGFueSByZXF1ZXN0LicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIENsYXNzIExldmVsIFBlcm1pc3Npb25zIHdoZW4gY3JlYXRpbmcgLyB1cGRhdGluZyBhIFNjaGVtYS5cbiAgICogRVhFUkNJU0UgQ0FVVElPTiwgcnVubmluZyB0aGlzIG1heSBvdmVycmlkZSBDTFAgZm9yIHRoaXMgc2NoZW1hIGFuZCBjYW5ub3QgYmUgcmV2ZXJzZWRcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3QgfCBQYXJzZS5DTFB9IGNscCBDbGFzcyBMZXZlbCBQZXJtaXNzaW9uc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgc2V0Q0xQKGNscCkge1xuICAgIGlmIChjbHAgaW5zdGFuY2VvZiBfUGFyc2VDTFAuZGVmYXVsdCkge1xuICAgICAgdGhpcy5fY2xwID0gY2xwLnRvSlNPTigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jbHAgPSBjbHA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBhIEZpZWxkIHRvIENyZWF0ZSAvIFVwZGF0ZSBhIFNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBDYW4gYmUgYSAoU3RyaW5nfE51bWJlcnxCb29sZWFufERhdGV8UGFyc2UuRmlsZXxQYXJzZS5HZW9Qb2ludHxBcnJheXxPYmplY3R8UG9pbnRlcnxQYXJzZS5SZWxhdGlvbilcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogVmFsaWQgb3B0aW9ucyBhcmU6PHVsPlxuICAgKiAgIDxsaT5yZXF1aXJlZDogSWYgZmllbGQgaXMgbm90IHNldCwgc2F2ZSBvcGVyYXRpb24gZmFpbHMgKFJlcXVpcmVzIFBhcnNlIFNlcnZlciAzLjcuMCspXG4gICAqICAgPGxpPmRlZmF1bHRWYWx1ZTogSWYgZmllbGQgaXMgbm90IHNldCwgYSBkZWZhdWx0IHZhbHVlIGlzIHNlbGVjdGVkIChSZXF1aXJlcyBQYXJzZSBTZXJ2ZXIgMy43LjArKVxuICAgKiAgIDxsaT50YXJnZXRDbGFzczogUmVxdWlyZWQgaWYgdHlwZSBpcyBQb2ludGVyIG9yIFBhcnNlLlJlbGF0aW9uXG4gICAqIDwvdWw+XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRGaWVsZChuYW1lLCB0eXBlKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHR5cGUgPSB0eXBlIHx8ICdTdHJpbmcnO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmaWVsZCBuYW1lIG1heSBub3QgYmUgbnVsbC4nKTtcbiAgICB9XG4gICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShGSUVMRF9UWVBFUykuY2FsbChGSUVMRF9UWVBFUywgdHlwZSkgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dHlwZX0gaXMgbm90IGEgdmFsaWQgdHlwZS5gKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkUG9pbnRlcihuYW1lLCBvcHRpb25zLnRhcmdldENsYXNzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdSZWxhdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZFJlbGF0aW9uKG5hbWUsIG9wdGlvbnMudGFyZ2V0Q2xhc3MpO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZE9wdGlvbnMgPSB7XG4gICAgICB0eXBlXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVxdWlyZWQgPT09ICdib29sZWFuJykge1xuICAgICAgZmllbGRPcHRpb25zLnJlcXVpcmVkID0gb3B0aW9ucy5yZXF1aXJlZDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpZWxkT3B0aW9ucy5kZWZhdWx0VmFsdWUgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdEYXRlJykge1xuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgZmllbGRPcHRpb25zLmRlZmF1bHRWYWx1ZSA9IHtcbiAgICAgICAgICBfX3R5cGU6ICdEYXRlJyxcbiAgICAgICAgICBpc286IG5ldyBEYXRlKG9wdGlvbnMuZGVmYXVsdFZhbHVlKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ0J5dGVzJykge1xuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgZmllbGRPcHRpb25zLmRlZmF1bHRWYWx1ZSA9IHtcbiAgICAgICAgICBfX3R5cGU6ICdCeXRlcycsXG4gICAgICAgICAgYmFzZTY0OiBvcHRpb25zLmRlZmF1bHRWYWx1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9maWVsZHNbbmFtZV0gPSBmaWVsZE9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIGFuIEluZGV4IHRvIENyZWF0ZSAvIFVwZGF0ZSBhIFNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBpbmRleFxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5kZXggeyBmaWVsZDogdmFsdWUgfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKlxuICAgKiA8cHJlPlxuICAgKiBzY2hlbWEuYWRkSW5kZXgoJ2luZGV4X25hbWUnLCB7ICdmaWVsZCc6IDEgfSk7XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgYWRkSW5kZXgobmFtZSwgaW5kZXgpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5kZXggbmFtZSBtYXkgbm90IGJlIG51bGwuJyk7XG4gICAgfVxuICAgIGlmICghaW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5kZXggbWF5IG5vdCBiZSBudWxsLicpO1xuICAgIH1cbiAgICB0aGlzLl9pbmRleGVzW25hbWVdID0gaW5kZXg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIFN0cmluZyBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRTdHJpbmcobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdTdHJpbmcnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgTnVtYmVyIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZE51bWJlcihuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ051bWJlcicsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBCb29sZWFuIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZEJvb2xlYW4obmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdCb29sZWFuJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIEJ5dGVzIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZEJ5dGVzKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnQnl0ZXMnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgRGF0ZSBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGREYXRlKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnRGF0ZScsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBGaWxlIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZEZpbGUobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdGaWxlJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIEdlb1BvaW50IEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9QYXJzZS5TY2hlbWEuaHRtbCNhZGRGaWVsZCBhZGRGaWVsZH1cbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGFkZEdlb1BvaW50KG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnR2VvUG9pbnQnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgUG9seWdvbiBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRQb2x5Z29uKG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCAnUG9seWdvbicsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZGluZyBBcnJheSBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRBcnJheShuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkRmllbGQobmFtZSwgJ0FycmF5Jywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIE9iamVjdCBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBTZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuU2NoZW1hLmh0bWwjYWRkRmllbGQgYWRkRmllbGR9XG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBhZGRPYmplY3QobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsICdPYmplY3QnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRpbmcgUG9pbnRlciBGaWVsZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0aGF0IHdpbGwgYmUgY3JlYXRlZCBvbiBQYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0Q2xhc3MgTmFtZSBvZiB0aGUgdGFyZ2V0IFBvaW50ZXIgQ2xhc3NcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgU2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlNjaGVtYS5odG1sI2FkZEZpZWxkIGFkZEZpZWxkfVxuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkUG9pbnRlcihuYW1lLCB0YXJnZXRDbGFzcykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmllbGQgbmFtZSBtYXkgbm90IGJlIG51bGwuJyk7XG4gICAgfVxuICAgIGlmICghdGFyZ2V0Q2xhc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gc2V0IHRoZSB0YXJnZXRDbGFzcyBvZiB0aGUgUG9pbnRlci4nKTtcbiAgICB9XG4gICAgY29uc3QgZmllbGRPcHRpb25zID0ge1xuICAgICAgdHlwZTogJ1BvaW50ZXInLFxuICAgICAgdGFyZ2V0Q2xhc3NcbiAgICB9O1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZXF1aXJlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBmaWVsZE9wdGlvbnMucmVxdWlyZWQgPSBvcHRpb25zLnJlcXVpcmVkO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmllbGRPcHRpb25zLmRlZmF1bHRWYWx1ZSA9IG9wdGlvbnMuZGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKG9wdGlvbnMuZGVmYXVsdFZhbHVlIGluc3RhbmNlb2YgX1BhcnNlT2JqZWN0LmRlZmF1bHQpIHtcbiAgICAgICAgZmllbGRPcHRpb25zLmRlZmF1bHRWYWx1ZSA9IG9wdGlvbnMuZGVmYXVsdFZhbHVlLnRvUG9pbnRlcigpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9maWVsZHNbbmFtZV0gPSBmaWVsZE9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkaW5nIFJlbGF0aW9uIEZpZWxkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgd2lsbCBiZSBjcmVhdGVkIG9uIFBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRDbGFzcyBOYW1lIG9mIHRoZSB0YXJnZXQgUG9pbnRlciBDbGFzc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuU2NoZW1hfSBSZXR1cm5zIHRoZSBzY2hlbWEsIHNvIHlvdSBjYW4gY2hhaW4gdGhpcyBjYWxsLlxuICAgKi9cbiAgYWRkUmVsYXRpb24obmFtZSwgdGFyZ2V0Q2xhc3MpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmllbGQgbmFtZSBtYXkgbm90IGJlIG51bGwuJyk7XG4gICAgfVxuICAgIGlmICghdGFyZ2V0Q2xhc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gc2V0IHRoZSB0YXJnZXRDbGFzcyBvZiB0aGUgUmVsYXRpb24uJyk7XG4gICAgfVxuICAgIHRoaXMuX2ZpZWxkc1tuYW1lXSA9IHtcbiAgICAgIHR5cGU6ICdSZWxhdGlvbicsXG4gICAgICB0YXJnZXRDbGFzc1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRpbmcgYSBGaWVsZCB0byBVcGRhdGUgb24gYSBTY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGRcbiAgICogQHJldHVybnMge1BhcnNlLlNjaGVtYX0gUmV0dXJucyB0aGUgc2NoZW1hLCBzbyB5b3UgY2FuIGNoYWluIHRoaXMgY2FsbC5cbiAgICovXG4gIGRlbGV0ZUZpZWxkKG5hbWUpIHtcbiAgICB0aGlzLl9maWVsZHNbbmFtZV0gPSB7XG4gICAgICBfX29wOiAnRGVsZXRlJ1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRpbmcgYW4gSW5kZXggdG8gVXBkYXRlIG9uIGEgU2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGZpZWxkXG4gICAqIEByZXR1cm5zIHtQYXJzZS5TY2hlbWF9IFJldHVybnMgdGhlIHNjaGVtYSwgc28geW91IGNhbiBjaGFpbiB0aGlzIGNhbGwuXG4gICAqL1xuICBkZWxldGVJbmRleChuYW1lKSB7XG4gICAgdGhpcy5faW5kZXhlc1tuYW1lXSA9IHtcbiAgICAgIF9fb3A6ICdEZWxldGUnXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIHNlbmQoY2xhc3NOYW1lLCBtZXRob2QpIHtcbiAgICBsZXQgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QobWV0aG9kLCBgc2NoZW1hcy8ke2NsYXNzTmFtZX1gLCBwYXJhbXMsIHtcbiAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgIH0pO1xuICB9LFxuICBnZXQoY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZChjbGFzc05hbWUsICdHRVQnKTtcbiAgfSxcbiAgY3JlYXRlKGNsYXNzTmFtZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZChjbGFzc05hbWUsICdQT1NUJywgcGFyYW1zKTtcbiAgfSxcbiAgdXBkYXRlKGNsYXNzTmFtZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZChjbGFzc05hbWUsICdQVVQnLCBwYXJhbXMpO1xuICB9LFxuICBkZWxldGUoY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZChjbGFzc05hbWUsICdERUxFVEUnKTtcbiAgfSxcbiAgcHVyZ2UoY2xhc3NOYW1lKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdERUxFVEUnLCBgcHVyZ2UvJHtjbGFzc05hbWV9YCwge30sIHtcbiAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgIH0pO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0U2NoZW1hQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZVNjaGVtYTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfaXNSZXZvY2FibGVTZXNzaW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9pc1Jldm9jYWJsZVNlc3Npb25cIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xudmFyIF9QYXJzZVVzZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlVXNlclwiKSk7XG4vKipcbiAqIDxwPkEgUGFyc2UuU2Vzc2lvbiBvYmplY3QgaXMgYSBsb2NhbCByZXByZXNlbnRhdGlvbiBvZiBhIHJldm9jYWJsZSBzZXNzaW9uLlxuICogVGhpcyBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIGEgUGFyc2UuT2JqZWN0LCBhbmQgcmV0YWlucyB0aGUgc2FtZVxuICogZnVuY3Rpb25hbGl0eSBvZiBhIFBhcnNlLk9iamVjdC48L3A+XG4gKlxuICogQGFsaWFzIFBhcnNlLlNlc3Npb25cbiAqIEBhdWdtZW50cyBQYXJzZS5PYmplY3RcbiAqL1xuY2xhc3MgUGFyc2VTZXNzaW9uIGV4dGVuZHMgX1BhcnNlT2JqZWN0LmRlZmF1bHQge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgVGhlIGluaXRpYWwgc2V0IG9mIGRhdGEgdG8gc3RvcmUgaW4gdGhlIHVzZXIuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7XG4gICAgc3VwZXIoJ19TZXNzaW9uJyk7XG4gICAgaWYgKGF0dHJpYnV0ZXMgJiYgdHlwZW9mIGF0dHJpYnV0ZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoIXRoaXMuc2V0KGF0dHJpYnV0ZXMgfHwge30pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSBhbiBpbnZhbGlkIFNlc3Npb25cIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNlc3Npb24gdG9rZW4gc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0U2Vzc2lvblRva2VuKCkge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXQoJ3Nlc3Npb25Ub2tlbicpO1xuICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuICBzdGF0aWMgcmVhZE9ubHlBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ2NyZWF0ZWRXaXRoJywgJ2V4cGlyZXNBdCcsICdpbnN0YWxsYXRpb25JZCcsICdyZXN0cmljdGVkJywgJ3Nlc3Npb25Ub2tlbicsICd1c2VyJ107XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBTZXNzaW9uIG9iamVjdCBmb3IgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gc2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgdXNlTWFzdGVyS2V5XG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIFBhcnNlLlNlc3Npb25cbiAgICogb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuIGZldGNoZWQuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgdXNlciwgdGhlXG4gICAqIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U2Vzc2lvbkNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBzZXNzaW9uT3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgc2Vzc2lvbk9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIHJldHVybiBfUGFyc2VVc2VyLmRlZmF1bHQuY3VycmVudEFzeW5jKCkudGhlbih1c2VyID0+IHtcbiAgICAgIGlmICghdXNlcikge1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoJ1RoZXJlIGlzIG5vIGN1cnJlbnQgdXNlci4nKTtcbiAgICAgIH1cbiAgICAgIHNlc3Npb25PcHRpb25zLnNlc3Npb25Ub2tlbiA9IHVzZXIuZ2V0U2Vzc2lvblRva2VuKCk7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5nZXRTZXNzaW9uKHNlc3Npb25PcHRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc2Vzc2lvbiB0b2tlbiBpcyByZXZvY2FibGUuXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgbWlncmF0aW5nIEV4cHJlc3MuanMgb3IgTm9kZS5qcyB3ZWIgYXBwcyB0b1xuICAgKiB1c2UgcmV2b2NhYmxlIHNlc3Npb25zLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBhbiBhcHAgdGhhdCB1c2VzIHRoZSBQYXJzZVxuICAgKiBTREsgaW4gdGhlIGJyb3dzZXIgb25seSwgcGxlYXNlIHVzZSBQYXJzZS5Vc2VyLmVuYWJsZVJldm9jYWJsZVNlc3Npb24oKVxuICAgKiBpbnN0ZWFkLCBzbyB0aGF0IHNlc3Npb25zIGNhbiBiZSBhdXRvbWF0aWNhbGx5IHVwZ3JhZGVkLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzQ3VycmVudFNlc3Npb25SZXZvY2FibGUoKSB7XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBfUGFyc2VVc2VyLmRlZmF1bHQuY3VycmVudCgpO1xuICAgIGlmIChjdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuICgwLCBfaXNSZXZvY2FibGVTZXNzaW9uLmRlZmF1bHQpKGN1cnJlbnRVc2VyLmdldFNlc3Npb25Ub2tlbigpIHx8ICcnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5fUGFyc2VPYmplY3QuZGVmYXVsdC5yZWdpc3RlclN1YmNsYXNzKCdfU2Vzc2lvbicsIFBhcnNlU2Vzc2lvbik7XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgZ2V0U2Vzc2lvbihvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgUGFyc2VTZXNzaW9uKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICdzZXNzaW9ucy9tZScsIHt9LCBvcHRpb25zKS50aGVuKHNlc3Npb25EYXRhID0+IHtcbiAgICAgIHNlc3Npb24uX2ZpbmlzaEZldGNoKHNlc3Npb25EYXRhKTtcbiAgICAgIHNlc3Npb24uX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICB9KTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFNlc3Npb25Db250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFBhcnNlU2Vzc2lvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkyID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5MihleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3Byb21pc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3Byb21pc2VcIikpO1xudmFyIF9kZWZpbmVQcm9wZXJ0eSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKSk7XG52YXIgX3N0cmluZ2lmeSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvanNvbi9zdHJpbmdpZnlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9pc1Jldm9jYWJsZVNlc3Npb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2lzUmV2b2NhYmxlU2Vzc2lvblwiKSk7XG52YXIgX1BhcnNlRXJyb3IgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRXJyb3JcIikpO1xudmFyIF9QYXJzZU9iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VPYmplY3RcIikpO1xudmFyIF9TdG9yYWdlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9TdG9yYWdlXCIpKTtcbmNvbnN0IENVUlJFTlRfVVNFUl9LRVkgPSAnY3VycmVudFVzZXInO1xubGV0IGNhblVzZUN1cnJlbnRVc2VyID0gIV9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSVNfTk9ERScpO1xubGV0IGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzayA9IGZhbHNlO1xubGV0IGN1cnJlbnRVc2VyQ2FjaGUgPSBudWxsO1xuY29uc3QgYXV0aFByb3ZpZGVycyA9IHt9O1xuXG4vKipcbiAqIDxwPkEgUGFyc2UuVXNlciBvYmplY3QgaXMgYSBsb2NhbCByZXByZXNlbnRhdGlvbiBvZiBhIHVzZXIgcGVyc2lzdGVkIHRvIHRoZVxuICogUGFyc2UgY2xvdWQuIFRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiBhIFBhcnNlLk9iamVjdCwgYW5kIHJldGFpbnMgdGhlXG4gKiBzYW1lIGZ1bmN0aW9uYWxpdHkgb2YgYSBQYXJzZS5PYmplY3QsIGJ1dCBhbHNvIGV4dGVuZHMgaXQgd2l0aCB2YXJpb3VzXG4gKiB1c2VyIHNwZWNpZmljIG1ldGhvZHMsIGxpa2UgYXV0aGVudGljYXRpb24sIHNpZ25pbmcgdXAsIGFuZCB2YWxpZGF0aW9uIG9mXG4gKiB1bmlxdWVuZXNzLjwvcD5cbiAqXG4gKiBAYWxpYXMgUGFyc2UuVXNlclxuICogQGF1Z21lbnRzIFBhcnNlLk9iamVjdFxuICovXG5jbGFzcyBQYXJzZVVzZXIgZXh0ZW5kcyBfUGFyc2VPYmplY3QuZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyBUaGUgaW5pdGlhbCBzZXQgb2YgZGF0YSB0byBzdG9yZSBpbiB0aGUgdXNlci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHtcbiAgICBzdXBlcignX1VzZXInKTtcbiAgICBpZiAoYXR0cmlidXRlcyAmJiB0eXBlb2YgYXR0cmlidXRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICghdGhpcy5zZXQoYXR0cmlidXRlcyB8fCB7fSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIGFuIGludmFsaWQgUGFyc2UgVXNlclwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBhIHJldm9jYWJsZSBzZXNzaW9uIHRva2VuIHRvIHJlcGxhY2UgdGhlIG9sZGVyIHN0eWxlIG9mIHRva2VuLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiB0aGUgcmVwbGFjZW1lbnRcbiAgICogICB0b2tlbiBoYXMgYmVlbiBmZXRjaGVkLlxuICAgKi9cbiAgX3VwZ3JhZGVUb1Jldm9jYWJsZVNlc3Npb24ob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHVwZ3JhZGVPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICB1cGdyYWRlT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIudXBncmFkZVRvUmV2b2NhYmxlU2Vzc2lvbih0aGlzLCB1cGdyYWRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYWxsb3dzIHlvdSB0byBsaW5rIHlvdXIgdXNlcnMgd2l0aCB7QGxpbmsgaHR0cHM6Ly9kb2NzLnBhcnNlcGxhdGZvcm0ub3JnL3BhcnNlLXNlcnZlci9ndWlkZS8jb2F1dGgtYW5kLTNyZC1wYXJ0eS1hdXRoZW50aWNhdGlvbiAzcmQgcGFydHkgYXV0aGVudGljYXRpb259LCBlbmFibGluZ1xuICAgKiB5b3VyIHVzZXJzIHRvIHNpZ24gdXAgb3IgbG9nIGludG8geW91ciBhcHBsaWNhdGlvbiB1c2luZyB0aGVpciBleGlzdGluZyBpZGVudGl0aWVzLlxuICAgKiBTaW5jZSAyLjkuMFxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvanMvZ3VpZGUvI2xpbmtpbmctdXNlcnMgTGlua2luZyBVc2Vyc31cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBdXRoUHJvdmlkZXJ9IHByb3ZpZGVyIE5hbWUgb2YgYXV0aCBwcm92aWRlciBvciB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9BdXRoUHJvdmlkZXIuaHRtbCBBdXRoUHJvdmlkZXJ9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy5hdXRoRGF0YV0gQXV0aERhdGEgdG8gbGluayB3aXRoXG4gICAqIDx1bD5cbiAgICogICA8bGk+SWYgcHJvdmlkZXIgaXMgc3RyaW5nLCBvcHRpb25zIGlzIHtAbGluayBodHRwOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9wYXJzZS1zZXJ2ZXIvZ3VpZGUvI3N1cHBvcnRlZC0zcmQtcGFydHktYXV0aGVudGljYXRpb25zIGF1dGhEYXRhfVxuICAgKiAgIDxsaT5JZiBwcm92aWRlciBpcyBBdXRoUHJvdmlkZXIsIG9wdGlvbnMgaXMgc2F2ZU9wdHNcbiAgICogPC91bD5cbiAgICogQHBhcmFtIHtvYmplY3R9IHNhdmVPcHRzIHVzZU1hc3RlcktleSAvIHNlc3Npb25Ub2tlblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgaXMgbGlua2VkXG4gICAqL1xuICBsaW5rV2l0aChwcm92aWRlciwgb3B0aW9ucykge1xuICAgIGxldCBzYXZlT3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgc2F2ZU9wdHMuc2Vzc2lvblRva2VuID0gc2F2ZU9wdHMuc2Vzc2lvblRva2VuIHx8IHRoaXMuZ2V0U2Vzc2lvblRva2VuKCkgfHwgJyc7XG4gICAgbGV0IGF1dGhUeXBlO1xuICAgIGlmICh0eXBlb2YgcHJvdmlkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBhdXRoVHlwZSA9IHByb3ZpZGVyO1xuICAgICAgaWYgKGF1dGhQcm92aWRlcnNbcHJvdmlkZXJdKSB7XG4gICAgICAgIHByb3ZpZGVyID0gYXV0aFByb3ZpZGVyc1twcm92aWRlcl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhdXRoUHJvdmlkZXIgPSB7XG4gICAgICAgICAgcmVzdG9yZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBnZXRBdXRoVHlwZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBhdXRoVHlwZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGF1dGhQcm92aWRlcnNbYXV0aFByb3ZpZGVyLmdldEF1dGhUeXBlKCldID0gYXV0aFByb3ZpZGVyO1xuICAgICAgICBwcm92aWRlciA9IGF1dGhQcm92aWRlcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXV0aFR5cGUgPSBwcm92aWRlci5nZXRBdXRoVHlwZSgpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhhc093blByb3BlcnR5KCdhdXRoRGF0YScpKSB7XG4gICAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpIHx8IHt9O1xuICAgICAgaWYgKHR5cGVvZiBhdXRoRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHR5cGU6IGF1dGhEYXRhIGZpZWxkIHNob3VsZCBiZSBhbiBvYmplY3QnKTtcbiAgICAgIH1cbiAgICAgIGF1dGhEYXRhW2F1dGhUeXBlXSA9IG9wdGlvbnMuYXV0aERhdGE7XG4gICAgICBjb25zdCBvbGRBbm9ueW1vdXNEYXRhID0gYXV0aERhdGEuYW5vbnltb3VzO1xuICAgICAgdGhpcy5zdHJpcEFub255bWl0eSgpO1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgICByZXR1cm4gY29udHJvbGxlci5saW5rV2l0aCh0aGlzLCBhdXRoRGF0YSwgc2F2ZU9wdHMpLmNhdGNoKGUgPT4ge1xuICAgICAgICBkZWxldGUgYXV0aERhdGFbYXV0aFR5cGVdO1xuICAgICAgICB0aGlzLnJlc3RvcmVBbm9uaW1pdHkob2xkQW5vbnltb3VzRGF0YSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcHJvdmlkZXIuYXV0aGVudGljYXRlKHtcbiAgICAgICAgICBzdWNjZXNzOiAocHJvdmlkZXIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHt9O1xuICAgICAgICAgICAgb3B0cy5hdXRoRGF0YSA9IHJlc3VsdDtcbiAgICAgICAgICAgIHRoaXMubGlua1dpdGgocHJvdmlkZXIsIG9wdHMsIHNhdmVPcHRzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChwcm92aWRlciwgZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLmF1dGhEYXRhXVxuICAgKiBAcGFyYW0gc2F2ZU9wdHNcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgMi45LjAgc2VlIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlVzZXIuaHRtbCNsaW5rV2l0aCBsaW5rV2l0aH1cbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBfbGlua1dpdGgocHJvdmlkZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgc2F2ZU9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHJldHVybiB0aGlzLmxpbmtXaXRoKHByb3ZpZGVyLCBvcHRpb25zLCBzYXZlT3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25pemVzIGF1dGggZGF0YSBmb3IgYSBwcm92aWRlciAoZS5nLiBwdXRzIHRoZSBhY2Nlc3MgdG9rZW4gaW4gdGhlXG4gICAqIHJpZ2h0IHBsYWNlIHRvIGJlIHVzZWQgYnkgdGhlIEZhY2Vib29rIFNESykuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlclxuICAgKi9cbiAgX3N5bmNocm9uaXplQXV0aERhdGEocHJvdmlkZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNDdXJyZW50KCkgfHwgIXByb3ZpZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBhdXRoVHlwZTtcbiAgICBpZiAodHlwZW9mIHByb3ZpZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgYXV0aFR5cGUgPSBwcm92aWRlcjtcbiAgICAgIHByb3ZpZGVyID0gYXV0aFByb3ZpZGVyc1thdXRoVHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGF1dGhUeXBlID0gcHJvdmlkZXIuZ2V0QXV0aFR5cGUoKTtcbiAgICB9XG4gICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKTtcbiAgICBpZiAoIXByb3ZpZGVyIHx8ICFhdXRoRGF0YSB8fCB0eXBlb2YgYXV0aERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN1Y2Nlc3MgPSBwcm92aWRlci5yZXN0b3JlQXV0aGVudGljYXRpb24oYXV0aERhdGFbYXV0aFR5cGVdKTtcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuX3VubGlua0Zyb20ocHJvdmlkZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbml6ZXMgYXV0aERhdGEgZm9yIGFsbCBwcm92aWRlcnMuXG4gICAqL1xuICBfc3luY2hyb25pemVBbGxBdXRoRGF0YSgpIHtcbiAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpO1xuICAgIGlmICh0eXBlb2YgYXV0aERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGF1dGhEYXRhKSB7XG4gICAgICB0aGlzLl9zeW5jaHJvbml6ZUF1dGhEYXRhKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgbnVsbCB2YWx1ZXMgZnJvbSBhdXRoRGF0YSAod2hpY2ggZXhpc3QgdGVtcG9yYXJpbHkgZm9yIHVubGlua2luZylcbiAgICovXG4gIF9jbGVhbnVwQXV0aERhdGEoKSB7XG4gICAgaWYgKCF0aGlzLmlzQ3VycmVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGF1dGhEYXRhID0gdGhpcy5nZXQoJ2F1dGhEYXRhJyk7XG4gICAgaWYgKHR5cGVvZiBhdXRoRGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gYXV0aERhdGEpIHtcbiAgICAgIGlmICghYXV0aERhdGFba2V5XSkge1xuICAgICAgICBkZWxldGUgYXV0aERhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5saW5rcyBhIHVzZXIgZnJvbSBhIHNlcnZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXV0aFByb3ZpZGVyfSBwcm92aWRlciBOYW1lIG9mIGF1dGggcHJvdmlkZXIgb3Ige0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvQXV0aFByb3ZpZGVyLmh0bWwgQXV0aFByb3ZpZGVyfVxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBNYXN0ZXJLZXkgLyBTZXNzaW9uVG9rZW5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aGVuIHRoZSB1bmxpbmtpbmdcbiAgICogICAgIGZpbmlzaGVzLlxuICAgKi9cbiAgX3VubGlua0Zyb20ocHJvdmlkZXIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5saW5rV2l0aChwcm92aWRlciwge1xuICAgICAgYXV0aERhdGE6IG51bGxcbiAgICB9LCBvcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX3N5bmNocm9uaXplQXV0aERhdGEocHJvdmlkZXIpO1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIHVzZXIgaXMgbGlua2VkIHRvIGEgc2VydmljZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHByb3ZpZGVyIHNlcnZpY2UgdG8gbGluayB0b1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBsaW5rIHdhcyBzdWNjZXNzZnVsXG4gICAqL1xuICBfaXNMaW5rZWQocHJvdmlkZXIpIHtcbiAgICBsZXQgYXV0aFR5cGU7XG4gICAgaWYgKHR5cGVvZiBwcm92aWRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGF1dGhUeXBlID0gcHJvdmlkZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF1dGhUeXBlID0gcHJvdmlkZXIuZ2V0QXV0aFR5cGUoKTtcbiAgICB9XG4gICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKSB8fCB7fTtcbiAgICBpZiAodHlwZW9mIGF1dGhEYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gISFhdXRoRGF0YVthdXRoVHlwZV07XG4gIH1cblxuICAvKipcbiAgICogRGVhdXRoZW50aWNhdGVzIGFsbCBwcm92aWRlcnMuXG4gICAqL1xuICBfbG9nT3V0V2l0aEFsbCgpIHtcbiAgICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZ2V0KCdhdXRoRGF0YScpO1xuICAgIGlmICh0eXBlb2YgYXV0aERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIGF1dGhEYXRhKSB7XG4gICAgICB0aGlzLl9sb2dPdXRXaXRoKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlYXV0aGVudGljYXRlcyBhIHNpbmdsZSBwcm92aWRlciAoZS5nLiByZW1vdmluZyBhY2Nlc3MgdG9rZW5zIGZyb20gdGhlXG4gICAqIEZhY2Vib29rIFNESykuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwcm92aWRlciBzZXJ2aWNlIHRvIGxvZ291dCBvZlxuICAgKi9cbiAgX2xvZ091dFdpdGgocHJvdmlkZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNDdXJyZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm92aWRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHByb3ZpZGVyID0gYXV0aFByb3ZpZGVyc1twcm92aWRlcl07XG4gICAgfVxuICAgIGlmIChwcm92aWRlciAmJiBwcm92aWRlci5kZWF1dGhlbnRpY2F0ZSkge1xuICAgICAgcHJvdmlkZXIuZGVhdXRoZW50aWNhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xhc3MgaW5zdGFuY2UgbWV0aG9kIHVzZWQgdG8gbWFpbnRhaW4gc3BlY2lmaWMga2V5cyB3aGVuIGEgZmV0Y2ggb2NjdXJzLlxuICAgKiBVc2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBzZXNzaW9uIHRva2VuIGlzIG5vdCBsb3N0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBzZXNzaW9uVG9rZW5cbiAgICovXG4gIF9wcmVzZXJ2ZUZpZWxkc09uRmV0Y2goKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb25Ub2tlbjogdGhpcy5nZXQoJ3Nlc3Npb25Ub2tlbicpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgPGNvZGU+Y3VycmVudDwvY29kZT4gd291bGQgcmV0dXJuIHRoaXMgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdXNlciBpcyBjYWNoZWQgb24gZGlza1xuICAgKi9cbiAgaXNDdXJyZW50KCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBQYXJzZVVzZXIuY3VycmVudCgpO1xuICAgIHJldHVybiAhIWN1cnJlbnQgJiYgY3VycmVudC5pZCA9PT0gdGhpcy5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgPGNvZGU+Y3VycmVudDwvY29kZT4gd291bGQgcmV0dXJuIHRoaXMgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IHRydWUgaWYgdXNlciBpcyBjYWNoZWQgb24gZGlza1xuICAgKi9cbiAgYXN5bmMgaXNDdXJyZW50QXN5bmMoKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IFBhcnNlVXNlci5jdXJyZW50QXN5bmMoKTtcbiAgICByZXR1cm4gISFjdXJyZW50ICYmIGN1cnJlbnQuaWQgPT09IHRoaXMuaWQ7XG4gIH1cbiAgc3RyaXBBbm9ueW1pdHkoKSB7XG4gICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKTtcbiAgICBpZiAoYXV0aERhdGEgJiYgdHlwZW9mIGF1dGhEYXRhID09PSAnb2JqZWN0JyAmJiBhdXRoRGF0YS5oYXNPd25Qcm9wZXJ0eSgnYW5vbnltb3VzJykpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gc2V0IGFub255bW91cyB0byBudWxsIGluc3RlYWQgb2YgZGVsZXRpbmcgaXQgaW4gb3JkZXIgdG8gcmVtb3ZlIGl0IGZyb20gUGFyc2UuXG4gICAgICBhdXRoRGF0YS5hbm9ueW1vdXMgPSBudWxsO1xuICAgIH1cbiAgfVxuICByZXN0b3JlQW5vbmltaXR5KGFub255bW91c0RhdGEpIHtcbiAgICBpZiAoYW5vbnltb3VzRGF0YSkge1xuICAgICAgY29uc3QgYXV0aERhdGEgPSB0aGlzLmdldCgnYXV0aERhdGEnKTtcbiAgICAgIGF1dGhEYXRhLmFub255bW91cyA9IGFub255bW91c0RhdGE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZ2V0KFwidXNlcm5hbWVcIikuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRVc2VybmFtZSgpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZ2V0KCd1c2VybmFtZScpO1xuICAgIGlmICh1c2VybmFtZSA9PSBudWxsIHx8IHR5cGVvZiB1c2VybmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB1c2VybmFtZTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHNldChcInVzZXJuYW1lXCIsIHVzZXJuYW1lLCBvcHRpb25zKSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWVcbiAgICovXG4gIHNldFVzZXJuYW1lKHVzZXJuYW1lKSB7XG4gICAgdGhpcy5zdHJpcEFub255bWl0eSgpO1xuICAgIHRoaXMuc2V0KCd1c2VybmFtZScsIHVzZXJuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBzZXQoXCJwYXNzd29yZFwiLCBwYXNzd29yZCwgb3B0aW9ucykgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFVzZXIncyBQYXNzd29yZFxuICAgKi9cbiAgc2V0UGFzc3dvcmQocGFzc3dvcmQpIHtcbiAgICB0aGlzLnNldCgncGFzc3dvcmQnLCBwYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBnZXQoXCJlbWFpbFwiKS5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gVXNlcidzIEVtYWlsXG4gICAqL1xuICBnZXRFbWFpbCgpIHtcbiAgICBjb25zdCBlbWFpbCA9IHRoaXMuZ2V0KCdlbWFpbCcpO1xuICAgIGlmIChlbWFpbCA9PSBudWxsIHx8IHR5cGVvZiBlbWFpbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbWFpbDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHNldChcImVtYWlsXCIsIGVtYWlsKSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW1haWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzZXRFbWFpbChlbWFpbCkge1xuICAgIHJldHVybiB0aGlzLnNldCgnZW1haWwnLCBlbWFpbCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiB0b2tlbiBmb3IgdGhpcyB1c2VyLCBpZiB0aGUgdXNlciBoYXMgYmVlbiBsb2dnZWQgaW4sXG4gICAqIG9yIGlmIGl0IGlzIHRoZSByZXN1bHQgb2YgYSBxdWVyeSB3aXRoIHRoZSBtYXN0ZXIga2V5LiBPdGhlcndpc2UsIHJldHVybnNcbiAgICogdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgc2Vzc2lvbiB0b2tlbiwgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRTZXNzaW9uVG9rZW4oKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldCgnc2Vzc2lvblRva2VuJyk7XG4gICAgaWYgKHRva2VuID09IG51bGwgfHwgdHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyB1c2VyIGlzIHRoZSBjdXJyZW50IHVzZXIgYW5kIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoaXMgdXNlciBpcyB0aGUgY3VycmVudCB1c2VyIGFuZCBpcyBsb2dnZWQgaW4uXG4gICAqL1xuICBhdXRoZW50aWNhdGVkKCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBQYXJzZVVzZXIuY3VycmVudCgpO1xuICAgIHJldHVybiAhIXRoaXMuZ2V0KCdzZXNzaW9uVG9rZW4nKSAmJiAhIWN1cnJlbnQgJiYgY3VycmVudC5pZCA9PT0gdGhpcy5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB1cCBhIG5ldyB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBpbnN0ZWFkIG9mIHNhdmUgZm9yXG4gICAqIG5ldyBQYXJzZS5Vc2Vycy4gVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyBQYXJzZS5Vc2VyIG9uIHRoZSBzZXJ2ZXIsIGFuZFxuICAgKiBhbHNvIHBlcnNpc3QgdGhlIHNlc3Npb24gb24gZGlzayBzbyB0aGF0IHlvdSBjYW4gYWNjZXNzIHRoZSB1c2VyIHVzaW5nXG4gICAqIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LlxuICAgKlxuICAgKiA8cD5BIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyBzaWduVXAuPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cnMgRXh0cmEgZmllbGRzIHRvIHNldCBvbiB0aGUgbmV3IHVzZXIsIG9yIG51bGwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiB0aGUgc2lnbnVwXG4gICAqICAgICBmaW5pc2hlcy5cbiAgICovXG4gIHNpZ25VcChhdHRycywgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHNpZ251cE9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIHNpZ251cE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCdpbnN0YWxsYXRpb25JZCcpKSB7XG4gICAgICBzaWdudXBPcHRpb25zLmluc3RhbGxhdGlvbklkID0gb3B0aW9ucy5pbnN0YWxsYXRpb25JZDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2NvbnRleHQnKSAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob3B0aW9ucy5jb250ZXh0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHNpZ251cE9wdGlvbnMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnblVwKHRoaXMsIGF0dHJzLCBzaWdudXBPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGluIGEgUGFyc2UuVXNlci4gT24gc3VjY2VzcywgdGhpcyBzYXZlcyB0aGUgc2Vzc2lvbiB0byBkaXNrLFxuICAgKiBzbyB5b3UgY2FuIHJldHJpZXZlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgdXNpbmdcbiAgICogPGNvZGU+Y3VycmVudDwvY29kZT4uXG4gICAqXG4gICAqIDxwPkEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIGxvZ0luLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIHdoZW5cbiAgICogICAgIHRoZSBsb2dpbiBpcyBjb21wbGV0ZS5cbiAgICovXG4gIGxvZ0luKCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBsb2dpbk9wdGlvbnMgPSB7XG4gICAgICB1c2VQb3N0OiB0cnVlXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGxvZ2luT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2luc3RhbGxhdGlvbklkJykpIHtcbiAgICAgIGxvZ2luT3B0aW9ucy5pbnN0YWxsYXRpb25JZCA9IG9wdGlvbnMuaW5zdGFsbGF0aW9uSWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VQb3N0JykpIHtcbiAgICAgIGxvZ2luT3B0aW9ucy51c2VQb3N0ID0gb3B0aW9ucy51c2VQb3N0O1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvcHRpb25zLmNvbnRleHQpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgbG9naW5PcHRpb25zLmNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmxvZ0luKHRoaXMsIGxvZ2luT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZGVmYXVsdCBzYXZlIGJlaGF2aW9yIHdpdGggZnVuY3Rpb25hbGl0eSB0byBzYXZlIHRvIGxvY2FsXG4gICAqIHN0b3JhZ2UgaWYgdGhpcyBpcyBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLnNhdmUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuaXNDdXJyZW50QXN5bmMoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCkudXBkYXRlVXNlck9uRGlzayh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZGVmYXVsdCBkZXN0cm95IGJlaGF2aW9yIHdpdGggZnVuY3Rpb25hbGl0eSB0aGF0IGxvZ3Mgb3V0XG4gICAqIHRoZSBjdXJyZW50IHVzZXIgd2hlbiBpdCBpcyBkZXN0cm95ZWRcbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1BhcnNlLlVzZXJ9XG4gICAqL1xuICBhc3luYyBkZXN0cm95KCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cbiAgICBhd2FpdCBzdXBlci5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmlzQ3VycmVudEFzeW5jKCk7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpLnJlbW92ZVVzZXJGcm9tRGlzaygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBkZWZhdWx0IGZldGNoIGJlaGF2aW9yIHdpdGggZnVuY3Rpb25hbGl0eSB0byBzYXZlIHRvIGxvY2FsXG4gICAqIHN0b3JhZ2UgaWYgdGhpcyBpcyBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQYXJzZS5Vc2VyfVxuICAgKi9cbiAgYXN5bmMgZmV0Y2goKSB7XG4gICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICBhcmdzW19rZXkzXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmZldGNoLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmlzQ3VycmVudEFzeW5jKCk7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpLnVwZGF0ZVVzZXJPbkRpc2sodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIGRlZmF1bHQgZmV0Y2hXaXRoSW5jbHVkZSBiZWhhdmlvciB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gc2F2ZSB0byBsb2NhbFxuICAgKiBzdG9yYWdlIGlmIHRoaXMgaXMgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UGFyc2UuVXNlcn1cbiAgICovXG4gIGFzeW5jIGZldGNoV2l0aEluY2x1ZGUoKSB7XG4gICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW40KSwgX2tleTQgPSAwOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICBhcmdzW19rZXk0XSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gICAgfVxuICAgIGF3YWl0IHN1cGVyLmZldGNoV2l0aEluY2x1ZGUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuaXNDdXJyZW50QXN5bmMoKTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgcmV0dXJuIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCkudXBkYXRlVXNlck9uRGlzayh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHdoZXRoZXIgYSBnaXZlbiBwYXNzd29yZCBpcyB0aGUgcGFzc3dvcmQgb2YgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBiZSB2ZXJpZmllZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgVGhlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaWdub3JlRW1haWxWZXJpZmljYXRpb25dIFNldCB0byBgdHJ1ZWAgdG8gYnlwYXNzIGVtYWlsIHZlcmlmaWNhdGlvbiBhbmQgdmVyaWZ5XG4gICAqIHRoZSBwYXNzd29yZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGVtYWlsIGhhcyBiZWVuIHZlcmlmaWVkLiBUaGlzIHJlcXVpcmVzIHRoZSBtYXN0ZXIga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSB1c2VyIHdoZW4gdGhlIHBhc3N3b3JkIGlzIGNvcnJlY3QuXG4gICAqL1xuICB2ZXJpZnlQYXNzd29yZChwYXNzd29yZCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5nZXRVc2VybmFtZSgpIHx8ICcnO1xuICAgIHJldHVybiBQYXJzZVVzZXIudmVyaWZ5UGFzc3dvcmQodXNlcm5hbWUsIHBhc3N3b3JkLCBvcHRpb25zKTtcbiAgfVxuICBzdGF0aWMgcmVhZE9ubHlBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ3Nlc3Npb25Ub2tlbiddO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZnVuY3Rpb25hbGl0eSB0byB0aGUgZXhpc3RpbmcgUGFyc2UuVXNlciBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHByb3RvUHJvcHMgQSBzZXQgb2YgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIHByb3RvdHlwZVxuICAgKiBAcGFyYW0ge29iamVjdH0gY2xhc3NQcm9wcyBBIHNldCBvZiBzdGF0aWMgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIGNsYXNzXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1BhcnNlLlVzZXJ9IFRoZSBuZXdseSBleHRlbmRlZCBQYXJzZS5Vc2VyIGNsYXNzXG4gICAqL1xuICBzdGF0aWMgZXh0ZW5kKHByb3RvUHJvcHMsIGNsYXNzUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykge1xuICAgICAgZm9yIChjb25zdCBwcm9wIGluIHByb3RvUHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjbGFzc05hbWUnKSB7XG4gICAgICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eS5kZWZhdWx0KShQYXJzZVVzZXIucHJvdG90eXBlLCBwcm9wLCB7XG4gICAgICAgICAgICB2YWx1ZTogcHJvdG9Qcm9wc1twcm9wXSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2xhc3NQcm9wcykge1xuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGNsYXNzUHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjbGFzc05hbWUnKSB7XG4gICAgICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eS5kZWZhdWx0KShQYXJzZVVzZXIsIHByb3AsIHtcbiAgICAgICAgICAgIHZhbHVlOiBjbGFzc1Byb3BzW3Byb3BdLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQYXJzZVVzZXI7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIFBhcnNlVXNlciB3aXRoIGEgdmFsaWQgc2Vzc2lvbixcbiAgICogZWl0aGVyIGZyb20gbWVtb3J5IG9yIGxvY2FsU3RvcmFnZSwgaWYgbmVjZXNzYXJ5LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9IFRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIFBhcnNlLlVzZXIuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpIHtcbiAgICBpZiAoIWNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuY3VycmVudFVzZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gUGFyc2VVc2VyIGZyb20gYXN5bmNocm9ub3VzIFN0b3JhZ2UuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIGN1cnJlbnRseVxuICAgKiAgIGxvZ2dlZCBpbiBQYXJzZSBVc2VyXG4gICAqL1xuICBzdGF0aWMgY3VycmVudEFzeW5jKCkge1xuICAgIGlmICghY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUobnVsbCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmN1cnJlbnRVc2VyQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB1cCBhIG5ldyB1c2VyIHdpdGggYSB1c2VybmFtZSAob3IgZW1haWwpIGFuZCBwYXNzd29yZC5cbiAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyBQYXJzZS5Vc2VyIG9uIHRoZSBzZXJ2ZXIsIGFuZCBhbHNvIHBlcnNpc3QgdGhlXG4gICAqIHNlc3Npb24gaW4gbG9jYWxTdG9yYWdlIHNvIHRoYXQgeW91IGNhbiBhY2Nlc3MgdGhlIHVzZXIgdXNpbmdcbiAgICoge0BsaW5rICNjdXJyZW50fS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJuYW1lIFRoZSB1c2VybmFtZSAob3IgZW1haWwpIHRvIHNpZ24gdXAgd2l0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byBzaWduIHVwIHdpdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRycyBFeHRyYSBmaWVsZHMgdG8gc2V0IG9uIHRoZSBuZXcgdXNlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgd2hlblxuICAgKiAgICAgdGhlIHNpZ251cCBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgc2lnblVwKHVzZXJuYW1lLCBwYXNzd29yZCwgYXR0cnMsIG9wdGlvbnMpIHtcbiAgICBhdHRycyA9IGF0dHJzIHx8IHt9O1xuICAgIGF0dHJzLnVzZXJuYW1lID0gdXNlcm5hbWU7XG4gICAgYXR0cnMucGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoYXR0cnMpO1xuICAgIHJldHVybiB1c2VyLnNpZ25VcCh7fSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBpbiBhIHVzZXIgd2l0aCBhIHVzZXJuYW1lIChvciBlbWFpbCkgYW5kIHBhc3N3b3JkLiBPbiBzdWNjZXNzLCB0aGlzXG4gICAqIHNhdmVzIHRoZSBzZXNzaW9uIHRvIGRpc2ssIHNvIHlvdSBjYW4gcmV0cmlldmUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW5cbiAgICogdXNlciB1c2luZyA8Y29kZT5jdXJyZW50PC9jb2RlPi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJuYW1lIFRoZSB1c2VybmFtZSAob3IgZW1haWwpIHRvIGxvZyBpbiB3aXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGxvZyBpbiB3aXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCB0aGUgdXNlciB3aGVuXG4gICAqICAgICB0aGUgbG9naW4gY29tcGxldGVzLlxuICAgKi9cbiAgc3RhdGljIGxvZ0luKHVzZXJuYW1lLCBwYXNzd29yZCwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgdXNlcm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ1VzZXJuYW1lIG11c3QgYmUgYSBzdHJpbmcuJykpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhc3N3b3JkICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdQYXNzd29yZCBtdXN0IGJlIGEgc3RyaW5nLicpKTtcbiAgICB9XG4gICAgY29uc3QgdXNlciA9IG5ldyB0aGlzKCk7XG4gICAgdXNlci5fZmluaXNoRmV0Y2goe1xuICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkXG4gICAgfSk7XG4gICAgcmV0dXJuIHVzZXIubG9nSW4ob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBpbiBhIHVzZXIgd2l0aCBhIHVzZXJuYW1lIChvciBlbWFpbCkgYW5kIHBhc3N3b3JkLCBhbmQgYXV0aERhdGEuIE9uIHN1Y2Nlc3MsIHRoaXNcbiAgICogc2F2ZXMgdGhlIHNlc3Npb24gdG8gZGlzaywgc28geW91IGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudGx5IGxvZ2dlZCBpblxuICAgKiB1c2VyIHVzaW5nIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIChvciBlbWFpbCkgdG8gbG9nIGluIHdpdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gbG9nIGluIHdpdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdXRoRGF0YSBUaGUgYXV0aERhdGEgdG8gbG9nIGluIHdpdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIHdoZW5cbiAgICogICAgIHRoZSBsb2dpbiBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgbG9nSW5XaXRoQWRkaXRpb25hbEF1dGgodXNlcm5hbWUsIHBhc3N3b3JkLCBhdXRoRGF0YSwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgdXNlcm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ1VzZXJuYW1lIG11c3QgYmUgYSBzdHJpbmcuJykpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhc3N3b3JkICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdQYXNzd29yZCBtdXN0IGJlIGEgc3RyaW5nLicpKTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhdXRoRGF0YSkgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ0F1dGggbXVzdCBiZSBhbiBvYmplY3QuJykpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICB1c2VyLl9maW5pc2hGZXRjaCh7XG4gICAgICB1c2VybmFtZTogdXNlcm5hbWUsXG4gICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICBhdXRoRGF0YVxuICAgIH0pO1xuICAgIHJldHVybiB1c2VyLmxvZ0luKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW4gYSB1c2VyIHdpdGggYW4gb2JqZWN0SWQuIE9uIHN1Y2Nlc3MsIHRoaXMgc2F2ZXMgdGhlIHNlc3Npb25cbiAgICogdG8gZGlzaywgc28geW91IGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIHVzaW5nXG4gICAqIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklkIFRoZSBvYmplY3RJZCBmb3IgdGhlIHVzZXIuXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIHdoZW5cbiAgICogICAgIHRoZSBsb2dpbiBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgbG9naW5Bcyh1c2VySWQpIHtcbiAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgdGhyb3cgbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5VU0VSTkFNRV9NSVNTSU5HLCAnQ2Fubm90IGxvZyBpbiBhcyB1c2VyIHdpdGggYW4gZW1wdHkgdXNlciBpZCcpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5sb2dpbkFzKHVzZXIsIHVzZXJJZCk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBpbiBhIHVzZXIgd2l0aCBhIHNlc3Npb24gdG9rZW4uIE9uIHN1Y2Nlc3MsIHRoaXMgc2F2ZXMgdGhlIHNlc3Npb25cbiAgICogdG8gZGlzaywgc28geW91IGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIHVzaW5nXG4gICAqIDxjb2RlPmN1cnJlbnQ8L2NvZGU+LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblRva2VuIFRoZSBzZXNzaW9uVG9rZW4gdG8gbG9nIGluIHdpdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIHdoZW5cbiAgICogICAgIHRoZSBsb2dpbiBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgYmVjb21lKHNlc3Npb25Ub2tlbiwgb3B0aW9ucykge1xuICAgIGlmICghY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSXQgaXMgbm90IG1lbW9yeS1zYWZlIHRvIGJlY29tZSBhIHVzZXIgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQnKTtcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgYmVjb21lT3B0aW9ucyA9IHtcbiAgICAgIHNlc3Npb25Ub2tlbjogc2Vzc2lvblRva2VuXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICAgIGJlY29tZU9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmJlY29tZSh1c2VyLCBiZWNvbWVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB1c2VyIHdpdGggYSBzZXNzaW9uIHRva2VuLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblRva2VuIFRoZSBzZXNzaW9uVG9rZW4gdG8gZ2V0IHVzZXIgd2l0aC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggdGhlIHVzZXIgaXMgZmV0Y2hlZC5cbiAgICovXG4gIHN0YXRpYyBtZShzZXNzaW9uVG9rZW4pIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgY29uc3QgbWVPcHRpb25zID0ge1xuICAgICAgc2Vzc2lvblRva2VuOiBzZXNzaW9uVG9rZW5cbiAgICB9O1xuICAgIGlmIChvcHRpb25zLnVzZU1hc3RlcktleSkge1xuICAgICAgbWVPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIH1cbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICByZXR1cm4gY29udHJvbGxlci5tZSh1c2VyLCBtZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgaW4gYSB1c2VyIHdpdGggYSBzZXNzaW9uIHRva2VuLiBPbiBzdWNjZXNzLCB0aGlzIHNhdmVzIHRoZSBzZXNzaW9uXG4gICAqIHRvIGRpc2ssIHNvIHlvdSBjYW4gcmV0cmlldmUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlciB1c2luZ1xuICAgKiA8Y29kZT5jdXJyZW50PC9jb2RlPi4gSWYgdGhlcmUgaXMgbm8gc2Vzc2lvbiB0b2tlbiB0aGUgdXNlciB3aWxsIG5vdCBsb2dnZWQgaW4uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB1c2VySlNPTiBUaGUgSlNPTiBtYXAgb2YgdGhlIFVzZXIncyBkYXRhXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSB1c2VyIHdoZW5cbiAgICogICAgIHRoZSBsb2dpbiBjb21wbGV0ZXMuXG4gICAqL1xuICBzdGF0aWMgaHlkcmF0ZSh1c2VySlNPTikge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmh5ZHJhdGUodXNlciwgdXNlckpTT04pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyB2ZXJzaW9uIG9mIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlVzZXIuaHRtbCNsaW5rV2l0aCBsaW5rV2l0aH1cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy5hdXRoRGF0YV1cbiAgICogQHBhcmFtIHNhdmVPcHRzXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBzdGF0aWMgbG9nSW5XaXRoKHByb3ZpZGVyLCBvcHRpb25zLCBzYXZlT3B0cykge1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgdGhpcygpO1xuICAgIHJldHVybiB1c2VyLmxpbmtXaXRoKHByb3ZpZGVyLCBvcHRpb25zLCBzYXZlT3B0cyk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBvdXQgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlciBzZXNzaW9uLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZVxuICAgKiBzZXNzaW9uIGZyb20gZGlzaywgbG9nIG91dCBvZiBsaW5rZWQgc2VydmljZXMsIGFuZCBmdXR1cmUgY2FsbHMgdG9cbiAgICogPGNvZGU+Y3VycmVudDwvY29kZT4gd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIHNlc3Npb24gaXNcbiAgICogICBkZXN0cm95ZWQgb24gdGhlIHNlcnZlci5cbiAgICovXG4gIHN0YXRpYyBsb2dPdXQoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLmxvZ091dChvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhIHBhc3N3b3JkIHJlc2V0IGVtYWlsIHRvIGJlIHNlbnQgdG8gdGhlIHNwZWNpZmllZCBlbWFpbCBhZGRyZXNzXG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciBhY2NvdW50LiBUaGlzIGVtYWlsIGFsbG93cyB0aGUgdXNlciB0byBzZWN1cmVseVxuICAgKiByZXNldCB0aGVpciBwYXNzd29yZCBvbiB0aGUgUGFyc2Ugc2l0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsIFRoZSBlbWFpbCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0aGF0XG4gICAqICAgICBmb3Jnb3QgdGhlaXIgcGFzc3dvcmQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBzdGF0aWMgcmVxdWVzdFBhc3N3b3JkUmVzZXQoZW1haWwsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgICAgcmVxdWVzdE9wdGlvbnMudXNlTWFzdGVyS2V5ID0gb3B0aW9ucy51c2VNYXN0ZXJLZXk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRVc2VyQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnJlcXVlc3RQYXNzd29yZFJlc2V0KGVtYWlsLCByZXF1ZXN0T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBhbiBlbWFpbCB2ZXJpZmljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbCBUaGUgZW1haWwgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdGhhdFxuICAgKiAgICAgbmVlZHMgdG8gdmVyaWZ5IHRoZWlyIGVtYWlsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgc3RhdGljIHJlcXVlc3RFbWFpbFZlcmlmaWNhdGlvbihlbWFpbCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3VzZU1hc3RlcktleScpKSB7XG4gICAgICByZXF1ZXN0T3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIucmVxdWVzdEVtYWlsVmVyaWZpY2F0aW9uKGVtYWlsLCByZXF1ZXN0T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHdoZXRoZXIgYSBnaXZlbiBwYXNzd29yZCBpcyB0aGUgcGFzc3dvcmQgb2YgdGhlIGN1cnJlbnQgdXNlci5cbiAgICogQHN0YXRpY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWUgIFRoZSB1c2VybmFtZSBvZiB0aGUgdXNlciB3aG9zZSBwYXNzd29yZCBzaG91bGQgYmUgdmVyaWZpZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gYmUgdmVyaWZpZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmlnbm9yZUVtYWlsVmVyaWZpY2F0aW9uXSBTZXQgdG8gYHRydWVgIHRvIGJ5cGFzcyBlbWFpbCB2ZXJpZmljYXRpb24gYW5kIHZlcmlmeVxuICAgKiB0aGUgcGFzc3dvcmQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBlbWFpbCBoYXMgYmVlbiB2ZXJpZmllZC4gVGhpcyByZXF1aXJlcyB0aGUgbWFzdGVyIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGEgdXNlciB3aGVuIHRoZSBwYXNzd29yZCBpcyBjb3JyZWN0LlxuICAgKi9cbiAgc3RhdGljIHZlcmlmeVBhc3N3b3JkKHVzZXJuYW1lLCBwYXNzd29yZCwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgdXNlcm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5PVEhFUl9DQVVTRSwgJ1VzZXJuYW1lIG11c3QgYmUgYSBzdHJpbmcuJykpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhc3N3b3JkICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdQYXNzd29yZCBtdXN0IGJlIGEgc3RyaW5nLicpKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFVzZXJDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIudmVyaWZ5UGFzc3dvcmQodXNlcm5hbWUsIHBhc3N3b3JkLCBvcHRpb25zIHx8IHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBzb21lb25lIHRvIGRlZmluZSBhIGN1c3RvbSBVc2VyIGNsYXNzIHdpdGhvdXQgY2xhc3NOYW1lXG4gICAqIGJlaW5nIHJld3JpdHRlbiB0byBfVXNlci4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmV3cml0ZVxuICAgKiBVc2VyIHRvIF9Vc2VyIGZvciBsZWdhY3kgcmVhc29ucy4gVGhpcyBhbGxvd3MgZGV2ZWxvcGVycyB0b1xuICAgKiBvdmVycmlkZSB0aGF0IGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQWxsb3dlZCBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBjdXN0b20gVXNlciBjbGFzc1xuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgYWxsb3dDdXN0b21Vc2VyQ2xhc3MoaXNBbGxvd2VkKSB7XG4gICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0KCdQRVJGT1JNX1VTRVJfUkVXUklURScsICFpc0FsbG93ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBhIGxlZ2FjeSBhcHBsaWNhdGlvbiB0byBzdGFydCB1c2luZyByZXZvY2FibGUgc2Vzc2lvbnMuIElmIHRoZVxuICAgKiBjdXJyZW50IHNlc3Npb24gdG9rZW4gaXMgbm90IHJldm9jYWJsZSwgYSByZXF1ZXN0IHdpbGwgYmUgbWFkZSBmb3IgYSBuZXcsXG4gICAqIHJldm9jYWJsZSBzZXNzaW9uLlxuICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBjbG91ZCBjb2RlIHVubGVzcyB5b3UgYXJlXG4gICAqIGhhbmRsaW5nIHVzZXIgc2lnbnVwIG9yIGxvZ2luIGZyb20gdGhlIHNlcnZlciBzaWRlLiBJbiBhIGNsb3VkIGNvZGUgY2FsbCxcbiAgICogdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBhdHRlbXB0IHRvIHVwZ3JhZGUgdGhlIGN1cnJlbnQgdG9rZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gdGhlIHByb2Nlc3MgaGFzXG4gICAqICAgY29tcGxldGVkLiBJZiBhIHJlcGxhY2VtZW50IHNlc3Npb24gdG9rZW4gaXMgcmVxdWVzdGVkLCB0aGUgcHJvbWlzZVxuICAgKiAgIHdpbGwgYmUgcmVzb2x2ZWQgYWZ0ZXIgYSBuZXcgdG9rZW4gaGFzIGJlZW4gZmV0Y2hlZC5cbiAgICovXG4gIHN0YXRpYyBlbmFibGVSZXZvY2FibGVTZXNzaW9uKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXQoJ0ZPUkNFX1JFVk9DQUJMRV9TRVNTSU9OJywgdHJ1ZSk7XG4gICAgaWYgKGNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gUGFyc2VVc2VyLmN1cnJlbnQoKTtcbiAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50Ll91cGdyYWRlVG9SZXZvY2FibGVTZXNzaW9uKG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKCk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyB0aGUgdXNlIG9mIGJlY29tZSBvciB0aGUgY3VycmVudCB1c2VyIGluIGEgc2VydmVyXG4gICAqIGVudmlyb25tZW50LiBUaGVzZSBmZWF0dXJlcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCwgc2luY2UgdGhleSBkZXBlbmQgb25cbiAgICogZ2xvYmFsIG9iamVjdHMgdGhhdCBhcmUgbm90IG1lbW9yeS1zYWZlIGZvciBtb3N0IHNlcnZlcnMuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBlbmFibGVVbnNhZmVDdXJyZW50VXNlcigpIHtcbiAgICBjYW5Vc2VDdXJyZW50VXNlciA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZXMgdGhlIHVzZSBvZiBiZWNvbWUgb3IgdGhlIGN1cnJlbnQgdXNlciBpbiBhbnkgZW52aXJvbm1lbnQuXG4gICAqIFRoZXNlIGZlYXR1cmVzIGFyZSBkaXNhYmxlZCBvbiBzZXJ2ZXJzIGJ5IGRlZmF1bHQsIHNpbmNlIHRoZXkgZGVwZW5kIG9uXG4gICAqIGdsb2JhbCBvYmplY3RzIHRoYXQgYXJlIG5vdCBtZW1vcnktc2FmZSBmb3IgbW9zdCBzZXJ2ZXJzLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZGlzYWJsZVVuc2FmZUN1cnJlbnRVc2VyKCkge1xuICAgIGNhblVzZUN1cnJlbnRVc2VyID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiByZWdpc3RlcmluZyB1c2VycyB3aXRoIHtAbGluayBodHRwczovL3BhcnNlcGxhdGZvcm0ub3JnL1BhcnNlLVNESy1KUy9hcGkvbWFzdGVyL1BhcnNlLlVzZXIuaHRtbCNsaW5rV2l0aCBsaW5rV2l0aH0gYSBiYXNpYyBhdXRoIHByb3ZpZGVyXG4gICAqIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgeW91LlxuICAgKlxuICAgKiBGb3IgYWR2YW5jZWQgYXV0aGVudGljYXRpb24sIHlvdSBjYW4gcmVnaXN0ZXIgYW4gQXV0aCBwcm92aWRlciB0b1xuICAgKiBpbXBsZW1lbnQgY3VzdG9tIGF1dGhlbnRpY2F0aW9uLCBkZWF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9wYXJzZXBsYXRmb3JtLm9yZy9QYXJzZS1TREstSlMvYXBpL21hc3Rlci9BdXRoUHJvdmlkZXIuaHRtbCBBdXRoUHJvdmlkZXJ9XG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5wYXJzZXBsYXRmb3JtLm9yZy9qcy9ndWlkZS8jY3VzdG9tLWF1dGhlbnRpY2F0aW9uLW1vZHVsZSBDdXN0b20gQXV0aGVudGljYXRpb24gTW9kdWxlfVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgX3JlZ2lzdGVyQXV0aGVudGljYXRpb25Qcm92aWRlcihwcm92aWRlcikge1xuICAgIGF1dGhQcm92aWRlcnNbcHJvdmlkZXIuZ2V0QXV0aFR5cGUoKV0gPSBwcm92aWRlcjtcbiAgICAvLyBTeW5jaHJvbml6ZSB0aGUgY3VycmVudCB1c2VyIHdpdGggdGhlIGF1dGggcHJvdmlkZXIuXG4gICAgUGFyc2VVc2VyLmN1cnJlbnRBc3luYygpLnRoZW4oY3VycmVudCA9PiB7XG4gICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICBjdXJyZW50Ll9zeW5jaHJvbml6ZUF1dGhEYXRhKHByb3ZpZGVyLmdldEF1dGhUeXBlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwcm92aWRlclxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuYXV0aERhdGFdXG4gICAqIEBwYXJhbSBzYXZlT3B0c1xuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjkuMCBzZWUge0BsaW5rIGh0dHBzOi8vcGFyc2VwbGF0Zm9ybS5vcmcvUGFyc2UtU0RLLUpTL2FwaS9tYXN0ZXIvUGFyc2UuVXNlci5odG1sI2xvZ0luV2l0aCBsb2dJbldpdGh9XG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBzdGF0aWMgX2xvZ0luV2l0aChwcm92aWRlciwgb3B0aW9ucywgc2F2ZU9wdHMpIHtcbiAgICBjb25zdCB1c2VyID0gbmV3IHRoaXMoKTtcbiAgICByZXR1cm4gdXNlci5saW5rV2l0aChwcm92aWRlciwgb3B0aW9ucywgc2F2ZU9wdHMpO1xuICB9XG4gIHN0YXRpYyBfY2xlYXJDYWNoZSgpIHtcbiAgICBjdXJyZW50VXNlckNhY2hlID0gbnVsbDtcbiAgICBjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2sgPSBmYWxzZTtcbiAgfVxuICBzdGF0aWMgX3NldEN1cnJlbnRVc2VyQ2FjaGUodXNlcikge1xuICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSB1c2VyO1xuICB9XG59XG5fUGFyc2VPYmplY3QuZGVmYXVsdC5yZWdpc3RlclN1YmNsYXNzKCdfVXNlcicsIFBhcnNlVXNlcik7XG5jb25zdCBEZWZhdWx0Q29udHJvbGxlciA9IHtcbiAgdXBkYXRlVXNlck9uRGlzayh1c2VyKSB7XG4gICAgY29uc3QgcGF0aCA9IF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfVVNFUl9LRVkpO1xuICAgIGNvbnN0IGpzb24gPSB1c2VyLnRvSlNPTigpO1xuICAgIGRlbGV0ZSBqc29uLnBhc3N3b3JkO1xuICAgIGpzb24uY2xhc3NOYW1lID0gJ19Vc2VyJztcbiAgICBsZXQgdXNlckRhdGEgPSAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShqc29uKTtcbiAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfVVNFUicpKSB7XG4gICAgICBjb25zdCBjcnlwdG8gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDcnlwdG9Db250cm9sbGVyKCk7XG4gICAgICB1c2VyRGF0YSA9IGNyeXB0by5lbmNyeXB0KGpzb24sIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRU5DUllQVEVEX0tFWScpKTtcbiAgICB9XG4gICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQuc2V0SXRlbUFzeW5jKHBhdGgsIHVzZXJEYXRhKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH0pO1xuICB9LFxuICByZW1vdmVVc2VyRnJvbURpc2soKSB7XG4gICAgY29uc3QgcGF0aCA9IF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfVVNFUl9LRVkpO1xuICAgIGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzayA9IHRydWU7XG4gICAgY3VycmVudFVzZXJDYWNoZSA9IG51bGw7XG4gICAgcmV0dXJuIF9TdG9yYWdlLmRlZmF1bHQucmVtb3ZlSXRlbUFzeW5jKHBhdGgpO1xuICB9LFxuICBzZXRDdXJyZW50VXNlcih1c2VyKSB7XG4gICAgY3VycmVudFVzZXJDYWNoZSA9IHVzZXI7XG4gICAgdXNlci5fY2xlYW51cEF1dGhEYXRhKCk7XG4gICAgdXNlci5fc3luY2hyb25pemVBbGxBdXRoRGF0YSgpO1xuICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci51cGRhdGVVc2VyT25EaXNrKHVzZXIpO1xuICB9LFxuICBjdXJyZW50VXNlcigpIHtcbiAgICBpZiAoY3VycmVudFVzZXJDYWNoZSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRVc2VyQ2FjaGU7XG4gICAgfVxuICAgIGlmIChjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2spIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoX1N0b3JhZ2UuZGVmYXVsdC5hc3luYygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIGN1cnJlbnRVc2VyKCkgd2hlbiB1c2luZyBhIHBsYXRmb3JtIHdpdGggYW4gYXN5bmMgJyArICdzdG9yYWdlIHN5c3RlbS4gQ2FsbCBjdXJyZW50VXNlckFzeW5jKCkgaW5zdGVhZC4nKTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfVVNFUl9LRVkpO1xuICAgIGxldCB1c2VyRGF0YSA9IF9TdG9yYWdlLmRlZmF1bHQuZ2V0SXRlbShwYXRoKTtcbiAgICBjdXJyZW50VXNlckNhY2hlTWF0Y2hlc0Rpc2sgPSB0cnVlO1xuICAgIGlmICghdXNlckRhdGEpIHtcbiAgICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSBudWxsO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0VOQ1JZUFRFRF9VU0VSJykpIHtcbiAgICAgIGNvbnN0IGNyeXB0byA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldENyeXB0b0NvbnRyb2xsZXIoKTtcbiAgICAgIHVzZXJEYXRhID0gY3J5cHRvLmRlY3J5cHQodXNlckRhdGEsIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRU5DUllQVEVEX0tFWScpKTtcbiAgICB9XG4gICAgdXNlckRhdGEgPSBKU09OLnBhcnNlKHVzZXJEYXRhKTtcbiAgICBpZiAoIXVzZXJEYXRhLmNsYXNzTmFtZSkge1xuICAgICAgdXNlckRhdGEuY2xhc3NOYW1lID0gJ19Vc2VyJztcbiAgICB9XG4gICAgaWYgKHVzZXJEYXRhLl9pZCkge1xuICAgICAgaWYgKHVzZXJEYXRhLm9iamVjdElkICE9PSB1c2VyRGF0YS5faWQpIHtcbiAgICAgICAgdXNlckRhdGEub2JqZWN0SWQgPSB1c2VyRGF0YS5faWQ7XG4gICAgICB9XG4gICAgICBkZWxldGUgdXNlckRhdGEuX2lkO1xuICAgIH1cbiAgICBpZiAodXNlckRhdGEuX3Nlc3Npb25Ub2tlbikge1xuICAgICAgdXNlckRhdGEuc2Vzc2lvblRva2VuID0gdXNlckRhdGEuX3Nlc3Npb25Ub2tlbjtcbiAgICAgIGRlbGV0ZSB1c2VyRGF0YS5fc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50ID0gX1BhcnNlT2JqZWN0LmRlZmF1bHQuZnJvbUpTT04odXNlckRhdGEpO1xuICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQuX3N5bmNocm9uaXplQWxsQXV0aERhdGEoKTtcbiAgICByZXR1cm4gY3VycmVudDtcbiAgfSxcbiAgY3VycmVudFVzZXJBc3luYygpIHtcbiAgICBpZiAoY3VycmVudFVzZXJDYWNoZSkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjdXJyZW50VXNlckNhY2hlKTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzaykge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfVVNFUl9LRVkpO1xuICAgIHJldHVybiBfU3RvcmFnZS5kZWZhdWx0LmdldEl0ZW1Bc3luYyhwYXRoKS50aGVuKHVzZXJEYXRhID0+IHtcbiAgICAgIGN1cnJlbnRVc2VyQ2FjaGVNYXRjaGVzRGlzayA9IHRydWU7XG4gICAgICBpZiAoIXVzZXJEYXRhKSB7XG4gICAgICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnRU5DUllQVEVEX1VTRVInKSkge1xuICAgICAgICBjb25zdCBjcnlwdG8gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRDcnlwdG9Db250cm9sbGVyKCk7XG4gICAgICAgIHVzZXJEYXRhID0gY3J5cHRvLmRlY3J5cHQodXNlckRhdGEudG9TdHJpbmcoKSwgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdFTkNSWVBURURfS0VZJykpO1xuICAgICAgfVxuICAgICAgdXNlckRhdGEgPSBKU09OLnBhcnNlKHVzZXJEYXRhKTtcbiAgICAgIGlmICghdXNlckRhdGEuY2xhc3NOYW1lKSB7XG4gICAgICAgIHVzZXJEYXRhLmNsYXNzTmFtZSA9ICdfVXNlcic7XG4gICAgICB9XG4gICAgICBpZiAodXNlckRhdGEuX2lkKSB7XG4gICAgICAgIGlmICh1c2VyRGF0YS5vYmplY3RJZCAhPT0gdXNlckRhdGEuX2lkKSB7XG4gICAgICAgICAgdXNlckRhdGEub2JqZWN0SWQgPSB1c2VyRGF0YS5faWQ7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHVzZXJEYXRhLl9pZDtcbiAgICAgIH1cbiAgICAgIGlmICh1c2VyRGF0YS5fc2Vzc2lvblRva2VuKSB7XG4gICAgICAgIHVzZXJEYXRhLnNlc3Npb25Ub2tlbiA9IHVzZXJEYXRhLl9zZXNzaW9uVG9rZW47XG4gICAgICAgIGRlbGV0ZSB1c2VyRGF0YS5fc2Vzc2lvblRva2VuO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudCA9IF9QYXJzZU9iamVjdC5kZWZhdWx0LmZyb21KU09OKHVzZXJEYXRhKTtcbiAgICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSBjdXJyZW50O1xuICAgICAgY3VycmVudC5fc3luY2hyb25pemVBbGxBdXRoRGF0YSgpO1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjdXJyZW50KTtcbiAgICB9KTtcbiAgfSxcbiAgc2lnblVwKHVzZXIsIGF0dHJzLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBhdHRycyAmJiBhdHRycy51c2VybmFtZSB8fCB1c2VyLmdldCgndXNlcm5hbWUnKTtcbiAgICBjb25zdCBwYXNzd29yZCA9IGF0dHJzICYmIGF0dHJzLnBhc3N3b3JkIHx8IHVzZXIuZ2V0KCdwYXNzd29yZCcpO1xuICAgIGlmICghdXNlcm5hbWUgfHwgIXVzZXJuYW1lLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVqZWN0KG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuT1RIRVJfQ0FVU0UsICdDYW5ub3Qgc2lnbiB1cCB1c2VyIHdpdGggYW4gZW1wdHkgdXNlcm5hbWUuJykpO1xuICAgIH1cbiAgICBpZiAoIXBhc3N3b3JkIHx8ICFwYXNzd29yZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlamVjdChuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0Lk9USEVSX0NBVVNFLCAnQ2Fubm90IHNpZ24gdXAgdXNlciB3aXRoIGFuIGVtcHR5IHBhc3N3b3JkLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXIuc2F2ZShhdHRycywgb3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICAvLyBDbGVhciB0aGUgcGFzc3dvcmQgZmllbGRcbiAgICAgIHVzZXIuX2ZpbmlzaEZldGNoKHtcbiAgICAgICAgcGFzc3dvcmQ6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICBpZiAoY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfSk7XG4gIH0sXG4gIGxvZ0luKHVzZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gICAgY29uc3QgYXV0aCA9IHtcbiAgICAgIHVzZXJuYW1lOiB1c2VyLmdldCgndXNlcm5hbWUnKSxcbiAgICAgIHBhc3N3b3JkOiB1c2VyLmdldCgncGFzc3dvcmQnKSxcbiAgICAgIGF1dGhEYXRhOiB1c2VyLmdldCgnYXV0aERhdGEnKVxuICAgIH07XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3Qob3B0aW9ucy51c2VQb3N0ID8gJ1BPU1QnIDogJ0dFVCcsICdsb2dpbicsIGF1dGgsIG9wdGlvbnMpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgdXNlci5fbWlncmF0ZUlkKHJlc3BvbnNlLm9iamVjdElkKTtcbiAgICAgIHVzZXIuX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgICBzdGF0ZUNvbnRyb2xsZXIuc2V0UGVuZGluZ09wKHVzZXIuX2dldFN0YXRlSWRlbnRpZmllcigpLCAndXNlcm5hbWUnLCB1bmRlZmluZWQpO1xuICAgICAgc3RhdGVDb250cm9sbGVyLnNldFBlbmRpbmdPcCh1c2VyLl9nZXRTdGF0ZUlkZW50aWZpZXIoKSwgJ3Bhc3N3b3JkJywgdW5kZWZpbmVkKTtcbiAgICAgIHJlc3BvbnNlLnBhc3N3b3JkID0gdW5kZWZpbmVkO1xuICAgICAgdXNlci5fZmluaXNoRmV0Y2gocmVzcG9uc2UpO1xuICAgICAgaWYgKCFjYW5Vc2VDdXJyZW50VXNlcikge1xuICAgICAgICAvLyBXZSBjYW4ndCBzZXQgdGhlIGN1cnJlbnQgdXNlciwgc28ganVzdCByZXR1cm4gdGhlIG9uZSB3ZSBsb2dnZWQgaW5cbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh1c2VyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgICB9KTtcbiAgfSxcbiAgbG9naW5Bcyh1c2VyLCB1c2VySWQpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnbG9naW5BcycsIHtcbiAgICAgIHVzZXJJZFxuICAgIH0sIHtcbiAgICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgdXNlci5fZmluaXNoRmV0Y2gocmVzcG9uc2UpO1xuICAgICAgdXNlci5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICAgIGlmICghY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh1c2VyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgICB9KTtcbiAgfSxcbiAgYmVjb21lKHVzZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBSRVNUQ29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCk7XG4gICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ0dFVCcsICd1c2Vycy9tZScsIHt9LCBvcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIHVzZXIuX2ZpbmlzaEZldGNoKHJlc3BvbnNlKTtcbiAgICAgIHVzZXIuX3NldEV4aXN0ZWQodHJ1ZSk7XG4gICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgfSk7XG4gIH0sXG4gIGh5ZHJhdGUodXNlciwgdXNlckpTT04pIHtcbiAgICB1c2VyLl9maW5pc2hGZXRjaCh1c2VySlNPTik7XG4gICAgdXNlci5fc2V0RXhpc3RlZCh0cnVlKTtcbiAgICBpZiAodXNlckpTT04uc2Vzc2lvblRva2VuICYmIGNhblVzZUN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUodXNlcik7XG4gICAgfVxuICB9LFxuICBtZSh1c2VyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAndXNlcnMvbWUnLCB7fSwgb3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICB1c2VyLl9maW5pc2hGZXRjaChyZXNwb25zZSk7XG4gICAgICB1c2VyLl9zZXRFeGlzdGVkKHRydWUpO1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfSk7XG4gIH0sXG4gIGxvZ091dChvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIGlmIChvcHRpb25zLnNlc3Npb25Ub2tlbikge1xuICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLnJlcXVlc3QoJ1BPU1QnLCAnbG9nb3V0Jywge30sIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gRGVmYXVsdENvbnRyb2xsZXIuY3VycmVudFVzZXJBc3luYygpLnRoZW4oY3VycmVudFVzZXIgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IF9TdG9yYWdlLmRlZmF1bHQuZ2VuZXJhdGVQYXRoKENVUlJFTlRfVVNFUl9LRVkpO1xuICAgICAgbGV0IHByb21pc2UgPSBfU3RvcmFnZS5kZWZhdWx0LnJlbW92ZUl0ZW1Bc3luYyhwYXRoKTtcbiAgICAgIGlmIChjdXJyZW50VXNlciAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjdXJyZW50U2Vzc2lvbiA9IGN1cnJlbnRVc2VyLmdldFNlc3Npb25Ub2tlbigpO1xuICAgICAgICBpZiAoY3VycmVudFNlc3Npb24gJiYgKDAsIF9pc1Jldm9jYWJsZVNlc3Npb24uZGVmYXVsdCkoY3VycmVudFNlc3Npb24pKSB7XG4gICAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gUkVTVENvbnRyb2xsZXIucmVxdWVzdCgnUE9TVCcsICdsb2dvdXQnLCB7fSwge1xuICAgICAgICAgICAgICBzZXNzaW9uVG9rZW46IGN1cnJlbnRTZXNzaW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50VXNlci5fbG9nT3V0V2l0aEFsbCgpO1xuICAgICAgICBjdXJyZW50VXNlci5fZmluaXNoRmV0Y2goe1xuICAgICAgICAgIHNlc3Npb25Ub2tlbjogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY3VycmVudFVzZXJDYWNoZU1hdGNoZXNEaXNrID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnRVc2VyQ2FjaGUgPSBudWxsO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfSk7XG4gIH0sXG4gIHJlcXVlc3RQYXNzd29yZFJlc2V0KGVtYWlsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ3JlcXVlc3RQYXNzd29yZFJlc2V0Jywge1xuICAgICAgZW1haWw6IGVtYWlsXG4gICAgfSwgb3B0aW9ucyk7XG4gIH0sXG4gIGFzeW5jIHVwZ3JhZGVUb1Jldm9jYWJsZVNlc3Npb24odXNlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IHRva2VuID0gdXNlci5nZXRTZXNzaW9uVG9rZW4oKTtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QobmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoX1BhcnNlRXJyb3IuZGVmYXVsdC5TRVNTSU9OX01JU1NJTkcsICdDYW5ub3QgdXBncmFkZSBhIHVzZXIgd2l0aCBubyBzZXNzaW9uIHRva2VuJykpO1xuICAgIH1cbiAgICBvcHRpb25zLnNlc3Npb25Ub2tlbiA9IHRva2VuO1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ3VwZ3JhZGVUb1Jldm9jYWJsZVNlc3Npb24nLCB7fSwgb3B0aW9ucyk7XG4gICAgdXNlci5fZmluaXNoRmV0Y2goe1xuICAgICAgc2Vzc2lvblRva2VuOiByZXN1bHQ/LnNlc3Npb25Ub2tlbiB8fCAnJ1xuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB1c2VyLmlzQ3VycmVudEFzeW5jKCk7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0Q29udHJvbGxlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh1c2VyKTtcbiAgfSxcbiAgbGlua1dpdGgodXNlciwgYXV0aERhdGEsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdXNlci5zYXZlKHtcbiAgICAgIGF1dGhEYXRhXG4gICAgfSwgb3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICBpZiAoY2FuVXNlQ3VycmVudFVzZXIpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHRDb250cm9sbGVyLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfSk7XG4gIH0sXG4gIHZlcmlmeVBhc3N3b3JkKHVzZXJuYW1lLCBwYXNzd29yZCwgb3B0aW9ucykge1xuICAgIGNvbnN0IFJFU1RDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UkVTVENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgdXNlcm5hbWUsXG4gICAgICBwYXNzd29yZCxcbiAgICAgIC4uLihvcHRpb25zLmlnbm9yZUVtYWlsVmVyaWZpY2F0aW9uICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBpZ25vcmVFbWFpbFZlcmlmaWNhdGlvbjogb3B0aW9ucy5pZ25vcmVFbWFpbFZlcmlmaWNhdGlvblxuICAgICAgfSlcbiAgICB9O1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdHRVQnLCAndmVyaWZ5UGFzc3dvcmQnLCBkYXRhLCBvcHRpb25zKTtcbiAgfSxcbiAgcmVxdWVzdEVtYWlsVmVyaWZpY2F0aW9uKGVtYWlsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgUkVTVENvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRSRVNUQ29udHJvbGxlcigpO1xuICAgIHJldHVybiBSRVNUQ29udHJvbGxlci5yZXF1ZXN0KCdQT1NUJywgJ3ZlcmlmaWNhdGlvbkVtYWlsUmVxdWVzdCcsIHtcbiAgICAgIGVtYWlsOiBlbWFpbFxuICAgIH0sIG9wdGlvbnMpO1xuICB9XG59O1xuX0NvcmVNYW5hZ2VyLmRlZmF1bHQuc2V0UGFyc2VVc2VyKFBhcnNlVXNlcik7XG5fQ29yZU1hbmFnZXIuZGVmYXVsdC5zZXRVc2VyQ29udHJvbGxlcihEZWZhdWx0Q29udHJvbGxlcik7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBQYXJzZVVzZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0UHVzaFN0YXR1cyA9IGdldFB1c2hTdGF0dXM7XG5leHBvcnRzLnNlbmQgPSBzZW5kO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZVF1ZXJ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVF1ZXJ5XCIpKTtcbi8qKlxuICogQ29udGFpbnMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBQdXNoIGluIFBhcnNlLlxuICpcbiAqIEBjbGFzcyBQYXJzZS5QdXNoXG4gKiBAc3RhdGljXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKi9cblxuLyoqXG4gKiBTZW5kcyBhIHB1c2ggbm90aWZpY2F0aW9uLlxuICogKipBdmFpbGFibGUgaW4gQ2xvdWQgQ29kZSBvbmx5LioqXG4gKlxuICogU2VlIHtAbGluayBodHRwczovL2RvY3MucGFyc2VwbGF0Zm9ybS5vcmcvanMvZ3VpZGUvI3B1c2gtbm90aWZpY2F0aW9ucyBQdXNoIE5vdGlmaWNhdGlvbiBHdWlkZX1cbiAqXG4gKiBAZnVuY3Rpb24gc2VuZFxuICogQG5hbWUgUGFyc2UuUHVzaC5zZW5kXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtICBUaGUgZGF0YSBvZiB0aGUgcHVzaCBub3RpZmljYXRpb24uIFZhbGlkIGZpZWxkc1xuICogYXJlOlxuICogICA8b2w+XG4gKiAgICAgPGxpPmNoYW5uZWxzIC0gQW4gQXJyYXkgb2YgY2hhbm5lbHMgdG8gcHVzaCB0by48L2xpPlxuICogICAgIDxsaT5wdXNoX3RpbWUgLSBBIERhdGUgb2JqZWN0IGZvciB3aGVuIHRvIHNlbmQgdGhlIHB1c2guPC9saT5cbiAqICAgICA8bGk+ZXhwaXJhdGlvbl90aW1lIC0gIEEgRGF0ZSBvYmplY3QgZm9yIHdoZW4gdG8gZXhwaXJlXG4gKiAgICAgICAgIHRoZSBwdXNoLjwvbGk+XG4gKiAgICAgPGxpPmV4cGlyYXRpb25faW50ZXJ2YWwgLSBUaGUgc2Vjb25kcyBmcm9tIG5vdyB0byBleHBpcmUgdGhlIHB1c2guPC9saT5cbiAqICAgICA8bGk+d2hlcmUgLSBBIFBhcnNlLlF1ZXJ5IG92ZXIgUGFyc2UuSW5zdGFsbGF0aW9uIHRoYXQgaXMgdXNlZCB0byBtYXRjaFxuICogICAgICAgICBhIHNldCBvZiBpbnN0YWxsYXRpb25zIHRvIHB1c2ggdG8uPC9saT5cbiAqICAgICA8bGk+ZGF0YSAtIFRoZSBkYXRhIHRvIHNlbmQgYXMgcGFydCBvZiB0aGUgcHVzaC48L2xpPlxuICogICA8b2w+XG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBWYWxpZCBvcHRpb25zXG4gKiBhcmU6PHVsPlxuICogICA8bGk+dXNlTWFzdGVyS2V5OiBJbiBDbG91ZCBDb2RlIGFuZCBOb2RlIG9ubHksIGNhdXNlcyB0aGUgTWFzdGVyIEtleSB0b1xuICogICAgIGJlIHVzZWQgZm9yIHRoaXMgcmVxdWVzdC5cbiAqIDwvdWw+XG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIHB1c2ggcmVxdWVzdFxuICogICAgIGNvbXBsZXRlcyBhbmQgcmV0dXJucyBgcHVzaFN0YXR1c0lkYC5cbiAqL1xuZnVuY3Rpb24gc2VuZChkYXRhKSB7XG4gIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgaWYgKGRhdGEud2hlcmUgJiYgZGF0YS53aGVyZSBpbnN0YW5jZW9mIF9QYXJzZVF1ZXJ5LmRlZmF1bHQpIHtcbiAgICBkYXRhLndoZXJlID0gZGF0YS53aGVyZS50b0pTT04oKS53aGVyZTtcbiAgfVxuICBpZiAoZGF0YS5wdXNoX3RpbWUgJiYgdHlwZW9mIGRhdGEucHVzaF90aW1lID09PSAnb2JqZWN0Jykge1xuICAgIGRhdGEucHVzaF90aW1lID0gZGF0YS5wdXNoX3RpbWUudG9KU09OKCk7XG4gIH1cbiAgaWYgKGRhdGEuZXhwaXJhdGlvbl90aW1lICYmIHR5cGVvZiBkYXRhLmV4cGlyYXRpb25fdGltZSA9PT0gJ29iamVjdCcpIHtcbiAgICBkYXRhLmV4cGlyYXRpb25fdGltZSA9IGRhdGEuZXhwaXJhdGlvbl90aW1lLnRvSlNPTigpO1xuICB9XG4gIGlmIChkYXRhLmV4cGlyYXRpb25fdGltZSAmJiBkYXRhLmV4cGlyYXRpb25faW50ZXJ2YWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGlyYXRpb25fdGltZSBhbmQgZXhwaXJhdGlvbl9pbnRlcnZhbCBjYW5ub3QgYm90aCBiZSBzZXQuJyk7XG4gIH1cbiAgY29uc3QgcHVzaE9wdGlvbnMgPSB7XG4gICAgdXNlTWFzdGVyS2V5OiB0cnVlXG4gIH07XG4gIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KCd1c2VNYXN0ZXJLZXknKSkge1xuICAgIHB1c2hPcHRpb25zLnVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICB9XG4gIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQdXNoQ29udHJvbGxlcigpLnNlbmQoZGF0YSwgcHVzaE9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEdldHMgcHVzaCBzdGF0dXMgYnkgSWRcbiAqXG4gKiBAZnVuY3Rpb24gZ2V0UHVzaFN0YXR1c1xuICogQG5hbWUgUGFyc2UuUHVzaC5nZXRQdXNoU3RhdHVzXG4gKiBAcGFyYW0ge3N0cmluZ30gcHVzaFN0YXR1c0lkIFRoZSBJZCBvZiBQdXNoIFN0YXR1cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFZhbGlkIG9wdGlvbnNcbiAqIGFyZTo8dWw+XG4gKiAgIDxsaT51c2VNYXN0ZXJLZXk6IEluIENsb3VkIENvZGUgYW5kIE5vZGUgb25seSwgY2F1c2VzIHRoZSBNYXN0ZXIgS2V5IHRvXG4gKiAgICAgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LlxuICogPC91bD5cbiAqIEByZXR1cm5zIHtQYXJzZS5PYmplY3R9IFN0YXR1cyBvZiBQdXNoLlxuICovXG5mdW5jdGlvbiBnZXRQdXNoU3RhdHVzKHB1c2hTdGF0dXNJZCkge1xuICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIGNvbnN0IHB1c2hPcHRpb25zID0ge1xuICAgIHVzZU1hc3RlcktleTogdHJ1ZVxuICB9O1xuICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgndXNlTWFzdGVyS2V5JykpIHtcbiAgICBwdXNoT3B0aW9ucy51c2VNYXN0ZXJLZXkgPSBvcHRpb25zLnVzZU1hc3RlcktleTtcbiAgfVxuICBjb25zdCBxdWVyeSA9IG5ldyBfUGFyc2VRdWVyeS5kZWZhdWx0KCdfUHVzaFN0YXR1cycpO1xuICByZXR1cm4gcXVlcnkuZ2V0KHB1c2hTdGF0dXNJZCwgcHVzaE9wdGlvbnMpO1xufVxuY29uc3QgRGVmYXVsdENvbnRyb2xsZXIgPSB7XG4gIGFzeW5jIHNlbmQoZGF0YSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMucmV0dXJuU3RhdHVzID0gdHJ1ZTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFJFU1RDb250cm9sbGVyKCkucmVxdWVzdCgnUE9TVCcsICdwdXNoJywgZGF0YSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLl9oZWFkZXJzPy5bJ1gtUGFyc2UtUHVzaC1TdGF0dXMtSWQnXTtcbiAgfVxufTtcbl9Db3JlTWFuYWdlci5kZWZhdWx0LnNldFB1c2hDb250cm9sbGVyKERlZmF1bHRDb250cm9sbGVyKTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX2luY2x1ZGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmNsdWRlc1wiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9zZXRUaW1lb3V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvc2V0LXRpbWVvdXRcIikpO1xudmFyIF91dWlkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dWlkXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VFcnJvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VFcnJvclwiKSk7XG52YXIgX3Byb21pc2VVdGlscyA9IHJlcXVpcmUoXCIuL3Byb21pc2VVdGlsc1wiKTtcbnZhciBfWGhyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9YaHIud2VhcHBcIikpO1xuLyogZ2xvYmFsIFhNTEh0dHBSZXF1ZXN0LCBYRG9tYWluUmVxdWVzdCAqL1xuXG5sZXQgWEhSID0gbnVsbDtcbmlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gIFhIUiA9IFhNTEh0dHBSZXF1ZXN0O1xufVxubGV0IHVzZVhEb21haW5SZXF1ZXN0ID0gZmFsc2U7XG4vLyBAdHMtaWdub3JlXG5pZiAodHlwZW9mIFhEb21haW5SZXF1ZXN0ICE9PSAndW5kZWZpbmVkJyAmJiAhKCd3aXRoQ3JlZGVudGlhbHMnIGluIG5ldyBYTUxIdHRwUmVxdWVzdCgpKSkge1xuICB1c2VYRG9tYWluUmVxdWVzdCA9IHRydWU7XG59XG5mdW5jdGlvbiBhamF4SUU5KG1ldGhvZCwgdXJsLCBkYXRhLCBoZWFkZXJzLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHhkciA9IG5ldyBYRG9tYWluUmVxdWVzdCgpO1xuICAgIHhkci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoeGRyLnJlc3BvbnNlVGV4dCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICByZXNwb25zZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHhkci5vbmVycm9yID0geGRyLm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIExldCdzIGZha2UgYSByZWFsIGVycm9yIG1lc3NhZ2UuXG4gICAgICBjb25zdCBmYWtlUmVzcG9uc2UgPSB7XG4gICAgICAgIHJlc3BvbnNlVGV4dDogKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkoe1xuICAgICAgICAgIGNvZGU6IF9QYXJzZUVycm9yLmRlZmF1bHQuWF9ET01BSU5fUkVRVUVTVCxcbiAgICAgICAgICBlcnJvcjogXCJJRSdzIFhEb21haW5SZXF1ZXN0IGRvZXMgbm90IHN1cHBseSBlcnJvciBpbmZvLlwiXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgICAgcmVqZWN0KGZha2VSZXNwb25zZSk7XG4gICAgfTtcbiAgICB4ZHIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnByb2dyZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbnMucHJvZ3Jlc3MoeGRyLnJlc3BvbnNlVGV4dCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB4ZHIub3BlbihtZXRob2QsIHVybCk7XG4gICAgeGRyLnNlbmQoZGF0YSk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlcXVlc3RUYXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvcHRpb25zLnJlcXVlc3RUYXNrKHhkcik7XG4gICAgfVxuICB9KTtcbn1cbmNvbnN0IFJFU1RDb250cm9sbGVyID0ge1xuICBhamF4KG1ldGhvZCwgdXJsLCBkYXRhLCBoZWFkZXJzLCBvcHRpb25zKSB7XG4gICAgdmFyIF9jb250ZXh0O1xuICAgIGlmICh1c2VYRG9tYWluUmVxdWVzdCkge1xuICAgICAgcmV0dXJuIGFqYXhJRTkobWV0aG9kLCB1cmwsIGRhdGEsIGhlYWRlcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gKDAsIF9wcm9taXNlVXRpbHMucmVzb2x2aW5nUHJvbWlzZSkoKTtcbiAgICBjb25zdCBpc0lkZW1wb3RlbnQgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0lERU1QT1RFTkNZJykgJiYgKDAsIF9pbmNsdWRlcy5kZWZhdWx0KShfY29udGV4dCA9IFsnUE9TVCcsICdQVVQnXSkuY2FsbChfY29udGV4dCwgbWV0aG9kKTtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSBpc0lkZW1wb3RlbnQgPyAoMCwgX3V1aWQuZGVmYXVsdCkoKSA6ICcnO1xuICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgY29uc3QgZGlzcGF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoWEhSID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbWFrZSBhIHJlcXVlc3Q6IE5vIGRlZmluaXRpb24gb2YgWE1MSHR0cFJlcXVlc3Qgd2FzIGZvdW5kLicpO1xuICAgICAgfVxuICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHhociA9IG5ldyBYSFIoKTtcbiAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gNCB8fCBoYW5kbGVkIHx8IHhoci5fYWJvcnRlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHtcbiAgICAgICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZUhlYWRlcnMgPSB0eXBlb2YgeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycyA9PT0gJ2Z1bmN0aW9uJyA/IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSA6ICcnO1xuICAgICAgICAgICAgaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIgPT09ICdmdW5jdGlvbicgJiYgYXZhaWxhYmxlSGVhZGVycz8uaW5kZXhPZignYWNjZXNzLWNvbnRyb2wtZXhwb3NlLWhlYWRlcnMnKSA+PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignYWNjZXNzLWNvbnRyb2wtZXhwb3NlLWhlYWRlcnMnKS5zcGxpdCgnLCAnKTtcbiAgICAgICAgICAgICAgKDAsIF9mb3JFYWNoLmRlZmF1bHQpKHJlc3BvbnNlSGVhZGVycykuY2FsbChyZXNwb25zZUhlYWRlcnMsIGhlYWRlciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShhdmFpbGFibGVIZWFkZXJzKS5jYWxsKGF2YWlsYWJsZUhlYWRlcnMsIGhlYWRlci50b0xvd2VyQ2FzZSgpKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICBoZWFkZXJzW2hlYWRlcl0gPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZS50b1N0cmluZygpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBwcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICAgICAgICB4aHJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID49IDUwMCB8fCB4aHIuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgLy8gcmV0cnkgb24gNVhYIG9yIG5vZGUteG1saHR0cHJlcXVlc3QgZXJyb3JcbiAgICAgICAgICBpZiAoKythdHRlbXB0cyA8IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnUkVRVUVTVF9BVFRFTVBUX0xJTUlUJykpIHtcbiAgICAgICAgICAgIC8vIEV4cG9uZW50aWFsbHktZ3Jvd2luZyByYW5kb20gZGVsYXlcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogMTI1ICogTWF0aC5wb3coMiwgYXR0ZW1wdHMpKTtcbiAgICAgICAgICAgICgwLCBfc2V0VGltZW91dDIuZGVmYXVsdCkoZGlzcGF0Y2gsIGRlbGF5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHhoci5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KCdVbmFibGUgdG8gY29ubmVjdCB0byB0aGUgUGFyc2UgQVBJJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFmdGVyIHRoZSByZXRyeSBsaW1pdCBpcyByZWFjaGVkLCBmYWlsXG4gICAgICAgICAgICBwcm9taXNlLnJlamVjdCh4aHIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9taXNlLnJlamVjdCh4aHIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaGVhZGVycyA9IGhlYWRlcnMgfHwge307XG4gICAgICBpZiAodHlwZW9mIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddICE9PSAnc3RyaW5nJykge1xuICAgICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3BsYWluJzsgLy8gQXZvaWQgcHJlLWZsaWdodFxuICAgICAgfVxuICAgICAgaWYgKF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnSVNfTk9ERScpKSB7XG4gICAgICAgIGhlYWRlcnNbJ1VzZXItQWdlbnQnXSA9ICdQYXJzZS8nICsgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdWRVJTSU9OJykgKyAnIChOb2RlSlMgJyArIHByb2Nlc3MudmVyc2lvbnMubm9kZSArICcpJztcbiAgICAgIH1cbiAgICAgIGlmIChpc0lkZW1wb3RlbnQpIHtcbiAgICAgICAgaGVhZGVyc1snWC1QYXJzZS1SZXF1ZXN0LUlkJ10gPSByZXF1ZXN0SWQ7XG4gICAgICB9XG4gICAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfQVVUSF9UWVBFJykgJiYgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfQVVUSF9UT0tFTicpKSB7XG4gICAgICAgIGhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnU0VSVkVSX0FVVEhfVFlQRScpICsgJyAnICsgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdTRVJWRVJfQVVUSF9UT0tFTicpO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VzdG9tSGVhZGVycyA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnUkVRVUVTVF9IRUFERVJTJyk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBjdXN0b21IZWFkZXJzKSB7XG4gICAgICAgIGhlYWRlcnNba2V5XSA9IGN1c3RvbUhlYWRlcnNba2V5XTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnByb2dyZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZVByb2dyZXNzID0gZnVuY3Rpb24gKHR5cGUsIGV2ZW50KSB7XG4gICAgICAgICAgaWYgKGV2ZW50Lmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHJvZ3Jlc3MoZXZlbnQubG9hZGVkIC8gZXZlbnQudG90YWwsIGV2ZW50LmxvYWRlZCwgZXZlbnQudG90YWwsIHtcbiAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHJvZ3Jlc3MobnVsbCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHhoci5vbnByb2dyZXNzID0gZXZlbnQgPT4ge1xuICAgICAgICAgIGhhbmRsZVByb2dyZXNzKCdkb3dubG9hZCcsIGV2ZW50KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHhoci51cGxvYWQpIHtcbiAgICAgICAgICB4aHIudXBsb2FkLm9ucHJvZ3Jlc3MgPSBldmVudCA9PiB7XG4gICAgICAgICAgICBoYW5kbGVQcm9ncmVzcygndXBsb2FkJywgZXZlbnQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHhoci5vcGVuKG1ldGhvZCwgdXJsLCB0cnVlKTtcbiAgICAgIGZvciAoY29uc3QgaCBpbiBoZWFkZXJzKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGgsIGhlYWRlcnNbaF0pO1xuICAgICAgfVxuICAgICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICAgIHJlc3VsdHM6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgICAgeGhyXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHhoci5zZW5kKGRhdGEpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucmVxdWVzdFRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBvcHRpb25zLnJlcXVlc3RUYXNrKHhocik7XG4gICAgICB9XG4gICAgfTtcbiAgICBkaXNwYXRjaCgpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9LFxuICByZXF1ZXN0KG1ldGhvZCwgcGF0aCwgZGF0YSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGxldCB1cmwgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ1NFUlZFUl9VUkwnKTtcbiAgICBpZiAodXJsW3VybC5sZW5ndGggLSAxXSAhPT0gJy8nKSB7XG4gICAgICB1cmwgKz0gJy8nO1xuICAgIH1cbiAgICB1cmwgKz0gcGF0aDtcbiAgICBjb25zdCBwYXlsb2FkID0ge307XG4gICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IGsgaW4gZGF0YSkge1xuICAgICAgICBwYXlsb2FkW2tdID0gZGF0YVtrXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGF5bG9hZC5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuICAgIGlmIChtZXRob2QgIT09ICdQT1NUJykge1xuICAgICAgcGF5bG9hZC5fbWV0aG9kID0gbWV0aG9kO1xuICAgICAgbWV0aG9kID0gJ1BPU1QnO1xuICAgIH1cbiAgICBwYXlsb2FkLl9BcHBsaWNhdGlvbklkID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBUFBMSUNBVElPTl9JRCcpO1xuICAgIGNvbnN0IGpzS2V5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdKQVZBU0NSSVBUX0tFWScpO1xuICAgIGlmIChqc0tleSkge1xuICAgICAgcGF5bG9hZC5fSmF2YVNjcmlwdEtleSA9IGpzS2V5O1xuICAgIH1cbiAgICBwYXlsb2FkLl9DbGllbnRWZXJzaW9uID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdWRVJTSU9OJyk7XG4gICAgbGV0IHVzZU1hc3RlcktleSA9IG9wdGlvbnMudXNlTWFzdGVyS2V5O1xuICAgIGlmICh0eXBlb2YgdXNlTWFzdGVyS2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdXNlTWFzdGVyS2V5ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdVU0VfTUFTVEVSX0tFWScpO1xuICAgIH1cbiAgICBpZiAodXNlTWFzdGVyS2V5KSB7XG4gICAgICBpZiAoX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdNQVNURVJfS0VZJykpIHtcbiAgICAgICAgZGVsZXRlIHBheWxvYWQuX0phdmFTY3JpcHRLZXk7XG4gICAgICAgIHBheWxvYWQuX01hc3RlcktleSA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldCgnTUFTVEVSX0tFWScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXNlIHRoZSBNYXN0ZXIgS2V5LCBpdCBoYXMgbm90IGJlZW4gcHJvdmlkZWQuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0ZPUkNFX1JFVk9DQUJMRV9TRVNTSU9OJykpIHtcbiAgICAgIHBheWxvYWQuX1Jldm9jYWJsZVNlc3Npb24gPSAnMSc7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbGxhdGlvbklkID0gb3B0aW9ucy5pbnN0YWxsYXRpb25JZDtcbiAgICBsZXQgaW5zdGFsbGF0aW9uSWRQcm9taXNlO1xuICAgIGlmIChpbnN0YWxsYXRpb25JZCAmJiB0eXBlb2YgaW5zdGFsbGF0aW9uSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpbnN0YWxsYXRpb25JZFByb21pc2UgPSBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoaW5zdGFsbGF0aW9uSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbnN0YWxsYXRpb25Db250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0SW5zdGFsbGF0aW9uQ29udHJvbGxlcigpO1xuICAgICAgaW5zdGFsbGF0aW9uSWRQcm9taXNlID0gaW5zdGFsbGF0aW9uQ29udHJvbGxlci5jdXJyZW50SW5zdGFsbGF0aW9uSWQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbGxhdGlvbklkUHJvbWlzZS50aGVuKGlpZCA9PiB7XG4gICAgICBwYXlsb2FkLl9JbnN0YWxsYXRpb25JZCA9IGlpZDtcbiAgICAgIGNvbnN0IHVzZXJDb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0VXNlckNvbnRyb2xsZXIoKTtcbiAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnNlc3Npb25Ub2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShvcHRpb25zLnNlc3Npb25Ub2tlbik7XG4gICAgICB9IGVsc2UgaWYgKHVzZXJDb250cm9sbGVyKSB7XG4gICAgICAgIHJldHVybiB1c2VyQ29udHJvbGxlci5jdXJyZW50VXNlckFzeW5jKCkudGhlbih1c2VyID0+IHtcbiAgICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSh1c2VyLmdldFNlc3Npb25Ub2tlbigpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKG51bGwpO1xuICAgIH0pLnRoZW4odG9rZW4gPT4ge1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHBheWxvYWQuX1Nlc3Npb25Ub2tlbiA9IHRva2VuO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF5bG9hZFN0cmluZyA9ICgwLCBfc3RyaW5naWZ5LmRlZmF1bHQpKHBheWxvYWQpO1xuICAgICAgcmV0dXJuIFJFU1RDb250cm9sbGVyLmFqYXgobWV0aG9kLCB1cmwsIHBheWxvYWRTdHJpbmcsIHt9LCBvcHRpb25zKS50aGVuKF9yZWYgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIHhoclxuICAgICAgICB9ID0gX3JlZjtcbiAgICAgICAgaWYgKG9wdGlvbnMucmV0dXJuU3RhdHVzKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnJlc3BvbnNlLFxuICAgICAgICAgICAgX3N0YXR1czogc3RhdHVzLFxuICAgICAgICAgICAgX2hlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICBfeGhyOiB4aHJcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goUkVTVENvbnRyb2xsZXIuaGFuZGxlRXJyb3IpO1xuICB9LFxuICBoYW5kbGVFcnJvcihyZXNwb25zZSkge1xuICAgIC8vIFRyYW5zZm9ybSB0aGUgZXJyb3IgaW50byBhbiBpbnN0YW5jZSBvZiBQYXJzZUVycm9yIGJ5IHRyeWluZyB0byBwYXJzZVxuICAgIC8vIHRoZSBlcnJvciBzdHJpbmcgYXMgSlNPTlxuICAgIGxldCBlcnJvcjtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UucmVzcG9uc2VUZXh0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlcnJvckpTT04gPSBKU09OLnBhcnNlKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIGVycm9yID0gbmV3IF9QYXJzZUVycm9yLmRlZmF1bHQoZXJyb3JKU09OLmNvZGUsIGVycm9ySlNPTi5lcnJvcik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIHdlIGZhaWwgdG8gcGFyc2UgdGhlIGVycm9yIHRleHQsIHRoYXQncyBva2F5LlxuICAgICAgICBlcnJvciA9IG5ldyBfUGFyc2VFcnJvci5kZWZhdWx0KF9QYXJzZUVycm9yLmRlZmF1bHQuSU5WQUxJRF9KU09OLCAnUmVjZWl2ZWQgYW4gZXJyb3Igd2l0aCBpbnZhbGlkIEpTT04gZnJvbSBQYXJzZTogJyArIHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlID8gcmVzcG9uc2UubWVzc2FnZSA6IHJlc3BvbnNlO1xuICAgICAgZXJyb3IgPSBuZXcgX1BhcnNlRXJyb3IuZGVmYXVsdChfUGFyc2VFcnJvci5kZWZhdWx0LkNPTk5FQ1RJT05fRkFJTEVELCAnWE1MSHR0cFJlcXVlc3QgZmFpbGVkOiAnICsgKDAsIF9zdHJpbmdpZnkuZGVmYXVsdCkobWVzc2FnZSkpO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZWplY3QoZXJyb3IpO1xuICB9LFxuICBfc2V0WEhSKHhocikge1xuICAgIFhIUiA9IHhocjtcbiAgfSxcbiAgX2dldFhIUigpIHtcbiAgICByZXR1cm4gWEhSO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBSRVNUQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFJFU1RDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX1dlYWtNYXAgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS93ZWFrLW1hcFwiKTtcbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2xlYXJBbGxTdGF0ZSA9IGNsZWFyQWxsU3RhdGU7XG5leHBvcnRzLmNvbW1pdFNlcnZlckNoYW5nZXMgPSBjb21taXRTZXJ2ZXJDaGFuZ2VzO1xuZXhwb3J0cy5kdXBsaWNhdGVTdGF0ZSA9IGR1cGxpY2F0ZVN0YXRlO1xuZXhwb3J0cy5lbnF1ZXVlVGFzayA9IGVucXVldWVUYXNrO1xuZXhwb3J0cy5lc3RpbWF0ZUF0dHJpYnV0ZSA9IGVzdGltYXRlQXR0cmlidXRlO1xuZXhwb3J0cy5lc3RpbWF0ZUF0dHJpYnV0ZXMgPSBlc3RpbWF0ZUF0dHJpYnV0ZXM7XG5leHBvcnRzLmdldE9iamVjdENhY2hlID0gZ2V0T2JqZWN0Q2FjaGU7XG5leHBvcnRzLmdldFBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzO1xuZXhwb3J0cy5nZXRTZXJ2ZXJEYXRhID0gZ2V0U2VydmVyRGF0YTtcbmV4cG9ydHMuZ2V0U3RhdGUgPSBnZXRTdGF0ZTtcbmV4cG9ydHMuaW5pdGlhbGl6ZVN0YXRlID0gaW5pdGlhbGl6ZVN0YXRlO1xuZXhwb3J0cy5tZXJnZUZpcnN0UGVuZGluZ1N0YXRlID0gbWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucG9wUGVuZGluZ1N0YXRlID0gcG9wUGVuZGluZ1N0YXRlO1xuZXhwb3J0cy5wdXNoUGVuZGluZ1N0YXRlID0gcHVzaFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucmVtb3ZlU3RhdGUgPSByZW1vdmVTdGF0ZTtcbmV4cG9ydHMuc2V0UGVuZGluZ09wID0gc2V0UGVuZGluZ09wO1xuZXhwb3J0cy5zZXRTZXJ2ZXJEYXRhID0gc2V0U2VydmVyRGF0YTtcbnZhciBPYmplY3RTdGF0ZU11dGF0aW9ucyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL09iamVjdFN0YXRlTXV0YXRpb25zXCIpKTtcbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShlKSB7XG4gIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIF9XZWFrTWFwKSByZXR1cm4gbnVsbDtcbiAgdmFyIHIgPSBuZXcgX1dlYWtNYXAoKSxcbiAgICB0ID0gbmV3IF9XZWFrTWFwKCk7XG4gIHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZSA/IHQgOiByO1xuICB9KShlKTtcbn1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKGUsIHIpIHtcbiAgaWYgKCFyICYmIGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgaWYgKG51bGwgPT09IGUgfHwgXCJvYmplY3RcIiAhPSB0eXBlb2YgZSAmJiBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGUpIHJldHVybiB7XG4gICAgZGVmYXVsdDogZVxuICB9O1xuICB2YXIgdCA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShyKTtcbiAgaWYgKHQgJiYgdC5oYXMoZSkpIHJldHVybiB0LmdldChlKTtcbiAgdmFyIG4gPSB7XG4gICAgX19wcm90b19fOiBudWxsXG4gIH07XG4gIGZvciAodmFyIHUgaW4gZSkgaWYgKFwiZGVmYXVsdFwiICE9PSB1ICYmIHt9Lmhhc093blByb3BlcnR5LmNhbGwoZSwgdSkpIHtcbiAgICB2YXIgaSA9IF9PYmplY3QkZGVmaW5lUHJvcGVydHkgJiYgX09iamVjdCRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPyBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB1KSA6IG51bGw7XG4gICAgaSAmJiAoaS5nZXQgfHwgaS5zZXQpID8gX09iamVjdCRkZWZpbmVQcm9wZXJ0eShuLCB1LCBpKSA6IG5bdV0gPSBlW3VdO1xuICB9XG4gIHJldHVybiBuLmRlZmF1bHQgPSBlLCB0ICYmIHQuc2V0KGUsIG4pLCBuO1xufVxubGV0IG9iamVjdFN0YXRlID0ge307XG5mdW5jdGlvbiBnZXRTdGF0ZShvYmopIHtcbiAgY29uc3QgY2xhc3NEYXRhID0gb2JqZWN0U3RhdGVbb2JqLmNsYXNzTmFtZV07XG4gIGlmIChjbGFzc0RhdGEpIHtcbiAgICByZXR1cm4gY2xhc3NEYXRhW29iai5pZF0gfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGluaXRpYWxpemVTdGF0ZShvYmosIGluaXRpYWwpIHtcbiAgbGV0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGlmICghb2JqZWN0U3RhdGVbb2JqLmNsYXNzTmFtZV0pIHtcbiAgICBvYmplY3RTdGF0ZVtvYmouY2xhc3NOYW1lXSA9IHt9O1xuICB9XG4gIGlmICghaW5pdGlhbCkge1xuICAgIGluaXRpYWwgPSBPYmplY3RTdGF0ZU11dGF0aW9ucy5kZWZhdWx0U3RhdGUoKTtcbiAgfVxuICBzdGF0ZSA9IG9iamVjdFN0YXRlW29iai5jbGFzc05hbWVdW29iai5pZF0gPSBpbml0aWFsO1xuICByZXR1cm4gc3RhdGU7XG59XG5mdW5jdGlvbiByZW1vdmVTdGF0ZShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBkZWxldGUgb2JqZWN0U3RhdGVbb2JqLmNsYXNzTmFtZV1bb2JqLmlkXTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gZ2V0U2VydmVyRGF0YShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUuc2VydmVyRGF0YTtcbiAgfVxuICByZXR1cm4ge307XG59XG5mdW5jdGlvbiBzZXRTZXJ2ZXJEYXRhKG9iaiwgYXR0cmlidXRlcykge1xuICBjb25zdCBzZXJ2ZXJEYXRhID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikuc2VydmVyRGF0YTtcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMuc2V0U2VydmVyRGF0YShzZXJ2ZXJEYXRhLCBhdHRyaWJ1dGVzKTtcbn1cbmZ1bmN0aW9uIGdldFBlbmRpbmdPcHMob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLnBlbmRpbmdPcHM7XG4gIH1cbiAgcmV0dXJuIFt7fV07XG59XG5mdW5jdGlvbiBzZXRQZW5kaW5nT3Aob2JqLCBhdHRyLCBvcCkge1xuICBjb25zdCBwZW5kaW5nT3BzID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikucGVuZGluZ09wcztcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMuc2V0UGVuZGluZ09wKHBlbmRpbmdPcHMsIGF0dHIsIG9wKTtcbn1cbmZ1bmN0aW9uIHB1c2hQZW5kaW5nU3RhdGUob2JqKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBpbml0aWFsaXplU3RhdGUob2JqKS5wZW5kaW5nT3BzO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5wdXNoUGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xufVxuZnVuY3Rpb24gcG9wUGVuZGluZ1N0YXRlKG9iaikge1xuICBjb25zdCBwZW5kaW5nT3BzID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikucGVuZGluZ09wcztcbiAgcmV0dXJuIE9iamVjdFN0YXRlTXV0YXRpb25zLnBvcFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKTtcbn1cbmZ1bmN0aW9uIG1lcmdlRmlyc3RQZW5kaW5nU3RhdGUob2JqKSB7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzKG9iaik7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLm1lcmdlRmlyc3RQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG59XG5mdW5jdGlvbiBnZXRPYmplY3RDYWNoZShvYmopIHtcbiAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZShvYmopO1xuICBpZiAoc3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGUub2JqZWN0Q2FjaGU7XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuZnVuY3Rpb24gZXN0aW1hdGVBdHRyaWJ1dGUob2JqLCBhdHRyKSB7XG4gIGNvbnN0IHNlcnZlckRhdGEgPSBnZXRTZXJ2ZXJEYXRhKG9iaik7XG4gIGNvbnN0IHBlbmRpbmdPcHMgPSBnZXRQZW5kaW5nT3BzKG9iaik7XG4gIHJldHVybiBPYmplY3RTdGF0ZU11dGF0aW9ucy5lc3RpbWF0ZUF0dHJpYnV0ZShzZXJ2ZXJEYXRhLCBwZW5kaW5nT3BzLCBvYmosIGF0dHIpO1xufVxuZnVuY3Rpb24gZXN0aW1hdGVBdHRyaWJ1dGVzKG9iaikge1xuICBjb25zdCBzZXJ2ZXJEYXRhID0gZ2V0U2VydmVyRGF0YShvYmopO1xuICBjb25zdCBwZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcyhvYmopO1xuICByZXR1cm4gT2JqZWN0U3RhdGVNdXRhdGlvbnMuZXN0aW1hdGVBdHRyaWJ1dGVzKHNlcnZlckRhdGEsIHBlbmRpbmdPcHMsIG9iaik7XG59XG5mdW5jdGlvbiBjb21taXRTZXJ2ZXJDaGFuZ2VzKG9iaiwgY2hhbmdlcykge1xuICBjb25zdCBzdGF0ZSA9IGluaXRpYWxpemVTdGF0ZShvYmopO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5jb21taXRTZXJ2ZXJDaGFuZ2VzKHN0YXRlLnNlcnZlckRhdGEsIHN0YXRlLm9iamVjdENhY2hlLCBjaGFuZ2VzKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVUYXNrKG9iaiwgdGFzaykge1xuICBjb25zdCBzdGF0ZSA9IGluaXRpYWxpemVTdGF0ZShvYmopO1xuICByZXR1cm4gc3RhdGUudGFza3MuZW5xdWV1ZSh0YXNrKTtcbn1cbmZ1bmN0aW9uIGNsZWFyQWxsU3RhdGUoKSB7XG4gIG9iamVjdFN0YXRlID0ge307XG59XG5mdW5jdGlvbiBkdXBsaWNhdGVTdGF0ZShzb3VyY2UsIGRlc3QpIHtcbiAgZGVzdC5pZCA9IHNvdXJjZS5pZDtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZpbmVQcm9wZXJ0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIikpO1xuY2xhc3MgU29ja2V0V2VhcHAge1xuICBjb25zdHJ1Y3RvcihzZXJ2ZXJVUkwpIHtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIm9ub3BlblwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25tZXNzYWdlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbmNsb3NlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJvbmVycm9yXCIsIHZvaWQgMCk7XG4gICAgdGhpcy5vbm9wZW4gPSAoKSA9PiB7fTtcbiAgICB0aGlzLm9ubWVzc2FnZSA9ICgpID0+IHt9O1xuICAgIHRoaXMub25jbG9zZSA9ICgpID0+IHt9O1xuICAgIHRoaXMub25lcnJvciA9ICgpID0+IHt9O1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4Lm9uU29ja2V0T3BlbigoKSA9PiB7XG4gICAgICB0aGlzLm9ub3BlbigpO1xuICAgIH0pO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4Lm9uU29ja2V0TWVzc2FnZShtc2cgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5vbm1lc3NhZ2UobXNnKTtcbiAgICB9KTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5vblNvY2tldENsb3NlKGV2ZW50ID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMub25jbG9zZShldmVudCk7XG4gICAgfSk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3gub25Tb2NrZXRFcnJvcihlcnJvciA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLm9uZXJyb3IoZXJyb3IpO1xuICAgIH0pO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4LmNvbm5lY3RTb2NrZXQoe1xuICAgICAgdXJsOiBzZXJ2ZXJVUkxcbiAgICB9KTtcbiAgfVxuICBzZW5kKGRhdGEpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3guc2VuZFNvY2tldE1lc3NhZ2Uoe1xuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG4gIGNsb3NlKCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5jbG9zZVNvY2tldCgpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IFNvY2tldFdlYXBwO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gU29ja2V0V2VhcHA7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG5jb25zdCBTdG9yYWdlID0ge1xuICBhc3luYygpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICByZXR1cm4gISFjb250cm9sbGVyLmFzeW5jO1xuICB9LFxuICBnZXRJdGVtKHBhdGgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTeW5jaHJvbm91cyBzdG9yYWdlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgc3RvcmFnZSBjb250cm9sbGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLmdldEl0ZW0ocGF0aCk7XG4gIH0sXG4gIGdldEl0ZW1Bc3luYyhwYXRoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLmdldEl0ZW1Bc3luYyhwYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZShjb250cm9sbGVyLmdldEl0ZW0ocGF0aCkpO1xuICB9LFxuICBzZXRJdGVtKHBhdGgsIHZhbHVlKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3luY2hyb25vdXMgc3RvcmFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHN0b3JhZ2UgY29udHJvbGxlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5zZXRJdGVtKHBhdGgsIHZhbHVlKTtcbiAgfSxcbiAgc2V0SXRlbUFzeW5jKHBhdGgsIHZhbHVlKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLnNldEl0ZW1Bc3luYyhwYXRoLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY29udHJvbGxlci5zZXRJdGVtKHBhdGgsIHZhbHVlKSk7XG4gIH0sXG4gIHJlbW92ZUl0ZW0ocGF0aCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRTdG9yYWdlQ29udHJvbGxlcigpO1xuICAgIGlmIChjb250cm9sbGVyLmFzeW5jID09PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIHN0b3JhZ2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBzdG9yYWdlIGNvbnRyb2xsZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIucmVtb3ZlSXRlbShwYXRoKTtcbiAgfSxcbiAgcmVtb3ZlSXRlbUFzeW5jKHBhdGgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIucmVtb3ZlSXRlbUFzeW5jKHBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb21pc2UuZGVmYXVsdC5yZXNvbHZlKGNvbnRyb2xsZXIucmVtb3ZlSXRlbShwYXRoKSk7XG4gIH0sXG4gIGdldEFsbEtleXMoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuYXN5bmMgPT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3luY2hyb25vdXMgc3RvcmFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHN0b3JhZ2UgY29udHJvbGxlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5nZXRBbGxLZXlzKCk7XG4gIH0sXG4gIGdldEFsbEtleXNBc3luYygpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0U3RvcmFnZUNvbnRyb2xsZXIoKTtcbiAgICBpZiAoY29udHJvbGxlci5hc3luYyA9PT0gMSkge1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0QWxsS2V5c0FzeW5jKCk7XG4gICAgfVxuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUoY29udHJvbGxlci5nZXRBbGxLZXlzKCkpO1xuICB9LFxuICBnZW5lcmF0ZVBhdGgocGF0aCkge1xuICAgIGlmICghX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0KCdBUFBMSUNBVElPTl9JRCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIGNhbGwgUGFyc2UuaW5pdGlhbGl6ZSBiZWZvcmUgdXNpbmcgUGFyc2UuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gZ2V0IGEgU3RvcmFnZSBwYXRoIHRoYXQgd2FzIG5vdCBhIFN0cmluZy4nKTtcbiAgICB9XG4gICAgaWYgKHBhdGhbMF0gPT09ICcvJykge1xuICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKDEpO1xuICAgIH1cbiAgICByZXR1cm4gJ1BhcnNlLycgKyBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXQoJ0FQUExJQ0FUSU9OX0lEJykgKyAnLycgKyBwYXRoO1xuICB9LFxuICBfY2xlYXIoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFN0b3JhZ2VDb250cm9sbGVyKCk7XG4gICAgaWYgKGNvbnRyb2xsZXIuaGFzT3duUHJvcGVydHkoJ2NsZWFyJykpIHtcbiAgICAgIGNvbnRyb2xsZXIuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JhZ2U7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBTdG9yYWdlOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbi8qIGdsb2JhbCBsb2NhbFN0b3JhZ2UgKi9cblxuY29uc3QgU3RvcmFnZUNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jOiAwLFxuICBnZXRJdGVtKHBhdGgpIHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0ocGF0aCk7XG4gIH0sXG4gIHNldEl0ZW0ocGF0aCwgdmFsdWUpIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocGF0aCwgdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFF1b3RhIGV4Y2VlZGVkLCBwb3NzaWJseSBkdWUgdG8gU2FmYXJpIFByaXZhdGUgQnJvd3NpbmcgbW9kZVxuICAgICAgY29uc29sZS5sb2coZS5tZXNzYWdlKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZUl0ZW0ocGF0aCkge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHBhdGgpO1xuICB9LFxuICBnZXRBbGxLZXlzKCkge1xuICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsU3RvcmFnZS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAga2V5cy5wdXNoKGxvY2FsU3RvcmFnZS5rZXkoaSkpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbiAgfSxcbiAgY2xlYXIoKSB7XG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JhZ2VDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gU3RvcmFnZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xuLy8gV2hlbiB0aGVyZSBpcyBubyBuYXRpdmUgc3RvcmFnZSBpbnRlcmZhY2UsIHdlIGRlZmF1bHQgdG8gYW4gaW4tbWVtb3J5IG1hcFxuY29uc3QgbWVtTWFwID0ge307XG5jb25zdCBTdG9yYWdlQ29udHJvbGxlciA9IHtcbiAgYXN5bmM6IDAsXG4gIGdldEl0ZW0ocGF0aCkge1xuICAgIGlmIChtZW1NYXAuaGFzT3duUHJvcGVydHkocGF0aCkpIHtcbiAgICAgIHJldHVybiBtZW1NYXBbcGF0aF07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICBzZXRJdGVtKHBhdGgsIHZhbHVlKSB7XG4gICAgbWVtTWFwW3BhdGhdID0gU3RyaW5nKHZhbHVlKTtcbiAgfSxcbiAgcmVtb3ZlSXRlbShwYXRoKSB7XG4gICAgZGVsZXRlIG1lbU1hcFtwYXRoXTtcbiAgfSxcbiAgZ2V0QWxsS2V5cygpIHtcbiAgICByZXR1cm4gKDAsIF9rZXlzLmRlZmF1bHQpKG1lbU1hcCk7XG4gIH0sXG4gIGNsZWFyKCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG1lbU1hcCkge1xuICAgICAgaWYgKG1lbU1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGRlbGV0ZSBtZW1NYXBba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JhZ2VDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gU3RvcmFnZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfU3RvcmFnZUNvbnRyb2xsZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VDb250cm9sbGVyLnJlYWN0LW5hdGl2ZVwiKSk7XG52YXIgX1N0b3JhZ2VDb250cm9sbGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZUNvbnRyb2xsZXIuYnJvd3NlclwiKSk7XG52YXIgX1N0b3JhZ2VDb250cm9sbGVyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vU3RvcmFnZUNvbnRyb2xsZXIud2VhcHBcIikpO1xudmFyIF9TdG9yYWdlQ29udHJvbGxlcjQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1N0b3JhZ2VDb250cm9sbGVyLmRlZmF1bHRcIikpO1xubGV0IFN0b3JhZ2VDb250cm9sbGVyID0gX1N0b3JhZ2VDb250cm9sbGVyNC5kZWZhdWx0O1xuU3RvcmFnZUNvbnRyb2xsZXIgPSBfU3RvcmFnZUNvbnRyb2xsZXIyLmRlZmF1bHQ7XG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JhZ2VDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gU3RvcmFnZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcHJvbWlzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvcHJvbWlzZVwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG5jb25zdCBTdG9yYWdlQ29udHJvbGxlciA9IHtcbiAgYXN5bmM6IDEsXG4gIGdldEl0ZW1Bc3luYyhwYXRoKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLmdldEl0ZW0ocGF0aCwgKGVyciwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUodmFsdWUgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuICBzZXRJdGVtQXN5bmMocGF0aCwgdmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkuc2V0SXRlbShwYXRoLCB2YWx1ZSwgZXJyID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIHJlbW92ZUl0ZW1Bc3luYyhwYXRoKSB7XG4gICAgcmV0dXJuIG5ldyBfcHJvbWlzZS5kZWZhdWx0KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldEFzeW5jU3RvcmFnZSgpLnJlbW92ZUl0ZW0ocGF0aCwgZXJyID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGdldEFsbEtleXNBc3luYygpIHtcbiAgICByZXR1cm4gbmV3IF9wcm9taXNlLmRlZmF1bHQoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0QXN5bmNTdG9yYWdlKCkuZ2V0QWxsS2V5cygoZXJyLCBrZXlzKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGtleXMgfHwgW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgbXVsdGlHZXQoa2V5cykge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBc3luY1N0b3JhZ2UoKS5tdWx0aUdldChrZXlzLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0IHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAgbXVsdGlSZW1vdmUoa2V5cykge1xuICAgIHJldHVybiBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBc3luY1N0b3JhZ2UoKS5tdWx0aVJlbW92ZShrZXlzLCBlcnIgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShrZXlzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIGNsZWFyKCkge1xuICAgIHJldHVybiBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRBc3luY1N0b3JhZ2UoKS5jbGVhcigpO1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBTdG9yYWdlQ29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFN0b3JhZ2VDb250cm9sbGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2tleXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2tleXNcIikpO1xuY29uc3QgU3RvcmFnZUNvbnRyb2xsZXIgPSB7XG4gIGFzeW5jOiAwLFxuICBnZXRJdGVtKHBhdGgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHd4LmdldFN0b3JhZ2VTeW5jKHBhdGgpO1xuICB9LFxuICBzZXRJdGVtKHBhdGgsIHZhbHVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHd4LnNldFN0b3JhZ2VTeW5jKHBhdGgsIHZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBRdW90YSBleGNlZWRlZFxuICAgIH1cbiAgfSxcbiAgcmVtb3ZlSXRlbShwYXRoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHd4LnJlbW92ZVN0b3JhZ2VTeW5jKHBhdGgpO1xuICB9LFxuICBnZXRBbGxLZXlzKCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCByZXMgPSB3eC5nZXRTdG9yYWdlSW5mb1N5bmMoKTtcbiAgICByZXR1cm4gKDAsIF9rZXlzLmRlZmF1bHQpKHJlcyk7XG4gIH0sXG4gIGNsZWFyKCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3eC5jbGVhclN0b3JhZ2VTeW5jKCk7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JhZ2VDb250cm9sbGVyO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gU3RvcmFnZUNvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCIpKTtcbnZhciBfcHJvbWlzZVV0aWxzID0gcmVxdWlyZShcIi4vcHJvbWlzZVV0aWxzXCIpO1xuY2xhc3MgVGFza1F1ZXVlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJxdWV1ZVwiLCB2b2lkIDApO1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgfVxuICBlbnF1ZXVlKHRhc2spIHtcbiAgICBjb25zdCB0YXNrQ29tcGxldGUgPSAoMCwgX3Byb21pc2VVdGlscy5yZXNvbHZpbmdQcm9taXNlKSgpO1xuICAgIHRoaXMucXVldWUucHVzaCh7XG4gICAgICB0YXNrOiB0YXNrLFxuICAgICAgX2NvbXBsZXRpb246IHRhc2tDb21wbGV0ZVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGFzaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9kZXF1ZXVlKCk7XG4gICAgICAgIHRhc2tDb21wbGV0ZS5yZXNvbHZlKCk7XG4gICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgIHRoaXMuX2RlcXVldWUoKTtcbiAgICAgICAgdGFza0NvbXBsZXRlLnJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhc2tDb21wbGV0ZTtcbiAgfVxuICBfZGVxdWV1ZSgpIHtcbiAgICB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5xdWV1ZVswXTtcbiAgICAgIG5leHQudGFzaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9kZXF1ZXVlKCk7XG4gICAgICAgIG5leHQuX2NvbXBsZXRpb24ucmVzb2x2ZSgpO1xuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLl9kZXF1ZXVlKCk7XG4gICAgICAgIG5leHQuX2NvbXBsZXRpb24ucmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBUYXNrUXVldWU7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBUYXNrUXVldWU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfV2Vha01hcDIgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS93ZWFrLW1hcFwiKTtcbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNsZWFyQWxsU3RhdGUgPSBjbGVhckFsbFN0YXRlO1xuZXhwb3J0cy5jb21taXRTZXJ2ZXJDaGFuZ2VzID0gY29tbWl0U2VydmVyQ2hhbmdlcztcbmV4cG9ydHMuZHVwbGljYXRlU3RhdGUgPSBkdXBsaWNhdGVTdGF0ZTtcbmV4cG9ydHMuZW5xdWV1ZVRhc2sgPSBlbnF1ZXVlVGFzaztcbmV4cG9ydHMuZXN0aW1hdGVBdHRyaWJ1dGUgPSBlc3RpbWF0ZUF0dHJpYnV0ZTtcbmV4cG9ydHMuZXN0aW1hdGVBdHRyaWJ1dGVzID0gZXN0aW1hdGVBdHRyaWJ1dGVzO1xuZXhwb3J0cy5nZXRPYmplY3RDYWNoZSA9IGdldE9iamVjdENhY2hlO1xuZXhwb3J0cy5nZXRQZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcztcbmV4cG9ydHMuZ2V0U2VydmVyRGF0YSA9IGdldFNlcnZlckRhdGE7XG5leHBvcnRzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG5leHBvcnRzLmluaXRpYWxpemVTdGF0ZSA9IGluaXRpYWxpemVTdGF0ZTtcbmV4cG9ydHMubWVyZ2VGaXJzdFBlbmRpbmdTdGF0ZSA9IG1lcmdlRmlyc3RQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnBvcFBlbmRpbmdTdGF0ZSA9IHBvcFBlbmRpbmdTdGF0ZTtcbmV4cG9ydHMucHVzaFBlbmRpbmdTdGF0ZSA9IHB1c2hQZW5kaW5nU3RhdGU7XG5leHBvcnRzLnJlbW92ZVN0YXRlID0gcmVtb3ZlU3RhdGU7XG5leHBvcnRzLnNldFBlbmRpbmdPcCA9IHNldFBlbmRpbmdPcDtcbmV4cG9ydHMuc2V0U2VydmVyRGF0YSA9IHNldFNlcnZlckRhdGE7XG52YXIgX3dlYWtNYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL3dlYWstbWFwXCIpKTtcbnZhciBPYmplY3RTdGF0ZU11dGF0aW9ucyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL09iamVjdFN0YXRlTXV0YXRpb25zXCIpKTtcbnZhciBfVGFza1F1ZXVlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UYXNrUXVldWVcIikpO1xuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKGUpIHtcbiAgaWYgKFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgX1dlYWtNYXAyKSByZXR1cm4gbnVsbDtcbiAgdmFyIHIgPSBuZXcgX1dlYWtNYXAyKCksXG4gICAgdCA9IG5ldyBfV2Vha01hcDIoKTtcbiAgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAoZSkge1xuICAgIHJldHVybiBlID8gdCA6IHI7XG4gIH0pKGUpO1xufVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoZSwgcikge1xuICBpZiAoIXIgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICBpZiAobnVsbCA9PT0gZSB8fCBcIm9iamVjdFwiICE9IHR5cGVvZiBlICYmIFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZSkgcmV0dXJuIHtcbiAgICBkZWZhdWx0OiBlXG4gIH07XG4gIHZhciB0ID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKHIpO1xuICBpZiAodCAmJiB0LmhhcyhlKSkgcmV0dXJuIHQuZ2V0KGUpO1xuICB2YXIgbiA9IHtcbiAgICBfX3Byb3RvX186IG51bGxcbiAgfTtcbiAgZm9yICh2YXIgdSBpbiBlKSBpZiAoXCJkZWZhdWx0XCIgIT09IHUgJiYge30uaGFzT3duUHJvcGVydHkuY2FsbChlLCB1KSkge1xuICAgIHZhciBpID0gX09iamVjdCRkZWZpbmVQcm9wZXJ0eSAmJiBfT2JqZWN0JGdldE93blByb3BlcnR5RGVzY3JpcHRvciA/IF9PYmplY3QkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHUpIDogbnVsbDtcbiAgICBpICYmIChpLmdldCB8fCBpLnNldCkgPyBfT2JqZWN0JGRlZmluZVByb3BlcnR5KG4sIHUsIGkpIDogblt1XSA9IGVbdV07XG4gIH1cbiAgcmV0dXJuIG4uZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgbiksIG47XG59XG5sZXQgb2JqZWN0U3RhdGUgPSBuZXcgX3dlYWtNYXAuZGVmYXVsdCgpO1xuZnVuY3Rpb24gZ2V0U3RhdGUob2JqKSB7XG4gIGNvbnN0IGNsYXNzRGF0YSA9IG9iamVjdFN0YXRlLmdldChvYmopO1xuICByZXR1cm4gY2xhc3NEYXRhIHx8IG51bGw7XG59XG5mdW5jdGlvbiBpbml0aWFsaXplU3RhdGUob2JqLCBpbml0aWFsKSB7XG4gIGxldCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAoIWluaXRpYWwpIHtcbiAgICBpbml0aWFsID0ge1xuICAgICAgc2VydmVyRGF0YToge30sXG4gICAgICBwZW5kaW5nT3BzOiBbe31dLFxuICAgICAgb2JqZWN0Q2FjaGU6IHt9LFxuICAgICAgdGFza3M6IG5ldyBfVGFza1F1ZXVlLmRlZmF1bHQoKSxcbiAgICAgIGV4aXN0ZWQ6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBzdGF0ZSA9IGluaXRpYWw7XG4gIG9iamVjdFN0YXRlLnNldChvYmosIHN0YXRlKTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3RhdGUob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgb2JqZWN0U3RhdGUuZGVsZXRlKG9iaik7XG4gIHJldHVybiBzdGF0ZTtcbn1cbmZ1bmN0aW9uIGdldFNlcnZlckRhdGEob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLnNlcnZlckRhdGE7XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuZnVuY3Rpb24gc2V0U2VydmVyRGF0YShvYmosIGF0dHJpYnV0ZXMpIHtcbiAgY29uc3Qgc2VydmVyRGF0YSA9IGluaXRpYWxpemVTdGF0ZShvYmopLnNlcnZlckRhdGE7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLnNldFNlcnZlckRhdGEoc2VydmVyRGF0YSwgYXR0cmlidXRlcyk7XG59XG5mdW5jdGlvbiBnZXRQZW5kaW5nT3BzKG9iaikge1xuICBjb25zdCBzdGF0ZSA9IGdldFN0YXRlKG9iaik7XG4gIGlmIChzdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZS5wZW5kaW5nT3BzO1xuICB9XG4gIHJldHVybiBbe31dO1xufVxuZnVuY3Rpb24gc2V0UGVuZGluZ09wKG9iaiwgYXR0ciwgb3ApIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGluaXRpYWxpemVTdGF0ZShvYmopLnBlbmRpbmdPcHM7XG4gIE9iamVjdFN0YXRlTXV0YXRpb25zLnNldFBlbmRpbmdPcChwZW5kaW5nT3BzLCBhdHRyLCBvcCk7XG59XG5mdW5jdGlvbiBwdXNoUGVuZGluZ1N0YXRlKG9iaikge1xuICBjb25zdCBwZW5kaW5nT3BzID0gaW5pdGlhbGl6ZVN0YXRlKG9iaikucGVuZGluZ09wcztcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMucHVzaFBlbmRpbmdTdGF0ZShwZW5kaW5nT3BzKTtcbn1cbmZ1bmN0aW9uIHBvcFBlbmRpbmdTdGF0ZShvYmopIHtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGluaXRpYWxpemVTdGF0ZShvYmopLnBlbmRpbmdPcHM7XG4gIHJldHVybiBPYmplY3RTdGF0ZU11dGF0aW9ucy5wb3BQZW5kaW5nU3RhdGUocGVuZGluZ09wcyk7XG59XG5mdW5jdGlvbiBtZXJnZUZpcnN0UGVuZGluZ1N0YXRlKG9iaikge1xuICBjb25zdCBwZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcyhvYmopO1xuICBPYmplY3RTdGF0ZU11dGF0aW9ucy5tZXJnZUZpcnN0UGVuZGluZ1N0YXRlKHBlbmRpbmdPcHMpO1xufVxuZnVuY3Rpb24gZ2V0T2JqZWN0Q2FjaGUob2JqKSB7XG4gIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUob2JqKTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgcmV0dXJuIHN0YXRlLm9iamVjdENhY2hlO1xuICB9XG4gIHJldHVybiB7fTtcbn1cbmZ1bmN0aW9uIGVzdGltYXRlQXR0cmlidXRlKG9iaiwgYXR0cikge1xuICBjb25zdCBzZXJ2ZXJEYXRhID0gZ2V0U2VydmVyRGF0YShvYmopO1xuICBjb25zdCBwZW5kaW5nT3BzID0gZ2V0UGVuZGluZ09wcyhvYmopO1xuICByZXR1cm4gT2JqZWN0U3RhdGVNdXRhdGlvbnMuZXN0aW1hdGVBdHRyaWJ1dGUoc2VydmVyRGF0YSwgcGVuZGluZ09wcywgb2JqLCBhdHRyKTtcbn1cbmZ1bmN0aW9uIGVzdGltYXRlQXR0cmlidXRlcyhvYmopIHtcbiAgY29uc3Qgc2VydmVyRGF0YSA9IGdldFNlcnZlckRhdGEob2JqKTtcbiAgY29uc3QgcGVuZGluZ09wcyA9IGdldFBlbmRpbmdPcHMob2JqKTtcbiAgcmV0dXJuIE9iamVjdFN0YXRlTXV0YXRpb25zLmVzdGltYXRlQXR0cmlidXRlcyhzZXJ2ZXJEYXRhLCBwZW5kaW5nT3BzLCBvYmopO1xufVxuZnVuY3Rpb24gY29tbWl0U2VydmVyQ2hhbmdlcyhvYmosIGNoYW5nZXMpIHtcbiAgY29uc3Qgc3RhdGUgPSBpbml0aWFsaXplU3RhdGUob2JqKTtcbiAgT2JqZWN0U3RhdGVNdXRhdGlvbnMuY29tbWl0U2VydmVyQ2hhbmdlcyhzdGF0ZS5zZXJ2ZXJEYXRhLCBzdGF0ZS5vYmplY3RDYWNoZSwgY2hhbmdlcyk7XG59XG5mdW5jdGlvbiBlbnF1ZXVlVGFzayhvYmosIHRhc2spIHtcbiAgY29uc3Qgc3RhdGUgPSBpbml0aWFsaXplU3RhdGUob2JqKTtcbiAgcmV0dXJuIHN0YXRlLnRhc2tzLmVucXVldWUodGFzayk7XG59XG5mdW5jdGlvbiBkdXBsaWNhdGVTdGF0ZShzb3VyY2UsIGRlc3QpIHtcbiAgY29uc3Qgb2xkU3RhdGUgPSBpbml0aWFsaXplU3RhdGUoc291cmNlKTtcbiAgY29uc3QgbmV3U3RhdGUgPSBpbml0aWFsaXplU3RhdGUoZGVzdCk7XG4gIGZvciAoY29uc3Qga2V5IGluIG9sZFN0YXRlLnNlcnZlckRhdGEpIHtcbiAgICBuZXdTdGF0ZS5zZXJ2ZXJEYXRhW2tleV0gPSBvbGRTdGF0ZS5zZXJ2ZXJEYXRhW2tleV07XG4gIH1cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9sZFN0YXRlLnBlbmRpbmdPcHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2xkU3RhdGUucGVuZGluZ09wc1tpbmRleF0pIHtcbiAgICAgIG5ld1N0YXRlLnBlbmRpbmdPcHNbaW5kZXhdW2tleV0gPSBvbGRTdGF0ZS5wZW5kaW5nT3BzW2luZGV4XVtrZXldO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBvbGRTdGF0ZS5vYmplY3RDYWNoZSkge1xuICAgIG5ld1N0YXRlLm9iamVjdENhY2hlW2tleV0gPSBvbGRTdGF0ZS5vYmplY3RDYWNoZVtrZXldO1xuICB9XG4gIG5ld1N0YXRlLmV4aXN0ZWQgPSBvbGRTdGF0ZS5leGlzdGVkO1xufVxuZnVuY3Rpb24gY2xlYXJBbGxTdGF0ZSgpIHtcbiAgb2JqZWN0U3RhdGUgPSBuZXcgX3dlYWtNYXAuZGVmYXVsdCgpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3dzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwid3NcIikpO1xudmFyIF9Tb2NrZXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1NvY2tldC53ZWFwcFwiKSk7XG4vKiBnbG9iYWwgV2ViU29ja2V0ICovXG5cbmxldCBXZWJTb2NrZXRDb250cm9sbGVyO1xudHJ5IHtcbiAgV2ViU29ja2V0Q29udHJvbGxlciA9IHR5cGVvZiBXZWJTb2NrZXQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFdlYlNvY2tldCA9PT0gJ29iamVjdCcgPyBXZWJTb2NrZXQgOiBudWxsO1xufSBjYXRjaCAoXykge1xuICAvLyBXZWJTb2NrZXQgdW5hdmFpbGFibGVcbn1cbm1vZHVsZS5leHBvcnRzID0gV2ViU29ja2V0Q29udHJvbGxlcjtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFdlYlNvY2tldENvbnRyb2xsZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9qc29uL3N0cmluZ2lmeVwiKSk7XG52YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKSk7XG5jbGFzcyBYaHJXZWFwcCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwiVU5TRU5UXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJPUEVORURcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIkhFQURFUlNfUkVDRUlWRURcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIkxPQURJTkdcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcIkRPTkVcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcImhlYWRlclwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVhZHlTdGF0ZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwic3RhdHVzXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZXNwb25zZVwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwicmVzcG9uc2VUeXBlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZXNwb25zZVRleHRcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInJlc3BvbnNlSGVhZGVyXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJtZXRob2RcIiwgdm9pZCAwKTtcbiAgICAoMCwgX2RlZmluZVByb3BlcnR5Mi5kZWZhdWx0KSh0aGlzLCBcInVybFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25hYm9ydFwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25wcm9ncmVzc1wiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25lcnJvclwiLCB2b2lkIDApO1xuICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRoaXMsIFwib25yZWFkeXN0YXRlY2hhbmdlXCIsIHZvaWQgMCk7XG4gICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGhpcywgXCJyZXF1ZXN0VGFza1wiLCB2b2lkIDApO1xuICAgIHRoaXMuVU5TRU5UID0gMDtcbiAgICB0aGlzLk9QRU5FRCA9IDE7XG4gICAgdGhpcy5IRUFERVJTX1JFQ0VJVkVEID0gMjtcbiAgICB0aGlzLkxPQURJTkcgPSAzO1xuICAgIHRoaXMuRE9ORSA9IDQ7XG4gICAgdGhpcy5oZWFkZXIgPSB7fTtcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSB0aGlzLkRPTkU7XG4gICAgdGhpcy5zdGF0dXMgPSAwO1xuICAgIHRoaXMucmVzcG9uc2UgPSAnJztcbiAgICB0aGlzLnJlc3BvbnNlVHlwZSA9ICcnO1xuICAgIHRoaXMucmVzcG9uc2VUZXh0ID0gJyc7XG4gICAgdGhpcy5yZXNwb25zZUhlYWRlciA9IHt9O1xuICAgIHRoaXMubWV0aG9kID0gJyc7XG4gICAgdGhpcy51cmwgPSAnJztcbiAgICB0aGlzLm9uYWJvcnQgPSAoKSA9PiB7fTtcbiAgICB0aGlzLm9ucHJvZ3Jlc3MgPSAoKSA9PiB7fTtcbiAgICB0aGlzLm9uZXJyb3IgPSAoKSA9PiB7fTtcbiAgICB0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHt9O1xuICAgIHRoaXMucmVxdWVzdFRhc2sgPSBudWxsO1xuICB9XG4gIGdldEFsbFJlc3BvbnNlSGVhZGVycygpIHtcbiAgICBsZXQgaGVhZGVyID0gJyc7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5yZXNwb25zZUhlYWRlcikge1xuICAgICAgaGVhZGVyICs9IGtleSArICc6JyArIHRoaXMuZ2V0UmVzcG9uc2VIZWFkZXIoa2V5KSArICdcXHJcXG4nO1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyO1xuICB9XG4gIGdldFJlc3BvbnNlSGVhZGVyKGtleSkge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlSGVhZGVyW2tleV07XG4gIH1cbiAgc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbHVlKSB7XG4gICAgdGhpcy5oZWFkZXJba2V5XSA9IHZhbHVlO1xuICB9XG4gIG9wZW4obWV0aG9kLCB1cmwpIHtcbiAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgfVxuICBhYm9ydCgpIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdFRhc2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXF1ZXN0VGFzay5hYm9ydCgpO1xuICAgIHRoaXMuc3RhdHVzID0gMDtcbiAgICB0aGlzLnJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub25hYm9ydCgpO1xuICAgIHRoaXMub25yZWFkeXN0YXRlY2hhbmdlKCk7XG4gIH1cbiAgc2VuZChkYXRhKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMucmVxdWVzdFRhc2sgPSB3eC5yZXF1ZXN0KHtcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGhlYWRlcjogdGhpcy5oZWFkZXIsXG4gICAgICByZXNwb25zZVR5cGU6IHRoaXMucmVzcG9uc2VUeXBlLFxuICAgICAgc3VjY2VzczogcmVzID0+IHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSByZXMuc3RhdHVzQ29kZTtcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlcy5kYXRhO1xuICAgICAgICB0aGlzLnJlc3BvbnNlSGVhZGVyID0gcmVzLmhlYWRlcjtcbiAgICAgICAgdGhpcy5yZXNwb25zZVRleHQgPSAoMCwgX3N0cmluZ2lmeS5kZWZhdWx0KShyZXMuZGF0YSk7XG4gICAgICAgIHRoaXMucmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgICB0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZSgpO1xuICAgICAgfSxcbiAgICAgIGZhaWw6IGVyciA9PiB7XG4gICAgICAgIHRoaXMucmVxdWVzdFRhc2sgPSBudWxsO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMub25lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVxdWVzdFRhc2sub25Qcm9ncmVzc1VwZGF0ZShyZXMgPT4ge1xuICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgIGxlbmd0aENvbXB1dGFibGU6IHJlcy50b3RhbEJ5dGVzRXhwZWN0ZWRUb1dyaXRlICE9PSAwLFxuICAgICAgICBsb2FkZWQ6IHJlcy50b3RhbEJ5dGVzV3JpdHRlbixcbiAgICAgICAgdG90YWw6IHJlcy50b3RhbEJ5dGVzRXhwZWN0ZWRUb1dyaXRlXG4gICAgICB9O1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5vbnByb2dyZXNzKGV2ZW50KTtcbiAgICB9KTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBYaHJXZWFwcDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFhocldlYXBwOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBhcnJheUNvbnRhaW5zT2JqZWN0O1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG5mdW5jdGlvbiBhcnJheUNvbnRhaW5zT2JqZWN0KGFycmF5LCBvYmplY3QpIHtcbiAgaWYgKCgwLCBfaW5kZXhPZi5kZWZhdWx0KShhcnJheSkuY2FsbChhcnJheSwgb2JqZWN0KSA+IC0xKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldIGluc3RhbmNlb2YgUGFyc2VPYmplY3QgJiYgYXJyYXlbaV0uY2xhc3NOYW1lID09PSBvYmplY3QuY2xhc3NOYW1lICYmIGFycmF5W2ldLl9nZXRJZCgpID09PSBvYmplY3QuX2dldElkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNhbkJlU2VyaWFsaXplZDtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xuZnVuY3Rpb24gY2FuQmVTZXJpYWxpemVkKG9iaikge1xuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGlmICghKG9iaiBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSBvYmouYXR0cmlidXRlcztcbiAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJpYnV0ZXMpIHtcbiAgICBjb25zdCB2YWwgPSBhdHRyaWJ1dGVzW2F0dHJdO1xuICAgIGlmICghY2FuQmVTZXJpYWxpemVkSGVscGVyKHZhbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBjYW5CZVNlcmlhbGl6ZWRIZWxwZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VSZWxhdGlvbi5kZWZhdWx0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgIHJldHVybiAhIXZhbHVlLmlkO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9QYXJzZUZpbGUuZGVmYXVsdCkge1xuICAgIGlmICh2YWx1ZS51cmwoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKHZhbHVlKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghY2FuQmVTZXJpYWxpemVkSGVscGVyKHZhbHVlW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvciAoY29uc3QgayBpbiB2YWx1ZSkge1xuICAgIGlmICghY2FuQmVTZXJpYWxpemVkSGVscGVyKHZhbHVlW2tdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZGVjb2RlO1xudmFyIF9pc0FycmF5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9hcnJheS9pcy1hcnJheVwiKSk7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbnZhciBfUGFyc2VGaWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUZpbGVcIikpO1xudmFyIF9QYXJzZUdlb1BvaW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUdlb1BvaW50XCIpKTtcbnZhciBfUGFyc2VQb2x5Z29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVBvbHlnb25cIikpO1xudmFyIF9QYXJzZVJlbGF0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZVJlbGF0aW9uXCIpKTtcbmZ1bmN0aW9uIGRlY29kZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICBjb25zdCBkdXAgPSBbXTtcbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkodmFsdWUpLmNhbGwodmFsdWUsICh2LCBpKSA9PiB7XG4gICAgICBkdXBbaV0gPSBkZWNvZGUodik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGR1cDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlLl9fb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3Qge1xuICAgICAgb3BGcm9tSlNPTlxuICAgIH0gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9wKCk7XG4gICAgcmV0dXJuIG9wRnJvbUpTT04odmFsdWUpO1xuICB9XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ1BvaW50ZXInICYmIHZhbHVlLmNsYXNzTmFtZSkge1xuICAgIHJldHVybiBQYXJzZU9iamVjdC5mcm9tSlNPTih2YWx1ZSk7XG4gIH1cbiAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ09iamVjdCcgJiYgdmFsdWUuY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIFBhcnNlT2JqZWN0LmZyb21KU09OKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWUuX190eXBlID09PSAnUmVsYXRpb24nKSB7XG4gICAgLy8gVGhlIHBhcmVudCBhbmQga2V5IGZpZWxkcyB3aWxsIGJlIHBvcHVsYXRlZCBieSB0aGUgcGFyZW50XG4gICAgY29uc3QgcmVsYXRpb24gPSBuZXcgX1BhcnNlUmVsYXRpb24uZGVmYXVsdChudWxsLCBudWxsKTtcbiAgICByZWxhdGlvbi50YXJnZXRDbGFzc05hbWUgPSB2YWx1ZS5jbGFzc05hbWU7XG4gICAgcmV0dXJuIHJlbGF0aW9uO1xuICB9XG4gIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdEYXRlJykge1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZS5pc28pO1xuICB9XG4gIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdGaWxlJykge1xuICAgIHJldHVybiBfUGFyc2VGaWxlLmRlZmF1bHQuZnJvbUpTT04odmFsdWUpO1xuICB9XG4gIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdHZW9Qb2ludCcpIHtcbiAgICByZXR1cm4gbmV3IF9QYXJzZUdlb1BvaW50LmRlZmF1bHQoe1xuICAgICAgbGF0aXR1ZGU6IHZhbHVlLmxhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlOiB2YWx1ZS5sb25naXR1ZGVcbiAgICB9KTtcbiAgfVxuICBpZiAodmFsdWUuX190eXBlID09PSAnUG9seWdvbicpIHtcbiAgICByZXR1cm4gbmV3IF9QYXJzZVBvbHlnb24uZGVmYXVsdCh2YWx1ZS5jb29yZGluYXRlcyk7XG4gIH1cbiAgY29uc3QgY29weSA9IHt9O1xuICBmb3IgKGNvbnN0IGsgaW4gdmFsdWUpIHtcbiAgICBjb3B5W2tdID0gZGVjb2RlKHZhbHVlW2tdKTtcbiAgfVxuICByZXR1cm4gY29weTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG52YXIgX2luZGV4T2YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2luZGV4LW9mXCIpKTtcbnZhciBfa2V5cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2tleXNcIikpO1xudmFyIF9zdGFydHNXaXRoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9zdGFydHMtd2l0aFwiKSk7XG52YXIgX2NvbmNhdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvY29uY2F0XCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9tYXAgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL21hcFwiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlQUNMID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUFDTFwiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBfUGFyc2VHZW9Qb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VHZW9Qb2ludFwiKSk7XG52YXIgX1BhcnNlUG9seWdvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VQb2x5Z29uXCIpKTtcbnZhciBfUGFyc2VSZWxhdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VSZWxhdGlvblwiKSk7XG5mdW5jdGlvbiBlbmNvZGUodmFsdWUsIGRpc2FsbG93T2JqZWN0cywgZm9yY2VQb2ludGVycywgc2Vlbiwgb2ZmbGluZSkge1xuICBjb25zdCBQYXJzZU9iamVjdCA9IF9Db3JlTWFuYWdlci5kZWZhdWx0LmdldFBhcnNlT2JqZWN0KCk7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgaWYgKGRpc2FsbG93T2JqZWN0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJzZSBPYmplY3RzIG5vdCBhbGxvd2VkIGhlcmUnKTtcbiAgICB9XG4gICAgY29uc3Qgc2VlbkVudHJ5ID0gdmFsdWUuaWQgPyB2YWx1ZS5jbGFzc05hbWUgKyAnOicgKyB2YWx1ZS5pZCA6IHZhbHVlO1xuICAgIGlmIChmb3JjZVBvaW50ZXJzIHx8ICFzZWVuIHx8ICgwLCBfaW5kZXhPZi5kZWZhdWx0KShzZWVuKS5jYWxsKHNlZW4sIHNlZW5FbnRyeSkgPiAtMSB8fCB2YWx1ZS5kaXJ0eSgpIHx8ICgwLCBfa2V5cy5kZWZhdWx0KSh2YWx1ZS5fZ2V0U2VydmVyRGF0YSgpKS5sZW5ndGggPCAxKSB7XG4gICAgICB2YXIgX2NvbnRleHQ7XG4gICAgICBpZiAob2ZmbGluZSAmJiAoMCwgX3N0YXJ0c1dpdGguZGVmYXVsdCkoX2NvbnRleHQgPSB2YWx1ZS5fZ2V0SWQoKSkuY2FsbChfY29udGV4dCwgJ2xvY2FsJykpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvT2ZmbGluZVBvaW50ZXIoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS50b1BvaW50ZXIoKTtcbiAgICB9XG4gICAgc2VlbiA9ICgwLCBfY29uY2F0LmRlZmF1bHQpKHNlZW4pLmNhbGwoc2Vlbiwgc2VlbkVudHJ5KTtcbiAgICByZXR1cm4gdmFsdWUuX3RvRnVsbEpTT04oc2Vlbiwgb2ZmbGluZSk7XG4gIH1cbiAgY29uc3Qge1xuICAgIE9wXG4gIH0gPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9wKCk7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9wIHx8IHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlQUNMLmRlZmF1bHQgfHwgdmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0IHx8IHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlUG9seWdvbi5kZWZhdWx0IHx8IHZhbHVlIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkge1xuICAgIHJldHVybiB2YWx1ZS50b0pTT04oKTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQpIHtcbiAgICBpZiAoIXZhbHVlLnVybCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIGVuY29kZSBhbiB1bnNhdmVkIGZpbGUuJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS50b0pTT04oKTtcbiAgfVxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nKSB7XG4gICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byBlbmNvZGUgYW4gaW52YWxpZCBkYXRlLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiAnRGF0ZScsXG4gICAgICBpc286IHZhbHVlLnRvSlNPTigpXG4gICAgfTtcbiAgfVxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXScgJiYgdHlwZW9mIHZhbHVlLnNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUuc291cmNlO1xuICB9XG4gIGlmICgoMCwgX2lzQXJyYXkuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgcmV0dXJuICgwLCBfbWFwLmRlZmF1bHQpKHZhbHVlKS5jYWxsKHZhbHVlLCB2ID0+IHtcbiAgICAgIHJldHVybiBlbmNvZGUodiwgZGlzYWxsb3dPYmplY3RzLCBmb3JjZVBvaW50ZXJzLCBzZWVuLCBvZmZsaW5lKTtcbiAgICB9KTtcbiAgfVxuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgIGZvciAoY29uc3QgayBpbiB2YWx1ZSkge1xuICAgICAgb3V0cHV0W2tdID0gZW5jb2RlKHZhbHVlW2tdLCBkaXNhbGxvd09iamVjdHMsIGZvcmNlUG9pbnRlcnMsIHNlZW4sIG9mZmxpbmUpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIF9kZWZhdWx0KHZhbHVlLCBkaXNhbGxvd09iamVjdHMsIGZvcmNlUG9pbnRlcnMsIHNlZW4sIG9mZmxpbmUpIHtcbiAgcmV0dXJuIGVuY29kZSh2YWx1ZSwgISFkaXNhbGxvd09iamVjdHMsICEhZm9yY2VQb2ludGVycywgc2VlbiB8fCBbXSwgb2ZmbGluZSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGVxdWFscztcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xudmFyIF9rZXlzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3Qva2V5c1wiKSk7XG52YXIgX0NvcmVNYW5hZ2VyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db3JlTWFuYWdlclwiKSk7XG52YXIgX1BhcnNlQUNMID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9QYXJzZUFDTFwiKSk7XG52YXIgX1BhcnNlRmlsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VGaWxlXCIpKTtcbnZhciBfUGFyc2VHZW9Qb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUGFyc2VHZW9Qb2ludFwiKSk7XG5mdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICBjb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gIGlmICh0b1N0cmluZy5jYWxsKGEpID09PSAnW29iamVjdCBEYXRlXScgfHwgdG9TdHJpbmcuY2FsbChiKSA9PT0gJ1tvYmplY3QgRGF0ZV0nKSB7XG4gICAgY29uc3QgZGF0ZUEgPSBuZXcgRGF0ZShhKTtcbiAgICBjb25zdCBkYXRlQiA9IG5ldyBEYXRlKGIpO1xuICAgIHJldHVybiArZGF0ZUEgPT09ICtkYXRlQjtcbiAgfVxuICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghYSB8fCB0eXBlb2YgYSAhPT0gJ29iamVjdCcpIHtcbiAgICAvLyBhIGlzIGEgcHJpbWl0aXZlXG4gICAgcmV0dXJuIGEgPT09IGI7XG4gIH1cbiAgaWYgKCgwLCBfaXNBcnJheS5kZWZhdWx0KShhKSB8fCAoMCwgX2lzQXJyYXkuZGVmYXVsdCkoYikpIHtcbiAgICBpZiAoISgwLCBfaXNBcnJheS5kZWZhdWx0KShhKSB8fCAhKDAsIF9pc0FycmF5LmRlZmF1bHQpKGIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IGEubGVuZ3RoOyBpLS07KSB7XG4gICAgICBpZiAoIWVxdWFscyhhW2ldLCBiW2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgaWYgKGEgaW5zdGFuY2VvZiBfUGFyc2VBQ0wuZGVmYXVsdCB8fCBhIGluc3RhbmNlb2YgX1BhcnNlRmlsZS5kZWZhdWx0IHx8IGEgaW5zdGFuY2VvZiBfUGFyc2VHZW9Qb2ludC5kZWZhdWx0IHx8IGEgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgIHJldHVybiBhLmVxdWFscyhiKTtcbiAgfVxuICBpZiAoYiBpbnN0YW5jZW9mIFBhcnNlT2JqZWN0KSB7XG4gICAgaWYgKGEuX190eXBlID09PSAnT2JqZWN0JyB8fCBhLl9fdHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICByZXR1cm4gYS5vYmplY3RJZCA9PT0gYi5pZCAmJiBhLmNsYXNzTmFtZSA9PT0gYi5jbGFzc05hbWU7XG4gICAgfVxuICB9XG4gIGlmICgoMCwgX2tleXMuZGVmYXVsdCkoYSkubGVuZ3RoICE9PSAoMCwgX2tleXMuZGVmYXVsdCkoYikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgayBpbiBhKSB7XG4gICAgaWYgKCFlcXVhbHMoYVtrXSwgYltrXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXNjYXBlO1xuY29uc3QgZW5jb2RlZCA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gICcvJzogJyYjeDJGOycsXG4gIFwiJ1wiOiAnJiN4Mjc7JyxcbiAgJ1wiJzogJyZxdW90Oydcbn07XG5mdW5jdGlvbiBlc2NhcGUoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvWyY8PlxcLydcIl0vZywgZnVuY3Rpb24gKGNoYXIpIHtcbiAgICByZXR1cm4gZW5jb2RlZFtjaGFyXTtcbiAgfSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGlzUmV2b2NhYmxlU2Vzc2lvbjtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xuZnVuY3Rpb24gaXNSZXZvY2FibGVTZXNzaW9uKHRva2VuKSB7XG4gIHJldHVybiAoMCwgX2luZGV4T2YuZGVmYXVsdCkodG9rZW4pLmNhbGwodG9rZW4sICdyOicpID4gLTE7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHBhcnNlRGF0ZTtcbnZhciBfcGFyc2VJbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wYXJzZS1pbnRcIikpO1xuZnVuY3Rpb24gcGFyc2VEYXRlKGlzbzg2MDEpIHtcbiAgY29uc3QgcmVnZXhwID0gbmV3IFJlZ0V4cCgnXihbMC05XXsxLDR9KS0oWzAtOV17MSwyfSktKFswLTldezEsMn0pJyArICdUJyArICcoWzAtOV17MSwyfSk6KFswLTldezEsMn0pOihbMC05XXsxLDJ9KScgKyAnKC4oWzAtOV0rKSk/JyArICdaJCcpO1xuICBjb25zdCBtYXRjaCA9IHJlZ2V4cC5leGVjKGlzbzg2MDEpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgeWVhciA9ICgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzFdKSB8fCAwO1xuICBjb25zdCBtb250aCA9ICgoMCwgX3BhcnNlSW50Mi5kZWZhdWx0KShtYXRjaFsyXSkgfHwgMSkgLSAxO1xuICBjb25zdCBkYXkgPSAoMCwgX3BhcnNlSW50Mi5kZWZhdWx0KShtYXRjaFszXSkgfHwgMDtcbiAgY29uc3QgaG91ciA9ICgwLCBfcGFyc2VJbnQyLmRlZmF1bHQpKG1hdGNoWzRdKSB8fCAwO1xuICBjb25zdCBtaW51dGUgPSAoMCwgX3BhcnNlSW50Mi5kZWZhdWx0KShtYXRjaFs1XSkgfHwgMDtcbiAgY29uc3Qgc2Vjb25kID0gKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbNl0pIHx8IDA7XG4gIGNvbnN0IG1pbGxpID0gKDAsIF9wYXJzZUludDIuZGVmYXVsdCkobWF0Y2hbOF0pIHx8IDA7XG4gIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGkpKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9vYmplY3QvZGVmaW5lLXByb3BlcnR5XCIpO1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKTtcbl9PYmplY3QkZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jb250aW51ZVdoaWxlID0gY29udGludWVXaGlsZTtcbmV4cG9ydHMucmVzb2x2aW5nUHJvbWlzZSA9IHJlc29sdmluZ1Byb21pc2U7XG5leHBvcnRzLndoZW4gPSB3aGVuO1xudmFyIF9wcm9taXNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9wcm9taXNlXCIpKTtcbnZhciBfaXNBcnJheSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvYXJyYXkvaXMtYXJyYXlcIikpO1xuLy8gQ3JlYXRlIERlZmVycmVkIFByb21pc2VcbmZ1bmN0aW9uIHJlc29sdmluZ1Byb21pc2UoKSB7XG4gIGxldCByZXM7XG4gIGxldCByZWo7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgX3Byb21pc2UuZGVmYXVsdCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVzID0gcmVzb2x2ZTtcbiAgICByZWogPSByZWplY3Q7XG4gIH0pO1xuICBjb25zdCBkZWZlciA9IHByb21pc2U7XG4gIGRlZmVyLnJlc29sdmUgPSByZXM7XG4gIGRlZmVyLnJlamVjdCA9IHJlajtcbiAgcmV0dXJuIGRlZmVyO1xufVxuZnVuY3Rpb24gd2hlbihwcm9taXNlcykge1xuICBsZXQgb2JqZWN0cztcbiAgY29uc3QgYXJyYXlBcmd1bWVudCA9ICgwLCBfaXNBcnJheS5kZWZhdWx0KShwcm9taXNlcyk7XG4gIGlmIChhcnJheUFyZ3VtZW50KSB7XG4gICAgb2JqZWN0cyA9IHByb21pc2VzO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdHMgPSBhcmd1bWVudHM7XG4gIH1cbiAgbGV0IHRvdGFsID0gb2JqZWN0cy5sZW5ndGg7XG4gIGxldCBoYWRFcnJvciA9IGZhbHNlO1xuICBjb25zdCByZXN1bHRzID0gW107XG4gIGNvbnN0IHJldHVyblZhbHVlID0gYXJyYXlBcmd1bWVudCA/IFtyZXN1bHRzXSA6IHJlc3VsdHM7XG4gIGNvbnN0IGVycm9ycyA9IFtdO1xuICByZXN1bHRzLmxlbmd0aCA9IG9iamVjdHMubGVuZ3RoO1xuICBlcnJvcnMubGVuZ3RoID0gb2JqZWN0cy5sZW5ndGg7XG4gIGlmICh0b3RhbCA9PT0gMCkge1xuICAgIHJldHVybiBfcHJvbWlzZS5kZWZhdWx0LnJlc29sdmUocmV0dXJuVmFsdWUpO1xuICB9XG4gIGNvbnN0IHByb21pc2UgPSByZXNvbHZpbmdQcm9taXNlKCk7XG4gIGNvbnN0IHJlc29sdmVPbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdG90YWwtLTtcbiAgICBpZiAodG90YWwgPD0gMCkge1xuICAgICAgaWYgKGhhZEVycm9yKSB7XG4gICAgICAgIHByb21pc2UucmVqZWN0KGVycm9ycyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlLnJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgY2hhaW4gPSBmdW5jdGlvbiAob2JqZWN0LCBpbmRleCkge1xuICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvYmplY3QudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gcmVzdWx0O1xuICAgICAgICByZXNvbHZlT25lKCk7XG4gICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JzW2luZGV4XSA9IGVycm9yO1xuICAgICAgICBoYWRFcnJvciA9IHRydWU7XG4gICAgICAgIHJlc29sdmVPbmUoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRzW2luZGV4XSA9IG9iamVjdDtcbiAgICAgIHJlc29sdmVPbmUoKTtcbiAgICB9XG4gIH07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgIGNoYWluKG9iamVjdHNbaV0sIGkpO1xuICB9XG4gIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gY29udGludWVXaGlsZSh0ZXN0LCBlbWl0dGVyKSB7XG4gIGlmICh0ZXN0KCkpIHtcbiAgICByZXR1cm4gZW1pdHRlcigpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGNvbnRpbnVlV2hpbGUodGVzdCwgZW1pdHRlcik7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIF9wcm9taXNlLmRlZmF1bHQucmVzb2x2ZSgpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpO1xuX09iamVjdCRkZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1bmlxdWU7XG52YXIgX2ZvckVhY2ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpKTtcbnZhciBfaW5kZXhPZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvaW5kZXgtb2ZcIikpO1xudmFyIF9hcnJheUNvbnRhaW5zT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9hcnJheUNvbnRhaW5zT2JqZWN0XCIpKTtcbnZhciBfQ29yZU1hbmFnZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvcmVNYW5hZ2VyXCIpKTtcbmZ1bmN0aW9uIHVuaXF1ZShhcnIpIHtcbiAgY29uc3QgdW5pcXVlcyA9IFtdO1xuICAoMCwgX2ZvckVhY2guZGVmYXVsdCkoYXJyKS5jYWxsKGFyciwgdmFsdWUgPT4ge1xuICAgIGNvbnN0IFBhcnNlT2JqZWN0ID0gX0NvcmVNYW5hZ2VyLmRlZmF1bHQuZ2V0UGFyc2VPYmplY3QoKTtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQYXJzZU9iamVjdCkge1xuICAgICAgaWYgKCEoMCwgX2FycmF5Q29udGFpbnNPYmplY3QuZGVmYXVsdCkodW5pcXVlcywgdmFsdWUpKSB7XG4gICAgICAgIHVuaXF1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgoMCwgX2luZGV4T2YuZGVmYXVsdCkodW5pcXVlcykuY2FsbCh1bmlxdWVzLCB2YWx1ZSkgPCAwKSB7XG4gICAgICAgIHVuaXF1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHVuaXF1ZXM7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKTtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVuc2F2ZWRDaGlsZHJlbjtcbnZhciBfY29uY2F0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9jb25jYXRcIikpO1xudmFyIF9pbmRleE9mID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUtY29yZWpzMy9jb3JlLWpzLXN0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKSk7XG52YXIgX2lzQXJyYXkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL2FycmF5L2lzLWFycmF5XCIpKTtcbnZhciBfZm9yRWFjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBiYWJlbC9ydW50aW1lLWNvcmVqczMvY29yZS1qcy1zdGFibGUvaW5zdGFuY2UvZm9yLWVhY2hcIikpO1xudmFyIF9Db3JlTWFuYWdlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vQ29yZU1hbmFnZXJcIikpO1xudmFyIF9QYXJzZUZpbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlRmlsZVwiKSk7XG52YXIgX1BhcnNlUmVsYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BhcnNlUmVsYXRpb25cIikpO1xuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgb2YgdW5zYXZlZCBjaGlsZHJlbiwgd2hpY2ggYXJlIGVpdGhlciBQYXJzZSBPYmplY3RzIG9yIEZpbGVzLlxuICogSWYgaXQgZW5jb3VudGVycyBhbnkgZGlydHkgT2JqZWN0cyB3aXRob3V0IElkcywgaXQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKlxuICogQHBhcmFtIHtQYXJzZS5PYmplY3R9IG9ialxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0RlZXBVbnNhdmVkXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHVuc2F2ZWRDaGlsZHJlbihvYmosIGFsbG93RGVlcFVuc2F2ZWQpIHtcbiAgY29uc3QgZW5jb3VudGVyZWQgPSB7XG4gICAgb2JqZWN0czoge30sXG4gICAgZmlsZXM6IFtdXG4gIH07XG4gIGNvbnN0IGlkZW50aWZpZXIgPSBvYmouY2xhc3NOYW1lICsgJzonICsgb2JqLl9nZXRJZCgpO1xuICBlbmNvdW50ZXJlZC5vYmplY3RzW2lkZW50aWZpZXJdID0gb2JqLmRpcnR5KCkgPyBvYmogOiB0cnVlO1xuICBjb25zdCBhdHRyaWJ1dGVzID0gb2JqLmF0dHJpYnV0ZXM7XG4gIGZvciAoY29uc3QgYXR0ciBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzW2F0dHJdID09PSAnb2JqZWN0Jykge1xuICAgICAgdHJhdmVyc2UoYXR0cmlidXRlc1thdHRyXSwgZW5jb3VudGVyZWQsIGZhbHNlLCAhIWFsbG93RGVlcFVuc2F2ZWQpO1xuICAgIH1cbiAgfVxuICBjb25zdCB1bnNhdmVkID0gW107XG4gIGZvciAoY29uc3QgaWQgaW4gZW5jb3VudGVyZWQub2JqZWN0cykge1xuICAgIGlmIChpZCAhPT0gaWRlbnRpZmllciAmJiBlbmNvdW50ZXJlZC5vYmplY3RzW2lkXSAhPT0gdHJ1ZSkge1xuICAgICAgdW5zYXZlZC5wdXNoKGVuY291bnRlcmVkLm9iamVjdHNbaWRdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuICgwLCBfY29uY2F0LmRlZmF1bHQpKHVuc2F2ZWQpLmNhbGwodW5zYXZlZCwgZW5jb3VudGVyZWQuZmlsZXMpO1xufVxuZnVuY3Rpb24gdHJhdmVyc2Uob2JqLCBlbmNvdW50ZXJlZCwgc2hvdWxkVGhyb3csIGFsbG93RGVlcFVuc2F2ZWQpIHtcbiAgY29uc3QgUGFyc2VPYmplY3QgPSBfQ29yZU1hbmFnZXIuZGVmYXVsdC5nZXRQYXJzZU9iamVjdCgpO1xuICBpZiAob2JqIGluc3RhbmNlb2YgUGFyc2VPYmplY3QpIHtcbiAgICBpZiAoIW9iai5pZCAmJiBzaG91bGRUaHJvdykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGEgcG9pbnRlciB0byBhbiB1bnNhdmVkIE9iamVjdC4nKTtcbiAgICB9XG4gICAgY29uc3QgaWRlbnRpZmllciA9IG9iai5jbGFzc05hbWUgKyAnOicgKyBvYmouX2dldElkKCk7XG4gICAgaWYgKCFlbmNvdW50ZXJlZC5vYmplY3RzW2lkZW50aWZpZXJdKSB7XG4gICAgICBlbmNvdW50ZXJlZC5vYmplY3RzW2lkZW50aWZpZXJdID0gb2JqLmRpcnR5KCkgPyBvYmogOiB0cnVlO1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IG9iai5hdHRyaWJ1dGVzO1xuICAgICAgZm9yIChjb25zdCBhdHRyIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzW2F0dHJdID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRyYXZlcnNlKGF0dHJpYnV0ZXNbYXR0cl0sIGVuY291bnRlcmVkLCAhYWxsb3dEZWVwVW5zYXZlZCwgYWxsb3dEZWVwVW5zYXZlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChvYmogaW5zdGFuY2VvZiBfUGFyc2VGaWxlLmRlZmF1bHQpIHtcbiAgICB2YXIgX2NvbnRleHQ7XG4gICAgaWYgKCFvYmoudXJsKCkgJiYgKDAsIF9pbmRleE9mLmRlZmF1bHQpKF9jb250ZXh0ID0gZW5jb3VudGVyZWQuZmlsZXMpLmNhbGwoX2NvbnRleHQsIG9iaikgPCAwKSB7XG4gICAgICBlbmNvdW50ZXJlZC5maWxlcy5wdXNoKG9iaik7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBpZiAob2JqIGluc3RhbmNlb2YgX1BhcnNlUmVsYXRpb24uZGVmYXVsdCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoKDAsIF9pc0FycmF5LmRlZmF1bHQpKG9iaikpIHtcbiAgICAoMCwgX2ZvckVhY2guZGVmYXVsdCkob2JqKS5jYWxsKG9iaiwgZWwgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBlbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdHJhdmVyc2UoZWwsIGVuY291bnRlcmVkLCBzaG91bGRUaHJvdywgYWxsb3dEZWVwVW5zYXZlZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZm9yIChjb25zdCBrIGluIG9iaikge1xuICAgIGlmICh0eXBlb2Ygb2JqW2tdID09PSAnb2JqZWN0Jykge1xuICAgICAgdHJhdmVyc2Uob2JqW2tdLCBlbmNvdW50ZXJlZCwgc2hvdWxkVGhyb3csIGFsbG93RGVlcFVuc2F2ZWQpO1xuICAgIH1cbiAgfVxufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS1jb3JlanMzL2NvcmUtanMtc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5fT2JqZWN0JGRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfdXVpZCA9IHJlcXVpcmUoXCJ1dWlkXCIpO1xubGV0IHV1aWQgPSBfdXVpZC52NDtcbm1vZHVsZS5leHBvcnRzID0gdXVpZDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHV1aWQ7IiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBFbmNyeXB0ZWRQREZFcnJvciwgRm9udGtpdE5vdFJlZ2lzdGVyZWRFcnJvciwgRm9yZWlnblBhZ2VFcnJvciwgUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3IsIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGRW1iZWRkZWRQYWdlIGZyb20gXCIuL1BERkVtYmVkZGVkUGFnZVwiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4vUERGRm9udFwiO1xuaW1wb3J0IFBERkltYWdlIGZyb20gXCIuL1BERkltYWdlXCI7XG5pbXBvcnQgUERGUGFnZSBmcm9tIFwiLi9QREZQYWdlXCI7XG5pbXBvcnQgUERGRm9ybSBmcm9tIFwiLi9mb3JtL1BERkZvcm1cIjtcbmltcG9ydCB7IFBhZ2VTaXplcyB9IGZyb20gXCIuL3NpemVzXCI7XG5pbXBvcnQgeyBDdXN0b21Gb250RW1iZWRkZXIsIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlciwgSnBlZ0VtYmVkZGVyLCBQYWdlRW1iZWRkaW5nTWlzbWF0Y2hlZENvbnRleHRFcnJvciwgUERGQ2F0YWxvZywgUERGQ29udGV4dCwgUERGRGljdCwgUERGSGV4U3RyaW5nLCBQREZOYW1lLCBQREZPYmplY3RDb3BpZXIsIFBERlBhZ2VFbWJlZGRlciwgUERGUGFnZUxlYWYsIFBERlBhZ2VUcmVlLCBQREZQYXJzZXIsIFBERlN0cmVhbVdyaXRlciwgUERGU3RyaW5nLCBQREZXcml0ZXIsIFBuZ0VtYmVkZGVyLCBTdGFuZGFyZEZvbnRFbWJlZGRlciwgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvciwgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgUGFyc2VTcGVlZHMsIH0gZnJvbSBcIi4vUERGRG9jdW1lbnRPcHRpb25zXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkLCBhc3NlcnRPclVuZGVmaW5lZCwgYXNzZXJ0UmFuZ2UsIENhY2hlLCBjYW5CZUNvbnZlcnRlZFRvVWludDhBcnJheSwgZW5jb2RlVG9CYXNlNjQsIGlzU3RhbmRhcmRGb250LCBwbHVja0luZGljZXMsIHJhbmdlLCB0b1VpbnQ4QXJyYXksIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgRmlsZUVtYmVkZGVyLCB7IEFGUmVsYXRpb25zaGlwIH0gZnJvbSBcIi4uL2NvcmUvZW1iZWRkZXJzL0ZpbGVFbWJlZGRlclwiO1xuaW1wb3J0IFBERkVtYmVkZGVkRmlsZSBmcm9tIFwiLi9QREZFbWJlZGRlZEZpbGVcIjtcbmltcG9ydCBQREZKYXZhU2NyaXB0IGZyb20gXCIuL1BERkphdmFTY3JpcHRcIjtcbmltcG9ydCBKYXZhU2NyaXB0RW1iZWRkZXIgZnJvbSBcIi4uL2NvcmUvZW1iZWRkZXJzL0phdmFTY3JpcHRFbWJlZGRlclwiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgUERGIGRvY3VtZW50LlxuICovXG52YXIgUERGRG9jdW1lbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGRG9jdW1lbnQoY29udGV4dCwgaWdub3JlRW5jcnlwdGlvbiwgdXBkYXRlTWV0YWRhdGEpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLyoqIFRoZSBkZWZhdWx0IHdvcmQgYnJlYWtzIHVzZWQgaW4gUERGUGFnZS5kcmF3VGV4dCAqL1xuICAgICAgICB0aGlzLmRlZmF1bHRXb3JkQnJlYWtzID0gWycgJ107XG4gICAgICAgIHRoaXMuY29tcHV0ZVBhZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHBhZ2VzID0gW107XG4gICAgICAgICAgICBfdGhpcy5jYXRhbG9nLlBhZ2VzKCkudHJhdmVyc2UoZnVuY3Rpb24gKG5vZGUsIHJlZikge1xuICAgICAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgUERGUGFnZUxlYWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2UgPSBfdGhpcy5wYWdlTWFwLmdldChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gUERGUGFnZS5vZihub2RlLCByZWYsIF90aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnBhZ2VNYXAuc2V0KG5vZGUsIHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VzLnB1c2gocGFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFnZXM7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVGb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFjcm9Gb3JtID0gX3RoaXMuY2F0YWxvZy5nZXRPckNyZWF0ZUFjcm9Gb3JtKCk7XG4gICAgICAgICAgICByZXR1cm4gUERGRm9ybS5vZihhY3JvRm9ybSwgX3RoaXMpO1xuICAgICAgICB9O1xuICAgICAgICBhc3NlcnRJcyhjb250ZXh0LCAnY29udGV4dCcsIFtbUERGQ29udGV4dCwgJ1BERkNvbnRleHQnXV0pO1xuICAgICAgICBhc3NlcnRJcyhpZ25vcmVFbmNyeXB0aW9uLCAnaWdub3JlRW5jcnlwdGlvbicsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5jYXRhbG9nID0gY29udGV4dC5sb29rdXAoY29udGV4dC50cmFpbGVySW5mby5Sb290KTtcbiAgICAgICAgdGhpcy5pc0VuY3J5cHRlZCA9ICEhY29udGV4dC5sb29rdXAoY29udGV4dC50cmFpbGVySW5mby5FbmNyeXB0KTtcbiAgICAgICAgdGhpcy5wYWdlQ2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeSh0aGlzLmNvbXB1dGVQYWdlcyk7XG4gICAgICAgIHRoaXMucGFnZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5mb3JtQ2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeSh0aGlzLmdldE9yQ3JlYXRlRm9ybSk7XG4gICAgICAgIHRoaXMuZm9udHMgPSBbXTtcbiAgICAgICAgdGhpcy5pbWFnZXMgPSBbXTtcbiAgICAgICAgdGhpcy5lbWJlZGRlZFBhZ2VzID0gW107XG4gICAgICAgIHRoaXMuZW1iZWRkZWRGaWxlcyA9IFtdO1xuICAgICAgICB0aGlzLmphdmFTY3JpcHRzID0gW107XG4gICAgICAgIGlmICghaWdub3JlRW5jcnlwdGlvbiAmJiB0aGlzLmlzRW5jcnlwdGVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVuY3J5cHRlZFBERkVycm9yKCk7XG4gICAgICAgIGlmICh1cGRhdGVNZXRhZGF0YSlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSW5mb0RpY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9hZCBhbiBleGlzdGluZyBbW1BERkRvY3VtZW50XV0uIFRoZSBpbnB1dCBkYXRhIGNhbiBiZSBwcm92aWRlZCBpblxuICAgICAqIG11bHRpcGxlIGZvcm1hdHM6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgfCBDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgc3RyaW5nYCAgICAgIHwgQSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgKG9yIGRhdGEgVVJJKSBjb250YWluaW5nIGEgUERGIHxcbiAgICAgKiB8IGBVaW50OEFycmF5YCAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgUERGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYEFycmF5QnVmZmVyYCB8IFRoZSByYXcgYnl0ZXMgb2YgYSBQREYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFBERkRvY3VtZW50IH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIC8vIHBkZj1zdHJpbmdcbiAgICAgKiBjb25zdCBiYXNlNjQgPVxuICAgICAqICAnSlZCRVJpMHhMamNLSllHQmdZRUtDalVnTUNCdlltb0tQRHdLTDBacGJIUmxjaUF2Um14aGRHVkVaV052WkdVS0wweGxibScgK1xuICAgICAqICAnZDBhQ0F4TURRS1BqNEtjM1J5WldGdENuaWNjd3JoTWxBQXdhSjBMbjJQMUp5eTFKTE01RVJkYzBNakN3VWpFNFdRTkM0UScgK1xuICAgICAqICAnNmNObENGWmtxR0NxWUdTcUVKTExaV051WUdaaVptYmtZdVpzWm1sbVpHUmdabWx1RENRTnpjM05UTTJOemR6TVhNeE1qUScgK1xuICAgICAqICAnenRGRUt5dUVLMHVGeER1QUFPRVJkVkNtVnVaSE4wY21WaGJRcGxibVJ2WW1vS0NqWWdNQ0J2WW1vS1BEd0tMMFpwYkhSbCcgK1xuICAgICAqICAnY2lBdlJteGhkR1ZFWldOdlpHVUtMMVI1Y0dVZ0wwOWlhbE4wYlFvdlRpQTBDaTlHYVhKemRDQXlNQW92VEdWdVozUm9JRCcgK1xuICAgICAqICAnSXhOUW8rUGdwemRISmxZVzBLZUp4Vmo5R3F3akFNaHUvekZIa0J6VG8zbkNDQ2lpS0lIUEVJQ3VKRjNjS29TQ3UyRTgvYicgK1xuICAgICAqICAnMjB3UElyMXA4djkvOGtWaGdpbG1HZmF3WDJDR2FWcmdjQWkwL2JzeTBsclg3SUdXcHZKNGlKWUVOM2dFbXJyR0JsUXdHcycgK1xuICAgICAqICAnSEhPOVZCWDF3TnJ4QXFNWDg3UkJENXhwSnVkZHF3ZDgydGpBSHh6VjFVNUxQZ3k1MkRLWFducjFMaGVnK2ovYy9wekdWcicgK1xuICAgICAqICAnaXFWMFZsd1pQWEdQQ0pqRWx3L3lia3dVbWVvV2d4ZXNEWEdoSEpDL0QvaWlrcDFBdjgwcHRLVTBGZEJFZTI1cFBpaEFNMScgK1xuICAgICAqICAndTZ5dGdhYVdmczJIcnozNUNKVDErRVdtQUtaVzVrYzNSeVpXRnRDbVZ1Wkc5aWFnb0tOeUF3SUc5aWFnbzhQQW92VTJsNicgK1xuICAgICAqICAnWlNBNENpOVNiMjkwSURJZ01DQlNDaTlHYVd4MFpYSWdMMFpzWVhSbFJHVmpiMlJsQ2k5VWVYQmxJQzlZVW1WbUNpOU1aVycgK1xuICAgICAqICAnNW5kR2dnTXpnS0wxY2dXeUF4SURJZ01pQmRDaTlKYm1SbGVDQmJJREFnT0NCZENqNCtDbk4wY21WaGJRcDRuQlhFd1JFQScgK1xuICAgICAqICAnRUJBRXNDd3ozdnJ2Um1PT3l5T29HaFpkdXRITjJNVDU1ZklBVm9jRCtBcGxibVJ6ZEhKbFlXMEtaVzVrYjJKcUNncHpkRycgK1xuICAgICAqICAnRnlkSGh5WldZS05URXdDaVVsUlU5RydcbiAgICAgKlxuICAgICAqIGNvbnN0IGRhdGFVcmkgPSAnZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LCcgKyBiYXNlNjRcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYzEgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKGJhc2U2NClcbiAgICAgKiBjb25zdCBwZGZEb2MyID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZChkYXRhVXJpKVxuICAgICAqXG4gICAgICogLy8gcGRmPVVpbnQ4QXJyYXlcbiAgICAgKiBpbXBvcnQgZnMgZnJvbSAnZnMnXG4gICAgICogY29uc3QgdWludDhBcnJheSA9IGZzLnJlYWRGaWxlU3luYygnd2l0aF91cGRhdGVfc2VjdGlvbnMucGRmJylcbiAgICAgKiBjb25zdCBwZGZEb2MzID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZCh1aW50OEFycmF5KVxuICAgICAqXG4gICAgICogLy8gcGRmPUFycmF5QnVmZmVyXG4gICAgICogY29uc3QgdXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL3dpdGhfdXBkYXRlX3NlY3Rpb25zLnBkZidcbiAgICAgKiBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZldGNoKHVybCkudGhlbihyZXMgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICogY29uc3QgcGRmRG9jNCA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoYXJyYXlCdWZmZXIpXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwZGYgVGhlIGlucHV0IGRhdGEgY29udGFpbmluZyBhIFBERiBkb2N1bWVudC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gbG9hZGluZyB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCBhIGRvY3VtZW50IGxvYWRlZCBmcm9tIHRoZSBpbnB1dC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5sb2FkID0gZnVuY3Rpb24gKHBkZiwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIGlnbm9yZUVuY3J5cHRpb24sIF9iLCBwYXJzZVNwZWVkLCBfYywgdGhyb3dPbkludmFsaWRPYmplY3QsIF9kLCB1cGRhdGVNZXRhZGF0YSwgX2UsIGNhcE51bWJlcnMsIGJ5dGVzLCBjb250ZXh0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2YubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBvcHRpb25zLmlnbm9yZUVuY3J5cHRpb24sIGlnbm9yZUVuY3J5cHRpb24gPSBfYSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSwgX2IgPSBvcHRpb25zLnBhcnNlU3BlZWQsIHBhcnNlU3BlZWQgPSBfYiA9PT0gdm9pZCAwID8gUGFyc2VTcGVlZHMuU2xvdyA6IF9iLCBfYyA9IG9wdGlvbnMudGhyb3dPbkludmFsaWRPYmplY3QsIHRocm93T25JbnZhbGlkT2JqZWN0ID0gX2MgPT09IHZvaWQgMCA/IGZhbHNlIDogX2MsIF9kID0gb3B0aW9ucy51cGRhdGVNZXRhZGF0YSwgdXBkYXRlTWV0YWRhdGEgPSBfZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9kLCBfZSA9IG9wdGlvbnMuY2FwTnVtYmVycywgY2FwTnVtYmVycyA9IF9lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9lO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMocGRmLCAncGRmJywgWydzdHJpbmcnLCBVaW50OEFycmF5LCBBcnJheUJ1ZmZlcl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoaWdub3JlRW5jcnlwdGlvbiwgJ2lnbm9yZUVuY3J5cHRpb24nLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhwYXJzZVNwZWVkLCAncGFyc2VTcGVlZCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXModGhyb3dPbkludmFsaWRPYmplY3QsICd0aHJvd09uSW52YWxpZE9iamVjdCcsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gdG9VaW50OEFycmF5KHBkZik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQREZQYXJzZXIuZm9yQnl0ZXNXaXRoT3B0aW9ucyhieXRlcywgcGFyc2VTcGVlZCwgdGhyb3dPbkludmFsaWRPYmplY3QsIGNhcE51bWJlcnMpLnBhcnNlRG9jdW1lbnQoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBfZi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFBERkRvY3VtZW50KGNvbnRleHQsIGlnbm9yZUVuY3J5cHRpb24sIHVwZGF0ZU1ldGFkYXRhKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IFtbUERGRG9jdW1lbnRdXS5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LmNyZWF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgdXBkYXRlTWV0YWRhdGEsIGNvbnRleHQsIHBhZ2VUcmVlLCBwYWdlVHJlZVJlZiwgY2F0YWxvZztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBfYSA9IG9wdGlvbnMudXBkYXRlTWV0YWRhdGEsIHVwZGF0ZU1ldGFkYXRhID0gX2EgPT09IHZvaWQgMCA/IHRydWUgOiBfYTtcbiAgICAgICAgICAgICAgICBjb250ZXh0ID0gUERGQ29udGV4dC5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICBwYWdlVHJlZSA9IFBERlBhZ2VUcmVlLndpdGhDb250ZXh0KGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHBhZ2VUcmVlUmVmID0gY29udGV4dC5yZWdpc3RlcihwYWdlVHJlZSk7XG4gICAgICAgICAgICAgICAgY2F0YWxvZyA9IFBERkNhdGFsb2cud2l0aENvbnRleHRBbmRQYWdlcyhjb250ZXh0LCBwYWdlVHJlZVJlZik7XG4gICAgICAgICAgICAgICAgY29udGV4dC50cmFpbGVySW5mby5Sb290ID0gY29udGV4dC5yZWdpc3RlcihjYXRhbG9nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFBERkRvY3VtZW50KGNvbnRleHQsIGZhbHNlLCB1cGRhdGVNZXRhZGF0YSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBmb250a2l0IGluc3RhbmNlLiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgY3VzdG9tIGZvbnRzIGNhblxuICAgICAqIGJlIGVtYmVkZGVkLiBTZWUgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9Ib3BkaW5nL3BkZi1saWIvdHJlZS9tYXN0ZXIjZm9udGtpdC1pbnN0YWxsYXRpb24pXG4gICAgICogZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8gaW5zdGFsbCBhbmQgcmVnaXN0ZXIgYSBmb250a2l0IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogPiBZb3UgZG8gKipub3QqKiBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgdG8gZW1iZWQgc3RhbmRhcmQgZm9udHMuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFBERkRvY3VtZW50IH0gZnJvbSAncGRmLWxpYidcbiAgICAgKiBpbXBvcnQgZm9udGtpdCBmcm9tICdAcGRmLWxpYi9mb250a2l0J1xuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBwZGZEb2MucmVnaXN0ZXJGb250a2l0KGZvbnRraXQpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9udGtpdCBUaGUgZm9udGtpdCBpbnN0YW5jZSB0byBiZSByZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5yZWdpc3RlckZvbnRraXQgPSBmdW5jdGlvbiAoZm9udGtpdCkge1xuICAgICAgICB0aGlzLmZvbnRraXQgPSBmb250a2l0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBbW1BERkZvcm1dXSBjb250YWluaW5nIGFsbCBpbnRlcmFjdGl2ZSBmaWVsZHMgZm9yIHRoaXMgZG9jdW1lbnQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkcyA9IGZvcm0uZ2V0RmllbGRzKClcbiAgICAgKiBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICogICBjb25zdCB0eXBlID0gZmllbGQuY29uc3RydWN0b3IubmFtZVxuICAgICAqICAgY29uc3QgbmFtZSA9IGZpZWxkLmdldE5hbWUoKVxuICAgICAqICAgY29uc29sZS5sb2coYCR7dHlwZX06ICR7bmFtZX1gKVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIGZvcm0gZm9yIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldEZvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmb3JtID0gdGhpcy5mb3JtQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIGlmIChmb3JtLmhhc1hGQSgpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlbW92aW5nIFhGQSBmb3JtIGRhdGEgYXMgcGRmLWxpYiBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgb3Igd3JpdGluZyBYRkEnKTtcbiAgICAgICAgICAgIGZvcm0uZGVsZXRlWEZBKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBkb2N1bWVudCdzIHRpdGxlIG1ldGFkYXRhLiBUaGUgdGl0bGUgYXBwZWFycyBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGl0bGUgPSBwZGZEb2MuZ2V0VGl0bGUoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRpdGxlIG9mIHRoaXMgZG9jdW1lbnQsIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldFRpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGl0bGUgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuVGl0bGUpO1xuICAgICAgICBpZiAoIXRpdGxlKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcodGl0bGUpO1xuICAgICAgICByZXR1cm4gdGl0bGUuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBhdXRob3IgbWV0YWRhdGEuIFRoZSBhdXRob3IgYXBwZWFycyBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgYXV0aG9yID0gcGRmRG9jLmdldEF1dGhvcigpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgYXV0aG9yIG9mIHRoaXMgZG9jdW1lbnQsIGlmIGl0IGhhcyBvbmUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldEF1dGhvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF1dGhvciA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5BdXRob3IpO1xuICAgICAgICBpZiAoIWF1dGhvcilcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKGF1dGhvcik7XG4gICAgICAgIHJldHVybiBhdXRob3IuZGVjb2RlVGV4dCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgZG9jdW1lbnQncyBzdWJqZWN0IG1ldGFkYXRhLiBUaGUgc3ViamVjdCBhcHBlYXJzIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBzdWJqZWN0ID0gcGRmRG9jLmdldFN1YmplY3QoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN1YmplY3Qgb2YgdGhpcyBkb2N1bWVudCwgaWYgaXQgaGFzIG9uZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0U3ViamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN1YmplY3QgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuU3ViamVjdCk7XG4gICAgICAgIGlmICghc3ViamVjdClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKHN1YmplY3QpO1xuICAgICAgICByZXR1cm4gc3ViamVjdC5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBkb2N1bWVudCdzIGtleXdvcmRzIG1ldGFkYXRhLiBUaGUga2V5d29yZHMgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBrZXl3b3JkcyA9IHBkZkRvYy5nZXRLZXl3b3JkcygpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUga2V5d29yZHMgb2YgdGhpcyBkb2N1bWVudCwgaWYgaXQgaGFzIGFueS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0S2V5d29yZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBrZXl3b3JkcyA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5LZXl3b3Jkcyk7XG4gICAgICAgIGlmICgha2V5d29yZHMpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhrZXl3b3Jkcyk7XG4gICAgICAgIHJldHVybiBrZXl3b3Jkcy5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBkb2N1bWVudCdzIGNyZWF0b3IgbWV0YWRhdGEuIFRoZSBjcmVhdG9yIGFwcGVhcnMgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNyZWF0b3IgPSBwZGZEb2MuZ2V0Q3JlYXRvcigpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3JlYXRvciBvZiB0aGlzIGRvY3VtZW50LCBpZiBpdCBoYXMgb25lLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5nZXRDcmVhdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3JlYXRvciA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5DcmVhdG9yKTtcbiAgICAgICAgaWYgKCFjcmVhdG9yKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcoY3JlYXRvcik7XG4gICAgICAgIHJldHVybiBjcmVhdG9yLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIGRvY3VtZW50J3MgcHJvZHVjZXIgbWV0YWRhdGEuIFRoZSBwcm9kdWNlciBhcHBlYXJzIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwcm9kdWNlciA9IHBkZkRvYy5nZXRQcm9kdWNlcigpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgcHJvZHVjZXIgb2YgdGhpcyBkb2N1bWVudCwgaWYgaXQgaGFzIG9uZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0UHJvZHVjZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9kdWNlciA9IHRoaXMuZ2V0SW5mb0RpY3QoKS5sb29rdXAoUERGTmFtZS5Qcm9kdWNlcik7XG4gICAgICAgIGlmICghcHJvZHVjZXIpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhwcm9kdWNlcik7XG4gICAgICAgIHJldHVybiBwcm9kdWNlci5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBkb2N1bWVudCdzIGNyZWF0aW9uIGRhdGUgbWV0YWRhdGEuIFRoZSBjcmVhdGlvbiBkYXRlIGFwcGVhcnMgaW5cbiAgICAgKiB0aGUgXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNyZWF0aW9uRGF0ZSA9IHBkZkRvYy5nZXRDcmVhdGlvbkRhdGUoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEEgRGF0ZSBjb250YWluaW5nIHRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoaXMgZG9jdW1lbnQsXG4gICAgICogICAgICAgICAgaWYgaXQgaGFzIG9uZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0Q3JlYXRpb25EYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3JlYXRpb25EYXRlID0gdGhpcy5nZXRJbmZvRGljdCgpLmxvb2t1cChQREZOYW1lLkNyZWF0aW9uRGF0ZSk7XG4gICAgICAgIGlmICghY3JlYXRpb25EYXRlKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0SXNMaXRlcmFsT3JIZXhTdHJpbmcoY3JlYXRpb25EYXRlKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0aW9uRGF0ZS5kZWNvZGVEYXRlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhpcyBkb2N1bWVudCdzIG1vZGlmaWNhdGlvbiBkYXRlIG1ldGFkYXRhLiBUaGUgbW9kaWZpY2F0aW9uIGRhdGVcbiAgICAgKiBhcHBlYXJzIGluIHRoZSBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBtb2RpZmljYXRpb24gPSBwZGZEb2MuZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQSBEYXRlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoaXMgZG9jdW1lbnQsXG4gICAgICogICAgICAgICAgaWYgaXQgaGFzIG9uZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0TW9kaWZpY2F0aW9uRGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1vZGlmaWNhdGlvbkRhdGUgPSB0aGlzLmdldEluZm9EaWN0KCkubG9va3VwKFBERk5hbWUuTW9kRGF0ZSk7XG4gICAgICAgIGlmICghbW9kaWZpY2F0aW9uRGF0ZSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydElzTGl0ZXJhbE9ySGV4U3RyaW5nKG1vZGlmaWNhdGlvbkRhdGUpO1xuICAgICAgICByZXR1cm4gbW9kaWZpY2F0aW9uRGF0ZS5kZWNvZGVEYXRlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIHRpdGxlIG1ldGFkYXRhLiBUaGUgdGl0bGUgd2lsbCBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRUaXRsZSgn8J+lmiBUaGUgTGlmZSBvZiBhbiBFZ2cg8J+NsycpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUbyBkaXNwbGF5IHRoZSB0aXRsZSBpbiB0aGUgd2luZG93J3MgdGl0bGUgYmFyLCBzZXQgdGhlXG4gICAgICogYHNob3dJbldpbmRvd1RpdGxlQmFyYCBvcHRpb24gdG8gYHRydWVgICh3b3JrcyBmb3IgX21vc3RfIFBERiByZWFkZXJzKS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRUaXRsZSgn8J+lmiBUaGUgTGlmZSBvZiBhbiBFZ2cg8J+NsycsIHsgc2hvd0luV2luZG93VGl0bGVCYXI6IHRydWUgfSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgb2YgdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gc2V0dGluZyB0aGUgdGl0bGUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldFRpdGxlID0gZnVuY3Rpb24gKHRpdGxlLCBvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydElzKHRpdGxlLCAndGl0bGUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ1RpdGxlJyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZIZXhTdHJpbmcuZnJvbVRleHQodGl0bGUpKTtcbiAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCByZWFkZXJzIHNob3VsZCBkaXNwbGF5IHRoZSB0aXRsZSByYXRoZXIgdGhhbiB0aGUgZmlsZW5hbWVcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zaG93SW5XaW5kb3dUaXRsZUJhcikge1xuICAgICAgICAgICAgdmFyIHByZWZzID0gdGhpcy5jYXRhbG9nLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMoKTtcbiAgICAgICAgICAgIHByZWZzLnNldERpc3BsYXlEb2NUaXRsZSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBhdXRob3IgbWV0YWRhdGEuIFRoZSBhdXRob3Igd2lsbCBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRBdXRob3IoJ0h1bXB0eSBEdW1wdHknKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBhdXRob3IgVGhlIGF1dGhvciBvZiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRBdXRob3IgPSBmdW5jdGlvbiAoYXV0aG9yKSB7XG4gICAgICAgIGFzc2VydElzKGF1dGhvciwgJ2F1dGhvcicsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZignQXV0aG9yJyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZIZXhTdHJpbmcuZnJvbVRleHQoYXV0aG9yKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIHN1YmplY3QgbWV0YWRhdGEuIFRoZSBzdWJqZWN0IHdpbGwgYXBwZWFyIGluIHRoZVxuICAgICAqIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwZGZEb2Muc2V0U3ViamVjdCgn8J+TmCBBbiBFcGljIFRhbGUgb2YgV29lIPCfk5YnKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBzdWJqZWN0IFRoZSBzdWJqZWN0IG9mIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldFN1YmplY3QgPSBmdW5jdGlvbiAoc3ViamVjdCkge1xuICAgICAgICBhc3NlcnRJcyhzdWJqZWN0LCAnYXV0aG9yJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdTdWJqZWN0Jyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZIZXhTdHJpbmcuZnJvbVRleHQoc3ViamVjdCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBrZXl3b3JkIG1ldGFkYXRhLiBUaGVzZSBrZXl3b3JkcyB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldEtleXdvcmRzKFsnZWdncycsICd3YWxsJywgJ2ZhbGwnLCAna2luZycsICdob3JzZXMnLCAnbWVuJ10pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGtleXdvcmRzIEFuIGFycmF5IG9mIGtleXdvcmRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRLZXl3b3JkcyA9IGZ1bmN0aW9uIChrZXl3b3Jkcykge1xuICAgICAgICBhc3NlcnRJcyhrZXl3b3JkcywgJ2tleXdvcmRzJywgW0FycmF5XSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdLZXl3b3JkcycpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KGtleXdvcmRzLmpvaW4oJyAnKSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBjcmVhdG9yIG1ldGFkYXRhLiBUaGUgY3JlYXRvciB3aWxsIGFwcGVhciBpbiB0aGVcbiAgICAgKiBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldENyZWF0b3IoJ1BERiBBcHAgOTAwMCDwn6SWJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY3JlYXRvciBUaGUgY3JlYXRvciBvZiB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5zZXRDcmVhdG9yID0gZnVuY3Rpb24gKGNyZWF0b3IpIHtcbiAgICAgICAgYXNzZXJ0SXMoY3JlYXRvciwgJ2NyZWF0b3InLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ0NyZWF0b3InKTtcbiAgICAgICAgdGhpcy5nZXRJbmZvRGljdCgpLnNldChrZXksIFBERkhleFN0cmluZy5mcm9tVGV4dChjcmVhdG9yKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIHByb2R1Y2VyIG1ldGFkYXRhLiBUaGUgcHJvZHVjZXIgd2lsbCBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBtb3N0IFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRQcm9kdWNlcignUERGIEFwcCA5MDAwIPCfpJYnKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBwcm9kdWNlciBUaGUgcHJvZHVjZXIgb2YgdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0UHJvZHVjZXIgPSBmdW5jdGlvbiAocHJvZHVjZXIpIHtcbiAgICAgICAgYXNzZXJ0SXMocHJvZHVjZXIsICdjcmVhdG9yJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdQcm9kdWNlcicpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGSGV4U3RyaW5nLmZyb21UZXh0KHByb2R1Y2VyKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBkb2N1bWVudCdzIGxhbmd1YWdlIG1ldGFkYXRhLiBUaGUgbGFuZ3VhZ2Ugd2lsbCBhcHBlYXIgaW4gdGhlXG4gICAgICogXCJEb2N1bWVudCBQcm9wZXJ0aWVzXCIgc2VjdGlvbiBvZiBzb21lIFBERiByZWFkZXJzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRMYW5ndWFnZSgnZW4tdXMnKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGxhbmd1YWdlIEFuIFJGQyAzMDY2IF9MYW5ndWFnZS1UYWdfIGRlbm90aW5nIHRoZSBsYW5ndWFnZSBvZiB0aGlzXG4gICAgICogICAgICAgICAgICAgICAgIGRvY3VtZW50LCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGxhbmd1YWdlIGlzIHVua25vd24uXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNldExhbmd1YWdlID0gZnVuY3Rpb24gKGxhbmd1YWdlKSB7XG4gICAgICAgIGFzc2VydElzKGxhbmd1YWdlLCAnbGFuZ3VhZ2UnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ0xhbmcnKTtcbiAgICAgICAgdGhpcy5jYXRhbG9nLnNldChrZXksIFBERlN0cmluZy5vZihsYW5ndWFnZSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBjcmVhdGlvbiBkYXRlIG1ldGFkYXRhLiBUaGUgY3JlYXRpb24gZGF0ZSB3aWxsIGFwcGVhclxuICAgICAqIGluIHRoZSBcIkRvY3VtZW50IFByb3BlcnRpZXNcIiBzZWN0aW9uIG9mIG1vc3QgUERGIHJlYWRlcnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnNldENyZWF0aW9uRGF0ZShuZXcgRGF0ZSgpKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjcmVhdGlvbkRhdGUgVGhlIGRhdGUgdGhpcyBkb2N1bWVudCB3YXMgY3JlYXRlZC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0Q3JlYXRpb25EYXRlID0gZnVuY3Rpb24gKGNyZWF0aW9uRGF0ZSkge1xuICAgICAgICBhc3NlcnRJcyhjcmVhdGlvbkRhdGUsICdjcmVhdGlvbkRhdGUnLCBbW0RhdGUsICdEYXRlJ11dKTtcbiAgICAgICAgdmFyIGtleSA9IFBERk5hbWUub2YoJ0NyZWF0aW9uRGF0ZScpO1xuICAgICAgICB0aGlzLmdldEluZm9EaWN0KCkuc2V0KGtleSwgUERGU3RyaW5nLmZyb21EYXRlKGNyZWF0aW9uRGF0ZSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoaXMgZG9jdW1lbnQncyBtb2RpZmljYXRpb24gZGF0ZSBtZXRhZGF0YS4gVGhlIG1vZGlmaWNhdGlvbiBkYXRlIHdpbGxcbiAgICAgKiBhcHBlYXIgaW4gdGhlIFwiRG9jdW1lbnQgUHJvcGVydGllc1wiIHNlY3Rpb24gb2YgbW9zdCBQREYgcmVhZGVycy4gRm9yXG4gICAgICogZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5zZXRNb2RpZmljYXRpb25EYXRlKG5ldyBEYXRlKCkpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG1vZGlmaWNhdGlvbkRhdGUgVGhlIGRhdGUgdGhpcyBkb2N1bWVudCB3YXMgbGFzdCBtb2RpZmllZC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2V0TW9kaWZpY2F0aW9uRGF0ZSA9IGZ1bmN0aW9uIChtb2RpZmljYXRpb25EYXRlKSB7XG4gICAgICAgIGFzc2VydElzKG1vZGlmaWNhdGlvbkRhdGUsICdtb2RpZmljYXRpb25EYXRlJywgW1tEYXRlLCAnRGF0ZSddXSk7XG4gICAgICAgIHZhciBrZXkgPSBQREZOYW1lLm9mKCdNb2REYXRlJyk7XG4gICAgICAgIHRoaXMuZ2V0SW5mb0RpY3QoKS5zZXQoa2V5LCBQREZTdHJpbmcuZnJvbURhdGUobW9kaWZpY2F0aW9uRGF0ZSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBudW1iZXIgb2YgcGFnZXMgY29udGFpbmVkIGluIHRoaXMgZG9jdW1lbnQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdG90YWxQYWdlcyA9IHBkZkRvYy5nZXRQYWdlQ291bnQoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgcGFnZXMgaW4gdGhpcyBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0UGFnZUNvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5wYWdlQ291bnQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMucGFnZUNvdW50ID0gdGhpcy5nZXRQYWdlcygpLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZUNvdW50O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IGFuIGFycmF5IG9mIGFsbCB0aGUgcGFnZXMgY29udGFpbmVkIGluIHRoaXMgZG9jdW1lbnQuIFRoZSBwYWdlcyBhcmVcbiAgICAgKiBzdG9yZWQgaW4gdGhlIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhleSBhcmUgcmVuZGVyZWQgaW4gdGhlXG4gICAgICogZG9jdW1lbnQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGFnZXMgPSBwZGZEb2MuZ2V0UGFnZXMoKVxuICAgICAqIHBhZ2VzWzBdICAgLy8gVGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogcGFnZXNbMl0gICAvLyBUaGUgdGhpcmQgcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBwYWdlc1sxOTddIC8vIFRoZSAxOTh0aCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFsbCB0aGUgcGFnZXMgY29udGFpbmVkIGluIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldFBhZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlQ2FjaGUuYWNjZXNzKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBhZ2UgcmVuZGVyZWQgYXQgYSBwYXJ0aWN1bGFyIGBpbmRleGAgb2YgdGhlIGRvY3VtZW50LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBkZkRvYy5nZXRQYWdlKDApICAgLy8gVGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogcGRmRG9jLmdldFBhZ2UoMikgICAvLyBUaGUgdGhpcmQgcGFnZSBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBwZGZEb2MuZ2V0UGFnZSgxOTcpIC8vIFRoZSAxOTh0aCBwYWdlIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBbW1BERlBhZ2VdXSByZW5kZXJlZCBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldFBhZ2UgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIHBhZ2VzID0gdGhpcy5nZXRQYWdlcygpO1xuICAgICAgICBhc3NlcnRSYW5nZShpbmRleCwgJ2luZGV4JywgMCwgcGFnZXMubGVuZ3RoIC0gMSk7XG4gICAgICAgIHJldHVybiBwYWdlc1tpbmRleF07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgYW4gYXJyYXkgb2YgaW5kaWNlcyBmb3IgYWxsIHRoZSBwYWdlcyBjb250YWluZWQgaW4gdGhpcyBkb2N1bWVudC4gVGhlXG4gICAgICogYXJyYXkgd2lsbCBjb250YWluIGEgcmFuZ2Ugb2YgaW50ZWdlcnMgZnJvbVxuICAgICAqIGAwLi5wZGZEb2MuZ2V0UGFnZUNvdW50KCkgLSAxYC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKiBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICogcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgaW5kaWNlcyA9IHBkZkRvYy5nZXRQYWdlSW5kaWNlcygpXG4gICAgICogaW5kaWNlcyAvLyA9PiBbMCwgMSwgMl1cbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBpbmRpY2VzIGZvciBhbGwgcGFnZXMgY29udGFpbmVkIGluIHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmdldFBhZ2VJbmRpY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcmFuZ2UoMCwgdGhpcy5nZXRQYWdlQ291bnQoKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIHBhZ2UgYXQgYSBnaXZlbiBpbmRleCBmcm9tIHRoaXMgZG9jdW1lbnQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGRmRG9jLnJlbW92ZVBhZ2UoMCkgICAvLyBSZW1vdmUgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogcGRmRG9jLnJlbW92ZVBhZ2UoMikgICAvLyBSZW1vdmUgdGhlIHRoaXJkIHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogcGRmRG9jLnJlbW92ZVBhZ2UoMTk3KSAvLyBSZW1vdmUgdGhlIDE5OHRoIHBhZ2Ugb2YgdGhlIGRvY3VtZW50XG4gICAgICogYGBgXG4gICAgICogT25jZSBhIHBhZ2UgaGFzIGJlZW4gcmVtb3ZlZCwgaXQgd2lsbCBubyBsb25nZXIgYmUgcmVuZGVyZWQgYXQgdGhhdCBpbmRleFxuICAgICAqIGluIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBwYWdlIHRvIGJlIHJlbW92ZWQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnJlbW92ZVBhZ2UgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIHBhZ2VDb3VudCA9IHRoaXMuZ2V0UGFnZUNvdW50KCk7XG4gICAgICAgIGlmICh0aGlzLnBhZ2VDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdmVQYWdlRnJvbUVtcHR5RG9jdW1lbnRFcnJvcigpO1xuICAgICAgICBhc3NlcnRSYW5nZShpbmRleCwgJ2luZGV4JywgMCwgcGFnZUNvdW50IC0gMSk7XG4gICAgICAgIHRoaXMuY2F0YWxvZy5yZW1vdmVMZWFmTm9kZShpbmRleCk7XG4gICAgICAgIHRoaXMucGFnZUNvdW50ID0gcGFnZUNvdW50IC0gMTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCBhIHBhZ2UgdG8gdGhlIGVuZCBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIG1ldGhvZCBhY2NlcHRzIHRocmVlXG4gICAgICogZGlmZmVyZW50IHZhbHVlIHR5cGVzIGZvciB0aGUgYHBhZ2VgIHBhcmFtZXRlcjpcbiAgICAgKlxuICAgICAqIHwgVHlwZSAgICAgICAgICAgICAgIHwgQmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgICAqIHwgYHVuZGVmaW5lZGAgICAgICAgIHwgQ3JlYXRlIGEgbmV3IHBhZ2UgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYFtudW1iZXIsIG51bWJlcl1gIHwgQ3JlYXRlIGEgbmV3IHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gZGltZW5zaW9ucyBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhpcyBkb2N1bWVudCAgfFxuICAgICAqIHwgYFBERlBhZ2VgICAgICAgICAgIHwgQWRkIHRoZSBleGlzdGluZyBwYWdlIHRvIHRoZSBlbmQgb2YgdGhpcyBkb2N1bWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBwYWdlPXVuZGVmaW5lZFxuICAgICAqIGNvbnN0IG5ld1BhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiAvLyBwYWdlPVtudW1iZXIsIG51bWJlcl1cbiAgICAgKiBpbXBvcnQgeyBQYWdlU2l6ZXMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqIGNvbnN0IG5ld1BhZ2UxID0gcGRmRG9jLmFkZFBhZ2UoUGFnZVNpemVzLkE3KVxuICAgICAqIGNvbnN0IG5ld1BhZ2UyID0gcGRmRG9jLmFkZFBhZ2UoUGFnZVNpemVzLkxldHRlcilcbiAgICAgKiBjb25zdCBuZXdQYWdlMyA9IHBkZkRvYy5hZGRQYWdlKFs1MDAsIDc1MF0pXG4gICAgICpcbiAgICAgKiAvLyBwYWdlPVBERlBhZ2VcbiAgICAgKiBjb25zdCBwZGZEb2MxID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCBwZGZEb2MyID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZCguLi4pXG4gICAgICogY29uc3QgW2V4aXN0aW5nUGFnZV0gPSBhd2FpdCBwZGZEb2MxLmNvcHlQYWdlcyhwZGZEb2MyLCBbMF0pXG4gICAgICogcGRmRG9jMS5hZGRQYWdlKGV4aXN0aW5nUGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWdlIE9wdGlvbmFsbHksIHRoZSBkZXNpcmVkIGRpbWVuc2lvbnMgb3IgZXhpc3RpbmcgcGFnZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCAob3IgZXhpc3RpbmcpIHBhZ2UuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmFkZFBhZ2UgPSBmdW5jdGlvbiAocGFnZSkge1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFsndW5kZWZpbmVkJywgW1BERlBhZ2UsICdQREZQYWdlJ10sIEFycmF5XSk7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydFBhZ2UodGhpcy5nZXRQYWdlQ291bnQoKSwgcGFnZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSBwYWdlIGF0IGEgZ2l2ZW4gaW5kZXggd2l0aGluIHRoaXMgZG9jdW1lbnQuIFRoaXMgbWV0aG9kIGFjY2VwdHNcbiAgICAgKiB0aHJlZSBkaWZmZXJlbnQgdmFsdWUgdHlwZXMgZm9yIHRoZSBgcGFnZWAgcGFyYW1ldGVyOlxuICAgICAqXG4gICAgICogfCBUeXBlICAgICAgICAgICAgICAgfCBCZWhhdmlvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICAgKiB8IGB1bmRlZmluZWRgICAgICAgICB8IENyZWF0ZSBhIG5ldyBwYWdlIGFuZCBpbnNlcnQgaXQgaW50byB0aGlzIGRvY3VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgW251bWJlciwgbnVtYmVyXWAgfCBDcmVhdGUgYSBuZXcgcGFnZSB3aXRoIHRoZSBnaXZlbiBkaW1lbnNpb25zIGFuZCBpbnNlcnQgaXQgaW50byB0aGlzIGRvY3VtZW50ICAgfFxuICAgICAqIHwgYFBERlBhZ2VgICAgICAgICAgIHwgSW5zZXJ0IHRoZSBleGlzdGluZyBwYWdlIGludG8gdGhpcyBkb2N1bWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcGFnZT11bmRlZmluZWRcbiAgICAgKiBjb25zdCBuZXdQYWdlID0gcGRmRG9jLmluc2VydFBhZ2UoMilcbiAgICAgKlxuICAgICAqIC8vIHBhZ2U9W251bWJlciwgbnVtYmVyXVxuICAgICAqIGltcG9ydCB7IFBhZ2VTaXplcyB9IGZyb20gJ3BkZi1saWInXG4gICAgICogY29uc3QgbmV3UGFnZTEgPSBwZGZEb2MuaW5zZXJ0UGFnZSgyLCBQYWdlU2l6ZXMuQTcpXG4gICAgICogY29uc3QgbmV3UGFnZTIgPSBwZGZEb2MuaW5zZXJ0UGFnZSgwLCBQYWdlU2l6ZXMuTGV0dGVyKVxuICAgICAqIGNvbnN0IG5ld1BhZ2UzID0gcGRmRG9jLmluc2VydFBhZ2UoMTk4LCBbNTAwLCA3NTBdKVxuICAgICAqXG4gICAgICogLy8gcGFnZT1QREZQYWdlXG4gICAgICogY29uc3QgcGRmRG9jMSA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3QgcGRmRG9jMiA9IGF3YWl0IFBERkRvY3VtZW50LmxvYWQoLi4uKVxuICAgICAqIGNvbnN0IFtleGlzdGluZ1BhZ2VdID0gYXdhaXQgcGRmRG9jMS5jb3B5UGFnZXMocGRmRG9jMiwgWzBdKVxuICAgICAqIHBkZkRvYzEuaW5zZXJ0UGFnZSgwLCBleGlzdGluZ1BhZ2UpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBwYWdlIHNob3VsZCBiZSBpbnNlcnRlZCAoemVyby1iYXNlZCkuXG4gICAgICogQHBhcmFtIHBhZ2UgT3B0aW9uYWxseSwgdGhlIGRlc2lyZWQgZGltZW5zaW9ucyBvciBleGlzdGluZyBwYWdlLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXdseSBjcmVhdGVkIChvciBleGlzdGluZykgcGFnZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuaW5zZXJ0UGFnZSA9IGZ1bmN0aW9uIChpbmRleCwgcGFnZSkge1xuICAgICAgICB2YXIgcGFnZUNvdW50ID0gdGhpcy5nZXRQYWdlQ291bnQoKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2UoaW5kZXgsICdpbmRleCcsIDAsIHBhZ2VDb3VudCk7XG4gICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgWyd1bmRlZmluZWQnLCBbUERGUGFnZSwgJ1BERlBhZ2UnXSwgQXJyYXldKTtcbiAgICAgICAgaWYgKCFwYWdlIHx8IEFycmF5LmlzQXJyYXkocGFnZSkpIHtcbiAgICAgICAgICAgIHZhciBkaW1zID0gQXJyYXkuaXNBcnJheShwYWdlKSA/IHBhZ2UgOiBQYWdlU2l6ZXMuQTQ7XG4gICAgICAgICAgICBwYWdlID0gUERGUGFnZS5jcmVhdGUodGhpcyk7XG4gICAgICAgICAgICBwYWdlLnNldFNpemUuYXBwbHkocGFnZSwgZGltcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFnZS5kb2MgIT09IHRoaXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JlaWduUGFnZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudFJlZiA9IHRoaXMuY2F0YWxvZy5pbnNlcnRMZWFmTm9kZShwYWdlLnJlZiwgaW5kZXgpO1xuICAgICAgICBwYWdlLm5vZGUuc2V0UGFyZW50KHBhcmVudFJlZik7XG4gICAgICAgIHRoaXMucGFnZU1hcC5zZXQocGFnZS5ub2RlLCBwYWdlKTtcbiAgICAgICAgdGhpcy5wYWdlQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLnBhZ2VDb3VudCA9IHBhZ2VDb3VudCArIDE7XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29weSBwYWdlcyBmcm9tIGEgc291cmNlIGRvY3VtZW50IGludG8gdGhpcyBkb2N1bWVudC4gQWxsb3dzIHBhZ2VzIHRvIGJlXG4gICAgICogY29waWVkIGJldHdlZW4gZGlmZmVyZW50IFtbUERGRG9jdW1lbnRdXSBpbnN0YW5jZXMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCBzcmNEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKC4uLilcbiAgICAgKlxuICAgICAqIGNvbnN0IGNvcGllZFBhZ2VzID0gYXdhaXQgcGRmRG9jLmNvcHlQYWdlcyhzcmNEb2MsIFswLCAzLCA4OV0pXG4gICAgICogY29uc3QgW2ZpcnN0UGFnZSwgZm91cnRoUGFnZSwgbmluZXRpZXRoUGFnZV0gPSBjb3BpZWRQYWdlcztcbiAgICAgKlxuICAgICAqIHBkZkRvYy5hZGRQYWdlKGZvdXJ0aFBhZ2UpXG4gICAgICogcGRmRG9jLmluc2VydFBhZ2UoMCwgbmluZXRpZXRoUGFnZSlcbiAgICAgKiBwZGZEb2MuYWRkUGFnZShmaXJzdFBhZ2UpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHNyY0RvYyBUaGUgZG9jdW1lbnQgZnJvbSB3aGljaCBwYWdlcyBzaG91bGQgYmUgY29waWVkLlxuICAgICAqIEBwYXJhbSBpbmRpY2VzIFRoZSBpbmRpY2VzIG9mIHRoZSBwYWdlcyB0aGF0IHNob3VsZCBiZSBjb3BpZWQuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiBwYWdlcyBjb3BpZWQgaW50byB0aGlzIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5jb3B5UGFnZXMgPSBmdW5jdGlvbiAoc3JjRG9jLCBpbmRpY2VzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb3BpZXIsIHNyY1BhZ2VzLCBjb3BpZWRQYWdlcywgaWR4LCBsZW4sIHNyY1BhZ2UsIGNvcGllZFBhZ2UsIHJlZjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHNyY0RvYywgJ3NyY0RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhpbmRpY2VzLCAnaW5kaWNlcycsIFtBcnJheV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgc3JjRG9jLmZsdXNoKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3BpZXIgPSBQREZPYmplY3RDb3BpZXIuZm9yKHNyY0RvYy5jb250ZXh0LCB0aGlzLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGFnZXMgPSBzcmNEb2MuZ2V0UGFnZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFBhZ2VzID0gbmV3IEFycmF5KGluZGljZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaWR4ID0gMCwgbGVuID0gaW5kaWNlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQYWdlID0gc3JjUGFnZXNbaW5kaWNlc1tpZHhdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRQYWdlID0gY29waWVyLmNvcHkoc3JjUGFnZS5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYgPSB0aGlzLmNvbnRleHQucmVnaXN0ZXIoY29waWVkUGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkUGFnZXNbaWR4XSA9IFBERlBhZ2Uub2YoY29waWVkUGFnZSwgcmVmLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb3BpZWRQYWdlc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IGEgY29weSBvZiB0aGlzIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBzcmNEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKC4uLilcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBzcmNEb2MuY29weSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA+ICoqTk9URToqKiAgVGhpcyBtZXRob2Qgd29uJ3QgY29weSBhbGwgaW5mb3JtYXRpb24gb3ZlciB0byB0aGUgbmV3XG4gICAgICogPiBkb2N1bWVudCAoYWNyb2Zvcm1zLCBvdXRsaW5lcywgZXRjLi4uKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggYSBjb3B5IHRoaXMgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwZGZDb3B5LCBjb250ZW50UGFnZXMsIGlkeCwgbGVuO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBQREZEb2N1bWVudC5jcmVhdGUoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBwZGZDb3B5LmNvcHlQYWdlcyh0aGlzLCB0aGlzLmdldFBhZ2VJbmRpY2VzKCkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFBhZ2VzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpZHggPSAwLCBsZW4gPSBjb250ZW50UGFnZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5hZGRQYWdlKGNvbnRlbnRQYWdlc1tpZHhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldEF1dGhvcigpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldEF1dGhvcih0aGlzLmdldEF1dGhvcigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldENyZWF0aW9uRGF0ZSgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZDb3B5LnNldENyZWF0aW9uRGF0ZSh0aGlzLmdldENyZWF0aW9uRGF0ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldENyZWF0b3IoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5zZXRDcmVhdG9yKHRoaXMuZ2V0Q3JlYXRvcigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldE1vZGlmaWNhdGlvbkRhdGUoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5zZXRNb2RpZmljYXRpb25EYXRlKHRoaXMuZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFByb2R1Y2VyKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0UHJvZHVjZXIodGhpcy5nZXRQcm9kdWNlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFN1YmplY3QoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmQ29weS5zZXRTdWJqZWN0KHRoaXMuZ2V0U3ViamVjdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFRpdGxlKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuc2V0VGl0bGUodGhpcy5nZXRUaXRsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBkZkNvcHkuZGVmYXVsdFdvcmRCcmVha3MgPSB0aGlzLmRlZmF1bHRXb3JkQnJlYWtzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHBkZkNvcHldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCBKYXZhU2NyaXB0IHRvIHRoaXMgZG9jdW1lbnQuIFRoZSBzdXBwbGllZCBgc2NyaXB0YCBpcyBleGVjdXRlZCB3aGVuIHRoZVxuICAgICAqIGRvY3VtZW50IGlzIG9wZW5lZC4gVGhlIGBzY3JpcHRgIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gc29tZSBvcGVyYXRpb25cbiAgICAgKiB3aGVuIHRoZSBkb2N1bWVudCBpcyBvcGVuZWQgKGUuZy4gbG9nZ2luZyB0byB0aGUgY29uc29sZSksIG9yIGl0IGNhbiBiZVxuICAgICAqIHVzZWQgdG8gZGVmaW5lIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBsYXRlciBpbiBhIEphdmFTY3JpcHRcbiAgICAgKiBhY3Rpb24uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gU2hvdyBcIkhlbGxvIFdvcmxkIVwiIGluIHRoZSBjb25zb2xlIHdoZW4gdGhlIFBERiBpcyBvcGVuZWRcbiAgICAgKiBwZGZEb2MuYWRkSmF2YVNjcmlwdChcbiAgICAgKiAgICdtYWluJyxcbiAgICAgKiAgICdjb25zb2xlLnNob3coKTsgY29uc29sZS5wcmludGxuKFwiSGVsbG8gV29ybGQhXCIpOydcbiAgICAgKiApO1xuICAgICAqXG4gICAgICogLy8gRGVmaW5lIGEgZnVuY3Rpb24gbmFtZWQgXCJmb29cIiB0aGF0IGNhbiBiZSBjYWxsZWQgaW4gSmF2YVNjcmlwdCBBY3Rpb25zXG4gICAgICogcGRmRG9jLmFkZEphdmFTY3JpcHQoXG4gICAgICogICAnZm9vJyxcbiAgICAgKiAgICdmdW5jdGlvbiBmb28oKSB7IHJldHVybiBcImZvb1wiOyB9J1xuICAgICAqICk7XG4gICAgICogYGBgXG4gICAgICogU2VlIHRoZSBbSmF2YVNjcmlwdCBmb3IgQWNyb2JhdCBBUEkgUmVmZXJlbmNlXShodHRwczovL3d3dy5hZG9iZS5jb20vY29udGVudC9kYW0vYWNvbS9lbi9kZXZuZXQvYWNyb2JhdC9wZGZzL2pzX2FwaV9yZWZlcmVuY2UucGRmKVxuICAgICAqIGZvciBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzY3JpcHQuIE11c3QgYmUgdW5pcXVlIHBlciBkb2N1bWVudC5cbiAgICAgKiBAcGFyYW0gc2NyaXB0IFRoZSBKYXZhU2NyaXB0IHRvIGV4ZWN1dGUuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmFkZEphdmFTY3JpcHQgPSBmdW5jdGlvbiAobmFtZSwgc2NyaXB0KSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIGFzc2VydElzKHNjcmlwdCwgJ3NjcmlwdCcsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZW1iZWRkZXIgPSBKYXZhU2NyaXB0RW1iZWRkZXIuZm9yKHNjcmlwdCwgbmFtZSk7XG4gICAgICAgIHZhciByZWYgPSB0aGlzLmNvbnRleHQubmV4dFJlZigpO1xuICAgICAgICB2YXIgamF2YVNjcmlwdCA9IFBERkphdmFTY3JpcHQub2YocmVmLCB0aGlzLCBlbWJlZGRlcik7XG4gICAgICAgIHRoaXMuamF2YVNjcmlwdHMucHVzaChqYXZhU2NyaXB0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCBhbiBhdHRhY2htZW50IHRvIHRoaXMgZG9jdW1lbnQuIEF0dGFjaG1lbnRzIGFyZSB2aXNpYmxlIGluIHRoZVxuICAgICAqIFwiQXR0YWNobWVudHNcIiBwYW5lbCBvZiBBZG9iZSBBY3JvYmF0IGFuZCBzb21lIG90aGVyIFBERiByZWFkZXJzLiBBbnlcbiAgICAgKiB0eXBlIG9mIGZpbGUgY2FuIGJlIGFkZGVkIGFzIGFuIGF0dGFjaG1lbnQuIFRoaXMgaW5jbHVkZXMsIGJ1dCBpcyBub3RcbiAgICAgKiBsaW1pdGVkIHRvLCBgLnBuZ2AsIGAuanBnYCwgYC5wZGZgLCBgLmNzdmAsIGAuZG9jeGAsIGFuZCBgLnhsc3hgIGZpbGVzLlxuICAgICAqXG4gICAgICogVGhlIGlucHV0IGRhdGEgY2FuIGJlIHByb3ZpZGVkIGluIG11bHRpcGxlIGZvcm1hdHM6XG4gICAgICpcbiAgICAgKiB8IFR5cGUgICAgICAgICAgfCBDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgICAqIHwgYHN0cmluZ2AgICAgICB8IEEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIChvciBkYXRhIFVSSSkgY29udGFpbmluZyBhbiBhdHRhY2htZW50IHxcbiAgICAgKiB8IGBVaW50OEFycmF5YCAgfCBUaGUgcmF3IGJ5dGVzIG9mIGFuIGF0dGFjaG1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgQXJyYXlCdWZmZXJgIHwgVGhlIHJhdyBieXRlcyBvZiBhbiBhdHRhY2htZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBhdHRhY2htZW50PXN0cmluZ1xuICAgICAqIGF3YWl0IHBkZkRvYy5hdHRhY2goJy85ai80QUFRU2taSlJnQUJBUUFBQVFBQkFBRC8yd0JELi4uJywgJ2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnLCB7XG4gICAgICogICBtaW1lVHlwZTogJ2ltYWdlL2pwZWcnLFxuICAgICAqICAgZGVzY3JpcHRpb246ICdDb29sIGNhdCByaWRpbmcgYSB1bmljb3JuISDwn6aE8J+QiPCflbbvuI8nLFxuICAgICAqICAgY3JlYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAxOS8xMi8wMScpLFxuICAgICAqICAgbW9kaWZpY2F0aW9uRGF0ZTogbmV3IERhdGUoJzIwMjAvMDQvMTknKSxcbiAgICAgKiB9KVxuICAgICAqIGF3YWl0IHBkZkRvYy5hdHRhY2goJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVEuLi4nLCAnY2F0X3JpZGluZ191bmljb3JuLmpwZycsIHtcbiAgICAgKiAgIG1pbWVUeXBlOiAnaW1hZ2UvanBlZycsXG4gICAgICogICBkZXNjcmlwdGlvbjogJ0Nvb2wgY2F0IHJpZGluZyBhIHVuaWNvcm4hIPCfpoTwn5CI8J+Vtu+4jycsXG4gICAgICogICBjcmVhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDE5LzEyLzAxJyksXG4gICAgICogICBtb2RpZmljYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAyMC8wNC8xOScpLFxuICAgICAqIH0pXG4gICAgICpcbiAgICAgKiAvLyBhdHRhY2htZW50PVVpbnQ4QXJyYXlcbiAgICAgKiBpbXBvcnQgZnMgZnJvbSAnZnMnXG4gICAgICogY29uc3QgdWludDhBcnJheSA9IGZzLnJlYWRGaWxlU3luYygnY2F0X3JpZGluZ191bmljb3JuLmpwZycpXG4gICAgICogYXdhaXQgcGRmRG9jLmF0dGFjaCh1aW50OEFycmF5LCAnY2F0X3JpZGluZ191bmljb3JuLmpwZycsIHtcbiAgICAgKiAgIG1pbWVUeXBlOiAnaW1hZ2UvanBlZycsXG4gICAgICogICBkZXNjcmlwdGlvbjogJ0Nvb2wgY2F0IHJpZGluZyBhIHVuaWNvcm4hIPCfpoTwn5CI8J+Vtu+4jycsXG4gICAgICogICBjcmVhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDE5LzEyLzAxJyksXG4gICAgICogICBtb2RpZmljYXRpb25EYXRlOiBuZXcgRGF0ZSgnMjAyMC8wNC8xOScpLFxuICAgICAqIH0pXG4gICAgICpcbiAgICAgKiAvLyBhdHRhY2htZW50PUFycmF5QnVmZmVyXG4gICAgICogY29uc3QgdXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL2NhdF9yaWRpbmdfdW5pY29ybi5qcGcnXG4gICAgICogY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4ocmVzID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGF3YWl0IHBkZkRvYy5hdHRhY2goYXJyYXlCdWZmZXIsICdjYXRfcmlkaW5nX3VuaWNvcm4uanBnJywge1xuICAgICAqICAgbWltZVR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICAgKiAgIGRlc2NyaXB0aW9uOiAnQ29vbCBjYXQgcmlkaW5nIGEgdW5pY29ybiEg8J+mhPCfkIjwn5W277iPJyxcbiAgICAgKiAgIGNyZWF0aW9uRGF0ZTogbmV3IERhdGUoJzIwMTkvMTIvMDEnKSxcbiAgICAgKiAgIG1vZGlmaWNhdGlvbkRhdGU6IG5ldyBEYXRlKCcyMDIwLzA0LzE5JyksXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhdHRhY2htZW50IFRoZSBpbnB1dCBkYXRhIGNvbnRhaW5pbmcgdGhlIGZpbGUgdG8gYmUgYXR0YWNoZWQuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgYXR0YWNoZWQuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2hlbiB0aGUgYXR0YWNobWVudCBpcyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24gKGF0dGFjaG1lbnQsIG5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGJ5dGVzLCBlbWJlZGRlciwgcmVmLCBlbWJlZGRlZEZpbGU7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0SXMoYXR0YWNobWVudCwgJ2F0dGFjaG1lbnQnLCBbJ3N0cmluZycsIFVpbnQ4QXJyYXksIEFycmF5QnVmZmVyXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLm1pbWVUeXBlLCAnbWltZVR5cGUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmRlc2NyaXB0aW9uLCAnZGVzY3JpcHRpb24nLCBbJ3N0cmluZyddKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmNyZWF0aW9uRGF0ZSwgJ29wdGlvbnMuY3JlYXRpb25EYXRlJywgW0RhdGVdKTtcbiAgICAgICAgICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLm1vZGlmaWNhdGlvbkRhdGUsICdvcHRpb25zLm1vZGlmaWNhdGlvbkRhdGUnLCBbXG4gICAgICAgICAgICAgICAgICAgIERhdGUsXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYWZSZWxhdGlvbnNoaXAsICdvcHRpb25zLmFmUmVsYXRpb25zaGlwJywgQUZSZWxhdGlvbnNoaXApO1xuICAgICAgICAgICAgICAgIGJ5dGVzID0gdG9VaW50OEFycmF5KGF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgICAgIGVtYmVkZGVyID0gRmlsZUVtYmVkZGVyLmZvcihieXRlcywgbmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgICAgICAgICBlbWJlZGRlZEZpbGUgPSBQREZFbWJlZGRlZEZpbGUub2YocmVmLCB0aGlzLCBlbWJlZGRlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWJlZGRlZEZpbGVzLnB1c2goZW1iZWRkZWRGaWxlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbWJlZCBhIGZvbnQgaW50byB0aGlzIGRvY3VtZW50LiBUaGUgaW5wdXQgZGF0YSBjYW4gYmUgcHJvdmlkZWQgaW4gbXVsdGlwbGVcbiAgICAgKiBmb3JtYXRzOlxuICAgICAqXG4gICAgICogfCBUeXBlICAgICAgICAgICAgfCBDb250ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgICAqIHwgYFN0YW5kYXJkRm9udHNgIHwgT25lIG9mIHRoZSBzdGFuZGFyZCAxNCBmb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgc3RyaW5nYCAgICAgICAgfCBBIGJhc2U2NCBlbmNvZGVkIHN0cmluZyAob3IgZGF0YSBVUkkpIGNvbnRhaW5pbmcgYSBmb250IHxcbiAgICAgKiB8IGBVaW50OEFycmF5YCAgICB8IFRoZSByYXcgYnl0ZXMgb2YgYSBmb250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgYEFycmF5QnVmZmVyYCAgIHwgVGhlIHJhdyBieXRlcyBvZiBhIGZvbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIGZvbnQ9U3RhbmRhcmRGb250c1xuICAgICAqIGltcG9ydCB7IFN0YW5kYXJkRm9udHMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqIGNvbnN0IGZvbnQxID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKlxuICAgICAqIC8vIGZvbnQ9c3RyaW5nXG4gICAgICogY29uc3QgZm9udDIgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KCdBQUVBQUFBVkFRQUFCQUJRUkZOSlJ4L3VwZS4uLicpXG4gICAgICogY29uc3QgZm9udDMgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KCdkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LEFBRUFBQS4uLicpXG4gICAgICpcbiAgICAgKiAvLyBmb250PVVpbnQ4QXJyYXlcbiAgICAgKiBpbXBvcnQgZnMgZnJvbSAnZnMnXG4gICAgICogY29uc3QgZm9udDQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KGZzLnJlYWRGaWxlU3luYygnVWJ1bnR1LVIudHRmJykpXG4gICAgICpcbiAgICAgKiAvLyBmb250PUFycmF5QnVmZmVyXG4gICAgICogY29uc3QgdXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL3VidW50dS9VYnVudHUtUi50dGYnXG4gICAgICogY29uc3QgdWJ1bnR1Qnl0ZXMgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4ocmVzID0+IHJlcy5hcnJheUJ1ZmZlcigpKVxuICAgICAqIGNvbnN0IGZvbnQ1ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udCh1YnVudHVCeXRlcylcbiAgICAgKiBgYGBcbiAgICAgKiBTZWUgYWxzbzogW1tyZWdpc3RlckZvbnRraXRdXVxuICAgICAqIEBwYXJhbSBmb250IFRoZSBpbnB1dCBkYXRhIGZvciBhIGZvbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGVtYmVkZGluZyB0aGUgZm9udC5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIHRoZSBlbWJlZGRlZCBmb250LlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZEZvbnQgPSBmdW5jdGlvbiAoZm9udCwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIHN1YnNldCwgY3VzdG9tTmFtZSwgZmVhdHVyZXMsIGVtYmVkZGVyLCBieXRlcywgZm9udGtpdCwgX2IsIHJlZiwgcGRmRm9udDtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2MpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gb3B0aW9ucy5zdWJzZXQsIHN1YnNldCA9IF9hID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hLCBjdXN0b21OYW1lID0gb3B0aW9ucy5jdXN0b21OYW1lLCBmZWF0dXJlcyA9IG9wdGlvbnMuZmVhdHVyZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFsnc3RyaW5nJywgVWludDhBcnJheSwgQXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHN1YnNldCwgJ3N1YnNldCcsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTdGFuZGFyZEZvbnQoZm9udCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZXIgPSBTdGFuZGFyZEZvbnRFbWJlZGRlci5mb3IoZm9udCwgY3VzdG9tTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5CZUNvbnZlcnRlZFRvVWludDhBcnJheShmb250KSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNl07XG4gICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IHRvVWludDhBcnJheShmb250KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRraXQgPSB0aGlzLmFzc2VydEZvbnRraXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3Vic2V0KSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5mb3IoZm9udGtpdCwgYnl0ZXMsIGN1c3RvbU5hbWUsIGZlYXR1cmVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFs0IC8qeWllbGQqLywgQ3VzdG9tRm9udEVtYmVkZGVyLmZvcihmb250a2l0LCBieXRlcywgY3VzdG9tTmFtZSwgZmVhdHVyZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYy5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYy5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVyID0gX2I7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA3XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZm9udGAgbXVzdCBiZSBvbmUgb2YgYFN0YW5kYXJkRm9udHMgfCBzdHJpbmcgfCBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXJgJyk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZGZGb250ID0gUERGRm9udC5vZihyZWYsIHRoaXMsIGVtYmVkZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9udHMucHVzaChwZGZGb250KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBwZGZGb250XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbWJlZCBhIHN0YW5kYXJkIGZvbnQgaW50byB0aGlzIGRvY3VtZW50LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgU3RhbmRhcmRGb250cyB9IGZyb20gJ3BkZi1saWInXG4gICAgICogY29uc3QgaGVsdmV0aWNhRm9udCA9IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIHN0YW5kYXJkIGZvbnQgdG8gYmUgZW1iZWRkZWQuXG4gICAgICogQHBhcmFtIGN1c3RvbU5hbWUgVGhlIG5hbWUgdG8gYmUgdXNlZCB3aGVuIGVtYmVkZGluZyB0aGUgZm9udC5cbiAgICAgKiBAcmV0dXJucyBUaGUgZW1iZWRkZWQgZm9udC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRTdGFuZGFyZEZvbnQgPSBmdW5jdGlvbiAoZm9udCwgY3VzdG9tTmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFsnc3RyaW5nJ10pO1xuICAgICAgICBpZiAoIWlzU3RhbmRhcmRGb250KGZvbnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZm9udGAgbXVzdCBiZSBvbmUgb2YgdHlwZSBgU3RhbmRhcmRGb250c2AnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW1iZWRkZXIgPSBTdGFuZGFyZEZvbnRFbWJlZGRlci5mb3IoZm9udCwgY3VzdG9tTmFtZSk7XG4gICAgICAgIHZhciByZWYgPSB0aGlzLmNvbnRleHQubmV4dFJlZigpO1xuICAgICAgICB2YXIgcGRmRm9udCA9IFBERkZvbnQub2YocmVmLCB0aGlzLCBlbWJlZGRlcik7XG4gICAgICAgIHRoaXMuZm9udHMucHVzaChwZGZGb250KTtcbiAgICAgICAgcmV0dXJuIHBkZkZvbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbWJlZCBhIEpQRUcgaW1hZ2UgaW50byB0aGlzIGRvY3VtZW50LiBUaGUgaW5wdXQgZGF0YSBjYW4gYmUgcHJvdmlkZWQgaW5cbiAgICAgKiBtdWx0aXBsZSBmb3JtYXRzOlxuICAgICAqXG4gICAgICogfCBUeXBlICAgICAgICAgIHwgQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAgICogfCBgc3RyaW5nYCAgICAgIHwgQSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgKG9yIGRhdGEgVVJJKSBjb250YWluaW5nIGEgSlBFRyBpbWFnZSB8XG4gICAgICogfCBgVWludDhBcnJheWAgIHwgVGhlIHJhdyBieXRlcyBvZiBhIEpQRUcgaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBgQXJyYXlCdWZmZXJgIHwgVGhlIHJhdyBieXRlcyBvZiBhIEpQRUcgaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIGpwZz1zdHJpbmdcbiAgICAgKiBjb25zdCBpbWFnZTEgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcoJy85ai80QUFRU2taSlJnQUJBUUFBQVFBQkFBRC8yd0JELi4uJylcbiAgICAgKiBjb25zdCBpbWFnZTIgPSBhd2FpdCBwZGZEb2MuZW1iZWRKcGcoJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRBQVEuLi4nKVxuICAgICAqXG4gICAgICogLy8ganBnPVVpbnQ4QXJyYXlcbiAgICAgKiBpbXBvcnQgZnMgZnJvbSAnZnMnXG4gICAgICogY29uc3QgdWludDhBcnJheSA9IGZzLnJlYWRGaWxlU3luYygnY2F0X3JpZGluZ191bmljb3JuLmpwZycpXG4gICAgICogY29uc3QgaW1hZ2UzID0gYXdhaXQgcGRmRG9jLmVtYmVkSnBnKHVpbnQ4QXJyYXkpXG4gICAgICpcbiAgICAgKiAvLyBqcGc9QXJyYXlCdWZmZXJcbiAgICAgKiBjb25zdCB1cmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvY2F0X3JpZGluZ191bmljb3JuLmpwZydcbiAgICAgKiBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZldGNoKHVybCkudGhlbihyZXMgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICogY29uc3QgaW1hZ2U0ID0gYXdhaXQgcGRmRG9jLmVtYmVkSnBnKGFycmF5QnVmZmVyKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGpwZyBUaGUgaW5wdXQgZGF0YSBmb3IgYSBKUEVHIGltYWdlLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggdGhlIGVtYmVkZGVkIGltYWdlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZEpwZyA9IGZ1bmN0aW9uIChqcGcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGJ5dGVzLCBlbWJlZGRlciwgcmVmLCBwZGZJbWFnZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKGpwZywgJ2pwZycsIFsnc3RyaW5nJywgVWludDhBcnJheSwgQXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gdG9VaW50OEFycmF5KGpwZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBKcGVnRW1iZWRkZXIuZm9yKGJ5dGVzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVyID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gdGhpcy5jb250ZXh0Lm5leHRSZWYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBkZkltYWdlID0gUERGSW1hZ2Uub2YocmVmLCB0aGlzLCBlbWJlZGRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlcy5wdXNoKHBkZkltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBwZGZJbWFnZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgYSBQTkcgaW1hZ2UgaW50byB0aGlzIGRvY3VtZW50LiBUaGUgaW5wdXQgZGF0YSBjYW4gYmUgcHJvdmlkZWQgaW5cbiAgICAgKiBtdWx0aXBsZSBmb3JtYXRzOlxuICAgICAqXG4gICAgICogfCBUeXBlICAgICAgICAgIHwgQ29udGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgICAqIHwgYHN0cmluZ2AgICAgICB8IEEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIChvciBkYXRhIFVSSSkgY29udGFpbmluZyBhIFBORyBpbWFnZSB8XG4gICAgICogfCBgVWludDhBcnJheWAgIHwgVGhlIHJhdyBieXRlcyBvZiBhIFBORyBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IGBBcnJheUJ1ZmZlcmAgfCBUaGUgcmF3IGJ5dGVzIG9mIGEgUE5HIGltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBwbmc9c3RyaW5nXG4gICAgICogY29uc3QgaW1hZ2UxID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKCdpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBbGdBQUFGMy4uLicpXG4gICAgICogY29uc3QgaW1hZ2UyID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZy4uLicpXG4gICAgICpcbiAgICAgKiAvLyBwbmc9VWludDhBcnJheVxuICAgICAqIGltcG9ydCBmcyBmcm9tICdmcydcbiAgICAgKiBjb25zdCB1aW50OEFycmF5ID0gZnMucmVhZEZpbGVTeW5jKCdzbWFsbF9tYXJpby5wbmcnKVxuICAgICAqIGNvbnN0IGltYWdlMyA9IGF3YWl0IHBkZkRvYy5lbWJlZFBuZyh1aW50OEFycmF5KVxuICAgICAqXG4gICAgICogLy8gcG5nPUFycmF5QnVmZmVyXG4gICAgICogY29uc3QgdXJsID0gJ2h0dHBzOi8vcGRmLWxpYi5qcy5vcmcvYXNzZXRzL3NtYWxsX21hcmlvLnBuZydcbiAgICAgKiBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZldGNoKHVybCkudGhlbihyZXMgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICogY29uc3QgaW1hZ2U0ID0gYXdhaXQgcGRmRG9jLmVtYmVkUG5nKGFycmF5QnVmZmVyKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHBuZyBUaGUgaW5wdXQgZGF0YSBmb3IgYSBQTkcgaW1hZ2UuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCB0aGUgZW1iZWRkZWQgaW1hZ2UuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkUG5nID0gZnVuY3Rpb24gKHBuZykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZXMsIGVtYmVkZGVyLCByZWYsIHBkZkltYWdlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMocG5nLCAncG5nJywgWydzdHJpbmcnLCBVaW50OEFycmF5LCBBcnJheUJ1ZmZlcl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSB0b1VpbnQ4QXJyYXkocG5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFBuZ0VtYmVkZGVyLmZvcihieXRlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlciA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IHRoaXMuY29udGV4dC5uZXh0UmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZGZJbWFnZSA9IFBERkltYWdlLm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWFnZXMucHVzaChwZGZJbWFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcGRmSW1hZ2VdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVtYmVkIG9uZSBvciBtb3JlIFBERiBwYWdlcyBpbnRvIHRoaXMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBzb3VyY2VQZGZVcmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvd2l0aF9sYXJnZV9wYWdlX2NvdW50LnBkZidcbiAgICAgKiBjb25zdCBzb3VyY2VQZGYgPSBhd2FpdCBmZXRjaChzb3VyY2VQZGZVcmwpLnRoZW4oKHJlcykgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICpcbiAgICAgKiAvLyBFbWJlZCBwYWdlIDc0IG9mIGBzb3VyY2VQZGZgIGludG8gYHBkZkRvY2BcbiAgICAgKiBjb25zdCBbZW1iZWRkZWRQYWdlXSA9IGF3YWl0IHBkZkRvYy5lbWJlZFBkZihzb3VyY2VQZGYsIFs3M10pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTZWUgW1tQREZEb2N1bWVudC5sb2FkXV0gZm9yIGV4YW1wbGVzIG9mIHRoZSBhbGxvd2VkIGlucHV0IGRhdGEgZm9ybWF0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwZGYgVGhlIGlucHV0IGRhdGEgY29udGFpbmluZyBhIFBERiBkb2N1bWVudC5cbiAgICAgKiBAcGFyYW0gaW5kaWNlcyBUaGUgaW5kaWNlcyBvZiB0aGUgcGFnZXMgdGhhdCBzaG91bGQgYmUgZW1iZWRkZWQuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB0aGUgZW1iZWRkZWQgcGFnZXMuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkUGRmID0gZnVuY3Rpb24gKHBkZiwgaW5kaWNlcykge1xuICAgICAgICBpZiAoaW5kaWNlcyA9PT0gdm9pZCAwKSB7IGluZGljZXMgPSBbMF07IH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNyY0RvYywgX2EsIHNyY1BhZ2VzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMocGRmLCAncGRmJywgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlCdWZmZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoaW5kaWNlcywgJ2luZGljZXMnLCBbQXJyYXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHBkZiBpbnN0YW5jZW9mIFBERkRvY3VtZW50KSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IHBkZjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBbNCAvKnlpZWxkKi8sIFBERkRvY3VtZW50LmxvYWQocGRmKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmNEb2MgPSBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhZ2VzID0gcGx1Y2tJbmRpY2VzKHNyY0RvYy5nZXRQYWdlcygpLCBpbmRpY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmVtYmVkUGFnZXMoc3JjUGFnZXMpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbWJlZCBhIHNpbmdsZSBQREYgcGFnZSBpbnRvIHRoaXMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBzb3VyY2VQZGZVcmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvd2l0aF9sYXJnZV9wYWdlX2NvdW50LnBkZidcbiAgICAgKiBjb25zdCBzb3VyY2VCdWZmZXIgPSBhd2FpdCBmZXRjaChzb3VyY2VQZGZVcmwpLnRoZW4oKHJlcykgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICogY29uc3Qgc291cmNlUGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQubG9hZChzb3VyY2VCdWZmZXIpXG4gICAgICogY29uc3Qgc291cmNlUGRmUGFnZSA9IHNvdXJjZVBkZkRvYy5nZXRQYWdlcygpWzczXVxuICAgICAqXG4gICAgICogY29uc3QgZW1iZWRkZWRQYWdlID0gYXdhaXQgcGRmRG9jLmVtYmVkUGFnZShcbiAgICAgKiAgIHNvdXJjZVBkZlBhZ2UsXG4gICAgICpcbiAgICAgKiAgIC8vIENsaXAgYSBzZWN0aW9uIG9mIHRoZSBzb3VyY2UgcGFnZSBzbyB0aGF0IHdlIG9ubHkgZW1iZWQgcGFydCBvZiBpdFxuICAgICAqICAgeyBsZWZ0OiAxMDAsIHJpZ2h0OiA0NTAsIGJvdHRvbTogMzMwLCB0b3A6IDU3MCB9LFxuICAgICAqXG4gICAgICogICAvLyBUcmFuc2xhdGUgYWxsIGRyYXdpbmdzIG9mIHRoZSBlbWJlZGRlZCBwYWdlIGJ5ICgxMCwgMjAwKSB1bml0c1xuICAgICAqICAgWzEsIDAsIDAsIDEsIDEwLCAyMDBdLFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIGJlIGVtYmVkZGVkLlxuICAgICAqIEBwYXJhbSBib3VuZGluZ0JveFxuICAgICAqIE9wdGlvbmFsbHksIGFuIGFyZWEgb2YgdGhlIHNvdXJjZSBwYWdlIHRoYXQgc2hvdWxkIGJlIGVtYmVkZGVkXG4gICAgICogKGRlZmF1bHRzIHRvIGVudGlyZSBwYWdlKS5cbiAgICAgKiBAcGFyYW0gdHJhbnNmb3JtYXRpb25NYXRyaXhcbiAgICAgKiBPcHRpb25hbGx5LCBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0aGF0IGlzIGFsd2F5cyBhcHBsaWVkIHRvIHRoZSBlbWJlZGRlZFxuICAgICAqIHBhZ2UgYW55d2hlcmUgaXQgaXMgZHJhd24uXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCB0aGUgZW1iZWRkZWQgcGRmIHBhZ2UuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmVtYmVkUGFnZSA9IGZ1bmN0aW9uIChwYWdlLCBib3VuZGluZ0JveCwgdHJhbnNmb3JtYXRpb25NYXRyaXgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGVtYmVkZGVkUGFnZTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgW1tQREZQYWdlLCAnUERGUGFnZSddXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkUGFnZXMoW3BhZ2VdLCBbYm91bmRpbmdCb3hdLCBbdHJhbnNmb3JtYXRpb25NYXRyaXhdKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkUGFnZSA9IChfYS5zZW50KCkpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGVtYmVkZGVkUGFnZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRW1iZWQgb25lIG9yIG1vcmUgUERGIHBhZ2VzIGludG8gdGhpcyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHNvdXJjZVBkZlVybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy93aXRoX2xhcmdlX3BhZ2VfY291bnQucGRmJ1xuICAgICAqIGNvbnN0IHNvdXJjZUJ1ZmZlciA9IGF3YWl0IGZldGNoKHNvdXJjZVBkZlVybCkudGhlbigocmVzKSA9PiByZXMuYXJyYXlCdWZmZXIoKSlcbiAgICAgKiBjb25zdCBzb3VyY2VQZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5sb2FkKHNvdXJjZUJ1ZmZlcilcbiAgICAgKlxuICAgICAqIGNvbnN0IHBhZ2UxID0gc291cmNlUGRmRG9jLmdldFBhZ2VzKClbMF1cbiAgICAgKiBjb25zdCBwYWdlMiA9IHNvdXJjZVBkZkRvYy5nZXRQYWdlcygpWzUyXVxuICAgICAqIGNvbnN0IHBhZ2UzID0gc291cmNlUGRmRG9jLmdldFBhZ2VzKClbNzNdXG4gICAgICpcbiAgICAgKiBjb25zdCBlbWJlZGRlZFBhZ2VzID0gYXdhaXQgcGRmRG9jLmVtYmVkUGFnZXMoW3BhZ2UxLCBwYWdlMiwgcGFnZTNdKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHBhZ2VcbiAgICAgKiBUaGUgcGFnZXMgdG8gYmUgZW1iZWRkZWQgKHRoZXkgbXVzdCBhbGwgc2hhcmUgdGhlIHNhbWUgY29udGV4dCkuXG4gICAgICogQHBhcmFtIGJvdW5kaW5nQm94ZXNcbiAgICAgKiBPcHRpb25hbGx5LCBhbiBhcnJheSBvZiBjbGlwcGluZyBib3VuZGFyaWVzIC0gb25lIGZvciBlYWNoIHBhZ2VcbiAgICAgKiAoZGVmYXVsdHMgdG8gZW50aXJldHkgb2YgZWFjaCBwYWdlKS5cbiAgICAgKiBAcGFyYW0gdHJhbnNmb3JtYXRpb25NYXRyaWNlc1xuICAgICAqIE9wdGlvbmFsbHksIGFuIGFycmF5IG9mIHRyYW5zZm9ybWF0aW9uIG1hdHJpY2VzIC0gb25lIGZvciBlYWNoIHBhZ2VcbiAgICAgKiAoZWFjaCBwYWdlJ3MgdHJhbnNmb3JtYXRpb24gd2lsbCBhcHBseSBhbnl3aGVyZSBpdCBpcyBkcmF3bikuXG4gICAgICogQHJldHVybnMgUmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB0aGUgZW1iZWRkZWQgcGRmIHBhZ2VzLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5lbWJlZFBhZ2VzID0gZnVuY3Rpb24gKHBhZ2VzLCBib3VuZGluZ0JveGVzLCB0cmFuc2Zvcm1hdGlvbk1hdHJpY2VzKSB7XG4gICAgICAgIGlmIChib3VuZGluZ0JveGVzID09PSB2b2lkIDApIHsgYm91bmRpbmdCb3hlcyA9IFtdOyB9XG4gICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbk1hdHJpY2VzID09PSB2b2lkIDApIHsgdHJhbnNmb3JtYXRpb25NYXRyaWNlcyA9IFtdOyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpZHgsIGxlbiwgY3VyclBhZ2UsIG5leHRQYWdlLCBjb250ZXh0LCBtYXliZUNvcHlQYWdlLCBlbWJlZGRlZFBhZ2VzLCBpZHgsIGxlbiwgcGFnZSwgYm94LCBtYXRyaXgsIGVtYmVkZGVyLCByZWY7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBbXV07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NlcnQgYWxsIHBhZ2VzIGhhdmUgdGhlIHNhbWUgY29udGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpZHggPSAwLCBsZW4gPSBwYWdlcy5sZW5ndGggLSAxOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyclBhZ2UgPSBwYWdlc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQYWdlID0gcGFnZXNbaWR4ICsgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJQYWdlLm5vZGUuY29udGV4dCAhPT0gbmV4dFBhZ2Uubm9kZS5jb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYWdlRW1iZWRkaW5nTWlzbWF0Y2hlZENvbnRleHRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBwYWdlc1swXS5ub2RlLmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXliZUNvcHlQYWdlID0gY29udGV4dCA9PT0gdGhpcy5jb250ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAocCkgeyByZXR1cm4gcDsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUERGT2JqZWN0Q29waWVyLmZvcihjb250ZXh0LCB0aGlzLmNvbnRleHQpLmNvcHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZFBhZ2VzID0gbmV3IEFycmF5KHBhZ2VzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAwLCBsZW4gPSBwYWdlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlkeCA8IGxlbikpIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSA9IG1heWJlQ29weVBhZ2UocGFnZXNbaWR4XS5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJveCA9IGJvdW5kaW5nQm94ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeCA9IHRyYW5zZm9ybWF0aW9uTWF0cmljZXNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFBERlBhZ2VFbWJlZGRlci5mb3IocGFnZSwgYm94LCBtYXRyaXgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZXIgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSB0aGlzLmNvbnRleHQubmV4dFJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZWRQYWdlc1tpZHhdID0gUERGRW1iZWRkZWRQYWdlLm9mKHJlZiwgdGhpcywgZW1iZWRkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLmVtYmVkZGVkUGFnZXMpLnB1c2guYXBwbHkoX2EsIGVtYmVkZGVkUGFnZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGVtYmVkZGVkUGFnZXNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBzaG91bGRuJ3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBUaGUgW1tzYXZlXV1cbiAgICAgKiA+IGFuZCBbW3NhdmVBc0Jhc2U2NF1dIG1ldGhvZHMgd2lsbCBhdXRvbWF0aWNhbGx5IGVuc3VyZSB0aGF0IGFsbCBlbWJlZGRlZFxuICAgICAqID4gYXNzZXRzIGFyZSBmbHVzaGVkIGJlZm9yZSBzZXJpYWxpemluZyB0aGUgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBGbHVzaCBhbGwgZW1iZWRkZWQgZm9udHMsIFBERiBwYWdlcywgYW5kIGltYWdlcyB0byB0aGlzIGRvY3VtZW50J3NcbiAgICAgKiBbW2NvbnRleHRdXS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gdGhlIGZsdXNoIGlzIGNvbXBsZXRlLlxuICAgICAqL1xuICAgIFBERkRvY3VtZW50LnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkQWxsKHRoaXMuZm9udHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZEFsbCh0aGlzLmltYWdlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkQWxsKHRoaXMuZW1iZWRkZWRQYWdlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkQWxsKHRoaXMuZW1iZWRkZWRGaWxlcyldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkQWxsKHRoaXMuamF2YVNjcmlwdHMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSB0aGlzIGRvY3VtZW50IHRvIGFuIGFycmF5IG9mIGJ5dGVzIG1ha2luZyB1cCBhIFBERiBmaWxlLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcGRmQnl0ZXMgPSBhd2FpdCBwZGZEb2Muc2F2ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgdGhpbmdzIHlvdSBjYW4gZG8gd2l0aCB0aGUgc2VyaWFsaXplZCBkb2N1bWVudCxcbiAgICAgKiBkZXBlbmRpbmcgb24gdGhlIEphdmFTY3JpcHQgZW52aXJvbm1lbnQgeW91J3JlIHJ1bm5pbmcgaW46XG4gICAgICogKiBXcml0ZSBpdCB0byBhIGZpbGUgaW4gTm9kZSBvciBSZWFjdCBOYXRpdmVcbiAgICAgKiAqIERvd25sb2FkIGl0IGFzIGEgQmxvYiBpbiB0aGUgYnJvd3NlclxuICAgICAqICogUmVuZGVyIGl0IGluIGFuIGBpZnJhbWVgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gc2F2aW5nIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIHRoZSBieXRlcyBvZiB0aGUgc2VyaWFsaXplZCBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgdXNlT2JqZWN0U3RyZWFtcywgX2IsIGFkZERlZmF1bHRQYWdlLCBfYywgb2JqZWN0c1BlclRpY2ssIF9kLCB1cGRhdGVGaWVsZEFwcGVhcmFuY2VzLCBmb3JtLCBXcml0ZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IG9wdGlvbnMudXNlT2JqZWN0U3RyZWFtcywgdXNlT2JqZWN0U3RyZWFtcyA9IF9hID09PSB2b2lkIDAgPyB0cnVlIDogX2EsIF9iID0gb3B0aW9ucy5hZGREZWZhdWx0UGFnZSwgYWRkRGVmYXVsdFBhZ2UgPSBfYiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9iLCBfYyA9IG9wdGlvbnMub2JqZWN0c1BlclRpY2ssIG9iamVjdHNQZXJUaWNrID0gX2MgPT09IHZvaWQgMCA/IDUwIDogX2MsIF9kID0gb3B0aW9ucy51cGRhdGVGaWVsZEFwcGVhcmFuY2VzLCB1cGRhdGVGaWVsZEFwcGVhcmFuY2VzID0gX2QgPT09IHZvaWQgMCA/IHRydWUgOiBfZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHVzZU9iamVjdFN0cmVhbXMsICd1c2VPYmplY3RTdHJlYW1zJywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoYWRkRGVmYXVsdFBhZ2UsICdhZGREZWZhdWx0UGFnZScsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKG9iamVjdHNQZXJUaWNrLCAnb2JqZWN0c1BlclRpY2snLCBbJ251bWJlciddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzKHVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMsICd1cGRhdGVGaWVsZEFwcGVhcmFuY2VzJywgWydib29sZWFuJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZERlZmF1bHRQYWdlICYmIHRoaXMuZ2V0UGFnZUNvdW50KCkgPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRQYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlRmllbGRBcHBlYXJhbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0gPSB0aGlzLmZvcm1DYWNoZS5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZmx1c2goKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlciA9IHVzZU9iamVjdFN0cmVhbXMgPyBQREZTdHJlYW1Xcml0ZXIgOiBQREZXcml0ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgV3JpdGVyLmZvckNvbnRleHQodGhpcy5jb250ZXh0LCBvYmplY3RzUGVyVGljaykuc2VyaWFsaXplVG9CdWZmZXIoKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIHRoaXMgZG9jdW1lbnQgdG8gYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgb3IgZGF0YSBVUkkgbWFraW5nIHVwIGFcbiAgICAgKiBQREYgZmlsZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBiYXNlNjRTdHJpbmcgPSBhd2FpdCBwZGZEb2Muc2F2ZUFzQmFzZTY0KClcbiAgICAgKiBiYXNlNjRTdHJpbmcgLy8gPT4gJ0pWQkVSaTB4TGpjS0pZR0JnWUVLQy4uLidcbiAgICAgKlxuICAgICAqIGNvbnN0IGJhc2U2NERhdGFVcmkgPSBhd2FpdCBwZGZEb2Muc2F2ZUFzQmFzZTY0KHsgZGF0YVVyaTogdHJ1ZSB9KVxuICAgICAqIGJhc2U2NERhdGFVcmkgLy8gPT4gJ2RhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCxKVkJFUmkweExqY0tKWUdCZ1lFS0MuLi4nXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gc2F2aW5nIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIG9yIGRhdGEgVVJJIG9mIHRoZVxuICAgICAqICAgICAgICAgIHNlcmlhbGl6ZWQgZG9jdW1lbnQuXG4gICAgICovXG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnNhdmVBc0Jhc2U2NCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgZGF0YVVyaSwgb3RoZXJPcHRpb25zLCBieXRlcywgYmFzZTY0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSBvcHRpb25zLmRhdGFVcmksIGRhdGFVcmkgPSBfYSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSwgb3RoZXJPcHRpb25zID0gX19yZXN0KG9wdGlvbnMsIFtcImRhdGFVcmlcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXMoZGF0YVVyaSwgJ2RhdGFVcmknLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnNhdmUob3RoZXJPcHRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gZW5jb2RlVG9CYXNlNjQoYnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGRhdGFVcmkgPyBcImRhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCxcIiArIGJhc2U2NCA6IGJhc2U2NF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLmZpbmRQYWdlRm9yQW5ub3RhdGlvblJlZiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgdmFyIHBhZ2VzID0gdGhpcy5nZXRQYWdlcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBwYWdlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBwYWdlID0gcGFnZXNbaWR4XTtcbiAgICAgICAgICAgIHZhciBhbm5vdGF0aW9ucyA9IHBhZ2Uubm9kZS5Bbm5vdHMoKTtcbiAgICAgICAgICAgIGlmICgoYW5ub3RhdGlvbnMgPT09IG51bGwgfHwgYW5ub3RhdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFubm90YXRpb25zLmluZGV4T2YocmVmKSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZW1iZWRBbGwgPSBmdW5jdGlvbiAoZW1iZWRkYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGlkeCwgbGVuO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gMCwgbGVuID0gZW1iZWRkYWJsZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpZHggPCBsZW4pKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIGVtYmVkZGFibGVzW2lkeF0uZW1iZWQoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGRG9jdW1lbnQucHJvdG90eXBlLnVwZGF0ZUluZm9EaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGRmTGliID0gXCJwZGYtbGliIChodHRwczovL2dpdGh1Yi5jb20vSG9wZGluZy9wZGYtbGliKVwiO1xuICAgICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgdmFyIGluZm8gPSB0aGlzLmdldEluZm9EaWN0KCk7XG4gICAgICAgIHRoaXMuc2V0UHJvZHVjZXIocGRmTGliKTtcbiAgICAgICAgdGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKG5vdyk7XG4gICAgICAgIGlmICghaW5mby5nZXQoUERGTmFtZS5vZignQ3JlYXRvcicpKSlcbiAgICAgICAgICAgIHRoaXMuc2V0Q3JlYXRvcihwZGZMaWIpO1xuICAgICAgICBpZiAoIWluZm8uZ2V0KFBERk5hbWUub2YoJ0NyZWF0aW9uRGF0ZScpKSlcbiAgICAgICAgICAgIHRoaXMuc2V0Q3JlYXRpb25EYXRlKG5vdyk7XG4gICAgfTtcbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuZ2V0SW5mb0RpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBleGlzdGluZ0luZm8gPSB0aGlzLmNvbnRleHQubG9va3VwKHRoaXMuY29udGV4dC50cmFpbGVySW5mby5JbmZvKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nSW5mbyBpbnN0YW5jZW9mIFBERkRpY3QpXG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJbmZvO1xuICAgICAgICB2YXIgbmV3SW5mbyA9IHRoaXMuY29udGV4dC5vYmooe30pO1xuICAgICAgICB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uSW5mbyA9IHRoaXMuY29udGV4dC5yZWdpc3RlcihuZXdJbmZvKTtcbiAgICAgICAgcmV0dXJuIG5ld0luZm87XG4gICAgfTtcbiAgICBQREZEb2N1bWVudC5wcm90b3R5cGUuYXNzZXJ0Rm9udGtpdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvbnRraXQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRm9udGtpdE5vdFJlZ2lzdGVyZWRFcnJvcigpO1xuICAgICAgICByZXR1cm4gdGhpcy5mb250a2l0O1xuICAgIH07XG4gICAgcmV0dXJuIFBERkRvY3VtZW50O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkRvY3VtZW50O1xuLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG9ubHktYXJyb3ctZnVuY3Rpb25zICovXG5mdW5jdGlvbiBhc3NlcnRJc0xpdGVyYWxPckhleFN0cmluZyhwZGZPYmplY3QpIHtcbiAgICBpZiAoIShwZGZPYmplY3QgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpICYmXG4gICAgICAgICEocGRmT2JqZWN0IGluc3RhbmNlb2YgUERGU3RyaW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvcihbUERGSGV4U3RyaW5nLCBQREZTdHJpbmddLCBwZGZPYmplY3QpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkRvY3VtZW50LmpzLm1hcCIsImV4cG9ydCB2YXIgUGFyc2VTcGVlZHM7XG4oZnVuY3Rpb24gKFBhcnNlU3BlZWRzKSB7XG4gICAgUGFyc2VTcGVlZHNbUGFyc2VTcGVlZHNbXCJGYXN0ZXN0XCJdID0gSW5maW5pdHldID0gXCJGYXN0ZXN0XCI7XG4gICAgUGFyc2VTcGVlZHNbUGFyc2VTcGVlZHNbXCJGYXN0XCJdID0gMTUwMF0gPSBcIkZhc3RcIjtcbiAgICBQYXJzZVNwZWVkc1tQYXJzZVNwZWVkc1tcIk1lZGl1bVwiXSA9IDUwMF0gPSBcIk1lZGl1bVwiO1xuICAgIFBhcnNlU3BlZWRzW1BhcnNlU3BlZWRzW1wiU2xvd1wiXSA9IDEwMF0gPSBcIlNsb3dcIjtcbn0pKFBhcnNlU3BlZWRzIHx8IChQYXJzZVNwZWVkcyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZEb2N1bWVudE9wdGlvbnMuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUERGTmFtZSwgUERGQXJyYXksIFBERkRpY3QsIFBERkhleFN0cmluZyB9IGZyb20gXCIuLi9jb3JlXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBmaWxlIHRoYXQgaGFzIGJlZW4gZW1iZWRkZWQgaW4gYSBbW1BERkRvY3VtZW50XV0uXG4gKi9cbnZhciBQREZFbWJlZGRlZEZpbGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGRW1iZWRkZWRGaWxlKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICB0aGlzLmFscmVhZHlFbWJlZGRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuZW1iZWRkZXIgPSBlbWJlZGRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gVGhlXG4gICAgICogPiBbW1BERkRvY3VtZW50LnNhdmVdXSBhbmQgW1tQREZEb2N1bWVudC5zYXZlQXNCYXNlNjRdXSBtZXRob2RzIHdpbGxcbiAgICAgKiA+IGF1dG9tYXRpY2FsbHkgZW5zdXJlIGFsbCBlbWJlZGRhYmxlIGZpbGVzIGdldCBlbWJlZGRlZC5cbiAgICAgKlxuICAgICAqIEVtYmVkIHRoaXMgZW1iZWRkYWJsZSBmaWxlIGluIGl0cyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gdGhlIGVtYmVkZGluZyBpcyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBQREZFbWJlZGRlZEZpbGUucHJvdG90eXBlLmVtYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVmLCBOYW1lcywgRW1iZWRkZWRGaWxlcywgRUZOYW1lcywgQUY7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLmFscmVhZHlFbWJlZGRlZCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkZGVyLmVtYmVkSW50b0NvbnRleHQodGhpcy5kb2MuY29udGV4dCwgdGhpcy5yZWYpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRvYy5jYXRhbG9nLmhhcyhQREZOYW1lLm9mKCdOYW1lcycpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jLmNhdGFsb2cuc2V0KFBERk5hbWUub2YoJ05hbWVzJyksIHRoaXMuZG9jLmNvbnRleHQub2JqKHt9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBOYW1lcyA9IHRoaXMuZG9jLmNhdGFsb2cubG9va3VwKFBERk5hbWUub2YoJ05hbWVzJyksIFBERkRpY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFOYW1lcy5oYXMoUERGTmFtZS5vZignRW1iZWRkZWRGaWxlcycpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzLnNldChQREZOYW1lLm9mKCdFbWJlZGRlZEZpbGVzJyksIHRoaXMuZG9jLmNvbnRleHQub2JqKHt9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZEZpbGVzID0gTmFtZXMubG9va3VwKFBERk5hbWUub2YoJ0VtYmVkZGVkRmlsZXMnKSwgUERGRGljdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUVtYmVkZGVkRmlsZXMuaGFzKFBERk5hbWUub2YoJ05hbWVzJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRkZWRGaWxlcy5zZXQoUERGTmFtZS5vZignTmFtZXMnKSwgdGhpcy5kb2MuY29udGV4dC5vYmooW10pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEVGTmFtZXMgPSBFbWJlZGRlZEZpbGVzLmxvb2t1cChQREZOYW1lLm9mKCdOYW1lcycpLCBQREZBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFRk5hbWVzLnB1c2goUERGSGV4U3RyaW5nLmZyb21UZXh0KHRoaXMuZW1iZWRkZXIuZmlsZU5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEVGTmFtZXMucHVzaChyZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgQUYtVGFnIGlzIG5lZWRlZCB0byBhY2hpZXZlIFBERi1BMyBjb21wbGlhbmNlIGZvciBlbWJlZGRlZCBmaWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgb3V0bGluZXMgdGhlIHVzZXMgY2FzZXMgb2YgdGhlIGFzc29jaWF0ZWQgZmlsZXMgKEFGKSB0YWcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBTZWU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBodHRwczovL3d3dy5wZGZhLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAxOC8xMC9QREYyMF9BTjAwMi1BRi5wZGZcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRvYy5jYXRhbG9nLmhhcyhQREZOYW1lLm9mKCdBRicpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jLmNhdGFsb2cuc2V0KFBERk5hbWUub2YoJ0FGJyksIHRoaXMuZG9jLmNvbnRleHQub2JqKFtdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBBRiA9IHRoaXMuZG9jLmNhdGFsb2cubG9va3VwKFBERk5hbWUub2YoJ0FGJyksIFBERkFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEFGLnB1c2gocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxyZWFkeUVtYmVkZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkRvY3VtZW50LmF0dGFjaF1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGVcbiAgICAgKiBpbnN0YW5jZXMgb2YgW1tQREZFbWJlZGRlZEZpbGVdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGRW1iZWRkZWRGaWxlXV0gZnJvbSBhbiBleGlzdGluZyByZWYgYW5kIGVtYmVkZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIGZpbGUuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhlIGZpbGUgd2lsbCBiZWxvbmcuXG4gICAgICogQHBhcmFtIGVtYmVkZGVyIFRoZSBlbWJlZGRlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBlbWJlZCB0aGUgZmlsZS5cbiAgICAgKi9cbiAgICBQREZFbWJlZGRlZEZpbGUub2YgPSBmdW5jdGlvbiAocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRW1iZWRkZWRGaWxlKHJlZiwgZG9jLCBlbWJlZGRlcik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRW1iZWRkZWRGaWxlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkVtYmVkZGVkRmlsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkVtYmVkZGVkRmlsZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRG9jdW1lbnQgZnJvbSBcIi4vUERGRG9jdW1lbnRcIjtcbmltcG9ydCB7IFBERlBhZ2VFbWJlZGRlciwgUERGUmVmIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBQREYgcGFnZSB0aGF0IGhhcyBiZWVuIGVtYmVkZGVkIGluIGEgW1tQREZEb2N1bWVudF1dLlxuICovXG52YXIgUERGRW1iZWRkZWRQYWdlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkVtYmVkZGVkUGFnZShyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgdGhpcy5hbHJlYWR5RW1iZWRkZWQgPSBmYWxzZTtcbiAgICAgICAgYXNzZXJ0SXMocmVmLCAncmVmJywgW1tQREZSZWYsICdQREZSZWYnXV0pO1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICBhc3NlcnRJcyhlbWJlZGRlciwgJ2VtYmVkZGVyJywgW1tQREZQYWdlRW1iZWRkZXIsICdQREZQYWdlRW1iZWRkZXInXV0pO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMud2lkdGggPSBlbWJlZGRlci53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBlbWJlZGRlci5oZWlnaHQ7XG4gICAgICAgIHRoaXMuZW1iZWRkZXIgPSBlbWJlZGRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGlzIHBhZ2UgYWZ0ZXIgYmVpbmcgc2NhbGVkIGJ5IHRoZVxuICAgICAqIGdpdmVuIGBmYWN0b3JgLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGVtYmVkZGVkUGFnZS53aWR0aCAgLy8gPT4gNTAwXG4gICAgICogZW1iZWRkZWRQYWdlLmhlaWdodCAvLyA9PiAyNTBcbiAgICAgKlxuICAgICAqIGNvbnN0IHNjYWxlZCA9IGVtYmVkZGVkUGFnZS5zY2FsZSgwLjUpXG4gICAgICogc2NhbGVkLndpZHRoICAvLyA9PiAyNTBcbiAgICAgKiBzY2FsZWQuaGVpZ2h0IC8vID0+IDEyNVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgb3BlcmF0aW9uIGlzIG9mdGVuIHVzZWZ1bCBiZWZvcmUgZHJhd2luZyBhIHBhZ2Ugd2l0aFxuICAgICAqIFtbUERGUGFnZS5kcmF3UGFnZV1dIHRvIGNvbXB1dGUgdGhlIGB3aWR0aGAgYW5kIGBoZWlnaHRgIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIGZhY3RvciBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoaXMgcGFnZSBzaG91bGQgYmUgc2NhbGVkLlxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBwYWdlIGFmdGVyIGJlaW5nIHNjYWxlZC5cbiAgICAgKi9cbiAgICBQREZFbWJlZGRlZFBhZ2UucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24gKGZhY3Rvcikge1xuICAgICAgICBhc3NlcnRJcyhmYWN0b3IsICdmYWN0b3InLCBbJ251bWJlciddKTtcbiAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHRoaXMud2lkdGggKiBmYWN0b3IsIGhlaWdodDogdGhpcy5oZWlnaHQgKiBmYWN0b3IgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBlbWJlZGRlZFBhZ2Uuc2l6ZSgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGRW1iZWRkZWRQYWdlLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSgxKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIFRoZVxuICAgICAqID4gW1tQREZEb2N1bWVudC5zYXZlXV0gYW5kIFtbUERGRG9jdW1lbnQuc2F2ZUFzQmFzZTY0XV0gbWV0aG9kcyB3aWxsXG4gICAgICogPiBhdXRvbWF0aWNhbGx5IGVuc3VyZSBhbGwgZW1iZWRkYWJsZSBwYWdlcyBnZXQgZW1iZWRkZWQuXG4gICAgICpcbiAgICAgKiBFbWJlZCB0aGlzIGVtYmVkZGFibGUgcGFnZSBpbiBpdHMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aGVuIHRoZSBlbWJlZGRpbmcgaXMgY29tcGxldGUuXG4gICAgICovXG4gICAgUERGRW1iZWRkZWRQYWdlLnByb3RvdHlwZS5lbWJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5hbHJlYWR5RW1iZWRkZWQpIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5lbWJlZGRlci5lbWJlZEludG9Db250ZXh0KHRoaXMuZG9jLmNvbnRleHQsIHRoaXMucmVmKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxyZWFkeUVtYmVkZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkRvY3VtZW50LmVtYmVkUGRmXV0gYW5kXG4gICAgICogPiBbW1BERkRvY3VtZW50LmVtYmVkUGFnZV1dIG1ldGhvZHMsIHdoaWNoIHdpbGwgY3JlYXRlIGluc3RhbmNlcyBvZlxuICAgICAqID4gW1tQREZFbWJlZGRlZFBhZ2VdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGRW1iZWRkZWRQYWdlXV0gZnJvbSBhbiBleGlzdGluZyByZWYgYW5kIGVtYmVkZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIGVtYmVkZGVkIHBhZ2UuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhlIGVtYmVkZGVkIHBhZ2Ugd2lsbCBiZWxvbmcuXG4gICAgICogQHBhcmFtIGVtYmVkZGVyIFRoZSBlbWJlZGRlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBlbWJlZCB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZFbWJlZGRlZFBhZ2Uub2YgPSBmdW5jdGlvbiAocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGRW1iZWRkZWRQYWdlKHJlZiwgZG9jLCBlbWJlZGRlcik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRW1iZWRkZWRQYWdlO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkVtYmVkZGVkUGFnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkVtYmVkZGVkUGFnZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRG9jdW1lbnQgZnJvbSBcIi4vUERGRG9jdW1lbnRcIjtcbmltcG9ydCB7IEN1c3RvbUZvbnRFbWJlZGRlciwgUERGUmVmLCBTdGFuZGFyZEZvbnRFbWJlZGRlciwgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydE9yVW5kZWZpbmVkIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBmb250IHRoYXQgaGFzIGJlZW4gZW1iZWRkZWQgaW4gYSBbW1BERkRvY3VtZW50XV0uXG4gKi9cbnZhciBQREZGb250ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkZvbnQocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHRoaXMubW9kaWZpZWQgPSB0cnVlO1xuICAgICAgICBhc3NlcnRJcyhyZWYsICdyZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIGFzc2VydElzKGRvYywgJ2RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgIGFzc2VydElzKGVtYmVkZGVyLCAnZW1iZWRkZXInLCBbXG4gICAgICAgICAgICBbQ3VzdG9tRm9udEVtYmVkZGVyLCAnQ3VzdG9tRm9udEVtYmVkZGVyJ10sXG4gICAgICAgICAgICBbU3RhbmRhcmRGb250RW1iZWRkZXIsICdTdGFuZGFyZEZvbnRFbWJlZGRlciddLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLm5hbWUgPSBlbWJlZGRlci5mb250TmFtZTtcbiAgICAgICAgdGhpcy5lbWJlZGRlciA9IGVtYmVkZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBUaGVcbiAgICAgKiA+IFtbUERGUGFnZS5kcmF3VGV4dF1dIG1ldGhvZCB3aWxsIGF1dG9tYXRpY2FsbHkgZW5jb2RlIHRoZSB0ZXh0IGl0IGlzXG4gICAgICogPiBnaXZlbi5cbiAgICAgKlxuICAgICAqIEVuY29kZXMgYSBzdHJpbmcgb2YgdGV4dCBpbiB0aGlzIGZvbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBiZSBlbmNvZGVkLlxuICAgICAqIEByZXR1cm5zIFRoZSBlbmNvZGVkIHRleHQgYXMgYSBoZXggc3RyaW5nLlxuICAgICAqL1xuICAgIFBERkZvbnQucHJvdG90eXBlLmVuY29kZVRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICBhc3NlcnRJcyh0ZXh0LCAndGV4dCcsIFsnc3RyaW5nJ10pO1xuICAgICAgICB0aGlzLm1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZXIuZW5jb2RlVGV4dCh0ZXh0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1lYXN1cmUgdGhlIHdpZHRoIG9mIGEgc3RyaW5nIG9mIHRleHQgZHJhd24gaW4gdGhpcyBmb250IGF0IGEgZ2l2ZW4gc2l6ZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHdpZHRoID0gZm9udC53aWR0aE9mVGV4dEF0U2l6ZSgnRm9vIEJhciBRdXggQmF6JywgMzYpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHRleHQgVGhlIHN0cmluZyBvZiB0ZXh0IHRvIGJlIG1lYXN1cmVkLlxuICAgICAqIEBwYXJhbSBzaXplIFRoZSBmb250IHNpemUgdG8gYmUgdXNlZCBmb3IgdGhpcyBtZWFzdXJlbWVudC5cbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggb2YgdGhlIHN0cmluZyBvZiB0ZXh0IHdoZW4gZHJhd24gaW4gdGhpcyBmb250IGF0IHRoZVxuICAgICAqICAgICAgICAgIGdpdmVuIHNpemUuXG4gICAgICovXG4gICAgUERGRm9udC5wcm90b3R5cGUud2lkdGhPZlRleHRBdFNpemUgPSBmdW5jdGlvbiAodGV4dCwgc2l6ZSkge1xuICAgICAgICBhc3NlcnRJcyh0ZXh0LCAndGV4dCcsIFsnc3RyaW5nJ10pO1xuICAgICAgICBhc3NlcnRJcyhzaXplLCAnc2l6ZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlci53aWR0aE9mVGV4dEF0U2l6ZSh0ZXh0LCBzaXplKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1lYXN1cmUgdGhlIGhlaWdodCBvZiB0aGlzIGZvbnQgYXQgYSBnaXZlbiBzaXplLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlaWdodCA9IGZvbnQuaGVpZ2h0QXRTaXplKDI0KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGBvcHRpb25zLmRlc2NlbmRlcmAgdmFsdWUgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIGZvbnQnc1xuICAgICAqIGRlc2NlbmRlciBpcyBpbmNsdWRlZCBpbiB0aGUgaGVpZ2h0IGNhbGN1bGF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNpemUgVGhlIGZvbnQgc2l6ZSB0byBiZSB1c2VkIGZvciB0aGlzIG1lYXN1cmVtZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhpcyBtZWFzdXJlbWVudC5cbiAgICAgKiBAcmV0dXJucyBUaGUgaGVpZ2h0IG9mIHRoaXMgZm9udCBhdCB0aGUgZ2l2ZW4gc2l6ZS5cbiAgICAgKi9cbiAgICBQREZGb250LnByb3RvdHlwZS5oZWlnaHRBdFNpemUgPSBmdW5jdGlvbiAoc2l6ZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGFzc2VydElzKHNpemUsICdzaXplJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZXNjZW5kZXIsICdvcHRpb25zLmRlc2NlbmRlcicsIFsnYm9vbGVhbiddKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZXIuaGVpZ2h0T2ZGb250QXRTaXplKHNpemUsIHtcbiAgICAgICAgICAgIGRlc2NlbmRlcjogKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRlc2NlbmRlcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSBmb250IHNpemUgYXQgd2hpY2ggdGhpcyBmb250IGlzIGEgZ2l2ZW4gaGVpZ2h0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnRTaXplID0gZm9udC5zaXplQXRIZWlnaHQoMTIpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IHRvIGJlIHVzZWQgZm9yIHRoaXMgY2FsY3VsYXRpb24uXG4gICAgICogQHJldHVybnMgVGhlIGZvbnQgc2l6ZSBhdCB3aGljaCB0aGlzIGZvbnQgaXMgdGhlIGdpdmVuIGhlaWdodC5cbiAgICAgKi9cbiAgICBQREZGb250LnByb3RvdHlwZS5zaXplQXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICByZXR1cm4gdGhpcy5lbWJlZGRlci5zaXplT2ZGb250QXRIZWlnaHQoaGVpZ2h0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2V0IG9mIHVuaWNvZGUgY29kZSBwb2ludHMgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgdGhpcyBmb250LlxuICAgICAqIEByZXR1cm5zIFRoZSBzZXQgb2YgdW5pY29kZSBjb2RlIHBvaW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmb250LlxuICAgICAqL1xuICAgIFBERkZvbnQucHJvdG90eXBlLmdldENoYXJhY3RlclNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZW1iZWRkZXIgaW5zdGFuY2VvZiBTdGFuZGFyZEZvbnRFbWJlZGRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1iZWRkZXIuZW5jb2Rpbmcuc3VwcG9ydGVkQ29kZVBvaW50cztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtYmVkZGVyLmZvbnQuY2hhcmFjdGVyU2V0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBUaGVcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuc2F2ZV1dIGFuZCBbW1BERkRvY3VtZW50LnNhdmVBc0Jhc2U2NF1dIG1ldGhvZHMgd2lsbFxuICAgICAqID4gYXV0b21hdGljYWxseSBlbnN1cmUgYWxsIGZvbnRzIGdldCBlbWJlZGRlZC5cbiAgICAgKlxuICAgICAqIEVtYmVkIHRoaXMgZm9udCBpbiBpdHMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aGVuIHRoZSBlbWJlZGRpbmcgaXMgY29tcGxldGUuXG4gICAgICovXG4gICAgUERGRm9udC5wcm90b3R5cGUuZW1iZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tb2RpZmllZCkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkZGVyLmVtYmVkSW50b0NvbnRleHQodGhpcy5kb2MuY29udGV4dCwgdGhpcy5yZWYpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRG9jdW1lbnQuZW1iZWRGb250XV0gYW5kXG4gICAgICogPiBbW1BERkRvY3VtZW50LmVtYmVkU3RhbmRhcmRGb250XV0gbWV0aG9kcywgd2hpY2ggd2lsbCBjcmVhdGUgaW5zdGFuY2VzXG4gICAgICogPiBvZiBbW1BERkZvbnRdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGRm9udF1dIGZyb20gYW4gZXhpc3RpbmcgcmVmIGFuZCBlbWJlZGRlclxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBmb250LlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBmb250IHdpbGwgYmVsb25nLlxuICAgICAqIEBwYXJhbSBlbWJlZGRlciBUaGUgZW1iZWRkZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZW1iZWQgdGhlIGZvbnQuXG4gICAgICovXG4gICAgUERGRm9udC5vZiA9IGZ1bmN0aW9uIChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZGb250KHJlZiwgZG9jLCBlbWJlZGRlcik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRm9udDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZGb250O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRm9udC5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRG9jdW1lbnQgZnJvbSBcIi4vUERGRG9jdW1lbnRcIjtcbmltcG9ydCB7IEpwZWdFbWJlZGRlciwgUERGUmVmLCBQbmdFbWJlZGRlciB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcyB9IGZyb20gXCIuLi91dGlsc1wiO1xuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGltYWdlIHRoYXQgaGFzIGJlZW4gZW1iZWRkZWQgaW4gYSBbW1BERkRvY3VtZW50XV0uXG4gKi9cbnZhciBQREZJbWFnZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZJbWFnZShyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgYXNzZXJ0SXMocmVmLCAncmVmJywgW1tQREZSZWYsICdQREZSZWYnXV0pO1xuICAgICAgICBhc3NlcnRJcyhkb2MsICdkb2MnLCBbW1BERkRvY3VtZW50LCAnUERGRG9jdW1lbnQnXV0pO1xuICAgICAgICBhc3NlcnRJcyhlbWJlZGRlciwgJ2VtYmVkZGVyJywgW1xuICAgICAgICAgICAgW0pwZWdFbWJlZGRlciwgJ0pwZWdFbWJlZGRlciddLFxuICAgICAgICAgICAgW1BuZ0VtYmVkZGVyLCAnUG5nRW1iZWRkZXInXSxcbiAgICAgICAgXSk7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy53aWR0aCA9IGVtYmVkZGVyLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGVtYmVkZGVyLmhlaWdodDtcbiAgICAgICAgdGhpcy5lbWJlZGRlciA9IGVtYmVkZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoaXMgaW1hZ2UgYWZ0ZXIgYmVpbmcgc2NhbGVkIGJ5IHRoZVxuICAgICAqIGdpdmVuIGBmYWN0b3JgLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltYWdlLndpZHRoICAvLyA9PiA1MDBcbiAgICAgKiBpbWFnZS5oZWlnaHQgLy8gPT4gMjUwXG4gICAgICpcbiAgICAgKiBjb25zdCBzY2FsZWQgPSBpbWFnZS5zY2FsZSgwLjUpXG4gICAgICogc2NhbGVkLndpZHRoICAvLyA9PiAyNTBcbiAgICAgKiBzY2FsZWQuaGVpZ2h0IC8vID0+IDEyNVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgb3BlcmF0aW9uIGlzIG9mdGVuIHVzZWZ1bCBiZWZvcmUgZHJhd2luZyBhbiBpbWFnZSB3aXRoXG4gICAgICogW1tQREZQYWdlLmRyYXdJbWFnZV1dIHRvIGNvbXB1dGUgdGhlIGB3aWR0aGAgYW5kIGBoZWlnaHRgIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIGZhY3RvciBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoaXMgaW1hZ2Ugc2hvdWxkIGJlIHNjYWxlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UgYWZ0ZXIgYmVpbmcgc2NhbGVkLlxuICAgICAqL1xuICAgIFBERkltYWdlLnByb3RvdHlwZS5zY2FsZSA9IGZ1bmN0aW9uIChmYWN0b3IpIHtcbiAgICAgICAgYXNzZXJ0SXMoZmFjdG9yLCAnZmFjdG9yJywgWydudW1iZXInXSk7XG4gICAgICAgIHJldHVybiB7IHdpZHRoOiB0aGlzLndpZHRoICogZmFjdG9yLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0ICogZmFjdG9yIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhpcyBpbWFnZSBhZnRlciBzY2FsaW5nIGl0IGFzIGxhcmdlIGFzXG4gICAgICogcG9zc2libGUgd2hpbGUgbWFpbnRhaW5pbmcgaXRzIGFzcGVjdCByYXRpbyBhbmQgbm90IGV4Y2VlZGluZyB0aGVcbiAgICAgKiBzcGVjaWZpZWQgYHdpZHRoYCBhbmQgYGhlaWdodGAuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYFxuICAgICAqIGltYWdlLndpZHRoICAvLyA9PiA1MDBcbiAgICAgKiBpbWFnZS5oZWlnaHQgLy8gPT4gMjUwXG4gICAgICpcbiAgICAgKiBjb25zdCBzY2FsZWQgPSBpbWFnZS5zY2FsZVRvRml0KDc1MCwgMTAwMClcbiAgICAgKiBzY2FsZWQud2lkdGggIC8vID0+IDc1MFxuICAgICAqIHNjYWxlZC5oZWlnaHQgLy8gPT4gMzc1XG4gICAgICogYGBgXG4gICAgICogVGhlIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHBhcmFtZXRlcnMgY2FuIGFsc28gYmUgdGhvdWdodCBvZiBhcyB0aGUgd2lkdGhcbiAgICAgKiBhbmQgaGVpZ2h0IG9mIGEgYm94IHRoYXQgdGhlIHNjYWxlZCBpbWFnZSBtdXN0IGZpdCB3aXRoaW4uXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSBib3VuZGluZyBib3gncyB3aWR0aC5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBib3VuZGluZyBib3gncyBoZWlnaHQuXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGltYWdlIGFmdGVyIGJlaW5nIHNjYWxlZC5cbiAgICAgKi9cbiAgICBQREZJbWFnZS5wcm90b3R5cGUuc2NhbGVUb0ZpdCA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBpbWdXaWR0aFNjYWxlID0gd2lkdGggLyB0aGlzLndpZHRoO1xuICAgICAgICB2YXIgaW1nSGVpZ2h0U2NhbGUgPSBoZWlnaHQgLyB0aGlzLmhlaWdodDtcbiAgICAgICAgdmFyIHNjYWxlID0gTWF0aC5taW4oaW1nV2lkdGhTY2FsZSwgaW1nSGVpZ2h0U2NhbGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5zY2FsZShzY2FsZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhpcyBpbWFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGltYWdlLnNpemUoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbWFnZS5cbiAgICAgKi9cbiAgICBQREZJbWFnZS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGUoMSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBUaGVcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuc2F2ZV1dIGFuZCBbW1BERkRvY3VtZW50LnNhdmVBc0Jhc2U2NF1dIG1ldGhvZHMgd2lsbFxuICAgICAqID4gYXV0b21hdGljYWxseSBlbnN1cmUgYWxsIGltYWdlcyBnZXQgZW1iZWRkZWQuXG4gICAgICpcbiAgICAgKiBFbWJlZCB0aGlzIGltYWdlIGluIGl0cyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gdGhlIGVtYmVkZGluZyBpcyBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBQREZJbWFnZS5wcm90b3R5cGUuZW1iZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgZG9jLCByZWY7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW1iZWRkZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGltYWdlIHNob3VsZCBvbmx5IGJlIGVtYmVkZGVkIG9uY2UuIElmIHRoZXJlJ3MgYSBwZW5kaW5nIGVtYmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcGVyYXRpb24gdGhlbiB3YWl0IG9uIGl0LiBPdGhlcndpc2Ugd2UgbmVlZCB0byBzdGFydCB0aGUgZW1iZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW1iZWRUYXNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzLCBkb2MgPSBfYS5kb2MsIHJlZiA9IF9hLnJlZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYmVkVGFzayA9IHRoaXMuZW1iZWRkZXIuZW1iZWRJbnRvQ29udGV4dChkb2MuY29udGV4dCwgcmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRUYXNrXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2xlYXIgYHRoaXMuZW1iZWRkZXJgIHNvIHRoYXQgdGhlIGluZGlyZWN0bHkgcmVmZXJlbmNlZCBpbWFnZSBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQsIHRodXMgYXZvaWRpbmcgYSBtZW1vcnkgbGVhay5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vSG9wZGluZy9wZGYtbGliL3B1bGwvMTAzMi9maWxlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRkZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkRvY3VtZW50LmVtYmVkUG5nXV0gYW5kIFtbUERGRG9jdW1lbnQuZW1iZWRKcGddXVxuICAgICAqID4gbWV0aG9kcywgd2hpY2ggd2lsbCBjcmVhdGUgaW5zdGFuY2VzIG9mIFtbUERGSW1hZ2VdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGSW1hZ2VdXSBmcm9tIGFuIGV4aXN0aW5nIHJlZiBhbmQgZW1iZWRkZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgaW1hZ2UuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhlIGltYWdlIHdpbGwgYmVsb25nLlxuICAgICAqIEBwYXJhbSBlbWJlZGRlciBUaGUgZW1iZWRkZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZW1iZWQgdGhlIGltYWdlLlxuICAgICAqL1xuICAgIFBERkltYWdlLm9mID0gZnVuY3Rpb24gKHJlZiwgZG9jLCBlbWJlZGRlcikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkltYWdlKHJlZiwgZG9jLCBlbWJlZGRlcik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGSW1hZ2U7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGSW1hZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZJbWFnZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQREZOYW1lLCBQREZBcnJheSwgUERGRGljdCwgUERGSGV4U3RyaW5nIH0gZnJvbSBcIi4uL2NvcmVcIjtcbi8qKlxuICogUmVwcmVzZW50cyBKYXZhU2NyaXB0IHRoYXQgaGFzIGJlZW4gZW1iZWRkZWQgaW4gYSBbW1BERkRvY3VtZW50XV0uXG4gKi9cbnZhciBQREZKYXZhU2NyaXB0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkphdmFTY3JpcHQocmVmLCBkb2MsIGVtYmVkZGVyKSB7XG4gICAgICAgIHRoaXMuYWxyZWFkeUVtYmVkZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5lbWJlZGRlciA9IGVtYmVkZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBUaGVcbiAgICAgKiA+IFtbUERGRG9jdW1lbnQuc2F2ZV1dIGFuZCBbW1BERkRvY3VtZW50LnNhdmVBc0Jhc2U2NF1dIG1ldGhvZHMgd2lsbFxuICAgICAqID4gYXV0b21hdGljYWxseSBlbnN1cmUgYWxsIEphdmFTY3JpcHRzIGdldCBlbWJlZGRlZC5cbiAgICAgKlxuICAgICAqIEVtYmVkIHRoaXMgSmF2YVNjcmlwdCBpbiBpdHMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBSZXNvbHZlcyB3aGVuIHRoZSBlbWJlZGRpbmcgaXMgY29tcGxldGUuXG4gICAgICovXG4gICAgUERGSmF2YVNjcmlwdC5wcm90b3R5cGUuZW1iZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgY2F0YWxvZywgY29udGV4dCwgcmVmLCBOYW1lcywgSmF2YXNjcmlwdCwgSlNOYW1lcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMuYWxyZWFkeUVtYmVkZGVkKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGhpcy5kb2MsIGNhdGFsb2cgPSBfYS5jYXRhbG9nLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRkZXIuZW1iZWRJbnRvQ29udGV4dCh0aGlzLmRvYy5jb250ZXh0LCB0aGlzLnJlZildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSBfYi5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhdGFsb2cuaGFzKFBERk5hbWUub2YoJ05hbWVzJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy5zZXQoUERGTmFtZS5vZignTmFtZXMnKSwgY29udGV4dC5vYmooe30pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzID0gY2F0YWxvZy5sb29rdXAoUERGTmFtZS5vZignTmFtZXMnKSwgUERGRGljdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU5hbWVzLmhhcyhQREZOYW1lLm9mKCdKYXZhU2NyaXB0JykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXMuc2V0KFBERk5hbWUub2YoJ0phdmFTY3JpcHQnKSwgY29udGV4dC5vYmooe30pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEphdmFzY3JpcHQgPSBOYW1lcy5sb29rdXAoUERGTmFtZS5vZignSmF2YVNjcmlwdCcpLCBQREZEaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSmF2YXNjcmlwdC5oYXMoUERGTmFtZS5vZignTmFtZXMnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhc2NyaXB0LnNldChQREZOYW1lLm9mKCdOYW1lcycpLCBjb250ZXh0Lm9iaihbXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgSlNOYW1lcyA9IEphdmFzY3JpcHQubG9va3VwKFBERk5hbWUub2YoJ05hbWVzJyksIFBERkFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTTmFtZXMucHVzaChQREZIZXhTdHJpbmcuZnJvbVRleHQodGhpcy5lbWJlZGRlci5zY3JpcHROYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBKU05hbWVzLnB1c2gocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxyZWFkeUVtYmVkZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkRvY3VtZW50LmFkZEphdmFTY3JpcHRdXSBtZXRob2QsIHdoaWNoIHdpbGxcbiAgICAgKiBjcmVhdGUgaW5zdGFuY2VzIG9mIFtbUERGSmF2YVNjcmlwdF1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZKYXZhU2NyaXB0XV0gZnJvbSBhbiBleGlzdGluZyByZWYgYW5kIHNjcmlwdFxuICAgICAqXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBzY3JpcHQuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhlIHNjcmlwdCB3aWxsIGJlbG9uZy5cbiAgICAgKiBAcGFyYW0gZW1iZWRkZXIgVGhlIGVtYmVkZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVtYmVkIHRoZSBzY3JpcHQuXG4gICAgICovXG4gICAgUERGSmF2YVNjcmlwdC5vZiA9IGZ1bmN0aW9uIChyZWYsIGRvYywgZW1iZWRkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZKYXZhU2NyaXB0KHJlZiwgZG9jLCBlbWJlZGRlcik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGSmF2YVNjcmlwdDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZKYXZhU2NyaXB0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGSmF2YVNjcmlwdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgcmdiIH0gZnJvbSBcIi4vY29sb3JzXCI7XG5pbXBvcnQgeyBkcmF3SW1hZ2UsIGRyYXdMaW5lLCBkcmF3TGluZXNPZlRleHQsIGRyYXdQYWdlLCBkcmF3UmVjdGFuZ2xlLCBkcmF3U3ZnUGF0aCwgZHJhd0VsbGlwc2UsIH0gZnJvbSBcIi4vb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgcG9wR3JhcGhpY3NTdGF0ZSwgcHVzaEdyYXBoaWNzU3RhdGUsIHRyYW5zbGF0ZSwgTGluZUNhcFN0eWxlLCBzY2FsZSwgfSBmcm9tIFwiLi9vcGVyYXRvcnNcIjtcbmltcG9ydCBQREZEb2N1bWVudCBmcm9tIFwiLi9QREZEb2N1bWVudFwiO1xuaW1wb3J0IFBERkVtYmVkZGVkUGFnZSBmcm9tIFwiLi9QREZFbWJlZGRlZFBhZ2VcIjtcbmltcG9ydCBQREZGb250IGZyb20gXCIuL1BERkZvbnRcIjtcbmltcG9ydCBQREZJbWFnZSBmcm9tIFwiLi9QREZJbWFnZVwiO1xuaW1wb3J0IHsgQmxlbmRNb2RlLCB9IGZyb20gXCIuL1BERlBhZ2VPcHRpb25zXCI7XG5pbXBvcnQgeyBkZWdyZWVzLCB0b0RlZ3JlZXMgfSBmcm9tIFwiLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFN0YW5kYXJkRm9udHMgfSBmcm9tIFwiLi9TdGFuZGFyZEZvbnRzXCI7XG5pbXBvcnQgeyBQREZDb250ZW50U3RyZWFtLCBQREZOYW1lLCBQREZPcGVyYXRvciwgUERGUGFnZUxlYWYsIFBERlJlZiwgUERGRGljdCwgUERGQXJyYXksIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydEVhY2hJcywgYXNzZXJ0SXMsIGFzc2VydE11bHRpcGxlLCBhc3NlcnRPclVuZGVmaW5lZCwgYnJlYWtUZXh0SW50b0xpbmVzLCBjbGVhblRleHQsIHJlY3RhbmdsZXNBcmVFcXVhbCwgbGluZVNwbGl0LCBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkLCBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBzaW5nbGUgcGFnZSBvZiBhIFtbUERGRG9jdW1lbnRdXS5cbiAqL1xudmFyIFBERlBhZ2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGUGFnZShsZWFmTm9kZSwgcmVmLCBkb2MpIHtcbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IDI0O1xuICAgICAgICB0aGlzLmZvbnRDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgdGhpcy5saW5lSGVpZ2h0ID0gMjQ7XG4gICAgICAgIHRoaXMueCA9IDA7XG4gICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgIGFzc2VydElzKGxlYWZOb2RlLCAnbGVhZk5vZGUnLCBbW1BERlBhZ2VMZWFmLCAnUERGUGFnZUxlYWYnXV0pO1xuICAgICAgICBhc3NlcnRJcyhyZWYsICdyZWYnLCBbW1BERlJlZiwgJ1BERlJlZiddXSk7XG4gICAgICAgIGFzc2VydElzKGRvYywgJ2RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgIHRoaXMubm9kZSA9IGxlYWZOb2RlO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSB0aGlzIHBhZ2UgYnkgYSBtdWx0aXBsZSBvZiA5MCBkZWdyZWVzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogcGFnZS5zZXRSb3RhdGlvbihkZWdyZWVzKC05MCkpXG4gICAgICogcGFnZS5zZXRSb3RhdGlvbihkZWdyZWVzKDApKVxuICAgICAqIHBhZ2Uuc2V0Um90YXRpb24oZGVncmVlcyg5MCkpXG4gICAgICogcGFnZS5zZXRSb3RhdGlvbihkZWdyZWVzKDE4MCkpXG4gICAgICogcGFnZS5zZXRSb3RhdGlvbihkZWdyZWVzKDI3MCkpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGFuZ2xlIFRoZSBhbmdsZSB0byByb3RhdGUgdGhpcyBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldFJvdGF0aW9uID0gZnVuY3Rpb24gKGFuZ2xlKSB7XG4gICAgICAgIHZhciBkZWdyZWVzQW5nbGUgPSB0b0RlZ3JlZXMoYW5nbGUpO1xuICAgICAgICBhc3NlcnRNdWx0aXBsZShkZWdyZWVzQW5nbGUsICdkZWdyZWVzQW5nbGUnLCA5MCk7XG4gICAgICAgIHRoaXMubm9kZS5zZXQoUERGTmFtZS5vZignUm90YXRlJyksIHRoaXMuZG9jLmNvbnRleHQub2JqKGRlZ3JlZXNBbmdsZSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoaXMgcGFnZSdzIHJvdGF0aW9uIGFuZ2xlIGluIGRlZ3JlZXMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgcm90YXRpb25BbmdsZSA9IHBhZ2UuZ2V0Um90YXRpb24oKS5hbmdsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgcm90YXRpb24gYW5nbGUgb2YgdGhlIHBhZ2UgaW4gZGVncmVlcyAoYWx3YXlzIGEgbXVsdGlwbGUgb2ZcbiAgICAgKiAgICAgICAgICA5MCBkZWdyZWVzKS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRSb3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFJvdGF0ZSA9IHRoaXMubm9kZS5Sb3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIGRlZ3JlZXMoUm90YXRlID8gUm90YXRlLmFzTnVtYmVyKCkgOiAwKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlc2l6ZSB0aGlzIHBhZ2UgYnkgaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nIGl0cyB3aWR0aCBhbmQgaGVpZ2h0LiBGb3JcbiAgICAgKiBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5zZXRTaXplKDI1MCwgNTAwKVxuICAgICAqIHBhZ2Uuc2V0U2l6ZShwYWdlLmdldFdpZHRoKCkgKyA1MCwgcGFnZS5nZXRIZWlnaHQoKSArIDEwMClcbiAgICAgKiBwYWdlLnNldFNpemUocGFnZS5nZXRXaWR0aCgpIC0gNTAsIHBhZ2UuZ2V0SGVpZ2h0KCkgLSAxMDApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdGhlIFBERiBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGFsbG93IGZvciBwYWdlcyB0byBoYXZlIGV4cGxpY2l0XG4gICAgICogd2lkdGhzIGFuZCBoZWlnaHRzLiBJbnN0ZWFkIGl0IGRlZmluZXMgdGhlIFwic2l6ZVwiIG9mIGEgcGFnZSBpbiB0ZXJtcyBvZlxuICAgICAqIGZpdmUgcmVjdGFuZ2xlczogdGhlIE1lZGlhQm94LCBDcm9wQm94LCBCbGVlZEJveCwgVHJpbUJveCwgYW5kIEFydEJveC4gQXMgYVxuICAgICAqIHJlc3VsdCwgdGhpcyBtZXRob2QgY2Fubm90IGRpcmVjdGx5IGNoYW5nZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBhIHBhZ2UuXG4gICAgICogSW5zdGVhZCwgaXQgd29ya3MgYnkgYWRqdXN0aW5nIHRoZXNlIGZpdmUgYm94ZXMuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuICAgICAqICAgMS4gU2V0IHdpZHRoICYgaGVpZ2h0IG9mIE1lZGlhQm94LlxuICAgICAqICAgMi4gU2V0IHdpZHRoICYgaGVpZ2h0IG9mIENyb3BCb3gsIGlmIGl0IGhhcyBzYW1lIGRpbWVuc2lvbnMgYXMgTWVkaWFCb3guXG4gICAgICogICAzLiBTZXQgd2lkdGggJiBoZWlnaHQgb2YgQmxlZWRCb3gsIGlmIGl0IGhhcyBzYW1lIGRpbWVuc2lvbnMgYXMgTWVkaWFCb3guXG4gICAgICogICA0LiBTZXQgd2lkdGggJiBoZWlnaHQgb2YgVHJpbUJveCwgaWYgaXQgaGFzIHNhbWUgZGltZW5zaW9ucyBhcyBNZWRpYUJveC5cbiAgICAgKiAgIDUuIFNldCB3aWR0aCAmIGhlaWdodCBvZiBBcnRCb3gsIGlmIGl0IGhhcyBzYW1lIGRpbWVuc2lvbnMgYXMgTWVkaWFCb3guXG4gICAgICpcbiAgICAgKiBUaGlzIGFwcHJvYWNoIHdvcmtzIHdlbGwgZm9yIG1vc3QgUERGIGRvY3VtZW50cyBhcyBhbGwgUERGIHBhZ2VzIG11c3RcbiAgICAgKiBoYXZlIGEgTWVkaWFCb3gsIGJ1dCByZWxhdGl2ZWx5IGZldyBoYXZlIGEgQ3JvcEJveCwgQmxlZWRCb3gsIFRyaW1Cb3gsIG9yXG4gICAgICogQXJ0Qm94LiBBbmQgd2hlbiB0aGV5IGRvIGhhdmUgdGhlc2UgYWRkaXRpb25hbCBib3hlcywgdGhleSBvZnRlbiBoYXZlIHRoZVxuICAgICAqIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgTWVkaWFCb3guIEhvd2V2ZXIsIGlmIHlvdSBmaW5kIHRoaXMgbWV0aG9kIGRvZXMgbm90XG4gICAgICogd29yayBmb3IgeW91ciBkb2N1bWVudCwgY29uc2lkZXIgc2V0dGluZyB0aGUgYm94ZXMgZGlyZWN0bHk6XG4gICAgICogICAqIFtbUERGUGFnZS5zZXRNZWRpYUJveF1dXG4gICAgICogICAqIFtbUERGUGFnZS5zZXRDcm9wQm94XV1cbiAgICAgKiAgICogW1tQREZQYWdlLnNldEJsZWVkQm94XV1cbiAgICAgKiAgICogW1tQREZQYWdlLnNldFRyaW1Cb3hdXVxuICAgICAqICAgKiBbW1BERlBhZ2Uuc2V0QXJ0Qm94XV1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgbmV3IHdpZHRoIG9mIHRoZSBwYWdlLlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIG5ldyBoZWlnaHQgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0U2l6ZSA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKHdpZHRoLCAnd2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoaGVpZ2h0LCAnaGVpZ2h0JywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBtZWRpYUJveCA9IHRoaXMuZ2V0TWVkaWFCb3goKTtcbiAgICAgICAgdGhpcy5zZXRNZWRpYUJveChtZWRpYUJveC54LCBtZWRpYUJveC55LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdmFyIGNyb3BCb3ggPSB0aGlzLmdldENyb3BCb3goKTtcbiAgICAgICAgdmFyIGJsZWVkQm94ID0gdGhpcy5nZXRCbGVlZEJveCgpO1xuICAgICAgICB2YXIgdHJpbUJveCA9IHRoaXMuZ2V0VHJpbUJveCgpO1xuICAgICAgICB2YXIgYXJ0Qm94ID0gdGhpcy5nZXRBcnRCb3goKTtcbiAgICAgICAgdmFyIGhhc0Nyb3BCb3ggPSB0aGlzLm5vZGUuQ3JvcEJveCgpO1xuICAgICAgICB2YXIgaGFzQmxlZWRCb3ggPSB0aGlzLm5vZGUuQmxlZWRCb3goKTtcbiAgICAgICAgdmFyIGhhc1RyaW1Cb3ggPSB0aGlzLm5vZGUuVHJpbUJveCgpO1xuICAgICAgICB2YXIgaGFzQXJ0Qm94ID0gdGhpcy5ub2RlLkFydEJveCgpO1xuICAgICAgICBpZiAoaGFzQ3JvcEJveCAmJiByZWN0YW5nbGVzQXJlRXF1YWwoY3JvcEJveCwgbWVkaWFCb3gpKSB7XG4gICAgICAgICAgICB0aGlzLnNldENyb3BCb3gobWVkaWFCb3gueCwgbWVkaWFCb3gueSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0JsZWVkQm94ICYmIHJlY3RhbmdsZXNBcmVFcXVhbChibGVlZEJveCwgbWVkaWFCb3gpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEJsZWVkQm94KG1lZGlhQm94LngsIG1lZGlhQm94LnksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNUcmltQm94ICYmIHJlY3RhbmdsZXNBcmVFcXVhbCh0cmltQm94LCBtZWRpYUJveCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VHJpbUJveChtZWRpYUJveC54LCBtZWRpYUJveC55LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzQXJ0Qm94ICYmIHJlY3RhbmdsZXNBcmVFcXVhbChhcnRCb3gsIG1lZGlhQm94KSkge1xuICAgICAgICAgICAgdGhpcy5zZXRBcnRCb3gobWVkaWFCb3gueCwgbWVkaWFCb3gueSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlc2l6ZSB0aGlzIHBhZ2UgYnkgaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nIGl0cyB3aWR0aC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLnNldFdpZHRoKDI1MClcbiAgICAgKiBwYWdlLnNldFdpZHRoKHBhZ2UuZ2V0V2lkdGgoKSArIDUwKVxuICAgICAqIHBhZ2Uuc2V0V2lkdGgocGFnZS5nZXRXaWR0aCgpIC0gNTApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIFtbUERGUGFnZS5zZXRTaXplXV0gdG8gc2V0IHRoZSBwYWdlJ3Mgd2lkdGguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIG5ldyB3aWR0aCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRXaWR0aCA9IGZ1bmN0aW9uICh3aWR0aCkge1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMuc2V0U2l6ZSh3aWR0aCwgdGhpcy5nZXRTaXplKCkuaGVpZ2h0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlc2l6ZSB0aGlzIHBhZ2UgYnkgaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nIGl0cyBoZWlnaHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5zZXRIZWlnaHQoNTAwKVxuICAgICAqIHBhZ2Uuc2V0SGVpZ2h0KHBhZ2UuZ2V0V2lkdGgoKSArIDEwMClcbiAgICAgKiBwYWdlLnNldEhlaWdodChwYWdlLmdldFdpZHRoKCkgLSAxMDApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIFtbUERGUGFnZS5zZXRTaXplXV0gdG8gc2V0IHRoZSBwYWdlJ3MgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgbmV3IGhlaWdodCBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRIZWlnaHQgPSBmdW5jdGlvbiAoaGVpZ2h0KSB7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnNldFNpemUodGhpcy5nZXRTaXplKCkud2lkdGgsIGhlaWdodCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIE1lZGlhQm94IG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBtZWRpYUJveCA9IHBhZ2UuZ2V0TWVkaWFCb3goKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRNZWRpYUJveCgwLCAwLCAyNTAsIDUwMClcbiAgICAgKiBwYWdlLnNldE1lZGlhQm94KG1lZGlhQm94LngsIG1lZGlhQm94LnksIDUwLCAxMDApXG4gICAgICogcGFnZS5zZXRNZWRpYUJveCgxNSwgNSwgbWVkaWFCb3gud2lkdGggLSA1MCwgbWVkaWFCb3guaGVpZ2h0IC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2VlIFtbUERGUGFnZS5nZXRNZWRpYUJveF1dIGZvciBkZXRhaWxzIGFib3V0IHdoYXQgdGhlIE1lZGlhQm94IHJlcHJlc2VudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IE1lZGlhQm94LlxuICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgTWVkaWFCb3guXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgbmV3IE1lZGlhQm94LlxuICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbmV3IE1lZGlhQm94LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldE1lZGlhQm94ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIG1lZGlhQm94ID0gdGhpcy5kb2MuY29udGV4dC5vYmooW3gsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodF0pO1xuICAgICAgICB0aGlzLm5vZGUuc2V0KFBERk5hbWUuTWVkaWFCb3gsIG1lZGlhQm94KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgQ3JvcEJveCBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY3JvcEJveCA9IHBhZ2UuZ2V0Q3JvcEJveCgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldENyb3BCb3goMCwgMCwgMjUwLCA1MDApXG4gICAgICogcGFnZS5zZXRDcm9wQm94KGNyb3BCb3gueCwgY3JvcEJveC55LCA1MCwgMTAwKVxuICAgICAqIHBhZ2Uuc2V0Q3JvcEJveCgxNSwgNSwgY3JvcEJveC53aWR0aCAtIDUwLCBjcm9wQm94LmhlaWdodCAtIDEwMClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNlZSBbW1BERlBhZ2UuZ2V0Q3JvcEJveF1dIGZvciBkZXRhaWxzIGFib3V0IHdoYXQgdGhlIENyb3BCb3ggcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgQ3JvcEJveC5cbiAgICAgKiBAcGFyYW0geSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgbmV3IENyb3BCb3guXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgbmV3IENyb3BCb3guXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBuZXcgQ3JvcEJveC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRDcm9wQm94ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIGNyb3BCb3ggPSB0aGlzLmRvYy5jb250ZXh0Lm9iaihbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSk7XG4gICAgICAgIHRoaXMubm9kZS5zZXQoUERGTmFtZS5Dcm9wQm94LCBjcm9wQm94KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgQmxlZWRCb3ggb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGJsZWVkQm94ID0gcGFnZS5nZXRCbGVlZEJveCgpXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEJsZWVkQm94KDAsIDAsIDI1MCwgNTAwKVxuICAgICAqIHBhZ2Uuc2V0QmxlZWRCb3goYmxlZWRCb3gueCwgYmxlZWRCb3gueSwgNTAsIDEwMClcbiAgICAgKiBwYWdlLnNldEJsZWVkQm94KDE1LCA1LCBibGVlZEJveC53aWR0aCAtIDUwLCBibGVlZEJveC5oZWlnaHQgLSAxMDApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTZWUgW1tQREZQYWdlLmdldEJsZWVkQm94XV0gZm9yIGRldGFpbHMgYWJvdXQgd2hhdCB0aGUgQmxlZWRCb3ggcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgQmxlZWRCb3guXG4gICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBCbGVlZEJveC5cbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBuZXcgQmxlZWRCb3guXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBuZXcgQmxlZWRCb3guXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0QmxlZWRCb3ggPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgYmxlZWRCb3ggPSB0aGlzLmRvYy5jb250ZXh0Lm9iaihbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XSk7XG4gICAgICAgIHRoaXMubm9kZS5zZXQoUERGTmFtZS5CbGVlZEJveCwgYmxlZWRCb3gpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBUcmltQm94IG9mIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0cmltQm94ID0gcGFnZS5nZXRUcmltQm94KClcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0VHJpbUJveCgwLCAwLCAyNTAsIDUwMClcbiAgICAgKiBwYWdlLnNldFRyaW1Cb3godHJpbUJveC54LCB0cmltQm94LnksIDUwLCAxMDApXG4gICAgICogcGFnZS5zZXRUcmltQm94KDE1LCA1LCB0cmltQm94LndpZHRoIC0gNTAsIHRyaW1Cb3guaGVpZ2h0IC0gMTAwKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2VlIFtbUERGUGFnZS5nZXRUcmltQm94XV0gZm9yIGRldGFpbHMgYWJvdXQgd2hhdCB0aGUgVHJpbUJveCByZXByZXNlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBUcmltQm94LlxuICAgICAqIEBwYXJhbSB5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxvd2VyIGxlZnQgY29ybmVyIG9mIHRoZSBuZXcgVHJpbUJveC5cbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBuZXcgVHJpbUJveC5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIG5ldyBUcmltQm94LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNldFRyaW1Cb3ggPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh3aWR0aCwgJ3dpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKGhlaWdodCwgJ2hlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgdHJpbUJveCA9IHRoaXMuZG9jLmNvbnRleHQub2JqKFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdKTtcbiAgICAgICAgdGhpcy5ub2RlLnNldChQREZOYW1lLlRyaW1Cb3gsIHRyaW1Cb3gpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBBcnRCb3ggb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGFydEJveCA9IHBhZ2UuZ2V0QXJ0Qm94KClcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0QXJ0Qm94KDAsIDAsIDI1MCwgNTAwKVxuICAgICAqIHBhZ2Uuc2V0QXJ0Qm94KGFydEJveC54LCBhcnRCb3gueSwgNTAsIDEwMClcbiAgICAgKiBwYWdlLnNldEFydEJveCgxNSwgNSwgYXJ0Qm94LndpZHRoIC0gNTAsIGFydEJveC5oZWlnaHQgLSAxMDApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTZWUgW1tQREZQYWdlLmdldEFydEJveF1dIGZvciBkZXRhaWxzIGFib3V0IHdoYXQgdGhlIEFydEJveCByZXByZXNlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBBcnRCb3guXG4gICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIG5ldyBBcnRCb3guXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgbmV3IEFydEJveC5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIG5ldyBBcnRCb3guXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0QXJ0Qm94ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMod2lkdGgsICd3aWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhoZWlnaHQsICdoZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdmFyIGFydEJveCA9IHRoaXMuZG9jLmNvbnRleHQub2JqKFt4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHRdKTtcbiAgICAgICAgdGhpcy5ub2RlLnNldChQREZOYW1lLkFydEJveCwgYXJ0Qm94KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIHBhZ2UncyB3aWR0aCBhbmQgaGVpZ2h0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gcGFnZS5nZXRTaXplKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgW1tQREZQYWdlLmdldE1lZGlhQm94XV0gdG8gb2J0YWluIHRoZSBwYWdlJ3NcbiAgICAgKiB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0U2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5nZXRNZWRpYUJveCgpLCB3aWR0aCA9IF9hLndpZHRoLCBoZWlnaHQgPSBfYS5oZWlnaHQ7XG4gICAgICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIHBhZ2UncyB3aWR0aC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB3aWR0aCA9IHBhZ2UuZ2V0V2lkdGgoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgdXNlcyBbW1BERlBhZ2UuZ2V0U2l6ZV1dIHRvIG9idGFpbiB0aGUgcGFnZSdzIHNpemUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgd2lkdGggb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNpemUoKS53aWR0aDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGlzIHBhZ2UncyBoZWlnaHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVpZ2h0ID0gcGFnZS5nZXRIZWlnaHQoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgdXNlcyBbW1BERlBhZ2UuZ2V0U2l6ZV1dIHRvIG9idGFpbiB0aGUgcGFnZSdzIHNpemUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgaGVpZ2h0IG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2l6ZSgpLmhlaWdodDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmVjdGFuZ2xlIGRlZmluaW5nIHRoaXMgcGFnZSdzIE1lZGlhQm94LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcGFnZS5nZXRNZWRpYUJveCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgTWVkaWFCb3ggb2YgYSBwYWdlIGRlZmluZXMgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHBoeXNpY2FsIG1lZGl1bSBvblxuICAgICAqIHdoaWNoIHRoZSBwYWdlIGlzIHRvIGJlIGRpc3BsYXllZC9wcmludGVkLiBJdCBtYXkgaW5jbHVkZSBleHRlbmRlZCBhcmVhXG4gICAgICogc3Vycm91bmRpbmcgdGhlIHBhZ2UgY29udGVudCBmb3IgYmxlZWQgbWFya3MsIHByaW50aW5nIG1hcmtzLCBldGMuLi5cbiAgICAgKiBJdCBtYXkgYWxzbyBpbmNsdWRlIGFyZWFzIGNsb3NlIHRvIHRoZSBlZGdlcyBvZiB0aGUgbWVkaXVtIHRoYXQgY2Fubm90IGJlXG4gICAgICogbWFya2VkIGJlY2F1c2Ugb2YgcGh5c2ljYWwgbGltaXRhdGlvbnMgb2YgdGhlIG91dHB1dCBkZXZpY2UuIENvbnRlbnRcbiAgICAgKiBmYWxsaW5nIG91dHNpZGUgdGhpcyBib3VuZGFyeSBtYXkgc2FmZWx5IGJlIGRpc2NhcmRlZCB3aXRob3V0IGFmZmVjdGluZ1xuICAgICAqIHRoZSBtZWFuaW5nIG9mIHRoZSBQREYgZmlsZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBkZWZpbmluZyB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIE1lZGlhQm94IGFuZCBpdHNcbiAgICAgKiAgICAgICAgICB3aWR0aCAmIGhlaWdodC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRNZWRpYUJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1lZGlhQm94ID0gdGhpcy5ub2RlLk1lZGlhQm94KCk7XG4gICAgICAgIHJldHVybiBtZWRpYUJveC5hc1JlY3RhbmdsZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZWN0YW5nbGUgZGVmaW5pbmcgdGhpcyBwYWdlJ3MgQ3JvcEJveC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHBhZ2UuZ2V0Q3JvcEJveCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgQ3JvcEJveCBvZiBhIHBhZ2UgZGVmaW5lcyB0aGUgcmVnaW9uIHRvIHdoaWNoIHRoZSBjb250ZW50cyBvZiB0aGUgcGFnZVxuICAgICAqIHNoYWxsIGJlIGNsaXBwZWQgd2hlbiBkaXNwbGF5ZWQgb3IgcHJpbnRlZC4gVW5saWtlIHRoZSBvdGhlciBib3hlcywgdGhlXG4gICAgICogQ3JvcEJveCBkb2VzIG5vdCBuZWNlc3NhcmlseSByZXByZXNlbnQgdGhlIHBoeXNpY2FsIHBhZ2UgZ2VvbWV0cnkuIEl0XG4gICAgICogbWVyZWx5IGltcG9zZXMgY2xpcHBpbmcgb24gdGhlIHBhZ2UgY29udGVudHMuXG4gICAgICpcbiAgICAgKiBUaGUgQ3JvcEJveCdzIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHBhZ2UncyBNZWRpYUJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBkZWZpbmluZyB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIENyb3BCb3ggYW5kIGl0c1xuICAgICAqICAgICAgICAgIHdpZHRoICYgaGVpZ2h0LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldENyb3BCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGNyb3BCb3ggPSB0aGlzLm5vZGUuQ3JvcEJveCgpO1xuICAgICAgICByZXR1cm4gKF9hID0gY3JvcEJveCA9PT0gbnVsbCB8fCBjcm9wQm94ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjcm9wQm94LmFzUmVjdGFuZ2xlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuZ2V0TWVkaWFCb3goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgcmVjdGFuZ2xlIGRlZmluaW5nIHRoaXMgcGFnZSdzIEJsZWVkQm94LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcGFnZS5nZXRCbGVlZEJveCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgQmxlZWRCb3ggb2YgYSBwYWdlIGRlZmluZXMgdGhlIHJlZ2lvbiB0byB3aGljaCB0aGUgY29udGVudHMgb2YgdGhlXG4gICAgICogcGFnZSBzaGFsbCBiZSBjbGlwcGVkIHdoZW4gb3V0cHV0IGluIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gVGhpcyBtYXlcbiAgICAgKiBpbmNsdWRlIGFueSBleHRyYSBibGVlZCBhcmVhIG5lZWRlZCB0byBhY2NvbW1vZGF0ZSB0aGUgcGh5c2ljYWxcbiAgICAgKiBsaW1pdGF0aW9ucyBvZiBjdXR0aW5nLCBmb2xkaW5nLCBhbmQgdHJpbW1pbmcgZXF1aXBtZW50LiBUaGUgYWN0dWFsXG4gICAgICogcHJpbnRlZCBwYWdlIG1heSBpbmNsdWRlIHByaW50aW5nIG1hcmtzIHRoYXQgZmFsbCBvdXRzaWRlIHRoZSBCbGVlZEJveC5cbiAgICAgKlxuICAgICAqIFRoZSBCbGVlZEJveCdzIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHBhZ2UncyBDcm9wQm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGRlZmluaW5nIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgQmxlZWRCb3ggYW5kIGl0c1xuICAgICAqICAgICAgICAgIHdpZHRoICYgaGVpZ2h0LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldEJsZWVkQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBibGVlZEJveCA9IHRoaXMubm9kZS5CbGVlZEJveCgpO1xuICAgICAgICByZXR1cm4gKF9hID0gYmxlZWRCb3ggPT09IG51bGwgfHwgYmxlZWRCb3ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJsZWVkQm94LmFzUmVjdGFuZ2xlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuZ2V0Q3JvcEJveCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZWN0YW5nbGUgZGVmaW5pbmcgdGhpcyBwYWdlJ3MgVHJpbUJveC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHBhZ2UuZ2V0VHJpbUJveCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgVHJpbUJveCBvZiBhIHBhZ2UgZGVmaW5lcyB0aGUgaW50ZW5kZWQgZGltZW5zaW9ucyBvZiB0aGUgZmluaXNoZWRcbiAgICAgKiBwYWdlIGFmdGVyIHRyaW1taW5nLiBJdCBtYXkgYmUgc21hbGxlciB0aGFuIHRoZSBNZWRpYUJveCB0byBhbGxvdyBmb3JcbiAgICAgKiBwcm9kdWN0aW9uLXJlbGF0ZWQgY29udGVudCwgc3VjaCBhcyBwcmludGluZyBpbnN0cnVjdGlvbnMsIGN1dCBtYXJrcywgb3JcbiAgICAgKiBjb2xvciBiYXJzLlxuICAgICAqXG4gICAgICogVGhlIFRyaW1Cb3gncyBkZWZhdWx0IHZhbHVlIGlzIHRoZSBwYWdlJ3MgQ3JvcEJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCBkZWZpbmluZyB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIFRyaW1Cb3ggYW5kIGl0c1xuICAgICAqICAgICAgICAgIHdpZHRoICYgaGVpZ2h0LlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFRyaW1Cb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHRyaW1Cb3ggPSB0aGlzLm5vZGUuVHJpbUJveCgpO1xuICAgICAgICByZXR1cm4gKF9hID0gdHJpbUJveCA9PT0gbnVsbCB8fCB0cmltQm94ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0cmltQm94LmFzUmVjdGFuZ2xlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuZ2V0Q3JvcEJveCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZWN0YW5nbGUgZGVmaW5pbmcgdGhpcyBwYWdlJ3MgQXJ0Qm94LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gcGFnZS5nZXRBcnRCb3goKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIEFydEJveCBvZiBhIHBhZ2UgZGVmaW5lcyB0aGUgZXh0ZW50IG9mIHRoZSBwYWdlJ3MgbWVhbmluZ2Z1bCBjb250ZW50XG4gICAgICogKGluY2x1ZGluZyBwb3RlbnRpYWwgd2hpdGUgc3BhY2UpLlxuICAgICAqXG4gICAgICogVGhlIEFydEJveCdzIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHBhZ2UncyBDcm9wQm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IGRlZmluaW5nIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgQXJ0Qm94IGFuZCBpdHNcbiAgICAgKiAgICAgICAgICB3aWR0aCAmIGhlaWdodC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRBcnRCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGFydEJveCA9IHRoaXMubm9kZS5BcnRCb3goKTtcbiAgICAgICAgcmV0dXJuIChfYSA9IGFydEJveCA9PT0gbnVsbCB8fCBhcnRCb3ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFydEJveC5hc1JlY3RhbmdsZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmdldENyb3BCb3goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRyYW5zbGF0ZSB0aGlzIHBhZ2UncyBjb250ZW50IHRvIGEgbmV3IGxvY2F0aW9uIG9uIHRoZSBwYWdlLiBUaGlzIG9wZXJhdGlvblxuICAgICAqIGlzIG9mdGVuIHVzZWZ1bCBhZnRlciByZXNpemluZyB0aGUgcGFnZSB3aXRoIFtbc2V0U2l6ZV1dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIEFkZCA1MCB1bml0cyBvZiB3aGl0ZXNwYWNlIHRvIHRoZSB0b3AgYW5kIHJpZ2h0IG9mIHRoZSBwYWdlXG4gICAgICogcGFnZS5zZXRTaXplKHBhZ2UuZ2V0V2lkdGgoKSArIDUwLCBwYWdlLmdldEhlaWdodCgpICsgNTApXG4gICAgICpcbiAgICAgKiAvLyBNb3ZlIHRoZSBwYWdlJ3MgY29udGVudCBmcm9tIHRoZSBsb3dlci1sZWZ0IGNvcm5lciBvZiB0aGUgcGFnZVxuICAgICAqIC8vIHRvIHRoZSB0b3AtcmlnaHQgY29ybmVyLlxuICAgICAqIHBhZ2UudHJhbnNsYXRlQ29udGVudCg1MCwgNTApXG4gICAgICpcbiAgICAgKiAvLyBOb3cgdGhlcmUgYXJlIDUwIHVuaXRzIG9mIHdoaXRlc3BhY2UgdG8gdGhlIGxlZnQgYW5kIGJvdHRvbSBvZiB0aGUgcGFnZVxuICAgICAqIGBgYFxuICAgICAqIFNlZSBhbHNvOiBbW3Jlc2V0UG9zaXRpb25dXVxuICAgICAqIEBwYXJhbSB4IFRoZSBuZXcgcG9zaXRpb24gb24gdGhlIHgtYXhpcyBmb3IgdGhpcyBwYWdlJ3MgY29udGVudC5cbiAgICAgKiBAcGFyYW0geSBUaGUgbmV3IHBvc2l0aW9uIG9uIHRoZSB5LWF4aXMgZm9yIHRoaXMgcGFnZSdzIGNvbnRlbnQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUudHJhbnNsYXRlQ29udGVudCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMubm9kZS5ub3JtYWxpemUoKTtcbiAgICAgICAgdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuY3JlYXRlQ29udGVudFN0cmVhbShwdXNoR3JhcGhpY3NTdGF0ZSgpLCB0cmFuc2xhdGUoeCwgeSkpO1xuICAgICAgICB2YXIgc3RhcnRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHN0YXJ0KTtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMuY3JlYXRlQ29udGVudFN0cmVhbShwb3BHcmFwaGljc1N0YXRlKCkpO1xuICAgICAgICB2YXIgZW5kUmVmID0gdGhpcy5kb2MuY29udGV4dC5yZWdpc3RlcihlbmQpO1xuICAgICAgICB0aGlzLm5vZGUud3JhcENvbnRlbnRTdHJlYW1zKHN0YXJ0UmVmLCBlbmRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2NhbGUgdGhlIHNpemUsIGNvbnRlbnQsIGFuZCBhbm5vdGF0aW9ucyBvZiBhIHBhZ2UuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2Uuc2NhbGUoMC41LCAwLjUpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHggVGhlIGZhY3RvciBieSB3aGljaCB0aGUgd2lkdGggZm9yIHRoZSBwYWdlIHNob3VsZCBiZSBzY2FsZWRcbiAgICAgKiAgICAgICAgICAoZS5nLiBgMC41YCBpcyA1MCUpLlxuICAgICAqIEBwYXJhbSB5IFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhlIGhlaWdodCBmb3IgdGhlIHBhZ2Ugc2hvdWxkIGJlIHNjYWxlZFxuICAgICAqICAgICAgICAgIChlLmcuIGAyLjBgIGlzIDIwMCUpLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgYXNzZXJ0SXMoeCwgJ3gnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMoeSwgJ3knLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5zZXRTaXplKHRoaXMuZ2V0V2lkdGgoKSAqIHgsIHRoaXMuZ2V0SGVpZ2h0KCkgKiB5KTtcbiAgICAgICAgdGhpcy5zY2FsZUNvbnRlbnQoeCwgeSk7XG4gICAgICAgIHRoaXMuc2NhbGVBbm5vdGF0aW9ucyh4LCB5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNjYWxlIHRoZSBjb250ZW50IG9mIGEgcGFnZS4gVGhpcyBpcyB1c2VmdWwgYWZ0ZXIgcmVzaXppbmcgYW4gZXhpc3RpbmdcbiAgICAgKiBwYWdlLiBUaGlzIHNjYWxlcyBvbmx5IHRoZSBjb250ZW50LCBub3QgdGhlIGFubm90YXRpb25zLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiAvLyBCaXNlY3QgdGhlIHNpemUgb2YgdGhlIHBhZ2VcbiAgICAgKiBwYWdlLnNldFNpemUocGFnZS5nZXRXaWR0aCgpIC8gMiwgcGFnZS5nZXRIZWlnaHQoKSAvIDIpO1xuICAgICAqXG4gICAgICogLy8gU2NhbGUgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2UgZG93biBieSA1MCUgaW4geCBhbmQgeVxuICAgICAqIHBhZ2Uuc2NhbGVDb250ZW50KDAuNSwgMC41KTtcbiAgICAgKiBgYGBcbiAgICAgKiBTZWUgYWxzbzogW1tzY2FsZUFubm90YXRpb25zXV1cbiAgICAgKiBAcGFyYW0geCBUaGUgZmFjdG9yIGJ5IHdoaWNoIHRoZSB4LWF4aXMgZm9yIHRoZSBjb250ZW50IHNob3VsZCBiZSBzY2FsZWRcbiAgICAgKiAgICAgICAgICAoZS5nLiBgMC41YCBpcyA1MCUpLlxuICAgICAqIEBwYXJhbSB5IFRoZSBmYWN0b3IgYnkgd2hpY2ggdGhlIHktYXhpcyBmb3IgdGhlIGNvbnRlbnQgc2hvdWxkIGJlIHNjYWxlZFxuICAgICAqICAgICAgICAgIChlLmcuIGAyLjBgIGlzIDIwMCUpLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNjYWxlQ29udGVudCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMubm9kZS5ub3JtYWxpemUoKTtcbiAgICAgICAgdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuY3JlYXRlQ29udGVudFN0cmVhbShwdXNoR3JhcGhpY3NTdGF0ZSgpLCBzY2FsZSh4LCB5KSk7XG4gICAgICAgIHZhciBzdGFydFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIoc3RhcnQpO1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5jcmVhdGVDb250ZW50U3RyZWFtKHBvcEdyYXBoaWNzU3RhdGUoKSk7XG4gICAgICAgIHZhciBlbmRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKGVuZCk7XG4gICAgICAgIHRoaXMubm9kZS53cmFwQ29udGVudFN0cmVhbXMoc3RhcnRSZWYsIGVuZFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTY2FsZSB0aGUgYW5ub3RhdGlvbnMgb2YgYSBwYWdlLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzY2FsZSBhXG4gICAgICogcGFnZSB3aXRoIGNvbW1lbnRzIG9yIG90aGVyIGFubm90YXRpb25zLlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gU2NhbGUgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2UgZG93biBieSA1MCUgaW4geCBhbmQgeVxuICAgICAqIHBhZ2Uuc2NhbGVDb250ZW50KDAuNSwgMC41KTtcbiAgICAgKlxuICAgICAqIC8vIFNjYWxlIHRoZSBjb250ZW50IG9mIHRoZSBwYWdlIGRvd24gYnkgNTAlIGluIHggYW5kIHlcbiAgICAgKiBwYWdlLnNjYWxlQW5ub3RhdGlvbnMoMC41LCAwLjUpO1xuICAgICAqIGBgYFxuICAgICAqIFNlZSBhbHNvOiBbW3NjYWxlQ29udGVudF1dXG4gICAgICogQHBhcmFtIHggVGhlIGZhY3RvciBieSB3aGljaCB0aGUgeC1heGlzIGZvciB0aGUgYW5ub3RhdGlvbnMgc2hvdWxkIGJlXG4gICAgICogICAgICAgICAgc2NhbGVkIChlLmcuIGAwLjVgIGlzIDUwJSkuXG4gICAgICogQHBhcmFtIHkgVGhlIGZhY3RvciBieSB3aGljaCB0aGUgeS1heGlzIGZvciB0aGUgYW5ub3RhdGlvbnMgc2hvdWxkIGJlXG4gICAgICogICAgICAgICAgc2NhbGVkIChlLmcuIGAyLjBgIGlzIDIwMCUpLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNjYWxlQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICBhc3NlcnRJcyh4LCAneCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyh5LCAneScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB2YXIgYW5ub3RzID0gdGhpcy5ub2RlLkFubm90cygpO1xuICAgICAgICBpZiAoIWFubm90cylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgYW5ub3RzLnNpemUoKTsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBhbm5vdCA9IGFubm90cy5sb29rdXAoaWR4KTtcbiAgICAgICAgICAgIGlmIChhbm5vdCBpbnN0YW5jZW9mIFBERkRpY3QpXG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsZUFubm90KGFubm90LCB4LCB5KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzZXQgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgdGhpcyBwYWdlIHRvIGAoMCwgMClgLiBUaGlzIG9wZXJhdGlvbiBpc1xuICAgICAqIG9mdGVuIHVzZWZ1bCBhZnRlciBjYWxsaW5nIFtbdHJhbnNsYXRlQ29udGVudF1dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIFNoaWZ0IHRoZSBwYWdlJ3MgY29udGVudHMgdXAgYW5kIHRvIHRoZSByaWdodCBieSA1MCB1bml0c1xuICAgICAqIHBhZ2UudHJhbnNsYXRlQ29udGVudCg1MCwgNTApXG4gICAgICpcbiAgICAgKiAvLyBUaGlzIHRleHQgd2lsbCBzaGlmdGVkIC0gaXQgd2lsbCBiZSBkcmF3biBhdCAoNTAsIDUwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgYW0gc2hpZnRlZCcpXG4gICAgICpcbiAgICAgKiAvLyBNb3ZlIGJhY2sgdG8gKDAsIDApXG4gICAgICogcGFnZS5yZXNldFBvc2l0aW9uKClcbiAgICAgKlxuICAgICAqIC8vIFRoaXMgdGV4dCB3aWxsIG5vdCBiZSBzaGlmdGVkIC0gaXQgd2lsbCBiZSBkcmF3biBhdCAoMCwgMClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIGFtIG5vdCBzaGlmdGVkJylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5yZXNldFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmdldENvbnRlbnRTdHJlYW0oZmFsc2UpO1xuICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICB0aGlzLnkgPSAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIGEgZGVmYXVsdCBmb250IGZvciB0aGlzIHBhZ2UuIFRoZSBkZWZhdWx0IGZvbnQgd2lsbCBiZSB1c2VkIHdoZW5ldmVyXG4gICAgICogdGV4dCBpcyBkcmF3biBvbiB0aGlzIHBhZ2UgYW5kIG5vIGZvbnQgaXMgc3BlY2lmaWVkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFN0YW5kYXJkRm9udHMgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgdGltZXNSb21hbkZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuVGltZXNSb21hbilcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2FGb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBjb3VyaWVyRm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5Db3VyaWVyKVxuICAgICAqXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Rm9udChoZWx2ZXRpY2FGb250KVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBpbiBIZWx2ZXRpY2EnKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRGb250KHRpbWVzUm9tYW5Gb250KVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBpbiBDb3VyaWVyJywgeyBmb250OiBjb3VyaWVyRm9udCB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBkZWZhdWx0IGZvbnQgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGV4dCBvbiB0aGlzIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0Rm9udCA9IGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgIC8vIFRPRE86IFJldXNlIGltYWdlIEZvbnQgbmFtZSBpZiB3ZSd2ZSBhbHJlYWR5IGFkZGVkIHRoaXMgaW1hZ2UgdG8gUmVzb3VyY2VzLkZvbnRzXG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIHRoaXMuZm9udCA9IGZvbnQ7XG4gICAgICAgIHRoaXMuZm9udEtleSA9IHRoaXMubm9kZS5uZXdGb250RGljdGlvbmFyeSh0aGlzLmZvbnQubmFtZSwgdGhpcy5mb250LnJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgYSBkZWZhdWx0IGZvbnQgc2l6ZSBmb3IgdGhpcyBwYWdlLiBUaGUgZGVmYXVsdCBmb250IHNpemUgd2lsbCBiZVxuICAgICAqIHVzZWQgd2hlbmV2ZXIgdGV4dCBpcyBkcmF3biBvbiB0aGlzIHBhZ2UgYW5kIG5vIGZvbnQgc2l6ZSBpcyBzcGVjaWZpZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLnNldEZvbnRTaXplKDEyKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBpbiBzaXplIDEyJylcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0Rm9udFNpemUoMzYpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGluIHNpemUgMjQnLCB7IGZvbnRTaXplOiAyNCB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250U2l6ZSBUaGUgZGVmYXVsdCBmb250IHNpemUgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGV4dCBvbiB0aGlzXG4gICAgICogICAgICAgICAgICAgICAgIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0Rm9udFNpemUgPSBmdW5jdGlvbiAoZm9udFNpemUpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udFNpemUsICdmb250U2l6ZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gZm9udFNpemU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgYSBkZWZhdWx0IGZvbnQgY29sb3IgZm9yIHRoaXMgcGFnZS4gVGhlIGRlZmF1bHQgZm9udCBjb2xvciB3aWxsIGJlXG4gICAgICogdXNlZCB3aGVuZXZlciB0ZXh0IGlzIGRyYXduIG9uIHRoaXMgcGFnZSBhbmQgbm8gZm9udCBjb2xvciBpcyBzcGVjaWZpZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyByZ2IsIGNteWssIGdyYXlzY2FsZSB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBwYWdlLnNldEZvbnRDb2xvcihyZ2IoMC45NywgMC4wMiwgMC45NykpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGluIHBpbmsnKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRGb250Q29sb3IoY215aygwLjQsIDAuNywgMC4zOSwgMC4xNSkpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGluIGdyYXknLCB7IGNvbG9yOiBncmF5c2NhbGUoMC41KSB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250Q29sb3IgVGhlIGRlZmF1bHQgZm9udCBjb2xvciB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0ZXh0IG9uXG4gICAgICogICAgICAgICAgICAgICAgICB0aGlzIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0Rm9udENvbG9yID0gZnVuY3Rpb24gKGZvbnRDb2xvcikge1xuICAgICAgICBhc3NlcnRJcyhmb250Q29sb3IsICdmb250Q29sb3InLCBbW09iamVjdCwgJ0NvbG9yJ11dKTtcbiAgICAgICAgdGhpcy5mb250Q29sb3IgPSBmb250Q29sb3I7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgYSBkZWZhdWx0IGxpbmUgaGVpZ2h0IGZvciB0aGlzIHBhZ2UuIFRoZSBkZWZhdWx0IGxpbmUgaGVpZ2h0IHdpbGwgYmVcbiAgICAgKiB1c2VkIHdoZW5ldmVyIHRleHQgaXMgZHJhd24gb24gdGhpcyBwYWdlIGFuZCBubyBsaW5lIGhlaWdodCBpcyBzcGVjaWZpZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBwYWdlLnNldExpbmVIZWlnaHQoMTIpO1xuICAgICAqIHBhZ2UuZHJhd1RleHQoJ1RoZXNlIGxpbmVzIHdpbGwgYmUgdmVydGljYWxseSBcXG4gc2VwYXJhdGVkIGJ5IDEyIHVuaXRzJylcbiAgICAgKlxuICAgICAqIHBhZ2Uuc2V0TGluZUhlaWdodCgzNik7XG4gICAgICogcGFnZS5kcmF3VGV4dCgnVGhlc2UgbGluZXMgd2lsbCBiZSB2ZXJ0aWNhbGx5IFxcbiBzZXBhcmF0ZWQgYnkgMjQgdW5pdHMnLCB7XG4gICAgICogICBsaW5lSGVpZ2h0OiAyNFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGxpbmVIZWlnaHQgVGhlIGRlZmF1bHQgbGluZSBoZWlnaHQgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGV4dCBvblxuICAgICAqICAgICAgICAgICAgICAgICAgIHRoaXMgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5zZXRMaW5lSGVpZ2h0ID0gZnVuY3Rpb24gKGxpbmVIZWlnaHQpIHtcbiAgICAgICAgYXNzZXJ0SXMobGluZUhlaWdodCwgJ2xpbmVIZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5saW5lSGVpZ2h0ID0gbGluZUhlaWdodDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGVmYXVsdCBwb3NpdGlvbiBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeyB4LCB5IH0gPSBwYWdlLmdldFBvc2l0aW9uKClcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBwb3NpdGlvbiBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHsgeDogdGhpcy54LCB5OiB0aGlzLnkgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGVmYXVsdCB4IGNvb3JkaW5hdGUgb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHggPSBwYWdlLmdldFgoKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IHggY29vcmRpbmF0ZSBvZiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy54O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHkgY29vcmRpbmF0ZSBvZiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgeSA9IHBhZ2UuZ2V0WSgpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIGRlZmF1bHQgeSBjb29yZGluYXRlIG9mIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2UubW92ZVRvKDAsIDApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0IHRoZSBvcmlnaW4nKVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlVG8oMCwgMjUpXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIDI1IHVuaXRzIHVwJylcbiAgICAgKlxuICAgICAqIHBhZ2UubW92ZVRvKDI1LCAyNSlcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gMjUgdW5pdHMgdXAgYW5kIDI1IHVuaXRzIHRvIHRoZSByaWdodCcpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHggVGhlIG5ldyBkZWZhdWx0IHBvc2l0aW9uIG9uIHRoZSB4LWF4aXMgZm9yIHRoaXMgcGFnZS5cbiAgICAgKiBAcGFyYW0geSBUaGUgbmV3IGRlZmF1bHQgcG9zaXRpb24gb24gdGhlIHktYXhpcyBmb3IgdGhpcyBwYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLm1vdmVUbyA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGFzc2VydElzKHgsICd4JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydElzKHksICd5JywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhpcyBwYWdlIHRvIGJlIGZ1cnRoZXIgZG93biB0aGUgeS1heGlzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5tb3ZlVG8oNTAsIDUwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNTAsIDUwKScpXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVEb3duKDEwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNTAsIDQwKScpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHlEZWNyZWFzZSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBwYWdlJ3MgZGVmYXVsdCBwb3NpdGlvbiBhbG9uZyB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgIHktYXhpcyBzaG91bGQgYmUgZGVjcmVhc2VkLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLm1vdmVEb3duID0gZnVuY3Rpb24gKHlEZWNyZWFzZSkge1xuICAgICAgICBhc3NlcnRJcyh5RGVjcmVhc2UsICd5RGVjcmVhc2UnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy55IC09IHlEZWNyZWFzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgZGVmYXVsdCBwb3NpdGlvbiBvZiB0aGlzIHBhZ2UgdG8gYmUgZnVydGhlciB1cCB0aGUgeS1heGlzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogcGFnZS5tb3ZlVG8oNTAsIDUwKVxuICAgICAqIHBhZ2UuZHJhd1RleHQoJ0kgd2lsbCBiZSBkcmF3biBhdCAoNTAsIDUwKScpXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVVcCgxMClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDUwLCA2MCknKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB5SW5jcmVhc2UgVGhlIGFtb3VudCBieSB3aGljaCB0aGUgcGFnZSdzIGRlZmF1bHQgcG9zaXRpb24gYWxvbmcgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICB5LWF4aXMgc2hvdWxkIGJlIGluY3JlYXNlZC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5tb3ZlVXAgPSBmdW5jdGlvbiAoeUluY3JlYXNlKSB7XG4gICAgICAgIGFzc2VydElzKHlJbmNyZWFzZSwgJ3lJbmNyZWFzZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICB0aGlzLnkgKz0geUluY3JlYXNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBkZWZhdWx0IHBvc2l0aW9uIG9mIHRoaXMgcGFnZSB0byBiZSBmdXJ0aGVyIGxlZnQgb24gdGhlIHgtYXhpcy5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2UubW92ZVRvKDUwLCA1MClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDUwLCA1MCknKVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlTGVmdCgxMClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDQwLCA1MCknKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB4RGVjcmVhc2UgVGhlIGFtb3VudCBieSB3aGljaCB0aGUgcGFnZSdzIGRlZmF1bHQgcG9zaXRpb24gYWxvbmcgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICB4LWF4aXMgc2hvdWxkIGJlIGRlY3JlYXNlZC5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5tb3ZlTGVmdCA9IGZ1bmN0aW9uICh4RGVjcmVhc2UpIHtcbiAgICAgICAgYXNzZXJ0SXMoeERlY3JlYXNlLCAneERlY3JlYXNlJywgWydudW1iZXInXSk7XG4gICAgICAgIHRoaXMueCAtPSB4RGVjcmVhc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGRlZmF1bHQgcG9zaXRpb24gb2YgdGhpcyBwYWdlIHRvIGJlIGZ1cnRoZXIgcmlnaHQgb24gdGhlIHktYXhpcy5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIHBhZ2UubW92ZVRvKDUwLCA1MClcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdJIHdpbGwgYmUgZHJhd24gYXQgKDUwLCA1MCknKVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlUmlnaHQoMTApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnSSB3aWxsIGJlIGRyYXduIGF0ICg2MCwgNTApJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0geEluY3JlYXNlIFRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIHBhZ2UncyBkZWZhdWx0IHBvc2l0aW9uIGFsb25nIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgeC1heGlzIHNob3VsZCBiZSBpbmNyZWFzZWQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUubW92ZVJpZ2h0ID0gZnVuY3Rpb24gKHhJbmNyZWFzZSkge1xuICAgICAgICBhc3NlcnRJcyh4SW5jcmVhc2UsICd4SW5jcmVhc2UnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy54ICs9IHhJbmNyZWFzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFB1c2ggb25lIG9yIG1vcmUgb3BlcmF0b3JzIHRvIHRoZSBlbmQgb2YgdGhpcyBwYWdlJ3MgY3VycmVudCBjb250ZW50XG4gICAgICogc3RyZWFtLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7XG4gICAgICogICBwdXNoR3JhcGhpY3NTdGF0ZSxcbiAgICAgKiAgIG1vdmVUbyxcbiAgICAgKiAgIGxpbmVUbyxcbiAgICAgKiAgIGNsb3NlUGF0aCxcbiAgICAgKiAgIHNldEZpbGxpbmdDb2xvcixcbiAgICAgKiAgIHJnYixcbiAgICAgKiAgIGZpbGwsXG4gICAgICogICBwb3BHcmFwaGljc1N0YXRlLFxuICAgICAqIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIC8vIERyYXcgYSBncmVlbiB0cmlhbmdsZSBpbiB0aGUgbG93ZXItbGVmdCBjb3JuZXIgb2YgdGhlIHBhZ2VcbiAgICAgKiBwYWdlLnB1c2hPcGVyYXRvcnMoXG4gICAgICogICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAqICAgbW92ZVRvKDAsIDApLFxuICAgICAqICAgbGluZVRvKDEwMCwgMCksXG4gICAgICogICBsaW5lVG8oNTAsIDEwMCksXG4gICAgICogICBjbG9zZVBhdGgoKSxcbiAgICAgKiAgIHNldEZpbGxpbmdDb2xvcihyZ2IoMC4wLCAxLjAsIDAuMCkpLFxuICAgICAqICAgZmlsbCgpLFxuICAgICAqICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb3BlcmF0b3IgVGhlIG9wZXJhdG9ycyB0byBiZSBwdXNoZWQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUucHVzaE9wZXJhdG9ycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9wZXJhdG9yID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBvcGVyYXRvcltfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydEVhY2hJcyhvcGVyYXRvciwgJ29wZXJhdG9yJywgW1tQREZPcGVyYXRvciwgJ1BERk9wZXJhdG9yJ11dKTtcbiAgICAgICAgdmFyIGNvbnRlbnRTdHJlYW0gPSB0aGlzLmdldENvbnRlbnRTdHJlYW0oKTtcbiAgICAgICAgY29udGVudFN0cmVhbS5wdXNoLmFwcGx5KGNvbnRlbnRTdHJlYW0sIG9wZXJhdG9yKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgb25lIG9yIG1vcmUgbGluZXMgb2YgdGV4dCBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgU3RhbmRhcmRGb250cywgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IGhlbHZldGljYUZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHRpbWVzUm9tYW5Gb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLlRpbWVzUm9tYW4pXG4gICAgICpcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogcGFnZS5zZXRGb250KGhlbHZldGljYUZvbnQpXG4gICAgICpcbiAgICAgKiBwYWdlLm1vdmVUbyg1LCAyMDApXG4gICAgICogcGFnZS5kcmF3VGV4dCgnVGhlIExpZmUgb2YgYW4gRWdnJywgeyBzaXplOiAzNiB9KVxuICAgICAqXG4gICAgICogcGFnZS5tb3ZlRG93bigzNilcbiAgICAgKiBwYWdlLmRyYXdUZXh0KCdBbiBFcGljIFRhbGUgb2YgV29lJywgeyBzaXplOiAzMCB9KVxuICAgICAqXG4gICAgICogcGFnZS5kcmF3VGV4dChcbiAgICAgKiAgIGBIdW1wdHkgRHVtcHR5IHNhdCBvbiBhIHdhbGwgXFxuYCArXG4gICAgICogICBgSHVtcHR5IER1bXB0eSBoYWQgYSBncmVhdCBmYWxsOyBcXG5gICtcbiAgICAgKiAgIGBBbGwgdGhlIGtpbmcncyBob3JzZXMgYW5kIGFsbCB0aGUga2luZydzIG1lbiBcXG5gICtcbiAgICAgKiAgIGBDb3VsZG4ndCBwdXQgSHVtcHR5IHRvZ2V0aGVyIGFnYWluLiBcXG5gLFxuICAgICAqICAge1xuICAgICAqICAgICB4OiAyNSxcbiAgICAgKiAgICAgeTogMTAwLFxuICAgICAqICAgICBmb250OiB0aW1lc1JvbWFuRm9udCxcbiAgICAgKiAgICAgc2l6ZTogMjQsXG4gICAgICogICAgIGNvbG9yOiByZ2IoMSwgMCwgMCksXG4gICAgICogICAgIGxpbmVIZWlnaHQ6IDI0LFxuICAgICAqICAgICBvcGFjaXR5OiAwLjc1LFxuICAgICAqICAgfSxcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgZHJhd24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIHRleHQuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd1RleHQgPSBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIGFzc2VydElzKHRleHQsICd0ZXh0JywgWydzdHJpbmcnXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuY29sb3IsICdvcHRpb25zLmNvbG9yJywgW1tPYmplY3QsICdDb2xvciddXSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5vcGFjaXR5LCAnb3BhY2l0eS5vcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuZm9udCwgJ29wdGlvbnMuZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnNpemUsICdvcHRpb25zLnNpemUnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5yb3RhdGUsICdvcHRpb25zLnJvdGF0ZScsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnhTa2V3LCAnb3B0aW9ucy54U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnlTa2V3LCAnb3B0aW9ucy55U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLngsICdvcHRpb25zLngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55LCAnb3B0aW9ucy55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMubGluZUhlaWdodCwgJ29wdGlvbnMubGluZUhlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLm1heFdpZHRoLCAnb3B0aW9ucy5tYXhXaWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLndvcmRCcmVha3MsICdvcHRpb25zLndvcmRCcmVha3MnLCBbQXJyYXldKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYmxlbmRNb2RlLCAnb3B0aW9ucy5ibGVuZE1vZGUnLCBCbGVuZE1vZGUpO1xuICAgICAgICB2YXIgX2ggPSB0aGlzLnNldE9yRW1iZWRGb250KG9wdGlvbnMuZm9udCksIG9sZEZvbnQgPSBfaC5vbGRGb250LCBuZXdGb250ID0gX2gubmV3Rm9udCwgbmV3Rm9udEtleSA9IF9oLm5ld0ZvbnRLZXk7XG4gICAgICAgIHZhciBmb250U2l6ZSA9IG9wdGlvbnMuc2l6ZSB8fCB0aGlzLmZvbnRTaXplO1xuICAgICAgICB2YXIgd29yZEJyZWFrcyA9IG9wdGlvbnMud29yZEJyZWFrcyB8fCB0aGlzLmRvYy5kZWZhdWx0V29yZEJyZWFrcztcbiAgICAgICAgdmFyIHRleHRXaWR0aCA9IGZ1bmN0aW9uICh0KSB7IHJldHVybiBuZXdGb250LndpZHRoT2ZUZXh0QXRTaXplKHQsIGZvbnRTaXplKTsgfTtcbiAgICAgICAgdmFyIGxpbmVzID0gb3B0aW9ucy5tYXhXaWR0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGxpbmVTcGxpdChjbGVhblRleHQodGV4dCkpXG4gICAgICAgICAgICA6IGJyZWFrVGV4dEludG9MaW5lcyh0ZXh0LCB3b3JkQnJlYWtzLCBvcHRpb25zLm1heFdpZHRoLCB0ZXh0V2lkdGgpO1xuICAgICAgICB2YXIgZW5jb2RlZExpbmVzID0gbmV3IEFycmF5KGxpbmVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgZW5jb2RlZExpbmVzW2lkeF0gPSBuZXdGb250LmVuY29kZVRleHQobGluZXNbaWR4XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGVLZXkgPSB0aGlzLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgIGJsZW5kTW9kZTogb3B0aW9ucy5ibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd0xpbmVzT2ZUZXh0KGVuY29kZWRMaW5lcywge1xuICAgICAgICAgICAgY29sb3I6IChfYSA9IG9wdGlvbnMuY29sb3IpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuZm9udENvbG9yLFxuICAgICAgICAgICAgZm9udDogbmV3Rm9udEtleSxcbiAgICAgICAgICAgIHNpemU6IGZvbnRTaXplLFxuICAgICAgICAgICAgcm90YXRlOiAoX2IgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHhTa2V3OiAoX2MgPSBvcHRpb25zLnhTa2V3KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeVNrZXc6IChfZCA9IG9wdGlvbnMueVNrZXcpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB4OiAoX2UgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHRoaXMueCxcbiAgICAgICAgICAgIHk6IChfZiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogdGhpcy55LFxuICAgICAgICAgICAgbGluZUhlaWdodDogKF9nID0gb3B0aW9ucy5saW5lSGVpZ2h0KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB0aGlzLmxpbmVIZWlnaHQsXG4gICAgICAgICAgICBncmFwaGljc1N0YXRlOiBncmFwaGljc1N0YXRlS2V5LFxuICAgICAgICB9KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmZvbnQpIHtcbiAgICAgICAgICAgIGlmIChvbGRGb250KVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udChvbGRGb250KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Rm9udCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGFuIGltYWdlIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IGpwZ1VybCA9ICdodHRwczovL3BkZi1saWIuanMub3JnL2Fzc2V0cy9jYXRfcmlkaW5nX3VuaWNvcm4uanBnJ1xuICAgICAqIGNvbnN0IGpwZ0ltYWdlQnl0ZXMgPSBhd2FpdCBmZXRjaChqcGdVcmwpLnRoZW4oKHJlcykgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICpcbiAgICAgKiBjb25zdCBqcGdJbWFnZSA9IGF3YWl0IHBkZkRvYy5lbWJlZEpwZyhqcGdJbWFnZUJ5dGVzKVxuICAgICAqIGNvbnN0IGpwZ0RpbXMgPSBqcGdJbWFnZS5zY2FsZSgwLjUpXG4gICAgICpcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogcGFnZS5kcmF3SW1hZ2UoanBnSW1hZ2UsIHtcbiAgICAgKiAgIHg6IDI1LFxuICAgICAqICAgeTogMjUsXG4gICAgICogICB3aWR0aDoganBnRGltcy53aWR0aCxcbiAgICAgKiAgIGhlaWdodDoganBnRGltcy5oZWlnaHQsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoMzApLFxuICAgICAqICAgb3BhY2l0eTogMC43NSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgdG8gYmUgZHJhd24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIGltYWdlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdJbWFnZSA9IGZ1bmN0aW9uIChpbWFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIC8vIFRPRE86IFJldXNlIGltYWdlIFhPYmplY3QgbmFtZSBpZiB3ZSd2ZSBhbHJlYWR5IGFkZGVkIHRoaXMgaW1hZ2UgdG8gUmVzb3VyY2VzLlhPYmplY3RzXG4gICAgICAgIGFzc2VydElzKGltYWdlLCAnaW1hZ2UnLCBbW1BERkltYWdlLCAnUERGSW1hZ2UnXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLngsICdvcHRpb25zLngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55LCAnb3B0aW9ucy55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMud2lkdGgsICdvcHRpb25zLndpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuaGVpZ2h0LCAnb3B0aW9ucy5oZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5yb3RhdGUsICdvcHRpb25zLnJvdGF0ZScsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnhTa2V3LCAnb3B0aW9ucy54U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnlTa2V3LCAnb3B0aW9ucy55U2tldycsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMub3BhY2l0eSwgJ29wYWNpdHkub3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ibGVuZE1vZGUsICdvcHRpb25zLmJsZW5kTW9kZScsIEJsZW5kTW9kZSk7XG4gICAgICAgIHZhciB4T2JqZWN0S2V5ID0gdGhpcy5ub2RlLm5ld1hPYmplY3QoJ0ltYWdlJywgaW1hZ2UucmVmKTtcbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGVLZXkgPSB0aGlzLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgIGJsZW5kTW9kZTogb3B0aW9ucy5ibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpO1xuICAgICAgICBjb250ZW50U3RyZWFtLnB1c2guYXBwbHkoY29udGVudFN0cmVhbSwgZHJhd0ltYWdlKHhPYmplY3RLZXksIHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy54LFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0aGlzLnksXG4gICAgICAgICAgICB3aWR0aDogKF9jID0gb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogaW1hZ2Uuc2l6ZSgpLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogaW1hZ2Uuc2l6ZSgpLmhlaWdodCxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9lID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB4U2tldzogKF9mID0gb3B0aW9ucy54U2tldykgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHlTa2V3OiAoX2cgPSBvcHRpb25zLnlTa2V3KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgZ3JhcGhpY3NTdGF0ZTogZ3JhcGhpY3NTdGF0ZUtleSxcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBhbiBlbWJlZGRlZCBQREYgcGFnZSBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBjb25zdCBwZGZEb2MgPSBhd2FpdCBQREZEb2N1bWVudC5jcmVhdGUoKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBzb3VyY2VQZGZVcmwgPSAnaHR0cHM6Ly9wZGYtbGliLmpzLm9yZy9hc3NldHMvd2l0aF9sYXJnZV9wYWdlX2NvdW50LnBkZidcbiAgICAgKiBjb25zdCBzb3VyY2VQZGYgPSBhd2FpdCBmZXRjaChzb3VyY2VQZGZVcmwpLnRoZW4oKHJlcykgPT4gcmVzLmFycmF5QnVmZmVyKCkpXG4gICAgICpcbiAgICAgKiAvLyBFbWJlZCBwYWdlIDc0IGZyb20gdGhlIFBERlxuICAgICAqIGNvbnN0IFtlbWJlZGRlZFBhZ2VdID0gYXdhaXQgcGRmRG9jLmVtYmVkUGRmKHNvdXJjZVBkZiwgNzMpXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdQYWdlKGVtYmVkZGVkUGFnZSwge1xuICAgICAqICAgeDogMjUwLFxuICAgICAqICAgeTogMjAwLFxuICAgICAqICAgeFNjYWxlOiAwLjUsXG4gICAgICogICB5U2NhbGU6IDAuNSxcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcygzMCksXG4gICAgICogICBvcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgYG9wdGlvbnNgIGFyZ3VtZW50IGFjY2VwdHMgYm90aCBgd2lkdGhgL2BoZWlnaHRgIGFuZCBgeFNjYWxlYC9geVNjYWxlYFxuICAgICAqIGFzIG9wdGlvbnMuIFNpbmNlIGVhY2ggb2YgdGhlc2Ugb3B0aW9ucyBkZWZpbmVzIHRoZSBzaXplIG9mIHRoZSBkcmF3biBwYWdlLFxuICAgICAqIGlmIGJvdGggb3B0aW9ucyBhcmUgZ2l2ZW4sIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHRha2UgcHJlY2VkZW5jZSBhbmQgdGhlXG4gICAgICogY29ycmVzcG9uZGluZyBzY2FsZSB2YXJpYW50cyBhcmUgaWdub3JlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbWJlZGRlZFBhZ2UgVGhlIGVtYmVkZGVkIHBhZ2UgdG8gYmUgZHJhd24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIGVtYmVkZGVkIHBhZ2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd1BhZ2UgPSBmdW5jdGlvbiAoZW1iZWRkZWRQYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIC8vIFRPRE86IFJldXNlIGVtYmVkZGVkUGFnZSBYT2JqZWN0IG5hbWUgaWYgd2UndmUgYWxyZWFkeSBhZGRlZCB0aGlzIGVtYmVkZGVkUGFnZSB0byBSZXNvdXJjZXMuWE9iamVjdHNcbiAgICAgICAgYXNzZXJ0SXMoZW1iZWRkZWRQYWdlLCAnZW1iZWRkZWRQYWdlJywgW1xuICAgICAgICAgICAgW1BERkVtYmVkZGVkUGFnZSwgJ1BERkVtYmVkZGVkUGFnZSddLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueSwgJ29wdGlvbnMueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnhTY2FsZSwgJ29wdGlvbnMueFNjYWxlJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueVNjYWxlLCAnb3B0aW9ucy55U2NhbGUnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy53aWR0aCwgJ29wdGlvbnMud2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5oZWlnaHQsICdvcHRpb25zLmhlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnJvdGF0ZSwgJ29wdGlvbnMucm90YXRlJywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueFNrZXcsICdvcHRpb25zLnhTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueVNrZXcsICdvcHRpb25zLnlTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5vcGFjaXR5LCAnb3BhY2l0eS5vcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIHhPYmplY3RLZXkgPSB0aGlzLm5vZGUubmV3WE9iamVjdCgnRW1iZWRkZWRQZGZQYWdlJywgZW1iZWRkZWRQYWdlLnJlZik7XG4gICAgICAgIHZhciBncmFwaGljc1N0YXRlS2V5ID0gdGhpcy5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiBvcHRpb25zLm9wYWNpdHksXG4gICAgICAgICAgICBibGVuZE1vZGU6IG9wdGlvbnMuYmxlbmRNb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHZhciB4U2NhbGUgPSAob3B0aW9ucy53aWR0aCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy53aWR0aCAvIGVtYmVkZGVkUGFnZS53aWR0aFxuICAgICAgICAgICAgOiBvcHRpb25zLnhTY2FsZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy54U2NhbGVcbiAgICAgICAgICAgICAgICA6IDEpO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdmFyIHlTY2FsZSA9IChvcHRpb25zLmhlaWdodCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5oZWlnaHQgLyBlbWJlZGRlZFBhZ2UuaGVpZ2h0XG4gICAgICAgICAgICA6IG9wdGlvbnMueVNjYWxlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnlTY2FsZVxuICAgICAgICAgICAgICAgIDogMSk7XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIGNvbnRlbnRTdHJlYW0ucHVzaC5hcHBseShjb250ZW50U3RyZWFtLCBkcmF3UGFnZSh4T2JqZWN0S2V5LCB7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMueCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdGhpcy55LFxuICAgICAgICAgICAgeFNjYWxlOiB4U2NhbGUsXG4gICAgICAgICAgICB5U2NhbGU6IHlTY2FsZSxcbiAgICAgICAgICAgIHJvdGF0ZTogKF9jID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB4U2tldzogKF9kID0gb3B0aW9ucy54U2tldykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHlTa2V3OiAoX2UgPSBvcHRpb25zLnlTa2V3KSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgZ3JhcGhpY3NTdGF0ZTogZ3JhcGhpY3NTdGF0ZUtleSxcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBhbiBTVkcgcGF0aCBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgcmdiIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHN2Z1BhdGggPSAnTSAwLDIwIEwgMTAwLDE2MCBRIDEzMCwyMDAgMTUwLDEyMCBDIDE5MCwtNDAgMjAwLDIwMCAzMDAsMTUwIEwgNDAwLDkwJ1xuICAgICAqXG4gICAgICogLy8gRHJhdyBwYXRoIGFzIGJsYWNrIGxpbmVcbiAgICAgKiBwYWdlLmRyYXdTdmdQYXRoKHN2Z1BhdGgsIHsgeDogMjUsIHk6IDc1IH0pXG4gICAgICpcbiAgICAgKiAvLyBDaGFuZ2UgYm9yZGVyIHN0eWxlIGFuZCBvcGFjaXR5XG4gICAgICogcGFnZS5kcmF3U3ZnUGF0aChzdmdQYXRoLCB7XG4gICAgICogICB4OiAyNSxcbiAgICAgKiAgIHk6IDI3NSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiByZ2IoMC41LCAwLjUsIDAuNSksXG4gICAgICogICBib3JkZXJXaWR0aDogMixcbiAgICAgKiAgIGJvcmRlck9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKlxuICAgICAqIC8vIFNldCBmaWxsIGNvbG9yIGFuZCBvcGFjaXR5XG4gICAgICogcGFnZS5kcmF3U3ZnUGF0aChzdmdQYXRoLCB7XG4gICAgICogICB4OiAyNSxcbiAgICAgKiAgIHk6IDQ3NSxcbiAgICAgKiAgIGNvbG9yOiByZ2IoMS4wLCAwLCAwKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKlxuICAgICAqIC8vIERyYXcgNTAlIG9mIG9yaWdpbmFsIHNpemVcbiAgICAgKiBwYWdlLmRyYXdTdmdQYXRoKHN2Z1BhdGgsIHtcbiAgICAgKiAgIHg6IDI1LFxuICAgICAqICAgeTogNjc1LFxuICAgICAqICAgc2NhbGU6IDAuNSxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBwYXRoIFRoZSBTVkcgcGF0aCB0byBiZSBkcmF3bi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgU1ZHIHBhdGguXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd1N2Z1BhdGggPSBmdW5jdGlvbiAocGF0aCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfajtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgYXNzZXJ0SXMocGF0aCwgJ3BhdGgnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy54LCAnb3B0aW9ucy54JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueSwgJ29wdGlvbnMueScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnNjYWxlLCAnb3B0aW9ucy5zY2FsZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnJvdGF0ZSwgJ29wdGlvbnMucm90YXRlJywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyV2lkdGgsICdvcHRpb25zLmJvcmRlcldpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuY29sb3IsICdvcHRpb25zLmNvbG9yJywgW1tPYmplY3QsICdDb2xvciddXSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5vcGFjaXR5LCAnb3BhY2l0eS5vcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyQ29sb3IsICdvcHRpb25zLmJvcmRlckNvbG9yJywgW1xuICAgICAgICAgICAgW09iamVjdCwgJ0NvbG9yJ10sXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckRhc2hBcnJheSwgJ29wdGlvbnMuYm9yZGVyRGFzaEFycmF5JywgW1xuICAgICAgICAgICAgQXJyYXksXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckRhc2hQaGFzZSwgJ29wdGlvbnMuYm9yZGVyRGFzaFBoYXNlJywgW1xuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJMaW5lQ2FwLCAnb3B0aW9ucy5ib3JkZXJMaW5lQ2FwJywgTGluZUNhcFN0eWxlKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlck9wYWNpdHksICdvcHRpb25zLmJvcmRlck9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYmxlbmRNb2RlLCAnb3B0aW9ucy5ibGVuZE1vZGUnLCBCbGVuZE1vZGUpO1xuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZUtleSA9IHRoaXMubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogb3B0aW9ucy5vcGFjaXR5LFxuICAgICAgICAgICAgYm9yZGVyT3BhY2l0eTogb3B0aW9ucy5ib3JkZXJPcGFjaXR5LFxuICAgICAgICAgICAgYmxlbmRNb2RlOiBvcHRpb25zLmJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghKCdjb2xvcicgaW4gb3B0aW9ucykgJiYgISgnYm9yZGVyQ29sb3InIGluIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIGNvbnRlbnRTdHJlYW0ucHVzaC5hcHBseShjb250ZW50U3RyZWFtLCBkcmF3U3ZnUGF0aChwYXRoLCB7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMueCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdGhpcy55LFxuICAgICAgICAgICAgc2NhbGU6IG9wdGlvbnMuc2NhbGUsXG4gICAgICAgICAgICByb3RhdGU6IChfYyA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgY29sb3I6IChfZCA9IG9wdGlvbnMuY29sb3IpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiAoX2UgPSBvcHRpb25zLmJvcmRlckNvbG9yKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9mID0gb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogMCxcbiAgICAgICAgICAgIGJvcmRlckRhc2hBcnJheTogKF9nID0gb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXkpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckRhc2hQaGFzZTogKF9oID0gb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckxpbmVDYXA6IChfaiA9IG9wdGlvbnMuYm9yZGVyTGluZUNhcCkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA/IF9qIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY3NTdGF0ZTogZ3JhcGhpY3NTdGF0ZUtleSxcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBhIGxpbmUgb24gdGhpcyBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdMaW5lKHtcbiAgICAgKiAgIHN0YXJ0OiB7IHg6IDI1LCB5OiA3NSB9LFxuICAgICAqICAgZW5kOiB7IHg6IDEyNSwgeTogMTc1IH0sXG4gICAgICogICB0aGlja25lc3M6IDIsXG4gICAgICogICBjb2xvcjogcmdiKDAuNzUsIDAuMiwgMC4yKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgbGluZS5cbiAgICAgKi9cbiAgICBQREZQYWdlLnByb3RvdHlwZS5kcmF3TGluZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMuc3RhcnQsICdvcHRpb25zLnN0YXJ0JywgW1xuICAgICAgICAgICAgW09iamVjdCwgJ3sgeDogbnVtYmVyLCB5OiBudW1iZXIgfSddLFxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucy5lbmQsICdvcHRpb25zLmVuZCcsIFtcbiAgICAgICAgICAgIFtPYmplY3QsICd7IHg6IG51bWJlciwgeTogbnVtYmVyIH0nXSxcbiAgICAgICAgXSk7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMuc3RhcnQueCwgJ29wdGlvbnMuc3RhcnQueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLnN0YXJ0LnksICdvcHRpb25zLnN0YXJ0LnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucy5lbmQueCwgJ29wdGlvbnMuZW5kLngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucy5lbmQueSwgJ29wdGlvbnMuZW5kLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy50aGlja25lc3MsICdvcHRpb25zLnRoaWNrbmVzcycsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmNvbG9yLCAnb3B0aW9ucy5jb2xvcicsIFtbT2JqZWN0LCAnQ29sb3InXV0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmRhc2hBcnJheSwgJ29wdGlvbnMuZGFzaEFycmF5JywgW0FycmF5XSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuZGFzaFBoYXNlLCAnb3B0aW9ucy5kYXNoUGhhc2UnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMubGluZUNhcCwgJ29wdGlvbnMubGluZUNhcCcsIExpbmVDYXBTdHlsZSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5vcGFjaXR5LCAnb3BhY2l0eS5vcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydElzT25lT2ZPclVuZGVmaW5lZChvcHRpb25zLmJsZW5kTW9kZSwgJ29wdGlvbnMuYmxlbmRNb2RlJywgQmxlbmRNb2RlKTtcbiAgICAgICAgdmFyIGdyYXBoaWNzU3RhdGVLZXkgPSB0aGlzLm1heWJlRW1iZWRHcmFwaGljc1N0YXRlKHtcbiAgICAgICAgICAgIGJvcmRlck9wYWNpdHk6IG9wdGlvbnMub3BhY2l0eSxcbiAgICAgICAgICAgIGJsZW5kTW9kZTogb3B0aW9ucy5ibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoISgnY29sb3InIGluIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIGNvbnRlbnRTdHJlYW0ucHVzaC5hcHBseShjb250ZW50U3RyZWFtLCBkcmF3TGluZSh7XG4gICAgICAgICAgICBzdGFydDogb3B0aW9ucy5zdGFydCxcbiAgICAgICAgICAgIGVuZDogb3B0aW9ucy5lbmQsXG4gICAgICAgICAgICB0aGlja25lc3M6IChfYSA9IG9wdGlvbnMudGhpY2tuZXNzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAxLFxuICAgICAgICAgICAgY29sb3I6IChfYiA9IG9wdGlvbnMuY29sb3IpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhc2hBcnJheTogKF9jID0gb3B0aW9ucy5kYXNoQXJyYXkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRhc2hQaGFzZTogKF9kID0gb3B0aW9ucy5kYXNoUGhhc2UpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxpbmVDYXA6IChfZSA9IG9wdGlvbnMubGluZUNhcCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY3NTdGF0ZTogZ3JhcGhpY3NTdGF0ZUtleSxcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBhIHJlY3RhbmdsZSBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgZGVncmVlcywgZ3JheXNjYWxlLCByZ2IgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogcGFnZS5kcmF3UmVjdGFuZ2xlKHtcbiAgICAgKiAgIHg6IDI1LFxuICAgICAqICAgeTogNzUsXG4gICAgICogICB3aWR0aDogMjUwLFxuICAgICAqICAgaGVpZ2h0OiA3NSxcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcygtMTUpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDUsXG4gICAgICogICBib3JkZXJDb2xvcjogZ3JheXNjYWxlKDAuNSksXG4gICAgICogICBjb2xvcjogcmdiKDAuNzUsIDAuMiwgMC4yKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNSxcbiAgICAgKiAgIGJvcmRlck9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgcmVjdGFuZ2xlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdSZWN0YW5nbGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX287XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueCwgJ29wdGlvbnMueCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnksICdvcHRpb25zLnknLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy53aWR0aCwgJ29wdGlvbnMud2lkdGgnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy5oZWlnaHQsICdvcHRpb25zLmhlaWdodCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnJvdGF0ZSwgJ29wdGlvbnMucm90YXRlJywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueFNrZXcsICdvcHRpb25zLnhTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueVNrZXcsICdvcHRpb25zLnlTa2V3JywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyV2lkdGgsICdvcHRpb25zLmJvcmRlcldpZHRoJywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuY29sb3IsICdvcHRpb25zLmNvbG9yJywgW1tPYmplY3QsICdDb2xvciddXSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5vcGFjaXR5LCAnb3BhY2l0eS5vcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyQ29sb3IsICdvcHRpb25zLmJvcmRlckNvbG9yJywgW1xuICAgICAgICAgICAgW09iamVjdCwgJ0NvbG9yJ10sXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckRhc2hBcnJheSwgJ29wdGlvbnMuYm9yZGVyRGFzaEFycmF5JywgW1xuICAgICAgICAgICAgQXJyYXksXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckRhc2hQaGFzZSwgJ29wdGlvbnMuYm9yZGVyRGFzaFBoYXNlJywgW1xuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJMaW5lQ2FwLCAnb3B0aW9ucy5ib3JkZXJMaW5lQ2FwJywgTGluZUNhcFN0eWxlKTtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlck9wYWNpdHksICdvcHRpb25zLmJvcmRlck9wYWNpdHknLCAwLCAxKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYmxlbmRNb2RlLCAnb3B0aW9ucy5ibGVuZE1vZGUnLCBCbGVuZE1vZGUpO1xuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZUtleSA9IHRoaXMubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogb3B0aW9ucy5vcGFjaXR5LFxuICAgICAgICAgICAgYm9yZGVyT3BhY2l0eTogb3B0aW9ucy5ib3JkZXJPcGFjaXR5LFxuICAgICAgICAgICAgYmxlbmRNb2RlOiBvcHRpb25zLmJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghKCdjb2xvcicgaW4gb3B0aW9ucykgJiYgISgnYm9yZGVyQ29sb3InIGluIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIGNvbnRlbnRTdHJlYW0ucHVzaC5hcHBseShjb250ZW50U3RyZWFtLCBkcmF3UmVjdGFuZ2xlKHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy54LFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB0aGlzLnksXG4gICAgICAgICAgICB3aWR0aDogKF9jID0gb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMTUwLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMTAwLFxuICAgICAgICAgICAgcm90YXRlOiAoX2UgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHhTa2V3OiAoX2YgPSBvcHRpb25zLnhTa2V3KSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeVNrZXc6IChfZyA9IG9wdGlvbnMueVNrZXcpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9oID0gb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogMCxcbiAgICAgICAgICAgIGNvbG9yOiAoX2ogPSBvcHRpb25zLmNvbG9yKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogKF9rID0gb3B0aW9ucy5ib3JkZXJDb2xvcikgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyRGFzaEFycmF5OiAoX2wgPSBvcHRpb25zLmJvcmRlckRhc2hBcnJheSkgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9yZGVyRGFzaFBoYXNlOiAoX20gPSBvcHRpb25zLmJvcmRlckRhc2hQaGFzZSkgIT09IG51bGwgJiYgX20gIT09IHZvaWQgMCA/IF9tIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY3NTdGF0ZTogZ3JhcGhpY3NTdGF0ZUtleSxcbiAgICAgICAgICAgIGJvcmRlckxpbmVDYXA6IChfbyA9IG9wdGlvbnMuYm9yZGVyTGluZUNhcCkgIT09IG51bGwgJiYgX28gIT09IHZvaWQgMCA/IF9vIDogdW5kZWZpbmVkLFxuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEcmF3IGEgc3F1YXJlIG9uIHRoaXMgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBkZWdyZWVzLCBncmF5c2NhbGUsIHJnYiB9IGZyb20gJ3BkZi1saWInXG4gICAgICpcbiAgICAgKiBwYWdlLmRyYXdTcXVhcmUoe1xuICAgICAqICAgeDogMjUsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHNpemU6IDEwMCxcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcygtMTUpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDUsXG4gICAgICogICBib3JkZXJDb2xvcjogZ3JheXNjYWxlKDAuNSksXG4gICAgICogICBjb2xvcjogcmdiKDAuNzUsIDAuMiwgMC4yKSxcbiAgICAgKiAgIG9wYWNpdHk6IDAuNSxcbiAgICAgKiAgIGJvcmRlck9wYWNpdHk6IDAuNzUsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gZHJhd2luZyB0aGUgc3F1YXJlLlxuICAgICAqL1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmRyYXdTcXVhcmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgc2l6ZSA9IG9wdGlvbnMuc2l6ZTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQoc2l6ZSwgJ3NpemUnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5kcmF3UmVjdGFuZ2xlKF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyB3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERyYXcgYW4gZWxsaXBzZSBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgZ3JheXNjYWxlLCByZ2IgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogcGFnZS5kcmF3RWxsaXBzZSh7XG4gICAgICogICB4OiAyMDAsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHhTY2FsZTogMTAwLFxuICAgICAqICAgeVNjYWxlOiA1MCxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiA1LFxuICAgICAqICAgYm9yZGVyQ29sb3I6IGdyYXlzY2FsZSgwLjUpLFxuICAgICAqICAgY29sb3I6IHJnYigwLjc1LCAwLjIsIDAuMiksXG4gICAgICogICBvcGFjaXR5OiAwLjUsXG4gICAgICogICBib3JkZXJPcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIGVsbGlwc2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd0VsbGlwc2UgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLngsICdvcHRpb25zLngnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55LCAnb3B0aW9ucy55JywgWydudW1iZXInXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMueFNjYWxlLCAnb3B0aW9ucy54U2NhbGUnLCBbJ251bWJlciddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucy55U2NhbGUsICdvcHRpb25zLnlTY2FsZScsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLnJvdGF0ZSwgJ29wdGlvbnMucm90YXRlJywgW1tPYmplY3QsICdSb3RhdGlvbiddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuY29sb3IsICdvcHRpb25zLmNvbG9yJywgW1tPYmplY3QsICdDb2xvciddXSk7XG4gICAgICAgIGFzc2VydFJhbmdlT3JVbmRlZmluZWQob3B0aW9ucy5vcGFjaXR5LCAnb3BhY2l0eS5vcGFjaXR5JywgMCwgMSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyQ29sb3IsICdvcHRpb25zLmJvcmRlckNvbG9yJywgW1xuICAgICAgICAgICAgW09iamVjdCwgJ0NvbG9yJ10sXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkKG9wdGlvbnMuYm9yZGVyT3BhY2l0eSwgJ29wdGlvbnMuYm9yZGVyT3BhY2l0eScsIDAsIDEpO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlcldpZHRoLCAnb3B0aW9ucy5ib3JkZXJXaWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckRhc2hBcnJheSwgJ29wdGlvbnMuYm9yZGVyRGFzaEFycmF5JywgW1xuICAgICAgICAgICAgQXJyYXksXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zLmJvcmRlckRhc2hQaGFzZSwgJ29wdGlvbnMuYm9yZGVyRGFzaFBoYXNlJywgW1xuICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgIF0pO1xuICAgICAgICBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQob3B0aW9ucy5ib3JkZXJMaW5lQ2FwLCAnb3B0aW9ucy5ib3JkZXJMaW5lQ2FwJywgTGluZUNhcFN0eWxlKTtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZk9yVW5kZWZpbmVkKG9wdGlvbnMuYmxlbmRNb2RlLCAnb3B0aW9ucy5ibGVuZE1vZGUnLCBCbGVuZE1vZGUpO1xuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZUtleSA9IHRoaXMubWF5YmVFbWJlZEdyYXBoaWNzU3RhdGUoe1xuICAgICAgICAgICAgb3BhY2l0eTogb3B0aW9ucy5vcGFjaXR5LFxuICAgICAgICAgICAgYm9yZGVyT3BhY2l0eTogb3B0aW9ucy5ib3JkZXJPcGFjaXR5LFxuICAgICAgICAgICAgYmxlbmRNb2RlOiBvcHRpb25zLmJsZW5kTW9kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghKCdjb2xvcicgaW4gb3B0aW9ucykgJiYgISgnYm9yZGVyQ29sb3InIGluIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb250ZW50U3RyZWFtID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIGNvbnRlbnRTdHJlYW0ucHVzaC5hcHBseShjb250ZW50U3RyZWFtLCBkcmF3RWxsaXBzZSh7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMueCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdGhpcy55LFxuICAgICAgICAgICAgeFNjYWxlOiAoX2MgPSBvcHRpb25zLnhTY2FsZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMTAwLFxuICAgICAgICAgICAgeVNjYWxlOiAoX2QgPSBvcHRpb25zLnlTY2FsZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogMTAwLFxuICAgICAgICAgICAgcm90YXRlOiAoX2UgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29sb3I6IChfZiA9IG9wdGlvbnMuY29sb3IpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiAoX2cgPSBvcHRpb25zLmJvcmRlckNvbG9yKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9oID0gb3B0aW9ucy5ib3JkZXJXaWR0aCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogMCxcbiAgICAgICAgICAgIGJvcmRlckRhc2hBcnJheTogKF9qID0gb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXkpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckRhc2hQaGFzZTogKF9rID0gb3B0aW9ucy5ib3JkZXJEYXNoUGhhc2UpICE9PSBudWxsICYmIF9rICE9PSB2b2lkIDAgPyBfayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvcmRlckxpbmVDYXA6IChfbCA9IG9wdGlvbnMuYm9yZGVyTGluZUNhcCkgIT09IG51bGwgJiYgX2wgIT09IHZvaWQgMCA/IF9sIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3JhcGhpY3NTdGF0ZTogZ3JhcGhpY3NTdGF0ZUtleSxcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRHJhdyBhIGNpcmNsZSBvbiB0aGlzIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgZ3JheXNjYWxlLCByZ2IgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogcGFnZS5kcmF3Q2lyY2xlKHtcbiAgICAgKiAgIHg6IDIwMCxcbiAgICAgKiAgIHk6IDE1MCxcbiAgICAgKiAgIHNpemU6IDEwMCxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiA1LFxuICAgICAqICAgYm9yZGVyQ29sb3I6IGdyYXlzY2FsZSgwLjUpLFxuICAgICAqICAgY29sb3I6IHJnYigwLjc1LCAwLjIsIDAuMiksXG4gICAgICogICBvcGFjaXR5OiAwLjUsXG4gICAgICogICBib3JkZXJPcGFjaXR5OiAwLjc1LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGRyYXdpbmcgdGhlIGVsbGlwc2UuXG4gICAgICovXG4gICAgUERGUGFnZS5wcm90b3R5cGUuZHJhd0NpcmNsZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBfYSA9IG9wdGlvbnMuc2l6ZSwgc2l6ZSA9IF9hID09PSB2b2lkIDAgPyAxMDAgOiBfYTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQoc2l6ZSwgJ3NpemUnLCBbJ251bWJlciddKTtcbiAgICAgICAgdGhpcy5kcmF3RWxsaXBzZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgeFNjYWxlOiBzaXplLCB5U2NhbGU6IHNpemUgfSkpO1xuICAgIH07XG4gICAgUERGUGFnZS5wcm90b3R5cGUuc2V0T3JFbWJlZEZvbnQgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICB2YXIgb2xkRm9udCA9IHRoaXMuZm9udDtcbiAgICAgICAgdmFyIG9sZEZvbnRLZXkgPSB0aGlzLmZvbnRLZXk7XG4gICAgICAgIGlmIChmb250KVxuICAgICAgICAgICAgdGhpcy5zZXRGb250KGZvbnQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmdldEZvbnQoKTtcbiAgICAgICAgdmFyIG5ld0ZvbnQgPSB0aGlzLmZvbnQ7XG4gICAgICAgIHZhciBuZXdGb250S2V5ID0gdGhpcy5mb250S2V5O1xuICAgICAgICByZXR1cm4geyBvbGRGb250OiBvbGRGb250LCBvbGRGb250S2V5OiBvbGRGb250S2V5LCBuZXdGb250OiBuZXdGb250LCBuZXdGb250S2V5OiBuZXdGb250S2V5IH07XG4gICAgfTtcbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRGb250ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuZm9udCB8fCAhdGhpcy5mb250S2V5KSB7XG4gICAgICAgICAgICB2YXIgZm9udCA9IHRoaXMuZG9jLmVtYmVkU3RhbmRhcmRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9udChmb250KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMuZm9udCwgdGhpcy5mb250S2V5XTtcbiAgICB9O1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnJlc2V0Rm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5mb250ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmZvbnRLZXkgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZQYWdlLnByb3RvdHlwZS5nZXRDb250ZW50U3RyZWFtID0gZnVuY3Rpb24gKHVzZUV4aXN0aW5nKSB7XG4gICAgICAgIGlmICh1c2VFeGlzdGluZyA9PT0gdm9pZCAwKSB7IHVzZUV4aXN0aW5nID0gdHJ1ZTsgfVxuICAgICAgICBpZiAodXNlRXhpc3RpbmcgJiYgdGhpcy5jb250ZW50U3RyZWFtKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFN0cmVhbTtcbiAgICAgICAgdGhpcy5jb250ZW50U3RyZWFtID0gdGhpcy5jcmVhdGVDb250ZW50U3RyZWFtKCk7XG4gICAgICAgIHRoaXMuY29udGVudFN0cmVhbVJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIodGhpcy5jb250ZW50U3RyZWFtKTtcbiAgICAgICAgdGhpcy5ub2RlLmFkZENvbnRlbnRTdHJlYW0odGhpcy5jb250ZW50U3RyZWFtUmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFN0cmVhbTtcbiAgICB9O1xuICAgIFBERlBhZ2UucHJvdG90eXBlLmNyZWF0ZUNvbnRlbnRTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvcGVyYXRvcnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG9wZXJhdG9yc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5kb2MuY29udGV4dC5vYmooe30pO1xuICAgICAgICB2YXIgY29udGVudFN0cmVhbSA9IFBERkNvbnRlbnRTdHJlYW0ub2YoZGljdCwgb3BlcmF0b3JzKTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRTdHJlYW07XG4gICAgfTtcbiAgICBQREZQYWdlLnByb3RvdHlwZS5tYXliZUVtYmVkR3JhcGhpY3NTdGF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBvcGFjaXR5ID0gb3B0aW9ucy5vcGFjaXR5LCBib3JkZXJPcGFjaXR5ID0gb3B0aW9ucy5ib3JkZXJPcGFjaXR5LCBibGVuZE1vZGUgPSBvcHRpb25zLmJsZW5kTW9kZTtcbiAgICAgICAgaWYgKG9wYWNpdHkgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgYm9yZGVyT3BhY2l0eSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBibGVuZE1vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ3JhcGhpY3NTdGF0ZSA9IHRoaXMuZG9jLmNvbnRleHQub2JqKHtcbiAgICAgICAgICAgIFR5cGU6ICdFeHRHU3RhdGUnLFxuICAgICAgICAgICAgY2E6IG9wYWNpdHksXG4gICAgICAgICAgICBDQTogYm9yZGVyT3BhY2l0eSxcbiAgICAgICAgICAgIEJNOiBibGVuZE1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5ub2RlLm5ld0V4dEdTdGF0ZSgnR1MnLCBncmFwaGljc1N0YXRlKTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9O1xuICAgIFBERlBhZ2UucHJvdG90eXBlLnNjYWxlQW5ub3QgPSBmdW5jdGlvbiAoYW5ub3QsIHgsIHkpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9ycyA9IFsnUkQnLCAnQ0wnLCAnVmVydGljZXMnLCAnUXVhZFBvaW50cycsICdMJywgJ1JlY3QnXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gc2VsZWN0b3JzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGxpc3QgPSBhbm5vdC5sb29rdXAoUERGTmFtZS5vZihzZWxlY3RvcnNbaWR4XSkpO1xuICAgICAgICAgICAgaWYgKGxpc3QgaW5zdGFuY2VvZiBQREZBcnJheSlcbiAgICAgICAgICAgICAgICBsaXN0LnNjYWxlUERGTnVtYmVycyh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5rTGlzdHMgPSBhbm5vdC5sb29rdXAoUERGTmFtZS5vZignSW5rTGlzdCcpKTtcbiAgICAgICAgaWYgKGlua0xpc3RzIGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGlua0xpc3RzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBhcnIgPSBpbmtMaXN0cy5sb29rdXAoaWR4KTtcbiAgICAgICAgICAgICAgICBpZiAoYXJyIGluc3RhbmNlb2YgUERGQXJyYXkpXG4gICAgICAgICAgICAgICAgICAgIGFyci5zY2FsZVBERk51bWJlcnMoeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5hZGRQYWdlXV0gYW5kIFtbUERGRG9jdW1lbnQuaW5zZXJ0UGFnZV1dXG4gICAgICogPiBtZXRob2RzLCB3aGljaCBjYW4gY3JlYXRlIGluc3RhbmNlcyBvZiBbW1BERlBhZ2VdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGUGFnZV1dIGZyb20gYW4gZXhpc3RpbmcgbGVhZiBub2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxlYWZOb2RlIFRoZSBsZWFmIG5vZGUgdG8gYmUgd3JhcHBlZC5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGUgcGFnZS5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGUgcGFnZSB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZQYWdlLm9mID0gZnVuY3Rpb24gKGxlYWZOb2RlLCByZWYsIGRvYykge1xuICAgICAgICByZXR1cm4gbmV3IFBERlBhZ2UobGVhZk5vZGUsIHJlZiwgZG9jKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZEb2N1bWVudC5hZGRQYWdlXV0gYW5kIFtbUERGRG9jdW1lbnQuaW5zZXJ0UGFnZV1dXG4gICAgICogPiBtZXRob2RzLCB3aGljaCBjYW4gY3JlYXRlIGluc3RhbmNlcyBvZiBbW1BERlBhZ2VdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGUGFnZV1dLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhlIHBhZ2Ugd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGUGFnZS5jcmVhdGUgPSBmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgIGFzc2VydElzKGRvYywgJ2RvYycsIFtbUERGRG9jdW1lbnQsICdQREZEb2N1bWVudCddXSk7XG4gICAgICAgIHZhciBkdW1teVJlZiA9IFBERlJlZi5vZigtMSk7XG4gICAgICAgIHZhciBwYWdlTGVhZiA9IFBERlBhZ2VMZWFmLndpdGhDb250ZXh0QW5kUGFyZW50KGRvYy5jb250ZXh0LCBkdW1teVJlZik7XG4gICAgICAgIHZhciBwYWdlUmVmID0gZG9jLmNvbnRleHQucmVnaXN0ZXIocGFnZUxlYWYpO1xuICAgICAgICByZXR1cm4gbmV3IFBERlBhZ2UocGFnZUxlYWYsIHBhZ2VSZWYsIGRvYyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGUGFnZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZQYWdlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUGFnZS5qcy5tYXAiLCJleHBvcnQgdmFyIEJsZW5kTW9kZTtcbihmdW5jdGlvbiAoQmxlbmRNb2RlKSB7XG4gICAgQmxlbmRNb2RlW1wiTm9ybWFsXCJdID0gXCJOb3JtYWxcIjtcbiAgICBCbGVuZE1vZGVbXCJNdWx0aXBseVwiXSA9IFwiTXVsdGlwbHlcIjtcbiAgICBCbGVuZE1vZGVbXCJTY3JlZW5cIl0gPSBcIlNjcmVlblwiO1xuICAgIEJsZW5kTW9kZVtcIk92ZXJsYXlcIl0gPSBcIk92ZXJsYXlcIjtcbiAgICBCbGVuZE1vZGVbXCJEYXJrZW5cIl0gPSBcIkRhcmtlblwiO1xuICAgIEJsZW5kTW9kZVtcIkxpZ2h0ZW5cIl0gPSBcIkxpZ2h0ZW5cIjtcbiAgICBCbGVuZE1vZGVbXCJDb2xvckRvZGdlXCJdID0gXCJDb2xvckRvZGdlXCI7XG4gICAgQmxlbmRNb2RlW1wiQ29sb3JCdXJuXCJdID0gXCJDb2xvckJ1cm5cIjtcbiAgICBCbGVuZE1vZGVbXCJIYXJkTGlnaHRcIl0gPSBcIkhhcmRMaWdodFwiO1xuICAgIEJsZW5kTW9kZVtcIlNvZnRMaWdodFwiXSA9IFwiU29mdExpZ2h0XCI7XG4gICAgQmxlbmRNb2RlW1wiRGlmZmVyZW5jZVwiXSA9IFwiRGlmZmVyZW5jZVwiO1xuICAgIEJsZW5kTW9kZVtcIkV4Y2x1c2lvblwiXSA9IFwiRXhjbHVzaW9uXCI7XG59KShCbGVuZE1vZGUgfHwgKEJsZW5kTW9kZSA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZQYWdlT3B0aW9ucy5qcy5tYXAiLCJleHBvcnQgdmFyIFN0YW5kYXJkRm9udHM7XG4oZnVuY3Rpb24gKFN0YW5kYXJkRm9udHMpIHtcbiAgICBTdGFuZGFyZEZvbnRzW1wiQ291cmllclwiXSA9IFwiQ291cmllclwiO1xuICAgIFN0YW5kYXJkRm9udHNbXCJDb3VyaWVyQm9sZFwiXSA9IFwiQ291cmllci1Cb2xkXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIkNvdXJpZXJPYmxpcXVlXCJdID0gXCJDb3VyaWVyLU9ibGlxdWVcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiQ291cmllckJvbGRPYmxpcXVlXCJdID0gXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIkhlbHZldGljYVwiXSA9IFwiSGVsdmV0aWNhXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIkhlbHZldGljYUJvbGRcIl0gPSBcIkhlbHZldGljYS1Cb2xkXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIkhlbHZldGljYU9ibGlxdWVcIl0gPSBcIkhlbHZldGljYS1PYmxpcXVlXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIkhlbHZldGljYUJvbGRPYmxpcXVlXCJdID0gXCJIZWx2ZXRpY2EtQm9sZE9ibGlxdWVcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiVGltZXNSb21hblwiXSA9IFwiVGltZXMtUm9tYW5cIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiVGltZXNSb21hbkJvbGRcIl0gPSBcIlRpbWVzLUJvbGRcIjtcbiAgICBTdGFuZGFyZEZvbnRzW1wiVGltZXNSb21hbkl0YWxpY1wiXSA9IFwiVGltZXMtSXRhbGljXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIlRpbWVzUm9tYW5Cb2xkSXRhbGljXCJdID0gXCJUaW1lcy1Cb2xkSXRhbGljXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIlN5bWJvbFwiXSA9IFwiU3ltYm9sXCI7XG4gICAgU3RhbmRhcmRGb250c1tcIlphcGZEaW5nYmF0c1wiXSA9IFwiWmFwZkRpbmdiYXRzXCI7XG59KShTdGFuZGFyZEZvbnRzIHx8IChTdGFuZGFyZEZvbnRzID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0YW5kYXJkRm9udHMuanMubWFwIiwiaW1wb3J0IHsgc2V0RmlsbGluZ0NteWtDb2xvciwgc2V0RmlsbGluZ0dyYXlzY2FsZUNvbG9yLCBzZXRGaWxsaW5nUmdiQ29sb3IsIHNldFN0cm9raW5nQ215a0NvbG9yLCBzZXRTdHJva2luZ0dyYXlzY2FsZUNvbG9yLCBzZXRTdHJva2luZ1JnYkNvbG9yLCB9IGZyb20gXCIuL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgYXNzZXJ0UmFuZ2UsIGVycm9yIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5leHBvcnQgdmFyIENvbG9yVHlwZXM7XG4oZnVuY3Rpb24gKENvbG9yVHlwZXMpIHtcbiAgICBDb2xvclR5cGVzW1wiR3JheXNjYWxlXCJdID0gXCJHcmF5c2NhbGVcIjtcbiAgICBDb2xvclR5cGVzW1wiUkdCXCJdID0gXCJSR0JcIjtcbiAgICBDb2xvclR5cGVzW1wiQ01ZS1wiXSA9IFwiQ01ZS1wiO1xufSkoQ29sb3JUeXBlcyB8fCAoQ29sb3JUeXBlcyA9IHt9KSk7XG5leHBvcnQgdmFyIGdyYXlzY2FsZSA9IGZ1bmN0aW9uIChncmF5KSB7XG4gICAgYXNzZXJ0UmFuZ2UoZ3JheSwgJ2dyYXknLCAwLjAsIDEuMCk7XG4gICAgcmV0dXJuIHsgdHlwZTogQ29sb3JUeXBlcy5HcmF5c2NhbGUsIGdyYXk6IGdyYXkgfTtcbn07XG5leHBvcnQgdmFyIHJnYiA9IGZ1bmN0aW9uIChyZWQsIGdyZWVuLCBibHVlKSB7XG4gICAgYXNzZXJ0UmFuZ2UocmVkLCAncmVkJywgMCwgMSk7XG4gICAgYXNzZXJ0UmFuZ2UoZ3JlZW4sICdncmVlbicsIDAsIDEpO1xuICAgIGFzc2VydFJhbmdlKGJsdWUsICdibHVlJywgMCwgMSk7XG4gICAgcmV0dXJuIHsgdHlwZTogQ29sb3JUeXBlcy5SR0IsIHJlZDogcmVkLCBncmVlbjogZ3JlZW4sIGJsdWU6IGJsdWUgfTtcbn07XG5leHBvcnQgdmFyIGNteWsgPSBmdW5jdGlvbiAoY3lhbiwgbWFnZW50YSwgeWVsbG93LCBrZXkpIHtcbiAgICBhc3NlcnRSYW5nZShjeWFuLCAnY3lhbicsIDAsIDEpO1xuICAgIGFzc2VydFJhbmdlKG1hZ2VudGEsICdtYWdlbnRhJywgMCwgMSk7XG4gICAgYXNzZXJ0UmFuZ2UoeWVsbG93LCAneWVsbG93JywgMCwgMSk7XG4gICAgYXNzZXJ0UmFuZ2Uoa2V5LCAna2V5JywgMCwgMSk7XG4gICAgcmV0dXJuIHsgdHlwZTogQ29sb3JUeXBlcy5DTVlLLCBjeWFuOiBjeWFuLCBtYWdlbnRhOiBtYWdlbnRhLCB5ZWxsb3c6IHllbGxvdywga2V5OiBrZXkgfTtcbn07XG52YXIgR3JheXNjYWxlID0gQ29sb3JUeXBlcy5HcmF5c2NhbGUsIFJHQiA9IENvbG9yVHlwZXMuUkdCLCBDTVlLID0gQ29sb3JUeXBlcy5DTVlLO1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdmFyIHNldEZpbGxpbmdDb2xvciA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgIHJldHVybiBjb2xvci50eXBlID09PSBHcmF5c2NhbGUgPyBzZXRGaWxsaW5nR3JheXNjYWxlQ29sb3IoY29sb3IuZ3JheSlcbiAgICAgICAgOiBjb2xvci50eXBlID09PSBSR0IgPyBzZXRGaWxsaW5nUmdiQ29sb3IoY29sb3IucmVkLCBjb2xvci5ncmVlbiwgY29sb3IuYmx1ZSlcbiAgICAgICAgICAgIDogY29sb3IudHlwZSA9PT0gQ01ZSyA/IHNldEZpbGxpbmdDbXlrQ29sb3IoY29sb3IuY3lhbiwgY29sb3IubWFnZW50YSwgY29sb3IueWVsbG93LCBjb2xvci5rZXkpXG4gICAgICAgICAgICAgICAgOiBlcnJvcihcIkludmFsaWQgY29sb3I6IFwiICsgSlNPTi5zdHJpbmdpZnkoY29sb3IpKTtcbn07XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB2YXIgc2V0U3Ryb2tpbmdDb2xvciA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgIHJldHVybiBjb2xvci50eXBlID09PSBHcmF5c2NhbGUgPyBzZXRTdHJva2luZ0dyYXlzY2FsZUNvbG9yKGNvbG9yLmdyYXkpXG4gICAgICAgIDogY29sb3IudHlwZSA9PT0gUkdCID8gc2V0U3Ryb2tpbmdSZ2JDb2xvcihjb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlKVxuICAgICAgICAgICAgOiBjb2xvci50eXBlID09PSBDTVlLID8gc2V0U3Ryb2tpbmdDbXlrQ29sb3IoY29sb3IuY3lhbiwgY29sb3IubWFnZW50YSwgY29sb3IueWVsbG93LCBjb2xvci5rZXkpXG4gICAgICAgICAgICAgICAgOiBlcnJvcihcIkludmFsaWQgY29sb3I6IFwiICsgSlNPTi5zdHJpbmdpZnkoY29sb3IpKTtcbn07XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB2YXIgY29tcG9uZW50c1RvQ29sb3IgPSBmdW5jdGlvbiAoY29tcHMsIHNjYWxlKSB7XG4gICAgaWYgKHNjYWxlID09PSB2b2lkIDApIHsgc2NhbGUgPSAxOyB9XG4gICAgcmV0dXJuICgoY29tcHMgPT09IG51bGwgfHwgY29tcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBzLmxlbmd0aCkgPT09IDEgPyBncmF5c2NhbGUoY29tcHNbMF0gKiBzY2FsZSlcbiAgICAgICAgOiAoY29tcHMgPT09IG51bGwgfHwgY29tcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbXBzLmxlbmd0aCkgPT09IDMgPyByZ2IoY29tcHNbMF0gKiBzY2FsZSwgY29tcHNbMV0gKiBzY2FsZSwgY29tcHNbMl0gKiBzY2FsZSlcbiAgICAgICAgICAgIDogKGNvbXBzID09PSBudWxsIHx8IGNvbXBzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb21wcy5sZW5ndGgpID09PSA0ID8gY215ayhjb21wc1swXSAqIHNjYWxlLCBjb21wc1sxXSAqIHNjYWxlLCBjb21wc1syXSAqIHNjYWxlLCBjb21wc1szXSAqIHNjYWxlKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKTtcbn07XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB2YXIgY29sb3JUb0NvbXBvbmVudHMgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICByZXR1cm4gY29sb3IudHlwZSA9PT0gR3JheXNjYWxlID8gW2NvbG9yLmdyYXldXG4gICAgICAgIDogY29sb3IudHlwZSA9PT0gUkdCID8gW2NvbG9yLnJlZCwgY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWVdXG4gICAgICAgICAgICA6IGNvbG9yLnR5cGUgPT09IENNWUsgPyBbY29sb3IuY3lhbiwgY29sb3IubWFnZW50YSwgY29sb3IueWVsbG93LCBjb2xvci5rZXldXG4gICAgICAgICAgICAgICAgOiBlcnJvcihcIkludmFsaWQgY29sb3I6IFwiICsgSlNPTi5zdHJpbmdpZnkoY29sb3IpKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb2xvcnMuanMubWFwIiwiLy8gdHNsaW50OmRpc2FibGU6IG1heC1jbGFzc2VzLXBlci1maWxlXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbi8vIFRPRE86IEluY2x1ZGUgbGluayB0byBkb2N1bWVudGF0aW9uIHdpdGggZXhhbXBsZVxudmFyIEVuY3J5cHRlZFBERkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFbmNyeXB0ZWRQREZFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFbmNyeXB0ZWRQREZFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9ICdJbnB1dCBkb2N1bWVudCB0byBgUERGRG9jdW1lbnQubG9hZGAgaXMgZW5jcnlwdGVkLiBZb3UgY2FuIHVzZSBgUERGRG9jdW1lbnQubG9hZCguLi4sIHsgaWdub3JlRW5jcnlwdGlvbjogdHJ1ZSB9KWAgaWYgeW91IHdpc2ggdG8gbG9hZCB0aGUgZG9jdW1lbnQgYW55d2F5cy4nO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRW5jcnlwdGVkUERGRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBFbmNyeXB0ZWRQREZFcnJvciB9O1xuLy8gVE9ETzogSW5jbHVkZSBsaW5rIHRvIGRvY3VtZW50YXRpb24gd2l0aCBleGFtcGxlXG52YXIgRm9udGtpdE5vdFJlZ2lzdGVyZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRm9udGtpdE5vdFJlZ2lzdGVyZWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gJ0lucHV0IHRvIGBQREZEb2N1bWVudC5lbWJlZEZvbnRgIHdhcyBhIGN1c3RvbSBmb250LCBidXQgbm8gYGZvbnRraXRgIGluc3RhbmNlIHdhcyBmb3VuZC4gWW91IG11c3QgcmVnaXN0ZXIgYSBgZm9udGtpdGAgaW5zdGFuY2Ugd2l0aCBgUERGRG9jdW1lbnQucmVnaXN0ZXJGb250a2l0KC4uLilgIGJlZm9yZSBlbWJlZGRpbmcgY3VzdG9tIGZvbnRzLic7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBGb250a2l0Tm90UmVnaXN0ZXJlZEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgRm9udGtpdE5vdFJlZ2lzdGVyZWRFcnJvciB9O1xuLy8gVE9ETzogSW5jbHVkZSBsaW5rIHRvIGRvY3VtZW50YXRpb24gd2l0aCBleGFtcGxlXG52YXIgRm9yZWlnblBhZ2VFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRm9yZWlnblBhZ2VFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGb3JlaWduUGFnZUVycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gJ0EgYHBhZ2VgIHBhc3NlZCB0byBgUERGRG9jdW1lbnQuYWRkUGFnZWAgb3IgYFBERkRvY3VtZW50Lmluc2VydFBhZ2VgIHdhcyBmcm9tIGEgZGlmZmVyZW50IChmb3JlaWduKSBQREYgZG9jdW1lbnQuIElmIHlvdSB3YW50IHRvIGNvcHkgcGFnZXMgZnJvbSBvbmUgUERGRG9jdW1lbnQgdG8gYW5vdGhlciwgeW91IG11c3QgdXNlIGBQREZEb2N1bWVudC5jb3B5UGFnZXMoLi4uKWAgdG8gY29weSB0aGUgcGFnZXMgYmVmb3JlIGFkZGluZyBvciBpbnNlcnRpbmcgdGhlbS4nO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRm9yZWlnblBhZ2VFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IEZvcmVpZ25QYWdlRXJyb3IgfTtcbi8vIFRPRE86IEluY2x1ZGUgbGluayB0byBkb2N1bWVudGF0aW9uIHdpdGggZXhhbXBsZVxudmFyIFJlbW92ZVBhZ2VGcm9tRW1wdHlEb2N1bWVudEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZW1vdmVQYWdlRnJvbUVtcHR5RG9jdW1lbnRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZW1vdmVQYWdlRnJvbUVtcHR5RG9jdW1lbnRFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9ICdQREZEb2N1bWVudCBoYXMgbm8gcGFnZXMgc28gYFBERkRvY3VtZW50LnJlbW92ZVBhZ2VgIGNhbm5vdCBiZSBjYWxsZWQnO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUmVtb3ZlUGFnZUZyb21FbXB0eURvY3VtZW50RXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBSZW1vdmVQYWdlRnJvbUVtcHR5RG9jdW1lbnRFcnJvciB9O1xudmFyIE5vU3VjaEZpZWxkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE5vU3VjaEZpZWxkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTm9TdWNoRmllbGRFcnJvcihuYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIlBERkRvY3VtZW50IGhhcyBubyBmb3JtIGZpZWxkIHdpdGggdGhlIG5hbWUgXFxcIlwiICsgbmFtZSArIFwiXFxcIlwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTm9TdWNoRmllbGRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE5vU3VjaEZpZWxkRXJyb3IgfTtcbnZhciBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgZXhwZWN0ZWQsIGFjdHVhbCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWQgPT09IG51bGwgfHwgZXhwZWN0ZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4cGVjdGVkLm5hbWU7XG4gICAgICAgIHZhciBhY3R1YWxUeXBlID0gKF9iID0gKF9hID0gYWN0dWFsID09PSBudWxsIHx8IGFjdHVhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWN0dWFsLmNvbnN0cnVjdG9yKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubmFtZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogYWN0dWFsO1xuICAgICAgICB2YXIgbXNnID0gXCJFeHBlY3RlZCBmaWVsZCBcXFwiXCIgKyBuYW1lICsgXCJcXFwiIHRvIGJlIG9mIHR5cGUgXCIgKyBleHBlY3RlZFR5cGUgKyBcIiwgXCIgK1xuICAgICAgICAgICAgKFwiYnV0IGl0IGlzIGFjdHVhbGx5IG9mIHR5cGUgXCIgKyBhY3R1YWxUeXBlKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvciB9O1xudmFyIE1pc3NpbmdPblZhbHVlQ2hlY2tFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ09uVmFsdWVDaGVja0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdPblZhbHVlQ2hlY2tFcnJvcihvblZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBzZWxlY3QgY2hlY2sgYm94IGR1ZSB0byBtaXNzaW5nIG9uVmFsdWU6IFxcXCJcIiArIG9uVmFsdWUgKyBcIlxcXCJcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdPblZhbHVlQ2hlY2tFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdPblZhbHVlQ2hlY2tFcnJvciB9O1xudmFyIEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGaWVsZEFscmVhZHlFeGlzdHNFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGaWVsZEFscmVhZHlFeGlzdHNFcnJvcihuYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkEgZmllbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWU6IFxcXCJcIiArIG5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgRmllbGRBbHJlYWR5RXhpc3RzRXJyb3IgfTtcbnZhciBJbnZhbGlkRmllbGROYW1lUGFydEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbnZhbGlkRmllbGROYW1lUGFydEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEludmFsaWRGaWVsZE5hbWVQYXJ0RXJyb3IobmFtZVBhcnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmllbGQgbmFtZSBjb250YWlucyBpbnZhbGlkIGNvbXBvbmVudDogXFxcIlwiICsgbmFtZVBhcnQgKyBcIlxcXCJcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEludmFsaWRGaWVsZE5hbWVQYXJ0RXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBJbnZhbGlkRmllbGROYW1lUGFydEVycm9yIH07XG52YXIgRmllbGRFeGlzdHNBc05vblRlcm1pbmFsRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZpZWxkRXhpc3RzQXNOb25UZXJtaW5hbEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZpZWxkRXhpc3RzQXNOb25UZXJtaW5hbEVycm9yKG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQSBub24tdGVybWluYWwgZmllbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWU6IFxcXCJcIiArIG5hbWUgKyBcIlxcXCJcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEZpZWxkRXhpc3RzQXNOb25UZXJtaW5hbEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgRmllbGRFeGlzdHNBc05vblRlcm1pbmFsRXJyb3IgfTtcbnZhciBSaWNoVGV4dEZpZWxkUmVhZEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSaWNoVGV4dEZpZWxkUmVhZEVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJpY2hUZXh0RmllbGRSZWFkRXJyb3IoZmllbGROYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIlJlYWRpbmcgcmljaCB0ZXh0IGZpZWxkcyBpcyBub3Qgc3VwcG9ydGVkOiBBdHRlbXB0ZWQgdG8gcmVhZCByaWNoIHRleHQgZmllbGQ6IFwiICsgZmllbGROYW1lO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUmljaFRleHRGaWVsZFJlYWRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFJpY2hUZXh0RmllbGRSZWFkRXJyb3IgfTtcbnZhciBDb21iZWRUZXh0TGF5b3V0RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbWJlZFRleHRMYXlvdXRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb21iZWRUZXh0TGF5b3V0RXJyb3IobGluZUxlbmd0aCwgY2VsbENvdW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBsYXlvdXQgY29tYmVkIHRleHQgYXMgbGluZUxlbmd0aD1cIiArIGxpbmVMZW5ndGggKyBcIiBpcyBncmVhdGVyIHRoYW4gY2VsbENvdW50PVwiICsgY2VsbENvdW50O1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ29tYmVkVGV4dExheW91dEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgQ29tYmVkVGV4dExheW91dEVycm9yIH07XG52YXIgRXhjZWVkZWRNYXhMZW5ndGhFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRXhjZWVkZWRNYXhMZW5ndGhFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFeGNlZWRlZE1heExlbmd0aEVycm9yKHRleHRMZW5ndGgsIG1heExlbmd0aCwgbmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBdHRlbXB0ZWQgdG8gc2V0IHRleHQgd2l0aCBsZW5ndGg9XCIgKyB0ZXh0TGVuZ3RoICsgXCIgZm9yIFRleHRGaWVsZCB3aXRoIG1heExlbmd0aD1cIiArIG1heExlbmd0aCArIFwiIGFuZCBuYW1lPVwiICsgbmFtZTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBFeGNlZWRlZE1heExlbmd0aEVycm9yIH07XG52YXIgSW52YWxpZE1heExlbmd0aEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbnZhbGlkTWF4TGVuZ3RoRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW52YWxpZE1heExlbmd0aEVycm9yKHRleHRMZW5ndGgsIG1heExlbmd0aCwgbmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBdHRlbXB0ZWQgdG8gc2V0IG1heExlbmd0aD1cIiArIG1heExlbmd0aCArIFwiLCB3aGljaCBpcyBsZXNzIHRoYW4gXCIgKyB0ZXh0TGVuZ3RoICsgXCIsIHRoZSBsZW5ndGggb2YgdGhpcyBmaWVsZCdzIGN1cnJlbnQgdmFsdWUgKG5hbWU9XCIgKyBuYW1lICsgXCIpXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbnZhbGlkTWF4TGVuZ3RoRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBJbnZhbGlkTWF4TGVuZ3RoRXJyb3IgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9ycy5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuLi9QREZQYWdlXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi4vUERGRm9udFwiO1xuaW1wb3J0IHsgSW1hZ2VBbGlnbm1lbnQgfSBmcm9tIFwiLi4vaW1hZ2UvYWxpZ25tZW50XCI7XG5pbXBvcnQgeyBub3JtYWxpemVBcHBlYXJhbmNlLCBkZWZhdWx0QnV0dG9uQXBwZWFyYW5jZVByb3ZpZGVyLCB9IGZyb20gXCIuL2FwcGVhcmFuY2VzXCI7XG5pbXBvcnQgUERGRmllbGQsIHsgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucywgfSBmcm9tIFwiLi9QREZGaWVsZFwiO1xuaW1wb3J0IHsgcmdiIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFBERlN0cmVhbSwgUERGQWNyb1B1c2hCdXR0b24sIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFzc2VydElzLCBhc3NlcnRPclVuZGVmaW5lZCwgYXNzZXJ0UG9zaXRpdmUgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIGJ1dHRvbiBmaWVsZCBvZiBhIFtbUERGRm9ybV1dLlxuICpcbiAqIFtbUERGQnV0dG9uXV0gZmllbGRzIGFyZSBpbnRlcmFjdGl2ZSBjb250cm9scyB0aGF0IHVzZXJzIGNhbiBjbGljayB3aXRoIHRoZWlyXG4gKiBtb3VzZS4gVGhpcyB0eXBlIG9mIFtbUERGRmllbGRdXSBpcyBub3Qgc3RhdGVmdWwuIFRoZSBwdXJwb3NlIG9mIGEgYnV0dG9uXG4gKiBpcyB0byBwZXJmb3JtIGFuIGFjdGlvbiB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiBpdCwgc3VjaCBhcyBvcGVuaW5nIGEgcHJpbnRcbiAqIG1vZGFsIG9yIHJlc2V0dGluZyB0aGUgZm9ybS4gQnV0dG9ucyBhcmUgdHlwaWNhbGx5IHJlY3Rhbmd1bGFyIGluIHNoYXBlIGFuZFxuICogaGF2ZSBhIHRleHQgbGFiZWwgZGVzY3JpYmluZyB0aGUgYWN0aW9uIHRoYXQgdGhleSBwZXJmb3JtIHdoZW4gY2xpY2tlZC5cbiAqL1xudmFyIFBERkJ1dHRvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQnV0dG9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkJ1dHRvbihhY3JvUHVzaEJ1dHRvbiwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb1B1c2hCdXR0b24sIHJlZiwgZG9jKSB8fCB0aGlzO1xuICAgICAgICBhc3NlcnRJcyhhY3JvUHVzaEJ1dHRvbiwgJ2Fjcm9CdXR0b24nLCBbXG4gICAgICAgICAgICBbUERGQWNyb1B1c2hCdXR0b24sICdQREZBY3JvUHVzaEJ1dHRvbiddLFxuICAgICAgICBdKTtcbiAgICAgICAgX3RoaXMuYWNyb0ZpZWxkID0gYWNyb1B1c2hCdXR0b247XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcGxheSBhbiBpbWFnZSBpbnNpZGUgdGhlIGJvdW5kcyBvZiB0aGlzIGJ1dHRvbidzIHdpZGdldHMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcG5nSW1hZ2UgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcoLi4uKVxuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uZ2V0QnV0dG9uKCdzb21lLmJ1dHRvbi5maWVsZCcpXG4gICAgICogYnV0dG9uLnNldEltYWdlKHBuZ0ltYWdlLCBJbWFnZUFsaWdubWVudC5DZW50ZXIpXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIHVwZGF0ZSB0aGUgYXBwZWFyYW5jZXMgc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGJ1dHRvbidzIHdpZGdldHMuXG4gICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICogQHBhcmFtIGFsaWdubWVudCBUaGUgYWxpZ25tZW50IG9mIHRoZSBpbWFnZS5cbiAgICAgKi9cbiAgICBQREZCdXR0b24ucHJvdG90eXBlLnNldEltYWdlID0gZnVuY3Rpb24gKGltYWdlLCBhbGlnbm1lbnQpIHtcbiAgICAgICAgaWYgKGFsaWdubWVudCA9PT0gdm9pZCAwKSB7IGFsaWdubWVudCA9IEltYWdlQWxpZ25tZW50LkNlbnRlcjsgfVxuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3RyZWFtUmVmID0gdGhpcy5jcmVhdGVJbWFnZUFwcGVhcmFuY2VTdHJlYW0od2lkZ2V0LCBpbWFnZSwgYWxpZ25tZW50KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZXMod2lkZ2V0LCB7IG5vcm1hbDogc3RyZWFtUmVmIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzQ2xlYW4oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZm9udCBzaXplIGZvciB0aGlzIGZpZWxkLiBMYXJnZXIgZm9udCBzaXplcyB3aWxsIHJlc3VsdCBpbiBsYXJnZXJcbiAgICAgKiB0ZXh0IGJlaW5nIGRpc3BsYXllZCB3aGVuIFBERiByZWFkZXJzIHJlbmRlciB0aGlzIGJ1dHRvbi4gRm9udCBzaXplcyBtYXlcbiAgICAgKiBiZSBpbnRlZ2VyIG9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIFN1cHBseWluZyBhIG5lZ2F0aXZlIGZvbnQgc2l6ZSB3aWxsXG4gICAgICogY2F1c2UgdGhpcyBtZXRob2QgdG8gdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uZ2V0QnV0dG9uKCdzb21lLmJ1dHRvbi5maWVsZCcpXG4gICAgICogYnV0dG9uLnNldEZvbnRTaXplKDQpXG4gICAgICogYnV0dG9uLnNldEZvbnRTaXplKDE1LjcpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA+IFRoaXMgbWV0aG9kIGRlcGVuZHMgdXBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgZGVmYXVsdCBhcHBlYXJhbmNlXG4gICAgICogPiAoYC9EQWApIHN0cmluZy4gSWYgdGhpcyBmaWVsZCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdCBhcHBlYXJhbmNlIHN0cmluZyxcbiAgICAgKiA+IG9yIHRoYXQgc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYSBmb250IHNpemUgKHZpYSB0aGUgYFRmYCBvcGVyYXRvciksXG4gICAgICogPiB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9udFNpemUgVGhlIGZvbnQgc2l6ZSB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRleHQgaW4gdGhpcyBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZCdXR0b24ucHJvdG90eXBlLnNldEZvbnRTaXplID0gZnVuY3Rpb24gKGZvbnRTaXplKSB7XG4gICAgICAgIGFzc2VydFBvc2l0aXZlKGZvbnRTaXplLCAnZm9udFNpemUnKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93IHRoaXMgYnV0dG9uIG9uIHRoZSBzcGVjaWZpZWQgcGFnZSB3aXRoIHRoZSBnaXZlbiB0ZXh0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHVidW50dUZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KHVidW50dUZvbnRCeXRlcylcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmNyZWF0ZUJ1dHRvbignc29tZS5idXR0b24uZmllbGQnKVxuICAgICAqXG4gICAgICogYnV0dG9uLmFkZFRvUGFnZSgnRG8gU3R1ZmYnLCBwYWdlLCB7XG4gICAgICogICB4OiA1MCxcbiAgICAgKiAgIHk6IDc1LFxuICAgICAqICAgd2lkdGg6IDIwMCxcbiAgICAgKiAgIGhlaWdodDogMTAwLFxuICAgICAqICAgdGV4dENvbG9yOiByZ2IoMSwgMCwgMCksXG4gICAgICogICBiYWNrZ3JvdW5kQ29sb3I6IHJnYigwLCAxLCAwKSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiByZ2IoMCwgMCwgMSksXG4gICAgICogICBib3JkZXJXaWR0aDogMixcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcyg5MCksXG4gICAgICogICBmb250OiB1YnVudHVGb250LFxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB3aWRnZXQgZm9yIHRoaXMgYnV0dG9uIGZpZWxkLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBmb3IgdGhpcyBidXR0b24gd2lkZ2V0LlxuICAgICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIHdoaWNoIHRoaXMgYnV0dG9uIHdpZGdldCBzaG91bGQgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGFkZGluZyB0aGlzIGJ1dHRvbiB3aWRnZXQuXG4gICAgICovXG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS5hZGRUb1BhZ2UgPSBmdW5jdGlvbiAoXG4gICAgLy8gVE9ETzogVGhpcyBuZWVkcyB0byBiZSBvcHRpb25hbCwgZS5nLiBmb3IgaW1hZ2UgYnV0dG9uc1xuICAgIHRleHQsIHBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbDtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQodGV4dCwgJ3RleHQnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQocGFnZSwgJ3BhZ2UnLCBbW1BERlBhZ2UsICdQREZQYWdlJ11dKTtcbiAgICAgICAgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGZvciB0aGlzIGJ1dHRvblxuICAgICAgICB2YXIgd2lkZ2V0ID0gdGhpcy5jcmVhdGVXaWRnZXQoe1xuICAgICAgICAgICAgeDogKChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwKSAtICgoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDApIC8gMixcbiAgICAgICAgICAgIHk6ICgoX2MgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMCkgLSAoKF9kID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwKSAvIDIsXG4gICAgICAgICAgICB3aWR0aDogKF9lID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAxMDAsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IDUwLFxuICAgICAgICAgICAgdGV4dENvbG9yOiAoX2cgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudGV4dENvbG9yKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiByZ2IoMCwgMCwgMCksXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IChfaCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IHJnYigwLjc1LCAwLjc1LCAwLjc1KSxcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogKF9qID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiAwLFxuICAgICAgICAgICAgcm90YXRlOiAoX2sgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgY2FwdGlvbjogdGV4dCxcbiAgICAgICAgICAgIGhpZGRlbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmhpZGRlbixcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UucmVmLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIod2lkZ2V0LmRpY3QpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoaXMgZmllbGRcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuYWRkV2lkZ2V0KHdpZGdldFJlZik7XG4gICAgICAgIC8vIFNldCBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIHdpZGdldFxuICAgICAgICB2YXIgZm9udCA9IChfbCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5mb250KSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiB0aGlzLmRvYy5nZXRGb3JtKCkuZ2V0RGVmYXVsdEZvbnQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCk7XG4gICAgICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIGdpdmVuIHBhZ2VcbiAgICAgICAgcGFnZS5ub2RlLmFkZEFubm90KHdpZGdldFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGJ1dHRvbiBoYXMgYmVlbiBtYXJrZWQgYXMgZGlydHksIG9yIGlmIGFueSBvZiB0aGlzXG4gICAgICogYnV0dG9uJ3Mgd2lkZ2V0cyBkbyBub3QgaGF2ZSBhbiBhcHBlYXJhbmNlIHN0cmVhbS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmdldEJ1dHRvbignc29tZS5idXR0b24uZmllbGQnKVxuICAgICAqIGlmIChidXR0b24ubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSBjb25zb2xlLmxvZygnTmVlZHMgdXBkYXRlJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGJ1dHRvbiBuZWVkcyBhbiBhcHBlYXJhbmNlIHVwZGF0ZS5cbiAgICAgKi9cbiAgICBQREZCdXR0b24ucHJvdG90eXBlLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSgpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBoYXNBcHBlYXJhbmNlcyA9ICgoX2EgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZXMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vcm1hbCkgaW5zdGFuY2VvZiBQREZTdHJlYW07XG4gICAgICAgICAgICBpZiAoIWhhc0FwcGVhcmFuY2VzKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgYnV0dG9uJ3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIGJ1dHRvbnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmdldEJ1dHRvbignc29tZS5idXR0b24uZmllbGQnKVxuICAgICAqIGJ1dHRvbi5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGQnV0dG9uLnByb3RvdHlwZS5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICB0aGlzLnVwZGF0ZUFwcGVhcmFuY2VzKGZvbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBidXR0b24ncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGdpdmVuIGFwcGVhcmFuY2UgcHJvdmlkZXIuIElmIG5vIGBwcm92aWRlcmAgaXMgcGFzc2VkLCB0aGUgZGVmYXVsdFxuICAgICAqIGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIGJ1dHRvbnMgd2lsbCBiZSB1c2VkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgYnV0dG9uID0gZm9ybS5nZXRCdXR0b24oJ3NvbWUuYnV0dG9uLmZpZWxkJylcbiAgICAgKiBidXR0b24udXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhLCAoZmllbGQsIHdpZGdldCwgZm9udCkgPT4ge1xuICAgICAqICAgLi4uXG4gICAgICogICByZXR1cm4ge1xuICAgICAqICAgICBub3JtYWw6IGRyYXdCdXR0b24oLi4uKSxcbiAgICAgKiAgICAgZG93bjogZHJhd0J1dHRvbiguLi4pLFxuICAgICAqICAgfVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgT3B0aW9uYWxseSwgdGhlIGFwcGVhcmFuY2UgcHJvdmlkZXIgdG8gYmUgdXNlZCBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZCdXR0b24ucHJvdG90eXBlLnVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHByb3ZpZGVyLCAncHJvdmlkZXInLCBbRnVuY3Rpb25dKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZCdXR0b24ucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAod2lkZ2V0LCBmb250LCBwcm92aWRlcikge1xuICAgICAgICB2YXIgYXBQcm92aWRlciA9IHByb3ZpZGVyICE9PSBudWxsICYmIHByb3ZpZGVyICE9PSB2b2lkIDAgPyBwcm92aWRlciA6IGRlZmF1bHRCdXR0b25BcHBlYXJhbmNlUHJvdmlkZXI7XG4gICAgICAgIHZhciBhcHBlYXJhbmNlcyA9IG5vcm1hbGl6ZUFwcGVhcmFuY2UoYXBQcm92aWRlcih0aGlzLCB3aWRnZXQsIGZvbnQpKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlV2l0aEZvbnQod2lkZ2V0LCBmb250LCBhcHBlYXJhbmNlcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRm9ybS5nZXRCdXR0b25dXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlIGFuXG4gICAgICogPiBpbnN0YW5jZSBvZiBbW1BERkJ1dHRvbl1dIGZvciB5b3UuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgW1tQREZCdXR0b25dXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9QdXNoQnV0dG9uIGFuZCByZWZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvUHVzaEJ1dHRvbiBUaGUgdW5kZXJseWluZyBgUERGQWNyb1B1c2hCdXR0b25gIGZvciB0aGlzIGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGlzIGJ1dHRvbiB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZCdXR0b24ub2YgPSBmdW5jdGlvbiAoYWNyb1B1c2hCdXR0b24sIHJlZiwgZG9jKSB7IHJldHVybiBuZXcgUERGQnV0dG9uKGFjcm9QdXNoQnV0dG9uLCByZWYsIGRvYyk7IH07XG4gICAgcmV0dXJuIFBERkJ1dHRvbjtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkJ1dHRvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkJ1dHRvbi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZQYWdlIGZyb20gXCIuLi9QREZQYWdlXCI7XG5pbXBvcnQgeyBub3JtYWxpemVBcHBlYXJhbmNlLCBkZWZhdWx0Q2hlY2tCb3hBcHBlYXJhbmNlUHJvdmlkZXIsIH0gZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmltcG9ydCB7IHJnYiB9IGZyb20gXCIuLi9jb2xvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgUERGRmllbGQsIHsgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucywgfSBmcm9tIFwiLi9QREZGaWVsZFwiO1xuaW1wb3J0IHsgUERGTmFtZSwgUERGRGljdCwgUERGQWNyb0NoZWNrQm94LCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0T3JVbmRlZmluZWQgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIGNoZWNrIGJveCBmaWVsZCBvZiBhIFtbUERGRm9ybV1dLlxuICpcbiAqIFtbUERGQ2hlY2tCb3hdXSBmaWVsZHMgYXJlIGludGVyYWN0aXZlIGJveGVzIHRoYXQgdXNlcnMgY2FuIGNsaWNrIHdpdGggdGhlaXJcbiAqIG1vdXNlLiBUaGlzIHR5cGUgb2YgW1tQREZGaWVsZF1dIGhhcyB0d28gc3RhdGVzOiBgb25gIGFuZCBgb2ZmYC4gVGhlIHB1cnBvc2VcbiAqIG9mIGEgY2hlY2sgYm94IGlzIHRvIGVuYWJsZSB1c2VycyB0byBzZWxlY3QgZnJvbSBvbmUgb3IgbW9yZSBvcHRpb25zLCB3aGVyZVxuICogZWFjaCBvcHRpb24gaXMgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgY2hlY2sgYm94LiBDaGVjayBib3hlcyBhcmUgdHlwaWNhbGx5XG4gKiBzcXVhcmUgaW4gc2hhcGUgYW5kIGRpc3BsYXkgYSBjaGVjayBtYXJrIHdoZW4gdGhleSBhcmUgaW4gdGhlIGBvbmAgc3RhdGUuXG4gKi9cbnZhciBQREZDaGVja0JveCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQ2hlY2tCb3gsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQ2hlY2tCb3goYWNyb0NoZWNrQm94LCByZWYsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBhY3JvQ2hlY2tCb3gsIHJlZiwgZG9jKSB8fCB0aGlzO1xuICAgICAgICBhc3NlcnRJcyhhY3JvQ2hlY2tCb3gsICdhY3JvQ2hlY2tCb3gnLCBbXG4gICAgICAgICAgICBbUERGQWNyb0NoZWNrQm94LCAnUERGQWNyb0NoZWNrQm94J10sXG4gICAgICAgIF0pO1xuICAgICAgICBfdGhpcy5hY3JvRmllbGQgPSBhY3JvQ2hlY2tCb3g7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFyayB0aGlzIGNoZWNrIGJveC4gVGhpcyBvcGVyYXRpb24gaXMgYW5hbG9nb3VzIHRvIGEgaHVtYW4gdXNlciBjbGlja2luZ1xuICAgICAqIGEgY2hlY2sgYm94IHRvIGZpbGwgaXQgaW4gYSBQREYgcmVhZGVyLiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGVcbiAgICAgKiB1bmRlcmx5aW5nIHN0YXRlIG9mIHRoZSBjaGVjayBib3ggZmllbGQgdG8gaW5kaWNhdGUgaXQgaGFzIGJlZW4gc2VsZWN0ZWQuXG4gICAgICogUERGIGxpYnJhcmllcyBhbmQgcmVhZGVycyB3aWxsIGJlIGFibGUgdG8gZXh0cmFjdCB0aGlzIHZhbHVlIGZyb20gdGhlXG4gICAgICogc2F2ZWQgZG9jdW1lbnQgYW5kIGRldGVybWluZSB0aGF0IGl0IHdhcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2hlY2tCb3ggPSBmb3JtLmdldENoZWNrQm94KCdzb21lLmNoZWNrQm94LmZpZWxkJylcbiAgICAgKiBjaGVja0JveC5jaGVjaygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyBjaGVjayBib3ggYXMgZGlydHksIGNhdXNpbmcgaXRzIGFwcGVhcmFuY2VcbiAgICAgKiBzdHJlYW1zIHRvIGJlIHVwZGF0ZWQgd2hlbiBlaXRoZXIgW1tQREZEb2N1bWVudC5zYXZlXV0gb3JcbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIGlzIGNhbGxlZC4gVGhlIHVwZGF0ZWQgYXBwZWFyYW5jZVxuICAgICAqIHN0cmVhbXMgd2lsbCBkaXNwbGF5IGEgY2hlY2sgbWFyayBpbnNpZGUgdGhlIHdpZGdldHMgb2YgdGhpcyBjaGVjayBib3hcbiAgICAgKiBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIG9uVmFsdWUgPSAoX2EgPSB0aGlzLmFjcm9GaWVsZC5nZXRPblZhbHVlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFBERk5hbWUub2YoJ1llcycpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlKG9uVmFsdWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoaXMgY2hlY2sgYm94LiBUaGlzIG9wZXJhdGlvbiBpcyBhbmFsb2dvdXMgdG8gYSBodW1hbiB1c2VyIGNsaWNraW5nXG4gICAgICogYSBjaGVjayBib3ggdG8gdW5tYXJrIGl0IGluIGEgUERGIHJlYWRlci4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlXG4gICAgICogdW5kZXJseWluZyBzdGF0ZSBvZiB0aGUgY2hlY2sgYm94IGZpZWxkIHRvIGluZGljYXRlIGl0IGhhcyBiZWVuIGRlc2VsZWN0ZWQuXG4gICAgICogUERGIGxpYnJhcmllcyBhbmQgcmVhZGVycyB3aWxsIGJlIGFibGUgdG8gZXh0cmFjdCB0aGlzIHZhbHVlIGZyb20gdGhlXG4gICAgICogc2F2ZWQgZG9jdW1lbnQgYW5kIGRldGVybWluZSB0aGF0IGl0IHdhcyBub3Qgc2VsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5nZXRDaGVja0JveCgnc29tZS5jaGVja0JveC5maWVsZCcpXG4gICAgICogY2hlY2tCb3gudW5jaGVjaygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyBjaGVjayBib3ggYXMgZGlydHkuIFNlZSBbW1BERkNoZWNrQm94LmNoZWNrXV1cbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUudW5jaGVjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZShQREZOYW1lLm9mKCdPZmYnKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGNoZWNrIGJveCBpcyBzZWxlY3RlZCAoZWl0aGVyIGJ5IGEgaHVtYW4gdXNlciB2aWFcbiAgICAgKiBhIFBERiByZWFkZXIsIG9yIGVsc2UgcHJvZ3JhbW1hdGljYWxseSB2aWEgc29mdHdhcmUpLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5nZXRDaGVja0JveCgnc29tZS5jaGVja0JveC5maWVsZCcpXG4gICAgICogaWYgKGNoZWNrQm94LmlzQ2hlY2tlZCgpKSBjb25zb2xlLmxvZygnY2hlY2sgYm94IGlzIHNlbGVjdGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGNoZWNrIGJveCBpcyBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUuaXNDaGVja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb25WYWx1ZSA9IHRoaXMuYWNyb0ZpZWxkLmdldE9uVmFsdWUoKTtcbiAgICAgICAgcmV0dXJuICEhb25WYWx1ZSAmJiBvblZhbHVlID09PSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGlzIGNoZWNrIGJveCBvbiB0aGUgc3BlY2lmaWVkIHBhZ2UuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uY3JlYXRlQ2hlY2tCb3goJ3NvbWUuY2hlY2tCb3guZmllbGQnKVxuICAgICAqXG4gICAgICogY2hlY2tCb3guYWRkVG9QYWdlKHBhZ2UsIHtcbiAgICAgKiAgIHg6IDUwLFxuICAgICAqICAgeTogNzUsXG4gICAgICogICB3aWR0aDogMjUsXG4gICAgICogICBoZWlnaHQ6IDI1LFxuICAgICAqICAgdGV4dENvbG9yOiByZ2IoMSwgMCwgMCksXG4gICAgICogICBiYWNrZ3JvdW5kQ29sb3I6IHJnYigwLCAxLCAwKSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiByZ2IoMCwgMCwgMSksXG4gICAgICogICBib3JkZXJXaWR0aDogMixcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcyg5MCksXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHdpZGdldCBmb3IgdGhpcyBjaGVjayBib3ggZmllbGQuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgdG8gd2hpY2ggdGhpcyBjaGVjayBib3ggd2lkZ2V0IHNob3VsZCBiZSBhZGRlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gYWRkaW5nIHRoaXMgY2hlY2sgYm94IHdpZGdldC5cbiAgICAgKi9cbiAgICBQREZDaGVja0JveC5wcm90b3R5cGUuYWRkVG9QYWdlID0gZnVuY3Rpb24gKHBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2Y7XG4gICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgW1tQREZQYWdlLCAnUERGUGFnZSddXSk7XG4gICAgICAgIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKCEoJ3RleHRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLnRleHRDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JhY2tncm91bmRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJhY2tncm91bmRDb2xvciA9IHJnYigxLCAxLCAxKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdib3JkZXJXaWR0aCcgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlcldpZHRoID0gMTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGZvciB0aGlzIGNoZWNrIGJveFxuICAgICAgICB2YXIgd2lkZ2V0ID0gdGhpcy5jcmVhdGVXaWRnZXQoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwLFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwLFxuICAgICAgICAgICAgd2lkdGg6IChfYyA9IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDUwLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogNTAsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IG9wdGlvbnMudGV4dENvbG9yLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfZSA9IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDAsXG4gICAgICAgICAgICByb3RhdGU6IChfZiA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgaGlkZGVuOiBvcHRpb25zLmhpZGRlbixcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UucmVmLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIod2lkZ2V0LmRpY3QpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoaXMgZmllbGRcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuYWRkV2lkZ2V0KHdpZGdldFJlZik7XG4gICAgICAgIC8vIFNldCBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIHdpZGdldFxuICAgICAgICB3aWRnZXQuc2V0QXBwZWFyYW5jZVN0YXRlKFBERk5hbWUub2YoJ09mZicpKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgUERGTmFtZS5vZignWWVzJykpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoZSBnaXZlbiBwYWdlXG4gICAgICAgIHBhZ2Uubm9kZS5hZGRBbm5vdCh3aWRnZXRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYW55IG9mIHRoaXMgY2hlY2sgYm94J3Mgd2lkZ2V0cyBkbyBub3QgaGF2ZSBhblxuICAgICAqIGFwcGVhcmFuY2Ugc3RyZWFtIGZvciBpdHMgY3VycmVudCBzdGF0ZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ3NvbWUuY2hlY2tCb3guZmllbGQnKVxuICAgICAqIGlmIChjaGVja0JveC5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIGNvbnNvbGUubG9nKCdOZWVkcyB1cGRhdGUnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgY2hlY2sgYm94IG5lZWRzIGFuIGFwcGVhcmFuY2UgdXBkYXRlLlxuICAgICAqL1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlU3RhdGUoKTtcbiAgICAgICAgICAgIHZhciBub3JtYWwgPSAoX2EgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZXMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vcm1hbDtcbiAgICAgICAgICAgIGlmICghKG5vcm1hbCBpbnN0YW5jZW9mIFBERkRpY3QpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKHN0YXRlICYmICFub3JtYWwuaGFzKHN0YXRlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGNoZWNrIGJveCdzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBjaGVjayBib3hlcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uZ2V0Q2hlY2tCb3goJ3NvbWUuY2hlY2tCb3guZmllbGQnKVxuICAgICAqIGNoZWNrQm94LmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVBcHBlYXJhbmNlcygpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBjaGVjayBib3gncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGdpdmVuIGFwcGVhcmFuY2UgcHJvdmlkZXIuIElmIG5vIGBwcm92aWRlcmAgaXMgcGFzc2VkLCB0aGUgZGVmYXVsdFxuICAgICAqIGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIGNoZWNrIGJveHMgd2lsbCBiZSB1c2VkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5nZXRDaGVja0JveCgnc29tZS5jaGVja0JveC5maWVsZCcpXG4gICAgICogY2hlY2tCb3gudXBkYXRlQXBwZWFyYW5jZXMoKGZpZWxkLCB3aWRnZXQpID0+IHtcbiAgICAgKiAgIC4uLlxuICAgICAqICAgcmV0dXJuIHtcbiAgICAgKiAgICAgbm9ybWFsOiB7IG9uOiBkcmF3Q2hlY2tCb3goLi4uKSwgb2ZmOiBkcmF3Q2hlY2tCb3goLi4uKSB9LFxuICAgICAqICAgICBkb3duOiB7IG9uOiBkcmF3Q2hlY2tCb3goLi4uKSwgb2ZmOiBkcmF3Q2hlY2tCb3goLi4uKSB9LFxuICAgICAqICAgfVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIE9wdGlvbmFsbHksIHRoZSBhcHBlYXJhbmNlIHByb3ZpZGVyIHRvIGJlIHVzZWQgZm9yXG4gICAgICogICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGQ2hlY2tCb3gucHJvdG90eXBlLnVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQocHJvdmlkZXIsICdwcm92aWRlcicsIFtGdW5jdGlvbl0pO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgb25WYWx1ZSA9IChfYSA9IHdpZGdldC5nZXRPblZhbHVlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFBERk5hbWUub2YoJ1llcycpO1xuICAgICAgICAgICAgaWYgKCFvblZhbHVlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgb25WYWx1ZSwgcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzQ2xlYW4oKTtcbiAgICB9O1xuICAgIFBERkNoZWNrQm94LnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgb25WYWx1ZSwgcHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIGFwUHJvdmlkZXIgPSBwcm92aWRlciAhPT0gbnVsbCAmJiBwcm92aWRlciAhPT0gdm9pZCAwID8gcHJvdmlkZXIgOiBkZWZhdWx0Q2hlY2tCb3hBcHBlYXJhbmNlUHJvdmlkZXI7XG4gICAgICAgIHZhciBhcHBlYXJhbmNlcyA9IG5vcm1hbGl6ZUFwcGVhcmFuY2UoYXBQcm92aWRlcih0aGlzLCB3aWRnZXQpKTtcbiAgICAgICAgdGhpcy51cGRhdGVPbk9mZldpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBvblZhbHVlLCBhcHBlYXJhbmNlcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRm9ybS5nZXRDaGVja0JveF1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGQ2hlY2tCb3hdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGQ2hlY2tCb3hdXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9DaGVja0JveCBhbmQgcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb0NoZWNrQm94IFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvQ2hlY2tCb3hgIGZvciB0aGlzIGNoZWNrIGJveC5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIGNoZWNrIGJveC5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGlzIGNoZWNrIGJveCB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZDaGVja0JveC5vZiA9IGZ1bmN0aW9uIChhY3JvQ2hlY2tCb3gsIHJlZiwgZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQ2hlY2tCb3goYWNyb0NoZWNrQm94LCByZWYsIGRvYyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQ2hlY2tCb3g7XG59KFBERkZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZDaGVja0JveDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkNoZWNrQm94LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4uL1BERlBhZ2VcIjtcbmltcG9ydCBQREZGb250IGZyb20gXCIuLi9QREZGb250XCI7XG5pbXBvcnQgUERGRmllbGQsIHsgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucywgfSBmcm9tIFwiLi9QREZGaWVsZFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQXBwZWFyYW5jZSwgZGVmYXVsdERyb3Bkb3duQXBwZWFyYW5jZVByb3ZpZGVyLCB9IGZyb20gXCIuL2FwcGVhcmFuY2VzXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgUERGSGV4U3RyaW5nLCBQREZTdHJlYW0sIFBERkFjcm9Db21ib0JveCwgQWNyb0Nob2ljZUZsYWdzLCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0T3JVbmRlZmluZWQsIGFzc2VydFBvc2l0aXZlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSBkcm9wZG93biBmaWVsZCBvZiBhIFtbUERGRm9ybV1dLlxuICpcbiAqIFtbUERGRHJvcGRvd25dXSBmaWVsZHMgYXJlIGludGVyYWN0aXZlIHRleHQgYm94ZXMgdGhhdCBkaXNwbGF5IGEgc2luZ2xlXG4gKiBlbGVtZW50ICh0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbHVlKS4gVGhlIHB1cnBvc2Ugb2YgYSBkcm9wZG93biBpcyB0b1xuICogZW5hYmxlIHVzZXJzIHRvIHNlbGVjdCBhIHNpbmdsZSBvcHRpb24gZnJvbSBhIHNldCBvZiBwb3NzaWJsZSBvcHRpb25zLiBVc2Vyc1xuICogY2FuIGNsaWNrIG9uIGEgZHJvcGRvd24gdG8gdmlldyB0aGUgZnVsbCBsaXN0IG9mIG9wdGlvbnMgaXQgcHJvdmlkZXMuXG4gKiBDbGlja2luZyBvbiBhbiBvcHRpb24gaW4gdGhlIGxpc3Qgd2lsbCBjYXVzZSBpdCB0byBiZSBzZWxlY3RlZCBhbmQgZGlzcGxheWVkXG4gKiBpbiB0aGUgZHJvcGRvd24ncyB0ZXh0IGJveC4gU29tZSBkcm9wZG93bnMgYWxsb3cgdXNlcnMgdG8gZW50ZXIgdGV4dFxuICogZGlyZWN0bHkgaW50byB0aGUgYm94IGZyb20gdGhlaXIga2V5Ym9hcmQsIHJhdGhlciB0aGFuIG9ubHkgYmVpbmcgYWxsb3dlZCB0b1xuICogY2hvb3NlIGFuIG9wdGlvbiBmcm9tIHRoZSBsaXN0IChzZWUgW1tQREZEcm9wZG93bi5pc0VkaXRhYmxlXV0pLlxuICovXG52YXIgUERGRHJvcGRvd24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkRyb3Bkb3duLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkRyb3Bkb3duKGFjcm9Db21ib0JveCwgcmVmLCBkb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgYWNyb0NvbWJvQm94LCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb0NvbWJvQm94LCAnYWNyb0NvbWJvQm94JywgW1xuICAgICAgICAgICAgW1BERkFjcm9Db21ib0JveCwgJ1BERkFjcm9Db21ib0JveCddLFxuICAgICAgICBdKTtcbiAgICAgICAgX3RoaXMuYWNyb0ZpZWxkID0gYWNyb0NvbWJvQm94O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgb3B0aW9ucyBmb3IgdGhpcyBkcm9wZG93bi4gVGhlc2Ugb3B0aW9ucyB3aWxsIGJlXG4gICAgICogZGlzcGxheWVkIHRvIHVzZXJzIHdobyBjbGljayBvbiB0aGlzIGRyb3Bkb3duIGluIGEgUERGIHJlYWRlci5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogY29uc3Qgb3B0aW9ucyA9IGRyb3Bkb3duLmdldE9wdGlvbnMoKVxuICAgICAqIGNvbnNvbGUubG9nKCdEcm9wZG93biBvcHRpb25zOicsIG9wdGlvbnMpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIG9wdGlvbnMgZm9yIHRoaXMgZHJvcGRvd24uXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByYXdPcHRpb25zID0gdGhpcy5hY3JvRmllbGQuZ2V0T3B0aW9ucygpO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IG5ldyBBcnJheShyYXdPcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSByYXdPcHRpb25zW2lkeF0sIGRpc3BsYXkgPSBfYS5kaXNwbGF5LCB2YWx1ZSA9IF9hLnZhbHVlO1xuICAgICAgICAgICAgb3B0aW9uc1tpZHhdID0gKGRpc3BsYXkgIT09IG51bGwgJiYgZGlzcGxheSAhPT0gdm9pZCAwID8gZGlzcGxheSA6IHZhbHVlKS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIG9wdGlvbnMgZm9yIHRoaXMgZHJvcGRvd24uIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHRoYXQgd2VyZVxuICAgICAqIHNlbGVjdGVkIGJ5IGEgaHVtYW4gdXNlciB2aWEgYSBQREYgcmVhZGVyLCBvciBwcm9ncmFtYXRpY2FsbHkgdmlhXG4gICAgICogc29mdHdhcmUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGNvbnN0IHNlbGVjdGlvbnMgPSBkcm9wZG93bi5nZXRTZWxlY3RlZCgpXG4gICAgICogY29uc29sZS5sb2coJ0Ryb3Bkb3duIHNlbGVjdGlvbnM6Jywgc2VsZWN0aW9ucylcbiAgICAgKiBgYGBcbiAgICAgKiA+ICoqTk9URToqKiBOb3RlIHRoYXQgUERGIHJlYWRlcnMgb25seSBkaXNwbGF5IG9uZSBzZWxlY3RlZCBvcHRpb24gd2hlblxuICAgICAqID4gcmVuZGVyaW5nIGRyb3Bkb3ducy4gSG93ZXZlciwgdGhlIFBERiBzcGVjaWZpY2F0aW9uIGRvZXMgYWxsb3cgZm9yXG4gICAgICogPiBtdWx0aXBsZSB2YWx1ZXMgdG8gYmUgc2VsZWN0ZWQgaW4gYSBkcm9wZG93bi4gQXMgc3VjaCwgdGhlIGBwZGYtbGliYFxuICAgICAqID4gQVBJIHN1cHBvcnRzIHRoaXMuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgdGhlIGFycmF5IHJldHVybmVkIGJ5IHRoaXNcbiAgICAgKiA+IG1ldGhvZCB3aWxsIGNvbnRhaW4gb25seSBhIHNpbmdsZSBlbGVtZW50IChvciBubyBlbGVtZW50cykuXG4gICAgICogQHJldHVybnMgVGhlIHNlbGVjdGVkIG9wdGlvbnMgaW4gdGhpcyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZ2V0U2VsZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRWYWx1ZXMoKTtcbiAgICAgICAgdmFyIHNlbGVjdGVkID0gbmV3IEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFtpZHhdID0gdmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxlY3RlZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGlzdCBvZiBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBkcm9wZG93bi4gVGhlc2UgYXJlXG4gICAgICogdGhlIHZhbHVlcyB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlIGZvciB1c2VycyB0byBzZWxlY3Qgd2hlbiB0aGV5IHZpZXcgdGhpc1xuICAgICAqIGRyb3Bkb3duIGluIGEgUERGIHJlYWRlci4gTm90ZSB0aGF0IHByZWV4aXN0aW5nIG9wdGlvbnMgZm9yIHRoaXMgZHJvcGRvd25cbiAgICAgKiB3aWxsIGJlIHJlbW92ZWQuIE9ubHkgdGhlIHZhbHVlcyBwYXNzZWQgYXMgYG9wdGlvbnNgIHdpbGwgYmUgYXZhaWxhYmxlIHRvXG4gICAgICogc2VsZWN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdwbGFuZXRzLmRyb3Bkb3duJylcbiAgICAgKiBkcm9wZG93bi5zZXRPcHRpb25zKFsnRWFydGgnLCAnTWFycycsICdQbHV0bycsICdWZW51cyddKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGlzIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5zZXRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucywgJ29wdGlvbnMnLCBbQXJyYXldKTtcbiAgICAgICAgdmFyIG9wdGlvbk9iamVjdHMgPSBuZXcgQXJyYXkob3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgb3B0aW9uT2JqZWN0c1tpZHhdID0geyB2YWx1ZTogUERGSGV4U3RyaW5nLmZyb21UZXh0KG9wdGlvbnNbaWR4XSkgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRPcHRpb25zKG9wdGlvbk9iamVjdHMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIHRvIHRoZSBsaXN0IG9mIG9wdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGRyb3Bkb3duLiBVc2Vyc1xuICAgICAqIHdpbGwgYmUgYWJsZSB0byBzZWxlY3QgdGhlc2UgdmFsdWVzIGluIGEgUERGIHJlYWRlci4gSW4gYWRkaXRpb24gdG8gdGhlXG4gICAgICogdmFsdWVzIHBhc3NlZCBhcyBgb3B0aW9uc2AsIGFueSBwcmVleGlzdGluZyBvcHRpb25zIGZvciB0aGlzIGRyb3Bkb3duIHdpbGxcbiAgICAgKiBzdGlsbCBiZSBhdmFpbGFibGUgZm9yIHVzZXJzIHRvIHNlbGVjdC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bigncm9ja2V0cy5kcm9wZG93bicpXG4gICAgICogZHJvcGRvd24uYWRkT3B0aW9ucyhbJ1NhdHVybiBJVicsICdGYWxjb24gSGVhdnknXSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBOZXcgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhpcyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuYWRkT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMsICdvcHRpb25zJywgWydzdHJpbmcnLCBBcnJheV0pO1xuICAgICAgICB2YXIgb3B0aW9uc0FyciA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogW29wdGlvbnNdO1xuICAgICAgICB2YXIgZXhpc3RpbmdPcHRpb25zID0gdGhpcy5hY3JvRmllbGQuZ2V0T3B0aW9ucygpO1xuICAgICAgICB2YXIgbmV3T3B0aW9ucyA9IG5ldyBBcnJheShvcHRpb25zQXJyLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnNBcnIubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBuZXdPcHRpb25zW2lkeF0gPSB7IHZhbHVlOiBQREZIZXhTdHJpbmcuZnJvbVRleHQob3B0aW9uc0FycltpZHhdKSB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldE9wdGlvbnMoZXhpc3RpbmdPcHRpb25zLmNvbmNhdChuZXdPcHRpb25zKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZWxlY3Qgb25lIG9yIG1vcmUgdmFsdWVzIGZvciB0aGlzIGRyb3Bkb3duLiBUaGlzIG9wZXJhdGlvbiBpcyBhbmFsb2dvdXNcbiAgICAgKiB0byBhIGh1bWFuIHVzZXIgb3BlbmluZyB0aGUgZHJvcGRvd24gaW4gYSBQREYgcmVhZGVyIGFuZCBjbGlja2luZyBvbiBhXG4gICAgICogdmFsdWUgdG8gc2VsZWN0IGl0LiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBzdGF0ZSBvZiB0aGVcbiAgICAgKiBkcm9wZG93biB0byBpbmRpY2F0ZSB3aGljaCB2YWx1ZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLiBQREYgbGlicmFyaWVzIGFuZFxuICAgICAqIHJlYWRlcnMgd2lsbCBiZSBhYmxlIHRvIGV4dHJhY3QgdGhlc2UgdmFsdWVzIGZyb20gdGhlIHNhdmVkIGRvY3VtZW50IGFuZFxuICAgICAqIGRldGVybWluZSB3aGljaCB2YWx1ZXMgd2VyZSBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdiZXN0LnN1cGVyaGVyby5kcm9wZG93bicpXG4gICAgICogZHJvcGRvd24uc2VsZWN0KCdPbmUgUHVuY2ggTWFuJylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIGRyb3Bkb3duIGFzIGRpcnR5LCBjYXVzaW5nIGl0cyBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB0byBiZSB1cGRhdGVkIHdoZW4gZWl0aGVyIFtbUERGRG9jdW1lbnQuc2F2ZV1dIG9yXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBpcyBjYWxsZWQuIFRoZSB1cGRhdGVkIHN0cmVhbXMgd2lsbFxuICAgICAqIGRpc3BsYXkgdGhlIHNlbGVjdGVkIG9wdGlvbiBpbnNpZGUgdGhlIHdpZGdldHMgb2YgdGhpcyBkcm9wZG93bi5cbiAgICAgKlxuICAgICAqICoqSU1QT1JUQU5UOioqIFRoZSBkZWZhdWx0IGZvbnQgdXNlZCB0byB1cGRhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIGlzXG4gICAgICogW1tTdGFuZGFyZEZvbnRzLkhlbHZldGljYV1dLiBOb3RlIHRoYXQgdGhpcyBpcyBhIFdpbkFuc2kgZm9udC4gVGhpcyBtZWFuc1xuICAgICAqIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBzZWxlY3RlZCBvcHRpb24gZm9yIHRoaXMgZmllbGRcbiAgICAgKiBjb250YWlucyBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIFdpbkFuc2kgY2hhcmFjdGVyIHNldCAodGhlIGxhdGluIGFscGhhYmV0KS5cbiAgICAgKlxuICAgICAqIEVtYmVkZGluZyBhIGN1c3RvbSBmb250IGFuZCBwYXNzaW5nIGl0IHRvXG4gICAgICogW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXSBvciBbW1BERkRyb3Bkb3duLnVwZGF0ZUFwcGVhcmFuY2VzXV1cbiAgICAgKiBhbGxvd3MgeW91IHRvIGdlbmVyYXRlIGFwcGVhcmFuY2Ugc3RyZWFtcyB3aXRoIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGVcbiAgICAgKiBsYXRpbiBhbHBoYWJldCAoYXNzdW1pbmcgdGhlIGN1c3RvbSBmb250IHN1cHBvcnRzIHRoZW0pLlxuICAgICAqXG4gICAgICogU2VsZWN0aW5nIGFuIG9wdGlvbiB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgZHJvcGRvd24ncyBvcHRpb24gbGlzdFxuICAgICAqIChzZWUgW1tQREZEcm9wZG93bi5nZXRPcHRpb25zXV0pIHdpbGwgZW5hYmxlIGVkaXRpbmcgb24gdGhpcyBkcm9wZG93blxuICAgICAqIChzZWUgW1tQREZEcm9wZG93bi5lbmFibGVFZGl0aW5nXV0pLlxuICAgICAqXG4gICAgICogPiAqKk5PVEU6KiogUERGIHJlYWRlcnMgb25seSBkaXNwbGF5IG9uZSBzZWxlY3RlZCBvcHRpb24gd2hlbiByZW5kZXJpbmdcbiAgICAgKiA+IGRyb3Bkb3ducy4gSG93ZXZlciwgdGhlIFBERiBzcGVjaWZpY2F0aW9uIGRvZXMgYWxsb3cgZm9yIG11bHRpcGxlIHZhbHVlc1xuICAgICAqID4gdG8gYmUgc2VsZWN0ZWQgaW4gYSBkcm9wZG93bi4gQXMgc3VjaCwgdGhlIGBwZGYtbGliYCBBUEkgc3VwcG9ydHMgdGhpcy5cbiAgICAgKiA+IEhvd2V2ZXIsIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBzZWxlY3QgbW9yZSB0aGFuIG9uZSB2YWx1ZSB3aXRoIHRoaXNcbiAgICAgKiA+IG1ldGhvZCwgYXMgb25seSBvbmUgd2lsbCBiZSB2aXNpYmxlLiBbW1BERk9wdGlvbkxpc3RdXSBmaWVsZHMgYXJlIGJldHRlclxuICAgICAqID4gc3VpdGVkIGZvciBkaXNwbGF5aW5nIG11bHRpcGxlIHNlbGVjdGVkIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHNlbGVjdGVkLlxuICAgICAqIEBwYXJhbSBtZXJnZSBXaGV0aGVyIG9yIG5vdCBleGlzdGluZyBzZWxlY3Rpb25zIHNob3VsZCBiZSBwcmVzZXJ2ZWQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChvcHRpb25zLCBtZXJnZSkge1xuICAgICAgICBpZiAobWVyZ2UgPT09IHZvaWQgMCkgeyBtZXJnZSA9IGZhbHNlOyB9XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMsICdvcHRpb25zJywgWydzdHJpbmcnLCBBcnJheV0pO1xuICAgICAgICBhc3NlcnRJcyhtZXJnZSwgJ21lcmdlJywgWydib29sZWFuJ10pO1xuICAgICAgICB2YXIgb3B0aW9uc0FyciA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogW29wdGlvbnNdO1xuICAgICAgICB2YXIgdmFsaWRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICAgIHZhciBoYXNDdXN0b21PcHRpb24gPSBvcHRpb25zQXJyLmZpbmQoZnVuY3Rpb24gKG9wdGlvbikgeyByZXR1cm4gIXZhbGlkT3B0aW9ucy5pbmNsdWRlcyhvcHRpb24pOyB9KTtcbiAgICAgICAgaWYgKGhhc0N1c3RvbU9wdGlvbilcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlRWRpdGluZygpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIGlmIChvcHRpb25zQXJyLmxlbmd0aCA+IDEgfHwgKG9wdGlvbnNBcnIubGVuZ3RoID09PSAxICYmIG1lcmdlKSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVNdWx0aXNlbGVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkob3B0aW9uc0Fyci5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zQXJyLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFsdWVzW2lkeF0gPSBQREZIZXhTdHJpbmcuZnJvbVRleHQob3B0aW9uc0FycltpZHhdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgICAgIHZhciBleGlzdGluZ1ZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlcygpO1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWVzKGV4aXN0aW5nVmFsdWVzLmNvbmNhdCh2YWx1ZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlcyh2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhciBhbGwgc2VsZWN0ZWQgdmFsdWVzIGZvciB0aGlzIGRyb3Bkb3duLiBUaGlzIG9wZXJhdGlvbiBpcyBlcXVpdmFsZW50XG4gICAgICogdG8gc2VsZWN0aW5nIGFuIGVtcHR5IGxpc3QuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHN0YXRlXG4gICAgICogb2YgdGhlIGRyb3Bkb3duIHRvIGluZGljYXRlIHRoYXQgbm8gdmFsdWVzIGhhdmUgYmVlbiBzZWxlY3RlZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uY2xlYXIoKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZSBbW1BERkRyb3Bkb3duLnNlbGVjdF1dXG4gICAgICogZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlcyhbXSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZvbnQgc2l6ZSBmb3IgdGhpcyBmaWVsZC4gTGFyZ2VyIGZvbnQgc2l6ZXMgd2lsbCByZXN1bHQgaW4gbGFyZ2VyXG4gICAgICogdGV4dCBiZWluZyBkaXNwbGF5ZWQgd2hlbiBQREYgcmVhZGVycyByZW5kZXIgdGhpcyBkcm9wZG93bi4gRm9udCBzaXplcyBtYXlcbiAgICAgKiBiZSBpbnRlZ2VyIG9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIFN1cHBseWluZyBhIG5lZ2F0aXZlIGZvbnQgc2l6ZSB3aWxsXG4gICAgICogY2F1c2UgdGhpcyBtZXRob2QgdG8gdGhyb3cgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uc2V0Rm9udFNpemUoNClcbiAgICAgKiBkcm9wZG93bi5zZXRGb250U2l6ZSgxNS43KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPiBUaGlzIG1ldGhvZCBkZXBlbmRzIHVwb24gdGhlIGV4aXN0ZW5jZSBvZiBhIGRlZmF1bHQgYXBwZWFyYW5jZVxuICAgICAqID4gKGAvREFgKSBzdHJpbmcuIElmIHRoaXMgZmllbGQgZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgYXBwZWFyYW5jZSBzdHJpbmcsXG4gICAgICogPiBvciB0aGF0IHN0cmluZyBkb2VzIG5vdCBjb250YWluIGEgZm9udCBzaXplICh2aWEgdGhlIGBUZmAgb3BlcmF0b3IpLFxuICAgICAqID4gdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvbnRTaXplIFRoZSBmb250IHNpemUgdG8gYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0ZXh0IGluIHRoaXMgZmllbGQuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLnNldEZvbnRTaXplID0gZnVuY3Rpb24gKGZvbnRTaXplKSB7XG4gICAgICAgIGFzc2VydFBvc2l0aXZlKGZvbnRTaXplLCAnZm9udFNpemUnKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB1c2VycyBhcmUgYWxsb3dlZCB0byBlZGl0IHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGlzXG4gICAgICogZHJvcGRvd24gZGlyZWN0bHkgYW5kIGFyZSBub3QgY29uc3RyYWluZWQgYnkgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlXG4gICAgICogb3B0aW9ucy4gU2VlIFtbUERGRHJvcGRvd24uZW5hYmxlRWRpdGluZ11dIGFuZFxuICAgICAqIFtbUERGRHJvcGRvd24uZGlzYWJsZUVkaXRpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGlmIChkcm9wZG93bi5pc0VkaXRhYmxlKCkpIGNvbnNvbGUubG9nKCdFZGl0aW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZHJvcGRvd24gaXMgZWRpdGFibGUuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmlzRWRpdGFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5FZGl0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IHVzZXJzIHRvIGVkaXQgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoaXMgZHJvcGRvd24gaW4gUERGIHJlYWRlcnNcbiAgICAgKiB3aXRoIHRoZWlyIGtleWJvYXJkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoaXMgZHJvcGRvd25cbiAgICAgKiB3aWxsIG5vdCBiZSBjb25zdHJhaW5lZCBieSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgb3B0aW9ucy4gSG93ZXZlciwgaWYgdGhpc1xuICAgICAqIGRyb3Bkb3duIGhhcyBhbnkgYXZhaWxhYmxlIG9wdGlvbnMsIHVzZXJzIHdpbGwgc3RpbGwgYmUgYWxsb3dlZCB0byBzZWxlY3RcbiAgICAgKiBmcm9tIHRoYXQgbGlzdC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZW5hYmxlRWRpdGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmVuYWJsZUVkaXRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuRWRpdCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgYWxsb3cgdXNlcnMgdG8gZWRpdCB0aGUgc2VsZWN0ZWQgdmFsdWUgb2YgdGhpcyBkcm9wZG93biBpbiBQREZcbiAgICAgKiByZWFkZXJzIHdpdGggdGhlaXIga2V5Ym9hcmQuIFRoaXMgd2lsbCBjb25zdHJhaW4gdGhlIHNlbGVjdGVkIHZhbHVlIG9mXG4gICAgICogdGhpcyBkcm9wZG93biB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgb3B0aW9ucy4gVXNlcnMgd2lsbCBvbmx5IGJlIGFibGVcbiAgICAgKiB0byBzZWxlY3QgYW4gb3B0aW9uIGZyb20gdGhhdCBsaXN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5kaXNhYmxlRWRpdGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmRpc2FibGVFZGl0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkVkaXQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBvcHRpb24gbGlzdCBvZiB0aGlzIGRyb3Bkb3duIGlzIGFsd2F5cyBkaXNwbGF5ZWRcbiAgICAgKiBpbiBhbHBoYWJldGljYWwgb3JkZXIsIGlycmVzcGVjdGl2ZSBvZiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIG9wdGlvbnNcbiAgICAgKiB3ZXJlIGFkZGVkIHRvIHRoZSBkcm9wZG93bi4gU2VlIFtbUERGRHJvcGRvd24uZW5hYmxlU29ydGluZ11dIGFuZFxuICAgICAqIFtbUERGRHJvcGRvd24uZGlzYWJsZVNvcnRpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGlmIChkcm9wZG93bi5pc1NvcnRlZCgpKSBjb25zb2xlLmxvZygnU29ydGluZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGRyb3Bkb3duJ3Mgb3B0aW9ucyBhcmUgc29ydGVkLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5pc1NvcnRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLlNvcnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWx3YXlzIGRpc3BsYXkgdGhlIG9wdGlvbiBsaXN0IG9mIHRoaXMgZHJvcGRvd24gaW4gYWxwaGFiZXRpY2FsIG9yZGVyLFxuICAgICAqIGlycmVzcGVjdGl2ZSBvZiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIG9wdGlvbnMgd2VyZSBhZGRlZCB0byB0aGlzIGRyb3Bkb3duLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5lbmFibGVTb3J0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZW5hYmxlU29ydGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Tb3J0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbHdheXMgZGlzcGxheSB0aGUgb3B0aW9uIGxpc3Qgb2YgdGhpcyBkcm9wZG93biBpbiBhbHBoYWJldGljYWxcbiAgICAgKiBvcmRlci4gSW5zdGVhZCwgZGlzcGxheSB0aGUgb3B0aW9ucyBpbiB3aGljaGV2ZXIgb3JkZXIgdGhleSB3ZXJlIGFkZGVkXG4gICAgICogdG8gdGhlIGxpc3QuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5kaXNhYmxlU29ydGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmRpc2FibGVTb3J0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLlNvcnQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIG11bHRpcGxlIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIGZyb20gdGhpcyBkcm9wZG93bidzXG4gICAgICogb3B0aW9uIGxpc3QuIFNlZSBbW1BERkRyb3Bkb3duLmVuYWJsZU11bHRpc2VsZWN0XV0gYW5kXG4gICAgICogW1tQREZEcm9wZG93bi5kaXNhYmxlTXVsdGlzZWxlY3RdXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGlmIChkcm9wZG93bi5pc011bHRpc2VsZWN0KCkpIGNvbnNvbGUubG9nKCdNdWx0aXNlbGVjdCBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBtdWx0aXBsZSBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuaXNNdWx0aXNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IHVzZXJzIHRvIHNlbGVjdCBtb3JlIHRoYW4gb25lIG9wdGlvbiBmcm9tIHRoaXMgZHJvcGRvd24ncyBvcHRpb25cbiAgICAgKiBsaXN0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZW5hYmxlTXVsdGlzZWxlY3QoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5lbmFibGVNdWx0aXNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5NdWx0aVNlbGVjdCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgYWxsb3cgdXNlcnMgdG8gc2VsZWN0IG1vcmUgdGhhbiBvbmUgb3B0aW9uIGZyb20gdGhpcyBkcm9wZG93bidzXG4gICAgICogb3B0aW9uIGxpc3QuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5kaXNhYmxlTXVsdGlzZWxlY3QoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5kaXNhYmxlTXVsdGlzZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuTXVsdGlTZWxlY3QsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzZWxlY3RlZCBvcHRpb24gc2hvdWxkIGJlIHNwZWxsIGNoZWNrZWQgYnkgUERGXG4gICAgICogcmVhZGVycy4gU3BlbGwgY2hlY2tpbmcgd2lsbCBvbmx5IGJlIHBlcmZvcm1lZCBpZiB0aGlzIGRyb3Bkb3duIGFsbG93c1xuICAgICAqIGVkaXRpbmcgKHNlZSBbW1BERkRyb3Bkb3duLmlzRWRpdGFibGVdXSkuIFNlZVxuICAgICAqIFtbUERGRHJvcGRvd24uZW5hYmxlU3BlbGxDaGVja2luZ11dIGFuZFxuICAgICAqIFtbUERGRHJvcGRvd24uZGlzYWJsZVNwZWxsQ2hlY2tpbmddXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGlmIChkcm9wZG93bi5pc1NwZWxsQ2hlY2tlZCgpKSBjb25zb2xlLmxvZygnU3BlbGwgY2hlY2tpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBkcm9wZG93biBjYW4gYmUgc3BlbGwgY2hlY2tlZC5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuaXNTcGVsbENoZWNrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuRG9Ob3RTcGVsbENoZWNrKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFsbG93IFBERiByZWFkZXJzIHRvIHNwZWxsIGNoZWNrIHRoZSBzZWxlY3RlZCBvcHRpb24gb2YgdGhpcyBkcm9wZG93bi5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZW5hYmxlU3BlbGxDaGVja2luZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmVuYWJsZVNwZWxsQ2hlY2tpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuRG9Ob3RTcGVsbENoZWNrLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgYWxsb3cgUERGIHJlYWRlcnMgdG8gc3BlbGwgY2hlY2sgdGhlIHNlbGVjdGVkIG9wdGlvbiBvZiB0aGlzXG4gICAgICogZHJvcGRvd24uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBkcm9wZG93bi5kaXNhYmxlU3BlbGxDaGVja2luZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmRpc2FibGVTcGVsbENoZWNraW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkRvTm90U3BlbGxDaGVjaywgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb3B0aW9uIHNlbGVjdGVkIGJ5IGEgdXNlciBpcyBzdG9yZWQsIG9yIFwiY29tbWl0dGVkXCIsXG4gICAgICogd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIG9wdGlvbi4gVGhlIGFsdGVybmF0aXZlIGlzIHRoYXQgdGhlIHVzZXInc1xuICAgICAqIHNlbGVjdGlvbiBpcyBzdG9yZWQgd2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhpcyBkcm9wZG93biBmaWVsZCAoYnkgY2xpY2tpbmdcbiAgICAgKiBvdXRzaWRlIG9mIGl0IC0gb24gYW5vdGhlciBmaWVsZCwgZm9yIGV4YW1wbGUpLiBTZWVcbiAgICAgKiBbW1BERkRyb3Bkb3duLmVuYWJsZVNlbGVjdE9uQ2xpY2tdXSBhbmRcbiAgICAgKiBbW1BERkRyb3Bkb3duLmRpc2FibGVTZWxlY3RPbkNsaWNrXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmdldERyb3Bkb3duKCdzb21lLmRyb3Bkb3duLmZpZWxkJylcbiAgICAgKiBpZiAoZHJvcGRvd24uaXNTZWxlY3RPbkNsaWNrKCkpIGNvbnNvbGUubG9nKCdTZWxlY3Qgb24gY2xpY2sgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3Qgb3B0aW9ucyBhcmUgc2VsZWN0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhleSBhcmVcbiAgICAgKiAgICAgICAgICBjbGlja2VkLlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5pc1NlbGVjdE9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5Db21taXRPblNlbENoYW5nZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTdG9yZSB0aGUgb3B0aW9uIHNlbGVjdGVkIGJ5IGEgdXNlciBpbW1lZGlhdGVseSBhZnRlciB0aGUgdXNlciBjbGlja3MgdGhlXG4gICAgICogb3B0aW9uLiBEbyBub3Qgd2FpdCBmb3IgdGhlIHVzZXIgdG8gbGVhdmUgdGhpcyBkcm9wZG93biBmaWVsZCAoYnkgY2xpY2tpbmdcbiAgICAgKiBvdXRzaWRlIG9mIGl0IC0gb24gYW5vdGhlciBmaWVsZCwgZm9yIGV4YW1wbGUpLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZW5hYmxlU2VsZWN0T25DbGljaygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ucHJvdG90eXBlLmVuYWJsZVNlbGVjdE9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQ2hvaWNlRmxhZ3MuQ29tbWl0T25TZWxDaGFuZ2UsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV2FpdCB0byBzdG9yZSB0aGUgb3B0aW9uIHNlbGVjdGVkIGJ5IGEgdXNlciB1bnRpbCB0aGV5IGxlYXZlIHRoaXMgZHJvcGRvd25cbiAgICAgKiBmaWVsZCAoYnkgY2xpY2tpbmcgb3V0c2lkZSBvZiBpdCAtIG9uIGFub3RoZXIgZmllbGQsIGZvciBleGFtcGxlKS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogZHJvcGRvd24uZGlzYWJsZVNlbGVjdE9uQ2xpY2soKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5kaXNhYmxlU2VsZWN0T25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Db21taXRPblNlbENoYW5nZSwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGlzIGRyb3Bkb3duIG9uIHRoZSBzcGVjaWZpZWQgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB1YnVudHVGb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udCh1YnVudHVGb250Qnl0ZXMpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZHJvcGRvd24gPSBmb3JtLmNyZWF0ZURyb3Bkb3duKCdiZXN0Lmd1bmRhbScpXG4gICAgICogZHJvcGRvd24uc2V0T3B0aW9ucyhbJ0V4aWEnLCAnRHluYW1lcyddKVxuICAgICAqIGRyb3Bkb3duLnNlbGVjdCgnRXhpYScpXG4gICAgICpcbiAgICAgKiBkcm9wZG93bi5hZGRUb1BhZ2UocGFnZSwge1xuICAgICAqICAgeDogNTAsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHdpZHRoOiAyMDAsXG4gICAgICogICBoZWlnaHQ6IDEwMCxcbiAgICAgKiAgIHRleHRDb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgYmFja2dyb3VuZENvbG9yOiByZ2IoMCwgMSwgMCksXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAsIDAsIDEpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoOTApLFxuICAgICAqICAgZm9udDogdWJ1bnR1Rm9udCxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgd2lkZ2V0IGZvciB0aGlzIGRyb3Bkb3duIGZpZWxkLlxuICAgICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIHdoaWNoIHRoaXMgZHJvcGRvd24gd2lkZ2V0IHNob3VsZCBiZSBhZGRlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gYWRkaW5nIHRoaXMgZHJvcGRvd24gd2lkZ2V0LlxuICAgICAqL1xuICAgIFBERkRyb3Bkb3duLnByb3RvdHlwZS5hZGRUb1BhZ2UgPSBmdW5jdGlvbiAocGFnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2c7XG4gICAgICAgIGFzc2VydElzKHBhZ2UsICdwYWdlJywgW1tQREZQYWdlLCAnUERGUGFnZSddXSk7XG4gICAgICAgIGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKCEoJ3RleHRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLnRleHRDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JhY2tncm91bmRDb2xvcicgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJhY2tncm91bmRDb2xvciA9IHJnYigxLCAxLCAxKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlckNvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgPSByZ2IoMCwgMCwgMCk7XG4gICAgICAgIGlmICghKCdib3JkZXJXaWR0aCcgaW4gb3B0aW9ucykpXG4gICAgICAgICAgICBvcHRpb25zLmJvcmRlcldpZHRoID0gMTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgd2lkZ2V0IGZvciB0aGlzIGRyb3Bkb3duXG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmNyZWF0ZVdpZGdldCh7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zLngpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDAsXG4gICAgICAgICAgICB5OiAoX2IgPSBvcHRpb25zLnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDAsXG4gICAgICAgICAgICB3aWR0aDogKF9jID0gb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAoX2QgPSBvcHRpb25zLmhlaWdodCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogNTAsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IG9wdGlvbnMudGV4dENvbG9yLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfZSA9IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDAsXG4gICAgICAgICAgICByb3RhdGU6IChfZiA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgaGlkZGVuOiBvcHRpb25zLmhpZGRlbixcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UucmVmLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIod2lkZ2V0LmRpY3QpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoaXMgZmllbGRcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuYWRkV2lkZ2V0KHdpZGdldFJlZik7XG4gICAgICAgIC8vIFNldCBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIHdpZGdldFxuICAgICAgICB2YXIgZm9udCA9IChfZyA9IG9wdGlvbnMuZm9udCkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdGhpcy5kb2MuZ2V0Rm9ybSgpLmdldERlZmF1bHRGb250KCk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoZSBnaXZlbiBwYWdlXG4gICAgICAgIHBhZ2Uubm9kZS5hZGRBbm5vdCh3aWRnZXRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBkcm9wZG93biBoYXMgYmVlbiBtYXJrZWQgYXMgZGlydHksIG9yIGlmIGFueSBvZlxuICAgICAqIHRoaXMgZHJvcGRvd24ncyB3aWRnZXRzIGRvIG5vdCBoYXZlIGFuIGFwcGVhcmFuY2Ugc3RyZWFtLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignc29tZS5kcm9wZG93bi5maWVsZCcpXG4gICAgICogaWYgKGRyb3Bkb3duLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUoKSkgY29uc29sZS5sb2coJ05lZWRzIHVwZGF0ZScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBkcm9wZG93biBuZWVkcyBhbiBhcHBlYXJhbmNlIHVwZGF0ZS5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5pc0RpcnR5KCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIGhhc0FwcGVhcmFuY2VzID0gKChfYSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsKSBpbnN0YW5jZW9mIFBERlN0cmVhbTtcbiAgICAgICAgICAgIGlmICghaGFzQXBwZWFyYW5jZXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBkcm9wZG93bidzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciBkcm9wZG93bnMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgdGhpcy51cGRhdGVBcHBlYXJhbmNlcyhmb250KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgZHJvcGRvd24ncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGdpdmVuIGFwcGVhcmFuY2UgcHJvdmlkZXIuIElmIG5vIGBwcm92aWRlcmAgaXMgcGFzc2VkLCB0aGUgZGVmYXVsdFxuICAgICAqIGFwcGVhcmFuY2UgcHJvdmlkZXIgZm9yIGRyb3Bkb3ducyB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uZ2V0RHJvcGRvd24oJ3NvbWUuZHJvcGRvd24uZmllbGQnKVxuICAgICAqIGRyb3Bkb3duLnVwZGF0ZUFwcGVhcmFuY2VzKGhlbHZldGljYSwgKGZpZWxkLCB3aWRnZXQsIGZvbnQpID0+IHtcbiAgICAgKiAgIC4uLlxuICAgICAqICAgcmV0dXJuIGRyYXdUZXh0RmllbGQoLi4uKVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgT3B0aW9uYWxseSwgdGhlIGFwcGVhcmFuY2UgcHJvdmlkZXIgdG8gYmUgdXNlZCBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUudXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQocHJvdmlkZXIsICdwcm92aWRlcicsIFtGdW5jdGlvbl0pO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250LCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNDbGVhbigpO1xuICAgIH07XG4gICAgLy8gZ2V0T3B0aW9uKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge31cbiAgICAvLyBnZXRTZWxlY3RlZEluZGljZXMoKTogbnVtYmVyW10ge31cbiAgICAvLyByZW1vdmVPcHRpb25zKG9wdGlvbjogc3RyaW5nIHwgc3RyaW5nW10pIHt9XG4gICAgLy8gcmVtb3ZlSW5kaWNlcyhvcHRpb246IG51bWJlcltdKSB7fVxuICAgIC8vIGRlc2VsZWN0KG9wdGlvbnM6IHN0cmluZyB8IHN0cmluZ1tdKSB7fVxuICAgIC8vIGRlc2VsZWN0SW5kaWNlcyhvcHRpb25JbmRpY2VzOiBudW1iZXJbXSkge31cbiAgICBQREZEcm9wZG93bi5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciBhcFByb3ZpZGVyID0gcHJvdmlkZXIgIT09IG51bGwgJiYgcHJvdmlkZXIgIT09IHZvaWQgMCA/IHByb3ZpZGVyIDogZGVmYXVsdERyb3Bkb3duQXBwZWFyYW5jZVByb3ZpZGVyO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZXMgPSBub3JtYWxpemVBcHBlYXJhbmNlKGFwUHJvdmlkZXIodGhpcywgd2lkZ2V0LCBmb250KSk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZVdpdGhGb250KHdpZGdldCwgZm9udCwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0RHJvcGRvd25dXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlIGFuXG4gICAgICogPiBpbnN0YW5jZSBvZiBbW1BERkRyb3Bkb3duXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERkRyb3Bkb3duXV0gZnJvbSBhbiBleGlzdGluZyBhY3JvQ29tYm9Cb3ggYW5kIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9Db21ib0JveCBUaGUgdW5kZXJseWluZyBgUERGQWNyb0NvbWJvQm94YCBmb3IgdGhpcyBkcm9wZG93bi5cbiAgICAgKiBAcGFyYW0gcmVmIFRoZSB1bmlxdWUgcmVmZXJlbmNlIGZvciB0aGlzIGRyb3Bkb3duLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoaXMgZHJvcGRvd24gd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGRHJvcGRvd24ub2YgPSBmdW5jdGlvbiAoYWNyb0NvbWJvQm94LCByZWYsIGRvYykge1xuICAgICAgICByZXR1cm4gbmV3IFBERkRyb3Bkb3duKGFjcm9Db21ib0JveCwgcmVmLCBkb2MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkRyb3Bkb3duO1xufShQREZGaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGRHJvcGRvd247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZEcm9wZG93bi5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZEb2N1bWVudCBmcm9tIFwiLi4vUERGRG9jdW1lbnRcIjtcbmltcG9ydCB7IGNvbG9yVG9Db21wb25lbnRzLCBzZXRGaWxsaW5nQ29sb3IgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyB0b0RlZ3JlZXMsIHJvdGF0ZVJlY3RhbmdsZSwgcmVkdWNlUm90YXRpb24sIGFkanVzdERpbXNGb3JSb3RhdGlvbiwgZGVncmVlcywgfSBmcm9tIFwiLi4vcm90YXRpb25zXCI7XG5pbXBvcnQgeyBQREZSZWYsIFBERldpZGdldEFubm90YXRpb24sIFBERk5hbWUsIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsIEFjcm9GaWVsZEZsYWdzLCBQREZBY3JvVGVybWluYWwsIEFubm90YXRpb25GbGFncywgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydE11bHRpcGxlLCBhc3NlcnRPclVuZGVmaW5lZCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgSW1hZ2VBbGlnbm1lbnQgfSBmcm9tICcuLi9pbWFnZSc7XG5pbXBvcnQgeyBkcmF3SW1hZ2UsIHJvdGF0ZUluUGxhY2UgfSBmcm9tICcuLi9vcGVyYXRpb25zJztcbmV4cG9ydCB2YXIgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLngsICdvcHRpb25zLngnLCBbJ251bWJlciddKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueSwgJ29wdGlvbnMueScsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy53aWR0aCwgJ29wdGlvbnMud2lkdGgnLCBbJ251bWJlciddKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaGVpZ2h0LCAnb3B0aW9ucy5oZWlnaHQnLCBbJ251bWJlciddKTtcbiAgICBhc3NlcnRPclVuZGVmaW5lZChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudGV4dENvbG9yLCAnb3B0aW9ucy50ZXh0Q29sb3InLCBbXG4gICAgICAgIFtPYmplY3QsICdDb2xvciddLFxuICAgIF0pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsICdvcHRpb25zLmJhY2tncm91bmRDb2xvcicsIFtcbiAgICAgICAgW09iamVjdCwgJ0NvbG9yJ10sXG4gICAgXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlckNvbG9yLCAnb3B0aW9ucy5ib3JkZXJDb2xvcicsIFtcbiAgICAgICAgW09iamVjdCwgJ0NvbG9yJ10sXG4gICAgXSk7XG4gICAgYXNzZXJ0T3JVbmRlZmluZWQob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmJvcmRlcldpZHRoLCAnb3B0aW9ucy5ib3JkZXJXaWR0aCcsIFsnbnVtYmVyJ10pO1xuICAgIGFzc2VydE9yVW5kZWZpbmVkKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yb3RhdGUsICdvcHRpb25zLnJvdGF0ZScsIFtbT2JqZWN0LCAnUm90YXRpb24nXV0pO1xufTtcbi8qKlxuICogUmVwcmVzZW50cyBhIGZpZWxkIG9mIGEgW1tQREZGb3JtXV0uXG4gKlxuICogVGhpcyBjbGFzcyBpcyBlZmZlY3RpdmVseSBhYnN0cmFjdC4gQWxsIGZpZWxkcyBpbiBhIFtbUERGRm9ybV1dIHdpbGxcbiAqIGFjdHVhbGx5IGJlIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcy5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBmaWVsZCBpbiBhIFBERiBpcyByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBmaWVsZCBvYmplY3QuXG4gKiBIb3dldmVyLCBhIGdpdmVuIGZpZWxkIG9iamVjdCBtYXkgYmUgcmVuZGVyZWQgYXQgbXVsdGlwbGUgbG9jYXRpb25zIHdpdGhpblxuICogdGhlIGRvY3VtZW50IChhY3Jvc3Mgb25lIG9yIG1vcmUgcGFnZXMpLiBUaGUgcmVuZGVyaW5nIG9mIGEgZmllbGQgaXNcbiAqIGNvbnRyb2xsZWQgYnkgaXRzIHdpZGdldHMuIEVhY2ggd2lkZ2V0IGNhdXNlcyBpdHMgZmllbGQgdG8gYmUgZGlzcGxheWVkIGF0IGFcbiAqIHBhcnRpY3VsYXIgbG9jYXRpb24gaW4gdGhlIGRvY3VtZW50LlxuICpcbiAqIE1vc3Qgb2YgdGhlIHRpbWUgZWFjaCBmaWVsZCBpbiBhIFBERiBoYXMgb25seSBhIHNpbmdsZSB3aWRnZXQsIGFuZCB0aHVzIGlzXG4gKiBvbmx5IHJlbmRlcmVkIG9uY2UuIEhvd2V2ZXIsIGlmIGEgZmllbGQgaXMgcmVuZGVyZWQgbXVsdGlwbGUgdGltZXMsIGl0IHdpbGxcbiAqIGhhdmUgbXVsdGlwbGUgd2lkZ2V0cyAtIG9uZSBmb3IgZWFjaCBsb2NhdGlvbiBpdCBpcyByZW5kZXJlZC5cbiAqXG4gKiBUaGlzIGFic3RyYWN0aW9uIG9mIGZpZWxkIG9iamVjdHMgYW5kIHdpZGdldHMgaXMgZGVmaW5lZCBpbiB0aGUgUERGXG4gKiBzcGVjaWZpY2F0aW9uIGFuZCBkaWN0YXRlcyBob3cgUERGIGZpbGVzIHN0b3JlIGZpZWxkcyBhbmQgd2hlcmUgdGhleSBhcmVcbiAqIHRvIGJlIHJlbmRlcmVkLlxuICovXG52YXIgUERGRmllbGQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGRmllbGQoYWNyb0ZpZWxkLCByZWYsIGRvYykge1xuICAgICAgICBhc3NlcnRJcyhhY3JvRmllbGQsICdhY3JvRmllbGQnLCBbW1BERkFjcm9UZXJtaW5hbCwgJ1BERkFjcm9UZXJtaW5hbCddXSk7XG4gICAgICAgIGFzc2VydElzKHJlZiwgJ3JlZicsIFtbUERGUmVmLCAnUERGUmVmJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQgPSBhY3JvRmllbGQ7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGlzIGZpZWxkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkcyA9IGZvcm0uZ2V0RmllbGRzKClcbiAgICAgKiBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICogICBjb25zdCBuYW1lID0gZmllbGQuZ2V0TmFtZSgpXG4gICAgICogICBjb25zb2xlLmxvZygnRmllbGQgbmFtZTonLCBuYW1lKVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogTm90ZSB0aGF0IFBERiBmaWVsZHMgYXJlIHN0cnVjdHVyZWQgYXMgYSB0cmVlLiBFYWNoIGZpZWxkIGlzIHRoZVxuICAgICAqIGRlc2NlbmRlbnQgb2YgYSBzZXJpZXMgb2YgYW5jZXN0b3Igbm9kZXMgYWxsIHRoZSB3YXkgdXAgdG8gdGhlIGZvcm0gbm9kZSxcbiAgICAgKiB3aGljaCBpcyBhbHdheXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuIEVhY2ggbm9kZSBpbiB0aGUgdHJlZSAoZXhjZXB0IGZvclxuICAgICAqIHRoZSBmb3JtIG5vZGUpIGhhcyBhIHBhcnRpYWwgbmFtZS4gUGFydGlhbCBuYW1lcyBjYW4gYmUgY29tcG9zZWQgb2YgYW55XG4gICAgICogdW5pY29kZSBjaGFyYWN0ZXJzIGV4Y2VwdCBhIHBlcmlvZCAoYC5gKS4gVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGFcbiAgICAgKiBmaWVsZCBpcyBjb21wb3NlZCBvZiB0aGUgcGFydGlhbCBuYW1lcyBvZiBhbGwgaXRzIGFuY2VzdG9ycyBqb2luZWRcbiAgICAgKiB3aXRoIHBlcmlvZHMuIFRoaXMgbWVhbnMgdGhhdCBzcGxpdHRpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9uXG4gICAgICogcGVyaW9kcyBhbmQgdGFraW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHJlc3VsdGluZyBhcnJheSB3aWxsIGdpdmUgeW91XG4gICAgICogdGhlIHBhcnRpYWwgbmFtZSBvZiBhIHNwZWNpZmljIGZpZWxkLlxuICAgICAqIEByZXR1cm5zIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGlzIGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLmFjcm9GaWVsZC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGZpZWxkIGlzIHJlYWQgb25seS4gVGhpcyBtZWFucyB0aGF0IFBERiByZWFkZXJzXG4gICAgICogd2lsbCBub3QgYWxsb3cgdXNlcnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZmllbGQgb3IgY2hhbmdlIGl0cyB2YWx1ZS4gU2VlXG4gICAgICogW1tQREZGaWVsZC5lbmFibGVSZWFkT25seV1dIGFuZCBbW1BERkZpZWxkLmRpc2FibGVSZWFkT25seV1dLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBpZiAoZmllbGQuaXNSZWFkT25seSgpKSBjb25zb2xlLmxvZygnUmVhZCBvbmx5IGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgaXMgYSByZWFkIG9ubHkgZmllbGQuXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmlzUmVhZE9ubHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9GaWVsZEZsYWdzLlJlYWRPbmx5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByZXZlbnQgUERGIHJlYWRlcnMgZnJvbSBhbGxvd2luZyB1c2VycyB0byBpbnRlcmFjdCB3aXRoIHRoaXMgZmllbGQgb3JcbiAgICAgKiBjaGFuZ2UgaXRzIHZhbHVlLiBUaGUgZmllbGQgd2lsbCBub3QgcmVzcG9uZCB0byBtb3VzZSBvciBrZXlib2FyZCBpbnB1dC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogZmllbGQuZW5hYmxlUmVhZE9ubHkoKVxuICAgICAqIGBgYFxuICAgICAqIFVzZWZ1bCBmb3IgZmllbGRzIHdob3NlIHZhbHVlcyBhcmUgY29tcHV0ZWQsIGltcG9ydGVkIGZyb20gYSBkYXRhYmFzZSwgb3JcbiAgICAgKiBwcmVmaWxsZWQgYnkgc29mdHdhcmUgYmVmb3JlIGJlaW5nIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZW5hYmxlUmVhZE9ubHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvRmllbGRGbGFncy5SZWFkT25seSwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2VycyB0byBpbnRlcmFjdCB3aXRoIHRoaXMgZmllbGQgYW5kIGNoYW5nZSBpdHMgdmFsdWUgaW4gUERGXG4gICAgICogcmVhZGVycyB2aWEgbW91c2UgYW5kIGtleWJvYXJkIGlucHV0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogZmllbGQuZGlzYWJsZVJlYWRPbmx5KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZGlzYWJsZVJlYWRPbmx5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0ZpZWxkRmxhZ3MuUmVhZE9ubHksIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgZmllbGQgbXVzdCBoYXZlIGEgdmFsdWUgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuXG4gICAgICogU2VlIFtbUERGRmllbGQuZW5hYmxlUmVxdWlyZWRdXSBhbmQgW1tQREZGaWVsZC5kaXNhYmxlUmVxdWlyZWRdXS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZpZWxkID0gZm9ybS5nZXRGaWVsZCgnc29tZS5maWVsZCcpXG4gICAgICogaWYgKGZpZWxkLmlzUmVxdWlyZWQoKSkgY29uc29sZS5sb2coJ0ZpZWxkIGlzIHJlcXVpcmVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkLlxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5pc1JlcXVpcmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvRmllbGRGbGFncy5SZXF1aXJlZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXF1aXJlIHRoaXMgZmllbGQgdG8gaGF2ZSBhIHZhbHVlIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBmaWVsZC5lbmFibGVSZXF1aXJlZCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmVuYWJsZVJlcXVpcmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0ZpZWxkRmxhZ3MuUmVxdWlyZWQsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IHJlcXVpcmUgdGhpcyBmaWVsZCB0byBoYXZlIGEgdmFsdWUgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ3NvbWUuZmllbGQnKVxuICAgICAqIGZpZWxkLmRpc2FibGVSZXF1aXJlZCgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmRpc2FibGVSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9GaWVsZEZsYWdzLlJlcXVpcmVkLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGZpZWxkJ3MgdmFsdWUgc2hvdWxkIGJlIGV4cG9ydGVkIHdoZW4gdGhlIGZvcm0gaXNcbiAgICAgKiBzdWJtaXR0ZWQuIFNlZSBbW1BERkZpZWxkLmVuYWJsZUV4cG9ydGluZ11dIGFuZFxuICAgICAqIFtbUERGRmllbGQuZGlzYWJsZUV4cG9ydGluZ11dLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBpZiAoZmllbGQuaXNFeHBvcnRlZCgpKSBjb25zb2xlLmxvZygnRXhwb3J0aW5nIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgZmllbGQncyB2YWx1ZSBzaG91bGQgYmUgZXhwb3J0ZWQuXG4gICAgICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmlzRXhwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvRmllbGRGbGFncy5Ob0V4cG9ydCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgZmllbGQncyB2YWx1ZSBzaG91bGQgYmUgZXhwb3J0ZWQgd2hlbiB0aGUgZm9ybSBpc1xuICAgICAqIHN1Ym1pdHRlZCBpbiBhIFBERiByZWFkZXIuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBmaWVsZC5lbmFibGVFeHBvcnRpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5lbmFibGVFeHBvcnRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvRmllbGRGbGFncy5Ob0V4cG9ydCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIGZpZWxkJ3MgdmFsdWUgc2hvdWxkICoqbm90KiogYmUgZXhwb3J0ZWQgd2hlbiB0aGUgZm9ybVxuICAgICAqIGlzIHN1Ym1pdHRlZCBpbiBhIFBERiByZWFkZXIuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdzb21lLmZpZWxkJylcbiAgICAgKiBmaWVsZC5kaXNhYmxlRXhwb3J0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuZGlzYWJsZUV4cG9ydGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9GaWVsZEZsYWdzLk5vRXhwb3J0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ25lZWRzQXBwZWFyYW5jZXNVcGRhdGUnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgUERGRmllbGQucHJvdG90eXBlLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChfZm9udCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdkZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMnKTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5tYXJrQXNEaXJ0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kb2MuZ2V0Rm9ybSgpLm1hcmtGaWVsZEFzRGlydHkodGhpcy5yZWYpO1xuICAgIH07XG4gICAgUERGRmllbGQucHJvdG90eXBlLm1hcmtBc0NsZWFuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRvYy5nZXRGb3JtKCkubWFya0ZpZWxkQXNDbGVhbih0aGlzLnJlZik7XG4gICAgfTtcbiAgICBQREZGaWVsZC5wcm90b3R5cGUuaXNEaXJ0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmdldEZvcm0oKS5maWVsZElzRGlydHkodGhpcy5yZWYpO1xuICAgIH07XG4gICAgUERGRmllbGQucHJvdG90eXBlLmNyZWF0ZVdpZGdldCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHRleHRDb2xvciA9IG9wdGlvbnMudGV4dENvbG9yO1xuICAgICAgICB2YXIgYmFja2dyb3VuZENvbG9yID0gb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIHZhciBib3JkZXJDb2xvciA9IG9wdGlvbnMuYm9yZGVyQ29sb3I7XG4gICAgICAgIHZhciBib3JkZXJXaWR0aCA9IG9wdGlvbnMuYm9yZGVyV2lkdGg7XG4gICAgICAgIHZhciBkZWdyZWVzQW5nbGUgPSB0b0RlZ3JlZXMob3B0aW9ucy5yb3RhdGUpO1xuICAgICAgICB2YXIgY2FwdGlvbiA9IG9wdGlvbnMuY2FwdGlvbjtcbiAgICAgICAgdmFyIHggPSBvcHRpb25zLng7XG4gICAgICAgIHZhciB5ID0gb3B0aW9ucy55O1xuICAgICAgICB2YXIgd2lkdGggPSBvcHRpb25zLndpZHRoICsgYm9yZGVyV2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCArIGJvcmRlcldpZHRoO1xuICAgICAgICB2YXIgaGlkZGVuID0gQm9vbGVhbihvcHRpb25zLmhpZGRlbik7XG4gICAgICAgIHZhciBwYWdlUmVmID0gb3B0aW9ucy5wYWdlO1xuICAgICAgICBhc3NlcnRNdWx0aXBsZShkZWdyZWVzQW5nbGUsICdkZWdyZWVzQW5nbGUnLCA5MCk7XG4gICAgICAgIC8vIENyZWF0ZSBhIHdpZGdldCBmb3IgdGhpcyBmaWVsZFxuICAgICAgICB2YXIgd2lkZ2V0ID0gUERGV2lkZ2V0QW5ub3RhdGlvbi5jcmVhdGUodGhpcy5kb2MuY29udGV4dCwgdGhpcy5yZWYpO1xuICAgICAgICAvLyBTZXQgd2lkZ2V0IHByb3BlcnRpZXNcbiAgICAgICAgdmFyIHJlY3QgPSByb3RhdGVSZWN0YW5nbGUoeyB4OiB4LCB5OiB5LCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH0sIGJvcmRlcldpZHRoLCBkZWdyZWVzQW5nbGUpO1xuICAgICAgICB3aWRnZXQuc2V0UmVjdGFuZ2xlKHJlY3QpO1xuICAgICAgICBpZiAocGFnZVJlZilcbiAgICAgICAgICAgIHdpZGdldC5zZXRQKHBhZ2VSZWYpO1xuICAgICAgICB2YXIgYWMgPSB3aWRnZXQuZ2V0T3JDcmVhdGVBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgIGFjLnNldEJhY2tncm91bmRDb2xvcihjb2xvclRvQ29tcG9uZW50cyhiYWNrZ3JvdW5kQ29sb3IpKTtcbiAgICAgICAgfVxuICAgICAgICBhYy5zZXRSb3RhdGlvbihkZWdyZWVzQW5nbGUpO1xuICAgICAgICBpZiAoY2FwdGlvbilcbiAgICAgICAgICAgIGFjLnNldENhcHRpb25zKHsgbm9ybWFsOiBjYXB0aW9uIH0pO1xuICAgICAgICBpZiAoYm9yZGVyQ29sb3IpXG4gICAgICAgICAgICBhYy5zZXRCb3JkZXJDb2xvcihjb2xvclRvQ29tcG9uZW50cyhib3JkZXJDb2xvcikpO1xuICAgICAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0T3JDcmVhdGVCb3JkZXJTdHlsZSgpO1xuICAgICAgICBpZiAoYm9yZGVyV2lkdGggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGJzLnNldFdpZHRoKGJvcmRlcldpZHRoKTtcbiAgICAgICAgd2lkZ2V0LnNldEZsYWdUbyhBbm5vdGF0aW9uRmxhZ3MuUHJpbnQsIHRydWUpO1xuICAgICAgICB3aWRnZXQuc2V0RmxhZ1RvKEFubm90YXRpb25GbGFncy5IaWRkZW4sIGhpZGRlbik7XG4gICAgICAgIHdpZGdldC5zZXRGbGFnVG8oQW5ub3RhdGlvbkZsYWdzLkludmlzaWJsZSwgZmFsc2UpO1xuICAgICAgICAvLyBTZXQgYWNyb2ZpZWxkIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKHRleHRDb2xvcikge1xuICAgICAgICAgICAgdmFyIGRhID0gKF9hID0gdGhpcy5hY3JvRmllbGQuZ2V0RGVmYXVsdEFwcGVhcmFuY2UoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgICAgICAgICB2YXIgbmV3RGEgPSBkYSArICdcXG4nICsgc2V0RmlsbGluZ0NvbG9yKHRleHRDb2xvcikudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldERlZmF1bHRBcHBlYXJhbmNlKG5ld0RhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkZ2V0O1xuICAgIH07XG4gICAgUERGRmllbGQucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VXaXRoRm9udCA9IGZ1bmN0aW9uICh3aWRnZXQsIGZvbnQsIF9hKSB7XG4gICAgICAgIHZhciBub3JtYWwgPSBfYS5ub3JtYWwsIHJvbGxvdmVyID0gX2Eucm9sbG92ZXIsIGRvd24gPSBfYS5kb3duO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VzKHdpZGdldCwge1xuICAgICAgICAgICAgbm9ybWFsOiB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0od2lkZ2V0LCBub3JtYWwsIGZvbnQpLFxuICAgICAgICAgICAgcm9sbG92ZXI6IHJvbGxvdmVyICYmIHRoaXMuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIHJvbGxvdmVyLCBmb250KSxcbiAgICAgICAgICAgIGRvd246IGRvd24gJiYgdGhpcy5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgZG93biwgZm9udCksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGRmllbGQucHJvdG90eXBlLnVwZGF0ZU9uT2ZmV2lkZ2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICh3aWRnZXQsIG9uVmFsdWUsIF9hKSB7XG4gICAgICAgIHZhciBub3JtYWwgPSBfYS5ub3JtYWwsIHJvbGxvdmVyID0gX2Eucm9sbG92ZXIsIGRvd24gPSBfYS5kb3duO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VzKHdpZGdldCwge1xuICAgICAgICAgICAgbm9ybWFsOiB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VEaWN0KHdpZGdldCwgbm9ybWFsLCBvblZhbHVlKSxcbiAgICAgICAgICAgIHJvbGxvdmVyOiByb2xsb3ZlciAmJiB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VEaWN0KHdpZGdldCwgcm9sbG92ZXIsIG9uVmFsdWUpLFxuICAgICAgICAgICAgZG93bjogZG93biAmJiB0aGlzLmNyZWF0ZUFwcGVhcmFuY2VEaWN0KHdpZGdldCwgZG93biwgb25WYWx1ZSksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGRmllbGQucHJvdG90eXBlLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKHdpZGdldCwgX2EpIHtcbiAgICAgICAgdmFyIG5vcm1hbCA9IF9hLm5vcm1hbCwgcm9sbG92ZXIgPSBfYS5yb2xsb3ZlciwgZG93biA9IF9hLmRvd247XG4gICAgICAgIHdpZGdldC5zZXROb3JtYWxBcHBlYXJhbmNlKG5vcm1hbCk7XG4gICAgICAgIGlmIChyb2xsb3Zlcikge1xuICAgICAgICAgICAgd2lkZ2V0LnNldFJvbGxvdmVyQXBwZWFyYW5jZShyb2xsb3Zlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aWRnZXQucmVtb3ZlUm9sbG92ZXJBcHBlYXJhbmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvd24pIHtcbiAgICAgICAgICAgIHdpZGdldC5zZXREb3duQXBwZWFyYW5jZShkb3duKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdpZGdldC5yZW1vdmVEb3duQXBwZWFyYW5jZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyAvLyBUT0RPOiBEbyB3ZSBuZWVkIHRvIGRvIHRoaXMuLi4/XG4gICAgLy8gcHJpdmF0ZSBmb28oZm9udDogUERGRm9udCwgZGljdDogUERGRGljdCkge1xuICAgIC8vICAgaWYgKCFkaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdEUicpKSkge1xuICAgIC8vICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdEUicpLCBkaWN0LmNvbnRleHQub2JqKHt9KSk7XG4gICAgLy8gICB9XG4gICAgLy8gICBjb25zdCBEUiA9IGRpY3QubG9va3VwKFBERk5hbWUub2YoJ0RSJyksIFBERkRpY3QpO1xuICAgIC8vICAgaWYgKCFEUi5sb29rdXAoUERGTmFtZS5vZignRm9udCcpKSkge1xuICAgIC8vICAgICBEUi5zZXQoUERGTmFtZS5vZignRm9udCcpLCBkaWN0LmNvbnRleHQub2JqKHt9KSk7XG4gICAgLy8gICB9XG4gICAgLy8gICBjb25zdCBGb250ID0gRFIubG9va3VwKFBERk5hbWUub2YoJ0ZvbnQnKSwgUERGRGljdCk7XG4gICAgLy8gICBGb250LnNldChQREZOYW1lLm9mKGZvbnQubmFtZSksIGZvbnQucmVmKTtcbiAgICAvLyB9XG4gICAgUERGRmllbGQucHJvdG90eXBlLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0gPSBmdW5jdGlvbiAod2lkZ2V0LCBhcHBlYXJhbmNlLCBmb250KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmFjcm9GaWVsZC5kaWN0LmNvbnRleHQ7XG4gICAgICAgIHZhciBfYiA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKSwgd2lkdGggPSBfYi53aWR0aCwgaGVpZ2h0ID0gX2IuaGVpZ2h0O1xuICAgICAgICAvLyBUT0RPOiBEbyB3ZSBuZWVkIHRvIGRvIHRoaXMuLi4/XG4gICAgICAgIC8vIGlmIChmb250KSB7XG4gICAgICAgIC8vICAgdGhpcy5mb28oZm9udCwgd2lkZ2V0LmRpY3QpO1xuICAgICAgICAvLyAgIHRoaXMuZm9vKGZvbnQsIHRoaXMuZG9jLmdldEZvcm0oKS5hY3JvRm9ybS5kaWN0KTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBFTkQgVE9ET1xuICAgICAgICB2YXIgUmVzb3VyY2VzID0gZm9udCAmJiB7IEZvbnQ6IChfYSA9IHt9LCBfYVtmb250Lm5hbWVdID0gZm9udC5yZWYsIF9hKSB9O1xuICAgICAgICB2YXIgc3RyZWFtID0gY29udGV4dC5mb3JtWE9iamVjdChhcHBlYXJhbmNlLCB7XG4gICAgICAgICAgICBSZXNvdXJjZXM6IFJlc291cmNlcyxcbiAgICAgICAgICAgIEJCb3g6IGNvbnRleHQub2JqKFswLCAwLCB3aWR0aCwgaGVpZ2h0XSksXG4gICAgICAgICAgICBNYXRyaXg6IGNvbnRleHQub2JqKFsxLCAwLCAwLCAxLCAwLCAwXSksXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgc3RyZWFtUmVmID0gY29udGV4dC5yZWdpc3RlcihzdHJlYW0pO1xuICAgICAgICByZXR1cm4gc3RyZWFtUmVmO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgRm9ybVhPYmplY3Qgb2YgdGhlIHN1cHBsaWVkIGltYWdlIGFuZCBhZGQgaXQgdG8gY29udGV4dC5cbiAgICAgKiBUaGUgRm9ybVhPYmplY3Qgc2l6ZSBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSB3aWRnZXQgKGluY2x1ZGluZ1xuICAgICAqIHRoZSBhbGlnbm1lbnQpLlxuICAgICAqIEBwYXJhbSB3aWRnZXQgVGhlIHdpZGdldCB0aGF0IHNob3VsZCBkaXNwbGF5IHRoZSBpbWFnZS5cbiAgICAgKiBAcGFyYW0gYWxpZ25tZW50IFRoZSBhbGlnbm1lbnQgb2YgdGhlIGltYWdlLlxuICAgICAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgICAqIEByZXR1cm5zIFRoZSByZWYgZm9yIHRoZSBGb3JtWE9iamVjdCB0aGF0IHdhcyBhZGRlZCB0byB0aGUgY29udGV4dC5cbiAgICAgKi9cbiAgICBQREZGaWVsZC5wcm90b3R5cGUuY3JlYXRlSW1hZ2VBcHBlYXJhbmNlU3RyZWFtID0gZnVuY3Rpb24gKHdpZGdldCwgaW1hZ2UsIGFsaWdubWVudCkge1xuICAgICAgICAvLyBOT1RFOiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgaGFuZGxlIGltYWdlIGJvcmRlcnMuXG4gICAgICAgIC8vIE5PVEU6IEFjcm9iYXQgc2VlbXMgdG8gcmVzaXplIHRoZSBpbWFnZSAobWF5YmUgZXZlbiBza2V3aW5nIGl0cyBhc3BlY3RcbiAgICAgICAgLy8gICAgICAgcmF0aW8pIHRvIGZpdCBwZXJmZWN0bHkgd2l0aGluIHRoZSB3aWRnZXQncyByZWN0YW5nbGUuIFRoaXMgbWV0aG9kXG4gICAgICAgIC8vICAgICAgIGRvZXMgbm90IGN1cnJlbnRseSBkbyB0aGF0LiBTaG91bGQgdGhlcmUgYmUgYW4gb3B0aW9uIGZvciB0aGF0P1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBfYjtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmFjcm9GaWVsZC5kaWN0LmNvbnRleHQ7XG4gICAgICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgICAgIHZhciBhcCA9IHdpZGdldC5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgICAgICB2YXIgYm9yZGVyV2lkdGggPSAoX2IgPSBicyA9PT0gbnVsbCB8fCBicyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnMuZ2V0V2lkdGgoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICAgICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldFJvdGF0aW9uKCkpO1xuICAgICAgICB2YXIgcm90YXRlID0gcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogcm90YXRpb24gfSkpO1xuICAgICAgICB2YXIgYWRqID0gYWRqdXN0RGltc0ZvclJvdGF0aW9uKHJlY3RhbmdsZSwgcm90YXRpb24pO1xuICAgICAgICB2YXIgaW1hZ2VEaW1zID0gaW1hZ2Uuc2NhbGVUb0ZpdChhZGoud2lkdGggLSBib3JkZXJXaWR0aCAqIDIsIGFkai5oZWlnaHQgLSBib3JkZXJXaWR0aCAqIDIpO1xuICAgICAgICAvLyBTdXBwb3J0IGJvcmRlcnMgb24gaW1hZ2VzIGFuZCBtYXliZSBvdGhlciBwcm9wZXJ0aWVzXG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgeDogYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICB5OiBib3JkZXJXaWR0aCxcbiAgICAgICAgICAgIHdpZHRoOiBpbWFnZURpbXMud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGltYWdlRGltcy5oZWlnaHQsXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGFsaWdubWVudCA9PT0gSW1hZ2VBbGlnbm1lbnQuQ2VudGVyKSB7XG4gICAgICAgICAgICBvcHRpb25zLnggKz0gKGFkai53aWR0aCAtIGJvcmRlcldpZHRoICogMikgLyAyIC0gaW1hZ2VEaW1zLndpZHRoIC8gMjtcbiAgICAgICAgICAgIG9wdGlvbnMueSArPSAoYWRqLmhlaWdodCAtIGJvcmRlcldpZHRoICogMikgLyAyIC0gaW1hZ2VEaW1zLmhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWxpZ25tZW50ID09PSBJbWFnZUFsaWdubWVudC5SaWdodCkge1xuICAgICAgICAgICAgb3B0aW9ucy54ID0gYWRqLndpZHRoIC0gYm9yZGVyV2lkdGggLSBpbWFnZURpbXMud2lkdGg7XG4gICAgICAgICAgICBvcHRpb25zLnkgPSBhZGouaGVpZ2h0IC0gYm9yZGVyV2lkdGggLSBpbWFnZURpbXMuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbWFnZU5hbWUgPSB0aGlzLmRvYy5jb250ZXh0LmFkZFJhbmRvbVN1ZmZpeCgnSW1hZ2UnLCAxMCk7XG4gICAgICAgIHZhciBhcHBlYXJhbmNlID0gX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3SW1hZ2UoaW1hZ2VOYW1lLCBvcHRpb25zKSk7XG4gICAgICAgIC8vLy8vLy8vLy8vL1xuICAgICAgICB2YXIgUmVzb3VyY2VzID0geyBYT2JqZWN0OiAoX2EgPSB7fSwgX2FbaW1hZ2VOYW1lXSA9IGltYWdlLnJlZiwgX2EpIH07XG4gICAgICAgIHZhciBzdHJlYW0gPSBjb250ZXh0LmZvcm1YT2JqZWN0KGFwcGVhcmFuY2UsIHtcbiAgICAgICAgICAgIFJlc291cmNlczogUmVzb3VyY2VzLFxuICAgICAgICAgICAgQkJveDogY29udGV4dC5vYmooWzAsIDAsIHJlY3RhbmdsZS53aWR0aCwgcmVjdGFuZ2xlLmhlaWdodF0pLFxuICAgICAgICAgICAgTWF0cml4OiBjb250ZXh0Lm9iaihbMSwgMCwgMCwgMSwgMCwgMF0pLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVnaXN0ZXIoc3RyZWFtKTtcbiAgICB9O1xuICAgIFBERkZpZWxkLnByb3RvdHlwZS5jcmVhdGVBcHBlYXJhbmNlRGljdCA9IGZ1bmN0aW9uICh3aWRnZXQsIGFwcGVhcmFuY2UsIG9uVmFsdWUpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmFjcm9GaWVsZC5kaWN0LmNvbnRleHQ7XG4gICAgICAgIHZhciBvblN0cmVhbVJlZiA9IHRoaXMuY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSh3aWRnZXQsIGFwcGVhcmFuY2Uub24pO1xuICAgICAgICB2YXIgb2ZmU3RyZWFtUmVmID0gdGhpcy5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHdpZGdldCwgYXBwZWFyYW5jZS5vZmYpO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZURpY3QgPSBjb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIGFwcGVhcmFuY2VEaWN0LnNldChvblZhbHVlLCBvblN0cmVhbVJlZik7XG4gICAgICAgIGFwcGVhcmFuY2VEaWN0LnNldChQREZOYW1lLm9mKCdPZmYnKSwgb2ZmU3RyZWFtUmVmKTtcbiAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2VEaWN0O1xuICAgIH07XG4gICAgcmV0dXJuIFBERkZpZWxkO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkZpZWxkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRmllbGQuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRG9jdW1lbnQgZnJvbSBcIi4uL1BERkRvY3VtZW50XCI7XG5pbXBvcnQgUERGQnV0dG9uIGZyb20gXCIuL1BERkJ1dHRvblwiO1xuaW1wb3J0IFBERkNoZWNrQm94IGZyb20gXCIuL1BERkNoZWNrQm94XCI7XG5pbXBvcnQgUERGRHJvcGRvd24gZnJvbSBcIi4vUERGRHJvcGRvd25cIjtcbmltcG9ydCBQREZPcHRpb25MaXN0IGZyb20gXCIuL1BERk9wdGlvbkxpc3RcIjtcbmltcG9ydCBQREZSYWRpb0dyb3VwIGZyb20gXCIuL1BERlJhZGlvR3JvdXBcIjtcbmltcG9ydCBQREZTaWduYXR1cmUgZnJvbSBcIi4vUERGU2lnbmF0dXJlXCI7XG5pbXBvcnQgUERGVGV4dEZpZWxkIGZyb20gXCIuL1BERlRleHRGaWVsZFwiO1xuaW1wb3J0IHsgTm9TdWNoRmllbGRFcnJvciwgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yLCBGaWVsZEFscmVhZHlFeGlzdHNFcnJvciwgSW52YWxpZEZpZWxkTmFtZVBhcnRFcnJvciwgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGRm9udCBmcm9tIFwiLi4vUERGRm9udFwiO1xuaW1wb3J0IHsgU3RhbmRhcmRGb250cyB9IGZyb20gXCIuLi9TdGFuZGFyZEZvbnRzXCI7XG5pbXBvcnQgeyByb3RhdGVJblBsYWNlIH0gZnJvbSBcIi4uL29wZXJhdGlvbnNcIjtcbmltcG9ydCB7IGRyYXdPYmplY3QsIHBvcEdyYXBoaWNzU3RhdGUsIHB1c2hHcmFwaGljc1N0YXRlLCB0cmFuc2xhdGUsIH0gZnJvbSBcIi4uL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgUERGQWNyb0Zvcm0sIFBERkFjcm9DaGVja0JveCwgUERGQWNyb0NvbWJvQm94LCBQREZBY3JvTGlzdEJveCwgUERGQWNyb1JhZGlvQnV0dG9uLCBQREZBY3JvU2lnbmF0dXJlLCBQREZBY3JvVGV4dCwgUERGQWNyb1B1c2hCdXR0b24sIFBERkFjcm9Ob25UZXJtaW5hbCwgUERGRGljdCwgUERGUmVmLCBjcmVhdGVQREZBY3JvRmllbGRzLCBQREZOYW1lLCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgQ2FjaGUsIGFzc2VydE9yVW5kZWZpbmVkIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGludGVyYWN0aXZlIGZvcm0gb2YgYSBbW1BERkRvY3VtZW50XV0uXG4gKlxuICogSW50ZXJhY3RpdmUgZm9ybXMgKHNvbWV0aW1lcyBjYWxsZWQgX0Fjcm9Gb3Jtc18pIGFyZSBjb2xsZWN0aW9ucyBvZiBmaWVsZHNcbiAqIGRlc2lnbmVkIHRvIGdhdGhlciBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlci4gQSBQREYgZG9jdW1lbnQgbWF5IGNvbnRhaW5zIGFueVxuICogbnVtYmVyIG9mIGZpZWxkcyB0aGF0IGFwcGVhciBvbiB2YXJpb3VzIHBhZ2VzLCBhbGwgb2Ygd2hpY2ggbWFrZSB1cCBhIHNpbmdsZSxcbiAqIGdsb2JhbCBpbnRlcmFjdGl2ZSBmb3JtIHNwYW5uaW5nIHRoZSBlbnRpcmUgZG9jdW1lbnQuIFRoaXMgbWVhbnMgdGhhdFxuICogaW5zdGFuY2VzIG9mIFtbUERGRG9jdW1lbnRdXSBzaGFsbCBjb250YWluIGF0IG1vc3Qgb25lIFtbUERGRm9ybV1dLlxuICpcbiAqIFRoZSBmaWVsZHMgb2YgYW4gaW50ZXJhY3RpdmUgZm9ybSBhcmUgcmVwcmVzZW50ZWQgYnkgW1tQREZGaWVsZF1dIGluc3RhbmNlcy5cbiAqL1xudmFyIFBERkZvcm0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGRm9ybShhY3JvRm9ybSwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZW1iZWREZWZhdWx0Rm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5kb2MuZW1iZWRTdGFuZGFyZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpO1xuICAgICAgICB9O1xuICAgICAgICBhc3NlcnRJcyhhY3JvRm9ybSwgJ2Fjcm9Gb3JtJywgW1tQREZBY3JvRm9ybSwgJ1BERkFjcm9Gb3JtJ11dKTtcbiAgICAgICAgYXNzZXJ0SXMoZG9jLCAnZG9jJywgW1tQREZEb2N1bWVudCwgJ1BERkRvY3VtZW50J11dKTtcbiAgICAgICAgdGhpcy5hY3JvRm9ybSA9IGFjcm9Gb3JtO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5kaXJ0eUZpZWxkcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0Rm9udENhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkodGhpcy5lbWJlZERlZmF1bHRGb250KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBbW1BERkZvcm1dXSBoYXMgWEZBIGRhdGEuIE1vc3QgUERGcyB3aXRoIGZvcm1cbiAgICAgKiBmaWVsZHMgZG8gbm90IHVzZSBYRkEgYXMgaXQgaXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgYnkgUERGIHJlYWRlcnMuXG4gICAgICpcbiAgICAgKiA+IGBwZGYtbGliYCBkb2VzIG5vdCBzdXBwb3J0IGNyZWF0aW9uLCBtb2RpZmljYXRpb24sIG9yIHJlYWRpbmcgb2YgWEZBXG4gICAgICogPiBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogaWYgKGZvcm0uaGFzWEZBKCkpIGNvbnNvbGUubG9nKCdQREYgaGFzIFhGQSBkYXRhJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZvcm0gaGFzIFhGQSBkYXRhLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmhhc1hGQSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0Zvcm0uZGljdC5oYXMoUERGTmFtZS5vZignWEZBJykpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdCB0aGUgWEZBIGRhdGEgZnJvbSB0aGlzIFtbUERGRm9ybV1dIChpZiBhbnkgZXhpc3RzKS4gVGhpcyB3aWxsXG4gICAgICogZm9yY2UgcmVhZGVycyB0byBmYWxsYmFjayB0byBzdGFuZGFyZCBmaWVsZHMgaWYgdGhlIFtbUERGRG9jdW1lbnRdXVxuICAgICAqIGNvbnRhaW5zIGFueS4gRm9yIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogZm9ybS5kZWxldGVYRkEoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmRlbGV0ZVhGQSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRm9ybS5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdYRkEnKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIGZpZWxkcyBjb250YWluZWQgaW4gdGhpcyBbW1BERkZvcm1dXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGZpZWxkcyA9IGZvcm0uZ2V0RmllbGRzKClcbiAgICAgKiBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICogICBjb25zdCB0eXBlID0gZmllbGQuY29uc3RydWN0b3IubmFtZVxuICAgICAqICAgY29uc3QgbmFtZSA9IGZpZWxkLmdldE5hbWUoKVxuICAgICAqICAgY29uc29sZS5sb2coYCR7dHlwZX06ICR7bmFtZX1gKVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgYWxsIGZpZWxkcyBpbiB0aGlzIGZvcm0uXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0RmllbGRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYWxsRmllbGRzID0gdGhpcy5hY3JvRm9ybS5nZXRBbGxGaWVsZHMoKTtcbiAgICAgICAgdmFyIGZpZWxkcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhbGxGaWVsZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBhbGxGaWVsZHNbaWR4XSwgYWNyb0ZpZWxkID0gX2FbMF0sIHJlZiA9IF9hWzFdO1xuICAgICAgICAgICAgdmFyIGZpZWxkID0gY29udmVydFRvUERGRmllbGQoYWNyb0ZpZWxkLCByZWYsIHRoaXMuZG9jKTtcbiAgICAgICAgICAgIGlmIChmaWVsZClcbiAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkTWF5YmUoJ1BhZ2UxLkZvby5CYXJbMF0nKVxuICAgICAqIGlmIChmaWVsZCkgY29uc29sZS5sb2coJ0ZpZWxkIGV4aXN0cyEnKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIGZpZWxkIG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIGZpZWxkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBpZiBvbmUgZXhpc3RzLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmdldEZpZWxkTWF5YmUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGRzID0gdGhpcy5nZXRGaWVsZHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZmllbGRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2lkeF07XG4gICAgICAgICAgICBpZiAoZmllbGQuZ2V0TmFtZSgpID09PSBuYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBmaWVsZCA9IGZvcm0uZ2V0RmllbGQoJ1BhZ2UxLkZvby5CYXJbMF0nKVxuICAgICAqIGBgYFxuICAgICAqIElmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBmaWVsZCBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBmaWVsZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRGaWVsZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGRNYXliZShuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRmllbGRFcnJvcihuYW1lKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYnV0dG9uIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGJ1dHRvbiA9IGZvcm0uZ2V0QnV0dG9uKCdQYWdlMS5Gb28uQnV0dG9uWzBdJylcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBubyBmaWVsZCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSwgb3IgaWZcbiAgICAgKiB0aGUgZmllbGQgZXhpc3RzIGJ1dCBpcyBub3QgYSBidXR0b24uXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgYnV0dG9uIG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIGJ1dHRvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRCdXR0b24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZCdXR0b24pXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGQnV0dG9uLCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGNoZWNrIGJveCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGNoZWNrQm94ID0gZm9ybS5nZXRDaGVja0JveCgnUGFnZTEuRm9vLkNoZWNrQm94WzBdJylcbiAgICAgKiBjaGVja0JveC5jaGVjaygpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUsIG9yIGlmXG4gICAgICogdGhlIGZpZWxkIGV4aXN0cyBidXQgaXMgbm90IGEgY2hlY2sgYm94LlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIGNoZWNrIGJveCBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBjaGVjayBib3ggd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0Q2hlY2tCb3ggPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZDaGVja0JveClcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBQREZDaGVja0JveCwgZmllbGQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkcm9wZG93biBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IGRyb3Bkb3duID0gZm9ybS5nZXREcm9wZG93bignUGFnZTEuRm9vLkRyb3Bkb3duWzBdJylcbiAgICAgKiBjb25zdCBvcHRpb25zID0gZHJvcGRvd24uZ2V0T3B0aW9ucygpXG4gICAgICogZHJvcGRvd24uc2VsZWN0KG9wdGlvbnNbMF0pXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUsIG9yIGlmXG4gICAgICogdGhlIGZpZWxkIGV4aXN0cyBidXQgaXMgbm90IGEgZHJvcGRvd24uXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgZHJvcGRvd24gbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZHJvcGRvd24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0RHJvcGRvd24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZEcm9wZG93bilcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBQREZEcm9wZG93biwgZmllbGQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvcHRpb24gbGlzdCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ1BhZ2UxLkZvby5PcHRpb25MaXN0WzBdJylcbiAgICAgKiBjb25zdCBvcHRpb25zID0gb3B0aW9uTGlzdC5nZXRPcHRpb25zKClcbiAgICAgKiBvcHRpb25MaXN0LnNlbGVjdChvcHRpb25zWzBdKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIG5vIGZpZWxkIGV4aXN0cyB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLCBvciBpZlxuICAgICAqIHRoZSBmaWVsZCBleGlzdHMgYnV0IGlzIG5vdCBhbiBvcHRpb24gbGlzdC5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCBvcHRpb24gbGlzdCBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpb24gbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5nZXRPcHRpb25MaXN0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGT3B0aW9uTGlzdClcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRGaWVsZFR5cGVFcnJvcihuYW1lLCBQREZPcHRpb25MaXN0LCBmaWVsZCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJhZGlvIGdyb3VwIGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnUGFnZTEuRm9vLlJhZGlvR3JvdXBbMF0nKVxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSByYWRpb0dyb3VwLmdldE9wdGlvbnMoKVxuICAgICAqIHJhZGlvR3JvdXAuc2VsZWN0KG9wdGlvbnNbMF0pXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUsIG9yIGlmXG4gICAgICogdGhlIGZpZWxkIGV4aXN0cyBidXQgaXMgbm90IGEgcmFkaW8gZ3JvdXAuXG4gICAgICogQHBhcmFtIG5hbWUgQSBmdWxseSBxdWFsaWZpZWQgcmFkaW8gZ3JvdXAgbmFtZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmFkaW8gZ3JvdXAgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0UmFkaW9Hcm91cCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZ2V0RmllbGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERlJhZGlvR3JvdXApXG4gICAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRmllbGRUeXBlRXJyb3IobmFtZSwgUERGUmFkaW9Hcm91cCwgZmllbGQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaWduYXR1cmUgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBzaWduYXR1cmUgPSBmb3JtLmdldFNpZ25hdHVyZSgnUGFnZTEuRm9vLlNpZ25hdHVyZVswXScpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUsIG9yIGlmXG4gICAgICogdGhlIGZpZWxkIGV4aXN0cyBidXQgaXMgbm90IGEgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSBuYW1lIEEgZnVsbHkgcXVhbGlmaWVkIHNpZ25hdHVyZSBuYW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0U2lnbmF0dXJlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGU2lnbmF0dXJlKVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERlNpZ25hdHVyZSwgZmllbGQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB0ZXh0IGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ1BhZ2UxLkZvby5UZXh0RmllbGRbMF0nKVxuICAgICAqIHRleHRGaWVsZC5zZXRUZXh0KCdBcmUgeW91IGRlc2lnbmVkIHRvIGFjdCBvciB0byBiZSBhY3RlZCB1cG9uPycpXG4gICAgICogYGBgXG4gICAgICogQW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgbm8gZmllbGQgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUsIG9yIGlmXG4gICAgICogdGhlIGZpZWxkIGV4aXN0cyBidXQgaXMgbm90IGEgdGV4dCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gbmFtZSBBIGZ1bGx5IHF1YWxpZmllZCB0ZXh0IGZpZWxkIG5hbWUuXG4gICAgICogQHJldHVybnMgVGhlIHRleHQgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0VGV4dEZpZWxkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5nZXRGaWVsZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGVGV4dEZpZWxkKVxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEZpZWxkVHlwZUVycm9yKG5hbWUsIFBERlRleHRGaWVsZCwgZmllbGQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGJ1dHRvbiBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBidXR0b24gPSBmb3JtLmNyZWF0ZUJ1dHRvbignY29vbC5uZXcuYnV0dG9uJylcbiAgICAgKlxuICAgICAqIGJ1dHRvbi5hZGRUb1BhZ2UoJ0RvIFN0dWZmJywgZm9udCwgcGFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBhIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciB0aGUgbmV3IGJ1dHRvbi5cbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3IGJ1dHRvbiBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5jcmVhdGVCdXR0b24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgbmFtZVBhcnRzID0gc3BsaXRGaWVsZE5hbWUobmFtZSk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyhuYW1lUGFydHMubm9uVGVybWluYWwpO1xuICAgICAgICB2YXIgYnV0dG9uID0gUERGQWNyb1B1c2hCdXR0b24uY3JlYXRlKHRoaXMuZG9jLmNvbnRleHQpO1xuICAgICAgICBidXR0b24uc2V0UGFydGlhbE5hbWUobmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgYWRkRmllbGRUb1BhcmVudChwYXJlbnQsIFtidXR0b24sIGJ1dHRvbi5yZWZdLCBuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICByZXR1cm4gUERGQnV0dG9uLm9mKGJ1dHRvbiwgYnV0dG9uLnJlZiwgdGhpcy5kb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGNoZWNrIGJveCBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBjaGVja0JveCA9IGZvcm0uY3JlYXRlQ2hlY2tCb3goJ2Nvb2wubmV3LmNoZWNrQm94JylcbiAgICAgKlxuICAgICAqIGNoZWNrQm94LmFkZFRvUGFnZShwYWdlKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGEgZmllbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgY2hlY2sgYm94LlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgY2hlY2sgYm94IGZpZWxkLlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmNyZWF0ZUNoZWNrQm94ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IHNwbGl0RmllbGROYW1lKG5hbWUpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMobmFtZVBhcnRzLm5vblRlcm1pbmFsKTtcbiAgICAgICAgdmFyIGNoZWNrQm94ID0gUERGQWNyb0NoZWNrQm94LmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgY2hlY2tCb3guc2V0UGFydGlhbE5hbWUobmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgYWRkRmllbGRUb1BhcmVudChwYXJlbnQsIFtjaGVja0JveCwgY2hlY2tCb3gucmVmXSwgbmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgcmV0dXJuIFBERkNoZWNrQm94Lm9mKGNoZWNrQm94LCBjaGVja0JveC5yZWYsIHRoaXMuZG9jKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBkcm9wZG93biBmaWVsZCBpbiB0aGlzIFtbUERGRm9ybV1dIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBkcm9wZG93biA9IGZvcm0uY3JlYXRlRHJvcGRvd24oJ2Nvb2wubmV3LmRyb3Bkb3duJylcbiAgICAgKlxuICAgICAqIGRyb3Bkb3duLmFkZFRvUGFnZShmb250LCBwYWdlKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGEgZmllbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgZHJvcGRvd24uXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBkcm9wZG93biBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5jcmVhdGVEcm9wZG93biA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBuYW1lUGFydHMgPSBzcGxpdEZpZWxkTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZmluZE9yQ3JlYXRlTm9uVGVybWluYWxzKG5hbWVQYXJ0cy5ub25UZXJtaW5hbCk7XG4gICAgICAgIHZhciBjb21ib0JveCA9IFBERkFjcm9Db21ib0JveC5jcmVhdGUodGhpcy5kb2MuY29udGV4dCk7XG4gICAgICAgIGNvbWJvQm94LnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIGFkZEZpZWxkVG9QYXJlbnQocGFyZW50LCBbY29tYm9Cb3gsIGNvbWJvQm94LnJlZl0sIG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIHJldHVybiBQREZEcm9wZG93bi5vZihjb21ib0JveCwgY29tYm9Cb3gucmVmLCB0aGlzLmRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgb3B0aW9uIGxpc3QgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uY3JlYXRlT3B0aW9uTGlzdCgnY29vbC5uZXcub3B0aW9uTGlzdCcpXG4gICAgICpcbiAgICAgKiBvcHRpb25MaXN0LmFkZFRvUGFnZShmb250LCBwYWdlKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGEgZmllbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgb3B0aW9uIGxpc3QuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyBvcHRpb24gbGlzdCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5jcmVhdGVPcHRpb25MaXN0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgYXNzZXJ0SXMobmFtZSwgJ25hbWUnLCBbJ3N0cmluZyddKTtcbiAgICAgICAgdmFyIG5hbWVQYXJ0cyA9IHNwbGl0RmllbGROYW1lKG5hbWUpO1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5maW5kT3JDcmVhdGVOb25UZXJtaW5hbHMobmFtZVBhcnRzLm5vblRlcm1pbmFsKTtcbiAgICAgICAgdmFyIGxpc3RCb3ggPSBQREZBY3JvTGlzdEJveC5jcmVhdGUodGhpcy5kb2MuY29udGV4dCk7XG4gICAgICAgIGxpc3RCb3guc2V0UGFydGlhbE5hbWUobmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgYWRkRmllbGRUb1BhcmVudChwYXJlbnQsIFtsaXN0Qm94LCBsaXN0Qm94LnJlZl0sIG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIHJldHVybiBQREZPcHRpb25MaXN0Lm9mKGxpc3RCb3gsIGxpc3RCb3gucmVmLCB0aGlzLmRvYyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgcmFkaW8gZ3JvdXAgZmllbGQgaW4gdGhpcyBbW1BERkZvcm1dXSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9udCA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uY3JlYXRlUmFkaW9Hcm91cCgnY29vbC5uZXcucmFkaW9Hcm91cCcpXG4gICAgICpcbiAgICAgKiByYWRpb0dyb3VwLmFkZE9wdGlvblRvUGFnZSgnaXMtZG9nJywgcGFnZSwgeyB5OiAwIH0pXG4gICAgICogcmFkaW9Hcm91cC5hZGRPcHRpb25Ub1BhZ2UoJ2lzLWNhdCcsIHBhZ2UsIHsgeTogNzUgfSlcbiAgICAgKiBgYGBcbiAgICAgKiBBbiBlcnJvciB3aWxsIGJlIHRocm93biBpZiBhIGZpZWxkIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciB0aGUgbmV3IHJhZGlvIGdyb3VwLlxuICAgICAqIEByZXR1cm5zIFRoZSBuZXcgcmFkaW8gZ3JvdXAgZmllbGQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuY3JlYXRlUmFkaW9Hcm91cCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGFzc2VydElzKG5hbWUsICduYW1lJywgWydzdHJpbmcnXSk7XG4gICAgICAgIHZhciBuYW1lUGFydHMgPSBzcGxpdEZpZWxkTmFtZShuYW1lKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZmluZE9yQ3JlYXRlTm9uVGVybWluYWxzKG5hbWVQYXJ0cy5ub25UZXJtaW5hbCk7XG4gICAgICAgIHZhciByYWRpb0J1dHRvbiA9IFBERkFjcm9SYWRpb0J1dHRvbi5jcmVhdGUodGhpcy5kb2MuY29udGV4dCk7XG4gICAgICAgIHJhZGlvQnV0dG9uLnNldFBhcnRpYWxOYW1lKG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIGFkZEZpZWxkVG9QYXJlbnQocGFyZW50LCBbcmFkaW9CdXR0b24sIHJhZGlvQnV0dG9uLnJlZl0sIG5hbWVQYXJ0cy50ZXJtaW5hbCk7XG4gICAgICAgIHJldHVybiBQREZSYWRpb0dyb3VwLm9mKHJhZGlvQnV0dG9uLCByYWRpb0J1dHRvbi5yZWYsIHRoaXMuZG9jKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB0ZXh0IGZpZWxkIGluIHRoaXMgW1tQREZGb3JtXV0gd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHBhZ2UgPSBwZGZEb2MuYWRkUGFnZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKVxuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uY3JlYXRlVGV4dEZpZWxkKCdjb29sLm5ldy50ZXh0RmllbGQnKVxuICAgICAqXG4gICAgICogdGV4dEZpZWxkLmFkZFRvUGFnZShmb250LCBwYWdlKVxuICAgICAqIGBgYFxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIGEgZmllbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZS5cbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBuZXcgcmFkaW8gZ3JvdXAuXG4gICAgICogQHJldHVybnMgVGhlIG5ldyByYWRpbyBncm91cCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS5jcmVhdGVUZXh0RmllbGQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBhc3NlcnRJcyhuYW1lLCAnbmFtZScsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgbmFtZVBhcnRzID0gc3BsaXRGaWVsZE5hbWUobmFtZSk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmZpbmRPckNyZWF0ZU5vblRlcm1pbmFscyhuYW1lUGFydHMubm9uVGVybWluYWwpO1xuICAgICAgICB2YXIgdGV4dCA9IFBERkFjcm9UZXh0LmNyZWF0ZSh0aGlzLmRvYy5jb250ZXh0KTtcbiAgICAgICAgdGV4dC5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydHMudGVybWluYWwpO1xuICAgICAgICBhZGRGaWVsZFRvUGFyZW50KHBhcmVudCwgW3RleHQsIHRleHQucmVmXSwgbmFtZVBhcnRzLnRlcm1pbmFsKTtcbiAgICAgICAgcmV0dXJuIFBERlRleHRGaWVsZC5vZih0ZXh0LCB0ZXh0LnJlZiwgdGhpcy5kb2MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRmxhdHRlbiBhbGwgZmllbGRzIGluIHRoaXMgW1tQREZGb3JtXV0uXG4gICAgICpcbiAgICAgKiBGbGF0dGVuaW5nIGEgZm9ybSBmaWVsZCB3aWxsIHRha2UgdGhlIGN1cnJlbnQgYXBwZWFyYW5jZSBmb3IgZWFjaCBvZiB0aGF0XG4gICAgICogZmllbGQncyB3aWRnZXRzIGFuZCBtYWtlIHRoZW0gcGFydCBvZiB0aGVpciBwYWdlJ3MgY29udGVudCBzdHJlYW0uIEFsbCBmb3JtXG4gICAgICogZmllbGRzIGFuZCBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkIGFyZSB0aGVuIHJlbW92ZWQuIE5vdGUgdGhhdCBvbmNlIGEgZm9ybVxuICAgICAqIGhhcyBiZWVuIGZsYXR0ZW5lZCBpdHMgZmllbGRzIGNhbiBubyBsb25nZXIgYmUgYWNjZXNzZWQgb3IgZWRpdGVkLlxuICAgICAqXG4gICAgICogVGhpcyBvcGVyYXRpb24gaXMgb2Z0ZW4gdXNlZCBhZnRlciBmaWxsaW5nIGZvcm0gZmllbGRzIHRvIGVuc3VyZSBhXG4gICAgICogY29uc2lzdGVudCBhcHBlYXJhbmNlIGFjcm9zcyBkaWZmZXJlbnQgUERGIHJlYWRlcnMgYW5kL29yIHByaW50ZXJzLlxuICAgICAqIEFub3RoZXIgY29tbW9uIHVzZSBjYXNlIGlzIHRvIGNvcHkgYSB0ZW1wbGF0ZSBkb2N1bWVudCB3aXRoIGZvcm0gZmllbGRzXG4gICAgICogaW50byBhbm90aGVyIGRvY3VtZW50LiBJbiB0aGlzIHNjZW5hcmlvIHlvdSB3b3VsZCBsb2FkIHRoZSB0ZW1wbGF0ZVxuICAgICAqIGRvY3VtZW50LCBmaWxsIGl0cyBmaWVsZHMsIGZsYXR0ZW4gaXQsIGFuZCB0aGVuIGNvcHkgaXRzIHBhZ2VzIGludG8gdGhlXG4gICAgICogcmVjaXBpZW50IGRvY3VtZW50IC0gdGhlIGZpbGxlZCBmaWVsZHMgd2lsbCBiZSBjb3BpZWQgb3Zlci5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKCk7XG4gICAgICogZm9ybS5mbGF0dGVuKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUuZmxhdHRlbiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHsgdXBkYXRlRmllbGRBcHBlYXJhbmNlczogdHJ1ZSB9OyB9XG4gICAgICAgIGlmIChvcHRpb25zLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmllbGRBcHBlYXJhbmNlcygpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmaWVsZHMgPSB0aGlzLmdldEZpZWxkcygpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuRmllbGRzID0gZmllbGRzLmxlbmd0aDsgaSA8IGxlbkZpZWxkczsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaV07XG4gICAgICAgICAgICB2YXIgd2lkZ2V0cyA9IGZpZWxkLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgbGVuV2lkZ2V0cyA9IHdpZGdldHMubGVuZ3RoOyBqIDwgbGVuV2lkZ2V0czsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbal07XG4gICAgICAgICAgICAgICAgdmFyIHBhZ2UgPSB0aGlzLmZpbmRXaWRnZXRQYWdlKHdpZGdldCk7XG4gICAgICAgICAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZmluZFdpZGdldEFwcGVhcmFuY2VSZWYoZmllbGQsIHdpZGdldCk7XG4gICAgICAgICAgICAgICAgdmFyIHhPYmplY3RLZXkgPSBwYWdlLm5vZGUubmV3WE9iamVjdCgnRmxhdFdpZGdldCcsIHdpZGdldFJlZik7XG4gICAgICAgICAgICAgICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICAgICAgICAgICAgICB2YXIgb3BlcmF0b3JzID0gX19zcHJlYWRBcnJheXMoW1xuICAgICAgICAgICAgICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUocmVjdGFuZ2xlLngsIHJlY3RhbmdsZS55KVxuICAgICAgICAgICAgICAgIF0sIHJvdGF0ZUluUGxhY2UoX19hc3NpZ24oX19hc3NpZ24oe30sIHJlY3RhbmdsZSksIHsgcm90YXRpb246IDAgfSkpLCBbXG4gICAgICAgICAgICAgICAgICAgIGRyYXdPYmplY3QoeE9iamVjdEtleSksXG4gICAgICAgICAgICAgICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgICAgICAgICBdKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgICAgICAgICAgcGFnZS5wdXNoT3BlcmF0b3JzLmFwcGx5KHBhZ2UsIG9wZXJhdG9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZpZWxkKGZpZWxkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZmllbGQgZnJvbSB0aGlzIFtbUERGRm9ybV1dLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBmb3JtID0gcGRmRG9jLmdldEZvcm0oKTtcbiAgICAgKiBjb25zdCBhZ2VGaWVsZCA9IGZvcm0uZ2V0RmllbGRzKCkuZmluZCh4ID0+IHguZ2V0TmFtZSgpID09PSAnQWdlJyk7XG4gICAgICogZm9ybS5yZW1vdmVGaWVsZChhZ2VGaWVsZCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUucmVtb3ZlRmllbGQgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgdmFyIHdpZGdldHMgPSBmaWVsZC5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICB2YXIgcGFnZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpXTtcbiAgICAgICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmZpbmRXaWRnZXRBcHBlYXJhbmNlUmVmKGZpZWxkLCB3aWRnZXQpO1xuICAgICAgICAgICAgdmFyIHBhZ2UgPSB0aGlzLmZpbmRXaWRnZXRQYWdlKHdpZGdldCk7XG4gICAgICAgICAgICBwYWdlcy5hZGQocGFnZSk7XG4gICAgICAgICAgICBwYWdlLm5vZGUucmVtb3ZlQW5ub3Qod2lkZ2V0UmVmKTtcbiAgICAgICAgfVxuICAgICAgICBwYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChwYWdlKSB7IHJldHVybiBwYWdlLm5vZGUucmVtb3ZlQW5ub3QoZmllbGQucmVmKTsgfSk7XG4gICAgICAgIHRoaXMuYWNyb0Zvcm0ucmVtb3ZlRmllbGQoZmllbGQuYWNyb0ZpZWxkKTtcbiAgICAgICAgdmFyIGZpZWxkS2lkcyA9IGZpZWxkLmFjcm9GaWVsZC5ub3JtYWxpemVkRW50cmllcygpLktpZHM7XG4gICAgICAgIHZhciBraWRzQ291bnQgPSBmaWVsZEtpZHMuc2l6ZSgpO1xuICAgICAgICBmb3IgKHZhciBjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGtpZHNDb3VudDsgY2hpbGRJbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZEtpZHMuZ2V0KGNoaWxkSW5kZXgpO1xuICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgUERGUmVmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2MuY29udGV4dC5kZWxldGUoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9jLmNvbnRleHQuZGVsZXRlKGZpZWxkLnJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgYWxsIHdpZGdldHMgb2YgYWxsIGZpZWxkcyBpbiB0aGlzXG4gICAgICogW1tQREZGb3JtXV0uIEFwcGVhcmFuY2Ugc3RyZWFtcyB3aWxsIG9ubHkgYmUgY3JlYXRlZCBmb3IgYSB3aWRnZXQgaWYgaXRcbiAgICAgKiBkb2VzIG5vdCBoYXZlIGFueSBleGlzdGluZyBhcHBlYXJhbmNlIHN0cmVhbXMsIG9yIHRoZSBmaWVsZCdzIHZhbHVlIGhhc1xuICAgICAqIGNoYW5nZWQgKGUuZy4gYnkgY2FsbGluZyBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gb3JcbiAgICAgKiBbW1BERkRyb3Bkb3duLnNlbGVjdF1dKS5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY291cmllciA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5Db3VyaWVyKVxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogZm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzKGNvdXJpZXIpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiAqKklNUE9SVEFOVDoqKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGBmb250YCBwYXJhbWV0ZXIgaXNcbiAgICAgKiBbW1N0YW5kYXJkRm9udHMuSGVsdmV0aWNhXV0uIE5vdGUgdGhhdCB0aGlzIGlzIGEgV2luQW5zaSBmb250LiBUaGlzIG1lYW5zXG4gICAgICogdGhhdCBlbmNvZGluZyBlcnJvcnMgd2lsbCBiZSB0aHJvd24gaWYgYW55IGZpZWxkcyBjb250YWluIHRleHQgd2l0aFxuICAgICAqIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgV2luQW5zaSBjaGFyYWN0ZXIgc2V0ICh0aGUgbGF0aW4gYWxwaGFiZXQpLlxuICAgICAqXG4gICAgICogRW1iZWRkaW5nIGEgY3VzdG9tIGZvbnQgYW5kIHBhc3NpbmcgdGhhdCBhcyB0aGUgYGZvbnRgXG4gICAgICogcGFyYW1ldGVyIGFsbG93cyB5b3UgdG8gZ2VuZXJhdGUgYXBwZWFyYW5jZSBzdHJlYW1zIHdpdGggbm9uIFdpbkFuc2lcbiAgICAgKiBjaGFyYWN0ZXJzIChhc3N1bWluZyB5b3VyIGN1c3RvbSBmb250IHN1cHBvcnRzIHRoZW0pLlxuICAgICAqXG4gICAgICogPiAqKk5PVEU6KiogVGhlIFtbUERGRG9jdW1lbnQuc2F2ZV1dIG1ldGhvZCB3aWxsIGNhbGwgdGhpcyBtZXRob2QgdG9cbiAgICAgKiA+IHVwZGF0ZSBhcHBlYXJhbmNlcyBhdXRvbWF0aWNhbGx5IGlmIGEgZm9ybSB3YXMgYWNjZXNzZWQgdmlhIHRoZVxuICAgICAqID4gW1tQREZEb2N1bWVudC5nZXRGb3JtXV0gbWV0aG9kIHByaW9yIHRvIHNhdmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb250IE9wdGlvbmFsbHksIHRoZSBmb250IHRvIHVzZSB3aGVuIGNyZWF0aW5nIG5ldyBhcHBlYXJhbmNlcy5cbiAgICAgKi9cbiAgICBQREZGb3JtLnByb3RvdHlwZS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgZm9udCA9IGZvbnQgIT09IG51bGwgJiYgZm9udCAhPT0gdm9pZCAwID8gZm9udCA6IHRoaXMuZ2V0RGVmYXVsdEZvbnQoKTtcbiAgICAgICAgdmFyIGZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGZpZWxkcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IGZpZWxkc1tpZHhdO1xuICAgICAgICAgICAgaWYgKGZpZWxkLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUoKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyhmb250KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogTWFyayBhIGZpZWxkIGFzIGRpcnR5LiBUaGlzIHdpbGwgY2F1c2UgaXRzIGFwcGVhcmFuY2Ugc3RyZWFtcyB0byBiZVxuICAgICAqIHVwZGF0ZWQgYnkgW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXS5cbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdmb28uYmFyJylcbiAgICAgKiBmb3JtLm1hcmtGaWVsZEFzRGlydHkoZmllbGQucmVmKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmaWVsZFJlZiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCB0aGF0IHNob3VsZCBiZSBtYXJrZWQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUubWFya0ZpZWxkQXNEaXJ0eSA9IGZ1bmN0aW9uIChmaWVsZFJlZikge1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChmaWVsZFJlZiwgJ2ZpZWxkUmVmJywgW1tQREZSZWYsICdQREZSZWYnXV0pO1xuICAgICAgICB0aGlzLmRpcnR5RmllbGRzLmFkZChmaWVsZFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYXJrIGEgZmllbGQgYXMgZGlydHkuIFRoaXMgd2lsbCBjYXVzZSBpdHMgYXBwZWFyYW5jZSBzdHJlYW1zIHRvIG5vdCBiZVxuICAgICAqIHVwZGF0ZWQgYnkgW1tQREZGb3JtLnVwZGF0ZUZpZWxkQXBwZWFyYW5jZXNdXS5cbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdmb28uYmFyJylcbiAgICAgKiBmb3JtLm1hcmtGaWVsZEFzQ2xlYW4oZmllbGQucmVmKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmaWVsZFJlZiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCB0aGF0IHNob3VsZCBiZSBtYXJrZWQuXG4gICAgICovXG4gICAgUERGRm9ybS5wcm90b3R5cGUubWFya0ZpZWxkQXNDbGVhbiA9IGZ1bmN0aW9uIChmaWVsZFJlZikge1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChmaWVsZFJlZiwgJ2ZpZWxkUmVmJywgW1tQREZSZWYsICdQREZSZWYnXV0pO1xuICAgICAgICB0aGlzLmRpcnR5RmllbGRzLmRlbGV0ZShmaWVsZFJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpcyB0aGUgc3BlY2lmaWVkIGZpZWxkIGhhcyBiZWVuIG1hcmtlZCBhcyBkaXJ0eS5cbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgZmllbGQgPSBmb3JtLmdldEZpZWxkKCdmb28uYmFyJylcbiAgICAgKiBpZiAoZm9ybS5maWVsZElzRGlydHkoZmllbGQucmVmKSkgY29uc29sZS5sb2coJ0ZpZWxkIGlzIGRpcnR5JylcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZmllbGRSZWYgVGhlIHJlZmVyZW5jZSB0byB0aGUgZmllbGQgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIGZpZWxkIGlzIGRpcnR5LlxuICAgICAqL1xuICAgIFBERkZvcm0ucHJvdG90eXBlLmZpZWxkSXNEaXJ0eSA9IGZ1bmN0aW9uIChmaWVsZFJlZikge1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChmaWVsZFJlZiwgJ2ZpZWxkUmVmJywgW1tQREZSZWYsICdQREZSZWYnXV0pO1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJ0eUZpZWxkcy5oYXMoZmllbGRSZWYpO1xuICAgIH07XG4gICAgUERGRm9ybS5wcm90b3R5cGUuZ2V0RGVmYXVsdEZvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRGb250Q2FjaGUuYWNjZXNzKCk7XG4gICAgfTtcbiAgICBQREZGb3JtLnByb3RvdHlwZS5maW5kV2lkZ2V0UGFnZSA9IGZ1bmN0aW9uICh3aWRnZXQpIHtcbiAgICAgICAgdmFyIHBhZ2VSZWYgPSB3aWRnZXQuUCgpO1xuICAgICAgICB2YXIgcGFnZSA9IHRoaXMuZG9jLmdldFBhZ2VzKCkuZmluZChmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5yZWYgPT09IHBhZ2VSZWY7IH0pO1xuICAgICAgICBpZiAocGFnZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0UmVmID0gdGhpcy5kb2MuY29udGV4dC5nZXRPYmplY3RSZWYod2lkZ2V0LmRpY3QpO1xuICAgICAgICAgICAgaWYgKHdpZGdldFJlZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBQREZSZWYgZm9yIFBERk9iamVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFnZSA9IHRoaXMuZG9jLmZpbmRQYWdlRm9yQW5ub3RhdGlvblJlZih3aWRnZXRSZWYpO1xuICAgICAgICAgICAgaWYgKHBhZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kIHBhZ2UgZm9yIFBERlJlZiBcIiArIHdpZGdldFJlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2U7XG4gICAgfTtcbiAgICBQREZGb3JtLnByb3RvdHlwZS5maW5kV2lkZ2V0QXBwZWFyYW5jZVJlZiA9IGZ1bmN0aW9uIChmaWVsZCwgd2lkZ2V0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHJlZk9yRGljdCA9IHdpZGdldC5nZXROb3JtYWxBcHBlYXJhbmNlKCk7XG4gICAgICAgIGlmIChyZWZPckRpY3QgaW5zdGFuY2VvZiBQREZEaWN0ICYmXG4gICAgICAgICAgICAoZmllbGQgaW5zdGFuY2VvZiBQREZDaGVja0JveCB8fCBmaWVsZCBpbnN0YW5jZW9mIFBERlJhZGlvR3JvdXApKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBmaWVsZC5hY3JvRmllbGQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHZhciByZWYgPSAoX2EgPSByZWZPckRpY3QuZ2V0KHZhbHVlKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogcmVmT3JEaWN0LmdldChQREZOYW1lLm9mKCdPZmYnKSk7XG4gICAgICAgICAgICBpZiAocmVmIGluc3RhbmNlb2YgUERGUmVmKSB7XG4gICAgICAgICAgICAgICAgcmVmT3JEaWN0ID0gcmVmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghKHJlZk9yRGljdCBpbnN0YW5jZW9mIFBERlJlZikpIHtcbiAgICAgICAgICAgIHZhciBuYW1lXzEgPSBmaWVsZC5nZXROYW1lKCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXh0cmFjdCBhcHBlYXJhbmNlIHJlZiBmb3I6IFwiICsgbmFtZV8xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmT3JEaWN0O1xuICAgIH07XG4gICAgUERGRm9ybS5wcm90b3R5cGUuZmluZE9yQ3JlYXRlTm9uVGVybWluYWxzID0gZnVuY3Rpb24gKHBhcnRpYWxOYW1lcykge1xuICAgICAgICB2YXIgbm9uVGVybWluYWwgPSBbXG4gICAgICAgICAgICB0aGlzLmFjcm9Gb3JtLFxuICAgICAgICBdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBwYXJ0aWFsTmFtZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgbmFtZVBhcnQgPSBwYXJ0aWFsTmFtZXNbaWR4XTtcbiAgICAgICAgICAgIGlmICghbmFtZVBhcnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRGaWVsZE5hbWVQYXJ0RXJyb3IobmFtZVBhcnQpO1xuICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gbm9uVGVybWluYWxbMF0sIHBhcmVudFJlZiA9IG5vblRlcm1pbmFsWzFdO1xuICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXMuZmluZE5vblRlcm1pbmFsKG5hbWVQYXJ0LCBwYXJlbnRfMSk7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgbm9uVGVybWluYWwgPSByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IFBERkFjcm9Ob25UZXJtaW5hbC5jcmVhdGUodGhpcy5kb2MuY29udGV4dCk7XG4gICAgICAgICAgICAgICAgbm9kZS5zZXRQYXJ0aWFsTmFtZShuYW1lUGFydCk7XG4gICAgICAgICAgICAgICAgbm9kZS5zZXRQYXJlbnQocGFyZW50UmVmKTtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZVJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIobm9kZS5kaWN0KTtcbiAgICAgICAgICAgICAgICBwYXJlbnRfMS5hZGRGaWVsZChub2RlUmVmKTtcbiAgICAgICAgICAgICAgICBub25UZXJtaW5hbCA9IFtub2RlLCBub2RlUmVmXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9uVGVybWluYWw7XG4gICAgfTtcbiAgICBQREZGb3JtLnByb3RvdHlwZS5maW5kTm9uVGVybWluYWwgPSBmdW5jdGlvbiAocGFydGlhbE5hbWUsIHBhcmVudCkge1xuICAgICAgICB2YXIgZmllbGRzID0gcGFyZW50IGluc3RhbmNlb2YgUERGQWNyb0Zvcm1cbiAgICAgICAgICAgID8gdGhpcy5hY3JvRm9ybS5nZXRGaWVsZHMoKVxuICAgICAgICAgICAgOiBjcmVhdGVQREZBY3JvRmllbGRzKHBhcmVudC5LaWRzKCkpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBmaWVsZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBmaWVsZHNbaWR4XSwgZmllbGQgPSBfYVswXSwgcmVmID0gX2FbMV07XG4gICAgICAgICAgICBpZiAoZmllbGQuZ2V0UGFydGlhbE5hbWUoKSA9PT0gcGFydGlhbE5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvTm9uVGVybWluYWwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbZmllbGQsIHJlZl07XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yKHBhcnRpYWxOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkRvY3VtZW50LmdldEZvcm1dXSBtZXRob2QsIHdoaWNoIHdpbGwgY3JlYXRlIGFuXG4gICAgICogPiBpbnN0YW5jZSBvZiBbW1BERkZvcm1dXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGRm9ybV1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb0Zvcm0gYW5kIGVtYmVkZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb0Zvcm0gVGhlIHVuZGVybHlpbmcgYFBERkFjcm9Gb3JtYCBmb3IgdGhpcyBmb3JtLlxuICAgICAqIEBwYXJhbSBkb2MgVGhlIGRvY3VtZW50IHRvIHdoaWNoIHRoZSBmb3JtIHdpbGwgYmVsb25nLlxuICAgICAqL1xuICAgIFBERkZvcm0ub2YgPSBmdW5jdGlvbiAoYWNyb0Zvcm0sIGRvYykge1xuICAgICAgICByZXR1cm4gbmV3IFBERkZvcm0oYWNyb0Zvcm0sIGRvYyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGRm9ybTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZGb3JtO1xudmFyIGNvbnZlcnRUb1BERkZpZWxkID0gZnVuY3Rpb24gKGZpZWxkLCByZWYsIGRvYykge1xuICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9QdXNoQnV0dG9uKVxuICAgICAgICByZXR1cm4gUERGQnV0dG9uLm9mKGZpZWxkLCByZWYsIGRvYyk7XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb0NoZWNrQm94KVxuICAgICAgICByZXR1cm4gUERGQ2hlY2tCb3gub2YoZmllbGQsIHJlZiwgZG9jKTtcbiAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBQREZBY3JvQ29tYm9Cb3gpXG4gICAgICAgIHJldHVybiBQREZEcm9wZG93bi5vZihmaWVsZCwgcmVmLCBkb2MpO1xuICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9MaXN0Qm94KVxuICAgICAgICByZXR1cm4gUERGT3B0aW9uTGlzdC5vZihmaWVsZCwgcmVmLCBkb2MpO1xuICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9UZXh0KVxuICAgICAgICByZXR1cm4gUERGVGV4dEZpZWxkLm9mKGZpZWxkLCByZWYsIGRvYyk7XG4gICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgUERGQWNyb1JhZGlvQnV0dG9uKSB7XG4gICAgICAgIHJldHVybiBQREZSYWRpb0dyb3VwLm9mKGZpZWxkLCByZWYsIGRvYyk7XG4gICAgfVxuICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFBERkFjcm9TaWduYXR1cmUpIHtcbiAgICAgICAgcmV0dXJuIFBERlNpZ25hdHVyZS5vZihmaWVsZCwgcmVmLCBkb2MpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbnZhciBzcGxpdEZpZWxkTmFtZSA9IGZ1bmN0aW9uIChmdWxseVF1YWxpZmllZE5hbWUpIHtcbiAgICBpZiAoZnVsbHlRdWFsaWZpZWROYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BERiBmaWVsZCBuYW1lcyBtdXN0IG5vdCBiZSBlbXB0eSBzdHJpbmdzJyk7XG4gICAgfVxuICAgIHZhciBwYXJ0cyA9IGZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdCgnLicpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHBhcnRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBpZiAocGFydHNbaWR4XSA9PT0gJycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBlcmlvZHMgaW4gUERGIGZpZWxkIG5hbWVzIG11c3QgYmUgc2VwYXJhdGVkIGJ5IGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXI6IFxcXCJcIiArIGZ1bGx5UXVhbGlmaWVkTmFtZSArIFwiXFxcIlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAxKVxuICAgICAgICByZXR1cm4geyBub25UZXJtaW5hbDogW10sIHRlcm1pbmFsOiBwYXJ0c1swXSB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vblRlcm1pbmFsOiBwYXJ0cy5zbGljZSgwLCBwYXJ0cy5sZW5ndGggLSAxKSxcbiAgICAgICAgdGVybWluYWw6IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLFxuICAgIH07XG59O1xudmFyIGFkZEZpZWxkVG9QYXJlbnQgPSBmdW5jdGlvbiAoX2EsIF9iLCBwYXJ0aWFsTmFtZSkge1xuICAgIHZhciBwYXJlbnQgPSBfYVswXSwgcGFyZW50UmVmID0gX2FbMV07XG4gICAgdmFyIGZpZWxkID0gX2JbMF0sIGZpZWxkUmVmID0gX2JbMV07XG4gICAgdmFyIGVudHJpZXMgPSBwYXJlbnQubm9ybWFsaXplZEVudHJpZXMoKTtcbiAgICB2YXIgZmllbGRzID0gY3JlYXRlUERGQWNyb0ZpZWxkcygnS2lkcycgaW4gZW50cmllcyA/IGVudHJpZXMuS2lkcyA6IGVudHJpZXMuRmllbGRzKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBmaWVsZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGlmIChmaWVsZHNbaWR4XVswXS5nZXRQYXJ0aWFsTmFtZSgpID09PSBwYXJ0aWFsTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZpZWxkQWxyZWFkeUV4aXN0c0Vycm9yKHBhcnRpYWxOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXJlbnQuYWRkRmllbGQoZmllbGRSZWYpO1xuICAgIGZpZWxkLnNldFBhcmVudChwYXJlbnRSZWYpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkZvcm0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGUGFnZSBmcm9tIFwiLi4vUERGUGFnZVwiO1xuaW1wb3J0IFBERkZvbnQgZnJvbSBcIi4uL1BERkZvbnRcIjtcbmltcG9ydCBQREZGaWVsZCwgeyBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zLCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5pbXBvcnQgeyBub3JtYWxpemVBcHBlYXJhbmNlLCBkZWZhdWx0T3B0aW9uTGlzdEFwcGVhcmFuY2VQcm92aWRlciwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuaW1wb3J0IHsgcmdiIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFBERkhleFN0cmluZywgUERGU3RyZWFtLCBQREZBY3JvTGlzdEJveCwgQWNyb0Nob2ljZUZsYWdzLCB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBhc3NlcnRJcywgYXNzZXJ0SXNTdWJzZXQsIGFzc2VydE9yVW5kZWZpbmVkLCBhc3NlcnRQb3NpdGl2ZSwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhbiBvcHRpb24gbGlzdCBmaWVsZCBvZiBhIFtbUERGRm9ybV1dLlxuICpcbiAqIFtbUERGT3B0aW9uTGlzdF1dIGZpZWxkcyBhcmUgaW50ZXJhY3RpdmUgbGlzdHMgb2Ygb3B0aW9ucy4gVGhlIHB1cnBvc2Ugb2YgYW5cbiAqIG9wdGlvbiBsaXN0IGlzIHRvIGVuYWJsZSB1c2VycyB0byBzZWxlY3Qgb25lIG9yIG1vcmUgb3B0aW9ucyBmcm9tIGEgc2V0IG9mXG4gKiBwb3NzaWJsZSBvcHRpb25zLiBVc2VycyBhcmUgYWJsZSB0byBzZWUgdGhlIGZ1bGwgc2V0IG9mIG9wdGlvbnMgd2l0aG91dFxuICogZmlyc3QgaGF2aW5nIHRvIGNsaWNrIG9uIHRoZSBmaWVsZCAodGhvdWdoIHNjcm9sbGluZyBtYXkgYmUgbmVjZXNzYXJ5KS5cbiAqIENsaWNraW5nIGFuIG9wdGlvbiBpbiB0aGUgbGlzdCB3aWxsIGNhdXNlIGl0IHRvIGJlIHNlbGVjdGVkIGFuZCBkaXNwbGF5ZWRcbiAqIHdpdGggYSBoaWdobGlnaHRlZCBiYWNrZ3JvdW5kLiBTb21lIG9wdGlvbiBsaXN0cyBhbGxvdyB1c2VycyB0byBzZWxlY3RcbiAqIG1vcmUgdGhhbiBvbmUgb3B0aW9uIChzZWUgW1tQREZPcHRpb25MaXN0LmlzTXVsdGlzZWxlY3RdXSkuXG4gKi9cbnZhciBQREZPcHRpb25MaXN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZPcHRpb25MaXN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk9wdGlvbkxpc3QoYWNyb0xpc3RCb3gsIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9MaXN0Qm94LCByZWYsIGRvYykgfHwgdGhpcztcbiAgICAgICAgYXNzZXJ0SXMoYWNyb0xpc3RCb3gsICdhY3JvTGlzdEJveCcsIFtbUERGQWNyb0xpc3RCb3gsICdQREZBY3JvTGlzdEJveCddXSk7XG4gICAgICAgIF90aGlzLmFjcm9GaWVsZCA9IGFjcm9MaXN0Qm94O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgb3B0aW9ucyBmb3IgdGhpcyBvcHRpb24gbGlzdC4gVGhlc2Ugb3B0aW9ucyB3aWxsXG4gICAgICogYmUgZGlzcGxheWVkIHRvIHVzZXJzIHdobyB2aWV3IHRoaXMgb3B0aW9uIGxpc3QgaW4gYSBQREYgcmVhZGVyLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBjb25zdCBvcHRpb25zID0gb3B0aW9uTGlzdC5nZXRPcHRpb25zKClcbiAgICAgKiBjb25zb2xlLmxvZygnT3B0aW9uIExpc3Qgb3B0aW9uczonLCBvcHRpb25zKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpb25zIGZvciB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByYXdPcHRpb25zID0gdGhpcy5hY3JvRmllbGQuZ2V0T3B0aW9ucygpO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IG5ldyBBcnJheShyYXdPcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSByYXdPcHRpb25zW2lkeF0sIGRpc3BsYXkgPSBfYS5kaXNwbGF5LCB2YWx1ZSA9IF9hLnZhbHVlO1xuICAgICAgICAgICAgb3B0aW9uc1tpZHhdID0gKGRpc3BsYXkgIT09IG51bGwgJiYgZGlzcGxheSAhPT0gdm9pZCAwID8gZGlzcGxheSA6IHZhbHVlKS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIG9wdGlvbnMgZm9yIHRoaXMgb3B0aW9uIGxpc3QuIFRoZXNlIGFyZSB0aGUgdmFsdWVzIHRoYXRcbiAgICAgKiB3ZXJlIHNlbGVjdGVkIGJ5IGEgaHVtYW4gdXNlciB2aWEgYSBQREYgcmVhZGVyLCBvciBwcm9ncmFtYXRpY2FsbHkgdmlhXG4gICAgICogc29mdHdhcmUuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIGNvbnN0IHNlbGVjdGlvbnMgPSBvcHRpb25MaXN0LmdldFNlbGVjdGVkKClcbiAgICAgKiBjb25zb2xlLmxvZygnT3B0aW9uIExpc3Qgc2VsZWN0aW9uczonLCBzZWxlY3Rpb25zKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBzZWxlY3RlZCBvcHRpb25zIGZvciB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmdldFNlbGVjdGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0VmFsdWVzKCk7XG4gICAgICAgIHZhciBzZWxlY3RlZCA9IG5ldyBBcnJheSh2YWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgc2VsZWN0ZWRbaWR4XSA9IHZhbHVlc1tpZHhdLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uIGxpc3QuIFRoZXNlIGFyZVxuICAgICAqIHRoZSB2YWx1ZXMgdGhhdCB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgdG8gc2VsZWN0IHdoZW4gdGhleSB2aWV3IHRoaXNcbiAgICAgKiBvcHRpb24gbGlzdCBpbiBhIFBERiByZWFkZXIuIE5vdGUgdGhhdCBwcmVleGlzdGluZyBvcHRpb25zIGZvciB0aGlzXG4gICAgICogb3B0aW9uIGxpc3Qgd2lsbCBiZSByZW1vdmVkLiBPbmx5IHRoZSB2YWx1ZXMgcGFzc2VkIGFzIGBvcHRpb25zYCB3aWxsIGJlXG4gICAgICogYXZhaWxhYmxlIHRvIHNlbGVjdC5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgncGxhbmV0cy5vcHRpb25MaXN0JylcbiAgICAgKiBvcHRpb25MaXN0LnNldE9wdGlvbnMoWydFYXJ0aCcsICdNYXJzJywgJ1BsdXRvJywgJ1ZlbnVzJ10pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyBvcHRpb24gbGlzdCBhcyBkaXJ0eSwgY2F1c2luZyBpdHMgYXBwZWFyYW5jZVxuICAgICAqIHN0cmVhbXMgdG8gYmUgdXBkYXRlZCB3aGVuIGVpdGhlciBbW1BERkRvY3VtZW50LnNhdmVdXSBvclxuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gaXMgY2FsbGVkLiBUaGUgdXBkYXRlZCBzdHJlYW1zIHdpbGxcbiAgICAgKiBkaXNwbGF5IHRoZSBvcHRpb25zIHRoaXMgZmllbGQgY29udGFpbnMgaW5zaWRlIHRoZSB3aWRnZXRzIG9mIHRoaXMgdGV4dFxuICAgICAqIGZpZWxkICh3aXRoIHNlbGVjdGVkIG9wdGlvbnMgaGlnaGxpZ2h0ZWQpLlxuICAgICAqXG4gICAgICogKipJTVBPUlRBTlQ6KiogVGhlIGRlZmF1bHQgZm9udCB1c2VkIHRvIHVwZGF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgaXNcbiAgICAgKiBbW1N0YW5kYXJkRm9udHMuSGVsdmV0aWNhXV0uIE5vdGUgdGhhdCB0aGlzIGlzIGEgV2luQW5zaSBmb250LiBUaGlzIG1lYW5zXG4gICAgICogdGhhdCBlbmNvZGluZyBlcnJvcnMgd2lsbCBiZSB0aHJvd24gaWYgdGhpcyBmaWVsZCBjb250YWlucyBhbnkgb3B0aW9uc1xuICAgICAqIHdpdGggY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBXaW5BbnNpIGNoYXJhY3RlciBzZXQgKHRoZSBsYXRpbiBhbHBoYWJldCkuXG4gICAgICpcbiAgICAgKiBFbWJlZGRpbmcgYSBjdXN0b20gZm9udCBhbmQgcGFzc2luZyBpdCB0b1xuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gb3IgW1tQREZPcHRpb25MaXN0LnVwZGF0ZUFwcGVhcmFuY2VzXV1cbiAgICAgKiBhbGxvd3MgeW91IHRvIGdlbmVyYXRlIGFwcGVhcmFuY2Ugc3RyZWFtcyB3aXRoIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGVcbiAgICAgKiBsYXRpbiBhbHBoYWJldCAoYXNzdW1pbmcgdGhlIGN1c3RvbSBmb250IHN1cHBvcnRzIHRoZW0pLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbnMsICdvcHRpb25zJywgW0FycmF5XSk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdmFyIG9wdGlvbk9iamVjdHMgPSBuZXcgQXJyYXkob3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgb3B0aW9uT2JqZWN0c1tpZHhdID0geyB2YWx1ZTogUERGSGV4U3RyaW5nLmZyb21UZXh0KG9wdGlvbnNbaWR4XSkgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRPcHRpb25zKG9wdGlvbk9iamVjdHMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIHRvIHRoZSBsaXN0IG9mIG9wdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbiBsaXN0LiBVc2Vyc1xuICAgICAqIHdpbGwgYmUgYWJsZSB0byBzZWxlY3QgdGhlc2UgdmFsdWVzIGluIGEgUERGIHJlYWRlci4gSW4gYWRkaXRpb24gdG8gdGhlXG4gICAgICogdmFsdWVzIHBhc3NlZCBhcyBgb3B0aW9uc2AsIGFueSBwcmVleGlzdGluZyBvcHRpb25zIGZvciB0aGlzIG9wdGlvbiBsaXN0XG4gICAgICogd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUgZm9yIHVzZXJzIHRvIHNlbGVjdC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3JvY2tldHMub3B0aW9uTGlzdCcpXG4gICAgICogb3B0aW9uTGlzdC5hZGRPcHRpb25zKFsnU2F0dXJuIElWJywgJ0ZhbGNvbiBIZWF2eSddKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIG9wdGlvbiBsaXN0IGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERk9wdGlvbkxpc3Quc2V0T3B0aW9uc11dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIE5ldyBvcHRpb25zIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmFkZE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBhc3NlcnRJcyhvcHRpb25zLCAnb3B0aW9ucycsIFsnc3RyaW5nJywgQXJyYXldKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB2YXIgb3B0aW9uc0FyciA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogW29wdGlvbnNdO1xuICAgICAgICB2YXIgZXhpc3RpbmdPcHRpb25zID0gdGhpcy5hY3JvRmllbGQuZ2V0T3B0aW9ucygpO1xuICAgICAgICB2YXIgbmV3T3B0aW9ucyA9IG5ldyBBcnJheShvcHRpb25zQXJyLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnNBcnIubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBuZXdPcHRpb25zW2lkeF0gPSB7IHZhbHVlOiBQREZIZXhTdHJpbmcuZnJvbVRleHQob3B0aW9uc0FycltpZHhdKSB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldE9wdGlvbnMoZXhpc3RpbmdPcHRpb25zLmNvbmNhdChuZXdPcHRpb25zKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZWxlY3Qgb25lIG9yIG1vcmUgdmFsdWVzIGZvciB0aGlzIG9wdGlvbiBsaXN0LiBUaGlzIG9wZXJhdGlvbiBpcyBhbmFsb2dvdXNcbiAgICAgKiB0byBhIGh1bWFuIHVzZXIgb3BlbmluZyB0aGUgb3B0aW9uIGxpc3QgaW4gYSBQREYgcmVhZGVyIGFuZCBjbGlja2luZyBvbiBvbmVcbiAgICAgKiBvciBtb3JlIHZhbHVlcyB0byBzZWxlY3QgdGhlbS4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgc3RhdGVcbiAgICAgKiBvZiB0aGUgb3B0aW9uIGxpc3QgdG8gaW5kaWNhdGUgd2hpY2ggdmFsdWVzIGhhdmUgYmVlbiBzZWxlY3RlZC4gUERGXG4gICAgICogbGlicmFyaWVzIGFuZCByZWFkZXJzIHdpbGwgYmUgYWJsZSB0byBleHRyYWN0IHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBzYXZlZFxuICAgICAqIGRvY3VtZW50IGFuZCBkZXRlcm1pbmUgd2hpY2ggdmFsdWVzIHdlcmUgc2VsZWN0ZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdiZXN0LnN1cGVyaGVyb2VzLm9wdGlvbkxpc3QnKVxuICAgICAqIG9wdGlvbkxpc3Quc2VsZWN0KFsnT25lIFB1bmNoIE1hbicsICdJcm9uIE1hbiddKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIG9wdGlvbiBsaXN0IGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERk9wdGlvbkxpc3Quc2V0T3B0aW9uc11dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHNlbGVjdGVkLlxuICAgICAqIEBwYXJhbSBtZXJnZSBXaGV0aGVyIG9yIG5vdCBleGlzdGluZyBzZWxlY3Rpb25zIHNob3VsZCBiZSBwcmVzZXJ2ZWQuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24gKG9wdGlvbnMsIG1lcmdlKSB7XG4gICAgICAgIGlmIChtZXJnZSA9PT0gdm9pZCAwKSB7IG1lcmdlID0gZmFsc2U7IH1cbiAgICAgICAgYXNzZXJ0SXMob3B0aW9ucywgJ29wdGlvbnMnLCBbJ3N0cmluZycsIEFycmF5XSk7XG4gICAgICAgIGFzc2VydElzKG1lcmdlLCAnbWVyZ2UnLCBbJ2Jvb2xlYW4nXSk7XG4gICAgICAgIHZhciBvcHRpb25zQXJyID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBbb3B0aW9uc107XG4gICAgICAgIHZhciB2YWxpZE9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgYXNzZXJ0SXNTdWJzZXQob3B0aW9uc0FyciwgJ29wdGlvbicsIHZhbGlkT3B0aW9ucyk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgaWYgKG9wdGlvbnNBcnIubGVuZ3RoID4gMSB8fCAob3B0aW9uc0Fyci5sZW5ndGggPT09IDEgJiYgbWVyZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZU11bHRpc2VsZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlcyA9IG5ldyBBcnJheShvcHRpb25zQXJyLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnNBcnIubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YWx1ZXNbaWR4XSA9IFBERkhleFN0cmluZy5mcm9tVGV4dChvcHRpb25zQXJyW2lkeF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXJnZSkge1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0VmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZXMoZXhpc3RpbmdWYWx1ZXMuY29uY2F0KHZhbHVlcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWVzKHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBzZWxlY3RlZCB2YWx1ZXMgZm9yIHRoaXMgb3B0aW9uIGxpc3QuIFRoaXMgb3BlcmF0aW9uIGlzXG4gICAgICogZXF1aXZhbGVudCB0byBzZWxlY3RpbmcgYW4gZW1wdHkgbGlzdC4gVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgdGhlXG4gICAgICogdW5kZXJseWluZyBzdGF0ZSBvZiB0aGUgb3B0aW9uIGxpc3QgdG8gaW5kaWNhdGUgdGhhdCBubyB2YWx1ZXMgaGF2ZSBiZWVuXG4gICAgICogc2VsZWN0ZWQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuY2xlYXIoKVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIG9wdGlvbiBsaXN0IGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERk9wdGlvbkxpc3Quc2V0T3B0aW9uc11dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlcyhbXSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZvbnQgc2l6ZSBmb3IgdGhlIHRleHQgaW4gdGhpcyBmaWVsZC4gVGhlcmUgbmVlZHMgdG8gYmUgYVxuICAgICAqIGRlZmF1bHQgYXBwZWFyYW5jZSBzdHJpbmcgKERBKSBzZXQgd2l0aCBhIGZvbnQgdmFsdWUgc3BlY2lmaWVkXG4gICAgICogZm9yIHRoaXMgdG8gd29yay4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3Quc2V0Rm9udFNpemUoNCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnRTaXplIFRoZSBmb250IHNpemUgdG8gc2V0IHRoZSBmb250IHRvLlxuICAgICAqL1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZm9udCBzaXplIGZvciB0aGlzIGZpZWxkLiBMYXJnZXIgZm9udCBzaXplcyB3aWxsIHJlc3VsdCBpbiBsYXJnZXJcbiAgICAgKiB0ZXh0IGJlaW5nIGRpc3BsYXllZCB3aGVuIFBERiByZWFkZXJzIHJlbmRlciB0aGlzIG9wdGlvbiBsaXN0LiBGb250IHNpemVzXG4gICAgICogbWF5IGJlIGludGVnZXIgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gU3VwcGx5aW5nIGEgbmVnYXRpdmUgZm9udCBzaXplXG4gICAgICogd2lsbCBjYXVzZSB0aGlzIG1ldGhvZCB0byB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LnNldEZvbnRTaXplKDQpXG4gICAgICogb3B0aW9uTGlzdC5zZXRGb250U2l6ZSgxNS43KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPiBUaGlzIG1ldGhvZCBkZXBlbmRzIHVwb24gdGhlIGV4aXN0ZW5jZSBvZiBhIGRlZmF1bHQgYXBwZWFyYW5jZVxuICAgICAqID4gKGAvREFgKSBzdHJpbmcuIElmIHRoaXMgZmllbGQgZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgYXBwZWFyYW5jZSBzdHJpbmcsXG4gICAgICogPiBvciB0aGF0IHN0cmluZyBkb2VzIG5vdCBjb250YWluIGEgZm9udCBzaXplICh2aWEgdGhlIGBUZmAgb3BlcmF0b3IpLFxuICAgICAqID4gdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvbnRTaXplIFRoZSBmb250IHNpemUgdG8gYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0ZXh0IGluIHRoaXMgZmllbGQuXG4gICAgICovXG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUuc2V0Rm9udFNpemUgPSBmdW5jdGlvbiAoZm9udFNpemUpIHtcbiAgICAgICAgYXNzZXJ0UG9zaXRpdmUoZm9udFNpemUsICdmb250U2l6ZScpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBvcHRpb25zIG9mIHRoaXMgb3B0aW9uIGxpc3QgYXJlIGFsd2F5cyBkaXNwbGF5ZWRcbiAgICAgKiBpbiBhbHBoYWJldGljYWwgb3JkZXIsIGlycmVzcGVjdGl2ZSBvZiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIG9wdGlvbnNcbiAgICAgKiB3ZXJlIGFkZGVkIHRvIHRoZSBvcHRpb24gbGlzdC4gU2VlIFtbUERGT3B0aW9uTGlzdC5lbmFibGVTb3J0aW5nXV0gYW5kXG4gICAgICogW1tQREZPcHRpb25MaXN0LmRpc2FibGVTb3J0aW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBpZiAob3B0aW9uTGlzdC5pc1NvcnRlZCgpKSBjb25zb2xlLmxvZygnU29ydGluZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIG9wdGlvbiBsaXN0IGlzIHNvcnRlZC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5pc1NvcnRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLlNvcnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWx3YXlzIGRpc3BsYXkgdGhlIG9wdGlvbnMgb2YgdGhpcyBvcHRpb24gbGlzdCBpbiBhbHBoYWJldGljYWwgb3JkZXIsXG4gICAgICogaXJyZXNwZWN0aXZlIG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgb3B0aW9ucyB3ZXJlIGFkZGVkIHRvIHRoaXMgb3B0aW9uXG4gICAgICogbGlzdC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5lbmFibGVTb3J0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5lbmFibGVTb3J0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLlNvcnQsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRG8gbm90IGFsd2F5cyBkaXNwbGF5IHRoZSBvcHRpb25zIG9mIHRoaXMgb3B0aW9uIGxpc3QgaW4gYWxwaGFiZXRpY2FsXG4gICAgICogb3JkZXIuIEluc3RlYWQsIGRpc3BsYXkgdGhlIG9wdGlvbnMgaW4gd2hpY2hldmVyIG9yZGVyIHRoZXkgd2VyZSBhZGRlZFxuICAgICAqIHRvIHRoaXMgb3B0aW9uIGxpc3QuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmRpc2FibGVTb3J0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5kaXNhYmxlU29ydGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5Tb3J0LCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBtdWx0aXBsZSBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZCBmcm9tIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICogU2VlIFtbUERGT3B0aW9uTGlzdC5lbmFibGVNdWx0aXNlbGVjdF1dIGFuZFxuICAgICAqIFtbUERGT3B0aW9uTGlzdC5kaXNhYmxlTXVsdGlzZWxlY3RdXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIGlmIChvcHRpb25MaXN0LmlzTXVsdGlzZWxlY3QoKSkgY29uc29sZS5sb2coJ011bHRpc2VsZWN0IGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IG11bHRpcGxlIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmlzTXVsdGlzZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5NdWx0aVNlbGVjdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2VycyB0byBzZWxlY3QgbW9yZSB0aGFuIG9uZSBvcHRpb24gZnJvbSB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmVuYWJsZU11bHRpc2VsZWN0KClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5lbmFibGVNdWx0aXNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5NdWx0aVNlbGVjdCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgYWxsb3cgdXNlcnMgdG8gc2VsZWN0IG1vcmUgdGhhbiBvbmUgb3B0aW9uIGZyb20gdGhpcyBvcHRpb24gbGlzdC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5kaXNhYmxlTXVsdGlzZWxlY3QoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmRpc2FibGVNdWx0aXNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9DaG9pY2VGbGFncy5NdWx0aVNlbGVjdCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9wdGlvbiBzZWxlY3RlZCBieSBhIHVzZXIgaXMgc3RvcmVkLCBvciBcImNvbW1pdHRlZFwiLFxuICAgICAqIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBvcHRpb24uIFRoZSBhbHRlcm5hdGl2ZSBpcyB0aGF0IHRoZSB1c2VyJ3NcbiAgICAgKiBzZWxlY3Rpb24gaXMgc3RvcmVkIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoaXMgb3B0aW9uIGxpc3QgZmllbGQgKGJ5XG4gICAgICogY2xpY2tpbmcgb3V0c2lkZSBvZiBpdCAtIG9uIGFub3RoZXIgZmllbGQsIGZvciBleGFtcGxlKS4gU2VlXG4gICAgICogW1tQREZPcHRpb25MaXN0LmVuYWJsZVNlbGVjdE9uQ2xpY2tdXSBhbmRcbiAgICAgKiBbW1BERk9wdGlvbkxpc3QuZGlzYWJsZVNlbGVjdE9uQ2xpY2tdXS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIGlmIChvcHRpb25MaXN0LmlzU2VsZWN0T25DbGljaygpKSBjb25zb2xlLmxvZygnU2VsZWN0IG9uIGNsaWNrIGlzIGVuYWJsZWQnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IG9wdGlvbnMgYXJlIHNlbGVjdGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZXkgYXJlXG4gICAgICogICAgICAgICAgY2xpY2tlZC5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5pc1NlbGVjdE9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9DaG9pY2VGbGFncy5Db21taXRPblNlbENoYW5nZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTdG9yZSB0aGUgb3B0aW9uIHNlbGVjdGVkIGJ5IGEgdXNlciBpbW1lZGlhdGVseSBhZnRlciB0aGUgdXNlciBjbGlja3MgdGhlXG4gICAgICogb3B0aW9uLiBEbyBub3Qgd2FpdCBmb3IgdGhlIHVzZXIgdG8gbGVhdmUgdGhpcyBvcHRpb24gbGlzdCBmaWVsZCAoYnlcbiAgICAgKiBjbGlja2luZyBvdXRzaWRlIG9mIGl0IC0gb24gYW5vdGhlciBmaWVsZCwgZm9yIGV4YW1wbGUpLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC5lbmFibGVTZWxlY3RPbkNsaWNrKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5lbmFibGVTZWxlY3RPbkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkNvbW1pdE9uU2VsQ2hhbmdlLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdhaXQgdG8gc3RvcmUgdGhlIG9wdGlvbiBzZWxlY3RlZCBieSBhIHVzZXIgdW50aWwgdGhleSBsZWF2ZSB0aGlzIG9wdGlvblxuICAgICAqIGxpc3QgZmllbGQgKGJ5IGNsaWNraW5nIG91dHNpZGUgb2YgaXQgLSBvbiBhbm90aGVyIGZpZWxkLCBmb3IgZXhhbXBsZSkuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5nZXRPcHRpb25MaXN0KCdzb21lLm9wdGlvbkxpc3QuZmllbGQnKVxuICAgICAqIG9wdGlvbkxpc3QuZGlzYWJsZVNlbGVjdE9uQ2xpY2soKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmRpc2FibGVTZWxlY3RPbkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0Nob2ljZUZsYWdzLkNvbW1pdE9uU2VsQ2hhbmdlLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93IHRoaXMgb3B0aW9uIGxpc3Qgb24gdGhlIHNwZWNpZmllZCBwYWdlLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHVidW50dUZvbnQgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KHVidW50dUZvbnRCeXRlcylcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCBvcHRpb25MaXN0ID0gZm9ybS5jcmVhdGVPcHRpb25MaXN0KCdiZXN0Lmd1bmRhbXMnKVxuICAgICAqIG9wdGlvbkxpc3Quc2V0T3B0aW9ucyhbJ0V4aWEnLCAnRHluYW1lcycsICdLeXJpb3MnLCAnVmlydHVlJ10pXG4gICAgICogb3B0aW9uTGlzdC5zZWxlY3QoWydFeGlhJywgJ1ZpcnR1ZSddKVxuICAgICAqXG4gICAgICogb3B0aW9uTGlzdC5hZGRUb1BhZ2UocGFnZSwge1xuICAgICAqICAgeDogNTAsXG4gICAgICogICB5OiA3NSxcbiAgICAgKiAgIHdpZHRoOiAyMDAsXG4gICAgICogICBoZWlnaHQ6IDEwMCxcbiAgICAgKiAgIHRleHRDb2xvcjogcmdiKDEsIDAsIDApLFxuICAgICAqICAgYmFja2dyb3VuZENvbG9yOiByZ2IoMCwgMSwgMCksXG4gICAgICogICBib3JkZXJDb2xvcjogcmdiKDAsIDAsIDEpLFxuICAgICAqICAgYm9yZGVyV2lkdGg6IDIsXG4gICAgICogICByb3RhdGU6IGRlZ3JlZXMoOTApLFxuICAgICAqICAgZm9udDogdWJ1bnR1Rm9udCxcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgd2lkZ2V0IGZvciB0aGlzIG9wdGlvbiBsaXN0IGZpZWxkLlxuICAgICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIHdoaWNoIHRoaXMgb3B0aW9uIGxpc3Qgd2lkZ2V0IHNob3VsZCBiZSBhZGRlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gYWRkaW5nIHRoaXMgb3B0aW9uIGxpc3Qgd2lkZ2V0LlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLmFkZFRvUGFnZSA9IGZ1bmN0aW9uIChwYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbW1BERlBhZ2UsICdQREZQYWdlJ11dKTtcbiAgICAgICAgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAoISgndGV4dENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMudGV4dENvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYmFja2dyb3VuZENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYmFja2dyb3VuZENvbG9yID0gcmdiKDEsIDEsIDEpO1xuICAgICAgICBpZiAoISgnYm9yZGVyQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlcldpZHRoJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyV2lkdGggPSAxO1xuICAgICAgICAvLyBDcmVhdGUgYSB3aWRnZXQgZm9yIHRoaXMgb3B0aW9uIGxpc3RcbiAgICAgICAgdmFyIHdpZGdldCA9IHRoaXMuY3JlYXRlV2lkZ2V0KHtcbiAgICAgICAgICAgIHg6IChfYSA9IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMueSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCxcbiAgICAgICAgICAgIHdpZHRoOiAoX2MgPSBvcHRpb25zLndpZHRoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAyMDAsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAxMDAsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IG9wdGlvbnMudGV4dENvbG9yLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IChfZSA9IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IDAsXG4gICAgICAgICAgICByb3RhdGU6IChfZiA9IG9wdGlvbnMucm90YXRlKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBkZWdyZWVzKDApLFxuICAgICAgICAgICAgaGlkZGVuOiBvcHRpb25zLmhpZGRlbixcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UucmVmLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHdpZGdldFJlZiA9IHRoaXMuZG9jLmNvbnRleHQucmVnaXN0ZXIod2lkZ2V0LmRpY3QpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoaXMgZmllbGRcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuYWRkV2lkZ2V0KHdpZGdldFJlZik7XG4gICAgICAgIC8vIFNldCBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIHdpZGdldFxuICAgICAgICB2YXIgZm9udCA9IChfZyA9IG9wdGlvbnMuZm9udCkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogdGhpcy5kb2MuZ2V0Rm9ybSgpLmdldERlZmF1bHRGb250KCk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIGZvbnQpO1xuICAgICAgICAvLyBBZGQgd2lkZ2V0IHRvIHRoZSBnaXZlbiBwYWdlXG4gICAgICAgIHBhZ2Uubm9kZS5hZGRBbm5vdCh3aWRnZXRSZWYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBvcHRpb24gbGlzdCBoYXMgYmVlbiBtYXJrZWQgYXMgZGlydHksIG9yIGlmIGFueSBvZlxuICAgICAqIHRoaXMgb3B0aW9uIGxpc3QncyB3aWRnZXRzIGRvIG5vdCBoYXZlIGFuIGFwcGVhcmFuY2Ugc3RyZWFtLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogaWYgKG9wdGlvbkxpc3QubmVlZHNBcHBlYXJhbmNlc1VwZGF0ZSgpKSBjb25zb2xlLmxvZygnTmVlZHMgdXBkYXRlJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIG9wdGlvbiBsaXN0IG5lZWRzIGFuIGFwcGVhcmFuY2UgdXBkYXRlLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSgpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBoYXNBcHBlYXJhbmNlcyA9ICgoX2EgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZXMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vcm1hbCkgaW5zdGFuY2VvZiBQREZTdHJlYW07XG4gICAgICAgICAgICBpZiAoIWhhc0FwcGVhcmFuY2VzKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgb3B0aW9uIGxpc3QncyB3aWRnZXRzIHVzaW5nXG4gICAgICogdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSBwcm92aWRlciBmb3Igb3B0aW9uIGxpc3RzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGhlbHZldGljYSA9IGF3YWl0IHBkZkRvYy5lbWJlZEZvbnQoU3RhbmRhcmRGb250cy5IZWx2ZXRpY2EpXG4gICAgICogY29uc3Qgb3B0aW9uTGlzdCA9IGZvcm0uZ2V0T3B0aW9uTGlzdCgnc29tZS5vcHRpb25MaXN0LmZpZWxkJylcbiAgICAgKiBvcHRpb25MaXN0LmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EpXG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGZvbnQgVGhlIGZvbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0LnByb3RvdHlwZS5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICB0aGlzLnVwZGF0ZUFwcGVhcmFuY2VzKGZvbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyBvcHRpb24gbGlzdCdzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZ2l2ZW4gYXBwZWFyYW5jZSBwcm92aWRlci4gSWYgbm8gYHByb3ZpZGVyYCBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0XG4gICAgICogYXBwZWFyYW5jZSBwcm92aWRlciBmb3Igb3B0aW9uIGxpc3RzIHdpbGwgYmUgdXNlZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IG9wdGlvbkxpc3QgPSBmb3JtLmdldE9wdGlvbkxpc3QoJ3NvbWUub3B0aW9uTGlzdC5maWVsZCcpXG4gICAgICogb3B0aW9uTGlzdC51cGRhdGVBcHBlYXJhbmNlcyhoZWx2ZXRpY2EsIChmaWVsZCwgd2lkZ2V0LCBmb250KSA9PiB7XG4gICAgICogICAuLi5cbiAgICAgKiAgIHJldHVybiBkcmF3T3B0aW9uTGlzdCguLi4pXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqIEBwYXJhbSBwcm92aWRlciBPcHRpb25hbGx5LCB0aGUgYXBwZWFyYW5jZSBwcm92aWRlciB0byBiZSB1c2VkIGZvclxuICAgICAqICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERk9wdGlvbkxpc3QucHJvdG90eXBlLnVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIGFzc2VydElzKGZvbnQsICdmb250JywgW1tQREZGb250LCAnUERGRm9udCddXSk7XG4gICAgICAgIGFzc2VydE9yVW5kZWZpbmVkKHByb3ZpZGVyLCAncHJvdmlkZXInLCBbRnVuY3Rpb25dKTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmFjcm9GaWVsZC5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzQ2xlYW4oKTtcbiAgICB9O1xuICAgIC8vIGdldE9wdGlvbihpbmRleDogbnVtYmVyKTogc3RyaW5nIHt9XG4gICAgLy8gZ2V0U2VsZWN0ZWRJbmRpY2VzKCk6IG51bWJlcltdIHt9XG4gICAgLy8gcmVtb3ZlT3B0aW9ucyhvcHRpb246IHN0cmluZyB8IHN0cmluZ1tdKSB7fVxuICAgIC8vIHJlbW92ZUluZGljZXMob3B0aW9uOiBudW1iZXJbXSkge31cbiAgICAvLyBkZXNlbGVjdChvcHRpb25zOiBzdHJpbmcgfCBzdHJpbmdbXSkge31cbiAgICAvLyBkZXNlbGVjdEluZGljZXMob3B0aW9uSW5kaWNlczogbnVtYmVyW10pIHt9XG4gICAgUERGT3B0aW9uTGlzdC5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICh3aWRnZXQsIGZvbnQsIHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciBhcFByb3ZpZGVyID0gcHJvdmlkZXIgIT09IG51bGwgJiYgcHJvdmlkZXIgIT09IHZvaWQgMCA/IHByb3ZpZGVyIDogZGVmYXVsdE9wdGlvbkxpc3RBcHBlYXJhbmNlUHJvdmlkZXI7XG4gICAgICAgIHZhciBhcHBlYXJhbmNlcyA9IG5vcm1hbGl6ZUFwcGVhcmFuY2UoYXBQcm92aWRlcih0aGlzLCB3aWRnZXQsIGZvbnQpKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlV2l0aEZvbnQod2lkZ2V0LCBmb250LCBhcHBlYXJhbmNlcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRm9ybS5nZXRPcHRpb25MaXN0XV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZVxuICAgICAqID4gYW4gaW5zdGFuY2Ugb2YgW1tQREZPcHRpb25MaXN0XV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERk9wdGlvbkxpc3RdXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9MaXN0Qm94IGFuZFxuICAgICAqIHJlZlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjcm9Db21ib0JveCBUaGUgdW5kZXJseWluZyBgUERGQWNyb0xpc3RCb3hgIGZvciB0aGlzIG9wdGlvbiBsaXN0LlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgb3B0aW9uIGxpc3QuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhpcyBvcHRpb24gbGlzdCB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZPcHRpb25MaXN0Lm9mID0gZnVuY3Rpb24gKGFjcm9MaXN0Qm94LCByZWYsIGRvYykge1xuICAgICAgICByZXR1cm4gbmV3IFBERk9wdGlvbkxpc3QoYWNyb0xpc3RCb3gsIHJlZiwgZG9jKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZPcHRpb25MaXN0O1xufShQREZGaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGT3B0aW9uTGlzdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9wdGlvbkxpc3QuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGUGFnZSBmcm9tIFwiLi4vUERGUGFnZVwiO1xuaW1wb3J0IFBERkZpZWxkLCB7IGFzc2VydEZpZWxkQXBwZWFyYW5jZU9wdGlvbnMsIH0gZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUFwcGVhcmFuY2UsIGRlZmF1bHRSYWRpb0dyb3VwQXBwZWFyYW5jZVByb3ZpZGVyLCB9IGZyb20gXCIuL2FwcGVhcmFuY2VzXCI7XG5pbXBvcnQgeyByZ2IgfSBmcm9tIFwiLi4vY29sb3JzXCI7XG5pbXBvcnQgeyBkZWdyZWVzIH0gZnJvbSBcIi4uL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgUERGTmFtZSwgUERGSGV4U3RyaW5nLCBQREZEaWN0LCBQREZBY3JvUmFkaW9CdXR0b24sIEFjcm9CdXR0b25GbGFncywgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydE9yVW5kZWZpbmVkLCBhc3NlcnRJc09uZU9mIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIFJlcHJlc2VudHMgYSByYWRpbyBncm91cCBmaWVsZCBvZiBhIFtbUERGRm9ybV1dLlxuICpcbiAqIFtbUERGUmFkaW9Hcm91cF1dIGZpZWxkcyBhcmUgY29sbGVjdGlvbnMgb2YgcmFkaW8gYnV0dG9ucy4gVGhlIHB1cnBvc2Ugb2YgYVxuICogcmFkaW8gZ3JvdXAgaXMgdG8gZW5hYmxlIHVzZXJzIHRvIHNlbGVjdCBvbmUgb3B0aW9uIGZyb20gYSBzZXQgb2YgbXV0dWFsbHlcbiAqIGV4Y2x1c2l2ZSBjaG9pY2VzLiBFYWNoIGNob2ljZSBpbiBhIHJhZGlvIGdyb3VwIGlzIHJlcHJlc2VudGVkIGJ5IGEgcmFkaW9cbiAqIGJ1dHRvbi4gUmFkaW8gYnV0dG9ucyBlYWNoIGhhdmUgdHdvIHN0YXRlczogYG9uYCBhbmQgYG9mZmAuIEF0IG1vc3Qgb25lXG4gKiByYWRpbyBidXR0b24gaW4gYSBncm91cCBtYXkgYmUgaW4gdGhlIGBvbmAgc3RhdGUgYXQgYW55IHRpbWUuIFVzZXJzIGNhblxuICogY2xpY2sgb24gYSByYWRpbyBidXR0b24gdG8gc2VsZWN0IGl0IChhbmQgdGhlcmVieSBhdXRvbWF0aWNhbGx5IGRlc2VsZWN0IGFueVxuICogb3RoZXIgcmFkaW8gYnV0dG9uIHRoYXQgbWlnaHQgaGF2ZSBhbHJlYWR5IGJlZW4gc2VsZWN0ZWQpLiBTb21lIHJhZGlvXG4gKiBncm91cHMgYWxsb3cgdXNlcnMgdG8gdG9nZ2xlIGEgc2VsZWN0ZWQgcmFkaW8gYnV0dG9uIGBvZmZgIGJ5IGNsaWNraW5nIG9uXG4gKiBpdCAoc2VlIFtbUERGUmFkaW9Hcm91cC5pc09mZlRvZ2dsZWFibGVdXSkuXG4gKlxuICogTm90ZSB0aGF0IHNvbWUgcmFkaW8gZ3JvdXBzIGFsbG93IG11bHRpcGxlIHJhZGlvIGJ1dHRvbnMgdG8gYmUgaW4gdGhlIGBvbmBcbiAqIHN0YXRlIGF0IHRoZSBzYW1lIHR5cGUgKippZioqIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIHVuZGVybHlpbmcgdmFsdWUgKHNlZVxuICogW1tQREZSYWRpb0dyb3VwLmlzTXV0dWFsbHlFeGNsdXNpdmVdXSkuXG4gKi9cbnZhciBQREZSYWRpb0dyb3VwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZSYWRpb0dyb3VwLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlJhZGlvR3JvdXAoYWNyb1JhZGlvQnV0dG9uLCByZWYsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBhY3JvUmFkaW9CdXR0b24sIHJlZiwgZG9jKSB8fCB0aGlzO1xuICAgICAgICBhc3NlcnRJcyhhY3JvUmFkaW9CdXR0b24sICdhY3JvUmFkaW9CdXR0b24nLCBbXG4gICAgICAgICAgICBbUERGQWNyb1JhZGlvQnV0dG9uLCAnUERGQWNyb1JhZGlvQnV0dG9uJ10sXG4gICAgICAgIF0pO1xuICAgICAgICBfdGhpcy5hY3JvRmllbGQgPSBhY3JvUmFkaW9CdXR0b247XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb25zIGZvciB0aGlzIHJhZGlvIGdyb3VwLiBFYWNoIG9wdGlvbiBpc1xuICAgICAqIHJlcHJlc2VudGVkIGJ5IGEgcmFkaW8gYnV0dG9uLiBUaGVzZSByYWRpbyBidXR0b25zIGFyZSBkaXNwbGF5ZWQgYXRcbiAgICAgKiB2YXJpb3VzIGxvY2F0aW9ucyBpbiB0aGUgZG9jdW1lbnQsIHBvdGVudGlhbGx5IG9uIGRpZmZlcmVudCBwYWdlcyAodGhvdWdoXG4gICAgICogdHlwaWNhbGx5IHRoZXkgYXJlIHN0YWNrZWQgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkgb24gdGhlIHNhbWUgcGFnZSkuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIGNvbnN0IG9wdGlvbnMgPSByYWRpb0dyb3VwLmdldE9wdGlvbnMoKVxuICAgICAqIGNvbnNvbGUubG9nKCdSYWRpbyBHcm91cCBvcHRpb25zOicsIG9wdGlvbnMpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgVGhlIG9wdGlvbnMgZm9yIHRoaXMgcmFkaW8gZ3JvdXAuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGV4cG9ydFZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldEV4cG9ydFZhbHVlcygpO1xuICAgICAgICBpZiAoZXhwb3J0VmFsdWVzKSB7XG4gICAgICAgICAgICB2YXIgZXhwb3J0T3B0aW9ucyA9IG5ldyBBcnJheShleHBvcnRWYWx1ZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGV4cG9ydFZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICBleHBvcnRPcHRpb25zW2lkeF0gPSBleHBvcnRWYWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXhwb3J0T3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICB2YXIgb25WYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPblZhbHVlcygpO1xuICAgICAgICB2YXIgb25PcHRpb25zID0gbmV3IEFycmF5KG9uVmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9uT3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG9uT3B0aW9uc1tpZHhdID0gb25WYWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9uT3B0aW9ucztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2VsZWN0ZWQgb3B0aW9uIGZvciB0aGlzIHJhZGlvIGdyb3VwLiBUaGUgc2VsZWN0ZWQgb3B0aW9uIGlzXG4gICAgICogcmVwcmVzZW50ZWQgYnkgdGhlIHJhZGlvIGJ1dHRvbiBpbiB0aGlzIGdyb3VwIHRoYXQgaXMgdHVybmVkIG9uLiBBdCBtb3N0XG4gICAgICogb25lIHJhZGlvIGJ1dHRvbiBpbiBhIGdyb3VwIGNhbiBiZSBzZWxlY3RlZC4gSWYgbm8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwXG4gICAgICogYXJlIHNlbGVjdGVkLCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogY29uc3Qgc2VsZWN0ZWQgPSByYWRpb0dyb3VwLmdldFNlbGVjdGVkKClcbiAgICAgKiBjb25zb2xlLmxvZygnU2VsZWN0ZWQgcmFkaW8gYnV0dG9uOicsIHNlbGVjdGVkKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBzZWxlY3RlZCBvcHRpb24gZm9yIHRoaXMgcmFkaW8gZ3JvdXAuXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuZ2V0U2VsZWN0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuYWNyb0ZpZWxkLmdldFZhbHVlKCk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gUERGTmFtZS5vZignT2ZmJykpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZXhwb3J0VmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0RXhwb3J0VmFsdWVzKCk7XG4gICAgICAgIGlmIChleHBvcnRWYWx1ZXMpIHtcbiAgICAgICAgICAgIHZhciBvblZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldE9uVmFsdWVzKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvblZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAob25WYWx1ZXNbaWR4XSA9PT0gdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRWYWx1ZXNbaWR4XS5kZWNvZGVUZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlLmRlY29kZVRleHQoKTtcbiAgICB9O1xuICAgIC8vIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IHRoaXMgc2VlbXMgdG8gY3Jhc2ggQWNyb2JhdC4gTWF5YmUgaXQncyBiZWNhdXNlIHdlXG4gICAgLy8gLy8gICAgICAgYXJlbid0IHJlbW92aW5nIHRoZSB3aWRnZXQgcmVmZXJlbmNlIGZyb20gdGhlIHBhZ2UncyBBbm5vdHM/XG4gICAgLy8gcmVtb3ZlT3B0aW9uKG9wdGlvbjogc3RyaW5nKSB7XG4gICAgLy8gICBhc3NlcnRJcyhvcHRpb24sICdvcHRpb24nLCBbJ3N0cmluZyddKTtcbiAgICAvLyAgIC8vIFRPRE86IEFzc2VydCBpcyB2YWxpZCBgb3B0aW9uYCFcbiAgICAvLyAgIGNvbnN0IG9uVmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0T25WYWx1ZXMoKTtcbiAgICAvLyAgIGNvbnN0IGV4cG9ydFZhbHVlcyA9IHRoaXMuYWNyb0ZpZWxkLmdldEV4cG9ydFZhbHVlcygpO1xuICAgIC8vICAgaWYgKGV4cG9ydFZhbHVlcykge1xuICAgIC8vICAgICBmb3IgKGxldCBpZHggPSAwLCBsZW4gPSBleHBvcnRWYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgLy8gICAgICAgaWYgKGV4cG9ydFZhbHVlc1tpZHhdLmRlY29kZVRleHQoKSA9PT0gb3B0aW9uKSB7XG4gICAgLy8gICAgICAgICB0aGlzLmFjcm9GaWVsZC5yZW1vdmVXaWRnZXQoaWR4KTtcbiAgICAvLyAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZUV4cG9ydFZhbHVlKGlkeCk7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICBmb3IgKGxldCBpZHggPSAwLCBsZW4gPSBvblZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAvLyAgICAgICBjb25zdCB2YWx1ZSA9IG9uVmFsdWVzW2lkeF07XG4gICAgLy8gICAgICAgaWYgKHZhbHVlLmRlY29kZVRleHQoKSA9PT0gb3B0aW9uKSB7XG4gICAgLy8gICAgICAgICB0aGlzLmFjcm9GaWVsZC5yZW1vdmVXaWRnZXQoaWR4KTtcbiAgICAvLyAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnJlbW92ZUV4cG9ydFZhbHVlKGlkeCk7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICB9XG4gICAgLy8gfVxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBhbiBvcHRpb24gZm9yIHRoaXMgcmFkaW8gZ3JvdXAuIFRoaXMgb3BlcmF0aW9uIGlzIGFuYWxvZ291cyB0byBhXG4gICAgICogaHVtYW4gdXNlciBjbGlja2luZyBvbmUgb2YgdGhlIHJhZGlvIGJ1dHRvbnMgaW4gdGhpcyBncm91cCB2aWEgYSBQREZcbiAgICAgKiByZWFkZXIgdG8gdG9nZ2xlIGl0IG9uLiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBzdGF0ZSBvZlxuICAgICAqIHRoZSByYWRpbyBncm91cCB0byBpbmRpY2F0ZSB3aGljaCBvcHRpb24gaGFzIGJlZW4gc2VsZWN0ZWQuIFBERiBsaWJyYXJpZXNcbiAgICAgKiBhbmQgcmVhZGVycyB3aWxsIGJlIGFibGUgdG8gZXh0cmFjdCB0aGlzIHZhbHVlIGZyb20gdGhlIHNhdmVkIGRvY3VtZW50IGFuZFxuICAgICAqIGRldGVybWluZSB3aGljaCBvcHRpb24gd2FzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdiZXN0LnN1cGVyaGVyby5yYWRpb0dyb3VwJylcbiAgICAgKiByYWRpb0dyb3VwLnNlbGVjdCgnT25lIFB1bmNoIE1hbicpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyByYWRpbyBncm91cCBhcyBkaXJ0eSwgY2F1c2luZyBpdHMgYXBwZWFyYW5jZVxuICAgICAqIHN0cmVhbXMgdG8gYmUgdXBkYXRlZCB3aGVuIGVpdGhlciBbW1BERkRvY3VtZW50LnNhdmVdXSBvclxuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gaXMgY2FsbGVkLiBUaGUgdXBkYXRlZCBhcHBlYXJhbmNlXG4gICAgICogc3RyZWFtcyB3aWxsIGRpc3BsYXkgYSBkb3QgaW5zaWRlIHRoZSB3aWRnZXQgb2YgdGhpcyBjaGVjayBib3ggZmllbGRcbiAgICAgKiB0aGF0IHJlcHJlc2VudHMgdGhlIHNlbGVjdGVkIG9wdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb24gVGhlIG9wdGlvbiB0byBiZSBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbiwgJ29wdGlvbicsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgdmFsaWRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICAgIGFzc2VydElzT25lT2Yob3B0aW9uLCAnb3B0aW9uJywgdmFsaWRPcHRpb25zKTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB2YXIgb25WYWx1ZXMgPSB0aGlzLmFjcm9GaWVsZC5nZXRPblZhbHVlcygpO1xuICAgICAgICB2YXIgZXhwb3J0VmFsdWVzID0gdGhpcy5hY3JvRmllbGQuZ2V0RXhwb3J0VmFsdWVzKCk7XG4gICAgICAgIGlmIChleHBvcnRWYWx1ZXMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGV4cG9ydFZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwb3J0VmFsdWVzW2lkeF0uZGVjb2RlVGV4dCgpID09PSBvcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0VmFsdWUob25WYWx1ZXNbaWR4XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb25WYWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gb25WYWx1ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuZGVjb2RlVGV4dCgpID09PSBvcHRpb24pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2xlYXIgYW55IHNlbGVjdGVkIG9wdGlvbiBmb3IgdGhpcyBkcm9wZG93bi4gVGhpcyB3aWxsIHJlc3VsdCBpbiBhbGxcbiAgICAgKiByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgYmVpbmcgdG9nZ2xlZCBvZmYuIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlXG4gICAgICogdGhlIHVuZGVybHlpbmcgc3RhdGUgb2YgdGhlIGRyb3Bkb3duIHRvIGluZGljYXRlIHRoYXQgbm8gcmFkaW8gYnV0dG9uc1xuICAgICAqIGhhdmUgYmVlbiBzZWxlY3RlZC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC5jbGVhcigpXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgcmFkaW8gZ3JvdXAgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGUmFkaW9Hcm91cC5zZWxlY3RdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZShQREZOYW1lLm9mKCdPZmYnKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB1c2VycyBjYW4gY2xpY2sgb24gcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIHRvIHRvZ2dsZVxuICAgICAqIHRoZW0gb2ZmLiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhhdCBvbmNlIGEgdXNlciBjbGlja3Mgb24gYSByYWRpbyBidXR0b25cbiAgICAgKiB0byBzZWxlY3QgaXQsIHRoZSBvbmx5IHdheSB0byBkZXNlbGVjdCBpdCBpcyBieSBzZWxlY3Rpbmcgb24gYW5vdGhlciByYWRpb1xuICAgICAqIGJ1dHRvbiBpbiB0aGUgZ3JvdXAuIFNlZSBbW1BERlJhZGlvR3JvdXAuZW5hYmxlT2ZmVG9nZ2xpbmddXSBhbmRcbiAgICAgKiBbW1BERlJhZGlvR3JvdXAuZGlzYWJsZU9mZlRvZ2dsaW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiBpZiAocmFkaW9Hcm91cC5pc09mZlRvZ2dsZWFibGUoKSkgY29uc29sZS5sb2coJ09mZiB0b2dnbGluZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5pc09mZlRvZ2dsZWFibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5hY3JvRmllbGQuaGFzRmxhZyhBY3JvQnV0dG9uRmxhZ3MuTm9Ub2dnbGVUb09mZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2VycyB0byBjbGljayBvbiBzZWxlY3RlZCByYWRpbyBidXR0b25zIGluIHRoaXMgZ3JvdXAgdG8gdG9nZ2xlXG4gICAgICogdGhlbSBvZmYuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiByYWRpb0dyb3VwLmVuYWJsZU9mZlRvZ2dsaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKiA+ICoqTk9URToqKiBUaGlzIGZlYXR1cmUgaXMgZG9jdW1lbnRlZCBpbiB0aGUgUERGIHNwZWNpZmljYXRpb25cbiAgICAgKiA+IChUYWJsZSAyMjYpLiBIb3dldmVyLCBtb3N0IFBERiByZWFkZXJzIGRvIG5vdCByZXNwZWN0IHRoaXMgb3B0aW9uIGFuZFxuICAgICAqID4gcHJldmVudCB1c2VycyBmcm9tIHRvZ2dsaW5nIHJhZGlvIGJ1dHRvbnMgb2ZmIGV2ZW4gd2hlbiBpdCBpcyBlbmFibGVkLlxuICAgICAqID4gQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nICg5LzYvMjAyMCkgTWFjJ3MgUHJldmlldyBzb2Z0d2FyZSBkaWRcbiAgICAgKiA+IHJlc3BlY3QgdGhlIG9wdGlvbi4gQWRvYmUgQWNyb2JhdCwgRm94aXQgUmVhZGVyLCBhbmQgR29vZ2xlIENocm9tZSBkaWRcbiAgICAgKiA+IG5vdC5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5lbmFibGVPZmZUb2dnbGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9CdXR0b25GbGFncy5Ob1RvZ2dsZVRvT2ZmLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IHVzZXJzIGZyb20gY2xpY2tpbmcgb24gc2VsZWN0ZWQgcmFkaW8gYnV0dG9ucyBpbiB0aGlzIGdyb3VwIHRvXG4gICAgICogdG9nZ2xlIHRoZW0gb2ZmLiBDbGlja2luZyBvbiBhIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiB3aWxsIGhhdmUgbm8gZWZmZWN0LlxuICAgICAqIFRoZSBvbmx5IHdheSB0byBkZXNlbGVjdCBhIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbiBpcyB0byBjbGljayBvbiBhXG4gICAgICogZGlmZmVyZW50IHJhZGlvIGJ1dHRvbiBpbiB0aGUgZ3JvdXAuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiByYWRpb0dyb3VwLmRpc2FibGVPZmZUb2dnbGluZygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuZGlzYWJsZU9mZlRvZ2dsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb0J1dHRvbkZsYWdzLk5vVG9nZ2xlVG9PZmYsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJhZGlvIGJ1dHRvbnMgaW4gdGhpcyBncm91cCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLlxuICAgICAqIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYSByYWRpbyBidXR0b24sIG9ubHkgdGhhdCBzcGVjaWZpY1xuICAgICAqIGJ1dHRvbiB3aWxsIGJlIHR1cm5lZCBvbi4gRXZlbiBpZiBvdGhlciByYWRpbyBidXR0b25zIGluIHRoZSBncm91cFxuICAgICAqIHJlcHJlc2VudCB0aGUgc2FtZSB2YWx1ZSwgdGhleSB3aWxsIG5vdCBiZSBlbmFibGVkLiBUaGUgYWx0ZXJuYXRpdmUgdG9cbiAgICAgKiB0aGlzIGlzIHRoYXQgY2xpY2tpbmcgYSByYWRpbyBidXR0b24gd2lsbCBzZWxlY3QgdGhhdCBidXR0b24gYWxvbmcgd2l0aFxuICAgICAqIGFueSBvdGhlciByYWRpbyBidXR0b25zIGluIHRoZSBncm91cCB0aGF0IHNoYXJlIHRoZSBzYW1lIHZhbHVlLiBTZWVcbiAgICAgKiBbW1BERlJhZGlvR3JvdXAuZW5hYmxlTXV0dWFsRXhjbHVzaW9uXV0gYW5kXG4gICAgICogW1tQREZSYWRpb0dyb3VwLmRpc2FibGVNdXR1YWxFeGNsdXNpb25dXS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogaWYgKHJhZGlvR3JvdXAuaXNNdXR1YWxseUV4Y2x1c2l2ZSgpKSBjb25zb2xlLmxvZygnTXV0dWFsIGV4Y2x1c2lvbiBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5pc011dHVhbGx5RXhjbHVzaXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb0J1dHRvbkZsYWdzLlJhZGlvc0luVW5pc29uKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIHVzZXIgY2xpY2tzIGEgcmFkaW8gYnV0dG9uIGluIHRoaXMgZ3JvdXAgaXQgd2lsbCBiZSBzZWxlY3RlZC4gSW5cbiAgICAgKiBhZGRpdGlvbiwgYW55IG90aGVyIHJhZGlvIGJ1dHRvbnMgaW4gdGhpcyBncm91cCB0aGF0IHNoYXJlIHRoZSBzYW1lXG4gICAgICogdW5kZXJseWluZyB2YWx1ZSB3aWxsIGFsc28gYmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiByYWRpb0dyb3VwLmVuYWJsZU11dHVhbEV4Y2x1c2lvbigpXG4gICAgICogYGBgXG4gICAgICogTm90ZSB0aGF0IHRoaXMgb3B0aW9uIG11c3QgYmUgZW5hYmxlZCBwcmlvciB0byBhZGRpbmcgb3B0aW9ucyB0byB0aGVcbiAgICAgKiByYWRpbyBncm91cC4gSXQgZG9lcyBub3QgY3VycmVudGx5IGFwcGx5IHJldHJvYWN0aXZlbHkgdG8gZXhpc3RpbmdcbiAgICAgKiByYWRpbyBidXR0b25zIGluIHRoZSBncm91cC5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5lbmFibGVNdXR1YWxFeGNsdXNpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQnV0dG9uRmxhZ3MuUmFkaW9zSW5Vbmlzb24sIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIHVzZXIgY2xpY2tzIGEgcmFkaW8gYnV0dG9uIGluIHRoaXMgZ3JvdXAgb25seSBpdCB3aWxsIGJlIHNlbGVjdGVkLlxuICAgICAqIE5vIG90aGVyIHJhZGlvIGJ1dHRvbnMgaW4gdGhlIGdyb3VwIHdpbGwgYmUgc2VsZWN0ZWQsIGV2ZW4gaWYgdGhleSBzaGFyZVxuICAgICAqIHRoZSBzYW1lIHVuZGVybHlpbmcgdmFsdWUuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiByYWRpb0dyb3VwLmRpc2FibGVNdXR1YWxFeGNsdXNpb24oKVxuICAgICAqIGBgYFxuICAgICAqIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBtdXN0IGJlIGRpc2FibGVkIHByaW9yIHRvIGFkZGluZyBvcHRpb25zIHRvIHRoZVxuICAgICAqIHJhZGlvIGdyb3VwLiBJdCBkb2VzIG5vdCBjdXJyZW50bHkgYXBwbHkgcmV0cm9hY3RpdmVseSB0byBleGlzdGluZ1xuICAgICAqIHJhZGlvIGJ1dHRvbnMgaW4gdGhlIGdyb3VwLlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmRpc2FibGVNdXR1YWxFeGNsdXNpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvQnV0dG9uRmxhZ3MuUmFkaW9zSW5Vbmlzb24sIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkIGEgbmV3IHJhZGlvIGJ1dHRvbiB0byB0aGlzIGdyb3VwIG9uIHRoZSBzcGVjaWZpZWQgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBwYWdlID0gcGRmRG9jLmFkZFBhZ2UoKVxuICAgICAqXG4gICAgICogY29uc3QgZm9ybSA9IHBkZkRvYy5nZXRGb3JtKClcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5jcmVhdGVSYWRpb0dyb3VwKCdiZXN0Lmd1bmRhbScpXG4gICAgICpcbiAgICAgKiBjb25zdCBvcHRpb25zID0ge1xuICAgICAqICAgeDogNTAsXG4gICAgICogICB3aWR0aDogMjUsXG4gICAgICogICBoZWlnaHQ6IDI1LFxuICAgICAqICAgdGV4dENvbG9yOiByZ2IoMSwgMCwgMCksXG4gICAgICogICBiYWNrZ3JvdW5kQ29sb3I6IHJnYigwLCAxLCAwKSxcbiAgICAgKiAgIGJvcmRlckNvbG9yOiByZ2IoMCwgMCwgMSksXG4gICAgICogICBib3JkZXJXaWR0aDogMixcbiAgICAgKiAgIHJvdGF0ZTogZGVncmVlcyg5MCksXG4gICAgICogfVxuICAgICAqXG4gICAgICogcmFkaW9Hcm91cC5hZGRPcHRpb25Ub1BhZ2UoJ0V4aWEnLCBwYWdlLCB7IC4uLm9wdGlvbnMsIHk6IDUwIH0pXG4gICAgICogcmFkaW9Hcm91cC5hZGRPcHRpb25Ub1BhZ2UoJ0R5bmFtZXMnLCBwYWdlLCB7IC4uLm9wdGlvbnMsIHk6IDExMCB9KVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgcmFkaW8gYnV0dG9uIHdpZGdldCBmb3IgdGhpcyByYWRpbyBncm91cCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gdGhhdCB0aGUgcmFkaW8gYnV0dG9uIHdpZGdldCByZXByZXNlbnRzLlxuICAgICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIHdoaWNoIHRoZSByYWRpbyBidXR0b24gd2lkZ2V0IHNob3VsZCBiZSBhZGRlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSB1c2VkIHdoZW4gYWRkaW5nIHRoZSByYWRpbyBidXR0b24gd2lkZ2V0LlxuICAgICAqL1xuICAgIFBERlJhZGlvR3JvdXAucHJvdG90eXBlLmFkZE9wdGlvblRvUGFnZSA9IGZ1bmN0aW9uIChvcHRpb24sIHBhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2o7XG4gICAgICAgIGFzc2VydElzKG9wdGlvbiwgJ29wdGlvbicsIFsnc3RyaW5nJ10pO1xuICAgICAgICBhc3NlcnRJcyhwYWdlLCAncGFnZScsIFtbUERGUGFnZSwgJ1BERlBhZ2UnXV0pO1xuICAgICAgICBhc3NlcnRGaWVsZEFwcGVhcmFuY2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICAvLyBDcmVhdGUgYSB3aWRnZXQgZm9yIHRoaXMgcmFkaW8gYnV0dG9uXG4gICAgICAgIHZhciB3aWRnZXQgPSB0aGlzLmNyZWF0ZVdpZGdldCh7XG4gICAgICAgICAgICB4OiAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMueCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCxcbiAgICAgICAgICAgIHk6IChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwLFxuICAgICAgICAgICAgd2lkdGg6IChfYyA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy53aWR0aCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogNTAsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDUwLFxuICAgICAgICAgICAgdGV4dENvbG9yOiAoX2UgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMudGV4dENvbG9yKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiByZ2IoMCwgMCwgMCksXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IChfZiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IHJnYigxLCAxLCAxKSxcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiAoX2cgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyQ29sb3IpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHJnYigwLCAwLCAwKSxcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2ggPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYm9yZGVyV2lkdGgpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IDEsXG4gICAgICAgICAgICByb3RhdGU6IChfaiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9qICE9PSB2b2lkIDAgPyBfaiA6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICBoaWRkZW46IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5oaWRkZW4sXG4gICAgICAgICAgICBwYWdlOiBwYWdlLnJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGlzIGZpZWxkXG4gICAgICAgIHZhciBhcFN0YXRlVmFsdWUgPSB0aGlzLmFjcm9GaWVsZC5hZGRXaWRnZXRXaXRoT3B0KHdpZGdldFJlZiwgUERGSGV4U3RyaW5nLmZyb21UZXh0KG9wdGlvbiksICF0aGlzLmlzTXV0dWFsbHlFeGNsdXNpdmUoKSk7XG4gICAgICAgIC8vIFNldCBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIHdpZGdldFxuICAgICAgICB3aWRnZXQuc2V0QXBwZWFyYW5jZVN0YXRlKFBERk5hbWUub2YoJ09mZicpKTtcbiAgICAgICAgdGhpcy51cGRhdGVXaWRnZXRBcHBlYXJhbmNlKHdpZGdldCwgYXBTdGF0ZVZhbHVlKTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGUgZ2l2ZW4gcGFnZVxuICAgICAgICBwYWdlLm5vZGUuYWRkQW5ub3Qod2lkZ2V0UmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIGFueSBvZiB0aGlzIGdyb3VwJ3MgcmFkaW8gYnV0dG9uIHdpZGdldHMgZG8gbm90IGhhdmUgYW5cbiAgICAgKiBhcHBlYXJhbmNlIHN0cmVhbSBmb3IgdGhlaXIgY3VycmVudCBzdGF0ZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCByYWRpb0dyb3VwID0gZm9ybS5nZXRSYWRpb0dyb3VwKCdzb21lLnJhZGlvR3JvdXAuZmllbGQnKVxuICAgICAqIGlmIChyYWRpb0dyb3VwLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUoKSkgY29uc29sZS5sb2coJ05lZWRzIHVwZGF0ZScpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyByYWRpbyBncm91cCBuZWVkcyBhbiBhcHBlYXJhbmNlIHVwZGF0ZS5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHdpZGdldC5nZXRBcHBlYXJhbmNlU3RhdGUoKTtcbiAgICAgICAgICAgIHZhciBub3JtYWwgPSAoX2EgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZXMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vcm1hbDtcbiAgICAgICAgICAgIGlmICghKG5vcm1hbCBpbnN0YW5jZW9mIFBERkRpY3QpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKHN0YXRlICYmICFub3JtYWwuaGFzKHN0YXRlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcyBmb3IgZWFjaCBvZiB0aGlzIGdyb3VwJ3MgcmFkaW8gYnV0dG9uIHdpZGdldHNcbiAgICAgKiB1c2luZyB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciByYWRpbyBncm91cHMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcmFkaW9Hcm91cCA9IGZvcm0uZ2V0UmFkaW9Hcm91cCgnc29tZS5yYWRpb0dyb3VwLmZpZWxkJylcbiAgICAgKiByYWRpb0dyb3VwLmRlZmF1bHRVcGRhdGVBcHBlYXJhbmNlcygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUuZGVmYXVsdFVwZGF0ZUFwcGVhcmFuY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUFwcGVhcmFuY2VzKCk7XG4gICAgfTtcbiAgICAvLyByZy51cGRhdGVBcHBlYXJhbmNlcygoZmllbGQ6IGFueSwgd2lkZ2V0OiBhbnkpID0+IHtcbiAgICAvLyAgIGFzc2VydChmaWVsZCA9PT0gcmcpO1xuICAgIC8vICAgYXNzZXJ0KHdpZGdldCBpbnN0YW5jZW9mIFBERldpZGdldEFubm90YXRpb24pO1xuICAgIC8vICAgcmV0dXJuIHsgb246IFsuLi5yZWN0YW5nbGUsIC4uLmNpcmNsZV0sIG9mZjogWy4uLnJlY3RhbmdsZSwgLi4uY2lyY2xlXSB9O1xuICAgIC8vIH0pO1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgZ3JvdXAncyByYWRpbyBidXR0b24gd2lkZ2V0c1xuICAgICAqIHVzaW5nIHRoZSBnaXZlbiBhcHBlYXJhbmNlIHByb3ZpZGVyLiBJZiBubyBgcHJvdmlkZXJgIGlzIHBhc3NlZCwgdGhlXG4gICAgICogZGVmYXVsdCBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciByYWRpbyBncm91cHMgd2lsbCBiZSB1c2VkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHJhZGlvR3JvdXAgPSBmb3JtLmdldFJhZGlvR3JvdXAoJ3NvbWUucmFkaW9Hcm91cC5maWVsZCcpXG4gICAgICogcmFkaW9Hcm91cC51cGRhdGVBcHBlYXJhbmNlcygoZmllbGQsIHdpZGdldCkgPT4ge1xuICAgICAqICAgLi4uXG4gICAgICogICByZXR1cm4ge1xuICAgICAqICAgICBub3JtYWw6IHsgb246IGRyYXdSYWRpb0J1dHRvbiguLi4pLCBvZmY6IGRyYXdSYWRpb0J1dHRvbiguLi4pIH0sXG4gICAgICogICAgIGRvd246IHsgb246IGRyYXdSYWRpb0J1dHRvbiguLi4pLCBvZmY6IGRyYXdSYWRpb0J1dHRvbiguLi4pIH0sXG4gICAgICogICB9XG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgT3B0aW9uYWxseSwgdGhlIGFwcGVhcmFuY2UgcHJvdmlkZXIgdG8gYmUgdXNlZCBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFwcGVhcmFuY2Ugc3RyZWFtcy5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLnByb3RvdHlwZS51cGRhdGVBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZChwcm92aWRlciwgJ3Byb3ZpZGVyJywgW0Z1bmN0aW9uXSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBvblZhbHVlID0gd2lkZ2V0LmdldE9uVmFsdWUoKTtcbiAgICAgICAgICAgIGlmICghb25WYWx1ZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSh3aWRnZXQsIG9uVmFsdWUsIHByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGUmFkaW9Hcm91cC5wcm90b3R5cGUudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICh3aWRnZXQsIG9uVmFsdWUsIHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciBhcFByb3ZpZGVyID0gcHJvdmlkZXIgIT09IG51bGwgJiYgcHJvdmlkZXIgIT09IHZvaWQgMCA/IHByb3ZpZGVyIDogZGVmYXVsdFJhZGlvR3JvdXBBcHBlYXJhbmNlUHJvdmlkZXI7XG4gICAgICAgIHZhciBhcHBlYXJhbmNlcyA9IG5vcm1hbGl6ZUFwcGVhcmFuY2UoYXBQcm92aWRlcih0aGlzLCB3aWRnZXQpKTtcbiAgICAgICAgdGhpcy51cGRhdGVPbk9mZldpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBvblZhbHVlLCBhcHBlYXJhbmNlcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiA+ICoqTk9URToqKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0ZWFkLFxuICAgICAqID4gY29uc2lkZXIgdXNpbmcgdGhlIFtbUERGRm9ybS5nZXRPcHRpb25MaXN0XV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZPcHRpb25MaXN0XV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERk9wdGlvbkxpc3RdXSBmcm9tIGFuIGV4aXN0aW5nIGFjcm9SYWRpb0J1dHRvblxuICAgICAqIGFuZCByZWZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvUmFkaW9CdXR0b24gVGhlIHVuZGVybHlpbmcgYFBERkFjcm9SYWRpb0J1dHRvbmAgZm9yIHRoaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvIGdyb3VwLlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgcmFkaW8gZ3JvdXAuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhpcyByYWRpbyBncm91cCB3aWxsIGJlbG9uZy5cbiAgICAgKi9cbiAgICBQREZSYWRpb0dyb3VwLm9mID0gZnVuY3Rpb24gKGFjcm9SYWRpb0J1dHRvbiwgcmVmLCBkb2MpIHsgcmV0dXJuIG5ldyBQREZSYWRpb0dyb3VwKGFjcm9SYWRpb0J1dHRvbiwgcmVmLCBkb2MpOyB9O1xuICAgIHJldHVybiBQREZSYWRpb0dyb3VwO1xufShQREZGaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUmFkaW9Hcm91cDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlJhZGlvR3JvdXAuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRmllbGQgZnJvbSBcIi4vUERGRmllbGRcIjtcbmltcG9ydCB7IFBERkFjcm9TaWduYXR1cmUgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIHNpZ25hdHVyZSBmaWVsZCBvZiBhIFtbUERGRm9ybV1dLlxuICpcbiAqIFtbUERGU2lnbmF0dXJlXV0gZmllbGRzIGFyZSBkaWdpdGFsIHNpZ25hdHVyZXMuIGBwZGYtbGliYCBkb2VzIG5vdFxuICogY3VycmVudGx5IHByb3ZpZGUgYW55IHNwZWNpYWxpemVkIEFQSXMgZm9yIGNyZWF0aW5nIGRpZ2l0YWwgc2lnbmF0dXJlcyBvclxuICogcmVhZGluZyB0aGUgY29udGVudHMgb2YgZXhpc3RpbmcgZGlnaXRhbCBzaWduYXR1cmVzLlxuICovXG52YXIgUERGU2lnbmF0dXJlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZTaWduYXR1cmUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGU2lnbmF0dXJlKGFjcm9TaWduYXR1cmUsIHJlZiwgZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGFjcm9TaWduYXR1cmUsIHJlZiwgZG9jKSB8fCB0aGlzO1xuICAgICAgICBhc3NlcnRJcyhhY3JvU2lnbmF0dXJlLCAnYWNyb1NpZ25hdHVyZScsIFtcbiAgICAgICAgICAgIFtQREZBY3JvU2lnbmF0dXJlLCAnUERGQWNyb1NpZ25hdHVyZSddLFxuICAgICAgICBdKTtcbiAgICAgICAgX3RoaXMuYWNyb0ZpZWxkID0gYWNyb1NpZ25hdHVyZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZTaWduYXR1cmUucHJvdG90eXBlLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqID4gKipOT1RFOioqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIEluc3RlYWQsXG4gICAgICogPiBjb25zaWRlciB1c2luZyB0aGUgW1tQREZGb3JtLmdldFNpZ25hdHVyZV1dIG1ldGhvZCwgd2hpY2ggd2lsbCBjcmVhdGUgYW5cbiAgICAgKiA+IGluc3RhbmNlIG9mIFtbUERGU2lnbmF0dXJlXV0gZm9yIHlvdS5cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBbW1BERlNpZ25hdHVyZV1dIGZyb20gYW4gZXhpc3RpbmcgYWNyb1NpZ25hdHVyZSBhbmRcbiAgICAgKiByZWZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3JvU2lnbmF0dXJlIFRoZSB1bmRlcmx5aW5nIGBQREZBY3JvU2lnbmF0dXJlYCBmb3IgdGhpcyBzaWduYXR1cmUuXG4gICAgICogQHBhcmFtIHJlZiBUaGUgdW5pcXVlIHJlZmVyZW5jZSBmb3IgdGhpcyBzaWduYXR1cmUuXG4gICAgICogQHBhcmFtIGRvYyBUaGUgZG9jdW1lbnQgdG8gd2hpY2ggdGhpcyBzaWduYXR1cmUgd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGU2lnbmF0dXJlLm9mID0gZnVuY3Rpb24gKGFjcm9TaWduYXR1cmUsIHJlZiwgZG9jKSB7IHJldHVybiBuZXcgUERGU2lnbmF0dXJlKGFjcm9TaWduYXR1cmUsIHJlZiwgZG9jKTsgfTtcbiAgICByZXR1cm4gUERGU2lnbmF0dXJlO1xufShQREZGaWVsZCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGU2lnbmF0dXJlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGU2lnbmF0dXJlLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlBhZ2UgZnJvbSBcIi4uL1BERlBhZ2VcIjtcbmltcG9ydCBQREZGb250IGZyb20gXCIuLi9QREZGb250XCI7XG5pbXBvcnQgUERGRmllbGQsIHsgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucywgfSBmcm9tIFwiLi9QREZGaWVsZFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQXBwZWFyYW5jZSwgZGVmYXVsdFRleHRGaWVsZEFwcGVhcmFuY2VQcm92aWRlciwgfSBmcm9tIFwiLi9hcHBlYXJhbmNlc1wiO1xuaW1wb3J0IHsgcmdiIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgZGVncmVlcyB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IFJpY2hUZXh0RmllbGRSZWFkRXJyb3IsIEV4Y2VlZGVkTWF4TGVuZ3RoRXJyb3IsIEludmFsaWRNYXhMZW5ndGhFcnJvciwgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBJbWFnZUFsaWdubWVudCB9IGZyb20gXCIuLi9pbWFnZS9hbGlnbm1lbnRcIjtcbmltcG9ydCB7IFRleHRBbGlnbm1lbnQgfSBmcm9tIFwiLi4vdGV4dC9hbGlnbm1lbnRcIjtcbmltcG9ydCB7IFBERkhleFN0cmluZywgUERGU3RyZWFtLCBQREZBY3JvVGV4dCwgQWNyb1RleHRGbGFncywgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYXNzZXJ0SXMsIGFzc2VydElzT25lT2YsIGFzc2VydE9yVW5kZWZpbmVkLCBhc3NlcnRQb3NpdGl2ZSwgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZCwgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogUmVwcmVzZW50cyBhIHRleHQgZmllbGQgb2YgYSBbW1BERkZvcm1dXS5cbiAqXG4gKiBbW1BERlRleHRGaWVsZF1dIGZpZWxkcyBhcmUgYm94ZXMgdGhhdCBkaXNwbGF5IHRleHQgZW50ZXJlZCBieSB0aGUgdXNlci4gVGhlXG4gKiBwdXJwb3NlIG9mIGEgdGV4dCBmaWVsZCBpcyB0byBlbmFibGUgdXNlcnMgdG8gZW50ZXIgdGV4dCBvciB2aWV3IHRleHQgdmFsdWVzXG4gKiBpbiB0aGUgZG9jdW1lbnQgcHJlZmlsbGVkIGJ5IHNvZnR3YXJlLiBVc2VycyBjYW4gY2xpY2sgb24gYSB0ZXh0IGZpZWxkIGFuZFxuICogaW5wdXQgdGV4dCB2aWEgdGhlaXIga2V5Ym9hcmQuIFNvbWUgdGV4dCBmaWVsZHMgYWxsb3cgbXVsdGlwbGUgbGluZXMgb2YgdGV4dFxuICogdG8gYmUgZW50ZXJlZCAoc2VlIFtbUERGVGV4dEZpZWxkLmlzTXVsdGlsaW5lXV0pLlxuICovXG52YXIgUERGVGV4dEZpZWxkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZUZXh0RmllbGQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGVGV4dEZpZWxkKGFjcm9UZXh0LCByZWYsIGRvYykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBhY3JvVGV4dCwgcmVmLCBkb2MpIHx8IHRoaXM7XG4gICAgICAgIGFzc2VydElzKGFjcm9UZXh0LCAnYWNyb1RleHQnLCBbW1BERkFjcm9UZXh0LCAnUERGQWNyb1RleHQnXV0pO1xuICAgICAgICBfdGhpcy5hY3JvRmllbGQgPSBhY3JvVGV4dDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRleHQgdGhhdCB0aGlzIGZpZWxkIGNvbnRhaW5zLiBUaGlzIHRleHQgaXMgdmlzaWJsZSB0byB1c2VycyB3aG9cbiAgICAgKiB2aWV3IHRoaXMgZmllbGQgaW4gYSBQREYgcmVhZGVyLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiBjb25zdCB0ZXh0ID0gdGV4dEZpZWxkLmdldFRleHQoKVxuICAgICAqIGNvbnNvbGUubG9nKCdUZXh0IGZpZWxkIGNvbnRlbnRzOicsIHRleHQpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgaWYgdGhpcyB0ZXh0IGZpZWxkIGNvbnRhaW5zIG5vIHVuZGVybHlpbmcgdmFsdWUsIGB1bmRlZmluZWRgXG4gICAgICogd2lsbCBiZSByZXR1cm5lZC4gVGV4dCBmaWVsZHMgbWF5IGFsc28gY29udGFpbiBhbiB1bmRlcmx5aW5nIHZhbHVlIHRoYXRcbiAgICAgKiBpcyBzaW1wbHkgYW4gZW1wdHkgc3RyaW5nIChgJydgKS4gVGhpcyBkZXRhaWwgaXMgbGFyZ2VseSBpcnJlbGV2YW50IGZvclxuICAgICAqIG1vc3QgYXBwbGljYXRpb25zLiBJbiBnZW5lcmFsLCB5b3UnbGwgd2FudCB0byB0cmVhdCBib3RoIGNhc2VzIHRoZSBzYW1lXG4gICAgICogd2F5IGFuZCBzaW1wbHkgY29uc2lkZXIgdGhlIHRleHQgZmllbGQgdG8gYmUgZW1wdHkuIEluIGVpdGhlciBjYXNlLCB0aGVcbiAgICAgKiB0ZXh0IGZpZWxkIHdpbGwgYXBwZWFyIGVtcHR5IHRvIHVzZXJzIHdoZW4gdmlld2VkIGluIGEgUERGIHJlYWRlci5cbiAgICAgKlxuICAgICAqIEFuIGVycm9yIHdpbGwgYmUgdGhyb3duIGlmIHRoaXMgaXMgYSByaWNoIHRleHQgZmllbGQuIGBwZGYtbGliYCBkb2VzIG5vdFxuICAgICAqIHN1cHBvcnQgcmVhZGluZyByaWNoIHRleHQgZmllbGRzLiBOb3IgZG8gbW9zdCBQREYgcmVhZGVycyBhbmQgd3JpdGVycy5cbiAgICAgKiBSaWNoIHRleHQgZmllbGRzIGFyZSBiYXNlZCBvbiBYRkEgKFhNTCBGb3JtcyBBcmNoaXRlY3R1cmUpLiBSZWxhdGl2ZWx5IGZld1xuICAgICAqIFBERnMgdXNlIHJpY2ggdGV4dCBmaWVsZHMgb3IgWEZBLiBVbmxpa2UgUERGIGl0c2VsZiwgWEZBIGlzIG5vdCBhbiBJU09cbiAgICAgKiBzdGFuZGFyZC4gWEZBIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gUERGIDIuMDpcbiAgICAgKiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1hGQVxuICAgICAqICogaHR0cDovL2Jsb2cucGRmc2hhcmVmb3Jtcy5jb20vcGRmLTItMC1yZWxlYXNlLWJpZC1mYXJld2VsbC14ZmEtZm9ybXMvXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdGV4dCBjb250YWluZWQgaW4gdGhpcyB0ZXh0IGZpZWxkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZ2V0VGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5hY3JvRmllbGQuZ2V0VmFsdWUoKTtcbiAgICAgICAgaWYgKCF2YWx1ZSAmJiB0aGlzLmlzUmljaEZvcm1hdHRlZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmljaFRleHRGaWVsZFJlYWRFcnJvcih0aGlzLmdldE5hbWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2YWx1ZS5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHRleHQgZm9yIHRoaXMgZmllbGQuIFRoaXMgb3BlcmF0aW9uIGlzIGFuYWxvZ291cyB0byBhIGh1bWFuIHVzZXJcbiAgICAgKiBjbGlja2luZyBvbiB0aGUgdGV4dCBmaWVsZCBpbiBhIFBERiByZWFkZXIgYW5kIHR5cGluZyBpbiB0ZXh0IHZpYSB0aGVpclxuICAgICAqIGtleWJvYXJkLiBUaGlzIG1ldGhvZCB3aWxsIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBzdGF0ZSBvZiB0aGUgdGV4dCBmaWVsZFxuICAgICAqIHRvIGluZGljYXRlIHdoYXQgdGV4dCBoYXMgYmVlbiBzZXQuIFBERiBsaWJyYXJpZXMgYW5kIHJlYWRlcnMgd2lsbCBiZSBhYmxlXG4gICAgICogdG8gZXh0cmFjdCB0aGVzZSB2YWx1ZXMgZnJvbSB0aGUgc2F2ZWQgZG9jdW1lbnQgYW5kIGRldGVybWluZSB3aGF0IHRleHRcbiAgICAgKiB3YXMgc2V0LlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnYmVzdC5zdXBlcmhlcm8udGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLnNldFRleHQoJ09uZSBQdW5jaCBNYW4nKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgdGV4dCBmaWVsZCBhcyBkaXJ0eSwgY2F1c2luZyBpdHMgYXBwZWFyYW5jZVxuICAgICAqIHN0cmVhbXMgdG8gYmUgdXBkYXRlZCB3aGVuIGVpdGhlciBbW1BERkRvY3VtZW50LnNhdmVdXSBvclxuICAgICAqIFtbUERGRm9ybS51cGRhdGVGaWVsZEFwcGVhcmFuY2VzXV0gaXMgY2FsbGVkLiBUaGUgdXBkYXRlZCBzdHJlYW1zIHdpbGxcbiAgICAgKiBkaXNwbGF5IHRoZSB0ZXh0IHRoaXMgZmllbGQgY29udGFpbnMgaW5zaWRlIHRoZSB3aWRnZXRzIG9mIHRoaXMgdGV4dFxuICAgICAqIGZpZWxkLlxuICAgICAqXG4gICAgICogKipJTVBPUlRBTlQ6KiogVGhlIGRlZmF1bHQgZm9udCB1c2VkIHRvIHVwZGF0ZSBhcHBlYXJhbmNlIHN0cmVhbXMgaXNcbiAgICAgKiBbW1N0YW5kYXJkRm9udHMuSGVsdmV0aWNhXV0uIE5vdGUgdGhhdCB0aGlzIGlzIGEgV2luQW5zaSBmb250LiBUaGlzIG1lYW5zXG4gICAgICogdGhhdCBlbmNvZGluZyBlcnJvcnMgd2lsbCBiZSB0aHJvd24gaWYgdGhpcyBmaWVsZCBjb250YWlucyB0ZXh0IG91dHNpZGVcbiAgICAgKiB0aGUgV2luQW5zaSBjaGFyYWN0ZXIgc2V0ICh0aGUgbGF0aW4gYWxwaGFiZXQpLlxuICAgICAqXG4gICAgICogRW1iZWRkaW5nIGEgY3VzdG9tIGZvbnQgYW5kIHBhc3NpbmcgaXQgdG9cbiAgICAgKiBbW1BERkZvcm0udXBkYXRlRmllbGRBcHBlYXJhbmNlc11dIG9yIFtbUERGVGV4dEZpZWxkLnVwZGF0ZUFwcGVhcmFuY2VzXV1cbiAgICAgKiBhbGxvd3MgeW91IHRvIGdlbmVyYXRlIGFwcGVhcmFuY2Ugc3RyZWFtcyB3aXRoIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGVcbiAgICAgKiBsYXRpbiBhbHBoYWJldCAoYXNzdW1pbmcgdGhlIGN1c3RvbSBmb250IHN1cHBvcnRzIHRoZW0pLlxuICAgICAqXG4gICAgICogSWYgdGhpcyBpcyBhIHJpY2ggdGV4dCBmaWVsZCwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdGFuZGFyZCB0ZXh0XG4gICAgICogZmllbGQgaW4gb3JkZXIgdG8gc2V0IHRoZSB0ZXh0LiBgcGRmLWxpYmAgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nIHJpY2hcbiAgICAgKiB0ZXh0IHN0cmluZ3MuIE5vciBkbyBtb3N0IFBERiByZWFkZXJzIGFuZCB3cml0ZXJzLiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5nZXRUZXh0XV0gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcmljaCB0ZXh0IGZpZWxkcyBhbmRcbiAgICAgKiB0aGVpciBkZXByZWNhdGlvbiBpbiBQREYgMi4wLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdGhpcyBmaWVsZCBzaG91bGQgY29udGFpbi5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICBhc3NlcnRPclVuZGVmaW5lZCh0ZXh0LCAndGV4dCcsIFsnc3RyaW5nJ10pO1xuICAgICAgICB2YXIgbWF4TGVuZ3RoID0gdGhpcy5nZXRNYXhMZW5ndGgoKTtcbiAgICAgICAgaWYgKG1heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHRleHQgJiYgdGV4dC5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFeGNlZWRlZE1heExlbmd0aEVycm9yKHRleHQubGVuZ3RoLCBtYXhMZW5ndGgsIHRoaXMuZ2V0TmFtZSgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVJpY2hGb3JtYXR0aW5nKCk7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRWYWx1ZShQREZIZXhTdHJpbmcuZnJvbVRleHQodGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlVmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBhbGlnbm1lbnQgZm9yIHRoaXMgdGV4dCBmaWVsZC4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZVxuICAgICAqIGp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQgd2hlbiBpdCBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgaW4gUERGIHJlYWRlcnMuXG4gICAgICogVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGFsaWdubWVudHM6IGxlZnQsIGNlbnRlciwgYW5kIHJpZ2h0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGNvbnN0IGFsaWdubWVudCA9IHRleHRGaWVsZC5nZXRBbGlnbm1lbnQoKVxuICAgICAqIGlmIChhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuTGVmdCkgY29uc29sZS5sb2coJ1RleHQgaXMgbGVmdCBqdXN0aWZpZWQnKVxuICAgICAqIGlmIChhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuQ2VudGVyKSBjb25zb2xlLmxvZygnVGV4dCBpcyBjZW50ZXJlZCcpXG4gICAgICogaWYgKGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5SaWdodCkgY29uc29sZS5sb2coJ1RleHQgaXMgcmlnaHQganVzdGlmaWVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBUaGUgYWxpZ25tZW50IG9mIHRoaXMgdGV4dCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmdldEFsaWdubWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHF1YWRkaW5nID0gdGhpcy5hY3JvRmllbGQuZ2V0UXVhZGRpbmcoKTtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHJldHVybiAocXVhZGRpbmcgPT09IDAgPyBUZXh0QWxpZ25tZW50LkxlZnRcbiAgICAgICAgICAgIDogcXVhZGRpbmcgPT09IDEgPyBUZXh0QWxpZ25tZW50LkNlbnRlclxuICAgICAgICAgICAgICAgIDogcXVhZGRpbmcgPT09IDIgPyBUZXh0QWxpZ25tZW50LlJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIDogVGV4dEFsaWdubWVudC5MZWZ0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgYWxpZ25tZW50IGZvciB0aGlzIHRleHQgZmllbGQuIFRoaXMgd2lsbCBkZXRlcm1pbmUgdGhlXG4gICAgICoganVzdGlmaWNhdGlvbiBvZiB0aGUgdGV4dCB3aGVuIGl0IGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBpbiBQREYgcmVhZGVycy5cbiAgICAgKiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgYWxpZ25tZW50czogbGVmdCwgY2VudGVyLCBhbmQgcmlnaHQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICpcbiAgICAgKiAvLyBUZXh0IHdpbGwgYmUgbGVmdCBqdXN0aWZpZWQgd2hlbiBkaXNwbGF5ZWRcbiAgICAgKiB0ZXh0RmllbGQuc2V0QWxpZ25tZW50KFRleHRBbGlnbm1lbnQuTGVmdClcbiAgICAgKlxuICAgICAqIC8vIFRleHQgd2lsbCBiZSBjZW50ZXJlZCB3aGVuIGRpc3BsYXllZFxuICAgICAqIHRleHRGaWVsZC5zZXRBbGlnbm1lbnQoVGV4dEFsaWdubWVudC5DZW50ZXIpXG4gICAgICpcbiAgICAgKiAvLyBUZXh0IHdpbGwgYmUgcmlnaHQganVzdGlmaWVkIHdoZW4gZGlzcGxheWVkXG4gICAgICogdGV4dEZpZWxkLnNldEFsaWdubWVudChUZXh0QWxpZ25tZW50LlJpZ2h0KVxuICAgICAqIGBgYFxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbWFyayB0aGlzIHRleHQgZmllbGQgYXMgZGlydHkuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLnNldFRleHRdXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoYXQgdGhpcyBtZWFucy5cbiAgICAgKiBAcGFyYW0gYWxpZ25tZW50IFRoZSBhbGlnbm1lbnQgZm9yIHRoaXMgdGV4dCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnNldEFsaWdubWVudCA9IGZ1bmN0aW9uIChhbGlnbm1lbnQpIHtcbiAgICAgICAgYXNzZXJ0SXNPbmVPZihhbGlnbm1lbnQsICdhbGlnbm1lbnQnLCBUZXh0QWxpZ25tZW50KTtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRRdWFkZGluZyhhbGlnbm1lbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGlzIGZpZWxkLiBUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIG1heGltdW1cbiAgICAgKiBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSB0eXBlZCBpbnRvIHRoaXMgZmllbGQgYnkgdGhlIHVzZXIuIElmXG4gICAgICogdGhpcyBmaWVsZCBkb2VzIG5vdCBoYXZlIGEgbWF4aW11bSBsZW5ndGgsIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogY29uc3QgbWF4TGVuZ3RoID0gdGV4dEZpZWxkLmdldE1heExlbmd0aCgpXG4gICAgICogaWYgKG1heExlbmd0aCA9PT0gdW5kZWZpbmVkKSBjb25zb2xlLmxvZygnTm8gbWF4IGxlbmd0aCcpXG4gICAgICogZWxzZSBjb25zb2xlLmxvZyhgTWF4IGxlbmd0aCBpcyAke21heExlbmd0aH1gKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhpcyBmaWVsZCwgb3JcbiAgICAgKiAgICAgICAgICBgdW5kZWZpbmVkYCBpZiBubyBsaW1pdCBleGlzdHMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5nZXRNYXhMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5nZXRNYXhMZW5ndGgoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhpcyBmaWVsZC4gVGhpcyBsaW1pdHMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzXG4gICAgICogdGhhdCBjYW4gYmUgdHlwZWQgaW50byB0aGlzIGZpZWxkIGJ5IHRoZSB1c2VyLiBUaGlzIGFsc28gbGltaXRzIHRoZSBsZW5ndGhcbiAgICAgKiBvZiB0aGUgc3RyaW5nIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0uIFRoaXMgbGltaXRcbiAgICAgKiBjYW4gYmUgcmVtb3ZlZCBieSBwYXNzaW5nIGB1bmRlZmluZWRgIGFzIGBtYXhMZW5ndGhgLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqXG4gICAgICogLy8gQWxsb3cgYmV0d2VlbiAwIGFuZCA1IGNoYXJhY3RlcnMgdG8gYmUgZW50ZXJlZFxuICAgICAqIHRleHRGaWVsZC5zZXRNYXhMZW5ndGgoNSlcbiAgICAgKlxuICAgICAqIC8vIEFsbG93IGFueSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSBlbnRlcmVkXG4gICAgICogdGV4dEZpZWxkLnNldE1heExlbmd0aCh1bmRlZmluZWQpXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgdGV4dCBmaWVsZCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqIEBwYXJhbSBtYXhMZW5ndGggVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGlzIGZpZWxkLCBvclxuICAgICAqICAgICAgICAgICAgICAgICAgYHVuZGVmaW5lZGAgdG8gcmVtb3ZlIHRoZSBsaW1pdC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLnNldE1heExlbmd0aCA9IGZ1bmN0aW9uIChtYXhMZW5ndGgpIHtcbiAgICAgICAgYXNzZXJ0UmFuZ2VPclVuZGVmaW5lZChtYXhMZW5ndGgsICdtYXhMZW5ndGgnLCAwLCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgaWYgKG1heExlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFjcm9GaWVsZC5yZW1vdmVNYXhMZW5ndGgoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0ZXh0ID0gdGhpcy5nZXRUZXh0KCk7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0Lmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkTWF4TGVuZ3RoRXJyb3IodGV4dC5sZW5ndGgsIG1heExlbmd0aCwgdGhpcy5nZXROYW1lKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0TWF4TGVuZ3RoKG1heExlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgbWF4aW11bSBsZW5ndGggZm9yIHRoaXMgdGV4dCBmaWVsZC4gVGhpcyBhbGxvd3MgYW55IG51bWJlciBvZlxuICAgICAqIGNoYXJhY3RlcnMgdG8gYmUgdHlwZWQgaW50byB0aGlzIGZpZWxkIGJ5IHRoZSB1c2VyLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5yZW1vdmVNYXhMZW5ndGgoKVxuICAgICAqIGBgYFxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBwYXNzaW5nIGB1bmRlZmluZWRgIHRvXG4gICAgICogW1tQREZUZXh0RmllbGQuc2V0TWF4TGVuZ3RoXV0uXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5yZW1vdmVNYXhMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQucmVtb3ZlTWF4TGVuZ3RoKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IGFuIGltYWdlIGluc2lkZSB0aGUgYm91bmRzIG9mIHRoaXMgdGV4dCBmaWVsZCdzIHdpZGdldHMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgcG5nSW1hZ2UgPSBhd2FpdCBwZGZEb2MuZW1iZWRQbmcoLi4uKVxuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5zZXRJbWFnZShwbmdJbWFnZSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBhcHBlYXJhbmNlcyBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgdGV4dCBmaWVsZCdzIHdpZGdldHMuXG4gICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5zZXRJbWFnZSA9IGZ1bmN0aW9uIChpbWFnZSkge1xuICAgICAgICB2YXIgZmllbGRBbGlnbm1lbnQgPSB0aGlzLmdldEFsaWdubWVudCgpO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdmFyIGFsaWdubWVudCA9IGZpZWxkQWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LkNlbnRlciA/IEltYWdlQWxpZ25tZW50LkNlbnRlclxuICAgICAgICAgICAgOiBmaWVsZEFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5SaWdodCA/IEltYWdlQWxpZ25tZW50LlJpZ2h0XG4gICAgICAgICAgICAgICAgOiBJbWFnZUFsaWdubWVudC5MZWZ0O1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgc3RyZWFtUmVmID0gdGhpcy5jcmVhdGVJbWFnZUFwcGVhcmFuY2VTdHJlYW0od2lkZ2V0LCBpbWFnZSwgYWxpZ25tZW50KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZXMod2lkZ2V0LCB7IG5vcm1hbDogc3RyZWFtUmVmIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFya0FzQ2xlYW4oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZm9udCBzaXplIGZvciB0aGlzIGZpZWxkLiBMYXJnZXIgZm9udCBzaXplcyB3aWxsIHJlc3VsdCBpbiBsYXJnZXJcbiAgICAgKiB0ZXh0IGJlaW5nIGRpc3BsYXllZCB3aGVuIFBERiByZWFkZXJzIHJlbmRlciB0aGlzIHRleHQgZmllbGQuIEZvbnQgc2l6ZXNcbiAgICAgKiBtYXkgYmUgaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBTdXBwbHlpbmcgYSBuZWdhdGl2ZSBmb250IHNpemVcbiAgICAgKiB3aWxsIGNhdXNlIHRoaXMgbWV0aG9kIHRvIHRocm93IGFuIGVycm9yLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuc2V0Rm9udFNpemUoNClcbiAgICAgKiB0ZXh0RmllbGQuc2V0Rm9udFNpemUoMTUuNylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqID4gVGhpcyBtZXRob2QgZGVwZW5kcyB1cG9uIHRoZSBleGlzdGVuY2Ugb2YgYSBkZWZhdWx0IGFwcGVhcmFuY2VcbiAgICAgKiA+IChgL0RBYCkgc3RyaW5nLiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGFwcGVhcmFuY2Ugc3RyaW5nLFxuICAgICAqID4gb3IgdGhhdCBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhIGZvbnQgc2l6ZSAodmlhIHRoZSBgVGZgIG9wZXJhdG9yKSxcbiAgICAgKiA+IHRoZW4gdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb250U2l6ZSBUaGUgZm9udCBzaXplIHRvIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGV4dCBpbiB0aGlzIGZpZWxkLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuc2V0Rm9udFNpemUgPSBmdW5jdGlvbiAoZm9udFNpemUpIHtcbiAgICAgICAgYXNzZXJ0UG9zaXRpdmUoZm9udFNpemUsICdmb250U2l6ZScpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIGVhY2ggbGluZSBvZiB0ZXh0IGlzIHNob3duIG9uIGEgbmV3IGxpbmUgd2hlbiB0aGlzXG4gICAgICogZmllbGQgaXMgZGlzcGxheWVkIGluIGEgUERGIHJlYWRlci4gVGhlIGFsdGVybmF0aXZlIGlzIHRoYXQgYWxsIGxpbmVzIG9mXG4gICAgICogdGV4dCBhcmUgbWVyZ2VkIG9udG8gYSBzaW5nbGUgbGluZSB3aGVuIGRpc3BsYXllZC4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuZW5hYmxlTXVsdGlsaW5lXV0gYW5kIFtbUERGVGV4dEZpZWxkLmRpc2FibGVNdWx0aWxpbmVdXS5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQuaXNNdWx0aWxpbmUoKSkgY29uc29sZS5sb2coJ011bHRpbGluZSBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGlzIGEgbXVsdGlsaW5lIHRleHQgZmllbGQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc011bHRpbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb1RleHRGbGFncy5NdWx0aWxpbmUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzcGxheSBlYWNoIGxpbmUgb2YgdGV4dCBvbiBhIG5ldyBsaW5lIHdoZW4gdGhpcyBmaWVsZCBpcyBkaXNwbGF5ZWQgaW4gYVxuICAgICAqIFBERiByZWFkZXIuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZU11bHRpbGluZSgpXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgdGV4dCBmaWVsZCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZW5hYmxlTXVsdGlsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLk11bHRpbGluZSwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IGVhY2ggbGluZSBvZiB0ZXh0IG9uIHRoZSBzYW1lIGxpbmUgd2hlbiB0aGlzIGZpZWxkIGlzIGRpc3BsYXllZFxuICAgICAqIGluIGEgUERGIHJlYWRlci4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGlzYWJsZU11bHRpbGluZSgpXG4gICAgICogYGBgXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgdGV4dCBmaWVsZCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGlzYWJsZU11bHRpbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5NdWx0aWxpbmUsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgaXMgYSBwYXNzd29yZCB0ZXh0IGZpZWxkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZpZWxkXG4gICAgICogaXMgaW50ZW5kZWQgZm9yIHN0b3JpbmcgYSBzZWN1cmUgcGFzc3dvcmQuIFNlZVxuICAgICAqIFtbUERGVGV4dEZpZWxkLmVuYWJsZVBhc3N3b3JkXV0gYW5kIFtbUERGVGV4dEZpZWxkLmRpc2FibGVQYXNzd29yZF1dLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogaWYgKHRleHRGaWVsZC5pc1Bhc3N3b3JkKCkpIGNvbnNvbGUubG9nKCdQYXNzd29yZCBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGlzIGEgcGFzc3dvcmQgdGV4dCBmaWVsZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmlzUGFzc3dvcmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9UZXh0RmxhZ3MuUGFzc3dvcmQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIHRleHQgZmllbGQgaXMgaW50ZW5kZWQgZm9yIHN0b3JpbmcgYSBzZWN1cmUgcGFzc3dvcmQuXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlUGFzc3dvcmQoKVxuICAgICAqIGBgYFxuICAgICAqIFZhbHVlcyBlbnRlcmVkIGludG8gcGFzc3dvcmQgdGV4dCBmaWVsZHMgc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQgb24gdGhlXG4gICAgICogc2NyZWVuIGJ5IFBERiByZWFkZXJzLiBNb3N0IFBERiByZWFkZXJzIHdpbGwgZGlzcGxheSB0aGUgdmFsdWUgYXNcbiAgICAgKiBhc3Rlcmlza3Mgb3IgYnVsbGV0cy4gUERGIHJlYWRlcnMgc2hvdWxkIG5ldmVyIHN0b3JlIHZhbHVlcyBlbnRlcmVkIGJ5IHRoZVxuICAgICAqIHVzZXIgaW50byBwYXNzd29yZCB0ZXh0IGZpZWxkcy4gU2ltaWxhcmx5LCBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdFxuICAgICAqIHdyaXRlIGRhdGEgdG8gYSBwYXNzd29yZCB0ZXh0IGZpZWxkLlxuICAgICAqXG4gICAgICogKipQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IGNhdXNlIGVudGVyZWQgdmFsdWVzIHRvIGJlXG4gICAgICogZW5jcnlwdGVkIG9yIHNlY3VyZWQgaW4gYW55IHdheSEgSXQgc2ltcGx5IHNldHMgYSBmbGFnIHRoYXQgUERGIHNvZnR3YXJlXG4gICAgICogYW5kIHJlYWRlcnMgY2FuIGFjY2VzcyB0byBkZXRlcm1pbmUgdGhlIF9wdXJwb3NlXyBvZiB0aGlzIGZpZWxkLioqXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVQYXNzd29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuUGFzc3dvcmQsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIHRleHQgZmllbGQgaXMgKipub3QqKiBpbnRlbmRlZCBmb3Igc3RvcmluZyBhIHNlY3VyZVxuICAgICAqIHBhc3N3b3JkLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kaXNhYmxlUGFzc3dvcmQoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGlzYWJsZVBhc3N3b3JkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5QYXNzd29yZCwgZmFsc2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdGV4dCBmaWVsZCByZXByZXNlbnQgYSBmaWxlIHBhdGguXG4gICAgICogU2VlIFtbUERGVGV4dEZpZWxkLmVuYWJsZUZpbGVTZWxlY3Rpb25dXSBhbmRcbiAgICAgKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlRmlsZVNlbGVjdGlvbl1dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQuaXNGaWxlU2VsZWN0b3IoKSkgY29uc29sZS5sb2coJ0lzIGEgZmlsZSBzZWxlY3RvcicpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBmaWVsZCBzaG91bGQgY29udGFpbiBmaWxlIHBhdGhzLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuaXNGaWxlU2VsZWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9UZXh0RmxhZ3MuRmlsZVNlbGVjdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgdGV4dCBmaWVsZCBpcyBpbnRlbmRlZCB0byBzdG9yZSBhIGZpbGUgcGF0aC4gVGhlXG4gICAgICogY29udGVudHMgb2YgdGhlIGZpbGUgc3RvcmVkIGF0IHRoYXQgcGF0aCBzaG91bGQgYmUgc3VibWl0dGVkIGFzIHRoZSB2YWx1ZVxuICAgICAqIG9mIHRoZSBmaWVsZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZW5hYmxlRmlsZVNlbGVjdGlvbigpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5lbmFibGVGaWxlU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5GaWxlU2VsZWN0LCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyB0ZXh0IGZpZWxkIGlzICoqbm90KiogaW50ZW5kZWQgdG8gc3RvcmUgYSBmaWxlIHBhdGguXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGlzYWJsZUZpbGVTZWxlY3Rpb24oKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGlzYWJsZUZpbGVTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLnNldEZsYWdUbyhBY3JvVGV4dEZsYWdzLkZpbGVTZWxlY3QsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhpcyBmaWVsZCBzaG91bGQgYmUgc3BlbGwgY2hlY2tlZFxuICAgICAqIGJ5IFBERiByZWFkZXJzLiBTZWUgW1tQREZUZXh0RmllbGQuZW5hYmxlU3BlbGxDaGVja2luZ11dIGFuZFxuICAgICAqIFtbUERGVGV4dEZpZWxkLmRpc2FibGVTcGVsbENoZWNraW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogaWYgKHRleHRGaWVsZC5pc1NwZWxsQ2hlY2tlZCgpKSBjb25zb2xlLmxvZygnU3BlbGwgY2hlY2tpbmcgaXMgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBmaWVsZCBzaG91bGQgYmUgc3BlbGwgY2hlY2tlZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmlzU3BlbGxDaGVja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb1RleHRGbGFncy5Eb05vdFNwZWxsQ2hlY2spO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgUERGIHJlYWRlcnMgdG8gc3BlbGwgY2hlY2sgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGlzIGZpZWxkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmVuYWJsZVNwZWxsQ2hlY2tpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZW5hYmxlU3BlbGxDaGVja2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuRG9Ob3RTcGVsbENoZWNrLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgYWxsb3cgUERGIHJlYWRlcnMgdG8gc3BlbGwgY2hlY2sgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGlzIGZpZWxkLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVTcGVsbENoZWNraW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVTcGVsbENoZWNraW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5Eb05vdFNwZWxsQ2hlY2ssIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgUERGIHJlYWRlcnMgc2hvdWxkIGFsbG93IHRoZSB1c2VyIHRvIHNjcm9sbCB0aGUgdGV4dFxuICAgICAqIGZpZWxkIHdoZW4gaXRzIGNvbnRlbnRzIGRvIG5vdCBmaXQgd2l0aGluIHRoZSBmaWVsZCdzIHZpZXcgYm91bmRzLiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5lbmFibGVTY3JvbGxpbmddXSBhbmQgW1tQREZUZXh0RmllbGQuZGlzYWJsZVNjcm9sbGluZ11dLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogaWYgKHRleHRGaWVsZC5pc1Njcm9sbGFibGUoKSkgY29uc29sZS5sb2coJ1Njcm9sbGluZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZmllbGQgaXMgc2Nyb2xsYWJsZSBpbiBQREYgcmVhZGVycy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmlzU2Nyb2xsYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9UZXh0RmxhZ3MuRG9Ob3RTY3JvbGwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWxsb3cgUERGIHJlYWRlcnMgdG8gcHJlc2VudCBhIHNjcm9sbCBiYXIgdG8gdGhlIHVzZXIgd2hlbiB0aGUgY29udGVudHNcbiAgICAgKiBvZiB0aGlzIHRleHQgZmllbGQgZG8gbm90IGZpdCB3aXRoaW4gaXRzIHZpZXcgYm91bmRzLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5lbmFibGVTY3JvbGxpbmcoKVxuICAgICAqIGBgYFxuICAgICAqIEEgaG9yaXpvbnRhbCBzY3JvbGwgYmFyIHNob3VsZCBiZSBzaG93biBmb3Igc2luZ2xlbGluZSBmaWVsZHMuIEEgdmVydGljYWxcbiAgICAgKiBzY3JvbGwgYmFyIHNob3VsZCBiZSBzaG93biBmb3IgbXVsdGlsaW5lIGZpZWxkcy5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZVNjcm9sbGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuRG9Ob3RTY3JvbGwsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBhbGxvdyBQREYgcmVhZGVycyB0byBwcmVzZW50IGEgc2Nyb2xsIGJhciB0byB0aGUgdXNlciB3aGVuIHRoZVxuICAgICAqIGNvbnRlbnRzIG9mIHRoaXMgdGV4dCBmaWVsZCBkbyBub3QgZml0IHdpdGhpbiBpdHMgdmlldyBib3VuZHMuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogdGV4dEZpZWxkLmRpc2FibGVTY3JvbGxpbmcoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZGlzYWJsZVNjcm9sbGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuRG9Ob3RTY3JvbGwsIHRydWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBpcyBhIGNvbWJlZCB0ZXh0IGZpZWxkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZpZWxkXG4gICAgICogaXMgc3BsaXQgaW50byBgbmAgZXF1YWwgc2l6ZSBjZWxscyB3aXRoIG9uZSBjaGFyYWN0ZXIgaW4gZWFjaCAod2hlcmUgYG5gXG4gICAgICogaXMgZXF1YWwgdG8gdGhlIG1heCBsZW5ndGggb2YgdGhlIHRleHQgZmllbGQpLiBUaGUgcmVzdWx0IGlzIHRoYXQgYWxsXG4gICAgICogY2hhcmFjdGVycyBpbiB0aGlzIGZpZWxkIGFyZSBkaXNwbGF5ZWQgYW4gZXF1YWwgZGlzdGFuY2UgYXBhcnQgZnJvbSBvbmVcbiAgICAgKiBhbm90aGVyLiBTZWUgW1tQREZUZXh0RmllbGQuZW5hYmxlQ29tYmluZ11dIGFuZFxuICAgICAqIFtbUERGVGV4dEZpZWxkLmRpc2FibGVDb21iaW5nXV0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogaWYgKHRleHRGaWVsZC5pc0NvbWJlZCgpKSBjb25zb2xlLmxvZygnQ29tYmluZyBpcyBlbmFibGVkJylcbiAgICAgKiBgYGBcbiAgICAgKiBOb3RlIHRoYXQgaW4gb3JkZXIgZm9yIGEgdGV4dCBmaWVsZCB0byBiZSBjb21iZWQsIHRoZSBmb2xsb3dpbmcgbXVzdCBiZVxuICAgICAqIHRydWUgKGluIGFkZGl0aW9uIHRvIGVuYWJsaW5nIGNvbWJpbmcpOlxuICAgICAqICogSXQgbXVzdCBub3QgYmUgYSBtdWx0aWxpbmUgZmllbGQgKHNlZSBbW1BERlRleHRGaWVsZC5pc011bHRpbGluZV1dKVxuICAgICAqICogSXQgbXVzdCBub3QgYmUgYSBwYXNzd29yZCBmaWVsZCAoc2VlIFtbUERGVGV4dEZpZWxkLmlzUGFzc3dvcmRdXSlcbiAgICAgKiAqIEl0IG11c3Qgbm90IGJlIGEgZmlsZSBzZWxlY3RvciBmaWVsZCAoc2VlIFtbUERGVGV4dEZpZWxkLmlzRmlsZVNlbGVjdG9yXV0pXG4gICAgICogKiBJdCBtdXN0IGhhdmUgYSBtYXggbGVuZ3RoIGRlZmluZWQgKHNlZSBbW1BERlRleHRGaWVsZC5zZXRNYXhMZW5ndGhdXSlcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGlzIGZpZWxkIGlzIGNvbWJlZC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmlzQ29tYmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuYWNyb0ZpZWxkLmhhc0ZsYWcoQWNyb1RleHRGbGFncy5Db21iKSAmJlxuICAgICAgICAgICAgIXRoaXMuaXNNdWx0aWxpbmUoKSAmJlxuICAgICAgICAgICAgIXRoaXMuaXNQYXNzd29yZCgpICYmXG4gICAgICAgICAgICAhdGhpcy5pc0ZpbGVTZWxlY3RvcigpICYmXG4gICAgICAgICAgICB0aGlzLmdldE1heExlbmd0aCgpICE9PSB1bmRlZmluZWQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU3BsaXQgdGhpcyBmaWVsZCBpbnRvIGBuYCBlcXVhbCBzaXplIGNlbGxzIHdpdGggb25lIGNoYXJhY3RlciBpbiBlYWNoXG4gICAgICogKHdoZXJlIGBuYCBpcyBlcXVhbCB0byB0aGUgbWF4IGxlbmd0aCBvZiB0aGUgdGV4dCBmaWVsZCkuIFRoaXMgd2lsbCBjYXVzZVxuICAgICAqIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBmaWVsZCB0byBiZSBkaXNwbGF5ZWQgYW4gZXF1YWwgZGlzdGFuY2UgYXBhcnQgZnJvbVxuICAgICAqIG9uZSBhbm90aGVyLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5lbmFibGVDb21iaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRleHQgZmllbGRzIG11c3QgaGF2ZSBhIG1heCBsZW5ndGhcbiAgICAgKiBkZWZpbmVkIGluIG9yZGVyIHRvIGJlIGNvbWJlZCAoc2VlIFtbUERGVGV4dEZpZWxkLnNldE1heExlbmd0aF1dKS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBjYWxsIHRoZSBmb2xsb3dpbmcgdGhyZWUgbWV0aG9kcyBpbnRlcm5hbGx5OlxuICAgICAqICogW1tQREZUZXh0RmllbGQuZGlzYWJsZU11bHRpbGluZV1dXG4gICAgICogKiBbW1BERlRleHRGaWVsZC5kaXNhYmxlUGFzc3dvcmRdXVxuICAgICAqICogW1tQREZUZXh0RmllbGQuZGlzYWJsZUZpbGVTZWxlY3Rpb25dXVxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBtYXJrIHRoaXMgdGV4dCBmaWVsZCBhcyBkaXJ0eS4gU2VlXG4gICAgICogW1tQREZUZXh0RmllbGQuc2V0VGV4dF1dIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCB0aGlzIG1lYW5zLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUuZW5hYmxlQ29tYmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0TWF4TGVuZ3RoKCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIG1zZyA9IFwiUERGVGV4dEZpZWxkcyBtdXN0IGhhdmUgYSBtYXggbGVuZ3RoIGluIG9yZGVyIHRvIGJlIGNvbWJlZFwiO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmRpc2FibGVNdWx0aWxpbmUoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlUGFzc3dvcmQoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlRmlsZVNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5Db21iLCB0cnVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFR1cm4gb2ZmIGNvbWJpbmcgZm9yIHRoaXMgdGV4dCBmaWVsZC4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGlzYWJsZUNvbWJpbmcoKVxuICAgICAqIGBgYFxuICAgICAqIFNlZSBbW1BERlRleHRGaWVsZC5pc0NvbWJlZF1dIGFuZCBbW1BERlRleHRGaWVsZC5lbmFibGVDb21iaW5nXV0gZm9yIG1vcmVcbiAgICAgKiBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGNvbWJpbmcgaXMuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG1hcmsgdGhpcyB0ZXh0IGZpZWxkIGFzIGRpcnR5LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5zZXRUZXh0XV0gZm9yIG1vcmUgZGV0YWlscyBhYm91dCB3aGF0IHRoaXMgbWVhbnMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kaXNhYmxlQ29tYmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5Db21iLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHRleHQgZmllbGQgY29udGFpbnMgcmljaCB0ZXh0LiBTZWVcbiAgICAgKiBbW1BERlRleHRGaWVsZC5lbmFibGVSaWNoRm9ybWF0dGluZ11dIGFuZFxuICAgICAqIFtbUERGVGV4dEZpZWxkLmRpc2FibGVSaWNoRm9ybWF0dGluZ11dLiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIGlmICh0ZXh0RmllbGQuaXNSaWNoRm9ybWF0dGVkKCkpIGNvbnNvbGUubG9nKCdSaWNoIGZvcm1hdHRpbmcgZW5hYmxlZCcpXG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhpcyBmaWVsZCBjb250YWlucyByaWNoIHRleHQuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5pc1JpY2hGb3JtYXR0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcm9GaWVsZC5oYXNGbGFnKEFjcm9UZXh0RmxhZ3MuUmljaFRleHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgdGhhdCB0aGlzIGZpZWxkIGNvbnRhaW5zIFhGQSBkYXRhIC0gb3IgcmljaCB0ZXh0LiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5lbmFibGVSaWNoRm9ybWF0dGluZygpXG4gICAgICogYGBgXG4gICAgICogTm90ZSB0aGF0IGBwZGYtbGliYCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgb3Igd3JpdGluZyByaWNoIHRleHQgZmllbGRzLlxuICAgICAqIE5vciBkbyBtb3N0IFBERiByZWFkZXJzIGFuZCB3cml0ZXJzLiBSaWNoIHRleHQgZmllbGRzIGFyZSBiYXNlZCBvbiBYRkFcbiAgICAgKiAoWE1MIEZvcm1zIEFyY2hpdGVjdHVyZSkuIFJlbGF0aXZlbHkgZmV3IFBERnMgdXNlIHJpY2ggdGV4dCBmaWVsZHMgb3IgWEZBLlxuICAgICAqIFVubGlrZSBQREYgaXRzZWxmLCBYRkEgaXMgbm90IGFuIElTTyBzdGFuZGFyZC4gWEZBIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW5cbiAgICAgKiBQREYgMi4wOlxuICAgICAqICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWEZBXG4gICAgICogKiBodHRwOi8vYmxvZy5wZGZzaGFyZWZvcm1zLmNvbS9wZGYtMi0wLXJlbGVhc2UtYmlkLWZhcmV3ZWxsLXhmYS1mb3Jtcy9cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmVuYWJsZVJpY2hGb3JtYXR0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjcm9GaWVsZC5zZXRGbGFnVG8oQWNyb1RleHRGbGFncy5SaWNoVGV4dCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBzdGFuZGFyZCB0ZXh0IGZpZWxkIHRoYXQgZG9lcyBub3QgWEZBIGRhdGEgKHJpY2hcbiAgICAgKiB0ZXh0KS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQuZGlzYWJsZVJpY2hGb3JtYXR0aW5nKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmRpc2FibGVSaWNoRm9ybWF0dGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hY3JvRmllbGQuc2V0RmxhZ1RvKEFjcm9UZXh0RmxhZ3MuUmljaFRleHQsIGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNob3cgdGhpcyB0ZXh0IGZpZWxkIG9uIHRoZSBzcGVjaWZpZWQgcGFnZS4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCB1YnVudHVGb250ID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udCh1YnVudHVGb250Qnl0ZXMpXG4gICAgICogY29uc3QgcGFnZSA9IHBkZkRvYy5hZGRQYWdlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IGZvcm0gPSBwZGZEb2MuZ2V0Rm9ybSgpXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5jcmVhdGVUZXh0RmllbGQoJ2Jlc3QuZ3VuZGFtJylcbiAgICAgKiB0ZXh0RmllbGQuc2V0VGV4dCgnRXhpYScpXG4gICAgICpcbiAgICAgKiB0ZXh0RmllbGQuYWRkVG9QYWdlKHBhZ2UsIHtcbiAgICAgKiAgIHg6IDUwLFxuICAgICAqICAgeTogNzUsXG4gICAgICogICB3aWR0aDogMjAwLFxuICAgICAqICAgaGVpZ2h0OiAxMDAsXG4gICAgICogICB0ZXh0Q29sb3I6IHJnYigxLCAwLCAwKSxcbiAgICAgKiAgIGJhY2tncm91bmRDb2xvcjogcmdiKDAsIDEsIDApLFxuICAgICAqICAgYm9yZGVyQ29sb3I6IHJnYigwLCAwLCAxKSxcbiAgICAgKiAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAqICAgcm90YXRlOiBkZWdyZWVzKDkwKSxcbiAgICAgKiAgIGZvbnQ6IHVidW50dUZvbnQsXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHdpZGdldCBmb3IgdGhpcyB0ZXh0IGZpZWxkLlxuICAgICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIHdoaWNoIHRoaXMgdGV4dCBmaWVsZCB3aWRnZXQgc2hvdWxkIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBhZGRpbmcgdGhpcyB0ZXh0IGZpZWxkIHdpZGdldC5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLmFkZFRvUGFnZSA9IGZ1bmN0aW9uIChwYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgYXNzZXJ0SXMocGFnZSwgJ3BhZ2UnLCBbW1BERlBhZ2UsICdQREZQYWdlJ11dKTtcbiAgICAgICAgYXNzZXJ0RmllbGRBcHBlYXJhbmNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAoISgndGV4dENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMudGV4dENvbG9yID0gcmdiKDAsIDAsIDApO1xuICAgICAgICBpZiAoISgnYmFja2dyb3VuZENvbG9yJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYmFja2dyb3VuZENvbG9yID0gcmdiKDEsIDEsIDEpO1xuICAgICAgICBpZiAoISgnYm9yZGVyQ29sb3InIGluIG9wdGlvbnMpKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciA9IHJnYigwLCAwLCAwKTtcbiAgICAgICAgaWYgKCEoJ2JvcmRlcldpZHRoJyBpbiBvcHRpb25zKSlcbiAgICAgICAgICAgIG9wdGlvbnMuYm9yZGVyV2lkdGggPSAxO1xuICAgICAgICAvLyBDcmVhdGUgYSB3aWRnZXQgZm9yIHRoaXMgdGV4dCBmaWVsZFxuICAgICAgICB2YXIgd2lkZ2V0ID0gdGhpcy5jcmVhdGVXaWRnZXQoe1xuICAgICAgICAgICAgeDogKF9hID0gb3B0aW9ucy54KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwLFxuICAgICAgICAgICAgeTogKF9iID0gb3B0aW9ucy55KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwLFxuICAgICAgICAgICAgd2lkdGg6IChfYyA9IG9wdGlvbnMud2lkdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDIwMCxcbiAgICAgICAgICAgIGhlaWdodDogKF9kID0gb3B0aW9ucy5oZWlnaHQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDUwLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAoX2UgPSBvcHRpb25zLmJvcmRlcldpZHRoKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAwLFxuICAgICAgICAgICAgcm90YXRlOiAoX2YgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogZGVncmVlcygwKSxcbiAgICAgICAgICAgIGhpZGRlbjogb3B0aW9ucy5oaWRkZW4sXG4gICAgICAgICAgICBwYWdlOiBwYWdlLnJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB3aWRnZXRSZWYgPSB0aGlzLmRvYy5jb250ZXh0LnJlZ2lzdGVyKHdpZGdldC5kaWN0KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGlzIGZpZWxkXG4gICAgICAgIHRoaXMuYWNyb0ZpZWxkLmFkZFdpZGdldCh3aWRnZXRSZWYpO1xuICAgICAgICAvLyBTZXQgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciB3aWRnZXRcbiAgICAgICAgdmFyIGZvbnQgPSAoX2cgPSBvcHRpb25zLmZvbnQpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHRoaXMuZG9jLmdldEZvcm0oKS5nZXREZWZhdWx0Rm9udCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250KTtcbiAgICAgICAgLy8gQWRkIHdpZGdldCB0byB0aGUgZ2l2ZW4gcGFnZVxuICAgICAgICBwYWdlLm5vZGUuYWRkQW5ub3Qod2lkZ2V0UmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgdGV4dCBmaWVsZCBoYXMgYmVlbiBtYXJrZWQgYXMgZGlydHksIG9yIGlmIGFueSBvZlxuICAgICAqIHRoaXMgdGV4dCBmaWVsZCdzIHdpZGdldHMgZG8gbm90IGhhdmUgYW4gYXBwZWFyYW5jZSBzdHJlYW0uIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgdGV4dEZpZWxkID0gZm9ybS5nZXRUZXh0RmllbGQoJ3NvbWUudGV4dC5maWVsZCcpXG4gICAgICogaWYgKHRleHRGaWVsZC5uZWVkc0FwcGVhcmFuY2VzVXBkYXRlKCkpIGNvbnNvbGUubG9nKCdOZWVkcyB1cGRhdGUnKVxuICAgICAqIGBgYFxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoaXMgdGV4dCBmaWVsZCBuZWVkcyBhbiBhcHBlYXJhbmNlIHVwZGF0ZS5cbiAgICAgKi9cbiAgICBQREZUZXh0RmllbGQucHJvdG90eXBlLm5lZWRzQXBwZWFyYW5jZXNVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSgpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5hY3JvRmllbGQuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBoYXNBcHBlYXJhbmNlcyA9ICgoX2EgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZXMoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vcm1hbCkgaW5zdGFuY2VvZiBQREZTdHJlYW07XG4gICAgICAgICAgICBpZiAoIWhhc0FwcGVhcmFuY2VzKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zIGZvciBlYWNoIG9mIHRoaXMgdGV4dCBmaWVsZCdzIHdpZGdldHMgdXNpbmdcbiAgICAgKiB0aGUgZGVmYXVsdCBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciB0ZXh0IGZpZWxkcy4gRm9yIGV4YW1wbGU6XG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBoZWx2ZXRpY2EgPSBhd2FpdCBwZGZEb2MuZW1iZWRGb250KFN0YW5kYXJkRm9udHMuSGVsdmV0aWNhKVxuICAgICAqIGNvbnN0IHRleHRGaWVsZCA9IGZvcm0uZ2V0VGV4dEZpZWxkKCdzb21lLnRleHQuZmllbGQnKVxuICAgICAqIHRleHRGaWVsZC5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhKVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBmb250IFRoZSBmb250IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS5kZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICBhc3NlcnRJcyhmb250LCAnZm9udCcsIFtbUERGRm9udCwgJ1BERkZvbnQnXV0pO1xuICAgICAgICB0aGlzLnVwZGF0ZUFwcGVhcmFuY2VzKGZvbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhcHBlYXJhbmNlIHN0cmVhbXMgZm9yIGVhY2ggb2YgdGhpcyB0ZXh0IGZpZWxkJ3Mgd2lkZ2V0cyB1c2luZ1xuICAgICAqIHRoZSBnaXZlbiBhcHBlYXJhbmNlIHByb3ZpZGVyLiBJZiBubyBgcHJvdmlkZXJgIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHRcbiAgICAgKiBhcHBlYXJhbmNlIHByb3ZpZGVyIGZvciB0ZXh0IGZpZWxkcyB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlOlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgaGVsdmV0aWNhID0gYXdhaXQgcGRmRG9jLmVtYmVkRm9udChTdGFuZGFyZEZvbnRzLkhlbHZldGljYSlcbiAgICAgKiBjb25zdCB0ZXh0RmllbGQgPSBmb3JtLmdldFRleHRGaWVsZCgnc29tZS50ZXh0LmZpZWxkJylcbiAgICAgKiB0ZXh0RmllbGQudXBkYXRlQXBwZWFyYW5jZXMoaGVsdmV0aWNhLCAoZmllbGQsIHdpZGdldCwgZm9udCkgPT4ge1xuICAgICAqICAgLi4uXG4gICAgICogICByZXR1cm4gZHJhd1RleHRGaWVsZCguLi4pXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZm9udCBUaGUgZm9udCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqIEBwYXJhbSBwcm92aWRlciBPcHRpb25hbGx5LCB0aGUgYXBwZWFyYW5jZSBwcm92aWRlciB0byBiZSB1c2VkIGZvclxuICAgICAqICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXBwZWFyYW5jZSBzdHJlYW1zLlxuICAgICAqL1xuICAgIFBERlRleHRGaWVsZC5wcm90b3R5cGUudXBkYXRlQXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgYXNzZXJ0SXMoZm9udCwgJ2ZvbnQnLCBbW1BERkZvbnQsICdQREZGb250J11dKTtcbiAgICAgICAgYXNzZXJ0T3JVbmRlZmluZWQocHJvdmlkZXIsICdwcm92aWRlcicsIFtGdW5jdGlvbl0pO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuYWNyb0ZpZWxkLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdpZGdldEFwcGVhcmFuY2Uod2lkZ2V0LCBmb250LCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYXJrQXNDbGVhbigpO1xuICAgIH07XG4gICAgUERGVGV4dEZpZWxkLnByb3RvdHlwZS51cGRhdGVXaWRnZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKHdpZGdldCwgZm9udCwgcHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIGFwUHJvdmlkZXIgPSBwcm92aWRlciAhPT0gbnVsbCAmJiBwcm92aWRlciAhPT0gdm9pZCAwID8gcHJvdmlkZXIgOiBkZWZhdWx0VGV4dEZpZWxkQXBwZWFyYW5jZVByb3ZpZGVyO1xuICAgICAgICB2YXIgYXBwZWFyYW5jZXMgPSBub3JtYWxpemVBcHBlYXJhbmNlKGFwUHJvdmlkZXIodGhpcywgd2lkZ2V0LCBmb250KSk7XG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0QXBwZWFyYW5jZVdpdGhGb250KHdpZGdldCwgZm9udCwgYXBwZWFyYW5jZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogPiAqKk5PVEU6KiogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gSW5zdGVhZCxcbiAgICAgKiA+IGNvbnNpZGVyIHVzaW5nIHRoZSBbW1BERkZvcm0uZ2V0VGV4dEZpZWxkXV0gbWV0aG9kLCB3aGljaCB3aWxsIGNyZWF0ZSBhblxuICAgICAqID4gaW5zdGFuY2Ugb2YgW1tQREZUZXh0RmllbGRdXSBmb3IgeW91LlxuICAgICAqXG4gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFtbUERGVGV4dEZpZWxkXV0gZnJvbSBhbiBleGlzdGluZyBhY3JvVGV4dCBhbmQgcmVmXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWNyb1RleHQgVGhlIHVuZGVybHlpbmcgYFBERkFjcm9UZXh0YCBmb3IgdGhpcyB0ZXh0IGZpZWxkLlxuICAgICAqIEBwYXJhbSByZWYgVGhlIHVuaXF1ZSByZWZlcmVuY2UgZm9yIHRoaXMgdGV4dCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCB0byB3aGljaCB0aGlzIHRleHQgZmllbGQgd2lsbCBiZWxvbmcuXG4gICAgICovXG4gICAgUERGVGV4dEZpZWxkLm9mID0gZnVuY3Rpb24gKGFjcm9UZXh0LCByZWYsIGRvYykge1xuICAgICAgICByZXR1cm4gbmV3IFBERlRleHRGaWVsZChhY3JvVGV4dCwgcmVmLCBkb2MpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlRleHRGaWVsZDtcbn0oUERGRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlRleHRGaWVsZDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlRleHRGaWVsZC5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19zcHJlYWRBcnJheXMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGRyYXdDaGVja0JveCwgcm90YXRlSW5QbGFjZSwgZHJhd1JhZGlvQnV0dG9uLCBkcmF3QnV0dG9uLCBkcmF3VGV4dEZpZWxkLCBkcmF3T3B0aW9uTGlzdCwgfSBmcm9tIFwiLi4vb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgcmdiLCBjb21wb25lbnRzVG9Db2xvciwgc2V0RmlsbGluZ0NvbG9yLCBncmF5c2NhbGUsIGNteWssIH0gZnJvbSBcIi4uL2NvbG9yc1wiO1xuaW1wb3J0IHsgcmVkdWNlUm90YXRpb24sIGFkanVzdERpbXNGb3JSb3RhdGlvbiB9IGZyb20gXCIuLi9yb3RhdGlvbnNcIjtcbmltcG9ydCB7IGxheW91dE11bHRpbGluZVRleHQsIGxheW91dENvbWJlZFRleHQsIGxheW91dFNpbmdsZWxpbmVUZXh0LCB9IGZyb20gXCIuLi90ZXh0L2xheW91dFwiO1xuaW1wb3J0IHsgVGV4dEFsaWdubWVudCB9IGZyb20gXCIuLi90ZXh0L2FsaWdubWVudFwiO1xuaW1wb3J0IHsgc2V0Rm9udEFuZFNpemUgfSBmcm9tIFwiLi4vb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBmaW5kTGFzdE1hdGNoIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKioqKioqKioqKioqKioqKioqKioqIEFwcGVhcmFuY2UgUHJvdmlkZXIgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZXhwb3J0IHZhciBub3JtYWxpemVBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICBpZiAoJ25vcm1hbCcgaW4gYXBwZWFyYW5jZSlcbiAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2U7XG4gICAgcmV0dXJuIHsgbm9ybWFsOiBhcHBlYXJhbmNlIH07XG59O1xuLy8gRXhhbXBsZXM6XG4vLyAgIGAvSGVsdiAxMiBUZmAgLT4gWycvSGVsdiAxMiBUZicsICdIZWx2JywgJzEyJ11cbi8vICAgYC9IZUJvIDguMDAgVGZgIC0+IFsnL0hlQm8gOCBUZicsICdIZUJvJywgJzguMDAnXVxudmFyIHRmUmVnZXggPSAvXFwvKFteXFwwXFx0XFxuXFxmXFxyXFwgXSspW1xcMFxcdFxcblxcZlxcclxcIF0rKFxcZCpcXC5cXGQrfFxcZCspW1xcMFxcdFxcblxcZlxcclxcIF0rVGYvO1xudmFyIGdldERlZmF1bHRGb250U2l6ZSA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgdmFyIGRhID0gKF9hID0gZmllbGQuZ2V0RGVmYXVsdEFwcGVhcmFuY2UoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgdmFyIGRhTWF0Y2ggPSAoX2IgPSBmaW5kTGFzdE1hdGNoKGRhLCB0ZlJlZ2V4KS5tYXRjaCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW107XG4gICAgdmFyIGRlZmF1bHRGb250U2l6ZSA9IE51bWJlcihkYU1hdGNoWzJdKTtcbiAgICByZXR1cm4gaXNGaW5pdGUoZGVmYXVsdEZvbnRTaXplKSA/IGRlZmF1bHRGb250U2l6ZSA6IHVuZGVmaW5lZDtcbn07XG4vLyBFeGFtcGxlczpcbi8vICAgYDAuMyBnYCAtPiBbJzAuMycsICdnJ11cbi8vICAgYDAuMyAxIC4zIHJnYCAtPiBbJzAuMycsICcxJywgJy4zJywgJ3JnJ11cbi8vICAgYDAuMyAxIC4zIDAga2AgLT4gWycwLjMnLCAnMScsICcuMycsICcwJywgJ2snXVxudmFyIGNvbG9yUmVnZXggPSAvKFxcZCpcXC5cXGQrfFxcZCspW1xcMFxcdFxcblxcZlxcclxcIF0qKFxcZCpcXC5cXGQrfFxcZCspP1tcXDBcXHRcXG5cXGZcXHJcXCBdKihcXGQqXFwuXFxkK3xcXGQrKT9bXFwwXFx0XFxuXFxmXFxyXFwgXSooXFxkKlxcLlxcZCt8XFxkKyk/W1xcMFxcdFxcblxcZlxcclxcIF0rKGd8cmd8aykvO1xudmFyIGdldERlZmF1bHRDb2xvciA9IGZ1bmN0aW9uIChmaWVsZCkge1xuICAgIHZhciBfYTtcbiAgICB2YXIgZGEgPSAoX2EgPSBmaWVsZC5nZXREZWZhdWx0QXBwZWFyYW5jZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICB2YXIgZGFNYXRjaCA9IGZpbmRMYXN0TWF0Y2goZGEsIGNvbG9yUmVnZXgpLm1hdGNoO1xuICAgIHZhciBfYiA9IGRhTWF0Y2ggIT09IG51bGwgJiYgZGFNYXRjaCAhPT0gdm9pZCAwID8gZGFNYXRjaCA6IFtdLCBjMSA9IF9iWzFdLCBjMiA9IF9iWzJdLCBjMyA9IF9iWzNdLCBjNCA9IF9iWzRdLCBjb2xvclNwYWNlID0gX2JbNV07XG4gICAgaWYgKGNvbG9yU3BhY2UgPT09ICdnJyAmJiBjMSkge1xuICAgICAgICByZXR1cm4gZ3JheXNjYWxlKE51bWJlcihjMSkpO1xuICAgIH1cbiAgICBpZiAoY29sb3JTcGFjZSA9PT0gJ3JnJyAmJiBjMSAmJiBjMiAmJiBjMykge1xuICAgICAgICByZXR1cm4gcmdiKE51bWJlcihjMSksIE51bWJlcihjMiksIE51bWJlcihjMykpO1xuICAgIH1cbiAgICBpZiAoY29sb3JTcGFjZSA9PT0gJ2snICYmIGMxICYmIGMyICYmIGMzICYmIGM0KSB7XG4gICAgICAgIHJldHVybiBjbXlrKE51bWJlcihjMSksIE51bWJlcihjMiksIE51bWJlcihjMyksIE51bWJlcihjNCkpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbnZhciB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChmaWVsZCwgY29sb3IsIGZvbnQsIGZvbnRTaXplKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChmb250U2l6ZSA9PT0gdm9pZCAwKSB7IGZvbnRTaXplID0gMDsgfVxuICAgIHZhciBkYSA9IFtcbiAgICAgICAgc2V0RmlsbGluZ0NvbG9yKGNvbG9yKS50b1N0cmluZygpLFxuICAgICAgICBzZXRGb250QW5kU2l6ZSgoX2EgPSBmb250ID09PSBudWxsIHx8IGZvbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvbnQubmFtZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJ2R1bW15X19ub29wJywgZm9udFNpemUpLnRvU3RyaW5nKCksXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgICBmaWVsZC5zZXREZWZhdWx0QXBwZWFyYW5jZShkYSk7XG59O1xuZXhwb3J0IHZhciBkZWZhdWx0Q2hlY2tCb3hBcHBlYXJhbmNlUHJvdmlkZXIgPSBmdW5jdGlvbiAoY2hlY2tCb3gsIHdpZGdldCkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIC8vIFRoZSBgL0RBYCBlbnRyeSBjYW4gYmUgYXQgdGhlIHdpZGdldCBvciBmaWVsZCBsZXZlbCAtIHNvIHdlIGhhbmRsZSBib3RoXG4gICAgdmFyIHdpZGdldENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkQ29sb3IgPSBnZXREZWZhdWx0Q29sb3IoY2hlY2tCb3guYWNyb0ZpZWxkKTtcbiAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgIHZhciBhcCA9IHdpZGdldC5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgdmFyIGJzID0gd2lkZ2V0LmdldEJvcmRlclN0eWxlKCk7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gKF9hID0gYnMgPT09IG51bGwgfHwgYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJzLmdldFdpZHRoKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldFJvdGF0aW9uKCkpO1xuICAgIHZhciBfZCA9IGFkanVzdERpbXNGb3JSb3RhdGlvbihyZWN0YW5nbGUsIHJvdGF0aW9uKSwgd2lkdGggPSBfZC53aWR0aCwgaGVpZ2h0ID0gX2QuaGVpZ2h0O1xuICAgIHZhciByb3RhdGUgPSByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiByb3RhdGlvbiB9KSk7XG4gICAgdmFyIGJsYWNrID0gcmdiKDAsIDAsIDApO1xuICAgIHZhciBib3JkZXJDb2xvciA9IChfYiA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCb3JkZXJDb2xvcigpKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogYmxhY2s7XG4gICAgdmFyIG5vcm1hbEJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7XG4gICAgdmFyIGRvd25CYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCksIDAuOCk7XG4gICAgLy8gVXBkYXRlIGNvbG9yXG4gICAgdmFyIHRleHRDb2xvciA9IChfYyA9IHdpZGdldENvbG9yICE9PSBudWxsICYmIHdpZGdldENvbG9yICE9PSB2b2lkIDAgPyB3aWRnZXRDb2xvciA6IGZpZWxkQ29sb3IpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGJsYWNrO1xuICAgIGlmICh3aWRnZXRDb2xvcikge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZSh3aWRnZXQsIHRleHRDb2xvcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZShjaGVja0JveC5hY3JvRmllbGQsIHRleHRDb2xvcik7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICB4OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB5OiAwICsgYm9yZGVyV2lkdGggLyAyLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBib3JkZXJXaWR0aCxcbiAgICAgICAgdGhpY2tuZXNzOiAxLjUsXG4gICAgICAgIGJvcmRlcldpZHRoOiBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yLFxuICAgICAgICBtYXJrQ29sb3I6IHRleHRDb2xvcixcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vcm1hbDoge1xuICAgICAgICAgICAgb246IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd0NoZWNrQm94KF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogbm9ybWFsQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IHRydWUgfSkpKSxcbiAgICAgICAgICAgIG9mZjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3Q2hlY2tCb3goX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogZmFsc2UgfSkpKSxcbiAgICAgICAgfSxcbiAgICAgICAgZG93bjoge1xuICAgICAgICAgICAgb246IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd0NoZWNrQm94KF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogZG93bkJhY2tncm91bmRDb2xvciwgZmlsbGVkOiB0cnVlIH0pKSksXG4gICAgICAgICAgICBvZmY6IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd0NoZWNrQm94KF9fYXNzaWduKF9fYXNzaWduKHt9LCBvcHRpb25zKSwgeyBjb2xvcjogZG93bkJhY2tncm91bmRDb2xvciwgZmlsbGVkOiBmYWxzZSB9KSkpLFxuICAgICAgICB9LFxuICAgIH07XG59O1xuZXhwb3J0IHZhciBkZWZhdWx0UmFkaW9Hcm91cEFwcGVhcmFuY2VQcm92aWRlciA9IGZ1bmN0aW9uIChyYWRpb0dyb3VwLCB3aWRnZXQpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAvLyBUaGUgYC9EQWAgZW50cnkgY2FuIGJlIGF0IHRoZSB3aWRnZXQgb3IgZmllbGQgbGV2ZWwgLSBzbyB3ZSBoYW5kbGUgYm90aFxuICAgIHZhciB3aWRnZXRDb2xvciA9IGdldERlZmF1bHRDb2xvcih3aWRnZXQpO1xuICAgIHZhciBmaWVsZENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKHJhZGlvR3JvdXAuYWNyb0ZpZWxkKTtcbiAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgIHZhciBhcCA9IHdpZGdldC5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgdmFyIGJzID0gd2lkZ2V0LmdldEJvcmRlclN0eWxlKCk7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gKF9hID0gYnMgPT09IG51bGwgfHwgYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJzLmdldFdpZHRoKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldFJvdGF0aW9uKCkpO1xuICAgIHZhciBfZCA9IGFkanVzdERpbXNGb3JSb3RhdGlvbihyZWN0YW5nbGUsIHJvdGF0aW9uKSwgd2lkdGggPSBfZC53aWR0aCwgaGVpZ2h0ID0gX2QuaGVpZ2h0O1xuICAgIHZhciByb3RhdGUgPSByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiByb3RhdGlvbiB9KSk7XG4gICAgdmFyIGJsYWNrID0gcmdiKDAsIDAsIDApO1xuICAgIHZhciBib3JkZXJDb2xvciA9IChfYiA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCb3JkZXJDb2xvcigpKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogYmxhY2s7XG4gICAgdmFyIG5vcm1hbEJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7XG4gICAgdmFyIGRvd25CYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCksIDAuOCk7XG4gICAgLy8gVXBkYXRlIGNvbG9yXG4gICAgdmFyIHRleHRDb2xvciA9IChfYyA9IHdpZGdldENvbG9yICE9PSBudWxsICYmIHdpZGdldENvbG9yICE9PSB2b2lkIDAgPyB3aWRnZXRDb2xvciA6IGZpZWxkQ29sb3IpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGJsYWNrO1xuICAgIGlmICh3aWRnZXRDb2xvcikge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZSh3aWRnZXQsIHRleHRDb2xvcik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZShyYWRpb0dyb3VwLmFjcm9GaWVsZCwgdGV4dENvbG9yKTtcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHg6IHdpZHRoIC8gMixcbiAgICAgICAgeTogaGVpZ2h0IC8gMixcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlcldpZHRoOiBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yLFxuICAgICAgICBkb3RDb2xvcjogdGV4dENvbG9yLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbm9ybWFsOiB7XG4gICAgICAgICAgICBvbjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3UmFkaW9CdXR0b24oX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsIGZpbGxlZDogdHJ1ZSB9KSkpLFxuICAgICAgICAgICAgb2ZmOiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdSYWRpb0J1dHRvbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvciwgZmlsbGVkOiBmYWxzZSB9KSkpLFxuICAgICAgICB9LFxuICAgICAgICBkb3duOiB7XG4gICAgICAgICAgICBvbjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3UmFkaW9CdXR0b24oX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBkb3duQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IHRydWUgfSkpKSxcbiAgICAgICAgICAgIG9mZjogX19zcHJlYWRBcnJheXMocm90YXRlLCBkcmF3UmFkaW9CdXR0b24oX19hc3NpZ24oX19hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbG9yOiBkb3duQmFja2dyb3VuZENvbG9yLCBmaWxsZWQ6IGZhbHNlIH0pKSksXG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIGRlZmF1bHRCdXR0b25BcHBlYXJhbmNlUHJvdmlkZXIgPSBmdW5jdGlvbiAoYnV0dG9uLCB3aWRnZXQsIGZvbnQpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgIC8vIFRoZSBgL0RBYCBlbnRyeSBjYW4gYmUgYXQgdGhlIHdpZGdldCBvciBmaWVsZCBsZXZlbCAtIHNvIHdlIGhhbmRsZSBib3RoXG4gICAgdmFyIHdpZGdldENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkQ29sb3IgPSBnZXREZWZhdWx0Q29sb3IoYnV0dG9uLmFjcm9GaWVsZCk7XG4gICAgdmFyIHdpZGdldEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkRm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUoYnV0dG9uLmFjcm9GaWVsZCk7XG4gICAgdmFyIHJlY3RhbmdsZSA9IHdpZGdldC5nZXRSZWN0YW5nbGUoKTtcbiAgICB2YXIgYXAgPSB3aWRnZXQuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcygpO1xuICAgIHZhciBicyA9IHdpZGdldC5nZXRCb3JkZXJTdHlsZSgpO1xuICAgIHZhciBjYXB0aW9ucyA9IGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRDYXB0aW9ucygpO1xuICAgIHZhciBub3JtYWxUZXh0ID0gKF9hID0gY2FwdGlvbnMgPT09IG51bGwgfHwgY2FwdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhcHRpb25zLm5vcm1hbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgdmFyIGRvd25UZXh0ID0gKF9jID0gKF9iID0gY2FwdGlvbnMgPT09IG51bGwgfHwgY2FwdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNhcHRpb25zLmRvd24pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG5vcm1hbFRleHQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6ICcnO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IChfZCA9IGJzID09PSBudWxsIHx8IGJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBicy5nZXRXaWR0aCgpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwO1xuICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRSb3RhdGlvbigpKTtcbiAgICB2YXIgX2YgPSBhZGp1c3REaW1zRm9yUm90YXRpb24ocmVjdGFuZ2xlLCByb3RhdGlvbiksIHdpZHRoID0gX2Yud2lkdGgsIGhlaWdodCA9IF9mLmhlaWdodDtcbiAgICB2YXIgcm90YXRlID0gcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogcm90YXRpb24gfSkpO1xuICAgIHZhciBibGFjayA9IHJnYigwLCAwLCAwKTtcbiAgICB2YXIgYm9yZGVyQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Qm9yZGVyQ29sb3IoKSk7XG4gICAgdmFyIG5vcm1hbEJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7XG4gICAgdmFyIGRvd25CYWNrZ3JvdW5kQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0QmFja2dyb3VuZENvbG9yKCksIDAuOCk7XG4gICAgdmFyIGJvdW5kcyA9IHtcbiAgICAgICAgeDogYm9yZGVyV2lkdGgsXG4gICAgICAgIHk6IGJvcmRlcldpZHRoLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBib3JkZXJXaWR0aCAqIDIsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gYm9yZGVyV2lkdGggKiAyLFxuICAgIH07XG4gICAgdmFyIG5vcm1hbExheW91dCA9IGxheW91dFNpbmdsZWxpbmVUZXh0KG5vcm1hbFRleHQsIHtcbiAgICAgICAgYWxpZ25tZW50OiBUZXh0QWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgZm9udFNpemU6IHdpZGdldEZvbnRTaXplICE9PSBudWxsICYmIHdpZGdldEZvbnRTaXplICE9PSB2b2lkIDAgPyB3aWRnZXRGb250U2l6ZSA6IGZpZWxkRm9udFNpemUsXG4gICAgICAgIGZvbnQ6IGZvbnQsXG4gICAgICAgIGJvdW5kczogYm91bmRzLFxuICAgIH0pO1xuICAgIHZhciBkb3duTGF5b3V0ID0gbGF5b3V0U2luZ2xlbGluZVRleHQoZG93blRleHQsIHtcbiAgICAgICAgYWxpZ25tZW50OiBUZXh0QWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgZm9udFNpemU6IHdpZGdldEZvbnRTaXplICE9PSBudWxsICYmIHdpZGdldEZvbnRTaXplICE9PSB2b2lkIDAgPyB3aWRnZXRGb250U2l6ZSA6IGZpZWxkRm9udFNpemUsXG4gICAgICAgIGZvbnQ6IGZvbnQsXG4gICAgICAgIGJvdW5kczogYm91bmRzLFxuICAgIH0pO1xuICAgIC8vIFVwZGF0ZSBmb250IHNpemUgYW5kIGNvbG9yXG4gICAgdmFyIGZvbnRTaXplID0gTWF0aC5taW4obm9ybWFsTGF5b3V0LmZvbnRTaXplLCBkb3duTGF5b3V0LmZvbnRTaXplKTtcbiAgICB2YXIgdGV4dENvbG9yID0gKF9lID0gd2lkZ2V0Q29sb3IgIT09IG51bGwgJiYgd2lkZ2V0Q29sb3IgIT09IHZvaWQgMCA/IHdpZGdldENvbG9yIDogZmllbGRDb2xvcikgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogYmxhY2s7XG4gICAgaWYgKHdpZGdldENvbG9yIHx8IHdpZGdldEZvbnRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2Uod2lkZ2V0LCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKGJ1dHRvbi5hY3JvRmllbGQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgeDogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgeTogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlcldpZHRoOiBib3JkZXJXaWR0aCxcbiAgICAgICAgYm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yLFxuICAgICAgICB0ZXh0Q29sb3I6IHRleHRDb2xvcixcbiAgICAgICAgZm9udDogZm9udC5uYW1lLFxuICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBub3JtYWw6IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd0J1dHRvbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvciwgdGV4dExpbmVzOiBbbm9ybWFsTGF5b3V0LmxpbmVdIH0pKSksXG4gICAgICAgIGRvd246IF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd0J1dHRvbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3B0aW9ucyksIHsgY29sb3I6IGRvd25CYWNrZ3JvdW5kQ29sb3IsIHRleHRMaW5lczogW2Rvd25MYXlvdXQubGluZV0gfSkpKSxcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZGVmYXVsdFRleHRGaWVsZEFwcGVhcmFuY2VQcm92aWRlciA9IGZ1bmN0aW9uICh0ZXh0RmllbGQsIHdpZGdldCwgZm9udCkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAvLyBUaGUgYC9EQWAgZW50cnkgY2FuIGJlIGF0IHRoZSB3aWRnZXQgb3IgZmllbGQgbGV2ZWwgLSBzbyB3ZSBoYW5kbGUgYm90aFxuICAgIHZhciB3aWRnZXRDb2xvciA9IGdldERlZmF1bHRDb2xvcih3aWRnZXQpO1xuICAgIHZhciBmaWVsZENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKHRleHRGaWVsZC5hY3JvRmllbGQpO1xuICAgIHZhciB3aWRnZXRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZSh3aWRnZXQpO1xuICAgIHZhciBmaWVsZEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKHRleHRGaWVsZC5hY3JvRmllbGQpO1xuICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICB2YXIgdGV4dCA9IChfYSA9IHRleHRGaWVsZC5nZXRUZXh0KCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IChfYiA9IGJzID09PSBudWxsIHx8IGJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBicy5nZXRXaWR0aCgpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRSb3RhdGlvbigpKTtcbiAgICB2YXIgX2UgPSBhZGp1c3REaW1zRm9yUm90YXRpb24ocmVjdGFuZ2xlLCByb3RhdGlvbiksIHdpZHRoID0gX2Uud2lkdGgsIGhlaWdodCA9IF9lLmhlaWdodDtcbiAgICB2YXIgcm90YXRlID0gcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogcm90YXRpb24gfSkpO1xuICAgIHZhciBibGFjayA9IHJnYigwLCAwLCAwKTtcbiAgICB2YXIgYm9yZGVyQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Qm9yZGVyQ29sb3IoKSk7XG4gICAgdmFyIG5vcm1hbEJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7XG4gICAgdmFyIHRleHRMaW5lcztcbiAgICB2YXIgZm9udFNpemU7XG4gICAgdmFyIHBhZGRpbmcgPSB0ZXh0RmllbGQuaXNDb21iZWQoKSA/IDAgOiAxO1xuICAgIHZhciBib3VuZHMgPSB7XG4gICAgICAgIHg6IGJvcmRlcldpZHRoICsgcGFkZGluZyxcbiAgICAgICAgeTogYm9yZGVyV2lkdGggKyBwYWRkaW5nLFxuICAgICAgICB3aWR0aDogd2lkdGggLSAoYm9yZGVyV2lkdGggKyBwYWRkaW5nKSAqIDIsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gKGJvcmRlcldpZHRoICsgcGFkZGluZykgKiAyLFxuICAgIH07XG4gICAgaWYgKHRleHRGaWVsZC5pc011bHRpbGluZSgpKSB7XG4gICAgICAgIHZhciBsYXlvdXQgPSBsYXlvdXRNdWx0aWxpbmVUZXh0KHRleHQsIHtcbiAgICAgICAgICAgIGFsaWdubWVudDogdGV4dEZpZWxkLmdldEFsaWdubWVudCgpLFxuICAgICAgICAgICAgZm9udFNpemU6IHdpZGdldEZvbnRTaXplICE9PSBudWxsICYmIHdpZGdldEZvbnRTaXplICE9PSB2b2lkIDAgPyB3aWRnZXRGb250U2l6ZSA6IGZpZWxkRm9udFNpemUsXG4gICAgICAgICAgICBmb250OiBmb250LFxuICAgICAgICAgICAgYm91bmRzOiBib3VuZHMsXG4gICAgICAgIH0pO1xuICAgICAgICB0ZXh0TGluZXMgPSBsYXlvdXQubGluZXM7XG4gICAgICAgIGZvbnRTaXplID0gbGF5b3V0LmZvbnRTaXplO1xuICAgIH1cbiAgICBlbHNlIGlmICh0ZXh0RmllbGQuaXNDb21iZWQoKSkge1xuICAgICAgICB2YXIgbGF5b3V0ID0gbGF5b3V0Q29tYmVkVGV4dCh0ZXh0LCB7XG4gICAgICAgICAgICBmb250U2l6ZTogd2lkZ2V0Rm9udFNpemUgIT09IG51bGwgJiYgd2lkZ2V0Rm9udFNpemUgIT09IHZvaWQgMCA/IHdpZGdldEZvbnRTaXplIDogZmllbGRGb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnQ6IGZvbnQsXG4gICAgICAgICAgICBib3VuZHM6IGJvdW5kcyxcbiAgICAgICAgICAgIGNlbGxDb3VudDogKF9jID0gdGV4dEZpZWxkLmdldE1heExlbmd0aCgpKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdGV4dExpbmVzID0gbGF5b3V0LmNlbGxzO1xuICAgICAgICBmb250U2l6ZSA9IGxheW91dC5mb250U2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBsYXlvdXQgPSBsYXlvdXRTaW5nbGVsaW5lVGV4dCh0ZXh0LCB7XG4gICAgICAgICAgICBhbGlnbm1lbnQ6IHRleHRGaWVsZC5nZXRBbGlnbm1lbnQoKSxcbiAgICAgICAgICAgIGZvbnRTaXplOiB3aWRnZXRGb250U2l6ZSAhPT0gbnVsbCAmJiB3aWRnZXRGb250U2l6ZSAhPT0gdm9pZCAwID8gd2lkZ2V0Rm9udFNpemUgOiBmaWVsZEZvbnRTaXplLFxuICAgICAgICAgICAgZm9udDogZm9udCxcbiAgICAgICAgICAgIGJvdW5kczogYm91bmRzLFxuICAgICAgICB9KTtcbiAgICAgICAgdGV4dExpbmVzID0gW2xheW91dC5saW5lXTtcbiAgICAgICAgZm9udFNpemUgPSBsYXlvdXQuZm9udFNpemU7XG4gICAgfVxuICAgIC8vIFVwZGF0ZSBmb250IHNpemUgYW5kIGNvbG9yXG4gICAgdmFyIHRleHRDb2xvciA9IChfZCA9IHdpZGdldENvbG9yICE9PSBudWxsICYmIHdpZGdldENvbG9yICE9PSB2b2lkIDAgPyB3aWRnZXRDb2xvciA6IGZpZWxkQ29sb3IpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGJsYWNrO1xuICAgIGlmICh3aWRnZXRDb2xvciB8fCB3aWRnZXRGb250U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHdpZGdldCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZSh0ZXh0RmllbGQuYWNyb0ZpZWxkLCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHg6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHk6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGggIT09IG51bGwgJiYgYm9yZGVyV2lkdGggIT09IHZvaWQgMCA/IGJvcmRlcldpZHRoIDogMCxcbiAgICAgICAgYm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yLFxuICAgICAgICB0ZXh0Q29sb3I6IHRleHRDb2xvcixcbiAgICAgICAgZm9udDogZm9udC5uYW1lLFxuICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgIGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIHRleHRMaW5lczogdGV4dExpbmVzLFxuICAgICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIH07XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd1RleHRGaWVsZChvcHRpb25zKSk7XG59O1xuZXhwb3J0IHZhciBkZWZhdWx0RHJvcGRvd25BcHBlYXJhbmNlUHJvdmlkZXIgPSBmdW5jdGlvbiAoZHJvcGRvd24sIHdpZGdldCwgZm9udCkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIC8vIFRoZSBgL0RBYCBlbnRyeSBjYW4gYmUgYXQgdGhlIHdpZGdldCBvciBmaWVsZCBsZXZlbCAtIHNvIHdlIGhhbmRsZSBib3RoXG4gICAgdmFyIHdpZGdldENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkQ29sb3IgPSBnZXREZWZhdWx0Q29sb3IoZHJvcGRvd24uYWNyb0ZpZWxkKTtcbiAgICB2YXIgd2lkZ2V0Rm9udFNpemUgPSBnZXREZWZhdWx0Rm9udFNpemUod2lkZ2V0KTtcbiAgICB2YXIgZmllbGRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZShkcm9wZG93bi5hY3JvRmllbGQpO1xuICAgIHZhciByZWN0YW5nbGUgPSB3aWRnZXQuZ2V0UmVjdGFuZ2xlKCk7XG4gICAgdmFyIGFwID0gd2lkZ2V0LmdldEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICB2YXIgYnMgPSB3aWRnZXQuZ2V0Qm9yZGVyU3R5bGUoKTtcbiAgICB2YXIgdGV4dCA9IChfYSA9IGRyb3Bkb3duLmdldFNlbGVjdGVkKClbMF0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnO1xuICAgIHZhciBib3JkZXJXaWR0aCA9IChfYiA9IGJzID09PSBudWxsIHx8IGJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBicy5nZXRXaWR0aCgpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRSb3RhdGlvbigpKTtcbiAgICB2YXIgX2QgPSBhZGp1c3REaW1zRm9yUm90YXRpb24ocmVjdGFuZ2xlLCByb3RhdGlvbiksIHdpZHRoID0gX2Qud2lkdGgsIGhlaWdodCA9IF9kLmhlaWdodDtcbiAgICB2YXIgcm90YXRlID0gcm90YXRlSW5QbGFjZShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmVjdGFuZ2xlKSwgeyByb3RhdGlvbjogcm90YXRpb24gfSkpO1xuICAgIHZhciBibGFjayA9IHJnYigwLCAwLCAwKTtcbiAgICB2YXIgYm9yZGVyQ29sb3IgPSBjb21wb25lbnRzVG9Db2xvcihhcCA9PT0gbnVsbCB8fCBhcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXAuZ2V0Qm9yZGVyQ29sb3IoKSk7XG4gICAgdmFyIG5vcm1hbEJhY2tncm91bmRDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7XG4gICAgdmFyIHBhZGRpbmcgPSAxO1xuICAgIHZhciBib3VuZHMgPSB7XG4gICAgICAgIHg6IGJvcmRlcldpZHRoICsgcGFkZGluZyxcbiAgICAgICAgeTogYm9yZGVyV2lkdGggKyBwYWRkaW5nLFxuICAgICAgICB3aWR0aDogd2lkdGggLSAoYm9yZGVyV2lkdGggKyBwYWRkaW5nKSAqIDIsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gKGJvcmRlcldpZHRoICsgcGFkZGluZykgKiAyLFxuICAgIH07XG4gICAgdmFyIF9lID0gbGF5b3V0U2luZ2xlbGluZVRleHQodGV4dCwge1xuICAgICAgICBhbGlnbm1lbnQ6IFRleHRBbGlnbm1lbnQuTGVmdCxcbiAgICAgICAgZm9udFNpemU6IHdpZGdldEZvbnRTaXplICE9PSBudWxsICYmIHdpZGdldEZvbnRTaXplICE9PSB2b2lkIDAgPyB3aWRnZXRGb250U2l6ZSA6IGZpZWxkRm9udFNpemUsXG4gICAgICAgIGZvbnQ6IGZvbnQsXG4gICAgICAgIGJvdW5kczogYm91bmRzLFxuICAgIH0pLCBsaW5lID0gX2UubGluZSwgZm9udFNpemUgPSBfZS5mb250U2l6ZTtcbiAgICAvLyBVcGRhdGUgZm9udCBzaXplIGFuZCBjb2xvclxuICAgIHZhciB0ZXh0Q29sb3IgPSAoX2MgPSB3aWRnZXRDb2xvciAhPT0gbnVsbCAmJiB3aWRnZXRDb2xvciAhPT0gdm9pZCAwID8gd2lkZ2V0Q29sb3IgOiBmaWVsZENvbG9yKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBibGFjaztcbiAgICBpZiAod2lkZ2V0Q29sb3IgfHwgd2lkZ2V0Rm9udFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZSh3aWRnZXQsIHRleHRDb2xvciwgZm9udCwgZm9udFNpemUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXBkYXRlRGVmYXVsdEFwcGVhcmFuY2UoZHJvcGRvd24uYWNyb0ZpZWxkLCB0ZXh0Q29sb3IsIGZvbnQsIGZvbnRTaXplKTtcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHg6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHk6IDAgKyBib3JkZXJXaWR0aCAvIDIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGJvcmRlcldpZHRoLFxuICAgICAgICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGggIT09IG51bGwgJiYgYm9yZGVyV2lkdGggIT09IHZvaWQgMCA/IGJvcmRlcldpZHRoIDogMCxcbiAgICAgICAgYm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yLFxuICAgICAgICB0ZXh0Q29sb3I6IHRleHRDb2xvcixcbiAgICAgICAgZm9udDogZm9udC5uYW1lLFxuICAgICAgICBmb250U2l6ZTogZm9udFNpemUsXG4gICAgICAgIGNvbG9yOiBub3JtYWxCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIHRleHRMaW5lczogW2xpbmVdLFxuICAgICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIH07XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKHJvdGF0ZSwgZHJhd1RleHRGaWVsZChvcHRpb25zKSk7XG59O1xuZXhwb3J0IHZhciBkZWZhdWx0T3B0aW9uTGlzdEFwcGVhcmFuY2VQcm92aWRlciA9IGZ1bmN0aW9uIChvcHRpb25MaXN0LCB3aWRnZXQsIGZvbnQpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIC8vIFRoZSBgL0RBYCBlbnRyeSBjYW4gYmUgYXQgdGhlIHdpZGdldCBvciBmaWVsZCBsZXZlbCAtIHNvIHdlIGhhbmRsZSBib3RoXG4gICAgdmFyIHdpZGdldENvbG9yID0gZ2V0RGVmYXVsdENvbG9yKHdpZGdldCk7XG4gICAgdmFyIGZpZWxkQ29sb3IgPSBnZXREZWZhdWx0Q29sb3Iob3B0aW9uTGlzdC5hY3JvRmllbGQpO1xuICAgIHZhciB3aWRnZXRGb250U2l6ZSA9IGdldERlZmF1bHRGb250U2l6ZSh3aWRnZXQpO1xuICAgIHZhciBmaWVsZEZvbnRTaXplID0gZ2V0RGVmYXVsdEZvbnRTaXplKG9wdGlvbkxpc3QuYWNyb0ZpZWxkKTtcbiAgICB2YXIgcmVjdGFuZ2xlID0gd2lkZ2V0LmdldFJlY3RhbmdsZSgpO1xuICAgIHZhciBhcCA9IHdpZGdldC5nZXRBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgdmFyIGJzID0gd2lkZ2V0LmdldEJvcmRlclN0eWxlKCk7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gKF9hID0gYnMgPT09IG51bGwgfHwgYnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJzLmdldFdpZHRoKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgdmFyIHJvdGF0aW9uID0gcmVkdWNlUm90YXRpb24oYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldFJvdGF0aW9uKCkpO1xuICAgIHZhciBfYyA9IGFkanVzdERpbXNGb3JSb3RhdGlvbihyZWN0YW5nbGUsIHJvdGF0aW9uKSwgd2lkdGggPSBfYy53aWR0aCwgaGVpZ2h0ID0gX2MuaGVpZ2h0O1xuICAgIHZhciByb3RhdGUgPSByb3RhdGVJblBsYWNlKF9fYXNzaWduKF9fYXNzaWduKHt9LCByZWN0YW5nbGUpLCB7IHJvdGF0aW9uOiByb3RhdGlvbiB9KSk7XG4gICAgdmFyIGJsYWNrID0gcmdiKDAsIDAsIDApO1xuICAgIHZhciBib3JkZXJDb2xvciA9IGNvbXBvbmVudHNUb0NvbG9yKGFwID09PSBudWxsIHx8IGFwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhcC5nZXRCb3JkZXJDb2xvcigpKTtcbiAgICB2YXIgbm9ybWFsQmFja2dyb3VuZENvbG9yID0gY29tcG9uZW50c1RvQ29sb3IoYXAgPT09IG51bGwgfHwgYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFwLmdldEJhY2tncm91bmRDb2xvcigpKTtcbiAgICB2YXIgb3B0aW9ucyA9IG9wdGlvbkxpc3QuZ2V0T3B0aW9ucygpO1xuICAgIHZhciBzZWxlY3RlZCA9IG9wdGlvbkxpc3QuZ2V0U2VsZWN0ZWQoKTtcbiAgICBpZiAob3B0aW9uTGlzdC5pc1NvcnRlZCgpKVxuICAgICAgICBvcHRpb25zLnNvcnQoKTtcbiAgICB2YXIgdGV4dCA9ICcnO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG9wdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHRleHQgKz0gb3B0aW9uc1tpZHhdO1xuICAgICAgICBpZiAoaWR4IDwgbGVuIC0gMSlcbiAgICAgICAgICAgIHRleHQgKz0gJ1xcbic7XG4gICAgfVxuICAgIHZhciBwYWRkaW5nID0gMTtcbiAgICB2YXIgYm91bmRzID0ge1xuICAgICAgICB4OiBib3JkZXJXaWR0aCArIHBhZGRpbmcsXG4gICAgICAgIHk6IGJvcmRlcldpZHRoICsgcGFkZGluZyxcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gKGJvcmRlcldpZHRoICsgcGFkZGluZykgKiAyLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIChib3JkZXJXaWR0aCArIHBhZGRpbmcpICogMixcbiAgICB9O1xuICAgIHZhciBfZCA9IGxheW91dE11bHRpbGluZVRleHQodGV4dCwge1xuICAgICAgICBhbGlnbm1lbnQ6IFRleHRBbGlnbm1lbnQuTGVmdCxcbiAgICAgICAgZm9udFNpemU6IHdpZGdldEZvbnRTaXplICE9PSBudWxsICYmIHdpZGdldEZvbnRTaXplICE9PSB2b2lkIDAgPyB3aWRnZXRGb250U2l6ZSA6IGZpZWxkRm9udFNpemUsXG4gICAgICAgIGZvbnQ6IGZvbnQsXG4gICAgICAgIGJvdW5kczogYm91bmRzLFxuICAgIH0pLCBsaW5lcyA9IF9kLmxpbmVzLCBmb250U2l6ZSA9IF9kLmZvbnRTaXplLCBsaW5lSGVpZ2h0ID0gX2QubGluZUhlaWdodDtcbiAgICB2YXIgc2VsZWN0ZWRMaW5lcyA9IFtdO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgbGluZSA9IGxpbmVzW2lkeF07XG4gICAgICAgIGlmIChzZWxlY3RlZC5pbmNsdWRlcyhsaW5lLnRleHQpKVxuICAgICAgICAgICAgc2VsZWN0ZWRMaW5lcy5wdXNoKGlkeCk7XG4gICAgfVxuICAgIHZhciBibHVlID0gcmdiKDE1MyAvIDI1NSwgMTkzIC8gMjU1LCAyMTggLyAyNTUpO1xuICAgIC8vIFVwZGF0ZSBmb250IHNpemUgYW5kIGNvbG9yXG4gICAgdmFyIHRleHRDb2xvciA9IChfYiA9IHdpZGdldENvbG9yICE9PSBudWxsICYmIHdpZGdldENvbG9yICE9PSB2b2lkIDAgPyB3aWRnZXRDb2xvciA6IGZpZWxkQ29sb3IpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGJsYWNrO1xuICAgIGlmICh3aWRnZXRDb2xvciB8fCB3aWRnZXRGb250U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZURlZmF1bHRBcHBlYXJhbmNlKHdpZGdldCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1cGRhdGVEZWZhdWx0QXBwZWFyYW5jZShvcHRpb25MaXN0LmFjcm9GaWVsZCwgdGV4dENvbG9yLCBmb250LCBmb250U2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhyb3RhdGUsIGRyYXdPcHRpb25MaXN0KHtcbiAgICAgICAgeDogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgeTogMCArIGJvcmRlcldpZHRoIC8gMixcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gYm9yZGVyV2lkdGgsXG4gICAgICAgIGJvcmRlcldpZHRoOiBib3JkZXJXaWR0aCAhPT0gbnVsbCAmJiBib3JkZXJXaWR0aCAhPT0gdm9pZCAwID8gYm9yZGVyV2lkdGggOiAwLFxuICAgICAgICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gICAgICAgIHRleHRDb2xvcjogdGV4dENvbG9yLFxuICAgICAgICBmb250OiBmb250Lm5hbWUsXG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgY29sb3I6IG5vcm1hbEJhY2tncm91bmRDb2xvcixcbiAgICAgICAgdGV4dExpbmVzOiBsaW5lcyxcbiAgICAgICAgbGluZUhlaWdodDogbGluZUhlaWdodCxcbiAgICAgICAgc2VsZWN0ZWRDb2xvcjogYmx1ZSxcbiAgICAgICAgc2VsZWN0ZWRMaW5lczogc2VsZWN0ZWRMaW5lcyxcbiAgICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICB9KSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXBwZWFyYW5jZXMuanMubWFwIiwiZXhwb3J0ICogZnJvbSBcIi4vYXBwZWFyYW5jZXNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQnV0dG9uIH0gZnJvbSBcIi4vUERGQnV0dG9uXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkNoZWNrQm94IH0gZnJvbSBcIi4vUERGQ2hlY2tCb3hcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRHJvcGRvd24gfSBmcm9tIFwiLi9QREZEcm9wZG93blwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZGaWVsZCB9IGZyb20gXCIuL1BERkZpZWxkXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkZvcm0gfSBmcm9tIFwiLi9QREZGb3JtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9wdGlvbkxpc3QgfSBmcm9tIFwiLi9QREZPcHRpb25MaXN0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlJhZGlvR3JvdXAgfSBmcm9tIFwiLi9QREZSYWRpb0dyb3VwXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlNpZ25hdHVyZSB9IGZyb20gXCIuL1BERlNpZ25hdHVyZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZUZXh0RmllbGQgfSBmcm9tIFwiLi9QREZUZXh0RmllbGRcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCB2YXIgSW1hZ2VBbGlnbm1lbnQ7XG4oZnVuY3Rpb24gKEltYWdlQWxpZ25tZW50KSB7XG4gICAgSW1hZ2VBbGlnbm1lbnRbSW1hZ2VBbGlnbm1lbnRbXCJMZWZ0XCJdID0gMF0gPSBcIkxlZnRcIjtcbiAgICBJbWFnZUFsaWdubWVudFtJbWFnZUFsaWdubWVudFtcIkNlbnRlclwiXSA9IDFdID0gXCJDZW50ZXJcIjtcbiAgICBJbWFnZUFsaWdubWVudFtJbWFnZUFsaWdubWVudFtcIlJpZ2h0XCJdID0gMl0gPSBcIlJpZ2h0XCI7XG59KShJbWFnZUFsaWdubWVudCB8fCAoSW1hZ2VBbGlnbm1lbnQgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWxpZ25tZW50LmpzLm1hcCIsImV4cG9ydCAqIGZyb20gXCIuL2FsaWdubWVudFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0ICogZnJvbSBcIi4vZm9ybVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29sb3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ltYWdlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vYmplY3RzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vcGVyYXRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vcGVyYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JvdGF0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2l6ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1BERlBhZ2VPcHRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9QREZEb2N1bWVudE9wdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1N0YW5kYXJkRm9udHNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRG9jdW1lbnQgfSBmcm9tIFwiLi9QREZEb2N1bWVudFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZGb250IH0gZnJvbSBcIi4vUERGRm9udFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZJbWFnZSB9IGZyb20gXCIuL1BERkltYWdlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlBhZ2UgfSBmcm9tIFwiLi9QREZQYWdlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkVtYmVkZGVkUGFnZSB9IGZyb20gXCIuL1BERkVtYmVkZGVkUGFnZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZKYXZhU2NyaXB0IH0gZnJvbSBcIi4vUERGSmF2YVNjcmlwdFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgUERGTmFtZSwgUERGTnVtYmVyIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmV4cG9ydCB2YXIgYXNQREZOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZSBpbnN0YW5jZW9mIFBERk5hbWUgPyBuYW1lIDogUERGTmFtZS5vZihuYW1lKTtcbn07XG5leHBvcnQgdmFyIGFzUERGTnVtYmVyID0gZnVuY3Rpb24gKG51bSkge1xuICAgIHJldHVybiBudW0gaW5zdGFuY2VvZiBQREZOdW1iZXIgPyBudW0gOiBQREZOdW1iZXIub2YobnVtKTtcbn07XG5leHBvcnQgdmFyIGFzTnVtYmVyID0gZnVuY3Rpb24gKG51bSkge1xuICAgIHJldHVybiBudW0gaW5zdGFuY2VvZiBQREZOdW1iZXIgPyBudW0uYXNOdW1iZXIoKSA6IG51bTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vYmplY3RzLmpzLm1hcCIsImltcG9ydCB7IF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBzZXRGaWxsaW5nQ29sb3IsIHNldFN0cm9raW5nQ29sb3IgfSBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7IGJlZ2luVGV4dCwgY2xvc2VQYXRoLCBkcmF3T2JqZWN0LCBlbmRUZXh0LCBmaWxsLCBmaWxsQW5kU3Ryb2tlLCBsaW5lVG8sIG1vdmVUbywgbmV4dExpbmUsIHBvcEdyYXBoaWNzU3RhdGUsIHB1c2hHcmFwaGljc1N0YXRlLCByb3RhdGVBbmRTa2V3VGV4dFJhZGlhbnNBbmRUcmFuc2xhdGUsIHJvdGF0ZVJhZGlhbnMsIHNjYWxlLCBzZXRGb250QW5kU2l6ZSwgc2V0TGluZUhlaWdodCwgc2V0TGluZVdpZHRoLCBzaG93VGV4dCwgc2tld1JhZGlhbnMsIHN0cm9rZSwgdHJhbnNsYXRlLCBzZXRMaW5lQ2FwLCByb3RhdGVEZWdyZWVzLCBzZXRHcmFwaGljc1N0YXRlLCBzZXREYXNoUGF0dGVybiwgYmVnaW5NYXJrZWRDb250ZW50LCBlbmRNYXJrZWRDb250ZW50LCBjbGlwLCBlbmRQYXRoLCBhcHBlbmRCZXppZXJDdXJ2ZSwgfSBmcm9tIFwiLi9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IGRlZ3JlZXMsIHRvUmFkaWFucyB9IGZyb20gXCIuL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgc3ZnUGF0aFRvT3BlcmF0b3JzIH0gZnJvbSBcIi4vc3ZnUGF0aFwiO1xuaW1wb3J0IHsgYXNOdW1iZXIgfSBmcm9tIFwiLi9vYmplY3RzXCI7XG5leHBvcnQgdmFyIGRyYXdUZXh0ID0gZnVuY3Rpb24gKGxpbmUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICBiZWdpblRleHQoKSxcbiAgICAgICAgc2V0RmlsbGluZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBzZXRGb250QW5kU2l6ZShvcHRpb25zLmZvbnQsIG9wdGlvbnMuc2l6ZSksXG4gICAgICAgIHJvdGF0ZUFuZFNrZXdUZXh0UmFkaWFuc0FuZFRyYW5zbGF0ZSh0b1JhZGlhbnMob3B0aW9ucy5yb3RhdGUpLCB0b1JhZGlhbnMob3B0aW9ucy54U2tldyksIHRvUmFkaWFucyhvcHRpb25zLnlTa2V3KSwgb3B0aW9ucy54LCBvcHRpb25zLnkpLFxuICAgICAgICBzaG93VGV4dChsaW5lKSxcbiAgICAgICAgZW5kVGV4dCgpLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XG59O1xuZXhwb3J0IHZhciBkcmF3TGluZXNPZlRleHQgPSBmdW5jdGlvbiAobGluZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3BlcmF0b3JzID0gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICBiZWdpblRleHQoKSxcbiAgICAgICAgc2V0RmlsbGluZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBzZXRGb250QW5kU2l6ZShvcHRpb25zLmZvbnQsIG9wdGlvbnMuc2l6ZSksXG4gICAgICAgIHNldExpbmVIZWlnaHQob3B0aW9ucy5saW5lSGVpZ2h0KSxcbiAgICAgICAgcm90YXRlQW5kU2tld1RleHRSYWRpYW5zQW5kVHJhbnNsYXRlKHRvUmFkaWFucyhvcHRpb25zLnJvdGF0ZSksIHRvUmFkaWFucyhvcHRpb25zLnhTa2V3KSwgdG9SYWRpYW5zKG9wdGlvbnMueVNrZXcpLCBvcHRpb25zLngsIG9wdGlvbnMueSksXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIG9wZXJhdG9ycy5wdXNoKHNob3dUZXh0KGxpbmVzW2lkeF0pLCBuZXh0TGluZSgpKTtcbiAgICB9XG4gICAgb3BlcmF0b3JzLnB1c2goZW5kVGV4dCgpLCBwb3BHcmFwaGljc1N0YXRlKCkpO1xuICAgIHJldHVybiBvcGVyYXRvcnM7XG59O1xuZXhwb3J0IHZhciBkcmF3SW1hZ2UgPSBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIHRyYW5zbGF0ZShvcHRpb25zLngsIG9wdGlvbnMueSksXG4gICAgICAgIHJvdGF0ZVJhZGlhbnModG9SYWRpYW5zKG9wdGlvbnMucm90YXRlKSksXG4gICAgICAgIHNjYWxlKG9wdGlvbnMud2lkdGgsIG9wdGlvbnMuaGVpZ2h0KSxcbiAgICAgICAgc2tld1JhZGlhbnModG9SYWRpYW5zKG9wdGlvbnMueFNrZXcpLCB0b1JhZGlhbnMob3B0aW9ucy55U2tldykpLFxuICAgICAgICBkcmF3T2JqZWN0KG5hbWUpLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XG59O1xuZXhwb3J0IHZhciBkcmF3UGFnZSA9IGZ1bmN0aW9uIChuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgdHJhbnNsYXRlKG9wdGlvbnMueCwgb3B0aW9ucy55KSxcbiAgICAgICAgcm90YXRlUmFkaWFucyh0b1JhZGlhbnMob3B0aW9ucy5yb3RhdGUpKSxcbiAgICAgICAgc2NhbGUob3B0aW9ucy54U2NhbGUsIG9wdGlvbnMueVNjYWxlKSxcbiAgICAgICAgc2tld1JhZGlhbnModG9SYWRpYW5zKG9wdGlvbnMueFNrZXcpLCB0b1JhZGlhbnMob3B0aW9ucy55U2tldykpLFxuICAgICAgICBkcmF3T2JqZWN0KG5hbWUpLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XG59O1xuZXhwb3J0IHZhciBkcmF3TGluZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpLFxuICAgICAgICBvcHRpb25zLmdyYXBoaWNzU3RhdGUgJiYgc2V0R3JhcGhpY3NTdGF0ZShvcHRpb25zLmdyYXBoaWNzU3RhdGUpLFxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIHNldFN0cm9raW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIHNldExpbmVXaWR0aChvcHRpb25zLnRoaWNrbmVzcyksXG4gICAgICAgIHNldERhc2hQYXR0ZXJuKChfYSA9IG9wdGlvbnMuZGFzaEFycmF5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXSwgKF9iID0gb3B0aW9ucy5kYXNoUGhhc2UpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDApLFxuICAgICAgICBtb3ZlVG8ob3B0aW9ucy5zdGFydC54LCBvcHRpb25zLnN0YXJ0LnkpLFxuICAgICAgICBvcHRpb25zLmxpbmVDYXAgJiYgc2V0TGluZUNhcChvcHRpb25zLmxpbmVDYXApLFxuICAgICAgICBtb3ZlVG8ob3B0aW9ucy5zdGFydC54LCBvcHRpb25zLnN0YXJ0LnkpLFxuICAgICAgICBsaW5lVG8ob3B0aW9ucy5lbmQueCwgb3B0aW9ucy5lbmQueSksXG4gICAgICAgIHN0cm9rZSgpLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XG59O1xuZXhwb3J0IHZhciBkcmF3UmVjdGFuZ2xlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSAmJiBzZXRHcmFwaGljc1N0YXRlKG9wdGlvbnMuZ3JhcGhpY3NTdGF0ZSksXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgc2V0RmlsbGluZ0NvbG9yKG9wdGlvbnMuY29sb3IpLFxuICAgICAgICBvcHRpb25zLmJvcmRlckNvbG9yICYmIHNldFN0cm9raW5nQ29sb3Iob3B0aW9ucy5ib3JkZXJDb2xvciksXG4gICAgICAgIHNldExpbmVXaWR0aChvcHRpb25zLmJvcmRlcldpZHRoKSxcbiAgICAgICAgb3B0aW9ucy5ib3JkZXJMaW5lQ2FwICYmIHNldExpbmVDYXAob3B0aW9ucy5ib3JkZXJMaW5lQ2FwKSxcbiAgICAgICAgc2V0RGFzaFBhdHRlcm4oKF9hID0gb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdLCAoX2IgPSBvcHRpb25zLmJvcmRlckRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCksXG4gICAgICAgIHRyYW5zbGF0ZShvcHRpb25zLngsIG9wdGlvbnMueSksXG4gICAgICAgIHJvdGF0ZVJhZGlhbnModG9SYWRpYW5zKG9wdGlvbnMucm90YXRlKSksXG4gICAgICAgIHNrZXdSYWRpYW5zKHRvUmFkaWFucyhvcHRpb25zLnhTa2V3KSwgdG9SYWRpYW5zKG9wdGlvbnMueVNrZXcpKSxcbiAgICAgICAgbW92ZVRvKDAsIDApLFxuICAgICAgICBsaW5lVG8oMCwgb3B0aW9ucy5oZWlnaHQpLFxuICAgICAgICBsaW5lVG8ob3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQpLFxuICAgICAgICBsaW5lVG8ob3B0aW9ucy53aWR0aCwgMCksXG4gICAgICAgIGNsb3NlUGF0aCgpLFxuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBvcHRpb25zLmJvcmRlcldpZHRoID8gZmlsbEFuZFN0cm9rZSgpXG4gICAgICAgICAgICA6IG9wdGlvbnMuY29sb3IgPyBmaWxsKClcbiAgICAgICAgICAgICAgICA6IG9wdGlvbnMuYm9yZGVyQ29sb3IgPyBzdHJva2UoKVxuICAgICAgICAgICAgICAgICAgICA6IGNsb3NlUGF0aCgpLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XG59O1xudmFyIEtBUFBBID0gNC4wICogKChNYXRoLnNxcnQoMikgLSAxLjApIC8gMy4wKTtcbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IHZhciBkcmF3RWxsaXBzZVBhdGggPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgdmFyIHggPSBhc051bWJlcihjb25maWcueCk7XG4gICAgdmFyIHkgPSBhc051bWJlcihjb25maWcueSk7XG4gICAgdmFyIHhTY2FsZSA9IGFzTnVtYmVyKGNvbmZpZy54U2NhbGUpO1xuICAgIHZhciB5U2NhbGUgPSBhc051bWJlcihjb25maWcueVNjYWxlKTtcbiAgICB4IC09IHhTY2FsZTtcbiAgICB5IC09IHlTY2FsZTtcbiAgICB2YXIgb3ggPSB4U2NhbGUgKiBLQVBQQTtcbiAgICB2YXIgb3kgPSB5U2NhbGUgKiBLQVBQQTtcbiAgICB2YXIgeGUgPSB4ICsgeFNjYWxlICogMjtcbiAgICB2YXIgeWUgPSB5ICsgeVNjYWxlICogMjtcbiAgICB2YXIgeG0gPSB4ICsgeFNjYWxlO1xuICAgIHZhciB5bSA9IHkgKyB5U2NhbGU7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgbW92ZVRvKHgsIHltKSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeCwgeW0gLSBveSwgeG0gLSBveCwgeSwgeG0sIHkpLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4bSArIG94LCB5LCB4ZSwgeW0gLSBveSwgeGUsIHltKSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeGUsIHltICsgb3ksIHhtICsgb3gsIHllLCB4bSwgeWUpLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4bSAtIG94LCB5ZSwgeCwgeW0gKyBveSwgeCwgeW0pLFxuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgXTtcbn07XG52YXIgZHJhd0VsbGlwc2VDdXJ2ZXMgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgdmFyIGNlbnRlclggPSBhc051bWJlcihjb25maWcueCk7XG4gICAgdmFyIGNlbnRlclkgPSBhc051bWJlcihjb25maWcueSk7XG4gICAgdmFyIHhTY2FsZSA9IGFzTnVtYmVyKGNvbmZpZy54U2NhbGUpO1xuICAgIHZhciB5U2NhbGUgPSBhc051bWJlcihjb25maWcueVNjYWxlKTtcbiAgICB2YXIgeCA9IC14U2NhbGU7XG4gICAgdmFyIHkgPSAteVNjYWxlO1xuICAgIHZhciBveCA9IHhTY2FsZSAqIEtBUFBBO1xuICAgIHZhciBveSA9IHlTY2FsZSAqIEtBUFBBO1xuICAgIHZhciB4ZSA9IHggKyB4U2NhbGUgKiAyO1xuICAgIHZhciB5ZSA9IHkgKyB5U2NhbGUgKiAyO1xuICAgIHZhciB4bSA9IHggKyB4U2NhbGU7XG4gICAgdmFyIHltID0geSArIHlTY2FsZTtcbiAgICByZXR1cm4gW1xuICAgICAgICB0cmFuc2xhdGUoY2VudGVyWCwgY2VudGVyWSksXG4gICAgICAgIHJvdGF0ZVJhZGlhbnModG9SYWRpYW5zKGNvbmZpZy5yb3RhdGUpKSxcbiAgICAgICAgbW92ZVRvKHgsIHltKSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeCwgeW0gLSBveSwgeG0gLSBveCwgeSwgeG0sIHkpLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4bSArIG94LCB5LCB4ZSwgeW0gLSBveSwgeGUsIHltKSxcbiAgICAgICAgYXBwZW5kQmV6aWVyQ3VydmUoeGUsIHltICsgb3ksIHhtICsgb3gsIHllLCB4bSwgeWUpLFxuICAgICAgICBhcHBlbmRCZXppZXJDdXJ2ZSh4bSAtIG94LCB5ZSwgeCwgeW0gKyBveSwgeCwgeW0pLFxuICAgIF07XG59O1xuZXhwb3J0IHZhciBkcmF3RWxsaXBzZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgb3B0aW9ucy5jb2xvciAmJiBzZXRGaWxsaW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIG9wdGlvbnMuYm9yZGVyQ29sb3IgJiYgc2V0U3Ryb2tpbmdDb2xvcihvcHRpb25zLmJvcmRlckNvbG9yKSxcbiAgICAgICAgc2V0TGluZVdpZHRoKG9wdGlvbnMuYm9yZGVyV2lkdGgpLFxuICAgICAgICBvcHRpb25zLmJvcmRlckxpbmVDYXAgJiYgc2V0TGluZUNhcChvcHRpb25zLmJvcmRlckxpbmVDYXApLFxuICAgICAgICBzZXREYXNoUGF0dGVybigoX2EgPSBvcHRpb25zLmJvcmRlckRhc2hBcnJheSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10sIChfYiA9IG9wdGlvbnMuYm9yZGVyRGFzaFBoYXNlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwKVxuICAgIF0sIChvcHRpb25zLnJvdGF0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gZHJhd0VsbGlwc2VQYXRoKHtcbiAgICAgICAgICAgIHg6IG9wdGlvbnMueCxcbiAgICAgICAgICAgIHk6IG9wdGlvbnMueSxcbiAgICAgICAgICAgIHhTY2FsZTogb3B0aW9ucy54U2NhbGUsXG4gICAgICAgICAgICB5U2NhbGU6IG9wdGlvbnMueVNjYWxlLFxuICAgICAgICB9KVxuICAgICAgICA6IGRyYXdFbGxpcHNlQ3VydmVzKHtcbiAgICAgICAgICAgIHg6IG9wdGlvbnMueCxcbiAgICAgICAgICAgIHk6IG9wdGlvbnMueSxcbiAgICAgICAgICAgIHhTY2FsZTogb3B0aW9ucy54U2NhbGUsXG4gICAgICAgICAgICB5U2NhbGU6IG9wdGlvbnMueVNjYWxlLFxuICAgICAgICAgICAgcm90YXRlOiAoX2MgPSBvcHRpb25zLnJvdGF0ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZGVncmVlcygwKSxcbiAgICAgICAgfSkpLCBbXG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIG9wdGlvbnMuYm9yZGVyV2lkdGggPyBmaWxsQW5kU3Ryb2tlKClcbiAgICAgICAgICAgIDogb3B0aW9ucy5jb2xvciA/IGZpbGwoKVxuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5ib3JkZXJDb2xvciA/IHN0cm9rZSgpXG4gICAgICAgICAgICAgICAgICAgIDogY2xvc2VQYXRoKCksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdKS5maWx0ZXIoQm9vbGVhbik7XG59O1xuZXhwb3J0IHZhciBkcmF3U3ZnUGF0aCA9IGZ1bmN0aW9uIChwYXRoLCBvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFtcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgb3B0aW9ucy5ncmFwaGljc1N0YXRlICYmIHNldEdyYXBoaWNzU3RhdGUob3B0aW9ucy5ncmFwaGljc1N0YXRlKSxcbiAgICAgICAgdHJhbnNsYXRlKG9wdGlvbnMueCwgb3B0aW9ucy55KSxcbiAgICAgICAgcm90YXRlUmFkaWFucyh0b1JhZGlhbnMoKF9hID0gb3B0aW9ucy5yb3RhdGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGRlZ3JlZXMoMCkpKSxcbiAgICAgICAgLy8gU1ZHIHBhdGggWSBheGlzIGlzIG9wcG9zaXRlIHBkZi1saWInc1xuICAgICAgICBvcHRpb25zLnNjYWxlID8gc2NhbGUob3B0aW9ucy5zY2FsZSwgLW9wdGlvbnMuc2NhbGUpIDogc2NhbGUoMSwgLTEpLFxuICAgICAgICBvcHRpb25zLmNvbG9yICYmIHNldEZpbGxpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgb3B0aW9ucy5ib3JkZXJDb2xvciAmJiBzZXRTdHJva2luZ0NvbG9yKG9wdGlvbnMuYm9yZGVyQ29sb3IpLFxuICAgICAgICBvcHRpb25zLmJvcmRlcldpZHRoICYmIHNldExpbmVXaWR0aChvcHRpb25zLmJvcmRlcldpZHRoKSxcbiAgICAgICAgb3B0aW9ucy5ib3JkZXJMaW5lQ2FwICYmIHNldExpbmVDYXAob3B0aW9ucy5ib3JkZXJMaW5lQ2FwKSxcbiAgICAgICAgc2V0RGFzaFBhdHRlcm4oKF9iID0gb3B0aW9ucy5ib3JkZXJEYXNoQXJyYXkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdLCAoX2MgPSBvcHRpb25zLmJvcmRlckRhc2hQaGFzZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMClcbiAgICBdLCBzdmdQYXRoVG9PcGVyYXRvcnMocGF0aCksIFtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgb3B0aW9ucy5ib3JkZXJXaWR0aCA/IGZpbGxBbmRTdHJva2UoKVxuICAgICAgICAgICAgOiBvcHRpb25zLmNvbG9yID8gZmlsbCgpXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zLmJvcmRlckNvbG9yID8gc3Ryb2tlKClcbiAgICAgICAgICAgICAgICAgICAgOiBjbG9zZVBhdGgoKSxcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0pLmZpbHRlcihCb29sZWFuKTtcbn07XG5leHBvcnQgdmFyIGRyYXdDaGVja01hcmsgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBzaXplID0gYXNOdW1iZXIob3B0aW9ucy5zaXplKTtcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKiogRGVmaW5lIENoZWNrIE1hcmsgUG9pbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvLyBBIGNoZWNrIG1hcmsgaXMgZGVmaW5lZCBieSB0aHJlZSBwb2ludHMgaW4gc29tZSBjb29yZGluYXRlIHNwYWNlLiBIZXJlLCB3ZVxuICAgIC8vIGRlZmluZSB0aGVzZSBwb2ludHMgaW4gYSB1bml0IGNvb3JkaW5hdGUgc3lzdGVtLCB3aGVyZSB0aGUgcmFuZ2Ugb2YgdGhlIHhcbiAgICAvLyBhbmQgeSBheGlzIGFyZSBib3RoIFstMSwgMV0uXG4gICAgLy9cbiAgICAvLyBOb3RlIHRoYXQgd2UgZG8gbm90IGhhcmQgY29kZSBgcDF5YCBpbiBjYXNlIHdlIHdpc2ggdG8gY2hhbmdlIHRoZVxuICAgIC8vIHNpemUvc2hhcGUgb2YgdGhlIGNoZWNrIG1hcmsgaW4gdGhlIGZ1dHVyZS4gV2Ugd2FudCB0aGUgY2hlY2sgbWFyayB0b1xuICAgIC8vIGFsd2F5cyBmb3JtIGEgcmlnaHQgYW5nbGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZG90IHByb2R1Y3QgYmV0d2VlbiAocDEtcDIpXG4gICAgLy8gYW5kIChwMy1wMikgc2hvdWxkIGJlIHplcm86XG4gICAgLy9cbiAgICAvLyAgIChwMXgtcDJ4KSAqIChwM3gtcDJ4KSArIChwMXktcDJ5KSAqIChwM3ktcDJ5KSA9IDBcbiAgICAvL1xuICAgIC8vIFdlIGNhbiBub3cgcmVqaWdnZXIgdGhpcyBlcXVhdGlvbiB0byBzb2x2ZSBmb3IgYHAxeWA6XG4gICAgLy9cbiAgICAvLyAgIChwMXktcDJ5KSAqIChwM3ktcDJ5KSA9IC0oKHAxeC1wMngpICogKHAzeC1wMngpKVxuICAgIC8vICAgKHAxeS1wMnkpID0gLSgocDF4LXAyeCkgKiAocDN4LXAyeCkpIC8gKHAzeS1wMnkpXG4gICAgLy8gICBwMXkgPSAtKChwMXgtcDJ4KSAqIChwM3gtcDJ4KSkgLyAocDN5LXAyeSkgKyBwMnlcbiAgICAvL1xuICAgIC8vIFRoYW5rcyB0byBteSBmcmllbmQgSm9lbCBXYWxrZXIgKGh0dHBzOi8vZ2l0aHViLmNvbS9KV2Fsa2VyMTk5NSkgZm9yXG4gICAgLy8gZGV2aXNpbmcgdGhlIGFib3ZlIGVxdWF0aW9uIGFuZCB1bml0IGNvb3JkaW5hdGUgc3lzdGVtIGFwcHJvYWNoIVxuICAgIC8vICh4LCB5KSBjb29yZHMgb2YgdGhlIGNoZWNrIG1hcmsncyBib3R0b21tb3N0IHBvaW50XG4gICAgdmFyIHAyeCA9IC0xICsgMC43NTtcbiAgICB2YXIgcDJ5ID0gLTEgKyAwLjUxO1xuICAgIC8vICh4LCB5KSBjb29yZHMgb2YgdGhlIGNoZWNrIG1hcmsncyB0b3Btb3N0IHBvaW50XG4gICAgdmFyIHAzeSA9IDEgLSAwLjUyNTtcbiAgICB2YXIgcDN4ID0gMSAtIDAuMzE7XG4gICAgLy8gKHgsIHkpIGNvb3JkcyBvZiB0aGUgY2hlY2sgbWFyaydzIGNlbnRlciAodmVydGljYWxseSkgcG9pbnRcbiAgICB2YXIgcDF4ID0gLTEgKyAwLjMyNTtcbiAgICB2YXIgcDF5ID0gLSgocDF4IC0gcDJ4KSAqIChwM3ggLSBwMngpKSAvIChwM3kgLSBwMnkpICsgcDJ5O1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIHJldHVybiBbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIG9wdGlvbnMuY29sb3IgJiYgc2V0U3Ryb2tpbmdDb2xvcihvcHRpb25zLmNvbG9yKSxcbiAgICAgICAgc2V0TGluZVdpZHRoKG9wdGlvbnMudGhpY2tuZXNzKSxcbiAgICAgICAgdHJhbnNsYXRlKG9wdGlvbnMueCwgb3B0aW9ucy55KSxcbiAgICAgICAgbW92ZVRvKHAxeCAqIHNpemUsIHAxeSAqIHNpemUpLFxuICAgICAgICBsaW5lVG8ocDJ4ICogc2l6ZSwgcDJ5ICogc2l6ZSksXG4gICAgICAgIGxpbmVUbyhwM3ggKiBzaXplLCBwM3kgKiBzaXplKSxcbiAgICAgICAgc3Ryb2tlKCksXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcbn07XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB2YXIgcm90YXRlSW5QbGFjZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMucm90YXRpb24gPT09IDAgPyBbXG4gICAgICAgIHRyYW5zbGF0ZSgwLCAwKSxcbiAgICAgICAgcm90YXRlRGVncmVlcygwKVxuICAgIF1cbiAgICAgICAgOiBvcHRpb25zLnJvdGF0aW9uID09PSA5MCA/IFtcbiAgICAgICAgICAgIHRyYW5zbGF0ZShvcHRpb25zLndpZHRoLCAwKSxcbiAgICAgICAgICAgIHJvdGF0ZURlZ3JlZXMoOTApXG4gICAgICAgIF1cbiAgICAgICAgICAgIDogb3B0aW9ucy5yb3RhdGlvbiA9PT0gMTgwID8gW1xuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZShvcHRpb25zLndpZHRoLCBvcHRpb25zLmhlaWdodCksXG4gICAgICAgICAgICAgICAgcm90YXRlRGVncmVlcygxODApXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zLnJvdGF0aW9uID09PSAyNzAgPyBbXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSgwLCBvcHRpb25zLmhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIHJvdGF0ZURlZ3JlZXMoMjcwKVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgOiBbXTtcbn07IC8vIEludmFsaWQgcm90YXRpb24gLSBub29wXG5leHBvcnQgdmFyIGRyYXdDaGVja0JveCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIG91dGxpbmUgPSBkcmF3UmVjdGFuZ2xlKHtcbiAgICAgICAgeDogb3B0aW9ucy54LFxuICAgICAgICB5OiBvcHRpb25zLnksXG4gICAgICAgIHdpZHRoOiBvcHRpb25zLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IG9wdGlvbnMuaGVpZ2h0LFxuICAgICAgICBib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcbiAgICAgICAgY29sb3I6IG9wdGlvbnMuY29sb3IsXG4gICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICB9KTtcbiAgICBpZiAoIW9wdGlvbnMuZmlsbGVkKVxuICAgICAgICByZXR1cm4gb3V0bGluZTtcbiAgICB2YXIgd2lkdGggPSBhc051bWJlcihvcHRpb25zLndpZHRoKTtcbiAgICB2YXIgaGVpZ2h0ID0gYXNOdW1iZXIob3B0aW9ucy5oZWlnaHQpO1xuICAgIHZhciBjaGVja01hcmtTaXplID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCkgLyAyO1xuICAgIHZhciBjaGVja01hcmsgPSBkcmF3Q2hlY2tNYXJrKHtcbiAgICAgICAgeDogd2lkdGggLyAyLFxuICAgICAgICB5OiBoZWlnaHQgLyAyLFxuICAgICAgICBzaXplOiBjaGVja01hcmtTaXplLFxuICAgICAgICB0aGlja25lc3M6IG9wdGlvbnMudGhpY2tuZXNzLFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5tYXJrQ29sb3IsXG4gICAgfSk7XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFtwdXNoR3JhcGhpY3NTdGF0ZSgpXSwgb3V0bGluZSwgY2hlY2tNYXJrLCBbcG9wR3JhcGhpY3NTdGF0ZSgpXSk7XG59O1xuZXhwb3J0IHZhciBkcmF3UmFkaW9CdXR0b24gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciB3aWR0aCA9IGFzTnVtYmVyKG9wdGlvbnMud2lkdGgpO1xuICAgIHZhciBoZWlnaHQgPSBhc051bWJlcihvcHRpb25zLmhlaWdodCk7XG4gICAgdmFyIG91dGxpbmVTY2FsZSA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gMjtcbiAgICB2YXIgb3V0bGluZSA9IGRyYXdFbGxpcHNlKHtcbiAgICAgICAgeDogb3B0aW9ucy54LFxuICAgICAgICB5OiBvcHRpb25zLnksXG4gICAgICAgIHhTY2FsZTogb3V0bGluZVNjYWxlLFxuICAgICAgICB5U2NhbGU6IG91dGxpbmVTY2FsZSxcbiAgICAgICAgY29sb3I6IG9wdGlvbnMuY29sb3IsXG4gICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICBib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcbiAgICB9KTtcbiAgICBpZiAoIW9wdGlvbnMuZmlsbGVkKVxuICAgICAgICByZXR1cm4gb3V0bGluZTtcbiAgICB2YXIgZG90ID0gZHJhd0VsbGlwc2Uoe1xuICAgICAgICB4OiBvcHRpb25zLngsXG4gICAgICAgIHk6IG9wdGlvbnMueSxcbiAgICAgICAgeFNjYWxlOiBvdXRsaW5lU2NhbGUgKiAwLjQ1LFxuICAgICAgICB5U2NhbGU6IG91dGxpbmVTY2FsZSAqIDAuNDUsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLmRvdENvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogdW5kZWZpbmVkLFxuICAgICAgICBib3JkZXJXaWR0aDogMCxcbiAgICB9KTtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW3B1c2hHcmFwaGljc1N0YXRlKCldLCBvdXRsaW5lLCBkb3QsIFtwb3BHcmFwaGljc1N0YXRlKCldKTtcbn07XG5leHBvcnQgdmFyIGRyYXdCdXR0b24gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciB4ID0gYXNOdW1iZXIob3B0aW9ucy54KTtcbiAgICB2YXIgeSA9IGFzTnVtYmVyKG9wdGlvbnMueSk7XG4gICAgdmFyIHdpZHRoID0gYXNOdW1iZXIob3B0aW9ucy53aWR0aCk7XG4gICAgdmFyIGhlaWdodCA9IGFzTnVtYmVyKG9wdGlvbnMuaGVpZ2h0KTtcbiAgICB2YXIgYmFja2dyb3VuZCA9IGRyYXdSZWN0YW5nbGUoe1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcbiAgICAgICAgY29sb3I6IG9wdGlvbnMuY29sb3IsXG4gICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICB9KTtcbiAgICB2YXIgbGluZXMgPSBkcmF3VGV4dExpbmVzKG9wdGlvbnMudGV4dExpbmVzLCB7XG4gICAgICAgIGNvbG9yOiBvcHRpb25zLnRleHRDb2xvcixcbiAgICAgICAgZm9udDogb3B0aW9ucy5mb250LFxuICAgICAgICBzaXplOiBvcHRpb25zLmZvbnRTaXplLFxuICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgIHhTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB5U2tldzogZGVncmVlcygwKSxcbiAgICB9KTtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW3B1c2hHcmFwaGljc1N0YXRlKCldLCBiYWNrZ3JvdW5kLCBsaW5lcywgW3BvcEdyYXBoaWNzU3RhdGUoKV0pO1xufTtcbmV4cG9ydCB2YXIgZHJhd1RleHRMaW5lcyA9IGZ1bmN0aW9uIChsaW5lcywgb3B0aW9ucykge1xuICAgIHZhciBvcGVyYXRvcnMgPSBbXG4gICAgICAgIGJlZ2luVGV4dCgpLFxuICAgICAgICBzZXRGaWxsaW5nQ29sb3Iob3B0aW9ucy5jb2xvciksXG4gICAgICAgIHNldEZvbnRBbmRTaXplKG9wdGlvbnMuZm9udCwgb3B0aW9ucy5zaXplKSxcbiAgICBdO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgX2EgPSBsaW5lc1tpZHhdLCBlbmNvZGVkID0gX2EuZW5jb2RlZCwgeCA9IF9hLngsIHkgPSBfYS55O1xuICAgICAgICBvcGVyYXRvcnMucHVzaChyb3RhdGVBbmRTa2V3VGV4dFJhZGlhbnNBbmRUcmFuc2xhdGUodG9SYWRpYW5zKG9wdGlvbnMucm90YXRlKSwgdG9SYWRpYW5zKG9wdGlvbnMueFNrZXcpLCB0b1JhZGlhbnMob3B0aW9ucy55U2tldyksIHgsIHkpLCBzaG93VGV4dChlbmNvZGVkKSk7XG4gICAgfVxuICAgIG9wZXJhdG9ycy5wdXNoKGVuZFRleHQoKSk7XG4gICAgcmV0dXJuIG9wZXJhdG9ycztcbn07XG5leHBvcnQgdmFyIGRyYXdUZXh0RmllbGQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciB4ID0gYXNOdW1iZXIob3B0aW9ucy54KTtcbiAgICB2YXIgeSA9IGFzTnVtYmVyKG9wdGlvbnMueSk7XG4gICAgdmFyIHdpZHRoID0gYXNOdW1iZXIob3B0aW9ucy53aWR0aCk7XG4gICAgdmFyIGhlaWdodCA9IGFzTnVtYmVyKG9wdGlvbnMuaGVpZ2h0KTtcbiAgICB2YXIgYm9yZGVyV2lkdGggPSBhc051bWJlcihvcHRpb25zLmJvcmRlcldpZHRoKTtcbiAgICB2YXIgcGFkZGluZyA9IGFzTnVtYmVyKG9wdGlvbnMucGFkZGluZyk7XG4gICAgdmFyIGNsaXBYID0geCArIGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGNsaXBZID0geSArIGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGNsaXBXaWR0aCA9IHdpZHRoIC0gKGJvcmRlcldpZHRoIC8gMiArIHBhZGRpbmcpICogMjtcbiAgICB2YXIgY2xpcEhlaWdodCA9IGhlaWdodCAtIChib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nKSAqIDI7XG4gICAgdmFyIGNsaXBwaW5nQXJlYSA9IFtcbiAgICAgICAgbW92ZVRvKGNsaXBYLCBjbGlwWSksXG4gICAgICAgIGxpbmVUbyhjbGlwWCwgY2xpcFkgKyBjbGlwSGVpZ2h0KSxcbiAgICAgICAgbGluZVRvKGNsaXBYICsgY2xpcFdpZHRoLCBjbGlwWSArIGNsaXBIZWlnaHQpLFxuICAgICAgICBsaW5lVG8oY2xpcFggKyBjbGlwV2lkdGgsIGNsaXBZKSxcbiAgICAgICAgY2xvc2VQYXRoKCksXG4gICAgICAgIGNsaXAoKSxcbiAgICAgICAgZW5kUGF0aCgpLFxuICAgIF07XG4gICAgdmFyIGJhY2tncm91bmQgPSBkcmF3UmVjdGFuZ2xlKHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeSxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgYm9yZGVyV2lkdGg6IG9wdGlvbnMuYm9yZGVyV2lkdGgsXG4gICAgICAgIGNvbG9yOiBvcHRpb25zLmNvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgdmFyIGxpbmVzID0gZHJhd1RleHRMaW5lcyhvcHRpb25zLnRleHRMaW5lcywge1xuICAgICAgICBjb2xvcjogb3B0aW9ucy50ZXh0Q29sb3IsXG4gICAgICAgIGZvbnQ6IG9wdGlvbnMuZm9udCxcbiAgICAgICAgc2l6ZTogb3B0aW9ucy5mb250U2l6ZSxcbiAgICAgICAgcm90YXRlOiBkZWdyZWVzKDApLFxuICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgeVNrZXc6IGRlZ3JlZXMoMCksXG4gICAgfSk7XG4gICAgdmFyIG1hcmtlZENvbnRlbnQgPSBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgIGJlZ2luTWFya2VkQ29udGVudCgnVHgnKSxcbiAgICAgICAgcHVzaEdyYXBoaWNzU3RhdGUoKVxuICAgIF0sIGxpbmVzLCBbXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICAgICAgZW5kTWFya2VkQ29udGVudCgpLFxuICAgIF0pO1xuICAgIHJldHVybiBfX3NwcmVhZEFycmF5cyhbXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKClcbiAgICBdLCBiYWNrZ3JvdW5kLCBjbGlwcGluZ0FyZWEsIG1hcmtlZENvbnRlbnQsIFtcbiAgICAgICAgcG9wR3JhcGhpY3NTdGF0ZSgpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgZHJhd09wdGlvbkxpc3QgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciB4ID0gYXNOdW1iZXIob3B0aW9ucy54KTtcbiAgICB2YXIgeSA9IGFzTnVtYmVyKG9wdGlvbnMueSk7XG4gICAgdmFyIHdpZHRoID0gYXNOdW1iZXIob3B0aW9ucy53aWR0aCk7XG4gICAgdmFyIGhlaWdodCA9IGFzTnVtYmVyKG9wdGlvbnMuaGVpZ2h0KTtcbiAgICB2YXIgbGluZUhlaWdodCA9IGFzTnVtYmVyKG9wdGlvbnMubGluZUhlaWdodCk7XG4gICAgdmFyIGJvcmRlcldpZHRoID0gYXNOdW1iZXIob3B0aW9ucy5ib3JkZXJXaWR0aCk7XG4gICAgdmFyIHBhZGRpbmcgPSBhc051bWJlcihvcHRpb25zLnBhZGRpbmcpO1xuICAgIHZhciBjbGlwWCA9IHggKyBib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBjbGlwWSA9IHkgKyBib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBjbGlwV2lkdGggPSB3aWR0aCAtIChib3JkZXJXaWR0aCAvIDIgKyBwYWRkaW5nKSAqIDI7XG4gICAgdmFyIGNsaXBIZWlnaHQgPSBoZWlnaHQgLSAoYm9yZGVyV2lkdGggLyAyICsgcGFkZGluZykgKiAyO1xuICAgIHZhciBjbGlwcGluZ0FyZWEgPSBbXG4gICAgICAgIG1vdmVUbyhjbGlwWCwgY2xpcFkpLFxuICAgICAgICBsaW5lVG8oY2xpcFgsIGNsaXBZICsgY2xpcEhlaWdodCksXG4gICAgICAgIGxpbmVUbyhjbGlwWCArIGNsaXBXaWR0aCwgY2xpcFkgKyBjbGlwSGVpZ2h0KSxcbiAgICAgICAgbGluZVRvKGNsaXBYICsgY2xpcFdpZHRoLCBjbGlwWSksXG4gICAgICAgIGNsb3NlUGF0aCgpLFxuICAgICAgICBjbGlwKCksXG4gICAgICAgIGVuZFBhdGgoKSxcbiAgICBdO1xuICAgIHZhciBiYWNrZ3JvdW5kID0gZHJhd1JlY3RhbmdsZSh7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgICBjb2xvcjogb3B0aW9ucy5jb2xvcixcbiAgICAgICAgYm9yZGVyQ29sb3I6IG9wdGlvbnMuYm9yZGVyQ29sb3IsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIHZhciBoaWdobGlnaHRzID0gW107XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5zZWxlY3RlZExpbmVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgbGluZSA9IG9wdGlvbnMudGV4dExpbmVzW29wdGlvbnMuc2VsZWN0ZWRMaW5lc1tpZHhdXTtcbiAgICAgICAgaGlnaGxpZ2h0cy5wdXNoLmFwcGx5KGhpZ2hsaWdodHMsIGRyYXdSZWN0YW5nbGUoe1xuICAgICAgICAgICAgeDogbGluZS54IC0gcGFkZGluZyxcbiAgICAgICAgICAgIHk6IGxpbmUueSAtIChsaW5lSGVpZ2h0IC0gbGluZS5oZWlnaHQpIC8gMixcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBsaW5lLmhlaWdodCArIChsaW5lSGVpZ2h0IC0gbGluZS5oZWlnaHQpIC8gMixcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiAwLFxuICAgICAgICAgICAgY29sb3I6IG9wdGlvbnMuc2VsZWN0ZWRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICByb3RhdGU6IGRlZ3JlZXMoMCksXG4gICAgICAgICAgICB4U2tldzogZGVncmVlcygwKSxcbiAgICAgICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHZhciBsaW5lcyA9IGRyYXdUZXh0TGluZXMob3B0aW9ucy50ZXh0TGluZXMsIHtcbiAgICAgICAgY29sb3I6IG9wdGlvbnMudGV4dENvbG9yLFxuICAgICAgICBmb250OiBvcHRpb25zLmZvbnQsXG4gICAgICAgIHNpemU6IG9wdGlvbnMuZm9udFNpemUsXG4gICAgICAgIHJvdGF0ZTogZGVncmVlcygwKSxcbiAgICAgICAgeFNrZXc6IGRlZ3JlZXMoMCksXG4gICAgICAgIHlTa2V3OiBkZWdyZWVzKDApLFxuICAgIH0pO1xuICAgIHZhciBtYXJrZWRDb250ZW50ID0gX19zcHJlYWRBcnJheXMoW1xuICAgICAgICBiZWdpbk1hcmtlZENvbnRlbnQoJ1R4JyksXG4gICAgICAgIHB1c2hHcmFwaGljc1N0YXRlKClcbiAgICBdLCBsaW5lcywgW1xuICAgICAgICBwb3BHcmFwaGljc1N0YXRlKCksXG4gICAgICAgIGVuZE1hcmtlZENvbnRlbnQoKSxcbiAgICBdKTtcbiAgICByZXR1cm4gX19zcHJlYWRBcnJheXMoW1xuICAgICAgICBwdXNoR3JhcGhpY3NTdGF0ZSgpXG4gICAgXSwgYmFja2dyb3VuZCwgaGlnaGxpZ2h0cywgY2xpcHBpbmdBcmVhLCBtYXJrZWRDb250ZW50LCBbXG4gICAgICAgIHBvcEdyYXBoaWNzU3RhdGUoKSxcbiAgICBdKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcGVyYXRpb25zLmpzLm1hcCIsImltcG9ydCB7IGFzTnVtYmVyLCBhc1BERk5hbWUsIGFzUERGTnVtYmVyIH0gZnJvbSBcIi4vb2JqZWN0c1wiO1xuaW1wb3J0IHsgZGVncmVlc1RvUmFkaWFucyB9IGZyb20gXCIuL3JvdGF0aW9uc1wiO1xuaW1wb3J0IHsgUERGT3BlcmF0b3IsIFBERk9wZXJhdG9yTmFtZXMgYXMgT3BzLCB9IGZyb20gXCIuLi9jb3JlXCI7XG4vKiA9PT09PT09PT09PT09PT09PT09PSBDbGlwcGluZyBQYXRoIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBjbGlwID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkNsaXBOb25aZXJvKTsgfTtcbmV4cG9ydCB2YXIgY2xpcEV2ZW5PZGQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQ2xpcEV2ZW5PZGQpOyB9O1xuLyogPT09PT09PT09PT09PT09PT09PT0gR3JhcGhpY3MgU3RhdGUgT3BlcmF0b3JzID09PT09PT09PT09PT09PT09PT09ICovXG52YXIgY29zID0gTWF0aC5jb3MsIHNpbiA9IE1hdGguc2luLCB0YW4gPSBNYXRoLnRhbjtcbmV4cG9ydCB2YXIgY29uY2F0VHJhbnNmb3JtYXRpb25NYXRyaXggPSBmdW5jdGlvbiAoYSwgYiwgYywgZCwgZSwgZikge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQ29uY2F0VHJhbnNmb3JtYXRpb25NYXRyaXgsIFtcbiAgICAgICAgYXNQREZOdW1iZXIoYSksXG4gICAgICAgIGFzUERGTnVtYmVyKGIpLFxuICAgICAgICBhc1BERk51bWJlcihjKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZCksXG4gICAgICAgIGFzUERGTnVtYmVyKGUpLFxuICAgICAgICBhc1BERk51bWJlcihmKSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIHRyYW5zbGF0ZSA9IGZ1bmN0aW9uICh4UG9zLCB5UG9zKSB7XG4gICAgcmV0dXJuIGNvbmNhdFRyYW5zZm9ybWF0aW9uTWF0cml4KDEsIDAsIDAsIDEsIHhQb3MsIHlQb3MpO1xufTtcbmV4cG9ydCB2YXIgc2NhbGUgPSBmdW5jdGlvbiAoeFBvcywgeVBvcykge1xuICAgIHJldHVybiBjb25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeCh4UG9zLCAwLCAwLCB5UG9zLCAwLCAwKTtcbn07XG5leHBvcnQgdmFyIHJvdGF0ZVJhZGlhbnMgPSBmdW5jdGlvbiAoYW5nbGUpIHtcbiAgICByZXR1cm4gY29uY2F0VHJhbnNmb3JtYXRpb25NYXRyaXgoY29zKGFzTnVtYmVyKGFuZ2xlKSksIHNpbihhc051bWJlcihhbmdsZSkpLCAtc2luKGFzTnVtYmVyKGFuZ2xlKSksIGNvcyhhc051bWJlcihhbmdsZSkpLCAwLCAwKTtcbn07XG5leHBvcnQgdmFyIHJvdGF0ZURlZ3JlZXMgPSBmdW5jdGlvbiAoYW5nbGUpIHtcbiAgICByZXR1cm4gcm90YXRlUmFkaWFucyhkZWdyZWVzVG9SYWRpYW5zKGFzTnVtYmVyKGFuZ2xlKSkpO1xufTtcbmV4cG9ydCB2YXIgc2tld1JhZGlhbnMgPSBmdW5jdGlvbiAoeFNrZXdBbmdsZSwgeVNrZXdBbmdsZSkge1xuICAgIHJldHVybiBjb25jYXRUcmFuc2Zvcm1hdGlvbk1hdHJpeCgxLCB0YW4oYXNOdW1iZXIoeFNrZXdBbmdsZSkpLCB0YW4oYXNOdW1iZXIoeVNrZXdBbmdsZSkpLCAxLCAwLCAwKTtcbn07XG5leHBvcnQgdmFyIHNrZXdEZWdyZWVzID0gZnVuY3Rpb24gKHhTa2V3QW5nbGUsIHlTa2V3QW5nbGUpIHtcbiAgICByZXR1cm4gc2tld1JhZGlhbnMoZGVncmVlc1RvUmFkaWFucyhhc051bWJlcih4U2tld0FuZ2xlKSksIGRlZ3JlZXNUb1JhZGlhbnMoYXNOdW1iZXIoeVNrZXdBbmdsZSkpKTtcbn07XG5leHBvcnQgdmFyIHNldERhc2hQYXR0ZXJuID0gZnVuY3Rpb24gKGRhc2hBcnJheSwgZGFzaFBoYXNlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRMaW5lRGFzaFBhdHRlcm4sIFtcbiAgICAgICAgXCJbXCIgKyBkYXNoQXJyYXkubWFwKGFzUERGTnVtYmVyKS5qb2luKCcgJykgKyBcIl1cIixcbiAgICAgICAgYXNQREZOdW1iZXIoZGFzaFBoYXNlKSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIHJlc3RvcmVEYXNoUGF0dGVybiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNldERhc2hQYXR0ZXJuKFtdLCAwKTsgfTtcbmV4cG9ydCB2YXIgTGluZUNhcFN0eWxlO1xuKGZ1bmN0aW9uIChMaW5lQ2FwU3R5bGUpIHtcbiAgICBMaW5lQ2FwU3R5bGVbTGluZUNhcFN0eWxlW1wiQnV0dFwiXSA9IDBdID0gXCJCdXR0XCI7XG4gICAgTGluZUNhcFN0eWxlW0xpbmVDYXBTdHlsZVtcIlJvdW5kXCJdID0gMV0gPSBcIlJvdW5kXCI7XG4gICAgTGluZUNhcFN0eWxlW0xpbmVDYXBTdHlsZVtcIlByb2plY3RpbmdcIl0gPSAyXSA9IFwiUHJvamVjdGluZ1wiO1xufSkoTGluZUNhcFN0eWxlIHx8IChMaW5lQ2FwU3R5bGUgPSB7fSkpO1xuZXhwb3J0IHZhciBzZXRMaW5lQ2FwID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRMaW5lQ2FwU3R5bGUsIFthc1BERk51bWJlcihzdHlsZSldKTtcbn07XG5leHBvcnQgdmFyIExpbmVKb2luU3R5bGU7XG4oZnVuY3Rpb24gKExpbmVKb2luU3R5bGUpIHtcbiAgICBMaW5lSm9pblN0eWxlW0xpbmVKb2luU3R5bGVbXCJNaXRlclwiXSA9IDBdID0gXCJNaXRlclwiO1xuICAgIExpbmVKb2luU3R5bGVbTGluZUpvaW5TdHlsZVtcIlJvdW5kXCJdID0gMV0gPSBcIlJvdW5kXCI7XG4gICAgTGluZUpvaW5TdHlsZVtMaW5lSm9pblN0eWxlW1wiQmV2ZWxcIl0gPSAyXSA9IFwiQmV2ZWxcIjtcbn0pKExpbmVKb2luU3R5bGUgfHwgKExpbmVKb2luU3R5bGUgPSB7fSkpO1xuZXhwb3J0IHZhciBzZXRMaW5lSm9pbiA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0TGluZUpvaW5TdHlsZSwgW2FzUERGTnVtYmVyKHN0eWxlKV0pO1xufTtcbmV4cG9ydCB2YXIgc2V0R3JhcGhpY3NTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0R3JhcGhpY3NTdGF0ZVBhcmFtcywgW2FzUERGTmFtZShzdGF0ZSldKTtcbn07XG5leHBvcnQgdmFyIHB1c2hHcmFwaGljc1N0YXRlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlB1c2hHcmFwaGljc1N0YXRlKTsgfTtcbmV4cG9ydCB2YXIgcG9wR3JhcGhpY3NTdGF0ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5Qb3BHcmFwaGljc1N0YXRlKTsgfTtcbmV4cG9ydCB2YXIgc2V0TGluZVdpZHRoID0gZnVuY3Rpb24gKHdpZHRoKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRMaW5lV2lkdGgsIFthc1BERk51bWJlcih3aWR0aCldKTtcbn07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBQYXRoIENvbnN0cnVjdGlvbiBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgYXBwZW5kQmV6aWVyQ3VydmUgPSBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5Mykge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQXBwZW5kQmV6aWVyQ3VydmUsIFtcbiAgICAgICAgYXNQREZOdW1iZXIoeDEpLFxuICAgICAgICBhc1BERk51bWJlcih5MSksXG4gICAgICAgIGFzUERGTnVtYmVyKHgyKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeTIpLFxuICAgICAgICBhc1BERk51bWJlcih4MyksXG4gICAgICAgIGFzUERGTnVtYmVyKHkzKSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIGFwcGVuZFF1YWRyYXRpY0N1cnZlID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5DdXJ2ZVRvUmVwbGljYXRlSW5pdGlhbFBvaW50LCBbXG4gICAgICAgIGFzUERGTnVtYmVyKHgxKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeTEpLFxuICAgICAgICBhc1BERk51bWJlcih4MiksXG4gICAgICAgIGFzUERGTnVtYmVyKHkyKSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIGNsb3NlUGF0aCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5DbG9zZVBhdGgpOyB9O1xuZXhwb3J0IHZhciBtb3ZlVG8gPSBmdW5jdGlvbiAoeFBvcywgeVBvcykge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuTW92ZVRvLCBbYXNQREZOdW1iZXIoeFBvcyksIGFzUERGTnVtYmVyKHlQb3MpXSk7XG59O1xuZXhwb3J0IHZhciBsaW5lVG8gPSBmdW5jdGlvbiAoeFBvcywgeVBvcykge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuTGluZVRvLCBbYXNQREZOdW1iZXIoeFBvcyksIGFzUERGTnVtYmVyKHlQb3MpXSk7XG59O1xuLyoqXG4gKiBAcGFyYW0geFBvcyB4IGNvb3JkaW5hdGUgZm9yIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlXG4gKiBAcGFyYW0geVBvcyB5IGNvb3JkaW5hdGUgZm9yIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlXG4gKiBAcGFyYW0gd2lkdGggd2lkdGggb2YgdGhlIHJlY3RhbmdsZVxuICogQHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZVxuICovXG5leHBvcnQgdmFyIHJlY3RhbmdsZSA9IGZ1bmN0aW9uICh4UG9zLCB5UG9zLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5BcHBlbmRSZWN0YW5nbGUsIFtcbiAgICAgICAgYXNQREZOdW1iZXIoeFBvcyksXG4gICAgICAgIGFzUERGTnVtYmVyKHlQb3MpLFxuICAgICAgICBhc1BERk51bWJlcih3aWR0aCksXG4gICAgICAgIGFzUERGTnVtYmVyKGhlaWdodCksXG4gICAgXSk7XG59O1xuLyoqXG4gKiBAcGFyYW0geFBvcyB4IGNvb3JkaW5hdGUgZm9yIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgc3F1YXJlXG4gKiBAcGFyYW0geVBvcyB5IGNvb3JkaW5hdGUgZm9yIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgc3F1YXJlXG4gKiBAcGFyYW0gc2l6ZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzcXVhcmVcbiAqL1xuZXhwb3J0IHZhciBzcXVhcmUgPSBmdW5jdGlvbiAoeFBvcywgeVBvcywgc2l6ZSkge1xuICAgIHJldHVybiByZWN0YW5nbGUoeFBvcywgeVBvcywgc2l6ZSwgc2l6ZSk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT0gUGF0aCBQYWludGluZyBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgc3Ryb2tlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlN0cm9rZVBhdGgpOyB9O1xuZXhwb3J0IHZhciBmaWxsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkZpbGxOb25aZXJvKTsgfTtcbmV4cG9ydCB2YXIgZmlsbEFuZFN0cm9rZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5GaWxsTm9uWmVyb0FuZFN0cm9rZSk7IH07XG5leHBvcnQgdmFyIGVuZFBhdGggPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuRW5kUGF0aCk7IH07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBUZXh0IFBvc2l0aW9uaW5nIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBuZXh0TGluZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5OZXh0TGluZSk7IH07XG5leHBvcnQgdmFyIG1vdmVUZXh0ID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLk1vdmVUZXh0LCBbYXNQREZOdW1iZXIoeCksIGFzUERGTnVtYmVyKHkpXSk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT0gVGV4dCBTaG93aW5nIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBzaG93VGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TaG93VGV4dCwgW3RleHRdKTtcbn07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBUZXh0IFN0YXRlIE9wZXJhdG9ycyA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBiZWdpblRleHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQmVnaW5UZXh0KTsgfTtcbmV4cG9ydCB2YXIgZW5kVGV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5FbmRUZXh0KTsgfTtcbmV4cG9ydCB2YXIgc2V0Rm9udEFuZFNpemUgPSBmdW5jdGlvbiAobmFtZSwgc2l6ZSkgeyByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldEZvbnRBbmRTaXplLCBbYXNQREZOYW1lKG5hbWUpLCBhc1BERk51bWJlcihzaXplKV0pOyB9O1xuZXhwb3J0IHZhciBzZXRDaGFyYWN0ZXJTcGFjaW5nID0gZnVuY3Rpb24gKHNwYWNpbmcpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldENoYXJhY3RlclNwYWNpbmcsIFthc1BERk51bWJlcihzcGFjaW5nKV0pO1xufTtcbmV4cG9ydCB2YXIgc2V0V29yZFNwYWNpbmcgPSBmdW5jdGlvbiAoc3BhY2luZykge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0V29yZFNwYWNpbmcsIFthc1BERk51bWJlcihzcGFjaW5nKV0pO1xufTtcbi8qKiBAcGFyYW0gc3F1ZWV6ZSBob3Jpem9udGFsIGNoYXJhY3RlciBzcGFjaW5nICovXG5leHBvcnQgdmFyIHNldENoYXJhY3RlclNxdWVlemUgPSBmdW5jdGlvbiAoc3F1ZWV6ZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0VGV4dEhvcml6b250YWxTY2FsaW5nLCBbYXNQREZOdW1iZXIoc3F1ZWV6ZSldKTtcbn07XG5leHBvcnQgdmFyIHNldExpbmVIZWlnaHQgPSBmdW5jdGlvbiAobGluZUhlaWdodCkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0VGV4dExpbmVIZWlnaHQsIFthc1BERk51bWJlcihsaW5lSGVpZ2h0KV0pO1xufTtcbmV4cG9ydCB2YXIgc2V0VGV4dFJpc2UgPSBmdW5jdGlvbiAocmlzZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU2V0VGV4dFJpc2UsIFthc1BERk51bWJlcihyaXNlKV0pO1xufTtcbmV4cG9ydCB2YXIgVGV4dFJlbmRlcmluZ01vZGU7XG4oZnVuY3Rpb24gKFRleHRSZW5kZXJpbmdNb2RlKSB7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJGaWxsXCJdID0gMF0gPSBcIkZpbGxcIjtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIk91dGxpbmVcIl0gPSAxXSA9IFwiT3V0bGluZVwiO1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiRmlsbEFuZE91dGxpbmVcIl0gPSAyXSA9IFwiRmlsbEFuZE91dGxpbmVcIjtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIkludmlzaWJsZVwiXSA9IDNdID0gXCJJbnZpc2libGVcIjtcbiAgICBUZXh0UmVuZGVyaW5nTW9kZVtUZXh0UmVuZGVyaW5nTW9kZVtcIkZpbGxBbmRDbGlwXCJdID0gNF0gPSBcIkZpbGxBbmRDbGlwXCI7XG4gICAgVGV4dFJlbmRlcmluZ01vZGVbVGV4dFJlbmRlcmluZ01vZGVbXCJPdXRsaW5lQW5kQ2xpcFwiXSA9IDVdID0gXCJPdXRsaW5lQW5kQ2xpcFwiO1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiRmlsbEFuZE91dGxpbmVBbmRDbGlwXCJdID0gNl0gPSBcIkZpbGxBbmRPdXRsaW5lQW5kQ2xpcFwiO1xuICAgIFRleHRSZW5kZXJpbmdNb2RlW1RleHRSZW5kZXJpbmdNb2RlW1wiQ2xpcFwiXSA9IDddID0gXCJDbGlwXCI7XG59KShUZXh0UmVuZGVyaW5nTW9kZSB8fCAoVGV4dFJlbmRlcmluZ01vZGUgPSB7fSkpO1xuZXhwb3J0IHZhciBzZXRUZXh0UmVuZGVyaW5nTW9kZSA9IGZ1bmN0aW9uIChtb2RlKSB7XG4gICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKE9wcy5TZXRUZXh0UmVuZGVyaW5nTW9kZSwgW2FzUERGTnVtYmVyKG1vZGUpXSk7XG59O1xuZXhwb3J0IHZhciBzZXRUZXh0TWF0cml4ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlNldFRleHRNYXRyaXgsIFtcbiAgICAgICAgYXNQREZOdW1iZXIoYSksXG4gICAgICAgIGFzUERGTnVtYmVyKGIpLFxuICAgICAgICBhc1BERk51bWJlcihjKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZCksXG4gICAgICAgIGFzUERGTnVtYmVyKGUpLFxuICAgICAgICBhc1BERk51bWJlcihmKSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIHJvdGF0ZUFuZFNrZXdUZXh0UmFkaWFuc0FuZFRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChyb3RhdGlvbkFuZ2xlLCB4U2tld0FuZ2xlLCB5U2tld0FuZ2xlLCB4LCB5KSB7XG4gICAgcmV0dXJuIHNldFRleHRNYXRyaXgoY29zKGFzTnVtYmVyKHJvdGF0aW9uQW5nbGUpKSwgc2luKGFzTnVtYmVyKHJvdGF0aW9uQW5nbGUpKSArIHRhbihhc051bWJlcih4U2tld0FuZ2xlKSksIC1zaW4oYXNOdW1iZXIocm90YXRpb25BbmdsZSkpICsgdGFuKGFzTnVtYmVyKHlTa2V3QW5nbGUpKSwgY29zKGFzTnVtYmVyKHJvdGF0aW9uQW5nbGUpKSwgeCwgeSk7XG59O1xuZXhwb3J0IHZhciByb3RhdGVBbmRTa2V3VGV4dERlZ3JlZXNBbmRUcmFuc2xhdGUgPSBmdW5jdGlvbiAocm90YXRpb25BbmdsZSwgeFNrZXdBbmdsZSwgeVNrZXdBbmdsZSwgeCwgeSkge1xuICAgIHJldHVybiByb3RhdGVBbmRTa2V3VGV4dFJhZGlhbnNBbmRUcmFuc2xhdGUoZGVncmVlc1RvUmFkaWFucyhhc051bWJlcihyb3RhdGlvbkFuZ2xlKSksIGRlZ3JlZXNUb1JhZGlhbnMoYXNOdW1iZXIoeFNrZXdBbmdsZSkpLCBkZWdyZWVzVG9SYWRpYW5zKGFzTnVtYmVyKHlTa2V3QW5nbGUpKSwgeCwgeSk7XG59O1xuLyogPT09PT09PT09PT09PT09PT09PT0gWE9iamVjdCBPcGVyYXRvciA9PT09PT09PT09PT09PT09PT09PSAqL1xuZXhwb3J0IHZhciBkcmF3T2JqZWN0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLkRyYXdPYmplY3QsIFthc1BERk5hbWUobmFtZSldKTtcbn07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBDb2xvciBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgc2V0RmlsbGluZ0dyYXlzY2FsZUNvbG9yID0gZnVuY3Rpb24gKGdyYXkpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLk5vblN0cm9raW5nQ29sb3JHcmF5LCBbYXNQREZOdW1iZXIoZ3JheSldKTtcbn07XG5leHBvcnQgdmFyIHNldFN0cm9raW5nR3JheXNjYWxlQ29sb3IgPSBmdW5jdGlvbiAoZ3JheSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU3Ryb2tpbmdDb2xvckdyYXksIFthc1BERk51bWJlcihncmF5KV0pO1xufTtcbmV4cG9ydCB2YXIgc2V0RmlsbGluZ1JnYkNvbG9yID0gZnVuY3Rpb24gKHJlZCwgZ3JlZW4sIGJsdWUpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLk5vblN0cm9raW5nQ29sb3JSZ2IsIFtcbiAgICAgICAgYXNQREZOdW1iZXIocmVkKSxcbiAgICAgICAgYXNQREZOdW1iZXIoZ3JlZW4pLFxuICAgICAgICBhc1BERk51bWJlcihibHVlKSxcbiAgICBdKTtcbn07XG5leHBvcnQgdmFyIHNldFN0cm9raW5nUmdiQ29sb3IgPSBmdW5jdGlvbiAocmVkLCBncmVlbiwgYmx1ZSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuU3Ryb2tpbmdDb2xvclJnYiwgW1xuICAgICAgICBhc1BERk51bWJlcihyZWQpLFxuICAgICAgICBhc1BERk51bWJlcihncmVlbiksXG4gICAgICAgIGFzUERGTnVtYmVyKGJsdWUpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgc2V0RmlsbGluZ0NteWtDb2xvciA9IGZ1bmN0aW9uIChjeWFuLCBtYWdlbnRhLCB5ZWxsb3csIGtleSkge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuTm9uU3Ryb2tpbmdDb2xvckNteWssIFtcbiAgICAgICAgYXNQREZOdW1iZXIoY3lhbiksXG4gICAgICAgIGFzUERGTnVtYmVyKG1hZ2VudGEpLFxuICAgICAgICBhc1BERk51bWJlcih5ZWxsb3cpLFxuICAgICAgICBhc1BERk51bWJlcihrZXkpLFxuICAgIF0pO1xufTtcbmV4cG9ydCB2YXIgc2V0U3Ryb2tpbmdDbXlrQ29sb3IgPSBmdW5jdGlvbiAoY3lhbiwgbWFnZW50YSwgeWVsbG93LCBrZXkpIHtcbiAgICByZXR1cm4gUERGT3BlcmF0b3Iub2YoT3BzLlN0cm9raW5nQ29sb3JDbXlrLCBbXG4gICAgICAgIGFzUERGTnVtYmVyKGN5YW4pLFxuICAgICAgICBhc1BERk51bWJlcihtYWdlbnRhKSxcbiAgICAgICAgYXNQREZOdW1iZXIoeWVsbG93KSxcbiAgICAgICAgYXNQREZOdW1iZXIoa2V5KSxcbiAgICBdKTtcbn07XG4vKiA9PT09PT09PT09PT09PT09PT09PSBNYXJrZWQgQ29udGVudCBPcGVyYXRvcnMgPT09PT09PT09PT09PT09PT09PT0gKi9cbmV4cG9ydCB2YXIgYmVnaW5NYXJrZWRDb250ZW50ID0gZnVuY3Rpb24gKHRhZykge1xuICAgIHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuQmVnaW5NYXJrZWRDb250ZW50LCBbYXNQREZOYW1lKHRhZyldKTtcbn07XG5leHBvcnQgdmFyIGVuZE1hcmtlZENvbnRlbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQREZPcGVyYXRvci5vZihPcHMuRW5kTWFya2VkQ29udGVudCk7IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcGVyYXRvcnMuanMubWFwIiwiaW1wb3J0IHsgYXNzZXJ0SXMsIGVycm9yIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5leHBvcnQgdmFyIFJvdGF0aW9uVHlwZXM7XG4oZnVuY3Rpb24gKFJvdGF0aW9uVHlwZXMpIHtcbiAgICBSb3RhdGlvblR5cGVzW1wiRGVncmVlc1wiXSA9IFwiZGVncmVlc1wiO1xuICAgIFJvdGF0aW9uVHlwZXNbXCJSYWRpYW5zXCJdID0gXCJyYWRpYW5zXCI7XG59KShSb3RhdGlvblR5cGVzIHx8IChSb3RhdGlvblR5cGVzID0ge30pKTtcbmV4cG9ydCB2YXIgcmFkaWFucyA9IGZ1bmN0aW9uIChyYWRpYW5BbmdsZSkge1xuICAgIGFzc2VydElzKHJhZGlhbkFuZ2xlLCAncmFkaWFuQW5nbGUnLCBbJ251bWJlciddKTtcbiAgICByZXR1cm4geyB0eXBlOiBSb3RhdGlvblR5cGVzLlJhZGlhbnMsIGFuZ2xlOiByYWRpYW5BbmdsZSB9O1xufTtcbmV4cG9ydCB2YXIgZGVncmVlcyA9IGZ1bmN0aW9uIChkZWdyZWVBbmdsZSkge1xuICAgIGFzc2VydElzKGRlZ3JlZUFuZ2xlLCAnZGVncmVlQW5nbGUnLCBbJ251bWJlciddKTtcbiAgICByZXR1cm4geyB0eXBlOiBSb3RhdGlvblR5cGVzLkRlZ3JlZXMsIGFuZ2xlOiBkZWdyZWVBbmdsZSB9O1xufTtcbnZhciBSYWRpYW5zID0gUm90YXRpb25UeXBlcy5SYWRpYW5zLCBEZWdyZWVzID0gUm90YXRpb25UeXBlcy5EZWdyZWVzO1xuZXhwb3J0IHZhciBkZWdyZWVzVG9SYWRpYW5zID0gZnVuY3Rpb24gKGRlZ3JlZSkgeyByZXR1cm4gKGRlZ3JlZSAqIE1hdGguUEkpIC8gMTgwOyB9O1xuZXhwb3J0IHZhciByYWRpYW5zVG9EZWdyZWVzID0gZnVuY3Rpb24gKHJhZGlhbikgeyByZXR1cm4gKHJhZGlhbiAqIDE4MCkgLyBNYXRoLlBJOyB9O1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdmFyIHRvUmFkaWFucyA9IGZ1bmN0aW9uIChyb3RhdGlvbikge1xuICAgIHJldHVybiByb3RhdGlvbi50eXBlID09PSBSYWRpYW5zID8gcm90YXRpb24uYW5nbGVcbiAgICAgICAgOiByb3RhdGlvbi50eXBlID09PSBEZWdyZWVzID8gZGVncmVlc1RvUmFkaWFucyhyb3RhdGlvbi5hbmdsZSlcbiAgICAgICAgICAgIDogZXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uOiBcIiArIEpTT04uc3RyaW5naWZ5KHJvdGF0aW9uKSk7XG59O1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnQgdmFyIHRvRGVncmVlcyA9IGZ1bmN0aW9uIChyb3RhdGlvbikge1xuICAgIHJldHVybiByb3RhdGlvbi50eXBlID09PSBSYWRpYW5zID8gcmFkaWFuc1RvRGVncmVlcyhyb3RhdGlvbi5hbmdsZSlcbiAgICAgICAgOiByb3RhdGlvbi50eXBlID09PSBEZWdyZWVzID8gcm90YXRpb24uYW5nbGVcbiAgICAgICAgICAgIDogZXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uOiBcIiArIEpTT04uc3RyaW5naWZ5KHJvdGF0aW9uKSk7XG59O1xuZXhwb3J0IHZhciByZWR1Y2VSb3RhdGlvbiA9IGZ1bmN0aW9uIChkZWdyZWVBbmdsZSkge1xuICAgIGlmIChkZWdyZWVBbmdsZSA9PT0gdm9pZCAwKSB7IGRlZ3JlZUFuZ2xlID0gMDsgfVxuICAgIHZhciBxdWFkcmFudHMgPSAoZGVncmVlQW5nbGUgLyA5MCkgJSA0O1xuICAgIGlmIChxdWFkcmFudHMgPT09IDApXG4gICAgICAgIHJldHVybiAwO1xuICAgIGlmIChxdWFkcmFudHMgPT09IDEpXG4gICAgICAgIHJldHVybiA5MDtcbiAgICBpZiAocXVhZHJhbnRzID09PSAyKVxuICAgICAgICByZXR1cm4gMTgwO1xuICAgIGlmIChxdWFkcmFudHMgPT09IDMpXG4gICAgICAgIHJldHVybiAyNzA7XG4gICAgcmV0dXJuIDA7IC8vIGBkZWdyZWVBbmdsZWAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOTBcbn07XG5leHBvcnQgdmFyIGFkanVzdERpbXNGb3JSb3RhdGlvbiA9IGZ1bmN0aW9uIChkaW1zLCBkZWdyZWVBbmdsZSkge1xuICAgIGlmIChkZWdyZWVBbmdsZSA9PT0gdm9pZCAwKSB7IGRlZ3JlZUFuZ2xlID0gMDsgfVxuICAgIHZhciByb3RhdGlvbiA9IHJlZHVjZVJvdGF0aW9uKGRlZ3JlZUFuZ2xlKTtcbiAgICByZXR1cm4gcm90YXRpb24gPT09IDkwIHx8IHJvdGF0aW9uID09PSAyNzBcbiAgICAgICAgPyB7IHdpZHRoOiBkaW1zLmhlaWdodCwgaGVpZ2h0OiBkaW1zLndpZHRoIH1cbiAgICAgICAgOiB7IHdpZHRoOiBkaW1zLndpZHRoLCBoZWlnaHQ6IGRpbXMuaGVpZ2h0IH07XG59O1xuZXhwb3J0IHZhciByb3RhdGVSZWN0YW5nbGUgPSBmdW5jdGlvbiAocmVjdGFuZ2xlLCBib3JkZXJXaWR0aCwgZGVncmVlQW5nbGUpIHtcbiAgICBpZiAoYm9yZGVyV2lkdGggPT09IHZvaWQgMCkgeyBib3JkZXJXaWR0aCA9IDA7IH1cbiAgICBpZiAoZGVncmVlQW5nbGUgPT09IHZvaWQgMCkgeyBkZWdyZWVBbmdsZSA9IDA7IH1cbiAgICB2YXIgeCA9IHJlY3RhbmdsZS54LCB5ID0gcmVjdGFuZ2xlLnksIHcgPSByZWN0YW5nbGUud2lkdGgsIGggPSByZWN0YW5nbGUuaGVpZ2h0O1xuICAgIHZhciByID0gcmVkdWNlUm90YXRpb24oZGVncmVlQW5nbGUpO1xuICAgIHZhciBiID0gYm9yZGVyV2lkdGggLyAyO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGlmIChyID09PSAwKVxuICAgICAgICByZXR1cm4geyB4OiB4IC0gYiwgeTogeSAtIGIsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfTtcbiAgICBlbHNlIGlmIChyID09PSA5MClcbiAgICAgICAgcmV0dXJuIHsgeDogeCAtIGggKyBiLCB5OiB5IC0gYiwgd2lkdGg6IGgsIGhlaWdodDogdyB9O1xuICAgIGVsc2UgaWYgKHIgPT09IDE4MClcbiAgICAgICAgcmV0dXJuIHsgeDogeCAtIHcgKyBiLCB5OiB5IC0gaCArIGIsIHdpZHRoOiB3LCBoZWlnaHQ6IGggfTtcbiAgICBlbHNlIGlmIChyID09PSAyNzApXG4gICAgICAgIHJldHVybiB7IHg6IHggLSBiLCB5OiB5IC0gdyArIGIsIHdpZHRoOiBoLCBoZWlnaHQ6IHcgfTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiB7IHg6IHggLSBiLCB5OiB5IC0gYiwgd2lkdGg6IHcsIGhlaWdodDogaCB9O1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJvdGF0aW9ucy5qcy5tYXAiLCJleHBvcnQgdmFyIFBhZ2VTaXplcyA9IHtcbiAgICAnNEEwJzogWzQ3NjcuODcsIDY3NDAuNzldLFxuICAgICcyQTAnOiBbMzM3MC4zOSwgNDc2Ny44N10sXG4gICAgQTA6IFsyMzgzLjk0LCAzMzcwLjM5XSxcbiAgICBBMTogWzE2ODMuNzgsIDIzODMuOTRdLFxuICAgIEEyOiBbMTE5MC41NSwgMTY4My43OF0sXG4gICAgQTM6IFs4NDEuODksIDExOTAuNTVdLFxuICAgIEE0OiBbNTk1LjI4LCA4NDEuODldLFxuICAgIEE1OiBbNDE5LjUzLCA1OTUuMjhdLFxuICAgIEE2OiBbMjk3LjY0LCA0MTkuNTNdLFxuICAgIEE3OiBbMjA5Ljc2LCAyOTcuNjRdLFxuICAgIEE4OiBbMTQ3LjQsIDIwOS43Nl0sXG4gICAgQTk6IFsxMDQuODgsIDE0Ny40XSxcbiAgICBBMTA6IFs3My43LCAxMDQuODhdLFxuICAgIEIwOiBbMjgzNC42NSwgNDAwOC4xOV0sXG4gICAgQjE6IFsyMDA0LjA5LCAyODM0LjY1XSxcbiAgICBCMjogWzE0MTcuMzIsIDIwMDQuMDldLFxuICAgIEIzOiBbMTAwMC42MywgMTQxNy4zMl0sXG4gICAgQjQ6IFs3MDguNjYsIDEwMDAuNjNdLFxuICAgIEI1OiBbNDk4LjksIDcwOC42Nl0sXG4gICAgQjY6IFszNTQuMzMsIDQ5OC45XSxcbiAgICBCNzogWzI0OS40NSwgMzU0LjMzXSxcbiAgICBCODogWzE3NS43NSwgMjQ5LjQ1XSxcbiAgICBCOTogWzEyNC43MiwgMTc1Ljc1XSxcbiAgICBCMTA6IFs4Ny44NywgMTI0LjcyXSxcbiAgICBDMDogWzI1OTkuMzcsIDM2NzYuNTRdLFxuICAgIEMxOiBbMTgzNi44NSwgMjU5OS4zN10sXG4gICAgQzI6IFsxMjk4LjI3LCAxODM2Ljg1XSxcbiAgICBDMzogWzkxOC40MywgMTI5OC4yN10sXG4gICAgQzQ6IFs2NDkuMTMsIDkxOC40M10sXG4gICAgQzU6IFs0NTkuMjEsIDY0OS4xM10sXG4gICAgQzY6IFszMjMuMTUsIDQ1OS4yMV0sXG4gICAgQzc6IFsyMjkuNjEsIDMyMy4xNV0sXG4gICAgQzg6IFsxNjEuNTcsIDIyOS42MV0sXG4gICAgQzk6IFsxMTMuMzksIDE2MS41N10sXG4gICAgQzEwOiBbNzkuMzcsIDExMy4zOV0sXG4gICAgUkEwOiBbMjQzNy44LCAzNDU4LjI3XSxcbiAgICBSQTE6IFsxNzI5LjEzLCAyNDM3LjhdLFxuICAgIFJBMjogWzEyMTguOSwgMTcyOS4xM10sXG4gICAgUkEzOiBbODY0LjU3LCAxMjE4LjldLFxuICAgIFJBNDogWzYwOS40NSwgODY0LjU3XSxcbiAgICBTUkEwOiBbMjU1MS4xOCwgMzYyOC4zNV0sXG4gICAgU1JBMTogWzE4MTQuMTcsIDI1NTEuMThdLFxuICAgIFNSQTI6IFsxMjc1LjU5LCAxODE0LjE3XSxcbiAgICBTUkEzOiBbOTA3LjA5LCAxMjc1LjU5XSxcbiAgICBTUkE0OiBbNjM3LjgsIDkwNy4wOV0sXG4gICAgRXhlY3V0aXZlOiBbNTIxLjg2LCA3NTYuMF0sXG4gICAgRm9saW86IFs2MTIuMCwgOTM2LjBdLFxuICAgIExlZ2FsOiBbNjEyLjAsIDEwMDguMF0sXG4gICAgTGV0dGVyOiBbNjEyLjAsIDc5Mi4wXSxcbiAgICBUYWJsb2lkOiBbNzkyLjAsIDEyMjQuMF0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2l6ZXMuanMubWFwIiwiLy8gT3JpZ2luYXRlZCBmcm9tIHBkZmtpdCBDb3B5cmlnaHQgKGMpIDIwMTQgRGV2b24gR292ZXR0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQvYmxvYi8xZTYyZTZmZmUyNGIzNzhlYjg5MGRmNTA3YTQ3NjEwZjRjNGE3YjI0L2xpYi9wYXRoLmpzXG4vLyBNSVQgTElDRU5TRVxuLy8gVXBkYXRlZCBmb3IgcGRmLWxpYiAmIFR5cGVTY3JpcHQgYnkgSmVyZW15IE1lc3NlbmdlclxuaW1wb3J0IHsgYXBwZW5kQmV6aWVyQ3VydmUsIGFwcGVuZFF1YWRyYXRpY0N1cnZlLCBjbG9zZVBhdGgsIGxpbmVUbywgbW92ZVRvLCB9IGZyb20gXCIuL29wZXJhdG9yc1wiO1xudmFyIGN4ID0gMDtcbnZhciBjeSA9IDA7XG52YXIgcHggPSAwO1xudmFyIHB5ID0gMDtcbnZhciBzeCA9IDA7XG52YXIgc3kgPSAwO1xudmFyIHBhcmFtZXRlcnMgPSBuZXcgTWFwKFtcbiAgICBbJ0EnLCA3XSxcbiAgICBbJ2EnLCA3XSxcbiAgICBbJ0MnLCA2XSxcbiAgICBbJ2MnLCA2XSxcbiAgICBbJ0gnLCAxXSxcbiAgICBbJ2gnLCAxXSxcbiAgICBbJ0wnLCAyXSxcbiAgICBbJ2wnLCAyXSxcbiAgICBbJ00nLCAyXSxcbiAgICBbJ20nLCAyXSxcbiAgICBbJ1EnLCA0XSxcbiAgICBbJ3EnLCA0XSxcbiAgICBbJ1MnLCA0XSxcbiAgICBbJ3MnLCA0XSxcbiAgICBbJ1QnLCAyXSxcbiAgICBbJ3QnLCAyXSxcbiAgICBbJ1YnLCAxXSxcbiAgICBbJ3YnLCAxXSxcbiAgICBbJ1onLCAwXSxcbiAgICBbJ3onLCAwXSxcbl0pO1xudmFyIHBhcnNlID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICB2YXIgY21kO1xuICAgIHZhciByZXQgPSBbXTtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBjdXJBcmcgPSAnJztcbiAgICB2YXIgZm91bmREZWNpbWFsID0gZmFsc2U7XG4gICAgdmFyIHBhcmFtcyA9IDA7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBwYXRoXzEgPSBwYXRoOyBfaSA8IHBhdGhfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGMgPSBwYXRoXzFbX2ldO1xuICAgICAgICBpZiAocGFyYW1ldGVycy5oYXMoYykpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtZXRlcnMuZ2V0KGMpO1xuICAgICAgICAgICAgaWYgKGNtZCkge1xuICAgICAgICAgICAgICAgIC8vIHNhdmUgZXhpc3RpbmcgY29tbWFuZFxuICAgICAgICAgICAgICAgIGlmIChjdXJBcmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzW2FyZ3MubGVuZ3RoXSA9ICtjdXJBcmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldFtyZXQubGVuZ3RoXSA9IHsgY21kOiBjbWQsIGFyZ3M6IGFyZ3MgfTtcbiAgICAgICAgICAgICAgICBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgY3VyQXJnID0gJyc7XG4gICAgICAgICAgICAgICAgZm91bmREZWNpbWFsID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbWQgPSBjO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFsnICcsICcsJ10uaW5jbHVkZXMoYykgfHxcbiAgICAgICAgICAgIChjID09PSAnLScgJiYgY3VyQXJnLmxlbmd0aCA+IDAgJiYgY3VyQXJnW2N1ckFyZy5sZW5ndGggLSAxXSAhPT0gJ2UnKSB8fFxuICAgICAgICAgICAgKGMgPT09ICcuJyAmJiBmb3VuZERlY2ltYWwpKSB7XG4gICAgICAgICAgICBpZiAoY3VyQXJnLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSBwYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgcmV1c2VkIGNvbW1hbmRzXG4gICAgICAgICAgICAgICAgcmV0W3JldC5sZW5ndGhdID0geyBjbWQ6IGNtZCwgYXJnczogYXJncyB9O1xuICAgICAgICAgICAgICAgIGFyZ3MgPSBbK2N1ckFyZ107XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGFzc3VtZWQgY29tbWFuZHNcbiAgICAgICAgICAgICAgICBpZiAoY21kID09PSAnTScpIHtcbiAgICAgICAgICAgICAgICAgICAgY21kID0gJ0wnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY21kID09PSAnbScpIHtcbiAgICAgICAgICAgICAgICAgICAgY21kID0gJ2wnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFyZ3NbYXJncy5sZW5ndGhdID0gK2N1ckFyZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvdW5kRGVjaW1hbCA9IGMgPT09ICcuJztcbiAgICAgICAgICAgIC8vIGZpeCBmb3IgbmVnYXRpdmUgbnVtYmVycyBvciByZXBlYXRlZCBkZWNpbWFscyB3aXRoIG5vIGRlbGltZXRlciBiZXR3ZWVuIGNvbW1hbmRzXG4gICAgICAgICAgICBjdXJBcmcgPSBbJy0nLCAnLiddLmluY2x1ZGVzKGMpID8gYyA6ICcnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VyQXJnICs9IGM7XG4gICAgICAgICAgICBpZiAoYyA9PT0gJy4nKSB7XG4gICAgICAgICAgICAgICAgZm91bmREZWNpbWFsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgdGhlIGxhc3QgY29tbWFuZFxuICAgIGlmIChjdXJBcmcubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IHBhcmFtcykge1xuICAgICAgICAgICAgLy8gaGFuZGxlIHJldXNlZCBjb21tYW5kc1xuICAgICAgICAgICAgcmV0W3JldC5sZW5ndGhdID0geyBjbWQ6IGNtZCwgYXJnczogYXJncyB9O1xuICAgICAgICAgICAgYXJncyA9IFsrY3VyQXJnXTtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBhc3N1bWVkIGNvbW1hbmRzXG4gICAgICAgICAgICBpZiAoY21kID09PSAnTScpIHtcbiAgICAgICAgICAgICAgICBjbWQgPSAnTCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY21kID09PSAnbScpIHtcbiAgICAgICAgICAgICAgICBjbWQgPSAnbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhcmdzW2FyZ3MubGVuZ3RoXSA9ICtjdXJBcmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0W3JldC5sZW5ndGhdID0geyBjbWQ6IGNtZCwgYXJnczogYXJncyB9O1xuICAgIHJldHVybiByZXQ7XG59O1xudmFyIGFwcGx5ID0gZnVuY3Rpb24gKGNvbW1hbmRzKSB7XG4gICAgLy8gY3VycmVudCBwb2ludCwgY29udHJvbCBwb2ludCwgYW5kIHN1YnBhdGggc3RhcnRpbmcgcG9pbnRcbiAgICBjeCA9IGN5ID0gcHggPSBweSA9IHN4ID0gc3kgPSAwO1xuICAgIC8vIHJ1biB0aGUgY29tbWFuZHNcbiAgICB2YXIgY21kcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGMgPSBjb21tYW5kc1tpXTtcbiAgICAgICAgaWYgKGMuY21kICYmIHR5cGVvZiBydW5uZXJzW2MuY21kXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGNtZCA9IHJ1bm5lcnNbYy5jbWRdKGMuYXJncyk7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjbWQpKSB7XG4gICAgICAgICAgICAgICAgY21kcyA9IGNtZHMuY29uY2F0KGNtZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbWRzLnB1c2goY21kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY21kcztcbn07XG52YXIgcnVubmVycyA9IHtcbiAgICBNOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCA9IGFbMF07XG4gICAgICAgIGN5ID0gYVsxXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHN4ID0gY3g7XG4gICAgICAgIHN5ID0gY3k7XG4gICAgICAgIHJldHVybiBtb3ZlVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIG06IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN4ICs9IGFbMF07XG4gICAgICAgIGN5ICs9IGFbMV07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICBzeCA9IGN4O1xuICAgICAgICBzeSA9IGN5O1xuICAgICAgICByZXR1cm4gbW92ZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBDOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeCA9IGFbNF07XG4gICAgICAgIGN5ID0gYVs1XTtcbiAgICAgICAgcHggPSBhWzJdO1xuICAgICAgICBweSA9IGFbM107XG4gICAgICAgIHJldHVybiBhcHBlbmRCZXppZXJDdXJ2ZShhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdKTtcbiAgICB9LFxuICAgIGM6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciBjbWQgPSBhcHBlbmRCZXppZXJDdXJ2ZShhWzBdICsgY3gsIGFbMV0gKyBjeSwgYVsyXSArIGN4LCBhWzNdICsgY3ksIGFbNF0gKyBjeCwgYVs1XSArIGN5KTtcbiAgICAgICAgcHggPSBjeCArIGFbMl07XG4gICAgICAgIHB5ID0gY3kgKyBhWzNdO1xuICAgICAgICBjeCArPSBhWzRdO1xuICAgICAgICBjeSArPSBhWzVdO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG4gICAgUzogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgaWYgKHB4ID09PSBudWxsIHx8IHB5ID09PSBudWxsKSB7XG4gICAgICAgICAgICBweCA9IGN4O1xuICAgICAgICAgICAgcHkgPSBjeTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY21kID0gYXBwZW5kQmV6aWVyQ3VydmUoY3ggLSAocHggLSBjeCksIGN5IC0gKHB5IC0gY3kpLCBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTtcbiAgICAgICAgcHggPSBhWzBdO1xuICAgICAgICBweSA9IGFbMV07XG4gICAgICAgIGN4ID0gYVsyXTtcbiAgICAgICAgY3kgPSBhWzNdO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG4gICAgczogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgaWYgKHB4ID09PSBudWxsIHx8IHB5ID09PSBudWxsKSB7XG4gICAgICAgICAgICBweCA9IGN4O1xuICAgICAgICAgICAgcHkgPSBjeTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY21kID0gYXBwZW5kQmV6aWVyQ3VydmUoY3ggLSAocHggLSBjeCksIGN5IC0gKHB5IC0gY3kpLCBjeCArIGFbMF0sIGN5ICsgYVsxXSwgY3ggKyBhWzJdLCBjeSArIGFbM10pO1xuICAgICAgICBweCA9IGN4ICsgYVswXTtcbiAgICAgICAgcHkgPSBjeSArIGFbMV07XG4gICAgICAgIGN4ICs9IGFbMl07XG4gICAgICAgIGN5ICs9IGFbM107XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbiAgICBROiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBweCA9IGFbMF07XG4gICAgICAgIHB5ID0gYVsxXTtcbiAgICAgICAgY3ggPSBhWzJdO1xuICAgICAgICBjeSA9IGFbM107XG4gICAgICAgIHJldHVybiBhcHBlbmRRdWFkcmF0aWNDdXJ2ZShhWzBdLCBhWzFdLCBjeCwgY3kpO1xuICAgIH0sXG4gICAgcTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdmFyIGNtZCA9IGFwcGVuZFF1YWRyYXRpY0N1cnZlKGFbMF0gKyBjeCwgYVsxXSArIGN5LCBhWzJdICsgY3gsIGFbM10gKyBjeSk7XG4gICAgICAgIHB4ID0gY3ggKyBhWzBdO1xuICAgICAgICBweSA9IGN5ICsgYVsxXTtcbiAgICAgICAgY3ggKz0gYVsyXTtcbiAgICAgICAgY3kgKz0gYVszXTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxuICAgIFQ6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGlmIChweCA9PT0gbnVsbCB8fCBweSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcHggPSBjeDtcbiAgICAgICAgICAgIHB5ID0gY3k7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBweCA9IGN4IC0gKHB4IC0gY3gpO1xuICAgICAgICAgICAgcHkgPSBjeSAtIChweSAtIGN5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY21kID0gYXBwZW5kUXVhZHJhdGljQ3VydmUocHgsIHB5LCBhWzBdLCBhWzFdKTtcbiAgICAgICAgcHggPSBjeCAtIChweCAtIGN4KTtcbiAgICAgICAgcHkgPSBjeSAtIChweSAtIGN5KTtcbiAgICAgICAgY3ggPSBhWzBdO1xuICAgICAgICBjeSA9IGFbMV07XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbiAgICB0OiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBpZiAocHggPT09IG51bGwgfHwgcHkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHB4ID0gY3g7XG4gICAgICAgICAgICBweSA9IGN5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHggPSBjeCAtIChweCAtIGN4KTtcbiAgICAgICAgICAgIHB5ID0gY3kgLSAocHkgLSBjeSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNtZCA9IGFwcGVuZFF1YWRyYXRpY0N1cnZlKHB4LCBweSwgY3ggKyBhWzBdLCBjeSArIGFbMV0pO1xuICAgICAgICBjeCArPSBhWzBdO1xuICAgICAgICBjeSArPSBhWzFdO1xuICAgICAgICByZXR1cm4gY21kO1xuICAgIH0sXG4gICAgQTogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdmFyIGNtZHMgPSBzb2x2ZUFyYyhjeCwgY3ksIGEpO1xuICAgICAgICBjeCA9IGFbNV07XG4gICAgICAgIGN5ID0gYVs2XTtcbiAgICAgICAgcmV0dXJuIGNtZHM7XG4gICAgfSxcbiAgICBhOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBhWzVdICs9IGN4O1xuICAgICAgICBhWzZdICs9IGN5O1xuICAgICAgICB2YXIgY21kcyA9IHNvbHZlQXJjKGN4LCBjeSwgYSk7XG4gICAgICAgIGN4ID0gYVs1XTtcbiAgICAgICAgY3kgPSBhWzZdO1xuICAgICAgICByZXR1cm4gY21kcztcbiAgICB9LFxuICAgIEw6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN4ID0gYVswXTtcbiAgICAgICAgY3kgPSBhWzFdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxpbmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgbDogZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgY3ggKz0gYVswXTtcbiAgICAgICAgY3kgKz0gYVsxXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHJldHVybiBsaW5lVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIEg6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN4ID0gYVswXTtcbiAgICAgICAgcHggPSBweSA9IG51bGw7XG4gICAgICAgIHJldHVybiBsaW5lVG8oY3gsIGN5KTtcbiAgICB9LFxuICAgIGg6IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGN4ICs9IGFbMF07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICByZXR1cm4gbGluZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICBWOiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeSA9IGFbMF07XG4gICAgICAgIHB4ID0gcHkgPSBudWxsO1xuICAgICAgICByZXR1cm4gbGluZVRvKGN4LCBjeSk7XG4gICAgfSxcbiAgICB2OiBmdW5jdGlvbiAoYSkge1xuICAgICAgICBjeSArPSBhWzBdO1xuICAgICAgICBweCA9IHB5ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGxpbmVUbyhjeCwgY3kpO1xuICAgIH0sXG4gICAgWjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY21kID0gY2xvc2VQYXRoKCk7XG4gICAgICAgIGN4ID0gc3g7XG4gICAgICAgIGN5ID0gc3k7XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfSxcbiAgICB6OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjbWQgPSBjbG9zZVBhdGgoKTtcbiAgICAgICAgY3ggPSBzeDtcbiAgICAgICAgY3kgPSBzeTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9LFxufTtcbnZhciBzb2x2ZUFyYyA9IGZ1bmN0aW9uICh4LCB5LCBjb29yZHMpIHtcbiAgICB2YXIgcnggPSBjb29yZHNbMF0sIHJ5ID0gY29vcmRzWzFdLCByb3QgPSBjb29yZHNbMl0sIGxhcmdlID0gY29vcmRzWzNdLCBzd2VlcCA9IGNvb3Jkc1s0XSwgZXggPSBjb29yZHNbNV0sIGV5ID0gY29vcmRzWzZdO1xuICAgIHZhciBzZWdzID0gYXJjVG9TZWdtZW50cyhleCwgZXksIHJ4LCByeSwgbGFyZ2UsIHN3ZWVwLCByb3QsIHgsIHkpO1xuICAgIHZhciBjbWRzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwLCBzZWdzXzEgPSBzZWdzOyBfaSA8IHNlZ3NfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHNlZyA9IHNlZ3NfMVtfaV07XG4gICAgICAgIHZhciBiZXogPSBzZWdtZW50VG9CZXppZXIuYXBwbHkodm9pZCAwLCBzZWcpO1xuICAgICAgICBjbWRzLnB1c2goYXBwZW5kQmV6aWVyQ3VydmUuYXBwbHkodm9pZCAwLCBiZXopKTtcbiAgICB9XG4gICAgcmV0dXJuIGNtZHM7XG59O1xuLy8gZnJvbSBJbmtzY2FwZSBzdmd0b3BkZiwgdGhhbmtzIVxudmFyIGFyY1RvU2VnbWVudHMgPSBmdW5jdGlvbiAoeCwgeSwgcngsIHJ5LCBsYXJnZSwgc3dlZXAsIHJvdGF0ZVgsIG94LCBveSkge1xuICAgIHZhciB0aCA9IHJvdGF0ZVggKiAoTWF0aC5QSSAvIDE4MCk7XG4gICAgdmFyIHNpblRoID0gTWF0aC5zaW4odGgpO1xuICAgIHZhciBjb3NUaCA9IE1hdGguY29zKHRoKTtcbiAgICByeCA9IE1hdGguYWJzKHJ4KTtcbiAgICByeSA9IE1hdGguYWJzKHJ5KTtcbiAgICBweCA9IGNvc1RoICogKG94IC0geCkgKiAwLjUgKyBzaW5UaCAqIChveSAtIHkpICogMC41O1xuICAgIHB5ID0gY29zVGggKiAob3kgLSB5KSAqIDAuNSAtIHNpblRoICogKG94IC0geCkgKiAwLjU7XG4gICAgdmFyIHBsID0gKHB4ICogcHgpIC8gKHJ4ICogcngpICsgKHB5ICogcHkpIC8gKHJ5ICogcnkpO1xuICAgIGlmIChwbCA+IDEpIHtcbiAgICAgICAgcGwgPSBNYXRoLnNxcnQocGwpO1xuICAgICAgICByeCAqPSBwbDtcbiAgICAgICAgcnkgKj0gcGw7XG4gICAgfVxuICAgIHZhciBhMDAgPSBjb3NUaCAvIHJ4O1xuICAgIHZhciBhMDEgPSBzaW5UaCAvIHJ4O1xuICAgIHZhciBhMTAgPSAtc2luVGggLyByeTtcbiAgICB2YXIgYTExID0gY29zVGggLyByeTtcbiAgICB2YXIgeDAgPSBhMDAgKiBveCArIGEwMSAqIG95O1xuICAgIHZhciB5MCA9IGExMCAqIG94ICsgYTExICogb3k7XG4gICAgdmFyIHgxID0gYTAwICogeCArIGEwMSAqIHk7XG4gICAgdmFyIHkxID0gYTEwICogeCArIGExMSAqIHk7XG4gICAgdmFyIGQgPSAoeDEgLSB4MCkgKiAoeDEgLSB4MCkgKyAoeTEgLSB5MCkgKiAoeTEgLSB5MCk7XG4gICAgdmFyIHNmYWN0b3JTcSA9IDEgLyBkIC0gMC4yNTtcbiAgICBpZiAoc2ZhY3RvclNxIDwgMCkge1xuICAgICAgICBzZmFjdG9yU3EgPSAwO1xuICAgIH1cbiAgICB2YXIgc2ZhY3RvciA9IE1hdGguc3FydChzZmFjdG9yU3EpO1xuICAgIGlmIChzd2VlcCA9PT0gbGFyZ2UpIHtcbiAgICAgICAgc2ZhY3RvciA9IC1zZmFjdG9yO1xuICAgIH1cbiAgICB2YXIgeGMgPSAwLjUgKiAoeDAgKyB4MSkgLSBzZmFjdG9yICogKHkxIC0geTApO1xuICAgIHZhciB5YyA9IDAuNSAqICh5MCArIHkxKSArIHNmYWN0b3IgKiAoeDEgLSB4MCk7XG4gICAgdmFyIHRoMCA9IE1hdGguYXRhbjIoeTAgLSB5YywgeDAgLSB4Yyk7XG4gICAgdmFyIHRoMSA9IE1hdGguYXRhbjIoeTEgLSB5YywgeDEgLSB4Yyk7XG4gICAgdmFyIHRoQXJjID0gdGgxIC0gdGgwO1xuICAgIGlmICh0aEFyYyA8IDAgJiYgc3dlZXAgPT09IDEpIHtcbiAgICAgICAgdGhBcmMgKz0gMiAqIE1hdGguUEk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoQXJjID4gMCAmJiBzd2VlcCA9PT0gMCkge1xuICAgICAgICB0aEFyYyAtPSAyICogTWF0aC5QSTtcbiAgICB9XG4gICAgdmFyIHNlZ21lbnRzID0gTWF0aC5jZWlsKE1hdGguYWJzKHRoQXJjIC8gKE1hdGguUEkgKiAwLjUgKyAwLjAwMSkpKTtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50czsgaSsrKSB7XG4gICAgICAgIHZhciB0aDIgPSB0aDAgKyAoaSAqIHRoQXJjKSAvIHNlZ21lbnRzO1xuICAgICAgICB2YXIgdGgzID0gdGgwICsgKChpICsgMSkgKiB0aEFyYykgLyBzZWdtZW50cztcbiAgICAgICAgcmVzdWx0W2ldID0gW3hjLCB5YywgdGgyLCB0aDMsIHJ4LCByeSwgc2luVGgsIGNvc1RoXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgc2VnbWVudFRvQmV6aWVyID0gZnVuY3Rpb24gKGN4MSwgY3kxLCB0aDAsIHRoMSwgcngsIHJ5LCBzaW5UaCwgY29zVGgpIHtcbiAgICB2YXIgYTAwID0gY29zVGggKiByeDtcbiAgICB2YXIgYTAxID0gLXNpblRoICogcnk7XG4gICAgdmFyIGExMCA9IHNpblRoICogcng7XG4gICAgdmFyIGExMSA9IGNvc1RoICogcnk7XG4gICAgdmFyIHRoSGFsZiA9IDAuNSAqICh0aDEgLSB0aDApO1xuICAgIHZhciB0ID0gKCg4IC8gMykgKiBNYXRoLnNpbih0aEhhbGYgKiAwLjUpICogTWF0aC5zaW4odGhIYWxmICogMC41KSkgL1xuICAgICAgICBNYXRoLnNpbih0aEhhbGYpO1xuICAgIHZhciB4MSA9IGN4MSArIE1hdGguY29zKHRoMCkgLSB0ICogTWF0aC5zaW4odGgwKTtcbiAgICB2YXIgeTEgPSBjeTEgKyBNYXRoLnNpbih0aDApICsgdCAqIE1hdGguY29zKHRoMCk7XG4gICAgdmFyIHgzID0gY3gxICsgTWF0aC5jb3ModGgxKTtcbiAgICB2YXIgeTMgPSBjeTEgKyBNYXRoLnNpbih0aDEpO1xuICAgIHZhciB4MiA9IHgzICsgdCAqIE1hdGguc2luKHRoMSk7XG4gICAgdmFyIHkyID0geTMgLSB0ICogTWF0aC5jb3ModGgxKTtcbiAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICBhMDAgKiB4MSArIGEwMSAqIHkxLFxuICAgICAgICBhMTAgKiB4MSArIGExMSAqIHkxLFxuICAgICAgICBhMDAgKiB4MiArIGEwMSAqIHkyLFxuICAgICAgICBhMTAgKiB4MiArIGExMSAqIHkyLFxuICAgICAgICBhMDAgKiB4MyArIGEwMSAqIHkzLFxuICAgICAgICBhMTAgKiB4MyArIGExMSAqIHkzLFxuICAgIF07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgdmFyIHN2Z1BhdGhUb09wZXJhdG9ycyA9IGZ1bmN0aW9uIChwYXRoKSB7IHJldHVybiBhcHBseShwYXJzZShwYXRoKSk7IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdmdQYXRoLmpzLm1hcCIsImV4cG9ydCB2YXIgVGV4dEFsaWdubWVudDtcbihmdW5jdGlvbiAoVGV4dEFsaWdubWVudCkge1xuICAgIFRleHRBbGlnbm1lbnRbVGV4dEFsaWdubWVudFtcIkxlZnRcIl0gPSAwXSA9IFwiTGVmdFwiO1xuICAgIFRleHRBbGlnbm1lbnRbVGV4dEFsaWdubWVudFtcIkNlbnRlclwiXSA9IDFdID0gXCJDZW50ZXJcIjtcbiAgICBUZXh0QWxpZ25tZW50W1RleHRBbGlnbm1lbnRbXCJSaWdodFwiXSA9IDJdID0gXCJSaWdodFwiO1xufSkoVGV4dEFsaWdubWVudCB8fCAoVGV4dEFsaWdubWVudCA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGlnbm1lbnQuanMubWFwIiwiZXhwb3J0ICogZnJvbSBcIi4vYWxpZ25tZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sYXlvdXRcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IENvbWJlZFRleHRMYXlvdXRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IFRleHRBbGlnbm1lbnQgfSBmcm9tIFwiLi9hbGlnbm1lbnRcIjtcbmltcG9ydCB7IGNsZWFuVGV4dCwgbGluZVNwbGl0LCBtZXJnZUxpbmVzLCBjaGFyQXRJbmRleCwgY2hhclNwbGl0LCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIE1JTl9GT05UX1NJWkUgPSA0O1xudmFyIE1BWF9GT05UX1NJWkUgPSA1MDA7XG52YXIgY29tcHV0ZUZvbnRTaXplID0gZnVuY3Rpb24gKGxpbmVzLCBmb250LCBib3VuZHMsIG11bHRpbGluZSkge1xuICAgIGlmIChtdWx0aWxpbmUgPT09IHZvaWQgMCkgeyBtdWx0aWxpbmUgPSBmYWxzZTsgfVxuICAgIHZhciBmb250U2l6ZSA9IE1JTl9GT05UX1NJWkU7XG4gICAgd2hpbGUgKGZvbnRTaXplIDwgTUFYX0ZPTlRfU0laRSkge1xuICAgICAgICB2YXIgbGluZXNVc2VkID0gMDtcbiAgICAgICAgZm9yICh2YXIgbGluZUlkeCA9IDAsIGxpbmVMZW4gPSBsaW5lcy5sZW5ndGg7IGxpbmVJZHggPCBsaW5lTGVuOyBsaW5lSWR4KyspIHtcbiAgICAgICAgICAgIGxpbmVzVXNlZCArPSAxO1xuICAgICAgICAgICAgdmFyIGxpbmUgPSBsaW5lc1tsaW5lSWR4XTtcbiAgICAgICAgICAgIHZhciB3b3JkcyA9IGxpbmUuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgIC8vIExheW91dCB0aGUgd29yZHMgdXNpbmcgdGhlIGN1cnJlbnQgYGZvbnRTaXplYCwgbGluZSB3cmFwcGluZ1xuICAgICAgICAgICAgLy8gd2hlbmV2ZXIgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLlxuICAgICAgICAgICAgdmFyIHNwYWNlSW5MaW5lUmVtYWluaW5nID0gYm91bmRzLndpZHRoO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd29yZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzTGFzdFdvcmQgPSBpZHggPT09IGxlbiAtIDE7XG4gICAgICAgICAgICAgICAgdmFyIHdvcmQgPSBpc0xhc3RXb3JkID8gd29yZHNbaWR4XSA6IHdvcmRzW2lkeF0gKyAnICc7XG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoT2ZXb3JkID0gZm9udC53aWR0aE9mVGV4dEF0U2l6ZSh3b3JkLCBmb250U2l6ZSk7XG4gICAgICAgICAgICAgICAgc3BhY2VJbkxpbmVSZW1haW5pbmcgLT0gd2lkdGhPZldvcmQ7XG4gICAgICAgICAgICAgICAgaWYgKHNwYWNlSW5MaW5lUmVtYWluaW5nIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZXNVc2VkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIHNwYWNlSW5MaW5lUmVtYWluaW5nID0gYm91bmRzLndpZHRoIC0gd2lkdGhPZldvcmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiBpZiB3ZSBleGNlZWRlZCB0aGUgYWxsb3dlZCB3aWR0aFxuICAgICAgICBpZiAoIW11bHRpbGluZSAmJiBsaW5lc1VzZWQgPiBsaW5lcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZm9udFNpemUgLSAxO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gZm9udC5oZWlnaHRBdFNpemUoZm9udFNpemUpO1xuICAgICAgICB2YXIgbGluZUhlaWdodCA9IGhlaWdodCArIGhlaWdodCAqIDAuMjtcbiAgICAgICAgdmFyIHRvdGFsSGVpZ2h0ID0gbGluZUhlaWdodCAqIGxpbmVzVXNlZDtcbiAgICAgICAgLy8gUmV0dXJuIGlmIHdlIGV4Y2VlZGVkIHRoZSBhbGxvd2VkIGhlaWdodFxuICAgICAgICBpZiAodG90YWxIZWlnaHQgPiBNYXRoLmFicyhib3VuZHMuaGVpZ2h0KSlcbiAgICAgICAgICAgIHJldHVybiBmb250U2l6ZSAtIDE7XG4gICAgICAgIGZvbnRTaXplICs9IDE7XG4gICAgfVxuICAgIHJldHVybiBmb250U2l6ZTtcbn07XG52YXIgY29tcHV0ZUNvbWJlZEZvbnRTaXplID0gZnVuY3Rpb24gKGxpbmUsIGZvbnQsIGJvdW5kcywgY2VsbENvdW50KSB7XG4gICAgdmFyIGNlbGxXaWR0aCA9IGJvdW5kcy53aWR0aCAvIGNlbGxDb3VudDtcbiAgICB2YXIgY2VsbEhlaWdodCA9IGJvdW5kcy5oZWlnaHQ7XG4gICAgdmFyIGZvbnRTaXplID0gTUlOX0ZPTlRfU0laRTtcbiAgICB2YXIgY2hhcnMgPSBjaGFyU3BsaXQobGluZSk7XG4gICAgd2hpbGUgKGZvbnRTaXplIDwgTUFYX0ZPTlRfU0laRSkge1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBjaGFycy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBjID0gY2hhcnNbaWR4XTtcbiAgICAgICAgICAgIHZhciB0b29Mb25nID0gZm9udC53aWR0aE9mVGV4dEF0U2l6ZShjLCBmb250U2l6ZSkgPiBjZWxsV2lkdGggKiAwLjc1O1xuICAgICAgICAgICAgaWYgKHRvb0xvbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvbnRTaXplIC0gMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaGVpZ2h0ID0gZm9udC5oZWlnaHRBdFNpemUoZm9udFNpemUsIHsgZGVzY2VuZGVyOiBmYWxzZSB9KTtcbiAgICAgICAgaWYgKGhlaWdodCA+IGNlbGxIZWlnaHQpXG4gICAgICAgICAgICByZXR1cm4gZm9udFNpemUgLSAxO1xuICAgICAgICBmb250U2l6ZSArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gZm9udFNpemU7XG59O1xudmFyIGxhc3RJbmRleE9mV2hpdGVzcGFjZSA9IGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgZm9yICh2YXIgaWR4ID0gbGluZS5sZW5ndGg7IGlkeCA+IDA7IGlkeC0tKSB7XG4gICAgICAgIGlmICgvXFxzLy50ZXN0KGxpbmVbaWR4XSkpXG4gICAgICAgICAgICByZXR1cm4gaWR4O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbnZhciBzcGxpdE91dExpbmVzID0gZnVuY3Rpb24gKGlucHV0LCBtYXhXaWR0aCwgZm9udCwgZm9udFNpemUpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGxhc3RXaGl0ZXNwYWNlSWR4ID0gaW5wdXQubGVuZ3RoO1xuICAgIHdoaWxlIChsYXN0V2hpdGVzcGFjZUlkeCA+IDApIHtcbiAgICAgICAgdmFyIGxpbmUgPSBpbnB1dC5zdWJzdHJpbmcoMCwgbGFzdFdoaXRlc3BhY2VJZHgpO1xuICAgICAgICB2YXIgZW5jb2RlZCA9IGZvbnQuZW5jb2RlVGV4dChsaW5lKTtcbiAgICAgICAgdmFyIHdpZHRoID0gZm9udC53aWR0aE9mVGV4dEF0U2l6ZShsaW5lLCBmb250U2l6ZSk7XG4gICAgICAgIGlmICh3aWR0aCA8IG1heFdpZHRoKSB7XG4gICAgICAgICAgICB2YXIgcmVtYWluZGVyID0gaW5wdXQuc3Vic3RyaW5nKGxhc3RXaGl0ZXNwYWNlSWR4KSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4geyBsaW5lOiBsaW5lLCBlbmNvZGVkOiBlbmNvZGVkLCB3aWR0aDogd2lkdGgsIHJlbWFpbmRlcjogcmVtYWluZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFdoaXRlc3BhY2VJZHggPSAoX2EgPSBsYXN0SW5kZXhPZldoaXRlc3BhY2UobGluZSkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgfVxuICAgIC8vIFdlIHdlcmUgdW5hYmxlIHRvIHNwbGl0IHRoZSBpbnB1dCBlbm91Z2ggdG8gZ2V0IGEgY2h1bmsgdGhhdCB3b3VsZCBmaXRcbiAgICAvLyB3aXRoaW4gdGhlIHNwZWNpZmllZCBgbWF4V2lkdGhgIHNvIHdlJ2xsIGp1c3QgcmV0dXJuIGV2ZXJ5dGhpbmdcbiAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBpbnB1dCxcbiAgICAgICAgZW5jb2RlZDogZm9udC5lbmNvZGVUZXh0KGlucHV0KSxcbiAgICAgICAgd2lkdGg6IGZvbnQud2lkdGhPZlRleHRBdFNpemUoaW5wdXQsIGZvbnRTaXplKSxcbiAgICAgICAgcmVtYWluZGVyOiB1bmRlZmluZWQsXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIGxheW91dE11bHRpbGluZVRleHQgPSBmdW5jdGlvbiAodGV4dCwgX2EpIHtcbiAgICB2YXIgYWxpZ25tZW50ID0gX2EuYWxpZ25tZW50LCBmb250U2l6ZSA9IF9hLmZvbnRTaXplLCBmb250ID0gX2EuZm9udCwgYm91bmRzID0gX2EuYm91bmRzO1xuICAgIHZhciBsaW5lcyA9IGxpbmVTcGxpdChjbGVhblRleHQodGV4dCkpO1xuICAgIGlmIChmb250U2l6ZSA9PT0gdW5kZWZpbmVkIHx8IGZvbnRTaXplID09PSAwKSB7XG4gICAgICAgIGZvbnRTaXplID0gY29tcHV0ZUZvbnRTaXplKGxpbmVzLCBmb250LCBib3VuZHMsIHRydWUpO1xuICAgIH1cbiAgICB2YXIgaGVpZ2h0ID0gZm9udC5oZWlnaHRBdFNpemUoZm9udFNpemUpO1xuICAgIHZhciBsaW5lSGVpZ2h0ID0gaGVpZ2h0ICsgaGVpZ2h0ICogMC4yO1xuICAgIHZhciB0ZXh0TGluZXMgPSBbXTtcbiAgICB2YXIgbWluWCA9IGJvdW5kcy54O1xuICAgIHZhciBtaW5ZID0gYm91bmRzLnk7XG4gICAgdmFyIG1heFggPSBib3VuZHMueCArIGJvdW5kcy53aWR0aDtcbiAgICB2YXIgbWF4WSA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDtcbiAgICB2YXIgeSA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIHByZXZSZW1haW5kZXIgPSBsaW5lc1tpZHhdO1xuICAgICAgICB3aGlsZSAocHJldlJlbWFpbmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgX2IgPSBzcGxpdE91dExpbmVzKHByZXZSZW1haW5kZXIsIGJvdW5kcy53aWR0aCwgZm9udCwgZm9udFNpemUpLCBsaW5lID0gX2IubGluZSwgZW5jb2RlZCA9IF9iLmVuY29kZWQsIHdpZHRoID0gX2Iud2lkdGgsIHJlbWFpbmRlciA9IF9iLnJlbWFpbmRlcjtcbiAgICAgICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgdmFyIHggPSAoYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LkxlZnQgPyBib3VuZHMueFxuICAgICAgICAgICAgICAgIDogYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LkNlbnRlciA/IGJvdW5kcy54ICsgKGJvdW5kcy53aWR0aCAvIDIpIC0gKHdpZHRoIC8gMilcbiAgICAgICAgICAgICAgICAgICAgOiBhbGlnbm1lbnQgPT09IFRleHRBbGlnbm1lbnQuUmlnaHQgPyBib3VuZHMueCArIGJvdW5kcy53aWR0aCAtIHdpZHRoXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvdW5kcy54KTtcbiAgICAgICAgICAgIHkgLT0gbGluZUhlaWdodDtcbiAgICAgICAgICAgIGlmICh4IDwgbWluWClcbiAgICAgICAgICAgICAgICBtaW5YID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgbWluWSlcbiAgICAgICAgICAgICAgICBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ICsgd2lkdGggPiBtYXhYKVxuICAgICAgICAgICAgICAgIG1heFggPSB4ICsgd2lkdGg7XG4gICAgICAgICAgICBpZiAoeSArIGhlaWdodCA+IG1heFkpXG4gICAgICAgICAgICAgICAgbWF4WSA9IHkgKyBoZWlnaHQ7XG4gICAgICAgICAgICB0ZXh0TGluZXMucHVzaCh7IHRleHQ6IGxpbmUsIGVuY29kZWQ6IGVuY29kZWQsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsIHg6IHgsIHk6IHkgfSk7XG4gICAgICAgICAgICAvLyBPbmx5IHRyaW0gbGluZXMgdGhhdCB3ZSBoYWQgdG8gc3BsaXQgb3Vyc2VsdmVzLiBTbyB3ZSB3b24ndCB0cmltIGxpbmVzXG4gICAgICAgICAgICAvLyB0aGF0IHRoZSB1c2VyIHByb3ZpZGVkIHRoZW1zZWx2ZXMgd2l0aCB3aGl0ZXNwYWNlLlxuICAgICAgICAgICAgcHJldlJlbWFpbmRlciA9IHJlbWFpbmRlciA9PT0gbnVsbCB8fCByZW1haW5kZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlbWFpbmRlci50cmltKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICBsaW5lSGVpZ2h0OiBsaW5lSGVpZ2h0LFxuICAgICAgICBsaW5lczogdGV4dExpbmVzLFxuICAgICAgICBib3VuZHM6IHtcbiAgICAgICAgICAgIHg6IG1pblgsXG4gICAgICAgICAgICB5OiBtaW5ZLFxuICAgICAgICAgICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgICAgICAgICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcbiAgICAgICAgfSxcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgbGF5b3V0Q29tYmVkVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBfYSkge1xuICAgIHZhciBmb250U2l6ZSA9IF9hLmZvbnRTaXplLCBmb250ID0gX2EuZm9udCwgYm91bmRzID0gX2EuYm91bmRzLCBjZWxsQ291bnQgPSBfYS5jZWxsQ291bnQ7XG4gICAgdmFyIGxpbmUgPSBtZXJnZUxpbmVzKGNsZWFuVGV4dCh0ZXh0KSk7XG4gICAgaWYgKGxpbmUubGVuZ3RoID4gY2VsbENvdW50KSB7XG4gICAgICAgIHRocm93IG5ldyBDb21iZWRUZXh0TGF5b3V0RXJyb3IobGluZS5sZW5ndGgsIGNlbGxDb3VudCk7XG4gICAgfVxuICAgIGlmIChmb250U2l6ZSA9PT0gdW5kZWZpbmVkIHx8IGZvbnRTaXplID09PSAwKSB7XG4gICAgICAgIGZvbnRTaXplID0gY29tcHV0ZUNvbWJlZEZvbnRTaXplKGxpbmUsIGZvbnQsIGJvdW5kcywgY2VsbENvdW50KTtcbiAgICB9XG4gICAgdmFyIGNlbGxXaWR0aCA9IGJvdW5kcy53aWR0aCAvIGNlbGxDb3VudDtcbiAgICB2YXIgaGVpZ2h0ID0gZm9udC5oZWlnaHRBdFNpemUoZm9udFNpemUsIHsgZGVzY2VuZGVyOiBmYWxzZSB9KTtcbiAgICB2YXIgeSA9IGJvdW5kcy55ICsgKGJvdW5kcy5oZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMik7XG4gICAgdmFyIGNlbGxzID0gW107XG4gICAgdmFyIG1pblggPSBib3VuZHMueDtcbiAgICB2YXIgbWluWSA9IGJvdW5kcy55O1xuICAgIHZhciBtYXhYID0gYm91bmRzLnggKyBib3VuZHMud2lkdGg7XG4gICAgdmFyIG1heFkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQ7XG4gICAgdmFyIGNlbGxPZmZzZXQgPSAwO1xuICAgIHZhciBjaGFyT2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAoY2VsbE9mZnNldCA8IGNlbGxDb3VudCkge1xuICAgICAgICB2YXIgX2IgPSBjaGFyQXRJbmRleChsaW5lLCBjaGFyT2Zmc2V0KSwgY2hhciA9IF9iWzBdLCBjaGFyTGVuZ3RoID0gX2JbMV07XG4gICAgICAgIHZhciBlbmNvZGVkID0gZm9udC5lbmNvZGVUZXh0KGNoYXIpO1xuICAgICAgICB2YXIgd2lkdGggPSBmb250LndpZHRoT2ZUZXh0QXRTaXplKGNoYXIsIGZvbnRTaXplKTtcbiAgICAgICAgdmFyIGNlbGxDZW50ZXIgPSBib3VuZHMueCArIChjZWxsV2lkdGggKiBjZWxsT2Zmc2V0ICsgY2VsbFdpZHRoIC8gMik7XG4gICAgICAgIHZhciB4ID0gY2VsbENlbnRlciAtIHdpZHRoIC8gMjtcbiAgICAgICAgaWYgKHggPCBtaW5YKVxuICAgICAgICAgICAgbWluWCA9IHg7XG4gICAgICAgIGlmICh5IDwgbWluWSlcbiAgICAgICAgICAgIG1pblkgPSB5O1xuICAgICAgICBpZiAoeCArIHdpZHRoID4gbWF4WClcbiAgICAgICAgICAgIG1heFggPSB4ICsgd2lkdGg7XG4gICAgICAgIGlmICh5ICsgaGVpZ2h0ID4gbWF4WSlcbiAgICAgICAgICAgIG1heFkgPSB5ICsgaGVpZ2h0O1xuICAgICAgICBjZWxscy5wdXNoKHsgdGV4dDogbGluZSwgZW5jb2RlZDogZW5jb2RlZCwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgeDogeCwgeTogeSB9KTtcbiAgICAgICAgY2VsbE9mZnNldCArPSAxO1xuICAgICAgICBjaGFyT2Zmc2V0ICs9IGNoYXJMZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGZvbnRTaXplOiBmb250U2l6ZSxcbiAgICAgICAgY2VsbHM6IGNlbGxzLFxuICAgICAgICBib3VuZHM6IHtcbiAgICAgICAgICAgIHg6IG1pblgsXG4gICAgICAgICAgICB5OiBtaW5ZLFxuICAgICAgICAgICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgICAgICAgICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcbiAgICAgICAgfSxcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgbGF5b3V0U2luZ2xlbGluZVRleHQgPSBmdW5jdGlvbiAodGV4dCwgX2EpIHtcbiAgICB2YXIgYWxpZ25tZW50ID0gX2EuYWxpZ25tZW50LCBmb250U2l6ZSA9IF9hLmZvbnRTaXplLCBmb250ID0gX2EuZm9udCwgYm91bmRzID0gX2EuYm91bmRzO1xuICAgIHZhciBsaW5lID0gbWVyZ2VMaW5lcyhjbGVhblRleHQodGV4dCkpO1xuICAgIGlmIChmb250U2l6ZSA9PT0gdW5kZWZpbmVkIHx8IGZvbnRTaXplID09PSAwKSB7XG4gICAgICAgIGZvbnRTaXplID0gY29tcHV0ZUZvbnRTaXplKFtsaW5lXSwgZm9udCwgYm91bmRzKTtcbiAgICB9XG4gICAgdmFyIGVuY29kZWQgPSBmb250LmVuY29kZVRleHQobGluZSk7XG4gICAgdmFyIHdpZHRoID0gZm9udC53aWR0aE9mVGV4dEF0U2l6ZShsaW5lLCBmb250U2l6ZSk7XG4gICAgdmFyIGhlaWdodCA9IGZvbnQuaGVpZ2h0QXRTaXplKGZvbnRTaXplLCB7IGRlc2NlbmRlcjogZmFsc2UgfSk7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgdmFyIHggPSAoYWxpZ25tZW50ID09PSBUZXh0QWxpZ25tZW50LkxlZnQgPyBib3VuZHMueFxuICAgICAgICA6IGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5DZW50ZXIgPyBib3VuZHMueCArIChib3VuZHMud2lkdGggLyAyKSAtICh3aWR0aCAvIDIpXG4gICAgICAgICAgICA6IGFsaWdubWVudCA9PT0gVGV4dEFsaWdubWVudC5SaWdodCA/IGJvdW5kcy54ICsgYm91bmRzLndpZHRoIC0gd2lkdGhcbiAgICAgICAgICAgICAgICA6IGJvdW5kcy54KTtcbiAgICB2YXIgeSA9IGJvdW5kcy55ICsgKGJvdW5kcy5oZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplLFxuICAgICAgICBsaW5lOiB7IHRleHQ6IGxpbmUsIGVuY29kZWQ6IGVuY29kZWQsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsIHg6IHgsIHk6IHkgfSxcbiAgICAgICAgYm91bmRzOiB7IHg6IHgsIHk6IHksIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfSxcbiAgICB9O1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxheW91dC5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHBha28gZnJvbSAncGFrbyc7XG5pbXBvcnQgUERGSGVhZGVyIGZyb20gXCIuL2RvY3VtZW50L1BERkhlYWRlclwiO1xuaW1wb3J0IHsgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZCb29sIGZyb20gXCIuL29iamVjdHMvUERGQm9vbFwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdWxsIGZyb20gXCIuL29iamVjdHMvUERGTnVsbFwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9vYmplY3RzL1BERk9iamVjdFwiO1xuaW1wb3J0IFBERlJhd1N0cmVhbSBmcm9tIFwiLi9vYmplY3RzL1BERlJhd1N0cmVhbVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERk9wZXJhdG9yIGZyb20gXCIuL29wZXJhdG9ycy9QREZPcGVyYXRvclwiO1xuaW1wb3J0IE9wcyBmcm9tIFwiLi9vcGVyYXRvcnMvUERGT3BlcmF0b3JOYW1lc1wiO1xuaW1wb3J0IFBERkNvbnRlbnRTdHJlYW0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZDb250ZW50U3RyZWFtXCI7XG5pbXBvcnQgeyB0eXBlZEFycmF5Rm9yIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBTaW1wbGVSTkcgfSBmcm9tIFwiLi4vdXRpbHMvcm5nXCI7XG52YXIgYnlBc2NlbmRpbmdPYmplY3ROdW1iZXIgPSBmdW5jdGlvbiAoX2EsIF9iKSB7XG4gICAgdmFyIGEgPSBfYVswXTtcbiAgICB2YXIgYiA9IF9iWzBdO1xuICAgIHJldHVybiBhLm9iamVjdE51bWJlciAtIGIub2JqZWN0TnVtYmVyO1xufTtcbnZhciBQREZDb250ZXh0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkNvbnRleHQoKSB7XG4gICAgICAgIHRoaXMubGFyZ2VzdE9iamVjdE51bWJlciA9IDA7XG4gICAgICAgIHRoaXMuaGVhZGVyID0gUERGSGVhZGVyLmZvclZlcnNpb24oMSwgNyk7XG4gICAgICAgIHRoaXMudHJhaWxlckluZm8gPSB7fTtcbiAgICAgICAgdGhpcy5pbmRpcmVjdE9iamVjdHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMucm5nID0gU2ltcGxlUk5HLndpdGhTZWVkKDEpO1xuICAgIH1cbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5hc3NpZ24gPSBmdW5jdGlvbiAocmVmLCBvYmplY3QpIHtcbiAgICAgICAgdGhpcy5pbmRpcmVjdE9iamVjdHMuc2V0KHJlZiwgb2JqZWN0KTtcbiAgICAgICAgaWYgKHJlZi5vYmplY3ROdW1iZXIgPiB0aGlzLmxhcmdlc3RPYmplY3ROdW1iZXIpIHtcbiAgICAgICAgICAgIHRoaXMubGFyZ2VzdE9iamVjdE51bWJlciA9IHJlZi5vYmplY3ROdW1iZXI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLm5leHRSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubGFyZ2VzdE9iamVjdE51bWJlciArPSAxO1xuICAgICAgICByZXR1cm4gUERGUmVmLm9mKHRoaXMubGFyZ2VzdE9iamVjdE51bWJlcik7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5yZWdpc3RlciA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMubmV4dFJlZigpO1xuICAgICAgICB0aGlzLmFzc2lnbihyZWYsIG9iamVjdCk7XG4gICAgICAgIHJldHVybiByZWY7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGlyZWN0T2JqZWN0cy5kZWxldGUocmVmKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmxvb2t1cE1heWJlID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHR5cGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IGBwcmVzZXJ2ZVBERk51bGxgIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gU2hvdWxkIGJlXG4gICAgICAgIC8vIHJlbW92ZWQgaW4gbmV4dCBicmVha2luZyBBUEkgY2hhbmdlLlxuICAgICAgICB2YXIgcHJlc2VydmVQREZOdWxsID0gdHlwZXMuaW5jbHVkZXMoUERGTnVsbCk7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWYgaW5zdGFuY2VvZiBQREZSZWYgPyB0aGlzLmluZGlyZWN0T2JqZWN0cy5nZXQocmVmKSA6IHJlZjtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgKHJlc3VsdCA9PT0gUERGTnVsbCAmJiAhcHJlc2VydmVQREZOdWxsKSlcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHR5cGVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlc1tpZHhdO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFBERk51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBQREZOdWxsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIHR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IodHlwZXMsIHJlc3VsdCk7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5sb29rdXAgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHZhciB0eXBlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdHlwZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlZiBpbnN0YW5jZW9mIFBERlJlZiA/IHRoaXMuaW5kaXJlY3RPYmplY3RzLmdldChyZWYpIDogcmVmO1xuICAgICAgICBpZiAodHlwZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdHlwZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2lkeF07XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gUERGTnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IFBERk51bGwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgdHlwZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvcih0eXBlcywgcmVzdWx0KTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmdldE9iamVjdFJlZiA9IGZ1bmN0aW9uIChwZGZPYmplY3QpIHtcbiAgICAgICAgdmFyIGVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuaW5kaXJlY3RPYmplY3RzLmVudHJpZXMoKSk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIHJlZiA9IF9hWzBdLCBvYmplY3QgPSBfYVsxXTtcbiAgICAgICAgICAgIGlmIChvYmplY3QgPT09IHBkZk9iamVjdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmVudW1lcmF0ZUluZGlyZWN0T2JqZWN0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5pbmRpcmVjdE9iamVjdHMuZW50cmllcygpKS5zb3J0KGJ5QXNjZW5kaW5nT2JqZWN0TnVtYmVyKTtcbiAgICB9O1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLm9iaiA9IGZ1bmN0aW9uIChsaXRlcmFsKSB7XG4gICAgICAgIGlmIChsaXRlcmFsIGluc3RhbmNlb2YgUERGT2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbGl0ZXJhbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsaXRlcmFsID09PSBudWxsIHx8IGxpdGVyYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIFBERk51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxpdGVyYWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gUERGTmFtZS5vZihsaXRlcmFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbGl0ZXJhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBQREZOdW1iZXIub2YobGl0ZXJhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxpdGVyYWwgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIGxpdGVyYWwgPyBQREZCb29sLlRydWUgOiBQREZCb29sLkZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobGl0ZXJhbCkpIHtcbiAgICAgICAgICAgIHZhciBhcnJheSA9IFBERkFycmF5LndpdGhDb250ZXh0KHRoaXMpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gbGl0ZXJhbC5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHRoaXMub2JqKGxpdGVyYWxbaWR4XSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGRpY3QgPSBQREZEaWN0LndpdGhDb250ZXh0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhsaXRlcmFsKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGtleXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaWR4XTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBsaXRlcmFsW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2Yoa2V5KSwgdGhpcy5vYmoodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkaWN0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5zdHJlYW0gPSBmdW5jdGlvbiAoY29udGVudHMsIGRpY3QpIHtcbiAgICAgICAgaWYgKGRpY3QgPT09IHZvaWQgMCkgeyBkaWN0ID0ge307IH1cbiAgICAgICAgcmV0dXJuIFBERlJhd1N0cmVhbS5vZih0aGlzLm9iaihkaWN0KSwgdHlwZWRBcnJheUZvcihjb250ZW50cykpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZmxhdGVTdHJlYW0gPSBmdW5jdGlvbiAoY29udGVudHMsIGRpY3QpIHtcbiAgICAgICAgaWYgKGRpY3QgPT09IHZvaWQgMCkgeyBkaWN0ID0ge307IH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtKHBha28uZGVmbGF0ZSh0eXBlZEFycmF5Rm9yKGNvbnRlbnRzKSksIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkaWN0KSwgeyBGaWx0ZXI6ICdGbGF0ZURlY29kZScgfSkpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuY29udGVudFN0cmVhbSA9IGZ1bmN0aW9uIChvcGVyYXRvcnMsIGRpY3QpIHtcbiAgICAgICAgaWYgKGRpY3QgPT09IHZvaWQgMCkgeyBkaWN0ID0ge307IH1cbiAgICAgICAgcmV0dXJuIFBERkNvbnRlbnRTdHJlYW0ub2YodGhpcy5vYmooZGljdCksIG9wZXJhdG9ycyk7XG4gICAgfTtcbiAgICBQREZDb250ZXh0LnByb3RvdHlwZS5mb3JtWE9iamVjdCA9IGZ1bmN0aW9uIChvcGVyYXRvcnMsIGRpY3QpIHtcbiAgICAgICAgaWYgKGRpY3QgPT09IHZvaWQgMCkgeyBkaWN0ID0ge307IH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFN0cmVhbShvcGVyYXRvcnMsIF9fYXNzaWduKF9fYXNzaWduKHsgQkJveDogdGhpcy5vYmooWzAsIDAsIDAsIDBdKSwgTWF0cml4OiB0aGlzLm9iaihbMSwgMCwgMCwgMSwgMCwgMF0pIH0sIGRpY3QpLCB7IFR5cGU6ICdYT2JqZWN0JywgU3VidHlwZTogJ0Zvcm0nIH0pKTtcbiAgICB9O1xuICAgIC8qXG4gICAgICogUmVmZXJlbmNlIHRvIFBERkNvbnRlbnRTdHJlYW0gdGhhdCBjb250YWlucyBhIHNpbmdsZSBQREZPcGVyYXRvcjogYHFgLlxuICAgICAqIFVzZWQgYnkgW1tQREZQYWdlTGVhZl1dIGluc3RhbmNlcyB0byBlbnN1cmUgdGhhdCB3aGVuIGNvbnRlbnQgc3RyZWFtcyBhcmVcbiAgICAgKiBhZGRlZCB0byBhIG1vZGlmaWVkIFBERiwgdGhleSBzdGFydCBpbiB0aGUgZGVmYXVsdCwgdW5jaGFuZ2VkIGdyYXBoaWNzXG4gICAgICogc3RhdGUuXG4gICAgICovXG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuZ2V0UHVzaEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5wdXNoR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWYpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnB1c2hHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGljdCA9IHRoaXMub2JqKHt9KTtcbiAgICAgICAgdmFyIG9wID0gUERGT3BlcmF0b3Iub2YoT3BzLlB1c2hHcmFwaGljc1N0YXRlKTtcbiAgICAgICAgdmFyIHN0cmVhbSA9IFBERkNvbnRlbnRTdHJlYW0ub2YoZGljdCwgW29wXSk7XG4gICAgICAgIHRoaXMucHVzaEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmID0gdGhpcy5yZWdpc3RlcihzdHJlYW0pO1xuICAgICAgICByZXR1cm4gdGhpcy5wdXNoR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWY7XG4gICAgfTtcbiAgICAvKlxuICAgICAqIFJlZmVyZW5jZSB0byBQREZDb250ZW50U3RyZWFtIHRoYXQgY29udGFpbnMgYSBzaW5nbGUgUERGT3BlcmF0b3I6IGBRYC5cbiAgICAgKiBVc2VkIGJ5IFtbUERGUGFnZUxlYWZdXSBpbnN0YW5jZXMgdG8gZW5zdXJlIHRoYXQgd2hlbiBjb250ZW50IHN0cmVhbXMgYXJlXG4gICAgICogYWRkZWQgdG8gYSBtb2RpZmllZCBQREYsIHRoZXkgc3RhcnQgaW4gdGhlIGRlZmF1bHQsIHVuY2hhbmdlZCBncmFwaGljc1xuICAgICAqIHN0YXRlLlxuICAgICAqL1xuICAgIFBERkNvbnRleHQucHJvdG90eXBlLmdldFBvcEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5wb3BHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbVJlZikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9wR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWY7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLm9iaih7fSk7XG4gICAgICAgIHZhciBvcCA9IFBERk9wZXJhdG9yLm9mKE9wcy5Qb3BHcmFwaGljc1N0YXRlKTtcbiAgICAgICAgdmFyIHN0cmVhbSA9IFBERkNvbnRlbnRTdHJlYW0ub2YoZGljdCwgW29wXSk7XG4gICAgICAgIHRoaXMucG9wR3JhcGhpY3NTdGF0ZUNvbnRlbnRTdHJlYW1SZWYgPSB0aGlzLnJlZ2lzdGVyKHN0cmVhbSk7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtUmVmO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5wcm90b3R5cGUuYWRkUmFuZG9tU3VmZml4ID0gZnVuY3Rpb24gKHByZWZpeCwgc3VmZml4TGVuZ3RoKSB7XG4gICAgICAgIGlmIChzdWZmaXhMZW5ndGggPT09IHZvaWQgMCkgeyBzdWZmaXhMZW5ndGggPSA0OyB9XG4gICAgICAgIHJldHVybiBwcmVmaXggKyBcIi1cIiArIE1hdGguZmxvb3IodGhpcy5ybmcubmV4dEludCgpICogTWF0aC5wb3coMTAsIHN1ZmZpeExlbmd0aCkpO1xuICAgIH07XG4gICAgUERGQ29udGV4dC5jcmVhdGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUERGQ29udGV4dCgpOyB9O1xuICAgIHJldHVybiBQREZDb250ZXh0O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkNvbnRleHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZDb250ZXh0LmpzLm1hcCIsImltcG9ydCBQREZBcnJheSBmcm9tIFwiLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERlN0cmVhbSBmcm9tIFwiLi9vYmplY3RzL1BERlN0cmVhbVwiO1xuaW1wb3J0IFBERlBhZ2VMZWFmIGZyb20gXCIuL3N0cnVjdHVyZXMvUERGUGFnZUxlYWZcIjtcbi8qKlxuICogUERGT2JqZWN0Q29waWVyIGNvcGllcyBQREZPYmplY3RzIGZyb20gYSBzcmMgY29udGV4dCB0byBhIGRlc3QgY29udGV4dC5cbiAqIFRoZSBwcmltYXJ5IHVzZSBjYXNlIGZvciB0aGlzIGlzIHRvIGNvcHkgcGFnZXMgYmV0d2VlbiBQREZzLlxuICpcbiAqIF9Db3B5aW5nXyBhbiBvYmplY3Qgd2l0aCBhIFBERk9iamVjdENvcGllciBpcyBkaWZmZXJlbnQgZnJvbSBfY2xvbmluZ18gYW5cbiAqIG9iamVjdCB3aXRoIGl0cyBbW1BERk9iamVjdC5jbG9uZV1dIG1ldGhvZDpcbiAqXG4gKiBgYGBcbiAqICAgY29uc3Qgc3JjOiBQREZDb250ZXh0ID0gLi4uXG4gKiAgIGNvbnN0IGRlc3Q6IFBERkNvbnRleHQgPSAuLi5cbiAqICAgY29uc3Qgb3JpZ2luYWxPYmplY3Q6IFBERk9iamVjdCA9IC4uLlxuICogICBjb25zdCBjb3BpZWRPYmplY3QgPSBQREZPYmplY3RDb3BpZXIuZm9yKHNyYywgZGVzdCkuY29weShvcmlnaW5hbE9iamVjdCk7XG4gKiAgIGNvbnN0IGNsb25lZE9iamVjdCA9IG9yaWdpbmFsT2JqZWN0LmNsb25lKCk7XG4gKiBgYGBcbiAqXG4gKiBDb3B5aW5nIGFuIG9iamVjdCBpcyBlcXVpdmFsZW50IHRvIGNsb25pbmcgaXQgYW5kIHRoZW4gY29weWluZyBvdmVyIGFueSBvdGhlclxuICogb2JqZWN0cyB0aGF0IGl0IHJlZmVyZW5jZXMuIE5vdGUgdGhhdCBvbmx5IGRpY3Rpb25hcmllcywgYXJyYXlzLCBhbmQgc3RyZWFtc1xuICogKG9yIHN0cnVjdHVyZXMgYnVpbGQgZnJvbSB0aGVtKSBjYW4gY29udGFpbiBpbmRpcmVjdCByZWZlcmVuY2VzIHRvIG90aGVyXG4gKiBvYmplY3RzLiBDb3B5aW5nIGEgUERGT2JqZWN0IHRoYXQgaXMgbm90IGEgZGljdGlvbmFyeSwgYXJyYXksIG9yIHN0cmVhbSBpc1xuICogc3VwcG9ydGVkLCBidXQgaXMgZXF1aXZhbGVudCB0byBjbG9uaW5nIGl0LlxuICovXG52YXIgUERGT2JqZWN0Q29waWVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERk9iamVjdENvcGllcihzcmMsIGRlc3QpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy50cmF2ZXJzZWRPYmplY3RzID0gbmV3IE1hcCgpO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdGhpcy5jb3B5ID0gZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gKG9iamVjdCBpbnN0YW5jZW9mIFBERlBhZ2VMZWFmID8gX3RoaXMuY29weVBERlBhZ2Uob2JqZWN0KVxuICAgICAgICAgICAgOiBvYmplY3QgaW5zdGFuY2VvZiBQREZEaWN0ID8gX3RoaXMuY29weVBERkRpY3Qob2JqZWN0KVxuICAgICAgICAgICAgICAgIDogb2JqZWN0IGluc3RhbmNlb2YgUERGQXJyYXkgPyBfdGhpcy5jb3B5UERGQXJyYXkob2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICA6IG9iamVjdCBpbnN0YW5jZW9mIFBERlN0cmVhbSA/IF90aGlzLmNvcHlQREZTdHJlYW0ob2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBvYmplY3QgaW5zdGFuY2VvZiBQREZSZWYgPyBfdGhpcy5jb3B5UERGSW5kaXJlY3RPYmplY3Qob2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb2JqZWN0LmNsb25lKCkpOyB9O1xuICAgICAgICB0aGlzLmNvcHlQREZQYWdlID0gZnVuY3Rpb24gKG9yaWdpbmFsUGFnZSkge1xuICAgICAgICAgICAgdmFyIGNsb25lZFBhZ2UgPSBvcmlnaW5hbFBhZ2UuY2xvbmUoKTtcbiAgICAgICAgICAgIC8vIE1vdmUgYW55IGVudHJpZXMgdGhhdCB0aGUgb3JpZ2luYWxQYWdlIGlzIGluaGVyaXRpbmcgZnJvbSBpdHMgcGFyZW50XG4gICAgICAgICAgICAvLyB0cmVlIG5vZGVzIGRpcmVjdGx5IGludG8gb3JpZ2luYWxQYWdlIHNvIHRoZXkgYXJlIHByZXNlcnZlZCBkdXJpbmdcbiAgICAgICAgICAgIC8vIHRoZSBjb3B5LlxuICAgICAgICAgICAgdmFyIEluaGVyaXRhYmxlRW50cmllcyA9IFBERlBhZ2VMZWFmLkluaGVyaXRhYmxlRW50cmllcztcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEluaGVyaXRhYmxlRW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZihJbmhlcml0YWJsZUVudHJpZXNbaWR4XSk7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY2xvbmVkUGFnZS5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghY2xvbmVkUGFnZS5nZXQoa2V5KSAmJiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgY2xvbmVkUGFnZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHBhcmVudCByZWZlcmVuY2UgdG8gcHJldmVudCB0aGUgd2hvbGUgZG9ub3IgZG9jdW1lbnQncyBwYWdlXG4gICAgICAgICAgICAvLyB0cmVlIGZyb20gYmVpbmcgY29waWVkIHdoZW4gd2Ugb25seSBuZWVkIGEgc2luZ2xlIHBhZ2UuXG4gICAgICAgICAgICBjbG9uZWRQYWdlLmRlbGV0ZShQREZOYW1lLm9mKCdQYXJlbnQnKSk7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY29weVBERkRpY3QoY2xvbmVkUGFnZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29weVBERkRpY3QgPSBmdW5jdGlvbiAob3JpZ2luYWxEaWN0KSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5oYXMob3JpZ2luYWxEaWN0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLmdldChvcmlnaW5hbERpY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNsb25lZERpY3QgPSBvcmlnaW5hbERpY3QuY2xvbmUoX3RoaXMuZGVzdCk7XG4gICAgICAgICAgICBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLnNldChvcmlnaW5hbERpY3QsIGNsb25lZERpY3QpO1xuICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBvcmlnaW5hbERpY3QuZW50cmllcygpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICAgICAgICAgIGNsb25lZERpY3Quc2V0KGtleSwgX3RoaXMuY29weSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsb25lZERpY3Q7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29weVBERkFycmF5ID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXkpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy50cmF2ZXJzZWRPYmplY3RzLmhhcyhvcmlnaW5hbEFycmF5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLmdldChvcmlnaW5hbEFycmF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjbG9uZWRBcnJheSA9IG9yaWdpbmFsQXJyYXkuY2xvbmUoX3RoaXMuZGVzdCk7XG4gICAgICAgICAgICBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLnNldChvcmlnaW5hbEFycmF5LCBjbG9uZWRBcnJheSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBvcmlnaW5hbEFycmF5LnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9yaWdpbmFsQXJyYXkuZ2V0KGlkeCk7XG4gICAgICAgICAgICAgICAgY2xvbmVkQXJyYXkuc2V0KGlkeCwgX3RoaXMuY29weSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsb25lZEFycmF5O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvcHlQREZTdHJlYW0gPSBmdW5jdGlvbiAob3JpZ2luYWxTdHJlYW0pIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy50cmF2ZXJzZWRPYmplY3RzLmhhcyhvcmlnaW5hbFN0cmVhbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5nZXQob3JpZ2luYWxTdHJlYW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNsb25lZFN0cmVhbSA9IG9yaWdpbmFsU3RyZWFtLmNsb25lKF90aGlzLmRlc3QpO1xuICAgICAgICAgICAgX3RoaXMudHJhdmVyc2VkT2JqZWN0cy5zZXQob3JpZ2luYWxTdHJlYW0sIGNsb25lZFN0cmVhbSk7XG4gICAgICAgICAgICB2YXIgZW50cmllcyA9IG9yaWdpbmFsU3RyZWFtLmRpY3QuZW50cmllcygpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICAgICAgICAgIGNsb25lZFN0cmVhbS5kaWN0LnNldChrZXksIF90aGlzLmNvcHkodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbG9uZWRTdHJlYW07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29weVBERkluZGlyZWN0T2JqZWN0ID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICAgICAgdmFyIGFscmVhZHlNYXBwZWQgPSBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLmhhcyhyZWYpO1xuICAgICAgICAgICAgaWYgKCFhbHJlYWR5TWFwcGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1JlZiA9IF90aGlzLmRlc3QubmV4dFJlZigpO1xuICAgICAgICAgICAgICAgIF90aGlzLnRyYXZlcnNlZE9iamVjdHMuc2V0KHJlZiwgbmV3UmVmKTtcbiAgICAgICAgICAgICAgICB2YXIgZGVyZWZlcmVuY2VkVmFsdWUgPSBfdGhpcy5zcmMubG9va3VwKHJlZik7XG4gICAgICAgICAgICAgICAgaWYgKGRlcmVmZXJlbmNlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZWQgPSBfdGhpcy5jb3B5KGRlcmVmZXJlbmNlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGVzdC5hc3NpZ24obmV3UmVmLCBjbG9uZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfdGhpcy50cmF2ZXJzZWRPYmplY3RzLmdldChyZWYpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNyYyA9IHNyYztcbiAgICAgICAgdGhpcy5kZXN0ID0gZGVzdDtcbiAgICB9XG4gICAgUERGT2JqZWN0Q29waWVyLmZvciA9IGZ1bmN0aW9uIChzcmMsIGRlc3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZPYmplY3RDb3BpZXIoc3JjLCBkZXN0KTtcbiAgICB9O1xuICAgIHJldHVybiBQREZPYmplY3RDb3BpZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGT2JqZWN0Q29waWVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT2JqZWN0Q29waWVyLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBY3JvVGVybWluYWwgZnJvbSBcIi4vUERGQWNyb1Rlcm1pbmFsXCI7XG5pbXBvcnQgeyBJbmRleE91dE9mQm91bmRzRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGQWNyb0J1dHRvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb0J1dHRvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvQnV0dG9uKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9CdXR0b24ucHJvdG90eXBlLk9wdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5sb29rdXBNYXliZShQREZOYW1lLm9mKCdPcHQnKSwgUERGU3RyaW5nLCBQREZIZXhTdHJpbmcsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERkFjcm9CdXR0b24ucHJvdG90eXBlLnNldE9wdCA9IGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdPcHQnKSwgdGhpcy5kaWN0LmNvbnRleHQub2JqKG9wdCkpO1xuICAgIH07XG4gICAgUERGQWNyb0J1dHRvbi5wcm90b3R5cGUuZ2V0RXhwb3J0VmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb3B0ID0gdGhpcy5PcHQoKTtcbiAgICAgICAgaWYgKCFvcHQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBpZiAob3B0IGluc3RhbmNlb2YgUERGU3RyaW5nIHx8IG9wdCBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIFtvcHRdO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0LnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gb3B0Lmxvb2t1cChpZHgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUERGU3RyaW5nIHx8IHZhbHVlIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfTtcbiAgICBQREZBY3JvQnV0dG9uLnByb3RvdHlwZS5yZW1vdmVFeHBvcnRWYWx1ZSA9IGZ1bmN0aW9uIChpZHgpIHtcbiAgICAgICAgdmFyIG9wdCA9IHRoaXMuT3B0KCk7XG4gICAgICAgIGlmICghb3B0KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAob3B0IGluc3RhbmNlb2YgUERGU3RyaW5nIHx8IG9wdCBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgaWYgKGlkeCAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0Vycm9yKGlkeCwgMCwgMCk7XG4gICAgICAgICAgICB0aGlzLnNldE9wdChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPiBvcHQuc2l6ZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFcnJvcihpZHgsIDAsIG9wdC5zaXplKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3B0LnJlbW92ZShpZHgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBFbmZvcmNlIHVzZSB1c2Ugb2YgL09wdCBldmVuIGlmIGl0IGlzbid0IHN0cmljdGx5IG5lY2Vzc2FyeVxuICAgIFBERkFjcm9CdXR0b24ucHJvdG90eXBlLm5vcm1hbGl6ZUV4cG9ydFZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICB2YXIgZXhwb3J0VmFsdWVzID0gKF9hID0gdGhpcy5nZXRFeHBvcnRWYWx1ZXMoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW107XG4gICAgICAgIHZhciBPcHQgPSBbXTtcbiAgICAgICAgdmFyIHdpZGdldHMgPSB0aGlzLmdldFdpZGdldHMoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgICAgICB2YXIgZXhwb3J0VmFsID0gKF9iID0gZXhwb3J0VmFsdWVzW2lkeF0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFBERkhleFN0cmluZy5mcm9tVGV4dCgoX2QgPSAoX2MgPSB3aWRnZXQuZ2V0T25WYWx1ZSgpKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZGVjb2RlVGV4dCgpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJyk7XG4gICAgICAgICAgICBPcHQucHVzaChleHBvcnRWYWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0T3B0KE9wdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXVzZXMgZXhpc3Rpbmcgb3B0IGlmIG9uZSBleGlzdHMgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoYXNzdW1pbmdcbiAgICAgKiBgdXNlRXhpc3RpbmdJZHhgIGlzIGB0cnVlYCkuIFJldHVybnMgaW5kZXggb2YgZXhpc3RpbmcgKG9yIG5ldykgb3B0LlxuICAgICAqL1xuICAgIFBERkFjcm9CdXR0b24ucHJvdG90eXBlLmFkZE9wdCA9IGZ1bmN0aW9uIChvcHQsIHVzZUV4aXN0aW5nT3B0SWR4KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVFeHBvcnRWYWx1ZXMoKTtcbiAgICAgICAgdmFyIG9wdFRleHQgPSBvcHQuZGVjb2RlVGV4dCgpO1xuICAgICAgICB2YXIgZXhpc3RpbmdJZHg7XG4gICAgICAgIGlmICh1c2VFeGlzdGluZ09wdElkeCkge1xuICAgICAgICAgICAgdmFyIGV4cG9ydFZhbHVlcyA9IChfYSA9IHRoaXMuZ2V0RXhwb3J0VmFsdWVzKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gZXhwb3J0VmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBleHBvcnRWYWwgPSBleHBvcnRWYWx1ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoZXhwb3J0VmFsLmRlY29kZVRleHQoKSA9PT0gb3B0VGV4dClcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdJZHggPSBpZHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIE9wdCA9IHRoaXMuT3B0KCk7XG4gICAgICAgIE9wdC5wdXNoKG9wdCk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0lkeCAhPT0gbnVsbCAmJiBleGlzdGluZ0lkeCAhPT0gdm9pZCAwID8gZXhpc3RpbmdJZHggOiBPcHQuc2l6ZSgpIC0gMTtcbiAgICB9O1xuICAgIFBERkFjcm9CdXR0b24ucHJvdG90eXBlLmFkZFdpZGdldFdpdGhPcHQgPSBmdW5jdGlvbiAod2lkZ2V0LCBvcHQsIHVzZUV4aXN0aW5nT3B0SWR4KSB7XG4gICAgICAgIHZhciBvcHRJZHggPSB0aGlzLmFkZE9wdChvcHQsIHVzZUV4aXN0aW5nT3B0SWR4KTtcbiAgICAgICAgdmFyIGFwU3RhdGVWYWx1ZSA9IFBERk5hbWUub2YoU3RyaW5nKG9wdElkeCkpO1xuICAgICAgICB0aGlzLmFkZFdpZGdldCh3aWRnZXQpO1xuICAgICAgICByZXR1cm4gYXBTdGF0ZVZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9CdXR0b247XG59KFBERkFjcm9UZXJtaW5hbCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb0J1dHRvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9CdXR0b24uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQWNyb0J1dHRvbiBmcm9tIFwiLi9QREZBY3JvQnV0dG9uXCI7XG5pbXBvcnQgeyBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZBY3JvQ2hlY2tCb3ggPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9DaGVja0JveCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvQ2hlY2tCb3goKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb0NoZWNrQm94LnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBvblZhbHVlID0gKF9hID0gdGhpcy5nZXRPblZhbHVlKCkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFBERk5hbWUub2YoJ1llcycpO1xuICAgICAgICBpZiAodmFsdWUgIT09IG9uVmFsdWUgJiYgdmFsdWUgIT09IFBERk5hbWUub2YoJ09mZicpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1YnKSwgdmFsdWUpO1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuZ2V0V2lkZ2V0cygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB3aWRnZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHdpZGdldCA9IHdpZGdldHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHdpZGdldC5nZXRPblZhbHVlKCkgPT09IHZhbHVlID8gdmFsdWUgOiBQREZOYW1lLm9mKCdPZmYnKTtcbiAgICAgICAgICAgIHdpZGdldC5zZXRBcHBlYXJhbmNlU3RhdGUoc3RhdGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZBY3JvQ2hlY2tCb3gucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdiA9IHRoaXMuVigpO1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIFBERk5hbWUpXG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgcmV0dXJuIFBERk5hbWUub2YoJ09mZicpO1xuICAgIH07XG4gICAgUERGQWNyb0NoZWNrQm94LnByb3RvdHlwZS5nZXRPblZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd2lkZ2V0ID0gdGhpcy5nZXRXaWRnZXRzKClbMF07XG4gICAgICAgIHJldHVybiB3aWRnZXQgPT09IG51bGwgfHwgd2lkZ2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aWRnZXQuZ2V0T25WYWx1ZSgpO1xuICAgIH07XG4gICAgUERGQWNyb0NoZWNrQm94LmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9DaGVja0JveChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgUERGQWNyb0NoZWNrQm94LmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgRlQ6ICdCdG4nLFxuICAgICAgICAgICAgS2lkczogW10sXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVmID0gY29udGV4dC5yZWdpc3RlcihkaWN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvQ2hlY2tCb3goZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvQ2hlY2tCb3g7XG59KFBERkFjcm9CdXR0b24pKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9DaGVja0JveDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9DaGVja0JveC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZBY3JvVGVybWluYWwgZnJvbSBcIi4vUERGQWNyb1Rlcm1pbmFsXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IHsgQWNyb0Nob2ljZUZsYWdzIH0gZnJvbSBcIi4vZmxhZ3NcIjtcbmltcG9ydCB7IEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yLCBNdWx0aVNlbGVjdFZhbHVlRXJyb3IsIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xudmFyIFBERkFjcm9DaG9pY2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9DaG9pY2UsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb0Nob2ljZSgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvQ2hvaWNlLnByb3RvdHlwZS5zZXRWYWx1ZXMgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLkNvbWJvKSAmJlxuICAgICAgICAgICAgIXRoaXMuaGFzRmxhZyhBY3JvQ2hvaWNlRmxhZ3MuRWRpdCkgJiZcbiAgICAgICAgICAgICF0aGlzLnZhbHVlc0FyZVZhbGlkKHZhbHVlcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ1YnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVicpLCB2YWx1ZXNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0ZsYWcoQWNyb0Nob2ljZUZsYWdzLk11bHRpU2VsZWN0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBNdWx0aVNlbGVjdFZhbHVlRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVicpLCB0aGlzLmRpY3QuY29udGV4dC5vYmoodmFsdWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEluZGljZXModmFsdWVzKTtcbiAgICB9O1xuICAgIFBERkFjcm9DaG9pY2UucHJvdG90eXBlLnZhbHVlc0FyZVZhbGlkID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChpZHgsIGxlbikge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHZhbHVlc1tpZHhdLmRlY29kZVRleHQoKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5maW5kKGZ1bmN0aW9uIChvKSB7IHJldHVybiB2YWwgPT09IChvLmRpc3BsYXkgfHwgby52YWx1ZSkuZGVjb2RlVGV4dCgpOyB9KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgc3RhdGVfMSA9IF9sb29wXzEoaWR4LCBsZW4pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZV8xID09PSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZV8xLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgUERGQWNyb0Nob2ljZS5wcm90b3R5cGUudXBkYXRlU2VsZWN0ZWRJbmRpY2VzID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBpbmRpY2VzID0gbmV3IEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICAgICAgICAgIHZhciBfbG9vcF8yID0gZnVuY3Rpb24gKGlkeCwgbGVuKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbCA9IHZhbHVlc1tpZHhdLmRlY29kZVRleHQoKTtcbiAgICAgICAgICAgICAgICBpbmRpY2VzW2lkeF0gPSBvcHRpb25zLmZpbmRJbmRleChmdW5jdGlvbiAobykgeyByZXR1cm4gdmFsID09PSAoby5kaXNwbGF5IHx8IG8udmFsdWUpLmRlY29kZVRleHQoKTsgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIF9sb29wXzIoaWR4LCBsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdJJyksIHRoaXMuZGljdC5jb250ZXh0Lm9iaihpbmRpY2VzLnNvcnQoKSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdJJykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZBY3JvQ2hvaWNlLnByb3RvdHlwZS5nZXRWYWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2ID0gdGhpcy5WKCk7XG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgUERGU3RyaW5nIHx8IHYgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gW3ZdO1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB2LnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHYubG9va3VwKGlkeCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUERGU3RyaW5nIHx8IHZhbHVlIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIFBERkFjcm9DaG9pY2UucHJvdG90eXBlLk9wdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5sb29rdXBNYXliZShQREZOYW1lLm9mKCdPcHQnKSwgUERGU3RyaW5nLCBQREZIZXhTdHJpbmcsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERkFjcm9DaG9pY2UucHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB2YXIgbmV3T3B0ID0gbmV3IEFycmF5KG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IG9wdGlvbnNbaWR4XSwgdmFsdWUgPSBfYS52YWx1ZSwgZGlzcGxheSA9IF9hLmRpc3BsYXk7XG4gICAgICAgICAgICBuZXdPcHRbaWR4XSA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihbdmFsdWUsIGRpc3BsYXkgfHwgdmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ09wdCcpLCB0aGlzLmRpY3QuY29udGV4dC5vYmoobmV3T3B0KSk7XG4gICAgfTtcbiAgICBQREZBY3JvQ2hvaWNlLnByb3RvdHlwZS5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgT3B0ID0gdGhpcy5PcHQoKTtcbiAgICAgICAgLy8gTm90IHN1cHBvc2VkIHRvIGhhcHBlbiAtIE9wdCBfc2hvdWxkXyBhbHdheXMgYmUgYFBERkFycmF5IHwgdW5kZWZpbmVkYFxuICAgICAgICBpZiAoT3B0IGluc3RhbmNlb2YgUERGU3RyaW5nIHx8IE9wdCBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIFt7IHZhbHVlOiBPcHQsIGRpc3BsYXk6IE9wdCB9XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoT3B0IGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IE9wdC5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IE9wdC5sb29rdXAoaWR4KTtcbiAgICAgICAgICAgICAgICAvLyBJZiBgaXRlbWAgaXMgYSBzdHJpbmcsIHVzZSB0aGF0IGFzIGJvdGggdGhlIGV4cG9ydCBhbmQgdGV4dCB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUERGU3RyaW5nIHx8IGl0ZW0gaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goeyB2YWx1ZTogaXRlbSwgZGlzcGxheTogaXRlbSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSWYgYGl0ZW1gIGlzIGFuIGFycmF5IG9mIG9uZSwgdHJlYXQgaXQgdGhlIHNhbWUgYXMganVzdCBhIHN0cmluZyxcbiAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIGFuIGFycmF5IG9mIHR3byB0aGVuIGBpdGVtWzBdYCBpcyB0aGUgZXhwb3J0IHZhbHVlIGFuZFxuICAgICAgICAgICAgICAgIC8vIGBpdGVtWzFdYCBpcyB0aGUgdGV4dCB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uc2l6ZSgpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gaXRlbS5sb29rdXAoMCwgUERGU3RyaW5nLCBQREZIZXhTdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlY29uZCA9IGl0ZW0ubG9va3VwTWF5YmUoMSwgUERGU3RyaW5nLCBQREZIZXhTdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goeyB2YWx1ZTogZmlyc3QsIGRpc3BsYXk6IHNlY29uZCB8fCBmaXJzdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9DaG9pY2U7XG59KFBERkFjcm9UZXJtaW5hbCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb0Nob2ljZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9DaG9pY2UuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQWNyb0Nob2ljZSBmcm9tIFwiLi9QREZBY3JvQ2hvaWNlXCI7XG5pbXBvcnQgeyBBY3JvQ2hvaWNlRmxhZ3MgfSBmcm9tIFwiLi9mbGFnc1wiO1xudmFyIFBERkFjcm9Db21ib0JveCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQWNyb0NvbWJvQm94LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9Db21ib0JveCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvQ29tYm9Cb3guZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0NvbWJvQm94KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvQ29tYm9Cb3guY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBGVDogJ0NoJyxcbiAgICAgICAgICAgIEZmOiBBY3JvQ2hvaWNlRmxhZ3MuQ29tYm8sXG4gICAgICAgICAgICBLaWRzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGRpY3QpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9Db21ib0JveChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9Db21ib0JveDtcbn0oUERGQWNyb0Nob2ljZSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb0NvbWJvQm94O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb0NvbWJvQm94LmpzLm1hcCIsImltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi4vb2JqZWN0cy9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCB7IGZpbmRMYXN0TWF0Y2ggfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IE1pc3NpbmdEQUVudHJ5RXJyb3IsIE1pc3NpbmdUZk9wZXJhdG9yRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG4vLyBFeGFtcGxlczpcbi8vICAgYC9IZWx2IDEyIFRmYCAtPiBbJ0hlbHYnLCAnMTInXVxuLy8gICBgL0hlQm8gOC4wMCBUZmAgLT4gWydIZUJvJywgJzguMDAnXVxuLy8gICBgL0hlQm8gVGZgIC0+IFsnSGVCbycsIHVuZGVmaW5lZF1cbnZhciB0ZlJlZ2V4ID0gL1xcLyhbXlxcMFxcdFxcblxcZlxcclxcIF0rKVtcXDBcXHRcXG5cXGZcXHJcXCBdKihcXGQqXFwuXFxkK3xcXGQrKT9bXFwwXFx0XFxuXFxmXFxyXFwgXStUZi87XG52YXIgUERGQWNyb0ZpZWxkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERkFjcm9GaWVsZChkaWN0LCByZWYpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgfVxuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuVCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5sb29rdXBNYXliZShQREZOYW1lLm9mKCdUJyksIFBERlN0cmluZywgUERGSGV4U3RyaW5nKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuRmYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBudW1iZXJPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5vZignRmYnKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QuY29udGV4dC5sb29rdXBNYXliZShudW1iZXJPclJlZiwgUERGTnVtYmVyKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuViA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlT3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUub2YoJ1YnKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QuY29udGV4dC5sb29rdXAodmFsdWVPclJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLktpZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QubG9va3VwTWF5YmUoUERGTmFtZS5vZignS2lkcycpLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICAvLyBQYXJlbnQoKTogUERGRGljdCB8IHVuZGVmaW5lZCB7XG4gICAgLy8gICByZXR1cm4gdGhpcy5kaWN0Lmxvb2t1cE1heWJlKFBERk5hbWUub2YoJ1BhcmVudCcpLCBQREZEaWN0KTtcbiAgICAvLyB9XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5EQSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdEQScpKTtcbiAgICAgICAgaWYgKGRhIGluc3RhbmNlb2YgUERGU3RyaW5nIHx8IGRhIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIGRhO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXRLaWRzID0gZnVuY3Rpb24gKGtpZHMpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdLaWRzJyksIHRoaXMuZGljdC5jb250ZXh0Lm9iaihraWRzKSk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY29uc3QgcGFyZW50ID0gdGhpcy5QYXJlbnQoKTtcbiAgICAgICAgLy8gaWYgKCFwYXJlbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHJldHVybiBuZXcgUERGQWNyb0ZpZWxkKHBhcmVudCk7XG4gICAgICAgIHZhciBwYXJlbnRSZWYgPSB0aGlzLmRpY3QuZ2V0KFBERk5hbWUub2YoJ1BhcmVudCcpKTtcbiAgICAgICAgaWYgKHBhcmVudFJlZiBpbnN0YW5jZW9mIFBERlJlZikge1xuICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdQYXJlbnQnKSwgUERGRGljdCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9GaWVsZChwYXJlbnRfMSwgcGFyZW50UmVmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXRQYXJlbnQgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdQYXJlbnQnKSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUGFyZW50JyksIHBhcmVudCk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7XG4gICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFydGlhbE5hbWUoKTtcbiAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSArIFwiLlwiICsgdGhpcy5nZXRQYXJ0aWFsTmFtZSgpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5nZXRQYXJ0aWFsTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5UKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWNvZGVUZXh0KCk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldFBhcnRpYWxOYW1lID0gZnVuY3Rpb24gKHBhcnRpYWxOYW1lKSB7XG4gICAgICAgIGlmICghcGFydGlhbE5hbWUpXG4gICAgICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ1QnKSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVCcpLCBQREZIZXhTdHJpbmcuZnJvbVRleHQocGFydGlhbE5hbWUpKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuc2V0RGVmYXVsdEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0RBJyksIFBERlN0cmluZy5vZihhcHBlYXJhbmNlKSk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLmdldERlZmF1bHRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgREEgPSB0aGlzLkRBKCk7XG4gICAgICAgIGlmIChEQSBpbnN0YW5jZW9mIFBERkhleFN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIERBLmRlY29kZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gREEgPT09IG51bGwgfHwgREEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IERBLmFzU3RyaW5nKCk7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldEZvbnRTaXplID0gZnVuY3Rpb24gKGZvbnRTaXplKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIG5hbWUgPSAoX2EgPSB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICAgICAgdmFyIGRhID0gdGhpcy5nZXREZWZhdWx0QXBwZWFyYW5jZSgpO1xuICAgICAgICBpZiAoIWRhKVxuICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdEQUVudHJ5RXJyb3IobmFtZSk7XG4gICAgICAgIHZhciBkYU1hdGNoID0gZmluZExhc3RNYXRjaChkYSwgdGZSZWdleCk7XG4gICAgICAgIGlmICghZGFNYXRjaC5tYXRjaClcbiAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nVGZPcGVyYXRvckVycm9yKG5hbWUpO1xuICAgICAgICB2YXIgZGFTdGFydCA9IGRhLnNsaWNlKDAsIGRhTWF0Y2gucG9zIC0gZGFNYXRjaC5tYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICB2YXIgZGFFbmQgPSBkYU1hdGNoLnBvcyA8PSBkYS5sZW5ndGggPyBkYS5zbGljZShkYU1hdGNoLnBvcykgOiAnJztcbiAgICAgICAgdmFyIGZvbnROYW1lID0gZGFNYXRjaC5tYXRjaFsxXTtcbiAgICAgICAgdmFyIG1vZGlmaWVkRGEgPSBkYVN0YXJ0ICsgXCIgL1wiICsgZm9udE5hbWUgKyBcIiBcIiArIGZvbnRTaXplICsgXCIgVGYgXCIgKyBkYUVuZDtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0QXBwZWFyYW5jZShtb2RpZmllZERhKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuZ2V0RmxhZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkZmKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc051bWJlcigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXRGbGFncyA9IGZ1bmN0aW9uIChmbGFncykge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0ZmJyksIFBERk51bWJlci5vZihmbGFncykpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5oYXNGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5nZXRGbGFncygpO1xuICAgICAgICByZXR1cm4gKGZsYWdzICYgZmxhZykgIT09IDA7XG4gICAgfTtcbiAgICBQREZBY3JvRmllbGQucHJvdG90eXBlLnNldEZsYWcgPSBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICB2YXIgZmxhZ3MgPSB0aGlzLmdldEZsYWdzKCk7XG4gICAgICAgIHRoaXMuc2V0RmxhZ3MoZmxhZ3MgfCBmbGFnKTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuY2xlYXJGbGFnID0gZnVuY3Rpb24gKGZsYWcpIHtcbiAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5nZXRGbGFncygpO1xuICAgICAgICB0aGlzLnNldEZsYWdzKGZsYWdzICYgfmZsYWcpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5zZXRGbGFnVG8gPSBmdW5jdGlvbiAoZmxhZywgZW5hYmxlKSB7XG4gICAgICAgIGlmIChlbmFibGUpXG4gICAgICAgICAgICB0aGlzLnNldEZsYWcoZmxhZyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGbGFnKGZsYWcpO1xuICAgIH07XG4gICAgUERGQWNyb0ZpZWxkLnByb3RvdHlwZS5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGU7XG4gICAgICAgIHRoaXMuYXNjZW5kKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZSlcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBub2RlLmRpY3QuZ2V0KG5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTtcbiAgICB9O1xuICAgIFBERkFjcm9GaWVsZC5wcm90b3R5cGUuYXNjZW5kID0gZnVuY3Rpb24gKHZpc2l0b3IpIHtcbiAgICAgICAgdmlzaXRvcih0aGlzKTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7XG4gICAgICAgIGlmIChwYXJlbnQpXG4gICAgICAgICAgICBwYXJlbnQuYXNjZW5kKHZpc2l0b3IpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9GaWVsZDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvRmllbGQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvRmllbGQuanMubWFwIiwiaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQWNyb05vblRlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9Ob25UZXJtaW5hbFwiO1xuaW1wb3J0IHsgY3JlYXRlUERGQWNyb0ZpZWxkLCBjcmVhdGVQREZBY3JvRmllbGRzLCB9IGZyb20gXCIuL3V0aWxzXCI7XG52YXIgUERGQWNyb0Zvcm0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGQWNyb0Zvcm0oZGljdCkge1xuICAgICAgICB0aGlzLmRpY3QgPSBkaWN0O1xuICAgIH1cbiAgICBQREZBY3JvRm9ybS5wcm90b3R5cGUuRmllbGRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZmllbGRzID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdGaWVsZHMnKSk7XG4gICAgICAgIGlmIChmaWVsZHMgaW5zdGFuY2VvZiBQREZBcnJheSlcbiAgICAgICAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZBY3JvRm9ybS5wcm90b3R5cGUuZ2V0RmllbGRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgRmllbGRzID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkZpZWxkcztcbiAgICAgICAgdmFyIGZpZWxkcyA9IG5ldyBBcnJheShGaWVsZHMuc2l6ZSgpKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gRmllbGRzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHJlZiA9IEZpZWxkcy5nZXQoaWR4KTtcbiAgICAgICAgICAgIHZhciBkaWN0ID0gRmllbGRzLmxvb2t1cChpZHgsIFBERkRpY3QpO1xuICAgICAgICAgICAgZmllbGRzW2lkeF0gPSBbY3JlYXRlUERGQWNyb0ZpZWxkKGRpY3QsIHJlZiksIHJlZl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9O1xuICAgIFBERkFjcm9Gb3JtLnByb3RvdHlwZS5nZXRBbGxGaWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhbGxGaWVsZHMgPSBbXTtcbiAgICAgICAgdmFyIHB1c2hGaWVsZHMgPSBmdW5jdGlvbiAoZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoIWZpZWxkcylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBmaWVsZHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2lkeF07XG4gICAgICAgICAgICAgICAgYWxsRmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZE1vZGVsID0gZmllbGRbMF07XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkTW9kZWwgaW5zdGFuY2VvZiBQREZBY3JvTm9uVGVybWluYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaEZpZWxkcyhjcmVhdGVQREZBY3JvRmllbGRzKGZpZWxkTW9kZWwuS2lkcygpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBwdXNoRmllbGRzKHRoaXMuZ2V0RmllbGRzKCkpO1xuICAgICAgICByZXR1cm4gYWxsRmllbGRzO1xuICAgIH07XG4gICAgUERGQWNyb0Zvcm0ucHJvdG90eXBlLmFkZEZpZWxkID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIHZhciBGaWVsZHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuRmllbGRzO1xuICAgICAgICBGaWVsZHMgPT09IG51bGwgfHwgRmllbGRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBGaWVsZHMucHVzaChmaWVsZCk7XG4gICAgfTtcbiAgICBQREZBY3JvRm9ybS5wcm90b3R5cGUucmVtb3ZlRmllbGQgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IGZpZWxkLmdldFBhcmVudCgpO1xuICAgICAgICB2YXIgZmllbGRzID0gcGFyZW50ID09PSB1bmRlZmluZWQgPyB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuRmllbGRzIDogcGFyZW50LktpZHMoKTtcbiAgICAgICAgdmFyIGluZGV4ID0gZmllbGRzID09PSBudWxsIHx8IGZpZWxkcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmllbGRzLmluZGV4T2YoZmllbGQucmVmKTtcbiAgICAgICAgaWYgKGZpZWxkcyA9PT0gdW5kZWZpbmVkIHx8IGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyaWVkIHRvIHJlbW92ZSBpbmV4aXN0ZW50IGZpZWxkIFwiICsgZmllbGQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpO1xuICAgICAgICB9XG4gICAgICAgIGZpZWxkcy5yZW1vdmUoaW5kZXgpO1xuICAgICAgICBpZiAocGFyZW50ICE9PSB1bmRlZmluZWQgJiYgZmllbGRzLnNpemUoKSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWVsZChwYXJlbnQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZBY3JvRm9ybS5wcm90b3R5cGUubm9ybWFsaXplZEVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBGaWVsZHMgPSB0aGlzLkZpZWxkcygpO1xuICAgICAgICBpZiAoIUZpZWxkcykge1xuICAgICAgICAgICAgRmllbGRzID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKFtdKTtcbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRmllbGRzJyksIEZpZWxkcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgRmllbGRzOiBGaWVsZHMgfTtcbiAgICB9O1xuICAgIFBERkFjcm9Gb3JtLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QpIHsgcmV0dXJuIG5ldyBQREZBY3JvRm9ybShkaWN0KTsgfTtcbiAgICBQREZBY3JvRm9ybS5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgZGljdCA9IGNvbnRleHQub2JqKHsgRmllbGRzOiBbXSB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvRm9ybShkaWN0KTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvRm9ybTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvRm9ybTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9Gb3JtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkFjcm9DaG9pY2UgZnJvbSBcIi4vUERGQWNyb0Nob2ljZVwiO1xudmFyIFBERkFjcm9MaXN0Qm94ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvTGlzdEJveCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvTGlzdEJveCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvTGlzdEJveC5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvTGlzdEJveChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgUERGQWNyb0xpc3RCb3guY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBGVDogJ0NoJyxcbiAgICAgICAgICAgIEtpZHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb0xpc3RCb3goZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvTGlzdEJveDtcbn0oUERGQWNyb0Nob2ljZSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb0xpc3RCb3g7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvTGlzdEJveC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBY3JvRmllbGQgZnJvbSBcIi4vUERGQWNyb0ZpZWxkXCI7XG52YXIgUERGQWNyb05vblRlcm1pbmFsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvTm9uVGVybWluYWwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb05vblRlcm1pbmFsKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9Ob25UZXJtaW5hbC5wcm90b3R5cGUuYWRkRmllbGQgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuS2lkcztcbiAgICAgICAgS2lkcyA9PT0gbnVsbCB8fCBLaWRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBLaWRzLnB1c2goZmllbGQpO1xuICAgIH07XG4gICAgUERGQWNyb05vblRlcm1pbmFsLnByb3RvdHlwZS5ub3JtYWxpemVkRW50cmllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgaWYgKCFLaWRzKSB7XG4gICAgICAgICAgICBLaWRzID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKFtdKTtcbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignS2lkcycpLCBLaWRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBLaWRzOiBLaWRzIH07XG4gICAgfTtcbiAgICBQREZBY3JvTm9uVGVybWluYWwuZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb05vblRlcm1pbmFsKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICBQREZBY3JvTm9uVGVybWluYWwuY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIHZhciByZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGRpY3QpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9Ob25UZXJtaW5hbChkaWN0LCByZWYpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkFjcm9Ob25UZXJtaW5hbDtcbn0oUERGQWNyb0ZpZWxkKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvTm9uVGVybWluYWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvTm9uVGVybWluYWwuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQWNyb0J1dHRvbiBmcm9tIFwiLi9QREZBY3JvQnV0dG9uXCI7XG5pbXBvcnQgeyBBY3JvQnV0dG9uRmxhZ3MgfSBmcm9tIFwiLi9mbGFnc1wiO1xudmFyIFBERkFjcm9QdXNoQnV0dG9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvUHVzaEJ1dHRvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvUHVzaEJ1dHRvbigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvUHVzaEJ1dHRvbi5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZBY3JvUHVzaEJ1dHRvbihkaWN0LCByZWYpO1xuICAgIH07XG4gICAgUERGQWNyb1B1c2hCdXR0b24uY3JlYXRlID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGRpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBGVDogJ0J0bicsXG4gICAgICAgICAgICBGZjogQWNyb0J1dHRvbkZsYWdzLlB1c2hCdXR0b24sXG4gICAgICAgICAgICBLaWRzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGRpY3QpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9QdXNoQnV0dG9uKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb1B1c2hCdXR0b247XG59KFBERkFjcm9CdXR0b24pKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9QdXNoQnV0dG9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQWNyb1B1c2hCdXR0b24uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGQWNyb0J1dHRvbiBmcm9tIFwiLi9QREZBY3JvQnV0dG9uXCI7XG5pbXBvcnQgeyBBY3JvQnV0dG9uRmxhZ3MgfSBmcm9tIFwiLi9mbGFnc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGQWNyb1JhZGlvQnV0dG9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZBY3JvUmFkaW9CdXR0b24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb1JhZGlvQnV0dG9uKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9SYWRpb0J1dHRvbi5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIG9uVmFsdWVzID0gdGhpcy5nZXRPblZhbHVlcygpO1xuICAgICAgICBpZiAoIW9uVmFsdWVzLmluY2x1ZGVzKHZhbHVlKSAmJiB2YWx1ZSAhPT0gUERGTmFtZS5vZignT2ZmJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWNyb0ZpZWxkVmFsdWVFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVicpLCB2YWx1ZSk7XG4gICAgICAgIHZhciB3aWRnZXRzID0gdGhpcy5nZXRXaWRnZXRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdpZGdldHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0c1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gd2lkZ2V0LmdldE9uVmFsdWUoKSA9PT0gdmFsdWUgPyB2YWx1ZSA6IFBERk5hbWUub2YoJ09mZicpO1xuICAgICAgICAgICAgd2lkZ2V0LnNldEFwcGVhcmFuY2VTdGF0ZShzdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkFjcm9SYWRpb0J1dHRvbi5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2ID0gdGhpcy5WKCk7XG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgUERGTmFtZSlcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICByZXR1cm4gUERGTmFtZS5vZignT2ZmJyk7XG4gICAgfTtcbiAgICBQREZBY3JvUmFkaW9CdXR0b24ucHJvdG90eXBlLmdldE9uVmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IHRoaXMuZ2V0V2lkZ2V0cygpO1xuICAgICAgICB2YXIgb25WYWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBvblZhbHVlID0gd2lkZ2V0c1tpZHhdLmdldE9uVmFsdWUoKTtcbiAgICAgICAgICAgIGlmIChvblZhbHVlKVxuICAgICAgICAgICAgICAgIG9uVmFsdWVzLnB1c2gob25WYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9uVmFsdWVzO1xuICAgIH07XG4gICAgUERGQWNyb1JhZGlvQnV0dG9uLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9SYWRpb0J1dHRvbihkaWN0LCByZWYpO1xuICAgIH07XG4gICAgUERGQWNyb1JhZGlvQnV0dG9uLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgRlQ6ICdCdG4nLFxuICAgICAgICAgICAgRmY6IEFjcm9CdXR0b25GbGFncy5SYWRpbyxcbiAgICAgICAgICAgIEtpZHM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZGljdCk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1JhZGlvQnV0dG9uKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb1JhZGlvQnV0dG9uO1xufShQREZBY3JvQnV0dG9uKSk7XG5leHBvcnQgZGVmYXVsdCBQREZBY3JvUmFkaW9CdXR0b247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvUmFkaW9CdXR0b24uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGQWNyb1Rlcm1pbmFsIGZyb20gXCIuL1BERkFjcm9UZXJtaW5hbFwiO1xudmFyIFBERkFjcm9TaWduYXR1cmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9TaWduYXR1cmUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQWNyb1NpZ25hdHVyZSgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZBY3JvU2lnbmF0dXJlLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9TaWduYXR1cmUoZGljdCwgcmVmKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZBY3JvU2lnbmF0dXJlO1xufShQREZBY3JvVGVybWluYWwpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9TaWduYXR1cmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvU2lnbmF0dXJlLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFjcm9GaWVsZCBmcm9tIFwiLi9QREZBY3JvRmllbGRcIjtcbmltcG9ydCBQREZXaWRnZXRBbm5vdGF0aW9uIGZyb20gXCIuLi9hbm5vdGF0aW9uL1BERldpZGdldEFubm90YXRpb25cIjtcbmltcG9ydCB7IEluZGV4T3V0T2ZCb3VuZHNFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZBY3JvVGVybWluYWwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9UZXJtaW5hbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBY3JvVGVybWluYWwoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQWNyb1Rlcm1pbmFsLnByb3RvdHlwZS5GVCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5hbWVPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5vZignRlQnKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3QuY29udGV4dC5sb29rdXAobmFtZU9yUmVmLCBQREZOYW1lKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXJtaW5hbC5wcm90b3R5cGUuZ2V0V2lkZ2V0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGtpZERpY3RzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIC8vIFRoaXMgZmllbGQgaXMgaXRzZWxmIGEgd2lkZ2V0XG4gICAgICAgIGlmICgha2lkRGljdHMpXG4gICAgICAgICAgICByZXR1cm4gW1BERldpZGdldEFubm90YXRpb24uZnJvbURpY3QodGhpcy5kaWN0KV07XG4gICAgICAgIC8vIFRoaXMgZmllbGQncyBraWRzIGFyZSBpdHMgd2lkZ2V0c1xuICAgICAgICB2YXIgd2lkZ2V0cyA9IG5ldyBBcnJheShraWREaWN0cy5zaXplKCkpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBraWREaWN0cy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBkaWN0ID0ga2lkRGljdHMubG9va3VwKGlkeCwgUERGRGljdCk7XG4gICAgICAgICAgICB3aWRnZXRzW2lkeF0gPSBQREZXaWRnZXRBbm5vdGF0aW9uLmZyb21EaWN0KGRpY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aWRnZXRzO1xuICAgIH07XG4gICAgUERGQWNyb1Rlcm1pbmFsLnByb3RvdHlwZS5hZGRXaWRnZXQgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLktpZHM7XG4gICAgICAgIEtpZHMucHVzaChyZWYpO1xuICAgIH07XG4gICAgUERGQWNyb1Rlcm1pbmFsLnByb3RvdHlwZS5yZW1vdmVXaWRnZXQgPSBmdW5jdGlvbiAoaWR4KSB7XG4gICAgICAgIHZhciBraWREaWN0cyA9IHRoaXMuS2lkcygpO1xuICAgICAgICBpZiAoIWtpZERpY3RzKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGZpZWxkIGlzIGl0c2VsZiBhIHdpZGdldFxuICAgICAgICAgICAgaWYgKGlkeCAhPT0gMClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0Vycm9yKGlkeCwgMCwgMCk7XG4gICAgICAgICAgICB0aGlzLnNldEtpZHMoW10pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhpcyBmaWVsZCdzIGtpZHMgYXJlIGl0cyB3aWRnZXRzXG4gICAgICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPiBraWREaWN0cy5zaXplKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0Vycm9yKGlkeCwgMCwga2lkRGljdHMuc2l6ZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtpZERpY3RzLnJlbW92ZShpZHgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZBY3JvVGVybWluYWwucHJvdG90eXBlLm5vcm1hbGl6ZWRFbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICAvLyBJZiB0aGlzIGZpZWxkIGlzIGl0c2VsZiBhIHdpZGdldCAoYmVjYXVzZSBpdCB3YXMgb25seSByZW5kZXJlZCBvbmNlIGluXG4gICAgICAgIC8vIHRoZSBkb2N1bWVudCwgc28gdGhlIGZpZWxkIGFuZCB3aWRnZXQgcHJvcGVydGllcyB3ZXJlIG1lcmdlZCkgdGhlbiB3ZVxuICAgICAgICAvLyBhZGQgaXRzZWxmIHRvIHRoZSBgS2lkc2AgYXJyYXkuIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byB0cnlcbiAgICAgICAgLy8gc3BsaXR0aW5nIGFwYXJ0IHRoZSB3aWRnZXQgcHJvcGVydGllcyBhbmQgY3JlYXRpbmcgYSBzZXBhcmF0ZSBvYmplY3RcbiAgICAgICAgLy8gZm9yIHRoZW0uXG4gICAgICAgIGlmICghS2lkcykge1xuICAgICAgICAgICAgS2lkcyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihbdGhpcy5yZWZdKTtcbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignS2lkcycpLCBLaWRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBLaWRzOiBLaWRzIH07XG4gICAgfTtcbiAgICBQREZBY3JvVGVybWluYWwuZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQWNyb1Rlcm1pbmFsKGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb1Rlcm1pbmFsO1xufShQREZBY3JvRmllbGQpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFjcm9UZXJtaW5hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFjcm9UZXJtaW5hbC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZBY3JvVGVybWluYWwgZnJvbSBcIi4vUERGQWNyb1Rlcm1pbmFsXCI7XG52YXIgUERGQWNyb1RleHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFjcm9UZXh0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFjcm9UZXh0KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5NYXhMZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtYXhMZW4gPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ01heExlbicpKTtcbiAgICAgICAgaWYgKG1heExlbiBpbnN0YW5jZW9mIFBERk51bWJlcilcbiAgICAgICAgICAgIHJldHVybiBtYXhMZW47XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuUSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHEgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1EnKSk7XG4gICAgICAgIGlmIChxIGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgcmV0dXJuIHE7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUuc2V0TWF4TGVuZ3RoID0gZnVuY3Rpb24gKG1heExlbmd0aCkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ01heExlbicpLCBQREZOdW1iZXIub2YobWF4TGVuZ3RoKSk7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5wcm90b3R5cGUucmVtb3ZlTWF4TGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ01heExlbicpKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5nZXRNYXhMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuTWF4TGVuKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc051bWJlcigpO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLnNldFF1YWRkaW5nID0gZnVuY3Rpb24gKHF1YWRkaW5nKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUScpLCBQREZOdW1iZXIub2YocXVhZGRpbmcpKTtcbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5nZXRRdWFkZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5RKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc051bWJlcigpO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignVicpLCB2YWx1ZSk7XG4gICAgICAgIC8vIGNvbnN0IHdpZGdldHMgPSB0aGlzLmdldFdpZGdldHMoKTtcbiAgICAgICAgLy8gZm9yIChsZXQgaWR4ID0gMCwgbGVuID0gd2lkZ2V0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgLy8gICBjb25zdCB3aWRnZXQgPSB3aWRnZXRzW2lkeF07XG4gICAgICAgIC8vICAgY29uc3Qgc3RhdGUgPSB3aWRnZXQuZ2V0T25WYWx1ZSgpID09PSB2YWx1ZSA/IHZhbHVlIDogUERGTmFtZS5vZignT2ZmJyk7XG4gICAgICAgIC8vICAgd2lkZ2V0LnNldEFwcGVhcmFuY2VTdGF0ZShzdGF0ZSk7XG4gICAgICAgIC8vIH1cbiAgICB9O1xuICAgIFBERkFjcm9UZXh0LnByb3RvdHlwZS5yZW1vdmVWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kaWN0LmRlbGV0ZShQREZOYW1lLm9mKCdWJykpO1xuICAgIH07XG4gICAgUERGQWNyb1RleHQucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdiA9IHRoaXMuVigpO1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIFBERlN0cmluZyB8fCB2IGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZBY3JvVGV4dC5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHsgcmV0dXJuIG5ldyBQREZBY3JvVGV4dChkaWN0LCByZWYpOyB9O1xuICAgIFBERkFjcm9UZXh0LmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgRlQ6ICdUeCcsXG4gICAgICAgICAgICBLaWRzOiBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZWYgPSBjb250ZXh0LnJlZ2lzdGVyKGRpY3QpO1xuICAgICAgICByZXR1cm4gbmV3IFBERkFjcm9UZXh0KGRpY3QsIHJlZik7XG4gICAgfTtcbiAgICByZXR1cm4gUERGQWNyb1RleHQ7XG59KFBERkFjcm9UZXJtaW5hbCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQWNyb1RleHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBY3JvVGV4dC5qcy5tYXAiLCJ2YXIgZmxhZyA9IGZ1bmN0aW9uIChiaXRJbmRleCkgeyByZXR1cm4gMSA8PCBiaXRJbmRleDsgfTtcbi8qKiBGcm9tIFBERiBzcGVjIHRhYmxlIDIyMSAqL1xuZXhwb3J0IHZhciBBY3JvRmllbGRGbGFncztcbihmdW5jdGlvbiAoQWNyb0ZpZWxkRmxhZ3MpIHtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSB1c2VyIG1heSBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuIEFueSBhc3NvY2lhdGVkXG4gICAgICogd2lkZ2V0IGFubm90YXRpb25zIHdpbGwgbm90IGludGVyYWN0IHdpdGggdGhlIHVzZXI7IHRoYXQgaXMsIHRoZXkgd2lsbCBub3RcbiAgICAgKiByZXNwb25kIHRvIG1vdXNlIGNsaWNrcyBvciBjaGFuZ2UgdGhlaXIgYXBwZWFyYW5jZSBpbiByZXNwb25zZSB0byBtb3VzZVxuICAgICAqIG1vdGlvbnMuIFRoaXMgZmxhZyBpcyB1c2VmdWwgZm9yIGZpZWxkcyB3aG9zZSB2YWx1ZXMgYXJlIGNvbXB1dGVkIG9yXG4gICAgICogaW1wb3J0ZWQgZnJvbSBhIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIEFjcm9GaWVsZEZsYWdzW0Fjcm9GaWVsZEZsYWdzW1wiUmVhZE9ubHlcIl0gPSBmbGFnKDEgLSAxKV0gPSBcIlJlYWRPbmx5XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgaGF2ZSBhIHZhbHVlIGF0IHRoZSB0aW1lIGl0IGlzIGV4cG9ydGVkIGJ5IGFcbiAgICAgKiBzdWJtaXQtZm9ybSBhY3Rpb24gKHNlZSAxMi43LjUuMiwgXCJTdWJtaXQtRm9ybSBBY3Rpb25cIikuXG4gICAgICovXG4gICAgQWNyb0ZpZWxkRmxhZ3NbQWNyb0ZpZWxkRmxhZ3NbXCJSZXF1aXJlZFwiXSA9IGZsYWcoMiAtIDEpXSA9IFwiUmVxdWlyZWRcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgZXhwb3J0ZWQgYnkgYSBzdWJtaXQtZm9ybSBhY3Rpb25cbiAgICAgKiAoc2VlIDEyLjcuNS4yLCBcIlN1Ym1pdC1Gb3JtIEFjdGlvblwiKS5cbiAgICAgKi9cbiAgICBBY3JvRmllbGRGbGFnc1tBY3JvRmllbGRGbGFnc1tcIk5vRXhwb3J0XCJdID0gZmxhZygzIC0gMSldID0gXCJOb0V4cG9ydFwiO1xufSkoQWNyb0ZpZWxkRmxhZ3MgfHwgKEFjcm9GaWVsZEZsYWdzID0ge30pKTtcbi8qKiBGcm9tIFBERiBzcGVjIHRhYmxlIDIyNiAqL1xuZXhwb3J0IHZhciBBY3JvQnV0dG9uRmxhZ3M7XG4oZnVuY3Rpb24gKEFjcm9CdXR0b25GbGFncykge1xuICAgIC8qKlxuICAgICAqIChSYWRpbyBidXR0b25zIG9ubHkpIElmIHNldCwgZXhhY3RseSBvbmUgcmFkaW8gYnV0dG9uIHNoYWxsIGJlIHNlbGVjdGVkIGF0XG4gICAgICogYWxsIHRpbWVzOyBzZWxlY3RpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBidXR0b24gaGFzIG5vIGVmZmVjdC4gSWYgY2xlYXIsXG4gICAgICogY2xpY2tpbmcgdGhlIHNlbGVjdGVkIGJ1dHRvbiBkZXNlbGVjdHMgaXQsIGxlYXZpbmcgbm8gYnV0dG9uIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEFjcm9CdXR0b25GbGFnc1tBY3JvQnV0dG9uRmxhZ3NbXCJOb1RvZ2dsZVRvT2ZmXCJdID0gZmxhZygxNSAtIDEpXSA9IFwiTm9Ub2dnbGVUb09mZlwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgc2V0IG9mIHJhZGlvIGJ1dHRvbnM7IGlmIGNsZWFyLCB0aGUgZmllbGQgaXMgYSBjaGVja1xuICAgICAqIGJveC4gVGhpcyBmbGFnIG1heSBiZSBzZXQgb25seSBpZiB0aGUgUHVzaGJ1dHRvbiBmbGFnIGlzIGNsZWFyLlxuICAgICAqL1xuICAgIEFjcm9CdXR0b25GbGFnc1tBY3JvQnV0dG9uRmxhZ3NbXCJSYWRpb1wiXSA9IGZsYWcoMTYgLSAxKV0gPSBcIlJhZGlvXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBwdXNoYnV0dG9uIHRoYXQgZG9lcyBub3QgcmV0YWluIGEgcGVybWFuZW50IHZhbHVlLlxuICAgICAqL1xuICAgIEFjcm9CdXR0b25GbGFnc1tBY3JvQnV0dG9uRmxhZ3NbXCJQdXNoQnV0dG9uXCJdID0gZmxhZygxNyAtIDEpXSA9IFwiUHVzaEJ1dHRvblwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgYSBncm91cCBvZiByYWRpbyBidXR0b25zIHdpdGhpbiBhIHJhZGlvIGJ1dHRvbiBmaWVsZCB0aGF0IHVzZSB0aGVcbiAgICAgKiBzYW1lIHZhbHVlIGZvciB0aGUgb24gc3RhdGUgd2lsbCB0dXJuIG9uIGFuZCBvZmYgaW4gdW5pc29uOyB0aGF0IGlzIGlmIG9uZVxuICAgICAqIGlzIGNoZWNrZWQsIHRoZXkgYXJlIGFsbCBjaGVja2VkLiBJZiBjbGVhciwgdGhlIGJ1dHRvbnMgYXJlIG11dHVhbGx5XG4gICAgICogZXhjbHVzaXZlICh0aGUgc2FtZSBiZWhhdmlvciBhcyBIVE1MIHJhZGlvIGJ1dHRvbnMpLlxuICAgICAqL1xuICAgIEFjcm9CdXR0b25GbGFnc1tBY3JvQnV0dG9uRmxhZ3NbXCJSYWRpb3NJblVuaXNvblwiXSA9IGZsYWcoMjYgLSAxKV0gPSBcIlJhZGlvc0luVW5pc29uXCI7XG59KShBY3JvQnV0dG9uRmxhZ3MgfHwgKEFjcm9CdXR0b25GbGFncyA9IHt9KSk7XG4vKiogRnJvbSBQREYgc3BlYyB0YWJsZSAyMjggKi9cbmV4cG9ydCB2YXIgQWNyb1RleHRGbGFncztcbihmdW5jdGlvbiAoQWNyb1RleHRGbGFncykge1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkIG1heSBjb250YWluIG11bHRpcGxlIGxpbmVzIG9mIHRleHQ7IGlmIGNsZWFyLCB0aGUgZmllbGQnc1xuICAgICAqIHRleHQgc2hhbGwgYmUgcmVzdHJpY3RlZCB0byBhIHNpbmdsZSBsaW5lLlxuICAgICAqL1xuICAgIEFjcm9UZXh0RmxhZ3NbQWNyb1RleHRGbGFnc1tcIk11bHRpbGluZVwiXSA9IGZsYWcoMTMgLSAxKV0gPSBcIk11bHRpbGluZVwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGludGVuZGVkIGZvciBlbnRlcmluZyBhIHNlY3VyZSBwYXNzd29yZCB0aGF0IHNob3VsZFxuICAgICAqIG5vdCBiZSBlY2hvZWQgdmlzaWJseSB0byB0aGUgc2NyZWVuLiBDaGFyYWN0ZXJzIHR5cGVkIGZyb20gdGhlIGtleWJvYXJkXG4gICAgICogc2hhbGwgaW5zdGVhZCBiZSBlY2hvZWQgaW4gc29tZSB1bnJlYWRhYmxlIGZvcm0sIHN1Y2ggYXMgYXN0ZXJpc2tzIG9yXG4gICAgICogYnVsbGV0IGNoYXJhY3RlcnMuXG4gICAgICogPiBOT1RFICAgVG8gcHJvdGVjdCBwYXNzd29yZCBjb25maWRlbnRpYWxpdHksIHJlYWRlcnMgc2hvdWxkIG5ldmVyIHN0b3JlXG4gICAgICogPiAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IGZpZWxkIGluIHRoZSBQREYgZmlsZSBpZiB0aGlzIGZsYWcgaXMgc2V0LlxuICAgICAqL1xuICAgIEFjcm9UZXh0RmxhZ3NbQWNyb1RleHRGbGFnc1tcIlBhc3N3b3JkXCJdID0gZmxhZygxNCAtIDEpXSA9IFwiUGFzc3dvcmRcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhlIGZpZWxkIHJlcHJlc2VudHMgdGhlIHBhdGhuYW1lIG9mIGEgZmlsZVxuICAgICAqIHdob3NlIGNvbnRlbnRzIHNoYWxsIGJlIHN1Ym1pdHRlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqL1xuICAgIEFjcm9UZXh0RmxhZ3NbQWNyb1RleHRGbGFnc1tcIkZpbGVTZWxlY3RcIl0gPSBmbGFnKDIxIC0gMSldID0gXCJGaWxlU2VsZWN0XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0ZXh0IGVudGVyZWQgaW4gdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBzcGVsbC1jaGVja2VkLlxuICAgICAqL1xuICAgIEFjcm9UZXh0RmxhZ3NbQWNyb1RleHRGbGFnc1tcIkRvTm90U3BlbGxDaGVja1wiXSA9IGZsYWcoMjMgLSAxKV0gPSBcIkRvTm90U3BlbGxDaGVja1wiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIG5vdCBzY3JvbGwgKGhvcml6b250YWxseSBmb3Igc2luZ2xlLWxpbmUgZmllbGRzLFxuICAgICAqIHZlcnRpY2FsbHkgZm9yIG11bHRpcGxlLWxpbmUgZmllbGRzKSB0byBhY2NvbW1vZGF0ZSBtb3JlIHRleHQgdGhhbiBmaXRzXG4gICAgICogd2l0aGluIGl0cyBhbm5vdGF0aW9uIHJlY3RhbmdsZS4gT25jZSB0aGUgZmllbGQgaXMgZnVsbCwgbm8gZnVydGhlciB0ZXh0XG4gICAgICogc2hhbGwgYmUgYWNjZXB0ZWQgZm9yIGludGVyYWN0aXZlIGZvcm0gZmlsbGluZzsgZm9yIG5vbi1pbnRlcmFjdGl2ZSBmb3JtXG4gICAgICogZmlsbGluZywgdGhlIGZpbGxlciBzaG91bGQgdGFrZSBjYXJlIG5vdCB0byBhZGQgbW9yZSBjaGFyYWN0ZXIgdGhhbiB3aWxsXG4gICAgICogdmlzaWJseSBmaXQgaW4gdGhlIGRlZmluZWQgYXJlYS5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJEb05vdFNjcm9sbFwiXSA9IGZsYWcoMjQgLSAxKV0gPSBcIkRvTm90U2Nyb2xsXCI7XG4gICAgLyoqXG4gICAgICogTWF5IGJlIHNldCBvbmx5IGlmIHRoZSBNYXhMZW4gZW50cnkgaXMgcHJlc2VudCBpbiB0aGUgdGV4dCBmaWVsZCBkaWN0aW9uYXJ5XG4gICAgICogKHNlZSBUYWJsZSAyMjkpIGFuZCBpZiB0aGUgTXVsdGlsaW5lLCBQYXNzd29yZCwgYW5kIEZpbGVTZWxlY3QgZmxhZ3MgYXJlXG4gICAgICogY2xlYXIuIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIGJlIGF1dG9tYXRpY2FsbHkgZGl2aWRlZCBpbnRvIGFzIG1hbnlcbiAgICAgKiBlcXVhbGx5IHNwYWNlZCBwb3NpdGlvbnMsIG9yIGNvbWJzLCBhcyB0aGUgdmFsdWUgb2YgTWF4TGVuLCBhbmQgdGhlIHRleHRcbiAgICAgKiBpcyBsYWlkIG91dCBpbnRvIHRob3NlIGNvbWJzLlxuICAgICAqL1xuICAgIEFjcm9UZXh0RmxhZ3NbQWNyb1RleHRGbGFnc1tcIkNvbWJcIl0gPSBmbGFnKDI1IC0gMSldID0gXCJDb21iXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBzaGFsbCBiZSBhIHJpY2ggdGV4dCBzdHJpbmdcbiAgICAgKiAoc2VlIDEyLjcuMy40LCBcIlJpY2ggVGV4dCBTdHJpbmdzXCIpLiBJZiB0aGUgZmllbGQgaGFzIGEgdmFsdWUsIHRoZSBSVlxuICAgICAqIGVudHJ5IG9mIHRoZSBmaWVsZCBkaWN0aW9uYXJ5IChUYWJsZSAyMjIpIHNoYWxsIHNwZWNpZnkgdGhlIHJpY2ggdGV4dFxuICAgICAqIHN0cmluZy5cbiAgICAgKi9cbiAgICBBY3JvVGV4dEZsYWdzW0Fjcm9UZXh0RmxhZ3NbXCJSaWNoVGV4dFwiXSA9IGZsYWcoMjYgLSAxKV0gPSBcIlJpY2hUZXh0XCI7XG59KShBY3JvVGV4dEZsYWdzIHx8IChBY3JvVGV4dEZsYWdzID0ge30pKTtcbi8qKiBGcm9tIFBERiBzcGVjIHRhYmxlIDIzMCAqL1xuZXhwb3J0IHZhciBBY3JvQ2hvaWNlRmxhZ3M7XG4oZnVuY3Rpb24gKEFjcm9DaG9pY2VGbGFncykge1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgY29tYm8gYm94OyBpZiBjbGVhciwgdGhlIGZpZWxkIGlzIGEgbGlzdCBib3guXG4gICAgICovXG4gICAgQWNyb0Nob2ljZUZsYWdzW0Fjcm9DaG9pY2VGbGFnc1tcIkNvbWJvXCJdID0gZmxhZygxOCAtIDEpXSA9IFwiQ29tYm9cIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBjb21ibyBib3ggc2hhbGwgaW5jbHVkZSBhbiBlZGl0YWJsZSB0ZXh0IGJveCBhcyB3ZWxsIGFzIGFcbiAgICAgKiBkcm9wLWRvd24gbGlzdDsgaWYgY2xlYXIsIGl0IHNoYWxsIGluY2x1ZGUgb25seSBhIGRyb3AtZG93biBsaXN0LiBUaGlzXG4gICAgICogZmxhZyBzaGFsbCBiZSB1c2VkIG9ubHkgaWYgdGhlIENvbWJvIGZsYWcgaXMgc2V0LlxuICAgICAqL1xuICAgIEFjcm9DaG9pY2VGbGFnc1tBY3JvQ2hvaWNlRmxhZ3NbXCJFZGl0XCJdID0gZmxhZygxOSAtIDEpXSA9IFwiRWRpdFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIGZpZWxkJ3Mgb3B0aW9uIGl0ZW1zIHNoYWxsIGJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gVGhpcyBmbGFnXG4gICAgICogaXMgaW50ZW5kZWQgZm9yIHVzZSBieSB3cml0ZXJzLCBub3QgYnkgcmVhZGVycy4gQ29uZm9ybWluZyByZWFkZXJzIHNoYWxsXG4gICAgICogZGlzcGxheSB0aGUgb3B0aW9ucyBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1ciBpbiB0aGUgT3B0IGFycmF5XG4gICAgICogKHNlZSBUYWJsZSAyMzEpLlxuICAgICAqL1xuICAgIEFjcm9DaG9pY2VGbGFnc1tBY3JvQ2hvaWNlRmxhZ3NbXCJTb3J0XCJdID0gZmxhZygyMCAtIDEpXSA9IFwiU29ydFwiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgbW9yZSB0aGFuIG9uZSBvZiB0aGUgZmllbGQncyBvcHRpb24gaXRlbXMgbWF5IGJlIHNlbGVjdGVkXG4gICAgICogc2ltdWx0YW5lb3VzbHk7IGlmIGNsZWFyLCBhdCBtb3N0IG9uZSBpdGVtIHNoYWxsIGJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEFjcm9DaG9pY2VGbGFnc1tBY3JvQ2hvaWNlRmxhZ3NbXCJNdWx0aVNlbGVjdFwiXSA9IGZsYWcoMjIgLSAxKV0gPSBcIk11bHRpU2VsZWN0XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0ZXh0IGVudGVyZWQgaW4gdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBzcGVsbC1jaGVja2VkLiBUaGlzIGZsYWdcbiAgICAgKiBzaGFsbCBub3QgYmUgdXNlZCB1bmxlc3MgdGhlIENvbWJvIGFuZCBFZGl0IGZsYWdzIGFyZSBib3RoIHNldC5cbiAgICAgKi9cbiAgICBBY3JvQ2hvaWNlRmxhZ3NbQWNyb0Nob2ljZUZsYWdzW1wiRG9Ob3RTcGVsbENoZWNrXCJdID0gZmxhZygyMyAtIDEpXSA9IFwiRG9Ob3RTcGVsbENoZWNrXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgbmV3IHZhbHVlIHNoYWxsIGJlIGNvbW1pdHRlZCBhcyBzb29uIGFzIGEgc2VsZWN0aW9uIGlzIG1hZGVcbiAgICAgKiAoY29tbW9ubHkgd2l0aCB0aGUgcG9pbnRpbmcgZGV2aWNlKS4gSW4gdGhpcyBjYXNlLCBzdXBwbHlpbmcgYSB2YWx1ZSBmb3JcbiAgICAgKiBhIGZpZWxkIGludm9sdmVzIHRocmVlIGFjdGlvbnM6IHNlbGVjdGluZyB0aGUgZmllbGQgZm9yIGZpbGwtaW4sXG4gICAgICogc2VsZWN0aW5nIGEgY2hvaWNlIGZvciB0aGUgZmlsbC1pbiB2YWx1ZSwgYW5kIGxlYXZpbmcgdGhhdCBmaWVsZCwgd2hpY2hcbiAgICAgKiBmaW5hbGl6ZXMgb3IgXCJjb21taXRzXCIgdGhlIGRhdGEgY2hvaWNlIGFuZCB0cmlnZ2VycyBhbnkgYWN0aW9ucyBhc3NvY2lhdGVkXG4gICAgICogd2l0aCB0aGUgZW50cnkgb3IgY2hhbmdpbmcgb2YgdGhpcyBkYXRhLiBJZiB0aGlzIGZsYWcgaXMgb24sIHRoZW5cbiAgICAgKiBwcm9jZXNzaW5nIGRvZXMgbm90IHdhaXQgZm9yIGxlYXZpbmcgdGhlIGZpZWxkIGFjdGlvbiB0byBvY2N1ciwgYnV0XG4gICAgICogaW1tZWRpYXRlbHkgcHJvY2VlZHMgdG8gdGhlIHRoaXJkIHN0ZXAuXG4gICAgICpcbiAgICAgKiBUaGlzIG9wdGlvbiBlbmFibGVzIGFwcGxpY2F0aW9ucyB0byBwZXJmb3JtIGFuIGFjdGlvbiBvbmNlIGEgc2VsZWN0aW9uIGlzXG4gICAgICogbWFkZSwgd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZXIgdG8gZXhpdCB0aGUgZmllbGQuIElmIGNsZWFyLCB0aGUgbmV3XG4gICAgICogdmFsdWUgaXMgbm90IGNvbW1pdHRlZCB1bnRpbCB0aGUgdXNlciBleGl0cyB0aGUgZmllbGQuXG4gICAgICovXG4gICAgQWNyb0Nob2ljZUZsYWdzW0Fjcm9DaG9pY2VGbGFnc1tcIkNvbW1pdE9uU2VsQ2hhbmdlXCJdID0gZmxhZygyNyAtIDEpXSA9IFwiQ29tbWl0T25TZWxDaGFuZ2VcIjtcbn0pKEFjcm9DaG9pY2VGbGFncyB8fCAoQWNyb0Nob2ljZUZsYWdzID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZsYWdzLmpzLm1hcCIsImV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb0J1dHRvbiB9IGZyb20gXCIuL1BERkFjcm9CdXR0b25cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb0NoZWNrQm94IH0gZnJvbSBcIi4vUERGQWNyb0NoZWNrQm94XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9DaG9pY2UgfSBmcm9tIFwiLi9QREZBY3JvQ2hvaWNlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9Db21ib0JveCB9IGZyb20gXCIuL1BERkFjcm9Db21ib0JveFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvRmllbGQgfSBmcm9tIFwiLi9QREZBY3JvRmllbGRcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb0Zvcm0gfSBmcm9tIFwiLi9QREZBY3JvRm9ybVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvTGlzdEJveCB9IGZyb20gXCIuL1BERkFjcm9MaXN0Qm94XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9Ob25UZXJtaW5hbCB9IGZyb20gXCIuL1BERkFjcm9Ob25UZXJtaW5hbFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvUHVzaEJ1dHRvbiB9IGZyb20gXCIuL1BERkFjcm9QdXNoQnV0dG9uXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkFjcm9SYWRpb0J1dHRvbiB9IGZyb20gXCIuL1BERkFjcm9SYWRpb0J1dHRvblwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvU2lnbmF0dXJlIH0gZnJvbSBcIi4vUERGQWNyb1NpZ25hdHVyZVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBY3JvVGVybWluYWwgfSBmcm9tIFwiLi9QREZBY3JvVGVybWluYWxcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQWNyb1RleHQgfSBmcm9tIFwiLi9QREZBY3JvVGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmxhZ3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERkFjcm9UZXJtaW5hbCBmcm9tIFwiLi9QREZBY3JvVGVybWluYWxcIjtcbmltcG9ydCBQREZBY3JvTm9uVGVybWluYWwgZnJvbSBcIi4vUERGQWNyb05vblRlcm1pbmFsXCI7XG5pbXBvcnQgUERGQWNyb1NpZ25hdHVyZSBmcm9tIFwiLi9QREZBY3JvU2lnbmF0dXJlXCI7XG5pbXBvcnQgUERGQWNyb1RleHQgZnJvbSBcIi4vUERGQWNyb1RleHRcIjtcbmltcG9ydCBQREZBY3JvUHVzaEJ1dHRvbiBmcm9tIFwiLi9QREZBY3JvUHVzaEJ1dHRvblwiO1xuaW1wb3J0IFBERkFjcm9SYWRpb0J1dHRvbiBmcm9tIFwiLi9QREZBY3JvUmFkaW9CdXR0b25cIjtcbmltcG9ydCBQREZBY3JvQ2hlY2tCb3ggZnJvbSBcIi4vUERGQWNyb0NoZWNrQm94XCI7XG5pbXBvcnQgUERGQWNyb0NvbWJvQm94IGZyb20gXCIuL1BERkFjcm9Db21ib0JveFwiO1xuaW1wb3J0IFBERkFjcm9MaXN0Qm94IGZyb20gXCIuL1BERkFjcm9MaXN0Qm94XCI7XG5pbXBvcnQgeyBBY3JvQnV0dG9uRmxhZ3MsIEFjcm9DaG9pY2VGbGFncyB9IGZyb20gXCIuL2ZsYWdzXCI7XG5leHBvcnQgdmFyIGNyZWF0ZVBERkFjcm9GaWVsZHMgPSBmdW5jdGlvbiAoa2lkRGljdHMpIHtcbiAgICBpZiAoIWtpZERpY3RzKVxuICAgICAgICByZXR1cm4gW107XG4gICAgdmFyIGtpZHMgPSBbXTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBraWREaWN0cy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIHJlZiA9IGtpZERpY3RzLmdldChpZHgpO1xuICAgICAgICB2YXIgZGljdCA9IGtpZERpY3RzLmxvb2t1cChpZHgpO1xuICAgICAgICAvLyBpZiAoZGljdCBpbnN0YW5jZW9mIFBERkRpY3QpIGtpZHMucHVzaChQREZBY3JvRmllbGQuZnJvbURpY3QoZGljdCkpO1xuICAgICAgICBpZiAocmVmIGluc3RhbmNlb2YgUERGUmVmICYmIGRpY3QgaW5zdGFuY2VvZiBQREZEaWN0KSB7XG4gICAgICAgICAgICBraWRzLnB1c2goW2NyZWF0ZVBERkFjcm9GaWVsZChkaWN0LCByZWYpLCByZWZdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2lkcztcbn07XG5leHBvcnQgdmFyIGNyZWF0ZVBERkFjcm9GaWVsZCA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICB2YXIgaXNOb25UZXJtaW5hbCA9IGlzTm9uVGVybWluYWxBY3JvRmllbGQoZGljdCk7XG4gICAgaWYgKGlzTm9uVGVybWluYWwpXG4gICAgICAgIHJldHVybiBQREZBY3JvTm9uVGVybWluYWwuZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICByZXR1cm4gY3JlYXRlUERGQWNyb1Rlcm1pbmFsKGRpY3QsIHJlZik7XG59O1xuLy8gVE9ETzogTWF5YmUganVzdCBjaGVjayBpZiB0aGUgZGljdCBpcyAqbm90KiBhIHdpZGdldD8gVGhhdCBtaWdodCBiZSBiZXR0ZXIuXG4vLyBBY2NvcmRpbmcgdG8gdGhlIFBERiBzcGVjOlxuLy9cbi8vICAgPiBBIGZpZWxkJ3MgY2hpbGRyZW4gaW4gdGhlIGhpZXJhcmNoeSBtYXkgYWxzbyBpbmNsdWRlIHdpZGdldCBhbm5vdGF0aW9uc1xuLy8gICA+IHRoYXQgZGVmaW5lIGl0cyBhcHBlYXJhbmNlIG9uIHRoZSBwYWdlLiBBIGZpZWxkIHRoYXQgaGFzIGNoaWxkcmVuIHRoYXRcbi8vICAgPiBhcmUgZmllbGRzIGlzIGNhbGxlZCBhIG5vbi10ZXJtaW5hbCBmaWVsZC4gQSBmaWVsZCB0aGF0IGRvZXMgbm90IGhhdmVcbi8vICAgPiBjaGlsZHJlbiB0aGF0IGFyZSBmaWVsZHMgaXMgY2FsbGVkIGEgdGVybWluYWwgZmllbGQuXG4vL1xuLy8gVGhlIHNwZWMgaXMgbm90IGVudGlyZWx5IGNsZWFyIGFib3V0IGhvdyB0byBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuXG4vLyBkaWN0aW9uYXJ5IHJlcHJlc2VudHMgYW4gYWNyb2ZpZWxkIG9yIGEgd2lkZ2V0IGFubm90YXRpb24uIFNvIHdlIHdpbGwgYXNzdW1lXG4vLyB0aGF0IGEgZGljdGlvbmFyeSBpcyBhbiBhY3JvZmllbGQgaWYgaXQgaXMgYSBtZW1iZXIgb2YgdGhlIGAvS2lkc2AgYXJyYXlcbi8vIGFuZCBpdCBjb250YWlucyBhIGAvVGAgZW50cnkgKHdpZGdldHMgZG8gbm90IGhhdmUgYC9UYCBlbnRyaWVzKS4gVGhpcyBpc24ndFxuLy8gYSBidWxsZXQgcHJvb2Ygc29sdXRpb24sIGJlY2F1c2UgdGhlIGAvVGAgZW50cnkgaXMgdGVjaG5pY2FsbHkgZGVmaW5lZCBhc1xuLy8gb3B0aW9uYWwgZm9yIGFjcm9maWVsZHMgYnkgdGhlIFBERiBzcGVjLiBCdXQgaW4gcHJhY3RpY2UgYWxsIGFjcm9maWVsZHMgc2VlbVxuLy8gdG8gaGF2ZSBhIGAvVGAgZW50cnkgZGVmaW5lZC5cbnZhciBpc05vblRlcm1pbmFsQWNyb0ZpZWxkID0gZnVuY3Rpb24gKGRpY3QpIHtcbiAgICB2YXIga2lkcyA9IGRpY3QubG9va3VwKFBERk5hbWUub2YoJ0tpZHMnKSk7XG4gICAgaWYgKGtpZHMgaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBraWRzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGtpZCA9IGtpZHMubG9va3VwKGlkeCk7XG4gICAgICAgICAgICB2YXIga2lkSXNGaWVsZCA9IGtpZCBpbnN0YW5jZW9mIFBERkRpY3QgJiYga2lkLmhhcyhQREZOYW1lLm9mKCdUJykpO1xuICAgICAgICAgICAgaWYgKGtpZElzRmllbGQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbnZhciBjcmVhdGVQREZBY3JvVGVybWluYWwgPSBmdW5jdGlvbiAoZGljdCwgcmVmKSB7XG4gICAgdmFyIGZ0TmFtZU9yUmVmID0gZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoZGljdCwgUERGTmFtZS5vZignRlQnKSk7XG4gICAgdmFyIHR5cGUgPSBkaWN0LmNvbnRleHQubG9va3VwKGZ0TmFtZU9yUmVmLCBQREZOYW1lKTtcbiAgICBpZiAodHlwZSA9PT0gUERGTmFtZS5vZignQnRuJykpXG4gICAgICAgIHJldHVybiBjcmVhdGVQREZBY3JvQnV0dG9uKGRpY3QsIHJlZik7XG4gICAgaWYgKHR5cGUgPT09IFBERk5hbWUub2YoJ0NoJykpXG4gICAgICAgIHJldHVybiBjcmVhdGVQREZBY3JvQ2hvaWNlKGRpY3QsIHJlZik7XG4gICAgaWYgKHR5cGUgPT09IFBERk5hbWUub2YoJ1R4JykpXG4gICAgICAgIHJldHVybiBQREZBY3JvVGV4dC5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIGlmICh0eXBlID09PSBQREZOYW1lLm9mKCdTaWcnKSlcbiAgICAgICAgcmV0dXJuIFBERkFjcm9TaWduYXR1cmUuZnJvbURpY3QoZGljdCwgcmVmKTtcbiAgICAvLyBXZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBsaW5lLiBCdXQgdGhlcmUgYXJlIGEgbG90IG9mIHdlaXJkIFBERnMgb3V0XG4gICAgLy8gdGhlcmUuIFNvLCBqdXN0IHRvIGJlIHNhZmUsIHdlJ2xsIHRyeSB0byBoYW5kbGUgdGhpbmdzIGdyYWNlZnVsbHkgaW5zdGVhZFxuICAgIC8vIG9mIHRocm93aW5nIGFuIGVycm9yLlxuICAgIHJldHVybiBQREZBY3JvVGVybWluYWwuZnJvbURpY3QoZGljdCwgcmVmKTtcbn07XG52YXIgY3JlYXRlUERGQWNyb0J1dHRvbiA9IGZ1bmN0aW9uIChkaWN0LCByZWYpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGZmTnVtYmVyT3JSZWYgPSBnZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShkaWN0LCBQREZOYW1lLm9mKCdGZicpKTtcbiAgICB2YXIgZmZOdW1iZXIgPSBkaWN0LmNvbnRleHQubG9va3VwTWF5YmUoZmZOdW1iZXJPclJlZiwgUERGTnVtYmVyKTtcbiAgICB2YXIgZmxhZ3MgPSAoX2EgPSBmZk51bWJlciA9PT0gbnVsbCB8fCBmZk51bWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmZOdW1iZXIuYXNOdW1iZXIoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICBpZiAoZmxhZ0lzU2V0KGZsYWdzLCBBY3JvQnV0dG9uRmxhZ3MuUHVzaEJ1dHRvbikpIHtcbiAgICAgICAgcmV0dXJuIFBERkFjcm9QdXNoQnV0dG9uLmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZsYWdJc1NldChmbGFncywgQWNyb0J1dHRvbkZsYWdzLlJhZGlvKSkge1xuICAgICAgICByZXR1cm4gUERGQWNyb1JhZGlvQnV0dG9uLmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gUERGQWNyb0NoZWNrQm94LmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgfVxufTtcbnZhciBjcmVhdGVQREZBY3JvQ2hvaWNlID0gZnVuY3Rpb24gKGRpY3QsIHJlZikge1xuICAgIHZhciBfYTtcbiAgICB2YXIgZmZOdW1iZXJPclJlZiA9IGdldEluaGVyaXRhYmxlQXR0cmlidXRlKGRpY3QsIFBERk5hbWUub2YoJ0ZmJykpO1xuICAgIHZhciBmZk51bWJlciA9IGRpY3QuY29udGV4dC5sb29rdXBNYXliZShmZk51bWJlck9yUmVmLCBQREZOdW1iZXIpO1xuICAgIHZhciBmbGFncyA9IChfYSA9IGZmTnVtYmVyID09PSBudWxsIHx8IGZmTnVtYmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmZk51bWJlci5hc051bWJlcigpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xuICAgIGlmIChmbGFnSXNTZXQoZmxhZ3MsIEFjcm9DaG9pY2VGbGFncy5Db21ibykpIHtcbiAgICAgICAgcmV0dXJuIFBERkFjcm9Db21ib0JveC5mcm9tRGljdChkaWN0LCByZWYpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFBERkFjcm9MaXN0Qm94LmZyb21EaWN0KGRpY3QsIHJlZik7XG4gICAgfVxufTtcbnZhciBmbGFnSXNTZXQgPSBmdW5jdGlvbiAoZmxhZ3MsIGZsYWcpIHtcbiAgICByZXR1cm4gKGZsYWdzICYgZmxhZykgIT09IDA7XG59O1xudmFyIGdldEluaGVyaXRhYmxlQXR0cmlidXRlID0gZnVuY3Rpb24gKHN0YXJ0Tm9kZSwgbmFtZSkge1xuICAgIHZhciBhdHRyaWJ1dGU7XG4gICAgYXNjZW5kKHN0YXJ0Tm9kZSwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGUpXG4gICAgICAgICAgICBhdHRyaWJ1dGUgPSBub2RlLmdldChuYW1lKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXR0cmlidXRlO1xufTtcbnZhciBhc2NlbmQgPSBmdW5jdGlvbiAoc3RhcnROb2RlLCB2aXNpdG9yKSB7XG4gICAgdmlzaXRvcihzdGFydE5vZGUpO1xuICAgIHZhciBQYXJlbnQgPSBzdGFydE5vZGUubG9va3VwTWF5YmUoUERGTmFtZS5vZignUGFyZW50JyksIFBERkRpY3QpO1xuICAgIGlmIChQYXJlbnQpXG4gICAgICAgIGFzY2VuZChQYXJlbnQsIHZpc2l0b3IpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsImltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xudmFyIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcyhkaWN0KSB7XG4gICAgICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgfVxuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLlIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBSID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdSJykpO1xuICAgICAgICBpZiAoUiBpbnN0YW5jZW9mIFBERk51bWJlcilcbiAgICAgICAgICAgIHJldHVybiBSO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuQkMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCQyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignQkMnKSk7XG4gICAgICAgIGlmIChCQyBpbnN0YW5jZW9mIFBERkFycmF5KVxuICAgICAgICAgICAgcmV0dXJuIEJDO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuQkcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCRyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignQkcnKSk7XG4gICAgICAgIGlmIChCRyBpbnN0YW5jZW9mIFBERkFycmF5KVxuICAgICAgICAgICAgcmV0dXJuIEJHO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuQ0EgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBDQSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignQ0EnKSk7XG4gICAgICAgIGlmIChDQSBpbnN0YW5jZW9mIFBERkhleFN0cmluZyB8fCBDQSBpbnN0YW5jZW9mIFBERlN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBDQTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLlJDID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgUkMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1JDJykpO1xuICAgICAgICBpZiAoUkMgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcgfHwgUkMgaW5zdGFuY2VvZiBQREZTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gUkM7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5BQyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEFDID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdBQycpKTtcbiAgICAgICAgaWYgKEFDIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nIHx8IEFDIGluc3RhbmNlb2YgUERGU3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIEFDO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuZ2V0Um90YXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuUigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKTtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLmdldEJvcmRlckNvbG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQkMgPSB0aGlzLkJDKCk7XG4gICAgICAgIGlmICghQkMpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBCQyA9PT0gbnVsbCB8fCBCQyA9PT0gdm9pZCAwID8gdm9pZCAwIDogQkMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gQkMuZ2V0KGlkeCk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgUERGTnVtYmVyKVxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChjb21wb25lbnQuYXNOdW1iZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5nZXRCYWNrZ3JvdW5kQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCRyA9IHRoaXMuQkcoKTtcbiAgICAgICAgaWYgKCFCRylcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBjb21wb25lbnRzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEJHID09PSBudWxsIHx8IEJHID09PSB2b2lkIDAgPyB2b2lkIDAgOiBCRy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSBCRy5nZXQoaWR4KTtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBQREZOdW1iZXIpXG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudC5hc051bWJlcigpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLmdldENhcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQ0EgPSB0aGlzLkNBKCk7XG4gICAgICAgIHZhciBSQyA9IHRoaXMuUkMoKTtcbiAgICAgICAgdmFyIEFDID0gdGhpcy5BQygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9ybWFsOiBDQSA9PT0gbnVsbCB8fCBDQSA9PT0gdm9pZCAwID8gdm9pZCAwIDogQ0EuZGVjb2RlVGV4dCgpLFxuICAgICAgICAgICAgcm9sbG92ZXI6IFJDID09PSBudWxsIHx8IFJDID09PSB2b2lkIDAgPyB2b2lkIDAgOiBSQy5kZWNvZGVUZXh0KCksXG4gICAgICAgICAgICBkb3duOiBBQyA9PT0gbnVsbCB8fCBBQyA9PT0gdm9pZCAwID8gdm9pZCAwIDogQUMuZGVjb2RlVGV4dCgpLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5wcm90b3R5cGUuc2V0Um90YXRpb24gPSBmdW5jdGlvbiAocm90YXRpb24pIHtcbiAgICAgICAgdmFyIFIgPSB0aGlzLmRpY3QuY29udGV4dC5vYmoocm90YXRpb24pO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1InKSwgUik7XG4gICAgfTtcbiAgICBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLnByb3RvdHlwZS5zZXRCb3JkZXJDb2xvciA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgQkMgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooY29sb3IpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0JDJyksIEJDKTtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLnNldEJhY2tncm91bmRDb2xvciA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgQkcgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooY29sb3IpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0JHJyksIEJHKTtcbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MucHJvdG90eXBlLnNldENhcHRpb25zID0gZnVuY3Rpb24gKGNhcHRpb25zKSB7XG4gICAgICAgIHZhciBDQSA9IFBERkhleFN0cmluZy5mcm9tVGV4dChjYXB0aW9ucy5ub3JtYWwpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0NBJyksIENBKTtcbiAgICAgICAgaWYgKGNhcHRpb25zLnJvbGxvdmVyKSB7XG4gICAgICAgICAgICB2YXIgUkMgPSBQREZIZXhTdHJpbmcuZnJvbVRleHQoY2FwdGlvbnMucm9sbG92ZXIpO1xuICAgICAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdSQycpLCBSQyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpY3QuZGVsZXRlKFBERk5hbWUub2YoJ1JDJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXB0aW9ucy5kb3duKSB7XG4gICAgICAgICAgICB2YXIgQUMgPSBQREZIZXhTdHJpbmcuZnJvbVRleHQoY2FwdGlvbnMuZG93bik7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0FDJyksIEFDKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGljdC5kZWxldGUoUERGTmFtZS5vZignQUMnKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MuZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCkge1xuICAgICAgICByZXR1cm4gbmV3IEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MoZGljdCk7XG4gICAgfTtcbiAgICByZXR1cm4gQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcztcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5qcy5tYXAiLCJpbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuLy8gVE9ETzogQWxzbyBoYW5kbGUgdGhlIGAvU2AgYW5kIGAvRGAgZW50cmllc1xudmFyIEJvcmRlclN0eWxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJvcmRlclN0eWxlKGRpY3QpIHtcbiAgICAgICAgdGhpcy5kaWN0ID0gZGljdDtcbiAgICB9XG4gICAgQm9yZGVyU3R5bGUucHJvdG90eXBlLlcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBXID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdXJykpO1xuICAgICAgICBpZiAoVyBpbnN0YW5jZW9mIFBERk51bWJlcilcbiAgICAgICAgICAgIHJldHVybiBXO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgQm9yZGVyU3R5bGUucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5XKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc051bWJlcigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAxO1xuICAgIH07XG4gICAgQm9yZGVyU3R5bGUucHJvdG90eXBlLnNldFdpZHRoID0gZnVuY3Rpb24gKHdpZHRoKSB7XG4gICAgICAgIHZhciBXID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKHdpZHRoKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdXJyksIFcpO1xuICAgIH07XG4gICAgQm9yZGVyU3R5bGUuZnJvbURpY3QgPSBmdW5jdGlvbiAoZGljdCkgeyByZXR1cm4gbmV3IEJvcmRlclN0eWxlKGRpY3QpOyB9O1xuICAgIHJldHVybiBCb3JkZXJTdHlsZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBCb3JkZXJTdHlsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJvcmRlclN0eWxlLmpzLm1hcCIsImltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZTdHJlYW0gZnJvbSBcIi4uL29iamVjdHMvUERGU3RyZWFtXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xudmFyIFBERkFubm90YXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGQW5ub3RhdGlvbihkaWN0KSB7XG4gICAgICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgcmVxdWlyZWQgYnkgdGhlIFBERiBzcGVjXG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuUmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignUmVjdCcpLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5BUCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5sb29rdXBNYXliZShQREZOYW1lLm9mKCdBUCcpLCBQREZEaWN0KTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLkYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBudW1iZXJPclJlZiA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignRicpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5jb250ZXh0Lmxvb2t1cE1heWJlKG51bWJlck9yUmVmLCBQREZOdW1iZXIpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0UmVjdGFuZ2xlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBSZWN0ID0gdGhpcy5SZWN0KCk7XG4gICAgICAgIHJldHVybiAoX2EgPSBSZWN0ID09PSBudWxsIHx8IFJlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IFJlY3QuYXNSZWN0YW5nbGUoKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogeyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRSZWN0YW5nbGUgPSBmdW5jdGlvbiAocmVjdCkge1xuICAgICAgICB2YXIgeCA9IHJlY3QueCwgeSA9IHJlY3QueSwgd2lkdGggPSByZWN0LndpZHRoLCBoZWlnaHQgPSByZWN0LmhlaWdodDtcbiAgICAgICAgdmFyIFJlY3QgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooW3gsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodF0pO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1JlY3QnKSwgUmVjdCk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRBcHBlYXJhbmNlU3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBBUyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignQVMnKSk7XG4gICAgICAgIGlmIChBUyBpbnN0YW5jZW9mIFBERk5hbWUpXG4gICAgICAgICAgICByZXR1cm4gQVM7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRBcHBlYXJhbmNlU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdBUycpLCBzdGF0ZSk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRBcHBlYXJhbmNlcyA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlcykge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0FQJyksIGFwcGVhcmFuY2VzKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmVuc3VyZUFQID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgQVAgPSB0aGlzLkFQKCk7XG4gICAgICAgIGlmICghQVApIHtcbiAgICAgICAgICAgIEFQID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignQVAnKSwgQVApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBUDtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmdldE5vcm1hbEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBBUCA9IHRoaXMuZW5zdXJlQVAoKTtcbiAgICAgICAgdmFyIE4gPSBBUC5nZXQoUERGTmFtZS5vZignTicpKTtcbiAgICAgICAgaWYgKE4gaW5zdGFuY2VvZiBQREZSZWYgfHwgTiBpbnN0YW5jZW9mIFBERkRpY3QpXG4gICAgICAgICAgICByZXR1cm4gTjtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBOIHR5cGU6IFwiICsgKE4gPT09IG51bGwgfHwgTiA9PT0gdm9pZCAwID8gdm9pZCAwIDogTi5jb25zdHJ1Y3Rvci5uYW1lKSk7XG4gICAgfTtcbiAgICAvKiogQHBhcmFtIGFwcGVhcmFuY2UgQSBQREZEaWN0IG9yIFBERlN0cmVhbSAoZGlyZWN0IG9yIHJlZikgKi9cbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXROb3JtYWxBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgdmFyIEFQID0gdGhpcy5lbnN1cmVBUCgpO1xuICAgICAgICBBUC5zZXQoUERGTmFtZS5vZignTicpLCBhcHBlYXJhbmNlKTtcbiAgICB9O1xuICAgIC8qKiBAcGFyYW0gYXBwZWFyYW5jZSBBIFBERkRpY3Qgb3IgUERGU3RyZWFtIChkaXJlY3Qgb3IgcmVmKSAqL1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldFJvbGxvdmVyQXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIHZhciBBUCA9IHRoaXMuZW5zdXJlQVAoKTtcbiAgICAgICAgQVAuc2V0KFBERk5hbWUub2YoJ1InKSwgYXBwZWFyYW5jZSk7XG4gICAgfTtcbiAgICAvKiogQHBhcmFtIGFwcGVhcmFuY2UgQSBQREZEaWN0IG9yIFBERlN0cmVhbSAoZGlyZWN0IG9yIHJlZikgKi9cbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXREb3duQXBwZWFyYW5jZSA9IGZ1bmN0aW9uIChhcHBlYXJhbmNlKSB7XG4gICAgICAgIHZhciBBUCA9IHRoaXMuZW5zdXJlQVAoKTtcbiAgICAgICAgQVAuc2V0KFBERk5hbWUub2YoJ0QnKSwgYXBwZWFyYW5jZSk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5yZW1vdmVSb2xsb3ZlckFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBBUCA9IHRoaXMuQVAoKTtcbiAgICAgICAgQVAgPT09IG51bGwgfHwgQVAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEFQLmRlbGV0ZShQREZOYW1lLm9mKCdSJykpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUucmVtb3ZlRG93bkFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBBUCA9IHRoaXMuQVAoKTtcbiAgICAgICAgQVAgPT09IG51bGwgfHwgQVAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IEFQLmRlbGV0ZShQREZOYW1lLm9mKCdEJykpO1xuICAgIH07XG4gICAgUERGQW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0QXBwZWFyYW5jZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBBUCA9IHRoaXMuQVAoKTtcbiAgICAgICAgaWYgKCFBUClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBOID0gQVAubG9va3VwKFBERk5hbWUub2YoJ04nKSwgUERGRGljdCwgUERGU3RyZWFtKTtcbiAgICAgICAgdmFyIFIgPSBBUC5sb29rdXBNYXliZShQREZOYW1lLm9mKCdSJyksIFBERkRpY3QsIFBERlN0cmVhbSk7XG4gICAgICAgIHZhciBEID0gQVAubG9va3VwTWF5YmUoUERGTmFtZS5vZignRCcpLCBQREZEaWN0LCBQREZTdHJlYW0pO1xuICAgICAgICByZXR1cm4geyBub3JtYWw6IE4sIHJvbGxvdmVyOiBSLCBkb3duOiBEIH07XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRGbGFncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuRigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNOdW1iZXIoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMDtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldEZsYWdzID0gZnVuY3Rpb24gKGZsYWdzKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRicpLCBQREZOdW1iZXIub2YoZmxhZ3MpKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmhhc0ZsYWcgPSBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICB2YXIgZmxhZ3MgPSB0aGlzLmdldEZsYWdzKCk7XG4gICAgICAgIHJldHVybiAoZmxhZ3MgJiBmbGFnKSAhPT0gMDtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldEZsYWcgPSBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICB2YXIgZmxhZ3MgPSB0aGlzLmdldEZsYWdzKCk7XG4gICAgICAgIHRoaXMuc2V0RmxhZ3MoZmxhZ3MgfCBmbGFnKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLmNsZWFyRmxhZyA9IGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBmbGFncyA9IHRoaXMuZ2V0RmxhZ3MoKTtcbiAgICAgICAgdGhpcy5zZXRGbGFncyhmbGFncyAmIH5mbGFnKTtcbiAgICB9O1xuICAgIFBERkFubm90YXRpb24ucHJvdG90eXBlLnNldEZsYWdUbyA9IGZ1bmN0aW9uIChmbGFnLCBlbmFibGUpIHtcbiAgICAgICAgaWYgKGVuYWJsZSlcbiAgICAgICAgICAgIHRoaXMuc2V0RmxhZyhmbGFnKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5jbGVhckZsYWcoZmxhZyk7XG4gICAgfTtcbiAgICBQREZBbm5vdGF0aW9uLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QpIHsgcmV0dXJuIG5ldyBQREZBbm5vdGF0aW9uKGRpY3QpOyB9O1xuICAgIHJldHVybiBQREZBbm5vdGF0aW9uO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkFubm90YXRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZBbm5vdGF0aW9uLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERk5hbWUgZnJvbSBcIi4uL29iamVjdHMvUERGTmFtZVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IEJvcmRlclN0eWxlIGZyb20gXCIuL0JvcmRlclN0eWxlXCI7XG5pbXBvcnQgUERGQW5ub3RhdGlvbiBmcm9tIFwiLi9QREZBbm5vdGF0aW9uXCI7XG5pbXBvcnQgQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcyBmcm9tIFwiLi9BcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzXCI7XG52YXIgUERGV2lkZ2V0QW5ub3RhdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGV2lkZ2V0QW5ub3RhdGlvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZXaWRnZXRBbm5vdGF0aW9uKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERldpZGdldEFubm90YXRpb24ucHJvdG90eXBlLk1LID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgTUsgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ01LJykpO1xuICAgICAgICBpZiAoTUsgaW5zdGFuY2VvZiBQREZEaWN0KVxuICAgICAgICAgICAgcmV0dXJuIE1LO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuQlMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCUyA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignQlMnKSk7XG4gICAgICAgIGlmIChCUyBpbnN0YW5jZW9mIFBERkRpY3QpXG4gICAgICAgICAgICByZXR1cm4gQlM7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5EQSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdEQScpKTtcbiAgICAgICAgaWYgKGRhIGluc3RhbmNlb2YgUERGU3RyaW5nIHx8IGRhIGluc3RhbmNlb2YgUERGSGV4U3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIGRhO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuUCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFAgPSB0aGlzLmRpY3QuZ2V0KFBERk5hbWUub2YoJ1AnKSk7XG4gICAgICAgIGlmIChQIGluc3RhbmNlb2YgUERGUmVmKVxuICAgICAgICAgICAgcmV0dXJuIFA7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5zZXRQID0gZnVuY3Rpb24gKHBhZ2UpIHtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdQJyksIHBhZ2UpO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuc2V0RGVmYXVsdEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0RBJyksIFBERlN0cmluZy5vZihhcHBlYXJhbmNlKSk7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXREZWZhdWx0QXBwZWFyYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIERBID0gdGhpcy5EQSgpO1xuICAgICAgICBpZiAoREEgaW5zdGFuY2VvZiBQREZIZXhTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBEQS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERBID09PSBudWxsIHx8IERBID09PSB2b2lkIDAgPyB2b2lkIDAgOiBEQS5hc1N0cmluZygpO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0QXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIE1LID0gdGhpcy5NSygpO1xuICAgICAgICBpZiAoTUspXG4gICAgICAgICAgICByZXR1cm4gQXBwZWFyYW5jZUNoYXJhY3RlcmlzdGljcy5mcm9tRGljdChNSyk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRPckNyZWF0ZUFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBNSyA9IHRoaXMuTUsoKTtcbiAgICAgICAgaWYgKE1LKVxuICAgICAgICAgICAgcmV0dXJuIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MuZnJvbURpY3QoTUspO1xuICAgICAgICB2YXIgYWMgPSBBcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzLmZyb21EaWN0KHRoaXMuZGljdC5jb250ZXh0Lm9iaih7fSkpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ01LJyksIGFjLmRpY3QpO1xuICAgICAgICByZXR1cm4gYWM7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLnByb3RvdHlwZS5nZXRCb3JkZXJTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJTID0gdGhpcy5CUygpO1xuICAgICAgICBpZiAoQlMpXG4gICAgICAgICAgICByZXR1cm4gQm9yZGVyU3R5bGUuZnJvbURpY3QoQlMpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0T3JDcmVhdGVCb3JkZXJTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJTID0gdGhpcy5CUygpO1xuICAgICAgICBpZiAoQlMpXG4gICAgICAgICAgICByZXR1cm4gQm9yZGVyU3R5bGUuZnJvbURpY3QoQlMpO1xuICAgICAgICB2YXIgYnMgPSBCb3JkZXJTdHlsZS5mcm9tRGljdCh0aGlzLmRpY3QuY29udGV4dC5vYmooe30pKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdCUycpLCBicy5kaWN0KTtcbiAgICAgICAgcmV0dXJuIGJzO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5wcm90b3R5cGUuZ2V0T25WYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgbm9ybWFsID0gKF9hID0gdGhpcy5nZXRBcHBlYXJhbmNlcygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9ybWFsO1xuICAgICAgICBpZiAobm9ybWFsIGluc3RhbmNlb2YgUERGRGljdCkge1xuICAgICAgICAgICAgdmFyIGtleXMgPSBub3JtYWwua2V5cygpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0ga2V5cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpZHhdO1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09IFBERk5hbWUub2YoJ09mZicpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBQREZXaWRnZXRBbm5vdGF0aW9uLmZyb21EaWN0ID0gZnVuY3Rpb24gKGRpY3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZXaWRnZXRBbm5vdGF0aW9uKGRpY3QpO1xuICAgIH07XG4gICAgUERGV2lkZ2V0QW5ub3RhdGlvbi5jcmVhdGUgPSBmdW5jdGlvbiAoY29udGV4dCwgcGFyZW50KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgVHlwZTogJ0Fubm90JyxcbiAgICAgICAgICAgIFN1YnR5cGU6ICdXaWRnZXQnLFxuICAgICAgICAgICAgUmVjdDogWzAsIDAsIDAsIDBdLFxuICAgICAgICAgICAgUGFyZW50OiBwYXJlbnQsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFBERldpZGdldEFubm90YXRpb24oZGljdCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGV2lkZ2V0QW5ub3RhdGlvbjtcbn0oUERGQW5ub3RhdGlvbikpO1xuZXhwb3J0IGRlZmF1bHQgUERGV2lkZ2V0QW5ub3RhdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERldpZGdldEFubm90YXRpb24uanMubWFwIiwidmFyIGZsYWcgPSBmdW5jdGlvbiAoYml0SW5kZXgpIHsgcmV0dXJuIDEgPDwgYml0SW5kZXg7IH07XG4vKiogRnJvbSBQREYgc3BlYyB0YWJsZSAxNjUgKi9cbmV4cG9ydCB2YXIgQW5ub3RhdGlvbkZsYWdzO1xuKGZ1bmN0aW9uIChBbm5vdGF0aW9uRmxhZ3MpIHtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBkaXNwbGF5IHRoZSBhbm5vdGF0aW9uIGlmIGl0IGRvZXMgbm90IGJlbG9uZyB0byBvbmUgb2YgdGhlXG4gICAgICogc3RhbmRhcmQgYW5ub3RhdGlvbiB0eXBlcyBhbmQgbm8gYW5ub3RhdGlvbiBoYW5kbGVyIGlzIGF2YWlsYWJsZS4gSWYgY2xlYXIsXG4gICAgICogZGlzcGxheSBzdWNoIGFuIHVua25vd24gYW5ub3RhdGlvbiB1c2luZyBhbiBhcHBlYXJhbmNlIHN0cmVhbSBzcGVjaWZpZWQgYnlcbiAgICAgKiBpdHMgYXBwZWFyYW5jZSBkaWN0aW9uYXJ5LCBpZiBhbnkuXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIkludmlzaWJsZVwiXSA9IGZsYWcoMSAtIDEpXSA9IFwiSW52aXNpYmxlXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3QgZGlzcGxheSBvciBwcmludCB0aGUgYW5ub3RhdGlvbiBvciBhbGxvdyBpdCB0byBpbnRlcmFjdCB3aXRoXG4gICAgICogdGhlIHVzZXIsIHJlZ2FyZGxlc3Mgb2YgaXRzIGFubm90YXRpb24gdHlwZSBvciB3aGV0aGVyIGFuIGFubm90YXRpb25cbiAgICAgKiBoYW5kbGVyIGlzIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEluIGNhc2VzIHdoZXJlIHNjcmVlbiBzcGFjZSBpcyBsaW1pdGVkLCB0aGUgYWJpbGl0eSB0byBoaWRlIGFuZCBzaG93XG4gICAgICogYW5ub3RhdGlvbnMgc2VsZWN0aXZlbHkgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBhcHBlYXJhbmNlIHN0cmVhbXNcbiAgICAgKiB0byBkaXNwbGF5IGF1eGlsaWFyeSBwb3AtdXAgaW5mb3JtYXRpb24gc2ltaWxhciBpbiBmdW5jdGlvbiB0byBvbmxpbmUgaGVscFxuICAgICAqIHN5c3RlbXMuXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIkhpZGRlblwiXSA9IGZsYWcoMiAtIDEpXSA9IFwiSGlkZGVuXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBwcmludCB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBwYWdlIGlzIHByaW50ZWQuIElmIGNsZWFyLCBuZXZlclxuICAgICAqIHByaW50IHRoZSBhbm5vdGF0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4uXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGFubm90YXRpb25zIHJlcHJlc2VudGluZyBpbnRlcmFjdGl2ZSBwdXNoYnV0dG9ucyxcbiAgICAgKiB3aGljaCB3b3VsZCBzZXJ2ZSBubyBtZWFuaW5nZnVsIHB1cnBvc2Ugb24gdGhlIHByaW50ZWQgcGFnZS5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiUHJpbnRcIl0gPSBmbGFnKDMgLSAxKV0gPSBcIlByaW50XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3Qgc2NhbGUgdGhlIGFubm90YXRpb27igJlzIGFwcGVhcmFuY2UgdG8gbWF0Y2ggdGhlIG1hZ25pZmljYXRpb25cbiAgICAgKiBvZiB0aGUgcGFnZS4gVGhlIGxvY2F0aW9uIG9mIHRoZSBhbm5vdGF0aW9uIG9uIHRoZSBwYWdlIChkZWZpbmVkIGJ5IHRoZVxuICAgICAqIHVwcGVyLWxlZnQgY29ybmVyIG9mIGl0cyBhbm5vdGF0aW9uIHJlY3RhbmdsZSkgc2hhbGwgcmVtYWluIGZpeGVkLFxuICAgICAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHBhZ2UgbWFnbmlmaWNhdGlvbi5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiTm9ab29tXCJdID0gZmxhZyg0IC0gMSldID0gXCJOb1pvb21cIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCByb3RhdGUgdGhlIGFubm90YXRpb27igJlzIGFwcGVhcmFuY2UgdG8gbWF0Y2ggdGhlIHJvdGF0aW9uIG9mXG4gICAgICogdGhlIHBhZ2UuIFRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgYW5ub3RhdGlvbiByZWN0YW5nbGUgc2hhbGwgcmVtYWluIGluXG4gICAgICogYSBmaXhlZCBsb2NhdGlvbiBvbiB0aGUgcGFnZSwgcmVnYXJkbGVzcyBvZiB0aGUgcGFnZSByb3RhdGlvbi5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiTm9Sb3RhdGVcIl0gPSBmbGFnKDUgLSAxKV0gPSBcIk5vUm90YXRlXCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3QgZGlzcGxheSB0aGUgYW5ub3RhdGlvbiBvbiB0aGUgc2NyZWVuIG9yIGFsbG93IGl0IHRvIGludGVyYWN0XG4gICAgICogd2l0aCB0aGUgdXNlci4gVGhlIGFubm90YXRpb24gbWF5IGJlIHByaW50ZWQgKGRlcGVuZGluZyBvbiB0aGUgc2V0dGluZyBvZlxuICAgICAqIHRoZSBQcmludCBmbGFnKSBidXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaGlkZGVuIGZvciBwdXJwb3NlcyBvZiBvbi1zY3JlZW5cbiAgICAgKiBkaXNwbGF5IGFuZCB1c2VyIGludGVyYWN0aW9uLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJOb1ZpZXdcIl0gPSBmbGFnKDYgLSAxKV0gPSBcIk5vVmlld1wiO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgZG8gbm90IGFsbG93IHRoZSBhbm5vdGF0aW9uIHRvIGludGVyYWN0IHdpdGggdGhlIHVzZXIuIFRoZVxuICAgICAqIGFubm90YXRpb24gbWF5IGJlIGRpc3BsYXllZCBvciBwcmludGVkIChkZXBlbmRpbmcgb24gdGhlIHNldHRpbmdzIG9mIHRoZVxuICAgICAqIE5vVmlldyBhbmQgUHJpbnQgZmxhZ3MpIGJ1dCBzaG91bGQgbm90IHJlc3BvbmQgdG8gbW91c2UgY2xpY2tzIG9yIGNoYW5nZVxuICAgICAqIGl0cyBhcHBlYXJhbmNlIGluIHJlc3BvbnNlIHRvIG1vdXNlIG1vdGlvbnMuXG4gICAgICpcbiAgICAgKiBUaGlzIGZsYWcgc2hhbGwgYmUgaWdub3JlZCBmb3Igd2lkZ2V0IGFubm90YXRpb25zOyBpdHMgZnVuY3Rpb24gaXNcbiAgICAgKiBzdWJzdW1lZCBieSB0aGUgUmVhZE9ubHkgZmxhZyBvZiB0aGUgYXNzb2NpYXRlZCBmb3JtIGZpZWxkLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJSZWFkT25seVwiXSA9IGZsYWcoNyAtIDEpXSA9IFwiUmVhZE9ubHlcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGRvIG5vdCBhbGxvdyB0aGUgYW5ub3RhdGlvbiB0byBiZSBkZWxldGVkIG9yIGl0cyBwcm9wZXJ0aWVzXG4gICAgICogKGluY2x1ZGluZyBwb3NpdGlvbiBhbmQgc2l6ZSkgdG8gYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIuIEhvd2V2ZXIsIHRoaXNcbiAgICAgKiBmbGFnIGRvZXMgbm90IHJlc3RyaWN0IGNoYW5nZXMgdG8gdGhlIGFubm90YXRpb27igJlzIGNvbnRlbnRzLCBzdWNoIGFzIHRoZVxuICAgICAqIHZhbHVlIG9mIGEgZm9ybSBmaWVsZC5cbiAgICAgKi9cbiAgICBBbm5vdGF0aW9uRmxhZ3NbQW5ub3RhdGlvbkZsYWdzW1wiTG9ja2VkXCJdID0gZmxhZyg4IC0gMSldID0gXCJMb2NrZWRcIjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGludmVydCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIE5vVmlldyBmbGFnIGZvciBjZXJ0YWluIGV2ZW50cy5cbiAgICAgKlxuICAgICAqIEEgdHlwaWNhbCB1c2UgaXMgdG8gaGF2ZSBhbiBhbm5vdGF0aW9uIHRoYXQgYXBwZWFycyBvbmx5IHdoZW4gYSBtb3VzZVxuICAgICAqIGN1cnNvciBpcyBoZWxkIG92ZXIgaXQuXG4gICAgICovXG4gICAgQW5ub3RhdGlvbkZsYWdzW0Fubm90YXRpb25GbGFnc1tcIlRvZ2dsZU5vVmlld1wiXSA9IGZsYWcoOSAtIDEpXSA9IFwiVG9nZ2xlTm9WaWV3XCI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBkbyBub3QgYWxsb3cgdGhlIGNvbnRlbnRzIG9mIHRoZSBhbm5vdGF0aW9uIHRvIGJlIG1vZGlmaWVkIGJ5IHRoZVxuICAgICAqIHVzZXIuIFRoaXMgZmxhZyBkb2VzIG5vdCByZXN0cmljdCBkZWxldGlvbiBvZiB0aGUgYW5ub3RhdGlvbiBvciBjaGFuZ2VzIHRvXG4gICAgICogb3RoZXIgYW5ub3RhdGlvbiBwcm9wZXJ0aWVzLCBzdWNoIGFzIHBvc2l0aW9uIGFuZCBzaXplLlxuICAgICAqL1xuICAgIEFubm90YXRpb25GbGFnc1tBbm5vdGF0aW9uRmxhZ3NbXCJMb2NrZWRDb250ZW50c1wiXSA9IGZsYWcoMTAgLSAxKV0gPSBcIkxvY2tlZENvbnRlbnRzXCI7XG59KShBbm5vdGF0aW9uRmxhZ3MgfHwgKEFubm90YXRpb25GbGFncyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbGFncy5qcy5tYXAiLCJleHBvcnQgeyBkZWZhdWx0IGFzIFBERkFubm90YXRpb24gfSBmcm9tIFwiLi9QREZBbm5vdGF0aW9uXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERldpZGdldEFubm90YXRpb24gfSBmcm9tIFwiLi9QREZXaWRnZXRBbm5vdGF0aW9uXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEFwcGVhcmFuY2VDaGFyYWN0ZXJpc3RpY3MgfSBmcm9tIFwiLi9BcHBlYXJhbmNlQ2hhcmFjdGVyaXN0aWNzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mbGFnc1wiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyLCBwYWRTdGFydCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBFbnRyaWVzIHNob3VsZCBiZSBhZGRlZCB1c2luZyB0aGUgW1thZGRFbnRyeV1dIGFuZCBbW2FkZERlbGV0ZWRFbnRyeV1dXG4gKiBtZXRob2RzICoqaW4gb3JkZXIgb2YgYXNjZW5kaW5nIG9iamVjdCBudW1iZXIqKi5cbiAqL1xudmFyIFBERkNyb3NzUmVmU2VjdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZDcm9zc1JlZlNlY3Rpb24oZmlyc3RFbnRyeSkge1xuICAgICAgICB0aGlzLnN1YnNlY3Rpb25zID0gZmlyc3RFbnRyeSA/IFtbZmlyc3RFbnRyeV1dIDogW107XG4gICAgICAgIHRoaXMuY2h1bmtJZHggPSAwO1xuICAgICAgICB0aGlzLmNodW5rTGVuZ3RoID0gZmlyc3RFbnRyeSA/IDEgOiAwO1xuICAgIH1cbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLmFkZEVudHJ5ID0gZnVuY3Rpb24gKHJlZiwgb2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKHsgcmVmOiByZWYsIG9mZnNldDogb2Zmc2V0LCBkZWxldGVkOiBmYWxzZSB9KTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuYWRkRGVsZXRlZEVudHJ5ID0gZnVuY3Rpb24gKHJlZiwgbmV4dEZyZWVPYmplY3ROdW1iZXIpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoeyByZWY6IHJlZiwgb2Zmc2V0OiBuZXh0RnJlZU9iamVjdE51bWJlciwgZGVsZXRlZDogdHJ1ZSB9KTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzZWN0aW9uID0gXCJ4cmVmXFxuXCI7XG4gICAgICAgIGZvciAodmFyIHJhbmdlSWR4ID0gMCwgcmFuZ2VMZW4gPSB0aGlzLnN1YnNlY3Rpb25zLmxlbmd0aDsgcmFuZ2VJZHggPCByYW5nZUxlbjsgcmFuZ2VJZHgrKykge1xuICAgICAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5zdWJzZWN0aW9uc1tyYW5nZUlkeF07XG4gICAgICAgICAgICBzZWN0aW9uICs9IHJhbmdlWzBdLnJlZi5vYmplY3ROdW1iZXIgKyBcIiBcIiArIHJhbmdlLmxlbmd0aCArIFwiXFxuXCI7XG4gICAgICAgICAgICBmb3IgKHZhciBlbnRyeUlkeCA9IDAsIGVudHJ5TGVuID0gcmFuZ2UubGVuZ3RoOyBlbnRyeUlkeCA8IGVudHJ5TGVuOyBlbnRyeUlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gcmFuZ2VbZW50cnlJZHhdO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gcGFkU3RhcnQoU3RyaW5nKGVudHJ5Lm9mZnNldCksIDEwLCAnMCcpO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gJyAnO1xuICAgICAgICAgICAgICAgIHNlY3Rpb24gKz0gcGFkU3RhcnQoU3RyaW5nKGVudHJ5LnJlZi5nZW5lcmF0aW9uTnVtYmVyKSwgNSwgJzAnKTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9ICcgJztcbiAgICAgICAgICAgICAgICBzZWN0aW9uICs9IGVudHJ5LmRlbGV0ZWQgPyAnZicgOiAnbic7XG4gICAgICAgICAgICAgICAgc2VjdGlvbiArPSAnIFxcbic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlY3Rpb247XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2l6ZSA9IDU7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuc3Vic2VjdGlvbnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgc3Vic2VjdGlvbiA9IHRoaXMuc3Vic2VjdGlvbnNbaWR4XTtcbiAgICAgICAgICAgIHZhciBzdWJzZWN0aW9uTGVuZ3RoID0gc3Vic2VjdGlvbi5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgZmlyc3RFbnRyeSA9IHN1YnNlY3Rpb25bMF07XG4gICAgICAgICAgICBzaXplICs9IDI7XG4gICAgICAgICAgICBzaXplICs9IFN0cmluZyhmaXJzdEVudHJ5LnJlZi5vYmplY3ROdW1iZXIpLmxlbmd0aDtcbiAgICAgICAgICAgIHNpemUgKz0gU3RyaW5nKHN1YnNlY3Rpb25MZW5ndGgpLmxlbmd0aDtcbiAgICAgICAgICAgIHNpemUgKz0gMjAgKiBzdWJzZWN0aW9uTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLng7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmY7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgb2Zmc2V0ICs9IHRoaXMuY29weVN1YnNlY3Rpb25zSW50b0J1ZmZlcih0aGlzLnN1YnNlY3Rpb25zLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLnByb3RvdHlwZS5jb3B5U3Vic2VjdGlvbnNJbnRvQnVmZmVyID0gZnVuY3Rpb24gKHN1YnNlY3Rpb25zLCBidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHN1YnNlY3Rpb25zLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIHN1YnNlY3Rpb24gPSB0aGlzLnN1YnNlY3Rpb25zW2lkeF07XG4gICAgICAgICAgICB2YXIgZmlyc3RPYmplY3ROdW1iZXIgPSBTdHJpbmcoc3Vic2VjdGlvblswXS5yZWYub2JqZWN0TnVtYmVyKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihmaXJzdE9iamVjdE51bWJlciwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgICAgIHZhciByYW5nZUxlbmd0aCA9IFN0cmluZyhzdWJzZWN0aW9uLmxlbmd0aCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIocmFuZ2VMZW5ndGgsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgIG9mZnNldCArPSB0aGlzLmNvcHlFbnRyaWVzSW50b0J1ZmZlcihzdWJzZWN0aW9uLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlNlY3Rpb24ucHJvdG90eXBlLmNvcHlFbnRyaWVzSW50b0J1ZmZlciA9IGZ1bmN0aW9uIChlbnRyaWVzLCBidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaWR4XTtcbiAgICAgICAgICAgIHZhciBlbnRyeU9mZnNldCA9IHBhZFN0YXJ0KFN0cmluZyhlbnRyeS5vZmZzZXQpLCAxMCwgJzAnKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcihlbnRyeU9mZnNldCwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgICAgIHZhciBlbnRyeUdlbiA9IHBhZFN0YXJ0KFN0cmluZyhlbnRyeS5yZWYuZ2VuZXJhdGlvbk51bWJlciksIDUsICcwJyk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIoZW50cnlHZW4sIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuU3BhY2U7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gZW50cnkuZGVsZXRlZCA/IENoYXJDb2Rlcy5mIDogQ2hhckNvZGVzLm47XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAyMCAqIGxlbmd0aDtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKGN1cnJFbnRyeSkge1xuICAgICAgICBpZiAodGhpcy5jaHVua0xlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zdWJzZWN0aW9ucy5wdXNoKFtjdXJyRW50cnldKTtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtJZHggPSAwO1xuICAgICAgICAgICAgdGhpcy5jaHVua0xlbmd0aCA9IDE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNodW5rID0gdGhpcy5zdWJzZWN0aW9uc1t0aGlzLmNodW5rSWR4XTtcbiAgICAgICAgdmFyIHByZXZFbnRyeSA9IGNodW5rW3RoaXMuY2h1bmtMZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGN1cnJFbnRyeS5yZWYub2JqZWN0TnVtYmVyIC0gcHJldkVudHJ5LnJlZi5vYmplY3ROdW1iZXIgPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNlY3Rpb25zLnB1c2goW2N1cnJFbnRyeV0pO1xuICAgICAgICAgICAgdGhpcy5jaHVua0lkeCArPSAxO1xuICAgICAgICAgICAgdGhpcy5jaHVua0xlbmd0aCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaHVuay5wdXNoKGN1cnJFbnRyeSk7XG4gICAgICAgICAgICB0aGlzLmNodW5rTGVuZ3RoICs9IDE7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU2VjdGlvbi5jcmVhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGQ3Jvc3NSZWZTZWN0aW9uKHtcbiAgICAgICAgICAgIHJlZjogUERGUmVmLm9mKDAsIDY1NTM1KSxcbiAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgIGRlbGV0ZWQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTZWN0aW9uLmNyZWF0ZUVtcHR5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBERkNyb3NzUmVmU2VjdGlvbigpOyB9O1xuICAgIHJldHVybiBQREZDcm9zc1JlZlNlY3Rpb247XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGQ3Jvc3NSZWZTZWN0aW9uO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQ3Jvc3NSZWZTZWN0aW9uLmpzLm1hcCIsImltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IGNoYXJGcm9tQ29kZSwgY29weVN0cmluZ0ludG9CdWZmZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZIZWFkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGSGVhZGVyKG1ham9yLCBtaW5vcikge1xuICAgICAgICB0aGlzLm1ham9yID0gU3RyaW5nKG1ham9yKTtcbiAgICAgICAgdGhpcy5taW5vciA9IFN0cmluZyhtaW5vcik7XG4gICAgfVxuICAgIFBERkhlYWRlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBiYyA9IGNoYXJGcm9tQ29kZSgxMjkpO1xuICAgICAgICByZXR1cm4gXCIlUERGLVwiICsgdGhpcy5tYWpvciArIFwiLlwiICsgdGhpcy5taW5vciArIFwiXFxuJVwiICsgYmMgKyBiYyArIGJjICsgYmM7XG4gICAgfTtcbiAgICBQREZIZWFkZXIucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gMTIgKyB0aGlzLm1ham9yLmxlbmd0aCArIHRoaXMubWlub3IubGVuZ3RoO1xuICAgIH07XG4gICAgUERGSGVhZGVyLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlBlcmNlbnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuUDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5EO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkY7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuRGFzaDtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMubWFqb3IsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5QZXJpb2Q7XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLm1pbm9yLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5QZXJjZW50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gMTI5O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gMTI5O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gMTI5O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gMTI5O1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIFBERkhlYWRlci5mb3JWZXJzaW9uID0gZnVuY3Rpb24gKG1ham9yLCBtaW5vcikge1xuICAgICAgICByZXR1cm4gbmV3IFBERkhlYWRlcihtYWpvciwgbWlub3IpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkhlYWRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZIZWFkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZIZWFkZXIuanMubWFwIiwiaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZUcmFpbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERlRyYWlsZXIobGFzdFhSZWZPZmZzZXQpIHtcbiAgICAgICAgdGhpcy5sYXN0WFJlZk9mZnNldCA9IFN0cmluZyhsYXN0WFJlZk9mZnNldCk7XG4gICAgfVxuICAgIFBERlRyYWlsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJzdGFydHhyZWZcXG5cIiArIHRoaXMubGFzdFhSZWZPZmZzZXQgKyBcIlxcbiUlRU9GXCI7XG4gICAgfTtcbiAgICBQREZUcmFpbGVyLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDE2ICsgdGhpcy5sYXN0WFJlZk9mZnNldC5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZUcmFpbGVyLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnM7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5hO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy54O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5mO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLmxhc3RYUmVmT2Zmc2V0LCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5QZXJjZW50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlBlcmNlbnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuRTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5PO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLkY7XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGVHJhaWxlci5mb3JMYXN0Q3Jvc3NSZWZTZWN0aW9uT2Zmc2V0ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbmV3IFBERlRyYWlsZXIob2Zmc2V0KTtcbiAgICB9O1xuICAgIHJldHVybiBQREZUcmFpbGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlRyYWlsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZUcmFpbGVyLmpzLm1hcCIsImltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbnZhciBQREZUcmFpbGVyRGljdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZUcmFpbGVyRGljdChkaWN0KSB7XG4gICAgICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgfVxuICAgIFBERlRyYWlsZXJEaWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwidHJhaWxlclxcblwiICsgdGhpcy5kaWN0LnRvU3RyaW5nKCk7XG4gICAgfTtcbiAgICBQREZUcmFpbGVyRGljdC5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiA4ICsgdGhpcy5kaWN0LnNpemVJbkJ5dGVzKCk7XG4gICAgfTtcbiAgICBQREZUcmFpbGVyRGljdC5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy50O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnI7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuYTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5pO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmw7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIG9mZnNldCArPSB0aGlzLmRpY3QuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGVHJhaWxlckRpY3Qub2YgPSBmdW5jdGlvbiAoZGljdCkgeyByZXR1cm4gbmV3IFBERlRyYWlsZXJEaWN0KGRpY3QpOyB9O1xuICAgIHJldHVybiBQREZUcmFpbGVyRGljdDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQREZUcmFpbGVyRGljdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlRyYWlsZXJEaWN0LmpzLm1hcCIsImltcG9ydCB7IHRvSGV4U3RyaW5nLCB0b0hleFN0cmluZ09mTWluTGVuZ3RoIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBoYXNTdXJyb2dhdGVzLCBoaWdoU3Vycm9nYXRlLCBpc1dpdGhpbkJNUCwgbG93U3Vycm9nYXRlLCB9IGZyb20gXCIuLi8uLi91dGlscy91bmljb2RlXCI7XG4vKiogYGdseXBoc2Agc2hvdWxkIGJlIGFuIGFycmF5IG9mIHVuaXF1ZSBnbHlwaHMgKi9cbmV4cG9ydCB2YXIgY3JlYXRlQ21hcCA9IGZ1bmN0aW9uIChnbHlwaHMsIGdseXBoSWQpIHtcbiAgICB2YXIgYmZDaGFycyA9IG5ldyBBcnJheShnbHlwaHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnbHlwaHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpZHhdO1xuICAgICAgICB2YXIgaWQgPSBjbWFwSGV4Rm9ybWF0KGNtYXBIZXhTdHJpbmcoZ2x5cGhJZChnbHlwaCkpKTtcbiAgICAgICAgdmFyIHVuaWNvZGUgPSBjbWFwSGV4Rm9ybWF0LmFwcGx5KHZvaWQgMCwgZ2x5cGguY29kZVBvaW50cy5tYXAoY21hcENvZGVQb2ludEZvcm1hdCkpO1xuICAgICAgICBiZkNoYXJzW2lkeF0gPSBbaWQsIHVuaWNvZGVdO1xuICAgIH1cbiAgICByZXR1cm4gZmlsbENtYXBUZW1wbGF0ZShiZkNoYXJzKTtcbn07XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRlbXBsYXRlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xudmFyIGZpbGxDbWFwVGVtcGxhdGUgPSBmdW5jdGlvbiAoYmZDaGFycykgeyByZXR1cm4gXCIvQ0lESW5pdCAvUHJvY1NldCBmaW5kcmVzb3VyY2UgYmVnaW5cXG4xMiBkaWN0IGJlZ2luXFxuYmVnaW5jbWFwXFxuL0NJRFN5c3RlbUluZm8gPDxcXG4gIC9SZWdpc3RyeSAoQWRvYmUpXFxuICAvT3JkZXJpbmcgKFVDUylcXG4gIC9TdXBwbGVtZW50IDBcXG4+PiBkZWZcXG4vQ01hcE5hbWUgL0Fkb2JlLUlkZW50aXR5LVVDUyBkZWZcXG4vQ01hcFR5cGUgMiBkZWZcXG4xIGJlZ2luY29kZXNwYWNlcmFuZ2VcXG48MDAwMD48ZmZmZj5cXG5lbmRjb2Rlc3BhY2VyYW5nZVxcblwiICsgYmZDaGFycy5sZW5ndGggKyBcIiBiZWdpbmJmY2hhclxcblwiICsgYmZDaGFycy5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIGdseXBoSWQgPSBfYVswXSwgY29kZVBvaW50ID0gX2FbMV07XG4gICAgcmV0dXJuIGdseXBoSWQgKyBcIiBcIiArIGNvZGVQb2ludDtcbn0pLmpvaW4oJ1xcbicpICsgXCJcXG5lbmRiZmNoYXJcXG5lbmRjbWFwXFxuQ01hcE5hbWUgY3VycmVudGRpY3QgL0NNYXAgZGVmaW5lcmVzb3VyY2UgcG9wXFxuZW5kXFxuZW5kXCI7IH07XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFV0aWxpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xudmFyIGNtYXBIZXhGb3JtYXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhbHVlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICByZXR1cm4gXCI8XCIgKyB2YWx1ZXMuam9pbignJykgKyBcIj5cIjtcbn07XG52YXIgY21hcEhleFN0cmluZyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdG9IZXhTdHJpbmdPZk1pbkxlbmd0aCh2YWx1ZSwgNCk7IH07XG52YXIgY21hcENvZGVQb2ludEZvcm1hdCA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICBpZiAoaXNXaXRoaW5CTVAoY29kZVBvaW50KSlcbiAgICAgICAgcmV0dXJuIGNtYXBIZXhTdHJpbmcoY29kZVBvaW50KTtcbiAgICBpZiAoaGFzU3Vycm9nYXRlcyhjb2RlUG9pbnQpKSB7XG4gICAgICAgIHZhciBocyA9IGhpZ2hTdXJyb2dhdGUoY29kZVBvaW50KTtcbiAgICAgICAgdmFyIGxzID0gbG93U3Vycm9nYXRlKGNvZGVQb2ludCk7XG4gICAgICAgIHJldHVybiBcIlwiICsgY21hcEhleFN0cmluZyhocykgKyBjbWFwSGV4U3RyaW5nKGxzKTtcbiAgICB9XG4gICAgdmFyIGhleCA9IHRvSGV4U3RyaW5nKGNvZGVQb2ludCk7XG4gICAgdmFyIG1zZyA9IFwiMHhcIiArIGhleCArIFwiIGlzIG5vdCBhIHZhbGlkIFVURi04IG9yIFVURi0xNiBjb2RlcG9pbnQuXCI7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q01hcC5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBjcmVhdGVDbWFwIH0gZnJvbSBcIi4vQ01hcFwiO1xuaW1wb3J0IHsgZGVyaXZlRm9udEZsYWdzIH0gZnJvbSBcIi4vRm9udEZsYWdzXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IFBERlN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJpbmdcIjtcbmltcG9ydCB7IGJ5QXNjZW5kaW5nSWQsIENhY2hlLCBzb3J0ZWRVbmlxLCB0b0hleFN0cmluZ09mTWluTGVuZ3RoLCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBBIG5vdGUgb2YgdGhhbmtzIHRvIHRoZSBkZXZlbG9wZXJzIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2xpb2pzL3BkZmtpdCwgYXNcbiAqIHRoaXMgY2xhc3MgYm9ycm93cyBmcm9tOlxuICogICBodHRwczovL2dpdGh1Yi5jb20vZGV2b25nb3ZldHQvcGRma2l0L2Jsb2IvZTcxZWRhYjBkZDQ2NTdiNWE3Njc4MDRiYTg2Yzk0YzU4ZDAxZmJjYS9saWIvaW1hZ2UvanBlZy5jb2ZmZWVcbiAqL1xudmFyIEN1c3RvbUZvbnRFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDdXN0b21Gb250RW1iZWRkZXIoZm9udCwgZm9udERhdGEsIGN1c3RvbU5hbWUsIGZvbnRGZWF0dXJlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmFsbEdseXBoc0luRm9udFNvcnRlZEJ5SWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZ2x5cGhzID0gbmV3IEFycmF5KF90aGlzLmZvbnQuY2hhcmFjdGVyU2V0Lmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnbHlwaHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGVQb2ludCA9IF90aGlzLmZvbnQuY2hhcmFjdGVyU2V0W2lkeF07XG4gICAgICAgICAgICAgICAgZ2x5cGhzW2lkeF0gPSBfdGhpcy5mb250LmdseXBoRm9yQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc29ydGVkVW5pcShnbHlwaHMuc29ydChieUFzY2VuZGluZ0lkKSwgZnVuY3Rpb24gKGcpIHsgcmV0dXJuIGcuaWQ7IH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmZvbnQgPSBmb250O1xuICAgICAgICB0aGlzLnNjYWxlID0gMTAwMCAvIHRoaXMuZm9udC51bml0c1BlckVtO1xuICAgICAgICB0aGlzLmZvbnREYXRhID0gZm9udERhdGE7XG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSB0aGlzLmZvbnQucG9zdHNjcmlwdE5hbWUgfHwgJ0ZvbnQnO1xuICAgICAgICB0aGlzLmN1c3RvbU5hbWUgPSBjdXN0b21OYW1lO1xuICAgICAgICB0aGlzLmZvbnRGZWF0dXJlcyA9IGZvbnRGZWF0dXJlcztcbiAgICAgICAgdGhpcy5iYXNlRm9udE5hbWUgPSAnJztcbiAgICAgICAgdGhpcy5nbHlwaENhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkodGhpcy5hbGxHbHlwaHNJbkZvbnRTb3J0ZWRCeUlkKTtcbiAgICB9XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChmb250a2l0LCBmb250RGF0YSwgY3VzdG9tTmFtZSwgZm9udEZlYXR1cmVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmb250O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBmb250a2l0LmNyZWF0ZShmb250RGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBDdXN0b21Gb250RW1iZWRkZXIoZm9udCwgZm9udERhdGEsIGN1c3RvbU5hbWUsIGZvbnRGZWF0dXJlcyldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVuY29kZSB0aGUgSmF2YVNjcmlwdCBzdHJpbmcgaW50byB0aGlzIGZvbnQuIChKYXZhU2NyaXB0IGVuY29kZXMgc3RyaW5ncyBpblxuICAgICAqIFVuaWNvZGUsIGJ1dCBlbWJlZGRlZCBmb250cyB1c2UgdGhlaXIgb3duIGN1c3RvbSBlbmNvZGluZ3MpXG4gICAgICovXG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbmNvZGVUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgdmFyIGdseXBocyA9IHRoaXMuZm9udC5sYXlvdXQodGV4dCwgdGhpcy5mb250RmVhdHVyZXMpLmdseXBocztcbiAgICAgICAgdmFyIGhleENvZGVzID0gbmV3IEFycmF5KGdseXBocy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnbHlwaHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBoZXhDb2Rlc1tpZHhdID0gdG9IZXhTdHJpbmdPZk1pbkxlbmd0aChnbHlwaHNbaWR4XS5pZCwgNCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBERkhleFN0cmluZy5vZihoZXhDb2Rlcy5qb2luKCcnKSk7XG4gICAgfTtcbiAgICAvLyBUaGUgYWR2YW5jZVdpZHRoIHRha2VzIGludG8gYWNjb3VudCBrZXJuaW5nIGF1dG9tYXRpY2FsbHksIHNvIHdlIGRvbid0XG4gICAgLy8gaGF2ZSB0byBkbyB0aGF0IG1hbnVhbGx5IGxpa2Ugd2UgZG8gZm9yIHRoZSBzdGFuZGFyZCBmb250cy5cbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLndpZHRoT2ZUZXh0QXRTaXplID0gZnVuY3Rpb24gKHRleHQsIHNpemUpIHtcbiAgICAgICAgdmFyIGdseXBocyA9IHRoaXMuZm9udC5sYXlvdXQodGV4dCwgdGhpcy5mb250RmVhdHVyZXMpLmdseXBocztcbiAgICAgICAgdmFyIHRvdGFsV2lkdGggPSAwO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnbHlwaHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB0b3RhbFdpZHRoICs9IGdseXBoc1tpZHhdLmFkdmFuY2VXaWR0aCAqIHRoaXMuc2NhbGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNjYWxlID0gc2l6ZSAvIDEwMDA7XG4gICAgICAgIHJldHVybiB0b3RhbFdpZHRoICogc2NhbGU7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmhlaWdodE9mRm9udEF0U2l6ZSA9IGZ1bmN0aW9uIChzaXplLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBfYSA9IG9wdGlvbnMuZGVzY2VuZGVyLCBkZXNjZW5kZXIgPSBfYSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLmZvbnQsIGFzY2VudCA9IF9iLmFzY2VudCwgZGVzY2VudCA9IF9iLmRlc2NlbnQsIGJib3ggPSBfYi5iYm94O1xuICAgICAgICB2YXIgeVRvcCA9IChhc2NlbnQgfHwgYmJveC5tYXhZKSAqIHRoaXMuc2NhbGU7XG4gICAgICAgIHZhciB5Qm90dG9tID0gKGRlc2NlbnQgfHwgYmJveC5taW5ZKSAqIHRoaXMuc2NhbGU7XG4gICAgICAgIHZhciBoZWlnaHQgPSB5VG9wIC0geUJvdHRvbTtcbiAgICAgICAgaWYgKCFkZXNjZW5kZXIpXG4gICAgICAgICAgICBoZWlnaHQgLT0gTWF0aC5hYnMoZGVzY2VudCkgfHwgMDtcbiAgICAgICAgcmV0dXJuIChoZWlnaHQgLyAxMDAwKSAqIHNpemU7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLnNpemVPZkZvbnRBdEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5mb250LCBhc2NlbnQgPSBfYS5hc2NlbnQsIGRlc2NlbnQgPSBfYS5kZXNjZW50LCBiYm94ID0gX2EuYmJveDtcbiAgICAgICAgdmFyIHlUb3AgPSAoYXNjZW50IHx8IGJib3gubWF4WSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICB2YXIgeUJvdHRvbSA9IChkZXNjZW50IHx8IGJib3gubWluWSkgKiB0aGlzLnNjYWxlO1xuICAgICAgICByZXR1cm4gKDEwMDAgKiBoZWlnaHQpIC8gKHlUb3AgLSB5Qm90dG9tKTtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRJbnRvQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWYpIHtcbiAgICAgICAgdGhpcy5iYXNlRm9udE5hbWUgPVxuICAgICAgICAgICAgdGhpcy5jdXN0b21OYW1lIHx8IGNvbnRleHQuYWRkUmFuZG9tU3VmZml4KHRoaXMuZm9udE5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbWJlZEZvbnREaWN0KGNvbnRleHQsIHJlZik7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkRm9udERpY3QgPSBmdW5jdGlvbiAoY29udGV4dCwgcmVmKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjaWRGb250RGljdFJlZiwgdW5pY29kZUNNYXBSZWYsIGZvbnREaWN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkQ0lERm9udERpY3QoY29udGV4dCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjaWRGb250RGljdFJlZiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVDTWFwUmVmID0gdGhpcy5lbWJlZFVuaWNvZGVDbWFwKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udERpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTogJ0ZvbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6ICdUeXBlMCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUZvbnQ6IHRoaXMuYmFzZUZvbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kaW5nOiAnSWRlbnRpdHktSCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY2VuZGFudEZvbnRzOiBbY2lkRm9udERpY3RSZWZdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvVW5pY29kZTogdW5pY29kZUNNYXBSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmFzc2lnbihyZWYsIGZvbnREaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgcmVmXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKGZvbnREaWN0KV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5pc0NGRiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9udC5jZmY7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmVtYmVkQ0lERm9udERpY3QgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZm9udERlc2NyaXB0b3JSZWYsIGNpZEZvbnREaWN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmVtYmVkRm9udERlc2NyaXB0b3IoY29udGV4dCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRvclJlZiA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpZEZvbnREaWN0ID0gY29udGV4dC5vYmooe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6ICdGb250JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlOiB0aGlzLmlzQ0ZGKCkgPyAnQ0lERm9udFR5cGUwJyA6ICdDSURGb250VHlwZTInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJRFRvR0lETWFwOiAnSWRlbnRpdHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VGb250OiB0aGlzLmJhc2VGb250TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSURTeXN0ZW1JbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdHJ5OiBQREZTdHJpbmcub2YoJ0Fkb2JlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyaW5nOiBQREZTdHJpbmcub2YoJ0lkZW50aXR5JyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBsZW1lbnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb250RGVzY3JpcHRvcjogZm9udERlc2NyaXB0b3JSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVzogdGhpcy5jb21wdXRlV2lkdGhzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKGNpZEZvbnREaWN0KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEZvbnREZXNjcmlwdG9yID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZvbnRTdHJlYW1SZWYsIHNjYWxlLCBfYSwgaXRhbGljQW5nbGUsIGFzY2VudCwgZGVzY2VudCwgY2FwSGVpZ2h0LCB4SGVpZ2h0LCBfYiwgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgZm9udERlc2NyaXB0b3I7XG4gICAgICAgICAgICB2YXIgX2M7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9kKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuZW1iZWRGb250U3RyZWFtKGNvbnRleHQpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFN0cmVhbVJlZiA9IF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gdGhpcy5mb250LCBpdGFsaWNBbmdsZSA9IF9hLml0YWxpY0FuZ2xlLCBhc2NlbnQgPSBfYS5hc2NlbnQsIGRlc2NlbnQgPSBfYS5kZXNjZW50LCBjYXBIZWlnaHQgPSBfYS5jYXBIZWlnaHQsIHhIZWlnaHQgPSBfYS54SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSB0aGlzLmZvbnQuYmJveCwgbWluWCA9IF9iLm1pblgsIG1pblkgPSBfYi5taW5ZLCBtYXhYID0gX2IubWF4WCwgbWF4WSA9IF9iLm1heFk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250RGVzY3JpcHRvciA9IGNvbnRleHQub2JqKChfYyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTogJ0ZvbnREZXNjcmlwdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9udE5hbWU6IHRoaXMuYmFzZUZvbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczogZGVyaXZlRm9udEZsYWdzKHRoaXMuZm9udCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRCQm94OiBbbWluWCAqIHNjYWxlLCBtaW5ZICogc2NhbGUsIG1heFggKiBzY2FsZSwgbWF4WSAqIHNjYWxlXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRhbGljQW5nbGU6IGl0YWxpY0FuZ2xlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc2NlbnQ6IGFzY2VudCAqIHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjZW50OiBkZXNjZW50ICogc2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcEhlaWdodDogKGNhcEhlaWdodCB8fCBhc2NlbnQpICogc2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhIZWlnaHQ6ICh4SGVpZ2h0IHx8IDApICogc2NhbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBzdXJlIGhvdyB0byBjb21wdXRlL2ZpbmQgdGhpcywgbm9yIGlzIGFueWJvZHkgZWxzZSByZWFsbHk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NDg1MTc5L3N0ZW12LXZhbHVlLW9mLXRoZS10cnVldHlwZS1mb250XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZW1WOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY1t0aGlzLmlzQ0ZGKCkgPyAnRm9udEZpbGUzJyA6ICdGb250RmlsZTInXSA9IGZvbnRTdHJlYW1SZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2MpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBjb250ZXh0LnJlZ2lzdGVyKGZvbnREZXNjcmlwdG9yKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5zZXJpYWxpemVGb250ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHRoaXMuZm9udERhdGFdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEZvbnRTdHJlYW0gPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZm9udFN0cmVhbSwgX2EsIF9iO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSAoX2EgPSBjb250ZXh0KS5mbGF0ZVN0cmVhbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuc2VyaWFsaXplRm9udCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFN0cmVhbSA9IF9iLmFwcGx5KF9hLCBbX2Muc2VudCgpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnR5cGU6IHRoaXMuaXNDRkYoKSA/ICdDSURGb250VHlwZTBDJyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcihmb250U3RyZWFtKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZFVuaWNvZGVDbWFwID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNtYXAgPSBjcmVhdGVDbWFwKHRoaXMuZ2x5cGhDYWNoZS5hY2Nlc3MoKSwgdGhpcy5nbHlwaElkLmJpbmQodGhpcykpO1xuICAgICAgICB2YXIgY21hcFN0cmVhbSA9IGNvbnRleHQuZmxhdGVTdHJlYW0oY21hcCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0LnJlZ2lzdGVyKGNtYXBTdHJlYW0pO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udEVtYmVkZGVyLnByb3RvdHlwZS5nbHlwaElkID0gZnVuY3Rpb24gKGdseXBoKSB7XG4gICAgICAgIHJldHVybiBnbHlwaCA/IGdseXBoLmlkIDogLTE7XG4gICAgfTtcbiAgICBDdXN0b21Gb250RW1iZWRkZXIucHJvdG90eXBlLmNvbXB1dGVXaWR0aHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnbHlwaHMgPSB0aGlzLmdseXBoQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIHZhciB3aWR0aHMgPSBbXTtcbiAgICAgICAgdmFyIGN1cnJTZWN0aW9uID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBjdXJyR2x5cGggPSBnbHlwaHNbaWR4XTtcbiAgICAgICAgICAgIHZhciBwcmV2R2x5cGggPSBnbHlwaHNbaWR4IC0gMV07XG4gICAgICAgICAgICB2YXIgY3VyckdseXBoSWQgPSB0aGlzLmdseXBoSWQoY3VyckdseXBoKTtcbiAgICAgICAgICAgIHZhciBwcmV2R2x5cGhJZCA9IHRoaXMuZ2x5cGhJZChwcmV2R2x5cGgpO1xuICAgICAgICAgICAgaWYgKGlkeCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHdpZHRocy5wdXNoKGN1cnJHbHlwaElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJHbHlwaElkIC0gcHJldkdseXBoSWQgIT09IDEpIHtcbiAgICAgICAgICAgICAgICB3aWR0aHMucHVzaChjdXJyU2VjdGlvbik7XG4gICAgICAgICAgICAgICAgd2lkdGhzLnB1c2goY3VyckdseXBoSWQpO1xuICAgICAgICAgICAgICAgIGN1cnJTZWN0aW9uID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyU2VjdGlvbi5wdXNoKGN1cnJHbHlwaC5hZHZhbmNlV2lkdGggKiB0aGlzLnNjYWxlKTtcbiAgICAgICAgfVxuICAgICAgICB3aWR0aHMucHVzaChjdXJyU2VjdGlvbik7XG4gICAgICAgIHJldHVybiB3aWR0aHM7XG4gICAgfTtcbiAgICByZXR1cm4gQ3VzdG9tRm9udEVtYmVkZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEN1c3RvbUZvbnRFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUN1c3RvbUZvbnRFbWJlZGRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZXh0ZW5kcywgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBDdXN0b21Gb250RW1iZWRkZXIgZnJvbSBcIi4vQ3VzdG9tRm9udEVtYmVkZGVyXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xuaW1wb3J0IHsgQ2FjaGUsIG1lcmdlVWludDhBcnJheXMsIHRvSGV4U3RyaW5nT2ZNaW5MZW5ndGggfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogQSBub3RlIG9mIHRoYW5rcyB0byB0aGUgZGV2ZWxvcGVycyBvZiBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQsIGFzXG4gKiB0aGlzIGNsYXNzIGJvcnJvd3MgZnJvbTpcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL2Rldm9uZ292ZXR0L3BkZmtpdC9ibG9iL2U3MWVkYWIwZGQ0NjU3YjVhNzY3ODA0YmE4NmM5NGM1OGQwMWZiY2EvbGliL2ltYWdlL2pwZWcuY29mZmVlXG4gKi9cbnZhciBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIoZm9udCwgZm9udERhdGEsIGN1c3RvbUZvbnROYW1lLCBmb250RmVhdHVyZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZm9udCwgZm9udERhdGEsIGN1c3RvbUZvbnROYW1lLCBmb250RmVhdHVyZXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN1YnNldCA9IF90aGlzLmZvbnQuY3JlYXRlU3Vic2V0KCk7XG4gICAgICAgIF90aGlzLmdseXBocyA9IFtdO1xuICAgICAgICBfdGhpcy5nbHlwaENhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuZ2x5cGhzOyB9KTtcbiAgICAgICAgX3RoaXMuZ2x5cGhJZE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKGZvbnRraXQsIGZvbnREYXRhLCBjdXN0b21Gb250TmFtZSwgZm9udEZlYXR1cmVzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmb250O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBmb250a2l0LmNyZWF0ZShmb250RGF0YSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIG5ldyBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIoZm9udCwgZm9udERhdGEsIGN1c3RvbUZvbnROYW1lLCBmb250RmVhdHVyZXMpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDdXN0b21Gb250U3Vic2V0RW1iZWRkZXIucHJvdG90eXBlLmVuY29kZVRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICB2YXIgZ2x5cGhzID0gdGhpcy5mb250LmxheW91dCh0ZXh0LCB0aGlzLmZvbnRGZWF0dXJlcykuZ2x5cGhzO1xuICAgICAgICB2YXIgaGV4Q29kZXMgPSBuZXcgQXJyYXkoZ2x5cGhzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBnbHlwaCA9IGdseXBoc1tpZHhdO1xuICAgICAgICAgICAgdmFyIHN1YnNldEdseXBoSWQgPSB0aGlzLnN1YnNldC5pbmNsdWRlR2x5cGgoZ2x5cGgpO1xuICAgICAgICAgICAgdGhpcy5nbHlwaHNbc3Vic2V0R2x5cGhJZCAtIDFdID0gZ2x5cGg7XG4gICAgICAgICAgICB0aGlzLmdseXBoSWRNYXAuc2V0KGdseXBoLmlkLCBzdWJzZXRHbHlwaElkKTtcbiAgICAgICAgICAgIGhleENvZGVzW2lkeF0gPSB0b0hleFN0cmluZ09mTWluTGVuZ3RoKHN1YnNldEdseXBoSWQsIDQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2x5cGhDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHJldHVybiBQREZIZXhTdHJpbmcub2YoaGV4Q29kZXMuam9pbignJykpO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLnByb3RvdHlwZS5pc0NGRiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2V0LmNmZjtcbiAgICB9O1xuICAgIEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5wcm90b3R5cGUuZ2x5cGhJZCA9IGZ1bmN0aW9uIChnbHlwaCkge1xuICAgICAgICByZXR1cm4gZ2x5cGggPyB0aGlzLmdseXBoSWRNYXAuZ2V0KGdseXBoLmlkKSA6IC0xO1xuICAgIH07XG4gICAgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyLnByb3RvdHlwZS5zZXJpYWxpemVGb250ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHBhcnRzID0gW107XG4gICAgICAgICAgICBfdGhpcy5zdWJzZXRcbiAgICAgICAgICAgICAgICAuZW5jb2RlU3RyZWFtKClcbiAgICAgICAgICAgICAgICAub24oJ2RhdGEnLCBmdW5jdGlvbiAoYnl0ZXMpIHsgcmV0dXJuIHBhcnRzLnB1c2goYnl0ZXMpOyB9KVxuICAgICAgICAgICAgICAgIC5vbignZW5kJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZShtZXJnZVVpbnQ4QXJyYXlzKHBhcnRzKSk7IH0pXG4gICAgICAgICAgICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHsgcmV0dXJuIHJlamVjdChlcnIpOyB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyO1xufShDdXN0b21Gb250RW1iZWRkZXIpKTtcbmV4cG9ydCBkZWZhdWx0IEN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUN1c3RvbUZvbnRTdWJzZXRFbWJlZGRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGU3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmluZ1wiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbi8qKlxuICogRnJvbSB0aGUgUERGLUEzIHNwZWNpZmljYXRpb24sIHNlY3Rpb24gKiozLjEuIFJlcXVpcmVtZW50cyAtIEdlbmVyYWwqKi5cbiAqIFNlZTpcbiAqICogaHR0cHM6Ly93d3cucGRmYS5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMTgvMTAvUERGMjBfQU4wMDItQUYucGRmXG4gKi9cbmV4cG9ydCB2YXIgQUZSZWxhdGlvbnNoaXA7XG4oZnVuY3Rpb24gKEFGUmVsYXRpb25zaGlwKSB7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJTb3VyY2VcIl0gPSBcIlNvdXJjZVwiO1xuICAgIEFGUmVsYXRpb25zaGlwW1wiRGF0YVwiXSA9IFwiRGF0YVwiO1xuICAgIEFGUmVsYXRpb25zaGlwW1wiQWx0ZXJuYXRpdmVcIl0gPSBcIkFsdGVybmF0aXZlXCI7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJTdXBwbGVtZW50XCJdID0gXCJTdXBwbGVtZW50XCI7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJFbmNyeXB0ZWRQYXlsb2FkXCJdID0gXCJFbmNyeXB0ZWRQYXlsb2FkXCI7XG4gICAgQUZSZWxhdGlvbnNoaXBbXCJGb3JtRGF0YVwiXSA9IFwiRW5jcnlwdGVkUGF5bG9hZFwiO1xuICAgIEFGUmVsYXRpb25zaGlwW1wiU2NoZW1hXCJdID0gXCJTY2hlbWFcIjtcbiAgICBBRlJlbGF0aW9uc2hpcFtcIlVuc3BlY2lmaWVkXCJdID0gXCJVbnNwZWNpZmllZFwiO1xufSkoQUZSZWxhdGlvbnNoaXAgfHwgKEFGUmVsYXRpb25zaGlwID0ge30pKTtcbnZhciBGaWxlRW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRmlsZUVtYmVkZGVyKGZpbGVEYXRhLCBmaWxlTmFtZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB0aGlzLmZpbGVEYXRhID0gZmlsZURhdGE7XG4gICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgRmlsZUVtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChieXRlcywgZmlsZU5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIG5ldyBGaWxlRW1iZWRkZXIoYnl0ZXMsIGZpbGVOYW1lLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIEZpbGVFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRJbnRvQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBtaW1lVHlwZSwgZGVzY3JpcHRpb24sIGNyZWF0aW9uRGF0ZSwgbW9kaWZpY2F0aW9uRGF0ZSwgYWZSZWxhdGlvbnNoaXAsIGVtYmVkZGVkRmlsZVN0cmVhbSwgZW1iZWRkZWRGaWxlU3RyZWFtUmVmLCBmaWxlU3BlY0RpY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgX2EgPSB0aGlzLm9wdGlvbnMsIG1pbWVUeXBlID0gX2EubWltZVR5cGUsIGRlc2NyaXB0aW9uID0gX2EuZGVzY3JpcHRpb24sIGNyZWF0aW9uRGF0ZSA9IF9hLmNyZWF0aW9uRGF0ZSwgbW9kaWZpY2F0aW9uRGF0ZSA9IF9hLm1vZGlmaWNhdGlvbkRhdGUsIGFmUmVsYXRpb25zaGlwID0gX2EuYWZSZWxhdGlvbnNoaXA7XG4gICAgICAgICAgICAgICAgZW1iZWRkZWRGaWxlU3RyZWFtID0gY29udGV4dC5mbGF0ZVN0cmVhbSh0aGlzLmZpbGVEYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdFbWJlZGRlZEZpbGUnLFxuICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlOiBtaW1lVHlwZSAhPT0gbnVsbCAmJiBtaW1lVHlwZSAhPT0gdm9pZCAwID8gbWltZVR5cGUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIFBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZTogdGhpcy5maWxlRGF0YS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGlvbkRhdGU6IGNyZWF0aW9uRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUERGU3RyaW5nLmZyb21EYXRlKGNyZWF0aW9uRGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIE1vZERhdGU6IG1vZGlmaWNhdGlvbkRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFBERlN0cmluZy5mcm9tRGF0ZShtb2RpZmljYXRpb25EYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVtYmVkZGVkRmlsZVN0cmVhbVJlZiA9IGNvbnRleHQucmVnaXN0ZXIoZW1iZWRkZWRGaWxlU3RyZWFtKTtcbiAgICAgICAgICAgICAgICBmaWxlU3BlY0RpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdGaWxlc3BlYycsXG4gICAgICAgICAgICAgICAgICAgIEY6IFBERlN0cmluZy5vZih0aGlzLmZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgVUY6IFBERkhleFN0cmluZy5mcm9tVGV4dCh0aGlzLmZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgRUY6IHsgRjogZW1iZWRkZWRGaWxlU3RyZWFtUmVmIH0sXG4gICAgICAgICAgICAgICAgICAgIERlc2M6IGRlc2NyaXB0aW9uID8gUERGSGV4U3RyaW5nLmZyb21UZXh0KGRlc2NyaXB0aW9uKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgQUZSZWxhdGlvbnNoaXA6IGFmUmVsYXRpb25zaGlwICE9PSBudWxsICYmIGFmUmVsYXRpb25zaGlwICE9PSB2b2lkIDAgPyBhZlJlbGF0aW9uc2hpcCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYXNzaWduKHJlZiwgZmlsZVNwZWNEaWN0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3RlcihmaWxlU3BlY0RpY3QpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEZpbGVFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBGaWxlRW1iZWRkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxlRW1iZWRkZXIuanMubWFwIiwiLy8gcHJldHRpZXItaWdub3JlXG52YXIgbWFrZUZvbnRGbGFncyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIGZsYWdzID0gMDtcbiAgICB2YXIgZmxpcEJpdCA9IGZ1bmN0aW9uIChiaXQpIHsgZmxhZ3MgfD0gKDEgPDwgKGJpdCAtIDEpKTsgfTtcbiAgICBpZiAob3B0aW9ucy5maXhlZFBpdGNoKVxuICAgICAgICBmbGlwQml0KDEpO1xuICAgIGlmIChvcHRpb25zLnNlcmlmKVxuICAgICAgICBmbGlwQml0KDIpO1xuICAgIGlmIChvcHRpb25zLnN5bWJvbGljKVxuICAgICAgICBmbGlwQml0KDMpO1xuICAgIGlmIChvcHRpb25zLnNjcmlwdClcbiAgICAgICAgZmxpcEJpdCg0KTtcbiAgICBpZiAob3B0aW9ucy5ub25zeW1ib2xpYylcbiAgICAgICAgZmxpcEJpdCg2KTtcbiAgICBpZiAob3B0aW9ucy5pdGFsaWMpXG4gICAgICAgIGZsaXBCaXQoNyk7XG4gICAgaWYgKG9wdGlvbnMuYWxsQ2FwKVxuICAgICAgICBmbGlwQml0KDE3KTtcbiAgICBpZiAob3B0aW9ucy5zbWFsbENhcClcbiAgICAgICAgZmxpcEJpdCgxOCk7XG4gICAgaWYgKG9wdGlvbnMuZm9yY2VCb2xkKVxuICAgICAgICBmbGlwQml0KDE5KTtcbiAgICByZXR1cm4gZmxhZ3M7XG59O1xuLy8gRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0L2Jsb2IvODNmNWY3MjQzMTcyYTAxN2FkY2Y2YTdmYWE1NTQ3YzU1OTgyYzU3Yi9saWIvZm9udC9lbWJlZGRlZC5qcyNMMTIzLUwxMjlcbmV4cG9ydCB2YXIgZGVyaXZlRm9udEZsYWdzID0gZnVuY3Rpb24gKGZvbnQpIHtcbiAgICB2YXIgZmFtaWx5Q2xhc3MgPSBmb250WydPUy8yJ10gPyBmb250WydPUy8yJ10uc0ZhbWlseUNsYXNzIDogMDtcbiAgICB2YXIgZmxhZ3MgPSBtYWtlRm9udEZsYWdzKHtcbiAgICAgICAgZml4ZWRQaXRjaDogZm9udC5wb3N0LmlzRml4ZWRQaXRjaCxcbiAgICAgICAgc2VyaWY6IDEgPD0gZmFtaWx5Q2xhc3MgJiYgZmFtaWx5Q2xhc3MgPD0gNyxcbiAgICAgICAgc3ltYm9saWM6IHRydWUsXG4gICAgICAgIHNjcmlwdDogZmFtaWx5Q2xhc3MgPT09IDEwLFxuICAgICAgICBpdGFsaWM6IGZvbnQuaGVhZC5tYWNTdHlsZS5pdGFsaWMsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZsYWdzO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZvbnRGbGFncy5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGSGV4U3RyaW5nIGZyb20gXCIuLi9vYmplY3RzL1BERkhleFN0cmluZ1wiO1xudmFyIEphdmFTY3JpcHRFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBKYXZhU2NyaXB0RW1iZWRkZXIoc2NyaXB0LCBzY3JpcHROYW1lKSB7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0O1xuICAgICAgICB0aGlzLnNjcmlwdE5hbWUgPSBzY3JpcHROYW1lO1xuICAgIH1cbiAgICBKYXZhU2NyaXB0RW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKHNjcmlwdCwgc2NyaXB0TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IEphdmFTY3JpcHRFbWJlZGRlcihzY3JpcHQsIHNjcmlwdE5hbWUpO1xuICAgIH07XG4gICAgSmF2YVNjcmlwdEVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIganNBY3Rpb25EaWN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGpzQWN0aW9uRGljdCA9IGNvbnRleHQub2JqKHtcbiAgICAgICAgICAgICAgICAgICAgVHlwZTogJ0FjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIFM6ICdKYXZhU2NyaXB0JyxcbiAgICAgICAgICAgICAgICAgICAgSlM6IFBERkhleFN0cmluZy5mcm9tVGV4dCh0aGlzLnNjcmlwdCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmFzc2lnbihyZWYsIGpzQWN0aW9uRGljdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoanNBY3Rpb25EaWN0KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBKYXZhU2NyaXB0RW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgSmF2YVNjcmlwdEVtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SmF2YVNjcmlwdEVtYmVkZGVyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIE1BUktFUlMgPSBbXG4gICAgMHhmZmMwLCAweGZmYzEsIDB4ZmZjMixcbiAgICAweGZmYzMsIDB4ZmZjNSwgMHhmZmM2LFxuICAgIDB4ZmZjNywgMHhmZmM4LCAweGZmYzksXG4gICAgMHhmZmNhLCAweGZmY2IsIDB4ZmZjYyxcbiAgICAweGZmY2QsIDB4ZmZjZSwgMHhmZmNmLFxuXTtcbnZhciBDb2xvclNwYWNlO1xuKGZ1bmN0aW9uIChDb2xvclNwYWNlKSB7XG4gICAgQ29sb3JTcGFjZVtcIkRldmljZUdyYXlcIl0gPSBcIkRldmljZUdyYXlcIjtcbiAgICBDb2xvclNwYWNlW1wiRGV2aWNlUkdCXCJdID0gXCJEZXZpY2VSR0JcIjtcbiAgICBDb2xvclNwYWNlW1wiRGV2aWNlQ01ZS1wiXSA9IFwiRGV2aWNlQ01ZS1wiO1xufSkoQ29sb3JTcGFjZSB8fCAoQ29sb3JTcGFjZSA9IHt9KSk7XG52YXIgQ2hhbm5lbFRvQ29sb3JTcGFjZSA9IHtcbiAgICAxOiBDb2xvclNwYWNlLkRldmljZUdyYXksXG4gICAgMzogQ29sb3JTcGFjZS5EZXZpY2VSR0IsXG4gICAgNDogQ29sb3JTcGFjZS5EZXZpY2VDTVlLLFxufTtcbi8qKlxuICogQSBub3RlIG9mIHRoYW5rcyB0byB0aGUgZGV2ZWxvcGVycyBvZiBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQsIGFzXG4gKiB0aGlzIGNsYXNzIGJvcnJvd3MgZnJvbTpcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0L2Jsb2IvYTZhZjc2NDY3Y2UwNmJkNmEyYWY0YWE3MjcxY2NhYzlmZjE1MmE3ZC9saWIvaW1hZ2UvanBlZy5qc1xuICovXG52YXIgSnBlZ0VtYmVkZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEpwZWdFbWJlZGRlcihpbWFnZURhdGEsIGJpdHNQZXJDb21wb25lbnQsIHdpZHRoLCBoZWlnaHQsIGNvbG9yU3BhY2UpIHtcbiAgICAgICAgdGhpcy5pbWFnZURhdGEgPSBpbWFnZURhdGE7XG4gICAgICAgIHRoaXMuYml0c1BlckNvbXBvbmVudCA9IGJpdHNQZXJDb21wb25lbnQ7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuY29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7XG4gICAgfVxuICAgIEpwZWdFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAoaW1hZ2VEYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhVmlldywgc29pLCBwb3MsIG1hcmtlciwgYml0c1BlckNvbXBvbmVudCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbEJ5dGUsIGNoYW5uZWxOYW1lLCBjb2xvclNwYWNlO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGltYWdlRGF0YS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHNvaSA9IGRhdGFWaWV3LmdldFVpbnQxNigwKTtcbiAgICAgICAgICAgICAgICBpZiAoc29pICE9PSAweGZmZDgpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU09JIG5vdCBmb3VuZCBpbiBKUEVHJyk7XG4gICAgICAgICAgICAgICAgcG9zID0gMjtcbiAgICAgICAgICAgICAgICB3aGlsZSAocG9zIDwgZGF0YVZpZXcuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSBkYXRhVmlldy5nZXRVaW50MTYocG9zKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChNQVJLRVJTLmluY2x1ZGVzKG1hcmtlcikpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgcG9zICs9IGRhdGFWaWV3LmdldFVpbnQxNihwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIU1BUktFUlMuaW5jbHVkZXMobWFya2VyKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpQRUcnKTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gMjtcbiAgICAgICAgICAgICAgICBiaXRzUGVyQ29tcG9uZW50ID0gZGF0YVZpZXcuZ2V0VWludDgocG9zKyspO1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IGRhdGFWaWV3LmdldFVpbnQxNihwb3MpO1xuICAgICAgICAgICAgICAgIHBvcyArPSAyO1xuICAgICAgICAgICAgICAgIHdpZHRoID0gZGF0YVZpZXcuZ2V0VWludDE2KHBvcyk7XG4gICAgICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgICAgICAgICAgY2hhbm5lbEJ5dGUgPSBkYXRhVmlldy5nZXRVaW50OChwb3MrKyk7XG4gICAgICAgICAgICAgICAgY2hhbm5lbE5hbWUgPSBDaGFubmVsVG9Db2xvclNwYWNlW2NoYW5uZWxCeXRlXTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWxOYW1lKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gSlBFRyBjaGFubmVsLicpO1xuICAgICAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBjaGFubmVsTmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IEpwZWdFbWJlZGRlcihpbWFnZURhdGEsIGJpdHNQZXJDb21wb25lbnQsIHdpZHRoLCBoZWlnaHQsIGNvbG9yU3BhY2UpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEpwZWdFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRJbnRvQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHhPYmplY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgeE9iamVjdCA9IGNvbnRleHQuc3RyZWFtKHRoaXMuaW1hZ2VEYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdYT2JqZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgU3VidHlwZTogJ0ltYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgQml0c1BlckNvbXBvbmVudDogdGhpcy5iaXRzUGVyQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICBXaWR0aDogdGhpcy53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgSGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZTogdGhpcy5jb2xvclNwYWNlLFxuICAgICAgICAgICAgICAgICAgICBGaWx0ZXI6ICdEQ1REZWNvZGUnLFxuICAgICAgICAgICAgICAgICAgICAvLyBDTVlLIEpQRUcgc3RyZWFtcyBpbiBQREYgYXJlIHR5cGljYWxseSBzdG9yZWQgY29tcGxlbWVudGVkLFxuICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIDEgYXMgJ29mZicgYW5kIDAgYXMgJ29uJyAoUERGIDMyMDAwLTE6MjAwOCwgOC42LjQuNCkuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFN0YW5kYWxvbmUgQ01ZSyBKUEVHICh1c3VhbGx5IGV4cG9ydGVkIGJ5IFBob3Rvc2hvcCkgYXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlZCBpbnZlcnNlLCB3aXRoIDAgYXMgJ29mZicgYW5kIDEgYXMgJ29uJywgbGlrZSBSR0IuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5aW5nIGEgc3dhcCBoZXJlIGFzIGEgaGVkZ2UgdGhhdCBtb3N0IGJ5dGVzIHBhc3NpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIG1ldGhvZCB3aWxsIGJlbmVmaXQgZnJvbSBpdC5cbiAgICAgICAgICAgICAgICAgICAgRGVjb2RlOiB0aGlzLmNvbG9yU3BhY2UgPT09IENvbG9yU3BhY2UuRGV2aWNlQ01ZS1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBbMSwgMCwgMSwgMCwgMSwgMCwgMSwgMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hc3NpZ24ocmVmLCB4T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlZl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgY29udGV4dC5yZWdpc3Rlcih4T2JqZWN0KV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBKcGVnRW1iZWRkZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgSnBlZ0VtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SnBlZ0VtYmVkZGVyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IE1pc3NpbmdQYWdlQ29udGVudHNFbWJlZGRpbmdFcnJvciwgVW5yZWNvZ25pemVkU3RyZWFtVHlwZUVycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGUmF3U3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlJhd1N0cmVhbVwiO1xuaW1wb3J0IFBERlN0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJlYW1cIjtcbmltcG9ydCB7IGRlY29kZVBERlJhd1N0cmVhbSB9IGZyb20gXCIuLi9zdHJlYW1zL2RlY29kZVwiO1xuaW1wb3J0IFBERkNvbnRlbnRTdHJlYW0gZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGQ29udGVudFN0cmVhbVwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgbWVyZ2VJbnRvVHlwZWRBcnJheSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIGZ1bGxQYWdlQm91bmRpbmdCb3ggPSBmdW5jdGlvbiAocGFnZSkge1xuICAgIHZhciBtZWRpYUJveCA9IHBhZ2UuTWVkaWFCb3goKTtcbiAgICB2YXIgd2lkdGggPSBtZWRpYUJveC5sb29rdXAoMiwgUERGTnVtYmVyKS5hc051bWJlcigpIC1cbiAgICAgICAgbWVkaWFCb3gubG9va3VwKDAsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICB2YXIgaGVpZ2h0ID0gbWVkaWFCb3gubG9va3VwKDMsIFBERk51bWJlcikuYXNOdW1iZXIoKSAtXG4gICAgICAgIG1lZGlhQm94Lmxvb2t1cCgxLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgcmV0dXJuIHsgbGVmdDogMCwgYm90dG9tOiAwLCByaWdodDogd2lkdGgsIHRvcDogaGVpZ2h0IH07XG59O1xuLy8gUmV0dXJucyB0aGUgaWRlbnRpdHkgbWF0cml4LCBtb2RpZmllZCB0byBwb3NpdGlvbiB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW5cbi8vIGJvdW5kaW5nIGJveCBhdCAoMCwgMCkuXG52YXIgYm91bmRpbmdCb3hBZGp1c3RlZE1hdHJpeCA9IGZ1bmN0aW9uIChiYikgeyByZXR1cm4gWzEsIDAsIDAsIDEsIC1iYi5sZWZ0LCAtYmIuYm90dG9tXTsgfTtcbnZhciBQREZQYWdlRW1iZWRkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGUGFnZUVtYmVkZGVyKHBhZ2UsIGJvdW5kaW5nQm94LCB0cmFuc2Zvcm1hdGlvbk1hdHJpeCkge1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgICAgICB2YXIgYmIgPSBib3VuZGluZ0JveCAhPT0gbnVsbCAmJiBib3VuZGluZ0JveCAhPT0gdm9pZCAwID8gYm91bmRpbmdCb3ggOiBmdWxsUGFnZUJvdW5kaW5nQm94KHBhZ2UpO1xuICAgICAgICB0aGlzLndpZHRoID0gYmIucmlnaHQgLSBiYi5sZWZ0O1xuICAgICAgICB0aGlzLmhlaWdodCA9IGJiLnRvcCAtIGJiLmJvdHRvbTtcbiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IGJiO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybWF0aW9uTWF0cml4ID0gdHJhbnNmb3JtYXRpb25NYXRyaXggIT09IG51bGwgJiYgdHJhbnNmb3JtYXRpb25NYXRyaXggIT09IHZvaWQgMCA/IHRyYW5zZm9ybWF0aW9uTWF0cml4IDogYm91bmRpbmdCb3hBZGp1c3RlZE1hdHJpeChiYik7XG4gICAgfVxuICAgIFBERlBhZ2VFbWJlZGRlci5mb3IgPSBmdW5jdGlvbiAocGFnZSwgYm91bmRpbmdCb3gsIHRyYW5zZm9ybWF0aW9uTWF0cml4KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFBERlBhZ2VFbWJlZGRlcihwYWdlLCBib3VuZGluZ0JveCwgdHJhbnNmb3JtYXRpb25NYXRyaXgpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERlBhZ2VFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRJbnRvQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBDb250ZW50cywgUmVzb3VyY2VzLCBkZWNvZGVkQ29udGVudHMsIF9iLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3AsIHhPYmplY3Q7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9jKSB7XG4gICAgICAgICAgICAgICAgX2EgPSB0aGlzLnBhZ2Uubm9ybWFsaXplZEVudHJpZXMoKSwgQ29udGVudHMgPSBfYS5Db250ZW50cywgUmVzb3VyY2VzID0gX2EuUmVzb3VyY2VzO1xuICAgICAgICAgICAgICAgIGlmICghQ29udGVudHMpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUGFnZUNvbnRlbnRzRW1iZWRkaW5nRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBkZWNvZGVkQ29udGVudHMgPSB0aGlzLmRlY29kZUNvbnRlbnRzKENvbnRlbnRzKTtcbiAgICAgICAgICAgICAgICBfYiA9IHRoaXMuYm91bmRpbmdCb3gsIGxlZnQgPSBfYi5sZWZ0LCBib3R0b20gPSBfYi5ib3R0b20sIHJpZ2h0ID0gX2IucmlnaHQsIHRvcCA9IF9iLnRvcDtcbiAgICAgICAgICAgICAgICB4T2JqZWN0ID0gY29udGV4dC5mbGF0ZVN0cmVhbShkZWNvZGVkQ29udGVudHMsIHtcbiAgICAgICAgICAgICAgICAgICAgVHlwZTogJ1hPYmplY3QnLFxuICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlOiAnRm9ybScsXG4gICAgICAgICAgICAgICAgICAgIEZvcm1UeXBlOiAxLFxuICAgICAgICAgICAgICAgICAgICBCQm94OiBbbGVmdCwgYm90dG9tLCByaWdodCwgdG9wXSxcbiAgICAgICAgICAgICAgICAgICAgTWF0cml4OiB0aGlzLnRyYW5zZm9ybWF0aW9uTWF0cml4LFxuICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXM6IFJlc291cmNlcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYXNzaWduKHJlZiwgeE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoeE9iamVjdCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBgY29udGVudHNgIGlzIGFuIGFycmF5IG9mIHN0cmVhbXMgd2hpY2ggYXJlIG1lcmdlZCB0byBpbmNsdWRlIHRoZW0gaW4gdGhlIFhPYmplY3QuXG4gICAgLy8gVGhpcyBtZXRob2RzIGV4dHJhY3RzIGVhY2ggc3RyZWFtIGFuZCBqb2lucyB0aGVtIHdpdGggYSBuZXdsaW5lIGNoYXJhY3Rlci5cbiAgICBQREZQYWdlRW1iZWRkZXIucHJvdG90eXBlLmRlY29kZUNvbnRlbnRzID0gZnVuY3Rpb24gKGNvbnRlbnRzKSB7XG4gICAgICAgIHZhciBuZXdsaW5lID0gVWludDhBcnJheS5vZihDaGFyQ29kZXMuTmV3bGluZSk7XG4gICAgICAgIHZhciBkZWNvZGVkQ29udGVudHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gY29udGVudHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgc3RyZWFtID0gY29udGVudHMubG9va3VwKGlkeCwgUERGU3RyZWFtKTtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIFBERlJhd1N0cmVhbSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBkZWNvZGVQREZSYXdTdHJlYW0oc3RyZWFtKS5kZWNvZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIFBERkNvbnRlbnRTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gc3RyZWFtLmdldFVuZW5jb2RlZENvbnRlbnRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWNvZ25pemVkU3RyZWFtVHlwZUVycm9yKHN0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWNvZGVkQ29udGVudHMucHVzaChjb250ZW50LCBuZXdsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVyZ2VJbnRvVHlwZWRBcnJheS5hcHBseSh2b2lkIDAsIGRlY29kZWRDb250ZW50cyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGUGFnZUVtYmVkZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlBhZ2VFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlBhZ2VFbWJlZGRlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBQTkcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcG5nXCI7XG4vKipcbiAqIEEgbm90ZSBvZiB0aGFua3MgdG8gdGhlIGRldmVsb3BlcnMgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0LCBhc1xuICogdGhpcyBjbGFzcyBib3Jyb3dzIGZyb206XG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZvbmdvdmV0dC9wZGZraXQvYmxvYi9lNzFlZGFiMGRkNDY1N2I1YTc2NzgwNGJhODZjOTRjNThkMDFmYmNhL2xpYi9pbWFnZS9wbmcuY29mZmVlXG4gKi9cbnZhciBQbmdFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQbmdFbWJlZGRlcihwbmcpIHtcbiAgICAgICAgdGhpcy5pbWFnZSA9IHBuZztcbiAgICAgICAgdGhpcy5iaXRzUGVyQ29tcG9uZW50ID0gcG5nLmJpdHNQZXJDb21wb25lbnQ7XG4gICAgICAgIHRoaXMud2lkdGggPSBwbmcud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gcG5nLmhlaWdodDtcbiAgICAgICAgdGhpcy5jb2xvclNwYWNlID0gJ0RldmljZVJHQic7XG4gICAgfVxuICAgIFBuZ0VtYmVkZGVyLmZvciA9IGZ1bmN0aW9uIChpbWFnZURhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHBuZztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBwbmcgPSBQTkcubG9hZChpbWFnZURhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBuZXcgUG5nRW1iZWRkZXIocG5nKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQbmdFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRJbnRvQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWYpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIFNNYXNrLCB4T2JqZWN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIFNNYXNrID0gdGhpcy5lbWJlZEFscGhhQ2hhbm5lbChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB4T2JqZWN0ID0gY29udGV4dC5mbGF0ZVN0cmVhbSh0aGlzLmltYWdlLnJnYkNoYW5uZWwsIHtcbiAgICAgICAgICAgICAgICAgICAgVHlwZTogJ1hPYmplY3QnLFxuICAgICAgICAgICAgICAgICAgICBTdWJ0eXBlOiAnSW1hZ2UnLFxuICAgICAgICAgICAgICAgICAgICBCaXRzUGVyQ29tcG9uZW50OiB0aGlzLmltYWdlLmJpdHNQZXJDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIFdpZHRoOiB0aGlzLmltYWdlLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBIZWlnaHQ6IHRoaXMuaW1hZ2UuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlOiB0aGlzLmNvbG9yU3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIFNNYXNrOiBTTWFzayxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYXNzaWduKHJlZiwgeE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGNvbnRleHQucmVnaXN0ZXIoeE9iamVjdCldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQbmdFbWJlZGRlci5wcm90b3R5cGUuZW1iZWRBbHBoYUNoYW5uZWwgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMuaW1hZ2UuYWxwaGFDaGFubmVsKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIHhPYmplY3QgPSBjb250ZXh0LmZsYXRlU3RyZWFtKHRoaXMuaW1hZ2UuYWxwaGFDaGFubmVsLCB7XG4gICAgICAgICAgICBUeXBlOiAnWE9iamVjdCcsXG4gICAgICAgICAgICBTdWJ0eXBlOiAnSW1hZ2UnLFxuICAgICAgICAgICAgSGVpZ2h0OiB0aGlzLmltYWdlLmhlaWdodCxcbiAgICAgICAgICAgIFdpZHRoOiB0aGlzLmltYWdlLndpZHRoLFxuICAgICAgICAgICAgQml0c1BlckNvbXBvbmVudDogdGhpcy5pbWFnZS5iaXRzUGVyQ29tcG9uZW50LFxuICAgICAgICAgICAgQ29sb3JTcGFjZTogJ0RldmljZUdyYXknLFxuICAgICAgICAgICAgRGVjb2RlOiBbMCwgMV0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udGV4dC5yZWdpc3Rlcih4T2JqZWN0KTtcbiAgICB9O1xuICAgIHJldHVybiBQbmdFbWJlZGRlcjtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBQbmdFbWJlZGRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBuZ0VtYmVkZGVyLmpzLm1hcCIsImltcG9ydCB7IEVuY29kaW5ncywgRm9udCwgRm9udE5hbWVzLCB9IGZyb20gJ0BwZGYtbGliL3N0YW5kYXJkLWZvbnRzJztcbmltcG9ydCBQREZIZXhTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5pbXBvcnQgeyB0b0NvZGVQb2ludCwgdG9IZXhTdHJpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbi8qKlxuICogQSBub3RlIG9mIHRoYW5rcyB0byB0aGUgZGV2ZWxvcGVycyBvZiBodHRwczovL2dpdGh1Yi5jb20vZm9saW9qcy9wZGZraXQsIGFzXG4gKiB0aGlzIGNsYXNzIGJvcnJvd3MgZnJvbTpcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL2ZvbGlvanMvcGRma2l0L2Jsb2IvZjkxYmRkNjFjMTY0YTcyZWEwNmJlMWE0M2RjMGE0MTJhZmMzOTI1Zi9saWIvZm9udC9hZm0uY29mZmVlXG4gKi9cbnZhciBTdGFuZGFyZEZvbnRFbWJlZGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdGFuZGFyZEZvbnRFbWJlZGRlcihmb250TmFtZSwgY3VzdG9tTmFtZSkge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdGhpcy5lbmNvZGluZyA9IChmb250TmFtZSA9PT0gRm9udE5hbWVzLlphcGZEaW5nYmF0cyA/IEVuY29kaW5ncy5aYXBmRGluZ2JhdHNcbiAgICAgICAgICAgIDogZm9udE5hbWUgPT09IEZvbnROYW1lcy5TeW1ib2wgPyBFbmNvZGluZ3MuU3ltYm9sXG4gICAgICAgICAgICAgICAgOiBFbmNvZGluZ3MuV2luQW5zaSk7XG4gICAgICAgIHRoaXMuZm9udCA9IEZvbnQubG9hZChmb250TmFtZSk7XG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSB0aGlzLmZvbnQuRm9udE5hbWU7XG4gICAgICAgIHRoaXMuY3VzdG9tTmFtZSA9IGN1c3RvbU5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSB0aGUgSmF2YVNjcmlwdCBzdHJpbmcgaW50byB0aGlzIGZvbnQuIChKYXZhU2NyaXB0IGVuY29kZXMgc3RyaW5ncyBpblxuICAgICAqIFVuaWNvZGUsIGJ1dCBzdGFuZGFyZCBmb250cyB1c2UgZWl0aGVyIFdpbkFuc2ksIFphcGZEaW5nYmF0cywgb3IgU3ltYm9sXG4gICAgICogZW5jb2RpbmdzKVxuICAgICAqL1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbmNvZGVUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgdmFyIGdseXBocyA9IHRoaXMuZW5jb2RlVGV4dEFzR2x5cGhzKHRleHQpO1xuICAgICAgICB2YXIgaGV4Q29kZXMgPSBuZXcgQXJyYXkoZ2x5cGhzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGdseXBocy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGhleENvZGVzW2lkeF0gPSB0b0hleFN0cmluZyhnbHlwaHNbaWR4XS5jb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUERGSGV4U3RyaW5nLm9mKGhleENvZGVzLmpvaW4oJycpKTtcbiAgICB9O1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLnByb3RvdHlwZS53aWR0aE9mVGV4dEF0U2l6ZSA9IGZ1bmN0aW9uICh0ZXh0LCBzaXplKSB7XG4gICAgICAgIHZhciBnbHlwaHMgPSB0aGlzLmVuY29kZVRleHRBc0dseXBocyh0ZXh0KTtcbiAgICAgICAgdmFyIHRvdGFsV2lkdGggPSAwO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnbHlwaHMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgbGVmdCA9IGdseXBoc1tpZHhdLm5hbWU7XG4gICAgICAgICAgICB2YXIgcmlnaHQgPSAoZ2x5cGhzW2lkeCArIDFdIHx8IHt9KS5uYW1lO1xuICAgICAgICAgICAgdmFyIGtlcm5BbW91bnQgPSB0aGlzLmZvbnQuZ2V0WEF4aXNLZXJuaW5nRm9yUGFpcihsZWZ0LCByaWdodCkgfHwgMDtcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gdGhpcy53aWR0aE9mR2x5cGgobGVmdCkgKyBrZXJuQW1vdW50O1xuICAgICAgICB9XG4gICAgICAgIHZhciBzY2FsZSA9IHNpemUgLyAxMDAwO1xuICAgICAgICByZXR1cm4gdG90YWxXaWR0aCAqIHNjYWxlO1xuICAgIH07XG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLmhlaWdodE9mRm9udEF0U2l6ZSA9IGZ1bmN0aW9uIChzaXplLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBfYSA9IG9wdGlvbnMuZGVzY2VuZGVyLCBkZXNjZW5kZXIgPSBfYSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9hO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLmZvbnQsIEFzY2VuZGVyID0gX2IuQXNjZW5kZXIsIERlc2NlbmRlciA9IF9iLkRlc2NlbmRlciwgRm9udEJCb3ggPSBfYi5Gb250QkJveDtcbiAgICAgICAgdmFyIHlUb3AgPSBBc2NlbmRlciB8fCBGb250QkJveFszXTtcbiAgICAgICAgdmFyIHlCb3R0b20gPSBEZXNjZW5kZXIgfHwgRm9udEJCb3hbMV07XG4gICAgICAgIHZhciBoZWlnaHQgPSB5VG9wIC0geUJvdHRvbTtcbiAgICAgICAgaWYgKCFkZXNjZW5kZXIpXG4gICAgICAgICAgICBoZWlnaHQgKz0gRGVzY2VuZGVyIHx8IDA7XG4gICAgICAgIHJldHVybiAoaGVpZ2h0IC8gMTAwMCkgKiBzaXplO1xuICAgIH07XG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIucHJvdG90eXBlLnNpemVPZkZvbnRBdEhlaWdodCA9IGZ1bmN0aW9uIChoZWlnaHQpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5mb250LCBBc2NlbmRlciA9IF9hLkFzY2VuZGVyLCBEZXNjZW5kZXIgPSBfYS5EZXNjZW5kZXIsIEZvbnRCQm94ID0gX2EuRm9udEJCb3g7XG4gICAgICAgIHZhciB5VG9wID0gQXNjZW5kZXIgfHwgRm9udEJCb3hbM107XG4gICAgICAgIHZhciB5Qm90dG9tID0gRGVzY2VuZGVyIHx8IEZvbnRCQm94WzFdO1xuICAgICAgICByZXR1cm4gKDEwMDAgKiBoZWlnaHQpIC8gKHlUb3AgLSB5Qm90dG9tKTtcbiAgICB9O1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLnByb3RvdHlwZS5lbWJlZEludG9Db250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZikge1xuICAgICAgICB2YXIgZm9udERpY3QgPSBjb250ZXh0Lm9iaih7XG4gICAgICAgICAgICBUeXBlOiAnRm9udCcsXG4gICAgICAgICAgICBTdWJ0eXBlOiAnVHlwZTEnLFxuICAgICAgICAgICAgQmFzZUZvbnQ6IHRoaXMuY3VzdG9tTmFtZSB8fCB0aGlzLmZvbnROYW1lLFxuICAgICAgICAgICAgRW5jb2Rpbmc6IHRoaXMuZW5jb2RpbmcgPT09IEVuY29kaW5ncy5XaW5BbnNpID8gJ1dpbkFuc2lFbmNvZGluZycgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBjb250ZXh0LmFzc2lnbihyZWYsIGZvbnREaWN0KTtcbiAgICAgICAgICAgIHJldHVybiByZWY7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5yZWdpc3Rlcihmb250RGljdCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN0YW5kYXJkRm9udEVtYmVkZGVyLnByb3RvdHlwZS53aWR0aE9mR2x5cGggPSBmdW5jdGlvbiAoZ2x5cGhOYW1lKSB7XG4gICAgICAgIC8vIERlZmF1bHQgdG8gMjUwIGlmIGZvbnQgZG9lc24ndCBzcGVjaWZ5IGEgd2lkdGhcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9udC5nZXRXaWR0aE9mR2x5cGgoZ2x5cGhOYW1lKSB8fCAyNTA7XG4gICAgfTtcbiAgICBTdGFuZGFyZEZvbnRFbWJlZGRlci5wcm90b3R5cGUuZW5jb2RlVGV4dEFzR2x5cGhzID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgdmFyIGNvZGVQb2ludHMgPSBBcnJheS5mcm9tKHRleHQpO1xuICAgICAgICB2YXIgZ2x5cGhzID0gbmV3IEFycmF5KGNvZGVQb2ludHMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gY29kZVBvaW50cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSB0b0NvZGVQb2ludChjb2RlUG9pbnRzW2lkeF0pO1xuICAgICAgICAgICAgZ2x5cGhzW2lkeF0gPSB0aGlzLmVuY29kaW5nLmVuY29kZVVuaWNvZGVDb2RlUG9pbnQoY29kZVBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2x5cGhzO1xuICAgIH07XG4gICAgU3RhbmRhcmRGb250RW1iZWRkZXIuZm9yID0gZnVuY3Rpb24gKGZvbnROYW1lLCBjdXN0b21OYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RhbmRhcmRGb250RW1iZWRkZXIoZm9udE5hbWUsIGN1c3RvbU5hbWUpO1xuICAgIH07XG4gICAgcmV0dXJuIFN0YW5kYXJkRm9udEVtYmVkZGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFN0YW5kYXJkRm9udEVtYmVkZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RhbmRhcmRGb250RW1iZWRkZXIuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBhcnJheUFzU3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG52YXIgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKGNsYXNzTmFtZSwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJNZXRob2QgXCIgKyBjbGFzc05hbWUgKyBcIi5cIiArIG1ldGhvZE5hbWUgKyBcIigpIG5vdCBpbXBsZW1lbnRlZFwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgfTtcbnZhciBQcml2YXRlQ29uc3RydWN0b3JFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IoY2xhc3NOYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkNhbm5vdCBjb25zdHJ1Y3QgXCIgKyBjbGFzc05hbWUgKyBcIiAtIGl0IGhhcyBhIHByaXZhdGUgY29uc3RydWN0b3JcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFByaXZhdGVDb25zdHJ1Y3RvckVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IgfTtcbnZhciBVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhVbmV4cGVjdGVkT2JqZWN0VHlwZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IoZXhwZWN0ZWQsIGFjdHVhbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbmFtZSA9IGZ1bmN0aW9uICh0KSB7IHZhciBfYSwgX2I7IHJldHVybiAoX2EgPSB0ID09PSBudWxsIHx8IHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHQubmFtZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogKF9iID0gdCA9PT0gbnVsbCB8fCB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0LmNvbnN0cnVjdG9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubmFtZTsgfTtcbiAgICAgICAgdmFyIGV4cGVjdGVkVHlwZXMgPSBBcnJheS5pc0FycmF5KGV4cGVjdGVkKVxuICAgICAgICAgICAgPyBleHBlY3RlZC5tYXAobmFtZSlcbiAgICAgICAgICAgIDogW25hbWUoZXhwZWN0ZWQpXTtcbiAgICAgICAgdmFyIG1zZyA9IFwiRXhwZWN0ZWQgaW5zdGFuY2Ugb2YgXCIgKyBleHBlY3RlZFR5cGVzLmpvaW4oJyBvciAnKSArIFwiLCBcIiArXG4gICAgICAgICAgICAoXCJidXQgZ290IGluc3RhbmNlIG9mIFwiICsgKGFjdHVhbCA/IG5hbWUoYWN0dWFsKSA6IGFjdHVhbCkpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVW5leHBlY3RlZE9iamVjdFR5cGVFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IgfTtcbnZhciBVbnN1cHBvcnRlZEVuY29kaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFVuc3VwcG9ydGVkRW5jb2RpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBVbnN1cHBvcnRlZEVuY29kaW5nRXJyb3IoZW5jb2RpbmcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IGVuY29kaW5nICsgXCIgc3RyZWFtIGVuY29kaW5nIG5vdCBzdXBwb3J0ZWRcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVuc3VwcG9ydGVkRW5jb2RpbmdFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFVuc3VwcG9ydGVkRW5jb2RpbmdFcnJvciB9O1xudmFyIFJlcGFyc2VFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVwYXJzZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlcGFyc2VFcnJvcihjbGFzc05hbWUsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQ2Fubm90IGNhbGwgXCIgKyBjbGFzc05hbWUgKyBcIi5cIiArIG1ldGhvZE5hbWUgKyBcIigpIG1vcmUgdGhhbiBvbmNlXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBSZXBhcnNlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBSZXBhcnNlRXJyb3IgfTtcbnZhciBNaXNzaW5nQ2F0YWxvZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nQ2F0YWxvZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdDYXRhbG9nRXJyb3IocmVmKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIk1pc3NpbmcgY2F0YWxvZyAocmVmPVwiICsgcmVmICsgXCIpXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nQ2F0YWxvZ0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ0NhdGFsb2dFcnJvciB9O1xudmFyIE1pc3NpbmdQYWdlQ29udGVudHNFbWJlZGRpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWlzc2luZ1BhZ2VDb250ZW50c0VtYmVkZGluZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdQYWdlQ29udGVudHNFbWJlZGRpbmdFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQ2FuJ3QgZW1iZWQgcGFnZSB3aXRoIG1pc3NpbmcgQ29udGVudHNcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE1pc3NpbmdQYWdlQ29udGVudHNFbWJlZGRpbmdFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdQYWdlQ29udGVudHNFbWJlZGRpbmdFcnJvciB9O1xudmFyIFVucmVjb2duaXplZFN0cmVhbVR5cGVFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVW5yZWNvZ25pemVkU3RyZWFtVHlwZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFVucmVjb2duaXplZFN0cmVhbVR5cGVFcnJvcihzdHJlYW0pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBzdHJlYW1UeXBlID0gKF9jID0gKF9iID0gKF9hID0gc3RyZWFtID09PSBudWxsIHx8IHN0cmVhbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RyZWFtLmNvbnRydWN0b3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdHJlYW0gPT09IG51bGwgfHwgc3RyZWFtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHJlYW0ubmFtZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogc3RyZWFtO1xuICAgICAgICB2YXIgbXNnID0gXCJVbnJlY29nbml6ZWQgc3RyZWFtIHR5cGU6IFwiICsgc3RyZWFtVHlwZTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFVucmVjb2duaXplZFN0cmVhbVR5cGVFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFVucmVjb2duaXplZFN0cmVhbVR5cGVFcnJvciB9O1xudmFyIFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQYWdlRW1iZWRkaW5nTWlzbWF0Y2hlZENvbnRleHRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQYWdlRW1iZWRkaW5nTWlzbWF0Y2hlZENvbnRleHRFcnJvcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRm91bmQgbWlzbWF0Y2hlZCBjb250ZXh0cyB3aGlsZSBlbWJlZGRpbmcgcGFnZXMuIEFsbCBwYWdlcyBpbiB0aGUgYXJyYXkgcGFzc2VkIHRvIGBQREZEb2N1bWVudC5lbWJlZFBhZ2VzKClgIG11c3QgYmUgZnJvbSB0aGUgc2FtZSBkb2N1bWVudC5cIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBhZ2VFbWJlZGRpbmdNaXNtYXRjaGVkQ29udGV4dEVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgUGFnZUVtYmVkZGluZ01pc21hdGNoZWRDb250ZXh0RXJyb3IgfTtcbnZhciBQREZBcnJheUlzTm90UmVjdGFuZ2xlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFycmF5SXNOb3RSZWN0YW5nbGVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZBcnJheUlzTm90UmVjdGFuZ2xlRXJyb3Ioc2l6ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBdHRlbXB0ZWQgdG8gY29udmVydCBQREZBcnJheSB3aXRoIFwiICsgc2l6ZSArIFwiIGVsZW1lbnRzIHRvIHJlY3RhbmdsZSwgYnV0IG11c3QgaGF2ZSBleGFjdGx5IDQgZWxlbWVudHMuXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQREZBcnJheUlzTm90UmVjdGFuZ2xlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBQREZBcnJheUlzTm90UmVjdGFuZ2xlRXJyb3IgfTtcbnZhciBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEludmFsaWRQREZEYXRlU3RyaW5nRXJyb3IodmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiQXR0ZW1wdGVkIHRvIGNvbnZlcnQgXFxcIlwiICsgdmFsdWUgKyBcIlxcXCIgdG8gYSBkYXRlLCBidXQgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIFBERiBkYXRlIHN0cmluZyBmb3JtYXQuXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvciB9O1xudmFyIEludmFsaWRUYXJnZXRJbmRleEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvcih0YXJnZXRJbmRleCwgQ291bnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiSW52YWxpZCB0YXJnZXRJbmRleCBzcGVjaWZpZWQ6IHRhcmdldEluZGV4PVwiICsgdGFyZ2V0SW5kZXggKyBcIiBtdXN0IGJlIGxlc3MgdGhhbiBDb3VudD1cIiArIENvdW50O1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSW52YWxpZFRhcmdldEluZGV4RXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvciB9O1xudmFyIENvcnJ1cHRQYWdlVHJlZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb3JydXB0UGFnZVRyZWVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb3JydXB0UGFnZVRyZWVFcnJvcih0YXJnZXRJbmRleCwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBcIiArIG9wZXJhdGlvbiArIFwiIGF0IHRhcmdldEluZGV4PVwiICsgdGFyZ2V0SW5kZXggKyBcIiBkdWUgdG8gY29ycnVwdCBwYWdlIHRyZWU6IEl0IGlzIGxpa2VseSB0aGF0IG9uZSBvciBtb3JlICdDb3VudCcgZW50cmllcyBhcmUgaW52YWxpZFwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gQ29ycnVwdFBhZ2VUcmVlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBDb3JydXB0UGFnZVRyZWVFcnJvciB9O1xudmFyIEluZGV4T3V0T2ZCb3VuZHNFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW5kZXhPdXRPZkJvdW5kc0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEluZGV4T3V0T2ZCb3VuZHNFcnJvcihpbmRleCwgbWluLCBtYXgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiaW5kZXggc2hvdWxkIGJlIGF0IGxlYXN0IFwiICsgbWluICsgXCIgYW5kIGF0IG1vc3QgXCIgKyBtYXggKyBcIiwgYnV0IHdhcyBhY3R1YWxseSBcIiArIGluZGV4O1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSW5kZXhPdXRPZkJvdW5kc0Vycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgSW5kZXhPdXRPZkJvdW5kc0Vycm9yIH07XG52YXIgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbXNnID0gXCJBdHRlbXB0ZWQgdG8gc2V0IGludmFsaWQgZmllbGQgdmFsdWVcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEludmFsaWRBY3JvRmllbGRWYWx1ZUVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgSW52YWxpZEFjcm9GaWVsZFZhbHVlRXJyb3IgfTtcbnZhciBNdWx0aVNlbGVjdFZhbHVlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE11bHRpU2VsZWN0VmFsdWVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNdWx0aVNlbGVjdFZhbHVlRXJyb3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkF0dGVtcHRlZCB0byBzZWxlY3QgbXVsdGlwbGUgdmFsdWVzIGZvciBzaW5nbGUtc2VsZWN0IGZpZWxkXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNdWx0aVNlbGVjdFZhbHVlRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBNdWx0aVNlbGVjdFZhbHVlRXJyb3IgfTtcbnZhciBNaXNzaW5nREFFbnRyeUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nREFFbnRyeUVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdEQUVudHJ5RXJyb3IoZmllbGROYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIk5vIC9EQSAoZGVmYXVsdCBhcHBlYXJhbmNlKSBlbnRyeSBmb3VuZCBmb3IgZmllbGQ6IFwiICsgZmllbGROYW1lO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ0RBRW50cnlFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdEQUVudHJ5RXJyb3IgfTtcbnZhciBNaXNzaW5nVGZPcGVyYXRvckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhNaXNzaW5nVGZPcGVyYXRvckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1pc3NpbmdUZk9wZXJhdG9yRXJyb3IoZmllbGROYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIk5vIFRmIG9wZXJhdG9yIGZvdW5kIGZvciBEQSBvZiBmaWVsZDogXCIgKyBmaWVsZE5hbWU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nVGZPcGVyYXRvckVycm9yO1xufShFcnJvcikpO1xuZXhwb3J0IHsgTWlzc2luZ1RmT3BlcmF0b3JFcnJvciB9O1xudmFyIE51bWJlclBhcnNpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTnVtYmVyUGFyc2luZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE51bWJlclBhcnNpbmdFcnJvcihwb3MsIHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBwYXJzZSBudW1iZXIgXCIgK1xuICAgICAgICAgICAgKFwiKGxpbmU6XCIgKyBwb3MubGluZSArIFwiIGNvbDpcIiArIHBvcy5jb2x1bW4gKyBcIiBvZmZzZXQ9XCIgKyBwb3Mub2Zmc2V0ICsgXCIpOiBcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIlwiKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE51bWJlclBhcnNpbmdFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IE51bWJlclBhcnNpbmdFcnJvciB9O1xudmFyIFBERlBhcnNpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUGFyc2luZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlBhcnNpbmdFcnJvcihwb3MsIGRldGFpbHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIHBhcnNlIFBERiBkb2N1bWVudCBcIiArXG4gICAgICAgICAgICAoXCIobGluZTpcIiArIHBvcy5saW5lICsgXCIgY29sOlwiICsgcG9zLmNvbHVtbiArIFwiIG9mZnNldD1cIiArIHBvcy5vZmZzZXQgKyBcIik6IFwiICsgZGV0YWlscyk7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQREZQYXJzaW5nRXJyb3I7XG59KEVycm9yKSk7XG5leHBvcnQgeyBQREZQYXJzaW5nRXJyb3IgfTtcbnZhciBOZXh0Qnl0ZUFzc2VydGlvbkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOZXh0Qnl0ZUFzc2VydGlvbkVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5leHRCeXRlQXNzZXJ0aW9uRXJyb3IocG9zLCBleHBlY3RlZEJ5dGUsIGFjdHVhbEJ5dGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRXhwZWN0ZWQgbmV4dCBieXRlIHRvIGJlIFwiICsgZXhwZWN0ZWRCeXRlICsgXCIgYnV0IGl0IHdhcyBhY3R1YWxseSBcIiArIGFjdHVhbEJ5dGU7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIE5leHRCeXRlQXNzZXJ0aW9uRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgTmV4dEJ5dGVBc3NlcnRpb25FcnJvciB9O1xudmFyIFBERk9iamVjdFBhcnNpbmdFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGT2JqZWN0UGFyc2luZ0Vycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk9iamVjdFBhcnNpbmdFcnJvcihwb3MsIGJ5dGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIHBhcnNlIFBERiBvYmplY3Qgc3RhcnRpbmcgd2l0aCB0aGUgZm9sbG93aW5nIGJ5dGU6IFwiICsgYnl0ZTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gUERGT2JqZWN0UGFyc2luZ0Vycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IFBERk9iamVjdFBhcnNpbmdFcnJvciB9O1xudmFyIFBERkludmFsaWRPYmplY3RQYXJzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkludmFsaWRPYmplY3RQYXJzaW5nRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGSW52YWxpZE9iamVjdFBhcnNpbmdFcnJvcihwb3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRmFpbGVkIHRvIHBhcnNlIGludmFsaWQgUERGIG9iamVjdFwiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IFBERkludmFsaWRPYmplY3RQYXJzaW5nRXJyb3IgfTtcbnZhciBQREZTdHJlYW1QYXJzaW5nRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlN0cmVhbVBhcnNpbmdFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZTdHJlYW1QYXJzaW5nRXJyb3IocG9zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBwYXJzZSBQREYgc3RyZWFtXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFBERlN0cmVhbVBhcnNpbmdFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBQREZTdHJlYW1QYXJzaW5nRXJyb3IgfTtcbnZhciBVbmJhbGFuY2VkUGFyZW50aGVzaXNFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVW5iYWxhbmNlZFBhcmVudGhlc2lzRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVW5iYWxhbmNlZFBhcmVudGhlc2lzRXJyb3IocG9zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIkZhaWxlZCB0byBwYXJzZSBQREYgbGl0ZXJhbCBzdHJpbmcgZHVlIHRvIHVuYmFsYW5jZWQgcGFyZW50aGVzaXNcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVW5iYWxhbmNlZFBhcmVudGhlc2lzRXJyb3I7XG59KFBERlBhcnNpbmdFcnJvcikpO1xuZXhwb3J0IHsgVW5iYWxhbmNlZFBhcmVudGhlc2lzRXJyb3IgfTtcbnZhciBTdGFsbGVkUGFyc2VyRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFN0YWxsZWRQYXJzZXJFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTdGFsbGVkUGFyc2VyRXJyb3IocG9zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIlBhcnNlciBzdGFsbGVkXCI7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcG9zLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFN0YWxsZWRQYXJzZXJFcnJvcjtcbn0oUERGUGFyc2luZ0Vycm9yKSk7XG5leHBvcnQgeyBTdGFsbGVkUGFyc2VyRXJyb3IgfTtcbnZhciBNaXNzaW5nUERGSGVhZGVyRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdQREZIZWFkZXJFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNaXNzaW5nUERGSGVhZGVyRXJyb3IocG9zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtc2cgPSBcIk5vIFBERiBoZWFkZXIgZm91bmRcIjtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwb3MsIG1zZykgfHwgdGhpcztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gTWlzc2luZ1BERkhlYWRlckVycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdQREZIZWFkZXJFcnJvciB9O1xudmFyIE1pc3NpbmdLZXl3b3JkRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1pc3NpbmdLZXl3b3JkRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWlzc2luZ0tleXdvcmRFcnJvcihwb3MsIGtleXdvcmQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1zZyA9IFwiRGlkIG5vdCBmaW5kIGV4cGVjdGVkIGtleXdvcmQgJ1wiICsgYXJyYXlBc1N0cmluZyhrZXl3b3JkKSArIFwiJ1wiO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBvcywgbXNnKSB8fCB0aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBNaXNzaW5nS2V5d29yZEVycm9yO1xufShQREZQYXJzaW5nRXJyb3IpKTtcbmV4cG9ydCB7IE1pc3NpbmdLZXl3b3JkRXJyb3IgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9ycy5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9lcnJvcnNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2hhckNvZGVzIH0gZnJvbSBcIi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZDb250ZXh0IH0gZnJvbSBcIi4vUERGQ29udGV4dFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPYmplY3RDb3BpZXIgfSBmcm9tIFwiLi9QREZPYmplY3RDb3BpZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGV3JpdGVyIH0gZnJvbSBcIi4vd3JpdGVycy9QREZXcml0ZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGU3RyZWFtV3JpdGVyIH0gZnJvbSBcIi4vd3JpdGVycy9QREZTdHJlYW1Xcml0ZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGSGVhZGVyIH0gZnJvbSBcIi4vZG9jdW1lbnQvUERGSGVhZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlRyYWlsZXIgfSBmcm9tIFwiLi9kb2N1bWVudC9QREZUcmFpbGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlRyYWlsZXJEaWN0IH0gZnJvbSBcIi4vZG9jdW1lbnQvUERGVHJhaWxlckRpY3RcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQ3Jvc3NSZWZTZWN0aW9uIH0gZnJvbSBcIi4vZG9jdW1lbnQvUERGQ3Jvc3NSZWZTZWN0aW9uXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFN0YW5kYXJkRm9udEVtYmVkZGVyIH0gZnJvbSBcIi4vZW1iZWRkZXJzL1N0YW5kYXJkRm9udEVtYmVkZGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEN1c3RvbUZvbnRFbWJlZGRlciB9IGZyb20gXCIuL2VtYmVkZGVycy9DdXN0b21Gb250RW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3VzdG9tRm9udFN1YnNldEVtYmVkZGVyIH0gZnJvbSBcIi4vZW1iZWRkZXJzL0N1c3RvbUZvbnRTdWJzZXRFbWJlZGRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGaWxlRW1iZWRkZXIsIEFGUmVsYXRpb25zaGlwLCB9IGZyb20gXCIuL2VtYmVkZGVycy9GaWxlRW1iZWRkZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSnBlZ0VtYmVkZGVyIH0gZnJvbSBcIi4vZW1iZWRkZXJzL0pwZWdFbWJlZGRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQbmdFbWJlZGRlciB9IGZyb20gXCIuL2VtYmVkZGVycy9QbmdFbWJlZGRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZQYWdlRW1iZWRkZXIsIH0gZnJvbSBcIi4vZW1iZWRkZXJzL1BERlBhZ2VFbWJlZGRlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBWaWV3ZXJQcmVmZXJlbmNlcywgTm9uRnVsbFNjcmVlblBhZ2VNb2RlLCBSZWFkaW5nRGlyZWN0aW9uLCBQcmludFNjYWxpbmcsIER1cGxleCwgfSBmcm9tIFwiLi9pbnRlcmFjdGl2ZS9WaWV3ZXJQcmVmZXJlbmNlc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZPYmplY3QgfSBmcm9tIFwiLi9vYmplY3RzL1BERk9iamVjdFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZCb29sIH0gZnJvbSBcIi4vb2JqZWN0cy9QREZCb29sXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk51bWJlciB9IGZyb20gXCIuL29iamVjdHMvUERGTnVtYmVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlN0cmluZyB9IGZyb20gXCIuL29iamVjdHMvUERGU3RyaW5nXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkhleFN0cmluZyB9IGZyb20gXCIuL29iamVjdHMvUERGSGV4U3RyaW5nXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk5hbWUgfSBmcm9tIFwiLi9vYmplY3RzL1BERk5hbWVcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGTnVsbCB9IGZyb20gXCIuL29iamVjdHMvUERGTnVsbFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZBcnJheSB9IGZyb20gXCIuL29iamVjdHMvUERGQXJyYXlcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGRGljdCB9IGZyb20gXCIuL29iamVjdHMvUERGRGljdFwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZSZWYgfSBmcm9tIFwiLi9vYmplY3RzL1BERlJlZlwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZJbnZhbGlkT2JqZWN0IH0gZnJvbSBcIi4vb2JqZWN0cy9QREZJbnZhbGlkT2JqZWN0XCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlN0cmVhbSB9IGZyb20gXCIuL29iamVjdHMvUERGU3RyZWFtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlJhd1N0cmVhbSB9IGZyb20gXCIuL29iamVjdHMvUERGUmF3U3RyZWFtXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERkNhdGFsb2cgfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERkNhdGFsb2dcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGQ29udGVudFN0cmVhbSB9IGZyb20gXCIuL3N0cnVjdHVyZXMvUERGQ29udGVudFN0cmVhbVwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZDcm9zc1JlZlN0cmVhbSB9IGZyb20gXCIuL3N0cnVjdHVyZXMvUERGQ3Jvc3NSZWZTdHJlYW1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT2JqZWN0U3RyZWFtIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZPYmplY3RTdHJlYW1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGUGFnZVRyZWUgfSBmcm9tIFwiLi9zdHJ1Y3R1cmVzL1BERlBhZ2VUcmVlXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlBhZ2VMZWFmIH0gZnJvbSBcIi4vc3RydWN0dXJlcy9QREZQYWdlTGVhZlwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZGbGF0ZVN0cmVhbSB9IGZyb20gXCIuL3N0cnVjdHVyZXMvUERGRmxhdGVTdHJlYW1cIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT3BlcmF0b3IgfSBmcm9tIFwiLi9vcGVyYXRvcnMvUERGT3BlcmF0b3JcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT3BlcmF0b3JOYW1lcyB9IGZyb20gXCIuL29wZXJhdG9ycy9QREZPcGVyYXRvck5hbWVzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERk9iamVjdFBhcnNlciB9IGZyb20gXCIuL3BhcnNlci9QREZPYmplY3RQYXJzZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUERGT2JqZWN0U3RyZWFtUGFyc2VyIH0gZnJvbSBcIi4vcGFyc2VyL1BERk9iamVjdFN0cmVhbVBhcnNlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQREZQYXJzZXIgfSBmcm9tIFwiLi9wYXJzZXIvUERGUGFyc2VyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBERlhSZWZTdHJlYW1QYXJzZXIgfSBmcm9tIFwiLi9wYXJzZXIvUERGWFJlZlN0cmVhbVBhcnNlclwiO1xuZXhwb3J0IHsgZGVjb2RlUERGUmF3U3RyZWFtIH0gZnJvbSBcIi4vc3RyZWFtcy9kZWNvZGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Fubm90YXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Fjcm9mb3JtXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZCb29sIGZyb20gXCIuLi9vYmplY3RzL1BERkJvb2xcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgeyBhc3NlcnRFYWNoSXMsIGFzc2VydEludGVnZXIsIGFzc2VydElzT25lT2YsIGFzc2VydFJhbmdlLCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIGFzRW51bSA9IGZ1bmN0aW9uIChyYXdWYWx1ZSwgZW51bVR5cGUpIHtcbiAgICBpZiAocmF3VmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gZW51bVR5cGVbcmF3VmFsdWVdO1xufTtcbmV4cG9ydCB2YXIgTm9uRnVsbFNjcmVlblBhZ2VNb2RlO1xuKGZ1bmN0aW9uIChOb25GdWxsU2NyZWVuUGFnZU1vZGUpIHtcbiAgICAvKipcbiAgICAgKiBBZnRlciBleGl0aW5nIEZ1bGxTY3JlZW4gbW9kZSwgbmVpdGhlciB0aGUgZG9jdW1lbnQgb3V0bGluZSBub3IgdGh1bWJuYWlsXG4gICAgICogaW1hZ2VzIHNob3VsZCBiZSB2aXNpYmxlLlxuICAgICAqL1xuICAgIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZVtcIlVzZU5vbmVcIl0gPSBcIlVzZU5vbmVcIjtcbiAgICAvKiogQWZ0ZXIgZXhpdGluZyBGdWxsU2NyZWVuIG1vZGUsIHRoZSBkb2N1bWVudCBvdXRsaW5lIHNob3VsZCBiZSB2aXNpYmxlLiAqL1xuICAgIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZVtcIlVzZU91dGxpbmVzXCJdID0gXCJVc2VPdXRsaW5lc1wiO1xuICAgIC8qKiBBZnRlciBleGl0aW5nIEZ1bGxTY3JlZW4gbW9kZSwgdGh1bWJuYWlsIGltYWdlcyBzaG91bGQgYmUgdmlzaWJsZS4gKi9cbiAgICBOb25GdWxsU2NyZWVuUGFnZU1vZGVbXCJVc2VUaHVtYnNcIl0gPSBcIlVzZVRodW1ic1wiO1xuICAgIC8qKlxuICAgICAqIEFmdGVyIGV4aXRpbmcgRnVsbFNjcmVlbiBtb2RlLCB0aGUgb3B0aW9uYWwgY29udGVudCBncm91cCBwYW5lbCBzaG91bGQgYmVcbiAgICAgKiB2aXNpYmxlLlxuICAgICAqL1xuICAgIE5vbkZ1bGxTY3JlZW5QYWdlTW9kZVtcIlVzZU9DXCJdID0gXCJVc2VPQ1wiO1xufSkoTm9uRnVsbFNjcmVlblBhZ2VNb2RlIHx8IChOb25GdWxsU2NyZWVuUGFnZU1vZGUgPSB7fSkpO1xuZXhwb3J0IHZhciBSZWFkaW5nRGlyZWN0aW9uO1xuKGZ1bmN0aW9uIChSZWFkaW5nRGlyZWN0aW9uKSB7XG4gICAgLyoqIFRoZSBwcmVkb21pbmFudCByZWFkaW5nIG9yZGVyIGlzIExlZnQgdG8gUmlnaHQuICovXG4gICAgUmVhZGluZ0RpcmVjdGlvbltcIkwyUlwiXSA9IFwiTDJSXCI7XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRvbWluYW50IHJlYWRpbmcgb3JkZXIgaXMgUmlnaHQgdG8gbGVmdCAoaW5jbHVkaW5nIHZlcnRpY2FsIHdyaXRpbmdcbiAgICAgKiBzeXN0ZW1zLCBzdWNoIGFzIENoaW5lc2UsIEphcGFuZXNlIGFuZCBLb3JlYW4pLlxuICAgICAqL1xuICAgIFJlYWRpbmdEaXJlY3Rpb25bXCJSMkxcIl0gPSBcIlIyTFwiO1xufSkoUmVhZGluZ0RpcmVjdGlvbiB8fCAoUmVhZGluZ0RpcmVjdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIFByaW50U2NhbGluZztcbihmdW5jdGlvbiAoUHJpbnRTY2FsaW5nKSB7XG4gICAgLyoqIE5vIHBhZ2Ugc2NhbGluZy4gKi9cbiAgICBQcmludFNjYWxpbmdbXCJOb25lXCJdID0gXCJOb25lXCI7XG4gICAgLyogVXNlIHRoZSBQREYgcmVhZGVyJ3MgZGVmYXVsdCBwcmludCBzY2FsaW5nLiAqL1xuICAgIFByaW50U2NhbGluZ1tcIkFwcERlZmF1bHRcIl0gPSBcIkFwcERlZmF1bHRcIjtcbn0pKFByaW50U2NhbGluZyB8fCAoUHJpbnRTY2FsaW5nID0ge30pKTtcbmV4cG9ydCB2YXIgRHVwbGV4O1xuKGZ1bmN0aW9uIChEdXBsZXgpIHtcbiAgICAvKiogVGhlIFBERiByZWFkZXIgc2hvdWxkIHByaW50IHNpbmdsZS1zaWRlZC4gKi9cbiAgICBEdXBsZXhbXCJTaW1wbGV4XCJdID0gXCJTaW1wbGV4XCI7XG4gICAgLyoqXG4gICAgICogVGhlIFBERiByZWFkZXIgc2hvdWxkIHByaW50IGRvdWJsZSBzaWRlZCBhbmQgZmxpcCBvbiB0aGUgc2hvcnQgZWRnZSBvZiB0aGVcbiAgICAgKiBzaGVldC5cbiAgICAgKi9cbiAgICBEdXBsZXhbXCJEdXBsZXhGbGlwU2hvcnRFZGdlXCJdID0gXCJEdXBsZXhGbGlwU2hvcnRFZGdlXCI7XG4gICAgLyoqXG4gICAgICogVGhlIFBERiByZWFkZXIgc2hvdWxkIHByaW50IGRvdWJsZSBzaWRlZCBhbmQgZmxpcCBvbiB0aGUgbG9uZyBlZGdlIG9mIHRoZVxuICAgICAqIHNoZWV0LlxuICAgICAqL1xuICAgIER1cGxleFtcIkR1cGxleEZsaXBMb25nRWRnZVwiXSA9IFwiRHVwbGV4RmxpcExvbmdFZGdlXCI7XG59KShEdXBsZXggfHwgKER1cGxleCA9IHt9KSk7XG52YXIgVmlld2VyUHJlZmVyZW5jZXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBmdW5jdGlvbiBWaWV3ZXJQcmVmZXJlbmNlcyhkaWN0KSB7XG4gICAgICAgIHRoaXMuZGljdCA9IGRpY3Q7XG4gICAgfVxuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5sb29rdXBCb29sID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgcmV0dXJuT2JqID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKGtleSkpO1xuICAgICAgICBpZiAocmV0dXJuT2JqIGluc3RhbmNlb2YgUERGQm9vbClcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUubG9va3VwTmFtZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHJldHVybk9iaiA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZihrZXkpKTtcbiAgICAgICAgaWYgKHJldHVybk9iaiBpbnN0YW5jZW9mIFBERk5hbWUpXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuT2JqO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuSGlkZVRvb2xiYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJvb2woJ0hpZGVUb29sYmFyJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5IaWRlTWVudWJhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQm9vbCgnSGlkZU1lbnViYXInKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkhpZGVXaW5kb3dVSSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQm9vbCgnSGlkZVdpbmRvd1VJJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5GaXRXaW5kb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJvb2woJ0ZpdFdpbmRvdycpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuQ2VudGVyV2luZG93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBCb29sKCdDZW50ZXJXaW5kb3cnKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLkRpc3BsYXlEb2NUaXRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwQm9vbCgnRGlzcGxheURvY1RpdGxlJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5Ob25GdWxsU2NyZWVuUGFnZU1vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE5hbWUoJ05vbkZ1bGxTY3JlZW5QYWdlTW9kZScpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuRGlyZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBOYW1lKCdEaXJlY3Rpb24nKTtcbiAgICB9O1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLlByaW50U2NhbGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwTmFtZSgnUHJpbnRTY2FsaW5nJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5EdXBsZXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE5hbWUoJ0R1cGxleCcpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuUGlja1RyYXlCeVBERlNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cEJvb2woJ1BpY2tUcmF5QnlQREZTaXplJyk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5QcmludFBhZ2VSYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFByaW50UGFnZVJhbmdlID0gdGhpcy5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdQcmludFBhZ2VSYW5nZScpKTtcbiAgICAgICAgaWYgKFByaW50UGFnZVJhbmdlIGluc3RhbmNlb2YgUERGQXJyYXkpXG4gICAgICAgICAgICByZXR1cm4gUHJpbnRQYWdlUmFuZ2U7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5OdW1Db3BpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBOdW1Db3BpZXMgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ051bUNvcGllcycpKTtcbiAgICAgICAgaWYgKE51bUNvcGllcyBpbnN0YW5jZW9mIFBERk51bWJlcilcbiAgICAgICAgICAgIHJldHVybiBOdW1Db3BpZXM7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBQREYgcmVhZGVycyBzaG91bGQgaGlkZSB0aGUgdG9vbGJhciBtZW51cyB3aGVuIGRpc3BsYXlpbmdcbiAgICAgKiB0aGlzIGRvY3VtZW50LlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRvb2xiYXJzIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldEhpZGVUb29sYmFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5IaWRlVG9vbGJhcigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNCb29sZWFuKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgUERGIHJlYWRlcnMgc2hvdWxkIGhpZGUgdGhlIG1lbnUgYmFyIHdoZW4gZGlzcGxheWluZyB0aGlzXG4gICAgICogZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIG1lbnUgYmFyIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldEhpZGVNZW51YmFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5IaWRlTWVudWJhcigpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNCb29sZWFuKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgUERGIHJlYWRlcnMgc2hvdWxkIGhpZGUgdGhlIHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzIGluXG4gICAgICogdGhlIGRvY3VtZW50J3Mgd2luZG93IChzdWNoIGFzIHNjcm9sbCBiYXJzIGFuZCBuYXZpZ2F0aW9uIGNvbnRyb2xzKSxcbiAgICAgKiBsZWF2aW5nIG9ubHkgdGhlIGRvY3VtZW50J3MgY29udGVudHMgZGlzcGxheWVkLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldEhpZGVXaW5kb3dVSSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuSGlkZVdpbmRvd1VJKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc0Jvb2xlYW4oKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBQREYgcmVhZGVycyBzaG91bGQgcmVzaXplIHRoZSBkb2N1bWVudCdzIHdpbmRvdyB0byBmaXRcbiAgICAgKiB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgZGlzcGxheWVkIHBhZ2UuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIHdpbmRvdyBzaG91bGQgYmUgcmVzaXplZCB0byBmaXQuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldEZpdFdpbmRvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuRml0V2luZG93KCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc0Jvb2xlYW4oKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBQREYgcmVhZGVycyBzaG91bGQgcG9zaXRpb24gdGhlIGRvY3VtZW50J3Mgd2luZG93IGluIHRoZVxuICAgICAqIGNlbnRlciBvZiB0aGUgc2NyZWVuLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRvIGNlbnRlciB0aGUgZG9jdW1lbnQgd2luZG93LlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRDZW50ZXJXaW5kb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSB0aGlzLkNlbnRlcldpbmRvdygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXNCb29sZWFuKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHdpbmRvdydzIHRpdGxlIGJhciBzaG91bGQgZGlzcGxheSB0aGUgZG9jdW1lbnRcbiAgICAgKiBgVGl0bGVgLCB0YWtlbiBmcm9tIHRoZSBkb2N1bWVudCBtZXRhZGF0YSAoc2VlIFtbUERGRG9jdW1lbnQuZ2V0VGl0bGVdXSkuXG4gICAgICogUmV0dXJucyBgZmFsc2VgIGlmIHRoZSB0aXRsZSBiYXIgc2hvdWxkIGluc3RlYWQgZGlzcGxheSB0aGUgZmlsZW5hbWUgb2YgdGhlXG4gICAgICogUERGIGZpbGUuXG4gICAgICogQHJldHVybnMgV2hldGhlciB0byBkaXNwbGF5IHRoZSBkb2N1bWVudCB0aXRsZS5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0RGlzcGxheURvY1RpdGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5EaXNwbGF5RG9jVGl0bGUoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzQm9vbGVhbigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBhZ2UgbW9kZSwgd2hpY2ggdGVsbHMgdGhlIFBERiByZWFkZXIgaG93IHRvIGRpc3BsYXkgdGhlXG4gICAgICogZG9jdW1lbnQgYWZ0ZXIgZXhpdGluZyBmdWxsLXNjcmVlbiBtb2RlLlxuICAgICAqIEByZXR1cm5zIFRoZSBwYWdlIG1vZGUgYWZ0ZXIgZXhpdGluZyBmdWxsLXNjcmVlbiBtb2RlLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXROb25GdWxsU2NyZWVuUGFnZU1vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHZhciBtb2RlID0gKF9hID0gdGhpcy5Ob25GdWxsU2NyZWVuUGFnZU1vZGUoKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY29kZVRleHQoKTtcbiAgICAgICAgcmV0dXJuIChfYiA9IGFzRW51bShtb2RlLCBOb25GdWxsU2NyZWVuUGFnZU1vZGUpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBOb25GdWxsU2NyZWVuUGFnZU1vZGUuVXNlTm9uZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHByZWRvbWluYW50IHJlYWRpbmcgb3JkZXIgZm9yIHRleHQuXG4gICAgICogQHJldHVybnMgVGhlIHRleHQgcmVhZGluZyBvcmRlci5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuZ2V0UmVhZGluZ0RpcmVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IChfYSA9IHRoaXMuRGlyZWN0aW9uKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIHJldHVybiAoX2IgPSBhc0VudW0oZGlyZWN0aW9uLCBSZWFkaW5nRGlyZWN0aW9uKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogUmVhZGluZ0RpcmVjdGlvbi5MMlI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwYWdlIHNjYWxpbmcgb3B0aW9uIHRoYXQgdGhlIFBERiByZWFkZXIgc2hvdWxkIHNlbGVjdCB3aGVuIHRoZVxuICAgICAqIHByaW50IGRpYWxvZyBpcyBkaXNwbGF5ZWQuXG4gICAgICogQHJldHVybnMgVGhlIHBhZ2Ugc2NhbGluZyBvcHRpb24uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldFByaW50U2NhbGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgdmFyIHNjYWxpbmcgPSAoX2EgPSB0aGlzLlByaW50U2NhbGluZygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjb2RlVGV4dCgpO1xuICAgICAgICByZXR1cm4gKF9iID0gYXNFbnVtKHNjYWxpbmcsIFByaW50U2NhbGluZykpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFByaW50U2NhbGluZy5BcHBEZWZhdWx0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGFwZXIgaGFuZGxpbmcgb3B0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBwcmludGluZyB0aGVcbiAgICAgKiBmaWxlIGZyb20gdGhlIHByaW50IGRpYWxvZy5cbiAgICAgKiBAcmV0dXJucyBUaGUgcGFwZXIgaGFuZGxpbmcgb3B0aW9uLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXREdXBsZXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGR1cGxleCA9IChfYSA9IHRoaXMuRHVwbGV4KCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWNvZGVUZXh0KCk7XG4gICAgICAgIHJldHVybiBhc0VudW0oZHVwbGV4LCBEdXBsZXgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIFBERiBwYWdlIHNpemUgc2hvdWxkIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBpbnB1dFxuICAgICAqIHBhcGVyIHRyYXkuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIFBERiBwYWdlIHNpemUgc2hvdWxkIGJlIHVzZWQgdG8gc2VsZWN0IHRoZVxuICAgICAqICAgICAgICAgIGlucHV0IHBhcGVyIHRyYXkuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldFBpY2tUcmF5QnlQREZTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLlBpY2tUcmF5QnlQREZTaXplKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc0Jvb2xlYW4oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGFnZSBudW1iZXIgcmFuZ2VzLCB3aGljaCBhcmUgdGhlIHZhbHVlcyB1c2VkIHRvXG4gICAgICogaW5pdGlhbGl6ZSB0aGUgcHJpbnQgZGlhbG9nIGJveCB3aGVuIHRoZSBmaWxlIGlzIHByaW50ZWQuIEVhY2ggcmFuZ2VcbiAgICAgKiBzcGVjaWZpZXMgdGhlIGZpcnN0IChgc3RhcnRgKSBhbmQgbGFzdCAoYGVuZGApIHBhZ2VzIGluIGEgc3ViLXJhbmdlIG9mXG4gICAgICogcGFnZXMgdG8gYmUgcHJpbnRlZC4gVGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIFBERiBmaWxlIGlzIGRlbm90ZWQgYnkgMC5cbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IHZpZXdlclByZWZzID0gcGRmRG9jLmNhdGFsb2cuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcygpXG4gICAgICogY29uc3QgaW5jbHVkZXNQYWdlMyA9IHZpZXdlclByZWZzXG4gICAgICogICAuZ2V0UHJpbnRSYW5nZXMoKVxuICAgICAqICAgLnNvbWUocHIgPT4gcHIuc3RhcnQgPTwgMiAmJiBwci5lbmQgPj0gMilcbiAgICAgKiBpZiAoaW5jbHVkZXNQYWdlMykgY29uc29sZS5sb2coJ3ByaW50UmFuZ2UgaW5jbHVkZXMgcGFnZSAzJylcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBvYmplY3RzLCBlYWNoIHdpdGggdGhlIHByb3BlcnRpZXMgYHN0YXJ0YCBhbmQgYGVuZGAsXG4gICAgICogICAgICAgICAgZGVub3RpbmcgcGFnZSBpbmRpY2VzLiBJZiBub3QsIHNwZWNpZmllZCBhbiBlbXB0eSBhcnJheSBpc1xuICAgICAqICAgICAgICAgIHJldHVybmVkLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5nZXRQcmludFBhZ2VSYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJuZyA9IHRoaXMuUHJpbnRQYWdlUmFuZ2UoKTtcbiAgICAgICAgaWYgKCFybmcpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIHZhciBwYWdlUmFuZ2VzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm5nLnNpemUoKTsgaSArPSAyKSB7XG4gICAgICAgICAgICAvLyBEZXNwaXRlIHRoZSBzcGVjIGNsZWFybHkgc3RhdGluZyB0aGF0IFwiVGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIFBERiBmaWxlXG4gICAgICAgICAgICAvLyBzaGFsbCBiZSBkb25vdGVkIGJ5IDFcIiwgc2V2ZXJhbCB0ZXN0IFBERnMgKHNwZWMgMS43KSBjcmVhdGVkIGluXG4gICAgICAgICAgICAvLyBBY3JvYmF0IFhJIDExLjAgYW5kIGFsc28gcmVhZCB3aXRoIFJlYWRlciBEQyAyMDIwLjAxMyBpbmRpY2F0ZSB0aGlzIGlzXG4gICAgICAgICAgICAvLyBhY3R1YWxseSBhIDAgYmFzZWQgaW5kZXguXG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBybmcubG9va3VwKGksIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBybmcubG9va3VwKGkgKyAxLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICBwYWdlUmFuZ2VzLnB1c2goeyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWdlUmFuZ2VzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvcGllcyB0byBiZSBwcmludGVkIHdoZW4gdGhlIHByaW50IGRpYWxvZyBpcyBvcGVuZWRcbiAgICAgKiBmb3IgdGhpcyBkb2N1bWVudC5cbiAgICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBudW1iZXIgb2YgY29waWVzIHRvIGJlIHByaW50ZWQuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLmdldE51bUNvcGllcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IHRoaXMuTnVtQ29waWVzKCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hc051bWJlcigpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAxO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHdoZXRoZXIgdGhlIFBERiByZWFkZXIncyB0b29sYmFycyBzaG91bGQgYmUgaGlkZGVuIHdoaWxlIHRoZVxuICAgICAqIGRvY3VtZW50IGlzIGFjdGl2ZS5cbiAgICAgKiBAcGFyYW0gaGlkZVRvb2xiYXIgYHRydWVgIGlmIHRoZSB0b29sYmFyIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldEhpZGVUb29sYmFyID0gZnVuY3Rpb24gKGhpZGVUb29sYmFyKSB7XG4gICAgICAgIHZhciBIaWRlVG9vbGJhciA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihoaWRlVG9vbGJhcik7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignSGlkZVRvb2xiYXInKSwgSGlkZVRvb2xiYXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHdoZXRoZXIgdGhlIFBERiByZWFkZXIncyBtZW51IGJhciBzaG91bGQgYmUgaGlkZGVuIHdoaWxlIHRoZVxuICAgICAqIGRvY3VtZW50IGlzIGFjdGl2ZS5cbiAgICAgKiBAcGFyYW0gaGlkZU1lbnViYXIgYHRydWVgIGlmIHRoZSBtZW51IGJhciBzaG91bGQgYmUgaGlkZGVuLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRIaWRlTWVudWJhciA9IGZ1bmN0aW9uIChoaWRlTWVudWJhcikge1xuICAgICAgICB2YXIgSGlkZU1lbnViYXIgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooaGlkZU1lbnViYXIpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0hpZGVNZW51YmFyJyksIEhpZGVNZW51YmFyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB3aGV0aGVyIHRoZSBQREYgcmVhZGVyIHNob3VsZCBoaWRlIHVzZXIgaW50ZXJmYWNlIGVsZW1lbnRzIGluIHRoZVxuICAgICAqIGRvY3VtZW50J3Mgd2luZG93IChzdWNoIGFzIHNjcm9sbCBiYXJzIGFuZCBuYXZpZ2F0aW9uIGNvbnRyb2xzKSwgbGVhdmluZ1xuICAgICAqIG9ubHkgdGhlIGRvY3VtZW50J3MgY29udGVudHMgZGlzcGxheWVkLlxuICAgICAqIEBwYXJhbSBoaWRlV2luZG93VUkgYHRydWVgIGlmIHRoZSB1c2VyIGludGVyZmFjZSBlbGVtZW50cyBzaG91bGQgYmUgaGlkZGVuLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRIaWRlV2luZG93VUkgPSBmdW5jdGlvbiAoaGlkZVdpbmRvd1VJKSB7XG4gICAgICAgIHZhciBIaWRlV2luZG93VUkgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooaGlkZVdpbmRvd1VJKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdIaWRlV2luZG93VUknKSwgSGlkZVdpbmRvd1VJKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB3aGV0aGVyIHRoZSBQREYgcmVhZGVyIHNob3VsZCByZXNpemUgdGhlIGRvY3VtZW50J3Mgd2luZG93IHRvIGZpdFxuICAgICAqIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBkaXNwbGF5ZWQgcGFnZS5cbiAgICAgKiBAcGFyYW0gZml0V2luZG93IGB0cnVlYCBpZiB0aGUgd2luZG93IHNob3VsZCBiZSByZXNpemVkLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRGaXRXaW5kb3cgPSBmdW5jdGlvbiAoZml0V2luZG93KSB7XG4gICAgICAgIHZhciBGaXRXaW5kb3cgPSB0aGlzLmRpY3QuY29udGV4dC5vYmooZml0V2luZG93KTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdGaXRXaW5kb3cnKSwgRml0V2luZG93KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB3aGV0aGVyIHRoZSBQREYgcmVhZGVyIHNob3VsZCBwb3NpdGlvbiB0aGUgZG9jdW1lbnQncyB3aW5kb3cgaW4gdGhlXG4gICAgICogY2VudGVyIG9mIHRoZSBzY3JlZW4uXG4gICAgICogQHBhcmFtIGNlbnRlcldpbmRvdyBgdHJ1ZWAgaWYgdGhlIHdpbmRvdyBzaG91bGQgYmUgY2VudGVyZWQuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldENlbnRlcldpbmRvdyA9IGZ1bmN0aW9uIChjZW50ZXJXaW5kb3cpIHtcbiAgICAgICAgdmFyIENlbnRlcldpbmRvdyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihjZW50ZXJXaW5kb3cpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0NlbnRlcldpbmRvdycpLCBDZW50ZXJXaW5kb3cpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHdoZXRoZXIgdGhlIHdpbmRvdydzIHRpdGxlIGJhciBzaG91bGQgZGlzcGxheSB0aGUgZG9jdW1lbnQgYFRpdGxlYFxuICAgICAqIHRha2VuIGZyb20gdGhlIGRvY3VtZW50IG1ldGFkYXRhIChzZWUgW1tQREZEb2N1bWVudC5zZXRUaXRsZV1dKS4gSWZcbiAgICAgKiBgZmFsc2VgLCB0aGUgdGl0bGUgYmFyIHNob3VsZCBpbnN0ZWFkIGRpc3BsYXkgdGhlIFBERiBmaWxlbmFtZS5cbiAgICAgKiBAcGFyYW0gZGlzcGxheVRpdGxlIGB0cnVlYCBpZiB0aGUgZG9jdW1lbnQgdGl0bGUgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0RGlzcGxheURvY1RpdGxlID0gZnVuY3Rpb24gKGRpc3BsYXlUaXRsZSkge1xuICAgICAgICB2YXIgRGlzcGxheURvY1RpdGxlID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGRpc3BsYXlUaXRsZSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignRGlzcGxheURvY1RpdGxlJyksIERpc3BsYXlEb2NUaXRsZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgaG93IHRoZSBQREYgcmVhZGVyIHNob3VsZCBkaXNwbGF5IHRoZSBkb2N1bWVudCB1cG9uIGV4aXRpbmdcbiAgICAgKiBmdWxsLXNjcmVlbiBtb2RlLiBUaGlzIGVudHJ5IGlzIG1lYW5pbmdmdWwgb25seSBpZiB0aGUgdmFsdWUgb2YgdGhlXG4gICAgICogYFBhZ2VNb2RlYCBlbnRyeSBpbiB0aGUgZG9jdW1lbnQncyBbW1BERkNhdGFsb2ddXSBpcyBgRnVsbFNjcmVlbmAuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFBERkRvY3VtZW50LCBOb25GdWxsU2NyZWVuUGFnZU1vZGUsIFBERk5hbWUgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKlxuICAgICAqIC8vIFNldCB0aGUgUGFnZU1vZGVcbiAgICAgKiBwZGZEb2MuY2F0YWxvZy5zZXQoUERGTmFtZS5vZignUGFnZU1vZGUnKSxQREZOYW1lLm9mKCdGdWxsU2NyZWVuJykpXG4gICAgICpcbiAgICAgKiAvLyBTZXQgd2hhdCBoYXBwZW5zIHdoZW4gZnVsbC1zY3JlZW4gaXMgY2xvc2VkXG4gICAgICogY29uc3Qgdmlld2VyUHJlZnMgPSBwZGZEb2MuY2F0YWxvZy5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzKClcbiAgICAgKiB2aWV3ZXJQcmVmcy5zZXROb25GdWxsU2NyZWVuUGFnZU1vZGUoTm9uRnVsbFNjcmVlblBhZ2VNb2RlLlVzZU91dGxpbmVzKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIG5vbkZ1bGxTY3JlZW5QYWdlTW9kZSBIb3cgdGhlIGRvY3VtZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQgdXBvblxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdGluZyBmdWxsIHNjcmVlbiBtb2RlLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXROb25GdWxsU2NyZWVuUGFnZU1vZGUgPSBmdW5jdGlvbiAobm9uRnVsbFNjcmVlblBhZ2VNb2RlKSB7XG4gICAgICAgIGFzc2VydElzT25lT2Yobm9uRnVsbFNjcmVlblBhZ2VNb2RlLCAnbm9uRnVsbFNjcmVlblBhZ2VNb2RlJywgTm9uRnVsbFNjcmVlblBhZ2VNb2RlKTtcbiAgICAgICAgdmFyIG1vZGUgPSBQREZOYW1lLm9mKG5vbkZ1bGxTY3JlZW5QYWdlTW9kZSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignTm9uRnVsbFNjcmVlblBhZ2VNb2RlJyksIG1vZGUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHRoZSBwcmVkb21pbmFudCByZWFkaW5nIG9yZGVyIGZvciB0ZXh0LlxuICAgICAqXG4gICAgICogVGhpcyBlbnRyeSBoYXMgbm8gZGlyZWN0IGVmZmVjdCBvbiB0aGUgZG9jdW1lbnQncyBjb250ZW50cyBvciBwYWdlXG4gICAgICogbnVtYmVyaW5nLCBidXQgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZWxhdGl2ZSBwb3NpdGlvbmluZyBvZiBwYWdlc1xuICAgICAqIHdoZW4gZGlzcGxheWVkIHNpZGUgYnkgc2lkZSBvciBwcmludGVkIG4tdXAuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFBERkRvY3VtZW50LCBSZWFkaW5nRGlyZWN0aW9uIH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3Qgdmlld2VyUHJlZnMgPSBwZGZEb2MuY2F0YWxvZy5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzKClcbiAgICAgKiB2aWV3ZXJQcmVmcy5zZXRSZWFkaW5nRGlyZWN0aW9uKFJlYWRpbmdEaXJlY3Rpb24uUjJMKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHJlYWRpbmdEaXJlY3Rpb24gVGhlIHJlYWRpbmcgb3JkZXIgZm9yIHRleHQuXG4gICAgICovXG4gICAgVmlld2VyUHJlZmVyZW5jZXMucHJvdG90eXBlLnNldFJlYWRpbmdEaXJlY3Rpb24gPSBmdW5jdGlvbiAocmVhZGluZ0RpcmVjdGlvbikge1xuICAgICAgICBhc3NlcnRJc09uZU9mKHJlYWRpbmdEaXJlY3Rpb24sICdyZWFkaW5nRGlyZWN0aW9uJywgUmVhZGluZ0RpcmVjdGlvbik7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBQREZOYW1lLm9mKHJlYWRpbmdEaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ0RpcmVjdGlvbicpLCBkaXJlY3Rpb24pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHRoZSBwYWdlIHNjYWxpbmcgb3B0aW9uIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gYSBwcmludCBkaWFsb2dcbiAgICAgKiBpcyBkaXNwbGF5ZWQgZm9yIHRoaXMgZG9jdW1lbnQuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFBERkRvY3VtZW50LCBQcmludFNjYWxpbmcgfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCB2aWV3ZXJQcmVmcyA9IHBkZkRvYy5jYXRhbG9nLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMoKVxuICAgICAqIHZpZXdlclByZWZzLnNldFByaW50U2NhbGluZyhQcmludFNjYWxpbmcuTm9uZSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcmludFNjYWxpbmcgVGhlIHByaW50IHNjYWxpbmcgb3B0aW9uLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRQcmludFNjYWxpbmcgPSBmdW5jdGlvbiAocHJpbnRTY2FsaW5nKSB7XG4gICAgICAgIGFzc2VydElzT25lT2YocHJpbnRTY2FsaW5nLCAncHJpbnRTY2FsaW5nJywgUHJpbnRTY2FsaW5nKTtcbiAgICAgICAgdmFyIHNjYWxpbmcgPSBQREZOYW1lLm9mKHByaW50U2NhbGluZyk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUHJpbnRTY2FsaW5nJyksIHNjYWxpbmcpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hvb3NlIHRoZSBwYXBlciBoYW5kbGluZyBvcHRpb24gdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdCBpbiB0aGVcbiAgICAgKiBwcmludCBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFBERkRvY3VtZW50LCBEdXBsZXggfSBmcm9tICdwZGYtbGliJ1xuICAgICAqXG4gICAgICogY29uc3QgcGRmRG9jID0gYXdhaXQgUERGRG9jdW1lbnQuY3JlYXRlKClcbiAgICAgKiBjb25zdCB2aWV3ZXJQcmVmcyA9IHBkZkRvYy5jYXRhbG9nLmdldE9yQ3JlYXRlVmlld2VyUHJlZmVyZW5jZXMoKVxuICAgICAqIHZpZXdlclByZWZzLnNldER1cGxleChEdXBsZXguRHVwbGV4RmxpcFNob3J0RWRnZSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkdXBsZXggVGhlIGRvdWJsZSBvciBzaW5nbGUgc2lkZWQgcHJpbnRpbmcgb3B0aW9uLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXREdXBsZXggPSBmdW5jdGlvbiAoZHVwbGV4KSB7XG4gICAgICAgIGFzc2VydElzT25lT2YoZHVwbGV4LCAnZHVwbGV4JywgRHVwbGV4KTtcbiAgICAgICAgdmFyIGR1cCA9IFBERk5hbWUub2YoZHVwbGV4KTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdEdXBsZXgnKSwgZHVwKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENob29zZSB3aGV0aGVyIHRoZSBQREYgZG9jdW1lbnQncyBwYWdlIHNpemUgc2hvdWxkIGJlIHVzZWQgdG8gc2VsZWN0IHRoZVxuICAgICAqIGlucHV0IHBhcGVyIHRyYXkgd2hlbiBwcmludGluZy4gVGhpcyBzZXR0aW5nIGluZmx1ZW5jZXMgb25seSB0aGUgcHJlc2V0XG4gICAgICogdmFsdWVzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHByaW50IGRpYWxvZyBwcmVzZW50ZWQgYnkgYSBQREYgcmVhZGVyLlxuICAgICAqXG4gICAgICogSWYgUGlja1RyYXlCeVBERlNpemUgaXMgdHJ1ZSwgdGhlIGNoZWNrIGJveCBpbiB0aGUgcHJpbnQgZGlhbG9nIGFzc29jaWF0ZWRcbiAgICAgKiB3aXRoIGlucHV0IHBhcGVyIHRyYXkgc2hvdWxkIGJlIGNoZWNrZWQuIFRoaXMgc2V0dGluZyBoYXMgbm8gZWZmZWN0IG9uXG4gICAgICogb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUgYWJpbGl0eSB0byBwaWNrIHRoZSBpbnB1dCB0cmF5XG4gICAgICogYnkgc2l6ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwaWNrVHJheUJ5UERGU2l6ZSBgdHJ1ZWAgaWYgdGhlIGRvY3VtZW50J3MgcGFnZSBzaXplIHNob3VsZCBiZSB1c2VkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlbGVjdCB0aGUgaW5wdXQgcGFwZXIgdHJheS5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0UGlja1RyYXlCeVBERlNpemUgPSBmdW5jdGlvbiAocGlja1RyYXlCeVBERlNpemUpIHtcbiAgICAgICAgdmFyIFBpY2tUcmF5QnlQREZTaXplID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKHBpY2tUcmF5QnlQREZTaXplKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdQaWNrVHJheUJ5UERGU2l6ZScpLCBQaWNrVHJheUJ5UERGU2l6ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgdGhlIHBhZ2UgbnVtYmVycyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHByaW50IGRpYWxvZyBib3ggd2hlbiB0aGVcbiAgICAgKiBmaWxlIGlzIHByaW50ZWQuIFRoZSBmaXJzdCBwYWdlIG9mIHRoZSBQREYgZmlsZSBpcyBkZW5vdGVkIGJ5IDAuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKiBgYGBqc1xuICAgICAqIGltcG9ydCB7IFBERkRvY3VtZW50IH0gZnJvbSAncGRmLWxpYidcbiAgICAgKlxuICAgICAqIGNvbnN0IHBkZkRvYyA9IGF3YWl0IFBERkRvY3VtZW50LmNyZWF0ZSgpXG4gICAgICogY29uc3Qgdmlld2VyUHJlZnMgPSBwZGZEb2MuY2F0YWxvZy5nZXRPckNyZWF0ZVZpZXdlclByZWZlcmVuY2VzKClcbiAgICAgKlxuICAgICAqIC8vIFdlIGNhbiBzZXQgdGhlIGRlZmF1bHQgcHJpbnQgcmFuZ2UgdG8gb25seSB0aGUgZmlyc3QgcGFnZVxuICAgICAqIHZpZXdlclByZWZzLnNldFByaW50UGFnZVJhbmdlKHsgc3RhcnQ6IDAsIGVuZDogMCB9KVxuICAgICAqXG4gICAgICogLy8gT3Igd2UgY2FuIHN1cHBseSBub25jb250aWd1b3VzIHJhbmdlcyAoZS5nLiBwYWdlcyAxLCAzLCBhbmQgNS03KVxuICAgICAqIHZpZXdlclByZWZzLnNldFByaW50UGFnZVJhbmdlKFtcbiAgICAgKiAgIHsgc3RhcnQ6IDAsIGVuZDogMCB9LFxuICAgICAqICAgeyBzdGFydDogMiwgZW5kOiAyIH0sXG4gICAgICogICB7IHN0YXJ0OiA0LCBlbmQ6IDYgfSxcbiAgICAgKiBdKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHByaW50UGFnZVJhbmdlIEFuIG9iamVjdCBvciBhcnJheSBvZiBvYmplY3RzLCBlYWNoIHdpdGggdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgYHN0YXJ0YCBhbmQgYGVuZGAsIGRlbm90aW5nIGEgcmFuZ2Ugb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBpbmRpY2VzLlxuICAgICAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLnByb3RvdHlwZS5zZXRQcmludFBhZ2VSYW5nZSA9IGZ1bmN0aW9uIChwcmludFBhZ2VSYW5nZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJpbnRQYWdlUmFuZ2UpKVxuICAgICAgICAgICAgcHJpbnRQYWdlUmFuZ2UgPSBbcHJpbnRQYWdlUmFuZ2VdO1xuICAgICAgICB2YXIgZmxhdFJhbmdlID0gW107XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHByaW50UGFnZVJhbmdlLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgZmxhdFJhbmdlLnB1c2gocHJpbnRQYWdlUmFuZ2VbaWR4XS5zdGFydCk7XG4gICAgICAgICAgICBmbGF0UmFuZ2UucHVzaChwcmludFBhZ2VSYW5nZVtpZHhdLmVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0RWFjaElzKGZsYXRSYW5nZSwgJ3ByaW50UGFnZVJhbmdlJywgWydudW1iZXInXSk7XG4gICAgICAgIHZhciBwYWdlUmFuZ2VzID0gdGhpcy5kaWN0LmNvbnRleHQub2JqKGZsYXRSYW5nZSk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5vZignUHJpbnRQYWdlUmFuZ2UnKSwgcGFnZVJhbmdlcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaG9vc2UgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvcGllcyB0byBiZSBwcmludGVkIHdoZW4gdGhlIHByaW50IGRpYWxvZyBpc1xuICAgICAqIG9wZW5lZCBmb3IgdGhpcyBmaWxlLlxuICAgICAqIEBwYXJhbSBudW1Db3BpZXMgVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvcGllcy5cbiAgICAgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5wcm90b3R5cGUuc2V0TnVtQ29waWVzID0gZnVuY3Rpb24gKG51bUNvcGllcykge1xuICAgICAgICBhc3NlcnRSYW5nZShudW1Db3BpZXMsICdudW1Db3BpZXMnLCAxLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgYXNzZXJ0SW50ZWdlcihudW1Db3BpZXMsICdudW1Db3BpZXMnKTtcbiAgICAgICAgdmFyIE51bUNvcGllcyA9IHRoaXMuZGljdC5jb250ZXh0Lm9iaihudW1Db3BpZXMpO1xuICAgICAgICB0aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ051bUNvcGllcycpLCBOdW1Db3BpZXMpO1xuICAgIH07XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBWaWV3ZXJQcmVmZXJlbmNlcy5mcm9tRGljdCA9IGZ1bmN0aW9uIChkaWN0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVmlld2VyUHJlZmVyZW5jZXMoZGljdCk7XG4gICAgfTtcbiAgICAvKiogQGlnbm9yZSAqL1xuICAgIFZpZXdlclByZWZlcmVuY2VzLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBkaWN0ID0gY29udGV4dC5vYmooe30pO1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdlclByZWZlcmVuY2VzKGRpY3QpO1xuICAgIH07XG4gICAgcmV0dXJuIFZpZXdlclByZWZlcmVuY2VzO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFZpZXdlclByZWZlcmVuY2VzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Vmlld2VyUHJlZmVyZW5jZXMuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzLCBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk51bWJlciBmcm9tIFwiLi9QREZOdW1iZXJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBQREZBcnJheUlzTm90UmVjdGFuZ2xlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGQXJyYXkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkFycmF5LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkFycmF5KGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuYXJyYXkgPSBbXTtcbiAgICAgICAgX3RoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGQXJyYXkucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICB0aGlzLmFycmF5LnB1c2gob2JqZWN0KTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAoaW5kZXgsIG9iamVjdCkge1xuICAgICAgICB0aGlzLmFycmF5LnNwbGljZShpbmRleCwgMCwgb2JqZWN0KTtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmFycmF5LmluZGV4T2Yob2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID09PSAtMSA/IHVuZGVmaW5lZCA6IGluZGV4O1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB0aGlzLmFycmF5LnNwbGljZShpbmRleCwgMSk7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGlkeCwgb2JqZWN0KSB7XG4gICAgICAgIHRoaXMuYXJyYXlbaWR4XSA9IG9iamVjdDtcbiAgICB9O1xuICAgIFBERkFycmF5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlbaW5kZXhdO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmxvb2t1cE1heWJlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0eXBlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb250ZXh0KS5sb29rdXBNYXliZS5hcHBseShfYSwgX19zcHJlYWRBcnJheXMoW3RoaXMuZ2V0KGluZGV4KV0sIHR5cGVzKSk7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0eXBlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb250ZXh0KS5sb29rdXAuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXlzKFt0aGlzLmdldChpbmRleCldLCB0eXBlcykpO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmFzUmVjdGFuZ2xlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplKCkgIT09IDQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUERGQXJyYXlJc05vdFJlY3RhbmdsZUVycm9yKHRoaXMuc2l6ZSgpKTtcbiAgICAgICAgdmFyIGxvd2VyTGVmdFggPSB0aGlzLmxvb2t1cCgwLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIHZhciBsb3dlckxlZnRZID0gdGhpcy5sb29rdXAoMSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICB2YXIgdXBwZXJSaWdodFggPSB0aGlzLmxvb2t1cCgyLCBQREZOdW1iZXIpLmFzTnVtYmVyKCk7XG4gICAgICAgIHZhciB1cHBlclJpZ2h0WSA9IHRoaXMubG9va3VwKDMsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgdmFyIHggPSBsb3dlckxlZnRYO1xuICAgICAgICB2YXIgeSA9IGxvd2VyTGVmdFk7XG4gICAgICAgIHZhciB3aWR0aCA9IHVwcGVyUmlnaHRYIC0gbG93ZXJMZWZ0WDtcbiAgICAgICAgdmFyIGhlaWdodCA9IHVwcGVyUmlnaHRZIC0gbG93ZXJMZWZ0WTtcbiAgICAgICAgcmV0dXJuIHsgeDogeCwgeTogeSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLmFzQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFycmF5LnNsaWNlKCk7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgY2xvbmUgPSBQREZBcnJheS53aXRoQ29udGV4dChjb250ZXh0IHx8IHRoaXMuY29udGV4dCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBjbG9uZS5wdXNoKHRoaXMuYXJyYXlbaWR4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJyYXlTdHJpbmcgPSAnWyAnO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLnNpemUoKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgYXJyYXlTdHJpbmcgKz0gdGhpcy5nZXQoaWR4KS50b1N0cmluZygpO1xuICAgICAgICAgICAgYXJyYXlTdHJpbmcgKz0gJyAnO1xuICAgICAgICB9XG4gICAgICAgIGFycmF5U3RyaW5nICs9ICddJztcbiAgICAgICAgcmV0dXJuIGFycmF5U3RyaW5nO1xuICAgIH07XG4gICAgUERGQXJyYXkucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2l6ZSA9IDM7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBzaXplICs9IHRoaXMuZ2V0KGlkeCkuc2l6ZUluQnl0ZXMoKSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5MZWZ0U3F1YXJlQnJhY2tldDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIG9mZnNldCArPSB0aGlzLmdldChpZHgpLmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlJpZ2h0U3F1YXJlQnJhY2tldDtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZBcnJheS5wcm90b3R5cGUuc2NhbGVQREZOdW1iZXJzID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBlbCA9IHRoaXMubG9va3VwKGlkeCk7XG4gICAgICAgICAgICBpZiAoZWwgaW5zdGFuY2VvZiBQREZOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmFjdG9yID0gaWR4ICUgMiA9PT0gMCA/IHggOiB5O1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGlkeCwgUERGTnVtYmVyLm9mKGVsLmFzTnVtYmVyKCkgKiBmYWN0b3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGQXJyYXkud2l0aENvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCkgeyByZXR1cm4gbmV3IFBERkFycmF5KGNvbnRleHQpOyB9O1xuICAgIHJldHVybiBQREZBcnJheTtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZBcnJheTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkFycmF5LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xudmFyIEVORk9SQ0VSID0ge307XG52YXIgUERGQm9vbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGQm9vbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZCb29sKGVuZm9yY2VyLCB2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZW5mb3JjZXIgIT09IEVORk9SQ0VSKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFByaXZhdGVDb25zdHJ1Y3RvckVycm9yKCdQREZCb29sJyk7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZCb29sLnByb3RvdHlwZS5hc0Jvb2xlYW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgUERGQm9vbC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgUERGQm9vbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICBQREZCb29sLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPyA0IDogNTtcbiAgICB9O1xuICAgIFBERkJvb2wucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMudDtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMudTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuZTtcbiAgICAgICAgICAgIHJldHVybiA0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5mO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5hO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5sO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5zO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICAgICAgcmV0dXJuIDU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERkJvb2wuVHJ1ZSA9IG5ldyBQREZCb29sKEVORk9SQ0VSLCB0cnVlKTtcbiAgICBQREZCb29sLkZhbHNlID0gbmV3IFBERkJvb2woRU5GT1JDRVIsIGZhbHNlKTtcbiAgICByZXR1cm4gUERGQm9vbDtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZCb29sO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQm9vbC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMsIF9fc3ByZWFkQXJyYXlzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVsbCBmcm9tIFwiLi9QREZOdWxsXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xudmFyIFBERkRpY3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkRpY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGRGljdChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZGljdCA9IG1hcDtcbiAgICAgICAgX3RoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGRGljdC5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5kaWN0LmtleXMoKSk7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZGljdC52YWx1ZXMoKSk7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmRpY3QuZW50cmllcygpKTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5LCBcbiAgICAvLyBUT0RPOiBgcHJlc2VydmVQREZOdWxsYCBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNob3VsZCBiZVxuICAgIC8vIHJlbW92ZWQgaW4gbmV4dCBicmVha2luZyBBUEkgY2hhbmdlLlxuICAgIHByZXNlcnZlUERGTnVsbCkge1xuICAgICAgICBpZiAocHJlc2VydmVQREZOdWxsID09PSB2b2lkIDApIHsgcHJlc2VydmVQREZOdWxsID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5kaWN0LmdldChrZXkpO1xuICAgICAgICBpZiAodmFsdWUgPT09IFBERk51bGwgJiYgIXByZXNlcnZlUERGTnVsbClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5kaWN0LmdldChrZXkpO1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gUERGTnVsbDtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmxvb2t1cE1heWJlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0eXBlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdHlwZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogYHByZXNlcnZlUERGTnVsbGAgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBTaG91bGQgYmVcbiAgICAgICAgLy8gcmVtb3ZlZCBpbiBuZXh0IGJyZWFraW5nIEFQSSBjaGFuZ2UuXG4gICAgICAgIHZhciBwcmVzZXJ2ZVBERk51bGwgPSB0eXBlcy5pbmNsdWRlcyhQREZOdWxsKTtcbiAgICAgICAgdmFyIHZhbHVlID0gKF9hID0gdGhpcy5jb250ZXh0KS5sb29rdXBNYXliZS5hcHBseShfYSwgX19zcHJlYWRBcnJheXMoW3RoaXMuZ2V0KGtleSwgcHJlc2VydmVQREZOdWxsKV0sIHR5cGVzKSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gUERGTnVsbCAmJiAhcHJlc2VydmVQREZOdWxsKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0eXBlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdHlwZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogYHByZXNlcnZlUERGTnVsbGAgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBTaG91bGQgYmVcbiAgICAgICAgLy8gcmVtb3ZlZCBpbiBuZXh0IGJyZWFraW5nIEFQSSBjaGFuZ2UuXG4gICAgICAgIHZhciBwcmVzZXJ2ZVBERk51bGwgPSB0eXBlcy5pbmNsdWRlcyhQREZOdWxsKTtcbiAgICAgICAgdmFyIHZhbHVlID0gKF9hID0gdGhpcy5jb250ZXh0KS5sb29rdXAuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXlzKFt0aGlzLmdldChrZXksIHByZXNlcnZlUERGTnVsbCldLCB0eXBlcykpO1xuICAgICAgICBpZiAodmFsdWUgPT09IFBERk51bGwgJiYgIXByZXNlcnZlUERGTnVsbClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5kZWxldGUoa2V5KTtcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLmFzTWFwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IE1hcCh0aGlzLmRpY3QpO1xuICAgIH07XG4gICAgLyoqIEdlbmVyYXRlIGEgcmFuZG9tIGtleSB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gY3VycmVudCBrZXkgc2V0ICovXG4gICAgUERGRGljdC5wcm90b3R5cGUudW5pcXVlS2V5ID0gZnVuY3Rpb24gKHRhZykge1xuICAgICAgICBpZiAodGFnID09PSB2b2lkIDApIHsgdGFnID0gJyc7IH1cbiAgICAgICAgdmFyIGV4aXN0aW5nS2V5cyA9IHRoaXMua2V5cygpO1xuICAgICAgICB2YXIga2V5ID0gUERGTmFtZS5vZih0aGlzLmNvbnRleHQuYWRkUmFuZG9tU3VmZml4KHRhZywgMTApKTtcbiAgICAgICAgd2hpbGUgKGV4aXN0aW5nS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICBrZXkgPSBQREZOYW1lLm9mKHRoaXMuY29udGV4dC5hZGRSYW5kb21TdWZmaXgodGFnLCAxMCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBjbG9uZSA9IFBERkRpY3Qud2l0aENvbnRleHQoY29udGV4dCB8fCB0aGlzLmNvbnRleHQpO1xuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgIGNsb25lLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfTtcbiAgICBQREZEaWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpY3RTdHJpbmcgPSAnPDxcXG4nO1xuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgIGRpY3RTdHJpbmcgKz0ga2V5LnRvU3RyaW5nKCkgKyAnICcgKyB2YWx1ZS50b1N0cmluZygpICsgJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgZGljdFN0cmluZyArPSAnPj4nO1xuICAgICAgICByZXR1cm4gZGljdFN0cmluZztcbiAgICB9O1xuICAgIFBERkRpY3QucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2l6ZSA9IDU7XG4gICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBlbnRyaWVzW2lkeF0sIGtleSA9IF9hWzBdLCB2YWx1ZSA9IF9hWzFdO1xuICAgICAgICAgICAgc2l6ZSArPSBrZXkuc2l6ZUluQnl0ZXMoKSArIHZhbHVlLnNpemVJbkJ5dGVzKCkgKyAyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH07XG4gICAgUERGRGljdC5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5MZXNzVGhhbjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5MZXNzVGhhbjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgIG9mZnNldCArPSBrZXkuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHZhbHVlLmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuR3JlYXRlclRoYW47XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuR3JlYXRlclRoYW47XG4gICAgICAgIHJldHVybiBvZmZzZXQgLSBpbml0aWFsT2Zmc2V0O1xuICAgIH07XG4gICAgUERGRGljdC53aXRoQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7IHJldHVybiBuZXcgUERGRGljdChuZXcgTWFwKCksIGNvbnRleHQpOyB9O1xuICAgIFBERkRpY3QuZnJvbU1hcFdpdGhDb250ZXh0ID0gZnVuY3Rpb24gKG1hcCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFBERkRpY3QobWFwLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBQREZEaWN0O1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkRpY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZEaWN0LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyLCB0b0hleFN0cmluZ09mTWluTGVuZ3RoLCB1dGYxNkRlY29kZSwgdXRmMTZFbmNvZGUsIHBkZkRvY0VuY29kaW5nRGVjb2RlLCBwYXJzZURhdGUsIGhhc1V0ZjE2Qk9NLCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZIZXhTdHJpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkhleFN0cmluZywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZIZXhTdHJpbmcodmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLmFzQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEFwcGVuZCBhIHplcm8gaWYgdGhlIG51bWJlciBvZiBkaWdpdHMgaXMgb2RkLiBTZWUgUERGIHNwZWMgNy4zLjQuM1xuICAgICAgICB2YXIgaGV4ID0gdGhpcy52YWx1ZSArICh0aGlzLnZhbHVlLmxlbmd0aCAlIDIgPT09IDEgPyAnMCcgOiAnJyk7XG4gICAgICAgIHZhciBoZXhMZW5ndGggPSBoZXgubGVuZ3RoO1xuICAgICAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShoZXgubGVuZ3RoIC8gMik7XG4gICAgICAgIHZhciBoZXhPZmZzZXQgPSAwO1xuICAgICAgICB2YXIgYnl0ZXNPZmZzZXQgPSAwO1xuICAgICAgICAvLyBJbnRlcnByZXQgZWFjaCBwYWlyIG9mIGhleCBkaWdpdHMgYXMgYSBzaW5nbGUgYnl0ZVxuICAgICAgICB3aGlsZSAoaGV4T2Zmc2V0IDwgaGV4TGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoaGV4T2Zmc2V0LCBoZXhPZmZzZXQgKyAyKSwgMTYpO1xuICAgICAgICAgICAgYnl0ZXNbYnl0ZXNPZmZzZXRdID0gYnl0ZTtcbiAgICAgICAgICAgIGhleE9mZnNldCArPSAyO1xuICAgICAgICAgICAgYnl0ZXNPZmZzZXQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLmRlY29kZVRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBieXRlcyA9IHRoaXMuYXNCeXRlcygpO1xuICAgICAgICBpZiAoaGFzVXRmMTZCT00oYnl0ZXMpKVxuICAgICAgICAgICAgcmV0dXJuIHV0ZjE2RGVjb2RlKGJ5dGVzKTtcbiAgICAgICAgcmV0dXJuIHBkZkRvY0VuY29kaW5nRGVjb2RlKGJ5dGVzKTtcbiAgICB9O1xuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUuZGVjb2RlRGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRleHQgPSB0aGlzLmRlY29kZVRleHQoKTtcbiAgICAgICAgdmFyIGRhdGUgPSBwYXJzZURhdGUodGV4dCk7XG4gICAgICAgIGlmICghZGF0ZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUERGRGF0ZVN0cmluZ0Vycm9yKHRleHQpO1xuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9O1xuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUuYXNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgUERGSGV4U3RyaW5nLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFBERkhleFN0cmluZy5vZih0aGlzLnZhbHVlKTtcbiAgICB9O1xuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIjxcIiArIHRoaXMudmFsdWUgKyBcIj5cIjtcbiAgICB9O1xuICAgIFBERkhleFN0cmluZy5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmxlbmd0aCArIDI7XG4gICAgfTtcbiAgICBQREZIZXhTdHJpbmcucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5MZXNzVGhhbjtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMudmFsdWUsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5HcmVhdGVyVGhhbjtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUubGVuZ3RoICsgMjtcbiAgICB9O1xuICAgIFBERkhleFN0cmluZy5vZiA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gbmV3IFBERkhleFN0cmluZyh2YWx1ZSk7IH07XG4gICAgUERGSGV4U3RyaW5nLmZyb21UZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBlbmNvZGVkID0gdXRmMTZFbmNvZGUodmFsdWUpO1xuICAgICAgICB2YXIgaGV4ID0gJyc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVuY29kZWQubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBoZXggKz0gdG9IZXhTdHJpbmdPZk1pbkxlbmd0aChlbmNvZGVkW2lkeF0sIDQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUERGSGV4U3RyaW5nKGhleCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGSGV4U3RyaW5nO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkhleFN0cmluZztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERkhleFN0cmluZy5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4vUERGT2JqZWN0XCI7XG52YXIgUERGSW52YWxpZE9iamVjdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGSW52YWxpZE9iamVjdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZJbnZhbGlkT2JqZWN0KGRhdGEpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGSW52YWxpZE9iamVjdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQREZJbnZhbGlkT2JqZWN0Lm9mKHRoaXMuZGF0YS5zbGljZSgpKTtcbiAgICB9O1xuICAgIFBERkludmFsaWRPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJQREZJbnZhbGlkT2JqZWN0KFwiICsgdGhpcy5kYXRhLmxlbmd0aCArIFwiIGJ5dGVzKVwiO1xuICAgIH07XG4gICAgUERGSW52YWxpZE9iamVjdC5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubGVuZ3RoO1xuICAgIH07XG4gICAgUERGSW52YWxpZE9iamVjdC5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IHRoaXMuZGF0YVtpZHhdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfTtcbiAgICBQREZJbnZhbGlkT2JqZWN0Lm9mID0gZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIG5ldyBQREZJbnZhbGlkT2JqZWN0KGRhdGEpOyB9O1xuICAgIHJldHVybiBQREZJbnZhbGlkT2JqZWN0O1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERkludmFsaWRPYmplY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZJbnZhbGlkT2JqZWN0LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgSXNJcnJlZ3VsYXIgfSBmcm9tIFwiLi4vc3ludGF4L0lycmVndWxhclwiO1xuaW1wb3J0IHsgY2hhckZyb21IZXhDb2RlLCBjb3B5U3RyaW5nSW50b0J1ZmZlciwgdG9DaGFyQ29kZSwgdG9IZXhTdHJpbmcsIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgZGVjb2RlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvIyhbXFxkQUJDREVGXXsyfSkvZywgZnVuY3Rpb24gKF8sIGhleCkgeyByZXR1cm4gY2hhckZyb21IZXhDb2RlKGhleCk7IH0pO1xufTtcbnZhciBpc1JlZ3VsYXJDaGFyID0gZnVuY3Rpb24gKGNoYXJDb2RlKSB7XG4gICAgcmV0dXJuIGNoYXJDb2RlID49IENoYXJDb2Rlcy5FeGNsYW1hdGlvblBvaW50ICYmXG4gICAgICAgIGNoYXJDb2RlIDw9IENoYXJDb2Rlcy5UaWxkZSAmJlxuICAgICAgICAhSXNJcnJlZ3VsYXJbY2hhckNvZGVdO1xufTtcbnZhciBFTkZPUkNFUiA9IHt9O1xudmFyIHBvb2wgPSBuZXcgTWFwKCk7XG52YXIgUERGTmFtZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGTmFtZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZOYW1lKGVuZm9yY2VyLCBuYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChlbmZvcmNlciAhPT0gRU5GT1JDRVIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IoJ1BERk5hbWUnKTtcbiAgICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICB2YXIgZW5jb2RlZE5hbWUgPSAnLyc7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IG5hbWUubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgY2hhcmFjdGVyID0gbmFtZVtpZHhdO1xuICAgICAgICAgICAgdmFyIGNvZGUgPSB0b0NoYXJDb2RlKGNoYXJhY3Rlcik7XG4gICAgICAgICAgICBlbmNvZGVkTmFtZSArPSBpc1JlZ3VsYXJDaGFyKGNvZGUpID8gY2hhcmFjdGVyIDogXCIjXCIgKyB0b0hleFN0cmluZyhjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5lbmNvZGVkTmFtZSA9IGVuY29kZWROYW1lO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERk5hbWUucHJvdG90eXBlLmFzQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBieXRlcyA9IFtdO1xuICAgICAgICB2YXIgaGV4ID0gJyc7XG4gICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgIHZhciBwdXNoQnl0ZSA9IGZ1bmN0aW9uIChieXRlKSB7XG4gICAgICAgICAgICBpZiAoYnl0ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGJ5dGVzLnB1c2goYnl0ZSk7XG4gICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDEsIGxlbiA9IHRoaXMuZW5jb2RlZE5hbWUubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgY2hhciA9IHRoaXMuZW5jb2RlZE5hbWVbaWR4XTtcbiAgICAgICAgICAgIHZhciBieXRlID0gdG9DaGFyQ29kZShjaGFyKTtcbiAgICAgICAgICAgIHZhciBuZXh0Q2hhciA9IHRoaXMuZW5jb2RlZE5hbWVbaWR4ICsgMV07XG4gICAgICAgICAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkhhc2gpXG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoYnl0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoKGJ5dGUgPj0gQ2hhckNvZGVzLlplcm8gJiYgYnl0ZSA8PSBDaGFyQ29kZXMuTmluZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGJ5dGUgPj0gQ2hhckNvZGVzLmEgJiYgYnl0ZSA8PSBDaGFyQ29kZXMuZikgfHxcbiAgICAgICAgICAgICAgICAgICAgKGJ5dGUgPj0gQ2hhckNvZGVzLkEgJiYgYnl0ZSA8PSBDaGFyQ29kZXMuRikpIHtcbiAgICAgICAgICAgICAgICAgICAgaGV4ICs9IGNoYXI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoZXgubGVuZ3RoID09PSAyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhKChuZXh0Q2hhciA+PSAnMCcgJiYgbmV4dENoYXIgPD0gJzknKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXh0Q2hhciA+PSAnYScgJiYgbmV4dENoYXIgPD0gJ2YnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXh0Q2hhciA+PSAnQScgJiYgbmV4dENoYXIgPD0gJ0YnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKHBhcnNlSW50KGhleCwgMTYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhleCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShieXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbiAgICB9O1xuICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIHByb2JhYmx5IHVzZSBgdXRmOERlY29kZSgpYFxuICAgIC8vIFRPRE86IFBvbHlmaWxsIEFycmF5LmZyb20/XG4gICAgUERGTmFtZS5wcm90b3R5cGUuZGVjb2RlVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5hc0J5dGVzKCk7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgQXJyYXkuZnJvbShieXRlcykpO1xuICAgIH07XG4gICAgUERGTmFtZS5wcm90b3R5cGUuYXNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuY29kZWROYW1lO1xuICAgIH07XG4gICAgLyoqIEBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFtbUERGTmFtZS5hc1N0cmluZ11dICovXG4gICAgUERGTmFtZS5wcm90b3R5cGUudmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuY29kZWROYW1lO1xuICAgIH07XG4gICAgUERGTmFtZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgUERGTmFtZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuY29kZWROYW1lO1xuICAgIH07XG4gICAgUERGTmFtZS5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuY29kZWROYW1lLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERk5hbWUucHJvdG90eXBlLmNvcHlCeXRlc0ludG8gPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ICs9IGNvcHlTdHJpbmdJbnRvQnVmZmVyKHRoaXMuZW5jb2RlZE5hbWUsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZE5hbWUubGVuZ3RoO1xuICAgIH07XG4gICAgUERGTmFtZS5vZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBkZWNvZGVkVmFsdWUgPSBkZWNvZGVOYW1lKG5hbWUpO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBwb29sLmdldChkZWNvZGVkVmFsdWUpO1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBQREZOYW1lKEVORk9SQ0VSLCBkZWNvZGVkVmFsdWUpO1xuICAgICAgICAgICAgcG9vbC5zZXQoZGVjb2RlZFZhbHVlLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gICAgLyogdHNsaW50OmRpc2FibGUgbWVtYmVyLW9yZGVyaW5nICovXG4gICAgUERGTmFtZS5MZW5ndGggPSBQREZOYW1lLm9mKCdMZW5ndGgnKTtcbiAgICBQREZOYW1lLkZsYXRlRGVjb2RlID0gUERGTmFtZS5vZignRmxhdGVEZWNvZGUnKTtcbiAgICBQREZOYW1lLlJlc291cmNlcyA9IFBERk5hbWUub2YoJ1Jlc291cmNlcycpO1xuICAgIFBERk5hbWUuRm9udCA9IFBERk5hbWUub2YoJ0ZvbnQnKTtcbiAgICBQREZOYW1lLlhPYmplY3QgPSBQREZOYW1lLm9mKCdYT2JqZWN0Jyk7XG4gICAgUERGTmFtZS5FeHRHU3RhdGUgPSBQREZOYW1lLm9mKCdFeHRHU3RhdGUnKTtcbiAgICBQREZOYW1lLkNvbnRlbnRzID0gUERGTmFtZS5vZignQ29udGVudHMnKTtcbiAgICBQREZOYW1lLlR5cGUgPSBQREZOYW1lLm9mKCdUeXBlJyk7XG4gICAgUERGTmFtZS5QYXJlbnQgPSBQREZOYW1lLm9mKCdQYXJlbnQnKTtcbiAgICBQREZOYW1lLk1lZGlhQm94ID0gUERGTmFtZS5vZignTWVkaWFCb3gnKTtcbiAgICBQREZOYW1lLlBhZ2UgPSBQREZOYW1lLm9mKCdQYWdlJyk7XG4gICAgUERGTmFtZS5Bbm5vdHMgPSBQREZOYW1lLm9mKCdBbm5vdHMnKTtcbiAgICBQREZOYW1lLlRyaW1Cb3ggPSBQREZOYW1lLm9mKCdUcmltQm94Jyk7XG4gICAgUERGTmFtZS5BcnRCb3ggPSBQREZOYW1lLm9mKCdBcnRCb3gnKTtcbiAgICBQREZOYW1lLkJsZWVkQm94ID0gUERGTmFtZS5vZignQmxlZWRCb3gnKTtcbiAgICBQREZOYW1lLkNyb3BCb3ggPSBQREZOYW1lLm9mKCdDcm9wQm94Jyk7XG4gICAgUERGTmFtZS5Sb3RhdGUgPSBQREZOYW1lLm9mKCdSb3RhdGUnKTtcbiAgICBQREZOYW1lLlRpdGxlID0gUERGTmFtZS5vZignVGl0bGUnKTtcbiAgICBQREZOYW1lLkF1dGhvciA9IFBERk5hbWUub2YoJ0F1dGhvcicpO1xuICAgIFBERk5hbWUuU3ViamVjdCA9IFBERk5hbWUub2YoJ1N1YmplY3QnKTtcbiAgICBQREZOYW1lLkNyZWF0b3IgPSBQREZOYW1lLm9mKCdDcmVhdG9yJyk7XG4gICAgUERGTmFtZS5LZXl3b3JkcyA9IFBERk5hbWUub2YoJ0tleXdvcmRzJyk7XG4gICAgUERGTmFtZS5Qcm9kdWNlciA9IFBERk5hbWUub2YoJ1Byb2R1Y2VyJyk7XG4gICAgUERGTmFtZS5DcmVhdGlvbkRhdGUgPSBQREZOYW1lLm9mKCdDcmVhdGlvbkRhdGUnKTtcbiAgICBQREZOYW1lLk1vZERhdGUgPSBQREZOYW1lLm9mKCdNb2REYXRlJyk7XG4gICAgcmV0dXJuIFBERk5hbWU7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGTmFtZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk5hbWUuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xudmFyIFBERk51bGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk51bGwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGTnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBQREZOdWxsLnByb3RvdHlwZS5hc051bGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgUERGTnVsbC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgUERGTnVsbC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfTtcbiAgICBQREZOdWxsLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfTtcbiAgICBQREZOdWxsLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy51O1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmw7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubDtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfTtcbiAgICByZXR1cm4gUERGTnVsbDtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBuZXcgUERGTnVsbCgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGTnVsbC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyLCBudW1iZXJUb1N0cmluZyB9IGZyb20gXCIuLi8uLi91dGlscy9pbmRleFwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbnZhciBQREZOdW1iZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk51bWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZOdW1iZXIodmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubnVtYmVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgX3RoaXMuc3RyaW5nVmFsdWUgPSBudW1iZXJUb1N0cmluZyh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGTnVtYmVyLnByb3RvdHlwZS5hc051bWJlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtYmVyVmFsdWU7XG4gICAgfTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgW1tQREZOdW1iZXIuYXNOdW1iZXJdXSAqL1xuICAgIFBERk51bWJlci5wcm90b3R5cGUudmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlclZhbHVlO1xuICAgIH07XG4gICAgUERGTnVtYmVyLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFBERk51bWJlci5vZih0aGlzLm51bWJlclZhbHVlKTtcbiAgICB9O1xuICAgIFBERk51bWJlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ1ZhbHVlO1xuICAgIH07XG4gICAgUERGTnVtYmVyLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nVmFsdWUubGVuZ3RoO1xuICAgIH07XG4gICAgUERGTnVtYmVyLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLnN0cmluZ1ZhbHVlLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ1ZhbHVlLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERk51bWJlci5vZiA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gbmV3IFBERk51bWJlcih2YWx1ZSk7IH07XG4gICAgcmV0dXJuIFBERk51bWJlcjtcbn0oUERGT2JqZWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZOdW1iZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZOdW1iZXIuanMubWFwIiwiaW1wb3J0IHsgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZPYmplY3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGT2JqZWN0KCkge1xuICAgIH1cbiAgICBQREZPYmplY3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKF9jb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2Nsb25lJyk7XG4gICAgfTtcbiAgICBQREZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICd0b1N0cmluZycpO1xuICAgIH07XG4gICAgUERGT2JqZWN0LnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnc2l6ZUluQnl0ZXMnKTtcbiAgICB9O1xuICAgIFBERk9iamVjdC5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChfYnVmZmVyLCBfb2Zmc2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2NvcHlCeXRlc0ludG8nKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZPYmplY3Q7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGT2JqZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT2JqZWN0LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERlN0cmVhbSBmcm9tIFwiLi9QREZTdHJlYW1cIjtcbmltcG9ydCB7IGFycmF5QXNTdHJpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZSYXdTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlJhd1N0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZSYXdTdHJlYW0oZGljdCwgY29udGVudHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGljdCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29udGVudHMgPSBjb250ZW50cztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZSYXdTdHJlYW0ucHJvdG90eXBlLmFzVWludDhBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudHMuc2xpY2UoKTtcbiAgICB9O1xuICAgIFBERlJhd1N0cmVhbS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gUERGUmF3U3RyZWFtLm9mKHRoaXMuZGljdC5jbG9uZShjb250ZXh0KSwgdGhpcy5jb250ZW50cy5zbGljZSgpKTtcbiAgICB9O1xuICAgIFBERlJhd1N0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcnJheUFzU3RyaW5nKHRoaXMuY29udGVudHMpO1xuICAgIH07XG4gICAgUERGUmF3U3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudHM7XG4gICAgfTtcbiAgICBQREZSYXdTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RoO1xuICAgIH07XG4gICAgUERGUmF3U3RyZWFtLm9mID0gZnVuY3Rpb24gKGRpY3QsIGNvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGUmF3U3RyZWFtKGRpY3QsIGNvbnRlbnRzKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZSYXdTdHJlYW07XG59KFBERlN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGUmF3U3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUmF3U3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUHJpdmF0ZUNvbnN0cnVjdG9yRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGT2JqZWN0IGZyb20gXCIuL1BERk9iamVjdFwiO1xuaW1wb3J0IHsgY29weVN0cmluZ0ludG9CdWZmZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBFTkZPUkNFUiA9IHt9O1xudmFyIHBvb2wgPSBuZXcgTWFwKCk7XG52YXIgUERGUmVmID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZSZWYsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUmVmKGVuZm9yY2VyLCBvYmplY3ROdW1iZXIsIGdlbmVyYXRpb25OdW1iZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKGVuZm9yY2VyICE9PSBFTkZPUkNFUilcbiAgICAgICAgICAgIHRocm93IG5ldyBQcml2YXRlQ29uc3RydWN0b3JFcnJvcignUERGUmVmJyk7XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMub2JqZWN0TnVtYmVyID0gb2JqZWN0TnVtYmVyO1xuICAgICAgICBfdGhpcy5nZW5lcmF0aW9uTnVtYmVyID0gZ2VuZXJhdGlvbk51bWJlcjtcbiAgICAgICAgX3RoaXMudGFnID0gb2JqZWN0TnVtYmVyICsgXCIgXCIgKyBnZW5lcmF0aW9uTnVtYmVyICsgXCIgUlwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlJlZi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgUERGUmVmLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnO1xuICAgIH07XG4gICAgUERGUmVmLnByb3RvdHlwZS5zaXplSW5CeXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERlJlZi5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy50YWcsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnLmxlbmd0aDtcbiAgICB9O1xuICAgIFBERlJlZi5vZiA9IGZ1bmN0aW9uIChvYmplY3ROdW1iZXIsIGdlbmVyYXRpb25OdW1iZXIpIHtcbiAgICAgICAgaWYgKGdlbmVyYXRpb25OdW1iZXIgPT09IHZvaWQgMCkgeyBnZW5lcmF0aW9uTnVtYmVyID0gMDsgfVxuICAgICAgICB2YXIgdGFnID0gb2JqZWN0TnVtYmVyICsgXCIgXCIgKyBnZW5lcmF0aW9uTnVtYmVyICsgXCIgUlwiO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBwb29sLmdldCh0YWcpO1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBQREZSZWYoRU5GT1JDRVIsIG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbk51bWJlcik7XG4gICAgICAgICAgICBwb29sLnNldCh0YWcsIGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfTtcbiAgICByZXR1cm4gUERGUmVmO1xufShQREZPYmplY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlJlZjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlJlZi5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuL1BERk51bWJlclwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbnZhciBQREZTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZTdHJlYW0oZGljdCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kaWN0ID0gZGljdDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKF9jb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKHRoaXMuY29uc3RydWN0b3IubmFtZSwgJ2Nsb25lJyk7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdnZXRDb250ZW50c1N0cmluZycpO1xuICAgIH07XG4gICAgUERGU3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IodGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAnZ2V0Q29udGVudHMnKTtcbiAgICB9O1xuICAgIFBERlN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdnZXRDb250ZW50c1NpemUnKTtcbiAgICB9O1xuICAgIFBERlN0cmVhbS5wcm90b3R5cGUudXBkYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnRlbnRzU2l6ZSA9IHRoaXMuZ2V0Q29udGVudHNTaXplKCk7XG4gICAgICAgIHRoaXMuZGljdC5zZXQoUERGTmFtZS5MZW5ndGgsIFBERk51bWJlci5vZihjb250ZW50c1NpemUpKTtcbiAgICB9O1xuICAgIFBERlN0cmVhbS5wcm90b3R5cGUuc2l6ZUluQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGljdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LnNpemVJbkJ5dGVzKCkgKyB0aGlzLmdldENvbnRlbnRzU2l6ZSgpICsgMTg7XG4gICAgfTtcbiAgICBQREZTdHJlYW0ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZURpY3QoKTtcbiAgICAgICAgdmFyIHN0cmVhbVN0cmluZyA9IHRoaXMuZGljdC50b1N0cmluZygpO1xuICAgICAgICBzdHJlYW1TdHJpbmcgKz0gJ1xcbnN0cmVhbVxcbic7XG4gICAgICAgIHN0cmVhbVN0cmluZyArPSB0aGlzLmdldENvbnRlbnRzU3RyaW5nKCk7XG4gICAgICAgIHN0cmVhbVN0cmluZyArPSAnXFxuZW5kc3RyZWFtJztcbiAgICAgICAgcmV0dXJuIHN0cmVhbVN0cmluZztcbiAgICB9O1xuICAgIFBERlN0cmVhbS5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB0aGlzLnVwZGF0ZURpY3QoKTtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIG9mZnNldCArPSB0aGlzLmRpY3QuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5zO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnQ7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMucjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmE7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICB2YXIgY29udGVudHMgPSB0aGlzLmdldENvbnRlbnRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGNvbnRlbnRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGNvbnRlbnRzW2lkeF07XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubjtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5kO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLnM7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMudDtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5yO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuYTtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5tO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IC0gaW5pdGlhbE9mZnNldDtcbiAgICB9O1xuICAgIHJldHVybiBQREZTdHJlYW07XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGU3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERk9iamVjdCBmcm9tIFwiLi9QREZPYmplY3RcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyLCBwYWRTdGFydCwgdXRmMTZEZWNvZGUsIHBkZkRvY0VuY29kaW5nRGVjb2RlLCB0b0NoYXJDb2RlLCBwYXJzZURhdGUsIGhhc1V0ZjE2Qk9NLCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbnZhciBQREZTdHJpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlN0cmluZywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZTdHJpbmcodmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZTdHJpbmcucHJvdG90eXBlLmFzQnl0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBieXRlcyA9IFtdO1xuICAgICAgICB2YXIgb2N0YWwgPSAnJztcbiAgICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHB1c2hCeXRlID0gZnVuY3Rpb24gKGJ5dGUpIHtcbiAgICAgICAgICAgIGlmIChieXRlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgYnl0ZXMucHVzaChieXRlKTtcbiAgICAgICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy52YWx1ZS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBjaGFyID0gdGhpcy52YWx1ZVtpZHhdO1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0b0NoYXJDb2RlKGNoYXIpO1xuICAgICAgICAgICAgdmFyIG5leHRDaGFyID0gdGhpcy52YWx1ZVtpZHggKyAxXTtcbiAgICAgICAgICAgIGlmICghZXNjYXBlZCkge1xuICAgICAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuQmFja1NsYXNoKVxuICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKGJ5dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5OZXdsaW5lKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZSgpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5DYXJyaWFnZVJldHVybilcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMubilcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLk5ld2xpbmUpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5yKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuQ2FycmlhZ2VSZXR1cm4pO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy50KVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuVGFiKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMuYilcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLkJhY2tzcGFjZSk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLmYpXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5Gb3JtRmVlZCk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkxlZnRQYXJlbilcbiAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUoQ2hhckNvZGVzLkxlZnRQYXJlbik7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLlJpZ2h0UGFyZW4pXG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKENoYXJDb2Rlcy5SaWdodFBhcmVuKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSBDaGFyQ29kZXMuQmFja3NwYWNlKVxuICAgICAgICAgICAgICAgICAgICBwdXNoQnl0ZShDaGFyQ29kZXMuQmFja1NsYXNoKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChieXRlID49IENoYXJDb2Rlcy5aZXJvICYmIGJ5dGUgPD0gQ2hhckNvZGVzLlNldmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIG9jdGFsICs9IGNoYXI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvY3RhbC5sZW5ndGggPT09IDMgfHwgIShuZXh0Q2hhciA+PSAnMCcgJiYgbmV4dENoYXIgPD0gJzcnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEJ5dGUocGFyc2VJbnQob2N0YWwsIDgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9jdGFsID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hCeXRlKGJ5dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5kZWNvZGVUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnl0ZXMgPSB0aGlzLmFzQnl0ZXMoKTtcbiAgICAgICAgaWYgKGhhc1V0ZjE2Qk9NKGJ5dGVzKSlcbiAgICAgICAgICAgIHJldHVybiB1dGYxNkRlY29kZShieXRlcyk7XG4gICAgICAgIHJldHVybiBwZGZEb2NFbmNvZGluZ0RlY29kZShieXRlcyk7XG4gICAgfTtcbiAgICBQREZTdHJpbmcucHJvdG90eXBlLmRlY29kZURhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ZXh0ID0gdGhpcy5kZWNvZGVUZXh0KCk7XG4gICAgICAgIHZhciBkYXRlID0gcGFyc2VEYXRlKHRleHQpO1xuICAgICAgICBpZiAoIWRhdGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBERkRhdGVTdHJpbmdFcnJvcih0ZXh0KTtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfTtcbiAgICBQREZTdHJpbmcucHJvdG90eXBlLmFzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIFBERlN0cmluZy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQREZTdHJpbmcub2YodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICBQREZTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCIoXCIgKyB0aGlzLnZhbHVlICsgXCIpXCI7XG4gICAgfTtcbiAgICBQREZTdHJpbmcucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGggKyAyO1xuICAgIH07XG4gICAgUERGU3RyaW5nLnByb3RvdHlwZS5jb3B5Qnl0ZXNJbnRvID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTGVmdFBhcmVuO1xuICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIodGhpcy52YWx1ZSwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlJpZ2h0UGFyZW47XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmxlbmd0aCArIDI7XG4gICAgfTtcbiAgICAvLyBUaGUgUERGIHNwZWMgYWxsb3dzIG5ld2xpbmVzIGFuZCBwYXJlbnMgdG8gYXBwZWFyIGRpcmVjdGx5IHdpdGhpbiBhIGxpdGVyYWxcbiAgICAvLyBzdHJpbmcuIFRoZXNlIGNoYXJhY3RlciBfbWF5XyBiZSBlc2NhcGVkLiBCdXQgdGhleSBkbyBub3QgX2hhdmVfIHRvIGJlLiBTb1xuICAgIC8vIGZvciBzaW1wbGljaXR5LCB3ZSB3aWxsIG5vdCBib3RoZXIgZXNjYXBpbmcgdGhlbS5cbiAgICBQREZTdHJpbmcub2YgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIG5ldyBQREZTdHJpbmcodmFsdWUpOyB9O1xuICAgIFBERlN0cmluZy5mcm9tRGF0ZSA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHZhciB5ZWFyID0gcGFkU3RhcnQoU3RyaW5nKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSksIDQsICcwJyk7XG4gICAgICAgIHZhciBtb250aCA9IHBhZFN0YXJ0KFN0cmluZyhkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSwgMiwgJzAnKTtcbiAgICAgICAgdmFyIGRheSA9IHBhZFN0YXJ0KFN0cmluZyhkYXRlLmdldFVUQ0RhdGUoKSksIDIsICcwJyk7XG4gICAgICAgIHZhciBob3VycyA9IHBhZFN0YXJ0KFN0cmluZyhkYXRlLmdldFVUQ0hvdXJzKCkpLCAyLCAnMCcpO1xuICAgICAgICB2YXIgbWlucyA9IHBhZFN0YXJ0KFN0cmluZyhkYXRlLmdldFVUQ01pbnV0ZXMoKSksIDIsICcwJyk7XG4gICAgICAgIHZhciBzZWNzID0gcGFkU3RhcnQoU3RyaW5nKGRhdGUuZ2V0VVRDU2Vjb25kcygpKSwgMiwgJzAnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZTdHJpbmcoXCJEOlwiICsgeWVhciArIG1vbnRoICsgZGF5ICsgaG91cnMgKyBtaW5zICsgc2VjcyArIFwiWlwiKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZTdHJpbmc7XG59KFBERk9iamVjdCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGU3RyaW5nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGU3RyaW5nLmpzLm1hcCIsImltcG9ydCBQREZPYmplY3QgZnJvbSBcIi4uL29iamVjdHMvUERGT2JqZWN0XCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERk9wZXJhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBERk9wZXJhdG9yKG5hbWUsIGFyZ3MpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncyB8fCBbXTtcbiAgICB9XG4gICAgUERGT3BlcmF0b3IucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkodGhpcy5hcmdzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFyZ3MubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIgYXJnID0gdGhpcy5hcmdzW2lkeF07XG4gICAgICAgICAgICBhcmdzW2lkeF0gPSBhcmcgaW5zdGFuY2VvZiBQREZPYmplY3QgPyBhcmcuY2xvbmUoY29udGV4dCkgOiBhcmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBERk9wZXJhdG9yLm9mKHRoaXMubmFtZSwgYXJncyk7XG4gICAgfTtcbiAgICBQREZPcGVyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLmFyZ3MubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YWx1ZSArPSBTdHJpbmcodGhpcy5hcmdzW2lkeF0pICsgJyAnO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlICs9IHRoaXMubmFtZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgUERGT3BlcmF0b3IucHJvdG90eXBlLnNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2l6ZSA9IDA7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMuYXJncy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBhcmcgPSB0aGlzLmFyZ3NbaWR4XTtcbiAgICAgICAgICAgIHNpemUgKz0gKGFyZyBpbnN0YW5jZW9mIFBERk9iamVjdCA/IGFyZy5zaXplSW5CeXRlcygpIDogYXJnLmxlbmd0aCkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHNpemUgKz0gdGhpcy5uYW1lLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcbiAgICBQREZPcGVyYXRvci5wcm90b3R5cGUuY29weUJ5dGVzSW50byA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5hcmdzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIGFyZyA9IHRoaXMuYXJnc1tpZHhdO1xuICAgICAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIFBERk9iamVjdCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBhcmcuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIoYXJnLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLm5hbWUsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCAtIGluaXRpYWxPZmZzZXQ7XG4gICAgfTtcbiAgICBQREZPcGVyYXRvci5vZiA9IGZ1bmN0aW9uIChuYW1lLCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGT3BlcmF0b3IobmFtZSwgYXJncyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGT3BlcmF0b3I7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGT3BlcmF0b3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QREZPcGVyYXRvci5qcy5tYXAiLCJ2YXIgUERGT3BlcmF0b3JOYW1lcztcbihmdW5jdGlvbiAoUERGT3BlcmF0b3JOYW1lcykge1xuICAgIC8vIE5vbiBTdHJva2luZyBDb2xvciBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTm9uU3Ryb2tpbmdDb2xvclwiXSA9IFwic2NcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTm9uU3Ryb2tpbmdDb2xvck5cIl0gPSBcInNjblwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJOb25TdHJva2luZ0NvbG9yUmdiXCJdID0gXCJyZ1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJOb25TdHJva2luZ0NvbG9yR3JheVwiXSA9IFwiZ1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJOb25TdHJva2luZ0NvbG9yQ215a1wiXSA9IFwia1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJOb25TdHJva2luZ0NvbG9yc3BhY2VcIl0gPSBcImNzXCI7XG4gICAgLy8gU3Ryb2tpbmcgQ29sb3IgT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9raW5nQ29sb3JcIl0gPSBcIlNDXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlN0cm9raW5nQ29sb3JOXCJdID0gXCJTQ05cIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU3Ryb2tpbmdDb2xvclJnYlwiXSA9IFwiUkdcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU3Ryb2tpbmdDb2xvckdyYXlcIl0gPSBcIkdcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU3Ryb2tpbmdDb2xvckNteWtcIl0gPSBcIktcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU3Ryb2tpbmdDb2xvcnNwYWNlXCJdID0gXCJDU1wiO1xuICAgIC8vIE1hcmtlZCBDb250ZW50IE9wZXJhdG9yc1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJCZWdpbk1hcmtlZENvbnRlbnRTZXF1ZW5jZVwiXSA9IFwiQkRDXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkJlZ2luTWFya2VkQ29udGVudFwiXSA9IFwiQk1DXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkVuZE1hcmtlZENvbnRlbnRcIl0gPSBcIkVNQ1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJNYXJrZWRDb250ZW50UG9pbnRXaXRoUHJvcHNcIl0gPSBcIkRQXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk1hcmtlZENvbnRlbnRQb2ludFwiXSA9IFwiTVBcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRHJhd09iamVjdFwiXSA9IFwiRG9cIjtcbiAgICAvLyBHcmFwaGljcyBTdGF0ZSBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQ29uY2F0VHJhbnNmb3JtYXRpb25NYXRyaXhcIl0gPSBcImNtXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlBvcEdyYXBoaWNzU3RhdGVcIl0gPSBcIlFcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiUHVzaEdyYXBoaWNzU3RhdGVcIl0gPSBcInFcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0RmxhdG5lc3NcIl0gPSBcImlcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0R3JhcGhpY3NTdGF0ZVBhcmFtc1wiXSA9IFwiZ3NcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0TGluZUNhcFN0eWxlXCJdID0gXCJKXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldExpbmVEYXNoUGF0dGVyblwiXSA9IFwiZFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRMaW5lSm9pblN0eWxlXCJdID0gXCJqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldExpbmVNaXRlckxpbWl0XCJdID0gXCJNXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldExpbmVXaWR0aFwiXSA9IFwid1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRUZXh0TWF0cml4XCJdID0gXCJUbVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRSZW5kZXJpbmdJbnRlbnRcIl0gPSBcInJpXCI7XG4gICAgLy8gR3JhcGhpY3MgT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkFwcGVuZFJlY3RhbmdsZVwiXSA9IFwicmVcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQmVnaW5JbmxpbmVJbWFnZVwiXSA9IFwiQklcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQmVnaW5JbmxpbmVJbWFnZURhdGFcIl0gPSBcIklEXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkVuZElubGluZUltYWdlXCJdID0gXCJFSVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDbGlwRXZlbk9kZFwiXSA9IFwiVypcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQ2xpcE5vblplcm9cIl0gPSBcIldcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQ2xvc2VBbmRTdHJva2VcIl0gPSBcInNcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQ2xvc2VGaWxsRXZlbk9kZEFuZFN0cm9rZVwiXSA9IFwiYipcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQ2xvc2VGaWxsTm9uWmVyb0FuZFN0cm9rZVwiXSA9IFwiYlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJDbG9zZVBhdGhcIl0gPSBcImhcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQXBwZW5kQmV6aWVyQ3VydmVcIl0gPSBcImNcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQ3VydmVUb1JlcGxpY2F0ZUZpbmFsUG9pbnRcIl0gPSBcInlcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiQ3VydmVUb1JlcGxpY2F0ZUluaXRpYWxQb2ludFwiXSA9IFwidlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJFbmRQYXRoXCJdID0gXCJuXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkZpbGxFdmVuT2RkQW5kU3Ryb2tlXCJdID0gXCJCKlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJGaWxsRXZlbk9kZFwiXSA9IFwiZipcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRmlsbE5vblplcm9BbmRTdHJva2VcIl0gPSBcIkJcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRmlsbE5vblplcm9cIl0gPSBcImZcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTGVnYWN5RmlsbE5vblplcm9cIl0gPSBcIkZcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTGluZVRvXCJdID0gXCJsXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk1vdmVUb1wiXSA9IFwibVwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTaGFkaW5nRmlsbFwiXSA9IFwic2hcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU3Ryb2tlUGF0aFwiXSA9IFwiU1wiO1xuICAgIC8vIFRleHQgT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkJlZ2luVGV4dFwiXSA9IFwiQlRcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiRW5kVGV4dFwiXSA9IFwiRVRcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTW92ZVRleHRcIl0gPSBcIlRkXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIk1vdmVUZXh0U2V0TGVhZGluZ1wiXSA9IFwiVERcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiTmV4dExpbmVcIl0gPSBcIlQqXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldENoYXJhY3RlclNwYWNpbmdcIl0gPSBcIlRjXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldEZvbnRBbmRTaXplXCJdID0gXCJUZlwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRUZXh0SG9yaXpvbnRhbFNjYWxpbmdcIl0gPSBcIlR6XCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFRleHRMaW5lSGVpZ2h0XCJdID0gXCJUTFwiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTZXRUZXh0UmVuZGVyaW5nTW9kZVwiXSA9IFwiVHJcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2V0VGV4dFJpc2VcIl0gPSBcIlRzXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNldFdvcmRTcGFjaW5nXCJdID0gXCJUd1wiO1xuICAgIFBERk9wZXJhdG9yTmFtZXNbXCJTaG93VGV4dFwiXSA9IFwiVGpcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2hvd1RleHRBZGp1c3RlZFwiXSA9IFwiVEpcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiU2hvd1RleHRMaW5lXCJdID0gXCInXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIlNob3dUZXh0TGluZUFuZFNwYWNlXCJdID0gXCJcXFwiXCI7XG4gICAgLy8gVHlwZTMgRm9udCBPcGVyYXRvcnNcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiVHlwZTNEMFwiXSA9IFwiZDBcIjtcbiAgICBQREZPcGVyYXRvck5hbWVzW1wiVHlwZTNEMVwiXSA9IFwiZDFcIjtcbiAgICAvLyBDb21wYXRpYmlsaXR5IFNlY3Rpb24gT3BlcmF0b3JzXG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkJlZ2luQ29tcGF0aWJpbGl0eVNlY3Rpb25cIl0gPSBcIkJYXCI7XG4gICAgUERGT3BlcmF0b3JOYW1lc1tcIkVuZENvbXBhdGliaWxpdHlTZWN0aW9uXCJdID0gXCJFWFwiO1xufSkoUERGT3BlcmF0b3JOYW1lcyB8fCAoUERGT3BlcmF0b3JOYW1lcyA9IHt9KSk7XG5leHBvcnQgZGVmYXVsdCBQREZPcGVyYXRvck5hbWVzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT3BlcmF0b3JOYW1lcy5qcy5tYXAiLCJpbXBvcnQgeyBOdW1iZXJQYXJzaW5nRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBJc0RpZ2l0LCBJc051bWVyaWMgfSBmcm9tIFwiLi4vc3ludGF4L051bWVyaWNcIjtcbmltcG9ydCB7IElzV2hpdGVzcGFjZSB9IGZyb20gXCIuLi9zeW50YXgvV2hpdGVzcGFjZVwiO1xuaW1wb3J0IHsgY2hhckZyb21Db2RlIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgTmV3bGluZSA9IENoYXJDb2Rlcy5OZXdsaW5lLCBDYXJyaWFnZVJldHVybiA9IENoYXJDb2Rlcy5DYXJyaWFnZVJldHVybjtcbi8vIFRPRE86IFRocm93IGVycm9yIGlmIGVvZiBpcyByZWFjaGVkIGJlZm9yZSBmaW5pc2hpbmcgb2JqZWN0IHBhcnNlLi4uXG52YXIgQmFzZVBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCYXNlUGFyc2VyKGJ5dGVzLCBjYXBOdW1iZXJzKSB7XG4gICAgICAgIGlmIChjYXBOdW1iZXJzID09PSB2b2lkIDApIHsgY2FwTnVtYmVycyA9IGZhbHNlOyB9XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBieXRlcztcbiAgICAgICAgdGhpcy5jYXBOdW1iZXJzID0gY2FwTnVtYmVycztcbiAgICB9XG4gICAgQmFzZVBhcnNlci5wcm90b3R5cGUucGFyc2VSYXdJbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKCFJc0RpZ2l0W2J5dGVdKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdmFsdWUgKz0gY2hhckZyb21Db2RlKHRoaXMuYnl0ZXMubmV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbnVtYmVyVmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICBpZiAoIXZhbHVlIHx8ICFpc0Zpbml0ZShudW1iZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJQYXJzaW5nRXJyb3IodGhpcy5ieXRlcy5wb3NpdGlvbigpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bWJlclZhbHVlO1xuICAgIH07XG4gICAgLy8gVE9ETzogTWF5YmUgaGFuZGxlIGV4cG9uZW50aWFsIGZvcm1hdD9cbiAgICAvLyBUT0RPOiBDb21wYXJlIHBlcmZvcm1hbmNlIG9mIHN0cmluZyBjb25jYXRlbmF0aW9uIHRvIGNoYXJGcm9tQ29kZSguLi5ieXRlcylcbiAgICBCYXNlUGFyc2VyLnByb3RvdHlwZS5wYXJzZVJhd051bWJlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIC8vIFBhcnNlIGludGVnZXItcGFydCwgdGhlIGxlYWRpbmcgKCsgfCAtIHwgLiB8IDAtOSlcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIGlmICghSXNOdW1lcmljW2J5dGVdKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdmFsdWUgKz0gY2hhckZyb21Db2RlKHRoaXMuYnl0ZXMubmV4dCgpKTtcbiAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuUGVyaW9kKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhcnNlIGRlY2ltYWwtcGFydCwgdGhlIHRyYWlsaW5nICgwLTkpXG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoIUlzRGlnaXRbYnl0ZV0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB2YWx1ZSArPSBjaGFyRnJvbUNvZGUodGhpcy5ieXRlcy5uZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBudW1iZXJWYWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGlmICghdmFsdWUgfHwgIWlzRmluaXRlKG51bWJlclZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlclBhcnNpbmdFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtYmVyVmFsdWUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FwTnVtYmVycykge1xuICAgICAgICAgICAgICAgIHZhciBtc2cgPSBcIlBhcnNlZCBudW1iZXIgdGhhdCBpcyB0b28gbGFyZ2UgZm9yIHNvbWUgUERGIHJlYWRlcnM6IFwiICsgdmFsdWUgKyBcIiwgdXNpbmcgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgaW5zdGVhZC5cIjtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0gXCJQYXJzZWQgbnVtYmVyIHRoYXQgaXMgdG9vIGxhcmdlIGZvciBzb21lIFBERiByZWFkZXJzOiBcIiArIHZhbHVlICsgXCIsIG5vdCBjYXBwaW5nLlwiO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1iZXJWYWx1ZTtcbiAgICB9O1xuICAgIEJhc2VQYXJzZXIucHJvdG90eXBlLnNraXBXaGl0ZXNwYWNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpICYmIElzV2hpdGVzcGFjZVt0aGlzLmJ5dGVzLnBlZWsoKV0pIHtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNlUGFyc2VyLnByb3RvdHlwZS5za2lwTGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIGlmIChieXRlID09PSBOZXdsaW5lIHx8IGJ5dGUgPT09IENhcnJpYWdlUmV0dXJuKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNlUGFyc2VyLnByb3RvdHlwZS5za2lwQ29tbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuYnl0ZXMucGVlaygpICE9PSBDaGFyQ29kZXMuUGVyY2VudClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIGlmIChieXRlID09PSBOZXdsaW5lIHx8IGJ5dGUgPT09IENhcnJpYWdlUmV0dXJuKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBCYXNlUGFyc2VyLnByb3RvdHlwZS5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlKCk7XG4gICAgICAgIHdoaWxlICh0aGlzLnNraXBDb21tZW50KCkpXG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlKCk7XG4gICAgfTtcbiAgICBCYXNlUGFyc2VyLnByb3RvdHlwZS5tYXRjaEtleXdvcmQgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuICAgICAgICB2YXIgaW5pdGlhbE9mZnNldCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGtleXdvcmQubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ieXRlcy5kb25lKCkgfHwgdGhpcy5ieXRlcy5uZXh0KCkgIT09IGtleXdvcmRbaWR4XSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKGluaXRpYWxPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBCYXNlUGFyc2VyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEJhc2VQYXJzZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXNlUGFyc2VyLmpzLm1hcCIsImltcG9ydCB7IE5leHRCeXRlQXNzZXJ0aW9uRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBkZWNvZGVQREZSYXdTdHJlYW0gfSBmcm9tIFwiLi4vc3RyZWFtcy9kZWNvZGVcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbi8vIFRPRE86IFNlZSBob3cgbGluZS9jb2wgdHJhY2tpbmcgYWZmZWN0cyBwZXJmb3JtYW5jZVxudmFyIEJ5dGVTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnl0ZVN0cmVhbShieXRlcykge1xuICAgICAgICB0aGlzLmlkeCA9IDA7XG4gICAgICAgIHRoaXMubGluZSA9IDA7XG4gICAgICAgIHRoaXMuY29sdW1uID0gMDtcbiAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnl0ZXMubGVuZ3RoO1xuICAgIH1cbiAgICBCeXRlU3RyZWFtLnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuaWR4ID0gb2Zmc2V0O1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzW3RoaXMuaWR4KytdO1xuICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLk5ld2xpbmUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZSArPSAxO1xuICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW4gKz0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZTtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLmFzc2VydE5leHQgPSBmdW5jdGlvbiAoZXhwZWN0ZWQpIHtcbiAgICAgICAgaWYgKHRoaXMucGVlaygpICE9PSBleHBlY3RlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5leHRCeXRlQXNzZXJ0aW9uRXJyb3IodGhpcy5wb3NpdGlvbigpLCBleHBlY3RlZCwgdGhpcy5wZWVrKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMuaWR4XTtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLnBlZWtBaGVhZCA9IGZ1bmN0aW9uIChzdGVwcykge1xuICAgICAgICByZXR1cm4gdGhpcy5ieXRlc1t0aGlzLmlkeCArIHN0ZXBzXTtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLnBlZWtBdCA9IGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXNbb2Zmc2V0XTtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLmRvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkeCA+PSB0aGlzLmxlbmd0aDtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWR4O1xuICAgIH07XG4gICAgQnl0ZVN0cmVhbS5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ieXRlcy5zbGljZShzdGFydCwgZW5kKTtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ucHJvdG90eXBlLnBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4geyBsaW5lOiB0aGlzLmxpbmUsIGNvbHVtbjogdGhpcy5jb2x1bW4sIG9mZnNldDogdGhpcy5pZHggfTtcbiAgICB9O1xuICAgIEJ5dGVTdHJlYW0ub2YgPSBmdW5jdGlvbiAoYnl0ZXMpIHsgcmV0dXJuIG5ldyBCeXRlU3RyZWFtKGJ5dGVzKTsgfTtcbiAgICBCeXRlU3RyZWFtLmZyb21QREZSYXdTdHJlYW0gPSBmdW5jdGlvbiAocmF3U3RyZWFtKSB7XG4gICAgICAgIHJldHVybiBCeXRlU3RyZWFtLm9mKGRlY29kZVBERlJhd1N0cmVhbShyYXdTdHJlYW0pLmRlY29kZSgpKTtcbiAgICB9O1xuICAgIHJldHVybiBCeXRlU3RyZWFtO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEJ5dGVTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CeXRlU3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUERGT2JqZWN0UGFyc2luZ0Vycm9yLCBQREZTdHJlYW1QYXJzaW5nRXJyb3IsIFVuYmFsYW5jZWRQYXJlbnRoZXNpc0Vycm9yLCB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZBcnJheSBmcm9tIFwiLi4vb2JqZWN0cy9QREZBcnJheVwiO1xuaW1wb3J0IFBERkJvb2wgZnJvbSBcIi4uL29iamVjdHMvUERGQm9vbFwiO1xuaW1wb3J0IFBERkRpY3QgZnJvbSBcIi4uL29iamVjdHMvUERGRGljdFwiO1xuaW1wb3J0IFBERkhleFN0cmluZyBmcm9tIFwiLi4vb2JqZWN0cy9QREZIZXhTdHJpbmdcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdWxsIGZyb20gXCIuLi9vYmplY3RzL1BERk51bGxcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGUmF3U3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlJhd1N0cmVhbVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBQREZTdHJpbmcgZnJvbSBcIi4uL29iamVjdHMvUERGU3RyaW5nXCI7XG5pbXBvcnQgQmFzZVBhcnNlciBmcm9tIFwiLi9CYXNlUGFyc2VyXCI7XG5pbXBvcnQgQnl0ZVN0cmVhbSBmcm9tIFwiLi9CeXRlU3RyZWFtXCI7XG5pbXBvcnQgUERGQ2F0YWxvZyBmcm9tIFwiLi4vc3RydWN0dXJlcy9QREZDYXRhbG9nXCI7XG5pbXBvcnQgUERGUGFnZUxlYWYgZnJvbSBcIi4uL3N0cnVjdHVyZXMvUERGUGFnZUxlYWZcIjtcbmltcG9ydCBQREZQYWdlVHJlZSBmcm9tIFwiLi4vc3RydWN0dXJlcy9QREZQYWdlVHJlZVwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xuaW1wb3J0IHsgSXNEZWxpbWl0ZXIgfSBmcm9tIFwiLi4vc3ludGF4L0RlbGltaXRlcnNcIjtcbmltcG9ydCB7IEtleXdvcmRzIH0gZnJvbSBcIi4uL3N5bnRheC9LZXl3b3Jkc1wiO1xuaW1wb3J0IHsgSXNEaWdpdCwgSXNOdW1lcmljIH0gZnJvbSBcIi4uL3N5bnRheC9OdW1lcmljXCI7XG5pbXBvcnQgeyBJc1doaXRlc3BhY2UgfSBmcm9tIFwiLi4vc3ludGF4L1doaXRlc3BhY2VcIjtcbmltcG9ydCB7IGNoYXJGcm9tQ29kZSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLy8gVE9ETzogVGhyb3cgZXJyb3IgaWYgZW9mIGlzIHJlYWNoZWQgYmVmb3JlIGZpbmlzaGluZyBvYmplY3QgcGFyc2UuLi5cbnZhciBQREZPYmplY3RQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERk9iamVjdFBhcnNlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZPYmplY3RQYXJzZXIoYnl0ZVN0cmVhbSwgY29udGV4dCwgY2FwTnVtYmVycykge1xuICAgICAgICBpZiAoY2FwTnVtYmVycyA9PT0gdm9pZCAwKSB7IGNhcE51bWJlcnMgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBieXRlU3RyZWFtLCBjYXBOdW1iZXJzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyBUT0RPOiBJcyBpdCBwb3NzaWJsZSB0byByZWR1Y2UgZHVwbGljYXRlIHBhcnNpbmcgZm9yIHJlZiBsb29rYWhlYWRzP1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMudHJ1ZSkpXG4gICAgICAgICAgICByZXR1cm4gUERGQm9vbC5UcnVlO1xuICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZmFsc2UpKVxuICAgICAgICAgICAgcmV0dXJuIFBERkJvb2wuRmFsc2U7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5udWxsKSlcbiAgICAgICAgICAgIHJldHVybiBQREZOdWxsO1xuICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkxlc3NUaGFuICYmXG4gICAgICAgICAgICB0aGlzLmJ5dGVzLnBlZWtBaGVhZCgxKSA9PT0gQ2hhckNvZGVzLkxlc3NUaGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURpY3RPclN0cmVhbSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTGVzc1RoYW4pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUhleFN0cmluZygpO1xuICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLkxlZnRQYXJlbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU3RyaW5nKCk7XG4gICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuRm9yd2FyZFNsYXNoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VOYW1lKCk7XG4gICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuTGVmdFNxdWFyZUJyYWNrZXQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUFycmF5KCk7XG4gICAgICAgIGlmIChJc051bWVyaWNbYnl0ZV0pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU51bWJlck9yUmVmKCk7XG4gICAgICAgIHRocm93IG5ldyBQREZPYmplY3RQYXJzaW5nRXJyb3IodGhpcy5ieXRlcy5wb3NpdGlvbigpLCBieXRlKTtcbiAgICB9O1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VOdW1iZXJPclJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZpcnN0TnVtID0gdGhpcy5wYXJzZVJhd051bWJlcigpO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIGxvb2thaGVhZFN0YXJ0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgaWYgKElzRGlnaXRbdGhpcy5ieXRlcy5wZWVrKCldKSB7XG4gICAgICAgICAgICB2YXIgc2Vjb25kTnVtID0gdGhpcy5wYXJzZVJhd051bWJlcigpO1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5ieXRlcy5wZWVrKCkgPT09IENoYXJDb2Rlcy5SKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5SKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUERGUmVmLm9mKGZpcnN0TnVtLCBzZWNvbmROdW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKGxvb2thaGVhZFN0YXJ0KTtcbiAgICAgICAgcmV0dXJuIFBERk51bWJlci5vZihmaXJzdE51bSk7XG4gICAgfTtcbiAgICAvLyBUT0RPOiBNYXliZSB1cGRhdGUgUERGSGV4U3RyaW5nLm9mKCkgbG9naWMgdG8gcmVtb3ZlIHdoaXRlc3BhY2UgYW5kIHZhbGlkYXRlIGlucHV0P1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VIZXhTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkxlc3NUaGFuKTtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSAmJiB0aGlzLmJ5dGVzLnBlZWsoKSAhPT0gQ2hhckNvZGVzLkdyZWF0ZXJUaGFuKSB7XG4gICAgICAgICAgICB2YWx1ZSArPSBjaGFyRnJvbUNvZGUodGhpcy5ieXRlcy5uZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuR3JlYXRlclRoYW4pO1xuICAgICAgICByZXR1cm4gUERGSGV4U3RyaW5nLm9mKHZhbHVlKTtcbiAgICB9O1xuICAgIFBERk9iamVjdFBhcnNlci5wcm90b3R5cGUucGFyc2VTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBuZXN0aW5nTHZsID0gMDtcbiAgICAgICAgdmFyIGlzRXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgICAgIHZhbHVlICs9IGNoYXJGcm9tQ29kZShieXRlKTtcbiAgICAgICAgICAgIC8vIENoZWNrIGZvciB1bmVzY2FwZWQgcGFyZW50aGVzaXNcbiAgICAgICAgICAgIGlmICghaXNFc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5MZWZ0UGFyZW4pXG4gICAgICAgICAgICAgICAgICAgIG5lc3RpbmdMdmwgKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PT0gQ2hhckNvZGVzLlJpZ2h0UGFyZW4pXG4gICAgICAgICAgICAgICAgICAgIG5lc3RpbmdMdmwgLT0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgY3VycmVudCBjaGFyYWN0ZXIgaXMgYmVpbmcgZXNjYXBlZCBvciBub3RcbiAgICAgICAgICAgIGlmIChieXRlID09PSBDaGFyQ29kZXMuQmFja1NsYXNoKSB7XG4gICAgICAgICAgICAgICAgaXNFc2NhcGVkID0gIWlzRXNjYXBlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRXNjYXBlZCkge1xuICAgICAgICAgICAgICAgIGlzRXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT25jZSAoaWYpIHRoZSB1bmVzY2FwZWQgcGFyZW50aGVzaXMgYmFsYW5jZSBvdXQsIHJldHVybiB0aGVpciBjb250ZW50c1xuICAgICAgICAgICAgaWYgKG5lc3RpbmdMdmwgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG91dGVyIHBhcmVucyBzbyB0aGV5IGFyZW4ndCBwYXJ0IG9mIHRoZSBjb250ZW50c1xuICAgICAgICAgICAgICAgIHJldHVybiBQREZTdHJpbmcub2YodmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgVW5iYWxhbmNlZFBhcmVudGhlc2lzRXJyb3IodGhpcy5ieXRlcy5wb3NpdGlvbigpKTtcbiAgICB9O1xuICAgIC8vIFRPRE86IENvbXBhcmUgcGVyZm9ybWFuY2Ugb2Ygc3RyaW5nIGNvbmNhdGVuYXRpb24gdG8gY2hhckZyb21Db2RlKC4uLmJ5dGVzKVxuICAgIC8vIFRPRE86IE1heWJlIHByZWFsbG9jYXRlIHNtYWxsIFVpbnQ4QXJyYXkgaWYgY2FuIHVzZSBjaGFyRnJvbUNvZGU/XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZU5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuRm9yd2FyZFNsYXNoKTtcbiAgICAgICAgdmFyIG5hbWUgPSAnJztcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSB0aGlzLmJ5dGVzLnBlZWsoKTtcbiAgICAgICAgICAgIGlmIChJc1doaXRlc3BhY2VbYnl0ZV0gfHwgSXNEZWxpbWl0ZXJbYnl0ZV0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBuYW1lICs9IGNoYXJGcm9tQ29kZShieXRlKTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQREZOYW1lLm9mKG5hbWUpO1xuICAgIH07XG4gICAgUERGT2JqZWN0UGFyc2VyLnByb3RvdHlwZS5wYXJzZUFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmJ5dGVzLmFzc2VydE5leHQoQ2hhckNvZGVzLkxlZnRTcXVhcmVCcmFja2V0KTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBwZGZBcnJheSA9IFBERkFycmF5LndpdGhDb250ZXh0KHRoaXMuY29udGV4dCk7XG4gICAgICAgIHdoaWxlICh0aGlzLmJ5dGVzLnBlZWsoKSAhPT0gQ2hhckNvZGVzLlJpZ2h0U3F1YXJlQnJhY2tldCkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLnBhcnNlT2JqZWN0KCk7XG4gICAgICAgICAgICBwZGZBcnJheS5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5SaWdodFNxdWFyZUJyYWNrZXQpO1xuICAgICAgICByZXR1cm4gcGRmQXJyYXk7XG4gICAgfTtcbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5MZXNzVGhhbik7XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuTGVzc1RoYW4pO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIGRpY3QgPSBuZXcgTWFwKCk7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkgJiZcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMucGVlaygpICE9PSBDaGFyQ29kZXMuR3JlYXRlclRoYW4gJiZcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMucGVla0FoZWFkKDEpICE9PSBDaGFyQ29kZXMuR3JlYXRlclRoYW4pIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLnBhcnNlTmFtZSgpO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5wYXJzZU9iamVjdCgpO1xuICAgICAgICAgICAgZGljdC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5HcmVhdGVyVGhhbik7XG4gICAgICAgIHRoaXMuYnl0ZXMuYXNzZXJ0TmV4dChDaGFyQ29kZXMuR3JlYXRlclRoYW4pO1xuICAgICAgICB2YXIgVHlwZSA9IGRpY3QuZ2V0KFBERk5hbWUub2YoJ1R5cGUnKSk7XG4gICAgICAgIGlmIChUeXBlID09PSBQREZOYW1lLm9mKCdDYXRhbG9nJykpIHtcbiAgICAgICAgICAgIHJldHVybiBQREZDYXRhbG9nLmZyb21NYXBXaXRoQ29udGV4dChkaWN0LCB0aGlzLmNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFR5cGUgPT09IFBERk5hbWUub2YoJ1BhZ2VzJykpIHtcbiAgICAgICAgICAgIHJldHVybiBQREZQYWdlVHJlZS5mcm9tTWFwV2l0aENvbnRleHQoZGljdCwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChUeXBlID09PSBQREZOYW1lLm9mKCdQYWdlJykpIHtcbiAgICAgICAgICAgIHJldHVybiBQREZQYWdlTGVhZi5mcm9tTWFwV2l0aENvbnRleHQoZGljdCwgdGhpcy5jb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQREZEaWN0LmZyb21NYXBXaXRoQ29udGV4dChkaWN0LCB0aGlzLmNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLnBhcnNlRGljdE9yU3RyZWFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLmJ5dGVzLnBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBkaWN0ID0gdGhpcy5wYXJzZURpY3QoKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RyZWFtRU9GMSkgJiZcbiAgICAgICAgICAgICF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdHJlYW1FT0YyKSAmJlxuICAgICAgICAgICAgIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnN0cmVhbUVPRjMpICYmXG4gICAgICAgICAgICAhdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RyZWFtRU9GNCkgJiZcbiAgICAgICAgICAgICF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdHJlYW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZGljdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICB2YXIgZW5kO1xuICAgICAgICB2YXIgTGVuZ3RoID0gZGljdC5nZXQoUERGTmFtZS5vZignTGVuZ3RoJykpO1xuICAgICAgICBpZiAoTGVuZ3RoIGluc3RhbmNlb2YgUERGTnVtYmVyKSB7XG4gICAgICAgICAgICBlbmQgPSBzdGFydCArIExlbmd0aC5hc051bWJlcigpO1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8oZW5kKTtcbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lbmRzdHJlYW0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8oc3RhcnQpO1xuICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuZmluZEVuZE9mU3RyZWFtRmFsbGJhY2soc3RhcnRQb3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5kID0gdGhpcy5maW5kRW5kT2ZTdHJlYW1GYWxsYmFjayhzdGFydFBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnRlbnRzID0gdGhpcy5ieXRlcy5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgcmV0dXJuIFBERlJhd1N0cmVhbS5vZihkaWN0LCBjb250ZW50cyk7XG4gICAgfTtcbiAgICBQREZPYmplY3RQYXJzZXIucHJvdG90eXBlLmZpbmRFbmRPZlN0cmVhbUZhbGxiYWNrID0gZnVuY3Rpb24gKHN0YXJ0UG9zKSB7XG4gICAgICAgIC8vIE1vdmUgdG8gZW5kIG9mIHN0cmVhbSwgd2hpbGUgaGFuZGxpbmcgbmVzdGVkIHN0cmVhbXNcbiAgICAgICAgdmFyIG5lc3RpbmdMdmwgPSAxO1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgZW5kID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdHJlYW0pKSB7XG4gICAgICAgICAgICAgICAgbmVzdGluZ0x2bCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuRU9GMWVuZHN0cmVhbSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5FT0YyZW5kc3RyZWFtKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLkVPRjNlbmRzdHJlYW0pIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZW5kc3RyZWFtKSkge1xuICAgICAgICAgICAgICAgIG5lc3RpbmdMdmwgLT0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5lc3RpbmdMdmwgPT09IDApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lc3RpbmdMdmwgIT09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUERGU3RyZWFtUGFyc2luZ0Vycm9yKHN0YXJ0UG9zKTtcbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICB9O1xuICAgIFBERk9iamVjdFBhcnNlci5mb3JCeXRlcyA9IGZ1bmN0aW9uIChieXRlcywgY29udGV4dCwgY2FwTnVtYmVycykgeyByZXR1cm4gbmV3IFBERk9iamVjdFBhcnNlcihCeXRlU3RyZWFtLm9mKGJ5dGVzKSwgY29udGV4dCwgY2FwTnVtYmVycyk7IH07XG4gICAgUERGT2JqZWN0UGFyc2VyLmZvckJ5dGVTdHJlYW0gPSBmdW5jdGlvbiAoYnl0ZVN0cmVhbSwgY29udGV4dCwgY2FwTnVtYmVycykge1xuICAgICAgICBpZiAoY2FwTnVtYmVycyA9PT0gdm9pZCAwKSB7IGNhcE51bWJlcnMgPSBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gbmV3IFBERk9iamVjdFBhcnNlcihieXRlU3RyZWFtLCBjb250ZXh0LCBjYXBOdW1iZXJzKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZPYmplY3RQYXJzZXI7XG59KEJhc2VQYXJzZXIpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9iamVjdFBhcnNlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9iamVjdFBhcnNlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZXh0ZW5kcywgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFJlcGFyc2VFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IEJ5dGVTdHJlYW0gZnJvbSBcIi4vQnl0ZVN0cmVhbVwiO1xuaW1wb3J0IFBERk9iamVjdFBhcnNlciBmcm9tIFwiLi9QREZPYmplY3RQYXJzZXJcIjtcbmltcG9ydCB7IHdhaXRGb3JUaWNrIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG52YXIgUERGT2JqZWN0U3RyZWFtUGFyc2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZPYmplY3RTdHJlYW1QYXJzZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGT2JqZWN0U3RyZWFtUGFyc2VyKHJhd1N0cmVhbSwgc2hvdWxkV2FpdEZvclRpY2spIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgQnl0ZVN0cmVhbS5mcm9tUERGUmF3U3RyZWFtKHJhd1N0cmVhbSksIHJhd1N0cmVhbS5kaWN0LmNvbnRleHQpIHx8IHRoaXM7XG4gICAgICAgIHZhciBkaWN0ID0gcmF3U3RyZWFtLmRpY3Q7XG4gICAgICAgIF90aGlzLmFscmVhZHlQYXJzZWQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuc2hvdWxkV2FpdEZvclRpY2sgPSBzaG91bGRXYWl0Rm9yVGljayB8fCAoZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH0pO1xuICAgICAgICBfdGhpcy5maXJzdE9mZnNldCA9IGRpY3QubG9va3VwKFBERk5hbWUub2YoJ0ZpcnN0JyksIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgX3RoaXMub2JqZWN0Q291bnQgPSBkaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdOJyksIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZPYmplY3RTdHJlYW1QYXJzZXIucHJvdG90eXBlLnBhcnNlSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXRzQW5kT2JqZWN0TnVtYmVycywgaWR4LCBsZW4sIF9hLCBvYmplY3ROdW1iZXIsIG9mZnNldCwgb2JqZWN0LCByZWY7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHJlYWR5UGFyc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlcGFyc2VFcnJvcignUERGT2JqZWN0U3RyZWFtUGFyc2VyJywgJ3BhcnNlSW50b0NvbnRleHQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxyZWFkeVBhcnNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzQW5kT2JqZWN0TnVtYmVycyA9IHRoaXMucGFyc2VPZmZzZXRzQW5kT2JqZWN0TnVtYmVycygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gMCwgbGVuID0gb2Zmc2V0c0FuZE9iamVjdE51bWJlcnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpZHggPCBsZW4pKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gb2Zmc2V0c0FuZE9iamVjdE51bWJlcnNbaWR4XSwgb2JqZWN0TnVtYmVyID0gX2Eub2JqZWN0TnVtYmVyLCBvZmZzZXQgPSBfYS5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzLm1vdmVUbyh0aGlzLmZpcnN0T2Zmc2V0ICsgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IHRoaXMucGFyc2VPYmplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IFBERlJlZi5vZihvYmplY3ROdW1iZXIsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFzc2lnbihyZWYsIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEZvclRpY2soKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB3YWl0Rm9yVGljaygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW1QYXJzZXIucHJvdG90eXBlLnBhcnNlT2Zmc2V0c0FuZE9iamVjdE51bWJlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvZmZzZXRzQW5kT2JqZWN0TnVtYmVycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0aGlzLm9iamVjdENvdW50OyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgIHZhciBvYmplY3ROdW1iZXIgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgICAgICBvZmZzZXRzQW5kT2JqZWN0TnVtYmVycy5wdXNoKHsgb2JqZWN0TnVtYmVyOiBvYmplY3ROdW1iZXIsIG9mZnNldDogb2Zmc2V0IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZmZzZXRzQW5kT2JqZWN0TnVtYmVycztcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbVBhcnNlci5mb3JTdHJlYW0gPSBmdW5jdGlvbiAocmF3U3RyZWFtLCBzaG91bGRXYWl0Rm9yVGljaykgeyByZXR1cm4gbmV3IFBERk9iamVjdFN0cmVhbVBhcnNlcihyYXdTdHJlYW0sIHNob3VsZFdhaXRGb3JUaWNrKTsgfTtcbiAgICByZXR1cm4gUERGT2JqZWN0U3RyZWFtUGFyc2VyO1xufShQREZPYmplY3RQYXJzZXIpKTtcbmV4cG9ydCBkZWZhdWx0IFBERk9iamVjdFN0cmVhbVBhcnNlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERk9iamVjdFN0cmVhbVBhcnNlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZXh0ZW5kcywgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZDcm9zc1JlZlNlY3Rpb24gZnJvbSBcIi4uL2RvY3VtZW50L1BERkNyb3NzUmVmU2VjdGlvblwiO1xuaW1wb3J0IFBERkhlYWRlciBmcm9tIFwiLi4vZG9jdW1lbnQvUERGSGVhZGVyXCI7XG5pbXBvcnQgUERGVHJhaWxlciBmcm9tIFwiLi4vZG9jdW1lbnQvUERGVHJhaWxlclwiO1xuaW1wb3J0IHsgTWlzc2luZ0tleXdvcmRFcnJvciwgTWlzc2luZ1BERkhlYWRlckVycm9yLCBQREZJbnZhbGlkT2JqZWN0UGFyc2luZ0Vycm9yLCBSZXBhcnNlRXJyb3IsIFN0YWxsZWRQYXJzZXJFcnJvciwgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGSW52YWxpZE9iamVjdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZJbnZhbGlkT2JqZWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGUmF3U3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlJhd1N0cmVhbVwiO1xuaW1wb3J0IFBERlJlZiBmcm9tIFwiLi4vb2JqZWN0cy9QREZSZWZcIjtcbmltcG9ydCBCeXRlU3RyZWFtIGZyb20gXCIuL0J5dGVTdHJlYW1cIjtcbmltcG9ydCBQREZPYmplY3RQYXJzZXIgZnJvbSBcIi4vUERGT2JqZWN0UGFyc2VyXCI7XG5pbXBvcnQgUERGT2JqZWN0U3RyZWFtUGFyc2VyIGZyb20gXCIuL1BERk9iamVjdFN0cmVhbVBhcnNlclwiO1xuaW1wb3J0IFBERlhSZWZTdHJlYW1QYXJzZXIgZnJvbSBcIi4vUERGWFJlZlN0cmVhbVBhcnNlclwiO1xuaW1wb3J0IFBERkNvbnRleHQgZnJvbSBcIi4uL1BERkNvbnRleHRcIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IEtleXdvcmRzIH0gZnJvbSBcIi4uL3N5bnRheC9LZXl3b3Jkc1wiO1xuaW1wb3J0IHsgSXNEaWdpdCB9IGZyb20gXCIuLi9zeW50YXgvTnVtZXJpY1wiO1xuaW1wb3J0IHsgd2FpdEZvclRpY2sgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlBhcnNlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQREZQYXJzZXIocGRmQnl0ZXMsIG9iamVjdHNQZXJUaWNrLCB0aHJvd09uSW52YWxpZE9iamVjdCwgY2FwTnVtYmVycykge1xuICAgICAgICBpZiAob2JqZWN0c1BlclRpY2sgPT09IHZvaWQgMCkgeyBvYmplY3RzUGVyVGljayA9IEluZmluaXR5OyB9XG4gICAgICAgIGlmICh0aHJvd09uSW52YWxpZE9iamVjdCA9PT0gdm9pZCAwKSB7IHRocm93T25JbnZhbGlkT2JqZWN0ID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKGNhcE51bWJlcnMgPT09IHZvaWQgMCkgeyBjYXBOdW1iZXJzID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgQnl0ZVN0cmVhbS5vZihwZGZCeXRlcyksIFBERkNvbnRleHQuY3JlYXRlKCksIGNhcE51bWJlcnMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmFscmVhZHlQYXJzZWQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMucGFyc2VkT2JqZWN0cyA9IDA7XG4gICAgICAgIF90aGlzLnNob3VsZFdhaXRGb3JUaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMucGFyc2VkT2JqZWN0cyArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnBhcnNlZE9iamVjdHMgJSBfdGhpcy5vYmplY3RzUGVyVGljayA9PT0gMDtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMub2JqZWN0c1BlclRpY2sgPSBvYmplY3RzUGVyVGljaztcbiAgICAgICAgX3RoaXMudGhyb3dPbkludmFsaWRPYmplY3QgPSB0aHJvd09uSW52YWxpZE9iamVjdDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnBhcnNlRG9jdW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwcmV2T2Zmc2V0LCBvZmZzZXQ7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHJlYWR5UGFyc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlcGFyc2VFcnJvcignUERGUGFyc2VyJywgJ3BhcnNlRG9jdW1lbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxyZWFkeVBhcnNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaGVhZGVyID0gdGhpcy5wYXJzZUhlYWRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLmJ5dGVzLmRvbmUoKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLnBhcnNlRG9jdW1lbnRTZWN0aW9uKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gcHJldk9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdGFsbGVkUGFyc2VyRXJyb3IodGhpcy5ieXRlcy5wb3NpdGlvbigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXliZVJlY292ZXJSb290KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0Lmxvb2t1cChQREZSZWYub2YoMCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZW1vdmluZyBwYXJzZWQgb2JqZWN0OiAwIDAgUicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5kZWxldGUoUERGUmVmLm9mKDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB0aGlzLmNvbnRleHRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUubWF5YmVSZWNvdmVyUm9vdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlzVmFsaWRDYXRhbG9nID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFBERkRpY3QgJiZcbiAgICAgICAgICAgICAgICBvYmoubG9va3VwKFBERk5hbWUub2YoJ1R5cGUnKSkgPT09IFBERk5hbWUub2YoJ0NhdGFsb2cnKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGNhdGFsb2cgPSB0aGlzLmNvbnRleHQubG9va3VwKHRoaXMuY29udGV4dC50cmFpbGVySW5mby5Sb290KTtcbiAgICAgICAgaWYgKCFpc1ZhbGlkQ2F0YWxvZyhjYXRhbG9nKSkge1xuICAgICAgICAgICAgdmFyIGluZGlyZWN0T2JqZWN0cyA9IHRoaXMuY29udGV4dC5lbnVtZXJhdGVJbmRpcmVjdE9iamVjdHMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGluZGlyZWN0T2JqZWN0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBpbmRpcmVjdE9iamVjdHNbaWR4XSwgcmVmID0gX2FbMF0sIG9iamVjdCA9IF9hWzFdO1xuICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkQ2F0YWxvZyhvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC50cmFpbGVySW5mby5Sb290ID0gcmVmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5wYXJzZUhlYWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmhlYWRlcikpIHtcbiAgICAgICAgICAgICAgICB2YXIgbWFqb3IgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5hc3NlcnROZXh0KENoYXJDb2Rlcy5QZXJpb2QpO1xuICAgICAgICAgICAgICAgIHZhciBtaW5vciA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyID0gUERGSGVhZGVyLmZvclZlcnNpb24obWFqb3IsIG1pbm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXBCaW5hcnlIZWFkZXJDb21tZW50KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBNaXNzaW5nUERGSGVhZGVyRXJyb3IodGhpcy5ieXRlcy5wb3NpdGlvbigpKTtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUucGFyc2VJbmRpcmVjdE9iamVjdEhlYWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBvYmplY3ROdW1iZXIgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB2YXIgZ2VuZXJhdGlvbk51bWJlciA9IHRoaXMucGFyc2VSYXdJbnQoKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMub2JqKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdLZXl3b3JkRXJyb3IodGhpcy5ieXRlcy5wb3NpdGlvbigpLCBLZXl3b3Jkcy5vYmopO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQREZSZWYub2Yob2JqZWN0TnVtYmVyLCBnZW5lcmF0aW9uTnVtYmVyKTtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUubWF0Y2hJbmRpcmVjdE9iamVjdEhlYWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluaXRpYWxPZmZzZXQgPSB0aGlzLmJ5dGVzLm9mZnNldCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wYXJzZUluZGlyZWN0T2JqZWN0SGVhZGVyKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8oaW5pdGlhbE9mZnNldCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUucGFyc2VJbmRpcmVjdE9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlZiwgb2JqZWN0O1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gdGhpcy5wYXJzZUluZGlyZWN0T2JqZWN0SGVhZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IHRoaXMucGFyc2VPYmplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5lbmRvYmopKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBuZXcgTWlzc2luZ0tleXdvcmRFcnJvcih0aGlzLmJ5dGVzLnBvc2l0aW9uKCksIEtleXdvcmRzLmVuZG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBMb2cgYSB3YXJuaW5nIGlmIHRoaXMgZmFpbHMuLi5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVuZG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQREZSYXdTdHJlYW0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZGljdC5sb29rdXAoUERGTmFtZS5vZignVHlwZScpKSA9PT0gUERGTmFtZS5vZignT2JqU3RtJykpKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFBERk9iamVjdFN0cmVhbVBhcnNlci5mb3JTdHJlYW0ob2JqZWN0LCB0aGlzLnNob3VsZFdhaXRGb3JUaWNrKS5wYXJzZUludG9Db250ZXh0KCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBERlJhd1N0cmVhbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5kaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdUeXBlJykpID09PSBQREZOYW1lLm9mKCdYUmVmJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZYUmVmU3RyZWFtUGFyc2VyLmZvclN0cmVhbShvYmplY3QpLnBhcnNlSW50b0NvbnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hc3NpZ24ocmVmLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovLCByZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIFRPRE86IEltcHJvdmUgYW5kIGNsZWFuIHRoaXMgdXBcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnRyeVRvUGFyc2VJbnZhbGlkSW5kaXJlY3RPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMuYnl0ZXMucG9zaXRpb24oKTtcbiAgICAgICAgdmFyIG1zZyA9IFwiVHJ5aW5nIHRvIHBhcnNlIGludmFsaWQgb2JqZWN0OiBcIiArIEpTT04uc3RyaW5naWZ5KHN0YXJ0UG9zKSArIFwiKVwiO1xuICAgICAgICBpZiAodGhpcy50aHJvd09uSW52YWxpZE9iamVjdClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgICAgdmFyIHJlZiA9IHRoaXMucGFyc2VJbmRpcmVjdE9iamVjdEhlYWRlcigpO1xuICAgICAgICBjb25zb2xlLndhcm4oXCJJbnZhbGlkIG9iamVjdCByZWY6IFwiICsgcmVmKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuYnl0ZXMub2Zmc2V0KCk7XG4gICAgICAgIHZhciBmYWlsZWQgPSB0cnVlO1xuICAgICAgICB3aGlsZSAoIXRoaXMuYnl0ZXMuZG9uZSgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZW5kb2JqKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmYWlsZWQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmFpbGVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFBERkludmFsaWRPYmplY3RQYXJzaW5nRXJyb3Ioc3RhcnRQb3MpO1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5ieXRlcy5vZmZzZXQoKSAtIEtleXdvcmRzLmVuZG9iai5sZW5ndGg7XG4gICAgICAgIHZhciBvYmplY3QgPSBQREZJbnZhbGlkT2JqZWN0Lm9mKHRoaXMuYnl0ZXMuc2xpY2Uoc3RhcnQsIGVuZCkpO1xuICAgICAgICB0aGlzLmNvbnRleHQuYXNzaWduKHJlZiwgb2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIHJlZjtcbiAgICB9O1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUucGFyc2VJbmRpcmVjdE9iamVjdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpbml0aWFsT2Zmc2V0LCBlXzE7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoIXRoaXMuYnl0ZXMuZG9uZSgpICYmIElzRGlnaXRbdGhpcy5ieXRlcy5wZWVrKCldKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsT2Zmc2V0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsyLCA0LCAsIDVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucGFyc2VJbmRpcmVjdE9iamVjdCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGVfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFkZCB0cmFjaW5nL2xvZ2dpbmcgbWVjaGFuaXNtIHRvIHRyYWNrIHdoZW4gdGhpcyBoYXBwZW5zIVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8oaW5pdGlhbE9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeVRvUGFyc2VJbnZhbGlkSW5kaXJlY3RPYmplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IENhbiB0aGlzIGJlIGRvbmUgb25seSB3aGVuIG5lZWRlZCwgdG8gYXZvaWQgaGFybWluZyBwZXJmb3JtYW5jZT9cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcEppYmJlcmlzaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZFdhaXRGb3JUaWNrKCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2FpdEZvclRpY2soKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5tYXliZVBhcnNlQ3Jvc3NSZWZTZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy54cmVmKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBvYmplY3ROdW1iZXIgPSAtMTtcbiAgICAgICAgdmFyIHhyZWYgPSBQREZDcm9zc1JlZlNlY3Rpb24uY3JlYXRlRW1wdHkoKTtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmJ5dGVzLmRvbmUoKSAmJiBJc0RpZ2l0W3RoaXMuYnl0ZXMucGVlaygpXSkge1xuICAgICAgICAgICAgdmFyIGZpcnN0SW50ID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICB2YXIgc2Vjb25kSW50ID0gdGhpcy5wYXJzZVJhd0ludCgpO1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IHRoaXMuYnl0ZXMucGVlaygpO1xuICAgICAgICAgICAgaWYgKGJ5dGUgPT09IENoYXJDb2Rlcy5uIHx8IGJ5dGUgPT09IENoYXJDb2Rlcy5mKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZiA9IFBERlJlZi5vZihvYmplY3ROdW1iZXIsIHNlY29uZEludCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnl0ZXMubmV4dCgpID09PSBDaGFyQ29kZXMubikge1xuICAgICAgICAgICAgICAgICAgICB4cmVmLmFkZEVudHJ5KHJlZiwgZmlyc3RJbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5jb250ZXh0LmRlbGV0ZShyZWYpO1xuICAgICAgICAgICAgICAgICAgICB4cmVmLmFkZERlbGV0ZWRFbnRyeShyZWYsIGZpcnN0SW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2JqZWN0TnVtYmVyICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmplY3ROdW1iZXIgPSBmaXJzdEludDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4cmVmO1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5tYXliZVBhcnNlVHJhaWxlckRpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLnRyYWlsZXIpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdmFyIGRpY3QgPSB0aGlzLnBhcnNlRGljdCgpO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgY29udGV4dC50cmFpbGVySW5mbyA9IHtcbiAgICAgICAgICAgIFJvb3Q6IGRpY3QuZ2V0KFBERk5hbWUub2YoJ1Jvb3QnKSkgfHwgY29udGV4dC50cmFpbGVySW5mby5Sb290LFxuICAgICAgICAgICAgRW5jcnlwdDogZGljdC5nZXQoUERGTmFtZS5vZignRW5jcnlwdCcpKSB8fCBjb250ZXh0LnRyYWlsZXJJbmZvLkVuY3J5cHQsXG4gICAgICAgICAgICBJbmZvOiBkaWN0LmdldChQREZOYW1lLm9mKCdJbmZvJykpIHx8IGNvbnRleHQudHJhaWxlckluZm8uSW5mbyxcbiAgICAgICAgICAgIElEOiBkaWN0LmdldChQREZOYW1lLm9mKCdJRCcpKSB8fCBjb250ZXh0LnRyYWlsZXJJbmZvLklELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgUERGUGFyc2VyLnByb3RvdHlwZS5tYXliZVBhcnNlVHJhaWxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuc3RhcnR4cmVmKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnBhcnNlUmF3SW50KCk7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2UoKTtcbiAgICAgICAgdGhpcy5tYXRjaEtleXdvcmQoS2V5d29yZHMuZW9mKTtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKEtleXdvcmRzLmVvZik7XG4gICAgICAgIHRoaXMuc2tpcFdoaXRlc3BhY2VBbmRDb21tZW50cygpO1xuICAgICAgICByZXR1cm4gUERGVHJhaWxlci5mb3JMYXN0Q3Jvc3NSZWZTZWN0aW9uT2Zmc2V0KG9mZnNldCk7XG4gICAgfTtcbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnBhcnNlRG9jdW1lbnRTZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMucGFyc2VJbmRpcmVjdE9iamVjdHMoKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF5YmVQYXJzZUNyb3NzUmVmU2VjdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXliZVBhcnNlVHJhaWxlckRpY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF5YmVQYXJzZVRyYWlsZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IENhbiB0aGlzIGJlIGRvbmUgb25seSB3aGVuIG5lZWRlZCwgdG8gYXZvaWQgaGFybWluZyBwZXJmb3JtYW5jZT9cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcEppYmJlcmlzaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBuZWNlc3NhcnkgZm9yIHZhbGlkIFBERiBmaWxlcy4gQnV0IHNvbWUgaW52YWxpZCBQREZzXG4gICAgICogY29udGFpbiBqaWJiZXJpc2ggaW4gYmV0d2VlbiBpbmRpcmVjdCBvYmplY3RzLiBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0b1xuICAgICAqIHNraXAgcGFzdCB0aGF0IGppYmJlcmlzaCwgc2hvdWxkIGl0IGV4aXN0LCB1bnRpbCBpdCByZWFjaGVzIHRoZSBuZXh0XG4gICAgICogaW5kaXJlY3Qgb2JqZWN0IGhlYWRlciwgYW4geHJlZiB0YWJsZSBzZWN0aW9uLCBvciB0aGUgZmlsZSB0cmFpbGVyLlxuICAgICAqL1xuICAgIFBERlBhcnNlci5wcm90b3R5cGUuc2tpcEppYmJlcmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIHdoaWxlICghdGhpcy5ieXRlcy5kb25lKCkpIHtcbiAgICAgICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgICAgIHZhciBieXRlID0gdGhpcy5ieXRlcy5wZWVrKCk7XG4gICAgICAgICAgICB2YXIgaXNBbHBoYU51bWVyaWMgPSBieXRlID49IENoYXJDb2Rlcy5TcGFjZSAmJiBieXRlIDw9IENoYXJDb2Rlcy5UaWxkZTtcbiAgICAgICAgICAgIGlmIChpc0FscGhhTnVtZXJpYykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy54cmVmKSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy50cmFpbGVyKSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoS2V5d29yZChLZXl3b3Jkcy5zdGFydHhyZWYpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hJbmRpcmVjdE9iamVjdEhlYWRlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnl0ZXMubW92ZVRvKGluaXRpYWxPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogU2tpcHMgdGhlIGJpbmFyeSBjb21tZW50IGZvbGxvd2luZyBhIFBERiBoZWFkZXIuIFRoZSBzcGVjaWZpY2F0aW9uXG4gICAgICogZGVmaW5lcyB0aGlzIGJpbmFyeSBjb21tZW50IChzZWN0aW9uIDcuNS4yIEZpbGUgSGVhZGVyKSBhcyBhIHNlcXVlbmNlIG9mIDRcbiAgICAgKiBvciBtb3JlIGJ5dGVzIHRoYXQgYXJlIDEyOCBvciBncmVhdGVyLCBhbmQgd2hpY2ggYXJlIHByZWNlZGVkIGJ5IGEgXCIlXCIuXG4gICAgICpcbiAgICAgKiBUaGlzIHdvdWxkIGltcGx5IHRoYXQgdG8gc3RyaXAgb3V0IHRoaXMgYmluYXJ5IGNvbW1lbnQsIHdlIGNvdWxkIGNoZWNrIGZvclxuICAgICAqIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgc3RhcnRpbmcgd2l0aCBcIiVcIiwgYW5kIHJlbW92ZSBhbGwgc3Vic2VxdWVudCBieXRlcyB0aGF0XG4gICAgICogYXJlIDEyOCBvciBncmVhdGVyLiBUaGlzIHdvcmtzIGZvciBtYW55IGRvY3VtZW50cyB0aGF0IHByb3Blcmx5IGNvbXBseSB3aXRoXG4gICAgICogdGhlIHNwZWMuIEJ1dCBpbiB0aGUgd2lsZCwgdGhlcmUgYXJlIFBERnMgdGhhdCBvbWl0IHRoZSBsZWFkaW5nIFwiJVwiLCBhbmRcbiAgICAgKiBpbmNsdWRlIGJ5dGVzIHRoYXQgYXJlIGxlc3MgdGhhbiAxMjggKGUuZy4gMCBvciAxKS4gU28gaW4gb3JkZXIgdG8gcGFyc2VcbiAgICAgKiB0aGVzZSBoZWFkZXJzIGNvcnJlY3RseSwgd2UganVzdCB0aHJvdyBvdXQgYWxsIGJ5dGVzIGxlYWRpbmcgdXAgdG8gdGhlXG4gICAgICogZmlyc3QgaW5kaXJlY3Qgb2JqZWN0IGhlYWRlci5cbiAgICAgKi9cbiAgICBQREZQYXJzZXIucHJvdG90eXBlLnNraXBCaW5hcnlIZWFkZXJDb21tZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlQW5kQ29tbWVudHMoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBpbml0aWFsT2Zmc2V0ID0gdGhpcy5ieXRlcy5vZmZzZXQoKTtcbiAgICAgICAgICAgIHRoaXMucGFyc2VJbmRpcmVjdE9iamVjdEhlYWRlcigpO1xuICAgICAgICAgICAgdGhpcy5ieXRlcy5tb3ZlVG8oaW5pdGlhbE9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICAgICAgdGhpcy5za2lwV2hpdGVzcGFjZUFuZENvbW1lbnRzKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERlBhcnNlci5mb3JCeXRlc1dpdGhPcHRpb25zID0gZnVuY3Rpb24gKHBkZkJ5dGVzLCBvYmplY3RzUGVyVGljaywgdGhyb3dPbkludmFsaWRPYmplY3QsIGNhcE51bWJlcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZQYXJzZXIocGRmQnl0ZXMsIG9iamVjdHNQZXJUaWNrLCB0aHJvd09uSW52YWxpZE9iamVjdCwgY2FwTnVtYmVycyk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGUGFyc2VyO1xufShQREZPYmplY3RQYXJzZXIpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlBhcnNlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlBhcnNlci5qcy5tYXAiLCJpbXBvcnQgeyBSZXBhcnNlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IEJ5dGVTdHJlYW0gZnJvbSBcIi4vQnl0ZVN0cmVhbVwiO1xudmFyIFBERlhSZWZTdHJlYW1QYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUERGWFJlZlN0cmVhbVBhcnNlcihyYXdTdHJlYW0pIHtcbiAgICAgICAgdGhpcy5hbHJlYWR5UGFyc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGljdCA9IHJhd1N0cmVhbS5kaWN0O1xuICAgICAgICB0aGlzLmJ5dGVzID0gQnl0ZVN0cmVhbS5mcm9tUERGUmF3U3RyZWFtKHJhd1N0cmVhbSk7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IHRoaXMuZGljdC5jb250ZXh0O1xuICAgICAgICB2YXIgU2l6ZSA9IHRoaXMuZGljdC5sb29rdXAoUERGTmFtZS5vZignU2l6ZScpLCBQREZOdW1iZXIpO1xuICAgICAgICB2YXIgSW5kZXggPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ0luZGV4JykpO1xuICAgICAgICBpZiAoSW5kZXggaW5zdGFuY2VvZiBQREZBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5zdWJzZWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gSW5kZXguc2l6ZSgpOyBpZHggPCBsZW47IGlkeCArPSAyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpcnN0T2JqZWN0TnVtYmVyID0gSW5kZXgubG9va3VwKGlkeCArIDAsIFBERk51bWJlcikuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoXzEgPSBJbmRleC5sb29rdXAoaWR4ICsgMSwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2VjdGlvbnMucHVzaCh7IGZpcnN0T2JqZWN0TnVtYmVyOiBmaXJzdE9iamVjdE51bWJlciwgbGVuZ3RoOiBsZW5ndGhfMSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2VjdGlvbnMgPSBbeyBmaXJzdE9iamVjdE51bWJlcjogMCwgbGVuZ3RoOiBTaXplLmFzTnVtYmVyKCkgfV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIFcgPSB0aGlzLmRpY3QubG9va3VwKFBERk5hbWUub2YoJ1cnKSwgUERGQXJyYXkpO1xuICAgICAgICB0aGlzLmJ5dGVXaWR0aHMgPSBbLTEsIC0xLCAtMV07XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IFcuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB0aGlzLmJ5dGVXaWR0aHNbaWR4XSA9IFcubG9va3VwKGlkeCwgUERGTnVtYmVyKS5hc051bWJlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFBERlhSZWZTdHJlYW1QYXJzZXIucHJvdG90eXBlLnBhcnNlSW50b0NvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmFscmVhZHlQYXJzZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZXBhcnNlRXJyb3IoJ1BERlhSZWZTdHJlYW1QYXJzZXInLCAncGFyc2VJbnRvQ29udGV4dCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxyZWFkeVBhcnNlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udGV4dC50cmFpbGVySW5mbyA9IHtcbiAgICAgICAgICAgIFJvb3Q6IHRoaXMuZGljdC5nZXQoUERGTmFtZS5vZignUm9vdCcpKSxcbiAgICAgICAgICAgIEVuY3J5cHQ6IHRoaXMuZGljdC5nZXQoUERGTmFtZS5vZignRW5jcnlwdCcpKSxcbiAgICAgICAgICAgIEluZm86IHRoaXMuZGljdC5nZXQoUERGTmFtZS5vZignSW5mbycpKSxcbiAgICAgICAgICAgIElEOiB0aGlzLmRpY3QuZ2V0KFBERk5hbWUub2YoJ0lEJykpLFxuICAgICAgICB9O1xuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMucGFyc2VFbnRyaWVzKCk7XG4gICAgICAgIC8vIGZvciAobGV0IGlkeCA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIC8vIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpZHhdO1xuICAgICAgICAvLyBpZiAoZW50cnkuZGVsZXRlZCkgdGhpcy5jb250ZXh0LmRlbGV0ZShlbnRyeS5yZWYpO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH07XG4gICAgUERGWFJlZlN0cmVhbVBhcnNlci5wcm90b3R5cGUucGFyc2VFbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmJ5dGVXaWR0aHMsIHR5cGVGaWVsZFdpZHRoID0gX2FbMF0sIG9mZnNldEZpZWxkV2lkdGggPSBfYVsxXSwgZ2VuRmllbGRXaWR0aCA9IF9hWzJdO1xuICAgICAgICBmb3IgKHZhciBzdWJzZWN0aW9uSWR4ID0gMCwgc3Vic2VjdGlvbkxlbiA9IHRoaXMuc3Vic2VjdGlvbnMubGVuZ3RoOyBzdWJzZWN0aW9uSWR4IDwgc3Vic2VjdGlvbkxlbjsgc3Vic2VjdGlvbklkeCsrKSB7XG4gICAgICAgICAgICB2YXIgX2IgPSB0aGlzLnN1YnNlY3Rpb25zW3N1YnNlY3Rpb25JZHhdLCBmaXJzdE9iamVjdE51bWJlciA9IF9iLmZpcnN0T2JqZWN0TnVtYmVyLCBsZW5ndGhfMiA9IF9iLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAodmFyIG9iaklkeCA9IDA7IG9iaklkeCA8IGxlbmd0aF8yOyBvYmpJZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciB0eXBlID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0eXBlRmllbGRXaWR0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gKHR5cGUgPDwgOCkgfCB0aGlzLmJ5dGVzLm5leHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gb2Zmc2V0RmllbGRXaWR0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAob2Zmc2V0IDw8IDgpIHwgdGhpcy5ieXRlcy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBnZW5lcmF0aW9uTnVtYmVyID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBnZW5GaWVsZFdpZHRoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25OdW1iZXIgPSAoZ2VuZXJhdGlvbk51bWJlciA8PCA4KSB8IHRoaXMuYnl0ZXMubmV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBgdHlwZWAgZmllbGQgaXMgYWJzZW50LCBpdCBkZWZhdWx0cyB0byAxXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVGaWVsZFdpZHRoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICB0eXBlID0gMTtcbiAgICAgICAgICAgICAgICB2YXIgb2JqZWN0TnVtYmVyID0gZmlyc3RPYmplY3ROdW1iZXIgKyBvYmpJZHg7XG4gICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICByZWY6IFBERlJlZi5vZihvYmplY3ROdW1iZXIsIGdlbmVyYXRpb25OdW1iZXIpLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlZDogdHlwZSA9PT0gMCxcbiAgICAgICAgICAgICAgICAgICAgaW5PYmplY3RTdHJlYW06IHR5cGUgPT09IDIsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH07XG4gICAgUERGWFJlZlN0cmVhbVBhcnNlci5mb3JTdHJlYW0gPSBmdW5jdGlvbiAocmF3U3RyZWFtKSB7XG4gICAgICAgIHJldHVybiBuZXcgUERGWFJlZlN0cmVhbVBhcnNlcihyYXdTdHJlYW0pO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlhSZWZTdHJlYW1QYXJzZXI7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUERGWFJlZlN0cmVhbVBhcnNlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlhSZWZTdHJlYW1QYXJzZXIuanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAyMDEyIE1vemlsbGEgRm91bmRhdGlvblxuICpcbiAqIFRoZSBBc2NpaTg1U3RyZWFtIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBUeXBlU2NyaXB0IHBvcnQgb2YgdGhlXG4gKiBKYXZhU2NyaXB0IEFzY2lpODVTdHJlYW0gY2xhc3MgaW4gTW96aWxsYSdzIHBkZi5qcyBwcm9qZWN0LCBtYWRlIGF2YWlsYWJsZVxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2UgbGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgRGVjb2RlU3RyZWFtIGZyb20gXCIuL0RlY29kZVN0cmVhbVwiO1xudmFyIGlzU3BhY2UgPSBmdW5jdGlvbiAoY2gpIHtcbiAgICByZXR1cm4gY2ggPT09IDB4MjAgfHwgY2ggPT09IDB4MDkgfHwgY2ggPT09IDB4MGQgfHwgY2ggPT09IDB4MGE7XG59O1xudmFyIEFzY2lpODVTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFzY2lpODVTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQXNjaWk4NVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIF90aGlzLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoNSk7XG4gICAgICAgIC8vIE1vc3Qgc3RyZWFtcyBpbmNyZWFzZSBpbiBzaXplIHdoZW4gZGVjb2RlZCwgYnV0IEFzY2lpODUgc3RyZWFtc1xuICAgICAgICAvLyB0eXBpY2FsbHkgc2hyaW5rIGJ5IH4yMCUuXG4gICAgICAgIGlmIChtYXliZUxlbmd0aCkge1xuICAgICAgICAgICAgbWF5YmVMZW5ndGggPSAwLjggKiBtYXliZUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEFzY2lpODVTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFRJTERBX0NIQVIgPSAweDdlOyAvLyAnfidcbiAgICAgICAgdmFyIFpfTE9XRVJfQ0hBUiA9IDB4N2E7IC8vICd6J1xuICAgICAgICB2YXIgRU9GID0gLTE7XG4gICAgICAgIHZhciBzdHJlYW0gPSB0aGlzLnN0cmVhbTtcbiAgICAgICAgdmFyIGMgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICB3aGlsZSAoaXNTcGFjZShjKSkge1xuICAgICAgICAgICAgYyA9IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09IEVPRiB8fCBjID09PSBUSUxEQV9DSEFSKSB7XG4gICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICB2YXIgYnVmZmVyO1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgLy8gc3BlY2lhbCBjb2RlIGZvciB6XG4gICAgICAgIGlmIChjID09PSBaX0xPV0VSX0NIQVIpIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIDQpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGggKyBpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSA0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5pbnB1dDtcbiAgICAgICAgICAgIGlucHV0WzBdID0gYztcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyArK2kpIHtcbiAgICAgICAgICAgICAgICBjID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaXNTcGFjZShjKSkge1xuICAgICAgICAgICAgICAgICAgICBjID0gc3RyZWFtLmdldEJ5dGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5wdXRbaV0gPSBjO1xuICAgICAgICAgICAgICAgIGlmIChjID09PSBFT0YgfHwgYyA9PT0gVElMREFfQ0hBUikge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBpIC0gMSk7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSBpIC0gMTtcbiAgICAgICAgICAgIC8vIHBhcnRpYWwgZW5kaW5nO1xuICAgICAgICAgICAgaWYgKGkgPCA1KSB7XG4gICAgICAgICAgICAgICAgZm9yICg7IGkgPCA1OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRbaV0gPSAweDIxICsgODQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0ID0gMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHtcbiAgICAgICAgICAgICAgICB0ID0gdCAqIDg1ICsgKGlucHV0W2ldIC0gMHgyMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgPSAzOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGggKyBpXSA9IHQgJiAweGZmO1xuICAgICAgICAgICAgICAgIHQgPj49IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBBc2NpaTg1U3RyZWFtO1xufShEZWNvZGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IEFzY2lpODVTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc2NpaTg1U3RyZWFtLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBUaGUgQXNjaWlIZXhTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgQXNjaWlIZXhTdHJlYW0gY2xhc3MgaW4gTW96aWxsYSdzIHBkZi5qcyBwcm9qZWN0LCBtYWRlIGF2YWlsYWJsZVxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2UgbGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgRGVjb2RlU3RyZWFtIGZyb20gXCIuL0RlY29kZVN0cmVhbVwiO1xudmFyIEFzY2lpSGV4U3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhBc2NpaUhleFN0cmVhbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBc2NpaUhleFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1heWJlTGVuZ3RoKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgICAgIF90aGlzLmZpcnN0RGlnaXQgPSAtMTtcbiAgICAgICAgLy8gTW9zdCBzdHJlYW1zIGluY3JlYXNlIGluIHNpemUgd2hlbiBkZWNvZGVkLCBidXQgQXNjaWlIZXggc3RyZWFtcyBzaHJpbmtcbiAgICAgICAgLy8gYnkgNTAlLlxuICAgICAgICBpZiAobWF5YmVMZW5ndGgpIHtcbiAgICAgICAgICAgIG1heWJlTGVuZ3RoID0gMC41ICogbWF5YmVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBBc2NpaUhleFN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgVVBTVFJFQU1fQkxPQ0tfU0laRSA9IDgwMDA7XG4gICAgICAgIHZhciBieXRlcyA9IHRoaXMuc3RyZWFtLmdldEJ5dGVzKFVQU1RSRUFNX0JMT0NLX1NJWkUpO1xuICAgICAgICBpZiAoIWJ5dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtYXhEZWNvZGVMZW5ndGggPSAoYnl0ZXMubGVuZ3RoICsgMSkgPj4gMTtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgbWF4RGVjb2RlTGVuZ3RoKTtcbiAgICAgICAgdmFyIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICB2YXIgZmlyc3REaWdpdCA9IHRoaXMuZmlyc3REaWdpdDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYnl0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoID0gYnl0ZXNbaV07XG4gICAgICAgICAgICB2YXIgZGlnaXQgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5KSB7XG4gICAgICAgICAgICAgICAgLy8gJzAnLSc5J1xuICAgICAgICAgICAgICAgIGRpZ2l0ID0gY2ggJiAweDBmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKGNoID49IDB4NDEgJiYgY2ggPD0gMHg0NikgfHwgKGNoID49IDB4NjEgJiYgY2ggPD0gMHg2NikpIHtcbiAgICAgICAgICAgICAgICAvLyAnQSctJ1onLCAnYSctJ3onXG4gICAgICAgICAgICAgICAgZGlnaXQgPSAoY2ggJiAweDBmKSArIDk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gMHgzZSkge1xuICAgICAgICAgICAgICAgIC8vICc+J1xuICAgICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHByb2JhYmx5IHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JpbmdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdERpZ2l0IDwgMCkge1xuICAgICAgICAgICAgICAgIGZpcnN0RGlnaXQgPSBkaWdpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSAoZmlyc3REaWdpdCA8PCA0KSB8IGRpZ2l0O1xuICAgICAgICAgICAgICAgIGZpcnN0RGlnaXQgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyc3REaWdpdCA+PSAwICYmIHRoaXMuZW9mKSB7XG4gICAgICAgICAgICAvLyBpbmNvbXBsZXRlIGJ5dGVcbiAgICAgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBmaXJzdERpZ2l0IDw8IDQ7XG4gICAgICAgICAgICBmaXJzdERpZ2l0ID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJzdERpZ2l0ID0gZmlyc3REaWdpdDtcbiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7XG4gICAgfTtcbiAgICByZXR1cm4gQXNjaWlIZXhTdHJlYW07XG59KERlY29kZVN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgQXNjaWlIZXhTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc2NpaUhleFN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IFN0cmVhbSBmcm9tIFwiLi9TdHJlYW1cIjtcbi8qXG4gKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBUaGUgRGVjb2RlU3RyZWFtIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBUeXBlU2NyaXB0IHBvcnQgb2YgdGhlXG4gKiBKYXZhU2NyaXB0IERlY29kZVN0cmVhbSBjbGFzcyBpbiBNb3ppbGxhJ3MgcGRmLmpzIHByb2plY3QsIG1hZGUgYXZhaWxhYmxlXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZSBsaWNlbnNlLlxuICovXG4vLyBMb3RzIG9mIERlY29kZVN0cmVhbXMgYXJlIGNyZWF0ZWQgd2hvc2UgYnVmZmVycyBhcmUgbmV2ZXIgdXNlZC4gIEZvciB0aGVzZVxuLy8gd2Ugc2hhcmUgYSBzaW5nbGUgZW1wdHkgYnVmZmVyLiBUaGlzIGlzIChhKSBzcGFjZS1lZmZpY2llbnQgYW5kIChiKSBhdm9pZHNcbi8vIGhhdmluZyBzcGVjaWFsIGNhc2VzIHRoYXQgd291bGQgYmUgcmVxdWlyZWQgaWYgd2UgdXNlZCB8bnVsbHwgZm9yIGFuIGVtcHR5XG4vLyBidWZmZXIuXG52YXIgZW1wdHlCdWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTtcbi8qKlxuICogU3VwZXIgY2xhc3MgZm9yIHRoZSBkZWNvZGluZyBzdHJlYW1zXG4gKi9cbnZhciBEZWNvZGVTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVjb2RlU3RyZWFtKG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSAwO1xuICAgICAgICB0aGlzLmVvZiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGVtcHR5QnVmZmVyO1xuICAgICAgICB0aGlzLm1pbkJ1ZmZlckxlbmd0aCA9IDUxMjtcbiAgICAgICAgaWYgKG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBmaXJzdCBwb3dlciBvZiB0d28gdGhhdCBpcyBhcyBiaWcgYXMgbWF5YmVNaW5CdWZmZXJMZW5ndGguXG4gICAgICAgICAgICB3aGlsZSAodGhpcy5taW5CdWZmZXJMZW5ndGggPCBtYXliZU1pbkJ1ZmZlckxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWluQnVmZmVyTGVuZ3RoICo9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlY29kZVN0cmVhbS5wcm90b3R5cGUsIFwiaXNFbXB0eVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZEJsb2NrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXJMZW5ndGggPT09IDA7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLmdldEJ5dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyTGVuZ3RoIDw9IHBvcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZW9mKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrK107XG4gICAgfTtcbiAgICBEZWNvZGVTdHJlYW0ucHJvdG90eXBlLmdldFVpbnQxNiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYjAgPDwgOCkgKyBiMTtcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUuZ2V0SW50MzIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBiMCA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjEgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIyID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMyA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMztcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUuZ2V0Qnl0ZXMgPSBmdW5jdGlvbiAobGVuZ3RoLCBmb3JjZUNsYW1wZWQpIHtcbiAgICAgICAgaWYgKGZvcmNlQ2xhbXBlZCA9PT0gdm9pZCAwKSB7IGZvcmNlQ2xhbXBlZCA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBlbmQ7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgbGVuZ3RoKTtcbiAgICAgICAgICAgIGVuZCA9IHBvcyArIGxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlICghdGhpcy5lb2YgJiYgdGhpcy5idWZmZXJMZW5ndGggPCBlbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGJ1ZkVuZCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGVuZCA+IGJ1ZkVuZCkge1xuICAgICAgICAgICAgICAgIGVuZCA9IGJ1ZkVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlICghdGhpcy5lb2YpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRCbG9jaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5kID0gdGhpcy5idWZmZXJMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHZhciBzdWJhcnJheSA9IHRoaXMuYnVmZmVyLnN1YmFycmF5KHBvcywgZW5kKTtcbiAgICAgICAgLy8gYHRoaXMuYnVmZmVyYCBpcyBlaXRoZXIgYSBgVWludDhBcnJheWAgb3IgYFVpbnQ4Q2xhbXBlZEFycmF5YCBoZXJlLlxuICAgICAgICByZXR1cm4gZm9yY2VDbGFtcGVkICYmICEoc3ViYXJyYXkgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlcbiAgICAgICAgICAgID8gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN1YmFycmF5KVxuICAgICAgICAgICAgOiBzdWJhcnJheTtcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUucGVla0J5dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHRoaXMucG9zLS07XG4gICAgICAgIHJldHVybiBwZWVrZWRCeXRlO1xuICAgIH07XG4gICAgRGVjb2RlU3RyZWFtLnByb3RvdHlwZS5wZWVrQnl0ZXMgPSBmdW5jdGlvbiAobGVuZ3RoLCBmb3JjZUNsYW1wZWQpIHtcbiAgICAgICAgaWYgKGZvcmNlQ2xhbXBlZCA9PT0gdm9pZCAwKSB7IGZvcmNlQ2xhbXBlZCA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBieXRlcyA9IHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQpO1xuICAgICAgICB0aGlzLnBvcyAtPSBieXRlcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiBieXRlcztcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIGlmICghbikge1xuICAgICAgICAgICAgbiA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3MgKz0gbjtcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUubWFrZVN1YlN0cmVhbSA9IGZ1bmN0aW9uIChzdGFydCwgbGVuZ3RoIC8qIGRpY3QgKi8pIHtcbiAgICAgICAgdmFyIGVuZCA9IHN0YXJ0ICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gZW5kICYmICF0aGlzLmVvZikge1xuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFN0cmVhbSh0aGlzLmJ1ZmZlciwgc3RhcnQsIGxlbmd0aCAvKiBkaWN0ICovKTtcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKVxuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2soKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsIHRoaXMuYnVmZmVyTGVuZ3RoKTtcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdyZWFkQmxvY2snKTtcbiAgICB9O1xuICAgIERlY29kZVN0cmVhbS5wcm90b3R5cGUuZW5zdXJlQnVmZmVyID0gZnVuY3Rpb24gKHJlcXVlc3RlZCkge1xuICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXI7XG4gICAgICAgIGlmIChyZXF1ZXN0ZWQgPD0gYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNpemUgPSB0aGlzLm1pbkJ1ZmZlckxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHNpemUgPCByZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgIHNpemUgKj0gMjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYnVmZmVyMiA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgICAgICBidWZmZXIyLnNldChidWZmZXIpO1xuICAgICAgICByZXR1cm4gKHRoaXMuYnVmZmVyID0gYnVmZmVyMik7XG4gICAgfTtcbiAgICByZXR1cm4gRGVjb2RlU3RyZWFtO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IERlY29kZVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlY29kZVN0cmVhbS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IDE5OTYtMjAwMyBHbHlwaCAmIENvZywgTExDXG4gKlxuICogVGhlIGZsYXRlIHN0cmVhbSBpbXBsZW1lbnRhdGlvbiBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgSmF2YVNjcmlwdCBwb3J0XG4gKiBvZiBYUERGJ3MgaW1wbGVtZW50YXRpb24sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBBcGFjaGUgMi4wIG9wZW4gc291cmNlXG4gKiBsaWNlbnNlLlxuICovXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbi8qXG4gKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBUaGUgRmxhdGVTdHJlYW0gY2xhc3MgY29udGFpbmVkIGluIHRoaXMgZmlsZSBpcyBhIFR5cGVTY3JpcHQgcG9ydCBvZiB0aGVcbiAqIEphdmFTY3JpcHQgRmxhdGVTdHJlYW0gY2xhc3MgaW4gTW96aWxsYSdzIHBkZi5qcyBwcm9qZWN0LCBtYWRlIGF2YWlsYWJsZVxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2UgbGljZW5zZS5cbiAqL1xuLyogdHNsaW50OmRpc2FibGUgIG5vLWNvbmRpdGlvbmFsLWFzc2lnbm1lbnQgKi9cbmltcG9ydCBEZWNvZGVTdHJlYW0gZnJvbSBcIi4vRGVjb2RlU3RyZWFtXCI7XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBjb2RlTGVuQ29kZU1hcCA9IG5ldyBJbnQzMkFycmF5KFtcbiAgICAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1XG5dKTtcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGxlbmd0aERlY29kZSA9IG5ldyBJbnQzMkFycmF5KFtcbiAgICAweDAwMDAzLCAweDAwMDA0LCAweDAwMDA1LCAweDAwMDA2LCAweDAwMDA3LCAweDAwMDA4LCAweDAwMDA5LCAweDAwMDBhLFxuICAgIDB4MTAwMGIsIDB4MTAwMGQsIDB4MTAwMGYsIDB4MTAwMTEsIDB4MjAwMTMsIDB4MjAwMTcsIDB4MjAwMWIsIDB4MjAwMWYsXG4gICAgMHgzMDAyMywgMHgzMDAyYiwgMHgzMDAzMywgMHgzMDAzYiwgMHg0MDA0MywgMHg0MDA1MywgMHg0MDA2MywgMHg0MDA3MyxcbiAgICAweDUwMDgzLCAweDUwMGEzLCAweDUwMGMzLCAweDUwMGUzLCAweDAwMTAyLCAweDAwMTAyLCAweDAwMTAyXG5dKTtcbi8vIHByZXR0aWVyLWlnbm9yZVxudmFyIGRpc3REZWNvZGUgPSBuZXcgSW50MzJBcnJheShbXG4gICAgMHgwMDAwMSwgMHgwMDAwMiwgMHgwMDAwMywgMHgwMDAwNCwgMHgxMDAwNSwgMHgxMDAwNywgMHgyMDAwOSwgMHgyMDAwZCxcbiAgICAweDMwMDExLCAweDMwMDE5LCAweDQwMDIxLCAweDQwMDMxLCAweDUwMDQxLCAweDUwMDYxLCAweDYwMDgxLCAweDYwMGMxLFxuICAgIDB4NzAxMDEsIDB4NzAxODEsIDB4ODAyMDEsIDB4ODAzMDEsIDB4OTA0MDEsIDB4OTA2MDEsIDB4YTA4MDEsIDB4YTBjMDEsXG4gICAgMHhiMTAwMSwgMHhiMTgwMSwgMHhjMjAwMSwgMHhjMzAwMSwgMHhkNDAwMSwgMHhkNjAwMVxuXSk7XG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciBmaXhlZExpdENvZGVUYWIgPSBbbmV3IEludDMyQXJyYXkoW1xuICAgICAgICAweDcwMTAwLCAweDgwMDUwLCAweDgwMDEwLCAweDgwMTE4LCAweDcwMTEwLCAweDgwMDcwLCAweDgwMDMwLCAweDkwMGMwLFxuICAgICAgICAweDcwMTA4LCAweDgwMDYwLCAweDgwMDIwLCAweDkwMGEwLCAweDgwMDAwLCAweDgwMDgwLCAweDgwMDQwLCAweDkwMGUwLFxuICAgICAgICAweDcwMTA0LCAweDgwMDU4LCAweDgwMDE4LCAweDkwMDkwLCAweDcwMTE0LCAweDgwMDc4LCAweDgwMDM4LCAweDkwMGQwLFxuICAgICAgICAweDcwMTBjLCAweDgwMDY4LCAweDgwMDI4LCAweDkwMGIwLCAweDgwMDA4LCAweDgwMDg4LCAweDgwMDQ4LCAweDkwMGYwLFxuICAgICAgICAweDcwMTAyLCAweDgwMDU0LCAweDgwMDE0LCAweDgwMTFjLCAweDcwMTEyLCAweDgwMDc0LCAweDgwMDM0LCAweDkwMGM4LFxuICAgICAgICAweDcwMTBhLCAweDgwMDY0LCAweDgwMDI0LCAweDkwMGE4LCAweDgwMDA0LCAweDgwMDg0LCAweDgwMDQ0LCAweDkwMGU4LFxuICAgICAgICAweDcwMTA2LCAweDgwMDVjLCAweDgwMDFjLCAweDkwMDk4LCAweDcwMTE2LCAweDgwMDdjLCAweDgwMDNjLCAweDkwMGQ4LFxuICAgICAgICAweDcwMTBlLCAweDgwMDZjLCAweDgwMDJjLCAweDkwMGI4LCAweDgwMDBjLCAweDgwMDhjLCAweDgwMDRjLCAweDkwMGY4LFxuICAgICAgICAweDcwMTAxLCAweDgwMDUyLCAweDgwMDEyLCAweDgwMTFhLCAweDcwMTExLCAweDgwMDcyLCAweDgwMDMyLCAweDkwMGM0LFxuICAgICAgICAweDcwMTA5LCAweDgwMDYyLCAweDgwMDIyLCAweDkwMGE0LCAweDgwMDAyLCAweDgwMDgyLCAweDgwMDQyLCAweDkwMGU0LFxuICAgICAgICAweDcwMTA1LCAweDgwMDVhLCAweDgwMDFhLCAweDkwMDk0LCAweDcwMTE1LCAweDgwMDdhLCAweDgwMDNhLCAweDkwMGQ0LFxuICAgICAgICAweDcwMTBkLCAweDgwMDZhLCAweDgwMDJhLCAweDkwMGI0LCAweDgwMDBhLCAweDgwMDhhLCAweDgwMDRhLCAweDkwMGY0LFxuICAgICAgICAweDcwMTAzLCAweDgwMDU2LCAweDgwMDE2LCAweDgwMTFlLCAweDcwMTEzLCAweDgwMDc2LCAweDgwMDM2LCAweDkwMGNjLFxuICAgICAgICAweDcwMTBiLCAweDgwMDY2LCAweDgwMDI2LCAweDkwMGFjLCAweDgwMDA2LCAweDgwMDg2LCAweDgwMDQ2LCAweDkwMGVjLFxuICAgICAgICAweDcwMTA3LCAweDgwMDVlLCAweDgwMDFlLCAweDkwMDljLCAweDcwMTE3LCAweDgwMDdlLCAweDgwMDNlLCAweDkwMGRjLFxuICAgICAgICAweDcwMTBmLCAweDgwMDZlLCAweDgwMDJlLCAweDkwMGJjLCAweDgwMDBlLCAweDgwMDhlLCAweDgwMDRlLCAweDkwMGZjLFxuICAgICAgICAweDcwMTAwLCAweDgwMDUxLCAweDgwMDExLCAweDgwMTE5LCAweDcwMTEwLCAweDgwMDcxLCAweDgwMDMxLCAweDkwMGMyLFxuICAgICAgICAweDcwMTA4LCAweDgwMDYxLCAweDgwMDIxLCAweDkwMGEyLCAweDgwMDAxLCAweDgwMDgxLCAweDgwMDQxLCAweDkwMGUyLFxuICAgICAgICAweDcwMTA0LCAweDgwMDU5LCAweDgwMDE5LCAweDkwMDkyLCAweDcwMTE0LCAweDgwMDc5LCAweDgwMDM5LCAweDkwMGQyLFxuICAgICAgICAweDcwMTBjLCAweDgwMDY5LCAweDgwMDI5LCAweDkwMGIyLCAweDgwMDA5LCAweDgwMDg5LCAweDgwMDQ5LCAweDkwMGYyLFxuICAgICAgICAweDcwMTAyLCAweDgwMDU1LCAweDgwMDE1LCAweDgwMTFkLCAweDcwMTEyLCAweDgwMDc1LCAweDgwMDM1LCAweDkwMGNhLFxuICAgICAgICAweDcwMTBhLCAweDgwMDY1LCAweDgwMDI1LCAweDkwMGFhLCAweDgwMDA1LCAweDgwMDg1LCAweDgwMDQ1LCAweDkwMGVhLFxuICAgICAgICAweDcwMTA2LCAweDgwMDVkLCAweDgwMDFkLCAweDkwMDlhLCAweDcwMTE2LCAweDgwMDdkLCAweDgwMDNkLCAweDkwMGRhLFxuICAgICAgICAweDcwMTBlLCAweDgwMDZkLCAweDgwMDJkLCAweDkwMGJhLCAweDgwMDBkLCAweDgwMDhkLCAweDgwMDRkLCAweDkwMGZhLFxuICAgICAgICAweDcwMTAxLCAweDgwMDUzLCAweDgwMDEzLCAweDgwMTFiLCAweDcwMTExLCAweDgwMDczLCAweDgwMDMzLCAweDkwMGM2LFxuICAgICAgICAweDcwMTA5LCAweDgwMDYzLCAweDgwMDIzLCAweDkwMGE2LCAweDgwMDAzLCAweDgwMDgzLCAweDgwMDQzLCAweDkwMGU2LFxuICAgICAgICAweDcwMTA1LCAweDgwMDViLCAweDgwMDFiLCAweDkwMDk2LCAweDcwMTE1LCAweDgwMDdiLCAweDgwMDNiLCAweDkwMGQ2LFxuICAgICAgICAweDcwMTBkLCAweDgwMDZiLCAweDgwMDJiLCAweDkwMGI2LCAweDgwMDBiLCAweDgwMDhiLCAweDgwMDRiLCAweDkwMGY2LFxuICAgICAgICAweDcwMTAzLCAweDgwMDU3LCAweDgwMDE3LCAweDgwMTFmLCAweDcwMTEzLCAweDgwMDc3LCAweDgwMDM3LCAweDkwMGNlLFxuICAgICAgICAweDcwMTBiLCAweDgwMDY3LCAweDgwMDI3LCAweDkwMGFlLCAweDgwMDA3LCAweDgwMDg3LCAweDgwMDQ3LCAweDkwMGVlLFxuICAgICAgICAweDcwMTA3LCAweDgwMDVmLCAweDgwMDFmLCAweDkwMDllLCAweDcwMTE3LCAweDgwMDdmLCAweDgwMDNmLCAweDkwMGRlLFxuICAgICAgICAweDcwMTBmLCAweDgwMDZmLCAweDgwMDJmLCAweDkwMGJlLCAweDgwMDBmLCAweDgwMDhmLCAweDgwMDRmLCAweDkwMGZlLFxuICAgICAgICAweDcwMTAwLCAweDgwMDUwLCAweDgwMDEwLCAweDgwMTE4LCAweDcwMTEwLCAweDgwMDcwLCAweDgwMDMwLCAweDkwMGMxLFxuICAgICAgICAweDcwMTA4LCAweDgwMDYwLCAweDgwMDIwLCAweDkwMGExLCAweDgwMDAwLCAweDgwMDgwLCAweDgwMDQwLCAweDkwMGUxLFxuICAgICAgICAweDcwMTA0LCAweDgwMDU4LCAweDgwMDE4LCAweDkwMDkxLCAweDcwMTE0LCAweDgwMDc4LCAweDgwMDM4LCAweDkwMGQxLFxuICAgICAgICAweDcwMTBjLCAweDgwMDY4LCAweDgwMDI4LCAweDkwMGIxLCAweDgwMDA4LCAweDgwMDg4LCAweDgwMDQ4LCAweDkwMGYxLFxuICAgICAgICAweDcwMTAyLCAweDgwMDU0LCAweDgwMDE0LCAweDgwMTFjLCAweDcwMTEyLCAweDgwMDc0LCAweDgwMDM0LCAweDkwMGM5LFxuICAgICAgICAweDcwMTBhLCAweDgwMDY0LCAweDgwMDI0LCAweDkwMGE5LCAweDgwMDA0LCAweDgwMDg0LCAweDgwMDQ0LCAweDkwMGU5LFxuICAgICAgICAweDcwMTA2LCAweDgwMDVjLCAweDgwMDFjLCAweDkwMDk5LCAweDcwMTE2LCAweDgwMDdjLCAweDgwMDNjLCAweDkwMGQ5LFxuICAgICAgICAweDcwMTBlLCAweDgwMDZjLCAweDgwMDJjLCAweDkwMGI5LCAweDgwMDBjLCAweDgwMDhjLCAweDgwMDRjLCAweDkwMGY5LFxuICAgICAgICAweDcwMTAxLCAweDgwMDUyLCAweDgwMDEyLCAweDgwMTFhLCAweDcwMTExLCAweDgwMDcyLCAweDgwMDMyLCAweDkwMGM1LFxuICAgICAgICAweDcwMTA5LCAweDgwMDYyLCAweDgwMDIyLCAweDkwMGE1LCAweDgwMDAyLCAweDgwMDgyLCAweDgwMDQyLCAweDkwMGU1LFxuICAgICAgICAweDcwMTA1LCAweDgwMDVhLCAweDgwMDFhLCAweDkwMDk1LCAweDcwMTE1LCAweDgwMDdhLCAweDgwMDNhLCAweDkwMGQ1LFxuICAgICAgICAweDcwMTBkLCAweDgwMDZhLCAweDgwMDJhLCAweDkwMGI1LCAweDgwMDBhLCAweDgwMDhhLCAweDgwMDRhLCAweDkwMGY1LFxuICAgICAgICAweDcwMTAzLCAweDgwMDU2LCAweDgwMDE2LCAweDgwMTFlLCAweDcwMTEzLCAweDgwMDc2LCAweDgwMDM2LCAweDkwMGNkLFxuICAgICAgICAweDcwMTBiLCAweDgwMDY2LCAweDgwMDI2LCAweDkwMGFkLCAweDgwMDA2LCAweDgwMDg2LCAweDgwMDQ2LCAweDkwMGVkLFxuICAgICAgICAweDcwMTA3LCAweDgwMDVlLCAweDgwMDFlLCAweDkwMDlkLCAweDcwMTE3LCAweDgwMDdlLCAweDgwMDNlLCAweDkwMGRkLFxuICAgICAgICAweDcwMTBmLCAweDgwMDZlLCAweDgwMDJlLCAweDkwMGJkLCAweDgwMDBlLCAweDgwMDhlLCAweDgwMDRlLCAweDkwMGZkLFxuICAgICAgICAweDcwMTAwLCAweDgwMDUxLCAweDgwMDExLCAweDgwMTE5LCAweDcwMTEwLCAweDgwMDcxLCAweDgwMDMxLCAweDkwMGMzLFxuICAgICAgICAweDcwMTA4LCAweDgwMDYxLCAweDgwMDIxLCAweDkwMGEzLCAweDgwMDAxLCAweDgwMDgxLCAweDgwMDQxLCAweDkwMGUzLFxuICAgICAgICAweDcwMTA0LCAweDgwMDU5LCAweDgwMDE5LCAweDkwMDkzLCAweDcwMTE0LCAweDgwMDc5LCAweDgwMDM5LCAweDkwMGQzLFxuICAgICAgICAweDcwMTBjLCAweDgwMDY5LCAweDgwMDI5LCAweDkwMGIzLCAweDgwMDA5LCAweDgwMDg5LCAweDgwMDQ5LCAweDkwMGYzLFxuICAgICAgICAweDcwMTAyLCAweDgwMDU1LCAweDgwMDE1LCAweDgwMTFkLCAweDcwMTEyLCAweDgwMDc1LCAweDgwMDM1LCAweDkwMGNiLFxuICAgICAgICAweDcwMTBhLCAweDgwMDY1LCAweDgwMDI1LCAweDkwMGFiLCAweDgwMDA1LCAweDgwMDg1LCAweDgwMDQ1LCAweDkwMGViLFxuICAgICAgICAweDcwMTA2LCAweDgwMDVkLCAweDgwMDFkLCAweDkwMDliLCAweDcwMTE2LCAweDgwMDdkLCAweDgwMDNkLCAweDkwMGRiLFxuICAgICAgICAweDcwMTBlLCAweDgwMDZkLCAweDgwMDJkLCAweDkwMGJiLCAweDgwMDBkLCAweDgwMDhkLCAweDgwMDRkLCAweDkwMGZiLFxuICAgICAgICAweDcwMTAxLCAweDgwMDUzLCAweDgwMDEzLCAweDgwMTFiLCAweDcwMTExLCAweDgwMDczLCAweDgwMDMzLCAweDkwMGM3LFxuICAgICAgICAweDcwMTA5LCAweDgwMDYzLCAweDgwMDIzLCAweDkwMGE3LCAweDgwMDAzLCAweDgwMDgzLCAweDgwMDQzLCAweDkwMGU3LFxuICAgICAgICAweDcwMTA1LCAweDgwMDViLCAweDgwMDFiLCAweDkwMDk3LCAweDcwMTE1LCAweDgwMDdiLCAweDgwMDNiLCAweDkwMGQ3LFxuICAgICAgICAweDcwMTBkLCAweDgwMDZiLCAweDgwMDJiLCAweDkwMGI3LCAweDgwMDBiLCAweDgwMDhiLCAweDgwMDRiLCAweDkwMGY3LFxuICAgICAgICAweDcwMTAzLCAweDgwMDU3LCAweDgwMDE3LCAweDgwMTFmLCAweDcwMTEzLCAweDgwMDc3LCAweDgwMDM3LCAweDkwMGNmLFxuICAgICAgICAweDcwMTBiLCAweDgwMDY3LCAweDgwMDI3LCAweDkwMGFmLCAweDgwMDA3LCAweDgwMDg3LCAweDgwMDQ3LCAweDkwMGVmLFxuICAgICAgICAweDcwMTA3LCAweDgwMDVmLCAweDgwMDFmLCAweDkwMDlmLCAweDcwMTE3LCAweDgwMDdmLCAweDgwMDNmLCAweDkwMGRmLFxuICAgICAgICAweDcwMTBmLCAweDgwMDZmLCAweDgwMDJmLCAweDkwMGJmLCAweDgwMDBmLCAweDgwMDhmLCAweDgwMDRmLCAweDkwMGZmXG4gICAgXSksIDldO1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgZml4ZWREaXN0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbXG4gICAgICAgIDB4NTAwMDAsIDB4NTAwMTAsIDB4NTAwMDgsIDB4NTAwMTgsIDB4NTAwMDQsIDB4NTAwMTQsIDB4NTAwMGMsIDB4NTAwMWMsXG4gICAgICAgIDB4NTAwMDIsIDB4NTAwMTIsIDB4NTAwMGEsIDB4NTAwMWEsIDB4NTAwMDYsIDB4NTAwMTYsIDB4NTAwMGUsIDB4MDAwMDAsXG4gICAgICAgIDB4NTAwMDEsIDB4NTAwMTEsIDB4NTAwMDksIDB4NTAwMTksIDB4NTAwMDUsIDB4NTAwMTUsIDB4NTAwMGQsIDB4NTAwMWQsXG4gICAgICAgIDB4NTAwMDMsIDB4NTAwMTMsIDB4NTAwMGIsIDB4NTAwMWIsIDB4NTAwMDcsIDB4NTAwMTcsIDB4NTAwMGYsIDB4MDAwMDBcbiAgICBdKSwgNV07XG52YXIgRmxhdGVTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZsYXRlU3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZsYXRlU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgdmFyIGNtZiA9IHN0cmVhbS5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBmbGcgPSBzdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICBpZiAoY21mID09PSAtMSB8fCBmbGcgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW06IFwiICsgY21mICsgXCIsIFwiICsgZmxnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGNtZiAmIDB4MGYpICE9PSAweDA4KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCBpbiBmbGF0ZSBzdHJlYW06IFwiICsgY21mICsgXCIsIFwiICsgZmxnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKChjbWYgPDwgOCkgKyBmbGcpICUgMzEgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCBGQ0hFQ0sgaW4gZmxhdGUgc3RyZWFtOiBcIiArIGNtZiArIFwiLCBcIiArIGZsZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZsZyAmIDB4MjApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZESUNUIGJpdCBzZXQgaW4gZmxhdGUgc3RyZWFtOiBcIiArIGNtZiArIFwiLCBcIiArIGZsZyk7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMuY29kZVNpemUgPSAwO1xuICAgICAgICBfdGhpcy5jb2RlQnVmID0gMDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBGbGF0ZVN0cmVhbS5wcm90b3R5cGUucmVhZEJsb2NrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnVmZmVyO1xuICAgICAgICB2YXIgbGVuO1xuICAgICAgICB2YXIgc3RyID0gdGhpcy5zdHJlYW07XG4gICAgICAgIC8vIHJlYWQgYmxvY2sgaGVhZGVyXG4gICAgICAgIHZhciBoZHIgPSB0aGlzLmdldEJpdHMoMyk7XG4gICAgICAgIGlmIChoZHIgJiAxKSB7XG4gICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaGRyID4+PSAxO1xuICAgICAgICBpZiAoaGRyID09PSAwKSB7XG4gICAgICAgICAgICAvLyB1bmNvbXByZXNzZWQgYmxvY2tcbiAgICAgICAgICAgIHZhciBiID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGJsb2NrTGVuID0gYjtcbiAgICAgICAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2NrTGVuIHw9IGIgPDwgODtcbiAgICAgICAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjaGVjayA9IGI7XG4gICAgICAgICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGVjayB8PSBiIDw8IDg7XG4gICAgICAgICAgICBpZiAoY2hlY2sgIT09ICh+YmxvY2tMZW4gJiAweGZmZmYpICYmIChibG9ja0xlbiAhPT0gMCB8fCBjaGVjayAhPT0gMCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmluZyBlcnJvciBmb3IgYmFkIFwiZW1wdHlcIiBibG9jayAoc2VlIGlzc3VlIDEyNzcpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgdW5jb21wcmVzc2VkIGJsb2NrIGxlbmd0aCBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29kZUJ1ZiA9IDA7XG4gICAgICAgICAgICB0aGlzLmNvZGVTaXplID0gMDtcbiAgICAgICAgICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIGJsb2NrTGVuKTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBidWZmZXJMZW5ndGggKyBibG9ja0xlbjtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gZW5kO1xuICAgICAgICAgICAgaWYgKGJsb2NrTGVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0ci5wZWVrQnl0ZSgpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IGJ1ZmZlckxlbmd0aDsgbiA8IGVuZDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyW25dID0gYjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxpdENvZGVUYWJsZTtcbiAgICAgICAgdmFyIGRpc3RDb2RlVGFibGU7XG4gICAgICAgIGlmIChoZHIgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgYmxvY2ssIGZpeGVkIGNvZGVzXG4gICAgICAgICAgICBsaXRDb2RlVGFibGUgPSBmaXhlZExpdENvZGVUYWI7XG4gICAgICAgICAgICBkaXN0Q29kZVRhYmxlID0gZml4ZWREaXN0Q29kZVRhYjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChoZHIgPT09IDIpIHtcbiAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgYmxvY2ssIGR5bmFtaWMgY29kZXNcbiAgICAgICAgICAgIHZhciBudW1MaXRDb2RlcyA9IHRoaXMuZ2V0Qml0cyg1KSArIDI1NztcbiAgICAgICAgICAgIHZhciBudW1EaXN0Q29kZXMgPSB0aGlzLmdldEJpdHMoNSkgKyAxO1xuICAgICAgICAgICAgdmFyIG51bUNvZGVMZW5Db2RlcyA9IHRoaXMuZ2V0Qml0cyg0KSArIDQ7XG4gICAgICAgICAgICAvLyBidWlsZCB0aGUgY29kZSBsZW5ndGhzIGNvZGUgdGFibGVcbiAgICAgICAgICAgIHZhciBjb2RlTGVuQ29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheShjb2RlTGVuQ29kZU1hcC5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIGkgPSB2b2lkIDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29kZUxlbkNvZGVzOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb2RlTGVuQ29kZUxlbmd0aHNbY29kZUxlbkNvZGVNYXBbaV1dID0gdGhpcy5nZXRCaXRzKDMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNvZGVMZW5Db2RlVGFiID0gdGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShjb2RlTGVuQ29kZUxlbmd0aHMpO1xuICAgICAgICAgICAgLy8gYnVpbGQgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGUgdGFibGVzXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICB2YXIgY29kZXMgPSBudW1MaXRDb2RlcyArIG51bURpc3RDb2RlcztcbiAgICAgICAgICAgIHZhciBjb2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KGNvZGVzKTtcbiAgICAgICAgICAgIHZhciBiaXRzTGVuZ3RoID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIGJpdHNPZmZzZXQgPSB2b2lkIDA7XG4gICAgICAgICAgICB2YXIgd2hhdCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgY29kZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZSA9IHRoaXMuZ2V0Q29kZShjb2RlTGVuQ29kZVRhYik7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDE2KSB7XG4gICAgICAgICAgICAgICAgICAgIGJpdHNMZW5ndGggPSAyO1xuICAgICAgICAgICAgICAgICAgICBiaXRzT2Zmc2V0ID0gMztcbiAgICAgICAgICAgICAgICAgICAgd2hhdCA9IGxlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29kZSA9PT0gMTcpIHtcbiAgICAgICAgICAgICAgICAgICAgYml0c0xlbmd0aCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIGJpdHNPZmZzZXQgPSAzO1xuICAgICAgICAgICAgICAgICAgICB3aGF0ID0gbGVuID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29kZSA9PT0gMTgpIHtcbiAgICAgICAgICAgICAgICAgICAgYml0c0xlbmd0aCA9IDc7XG4gICAgICAgICAgICAgICAgICAgIGJpdHNPZmZzZXQgPSAxMTtcbiAgICAgICAgICAgICAgICAgICAgd2hhdCA9IGxlbiA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVuZ3Roc1tpKytdID0gbGVuID0gY29kZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZXBlYXRMZW5ndGggPSB0aGlzLmdldEJpdHMoYml0c0xlbmd0aCkgKyBiaXRzT2Zmc2V0O1xuICAgICAgICAgICAgICAgIHdoaWxlIChyZXBlYXRMZW5ndGgtLSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbmd0aHNbaSsrXSA9IHdoYXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGl0Q29kZVRhYmxlID0gdGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShjb2RlTGVuZ3Rocy5zdWJhcnJheSgwLCBudW1MaXRDb2RlcykpO1xuICAgICAgICAgICAgZGlzdENvZGVUYWJsZSA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMuc3ViYXJyYXkobnVtTGl0Q29kZXMsIGNvZGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gYmxvY2sgdHlwZSBpbiBmbGF0ZSBzdHJlYW0nKTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgdmFyIGxpbWl0ID0gYnVmZmVyID8gYnVmZmVyLmxlbmd0aCA6IDA7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHZhciBjb2RlMSA9IHRoaXMuZ2V0Q29kZShsaXRDb2RlVGFibGUpO1xuICAgICAgICAgICAgaWYgKGNvZGUxIDwgMjU2KSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyArIDEgPj0gbGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZmVyW3BvcysrXSA9IGNvZGUxO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvZGUxID09PSAyNTYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IHBvcztcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlMSAtPSAyNTc7XG4gICAgICAgICAgICBjb2RlMSA9IGxlbmd0aERlY29kZVtjb2RlMV07XG4gICAgICAgICAgICB2YXIgY29kZTIgPSBjb2RlMSA+PiAxNjtcbiAgICAgICAgICAgIGlmIChjb2RlMiA+IDApIHtcbiAgICAgICAgICAgICAgICBjb2RlMiA9IHRoaXMuZ2V0Qml0cyhjb2RlMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZW4gPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7XG4gICAgICAgICAgICBjb2RlMSA9IHRoaXMuZ2V0Q29kZShkaXN0Q29kZVRhYmxlKTtcbiAgICAgICAgICAgIGNvZGUxID0gZGlzdERlY29kZVtjb2RlMV07XG4gICAgICAgICAgICBjb2RlMiA9IGNvZGUxID4+IDE2O1xuICAgICAgICAgICAgaWYgKGNvZGUyID4gMCkge1xuICAgICAgICAgICAgICAgIGNvZGUyID0gdGhpcy5nZXRCaXRzKGNvZGUyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBkaXN0ID0gKGNvZGUxICYgMHhmZmZmKSArIGNvZGUyO1xuICAgICAgICAgICAgaWYgKHBvcyArIGxlbiA+PSBsaW1pdCkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIGxlbik7XG4gICAgICAgICAgICAgICAgbGltaXQgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBsZW47ICsraywgKytwb3MpIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbcG9zXSA9IGJ1ZmZlcltwb3MgLSBkaXN0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldEJpdHMgPSBmdW5jdGlvbiAoYml0cykge1xuICAgICAgICB2YXIgc3RyID0gdGhpcy5zdHJlYW07XG4gICAgICAgIHZhciBjb2RlU2l6ZSA9IHRoaXMuY29kZVNpemU7XG4gICAgICAgIHZhciBjb2RlQnVmID0gdGhpcy5jb2RlQnVmO1xuICAgICAgICB2YXIgYjtcbiAgICAgICAgd2hpbGUgKGNvZGVTaXplIDwgYml0cykge1xuICAgICAgICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlQnVmIHw9IGIgPDwgY29kZVNpemU7XG4gICAgICAgICAgICBjb2RlU2l6ZSArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGIgPSBjb2RlQnVmICYgKCgxIDw8IGJpdHMpIC0gMSk7XG4gICAgICAgIHRoaXMuY29kZUJ1ZiA9IGNvZGVCdWYgPj4gYml0cztcbiAgICAgICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC09IGJpdHM7XG4gICAgICAgIHJldHVybiBiO1xuICAgIH07XG4gICAgRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldENvZGUgPSBmdW5jdGlvbiAodGFibGUpIHtcbiAgICAgICAgdmFyIHN0ciA9IHRoaXMuc3RyZWFtO1xuICAgICAgICB2YXIgY29kZXMgPSB0YWJsZVswXTtcbiAgICAgICAgdmFyIG1heExlbiA9IHRhYmxlWzFdO1xuICAgICAgICB2YXIgY29kZVNpemUgPSB0aGlzLmNvZGVTaXplO1xuICAgICAgICB2YXIgY29kZUJ1ZiA9IHRoaXMuY29kZUJ1ZjtcbiAgICAgICAgdmFyIGI7XG4gICAgICAgIHdoaWxlIChjb2RlU2l6ZSA8IG1heExlbikge1xuICAgICAgICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJlbWF0dXJlIGVuZCBvZiBzdHJlYW0uIGNvZGUgbWlnaHQgaG93ZXZlciBzdGlsbCBiZSB2YWxpZC5cbiAgICAgICAgICAgICAgICAvLyBjb2RlU2l6ZSA8IGNvZGVMZW4gY2hlY2sgYmVsb3cgZ3VhcmRzIGFnYWluc3QgaW5jb21wbGV0ZSBjb2RlVmFsLlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZUJ1ZiB8PSBiIDw8IGNvZGVTaXplO1xuICAgICAgICAgICAgY29kZVNpemUgKz0gODtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29kZSA9IGNvZGVzW2NvZGVCdWYgJiAoKDEgPDwgbWF4TGVuKSAtIDEpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBjb2RlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGTEFURTonLCBjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29kZUxlbiA9IGNvZGUgPj4gMTY7XG4gICAgICAgIHZhciBjb2RlVmFsID0gY29kZSAmIDB4ZmZmZjtcbiAgICAgICAgaWYgKGNvZGVMZW4gPCAxIHx8IGNvZGVTaXplIDwgY29kZUxlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBjb2RlTGVuO1xuICAgICAgICB0aGlzLmNvZGVTaXplID0gY29kZVNpemUgLSBjb2RlTGVuO1xuICAgICAgICByZXR1cm4gY29kZVZhbDtcbiAgICB9O1xuICAgIEZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZW5lcmF0ZUh1ZmZtYW5UYWJsZSA9IGZ1bmN0aW9uIChsZW5ndGhzKSB7XG4gICAgICAgIHZhciBuID0gbGVuZ3Rocy5sZW5ndGg7XG4gICAgICAgIC8vIGZpbmQgbWF4IGNvZGUgbGVuZ3RoXG4gICAgICAgIHZhciBtYXhMZW4gPSAwO1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICAgICAgaWYgKGxlbmd0aHNbaV0gPiBtYXhMZW4pIHtcbiAgICAgICAgICAgICAgICBtYXhMZW4gPSBsZW5ndGhzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGJ1aWxkIHRoZSB0YWJsZVxuICAgICAgICB2YXIgc2l6ZSA9IDEgPDwgbWF4TGVuO1xuICAgICAgICB2YXIgY29kZXMgPSBuZXcgSW50MzJBcnJheShzaXplKTtcbiAgICAgICAgZm9yICh2YXIgbGVuID0gMSwgY29kZSA9IDAsIHNraXAgPSAyOyBsZW4gPD0gbWF4TGVuOyArK2xlbiwgY29kZSA8PD0gMSwgc2tpcCA8PD0gMSkge1xuICAgICAgICAgICAgZm9yICh2YXIgdmFsID0gMDsgdmFsIDwgbjsgKyt2YWwpIHtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3Roc1t2YWxdID09PSBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYml0LXJldmVyc2UgdGhlIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGUyID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUyID0gKGNvZGUyIDw8IDEpIHwgKHQgJiAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPj49IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZmlsbCB0aGUgdGFibGUgZW50cmllc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBjb2RlMjsgaSA8IHNpemU7IGkgKz0gc2tpcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNbaV0gPSAobGVuIDw8IDE2KSB8IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICArK2NvZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY29kZXMsIG1heExlbl07XG4gICAgfTtcbiAgICByZXR1cm4gRmxhdGVTdHJlYW07XG59KERlY29kZVN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgRmxhdGVTdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GbGF0ZVN0cmVhbS5qcy5tYXAiLCIvKlxuICogQ29weXJpZ2h0IDIwMTIgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogVGhlIExaV1N0cmVhbSBjbGFzcyBjb250YWluZWQgaW4gdGhpcyBmaWxlIGlzIGEgVHlwZVNjcmlwdCBwb3J0IG9mIHRoZVxuICogSmF2YVNjcmlwdCBMWldTdHJlYW0gY2xhc3MgaW4gTW96aWxsYSdzIHBkZi5qcyBwcm9qZWN0LCBtYWRlIGF2YWlsYWJsZVxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgb3BlbiBzb3VyY2UgbGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgRGVjb2RlU3RyZWFtIGZyb20gXCIuL0RlY29kZVN0cmVhbVwiO1xudmFyIExaV1N0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTFpXU3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIExaV1N0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBlYXJseUNoYW5nZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtYXliZUxlbmd0aCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBfdGhpcy5jYWNoZWREYXRhID0gMDtcbiAgICAgICAgX3RoaXMuYml0c0NhY2hlZCA9IDA7XG4gICAgICAgIHZhciBtYXhMendEaWN0aW9uYXJ5U2l6ZSA9IDQwOTY7XG4gICAgICAgIHZhciBsendTdGF0ZSA9IHtcbiAgICAgICAgICAgIGVhcmx5Q2hhbmdlOiBlYXJseUNoYW5nZSxcbiAgICAgICAgICAgIGNvZGVMZW5ndGg6IDksXG4gICAgICAgICAgICBuZXh0Q29kZTogMjU4LFxuICAgICAgICAgICAgZGljdGlvbmFyeVZhbHVlczogbmV3IFVpbnQ4QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLFxuICAgICAgICAgICAgZGljdGlvbmFyeUxlbmd0aHM6IG5ldyBVaW50MTZBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksXG4gICAgICAgICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLFxuICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlOiBuZXcgVWludDhBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksXG4gICAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGg6IDAsXG4gICAgICAgIH07XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgICAgIGx6d1N0YXRlLmRpY3Rpb25hcnlWYWx1ZXNbaV0gPSBpO1xuICAgICAgICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeUxlbmd0aHNbaV0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmx6d1N0YXRlID0gbHp3U3RhdGU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTFpXU3RyZWFtLnByb3RvdHlwZS5yZWFkQmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBibG9ja1NpemUgPSA1MTI7XG4gICAgICAgIHZhciBlc3RpbWF0ZWREZWNvZGVkU2l6ZSA9IGJsb2NrU2l6ZSAqIDI7XG4gICAgICAgIHZhciBkZWNvZGVkU2l6ZURlbHRhID0gYmxvY2tTaXplO1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgdmFyIGo7XG4gICAgICAgIHZhciBxO1xuICAgICAgICB2YXIgbHp3U3RhdGUgPSB0aGlzLmx6d1N0YXRlO1xuICAgICAgICBpZiAoIWx6d1N0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGVvZiB3YXMgZm91bmRcbiAgICAgICAgfVxuICAgICAgICB2YXIgZWFybHlDaGFuZ2UgPSBsendTdGF0ZS5lYXJseUNoYW5nZTtcbiAgICAgICAgdmFyIG5leHRDb2RlID0gbHp3U3RhdGUubmV4dENvZGU7XG4gICAgICAgIHZhciBkaWN0aW9uYXJ5VmFsdWVzID0gbHp3U3RhdGUuZGljdGlvbmFyeVZhbHVlcztcbiAgICAgICAgdmFyIGRpY3Rpb25hcnlMZW5ndGhzID0gbHp3U3RhdGUuZGljdGlvbmFyeUxlbmd0aHM7XG4gICAgICAgIHZhciBkaWN0aW9uYXJ5UHJldkNvZGVzID0gbHp3U3RhdGUuZGljdGlvbmFyeVByZXZDb2RlcztcbiAgICAgICAgdmFyIGNvZGVMZW5ndGggPSBsendTdGF0ZS5jb2RlTGVuZ3RoO1xuICAgICAgICB2YXIgcHJldkNvZGUgPSBsendTdGF0ZS5wcmV2Q29kZTtcbiAgICAgICAgdmFyIGN1cnJlbnRTZXF1ZW5jZSA9IGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZTtcbiAgICAgICAgdmFyIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZUxlbmd0aDtcbiAgICAgICAgdmFyIGRlY29kZWRMZW5ndGggPSAwO1xuICAgICAgICB2YXIgY3VycmVudEJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoO1xuICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBlc3RpbWF0ZWREZWNvZGVkU2l6ZSk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvZGUgPSB0aGlzLnJlYWRCaXRzKGNvZGVMZW5ndGgpO1xuICAgICAgICAgICAgdmFyIGhhc1ByZXYgPSBjdXJyZW50U2VxdWVuY2VMZW5ndGggPiAwO1xuICAgICAgICAgICAgaWYgKCFjb2RlIHx8IGNvZGUgPCAyNTYpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50U2VxdWVuY2VbMF0gPSBjb2RlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb2RlID49IDI1OCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2RlIDwgbmV4dENvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gZGljdGlvbmFyeUxlbmd0aHNbY29kZV07XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCAtIDEsIHEgPSBjb2RlOyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlW2pdID0gZGljdGlvbmFyeVZhbHVlc1txXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBkaWN0aW9uYXJ5UHJldkNvZGVzW3FdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VxdWVuY2VbY3VycmVudFNlcXVlbmNlTGVuZ3RoKytdID0gY3VycmVudFNlcXVlbmNlWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPT09IDI1Nikge1xuICAgICAgICAgICAgICAgIGNvZGVMZW5ndGggPSA5O1xuICAgICAgICAgICAgICAgIG5leHRDb2RlID0gMjU4O1xuICAgICAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubHp3U3RhdGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzUHJldikge1xuICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlQcmV2Q29kZXNbbmV4dENvZGVdID0gcHJldkNvZGU7XG4gICAgICAgICAgICAgICAgZGljdGlvbmFyeUxlbmd0aHNbbmV4dENvZGVdID0gZGljdGlvbmFyeUxlbmd0aHNbcHJldkNvZGVdICsgMTtcbiAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5VmFsdWVzW25leHRDb2RlXSA9IGN1cnJlbnRTZXF1ZW5jZVswXTtcbiAgICAgICAgICAgICAgICBuZXh0Q29kZSsrO1xuICAgICAgICAgICAgICAgIGNvZGVMZW5ndGggPVxuICAgICAgICAgICAgICAgICAgICAobmV4dENvZGUgKyBlYXJseUNoYW5nZSkgJiAobmV4dENvZGUgKyBlYXJseUNoYW5nZSAtIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNvZGVMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgIDogTWF0aC5taW4oTWF0aC5sb2cobmV4dENvZGUgKyBlYXJseUNoYW5nZSkgLyAwLjY5MzE0NzE4MDU1OTk0NTMgKyAxLCAxMikgfCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldkNvZGUgPSBjb2RlO1xuICAgICAgICAgICAgZGVjb2RlZExlbmd0aCArPSBjdXJyZW50U2VxdWVuY2VMZW5ndGg7XG4gICAgICAgICAgICBpZiAoZXN0aW1hdGVkRGVjb2RlZFNpemUgPCBkZWNvZGVkTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWREZWNvZGVkU2l6ZSArPSBkZWNvZGVkU2l6ZURlbHRhO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKGVzdGltYXRlZERlY29kZWRTaXplIDwgZGVjb2RlZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBlc3RpbWF0ZWREZWNvZGVkU2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY3VycmVudFNlcXVlbmNlTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbY3VycmVudEJ1ZmZlckxlbmd0aCsrXSA9IGN1cnJlbnRTZXF1ZW5jZVtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsendTdGF0ZS5uZXh0Q29kZSA9IG5leHRDb2RlO1xuICAgICAgICBsendTdGF0ZS5jb2RlTGVuZ3RoID0gY29kZUxlbmd0aDtcbiAgICAgICAgbHp3U3RhdGUucHJldkNvZGUgPSBwcmV2Q29kZTtcbiAgICAgICAgbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoO1xuICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGN1cnJlbnRCdWZmZXJMZW5ndGg7XG4gICAgfTtcbiAgICBMWldTdHJlYW0ucHJvdG90eXBlLnJlYWRCaXRzID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgdmFyIGJpdHNDYWNoZWQgPSB0aGlzLmJpdHNDYWNoZWQ7XG4gICAgICAgIHZhciBjYWNoZWREYXRhID0gdGhpcy5jYWNoZWREYXRhO1xuICAgICAgICB3aGlsZSAoYml0c0NhY2hlZCA8IG4pIHtcbiAgICAgICAgICAgIHZhciBjID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpO1xuICAgICAgICAgICAgaWYgKGMgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FjaGVkRGF0YSA9IChjYWNoZWREYXRhIDw8IDgpIHwgYztcbiAgICAgICAgICAgIGJpdHNDYWNoZWQgKz0gODtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJpdHNDYWNoZWQgPSBiaXRzQ2FjaGVkIC09IG47XG4gICAgICAgIHRoaXMuY2FjaGVkRGF0YSA9IGNhY2hlZERhdGE7XG4gICAgICAgIHJldHVybiAoY2FjaGVkRGF0YSA+Pj4gYml0c0NhY2hlZCkgJiAoKDEgPDwgbikgLSAxKTtcbiAgICB9O1xuICAgIHJldHVybiBMWldTdHJlYW07XG59KERlY29kZVN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgTFpXU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TFpXU3RyZWFtLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBUaGUgUnVuTGVuZ3RoU3RyZWFtIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBUeXBlU2NyaXB0IHBvcnQgb2YgdGhlXG4gKiBKYXZhU2NyaXB0IFJ1bkxlbmd0aFN0cmVhbSBjbGFzcyBpbiBNb3ppbGxhJ3MgcGRmLmpzIHByb2plY3QsIG1hZGUgYXZhaWxhYmxlXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZSBsaWNlbnNlLlxuICovXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBEZWNvZGVTdHJlYW0gZnJvbSBcIi4vRGVjb2RlU3RyZWFtXCI7XG52YXIgUnVuTGVuZ3RoU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSdW5MZW5ndGhTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUnVuTGVuZ3RoU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWF5YmVMZW5ndGgpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSdW5MZW5ndGhTdHJlYW0ucHJvdG90eXBlLnJlYWRCbG9jayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVGhlIHJlcGVhdEhlYWRlciBoYXMgZm9sbG93aW5nIGZvcm1hdC4gVGhlIGZpcnN0IGJ5dGUgZGVmaW5lcyB0eXBlIG9mIHJ1blxuICAgICAgICAvLyBhbmQgYW1vdW50IG9mIGJ5dGVzIHRvIHJlcGVhdC9jb3B5OiBuID0gMCB0aHJvdWdoIDEyNyAtIGNvcHkgbmV4dCBuIGJ5dGVzXG4gICAgICAgIC8vIChpbiBhZGRpdGlvbiB0byB0aGUgc2Vjb25kIGJ5dGUgZnJvbSB0aGUgaGVhZGVyKSwgbiA9IDEyOSB0aHJvdWdoIDI1NSAtXG4gICAgICAgIC8vIGR1cGxpY2F0ZSB0aGUgc2Vjb25kIGJ5dGUgZnJvbSB0aGUgaGVhZGVyICgyNTcgLSBuKSB0aW1lcywgbiA9IDEyOCAtIGVuZC5cbiAgICAgICAgdmFyIHJlcGVhdEhlYWRlciA9IHRoaXMuc3RyZWFtLmdldEJ5dGVzKDIpO1xuICAgICAgICBpZiAoIXJlcGVhdEhlYWRlciB8fCByZXBlYXRIZWFkZXIubGVuZ3RoIDwgMiB8fCByZXBlYXRIZWFkZXJbMF0gPT09IDEyOCkge1xuICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBidWZmZXI7XG4gICAgICAgIHZhciBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgICAgdmFyIG4gPSByZXBlYXRIZWFkZXJbMF07XG4gICAgICAgIGlmIChuIDwgMTI4KSB7XG4gICAgICAgICAgICAvLyBjb3B5IG4gYnl0ZXNcbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIG4gKyAxKTtcbiAgICAgICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSByZXBlYXRIZWFkZXJbMV07XG4gICAgICAgICAgICBpZiAobiA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZXMobik7XG4gICAgICAgICAgICAgICAgYnVmZmVyLnNldChzb3VyY2UsIGJ1ZmZlckxlbmd0aCk7XG4gICAgICAgICAgICAgICAgYnVmZmVyTGVuZ3RoICs9IG47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuID0gMjU3IC0gbjtcbiAgICAgICAgICAgIHZhciBiID0gcmVwZWF0SGVhZGVyWzFdO1xuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbiArIDEpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gYjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDtcbiAgICB9O1xuICAgIHJldHVybiBSdW5MZW5ndGhTdHJlYW07XG59KERlY29kZVN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgUnVuTGVuZ3RoU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UnVuTGVuZ3RoU3RyZWFtLmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBUaGUgU3RyZWFtIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgaXMgYSBUeXBlU2NyaXB0IHBvcnQgb2YgdGhlXG4gKiBKYXZhU2NyaXB0IFN0cmVhbSBjbGFzcyBpbiBNb3ppbGxhJ3MgcGRmLmpzIHByb2plY3QsIG1hZGUgYXZhaWxhYmxlXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBvcGVuIHNvdXJjZSBsaWNlbnNlLlxuICovXG52YXIgU3RyZWFtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN0cmVhbShidWZmZXIsIHN0YXJ0LCBsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5ieXRlcyA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICAgIHRoaXMucG9zID0gdGhpcy5zdGFydDtcbiAgICAgICAgdGhpcy5lbmQgPSAhIXN0YXJ0ICYmICEhbGVuZ3RoID8gc3RhcnQgKyBsZW5ndGggOiB0aGlzLmJ5dGVzLmxlbmd0aDtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmVhbS5wcm90b3R5cGUsIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmQgLSB0aGlzLnN0YXJ0O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmVhbS5wcm90b3R5cGUsIFwiaXNFbXB0eVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgU3RyZWFtLnByb3RvdHlwZS5nZXRCeXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5lbmQpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ieXRlc1t0aGlzLnBvcysrXTtcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUuZ2V0VWludDE2ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYjAgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIxID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChiMCA8PCA4KSArIGIxO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5nZXRJbnQzMiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGIwID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHZhciBiMSA9IHRoaXMuZ2V0Qnl0ZSgpO1xuICAgICAgICB2YXIgYjIgPSB0aGlzLmdldEJ5dGUoKTtcbiAgICAgICAgdmFyIGIzID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzO1xuICAgIH07XG4gICAgLy8gUmV0dXJucyBzdWJhcnJheSBvZiBvcmlnaW5hbCBidWZmZXIsIHNob3VsZCBvbmx5IGJlIHJlYWQuXG4gICAgU3RyZWFtLnByb3RvdHlwZS5nZXRCeXRlcyA9IGZ1bmN0aW9uIChsZW5ndGgsIGZvcmNlQ2xhbXBlZCkge1xuICAgICAgICBpZiAoZm9yY2VDbGFtcGVkID09PSB2b2lkIDApIHsgZm9yY2VDbGFtcGVkID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlcztcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICB2YXIgc3RyRW5kID0gdGhpcy5lbmQ7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgc3ViYXJyYXkgPSBieXRlcy5zdWJhcnJheShwb3MsIHN0ckVuZCk7XG4gICAgICAgICAgICAvLyBgdGhpcy5ieXRlc2AgaXMgYWx3YXlzIGEgYFVpbnQ4QXJyYXlgIGhlcmUuXG4gICAgICAgICAgICByZXR1cm4gZm9yY2VDbGFtcGVkID8gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN1YmFycmF5KSA6IHN1YmFycmF5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGVuZCA9IHBvcyArIGxlbmd0aDtcbiAgICAgICAgICAgIGlmIChlbmQgPiBzdHJFbmQpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBzdHJFbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgICAgIHZhciBzdWJhcnJheSA9IGJ5dGVzLnN1YmFycmF5KHBvcywgZW5kKTtcbiAgICAgICAgICAgIC8vIGB0aGlzLmJ5dGVzYCBpcyBhbHdheXMgYSBgVWludDhBcnJheWAgaGVyZS5cbiAgICAgICAgICAgIHJldHVybiBmb3JjZUNsYW1wZWQgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3ViYXJyYXkpIDogc3ViYXJyYXk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUucGVla0J5dGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7XG4gICAgICAgIHRoaXMucG9zLS07XG4gICAgICAgIHJldHVybiBwZWVrZWRCeXRlO1xuICAgIH07XG4gICAgU3RyZWFtLnByb3RvdHlwZS5wZWVrQnl0ZXMgPSBmdW5jdGlvbiAobGVuZ3RoLCBmb3JjZUNsYW1wZWQpIHtcbiAgICAgICAgaWYgKGZvcmNlQ2xhbXBlZCA9PT0gdm9pZCAwKSB7IGZvcmNlQ2xhbXBlZCA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBieXRlcyA9IHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoLCBmb3JjZUNsYW1wZWQpO1xuICAgICAgICB0aGlzLnBvcyAtPSBieXRlcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiBieXRlcztcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIGlmICghbikge1xuICAgICAgICAgICAgbiA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3MgKz0gbjtcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucG9zID0gdGhpcy5zdGFydDtcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUubW92ZVN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgfTtcbiAgICBTdHJlYW0ucHJvdG90eXBlLm1ha2VTdWJTdHJlYW0gPSBmdW5jdGlvbiAoc3RhcnQsIGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0cmVhbSh0aGlzLmJ5dGVzLCBzdGFydCwgbGVuZ3RoKTtcbiAgICB9O1xuICAgIFN0cmVhbS5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ieXRlcztcbiAgICB9O1xuICAgIHJldHVybiBTdHJlYW07XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IsIFVuc3VwcG9ydGVkRW5jb2RpbmdFcnJvciwgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGQXJyYXkgZnJvbSBcIi4uL29iamVjdHMvUERGQXJyYXlcIjtcbmltcG9ydCBQREZEaWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkRpY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgQXNjaWk4NVN0cmVhbSBmcm9tIFwiLi9Bc2NpaTg1U3RyZWFtXCI7XG5pbXBvcnQgQXNjaWlIZXhTdHJlYW0gZnJvbSBcIi4vQXNjaWlIZXhTdHJlYW1cIjtcbmltcG9ydCBGbGF0ZVN0cmVhbSBmcm9tIFwiLi9GbGF0ZVN0cmVhbVwiO1xuaW1wb3J0IExaV1N0cmVhbSBmcm9tIFwiLi9MWldTdHJlYW1cIjtcbmltcG9ydCBSdW5MZW5ndGhTdHJlYW0gZnJvbSBcIi4vUnVuTGVuZ3RoU3RyZWFtXCI7XG5pbXBvcnQgU3RyZWFtIGZyb20gXCIuL1N0cmVhbVwiO1xudmFyIGRlY29kZVN0cmVhbSA9IGZ1bmN0aW9uIChzdHJlYW0sIGVuY29kaW5nLCBwYXJhbXMpIHtcbiAgICBpZiAoZW5jb2RpbmcgPT09IFBERk5hbWUub2YoJ0ZsYXRlRGVjb2RlJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGbGF0ZVN0cmVhbShzdHJlYW0pO1xuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgPT09IFBERk5hbWUub2YoJ0xaV0RlY29kZScpKSB7XG4gICAgICAgIHZhciBlYXJseUNoYW5nZSA9IDE7XG4gICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBQREZEaWN0KSB7XG4gICAgICAgICAgICB2YXIgRWFybHlDaGFuZ2UgPSBwYXJhbXMubG9va3VwKFBERk5hbWUub2YoJ0Vhcmx5Q2hhbmdlJykpO1xuICAgICAgICAgICAgaWYgKEVhcmx5Q2hhbmdlIGluc3RhbmNlb2YgUERGTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgZWFybHlDaGFuZ2UgPSBFYXJseUNoYW5nZS5hc051bWJlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTFpXU3RyZWFtKHN0cmVhbSwgdW5kZWZpbmVkLCBlYXJseUNoYW5nZSk7XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyA9PT0gUERGTmFtZS5vZignQVNDSUk4NURlY29kZScpKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXNjaWk4NVN0cmVhbShzdHJlYW0pO1xuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgPT09IFBERk5hbWUub2YoJ0FTQ0lJSGV4RGVjb2RlJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBc2NpaUhleFN0cmVhbShzdHJlYW0pO1xuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgPT09IFBERk5hbWUub2YoJ1J1bkxlbmd0aERlY29kZScpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUnVuTGVuZ3RoU3RyZWFtKHN0cmVhbSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVuY29kaW5nRXJyb3IoZW5jb2RpbmcuYXNTdHJpbmcoKSk7XG59O1xuZXhwb3J0IHZhciBkZWNvZGVQREZSYXdTdHJlYW0gPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgZGljdCA9IF9hLmRpY3QsIGNvbnRlbnRzID0gX2EuY29udGVudHM7XG4gICAgdmFyIHN0cmVhbSA9IG5ldyBTdHJlYW0oY29udGVudHMpO1xuICAgIHZhciBGaWx0ZXIgPSBkaWN0Lmxvb2t1cChQREZOYW1lLm9mKCdGaWx0ZXInKSk7XG4gICAgdmFyIERlY29kZVBhcm1zID0gZGljdC5sb29rdXAoUERGTmFtZS5vZignRGVjb2RlUGFybXMnKSk7XG4gICAgaWYgKEZpbHRlciBpbnN0YW5jZW9mIFBERk5hbWUpIHtcbiAgICAgICAgc3RyZWFtID0gZGVjb2RlU3RyZWFtKHN0cmVhbSwgRmlsdGVyLCBEZWNvZGVQYXJtcyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKEZpbHRlciBpbnN0YW5jZW9mIFBERkFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEZpbHRlci5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHN0cmVhbSA9IGRlY29kZVN0cmVhbShzdHJlYW0sIEZpbHRlci5sb29rdXAoaWR4LCBQREZOYW1lKSwgRGVjb2RlUGFybXMgJiYgRGVjb2RlUGFybXMubG9va3VwTWF5YmUoaWR4LCBQREZEaWN0KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoISFGaWx0ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRPYmplY3RUeXBlRXJyb3IoW1BERk5hbWUsIFBERkFycmF5XSwgRmlsdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmVhbTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNvZGUuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgeyBQREZBY3JvRm9ybSB9IGZyb20gXCIuLi9hY3JvZm9ybVwiO1xuaW1wb3J0IFZpZXdlclByZWZlcmVuY2VzIGZyb20gJy4uL2ludGVyYWN0aXZlL1ZpZXdlclByZWZlcmVuY2VzJztcbnZhciBQREZDYXRhbG9nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQREZDYXRhbG9nLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkNhdGFsb2coKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuUGFnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cChQREZOYW1lLm9mKCdQYWdlcycpLCBQREZEaWN0KTtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLkFjcm9Gb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBNYXliZShQREZOYW1lLm9mKCdBY3JvRm9ybScpLCBQREZEaWN0KTtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLmdldEFjcm9Gb3JtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGljdCA9IHRoaXMuQWNyb0Zvcm0oKTtcbiAgICAgICAgaWYgKCFkaWN0KVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIFBERkFjcm9Gb3JtLmZyb21EaWN0KGRpY3QpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuZ2V0T3JDcmVhdGVBY3JvRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFjcm9Gb3JtID0gdGhpcy5nZXRBY3JvRm9ybSgpO1xuICAgICAgICBpZiAoIWFjcm9Gb3JtKSB7XG4gICAgICAgICAgICBhY3JvRm9ybSA9IFBERkFjcm9Gb3JtLmNyZWF0ZSh0aGlzLmNvbnRleHQpO1xuICAgICAgICAgICAgdmFyIGFjcm9Gb3JtUmVmID0gdGhpcy5jb250ZXh0LnJlZ2lzdGVyKGFjcm9Gb3JtLmRpY3QpO1xuICAgICAgICAgICAgdGhpcy5zZXQoUERGTmFtZS5vZignQWNyb0Zvcm0nKSwgYWNyb0Zvcm1SZWYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY3JvRm9ybTtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLlZpZXdlclByZWZlcmVuY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBNYXliZShQREZOYW1lLm9mKCdWaWV3ZXJQcmVmZXJlbmNlcycpLCBQREZEaWN0KTtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cucHJvdG90eXBlLmdldFZpZXdlclByZWZlcmVuY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGljdCA9IHRoaXMuVmlld2VyUHJlZmVyZW5jZXMoKTtcbiAgICAgICAgaWYgKCFkaWN0KVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIFZpZXdlclByZWZlcmVuY2VzLmZyb21EaWN0KGRpY3QpO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUuZ2V0T3JDcmVhdGVWaWV3ZXJQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZpZXdlclByZWZzID0gdGhpcy5nZXRWaWV3ZXJQcmVmZXJlbmNlcygpO1xuICAgICAgICBpZiAoIXZpZXdlclByZWZzKSB7XG4gICAgICAgICAgICB2aWV3ZXJQcmVmcyA9IFZpZXdlclByZWZlcmVuY2VzLmNyZWF0ZSh0aGlzLmNvbnRleHQpO1xuICAgICAgICAgICAgdmFyIHZpZXdlclByZWZzUmVmID0gdGhpcy5jb250ZXh0LnJlZ2lzdGVyKHZpZXdlclByZWZzLmRpY3QpO1xuICAgICAgICAgICAgdGhpcy5zZXQoUERGTmFtZS5vZignVmlld2VyUHJlZmVyZW5jZXMnKSwgdmlld2VyUHJlZnNSZWYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aWV3ZXJQcmVmcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgdGhlIGdpdmVuIHJlZiBhcyBhIGxlYWYgbm9kZSBvZiB0aGlzIGNhdGFsb2cncyBwYWdlIHRyZWUgYXQgdGhlXG4gICAgICogc3BlY2lmaWVkIGluZGV4ICh6ZXJvLWJhc2VkKS4gQWxzbyBpbmNyZW1lbnRzIHRoZSBgQ291bnRgIG9mIGVhY2ggbm9kZSBpblxuICAgICAqIHRoZSBwYWdlIHRyZWUgaGllcmFyY2h5IHRvIGFjY29tb2RhdGUgdGhlIG5ldyBwYWdlLlxuICAgICAqXG4gICAgICogUmV0dXJucyB0aGUgcmVmIG9mIHRoZSBQREZQYWdlVHJlZSBub2RlIGludG8gd2hpY2ggYGxlYWZSZWZgIHdhcyBpbnNlcnRlZC5cbiAgICAgKi9cbiAgICBQREZDYXRhbG9nLnByb3RvdHlwZS5pbnNlcnRMZWFmTm9kZSA9IGZ1bmN0aW9uIChsZWFmUmVmLCBpbmRleCkge1xuICAgICAgICB2YXIgcGFnZXNSZWYgPSB0aGlzLmdldChQREZOYW1lLm9mKCdQYWdlcycpKTtcbiAgICAgICAgdmFyIG1heWJlUGFyZW50UmVmID0gdGhpcy5QYWdlcygpLmluc2VydExlYWZOb2RlKGxlYWZSZWYsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIG1heWJlUGFyZW50UmVmIHx8IHBhZ2VzUmVmO1xuICAgIH07XG4gICAgUERGQ2F0YWxvZy5wcm90b3R5cGUucmVtb3ZlTGVhZk5vZGUgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5QYWdlcygpLnJlbW92ZUxlYWZOb2RlKGluZGV4KTtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cud2l0aENvbnRleHRBbmRQYWdlcyA9IGZ1bmN0aW9uIChjb250ZXh0LCBwYWdlcykge1xuICAgICAgICB2YXIgZGljdCA9IG5ldyBNYXAoKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5vZignVHlwZScpLCBQREZOYW1lLm9mKCdDYXRhbG9nJykpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdQYWdlcycpLCBwYWdlcyk7XG4gICAgICAgIHJldHVybiBuZXcgUERGQ2F0YWxvZyhkaWN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFBERkNhdGFsb2cuZnJvbU1hcFdpdGhDb250ZXh0ID0gZnVuY3Rpb24gKG1hcCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFBERkNhdGFsb2cobWFwLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBQREZDYXRhbG9nO1xufShQREZEaWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZDYXRhbG9nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQ2F0YWxvZy5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZGbGF0ZVN0cmVhbSBmcm9tIFwiLi9QREZGbGF0ZVN0cmVhbVwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi4vc3ludGF4L0NoYXJDb2Rlc1wiO1xudmFyIFBERkNvbnRlbnRTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkNvbnRlbnRTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGQ29udGVudFN0cmVhbShkaWN0LCBvcGVyYXRvcnMsIGVuY29kZSkge1xuICAgICAgICBpZiAoZW5jb2RlID09PSB2b2lkIDApIHsgZW5jb2RlID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkaWN0LCBlbmNvZGUpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9wZXJhdG9ycyA9IG9wZXJhdG9ycztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZDb250ZW50U3RyZWFtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBvcGVyYXRvcnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG9wZXJhdG9yc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IHRoaXMub3BlcmF0b3JzKS5wdXNoLmFwcGx5KF9hLCBvcGVyYXRvcnMpO1xuICAgIH07XG4gICAgUERGQ29udGVudFN0cmVhbS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgb3BlcmF0b3JzID0gbmV3IEFycmF5KHRoaXMub3BlcmF0b3JzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgb3BlcmF0b3JzW2lkeF0gPSB0aGlzLm9wZXJhdG9yc1tpZHhdLmNsb25lKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGRpY3QgPSBfYS5kaWN0LCBlbmNvZGUgPSBfYS5lbmNvZGU7XG4gICAgICAgIHJldHVybiBQREZDb250ZW50U3RyZWFtLm9mKGRpY3QuY2xvbmUoY29udGV4dCksIG9wZXJhdG9ycywgZW5jb2RlKTtcbiAgICB9O1xuICAgIFBERkNvbnRlbnRTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YWx1ZSArPSB0aGlzLm9wZXJhdG9yc1tpZHhdICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBQREZDb250ZW50U3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuZ2V0VW5lbmNvZGVkQ29udGVudHNTaXplKCkpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdGhpcy5vcGVyYXRvcnNbaWR4XS5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH07XG4gICAgUERGQ29udGVudFN0cmVhbS5wcm90b3R5cGUuZ2V0VW5lbmNvZGVkQ29udGVudHNTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2l6ZSA9IDA7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgc2l6ZSArPSB0aGlzLm9wZXJhdG9yc1tpZHhdLnNpemVJbkJ5dGVzKCkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH07XG4gICAgUERGQ29udGVudFN0cmVhbS5vZiA9IGZ1bmN0aW9uIChkaWN0LCBvcGVyYXRvcnMsIGVuY29kZSkge1xuICAgICAgICBpZiAoZW5jb2RlID09PSB2b2lkIDApIHsgZW5jb2RlID0gdHJ1ZTsgfVxuICAgICAgICByZXR1cm4gbmV3IFBERkNvbnRlbnRTdHJlYW0oZGljdCwgb3BlcmF0b3JzLCBlbmNvZGUpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkNvbnRlbnRTdHJlYW07XG59KFBERkZsYXRlU3RyZWFtKSk7XG5leHBvcnQgZGVmYXVsdCBQREZDb250ZW50U3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQ29udGVudFN0cmVhbS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZSZWYgZnJvbSBcIi4uL29iamVjdHMvUERGUmVmXCI7XG5pbXBvcnQgUERGRmxhdGVTdHJlYW0gZnJvbSBcIi4vUERGRmxhdGVTdHJlYW1cIjtcbmltcG9ydCB7IGJ5dGVzRm9yLCBDYWNoZSwgcmV2ZXJzZUFycmF5LCBzaXplSW5CeXRlcywgc3VtIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5leHBvcnQgdmFyIEVudHJ5VHlwZTtcbihmdW5jdGlvbiAoRW50cnlUeXBlKSB7XG4gICAgRW50cnlUeXBlW0VudHJ5VHlwZVtcIkRlbGV0ZWRcIl0gPSAwXSA9IFwiRGVsZXRlZFwiO1xuICAgIEVudHJ5VHlwZVtFbnRyeVR5cGVbXCJVbmNvbXByZXNzZWRcIl0gPSAxXSA9IFwiVW5jb21wcmVzc2VkXCI7XG4gICAgRW50cnlUeXBlW0VudHJ5VHlwZVtcIkNvbXByZXNzZWRcIl0gPSAyXSA9IFwiQ29tcHJlc3NlZFwiO1xufSkoRW50cnlUeXBlIHx8IChFbnRyeVR5cGUgPSB7fSkpO1xuLyoqXG4gKiBFbnRyaWVzIHNob3VsZCBiZSBhZGRlZCB1c2luZyB0aGUgW1thZGREZWxldGVkRW50cnldXSxcbiAqIFtbYWRkVW5jb21wcmVzc2VkRW50cnldXSwgYW5kIFtbYWRkQ29tcHJlc3NlZEVudHJ5XV0gbWV0aG9kc1xuICogKippbiBvcmRlciBvZiBhc2NlbmRpbmcgb2JqZWN0IG51bWJlcioqLlxuICovXG52YXIgUERGQ3Jvc3NSZWZTdHJlYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERkNyb3NzUmVmU3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERkNyb3NzUmVmU3RyZWFtKGRpY3QsIGVudHJpZXMsIGVuY29kZSkge1xuICAgICAgICBpZiAoZW5jb2RlID09PSB2b2lkIDApIHsgZW5jb2RlID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkaWN0LCBlbmNvZGUpIHx8IHRoaXM7XG4gICAgICAgIC8vIFJldHVybnMgYW4gYXJyYXkgb2YgaW50ZWdlciBwYWlycyBmb3IgZWFjaCBzdWJzZWN0aW9uIG9mIHRoZSBjcm9zcyByZWZcbiAgICAgICAgLy8gc2VjdGlvbiwgd2hlcmUgZWFjaCBpbnRlZ2VyIHBhaXIgcmVwcmVzZW50czpcbiAgICAgICAgLy8gICBmaXJzdE9iamVjdE51bWJlcihPZlNlY3Rpb24pLCBsZW5ndGgoT2ZTZWN0aW9uKVxuICAgICAgICBfdGhpcy5jb21wdXRlSW5kZXggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3Vic2VjdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHZhciBzdWJzZWN0aW9uTGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IF90aGlzLmVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJFbnRyeSA9IF90aGlzLmVudHJpZXNbaWR4XTtcbiAgICAgICAgICAgICAgICB2YXIgcHJldkVudHJ5ID0gX3RoaXMuZW50cmllc1tpZHggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNlY3Rpb25zLnB1c2goY3VyckVudHJ5LnJlZi5vYmplY3ROdW1iZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyRW50cnkucmVmLm9iamVjdE51bWJlciAtIHByZXZFbnRyeS5yZWYub2JqZWN0TnVtYmVyID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBzdWJzZWN0aW9ucy5wdXNoKHN1YnNlY3Rpb25MZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBzdWJzZWN0aW9ucy5wdXNoKGN1cnJFbnRyeS5yZWYub2JqZWN0TnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2VjdGlvbkxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN1YnNlY3Rpb25MZW5ndGggKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YnNlY3Rpb25zLnB1c2goc3Vic2VjdGlvbkxlbmd0aCk7XG4gICAgICAgICAgICByZXR1cm4gc3Vic2VjdGlvbnM7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmNvbXB1dGVFbnRyeVR1cGxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlbnRyeVR1cGxlcyA9IG5ldyBBcnJheShfdGhpcy5lbnRyaWVzLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBfdGhpcy5lbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IF90aGlzLmVudHJpZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gRW50cnlUeXBlLkRlbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBlbnRyeS50eXBlLCBuZXh0RnJlZU9iamVjdE51bWJlciA9IGVudHJ5Lm5leHRGcmVlT2JqZWN0TnVtYmVyLCByZWYgPSBlbnRyeS5yZWY7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5VHVwbGVzW2lkeF0gPSBbdHlwZSwgbmV4dEZyZWVPYmplY3ROdW1iZXIsIHJlZi5nZW5lcmF0aW9uTnVtYmVyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09IEVudHJ5VHlwZS5VbmNvbXByZXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBlbnRyeS50eXBlLCBvZmZzZXQgPSBlbnRyeS5vZmZzZXQsIHJlZiA9IGVudHJ5LnJlZjtcbiAgICAgICAgICAgICAgICAgICAgZW50cnlUdXBsZXNbaWR4XSA9IFt0eXBlLCBvZmZzZXQsIHJlZi5nZW5lcmF0aW9uTnVtYmVyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09IEVudHJ5VHlwZS5Db21wcmVzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gZW50cnkudHlwZSwgb2JqZWN0U3RyZWFtUmVmID0gZW50cnkub2JqZWN0U3RyZWFtUmVmLCBpbmRleCA9IGVudHJ5LmluZGV4O1xuICAgICAgICAgICAgICAgICAgICBlbnRyeVR1cGxlc1tpZHhdID0gW3R5cGUsIG9iamVjdFN0cmVhbVJlZi5vYmplY3ROdW1iZXIsIGluZGV4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW50cnlUdXBsZXM7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmNvbXB1dGVNYXhFbnRyeUJ5dGVXaWR0aHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZW50cnlUdXBsZXMgPSBfdGhpcy5lbnRyeVR1cGxlc0NhY2hlLmFjY2VzcygpO1xuICAgICAgICAgICAgdmFyIHdpZHRocyA9IFswLCAwLCAwXTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGVudHJ5VHVwbGVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IGVudHJ5VHVwbGVzW2lkeF0sIGZpcnN0ID0gX2FbMF0sIHNlY29uZCA9IF9hWzFdLCB0aGlyZCA9IF9hWzJdO1xuICAgICAgICAgICAgICAgIHZhciBmaXJzdFNpemUgPSBzaXplSW5CeXRlcyhmaXJzdCk7XG4gICAgICAgICAgICAgICAgdmFyIHNlY29uZFNpemUgPSBzaXplSW5CeXRlcyhzZWNvbmQpO1xuICAgICAgICAgICAgICAgIHZhciB0aGlyZFNpemUgPSBzaXplSW5CeXRlcyh0aGlyZCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0U2l6ZSA+IHdpZHRoc1swXSlcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhzWzBdID0gZmlyc3RTaXplO1xuICAgICAgICAgICAgICAgIGlmIChzZWNvbmRTaXplID4gd2lkdGhzWzFdKVxuICAgICAgICAgICAgICAgICAgICB3aWR0aHNbMV0gPSBzZWNvbmRTaXplO1xuICAgICAgICAgICAgICAgIGlmICh0aGlyZFNpemUgPiB3aWR0aHNbMl0pXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoc1syXSA9IHRoaXJkU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3aWR0aHM7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmVudHJpZXMgPSBlbnRyaWVzIHx8IFtdO1xuICAgICAgICBfdGhpcy5lbnRyeVR1cGxlc0NhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkoX3RoaXMuY29tcHV0ZUVudHJ5VHVwbGVzKTtcbiAgICAgICAgX3RoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlID0gQ2FjaGUucG9wdWxhdGVkQnkoX3RoaXMuY29tcHV0ZU1heEVudHJ5Qnl0ZVdpZHRocyk7XG4gICAgICAgIF90aGlzLmluZGV4Q2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeShfdGhpcy5jb21wdXRlSW5kZXgpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdUeXBlJyksIFBERk5hbWUub2YoJ1hSZWYnKSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLmFkZERlbGV0ZWRFbnRyeSA9IGZ1bmN0aW9uIChyZWYsIG5leHRGcmVlT2JqZWN0TnVtYmVyKSB7XG4gICAgICAgIHZhciB0eXBlID0gRW50cnlUeXBlLkRlbGV0ZWQ7XG4gICAgICAgIHRoaXMuZW50cmllcy5wdXNoKHsgdHlwZTogdHlwZSwgcmVmOiByZWYsIG5leHRGcmVlT2JqZWN0TnVtYmVyOiBuZXh0RnJlZU9iamVjdE51bWJlciB9KTtcbiAgICAgICAgdGhpcy5lbnRyeVR1cGxlc0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLmluZGV4Q2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgICAgICB0aGlzLmNvbnRlbnRzQ2FjaGUuaW52YWxpZGF0ZSgpO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLmFkZFVuY29tcHJlc3NlZEVudHJ5ID0gZnVuY3Rpb24gKHJlZiwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciB0eXBlID0gRW50cnlUeXBlLlVuY29tcHJlc3NlZDtcbiAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goeyB0eXBlOiB0eXBlLCByZWY6IHJlZiwgb2Zmc2V0OiBvZmZzZXQgfSk7XG4gICAgICAgIHRoaXMuZW50cnlUdXBsZXNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5pbmRleENhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5jb250ZW50c0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS5hZGRDb21wcmVzc2VkRW50cnkgPSBmdW5jdGlvbiAocmVmLCBvYmplY3RTdHJlYW1SZWYsIGluZGV4KSB7XG4gICAgICAgIHZhciB0eXBlID0gRW50cnlUeXBlLkNvbXByZXNzZWQ7XG4gICAgICAgIHRoaXMuZW50cmllcy5wdXNoKHsgdHlwZTogdHlwZSwgcmVmOiByZWYsIG9iamVjdFN0cmVhbVJlZjogb2JqZWN0U3RyZWFtUmVmLCBpbmRleDogaW5kZXggfSk7XG4gICAgICAgIHRoaXMuZW50cnlUdXBsZXNDYWNoZS5pbnZhbGlkYXRlKCk7XG4gICAgICAgIHRoaXMubWF4Qnl0ZVdpZHRoc0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5pbmRleENhY2hlLmludmFsaWRhdGUoKTtcbiAgICAgICAgdGhpcy5jb250ZW50c0NhY2hlLmludmFsaWRhdGUoKTtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGRpY3QgPSBfYS5kaWN0LCBlbnRyaWVzID0gX2EuZW50cmllcywgZW5jb2RlID0gX2EuZW5jb2RlO1xuICAgICAgICByZXR1cm4gUERGQ3Jvc3NSZWZTdHJlYW0ub2YoZGljdC5jbG9uZShjb250ZXh0KSwgZW50cmllcy5zbGljZSgpLCBlbmNvZGUpO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ucHJvdG90eXBlLmdldENvbnRlbnRzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZW50cnlUdXBsZXMgPSB0aGlzLmVudHJ5VHVwbGVzQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIHZhciBieXRlV2lkdGhzID0gdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICBmb3IgKHZhciBlbnRyeUlkeCA9IDAsIGVudHJpZXNMZW4gPSBlbnRyeVR1cGxlcy5sZW5ndGg7IGVudHJ5SWR4IDwgZW50cmllc0xlbjsgZW50cnlJZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZW50cnlUdXBsZXNbZW50cnlJZHhdLCBmaXJzdCA9IF9hWzBdLCBzZWNvbmQgPSBfYVsxXSwgdGhpcmQgPSBfYVsyXTtcbiAgICAgICAgICAgIHZhciBmaXJzdEJ5dGVzID0gcmV2ZXJzZUFycmF5KGJ5dGVzRm9yKGZpcnN0KSk7XG4gICAgICAgICAgICB2YXIgc2Vjb25kQnl0ZXMgPSByZXZlcnNlQXJyYXkoYnl0ZXNGb3Ioc2Vjb25kKSk7XG4gICAgICAgICAgICB2YXIgdGhpcmRCeXRlcyA9IHJldmVyc2VBcnJheShieXRlc0Zvcih0aGlyZCkpO1xuICAgICAgICAgICAgZm9yICh2YXIgaWR4ID0gYnl0ZVdpZHRoc1swXSAtIDE7IGlkeCA+PSAwOyBpZHgtLSkge1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IChmaXJzdEJ5dGVzW2lkeF0gfHwgMCkudG9TdHJpbmcoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSBieXRlV2lkdGhzWzFdIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gKHNlY29uZEJ5dGVzW2lkeF0gfHwgMCkudG9TdHJpbmcoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSBieXRlV2lkdGhzWzJdIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gKHRoaXJkQnl0ZXNbaWR4XSB8fCAwKS50b1N0cmluZygyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUuZ2V0VW5lbmNvZGVkQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbnRyeVR1cGxlcyA9IHRoaXMuZW50cnlUdXBsZXNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIGJ5dGVXaWR0aHMgPSB0aGlzLm1heEJ5dGVXaWR0aHNDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuZ2V0VW5lbmNvZGVkQ29udGVudHNTaXplKCkpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yICh2YXIgZW50cnlJZHggPSAwLCBlbnRyaWVzTGVuID0gZW50cnlUdXBsZXMubGVuZ3RoOyBlbnRyeUlkeCA8IGVudHJpZXNMZW47IGVudHJ5SWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGVudHJ5VHVwbGVzW2VudHJ5SWR4XSwgZmlyc3QgPSBfYVswXSwgc2Vjb25kID0gX2FbMV0sIHRoaXJkID0gX2FbMl07XG4gICAgICAgICAgICB2YXIgZmlyc3RCeXRlcyA9IHJldmVyc2VBcnJheShieXRlc0ZvcihmaXJzdCkpO1xuICAgICAgICAgICAgdmFyIHNlY29uZEJ5dGVzID0gcmV2ZXJzZUFycmF5KGJ5dGVzRm9yKHNlY29uZCkpO1xuICAgICAgICAgICAgdmFyIHRoaXJkQnl0ZXMgPSByZXZlcnNlQXJyYXkoYnl0ZXNGb3IodGhpcmQpKTtcbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IGJ5dGVXaWR0aHNbMF0gLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gZmlyc3RCeXRlc1tpZHhdIHx8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpZHggPSBieXRlV2lkdGhzWzFdIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IHNlY29uZEJ5dGVzW2lkeF0gfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGlkeCA9IGJ5dGVXaWR0aHNbMl0gLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gdGhpcmRCeXRlc1tpZHhdIHx8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9O1xuICAgIFBERkNyb3NzUmVmU3RyZWFtLnByb3RvdHlwZS5nZXRVbmVuY29kZWRDb250ZW50c1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBieXRlV2lkdGhzID0gdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIHZhciBlbnRyeVdpZHRoID0gc3VtKGJ5dGVXaWR0aHMpO1xuICAgICAgICByZXR1cm4gZW50cnlXaWR0aCAqIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZDcm9zc1JlZlN0cmVhbS5wcm90b3R5cGUudXBkYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS51cGRhdGVEaWN0LmNhbGwodGhpcyk7XG4gICAgICAgIHZhciBieXRlV2lkdGhzID0gdGhpcy5tYXhCeXRlV2lkdGhzQ2FjaGUuYWNjZXNzKCk7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXhDYWNoZS5hY2Nlc3MoKTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmRpY3QuY29udGV4dDtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdXJyksIGNvbnRleHQub2JqKGJ5dGVXaWR0aHMpKTtcbiAgICAgICAgdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdJbmRleCcpLCBjb250ZXh0Lm9iaihpbmRleCkpO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0uY3JlYXRlID0gZnVuY3Rpb24gKGRpY3QsIGVuY29kZSkge1xuICAgICAgICBpZiAoZW5jb2RlID09PSB2b2lkIDApIHsgZW5jb2RlID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgc3RyZWFtID0gbmV3IFBERkNyb3NzUmVmU3RyZWFtKGRpY3QsIFtdLCBlbmNvZGUpO1xuICAgICAgICBzdHJlYW0uYWRkRGVsZXRlZEVudHJ5KFBERlJlZi5vZigwLCA2NTUzNSksIDApO1xuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH07XG4gICAgUERGQ3Jvc3NSZWZTdHJlYW0ub2YgPSBmdW5jdGlvbiAoZGljdCwgZW50cmllcywgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHJldHVybiBuZXcgUERGQ3Jvc3NSZWZTdHJlYW0oZGljdCwgZW50cmllcywgZW5jb2RlKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZDcm9zc1JlZlN0cmVhbTtcbn0oUERGRmxhdGVTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IFBERkNyb3NzUmVmU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGQ3Jvc3NSZWZTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgcGFrbyBmcm9tICdwYWtvJztcbmltcG9ydCB7IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGU3RyZWFtIGZyb20gXCIuLi9vYmplY3RzL1BERlN0cmVhbVwiO1xuaW1wb3J0IHsgQ2FjaGUgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbnZhciBQREZGbGF0ZVN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGRmxhdGVTdHJlYW0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGRmxhdGVTdHJlYW0oZGljdCwgZW5jb2RlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRpY3QpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNvbXB1dGVDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB1bmVuY29kZWRDb250ZW50cyA9IF90aGlzLmdldFVuZW5jb2RlZENvbnRlbnRzKCk7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuZW5jb2RlID8gcGFrby5kZWZsYXRlKHVuZW5jb2RlZENvbnRlbnRzKSA6IHVuZW5jb2RlZENvbnRlbnRzO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5lbmNvZGUgPSBlbmNvZGU7XG4gICAgICAgIGlmIChlbmNvZGUpXG4gICAgICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdGaWx0ZXInKSwgUERGTmFtZS5vZignRmxhdGVEZWNvZGUnKSk7XG4gICAgICAgIF90aGlzLmNvbnRlbnRzQ2FjaGUgPSBDYWNoZS5wb3B1bGF0ZWRCeShfdGhpcy5jb21wdXRlQ29udGVudHMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERkZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudHNDYWNoZS5hY2Nlc3MoKTtcbiAgICB9O1xuICAgIFBERkZsYXRlU3RyZWFtLnByb3RvdHlwZS5nZXRDb250ZW50c1NpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzQ2FjaGUuYWNjZXNzKCkubGVuZ3RoO1xuICAgIH07XG4gICAgUERGRmxhdGVTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUsICdnZXRVbmVuY29kZWRDb250ZW50cycpO1xuICAgIH07XG4gICAgcmV0dXJuIFBERkZsYXRlU3RyZWFtO1xufShQREZTdHJlYW0pKTtcbmV4cG9ydCBkZWZhdWx0IFBERkZsYXRlU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGRmxhdGVTdHJlYW0uanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERkZsYXRlU3RyZWFtIGZyb20gXCIuL1BERkZsYXRlU3RyZWFtXCI7XG5pbXBvcnQgQ2hhckNvZGVzIGZyb20gXCIuLi9zeW50YXgvQ2hhckNvZGVzXCI7XG5pbXBvcnQgeyBjb3B5U3RyaW5nSW50b0J1ZmZlciwgbGFzdCB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERk9iamVjdFN0cmVhbSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGT2JqZWN0U3RyZWFtLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERk9iamVjdFN0cmVhbShjb250ZXh0LCBvYmplY3RzLCBlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVuY29kZSA9PT0gdm9pZCAwKSB7IGVuY29kZSA9IHRydWU7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29udGV4dC5vYmooe30pLCBlbmNvZGUpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9iamVjdHMgPSBvYmplY3RzO1xuICAgICAgICBfdGhpcy5vZmZzZXRzID0gX3RoaXMuY29tcHV0ZU9iamVjdE9mZnNldHMoKTtcbiAgICAgICAgX3RoaXMub2Zmc2V0c1N0cmluZyA9IF90aGlzLmNvbXB1dGVPZmZzZXRzU3RyaW5nKCk7XG4gICAgICAgIF90aGlzLmRpY3Quc2V0KFBERk5hbWUub2YoJ1R5cGUnKSwgUERGTmFtZS5vZignT2JqU3RtJykpO1xuICAgICAgICBfdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdOJyksIFBERk51bWJlci5vZihfdGhpcy5vYmplY3RzLmxlbmd0aCkpO1xuICAgICAgICBfdGhpcy5kaWN0LnNldChQREZOYW1lLm9mKCdGaXJzdCcpLCBQREZOdW1iZXIub2YoX3RoaXMub2Zmc2V0c1N0cmluZy5sZW5ndGgpKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQREZPYmplY3RTdHJlYW0ucHJvdG90eXBlLmdldE9iamVjdHNDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0cy5sZW5ndGg7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIFBERk9iamVjdFN0cmVhbS53aXRoQ29udGV4dEFuZE9iamVjdHMoY29udGV4dCB8fCB0aGlzLmRpY3QuY29udGV4dCwgdGhpcy5vYmplY3RzLnNsaWNlKCksIHRoaXMuZW5jb2RlKTtcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbS5wcm90b3R5cGUuZ2V0Q29udGVudHNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMub2Zmc2V0c1N0cmluZztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vYmplY3RzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5vYmplY3RzW2lkeF0sIG9iamVjdCA9IF9hWzFdO1xuICAgICAgICAgICAgdmFsdWUgKz0gb2JqZWN0ICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBQREZPYmplY3RTdHJlYW0ucHJvdG90eXBlLmdldFVuZW5jb2RlZENvbnRlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5nZXRVbmVuY29kZWRDb250ZW50c1NpemUoKSk7XG4gICAgICAgIHZhciBvZmZzZXQgPSBjb3B5U3RyaW5nSW50b0J1ZmZlcih0aGlzLm9mZnNldHNTdHJpbmcsIGJ1ZmZlciwgMCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHRoaXMub2JqZWN0cy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMub2JqZWN0c1tpZHhdLCBvYmplY3QgPSBfYVsxXTtcbiAgICAgICAgICAgIG9mZnNldCArPSBvYmplY3QuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbS5wcm90b3R5cGUuZ2V0VW5lbmNvZGVkQ29udGVudHNTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMub2Zmc2V0c1N0cmluZy5sZW5ndGggK1xuICAgICAgICAgICAgbGFzdCh0aGlzLm9mZnNldHMpWzFdICtcbiAgICAgICAgICAgIGxhc3QodGhpcy5vYmplY3RzKVsxXS5zaXplSW5CeXRlcygpICtcbiAgICAgICAgICAgIDEpO1xuICAgIH07XG4gICAgUERGT2JqZWN0U3RyZWFtLnByb3RvdHlwZS5jb21wdXRlT2Zmc2V0c1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9mZnNldHNTdHJpbmcgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vZmZzZXRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5vZmZzZXRzW2lkeF0sIG9iamVjdE51bWJlciA9IF9hWzBdLCBvZmZzZXQgPSBfYVsxXTtcbiAgICAgICAgICAgIG9mZnNldHNTdHJpbmcgKz0gb2JqZWN0TnVtYmVyICsgXCIgXCIgKyBvZmZzZXQgKyBcIiBcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0c1N0cmluZztcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbS5wcm90b3R5cGUuY29tcHV0ZU9iamVjdE9mZnNldHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICB2YXIgb2Zmc2V0cyA9IG5ldyBBcnJheSh0aGlzLm9iamVjdHMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGhpcy5vYmplY3RzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5vYmplY3RzW2lkeF0sIHJlZiA9IF9hWzBdLCBvYmplY3QgPSBfYVsxXTtcbiAgICAgICAgICAgIG9mZnNldHNbaWR4XSA9IFtyZWYub2JqZWN0TnVtYmVyLCBvZmZzZXRdO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IG9iamVjdC5zaXplSW5CeXRlcygpICsgMTsgLy8gJ1xcbidcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0cztcbiAgICB9O1xuICAgIFBERk9iamVjdFN0cmVhbS53aXRoQ29udGV4dEFuZE9iamVjdHMgPSBmdW5jdGlvbiAoY29udGV4dCwgb2JqZWN0cywgZW5jb2RlKSB7XG4gICAgICAgIGlmIChlbmNvZGUgPT09IHZvaWQgMCkgeyBlbmNvZGUgPSB0cnVlOyB9XG4gICAgICAgIHJldHVybiBuZXcgUERGT2JqZWN0U3RyZWFtKGNvbnRleHQsIG9iamVjdHMsIGVuY29kZSk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGT2JqZWN0U3RyZWFtO1xufShQREZGbGF0ZVN0cmVhbSkpO1xuZXhwb3J0IGRlZmF1bHQgUERGT2JqZWN0U3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT2JqZWN0U3RyZWFtLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlN0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJlYW1cIjtcbnZhciBQREZQYWdlTGVhZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGUGFnZUxlYWYsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUERGUGFnZUxlYWYobWFwLCBjb250ZXh0LCBhdXRvTm9ybWFsaXplQ1RNKSB7XG4gICAgICAgIGlmIChhdXRvTm9ybWFsaXplQ1RNID09PSB2b2lkIDApIHsgYXV0b05vcm1hbGl6ZUNUTSA9IHRydWU7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWFwLCBjb250ZXh0KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5ub3JtYWxpemVkID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmF1dG9Ob3JtYWxpemVDVE0gPSBhdXRvTm9ybWFsaXplQ1RNO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBjbG9uZSA9IFBERlBhZ2VMZWFmLmZyb21NYXBXaXRoQ29udGV4dChuZXcgTWFwKCksIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0LCB0aGlzLmF1dG9Ob3JtYWxpemVDVE0pO1xuICAgICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcygpO1xuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gZW50cmllc1tpZHhdLCBrZXkgPSBfYVswXSwgdmFsdWUgPSBfYVsxXTtcbiAgICAgICAgICAgIGNsb25lLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuUGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBNYXliZShQREZOYW1lLlBhcmVudCwgUERGRGljdCk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuQ29udGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cChQREZOYW1lLm9mKCdDb250ZW50cycpKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5Bbm5vdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE1heWJlKFBERk5hbWUuQW5ub3RzLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuQmxlZWRCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE1heWJlKFBERk5hbWUuQmxlZWRCb3gsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5UcmltQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXBNYXliZShQREZOYW1lLlRyaW1Cb3gsIFBERkFycmF5KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5BcnRCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cE1heWJlKFBERk5hbWUuQXJ0Qm94LCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuUmVzb3VyY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGljdE9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLlJlc291cmNlcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQubG9va3VwTWF5YmUoZGljdE9yUmVmLCBQREZEaWN0KTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5NZWRpYUJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5T3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUuTWVkaWFCb3gpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0Lmxvb2t1cChhcnJheU9yUmVmLCBQREZBcnJheSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuQ3JvcEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5T3JSZWYgPSB0aGlzLmdldEluaGVyaXRhYmxlQXR0cmlidXRlKFBERk5hbWUuQ3JvcEJveCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQubG9va3VwTWF5YmUoYXJyYXlPclJlZiwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLlJvdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG51bWJlck9yUmVmID0gdGhpcy5nZXRJbmhlcml0YWJsZUF0dHJpYnV0ZShQREZOYW1lLlJvdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQubG9va3VwTWF5YmUobnVtYmVyT3JSZWYsIFBERk51bWJlcik7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgYXR0cmlidXRlO1xuICAgICAgICB0aGlzLmFzY2VuZChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUpXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlID0gbm9kZS5nZXQobmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXR0cmlidXRlO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLnNldFBhcmVudCA9IGZ1bmN0aW9uIChwYXJlbnRSZWYpIHtcbiAgICAgICAgdGhpcy5zZXQoUERGTmFtZS5QYXJlbnQsIHBhcmVudFJlZik7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuYWRkQ29udGVudFN0cmVhbSA9IGZ1bmN0aW9uIChjb250ZW50U3RyZWFtUmVmKSB7XG4gICAgICAgIHZhciBDb250ZW50cyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5Db250ZW50cyB8fCB0aGlzLmNvbnRleHQub2JqKFtdKTtcbiAgICAgICAgdGhpcy5zZXQoUERGTmFtZS5Db250ZW50cywgQ29udGVudHMpO1xuICAgICAgICBDb250ZW50cy5wdXNoKGNvbnRlbnRTdHJlYW1SZWYpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLndyYXBDb250ZW50U3RyZWFtcyA9IGZ1bmN0aW9uIChzdGFydFN0cmVhbSwgZW5kU3RyZWFtKSB7XG4gICAgICAgIHZhciBDb250ZW50cyA9IHRoaXMuQ29udGVudHMoKTtcbiAgICAgICAgaWYgKENvbnRlbnRzIGluc3RhbmNlb2YgUERGQXJyYXkpIHtcbiAgICAgICAgICAgIENvbnRlbnRzLmluc2VydCgwLCBzdGFydFN0cmVhbSk7XG4gICAgICAgICAgICBDb250ZW50cy5wdXNoKGVuZFN0cmVhbSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUuYWRkQW5ub3QgPSBmdW5jdGlvbiAoYW5ub3RSZWYpIHtcbiAgICAgICAgdmFyIEFubm90cyA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5Bbm5vdHM7XG4gICAgICAgIEFubm90cy5wdXNoKGFubm90UmVmKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5yZW1vdmVBbm5vdCA9IGZ1bmN0aW9uIChhbm5vdFJlZikge1xuICAgICAgICB2YXIgQW5ub3RzID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkFubm90cztcbiAgICAgICAgdmFyIGluZGV4ID0gQW5ub3RzLmluZGV4T2YoYW5ub3RSZWYpO1xuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgQW5ub3RzLnJlbW92ZShpbmRleCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5zZXRGb250RGljdGlvbmFyeSA9IGZ1bmN0aW9uIChuYW1lLCBmb250RGljdFJlZikge1xuICAgICAgICB2YXIgRm9udCA9IHRoaXMubm9ybWFsaXplZEVudHJpZXMoKS5Gb250O1xuICAgICAgICBGb250LnNldChuYW1lLCBmb250RGljdFJlZik7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUubmV3Rm9udERpY3Rpb25hcnlLZXkgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHZhciBGb250ID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkZvbnQ7XG4gICAgICAgIHJldHVybiBGb250LnVuaXF1ZUtleSh0YWcpO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5ld0ZvbnREaWN0aW9uYXJ5ID0gZnVuY3Rpb24gKHRhZywgZm9udERpY3RSZWYpIHtcbiAgICAgICAgdmFyIGtleSA9IHRoaXMubmV3Rm9udERpY3Rpb25hcnlLZXkodGFnKTtcbiAgICAgICAgdGhpcy5zZXRGb250RGljdGlvbmFyeShrZXksIGZvbnREaWN0UmVmKTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5zZXRYT2JqZWN0ID0gZnVuY3Rpb24gKG5hbWUsIHhPYmplY3RSZWYpIHtcbiAgICAgICAgdmFyIFhPYmplY3QgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuWE9iamVjdDtcbiAgICAgICAgWE9iamVjdC5zZXQobmFtZSwgeE9iamVjdFJlZik7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUubmV3WE9iamVjdEtleSA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgdmFyIFhPYmplY3QgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuWE9iamVjdDtcbiAgICAgICAgcmV0dXJuIFhPYmplY3QudW5pcXVlS2V5KHRhZyk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUubmV3WE9iamVjdCA9IGZ1bmN0aW9uICh0YWcsIHhPYmplY3RSZWYpIHtcbiAgICAgICAgdmFyIGtleSA9IHRoaXMubmV3WE9iamVjdEtleSh0YWcpO1xuICAgICAgICB0aGlzLnNldFhPYmplY3Qoa2V5LCB4T2JqZWN0UmVmKTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5zZXRFeHRHU3RhdGUgPSBmdW5jdGlvbiAobmFtZSwgZXh0R1N0YXRlUmVmKSB7XG4gICAgICAgIHZhciBFeHRHU3RhdGUgPSB0aGlzLm5vcm1hbGl6ZWRFbnRyaWVzKCkuRXh0R1N0YXRlO1xuICAgICAgICBFeHRHU3RhdGUuc2V0KG5hbWUsIGV4dEdTdGF0ZVJlZik7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUubmV3RXh0R1N0YXRlS2V5ID0gZnVuY3Rpb24gKHRhZykge1xuICAgICAgICB2YXIgRXh0R1N0YXRlID0gdGhpcy5ub3JtYWxpemVkRW50cmllcygpLkV4dEdTdGF0ZTtcbiAgICAgICAgcmV0dXJuIEV4dEdTdGF0ZS51bmlxdWVLZXkodGFnKTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5uZXdFeHRHU3RhdGUgPSBmdW5jdGlvbiAodGFnLCBleHRHU3RhdGVSZWYpIHtcbiAgICAgICAgdmFyIGtleSA9IHRoaXMubmV3RXh0R1N0YXRlS2V5KHRhZyk7XG4gICAgICAgIHRoaXMuc2V0RXh0R1N0YXRlKGtleSwgZXh0R1N0YXRlUmVmKTtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9O1xuICAgIFBERlBhZ2VMZWFmLnByb3RvdHlwZS5hc2NlbmQgPSBmdW5jdGlvbiAodmlzaXRvcikge1xuICAgICAgICB2aXNpdG9yKHRoaXMpO1xuICAgICAgICB2YXIgUGFyZW50ID0gdGhpcy5QYXJlbnQoKTtcbiAgICAgICAgaWYgKFBhcmVudClcbiAgICAgICAgICAgIFBhcmVudC5hc2NlbmQodmlzaXRvcik7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5wcm90b3R5cGUubm9ybWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5ub3JtYWxpemVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgdmFyIGNvbnRlbnRzUmVmID0gdGhpcy5nZXQoUERGTmFtZS5Db250ZW50cyk7XG4gICAgICAgIHZhciBjb250ZW50cyA9IHRoaXMuY29udGV4dC5sb29rdXAoY29udGVudHNSZWYpO1xuICAgICAgICBpZiAoY29udGVudHMgaW5zdGFuY2VvZiBQREZTdHJlYW0pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KFBERk5hbWUuQ29udGVudHMsIGNvbnRleHQub2JqKFtjb250ZW50c1JlZl0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hdXRvTm9ybWFsaXplQ1RNKSB7XG4gICAgICAgICAgICB0aGlzLndyYXBDb250ZW50U3RyZWFtcyh0aGlzLmNvbnRleHQuZ2V0UHVzaEdyYXBoaWNzU3RhdGVDb250ZW50U3RyZWFtKCksIHRoaXMuY29udGV4dC5nZXRQb3BHcmFwaGljc1N0YXRlQ29udGVudFN0cmVhbSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBDbG9uZSBgUmVzb3VyY2VzYCBpZiBpdCBpcyBpbmhlcml0ZWRcbiAgICAgICAgdmFyIGRpY3RPclJlZiA9IHRoaXMuZ2V0SW5oZXJpdGFibGVBdHRyaWJ1dGUoUERGTmFtZS5SZXNvdXJjZXMpO1xuICAgICAgICB2YXIgUmVzb3VyY2VzID0gY29udGV4dC5sb29rdXBNYXliZShkaWN0T3JSZWYsIFBERkRpY3QpIHx8IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgdGhpcy5zZXQoUERGTmFtZS5SZXNvdXJjZXMsIFJlc291cmNlcyk7XG4gICAgICAgIC8vIFRPRE86IENsb25lIGBGb250YCBpZiBpdCBpcyBpbmhlcml0ZWRcbiAgICAgICAgdmFyIEZvbnQgPSBSZXNvdXJjZXMubG9va3VwTWF5YmUoUERGTmFtZS5Gb250LCBQREZEaWN0KSB8fCBjb250ZXh0Lm9iaih7fSk7XG4gICAgICAgIFJlc291cmNlcy5zZXQoUERGTmFtZS5Gb250LCBGb250KTtcbiAgICAgICAgLy8gVE9ETzogQ2xvbmUgYFhPYmplY3RgIGlmIGl0IGlzIGluaGVyaXRlZFxuICAgICAgICB2YXIgWE9iamVjdCA9IFJlc291cmNlcy5sb29rdXBNYXliZShQREZOYW1lLlhPYmplY3QsIFBERkRpY3QpIHx8IGNvbnRleHQub2JqKHt9KTtcbiAgICAgICAgUmVzb3VyY2VzLnNldChQREZOYW1lLlhPYmplY3QsIFhPYmplY3QpO1xuICAgICAgICAvLyBUT0RPOiBDbG9uZSBgRXh0R1N0YXRlYCBpZiBpdCBpcyBpbmhlcml0ZWRcbiAgICAgICAgdmFyIEV4dEdTdGF0ZSA9IFJlc291cmNlcy5sb29rdXBNYXliZShQREZOYW1lLkV4dEdTdGF0ZSwgUERGRGljdCkgfHwgY29udGV4dC5vYmooe30pO1xuICAgICAgICBSZXNvdXJjZXMuc2V0KFBERk5hbWUuRXh0R1N0YXRlLCBFeHRHU3RhdGUpO1xuICAgICAgICB2YXIgQW5ub3RzID0gdGhpcy5Bbm5vdHMoKSB8fCBjb250ZXh0Lm9iaihbXSk7XG4gICAgICAgIHRoaXMuc2V0KFBERk5hbWUuQW5ub3RzLCBBbm5vdHMpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZWQgPSB0cnVlO1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYucHJvdG90eXBlLm5vcm1hbGl6ZWRFbnRyaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZSgpO1xuICAgICAgICB2YXIgQW5ub3RzID0gdGhpcy5Bbm5vdHMoKTtcbiAgICAgICAgdmFyIFJlc291cmNlcyA9IHRoaXMuUmVzb3VyY2VzKCk7XG4gICAgICAgIHZhciBDb250ZW50cyA9IHRoaXMuQ29udGVudHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIEFubm90czogQW5ub3RzLFxuICAgICAgICAgICAgUmVzb3VyY2VzOiBSZXNvdXJjZXMsXG4gICAgICAgICAgICBDb250ZW50czogQ29udGVudHMsXG4gICAgICAgICAgICBGb250OiBSZXNvdXJjZXMubG9va3VwKFBERk5hbWUuRm9udCwgUERGRGljdCksXG4gICAgICAgICAgICBYT2JqZWN0OiBSZXNvdXJjZXMubG9va3VwKFBERk5hbWUuWE9iamVjdCwgUERGRGljdCksXG4gICAgICAgICAgICBFeHRHU3RhdGU6IFJlc291cmNlcy5sb29rdXAoUERGTmFtZS5FeHRHU3RhdGUsIFBERkRpY3QpLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgUERGUGFnZUxlYWYuSW5oZXJpdGFibGVFbnRyaWVzID0gW1xuICAgICAgICAnUmVzb3VyY2VzJyxcbiAgICAgICAgJ01lZGlhQm94JyxcbiAgICAgICAgJ0Nyb3BCb3gnLFxuICAgICAgICAnUm90YXRlJyxcbiAgICBdO1xuICAgIFBERlBhZ2VMZWFmLndpdGhDb250ZXh0QW5kUGFyZW50ID0gZnVuY3Rpb24gKGNvbnRleHQsIHBhcmVudCkge1xuICAgICAgICB2YXIgZGljdCA9IG5ldyBNYXAoKTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5UeXBlLCBQREZOYW1lLlBhZ2UpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLlBhcmVudCwgcGFyZW50KTtcbiAgICAgICAgZGljdC5zZXQoUERGTmFtZS5SZXNvdXJjZXMsIGNvbnRleHQub2JqKHt9KSk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUuTWVkaWFCb3gsIGNvbnRleHQub2JqKFswLCAwLCA2MTIsIDc5Ml0pKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQREZQYWdlTGVhZihkaWN0LCBjb250ZXh0LCBmYWxzZSk7XG4gICAgfTtcbiAgICBQREZQYWdlTGVhZi5mcm9tTWFwV2l0aENvbnRleHQgPSBmdW5jdGlvbiAobWFwLCBjb250ZXh0LCBhdXRvTm9ybWFsaXplQ1RNKSB7XG4gICAgICAgIGlmIChhdXRvTm9ybWFsaXplQ1RNID09PSB2b2lkIDApIHsgYXV0b05vcm1hbGl6ZUNUTSA9IHRydWU7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBQREZQYWdlTGVhZihtYXAsIGNvbnRleHQsIGF1dG9Ob3JtYWxpemVDVE0pO1xuICAgIH07XG4gICAgcmV0dXJuIFBERlBhZ2VMZWFmO1xufShQREZEaWN0KSk7XG5leHBvcnQgZGVmYXVsdCBQREZQYWdlTGVhZjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERlBhZ2VMZWFmLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFBERkFycmF5IGZyb20gXCIuLi9vYmplY3RzL1BERkFycmF5XCI7XG5pbXBvcnQgUERGRGljdCBmcm9tIFwiLi4vb2JqZWN0cy9QREZEaWN0XCI7XG5pbXBvcnQgUERGTmFtZSBmcm9tIFwiLi4vb2JqZWN0cy9QREZOYW1lXCI7XG5pbXBvcnQgUERGTnVtYmVyIGZyb20gXCIuLi9vYmplY3RzL1BERk51bWJlclwiO1xuaW1wb3J0IFBERlBhZ2VMZWFmIGZyb20gXCIuL1BERlBhZ2VMZWFmXCI7XG5pbXBvcnQgeyBJbnZhbGlkVGFyZ2V0SW5kZXhFcnJvciwgQ29ycnVwdFBhZ2VUcmVlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG52YXIgUERGUGFnZVRyZWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBERlBhZ2VUcmVlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlBhZ2VUcmVlKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5QYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cChQREZOYW1lLm9mKCdQYXJlbnQnKSk7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUuS2lkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9va3VwKFBERk5hbWUub2YoJ0tpZHMnKSwgUERGQXJyYXkpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLkNvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29rdXAoUERGTmFtZS5vZignQ291bnQnKSwgUERGTnVtYmVyKTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5wdXNoVHJlZU5vZGUgPSBmdW5jdGlvbiAodHJlZVJlZikge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICBLaWRzLnB1c2godHJlZVJlZik7XG4gICAgfTtcbiAgICBQREZQYWdlVHJlZS5wcm90b3R5cGUucHVzaExlYWZOb2RlID0gZnVuY3Rpb24gKGxlYWZSZWYpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgdGhpcy5pbnNlcnRMZWFmS2lkKEtpZHMuc2l6ZSgpLCBsZWFmUmVmKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgdGhlIGdpdmVuIHJlZiBhcyBhIGxlYWYgbm9kZSBvZiB0aGlzIHBhZ2UgdHJlZSBhdCB0aGUgc3BlY2lmaWVkXG4gICAgICogaW5kZXggKHplcm8tYmFzZWQpLiBBbHNvIGluY3JlbWVudHMgdGhlIGBDb3VudGAgb2YgZWFjaCBwYWdlIHRyZWUgaW4gdGhlXG4gICAgICogaGllcmFyY2h5IHRvIGFjY29tb2RhdGUgdGhlIG5ldyBwYWdlLlxuICAgICAqXG4gICAgICogUmV0dXJucyB0aGUgcmVmIG9mIHRoZSBQREZQYWdlVHJlZSBub2RlIGludG8gd2hpY2ggYGxlYWZSZWZgIHdhcyBpbnNlcnRlZCxcbiAgICAgKiBvciBgdW5kZWZpbmVkYCBpZiBpdCB3YXMgaW5zZXJ0ZWQgaW50byB0aGUgcm9vdCBub2RlICh0aGUgUERGUGFnZVRyZWUgdXBvblxuICAgICAqIHdoaWNoIHRoZSBtZXRob2Qgd2FzIGZpcnN0IGNhbGxlZCkuXG4gICAgICovXG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLmluc2VydExlYWZOb2RlID0gZnVuY3Rpb24gKGxlYWZSZWYsIHRhcmdldEluZGV4KSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIHZhciBDb3VudCA9IHRoaXMuQ291bnQoKS5hc051bWJlcigpO1xuICAgICAgICBpZiAodGFyZ2V0SW5kZXggPiBDb3VudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUYXJnZXRJbmRleEVycm9yKHRhcmdldEluZGV4LCBDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgPSB0YXJnZXRJbmRleDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gS2lkcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIGlmIChsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHBhZ2UgYW5kIHJldHVyblxuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGVhZktpZChpZHgsIGxlYWZSZWYpO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIga2lkUmVmID0gS2lkcy5nZXQoaWR4KTtcbiAgICAgICAgICAgIHZhciBraWQgPSB0aGlzLmNvbnRleHQubG9va3VwKGtpZFJlZik7XG4gICAgICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUERGUGFnZVRyZWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2lkLkNvdW50KCkuYXNOdW1iZXIoKSA+IGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlnIGluXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoa2lkLmluc2VydExlYWZOb2RlKGxlYWZSZWYsIGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQpIHx8IGtpZFJlZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uXG4gICAgICAgICAgICAgICAgICAgIGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgLT0ga2lkLkNvdW50KCkuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUERGUGFnZUxlYWYpIHtcbiAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uXG4gICAgICAgICAgICAgICAgbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCAtPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0ID09PSAwKSB7XG4gICAgICAgICAgICAvLyBJbnNlcnQgcGFnZSBhdCB0aGUgZW5kIGFuZCByZXR1cm5cbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGVhZktpZChLaWRzLnNpemUoKSwgbGVhZlJlZik7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNob3VsZCBuZXZlciBnZXQgaGVyZSBpZiBgdGFyZ2V0SW5kZXhgIGlzIHZhbGlkXG4gICAgICAgIHRocm93IG5ldyBDb3JydXB0UGFnZVRyZWVFcnJvcih0YXJnZXRJbmRleCwgJ2luc2VydExlYWZOb2RlJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBsZWFmIG5vZGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCAoemVyby1iYXNlZCkgZnJvbSB0aGlzIHBhZ2VcbiAgICAgKiB0cmVlLiBBbHNvIGRlY3JlbWVudHMgdGhlIGBDb3VudGAgb2YgZWFjaCBwYWdlIHRyZWUgaW4gdGhlIGhpZXJhcmNoeSB0b1xuICAgICAqIGFjY291bnQgZm9yIHRoZSByZW1vdmVkIHBhZ2UuXG4gICAgICpcbiAgICAgKiBJZiBgcHJ1bmVgIGlzIHRydWUsIHRoZW4gaW50ZXJtZWRpYXRlIHRyZWUgbm9kZXMgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlXG4gICAgICogdHJlZSBpZiB0aGV5IGNvbnRhaW4gMCBjaGlsZHJlbiBhZnRlciB0aGUgbGVhZiBub2RlIGlzIHJlbW92ZWQuXG4gICAgICovXG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLnJlbW92ZUxlYWZOb2RlID0gZnVuY3Rpb24gKHRhcmdldEluZGV4LCBwcnVuZSkge1xuICAgICAgICBpZiAocHJ1bmUgPT09IHZvaWQgMCkgeyBwcnVuZSA9IHRydWU7IH1cbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgdmFyIENvdW50ID0gdGhpcy5Db3VudCgpLmFzTnVtYmVyKCk7XG4gICAgICAgIGlmICh0YXJnZXRJbmRleCA+PSBDb3VudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUYXJnZXRJbmRleEVycm9yKHRhcmdldEluZGV4LCBDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgPSB0YXJnZXRJbmRleDtcbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gS2lkcy5zaXplKCk7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgICAgIHZhciBraWRSZWYgPSBLaWRzLmdldChpZHgpO1xuICAgICAgICAgICAgdmFyIGtpZCA9IHRoaXMuY29udGV4dC5sb29rdXAoa2lkUmVmKTtcbiAgICAgICAgICAgIGlmIChraWQgaW5zdGFuY2VvZiBQREZQYWdlVHJlZSkge1xuICAgICAgICAgICAgICAgIGlmIChraWQuQ291bnQoKS5hc051bWJlcigpID4gbGVhZnNSZW1haW5pbmdVbnRpbFRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaWcgaW5cbiAgICAgICAgICAgICAgICAgICAga2lkLnJlbW92ZUxlYWZOb2RlKGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQsIHBydW5lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBydW5lICYmIGtpZC5LaWRzKCkuc2l6ZSgpID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgS2lkcy5yZW1vdmUoaWR4KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvblxuICAgICAgICAgICAgICAgICAgICBsZWFmc1JlbWFpbmluZ1VudGlsVGFyZ2V0IC09IGtpZC5Db3VudCgpLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtpZCBpbnN0YW5jZW9mIFBERlBhZ2VMZWFmKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHBhZ2UgYW5kIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUtpZChpZHgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uXG4gICAgICAgICAgICAgICAgICAgIGxlYWZzUmVtYWluaW5nVW50aWxUYXJnZXQgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlIGlmIGB0YXJnZXRJbmRleGAgaXMgdmFsaWRcbiAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRQYWdlVHJlZUVycm9yKHRhcmdldEluZGV4LCAncmVtb3ZlTGVhZk5vZGUnKTtcbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5hc2NlbmQgPSBmdW5jdGlvbiAodmlzaXRvcikge1xuICAgICAgICB2aXNpdG9yKHRoaXMpO1xuICAgICAgICB2YXIgUGFyZW50ID0gdGhpcy5QYXJlbnQoKTtcbiAgICAgICAgaWYgKFBhcmVudClcbiAgICAgICAgICAgIFBhcmVudC5hc2NlbmQodmlzaXRvcik7XG4gICAgfTtcbiAgICAvKiogUGVyZm9ybXMgYSBQb3N0LU9yZGVyIHRyYXZlcnNhbCBvZiB0aGlzIHBhZ2UgdHJlZSAqL1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS50cmF2ZXJzZSA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7XG4gICAgICAgIHZhciBLaWRzID0gdGhpcy5LaWRzKCk7XG4gICAgICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IEtpZHMuc2l6ZSgpOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgICAgICB2YXIga2lkUmVmID0gS2lkcy5nZXQoaWR4KTtcbiAgICAgICAgICAgIHZhciBraWQgPSB0aGlzLmNvbnRleHQubG9va3VwKGtpZFJlZik7XG4gICAgICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUERGUGFnZVRyZWUpXG4gICAgICAgICAgICAgICAga2lkLnRyYXZlcnNlKHZpc2l0b3IpO1xuICAgICAgICAgICAgdmlzaXRvcihraWQsIGtpZFJlZik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBERlBhZ2VUcmVlLnByb3RvdHlwZS5pbnNlcnRMZWFmS2lkID0gZnVuY3Rpb24gKGtpZElkeCwgbGVhZlJlZikge1xuICAgICAgICB2YXIgS2lkcyA9IHRoaXMuS2lkcygpO1xuICAgICAgICB0aGlzLmFzY2VuZChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgdmFyIG5ld0NvdW50ID0gbm9kZS5Db3VudCgpLmFzTnVtYmVyKCkgKyAxO1xuICAgICAgICAgICAgbm9kZS5zZXQoUERGTmFtZS5vZignQ291bnQnKSwgUERGTnVtYmVyLm9mKG5ld0NvdW50KSk7XG4gICAgICAgIH0pO1xuICAgICAgICBLaWRzLmluc2VydChraWRJZHgsIGxlYWZSZWYpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUucHJvdG90eXBlLnJlbW92ZUtpZCA9IGZ1bmN0aW9uIChraWRJZHgpIHtcbiAgICAgICAgdmFyIEtpZHMgPSB0aGlzLktpZHMoKTtcbiAgICAgICAgdmFyIGtpZCA9IEtpZHMubG9va3VwKGtpZElkeCk7XG4gICAgICAgIGlmIChraWQgaW5zdGFuY2VvZiBQREZQYWdlTGVhZikge1xuICAgICAgICAgICAgdGhpcy5hc2NlbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3Q291bnQgPSBub2RlLkNvdW50KCkuYXNOdW1iZXIoKSAtIDE7XG4gICAgICAgICAgICAgICAgbm9kZS5zZXQoUERGTmFtZS5vZignQ291bnQnKSwgUERGTnVtYmVyLm9mKG5ld0NvdW50KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBLaWRzLnJlbW92ZShraWRJZHgpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUud2l0aENvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCwgcGFyZW50KSB7XG4gICAgICAgIHZhciBkaWN0ID0gbmV3IE1hcCgpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdUeXBlJyksIFBERk5hbWUub2YoJ1BhZ2VzJykpO1xuICAgICAgICBkaWN0LnNldChQREZOYW1lLm9mKCdLaWRzJyksIGNvbnRleHQub2JqKFtdKSk7XG4gICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ0NvdW50JyksIGNvbnRleHQub2JqKDApKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIGRpY3Quc2V0KFBERk5hbWUub2YoJ1BhcmVudCcpLCBwYXJlbnQpO1xuICAgICAgICByZXR1cm4gbmV3IFBERlBhZ2VUcmVlKGRpY3QsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUERGUGFnZVRyZWUuZnJvbU1hcFdpdGhDb250ZXh0ID0gZnVuY3Rpb24gKG1hcCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFBERlBhZ2VUcmVlKG1hcCwgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGUGFnZVRyZWU7XG59KFBERkRpY3QpKTtcbmV4cG9ydCBkZWZhdWx0IFBERlBhZ2VUcmVlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGUGFnZVRyZWUuanMubWFwIiwidmFyIENoYXJDb2RlcztcbihmdW5jdGlvbiAoQ2hhckNvZGVzKSB7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIk51bGxcIl0gPSAwXSA9IFwiTnVsbFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJCYWNrc3BhY2VcIl0gPSA4XSA9IFwiQmFja3NwYWNlXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlRhYlwiXSA9IDldID0gXCJUYWJcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTmV3bGluZVwiXSA9IDEwXSA9IFwiTmV3bGluZVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJGb3JtRmVlZFwiXSA9IDEyXSA9IFwiRm9ybUZlZWRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiQ2FycmlhZ2VSZXR1cm5cIl0gPSAxM10gPSBcIkNhcnJpYWdlUmV0dXJuXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlNwYWNlXCJdID0gMzJdID0gXCJTcGFjZVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJFeGNsYW1hdGlvblBvaW50XCJdID0gMzNdID0gXCJFeGNsYW1hdGlvblBvaW50XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkhhc2hcIl0gPSAzNV0gPSBcIkhhc2hcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUGVyY2VudFwiXSA9IDM3XSA9IFwiUGVyY2VudFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJMZWZ0UGFyZW5cIl0gPSA0MF0gPSBcIkxlZnRQYXJlblwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJSaWdodFBhcmVuXCJdID0gNDFdID0gXCJSaWdodFBhcmVuXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlBsdXNcIl0gPSA0M10gPSBcIlBsdXNcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTWludXNcIl0gPSA0NV0gPSBcIk1pbnVzXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkRhc2hcIl0gPSA0NV0gPSBcIkRhc2hcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUGVyaW9kXCJdID0gNDZdID0gXCJQZXJpb2RcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRm9yd2FyZFNsYXNoXCJdID0gNDddID0gXCJGb3J3YXJkU2xhc2hcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiWmVyb1wiXSA9IDQ4XSA9IFwiWmVyb1wiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJPbmVcIl0gPSA0OV0gPSBcIk9uZVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJUd29cIl0gPSA1MF0gPSBcIlR3b1wiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJUaHJlZVwiXSA9IDUxXSA9IFwiVGhyZWVcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRm91clwiXSA9IDUyXSA9IFwiRm91clwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJGaXZlXCJdID0gNTNdID0gXCJGaXZlXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlNpeFwiXSA9IDU0XSA9IFwiU2l4XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlNldmVuXCJdID0gNTVdID0gXCJTZXZlblwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJFaWdodFwiXSA9IDU2XSA9IFwiRWlnaHRcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTmluZVwiXSA9IDU3XSA9IFwiTmluZVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJMZXNzVGhhblwiXSA9IDYwXSA9IFwiTGVzc1RoYW5cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiR3JlYXRlclRoYW5cIl0gPSA2Ml0gPSBcIkdyZWF0ZXJUaGFuXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkFcIl0gPSA2NV0gPSBcIkFcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiRFwiXSA9IDY4XSA9IFwiRFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJFXCJdID0gNjldID0gXCJFXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkZcIl0gPSA3MF0gPSBcIkZcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiT1wiXSA9IDc5XSA9IFwiT1wiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJQXCJdID0gODBdID0gXCJQXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlJcIl0gPSA4Ml0gPSBcIlJcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTGVmdFNxdWFyZUJyYWNrZXRcIl0gPSA5MV0gPSBcIkxlZnRTcXVhcmVCcmFja2V0XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkJhY2tTbGFzaFwiXSA9IDkyXSA9IFwiQmFja1NsYXNoXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlJpZ2h0U3F1YXJlQnJhY2tldFwiXSA9IDkzXSA9IFwiUmlnaHRTcXVhcmVCcmFja2V0XCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcImFcIl0gPSA5N10gPSBcImFcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiYlwiXSA9IDk4XSA9IFwiYlwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJkXCJdID0gMTAwXSA9IFwiZFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJlXCJdID0gMTAxXSA9IFwiZVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJmXCJdID0gMTAyXSA9IFwiZlwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJpXCJdID0gMTA1XSA9IFwiaVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJqXCJdID0gMTA2XSA9IFwialwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJsXCJdID0gMTA4XSA9IFwibFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJtXCJdID0gMTA5XSA9IFwibVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJuXCJdID0gMTEwXSA9IFwiblwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJvXCJdID0gMTExXSA9IFwib1wiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJyXCJdID0gMTE0XSA9IFwiclwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJzXCJdID0gMTE1XSA9IFwic1wiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJ0XCJdID0gMTE2XSA9IFwidFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJ1XCJdID0gMTE3XSA9IFwidVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJ4XCJdID0gMTIwXSA9IFwieFwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJMZWZ0Q3VybHlcIl0gPSAxMjNdID0gXCJMZWZ0Q3VybHlcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiUmlnaHRDdXJseVwiXSA9IDEyNV0gPSBcIlJpZ2h0Q3VybHlcIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiVGlsZGVcIl0gPSAxMjZdID0gXCJUaWxkZVwiO1xufSkoQ2hhckNvZGVzIHx8IChDaGFyQ29kZXMgPSB7fSkpO1xuZXhwb3J0IGRlZmF1bHQgQ2hhckNvZGVzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2hhckNvZGVzLmpzLm1hcCIsImltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4vQ2hhckNvZGVzXCI7XG5leHBvcnQgdmFyIElzRGVsaW1pdGVyID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5MZWZ0UGFyZW5dID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5SaWdodFBhcmVuXSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuTGVzc1RoYW5dID0gMTtcbklzRGVsaW1pdGVyW0NoYXJDb2Rlcy5HcmVhdGVyVGhhbl0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLkxlZnRTcXVhcmVCcmFja2V0XSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuUmlnaHRTcXVhcmVCcmFja2V0XSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuTGVmdEN1cmx5XSA9IDE7XG5Jc0RlbGltaXRlcltDaGFyQ29kZXMuUmlnaHRDdXJseV0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLkZvcndhcmRTbGFzaF0gPSAxO1xuSXNEZWxpbWl0ZXJbQ2hhckNvZGVzLlBlcmNlbnRdID0gMTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlbGltaXRlcnMuanMubWFwIiwiaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IElzRGVsaW1pdGVyIH0gZnJvbSBcIi4vRGVsaW1pdGVyc1wiO1xuaW1wb3J0IHsgSXNXaGl0ZXNwYWNlIH0gZnJvbSBcIi4vV2hpdGVzcGFjZVwiO1xuZXhwb3J0IHZhciBJc0lycmVndWxhciA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5mb3IgKHZhciBpZHggPSAwLCBsZW4gPSAyNTY7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICBJc0lycmVndWxhcltpZHhdID0gSXNXaGl0ZXNwYWNlW2lkeF0gfHwgSXNEZWxpbWl0ZXJbaWR4XSA/IDEgOiAwO1xufVxuSXNJcnJlZ3VsYXJbQ2hhckNvZGVzLkhhc2hdID0gMTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlycmVndWxhci5qcy5tYXAiLCJpbXBvcnQgeyBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi9DaGFyQ29kZXNcIjtcbnZhciBTcGFjZSA9IENoYXJDb2Rlcy5TcGFjZSwgQ2FycmlhZ2VSZXR1cm4gPSBDaGFyQ29kZXMuQ2FycmlhZ2VSZXR1cm4sIE5ld2xpbmUgPSBDaGFyQ29kZXMuTmV3bGluZTtcbnZhciBzdHJlYW0gPSBbXG4gICAgQ2hhckNvZGVzLnMsXG4gICAgQ2hhckNvZGVzLnQsXG4gICAgQ2hhckNvZGVzLnIsXG4gICAgQ2hhckNvZGVzLmUsXG4gICAgQ2hhckNvZGVzLmEsXG4gICAgQ2hhckNvZGVzLm0sXG5dO1xudmFyIGVuZHN0cmVhbSA9IFtcbiAgICBDaGFyQ29kZXMuZSxcbiAgICBDaGFyQ29kZXMubixcbiAgICBDaGFyQ29kZXMuZCxcbiAgICBDaGFyQ29kZXMucyxcbiAgICBDaGFyQ29kZXMudCxcbiAgICBDaGFyQ29kZXMucixcbiAgICBDaGFyQ29kZXMuZSxcbiAgICBDaGFyQ29kZXMuYSxcbiAgICBDaGFyQ29kZXMubSxcbl07XG5leHBvcnQgdmFyIEtleXdvcmRzID0ge1xuICAgIGhlYWRlcjogW1xuICAgICAgICBDaGFyQ29kZXMuUGVyY2VudCxcbiAgICAgICAgQ2hhckNvZGVzLlAsXG4gICAgICAgIENoYXJDb2Rlcy5ELFxuICAgICAgICBDaGFyQ29kZXMuRixcbiAgICAgICAgQ2hhckNvZGVzLkRhc2gsXG4gICAgXSxcbiAgICBlb2Y6IFtcbiAgICAgICAgQ2hhckNvZGVzLlBlcmNlbnQsXG4gICAgICAgIENoYXJDb2Rlcy5QZXJjZW50LFxuICAgICAgICBDaGFyQ29kZXMuRSxcbiAgICAgICAgQ2hhckNvZGVzLk8sXG4gICAgICAgIENoYXJDb2Rlcy5GLFxuICAgIF0sXG4gICAgb2JqOiBbQ2hhckNvZGVzLm8sIENoYXJDb2Rlcy5iLCBDaGFyQ29kZXMual0sXG4gICAgZW5kb2JqOiBbXG4gICAgICAgIENoYXJDb2Rlcy5lLFxuICAgICAgICBDaGFyQ29kZXMubixcbiAgICAgICAgQ2hhckNvZGVzLmQsXG4gICAgICAgIENoYXJDb2Rlcy5vLFxuICAgICAgICBDaGFyQ29kZXMuYixcbiAgICAgICAgQ2hhckNvZGVzLmosXG4gICAgXSxcbiAgICB4cmVmOiBbQ2hhckNvZGVzLngsIENoYXJDb2Rlcy5yLCBDaGFyQ29kZXMuZSwgQ2hhckNvZGVzLmZdLFxuICAgIHRyYWlsZXI6IFtcbiAgICAgICAgQ2hhckNvZGVzLnQsXG4gICAgICAgIENoYXJDb2Rlcy5yLFxuICAgICAgICBDaGFyQ29kZXMuYSxcbiAgICAgICAgQ2hhckNvZGVzLmksXG4gICAgICAgIENoYXJDb2Rlcy5sLFxuICAgICAgICBDaGFyQ29kZXMuZSxcbiAgICAgICAgQ2hhckNvZGVzLnIsXG4gICAgXSxcbiAgICBzdGFydHhyZWY6IFtcbiAgICAgICAgQ2hhckNvZGVzLnMsXG4gICAgICAgIENoYXJDb2Rlcy50LFxuICAgICAgICBDaGFyQ29kZXMuYSxcbiAgICAgICAgQ2hhckNvZGVzLnIsXG4gICAgICAgIENoYXJDb2Rlcy50LFxuICAgICAgICBDaGFyQ29kZXMueCxcbiAgICAgICAgQ2hhckNvZGVzLnIsXG4gICAgICAgIENoYXJDb2Rlcy5lLFxuICAgICAgICBDaGFyQ29kZXMuZixcbiAgICBdLFxuICAgIHRydWU6IFtDaGFyQ29kZXMudCwgQ2hhckNvZGVzLnIsIENoYXJDb2Rlcy51LCBDaGFyQ29kZXMuZV0sXG4gICAgZmFsc2U6IFtDaGFyQ29kZXMuZiwgQ2hhckNvZGVzLmEsIENoYXJDb2Rlcy5sLCBDaGFyQ29kZXMucywgQ2hhckNvZGVzLmVdLFxuICAgIG51bGw6IFtDaGFyQ29kZXMubiwgQ2hhckNvZGVzLnUsIENoYXJDb2Rlcy5sLCBDaGFyQ29kZXMubF0sXG4gICAgc3RyZWFtOiBzdHJlYW0sXG4gICAgc3RyZWFtRU9GMTogX19zcHJlYWRBcnJheXMoc3RyZWFtLCBbU3BhY2UsIENhcnJpYWdlUmV0dXJuLCBOZXdsaW5lXSksXG4gICAgc3RyZWFtRU9GMjogX19zcHJlYWRBcnJheXMoc3RyZWFtLCBbQ2FycmlhZ2VSZXR1cm4sIE5ld2xpbmVdKSxcbiAgICBzdHJlYW1FT0YzOiBfX3NwcmVhZEFycmF5cyhzdHJlYW0sIFtDYXJyaWFnZVJldHVybl0pLFxuICAgIHN0cmVhbUVPRjQ6IF9fc3ByZWFkQXJyYXlzKHN0cmVhbSwgW05ld2xpbmVdKSxcbiAgICBlbmRzdHJlYW06IGVuZHN0cmVhbSxcbiAgICBFT0YxZW5kc3RyZWFtOiBfX3NwcmVhZEFycmF5cyhbQ2FycmlhZ2VSZXR1cm4sIE5ld2xpbmVdLCBlbmRzdHJlYW0pLFxuICAgIEVPRjJlbmRzdHJlYW06IF9fc3ByZWFkQXJyYXlzKFtDYXJyaWFnZVJldHVybl0sIGVuZHN0cmVhbSksXG4gICAgRU9GM2VuZHN0cmVhbTogX19zcHJlYWRBcnJheXMoW05ld2xpbmVdLCBlbmRzdHJlYW0pLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtleXdvcmRzLmpzLm1hcCIsImltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4vQ2hhckNvZGVzXCI7XG5leHBvcnQgdmFyIElzRGlnaXQgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuSXNEaWdpdFtDaGFyQ29kZXMuWmVyb10gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuT25lXSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5Ud29dID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLlRocmVlXSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5Gb3VyXSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5GaXZlXSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5TaXhdID0gMTtcbklzRGlnaXRbQ2hhckNvZGVzLlNldmVuXSA9IDE7XG5Jc0RpZ2l0W0NoYXJDb2Rlcy5FaWdodF0gPSAxO1xuSXNEaWdpdFtDaGFyQ29kZXMuTmluZV0gPSAxO1xuZXhwb3J0IHZhciBJc051bWVyaWNQcmVmaXggPSBuZXcgVWludDhBcnJheSgyNTYpO1xuSXNOdW1lcmljUHJlZml4W0NoYXJDb2Rlcy5QZXJpb2RdID0gMTtcbklzTnVtZXJpY1ByZWZpeFtDaGFyQ29kZXMuUGx1c10gPSAxO1xuSXNOdW1lcmljUHJlZml4W0NoYXJDb2Rlcy5NaW51c10gPSAxO1xuZXhwb3J0IHZhciBJc051bWVyaWMgPSBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gMjU2OyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgSXNOdW1lcmljW2lkeF0gPSBJc0RpZ2l0W2lkeF0gfHwgSXNOdW1lcmljUHJlZml4W2lkeF0gPyAxIDogMDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU51bWVyaWMuanMubWFwIiwiaW1wb3J0IENoYXJDb2RlcyBmcm9tIFwiLi9DaGFyQ29kZXNcIjtcbmV4cG9ydCB2YXIgSXNXaGl0ZXNwYWNlID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbklzV2hpdGVzcGFjZVtDaGFyQ29kZXMuTnVsbF0gPSAxO1xuSXNXaGl0ZXNwYWNlW0NoYXJDb2Rlcy5UYWJdID0gMTtcbklzV2hpdGVzcGFjZVtDaGFyQ29kZXMuTmV3bGluZV0gPSAxO1xuSXNXaGl0ZXNwYWNlW0NoYXJDb2Rlcy5Gb3JtRmVlZF0gPSAxO1xuSXNXaGl0ZXNwYWNlW0NoYXJDb2Rlcy5DYXJyaWFnZVJldHVybl0gPSAxO1xuSXNXaGl0ZXNwYWNlW0NoYXJDb2Rlcy5TcGFjZV0gPSAxO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2hpdGVzcGFjZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZXh0ZW5kcywgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZIZWFkZXIgZnJvbSBcIi4uL2RvY3VtZW50L1BERkhlYWRlclwiO1xuaW1wb3J0IFBERlRyYWlsZXIgZnJvbSBcIi4uL2RvY3VtZW50L1BERlRyYWlsZXJcIjtcbmltcG9ydCBQREZJbnZhbGlkT2JqZWN0IGZyb20gXCIuLi9vYmplY3RzL1BERkludmFsaWRPYmplY3RcIjtcbmltcG9ydCBQREZOYW1lIGZyb20gXCIuLi9vYmplY3RzL1BERk5hbWVcIjtcbmltcG9ydCBQREZOdW1iZXIgZnJvbSBcIi4uL29iamVjdHMvUERGTnVtYmVyXCI7XG5pbXBvcnQgUERGUmVmIGZyb20gXCIuLi9vYmplY3RzL1BERlJlZlwiO1xuaW1wb3J0IFBERlN0cmVhbSBmcm9tIFwiLi4vb2JqZWN0cy9QREZTdHJlYW1cIjtcbmltcG9ydCBQREZDcm9zc1JlZlN0cmVhbSBmcm9tIFwiLi4vc3RydWN0dXJlcy9QREZDcm9zc1JlZlN0cmVhbVwiO1xuaW1wb3J0IFBERk9iamVjdFN0cmVhbSBmcm9tIFwiLi4vc3RydWN0dXJlcy9QREZPYmplY3RTdHJlYW1cIjtcbmltcG9ydCBQREZXcml0ZXIgZnJvbSBcIi4vUERGV3JpdGVyXCI7XG5pbXBvcnQgeyBsYXN0LCB3YWl0Rm9yVGljayB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERlN0cmVhbVdyaXRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUERGU3RyZWFtV3JpdGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBERlN0cmVhbVdyaXRlcihjb250ZXh0LCBvYmplY3RzUGVyVGljaywgZW5jb2RlU3RyZWFtcywgb2JqZWN0c1BlclN0cmVhbSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjb250ZXh0LCBvYmplY3RzUGVyVGljaykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZW5jb2RlU3RyZWFtcyA9IGVuY29kZVN0cmVhbXM7XG4gICAgICAgIF90aGlzLm9iamVjdHNQZXJTdHJlYW0gPSBvYmplY3RzUGVyU3RyZWFtO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBERlN0cmVhbVdyaXRlci5wcm90b3R5cGUuY29tcHV0ZUJ1ZmZlclNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvYmplY3ROdW1iZXIsIGhlYWRlciwgc2l6ZSwgeHJlZlN0cmVhbSwgdW5jb21wcmVzc2VkT2JqZWN0cywgY29tcHJlc3NlZE9iamVjdHMsIG9iamVjdFN0cmVhbVJlZnMsIGluZGlyZWN0T2JqZWN0cywgaWR4LCBsZW4sIGluZGlyZWN0T2JqZWN0LCByZWYsIG9iamVjdCwgc2hvdWxkTm90Q29tcHJlc3MsIGNodW5rLCBvYmplY3RTdHJlYW1SZWYsIGlkeCwgbGVuLCBjaHVuaywgcmVmLCBvYmplY3RTdHJlYW0sIHhyZWZTdHJlYW1SZWYsIHhyZWZPZmZzZXQsIHRyYWlsZXI7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3ROdW1iZXIgPSB0aGlzLmNvbnRleHQubGFyZ2VzdE9iamVjdE51bWJlciArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBQREZIZWFkZXIuZm9yVmVyc2lvbigxLCA3KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBoZWFkZXIuc2l6ZUluQnl0ZXMoKSArIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmU3RyZWFtID0gUERGQ3Jvc3NSZWZTdHJlYW0uY3JlYXRlKHRoaXMuY3JlYXRlVHJhaWxlckRpY3QoKSwgdGhpcy5lbmNvZGVTdHJlYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZE9iamVjdHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRPYmplY3RzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RTdHJlYW1SZWZzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpcmVjdE9iamVjdHMgPSB0aGlzLmNvbnRleHQuZW51bWVyYXRlSW5kaXJlY3RPYmplY3RzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAwLCBsZW4gPSBpbmRpcmVjdE9iamVjdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpZHggPCBsZW4pKSByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0T2JqZWN0ID0gaW5kaXJlY3RPYmplY3RzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSBpbmRpcmVjdE9iamVjdFswXSwgb2JqZWN0ID0gaW5kaXJlY3RPYmplY3RbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGROb3RDb21wcmVzcyA9IHJlZiA9PT0gdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLkVuY3J5cHQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBQREZTdHJlYW0gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBQREZJbnZhbGlkT2JqZWN0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLmdlbmVyYXRpb25OdW1iZXIgIT09IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZE5vdENvbXByZXNzKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZE9iamVjdHMucHVzaChpbmRpcmVjdE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmU3RyZWFtLmFkZFVuY29tcHJlc3NlZEVudHJ5KHJlZiwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplICs9IHRoaXMuY29tcHV0ZUluZGlyZWN0T2JqZWN0U2l6ZShpbmRpcmVjdE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEZvclRpY2soMSkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgd2FpdEZvclRpY2soKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzMgLypicmVhayovLCA1XTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBsYXN0KGNvbXByZXNzZWRPYmplY3RzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFN0cmVhbVJlZiA9IGxhc3Qob2JqZWN0U3RyZWFtUmVmcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNodW5rIHx8IGNodW5rLmxlbmd0aCAlIHRoaXMub2JqZWN0c1BlclN0cmVhbSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZE9iamVjdHMucHVzaChjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0U3RyZWFtUmVmID0gUERGUmVmLm9mKG9iamVjdE51bWJlcisrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RTdHJlYW1SZWZzLnB1c2gob2JqZWN0U3RyZWFtUmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZTdHJlYW0uYWRkQ29tcHJlc3NlZEVudHJ5KHJlZiwgb2JqZWN0U3RyZWFtUmVmLCBjaHVuay5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsucHVzaChpbmRpcmVjdE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IDAsIGxlbiA9IGNvbXByZXNzZWRPYmplY3RzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMTBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBjb21wcmVzc2VkT2JqZWN0c1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gb2JqZWN0U3RyZWFtUmVmc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0U3RyZWFtID0gUERGT2JqZWN0U3RyZWFtLndpdGhDb250ZXh0QW5kT2JqZWN0cyh0aGlzLmNvbnRleHQsIGNodW5rLCB0aGlzLmVuY29kZVN0cmVhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZlN0cmVhbS5hZGRVbmNvbXByZXNzZWRFbnRyeShyZWYsIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0aGlzLmNvbXB1dGVJbmRpcmVjdE9iamVjdFNpemUoW3JlZiwgb2JqZWN0U3RyZWFtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRPYmplY3RzLnB1c2goW3JlZiwgb2JqZWN0U3RyZWFtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEZvclRpY2soY2h1bmsubGVuZ3RoKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgOV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB3YWl0Rm9yVGljaygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSA5O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDddO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZlN0cmVhbVJlZiA9IFBERlJlZi5vZihvYmplY3ROdW1iZXIrKyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmU3RyZWFtLmRpY3Quc2V0KFBERk5hbWUub2YoJ1NpemUnKSwgUERGTnVtYmVyLm9mKG9iamVjdE51bWJlcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeHJlZlN0cmVhbS5hZGRVbmNvbXByZXNzZWRFbnRyeSh4cmVmU3RyZWFtUmVmLCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWZPZmZzZXQgPSBzaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0aGlzLmNvbXB1dGVJbmRpcmVjdE9iamVjdFNpemUoW3hyZWZTdHJlYW1SZWYsIHhyZWZTdHJlYW1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZE9iamVjdHMucHVzaChbeHJlZlN0cmVhbVJlZiwgeHJlZlN0cmVhbV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxlciA9IFBERlRyYWlsZXIuZm9yTGFzdENyb3NzUmVmU2VjdGlvbk9mZnNldCh4cmVmT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdHJhaWxlci5zaXplSW5CeXRlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHsgc2l6ZTogc2l6ZSwgaGVhZGVyOiBoZWFkZXIsIGluZGlyZWN0T2JqZWN0czogdW5jb21wcmVzc2VkT2JqZWN0cywgdHJhaWxlcjogdHJhaWxlciB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZTdHJlYW1Xcml0ZXIuZm9yQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvYmplY3RzUGVyVGljaywgZW5jb2RlU3RyZWFtcywgb2JqZWN0c1BlclN0cmVhbSkge1xuICAgICAgICBpZiAoZW5jb2RlU3RyZWFtcyA9PT0gdm9pZCAwKSB7IGVuY29kZVN0cmVhbXMgPSB0cnVlOyB9XG4gICAgICAgIGlmIChvYmplY3RzUGVyU3RyZWFtID09PSB2b2lkIDApIHsgb2JqZWN0c1BlclN0cmVhbSA9IDUwOyB9XG4gICAgICAgIHJldHVybiBuZXcgUERGU3RyZWFtV3JpdGVyKGNvbnRleHQsIG9iamVjdHNQZXJUaWNrLCBlbmNvZGVTdHJlYW1zLCBvYmplY3RzUGVyU3RyZWFtKTtcbiAgICB9O1xuICAgIHJldHVybiBQREZTdHJlYW1Xcml0ZXI7XG59KFBERldyaXRlcikpO1xuZXhwb3J0IGRlZmF1bHQgUERGU3RyZWFtV3JpdGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGU3RyZWFtV3JpdGVyLmpzLm1hcCIsImltcG9ydCB7IF9fYXdhaXRlciwgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBQREZDcm9zc1JlZlNlY3Rpb24gZnJvbSBcIi4uL2RvY3VtZW50L1BERkNyb3NzUmVmU2VjdGlvblwiO1xuaW1wb3J0IFBERkhlYWRlciBmcm9tIFwiLi4vZG9jdW1lbnQvUERGSGVhZGVyXCI7XG5pbXBvcnQgUERGVHJhaWxlciBmcm9tIFwiLi4vZG9jdW1lbnQvUERGVHJhaWxlclwiO1xuaW1wb3J0IFBERlRyYWlsZXJEaWN0IGZyb20gXCIuLi9kb2N1bWVudC9QREZUcmFpbGVyRGljdFwiO1xuaW1wb3J0IFBERk9iamVjdFN0cmVhbSBmcm9tIFwiLi4vc3RydWN0dXJlcy9QREZPYmplY3RTdHJlYW1cIjtcbmltcG9ydCBDaGFyQ29kZXMgZnJvbSBcIi4uL3N5bnRheC9DaGFyQ29kZXNcIjtcbmltcG9ydCB7IGNvcHlTdHJpbmdJbnRvQnVmZmVyLCB3YWl0Rm9yVGljayB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xudmFyIFBERldyaXRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQREZXcml0ZXIoY29udGV4dCwgb2JqZWN0c1BlclRpY2spIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5wYXJzZWRPYmplY3RzID0gMDtcbiAgICAgICAgdGhpcy5zaG91bGRXYWl0Rm9yVGljayA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICBfdGhpcy5wYXJzZWRPYmplY3RzICs9IG47XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMucGFyc2VkT2JqZWN0cyAlIF90aGlzLm9iamVjdHNQZXJUaWNrID09PSAwO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLm9iamVjdHNQZXJUaWNrID0gb2JqZWN0c1BlclRpY2s7XG4gICAgfVxuICAgIFBERldyaXRlci5wcm90b3R5cGUuc2VyaWFsaXplVG9CdWZmZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgc2l6ZSwgaGVhZGVyLCBpbmRpcmVjdE9iamVjdHMsIHhyZWYsIHRyYWlsZXJEaWN0LCB0cmFpbGVyLCBvZmZzZXQsIGJ1ZmZlciwgaWR4LCBsZW4sIF9iLCByZWYsIG9iamVjdCwgb2JqZWN0TnVtYmVyLCBnZW5lcmF0aW9uTnVtYmVyLCBuO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCB0aGlzLmNvbXB1dGVCdWZmZXJTaXplKCldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9jLnNlbnQoKSwgc2l6ZSA9IF9hLnNpemUsIGhlYWRlciA9IF9hLmhlYWRlciwgaW5kaXJlY3RPYmplY3RzID0gX2EuaW5kaXJlY3RPYmplY3RzLCB4cmVmID0gX2EueHJlZiwgdHJhaWxlckRpY3QgPSBfYS50cmFpbGVyRGljdCwgdHJhaWxlciA9IF9hLnRyYWlsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gaGVhZGVyLmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gMCwgbGVuID0gaW5kaXJlY3RPYmplY3RzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9jLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWR4IDwgbGVuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfYiA9IGluZGlyZWN0T2JqZWN0c1tpZHhdLCByZWYgPSBfYlswXSwgb2JqZWN0ID0gX2JbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3ROdW1iZXIgPSBTdHJpbmcocmVmLm9iamVjdE51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIob2JqZWN0TnVtYmVyLCBidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLlNwYWNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbk51bWJlciA9IFN0cmluZyhyZWYuZ2VuZXJhdGlvbk51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gY29weVN0cmluZ0ludG9CdWZmZXIoZ2VuZXJhdGlvbk51bWJlciwgYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5TcGFjZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMubztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuYjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuajtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBvYmplY3QuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm47XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLm87XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmI7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLmo7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBuID0gb2JqZWN0IGluc3RhbmNlb2YgUERGT2JqZWN0U3RyZWFtID8gb2JqZWN0LmdldE9iamVjdHNDb3VudCgpIDogMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRXYWl0Rm9yVGljayhuKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB3YWl0Rm9yVGljaygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Muc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDJdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB4cmVmLmNvcHlCeXRlc0ludG8oYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBDaGFyQ29kZXMuTmV3bGluZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFpbGVyRGljdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB0cmFpbGVyRGljdC5jb3B5Qnl0ZXNJbnRvKGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gQ2hhckNvZGVzLk5ld2xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IENoYXJDb2Rlcy5OZXdsaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHRyYWlsZXIuY29weUJ5dGVzSW50byhidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgYnVmZmVyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZXcml0ZXIucHJvdG90eXBlLmNvbXB1dGVJbmRpcmVjdE9iamVjdFNpemUgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIHJlZiA9IF9hWzBdLCBvYmplY3QgPSBfYVsxXTtcbiAgICAgICAgdmFyIHJlZlNpemUgPSByZWYuc2l6ZUluQnl0ZXMoKSArIDM7IC8vICdSJyAtPiAnb2JqXFxuJ1xuICAgICAgICB2YXIgb2JqZWN0U2l6ZSA9IG9iamVjdC5zaXplSW5CeXRlcygpICsgOTsgLy8gJ1xcbmVuZG9ialxcblxcbidcbiAgICAgICAgcmV0dXJuIHJlZlNpemUgKyBvYmplY3RTaXplO1xuICAgIH07XG4gICAgUERGV3JpdGVyLnByb3RvdHlwZS5jcmVhdGVUcmFpbGVyRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5vYmooe1xuICAgICAgICAgICAgU2l6ZTogdGhpcy5jb250ZXh0Lmxhcmdlc3RPYmplY3ROdW1iZXIgKyAxLFxuICAgICAgICAgICAgUm9vdDogdGhpcy5jb250ZXh0LnRyYWlsZXJJbmZvLlJvb3QsXG4gICAgICAgICAgICBFbmNyeXB0OiB0aGlzLmNvbnRleHQudHJhaWxlckluZm8uRW5jcnlwdCxcbiAgICAgICAgICAgIEluZm86IHRoaXMuY29udGV4dC50cmFpbGVySW5mby5JbmZvLFxuICAgICAgICAgICAgSUQ6IHRoaXMuY29udGV4dC50cmFpbGVySW5mby5JRCxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZXcml0ZXIucHJvdG90eXBlLmNvbXB1dGVCdWZmZXJTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyLCBzaXplLCB4cmVmLCBpbmRpcmVjdE9iamVjdHMsIGlkeCwgbGVuLCBpbmRpcmVjdE9iamVjdCwgcmVmLCB4cmVmT2Zmc2V0LCB0cmFpbGVyRGljdCwgdHJhaWxlcjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFBERkhlYWRlci5mb3JWZXJzaW9uKDEsIDcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGhlYWRlci5zaXplSW5CeXRlcygpICsgMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWYgPSBQREZDcm9zc1JlZlNlY3Rpb24uY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRpcmVjdE9iamVjdHMgPSB0aGlzLmNvbnRleHQuZW51bWVyYXRlSW5kaXJlY3RPYmplY3RzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHggPSAwLCBsZW4gPSBpbmRpcmVjdE9iamVjdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpZHggPCBsZW4pKSByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0T2JqZWN0ID0gaW5kaXJlY3RPYmplY3RzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYgPSBpbmRpcmVjdE9iamVjdFswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhyZWYuYWRkRW50cnkocmVmLCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jb21wdXRlSW5kaXJlY3RPYmplY3RTaXplKGluZGlyZWN0T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRXYWl0Rm9yVGljaygxKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgM107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCB3YWl0Rm9yVGljaygpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZHgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB4cmVmT2Zmc2V0ID0gc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0geHJlZi5zaXplSW5CeXRlcygpICsgMTsgLy8gJ1xcbidcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsZXJEaWN0ID0gUERGVHJhaWxlckRpY3Qub2YodGhpcy5jcmVhdGVUcmFpbGVyRGljdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gdHJhaWxlckRpY3Quc2l6ZUluQnl0ZXMoKSArIDI7IC8vICdcXG5cXG4nXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGVyID0gUERGVHJhaWxlci5mb3JMYXN0Q3Jvc3NSZWZTZWN0aW9uT2Zmc2V0KHhyZWZPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0cmFpbGVyLnNpemVJbkJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgeyBzaXplOiBzaXplLCBoZWFkZXI6IGhlYWRlciwgaW5kaXJlY3RPYmplY3RzOiBpbmRpcmVjdE9iamVjdHMsIHhyZWY6IHhyZWYsIHRyYWlsZXJEaWN0OiB0cmFpbGVyRGljdCwgdHJhaWxlcjogdHJhaWxlciB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQREZXcml0ZXIuZm9yQ29udGV4dCA9IGZ1bmN0aW9uIChjb250ZXh0LCBvYmplY3RzUGVyVGljaykge1xuICAgICAgICByZXR1cm4gbmV3IFBERldyaXRlcihjb250ZXh0LCBvYmplY3RzUGVyVGljayk7XG4gICAgfTtcbiAgICByZXR1cm4gUERGV3JpdGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IFBERldyaXRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBERldyaXRlci5qcy5tYXAiLCJleHBvcnQgKiBmcm9tIFwiLi9hcGkvaW5kZXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUvaW5kZXhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzL2luZGV4XCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwidmFyIENhY2hlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENhY2hlKHBvcHVsYXRlKSB7XG4gICAgICAgIHRoaXMucG9wdWxhdGUgPSBwb3B1bGF0ZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgQ2FjaGUucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9O1xuICAgIENhY2hlLnByb3RvdHlwZS5hY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy52YWx1ZSlcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnBvcHVsYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgQ2FjaGUucHJvdG90eXBlLmludmFsaWRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBDYWNoZS5wb3B1bGF0ZWRCeSA9IGZ1bmN0aW9uIChwb3B1bGF0ZSkgeyByZXR1cm4gbmV3IENhY2hlKHBvcHVsYXRlKTsgfTtcbiAgICByZXR1cm4gQ2FjaGU7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQ2FjaGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWNoZS5qcy5tYXAiLCJpbXBvcnQgeyBkZWNvZGVGcm9tQmFzZTY0RGF0YVVyaSB9IGZyb20gXCIuL2Jhc2U2NFwiO1xuaW1wb3J0IHsgY2hhckZyb21Db2RlIH0gZnJvbSBcIi4vc3RyaW5nc1wiO1xuZXhwb3J0IHZhciBsYXN0ID0gZnVuY3Rpb24gKGFycmF5KSB7IHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTsgfTtcbi8vIGV4cG9ydCBjb25zdCBkcm9wTGFzdCA9IDxUPihhcnJheTogVFtdKTogVFtdID0+XG4vLyBhcnJheS5zbGljZSgwLCBhcnJheS5sZW5ndGggLSAxKTtcbmV4cG9ydCB2YXIgdHlwZWRBcnJheUZvciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgIHZhciB0eXBlZEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgIHR5cGVkQXJyYXlbaWR4XSA9IHZhbHVlLmNoYXJDb2RlQXQoaWR4KTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVkQXJyYXk7XG59O1xuZXhwb3J0IHZhciBtZXJnZUludG9UeXBlZEFycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcnJheXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIGFycmF5Q291bnQgPSBhcnJheXMubGVuZ3RoO1xuICAgIHZhciB0eXBlZEFycmF5cyA9IFtdO1xuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGFycmF5Q291bnQ7IGlkeCsrKSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gYXJyYXlzW2lkeF07XG4gICAgICAgIHR5cGVkQXJyYXlzW2lkeF0gPVxuICAgICAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBlbGVtZW50IDogdHlwZWRBcnJheUZvcihlbGVtZW50KTtcbiAgICB9XG4gICAgdmFyIHRvdGFsU2l6ZSA9IDA7XG4gICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgYXJyYXlDb3VudDsgaWR4KyspIHtcbiAgICAgICAgdG90YWxTaXplICs9IGFycmF5c1tpZHhdLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIG1lcmdlZCA9IG5ldyBVaW50OEFycmF5KHRvdGFsU2l6ZSk7XG4gICAgdmFyIG9mZnNldCA9IDA7XG4gICAgZm9yICh2YXIgYXJySWR4ID0gMDsgYXJySWR4IDwgYXJyYXlDb3VudDsgYXJySWR4KyspIHtcbiAgICAgICAgdmFyIGFyciA9IHR5cGVkQXJyYXlzW2FycklkeF07XG4gICAgICAgIGZvciAodmFyIGJ5dGVJZHggPSAwLCBhcnJMZW4gPSBhcnIubGVuZ3RoOyBieXRlSWR4IDwgYXJyTGVuOyBieXRlSWR4KyspIHtcbiAgICAgICAgICAgIG1lcmdlZFtvZmZzZXQrK10gPSBhcnJbYnl0ZUlkeF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbn07XG5leHBvcnQgdmFyIG1lcmdlVWludDhBcnJheXMgPSBmdW5jdGlvbiAoYXJyYXlzKSB7XG4gICAgdmFyIHRvdGFsU2l6ZSA9IDA7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyYXlzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB0b3RhbFNpemUgKz0gYXJyYXlzW2lkeF0ubGVuZ3RoO1xuICAgIH1cbiAgICB2YXIgbWVyZ2VkQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodG90YWxTaXplKTtcbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tpZHhdO1xuICAgICAgICBtZXJnZWRCdWZmZXIuc2V0KGFycmF5LCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gYXJyYXkubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkQnVmZmVyO1xufTtcbmV4cG9ydCB2YXIgYXJyYXlBc1N0cmluZyA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgc3RyICs9IGNoYXJGcm9tQ29kZShhcnJheVtpZHhdKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn07XG5leHBvcnQgdmFyIGJ5QXNjZW5kaW5nSWQgPSBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5pZCAtIGIuaWQ7IH07XG5leHBvcnQgdmFyIHNvcnRlZFVuaXEgPSBmdW5jdGlvbiAoYXJyYXksIGluZGV4ZXIpIHtcbiAgICB2YXIgdW5pcSA9IFtdO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgY3VyciA9IGFycmF5W2lkeF07XG4gICAgICAgIHZhciBwcmV2ID0gYXJyYXlbaWR4IC0gMV07XG4gICAgICAgIGlmIChpZHggPT09IDAgfHwgaW5kZXhlcihjdXJyKSAhPT0gaW5kZXhlcihwcmV2KSkge1xuICAgICAgICAgICAgdW5pcS5wdXNoKGN1cnIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmlxO1xufTtcbi8vIEFycmF5cyBhbmQgVHlwZWRBcnJheXMgaW4gSlMgYm90aCBoYXZlIC5yZXZlcnNlKCkgbWV0aG9kcywgd2hpY2ggd291bGQgc2VlbVxuLy8gdG8gbmVnYXRlIHRoZSBuZWVkIGZvciB0aGlzIGZ1bmN0aW9uLiBIb3dldmVyLCBub3QgYWxsIHJ1bnRpbWVzIHN1cHBvcnQgdGhpc1xuLy8gbWV0aG9kIChlLmcuIFJlYWN0IE5hdGl2ZSkuIFRoaXMgZnVuY3Rpb24gY29tcGVuc2F0ZXMgZm9yIHRoYXQgZmFjdC5cbmV4cG9ydCB2YXIgcmV2ZXJzZUFycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgdmFyIGFycmF5TGVuID0gYXJyYXkubGVuZ3RoO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IE1hdGguZmxvb3IoYXJyYXlMZW4gLyAyKTsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgbGVmdElkeCA9IGlkeDtcbiAgICAgICAgdmFyIHJpZ2h0SWR4ID0gYXJyYXlMZW4gLSBpZHggLSAxO1xuICAgICAgICB2YXIgdGVtcCA9IGFycmF5W2lkeF07XG4gICAgICAgIGFycmF5W2xlZnRJZHhdID0gYXJyYXlbcmlnaHRJZHhdO1xuICAgICAgICBhcnJheVtyaWdodElkeF0gPSB0ZW1wO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59O1xuZXhwb3J0IHZhciBzdW0gPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICB2YXIgdG90YWwgPSAwO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB0b3RhbCArPSBhcnJheVtpZHhdO1xuICAgIH1cbiAgICByZXR1cm4gdG90YWw7XG59O1xuZXhwb3J0IHZhciByYW5nZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgdmFyIGFyciA9IG5ldyBBcnJheShlbmQgLSBzdGFydCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBhcnJbaWR4XSA9IHN0YXJ0ICsgaWR4O1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xufTtcbmV4cG9ydCB2YXIgcGx1Y2tJbmRpY2VzID0gZnVuY3Rpb24gKGFyciwgaW5kaWNlcykge1xuICAgIHZhciBwbHVja2VkID0gbmV3IEFycmF5KGluZGljZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBpbmRpY2VzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBwbHVja2VkW2lkeF0gPSBhcnJbaW5kaWNlc1tpZHhdXTtcbiAgICB9XG4gICAgcmV0dXJuIHBsdWNrZWQ7XG59O1xuZXhwb3J0IHZhciBjYW5CZUNvbnZlcnRlZFRvVWludDhBcnJheSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnO1xufTtcbmV4cG9ydCB2YXIgdG9VaW50OEFycmF5ID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGRlY29kZUZyb21CYXNlNjREYXRhVXJpKGlucHV0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGlucHV0YCBtdXN0IGJlIG9uZSBvZiBgc3RyaW5nIHwgQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5YCcpO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnJheXMuanMubWFwIiwiLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGF0IGxlYXN0IG9uZSB0aWNrIG9mIHRoZVxuICogTWFjcm8gVGFzayBRdWV1ZSBvY2N1cnMuXG4gKi9cbmV4cG9ydCB2YXIgd2FpdEZvclRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZSgpOyB9LCAwKTtcbiAgICB9KTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hc3luYy5qcy5tYXAiLCIvKlxuICogVGhlIGBjaGFyc2AsIGBsb29rdXBgLCBgZW5jb2RlYCwgYW5kIGBkZWNvZGVgIG1lbWJlcnMgb2YgdGhpcyBmaWxlIGFyZVxuICogbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgICAgYmFzZTY0LWFycmF5YnVmZmVyXG4gKiAgICAgaHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlclxuICpcbiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTIgTmlrbGFzIHZvbiBIZXJ0emVuXG4gKiAgICAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqL1xudmFyIGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuLy8gVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxudmFyIGxvb2t1cCA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG5mb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgbG9va3VwW2NoYXJzLmNoYXJDb2RlQXQoaSldID0gaTtcbn1cbmV4cG9ydCB2YXIgZW5jb2RlVG9CYXNlNjQgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICB2YXIgYmFzZTY0ID0gJyc7XG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAzKSB7XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpXSA+PiAyXTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaV0gJiAzKSA8PCA0KSB8IChieXRlc1tpICsgMV0gPj4gNCldO1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbKChieXRlc1tpICsgMV0gJiAxNSkgPDwgMikgfCAoYnl0ZXNbaSArIDJdID4+IDYpXTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kgKyAyXSAmIDYzXTtcbiAgICB9XG4gICAgaWYgKGxlbiAlIDMgPT09IDIpIHtcbiAgICAgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cmluZygwLCBiYXNlNjQubGVuZ3RoIC0gMSkgKyAnPSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGxlbiAlIDMgPT09IDEpIHtcbiAgICAgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cmluZygwLCBiYXNlNjQubGVuZ3RoIC0gMikgKyAnPT0nO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTY0O1xufTtcbmV4cG9ydCB2YXIgZGVjb2RlRnJvbUJhc2U2NCA9IGZ1bmN0aW9uIChiYXNlNjQpIHtcbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gYmFzZTY0Lmxlbmd0aCAqIDAuNzU7XG4gICAgdmFyIGxlbiA9IGJhc2U2NC5sZW5ndGg7XG4gICAgdmFyIGk7XG4gICAgdmFyIHAgPSAwO1xuICAgIHZhciBlbmNvZGVkMTtcbiAgICB2YXIgZW5jb2RlZDI7XG4gICAgdmFyIGVuY29kZWQzO1xuICAgIHZhciBlbmNvZGVkNDtcbiAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAxXSA9PT0gJz0nKSB7XG4gICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICBpZiAoYmFzZTY0W2Jhc2U2NC5sZW5ndGggLSAyXSA9PT0gJz0nKSB7XG4gICAgICAgICAgICBidWZmZXJMZW5ndGgtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXJMZW5ndGgpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICBlbmNvZGVkMSA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGVuY29kZWQyID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAxKV07XG4gICAgICAgIGVuY29kZWQzID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAyKV07XG4gICAgICAgIGVuY29kZWQ0ID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAzKV07XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoZW5jb2RlZDEgPDwgMikgfCAoZW5jb2RlZDIgPj4gNCk7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQyICYgMTUpIDw8IDQpIHwgKGVuY29kZWQzID4+IDIpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMyAmIDMpIDw8IDYpIHwgKGVuY29kZWQ0ICYgNjMpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59O1xuLy8gVGhpcyByZWdleCBpcyBkZXNpZ25lZCB0byBiZSBhcyBmbGV4aWJsZSBhcyBwb3NzaWJsZS4gSXQgd2lsbCBwYXJzZSBjZXJ0YWluXG4vLyBpbnZhbGlkIGRhdGEgVVJJcy5cbnZhciBEQVRBX1VSSV9QUkVGSVhfUkVHRVggPSAvXihkYXRhKT86PyhbXFx3XFwvXFwrXSspPzs/KGNoYXJzZXQ9W1xcdy1dK3xiYXNlNjQpPy4qLC9pO1xuLyoqXG4gKiBJZiB0aGUgYGRhdGFVcmlgIGlucHV0IGlzIGEgZGF0YSBVUkksIHRoZW4gdGhlIGRhdGEgVVJJIHByZWZpeCBtdXN0IG5vdCBiZVxuICogbG9uZ2VyIHRoYW4gMTAwIGNoYXJhY3RlcnMsIG9yIHRoaXMgZnVuY3Rpb24gd2lsbCBmYWlsIHRvIGRlY29kZSBpdC5cbiAqXG4gKiBAcGFyYW0gZGF0YVVyaSBhIGJhc2U2NCBkYXRhIFVSSSBvciBwbGFpbiBiYXNlNjQgc3RyaW5nXG4gKiBAcmV0dXJucyBhIFVpbnQ4QXJyYXkgY29udGFpbmluZyB0aGUgZGVjb2RlZCBpbnB1dFxuICovXG5leHBvcnQgdmFyIGRlY29kZUZyb21CYXNlNjREYXRhVXJpID0gZnVuY3Rpb24gKGRhdGFVcmkpIHtcbiAgICB2YXIgdHJpbW1lZFVyaSA9IGRhdGFVcmkudHJpbSgpO1xuICAgIHZhciBwcmVmaXggPSB0cmltbWVkVXJpLnN1YnN0cmluZygwLCAxMDApO1xuICAgIHZhciByZXMgPSBwcmVmaXgubWF0Y2goREFUQV9VUklfUFJFRklYX1JFR0VYKTtcbiAgICAvLyBBc3N1bWUgaXQncyBub3QgYSBkYXRhIFVSSSAtIGp1c3QgYSBwbGFpbiBiYXNlNjQgc3RyaW5nXG4gICAgaWYgKCFyZXMpXG4gICAgICAgIHJldHVybiBkZWNvZGVGcm9tQmFzZTY0KHRyaW1tZWRVcmkpO1xuICAgIC8vIFJlbW92ZSB0aGUgZGF0YSBVUkkgcHJlZml4IGFuZCBwYXJzZSB0aGUgcmVtYWluZGVyIGFzIGEgYmFzZTY0IHN0cmluZ1xuICAgIHZhciBmdWxsTWF0Y2ggPSByZXNbMF07XG4gICAgdmFyIGRhdGEgPSB0cmltbWVkVXJpLnN1YnN0cmluZyhmdWxsTWF0Y2gubGVuZ3RoKTtcbiAgICByZXR1cm4gZGVjb2RlRnJvbUJhc2U2NChkYXRhKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlNjQuanMubWFwIiwiZXhwb3J0IHZhciBlcnJvciA9IGZ1bmN0aW9uIChtc2cpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIiwiZXhwb3J0ICogZnJvbSBcIi4vYXJyYXlzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hc3luY1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RyaW5nc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdW5pY29kZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbnVtYmVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9iYXNlNjRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29iamVjdHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZhbGlkYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BkZkRvY0VuY29kaW5nXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhY2hlIH0gZnJvbSBcIi4vQ2FjaGVcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIHRzbGludDpkaXNhYmxlIHJhZGl4XG4vKipcbiAqIENvbnZlcnRzIGEgbnVtYmVyIHRvIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gZGVjaW1hbC4gVGhpcyBmdW5jdGlvblxuICogZGlmZmVycyBmcm9tIHNpbXBseSBjb252ZXJ0aW5nIGEgbnVtYmVyIHRvIGEgc3RyaW5nIHdpdGggYC50b1N0cmluZygpYFxuICogYmVjYXVzZSB0aGlzIGZ1bmN0aW9uJ3Mgb3V0cHV0IHN0cmluZyB3aWxsICoqbm90KiogY29udGFpbiBleHBvbmVudGlhbFxuICogbm90YXRpb24uXG4gKlxuICogQ3JlZGl0OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDY1NDU1MTlcbiAqL1xuZXhwb3J0IHZhciBudW1iZXJUb1N0cmluZyA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICB2YXIgbnVtU3RyID0gU3RyaW5nKG51bSk7XG4gICAgaWYgKE1hdGguYWJzKG51bSkgPCAxLjApIHtcbiAgICAgICAgdmFyIGUgPSBwYXJzZUludChudW0udG9TdHJpbmcoKS5zcGxpdCgnZS0nKVsxXSk7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICB2YXIgbmVnYXRpdmUgPSBudW0gPCAwO1xuICAgICAgICAgICAgaWYgKG5lZ2F0aXZlKVxuICAgICAgICAgICAgICAgIG51bSAqPSAtMTtcbiAgICAgICAgICAgIG51bSAqPSBNYXRoLnBvdygxMCwgZSAtIDEpO1xuICAgICAgICAgICAgbnVtU3RyID0gJzAuJyArIG5ldyBBcnJheShlKS5qb2luKCcwJykgKyBudW0udG9TdHJpbmcoKS5zdWJzdHJpbmcoMik7XG4gICAgICAgICAgICBpZiAobmVnYXRpdmUpXG4gICAgICAgICAgICAgICAgbnVtU3RyID0gJy0nICsgbnVtU3RyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgZSA9IHBhcnNlSW50KG51bS50b1N0cmluZygpLnNwbGl0KCcrJylbMV0pO1xuICAgICAgICBpZiAoZSA+IDIwKSB7XG4gICAgICAgICAgICBlIC09IDIwO1xuICAgICAgICAgICAgbnVtIC89IE1hdGgucG93KDEwLCBlKTtcbiAgICAgICAgICAgIG51bVN0ciA9IG51bS50b1N0cmluZygpICsgbmV3IEFycmF5KGUgKyAxKS5qb2luKCcwJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bVN0cjtcbn07XG5leHBvcnQgdmFyIHNpemVJbkJ5dGVzID0gZnVuY3Rpb24gKG4pIHsgcmV0dXJuIE1hdGguY2VpbChuLnRvU3RyaW5nKDIpLmxlbmd0aCAvIDgpOyB9O1xuLyoqXG4gKiBDb252ZXJ0cyBhIG51bWJlciBpbnRvIGl0cyBjb25zdGl0dWVudCBieXRlcyBhbmQgcmV0dXJucyB0aGVtIGFzXG4gKiBhIG51bWJlcltdLlxuICpcbiAqIFJldHVybnMgbW9zdCBzaWduaWZpY2FudCBieXRlIGFzIGZpcnN0IGVsZW1lbnQgaW4gYXJyYXkuIEl0IG1heSBiZSBuZWNlc3NhcnlcbiAqIHRvIGNhbGwgLnJldmVyc2UoKSB0byBnZXQgdGhlIGJpdHMgaW4gdGhlIGRlc2lyZWQgb3JkZXIuXG4gKlxuICogRXhhbXBsZTpcbiAqICAgYnl0ZXNGb3IoMHgwMkE0MUUpID0+IFsgMGIxMCwgMGIxMDEwMDEwMCwgMGIxMTExMCBdXG4gKlxuICogQ3JlZGl0IGZvciBhbGdvcml0aG06IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xOTM2ODY1XG4gKi9cbmV4cG9ydCB2YXIgYnl0ZXNGb3IgPSBmdW5jdGlvbiAobikge1xuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KHNpemVJbkJ5dGVzKG4pKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBieXRlc1tpIC0gMV0gPSBuID4+ICgoYnl0ZXMubGVuZ3RoIC0gaSkgKiA4KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bWJlcnMuanMubWFwIiwiaW1wb3J0IHsgRm9udE5hbWVzIH0gZnJvbSAnQHBkZi1saWIvc3RhbmRhcmQtZm9udHMnO1xuZXhwb3J0IHZhciB2YWx1ZXMgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBPYmplY3Qua2V5cyhvYmopLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gb2JqW2tdOyB9KTsgfTtcbmV4cG9ydCB2YXIgU3RhbmRhcmRGb250VmFsdWVzID0gdmFsdWVzKEZvbnROYW1lcyk7XG5leHBvcnQgdmFyIGlzU3RhbmRhcmRGb250ID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgcmV0dXJuIFN0YW5kYXJkRm9udFZhbHVlcy5pbmNsdWRlcyhpbnB1dCk7XG59O1xuZXhwb3J0IHZhciByZWN0YW5nbGVzQXJlRXF1YWwgPSBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS54ID09PSBiLnggJiYgYS55ID09PSBiLnkgJiYgYS53aWR0aCA9PT0gYi53aWR0aCAmJiBhLmhlaWdodCA9PT0gYi5oZWlnaHQ7IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vYmplY3RzLmpzLm1hcCIsImltcG9ydCB7IHRvQ2hhckNvZGUgfSBmcm9tIFwiLi9zdHJpbmdzXCI7XG4vLyBNYXBwaW5nIGZyb20gUERGRG9jRW5jb2RpbmcgdG8gVW5pY29kZSBjb2RlIHBvaW50XG52YXIgcGRmRG9jRW5jb2RpbmdUb1VuaWNvZGUgPSBuZXcgVWludDE2QXJyYXkoMjU2KTtcbi8vIEluaXRpYWxpemUgdGhlIGNvZGUgcG9pbnRzIHdoaWNoIGFyZSB0aGUgc2FtZVxuZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgMjU2OyBpZHgrKykge1xuICAgIHBkZkRvY0VuY29kaW5nVG9Vbmljb2RlW2lkeF0gPSBpZHg7XG59XG4vLyBTZXQgZGlmZmVyZW5jZXMgKHNlZSBcIlRhYmxlIEQuMiDigJMgUERGRG9jRW5jb2RpbmcgQ2hhcmFjdGVyIFNldFwiIG9mIHRoZSBQREYgc3BlYylcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MTZdID0gdG9DaGFyQ29kZSgnXFx1MDAxNycpOyAvLyBTWU5DUk9OT1VTIElETEVcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MThdID0gdG9DaGFyQ29kZSgnXFx1MDJEOCcpOyAvLyBCUkVWRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxOV0gPSB0b0NoYXJDb2RlKCdcXHUwMkM3Jyk7IC8vIENBUk9OXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDFhXSA9IHRvQ2hhckNvZGUoJ1xcdTAyQzYnKTsgLy8gTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDFiXSA9IHRvQ2hhckNvZGUoJ1xcdTAyRDknKTsgLy8gRE9UIEFCT1ZFXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDFjXSA9IHRvQ2hhckNvZGUoJ1xcdTAyREQnKTsgLy8gRE9VQkxFIEFDVVRFIEFDQ0VOVFxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxZF0gPSB0b0NoYXJDb2RlKCdcXHUwMkRCJyk7IC8vIE9HT05FS1xucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHgxZV0gPSB0b0NoYXJDb2RlKCdcXHUwMkRBJyk7IC8vIFJJTkcgQUJPVkVcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4MWZdID0gdG9DaGFyQ29kZSgnXFx1MDJEQycpOyAvLyBTTUFMTCBUSUxERVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg3Zl0gPSB0b0NoYXJDb2RlKCdcXHVGRkZEJyk7IC8vIFJFUExBQ0VNRU5UIENIQVJBQ1RFUiAoYm94IHdpdGggcXVlc3Rpb25tYXJrKVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4MF0gPSB0b0NoYXJDb2RlKCdcXHUyMDIyJyk7IC8vIEJVTExFVFxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4MV0gPSB0b0NoYXJDb2RlKCdcXHUyMDIwJyk7IC8vIERBR0dFUlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4Ml0gPSB0b0NoYXJDb2RlKCdcXHUyMDIxJyk7IC8vIERPVUJMRSBEQUdHRVJcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODNdID0gdG9DaGFyQ29kZSgnXFx1MjAyNicpOyAvLyBIT1JJWk9OVEFMIEVMTElQU0lTXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDg0XSA9IHRvQ2hhckNvZGUoJ1xcdTIwMTQnKTsgLy8gRU0gREFTSFxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4NV0gPSB0b0NoYXJDb2RlKCdcXHUyMDEzJyk7IC8vIEVOIERBU0hcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODZdID0gdG9DaGFyQ29kZSgnXFx1MDE5MicpOyAvLyBMQVRJTiBTTUFMTCBMRVRURVIgU0NSSVBUIEZcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODddID0gdG9DaGFyQ29kZSgnXFx1MjA0NCcpOyAvLyBGUkFDVElPTiBTTEFTSCAoc29saWR1cylcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4ODhdID0gdG9DaGFyQ29kZSgnXFx1MjAzOScpOyAvLyBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSS1xucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4OV0gPSB0b0NoYXJDb2RlKCdcXHUyMDNBJyk7IC8vIFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSS1xucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4YV0gPSB0b0NoYXJDb2RlKCdcXHUyMjEyJyk7IC8vIE1JTlVTIFNJR05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OGJdID0gdG9DaGFyQ29kZSgnXFx1MjAzMCcpOyAvLyBQRVIgTUlMTEUgU0lHTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4Y10gPSB0b0NoYXJDb2RlKCdcXHUyMDFFJyk7IC8vIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAocXVvdGVkYmxiYXNlKVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4ZF0gPSB0b0NoYXJDb2RlKCdcXHUyMDFDJyk7IC8vIExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLIChxdW90ZWRibGxlZnQpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDhlXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMUQnKTsgLy8gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLIChxdW90ZWRibHJpZ2h0KVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg4Zl0gPSB0b0NoYXJDb2RlKCdcXHUyMDE4Jyk7IC8vIExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLIChxdW90ZWxlZnQpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDkwXSA9IHRvQ2hhckNvZGUoJ1xcdTIwMTknKTsgLy8gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLIChxdW90ZXJpZ2h0KVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5MV0gPSB0b0NoYXJDb2RlKCdcXHUyMDFBJyk7IC8vIFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSyAocXVvdGVzaW5nbGJhc2UpXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDkyXSA9IHRvQ2hhckNvZGUoJ1xcdTIxMjInKTsgLy8gVFJBREUgTUFSSyBTSUdOXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDkzXSA9IHRvQ2hhckNvZGUoJ1xcdUZCMDEnKTsgLy8gTEFUSU4gU01BTEwgTElHQVRVUkUgRklcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTRdID0gdG9DaGFyQ29kZSgnXFx1RkIwMicpOyAvLyBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGTFxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5NV0gPSB0b0NoYXJDb2RlKCdcXHUwMTQxJyk7IC8vIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBTVFJPS0VcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OTZdID0gdG9DaGFyQ29kZSgnXFx1MDE1MicpOyAvLyBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDk3XSA9IHRvQ2hhckNvZGUoJ1xcdTAxNjAnKTsgLy8gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDk4XSA9IHRvQ2hhckNvZGUoJ1xcdTAxNzgnKTsgLy8gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJU1xucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5OV0gPSB0b0NoYXJDb2RlKCdcXHUwMTdEJyk7IC8vIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5YV0gPSB0b0NoYXJDb2RlKCdcXHUwMTMxJyk7IC8vIExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIElcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OWJdID0gdG9DaGFyQ29kZSgnXFx1MDE0MicpOyAvLyBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRVxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5Y10gPSB0b0NoYXJDb2RlKCdcXHUwMTUzJyk7IC8vIExBVElOIFNNQUxMIExJR0FUVVJFIE9FXG5wZGZEb2NFbmNvZGluZ1RvVW5pY29kZVsweDlkXSA9IHRvQ2hhckNvZGUoJ1xcdTAxNjEnKTsgLy8gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTlxucGRmRG9jRW5jb2RpbmdUb1VuaWNvZGVbMHg5ZV0gPSB0b0NoYXJDb2RlKCdcXHUwMTdFJyk7IC8vIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4OWZdID0gdG9DaGFyQ29kZSgnXFx1RkZGRCcpOyAvLyBSRVBMQUNFTUVOVCBDSEFSQUNURVIgKGJveCB3aXRoIHF1ZXN0aW9ubWFyaylcbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4YTBdID0gdG9DaGFyQ29kZSgnXFx1MjBBQycpOyAvLyBFVVJPIFNJR05cbnBkZkRvY0VuY29kaW5nVG9Vbmljb2RlWzB4YWRdID0gdG9DaGFyQ29kZSgnXFx1RkZGRCcpOyAvLyBSRVBMQUNFTUVOVCBDSEFSQUNURVIgKGJveCB3aXRoIHF1ZXN0aW9ubWFyaylcbi8qKlxuICogRGVjb2RlIGEgYnl0ZSBhcnJheSBpbnRvIGEgc3RyaW5nIHVzaW5nIFBERkRvY0VuY29kaW5nLlxuICpcbiAqIEBwYXJhbSBieXRlcyBhIGJ5dGUgYXJyYXkgKGRlY2ltYWwgcmVwcmVzZW50YXRpb24pIGNvbnRhaW5pbmcgYSBzdHJpbmdcbiAqICAgICAgICAgICAgICBlbmNvZGVkIHdpdGggUERGRG9jRW5jb2RpbmcuXG4gKi9cbmV4cG9ydCB2YXIgcGRmRG9jRW5jb2RpbmdEZWNvZGUgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICB2YXIgY29kZVBvaW50cyA9IG5ldyBBcnJheShieXRlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IGJ5dGVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBjb2RlUG9pbnRzW2lkeF0gPSBwZGZEb2NFbmNvZGluZ1RvVW5pY29kZVtieXRlc1tpZHhdXTtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KFN0cmluZywgY29kZVBvaW50cyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGRmRG9jRW5jb2RpbmcuanMubWFwIiwiaW1wb3J0IFVQTkcgZnJvbSAnQHBkZi1saWIvdXBuZyc7XG52YXIgZ2V0SW1hZ2VUeXBlID0gZnVuY3Rpb24gKGN0eXBlKSB7XG4gICAgaWYgKGN0eXBlID09PSAwKVxuICAgICAgICByZXR1cm4gUG5nVHlwZS5HcmV5c2NhbGU7XG4gICAgaWYgKGN0eXBlID09PSAyKVxuICAgICAgICByZXR1cm4gUG5nVHlwZS5UcnVlY29sb3VyO1xuICAgIGlmIChjdHlwZSA9PT0gMylcbiAgICAgICAgcmV0dXJuIFBuZ1R5cGUuSW5kZXhlZENvbG91cjtcbiAgICBpZiAoY3R5cGUgPT09IDQpXG4gICAgICAgIHJldHVybiBQbmdUeXBlLkdyZXlzY2FsZVdpdGhBbHBoYTtcbiAgICBpZiAoY3R5cGUgPT09IDYpXG4gICAgICAgIHJldHVybiBQbmdUeXBlLlRydWVjb2xvdXJXaXRoQWxwaGE7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBjb2xvciB0eXBlOiBcIiArIGN0eXBlKTtcbn07XG52YXIgc3BsaXRBbHBoYUNoYW5uZWwgPSBmdW5jdGlvbiAocmdiYUNoYW5uZWwpIHtcbiAgICB2YXIgcGl4ZWxDb3VudCA9IE1hdGguZmxvb3IocmdiYUNoYW5uZWwubGVuZ3RoIC8gNCk7XG4gICAgdmFyIHJnYkNoYW5uZWwgPSBuZXcgVWludDhBcnJheShwaXhlbENvdW50ICogMyk7XG4gICAgdmFyIGFscGhhQ2hhbm5lbCA9IG5ldyBVaW50OEFycmF5KHBpeGVsQ291bnQgKiAxKTtcbiAgICB2YXIgcmdiYU9mZnNldCA9IDA7XG4gICAgdmFyIHJnYk9mZnNldCA9IDA7XG4gICAgdmFyIGFscGhhT2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAocmdiYU9mZnNldCA8IHJnYmFDaGFubmVsLmxlbmd0aCkge1xuICAgICAgICByZ2JDaGFubmVsW3JnYk9mZnNldCsrXSA9IHJnYmFDaGFubmVsW3JnYmFPZmZzZXQrK107XG4gICAgICAgIHJnYkNoYW5uZWxbcmdiT2Zmc2V0KytdID0gcmdiYUNoYW5uZWxbcmdiYU9mZnNldCsrXTtcbiAgICAgICAgcmdiQ2hhbm5lbFtyZ2JPZmZzZXQrK10gPSByZ2JhQ2hhbm5lbFtyZ2JhT2Zmc2V0KytdO1xuICAgICAgICBhbHBoYUNoYW5uZWxbYWxwaGFPZmZzZXQrK10gPSByZ2JhQ2hhbm5lbFtyZ2JhT2Zmc2V0KytdO1xuICAgIH1cbiAgICByZXR1cm4geyByZ2JDaGFubmVsOiByZ2JDaGFubmVsLCBhbHBoYUNoYW5uZWw6IGFscGhhQ2hhbm5lbCB9O1xufTtcbmV4cG9ydCB2YXIgUG5nVHlwZTtcbihmdW5jdGlvbiAoUG5nVHlwZSkge1xuICAgIFBuZ1R5cGVbXCJHcmV5c2NhbGVcIl0gPSBcIkdyZXlzY2FsZVwiO1xuICAgIFBuZ1R5cGVbXCJUcnVlY29sb3VyXCJdID0gXCJUcnVlY29sb3VyXCI7XG4gICAgUG5nVHlwZVtcIkluZGV4ZWRDb2xvdXJcIl0gPSBcIkluZGV4ZWRDb2xvdXJcIjtcbiAgICBQbmdUeXBlW1wiR3JleXNjYWxlV2l0aEFscGhhXCJdID0gXCJHcmV5c2NhbGVXaXRoQWxwaGFcIjtcbiAgICBQbmdUeXBlW1wiVHJ1ZWNvbG91cldpdGhBbHBoYVwiXSA9IFwiVHJ1ZWNvbG91cldpdGhBbHBoYVwiO1xufSkoUG5nVHlwZSB8fCAoUG5nVHlwZSA9IHt9KSk7XG52YXIgUE5HID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBORyhwbmdEYXRhKSB7XG4gICAgICAgIHZhciB1cG5nID0gVVBORy5kZWNvZGUocG5nRGF0YSk7XG4gICAgICAgIHZhciBmcmFtZXMgPSBVUE5HLnRvUkdCQTgodXBuZyk7XG4gICAgICAgIGlmIChmcmFtZXMubGVuZ3RoID4gMSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFuaW1hdGVkIFBOR3MgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIHZhciBmcmFtZSA9IG5ldyBVaW50OEFycmF5KGZyYW1lc1swXSk7XG4gICAgICAgIHZhciBfYSA9IHNwbGl0QWxwaGFDaGFubmVsKGZyYW1lKSwgcmdiQ2hhbm5lbCA9IF9hLnJnYkNoYW5uZWwsIGFscGhhQ2hhbm5lbCA9IF9hLmFscGhhQ2hhbm5lbDtcbiAgICAgICAgdGhpcy5yZ2JDaGFubmVsID0gcmdiQ2hhbm5lbDtcbiAgICAgICAgdmFyIGhhc0FscGhhVmFsdWVzID0gYWxwaGFDaGFubmVsLnNvbWUoZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGEgPCAyNTU7IH0pO1xuICAgICAgICBpZiAoaGFzQWxwaGFWYWx1ZXMpXG4gICAgICAgICAgICB0aGlzLmFscGhhQ2hhbm5lbCA9IGFscGhhQ2hhbm5lbDtcbiAgICAgICAgdGhpcy50eXBlID0gZ2V0SW1hZ2VUeXBlKHVwbmcuY3R5cGUpO1xuICAgICAgICB0aGlzLndpZHRoID0gdXBuZy53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB1cG5nLmhlaWdodDtcbiAgICAgICAgdGhpcy5iaXRzUGVyQ29tcG9uZW50ID0gODtcbiAgICB9XG4gICAgUE5HLmxvYWQgPSBmdW5jdGlvbiAocG5nRGF0YSkgeyByZXR1cm4gbmV3IFBORyhwbmdEYXRhKTsgfTtcbiAgICByZXR1cm4gUE5HO1xufSgpKTtcbmV4cG9ydCB7IFBORyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG5nLmpzLm1hcCIsIi8qKlxuICogR2VuZXJhdGVzIGEgcHNldWRvIHJhbmRvbSBudW1iZXIuIEFsdGhvdWdoIGl0IGlzIG5vdCBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmVcbiAqIGFuZCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQsIGl0IGlzIG5vdCBhIGNvbmNlcm4gZm9yIHRoZSBpbnRlbmRlZCB1c2UtY2FzZSxcbiAqIHdoaWNoIGlzIHRvIGdlbmVyYXRlIGRpc3RpbmN0IG51bWJlcnMuXG4gKlxuICogQ3JlZGl0OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTkzMDM3MjUvMTAyNTQwNDlcbiAqL1xudmFyIFNpbXBsZVJORyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaW1wbGVSTkcoc2VlZCkge1xuICAgICAgICB0aGlzLnNlZWQgPSBzZWVkO1xuICAgIH1cbiAgICBTaW1wbGVSTkcucHJvdG90eXBlLm5leHRJbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB4ID0gTWF0aC5zaW4odGhpcy5zZWVkKyspICogMTAwMDA7XG4gICAgICAgIHJldHVybiB4IC0gTWF0aC5mbG9vcih4KTtcbiAgICB9O1xuICAgIFNpbXBsZVJORy53aXRoU2VlZCA9IGZ1bmN0aW9uIChzZWVkKSB7IHJldHVybiBuZXcgU2ltcGxlUk5HKHNlZWQpOyB9O1xuICAgIHJldHVybiBTaW1wbGVSTkc7XG59KCkpO1xuZXhwb3J0IHsgU2ltcGxlUk5HIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ybmcuanMubWFwIiwiZXhwb3J0IHZhciB0b0NoYXJDb2RlID0gZnVuY3Rpb24gKGNoYXJhY3RlcikgeyByZXR1cm4gY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCk7IH07XG5leHBvcnQgdmFyIHRvQ29kZVBvaW50ID0gZnVuY3Rpb24gKGNoYXJhY3RlcikgeyByZXR1cm4gY2hhcmFjdGVyLmNvZGVQb2ludEF0KDApOyB9O1xuZXhwb3J0IHZhciB0b0hleFN0cmluZ09mTWluTGVuZ3RoID0gZnVuY3Rpb24gKG51bSwgbWluTGVuZ3RoKSB7XG4gICAgcmV0dXJuIHBhZFN0YXJ0KG51bS50b1N0cmluZygxNiksIG1pbkxlbmd0aCwgJzAnKS50b1VwcGVyQ2FzZSgpO1xufTtcbmV4cG9ydCB2YXIgdG9IZXhTdHJpbmcgPSBmdW5jdGlvbiAobnVtKSB7IHJldHVybiB0b0hleFN0cmluZ09mTWluTGVuZ3RoKG51bSwgMik7IH07XG5leHBvcnQgdmFyIGNoYXJGcm9tQ29kZSA9IGZ1bmN0aW9uIChjb2RlKSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpOyB9O1xuZXhwb3J0IHZhciBjaGFyRnJvbUhleENvZGUgPSBmdW5jdGlvbiAoaGV4KSB7IHJldHVybiBjaGFyRnJvbUNvZGUocGFyc2VJbnQoaGV4LCAxNikpOyB9O1xuZXhwb3J0IHZhciBwYWRTdGFydCA9IGZ1bmN0aW9uICh2YWx1ZSwgbGVuZ3RoLCBwYWRDaGFyKSB7XG4gICAgdmFyIHBhZGRpbmcgPSAnJztcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBsZW5ndGggLSB2YWx1ZS5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgcGFkZGluZyArPSBwYWRDaGFyO1xuICAgIH1cbiAgICByZXR1cm4gcGFkZGluZyArIHZhbHVlO1xufTtcbmV4cG9ydCB2YXIgY29weVN0cmluZ0ludG9CdWZmZXIgPSBmdW5jdGlvbiAoc3RyLCBidWZmZXIsIG9mZnNldCkge1xuICAgIHZhciBsZW5ndGggPSBzdHIubGVuZ3RoO1xuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IHN0ci5jaGFyQ29kZUF0KGlkeCk7XG4gICAgfVxuICAgIHJldHVybiBsZW5ndGg7XG59O1xuZXhwb3J0IHZhciBhZGRSYW5kb21TdWZmaXggPSBmdW5jdGlvbiAocHJlZml4LCBzdWZmaXhMZW5ndGgpIHtcbiAgICBpZiAoc3VmZml4TGVuZ3RoID09PSB2b2lkIDApIHsgc3VmZml4TGVuZ3RoID0gNDsgfVxuICAgIHJldHVybiBwcmVmaXggKyBcIi1cIiArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDEwLCBzdWZmaXhMZW5ndGgpKTtcbn07XG5leHBvcnQgdmFyIGVzY2FwZVJlZ0V4cCA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG59O1xuZXhwb3J0IHZhciBjbGVhblRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcdHxcXHUwMDg1fFxcdTIwMjh8XFx1MjAyOS9nLCAnICAgICcpLnJlcGxhY2UoL1tcXGJcXHZdL2csICcnKTtcbn07XG5leHBvcnQgdmFyIGVzY2FwZWROZXdsaW5lQ2hhcnMgPSBbJ1xcXFxuJywgJ1xcXFxmJywgJ1xcXFxyJywgJ1xcXFx1MDAwQiddO1xuZXhwb3J0IHZhciBuZXdsaW5lQ2hhcnMgPSBbJ1xcbicsICdcXGYnLCAnXFxyJywgJ1xcdTAwMEInXTtcbmV4cG9ydCB2YXIgaXNOZXdsaW5lQ2hhciA9IGZ1bmN0aW9uICh0ZXh0KSB7IHJldHVybiAvXltcXG5cXGZcXHJcXHUwMDBCXSQvLnRlc3QodGV4dCk7IH07XG5leHBvcnQgdmFyIGxpbmVTcGxpdCA9IGZ1bmN0aW9uICh0ZXh0KSB7IHJldHVybiB0ZXh0LnNwbGl0KC9bXFxuXFxmXFxyXFx1MDAwQl0vKTsgfTtcbmV4cG9ydCB2YXIgbWVyZ2VMaW5lcyA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgvW1xcblxcZlxcclxcdTAwMEJdL2csICcgJyk7XG59O1xuLy8gSmF2YVNjcmlwdCdzIFN0cmluZy5jaGFyQXQoKSBtZXRob2QgZG9lc24gd29yayBvbiBzdHJpbmdzIGNvbnRhaW5pbmcgVVRGLTE2XG4vLyBjaGFyYWN0ZXJzICh3aXRoIGhpZ2ggYW5kIGxvdyBzdXJyb2dhdGUgcGFpcnMpLCBzdWNoIGFzIPCfkqkgKHBvbyBlbW9qaSkuIFRoaXNcbi8vIGBjaGFyQXRJbmRleCgpYCBmdW5jdGlvbiBkb2VzLlxuLy9cbi8vIENyZWRpdDogaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvU3RyaW5nLnByb3RvdHlwZS5hdC9ibG9iL21hc3Rlci9hdC5qcyNMMTQtTDQ4XG5leHBvcnQgdmFyIGNoYXJBdEluZGV4ID0gZnVuY3Rpb24gKHRleHQsIGluZGV4KSB7XG4gICAgLy8gR2V0IHRoZSBmaXJzdCBjb2RlIHVuaXQgYW5kIGNvZGUgdW5pdCB2YWx1ZVxuICAgIHZhciBjdUZpcnN0ID0gdGV4dC5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICB2YXIgY3VTZWNvbmQ7XG4gICAgdmFyIG5leHRJbmRleCA9IGluZGV4ICsgMTtcbiAgICB2YXIgbGVuZ3RoID0gMTtcbiAgICBpZiAoXG4gICAgLy8gQ2hlY2sgaWYgaXQncyB0aGUgc3RhcnQgb2YgYSBzdXJyb2dhdGUgcGFpci5cbiAgICBjdUZpcnN0ID49IDB4ZDgwMCAmJlxuICAgICAgICBjdUZpcnN0IDw9IDB4ZGJmZiAmJiAvLyBoaWdoIHN1cnJvZ2F0ZVxuICAgICAgICB0ZXh0Lmxlbmd0aCA+IG5leHRJbmRleCAvLyB0aGVyZSBpcyBhIG5leHQgY29kZSB1bml0XG4gICAgKSB7XG4gICAgICAgIGN1U2Vjb25kID0gdGV4dC5jaGFyQ29kZUF0KG5leHRJbmRleCk7XG4gICAgICAgIGlmIChjdVNlY29uZCA+PSAweGRjMDAgJiYgY3VTZWNvbmQgPD0gMHhkZmZmKVxuICAgICAgICAgICAgbGVuZ3RoID0gMjsgLy8gbG93IHN1cnJvZ2F0ZVxuICAgIH1cbiAgICByZXR1cm4gW3RleHQuc2xpY2UoaW5kZXgsIGluZGV4ICsgbGVuZ3RoKSwgbGVuZ3RoXTtcbn07XG5leHBvcnQgdmFyIGNoYXJTcGxpdCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgdmFyIGNoYXJzID0gW107XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdGV4dC5sZW5ndGg7IGlkeCA8IGxlbjspIHtcbiAgICAgICAgdmFyIF9hID0gY2hhckF0SW5kZXgodGV4dCwgaWR4KSwgYyA9IF9hWzBdLCBjTGVuID0gX2FbMV07XG4gICAgICAgIGNoYXJzLnB1c2goYyk7XG4gICAgICAgIGlkeCArPSBjTGVuO1xuICAgIH1cbiAgICByZXR1cm4gY2hhcnM7XG59O1xudmFyIGJ1aWxkV29yZEJyZWFrUmVnZXggPSBmdW5jdGlvbiAod29yZEJyZWFrcykge1xuICAgIHZhciBuZXdsaW5lQ2hhclVuaW9uID0gZXNjYXBlZE5ld2xpbmVDaGFycy5qb2luKCd8Jyk7XG4gICAgdmFyIGVzY2FwZWRSdWxlcyA9IFsnJCddO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdvcmRCcmVha3MubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciB3b3JkQnJlYWsgPSB3b3JkQnJlYWtzW2lkeF07XG4gICAgICAgIGlmIChpc05ld2xpbmVDaGFyKHdvcmRCcmVhaykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJgd29yZEJyZWFrYCBtdXN0IG5vdCBpbmNsdWRlIFwiICsgbmV3bGluZUNoYXJVbmlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZXNjYXBlZFJ1bGVzLnB1c2god29yZEJyZWFrID09PSAnJyA/ICcuJyA6IGVzY2FwZVJlZ0V4cCh3b3JkQnJlYWspKTtcbiAgICB9XG4gICAgdmFyIGJyZWFrUnVsZXMgPSBlc2NhcGVkUnVsZXMuam9pbignfCcpO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFwiKFwiICsgbmV3bGluZUNoYXJVbmlvbiArIFwiKXwoKC4qPykoXCIgKyBicmVha1J1bGVzICsgXCIpKVwiLCAnZ20nKTtcbn07XG5leHBvcnQgdmFyIGJyZWFrVGV4dEludG9MaW5lcyA9IGZ1bmN0aW9uICh0ZXh0LCB3b3JkQnJlYWtzLCBtYXhXaWR0aCwgY29tcHV0ZVdpZHRoT2ZUZXh0KSB7XG4gICAgdmFyIHJlZ2V4ID0gYnVpbGRXb3JkQnJlYWtSZWdleCh3b3JkQnJlYWtzKTtcbiAgICB2YXIgd29yZHMgPSBjbGVhblRleHQodGV4dCkubWF0Y2gocmVnZXgpO1xuICAgIHZhciBjdXJyTGluZSA9ICcnO1xuICAgIHZhciBjdXJyV2lkdGggPSAwO1xuICAgIHZhciBsaW5lcyA9IFtdO1xuICAgIHZhciBwdXNoQ3VyckxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjdXJyTGluZSAhPT0gJycpXG4gICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJMaW5lKTtcbiAgICAgICAgY3VyckxpbmUgPSAnJztcbiAgICAgICAgY3VycldpZHRoID0gMDtcbiAgICB9O1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHdvcmRzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICB2YXIgd29yZCA9IHdvcmRzW2lkeF07XG4gICAgICAgIGlmIChpc05ld2xpbmVDaGFyKHdvcmQpKSB7XG4gICAgICAgICAgICBwdXNoQ3VyckxpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IGNvbXB1dGVXaWR0aE9mVGV4dCh3b3JkKTtcbiAgICAgICAgICAgIGlmIChjdXJyV2lkdGggKyB3aWR0aCA+IG1heFdpZHRoKVxuICAgICAgICAgICAgICAgIHB1c2hDdXJyTGluZSgpO1xuICAgICAgICAgICAgY3VyckxpbmUgKz0gd29yZDtcbiAgICAgICAgICAgIGN1cnJXaWR0aCArPSB3aWR0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdXNoQ3VyckxpbmUoKTtcbiAgICByZXR1cm4gbGluZXM7XG59O1xuLy8gU2VlIHNlY3Rpb24gXCI3LjkuNCBEYXRlc1wiIG9mIHRoZSBQREYgc3BlY2lmaWNhdGlvblxudmFyIGRhdGVSZWdleCA9IC9eRDooXFxkXFxkXFxkXFxkKShcXGRcXGQpPyhcXGRcXGQpPyhcXGRcXGQpPyhcXGRcXGQpPyhcXGRcXGQpPyhbK1xcLVpdKT8oXFxkXFxkKT8nPyhcXGRcXGQpPyc/JC87XG5leHBvcnQgdmFyIHBhcnNlRGF0ZSA9IGZ1bmN0aW9uIChkYXRlU3RyKSB7XG4gICAgdmFyIG1hdGNoID0gZGF0ZVN0ci5tYXRjaChkYXRlUmVnZXgpO1xuICAgIGlmICghbWF0Y2gpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdmFyIHllYXIgPSBtYXRjaFsxXSwgX2EgPSBtYXRjaFsyXSwgbW9udGggPSBfYSA9PT0gdm9pZCAwID8gJzAxJyA6IF9hLCBfYiA9IG1hdGNoWzNdLCBkYXkgPSBfYiA9PT0gdm9pZCAwID8gJzAxJyA6IF9iLCBfYyA9IG1hdGNoWzRdLCBob3VycyA9IF9jID09PSB2b2lkIDAgPyAnMDAnIDogX2MsIF9kID0gbWF0Y2hbNV0sIG1pbnMgPSBfZCA9PT0gdm9pZCAwID8gJzAwJyA6IF9kLCBfZSA9IG1hdGNoWzZdLCBzZWNzID0gX2UgPT09IHZvaWQgMCA/ICcwMCcgOiBfZSwgX2YgPSBtYXRjaFs3XSwgb2Zmc2V0U2lnbiA9IF9mID09PSB2b2lkIDAgPyAnWicgOiBfZiwgX2cgPSBtYXRjaFs4XSwgb2Zmc2V0SG91cnMgPSBfZyA9PT0gdm9pZCAwID8gJzAwJyA6IF9nLCBfaCA9IG1hdGNoWzldLCBvZmZzZXRNaW5zID0gX2ggPT09IHZvaWQgMCA/ICcwMCcgOiBfaDtcbiAgICAvLyBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuOS4xLjE1XG4gICAgdmFyIHR6T2Zmc2V0ID0gb2Zmc2V0U2lnbiA9PT0gJ1onID8gJ1onIDogXCJcIiArIG9mZnNldFNpZ24gKyBvZmZzZXRIb3VycyArIFwiOlwiICsgb2Zmc2V0TWlucztcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHllYXIgKyBcIi1cIiArIG1vbnRoICsgXCItXCIgKyBkYXkgKyBcIlRcIiArIGhvdXJzICsgXCI6XCIgKyBtaW5zICsgXCI6XCIgKyBzZWNzICsgdHpPZmZzZXQpO1xuICAgIHJldHVybiBkYXRlO1xufTtcbmV4cG9ydCB2YXIgZmluZExhc3RNYXRjaCA9IGZ1bmN0aW9uICh2YWx1ZSwgcmVnZXgpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIHBvc2l0aW9uID0gMDtcbiAgICB2YXIgbGFzdE1hdGNoO1xuICAgIHdoaWxlIChwb3NpdGlvbiA8IHZhbHVlLmxlbmd0aCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB2YWx1ZS5zdWJzdHJpbmcocG9zaXRpb24pLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgaWYgKCFtYXRjaClcbiAgICAgICAgICAgIHJldHVybiB7IG1hdGNoOiBsYXN0TWF0Y2gsIHBvczogcG9zaXRpb24gfTtcbiAgICAgICAgbGFzdE1hdGNoID0gbWF0Y2g7XG4gICAgICAgIHBvc2l0aW9uICs9ICgoX2EgPSBtYXRjaC5pbmRleCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCkgKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB7IG1hdGNoOiBsYXN0TWF0Y2gsIHBvczogcG9zaXRpb24gfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmdzLmpzLm1hcCIsImltcG9ydCB7IHRvSGV4U3RyaW5nIH0gZnJvbSBcIi4vc3RyaW5nc1wiO1xuLyoqXG4gKiBFbmNvZGVzIGEgc3RyaW5nIHRvIFVURi04LlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyaW5nIHRvIGJlIGVuY29kZWQuXG4gKiBAcGFyYW0gYnl0ZU9yZGVyTWFyayBXaGV0aGVyIG9yIG5vdCBhIGJ5dGUgb3JkZXIgbWFya2VyIChCT00pIHNob3VsZCBiZSBhZGRlZFxuICogICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBlbmNvZGluZy4gKGRlZmF1bHQgYHRydWVgKVxuICogQHJldHVybnMgQSBVaW50OEFycmF5IGNvbnRhaW5pbmcgdGhlIFVURi04IGVuY29kaW5nIG9mIHRoZSBpbnB1dCBzdHJpbmcuXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBKYXZhU2NyaXB0IHN0cmluZ3MgYXJlIGNvbXBvc2VkIG9mIFVuaWNvZGUgY29kZSBwb2ludHMuIENvZGUgcG9pbnRzIGFyZVxuICogaW50ZWdlcnMgaW4gdGhlIHJhbmdlIDAgdG8gMSwxMTQsMTExICgweDEwRkZGRikuIFdoZW4gc2VyaWFsaXppbmcgYSBzdHJpbmcsXG4gKiBpdCBtdXN0IGJlIGVuY29kZWQgYXMgYSBzZXF1ZW5jZSBvZiB3b3Jkcy4gQSB3b3JkIGlzIHR5cGljYWxseSA4LCAxNiwgb3IgMzJcbiAqIGJ5dGVzIGluIHNpemUuIEFzIHN1Y2gsIFVuaWNvZGUgZGVmaW5lcyB0aHJlZSBlbmNvZGluZyBmb3JtczogVVRGLTgsIFVURi0xNixcbiAqIGFuZCBVVEYtMzIuIFRoZXNlIGVuY29kaW5nIGZvcm1zIGFyZSBkZXNjcmliZWQgaW4gdGhlIFVuaWNvZGUgc3RhbmRhcmQgWzFdLlxuICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBVVEYtOCBlbmNvZGluZyBmb3JtLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSW4gVVRGLTgsIGVhY2ggY29kZSBwb2ludCBpcyBtYXBwZWQgdG8gYSBzZXF1ZW5jZSBvZiAxLCAyLCAzLCBvciA0IGJ5dGVzLlxuICogTm90ZSB0aGF0IHRoZSBsb2dpYyB3aGljaCBkZWZpbmVzIHRoaXMgbWFwcGluZyBpcyBzbGlnaHRseSBjb252b2x1dGVkLCBhbmRcbiAqIG5vdCBhcyBzdHJhaWdodGZvcndhcmQgYXMgdGhlIG1hcHBpbmcgbG9naWMgZm9yIFVURi0xNiBvciBVVEYtMzIuIFRoZSBVVEYtOFxuICogbWFwcGluZyBsb2dpYyBpcyBhcyBmb2xsb3dzIFsyXTpcbiAqXG4gKiDigKIgSWYgYSBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVKzAwMDAuLlUrMDA3RiwgdGhlbiB2aWV3IGl0IGFzIGEgNy1iaXRcbiAqICAgaW50ZWdlcjogMGJ4eHh4eHh4LiBNYXAgdGhlIGNvZGUgcG9pbnQgdG8gMSBieXRlIHdpdGggdGhlIGZpcnN0IGhpZ2ggb3JkZXJcbiAqICAgYml0IHNldCB0byAwOlxuICpcbiAqICAgICAgIGIxPTBiMHh4eHh4eHhcbiAqXG4gKiDigKIgSWYgYSBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVKzAwODAuLlUrMDdGRiwgdGhlbiB2aWV3IGl0IGFzIGFuIDExLWJpdFxuICogICBpbnRlZ2VyOiAwYnl5eXl5eHh4eHh4LiBNYXAgdGhlIGNvZGUgcG9pbnQgdG8gMiBieXRlcyB3aXRoIHRoZSBmaXJzdCA1IGJpdHNcbiAqICAgb2YgdGhlIGNvZGUgcG9pbnQgc3RvcmVkIGluIHRoZSBmaXJzdCBieXRlLCBhbmQgdGhlIGxhc3QgNiBiaXRzIHN0b3JlZCBpblxuICogICB0aGUgc2Vjb25kIGJ5dGU6XG4gKlxuICogICAgICAgYjE9MGIxMTB5eXl5eSAgICBiMj0wYjEweHh4eHh4XG4gKlxuICog4oCiIElmIGEgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVSswODAwLi5VK0ZGRkYsIHRoZW4gdmlldyBpdCBhcyBhIDE2LWJpdFxuICogICBpbnRlZ2VyLCAwYnp6enp5eXl5eXl4eHh4eHguIE1hcCB0aGUgY29kZSBwb2ludCB0byAzIGJ5dGVzIHdpdGggdGhlIGZpcnN0XG4gKiAgIDQgYml0cyBzdG9yZWQgaW4gdGhlIGZpcnN0IGJ5dGUsIHRoZSBuZXh0IDYgYml0cyBzdG9yZWQgaW4gdGhlIHNlY29uZCBieXRlLFxuICogICBhbmQgdGhlIGxhc3QgNiBiaXRzIGluIHRoZSB0aGlyZCBieXRlOlxuICpcbiAqICAgICAgIGIxPTBiMTExMHp6enogICAgYjI9MGIxMHl5eXl5eSAgICBiMz0wYjEweHh4eHh4XG4gKlxuICog4oCiIElmIGEgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVSsxMDAwMC4uLlUrMTBGRkZGLCB0aGVuIHZpZXcgaXQgYXMgYVxuICogICAyMS1iaXQgaW50ZWdlciwgMGJ2dnZ6enp6enp5eXl5eXl4eHh4eHguIE1hcCB0aGUgY29kZSBwb2ludCB0byA0IGJ5dGVzIHdpdGhcbiAqICAgdGhlIGZpcnN0IDMgYml0cyBzdG9yZWQgaW4gdGhlIGZpcnN0IGJ5dGUsIHRoZSBuZXh0IDYgYml0cyBzdG9yZWQgaW4gdGhlXG4gKiAgIHNlY29uZCBieXRlLCB0aGUgbmV4dCA2IGJpdHMgc3RvcmVkIGluIHRoZSB0aGlyZCBieXRlLCBhbmQgdGhlIGxhc3QgNiBiaXRzXG4gKiAgIHN0b3JlZCBpbiB0aGUgZm91cnRoIGJ5dGU6XG4gKlxuICogICAgICAgYjE9MGIxMTExMHh4eCAgICBiMj0wYjEwenp6enp6ICAgIGIzPTBiMTB5eXl5eXkgICAgYjQ9MGIxMHh4eHh4eFxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUsIHdoZW4gaXRlcmF0aW5nIHRocm91Z2ggdGhlIGNvZGUgcG9pbnRzIG9mIGEgc3RyaW5nXG4gKiBpbiBKYXZhU2NyaXB0LCB0aGF0IGlmIGEgY2hhcmFjdGVyIGlzIGVuY29kZWQgYXMgYSBzdXJyb2dhdGUgcGFpciBpdCB3aWxsXG4gKiBpbmNyZWFzZSB0aGUgc3RyaW5nJ3MgbGVuZ3RoIGJ5IDIgaW5zdGVhZCBvZiAxIFs0XS4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiA+ICdhJy5sZW5ndGhcbiAqIDFcbiAqID4gJ/CfkqknLmxlbmd0aFxuICogMlxuICogPiAn6KqeJy5sZW5ndGhcbiAqIDFcbiAqID4gJ2Hwn5Kp6KqeJy5sZW5ndGhcbiAqIDRcbiAqIGBgYFxuICpcbiAqIFRoZSByZXN1bHRzIG9mIHRoZSBhYm92ZSBleGFtcGxlIGFyZSBleHBsYWluZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGVcbiAqIGNoYXJhY3RlcnMgJ2EnIGFuZCAn6KqeJyBhcmUgbm90IHJlcHJlc2VudGVkIGJ5IHN1cnJvZ2F0ZSBwYWlycywgYnV0ICfwn5KpJyBpcy5cbiAqXG4gKiBCZWNhdXNlIG9mIHRoaXMgaWRpb3N5bmNyYXN5IGluIEphdmFTY3JpcHQncyBzdHJpbmcgaW1wbGVtZW50YXRpb24gYW5kIEFQSXMsXG4gKiB3ZSBtdXN0IFwianVtcFwiIGFuIGV4dHJhIGluZGV4IGFmdGVyIGVuY29kaW5nIGEgY2hhcmFjdGVyIGFzIGEgc3Vycm9nYXRlXG4gKiBwYWlyLiBJbiBwcmFjdGljZSwgdGhpcyBtZWFucyB3ZSBtdXN0IGluY3JlbWVudCB0aGUgaW5kZXggb2Ygb3VyIGZvciBsb29wIGJ5XG4gKiAyIGlmIHdlIGVuY29kZSBhIHN1cnJvZ2F0ZSBwYWlyLCBhbmQgMSBpbiBhbGwgb3RoZXIgY2FzZXMuXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogICAtIFsxXSBodHRwczovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlMTIuMC4wL1VuaWNvZGVTdGFuZGFyZC0xMi4wLnBkZlxuICogICAgICAgICAzLjkgIFVuaWNvZGUgRW5jb2RpbmcgRm9ybXMgLSBVVEYtOFxuICogICAtIFsyXSBodHRwOi8vd3d3Lmhlcm9uZ3lhbmcuY29tL1VuaWNvZGUvVVRGLTgtVVRGLTgtRW5jb2RpbmcuaHRtbFxuICogICAtIFszXSBodHRwOi8vd3d3Lmhlcm9uZ3lhbmcuY29tL1VuaWNvZGUvVVRGLTgtVVRGLTgtRW5jb2RpbmctQWxnb3JpdGhtLmh0bWxcbiAqICAgLSBbNF0gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2xlbmd0aCNEZXNjcmlwdGlvblxuICpcbiAqL1xuZXhwb3J0IHZhciB1dGY4RW5jb2RlID0gZnVuY3Rpb24gKGlucHV0LCBieXRlT3JkZXJNYXJrKSB7XG4gICAgaWYgKGJ5dGVPcmRlck1hcmsgPT09IHZvaWQgMCkgeyBieXRlT3JkZXJNYXJrID0gdHJ1ZTsgfVxuICAgIHZhciBlbmNvZGVkID0gW107XG4gICAgaWYgKGJ5dGVPcmRlck1hcmspXG4gICAgICAgIGVuY29kZWQucHVzaCgweGVmLCAweGJiLCAweGJmKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBpbnB1dC5sZW5ndGg7IGlkeCA8IGxlbjspIHtcbiAgICAgICAgdmFyIGNvZGVQb2ludCA9IGlucHV0LmNvZGVQb2ludEF0KGlkeCk7XG4gICAgICAgIC8vIE9uZSBieXRlIGVuY29kaW5nXG4gICAgICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZTEgPSBjb2RlUG9pbnQgJiAweDdmO1xuICAgICAgICAgICAgZW5jb2RlZC5wdXNoKGJ5dGUxKTtcbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIFR3byBieXRlIGVuY29kaW5nXG4gICAgICAgIGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MDgwMCkge1xuICAgICAgICAgICAgdmFyIGJ5dGUxID0gKChjb2RlUG9pbnQgPj4gNikgJiAweDFmKSB8IDB4YzA7XG4gICAgICAgICAgICB2YXIgYnl0ZTIgPSAoY29kZVBvaW50ICYgMHgzZikgfCAweDgwO1xuICAgICAgICAgICAgZW5jb2RlZC5wdXNoKGJ5dGUxLCBieXRlMik7XG4gICAgICAgICAgICBpZHggKz0gMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaHJlZSBieXRlIGVuY29kaW5nXG4gICAgICAgIGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MDEwMDAwKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZTEgPSAoKGNvZGVQb2ludCA+PiAxMikgJiAweDBmKSB8IDB4ZTA7XG4gICAgICAgICAgICB2YXIgYnl0ZTIgPSAoKGNvZGVQb2ludCA+PiA2KSAmIDB4M2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHZhciBieXRlMyA9IChjb2RlUG9pbnQgJiAweDNmKSB8IDB4ODA7XG4gICAgICAgICAgICBlbmNvZGVkLnB1c2goYnl0ZTEsIGJ5dGUyLCBieXRlMyk7XG4gICAgICAgICAgICBpZHggKz0gMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3VyIGJ5dGUgZW5jb2RpbmcgKHN1cnJvZ2F0ZSBwYWlyKVxuICAgICAgICBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgdmFyIGJ5dGUxID0gKChjb2RlUG9pbnQgPj4gMTgpICYgMHgwNykgfCAweGYwO1xuICAgICAgICAgICAgdmFyIGJ5dGUyID0gKChjb2RlUG9pbnQgPj4gMTIpICYgMHgzZikgfCAweDgwO1xuICAgICAgICAgICAgdmFyIGJ5dGUzID0gKChjb2RlUG9pbnQgPj4gNikgJiAweDNmKSB8IDB4ODA7XG4gICAgICAgICAgICB2YXIgYnl0ZTQgPSAoKGNvZGVQb2ludCA+PiAwKSAmIDB4M2YpIHwgMHg4MDtcbiAgICAgICAgICAgIGVuY29kZWQucHVzaChieXRlMSwgYnl0ZTIsIGJ5dGUzLCBieXRlNCk7XG4gICAgICAgICAgICBpZHggKz0gMjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBjYXNlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY29kZSBwb2ludDogMHhcIiArIHRvSGV4U3RyaW5nKGNvZGVQb2ludCkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZW5jb2RlZCk7XG59O1xuLyoqXG4gKiBFbmNvZGVzIGEgc3RyaW5nIHRvIFVURi0xNi5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgVGhlIHN0cmluZyB0byBiZSBlbmNvZGVkLlxuICogQHBhcmFtIGJ5dGVPcmRlck1hcmsgV2hldGhlciBvciBub3QgYSBieXRlIG9yZGVyIG1hcmtlciAoQk9NKSBzaG91bGQgYmUgYWRkZWRcbiAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBzdGFydCBvZiB0aGUgZW5jb2RpbmcuIChkZWZhdWx0IGB0cnVlYClcbiAqIEByZXR1cm5zIEEgVWludDE2QXJyYXkgY29udGFpbmluZyB0aGUgVVRGLTE2IGVuY29kaW5nIG9mIHRoZSBpbnB1dCBzdHJpbmcuXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBKYXZhU2NyaXB0IHN0cmluZ3MgYXJlIGNvbXBvc2VkIG9mIFVuaWNvZGUgY29kZSBwb2ludHMuIENvZGUgcG9pbnRzIGFyZVxuICogaW50ZWdlcnMgaW4gdGhlIHJhbmdlIDAgdG8gMSwxMTQsMTExICgweDEwRkZGRikuIFdoZW4gc2VyaWFsaXppbmcgYSBzdHJpbmcsXG4gKiBpdCBtdXN0IGJlIGVuY29kZWQgYXMgYSBzZXF1ZW5jZSBvZiB3b3Jkcy4gQSB3b3JkIGlzIHR5cGljYWxseSA4LCAxNiwgb3IgMzJcbiAqIGJ5dGVzIGluIHNpemUuIEFzIHN1Y2gsIFVuaWNvZGUgZGVmaW5lcyB0aHJlZSBlbmNvZGluZyBmb3JtczogVVRGLTgsIFVURi0xNixcbiAqIGFuZCBVVEYtMzIuIFRoZXNlIGVuY29kaW5nIGZvcm1zIGFyZSBkZXNjcmliZWQgaW4gdGhlIFVuaWNvZGUgc3RhbmRhcmQgWzFdLlxuICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBVVEYtMTYgZW5jb2RpbmcgZm9ybS5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIEluIFVURi0xNiwgZWFjaCBjb2RlIHBvaW50IGlzIG1hcHBlZCB0byBvbmUgb3IgdHdvIDE2LWJpdCBpbnRlZ2Vycy4gVGhlXG4gKiBVVEYtMTYgbWFwcGluZyBsb2dpYyBpcyBhcyBmb2xsb3dzIFsyXTpcbiAqXG4gKiDigKIgSWYgYSBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVKzAwMDAuLlUrRkZGRiwgdGhlbiBtYXAgdGhlIGNvZGUgcG9pbnQgdG9cbiAqICAgYSAxNi1iaXQgaW50ZWdlciB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QuXG4gKlxuICog4oCiIElmIGEgY29kZSBwb2ludCBpcyBpbiB0aGUgcmFuZ2UgVSsxMDAwMC4uVSsxMDAwMCwgdGhlbiBtYXAgdGhlIGNvZGUgcG9pbnRcbiAqICAgdG8gdHdvIDE2LWJpdCBpbnRlZ2Vycy4gVGhlIGZpcnN0IGludGVnZXIgc2hvdWxkIGNvbnRhaW4gdGhlIGhpZ2ggc3Vycm9nYXRlXG4gKiAgIGFuZCB0aGUgc2Vjb25kIGludGVnZXIgc2hvdWxkIGNvbnRhaW4gdGhlIGxvdyBzdXJyb2dhdGUuIEJvdGggc3Vycm9nYXRlc1xuICogICBzaG91bGQgYmUgd3JpdHRlbiB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QuXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSwgd2hlbiBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgY29kZSBwb2ludHMgb2YgYSBzdHJpbmdcbiAqIGluIEphdmFTY3JpcHQsIHRoYXQgaWYgYSBjaGFyYWN0ZXIgaXMgZW5jb2RlZCBhcyBhIHN1cnJvZ2F0ZSBwYWlyIGl0IHdpbGxcbiAqIGluY3JlYXNlIHRoZSBzdHJpbmcncyBsZW5ndGggYnkgMiBpbnN0ZWFkIG9mIDEgWzRdLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBcbiAqID4gJ2EnLmxlbmd0aFxuICogMVxuICogPiAn8J+SqScubGVuZ3RoXG4gKiAyXG4gKiA+ICfoqp4nLmxlbmd0aFxuICogMVxuICogPiAnYfCfkqnoqp4nLmxlbmd0aFxuICogNFxuICogYGBgXG4gKlxuICogVGhlIHJlc3VsdHMgb2YgdGhlIGFib3ZlIGV4YW1wbGUgYXJlIGV4cGxhaW5lZCBieSB0aGUgZmFjdCB0aGF0IHRoZVxuICogY2hhcmFjdGVycyAnYScgYW5kICfoqp4nIGFyZSBub3QgcmVwcmVzZW50ZWQgYnkgc3Vycm9nYXRlIHBhaXJzLCBidXQgJ/CfkqknIGlzLlxuICpcbiAqIEJlY2F1c2Ugb2YgdGhpcyBpZGlvc3luY3Jhc3kgaW4gSmF2YVNjcmlwdCdzIHN0cmluZyBpbXBsZW1lbnRhdGlvbiBhbmQgQVBJcyxcbiAqIHdlIG11c3QgXCJqdW1wXCIgYW4gZXh0cmEgaW5kZXggYWZ0ZXIgZW5jb2RpbmcgYSBjaGFyYWN0ZXIgYXMgYSBzdXJyb2dhdGVcbiAqIHBhaXIuIEluIHByYWN0aWNlLCB0aGlzIG1lYW5zIHdlIG11c3QgaW5jcmVtZW50IHRoZSBpbmRleCBvZiBvdXIgZm9yIGxvb3AgYnlcbiAqIDIgaWYgd2UgZW5jb2RlIGEgc3Vycm9nYXRlIHBhaXIsIGFuZCAxIGluIGFsbCBvdGhlciBjYXNlcy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiAgIC0gWzFdIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL3ZlcnNpb25zL1VuaWNvZGUxMi4wLjAvVW5pY29kZVN0YW5kYXJkLTEyLjAucGRmXG4gKiAgICAgICAgIDMuOSAgVW5pY29kZSBFbmNvZGluZyBGb3JtcyAtIFVURi04XG4gKiAgIC0gWzJdIGh0dHA6Ly93d3cuaGVyb25neWFuZy5jb20vVW5pY29kZS9VVEYtMTYtVVRGLTE2LUVuY29kaW5nLmh0bWxcbiAqICAgLSBbM10gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2xlbmd0aCNEZXNjcmlwdGlvblxuICpcbiAqL1xuZXhwb3J0IHZhciB1dGYxNkVuY29kZSA9IGZ1bmN0aW9uIChpbnB1dCwgYnl0ZU9yZGVyTWFyaykge1xuICAgIGlmIChieXRlT3JkZXJNYXJrID09PSB2b2lkIDApIHsgYnl0ZU9yZGVyTWFyayA9IHRydWU7IH1cbiAgICB2YXIgZW5jb2RlZCA9IFtdO1xuICAgIGlmIChieXRlT3JkZXJNYXJrKVxuICAgICAgICBlbmNvZGVkLnB1c2goMHhmZWZmKTtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSBpbnB1dC5sZW5ndGg7IGlkeCA8IGxlbjspIHtcbiAgICAgICAgdmFyIGNvZGVQb2ludCA9IGlucHV0LmNvZGVQb2ludEF0KGlkeCk7XG4gICAgICAgIC8vIFR3byBieXRlIGVuY29kaW5nXG4gICAgICAgIGlmIChjb2RlUG9pbnQgPCAweDAxMDAwMCkge1xuICAgICAgICAgICAgZW5jb2RlZC5wdXNoKGNvZGVQb2ludCk7XG4gICAgICAgICAgICBpZHggKz0gMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3VyIGJ5dGUgZW5jb2RpbmcgKHN1cnJvZ2F0ZSBwYWlyKVxuICAgICAgICBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgZW5jb2RlZC5wdXNoKGhpZ2hTdXJyb2dhdGUoY29kZVBvaW50KSwgbG93U3Vycm9nYXRlKGNvZGVQb2ludCkpO1xuICAgICAgICAgICAgaWR4ICs9IDI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgY2FzZVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvZGUgcG9pbnQ6IDB4XCIgKyB0b0hleFN0cmluZyhjb2RlUG9pbnQpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBVaW50MTZBcnJheShlbmNvZGVkKTtcbn07XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBgY29kZVBvaW50YCBpcyB3aXRoaW4gdGhlXG4gKiBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUgKEJNUCkuIENvZGUgcG9pbnRzIGluc2lkZSB0aGUgQk1QIGFyZSBub3QgZW5jb2RlZFxuICogd2l0aCBzdXJyb2dhdGUgcGFpcnMuXG4gKiBAcGFyYW0gY29kZVBvaW50IFRoZSBjb2RlIHBvaW50IHRvIGJlIGV2YWx1YXRlZC5cbiAqXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNEZXNjcmlwdGlvblxuICovXG5leHBvcnQgdmFyIGlzV2l0aGluQk1QID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgIHJldHVybiBjb2RlUG9pbnQgPj0gMCAmJiBjb2RlUG9pbnQgPD0gMHhmZmZmO1xufTtcbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGBjb2RlUG9pbnRgIGlzIHZhbGlkIGFuZCBtdXN0IGJlIHJlcHJlc2VudGVkXG4gKiB3aXRoIGEgc3Vycm9nYXRlIHBhaXIgd2hlbiBlbmNvZGVkLlxuICogQHBhcmFtIGNvZGVQb2ludCBUaGUgY29kZSBwb2ludCB0byBiZSBldmFsdWF0ZWQuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjRGVzY3JpcHRpb25cbiAqL1xuZXhwb3J0IHZhciBoYXNTdXJyb2dhdGVzID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgIHJldHVybiBjb2RlUG9pbnQgPj0gMHgwMTAwMDAgJiYgY29kZVBvaW50IDw9IDB4MTBmZmZmO1xufTtcbi8vIEZyb20gVW5pY29kZSAzLjAgc3BlYywgc2VjdGlvbiAzLjc6XG4vLyAgIGh0dHA6Ly91bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlMy4wLjAvY2gwMy5wZGZcbmV4cG9ydCB2YXIgaGlnaFN1cnJvZ2F0ZSA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcigoY29kZVBvaW50IC0gMHgxMDAwMCkgLyAweDQwMCkgKyAweGQ4MDA7XG59O1xuLy8gRnJvbSBVbmljb2RlIDMuMCBzcGVjLCBzZWN0aW9uIDMuNzpcbi8vICAgaHR0cDovL3VuaWNvZGUub3JnL3ZlcnNpb25zL1VuaWNvZGUzLjAuMC9jaDAzLnBkZlxuZXhwb3J0IHZhciBsb3dTdXJyb2dhdGUgPSBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgcmV0dXJuICgoY29kZVBvaW50IC0gMHgxMDAwMCkgJSAweDQwMCkgKyAweGRjMDA7XG59O1xudmFyIEJ5dGVPcmRlcjtcbihmdW5jdGlvbiAoQnl0ZU9yZGVyKSB7XG4gICAgQnl0ZU9yZGVyW1wiQmlnRW5kaWFuXCJdID0gXCJCaWdFbmRpYW5cIjtcbiAgICBCeXRlT3JkZXJbXCJMaXR0bGVFbmRpYW5cIl0gPSBcIkxpdHRsZUVuZGlhblwiO1xufSkoQnl0ZU9yZGVyIHx8IChCeXRlT3JkZXIgPSB7fSkpO1xudmFyIFJFUExBQ0VNRU5UID0gJ++/vScuY29kZVBvaW50QXQoMCk7XG4vKipcbiAqIERlY29kZXMgYSBVaW50OEFycmF5IG9mIGRhdGEgdG8gYSBzdHJpbmcgdXNpbmcgVVRGLTE2LlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIHJlY292ZXIgZnJvbSBlcnJvbm91cyBpbnB1dCBieVxuICogaW5zZXJ0aW5nIHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKO+/vSkgdG8gbWFyayBpbnZhbGlkIGNvZGUgcG9pbnRzXG4gKiBhbmQgc3Vycm9nYXRlIHBhaXJzLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBBIFVpbnQ4QXJyYXkgY29udGFpbmluZyBVVEYtMTYgZW5jb2RlZCBkYXRhXG4gKiBAcGFyYW0gYnl0ZU9yZGVyTWFyayBXaGV0aGVyIG9yIG5vdCBhIGJ5dGUgb3JkZXIgbWFya2VyIChCT00pIHNob3VsZCBiZSByZWFkXG4gKiAgICAgICAgICAgICAgICAgICAgICBhdCB0aGUgc3RhcnQgb2YgdGhlIGVuY29kaW5nLiAoZGVmYXVsdCBgdHJ1ZWApXG4gKiBAcmV0dXJucyBUaGUgZGVjb2RlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCB2YXIgdXRmMTZEZWNvZGUgPSBmdW5jdGlvbiAoaW5wdXQsIGJ5dGVPcmRlck1hcmspIHtcbiAgICBpZiAoYnl0ZU9yZGVyTWFyayA9PT0gdm9pZCAwKSB7IGJ5dGVPcmRlck1hcmsgPSB0cnVlOyB9XG4gICAgLy8gTmVlZCBhdCBsZWFzdCAyIGJ5dGVzIG9mIGRhdGEgaW4gVVRGLTE2IGVuY29kaW5nc1xuICAgIGlmIChpbnB1dC5sZW5ndGggPD0gMSlcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KFJFUExBQ0VNRU5UKTtcbiAgICB2YXIgYnl0ZU9yZGVyID0gYnl0ZU9yZGVyTWFyayA/IHJlYWRCT00oaW5wdXQpIDogQnl0ZU9yZGVyLkJpZ0VuZGlhbjtcbiAgICAvLyBTa2lwIGJ5dGUgb3JkZXIgbWFyayBpZiBuZWVkZWRcbiAgICB2YXIgaWR4ID0gYnl0ZU9yZGVyTWFyayA/IDIgOiAwO1xuICAgIHZhciBjb2RlUG9pbnRzID0gW107XG4gICAgd2hpbGUgKGlucHV0Lmxlbmd0aCAtIGlkeCA+PSAyKSB7XG4gICAgICAgIHZhciBmaXJzdCA9IGRlY29kZVZhbHVlcyhpbnB1dFtpZHgrK10sIGlucHV0W2lkeCsrXSwgYnl0ZU9yZGVyKTtcbiAgICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZShmaXJzdCkpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5sZW5ndGggLSBpZHggPCAyKSB7XG4gICAgICAgICAgICAgICAgLy8gTmVlZCBhdCBsZWFzdCAyIGJ5dGVzIGxlZnQgZm9yIHRoZSBsb3cgc3Vycm9nYXRlIHRoYXQgaXMgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnRzLnB1c2goUkVQTEFDRU1FTlQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlY29uZCA9IGRlY29kZVZhbHVlcyhpbnB1dFtpZHgrK10sIGlucHV0W2lkeCsrXSwgYnl0ZU9yZGVyKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNMb3dTdXJyb2dhdGUoc2Vjb25kKSkge1xuICAgICAgICAgICAgICAgICAgICBjb2RlUG9pbnRzLnB1c2goZmlyc3QsIHNlY29uZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBMb3cgc3Vycm9nYXRlcyBzaG91bGQgYWx3YXlzIGZvbGxvdyBoaWdoIHN1cnJvZ2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgY29kZVBvaW50cy5wdXNoKFJFUExBQ0VNRU5UKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNMb3dTdXJyb2dhdGUoZmlyc3QpKSB7XG4gICAgICAgICAgICAvLyBIaWdoIHN1cnJvZ2F0ZXMgc2hvdWxkIGFsd2F5cyBjb21lIGZpcnN0IHNpbmNlIGBkZWNvZGVWYWx1ZXMoKWBcbiAgICAgICAgICAgIC8vIGFjY291bnRzIGZvciB0aGUgYnl0ZSBvcmRlcmluZ1xuICAgICAgICAgICAgaWR4ICs9IDI7XG4gICAgICAgICAgICBjb2RlUG9pbnRzLnB1c2goUkVQTEFDRU1FTlQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29kZVBvaW50cy5wdXNoKGZpcnN0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgZXh0cmEgYnl0ZShzKSBsZWZ0IG92ZXJcbiAgICBpZiAoaWR4IDwgaW5wdXQubGVuZ3RoKVxuICAgICAgICBjb2RlUG9pbnRzLnB1c2goUkVQTEFDRU1FTlQpO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpO1xufTtcbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGBjb2RlUG9pbnRgIGlzIGEgaGlnaCBzdXJyb2dhdGUuXG4gKiBAcGFyYW0gY29kZVBvaW50IFRoZSBjb2RlIHBvaW50IHRvIGJlIGV2YWx1YXRlZC5cbiAqXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNEZXNjcmlwdGlvblxuICovXG52YXIgaXNIaWdoU3Vycm9nYXRlID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgIHJldHVybiBjb2RlUG9pbnQgPj0gMHhkODAwICYmIGNvZGVQb2ludCA8PSAweGRiZmY7XG59O1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gYGNvZGVQb2ludGAgaXMgYSBsb3cgc3Vycm9nYXRlLlxuICogQHBhcmFtIGNvZGVQb2ludCBUaGUgY29kZSBwb2ludCB0byBiZSBldmFsdWF0ZWQuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjRGVzY3JpcHRpb25cbiAqL1xudmFyIGlzTG93U3Vycm9nYXRlID0gZnVuY3Rpb24gKGNvZGVQb2ludCkge1xuICAgIHJldHVybiBjb2RlUG9pbnQgPj0gMHhkYzAwICYmIGNvZGVQb2ludCA8PSAweGRmZmY7XG59O1xuLyoqXG4gKiBEZWNvZGVzIHRoZSBnaXZlbiB1dGYtMTYgdmFsdWVzIGZpcnN0IGFuZCBzZWNvbmQgdXNpbmcgdGhlIHNwZWNpZmllZFxuICogYnl0ZSBvcmRlci5cbiAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgZW5jb2RpbmcuXG4gKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgZW5jb2RpbmcuXG4gKiBAcGFyYW0gYnl0ZU9yZGVyIFRoZSBieXRlIG9yZGVyIG9mIHRoZSBlbmNvZGluZy5cbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0V4YW1wbGVzXG4gKi9cbnZhciBkZWNvZGVWYWx1ZXMgPSBmdW5jdGlvbiAoZmlyc3QsIHNlY29uZCwgYnl0ZU9yZGVyKSB7XG4gICAgLy8gQXBwZW5kIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByZWNlZGluZyBieXRlIGJ5IHNoaWZ0aW5nIHRoZVxuICAgIC8vIGZpcnN0IG9uZSA4IHRvIHRoZSBsZWZ0IGFuZCB0aGFuIGFwcGx5aW5nIGEgYml0d2lzZSBvci1vcGVyYXRvciB0byBhcHBlbmRcbiAgICAvLyB0aGUgc2Vjb25kIG9uZS5cbiAgICBpZiAoYnl0ZU9yZGVyID09PSBCeXRlT3JkZXIuTGl0dGxlRW5kaWFuKVxuICAgICAgICByZXR1cm4gKHNlY29uZCA8PCA4KSB8IGZpcnN0O1xuICAgIGlmIChieXRlT3JkZXIgPT09IEJ5dGVPcmRlci5CaWdFbmRpYW4pXG4gICAgICAgIHJldHVybiAoZmlyc3QgPDwgOCkgfCBzZWNvbmQ7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBieXRlT3JkZXI6IFwiICsgYnl0ZU9yZGVyKTtcbn07XG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gYXJyYXkgY29udGFpbnMgYSBieXRlIG9yZGVyIG1hcmsgZm9yIHRoZVxuICogVVRGLTE2QkUgb3IgVVRGLTE2TEUgZW5jb2RpbmcuIElmIGl0IGhhcyBuZWl0aGVyLCBCaWdFbmRpYW4gaXMgYXNzdW1lZC5cbiAqXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0J5dGVfb3JkZXJfbWFyayNVVEYtMTZcbiAqXG4gKiBAcGFyYW0gYnl0ZXMgVGhlIGJ5dGUgYXJyYXkgdG8gYmUgZXZhbHVhdGVkLlxuICovXG4vLyBwcmV0dGllci1pZ25vcmVcbnZhciByZWFkQk9NID0gZnVuY3Rpb24gKGJ5dGVzKSB7IHJldHVybiAoaGFzVXRmMTZCaWdFbmRpYW5CT00oYnl0ZXMpID8gQnl0ZU9yZGVyLkJpZ0VuZGlhblxuICAgIDogaGFzVXRmMTZMaXR0bGVFbmRpYW5CT00oYnl0ZXMpID8gQnl0ZU9yZGVyLkxpdHRsZUVuZGlhblxuICAgICAgICA6IEJ5dGVPcmRlci5CaWdFbmRpYW4pOyB9O1xudmFyIGhhc1V0ZjE2QmlnRW5kaWFuQk9NID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGJ5dGVzWzBdID09PSAweGZlICYmIGJ5dGVzWzFdID09PSAweGZmO1xufTtcbnZhciBoYXNVdGYxNkxpdHRsZUVuZGlhbkJPTSA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgIHJldHVybiBieXRlc1swXSA9PT0gMHhmZiAmJiBieXRlc1sxXSA9PT0gMHhmZTtcbn07XG5leHBvcnQgdmFyIGhhc1V0ZjE2Qk9NID0gZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGhhc1V0ZjE2QmlnRW5kaWFuQk9NKGJ5dGVzKSB8fCBoYXNVdGYxNkxpdHRsZUVuZGlhbkJPTShieXRlcyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pY29kZS5qcy5tYXAiLCIvKiB0c2xpbnQ6ZGlzYWJsZTpiYW4tdHlwZXMgKi9cbmltcG9ydCB7IHZhbHVlcyBhcyBvYmplY3RWYWx1ZXMgfSBmcm9tIFwiLi9vYmplY3RzXCI7XG5leHBvcnQgdmFyIGJhY2t0aWNrID0gZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gXCJgXCIgKyB2YWwgKyBcImBcIjsgfTtcbmV4cG9ydCB2YXIgc2luZ2xlUXVvdGUgPSBmdW5jdGlvbiAodmFsKSB7IHJldHVybiBcIidcIiArIHZhbCArIFwiJ1wiOyB9O1xuLy8gcHJldHRpZXItaWdub3JlXG52YXIgZm9ybWF0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpXG4gICAgICAgIHJldHVybiBzaW5nbGVRdW90ZSh2YWx1ZSk7XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHJldHVybiBiYWNrdGljayh2YWx1ZSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gdmFsdWU7XG59O1xuZXhwb3J0IHZhciBjcmVhdGVWYWx1ZUVycm9yTXNnID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIHZhbHVlcykge1xuICAgIHZhciBhbGxvd2VkVmFsdWVzID0gbmV3IEFycmF5KHZhbHVlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgdmFyIHYgPSB2YWx1ZXNbaWR4XTtcbiAgICAgICAgYWxsb3dlZFZhbHVlc1tpZHhdID0gZm9ybWF0VmFsdWUodik7XG4gICAgfVxuICAgIHZhciBqb2luZWRWYWx1ZXMgPSBhbGxvd2VkVmFsdWVzLmpvaW4oJyBvciAnKTtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICByZXR1cm4gYmFja3RpY2sodmFsdWVOYW1lKSArIFwiIG11c3QgYmUgb25lIG9mIFwiICsgam9pbmVkVmFsdWVzICsgXCIsIGJ1dCB3YXMgYWN0dWFsbHkgXCIgKyBmb3JtYXRWYWx1ZSh2YWx1ZSk7XG59O1xuZXhwb3J0IHZhciBhc3NlcnRJc09uZU9mID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIGFsbG93ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWxsb3dlZFZhbHVlcykpIHtcbiAgICAgICAgYWxsb3dlZFZhbHVlcyA9IG9iamVjdFZhbHVlcyhhbGxvd2VkVmFsdWVzKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gYWxsb3dlZFZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBhbGxvd2VkVmFsdWVzW2lkeF0pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoY3JlYXRlVmFsdWVFcnJvck1zZyh2YWx1ZSwgdmFsdWVOYW1lLCBhbGxvd2VkVmFsdWVzKSk7XG59O1xuZXhwb3J0IHZhciBhc3NlcnRJc09uZU9mT3JVbmRlZmluZWQgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgYWxsb3dlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhbGxvd2VkVmFsdWVzKSkge1xuICAgICAgICBhbGxvd2VkVmFsdWVzID0gb2JqZWN0VmFsdWVzKGFsbG93ZWRWYWx1ZXMpO1xuICAgIH1cbiAgICBhc3NlcnRJc09uZU9mKHZhbHVlLCB2YWx1ZU5hbWUsIGFsbG93ZWRWYWx1ZXMuY29uY2F0KHVuZGVmaW5lZCkpO1xufTtcbmV4cG9ydCB2YXIgYXNzZXJ0SXNTdWJzZXQgPSBmdW5jdGlvbiAodmFsdWVzLCB2YWx1ZU5hbWUsIGFsbG93ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWxsb3dlZFZhbHVlcykpIHtcbiAgICAgICAgYWxsb3dlZFZhbHVlcyA9IG9iamVjdFZhbHVlcyhhbGxvd2VkVmFsdWVzKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdmFsdWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBhc3NlcnRJc09uZU9mKHZhbHVlc1tpZHhdLCB2YWx1ZU5hbWUsIGFsbG93ZWRWYWx1ZXMpO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIGdldFR5cGUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpXG4gICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICBpZiAoaXNOYU4odmFsKSlcbiAgICAgICAgcmV0dXJuICdOYU4nO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpXG4gICAgICAgIHJldHVybiAnYm9vbGVhbic7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzeW1ib2wnKVxuICAgICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdiaWdpbnQnKVxuICAgICAgICByZXR1cm4gJ2JpZ2ludCc7XG4gICAgaWYgKHZhbC5jb25zdHJ1Y3RvciAmJiB2YWwuY29uc3RydWN0b3IubmFtZSlcbiAgICAgICAgcmV0dXJuIHZhbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIGlmICh2YWwubmFtZSlcbiAgICAgICAgcmV0dXJuIHZhbC5uYW1lO1xuICAgIGlmICh2YWwuY29uc3RydWN0b3IpXG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsLmNvbnN0cnVjdG9yKTtcbiAgICByZXR1cm4gU3RyaW5nKHZhbCk7XG59O1xuZXhwb3J0IHZhciBpc1R5cGUgPSBmdW5jdGlvbiAodmFsdWUsIHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gJ251bGwnKVxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG4gICAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhbHVlKTtcbiAgICBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG4gICAgaWYgKHR5cGUgPT09ICdzeW1ib2wnKVxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJztcbiAgICBpZiAodHlwZSA9PT0gJ2JpZ2ludCcpXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnO1xuICAgIGlmICh0eXBlID09PSBEYXRlKVxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xuICAgIGlmICh0eXBlID09PSBBcnJheSlcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQXJyYXk7XG4gICAgaWYgKHR5cGUgPT09IFVpbnQ4QXJyYXkpXG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG4gICAgaWYgKHR5cGUgPT09IEFycmF5QnVmZmVyKVxuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcjtcbiAgICBpZiAodHlwZSA9PT0gRnVuY3Rpb24pXG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIHR5cGVbMF07XG59O1xuZXhwb3J0IHZhciBjcmVhdGVUeXBlRXJyb3JNc2cgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgdHlwZXMpIHtcbiAgICB2YXIgYWxsb3dlZFR5cGVzID0gbmV3IEFycmF5KHR5cGVzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuID0gdHlwZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIHZhciB0eXBlID0gdHlwZXNbaWR4XTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdudWxsJylcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ251bGwnKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygndW5kZWZpbmVkJyk7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ3N0cmluZycpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ251bWJlcicpO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdib29sZWFuJyk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdzeW1ib2wnKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnc3ltYm9sJyk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdiaWdpbnQnKVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnYmlnaW50Jyk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IEFycmF5KVxuICAgICAgICAgICAgYWxsb3dlZFR5cGVzW2lkeF0gPSBiYWNrdGljaygnQXJyYXknKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gVWludDhBcnJheSlcbiAgICAgICAgICAgIGFsbG93ZWRUeXBlc1tpZHhdID0gYmFja3RpY2soJ1VpbnQ4QXJyYXknKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gQXJyYXlCdWZmZXIpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKCdBcnJheUJ1ZmZlcicpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXNbaWR4XSA9IGJhY2t0aWNrKHR5cGVbMV0pO1xuICAgIH1cbiAgICB2YXIgam9pbmVkVHlwZXMgPSBhbGxvd2VkVHlwZXMuam9pbignIG9yICcpO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHJldHVybiBiYWNrdGljayh2YWx1ZU5hbWUpICsgXCIgbXVzdCBiZSBvZiB0eXBlIFwiICsgam9pbmVkVHlwZXMgKyBcIiwgYnV0IHdhcyBhY3R1YWxseSBvZiB0eXBlIFwiICsgYmFja3RpY2soZ2V0VHlwZSh2YWx1ZSkpO1xufTtcbmV4cG9ydCB2YXIgYXNzZXJ0SXMgPSBmdW5jdGlvbiAodmFsdWUsIHZhbHVlTmFtZSwgdHlwZXMpIHtcbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW4gPSB0eXBlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgaWYgKGlzVHlwZSh2YWx1ZSwgdHlwZXNbaWR4XSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoY3JlYXRlVHlwZUVycm9yTXNnKHZhbHVlLCB2YWx1ZU5hbWUsIHR5cGVzKSk7XG59O1xuZXhwb3J0IHZhciBhc3NlcnRPclVuZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCB0eXBlcykge1xuICAgIGFzc2VydElzKHZhbHVlLCB2YWx1ZU5hbWUsIHR5cGVzLmNvbmNhdCgndW5kZWZpbmVkJykpO1xufTtcbmV4cG9ydCB2YXIgYXNzZXJ0RWFjaElzID0gZnVuY3Rpb24gKHZhbHVlcywgdmFsdWVOYW1lLCB0eXBlcykge1xuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbiA9IHZhbHVlcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgYXNzZXJ0SXModmFsdWVzW2lkeF0sIHZhbHVlTmFtZSwgdHlwZXMpO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIGFzc2VydFJhbmdlID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIG1pbiwgbWF4KSB7XG4gICAgYXNzZXJ0SXModmFsdWUsIHZhbHVlTmFtZSwgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0SXMobWluLCAnbWluJywgWydudW1iZXInXSk7XG4gICAgYXNzZXJ0SXMobWF4LCAnbWF4JywgWydudW1iZXInXSk7XG4gICAgbWF4ID0gTWF0aC5tYXgobWluLCBtYXgpO1xuICAgIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJhY2t0aWNrKHZhbHVlTmFtZSkgKyBcIiBtdXN0IGJlIGF0IGxlYXN0IFwiICsgbWluICsgXCIgYW5kIGF0IG1vc3QgXCIgKyBtYXggKyBcIiwgYnV0IHdhcyBhY3R1YWxseSBcIiArIHZhbHVlKTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciBhc3NlcnRSYW5nZU9yVW5kZWZpbmVkID0gZnVuY3Rpb24gKHZhbHVlLCB2YWx1ZU5hbWUsIG1pbiwgbWF4KSB7XG4gICAgYXNzZXJ0SXModmFsdWUsIHZhbHVlTmFtZSwgWydudW1iZXInLCAndW5kZWZpbmVkJ10pO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKVxuICAgICAgICBhc3NlcnRSYW5nZSh2YWx1ZSwgdmFsdWVOYW1lLCBtaW4sIG1heCk7XG59O1xuZXhwb3J0IHZhciBhc3NlcnRNdWx0aXBsZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lLCBtdWx0aXBsaWVyKSB7XG4gICAgYXNzZXJ0SXModmFsdWUsIHZhbHVlTmFtZSwgWydudW1iZXInXSk7XG4gICAgaWYgKHZhbHVlICUgbXVsdGlwbGllciAhPT0gMCkge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJhY2t0aWNrKHZhbHVlTmFtZSkgKyBcIiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgXCIgKyBtdWx0aXBsaWVyICsgXCIsIGJ1dCB3YXMgYWN0dWFsbHkgXCIgKyB2YWx1ZSk7XG4gICAgfVxufTtcbmV4cG9ydCB2YXIgYXNzZXJ0SW50ZWdlciA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYmFja3RpY2sodmFsdWVOYW1lKSArIFwiIG11c3QgYmUgYW4gaW50ZWdlciwgYnV0IHdhcyBhY3R1YWxseSBcIiArIHZhbHVlKTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciBhc3NlcnRQb3NpdGl2ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWVOYW1lKSB7XG4gICAgaWYgKCFbMSwgMF0uaW5jbHVkZXMoTWF0aC5zaWduKHZhbHVlKSkpIHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihiYWNrdGljayh2YWx1ZU5hbWUpICsgXCIgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvciAwLCBidXQgd2FzIGFjdHVhbGx5IFwiICsgdmFsdWUpO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12YWxpZGF0b3JzLmpzLm1hcCIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NyZWF0ZUJpbmRpbmcobywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xyXG4gICAgcmVzdWx0LmRlZmF1bHQgPSBtb2Q7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHtcclxuICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBnZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgcHJpdmF0ZU1hcCwgdmFsdWUpIHtcclxuICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlTWFwLnNldChyZWNlaXZlciwgdmFsdWUpO1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInByaW50SlNcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wicHJpbnRKU1wiXSA9IGZhY3RvcnkoKTtcbn0pKHdpbmRvdywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbi8qKioqKiovIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4vKioqKioqLyBcdFx0cmV0dXJuIG5zO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKHtcblxuLyoqKi8gXCIuL3NyYy9pbmRleC5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9pbmRleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zYXNzX2luZGV4X3Njc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vc2Fzcy9pbmRleC5zY3NzICovIFwiLi9zcmMvc2Fzcy9pbmRleC5zY3NzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9zYXNzX2luZGV4X3Njc3NfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihfc2Fzc19pbmRleF9zY3NzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9qc19pbml0X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2pzL2luaXQgKi8gXCIuL3NyYy9qcy9pbml0LmpzXCIpO1xuXG5cbnZhciBwcmludEpTID0gX2pzX2luaXRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uaW5pdDtcblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5wcmludEpTID0gcHJpbnRKUztcbn1cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChwcmludEpTKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvYnJvd3Nlci5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL2Jyb3dzZXIuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xudmFyIEJyb3dzZXIgPSB7XG4gIC8vIEZpcmVmb3ggMS4wK1xuICBpc0ZpcmVmb3g6IGZ1bmN0aW9uIGlzRmlyZWZveCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIEluc3RhbGxUcmlnZ2VyICE9PSAndW5kZWZpbmVkJztcbiAgfSxcbiAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgNi0xMVxuICBpc0lFOiBmdW5jdGlvbiBpc0lFKCkge1xuICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUnKSAhPT0gLTEgfHwgISFkb2N1bWVudC5kb2N1bWVudE1vZGU7XG4gIH0sXG4gIC8vIEVkZ2UgMjArXG4gIGlzRWRnZTogZnVuY3Rpb24gaXNFZGdlKCkge1xuICAgIHJldHVybiAhQnJvd3Nlci5pc0lFKCkgJiYgISF3aW5kb3cuU3R5bGVNZWRpYTtcbiAgfSxcbiAgLy8gQ2hyb21lIDErXG4gIGlzQ2hyb21lOiBmdW5jdGlvbiBpc0Nocm9tZSgpIHtcbiAgICB2YXIgY29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogd2luZG93O1xuICAgIHJldHVybiAhIWNvbnRleHQuY2hyb21lO1xuICB9LFxuICAvLyBBdCBsZWFzdCBTYWZhcmkgMys6IFwiW29iamVjdCBIVE1MRWxlbWVudENvbnN0cnVjdG9yXVwiXG4gIGlzU2FmYXJpOiBmdW5jdGlvbiBpc1NhZmFyaSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5IVE1MRWxlbWVudCkuaW5kZXhPZignQ29uc3RydWN0b3InKSA+IDAgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3NhZmFyaScpICE9PSAtMTtcbiAgfSxcbiAgLy8gSU9TIENocm9tZVxuICBpc0lPU0Nocm9tZTogZnVuY3Rpb24gaXNJT1NDaHJvbWUoKSB7XG4gICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdjcmlvcycpICE9PSAtMTtcbiAgfVxufTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoQnJvd3Nlcik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL2Z1bmN0aW9ucy5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvZnVuY3Rpb25zLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBhZGRXcmFwcGVyLCBjYXBpdGFsaXplUHJpbnQsIGNvbGxlY3RTdHlsZXMsIGFkZEhlYWRlciwgY2xlYW5VcCwgaXNSYXdIVE1MICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFkZFdyYXBwZXJcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBhZGRXcmFwcGVyOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJjYXBpdGFsaXplUHJpbnRcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBjYXBpdGFsaXplUHJpbnQ7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImNvbGxlY3RTdHlsZXNcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBjb2xsZWN0U3R5bGVzOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhZGRIZWFkZXJcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBhZGRIZWFkZXI7IH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImNsZWFuVXBcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBjbGVhblVwOyB9KTtcbi8qIGhhcm1vbnkgZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJpc1Jhd0hUTUxcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBpc1Jhd0hUTUw7IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9tb2RhbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9tb2RhbCAqLyBcIi4vc3JjL2pzL21vZGFsLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9icm93c2VyX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Jyb3dzZXIgKi8gXCIuL3NyYy9qcy9icm93c2VyLmpzXCIpO1xuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5cblxuZnVuY3Rpb24gYWRkV3JhcHBlcihodG1sRGF0YSwgcGFyYW1zKSB7XG4gIHZhciBib2R5U3R5bGUgPSAnZm9udC1mYW1pbHk6JyArIHBhcmFtcy5mb250ICsgJyAhaW1wb3J0YW50OyBmb250LXNpemU6ICcgKyBwYXJhbXMuZm9udF9zaXplICsgJyAhaW1wb3J0YW50OyB3aWR0aDoxMDAlOyc7XG4gIHJldHVybiAnPGRpdiBzdHlsZT1cIicgKyBib2R5U3R5bGUgKyAnXCI+JyArIGh0bWxEYXRhICsgJzwvZGl2Pic7XG59XG5mdW5jdGlvbiBjYXBpdGFsaXplUHJpbnQob2JqKSB7XG4gIHJldHVybiBvYmouY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBvYmouc2xpY2UoMSk7XG59XG5mdW5jdGlvbiBjb2xsZWN0U3R5bGVzKGVsZW1lbnQsIHBhcmFtcykge1xuICB2YXIgd2luID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93OyAvLyBTdHJpbmcgdmFyaWFibGUgdG8gaG9sZCBzdHlsaW5nIGZvciBlYWNoIGVsZW1lbnRcblxuICB2YXIgZWxlbWVudFN0eWxlID0gJyc7IC8vIExvb3Agb3ZlciBjb21wdXRlZCBzdHlsZXNcblxuICB2YXIgc3R5bGVzID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgJycpO1xuXG4gIGZvciAodmFyIGtleSA9IDA7IGtleSA8IHN0eWxlcy5sZW5ndGg7IGtleSsrKSB7XG4gICAgLy8gQ2hlY2sgaWYgc3R5bGUgc2hvdWxkIGJlIHByb2Nlc3NlZFxuICAgIGlmIChwYXJhbXMudGFyZ2V0U3R5bGVzLmluZGV4T2YoJyonKSAhPT0gLTEgfHwgcGFyYW1zLnRhcmdldFN0eWxlLmluZGV4T2Yoc3R5bGVzW2tleV0pICE9PSAtMSB8fCB0YXJnZXRTdHlsZXNNYXRjaChwYXJhbXMudGFyZ2V0U3R5bGVzLCBzdHlsZXNba2V5XSkpIHtcbiAgICAgIGlmIChzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZXNba2V5XSkpIGVsZW1lbnRTdHlsZSArPSBzdHlsZXNba2V5XSArICc6JyArIHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlc1trZXldKSArICc7JztcbiAgICB9XG4gIH0gLy8gUHJpbnQgZnJpZW5kbHkgZGVmYXVsdHMgKGRlcHJlY2F0ZWQpXG5cblxuICBlbGVtZW50U3R5bGUgKz0gJ21heC13aWR0aDogJyArIHBhcmFtcy5tYXhXaWR0aCArICdweCAhaW1wb3J0YW50OyBmb250LXNpemU6ICcgKyBwYXJhbXMuZm9udF9zaXplICsgJyAhaW1wb3J0YW50Oyc7XG4gIHJldHVybiBlbGVtZW50U3R5bGU7XG59XG5cbmZ1bmN0aW9uIHRhcmdldFN0eWxlc01hdGNoKHN0eWxlcywgdmFsdWUpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoX3R5cGVvZih2YWx1ZSkgPT09ICdvYmplY3QnICYmIHZhbHVlLmluZGV4T2Yoc3R5bGVzW2ldKSAhPT0gLTEpIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhZGRIZWFkZXIocHJpbnRFbGVtZW50LCBwYXJhbXMpIHtcbiAgLy8gQ3JlYXRlIHRoZSBoZWFkZXIgY29udGFpbmVyIGRpdlxuICB2YXIgaGVhZGVyQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IC8vIENoZWNrIGlmIHRoZSBoZWFkZXIgaXMgdGV4dCBvciByYXcgaHRtbFxuXG4gIGlmIChpc1Jhd0hUTUwocGFyYW1zLmhlYWRlcikpIHtcbiAgICBoZWFkZXJDb250YWluZXIuaW5uZXJIVE1MID0gcGFyYW1zLmhlYWRlcjtcbiAgfSBlbHNlIHtcbiAgICAvLyBDcmVhdGUgaGVhZGVyIGVsZW1lbnRcbiAgICB2YXIgaGVhZGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gxJyk7IC8vIENyZWF0ZSBoZWFkZXIgdGV4dCBub2RlXG5cbiAgICB2YXIgaGVhZGVyTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhcmFtcy5oZWFkZXIpOyAvLyBCdWlsZCBhbmQgc3R5bGVcblxuICAgIGhlYWRlckVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGVyTm9kZSk7XG4gICAgaGVhZGVyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgcGFyYW1zLmhlYWRlclN0eWxlKTtcbiAgICBoZWFkZXJDb250YWluZXIuYXBwZW5kQ2hpbGQoaGVhZGVyRWxlbWVudCk7XG4gIH1cblxuICBwcmludEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGhlYWRlckNvbnRhaW5lciwgcHJpbnRFbGVtZW50LmNoaWxkTm9kZXNbMF0pO1xufVxuZnVuY3Rpb24gY2xlYW5VcChwYXJhbXMpIHtcbiAgLy8gSWYgd2UgYXJlIHNob3dpbmcgYSBmZWVkYmFjayBtZXNzYWdlIHRvIHVzZXIsIHJlbW92ZSBpdFxuICBpZiAocGFyYW1zLnNob3dNb2RhbCkgX21vZGFsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLmNsb3NlKCk7IC8vIENoZWNrIGZvciBhIGZpbmlzaGVkIGxvYWRpbmcgaG9vayBmdW5jdGlvblxuXG4gIGlmIChwYXJhbXMub25Mb2FkaW5nRW5kKSBwYXJhbXMub25Mb2FkaW5nRW5kKCk7IC8vIElmIHByZWxvYWRpbmcgcGRmIGZpbGVzLCBjbGVhbiBibG9iIHVybFxuXG4gIGlmIChwYXJhbXMuc2hvd01vZGFsIHx8IHBhcmFtcy5vbkxvYWRpbmdTdGFydCkgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwocGFyYW1zLnByaW50YWJsZSk7IC8vIFJ1biBvblByaW50RGlhbG9nQ2xvc2UgY2FsbGJhY2tcblxuICB2YXIgZXZlbnQgPSAnbW91c2VvdmVyJztcblxuICBpZiAoX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uaXNDaHJvbWUoKSB8fCBfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5pc0ZpcmVmb3goKSkge1xuICAgIC8vIFBzLjogRmlyZWZveCB3aWxsIHJlcXVpcmUgYW4gZXh0cmEgY2xpY2sgaW4gdGhlIGRvY3VtZW50IHRvIGZpcmUgdGhlIGZvY3VzIGV2ZW50LlxuICAgIGV2ZW50ID0gJ2ZvY3VzJztcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAgICAvLyBNYWtlIHN1cmUgdGhlIGV2ZW50IG9ubHkgaGFwcGVucyBvbmNlLlxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICBwYXJhbXMub25QcmludERpYWxvZ0Nsb3NlKCk7IC8vIFJlbW92ZSBpZnJhbWUgZnJvbSB0aGUgRE9NXG5cbiAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1zLmZyYW1lSWQpO1xuXG4gICAgaWYgKGlmcmFtZSkge1xuICAgICAgaWZyYW1lLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG59XG5mdW5jdGlvbiBpc1Jhd0hUTUwocmF3KSB7XG4gIHZhciByZWdleEh0bWwgPSBuZXcgUmVnRXhwKCc8KFtBLVphLXpdW0EtWmEtejAtOV0qKVxcXFxiW14+XSo+KC4qPyk8L1xcXFwxPicpO1xuICByZXR1cm4gcmVnZXhIdG1sLnRlc3QocmF3KTtcbn1cblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvaHRtbC5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL2h0bWwuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZnVuY3Rpb25zICovIFwiLi9zcmMvanMvZnVuY3Rpb25zLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9wcmludCAqLyBcIi4vc3JjL2pzL3ByaW50LmpzXCIpO1xuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9ICh7XG4gIHByaW50OiBmdW5jdGlvbiBwcmludChwYXJhbXMsIHByaW50RnJhbWUpIHtcbiAgICAvLyBHZXQgdGhlIERPTSBwcmludGFibGUgZWxlbWVudFxuICAgIHZhciBwcmludEVsZW1lbnQgPSBpc0h0bWxFbGVtZW50KHBhcmFtcy5wcmludGFibGUpID8gcGFyYW1zLnByaW50YWJsZSA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtcy5wcmludGFibGUpOyAvLyBDaGVjayBpZiB0aGUgZWxlbWVudCBleGlzdHNcblxuICAgIGlmICghcHJpbnRFbGVtZW50KSB7XG4gICAgICB3aW5kb3cuY29uc29sZS5lcnJvcignSW52YWxpZCBIVE1MIGVsZW1lbnQgaWQ6ICcgKyBwYXJhbXMucHJpbnRhYmxlKTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIENsb25lIHRoZSB0YXJnZXQgZWxlbWVudCBpbmNsdWRpbmcgaXRzIGNoaWxkcmVuIChpZiBhdmFpbGFibGUpXG5cblxuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50ID0gY2xvbmVFbGVtZW50KHByaW50RWxlbWVudCwgcGFyYW1zKTsgLy8gQWRkIGhlYWRlclxuXG4gICAgaWYgKHBhcmFtcy5oZWFkZXIpIHtcbiAgICAgIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJhZGRIZWFkZXJcIl0pKHBhcmFtcy5wcmludGFibGVFbGVtZW50LCBwYXJhbXMpO1xuICAgIH0gLy8gUHJpbnQgaHRtbCBlbGVtZW50IGNvbnRlbnRzXG5cblxuICAgIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiZGVmYXVsdFwiXS5zZW5kKHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgcGFyYW1zKSB7XG4gIC8vIENsb25lIHRoZSBtYWluIG5vZGUgKGlmIG5vdCBhbHJlYWR5IGluc2lkZSB0aGUgcmVjdXJzaW9uIHByb2Nlc3MpXG4gIHZhciBjbG9uZSA9IGVsZW1lbnQuY2xvbmVOb2RlKCk7IC8vIExvb3Agb3ZlciBhbmQgcHJvY2VzcyB0aGUgY2hpbGRyZW4gZWxlbWVudHMgLyBub2RlcyAoaW5jbHVkaW5nIHRleHQgbm9kZXMpXG5cbiAgdmFyIGNoaWxkTm9kZXNBcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGVsZW1lbnQuY2hpbGROb2Rlcyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZE5vZGVzQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhcmUgc2tpcHBpbmcgdGhlIGN1cnJlbnQgZWxlbWVudFxuICAgIGlmIChwYXJhbXMuaWdub3JlRWxlbWVudHMuaW5kZXhPZihjaGlsZE5vZGVzQXJyYXlbaV0uaWQpICE9PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfSAvLyBDbG9uZSB0aGUgY2hpbGQgZWxlbWVudFxuXG5cbiAgICB2YXIgY2xvbmVkQ2hpbGQgPSBjbG9uZUVsZW1lbnQoY2hpbGROb2Rlc0FycmF5W2ldLCBwYXJhbXMpOyAvLyBBdHRhY2ggdGhlIGNsb25lZCBjaGlsZCB0byB0aGUgY2xvbmVkIHBhcmVudCBub2RlXG5cbiAgICBjbG9uZS5hcHBlbmRDaGlsZChjbG9uZWRDaGlsZCk7XG4gIH0gLy8gR2V0IGFsbCBzdHlsaW5nIGZvciBwcmludCBlbGVtZW50IChmb3Igbm9kZXMgb2YgdHlwZSBlbGVtZW50IG9ubHkpXG5cblxuICBpZiAocGFyYW1zLnNjYW5TdHlsZXMgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgIGNsb25lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiY29sbGVjdFN0eWxlc1wiXSkoZWxlbWVudCwgcGFyYW1zKSk7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlIGVsZW1lbnQgbmVlZHMgYW55IHN0YXRlIHByb2Nlc3NpbmcgKGNvcHkgdXNlciBpbnB1dCBkYXRhKVxuXG5cbiAgc3dpdGNoIChlbGVtZW50LnRhZ05hbWUpIHtcbiAgICBjYXNlICdTRUxFQ1QnOlxuICAgICAgLy8gQ29weSB0aGUgY3VycmVudCBzZWxlY3Rpb24gdmFsdWUgdG8gaXRzIGNsb25lXG4gICAgICBjbG9uZS52YWx1ZSA9IGVsZW1lbnQudmFsdWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ0NBTlZBUyc6XG4gICAgICAvLyBDb3B5IHRoZSBjYW52YXMgY29udGVudCB0byBpdHMgY2xvbmVcbiAgICAgIGNsb25lLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKGVsZW1lbnQsIDAsIDApO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gY2xvbmU7XG59XG5cbmZ1bmN0aW9uIGlzSHRtbEVsZW1lbnQocHJpbnRhYmxlKSB7XG4gIC8vIENoZWNrIGlmIGVsZW1lbnQgaXMgaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQgb3IgaGFzIG5vZGVUeXBlID09PSAxIChmb3IgZWxlbWVudHMgaW4gaWZyYW1lKVxuICByZXR1cm4gX3R5cGVvZihwcmludGFibGUpID09PSAnb2JqZWN0JyAmJiBwcmludGFibGUgJiYgKHByaW50YWJsZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IHByaW50YWJsZS5ub2RlVHlwZSA9PT0gMSk7XG59XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL2ltYWdlLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL2ltYWdlLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9mdW5jdGlvbnMgKi8gXCIuL3NyYy9qcy9mdW5jdGlvbnMuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3ByaW50ICovIFwiLi9zcmMvanMvcHJpbnQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYnJvd3NlciAqLyBcIi4vc3JjL2pzL2Jyb3dzZXIuanNcIik7XG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHtcbiAgcHJpbnQ6IGZ1bmN0aW9uIHByaW50KHBhcmFtcywgcHJpbnRGcmFtZSkge1xuICAgIC8vIENoZWNrIGlmIHdlIGFyZSBwcmludGluZyBvbmUgaW1hZ2Ugb3IgbXVsdGlwbGUgaW1hZ2VzXG4gICAgaWYgKHBhcmFtcy5wcmludGFibGUuY29uc3RydWN0b3IgIT09IEFycmF5KSB7XG4gICAgICAvLyBDcmVhdGUgYXJyYXkgd2l0aCBvbmUgaW1hZ2VcbiAgICAgIHBhcmFtcy5wcmludGFibGUgPSBbcGFyYW1zLnByaW50YWJsZV07XG4gICAgfSAvLyBDcmVhdGUgcHJpbnRhYmxlIGVsZW1lbnQgKGNvbnRhaW5lcilcblxuXG4gICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgLy8gQ3JlYXRlIGFsbCBpbWFnZSBlbGVtZW50cyBhbmQgYXBwZW5kIHRoZW0gdG8gdGhlIHByaW50YWJsZSBjb250YWluZXJcblxuICAgIHBhcmFtcy5wcmludGFibGUuZm9yRWFjaChmdW5jdGlvbiAoc3JjKSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgIGltZy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgcGFyYW1zLmltYWdlU3R5bGUpOyAvLyBTZXQgaW1hZ2Ugc3JjIHdpdGggdGhlIGZpbGUgdXJsXG5cbiAgICAgIGltZy5zcmMgPSBzcmM7IC8vIFRoZSBmb2xsb3dpbmcgYmxvY2sgaXMgZm9yIEZpcmVmb3gsIHdoaWNoIGZvciBzb21lIHJlYXNvbiByZXF1aXJlcyB0aGUgaW1hZ2UncyBzcmMgdG8gYmUgZnVsbHkgcXVhbGlmaWVkIGluXG4gICAgICAvLyBvcmRlciB0byBwcmludCBpdFxuXG4gICAgICBpZiAoX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX1tcImRlZmF1bHRcIl0uaXNGaXJlZm94KCkpIHtcbiAgICAgICAgdmFyIGZ1bGx5UXVhbGlmaWVkU3JjID0gaW1nLnNyYztcbiAgICAgICAgaW1nLnNyYyA9IGZ1bGx5UXVhbGlmaWVkU3JjO1xuICAgICAgfSAvLyBDcmVhdGUgdGhlIGltYWdlIHdyYXBwZXJcblxuXG4gICAgICB2YXIgaW1hZ2VXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IC8vIEFwcGVuZCBpbWFnZSB0byB0aGUgd3JhcHBlciBlbGVtZW50XG5cbiAgICAgIGltYWdlV3JhcHBlci5hcHBlbmRDaGlsZChpbWcpOyAvLyBBcHBlbmQgd3JhcHBlciB0byB0aGUgcHJpbnRhYmxlIGVsZW1lbnRcblxuICAgICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoaW1hZ2VXcmFwcGVyKTtcbiAgICB9KTsgLy8gQ2hlY2sgaWYgd2UgYXJlIGFkZGluZyBhIHByaW50IGhlYWRlclxuXG4gICAgaWYgKHBhcmFtcy5oZWFkZXIpIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJhZGRIZWFkZXJcIl0pKHBhcmFtcy5wcmludGFibGVFbGVtZW50LCBwYXJhbXMpOyAvLyBQcmludCBpbWFnZVxuXG4gICAgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLnNlbmQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgfVxufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL2luaXQuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9pbml0LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9icm93c2VyICovIFwiLi9zcmMvanMvYnJvd3Nlci5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfbW9kYWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vbW9kYWwgKi8gXCIuL3NyYy9qcy9tb2RhbC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfcGRmX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3BkZiAqLyBcIi4vc3JjL2pzL3BkZi5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfaHRtbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9odG1sICovIFwiLi9zcmMvanMvaHRtbC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfcmF3X2h0bWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcmF3LWh0bWwgKi8gXCIuL3NyYy9qcy9yYXctaHRtbC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfaW1hZ2VfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vaW1hZ2UgKi8gXCIuL3NyYy9qcy9pbWFnZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfanNvbl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9qc29uICovIFwiLi9zcmMvanMvanNvbi5qc1wiKTtcblxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblxuXG5cblxuXG5cblxudmFyIHByaW50VHlwZXMgPSBbJ3BkZicsICdodG1sJywgJ2ltYWdlJywgJ2pzb24nLCAncmF3LWh0bWwnXTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoe1xuICBpbml0OiBmdW5jdGlvbiBpbml0KCkge1xuICAgIHZhciBwYXJhbXMgPSB7XG4gICAgICBwcmludGFibGU6IG51bGwsXG4gICAgICBmYWxsYmFja1ByaW50YWJsZTogbnVsbCxcbiAgICAgIHR5cGU6ICdwZGYnLFxuICAgICAgaGVhZGVyOiBudWxsLFxuICAgICAgaGVhZGVyU3R5bGU6ICdmb250LXdlaWdodDogMzAwOycsXG4gICAgICBtYXhXaWR0aDogODAwLFxuICAgICAgcHJvcGVydGllczogbnVsbCxcbiAgICAgIGdyaWRIZWFkZXJTdHlsZTogJ2ZvbnQtd2VpZ2h0OiBib2xkOyBwYWRkaW5nOiA1cHg7IGJvcmRlcjogMXB4IHNvbGlkICNkZGRkZGQ7JyxcbiAgICAgIGdyaWRTdHlsZTogJ2JvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTsgbWFyZ2luLWJvdHRvbTogLTFweDsnLFxuICAgICAgc2hvd01vZGFsOiBmYWxzZSxcbiAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9LFxuICAgICAgb25Mb2FkaW5nU3RhcnQ6IG51bGwsXG4gICAgICBvbkxvYWRpbmdFbmQ6IG51bGwsXG4gICAgICBvblByaW50RGlhbG9nQ2xvc2U6IGZ1bmN0aW9uIG9uUHJpbnREaWFsb2dDbG9zZSgpIHt9LFxuICAgICAgb25JbmNvbXBhdGlibGVCcm93c2VyOiBmdW5jdGlvbiBvbkluY29tcGF0aWJsZUJyb3dzZXIoKSB7fSxcbiAgICAgIG1vZGFsTWVzc2FnZTogJ1JldHJpZXZpbmcgRG9jdW1lbnQuLi4nLFxuICAgICAgZnJhbWVJZDogJ3ByaW50SlMnLFxuICAgICAgcHJpbnRhYmxlRWxlbWVudDogbnVsbCxcbiAgICAgIGRvY3VtZW50VGl0bGU6ICdEb2N1bWVudCcsXG4gICAgICB0YXJnZXRTdHlsZTogWydjbGVhcicsICdkaXNwbGF5JywgJ3dpZHRoJywgJ21pbi13aWR0aCcsICdoZWlnaHQnLCAnbWluLWhlaWdodCcsICdtYXgtaGVpZ2h0J10sXG4gICAgICB0YXJnZXRTdHlsZXM6IFsnYm9yZGVyJywgJ2JveCcsICdicmVhaycsICd0ZXh0LWRlY29yYXRpb24nXSxcbiAgICAgIGlnbm9yZUVsZW1lbnRzOiBbXSxcbiAgICAgIHJlcGVhdFRhYmxlSGVhZGVyOiB0cnVlLFxuICAgICAgY3NzOiBudWxsLFxuICAgICAgc3R5bGU6IG51bGwsXG4gICAgICBzY2FuU3R5bGVzOiB0cnVlLFxuICAgICAgYmFzZTY0OiBmYWxzZSxcbiAgICAgIC8vIERlcHJlY2F0ZWRcbiAgICAgIG9uUGRmT3BlbjogbnVsbCxcbiAgICAgIGZvbnQ6ICdUaW1lc05ld1JvbWFuJyxcbiAgICAgIGZvbnRfc2l6ZTogJzEycHQnLFxuICAgICAgaG9ub3JNYXJnaW5QYWRkaW5nOiB0cnVlLFxuICAgICAgaG9ub3JDb2xvcjogZmFsc2UsXG4gICAgICBpbWFnZVN0eWxlOiAnbWF4LXdpZHRoOiAxMDAlOydcbiAgICB9OyAvLyBDaGVjayBpZiBhIHByaW50YWJsZSBkb2N1bWVudCBvciBvYmplY3Qgd2FzIHN1cHBsaWVkXG5cbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50c1swXTtcblxuICAgIGlmIChhcmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJpbnRKUyBleHBlY3RzIGF0IGxlYXN0IDEgYXR0cmlidXRlLicpO1xuICAgIH0gLy8gUHJvY2VzcyBwYXJhbWV0ZXJzXG5cblxuICAgIHN3aXRjaCAoX3R5cGVvZihhcmdzKSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgcGFyYW1zLnByaW50YWJsZSA9IGVuY29kZVVSSShhcmdzKTtcbiAgICAgICAgcGFyYW1zLmZhbGxiYWNrUHJpbnRhYmxlID0gcGFyYW1zLnByaW50YWJsZTtcbiAgICAgICAgcGFyYW1zLnR5cGUgPSBhcmd1bWVudHNbMV0gfHwgcGFyYW1zLnR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBwYXJhbXMucHJpbnRhYmxlID0gYXJncy5wcmludGFibGU7XG4gICAgICAgIHBhcmFtcy5mYWxsYmFja1ByaW50YWJsZSA9IHR5cGVvZiBhcmdzLmZhbGxiYWNrUHJpbnRhYmxlICE9PSAndW5kZWZpbmVkJyA/IGFyZ3MuZmFsbGJhY2tQcmludGFibGUgOiBwYXJhbXMucHJpbnRhYmxlO1xuICAgICAgICBwYXJhbXMuZmFsbGJhY2tQcmludGFibGUgPSBwYXJhbXMuYmFzZTY0ID8gXCJkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQsXCIuY29uY2F0KHBhcmFtcy5mYWxsYmFja1ByaW50YWJsZSkgOiBwYXJhbXMuZmFsbGJhY2tQcmludGFibGU7XG5cbiAgICAgICAgZm9yICh2YXIgayBpbiBwYXJhbXMpIHtcbiAgICAgICAgICBpZiAoayA9PT0gJ3ByaW50YWJsZScgfHwgayA9PT0gJ2ZhbGxiYWNrUHJpbnRhYmxlJykgY29udGludWU7XG4gICAgICAgICAgcGFyYW1zW2tdID0gdHlwZW9mIGFyZ3Nba10gIT09ICd1bmRlZmluZWQnID8gYXJnc1trXSA6IHBhcmFtc1trXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgYXJndW1lbnQgdHlwZSEgRXhwZWN0ZWQgXCJzdHJpbmdcIiBvciBcIm9iamVjdFwiLCBnb3QgJyArIF90eXBlb2YoYXJncykpO1xuICAgIH0gLy8gVmFsaWRhdGUgcHJpbnRhYmxlXG5cblxuICAgIGlmICghcGFyYW1zLnByaW50YWJsZSkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHByaW50YWJsZSBpbmZvcm1hdGlvbi4nKTsgLy8gVmFsaWRhdGUgdHlwZVxuXG4gICAgaWYgKCFwYXJhbXMudHlwZSB8fCB0eXBlb2YgcGFyYW1zLnR5cGUgIT09ICdzdHJpbmcnIHx8IHByaW50VHlwZXMuaW5kZXhPZihwYXJhbXMudHlwZS50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwcmludCB0eXBlLiBBdmFpbGFibGUgdHlwZXMgYXJlOiBwZGYsIGh0bWwsIGltYWdlIGFuZCBqc29uLicpO1xuICAgIH0gLy8gQ2hlY2sgaWYgd2UgYXJlIHNob3dpbmcgYSBmZWVkYmFjayBtZXNzYWdlIHRvIHRoZSB1c2VyICh1c2VmdWwgZm9yIGxhcmdlIGZpbGVzKVxuXG5cbiAgICBpZiAocGFyYW1zLnNob3dNb2RhbCkgX21vZGFsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLnNob3cocGFyYW1zKTsgLy8gQ2hlY2sgZm9yIGEgcHJpbnQgc3RhcnQgaG9vayBmdW5jdGlvblxuXG4gICAgaWYgKHBhcmFtcy5vbkxvYWRpbmdTdGFydCkgcGFyYW1zLm9uTG9hZGluZ1N0YXJ0KCk7IC8vIFRvIHByZXZlbnQgZHVwbGljYXRpb24gYW5kIGlzc3VlcywgcmVtb3ZlIGFueSB1c2VkIHByaW50RnJhbWUgZnJvbSB0aGUgRE9NXG5cbiAgICB2YXIgdXNlZEZyYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1zLmZyYW1lSWQpO1xuICAgIGlmICh1c2VkRnJhbWUpIHVzZWRGcmFtZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHVzZWRGcmFtZSk7IC8vIENyZWF0ZSBhIG5ldyBpZnJhbWUgZm9yIHRoZSBwcmludCBqb2JcblxuICAgIHZhciBwcmludEZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgICBpZiAoX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uaXNGaXJlZm94KCkpIHtcbiAgICAgIC8vIFNldCB0aGUgaWZyYW1lIHRvIGJlIGlzIHZpc2libGUgb24gdGhlIHBhZ2UgKGd1YXJhbnRlZWQgYnkgZml4ZWQgcG9zaXRpb24pIGJ1dCBoaWRkZW4gdXNpbmcgb3BhY2l0eSAwLCBiZWNhdXNlXG4gICAgICAvLyB0aGlzIHdvcmtzIGluIEZpcmVmb3guIFRoZSBoZWlnaHQgbmVlZHMgdG8gYmUgc3VmZmljaWVudCBmb3Igc29tZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBvdGhlciB0aGFuIHRoZSBQREZcbiAgICAgIC8vIHZpZXdlcidzIHRvb2xiYXIgdG8gYmUgdmlzaWJsZSBpbiB0aGUgcGFnZVxuICAgICAgcHJpbnRGcmFtZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOiAxcHg7IGhlaWdodDogMTAwcHg7IHBvc2l0aW9uOiBmaXhlZDsgbGVmdDogMDsgdG9wOiAwOyBvcGFjaXR5OiAwOyBib3JkZXItd2lkdGg6IDA7IG1hcmdpbjogMDsgcGFkZGluZzogMCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIaWRlIHRoZSBpZnJhbWUgaW4gb3RoZXIgYnJvd3NlcnNcbiAgICAgIHByaW50RnJhbWUuc2V0QXR0cmlidXRlKCdzdHlsZScsICd2aXNpYmlsaXR5OiBoaWRkZW47IGhlaWdodDogMDsgd2lkdGg6IDA7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgYm9yZGVyOiAwJyk7XG4gICAgfSAvLyBTZXQgaWZyYW1lIGVsZW1lbnQgaWRcblxuXG4gICAgcHJpbnRGcmFtZS5zZXRBdHRyaWJ1dGUoJ2lkJywgcGFyYW1zLmZyYW1lSWQpOyAvLyBGb3Igbm9uIHBkZiBwcmludGluZywgcGFzcyBhbiBodG1sIGRvY3VtZW50IHN0cmluZyB0byBzcmNkb2MgKGZvcmNlIG9ubG9hZCBjYWxsYmFjaylcblxuICAgIGlmIChwYXJhbXMudHlwZSAhPT0gJ3BkZicpIHtcbiAgICAgIHByaW50RnJhbWUuc3JjZG9jID0gJzxodG1sPjxoZWFkPjx0aXRsZT4nICsgcGFyYW1zLmRvY3VtZW50VGl0bGUgKyAnPC90aXRsZT4nOyAvLyBBdHRhY2ggY3NzIGZpbGVzXG5cbiAgICAgIGlmIChwYXJhbXMuY3NzKSB7XG4gICAgICAgIC8vIEFkZCBzdXBwb3J0IGZvciBzaW5nbGUgZmlsZVxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLmNzcykpIHBhcmFtcy5jc3MgPSBbcGFyYW1zLmNzc107IC8vIENyZWF0ZSBsaW5rIHRhZ3MgZm9yIGVhY2ggY3NzIGZpbGVcblxuICAgICAgICBwYXJhbXMuY3NzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICBwcmludEZyYW1lLnNyY2RvYyArPSAnPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCInICsgZmlsZSArICdcIj4nO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRGcmFtZS5zcmNkb2MgKz0gJzwvaGVhZD48Ym9keT48L2JvZHk+PC9odG1sPic7XG4gICAgfSAvLyBDaGVjayBwcmludGFibGUgdHlwZVxuXG5cbiAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG4gICAgICBjYXNlICdwZGYnOlxuICAgICAgICAvLyBDaGVjayBicm93c2VyIHN1cHBvcnQgZm9yIHBkZiBhbmQgaWYgbm90IHN1cHBvcnRlZCB3ZSB3aWxsIGp1c3Qgb3BlbiB0aGUgcGRmIGZpbGUgaW5zdGVhZFxuICAgICAgICBpZiAoX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uaXNJRSgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnUHJpbnQuanMgZG9lc25cXCd0IHN1cHBvcnQgUERGIHByaW50aW5nIGluIEludGVybmV0IEV4cGxvcmVyLicpO1xuICAgICAgICAgICAgdmFyIHdpbiA9IHdpbmRvdy5vcGVuKHBhcmFtcy5mYWxsYmFja1ByaW50YWJsZSwgJ19ibGFuaycpO1xuICAgICAgICAgICAgd2luLmZvY3VzKCk7XG4gICAgICAgICAgICBwYXJhbXMub25JbmNvbXBhdGlibGVCcm93c2VyKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHBhcmFtcy5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIG5vIGxvYWRpbmcgbW9kYWwgb3BlbmVkXG4gICAgICAgICAgICBpZiAocGFyYW1zLnNob3dNb2RhbCkgX21vZGFsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJkZWZhdWx0XCJdLmNsb3NlKCk7XG4gICAgICAgICAgICBpZiAocGFyYW1zLm9uTG9hZGluZ0VuZCkgcGFyYW1zLm9uTG9hZGluZ0VuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfcGRmX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19bXCJkZWZhdWx0XCJdLnByaW50KHBhcmFtcywgcHJpbnRGcmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgICBfaW1hZ2VfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfX1tcImRlZmF1bHRcIl0ucHJpbnQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICBfaHRtbF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fW1wiZGVmYXVsdFwiXS5wcmludChwYXJhbXMsIHByaW50RnJhbWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmF3LWh0bWwnOlxuICAgICAgICBfcmF3X2h0bWxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX1tcImRlZmF1bHRcIl0ucHJpbnQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICBfanNvbl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9fW1wiZGVmYXVsdFwiXS5wcmludChwYXJhbXMsIHByaW50RnJhbWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn0pO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9qc29uLmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvanNvbi5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9mdW5jdGlvbnMgKi8gXCIuL3NyYy9qcy9mdW5jdGlvbnMuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3ByaW50ICovIFwiLi9zcmMvanMvcHJpbnQuanNcIik7XG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHtcbiAgcHJpbnQ6IGZ1bmN0aW9uIHByaW50KHBhcmFtcywgcHJpbnRGcmFtZSkge1xuICAgIC8vIENoZWNrIGlmIHdlIHJlY2VpdmVkIHByb3BlciBkYXRhXG4gICAgaWYgKF90eXBlb2YocGFyYW1zLnByaW50YWJsZSkgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgamF2YXNjcmlwdCBkYXRhIG9iamVjdCAoSlNPTikuJyk7XG4gICAgfSAvLyBWYWxpZGF0ZSByZXBlYXRUYWJsZUhlYWRlclxuXG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5yZXBlYXRUYWJsZUhlYWRlciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHJlcGVhdFRhYmxlSGVhZGVyIGF0dHJpYnV0ZSAoSlNPTikuJyk7XG4gICAgfSAvLyBWYWxpZGF0ZSBwcm9wZXJ0aWVzXG5cblxuICAgIGlmICghcGFyYW1zLnByb3BlcnRpZXMgfHwgIUFycmF5LmlzQXJyYXkocGFyYW1zLnByb3BlcnRpZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHJvcGVydGllcyBhcnJheSBmb3IgeW91ciBKU09OIGRhdGEuJyk7XG4gICAgfSAvLyBXZSB3aWxsIGZvcm1hdCB0aGUgcHJvcGVydHkgb2JqZWN0cyB0byBrZWVwIHRoZSBKU09OIGFwaSBjb21wYXRpYmxlIHdpdGggb2xkZXIgcmVsZWFzZXNcblxuXG4gICAgcGFyYW1zLnByb3BlcnRpZXMgPSBwYXJhbXMucHJvcGVydGllcy5tYXAoZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWVsZDogX3R5cGVvZihwcm9wZXJ0eSkgPT09ICdvYmplY3QnID8gcHJvcGVydHkuZmllbGQgOiBwcm9wZXJ0eSxcbiAgICAgICAgZGlzcGxheU5hbWU6IF90eXBlb2YocHJvcGVydHkpID09PSAnb2JqZWN0JyA/IHByb3BlcnR5LmRpc3BsYXlOYW1lIDogcHJvcGVydHksXG4gICAgICAgIGNvbHVtblNpemU6IF90eXBlb2YocHJvcGVydHkpID09PSAnb2JqZWN0JyAmJiBwcm9wZXJ0eS5jb2x1bW5TaXplID8gcHJvcGVydHkuY29sdW1uU2l6ZSArICc7JyA6IDEwMCAvIHBhcmFtcy5wcm9wZXJ0aWVzLmxlbmd0aCArICclOydcbiAgICAgIH07XG4gICAgfSk7IC8vIENyZWF0ZSBhIHByaW50IGNvbnRhaW5lciBlbGVtZW50XG5cbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBDaGVjayBpZiB3ZSBhcmUgYWRkaW5nIGEgcHJpbnQgaGVhZGVyXG5cbiAgICBpZiAocGFyYW1zLmhlYWRlcikge1xuICAgICAgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImFkZEhlYWRlclwiXSkocGFyYW1zLnByaW50YWJsZUVsZW1lbnQsIHBhcmFtcyk7XG4gICAgfSAvLyBCdWlsZCB0aGUgcHJpbnRhYmxlIGh0bWwgZGF0YVxuXG5cbiAgICBwYXJhbXMucHJpbnRhYmxlRWxlbWVudC5pbm5lckhUTUwgKz0ganNvblRvSFRNTChwYXJhbXMpOyAvLyBQcmludCB0aGUganNvbiBkYXRhXG5cbiAgICBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImRlZmF1bHRcIl0uc2VuZChwYXJhbXMsIHByaW50RnJhbWUpO1xuICB9XG59KTtcblxuZnVuY3Rpb24ganNvblRvSFRNTChwYXJhbXMpIHtcbiAgLy8gR2V0IHRoZSByb3cgYW5kIGNvbHVtbiBkYXRhXG4gIHZhciBkYXRhID0gcGFyYW1zLnByaW50YWJsZTtcbiAgdmFyIHByb3BlcnRpZXMgPSBwYXJhbXMucHJvcGVydGllczsgLy8gQ3JlYXRlIGEgaHRtbCB0YWJsZVxuXG4gIHZhciBodG1sRGF0YSA9ICc8dGFibGUgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogMTAwJTtcIj4nOyAvLyBDaGVjayBpZiB0aGUgaGVhZGVyIHNob3VsZCBiZSByZXBlYXRlZFxuXG4gIGlmIChwYXJhbXMucmVwZWF0VGFibGVIZWFkZXIpIHtcbiAgICBodG1sRGF0YSArPSAnPHRoZWFkPic7XG4gIH0gLy8gQWRkIHRoZSB0YWJsZSBoZWFkZXIgcm93XG5cblxuICBodG1sRGF0YSArPSAnPHRyPic7IC8vIEFkZCB0aGUgdGFibGUgaGVhZGVyIGNvbHVtbnNcblxuICBmb3IgKHZhciBhID0gMDsgYSA8IHByb3BlcnRpZXMubGVuZ3RoOyBhKyspIHtcbiAgICBodG1sRGF0YSArPSAnPHRoIHN0eWxlPVwid2lkdGg6JyArIHByb3BlcnRpZXNbYV0uY29sdW1uU2l6ZSArICc7JyArIHBhcmFtcy5ncmlkSGVhZGVyU3R5bGUgKyAnXCI+JyArIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJjYXBpdGFsaXplUHJpbnRcIl0pKHByb3BlcnRpZXNbYV0uZGlzcGxheU5hbWUpICsgJzwvdGg+JztcbiAgfSAvLyBBZGQgdGhlIGNsb3NpbmcgdGFnIGZvciB0aGUgdGFibGUgaGVhZGVyIHJvd1xuXG5cbiAgaHRtbERhdGEgKz0gJzwvdHI+JzsgLy8gSWYgdGhlIHRhYmxlIGhlYWRlciBpcyBtYXJrZWQgYXMgcmVwZWF0ZWQsIGFkZCB0aGUgY2xvc2luZyB0YWdcblxuICBpZiAocGFyYW1zLnJlcGVhdFRhYmxlSGVhZGVyKSB7XG4gICAgaHRtbERhdGEgKz0gJzwvdGhlYWQ+JztcbiAgfSAvLyBDcmVhdGUgdGhlIHRhYmxlIGJvZHlcblxuXG4gIGh0bWxEYXRhICs9ICc8dGJvZHk+JzsgLy8gQWRkIHRoZSB0YWJsZSBkYXRhIHJvd3NcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBBZGQgdGhlIHJvdyBzdGFydGluZyB0YWdcbiAgICBodG1sRGF0YSArPSAnPHRyPic7IC8vIFByaW50IHNlbGVjdGVkIHByb3BlcnRpZXMgb25seVxuXG4gICAgZm9yICh2YXIgbiA9IDA7IG4gPCBwcm9wZXJ0aWVzLmxlbmd0aDsgbisrKSB7XG4gICAgICB2YXIgc3RyaW5nRGF0YSA9IGRhdGFbaV07IC8vIFN1cHBvcnQgbmVzdGVkIG9iamVjdHNcblxuICAgICAgdmFyIHByb3BlcnR5ID0gcHJvcGVydGllc1tuXS5maWVsZC5zcGxpdCgnLicpO1xuXG4gICAgICBpZiAocHJvcGVydHkubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBwID0gMDsgcCA8IHByb3BlcnR5Lmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgc3RyaW5nRGF0YSA9IHN0cmluZ0RhdGFbcHJvcGVydHlbcF1dO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHJpbmdEYXRhID0gc3RyaW5nRGF0YVtwcm9wZXJ0aWVzW25dLmZpZWxkXTtcbiAgICAgIH0gLy8gQWRkIHRoZSByb3cgY29udGVudHMgYW5kIHN0eWxlc1xuXG5cbiAgICAgIGh0bWxEYXRhICs9ICc8dGQgc3R5bGU9XCJ3aWR0aDonICsgcHJvcGVydGllc1tuXS5jb2x1bW5TaXplICsgcGFyYW1zLmdyaWRTdHlsZSArICdcIj4nICsgc3RyaW5nRGF0YSArICc8L3RkPic7XG4gICAgfSAvLyBBZGQgdGhlIHJvdyBjbG9zaW5nIHRhZ1xuXG5cbiAgICBodG1sRGF0YSArPSAnPC90cj4nO1xuICB9IC8vIEFkZCB0aGUgdGFibGUgYW5kIGJvZHkgY2xvc2luZyB0YWdzXG5cblxuICBodG1sRGF0YSArPSAnPC90Ym9keT48L3RhYmxlPic7XG4gIHJldHVybiBodG1sRGF0YTtcbn1cblxuLyoqKi8gfSksXG5cbi8qKiovIFwiLi9zcmMvanMvbW9kYWwuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvanMvbW9kYWwuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbnZhciBNb2RhbCA9IHtcbiAgc2hvdzogZnVuY3Rpb24gc2hvdyhwYXJhbXMpIHtcbiAgICAvLyBCdWlsZCBtb2RhbFxuICAgIHZhciBtb2RhbFN0eWxlID0gJ2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7ICcgKyAnZGlzcGxheTp0YWJsZTsgJyArICd0ZXh0LWFsaWduOmNlbnRlcjsgJyArICdmb250LXdlaWdodDozMDA7ICcgKyAnZm9udC1zaXplOjMwcHg7ICcgKyAnbGVmdDowOyB0b3A6MDsnICsgJ3Bvc2l0aW9uOmZpeGVkOyAnICsgJ3otaW5kZXg6IDk5OTA7JyArICdjb2xvcjogIzA0NjBCNTsgJyArICd3aWR0aDogMTAwJTsgJyArICdoZWlnaHQ6IDEwMCU7ICcgKyAnYmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KTsnICsgJ3RyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7JzsgLy8gQ3JlYXRlIHdyYXBwZXJcblxuICAgIHZhciBwcmludE1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcHJpbnRNb2RhbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgbW9kYWxTdHlsZSk7XG4gICAgcHJpbnRNb2RhbC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3ByaW50SlMtTW9kYWwnKTsgLy8gQ3JlYXRlIGNvbnRlbnQgZGl2XG5cbiAgICB2YXIgY29udGVudERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRlbnREaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OnRhYmxlLWNlbGw7IHZlcnRpY2FsLWFsaWduOm1pZGRsZTsgcGFkZGluZy1ib3R0b206MTAwcHg7Jyk7IC8vIEFkZCBjbG9zZSBidXR0b24gKHJlcXVpcmVzIHByaW50LmNzcylcblxuICAgIHZhciBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNsb3NlQnV0dG9uLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAncHJpbnRDbG9zZScpO1xuICAgIGNsb3NlQnV0dG9uLnNldEF0dHJpYnV0ZSgnaWQnLCAncHJpbnRDbG9zZScpO1xuICAgIGNvbnRlbnREaXYuYXBwZW5kQ2hpbGQoY2xvc2VCdXR0b24pOyAvLyBBZGQgc3Bpbm5lciAocmVxdWlyZXMgcHJpbnQuY3NzKVxuXG4gICAgdmFyIHNwaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgc3Bpbm5lci5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3ByaW50U3Bpbm5lcicpO1xuICAgIGNvbnRlbnREaXYuYXBwZW5kQ2hpbGQoc3Bpbm5lcik7IC8vIEFkZCBtZXNzYWdlXG5cbiAgICB2YXIgbWVzc2FnZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXJhbXMubW9kYWxNZXNzYWdlKTtcbiAgICBjb250ZW50RGl2LmFwcGVuZENoaWxkKG1lc3NhZ2VOb2RlKTsgLy8gQWRkIGNvbnRlbnREaXYgdG8gcHJpbnRNb2RhbFxuXG4gICAgcHJpbnRNb2RhbC5hcHBlbmRDaGlsZChjb250ZW50RGl2KTsgLy8gQXBwZW5kIHByaW50IG1vZGFsIGVsZW1lbnQgdG8gZG9jdW1lbnQgYm9keVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5hcHBlbmRDaGlsZChwcmludE1vZGFsKTsgLy8gQWRkIGV2ZW50IGxpc3RlbmVyIHRvIGNsb3NlIGJ1dHRvblxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByaW50Q2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIE1vZGFsLmNsb3NlKCk7XG4gICAgfSk7XG4gIH0sXG4gIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICB2YXIgcHJpbnRNb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmludEpTLU1vZGFsJyk7XG5cbiAgICBpZiAocHJpbnRNb2RhbCkge1xuICAgICAgcHJpbnRNb2RhbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHByaW50TW9kYWwpO1xuICAgIH1cbiAgfVxufTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoTW9kYWwpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9wZGYuanNcIjpcbi8qISoqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL3BkZi5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgZXhwb3J0cyBwcm92aWRlZDogZGVmYXVsdCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfcHJpbnRfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcHJpbnQgKi8gXCIuL3NyYy9qcy9wcmludC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Z1bmN0aW9ucyAqLyBcIi4vc3JjL2pzL2Z1bmN0aW9ucy5qc1wiKTtcblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHtcbiAgcHJpbnQ6IGZ1bmN0aW9uIHByaW50KHBhcmFtcywgcHJpbnRGcmFtZSkge1xuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYmFzZTY0IGRhdGFcbiAgICBpZiAocGFyYW1zLmJhc2U2NCkge1xuICAgICAgdmFyIGJ5dGVzQXJyYXkgPSBVaW50OEFycmF5LmZyb20oYXRvYihwYXJhbXMucHJpbnRhYmxlKSwgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGMuY2hhckNvZGVBdCgwKTtcbiAgICAgIH0pO1xuICAgICAgY3JlYXRlQmxvYkFuZFByaW50KHBhcmFtcywgcHJpbnRGcmFtZSwgYnl0ZXNBcnJheSk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGb3JtYXQgcGRmIHVybFxuXG5cbiAgICBwYXJhbXMucHJpbnRhYmxlID0gL14oYmxvYnxodHRwfFxcL1xcLykvaS50ZXN0KHBhcmFtcy5wcmludGFibGUpID8gcGFyYW1zLnByaW50YWJsZSA6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyAocGFyYW1zLnByaW50YWJsZS5jaGFyQXQoMCkgIT09ICcvJyA/ICcvJyArIHBhcmFtcy5wcmludGFibGUgOiBwYXJhbXMucHJpbnRhYmxlKTsgLy8gR2V0IHRoZSBmaWxlIHRocm91Z2ggYSBodHRwIHJlcXVlc3QgKFByZWxvYWQpXG5cbiAgICB2YXIgcmVxID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuICAgIHJlcS5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgIHJlcS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIE9iamVjdChfZnVuY3Rpb25zX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19bXCJjbGVhblVwXCJdKShwYXJhbXMpO1xuICAgICAgcGFyYW1zLm9uRXJyb3IocmVxLnN0YXR1c1RleHQsIHJlcSk7IC8vIFNpbmNlIHdlIGRvbid0IGhhdmUgYSBwZGYgZG9jdW1lbnQgYXZhaWxhYmxlLCB3ZSB3aWxsIHN0b3AgdGhlIHByaW50IGpvYlxuICAgIH0pO1xuICAgIHJlcS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQ2hlY2sgZm9yIGVycm9yc1xuICAgICAgaWYgKFsyMDAsIDIwMV0uaW5kZXhPZihyZXEuc3RhdHVzKSA9PT0gLTEpIHtcbiAgICAgICAgT2JqZWN0KF9mdW5jdGlvbnNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX1tcImNsZWFuVXBcIl0pKHBhcmFtcyk7XG4gICAgICAgIHBhcmFtcy5vbkVycm9yKHJlcS5zdGF0dXNUZXh0LCByZXEpOyAvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGEgcGRmIGRvY3VtZW50IGF2YWlsYWJsZSwgd2Ugd2lsbCBzdG9wIHRoZSBwcmludCBqb2JcblxuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFByaW50IHJlcXVlc3RlZCBkb2N1bWVudFxuXG5cbiAgICAgIGNyZWF0ZUJsb2JBbmRQcmludChwYXJhbXMsIHByaW50RnJhbWUsIHJlcS5yZXNwb25zZSk7XG4gICAgfSk7XG4gICAgcmVxLm9wZW4oJ0dFVCcsIHBhcmFtcy5wcmludGFibGUsIHRydWUpO1xuICAgIHJlcS5zZW5kKCk7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVCbG9iQW5kUHJpbnQocGFyYW1zLCBwcmludEZyYW1lLCBkYXRhKSB7XG4gIC8vIFBhc3MgcmVzcG9uc2Ugb3IgYmFzZTY0IGRhdGEgdG8gYSBibG9iIGFuZCBjcmVhdGUgYSBsb2NhbCBvYmplY3QgdXJsXG4gIHZhciBsb2NhbFBkZiA9IG5ldyB3aW5kb3cuQmxvYihbZGF0YV0sIHtcbiAgICB0eXBlOiAnYXBwbGljYXRpb24vcGRmJ1xuICB9KTtcbiAgbG9jYWxQZGYgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChsb2NhbFBkZik7IC8vIFNldCBpZnJhbWUgc3JjIHdpdGggcGRmIGRvY3VtZW50IHVybFxuXG4gIHByaW50RnJhbWUuc2V0QXR0cmlidXRlKCdzcmMnLCBsb2NhbFBkZik7XG4gIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5zZW5kKHBhcmFtcywgcHJpbnRGcmFtZSk7XG59XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL2pzL3ByaW50LmpzXCI6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vc3JjL2pzL3ByaW50LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIGV4cG9ydHMgcHJvdmlkZWQ6IGRlZmF1bHQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vYnJvd3NlciAqLyBcIi4vc3JjL2pzL2Jyb3dzZXIuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9mdW5jdGlvbnMgKi8gXCIuL3NyYy9qcy9mdW5jdGlvbnMuanNcIik7XG5cblxudmFyIFByaW50ID0ge1xuICBzZW5kOiBmdW5jdGlvbiBzZW5kKHBhcmFtcywgcHJpbnRGcmFtZSkge1xuICAgIC8vIEFwcGVuZCBpZnJhbWUgZWxlbWVudCB0byBkb2N1bWVudCBib2R5XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5hcHBlbmRDaGlsZChwcmludEZyYW1lKTsgLy8gR2V0IGlmcmFtZSBlbGVtZW50XG5cbiAgICB2YXIgaWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmFtcy5mcmFtZUlkKTsgLy8gV2FpdCBmb3IgaWZyYW1lIHRvIGxvYWQgYWxsIGNvbnRlbnRcblxuICAgIGlmcmFtZUVsZW1lbnQub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAncGRmJykge1xuICAgICAgICAvLyBBZGQgYSBkZWxheSBmb3IgRmlyZWZveC4gSW4gbXkgdGVzdHMsIDEwMDBtcyB3YXMgc3VmZmljaWVudCBidXQgMTAwbXMgd2FzIG5vdFxuICAgICAgICBpZiAoX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uaXNGaXJlZm94KCkpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBwZXJmb3JtUHJpbnQoaWZyYW1lRWxlbWVudCwgcGFyYW1zKTtcbiAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZXJmb3JtUHJpbnQoaWZyYW1lRWxlbWVudCwgcGFyYW1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gR2V0IGlmcmFtZSBlbGVtZW50IGRvY3VtZW50XG5cblxuICAgICAgdmFyIHByaW50RG9jdW1lbnQgPSBpZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lRWxlbWVudC5jb250ZW50RG9jdW1lbnQ7XG4gICAgICBpZiAocHJpbnREb2N1bWVudC5kb2N1bWVudCkgcHJpbnREb2N1bWVudCA9IHByaW50RG9jdW1lbnQuZG9jdW1lbnQ7IC8vIEFwcGVuZCBwcmludGFibGUgZWxlbWVudCB0byB0aGUgaWZyYW1lIGJvZHlcblxuICAgICAgcHJpbnREb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBhcmFtcy5wcmludGFibGVFbGVtZW50KTsgLy8gQWRkIGN1c3RvbSBzdHlsZVxuXG4gICAgICBpZiAocGFyYW1zLnR5cGUgIT09ICdwZGYnICYmIHBhcmFtcy5zdHlsZSkge1xuICAgICAgICAvLyBDcmVhdGUgc3R5bGUgZWxlbWVudFxuICAgICAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZS5pbm5lckhUTUwgPSBwYXJhbXMuc3R5bGU7IC8vIEFwcGVuZCBzdHlsZSBlbGVtZW50IHRvIGlmcmFtZSdzIGhlYWRcblxuICAgICAgICBwcmludERvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgICAgfSAvLyBJZiBwcmludGluZyBpbWFnZXMsIHdhaXQgZm9yIHRoZW0gdG8gbG9hZCBpbnNpZGUgdGhlIGlmcmFtZVxuXG5cbiAgICAgIHZhciBpbWFnZXMgPSBwcmludERvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTtcblxuICAgICAgaWYgKGltYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvYWRJZnJhbWVJbWFnZXMoQXJyYXkuZnJvbShpbWFnZXMpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcGVyZm9ybVByaW50KGlmcmFtZUVsZW1lbnQsIHBhcmFtcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVyZm9ybVByaW50KGlmcmFtZUVsZW1lbnQsIHBhcmFtcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxuZnVuY3Rpb24gcGVyZm9ybVByaW50KGlmcmFtZUVsZW1lbnQsIHBhcmFtcykge1xuICB0cnkge1xuICAgIGlmcmFtZUVsZW1lbnQuZm9jdXMoKTsgLy8gSWYgRWRnZSBvciBJRSwgdHJ5IGNhdGNoIHdpdGggZXhlY0NvbW1hbmRcblxuICAgIGlmIChfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5pc0VkZ2UoKSB8fCBfYnJvd3Nlcl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wiZGVmYXVsdFwiXS5pc0lFKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudC5leGVjQ29tbWFuZCgncHJpbnQnLCBmYWxzZSwgbnVsbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5wcmludCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdGhlciBicm93c2Vyc1xuICAgICAgaWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93LnByaW50KCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHBhcmFtcy5vbkVycm9yKGVycm9yKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoX2Jyb3dzZXJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcImRlZmF1bHRcIl0uaXNGaXJlZm94KCkpIHtcbiAgICAgIC8vIE1vdmUgdGhlIGlmcmFtZSBlbGVtZW50IG9mZi1zY3JlZW4gYW5kIG1ha2UgaXQgaW52aXNpYmxlXG4gICAgICBpZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgIGlmcmFtZUVsZW1lbnQuc3R5bGUubGVmdCA9ICctMXB4JztcbiAgICB9XG5cbiAgICBPYmplY3QoX2Z1bmN0aW9uc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fW1wiY2xlYW5VcFwiXSkocGFyYW1zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkSWZyYW1lSW1hZ2VzKGltYWdlcykge1xuICB2YXIgcHJvbWlzZXMgPSBpbWFnZXMubWFwKGZ1bmN0aW9uIChpbWFnZSkge1xuICAgIGlmIChpbWFnZS5zcmMgJiYgaW1hZ2Uuc3JjICE9PSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xuICAgICAgcmV0dXJuIGxvYWRJZnJhbWVJbWFnZShpbWFnZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn1cblxuZnVuY3Rpb24gbG9hZElmcmFtZUltYWdlKGltYWdlKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIHZhciBwb2xsSW1hZ2UgPSBmdW5jdGlvbiBwb2xsSW1hZ2UoKSB7XG4gICAgICAhaW1hZ2UgfHwgdHlwZW9mIGltYWdlLm5hdHVyYWxXaWR0aCA9PT0gJ3VuZGVmaW5lZCcgfHwgaW1hZ2UubmF0dXJhbFdpZHRoID09PSAwIHx8ICFpbWFnZS5jb21wbGV0ZSA/IHNldFRpbWVvdXQocG9sbEltYWdlLCA1MDApIDogcmVzb2x2ZSgpO1xuICAgIH07XG5cbiAgICBwb2xsSW1hZ2UoKTtcbiAgfSk7XG59XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoUHJpbnQpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gXCIuL3NyYy9qcy9yYXctaHRtbC5qc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3NyYy9qcy9yYXctaHRtbC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBleHBvcnRzIHByb3ZpZGVkOiBkZWZhdWx0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9wcmludF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9wcmludCAqLyBcIi4vc3JjL2pzL3ByaW50LmpzXCIpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKHtcbiAgcHJpbnQ6IGZ1bmN0aW9uIHByaW50KHBhcmFtcywgcHJpbnRGcmFtZSkge1xuICAgIC8vIENyZWF0ZSBwcmludGFibGUgZWxlbWVudCAoY29udGFpbmVyKVxuICAgIHBhcmFtcy5wcmludGFibGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICd3aWR0aDoxMDAlJyk7IC8vIFNldCBvdXIgcmF3IGh0bWwgYXMgdGhlIHByaW50YWJsZSBlbGVtZW50IGlubmVyIGh0bWwgY29udGVudFxuXG4gICAgcGFyYW1zLnByaW50YWJsZUVsZW1lbnQuaW5uZXJIVE1MID0gcGFyYW1zLnByaW50YWJsZTsgLy8gUHJpbnQgaHRtbCBjb250ZW50c1xuXG4gICAgX3ByaW50X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19bXCJkZWZhdWx0XCJdLnNlbmQocGFyYW1zLCBwcmludEZyYW1lKTtcbiAgfVxufSk7XG5cbi8qKiovIH0pLFxuXG4vKioqLyBcIi4vc3JjL3Nhc3MvaW5kZXguc2Nzc1wiOlxuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9zcmMvc2Fzcy9pbmRleC5zY3NzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cblxuLyoqKi8gfSksXG5cbi8qKiovIDA6XG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIG11bHRpIC4vc3JjL2luZGV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9zcmMvaW5kZXguanMgKi9cIi4vc3JjL2luZGV4LmpzXCIpO1xuXG5cbi8qKiovIH0pXG5cbi8qKioqKiovIH0pW1wiZGVmYXVsdFwiXTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJpbnQubWFwIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuICB2YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG4gIHZhciBoYXMgPSByZXF1aXJlKCcuL2xpYi9oYXMnKTtcblxuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkgeyAvKiovIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/RnVuY3Rpb259IGdldFN0YWNrIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZ2V0U3RhY2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoXG4gICAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAgICAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgK1xuICAgICAgICAgICAgICAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yICYmICEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAnICtcbiAgICAgICAgICAgIGxvY2F0aW9uICsgJyBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJyArIHR5cGVvZiBlcnJvciArICcuICcgK1xuICAgICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArXG4gICAgICAgICAgICAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlO1xuXG4gICAgICAgICAgdmFyIHN0YWNrID0gZ2V0U3RhY2sgPyBnZXRTdGFjaygpIDogJyc7XG5cbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnRmFpbGVkICcgKyBsb2NhdGlvbiArICcgdHlwZTogJyArIGVycm9yLm1lc3NhZ2UgKyAoc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogJycpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc2V0cyB3YXJuaW5nIGNhY2hlIHdoZW4gdGVzdGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tQcm9wVHlwZXM7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL2xpYi9oYXMnKTtcbnZhciBjaGVja1Byb3BUeXBlcyA9IHJlcXVpcmUoJy4vY2hlY2tQcm9wVHlwZXMnKTtcblxudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpc1ZhbGlkRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAvKiBnbG9iYWwgU3ltYm9sICovXG4gIHZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbiAgdmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InOyAvLyBCZWZvcmUgU3ltYm9sIHNwZWMuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC5cbiAgICpcbiAgICogQmUgc3VyZSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZXJhYmxlIGFzIGNvbnRleHQ6XG4gICAqXG4gICAqICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obXlJdGVyYWJsZSk7XG4gICAqICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7XG4gICAqICAgICAgIC4uLlxuICAgKiAgICAgfVxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1heWJlSXRlcmFibGVcbiAgICogQHJldHVybiB7P2Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvckZuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyBkZWNsYXJhdGlvbiBhbmQgdmFsaWRhdGlvbiBvZiBwcm9wcyB0aGF0IGFyZVxuICAgKiBzdXBwbGllZCB0byBSZWFjdCBjb21wb25lbnRzLiBFeGFtcGxlIHVzYWdlOlxuICAgKlxuICAgKiAgIHZhciBQcm9wcyA9IHJlcXVpcmUoJ1JlYWN0UHJvcFR5cGVzJyk7XG4gICAqICAgdmFyIE15QXJ0aWNsZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgcHJvcCBuYW1lZCBcImRlc2NyaXB0aW9uXCIuXG4gICAqICAgICAgIGRlc2NyaXB0aW9uOiBQcm9wcy5zdHJpbmcsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcmVxdWlyZWQgZW51bSBwcm9wIG5hbWVkIFwiY2F0ZWdvcnlcIi5cbiAgICogICAgICAgY2F0ZWdvcnk6IFByb3BzLm9uZU9mKFsnTmV3cycsJ1Bob3RvcyddKS5pc1JlcXVpcmVkLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHByb3AgbmFtZWQgXCJkaWFsb2dcIiB0aGF0IHJlcXVpcmVzIGFuIGluc3RhbmNlIG9mIERpYWxvZy5cbiAgICogICAgICAgZGlhbG9nOiBQcm9wcy5pbnN0YW5jZU9mKERpYWxvZykuaXNSZXF1aXJlZFxuICAgKiAgICAgfSxcbiAgICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7IC4uLiB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIEEgbW9yZSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZDpcbiAgICpcbiAgICogICB0eXBlIDo9IGFycmF5fGJvb2x8ZnVuY3xvYmplY3R8bnVtYmVyfHN0cmluZ3xvbmVPZihbLi4uXSl8aW5zdGFuY2VPZiguLi4pXG4gICAqICAgZGVjbCA6PSBSZWFjdFByb3BUeXBlcy57dHlwZX0oLmlzUmVxdWlyZWQpP1xuICAgKlxuICAgKiBFYWNoIGFuZCBldmVyeSBkZWNsYXJhdGlvbiBwcm9kdWNlcyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLiBUaGlzXG4gICAqIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25zLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogIHZhciBNeUxpbmsgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBvciBVUkkgcHJvcCBuYW1lZCBcImhyZWZcIi5cbiAgICogICAgICBocmVmOiBmdW5jdGlvbihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICogICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAqICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHByb3BWYWx1ZSAhPT0gJ3N0cmluZycgJiZcbiAgICogICAgICAgICAgICAhKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFVSSSkpIHtcbiAgICogICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICogICAgICAgICAgICAnRXhwZWN0ZWQgYSBzdHJpbmcgb3IgYW4gVVJJIGZvciAnICsgcHJvcE5hbWUgKyAnIGluICcgK1xuICAgKiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICogICAgICAgICAgKTtcbiAgICogICAgICAgIH1cbiAgICogICAgICB9XG4gICAqICAgIH0sXG4gICAqICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7Li4ufVxuICAgKiAgfSk7XG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuICB2YXIgQU5PTllNT1VTID0gJzw8YW5vbnltb3VzPj4nO1xuXG4gIC8vIEltcG9ydGFudCFcbiAgLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBpbiBgLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdhcnJheScpLFxuICAgIGJpZ2ludDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2JpZ2ludCcpLFxuICAgIGJvb2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdib29sZWFuJyksXG4gICAgZnVuYzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Z1bmN0aW9uJyksXG4gICAgbnVtYmVyOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignbnVtYmVyJyksXG4gICAgb2JqZWN0OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignb2JqZWN0JyksXG4gICAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3RyaW5nJyksXG4gICAgc3ltYm9sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3ltYm9sJyksXG5cbiAgICBhbnk6IGNyZWF0ZUFueVR5cGVDaGVja2VyKCksXG4gICAgYXJyYXlPZjogY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyLFxuICAgIGVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpLFxuICAgIGVsZW1lbnRUeXBlOiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCksXG4gICAgaW5zdGFuY2VPZjogY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcixcbiAgICBub2RlOiBjcmVhdGVOb2RlQ2hlY2tlcigpLFxuICAgIG9iamVjdE9mOiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyLFxuICAgIG9uZU9mOiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIsXG4gICAgb25lT2ZUeXBlOiBjcmVhdGVVbmlvblR5cGVDaGVja2VyLFxuICAgIHNoYXBlOiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyLFxuICAgIGV4YWN0OiBjcmVhdGVTdHJpY3RTaGFwZVR5cGVDaGVja2VyLFxuICB9O1xuXG4gIC8qKlxuICAgKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICAgKi9cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuICBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gICAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICAgIH1cbiAgfVxuICAvKmVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlKi9cblxuICAvKipcbiAgICogV2UgdXNlIGFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzIHBlb3BsZSBtYXkgY2FsbFxuICAgKiBQcm9wVHlwZXMgZGlyZWN0bHkgYW5kIGluc3BlY3QgdGhlaXIgb3V0cHV0LiBIb3dldmVyLCB3ZSBkb24ndCB1c2UgcmVhbFxuICAgKiBFcnJvcnMgYW55bW9yZS4gV2UgZG9uJ3QgaW5zcGVjdCB0aGVpciBzdGFjayBhbnl3YXksIGFuZCBjcmVhdGluZyB0aGVtXG4gICAqIGlzIHByb2hpYml0aXZlbHkgZXhwZW5zaXZlIGlmIHRoZXkgYXJlIGNyZWF0ZWQgdG9vIG9mdGVuLCBzdWNoIGFzIHdoYXRcbiAgICogaGFwcGVucyBpbiBvbmVPZlR5cGUoKSBmb3IgYW55IHR5cGUgYmVmb3JlIHRoZSBvbmUgdGhhdCBtYXRjaGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gUHJvcFR5cGVFcnJvcihtZXNzYWdlLCBkYXRhKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLmRhdGEgPSBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGE6IHt9O1xuICAgIHRoaXMuc3RhY2sgPSAnJztcbiAgfVxuICAvLyBNYWtlIGBpbnN0YW5jZW9mIEVycm9yYCBzdGlsbCB3b3JrIGZvciByZXR1cm5lZCBlcnJvcnMuXG4gIFByb3BUeXBlRXJyb3IucHJvdG90eXBlID0gRXJyb3IucHJvdG90eXBlO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZSA9IHt9O1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50ID0gMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICBjb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICBwcm9wRnVsbE5hbWUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICAgIGlmIChzZWNyZXQgIT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAgIGlmICh0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gICAgICAgICAgLy8gTmV3IGJlaGF2aW9yIG9ubHkgZm9yIHVzZXJzIG9mIGBwcm9wLXR5cGVzYCBwYWNrYWdlXG4gICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICdVc2UgYFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpYCB0byBjYWxsIHRoZW0uICcgK1xuICAgICAgICAgICAgJ1JlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAvLyBPbGQgYmVoYXZpb3IgZm9yIHBlb3BsZSB1c2luZyBSZWFjdC5Qcm9wVHlwZXNcbiAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBjb21wb25lbnROYW1lICsgJzonICsgcHJvcE5hbWU7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIW1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSAmJlxuICAgICAgICAgICAgLy8gQXZvaWQgc3BhbW1pbmcgdGhlIGNvbnNvbGUgYmVjYXVzZSB0aGV5IGFyZSBvZnRlbiBub3QgYWN0aW9uYWJsZSBleGNlcHQgZm9yIGxpYiBhdXRob3JzXG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA8IDNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICAgJ1lvdSBhcmUgbWFudWFsbHkgY2FsbGluZyBhIFJlYWN0LlByb3BUeXBlcyB2YWxpZGF0aW9uICcgK1xuICAgICAgICAgICAgICAnZnVuY3Rpb24gZm9yIHRoZSBgJyArIHByb3BGdWxsTmFtZSArICdgIHByb3Agb24gYCcgKyBjb21wb25lbnROYW1lICsgJ2AuIFRoaXMgaXMgZGVwcmVjYXRlZCAnICtcbiAgICAgICAgICAgICAgJ2FuZCB3aWxsIHRocm93IGluIHRoZSBzdGFuZGFsb25lIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICAgJ1lvdSBtYXkgYmUgc2VlaW5nIHRoaXMgd2FybmluZyBkdWUgdG8gYSB0aGlyZC1wYXJ0eSBQcm9wVHlwZXMgJyArXG4gICAgICAgICAgICAgICdsaWJyYXJ5LiBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWRvbnQtY2FsbC1wcm9wdHlwZXMgJyArICdmb3IgZGV0YWlscy4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkICcgKyAoJ2luIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGBudWxsYC4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYHVuZGVmaW5lZGAuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7XG4gICAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKGV4cGVjdGVkVHlwZSkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICAgIC8vIGBwcm9wVmFsdWVgIGJlaW5nIGluc3RhbmNlIG9mLCBzYXksIGRhdGUvcmVnZXhwLCBwYXNzIHRoZSAnb2JqZWN0J1xuICAgICAgICAvLyBjaGVjaywgYnV0IHdlIGNhbiBvZmZlciBhIG1vcmUgcHJlY2lzZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gJ29mIHR5cGUgYG9iamVjdGAnLlxuICAgICAgICB2YXIgcHJlY2lzZVR5cGUgPSBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByZWNpc2VUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdgJyArIGV4cGVjdGVkVHlwZSArICdgLicpLFxuICAgICAgICAgIHtleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZX1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQW55VHlwZUNoZWNrZXIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIGFycmF5T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gYXJyYXkuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJ1snICsgaSArICddJywgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlVHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFSZWFjdElzLmlzVmFsaWRFbGVtZW50VHlwZShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudCB0eXBlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcihleHBlY3RlZENsYXNzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIShwcm9wc1twcm9wTmFtZV0gaW5zdGFuY2VvZiBleHBlY3RlZENsYXNzKSkge1xuICAgICAgICB2YXIgZXhwZWN0ZWRDbGFzc05hbWUgPSBleHBlY3RlZENsYXNzLm5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgICB2YXIgYWN0dWFsQ2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHByb3BzW3Byb3BOYW1lXSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIGFjdHVhbENsYXNzTmFtZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnaW5zdGFuY2Ugb2YgYCcgKyBleHBlY3RlZENsYXNzTmFtZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRW51bVR5cGVDaGVja2VyKGV4cGVjdGVkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWVzKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnRzIHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBhcnJheSwgZ290ICcgKyBhcmd1bWVudHMubGVuZ3RoICsgJyBhcmd1bWVudHMuICcgK1xuICAgICAgICAgICAgJ0EgY29tbW9uIG1pc3Rha2UgaXMgdG8gd3JpdGUgb25lT2YoeCwgeSwgeikgaW5zdGVhZCBvZiBvbmVPZihbeCwgeSwgel0pLidcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gYXJyYXkuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGlzKHByb3BWYWx1ZSwgZXhwZWN0ZWRWYWx1ZXNbaV0pKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkVmFsdWVzLCBmdW5jdGlvbiByZXBsYWNlcihrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBTdHJpbmcocHJvcFZhbHVlKSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBvbmUgb2YgJyArIHZhbHVlc1N0cmluZyArICcuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHByb3BWYWx1ZSkge1xuICAgICAgICBpZiAoaGFzKHByb3BWYWx1ZSwga2V5KSkge1xuICAgICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlVW5pb25UeXBlQ2hlY2tlcihhcnJheU9mVHlwZUNoZWNrZXJzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5T2ZUeXBlQ2hlY2tlcnMpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZSwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLiBFeHBlY3RlZCBhbiBhcnJheSBvZiBjaGVjayBmdW5jdGlvbnMsIGJ1dCAnICtcbiAgICAgICAgICAncmVjZWl2ZWQgJyArIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyhjaGVja2VyKSArICcgYXQgaW5kZXggJyArIGkgKyAnLidcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgICAgdmFyIGNoZWNrZXJSZXN1bHQgPSBjaGVja2VyKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoY2hlY2tlclJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrZXJSZXN1bHQuZGF0YSAmJiBoYXMoY2hlY2tlclJlc3VsdC5kYXRhLCAnZXhwZWN0ZWRUeXBlJykpIHtcbiAgICAgICAgICBleHBlY3RlZFR5cGVzLnB1c2goY2hlY2tlclJlc3VsdC5kYXRhLmV4cGVjdGVkVHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBleHBlY3RlZFR5cGVzTWVzc2FnZSA9IChleHBlY3RlZFR5cGVzLmxlbmd0aCA+IDApID8gJywgZXhwZWN0ZWQgb25lIG9mIHR5cGUgWycgKyBleHBlY3RlZFR5cGVzLmpvaW4oJywgJykgKyAnXSc6ICcnO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCcgKyBleHBlY3RlZFR5cGVzTWVzc2FnZSArICcuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIWlzTm9kZShwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52YWxpZFZhbGlkYXRvckVycm9yKGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIGtleSwgdHlwZSkge1xuICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5ICsgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlICsgJ2AuJ1xuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc2hhcGVUeXBlcykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGludmFsaWRWYWxpZGF0b3JFcnJvcihjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBrZXksIGdldFByZWNpc2VUeXBlKGNoZWNrZXIpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTdHJpY3RTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgICB9XG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGFsbCBrZXlzIGluIGNhc2Ugc29tZSBhcmUgcmVxdWlyZWQgYnV0IG1pc3NpbmcgZnJvbSBwcm9wcy5cbiAgICAgIHZhciBhbGxLZXlzID0gYXNzaWduKHt9LCBwcm9wc1twcm9wTmFtZV0sIHNoYXBlVHlwZXMpO1xuICAgICAgZm9yICh2YXIga2V5IGluIGFsbEtleXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmIChoYXMoc2hhcGVUeXBlcywga2V5KSAmJiB0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBpbnZhbGlkVmFsaWRhdG9yRXJyb3IoY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwga2V5LCBnZXRQcmVjaXNlVHlwZShjaGVja2VyKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGVja2VyKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgICAgICAgJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGtleSBgJyArIGtleSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLicgK1xuICAgICAgICAgICAgJ1xcbkJhZCBvYmplY3Q6ICcgKyBKU09OLnN0cmluZ2lmeShwcm9wc1twcm9wTmFtZV0sIG51bGwsICcgICcpICtcbiAgICAgICAgICAgICdcXG5WYWxpZCBrZXlzOiAnICsgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoc2hhcGVUeXBlcyksIG51bGwsICcgICcpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZShwcm9wVmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wVmFsdWUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuICFwcm9wVmFsdWU7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BWYWx1ZS5ldmVyeShpc05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKHByb3BWYWx1ZSk7XG4gICAgICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKHByb3BWYWx1ZSk7XG4gICAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IHByb3BWYWx1ZS5lbnRyaWVzKSB7XG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIGlmICghaXNOb2RlKHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTm9kZShlbnRyeVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkge1xuICAgIC8vIE5hdGl2ZSBTeW1ib2wuXG4gICAgaWYgKHByb3BUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gZmFsc3kgdmFsdWUgY2FuJ3QgYmUgYSBTeW1ib2xcbiAgICBpZiAoIXByb3BWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnXG4gICAgaWYgKHByb3BWYWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zcGVjIGNvbXBsaWFudCBTeW1ib2xzIHdoaWNoIGFyZSBwb2x5ZmlsbGVkLlxuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gRXF1aXZhbGVudCBvZiBgdHlwZW9mYCBidXQgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciBhcnJheSBhbmQgcmVnZXhwLlxuICBmdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH1cbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBPbGQgd2Via2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhlciB0aGFuXG4gICAgICAvLyAnb2JqZWN0JyBmb3IgdHlwZW9mIGEgUmVnRXhwLiBXZSdsbCBub3JtYWxpemUgdGhpcyBoZXJlIHNvIHRoYXQgL2JsYS9cbiAgICAgIC8vIHBhc3NlcyBQcm9wVHlwZXMub2JqZWN0LlxuICAgICAgcmV0dXJuICdvYmplY3QnO1xuICAgIH1cbiAgICBpZiAoaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gVGhpcyBoYW5kbGVzIG1vcmUgdHlwZXMgdGhhbiBgZ2V0UHJvcFR5cGVgLiBPbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAvLyBTZWUgYGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyYC5cbiAgZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnICsgcHJvcFZhbHVlO1xuICAgIH1cbiAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgIGlmIChwcm9wVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwb3N0Zml4ZWQgdG8gYSB3YXJuaW5nIGFib3V0IGFuIGludmFsaWQgdHlwZS5cbiAgLy8gRm9yIGV4YW1wbGUsIFwidW5kZWZpbmVkXCIgb3IgXCJvZiB0eXBlIGFycmF5XCJcbiAgZnVuY3Rpb24gZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gJ2FuICcgKyB0eXBlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICAgIHJldHVybiAnYSAnICsgdHlwZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuXG4gIGZ1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHtcbiAgICBpZiAoIXByb3BWYWx1ZS5jb25zdHJ1Y3RvciB8fCAhcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpIHtcbiAgICAgIHJldHVybiBBTk9OWU1PVVM7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuXG4gIFJlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzID0gY2hlY2tQcm9wVHlwZXM7XG4gIFJlYWN0UHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlID0gY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGU7XG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKFJlYWN0SXMuaXNFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsIm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIGhhc1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKSA6IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKSA6IDB4ZWFjYjtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKSA6IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKSA6IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKSA6IDB4ZWFjZDtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0JykgOiAweGVhY2U7IC8vIFRPRE86IFdlIGRvbid0IHVzZSBBc3luY01vZGUgb3IgQ29uY3VycmVudE1vZGUgYW55bW9yZS4gVGhleSB3ZXJlIHRlbXBvcmFyeVxuLy8gKHVuc3RhYmxlKSBBUElzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQuIENhbiB3ZSByZW1vdmUgdGhlIHN5bWJvbHM/XG5cbnZhciBSRUFDVF9BU1lOQ19NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5hc3luY19tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb25jdXJyZW50X21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKSA6IDB4ZWFkMDtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKSA6IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0JykgOiAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubWVtbycpIDogMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKSA6IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYmxvY2snKSA6IDB4ZWFkOTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnVuZGFtZW50YWwnKSA6IDB4ZWFkNTtcbnZhciBSRUFDVF9SRVNQT05ERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnJlc3BvbmRlcicpIDogMHhlYWQ2O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zY29wZScpIDogMHhlYWQ3O1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IC8vIE5vdGU6IGl0cyB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyBpZiBpdCdzIGEgcG9seWZpbGwuXG4gIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9SRVNQT05ERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9TQ09QRV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0JMT0NLX1RZUEUpO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0FTWU5DX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0gLy8gQXN5bmNNb2RlIGlzIGRlcHJlY2F0ZWQgYWxvbmcgd2l0aCBpc0FzeW5jTW9kZVxuXG52YXIgQXN5bmNNb2RlID0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xudmFyIENvbmN1cnJlbnRNb2RlID0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE3Ky4gVXBkYXRlIHlvdXIgY29kZSB0byB1c2UgJyArICdSZWFjdElzLmlzQ29uY3VycmVudE1vZGUoKSBpbnN0ZWFkLiBJdCBoYXMgdGhlIGV4YWN0IHNhbWUgQVBJLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkgfHwgdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5cbmV4cG9ydHMuQXN5bmNNb2RlID0gQXN5bmNNb2RlO1xuZXhwb3J0cy5Db25jdXJyZW50TW9kZSA9IENvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5Db250ZXh0Q29uc3VtZXIgPSBDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IENvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuRWxlbWVudCA9IEVsZW1lbnQ7XG5leHBvcnRzLkZvcndhcmRSZWYgPSBGb3J3YXJkUmVmO1xuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuZXhwb3J0cy5MYXp5ID0gTGF6eTtcbmV4cG9ydHMuTWVtbyA9IE1lbW87XG5leHBvcnRzLlBvcnRhbCA9IFBvcnRhbDtcbmV4cG9ydHMuUHJvZmlsZXIgPSBQcm9maWxlcjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFN0cmljdE1vZGU7XG5leHBvcnRzLlN1c3BlbnNlID0gU3VzcGVuc2U7XG5leHBvcnRzLmlzQXN5bmNNb2RlID0gaXNBc3luY01vZGU7XG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBpc0NvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lciA9IGlzQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGlzQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGlzRm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7XG5leHBvcnRzLmlzTGF6eSA9IGlzTGF6eTtcbmV4cG9ydHMuaXNNZW1vID0gaXNNZW1vO1xuZXhwb3J0cy5pc1BvcnRhbCA9IGlzUG9ydGFsO1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gaXNQcm9maWxlcjtcbmV4cG9ydHMuaXNTdHJpY3RNb2RlID0gaXNTdHJpY3RNb2RlO1xuZXhwb3J0cy5pc1N1c3BlbnNlID0gaXNTdXNwZW5zZTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlO1xuZXhwb3J0cy50eXBlT2YgPSB0eXBlT2Y7XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmx1c2hTeW5jIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IFJlc2l6ZXIgfSBmcm9tICcuL3Jlc2l6ZXInO1xudmFyIERFRkFVTFRfU0laRSA9IHtcbiAgICB3aWR0aDogJ2F1dG8nLFxuICAgIGhlaWdodDogJ2F1dG8nLFxufTtcbnZhciBjbGFtcCA9IGZ1bmN0aW9uIChuLCBtaW4sIG1heCkgeyByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4obiwgbWF4KSwgbWluKTsgfTtcbnZhciBzbmFwID0gZnVuY3Rpb24gKG4sIHNpemUpIHsgcmV0dXJuIE1hdGgucm91bmQobiAvIHNpemUpICogc2l6ZTsgfTtcbnZhciBoYXNEaXJlY3Rpb24gPSBmdW5jdGlvbiAoZGlyLCB0YXJnZXQpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChkaXIsICdpJykudGVzdCh0YXJnZXQpO1xufTtcbi8vIElORk86IEluIGNhc2Ugb2Ygd2luZG93IGlzIGEgUHJveHkgYW5kIGRvZXMgbm90IHBvcnh5IEV2ZW50cyBjb3JyZWN0bHksIHVzZSBpc1RvdWNoRXZlbnQgJiBpc01vdXNlRXZlbnQgdG8gZGlzdGluZ3Vpc2ggZXZlbnQgdHlwZSBpbnN0ZWFkIG9mIGBpbnN0YW5jZW9mYC5cbnZhciBpc1RvdWNoRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoKTtcbn07XG52YXIgaXNNb3VzZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oKGV2ZW50LmNsaWVudFggfHwgZXZlbnQuY2xpZW50WCA9PT0gMCkgJiZcbiAgICAgICAgKGV2ZW50LmNsaWVudFkgfHwgZXZlbnQuY2xpZW50WSA9PT0gMCkpO1xufTtcbnZhciBmaW5kQ2xvc2VzdFNuYXAgPSBmdW5jdGlvbiAobiwgc25hcEFycmF5LCBzbmFwR2FwKSB7XG4gICAgaWYgKHNuYXBHYXAgPT09IHZvaWQgMCkgeyBzbmFwR2FwID0gMDsgfVxuICAgIHZhciBjbG9zZXN0R2FwSW5kZXggPSBzbmFwQXJyYXkucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXJyLCBpbmRleCkgeyByZXR1cm4gKE1hdGguYWJzKGN1cnIgLSBuKSA8IE1hdGguYWJzKHNuYXBBcnJheVtwcmV2XSAtIG4pID8gaW5kZXggOiBwcmV2KTsgfSwgMCk7XG4gICAgdmFyIGdhcCA9IE1hdGguYWJzKHNuYXBBcnJheVtjbG9zZXN0R2FwSW5kZXhdIC0gbik7XG4gICAgcmV0dXJuIHNuYXBHYXAgPT09IDAgfHwgZ2FwIDwgc25hcEdhcCA/IHNuYXBBcnJheVtjbG9zZXN0R2FwSW5kZXhdIDogbjtcbn07XG52YXIgZ2V0U3RyaW5nU2l6ZSA9IGZ1bmN0aW9uIChuKSB7XG4gICAgbiA9IG4udG9TdHJpbmcoKTtcbiAgICBpZiAobiA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAobi5lbmRzV2l0aCgncHgnKSkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgaWYgKG4uZW5kc1dpdGgoJyUnKSkge1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgaWYgKG4uZW5kc1dpdGgoJ3ZoJykpIHtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChuLmVuZHNXaXRoKCd2dycpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAobi5lbmRzV2l0aCgndm1heCcpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAobi5lbmRzV2l0aCgndm1pbicpKSB7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICByZXR1cm4gbiArIFwicHhcIjtcbn07XG52YXIgZ2V0UGl4ZWxTaXplID0gZnVuY3Rpb24gKHNpemUsIHBhcmVudFNpemUsIGlubmVyV2lkdGgsIGlubmVySGVpZ2h0KSB7XG4gICAgaWYgKHNpemUgJiYgdHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChzaXplLmVuZHNXaXRoKCdweCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHNpemUucmVwbGFjZSgncHgnLCAnJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXplLmVuZHNXaXRoKCclJykpIHtcbiAgICAgICAgICAgIHZhciByYXRpbyA9IE51bWJlcihzaXplLnJlcGxhY2UoJyUnLCAnJykpIC8gMTAwO1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudFNpemUgKiByYXRpbztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2l6ZS5lbmRzV2l0aCgndncnKSkge1xuICAgICAgICAgICAgdmFyIHJhdGlvID0gTnVtYmVyKHNpemUucmVwbGFjZSgndncnLCAnJykpIC8gMTAwO1xuICAgICAgICAgICAgcmV0dXJuIGlubmVyV2lkdGggKiByYXRpbztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2l6ZS5lbmRzV2l0aCgndmgnKSkge1xuICAgICAgICAgICAgdmFyIHJhdGlvID0gTnVtYmVyKHNpemUucmVwbGFjZSgndmgnLCAnJykpIC8gMTAwO1xuICAgICAgICAgICAgcmV0dXJuIGlubmVySGVpZ2h0ICogcmF0aW87XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG59O1xudmFyIGNhbGN1bGF0ZU5ld01heCA9IGZ1bmN0aW9uIChwYXJlbnRTaXplLCBpbm5lcldpZHRoLCBpbm5lckhlaWdodCwgbWF4V2lkdGgsIG1heEhlaWdodCwgbWluV2lkdGgsIG1pbkhlaWdodCkge1xuICAgIG1heFdpZHRoID0gZ2V0UGl4ZWxTaXplKG1heFdpZHRoLCBwYXJlbnRTaXplLndpZHRoLCBpbm5lcldpZHRoLCBpbm5lckhlaWdodCk7XG4gICAgbWF4SGVpZ2h0ID0gZ2V0UGl4ZWxTaXplKG1heEhlaWdodCwgcGFyZW50U2l6ZS5oZWlnaHQsIGlubmVyV2lkdGgsIGlubmVySGVpZ2h0KTtcbiAgICBtaW5XaWR0aCA9IGdldFBpeGVsU2l6ZShtaW5XaWR0aCwgcGFyZW50U2l6ZS53aWR0aCwgaW5uZXJXaWR0aCwgaW5uZXJIZWlnaHQpO1xuICAgIG1pbkhlaWdodCA9IGdldFBpeGVsU2l6ZShtaW5IZWlnaHQsIHBhcmVudFNpemUuaGVpZ2h0LCBpbm5lcldpZHRoLCBpbm5lckhlaWdodCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWF4V2lkdGg6IHR5cGVvZiBtYXhXaWR0aCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBOdW1iZXIobWF4V2lkdGgpLFxuICAgICAgICBtYXhIZWlnaHQ6IHR5cGVvZiBtYXhIZWlnaHQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogTnVtYmVyKG1heEhlaWdodCksXG4gICAgICAgIG1pbldpZHRoOiB0eXBlb2YgbWluV2lkdGggPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogTnVtYmVyKG1pbldpZHRoKSxcbiAgICAgICAgbWluSGVpZ2h0OiB0eXBlb2YgbWluSGVpZ2h0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE51bWJlcihtaW5IZWlnaHQpLFxuICAgIH07XG59O1xuLyoqXG4gKiB0cmFuc2Zvcm0gVCB8IFtULCBUXSB0byBbVCwgVF1cbiAqIEBwYXJhbSB2YWxcbiAqIEByZXR1cm5zXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxudmFyIG5vcm1hbGl6ZVRvUGFpciA9IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIChBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsLCB2YWxdKTsgfTtcbnZhciBkZWZpbmVkUHJvcHMgPSBbXG4gICAgJ2FzJyxcbiAgICAncmVmJyxcbiAgICAnc3R5bGUnLFxuICAgICdjbGFzc05hbWUnLFxuICAgICdncmlkJyxcbiAgICAnc25hcCcsXG4gICAgJ2JvdW5kcycsXG4gICAgJ2JvdW5kc0J5RGlyZWN0aW9uJyxcbiAgICAnc2l6ZScsXG4gICAgJ2RlZmF1bHRTaXplJyxcbiAgICAnbWluV2lkdGgnLFxuICAgICdtaW5IZWlnaHQnLFxuICAgICdtYXhXaWR0aCcsXG4gICAgJ21heEhlaWdodCcsXG4gICAgJ2xvY2tBc3BlY3RSYXRpbycsXG4gICAgJ2xvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGgnLFxuICAgICdsb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodCcsXG4gICAgJ2VuYWJsZScsXG4gICAgJ2hhbmRsZVN0eWxlcycsXG4gICAgJ2hhbmRsZUNsYXNzZXMnLFxuICAgICdoYW5kbGVXcmFwcGVyU3R5bGUnLFxuICAgICdoYW5kbGVXcmFwcGVyQ2xhc3MnLFxuICAgICdjaGlsZHJlbicsXG4gICAgJ29uUmVzaXplU3RhcnQnLFxuICAgICdvblJlc2l6ZScsXG4gICAgJ29uUmVzaXplU3RvcCcsXG4gICAgJ2hhbmRsZUNvbXBvbmVudCcsXG4gICAgJ3NjYWxlJyxcbiAgICAncmVzaXplUmF0aW8nLFxuICAgICdzbmFwR2FwJyxcbl07XG4vLyBIQUNLOiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY2FsY3VsYXRlICUgc2l6ZS5cbnZhciBiYXNlQ2xhc3NOYW1lID0gJ19fcmVzaXphYmxlX2Jhc2VfXyc7XG52YXIgUmVzaXphYmxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZXNpemFibGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVzaXphYmxlKHByb3BzKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnJhdGlvID0gMTtcbiAgICAgICAgX3RoaXMucmVzaXphYmxlID0gbnVsbDtcbiAgICAgICAgLy8gRm9yIHBhcmVudCBib3VuZGFyeVxuICAgICAgICBfdGhpcy5wYXJlbnRMZWZ0ID0gMDtcbiAgICAgICAgX3RoaXMucGFyZW50VG9wID0gMDtcbiAgICAgICAgLy8gRm9yIGJvdW5kYXJ5XG4gICAgICAgIF90aGlzLnJlc2l6YWJsZUxlZnQgPSAwO1xuICAgICAgICBfdGhpcy5yZXNpemFibGVSaWdodCA9IDA7XG4gICAgICAgIF90aGlzLnJlc2l6YWJsZVRvcCA9IDA7XG4gICAgICAgIF90aGlzLnJlc2l6YWJsZUJvdHRvbSA9IDA7XG4gICAgICAgIC8vIEZvciB0YXJnZXQgYm91bmRhcnlcbiAgICAgICAgX3RoaXMudGFyZ2V0TGVmdCA9IDA7XG4gICAgICAgIF90aGlzLnRhcmdldFRvcCA9IDA7XG4gICAgICAgIF90aGlzLmFwcGVuZEJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLnJlc2l6YWJsZSB8fCAhX3RoaXMud2luZG93KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gX3RoaXMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IF90aGlzLndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAnc2NhbGUoMCwgMCknO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5mbGV4ID0gJzAgMCAxMDAlJztcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChiYXNlQ2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9IGJhc2VDbGFzc05hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMucmVtb3ZlQmFzZSA9IGZ1bmN0aW9uIChiYXNlKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gX3RoaXMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGJhc2UpO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGlzUmVzaXppbmc6IGZhbHNlLFxuICAgICAgICAgICAgd2lkdGg6IChfYiA9IChfYSA9IF90aGlzLnByb3BzU2l6ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLndpZHRoKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnYXV0bycsXG4gICAgICAgICAgICBoZWlnaHQ6IChfZCA9IChfYyA9IF90aGlzLnByb3BzU2l6ZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmhlaWdodCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJ2F1dG8nLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiAncmlnaHQnLFxuICAgICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJhY2tncm91bmRTdHlsZToge1xuICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLDAsMCwwKScsXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICAgICB6SW5kZXg6IDk5OTksXG4gICAgICAgICAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgICAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogJzAnLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAnMCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmxleEJhc2lzOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLm9uUmVzaXplU3RhcnQgPSBfdGhpcy5vblJlc2l6ZVN0YXJ0LmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5vbk1vdXNlTW92ZSA9IF90aGlzLm9uTW91c2VNb3ZlLmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5vbk1vdXNlVXAgPSBfdGhpcy5vbk1vdXNlVXAuYmluZChfdGhpcyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlc2l6YWJsZS5wcm90b3R5cGUsIFwicGFyZW50Tm9kZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzaXphYmxlLnBhcmVudE5vZGU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVzaXphYmxlLnByb3RvdHlwZSwgXCJ3aW5kb3dcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5yZXNpemFibGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzaXphYmxlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVzaXphYmxlLnByb3RvdHlwZSwgXCJwcm9wc1NpemVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLnNpemUgfHwgdGhpcy5wcm9wcy5kZWZhdWx0U2l6ZSB8fCBERUZBVUxUX1NJWkU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVzaXphYmxlLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgd2lkdGggPSAwO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemFibGUgJiYgdGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3JnV2lkdGggPSB0aGlzLnJlc2l6YWJsZS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgICAgICB2YXIgb3JnSGVpZ2h0ID0gdGhpcy5yZXNpemFibGUub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgIC8vIEhBQ0s6IFNldCBwb3NpdGlvbiBgcmVsYXRpdmVgIHRvIGdldCBwYXJlbnQgc2l6ZS5cbiAgICAgICAgICAgICAgICAvLyAgICAgICBUaGlzIGlzIGJlY2F1c2Ugd2hlbiByZS1yZXNpemFibGUgc2V0IGBhYnNvbHV0ZWAsIEkgY2FuIG5vdCBnZXQgYmFzZSB3aWR0aCBjb3JyZWN0bHkuXG4gICAgICAgICAgICAgICAgdmFyIG9yZ1Bvc2l0aW9uID0gdGhpcy5yZXNpemFibGUuc3R5bGUucG9zaXRpb247XG4gICAgICAgICAgICAgICAgaWYgKG9yZ1Bvc2l0aW9uICE9PSAncmVsYXRpdmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzaXphYmxlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSU5GTzogVXNlIG9yaWdpbmFsIHdpZHRoIG9yIGhlaWdodCBpZiBzZXQgYXV0by5cbiAgICAgICAgICAgICAgICB3aWR0aCA9IHRoaXMucmVzaXphYmxlLnN0eWxlLndpZHRoICE9PSAnYXV0bycgPyB0aGlzLnJlc2l6YWJsZS5vZmZzZXRXaWR0aCA6IG9yZ1dpZHRoO1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IHRoaXMucmVzaXphYmxlLnN0eWxlLmhlaWdodCAhPT0gJ2F1dG8nID8gdGhpcy5yZXNpemFibGUub2Zmc2V0SGVpZ2h0IDogb3JnSGVpZ2h0O1xuICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgcG9zaXRpb25cbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6YWJsZS5zdHlsZS5wb3NpdGlvbiA9IG9yZ1Bvc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlc2l6YWJsZS5wcm90b3R5cGUsIFwic2l6ZVN0eWxlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLnByb3BzLnNpemU7XG4gICAgICAgICAgICB2YXIgZ2V0U2l6ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBfdGhpcy5zdGF0ZVtrZXldID09PSAndW5kZWZpbmVkJyB8fCBfdGhpcy5zdGF0ZVtrZXldID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdhdXRvJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLnByb3BzU2l6ZSAmJiBfdGhpcy5wcm9wc1NpemVba2V5XSAmJiAoKF9hID0gX3RoaXMucHJvcHNTaXplW2tleV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b1N0cmluZygpLmVuZHNXaXRoKCclJykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5zdGF0ZVtrZXldLnRvU3RyaW5nKCkuZW5kc1dpdGgoJyUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnN0YXRlW2tleV0udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U2l6ZSA9IF90aGlzLmdldFBhcmVudFNpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gTnVtYmVyKF90aGlzLnN0YXRlW2tleV0udG9TdHJpbmcoKS5yZXBsYWNlKCdweCcsICcnKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwZXJjZW50ID0gKHZhbHVlIC8gcGFyZW50U2l6ZVtrZXldKSAqIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBlcmNlbnQgKyBcIiVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldFN0cmluZ1NpemUoX3RoaXMuc3RhdGVba2V5XSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gc2l6ZSAmJiB0eXBlb2Ygc2l6ZS53aWR0aCAhPT0gJ3VuZGVmaW5lZCcgJiYgIXRoaXMuc3RhdGUuaXNSZXNpemluZ1xuICAgICAgICAgICAgICAgID8gZ2V0U3RyaW5nU2l6ZShzaXplLndpZHRoKVxuICAgICAgICAgICAgICAgIDogZ2V0U2l6ZSgnd2lkdGgnKTtcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBzaXplICYmIHR5cGVvZiBzaXplLmhlaWdodCAhPT0gJ3VuZGVmaW5lZCcgJiYgIXRoaXMuc3RhdGUuaXNSZXNpemluZ1xuICAgICAgICAgICAgICAgID8gZ2V0U3RyaW5nU2l6ZShzaXplLmhlaWdodClcbiAgICAgICAgICAgICAgICA6IGdldFNpemUoJ2hlaWdodCcpO1xuICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5nZXRQYXJlbnRTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiB0aGlzLndpbmRvdy5pbm5lcldpZHRoLCBoZWlnaHQ6IHRoaXMud2luZG93LmlubmVySGVpZ2h0IH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJhc2UgPSB0aGlzLmFwcGVuZEJhc2UoKTtcbiAgICAgICAgaWYgKCFiYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gSU5GTzogVG8gY2FsY3VsYXRlIHBhcmVudCB3aWR0aCB3aXRoIGZsZXggbGF5b3V0XG4gICAgICAgIHZhciB3cmFwQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgd3JhcCA9IHRoaXMucGFyZW50Tm9kZS5zdHlsZS5mbGV4V3JhcDtcbiAgICAgICAgaWYgKHdyYXAgIT09ICd3cmFwJykge1xuICAgICAgICAgICAgd3JhcENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlLnN0eWxlLmZsZXhXcmFwID0gJ3dyYXAnO1xuICAgICAgICAgICAgLy8gSEFDSzogVXNlIHJlbGF0aXZlIHRvIGdldCBwYXJlbnQgcGFkZGluZyBzaXplXG4gICAgICAgIH1cbiAgICAgICAgYmFzZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgIGJhc2Uuc3R5bGUubWluV2lkdGggPSAnMTAwJSc7XG4gICAgICAgIGJhc2Uuc3R5bGUubWluSGVpZ2h0ID0gJzEwMCUnO1xuICAgICAgICB2YXIgc2l6ZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBiYXNlLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBiYXNlLm9mZnNldEhlaWdodCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHdyYXBDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUuc3R5bGUuZmxleFdyYXAgPSB3cmFwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQmFzZShiYXNlKTtcbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmJpbmRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Nb3VzZU1vdmUsIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS51bmJpbmRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLndpbmRvdykge1xuICAgICAgICAgICAgdGhpcy53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Nb3VzZU1vdmUsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uTW91c2VVcCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXNpemFibGUgfHwgIXRoaXMud2luZG93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB0aGlzLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMucmVzaXphYmxlKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy5zdGF0ZS53aWR0aCB8fCB0aGlzLnNpemUud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuc3RhdGUuaGVpZ2h0IHx8IHRoaXMuc2l6ZS5oZWlnaHQsXG4gICAgICAgICAgICBmbGV4QmFzaXM6IGNvbXB1dGVkU3R5bGUuZmxleEJhc2lzICE9PSAnYXV0bycgPyBjb21wdXRlZFN0eWxlLmZsZXhCYXNpcyA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHRoaXMudW5iaW5kRXZlbnRzKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUuY3JlYXRlU2l6ZUZvckNzc1Byb3BlcnR5ID0gZnVuY3Rpb24gKG5ld1NpemUsIGtpbmQpIHtcbiAgICAgICAgdmFyIHByb3BzU2l6ZSA9IHRoaXMucHJvcHNTaXplICYmIHRoaXMucHJvcHNTaXplW2tpbmRdO1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZVtraW5kXSA9PT0gJ2F1dG8nICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlLm9yaWdpbmFsW2tpbmRdID09PSBuZXdTaXplICYmXG4gICAgICAgICAgICAodHlwZW9mIHByb3BzU2l6ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcHNTaXplID09PSAnYXV0bycpXG4gICAgICAgICAgICA/ICdhdXRvJ1xuICAgICAgICAgICAgOiBuZXdTaXplO1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5jYWxjdWxhdGVOZXdNYXhGcm9tQm91bmRhcnkgPSBmdW5jdGlvbiAobWF4V2lkdGgsIG1heEhlaWdodCkge1xuICAgICAgICB2YXIgYm91bmRzQnlEaXJlY3Rpb24gPSB0aGlzLnByb3BzLmJvdW5kc0J5RGlyZWN0aW9uO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5zdGF0ZS5kaXJlY3Rpb247XG4gICAgICAgIHZhciB3aWR0aEJ5RGlyZWN0aW9uID0gYm91bmRzQnlEaXJlY3Rpb24gJiYgaGFzRGlyZWN0aW9uKCdsZWZ0JywgZGlyZWN0aW9uKTtcbiAgICAgICAgdmFyIGhlaWdodEJ5RGlyZWN0aW9uID0gYm91bmRzQnlEaXJlY3Rpb24gJiYgaGFzRGlyZWN0aW9uKCd0b3AnLCBkaXJlY3Rpb24pO1xuICAgICAgICB2YXIgYm91bmRXaWR0aDtcbiAgICAgICAgdmFyIGJvdW5kSGVpZ2h0O1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09ICdwYXJlbnQnKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50XzEgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAocGFyZW50XzEpIHtcbiAgICAgICAgICAgICAgICBib3VuZFdpZHRoID0gd2lkdGhCeURpcmVjdGlvblxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMucmVzaXphYmxlUmlnaHQgLSB0aGlzLnBhcmVudExlZnRcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJlbnRfMS5vZmZzZXRXaWR0aCArICh0aGlzLnBhcmVudExlZnQgLSB0aGlzLnJlc2l6YWJsZUxlZnQpO1xuICAgICAgICAgICAgICAgIGJvdW5kSGVpZ2h0ID0gaGVpZ2h0QnlEaXJlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnJlc2l6YWJsZUJvdHRvbSAtIHRoaXMucGFyZW50VG9wXG4gICAgICAgICAgICAgICAgICAgIDogcGFyZW50XzEub2Zmc2V0SGVpZ2h0ICsgKHRoaXMucGFyZW50VG9wIC0gdGhpcy5yZXNpemFibGVUb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSAnd2luZG93Jykge1xuICAgICAgICAgICAgaWYgKHRoaXMud2luZG93KSB7XG4gICAgICAgICAgICAgICAgYm91bmRXaWR0aCA9IHdpZHRoQnlEaXJlY3Rpb24gPyB0aGlzLnJlc2l6YWJsZVJpZ2h0IDogdGhpcy53aW5kb3cuaW5uZXJXaWR0aCAtIHRoaXMucmVzaXphYmxlTGVmdDtcbiAgICAgICAgICAgICAgICBib3VuZEhlaWdodCA9IGhlaWdodEJ5RGlyZWN0aW9uID8gdGhpcy5yZXNpemFibGVCb3R0b20gOiB0aGlzLndpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMucmVzaXphYmxlVG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuYm91bmRzKSB7XG4gICAgICAgICAgICBib3VuZFdpZHRoID0gd2lkdGhCeURpcmVjdGlvblxuICAgICAgICAgICAgICAgID8gdGhpcy5yZXNpemFibGVSaWdodCAtIHRoaXMudGFyZ2V0TGVmdFxuICAgICAgICAgICAgICAgIDogdGhpcy5wcm9wcy5ib3VuZHMub2Zmc2V0V2lkdGggKyAodGhpcy50YXJnZXRMZWZ0IC0gdGhpcy5yZXNpemFibGVMZWZ0KTtcbiAgICAgICAgICAgIGJvdW5kSGVpZ2h0ID0gaGVpZ2h0QnlEaXJlY3Rpb25cbiAgICAgICAgICAgICAgICA/IHRoaXMucmVzaXphYmxlQm90dG9tIC0gdGhpcy50YXJnZXRUb3BcbiAgICAgICAgICAgICAgICA6IHRoaXMucHJvcHMuYm91bmRzLm9mZnNldEhlaWdodCArICh0aGlzLnRhcmdldFRvcCAtIHRoaXMucmVzaXphYmxlVG9wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYm91bmRXaWR0aCAmJiBOdW1iZXIuaXNGaW5pdGUoYm91bmRXaWR0aCkpIHtcbiAgICAgICAgICAgIG1heFdpZHRoID0gbWF4V2lkdGggJiYgbWF4V2lkdGggPCBib3VuZFdpZHRoID8gbWF4V2lkdGggOiBib3VuZFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChib3VuZEhlaWdodCAmJiBOdW1iZXIuaXNGaW5pdGUoYm91bmRIZWlnaHQpKSB7XG4gICAgICAgICAgICBtYXhIZWlnaHQgPSBtYXhIZWlnaHQgJiYgbWF4SGVpZ2h0IDwgYm91bmRIZWlnaHQgPyBtYXhIZWlnaHQgOiBib3VuZEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtYXhXaWR0aDogbWF4V2lkdGgsIG1heEhlaWdodDogbWF4SGVpZ2h0IH07XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmNhbGN1bGF0ZU5ld1NpemVGcm9tRGlyZWN0aW9uID0gZnVuY3Rpb24gKGNsaWVudFgsIGNsaWVudFkpIHtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5wcm9wcy5zY2FsZSB8fCAxO1xuICAgICAgICB2YXIgX2EgPSBub3JtYWxpemVUb1BhaXIodGhpcy5wcm9wcy5yZXNpemVSYXRpbyB8fCAxKSwgcmVzaXplUmF0aW9YID0gX2FbMF0sIHJlc2l6ZVJhdGlvWSA9IF9hWzFdO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLnN0YXRlLCBkaXJlY3Rpb24gPSBfYi5kaXJlY3Rpb24sIG9yaWdpbmFsID0gX2Iub3JpZ2luYWw7XG4gICAgICAgIHZhciBfYyA9IHRoaXMucHJvcHMsIGxvY2tBc3BlY3RSYXRpbyA9IF9jLmxvY2tBc3BlY3RSYXRpbywgbG9ja0FzcGVjdFJhdGlvRXh0cmFIZWlnaHQgPSBfYy5sb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodCwgbG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aCA9IF9jLmxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGg7XG4gICAgICAgIHZhciBuZXdXaWR0aCA9IG9yaWdpbmFsLndpZHRoO1xuICAgICAgICB2YXIgbmV3SGVpZ2h0ID0gb3JpZ2luYWwuaGVpZ2h0O1xuICAgICAgICB2YXIgZXh0cmFIZWlnaHQgPSBsb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodCB8fCAwO1xuICAgICAgICB2YXIgZXh0cmFXaWR0aCA9IGxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGggfHwgMDtcbiAgICAgICAgaWYgKGhhc0RpcmVjdGlvbigncmlnaHQnLCBkaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IG9yaWdpbmFsLndpZHRoICsgKChjbGllbnRYIC0gb3JpZ2luYWwueCkgKiByZXNpemVSYXRpb1gpIC8gc2NhbGU7XG4gICAgICAgICAgICBpZiAobG9ja0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gKG5ld1dpZHRoIC0gZXh0cmFXaWR0aCkgLyB0aGlzLnJhdGlvICsgZXh0cmFIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0RpcmVjdGlvbignbGVmdCcsIGRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gb3JpZ2luYWwud2lkdGggLSAoKGNsaWVudFggLSBvcmlnaW5hbC54KSAqIHJlc2l6ZVJhdGlvWCkgLyBzY2FsZTtcbiAgICAgICAgICAgIGlmIChsb2NrQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSAobmV3V2lkdGggLSBleHRyYVdpZHRoKSAvIHRoaXMucmF0aW8gKyBleHRyYUhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzRGlyZWN0aW9uKCdib3R0b20nLCBkaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICBuZXdIZWlnaHQgPSBvcmlnaW5hbC5oZWlnaHQgKyAoKGNsaWVudFkgLSBvcmlnaW5hbC55KSAqIHJlc2l6ZVJhdGlvWSkgLyBzY2FsZTtcbiAgICAgICAgICAgIGlmIChsb2NrQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IChuZXdIZWlnaHQgLSBleHRyYUhlaWdodCkgKiB0aGlzLnJhdGlvICsgZXh0cmFXaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzRGlyZWN0aW9uKCd0b3AnLCBkaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICBuZXdIZWlnaHQgPSBvcmlnaW5hbC5oZWlnaHQgLSAoKGNsaWVudFkgLSBvcmlnaW5hbC55KSAqIHJlc2l6ZVJhdGlvWSkgLyBzY2FsZTtcbiAgICAgICAgICAgIGlmIChsb2NrQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IChuZXdIZWlnaHQgLSBleHRyYUhlaWdodCkgKiB0aGlzLnJhdGlvICsgZXh0cmFXaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuZXdXaWR0aDogbmV3V2lkdGgsIG5ld0hlaWdodDogbmV3SGVpZ2h0IH07XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLmNhbGN1bGF0ZU5ld1NpemVGcm9tQXNwZWN0UmF0aW8gPSBmdW5jdGlvbiAobmV3V2lkdGgsIG5ld0hlaWdodCwgbWF4LCBtaW4pIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgbG9ja0FzcGVjdFJhdGlvID0gX2EubG9ja0FzcGVjdFJhdGlvLCBsb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodCA9IF9hLmxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0LCBsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoID0gX2EubG9ja0FzcGVjdFJhdGlvRXh0cmFXaWR0aDtcbiAgICAgICAgdmFyIGNvbXB1dGVkTWluV2lkdGggPSB0eXBlb2YgbWluLndpZHRoID09PSAndW5kZWZpbmVkJyA/IDEwIDogbWluLndpZHRoO1xuICAgICAgICB2YXIgY29tcHV0ZWRNYXhXaWR0aCA9IHR5cGVvZiBtYXgud2lkdGggPT09ICd1bmRlZmluZWQnIHx8IG1heC53aWR0aCA8IDAgPyBuZXdXaWR0aCA6IG1heC53aWR0aDtcbiAgICAgICAgdmFyIGNvbXB1dGVkTWluSGVpZ2h0ID0gdHlwZW9mIG1pbi5oZWlnaHQgPT09ICd1bmRlZmluZWQnID8gMTAgOiBtaW4uaGVpZ2h0O1xuICAgICAgICB2YXIgY29tcHV0ZWRNYXhIZWlnaHQgPSB0eXBlb2YgbWF4LmhlaWdodCA9PT0gJ3VuZGVmaW5lZCcgfHwgbWF4LmhlaWdodCA8IDAgPyBuZXdIZWlnaHQgOiBtYXguaGVpZ2h0O1xuICAgICAgICB2YXIgZXh0cmFIZWlnaHQgPSBsb2NrQXNwZWN0UmF0aW9FeHRyYUhlaWdodCB8fCAwO1xuICAgICAgICB2YXIgZXh0cmFXaWR0aCA9IGxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGggfHwgMDtcbiAgICAgICAgaWYgKGxvY2tBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgdmFyIGV4dHJhTWluV2lkdGggPSAoY29tcHV0ZWRNaW5IZWlnaHQgLSBleHRyYUhlaWdodCkgKiB0aGlzLnJhdGlvICsgZXh0cmFXaWR0aDtcbiAgICAgICAgICAgIHZhciBleHRyYU1heFdpZHRoID0gKGNvbXB1dGVkTWF4SGVpZ2h0IC0gZXh0cmFIZWlnaHQpICogdGhpcy5yYXRpbyArIGV4dHJhV2lkdGg7XG4gICAgICAgICAgICB2YXIgZXh0cmFNaW5IZWlnaHQgPSAoY29tcHV0ZWRNaW5XaWR0aCAtIGV4dHJhV2lkdGgpIC8gdGhpcy5yYXRpbyArIGV4dHJhSGVpZ2h0O1xuICAgICAgICAgICAgdmFyIGV4dHJhTWF4SGVpZ2h0ID0gKGNvbXB1dGVkTWF4V2lkdGggLSBleHRyYVdpZHRoKSAvIHRoaXMucmF0aW8gKyBleHRyYUhlaWdodDtcbiAgICAgICAgICAgIHZhciBsb2NrZWRNaW5XaWR0aCA9IE1hdGgubWF4KGNvbXB1dGVkTWluV2lkdGgsIGV4dHJhTWluV2lkdGgpO1xuICAgICAgICAgICAgdmFyIGxvY2tlZE1heFdpZHRoID0gTWF0aC5taW4oY29tcHV0ZWRNYXhXaWR0aCwgZXh0cmFNYXhXaWR0aCk7XG4gICAgICAgICAgICB2YXIgbG9ja2VkTWluSGVpZ2h0ID0gTWF0aC5tYXgoY29tcHV0ZWRNaW5IZWlnaHQsIGV4dHJhTWluSGVpZ2h0KTtcbiAgICAgICAgICAgIHZhciBsb2NrZWRNYXhIZWlnaHQgPSBNYXRoLm1pbihjb21wdXRlZE1heEhlaWdodCwgZXh0cmFNYXhIZWlnaHQpO1xuICAgICAgICAgICAgbmV3V2lkdGggPSBjbGFtcChuZXdXaWR0aCwgbG9ja2VkTWluV2lkdGgsIGxvY2tlZE1heFdpZHRoKTtcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IGNsYW1wKG5ld0hlaWdodCwgbG9ja2VkTWluSGVpZ2h0LCBsb2NrZWRNYXhIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV3V2lkdGggPSBjbGFtcChuZXdXaWR0aCwgY29tcHV0ZWRNaW5XaWR0aCwgY29tcHV0ZWRNYXhXaWR0aCk7XG4gICAgICAgICAgICBuZXdIZWlnaHQgPSBjbGFtcChuZXdIZWlnaHQsIGNvbXB1dGVkTWluSGVpZ2h0LCBjb21wdXRlZE1heEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmV3V2lkdGg6IG5ld1dpZHRoLCBuZXdIZWlnaHQ6IG5ld0hlaWdodCB9O1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5zZXRCb3VuZGluZ0NsaWVudFJlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEZvciBwYXJlbnQgYm91bmRhcnlcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuYm91bmRzID09PSAncGFyZW50Jykge1xuICAgICAgICAgICAgdmFyIHBhcmVudF8yID0gdGhpcy5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmVudF8yKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudFJlY3QgPSBwYXJlbnRfMi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudExlZnQgPSBwYXJlbnRSZWN0LmxlZnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRUb3AgPSBwYXJlbnRSZWN0LnRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgdGFyZ2V0KGh0bWwgZWxlbWVudCkgYm91bmRhcnlcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuYm91bmRzICYmIHR5cGVvZiB0aGlzLnByb3BzLmJvdW5kcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXRSZWN0ID0gdGhpcy5wcm9wcy5ib3VuZHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB0aGlzLnRhcmdldExlZnQgPSB0YXJnZXRSZWN0LmxlZnQ7XG4gICAgICAgICAgICB0aGlzLnRhcmdldFRvcCA9IHRhcmdldFJlY3QudG9wO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvciBib3VuZGFyeVxuICAgICAgICBpZiAodGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMucmVzaXphYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBsZWZ0ID0gX2EubGVmdCwgdG9wXzEgPSBfYS50b3AsIHJpZ2h0ID0gX2EucmlnaHQsIGJvdHRvbSA9IF9hLmJvdHRvbTtcbiAgICAgICAgICAgIHRoaXMucmVzaXphYmxlTGVmdCA9IGxlZnQ7XG4gICAgICAgICAgICB0aGlzLnJlc2l6YWJsZVJpZ2h0ID0gcmlnaHQ7XG4gICAgICAgICAgICB0aGlzLnJlc2l6YWJsZVRvcCA9IHRvcF8xO1xuICAgICAgICAgICAgdGhpcy5yZXNpemFibGVCb3R0b20gPSBib3R0b207XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlc2l6YWJsZS5wcm90b3R5cGUub25SZXNpemVTdGFydCA9IGZ1bmN0aW9uIChldmVudCwgZGlyZWN0aW9uKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXNpemFibGUgfHwgIXRoaXMud2luZG93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsaWVudFggPSAwO1xuICAgICAgICB2YXIgY2xpZW50WSA9IDA7XG4gICAgICAgIGlmIChldmVudC5uYXRpdmVFdmVudCAmJiBpc01vdXNlRXZlbnQoZXZlbnQubmF0aXZlRXZlbnQpKSB7XG4gICAgICAgICAgICBjbGllbnRYID0gZXZlbnQubmF0aXZlRXZlbnQuY2xpZW50WDtcbiAgICAgICAgICAgIGNsaWVudFkgPSBldmVudC5uYXRpdmVFdmVudC5jbGllbnRZO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50Lm5hdGl2ZUV2ZW50ICYmIGlzVG91Y2hFdmVudChldmVudC5uYXRpdmVFdmVudCkpIHtcbiAgICAgICAgICAgIGNsaWVudFggPSBldmVudC5uYXRpdmVFdmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICAgICAgICBjbGllbnRZID0gZXZlbnQubmF0aXZlRXZlbnQudG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uUmVzaXplU3RhcnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgICAgIHZhciBzdGFydFJlc2l6ZSA9IHRoaXMucHJvcHMub25SZXNpemVTdGFydChldmVudCwgZGlyZWN0aW9uLCB0aGlzLnJlc2l6YWJsZSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0UmVzaXplID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZpeCAjMTY4XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNpemUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zaXplLmhlaWdodCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wcm9wcy5zaXplLmhlaWdodCAhPT0gdGhpcy5zdGF0ZS5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaGVpZ2h0OiB0aGlzLnByb3BzLnNpemUuaGVpZ2h0IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNpemUud2lkdGggIT09ICd1bmRlZmluZWQnICYmIHRoaXMucHJvcHMuc2l6ZS53aWR0aCAhPT0gdGhpcy5zdGF0ZS53aWR0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB3aWR0aDogdGhpcy5wcm9wcy5zaXplLndpZHRoIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZvciBsb2NrQXNwZWN0UmF0aW8gY2FzZVxuICAgICAgICB0aGlzLnJhdGlvID1cbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLmxvY2tBc3BlY3RSYXRpbyA9PT0gJ251bWJlcicgPyB0aGlzLnByb3BzLmxvY2tBc3BlY3RSYXRpbyA6IHRoaXMuc2l6ZS53aWR0aCAvIHRoaXMuc2l6ZS5oZWlnaHQ7XG4gICAgICAgIHZhciBmbGV4QmFzaXM7XG4gICAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gdGhpcy53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnJlc2l6YWJsZSk7XG4gICAgICAgIGlmIChjb21wdXRlZFN0eWxlLmZsZXhCYXNpcyAhPT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50XzMgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAocGFyZW50XzMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGlyID0gdGhpcy53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnRfMykuZmxleERpcmVjdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLmZsZXhEaXIgPSBkaXIuc3RhcnRzV2l0aCgncm93JykgPyAncm93JyA6ICdjb2x1bW4nO1xuICAgICAgICAgICAgICAgIGZsZXhCYXNpcyA9IGNvbXB1dGVkU3R5bGUuZmxleEJhc2lzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZvciBib3VuZGFyeVxuICAgICAgICB0aGlzLnNldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICAgICAgdmFyIHN0YXRlID0ge1xuICAgICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgICAgICB4OiBjbGllbnRYLFxuICAgICAgICAgICAgICAgIHk6IGNsaWVudFksXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuc2l6ZS53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuc2l6ZS5oZWlnaHQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNSZXNpemluZzogdHJ1ZSxcbiAgICAgICAgICAgIGJhY2tncm91bmRTdHlsZTogX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMuc3RhdGUuYmFja2dyb3VuZFN0eWxlKSwgeyBjdXJzb3I6IHRoaXMud2luZG93LmdldENvbXB1dGVkU3R5bGUoZXZlbnQudGFyZ2V0KS5jdXJzb3IgfHwgJ2F1dG8nIH0pLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICAgICAgICBmbGV4QmFzaXM6IGZsZXhCYXNpcyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLm9uTW91c2VNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nIHx8ICF0aGlzLnJlc2l6YWJsZSB8fCAhdGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53aW5kb3cuVG91Y2hFdmVudCAmJiBpc1RvdWNoRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZSBvbiBmYWlsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgbWF4V2lkdGggPSBfYS5tYXhXaWR0aCwgbWF4SGVpZ2h0ID0gX2EubWF4SGVpZ2h0LCBtaW5XaWR0aCA9IF9hLm1pbldpZHRoLCBtaW5IZWlnaHQgPSBfYS5taW5IZWlnaHQ7XG4gICAgICAgIHZhciBjbGllbnRYID0gaXNUb3VjaEV2ZW50KGV2ZW50KSA/IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCA6IGV2ZW50LmNsaWVudFg7XG4gICAgICAgIHZhciBjbGllbnRZID0gaXNUb3VjaEV2ZW50KGV2ZW50KSA/IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSA6IGV2ZW50LmNsaWVudFk7XG4gICAgICAgIHZhciBfYiA9IHRoaXMuc3RhdGUsIGRpcmVjdGlvbiA9IF9iLmRpcmVjdGlvbiwgb3JpZ2luYWwgPSBfYi5vcmlnaW5hbCwgd2lkdGggPSBfYi53aWR0aCwgaGVpZ2h0ID0gX2IuaGVpZ2h0O1xuICAgICAgICB2YXIgcGFyZW50U2l6ZSA9IHRoaXMuZ2V0UGFyZW50U2l6ZSgpO1xuICAgICAgICB2YXIgbWF4ID0gY2FsY3VsYXRlTmV3TWF4KHBhcmVudFNpemUsIHRoaXMud2luZG93LmlubmVyV2lkdGgsIHRoaXMud2luZG93LmlubmVySGVpZ2h0LCBtYXhXaWR0aCwgbWF4SGVpZ2h0LCBtaW5XaWR0aCwgbWluSGVpZ2h0KTtcbiAgICAgICAgbWF4V2lkdGggPSBtYXgubWF4V2lkdGg7XG4gICAgICAgIG1heEhlaWdodCA9IG1heC5tYXhIZWlnaHQ7XG4gICAgICAgIG1pbldpZHRoID0gbWF4Lm1pbldpZHRoO1xuICAgICAgICBtaW5IZWlnaHQgPSBtYXgubWluSGVpZ2h0O1xuICAgICAgICAvLyBDYWxjdWxhdGUgbmV3IHNpemVcbiAgICAgICAgdmFyIF9jID0gdGhpcy5jYWxjdWxhdGVOZXdTaXplRnJvbURpcmVjdGlvbihjbGllbnRYLCBjbGllbnRZKSwgbmV3SGVpZ2h0ID0gX2MubmV3SGVpZ2h0LCBuZXdXaWR0aCA9IF9jLm5ld1dpZHRoO1xuICAgICAgICAvLyBDYWxjdWxhdGUgbWF4IHNpemUgZnJvbSBib3VuZGFyeSBzZXR0aW5nc1xuICAgICAgICB2YXIgYm91bmRhcnlNYXggPSB0aGlzLmNhbGN1bGF0ZU5ld01heEZyb21Cb3VuZGFyeShtYXhXaWR0aCwgbWF4SGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc25hcCAmJiB0aGlzLnByb3BzLnNuYXAueCkge1xuICAgICAgICAgICAgbmV3V2lkdGggPSBmaW5kQ2xvc2VzdFNuYXAobmV3V2lkdGgsIHRoaXMucHJvcHMuc25hcC54LCB0aGlzLnByb3BzLnNuYXBHYXApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNuYXAgJiYgdGhpcy5wcm9wcy5zbmFwLnkpIHtcbiAgICAgICAgICAgIG5ld0hlaWdodCA9IGZpbmRDbG9zZXN0U25hcChuZXdIZWlnaHQsIHRoaXMucHJvcHMuc25hcC55LCB0aGlzLnByb3BzLnNuYXBHYXApO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgc2l6ZSBmcm9tIGFzcGVjdCByYXRpb1xuICAgICAgICB2YXIgbmV3U2l6ZSA9IHRoaXMuY2FsY3VsYXRlTmV3U2l6ZUZyb21Bc3BlY3RSYXRpbyhuZXdXaWR0aCwgbmV3SGVpZ2h0LCB7IHdpZHRoOiBib3VuZGFyeU1heC5tYXhXaWR0aCwgaGVpZ2h0OiBib3VuZGFyeU1heC5tYXhIZWlnaHQgfSwgeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0pO1xuICAgICAgICBuZXdXaWR0aCA9IG5ld1NpemUubmV3V2lkdGg7XG4gICAgICAgIG5ld0hlaWdodCA9IG5ld1NpemUubmV3SGVpZ2h0O1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5ncmlkKSB7XG4gICAgICAgICAgICB2YXIgbmV3R3JpZFdpZHRoID0gc25hcChuZXdXaWR0aCwgdGhpcy5wcm9wcy5ncmlkWzBdKTtcbiAgICAgICAgICAgIHZhciBuZXdHcmlkSGVpZ2h0ID0gc25hcChuZXdIZWlnaHQsIHRoaXMucHJvcHMuZ3JpZFsxXSk7XG4gICAgICAgICAgICB2YXIgZ2FwID0gdGhpcy5wcm9wcy5zbmFwR2FwIHx8IDA7XG4gICAgICAgICAgICB2YXIgdyA9IGdhcCA9PT0gMCB8fCBNYXRoLmFicyhuZXdHcmlkV2lkdGggLSBuZXdXaWR0aCkgPD0gZ2FwID8gbmV3R3JpZFdpZHRoIDogbmV3V2lkdGg7XG4gICAgICAgICAgICB2YXIgaCA9IGdhcCA9PT0gMCB8fCBNYXRoLmFicyhuZXdHcmlkSGVpZ2h0IC0gbmV3SGVpZ2h0KSA8PSBnYXAgPyBuZXdHcmlkSGVpZ2h0IDogbmV3SGVpZ2h0O1xuICAgICAgICAgICAgbmV3V2lkdGggPSB3O1xuICAgICAgICAgICAgbmV3SGVpZ2h0ID0gaDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsdGEgPSB7XG4gICAgICAgICAgICB3aWR0aDogbmV3V2lkdGggLSBvcmlnaW5hbC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogbmV3SGVpZ2h0IC0gb3JpZ2luYWwuaGVpZ2h0LFxuICAgICAgICB9O1xuICAgICAgICBpZiAod2lkdGggJiYgdHlwZW9mIHdpZHRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHdpZHRoLmVuZHNXaXRoKCclJykpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGVyY2VudCA9IChuZXdXaWR0aCAvIHBhcmVudFNpemUud2lkdGgpICogMTAwO1xuICAgICAgICAgICAgICAgIG5ld1dpZHRoID0gcGVyY2VudCArIFwiJVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod2lkdGguZW5kc1dpdGgoJ3Z3JykpIHtcbiAgICAgICAgICAgICAgICB2YXIgdncgPSAobmV3V2lkdGggLyB0aGlzLndpbmRvdy5pbm5lcldpZHRoKSAqIDEwMDtcbiAgICAgICAgICAgICAgICBuZXdXaWR0aCA9IHZ3ICsgXCJ2d1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod2lkdGguZW5kc1dpdGgoJ3ZoJykpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmggPSAobmV3V2lkdGggLyB0aGlzLndpbmRvdy5pbm5lckhlaWdodCkgKiAxMDA7XG4gICAgICAgICAgICAgICAgbmV3V2lkdGggPSB2aCArIFwidmhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVpZ2h0ICYmIHR5cGVvZiBoZWlnaHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoaGVpZ2h0LmVuZHNXaXRoKCclJykpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGVyY2VudCA9IChuZXdIZWlnaHQgLyBwYXJlbnRTaXplLmhlaWdodCkgKiAxMDA7XG4gICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID0gcGVyY2VudCArIFwiJVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGVpZ2h0LmVuZHNXaXRoKCd2dycpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZ3ID0gKG5ld0hlaWdodCAvIHRoaXMud2luZG93LmlubmVyV2lkdGgpICogMTAwO1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IHZ3ICsgXCJ2d1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGVpZ2h0LmVuZHNXaXRoKCd2aCcpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZoID0gKG5ld0hlaWdodCAvIHRoaXMud2luZG93LmlubmVySGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPSB2aCArIFwidmhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy5jcmVhdGVTaXplRm9yQ3NzUHJvcGVydHkobmV3V2lkdGgsICd3aWR0aCcpLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmNyZWF0ZVNpemVGb3JDc3NQcm9wZXJ0eShuZXdIZWlnaHQsICdoZWlnaHQnKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuZmxleERpciA9PT0gJ3JvdycpIHtcbiAgICAgICAgICAgIG5ld1N0YXRlLmZsZXhCYXNpcyA9IG5ld1N0YXRlLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZmxleERpciA9PT0gJ2NvbHVtbicpIHtcbiAgICAgICAgICAgIG5ld1N0YXRlLmZsZXhCYXNpcyA9IG5ld1N0YXRlLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2lkdGhDaGFuZ2VkID0gdGhpcy5zdGF0ZS53aWR0aCAhPT0gbmV3U3RhdGUud2lkdGg7XG4gICAgICAgIHZhciBoZWlnaHRDaGFuZ2VkID0gdGhpcy5zdGF0ZS5oZWlnaHQgIT09IG5ld1N0YXRlLmhlaWdodDtcbiAgICAgICAgdmFyIGZsZXhCYXNlQ2hhbmdlZCA9IHRoaXMuc3RhdGUuZmxleEJhc2lzICE9PSBuZXdTdGF0ZS5mbGV4QmFzaXM7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gd2lkdGhDaGFuZ2VkIHx8IGhlaWdodENoYW5nZWQgfHwgZmxleEJhc2VDaGFuZ2VkO1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgLy8gRm9yIHYxOCwgdXBkYXRlIHN0YXRlIHN5bmNcbiAgICAgICAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25SZXNpemUpIHtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vblJlc2l6ZShldmVudCwgZGlyZWN0aW9uLCB0aGlzLnJlc2l6YWJsZSwgZGVsdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLm9uTW91c2VVcCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB2YXIgX2MgPSB0aGlzLnN0YXRlLCBpc1Jlc2l6aW5nID0gX2MuaXNSZXNpemluZywgZGlyZWN0aW9uID0gX2MuZGlyZWN0aW9uLCBvcmlnaW5hbCA9IF9jLm9yaWdpbmFsO1xuICAgICAgICBpZiAoIWlzUmVzaXppbmcgfHwgIXRoaXMucmVzaXphYmxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlbHRhID0ge1xuICAgICAgICAgICAgd2lkdGg6IHRoaXMuc2l6ZS53aWR0aCAtIG9yaWdpbmFsLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnNpemUuaGVpZ2h0IC0gb3JpZ2luYWwuaGVpZ2h0LFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vblJlc2l6ZVN0b3ApIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25SZXNpemVTdG9wKGV2ZW50LCBkaXJlY3Rpb24sIHRoaXMucmVzaXphYmxlLCBkZWx0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHdpZHRoOiAoX2EgPSB0aGlzLnByb3BzLnNpemUud2lkdGgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdhdXRvJywgaGVpZ2h0OiAoX2IgPSB0aGlzLnByb3BzLnNpemUuaGVpZ2h0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnYXV0bycgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bmJpbmRFdmVudHMoKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGJhY2tncm91bmRTdHlsZTogX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMuc3RhdGUuYmFja2dyb3VuZFN0eWxlKSwgeyBjdXJzb3I6ICdhdXRvJyB9KSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZXNpemFibGUucHJvdG90eXBlLnVwZGF0ZVNpemUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgd2lkdGg6IChfYSA9IHNpemUud2lkdGgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdhdXRvJywgaGVpZ2h0OiAoX2IgPSBzaXplLmhlaWdodCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJ2F1dG8nIH0pO1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5yZW5kZXJSZXNpemVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBlbmFibGUgPSBfYS5lbmFibGUsIGhhbmRsZVN0eWxlcyA9IF9hLmhhbmRsZVN0eWxlcywgaGFuZGxlQ2xhc3NlcyA9IF9hLmhhbmRsZUNsYXNzZXMsIGhhbmRsZVdyYXBwZXJTdHlsZSA9IF9hLmhhbmRsZVdyYXBwZXJTdHlsZSwgaGFuZGxlV3JhcHBlckNsYXNzID0gX2EuaGFuZGxlV3JhcHBlckNsYXNzLCBoYW5kbGVDb21wb25lbnQgPSBfYS5oYW5kbGVDb21wb25lbnQ7XG4gICAgICAgIGlmICghZW5hYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzaXplcnMgPSBPYmplY3Qua2V5cyhlbmFibGUpLm1hcChmdW5jdGlvbiAoZGlyKSB7XG4gICAgICAgICAgICBpZiAoZW5hYmxlW2Rpcl0gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlc2l6ZXIsIHsga2V5OiBkaXIsIGRpcmVjdGlvbjogZGlyLCBvblJlc2l6ZVN0YXJ0OiBfdGhpcy5vblJlc2l6ZVN0YXJ0LCByZXBsYWNlU3R5bGVzOiBoYW5kbGVTdHlsZXMgJiYgaGFuZGxlU3R5bGVzW2Rpcl0sIGNsYXNzTmFtZTogaGFuZGxlQ2xhc3NlcyAmJiBoYW5kbGVDbGFzc2VzW2Rpcl0gfSwgaGFuZGxlQ29tcG9uZW50ICYmIGhhbmRsZUNvbXBvbmVudFtkaXJdID8gaGFuZGxlQ29tcG9uZW50W2Rpcl0gOiBudWxsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vICM5MyBXcmFwIHRoZSByZXNpemUgYm94IGluIHNwYW4gKHdpbGwgbm90IGJyZWFrIDEwMCUgd2lkdGgvaGVpZ2h0KVxuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGhhbmRsZVdyYXBwZXJDbGFzcywgc3R5bGU6IGhhbmRsZVdyYXBwZXJTdHlsZSB9LCByZXNpemVycykpO1xuICAgIH07XG4gICAgUmVzaXphYmxlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBleHRlbmRzUHJvcHMgPSBPYmplY3Qua2V5cyh0aGlzLnByb3BzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgICAgICBpZiAoZGVmaW5lZFByb3BzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWNjW2tleV0gPSBfdGhpcy5wcm9wc1trZXldO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuICAgICAgICB2YXIgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7IHBvc2l0aW9uOiAncmVsYXRpdmUnLCB1c2VyU2VsZWN0OiB0aGlzLnN0YXRlLmlzUmVzaXppbmcgPyAnbm9uZScgOiAnYXV0bycgfSwgdGhpcy5wcm9wcy5zdHlsZSksIHRoaXMuc2l6ZVN0eWxlKSwgeyBtYXhXaWR0aDogdGhpcy5wcm9wcy5tYXhXaWR0aCwgbWF4SGVpZ2h0OiB0aGlzLnByb3BzLm1heEhlaWdodCwgbWluV2lkdGg6IHRoaXMucHJvcHMubWluV2lkdGgsIG1pbkhlaWdodDogdGhpcy5wcm9wcy5taW5IZWlnaHQsIGJveFNpemluZzogJ2JvcmRlci1ib3gnLCBmbGV4U2hyaW5rOiAwIH0pO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5mbGV4QmFzaXMpIHtcbiAgICAgICAgICAgIHN0eWxlLmZsZXhCYXNpcyA9IHRoaXMuc3RhdGUuZmxleEJhc2lzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBXcmFwcGVyID0gdGhpcy5wcm9wcy5hcyB8fCAnZGl2JztcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZXIsIF9fYXNzaWduKHsgc3R5bGU6IHN0eWxlLCBjbGFzc05hbWU6IHRoaXMucHJvcHMuY2xhc3NOYW1lIH0sIGV4dGVuZHNQcm9wcywgeyBcbiAgICAgICAgICAgIC8vIGByZWZgIGlzIGFmdGVyIGBleHRlbmRzUHJvcHNgIHRvIGVuc3VyZSB0aGlzIG9uZSB3aW5zIG92ZXIgYSB2ZXJzaW9uXG4gICAgICAgICAgICAvLyBwYXNzZWQgaW5cbiAgICAgICAgICAgIHJlZjogZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYykge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZXNpemFibGUgPSBjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gfSksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmlzUmVzaXppbmcgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IHN0eWxlOiB0aGlzLnN0YXRlLmJhY2tncm91bmRTdHlsZSB9KSxcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICB0aGlzLnJlbmRlclJlc2l6ZXIoKSkpO1xuICAgIH07XG4gICAgUmVzaXphYmxlLmRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgYXM6ICdkaXYnLFxuICAgICAgICBvblJlc2l6ZVN0YXJ0OiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uUmVzaXplOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uUmVzaXplU3RvcDogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBlbmFibGU6IHtcbiAgICAgICAgICAgIHRvcDogdHJ1ZSxcbiAgICAgICAgICAgIHJpZ2h0OiB0cnVlLFxuICAgICAgICAgICAgYm90dG9tOiB0cnVlLFxuICAgICAgICAgICAgbGVmdDogdHJ1ZSxcbiAgICAgICAgICAgIHRvcFJpZ2h0OiB0cnVlLFxuICAgICAgICAgICAgYm90dG9tUmlnaHQ6IHRydWUsXG4gICAgICAgICAgICBib3R0b21MZWZ0OiB0cnVlLFxuICAgICAgICAgICAgdG9wTGVmdDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgc3R5bGU6IHt9LFxuICAgICAgICBncmlkOiBbMSwgMV0sXG4gICAgICAgIGxvY2tBc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgICAgIGxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGg6IDAsXG4gICAgICAgIGxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0OiAwLFxuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgcmVzaXplUmF0aW86IDEsXG4gICAgICAgIHNuYXBHYXA6IDAsXG4gICAgfTtcbiAgICByZXR1cm4gUmVzaXphYmxlO1xufShSZWFjdC5QdXJlQ29tcG9uZW50KSk7XG5leHBvcnQgeyBSZXNpemFibGUgfTtcbiIsInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIHJvd1NpemVCYXNlID0ge1xuICAgIHdpZHRoOiAnMTAwJScsXG4gICAgaGVpZ2h0OiAnMTBweCcsXG4gICAgdG9wOiAnMHB4JyxcbiAgICBsZWZ0OiAnMHB4JyxcbiAgICBjdXJzb3I6ICdyb3ctcmVzaXplJyxcbn07XG52YXIgY29sU2l6ZUJhc2UgPSB7XG4gICAgd2lkdGg6ICcxMHB4JyxcbiAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICB0b3A6ICcwcHgnLFxuICAgIGxlZnQ6ICcwcHgnLFxuICAgIGN1cnNvcjogJ2NvbC1yZXNpemUnLFxufTtcbnZhciBlZGdlQmFzZSA9IHtcbiAgICB3aWR0aDogJzIwcHgnLFxuICAgIGhlaWdodDogJzIwcHgnLFxuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxufTtcbnZhciBzdHlsZXMgPSB7XG4gICAgdG9wOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcm93U2l6ZUJhc2UpLCB7IHRvcDogJy01cHgnIH0pLFxuICAgIHJpZ2h0OiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29sU2l6ZUJhc2UpLCB7IGxlZnQ6IHVuZGVmaW5lZCwgcmlnaHQ6ICctNXB4JyB9KSxcbiAgICBib3R0b206IF9fYXNzaWduKF9fYXNzaWduKHt9LCByb3dTaXplQmFzZSksIHsgdG9wOiB1bmRlZmluZWQsIGJvdHRvbTogJy01cHgnIH0pLFxuICAgIGxlZnQ6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb2xTaXplQmFzZSksIHsgbGVmdDogJy01cHgnIH0pLFxuICAgIHRvcFJpZ2h0OiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZWRnZUJhc2UpLCB7IHJpZ2h0OiAnLTEwcHgnLCB0b3A6ICctMTBweCcsIGN1cnNvcjogJ25lLXJlc2l6ZScgfSksXG4gICAgYm90dG9tUmlnaHQ6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBlZGdlQmFzZSksIHsgcmlnaHQ6ICctMTBweCcsIGJvdHRvbTogJy0xMHB4JywgY3Vyc29yOiAnc2UtcmVzaXplJyB9KSxcbiAgICBib3R0b21MZWZ0OiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZWRnZUJhc2UpLCB7IGxlZnQ6ICctMTBweCcsIGJvdHRvbTogJy0xMHB4JywgY3Vyc29yOiAnc3ctcmVzaXplJyB9KSxcbiAgICB0b3BMZWZ0OiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZWRnZUJhc2UpLCB7IGxlZnQ6ICctMTBweCcsIHRvcDogJy0xMHB4JywgY3Vyc29yOiAnbnctcmVzaXplJyB9KSxcbn07XG52YXIgUmVzaXplciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVzaXplciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZXNpemVyKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMub25Nb3VzZURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgX3RoaXMucHJvcHMub25SZXNpemVTdGFydChlLCBfdGhpcy5wcm9wcy5kaXJlY3Rpb24pO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5vblRvdWNoU3RhcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgX3RoaXMucHJvcHMub25SZXNpemVTdGFydChlLCBfdGhpcy5wcm9wcy5kaXJlY3Rpb24pO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJlc2l6ZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiB0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCAnJywgc3R5bGU6IF9fYXNzaWduKF9fYXNzaWduKHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIHVzZXJTZWxlY3Q6ICdub25lJyB9LCBzdHlsZXNbdGhpcy5wcm9wcy5kaXJlY3Rpb25dKSwgKHRoaXMucHJvcHMucmVwbGFjZVN0eWxlcyB8fCB7fSkpLCBvbk1vdXNlRG93bjogdGhpcy5vbk1vdXNlRG93biwgb25Ub3VjaFN0YXJ0OiB0aGlzLm9uVG91Y2hTdGFydCB9LCB0aGlzLnByb3BzLmNoaWxkcmVuKSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVzaXplcjtcbn0oUmVhY3QuUHVyZUNvbXBvbmVudCkpO1xuZXhwb3J0IHsgUmVzaXplciB9O1xuIiwiaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UnO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eSc7XG5pbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gd2l0aFNpZGVFZmZlY3QocmVkdWNlUHJvcHNUb1N0YXRlLCBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAodHlwZW9mIHJlZHVjZVByb3BzVG9TdGF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZWR1Y2VQcm9wc1RvU3RhdGUgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudCB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERpc3BsYXlOYW1lKFdyYXBwZWRDb21wb25lbnQpIHtcbiAgICByZXR1cm4gV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gd3JhcChXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKHR5cGVvZiBXcmFwcGVkQ29tcG9uZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgV3JhcHBlZENvbXBvbmVudCB0byBiZSBhIFJlYWN0IGNvbXBvbmVudC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbW91bnRlZEluc3RhbmNlcyA9IFtdO1xuICAgIHZhciBzdGF0ZTtcblxuICAgIGZ1bmN0aW9uIGVtaXRDaGFuZ2UoKSB7XG4gICAgICBzdGF0ZSA9IHJlZHVjZVByb3BzVG9TdGF0ZShtb3VudGVkSW5zdGFuY2VzLm1hcChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnByb3BzO1xuICAgICAgfSkpO1xuICAgICAgaGFuZGxlU3RhdGVDaGFuZ2VPbkNsaWVudChzdGF0ZSk7XG4gICAgfVxuXG4gICAgdmFyIFNpZGVFZmZlY3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gICAgICBfaW5oZXJpdHNMb29zZShTaWRlRWZmZWN0LCBfUHVyZUNvbXBvbmVudCk7XG5cbiAgICAgIGZ1bmN0aW9uIFNpZGVFZmZlY3QoKSB7XG4gICAgICAgIHJldHVybiBfUHVyZUNvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyeSB0byB1c2UgZGlzcGxheU5hbWUgb2Ygd3JhcHBlZCBjb21wb25lbnRcbiAgICAgIFNpZGVFZmZlY3QucGVlayA9IGZ1bmN0aW9uIHBlZWsoKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBfcHJvdG8gPSBTaWRlRWZmZWN0LnByb3RvdHlwZTtcblxuICAgICAgX3Byb3RvLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIG1vdW50ZWRJbnN0YW5jZXMucHVzaCh0aGlzKTtcbiAgICAgICAgZW1pdENoYW5nZSgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgICAgZW1pdENoYW5nZSgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IG1vdW50ZWRJbnN0YW5jZXMuaW5kZXhPZih0aGlzKTtcbiAgICAgICAgbW91bnRlZEluc3RhbmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBlbWl0Q2hhbmdlKCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwgdGhpcy5wcm9wcyk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gU2lkZUVmZmVjdDtcbiAgICB9KFB1cmVDb21wb25lbnQpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KFNpZGVFZmZlY3QsIFwiZGlzcGxheU5hbWVcIiwgXCJTaWRlRWZmZWN0KFwiICsgZ2V0RGlzcGxheU5hbWUoV3JhcHBlZENvbXBvbmVudCkgKyBcIilcIik7XG5cbiAgICByZXR1cm4gU2lkZUVmZmVjdDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgd2l0aFNpZGVFZmZlY3Q7XG4iLCIhZnVuY3Rpb24odCxlKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoXCJyZWFjdFwiKSk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJyZWFjdFwiXSxlKTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlJlYWN0Q29uZmV0dGk9ZShyZXF1aXJlKFwicmVhY3RcIikpOnQuUmVhY3RDb25mZXR0aT1lKHQuUmVhY3QpfShcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT17fTtmdW5jdGlvbiBuKHIpe2lmKGVbcl0pcmV0dXJuIGVbcl0uZXhwb3J0czt2YXIgaT1lW3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtyXS5jYWxsKGkuZXhwb3J0cyxpLGkuZXhwb3J0cyxuKSxpLmw9ITAsaS5leHBvcnRzfXJldHVybiBuLm09dCxuLmM9ZSxuLmQ9ZnVuY3Rpb24odCxlLHIpe24ubyh0LGUpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtlbnVtZXJhYmxlOiEwLGdldDpyfSl9LG4ucj1mdW5jdGlvbih0KXtcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSxuLnQ9ZnVuY3Rpb24odCxlKXtpZigxJmUmJih0PW4odCkpLDgmZSlyZXR1cm4gdDtpZig0JmUmJlwib2JqZWN0XCI9PXR5cGVvZiB0JiZ0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihuLnIociksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsXCJkZWZhdWx0XCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmXCJzdHJpbmdcIiE9dHlwZW9mIHQpZm9yKHZhciBpIGluIHQpbi5kKHIsaSxmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0uYmluZChudWxsLGkpKTtyZXR1cm4gcn0sbi5uPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBuLmQoZSxcImFcIixlKSxlfSxuLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LG4ucD1cIlwiLG4obi5zPTIpfShbZnVuY3Rpb24oZSxuKXtlLmV4cG9ydHM9dH0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPXtsaW5lYXI6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqdC9yK2V9LGVhc2VJblF1YWQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqKHQvPXIpKnQrZX0sZWFzZU91dFF1YWQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuLShuLWUpKih0Lz1yKSoodC0yKStlfSxlYXNlSW5PdXRRdWFkOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4odC89ci8yKTwxP2kvMip0KnQrZTotaS8yKigtLXQqKHQtMiktMSkrZX0sZWFzZUluQ3ViaWM6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqKHQvPXIpKnQqdCtlfSxlYXNlT3V0Q3ViaWM6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqKCh0PXQvci0xKSp0KnQrMSkrZX0sZWFzZUluT3V0Q3ViaWM6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybih0Lz1yLzIpPDE/aS8yKnQqdCp0K2U6aS8yKigodC09MikqdCp0KzIpK2V9LGVhc2VJblF1YXJ0OmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKih0Lz1yKSp0KnQqdCtlfSxlYXNlT3V0UXVhcnQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuLShuLWUpKigodD10L3ItMSkqdCp0KnQtMSkrZX0sZWFzZUluT3V0UXVhcnQ6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybih0Lz1yLzIpPDE/aS8yKnQqdCp0KnQrZTotaS8yKigodC09MikqdCp0KnQtMikrZX0sZWFzZUluUXVpbnQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqKHQvPXIpKnQqdCp0KnQrZX0sZWFzZU91dFF1aW50OmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKigodD10L3ItMSkqdCp0KnQqdCsxKStlfSxlYXNlSW5PdXRRdWludDpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uLWU7cmV0dXJuKHQvPXIvMik8MT9pLzIqdCp0KnQqdCp0K2U6aS8yKigodC09MikqdCp0KnQqdCsyKStlfSxlYXNlSW5TaW5lOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4taSpNYXRoLmNvcyh0L3IqKE1hdGguUEkvMikpK2krZX0sZWFzZU91dFNpbmU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuKG4tZSkqTWF0aC5zaW4odC9yKihNYXRoLlBJLzIpKStlfSxlYXNlSW5PdXRTaW5lOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybi0obi1lKS8yKihNYXRoLmNvcyhNYXRoLlBJKnQvciktMSkrZX0sZWFzZUluRXhwbzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gMD09dD9lOihuLWUpKk1hdGgucG93KDIsMTAqKHQvci0xKSkrZX0sZWFzZU91dEV4cG86ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybiB0PT1yP2UraTppKigxLU1hdGgucG93KDIsLTEwKnQvcikpK2V9LGVhc2VJbk91dEV4cG86ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybiAwPT09dD9lOnQ9PT1yP2UraToodC89ci8yKTwxP2kvMipNYXRoLnBvdygyLDEwKih0LTEpKStlOmkvMiooMi1NYXRoLnBvdygyLC0xMCotLXQpKStlfSxlYXNlSW5DaXJjOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybi0obi1lKSooTWF0aC5zcXJ0KDEtKHQvPXIpKnQpLTEpK2V9LGVhc2VPdXRDaXJjOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybihuLWUpKk1hdGguc3FydCgxLSh0PXQvci0xKSp0KStlfSxlYXNlSW5PdXRDaXJjOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW4tZTtyZXR1cm4odC89ci8yKTwxPy1pLzIqKE1hdGguc3FydCgxLXQqdCktMSkrZTppLzIqKE1hdGguc3FydCgxLSh0LT0yKSp0KSsxKStlfSxlYXNlSW5FbGFzdGljOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG8sYSxjPW4tZTtyZXR1cm4gYT0xLjcwMTU4LDA9PT10P2U6MT09KHQvPXIpP2UrYzooKG89MCl8fChvPS4zKnIpLChpPWMpPE1hdGguYWJzKGMpPyhpPWMsYT1vLzQpOmE9by8oMipNYXRoLlBJKSpNYXRoLmFzaW4oYy9pKSwtaSpNYXRoLnBvdygyLDEwKih0LT0xKSkqTWF0aC5zaW4oKHQqci1hKSooMipNYXRoLlBJKS9vKStlKX0sZWFzZU91dEVsYXN0aWM6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxhLGM9bi1lO3JldHVybiBhPTEuNzAxNTgsMD09PXQ/ZToxPT0odC89cik/ZStjOigobz0wKXx8KG89LjMqciksKGk9Yyk8TWF0aC5hYnMoYyk/KGk9YyxhPW8vNCk6YT1vLygyKk1hdGguUEkpKk1hdGguYXNpbihjL2kpLGkqTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKHQqci1hKSooMipNYXRoLlBJKS9vKStjK2UpfSxlYXNlSW5PdXRFbGFzdGljOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpLG8sYSxjPW4tZTtyZXR1cm4gYT0xLjcwMTU4LDA9PT10P2U6Mj09KHQvPXIvMik/ZStjOigobz0wKXx8KG89ciooLjMqMS41KSksKGk9Yyk8TWF0aC5hYnMoYyk/KGk9YyxhPW8vNCk6YT1vLygyKk1hdGguUEkpKk1hdGguYXNpbihjL2kpLHQ8MT9pKk1hdGgucG93KDIsMTAqKHQtPTEpKSpNYXRoLnNpbigodCpyLWEpKigyKk1hdGguUEkpL28pKi0uNStlOmkqTWF0aC5wb3coMiwtMTAqKHQtPTEpKSpNYXRoLnNpbigodCpyLWEpKigyKk1hdGguUEkpL28pKi41K2MrZSl9LGVhc2VJbkJhY2s6ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gdm9pZCAwPT09aSYmKGk9MS43MDE1OCksKG4tZSkqKHQvPXIpKnQqKChpKzEpKnQtaSkrZX0sZWFzZU91dEJhY2s6ZnVuY3Rpb24odCxlLG4scixpKXtyZXR1cm4gdm9pZCAwPT09aSYmKGk9MS43MDE1OCksKG4tZSkqKCh0PXQvci0xKSp0KigoaSsxKSp0K2kpKzEpK2V9LGVhc2VJbk91dEJhY2s6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1uLWU7cmV0dXJuIHZvaWQgMD09PWkmJihpPTEuNzAxNTgpLCh0Lz1yLzIpPDE/by8yKih0KnQqKCgxKyhpKj0xLjUyNSkpKnQtaSkpK2U6by8yKigodC09MikqdCooKDErKGkqPTEuNTI1KSkqdCtpKSsyKStlfSxlYXNlSW5Cb3VuY2U6ZnVuY3Rpb24odCxlLG4saSl7dmFyIG89bi1lO3JldHVybiBvLXIuZWFzZU91dEJvdW5jZShpLXQsMCxvLGkpK2V9LGVhc2VPdXRCb3VuY2U6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bi1lO3JldHVybih0Lz1yKTwxLzIuNzU/aSooNy41NjI1KnQqdCkrZTp0PDIvMi43NT9pKig3LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NSkrZTp0PDIuNS8yLjc1P2kqKDcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1KStlOmkqKDcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1KStlfSxlYXNlSW5PdXRCb3VuY2U6ZnVuY3Rpb24odCxlLG4saSl7dmFyIG89bi1lO3JldHVybiB0PGkvMj8uNSpyLmVhc2VJbkJvdW5jZSgyKnQsMCxvLGkpK2U6LjUqci5lYXNlT3V0Qm91bmNlKDIqdC1pLDAsbyxpKSsuNSpvK2V9fTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDMpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bi5yKGUpLG4uZChlLFwiUmVhY3RDb25mZXR0aVwiLChmdW5jdGlvbigpe3JldHVybiBRfSkpO3ZhciByLGksbz1uKDApLGE9bi5uKG8pLGM9bigxKSxzPW4ubihjKTtmdW5jdGlvbiB1KHQsZSl7cmV0dXJuIHQrTWF0aC5yYW5kb20oKSooZS10KX1mdW5jdGlvbiBmKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBoKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH0hZnVuY3Rpb24odCl7dFt0LkNpcmNsZT0wXT1cIkNpcmNsZVwiLHRbdC5TcXVhcmU9MV09XCJTcXVhcmVcIix0W3QuU3RyaXA9Ml09XCJTdHJpcFwifShyfHwocj17fSkpLGZ1bmN0aW9uKHQpe3RbdC5Qb3NpdGl2ZT0xXT1cIlBvc2l0aXZlXCIsdFt0Lk5lZ2F0aXZlPS0xXT1cIk5lZ2F0aXZlXCJ9KGl8fChpPXt9KSk7dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyLG8peyFmdW5jdGlvbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KHRoaXMsdCksaCh0aGlzLFwiY29udGV4dFwiLHZvaWQgMCksaCh0aGlzLFwicmFkaXVzXCIsdm9pZCAwKSxoKHRoaXMsXCJ4XCIsdm9pZCAwKSxoKHRoaXMsXCJ5XCIsdm9pZCAwKSxoKHRoaXMsXCJ3XCIsdm9pZCAwKSxoKHRoaXMsXCJoXCIsdm9pZCAwKSxoKHRoaXMsXCJ2eFwiLHZvaWQgMCksaCh0aGlzLFwidnlcIix2b2lkIDApLGgodGhpcyxcInNoYXBlXCIsdm9pZCAwKSxoKHRoaXMsXCJhbmdsZVwiLHZvaWQgMCksaCh0aGlzLFwiYW5ndWxhclNwaW5cIix2b2lkIDApLGgodGhpcyxcImNvbG9yXCIsdm9pZCAwKSxoKHRoaXMsXCJyb3RhdGVZXCIsdm9pZCAwKSxoKHRoaXMsXCJyb3RhdGlvbkRpcmVjdGlvblwiLHZvaWQgMCksaCh0aGlzLFwiZ2V0T3B0aW9uc1wiLHZvaWQgMCksdGhpcy5nZXRPcHRpb25zPW47dmFyIGEsYyxzPXRoaXMuZ2V0T3B0aW9ucygpLGY9cy5jb2xvcnMsbD1zLmluaXRpYWxWZWxvY2l0eVgscD1zLmluaXRpYWxWZWxvY2l0eVk7dGhpcy5jb250ZXh0PWUsdGhpcy54PXIsdGhpcy55PW8sdGhpcy53PXUoNSwyMCksdGhpcy5oPXUoNSwyMCksdGhpcy5yYWRpdXM9dSg1LDEwKSx0aGlzLnZ4PVwibnVtYmVyXCI9PXR5cGVvZiBsP3UoLWwsbCk6dShsLm1pbixsLm1heCksdGhpcy52eT1cIm51bWJlclwiPT10eXBlb2YgcD91KC1wLDApOnUocC5taW4scC5tYXgpLHRoaXMuc2hhcGU9KGE9MCxjPTIsTWF0aC5mbG9vcihhK01hdGgucmFuZG9tKCkqKGMtYSsxKSkpLHRoaXMuYW5nbGU9dSgwLDM2MCkqTWF0aC5QSS8xODAsdGhpcy5hbmd1bGFyU3Bpbj11KC0uMiwuMiksdGhpcy5jb2xvcj1mW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpmLmxlbmd0aCldLHRoaXMucm90YXRlWT11KDAsMSksdGhpcy5yb3RhdGlvbkRpcmVjdGlvbj11KDAsMSk/aS5Qb3NpdGl2ZTppLk5lZ2F0aXZlfXZhciBlLG4sbztyZXR1cm4gZT10LChuPVt7a2V5OlwidXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldE9wdGlvbnMoKSxlPXQuZ3Jhdml0eSxuPXQud2luZCxvPXQuZnJpY3Rpb24sYT10Lm9wYWNpdHksYz10LmRyYXdTaGFwZTt0aGlzLngrPXRoaXMudngsdGhpcy55Kz10aGlzLnZ5LHRoaXMudnkrPWUsdGhpcy52eCs9bix0aGlzLnZ4Kj1vLHRoaXMudnkqPW8sdGhpcy5yb3RhdGVZPj0xJiZ0aGlzLnJvdGF0aW9uRGlyZWN0aW9uPT09aS5Qb3NpdGl2ZT90aGlzLnJvdGF0aW9uRGlyZWN0aW9uPWkuTmVnYXRpdmU6dGhpcy5yb3RhdGVZPD0tMSYmdGhpcy5yb3RhdGlvbkRpcmVjdGlvbj09PWkuTmVnYXRpdmUmJih0aGlzLnJvdGF0aW9uRGlyZWN0aW9uPWkuUG9zaXRpdmUpO3ZhciBzPS4xKnRoaXMucm90YXRpb25EaXJlY3Rpb247aWYodGhpcy5yb3RhdGVZKz1zLHRoaXMuYW5nbGUrPXRoaXMuYW5ndWxhclNwaW4sdGhpcy5jb250ZXh0LnNhdmUoKSx0aGlzLmNvbnRleHQudHJhbnNsYXRlKHRoaXMueCx0aGlzLnkpLHRoaXMuY29udGV4dC5yb3RhdGUodGhpcy5hbmdsZSksdGhpcy5jb250ZXh0LnNjYWxlKDEsdGhpcy5yb3RhdGVZKSx0aGlzLmNvbnRleHQucm90YXRlKHRoaXMuYW5nbGUpLHRoaXMuY29udGV4dC5iZWdpblBhdGgoKSx0aGlzLmNvbnRleHQuZmlsbFN0eWxlPXRoaXMuY29sb3IsdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlPXRoaXMuY29sb3IsdGhpcy5jb250ZXh0Lmdsb2JhbEFscGhhPWEsdGhpcy5jb250ZXh0LmxpbmVDYXA9XCJyb3VuZFwiLHRoaXMuY29udGV4dC5saW5lV2lkdGg9MixjJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBjKWMuY2FsbCh0aGlzLHRoaXMuY29udGV4dCk7ZWxzZSBzd2l0Y2godGhpcy5zaGFwZSl7Y2FzZSByLkNpcmNsZTp0aGlzLmNvbnRleHQuYmVnaW5QYXRoKCksdGhpcy5jb250ZXh0LmFyYygwLDAsdGhpcy5yYWRpdXMsMCwyKk1hdGguUEkpLHRoaXMuY29udGV4dC5maWxsKCk7YnJlYWs7Y2FzZSByLlNxdWFyZTp0aGlzLmNvbnRleHQuZmlsbFJlY3QoLXRoaXMudy8yLC10aGlzLmgvMix0aGlzLncsdGhpcy5oKTticmVhaztjYXNlIHIuU3RyaXA6dGhpcy5jb250ZXh0LmZpbGxSZWN0KC10aGlzLncvNiwtdGhpcy5oLzIsdGhpcy53LzMsdGhpcy5oKX10aGlzLmNvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5jb250ZXh0LnJlc3RvcmUoKX19XSkmJmYoZS5wcm90b3R5cGUsbiksbyYmZihlLG8pLHR9KCk7ZnVuY3Rpb24gcCh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9dmFyIHY9ZnVuY3Rpb24gdChlLG4pe3ZhciByPXRoaXM7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX0odGhpcyx0KSxwKHRoaXMsXCJjYW52YXNcIix2b2lkIDApLHAodGhpcyxcImNvbnRleHRcIix2b2lkIDApLHAodGhpcyxcImdldE9wdGlvbnNcIix2b2lkIDApLHAodGhpcyxcInhcIiwwKSxwKHRoaXMsXCJ5XCIsMCkscCh0aGlzLFwid1wiLDApLHAodGhpcyxcImhcIiwwKSxwKHRoaXMsXCJsYXN0TnVtYmVyT2ZQaWVjZXNcIiwwKSxwKHRoaXMsXCJ0d2VlbkluaXRUaW1lXCIsRGF0ZS5ub3coKSkscCh0aGlzLFwicGFydGljbGVzXCIsW10pLHAodGhpcyxcInBhcnRpY2xlc0dlbmVyYXRlZFwiLDApLHAodGhpcyxcInJlbW92ZVBhcnRpY2xlQXRcIiwoZnVuY3Rpb24odCl7ci5wYXJ0aWNsZXMuc3BsaWNlKHQsMSl9KSkscCh0aGlzLFwiZ2V0UGFydGljbGVcIiwoZnVuY3Rpb24oKXt2YXIgdD11KHIueCxyLncrci54KSxlPXUoci55LHIuaCtyLnkpO3JldHVybiBuZXcgbChyLmNvbnRleHQsci5nZXRPcHRpb25zLHQsZSl9KSkscCh0aGlzLFwiYW5pbWF0ZVwiLChmdW5jdGlvbigpe3ZhciB0PXIuY2FudmFzLGU9ci5jb250ZXh0LG49ci5wYXJ0aWNsZXNHZW5lcmF0ZWQsaT1yLmxhc3ROdW1iZXJPZlBpZWNlcyxvPXIuZ2V0T3B0aW9ucygpLGE9by5ydW4sYz1vLnJlY3ljbGUscz1vLm51bWJlck9mUGllY2VzLHU9by5kZWJ1ZyxmPW8udHdlZW5GdW5jdGlvbixoPW8udHdlZW5EdXJhdGlvbjtpZighYSlyZXR1cm4hMTt2YXIgbD1yLnBhcnRpY2xlcy5sZW5ndGgscD1jP2w6bix2PURhdGUubm93KCk7aWYocDxzKXtpIT09cyYmKHIudHdlZW5Jbml0VGltZT12LHIubGFzdE51bWJlck9mUGllY2VzPXMpO2Zvcih2YXIgeT1yLnR3ZWVuSW5pdFRpbWUsZD1mKHYteT5oP2g6TWF0aC5tYXgoMCx2LXkpLHAscyxoKSxiPU1hdGgucm91bmQoZC1wKSxnPTA7ZzxiO2crKylyLnBhcnRpY2xlcy5wdXNoKHIuZ2V0UGFydGljbGUoKSk7ci5wYXJ0aWNsZXNHZW5lcmF0ZWQrPWJ9cmV0dXJuIHUmJihlLmZvbnQ9XCIxMnB4IHNhbnMtc2VyaWZcIixlLmZpbGxTdHlsZT1cIiMzMzNcIixlLnRleHRBbGlnbj1cInJpZ2h0XCIsZS5maWxsVGV4dChcIlBhcnRpY2xlczogXCIuY29uY2F0KGwpLHQud2lkdGgtMTAsdC5oZWlnaHQtMjApKSxyLnBhcnRpY2xlcy5mb3JFYWNoKChmdW5jdGlvbihlLG4pe2UudXBkYXRlKCksKGUueT50LmhlaWdodHx8ZS55PC0xMDB8fGUueD50LndpZHRoKzEwMHx8ZS54PC0xMDApJiYoYyYmcDw9cz9yLnBhcnRpY2xlc1tuXT1yLmdldFBhcnRpY2xlKCk6ci5yZW1vdmVQYXJ0aWNsZUF0KG4pKX0pKSxsPjB8fHA8c30pKSx0aGlzLmNhbnZhcz1lO3ZhciBpPXRoaXMuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtpZighaSl0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZ2V0IGNhbnZhcyBjb250ZXh0XCIpO3RoaXMuY29udGV4dD1pLHRoaXMuZ2V0T3B0aW9ucz1ufTtmdW5jdGlvbiB5KHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBkKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP3koT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtnKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTp5KE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fWZ1bmN0aW9uIGIodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIGcodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fXZhciBPPXt3aWR0aDpcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdy5pbm5lcldpZHRoOjMwMCxoZWlnaHQ6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3cuaW5uZXJIZWlnaHQ6MjAwLG51bWJlck9mUGllY2VzOjIwMCxmcmljdGlvbjouOTksd2luZDowLGdyYXZpdHk6LjEsaW5pdGlhbFZlbG9jaXR5WDo0LGluaXRpYWxWZWxvY2l0eVk6MTAsY29sb3JzOltcIiNmNDQzMzZcIixcIiNlOTFlNjNcIixcIiM5YzI3YjBcIixcIiM2NzNhYjdcIixcIiMzZjUxYjVcIixcIiMyMTk2ZjNcIixcIiMwM2E5ZjRcIixcIiMwMGJjZDRcIixcIiMwMDk2ODhcIixcIiM0Q0FGNTBcIixcIiM4QkMzNEFcIixcIiNDRERDMzlcIixcIiNGRkVCM0JcIixcIiNGRkMxMDdcIixcIiNGRjk4MDBcIixcIiNGRjU3MjJcIixcIiM3OTU1NDhcIl0sb3BhY2l0eToxLGRlYnVnOiExLHR3ZWVuRnVuY3Rpb246cy5hLmVhc2VJbk91dFF1YWQsdHdlZW5EdXJhdGlvbjo1ZTMscmVjeWNsZTohMCxydW46ITB9LHc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbil7dmFyIHI9dGhpczshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLHQpLGcodGhpcyxcImNhbnZhc1wiLHZvaWQgMCksZyh0aGlzLFwiY29udGV4dFwiLHZvaWQgMCksZyh0aGlzLFwiX29wdGlvbnNcIix2b2lkIDApLGcodGhpcyxcImdlbmVyYXRvclwiLHZvaWQgMCksZyh0aGlzLFwicmFmSWRcIix2b2lkIDApLGcodGhpcyxcInNldE9wdGlvbnNXaXRoRGVmYXVsdHNcIiwoZnVuY3Rpb24odCl7dmFyIGU9e2NvbmZldHRpU291cmNlOnt4OjAseTowLHc6ci5jYW52YXMud2lkdGgsaDowfX07ci5fb3B0aW9ucz1kKGQoZCh7fSxlKSxPKSx0KSxPYmplY3QuYXNzaWduKHIsdC5jb25mZXR0aVNvdXJjZSl9KSksZyh0aGlzLFwidXBkYXRlXCIsKGZ1bmN0aW9uKCl7dmFyIHQ9ci5vcHRpb25zLGU9dC5ydW4sbj10Lm9uQ29uZmV0dGlDb21wbGV0ZSxpPXIuY2FudmFzLG89ci5jb250ZXh0O2UmJihvLmZpbGxTdHlsZT1cIndoaXRlXCIsby5jbGVhclJlY3QoMCwwLGkud2lkdGgsaS5oZWlnaHQpKSxyLmdlbmVyYXRvci5hbmltYXRlKCk/ci5yYWZJZD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoci51cGRhdGUpOihuJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBuJiZyLmdlbmVyYXRvci5wYXJ0aWNsZXNHZW5lcmF0ZWQ+MCYmbi5jYWxsKHIsciksci5fb3B0aW9ucy5ydW49ITEpfSkpLGcodGhpcyxcInJlc2V0XCIsKGZ1bmN0aW9uKCl7ci5nZW5lcmF0b3ImJnIuZ2VuZXJhdG9yLnBhcnRpY2xlc0dlbmVyYXRlZD4wJiYoci5nZW5lcmF0b3IucGFydGljbGVzR2VuZXJhdGVkPTAsci5nZW5lcmF0b3IucGFydGljbGVzPVtdLHIuZ2VuZXJhdG9yLmxhc3ROdW1iZXJPZlBpZWNlcz0wKX0pKSxnKHRoaXMsXCJzdG9wXCIsKGZ1bmN0aW9uKCl7ci5vcHRpb25zPXtydW46ITF9LHIucmFmSWQmJihjYW5jZWxBbmltYXRpb25GcmFtZShyLnJhZklkKSxyLnJhZklkPXZvaWQgMCl9KSksdGhpcy5jYW52YXM9ZTt2YXIgaT10aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7aWYoIWkpdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGdldCBjYW52YXMgY29udGV4dFwiKTt0aGlzLmNvbnRleHQ9aSx0aGlzLmdlbmVyYXRvcj1uZXcgdih0aGlzLmNhbnZhcywoZnVuY3Rpb24oKXtyZXR1cm4gci5vcHRpb25zfSkpLHRoaXMub3B0aW9ucz1uLHRoaXMudXBkYXRlKCl9dmFyIGUsbixyO3JldHVybiBlPXQsKG49W3trZXk6XCJvcHRpb25zXCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29wdGlvbnN9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9vcHRpb25zJiZ0aGlzLl9vcHRpb25zLnJ1bixuPXRoaXMuX29wdGlvbnMmJnRoaXMuX29wdGlvbnMucmVjeWNsZTt0aGlzLnNldE9wdGlvbnNXaXRoRGVmYXVsdHModCksdGhpcy5nZW5lcmF0b3ImJihPYmplY3QuYXNzaWduKHRoaXMuZ2VuZXJhdG9yLHRoaXMub3B0aW9ucy5jb25mZXR0aVNvdXJjZSksXCJib29sZWFuXCI9PXR5cGVvZiB0LnJlY3ljbGUmJnQucmVjeWNsZSYmITE9PT1uJiYodGhpcy5nZW5lcmF0b3IubGFzdE51bWJlck9mUGllY2VzPXRoaXMuZ2VuZXJhdG9yLnBhcnRpY2xlcy5sZW5ndGgpKSxcImJvb2xlYW5cIj09dHlwZW9mIHQucnVuJiZ0LnJ1biYmITE9PT1lJiZ0aGlzLnVwZGF0ZSgpfX1dKSYmYihlLnByb3RvdHlwZSxuKSxyJiZiKGUsciksdH0oKTtmdW5jdGlvbiBtKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBDKHQpfSh0KXx8ZnVuY3Rpb24odCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh0KSlyZXR1cm4gQXJyYXkuZnJvbSh0KX0odCl8fFModCl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24geCh0KXtyZXR1cm4oeD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gUCgpe3JldHVybihQPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPWFyZ3VtZW50c1tlXTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKHRbcl09bltyXSl9cmV0dXJuIHR9KS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gaih0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gTSh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9qKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7VCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6aihPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBJKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHR9KHQpfHxmdW5jdGlvbih0LGUpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBTeW1ib2x8fCEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh0KSkpcmV0dXJuO3ZhciBuPVtdLHI9ITAsaT0hMSxvPXZvaWQgMDt0cnl7Zm9yKHZhciBhLGM9dFtTeW1ib2wuaXRlcmF0b3JdKCk7IShyPShhPWMubmV4dCgpKS5kb25lKSYmKG4ucHVzaChhLnZhbHVlKSwhZXx8bi5sZW5ndGghPT1lKTtyPSEwKTt9Y2F0Y2godCl7aT0hMCxvPXR9ZmluYWxseXt0cnl7cnx8bnVsbD09Yy5yZXR1cm58fGMucmV0dXJuKCl9ZmluYWxseXtpZihpKXRocm93IG99fXJldHVybiBufSh0LGUpfHxTKHQsZSl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKX0oKX1mdW5jdGlvbiBTKHQsZSl7aWYodCl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpcmV0dXJuIEModCxlKTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwtMSk7cmV0dXJuXCJPYmplY3RcIj09PW4mJnQuY29uc3RydWN0b3ImJihuPXQuY29uc3RydWN0b3IubmFtZSksXCJNYXBcIj09PW58fFwiU2V0XCI9PT1uP0FycmF5LmZyb20odCk6XCJBcmd1bWVudHNcIj09PW58fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pP0ModCxlKTp2b2lkIDB9fWZ1bmN0aW9uIEModCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiBEKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBFKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBfKHQsZSl7cmV0dXJuKF89T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIFIodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1GKHQpO2lmKGUpe3ZhciBpPUYodGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGsodGhpcyxuKX19ZnVuY3Rpb24gayh0LGUpe3JldHVybiFlfHxcIm9iamVjdFwiIT09eChlKSYmXCJmdW5jdGlvblwiIT10eXBlb2YgZT9BKHQpOmV9ZnVuY3Rpb24gQSh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtyZXR1cm4gdH1mdW5jdGlvbiBGKHQpe3JldHVybihGPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBUKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH12YXIgQj1hLmEuY3JlYXRlUmVmKCksTj1mdW5jdGlvbih0KXshZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJl8odCxlKX0obyx0KTt2YXIgZSxuLHIsaT1SKG8pO2Z1bmN0aW9uIG8odCl7dmFyIGU7RCh0aGlzLG8pO2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4+MT9uLTE6MCksYz0xO2M8bjtjKyspcltjLTFdPWFyZ3VtZW50c1tjXTtyZXR1cm4gVChBKGU9aS5jYWxsLmFwcGx5KGksW3RoaXMsdF0uY29uY2F0KHIpKSksXCJjYW52YXNcIixhLmEuY3JlYXRlUmVmKCkpLFQoQShlKSxcImNvbmZldHRpXCIsdm9pZCAwKSxlLmNhbnZhcz10LmNhbnZhc1JlZnx8QixlfXJldHVybiBlPW8sKG49W3trZXk6XCJjb21wb25lbnREaWRNb3VudFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5jYW52YXMuY3VycmVudCl7dmFyIHQ9cSh0aGlzLnByb3BzKVswXTt0aGlzLmNvbmZldHRpPW5ldyB3KHRoaXMuY2FudmFzLmN1cnJlbnQsdCl9fX0se2tleTpcImNvbXBvbmVudERpZFVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9cSh0aGlzLnByb3BzKVswXTt0aGlzLmNvbmZldHRpJiYodGhpcy5jb25mZXR0aS5vcHRpb25zPXQpfX0se2tleTpcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmNvbmZldHRpJiZ0aGlzLmNvbmZldHRpLnN0b3AoKSx0aGlzLmNvbmZldHRpPXZvaWQgMH19LHtrZXk6XCJyZW5kZXJcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PUkocSh0aGlzLnByb3BzKSwyKSxlPXRbMF0sbj10WzFdLHI9TSh7ekluZGV4OjIscG9zaXRpb246XCJhYnNvbHV0ZVwiLHBvaW50ZXJFdmVudHM6XCJub25lXCIsdG9wOjAsbGVmdDowLGJvdHRvbTowLHJpZ2h0OjB9LG4uc3R5bGUpO3JldHVybiBhLmEuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiLFAoe3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LHJlZjp0aGlzLmNhbnZhc30sbix7c3R5bGU6cn0pKX19XSkmJkUoZS5wcm90b3R5cGUsbiksciYmRShlLHIpLG99KG8uQ29tcG9uZW50KTtmdW5jdGlvbiBxKHQpe3ZhciBlPXt9LG49e30scj1bXS5jb25jYXQobShPYmplY3Qua2V5cyhPKSksW1wiY29uZmV0dGlTb3VyY2VcIixcImRyYXdTaGFwZVwiLFwib25Db25mZXR0aUNvbXBsZXRlXCJdKSxpPVtcImNhbnZhc1JlZlwiXTtmb3IodmFyIG8gaW4gdCl7dmFyIGE9dFtvXTtyLmluY2x1ZGVzKG8pP2Vbb109YTppLmluY2x1ZGVzKG8pP2lbb109YTpuW29dPWF9cmV0dXJuW2Usbix7fV19VChOLFwiZGVmYXVsdFByb3BzXCIsTSh7fSxPKSksVChOLFwiZGlzcGxheU5hbWVcIixcIlJlYWN0Q29uZmV0dGlcIik7dmFyIFE9YS5hLmZvcndhcmRSZWYoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGEuYS5jcmVhdGVFbGVtZW50KE4sUCh7Y2FudmFzUmVmOmV9LHQpKX0pKTtlLmRlZmF1bHQ9UX1dKS5kZWZhdWx0fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVhY3QtY29uZmV0dGkubWluLmpzLm1hcCIsIi8qIVxuICByZWFjdC1kYXRlcGlja2VyIHY3LjMuMFxuICBodHRwczovL2dpdGh1Yi5jb20vSGFja2VyMHgwMS9yZWFjdC1kYXRlcGlja2VyXG4gIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiovXG4hZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT90KGV4cG9ydHMscmVxdWlyZShcImNsc3hcIikscmVxdWlyZShcInJlYWN0XCIpLHJlcXVpcmUoXCJyZWFjdC1vbmNsaWNrb3V0c2lkZVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkRGF5c1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkSG91cnNcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZE1pbnV0ZXNcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZE1vbnRoc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvYWRkUXVhcnRlcnNcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZFNlY29uZHNcIikscmVxdWlyZShcImRhdGUtZm5zL2FkZFdlZWtzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9hZGRZZWFyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFyc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZW5kT2ZEYXlcIikscmVxdWlyZShcImRhdGUtZm5zL2VuZE9mTW9udGhcIikscmVxdWlyZShcImRhdGUtZm5zL2VuZE9mV2Vla1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZW5kT2ZZZWFyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9mb3JtYXRcIikscmVxdWlyZShcImRhdGUtZm5zL2dldERhdGVcIikscmVxdWlyZShcImRhdGUtZm5zL2dldERheVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvZ2V0SG91cnNcIikscmVxdWlyZShcImRhdGUtZm5zL2dldElTT1dlZWtcIikscmVxdWlyZShcImRhdGUtZm5zL2dldE1pbnV0ZXNcIikscmVxdWlyZShcImRhdGUtZm5zL2dldE1vbnRoXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRRdWFydGVyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRTZWNvbmRzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRUaW1lXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9nZXRZZWFyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc0FmdGVyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc0JlZm9yZVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvaXNEYXRlXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc0VxdWFsXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc1NhbWVEYXlcIikscmVxdWlyZShcImRhdGUtZm5zL2lzU2FtZU1vbnRoXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc1NhbWVRdWFydGVyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc1NhbWVZZWFyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc1ZhbGlkXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9pc1dpdGhpbkludGVydmFsXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9tYXhcIikscmVxdWlyZShcImRhdGUtZm5zL21pblwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvcGFyc2VcIikscmVxdWlyZShcImRhdGUtZm5zL3BhcnNlSVNPXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zZXRcIikscmVxdWlyZShcImRhdGUtZm5zL3NldEhvdXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zZXRNaW51dGVzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zZXRNb250aFwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc2V0UXVhcnRlclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc2V0U2Vjb25kc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc2V0WWVhclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3RhcnRPZkRheVwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3RhcnRPZk1vbnRoXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdGFydE9mUXVhcnRlclwiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3RhcnRPZldlZWtcIikscmVxdWlyZShcImRhdGUtZm5zL3N0YXJ0T2ZZZWFyXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdWJEYXlzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdWJNb250aHNcIikscmVxdWlyZShcImRhdGUtZm5zL3N1YlF1YXJ0ZXJzXCIpLHJlcXVpcmUoXCJkYXRlLWZucy9zdWJXZWVrc1wiKSxyZXF1aXJlKFwiZGF0ZS1mbnMvc3ViWWVhcnNcIikscmVxdWlyZShcImRhdGUtZm5zL3RvRGF0ZVwiKSxyZXF1aXJlKFwiQGZsb2F0aW5nLXVpL3JlYWN0XCIpLHJlcXVpcmUoXCJyZWFjdC1kb21cIikpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wiZXhwb3J0c1wiLFwiY2xzeFwiLFwicmVhY3RcIixcInJlYWN0LW9uY2xpY2tvdXRzaWRlXCIsXCJkYXRlLWZucy9hZGREYXlzXCIsXCJkYXRlLWZucy9hZGRIb3Vyc1wiLFwiZGF0ZS1mbnMvYWRkTWludXRlc1wiLFwiZGF0ZS1mbnMvYWRkTW9udGhzXCIsXCJkYXRlLWZucy9hZGRRdWFydGVyc1wiLFwiZGF0ZS1mbnMvYWRkU2Vjb25kc1wiLFwiZGF0ZS1mbnMvYWRkV2Vla3NcIixcImRhdGUtZm5zL2FkZFllYXJzXCIsXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXNcIixcImRhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzXCIsXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzXCIsXCJkYXRlLWZucy9kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzXCIsXCJkYXRlLWZucy9lbmRPZkRheVwiLFwiZGF0ZS1mbnMvZW5kT2ZNb250aFwiLFwiZGF0ZS1mbnMvZW5kT2ZXZWVrXCIsXCJkYXRlLWZucy9lbmRPZlllYXJcIixcImRhdGUtZm5zL2Zvcm1hdFwiLFwiZGF0ZS1mbnMvZ2V0RGF0ZVwiLFwiZGF0ZS1mbnMvZ2V0RGF5XCIsXCJkYXRlLWZucy9nZXRIb3Vyc1wiLFwiZGF0ZS1mbnMvZ2V0SVNPV2Vla1wiLFwiZGF0ZS1mbnMvZ2V0TWludXRlc1wiLFwiZGF0ZS1mbnMvZ2V0TW9udGhcIixcImRhdGUtZm5zL2dldFF1YXJ0ZXJcIixcImRhdGUtZm5zL2dldFNlY29uZHNcIixcImRhdGUtZm5zL2dldFRpbWVcIixcImRhdGUtZm5zL2dldFllYXJcIixcImRhdGUtZm5zL2lzQWZ0ZXJcIixcImRhdGUtZm5zL2lzQmVmb3JlXCIsXCJkYXRlLWZucy9pc0RhdGVcIixcImRhdGUtZm5zL2lzRXF1YWxcIixcImRhdGUtZm5zL2lzU2FtZURheVwiLFwiZGF0ZS1mbnMvaXNTYW1lTW9udGhcIixcImRhdGUtZm5zL2lzU2FtZVF1YXJ0ZXJcIixcImRhdGUtZm5zL2lzU2FtZVllYXJcIixcImRhdGUtZm5zL2lzVmFsaWRcIixcImRhdGUtZm5zL2lzV2l0aGluSW50ZXJ2YWxcIixcImRhdGUtZm5zL21heFwiLFwiZGF0ZS1mbnMvbWluXCIsXCJkYXRlLWZucy9wYXJzZVwiLFwiZGF0ZS1mbnMvcGFyc2VJU09cIixcImRhdGUtZm5zL3NldFwiLFwiZGF0ZS1mbnMvc2V0SG91cnNcIixcImRhdGUtZm5zL3NldE1pbnV0ZXNcIixcImRhdGUtZm5zL3NldE1vbnRoXCIsXCJkYXRlLWZucy9zZXRRdWFydGVyXCIsXCJkYXRlLWZucy9zZXRTZWNvbmRzXCIsXCJkYXRlLWZucy9zZXRZZWFyXCIsXCJkYXRlLWZucy9zdGFydE9mRGF5XCIsXCJkYXRlLWZucy9zdGFydE9mTW9udGhcIixcImRhdGUtZm5zL3N0YXJ0T2ZRdWFydGVyXCIsXCJkYXRlLWZucy9zdGFydE9mV2Vla1wiLFwiZGF0ZS1mbnMvc3RhcnRPZlllYXJcIixcImRhdGUtZm5zL3N1YkRheXNcIixcImRhdGUtZm5zL3N1Yk1vbnRoc1wiLFwiZGF0ZS1mbnMvc3ViUXVhcnRlcnNcIixcImRhdGUtZm5zL3N1YldlZWtzXCIsXCJkYXRlLWZucy9zdWJZZWFyc1wiLFwiZGF0ZS1mbnMvdG9EYXRlXCIsXCJAZmxvYXRpbmctdWkvcmVhY3RcIixcInJlYWN0LWRvbVwiXSx0KTp0KChlPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6ZXx8c2VsZikuRGF0ZVBpY2tlcj17fSxlLmNsc3gsZS5SZWFjdCxlLm9uQ2xpY2tPdXRzaWRlLGUuYWRkRGF5cyxlLmFkZEhvdXJzLGUuYWRkTWludXRlcyxlLmFkZE1vbnRocyxlLmFkZFF1YXJ0ZXJzLGUuYWRkU2Vjb25kcyxlLmFkZFdlZWtzLGUuYWRkWWVhcnMsZS5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMsZS5kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyxlLmRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMsZS5kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzLGUuZW5kT2ZEYXksZS5lbmRPZk1vbnRoLGUuZW5kT2ZXZWVrLGUuZW5kT2ZZZWFyLGUuZm9ybWF0LGUuZ2V0RGF0ZSxlLmdldERheSxlLmdldEhvdXJzLGUuZ2V0SVNPV2VlayxlLmdldE1pbnV0ZXMsZS5nZXRNb250aCxlLmdldFF1YXJ0ZXIsZS5nZXRTZWNvbmRzLGUuZ2V0VGltZSxlLmdldFllYXIsZS5pc0FmdGVyLGUuaXNCZWZvcmUsZS5pc0RhdGUsZS5pc0VxdWFsJDEsZS5pc1NhbWVEYXkkMSxlLmlzU2FtZU1vbnRoJDEsZS5pc1NhbWVRdWFydGVyJDEsZS5pc1NhbWVZZWFyJDEsZS5pc1ZhbGlkJDEsZS5pc1dpdGhpbkludGVydmFsLGUubWF4LGUubWluLGUucGFyc2UsZS5wYXJzZUlTTyxlLnNldCxlLnNldEhvdXJzLGUuc2V0TWludXRlcyxlLnNldE1vbnRoLGUuc2V0UXVhcnRlcixlLnNldFNlY29uZHMsZS5zZXRZZWFyLGUuc3RhcnRPZkRheSxlLnN0YXJ0T2ZNb250aCxlLnN0YXJ0T2ZRdWFydGVyLGUuc3RhcnRPZldlZWssZS5zdGFydE9mWWVhcixlLnN1YkRheXMsZS5zdWJNb250aHMsZS5zdWJRdWFydGVycyxlLnN1YldlZWtzLGUuc3ViWWVhcnMsZS50b0RhdGUsZS5yZWFjdCxlLlJlYWN0RE9NKX0odGhpcywoZnVuY3Rpb24oZSx0LHIsbixhLG8scyxpLGwsYyxwLGQsdSxmLGgsbSx2LGcsRCx5LGssdyxTLGIsTSxDLF8sRSxQLFkseCxOLE8sSSxULFIsTCxBLEYsSCxXLFEscSxLLEIsVixqLFUsJCx6LFgsRyxKLFosZWUsdGUscmUsbmUsYWUsb2Usc2UsaWUsbGUsY2UscGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGRlKGUpe3JldHVybiBlJiZcIm9iamVjdFwiPT10eXBlb2YgZSYmXCJkZWZhdWx0XCJpbiBlP2U6e2RlZmF1bHQ6ZX19dmFyIHVlPWRlKHIpLGZlPWRlKG4pLGhlPWRlKHBlKSxtZT1mdW5jdGlvbihlLHQpe3JldHVybiBtZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oZSx0KXtlLl9fcHJvdG9fXz10fXx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmKGVbcl09dFtyXSl9LG1lKGUsdCl9O2Z1bmN0aW9uIHZlKGUsdCl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIrU3RyaW5nKHQpK1wiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9ZX1tZShlLHQpLGUucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KHIucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyByKX12YXIgZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gZ2U9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LHI9MSxuPWFyZ3VtZW50cy5sZW5ndGg7cjxuO3IrKylmb3IodmFyIGEgaW4gdD1hcmd1bWVudHNbcl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsYSkmJihlW2FdPXRbYV0pO3JldHVybiBlfSxnZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIERlKGUsdCxyKXtpZihyfHwyPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIG4sYT0wLG89dC5sZW5ndGg7YTxvO2ErKykhbiYmYSBpbiB0fHwobnx8KG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCwwLGEpKSxuW2FdPXRbYV0pO3JldHVybiBlLmNvbmNhdChufHxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KSl9XCJmdW5jdGlvblwiPT10eXBlb2YgU3VwcHJlc3NlZEVycm9yJiZTdXBwcmVzc2VkRXJyb3I7dmFyIHllLGtlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc2hvd1RpbWVTZWxlY3RPbmx5LHI9dm9pZCAwIT09dCYmdCxuPWUuc2hvd1RpbWUsYT12b2lkIDAhPT1uJiZuLG89ZS5jbGFzc05hbWUscz1lLmNoaWxkcmVuLGk9cj9cIkNob29zZSBUaW1lXCI6XCJDaG9vc2UgRGF0ZVwiLmNvbmNhdChhP1wiIGFuZCBUaW1lXCI6XCJcIik7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6byxyb2xlOlwiZGlhbG9nXCIsXCJhcmlhLWxhYmVsXCI6aSxcImFyaWEtbW9kYWxcIjpcInRydWVcIn0scyl9O2Z1bmN0aW9uIHdlKCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6Z2xvYmFsVGhpc30hZnVuY3Rpb24oZSl7ZS5BcnJvd1VwPVwiQXJyb3dVcFwiLGUuQXJyb3dEb3duPVwiQXJyb3dEb3duXCIsZS5BcnJvd0xlZnQ9XCJBcnJvd0xlZnRcIixlLkFycm93UmlnaHQ9XCJBcnJvd1JpZ2h0XCIsZS5QYWdlVXA9XCJQYWdlVXBcIixlLlBhZ2VEb3duPVwiUGFnZURvd25cIixlLkhvbWU9XCJIb21lXCIsZS5FbmQ9XCJFbmRcIixlLkVudGVyPVwiRW50ZXJcIixlLlNwYWNlPVwiIFwiLGUuVGFiPVwiVGFiXCIsZS5Fc2NhcGU9XCJFc2NhcGVcIixlLkJhY2tzcGFjZT1cIkJhY2tzcGFjZVwiLGUuWD1cInhcIn0oeWV8fCh5ZT17fSkpO3ZhciBTZT0xMixiZT0vUCtwK3xQK3xwK3wnJ3wnKCcnfFteJ10pKygnfCQpfC4vZztmdW5jdGlvbiBNZShlKXtpZihudWxsPT1lKXJldHVybiBuZXcgRGF0ZTt2YXIgdD1cInN0cmluZ1wiPT10eXBlb2YgZT9CLnBhcnNlSVNPKGUpOmxlLnRvRGF0ZShlKTtyZXR1cm4gQ2UodCk/dDpuZXcgRGF0ZX1mdW5jdGlvbiBDZShlLHQpe3JldHVybiBILmlzVmFsaWQoZSkmJiFPLmlzQmVmb3JlKGUsbnVsbCE9dD90Om5ldyBEYXRlKFwiMS8xLzE4MDBcIikpfWZ1bmN0aW9uIF9lKGUsdCxyKXtpZihcImVuXCI9PT1yKXJldHVybiBrLmZvcm1hdChlLHQse3VzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VuczohMCx1c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zOiEwfSk7dmFyIG49cj9LZShyKTp2b2lkIDA7cmV0dXJuIHImJiFuJiZjb25zb2xlLndhcm4oJ0EgbG9jYWxlIG9iamVjdCB3YXMgbm90IGZvdW5kIGZvciB0aGUgcHJvdmlkZWQgc3RyaW5nIFtcIicuY29uY2F0KHIsJ1wiXS4nKSksIW4mJnFlKCkmJktlKHFlKCkpJiYobj1LZShxZSgpKSksay5mb3JtYXQoZSx0LHtsb2NhbGU6bix1c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnM6ITAsdXNlQWRkaXRpb25hbERheU9mWWVhclRva2VuczohMH0pfWZ1bmN0aW9uIEVlKGUsdCl7dmFyIHI9dC5kYXRlRm9ybWF0LG49dC5sb2NhbGUsYT1BcnJheS5pc0FycmF5KHIpJiZyLmxlbmd0aD4wP3JbMF06cjtyZXR1cm4gZSYmX2UoZSxhLG4pfHxcIlwifWZ1bmN0aW9uIFBlKGUsdCl7dmFyIHI9dC5ob3VyLG49dm9pZCAwPT09cj8wOnIsYT10Lm1pbnV0ZSxvPXZvaWQgMD09PWE/MDphLHM9dC5zZWNvbmQsaT12b2lkIDA9PT1zPzA6cztyZXR1cm4gai5zZXRIb3VycyhVLnNldE1pbnV0ZXMoWC5zZXRTZWNvbmRzKGUsaSksbyksbil9ZnVuY3Rpb24gWWUoZSl7cmV0dXJuIEouc3RhcnRPZkRheShlKX1mdW5jdGlvbiB4ZShlLHQscil7dmFyIG49S2UodHx8cWUoKSk7cmV0dXJuIHRlLnN0YXJ0T2ZXZWVrKGUse2xvY2FsZTpuLHdlZWtTdGFydHNPbjpyfSl9ZnVuY3Rpb24gTmUoZSl7cmV0dXJuIFouc3RhcnRPZk1vbnRoKGUpfWZ1bmN0aW9uIE9lKGUpe3JldHVybiByZS5zdGFydE9mWWVhcihlKX1mdW5jdGlvbiBJZShlKXtyZXR1cm4gZWUuc3RhcnRPZlF1YXJ0ZXIoZSl9ZnVuY3Rpb24gVGUoKXtyZXR1cm4gSi5zdGFydE9mRGF5KE1lKCkpfWZ1bmN0aW9uIFJlKGUpe3JldHVybiB2LmVuZE9mRGF5KGUpfWZ1bmN0aW9uIExlKGUsdCl7cmV0dXJuIGUmJnQ/Ri5pc1NhbWVZZWFyKGUsdCk6IWUmJiF0fWZ1bmN0aW9uIEFlKGUsdCl7cmV0dXJuIGUmJnQ/TC5pc1NhbWVNb250aChlLHQpOiFlJiYhdH1mdW5jdGlvbiBGZShlLHQpe3JldHVybiBlJiZ0P0EuaXNTYW1lUXVhcnRlcihlLHQpOiFlJiYhdH1mdW5jdGlvbiBIZShlLHQpe3JldHVybiBlJiZ0P1IuaXNTYW1lRGF5KGUsdCk6IWUmJiF0fWZ1bmN0aW9uIFdlKGUsdCl7cmV0dXJuIGUmJnQ/VC5pc0VxdWFsKGUsdCk6IWUmJiF0fWZ1bmN0aW9uIFFlKGUsdCxyKXt2YXIgbixhPUouc3RhcnRPZkRheSh0KSxvPXYuZW5kT2ZEYXkocik7dHJ5e249Vy5pc1dpdGhpbkludGVydmFsKGUse3N0YXJ0OmEsZW5kOm99KX1jYXRjaChlKXtuPSExfXJldHVybiBufWZ1bmN0aW9uIHFlKCl7cmV0dXJuIHdlKCkuX19sb2NhbGVJZF9ffWZ1bmN0aW9uIEtlKGUpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlKXt2YXIgdD13ZSgpO3JldHVybiB0Ll9fbG9jYWxlRGF0YV9fP3QuX19sb2NhbGVEYXRhX19bZV06dm9pZCAwfXJldHVybiBlfWZ1bmN0aW9uIEJlKGUsdCl7cmV0dXJuIF9lKCQuc2V0TW9udGgoTWUoKSxlKSxcIkxMTExcIix0KX1mdW5jdGlvbiBWZShlLHQpe3JldHVybiBfZSgkLnNldE1vbnRoKE1lKCksZSksXCJMTExcIix0KX1mdW5jdGlvbiBqZShlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWluRGF0ZSxhPXIubWF4RGF0ZSxvPXIuZXhjbHVkZURhdGVzLHM9ci5leGNsdWRlRGF0ZUludGVydmFscyxpPXIuaW5jbHVkZURhdGVzLGw9ci5pbmNsdWRlRGF0ZUludGVydmFscyxjPXIuZmlsdGVyRGF0ZTtyZXR1cm4gdHQoZSx7bWluRGF0ZTpuLG1heERhdGU6YX0pfHxvJiZvLnNvbWUoKGZ1bmN0aW9uKHQpe3ZhciByO3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT9IZShlLHQpOkhlKGUsbnVsbCE9PShyPXQuZGF0ZSkmJnZvaWQgMCE9PXI/cjpuZXcgRGF0ZSl9KSl8fHMmJnMuc29tZSgoZnVuY3Rpb24odCl7dmFyIHI9dC5zdGFydCxuPXQuZW5kO3JldHVybiBXLmlzV2l0aGluSW50ZXJ2YWwoZSx7c3RhcnQ6cixlbmQ6bn0pfSkpfHxpJiYhaS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gSGUoZSx0KX0pKXx8bCYmIWwuc29tZSgoZnVuY3Rpb24odCl7dmFyIHI9dC5zdGFydCxuPXQuZW5kO3JldHVybiBXLmlzV2l0aGluSW50ZXJ2YWwoZSx7c3RhcnQ6cixlbmQ6bn0pfSkpfHxjJiYhYyhNZShlKSl8fCExfWZ1bmN0aW9uIFVlKGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5leGNsdWRlRGF0ZXMsYT1yLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzO3JldHVybiBhJiZhLmxlbmd0aD4wP2Euc29tZSgoZnVuY3Rpb24odCl7dmFyIHI9dC5zdGFydCxuPXQuZW5kO3JldHVybiBXLmlzV2l0aGluSW50ZXJ2YWwoZSx7c3RhcnQ6cixlbmQ6bn0pfSkpOm4mJm4uc29tZSgoZnVuY3Rpb24odCl7dmFyIHI7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlP0hlKGUsdCk6SGUoZSxudWxsIT09KHI9dC5kYXRlKSYmdm9pZCAwIT09cj9yOm5ldyBEYXRlKX0pKXx8ITF9ZnVuY3Rpb24gJGUoZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLm1heERhdGUsbz1yLmV4Y2x1ZGVEYXRlcyxzPXIuaW5jbHVkZURhdGVzLGk9ci5maWx0ZXJEYXRlO3JldHVybiB0dChlLHttaW5EYXRlOm4/Wi5zdGFydE9mTW9udGgobik6dm9pZCAwLG1heERhdGU6YT9nLmVuZE9mTW9udGgoYSk6dm9pZCAwfSl8fChudWxsPT1vP3ZvaWQgMDpvLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBBZShlLHQgaW5zdGFuY2VvZiBEYXRlP3Q6dC5kYXRlKX0pKSl8fHMmJiFzLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBBZShlLHQpfSkpfHxpJiYhaShNZShlKSl8fCExfWZ1bmN0aW9uIHplKGUsdCxyLG4pe3ZhciBhPXguZ2V0WWVhcihlKSxvPV8uZ2V0TW9udGgoZSkscz14LmdldFllYXIodCksaT1fLmdldE1vbnRoKHQpLGw9eC5nZXRZZWFyKG4pO3JldHVybiBhPT09cyYmYT09PWw/bzw9ciYmcjw9aTphPHMmJihsPT09YSYmbzw9cnx8bD09PXMmJmk+PXJ8fGw8cyYmbD5hKX1mdW5jdGlvbiBYZShlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWluRGF0ZSxhPXIubWF4RGF0ZSxvPXIuZXhjbHVkZURhdGVzLHM9ci5pbmNsdWRlRGF0ZXM7cmV0dXJuIHR0KGUse21pbkRhdGU6bixtYXhEYXRlOmF9KXx8byYmby5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gQWUodCBpbnN0YW5jZW9mIERhdGU/dDp0LmRhdGUsZSl9KSl8fHMmJiFzLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBBZSh0LGUpfSkpfHwhMX1mdW5jdGlvbiBHZShlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWluRGF0ZSxhPXIubWF4RGF0ZSxvPXIuZXhjbHVkZURhdGVzLHM9ci5pbmNsdWRlRGF0ZXMsaT1yLmZpbHRlckRhdGU7cmV0dXJuIHR0KGUse21pbkRhdGU6bixtYXhEYXRlOmF9KXx8KG51bGw9PW8/dm9pZCAwOm8uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEZlKGUsdCBpbnN0YW5jZW9mIERhdGU/dDp0LmRhdGUpfSkpKXx8cyYmIXMuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIEZlKGUsdCl9KSl8fGkmJiFpKE1lKGUpKXx8ITF9ZnVuY3Rpb24gSmUoZSx0LHIpe2lmKCF0fHwhcilyZXR1cm4hMTtpZighSC5pc1ZhbGlkKHQpfHwhSC5pc1ZhbGlkKHIpKXJldHVybiExO3ZhciBuPXguZ2V0WWVhcih0KSxhPXguZ2V0WWVhcihyKTtyZXR1cm4gbjw9ZSYmYT49ZX1mdW5jdGlvbiBaZShlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWluRGF0ZSxhPXIubWF4RGF0ZSxvPXIuZXhjbHVkZURhdGVzLHM9ci5pbmNsdWRlRGF0ZXMsaT1yLmZpbHRlckRhdGUsbD1uZXcgRGF0ZShlLDAsMSk7cmV0dXJuIHR0KGwse21pbkRhdGU6bj9yZS5zdGFydE9mWWVhcihuKTp2b2lkIDAsbWF4RGF0ZTphP3kuZW5kT2ZZZWFyKGEpOnZvaWQgMH0pfHwobnVsbD09bz92b2lkIDA6by5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gTGUobCxlIGluc3RhbmNlb2YgRGF0ZT9lOmUuZGF0ZSl9KSkpfHxzJiYhcy5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gTGUobCxlKX0pKXx8aSYmIWkoTWUobCkpfHwhMX1mdW5jdGlvbiBldChlLHQscixuKXt2YXIgYT14LmdldFllYXIoZSksbz1FLmdldFF1YXJ0ZXIoZSkscz14LmdldFllYXIodCksaT1FLmdldFF1YXJ0ZXIodCksbD14LmdldFllYXIobik7cmV0dXJuIGE9PT1zJiZhPT09bD9vPD1yJiZyPD1pOmE8cyYmKGw9PT1hJiZvPD1yfHxsPT09cyYmaT49cnx8bDxzJiZsPmEpfWZ1bmN0aW9uIHR0KGUsdCl7dmFyIHIsbj12b2lkIDA9PT10P3t9OnQsYT1uLm1pbkRhdGUsbz1uLm1heERhdGU7cmV0dXJuIG51bGwhPT0ocj1hJiZ1LmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLGEpPDB8fG8mJnUuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsbyk+MCkmJnZvaWQgMCE9PXImJnJ9ZnVuY3Rpb24gcnQoZSx0KXtyZXR1cm4gdC5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gYi5nZXRIb3Vycyh0KT09PWIuZ2V0SG91cnMoZSkmJkMuZ2V0TWludXRlcyh0KT09PUMuZ2V0TWludXRlcyhlKSYmUC5nZXRTZWNvbmRzKHQpPT09UC5nZXRTZWNvbmRzKGUpfSkpfWZ1bmN0aW9uIG50KGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5leGNsdWRlVGltZXMsYT1yLmluY2x1ZGVUaW1lcyxvPXIuZmlsdGVyVGltZTtyZXR1cm4gbiYmcnQoZSxuKXx8YSYmIXJ0KGUsYSl8fG8mJiFvKGUpfHwhMX1mdW5jdGlvbiBhdChlLHQpe3ZhciByPXQubWluVGltZSxuPXQubWF4VGltZTtpZighcnx8IW4pdGhyb3cgbmV3IEVycm9yKFwiQm90aCBtaW5UaW1lIGFuZCBtYXhUaW1lIHByb3BzIHJlcXVpcmVkXCIpO3ZhciBhPU1lKCk7YT1qLnNldEhvdXJzKGEsYi5nZXRIb3VycyhlKSksYT1VLnNldE1pbnV0ZXMoYSxDLmdldE1pbnV0ZXMoZSkpLGE9WC5zZXRTZWNvbmRzKGEsUC5nZXRTZWNvbmRzKGUpKTt2YXIgbz1NZSgpO289ai5zZXRIb3VycyhvLGIuZ2V0SG91cnMocikpLG89VS5zZXRNaW51dGVzKG8sQy5nZXRNaW51dGVzKHIpKSxvPVguc2V0U2Vjb25kcyhvLFAuZ2V0U2Vjb25kcyhyKSk7dmFyIHMsaT1NZSgpO2k9ai5zZXRIb3VycyhpLGIuZ2V0SG91cnMobikpLGk9VS5zZXRNaW51dGVzKGksQy5nZXRNaW51dGVzKG4pKSxpPVguc2V0U2Vjb25kcyhpLFAuZ2V0U2Vjb25kcyhuKSk7dHJ5e3M9IVcuaXNXaXRoaW5JbnRlcnZhbChhLHtzdGFydDpvLGVuZDppfSl9Y2F0Y2goZSl7cz0hMX1yZXR1cm4gc31mdW5jdGlvbiBvdChlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWluRGF0ZSxhPXIuaW5jbHVkZURhdGVzLG89YWUuc3ViTW9udGhzKGUsMSk7cmV0dXJuIG4mJmYuZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobixvKT4wfHxhJiZhLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gZi5kaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhlLG8pPjB9KSl8fCExfWZ1bmN0aW9uIHN0KGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5tYXhEYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz1pLmFkZE1vbnRocyhlLDEpO3JldHVybiBuJiZmLmRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKG8sbik+MHx8YSYmYS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIGYuZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobyxlKT4wfSkpfHwhMX1mdW5jdGlvbiBpdChlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWluRGF0ZSxhPXIuaW5jbHVkZURhdGVzLG89aWUuc3ViWWVhcnMoZSwxKTtyZXR1cm4gbiYmbS5kaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKG4sbyk+MHx8YSYmYS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIG0uZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhlLG8pPjB9KSl8fCExfWZ1bmN0aW9uIGx0KGUsdCl7dmFyIHI9dm9pZCAwPT09dD97fTp0LG49ci5tYXhEYXRlLGE9ci5pbmNsdWRlRGF0ZXMsbz1kLmFkZFllYXJzKGUsMSk7cmV0dXJuIG4mJm0uZGlmZmVyZW5jZUluQ2FsZW5kYXJZZWFycyhvLG4pPjB8fGEmJmEuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBtLmRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMobyxlKT4wfSkpfHwhMX1mdW5jdGlvbiBjdChlKXt2YXIgdD1lLm1pbkRhdGUscj1lLmluY2x1ZGVEYXRlcztpZihyJiZ0KXt2YXIgbj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIHUuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGUsdCk+PTB9KSk7cmV0dXJuIHEubWluKG4pfXJldHVybiByP3EubWluKHIpOnR9ZnVuY3Rpb24gcHQoZSl7dmFyIHQ9ZS5tYXhEYXRlLHI9ZS5pbmNsdWRlRGF0ZXM7aWYociYmdCl7dmFyIG49ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiB1LmRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhlLHQpPD0wfSkpO3JldHVybiBRLm1heChuKX1yZXR1cm4gcj9RLm1heChyKTp0fWZ1bmN0aW9uIGR0KGUsdCl7dmFyIHI7dm9pZCAwPT09ZSYmKGU9W10pLHZvaWQgMD09PXQmJih0PVwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1oaWdobGlnaHRlZFwiKTtmb3IodmFyIG49bmV3IE1hcCxhPTAsbz1lLmxlbmd0aDthPG87YSsrKXt2YXIgcz1lW2FdO2lmKEkuaXNEYXRlKHMpKXt2YXIgaT1fZShzLFwiTU0uZGQueXl5eVwiKTsoZj1uLmdldChpKXx8W10pLmluY2x1ZGVzKHQpfHwoZi5wdXNoKHQpLG4uc2V0KGksZikpfWVsc2UgaWYoXCJvYmplY3RcIj09dHlwZW9mIHMpe3ZhciBsPW51bGwhPT0ocj1PYmplY3Qua2V5cyhzKVswXSkmJnZvaWQgMCE9PXI/cjpcIlwiLGM9c1tsXTtpZihcInN0cmluZ1wiPT10eXBlb2YgbCYmQXJyYXkuaXNBcnJheShjKSlmb3IodmFyIHA9MCxkPWMubGVuZ3RoO3A8ZDtwKyspe3ZhciB1PWNbcF07aWYodSl7dmFyIGY7aT1fZSh1LFwiTU0uZGQueXl5eVwiKTsoZj1uLmdldChpKXx8W10pLmluY2x1ZGVzKGwpfHwoZi5wdXNoKGwpLG4uc2V0KGksZikpfX19fXJldHVybiBufWZ1bmN0aW9uIHV0KGUsdCl7dm9pZCAwPT09ZSYmKGU9W10pLHZvaWQgMD09PXQmJih0PVwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1ob2xpZGF5c1wiKTt2YXIgcj1uZXcgTWFwO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUuZGF0ZSxhPWUuaG9saWRheU5hbWU7aWYoSS5pc0RhdGUobikpe3ZhciBvPV9lKG4sXCJNTS5kZC55eXl5XCIpLHM9ci5nZXQobyl8fHtjbGFzc05hbWU6XCJcIixob2xpZGF5TmFtZXM6W119O2lmKCEoXCJjbGFzc05hbWVcImluIHMpfHxzLmNsYXNzTmFtZSE9PXR8fChpPXMuaG9saWRheU5hbWVzLGw9W2FdLGkubGVuZ3RoIT09bC5sZW5ndGh8fCFpLmV2ZXJ5KChmdW5jdGlvbihlLHQpe3JldHVybiBlPT09bFt0XX0pKSkpe3ZhciBpLGw7cy5jbGFzc05hbWU9dDt2YXIgYz1zLmhvbGlkYXlOYW1lcztzLmhvbGlkYXlOYW1lcz1jP0RlKERlKFtdLGMsITApLFthXSwhMSk6W2FdLHIuc2V0KG8scyl9fX0pKSxyfWZ1bmN0aW9uIGZ0KGUsdCxyLG4sYSl7Zm9yKHZhciBpPWEubGVuZ3RoLGw9W10scD0wO3A8aTtwKyspe3ZhciBkPWUsdT1hW3BdO3UmJihkPW8uYWRkSG91cnMoZCxiLmdldEhvdXJzKHUpKSxkPXMuYWRkTWludXRlcyhkLEMuZ2V0TWludXRlcyh1KSksZD1jLmFkZFNlY29uZHMoZCxQLmdldFNlY29uZHModSkpKTt2YXIgZj1zLmFkZE1pbnV0ZXMoZSwocisxKSpuKTtOLmlzQWZ0ZXIoZCx0KSYmTy5pc0JlZm9yZShkLGYpJiZudWxsIT11JiZsLnB1c2godSl9cmV0dXJuIGx9ZnVuY3Rpb24gaHQoZSl7cmV0dXJuIGU8MTA/XCIwXCIuY29uY2F0KGUpOlwiXCIuY29uY2F0KGUpfWZ1bmN0aW9uIG10KGUsdCl7dm9pZCAwPT09dCYmKHQ9U2UpO3ZhciByPU1hdGguY2VpbCh4LmdldFllYXIoZSkvdCkqdDtyZXR1cm57c3RhcnRQZXJpb2Q6ci0odC0xKSxlbmRQZXJpb2Q6cn19ZnVuY3Rpb24gdnQoZSl7dmFyIHQ9ZS5nZXRTZWNvbmRzKCkscj1lLmdldE1pbGxpc2Vjb25kcygpO3JldHVybiBsZS50b0RhdGUoZS5nZXRUaW1lKCktMWUzKnQtcil9ZnVuY3Rpb24gZ3QoZSl7aWYoIUkuaXNEYXRlKGUpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGF0ZVwiKTt2YXIgdD1uZXcgRGF0ZShlKTtyZXR1cm4gdC5zZXRIb3VycygwLDAsMCwwKSx0fWZ1bmN0aW9uIER0KGUsdCl7aWYoIUkuaXNEYXRlKGUpfHwhSS5pc0RhdGUodCkpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRlIHJlY2VpdmVkXCIpO3ZhciByPWd0KGUpLG49Z3QodCk7cmV0dXJuIE8uaXNCZWZvcmUocixuKX1mdW5jdGlvbiB5dChlKXtyZXR1cm4gZS5rZXk9PT15ZS5TcGFjZX12YXIga3Qsd3Q9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5vblRpbWVDaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQscjtuLnNldFN0YXRlKHt0aW1lOmV9KTt2YXIgYT1uLnByb3BzLmRhdGUsbz1hIGluc3RhbmNlb2YgRGF0ZSYmIWlzTmFOKCthKT9hOm5ldyBEYXRlO2lmKG51bGw9PWU/dm9pZCAwOmUuaW5jbHVkZXMoXCI6XCIpKXt2YXIgcz1lLnNwbGl0KFwiOlwiKSxpPXNbMF0sbD1zWzFdO28uc2V0SG91cnMoTnVtYmVyKGkpKSxvLnNldE1pbnV0ZXMoTnVtYmVyKGwpKX1udWxsPT09KHI9KHQ9bi5wcm9wcykub25DaGFuZ2UpfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxvKX0sbi5yZW5kZXJUaW1lSW5wdXQ9ZnVuY3Rpb24oKXt2YXIgZT1uLnN0YXRlLnRpbWUsdD1uLnByb3BzLGE9dC5kYXRlLG89dC50aW1lU3RyaW5nLHM9dC5jdXN0b21UaW1lSW5wdXQ7cmV0dXJuIHM/ci5jbG9uZUVsZW1lbnQocyx7ZGF0ZTphLHZhbHVlOmUsb25DaGFuZ2U6bi5vblRpbWVDaGFuZ2V9KTp1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLHt0eXBlOlwidGltZVwiLGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXRcIixwbGFjZWhvbGRlcjpcIlRpbWVcIixuYW1lOlwidGltZS1pbnB1dFwiLHJlcXVpcmVkOiEwLHZhbHVlOmUsb25DaGFuZ2U6ZnVuY3Rpb24oZSl7bi5vblRpbWVDaGFuZ2UoZS50YXJnZXQudmFsdWV8fG8pfX0pfSxuLnN0YXRlPXt0aW1lOm4ucHJvcHMudGltZVN0cmluZ30sbn1yZXR1cm4gdmUodCxlKSx0LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz1mdW5jdGlvbihlLHQpe3JldHVybiBlLnRpbWVTdHJpbmchPT10LnRpbWU/e3RpbWU6ZS50aW1lU3RyaW5nfTpudWxsfSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LXRpbWUtY29udGFpbmVyXCJ9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyLXRpbWVfX2NhcHRpb25cIn0sdGhpcy5wcm9wcy50aW1lSW5wdXRMYWJlbCksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXItdGltZV9faW5wdXQtY29udGFpbmVyXCJ9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyLXRpbWVfX2lucHV0XCJ9LHRoaXMucmVuZGVyVGltZUlucHV0KCkpKSl9LHR9KHIuQ29tcG9uZW50KSxTdD1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKCl7dmFyIG49bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLmRheUVsPXIuY3JlYXRlUmVmKCksbi5oYW5kbGVDbGljaz1mdW5jdGlvbihlKXshbi5pc0Rpc2FibGVkKCkmJm4ucHJvcHMub25DbGljayYmbi5wcm9wcy5vbkNsaWNrKGUpfSxuLmhhbmRsZU1vdXNlRW50ZXI9ZnVuY3Rpb24oZSl7IW4uaXNEaXNhYmxlZCgpJiZuLnByb3BzLm9uTW91c2VFbnRlciYmbi5wcm9wcy5vbk1vdXNlRW50ZXIoZSl9LG4uaGFuZGxlT25LZXlEb3duPWZ1bmN0aW9uKGUpe3ZhciB0LHI7ZS5rZXk9PT15ZS5TcGFjZSYmKGUucHJldmVudERlZmF1bHQoKSxlLmtleT15ZS5FbnRlciksbnVsbD09PShyPSh0PW4ucHJvcHMpLmhhbmRsZU9uS2V5RG93bil8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpfSxuLmlzU2FtZURheT1mdW5jdGlvbihlKXtyZXR1cm4gSGUobi5wcm9wcy5kYXksZSl9LG4uaXNLZXlib2FyZFNlbGVjdGVkPWZ1bmN0aW9uKCl7dmFyIGU7aWYobi5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbilyZXR1cm4hMTt2YXIgdD1uLnByb3BzLnNlbGVjdHNNdWx0aXBsZT9udWxsPT09KGU9bi5wcm9wcy5zZWxlY3RlZERhdGVzKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gbi5pc1NhbWVEYXlPcldlZWsoZSl9KSk6bi5pc1NhbWVEYXlPcldlZWsobi5wcm9wcy5zZWxlY3RlZCkscj1uLnByb3BzLnByZVNlbGVjdGlvbiYmbi5pc0Rpc2FibGVkKG4ucHJvcHMucHJlU2VsZWN0aW9uKTtyZXR1cm4hdCYmbi5pc1NhbWVEYXlPcldlZWsobi5wcm9wcy5wcmVTZWxlY3Rpb24pJiYhcn0sbi5pc0Rpc2FibGVkPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1uLnByb3BzLmRheSksamUoZSx7bWluRGF0ZTpuLnByb3BzLm1pbkRhdGUsbWF4RGF0ZTpuLnByb3BzLm1heERhdGUsZXhjbHVkZURhdGVzOm4ucHJvcHMuZXhjbHVkZURhdGVzLGV4Y2x1ZGVEYXRlSW50ZXJ2YWxzOm4ucHJvcHMuZXhjbHVkZURhdGVJbnRlcnZhbHMsaW5jbHVkZURhdGVJbnRlcnZhbHM6bi5wcm9wcy5pbmNsdWRlRGF0ZUludGVydmFscyxpbmNsdWRlRGF0ZXM6bi5wcm9wcy5pbmNsdWRlRGF0ZXMsZmlsdGVyRGF0ZTpuLnByb3BzLmZpbHRlckRhdGV9KX0sbi5pc0V4Y2x1ZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIFVlKG4ucHJvcHMuZGF5LHtleGNsdWRlRGF0ZXM6bi5wcm9wcy5leGNsdWRlRGF0ZXMsZXhjbHVkZURhdGVJbnRlcnZhbHM6bi5wcm9wcy5leGNsdWRlRGF0ZUludGVydmFsc30pfSxuLmlzU3RhcnRPZldlZWs9ZnVuY3Rpb24oKXtyZXR1cm4gSGUobi5wcm9wcy5kYXkseGUobi5wcm9wcy5kYXksbi5wcm9wcy5sb2NhbGUsbi5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KSl9LG4uaXNTYW1lV2Vlaz1mdW5jdGlvbihlKXtyZXR1cm4gbi5wcm9wcy5zaG93V2Vla1BpY2tlciYmSGUoZSx4ZShuLnByb3BzLmRheSxuLnByb3BzLmxvY2FsZSxuLnByb3BzLmNhbGVuZGFyU3RhcnREYXkpKX0sbi5pc1NhbWVEYXlPcldlZWs9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uaXNTYW1lRGF5KGUpfHxuLmlzU2FtZVdlZWsoZSl9LG4uZ2V0SGlnaExpZ2h0ZWRDbGFzcz1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMsdD1lLmRheSxyPWUuaGlnaGxpZ2h0RGF0ZXM7aWYoIXIpcmV0dXJuITE7dmFyIGE9X2UodCxcIk1NLmRkLnl5eXlcIik7cmV0dXJuIHIuZ2V0KGEpfSxuLmdldEhvbGlkYXlzQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgZSx0PW4ucHJvcHMscj10LmRheSxhPXQuaG9saWRheXM7aWYoIWEpcmV0dXJuW3ZvaWQgMF07dmFyIG89X2UocixcIk1NLmRkLnl5eXlcIik7cmV0dXJuIGEuaGFzKG8pP1tudWxsPT09KGU9YS5nZXQobykpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNsYXNzTmFtZV06W3ZvaWQgMF19LG4uaXNJblJhbmdlPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyx0PWUuZGF5LHI9ZS5zdGFydERhdGUsYT1lLmVuZERhdGU7cmV0dXJuISghcnx8IWEpJiZRZSh0LHIsYSl9LG4uaXNJblNlbGVjdGluZ1JhbmdlPWZ1bmN0aW9uKCl7dmFyIGUsdD1uLnByb3BzLHI9dC5kYXksYT10LnNlbGVjdHNTdGFydCxvPXQuc2VsZWN0c0VuZCxzPXQuc2VsZWN0c1JhbmdlLGk9dC5zZWxlY3RzRGlzYWJsZWREYXlzSW5SYW5nZSxsPXQuc3RhcnREYXRlLGM9dC5lbmREYXRlLHA9bnVsbCE9PShlPW4ucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PWU/ZTpuLnByb3BzLnByZVNlbGVjdGlvbjtyZXR1cm4hKCEoYXx8b3x8cyl8fCFwfHwhaSYmbi5pc0Rpc2FibGVkKCkpJiYoYSYmYyYmKE8uaXNCZWZvcmUocCxjKXx8V2UocCxjKSk/UWUocixwLGMpOihvJiZsJiYoTi5pc0FmdGVyKHAsbCl8fFdlKHAsbCkpfHwhKCFzfHwhbHx8Y3x8IU4uaXNBZnRlcihwLGwpJiYhV2UocCxsKSkpJiZRZShyLGwscCkpfSxuLmlzU2VsZWN0aW5nUmFuZ2VTdGFydD1mdW5jdGlvbigpe3ZhciBlO2lmKCFuLmlzSW5TZWxlY3RpbmdSYW5nZSgpKXJldHVybiExO3ZhciB0PW4ucHJvcHMscj10LmRheSxhPXQuc3RhcnREYXRlLG89dC5zZWxlY3RzU3RhcnQscz1udWxsIT09KGU9bi5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09ZT9lOm4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybiBIZShyLG8/czphKX0sbi5pc1NlbGVjdGluZ1JhbmdlRW5kPWZ1bmN0aW9uKCl7dmFyIGU7aWYoIW4uaXNJblNlbGVjdGluZ1JhbmdlKCkpcmV0dXJuITE7dmFyIHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5lbmREYXRlLG89dC5zZWxlY3RzRW5kLHM9dC5zZWxlY3RzUmFuZ2UsaT1udWxsIT09KGU9bi5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09ZT9lOm4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybiBIZShyLG98fHM/aTphKX0sbi5pc1JhbmdlU3RhcnQ9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLnN0YXJ0RGF0ZSxhPWUuZW5kRGF0ZTtyZXR1cm4hKCFyfHwhYSkmJkhlKHIsdCl9LG4uaXNSYW5nZUVuZD1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMsdD1lLmRheSxyPWUuc3RhcnREYXRlLGE9ZS5lbmREYXRlO3JldHVybiEoIXJ8fCFhKSYmSGUoYSx0KX0sbi5pc1dlZWtlbmQ9ZnVuY3Rpb24oKXt2YXIgZT1TLmdldERheShuLnByb3BzLmRheSk7cmV0dXJuIDA9PT1lfHw2PT09ZX0sbi5pc0FmdGVyTW9udGg9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09bi5wcm9wcy5tb250aCYmKG4ucHJvcHMubW9udGgrMSklMTI9PT1fLmdldE1vbnRoKG4ucHJvcHMuZGF5KX0sbi5pc0JlZm9yZU1vbnRoPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PW4ucHJvcHMubW9udGgmJihfLmdldE1vbnRoKG4ucHJvcHMuZGF5KSsxKSUxMj09PW4ucHJvcHMubW9udGh9LG4uaXNDdXJyZW50RGF5PWZ1bmN0aW9uKCl7cmV0dXJuIG4uaXNTYW1lRGF5KE1lKCkpfSxuLmlzU2VsZWN0ZWQ9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gbi5wcm9wcy5zZWxlY3RzTXVsdGlwbGU/bnVsbD09PShlPW4ucHJvcHMuc2VsZWN0ZWREYXRlcyl8fHZvaWQgMD09PWU/dm9pZCAwOmUuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIG4uaXNTYW1lRGF5T3JXZWVrKGUpfSkpOm4uaXNTYW1lRGF5T3JXZWVrKG4ucHJvcHMuc2VsZWN0ZWQpfSxuLmdldENsYXNzTmFtZXM9ZnVuY3Rpb24oZSl7dmFyIHIsYT1uLnByb3BzLmRheUNsYXNzTmFtZT9uLnByb3BzLmRheUNsYXNzTmFtZShlKTp2b2lkIDA7cmV0dXJuIHQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJfX2RheVwiLGEsXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLVwiK19lKG4ucHJvcHMuZGF5LFwiZGRkXCIscikse1wicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1kaXNhYmxlZFwiOm4uaXNEaXNhYmxlZCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1leGNsdWRlZFwiOm4uaXNFeGNsdWRlZCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RlZFwiOm4uaXNTZWxlY3RlZCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1rZXlib2FyZC1zZWxlY3RlZFwiOm4uaXNLZXlib2FyZFNlbGVjdGVkKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXJhbmdlLXN0YXJ0XCI6bi5pc1JhbmdlU3RhcnQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tcmFuZ2UtZW5kXCI6bi5pc1JhbmdlRW5kKCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLWluLXJhbmdlXCI6bi5pc0luUmFuZ2UoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0taW4tc2VsZWN0aW5nLXJhbmdlXCI6bi5pc0luU2VsZWN0aW5nUmFuZ2UoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tc2VsZWN0aW5nLXJhbmdlLXN0YXJ0XCI6bi5pc1NlbGVjdGluZ1JhbmdlU3RhcnQoKSxcInJlYWN0LWRhdGVwaWNrZXJfX2RheS0tc2VsZWN0aW5nLXJhbmdlLWVuZFwiOm4uaXNTZWxlY3RpbmdSYW5nZUVuZCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS10b2RheVwiOm4uaXNDdXJyZW50RGF5KCksXCJyZWFjdC1kYXRlcGlja2VyX19kYXktLXdlZWtlbmRcIjpuLmlzV2Vla2VuZCgpLFwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LS1vdXRzaWRlLW1vbnRoXCI6bi5pc0FmdGVyTW9udGgoKXx8bi5pc0JlZm9yZU1vbnRoKCl9LG4uZ2V0SGlnaExpZ2h0ZWRDbGFzcygpLG4uZ2V0SG9saWRheXNDbGFzcygpKX0sbi5nZXRBcmlhTGFiZWw9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLHQ9ZS5kYXkscj1lLmFyaWFMYWJlbFByZWZpeFdoZW5FbmFibGVkLGE9dm9pZCAwPT09cj9cIkNob29zZVwiOnIsbz1lLmFyaWFMYWJlbFByZWZpeFdoZW5EaXNhYmxlZCxzPXZvaWQgMD09PW8/XCJOb3QgYXZhaWxhYmxlXCI6byxpPW4uaXNEaXNhYmxlZCgpfHxuLmlzRXhjbHVkZWQoKT9zOmE7cmV0dXJuXCJcIi5jb25jYXQoaSxcIiBcIikuY29uY2F0KF9lKHQsXCJQUFBQXCIsbi5wcm9wcy5sb2NhbGUpKX0sbi5nZXRUaXRsZT1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMsdD1lLmRheSxyPWUuaG9saWRheXMsYT12b2lkIDA9PT1yP25ldyBNYXA6cixvPWUuZXhjbHVkZURhdGVzLHM9X2UodCxcIk1NLmRkLnl5eXlcIiksaT1bXTtyZXR1cm4gYS5oYXMocykmJmkucHVzaC5hcHBseShpLGEuZ2V0KHMpLmhvbGlkYXlOYW1lcyksbi5pc0V4Y2x1ZGVkKCkmJmkucHVzaChudWxsPT1vP3ZvaWQgMDpvLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBEYXRlP0hlKGUsdCk6SGUobnVsbD09ZT92b2lkIDA6ZS5kYXRlLHQpfSkpLm1hcCgoZnVuY3Rpb24oZSl7aWYoIShlIGluc3RhbmNlb2YgRGF0ZSkpcmV0dXJuIG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZX0pKSksaS5qb2luKFwiLCBcIil9LG4uZ2V0VGFiSW5kZXg9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLnNlbGVjdGVkLHQ9bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuKCFuLnByb3BzLnNob3dXZWVrUGlja2VyfHwhbi5wcm9wcy5zaG93V2Vla051bWJlciYmbi5pc1N0YXJ0T2ZXZWVrKCkpJiYobi5pc0tleWJvYXJkU2VsZWN0ZWQoKXx8bi5pc1NhbWVEYXkoZSkmJkhlKHQsZSkpPzA6LTF9LG4uaGFuZGxlRm9jdXNEYXk9ZnVuY3Rpb24oKXt2YXIgZTtuLnNob3VsZEZvY3VzRGF5KCkmJihudWxsPT09KGU9bi5kYXlFbC5jdXJyZW50KXx8dm9pZCAwPT09ZXx8ZS5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pKX0sbi5yZW5kZXJEYXlDb250ZW50cz1mdW5jdGlvbigpe3JldHVybiBuLnByb3BzLm1vbnRoU2hvd3NEdXBsaWNhdGVEYXlzRW5kJiZuLmlzQWZ0ZXJNb250aCgpfHxuLnByb3BzLm1vbnRoU2hvd3NEdXBsaWNhdGVEYXlzU3RhcnQmJm4uaXNCZWZvcmVNb250aCgpP251bGw6bi5wcm9wcy5yZW5kZXJEYXlDb250ZW50cz9uLnByb3BzLnJlbmRlckRheUNvbnRlbnRzKHcuZ2V0RGF0ZShuLnByb3BzLmRheSksbi5wcm9wcy5kYXkpOncuZ2V0RGF0ZShuLnByb3BzLmRheSl9LG4ucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtyZWY6bi5kYXlFbCxjbGFzc05hbWU6bi5nZXRDbGFzc05hbWVzKG4ucHJvcHMuZGF5KSxvbktleURvd246bi5oYW5kbGVPbktleURvd24sb25DbGljazpuLmhhbmRsZUNsaWNrLG9uTW91c2VFbnRlcjpuLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6bi5oYW5kbGVNb3VzZUVudGVyLG9uUG9pbnRlckVudGVyOm4ucHJvcHMudXNlUG9pbnRlckV2ZW50P24uaGFuZGxlTW91c2VFbnRlcjp2b2lkIDAsdGFiSW5kZXg6bi5nZXRUYWJJbmRleCgpLFwiYXJpYS1sYWJlbFwiOm4uZ2V0QXJpYUxhYmVsKCkscm9sZTpcIm9wdGlvblwiLHRpdGxlOm4uZ2V0VGl0bGUoKSxcImFyaWEtZGlzYWJsZWRcIjpuLmlzRGlzYWJsZWQoKSxcImFyaWEtY3VycmVudFwiOm4uaXNDdXJyZW50RGF5KCk/XCJkYXRlXCI6dm9pZCAwLFwiYXJpYS1zZWxlY3RlZFwiOm4uaXNTZWxlY3RlZCgpfHxuLmlzSW5SYW5nZSgpfSxuLnJlbmRlckRheUNvbnRlbnRzKCksXCJcIiE9PW4uZ2V0VGl0bGUoKSYmdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJvdmVybGF5XCJ9LG4uZ2V0VGl0bGUoKSkpfSxufXJldHVybiB2ZShuLGUpLG4ucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVGb2N1c0RheSgpfSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmhhbmRsZUZvY3VzRGF5KCl9LG4ucHJvdG90eXBlLnNob3VsZEZvY3VzRGF5PWZ1bmN0aW9uKCl7dmFyIGU9ITE7cmV0dXJuIDA9PT10aGlzLmdldFRhYkluZGV4KCkmJnRoaXMuaXNTYW1lRGF5KHRoaXMucHJvcHMucHJlU2VsZWN0aW9uKSYmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT1kb2N1bWVudC5ib2R5fHwoZT0hMCksdGhpcy5wcm9wcy5pbmxpbmUmJiF0aGlzLnByb3BzLnNob3VsZEZvY3VzRGF5SW5saW5lJiYoZT0hMSksdGhpcy5pc0RheUFjdGl2ZUVsZW1lbnQoKSYmKGU9ITApLHRoaXMuaXNEdXBsaWNhdGVEYXkoKSYmKGU9ITEpKSxlfSxuLnByb3RvdHlwZS5pc0RheUFjdGl2ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgZSx0LHI7cmV0dXJuKG51bGw9PT0odD1udWxsPT09KGU9dGhpcy5wcm9wcy5jb250YWluZXJSZWYpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmN1cnJlbnQpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSYmKG51bGw9PT0ocj1kb2N1bWVudC5hY3RpdmVFbGVtZW50KXx8dm9pZCAwPT09cj92b2lkIDA6ci5jbGFzc0xpc3QuY29udGFpbnMoXCJyZWFjdC1kYXRlcGlja2VyX19kYXlcIikpfSxuLnByb3RvdHlwZS5pc0R1cGxpY2F0ZURheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3BzLm1vbnRoU2hvd3NEdXBsaWNhdGVEYXlzRW5kJiZ0aGlzLmlzQWZ0ZXJNb250aCgpfHx0aGlzLnByb3BzLm1vbnRoU2hvd3NEdXBsaWNhdGVEYXlzU3RhcnQmJnRoaXMuaXNCZWZvcmVNb250aCgpfSxufShyLkNvbXBvbmVudCksYnQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe3ZhciB0PW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gdC53ZWVrTnVtYmVyRWw9ci5jcmVhdGVSZWYoKSx0LmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGUpe3QucHJvcHMub25DbGljayYmdC5wcm9wcy5vbkNsaWNrKGUpfSx0LmhhbmRsZU9uS2V5RG93bj1mdW5jdGlvbihlKXt2YXIgcixuO2Uua2V5PT09eWUuU3BhY2UmJihlLnByZXZlbnREZWZhdWx0KCksZS5rZXk9eWUuRW50ZXIpLG51bGw9PT0obj0ocj10LnByb3BzKS5oYW5kbGVPbktleURvd24pfHx2b2lkIDA9PT1ufHxuLmNhbGwocixlKX0sdC5pc0tleWJvYXJkU2VsZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hdC5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbiYmIUhlKHQucHJvcHMuZGF0ZSx0LnByb3BzLnNlbGVjdGVkKSYmSGUodC5wcm9wcy5kYXRlLHQucHJvcHMucHJlU2VsZWN0aW9uKX0sdC5nZXRUYWJJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LnByb3BzLnNob3dXZWVrUGlja2VyJiZ0LnByb3BzLnNob3dXZWVrTnVtYmVyJiYodC5pc0tleWJvYXJkU2VsZWN0ZWQoKXx8SGUodC5wcm9wcy5kYXRlLHQucHJvcHMuc2VsZWN0ZWQpJiZIZSh0LnByb3BzLnByZVNlbGVjdGlvbix0LnByb3BzLnNlbGVjdGVkKSk/MDotMX0sdC5oYW5kbGVGb2N1c1dlZWtOdW1iZXI9ZnVuY3Rpb24oZSl7dmFyIHI9ITE7MD09PXQuZ2V0VGFiSW5kZXgoKSYmIShudWxsPT1lP3ZvaWQgMDplLmlzSW5wdXRGb2N1c2VkKSYmSGUodC5wcm9wcy5kYXRlLHQucHJvcHMucHJlU2VsZWN0aW9uKSYmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT1kb2N1bWVudC5ib2R5fHwocj0hMCksdC5wcm9wcy5pbmxpbmUmJiF0LnByb3BzLnNob3VsZEZvY3VzRGF5SW5saW5lJiYocj0hMSksdC5wcm9wcy5jb250YWluZXJSZWYmJnQucHJvcHMuY29udGFpbmVyUmVmLmN1cnJlbnQmJnQucHJvcHMuY29udGFpbmVyUmVmLmN1cnJlbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXJcIikmJihyPSEwKSksciYmdC53ZWVrTnVtYmVyRWwuY3VycmVudCYmdC53ZWVrTnVtYmVyRWwuY3VycmVudC5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pfSx0fXJldHVybiB2ZShuLGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwiZGVmYXVsdFByb3BzXCIse2dldDpmdW5jdGlvbigpe3JldHVybnthcmlhTGFiZWxQcmVmaXg6XCJ3ZWVrIFwifX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3RoaXMuaGFuZGxlRm9jdXNXZWVrTnVtYmVyKCl9LG4ucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZUZvY3VzV2Vla051bWJlcihlKX0sbi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyxyPWUud2Vla051bWJlcixhPWUuYXJpYUxhYmVsUHJlZml4LG89dm9pZCAwPT09YT9uLmRlZmF1bHRQcm9wcy5hcmlhTGFiZWxQcmVmaXg6YSxzPWUub25DbGljayxpPXtcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWstbnVtYmVyXCI6ITAsXCJyZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0tY2xpY2thYmxlXCI6ISFzLFwicmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay1udW1iZXItLXNlbGVjdGVkXCI6ISFzJiZIZSh0aGlzLnByb3BzLmRhdGUsdGhpcy5wcm9wcy5zZWxlY3RlZCksXCJyZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlci0ta2V5Ym9hcmQtc2VsZWN0ZWRcIjp0aGlzLmlzS2V5Ym9hcmRTZWxlY3RlZCgpfTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse3JlZjp0aGlzLndlZWtOdW1iZXJFbCxjbGFzc05hbWU6dC5jbHN4KGkpLFwiYXJpYS1sYWJlbFwiOlwiXCIuY29uY2F0KG8sXCIgXCIpLmNvbmNhdCh0aGlzLnByb3BzLndlZWtOdW1iZXIpLG9uQ2xpY2s6dGhpcy5oYW5kbGVDbGljayxvbktleURvd246dGhpcy5oYW5kbGVPbktleURvd24sdGFiSW5kZXg6dGhpcy5nZXRUYWJJbmRleCgpfSxyKX0sbn0oci5Db21wb25lbnQpLE10PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuaXNEaXNhYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gamUoZSx7bWluRGF0ZTp0LnByb3BzLm1pbkRhdGUsbWF4RGF0ZTp0LnByb3BzLm1heERhdGUsZXhjbHVkZURhdGVzOnQucHJvcHMuZXhjbHVkZURhdGVzLGV4Y2x1ZGVEYXRlSW50ZXJ2YWxzOnQucHJvcHMuZXhjbHVkZURhdGVJbnRlcnZhbHMsaW5jbHVkZURhdGVJbnRlcnZhbHM6dC5wcm9wcy5pbmNsdWRlRGF0ZUludGVydmFscyxpbmNsdWRlRGF0ZXM6dC5wcm9wcy5pbmNsdWRlRGF0ZXMsZmlsdGVyRGF0ZTp0LnByb3BzLmZpbHRlckRhdGV9KX0sdC5oYW5kbGVEYXlDbGljaz1mdW5jdGlvbihlLHIpe3QucHJvcHMub25EYXlDbGljayYmdC5wcm9wcy5vbkRheUNsaWNrKGUscil9LHQuaGFuZGxlRGF5TW91c2VFbnRlcj1mdW5jdGlvbihlKXt0LnByb3BzLm9uRGF5TW91c2VFbnRlciYmdC5wcm9wcy5vbkRheU1vdXNlRW50ZXIoZSl9LHQuaGFuZGxlV2Vla0NsaWNrPWZ1bmN0aW9uKGUsbixhKXtmb3IodmFyIG8scyxpLGw9bmV3IERhdGUoZSksYz0wO2M8NztjKyspe3ZhciBwPW5ldyBEYXRlKGUpO2lmKHAuc2V0RGF0ZShwLmdldERhdGUoKStjKSwhdC5pc0Rpc2FibGVkKHApKXtsPXA7YnJlYWt9fVwiZnVuY3Rpb25cIj09dHlwZW9mIHQucHJvcHMub25XZWVrU2VsZWN0JiZ0LnByb3BzLm9uV2Vla1NlbGVjdChsLG4sYSksdC5wcm9wcy5zaG93V2Vla1BpY2tlciYmdC5oYW5kbGVEYXlDbGljayhsLGEpLChudWxsIT09KG89dC5wcm9wcy5zaG91bGRDbG9zZU9uU2VsZWN0KSYmdm9pZCAwIT09bz9vOnIuZGVmYXVsdFByb3BzLnNob3VsZENsb3NlT25TZWxlY3QpJiYobnVsbD09PShpPShzPXQucHJvcHMpLnNldE9wZW4pfHx2b2lkIDA9PT1pfHxpLmNhbGwocywhMSkpfSx0LmZvcm1hdFdlZWtOdW1iZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvcHMuZm9ybWF0V2Vla051bWJlcj90LnByb3BzLmZvcm1hdFdlZWtOdW1iZXIoZSk6ZnVuY3Rpb24oZSl7cmV0dXJuIE0uZ2V0SVNPV2VlayhlKX0oZSl9LHQucmVuZGVyRGF5cz1mdW5jdGlvbigpe3ZhciBlPXQuc3RhcnRPZldlZWsoKSxuPVtdLG89dC5mb3JtYXRXZWVrTnVtYmVyKGUpO2lmKHQucHJvcHMuc2hvd1dlZWtOdW1iZXIpe3ZhciBzPXQucHJvcHMub25XZWVrU2VsZWN0fHx0LnByb3BzLnNob3dXZWVrUGlja2VyP3QuaGFuZGxlV2Vla0NsaWNrLmJpbmQodCxlLG8pOnZvaWQgMDtuLnB1c2godWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGJ0LGdlKHtrZXk6XCJXXCJ9LHIuZGVmYXVsdFByb3BzLHQucHJvcHMse3dlZWtOdW1iZXI6byxkYXRlOmUsb25DbGljazpzfSkpKX1yZXR1cm4gbi5jb25jYXQoWzAsMSwyLDMsNCw1LDZdLm1hcCgoZnVuY3Rpb24obil7dmFyIG89YS5hZGREYXlzKGUsbik7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChTdCxnZSh7fSxyLmRlZmF1bHRQcm9wcyx0LnByb3BzLHthcmlhTGFiZWxQcmVmaXhXaGVuRW5hYmxlZDp0LnByb3BzLmNob29zZURheUFyaWFMYWJlbFByZWZpeCxhcmlhTGFiZWxQcmVmaXhXaGVuRGlzYWJsZWQ6dC5wcm9wcy5kaXNhYmxlZERheUFyaWFMYWJlbFByZWZpeCxrZXk6by52YWx1ZU9mKCksZGF5Om8sb25DbGljazp0LmhhbmRsZURheUNsaWNrLmJpbmQodCxvKSxvbk1vdXNlRW50ZXI6dC5oYW5kbGVEYXlNb3VzZUVudGVyLmJpbmQodCxvKX0pKX0pKSl9LHQuc3RhcnRPZldlZWs9ZnVuY3Rpb24oKXtyZXR1cm4geGUodC5wcm9wcy5kYXksdC5wcm9wcy5sb2NhbGUsdC5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KX0sdC5pc0tleWJvYXJkU2VsZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hdC5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbiYmIUhlKHQuc3RhcnRPZldlZWsoKSx0LnByb3BzLnNlbGVjdGVkKSYmSGUodC5zdGFydE9mV2VlaygpLHQucHJvcHMucHJlU2VsZWN0aW9uKX0sdH1yZXR1cm4gdmUocixlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixcImRlZmF1bHRQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57c2hvdWxkQ2xvc2VPblNlbGVjdDohMH19LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksci5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9e1wicmVhY3QtZGF0ZXBpY2tlcl9fd2Vla1wiOiEwLFwicmVhY3QtZGF0ZXBpY2tlcl9fd2Vlay0tc2VsZWN0ZWRcIjpIZSh0aGlzLnN0YXJ0T2ZXZWVrKCksdGhpcy5wcm9wcy5zZWxlY3RlZCksXCJyZWFjdC1kYXRlcGlja2VyX193ZWVrLS1rZXlib2FyZC1zZWxlY3RlZFwiOnRoaXMuaXNLZXlib2FyZFNlbGVjdGVkKCl9O3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOnQuY2xzeChlKX0sdGhpcy5yZW5kZXJEYXlzKCkpfSxyfShyLkNvbXBvbmVudCksQ3Q9XCJ0d29fY29sdW1uc1wiLF90PVwidGhyZWVfY29sdW1uc1wiLEV0PVwiZm91cl9jb2x1bW5zXCIsUHQ9KChrdD17fSlbQ3RdPXtncmlkOltbMCwxXSxbMiwzXSxbNCw1XSxbNiw3XSxbOCw5XSxbMTAsMTFdXSx2ZXJ0aWNhbE5hdmlnYXRpb25PZmZzZXQ6Mn0sa3RbX3RdPXtncmlkOltbMCwxLDJdLFszLDQsNV0sWzYsNyw4XSxbOSwxMCwxMV1dLHZlcnRpY2FsTmF2aWdhdGlvbk9mZnNldDozfSxrdFtFdF09e2dyaWQ6W1swLDEsMiwzXSxbNCw1LDYsN10sWzgsOSwxMCwxMV1dLHZlcnRpY2FsTmF2aWdhdGlvbk9mZnNldDo0fSxrdCk7ZnVuY3Rpb24gWXQoZSx0KXtyZXR1cm4gZT9FdDp0P0N0Ol90fXZhciB4dD1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKCl7dmFyIG49bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBuLk1PTlRIX1JFRlM9RGUoW10sQXJyYXkoMTIpLCEwKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIHIuY3JlYXRlUmVmKCl9KSksbi5RVUFSVEVSX1JFRlM9RGUoW10sQXJyYXkoNCksITApLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gci5jcmVhdGVSZWYoKX0pKSxuLmlzRGlzYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGplKGUse21pbkRhdGU6bi5wcm9wcy5taW5EYXRlLG1heERhdGU6bi5wcm9wcy5tYXhEYXRlLGV4Y2x1ZGVEYXRlczpuLnByb3BzLmV4Y2x1ZGVEYXRlcyxleGNsdWRlRGF0ZUludGVydmFsczpuLnByb3BzLmV4Y2x1ZGVEYXRlSW50ZXJ2YWxzLGluY2x1ZGVEYXRlSW50ZXJ2YWxzOm4ucHJvcHMuaW5jbHVkZURhdGVJbnRlcnZhbHMsaW5jbHVkZURhdGVzOm4ucHJvcHMuaW5jbHVkZURhdGVzLGZpbHRlckRhdGU6bi5wcm9wcy5maWx0ZXJEYXRlfSl9LG4uaXNFeGNsdWRlZD1mdW5jdGlvbihlKXtyZXR1cm4gVWUoZSx7ZXhjbHVkZURhdGVzOm4ucHJvcHMuZXhjbHVkZURhdGVzLGV4Y2x1ZGVEYXRlSW50ZXJ2YWxzOm4ucHJvcHMuZXhjbHVkZURhdGVJbnRlcnZhbHN9KX0sbi5oYW5kbGVEYXlDbGljaz1mdW5jdGlvbihlLHQpe3ZhciByLGE7bnVsbD09PShhPShyPW4ucHJvcHMpLm9uRGF5Q2xpY2spfHx2b2lkIDA9PT1hfHxhLmNhbGwocixlLHQsbi5wcm9wcy5vcmRlckluRGlzcGxheSl9LG4uaGFuZGxlRGF5TW91c2VFbnRlcj1mdW5jdGlvbihlKXt2YXIgdCxyO251bGw9PT0ocj0odD1uLnByb3BzKS5vbkRheU1vdXNlRW50ZXIpfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKX0sbi5oYW5kbGVNb3VzZUxlYXZlPWZ1bmN0aW9uKCl7dmFyIGUsdDtudWxsPT09KHQ9KGU9bi5wcm9wcykub25Nb3VzZUxlYXZlKXx8dm9pZCAwPT09dHx8dC5jYWxsKGUpfSxuLmlzUmFuZ2VTdGFydE1vbnRoPWZ1bmN0aW9uKGUpe3ZhciB0PW4ucHJvcHMscj10LmRheSxhPXQuc3RhcnREYXRlLG89dC5lbmREYXRlO3JldHVybiEoIWF8fCFvKSYmQWUoJC5zZXRNb250aChyLGUpLGEpfSxuLmlzUmFuZ2VTdGFydFF1YXJ0ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5zdGFydERhdGUsbz10LmVuZERhdGU7cmV0dXJuISghYXx8IW8pJiZGZSh6LnNldFF1YXJ0ZXIocixlKSxhKX0sbi5pc1JhbmdlRW5kTW9udGg9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5zdGFydERhdGUsbz10LmVuZERhdGU7cmV0dXJuISghYXx8IW8pJiZBZSgkLnNldE1vbnRoKHIsZSksbyl9LG4uaXNSYW5nZUVuZFF1YXJ0ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5wcm9wcyxyPXQuZGF5LGE9dC5zdGFydERhdGUsbz10LmVuZERhdGU7cmV0dXJuISghYXx8IW8pJiZGZSh6LnNldFF1YXJ0ZXIocixlKSxvKX0sbi5pc0luU2VsZWN0aW5nUmFuZ2VNb250aD1mdW5jdGlvbihlKXt2YXIgdCxyPW4ucHJvcHMsYT1yLmRheSxvPXIuc2VsZWN0c1N0YXJ0LHM9ci5zZWxlY3RzRW5kLGk9ci5zZWxlY3RzUmFuZ2UsbD1yLnN0YXJ0RGF0ZSxjPXIuZW5kRGF0ZSxwPW51bGwhPT0odD1uLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT10P3Q6bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuISghKG98fHN8fGkpfHwhcCkmJihvJiZjP3plKHAsYyxlLGEpOihzJiZsfHwhKCFpfHwhbHx8YykpJiZ6ZShsLHAsZSxhKSl9LG4uaXNTZWxlY3RpbmdNb250aFJhbmdlU3RhcnQ9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIW4uaXNJblNlbGVjdGluZ1JhbmdlTW9udGgoZSkpcmV0dXJuITE7dmFyIHI9bi5wcm9wcyxhPXIuZGF5LG89ci5zdGFydERhdGUscz1yLnNlbGVjdHNTdGFydCxpPSQuc2V0TW9udGgoYSxlKSxsPW51bGwhPT0odD1uLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT10P3Q6bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuIEFlKGkscz9sOm8pfSxuLmlzU2VsZWN0aW5nTW9udGhSYW5nZUVuZD1mdW5jdGlvbihlKXt2YXIgdDtpZighbi5pc0luU2VsZWN0aW5nUmFuZ2VNb250aChlKSlyZXR1cm4hMTt2YXIgcj1uLnByb3BzLGE9ci5kYXksbz1yLmVuZERhdGUscz1yLnNlbGVjdHNFbmQsaT1yLnNlbGVjdHNSYW5nZSxsPSQuc2V0TW9udGgoYSxlKSxjPW51bGwhPT0odD1uLnByb3BzLnNlbGVjdGluZ0RhdGUpJiZ2b2lkIDAhPT10P3Q6bi5wcm9wcy5wcmVTZWxlY3Rpb247cmV0dXJuIEFlKGwsc3x8aT9jOm8pfSxuLmlzSW5TZWxlY3RpbmdSYW5nZVF1YXJ0ZXI9ZnVuY3Rpb24oZSl7dmFyIHQscj1uLnByb3BzLGE9ci5kYXksbz1yLnNlbGVjdHNTdGFydCxzPXIuc2VsZWN0c0VuZCxpPXIuc2VsZWN0c1JhbmdlLGw9ci5zdGFydERhdGUsYz1yLmVuZERhdGUscD1udWxsIT09KHQ9bi5wcm9wcy5zZWxlY3RpbmdEYXRlKSYmdm9pZCAwIT09dD90Om4ucHJvcHMucHJlU2VsZWN0aW9uO3JldHVybiEoIShvfHxzfHxpKXx8IXApJiYobyYmYz9ldChwLGMsZSxhKToocyYmbHx8ISghaXx8IWx8fGMpKSYmZXQobCxwLGUsYSkpfSxuLmlzV2Vla0luTW9udGg9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5wcm9wcy5kYXkscj1hLmFkZERheXMoZSw2KTtyZXR1cm4gQWUoZSx0KXx8QWUocix0KX0sbi5pc0N1cnJlbnRNb250aD1mdW5jdGlvbihlLHQpe3JldHVybiB4LmdldFllYXIoZSk9PT14LmdldFllYXIoTWUoKSkmJnQ9PT1fLmdldE1vbnRoKE1lKCkpfSxuLmlzQ3VycmVudFF1YXJ0ZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5nZXRZZWFyKGUpPT09eC5nZXRZZWFyKE1lKCkpJiZ0PT09RS5nZXRRdWFydGVyKE1lKCkpfSxuLmlzU2VsZWN0ZWRNb250aD1mdW5jdGlvbihlLHQscil7cmV0dXJuIF8uZ2V0TW9udGgocik9PT10JiZ4LmdldFllYXIoZSk9PT14LmdldFllYXIocil9LG4uaXNTZWxlY3RNb250aEluTGlzdD1mdW5jdGlvbihlLHQscil7cmV0dXJuIHIuc29tZSgoZnVuY3Rpb24ocil7cmV0dXJuIG4uaXNTZWxlY3RlZE1vbnRoKGUsdCxyKX0pKX0sbi5pc1NlbGVjdGVkUXVhcnRlcj1mdW5jdGlvbihlLHQscil7cmV0dXJuIEUuZ2V0UXVhcnRlcihlKT09PXQmJnguZ2V0WWVhcihlKT09PXguZ2V0WWVhcihyKX0sbi5yZW5kZXJXZWVrcz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PW4ucHJvcHMuZml4ZWRIZWlnaHQscj0wLGE9ITEsbz14ZShOZShuLnByb3BzLmRheSksbi5wcm9wcy5sb2NhbGUsbi5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KSxzPW4ucHJvcHMuc2VsZWN0ZWQ/ZnVuY3Rpb24oZSl7cmV0dXJuIG4ucHJvcHMuc2hvd1dlZWtQaWNrZXI/eGUoZSxuLnByb3BzLmxvY2FsZSxuLnByb3BzLmNhbGVuZGFyU3RhcnREYXkpOm4ucHJvcHMuc2VsZWN0ZWR9KG4ucHJvcHMuc2VsZWN0ZWQpOnZvaWQgMCxpPW4ucHJvcHMucHJlU2VsZWN0aW9uP2Z1bmN0aW9uKGUpe3JldHVybiBuLnByb3BzLnNob3dXZWVrUGlja2VyP3hlKGUsbi5wcm9wcy5sb2NhbGUsbi5wcm9wcy5jYWxlbmRhclN0YXJ0RGF5KTpuLnByb3BzLnByZVNlbGVjdGlvbn0obi5wcm9wcy5wcmVTZWxlY3Rpb24pOnZvaWQgMDtlLnB1c2godWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KE10LGdlKHt9LG4ucHJvcHMse2FyaWFMYWJlbFByZWZpeDpuLnByb3BzLndlZWtBcmlhTGFiZWxQcmVmaXgsa2V5OnIsZGF5Om8sbW9udGg6Xy5nZXRNb250aChuLnByb3BzLmRheSksb25EYXlDbGljazpuLmhhbmRsZURheUNsaWNrLG9uRGF5TW91c2VFbnRlcjpuLmhhbmRsZURheU1vdXNlRW50ZXIsc2VsZWN0ZWQ6cyxwcmVTZWxlY3Rpb246aSxzaG93V2Vla051bWJlcjpuLnByb3BzLnNob3dXZWVrTnVtYmVyc30pKSksIWE7KXtyKyssbz1wLmFkZFdlZWtzKG8sMSk7dmFyIGw9dCYmcj49NixjPSF0JiYhbi5pc1dlZWtJbk1vbnRoKG8pO2lmKGx8fGMpe2lmKCFuLnByb3BzLnBlZWtOZXh0TW9udGgpYnJlYWs7YT0hMH19cmV0dXJuIGV9LG4ub25Nb250aENsaWNrPWZ1bmN0aW9uKGUsdCl7dmFyIHI9bi5pc01vbnRoRGlzYWJsZWRGb3JMYWJlbERhdGUodCksYT1yLmlzRGlzYWJsZWQsbz1yLmxhYmVsRGF0ZTthfHxuLmhhbmRsZURheUNsaWNrKE5lKG8pLGUpfSxuLm9uTW9udGhNb3VzZUVudGVyPWZ1bmN0aW9uKGUpe3ZhciB0PW4uaXNNb250aERpc2FibGVkRm9yTGFiZWxEYXRlKGUpLHI9dC5pc0Rpc2FibGVkLGE9dC5sYWJlbERhdGU7cnx8bi5oYW5kbGVEYXlNb3VzZUVudGVyKE5lKGEpKX0sbi5oYW5kbGVNb250aE5hdmlnYXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcixhLG8scztudWxsPT09KGE9KHI9bi5wcm9wcykuc2V0UHJlU2VsZWN0aW9uKXx8dm9pZCAwPT09YXx8YS5jYWxsKHIsdCksbnVsbD09PShzPW51bGw9PT0obz1uLk1PTlRIX1JFRlNbZV0pfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmN1cnJlbnQpfHx2b2lkIDA9PT1zfHxzLmZvY3VzKCl9LG4uaGFuZGxlS2V5Ym9hcmROYXZpZ2F0aW9uPWZ1bmN0aW9uKGUsdCxyKXt2YXIgYSxvPW4ucHJvcHMscz1vLnNlbGVjdGVkLGw9by5wcmVTZWxlY3Rpb24sYz1vLnNldFByZVNlbGVjdGlvbixwPW8ubWluRGF0ZSxkPW8ubWF4RGF0ZSx1PW8uc2hvd0ZvdXJDb2x1bW5Nb250aFllYXJQaWNrZXIsZj1vLnNob3dUd29Db2x1bW5Nb250aFllYXJQaWNrZXI7aWYobCl7dmFyIGg9WXQodSxmKSxtPW4uZ2V0VmVydGljYWxPZmZzZXQoaCksdj1udWxsPT09KGE9UHRbaF0pfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmdyaWQsZz1mdW5jdGlvbihlLHQscil7dmFyIG4sYSxvPXQscz1yO3N3aXRjaChlKXtjYXNlIHllLkFycm93UmlnaHQ6bz1pLmFkZE1vbnRocyh0LDEpLHM9MTE9PT1yPzA6cisxO2JyZWFrO2Nhc2UgeWUuQXJyb3dMZWZ0Om89YWUuc3ViTW9udGhzKHQsMSkscz0wPT09cj8xMTpyLTE7YnJlYWs7Y2FzZSB5ZS5BcnJvd1VwOm89YWUuc3ViTW9udGhzKHQsbSkscz0obnVsbD09PShuPW51bGw9PXY/dm9pZCAwOnZbMF0pfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmluY2x1ZGVzKHIpKT9yKzEyLW06ci1tO2JyZWFrO2Nhc2UgeWUuQXJyb3dEb3duOm89aS5hZGRNb250aHModCxtKSxzPShudWxsPT09KGE9bnVsbD09dj92b2lkIDA6dlt2Lmxlbmd0aC0xXSl8fHZvaWQgMD09PWE/dm9pZCAwOmEuaW5jbHVkZXMocikpP3ItMTIrbTpyK219cmV0dXJue25ld0NhbGN1bGF0ZWREYXRlOm8sbmV3Q2FsY3VsYXRlZE1vbnRoOnN9fTtpZih0IT09eWUuRW50ZXIpe3ZhciBEPWZ1bmN0aW9uKGUsdCxyKXtmb3IodmFyIGE9ZSxvPSExLHM9MCxpPWcoYSx0LHIpLGw9aS5uZXdDYWxjdWxhdGVkRGF0ZSxjPWkubmV3Q2FsY3VsYXRlZE1vbnRoOyFvOyl7aWYocz49NDApe2w9dCxjPXI7YnJlYWt9dmFyIHU7aWYocCYmbDxwKWE9eWUuQXJyb3dSaWdodCxsPSh1PWcoYSxsLGMpKS5uZXdDYWxjdWxhdGVkRGF0ZSxjPXUubmV3Q2FsY3VsYXRlZE1vbnRoO2lmKGQmJmw+ZClhPXllLkFycm93TGVmdCxsPSh1PWcoYSxsLGMpKS5uZXdDYWxjdWxhdGVkRGF0ZSxjPXUubmV3Q2FsY3VsYXRlZE1vbnRoO2lmKFhlKGwsbi5wcm9wcykpbD0odT1nKGEsbCxjKSkubmV3Q2FsY3VsYXRlZERhdGUsYz11Lm5ld0NhbGN1bGF0ZWRNb250aDtlbHNlIG89ITA7cysrfXJldHVybntuZXdDYWxjdWxhdGVkRGF0ZTpsLG5ld0NhbGN1bGF0ZWRNb250aDpjfX0odCxsLHIpLHk9RC5uZXdDYWxjdWxhdGVkRGF0ZSxrPUQubmV3Q2FsY3VsYXRlZE1vbnRoO3N3aXRjaCh0KXtjYXNlIHllLkFycm93UmlnaHQ6Y2FzZSB5ZS5BcnJvd0xlZnQ6Y2FzZSB5ZS5BcnJvd1VwOmNhc2UgeWUuQXJyb3dEb3duOm4uaGFuZGxlTW9udGhOYXZpZ2F0aW9uKGsseSl9fWVsc2Ugbi5pc01vbnRoRGlzYWJsZWQocil8fChuLm9uTW9udGhDbGljayhlLHIpLG51bGw9PWN8fGMocykpfX0sbi5nZXRWZXJ0aWNhbE9mZnNldD1mdW5jdGlvbihlKXt2YXIgdCxyO3JldHVybiBudWxsIT09KHI9bnVsbD09PSh0PVB0W2VdKXx8dm9pZCAwPT09dD92b2lkIDA6dC52ZXJ0aWNhbE5hdmlnYXRpb25PZmZzZXQpJiZ2b2lkIDAhPT1yP3I6MH0sbi5vbk1vbnRoS2V5RG93bj1mdW5jdGlvbihlLHQpe3ZhciByPW4ucHJvcHMsYT1yLmRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uLG89ci5oYW5kbGVPbk1vbnRoS2V5RG93bixzPWUua2V5O3MhPT15ZS5UYWImJmUucHJldmVudERlZmF1bHQoKSxhfHxuLmhhbmRsZUtleWJvYXJkTmF2aWdhdGlvbihlLHMsdCksbyYmbyhlKX0sbi5vblF1YXJ0ZXJDbGljaz1mdW5jdGlvbihlLHQpe3ZhciByPXouc2V0UXVhcnRlcihuLnByb3BzLmRheSx0KTtHZShyLG4ucHJvcHMpfHxuLmhhbmRsZURheUNsaWNrKEllKHIpLGUpfSxuLm9uUXVhcnRlck1vdXNlRW50ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ei5zZXRRdWFydGVyKG4ucHJvcHMuZGF5LGUpO0dlKHQsbi5wcm9wcyl8fG4uaGFuZGxlRGF5TW91c2VFbnRlcihJZSh0KSl9LG4uaGFuZGxlUXVhcnRlck5hdmlnYXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcixhLG8scztuLmlzRGlzYWJsZWQodCl8fG4uaXNFeGNsdWRlZCh0KXx8KG51bGw9PT0oYT0ocj1uLnByb3BzKS5zZXRQcmVTZWxlY3Rpb24pfHx2b2lkIDA9PT1hfHxhLmNhbGwocix0KSxudWxsPT09KHM9bnVsbD09PShvPW4uUVVBUlRFUl9SRUZTW2UtMV0pfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmN1cnJlbnQpfHx2b2lkIDA9PT1zfHxzLmZvY3VzKCkpfSxuLm9uUXVhcnRlcktleURvd249ZnVuY3Rpb24oZSx0KXt2YXIgcixhLG89ZS5rZXk7aWYoIW4ucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24pc3dpdGNoKG8pe2Nhc2UgeWUuRW50ZXI6bi5vblF1YXJ0ZXJDbGljayhlLHQpLG51bGw9PT0oYT0ocj1uLnByb3BzKS5zZXRQcmVTZWxlY3Rpb24pfHx2b2lkIDA9PT1hfHxhLmNhbGwocixuLnByb3BzLnNlbGVjdGVkKTticmVhaztjYXNlIHllLkFycm93UmlnaHQ6aWYoIW4ucHJvcHMucHJlU2VsZWN0aW9uKWJyZWFrO24uaGFuZGxlUXVhcnRlck5hdmlnYXRpb24oND09PXQ/MTp0KzEsbC5hZGRRdWFydGVycyhuLnByb3BzLnByZVNlbGVjdGlvbiwxKSk7YnJlYWs7Y2FzZSB5ZS5BcnJvd0xlZnQ6aWYoIW4ucHJvcHMucHJlU2VsZWN0aW9uKWJyZWFrO24uaGFuZGxlUXVhcnRlck5hdmlnYXRpb24oMT09PXQ/NDp0LTEsb2Uuc3ViUXVhcnRlcnMobi5wcm9wcy5wcmVTZWxlY3Rpb24sMSkpfX0sbi5pc01vbnRoRGlzYWJsZWRGb3JMYWJlbERhdGU9ZnVuY3Rpb24oZSl7dmFyIHQscj1uLnByb3BzLGE9ci5kYXksbz1yLm1pbkRhdGUscz1yLm1heERhdGUsaT1yLmV4Y2x1ZGVEYXRlcyxsPXIuaW5jbHVkZURhdGVzLGM9JC5zZXRNb250aChhLGUpO3JldHVybntpc0Rpc2FibGVkOm51bGwhPT0odD0ob3x8c3x8aXx8bCkmJiRlKGMsbi5wcm9wcykpJiZ2b2lkIDAhPT10JiZ0LGxhYmVsRGF0ZTpjfX0sbi5pc01vbnRoRGlzYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uaXNNb250aERpc2FibGVkRm9yTGFiZWxEYXRlKGUpLmlzRGlzYWJsZWR9LG4uZ2V0TW9udGhDbGFzc05hbWVzPWZ1bmN0aW9uKGUpe3ZhciByPW4ucHJvcHMsYT1yLmRheSxvPXIuc3RhcnREYXRlLHM9ci5lbmREYXRlLGk9ci5wcmVTZWxlY3Rpb24sbD1yLm1vbnRoQ2xhc3NOYW1lLGM9bD9sKCQuc2V0TW9udGgoYSxlKSk6dm9pZCAwLHA9bi5nZXRTZWxlY3Rpb24oKTtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dFwiLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtXCIuY29uY2F0KGUpLGMse1wicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0tZGlzYWJsZWRcIjpuLmlzTW9udGhEaXNhYmxlZChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGVkXCI6cD9uLmlzU2VsZWN0TW9udGhJbkxpc3QoYSxlLHApOnZvaWQgMCxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkXCI6IW4ucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24mJmkmJm4uaXNTZWxlY3RlZE1vbnRoKGEsZSxpKSYmIW4uaXNNb250aERpc2FibGVkKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlXCI6bi5pc0luU2VsZWN0aW5nUmFuZ2VNb250aChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLWluLXJhbmdlXCI6byYmcz96ZShvLHMsZSxhKTp2b2lkIDAsXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1yYW5nZS1zdGFydFwiOm4uaXNSYW5nZVN0YXJ0TW9udGgoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1yYW5nZS1lbmRcIjpuLmlzUmFuZ2VFbmRNb250aChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHQtLXNlbGVjdGluZy1yYW5nZS1zdGFydFwiOm4uaXNTZWxlY3RpbmdNb250aFJhbmdlU3RhcnQoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS1zZWxlY3RpbmctcmFuZ2UtZW5kXCI6bi5pc1NlbGVjdGluZ01vbnRoUmFuZ2VFbmQoZSksXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC10ZXh0LS10b2RheVwiOm4uaXNDdXJyZW50TW9udGgoYSxlKX0pfSxuLmdldFRhYkluZGV4PWZ1bmN0aW9uKGUpe2lmKG51bGw9PW4ucHJvcHMucHJlU2VsZWN0aW9uKXJldHVyblwiLTFcIjt2YXIgdD1fLmdldE1vbnRoKG4ucHJvcHMucHJlU2VsZWN0aW9uKTtyZXR1cm4gbi5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbnx8ZSE9PXQ/XCItMVwiOlwiMFwifSxuLmdldFF1YXJ0ZXJUYWJJbmRleD1mdW5jdGlvbihlKXtpZihudWxsPT1uLnByb3BzLnByZVNlbGVjdGlvbilyZXR1cm5cIi0xXCI7dmFyIHQ9RS5nZXRRdWFydGVyKG4ucHJvcHMucHJlU2VsZWN0aW9uKTtyZXR1cm4gbi5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbnx8ZSE9PXQ/XCItMVwiOlwiMFwifSxuLmdldEFyaWFMYWJlbD1mdW5jdGlvbihlKXt2YXIgdD1uLnByb3BzLHI9dC5jaG9vc2VEYXlBcmlhTGFiZWxQcmVmaXgsYT12b2lkIDA9PT1yP1wiQ2hvb3NlXCI6cixvPXQuZGlzYWJsZWREYXlBcmlhTGFiZWxQcmVmaXgscz12b2lkIDA9PT1vP1wiTm90IGF2YWlsYWJsZVwiOm8saT10LmRheSxsPXQubG9jYWxlLGM9JC5zZXRNb250aChpLGUpLHA9bi5pc0Rpc2FibGVkKGMpfHxuLmlzRXhjbHVkZWQoYyk/czphO3JldHVyblwiXCIuY29uY2F0KHAsXCIgXCIpLmNvbmNhdChfZShjLFwiTU1NTSB5eXl5XCIsbCkpfSxuLmdldFF1YXJ0ZXJDbGFzc05hbWVzPWZ1bmN0aW9uKGUpe3ZhciByPW4ucHJvcHMsYT1yLmRheSxvPXIuc3RhcnREYXRlLHM9ci5lbmREYXRlLGk9ci5zZWxlY3RlZCxsPXIubWluRGF0ZSxjPXIubWF4RGF0ZSxwPXIuZXhjbHVkZURhdGVzLGQ9ci5pbmNsdWRlRGF0ZXMsdT1yLmZpbHRlckRhdGUsZj1yLnByZVNlbGVjdGlvbixoPXIuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24sbT0obHx8Y3x8cHx8ZHx8dSkmJkdlKHouc2V0UXVhcnRlcihhLGUpLG4ucHJvcHMpO3JldHVybiB0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHRcIixcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItXCIuY29uY2F0KGUpLHtcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tZGlzYWJsZWRcIjptLFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1zZWxlY3RlZFwiOmk/bi5pc1NlbGVjdGVkUXVhcnRlcihhLGUsaSk6dm9pZCAwLFwicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlci10ZXh0LS1rZXlib2FyZC1zZWxlY3RlZFwiOiFoJiZmJiZuLmlzU2VsZWN0ZWRRdWFydGVyKGEsZSxmKSYmIW0sXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLWluLXNlbGVjdGluZy1yYW5nZVwiOm4uaXNJblNlbGVjdGluZ1JhbmdlUXVhcnRlcihlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0taW4tcmFuZ2VcIjpvJiZzP2V0KG8scyxlLGEpOnZvaWQgMCxcInJlYWN0LWRhdGVwaWNrZXJfX3F1YXJ0ZXItdGV4dC0tcmFuZ2Utc3RhcnRcIjpuLmlzUmFuZ2VTdGFydFF1YXJ0ZXIoZSksXCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXRleHQtLXJhbmdlLWVuZFwiOm4uaXNSYW5nZUVuZFF1YXJ0ZXIoZSl9KX0sbi5nZXRNb250aENvbnRlbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5wcm9wcyxyPXQuc2hvd0Z1bGxNb250aFllYXJQaWNrZXIsYT10LnJlbmRlck1vbnRoQ29udGVudCxvPXQubG9jYWxlLHM9dC5kYXksaT1WZShlLG8pLGw9QmUoZSxvKTtyZXR1cm4gYT9hKGUsaSxsLHMpOnI/bDppfSxuLmdldFF1YXJ0ZXJDb250ZW50PWZ1bmN0aW9uKGUpe3ZhciB0LHI9bi5wcm9wcyxhPXIucmVuZGVyUXVhcnRlckNvbnRlbnQsbz1mdW5jdGlvbihlLHQpe3JldHVybiBfZSh6LnNldFF1YXJ0ZXIoTWUoKSxlKSxcIlFRUVwiLHQpfShlLHIubG9jYWxlKTtyZXR1cm4gbnVsbCE9PSh0PW51bGw9PWE/dm9pZCAwOmEoZSxvKSkmJnZvaWQgMCE9PXQ/dDpvfSxuLnJlbmRlck1vbnRocz1mdW5jdGlvbigpe3ZhciBlLHQ9bi5wcm9wcyxyPXQuc2hvd1R3b0NvbHVtbk1vbnRoWWVhclBpY2tlcixhPXQuc2hvd0ZvdXJDb2x1bW5Nb250aFllYXJQaWNrZXIsbz10LmRheSxzPXQuc2VsZWN0ZWQsaT1udWxsPT09KGU9UHRbWXQoYSxyKV0pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmdyaWQ7cmV0dXJuIG51bGw9PWk/dm9pZCAwOmkubWFwKChmdW5jdGlvbihlLHQpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtd3JhcHBlclwiLGtleTp0fSxlLm1hcCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse3JlZjpuLk1PTlRIX1JFRlNbZV0sa2V5OnQsb25DbGljazpmdW5jdGlvbih0KXtuLm9uTW9udGhDbGljayh0LGUpfSxvbktleURvd246ZnVuY3Rpb24odCl7eXQodCkmJih0LnByZXZlbnREZWZhdWx0KCksdC5rZXk9eWUuRW50ZXIpLG4ub25Nb250aEtleURvd24odCxlKX0sb25Nb3VzZUVudGVyOm4ucHJvcHMudXNlUG9pbnRlckV2ZW50P3ZvaWQgMDpmdW5jdGlvbigpe3JldHVybiBuLm9uTW9udGhNb3VzZUVudGVyKGUpfSxvblBvaW50ZXJFbnRlcjpuLnByb3BzLnVzZVBvaW50ZXJFdmVudD9mdW5jdGlvbigpe3JldHVybiBuLm9uTW9udGhNb3VzZUVudGVyKGUpfTp2b2lkIDAsdGFiSW5kZXg6TnVtYmVyKG4uZ2V0VGFiSW5kZXgoZSkpLGNsYXNzTmFtZTpuLmdldE1vbnRoQ2xhc3NOYW1lcyhlKSxcImFyaWEtZGlzYWJsZWRcIjpuLmlzTW9udGhEaXNhYmxlZChlKSxyb2xlOlwib3B0aW9uXCIsXCJhcmlhLWxhYmVsXCI6bi5nZXRBcmlhTGFiZWwoZSksXCJhcmlhLWN1cnJlbnRcIjpuLmlzQ3VycmVudE1vbnRoKG8sZSk/XCJkYXRlXCI6dm9pZCAwLFwiYXJpYS1zZWxlY3RlZFwiOnM/bi5pc1NlbGVjdGVkTW9udGgobyxlLHMpOnZvaWQgMH0sbi5nZXRNb250aENvbnRlbnQoZSkpfSkpKX0pKX0sbi5yZW5kZXJRdWFydGVycz1mdW5jdGlvbigpe3ZhciBlPW4ucHJvcHMsdD1lLmRheSxyPWUuc2VsZWN0ZWQ7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19xdWFydGVyLXdyYXBwZXJcIn0sWzEsMiwzLDRdLm1hcCgoZnVuY3Rpb24oZSxhKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTphLHJlZjpuLlFVQVJURVJfUkVGU1thXSxyb2xlOlwib3B0aW9uXCIsb25DbGljazpmdW5jdGlvbih0KXtuLm9uUXVhcnRlckNsaWNrKHQsZSl9LG9uS2V5RG93bjpmdW5jdGlvbih0KXtuLm9uUXVhcnRlcktleURvd24odCxlKX0sb25Nb3VzZUVudGVyOm4ucHJvcHMudXNlUG9pbnRlckV2ZW50P3ZvaWQgMDpmdW5jdGlvbigpe3JldHVybiBuLm9uUXVhcnRlck1vdXNlRW50ZXIoZSl9LG9uUG9pbnRlckVudGVyOm4ucHJvcHMudXNlUG9pbnRlckV2ZW50P2Z1bmN0aW9uKCl7cmV0dXJuIG4ub25RdWFydGVyTW91c2VFbnRlcihlKX06dm9pZCAwLGNsYXNzTmFtZTpuLmdldFF1YXJ0ZXJDbGFzc05hbWVzKGUpLFwiYXJpYS1zZWxlY3RlZFwiOnI/bi5pc1NlbGVjdGVkUXVhcnRlcih0LGUscik6dm9pZCAwLHRhYkluZGV4Ok51bWJlcihuLmdldFF1YXJ0ZXJUYWJJbmRleChlKSksXCJhcmlhLWN1cnJlbnRcIjpuLmlzQ3VycmVudFF1YXJ0ZXIodCxlKT9cImRhdGVcIjp2b2lkIDB9LG4uZ2V0UXVhcnRlckNvbnRlbnQoZSkpfSkpKX0sbi5nZXRDbGFzc05hbWVzPWZ1bmN0aW9uKCl7dmFyIGU9bi5wcm9wcyxyPWUuc2VsZWN0aW5nRGF0ZSxhPWUuc2VsZWN0c1N0YXJ0LG89ZS5zZWxlY3RzRW5kLHM9ZS5zaG93TW9udGhZZWFyUGlja2VyLGk9ZS5zaG93UXVhcnRlclllYXJQaWNrZXIsbD1lLnNob3dXZWVrUGlja2VyO3JldHVybiB0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX19tb250aFwiLHtcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RpbmctcmFuZ2VcIjpyJiYoYXx8byl9LHtcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoUGlja2VyXCI6c30se1wicmVhY3QtZGF0ZXBpY2tlcl9fcXVhcnRlclBpY2tlclwiOml9LHtcInJlYWN0LWRhdGVwaWNrZXJfX3dlZWtQaWNrZXJcIjpsfSl9LG59cmV0dXJuIHZlKG4sZSksbi5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuc2VsZWN0ZWQscj1lLnNlbGVjdGVkRGF0ZXM7cmV0dXJuIGUuc2VsZWN0c011bHRpcGxlP3I6dD9bdF06dm9pZCAwfSxuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5zaG93TW9udGhZZWFyUGlja2VyLHI9ZS5zaG93UXVhcnRlclllYXJQaWNrZXIsbj1lLmRheSxhPWUuYXJpYUxhYmVsUHJlZml4LG89dm9pZCAwPT09YT9cIk1vbnRoIFwiOmEscz1vP28udHJpbSgpK1wiIFwiOlwiXCI7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6dGhpcy5nZXRDbGFzc05hbWVzKCksb25Nb3VzZUxlYXZlOnRoaXMucHJvcHMudXNlUG9pbnRlckV2ZW50P3ZvaWQgMDp0aGlzLmhhbmRsZU1vdXNlTGVhdmUsb25Qb2ludGVyTGVhdmU6dGhpcy5wcm9wcy51c2VQb2ludGVyRXZlbnQ/dGhpcy5oYW5kbGVNb3VzZUxlYXZlOnZvaWQgMCxcImFyaWEtbGFiZWxcIjpcIlwiLmNvbmNhdChzKS5jb25jYXQoX2UobixcIk1NTU0sIHl5eXlcIix0aGlzLnByb3BzLmxvY2FsZSkpLHJvbGU6XCJsaXN0Ym94XCJ9LHQ/dGhpcy5yZW5kZXJNb250aHMoKTpyP3RoaXMucmVuZGVyUXVhcnRlcnMoKTp0aGlzLnJlbmRlcldlZWtzKCkpfSxufShyLkNvbXBvbmVudCksTnQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciB0PW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gdC5pc1NlbGVjdGVkTW9udGg9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvcHMubW9udGg9PT1lfSx0LnJlbmRlck9wdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm9wcy5tb250aE5hbWVzLm1hcCgoZnVuY3Rpb24oZSxyKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTp0LmlzU2VsZWN0ZWRNb250aChyKT9cInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLW9wdGlvbiByZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24tLXNlbGVjdGVkX21vbnRoXCI6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb25cIixrZXk6ZSxvbkNsaWNrOnQub25DaGFuZ2UuYmluZCh0LHIpLFwiYXJpYS1zZWxlY3RlZFwiOnQuaXNTZWxlY3RlZE1vbnRoKHIpP1widHJ1ZVwiOnZvaWQgMH0sdC5pc1NlbGVjdGVkTW9udGgocik/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1vcHRpb24tLXNlbGVjdGVkXCJ9LFwi4pyTXCIpOlwiXCIsZSl9KSl9LHQub25DaGFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvcHMub25DaGFuZ2UoZSl9LHQuaGFuZGxlQ2xpY2tPdXRzaWRlPWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvcHMub25DYW5jZWwoKX0sdH1yZXR1cm4gdmUodCxlKSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duXCJ9LHRoaXMucmVuZGVyT3B0aW9ucygpKX0sdH0oci5Db21wb25lbnQpLE90PWZlLmRlZmF1bHQoTnQpLEl0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQuc3RhdGU9e2Ryb3Bkb3duVmlzaWJsZTohMX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiBlLm1hcCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIse2tleTplLHZhbHVlOnR9LGUpfSkpfSx0LnJlbmRlclNlbGVjdE1vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiLHt2YWx1ZTp0LnByb3BzLm1vbnRoLGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXNlbGVjdFwiLG9uQ2hhbmdlOmZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uQ2hhbmdlKHBhcnNlSW50KGUudGFyZ2V0LnZhbHVlKSl9fSx0LnJlbmRlclNlbGVjdE9wdGlvbnMoZSkpfSx0LnJlbmRlclJlYWRWaWV3PWZ1bmN0aW9uKGUscil7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtrZXk6XCJyZWFkXCIsc3R5bGU6e3Zpc2liaWxpdHk6ZT9cInZpc2libGVcIjpcImhpZGRlblwifSxjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1yZWFkLXZpZXdcIixvbkNsaWNrOnQudG9nZ2xlRHJvcGRvd259LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtcmVhZC12aWV3LS1kb3duLWFycm93XCJ9KSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXJlYWQtdmlldy0tc2VsZWN0ZWQtbW9udGhcIn0sclt0LnByb3BzLm1vbnRoXSkpfSx0LnJlbmRlckRyb3Bkb3duPWZ1bmN0aW9uKGUpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoT3QsZ2Uoe2tleTpcImRyb3Bkb3duXCJ9LHQucHJvcHMse21vbnRoTmFtZXM6ZSxvbkNoYW5nZTp0Lm9uQ2hhbmdlLG9uQ2FuY2VsOnQudG9nZ2xlRHJvcGRvd259KSl9LHQucmVuZGVyU2Nyb2xsTW9kZT1mdW5jdGlvbihlKXt2YXIgcj10LnN0YXRlLmRyb3Bkb3duVmlzaWJsZSxuPVt0LnJlbmRlclJlYWRWaWV3KCFyLGUpXTtyZXR1cm4gciYmbi51bnNoaWZ0KHQucmVuZGVyRHJvcGRvd24oZSkpLG59LHQub25DaGFuZ2U9ZnVuY3Rpb24oZSl7dC50b2dnbGVEcm9wZG93bigpLGUhPT10LnByb3BzLm1vbnRoJiZ0LnByb3BzLm9uQ2hhbmdlKGUpfSx0LnRvZ2dsZURyb3Bkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIHQuc2V0U3RhdGUoe2Ryb3Bkb3duVmlzaWJsZTohdC5zdGF0ZS5kcm9wZG93blZpc2libGV9KX0sdH1yZXR1cm4gdmUodCxlKSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMscj1bMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMV0ubWFwKHRoaXMucHJvcHMudXNlU2hvcnRNb250aEluRHJvcGRvd24/ZnVuY3Rpb24oZSl7cmV0dXJuIFZlKGUsdC5wcm9wcy5sb2NhbGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gQmUoZSx0LnByb3BzLmxvY2FsZSl9KTtzd2l0Y2godGhpcy5wcm9wcy5kcm9wZG93bk1vZGUpe2Nhc2VcInNjcm9sbFwiOmU9dGhpcy5yZW5kZXJTY3JvbGxNb2RlKHIpO2JyZWFrO2Nhc2VcInNlbGVjdFwiOmU9dGhpcy5yZW5kZXJTZWxlY3RNb2RlKHIpfXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtZHJvcGRvd24tY29udGFpbmVyIHJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLWRyb3Bkb3duLWNvbnRhaW5lci0tXCIuY29uY2F0KHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKX0sZSl9LHR9KHIuQ29tcG9uZW50KTtmdW5jdGlvbiBUdChlLHQpe2Zvcih2YXIgcj1bXSxuPU5lKGUpLGE9TmUodCk7IU4uaXNBZnRlcihuLGEpOylyLnB1c2goTWUobikpLG49aS5hZGRNb250aHMobiwxKTtyZXR1cm4gcn12YXIgUnQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcih0KXt2YXIgcj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gci5yZW5kZXJPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHIuc3RhdGUubW9udGhZZWFyc0xpc3QubWFwKChmdW5jdGlvbihlKXt2YXIgdD1ZLmdldFRpbWUoZSksbj1MZShyLnByb3BzLmRhdGUsZSkmJkFlKHIucHJvcHMuZGF0ZSxlKTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpuP1wicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1vcHRpb24tLXNlbGVjdGVkX21vbnRoLXllYXJcIjpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uXCIsa2V5OnQsb25DbGljazpyLm9uQ2hhbmdlLmJpbmQocix0KSxcImFyaWEtc2VsZWN0ZWRcIjpuP1widHJ1ZVwiOnZvaWQgMH0sbj91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItb3B0aW9uLS1zZWxlY3RlZFwifSxcIuKck1wiKTpcIlwiLF9lKGUsci5wcm9wcy5kYXRlRm9ybWF0LHIucHJvcHMubG9jYWxlKSl9KSl9LHIub25DaGFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHIucHJvcHMub25DaGFuZ2UoZSl9LHIuaGFuZGxlQ2xpY2tPdXRzaWRlPWZ1bmN0aW9uKCl7ci5wcm9wcy5vbkNhbmNlbCgpfSxyLnN0YXRlPXttb250aFllYXJzTGlzdDpUdChyLnByb3BzLm1pbkRhdGUsci5wcm9wcy5tYXhEYXRlKX0scn1yZXR1cm4gdmUocixlKSxyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT10LmNsc3goe1wicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93blwiOiEwLFwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgteWVhci1kcm9wZG93bi0tc2Nyb2xsYWJsZVwiOnRoaXMucHJvcHMuc2Nyb2xsYWJsZU1vbnRoWWVhckRyb3Bkb3dufSk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6ZX0sdGhpcy5yZW5kZXJPcHRpb25zKCkpfSxyfShyLkNvbXBvbmVudCksTHQ9ZmUuZGVmYXVsdChSdCksQXQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciB0PW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gdC5zdGF0ZT17ZHJvcGRvd25WaXNpYmxlOiExfSx0LnJlbmRlclNlbGVjdE9wdGlvbnM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9TmUodC5wcm9wcy5taW5EYXRlKSxyPU5lKHQucHJvcHMubWF4RGF0ZSksbj1bXTshTi5pc0FmdGVyKGUscik7KXt2YXIgYT1ZLmdldFRpbWUoZSk7bi5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLHtrZXk6YSx2YWx1ZTphfSxfZShlLHQucHJvcHMuZGF0ZUZvcm1hdCx0LnByb3BzLmxvY2FsZSkpKSxlPWkuYWRkTW9udGhzKGUsMSl9cmV0dXJuIG59LHQub25TZWxlY3RDaGFuZ2U9ZnVuY3Rpb24oZSl7dC5vbkNoYW5nZShwYXJzZUludChlLnRhcmdldC52YWx1ZSkpfSx0LnJlbmRlclNlbGVjdE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIse3ZhbHVlOlkuZ2V0VGltZShOZSh0LnByb3BzLmRhdGUpKSxjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLXNlbGVjdFwiLG9uQ2hhbmdlOnQub25TZWxlY3RDaGFuZ2V9LHQucmVuZGVyU2VsZWN0T3B0aW9ucygpKX0sdC5yZW5kZXJSZWFkVmlldz1mdW5jdGlvbihlKXt2YXIgcj1fZSh0LnByb3BzLmRhdGUsdC5wcm9wcy5kYXRlRm9ybWF0LHQucHJvcHMubG9jYWxlKTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTpcInJlYWRcIixzdHlsZTp7dmlzaWJpbGl0eTplP1widmlzaWJsZVwiOlwiaGlkZGVuXCJ9LGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3XCIsb25DbGljazp0LnRvZ2dsZURyb3Bkb3dufSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3LS1kb3duLWFycm93XCJ9KSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItcmVhZC12aWV3LS1zZWxlY3RlZC1tb250aC15ZWFyXCJ9LHIpKX0sdC5yZW5kZXJEcm9wZG93bj1mdW5jdGlvbigpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoTHQsZ2Uoe2tleTpcImRyb3Bkb3duXCJ9LHQucHJvcHMse29uQ2hhbmdlOnQub25DaGFuZ2Usb25DYW5jZWw6dC50b2dnbGVEcm9wZG93bn0pKX0sdC5yZW5kZXJTY3JvbGxNb2RlPWZ1bmN0aW9uKCl7dmFyIGU9dC5zdGF0ZS5kcm9wZG93blZpc2libGUscj1bdC5yZW5kZXJSZWFkVmlldyghZSldO3JldHVybiBlJiZyLnVuc2hpZnQodC5yZW5kZXJEcm9wZG93bigpKSxyfSx0Lm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3QudG9nZ2xlRHJvcGRvd24oKTt2YXIgcj1NZShlKTtMZSh0LnByb3BzLmRhdGUscikmJkFlKHQucHJvcHMuZGF0ZSxyKXx8dC5wcm9wcy5vbkNoYW5nZShyKX0sdC50b2dnbGVEcm9wZG93bj1mdW5jdGlvbigpe3JldHVybiB0LnNldFN0YXRlKHtkcm9wZG93blZpc2libGU6IXQuc3RhdGUuZHJvcGRvd25WaXNpYmxlfSl9LHR9cmV0dXJuIHZlKHQsZSksdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU7c3dpdGNoKHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKXtjYXNlXCJzY3JvbGxcIjplPXRoaXMucmVuZGVyU2Nyb2xsTW9kZSgpO2JyZWFrO2Nhc2VcInNlbGVjdFwiOmU9dGhpcy5yZW5kZXJTZWxlY3RNb2RlKCl9cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLWNvbnRhaW5lciByZWFjdC1kYXRlcGlja2VyX19tb250aC15ZWFyLWRyb3Bkb3duLWNvbnRhaW5lci0tXCIuY29uY2F0KHRoaXMucHJvcHMuZHJvcGRvd25Nb2RlKX0sZSl9LHR9KHIuQ29tcG9uZW50KSxGdD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dmFyIHI9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiByLnN0YXRlPXtoZWlnaHQ6bnVsbH0sci5zY3JvbGxUb1RoZVNlbGVjdGVkVGltZT1mdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXt2YXIgZSxuLGE7ci5saXN0JiYoci5saXN0LnNjcm9sbFRvcD1udWxsIT09KGE9ci5jZW50ZXJMaSYmdC5jYWxjQ2VudGVyUG9zaXRpb24oci5wcm9wcy5tb250aFJlZj9yLnByb3BzLm1vbnRoUmVmLmNsaWVudEhlaWdodC0obnVsbCE9PShuPW51bGw9PT0oZT1yLmhlYWRlcil8fHZvaWQgMD09PWU/dm9pZCAwOmUuY2xpZW50SGVpZ2h0KSYmdm9pZCAwIT09bj9uOjApOnIubGlzdC5jbGllbnRIZWlnaHQsci5jZW50ZXJMaSkpJiZ2b2lkIDAhPT1hP2E6MCl9KSl9LHIuaGFuZGxlQ2xpY2s9ZnVuY3Rpb24oZSl7dmFyIHQsbjsoci5wcm9wcy5taW5UaW1lfHxyLnByb3BzLm1heFRpbWUpJiZhdChlLHIucHJvcHMpfHwoci5wcm9wcy5leGNsdWRlVGltZXN8fHIucHJvcHMuaW5jbHVkZVRpbWVzfHxyLnByb3BzLmZpbHRlclRpbWUpJiZudChlLHIucHJvcHMpfHxudWxsPT09KG49KHQ9ci5wcm9wcykub25DaGFuZ2UpfHx2b2lkIDA9PT1ufHxuLmNhbGwodCxlKX0sci5pc1NlbGVjdGVkVGltZT1mdW5jdGlvbihlKXtyZXR1cm4gci5wcm9wcy5zZWxlY3RlZCYmKHQ9ci5wcm9wcy5zZWxlY3RlZCxuPWUsdnQodCkuZ2V0VGltZSgpPT09dnQobikuZ2V0VGltZSgpKTt2YXIgdCxufSxyLmlzRGlzYWJsZWRUaW1lPWZ1bmN0aW9uKGUpe3JldHVybihyLnByb3BzLm1pblRpbWV8fHIucHJvcHMubWF4VGltZSkmJmF0KGUsci5wcm9wcyl8fChyLnByb3BzLmV4Y2x1ZGVUaW1lc3x8ci5wcm9wcy5pbmNsdWRlVGltZXN8fHIucHJvcHMuZmlsdGVyVGltZSkmJm50KGUsci5wcm9wcyl9LHIubGlDbGFzc2VzPWZ1bmN0aW9uKGUpe3ZhciBuLGE9W1wicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW1cIixyLnByb3BzLnRpbWVDbGFzc05hbWU/ci5wcm9wcy50aW1lQ2xhc3NOYW1lKGUpOnZvaWQgMF07cmV0dXJuIHIuaXNTZWxlY3RlZFRpbWUoZSkmJmEucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX3RpbWUtbGlzdC1pdGVtLS1zZWxlY3RlZFwiKSxyLmlzRGlzYWJsZWRUaW1lKGUpJiZhLnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbS0tZGlzYWJsZWRcIiksci5wcm9wcy5pbmplY3RUaW1lcyYmKDM2MDAqYi5nZXRIb3VycyhlKSs2MCpDLmdldE1pbnV0ZXMoZSkrUC5nZXRTZWNvbmRzKGUpKSUoNjAqKG51bGwhPT0obj1yLnByb3BzLmludGVydmFscykmJnZvaWQgMCE9PW4/bjp0LmRlZmF1bHRQcm9wcy5pbnRlcnZhbHMpKSE9MCYmYS5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1saXN0LWl0ZW0tLWluamVjdGVkXCIpLGEuam9pbihcIiBcIil9LHIuaGFuZGxlT25LZXlEb3duPWZ1bmN0aW9uKGUsdCl7dmFyIG4sYTtlLmtleT09PXllLlNwYWNlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUua2V5PXllLkVudGVyKSwoZS5rZXk9PT15ZS5BcnJvd1VwfHxlLmtleT09PXllLkFycm93TGVmdCkmJmUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmUudGFyZ2V0LnByZXZpb3VzU2libGluZyYmKGUucHJldmVudERlZmF1bHQoKSxlLnRhcmdldC5wcmV2aW91c1NpYmxpbmcgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZS50YXJnZXQucHJldmlvdXNTaWJsaW5nLmZvY3VzKCkpLChlLmtleT09PXllLkFycm93RG93bnx8ZS5rZXk9PT15ZS5BcnJvd1JpZ2h0KSYmZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZS50YXJnZXQubmV4dFNpYmxpbmcmJihlLnByZXZlbnREZWZhdWx0KCksZS50YXJnZXQubmV4dFNpYmxpbmcgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmZS50YXJnZXQubmV4dFNpYmxpbmcuZm9jdXMoKSksZS5rZXk9PT15ZS5FbnRlciYmci5oYW5kbGVDbGljayh0KSxudWxsPT09KGE9KG49ci5wcm9wcykuaGFuZGxlT25LZXlEb3duKXx8dm9pZCAwPT09YXx8YS5jYWxsKG4sZSl9LHIucmVuZGVyVGltZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGUsbj1bXSxhPXIucHJvcHMuZm9ybWF0P3IucHJvcHMuZm9ybWF0OlwicFwiLG89bnVsbCE9PShlPXIucHJvcHMuaW50ZXJ2YWxzKSYmdm9pZCAwIT09ZT9lOnQuZGVmYXVsdFByb3BzLmludGVydmFscyxpPXIucHJvcHMuc2VsZWN0ZWR8fHIucHJvcHMub3BlblRvRGF0ZXx8TWUoKSxsPVllKGkpLGM9ci5wcm9wcy5pbmplY3RUaW1lcyYmci5wcm9wcy5pbmplY3RUaW1lcy5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLmdldFRpbWUoKS10LmdldFRpbWUoKX0pKSxwPTYwKmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSxlLmdldE1vbnRoKCksZS5nZXREYXRlKCkpLHI9bmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLGUuZ2V0TW9udGgoKSxlLmdldERhdGUoKSwyNCk7cmV0dXJuIE1hdGgucm91bmQoKCtyLSt0KS8zNmU1KX0oaSksZD1wL28sdT0wO3U8ZDt1Kyspe3ZhciBmPXMuYWRkTWludXRlcyhsLHUqbyk7aWYobi5wdXNoKGYpLGMpe3ZhciBoPWZ0KGwsZix1LG8sYyk7bj1uLmNvbmNhdChoKX19dmFyIG09bi5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuZ2V0VGltZSgpPD1pLmdldFRpbWUoKT90OmV9KSxuWzBdKTtyZXR1cm4gbi5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLHtrZXk6ZS52YWx1ZU9mKCksb25DbGljazpyLmhhbmRsZUNsaWNrLmJpbmQocixlKSxjbGFzc05hbWU6ci5saUNsYXNzZXMoZSkscmVmOmZ1bmN0aW9uKHQpe2U9PT1tJiYoci5jZW50ZXJMaT10KX0sb25LZXlEb3duOmZ1bmN0aW9uKHQpe3IuaGFuZGxlT25LZXlEb3duKHQsZSl9LHRhYkluZGV4OmU9PT1tPzA6LTEscm9sZTpcIm9wdGlvblwiLFwiYXJpYS1zZWxlY3RlZFwiOnIuaXNTZWxlY3RlZFRpbWUoZSk/XCJ0cnVlXCI6dm9pZCAwLFwiYXJpYS1kaXNhYmxlZFwiOnIuaXNEaXNhYmxlZFRpbWUoZSk/XCJ0cnVlXCI6dm9pZCAwfSxfZShlLGEsci5wcm9wcy5sb2NhbGUpKX0pKX0scn1yZXR1cm4gdmUodCxlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcImRlZmF1bHRQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57aW50ZXJ2YWxzOjMwLHRvZGF5QnV0dG9uOm51bGwsdGltZUNhcHRpb246XCJUaW1lXCJ9fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUb1RoZVNlbGVjdGVkVGltZSgpLHRoaXMucHJvcHMubW9udGhSZWYmJnRoaXMuaGVhZGVyJiZ0aGlzLnNldFN0YXRlKHtoZWlnaHQ6dGhpcy5wcm9wcy5tb250aFJlZi5jbGllbnRIZWlnaHQtdGhpcy5oZWFkZXIuY2xpZW50SGVpZ2h0fSl9LHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlLHI9dGhpcyxuPXRoaXMuc3RhdGUuaGVpZ2h0O3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGltZS1jb250YWluZXIgXCIuY29uY2F0KChudWxsIT09KGU9dGhpcy5wcm9wcy50b2RheUJ1dHRvbikmJnZvaWQgMCE9PWU/ZTp0LmRlZmF1bHRQcm9wcy50b2RheUJ1dHRvbik/XCJyZWFjdC1kYXRlcGlja2VyX190aW1lLWNvbnRhaW5lci0td2l0aC10b2RheS1idXR0b25cIjpcIlwiKX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlciByZWFjdC1kYXRlcGlja2VyX19oZWFkZXItLXRpbWUgXCIuY29uY2F0KHRoaXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5P1wicmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS10aW1lLS1vbmx5XCI6XCJcIikscmVmOmZ1bmN0aW9uKGUpe3IuaGVhZGVyPWV9fSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlci10aW1lX19oZWFkZXJcIn0sdGhpcy5wcm9wcy50aW1lQ2FwdGlvbikpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190aW1lXCJ9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190aW1lLWJveFwifSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3RcIixyZWY6ZnVuY3Rpb24oZSl7ci5saXN0PWV9LHN0eWxlOm4/e2hlaWdodDpufTp7fSxyb2xlOlwibGlzdGJveFwiLFwiYXJpYS1sYWJlbFwiOnRoaXMucHJvcHMudGltZUNhcHRpb259LHRoaXMucmVuZGVyVGltZXMoKSkpKSl9LHQuY2FsY0NlbnRlclBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQub2Zmc2V0VG9wLShlLzItdC5jbGllbnRIZWlnaHQvMil9LHR9KHIuQ29tcG9uZW50KSxIdD1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKG4pe3ZhciBhPWUuY2FsbCh0aGlzLG4pfHx0aGlzO3JldHVybiBhLllFQVJfUkVGUz1EZShbXSxBcnJheShhLnByb3BzLnllYXJJdGVtTnVtYmVyKSwhMCkubWFwKChmdW5jdGlvbigpe3JldHVybiByLmNyZWF0ZVJlZigpfSkpLGEuaXNEaXNhYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gamUoZSx7bWluRGF0ZTphLnByb3BzLm1pbkRhdGUsbWF4RGF0ZTphLnByb3BzLm1heERhdGUsZXhjbHVkZURhdGVzOmEucHJvcHMuZXhjbHVkZURhdGVzLGluY2x1ZGVEYXRlczphLnByb3BzLmluY2x1ZGVEYXRlcyxmaWx0ZXJEYXRlOmEucHJvcHMuZmlsdGVyRGF0ZX0pfSxhLmlzRXhjbHVkZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIFVlKGUse2V4Y2x1ZGVEYXRlczphLnByb3BzLmV4Y2x1ZGVEYXRlc30pfSxhLnNlbGVjdGluZ0RhdGU9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gbnVsbCE9PShlPWEucHJvcHMuc2VsZWN0aW5nRGF0ZSkmJnZvaWQgMCE9PWU/ZTphLnByb3BzLnByZVNlbGVjdGlvbn0sYS51cGRhdGVGb2N1c09uUGFnaW5hdGU9ZnVuY3Rpb24oZSl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXt2YXIgdCxyO251bGw9PT0ocj1udWxsPT09KHQ9YS5ZRUFSX1JFRlNbZV0pfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmN1cnJlbnQpfHx2b2lkIDA9PT1yfHxyLmZvY3VzKCl9KSl9LGEuaGFuZGxlWWVhckNsaWNrPWZ1bmN0aW9uKGUsdCl7YS5wcm9wcy5vbkRheUNsaWNrJiZhLnByb3BzLm9uRGF5Q2xpY2soZSx0KX0sYS5oYW5kbGVZZWFyTmF2aWdhdGlvbj1mdW5jdGlvbihlLHQpe3ZhciByLG4sbyxzLGk9YS5wcm9wcyxsPWkuZGF0ZSxjPWkueWVhckl0ZW1OdW1iZXI7aWYodm9pZCAwIT09bCYmdm9pZCAwIT09Yyl7dmFyIHA9bXQobCxjKS5zdGFydFBlcmlvZDthLmlzRGlzYWJsZWQodCl8fGEuaXNFeGNsdWRlZCh0KXx8KG51bGw9PT0obj0ocj1hLnByb3BzKS5zZXRQcmVTZWxlY3Rpb24pfHx2b2lkIDA9PT1ufHxuLmNhbGwocix0KSxlLXA8MD9hLnVwZGF0ZUZvY3VzT25QYWdpbmF0ZShjLShwLWUpKTplLXA+PWM/YS51cGRhdGVGb2N1c09uUGFnaW5hdGUoTWF0aC5hYnMoYy0oZS1wKSkpOm51bGw9PT0ocz1udWxsPT09KG89YS5ZRUFSX1JFRlNbZS1wXSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uY3VycmVudCl8fHZvaWQgMD09PXN8fHMuZm9jdXMoKSl9fSxhLmlzU2FtZURheT1mdW5jdGlvbihlLHQpe3JldHVybiBIZShlLHQpfSxhLmlzQ3VycmVudFllYXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT14LmdldFllYXIoTWUoKSl9LGEuaXNSYW5nZVN0YXJ0PWZ1bmN0aW9uKGUpe3JldHVybiBhLnByb3BzLnN0YXJ0RGF0ZSYmYS5wcm9wcy5lbmREYXRlJiZMZShHLnNldFllYXIoTWUoKSxlKSxhLnByb3BzLnN0YXJ0RGF0ZSl9LGEuaXNSYW5nZUVuZD1mdW5jdGlvbihlKXtyZXR1cm4gYS5wcm9wcy5zdGFydERhdGUmJmEucHJvcHMuZW5kRGF0ZSYmTGUoRy5zZXRZZWFyKE1lKCksZSksYS5wcm9wcy5lbmREYXRlKX0sYS5pc0luUmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIEplKGUsYS5wcm9wcy5zdGFydERhdGUsYS5wcm9wcy5lbmREYXRlKX0sYS5pc0luU2VsZWN0aW5nUmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9YS5wcm9wcyxyPXQuc2VsZWN0c1N0YXJ0LG49dC5zZWxlY3RzRW5kLG89dC5zZWxlY3RzUmFuZ2Uscz10LnN0YXJ0RGF0ZSxpPXQuZW5kRGF0ZTtyZXR1cm4hKCEocnx8bnx8byl8fCFhLnNlbGVjdGluZ0RhdGUoKSkmJihyJiZpP0plKGUsYS5zZWxlY3RpbmdEYXRlKCksaSk6KG4mJnN8fCEoIW98fCFzfHxpKSkmJkplKGUscyxhLnNlbGVjdGluZ0RhdGUoKSkpfSxhLmlzU2VsZWN0aW5nUmFuZ2VTdGFydD1mdW5jdGlvbihlKXt2YXIgdDtpZighYS5pc0luU2VsZWN0aW5nUmFuZ2UoZSkpcmV0dXJuITE7dmFyIHI9YS5wcm9wcyxuPXIuc3RhcnREYXRlLG89ci5zZWxlY3RzU3RhcnQscz1HLnNldFllYXIoTWUoKSxlKTtyZXR1cm4gTGUocyxvP251bGwhPT0odD1hLnNlbGVjdGluZ0RhdGUoKSkmJnZvaWQgMCE9PXQ/dDpudWxsOm51bGwhPW4/bjpudWxsKX0sYS5pc1NlbGVjdGluZ1JhbmdlRW5kPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFhLmlzSW5TZWxlY3RpbmdSYW5nZShlKSlyZXR1cm4hMTt2YXIgcj1hLnByb3BzLG49ci5lbmREYXRlLG89ci5zZWxlY3RzRW5kLHM9ci5zZWxlY3RzUmFuZ2UsaT1HLnNldFllYXIoTWUoKSxlKTtyZXR1cm4gTGUoaSxvfHxzP251bGwhPT0odD1hLnNlbGVjdGluZ0RhdGUoKSkmJnZvaWQgMCE9PXQ/dDpudWxsOm51bGwhPW4/bjpudWxsKX0sYS5pc0tleWJvYXJkU2VsZWN0ZWQ9ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09YS5wcm9wcy5kYXRlJiZudWxsIT1hLnByb3BzLnNlbGVjdGVkJiZudWxsIT1hLnByb3BzLnByZVNlbGVjdGlvbil7dmFyIHQ9YS5wcm9wcyxyPXQubWluRGF0ZSxuPXQubWF4RGF0ZSxvPXQuZXhjbHVkZURhdGVzLHM9dC5pbmNsdWRlRGF0ZXMsaT10LmZpbHRlckRhdGUsbD1PZShHLnNldFllYXIoYS5wcm9wcy5kYXRlLGUpKSxjPShyfHxufHxvfHxzfHxpKSYmWmUoZSxhLnByb3BzKTtyZXR1cm4hYS5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbiYmIWEucHJvcHMuaW5saW5lJiYhSGUobCxPZShhLnByb3BzLnNlbGVjdGVkKSkmJkhlKGwsT2UoYS5wcm9wcy5wcmVTZWxlY3Rpb24pKSYmIWN9fSxhLm9uWWVhckNsaWNrPWZ1bmN0aW9uKGUsdCl7dmFyIHI9YS5wcm9wcy5kYXRlO3ZvaWQgMCE9PXImJmEuaGFuZGxlWWVhckNsaWNrKE9lKEcuc2V0WWVhcihyLHQpKSxlKX0sYS5vblllYXJLZXlEb3duPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbixvPWUua2V5LHM9YS5wcm9wcyxpPXMuZGF0ZSxsPXMueWVhckl0ZW1OdW1iZXIsYz1zLmhhbmRsZU9uS2V5RG93bjtpZihvIT09eWUuVGFiJiZlLnByZXZlbnREZWZhdWx0KCksIWEucHJvcHMuZGlzYWJsZWRLZXlib2FyZE5hdmlnYXRpb24pc3dpdGNoKG8pe2Nhc2UgeWUuRW50ZXI6aWYobnVsbD09YS5wcm9wcy5zZWxlY3RlZClicmVhazthLm9uWWVhckNsaWNrKGUsdCksbnVsbD09PShuPShyPWEucHJvcHMpLnNldFByZVNlbGVjdGlvbil8fHZvaWQgMD09PW58fG4uY2FsbChyLGEucHJvcHMuc2VsZWN0ZWQpO2JyZWFrO2Nhc2UgeWUuQXJyb3dSaWdodDppZihudWxsPT1hLnByb3BzLnByZVNlbGVjdGlvbilicmVhazthLmhhbmRsZVllYXJOYXZpZ2F0aW9uKHQrMSxkLmFkZFllYXJzKGEucHJvcHMucHJlU2VsZWN0aW9uLDEpKTticmVhaztjYXNlIHllLkFycm93TGVmdDppZihudWxsPT1hLnByb3BzLnByZVNlbGVjdGlvbilicmVhazthLmhhbmRsZVllYXJOYXZpZ2F0aW9uKHQtMSxpZS5zdWJZZWFycyhhLnByb3BzLnByZVNlbGVjdGlvbiwxKSk7YnJlYWs7Y2FzZSB5ZS5BcnJvd1VwOmlmKHZvaWQgMD09PWl8fHZvaWQgMD09PWx8fG51bGw9PWEucHJvcHMucHJlU2VsZWN0aW9uKWJyZWFrO3ZhciBwPW10KGksbCkuc3RhcnRQZXJpb2Q7aWYoKGg9dC0oZj0zKSk8cCl7dmFyIHU9bCVmO3Q+PXAmJnQ8cCt1P2Y9dTpmKz11LGg9dC1mfWEuaGFuZGxlWWVhck5hdmlnYXRpb24oaCxpZS5zdWJZZWFycyhhLnByb3BzLnByZVNlbGVjdGlvbixmKSk7YnJlYWs7Y2FzZSB5ZS5BcnJvd0Rvd246aWYodm9pZCAwPT09aXx8dm9pZCAwPT09bHx8bnVsbD09YS5wcm9wcy5wcmVTZWxlY3Rpb24pYnJlYWs7dmFyIGYsaCxtPW10KGksbCkuZW5kUGVyaW9kO2lmKChoPXQrKGY9MykpPm0pe3U9bCVmO3Q8PW0mJnQ+bS11P2Y9dTpmKz11LGg9dCtmfWEuaGFuZGxlWWVhck5hdmlnYXRpb24oaCxkLmFkZFllYXJzKGEucHJvcHMucHJlU2VsZWN0aW9uLGYpKX1jJiZjKGUpfSxhLmdldFllYXJDbGFzc05hbWVzPWZ1bmN0aW9uKGUpe3ZhciByPWEucHJvcHMsbj1yLmRhdGUsbz1yLm1pbkRhdGUscz1yLm1heERhdGUsaT1yLnNlbGVjdGVkLGw9ci5leGNsdWRlRGF0ZXMsYz1yLmluY2x1ZGVEYXRlcyxwPXIuZmlsdGVyRGF0ZSxkPXIueWVhckNsYXNzTmFtZTtyZXR1cm4gdC5jbHN4KFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0XCIsXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLVwiLmNvbmNhdChlKSxuP251bGw9PWQ/dm9pZCAwOmQoRy5zZXRZZWFyKG4sZSkpOnZvaWQgMCx7XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXNlbGVjdGVkXCI6aT9lPT09eC5nZXRZZWFyKGkpOnZvaWQgMCxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0tZGlzYWJsZWRcIjoob3x8c3x8bHx8Y3x8cCkmJlplKGUsYS5wcm9wcyksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLWtleWJvYXJkLXNlbGVjdGVkXCI6YS5pc0tleWJvYXJkU2VsZWN0ZWQoZSksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXJhbmdlLXN0YXJ0XCI6YS5pc1JhbmdlU3RhcnQoZSksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXJhbmdlLWVuZFwiOmEuaXNSYW5nZUVuZChlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tcmFuZ2VcIjphLmlzSW5SYW5nZShlKSxcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItdGV4dC0taW4tc2VsZWN0aW5nLXJhbmdlXCI6YS5pc0luU2VsZWN0aW5nUmFuZ2UoZSksXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXRleHQtLXNlbGVjdGluZy1yYW5nZS1zdGFydFwiOmEuaXNTZWxlY3RpbmdSYW5nZVN0YXJ0KGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS1zZWxlY3RpbmctcmFuZ2UtZW5kXCI6YS5pc1NlbGVjdGluZ1JhbmdlRW5kKGUpLFwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci10ZXh0LS10b2RheVwiOmEuaXNDdXJyZW50WWVhcihlKX0pfSxhLmdldFllYXJUYWJJbmRleD1mdW5jdGlvbihlKXtyZXR1cm4gYS5wcm9wcy5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbnx8bnVsbD09YS5wcm9wcy5wcmVTZWxlY3Rpb24/XCItMVwiOmU9PT14LmdldFllYXIoYS5wcm9wcy5wcmVTZWxlY3Rpb24pP1wiMFwiOlwiLTFcIn0sYS5nZXRZZWFyQ29udGFpbmVyQ2xhc3NOYW1lcz1mdW5jdGlvbigpe3ZhciBlPWEucHJvcHMscj1lLnNlbGVjdGluZ0RhdGUsbj1lLnNlbGVjdHNTdGFydCxvPWUuc2VsZWN0c0VuZCxzPWUuc2VsZWN0c1JhbmdlO3JldHVybiB0LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyXCIse1wicmVhY3QtZGF0ZXBpY2tlcl9feWVhci0tc2VsZWN0aW5nLXJhbmdlXCI6ciYmKG58fG98fHMpfSl9LGEuZ2V0WWVhckNvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGEucHJvcHMucmVuZGVyWWVhckNvbnRlbnQ/YS5wcm9wcy5yZW5kZXJZZWFyQ29udGVudChlKTplfSxhfXJldHVybiB2ZShuLGUpLG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1bXSxyPXRoaXMucHJvcHMsbj1yLmRhdGUsYT1yLnllYXJJdGVtTnVtYmVyLG89ci5vblllYXJNb3VzZUVudGVyLHM9ci5vblllYXJNb3VzZUxlYXZlO2lmKHZvaWQgMD09PW4pcmV0dXJuIG51bGw7Zm9yKHZhciBpPW10KG4sYSksbD1pLnN0YXJ0UGVyaW9kLGM9aS5lbmRQZXJpb2QscD1mdW5jdGlvbihyKXt0LnB1c2godWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse3JlZjpkLllFQVJfUkVGU1tyLWxdLG9uQ2xpY2s6ZnVuY3Rpb24odCl7ZS5vblllYXJDbGljayh0LHIpfSxvbktleURvd246ZnVuY3Rpb24odCl7eXQodCkmJih0LnByZXZlbnREZWZhdWx0KCksdC5rZXk9eWUuRW50ZXIpLGUub25ZZWFyS2V5RG93bih0LHIpfSx0YWJJbmRleDpOdW1iZXIoZC5nZXRZZWFyVGFiSW5kZXgocikpLGNsYXNzTmFtZTpkLmdldFllYXJDbGFzc05hbWVzKHIpLG9uTW91c2VFbnRlcjpkLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSxyKX0sb25Qb2ludGVyRW50ZXI6ZC5wcm9wcy51c2VQb2ludGVyRXZlbnQ/ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSxyKX06dm9pZCAwLG9uTW91c2VMZWF2ZTpkLnByb3BzLnVzZVBvaW50ZXJFdmVudD92b2lkIDA6ZnVuY3Rpb24oZSl7cmV0dXJuIHMoZSxyKX0sb25Qb2ludGVyTGVhdmU6ZC5wcm9wcy51c2VQb2ludGVyRXZlbnQ/ZnVuY3Rpb24oZSl7cmV0dXJuIHMoZSxyKX06dm9pZCAwLGtleTpyLFwiYXJpYS1jdXJyZW50XCI6ZC5pc0N1cnJlbnRZZWFyKHIpP1wiZGF0ZVwiOnZvaWQgMH0sZC5nZXRZZWFyQ29udGVudChyKSkpfSxkPXRoaXMsdT1sO3U8PWM7dSsrKXAodSk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6dGhpcy5nZXRZZWFyQ29udGFpbmVyQ2xhc3NOYW1lcygpfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci13cmFwcGVyXCIsb25Nb3VzZUxlYXZlOnRoaXMucHJvcHMudXNlUG9pbnRlckV2ZW50P3ZvaWQgMDp0aGlzLnByb3BzLmNsZWFyU2VsZWN0aW5nRGF0ZSxvblBvaW50ZXJMZWF2ZTp0aGlzLnByb3BzLnVzZVBvaW50ZXJFdmVudD90aGlzLnByb3BzLmNsZWFyU2VsZWN0aW5nRGF0ZTp2b2lkIDB9LHQpKX0sbn0oci5Db21wb25lbnQpO2Z1bmN0aW9uIFd0KGUsdCxyLG4pe2Zvcih2YXIgYT1bXSxvPTA7bzwyKnQrMTtvKyspe3ZhciBzPWUrdC1vLGk9ITA7ciYmKGk9eC5nZXRZZWFyKHIpPD1zKSxuJiZpJiYoaT14LmdldFllYXIobik+PXMpLGkmJmEucHVzaChzKX1yZXR1cm4gYX12YXIgUXQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbih0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztuLnJlbmRlck9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgZT1uLnByb3BzLnllYXIsdD1uLnN0YXRlLnllYXJzTGlzdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOmU9PT10P1wicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb24gcmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb24tLXNlbGVjdGVkX3llYXJcIjpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItb3B0aW9uXCIsa2V5OnQsb25DbGljazpuLm9uQ2hhbmdlLmJpbmQobix0KSxcImFyaWEtc2VsZWN0ZWRcIjplPT09dD9cInRydWVcIjp2b2lkIDB9LGU9PT10P3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb24tLXNlbGVjdGVkXCJ9LFwi4pyTXCIpOlwiXCIsdCl9KSkscj1uLnByb3BzLm1pbkRhdGU/eC5nZXRZZWFyKG4ucHJvcHMubWluRGF0ZSk6bnVsbCxhPW4ucHJvcHMubWF4RGF0ZT94LmdldFllYXIobi5wcm9wcy5tYXhEYXRlKTpudWxsO3JldHVybiBhJiZuLnN0YXRlLnllYXJzTGlzdC5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZT09PWF9KSl8fHQudW5zaGlmdCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1vcHRpb25cIixrZXk6XCJ1cGNvbWluZ1wiLG9uQ2xpY2s6bi5pbmNyZW1lbnRZZWFyc30sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYVwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uIHJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzIHJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXllYXJzLXVwY29taW5nXCJ9KSkpLHImJm4uc3RhdGUueWVhcnNMaXN0LmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09cn0pKXx8dC5wdXNoKHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLW9wdGlvblwiLGtleTpcInByZXZpb3VzXCIsb25DbGljazpuLmRlY3JlbWVudFllYXJzfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJhXCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24gcmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMgcmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0teWVhcnMtcHJldmlvdXNcIn0pKSksdH0sbi5vbkNoYW5nZT1mdW5jdGlvbihlKXtuLnByb3BzLm9uQ2hhbmdlKGUpfSxuLmhhbmRsZUNsaWNrT3V0c2lkZT1mdW5jdGlvbigpe24ucHJvcHMub25DYW5jZWwoKX0sbi5zaGlmdFllYXJzPWZ1bmN0aW9uKGUpe3ZhciB0PW4uc3RhdGUueWVhcnNMaXN0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQrZX0pKTtuLnNldFN0YXRlKHt5ZWFyc0xpc3Q6dH0pfSxuLmluY3JlbWVudFllYXJzPWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2hpZnRZZWFycygxKX0sbi5kZWNyZW1lbnRZZWFycz1mdW5jdGlvbigpe3JldHVybiBuLnNoaWZ0WWVhcnMoLTEpfTt2YXIgYT10LnllYXJEcm9wZG93bkl0ZW1OdW1iZXIsbz10LnNjcm9sbGFibGVZZWFyRHJvcGRvd24scz1hfHwobz8xMDo1KTtyZXR1cm4gbi5zdGF0ZT17eWVhcnNMaXN0Old0KG4ucHJvcHMueWVhcixzLG4ucHJvcHMubWluRGF0ZSxuLnByb3BzLm1heERhdGUpfSxuLmRyb3Bkb3duUmVmPXIuY3JlYXRlUmVmKCksbn1yZXR1cm4gdmUobixlKSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZHJvcGRvd25SZWYuY3VycmVudDtpZihlKXt2YXIgdD1lLmNoaWxkcmVuP0FycmF5LmZyb20oZS5jaGlsZHJlbik6bnVsbCxyPXQ/dC5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS5hcmlhU2VsZWN0ZWR9KSk6bnVsbDtlLnNjcm9sbFRvcD1yJiZyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ/ci5vZmZzZXRUb3ArKHIuY2xpZW50SGVpZ2h0LWUuY2xpZW50SGVpZ2h0KS8yOihlLnNjcm9sbEhlaWdodC1lLmNsaWVudEhlaWdodCkvMn19LG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXQuY2xzeCh7XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duXCI6ITAsXCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLWRyb3Bkb3duLS1zY3JvbGxhYmxlXCI6dGhpcy5wcm9wcy5zY3JvbGxhYmxlWWVhckRyb3Bkb3dufSk7cmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6ZSxyZWY6dGhpcy5kcm9wZG93blJlZn0sdGhpcy5yZW5kZXJPcHRpb25zKCkpfSxufShyLkNvbXBvbmVudCkscXQ9ZmUuZGVmYXVsdChRdCksS3Q9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciB0PW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gdC5zdGF0ZT17ZHJvcGRvd25WaXNpYmxlOiExfSx0LnJlbmRlclNlbGVjdE9wdGlvbnM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dC5wcm9wcy5taW5EYXRlP3guZ2V0WWVhcih0LnByb3BzLm1pbkRhdGUpOjE5MDAscj10LnByb3BzLm1heERhdGU/eC5nZXRZZWFyKHQucHJvcHMubWF4RGF0ZSk6MjEwMCxuPVtdLGE9ZTthPD1yO2ErKyluLnB1c2godWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIse2tleTphLHZhbHVlOmF9LGEpKTtyZXR1cm4gbn0sdC5vblNlbGVjdENoYW5nZT1mdW5jdGlvbihlKXt0Lm9uQ2hhbmdlKHBhcnNlSW50KGUudGFyZ2V0LnZhbHVlKSl9LHQucmVuZGVyU2VsZWN0TW9kZT1mdW5jdGlvbigpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIix7dmFsdWU6dC5wcm9wcy55ZWFyLGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItc2VsZWN0XCIsb25DaGFuZ2U6dC5vblNlbGVjdENoYW5nZX0sdC5yZW5kZXJTZWxlY3RPcHRpb25zKCkpfSx0LnJlbmRlclJlYWRWaWV3PWZ1bmN0aW9uKGUpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7a2V5OlwicmVhZFwiLHN0eWxlOnt2aXNpYmlsaXR5OmU/XCJ2aXNpYmxlXCI6XCJoaWRkZW5cIn0sY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9feWVhci1yZWFkLXZpZXdcIixvbkNsaWNrOmZ1bmN0aW9uKGUpe3JldHVybiB0LnRvZ2dsZURyb3Bkb3duKGUpfX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tZG93bi1hcnJvd1wifSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLXJlYWQtdmlldy0tc2VsZWN0ZWQteWVhclwifSx0LnByb3BzLnllYXIpKX0sdC5yZW5kZXJEcm9wZG93bj1mdW5jdGlvbigpe3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQocXQsZ2Uoe2tleTpcImRyb3Bkb3duXCJ9LHQucHJvcHMse29uQ2hhbmdlOnQub25DaGFuZ2Usb25DYW5jZWw6dC50b2dnbGVEcm9wZG93bn0pKX0sdC5yZW5kZXJTY3JvbGxNb2RlPWZ1bmN0aW9uKCl7dmFyIGU9dC5zdGF0ZS5kcm9wZG93blZpc2libGUscj1bdC5yZW5kZXJSZWFkVmlldyghZSldO3JldHVybiBlJiZyLnVuc2hpZnQodC5yZW5kZXJEcm9wZG93bigpKSxyfSx0Lm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3QudG9nZ2xlRHJvcGRvd24oKSxlIT09dC5wcm9wcy55ZWFyJiZ0LnByb3BzLm9uQ2hhbmdlKGUpfSx0LnRvZ2dsZURyb3Bkb3duPWZ1bmN0aW9uKGUpe3Quc2V0U3RhdGUoe2Ryb3Bkb3duVmlzaWJsZTohdC5zdGF0ZS5kcm9wZG93blZpc2libGV9LChmdW5jdGlvbigpe3QucHJvcHMuYWRqdXN0RGF0ZU9uQ2hhbmdlJiZ0LmhhbmRsZVllYXJDaGFuZ2UodC5wcm9wcy5kYXRlLGUpfSkpfSx0LmhhbmRsZVllYXJDaGFuZ2U9ZnVuY3Rpb24oZSxyKXt0Lm9uU2VsZWN0KGUsciksdC5zZXRPcGVuKCl9LHQub25TZWxlY3Q9ZnVuY3Rpb24oZSxyKXt0LnByb3BzLm9uU2VsZWN0JiZ0LnByb3BzLm9uU2VsZWN0KGUscil9LHQuc2V0T3Blbj1mdW5jdGlvbigpe3QucHJvcHMuc2V0T3BlbiYmdC5wcm9wcy5zZXRPcGVuKCEwKX0sdH1yZXR1cm4gdmUodCxlKSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZTtzd2l0Y2godGhpcy5wcm9wcy5kcm9wZG93bk1vZGUpe2Nhc2VcInNjcm9sbFwiOmU9dGhpcy5yZW5kZXJTY3JvbGxNb2RlKCk7YnJlYWs7Y2FzZVwic2VsZWN0XCI6ZT10aGlzLnJlbmRlclNlbGVjdE1vZGUoKX1yZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tY29udGFpbmVyIHJlYWN0LWRhdGVwaWNrZXJfX3llYXItZHJvcGRvd24tY29udGFpbmVyLS1cIi5jb25jYXQodGhpcy5wcm9wcy5kcm9wZG93bk1vZGUpfSxlKX0sdH0oci5Db21wb25lbnQpLEJ0PVtcInJlYWN0LWRhdGVwaWNrZXJfX3llYXItc2VsZWN0XCIsXCJyZWFjdC1kYXRlcGlja2VyX19tb250aC1zZWxlY3RcIixcInJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXllYXItc2VsZWN0XCJdLFZ0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4obyl7dmFyIHM9ZS5jYWxsKHRoaXMsbyl8fHRoaXM7cmV0dXJuIHMubW9udGhDb250YWluZXI9dm9pZCAwLHMuaGFuZGxlQ2xpY2tPdXRzaWRlPWZ1bmN0aW9uKGUpe3MucHJvcHMub25DbGlja091dHNpZGUoZSl9LHMuc2V0Q2xpY2tPdXRzaWRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJuIHMuY29udGFpbmVyUmVmLmN1cnJlbnR9LHMuaGFuZGxlRHJvcGRvd25Gb2N1cz1mdW5jdGlvbihlKXt2YXIgdCxyLG4sYTtuPWUudGFyZ2V0LGE9KG4uY2xhc3NOYW1lfHxcIlwiKS5zcGxpdCgvXFxzKy8pLEJ0LnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBhLmluZGV4T2YoZSk+PTB9KSkmJihudWxsPT09KHI9KHQ9cy5wcm9wcykub25Ecm9wZG93bkZvY3VzKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSkpfSxzLmdldERhdGVJblZpZXc9ZnVuY3Rpb24oKXt2YXIgZT1zLnByb3BzLHQ9ZS5wcmVTZWxlY3Rpb24scj1lLnNlbGVjdGVkLG49ZS5vcGVuVG9EYXRlLGE9Y3Qocy5wcm9wcyksbz1wdChzLnByb3BzKSxpPU1lKCksbD1ufHxyfHx0O3JldHVybiBsfHwoYSYmTy5pc0JlZm9yZShpLGEpP2E6byYmTi5pc0FmdGVyKGksbyk/bzppKX0scy5pbmNyZWFzZU1vbnRoPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZSgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRlO3JldHVybntkYXRlOmkuYWRkTW9udGhzKHQsMSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlTW9udGhDaGFuZ2Uocy5zdGF0ZS5kYXRlKX0pKX0scy5kZWNyZWFzZU1vbnRoPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZSgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRlO3JldHVybntkYXRlOmFlLnN1Yk1vbnRocyh0LDEpfX0pLChmdW5jdGlvbigpe3JldHVybiBzLmhhbmRsZU1vbnRoQ2hhbmdlKHMuc3RhdGUuZGF0ZSl9KSl9LHMuaGFuZGxlRGF5Q2xpY2s9ZnVuY3Rpb24oZSx0LHIpe3MucHJvcHMub25TZWxlY3QoZSx0LHIpLHMucHJvcHMuc2V0UHJlU2VsZWN0aW9uJiZzLnByb3BzLnNldFByZVNlbGVjdGlvbihlKX0scy5oYW5kbGVEYXlNb3VzZUVudGVyPWZ1bmN0aW9uKGUpe3Muc2V0U3RhdGUoe3NlbGVjdGluZ0RhdGU6ZX0pLHMucHJvcHMub25EYXlNb3VzZUVudGVyJiZzLnByb3BzLm9uRGF5TW91c2VFbnRlcihlKX0scy5oYW5kbGVNb250aE1vdXNlTGVhdmU9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKHtzZWxlY3RpbmdEYXRlOnZvaWQgMH0pLHMucHJvcHMub25Nb250aE1vdXNlTGVhdmUmJnMucHJvcHMub25Nb250aE1vdXNlTGVhdmUoKX0scy5oYW5kbGVZZWFyTW91c2VFbnRlcj1mdW5jdGlvbihlLHQpe3Muc2V0U3RhdGUoe3NlbGVjdGluZ0RhdGU6Ry5zZXRZZWFyKE1lKCksdCl9KSxzLnByb3BzLm9uWWVhck1vdXNlRW50ZXImJnMucHJvcHMub25ZZWFyTW91c2VFbnRlcihlLHQpfSxzLmhhbmRsZVllYXJNb3VzZUxlYXZlPWZ1bmN0aW9uKGUsdCl7cy5wcm9wcy5vblllYXJNb3VzZUxlYXZlJiZzLnByb3BzLm9uWWVhck1vdXNlTGVhdmUoZSx0KX0scy5oYW5kbGVZZWFyQ2hhbmdlPWZ1bmN0aW9uKGUpe3MucHJvcHMub25ZZWFyQ2hhbmdlJiYocy5wcm9wcy5vblllYXJDaGFuZ2UoZSkscy5zZXRTdGF0ZSh7aXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITB9KSkscy5wcm9wcy5hZGp1c3REYXRlT25DaGFuZ2UmJihzLnByb3BzLm9uU2VsZWN0JiZzLnByb3BzLm9uU2VsZWN0KGUpLHMucHJvcHMuc2V0T3BlbiYmcy5wcm9wcy5zZXRPcGVuKCEwKSkscy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24mJnMucHJvcHMuc2V0UHJlU2VsZWN0aW9uKGUpfSxzLmhhbmRsZU1vbnRoQ2hhbmdlPWZ1bmN0aW9uKGUpe3MuaGFuZGxlQ3VzdG9tTW9udGhDaGFuZ2UoZSkscy5wcm9wcy5hZGp1c3REYXRlT25DaGFuZ2UmJihzLnByb3BzLm9uU2VsZWN0JiZzLnByb3BzLm9uU2VsZWN0KGUpLHMucHJvcHMuc2V0T3BlbiYmcy5wcm9wcy5zZXRPcGVuKCEwKSkscy5wcm9wcy5zZXRQcmVTZWxlY3Rpb24mJnMucHJvcHMuc2V0UHJlU2VsZWN0aW9uKGUpfSxzLmhhbmRsZUN1c3RvbU1vbnRoQ2hhbmdlPWZ1bmN0aW9uKGUpe3MucHJvcHMub25Nb250aENoYW5nZSYmKHMucHJvcHMub25Nb250aENoYW5nZShlKSxzLnNldFN0YXRlKHtpc1JlbmRlckFyaWFMaXZlTWVzc2FnZTohMH0pKX0scy5oYW5kbGVNb250aFllYXJDaGFuZ2U9ZnVuY3Rpb24oZSl7cy5oYW5kbGVZZWFyQ2hhbmdlKGUpLHMuaGFuZGxlTW9udGhDaGFuZ2UoZSl9LHMuY2hhbmdlWWVhcj1mdW5jdGlvbihlKXtzLnNldFN0YXRlKChmdW5jdGlvbih0KXt2YXIgcj10LmRhdGU7cmV0dXJue2RhdGU6Ry5zZXRZZWFyKHIsTnVtYmVyKGUpKX19KSwoZnVuY3Rpb24oKXtyZXR1cm4gcy5oYW5kbGVZZWFyQ2hhbmdlKHMuc3RhdGUuZGF0ZSl9KSl9LHMuY2hhbmdlTW9udGg9ZnVuY3Rpb24oZSl7cy5zZXRTdGF0ZSgoZnVuY3Rpb24odCl7dmFyIHI9dC5kYXRlO3JldHVybntkYXRlOiQuc2V0TW9udGgocixOdW1iZXIoZSkpfX0pLChmdW5jdGlvbigpe3JldHVybiBzLmhhbmRsZU1vbnRoQ2hhbmdlKHMuc3RhdGUuZGF0ZSl9KSl9LHMuY2hhbmdlTW9udGhZZWFyPWZ1bmN0aW9uKGUpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKHQpe3ZhciByPXQuZGF0ZTtyZXR1cm57ZGF0ZTpHLnNldFllYXIoJC5zZXRNb250aChyLF8uZ2V0TW9udGgoZSkpLHguZ2V0WWVhcihlKSl9fSksKGZ1bmN0aW9uKCl7cmV0dXJuIHMuaGFuZGxlTW9udGhZZWFyQ2hhbmdlKHMuc3RhdGUuZGF0ZSl9KSl9LHMuaGVhZGVyPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXMuc3RhdGUuZGF0ZSk7dmFyIHI9eGUoZSxzLnByb3BzLmxvY2FsZSxzLnByb3BzLmNhbGVuZGFyU3RhcnREYXkpLG49W107cmV0dXJuIHMucHJvcHMuc2hvd1dlZWtOdW1iZXJzJiZuLnB1c2godWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2tleTpcIldcIixjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZVwifSxzLnByb3BzLndlZWtMYWJlbHx8XCIjXCIpKSxuLmNvbmNhdChbMCwxLDIsMyw0LDUsNl0ubWFwKChmdW5jdGlvbihlKXt2YXIgbj1hLmFkZERheXMocixlKSxvPXMuZm9ybWF0V2Vla2RheShuLHMucHJvcHMubG9jYWxlKSxpPXMucHJvcHMud2Vla0RheUNsYXNzTmFtZT9zLnByb3BzLndlZWtEYXlDbGFzc05hbWUobik6dm9pZCAwO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7a2V5OmUsXCJhcmlhLWxhYmVsXCI6X2UobixcIkVFRUVcIixzLnByb3BzLmxvY2FsZSksY2xhc3NOYW1lOnQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJfX2RheS1uYW1lXCIsaSl9LG8pfSkpKX0scy5mb3JtYXRXZWVrZGF5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHMucHJvcHMuZm9ybWF0V2Vla0RheT9mdW5jdGlvbihlLHQscil7cmV0dXJuIHQoX2UoZSxcIkVFRUVcIixyKSl9KGUscy5wcm9wcy5mb3JtYXRXZWVrRGF5LHQpOnMucHJvcHMudXNlV2Vla2RheXNTaG9ydD9mdW5jdGlvbihlLHQpe3JldHVybiBfZShlLFwiRUVFXCIsdCl9KGUsdCk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gX2UoZSxcIkVFRUVFRVwiLHQpfShlLHQpfSxzLmRlY3JlYXNlWWVhcj1mdW5jdGlvbigpe3Muc2V0U3RhdGUoKGZ1bmN0aW9uKGUpe3ZhciB0LHI9ZS5kYXRlO3JldHVybntkYXRlOmllLnN1YlllYXJzKHIscy5wcm9wcy5zaG93WWVhclBpY2tlcj9udWxsIT09KHQ9cy5wcm9wcy55ZWFySXRlbU51bWJlcikmJnZvaWQgMCE9PXQ/dDpuLmRlZmF1bHRQcm9wcy55ZWFySXRlbU51bWJlcjoxKX19KSwoZnVuY3Rpb24oKXtyZXR1cm4gcy5oYW5kbGVZZWFyQ2hhbmdlKHMuc3RhdGUuZGF0ZSl9KSl9LHMuY2xlYXJTZWxlY3RpbmdEYXRlPWZ1bmN0aW9uKCl7cy5zZXRTdGF0ZSh7c2VsZWN0aW5nRGF0ZTp2b2lkIDB9KX0scy5yZW5kZXJQcmV2aW91c0J1dHRvbj1mdW5jdGlvbigpe3ZhciBlO2lmKCFzLnByb3BzLnJlbmRlckN1c3RvbUhlYWRlcil7dmFyIHQ7c3dpdGNoKCEwKXtjYXNlIHMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcjp0PWl0KHMuc3RhdGUuZGF0ZSxzLnByb3BzKTticmVhaztjYXNlIHMucHJvcHMuc2hvd1llYXJQaWNrZXI6dD1mdW5jdGlvbihlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWluRGF0ZSxhPXIueWVhckl0ZW1OdW1iZXIsbz12b2lkIDA9PT1hP1NlOmEscz1tdChPZShpZS5zdWJZZWFycyhlLG8pKSxvKS5lbmRQZXJpb2QsaT1uJiZ4LmdldFllYXIobik7cmV0dXJuIGkmJmk+c3x8ITF9KHMuc3RhdGUuZGF0ZSxzLnByb3BzKTticmVhaztjYXNlIHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyOnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1pbkRhdGUsYT1yLmluY2x1ZGVEYXRlcyxvPXJlLnN0YXJ0T2ZZZWFyKGUpLHM9b2Uuc3ViUXVhcnRlcnMobywxKTtyZXR1cm4gbiYmaC5kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzKG4scyk+MHx8YSYmYS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIGguZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhlLHMpPjB9KSl8fCExfShzLnN0YXRlLmRhdGUscy5wcm9wcyk7YnJlYWs7ZGVmYXVsdDp0PW90KHMuc3RhdGUuZGF0ZSxzLnByb3BzKX1pZigoKG51bGwhPT0oZT1zLnByb3BzLmZvcmNlU2hvd01vbnRoTmF2aWdhdGlvbikmJnZvaWQgMCE9PWU/ZTpuLmRlZmF1bHRQcm9wcy5mb3JjZVNob3dNb250aE5hdmlnYXRpb24pfHxzLnByb3BzLnNob3dEaXNhYmxlZE1vbnRoTmF2aWdhdGlvbnx8IXQpJiYhcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpe3ZhciByPVtcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb25cIixcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24tLXByZXZpb3VzXCJdLGE9cy5kZWNyZWFzZU1vbnRoOyhzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyfHxzLnByb3BzLnNob3dZZWFyUGlja2VyKSYmKGE9cy5kZWNyZWFzZVllYXIpLHQmJnMucHJvcHMuc2hvd0Rpc2FibGVkTW9udGhOYXZpZ2F0aW9uJiYoci5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tcHJldmlvdXMtLWRpc2FibGVkXCIpLGE9dm9pZCAwKTt2YXIgbz1zLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyfHxzLnByb3BzLnNob3dZZWFyUGlja2VyLGk9cy5wcm9wcyxsPWkucHJldmlvdXNNb250aEJ1dHRvbkxhYmVsLGM9dm9pZCAwPT09bD9uLmRlZmF1bHRQcm9wcy5wcmV2aW91c01vbnRoQnV0dG9uTGFiZWw6bCxwPWkucHJldmlvdXNZZWFyQnV0dG9uTGFiZWwsZD12b2lkIDA9PT1wP24uZGVmYXVsdFByb3BzLnByZXZpb3VzWWVhckJ1dHRvbkxhYmVsOnAsdT1zLnByb3BzLGY9dS5wcmV2aW91c01vbnRoQXJpYUxhYmVsLG09dm9pZCAwPT09Zj9cInN0cmluZ1wiPT10eXBlb2YgYz9jOlwiUHJldmlvdXMgTW9udGhcIjpmLHY9dS5wcmV2aW91c1llYXJBcmlhTGFiZWwsZz12b2lkIDA9PT12P1wic3RyaW5nXCI9PXR5cGVvZiBkP2Q6XCJQcmV2aW91cyBZZWFyXCI6djtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIse3R5cGU6XCJidXR0b25cIixjbGFzc05hbWU6ci5qb2luKFwiIFwiKSxvbkNsaWNrOmEsb25LZXlEb3duOnMucHJvcHMuaGFuZGxlT25LZXlEb3duLFwiYXJpYS1sYWJlbFwiOm8/ZzptfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpbXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb25cIixcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tcHJldmlvdXNcIl0uam9pbihcIiBcIil9LG8/ZDpjKSl9fX0scy5pbmNyZWFzZVllYXI9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKChmdW5jdGlvbihlKXt2YXIgdCxyPWUuZGF0ZTtyZXR1cm57ZGF0ZTpkLmFkZFllYXJzKHIscy5wcm9wcy5zaG93WWVhclBpY2tlcj9udWxsIT09KHQ9cy5wcm9wcy55ZWFySXRlbU51bWJlcikmJnZvaWQgMCE9PXQ/dDpuLmRlZmF1bHRQcm9wcy55ZWFySXRlbU51bWJlcjoxKX19KSwoZnVuY3Rpb24oKXtyZXR1cm4gcy5oYW5kbGVZZWFyQ2hhbmdlKHMuc3RhdGUuZGF0ZSl9KSl9LHMucmVuZGVyTmV4dEJ1dHRvbj1mdW5jdGlvbigpe3ZhciBlO2lmKCFzLnByb3BzLnJlbmRlckN1c3RvbUhlYWRlcil7dmFyIHQ7c3dpdGNoKCEwKXtjYXNlIHMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcjp0PWx0KHMuc3RhdGUuZGF0ZSxzLnByb3BzKTticmVhaztjYXNlIHMucHJvcHMuc2hvd1llYXJQaWNrZXI6dD1mdW5jdGlvbihlLHQpe3ZhciByPXZvaWQgMD09PXQ/e306dCxuPXIubWF4RGF0ZSxhPXIueWVhckl0ZW1OdW1iZXIsbz12b2lkIDA9PT1hP1NlOmEscz1tdChkLmFkZFllYXJzKGUsbyksbykuc3RhcnRQZXJpb2QsaT1uJiZ4LmdldFllYXIobik7cmV0dXJuIGkmJmk8c3x8ITF9KHMuc3RhdGUuZGF0ZSxzLnByb3BzKTticmVhaztjYXNlIHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyOnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj12b2lkIDA9PT10P3t9OnQsbj1yLm1heERhdGUsYT1yLmluY2x1ZGVEYXRlcyxvPXkuZW5kT2ZZZWFyKGUpLHM9bC5hZGRRdWFydGVycyhvLDEpO3JldHVybiBuJiZoLmRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMocyxuKT4wfHxhJiZhLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gaC5kaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzKHMsZSk+MH0pKXx8ITF9KHMuc3RhdGUuZGF0ZSxzLnByb3BzKTticmVhaztkZWZhdWx0OnQ9c3Qocy5zdGF0ZS5kYXRlLHMucHJvcHMpfWlmKCgobnVsbCE9PShlPXMucHJvcHMuZm9yY2VTaG93TW9udGhOYXZpZ2F0aW9uKSYmdm9pZCAwIT09ZT9lOm4uZGVmYXVsdFByb3BzLmZvcmNlU2hvd01vbnRoTmF2aWdhdGlvbil8fHMucHJvcHMuc2hvd0Rpc2FibGVkTW9udGhOYXZpZ2F0aW9ufHwhdCkmJiFzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSl7dmFyIHI9W1wicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvblwiLFwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dFwiXTtzLnByb3BzLnNob3dUaW1lU2VsZWN0JiZyLnB1c2goXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLS1uZXh0LS13aXRoLXRpbWVcIikscy5wcm9wcy50b2RheUJ1dHRvbiYmci5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0td2l0aC10b2RheS1idXR0b25cIik7dmFyIGE9cy5pbmNyZWFzZU1vbnRoOyhzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyfHxzLnByb3BzLnNob3dZZWFyUGlja2VyKSYmKGE9cy5pbmNyZWFzZVllYXIpLHQmJnMucHJvcHMuc2hvd0Rpc2FibGVkTW9udGhOYXZpZ2F0aW9uJiYoci5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fbmF2aWdhdGlvbi0tbmV4dC0tZGlzYWJsZWRcIiksYT12b2lkIDApO3ZhciBvPXMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1llYXJQaWNrZXIsaT1zLnByb3BzLGM9aS5uZXh0TW9udGhCdXR0b25MYWJlbCxwPXZvaWQgMD09PWM/bi5kZWZhdWx0UHJvcHMubmV4dE1vbnRoQnV0dG9uTGFiZWw6Yyx1PWkubmV4dFllYXJCdXR0b25MYWJlbCxmPXZvaWQgMD09PXU/bi5kZWZhdWx0UHJvcHMubmV4dFllYXJCdXR0b25MYWJlbDp1LG09cy5wcm9wcyx2PW0ubmV4dE1vbnRoQXJpYUxhYmVsLGc9dm9pZCAwPT09dj9cInN0cmluZ1wiPT10eXBlb2YgcD9wOlwiTmV4dCBNb250aFwiOnYsRD1tLm5leHRZZWFyQXJpYUxhYmVsLGs9dm9pZCAwPT09RD9cInN0cmluZ1wiPT10eXBlb2YgZj9mOlwiTmV4dCBZZWFyXCI6RDtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIse3R5cGU6XCJidXR0b25cIixjbGFzc05hbWU6ci5qb2luKFwiIFwiKSxvbkNsaWNrOmEsb25LZXlEb3duOnMucHJvcHMuaGFuZGxlT25LZXlEb3duLFwiYXJpYS1sYWJlbFwiOm8/azpnfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIse2NsYXNzTmFtZTpbXCJyZWFjdC1kYXRlcGlja2VyX19uYXZpZ2F0aW9uLWljb25cIixcInJlYWN0LWRhdGVwaWNrZXJfX25hdmlnYXRpb24taWNvbi0tbmV4dFwiXS5qb2luKFwiIFwiKX0sbz9mOnApKX19fSxzLnJlbmRlckN1cnJlbnRNb250aD1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT1zLnN0YXRlLmRhdGUpO3ZhciB0PVtcInJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGhcIl07cmV0dXJuIHMucHJvcHMuc2hvd1llYXJEcm9wZG93biYmdC5wdXNoKFwicmVhY3QtZGF0ZXBpY2tlcl9fY3VycmVudC1tb250aC0taGFzWWVhckRyb3Bkb3duXCIpLHMucHJvcHMuc2hvd01vbnRoRHJvcGRvd24mJnQucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgtLWhhc01vbnRoRHJvcGRvd25cIikscy5wcm9wcy5zaG93TW9udGhZZWFyRHJvcGRvd24mJnQucHVzaChcInJlYWN0LWRhdGVwaWNrZXJfX2N1cnJlbnQtbW9udGgtLWhhc01vbnRoWWVhckRyb3Bkb3duXCIpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImgyXCIse2NsYXNzTmFtZTp0LmpvaW4oXCIgXCIpfSxfZShlLHMucHJvcHMuZGF0ZUZvcm1hdCxzLnByb3BzLmxvY2FsZSkpfSxzLnJlbmRlclllYXJEcm9wZG93bj1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lJiYoZT0hMSkscy5wcm9wcy5zaG93WWVhckRyb3Bkb3duJiYhZSlyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEt0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse2RhdGU6cy5zdGF0ZS5kYXRlLG9uQ2hhbmdlOnMuY2hhbmdlWWVhcix5ZWFyOnguZ2V0WWVhcihzLnN0YXRlLmRhdGUpfSkpfSxzLnJlbmRlck1vbnRoRHJvcGRvd249ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSYmKGU9ITEpLHMucHJvcHMuc2hvd01vbnRoRHJvcGRvd24mJiFlKXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSXQsZ2Uoe30sbi5kZWZhdWx0UHJvcHMscy5wcm9wcyx7bW9udGg6Xy5nZXRNb250aChzLnN0YXRlLmRhdGUpLG9uQ2hhbmdlOnMuY2hhbmdlTW9udGh9KSl9LHMucmVuZGVyTW9udGhZZWFyRHJvcGRvd249ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSYmKGU9ITEpLHMucHJvcHMuc2hvd01vbnRoWWVhckRyb3Bkb3duJiYhZSlyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KEF0LGdlKHt9LG4uZGVmYXVsdFByb3BzLHMucHJvcHMse2RhdGU6cy5zdGF0ZS5kYXRlLG9uQ2hhbmdlOnMuY2hhbmdlTW9udGhZZWFyfSkpfSxzLmhhbmRsZVRvZGF5QnV0dG9uQ2xpY2s9ZnVuY3Rpb24oZSl7cy5wcm9wcy5vblNlbGVjdChUZSgpLGUpLHMucHJvcHMuc2V0UHJlU2VsZWN0aW9uJiZzLnByb3BzLnNldFByZVNlbGVjdGlvbihUZSgpKX0scy5yZW5kZXJUb2RheUJ1dHRvbj1mdW5jdGlvbigpe2lmKHMucHJvcHMudG9kYXlCdXR0b24mJiFzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSlyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RvZGF5LWJ1dHRvblwiLG9uQ2xpY2s6cy5oYW5kbGVUb2RheUJ1dHRvbkNsaWNrfSxzLnByb3BzLnRvZGF5QnV0dG9uKX0scy5yZW5kZXJEZWZhdWx0SGVhZGVyPWZ1bmN0aW9uKGUpe3ZhciB0PWUubW9udGhEYXRlLHI9ZS5pO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyIFwiLmNvbmNhdChzLnByb3BzLnNob3dUaW1lU2VsZWN0P1wicmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyLS1oYXMtdGltZS1zZWxlY3RcIjpcIlwiKX0scy5yZW5kZXJDdXJyZW50TW9udGgodCksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlcl9fZHJvcGRvd24gcmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyX19kcm9wZG93bi0tXCIuY29uY2F0KHMucHJvcHMuZHJvcGRvd25Nb2RlKSxvbkZvY3VzOnMuaGFuZGxlRHJvcGRvd25Gb2N1c30scy5yZW5kZXJNb250aERyb3Bkb3duKDAhPT1yKSxzLnJlbmRlck1vbnRoWWVhckRyb3Bkb3duKDAhPT1yKSxzLnJlbmRlclllYXJEcm9wZG93bigwIT09cikpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19kYXktbmFtZXNcIn0scy5oZWFkZXIodCkpKX0scy5yZW5kZXJDdXN0b21IZWFkZXI9ZnVuY3Rpb24oZSl7dmFyIHQscixuPWUubW9udGhEYXRlLGE9ZS5pO2lmKHMucHJvcHMuc2hvd1RpbWVTZWxlY3QmJiFzLnN0YXRlLm1vbnRoQ29udGFpbmVyfHxzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSlyZXR1cm4gbnVsbDt2YXIgbz1vdChzLnN0YXRlLmRhdGUscy5wcm9wcyksaT1zdChzLnN0YXRlLmRhdGUscy5wcm9wcyksbD1pdChzLnN0YXRlLmRhdGUscy5wcm9wcyksYz1sdChzLnN0YXRlLmRhdGUscy5wcm9wcykscD0hcy5wcm9wcy5zaG93TW9udGhZZWFyUGlja2VyJiYhcy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXImJiFzLnByb3BzLnNob3dZZWFyUGlja2VyO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9faGVhZGVyIHJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlci0tY3VzdG9tXCIsb25Gb2N1czpzLnByb3BzLm9uRHJvcGRvd25Gb2N1c30sbnVsbD09PShyPSh0PXMucHJvcHMpLnJlbmRlckN1c3RvbUhlYWRlcil8fHZvaWQgMD09PXI/dm9pZCAwOnIuY2FsbCh0LGdlKGdlKHt9LHMuc3RhdGUpLHtjdXN0b21IZWFkZXJDb3VudDphLG1vbnRoRGF0ZTpuLGNoYW5nZU1vbnRoOnMuY2hhbmdlTW9udGgsY2hhbmdlWWVhcjpzLmNoYW5nZVllYXIsZGVjcmVhc2VNb250aDpzLmRlY3JlYXNlTW9udGgsaW5jcmVhc2VNb250aDpzLmluY3JlYXNlTW9udGgsZGVjcmVhc2VZZWFyOnMuZGVjcmVhc2VZZWFyLGluY3JlYXNlWWVhcjpzLmluY3JlYXNlWWVhcixwcmV2TW9udGhCdXR0b25EaXNhYmxlZDpvLG5leHRNb250aEJ1dHRvbkRpc2FibGVkOmkscHJldlllYXJCdXR0b25EaXNhYmxlZDpsLG5leHRZZWFyQnV0dG9uRGlzYWJsZWQ6Y30pKSxwJiZ1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fZGF5LW5hbWVzXCJ9LHMuaGVhZGVyKG4pKSl9LHMucmVuZGVyWWVhckhlYWRlcj1mdW5jdGlvbihlKXt2YXIgdD1lLm1vbnRoRGF0ZSxyPXMucHJvcHMsYT1yLnNob3dZZWFyUGlja2VyLG89ci55ZWFySXRlbU51bWJlcixpPW10KHQsdm9pZCAwPT09bz9uLmRlZmF1bHRQcm9wcy55ZWFySXRlbU51bWJlcjpvKSxsPWkuc3RhcnRQZXJpb2QsYz1pLmVuZFBlcmlvZDtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2hlYWRlciByZWFjdC1kYXRlcGlja2VyLXllYXItaGVhZGVyXCJ9LGE/XCJcIi5jb25jYXQobCxcIiAtIFwiKS5jb25jYXQoYyk6eC5nZXRZZWFyKHQpKX0scy5yZW5kZXJIZWFkZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tb250aERhdGUscj1lLmksbj17bW9udGhEYXRlOnQsaTp2b2lkIDA9PT1yPzA6cn07c3dpdGNoKCEwKXtjYXNlIHZvaWQgMCE9PXMucHJvcHMucmVuZGVyQ3VzdG9tSGVhZGVyOnJldHVybiBzLnJlbmRlckN1c3RvbUhlYWRlcihuKTtjYXNlIHMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1llYXJQaWNrZXI6cmV0dXJuIHMucmVuZGVyWWVhckhlYWRlcihuKTtkZWZhdWx0OnJldHVybiBzLnJlbmRlckRlZmF1bHRIZWFkZXIobil9fSxzLnJlbmRlck1vbnRocz1mdW5jdGlvbigpe3ZhciBlLHQ7aWYoIXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5JiYhcy5wcm9wcy5zaG93WWVhclBpY2tlcil7Zm9yKHZhciByPVtdLGE9bnVsbCE9PShlPXMucHJvcHMubW9udGhzU2hvd24pJiZ2b2lkIDAhPT1lP2U6bi5kZWZhdWx0UHJvcHMubW9udGhzU2hvd24sbz1zLnByb3BzLnNob3dQcmV2aW91c01vbnRocz9hLTE6MCxsPXMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXI/ZC5hZGRZZWFycyhzLnN0YXRlLmRhdGUsbyk6YWUuc3ViTW9udGhzKHMuc3RhdGUuZGF0ZSxvKSxjPW51bGwhPT0odD1zLnByb3BzLm1vbnRoU2VsZWN0ZWRJbikmJnZvaWQgMCE9PXQ/dDpvLHA9MDtwPGE7KytwKXt2YXIgdT1wLWMrbyxmPXMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcnx8cy5wcm9wcy5zaG93UXVhcnRlclllYXJQaWNrZXI/ZC5hZGRZZWFycyhsLHUpOmkuYWRkTW9udGhzKGwsdSksaD1cIm1vbnRoLVwiLmNvbmNhdChwKSxtPXA8YS0xLHY9cD4wO3IucHVzaCh1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7a2V5OmgscmVmOmZ1bmN0aW9uKGUpe3MubW9udGhDb250YWluZXI9bnVsbCE9ZT9lOnZvaWQgMH0sY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fbW9udGgtY29udGFpbmVyXCJ9LHMucmVuZGVySGVhZGVyKHttb250aERhdGU6ZixpOnB9KSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoeHQsZ2Uoe30sbi5kZWZhdWx0UHJvcHMscy5wcm9wcyx7YXJpYUxhYmVsUHJlZml4OnMucHJvcHMubW9udGhBcmlhTGFiZWxQcmVmaXgsZGF5OmYsb25EYXlDbGljazpzLmhhbmRsZURheUNsaWNrLGhhbmRsZU9uS2V5RG93bjpzLnByb3BzLmhhbmRsZU9uRGF5S2V5RG93bixoYW5kbGVPbk1vbnRoS2V5RG93bjpzLnByb3BzLmhhbmRsZU9uS2V5RG93bixvbkRheU1vdXNlRW50ZXI6cy5oYW5kbGVEYXlNb3VzZUVudGVyLG9uTW91c2VMZWF2ZTpzLmhhbmRsZU1vbnRoTW91c2VMZWF2ZSxvcmRlckluRGlzcGxheTpwLHNlbGVjdGluZ0RhdGU6cy5zdGF0ZS5zZWxlY3RpbmdEYXRlLG1vbnRoU2hvd3NEdXBsaWNhdGVEYXlzRW5kOm0sbW9udGhTaG93c0R1cGxpY2F0ZURheXNTdGFydDp2fSkpKSl9cmV0dXJuIHJ9fSxzLnJlbmRlclllYXJzPWZ1bmN0aW9uKCl7aWYoIXMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5KXJldHVybiBzLnByb3BzLnNob3dZZWFyUGlja2VyP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX195ZWFyLS1jb250YWluZXJcIn0scy5yZW5kZXJIZWFkZXIoe21vbnRoRGF0ZTpzLnN0YXRlLmRhdGV9KSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSHQsZ2Uoe30sbi5kZWZhdWx0UHJvcHMscy5wcm9wcyx7c2VsZWN0aW5nRGF0ZTpzLnN0YXRlLnNlbGVjdGluZ0RhdGUsZGF0ZTpzLnN0YXRlLmRhdGUsb25EYXlDbGljazpzLmhhbmRsZURheUNsaWNrLGNsZWFyU2VsZWN0aW5nRGF0ZTpzLmNsZWFyU2VsZWN0aW5nRGF0ZSxvblllYXJNb3VzZUVudGVyOnMuaGFuZGxlWWVhck1vdXNlRW50ZXIsb25ZZWFyTW91c2VMZWF2ZTpzLmhhbmRsZVllYXJNb3VzZUxlYXZlfSkpKTp2b2lkIDB9LHMucmVuZGVyVGltZVNlY3Rpb249ZnVuY3Rpb24oKXtpZihzLnByb3BzLnNob3dUaW1lU2VsZWN0JiYocy5zdGF0ZS5tb250aENvbnRhaW5lcnx8cy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHkpKXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoRnQsZ2Uoe30sbi5kZWZhdWx0UHJvcHMscy5wcm9wcyx7b25DaGFuZ2U6cy5wcm9wcy5vblRpbWVDaGFuZ2UsZm9ybWF0OnMucHJvcHMudGltZUZvcm1hdCxpbnRlcnZhbHM6cy5wcm9wcy50aW1lSW50ZXJ2YWxzLG1vbnRoUmVmOnMuc3RhdGUubW9udGhDb250YWluZXJ9KSl9LHMucmVuZGVySW5wdXRUaW1lU2VjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXMucHJvcHMuc2VsZWN0ZWQ/bmV3IERhdGUocy5wcm9wcy5zZWxlY3RlZCk6dm9pZCAwLHQ9ZSYmQ2UoZSkmJkJvb2xlYW4ocy5wcm9wcy5zZWxlY3RlZCk/XCJcIi5jb25jYXQoaHQoZS5nZXRIb3VycygpKSxcIjpcIikuY29uY2F0KGh0KGUuZ2V0TWludXRlcygpKSk6XCJcIjtpZihzLnByb3BzLnNob3dUaW1lSW5wdXQpcmV0dXJuIHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh3dCxnZSh7fSxuLmRlZmF1bHRQcm9wcyxzLnByb3BzLHtkYXRlOmUsdGltZVN0cmluZzp0LG9uQ2hhbmdlOnMucHJvcHMub25UaW1lQ2hhbmdlfSkpfSxzLnJlbmRlckFyaWFMaXZlUmVnaW9uPWZ1bmN0aW9uKCl7dmFyIGUsdCxyPW10KHMuc3RhdGUuZGF0ZSxudWxsIT09KGU9cy5wcm9wcy55ZWFySXRlbU51bWJlcikmJnZvaWQgMCE9PWU/ZTpuLmRlZmF1bHRQcm9wcy55ZWFySXRlbU51bWJlciksYT1yLnN0YXJ0UGVyaW9kLG89ci5lbmRQZXJpb2Q7cmV0dXJuIHQ9cy5wcm9wcy5zaG93WWVhclBpY2tlcj9cIlwiLmNvbmNhdChhLFwiIC0gXCIpLmNvbmNhdChvKTpzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd1F1YXJ0ZXJZZWFyUGlja2VyP3guZ2V0WWVhcihzLnN0YXRlLmRhdGUpOlwiXCIuY29uY2F0KEJlKF8uZ2V0TW9udGgocy5zdGF0ZS5kYXRlKSxzLnByb3BzLmxvY2FsZSksXCIgXCIpLmNvbmNhdCh4LmdldFllYXIocy5zdGF0ZS5kYXRlKSksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLHtyb2xlOlwiYWxlcnRcIixcImFyaWEtbGl2ZVwiOlwicG9saXRlXCIsY2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fYXJpYS1saXZlXCJ9LHMuc3RhdGUuaXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2UmJnQpfSxzLnJlbmRlckNoaWxkcmVuPWZ1bmN0aW9uKCl7aWYocy5wcm9wcy5jaGlsZHJlbilyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2NoaWxkcmVuLWNvbnRhaW5lclwifSxzLnByb3BzLmNoaWxkcmVuKX0scy5jb250YWluZXJSZWY9ci5jcmVhdGVSZWYoKSxzLnN0YXRlPXtkYXRlOnMuZ2V0RGF0ZUluVmlldygpLHNlbGVjdGluZ0RhdGU6dm9pZCAwLG1vbnRoQ29udGFpbmVyOnZvaWQgMCxpc1JlbmRlckFyaWFMaXZlTWVzc2FnZTohMX0sc31yZXR1cm4gdmUobixlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobixcImRlZmF1bHRQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57bW9udGhzU2hvd246MSxmb3JjZVNob3dNb250aE5hdmlnYXRpb246ITEsdGltZUNhcHRpb246XCJUaW1lXCIscHJldmlvdXNZZWFyQnV0dG9uTGFiZWw6XCJQcmV2aW91cyBZZWFyXCIsbmV4dFllYXJCdXR0b25MYWJlbDpcIk5leHQgWWVhclwiLHByZXZpb3VzTW9udGhCdXR0b25MYWJlbDpcIlByZXZpb3VzIE1vbnRoXCIsbmV4dE1vbnRoQnV0dG9uTGFiZWw6XCJOZXh0IE1vbnRoXCIseWVhckl0ZW1OdW1iZXI6U2V9fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLG4ucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnByb3BzLnNob3dUaW1lU2VsZWN0JiYodGhpcy5hc3NpZ25Nb250aENvbnRhaW5lcj12b2lkIGUuc2V0U3RhdGUoe21vbnRoQ29udGFpbmVyOmUubW9udGhDb250YWluZXJ9KSl9LG4ucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKCF0aGlzLnByb3BzLnByZVNlbGVjdGlvbnx8SGUodGhpcy5wcm9wcy5wcmVTZWxlY3Rpb24sZS5wcmVTZWxlY3Rpb24pJiZ0aGlzLnByb3BzLm1vbnRoU2VsZWN0ZWRJbj09PWUubW9udGhTZWxlY3RlZEluKXRoaXMucHJvcHMub3BlblRvRGF0ZSYmIUhlKHRoaXMucHJvcHMub3BlblRvRGF0ZSxlLm9wZW5Ub0RhdGUpJiZ0aGlzLnNldFN0YXRlKHtkYXRlOnRoaXMucHJvcHMub3BlblRvRGF0ZX0pO2Vsc2V7dmFyIHI9IUFlKHRoaXMuc3RhdGUuZGF0ZSx0aGlzLnByb3BzLnByZVNlbGVjdGlvbik7dGhpcy5zZXRTdGF0ZSh7ZGF0ZTp0aGlzLnByb3BzLnByZVNlbGVjdGlvbn0sKGZ1bmN0aW9uKCl7cmV0dXJuIHImJnQuaGFuZGxlQ3VzdG9tTW9udGhDaGFuZ2UodC5zdGF0ZS5kYXRlKX0pKX19LG4ucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMuY29udGFpbmVyfHxrZTtyZXR1cm4gdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse3N0eWxlOntkaXNwbGF5OlwiY29udGVudHNcIn0scmVmOnRoaXMuY29udGFpbmVyUmVmfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoZSx7Y2xhc3NOYW1lOnQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJcIix0aGlzLnByb3BzLmNsYXNzTmFtZSx7XCJyZWFjdC1kYXRlcGlja2VyLS10aW1lLW9ubHlcIjp0aGlzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seX0pLHNob3dUaW1lOnRoaXMucHJvcHMuc2hvd1RpbWVTZWxlY3R8fHRoaXMucHJvcHMuc2hvd1RpbWVJbnB1dCxzaG93VGltZVNlbGVjdE9ubHk6dGhpcy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHl9LHRoaXMucmVuZGVyQXJpYUxpdmVSZWdpb24oKSx0aGlzLnJlbmRlclByZXZpb3VzQnV0dG9uKCksdGhpcy5yZW5kZXJOZXh0QnV0dG9uKCksdGhpcy5yZW5kZXJNb250aHMoKSx0aGlzLnJlbmRlclllYXJzKCksdGhpcy5yZW5kZXJUb2RheUJ1dHRvbigpLHRoaXMucmVuZGVyVGltZVNlY3Rpb24oKSx0aGlzLnJlbmRlcklucHV0VGltZVNlY3Rpb24oKSx0aGlzLnJlbmRlckNoaWxkcmVuKCkpKX0sbn0oci5Db21wb25lbnQpLGp0PWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWNvbixyPWUuY2xhc3NOYW1lLG49dm9pZCAwPT09cj9cIlwiOnIsYT1lLm9uQ2xpY2ssbz1cInJlYWN0LWRhdGVwaWNrZXJfX2NhbGVuZGFyLWljb25cIjtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdD91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJpXCIse2NsYXNzTmFtZTpcIlwiLmNvbmNhdChvLFwiIFwiKS5jb25jYXQodCxcIiBcIikuY29uY2F0KG4pLFwiYXJpYS1oaWRkZW5cIjpcInRydWVcIixvbkNsaWNrOmF9KTp1ZS5kZWZhdWx0LmlzVmFsaWRFbGVtZW50KHQpP3VlLmRlZmF1bHQuY2xvbmVFbGVtZW50KHQse2NsYXNzTmFtZTpcIlwiLmNvbmNhdCh0LnByb3BzLmNsYXNzTmFtZXx8XCJcIixcIiBcIikuY29uY2F0KG8sXCIgXCIpLmNvbmNhdChuKSxvbkNsaWNrOmZ1bmN0aW9uKGUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIHQucHJvcHMub25DbGljayYmdC5wcm9wcy5vbkNsaWNrKGUpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGEmJmEoZSl9fSk6dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIse2NsYXNzTmFtZTpcIlwiLmNvbmNhdChvLFwiIFwiKS5jb25jYXQobikseG1sbnM6XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLHZpZXdCb3g6XCIwIDAgNDQ4IDUxMlwiLG9uQ2xpY2s6YX0sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLHtkOlwiTTk2IDMyVjY0SDQ4QzIxLjUgNjQgMCA4NS41IDAgMTEydjQ4SDQ0OFYxMTJjMC0yNi41LTIxLjUtNDgtNDgtNDhIMzUyVjMyYzAtMTcuNy0xNC4zLTMyLTMyLTMycy0zMiAxNC4zLTMyIDMyVjY0SDE2MFYzMmMwLTE3LjctMTQuMy0zMi0zMi0zMlM5NiAxNC4zIDk2IDMyek00NDggMTkySDBWNDY0YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4SDQwMGMyNi41IDAgNDgtMjEuNSA0OC00OFYxOTJ6XCJ9KSl9LFV0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIHI9ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIHIucG9ydGFsUm9vdD1udWxsLHIuZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxyfXJldHVybiB2ZSh0LGUpLHQucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50PWZ1bmN0aW9uKCl7dGhpcy5wb3J0YWxSb290PSh0aGlzLnByb3BzLnBvcnRhbEhvc3R8fGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZCh0aGlzLnByb3BzLnBvcnRhbElkKSx0aGlzLnBvcnRhbFJvb3R8fCh0aGlzLnBvcnRhbFJvb3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLnBvcnRhbFJvb3Quc2V0QXR0cmlidXRlKFwiaWRcIix0aGlzLnByb3BzLnBvcnRhbElkKSwodGhpcy5wcm9wcy5wb3J0YWxIb3N0fHxkb2N1bWVudC5ib2R5KS5hcHBlbmRDaGlsZCh0aGlzLnBvcnRhbFJvb3QpKSx0aGlzLnBvcnRhbFJvb3QuYXBwZW5kQ2hpbGQodGhpcy5lbCl9LHQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy5wb3J0YWxSb290JiZ0aGlzLnBvcnRhbFJvb3QucmVtb3ZlQ2hpbGQodGhpcy5lbCl9LHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiBoZS5kZWZhdWx0LmNyZWF0ZVBvcnRhbCh0aGlzLnByb3BzLmNoaWxkcmVuLHRoaXMuZWwpfSx0fShyLkNvbXBvbmVudCksJHQ9ZnVuY3Rpb24oZSl7cmV0dXJuKGUgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudHx8IWUuZGlzYWJsZWQpJiYtMSE9PWUudGFiSW5kZXh9LHp0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIG4uZ2V0VGFiQ2hpbGRyZW49ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobnVsbD09PShlPW4udGFiTG9vcFJlZi5jdXJyZW50KXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5xdWVyeVNlbGVjdG9yQWxsKFwiW3RhYmluZGV4XSwgYSwgYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYVwiKSwxLC0xKS5maWx0ZXIoJHQpfSxuLmhhbmRsZUZvY3VzU3RhcnQ9ZnVuY3Rpb24oKXt2YXIgZT1uLmdldFRhYkNoaWxkcmVuKCk7ZSYmZS5sZW5ndGg+MSYmZVtlLmxlbmd0aC0xXS5mb2N1cygpfSxuLmhhbmRsZUZvY3VzRW5kPWZ1bmN0aW9uKCl7dmFyIGU9bi5nZXRUYWJDaGlsZHJlbigpO2UmJmUubGVuZ3RoPjEmJmVbMF0uZm9jdXMoKX0sbi50YWJMb29wUmVmPXIuY3JlYXRlUmVmKCksbn1yZXR1cm4gdmUodCxlKSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4obnVsbCE9PShlPXRoaXMucHJvcHMuZW5hYmxlVGFiTG9vcCkmJnZvaWQgMCE9PWU/ZTp0LmRlZmF1bHRQcm9wcy5lbmFibGVUYWJMb29wKT91ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGFiLWxvb3BcIixyZWY6dGhpcy50YWJMb29wUmVmfSx1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIix7Y2xhc3NOYW1lOlwicmVhY3QtZGF0ZXBpY2tlcl9fdGFiLWxvb3BfX3N0YXJ0XCIsdGFiSW5kZXg6MCxvbkZvY3VzOnRoaXMuaGFuZGxlRm9jdXNTdGFydH0pLHRoaXMucHJvcHMuY2hpbGRyZW4sdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX3RhYi1sb29wX19lbmRcIix0YWJJbmRleDowLG9uRm9jdXM6dGhpcy5oYW5kbGVGb2N1c0VuZH0pKTp0aGlzLnByb3BzLmNoaWxkcmVufSx0LmRlZmF1bHRQcm9wcz17ZW5hYmxlVGFiTG9vcDohMH0sdH0oci5Db21wb25lbnQpO3ZhciBYdCxHdD1mdW5jdGlvbihlKXtmdW5jdGlvbiBuKCl7cmV0dXJuIG51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gdmUobixlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobixcImRlZmF1bHRQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57aGlkZVBvcHBlcjohMH19LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksbi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyxhPWUuY2xhc3NOYW1lLG89ZS53cmFwcGVyQ2xhc3NOYW1lLHM9ZS5oaWRlUG9wcGVyLGk9dm9pZCAwPT09cz9uLmRlZmF1bHRQcm9wcy5oaWRlUG9wcGVyOnMsbD1lLnBvcHBlckNvbXBvbmVudCxjPWUudGFyZ2V0Q29tcG9uZW50LHA9ZS5lbmFibGVUYWJMb29wLGQ9ZS5wb3BwZXJPbktleURvd24sdT1lLnBvcnRhbElkLGY9ZS5wb3J0YWxIb3N0LGg9ZS5wb3BwZXJQcm9wcyxtPWUuc2hvd0Fycm93LHY9dm9pZCAwO2lmKCFpKXt2YXIgZz10LmNsc3goXCJyZWFjdC1kYXRlcGlja2VyLXBvcHBlclwiLGEpO3Y9dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KHp0LHtlbmFibGVUYWJMb29wOnB9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtyZWY6aC5yZWZzLnNldEZsb2F0aW5nLHN0eWxlOmguZmxvYXRpbmdTdHlsZXMsY2xhc3NOYW1lOmcsXCJkYXRhLXBsYWNlbWVudFwiOmgucGxhY2VtZW50LG9uS2V5RG93bjpkfSxsLG0mJnVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChjZS5GbG9hdGluZ0Fycm93LHtyZWY6aC5hcnJvd1JlZixjb250ZXh0OmguY29udGV4dCxmaWxsOlwiY3VycmVudENvbG9yXCIsc3Ryb2tlV2lkdGg6MSxoZWlnaHQ6OCx3aWR0aDoxNixzdHlsZTp7dHJhbnNmb3JtOlwidHJhbnNsYXRlWSgtMXB4KVwifSxjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX190cmlhbmdsZVwifSkpKX10aGlzLnByb3BzLnBvcHBlckNvbnRhaW5lciYmKHY9ci5jcmVhdGVFbGVtZW50KHRoaXMucHJvcHMucG9wcGVyQ29udGFpbmVyLHt9LHYpKSx1JiYhaSYmKHY9dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFV0LHtwb3J0YWxJZDp1LHBvcnRhbEhvc3Q6Zn0sdikpO3ZhciBEPXQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXItd3JhcHBlclwiLG8pO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQodWUuZGVmYXVsdC5GcmFnbWVudCxudWxsLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtyZWY6aC5yZWZzLnNldFJlZmVyZW5jZSxjbGFzc05hbWU6RH0sYyksdil9LG59KHIuQ29tcG9uZW50KSxKdD0oWHQ9R3QsZnVuY3Rpb24oZSl7dmFyIHQsbj1cImJvb2xlYW5cIiE9dHlwZW9mIGUuaGlkZVBvcHBlcnx8ZS5oaWRlUG9wcGVyLGE9ci51c2VSZWYobnVsbCksbz1jZS51c2VGbG9hdGluZyhnZSh7b3Blbjohbix3aGlsZUVsZW1lbnRzTW91bnRlZDpjZS5hdXRvVXBkYXRlLHBsYWNlbWVudDplLnBvcHBlclBsYWNlbWVudCxtaWRkbGV3YXJlOkRlKFtjZS5mbGlwKHtwYWRkaW5nOjE1fSksY2Uub2Zmc2V0KDEwKSxjZS5hcnJvdyh7ZWxlbWVudDphfSldLG51bGwhPT0odD1lLnBvcHBlck1vZGlmaWVycykmJnZvaWQgMCE9PXQ/dDpbXSwhMCl9LGUucG9wcGVyUHJvcHMpKSxzPWdlKGdlKHt9LGUpLHtoaWRlUG9wcGVyOm4scG9wcGVyUHJvcHM6Z2UoZ2Uoe30sbykse2Fycm93UmVmOmF9KX0pO3JldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoWHQsZ2Uoe30scykpfSksWnQ9XCJyZWFjdC1kYXRlcGlja2VyLWlnbm9yZS1vbmNsaWNrb3V0c2lkZVwiLGVyPWZlLmRlZmF1bHQoVnQpO3ZhciB0cj1cIkRhdGUgaW5wdXQgbm90IHZhbGlkLlwiLHJyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4obyl7dmFyIHM9ZS5jYWxsKHRoaXMsbyl8fHRoaXM7cmV0dXJuIHMuY2FsZW5kYXI9bnVsbCxzLmlucHV0PW51bGwscy5nZXRQcmVTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gcy5wcm9wcy5vcGVuVG9EYXRlP3MucHJvcHMub3BlblRvRGF0ZTpzLnByb3BzLnNlbGVjdHNFbmQmJnMucHJvcHMuc3RhcnREYXRlP3MucHJvcHMuc3RhcnREYXRlOnMucHJvcHMuc2VsZWN0c1N0YXJ0JiZzLnByb3BzLmVuZERhdGU/cy5wcm9wcy5lbmREYXRlOk1lKCl9LHMubW9kaWZ5SG9saWRheXM9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gbnVsbD09PShlPXMucHJvcHMuaG9saWRheXMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXt2YXIgcj1uZXcgRGF0ZSh0LmRhdGUpO3JldHVybiBDZShyKT9EZShEZShbXSxlLCEwKSxbZ2UoZ2Uoe30sdCkse2RhdGU6cn0pXSwhMSk6ZX0pLFtdKX0scy5jYWxjSW5pdGlhbFN0YXRlPWZ1bmN0aW9uKCl7dmFyIGUsdD1zLmdldFByZVNlbGVjdGlvbigpLHI9Y3Qocy5wcm9wcyksbj1wdChzLnByb3BzKSxhPXImJk8uaXNCZWZvcmUodCxZZShyKSk/cjpuJiZOLmlzQWZ0ZXIodCxSZShuKSk/bjp0O3JldHVybntvcGVuOnMucHJvcHMuc3RhcnRPcGVufHwhMSxwcmV2ZW50Rm9jdXM6ITEsaW5wdXRWYWx1ZTpudWxsLHByZVNlbGVjdGlvbjpudWxsIT09KGU9cy5wcm9wcy5zZWxlY3RzUmFuZ2U/cy5wcm9wcy5zdGFydERhdGU6cy5wcm9wcy5zZWxlY3RlZCkmJnZvaWQgMCE9PWU/ZTphLGhpZ2hsaWdodERhdGVzOmR0KHMucHJvcHMuaGlnaGxpZ2h0RGF0ZXMpLGZvY3VzZWQ6ITEsc2hvdWxkRm9jdXNEYXlJbmxpbmU6ITEsaXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITEsd2FzSGlkZGVuOiExfX0scy5yZXNldEhpZGRlblN0YXR1cz1mdW5jdGlvbigpe3Muc2V0U3RhdGUoZ2UoZ2Uoe30scy5zdGF0ZSkse3dhc0hpZGRlbjohMX0pKX0scy5zZXRIaWRkZW5TdGF0dXM9ZnVuY3Rpb24oKXtzLnNldFN0YXRlKGdlKGdlKHt9LHMuc3RhdGUpLHt3YXNIaWRkZW46ITB9KSl9LHMuc2V0SGlkZGVuU3RhdGVPblZpc2liaWxpdHlIaWRkZW49ZnVuY3Rpb24oKXtcImhpZGRlblwiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlJiZzLnNldEhpZGRlblN0YXR1cygpfSxzLmNsZWFyUHJldmVudEZvY3VzVGltZW91dD1mdW5jdGlvbigpe3MucHJldmVudEZvY3VzVGltZW91dCYmY2xlYXJUaW1lb3V0KHMucHJldmVudEZvY3VzVGltZW91dCl9LHMuc2V0Rm9jdXM9ZnVuY3Rpb24oKXtzLmlucHV0JiZzLmlucHV0LmZvY3VzJiZzLmlucHV0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9LHMuc2V0Qmx1cj1mdW5jdGlvbigpe3MuaW5wdXQmJnMuaW5wdXQuYmx1ciYmcy5pbnB1dC5ibHVyKCkscy5jYW5jZWxGb2N1c0lucHV0KCl9LHMuc2V0T3Blbj1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PXQmJih0PSExKSxzLnNldFN0YXRlKHtvcGVuOmUscHJlU2VsZWN0aW9uOmUmJnMuc3RhdGUub3Blbj9zLnN0YXRlLnByZVNlbGVjdGlvbjpzLmNhbGNJbml0aWFsU3RhdGUoKS5wcmVTZWxlY3Rpb24sbGFzdFByZVNlbGVjdENoYW5nZTphcn0sKGZ1bmN0aW9uKCl7ZXx8cy5zZXRTdGF0ZSgoZnVuY3Rpb24oZSl7cmV0dXJue2ZvY3VzZWQ6ISF0JiZlLmZvY3VzZWR9fSksKGZ1bmN0aW9uKCl7IXQmJnMuc2V0Qmx1cigpLHMuc2V0U3RhdGUoe2lucHV0VmFsdWU6bnVsbH0pfSkpfSkpfSxzLmlucHV0T2s9ZnVuY3Rpb24oKXtyZXR1cm4gSS5pc0RhdGUocy5zdGF0ZS5wcmVTZWxlY3Rpb24pfSxzLmlzQ2FsZW5kYXJPcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXMucHJvcHMub3Blbj9zLnN0YXRlLm9wZW4mJiFzLnByb3BzLmRpc2FibGVkJiYhcy5wcm9wcy5yZWFkT25seTpzLnByb3BzLm9wZW59LHMuaGFuZGxlRm9jdXM9ZnVuY3Rpb24oZSl7dmFyIHQscixuPXMuc3RhdGUud2FzSGlkZGVuLGE9IW58fHMuc3RhdGUub3BlbjtuJiZzLnJlc2V0SGlkZGVuU3RhdHVzKCksIXMuc3RhdGUucHJldmVudEZvY3VzJiZhJiYobnVsbD09PShyPSh0PXMucHJvcHMpLm9uRm9jdXMpfHx2b2lkIDA9PT1yfHxyLmNhbGwodCxlKSxzLnByb3BzLnByZXZlbnRPcGVuT25Gb2N1c3x8cy5wcm9wcy5yZWFkT25seXx8cy5zZXRPcGVuKCEwKSkscy5zZXRTdGF0ZSh7Zm9jdXNlZDohMH0pfSxzLnNlbmRGb2N1c0JhY2tUb0lucHV0PWZ1bmN0aW9uKCl7cy5wcmV2ZW50Rm9jdXNUaW1lb3V0JiZzLmNsZWFyUHJldmVudEZvY3VzVGltZW91dCgpLHMuc2V0U3RhdGUoe3ByZXZlbnRGb2N1czohMH0sKGZ1bmN0aW9uKCl7cy5wcmV2ZW50Rm9jdXNUaW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cy5zZXRGb2N1cygpLHMuc2V0U3RhdGUoe3ByZXZlbnRGb2N1czohMX0pfSkpfSkpfSxzLmNhbmNlbEZvY3VzSW5wdXQ9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQocy5pbnB1dEZvY3VzVGltZW91dCkscy5pbnB1dEZvY3VzVGltZW91dD12b2lkIDB9LHMuZGVmZXJGb2N1c0lucHV0PWZ1bmN0aW9uKCl7cy5jYW5jZWxGb2N1c0lucHV0KCkscy5pbnB1dEZvY3VzVGltZW91dD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBzLnNldEZvY3VzKCl9KSwxKX0scy5oYW5kbGVEcm9wZG93bkZvY3VzPWZ1bmN0aW9uKCl7cy5jYW5jZWxGb2N1c0lucHV0KCl9LHMuaGFuZGxlQmx1cj1mdW5jdGlvbihlKXt2YXIgdCxyOyghcy5zdGF0ZS5vcGVufHxzLnByb3BzLndpdGhQb3J0YWx8fHMucHJvcHMuc2hvd1RpbWVJbnB1dCkmJihudWxsPT09KHI9KHQ9cy5wcm9wcykub25CbHVyKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSkpLHMuc2V0U3RhdGUoe2ZvY3VzZWQ6ITF9KX0scy5oYW5kbGVDYWxlbmRhckNsaWNrT3V0c2lkZT1mdW5jdGlvbihlKXt2YXIgdCxyO3MucHJvcHMuaW5saW5lfHxzLnNldE9wZW4oITEpLG51bGw9PT0ocj0odD1zLnByb3BzKS5vbkNsaWNrT3V0c2lkZSl8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpLHMucHJvcHMud2l0aFBvcnRhbCYmZS5wcmV2ZW50RGVmYXVsdCgpfSxzLmhhbmRsZUNoYW5nZT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgcj1lWzBdO2lmKCFzLnByb3BzLm9uQ2hhbmdlUmF3fHwocy5wcm9wcy5vbkNoYW5nZVJhdy5hcHBseShzLGUpLHImJlwiZnVuY3Rpb25cIj09dHlwZW9mIHIuaXNEZWZhdWx0UHJldmVudGVkJiYhci5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkpe3Muc2V0U3RhdGUoe2lucHV0VmFsdWU6KG51bGw9PXI/dm9pZCAwOnIudGFyZ2V0KWluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudD9yLnRhcmdldC52YWx1ZTpudWxsLGxhc3RQcmVTZWxlY3RDaGFuZ2U6bnJ9KTt2YXIgYT1zLnByb3BzLG89YS5kYXRlRm9ybWF0LGk9dm9pZCAwPT09bz9uLmRlZmF1bHRQcm9wcy5kYXRlRm9ybWF0Om8sbD1hLnN0cmljdFBhcnNpbmcsYz12b2lkIDA9PT1sP24uZGVmYXVsdFByb3BzLnN0cmljdFBhcnNpbmc6bCxwPWZ1bmN0aW9uKGUsdCxyLG4sYSl7dmFyIG8scz1udWxsLGk9S2Uocil8fEtlKHFlKCkpLGw9ITA7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbz1LLnBhcnNlKGUsdCxuZXcgRGF0ZSx7bG9jYWxlOmksdXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zOiEwLHVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnM6ITB9KTtuJiYobD1DZShvLGEpJiZlPT09X2Uobyx0LHIpKSxDZShvLGEpJiZsJiYocz1vKX0pKSxzO2lmKHM9Sy5wYXJzZShlLHQsbmV3IERhdGUse2xvY2FsZTppLHVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VuczohMCx1c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zOiEwfSksbilsPUNlKHMpJiZlPT09X2Uocyx0LHIpO2Vsc2UgaWYoIUNlKHMpKXt2YXIgYz0obnVsbCE9PShvPXQubWF0Y2goYmUpKSYmdm9pZCAwIT09bz9vOltdKS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF07aWYoXCJwXCI9PT10fHxcIlBcIj09PXQpe3ZhciByPWsubG9uZ0Zvcm1hdHRlcnNbdF07cmV0dXJuIGk/cihlLGkuZm9ybWF0TG9uZyk6dH1yZXR1cm4gZX0pKS5qb2luKFwiXCIpO2UubGVuZ3RoPjAmJihzPUsucGFyc2UoZSxjLnNsaWNlKDAsZS5sZW5ndGgpLG5ldyBEYXRlLHt1c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnM6ITAsdXNlQWRkaXRpb25hbERheU9mWWVhclRva2VuczohMH0pKSxDZShzKXx8KHM9bmV3IERhdGUoZSkpfXJldHVybiBDZShzKSYmbD9zOm51bGx9KChudWxsPT1yP3ZvaWQgMDpyLnRhcmdldClpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQ/ci50YXJnZXQudmFsdWU6XCJcIixpLHMucHJvcHMubG9jYWxlLGMscy5wcm9wcy5taW5EYXRlKTtzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seSYmcy5wcm9wcy5zZWxlY3RlZCYmcCYmIUhlKHAscy5wcm9wcy5zZWxlY3RlZCkmJihwPVYuc2V0KHMucHJvcHMuc2VsZWN0ZWQse2hvdXJzOmIuZ2V0SG91cnMocCksbWludXRlczpDLmdldE1pbnV0ZXMocCksc2Vjb25kczpQLmdldFNlY29uZHMocCl9KSksIXAmJihudWxsPT1yP3ZvaWQgMDpyLnRhcmdldClpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJihudWxsPT1yP3ZvaWQgMDpyLnRhcmdldC52YWx1ZSl8fHMuc2V0U2VsZWN0ZWQocCxyLCEwKX19LHMuaGFuZGxlU2VsZWN0PWZ1bmN0aW9uKGUsdCxyKXtpZihzLnByb3BzLnNob3VsZENsb3NlT25TZWxlY3QmJiFzLnByb3BzLnNob3dUaW1lU2VsZWN0JiZzLnNlbmRGb2N1c0JhY2tUb0lucHV0KCkscy5wcm9wcy5vbkNoYW5nZVJhdyYmcy5wcm9wcy5vbkNoYW5nZVJhdyh0KSxzLnNldFNlbGVjdGVkKGUsdCwhMSxyKSxzLnByb3BzLnNob3dEYXRlU2VsZWN0JiZzLnNldFN0YXRlKHtpc1JlbmRlckFyaWFMaXZlTWVzc2FnZTohMH0pLCFzLnByb3BzLnNob3VsZENsb3NlT25TZWxlY3R8fHMucHJvcHMuc2hvd1RpbWVTZWxlY3Qpcy5zZXRQcmVTZWxlY3Rpb24oZSk7ZWxzZSBpZighcy5wcm9wcy5pbmxpbmUpe3MucHJvcHMuc2VsZWN0c1JhbmdlfHxzLnNldE9wZW4oITEpO3ZhciBuPXMucHJvcHMsYT1uLnN0YXJ0RGF0ZSxvPW4uZW5kRGF0ZTshYXx8b3x8IXMucHJvcHMuc3dhcFJhbmdlJiZEdChlLGEpfHxzLnNldE9wZW4oITEpfX0scy5zZXRTZWxlY3RlZD1mdW5jdGlvbihlLHQscixhKXt2YXIgbyxpPWU7aWYocy5wcm9wcy5zaG93WWVhclBpY2tlcil7aWYobnVsbCE9PWkmJlplKHguZ2V0WWVhcihpKSxzLnByb3BzKSlyZXR1cm59ZWxzZSBpZihzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXIpe2lmKG51bGwhPT1pJiYkZShpLHMucHJvcHMpKXJldHVybn1lbHNlIGlmKG51bGwhPT1pJiZqZShpLHMucHJvcHMpKXJldHVybjt2YXIgbD1zLnByb3BzLGM9bC5vbkNoYW5nZSxwPWwuc2VsZWN0c1JhbmdlLGQ9bC5zdGFydERhdGUsdT1sLmVuZERhdGUsZj1sLnNlbGVjdHNNdWx0aXBsZSxoPWwuc2VsZWN0ZWREYXRlcyxtPWwubWluVGltZSx2PWwuc3dhcFJhbmdlO2lmKCFXZShzLnByb3BzLnNlbGVjdGVkLGkpfHxzLnByb3BzLmFsbG93U2FtZURheXx8cHx8ZilpZihudWxsIT09aSYmKCFzLnByb3BzLnNlbGVjdGVkfHxyJiYocy5wcm9wcy5zaG93VGltZVNlbGVjdHx8cy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHl8fHMucHJvcHMuc2hvd1RpbWVJbnB1dCl8fChpPVBlKGkse2hvdXI6Yi5nZXRIb3VycyhzLnByb3BzLnNlbGVjdGVkKSxtaW51dGU6Qy5nZXRNaW51dGVzKHMucHJvcHMuc2VsZWN0ZWQpLHNlY29uZDpQLmdldFNlY29uZHMocy5wcm9wcy5zZWxlY3RlZCl9KSkscnx8IXMucHJvcHMuc2hvd1RpbWVTZWxlY3QmJiFzLnByb3BzLnNob3dUaW1lU2VsZWN0T25seXx8bSYmKGk9UGUoaSx7aG91cjptLmdldEhvdXJzKCksbWludXRlOm0uZ2V0TWludXRlcygpLHNlY29uZDptLmdldFNlY29uZHMoKX0pKSxzLnByb3BzLmlubGluZXx8cy5zZXRTdGF0ZSh7cHJlU2VsZWN0aW9uOml9KSxzLnByb3BzLmZvY3VzU2VsZWN0ZWRNb250aHx8cy5zZXRTdGF0ZSh7bW9udGhTZWxlY3RlZEluOmF9KSkscCl7dmFyIGc9ZCYmIXUsRD1kJiZ1OyFkJiYhdT9jP2MoW2ksbnVsbF0sdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2U6ZyYmKG51bGw9PT1pP2M/YyhbbnVsbCxudWxsXSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZTpEdChpLGQpP3Y/Yz9jKFtpLGRdLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlOmM/YyhbaSxudWxsXSx0KTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZTpjP2MoW2QsaV0sdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2UpLEQmJihjP2MoW2ksbnVsbF0sdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2UpfWVsc2UgaWYoZil7aWYobnVsbCE9PWkpaWYobnVsbD09aD92b2lkIDA6aC5sZW5ndGgpaWYoaC5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gSGUoZSxpKX0pKSl7dmFyIHk9aC5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiFIZShlLGkpfSkpO2M/Yyh5LHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlfWVsc2UgYz9jKERlKERlKFtdLGgsITApLFtpXSwhMSksdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2U7ZWxzZSBjP2MoW2ldLHQpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlfWVsc2UgYz9jKGksdCk6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2U7cnx8KChudWxsIT09KG89cy5wcm9wcy5vblNlbGVjdCkmJnZvaWQgMCE9PW8/bzpuLmRlZmF1bHRQcm9wcy5vblNlbGVjdCkoaSx0KSxzLnNldFN0YXRlKHtpbnB1dFZhbHVlOm51bGx9KSl9LHMuc2V0UHJlU2VsZWN0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PUkuaXNEYXRlKHMucHJvcHMubWluRGF0ZSkscj1JLmlzRGF0ZShzLnByb3BzLm1heERhdGUpLG49ITA7aWYoZSl7dmFyIGE9WWUoZSk7aWYodCYmciluPVFlKGUscy5wcm9wcy5taW5EYXRlLHMucHJvcHMubWF4RGF0ZSk7ZWxzZSBpZih0KXt2YXIgbz1ZZShzLnByb3BzLm1pbkRhdGUpO249Ti5pc0FmdGVyKGUsbyl8fFdlKGEsbyl9ZWxzZSBpZihyKXt2YXIgaT1SZShzLnByb3BzLm1heERhdGUpO249Ty5pc0JlZm9yZShlLGkpfHxXZShhLGkpfX1uJiZzLnNldFN0YXRlKHtwcmVTZWxlY3Rpb246ZX0pfSxzLnRvZ2dsZUNhbGVuZGFyPWZ1bmN0aW9uKCl7cy5zZXRPcGVuKCFzLnN0YXRlLm9wZW4pfSxzLmhhbmRsZVRpbWVDaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIXMucHJvcHMuc2VsZWN0c1JhbmdlJiYhcy5wcm9wcy5zZWxlY3RzTXVsdGlwbGUpe3ZhciByPXMucHJvcHMuc2VsZWN0ZWQ/cy5wcm9wcy5zZWxlY3RlZDpzLmdldFByZVNlbGVjdGlvbigpLGE9cy5wcm9wcy5zZWxlY3RlZD9lOlBlKHIse2hvdXI6Yi5nZXRIb3VycyhlKSxtaW51dGU6Qy5nZXRNaW51dGVzKGUpfSk7cy5zZXRTdGF0ZSh7cHJlU2VsZWN0aW9uOmF9KSwobnVsbCE9PSh0PXMucHJvcHMub25DaGFuZ2UpJiZ2b2lkIDAhPT10P3Q6bi5kZWZhdWx0UHJvcHMub25DaGFuZ2UpKGEpLHMucHJvcHMuc2hvdWxkQ2xvc2VPblNlbGVjdCYmIXMucHJvcHMuc2hvd1RpbWVJbnB1dCYmKHMuc2VuZEZvY3VzQmFja1RvSW5wdXQoKSxzLnNldE9wZW4oITEpKSxzLnByb3BzLnNob3dUaW1lSW5wdXQmJnMuc2V0T3BlbighMCksKHMucHJvcHMuc2hvd1RpbWVTZWxlY3RPbmx5fHxzLnByb3BzLnNob3dUaW1lU2VsZWN0KSYmcy5zZXRTdGF0ZSh7aXNSZW5kZXJBcmlhTGl2ZU1lc3NhZ2U6ITB9KSxzLnNldFN0YXRlKHtpbnB1dFZhbHVlOm51bGx9KX19LHMub25JbnB1dENsaWNrPWZ1bmN0aW9uKCl7dmFyIGUsdDtzLnByb3BzLmRpc2FibGVkfHxzLnByb3BzLnJlYWRPbmx5fHxzLnNldE9wZW4oITApLG51bGw9PT0odD0oZT1zLnByb3BzKS5vbklucHV0Q2xpY2spfHx2b2lkIDA9PT10fHx0LmNhbGwoZSl9LHMub25JbnB1dEtleURvd249ZnVuY3Rpb24oZSl7dmFyIHQscixuLGEsbztudWxsPT09KHI9KHQ9cy5wcm9wcykub25LZXlEb3duKXx8dm9pZCAwPT09cnx8ci5jYWxsKHQsZSk7dmFyIGk9ZS5rZXk7aWYocy5zdGF0ZS5vcGVufHxzLnByb3BzLmlubGluZXx8cy5wcm9wcy5wcmV2ZW50T3Blbk9uRm9jdXMpe2lmKHMuc3RhdGUub3Blbil7aWYoaT09PXllLkFycm93RG93bnx8aT09PXllLkFycm93VXApe2UucHJldmVudERlZmF1bHQoKTt2YXIgbD1zLnByb3BzLnNob3dUaW1lU2VsZWN0T25seT9cIi5yZWFjdC1kYXRlcGlja2VyX190aW1lLWxpc3QtaXRlbVt0YWJpbmRleD0nMCddXCI6cy5wcm9wcy5zaG93V2Vla1BpY2tlciYmcy5wcm9wcy5zaG93V2Vla051bWJlcnM/Jy5yZWFjdC1kYXRlcGlja2VyX193ZWVrLW51bWJlclt0YWJpbmRleD1cIjBcIl0nOnMucHJvcHMuc2hvd0Z1bGxNb250aFllYXJQaWNrZXJ8fHMucHJvcHMuc2hvd01vbnRoWWVhclBpY2tlcj8nLnJlYWN0LWRhdGVwaWNrZXJfX21vbnRoLXRleHRbdGFiaW5kZXg9XCIwXCJdJzonLnJlYWN0LWRhdGVwaWNrZXJfX2RheVt0YWJpbmRleD1cIjBcIl0nLGM9KG51bGw9PT0obj1zLmNhbGVuZGFyKXx8dm9pZCAwPT09bj92b2lkIDA6bi5jb21wb25lbnROb2RlKWluc3RhbmNlb2YgRWxlbWVudCYmcy5jYWxlbmRhci5jb21wb25lbnROb2RlLnF1ZXJ5U2VsZWN0b3IobCk7cmV0dXJuIHZvaWQoYyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZjLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSkpfXZhciBwPU1lKHMuc3RhdGUucHJlU2VsZWN0aW9uKTtpPT09eWUuRW50ZXI/KGUucHJldmVudERlZmF1bHQoKSxzLmlucHV0T2soKSYmcy5zdGF0ZS5sYXN0UHJlU2VsZWN0Q2hhbmdlPT09YXI/KHMuaGFuZGxlU2VsZWN0KHAsZSksIXMucHJvcHMuc2hvdWxkQ2xvc2VPblNlbGVjdCYmcy5zZXRQcmVTZWxlY3Rpb24ocCkpOnMuc2V0T3BlbighMSkpOmk9PT15ZS5Fc2NhcGU/KGUucHJldmVudERlZmF1bHQoKSxzLnNlbmRGb2N1c0JhY2tUb0lucHV0KCkscy5zZXRPcGVuKCExKSk6aT09PXllLlRhYiYmcy5zZXRPcGVuKCExKSxzLmlucHV0T2soKXx8bnVsbD09PShvPShhPXMucHJvcHMpLm9uSW5wdXRFcnJvcil8fHZvaWQgMD09PW98fG8uY2FsbChhLHtjb2RlOjEsbXNnOnRyfSl9fWVsc2UgaSE9PXllLkFycm93RG93biYmaSE9PXllLkFycm93VXAmJmkhPT15ZS5FbnRlcnx8cy5vbklucHV0Q2xpY2soKX0scy5vblBvcnRhbEtleURvd249ZnVuY3Rpb24oZSl7ZS5rZXk9PT15ZS5Fc2NhcGUmJihlLnByZXZlbnREZWZhdWx0KCkscy5zZXRTdGF0ZSh7cHJldmVudEZvY3VzOiEwfSwoZnVuY3Rpb24oKXtzLnNldE9wZW4oITEpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cy5zZXRGb2N1cygpLHMuc2V0U3RhdGUoe3ByZXZlbnRGb2N1czohMX0pfSkpfSkpKX0scy5vbkRheUtleURvd249ZnVuY3Rpb24oZSl7dmFyIHQscixuLG8sbD1zLnByb3BzLGM9bC5taW5EYXRlLHU9bC5tYXhEYXRlLGY9bC5kaXNhYmxlZEtleWJvYXJkTmF2aWdhdGlvbixoPWwuc2hvd1dlZWtQaWNrZXIsbT1sLnNob3VsZENsb3NlT25TZWxlY3Qsdj1sLmxvY2FsZSxnPWwuY2FsZW5kYXJTdGFydERheSx5PWwuYWRqdXN0RGF0ZU9uQ2hhbmdlLGs9bC5pbmxpbmU7aWYobnVsbD09PShyPSh0PXMucHJvcHMpLm9uS2V5RG93bil8fHZvaWQgMD09PXJ8fHIuY2FsbCh0LGUpLCFmKXt2YXIgdz1lLmtleSxTPWUuc2hpZnRLZXksYj1NZShzLnN0YXRlLnByZVNlbGVjdGlvbiksTT1mdW5jdGlvbihlLHQpe3ZhciByPXQ7c3dpdGNoKGUpe2Nhc2UgeWUuQXJyb3dSaWdodDpyPWg/cC5hZGRXZWVrcyh0LDEpOmEuYWRkRGF5cyh0LDEpO2JyZWFrO2Nhc2UgeWUuQXJyb3dMZWZ0OnI9aD9zZS5zdWJXZWVrcyh0LDEpOm5lLnN1YkRheXModCwxKTticmVhaztjYXNlIHllLkFycm93VXA6cj1zZS5zdWJXZWVrcyh0LDEpO2JyZWFrO2Nhc2UgeWUuQXJyb3dEb3duOnI9cC5hZGRXZWVrcyh0LDEpO2JyZWFrO2Nhc2UgeWUuUGFnZVVwOnI9Uz9pZS5zdWJZZWFycyh0LDEpOmFlLnN1Yk1vbnRocyh0LDEpO2JyZWFrO2Nhc2UgeWUuUGFnZURvd246cj1TP2QuYWRkWWVhcnModCwxKTppLmFkZE1vbnRocyh0LDEpO2JyZWFrO2Nhc2UgeWUuSG9tZTpyPXhlKHQsdixnKTticmVhaztjYXNlIHllLkVuZDpyPWZ1bmN0aW9uKGUpe3JldHVybiBELmVuZE9mV2VlayhlKX0odCl9cmV0dXJuIHJ9O2lmKHc9PT15ZS5FbnRlcilyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpLHMuaGFuZGxlU2VsZWN0KGIsZSksdm9pZCghbSYmcy5zZXRQcmVTZWxlY3Rpb24oYikpO2lmKHc9PT15ZS5Fc2NhcGUpcmV0dXJuIGUucHJldmVudERlZmF1bHQoKSxzLnNldE9wZW4oITEpLHZvaWQocy5pbnB1dE9rKCl8fG51bGw9PT0obz0obj1zLnByb3BzKS5vbklucHV0RXJyb3IpfHx2b2lkIDA9PT1vfHxvLmNhbGwobix7Y29kZToxLG1zZzp0cn0pKTt2YXIgQz1udWxsO3N3aXRjaCh3KXtjYXNlIHllLkFycm93TGVmdDpjYXNlIHllLkFycm93UmlnaHQ6Y2FzZSB5ZS5BcnJvd1VwOmNhc2UgeWUuQXJyb3dEb3duOmNhc2UgeWUuUGFnZVVwOmNhc2UgeWUuUGFnZURvd246Y2FzZSB5ZS5Ib21lOmNhc2UgeWUuRW5kOkM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9ZSxuPSExLGE9MCxvPU0oZSx0KTshbjspe2lmKGE+PTQwKXtvPXQ7YnJlYWt9YyYmbzxjJiYocj15ZS5BcnJvd1JpZ2h0LG89amUoYyxzLnByb3BzKT9NKHIsbyk6YyksdSYmbz51JiYocj15ZS5BcnJvd0xlZnQsbz1qZSh1LHMucHJvcHMpP00ocixvKTp1KSxqZShvLHMucHJvcHMpPyhyIT09eWUuUGFnZVVwJiZyIT09eWUuSG9tZXx8KHI9eWUuQXJyb3dSaWdodCksciE9PXllLlBhZ2VEb3duJiZyIT09eWUuRW5kfHwocj15ZS5BcnJvd0xlZnQpLG89TShyLG8pKTpuPSEwLGErK31yZXR1cm4gb30odyxiKX1pZihDKXtpZihlLnByZXZlbnREZWZhdWx0KCkscy5zZXRTdGF0ZSh7bGFzdFByZVNlbGVjdENoYW5nZTphcn0pLHkmJnMuc2V0U2VsZWN0ZWQoQykscy5zZXRQcmVTZWxlY3Rpb24oQyksayl7dmFyIEU9Xy5nZXRNb250aChiKSxQPV8uZ2V0TW9udGgoQyksWT14LmdldFllYXIoYiksTj14LmdldFllYXIoQyk7RSE9PVB8fFkhPT1OP3Muc2V0U3RhdGUoe3Nob3VsZEZvY3VzRGF5SW5saW5lOiEwfSk6cy5zZXRTdGF0ZSh7c2hvdWxkRm9jdXNEYXlJbmxpbmU6ITF9KX19ZWxzZSBzLnByb3BzLm9uSW5wdXRFcnJvciYmcy5wcm9wcy5vbklucHV0RXJyb3Ioe2NvZGU6MSxtc2c6dHJ9KX19LHMub25Qb3BwZXJLZXlEb3duPWZ1bmN0aW9uKGUpe2Uua2V5PT09eWUuRXNjYXBlJiYoZS5wcmV2ZW50RGVmYXVsdCgpLHMuc2VuZEZvY3VzQmFja1RvSW5wdXQoKSl9LHMub25DbGVhckNsaWNrPWZ1bmN0aW9uKGUpe2UmJmUucHJldmVudERlZmF1bHQmJmUucHJldmVudERlZmF1bHQoKSxzLnNlbmRGb2N1c0JhY2tUb0lucHV0KCk7dmFyIHQ9cy5wcm9wcyxyPXQuc2VsZWN0c1JhbmdlLGE9dC5vbkNoYW5nZTtyP2E/YShbbnVsbCxudWxsXSxlKTpuLmRlZmF1bHRQcm9wcy5vbkNoYW5nZSgpOmE/YShudWxsLGUpOm4uZGVmYXVsdFByb3BzLm9uQ2hhbmdlKCkscy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZTpudWxsfSl9LHMuY2xlYXI9ZnVuY3Rpb24oKXtzLm9uQ2xlYXJDbGljaygpfSxzLm9uU2Nyb2xsPWZ1bmN0aW9uKGUpe1wiYm9vbGVhblwiPT10eXBlb2Ygcy5wcm9wcy5jbG9zZU9uU2Nyb2xsJiZzLnByb3BzLmNsb3NlT25TY3JvbGw/ZS50YXJnZXQhPT1kb2N1bWVudCYmZS50YXJnZXQhPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmUudGFyZ2V0IT09ZG9jdW1lbnQuYm9keXx8cy5zZXRPcGVuKCExKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBzLnByb3BzLmNsb3NlT25TY3JvbGwmJnMucHJvcHMuY2xvc2VPblNjcm9sbChlKSYmcy5zZXRPcGVuKCExKX0scy5yZW5kZXJDYWxlbmRhcj1mdW5jdGlvbigpe3ZhciBlLHQ7cmV0dXJuIHMucHJvcHMuaW5saW5lfHxzLmlzQ2FsZW5kYXJPcGVuKCk/dWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KGVyLGdlKHtyZWY6ZnVuY3Rpb24oZSl7cy5jYWxlbmRhcj1lfX0scy5wcm9wcyxzLnN0YXRlLHtzZXRPcGVuOnMuc2V0T3BlbixkYXRlRm9ybWF0Om51bGwhPT0oZT1zLnByb3BzLmRhdGVGb3JtYXRDYWxlbmRhcikmJnZvaWQgMCE9PWU/ZTpuLmRlZmF1bHRQcm9wcy5kYXRlRm9ybWF0Q2FsZW5kYXIsb25TZWxlY3Q6cy5oYW5kbGVTZWxlY3Qsb25DbGlja091dHNpZGU6cy5oYW5kbGVDYWxlbmRhckNsaWNrT3V0c2lkZSxob2xpZGF5czp1dChzLm1vZGlmeUhvbGlkYXlzKCkpLG91dHNpZGVDbGlja0lnbm9yZUNsYXNzOlp0LG9uRHJvcGRvd25Gb2N1czpzLmhhbmRsZURyb3Bkb3duRm9jdXMsb25UaW1lQ2hhbmdlOnMuaGFuZGxlVGltZUNoYW5nZSxjbGFzc05hbWU6cy5wcm9wcy5jYWxlbmRhckNsYXNzTmFtZSxjb250YWluZXI6cy5wcm9wcy5jYWxlbmRhckNvbnRhaW5lcixoYW5kbGVPbktleURvd246cy5wcm9wcy5vbktleURvd24saGFuZGxlT25EYXlLZXlEb3duOnMub25EYXlLZXlEb3duLHNldFByZVNlbGVjdGlvbjpzLnNldFByZVNlbGVjdGlvbixkcm9wZG93bk1vZGU6bnVsbCE9PSh0PXMucHJvcHMuZHJvcGRvd25Nb2RlKSYmdm9pZCAwIT09dD90Om4uZGVmYXVsdFByb3BzLmRyb3Bkb3duTW9kZX0pLHMucHJvcHMuY2hpbGRyZW4pOm51bGx9LHMucmVuZGVyQXJpYUxpdmVSZWdpb249ZnVuY3Rpb24oKXt2YXIgZSx0PXMucHJvcHMscj10LmRhdGVGb3JtYXQsYT12b2lkIDA9PT1yP24uZGVmYXVsdFByb3BzLmRhdGVGb3JtYXQ6cixvPXQubG9jYWxlLGk9cy5wcm9wcy5zaG93VGltZUlucHV0fHxzLnByb3BzLnNob3dUaW1lU2VsZWN0P1wiUFBQUHBcIjpcIlBQUFBcIjtyZXR1cm4gZT1zLnByb3BzLnNlbGVjdHNSYW5nZT9cIlNlbGVjdGVkIHN0YXJ0IGRhdGU6IFwiLmNvbmNhdChFZShzLnByb3BzLnN0YXJ0RGF0ZSx7ZGF0ZUZvcm1hdDppLGxvY2FsZTpvfSksXCIuIFwiKS5jb25jYXQocy5wcm9wcy5lbmREYXRlP1wiRW5kIGRhdGU6IFwiK0VlKHMucHJvcHMuZW5kRGF0ZSx7ZGF0ZUZvcm1hdDppLGxvY2FsZTpvfSk6XCJcIik6cy5wcm9wcy5zaG93VGltZVNlbGVjdE9ubHk/XCJTZWxlY3RlZCB0aW1lOiBcIi5jb25jYXQoRWUocy5wcm9wcy5zZWxlY3RlZCx7ZGF0ZUZvcm1hdDphLGxvY2FsZTpvfSkpOnMucHJvcHMuc2hvd1llYXJQaWNrZXI/XCJTZWxlY3RlZCB5ZWFyOiBcIi5jb25jYXQoRWUocy5wcm9wcy5zZWxlY3RlZCx7ZGF0ZUZvcm1hdDpcInl5eXlcIixsb2NhbGU6b30pKTpzLnByb3BzLnNob3dNb250aFllYXJQaWNrZXI/XCJTZWxlY3RlZCBtb250aDogXCIuY29uY2F0KEVlKHMucHJvcHMuc2VsZWN0ZWQse2RhdGVGb3JtYXQ6XCJNTU1NIHl5eXlcIixsb2NhbGU6b30pKTpzLnByb3BzLnNob3dRdWFydGVyWWVhclBpY2tlcj9cIlNlbGVjdGVkIHF1YXJ0ZXI6IFwiLmNvbmNhdChFZShzLnByb3BzLnNlbGVjdGVkLHtkYXRlRm9ybWF0OlwieXl5eSwgUVFRXCIsbG9jYWxlOm99KSk6XCJTZWxlY3RlZCBkYXRlOiBcIi5jb25jYXQoRWUocy5wcm9wcy5zZWxlY3RlZCx7ZGF0ZUZvcm1hdDppLGxvY2FsZTpvfSkpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInNwYW5cIix7cm9sZTpcImFsZXJ0XCIsXCJhcmlhLWxpdmVcIjpcInBvbGl0ZVwiLGNsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2FyaWEtbGl2ZVwifSxlKX0scy5yZW5kZXJEYXRlSW5wdXQ9ZnVuY3Rpb24oKXt2YXIgZSxhLG8saT10LmNsc3gocy5wcm9wcy5jbGFzc05hbWUsKChlPXt9KVtadF09cy5zdGF0ZS5vcGVuLGUpKSxsPXMucHJvcHMuY3VzdG9tSW5wdXR8fHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImlucHV0XCIse3R5cGU6XCJ0ZXh0XCJ9KSxjPXMucHJvcHMuY3VzdG9tSW5wdXRSZWZ8fFwicmVmXCIscD1zLnByb3BzLGQ9cC5kYXRlRm9ybWF0LHU9dm9pZCAwPT09ZD9uLmRlZmF1bHRQcm9wcy5kYXRlRm9ybWF0OmQsZj1wLmxvY2FsZSxoPVwic3RyaW5nXCI9PXR5cGVvZiBzLnByb3BzLnZhbHVlP3MucHJvcHMudmFsdWU6XCJzdHJpbmdcIj09dHlwZW9mIHMuc3RhdGUuaW5wdXRWYWx1ZT9zLnN0YXRlLmlucHV0VmFsdWU6cy5wcm9wcy5zZWxlY3RzUmFuZ2U/ZnVuY3Rpb24oZSx0LHIpe2lmKCFlKXJldHVyblwiXCI7dmFyIG49RWUoZSxyKSxhPXQ/RWUodCxyKTpcIlwiO3JldHVyblwiXCIuY29uY2F0KG4sXCIgLSBcIikuY29uY2F0KGEpfShzLnByb3BzLnN0YXJ0RGF0ZSxzLnByb3BzLmVuZERhdGUse2RhdGVGb3JtYXQ6dSxsb2NhbGU6Zn0pOnMucHJvcHMuc2VsZWN0c011bHRpcGxlP2Z1bmN0aW9uKGUsdCl7aWYoIShudWxsPT1lP3ZvaWQgMDplLmxlbmd0aCkpcmV0dXJuXCJcIjt2YXIgcj1lWzBdP0VlKGVbMF0sdCk6XCJcIjtpZigxPT09ZS5sZW5ndGgpcmV0dXJuIHI7aWYoMj09PWUubGVuZ3RoJiZlWzFdKXt2YXIgbj1FZShlWzFdLHQpO3JldHVyblwiXCIuY29uY2F0KHIsXCIsIFwiKS5jb25jYXQobil9dmFyIGE9ZS5sZW5ndGgtMTtyZXR1cm5cIlwiLmNvbmNhdChyLFwiICgrXCIpLmNvbmNhdChhLFwiKVwiKX0obnVsbCE9PShvPXMucHJvcHMuc2VsZWN0ZWREYXRlcykmJnZvaWQgMCE9PW8/bzpbXSx7ZGF0ZUZvcm1hdDp1LGxvY2FsZTpmfSk6RWUocy5wcm9wcy5zZWxlY3RlZCx7ZGF0ZUZvcm1hdDp1LGxvY2FsZTpmfSk7cmV0dXJuIHIuY2xvbmVFbGVtZW50KGwsKChhPXt9KVtjXT1mdW5jdGlvbihlKXtzLmlucHV0PWV9LGEudmFsdWU9aCxhLm9uQmx1cj1zLmhhbmRsZUJsdXIsYS5vbkNoYW5nZT1zLmhhbmRsZUNoYW5nZSxhLm9uQ2xpY2s9cy5vbklucHV0Q2xpY2ssYS5vbkZvY3VzPXMuaGFuZGxlRm9jdXMsYS5vbktleURvd249cy5vbklucHV0S2V5RG93bixhLmlkPXMucHJvcHMuaWQsYS5uYW1lPXMucHJvcHMubmFtZSxhLmZvcm09cy5wcm9wcy5mb3JtLGEuYXV0b0ZvY3VzPXMucHJvcHMuYXV0b0ZvY3VzLGEucGxhY2Vob2xkZXI9cy5wcm9wcy5wbGFjZWhvbGRlclRleHQsYS5kaXNhYmxlZD1zLnByb3BzLmRpc2FibGVkLGEuYXV0b0NvbXBsZXRlPXMucHJvcHMuYXV0b0NvbXBsZXRlLGEuY2xhc3NOYW1lPXQuY2xzeChsLnByb3BzLmNsYXNzTmFtZSxpKSxhLnRpdGxlPXMucHJvcHMudGl0bGUsYS5yZWFkT25seT1zLnByb3BzLnJlYWRPbmx5LGEucmVxdWlyZWQ9cy5wcm9wcy5yZXF1aXJlZCxhLnRhYkluZGV4PXMucHJvcHMudGFiSW5kZXgsYVtcImFyaWEtZGVzY3JpYmVkYnlcIl09cy5wcm9wcy5hcmlhRGVzY3JpYmVkQnksYVtcImFyaWEtaW52YWxpZFwiXT1zLnByb3BzLmFyaWFJbnZhbGlkLGFbXCJhcmlhLWxhYmVsbGVkYnlcIl09cy5wcm9wcy5hcmlhTGFiZWxsZWRCeSxhW1wiYXJpYS1yZXF1aXJlZFwiXT1zLnByb3BzLmFyaWFSZXF1aXJlZCxhKSl9LHMucmVuZGVyQ2xlYXJCdXR0b249ZnVuY3Rpb24oKXt2YXIgZT1zLnByb3BzLHI9ZS5pc0NsZWFyYWJsZSxuPWUuZGlzYWJsZWQsYT1lLnNlbGVjdGVkLG89ZS5zdGFydERhdGUsaT1lLmVuZERhdGUsbD1lLmNsZWFyQnV0dG9uVGl0bGUsYz1lLmNsZWFyQnV0dG9uQ2xhc3NOYW1lLHA9dm9pZCAwPT09Yz9cIlwiOmMsZD1lLmFyaWFMYWJlbENsb3NlLHU9dm9pZCAwPT09ZD9cIkNsb3NlXCI6ZCxmPWUuc2VsZWN0ZWREYXRlcztyZXR1cm4gciYmKG51bGwhPWF8fG51bGwhPW98fG51bGwhPWl8fChudWxsPT1mP3ZvaWQgMDpmLmxlbmd0aCkpP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLHt0eXBlOlwiYnV0dG9uXCIsY2xhc3NOYW1lOnQuY2xzeChcInJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb25cIixwLHtcInJlYWN0LWRhdGVwaWNrZXJfX2Nsb3NlLWljb24tLWRpc2FibGVkXCI6bn0pLGRpc2FibGVkOm4sXCJhcmlhLWxhYmVsXCI6dSxvbkNsaWNrOnMub25DbGVhckNsaWNrLHRpdGxlOmwsdGFiSW5kZXg6LTF9KTpudWxsfSxzLnN0YXRlPXMuY2FsY0luaXRpYWxTdGF0ZSgpLHMucHJldmVudEZvY3VzVGltZW91dD12b2lkIDAsc31yZXR1cm4gdmUobixlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobixcImRlZmF1bHRQcm9wc1wiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57YWxsb3dTYW1lRGF5OiExLGRhdGVGb3JtYXQ6XCJNTS9kZC95eXl5XCIsZGF0ZUZvcm1hdENhbGVuZGFyOlwiTExMTCB5eXl5XCIsb25DaGFuZ2U6ZnVuY3Rpb24oKXt9LGRpc2FibGVkOiExLGRpc2FibGVkS2V5Ym9hcmROYXZpZ2F0aW9uOiExLGRyb3Bkb3duTW9kZTpcInNjcm9sbFwiLG9uRm9jdXM6ZnVuY3Rpb24oKXt9LG9uQmx1cjpmdW5jdGlvbigpe30sb25LZXlEb3duOmZ1bmN0aW9uKCl7fSxvbklucHV0Q2xpY2s6ZnVuY3Rpb24oKXt9LG9uU2VsZWN0OmZ1bmN0aW9uKCl7fSxvbkNsaWNrT3V0c2lkZTpmdW5jdGlvbigpe30sb25Nb250aENoYW5nZTpmdW5jdGlvbigpe30sb25DYWxlbmRhck9wZW46ZnVuY3Rpb24oKXt9LG9uQ2FsZW5kYXJDbG9zZTpmdW5jdGlvbigpe30scHJldmVudE9wZW5PbkZvY3VzOiExLG9uWWVhckNoYW5nZTpmdW5jdGlvbigpe30sb25JbnB1dEVycm9yOmZ1bmN0aW9uKCl7fSxtb250aHNTaG93bjoxLHJlYWRPbmx5OiExLHdpdGhQb3J0YWw6ITEsc2VsZWN0c0Rpc2FibGVkRGF5c0luUmFuZ2U6ITEsc2hvdWxkQ2xvc2VPblNlbGVjdDohMCxzaG93VGltZVNlbGVjdDohMSxzaG93VGltZUlucHV0OiExLHNob3dQcmV2aW91c01vbnRoczohMSxzaG93TW9udGhZZWFyUGlja2VyOiExLHNob3dGdWxsTW9udGhZZWFyUGlja2VyOiExLHNob3dUd29Db2x1bW5Nb250aFllYXJQaWNrZXI6ITEsc2hvd0ZvdXJDb2x1bW5Nb250aFllYXJQaWNrZXI6ITEsc2hvd1llYXJQaWNrZXI6ITEsc2hvd1F1YXJ0ZXJZZWFyUGlja2VyOiExLHNob3dXZWVrUGlja2VyOiExLHN0cmljdFBhcnNpbmc6ITEsc3dhcFJhbmdlOiExLHRpbWVJbnRlcnZhbHM6MzAsdGltZUNhcHRpb246XCJUaW1lXCIscHJldmlvdXNNb250aEFyaWFMYWJlbDpcIlByZXZpb3VzIE1vbnRoXCIscHJldmlvdXNNb250aEJ1dHRvbkxhYmVsOlwiUHJldmlvdXMgTW9udGhcIixuZXh0TW9udGhBcmlhTGFiZWw6XCJOZXh0IE1vbnRoXCIsbmV4dE1vbnRoQnV0dG9uTGFiZWw6XCJOZXh0IE1vbnRoXCIscHJldmlvdXNZZWFyQXJpYUxhYmVsOlwiUHJldmlvdXMgWWVhclwiLHByZXZpb3VzWWVhckJ1dHRvbkxhYmVsOlwiUHJldmlvdXMgWWVhclwiLG5leHRZZWFyQXJpYUxhYmVsOlwiTmV4dCBZZWFyXCIsbmV4dFllYXJCdXR0b25MYWJlbDpcIk5leHQgWWVhclwiLHRpbWVJbnB1dExhYmVsOlwiVGltZVwiLGVuYWJsZVRhYkxvb3A6ITAseWVhckl0ZW1OdW1iZXI6U2UsZm9jdXNTZWxlY3RlZE1vbnRoOiExLHNob3dQb3BwZXJBcnJvdzohMCxleGNsdWRlU2Nyb2xsYmFyOiEwLGN1c3RvbVRpbWVJbnB1dDpudWxsLGNhbGVuZGFyU3RhcnREYXk6dm9pZCAwLHRvZ2dsZUNhbGVuZGFyT25JY29uQ2xpY2s6ITEsdXNlUG9pbnRlckV2ZW50OiExfX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudD1mdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsdGhpcy5vblNjcm9sbCwhMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIix0aGlzLnNldEhpZGRlblN0YXRlT25WaXNpYmlsaXR5SGlkZGVuKX0sbi5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbixhLG8scyxpO2UuaW5saW5lJiYocz1lLnNlbGVjdGVkLGk9dGhpcy5wcm9wcy5zZWxlY3RlZCxzJiZpP18uZ2V0TW9udGgocykhPT1fLmdldE1vbnRoKGkpfHx4LmdldFllYXIocykhPT14LmdldFllYXIoaSk6cyE9PWkpJiZ0aGlzLnNldFByZVNlbGVjdGlvbih0aGlzLnByb3BzLnNlbGVjdGVkKSx2b2lkIDAhPT10aGlzLnN0YXRlLm1vbnRoU2VsZWN0ZWRJbiYmZS5tb250aHNTaG93biE9PXRoaXMucHJvcHMubW9udGhzU2hvd24mJnRoaXMuc2V0U3RhdGUoe21vbnRoU2VsZWN0ZWRJbjowfSksZS5oaWdobGlnaHREYXRlcyE9PXRoaXMucHJvcHMuaGlnaGxpZ2h0RGF0ZXMmJnRoaXMuc2V0U3RhdGUoe2hpZ2hsaWdodERhdGVzOmR0KHRoaXMucHJvcHMuaGlnaGxpZ2h0RGF0ZXMpfSksdC5mb2N1c2VkfHxXZShlLnNlbGVjdGVkLHRoaXMucHJvcHMuc2VsZWN0ZWQpfHx0aGlzLnNldFN0YXRlKHtpbnB1dFZhbHVlOm51bGx9KSx0Lm9wZW4hPT10aGlzLnN0YXRlLm9wZW4mJighMT09PXQub3BlbiYmITA9PT10aGlzLnN0YXRlLm9wZW4mJihudWxsPT09KG49KHI9dGhpcy5wcm9wcykub25DYWxlbmRhck9wZW4pfHx2b2lkIDA9PT1ufHxuLmNhbGwocikpLCEwPT09dC5vcGVuJiYhMT09PXRoaXMuc3RhdGUub3BlbiYmKG51bGw9PT0obz0oYT10aGlzLnByb3BzKS5vbkNhbGVuZGFyQ2xvc2UpfHx2b2lkIDA9PT1vfHxvLmNhbGwoYSkpKX0sbi5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQ9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyUHJldmVudEZvY3VzVGltZW91dCgpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsdGhpcy5vblNjcm9sbCwhMCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIix0aGlzLnNldEhpZGRlblN0YXRlT25WaXNpYmlsaXR5SGlkZGVuKX0sbi5wcm90b3R5cGUucmVuZGVySW5wdXRDb250YWluZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHI9ZS5zaG93SWNvbixuPWUuaWNvbixhPWUuY2FsZW5kYXJJY29uQ2xhc3NuYW1lLG89ZS5jYWxlbmRhckljb25DbGFzc05hbWUscz1lLnRvZ2dsZUNhbGVuZGFyT25JY29uQ2xpY2ssaT10aGlzLnN0YXRlLm9wZW47cmV0dXJuIGEmJmNvbnNvbGUud2FybihcImNhbGVuZGFySWNvbkNsYXNzbmFtZSBwcm9wcyBpcyBkZXByZWNhdGVkLiBzaG91bGQgdXNlIGNhbGVuZGFySWNvbkNsYXNzTmFtZSBwcm9wcy5cIiksdWUuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTpcInJlYWN0LWRhdGVwaWNrZXJfX2lucHV0LWNvbnRhaW5lclwiLmNvbmNhdChyP1wiIHJlYWN0LWRhdGVwaWNrZXJfX3ZpZXctY2FsZW5kYXItaWNvblwiOlwiXCIpfSxyJiZ1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoanQsZ2Uoe2ljb246bixjbGFzc05hbWU6dC5jbHN4KG8sIW8mJmEsaSYmXCJyZWFjdC1kYXRlcGlja2VyLWlnbm9yZS1vbmNsaWNrb3V0c2lkZVwiKX0scz97b25DbGljazp0aGlzLnRvZ2dsZUNhbGVuZGFyfTpudWxsKSksdGhpcy5zdGF0ZS5pc1JlbmRlckFyaWFMaXZlTWVzc2FnZSYmdGhpcy5yZW5kZXJBcmlhTGl2ZVJlZ2lvbigpLHRoaXMucmVuZGVyRGF0ZUlucHV0KCksdGhpcy5yZW5kZXJDbGVhckJ1dHRvbigpKX0sbi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZW5kZXJDYWxlbmRhcigpO2lmKHRoaXMucHJvcHMuaW5saW5lKXJldHVybiBlO2lmKHRoaXMucHJvcHMud2l0aFBvcnRhbCl7dmFyIHQ9dGhpcy5zdGF0ZS5vcGVuP3VlLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh6dCx7ZW5hYmxlVGFiTG9vcDp0aGlzLnByb3BzLmVuYWJsZVRhYkxvb3B9LHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6XCJyZWFjdC1kYXRlcGlja2VyX19wb3J0YWxcIix0YWJJbmRleDotMSxvbktleURvd246dGhpcy5vblBvcnRhbEtleURvd259LGUpKTpudWxsO3JldHVybiB0aGlzLnN0YXRlLm9wZW4mJnRoaXMucHJvcHMucG9ydGFsSWQmJih0PXVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChVdCxnZSh7cG9ydGFsSWQ6dGhpcy5wcm9wcy5wb3J0YWxJZH0sdGhpcy5wcm9wcyksdCkpLHVlLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLG51bGwsdGhpcy5yZW5kZXJJbnB1dENvbnRhaW5lcigpLHQpfXJldHVybiB1ZS5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSnQsZ2Uoe30sdGhpcy5wcm9wcyx7Y2xhc3NOYW1lOnRoaXMucHJvcHMucG9wcGVyQ2xhc3NOYW1lLGhpZGVQb3BwZXI6IXRoaXMuaXNDYWxlbmRhck9wZW4oKSx0YXJnZXRDb21wb25lbnQ6dGhpcy5yZW5kZXJJbnB1dENvbnRhaW5lcigpLHBvcHBlckNvbXBvbmVudDplLHBvcHBlck9uS2V5RG93bjp0aGlzLm9uUG9wcGVyS2V5RG93bixzaG93QXJyb3c6dGhpcy5wcm9wcy5zaG93UG9wcGVyQXJyb3d9KSl9LG59KHIuQ29tcG9uZW50KSxucj1cImlucHV0XCIsYXI9XCJuYXZpZ2F0ZVwiO2UuQ2FsZW5kYXJDb250YWluZXI9a2UsZS5kZWZhdWx0PXJyLGUuZ2V0RGVmYXVsdExvY2FsZT1xZSxlLnJlZ2lzdGVyTG9jYWxlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9d2UoKTtyLl9fbG9jYWxlRGF0YV9ffHwoci5fX2xvY2FsZURhdGFfXz17fSksci5fX2xvY2FsZURhdGFfX1tlXT10fSxlLnNldERlZmF1bHRMb2NhbGU9ZnVuY3Rpb24oZSl7d2UoKS5fX2xvY2FsZUlkX189ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9KSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkTGVhZGluZ1plcm9zID0gYWRkTGVhZGluZ1plcm9zO1xuZnVuY3Rpb24gYWRkTGVhZGluZ1plcm9zKG51bWJlciwgdGFyZ2V0TGVuZ3RoKSB7XG4gIGNvbnN0IHNpZ24gPSBudW1iZXIgPCAwID8gXCItXCIgOiBcIlwiO1xuICBjb25zdCBvdXRwdXQgPSBNYXRoLmFicyhudW1iZXIpLnRvU3RyaW5nKCkucGFkU3RhcnQodGFyZ2V0TGVuZ3RoLCBcIjBcIik7XG4gIHJldHVybiBzaWduICsgb3V0cHV0O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZWZhdWx0TG9jYWxlXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9pbmRleC5lblVTO1xuICB9LFxufSk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uL2xvY2FsZS9lbi1VUy5qc1wiKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXREZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zO1xuZXhwb3J0cy5zZXREZWZhdWx0T3B0aW9ucyA9IHNldERlZmF1bHRPcHRpb25zO1xuXG5sZXQgZGVmYXVsdE9wdGlvbnMgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG4gIHJldHVybiBkZWZhdWx0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykge1xuICBkZWZhdWx0T3B0aW9ucyA9IG5ld09wdGlvbnM7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZm9ybWF0dGVycyA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vZ2V0RGF5T2ZZZWFyLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vZ2V0SVNPV2Vlay5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4uLy4uL2dldElTT1dlZWtZZWFyLmpzXCIpO1xudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi4vLi4vZ2V0V2Vlay5qc1wiKTtcbnZhciBfaW5kZXg1ID0gcmVxdWlyZShcIi4uLy4uL2dldFdlZWtZZWFyLmpzXCIpO1xuXG52YXIgX2luZGV4NiA9IHJlcXVpcmUoXCIuLi9hZGRMZWFkaW5nWmVyb3MuanNcIik7XG52YXIgX2luZGV4NyA9IHJlcXVpcmUoXCIuL2xpZ2h0Rm9ybWF0dGVycy5qc1wiKTtcblxuY29uc3QgZGF5UGVyaW9kRW51bSA9IHtcbiAgYW06IFwiYW1cIixcbiAgcG06IFwicG1cIixcbiAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgbm9vbjogXCJub29uXCIsXG4gIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gIGV2ZW5pbmc6IFwiZXZlbmluZ1wiLFxuICBuaWdodDogXCJuaWdodFwiLFxufTtcblxuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgTWlsbGlzZWNvbmRzIGluIGRheSAgICAgICAgICAgIHxcbiAqIHwgIGIgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgIHwgIEIgIHwgRmxleGlibGUgZGF5IHBlcmlvZCAgICAgICAgICAgIHxcbiAqIHwgIGMgIHwgU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWsgIHwgIEMqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGUgIHwgTG9jYWwgZGF5IG9mIHdlZWsgICAgICAgICAgICAgIHwgIEUgIHwgRGF5IG9mIHdlZWsgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGYgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEYqIHwgRGF5IG9mIHdlZWsgaW4gbW9udGggICAgICAgICAgIHxcbiAqIHwgIGcqIHwgTW9kaWZpZWQgSnVsaWFuIGRheSAgICAgICAgICAgIHwgIEcgIHwgRXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGkhIHwgSVNPIGRheSBvZiB3ZWVrICAgICAgICAgICAgICAgIHwgIEkhIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgIHxcbiAqIHwgIGoqIHwgTG9jYWxpemVkIGhvdXIgdy8gZGF5IHBlcmlvZCAgIHwgIEoqIHwgTG9jYWxpemVkIGhvdXIgdy9vIGRheSBwZXJpb2QgIHxcbiAqIHwgIGsgIHwgSG91ciBbMS0yNF0gICAgICAgICAgICAgICAgICAgIHwgIEsgIHwgSG91ciBbMC0xMV0gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGwqIHwgKGRlcHJlY2F0ZWQpICAgICAgICAgICAgICAgICAgIHwgIEwgIHwgU3RhbmQtYWxvbmUgbW9udGggICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE4gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG8hIHwgT3JkaW5hbCBudW1iZXIgbW9kaWZpZXIgICAgICAgIHwgIE8gIHwgVGltZXpvbmUgKEdNVCkgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHAhIHwgTG9uZyBsb2NhbGl6ZWQgdGltZSAgICAgICAgICAgIHwgIFAhIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgIHxcbiAqIHwgIHEgIHwgU3RhbmQtYWxvbmUgcXVhcnRlciAgICAgICAgICAgIHwgIFEgIHwgUXVhcnRlciAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHIqIHwgUmVsYXRlZCBHcmVnb3JpYW4geWVhciAgICAgICAgIHwgIFIhIHwgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHQhIHwgU2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgICAgIHwgIFQhIHwgTWlsbGlzZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgIHxcbiAqIHwgIHUgIHwgRXh0ZW5kZWQgeWVhciAgICAgICAgICAgICAgICAgIHwgIFUqIHwgQ3ljbGljIHllYXIgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHYqIHwgVGltZXpvbmUgKGdlbmVyaWMgbm9uLWxvY2F0LikgIHwgIFYqIHwgVGltZXpvbmUgKGxvY2F0aW9uKSAgICAgICAgICAgIHxcbiAqIHwgIHcgIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgIHwgIFcqIHwgV2VlayBvZiBtb250aCAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHggIHwgVGltZXpvbmUgKElTTy04NjAxIHcvbyBaKSAgICAgIHwgIFggIHwgVGltZXpvbmUgKElTTy04NjAxKSAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciAgICAgIHxcbiAqIHwgIHogIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pIHwgIFoqIHwgVGltZXpvbmUgKGFsaWFzZXMpICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgISBhcmUgbm9uLXN0YW5kYXJkLCBidXQgaW1wbGVtZW50ZWQgYnkgZGF0ZS1mbnM6XG4gKiAtIGBvYCBtb2RpZmllcyB0aGUgcHJldmlvdXMgdG9rZW4gdG8gdHVybiBpdCBpbnRvIGFuIG9yZGluYWwgKHNlZSBgZm9ybWF0YCBkb2NzKVxuICogLSBgaWAgaXMgSVNPIGRheSBvZiB3ZWVrLiBGb3IgYGlgIGFuZCBgaWlgIGlzIHJldHVybnMgbnVtZXJpYyBJU08gd2VlayBkYXlzLFxuICogICBpLmUuIDcgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5LCBldGMuXG4gKiAtIGBJYCBpcyBJU08gd2VlayBvZiB5ZWFyLCBhcyBvcHBvc2VkIHRvIGB3YCB3aGljaCBpcyBsb2NhbCB3ZWVrIG9mIHllYXIuXG4gKiAtIGBSYCBpcyBJU08gd2Vlay1udW1iZXJpbmcgeWVhciwgYXMgb3Bwb3NlZCB0byBgWWAgd2hpY2ggaXMgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhci5cbiAqICAgYFJgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgSWAgYW5kIGBpYFxuICogICBmb3IgdW5pdmVyc2FsIElTTyB3ZWVrLW51bWJlcmluZyBkYXRlLCB3aGVyZWFzXG4gKiAgIGBZYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYHdgIGFuZCBgZWBcbiAqICAgZm9yIHdlZWstbnVtYmVyaW5nIGRhdGUgc3BlY2lmaWMgdG8gdGhlIGxvY2FsZS5cbiAqIC0gYFBgIGlzIGxvbmcgbG9jYWxpemVkIGRhdGUgZm9ybWF0XG4gKiAtIGBwYCBpcyBsb25nIGxvY2FsaXplZCB0aW1lIGZvcm1hdFxuICovXG5cbmNvbnN0IGZvcm1hdHRlcnMgPSAoZXhwb3J0cy5mb3JtYXR0ZXJzID0ge1xuICAvLyBFcmFcbiAgRzogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGVyYSA9IGRhdGUuZ2V0RnVsbFllYXIoKSA+IDAgPyAxIDogMDtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBBRCwgQkNcbiAgICAgIGNhc2UgXCJHXCI6XG4gICAgICBjYXNlIFwiR0dcIjpcbiAgICAgIGNhc2UgXCJHR0dcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIiB9KTtcbiAgICAgIC8vIEEsIEJcbiAgICAgIGNhc2UgXCJHR0dHR1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwgeyB3aWR0aDogXCJuYXJyb3dcIiB9KTtcbiAgICAgIC8vIEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0XG4gICAgICBjYXNlIFwiR0dHR1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwid2lkZVwiIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBZZWFyXG4gIHk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gXCJ5b1wiKSB7XG4gICAgICBjb25zdCBzaWduZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgLy8gUmV0dXJucyAxIGZvciAxIEJDICh3aGljaCBpcyB5ZWFyIDAgaW4gSmF2YVNjcmlwdClcbiAgICAgIGNvbnN0IHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHllYXIsIHsgdW5pdDogXCJ5ZWFyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLnkoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJcbiAgWTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHNpZ25lZFdlZWtZZWFyID0gKDAsIF9pbmRleDUuZ2V0V2Vla1llYXIpKGRhdGUsIG9wdGlvbnMpO1xuICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgY29uc3Qgd2Vla1llYXIgPSBzaWduZWRXZWVrWWVhciA+IDAgPyBzaWduZWRXZWVrWWVhciA6IDEgLSBzaWduZWRXZWVrWWVhcjtcblxuICAgIC8vIFR3byBkaWdpdCB5ZWFyXG4gICAgaWYgKHRva2VuID09PSBcIllZXCIpIHtcbiAgICAgIGNvbnN0IHR3b0RpZ2l0WWVhciA9IHdlZWtZZWFyICUgMTAwO1xuICAgICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykodHdvRGlnaXRZZWFyLCAyKTtcbiAgICB9XG5cbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gXCJZb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrWWVhciwgeyB1bml0OiBcInllYXJcIiB9KTtcbiAgICB9XG5cbiAgICAvLyBQYWRkaW5nXG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykod2Vla1llYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAgUjogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgaXNvV2Vla1llYXIgPSAoMCwgX2luZGV4My5nZXRJU09XZWVrWWVhcikoZGF0ZSk7XG5cbiAgICAvLyBQYWRkaW5nXG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoaXNvV2Vla1llYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRXh0ZW5kZWQgeWVhci4gVGhpcyBpcyBhIHNpbmdsZSBudW1iZXIgZGVzaWduYXRpbmcgdGhlIHllYXIgb2YgdGhpcyBjYWxlbmRhciBzeXN0ZW0uXG4gIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOlxuICAvLyB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICAvLyB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICAvLyB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICAvLyB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gIC8vIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZC5cbiAgdTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKSh5ZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIFF1YXJ0ZXJcbiAgUTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLmNlaWwoKGRhdGUuZ2V0TW9udGgoKSArIDEpIC8gMyk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgMywgNFxuICAgICAgY2FzZSBcIlFcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhxdWFydGVyKTtcbiAgICAgIC8vIDAxLCAwMiwgMDMsIDA0XG4gICAgICBjYXNlIFwiUVFcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykocXVhcnRlciwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJRb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJRUVFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwiUVFRUVFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwiUVFRUVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIHF1YXJ0ZXJcbiAgcTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IHF1YXJ0ZXIgPSBNYXRoLmNlaWwoKGRhdGUuZ2V0TW9udGgoKSArIDEpIC8gMyk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgMywgNFxuICAgICAgY2FzZSBcInFcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhxdWFydGVyKTtcbiAgICAgIC8vIDAxLCAwMiwgMDMsIDA0XG4gICAgICBjYXNlIFwicXFcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykocXVhcnRlciwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJxb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwicXFxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwicXFxcVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgIHJldHVybiBfaW5kZXg3LmxpZ2h0Rm9ybWF0dGVycy5NKGRhdGUsIHRva2VuKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcbiAgICAgIGNhc2UgXCJNb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihtb250aCArIDEsIHsgdW5pdDogXCJtb250aFwiIH0pO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG4gICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSiwgRiwgLi4uLCBEXG4gICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcbiAgICAgIGNhc2UgXCJNTU1NXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gU3RhbmQtYWxvbmUgbW9udGhcbiAgTDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcobW9udGggKyAxKTtcbiAgICAgIC8vIDAxLCAwMiwgLi4uLCAxMlxuICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKG1vbnRoICsgMSwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTG9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIExvY2FsIHdlZWsgb2YgeWVhclxuICB3OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgd2VlayA9ICgwLCBfaW5kZXg0LmdldFdlZWspKGRhdGUsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHRva2VuID09PSBcIndvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHdlZWssIHsgdW5pdDogXCJ3ZWVrXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykod2VlaywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBJU08gd2VlayBvZiB5ZWFyXG4gIEk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBpc29XZWVrID0gKDAsIF9pbmRleDIuZ2V0SVNPV2VlaykoZGF0ZSk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwiSW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaXNvV2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShpc29XZWVrLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIERheSBvZiB0aGUgbW9udGhcbiAgZDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJkb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldERhdGUoKSwgeyB1bml0OiBcImRhdGVcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMuZChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHllYXJcbiAgRDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGRheU9mWWVhciA9ICgwLCBfaW5kZXguZ2V0RGF5T2ZZZWFyKShkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJEb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHsgdW5pdDogXCJkYXlPZlllYXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKShkYXlPZlllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHdlZWtcbiAgRTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlIFwiRVwiOlxuICAgICAgY2FzZSBcIkVFXCI6XG4gICAgICBjYXNlIFwiRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiRUVFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcIkVFRUVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcIkVFRUVcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gTG9jYWwgZGF5IG9mIHdlZWtcbiAgZTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7XG4gICAgY29uc3QgbG9jYWxEYXlPZldlZWsgPSAoZGF5T2ZXZWVrIC0gb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA4KSAlIDcgfHwgNztcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKE50aCBkYXkgb2Ygd2VlayB3aXRoIGN1cnJlbnQgbG9jYWxlIG9yIHdlZWtTdGFydHNPbilcbiAgICAgIGNhc2UgXCJlXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuICAgICAgY2FzZSBcImVlXCI6XG4gICAgICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGxvY2FsRGF5T2ZXZWVrLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDd0aFxuICAgICAgY2FzZSBcImVvXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7IHVuaXQ6IFwiZGF5XCIgfSk7XG4gICAgICBjYXNlIFwiZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImVlZWVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImVlZWVcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gU3RhbmQtYWxvbmUgbG9jYWwgZGF5IG9mIHdlZWtcbiAgYzogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7XG4gICAgY29uc3QgbG9jYWxEYXlPZldlZWsgPSAoZGF5T2ZXZWVrIC0gb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA4KSAlIDcgfHwgNztcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKHNhbWUgYXMgaW4gYGVgKVxuICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlIFwiY2NcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykobG9jYWxEYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJjb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImNjY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJjY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIElTTyBkYXkgb2Ygd2Vla1xuICBpOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBpc29EYXlPZldlZWsgPSBkYXlPZldlZWsgPT09IDAgPyA3IDogZGF5T2ZXZWVrO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDJcbiAgICAgIGNhc2UgXCJpXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTtcbiAgICAgIC8vIDAyXG4gICAgICBjYXNlIFwiaWlcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoaXNvRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgLy8gMm5kXG4gICAgICBjYXNlIFwiaW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaXNvRGF5T2ZXZWVrLCB7IHVuaXQ6IFwiZGF5XCIgfSk7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJpaWlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiaWlpaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiaWlpaVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBBTSBvciBQTVxuICBhOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgY29uc3QgZGF5UGVyaW9kRW51bVZhbHVlID0gaG91cnMgLyAxMiA+PSAxID8gXCJwbVwiIDogXCJhbVwiO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImFcIjpcbiAgICAgIGNhc2UgXCJhYVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcImFhYVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemVcbiAgICAgICAgICAuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjYXNlIFwiYWFhYWFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYWFhYVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBBTSwgUE0sIG1pZG5pZ2h0LCBub29uXG4gIGI6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBsZXQgZGF5UGVyaW9kRW51bVZhbHVlO1xuICAgIGlmIChob3VycyA9PT0gMTIpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubm9vbjtcbiAgICB9IGVsc2UgaWYgKGhvdXJzID09PSAwKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1pZG5pZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyBcInBtXCIgOiBcImFtXCI7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImJcIjpcbiAgICAgIGNhc2UgXCJiYlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcImJiYlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemVcbiAgICAgICAgICAuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjYXNlIFwiYmJiYmJcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYmJiYlwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBpbiB0aGUgbW9ybmluZywgaW4gdGhlIGFmdGVybm9vbiwgaW4gdGhlIGV2ZW5pbmcsIGF0IG5pZ2h0XG4gIEI6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBsZXQgZGF5UGVyaW9kRW51bVZhbHVlO1xuICAgIGlmIChob3VycyA+PSAxNykge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5ldmVuaW5nO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPj0gMTIpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0uYWZ0ZXJub29uO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPj0gNCkge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5tb3JuaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm5pZ2h0O1xuICAgIH1cblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJCXCI6XG4gICAgICBjYXNlIFwiQkJcIjpcbiAgICAgIGNhc2UgXCJCQkJcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheVBlcmlvZChkYXlQZXJpb2RFbnVtVmFsdWUsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJCQkJCQlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJCQkJCXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEhvdXIgWzEtMTJdXG4gIGg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwiaG9cIikge1xuICAgICAgbGV0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpICUgMTI7XG4gICAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMTI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMuaChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJIb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldEhvdXJzKCksIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLkgoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIEhvdXIgWzAtMTFdXG4gIEs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKSAlIDEyO1xuXG4gICAgaWYgKHRva2VuID09PSBcIktvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEhvdXIgWzEtMjRdXG4gIGs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDI0O1xuXG4gICAgaWYgKHRva2VuID09PSBcImtvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1pbnV0ZVxuICBtOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcIm1vXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0TWludXRlcygpLCB7IHVuaXQ6IFwibWludXRlXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLm0oZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcInNvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0U2Vjb25kcygpLCB7IHVuaXQ6IFwic2Vjb25kXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9pbmRleDcubGlnaHRGb3JtYXR0ZXJzLnMoZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIEZyYWN0aW9uIG9mIHNlY29uZFxuICBTOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gX2luZGV4Ny5saWdodEZvcm1hdHRlcnMuUyhkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gVGltZXpvbmUgKElTTy04NjAxLiBJZiBvZmZzZXQgaXMgMCwgb3V0cHV0IGlzIGFsd2F5cyBgJ1onYClcbiAgWDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHtcbiAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcblxuICAgIGlmICh0aW1lem9uZU9mZnNldCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFwiWlwiO1xuICAgIH1cblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEhvdXJzIGFuZCBvcHRpb25hbCBtaW51dGVzXG4gICAgICBjYXNlIFwiWFwiOlxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmVXaXRoT3B0aW9uYWxNaW51dGVzKHRpbWV6b25lT2Zmc2V0KTtcblxuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgWFhgXG4gICAgICBjYXNlIFwiWFhYWFwiOlxuICAgICAgY2FzZSBcIlhYXCI6IC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWFhgXG4gICAgICBjYXNlIFwiWFhYWFhcIjpcbiAgICAgIGNhc2UgXCJYWFhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsIFwiOlwiKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gVGltZXpvbmUgKElTTy04NjAxLiBJZiBvZmZzZXQgaXMgMCwgb3V0cHV0IGlzIGAnKzAwOjAwJ2Agb3IgZXF1aXZhbGVudClcbiAgeDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHtcbiAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEhvdXJzIGFuZCBvcHRpb25hbCBtaW51dGVzXG4gICAgICBjYXNlIFwieFwiOlxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmVXaXRoT3B0aW9uYWxNaW51dGVzKHRpbWV6b25lT2Zmc2V0KTtcblxuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHhgXG4gICAgICBjYXNlIFwieHh4eFwiOlxuICAgICAgY2FzZSBcInh4XCI6IC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eHhgXG4gICAgICBjYXNlIFwieHh4eHhcIjpcbiAgICAgIGNhc2UgXCJ4eHhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsIFwiOlwiKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gVGltZXpvbmUgKEdNVClcbiAgTzogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHtcbiAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIFNob3J0XG4gICAgICBjYXNlIFwiT1wiOlxuICAgICAgY2FzZSBcIk9PXCI6XG4gICAgICBjYXNlIFwiT09PXCI6XG4gICAgICAgIHJldHVybiBcIkdNVFwiICsgZm9ybWF0VGltZXpvbmVTaG9ydCh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgICAgLy8gTG9uZ1xuICAgICAgY2FzZSBcIk9PT09cIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcIkdNVFwiICsgZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsIFwiOlwiKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdGlvbilcbiAgejogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHtcbiAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIFNob3J0XG4gICAgICBjYXNlIFwielwiOlxuICAgICAgY2FzZSBcInp6XCI6XG4gICAgICBjYXNlIFwienp6XCI6XG4gICAgICAgIHJldHVybiBcIkdNVFwiICsgZm9ybWF0VGltZXpvbmVTaG9ydCh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgICAgLy8gTG9uZ1xuICAgICAgY2FzZSBcInp6enpcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcIkdNVFwiICsgZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQsIFwiOlwiKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gU2Vjb25kcyB0aW1lc3RhbXBcbiAgdDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBNYXRoLnRydW5jKGRhdGUuZ2V0VGltZSgpIC8gMTAwMCk7XG4gICAgcmV0dXJuICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykodGltZXN0YW1wLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1pbGxpc2Vjb25kcyB0aW1lc3RhbXBcbiAgVDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKTtcbiAgICByZXR1cm4gKDAsIF9pbmRleDYuYWRkTGVhZGluZ1plcm9zKSh0aW1lc3RhbXAsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG59KTtcblxuZnVuY3Rpb24gZm9ybWF0VGltZXpvbmVTaG9ydChvZmZzZXQsIGRlbGltaXRlciA9IFwiXCIpIHtcbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICBjb25zdCBob3VycyA9IE1hdGgudHJ1bmMoYWJzT2Zmc2V0IC8gNjApO1xuICBjb25zdCBtaW51dGVzID0gYWJzT2Zmc2V0ICUgNjA7XG4gIGlmIChtaW51dGVzID09PSAwKSB7XG4gICAgcmV0dXJuIHNpZ24gKyBTdHJpbmcoaG91cnMpO1xuICB9XG4gIHJldHVybiAoXG4gICAgc2lnbiArIFN0cmluZyhob3VycykgKyBkZWxpbWl0ZXIgKyAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKG1pbnV0ZXMsIDIpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyhvZmZzZXQsIGRlbGltaXRlcikge1xuICBpZiAob2Zmc2V0ICUgNjAgPT09IDApIHtcbiAgICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gICAgcmV0dXJuIHNpZ24gKyAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKE1hdGguYWJzKG9mZnNldCkgLyA2MCwgMik7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGVsaW1pdGVyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkZWxpbWl0ZXIgPSBcIlwiKSB7XG4gIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgY29uc3QgaG91cnMgPSAoMCwgX2luZGV4Ni5hZGRMZWFkaW5nWmVyb3MpKE1hdGgudHJ1bmMoYWJzT2Zmc2V0IC8gNjApLCAyKTtcbiAgY29uc3QgbWludXRlcyA9ICgwLCBfaW5kZXg2LmFkZExlYWRpbmdaZXJvcykoYWJzT2Zmc2V0ICUgNjAsIDIpO1xuICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlcztcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5saWdodEZvcm1hdHRlcnMgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uL2FkZExlYWRpbmdaZXJvcy5qc1wiKTtcblxuLypcbiAqIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgIGEgIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEEqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGQgIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgIHwgIEQgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIGggIHwgSG91ciBbMS0xMl0gICAgICAgICAgICAgICAgICAgIHwgIEggIHwgSG91ciBbMC0yM10gICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIG0gIHwgTWludXRlICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE0gIHwgTW9udGggICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgIHMgIHwgU2Vjb25kICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFMgIHwgRnJhY3Rpb24gb2Ygc2Vjb25kICAgICAgICAgICAgIHxcbiAqIHwgIHkgIHwgWWVhciAoYWJzKSAgICAgICAgICAgICAgICAgICAgIHwgIFkgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAqIGFyZSBub3QgaW1wbGVtZW50ZWQgYnV0IHJlc2VydmVkIGJ5IFVuaWNvZGUgc3RhbmRhcmQuXG4gKi9cblxuY29uc3QgbGlnaHRGb3JtYXR0ZXJzID0gKGV4cG9ydHMubGlnaHRGb3JtYXR0ZXJzID0ge1xuICAvLyBZZWFyXG4gIHkoZGF0ZSwgdG9rZW4pIHtcbiAgICAvLyBGcm9tIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtMzEvdHIzNS1kYXRlcy5odG1sI0RhdGVfRm9ybWF0X3Rva2Vuc1xuICAgIC8vIHwgWWVhciAgICAgfCAgICAgeSB8IHl5IHwgICB5eXkgfCAgeXl5eSB8IHl5eXl5IHxcbiAgICAvLyB8LS0tLS0tLS0tLXwtLS0tLS0tfC0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18XG4gICAgLy8gfCBBRCAxICAgICB8ICAgICAxIHwgMDEgfCAgIDAwMSB8ICAwMDAxIHwgMDAwMDEgfFxuICAgIC8vIHwgQUQgMTIgICAgfCAgICAxMiB8IDEyIHwgICAwMTIgfCAgMDAxMiB8IDAwMDEyIHxcbiAgICAvLyB8IEFEIDEyMyAgIHwgICAxMjMgfCAyMyB8ICAgMTIzIHwgIDAxMjMgfCAwMDEyMyB8XG4gICAgLy8gfCBBRCAxMjM0ICB8ICAxMjM0IHwgMzQgfCAgMTIzNCB8ICAxMjM0IHwgMDEyMzQgfFxuICAgIC8vIHwgQUQgMTIzNDUgfCAxMjM0NSB8IDQ1IHwgMTIzNDUgfCAxMjM0NSB8IDEyMzQ1IHxcblxuICAgIGNvbnN0IHNpZ25lZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgLy8gUmV0dXJucyAxIGZvciAxIEJDICh3aGljaCBpcyB5ZWFyIDAgaW4gSmF2YVNjcmlwdClcbiAgICBjb25zdCB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShcbiAgICAgIHRva2VuID09PSBcInl5XCIgPyB5ZWFyICUgMTAwIDogeWVhcixcbiAgICAgIHRva2VuLmxlbmd0aCxcbiAgICApO1xuICB9LFxuXG4gIC8vIE1vbnRoXG4gIE0oZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICByZXR1cm4gdG9rZW4gPT09IFwiTVwiXG4gICAgICA/IFN0cmluZyhtb250aCArIDEpXG4gICAgICA6ICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShtb250aCArIDEsIDIpO1xuICB9LFxuXG4gIC8vIERheSBvZiB0aGUgbW9udGhcbiAgZChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmFkZExlYWRpbmdaZXJvcykoZGF0ZS5nZXREYXRlKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gQU0gb3IgUE1cbiAgYShkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IGRheVBlcmlvZEVudW1WYWx1ZSA9IGRhdGUuZ2V0SG91cnMoKSAvIDEyID49IDEgPyBcInBtXCIgOiBcImFtXCI7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgY2FzZSBcImFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJhYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZTtcbiAgICAgIGNhc2UgXCJhYWFhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlWzBdO1xuICAgICAgY2FzZSBcImFhYWFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWUgPT09IFwiYW1cIiA/IFwiYS5tLlwiIDogXCJwLm0uXCI7XG4gICAgfVxuICB9LFxuXG4gIC8vIEhvdXIgWzEtMTJdXG4gIGgoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKFxuICAgICAgZGF0ZS5nZXRIb3VycygpICUgMTIgfHwgMTIsXG4gICAgICB0b2tlbi5sZW5ndGgsXG4gICAgKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTIzXVxuICBIKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShkYXRlLmdldEhvdXJzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG0oZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKGRhdGUuZ2V0TWludXRlcygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIFNlY29uZFxuICBzKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguYWRkTGVhZGluZ1plcm9zKShkYXRlLmdldFNlY29uZHMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUyhkYXRlLCB0b2tlbikge1xuICAgIGNvbnN0IG51bWJlck9mRGlnaXRzID0gdG9rZW4ubGVuZ3RoO1xuICAgIGNvbnN0IG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgY29uc3QgZnJhY3Rpb25hbFNlY29uZHMgPSBNYXRoLnRydW5jKFxuICAgICAgbWlsbGlzZWNvbmRzICogTWF0aC5wb3coMTAsIG51bWJlck9mRGlnaXRzIC0gMyksXG4gICAgKTtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5hZGRMZWFkaW5nWmVyb3MpKGZyYWN0aW9uYWxTZWNvbmRzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMubG9uZ0Zvcm1hdHRlcnMgPSB2b2lkIDA7XG5cbmNvbnN0IGRhdGVMb25nRm9ybWF0dGVyID0gKHBhdHRlcm4sIGZvcm1hdExvbmcpID0+IHtcbiAgc3dpdGNoIChwYXR0ZXJuKSB7XG4gICAgY2FzZSBcIlBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJzaG9ydFwiIH0pO1xuICAgIGNhc2UgXCJQUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgIGNhc2UgXCJQUFBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoeyB3aWR0aDogXCJsb25nXCIgfSk7XG4gICAgY2FzZSBcIlBQUFBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcImZ1bGxcIiB9KTtcbiAgfVxufTtcblxuY29uc3QgdGltZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBzd2l0Y2ggKHBhdHRlcm4pIHtcbiAgICBjYXNlIFwicFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgY2FzZSBcInBwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgY2FzZSBcInBwcFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICBjYXNlIFwicHBwcFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICB9XG59O1xuXG5jb25zdCBkYXRlVGltZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBjb25zdCBtYXRjaFJlc3VsdCA9IHBhdHRlcm4ubWF0Y2goLyhQKykocCspPy8pIHx8IFtdO1xuICBjb25zdCBkYXRlUGF0dGVybiA9IG1hdGNoUmVzdWx0WzFdO1xuICBjb25zdCB0aW1lUGF0dGVybiA9IG1hdGNoUmVzdWx0WzJdO1xuXG4gIGlmICghdGltZVBhdHRlcm4pIHtcbiAgICByZXR1cm4gZGF0ZUxvbmdGb3JtYXR0ZXIocGF0dGVybiwgZm9ybWF0TG9uZyk7XG4gIH1cblxuICBsZXQgZGF0ZVRpbWVGb3JtYXQ7XG5cbiAgc3dpdGNoIChkYXRlUGF0dGVybikge1xuICAgIGNhc2UgXCJQXCI6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJzaG9ydFwiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQXCI6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQUFBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJQUFBQXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcImZ1bGxcIiB9KTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGRhdGVUaW1lRm9ybWF0XG4gICAgLnJlcGxhY2UoXCJ7e2RhdGV9fVwiLCBkYXRlTG9uZ0Zvcm1hdHRlcihkYXRlUGF0dGVybiwgZm9ybWF0TG9uZykpXG4gICAgLnJlcGxhY2UoXCJ7e3RpbWV9fVwiLCB0aW1lTG9uZ0Zvcm1hdHRlcih0aW1lUGF0dGVybiwgZm9ybWF0TG9uZykpO1xufTtcblxuY29uc3QgbG9uZ0Zvcm1hdHRlcnMgPSAoZXhwb3J0cy5sb25nRm9ybWF0dGVycyA9IHtcbiAgcDogdGltZUxvbmdGb3JtYXR0ZXIsXG4gIFA6IGRhdGVUaW1lTG9uZ0Zvcm1hdHRlcixcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgPSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogR29vZ2xlIENocm9tZSBhcyBvZiA2Ny4wLjMzOTYuODcgaW50cm9kdWNlZCB0aW1lem9uZXMgd2l0aCBvZmZzZXQgdGhhdCBpbmNsdWRlcyBzZWNvbmRzLlxuICogVGhleSB1c3VhbGx5IGFwcGVhciBmb3IgZGF0ZXMgdGhhdCBkZW5vdGUgdGltZSBiZWZvcmUgdGhlIHRpbWV6b25lcyB3ZXJlIGludHJvZHVjZWRcbiAqIChlLmcuIGZvciAnRXVyb3BlL1ByYWd1ZScgdGltZXpvbmUgdGhlIG9mZnNldCBpcyBHTVQrMDA6NTc6NDQgYmVmb3JlIDEgT2N0b2JlciAxODkxXG4gKiBhbmQgR01UKzAxOjAwOjAwIGFmdGVyIHRoYXQgZGF0ZSlcbiAqXG4gKiBEYXRlI2dldFRpbWV6b25lT2Zmc2V0IHJldHVybnMgdGhlIG9mZnNldCBpbiBtaW51dGVzIGFuZCB3b3VsZCByZXR1cm4gNTcgZm9yIHRoZSBleGFtcGxlIGFib3ZlLFxuICogd2hpY2ggd291bGQgbGVhZCB0byBpbmNvcnJlY3QgY2FsY3VsYXRpb25zLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdGltZXpvbmUgb2Zmc2V0IGluIG1pbGxpc2Vjb25kcyB0aGF0IHRha2VzIHNlY29uZHMgaW4gYWNjb3VudC5cbiAqL1xuZnVuY3Rpb24gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoXG4gICAgRGF0ZS5VVEMoXG4gICAgICBfZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgX2RhdGUuZ2V0TW9udGgoKSxcbiAgICAgIF9kYXRlLmdldERhdGUoKSxcbiAgICAgIF9kYXRlLmdldEhvdXJzKCksXG4gICAgICBfZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgICBfZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgICBfZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICApLFxuICApO1xuICB1dGNEYXRlLnNldFVUQ0Z1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCkpO1xuICByZXR1cm4gK2RhdGUgLSArdXRjRGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc1Byb3RlY3RlZERheU9mWWVhclRva2VuID0gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbjtcbmV4cG9ydHMuaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuID0gaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuO1xuZXhwb3J0cy53YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yID0gd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcjtcbmNvbnN0IGRheU9mWWVhclRva2VuUkUgPSAvXkQrJC87XG5jb25zdCB3ZWVrWWVhclRva2VuUkUgPSAvXlkrJC87XG5cbmNvbnN0IHRocm93VG9rZW5zID0gW1wiRFwiLCBcIkREXCIsIFwiWVlcIiwgXCJZWVlZXCJdO1xuXG5mdW5jdGlvbiBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuKHRva2VuKSB7XG4gIHJldHVybiBkYXlPZlllYXJUb2tlblJFLnRlc3QodG9rZW4pO1xufVxuXG5mdW5jdGlvbiBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIHdlZWtZZWFyVG9rZW5SRS50ZXN0KHRva2VuKTtcbn1cblxuZnVuY3Rpb24gd2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcih0b2tlbiwgZm9ybWF0LCBpbnB1dCkge1xuICBjb25zdCBfbWVzc2FnZSA9IG1lc3NhZ2UodG9rZW4sIGZvcm1hdCwgaW5wdXQpO1xuICBjb25zb2xlLndhcm4oX21lc3NhZ2UpO1xuICBpZiAodGhyb3dUb2tlbnMuaW5jbHVkZXModG9rZW4pKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihfbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIG1lc3NhZ2UodG9rZW4sIGZvcm1hdCwgaW5wdXQpIHtcbiAgY29uc3Qgc3ViamVjdCA9IHRva2VuWzBdID09PSBcIllcIiA/IFwieWVhcnNcIiA6IFwiZGF5cyBvZiB0aGUgbW9udGhcIjtcbiAgcmV0dXJuIGBVc2UgXFxgJHt0b2tlbi50b0xvd2VyQ2FzZSgpfVxcYCBpbnN0ZWFkIG9mIFxcYCR7dG9rZW59XFxgIChpbiBcXGAke2Zvcm1hdH1cXGApIGZvciBmb3JtYXR0aW5nICR7c3ViamVjdH0gdG8gdGhlIGlucHV0IFxcYCR7aW5wdXR9XFxgOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRgO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZERheXMgPSBhZGREYXlzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGREYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBkYXlzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBkYXlzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAxMCBkYXlzIHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBhZGREYXlzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAxMClcbiAqIC8vPT4gVGh1IFNlcCAxMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIGFkZERheXMoZGF0ZSwgYW1vdW50KSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBpZiAoaXNOYU4oYW1vdW50KSkgcmV0dXJuICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsIE5hTik7XG4gIGlmICghYW1vdW50KSB7XG4gICAgLy8gSWYgMCBkYXlzLCBuby1vcCB0byBhdm9pZCBjaGFuZ2luZyB0aW1lcyBpbiB0aGUgaG91ciBiZWZvcmUgZW5kIG9mIERTVFxuICAgIHJldHVybiBfZGF0ZTtcbiAgfVxuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIGFtb3VudCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRIb3VycyA9IGFkZEhvdXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZE1pbGxpc2Vjb25kcy5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vY29uc3RhbnRzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZEhvdXJzXG4gKiBAY2F0ZWdvcnkgSG91ciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaG91cnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaG91cnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBob3VycyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgaG91cnMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDIgaG91cnMgdG8gMTAgSnVseSAyMDE0IDIzOjAwOjAwOlxuICogY29uc3QgcmVzdWx0ID0gYWRkSG91cnMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDIzLCAwKSwgMilcbiAqIC8vPT4gRnJpIEp1bCAxMSAyMDE0IDAxOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIGFkZEhvdXJzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRNaWxsaXNlY29uZHMpKGRhdGUsIGFtb3VudCAqIF9pbmRleDIubWlsbGlzZWNvbmRzSW5Ib3VyKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRNaWxsaXNlY29uZHMgPSBhZGRNaWxsaXNlY29uZHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZE1pbGxpc2Vjb25kc1xuICogQGNhdGVnb3J5IE1pbGxpc2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaWxsaXNlY29uZHMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDc1MCBtaWxsaXNlY29uZHMgdG8gMTAgSnVseSAyMDE0IDEyOjQ1OjMwLjAwMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAzMCwgMCksIDc1MClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjMwLjc1MFxuICovXG5mdW5jdGlvbiBhZGRNaWxsaXNlY29uZHMoZGF0ZSwgYW1vdW50KSB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9ICsoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIHJldHVybiAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCB0aW1lc3RhbXAgKyBhbW91bnQpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZE1pbnV0ZXMgPSBhZGRNaW51dGVzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZE1pbGxpc2Vjb25kcy5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vY29uc3RhbnRzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGFkZE1pbnV0ZXNcbiAqIEBjYXRlZ29yeSBNaW51dGUgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbnV0ZXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWludXRlcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIG1pbnV0ZXMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIG1pbnV0ZXMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDMwIG1pbnV0ZXMgdG8gMTAgSnVseSAyMDE0IDEyOjAwOjAwOlxuICogY29uc3QgcmVzdWx0ID0gYWRkTWludXRlcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDApLCAzMClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjMwOjAwXG4gKi9cbmZ1bmN0aW9uIGFkZE1pbnV0ZXMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZE1pbGxpc2Vjb25kcykoXG4gICAgZGF0ZSxcbiAgICBhbW91bnQgKiBfaW5kZXgyLm1pbGxpc2Vjb25kc0luTWludXRlLFxuICApO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZE1vbnRocyA9IGFkZE1vbnRocztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkTW9udGhzXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1vbnRocyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtb250aHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBtb250aHMgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIG1vbnRocyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgNSBtb250aHMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1vbnRocyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgNSlcbiAqIC8vPT4gU3VuIEZlYiAwMSAyMDE1IDAwOjAwOjAwXG4gKlxuICogLy8gQWRkIG9uZSBtb250aCB0byAzMCBKYW51YXJ5IDIwMjM6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRNb250aHMobmV3IERhdGUoMjAyMywgMCwgMzApLCAxKVxuICogLy89PiBUdWUgRmViIDI4IDIwMjMgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gYWRkTW9udGhzKGRhdGUsIGFtb3VudCkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgaWYgKGlzTmFOKGFtb3VudCkpIHJldHVybiAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCBOYU4pO1xuICBpZiAoIWFtb3VudCkge1xuICAgIC8vIElmIDAgbW9udGhzLCBuby1vcCB0byBhdm9pZCBjaGFuZ2luZyB0aW1lcyBpbiB0aGUgaG91ciBiZWZvcmUgZW5kIG9mIERTVFxuICAgIHJldHVybiBfZGF0ZTtcbiAgfVxuICBjb25zdCBkYXlPZk1vbnRoID0gX2RhdGUuZ2V0RGF0ZSgpO1xuXG4gIC8vIFRoZSBKUyBEYXRlIG9iamVjdCBzdXBwb3J0cyBkYXRlIG1hdGggYnkgYWNjZXB0aW5nIG91dC1vZi1ib3VuZHMgdmFsdWVzIGZvclxuICAvLyBtb250aCwgZGF5LCBldGMuIEZvciBleGFtcGxlLCBuZXcgRGF0ZSgyMDIwLCAwLCAwKSByZXR1cm5zIDMxIERlYyAyMDE5IGFuZFxuICAvLyBuZXcgRGF0ZSgyMDIwLCAxMywgMSkgcmV0dXJucyAxIEZlYiAyMDIxLiAgVGhpcyBpcyAqYWxtb3N0KiB0aGUgYmVoYXZpb3Igd2VcbiAgLy8gd2FudCBleGNlcHQgdGhhdCBkYXRlcyB3aWxsIHdyYXAgYXJvdW5kIHRoZSBlbmQgb2YgYSBtb250aCwgbWVhbmluZyB0aGF0XG4gIC8vIG5ldyBEYXRlKDIwMjAsIDEzLCAzMSkgd2lsbCByZXR1cm4gMyBNYXIgMjAyMSBub3QgMjggRmViIDIwMjEgYXMgZGVzaXJlZC4gU29cbiAgLy8gd2UnbGwgZGVmYXVsdCB0byB0aGUgZW5kIG9mIHRoZSBkZXNpcmVkIG1vbnRoIGJ5IGFkZGluZyAxIHRvIHRoZSBkZXNpcmVkXG4gIC8vIG1vbnRoIGFuZCB1c2luZyBhIGRhdGUgb2YgMCB0byBiYWNrIHVwIG9uZSBkYXkgdG8gdGhlIGVuZCBvZiB0aGUgZGVzaXJlZFxuICAvLyBtb250aC5cbiAgY29uc3QgZW5kT2ZEZXNpcmVkTW9udGggPSAoMCwgX2luZGV4Mi5jb25zdHJ1Y3RGcm9tKShkYXRlLCBfZGF0ZS5nZXRUaW1lKCkpO1xuICBlbmRPZkRlc2lyZWRNb250aC5zZXRNb250aChfZGF0ZS5nZXRNb250aCgpICsgYW1vdW50ICsgMSwgMCk7XG4gIGNvbnN0IGRheXNJbk1vbnRoID0gZW5kT2ZEZXNpcmVkTW9udGguZ2V0RGF0ZSgpO1xuICBpZiAoZGF5T2ZNb250aCA+PSBkYXlzSW5Nb250aCkge1xuICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgYXQgdGhlIGVuZCBvZiB0aGUgbW9udGgsIHRoZW4gdGhpcyBpcyB0aGUgY29ycmVjdCBkYXRlXG4gICAgLy8gYW5kIHdlJ3JlIGRvbmUuXG4gICAgcmV0dXJuIGVuZE9mRGVzaXJlZE1vbnRoO1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSwgd2Ugbm93IGtub3cgdGhhdCBzZXR0aW5nIHRoZSBvcmlnaW5hbCBkYXktb2YtbW9udGggdmFsdWUgd29uJ3RcbiAgICAvLyBjYXVzZSBhbiBvdmVyZmxvdywgc28gc2V0IHRoZSBkZXNpcmVkIGRheS1vZi1tb250aC4gTm90ZSB0aGF0IHdlIGNhbid0XG4gICAgLy8ganVzdCBzZXQgdGhlIGRhdGUgb2YgYGVuZE9mRGVzaXJlZE1vbnRoYCBiZWNhdXNlIHRoYXQgb2JqZWN0IG1heSBoYXZlIGhhZFxuICAgIC8vIGl0cyB0aW1lIGNoYW5nZWQgaW4gdGhlIHVudXN1YWwgY2FzZSB3aGVyZSB3aGVyZSBhIERTVCB0cmFuc2l0aW9uIHdhcyBvblxuICAgIC8vIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGggYW5kIGl0cyBsb2NhbCB0aW1lIHdhcyBpbiB0aGUgaG91ciBza2lwcGVkIG9yXG4gICAgLy8gcmVwZWF0ZWQgbmV4dCB0byBhIERTVCB0cmFuc2l0aW9uLiAgU28gd2UgdXNlIGBkYXRlYCBpbnN0ZWFkIHdoaWNoIGlzXG4gICAgLy8gZ3VhcmFudGVlZCB0byBzdGlsbCBoYXZlIHRoZSBvcmlnaW5hbCB0aW1lLlxuICAgIF9kYXRlLnNldEZ1bGxZZWFyKFxuICAgICAgZW5kT2ZEZXNpcmVkTW9udGguZ2V0RnVsbFllYXIoKSxcbiAgICAgIGVuZE9mRGVzaXJlZE1vbnRoLmdldE1vbnRoKCksXG4gICAgICBkYXlPZk1vbnRoLFxuICAgICk7XG4gICAgcmV0dXJuIF9kYXRlO1xuICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkUXVhcnRlcnMgPSBhZGRRdWFydGVycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRNb250aHMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkUXVhcnRlcnNcbiAqIEBjYXRlZ29yeSBRdWFydGVyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFyIHF1YXJ0ZXJzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHllYXIgcXVhcnRlcnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBxdWFydGVycyB0byBiZSBhZGRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgcXVhcnRlcnMgYWRkZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDEgcXVhcnRlciB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkUXVhcnRlcnMobmV3IERhdGUoMjAxNCwgOCwgMSksIDEpXG4gKiAvLz0+IE1vbiBEZWMgMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBhZGRRdWFydGVycyhkYXRlLCBhbW91bnQpIHtcbiAgY29uc3QgbW9udGhzID0gYW1vdW50ICogMztcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkTW9udGhzKShkYXRlLCBtb250aHMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmFkZFNlY29uZHMgPSBhZGRTZWNvbmRzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZE1pbGxpc2Vjb25kcy5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBhZGRTZWNvbmRzXG4gKiBAY2F0ZWdvcnkgU2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBzZWNvbmRzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBzZWNvbmRzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAzMCBzZWNvbmRzIHRvIDEwIEp1bHkgMjAxNCAxMjo0NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFNlY29uZHMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCA0NSwgMCksIDMwKVxuICogLy89PiBUaHUgSnVsIDEwIDIwMTQgMTI6NDU6MzBcbiAqL1xuZnVuY3Rpb24gYWRkU2Vjb25kcyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkTWlsbGlzZWNvbmRzKShkYXRlLCBhbW91bnQgKiAxMDAwKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hZGRXZWVrcyA9IGFkZFdlZWtzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZERheXMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkV2Vla3NcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB3ZWVrcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2Ygd2Vla3MgdG8gYmUgYWRkZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHdlZWtzIGFkZGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA0IHdlZWtzIHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRXZWVrcyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgNClcbiAqIC8vPT4gTW9uIFNlcCAyOSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIGFkZFdlZWtzKGRhdGUsIGFtb3VudCkge1xuICBjb25zdCBkYXlzID0gYW1vdW50ICogNztcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkRGF5cykoZGF0ZSwgZGF5cyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYWRkWWVhcnMgPSBhZGRZZWFycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRNb250aHMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgYWRkWWVhcnNcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHllYXJzIHRvIGJlIGFkZGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSB5ZWFycyBhZGRlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgNSB5ZWFycyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkWWVhcnMobmV3IERhdGUoMjAxNCwgOCwgMSksIDUpXG4gKiAvLz0+IFN1biBTZXAgMDEgMjAxOSAwMDowMDowMFxuICovXG5mdW5jdGlvbiBhZGRZZWFycyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkTW9udGhzKShkYXRlLCBhbW91bnQgKiAxMik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2Vjb25kc0luWWVhciA9XG4gIGV4cG9ydHMuc2Vjb25kc0luV2VlayA9XG4gIGV4cG9ydHMuc2Vjb25kc0luUXVhcnRlciA9XG4gIGV4cG9ydHMuc2Vjb25kc0luTW9udGggPVxuICBleHBvcnRzLnNlY29uZHNJbk1pbnV0ZSA9XG4gIGV4cG9ydHMuc2Vjb25kc0luSG91ciA9XG4gIGV4cG9ydHMuc2Vjb25kc0luRGF5ID1cbiAgZXhwb3J0cy5xdWFydGVyc0luWWVhciA9XG4gIGV4cG9ydHMubW9udGhzSW5ZZWFyID1cbiAgZXhwb3J0cy5tb250aHNJblF1YXJ0ZXIgPVxuICBleHBvcnRzLm1pbnV0ZXNJblllYXIgPVxuICBleHBvcnRzLm1pbnV0ZXNJbk1vbnRoID1cbiAgZXhwb3J0cy5taW51dGVzSW5Ib3VyID1cbiAgZXhwb3J0cy5taW51dGVzSW5EYXkgPVxuICBleHBvcnRzLm1pblRpbWUgPVxuICBleHBvcnRzLm1pbGxpc2Vjb25kc0luV2VlayA9XG4gIGV4cG9ydHMubWlsbGlzZWNvbmRzSW5TZWNvbmQgPVxuICBleHBvcnRzLm1pbGxpc2Vjb25kc0luTWludXRlID1cbiAgZXhwb3J0cy5taWxsaXNlY29uZHNJbkhvdXIgPVxuICBleHBvcnRzLm1pbGxpc2Vjb25kc0luRGF5ID1cbiAgZXhwb3J0cy5tYXhUaW1lID1cbiAgZXhwb3J0cy5kYXlzSW5ZZWFyID1cbiAgZXhwb3J0cy5kYXlzSW5XZWVrID1cbiAgICB2b2lkIDA7IC8qKlxuICogQG1vZHVsZSBjb25zdGFudHNcbiAqIEBzdW1tYXJ5IFVzZWZ1bCBjb25zdGFudHNcbiAqIEBkZXNjcmlwdGlvblxuICogQ29sbGVjdGlvbiBvZiB1c2VmdWwgZGF0ZSBjb25zdGFudHMuXG4gKlxuICogVGhlIGNvbnN0YW50cyBjb3VsZCBiZSBpbXBvcnRlZCBmcm9tIGBkYXRlLWZucy9jb25zdGFudHNgOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBtYXhUaW1lLCBtaW5UaW1lIH0gZnJvbSBcImRhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGZ1bmN0aW9uIGlzQWxsb3dlZFRpbWUodGltZSkge1xuICogICByZXR1cm4gdGltZSA8PSBtYXhUaW1lICYmIHRpbWUgPj0gbWluVGltZTtcbiAqIH1cbiAqIGBgYFxuICovXG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBkYXlzSW5XZWVrXG4gKiBAc3VtbWFyeSBEYXlzIGluIDEgd2Vlay5cbiAqL1xuY29uc3QgZGF5c0luV2VlayA9IChleHBvcnRzLmRheXNJbldlZWsgPSA3KTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIGRheXNJblllYXJcbiAqIEBzdW1tYXJ5IERheXMgaW4gMSB5ZWFyLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSG93IG1hbnkgZGF5cyBpbiBhIHllYXIuXG4gKlxuICogT25lIHllYXJzIGVxdWFscyAzNjUuMjQyNSBkYXlzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYTpcbiAqXG4gKiA+IExlYXAgeWVhciBvY2N1cmVzIGV2ZXJ5IDQgeWVhcnMsIGV4Y2VwdCBmb3IgeWVhcnMgdGhhdCBhcmUgZGl2aXNhYmxlIGJ5IDEwMCBhbmQgbm90IGRpdmlzYWJsZSBieSA0MDAuXG4gKiA+IDEgbWVhbiB5ZWFyID0gKDM2NSsxLzQtMS8xMDArMS80MDApIGRheXMgPSAzNjUuMjQyNSBkYXlzXG4gKi9cbmNvbnN0IGRheXNJblllYXIgPSAoZXhwb3J0cy5kYXlzSW5ZZWFyID0gMzY1LjI0MjUpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWF4VGltZVxuICogQHN1bW1hcnkgTWF4aW11bSBhbGxvd2VkIHRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IG1heFRpbWUgfSBmcm9tIFwiZGF0ZS1mbnMvY29uc3RhbnRzXCI7XG4gKlxuICogY29uc3QgaXNWYWxpZCA9IDg2NDAwMDAwMDAwMDAwMDEgPD0gbWF4VGltZTtcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBuZXcgRGF0ZSg4NjQwMDAwMDAwMDAwMDAxKTtcbiAqIC8vPT4gSW52YWxpZCBEYXRlXG4gKi9cbmNvbnN0IG1heFRpbWUgPSAoZXhwb3J0cy5tYXhUaW1lID0gTWF0aC5wb3coMTAsIDgpICogMjQgKiA2MCAqIDYwICogMTAwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW5UaW1lXG4gKiBAc3VtbWFyeSBNaW5pbXVtIGFsbG93ZWQgdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbWluVGltZSB9IGZyb20gXCJkYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBjb25zdCBpc1ZhbGlkID0gLTg2NDAwMDAwMDAwMDAwMDEgPj0gbWluVGltZTtcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBuZXcgRGF0ZSgtODY0MDAwMDAwMDAwMDAwMSlcbiAqIC8vPT4gSW52YWxpZCBEYXRlXG4gKi9cbmNvbnN0IG1pblRpbWUgPSAoZXhwb3J0cy5taW5UaW1lID0gLW1heFRpbWUpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5XZWVrXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSB3ZWVrLlxuICovXG5jb25zdCBtaWxsaXNlY29uZHNJbldlZWsgPSAoZXhwb3J0cy5taWxsaXNlY29uZHNJbldlZWsgPSA2MDQ4MDAwMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5EYXlcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIGRheS5cbiAqL1xuY29uc3QgbWlsbGlzZWNvbmRzSW5EYXkgPSAoZXhwb3J0cy5taWxsaXNlY29uZHNJbkRheSA9IDg2NDAwMDAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luTWludXRlXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBtaW51dGVcbiAqL1xuY29uc3QgbWlsbGlzZWNvbmRzSW5NaW51dGUgPSAoZXhwb3J0cy5taWxsaXNlY29uZHNJbk1pbnV0ZSA9IDYwMDAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luSG91clxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgaG91clxuICovXG5jb25zdCBtaWxsaXNlY29uZHNJbkhvdXIgPSAoZXhwb3J0cy5taWxsaXNlY29uZHNJbkhvdXIgPSAzNjAwMDAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luU2Vjb25kXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBzZWNvbmRcbiAqL1xuY29uc3QgbWlsbGlzZWNvbmRzSW5TZWNvbmQgPSAoZXhwb3J0cy5taWxsaXNlY29uZHNJblNlY29uZCA9IDEwMDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luWWVhclxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIHllYXIuXG4gKi9cbmNvbnN0IG1pbnV0ZXNJblllYXIgPSAoZXhwb3J0cy5taW51dGVzSW5ZZWFyID0gNTI1NjAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbk1vbnRoXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgbW9udGguXG4gKi9cbmNvbnN0IG1pbnV0ZXNJbk1vbnRoID0gKGV4cG9ydHMubWludXRlc0luTW9udGggPSA0MzIwMCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5EYXlcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSBkYXkuXG4gKi9cbmNvbnN0IG1pbnV0ZXNJbkRheSA9IChleHBvcnRzLm1pbnV0ZXNJbkRheSA9IDE0NDApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luSG91clxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIGhvdXIuXG4gKi9cbmNvbnN0IG1pbnV0ZXNJbkhvdXIgPSAoZXhwb3J0cy5taW51dGVzSW5Ib3VyID0gNjApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbW9udGhzSW5RdWFydGVyXG4gKiBAc3VtbWFyeSBNb250aHMgaW4gMSBxdWFydGVyLlxuICovXG5jb25zdCBtb250aHNJblF1YXJ0ZXIgPSAoZXhwb3J0cy5tb250aHNJblF1YXJ0ZXIgPSAzKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1vbnRoc0luWWVhclxuICogQHN1bW1hcnkgTW9udGhzIGluIDEgeWVhci5cbiAqL1xuY29uc3QgbW9udGhzSW5ZZWFyID0gKGV4cG9ydHMubW9udGhzSW5ZZWFyID0gMTIpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgcXVhcnRlcnNJblllYXJcbiAqIEBzdW1tYXJ5IFF1YXJ0ZXJzIGluIDEgeWVhclxuICovXG5jb25zdCBxdWFydGVyc0luWWVhciA9IChleHBvcnRzLnF1YXJ0ZXJzSW5ZZWFyID0gNCk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5Ib3VyXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgaG91ci5cbiAqL1xuY29uc3Qgc2Vjb25kc0luSG91ciA9IChleHBvcnRzLnNlY29uZHNJbkhvdXIgPSAzNjAwKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbk1pbnV0ZVxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIG1pbnV0ZS5cbiAqL1xuY29uc3Qgc2Vjb25kc0luTWludXRlID0gKGV4cG9ydHMuc2Vjb25kc0luTWludXRlID0gNjApO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luRGF5XG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgZGF5LlxuICovXG5jb25zdCBzZWNvbmRzSW5EYXkgPSAoZXhwb3J0cy5zZWNvbmRzSW5EYXkgPSBzZWNvbmRzSW5Ib3VyICogMjQpO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luV2Vla1xuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIHdlZWsuXG4gKi9cbmNvbnN0IHNlY29uZHNJbldlZWsgPSAoZXhwb3J0cy5zZWNvbmRzSW5XZWVrID0gc2Vjb25kc0luRGF5ICogNyk7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5ZZWFyXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgeWVhci5cbiAqL1xuY29uc3Qgc2Vjb25kc0luWWVhciA9IChleHBvcnRzLnNlY29uZHNJblllYXIgPSBzZWNvbmRzSW5EYXkgKiBkYXlzSW5ZZWFyKTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbk1vbnRoXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgbW9udGhcbiAqL1xuY29uc3Qgc2Vjb25kc0luTW9udGggPSAoZXhwb3J0cy5zZWNvbmRzSW5Nb250aCA9IHNlY29uZHNJblllYXIgLyAxMik7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5RdWFydGVyXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgcXVhcnRlci5cbiAqL1xuY29uc3Qgc2Vjb25kc0luUXVhcnRlciA9IChleHBvcnRzLnNlY29uZHNJblF1YXJ0ZXIgPSBzZWNvbmRzSW5Nb250aCAqIDMpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmNvbnN0cnVjdEZyb20gPSBjb25zdHJ1Y3RGcm9tO1xuXG4vKipcbiAqIEBuYW1lIGNvbnN0cnVjdEZyb21cbiAqIEBjYXRlZ29yeSBHZW5lcmljIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IENvbnN0cnVjdHMgYSBkYXRlIHVzaW5nIHRoZSByZWZlcmVuY2UgZGF0ZSBhbmQgdGhlIHZhbHVlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgZnVuY3Rpb24gY29uc3RydWN0cyBhIG5ldyBkYXRlIHVzaW5nIHRoZSBjb25zdHJ1Y3RvciBmcm9tIHRoZSByZWZlcmVuY2VcbiAqIGRhdGUgYW5kIHRoZSBnaXZlbiB2YWx1ZS4gSXQgaGVscHMgdG8gYnVpbGQgZ2VuZXJpYyBmdW5jdGlvbnMgdGhhdCBhY2NlcHRcbiAqIGRhdGUgZXh0ZW5zaW9ucy5cbiAqXG4gKiBJdCBkZWZhdWx0cyB0byBgRGF0ZWAgaWYgdGhlIHBhc3NlZCByZWZlcmVuY2UgZGF0ZSBpcyBhIG51bWJlciBvciBhIHN0cmluZy5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSByZWZlcmVuY2UgZGF0ZSB0byB0YWtlIGNvbnN0cnVjdG9yIGZyb21cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjcmVhdGUgdGhlIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBEYXRlIGluaXRpYWxpemVkIHVzaW5nIHRoZSBnaXZlbiBkYXRlIGFuZCB2YWx1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSAnZGF0ZS1mbnMnXG4gKlxuICogLy8gQSBmdW5jdGlvbiB0aGF0IGNsb25lcyBhIGRhdGUgcHJlc2VydmluZyB0aGUgb3JpZ2luYWwgdHlwZVxuICogZnVuY3Rpb24gY2xvbmVEYXRlPERhdGVUeXBlIGV4dGVuZHMgRGF0ZShkYXRlOiBEYXRlVHlwZSk6IERhdGVUeXBlIHtcbiAqICAgcmV0dXJuIGNvbnN0cnVjdEZyb20oXG4gKiAgICAgZGF0ZSwgLy8gVXNlIGNvbnRydXN0b3IgZnJvbSB0aGUgZ2l2ZW4gZGF0ZVxuICogICAgIGRhdGUuZ2V0VGltZSgpIC8vIFVzZSB0aGUgZGF0ZSB2YWx1ZSB0byBjcmVhdGUgYSBuZXcgZGF0ZVxuICogICApXG4gKiB9XG4gKi9cbmZ1bmN0aW9uIGNvbnN0cnVjdEZyb20oZGF0ZSwgdmFsdWUpIHtcbiAgaWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBkYXRlLmNvbnN0cnVjdG9yKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZkRheS5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vX2xpYi9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5c1xuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy4gVGhpcyBtZWFucyB0aGF0IHRoZSB0aW1lcyBhcmUgcmVtb3ZlZFxuICogZnJvbSB0aGUgZGF0ZXMgYW5kIHRoZW4gdGhlIGRpZmZlcmVuY2UgaW4gZGF5cyBpcyBjYWxjdWxhdGVkLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIGVhcmxpZXIgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgY2FsZW5kYXIgZGF5c1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciBkYXlzIGFyZSBiZXR3ZWVuXG4gKiAvLyAyIEp1bHkgMjAxMSAyMzowMDowMCBhbmQgMiBKdWx5IDIwMTIgMDA6MDA6MDA/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoXG4gKiAgIG5ldyBEYXRlKDIwMTIsIDYsIDIsIDAsIDApLFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAyLCAyMywgMClcbiAqIClcbiAqIC8vPT4gMzY2XG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciBkYXlzIGFyZSBiZXR3ZWVuXG4gKiAvLyAyIEp1bHkgMjAxMSAyMzo1OTowMCBhbmQgMyBKdWx5IDIwMTEgMDA6MDE6MDA/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDMsIDAsIDEpLFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAyLCAyMywgNTkpXG4gKiApXG4gKiAvLz0+IDFcbiAqL1xuZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3Qgc3RhcnRPZkRheUxlZnQgPSAoMCwgX2luZGV4Mi5zdGFydE9mRGF5KShkYXRlTGVmdCk7XG4gIGNvbnN0IHN0YXJ0T2ZEYXlSaWdodCA9ICgwLCBfaW5kZXgyLnN0YXJ0T2ZEYXkpKGRhdGVSaWdodCk7XG5cbiAgY29uc3QgdGltZXN0YW1wTGVmdCA9XG4gICAgK3N0YXJ0T2ZEYXlMZWZ0IC1cbiAgICAoMCwgX2luZGV4My5nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKShzdGFydE9mRGF5TGVmdCk7XG4gIGNvbnN0IHRpbWVzdGFtcFJpZ2h0ID1cbiAgICArc3RhcnRPZkRheVJpZ2h0IC1cbiAgICAoMCwgX2luZGV4My5nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKShzdGFydE9mRGF5UmlnaHQpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGJlY2F1c2UgdGhlIG51bWJlciBvZlxuICAvLyBtaWxsaXNlY29uZHMgaW4gYSBkYXkgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKFxuICAgICh0aW1lc3RhbXBMZWZ0IC0gdGltZXN0YW1wUmlnaHQpIC8gX2luZGV4Lm1pbGxpc2Vjb25kc0luRGF5LFxuICApO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgbW9udGhzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgbW9udGhzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIGVhcmxpZXIgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgY2FsZW5kYXIgbW9udGhzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIG1vbnRocyBhcmUgYmV0d2VlbiAzMSBKYW51YXJ5IDIwMTQgYW5kIDEgU2VwdGVtYmVyIDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhcbiAqICAgbmV3IERhdGUoMjAxNCwgOCwgMSksXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDAsIDMxKVxuICogKVxuICogLy89PiA4XG4gKi9cbmZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgX2RhdGVMZWZ0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVMZWZ0KTtcbiAgY29uc3QgX2RhdGVSaWdodCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlUmlnaHQpO1xuXG4gIGNvbnN0IHllYXJEaWZmID0gX2RhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgLSBfZGF0ZVJpZ2h0LmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG1vbnRoRGlmZiA9IF9kYXRlTGVmdC5nZXRNb250aCgpIC0gX2RhdGVSaWdodC5nZXRNb250aCgpO1xuXG4gIHJldHVybiB5ZWFyRGlmZiAqIDEyICsgbW9udGhEaWZmO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmRpZmZlcmVuY2VJbkNhbGVuZGFyUXVhcnRlcnMgPSBkaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2dldFF1YXJ0ZXIuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBxdWFydGVycyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHF1YXJ0ZXJzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIGVhcmxpZXIgZGF0ZVxuXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNhbGVuZGFyIHF1YXJ0ZXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIHF1YXJ0ZXJzIGFyZSBiZXR3ZWVuIDMxIERlY2VtYmVyIDIwMTMgYW5kIDIgSnVseSAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJRdWFydGVycyhcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMiksXG4gKiAgIG5ldyBEYXRlKDIwMTMsIDExLCAzMSlcbiAqIClcbiAqIC8vPT4gM1xuICovXG5mdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhclF1YXJ0ZXJzKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgX2RhdGVMZWZ0ID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlTGVmdCk7XG4gIGNvbnN0IF9kYXRlUmlnaHQgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGVSaWdodCk7XG5cbiAgY29uc3QgeWVhckRpZmYgPSBfZGF0ZUxlZnQuZ2V0RnVsbFllYXIoKSAtIF9kYXRlUmlnaHQuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgcXVhcnRlckRpZmYgPVxuICAgICgwLCBfaW5kZXguZ2V0UXVhcnRlcikoX2RhdGVMZWZ0KSAtICgwLCBfaW5kZXguZ2V0UXVhcnRlcikoX2RhdGVSaWdodCk7XG5cbiAgcmV0dXJuIHllYXJEaWZmICogNCArIHF1YXJ0ZXJEaWZmO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmRpZmZlcmVuY2VJbkNhbGVuZGFyWWVhcnMgPSBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciB5ZWFycyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHllYXJzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIGVhcmxpZXIgZGF0ZVxuXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNhbGVuZGFyIHllYXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIHllYXJzIGFyZSBiZXR3ZWVuIDMxIERlY2VtYmVyIDIwMTMgYW5kIDExIEZlYnJ1YXJ5IDIwMTU/XG4gKiBjb25zdCByZXN1bHQgPSBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKFxuICogICBuZXcgRGF0ZSgyMDE1LCAxLCAxMSksXG4gKiAgIG5ldyBEYXRlKDIwMTMsIDExLCAzMSlcbiAqIClcbiAqIC8vPT4gMlxuICovXG5mdW5jdGlvbiBkaWZmZXJlbmNlSW5DYWxlbmRhclllYXJzKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgX2RhdGVMZWZ0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVMZWZ0KTtcbiAgY29uc3QgX2RhdGVSaWdodCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlUmlnaHQpO1xuXG4gIHJldHVybiBfZGF0ZUxlZnQuZ2V0RnVsbFllYXIoKSAtIF9kYXRlUmlnaHQuZ2V0RnVsbFllYXIoKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5lbmRPZkRheSA9IGVuZE9mRGF5O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBlbmRPZkRheVxuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGVuZCBvZiBhIGRheSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGVuZCBvZiBhIGRheSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZW5kIG9mIGEgZGF5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBlbmQgb2YgYSBkYXkgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBlbmRPZkRheShuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBUdWUgU2VwIDAyIDIwMTQgMjM6NTk6NTkuOTk5XG4gKi9cbmZ1bmN0aW9uIGVuZE9mRGF5KGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5lbmRPZk1vbnRoID0gZW5kT2ZNb250aDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZW5kT2ZNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZW5kIG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBlbmQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZW5kIG9mIGEgbW9udGhcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIGVuZCBvZiBhIG1vbnRoIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBUdWUgU2VwIDMwIDIwMTQgMjM6NTk6NTkuOTk5XG4gKi9cbmZ1bmN0aW9uIGVuZE9mTW9udGgoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgbW9udGggPSBfZGF0ZS5nZXRNb250aCgpO1xuICBfZGF0ZS5zZXRGdWxsWWVhcihfZGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aCArIDEsIDApO1xuICBfZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZW5kT2ZXZWVrID0gZW5kT2ZXZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCIpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZW5kT2ZXZWVrfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZW5kT2ZXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGVuZCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBlbmQgb2YgYSB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGVuZCBvZiBhIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIGVuZCBvZiBhIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBlbmRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gU2F0IFNlcCAwNiAyMDE0IDIzOjU5OjU5Ljk5OVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0aGUgd2VlayBzdGFydHMgb24gTW9uZGF5LCB0aGUgZW5kIG9mIHRoZSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCksIHsgd2Vla1N0YXJ0c09uOiAxIH0pXG4gKiAvLz0+IFN1biBTZXAgMDcgMjAxNCAyMzo1OTo1OS45OTlcbiAqL1xuZnVuY3Rpb24gZW5kT2ZXZWVrKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4Mi5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgY29uc3Qgd2Vla1N0YXJ0c09uID1cbiAgICBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgMDtcblxuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7XG4gIGNvbnN0IGRpZmYgPSAoZGF5IDwgd2Vla1N0YXJ0c09uID8gLTcgOiAwKSArIDYgLSAoZGF5IC0gd2Vla1N0YXJ0c09uKTtcblxuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSArIGRpZmYpO1xuICBfZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZW5kT2ZZZWFyID0gZW5kT2ZZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBlbmRPZlllYXJcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZW5kIG9mIGEgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGVuZCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGVuZCBvZiBhIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIGVuZCBvZiBhIHllYXIgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBlbmRPZlllYXIobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwMCkpXG4gKiAvLz0+IFdlZCBEZWMgMzEgMjAxNCAyMzo1OTo1OS45OTlcbiAqL1xuZnVuY3Rpb24gZW5kT2ZZZWFyKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBfZGF0ZS5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgMCk7XG4gIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5mb3JtYXQgPSBleHBvcnRzLmZvcm1hdERhdGUgPSBmb3JtYXQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJmb3JtYXR0ZXJzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9pbmRleDMuZm9ybWF0dGVycztcbiAgfSxcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibG9uZ0Zvcm1hdHRlcnNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2luZGV4NC5sb25nRm9ybWF0dGVycztcbiAgfSxcbn0pO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdExvY2FsZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vX2xpYi9mb3JtYXQvZm9ybWF0dGVycy5qc1wiKTtcbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vX2xpYi9mb3JtYXQvbG9uZ0Zvcm1hdHRlcnMuanNcIik7XG52YXIgX2luZGV4NSA9IHJlcXVpcmUoXCIuL19saWIvcHJvdGVjdGVkVG9rZW5zLmpzXCIpO1xuXG52YXIgX2luZGV4NiA9IHJlcXVpcmUoXCIuL2lzVmFsaWQuanNcIik7XG52YXIgX2luZGV4NyA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLy8gUmV4cG9ydHMgb2YgaW50ZXJuYWwgZm9yIGxpYnJhcmllcyB0byB1c2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzYzOCNpc3N1ZWNvbW1lbnQtMTg3NzA4Mjg3NFxuXG4vLyBUaGlzIFJlZ0V4cCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyBzZXBhcmF0ZWQgYnkgYHxgOlxuLy8gLSBbeVlRcU1Md0lkRGVjaWhIS2ttc11vIG1hdGNoZXMgYW55IGF2YWlsYWJsZSBvcmRpbmFsIG51bWJlciB0b2tlblxuLy8gICAob25lIG9mIHRoZSBjZXJ0YWluIGxldHRlcnMgZm9sbG93ZWQgYnkgYG9gKVxuLy8gLSAoXFx3KVxcMSogbWF0Y2hlcyBhbnkgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIGxldHRlclxuLy8gLSAnJyBtYXRjaGVzIHR3byBxdW90ZSBjaGFyYWN0ZXJzIGluIGEgcm93XG4vLyAtICcoJyd8W14nXSkrKCd8JCkgbWF0Y2hlcyBhbnl0aGluZyBzdXJyb3VuZGVkIGJ5IHR3byBxdW90ZSBjaGFyYWN0ZXJzICgnKSxcbi8vICAgZXhjZXB0IGEgc2luZ2xlIHF1b3RlIHN5bWJvbCwgd2hpY2ggZW5kcyB0aGUgc2VxdWVuY2UuXG4vLyAgIFR3byBxdW90ZSBjaGFyYWN0ZXJzIGRvIG5vdCBlbmQgdGhlIHNlcXVlbmNlLlxuLy8gICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzaW5nbGUgcXVvdGVcbi8vICAgdGhlbiB0aGUgc2VxdWVuY2Ugd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG4vLyAtIC4gbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciB1bm1hdGNoZWQgYnkgcHJldmlvdXMgcGFydHMgb2YgdGhlIFJlZ0V4cHNcbmNvbnN0IGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPVxuICAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXFx3KVxcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbi8vIFRoaXMgUmVnRXhwIGNhdGNoZXMgc3ltYm9scyBlc2NhcGVkIGJ5IHF1b3RlcywgYW5kIGFsc29cbi8vIHNlcXVlbmNlcyBvZiBzeW1ib2xzIFAsIHAsIGFuZCB0aGUgY29tYmluYXRpb25zIGxpa2UgYFBQUFBQUFBwcHBwcGBcbmNvbnN0IGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbmNvbnN0IGVzY2FwZWRTdHJpbmdSZWdFeHAgPSAvXicoW15dKj8pJz8kLztcbmNvbnN0IGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG5jb25zdCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCA9IC9bYS16QS1aXS87XG5cbi8qKlxuICogVGhlIHtAbGluayBmb3JtYXR9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBmb3JtYXRcbiAqIEBhbGlhcyBmb3JtYXREYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEZvcm1hdCB0aGUgZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nIGluIHRoZSBnaXZlbiBmb3JtYXQuIFRoZSByZXN1bHQgbWF5IHZhcnkgYnkgbG9jYWxlLlxuICpcbiAqID4g4pqg77iPIFBsZWFzZSBub3RlIHRoYXQgdGhlIGBmb3JtYXRgIHRva2VucyBkaWZmZXIgZnJvbSBNb21lbnQuanMgYW5kIG90aGVyIGxpYnJhcmllcy5cbiAqID4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogVGhlIGNoYXJhY3RlcnMgd3JhcHBlZCBiZXR3ZWVuIHR3byBzaW5nbGUgcXVvdGVzIGNoYXJhY3RlcnMgKCcpIGFyZSBlc2NhcGVkLlxuICogVHdvIHNpbmdsZSBxdW90ZXMgaW4gYSByb3csIHdoZXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgYSBxdW90ZWQgc2VxdWVuY2UsIHJlcHJlc2VudCBhICdyZWFsJyBzaW5nbGUgcXVvdGUuXG4gKiAoc2VlIHRoZSBsYXN0IGV4YW1wbGUpXG4gKlxuICogRm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYmFzZWQgb24gVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuICogd2l0aCBhIGZldyBhZGRpdGlvbnMgKHNlZSBub3RlIDcgYmVsb3cgdGhlIHRhYmxlKS5cbiAqXG4gKiBBY2NlcHRlZCBwYXR0ZXJuczpcbiAqIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBhdHRlcm4gfCBSZXN1bHQgZXhhbXBsZXMgICAgICAgICAgICAgICAgICAgfCBOb3RlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfFxuICogfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRy4uR0dHICB8IEFELCBCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0cgICAgfCBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHRyAgIHwgQSwgQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDYWxlbmRhciB5ZWFyICAgICAgICAgICAgICAgICAgIHwgeSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHlvICAgICAgfCA0NHRoLCAxc3QsIDB0aCwgMTd0aCAgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5ICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5eSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgIHwgWSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgMjAxN3RoICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZWSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgIHwgUiAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSICAgICAgfCAtNDMsIDAwLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlIgICAgIHwgLTA0MywgMDAwLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUiAgICB8IC0wMDQzLCAwMDAwLCAwMDAxLCAxOTAwLCAyMDE3ICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlJSICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUsNyB8XG4gKiB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICAgfCB1ICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXUgICAgICB8IC00MywgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dSAgICAgfCAtMDQzLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1ICAgIHwgLTAwNDMsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dXUgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgUXVhcnRlciAoZm9ybWF0dGluZykgICAgICAgICAgICB8IFEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUVEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgUXVhcnRlciAoc3RhbmQtYWxvbmUpICAgICAgICAgICB8IHEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcXEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgTW9udGggKGZvcm1hdHRpbmcpICAgICAgICAgICAgICB8IE0gICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU0gICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTSAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTU0gICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTW9udGggKHN0YW5kLWFsb25lKSAgICAgICAgICAgICB8IEwgICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTEwgICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTEwgICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgICB8IHcgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3byAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd3cgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgICB8IEkgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUkgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgICB8IGQgICAgICAgfCAxLCAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzFzdCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGQgICAgICB8IDAxLCAwMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgICB8IEQgICAgICAgfCAxLCAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzY1dGgsIDM2NnRoICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREQgICAgICB8IDAxLCAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERERCAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREREICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBEYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgICAgIHwgRS4uRUVFICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUVFICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICB8IGkgICAgICAgfCAxLCAyLCAzLCAuLi4sIDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgN3RoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWkgICAgICB8IDAxLCAwMiwgLi4uLCAwNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWkgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpaSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCA3ICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgfCBlICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW8gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWUgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZWUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoc3RhbmQtYWxvbmUpIHwgYyAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYyAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2MgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjYyAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2NjICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEuLmFhICAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWEgICAgIHwgYW0sIHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYSAgICB8IGEubS4sIHAubS4gICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWFhICAgfCBhLCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgfCBiLi5iYiAgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiICAgICB8IGFtLCBwbSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmIgICAgfCBhLm0uLCBwLm0uLCBub29uLCBtaWRuaWdodCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiYiAgIHwgYSwgcCwgbiwgbWkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgIHwgQi4uQkJCICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkIgICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCQiAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgIHwgaCAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAxMnRoICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaCAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgIHwgSCAgICAgICB8IDAsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhvICAgICAgfCAwdGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgIHwgMDAsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgIHwgSyAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAwdGggICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLSyAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgIHwgayAgICAgICB8IDI0LCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtvICAgICAgfCAyNHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrayAgICAgIHwgMjQsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbSAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1vICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbSAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcyAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNvICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzcyAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgIHwgUyAgICAgICB8IDAsIDEsIC4uLiwgOSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1MgICAgIHwgMDAwLCAwMDEsIC4uLiwgOTk5ICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTUyAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvIFopICAgICAgICB8IFggICAgICAgfCAtMDgsICswNTMwLCBaICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWCAgICAgIHwgLTA4MDAsICswNTMwLCBaICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYICAgICB8IC0wODowMCwgKzA1OjMwLCBaICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFggICAgfCAtMDgwMCwgKzA1MzAsIFosICsxMjM0NTYgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYWCAgIHwgLTA4OjAwLCArMDU6MzAsIFosICsxMjozNDo1NiAgICAgIHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgIHwgeCAgICAgICB8IC0wOCwgKzA1MzAsICswMCAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4ICAgICAgfCAtMDgwMCwgKzA1MzAsICswMDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHggICAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eCAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAsICsxMjM0NTYgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHh4ICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwLCArMTI6MzQ6NTYgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICAgfCBPLi4uT09PIHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT09PTyAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIgICAgIHxcbiAqIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pICB8IHouLi56enogfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCA2ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiw2ICAgfFxuICogfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgIHwgdCAgICAgICB8IDUxMjk2OTUyMCAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR0ICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgfCBUICAgICAgIHwgNTEyOTY5NTIwOTAwICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgICB8IFAgICAgICAgfCAwNC8yOS8xNDUzICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUCAgICAgIHwgQXByIDI5LCAxNDUzICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQICAgICB8IEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFAgICAgfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICAgfCBwICAgICAgIHwgMTI6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHAgICAgICB8IDEyOjAwOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcCAgICAgfCAxMjowMDowMCBBTSBHTVQrMiAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHBwICAgIHwgMTI6MDA6MDAgQU0gR01UKzAyOjAwICAgICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBDb21iaW5hdGlvbiBvZiBkYXRlIGFuZCB0aW1lICAgIHwgUHAgICAgICB8IDA0LzI5LzE0NTMsIDEyOjAwIEFNICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQcHAgICAgfCBBcHIgMjksIDE0NTMsIDEyOjAwOjAwIEFNICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBwcHAgIHwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUHBwcHB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICB8IDIsNyAgIHxcbiAqIE5vdGVzOlxuICogMS4gXCJGb3JtYXR0aW5nXCIgdW5pdHMgKGUuZy4gZm9ybWF0dGluZyBxdWFydGVyKSBpbiB0aGUgZGVmYXVsdCBlbi1VUyBsb2NhbGVcbiAqICAgIGFyZSB0aGUgc2FtZSBhcyBcInN0YW5kLWFsb25lXCIgdW5pdHMsIGJ1dCBhcmUgZGlmZmVyZW50IGluIHNvbWUgbGFuZ3VhZ2VzLlxuICogICAgXCJGb3JtYXR0aW5nXCIgdW5pdHMgYXJlIGRlY2xpbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGxhbmd1YWdlXG4gKiAgICBpbiB0aGUgY29udGV4dCBvZiBhIGRhdGUuIFwiU3RhbmQtYWxvbmVcIiB1bml0cyBhcmUgYWx3YXlzIG5vbWluYXRpdmUgc2luZ3VsYXI6XG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBMTExMJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZCdgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBNTU1NJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZHUnYFxuICpcbiAqIDIuIEFueSBzZXF1ZW5jZSBvZiB0aGUgaWRlbnRpY2FsIGxldHRlcnMgaXMgYSBwYXR0ZXJuLCB1bmxlc3MgaXQgaXMgZXNjYXBlZCBieVxuICogICAgdGhlIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIChzZWUgYmVsb3cpLlxuICogICAgSWYgdGhlIHNlcXVlbmNlIGlzIGxvbmdlciB0aGFuIGxpc3RlZCBpbiB0YWJsZSAoZS5nLiBgRUVFRUVFRUVFRUVgKVxuICogICAgdGhlIG91dHB1dCB3aWxsIGJlIHRoZSBzYW1lIGFzIGRlZmF1bHQgcGF0dGVybiBmb3IgdGhpcyB1bml0LCB1c3VhbGx5XG4gKiAgICB0aGUgbG9uZ2VzdCBvbmUgKGluIGNhc2Ugb2YgSVNPIHdlZWtkYXlzLCBgRUVFRWApLiBEZWZhdWx0IHBhdHRlcm5zIGZvciB1bml0c1xuICogICAgYXJlIG1hcmtlZCB3aXRoIFwiMlwiIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgdGFibGUuXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU0nKSAvLz0+ICdOb3YnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NJykgLy89PiAnTidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqIDMuIFNvbWUgcGF0dGVybnMgY291bGQgYmUgdW5saW1pdGVkIGxlbmd0aCAoc3VjaCBhcyBgeXl5eXl5eXlgKS5cbiAqICAgIFRoZSBvdXRwdXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAneXl5eXl5eXknKSAvLz0+ICcwMDAwMjAxNydgXG4gKlxuICogNC4gYFFRUVFRYCBhbmQgYHFxcXFxYCBjb3VsZCBiZSBub3Qgc3RyaWN0bHkgbnVtZXJpY2FsIGluIHNvbWUgbG9jYWxlcy5cbiAqICAgIFRoZXNlIHRva2VucyByZXByZXNlbnQgdGhlIHNob3J0ZXN0IGZvcm0gb2YgdGhlIHF1YXJ0ZXIuXG4gKlxuICogNS4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIHBhdHRlcm5zIGFyZSBCLkMuIHllYXJzOlxuICpcbiAqICAgIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICogICAgfCBBQyAxIHwgICAxIHwgICAxIHxcbiAqICAgIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gKiAgICB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICpcbiAqICAgIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAqICAgIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZDpcbiAqXG4gKiAgICB8IFllYXIgfCBgeXlgIHwgYHV1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18XG4gKiAgICB8IDEgICAgfCAgIDAxIHwgICAwMSB8XG4gKiAgICB8IDE0ICAgfCAgIDE0IHwgICAxNCB8XG4gKiAgICB8IDM3NiAgfCAgIDc2IHwgIDM3NiB8XG4gKiAgICB8IDE0NTMgfCAgIDUzIHwgMTQ1MyB8XG4gKlxuICogICAgVGhlIHNhbWUgZGlmZmVyZW5jZSBpcyB0cnVlIGZvciBsb2NhbCBhbmQgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJzIChgWWAgYW5kIGBSYCksXG4gKiAgICBleGNlcHQgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcnMgYXJlIGRlcGVuZGVudCBvbiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gXG4gKiAgICBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAoY29tcGFyZSBbZ2V0SVNPV2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0SVNPV2Vla1llYXIpXG4gKiAgICBhbmQgW2dldFdlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldFdlZWtZZWFyKSkuXG4gKlxuICogNi4gU3BlY2lmaWMgbm9uLWxvY2F0aW9uIHRpbWV6b25lcyBhcmUgY3VycmVudGx5IHVuYXZhaWxhYmxlIGluIGBkYXRlLWZuc2AsXG4gKiAgICBzbyByaWdodCBub3cgdGhlc2UgdG9rZW5zIGZhbGwgYmFjayB0byBHTVQgdGltZXpvbmVzLlxuICpcbiAqIDcuIFRoZXNlIHBhdHRlcm5zIGFyZSBub3QgaW4gdGhlIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqICAgIC0gYGlgOiBJU08gZGF5IG9mIHdlZWtcbiAqICAgIC0gYElgOiBJU08gd2VlayBvZiB5ZWFyXG4gKiAgICAtIGBSYDogSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqICAgIC0gYHRgOiBzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgVGA6IG1pbGxpc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYG9gOiBvcmRpbmFsIG51bWJlciBtb2RpZmllclxuICogICAgLSBgUGA6IGxvbmcgbG9jYWxpemVkIGRhdGVcbiAqICAgIC0gYHBgOiBsb25nIGxvY2FsaXplZCB0aW1lXG4gKlxuICogOC4gYFlZYCBhbmQgYFlZWVlgIHRva2VucyByZXByZXNlbnQgd2Vlay1udW1iZXJpbmcgeWVhcnMgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggeWVhcnMuXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiA5LiBgRGAgYW5kIGBERGAgdG9rZW5zIHJlcHJlc2VudCBkYXlzIG9mIHRoZSB5ZWFyIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIGRheXMgb2YgdGhlIG1vbnRoLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbERheU9mWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBmb3JtYXQgLSBUaGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZ1xuICpcbiAqIEB0aHJvd3MgYGRhdGVgIG11c3Qgbm90IGJlIEludmFsaWQgRGF0ZVxuICogQHRocm93cyBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbG9jYWxpemVgIHByb3BlcnR5XG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBmb3JtYXRMb25nYCBwcm9wZXJ0eVxuICogQHRocm93cyB1c2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGRgIGluc3RlYWQgb2YgYEREYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMTEgRmVicnVhcnkgMjAxNCBpbiBtaWRkbGUtZW5kaWFuIGZvcm1hdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCAxLCAxMSksICdNTS9kZC95eXl5JylcbiAqIC8vPT4gJzAyLzExLzIwMTQnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAyIEp1bHkgMjAxNCBpbiBFc3BlcmFudG86XG4gKiBpbXBvcnQgeyBlb0xvY2FsZSB9IGZyb20gJ2RhdGUtZm5zL2xvY2FsZS9lbydcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgXCJkbyAnZGUnIE1NTU0geXl5eVwiLCB7XG4gKiAgIGxvY2FsZTogZW9Mb2NhbGVcbiAqIH0pXG4gKiAvLz0+ICcyLWEgZGUganVsaW8gMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIHN0cmluZyBieSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyczpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxNSksIFwiaCAnbycnY2xvY2snXCIpXG4gKiAvLz0+IFwiMyBvJ2Nsb2NrXCJcbiAqL1xuZnVuY3Rpb24gZm9ybWF0KGRhdGUsIGZvcm1hdFN0ciwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9ICgwLCBfaW5kZXgyLmdldERlZmF1bHRPcHRpb25zKSgpO1xuICBjb25zdCBsb2NhbGUgPVxuICAgIG9wdGlvbnM/LmxvY2FsZSA/PyBkZWZhdWx0T3B0aW9ucy5sb2NhbGUgPz8gX2luZGV4LmRlZmF1bHRMb2NhbGU7XG5cbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IG9yaWdpbmFsRGF0ZSA9ICgwLCBfaW5kZXg3LnRvRGF0ZSkoZGF0ZSk7XG5cbiAgaWYgKCEoMCwgX2luZGV4Ni5pc1ZhbGlkKShvcmlnaW5hbERhdGUpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHRpbWUgdmFsdWVcIik7XG4gIH1cblxuICBsZXQgcGFydHMgPSBmb3JtYXRTdHJcbiAgICAubWF0Y2gobG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHApXG4gICAgLm1hcCgoc3Vic3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHN1YnN0cmluZ1swXTtcbiAgICAgIGlmIChmaXJzdENoYXJhY3RlciA9PT0gXCJwXCIgfHwgZmlyc3RDaGFyYWN0ZXIgPT09IFwiUFwiKSB7XG4gICAgICAgIGNvbnN0IGxvbmdGb3JtYXR0ZXIgPSBfaW5kZXg0LmxvbmdGb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICAgICAgcmV0dXJuIGxvbmdGb3JtYXR0ZXIoc3Vic3RyaW5nLCBsb2NhbGUuZm9ybWF0TG9uZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RyaW5nO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcIilcbiAgICAubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlcGxhY2UgdHdvIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggb25lIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICAgIGlmIChzdWJzdHJpbmcgPT09IFwiJydcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IFwiJ1wiIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcIidcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IGNsZWFuRXNjYXBlZFN0cmluZyhzdWJzdHJpbmcpIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChfaW5kZXgzLmZvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdKSB7XG4gICAgICAgIHJldHVybiB7IGlzVG9rZW46IHRydWUsIHZhbHVlOiBzdWJzdHJpbmcgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyLm1hdGNoKHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICBcIkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlciBgXCIgK1xuICAgICAgICAgICAgZmlyc3RDaGFyYWN0ZXIgK1xuICAgICAgICAgICAgXCJgXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGlzVG9rZW46IGZhbHNlLCB2YWx1ZTogc3Vic3RyaW5nIH07XG4gICAgfSk7XG5cbiAgLy8gaW52b2tlIGxvY2FsaXplIHByZXByb2Nlc3NvciAob25seSBmb3IgZnJlbmNoIGxvY2FsZXMgYXQgdGhlIG1vbWVudClcbiAgaWYgKGxvY2FsZS5sb2NhbGl6ZS5wcmVwcm9jZXNzb3IpIHtcbiAgICBwYXJ0cyA9IGxvY2FsZS5sb2NhbGl6ZS5wcmVwcm9jZXNzb3Iob3JpZ2luYWxEYXRlLCBwYXJ0cyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXJPcHRpb25zID0ge1xuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSxcbiAgICB3ZWVrU3RhcnRzT24sXG4gICAgbG9jYWxlLFxuICB9O1xuXG4gIHJldHVybiBwYXJ0c1xuICAgIC5tYXAoKHBhcnQpID0+IHtcbiAgICAgIGlmICghcGFydC5pc1Rva2VuKSByZXR1cm4gcGFydC52YWx1ZTtcblxuICAgICAgY29uc3QgdG9rZW4gPSBwYXJ0LnZhbHVlO1xuXG4gICAgICBpZiAoXG4gICAgICAgICghb3B0aW9ucz8udXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zICYmXG4gICAgICAgICAgKDAsIF9pbmRleDUuaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuKSh0b2tlbikpIHx8XG4gICAgICAgICghb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJlxuICAgICAgICAgICgwLCBfaW5kZXg1LmlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4pKHRva2VuKSlcbiAgICAgICkge1xuICAgICAgICAoMCwgX2luZGV4NS53YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKSh0b2tlbiwgZm9ybWF0U3RyLCBTdHJpbmcoZGF0ZSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSBfaW5kZXgzLmZvcm1hdHRlcnNbdG9rZW5bMF1dO1xuICAgICAgcmV0dXJuIGZvcm1hdHRlcihvcmlnaW5hbERhdGUsIHRva2VuLCBsb2NhbGUubG9jYWxpemUsIGZvcm1hdHRlck9wdGlvbnMpO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcIik7XG59XG5cbmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZyhpbnB1dCkge1xuICBjb25zdCBtYXRjaGVkID0gaW5wdXQubWF0Y2goZXNjYXBlZFN0cmluZ1JlZ0V4cCk7XG5cbiAgaWYgKCFtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG5cbiAgcmV0dXJuIG1hdGNoZWRbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cCwgXCInXCIpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldERhdGUgPSBnZXREYXRlO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXREYXRlXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgZGF5IG9mIHRoZSBtb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgZGF5IG9mIHRoZSBtb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGRheSBvZiBtb250aFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBkYXkgb2YgdGhlIG1vbnRoIGlzIDI5IEZlYnJ1YXJ5IDIwMTI/XG4gKiBjb25zdCByZXN1bHQgPSBnZXREYXRlKG5ldyBEYXRlKDIwMTIsIDEsIDI5KSlcbiAqIC8vPT4gMjlcbiAqL1xuZnVuY3Rpb24gZ2V0RGF0ZShkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkYXlPZk1vbnRoID0gX2RhdGUuZ2V0RGF0ZSgpO1xuICByZXR1cm4gZGF5T2ZNb250aDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXREYXkgPSBnZXREYXk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldERheVxuICogQGNhdGVnb3J5IFdlZWtkYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGRheSBvZiB0aGUgd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGRheSBvZiB3ZWVrLCAwIHJlcHJlc2VudHMgU3VuZGF5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIGRheSBvZiB0aGUgd2VlayBpcyAyOSBGZWJydWFyeSAyMDEyP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0RGF5KG5ldyBEYXRlKDIwMTIsIDEsIDI5KSlcbiAqIC8vPT4gM1xuICovXG5mdW5jdGlvbiBnZXREYXkoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGF5ID0gX2RhdGUuZ2V0RGF5KCk7XG4gIHJldHVybiBkYXk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0RGF5T2ZZZWFyID0gZ2V0RGF5T2ZZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2RpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cy5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc3RhcnRPZlllYXIuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXREYXlPZlllYXJcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBkYXkgb2YgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGRheSBvZiB0aGUgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIGRheSBvZiB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIGRheSBvZiB0aGUgeWVhciBpcyAyIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldERheU9mWWVhcihuZXcgRGF0ZSgyMDE0LCA2LCAyKSlcbiAqIC8vPT4gMTgzXG4gKi9cbmZ1bmN0aW9uIGdldERheU9mWWVhcihkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDMudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGlmZiA9ICgwLCBfaW5kZXguZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKShcbiAgICBfZGF0ZSxcbiAgICAoMCwgX2luZGV4Mi5zdGFydE9mWWVhcikoX2RhdGUpLFxuICApO1xuICBjb25zdCBkYXlPZlllYXIgPSBkaWZmICsgMTtcbiAgcmV0dXJuIGRheU9mWWVhcjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXREYXlzSW5Nb250aCA9IGdldERheXNJbk1vbnRoO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXREYXlzSW5Nb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGRheXMgaW4gYSBtb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGRheXMgaW4gYSBtb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGhcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgZGF5cyBhcmUgaW4gRmVicnVhcnkgMjAwMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldERheXNJbk1vbnRoKG5ldyBEYXRlKDIwMDAsIDEpKVxuICogLy89PiAyOVxuICovXG5mdW5jdGlvbiBnZXREYXlzSW5Nb250aChkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGhJbmRleCA9IF9kYXRlLmdldE1vbnRoKCk7XG4gIGNvbnN0IGxhc3REYXlPZk1vbnRoID0gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGxhc3REYXlPZk1vbnRoLnNldEZ1bGxZZWFyKHllYXIsIG1vbnRoSW5kZXggKyAxLCAwKTtcbiAgbGFzdERheU9mTW9udGguc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBsYXN0RGF5T2ZNb250aC5nZXREYXRlKCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0RGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucztcblxudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0RGVmYXVsdE9wdGlvbnNcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IGRlZmF1bHQgb3B0aW9ucy5cbiAqIEBwdXJlIGZhbHNlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGRlZmF1bHRzIGZvclxuICogYG9wdGlvbnMubG9jYWxlYCwgYG9wdGlvbnMud2Vla1N0YXJ0c09uYCBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYFxuICogYXJndW1lbnRzIGZvciBhbGwgZnVuY3Rpb25zLlxuICpcbiAqIFlvdSBjYW4gY2hhbmdlIHRoZXNlIHdpdGggW3NldERlZmF1bHRPcHRpb25zXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL3NldERlZmF1bHRPcHRpb25zKS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJlc3VsdCA9IGdldERlZmF1bHRPcHRpb25zKClcbiAqIC8vPT4ge31cbiAqXG4gKiBAZXhhbXBsZVxuICogc2V0RGVmYXVsdE9wdGlvbnMoeyB3ZWVrU3RhcnNPbjogMSwgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0IH0pXG4gKiBjb25zdCByZXN1bHQgPSBnZXREZWZhdWx0T3B0aW9ucygpXG4gKiAvLz0+IHsgd2Vla1N0YXJzT246IDEsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCB9XG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgKDAsIF9pbmRleC5nZXREZWZhdWx0T3B0aW9ucykoKSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0SG91cnMgPSBnZXRIb3VycztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0SG91cnNcbiAqIEBjYXRlZ29yeSBIb3VyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgaG91cnMgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGhvdXJzIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgaG91cnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2V0IHRoZSBob3VycyBvZiAyOSBGZWJydWFyeSAyMDEyIDExOjQ1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZ2V0SG91cnMobmV3IERhdGUoMjAxMiwgMSwgMjksIDExLCA0NSkpXG4gKiAvLz0+IDExXG4gKi9cbmZ1bmN0aW9uIGdldEhvdXJzKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGhvdXJzID0gX2RhdGUuZ2V0SG91cnMoKTtcbiAgcmV0dXJuIGhvdXJzO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmdldElTT0RheSA9IGdldElTT0RheTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0SVNPRGF5XG4gKiBAY2F0ZWdvcnkgV2Vla2RheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGRheSBvZiB0aGUgSVNPIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGRheSBvZiB0aGUgSVNPIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUsXG4gKiB3aGljaCBpcyA3IGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSBldGMuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF5IG9mIElTTyB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIGRheSBvZiB0aGUgSVNPIHdlZWsgaXMgMjYgRmVicnVhcnkgMjAxMj9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldElTT0RheShuZXcgRGF0ZSgyMDEyLCAxLCAyNikpXG4gKiAvLz0+IDdcbiAqL1xuZnVuY3Rpb24gZ2V0SVNPRGF5KGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGxldCBkYXkgPSBfZGF0ZS5nZXREYXkoKTtcblxuICBpZiAoZGF5ID09PSAwKSB7XG4gICAgZGF5ID0gNztcbiAgfVxuXG4gIHJldHVybiBkYXk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0SVNPV2VlayA9IGdldElTT1dlZWs7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zdGFydE9mSVNPV2Vlay5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vc3RhcnRPZklTT1dlZWtZZWFyLmpzXCIpO1xudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0SVNPV2Vla1xuICogQGNhdGVnb3J5IElTTyBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgSVNPIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIElTTyB3ZWVrIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIElTTyB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgb2YgdGhlIElTTy13ZWVrIG51bWJlcmluZyB5ZWFyIGlzIDIgSmFudWFyeSAyMDA1P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0SVNPV2VlayhuZXcgRGF0ZSgyMDA1LCAwLCAyKSlcbiAqIC8vPT4gNTNcbiAqL1xuZnVuY3Rpb24gZ2V0SVNPV2VlayhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDQudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgZGlmZiA9XG4gICAgKygwLCBfaW5kZXgyLnN0YXJ0T2ZJU09XZWVrKShfZGF0ZSkgLVxuICAgICsoMCwgX2luZGV4My5zdGFydE9mSVNPV2Vla1llYXIpKF9kYXRlKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBfaW5kZXgubWlsbGlzZWNvbmRzSW5XZWVrKSArIDE7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0SVNPV2Vla1llYXIgPSBnZXRJU09XZWVrWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zdGFydE9mSVNPV2Vlay5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldElTT1dlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWstTnVtYmVyaW5nIFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBJU08gd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUsXG4gKiB3aGljaCBhbHdheXMgc3RhcnRzIDMgZGF5cyBiZWZvcmUgdGhlIHllYXIncyBmaXJzdCBUaHVyc2RheS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBJU08td2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldElTT1dlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiAyMDA0XG4gKi9cbmZ1bmN0aW9uIGdldElTT1dlZWtZZWFyKGRhdGUpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4My50b0RhdGUpKGRhdGUpO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcblxuICBjb25zdCBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyID0gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZOZXh0WWVhciA9ICgwLCBfaW5kZXgyLnN0YXJ0T2ZJU09XZWVrKShcbiAgICBmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyLFxuICApO1xuXG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIgPSAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnlPZlRoaXNZZWFyLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBzdGFydE9mVGhpc1llYXIgPSAoMCwgX2luZGV4Mi5zdGFydE9mSVNPV2VlaykoXG4gICAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhcixcbiAgKTtcblxuICBpZiAoX2RhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhciArIDE7XG4gIH0gZWxzZSBpZiAoX2RhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZUaGlzWWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geWVhciAtIDE7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRNaW51dGVzID0gZ2V0TWludXRlcztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0TWludXRlc1xuICogQGNhdGVnb3J5IE1pbnV0ZSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG1pbnV0ZXMgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG1pbnV0ZXMgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBtaW51dGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEdldCB0aGUgbWludXRlcyBvZiAyOSBGZWJydWFyeSAyMDEyIDExOjQ1OjA1OlxuICogY29uc3QgcmVzdWx0ID0gZ2V0TWludXRlcyhuZXcgRGF0ZSgyMDEyLCAxLCAyOSwgMTEsIDQ1LCA1KSlcbiAqIC8vPT4gNDVcbiAqL1xuZnVuY3Rpb24gZ2V0TWludXRlcyhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBtaW51dGVzID0gX2RhdGUuZ2V0TWludXRlcygpO1xuICByZXR1cm4gbWludXRlcztcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRNb250aCA9IGdldE1vbnRoO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBnZXRNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbW9udGggaW5kZXggKDAtMTEpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIG1vbnRoIGlzIDI5IEZlYnJ1YXJ5IDIwMTI/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRNb250aChuZXcgRGF0ZSgyMDEyLCAxLCAyOSkpXG4gKiAvLz0+IDFcbiAqL1xuZnVuY3Rpb24gZ2V0TW9udGgoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgbW9udGggPSBfZGF0ZS5nZXRNb250aCgpO1xuICByZXR1cm4gbW9udGg7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0UXVhcnRlciA9IGdldFF1YXJ0ZXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldFF1YXJ0ZXJcbiAqIEBjYXRlZ29yeSBRdWFydGVyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgeWVhciBxdWFydGVyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSB5ZWFyIHF1YXJ0ZXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBxdWFydGVyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHF1YXJ0ZXIgaXMgMiBKdWx5IDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRRdWFydGVyKG5ldyBEYXRlKDIwMTQsIDYsIDIpKVxuICogLy89PiAzXG4gKi9cbmZ1bmN0aW9uIGdldFF1YXJ0ZXIoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgY29uc3QgcXVhcnRlciA9IE1hdGgudHJ1bmMoX2RhdGUuZ2V0TW9udGgoKSAvIDMpICsgMTtcbiAgcmV0dXJuIHF1YXJ0ZXI7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0U2Vjb25kcyA9IGdldFNlY29uZHM7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGdldFNlY29uZHNcbiAqIEBjYXRlZ29yeSBTZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBzZWNvbmRzIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBzZWNvbmRzIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgc2Vjb25kc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZXQgdGhlIHNlY29uZHMgb2YgMjkgRmVicnVhcnkgMjAxMiAxMTo0NTowNS4xMjM6XG4gKiBjb25zdCByZXN1bHQgPSBnZXRTZWNvbmRzKG5ldyBEYXRlKDIwMTIsIDEsIDI5LCAxMSwgNDUsIDUsIDEyMykpXG4gKiAvLz0+IDVcbiAqL1xuZnVuY3Rpb24gZ2V0U2Vjb25kcyhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBzZWNvbmRzID0gX2RhdGUuZ2V0U2Vjb25kcygpO1xuICByZXR1cm4gc2Vjb25kcztcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRUaW1lID0gZ2V0VGltZTtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0VGltZVxuICogQGNhdGVnb3J5IFRpbWVzdGFtcCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSB0aW1lc3RhbXBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2V0IHRoZSB0aW1lc3RhbXAgb2YgMjkgRmVicnVhcnkgMjAxMiAxMTo0NTowNS4xMjM6XG4gKiBjb25zdCByZXN1bHQgPSBnZXRUaW1lKG5ldyBEYXRlKDIwMTIsIDEsIDI5LCAxMSwgNDUsIDUsIDEyMykpXG4gKiAvLz0+IDEzMzA1MTU5MDUxMjNcbiAqL1xuZnVuY3Rpb24gZ2V0VGltZShkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCB0aW1lc3RhbXAgPSBfZGF0ZS5nZXRUaW1lKCk7XG4gIHJldHVybiB0aW1lc3RhbXA7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZ2V0V2VlayA9IGdldFdlZWs7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zdGFydE9mV2Vlay5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vc3RhcnRPZldlZWtZZWFyLmpzXCIpO1xudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogVGhlIHtAbGluayBnZXRXZWVrfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0V2Vla1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBsb2NhbCB3ZWVrIGluZGV4IG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBsb2NhbCB3ZWVrIGluZGV4IG9mIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1RoZV9JU09fd2Vla19kYXRlX3N5c3RlbVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgb2YgdGhlIGxvY2FsIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDUgd2l0aCBkZWZhdWx0IG9wdGlvbnM/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiAyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgb2YgdGhlIGxvY2FsIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDUsXG4gKiAvLyBpZiBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayxcbiAqIC8vIGFuZCB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhciBhbHdheXMgY29udGFpbnMgNCBKYW51YXJ5P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2VlayhuZXcgRGF0ZSgyMDA1LCAwLCAyKSwge1xuICogICB3ZWVrU3RhcnRzT246IDEsXG4gKiAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNFxuICogfSlcbiAqIC8vPT4gNTNcbiAqL1xuXG5mdW5jdGlvbiBnZXRXZWVrKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4NC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkaWZmID1cbiAgICArKDAsIF9pbmRleDIuc3RhcnRPZldlZWspKF9kYXRlLCBvcHRpb25zKSAtXG4gICAgKygwLCBfaW5kZXgzLnN0YXJ0T2ZXZWVrWWVhcikoX2RhdGUsIG9wdGlvbnMpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2Ygd2Vla3MgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBiZWNhdXNlIHRoZSBudW1iZXIgb2ZcbiAgLy8gbWlsbGlzZWNvbmRzIGluIGEgd2VlayBpcyBub3QgY29uc3RhbnQgKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2ZcbiAgLy8gdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KS5cbiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIF9pbmRleC5taWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRXZWVrWWVhciA9IGdldFdlZWtZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZXZWVrLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbnZhciBfaW5kZXg0ID0gcmVxdWlyZShcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWtZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0V2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMgVGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3M/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpKVxuICogLy89PiAyMDA1XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB3ZWVrIHN0YXJ0cyBvbiBTYXR1cmRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgd2Vla1N0YXJ0c09uOiA2IH0pXG4gKiAvLz0+IDIwMDRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IGlmIHRoZSBmaXJzdCB3ZWVrIGNvbnRhaW5zIDQgSmFudWFyeT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0IH0pXG4gKiAvLz0+IDIwMDRcbiAqL1xuZnVuY3Rpb24gZ2V0V2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgzLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gKDAsIF9pbmRleDQuZ2V0RGVmYXVsdE9wdGlvbnMpKCk7XG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3QgZmlyc3RXZWVrT2ZOZXh0WWVhciA9ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZOZXh0WWVhciA9ICgwLCBfaW5kZXgyLnN0YXJ0T2ZXZWVrKShcbiAgICBmaXJzdFdlZWtPZk5leHRZZWFyLFxuICAgIG9wdGlvbnMsXG4gICk7XG5cbiAgY29uc3QgZmlyc3RXZWVrT2ZUaGlzWWVhciA9ICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0RnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZlRoaXNZZWFyID0gKDAsIF9pbmRleDIuc3RhcnRPZldlZWspKFxuICAgIGZpcnN0V2Vla09mVGhpc1llYXIsXG4gICAgb3B0aW9ucyxcbiAgKTtcblxuICBpZiAoX2RhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhciArIDE7XG4gIH0gZWxzZSBpZiAoX2RhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZUaGlzWWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geWVhciAtIDE7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5nZXRZZWFyID0gZ2V0WWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgZ2V0WWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCB5ZWFyIGlzIDIgSnVseSAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZ2V0WWVhcihuZXcgRGF0ZSgyMDE0LCA2LCAyKSlcbiAqIC8vPT4gMjAxNFxuICovXG5mdW5jdGlvbiBnZXRZZWFyKGRhdGUpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKS5nZXRGdWxsWWVhcigpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzQWZ0ZXIgPSBpc0FmdGVyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc0FmdGVyXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBmaXJzdCBkYXRlIGFmdGVyIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSXMgdGhlIGZpcnN0IGRhdGUgYWZ0ZXIgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0aGF0IHNob3VsZCBiZSBhZnRlciB0aGUgb3RoZXIgb25lIHRvIHJldHVybiB0cnVlXG4gKiBAcGFyYW0gZGF0ZVRvQ29tcGFyZSAtIFRoZSBkYXRlIHRvIGNvbXBhcmUgd2l0aFxuICpcbiAqIEByZXR1cm5zIFRoZSBmaXJzdCBkYXRlIGlzIGFmdGVyIHRoZSBzZWNvbmQgZGF0ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJcyAxMCBKdWx5IDE5ODkgYWZ0ZXIgMTEgRmVicnVhcnkgMTk4Nz9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzQWZ0ZXIobmV3IERhdGUoMTk4OSwgNiwgMTApLCBuZXcgRGF0ZSgxOTg3LCAxLCAxMSkpXG4gKiAvLz0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNBZnRlcihkYXRlLCBkYXRlVG9Db21wYXJlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBfZGF0ZVRvQ29tcGFyZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlVG9Db21wYXJlKTtcbiAgcmV0dXJuIF9kYXRlLmdldFRpbWUoKSA+IF9kYXRlVG9Db21wYXJlLmdldFRpbWUoKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc0JlZm9yZSA9IGlzQmVmb3JlO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc0JlZm9yZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZmlyc3QgZGF0ZSBiZWZvcmUgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJcyB0aGUgZmlyc3QgZGF0ZSBiZWZvcmUgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0aGF0IHNob3VsZCBiZSBiZWZvcmUgdGhlIG90aGVyIG9uZSB0byByZXR1cm4gdHJ1ZVxuICogQHBhcmFtIGRhdGVUb0NvbXBhcmUgLSBUaGUgZGF0ZSB0byBjb21wYXJlIHdpdGhcbiAqXG4gKiBAcmV0dXJucyBUaGUgZmlyc3QgZGF0ZSBpcyBiZWZvcmUgdGhlIHNlY29uZCBkYXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElzIDEwIEp1bHkgMTk4OSBiZWZvcmUgMTEgRmVicnVhcnkgMTk4Nz9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzQmVmb3JlKG5ldyBEYXRlKDE5ODksIDYsIDEwKSwgbmV3IERhdGUoMTk4NywgMSwgMTEpKVxuICogLy89PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0JlZm9yZShkYXRlLCBkYXRlVG9Db21wYXJlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBfZGF0ZVRvQ29tcGFyZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlVG9Db21wYXJlKTtcbiAgcmV0dXJuICtfZGF0ZSA8ICtfZGF0ZVRvQ29tcGFyZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7IC8qKlxuICogQG5hbWUgaXNEYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBnaXZlbiB2YWx1ZSBhIGRhdGU/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIERhdGUuIFRoZSBmdW5jdGlvbiB3b3JrcyBmb3IgZGF0ZXMgdHJhbnNmZXJyZWQgYWNyb3NzIGlmcmFtZXMuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBkYXRlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhIHZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUobmV3IERhdGUoKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgYW4gaW52YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNEYXRlKG5ldyBEYXRlKE5hTikpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHNvbWUgdmFsdWU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUoJzIwMTQtMDItMzEnKVxuICogLy89PiBmYWxzZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgYW4gb2JqZWN0OlxuICogY29uc3QgcmVzdWx0ID0gaXNEYXRlKHt9KVxuICogLy89PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBcIltvYmplY3QgRGF0ZV1cIilcbiAgKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc0VxdWFsID0gaXNFcXVhbDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNFcXVhbFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBcmUgdGhlIGdpdmVuIGRhdGVzIGVxdWFsP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBlcXVhbD9cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgZmlyc3QgZGF0ZSB0byBjb21wYXJlXG4gKiBAcGFyYW0gZGF0ZVJpZ2h0IC0gVGhlIHNlY29uZCBkYXRlIHRvIGNvbXBhcmVcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF0ZXMgYXJlIGVxdWFsXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAyIEp1bHkgMjAxNCAwNjozMDo0NS4wMDAgYW5kIDIgSnVseSAyMDE0IDA2OjMwOjQ1LjUwMCBlcXVhbD9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzRXF1YWwoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIsIDYsIDMwLCA0NSwgMCksXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIsIDYsIDMwLCA0NSwgNTAwKVxuICogKVxuICogLy89PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0VxdWFsKGxlZnREYXRlLCByaWdodERhdGUpIHtcbiAgY29uc3QgX2RhdGVMZWZ0ID0gKDAsIF9pbmRleC50b0RhdGUpKGxlZnREYXRlKTtcbiAgY29uc3QgX2RhdGVSaWdodCA9ICgwLCBfaW5kZXgudG9EYXRlKShyaWdodERhdGUpO1xuICByZXR1cm4gK19kYXRlTGVmdCA9PT0gK19kYXRlUmlnaHQ7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNTYW1lRGF5ID0gaXNTYW1lRGF5O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZEYXkuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNTYW1lRGF5XG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgZGF5IChhbmQgeWVhciBhbmQgbW9udGgpP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBkYXkgKGFuZCB5ZWFyIGFuZCBtb250aCk/XG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVMZWZ0IC0gVGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgc2Vjb25kIGRhdGUgdG8gY2hlY2tcblxuICogQHJldHVybnMgVGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSBkYXkgKGFuZCB5ZWFyIGFuZCBtb250aClcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDQgU2VwdGVtYmVyIDA2OjAwOjAwIGFuZCA0IFNlcHRlbWJlciAxODowMDowMCBpbiB0aGUgc2FtZSBkYXk/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVEYXkobmV3IERhdGUoMjAxNCwgOCwgNCwgNiwgMCksIG5ldyBEYXRlKDIwMTQsIDgsIDQsIDE4LCAwKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgNCBTZXB0ZW1iZXIgYW5kIDQgT2N0b2JlciBpbiB0aGUgc2FtZSBkYXk/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVEYXkobmV3IERhdGUoMjAxNCwgOCwgNCksIG5ldyBEYXRlKDIwMTQsIDksIDQpKVxuICogLy89PiBmYWxzZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgNCBTZXB0ZW1iZXIsIDIwMTQgYW5kIDQgU2VwdGVtYmVyLCAyMDE1IGluIHRoZSBzYW1lIGRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZURheShuZXcgRGF0ZSgyMDE0LCA4LCA0KSwgbmV3IERhdGUoMjAxNSwgOCwgNCkpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU2FtZURheShkYXRlTGVmdCwgZGF0ZVJpZ2h0KSB7XG4gIGNvbnN0IGRhdGVMZWZ0U3RhcnRPZkRheSA9ICgwLCBfaW5kZXguc3RhcnRPZkRheSkoZGF0ZUxlZnQpO1xuICBjb25zdCBkYXRlUmlnaHRTdGFydE9mRGF5ID0gKDAsIF9pbmRleC5zdGFydE9mRGF5KShkYXRlUmlnaHQpO1xuXG4gIHJldHVybiArZGF0ZUxlZnRTdGFydE9mRGF5ID09PSArZGF0ZVJpZ2h0U3RhcnRPZkRheTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc1NhbWVNb250aCA9IGlzU2FtZU1vbnRoO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc1NhbWVNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgbW9udGggKGFuZCB5ZWFyKT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgbW9udGggKGFuZCB5ZWFyKT9cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgZmlyc3QgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBzZWNvbmQgZGF0ZSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIFRoZSBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgbW9udGggKGFuZCB5ZWFyKVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMiBTZXB0ZW1iZXIgMjAxNCBhbmQgMjUgU2VwdGVtYmVyIDIwMTQgaW4gdGhlIHNhbWUgbW9udGg/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAyKSwgbmV3IERhdGUoMjAxNCwgOCwgMjUpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAyIFNlcHRlbWJlciAyMDE0IGFuZCAyNSBTZXB0ZW1iZXIgMjAxNSBpbiB0aGUgc2FtZSBtb250aD9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZU1vbnRoKG5ldyBEYXRlKDIwMTQsIDgsIDIpLCBuZXcgRGF0ZSgyMDE1LCA4LCAyNSkpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU2FtZU1vbnRoKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgX2RhdGVMZWZ0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVMZWZ0KTtcbiAgY29uc3QgX2RhdGVSaWdodCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlUmlnaHQpO1xuICByZXR1cm4gKFxuICAgIF9kYXRlTGVmdC5nZXRGdWxsWWVhcigpID09PSBfZGF0ZVJpZ2h0LmdldEZ1bGxZZWFyKCkgJiZcbiAgICBfZGF0ZUxlZnQuZ2V0TW9udGgoKSA9PT0gX2RhdGVSaWdodC5nZXRNb250aCgpXG4gICk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNTYW1lUXVhcnRlciA9IGlzU2FtZVF1YXJ0ZXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vc3RhcnRPZlF1YXJ0ZXIuanNcIik7XG5cbi8qKlxuICogQG5hbWUgaXNTYW1lUXVhcnRlclxuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBxdWFydGVyIChhbmQgeWVhcik/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBcmUgdGhlIGdpdmVuIGRhdGVzIGluIHRoZSBzYW1lIHF1YXJ0ZXIgKGFuZCB5ZWFyKT9cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgZmlyc3QgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBzZWNvbmQgZGF0ZSB0byBjaGVja1xuXG4gKiBAcmV0dXJucyBUaGUgZGF0ZXMgYXJlIGluIHRoZSBzYW1lIHF1YXJ0ZXIgKGFuZCB5ZWFyKVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMSBKYW51YXJ5IDIwMTQgYW5kIDggTWFyY2ggMjAxNCBpbiB0aGUgc2FtZSBxdWFydGVyP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lUXVhcnRlcihuZXcgRGF0ZSgyMDE0LCAwLCAxKSwgbmV3IERhdGUoMjAxNCwgMiwgOCkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDEgSmFudWFyeSAyMDE0IGFuZCAxIEphbnVhcnkgMjAxNSBpbiB0aGUgc2FtZSBxdWFydGVyP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lUXVhcnRlcihuZXcgRGF0ZSgyMDE0LCAwLCAxKSwgbmV3IERhdGUoMjAxNSwgMCwgMSkpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU2FtZVF1YXJ0ZXIoZGF0ZUxlZnQsIGRhdGVSaWdodCkge1xuICBjb25zdCBkYXRlTGVmdFN0YXJ0T2ZRdWFydGVyID0gKDAsIF9pbmRleC5zdGFydE9mUXVhcnRlcikoZGF0ZUxlZnQpO1xuICBjb25zdCBkYXRlUmlnaHRTdGFydE9mUXVhcnRlciA9ICgwLCBfaW5kZXguc3RhcnRPZlF1YXJ0ZXIpKGRhdGVSaWdodCk7XG5cbiAgcmV0dXJuICtkYXRlTGVmdFN0YXJ0T2ZRdWFydGVyID09PSArZGF0ZVJpZ2h0U3RhcnRPZlF1YXJ0ZXI7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuaXNTYW1lWWVhciA9IGlzU2FtZVllYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIGlzU2FtZVllYXJcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgeWVhcj9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgeWVhcj9cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZUxlZnQgLSBUaGUgZmlyc3QgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIGRhdGVSaWdodCAtIFRoZSBzZWNvbmQgZGF0ZSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIFRoZSBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMiBTZXB0ZW1iZXIgMjAxNCBhbmQgMjUgU2VwdGVtYmVyIDIwMTQgaW4gdGhlIHNhbWUgeWVhcj9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzU2FtZVllYXIobmV3IERhdGUoMjAxNCwgOCwgMiksIG5ldyBEYXRlKDIwMTQsIDgsIDI1KSlcbiAqIC8vPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1NhbWVZZWFyKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgX2RhdGVMZWZ0ID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGVMZWZ0KTtcbiAgY29uc3QgX2RhdGVSaWdodCA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlUmlnaHQpO1xuICByZXR1cm4gX2RhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgPT09IF9kYXRlUmlnaHQuZ2V0RnVsbFllYXIoKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5pc1ZhbGlkID0gaXNWYWxpZDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9pc0RhdGUuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc1ZhbGlkXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBnaXZlbiBkYXRlIHZhbGlkP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyBmYWxzZSBpZiBhcmd1bWVudCBpcyBJbnZhbGlkIERhdGUgYW5kIHRydWUgb3RoZXJ3aXNlLlxuICogQXJndW1lbnQgaXMgY29udmVydGVkIHRvIERhdGUgdXNpbmcgYHRvRGF0ZWAuIFNlZSBbdG9EYXRlXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL3RvRGF0ZSlcbiAqIEludmFsaWQgRGF0ZSBpcyBhIERhdGUsIHdob3NlIHRpbWUgdmFsdWUgaXMgTmFOLlxuICpcbiAqIFRpbWUgdmFsdWUgb2YgRGF0ZTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS45LjEuMVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF0ZSBpcyB2YWxpZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIHZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKG5ldyBEYXRlKDIwMTQsIDEsIDMxKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIHZhbHVlLCBjb252ZXJ0YWJsZSBpbnRvIGEgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQoMTM5MzgwNDgwMDAwMClcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIGludmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQobmV3IERhdGUoJycpKVxuICogLy89PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkKGRhdGUpIHtcbiAgaWYgKCEoMCwgX2luZGV4LmlzRGF0ZSkoZGF0ZSkgJiYgdHlwZW9mIGRhdGUgIT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGUpO1xuICByZXR1cm4gIWlzTmFOKE51bWJlcihfZGF0ZSkpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmlzV2l0aGluSW50ZXJ2YWwgPSBpc1dpdGhpbkludGVydmFsO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBpc1dpdGhpbkludGVydmFsXG4gKiBAY2F0ZWdvcnkgSW50ZXJ2YWwgSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIGRhdGUgd2l0aGluIHRoZSBpbnRlcnZhbD9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIElzIHRoZSBnaXZlbiBkYXRlIHdpdGhpbiB0aGUgaW50ZXJ2YWw/IChJbmNsdWRpbmcgc3RhcnQgYW5kIGVuZC4pXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIGludGVydmFsIC0gVGhlIGludGVydmFsIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGUgaXMgd2l0aGluIHRoZSBpbnRlcnZhbFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIGRhdGUgd2l0aGluIHRoZSBpbnRlcnZhbDpcbiAqIGlzV2l0aGluSW50ZXJ2YWwobmV3IERhdGUoMjAxNCwgMCwgMyksIHtcbiAqICAgc3RhcnQ6IG5ldyBEYXRlKDIwMTQsIDAsIDEpLFxuICogICBlbmQ6IG5ldyBEYXRlKDIwMTQsIDAsIDcpXG4gKiB9KVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciB0aGUgZGF0ZSBvdXRzaWRlIG9mIHRoZSBpbnRlcnZhbDpcbiAqIGlzV2l0aGluSW50ZXJ2YWwobmV3IERhdGUoMjAxNCwgMCwgMTApLCB7XG4gKiAgIHN0YXJ0OiBuZXcgRGF0ZSgyMDE0LCAwLCAxKSxcbiAqICAgZW5kOiBuZXcgRGF0ZSgyMDE0LCAwLCA3KVxuICogfSlcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGRhdGUgZXF1YWwgdG8gaW50ZXJ2YWwgc3RhcnQ6XG4gKiBpc1dpdGhpbkludGVydmFsKGRhdGUsIHsgc3RhcnQsIGVuZDogZGF0ZSB9KVxuICogLy8gPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgZGF0ZSBlcXVhbCB0byBpbnRlcnZhbCBlbmQ6XG4gKiBpc1dpdGhpbkludGVydmFsKGRhdGUsIHsgc3RhcnQ6IGRhdGUsIGVuZCB9KVxuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1dpdGhpbkludGVydmFsKGRhdGUsIGludGVydmFsKSB7XG4gIGNvbnN0IHRpbWUgPSArKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBbc3RhcnRUaW1lLCBlbmRUaW1lXSA9IFtcbiAgICArKDAsIF9pbmRleC50b0RhdGUpKGludGVydmFsLnN0YXJ0KSxcbiAgICArKDAsIF9pbmRleC50b0RhdGUpKGludGVydmFsLmVuZCksXG4gIF0uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuXG4gIHJldHVybiB0aW1lID49IHN0YXJ0VGltZSAmJiB0aW1lIDw9IGVuZFRpbWU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuYnVpbGRGb3JtYXRMb25nRm4gPSBidWlsZEZvcm1hdExvbmdGbjtcblxuZnVuY3Rpb24gYnVpbGRGb3JtYXRMb25nRm4oYXJncykge1xuICByZXR1cm4gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIC8vIFRPRE86IFJlbW92ZSBTdHJpbmcoKVxuICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgIGNvbnN0IGZvcm1hdCA9IGFyZ3MuZm9ybWF0c1t3aWR0aF0gfHwgYXJncy5mb3JtYXRzW2FyZ3MuZGVmYXVsdFdpZHRoXTtcbiAgICByZXR1cm4gZm9ybWF0O1xuICB9O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmJ1aWxkTG9jYWxpemVGbiA9IGJ1aWxkTG9jYWxpemVGbjsgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuLyoqXG4gKiBUaGUgbG9jYWxpemUgZnVuY3Rpb24gYXJndW1lbnQgY2FsbGJhY2sgd2hpY2ggYWxsb3dzIHRvIGNvbnZlcnQgcmF3IHZhbHVlIHRvXG4gKiB0aGUgYWN0dWFsIHR5cGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIHZhbHVlXG4gKi9cblxuLyoqXG4gKiBUaGUgbWFwIG9mIGxvY2FsaXplZCB2YWx1ZXMgZm9yIGVhY2ggd2lkdGguXG4gKi9cblxuLyoqXG4gKiBUaGUgaW5kZXggdHlwZSBvZiB0aGUgbG9jYWxlIHVuaXQgdmFsdWUuIEl0IHR5cGVzIGNvbnZlcnNpb24gb2YgdW5pdHMgb2ZcbiAqIHZhbHVlcyB0aGF0IGRvbid0IHN0YXJ0IGF0IDAgKGkuZS4gcXVhcnRlcnMpLlxuICovXG5cbi8qKlxuICogQ29udmVydHMgdGhlIHVuaXQgdmFsdWUgdG8gdGhlIHR1cGxlIG9mIHZhbHVlcy5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgZXJhIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBCQyxcbiAqIHRoZSBzZWNvbmQgZWxlbWVudCByZXByZXNlbnRzIEFELlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBxdWFydGVyIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBRMS5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgZGF5IHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBTdW5kYXkuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIG1vbnRoIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBKYW51YXJ5LlxuICovXG5cbmZ1bmN0aW9uIGJ1aWxkTG9jYWxpemVGbihhcmdzKSB7XG4gIHJldHVybiAodmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gb3B0aW9ucz8uY29udGV4dCA/IFN0cmluZyhvcHRpb25zLmNvbnRleHQpIDogXCJzdGFuZGFsb25lXCI7XG5cbiAgICBsZXQgdmFsdWVzQXJyYXk7XG4gICAgaWYgKGNvbnRleHQgPT09IFwiZm9ybWF0dGluZ1wiICYmIGFyZ3MuZm9ybWF0dGluZ1ZhbHVlcykge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0Rm9ybWF0dGluZ1dpZHRoIHx8IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGRlZmF1bHRXaWR0aDtcblxuICAgICAgdmFsdWVzQXJyYXkgPVxuICAgICAgICBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcblxuICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLnZhbHVlc1t3aWR0aF0gfHwgYXJncy52YWx1ZXNbZGVmYXVsdFdpZHRoXTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBhcmdzLmFyZ3VtZW50Q2FsbGJhY2sgPyBhcmdzLmFyZ3VtZW50Q2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gRm9yIHNvbWUgcmVhc29uIFR5cGVTY3JpcHQganVzdCBkb24ndCB3YW50IHRvIG1hdGNoIGl0LCBubyBtYXR0ZXIgaG93IGhhcmQgd2UgdHJ5LiBJIGNoYWxsZW5nZSB5b3UgdG8gdHJ5IHRvIHJlbW92ZSBpdCFcbiAgICByZXR1cm4gdmFsdWVzQXJyYXlbaW5kZXhdO1xuICB9O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmJ1aWxkTWF0Y2hGbiA9IGJ1aWxkTWF0Y2hGbjtcblxuZnVuY3Rpb24gYnVpbGRNYXRjaEZuKGFyZ3MpIHtcbiAgcmV0dXJuIChzdHJpbmcsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucy53aWR0aDtcblxuICAgIGNvbnN0IG1hdGNoUGF0dGVybiA9XG4gICAgICAod2lkdGggJiYgYXJncy5tYXRjaFBhdHRlcm5zW3dpZHRoXSkgfHxcbiAgICAgIGFyZ3MubWF0Y2hQYXR0ZXJuc1thcmdzLmRlZmF1bHRNYXRjaFdpZHRoXTtcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChtYXRjaFBhdHRlcm4pO1xuXG4gICAgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcblxuICAgIGNvbnN0IHBhcnNlUGF0dGVybnMgPVxuICAgICAgKHdpZHRoICYmIGFyZ3MucGFyc2VQYXR0ZXJuc1t3aWR0aF0pIHx8XG4gICAgICBhcmdzLnBhcnNlUGF0dGVybnNbYXJncy5kZWZhdWx0UGFyc2VXaWR0aF07XG5cbiAgICBjb25zdCBrZXkgPSBBcnJheS5pc0FycmF5KHBhcnNlUGF0dGVybnMpXG4gICAgICA/IGZpbmRJbmRleChwYXJzZVBhdHRlcm5zLCAocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpKVxuICAgICAgOiAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBJIGNoYWxsYW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgICAgIGZpbmRLZXkocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSk7XG5cbiAgICBsZXQgdmFsdWU7XG5cbiAgICB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFjayA/IGFyZ3MudmFsdWVDYWxsYmFjayhrZXkpIDoga2V5O1xuICAgIHZhbHVlID0gb3B0aW9ucy52YWx1ZUNhbGxiYWNrXG4gICAgICA/IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIEkgY2hhbGxhbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKVxuICAgICAgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmXG4gICAgICBwcmVkaWNhdGUob2JqZWN0W2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSkge1xuICBmb3IgKGxldCBrZXkgPSAwOyBrZXkgPCBhcnJheS5sZW5ndGg7IGtleSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5idWlsZE1hdGNoUGF0dGVybkZuID0gYnVpbGRNYXRjaFBhdHRlcm5GbjtcblxuZnVuY3Rpb24gYnVpbGRNYXRjaFBhdHRlcm5GbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLm1hdGNoUGF0dGVybik7XG4gICAgaWYgKCFtYXRjaFJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IG1hdGNoUmVzdWx0WzBdO1xuXG4gICAgY29uc3QgcGFyc2VSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5wYXJzZVBhdHRlcm4pO1xuICAgIGlmICghcGFyc2VSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGxldCB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFja1xuICAgICAgPyBhcmdzLnZhbHVlQ2FsbGJhY2socGFyc2VSZXN1bHRbMF0pXG4gICAgICA6IHBhcnNlUmVzdWx0WzBdO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gSSBjaGFsbGFuZ2UgeW91IHRvIGZpeCB0aGUgdHlwZVxuICAgIHZhbHVlID0gb3B0aW9ucy52YWx1ZUNhbGxiYWNrID8gb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgY29uc3QgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG5cbiAgICByZXR1cm4geyB2YWx1ZSwgcmVzdCB9O1xuICB9O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmVuVVMgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vZW4tVVMvX2xpYi9mb3JtYXREaXN0YW5jZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9lbi1VUy9fbGliL2Zvcm1hdFJlbGF0aXZlLmpzXCIpO1xudmFyIF9pbmRleDQgPSByZXF1aXJlKFwiLi9lbi1VUy9fbGliL2xvY2FsaXplLmpzXCIpO1xudmFyIF9pbmRleDUgPSByZXF1aXJlKFwiLi9lbi1VUy9fbGliL21hdGNoLmpzXCIpO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBMb2NhbGVzXG4gKiBAc3VtbWFyeSBFbmdsaXNoIGxvY2FsZSAoVW5pdGVkIFN0YXRlcykuXG4gKiBAbGFuZ3VhZ2UgRW5nbGlzaFxuICogQGlzby02MzktMiBlbmdcbiAqIEBhdXRob3IgU2FzaGEgS29zcyBbQGtvc3Nub2NvcnBdKGh0dHBzOi8vZ2l0aHViLmNvbS9rb3Nzbm9jb3JwKVxuICogQGF1dGhvciBMZXNoYSBLb3NzIFtAbGVzaGFrb3NzXShodHRwczovL2dpdGh1Yi5jb20vbGVzaGFrb3NzKVxuICovXG5jb25zdCBlblVTID0gKGV4cG9ydHMuZW5VUyA9IHtcbiAgY29kZTogXCJlbi1VU1wiLFxuICBmb3JtYXREaXN0YW5jZTogX2luZGV4LmZvcm1hdERpc3RhbmNlLFxuICBmb3JtYXRMb25nOiBfaW5kZXgyLmZvcm1hdExvbmcsXG4gIGZvcm1hdFJlbGF0aXZlOiBfaW5kZXgzLmZvcm1hdFJlbGF0aXZlLFxuICBsb2NhbGl6ZTogX2luZGV4NC5sb2NhbGl6ZSxcbiAgbWF0Y2g6IF9pbmRleDUubWF0Y2gsXG4gIG9wdGlvbnM6IHtcbiAgICB3ZWVrU3RhcnRzT246IDAgLyogU3VuZGF5ICovLFxuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogMSxcbiAgfSxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmZvcm1hdERpc3RhbmNlID0gdm9pZCAwO1xuXG5jb25zdCBmb3JtYXREaXN0YW5jZUxvY2FsZSA9IHtcbiAgbGVzc1RoYW5YU2Vjb25kczoge1xuICAgIG9uZTogXCJsZXNzIHRoYW4gYSBzZWNvbmRcIixcbiAgICBvdGhlcjogXCJsZXNzIHRoYW4ge3tjb3VudH19IHNlY29uZHNcIixcbiAgfSxcblxuICB4U2Vjb25kczoge1xuICAgIG9uZTogXCIxIHNlY29uZFwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBzZWNvbmRzXCIsXG4gIH0sXG5cbiAgaGFsZkFNaW51dGU6IFwiaGFsZiBhIG1pbnV0ZVwiLFxuXG4gIGxlc3NUaGFuWE1pbnV0ZXM6IHtcbiAgICBvbmU6IFwibGVzcyB0aGFuIGEgbWludXRlXCIsXG4gICAgb3RoZXI6IFwibGVzcyB0aGFuIHt7Y291bnR9fSBtaW51dGVzXCIsXG4gIH0sXG5cbiAgeE1pbnV0ZXM6IHtcbiAgICBvbmU6IFwiMSBtaW51dGVcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gbWludXRlc1wiLFxuICB9LFxuXG4gIGFib3V0WEhvdXJzOiB7XG4gICAgb25lOiBcImFib3V0IDEgaG91clwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSBob3Vyc1wiLFxuICB9LFxuXG4gIHhIb3Vyczoge1xuICAgIG9uZTogXCIxIGhvdXJcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gaG91cnNcIixcbiAgfSxcblxuICB4RGF5czoge1xuICAgIG9uZTogXCIxIGRheVwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBkYXlzXCIsXG4gIH0sXG5cbiAgYWJvdXRYV2Vla3M6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSB3ZWVrXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IHdlZWtzXCIsXG4gIH0sXG5cbiAgeFdlZWtzOiB7XG4gICAgb25lOiBcIjEgd2Vla1wiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSB3ZWVrc1wiLFxuICB9LFxuXG4gIGFib3V0WE1vbnRoczoge1xuICAgIG9uZTogXCJhYm91dCAxIG1vbnRoXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IG1vbnRoc1wiLFxuICB9LFxuXG4gIHhNb250aHM6IHtcbiAgICBvbmU6IFwiMSBtb250aFwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSBtb250aHNcIixcbiAgfSxcblxuICBhYm91dFhZZWFyczoge1xuICAgIG9uZTogXCJhYm91dCAxIHllYXJcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0geWVhcnNcIixcbiAgfSxcblxuICB4WWVhcnM6IHtcbiAgICBvbmU6IFwiMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgb3ZlclhZZWFyczoge1xuICAgIG9uZTogXCJvdmVyIDEgeWVhclwiLFxuICAgIG90aGVyOiBcIm92ZXIge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgYWxtb3N0WFllYXJzOiB7XG4gICAgb25lOiBcImFsbW9zdCAxIHllYXJcIixcbiAgICBvdGhlcjogXCJhbG1vc3Qge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG59O1xuXG5jb25zdCBmb3JtYXREaXN0YW5jZSA9ICh0b2tlbiwgY291bnQsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHJlc3VsdDtcblxuICBjb25zdCB0b2tlblZhbHVlID0gZm9ybWF0RGlzdGFuY2VMb2NhbGVbdG9rZW5dO1xuICBpZiAodHlwZW9mIHRva2VuVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlO1xuICB9IGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vbmU7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZS5vdGhlci5yZXBsYWNlKFwie3tjb3VudH19XCIsIGNvdW50LnRvU3RyaW5nKCkpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/LmFkZFN1ZmZpeCkge1xuICAgIGlmIChvcHRpb25zLmNvbXBhcmlzb24gJiYgb3B0aW9ucy5jb21wYXJpc29uID4gMCkge1xuICAgICAgcmV0dXJuIFwiaW4gXCIgKyByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyBcIiBhZ29cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMuZm9ybWF0RGlzdGFuY2UgPSBmb3JtYXREaXN0YW5jZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5mb3JtYXRMb25nID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzXCIpO1xuXG5jb25zdCBkYXRlRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJFRUVFLCBNTU1NIGRvLCB5XCIsXG4gIGxvbmc6IFwiTU1NTSBkbywgeVwiLFxuICBtZWRpdW06IFwiTU1NIGQsIHlcIixcbiAgc2hvcnQ6IFwiTU0vZGQveXl5eVwiLFxufTtcblxuY29uc3QgdGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiaDptbTpzcyBhIHp6enpcIixcbiAgbG9uZzogXCJoOm1tOnNzIGEgelwiLFxuICBtZWRpdW06IFwiaDptbTpzcyBhXCIsXG4gIHNob3J0OiBcImg6bW0gYVwiLFxufTtcblxuY29uc3QgZGF0ZVRpbWVGb3JtYXRzID0ge1xuICBmdWxsOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbG9uZzogXCJ7e2RhdGV9fSAnYXQnIHt7dGltZX19XCIsXG4gIG1lZGl1bTogXCJ7e2RhdGV9fSwge3t0aW1lfX1cIixcbiAgc2hvcnQ6IFwie3tkYXRlfX0sIHt7dGltZX19XCIsXG59O1xuXG5jb25zdCBmb3JtYXRMb25nID0gKGV4cG9ydHMuZm9ybWF0TG9uZyA9IHtcbiAgZGF0ZTogKDAsIF9pbmRleC5idWlsZEZvcm1hdExvbmdGbikoe1xuICAgIGZvcm1hdHM6IGRhdGVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIHRpbWU6ICgwLCBfaW5kZXguYnVpbGRGb3JtYXRMb25nRm4pKHtcbiAgICBmb3JtYXRzOiB0aW1lRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcblxuICBkYXRlVGltZTogKDAsIF9pbmRleC5idWlsZEZvcm1hdExvbmdGbikoe1xuICAgIGZvcm1hdHM6IGRhdGVUaW1lRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLmZvcm1hdFJlbGF0aXZlID0gdm9pZCAwO1xuXG5jb25zdCBmb3JtYXRSZWxhdGl2ZUxvY2FsZSA9IHtcbiAgbGFzdFdlZWs6IFwiJ2xhc3QnIGVlZWUgJ2F0JyBwXCIsXG4gIHllc3RlcmRheTogXCIneWVzdGVyZGF5IGF0JyBwXCIsXG4gIHRvZGF5OiBcIid0b2RheSBhdCcgcFwiLFxuICB0b21vcnJvdzogXCIndG9tb3Jyb3cgYXQnIHBcIixcbiAgbmV4dFdlZWs6IFwiZWVlZSAnYXQnIHBcIixcbiAgb3RoZXI6IFwiUFwiLFxufTtcblxuY29uc3QgZm9ybWF0UmVsYXRpdmUgPSAodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSA9PlxuICBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl07XG5leHBvcnRzLmZvcm1hdFJlbGF0aXZlID0gZm9ybWF0UmVsYXRpdmU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMubG9jYWxpemUgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzXCIpO1xuXG5jb25zdCBlcmFWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiQlwiLCBcIkFcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJCQ1wiLCBcIkFEXCJdLFxuICB3aWRlOiBbXCJCZWZvcmUgQ2hyaXN0XCIsIFwiQW5ubyBEb21pbmlcIl0sXG59O1xuXG5jb25zdCBxdWFydGVyVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJRMVwiLCBcIlEyXCIsIFwiUTNcIiwgXCJRNFwiXSxcbiAgd2lkZTogW1wiMXN0IHF1YXJ0ZXJcIiwgXCIybmQgcXVhcnRlclwiLCBcIjNyZCBxdWFydGVyXCIsIFwiNHRoIHF1YXJ0ZXJcIl0sXG59O1xuXG4vLyBOb3RlOiBpbiBFbmdsaXNoLCB0aGUgbmFtZXMgb2YgZGF5cyBvZiB0aGUgd2VlayBhbmQgbW9udGhzIGFyZSBjYXBpdGFsaXplZC5cbi8vIElmIHlvdSBhcmUgbWFraW5nIGEgbmV3IGxvY2FsZSBiYXNlZCBvbiB0aGlzIG9uZSwgY2hlY2sgaWYgdGhlIHNhbWUgaXMgdHJ1ZSBmb3IgdGhlIGxhbmd1YWdlIHlvdSdyZSB3b3JraW5nIG9uLlxuLy8gR2VuZXJhbGx5LCBmb3JtYXR0ZWQgZGF0ZXMgc2hvdWxkIGxvb2sgbGlrZSB0aGV5IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgc2VudGVuY2UsXG4vLyBlLmcuIGluIFNwYW5pc2ggbGFuZ3VhZ2UgdGhlIHdlZWtkYXlzIGFuZCBtb250aHMgc2hvdWxkIGJlIGluIHRoZSBsb3dlcmNhc2UuXG5jb25zdCBtb250aFZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJKXCIsIFwiRlwiLCBcIk1cIiwgXCJBXCIsIFwiTVwiLCBcIkpcIiwgXCJKXCIsIFwiQVwiLCBcIlNcIiwgXCJPXCIsIFwiTlwiLCBcIkRcIl0sXG4gIGFiYnJldmlhdGVkOiBbXG4gICAgXCJKYW5cIixcbiAgICBcIkZlYlwiLFxuICAgIFwiTWFyXCIsXG4gICAgXCJBcHJcIixcbiAgICBcIk1heVwiLFxuICAgIFwiSnVuXCIsXG4gICAgXCJKdWxcIixcbiAgICBcIkF1Z1wiLFxuICAgIFwiU2VwXCIsXG4gICAgXCJPY3RcIixcbiAgICBcIk5vdlwiLFxuICAgIFwiRGVjXCIsXG4gIF0sXG5cbiAgd2lkZTogW1xuICAgIFwiSmFudWFyeVwiLFxuICAgIFwiRmVicnVhcnlcIixcbiAgICBcIk1hcmNoXCIsXG4gICAgXCJBcHJpbFwiLFxuICAgIFwiTWF5XCIsXG4gICAgXCJKdW5lXCIsXG4gICAgXCJKdWx5XCIsXG4gICAgXCJBdWd1c3RcIixcbiAgICBcIlNlcHRlbWJlclwiLFxuICAgIFwiT2N0b2JlclwiLFxuICAgIFwiTm92ZW1iZXJcIixcbiAgICBcIkRlY2VtYmVyXCIsXG4gIF0sXG59O1xuXG5jb25zdCBkYXlWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiU1wiLCBcIk1cIiwgXCJUXCIsIFwiV1wiLCBcIlRcIiwgXCJGXCIsIFwiU1wiXSxcbiAgc2hvcnQ6IFtcIlN1XCIsIFwiTW9cIiwgXCJUdVwiLCBcIldlXCIsIFwiVGhcIiwgXCJGclwiLCBcIlNhXCJdLFxuICBhYmJyZXZpYXRlZDogW1wiU3VuXCIsIFwiTW9uXCIsIFwiVHVlXCIsIFwiV2VkXCIsIFwiVGh1XCIsIFwiRnJpXCIsIFwiU2F0XCJdLFxuICB3aWRlOiBbXG4gICAgXCJTdW5kYXlcIixcbiAgICBcIk1vbmRheVwiLFxuICAgIFwiVHVlc2RheVwiLFxuICAgIFwiV2VkbmVzZGF5XCIsXG4gICAgXCJUaHVyc2RheVwiLFxuICAgIFwiRnJpZGF5XCIsXG4gICAgXCJTYXR1cmRheVwiLFxuICBdLFxufTtcblxuY29uc3QgZGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogXCJhXCIsXG4gICAgcG06IFwicFwiLFxuICAgIG1pZG5pZ2h0OiBcIm1pXCIsXG4gICAgbm9vbjogXCJuXCIsXG4gICAgbW9ybmluZzogXCJtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiZXZlbmluZ1wiLFxuICAgIG5pZ2h0OiBcIm5pZ2h0XCIsXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06IFwiQU1cIixcbiAgICBwbTogXCJQTVwiLFxuICAgIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gICAgbm9vbjogXCJub29uXCIsXG4gICAgbW9ybmluZzogXCJtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiZXZlbmluZ1wiLFxuICAgIG5pZ2h0OiBcIm5pZ2h0XCIsXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogXCJhLm0uXCIsXG4gICAgcG06IFwicC5tLlwiLFxuICAgIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gICAgbm9vbjogXCJub29uXCIsXG4gICAgbW9ybmluZzogXCJtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiZXZlbmluZ1wiLFxuICAgIG5pZ2h0OiBcIm5pZ2h0XCIsXG4gIH0sXG59O1xuXG5jb25zdCBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogXCJhXCIsXG4gICAgcG06IFwicFwiLFxuICAgIG1pZG5pZ2h0OiBcIm1pXCIsXG4gICAgbm9vbjogXCJuXCIsXG4gICAgbW9ybmluZzogXCJpbiB0aGUgbW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJpbiB0aGUgYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJpbiB0aGUgZXZlbmluZ1wiLFxuICAgIG5pZ2h0OiBcImF0IG5pZ2h0XCIsXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06IFwiQU1cIixcbiAgICBwbTogXCJQTVwiLFxuICAgIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gICAgbm9vbjogXCJub29uXCIsXG4gICAgbW9ybmluZzogXCJpbiB0aGUgbW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJpbiB0aGUgYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJpbiB0aGUgZXZlbmluZ1wiLFxuICAgIG5pZ2h0OiBcImF0IG5pZ2h0XCIsXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogXCJhLm0uXCIsXG4gICAgcG06IFwicC5tLlwiLFxuICAgIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gICAgbm9vbjogXCJub29uXCIsXG4gICAgbW9ybmluZzogXCJpbiB0aGUgbW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJpbiB0aGUgYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJpbiB0aGUgZXZlbmluZ1wiLFxuICAgIG5pZ2h0OiBcImF0IG5pZ2h0XCIsXG4gIH0sXG59O1xuXG5jb25zdCBvcmRpbmFsTnVtYmVyID0gKGRpcnR5TnVtYmVyLCBfb3B0aW9ucykgPT4ge1xuICBjb25zdCBudW1iZXIgPSBOdW1iZXIoZGlydHlOdW1iZXIpO1xuXG4gIC8vIElmIG9yZGluYWwgbnVtYmVycyBkZXBlbmQgb24gY29udGV4dCwgZm9yIGV4YW1wbGUsXG4gIC8vIGlmIHRoZXkgYXJlIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGdyYW1tYXRpY2FsIGdlbmRlcnMsXG4gIC8vIHVzZSBgb3B0aW9ucy51bml0YC5cbiAgLy9cbiAgLy8gYHVuaXRgIGNhbiBiZSAneWVhcicsICdxdWFydGVyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF0ZScsICdkYXlPZlllYXInLFxuICAvLyAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcuXG5cbiAgY29uc3QgcmVtMTAwID0gbnVtYmVyICUgMTAwO1xuICBpZiAocmVtMTAwID4gMjAgfHwgcmVtMTAwIDwgMTApIHtcbiAgICBzd2l0Y2ggKHJlbTEwMCAlIDEwKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBudW1iZXIgKyBcInN0XCI7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBudW1iZXIgKyBcIm5kXCI7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHJldHVybiBudW1iZXIgKyBcInJkXCI7XG4gICAgfVxuICB9XG4gIHJldHVybiBudW1iZXIgKyBcInRoXCI7XG59O1xuXG5jb25zdCBsb2NhbGl6ZSA9IChleHBvcnRzLmxvY2FsaXplID0ge1xuICBvcmRpbmFsTnVtYmVyLFxuXG4gIGVyYTogKDAsIF9pbmRleC5idWlsZExvY2FsaXplRm4pKHtcbiAgICB2YWx1ZXM6IGVyYVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBxdWFydGVyOiAoMCwgX2luZGV4LmJ1aWxkTG9jYWxpemVGbikoe1xuICAgIHZhbHVlczogcXVhcnRlclZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGFyZ3VtZW50Q2FsbGJhY2s6IChxdWFydGVyKSA9PiBxdWFydGVyIC0gMSxcbiAgfSksXG5cbiAgbW9udGg6ICgwLCBfaW5kZXguYnVpbGRMb2NhbGl6ZUZuKSh7XG4gICAgdmFsdWVzOiBtb250aFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXk6ICgwLCBfaW5kZXguYnVpbGRMb2NhbGl6ZUZuKSh7XG4gICAgdmFsdWVzOiBkYXlWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5UGVyaW9kOiAoMCwgX2luZGV4LmJ1aWxkTG9jYWxpemVGbikoe1xuICAgIHZhbHVlczogZGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gICAgZm9ybWF0dGluZ1ZhbHVlczogZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0Rm9ybWF0dGluZ1dpZHRoOiBcIndpZGVcIixcbiAgfSksXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5tYXRjaCA9IHZvaWQgMDtcblxudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hGbi5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qc1wiKTtcblxuY29uc3QgbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9eKFxcZCspKHRofHN0fG5kfHJkKT8vaTtcbmNvbnN0IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXFxkKy9pO1xuXG5jb25zdCBtYXRjaEVyYVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGJ8YSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGJcXC4/XFxzP2NcXC4/fGJcXC4/XFxzP2NcXC4/XFxzP2VcXC4/fGFcXC4/XFxzP2RcXC4/fGNcXC4/XFxzP2VcXC4/KS9pLFxuICB3aWRlOiAvXihiZWZvcmUgY2hyaXN0fGJlZm9yZSBjb21tb24gZXJhfGFubm8gZG9taW5pfGNvbW1vbiBlcmEpL2ksXG59O1xuY29uc3QgcGFyc2VFcmFQYXR0ZXJucyA9IHtcbiAgYW55OiBbL15iL2ksIC9eKGF8YykvaV0sXG59O1xuXG5jb25zdCBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlsxMjM0XS9pLFxuICBhYmJyZXZpYXRlZDogL15xWzEyMzRdL2ksXG4gIHdpZGU6IC9eWzEyMzRdKHRofHN0fG5kfHJkKT8gcXVhcnRlci9pLFxufTtcbmNvbnN0IHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXSxcbn07XG5cbmNvbnN0IG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltqZm1hc29uZF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLFxuICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pLFxufTtcbmNvbnN0IHBhcnNlTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbXG4gICAgL15qL2ksXG4gICAgL15mL2ksXG4gICAgL15tL2ksXG4gICAgL15hL2ksXG4gICAgL15tL2ksXG4gICAgL15qL2ksXG4gICAgL15qL2ksXG4gICAgL15hL2ksXG4gICAgL15zL2ksXG4gICAgL15vL2ksXG4gICAgL15uL2ksXG4gICAgL15kL2ksXG4gIF0sXG5cbiAgYW55OiBbXG4gICAgL15qYS9pLFxuICAgIC9eZi9pLFxuICAgIC9ebWFyL2ksXG4gICAgL15hcC9pLFxuICAgIC9ebWF5L2ksXG4gICAgL15qdW4vaSxcbiAgICAvXmp1bC9pLFxuICAgIC9eYXUvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcbn07XG5cbmNvbnN0IG1hdGNoRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bc210d2ZdL2ksXG4gIHNob3J0OiAvXihzdXxtb3x0dXx3ZXx0aHxmcnxzYSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKHN1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCkvaSxcbiAgd2lkZTogL14oc3VuZGF5fG1vbmRheXx0dWVzZGF5fHdlZG5lc2RheXx0aHVyc2RheXxmcmlkYXl8c2F0dXJkYXkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15zL2ksIC9ebS9pLCAvXnQvaSwgL153L2ksIC9edC9pLCAvXmYvaSwgL15zL2ldLFxuICBhbnk6IFsvXnN1L2ksIC9ebS9pLCAvXnR1L2ksIC9edy9pLCAvXnRoL2ksIC9eZi9pLCAvXnNhL2ldLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG4gIGFueTogL14oW2FwXVxcLj9cXHM/bVxcLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9eYS9pLFxuICAgIHBtOiAvXnAvaSxcbiAgICBtaWRuaWdodDogL15taS9pLFxuICAgIG5vb246IC9ebm8vaSxcbiAgICBtb3JuaW5nOiAvbW9ybmluZy9pLFxuICAgIGFmdGVybm9vbjogL2FmdGVybm9vbi9pLFxuICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksXG4gICAgbmlnaHQ6IC9uaWdodC9pLFxuICB9LFxufTtcblxuY29uc3QgbWF0Y2ggPSAoZXhwb3J0cy5tYXRjaCA9IHtcbiAgb3JkaW5hbE51bWJlcjogKDAsIF9pbmRleDIuYnVpbGRNYXRjaFBhdHRlcm5Gbikoe1xuICAgIG1hdGNoUGF0dGVybjogbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICBwYXJzZVBhdHRlcm46IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgdmFsdWVDYWxsYmFjazogKHZhbHVlKSA9PiBwYXJzZUludCh2YWx1ZSwgMTApLFxuICB9KSxcblxuICBlcmE6ICgwLCBfaW5kZXguYnVpbGRNYXRjaEZuKSh7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hFcmFQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VFcmFQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogKDAsIF9pbmRleC5idWlsZE1hdGNoRm4pKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gICAgdmFsdWVDYWxsYmFjazogKGluZGV4KSA9PiBpbmRleCArIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiAoMCwgX2luZGV4LmJ1aWxkTWF0Y2hGbikoe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBkYXk6ICgwLCBfaW5kZXguYnVpbGRNYXRjaEZuKSh7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5UGVyaW9kOiAoMCwgX2luZGV4LmJ1aWxkTWF0Y2hGbikoe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwiYW55XCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5tYXggPSBtYXg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIG1heFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGxhdGVzdCBvZiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGxhdGVzdCBvZiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVzIC0gVGhlIGRhdGVzIHRvIGNvbXBhcmVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbGF0ZXN0IG9mIHRoZSBkYXRlc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBvZiB0aGVzZSBkYXRlcyBpcyB0aGUgbGF0ZXN0P1xuICogY29uc3QgcmVzdWx0ID0gbWF4KFtcbiAqICAgbmV3IERhdGUoMTk4OSwgNiwgMTApLFxuICogICBuZXcgRGF0ZSgxOTg3LCAxLCAxMSksXG4gKiAgIG5ldyBEYXRlKDE5OTUsIDYsIDIpLFxuICogICBuZXcgRGF0ZSgxOTkwLCAwLCAxKVxuICogXSlcbiAqIC8vPT4gU3VuIEp1bCAwMiAxOTk1IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIG1heChkYXRlcykge1xuICBsZXQgcmVzdWx0O1xuICBkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJ0eURhdGUpIHtcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkaXJ0eURhdGUpO1xuXG4gICAgaWYgKFxuICAgICAgcmVzdWx0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHJlc3VsdCA8IGN1cnJlbnREYXRlIHx8XG4gICAgICBpc05hTihOdW1iZXIoY3VycmVudERhdGUpKVxuICAgICkge1xuICAgICAgcmVzdWx0ID0gY3VycmVudERhdGU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0IHx8IG5ldyBEYXRlKE5hTik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMubWluID0gbWluO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBtaW5cbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJucyB0aGUgZWFybGllc3Qgb2YgdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyB0aGUgZWFybGllc3Qgb2YgdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlcyAtIFRoZSBkYXRlcyB0byBjb21wYXJlXG4gKlxuICogQHJldHVybnMgVGhlIGVhcmxpZXN0IG9mIHRoZSBkYXRlc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBvZiB0aGVzZSBkYXRlcyBpcyB0aGUgZWFybGllc3Q/XG4gKiBjb25zdCByZXN1bHQgPSBtaW4oW1xuICogICBuZXcgRGF0ZSgxOTg5LCA2LCAxMCksXG4gKiAgIG5ldyBEYXRlKDE5ODcsIDEsIDExKSxcbiAqICAgbmV3IERhdGUoMTk5NSwgNiwgMiksXG4gKiAgIG5ldyBEYXRlKDE5OTAsIDAsIDEpXG4gKiBdKVxuICogLy89PiBXZWQgRmViIDExIDE5ODcgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gbWluKGRhdGVzKSB7XG4gIGxldCByZXN1bHQ7XG5cbiAgZGF0ZXMuZm9yRWFjaCgoZGlydHlEYXRlKSA9PiB7XG4gICAgY29uc3QgZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkaXJ0eURhdGUpO1xuICAgIGlmICghcmVzdWx0IHx8IHJlc3VsdCA+IGRhdGUgfHwgaXNOYU4oK2RhdGUpKSB7XG4gICAgICByZXN1bHQgPSBkYXRlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdCB8fCBuZXcgRGF0ZShOYU4pO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJsb25nRm9ybWF0dGVyc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfaW5kZXg1LmxvbmdGb3JtYXR0ZXJzO1xuICB9LFxufSk7XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJwYXJzZXJzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9pbmRleDcucGFyc2VycztcbiAgfSxcbn0pO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2dldERlZmF1bHRPcHRpb25zLmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi9fbGliL2RlZmF1bHRMb2NhbGUuanNcIik7XG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxudmFyIF9pbmRleDUgPSByZXF1aXJlKFwiLi9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qc1wiKTtcbnZhciBfaW5kZXg2ID0gcmVxdWlyZShcIi4vX2xpYi9wcm90ZWN0ZWRUb2tlbnMuanNcIik7XG5cbnZhciBfaW5kZXg3ID0gcmVxdWlyZShcIi4vcGFyc2UvX2xpYi9wYXJzZXJzLmpzXCIpO1xuXG52YXIgX1NldHRlciA9IHJlcXVpcmUoXCIuL3BhcnNlL19saWIvU2V0dGVyLmpzXCIpO1xuXG4vLyBSZXhwb3J0cyBvZiBpbnRlcm5hbCBmb3IgbGlicmFyaWVzIHRvIHVzZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNjM4I2lzc3VlY29tbWVudC0xODc3MDgyODc0XG5cbi8qKlxuICogVGhlIHtAbGluayBwYXJzZX0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vLyBUaGlzIFJlZ0V4cCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyBzZXBhcmF0ZWQgYnkgYHxgOlxuLy8gLSBbeVlRcU1Md0lkRGVjaWhIS2ttc11vIG1hdGNoZXMgYW55IGF2YWlsYWJsZSBvcmRpbmFsIG51bWJlciB0b2tlblxuLy8gICAob25lIG9mIHRoZSBjZXJ0YWluIGxldHRlcnMgZm9sbG93ZWQgYnkgYG9gKVxuLy8gLSAoXFx3KVxcMSogbWF0Y2hlcyBhbnkgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIGxldHRlclxuLy8gLSAnJyBtYXRjaGVzIHR3byBxdW90ZSBjaGFyYWN0ZXJzIGluIGEgcm93XG4vLyAtICcoJyd8W14nXSkrKCd8JCkgbWF0Y2hlcyBhbnl0aGluZyBzdXJyb3VuZGVkIGJ5IHR3byBxdW90ZSBjaGFyYWN0ZXJzICgnKSxcbi8vICAgZXhjZXB0IGEgc2luZ2xlIHF1b3RlIHN5bWJvbCwgd2hpY2ggZW5kcyB0aGUgc2VxdWVuY2UuXG4vLyAgIFR3byBxdW90ZSBjaGFyYWN0ZXJzIGRvIG5vdCBlbmQgdGhlIHNlcXVlbmNlLlxuLy8gICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzaW5nbGUgcXVvdGVcbi8vICAgdGhlbiB0aGUgc2VxdWVuY2Ugd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG4vLyAtIC4gbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciB1bm1hdGNoZWQgYnkgcHJldmlvdXMgcGFydHMgb2YgdGhlIFJlZ0V4cHNcbmNvbnN0IGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPVxuICAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXFx3KVxcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbi8vIFRoaXMgUmVnRXhwIGNhdGNoZXMgc3ltYm9scyBlc2NhcGVkIGJ5IHF1b3RlcywgYW5kIGFsc29cbi8vIHNlcXVlbmNlcyBvZiBzeW1ib2xzIFAsIHAsIGFuZCB0aGUgY29tYmluYXRpb25zIGxpa2UgYFBQUFBQUFBwcHBwcGBcbmNvbnN0IGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbmNvbnN0IGVzY2FwZWRTdHJpbmdSZWdFeHAgPSAvXicoW15dKj8pJz8kLztcbmNvbnN0IGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG5cbmNvbnN0IG5vdFdoaXRlc3BhY2VSZWdFeHAgPSAvXFxTLztcbmNvbnN0IHVuZXNjYXBlZExhdGluQ2hhcmFjdGVyUmVnRXhwID0gL1thLXpBLVpdLztcblxuLyoqXG4gKiBAbmFtZSBwYXJzZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBQYXJzZSB0aGUgZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZGF0ZSBwYXJzZWQgZnJvbSBzdHJpbmcgdXNpbmcgdGhlIGdpdmVuIGZvcm1hdCBzdHJpbmcuXG4gKlxuICogPiDimqDvuI8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgYGZvcm1hdGAgdG9rZW5zIGRpZmZlciBmcm9tIE1vbWVudC5qcyBhbmQgb3RoZXIgbGlicmFyaWVzLlxuICogPiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiBUaGUgY2hhcmFjdGVycyBpbiB0aGUgZm9ybWF0IHN0cmluZyB3cmFwcGVkIGJldHdlZW4gdHdvIHNpbmdsZSBxdW90ZXMgY2hhcmFjdGVycyAoJykgYXJlIGVzY2FwZWQuXG4gKiBUd28gc2luZ2xlIHF1b3RlcyBpbiBhIHJvdywgd2hldGhlciBpbnNpZGUgb3Igb3V0c2lkZSBhIHF1b3RlZCBzZXF1ZW5jZSwgcmVwcmVzZW50IGEgJ3JlYWwnIHNpbmdsZSBxdW90ZS5cbiAqXG4gKiBGb3JtYXQgb2YgdGhlIGZvcm1hdCBzdHJpbmcgaXMgYmFzZWQgb24gVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuICogd2l0aCBhIGZldyBhZGRpdGlvbnMgKHNlZSBub3RlIDUgYmVsb3cgdGhlIHRhYmxlKS5cbiAqXG4gKiBOb3QgYWxsIHRva2VucyBhcmUgY29tcGF0aWJsZS4gQ29tYmluYXRpb25zIHRoYXQgZG9uJ3QgbWFrZSBzZW5zZSBvciBjb3VsZCBsZWFkIHRvIGJ1Z3MgYXJlIHByb2hpYml0ZWRcbiAqIGFuZCB3aWxsIHRocm93IGBSYW5nZUVycm9yYC4gRm9yIGV4YW1wbGUgdXNhZ2Ugb2YgMjQtaG91ciBmb3JtYXQgdG9rZW4gd2l0aCBBTS9QTSB0b2tlbiB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbjpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwYXJzZSgnMjMgQU0nLCAnSEggYScsIG5ldyBEYXRlKCkpXG4gKiAvLz0+IFJhbmdlRXJyb3I6IFRoZSBmb3JtYXQgc3RyaW5nIG11c3RuJ3QgY29udGFpbiBgSEhgIGFuZCBgYWAgYXQgdGhlIHNhbWUgdGltZVxuICogYGBgXG4gKlxuICogU2VlIHRoZSBjb21wYXRpYmlsaXR5IHRhYmxlOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLzJQQUNYLTF2UU9QVTN4VWhwbGxsNmR5b01tVlVYSEtsXzhDUkRzNl91ZUxtZXgzU29xd2h1b2xrdU4zTzA1bDRycXg1aDFkS1g4ZWI0NlVsLUNDU3JxL3B1Ymh0bWw/Z2lkPTAmc2luZ2xlPXRydWVcbiAqXG4gKiBBY2NlcHRlZCBmb3JtYXQgc3RyaW5nIHBhdHRlcm5zOlxuICogfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxQcmlvcnwgUGF0dGVybiB8IFJlc3VsdCBleGFtcGxlcyAgICAgICAgICAgICAgICAgICB8IE5vdGVzIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS18XG4gKiB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNDAgfCBHLi5HR0cgIHwgQUQsIEJDICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgR0dHRyAgICB8IEFubm8gRG9taW5pLCBCZWZvcmUgQ2hyaXN0ICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEdHR0dHICAgfCBBLCBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IENhbGVuZGFyIHllYXIgICAgICAgICAgICAgICAgICAgfCAxMzAgfCB5ICAgICAgIHwgNDQsIDEsIDE5MDAsIDIwMTcsIDk5OTkgICAgICAgICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeW8gICAgICB8IDQ0dGgsIDFzdCwgMTkwMHRoLCA5OTk5OTk5dGggICAgICB8IDQsNSAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHl5ICAgICAgfCA0NCwgMDEsIDAwLCAxNyAgICAgICAgICAgICAgICAgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB5eXkgICAgIHwgMDQ0LCAwMDEsIDEyMywgOTk5ICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeXl5eSAgICB8IDAwNDQsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHl5eXl5ICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyLDQgICB8XG4gKiB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICAgfCAxMzAgfCBZICAgICAgIHwgNDQsIDEsIDE5MDAsIDIwMTcsIDkwMDAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWW8gICAgICB8IDQ0dGgsIDFzdCwgMTkwMHRoLCA5OTk5OTk5dGggICAgICB8IDQsNSAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFlZICAgICAgfCA0NCwgMDEsIDAwLCAxNyAgICAgICAgICAgICAgICAgICAgfCA0LDYgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBZWVkgICAgIHwgMDQ0LCAwMDEsIDEyMywgOTk5ICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWVlZWSAgICB8IDAwNDQsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICB8IDQsNiAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFlZWVlZICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyLDQgICB8XG4gKiB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICAgfCAxMzAgfCBSICAgICAgIHwgLTQzLCAxLCAxOTAwLCAyMDE3LCA5OTk5LCAtOTk5OSAgIHwgNCw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUlIgICAgICB8IC00MywgMDEsIDAwLCAxNyAgICAgICAgICAgICAgICAgICB8IDQsNSAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFJSUiAgICAgfCAtMDQzLCAwMDEsIDEyMywgOTk5LCAtOTk5ICAgICAgICAgfCA0LDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBSUlJSICAgIHwgLTAwNDMsIDAwMDEsIDIwMTcsIDk5OTksIC05OTk5ICAgIHwgNCw1ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUlJSUlIgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIsNCw1IHxcbiAqIHwgRXh0ZW5kZWQgeWVhciAgICAgICAgICAgICAgICAgICB8IDEzMCB8IHUgICAgICAgfCAtNDMsIDEsIDE5MDAsIDIwMTcsIDk5OTksIC05OTkgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB1dSAgICAgIHwgLTQzLCAwMSwgOTksIC05OSAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgdXV1ICAgICB8IC0wNDMsIDAwMSwgMTIzLCA5OTksIC05OTkgICAgICAgICB8IDQgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHV1dXUgICAgfCAtMDA0MywgMDAwMSwgMjAxNywgOTk5OSwgLTk5OTkgICAgfCA0ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB1dXV1dSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiw0ICAgfFxuICogfCBRdWFydGVyIChmb3JtYXR0aW5nKSAgICAgICAgICAgIHwgMTIwIHwgUSAgICAgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFFvICAgICAgfCAxc3QsIDJuZCwgM3JkLCA0dGggICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBRUSAgICAgIHwgMDEsIDAyLCAwMywgMDQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUVFRICAgICB8IFExLCBRMiwgUTMsIFE0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFFRUVEgICAgfCAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBRUVFRUSAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgfFxuICogfCBRdWFydGVyIChzdGFuZC1hbG9uZSkgICAgICAgICAgIHwgMTIwIHwgcSAgICAgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHFvICAgICAgfCAxc3QsIDJuZCwgM3JkLCA0dGggICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBxcSAgICAgIHwgMDEsIDAyLCAwMywgMDQgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgcXFxICAgICB8IFExLCBRMiwgUTMsIFE0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHFxcXEgICAgfCAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBxcXFxcSAgIHwgMSwgMiwgMywgNCAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBNb250aCAoZm9ybWF0dGluZykgICAgICAgICAgICAgIHwgMTEwIHwgTSAgICAgICB8IDEsIDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IE1vICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMnRoICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBNTSAgICAgIHwgMDEsIDAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTU1NICAgICB8IEphbiwgRmViLCAuLi4sIERlYyAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IE1NTU0gICAgfCBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlciAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBNTU1NTSAgIHwgSiwgRiwgLi4uLCBEICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNb250aCAoc3RhbmQtYWxvbmUpICAgICAgICAgICAgIHwgMTEwIHwgTCAgICAgICB8IDEsIDIsIC4uLiwgMTIgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IExvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMnRoICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBMTCAgICAgIHwgMDEsIDAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgTExMICAgICB8IEphbiwgRmViLCAuLi4sIERlYyAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IExMTEwgICAgfCBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlciAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBMTExMTCAgIHwgSiwgRiwgLi4uLCBEICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgIHwgMTAwIHwgdyAgICAgICB8IDEsIDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHdvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA1M3RoICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB3dyAgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBJU08gd2VlayBvZiB5ZWFyICAgICAgICAgICAgICAgIHwgMTAwIHwgSSAgICAgICB8IDEsIDIsIC4uLiwgNTMgICAgICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IElvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA1M3RoICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBJSSAgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgIHwgIDkwIHwgZCAgICAgICB8IDEsIDIsIC4uLiwgMzEgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGRvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAzMXN0ICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBkZCAgICAgIHwgMDEsIDAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBEYXkgb2YgeWVhciAgICAgICAgICAgICAgICAgICAgIHwgIDkwIHwgRCAgICAgICB8IDEsIDIsIC4uLiwgMzY1LCAzNjYgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IERvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAzNjV0aCwgMzY2dGggICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBERCAgICAgIHwgMDEsIDAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgREREICAgICB8IDAwMSwgMDAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEREREQgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8IERheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICAgICAgfCAgOTAgfCBFLi5FRUUgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgRUVFRSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEVFRUVFICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBFRUVFRUUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBJU08gZGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICAgIHwgIDkwIHwgaSAgICAgICB8IDEsIDIsIDMsIC4uLiwgNyAgICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGlvICAgICAgfCAxc3QsIDJuZCwgLi4uLCA3dGggICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBpaSAgICAgIHwgMDEsIDAyLCAuLi4sIDA3ICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaWlpICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGlpaWkgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyLDUgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBpaWlpaSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgaWlpaWlpICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8IDUgICAgIHxcbiAqIHwgTG9jYWwgZGF5IG9mIHdlZWsgKGZvcm1hdHRpbmcpICB8ICA5MCB8IGUgICAgICAgfCAyLCAzLCA0LCAuLi4sIDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBlbyAgICAgIHwgMm5kLCAzcmQsIC4uLiwgMXN0ICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZWUgICAgICB8IDAyLCAwMywgLi4uLCAwMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGVlZSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBlZWVlICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgZWVlZWUgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGVlZWVlZSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCAgICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChzdGFuZC1hbG9uZSkgfCAgOTAgfCBjICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgY28gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGNjICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBjY2MgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgY2NjYyAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGNjY2NjICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBjY2NjY2MgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDgwIHwgYS4uYWFhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGFhYWEgICAgfCBhLm0uLCBwLm0uICAgICAgICAgICAgICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBhYWFhYSAgIHwgYSwgcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgIHwgIDgwIHwgYi4uYmJiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGJiYmIgICAgfCBhLm0uLCBwLm0uLCBub29uLCBtaWRuaWdodCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBiYmJiYiAgIHwgYSwgcCwgbiwgbWkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgIHwgIDgwIHwgQi4uQkJCICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEJCQkIgICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBCQkJCQiAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgIHwgIDcwIHwgaCAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGhvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAxMnRoICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBoaCAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgIHwgIDcwIHwgSCAgICAgICB8IDAsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEhvICAgICAgfCAwdGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBISCAgICAgIHwgMDAsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgIHwgIDcwIHwgSyAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IEtvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAwdGggICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBLSyAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgIHwgIDcwIHwgayAgICAgICB8IDI0LCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IGtvICAgICAgfCAyNHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBrayAgICAgIHwgMjQsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDYwIHwgbSAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IG1vICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBtbSAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDUwIHwgcyAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHNvICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBzcyAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgIHwgIDQwIHwgdCAgICAgICB8IDUxMjk2OTUyMCAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHR0ICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICAgfCAgMzAgfCBTICAgICAgIHwgMCwgMSwgLi4uLCA5ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgU1MgICAgICB8IDAwLCAwMSwgLi4uLCA5OSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFNTUyAgICAgfCAwMDAsIDAwMSwgLi4uLCA5OTkgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBTU1NTICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCBNaWxsaXNlY29uZHMgdGltZXN0YW1wICAgICAgICAgIHwgIDIwIHwgVCAgICAgICB8IDUxMjk2OTUyMDkwMCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFRUICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyICAgICB8XG4gKiB8IFRpbWV6b25lIChJU08tODYwMSB3LyBaKSAgICAgICAgfCAgMTAgfCBYICAgICAgIHwgLTA4LCArMDUzMCwgWiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWFggICAgICB8IC0wODAwLCArMDUzMCwgWiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFhYWCAgICAgfCAtMDg6MDAsICswNTozMCwgWiAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBYWFhYICAgIHwgLTA4MDAsICswNTMwLCBaLCArMTIzNDU2ICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgWFhYWFggICB8IC0wODowMCwgKzA1OjMwLCBaLCArMTI6MzQ6NTYgICAgICB8ICAgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvbyBaKSAgICAgICB8ICAxMCB8IHggICAgICAgfCAtMDgsICswNTMwLCArMDAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB4eCAgICAgIHwgLTA4MDAsICswNTMwLCArMDAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgeHh4ICAgICB8IC0wODowMCwgKzA1OjMwLCArMDA6MDAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IHh4eHggICAgfCAtMDgwMCwgKzA1MzAsICswMDAwLCArMTIzNDU2ICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCB4eHh4eCAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCwgKzEyOjM0OjU2IHwgICAgICAgfFxuICogfCBMb25nIGxvY2FsaXplZCBkYXRlICAgICAgICAgICAgIHwgIE5BIHwgUCAgICAgICB8IDA1LzI5LzE0NTMgICAgICAgICAgICAgICAgICAgICAgICB8IDUsOCAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFBQICAgICAgfCBNYXkgMjksIDE0NTMgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBQUFAgICAgIHwgTWF5IDI5dGgsIDE0NTMgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUFBQUCAgICB8IFN1bmRheSwgTWF5IDI5dGgsIDE0NTMgICAgICAgICAgICB8IDIsNSw4IHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgdGltZSAgICAgICAgICAgICB8ICBOQSB8IHAgICAgICAgfCAxMjowMCBBTSAgICAgICAgICAgICAgICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBwcCAgICAgIHwgMTI6MDA6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDb21iaW5hdGlvbiBvZiBkYXRlIGFuZCB0aW1lICAgIHwgIE5BIHwgUHAgICAgICB8IDA1LzI5LzE0NTMsIDEyOjAwIEFNICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFBQcHAgICAgfCBNYXkgMjksIDE0NTMsIDEyOjAwOjAwIEFNICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBQUFBwcCAgIHwgTWF5IDI5dGgsIDE0NTMgYXQgLi4uICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgUFBQUHBwICB8IFN1bmRheSwgTWF5IDI5dGgsIDE0NTMgYXQgLi4uICAgICB8IDIsNSw4IHxcbiAqIE5vdGVzOlxuICogMS4gXCJGb3JtYXR0aW5nXCIgdW5pdHMgKGUuZy4gZm9ybWF0dGluZyBxdWFydGVyKSBpbiB0aGUgZGVmYXVsdCBlbi1VUyBsb2NhbGVcbiAqICAgIGFyZSB0aGUgc2FtZSBhcyBcInN0YW5kLWFsb25lXCIgdW5pdHMsIGJ1dCBhcmUgZGlmZmVyZW50IGluIHNvbWUgbGFuZ3VhZ2VzLlxuICogICAgXCJGb3JtYXR0aW5nXCIgdW5pdHMgYXJlIGRlY2xpbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGxhbmd1YWdlXG4gKiAgICBpbiB0aGUgY29udGV4dCBvZiBhIGRhdGUuIFwiU3RhbmQtYWxvbmVcIiB1bml0cyBhcmUgYWx3YXlzIG5vbWluYXRpdmUgc2luZ3VsYXIuXG4gKiAgICBJbiBgZm9ybWF0YCBmdW5jdGlvbiwgdGhleSB3aWxsIHByb2R1Y2UgZGlmZmVyZW50IHJlc3VsdDpcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ2RvIExMTEwnLCB7bG9jYWxlOiBjc30pIC8vPT4gJzYuIGxpc3RvcGFkJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ2RvIE1NTU0nLCB7bG9jYWxlOiBjc30pIC8vPT4gJzYuIGxpc3RvcGFkdSdgXG4gKlxuICogICAgYHBhcnNlYCB3aWxsIHRyeSB0byBtYXRjaCBib3RoIGZvcm1hdHRpbmcgYW5kIHN0YW5kLWFsb25lIHVuaXRzIGludGVyY2hhbmdhYmx5LlxuICpcbiAqIDIuIEFueSBzZXF1ZW5jZSBvZiB0aGUgaWRlbnRpY2FsIGxldHRlcnMgaXMgYSBwYXR0ZXJuLCB1bmxlc3MgaXQgaXMgZXNjYXBlZCBieVxuICogICAgdGhlIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIChzZWUgYmVsb3cpLlxuICogICAgSWYgdGhlIHNlcXVlbmNlIGlzIGxvbmdlciB0aGFuIGxpc3RlZCBpbiB0YWJsZTpcbiAqICAgIC0gZm9yIG51bWVyaWNhbCB1bml0cyAoYHl5eXl5eXl5YCkgYHBhcnNlYCB3aWxsIHRyeSB0byBtYXRjaCBhIG51bWJlclxuICogICAgICBhcyB3aWRlIGFzIHRoZSBzZXF1ZW5jZVxuICogICAgLSBmb3IgdGV4dCB1bml0cyAoYE1NTU1NTU1NYCkgYHBhcnNlYCB3aWxsIHRyeSB0byBtYXRjaCB0aGUgd2lkZXN0IHZhcmlhdGlvbiBvZiB0aGUgdW5pdC5cbiAqICAgICAgVGhlc2UgdmFyaWF0aW9ucyBhcmUgbWFya2VkIHdpdGggXCIyXCIgaW4gdGhlIGxhc3QgY29sdW1uIG9mIHRoZSB0YWJsZS5cbiAqXG4gKiAzLiBgUVFRUVFgIGFuZCBgcXFxcXFgIGNvdWxkIGJlIG5vdCBzdHJpY3RseSBudW1lcmljYWwgaW4gc29tZSBsb2NhbGVzLlxuICogICAgVGhlc2UgdG9rZW5zIHJlcHJlc2VudCB0aGUgc2hvcnRlc3QgZm9ybSBvZiB0aGUgcXVhcnRlci5cbiAqXG4gKiA0LiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gYHlgIGFuZCBgdWAgcGF0dGVybnMgYXJlIEIuQy4geWVhcnM6XG4gKlxuICogICAgfCBZZWFyIHwgYHlgIHwgYHVgIHxcbiAqICAgIHwtLS0tLS18LS0tLS18LS0tLS18XG4gKiAgICB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICogICAgfCBCQyAxIHwgICAxIHwgICAwIHxcbiAqICAgIHwgQkMgMiB8ICAgMiB8ICAtMSB8XG4gKlxuICogICAgQWxzbyBgeXlgIHdpbGwgdHJ5IHRvIGd1ZXNzIHRoZSBjZW50dXJ5IG9mIHR3byBkaWdpdCB5ZWFyIGJ5IHByb3hpbWl0eSB3aXRoIGByZWZlcmVuY2VEYXRlYDpcbiAqXG4gKiAgICBgcGFyc2UoJzUwJywgJ3l5JywgbmV3IERhdGUoMjAxOCwgMCwgMSkpIC8vPT4gU2F0IEphbiAwMSAyMDUwIDAwOjAwOjAwYFxuICpcbiAqICAgIGBwYXJzZSgnNzUnLCAneXknLCBuZXcgRGF0ZSgyMDE4LCAwLCAxKSkgLy89PiBXZWQgSmFuIDAxIDE5NzUgMDA6MDA6MDBgXG4gKlxuICogICAgd2hpbGUgYHV1YCB3aWxsIGp1c3QgYXNzaWduIHRoZSB5ZWFyIGFzIGlzOlxuICpcbiAqICAgIGBwYXJzZSgnNTAnLCAndXUnLCBuZXcgRGF0ZSgyMDE4LCAwLCAxKSkgLy89PiBTYXQgSmFuIDAxIDAwNTAgMDA6MDA6MDBgXG4gKlxuICogICAgYHBhcnNlKCc3NScsICd1dScsIG5ldyBEYXRlKDIwMTgsIDAsIDEpKSAvLz0+IFR1ZSBKYW4gMDEgMDA3NSAwMDowMDowMGBcbiAqXG4gKiAgICBUaGUgc2FtZSBkaWZmZXJlbmNlIGlzIHRydWUgZm9yIGxvY2FsIGFuZCBJU08gd2Vlay1udW1iZXJpbmcgeWVhcnMgKGBZYCBhbmQgYFJgKSxcbiAqICAgIGV4Y2VwdCBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFycyBhcmUgZGVwZW5kZW50IG9uIGBvcHRpb25zLndlZWtTdGFydHNPbmBcbiAqICAgIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgIChjb21wYXJlIFtzZXRJU09XZWVrWWVhcl0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9zZXRJU09XZWVrWWVhcilcbiAqICAgIGFuZCBbc2V0V2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3Mvc2V0V2Vla1llYXIpKS5cbiAqXG4gKiA1LiBUaGVzZSBwYXR0ZXJucyBhcmUgbm90IGluIHRoZSBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzU6XG4gKiAgICAtIGBpYDogSVNPIGRheSBvZiB3ZWVrXG4gKiAgICAtIGBJYDogSVNPIHdlZWsgb2YgeWVhclxuICogICAgLSBgUmA6IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKiAgICAtIGBvYDogb3JkaW5hbCBudW1iZXIgbW9kaWZpZXJcbiAqICAgIC0gYFBgOiBsb25nIGxvY2FsaXplZCBkYXRlXG4gKiAgICAtIGBwYDogbG9uZyBsb2NhbGl6ZWQgdGltZVxuICpcbiAqIDYuIGBZWWAgYW5kIGBZWVlZYCB0b2tlbnMgcmVwcmVzZW50IHdlZWstbnVtYmVyaW5nIHllYXJzIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIHllYXJzLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zYCB0byB1c2UgdGhlbS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogNy4gYERgIGFuZCBgRERgIHRva2VucyByZXByZXNlbnQgZGF5cyBvZiB0aGUgeWVhciBidXQgdGhleSBhcmUgb2Z0aGVuIGNvbmZ1c2VkIHdpdGggZGF5cyBvZiB0aGUgbW9udGguXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zYCB0byB1c2UgdGhlbS4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogOC4gYFArYCB0b2tlbnMgZG8gbm90IGhhdmUgYSBkZWZpbmVkIHByaW9yaXR5IHNpbmNlIHRoZXkgYXJlIG1lcmVseSBhbGlhc2VzIHRvIG90aGVyIHRva2VucyBiYXNlZFxuICogICAgb24gdGhlIGdpdmVuIGxvY2FsZS5cbiAqXG4gKiAgICB1c2luZyBgZW4tVVNgIGxvY2FsZTogYFBgID0+IGBNTS9kZC95eXl5YFxuICogICAgdXNpbmcgYGVuLVVTYCBsb2NhbGU6IGBwYCA9PiBgaGg6bW0gYWBcbiAqICAgIHVzaW5nIGBwdC1CUmAgbG9jYWxlOiBgUGAgPT4gYGRkL01NL3l5eXlgXG4gKiAgICB1c2luZyBgcHQtQlJgIGxvY2FsZTogYHBgID0+IGBISDptbWBcbiAqXG4gKiBWYWx1ZXMgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgZGF0ZSBpbiB0aGUgZGVzY2VuZGluZyBvcmRlciBvZiBpdHMgdW5pdCdzIHByaW9yaXR5LlxuICogVW5pdHMgb2YgYW4gZXF1YWwgcHJpb3JpdHkgb3ZlcndyaXRlIGVhY2ggb3RoZXIgaW4gdGhlIG9yZGVyIG9mIGFwcGVhcmFuY2UuXG4gKlxuICogSWYgbm8gdmFsdWVzIG9mIGhpZ2hlciBwcmlvcml0eSBhcmUgcGFyc2VkIChlLmcuIHdoZW4gcGFyc2luZyBzdHJpbmcgJ0phbnVhcnkgMXN0JyB3aXRob3V0IGEgeWVhciksXG4gKiB0aGUgdmFsdWVzIHdpbGwgYmUgdGFrZW4gZnJvbSAzcmQgYXJndW1lbnQgYHJlZmVyZW5jZURhdGVgIHdoaWNoIHdvcmtzIGFzIGEgY29udGV4dCBvZiBwYXJzaW5nLlxuICpcbiAqIGByZWZlcmVuY2VEYXRlYCBtdXN0IGJlIHBhc3NlZCBmb3IgY29ycmVjdCB3b3JrIG9mIHRoZSBmdW5jdGlvbi5cbiAqIElmIHlvdSdyZSBub3Qgc3VyZSB3aGljaCBgcmVmZXJlbmNlRGF0ZWAgdG8gc3VwcGx5LCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgRGF0ZTpcbiAqIGBwYXJzZSgnMDIvMTEvMjAxNCcsICdNTS9kZC95eXl5JywgbmV3IERhdGUoKSlgXG4gKiBJbiB0aGlzIGNhc2UgcGFyc2luZyB3aWxsIGJlIGRvbmUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgZGF0ZS5cbiAqIElmIGByZWZlcmVuY2VEYXRlYCBpcyBgSW52YWxpZCBEYXRlYCBvciBhIHZhbHVlIG5vdCBjb252ZXJ0aWJsZSB0byB2YWxpZCBgRGF0ZWAsXG4gKiB0aGVuIGBJbnZhbGlkIERhdGVgIHdpbGwgYmUgcmV0dXJuZWQuXG4gKlxuICogVGhlIHJlc3VsdCBtYXkgdmFyeSBieSBsb2NhbGUuXG4gKlxuICogSWYgYGZvcm1hdFN0cmluZ2AgbWF0Y2hlcyB3aXRoIGBkYXRlU3RyaW5nYCBidXQgZG9lcyBub3QgcHJvdmlkZXMgdG9rZW5zLCBgcmVmZXJlbmNlRGF0ZWAgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBJZiBwYXJzaW5nIGZhaWxlZCwgYEludmFsaWQgRGF0ZWAgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEludmFsaWQgRGF0ZSBpcyBhIERhdGUsIHdob3NlIHRpbWUgdmFsdWUgaXMgTmFOLlxuICogVGltZSB2YWx1ZSBvZiBEYXRlOiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjkuMS4xXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGVTdHIgLSBUaGUgc3RyaW5nIHRvIHBhcnNlXG4gKiBAcGFyYW0gZm9ybWF0U3RyIC0gVGhlIHN0cmluZyBvZiB0b2tlbnNcbiAqIEBwYXJhbSByZWZlcmVuY2VEYXRlIC0gZGVmaW5lcyB2YWx1ZXMgbWlzc2luZyBmcm9tIHRoZSBwYXJzZWQgZGF0ZVN0cmluZ1xuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICogICBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqICAgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBkYXRlXG4gKlxuICogQHRocm93cyBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbWF0Y2hgIHByb3BlcnR5XG4gKiBAdGhyb3dzIHVzZSBgeXl5eWAgaW5zdGVhZCBvZiBgWVlZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYHl5YCBpbnN0ZWFkIG9mIGBZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICogQHRocm93cyB1c2UgYGRgIGluc3RlYWQgb2YgYERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgZm9ybWF0IHN0cmluZyBjb250YWlucyBhbiB1bmVzY2FwZWQgbGF0aW4gYWxwaGFiZXQgY2hhcmFjdGVyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFBhcnNlIDExIEZlYnJ1YXJ5IDIwMTQgZnJvbSBtaWRkbGUtZW5kaWFuIGZvcm1hdDpcbiAqIHZhciByZXN1bHQgPSBwYXJzZSgnMDIvMTEvMjAxNCcsICdNTS9kZC95eXl5JywgbmV3IERhdGUoKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFBhcnNlIDI4dGggb2YgRmVicnVhcnkgaW4gRXNwZXJhbnRvIGxvY2FsZSBpbiB0aGUgY29udGV4dCBvZiAyMDEwIHllYXI6XG4gKiBpbXBvcnQgZW8gZnJvbSAnZGF0ZS1mbnMvbG9jYWxlL2VvJ1xuICogdmFyIHJlc3VsdCA9IHBhcnNlKCcyOC1hIGRlIGZlYnJ1YXJvJywgXCJkbyAnZGUnIE1NTU1cIiwgbmV3IERhdGUoMjAxMCwgMCwgMSksIHtcbiAqICAgbG9jYWxlOiBlb1xuICogfSlcbiAqIC8vPT4gU3VuIEZlYiAyOCAyMDEwIDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKGRhdGVTdHIsIGZvcm1hdFN0ciwgcmVmZXJlbmNlRGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9ICgwLCBfaW5kZXgyLmdldERlZmF1bHRPcHRpb25zKSgpO1xuICBjb25zdCBsb2NhbGUgPVxuICAgIG9wdGlvbnM/LmxvY2FsZSA/PyBkZWZhdWx0T3B0aW9ucy5sb2NhbGUgPz8gX2luZGV4My5kZWZhdWx0TG9jYWxlO1xuXG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3Qgd2Vla1N0YXJ0c09uID1cbiAgICBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgMDtcblxuICBpZiAoZm9ybWF0U3RyID09PSBcIlwiKSB7XG4gICAgaWYgKGRhdGVTdHIgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiAoMCwgX2luZGV4NC50b0RhdGUpKHJlZmVyZW5jZURhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShyZWZlcmVuY2VEYXRlLCBOYU4pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN1YkZuT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgd2Vla1N0YXJ0c09uLFxuICAgIGxvY2FsZSxcbiAgfTtcblxuICAvLyBJZiB0aW1lem9uZSBpc24ndCBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgc2V0IHRvIHRoZSBzeXN0ZW0gdGltZXpvbmVcbiAgY29uc3Qgc2V0dGVycyA9IFtuZXcgX1NldHRlci5EYXRlVG9TeXN0ZW1UaW1lem9uZVNldHRlcigpXTtcblxuICBjb25zdCB0b2tlbnMgPSBmb3JtYXRTdHJcbiAgICAubWF0Y2gobG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHApXG4gICAgLm1hcCgoc3Vic3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdENoYXJhY3RlciA9IHN1YnN0cmluZ1swXTtcbiAgICAgIGlmIChmaXJzdENoYXJhY3RlciBpbiBfaW5kZXg1LmxvbmdGb3JtYXR0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGxvbmdGb3JtYXR0ZXIgPSBfaW5kZXg1LmxvbmdGb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICAgICAgcmV0dXJuIGxvbmdGb3JtYXR0ZXIoc3Vic3RyaW5nLCBsb2NhbGUuZm9ybWF0TG9uZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RyaW5nO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcIilcbiAgICAubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cCk7XG5cbiAgY29uc3QgdXNlZFRva2VucyA9IFtdO1xuXG4gIGZvciAobGV0IHRva2VuIG9mIHRva2Vucykge1xuICAgIGlmIChcbiAgICAgICFvcHRpb25zPy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnMgJiZcbiAgICAgICgwLCBfaW5kZXg2LmlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbikodG9rZW4pXG4gICAgKSB7XG4gICAgICAoMCwgX2luZGV4Ni53YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yKSh0b2tlbiwgZm9ybWF0U3RyLCBkYXRlU3RyKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnMgJiZcbiAgICAgICgwLCBfaW5kZXg2LmlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4pKHRva2VuKVxuICAgICkge1xuICAgICAgKDAsIF9pbmRleDYud2Fybk9yVGhyb3dQcm90ZWN0ZWRFcnJvcikodG9rZW4sIGZvcm1hdFN0ciwgZGF0ZVN0cik7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RDaGFyYWN0ZXIgPSB0b2tlblswXTtcbiAgICBjb25zdCBwYXJzZXIgPSBfaW5kZXg3LnBhcnNlcnNbZmlyc3RDaGFyYWN0ZXJdO1xuICAgIGlmIChwYXJzZXIpIHtcbiAgICAgIGNvbnN0IHsgaW5jb21wYXRpYmxlVG9rZW5zIH0gPSBwYXJzZXI7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpbmNvbXBhdGlibGVUb2tlbnMpKSB7XG4gICAgICAgIGNvbnN0IGluY29tcGF0aWJsZVRva2VuID0gdXNlZFRva2Vucy5maW5kKFxuICAgICAgICAgICh1c2VkVG9rZW4pID0+XG4gICAgICAgICAgICBpbmNvbXBhdGlibGVUb2tlbnMuaW5jbHVkZXModXNlZFRva2VuLnRva2VuKSB8fFxuICAgICAgICAgICAgdXNlZFRva2VuLnRva2VuID09PSBmaXJzdENoYXJhY3RlcixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGluY29tcGF0aWJsZVRva2VuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgICBgVGhlIGZvcm1hdCBzdHJpbmcgbXVzdG4ndCBjb250YWluIFxcYCR7aW5jb21wYXRpYmxlVG9rZW4uZnVsbFRva2VufVxcYCBhbmQgXFxgJHt0b2tlbn1cXGAgYXQgdGhlIHNhbWUgdGltZWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXJzZXIuaW5jb21wYXRpYmxlVG9rZW5zID09PSBcIipcIiAmJiB1c2VkVG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgYFRoZSBmb3JtYXQgc3RyaW5nIG11c3RuJ3QgY29udGFpbiBcXGAke3Rva2VufVxcYCBhbmQgYW55IG90aGVyIHRva2VuIGF0IHRoZSBzYW1lIHRpbWVgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB1c2VkVG9rZW5zLnB1c2goeyB0b2tlbjogZmlyc3RDaGFyYWN0ZXIsIGZ1bGxUb2tlbjogdG9rZW4gfSk7XG5cbiAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gcGFyc2VyLnJ1bihcbiAgICAgICAgZGF0ZVN0cixcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIGxvY2FsZS5tYXRjaCxcbiAgICAgICAgc3ViRm5PcHRpb25zLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFwYXJzZVJlc3VsdCkge1xuICAgICAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShyZWZlcmVuY2VEYXRlLCBOYU4pO1xuICAgICAgfVxuXG4gICAgICBzZXR0ZXJzLnB1c2gocGFyc2VSZXN1bHQuc2V0dGVyKTtcblxuICAgICAgZGF0ZVN0ciA9IHBhcnNlUmVzdWx0LnJlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgXCJGb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXIgYFwiICtcbiAgICAgICAgICAgIGZpcnN0Q2hhcmFjdGVyICtcbiAgICAgICAgICAgIFwiYFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXBsYWNlIHR3byBzaW5nbGUgcXVvdGUgY2hhcmFjdGVycyB3aXRoIG9uZSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyXG4gICAgICBpZiAodG9rZW4gPT09IFwiJydcIikge1xuICAgICAgICB0b2tlbiA9IFwiJ1wiO1xuICAgICAgfSBlbHNlIGlmIChmaXJzdENoYXJhY3RlciA9PT0gXCInXCIpIHtcbiAgICAgICAgdG9rZW4gPSBjbGVhbkVzY2FwZWRTdHJpbmcodG9rZW4pO1xuICAgICAgfVxuXG4gICAgICAvLyBDdXQgdG9rZW4gZnJvbSBzdHJpbmcsIG9yLCBpZiBzdHJpbmcgZG9lc24ndCBtYXRjaCB0aGUgdG9rZW4sIHJldHVybiBJbnZhbGlkIERhdGVcbiAgICAgIGlmIChkYXRlU3RyLmluZGV4T2YodG9rZW4pID09PSAwKSB7XG4gICAgICAgIGRhdGVTdHIgPSBkYXRlU3RyLnNsaWNlKHRva2VuLmxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShyZWZlcmVuY2VEYXRlLCBOYU4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoZSByZW1haW5pbmcgaW5wdXQgY29udGFpbnMgc29tZXRoaW5nIG90aGVyIHRoYW4gd2hpdGVzcGFjZVxuICBpZiAoZGF0ZVN0ci5sZW5ndGggPiAwICYmIG5vdFdoaXRlc3BhY2VSZWdFeHAudGVzdChkYXRlU3RyKSkge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIE5hTik7XG4gIH1cblxuICBjb25zdCB1bmlxdWVQcmlvcml0eVNldHRlcnMgPSBzZXR0ZXJzXG4gICAgLm1hcCgoc2V0dGVyKSA9PiBzZXR0ZXIucHJpb3JpdHkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKVxuICAgIC5maWx0ZXIoKHByaW9yaXR5LCBpbmRleCwgYXJyYXkpID0+IGFycmF5LmluZGV4T2YocHJpb3JpdHkpID09PSBpbmRleClcbiAgICAubWFwKChwcmlvcml0eSkgPT5cbiAgICAgIHNldHRlcnNcbiAgICAgICAgLmZpbHRlcigoc2V0dGVyKSA9PiBzZXR0ZXIucHJpb3JpdHkgPT09IHByaW9yaXR5KVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYi5zdWJQcmlvcml0eSAtIGEuc3ViUHJpb3JpdHkpLFxuICAgIClcbiAgICAubWFwKChzZXR0ZXJBcnJheSkgPT4gc2V0dGVyQXJyYXlbMF0pO1xuXG4gIGxldCBkYXRlID0gKDAsIF9pbmRleDQudG9EYXRlKShyZWZlcmVuY2VEYXRlKTtcblxuICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkocmVmZXJlbmNlRGF0ZSwgTmFOKTtcbiAgfVxuXG4gIGNvbnN0IGZsYWdzID0ge307XG4gIGZvciAoY29uc3Qgc2V0dGVyIG9mIHVuaXF1ZVByaW9yaXR5U2V0dGVycykge1xuICAgIGlmICghc2V0dGVyLnZhbGlkYXRlKGRhdGUsIHN1YkZuT3B0aW9ucykpIHtcbiAgICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKHJlZmVyZW5jZURhdGUsIE5hTik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc2V0dGVyLnNldChkYXRlLCBmbGFncywgc3ViRm5PcHRpb25zKTtcbiAgICAvLyBSZXN1bHQgaXMgdHVwbGUgKGRhdGUsIGZsYWdzKVxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGRhdGUgPSByZXN1bHRbMF07XG4gICAgICBPYmplY3QuYXNzaWduKGZsYWdzLCByZXN1bHRbMV0pO1xuICAgICAgLy8gUmVzdWx0IGlzIGRhdGVcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZSA9IHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShyZWZlcmVuY2VEYXRlLCBkYXRlKTtcbn1cblxuZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nKGlucHV0KSB7XG4gIHJldHVybiBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKVsxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwLCBcIidcIik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMucGFyc2VJU08gPSBwYXJzZUlTTztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG5cbi8qKlxuICogVGhlIHtAbGluayBwYXJzZUlTT30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHBhcnNlSVNPXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFBhcnNlIElTTyBzdHJpbmdcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFBhcnNlIHRoZSBnaXZlbiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0IGFuZCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBGdW5jdGlvbiBhY2NlcHRzIGNvbXBsZXRlIElTTyA4NjAxIGZvcm1hdHMgYXMgd2VsbCBhcyBwYXJ0aWFsIGltcGxlbWVudGF0aW9ucy5cbiAqIElTTyA4NjAxOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzbid0IGEgc3RyaW5nLCB0aGUgZnVuY3Rpb24gY2Fubm90IHBhcnNlIHRoZSBzdHJpbmcgb3JcbiAqIHRoZSB2YWx1ZXMgYXJlIGludmFsaWQsIGl0IHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBhcmd1bWVudCAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGRhdGUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IHN0cmluZyAnMjAxNC0wMi0xMVQxMTozMDozMCcgdG8gZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlSVNPKCcyMDE0LTAyLTExVDExOjMwOjMwJylcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgc3RyaW5nICcrMDIwMTQxMDEnIHRvIGRhdGUsXG4gKiAvLyBpZiB0aGUgYWRkaXRpb25hbCBudW1iZXIgb2YgZGlnaXRzIGluIHRoZSBleHRlbmRlZCB5ZWFyIGZvcm1hdCBpcyAxOlxuICogY29uc3QgcmVzdWx0ID0gcGFyc2VJU08oJyswMjAxNDEwMScsIHsgYWRkaXRpb25hbERpZ2l0czogMSB9KVxuICogLy89PiBGcmkgQXByIDExIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gcGFyc2VJU08oYXJndW1lbnQsIG9wdGlvbnMpIHtcbiAgY29uc3QgYWRkaXRpb25hbERpZ2l0cyA9IG9wdGlvbnM/LmFkZGl0aW9uYWxEaWdpdHMgPz8gMjtcbiAgY29uc3QgZGF0ZVN0cmluZ3MgPSBzcGxpdERhdGVTdHJpbmcoYXJndW1lbnQpO1xuXG4gIGxldCBkYXRlO1xuICBpZiAoZGF0ZVN0cmluZ3MuZGF0ZSkge1xuICAgIGNvbnN0IHBhcnNlWWVhclJlc3VsdCA9IHBhcnNlWWVhcihkYXRlU3RyaW5ncy5kYXRlLCBhZGRpdGlvbmFsRGlnaXRzKTtcbiAgICBkYXRlID0gcGFyc2VEYXRlKHBhcnNlWWVhclJlc3VsdC5yZXN0RGF0ZVN0cmluZywgcGFyc2VZZWFyUmVzdWx0LnllYXIpO1xuICB9XG5cbiAgaWYgKCFkYXRlIHx8IGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG5cbiAgY29uc3QgdGltZXN0YW1wID0gZGF0ZS5nZXRUaW1lKCk7XG4gIGxldCB0aW1lID0gMDtcbiAgbGV0IG9mZnNldDtcblxuICBpZiAoZGF0ZVN0cmluZ3MudGltZSkge1xuICAgIHRpbWUgPSBwYXJzZVRpbWUoZGF0ZVN0cmluZ3MudGltZSk7XG4gICAgaWYgKGlzTmFOKHRpbWUpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGF0ZVN0cmluZ3MudGltZXpvbmUpIHtcbiAgICBvZmZzZXQgPSBwYXJzZVRpbWV6b25lKGRhdGVTdHJpbmdzLnRpbWV6b25lKTtcbiAgICBpZiAoaXNOYU4ob2Zmc2V0KSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRpcnR5RGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCArIHRpbWUpO1xuICAgIC8vIEpTIHBhcnNlZCBzdHJpbmcgYXNzdW1pbmcgaXQncyBpbiBVVEMgdGltZXpvbmVcbiAgICAvLyBidXQgd2UgbmVlZCBpdCB0byBiZSBwYXJzZWQgaW4gb3VyIHRpbWV6b25lXG4gICAgLy8gc28gd2UgdXNlIHV0YyB2YWx1ZXMgdG8gYnVpbGQgZGF0ZSBpbiBvdXIgdGltZXpvbmUuXG4gICAgLy8gWWVhciB2YWx1ZXMgZnJvbSAwIHRvIDk5IG1hcCB0byB0aGUgeWVhcnMgMTkwMCB0byAxOTk5XG4gICAgLy8gc28gc2V0IHllYXIgZXhwbGljaXRseSB3aXRoIHNldEZ1bGxZZWFyLlxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBEYXRlKDApO1xuICAgIHJlc3VsdC5zZXRGdWxsWWVhcihcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgZGlydHlEYXRlLmdldFVUQ01vbnRoKCksXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDRGF0ZSgpLFxuICAgICk7XG4gICAgcmVzdWx0LnNldEhvdXJzKFxuICAgICAgZGlydHlEYXRlLmdldFVUQ0hvdXJzKCksXG4gICAgICBkaXJ0eURhdGUuZ2V0VVRDTWludXRlcygpLFxuICAgICAgZGlydHlEYXRlLmdldFVUQ1NlY29uZHMoKSxcbiAgICAgIGRpcnR5RGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gbmV3IERhdGUodGltZXN0YW1wICsgdGltZSArIG9mZnNldCk7XG59XG5cbmNvbnN0IHBhdHRlcm5zID0ge1xuICBkYXRlVGltZURlbGltaXRlcjogL1tUIF0vLFxuICB0aW1lWm9uZURlbGltaXRlcjogL1taIF0vaSxcbiAgdGltZXpvbmU6IC8oW1orLV0uKikkLyxcbn07XG5cbmNvbnN0IGRhdGVSZWdleCA9XG4gIC9eLT8oPzooXFxkezN9KXwoXFxkezJ9KSg/Oi0/KFxcZHsyfSkpP3xXKFxcZHsyfSkoPzotPyhcXGR7MX0pKT98KSQvO1xuY29uc3QgdGltZVJlZ2V4ID1cbiAgL14oXFxkezJ9KD86Wy4sXVxcZCopPykoPzo6PyhcXGR7Mn0oPzpbLixdXFxkKik/KSk/KD86Oj8oXFxkezJ9KD86Wy4sXVxcZCopPykpPyQvO1xuY29uc3QgdGltZXpvbmVSZWdleCA9IC9eKFsrLV0pKFxcZHsyfSkoPzo6PyhcXGR7Mn0pKT8kLztcblxuZnVuY3Rpb24gc3BsaXREYXRlU3RyaW5nKGRhdGVTdHJpbmcpIHtcbiAgY29uc3QgZGF0ZVN0cmluZ3MgPSB7fTtcbiAgY29uc3QgYXJyYXkgPSBkYXRlU3RyaW5nLnNwbGl0KHBhdHRlcm5zLmRhdGVUaW1lRGVsaW1pdGVyKTtcbiAgbGV0IHRpbWVTdHJpbmc7XG5cbiAgLy8gVGhlIHJlZ2V4IG1hdGNoIHNob3VsZCBvbmx5IHJldHVybiBhdCBtYXhpbXVtIHR3byBhcnJheSBlbGVtZW50cy5cbiAgLy8gW2RhdGVdLCBbdGltZV0sIG9yIFtkYXRlLCB0aW1lXS5cbiAgaWYgKGFycmF5Lmxlbmd0aCA+IDIpIHtcbiAgICByZXR1cm4gZGF0ZVN0cmluZ3M7XG4gIH1cblxuICBpZiAoLzovLnRlc3QoYXJyYXlbMF0pKSB7XG4gICAgdGltZVN0cmluZyA9IGFycmF5WzBdO1xuICB9IGVsc2Uge1xuICAgIGRhdGVTdHJpbmdzLmRhdGUgPSBhcnJheVswXTtcbiAgICB0aW1lU3RyaW5nID0gYXJyYXlbMV07XG4gICAgaWYgKHBhdHRlcm5zLnRpbWVab25lRGVsaW1pdGVyLnRlc3QoZGF0ZVN0cmluZ3MuZGF0ZSkpIHtcbiAgICAgIGRhdGVTdHJpbmdzLmRhdGUgPSBkYXRlU3RyaW5nLnNwbGl0KHBhdHRlcm5zLnRpbWVab25lRGVsaW1pdGVyKVswXTtcbiAgICAgIHRpbWVTdHJpbmcgPSBkYXRlU3RyaW5nLnN1YnN0cihcbiAgICAgICAgZGF0ZVN0cmluZ3MuZGF0ZS5sZW5ndGgsXG4gICAgICAgIGRhdGVTdHJpbmcubGVuZ3RoLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAodGltZVN0cmluZykge1xuICAgIGNvbnN0IHRva2VuID0gcGF0dGVybnMudGltZXpvbmUuZXhlYyh0aW1lU3RyaW5nKTtcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGRhdGVTdHJpbmdzLnRpbWUgPSB0aW1lU3RyaW5nLnJlcGxhY2UodG9rZW5bMV0sIFwiXCIpO1xuICAgICAgZGF0ZVN0cmluZ3MudGltZXpvbmUgPSB0b2tlblsxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZVN0cmluZ3MudGltZSA9IHRpbWVTdHJpbmc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGVTdHJpbmdzO1xufVxuXG5mdW5jdGlvbiBwYXJzZVllYXIoZGF0ZVN0cmluZywgYWRkaXRpb25hbERpZ2l0cykge1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgXCJeKD86KFxcXFxkezR9fFsrLV1cXFxcZHtcIiArXG4gICAgICAoNCArIGFkZGl0aW9uYWxEaWdpdHMpICtcbiAgICAgIFwifSl8KFxcXFxkezJ9fFsrLV1cXFxcZHtcIiArXG4gICAgICAoMiArIGFkZGl0aW9uYWxEaWdpdHMpICtcbiAgICAgIFwifSkkKVwiLFxuICApO1xuXG4gIGNvbnN0IGNhcHR1cmVzID0gZGF0ZVN0cmluZy5tYXRjaChyZWdleCk7XG4gIC8vIEludmFsaWQgSVNPLWZvcm1hdHRlZCB5ZWFyXG4gIGlmICghY2FwdHVyZXMpIHJldHVybiB7IHllYXI6IE5hTiwgcmVzdERhdGVTdHJpbmc6IFwiXCIgfTtcblxuICBjb25zdCB5ZWFyID0gY2FwdHVyZXNbMV0gPyBwYXJzZUludChjYXB0dXJlc1sxXSkgOiBudWxsO1xuICBjb25zdCBjZW50dXJ5ID0gY2FwdHVyZXNbMl0gPyBwYXJzZUludChjYXB0dXJlc1syXSkgOiBudWxsO1xuXG4gIC8vIGVpdGhlciB5ZWFyIG9yIGNlbnR1cnkgaXMgbnVsbCwgbm90IGJvdGhcbiAgcmV0dXJuIHtcbiAgICB5ZWFyOiBjZW50dXJ5ID09PSBudWxsID8geWVhciA6IGNlbnR1cnkgKiAxMDAsXG4gICAgcmVzdERhdGVTdHJpbmc6IGRhdGVTdHJpbmcuc2xpY2UoKGNhcHR1cmVzWzFdIHx8IGNhcHR1cmVzWzJdKS5sZW5ndGgpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZURhdGUoZGF0ZVN0cmluZywgeWVhcikge1xuICAvLyBJbnZhbGlkIElTTy1mb3JtYXR0ZWQgeWVhclxuICBpZiAoeWVhciA9PT0gbnVsbCkgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG5cbiAgY29uc3QgY2FwdHVyZXMgPSBkYXRlU3RyaW5nLm1hdGNoKGRhdGVSZWdleCk7XG4gIC8vIEludmFsaWQgSVNPLWZvcm1hdHRlZCBzdHJpbmdcbiAgaWYgKCFjYXB0dXJlcykgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG5cbiAgY29uc3QgaXNXZWVrRGF0ZSA9ICEhY2FwdHVyZXNbNF07XG4gIGNvbnN0IGRheU9mWWVhciA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbMV0pO1xuICBjb25zdCBtb250aCA9IHBhcnNlRGF0ZVVuaXQoY2FwdHVyZXNbMl0pIC0gMTtcbiAgY29uc3QgZGF5ID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1szXSk7XG4gIGNvbnN0IHdlZWsgPSBwYXJzZURhdGVVbml0KGNhcHR1cmVzWzRdKTtcbiAgY29uc3QgZGF5T2ZXZWVrID0gcGFyc2VEYXRlVW5pdChjYXB0dXJlc1s1XSkgLSAxO1xuXG4gIGlmIChpc1dlZWtEYXRlKSB7XG4gICAgaWYgKCF2YWxpZGF0ZVdlZWtEYXRlKHllYXIsIHdlZWssIGRheU9mV2VlaykpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICAgIH1cbiAgICByZXR1cm4gZGF5T2ZJU09XZWVrWWVhcih5ZWFyLCB3ZWVrLCBkYXlPZldlZWspO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwKTtcbiAgICBpZiAoXG4gICAgICAhdmFsaWRhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXkpIHx8XG4gICAgICAhdmFsaWRhdGVEYXlPZlllYXJEYXRlKHllYXIsIGRheU9mWWVhcilcbiAgICApIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICAgIH1cbiAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKHllYXIsIG1vbnRoLCBNYXRoLm1heChkYXlPZlllYXIsIGRheSkpO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF0ZVVuaXQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID8gcGFyc2VJbnQodmFsdWUpIDogMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lKHRpbWVTdHJpbmcpIHtcbiAgY29uc3QgY2FwdHVyZXMgPSB0aW1lU3RyaW5nLm1hdGNoKHRpbWVSZWdleCk7XG4gIGlmICghY2FwdHVyZXMpIHJldHVybiBOYU47IC8vIEludmFsaWQgSVNPLWZvcm1hdHRlZCB0aW1lXG5cbiAgY29uc3QgaG91cnMgPSBwYXJzZVRpbWVVbml0KGNhcHR1cmVzWzFdKTtcbiAgY29uc3QgbWludXRlcyA9IHBhcnNlVGltZVVuaXQoY2FwdHVyZXNbMl0pO1xuICBjb25zdCBzZWNvbmRzID0gcGFyc2VUaW1lVW5pdChjYXB0dXJlc1szXSk7XG5cbiAgaWYgKCF2YWxpZGF0ZVRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgaG91cnMgKiBfaW5kZXgubWlsbGlzZWNvbmRzSW5Ib3VyICtcbiAgICBtaW51dGVzICogX2luZGV4Lm1pbGxpc2Vjb25kc0luTWludXRlICtcbiAgICBzZWNvbmRzICogMTAwMFxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRpbWVVbml0KHZhbHVlKSB7XG4gIHJldHVybiAodmFsdWUgJiYgcGFyc2VGbG9hdCh2YWx1ZS5yZXBsYWNlKFwiLFwiLCBcIi5cIikpKSB8fCAwO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRpbWV6b25lKHRpbWV6b25lU3RyaW5nKSB7XG4gIGlmICh0aW1lem9uZVN0cmluZyA9PT0gXCJaXCIpIHJldHVybiAwO1xuXG4gIGNvbnN0IGNhcHR1cmVzID0gdGltZXpvbmVTdHJpbmcubWF0Y2godGltZXpvbmVSZWdleCk7XG4gIGlmICghY2FwdHVyZXMpIHJldHVybiAwO1xuXG4gIGNvbnN0IHNpZ24gPSBjYXB0dXJlc1sxXSA9PT0gXCIrXCIgPyAtMSA6IDE7XG4gIGNvbnN0IGhvdXJzID0gcGFyc2VJbnQoY2FwdHVyZXNbMl0pO1xuICBjb25zdCBtaW51dGVzID0gKGNhcHR1cmVzWzNdICYmIHBhcnNlSW50KGNhcHR1cmVzWzNdKSkgfHwgMDtcblxuICBpZiAoIXZhbGlkYXRlVGltZXpvbmUoaG91cnMsIG1pbnV0ZXMpKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgc2lnbiAqXG4gICAgKGhvdXJzICogX2luZGV4Lm1pbGxpc2Vjb25kc0luSG91ciArIG1pbnV0ZXMgKiBfaW5kZXgubWlsbGlzZWNvbmRzSW5NaW51dGUpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGRheU9mSVNPV2Vla1llYXIoaXNvV2Vla1llYXIsIHdlZWssIGRheSkge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7XG4gIGRhdGUuc2V0VVRDRnVsbFllYXIoaXNvV2Vla1llYXIsIDAsIDQpO1xuICBjb25zdCBmb3VydGhPZkphbnVhcnlEYXkgPSBkYXRlLmdldFVUQ0RheSgpIHx8IDc7XG4gIGNvbnN0IGRpZmYgPSAod2VlayAtIDEpICogNyArIGRheSArIDEgLSBmb3VydGhPZkphbnVhcnlEYXk7XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIGRpZmYpO1xuICByZXR1cm4gZGF0ZTtcbn1cblxuLy8gVmFsaWRhdGlvbiBmdW5jdGlvbnNcblxuLy8gRmVicnVhcnkgaXMgbnVsbCB0byBoYW5kbGUgdGhlIGxlYXAgeWVhciAodXNpbmcgfHwpXG5jb25zdCBkYXlzSW5Nb250aHMgPSBbMzEsIG51bGwsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcblxuZnVuY3Rpb24gaXNMZWFwWWVhckluZGV4KHllYXIpIHtcbiAgcmV0dXJuIHllYXIgJSA0MDAgPT09IDAgfHwgKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZURhdGUoeWVhciwgbW9udGgsIGRhdGUpIHtcbiAgcmV0dXJuIChcbiAgICBtb250aCA+PSAwICYmXG4gICAgbW9udGggPD0gMTEgJiZcbiAgICBkYXRlID49IDEgJiZcbiAgICBkYXRlIDw9IChkYXlzSW5Nb250aHNbbW9udGhdIHx8IChpc0xlYXBZZWFySW5kZXgoeWVhcikgPyAyOSA6IDI4KSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEYXlPZlllYXJEYXRlKHllYXIsIGRheU9mWWVhcikge1xuICByZXR1cm4gZGF5T2ZZZWFyID49IDEgJiYgZGF5T2ZZZWFyIDw9IChpc0xlYXBZZWFySW5kZXgoeWVhcikgPyAzNjYgOiAzNjUpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVdlZWtEYXRlKF95ZWFyLCB3ZWVrLCBkYXkpIHtcbiAgcmV0dXJuIHdlZWsgPj0gMSAmJiB3ZWVrIDw9IDUzICYmIGRheSA+PSAwICYmIGRheSA8PSA2O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpIHtcbiAgaWYgKGhvdXJzID09PSAyNCkge1xuICAgIHJldHVybiBtaW51dGVzID09PSAwICYmIHNlY29uZHMgPT09IDA7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIHNlY29uZHMgPj0gMCAmJlxuICAgIHNlY29uZHMgPCA2MCAmJlxuICAgIG1pbnV0ZXMgPj0gMCAmJlxuICAgIG1pbnV0ZXMgPCA2MCAmJlxuICAgIGhvdXJzID49IDAgJiZcbiAgICBob3VycyA8IDI1XG4gICk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGltZXpvbmUoX2hvdXJzLCBtaW51dGVzKSB7XG4gIHJldHVybiBtaW51dGVzID49IDAgJiYgbWludXRlcyA8PSA1OTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5QYXJzZXIgPSB2b2lkIDA7XG52YXIgX1NldHRlciA9IHJlcXVpcmUoXCIuL1NldHRlci5qc1wiKTtcblxuY2xhc3MgUGFyc2VyIHtcbiAgcnVuKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoLCBvcHRpb25zKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNldHRlcjogbmV3IF9TZXR0ZXIuVmFsdWVTZXR0ZXIoXG4gICAgICAgIHJlc3VsdC52YWx1ZSxcbiAgICAgICAgdGhpcy52YWxpZGF0ZSxcbiAgICAgICAgdGhpcy5zZXQsXG4gICAgICAgIHRoaXMucHJpb3JpdHksXG4gICAgICAgIHRoaXMuc3ViUHJpb3JpdHksXG4gICAgICApLFxuICAgICAgcmVzdDogcmVzdWx0LnJlc3QsXG4gICAgfTtcbiAgfVxuXG4gIHZhbGlkYXRlKF91dGNEYXRlLCBfdmFsdWUsIF9vcHRpb25zKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbmV4cG9ydHMuUGFyc2VyID0gUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlZhbHVlU2V0dGVyID1cbiAgZXhwb3J0cy5TZXR0ZXIgPVxuICBleHBvcnRzLkRhdGVUb1N5c3RlbVRpbWV6b25lU2V0dGVyID1cbiAgICB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uL3RyYW5zcG9zZS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbmNvbnN0IFRJTUVaT05FX1VOSVRfUFJJT1JJVFkgPSAxMDtcblxuY2xhc3MgU2V0dGVyIHtcbiAgc3ViUHJpb3JpdHkgPSAwO1xuXG4gIHZhbGlkYXRlKF91dGNEYXRlLCBfb3B0aW9ucykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5leHBvcnRzLlNldHRlciA9IFNldHRlcjtcblxuY2xhc3MgVmFsdWVTZXR0ZXIgZXh0ZW5kcyBTZXR0ZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICB2YWx1ZSxcblxuICAgIHZhbGlkYXRlVmFsdWUsXG5cbiAgICBzZXRWYWx1ZSxcblxuICAgIHByaW9yaXR5LFxuICAgIHN1YlByaW9yaXR5LFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnZhbGlkYXRlVmFsdWUgPSB2YWxpZGF0ZVZhbHVlO1xuICAgIHRoaXMuc2V0VmFsdWUgPSBzZXRWYWx1ZTtcbiAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7XG4gICAgaWYgKHN1YlByaW9yaXR5KSB7XG4gICAgICB0aGlzLnN1YlByaW9yaXR5ID0gc3ViUHJpb3JpdHk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoZGF0ZSwgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVmFsdWUoZGF0ZSwgdGhpcy52YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBzZXQoZGF0ZSwgZmxhZ3MsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRWYWx1ZShkYXRlLCBmbGFncywgdGhpcy52YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbn1cbmV4cG9ydHMuVmFsdWVTZXR0ZXIgPSBWYWx1ZVNldHRlcjtcblxuY2xhc3MgRGF0ZVRvU3lzdGVtVGltZXpvbmVTZXR0ZXIgZXh0ZW5kcyBTZXR0ZXIge1xuICBwcmlvcml0eSA9IFRJTUVaT05FX1VOSVRfUFJJT1JJVFk7XG4gIHN1YlByaW9yaXR5ID0gLTE7XG4gIHNldChkYXRlLCBmbGFncykge1xuICAgIGlmIChmbGFncy50aW1lc3RhbXBJc1NldCkgcmV0dXJuIGRhdGU7XG4gICAgcmV0dXJuICgwLCBfaW5kZXgyLmNvbnN0cnVjdEZyb20pKGRhdGUsICgwLCBfaW5kZXgudHJhbnNwb3NlKShkYXRlLCBEYXRlKSk7XG4gIH1cbn1cbmV4cG9ydHMuRGF0ZVRvU3lzdGVtVGltZXpvbmVTZXR0ZXIgPSBEYXRlVG9TeXN0ZW1UaW1lem9uZVNldHRlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy50aW1lem9uZVBhdHRlcm5zID0gZXhwb3J0cy5udW1lcmljUGF0dGVybnMgPSB2b2lkIDA7XG5jb25zdCBudW1lcmljUGF0dGVybnMgPSAoZXhwb3J0cy5udW1lcmljUGF0dGVybnMgPSB7XG4gIG1vbnRoOiAvXigxWzAtMl18MD9cXGQpLywgLy8gMCB0byAxMlxuICBkYXRlOiAvXigzWzAtMV18WzAtMl0/XFxkKS8sIC8vIDAgdG8gMzFcbiAgZGF5T2ZZZWFyOiAvXigzNlswLTZdfDNbMC01XVxcZHxbMC0yXT9cXGQ/XFxkKS8sIC8vIDAgdG8gMzY2XG4gIHdlZWs6IC9eKDVbMC0zXXxbMC00XT9cXGQpLywgLy8gMCB0byA1M1xuICBob3VyMjNoOiAvXigyWzAtM118WzAtMV0/XFxkKS8sIC8vIDAgdG8gMjNcbiAgaG91cjI0aDogL14oMlswLTRdfFswLTFdP1xcZCkvLCAvLyAwIHRvIDI0XG4gIGhvdXIxMWg6IC9eKDFbMC0xXXwwP1xcZCkvLCAvLyAwIHRvIDExXG4gIGhvdXIxMmg6IC9eKDFbMC0yXXwwP1xcZCkvLCAvLyAwIHRvIDEyXG4gIG1pbnV0ZTogL15bMC01XT9cXGQvLCAvLyAwIHRvIDU5XG4gIHNlY29uZDogL15bMC01XT9cXGQvLCAvLyAwIHRvIDU5XG5cbiAgc2luZ2xlRGlnaXQ6IC9eXFxkLywgLy8gMCB0byA5XG4gIHR3b0RpZ2l0czogL15cXGR7MSwyfS8sIC8vIDAgdG8gOTlcbiAgdGhyZWVEaWdpdHM6IC9eXFxkezEsM30vLCAvLyAwIHRvIDk5OVxuICBmb3VyRGlnaXRzOiAvXlxcZHsxLDR9LywgLy8gMCB0byA5OTk5XG5cbiAgYW55RGlnaXRzU2lnbmVkOiAvXi0/XFxkKy8sXG4gIHNpbmdsZURpZ2l0U2lnbmVkOiAvXi0/XFxkLywgLy8gMCB0byA5LCAtMCB0byAtOVxuICB0d29EaWdpdHNTaWduZWQ6IC9eLT9cXGR7MSwyfS8sIC8vIDAgdG8gOTksIC0wIHRvIC05OVxuICB0aHJlZURpZ2l0c1NpZ25lZDogL14tP1xcZHsxLDN9LywgLy8gMCB0byA5OTksIC0wIHRvIC05OTlcbiAgZm91ckRpZ2l0c1NpZ25lZDogL14tP1xcZHsxLDR9LywgLy8gMCB0byA5OTk5LCAtMCB0byAtOTk5OVxufSk7XG5cbmNvbnN0IHRpbWV6b25lUGF0dGVybnMgPSAoZXhwb3J0cy50aW1lem9uZVBhdHRlcm5zID0ge1xuICBiYXNpY09wdGlvbmFsTWludXRlczogL14oWystXSkoXFxkezJ9KShcXGR7Mn0pP3xaLyxcbiAgYmFzaWM6IC9eKFsrLV0pKFxcZHsyfSkoXFxkezJ9KXxaLyxcbiAgYmFzaWNPcHRpb25hbFNlY29uZHM6IC9eKFsrLV0pKFxcZHsyfSkoXFxkezJ9KSgoXFxkezJ9KSk/fFovLFxuICBleHRlbmRlZDogL14oWystXSkoXFxkezJ9KTooXFxkezJ9KXxaLyxcbiAgZXh0ZW5kZWRPcHRpb25hbFNlY29uZHM6IC9eKFsrLV0pKFxcZHsyfSk6KFxcZHsyfSkoOihcXGR7Mn0pKT98Wi8sXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5wYXJzZXJzID0gdm9pZCAwO1xudmFyIF9FcmFQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0VyYVBhcnNlci5qc1wiKTtcbnZhciBfWWVhclBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvWWVhclBhcnNlci5qc1wiKTtcbnZhciBfTG9jYWxXZWVrWWVhclBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvTG9jYWxXZWVrWWVhclBhcnNlci5qc1wiKTtcbnZhciBfSVNPV2Vla1llYXJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0lTT1dlZWtZZWFyUGFyc2VyLmpzXCIpO1xudmFyIF9FeHRlbmRlZFllYXJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0V4dGVuZGVkWWVhclBhcnNlci5qc1wiKTtcbnZhciBfUXVhcnRlclBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvUXVhcnRlclBhcnNlci5qc1wiKTtcbnZhciBfU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1N0YW5kQWxvbmVRdWFydGVyUGFyc2VyLmpzXCIpO1xudmFyIF9Nb250aFBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvTW9udGhQYXJzZXIuanNcIik7XG52YXIgX1N0YW5kQWxvbmVNb250aFBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvU3RhbmRBbG9uZU1vbnRoUGFyc2VyLmpzXCIpO1xudmFyIF9Mb2NhbFdlZWtQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0xvY2FsV2Vla1BhcnNlci5qc1wiKTtcbnZhciBfSVNPV2Vla1BhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSVNPV2Vla1BhcnNlci5qc1wiKTtcbnZhciBfRGF0ZVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvRGF0ZVBhcnNlci5qc1wiKTtcbnZhciBfRGF5T2ZZZWFyUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9EYXlPZlllYXJQYXJzZXIuanNcIik7XG52YXIgX0RheVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvRGF5UGFyc2VyLmpzXCIpO1xudmFyIF9Mb2NhbERheVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvTG9jYWxEYXlQYXJzZXIuanNcIik7XG52YXIgX1N0YW5kQWxvbmVMb2NhbERheVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyLmpzXCIpO1xudmFyIF9JU09EYXlQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0lTT0RheVBhcnNlci5qc1wiKTtcbnZhciBfQU1QTVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvQU1QTVBhcnNlci5qc1wiKTtcbnZhciBfQU1QTU1pZG5pZ2h0UGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9BTVBNTWlkbmlnaHRQYXJzZXIuanNcIik7XG52YXIgX0RheVBlcmlvZFBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvRGF5UGVyaW9kUGFyc2VyLmpzXCIpO1xudmFyIF9Ib3VyMXRvMTJQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0hvdXIxdG8xMlBhcnNlci5qc1wiKTtcbnZhciBfSG91cjB0bzIzUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9Ib3VyMHRvMjNQYXJzZXIuanNcIik7XG52YXIgX0hvdXIwVG8xMVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSG91cjBUbzExUGFyc2VyLmpzXCIpO1xudmFyIF9Ib3VyMVRvMjRQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL0hvdXIxVG8yNFBhcnNlci5qc1wiKTtcbnZhciBfTWludXRlUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9NaW51dGVQYXJzZXIuanNcIik7XG52YXIgX1NlY29uZFBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvU2Vjb25kUGFyc2VyLmpzXCIpO1xudmFyIF9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9GcmFjdGlvbk9mU2Vjb25kUGFyc2VyLmpzXCIpO1xudmFyIF9JU09UaW1lem9uZVdpdGhaUGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2Vycy9JU09UaW1lem9uZVdpdGhaUGFyc2VyLmpzXCIpO1xudmFyIF9JU09UaW1lem9uZVBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvSVNPVGltZXpvbmVQYXJzZXIuanNcIik7XG52YXIgX1RpbWVzdGFtcFNlY29uZHNQYXJzZXIgPSByZXF1aXJlKFwiLi9wYXJzZXJzL1RpbWVzdGFtcFNlY29uZHNQYXJzZXIuanNcIik7XG52YXIgX1RpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlcnMvVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyLmpzXCIpO1xuXG4vKlxuICogfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCAgYSAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgfCAgQSogfCBNaWxsaXNlY29uZHMgaW4gZGF5ICAgICAgICAgICAgfFxuICogfCAgYiAgfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgfCAgQiAgfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgfFxuICogfCAgYyAgfCBTdGFuZC1hbG9uZSBsb2NhbCBkYXkgb2Ygd2VlayAgfCAgQyogfCBMb2NhbGl6ZWQgaG91ciB3LyBkYXkgcGVyaW9kICAgfFxuICogfCAgZCAgfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgfCAgRCAgfCBEYXkgb2YgeWVhciAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZSAgfCBMb2NhbCBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgfCAgRSAgfCBEYXkgb2Ygd2VlayAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRiogfCBEYXkgb2Ygd2VlayBpbiBtb250aCAgICAgICAgICAgfFxuICogfCAgZyogfCBNb2RpZmllZCBKdWxpYW4gZGF5ICAgICAgICAgICAgfCAgRyAgfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaCAgfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgfCAgSCAgfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaSEgfCBJU08gZGF5IG9mIHdlZWsgICAgICAgICAgICAgICAgfCAgSSEgfCBJU08gd2VlayBvZiB5ZWFyICAgICAgICAgICAgICAgfFxuICogfCAgaiogfCBMb2NhbGl6ZWQgaG91ciB3LyBkYXkgcGVyaW9kICAgfCAgSiogfCBMb2NhbGl6ZWQgaG91ciB3L28gZGF5IHBlcmlvZCAgfFxuICogfCAgayAgfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgfCAgSyAgfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbCogfCAoZGVwcmVjYXRlZCkgICAgICAgICAgICAgICAgICAgfCAgTCAgfCBTdGFuZC1hbG9uZSBtb250aCAgICAgICAgICAgICAgfFxuICogfCAgbSAgfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTSAgfCBNb250aCAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbyEgfCBPcmRpbmFsIG51bWJlciBtb2RpZmllciAgICAgICAgfCAgTyogfCBUaW1lem9uZSAoR01UKSAgICAgICAgICAgICAgICAgfFxuICogfCAgcCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgUCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgcSAgfCBTdGFuZC1hbG9uZSBxdWFydGVyICAgICAgICAgICAgfCAgUSAgfCBRdWFydGVyICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgciogfCBSZWxhdGVkIEdyZWdvcmlhbiB5ZWFyICAgICAgICAgfCAgUiEgfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgfFxuICogfCAgcyAgfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgUyAgfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgfFxuICogfCAgdCEgfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgfCAgVCEgfCBNaWxsaXNlY29uZHMgdGltZXN0YW1wICAgICAgICAgfFxuICogfCAgdSAgfCBFeHRlbmRlZCB5ZWFyICAgICAgICAgICAgICAgICAgfCAgVSogfCBDeWNsaWMgeWVhciAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgdiogfCBUaW1lem9uZSAoZ2VuZXJpYyBub24tbG9jYXQuKSAgfCAgViogfCBUaW1lem9uZSAobG9jYXRpb24pICAgICAgICAgICAgfFxuICogfCAgdyAgfCBMb2NhbCB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgfCAgVyogfCBXZWVrIG9mIG1vbnRoICAgICAgICAgICAgICAgICAgfFxuICogfCAgeCAgfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgfCAgWCAgfCBUaW1lem9uZSAoSVNPLTg2MDEpICAgICAgICAgICAgfFxuICogfCAgeSAgfCBZZWFyIChhYnMpICAgICAgICAgICAgICAgICAgICAgfCAgWSAgfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgfFxuICogfCAgeiogfCBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0LikgfCAgWiogfCBUaW1lem9uZSAoYWxpYXNlcykgICAgICAgICAgICAgfFxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICogYXJlIG5vdCBpbXBsZW1lbnRlZCBidXQgcmVzZXJ2ZWQgYnkgVW5pY29kZSBzdGFuZGFyZC5cbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAhIGFyZSBub24tc3RhbmRhcmQsIGJ1dCBpbXBsZW1lbnRlZCBieSBkYXRlLWZuczpcbiAqIC0gYG9gIG1vZGlmaWVzIHRoZSBwcmV2aW91cyB0b2tlbiB0byB0dXJuIGl0IGludG8gYW4gb3JkaW5hbCAoc2VlIGBwYXJzZWAgZG9jcylcbiAqIC0gYGlgIGlzIElTTyBkYXkgb2Ygd2Vlay4gRm9yIGBpYCBhbmQgYGlpYCBpcyByZXR1cm5zIG51bWVyaWMgSVNPIHdlZWsgZGF5cyxcbiAqICAgaS5lLiA3IGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICogLSBgSWAgaXMgSVNPIHdlZWsgb2YgeWVhciwgYXMgb3Bwb3NlZCB0byBgd2Agd2hpY2ggaXMgbG9jYWwgd2VlayBvZiB5ZWFyLlxuICogLSBgUmAgaXMgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIsIGFzIG9wcG9zZWQgdG8gYFlgIHdoaWNoIGlzIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiAgIGBSYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYElgIGFuZCBgaWBcbiAqICAgZm9yIHVuaXZlcnNhbCBJU08gd2Vlay1udW1iZXJpbmcgZGF0ZSwgd2hlcmVhc1xuICogICBgWWAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB3YCBhbmQgYGVgXG4gKiAgIGZvciB3ZWVrLW51bWJlcmluZyBkYXRlIHNwZWNpZmljIHRvIHRoZSBsb2NhbGUuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIEl0J3Mgb2ssIHdlIHdhbnQgYW55IGhlcmVcbmNvbnN0IHBhcnNlcnMgPSAoZXhwb3J0cy5wYXJzZXJzID0ge1xuICBHOiBuZXcgX0VyYVBhcnNlci5FcmFQYXJzZXIoKSxcbiAgeTogbmV3IF9ZZWFyUGFyc2VyLlllYXJQYXJzZXIoKSxcbiAgWTogbmV3IF9Mb2NhbFdlZWtZZWFyUGFyc2VyLkxvY2FsV2Vla1llYXJQYXJzZXIoKSxcbiAgUjogbmV3IF9JU09XZWVrWWVhclBhcnNlci5JU09XZWVrWWVhclBhcnNlcigpLFxuICB1OiBuZXcgX0V4dGVuZGVkWWVhclBhcnNlci5FeHRlbmRlZFllYXJQYXJzZXIoKSxcbiAgUTogbmV3IF9RdWFydGVyUGFyc2VyLlF1YXJ0ZXJQYXJzZXIoKSxcbiAgcTogbmV3IF9TdGFuZEFsb25lUXVhcnRlclBhcnNlci5TdGFuZEFsb25lUXVhcnRlclBhcnNlcigpLFxuICBNOiBuZXcgX01vbnRoUGFyc2VyLk1vbnRoUGFyc2VyKCksXG4gIEw6IG5ldyBfU3RhbmRBbG9uZU1vbnRoUGFyc2VyLlN0YW5kQWxvbmVNb250aFBhcnNlcigpLFxuICB3OiBuZXcgX0xvY2FsV2Vla1BhcnNlci5Mb2NhbFdlZWtQYXJzZXIoKSxcbiAgSTogbmV3IF9JU09XZWVrUGFyc2VyLklTT1dlZWtQYXJzZXIoKSxcbiAgZDogbmV3IF9EYXRlUGFyc2VyLkRhdGVQYXJzZXIoKSxcbiAgRDogbmV3IF9EYXlPZlllYXJQYXJzZXIuRGF5T2ZZZWFyUGFyc2VyKCksXG4gIEU6IG5ldyBfRGF5UGFyc2VyLkRheVBhcnNlcigpLFxuICBlOiBuZXcgX0xvY2FsRGF5UGFyc2VyLkxvY2FsRGF5UGFyc2VyKCksXG4gIGM6IG5ldyBfU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyLlN0YW5kQWxvbmVMb2NhbERheVBhcnNlcigpLFxuICBpOiBuZXcgX0lTT0RheVBhcnNlci5JU09EYXlQYXJzZXIoKSxcbiAgYTogbmV3IF9BTVBNUGFyc2VyLkFNUE1QYXJzZXIoKSxcbiAgYjogbmV3IF9BTVBNTWlkbmlnaHRQYXJzZXIuQU1QTU1pZG5pZ2h0UGFyc2VyKCksXG4gIEI6IG5ldyBfRGF5UGVyaW9kUGFyc2VyLkRheVBlcmlvZFBhcnNlcigpLFxuICBoOiBuZXcgX0hvdXIxdG8xMlBhcnNlci5Ib3VyMXRvMTJQYXJzZXIoKSxcbiAgSDogbmV3IF9Ib3VyMHRvMjNQYXJzZXIuSG91cjB0bzIzUGFyc2VyKCksXG4gIEs6IG5ldyBfSG91cjBUbzExUGFyc2VyLkhvdXIwVG8xMVBhcnNlcigpLFxuICBrOiBuZXcgX0hvdXIxVG8yNFBhcnNlci5Ib3VyMVRvMjRQYXJzZXIoKSxcbiAgbTogbmV3IF9NaW51dGVQYXJzZXIuTWludXRlUGFyc2VyKCksXG4gIHM6IG5ldyBfU2Vjb25kUGFyc2VyLlNlY29uZFBhcnNlcigpLFxuICBTOiBuZXcgX0ZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIuRnJhY3Rpb25PZlNlY29uZFBhcnNlcigpLFxuICBYOiBuZXcgX0lTT1RpbWV6b25lV2l0aFpQYXJzZXIuSVNPVGltZXpvbmVXaXRoWlBhcnNlcigpLFxuICB4OiBuZXcgX0lTT1RpbWV6b25lUGFyc2VyLklTT1RpbWV6b25lUGFyc2VyKCksXG4gIHQ6IG5ldyBfVGltZXN0YW1wU2Vjb25kc1BhcnNlci5UaW1lc3RhbXBTZWNvbmRzUGFyc2VyKCksXG4gIFQ6IG5ldyBfVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyLlRpbWVzdGFtcE1pbGxpc2Vjb25kc1BhcnNlcigpLFxufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuQU1QTU1pZG5pZ2h0UGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBBTVBNTWlkbmlnaHRQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gODA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImJcIjpcbiAgICAgIGNhc2UgXCJiYlwiOlxuICAgICAgY2FzZSBcImJiYlwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICBjYXNlIFwiYmJiYmJcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcImJiYmJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldEhvdXJzKCgwLCBfdXRpbHMuZGF5UGVyaW9kRW51bVRvSG91cnMpKHZhbHVlKSwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJhXCIsIFwiQlwiLCBcIkhcIiwgXCJrXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkFNUE1NaWRuaWdodFBhcnNlciA9IEFNUE1NaWRuaWdodFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5BTVBNUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBBTVBNUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDgwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICBjYXNlIFwiYWFcIjpcbiAgICAgIGNhc2UgXCJhYWFcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSBcImFhYWFhXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRIb3VycygoMCwgX3V0aWxzLmRheVBlcmlvZEVudW1Ub0hvdXJzKSh2YWx1ZSksIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiYlwiLCBcIkJcIiwgXCJIXCIsIFwia1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5BTVBNUGFyc2VyID0gQU1QTVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5EYXRlUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jb25zdCBEQVlTX0lOX01PTlRIID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuY29uc3QgREFZU19JTl9NT05USF9MRUFQX1lFQVIgPSBbXG4gIDMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEsXG5dO1xuXG4vLyBEYXkgb2YgdGhlIG1vbnRoXG5jbGFzcyBEYXRlUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDkwO1xuICBzdWJQcmlvcml0eSA9IDE7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuZGF0ZSxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcImRvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJkYXRlXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoZGF0ZSwgdmFsdWUpIHtcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IGlzTGVhcFllYXIgPSAoMCwgX3V0aWxzLmlzTGVhcFllYXJJbmRleCkoeWVhcik7XG4gICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgaWYgKGlzTGVhcFllYXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IERBWVNfSU5fTU9OVEhfTEVBUF9ZRUFSW21vbnRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gREFZU19JTl9NT05USFttb250aF07XG4gICAgfVxuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldERhdGUodmFsdWUpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJZXCIsXG4gICAgXCJSXCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJJXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLkRhdGVQYXJzZXIgPSBEYXRlUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkRheU9mWWVhclBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgRGF5T2ZZZWFyUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDkwO1xuXG4gIHN1YnByaW9yaXR5ID0gMTtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiRFwiOlxuICAgICAgY2FzZSBcIkREXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmRheU9mWWVhcixcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIkRvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJkYXRlXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoZGF0ZSwgdmFsdWUpIHtcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IGlzTGVhcFllYXIgPSAoMCwgX3V0aWxzLmlzTGVhcFllYXJJbmRleCkoeWVhcik7XG4gICAgaWYgKGlzTGVhcFllYXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDM2NjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMzY1O1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRNb250aCgwLCB2YWx1ZSk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIllcIixcbiAgICBcIlJcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcIklcIixcbiAgICBcImRcIixcbiAgICBcIkVcIixcbiAgICBcImlcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuRGF5T2ZZZWFyUGFyc2VyID0gRGF5T2ZZZWFyUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkRheVBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vc2V0RGF5LmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG4vLyBEYXkgb2Ygd2Vla1xuY2xhc3MgRGF5UGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDkwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJFRVwiOlxuICAgICAgY2FzZSBcIkVFRVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiRUVFRUVcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJFRUVFRUVcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gNjtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgZGF0ZSA9ICgwLCBfaW5kZXguc2V0RGF5KShkYXRlLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcIkRcIiwgXCJpXCIsIFwiZVwiLCBcImNcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuRGF5UGFyc2VyID0gRGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkRheVBlcmlvZFBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gaW4gdGhlIG1vcm5pbmcsIGluIHRoZSBhZnRlcm5vb24sIGluIHRoZSBldmVuaW5nLCBhdCBuaWdodFxuY2xhc3MgRGF5UGVyaW9kUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDgwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJCXCI6XG4gICAgICBjYXNlIFwiQkJcIjpcbiAgICAgIGNhc2UgXCJCQkJcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5UGVyaW9kKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSBcIkJCQkJCXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJCQkJCXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheVBlcmlvZChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXlQZXJpb2QoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRIb3VycygoMCwgX3V0aWxzLmRheVBlcmlvZEVudW1Ub0hvdXJzKSh2YWx1ZSksIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiYVwiLCBcImJcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuRGF5UGVyaW9kUGFyc2VyID0gRGF5UGVyaW9kUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkVyYVBhcnNlciA9IHZvaWQgMDtcblxudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG5jbGFzcyBFcmFQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTQwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEFELCBCQ1xuICAgICAgY2FzZSBcIkdcIjpcbiAgICAgIGNhc2UgXCJHR1wiOlxuICAgICAgY2FzZSBcIkdHR1wiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcImFiYnJldmlhdGVkXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBBLCBCXG4gICAgICBjYXNlIFwiR0dHR0dcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiIH0pO1xuICAgICAgLy8gQW5ubyBEb21pbmksIEJlZm9yZSBDaHJpc3RcbiAgICAgIGNhc2UgXCJHR0dHXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIndpZGVcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmVyYShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcImFiYnJldmlhdGVkXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5lcmEoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHNldChkYXRlLCBmbGFncywgdmFsdWUpIHtcbiAgICBmbGFncy5lcmEgPSB2YWx1ZTtcbiAgICBkYXRlLnNldEZ1bGxZZWFyKHZhbHVlLCAwLCAxKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiUlwiLCBcInVcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuRXJhUGFyc2VyID0gRXJhUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkV4dGVuZGVkWWVhclBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgRXh0ZW5kZWRZZWFyUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEzMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbikge1xuICAgIGlmICh0b2tlbiA9PT0gXCJ1XCIpIHtcbiAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0c1NpZ25lZCkoNCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzU2lnbmVkKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldEZ1bGxZZWFyKHZhbHVlLCAwLCAxKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiR1wiLCBcInlcIiwgXCJZXCIsIFwiUlwiLCBcIndcIiwgXCJJXCIsIFwiaVwiLCBcImVcIiwgXCJjXCIsIFwidFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkV4dGVuZGVkWWVhclBhcnNlciA9IEV4dGVuZGVkWWVhclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5GcmFjdGlvbk9mU2Vjb25kUGFyc2VyID0gdm9pZCAwO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBGcmFjdGlvbk9mU2Vjb25kUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDMwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh2YWx1ZSkgPT5cbiAgICAgIE1hdGgudHJ1bmModmFsdWUgKiBNYXRoLnBvdygxMCwgLXRva2VuLmxlbmd0aCArIDMpKTtcbiAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSxcbiAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgKTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRNaWxsaXNlY29uZHModmFsdWUpO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1widFwiLCBcIlRcIl07XG59XG5leHBvcnRzLkZyYWN0aW9uT2ZTZWNvbmRQYXJzZXIgPSBGcmFjdGlvbk9mU2Vjb25kUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkhvdXIwVG8xMVBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgSG91cjBUbzExUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDcwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJLXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmhvdXIxMWgsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJLb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDExO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBjb25zdCBpc1BNID0gZGF0ZS5nZXRIb3VycygpID49IDEyO1xuICAgIGlmIChpc1BNICYmIHZhbHVlIDwgMTIpIHtcbiAgICAgIGRhdGUuc2V0SG91cnModmFsdWUgKyAxMiwgMCwgMCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGUuc2V0SG91cnModmFsdWUsIDAsIDAsIDApO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcImhcIiwgXCJIXCIsIFwia1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5Ib3VyMFRvMTFQYXJzZXIgPSBIb3VyMFRvMTFQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSG91cjB0bzIzUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBIb3VyMHRvMjNQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuaG91cjIzaCxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIkhvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMjM7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0SG91cnModmFsdWUsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiYVwiLCBcImJcIiwgXCJoXCIsIFwiS1wiLCBcImtcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuSG91cjB0bzIzUGFyc2VyID0gSG91cjB0bzIzUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkhvdXIxVG8yNFBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgSG91cjFUbzI0UGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDcwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJrXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmhvdXIyNGgsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJrb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDI0O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBjb25zdCBob3VycyA9IHZhbHVlIDw9IDI0ID8gdmFsdWUgJSAyNCA6IHZhbHVlO1xuICAgIGRhdGUuc2V0SG91cnMoaG91cnMsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1wiYVwiLCBcImJcIiwgXCJoXCIsIFwiSFwiLCBcIktcIiwgXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuSG91cjFUbzI0UGFyc2VyID0gSG91cjFUbzI0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLkhvdXIxdG8xMlBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgSG91cjF0bzEyUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDcwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTnVtZXJpY1BhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLmhvdXIxMmgsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJob1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDEyO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBjb25zdCBpc1BNID0gZGF0ZS5nZXRIb3VycygpID49IDEyO1xuICAgIGlmIChpc1BNICYmIHZhbHVlIDwgMTIpIHtcbiAgICAgIGRhdGUuc2V0SG91cnModmFsdWUgKyAxMiwgMCwgMCwgMCk7XG4gICAgfSBlbHNlIGlmICghaXNQTSAmJiB2YWx1ZSA9PT0gMTIpIHtcbiAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGUuc2V0SG91cnModmFsdWUsIDAsIDAsIDApO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcIkhcIiwgXCJLXCIsIFwia1wiLCBcInRcIiwgXCJUXCJdO1xufVxuZXhwb3J0cy5Ib3VyMXRvMTJQYXJzZXIgPSBIb3VyMXRvMTJQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSVNPRGF5UGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zZXRJU09EYXkuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIElTTyBkYXkgb2Ygd2Vla1xuY2xhc3MgSVNPRGF5UGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDkwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCkge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gNztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMlxuICAgICAgY2FzZSBcImlcIjpcbiAgICAgIGNhc2UgXCJpaVwiOiAvLyAwMlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgICAvLyAybmRcbiAgICAgIGNhc2UgXCJpb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwiZGF5XCIgfSk7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJpaWlcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyBUdVxuICAgICAgY2FzZSBcImlpaWlpaVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcInNob3J0XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJpaWlpXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDc7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUgPSAoMCwgX2luZGV4LnNldElTT0RheSkoZGF0ZSwgdmFsdWUpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJ5XCIsXG4gICAgXCJZXCIsXG4gICAgXCJ1XCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJFXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLklTT0RheVBhcnNlciA9IElTT0RheVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5JU09UaW1lem9uZVBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uLy4uL19saWIvZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcy5qc1wiKTtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gVGltZXpvbmUgKElTTy04NjAxKVxuY2xhc3MgSVNPVGltZXpvbmVQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwieFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxNaW51dGVzLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwieHhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5iYXNpYyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInh4eHhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5iYXNpY09wdGlvbmFsU2Vjb25kcyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInh4eHh4XCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuZXh0ZW5kZWRPcHRpb25hbFNlY29uZHMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJ4eHhcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuZXh0ZW5kZWQsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlKSB7XG4gICAgaWYgKGZsYWdzLnRpbWVzdGFtcElzU2V0KSByZXR1cm4gZGF0ZTtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShcbiAgICAgIGRhdGUsXG4gICAgICBkYXRlLmdldFRpbWUoKSAtXG4gICAgICAgICgwLCBfaW5kZXgyLmdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMpKGRhdGUpIC1cbiAgICAgICAgdmFsdWUsXG4gICAgKTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcInRcIiwgXCJUXCIsIFwiWFwiXTtcbn1cbmV4cG9ydHMuSVNPVGltZXpvbmVQYXJzZXIgPSBJU09UaW1lem9uZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5JU09UaW1lem9uZVdpdGhaUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vLi4vX2xpYi9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLmpzXCIpO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBUaW1lem9uZSAoSVNPLTg2MDEuICswMDowMCBpcyBgJ1onYClcbmNsYXNzIElTT1RpbWV6b25lV2l0aFpQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMTA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiWFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZVRpbWV6b25lUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy50aW1lem9uZVBhdHRlcm5zLmJhc2ljT3B0aW9uYWxNaW51dGVzLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiWFhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5iYXNpYyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIlhYWFhcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VUaW1lem9uZVBhdHRlcm4pKFxuICAgICAgICAgIF9jb25zdGFudHMudGltZXpvbmVQYXR0ZXJucy5iYXNpY09wdGlvbmFsU2Vjb25kcyxcbiAgICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcIlhYWFhYXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuZXh0ZW5kZWRPcHRpb25hbFNlY29uZHMsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJYWFhcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlVGltZXpvbmVQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLnRpbWV6b25lUGF0dGVybnMuZXh0ZW5kZWQsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlKSB7XG4gICAgaWYgKGZsYWdzLnRpbWVzdGFtcElzU2V0KSByZXR1cm4gZGF0ZTtcbiAgICByZXR1cm4gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShcbiAgICAgIGRhdGUsXG4gICAgICBkYXRlLmdldFRpbWUoKSAtXG4gICAgICAgICgwLCBfaW5kZXgyLmdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMpKGRhdGUpIC1cbiAgICAgICAgdmFsdWUsXG4gICAgKTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcInRcIiwgXCJUXCIsIFwieFwiXTtcbn1cbmV4cG9ydHMuSVNPVGltZXpvbmVXaXRoWlBhcnNlciA9IElTT1RpbWV6b25lV2l0aFpQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuSVNPV2Vla1BhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vc2V0SVNPV2Vlay5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uLy4uL3N0YXJ0T2ZJU09XZWVrLmpzXCIpO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBJU08gd2VlayBvZiB5ZWFyXG5jbGFzcyBJU09XZWVrUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEwMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiSVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy53ZWVrLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiSW9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSA1MztcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXgyLnN0YXJ0T2ZJU09XZWVrKSgoMCwgX2luZGV4LnNldElTT1dlZWspKGRhdGUsIHZhbHVlKSk7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJ5XCIsXG4gICAgXCJZXCIsXG4gICAgXCJ1XCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLklTT1dlZWtQYXJzZXIgPSBJU09XZWVrUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLklTT1dlZWtZZWFyUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zdGFydE9mSVNPV2Vlay5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyXG5jbGFzcyBJU09XZWVrWWVhclBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMzA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4pIHtcbiAgICBpZiAodG9rZW4gPT09IFwiUlwiKSB7XG4gICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHNTaWduZWQpKDQsIGRhdGVTdHJpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0c1NpZ25lZCkodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgY29uc3QgZmlyc3RXZWVrT2ZZZWFyID0gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gICAgZmlyc3RXZWVrT2ZZZWFyLnNldEZ1bGxZZWFyKHZhbHVlLCAwLCA0KTtcbiAgICBmaXJzdFdlZWtPZlllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguc3RhcnRPZklTT1dlZWspKGZpcnN0V2Vla09mWWVhcik7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJHXCIsXG4gICAgXCJ5XCIsXG4gICAgXCJZXCIsXG4gICAgXCJ1XCIsXG4gICAgXCJRXCIsXG4gICAgXCJxXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLklTT1dlZWtZZWFyUGFyc2VyID0gSVNPV2Vla1llYXJQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuTG9jYWxEYXlQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4uLy4uLy4uL3NldERheS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gTG9jYWwgZGF5IG9mIHdlZWtcbmNsYXNzIExvY2FsRGF5UGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDkwO1xuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlKSA9PiB7XG4gICAgICAvLyBXZSB3YW50IGhlcmUgZmxvb3IgaW5zdGVhZCBvZiB0cnVuYywgc28gd2UgZ2V0IC03IGZvciB2YWx1ZSAwIGluc3RlYWQgb2YgMFxuICAgICAgY29uc3Qgd2hvbGVXZWVrRGF5cyA9IE1hdGguZmxvb3IoKHZhbHVlIC0gMSkgLyA3KSAqIDc7XG4gICAgICByZXR1cm4gKCh2YWx1ZSArIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgNikgJSA3KSArIHdob2xlV2Vla0RheXM7XG4gICAgfTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDNcbiAgICAgIGNhc2UgXCJlXCI6XG4gICAgICBjYXNlIFwiZWVcIjogLy8gMDNcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyAzcmRcbiAgICAgIGNhc2UgXCJlb1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB1bml0OiBcImRheVwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJlZWVcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImVlZWVlXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5kYXkoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiZWVlZWVlXCI6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwic2hvcnRcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJuYXJyb3dcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSlcbiAgICAgICAgKTtcblxuICAgICAgLy8gVHVlc2RheVxuICAgICAgY2FzZSBcImVlZWVcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwid2lkZVwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDY7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIGRhdGUgPSAoMCwgX2luZGV4LnNldERheSkoZGF0ZSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJ5XCIsXG4gICAgXCJSXCIsXG4gICAgXCJ1XCIsXG4gICAgXCJxXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJFXCIsXG4gICAgXCJpXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLkxvY2FsRGF5UGFyc2VyID0gTG9jYWxEYXlQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuTG9jYWxXZWVrUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9zZXRXZWVrLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi4vLi4vLi4vc3RhcnRPZldlZWsuanNcIik7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbi8vIExvY2FsIHdlZWsgb2YgeWVhclxuY2xhc3MgTG9jYWxXZWVrUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEwMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwid1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy53ZWVrLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwid29cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSA1MztcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXgyLnN0YXJ0T2ZXZWVrKShcbiAgICAgICgwLCBfaW5kZXguc2V0V2VlaykoZGF0ZSwgdmFsdWUsIG9wdGlvbnMpLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwieVwiLFxuICAgIFwiUlwiLFxuICAgIFwidVwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiaVwiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5Mb2NhbFdlZWtQYXJzZXIgPSBMb2NhbFdlZWtQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuTG9jYWxXZWVrWWVhclBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vZ2V0V2Vla1llYXIuanNcIik7XG5cbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4uLy4uLy4uL3N0YXJ0T2ZXZWVrLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG5jbGFzcyBMb2NhbFdlZWtZZWFyUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEzMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHllYXIpID0+ICh7XG4gICAgICB5ZWFyLFxuICAgICAgaXNUd29EaWdpdFllYXI6IHRva2VuID09PSBcIllZXCIsXG4gICAgfSk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiWVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKDQsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiWW9cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgdW5pdDogXCJ5ZWFyXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5pc1R3b0RpZ2l0WWVhciB8fCB2YWx1ZS55ZWFyID4gMDtcbiAgfVxuXG4gIHNldChkYXRlLCBmbGFncywgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9ICgwLCBfaW5kZXguZ2V0V2Vla1llYXIpKGRhdGUsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlLmlzVHdvRGlnaXRZZWFyKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkVHdvRGlnaXRZZWFyID0gKDAsIF91dGlscy5ub3JtYWxpemVUd29EaWdpdFllYXIpKFxuICAgICAgICB2YWx1ZS55ZWFyLFxuICAgICAgICBjdXJyZW50WWVhcixcbiAgICAgICk7XG4gICAgICBkYXRlLnNldEZ1bGxZZWFyKFxuICAgICAgICBub3JtYWxpemVkVHdvRGlnaXRZZWFyLFxuICAgICAgICAwLFxuICAgICAgICBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSxcbiAgICAgICk7XG4gICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgcmV0dXJuICgwLCBfaW5kZXgyLnN0YXJ0T2ZXZWVrKShkYXRlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCB5ZWFyID1cbiAgICAgICEoXCJlcmFcIiBpbiBmbGFncykgfHwgZmxhZ3MuZXJhID09PSAxID8gdmFsdWUueWVhciA6IDEgLSB2YWx1ZS55ZWFyO1xuICAgIGRhdGUuc2V0RnVsbFllYXIoeWVhciwgMCwgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuICgwLCBfaW5kZXgyLnN0YXJ0T2ZXZWVrKShkYXRlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcInlcIixcbiAgICBcIlJcIixcbiAgICBcInVcIixcbiAgICBcIlFcIixcbiAgICBcInFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIklcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuTG9jYWxXZWVrWWVhclBhcnNlciA9IExvY2FsV2Vla1llYXJQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuTWludXRlUGFyc2VyID0gdm9pZCAwO1xudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBNaW51dGVQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gNjA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VOdW1lcmljUGF0dGVybikoXG4gICAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMubWludXRlLFxuICAgICAgICAgIGRhdGVTdHJpbmcsXG4gICAgICAgICk7XG4gICAgICBjYXNlIFwibW9cIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywgeyB1bml0OiBcIm1pbnV0ZVwiIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSh0b2tlbi5sZW5ndGgsIGRhdGVTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDU5O1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldE1pbnV0ZXModmFsdWUsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1widFwiLCBcIlRcIl07XG59XG5leHBvcnRzLk1pbnV0ZVBhcnNlciA9IE1pbnV0ZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5Nb250aFBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgTW9udGhQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcIllcIixcbiAgICBcIlJcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIkxcIixcbiAgICBcIndcIixcbiAgICBcIklcIixcbiAgICBcIkRcIixcbiAgICBcImlcIixcbiAgICBcImVcIixcbiAgICBcImNcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcblxuICBwcmlvcml0eSA9IDExMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlKSA9PiB2YWx1ZSAtIDE7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLm1vbnRoLFxuICAgICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgICApLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJNTVwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKDIsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTW9cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgdW5pdDogXCJtb250aFwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWNcbiAgICAgIGNhc2UgXCJNTU1cIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBKLCBGLCAuLi4sIERcbiAgICAgIGNhc2UgXCJNTU1NTVwiOlxuICAgICAgICByZXR1cm4gbWF0Y2gubW9udGgoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcImZvcm1hdHRpbmdcIiB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDExO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldE1vbnRoKHZhbHVlLCAxKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG59XG5leHBvcnRzLk1vbnRoUGFyc2VyID0gTW9udGhQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuUXVhcnRlclBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgUXVhcnRlclBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMjA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gMSwgMiwgMywgNFxuICAgICAgY2FzZSBcIlFcIjpcbiAgICAgIGNhc2UgXCJRUVwiOiAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJRb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJRUVFcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcbiAgICAgIGNhc2UgXCJRUVFRUVwiOlxuICAgICAgICByZXR1cm4gbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi5cbiAgICAgIGNhc2UgXCJRUVFRXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDQ7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0TW9udGgoKHZhbHVlIC0gMSkgKiAzLCAxKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiWVwiLFxuICAgIFwiUlwiLFxuICAgIFwicVwiLFxuICAgIFwiTVwiLFxuICAgIFwiTFwiLFxuICAgIFwid1wiLFxuICAgIFwiSVwiLFxuICAgIFwiZFwiLFxuICAgIFwiRFwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5RdWFydGVyUGFyc2VyID0gUXVhcnRlclBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5TZWNvbmRQYXJzZXIgPSB2b2lkIDA7XG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIFNlY29uZFBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA1MDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwic1wiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5zZWNvbmQsXG4gICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgXCJzb1wiOlxuICAgICAgICByZXR1cm4gbWF0Y2gub3JkaW5hbE51bWJlcihkYXRlU3RyaW5nLCB7IHVuaXQ6IFwic2Vjb25kXCIgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gNTk7XG4gIH1cblxuICBzZXQoZGF0ZSwgX2ZsYWdzLCB2YWx1ZSkge1xuICAgIGRhdGUuc2V0U2Vjb25kcyh2YWx1ZSwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXCJ0XCIsIFwiVFwiXTtcbn1cbmV4cG9ydHMuU2Vjb25kUGFyc2VyID0gU2Vjb25kUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlN0YW5kQWxvbmVMb2NhbERheVBhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vc2V0RGF5LmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG4vLyBTdGFuZC1hbG9uZSBsb2NhbCBkYXkgb2Ygd2Vla1xuY2xhc3MgU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDkwO1xuXG4gIHBhcnNlKGRhdGVTdHJpbmcsIHRva2VuLCBtYXRjaCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlQ2FsbGJhY2sgPSAodmFsdWUpID0+IHtcbiAgICAgIC8vIFdlIHdhbnQgaGVyZSBmbG9vciBpbnN0ZWFkIG9mIHRydW5jLCBzbyB3ZSBnZXQgLTcgZm9yIHZhbHVlIDAgaW5zdGVhZCBvZiAwXG4gICAgICBjb25zdCB3aG9sZVdlZWtEYXlzID0gTWF0aC5mbG9vcigodmFsdWUgLSAxKSAvIDcpICogNztcbiAgICAgIHJldHVybiAoKHZhbHVlICsgb3B0aW9ucy53ZWVrU3RhcnRzT24gKyA2KSAlIDcpICsgd2hvbGVXZWVrRGF5cztcbiAgICB9O1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gM1xuICAgICAgY2FzZSBcImNcIjpcbiAgICAgIGNhc2UgXCJjY1wiOiAvLyAwM1xuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIDNyZFxuICAgICAgY2FzZSBcImNvXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHVuaXQ6IFwiZGF5XCIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBUXG4gICAgICBjYXNlIFwiY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJjY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJzaG9ydFwiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5kYXkoZGF0ZVN0cmluZywgeyB3aWR0aDogXCJ3aWRlXCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLmRheShkYXRlU3RyaW5nLCB7IHdpZHRoOiBcInNob3J0XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pIHx8XG4gICAgICAgICAgbWF0Y2guZGF5KGRhdGVTdHJpbmcsIHsgd2lkdGg6IFwibmFycm93XCIsIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gNjtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgZGF0ZSA9ICgwLCBfaW5kZXguc2V0RGF5KShkYXRlLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcbiAgICBcInlcIixcbiAgICBcIlJcIixcbiAgICBcInVcIixcbiAgICBcInFcIixcbiAgICBcIlFcIixcbiAgICBcIk1cIixcbiAgICBcIkxcIixcbiAgICBcIklcIixcbiAgICBcImRcIixcbiAgICBcIkRcIixcbiAgICBcIkVcIixcbiAgICBcImlcIixcbiAgICBcImVcIixcbiAgICBcInRcIixcbiAgICBcIlRcIixcbiAgXTtcbn1cbmV4cG9ydHMuU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyID0gU3RhbmRBbG9uZUxvY2FsRGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLlN0YW5kQWxvbmVNb250aFBhcnNlciA9IHZvaWQgMDtcbnZhciBfY29uc3RhbnRzID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgU3RhbmRBbG9uZU1vbnRoUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDExMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBjb25zdCB2YWx1ZUNhbGxiYWNrID0gKHZhbHVlKSA9PiB2YWx1ZSAtIDE7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU51bWVyaWNQYXR0ZXJuKShcbiAgICAgICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLm1vbnRoLFxuICAgICAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICAgICApLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKDIsIGRhdGVTdHJpbmcpLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTG9cIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgIG1hdGNoLm9yZGluYWxOdW1iZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgdW5pdDogXCJtb250aFwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICAvLyBKYW4sIEZlYiwgLi4uLCBEZWNcbiAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBKLCBGLCAuLi4sIERcbiAgICAgIGNhc2UgXCJMTExMTFwiOlxuICAgICAgICByZXR1cm4gbWF0Y2gubW9udGgoZGF0ZVN0cmluZywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSkgfHxcbiAgICAgICAgICBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgfSkgfHxcbiAgICAgICAgICBtYXRjaC5tb250aChkYXRlU3RyaW5nLCB7IHdpZHRoOiBcIm5hcnJvd1wiLCBjb250ZXh0OiBcInN0YW5kYWxvbmVcIiB9KVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKF9kYXRlLCB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDExO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICBkYXRlLnNldE1vbnRoKHZhbHVlLCAxKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgaW5jb21wYXRpYmxlVG9rZW5zID0gW1xuICAgIFwiWVwiLFxuICAgIFwiUlwiLFxuICAgIFwicVwiLFxuICAgIFwiUVwiLFxuICAgIFwiTVwiLFxuICAgIFwid1wiLFxuICAgIFwiSVwiLFxuICAgIFwiRFwiLFxuICAgIFwiaVwiLFxuICAgIFwiZVwiLFxuICAgIFwiY1wiLFxuICAgIFwidFwiLFxuICAgIFwiVFwiLFxuICBdO1xufVxuZXhwb3J0cy5TdGFuZEFsb25lTW9udGhQYXJzZXIgPSBTdGFuZEFsb25lTW9udGhQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXIgPSB2b2lkIDA7XG52YXIgX1BhcnNlciA9IHJlcXVpcmUoXCIuLi9QYXJzZXIuanNcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHMuanNcIik7XG5cbmNsYXNzIFN0YW5kQWxvbmVRdWFydGVyUGFyc2VyIGV4dGVuZHMgX1BhcnNlci5QYXJzZXIge1xuICBwcmlvcml0eSA9IDEyMDtcblxuICBwYXJzZShkYXRlU3RyaW5nLCB0b2tlbiwgbWF0Y2gpIHtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwicVwiOlxuICAgICAgY2FzZSBcInFxXCI6IC8vIDAxLCAwMiwgMDMsIDA0XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlTkRpZ2l0cykodG9rZW4ubGVuZ3RoLCBkYXRlU3RyaW5nKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuICAgICAgY2FzZSBcInFvXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHsgdW5pdDogXCJxdWFydGVyXCIgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuICAgICAgY2FzZSBcInFxcVwiOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcInFxcXFxXCI6XG4gICAgICAgIHJldHVybiBtYXRjaC5xdWFydGVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcInFxcXFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB9KSB8fFxuICAgICAgICAgIG1hdGNoLnF1YXJ0ZXIoZGF0ZVN0cmluZywge1xuICAgICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgbWF0Y2gucXVhcnRlcihkYXRlU3RyaW5nLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2RhdGUsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IDEgJiYgdmFsdWUgPD0gNDtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgZGF0ZS5zZXRNb250aCgodmFsdWUgLSAxKSAqIDMsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBbXG4gICAgXCJZXCIsXG4gICAgXCJSXCIsXG4gICAgXCJRXCIsXG4gICAgXCJNXCIsXG4gICAgXCJMXCIsXG4gICAgXCJ3XCIsXG4gICAgXCJJXCIsXG4gICAgXCJkXCIsXG4gICAgXCJEXCIsXG4gICAgXCJpXCIsXG4gICAgXCJlXCIsXG4gICAgXCJjXCIsXG4gICAgXCJ0XCIsXG4gICAgXCJUXCIsXG4gIF07XG59XG5leHBvcnRzLlN0YW5kQWxvbmVRdWFydGVyUGFyc2VyID0gU3RhbmRBbG9uZVF1YXJ0ZXJQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuVGltZXN0YW1wTWlsbGlzZWNvbmRzUGFyc2VyID0gdm9pZCAwO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb25zdHJ1Y3RGcm9tLmpzXCIpO1xudmFyIF9QYXJzZXIgPSByZXF1aXJlKFwiLi4vUGFyc2VyLmpzXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzLmpzXCIpO1xuXG5jbGFzcyBUaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIgZXh0ZW5kcyBfUGFyc2VyLlBhcnNlciB7XG4gIHByaW9yaXR5ID0gMjA7XG5cbiAgcGFyc2UoZGF0ZVN0cmluZykge1xuICAgIHJldHVybiAoMCwgX3V0aWxzLnBhcnNlQW55RGlnaXRzU2lnbmVkKShkYXRlU3RyaW5nKTtcbiAgfVxuXG4gIHNldChkYXRlLCBfZmxhZ3MsIHZhbHVlKSB7XG4gICAgcmV0dXJuIFsoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIHZhbHVlKSwgeyB0aW1lc3RhbXBJc1NldDogdHJ1ZSB9XTtcbiAgfVxuXG4gIGluY29tcGF0aWJsZVRva2VucyA9IFwiKlwiO1xufVxuZXhwb3J0cy5UaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXIgPSBUaW1lc3RhbXBNaWxsaXNlY29uZHNQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuVGltZXN0YW1wU2Vjb25kc1BhcnNlciA9IHZvaWQgMDtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vLi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuY2xhc3MgVGltZXN0YW1wU2Vjb25kc1BhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSA0MDtcblxuICBwYXJzZShkYXRlU3RyaW5nKSB7XG4gICAgcmV0dXJuICgwLCBfdXRpbHMucGFyc2VBbnlEaWdpdHNTaWduZWQpKGRhdGVTdHJpbmcpO1xuICB9XG5cbiAgc2V0KGRhdGUsIF9mbGFncywgdmFsdWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShkYXRlLCB2YWx1ZSAqIDEwMDApLFxuICAgICAgeyB0aW1lc3RhbXBJc1NldDogdHJ1ZSB9LFxuICAgIF07XG4gIH1cblxuICBpbmNvbXBhdGlibGVUb2tlbnMgPSBcIipcIjtcbn1cbmV4cG9ydHMuVGltZXN0YW1wU2Vjb25kc1BhcnNlciA9IFRpbWVzdGFtcFNlY29uZHNQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuWWVhclBhcnNlciA9IHZvaWQgMDtcbnZhciBfUGFyc2VyID0gcmVxdWlyZShcIi4uL1BhcnNlci5qc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlscy5qc1wiKTtcblxuLy8gRnJvbSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS90cjM1LTMxL3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0Zvcm1hdF9QYXR0ZXJuc1xuLy8gfCBZZWFyICAgICB8ICAgICB5IHwgeXkgfCAgIHl5eSB8ICB5eXl5IHwgeXl5eXkgfFxuLy8gfC0tLS0tLS0tLS18LS0tLS0tLXwtLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfFxuLy8gfCBBRCAxICAgICB8ICAgICAxIHwgMDEgfCAgIDAwMSB8ICAwMDAxIHwgMDAwMDEgfFxuLy8gfCBBRCAxMiAgICB8ICAgIDEyIHwgMTIgfCAgIDAxMiB8ICAwMDEyIHwgMDAwMTIgfFxuLy8gfCBBRCAxMjMgICB8ICAgMTIzIHwgMjMgfCAgIDEyMyB8ICAwMTIzIHwgMDAxMjMgfFxuLy8gfCBBRCAxMjM0ICB8ICAxMjM0IHwgMzQgfCAgMTIzNCB8ICAxMjM0IHwgMDEyMzQgfFxuLy8gfCBBRCAxMjM0NSB8IDEyMzQ1IHwgNDUgfCAxMjM0NSB8IDEyMzQ1IHwgMTIzNDUgfFxuY2xhc3MgWWVhclBhcnNlciBleHRlbmRzIF9QYXJzZXIuUGFyc2VyIHtcbiAgcHJpb3JpdHkgPSAxMzA7XG4gIGluY29tcGF0aWJsZVRva2VucyA9IFtcIllcIiwgXCJSXCIsIFwidVwiLCBcIndcIiwgXCJJXCIsIFwiaVwiLCBcImVcIiwgXCJjXCIsIFwidFwiLCBcIlRcIl07XG5cbiAgcGFyc2UoZGF0ZVN0cmluZywgdG9rZW4sIG1hdGNoKSB7XG4gICAgY29uc3QgdmFsdWVDYWxsYmFjayA9ICh5ZWFyKSA9PiAoe1xuICAgICAgeWVhcixcbiAgICAgIGlzVHdvRGlnaXRZZWFyOiB0b2tlbiA9PT0gXCJ5eVwiLFxuICAgIH0pO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgcmV0dXJuICgwLCBfdXRpbHMubWFwVmFsdWUpKFxuICAgICAgICAgICgwLCBfdXRpbHMucGFyc2VORGlnaXRzKSg0LCBkYXRlU3RyaW5nKSxcbiAgICAgICAgICB2YWx1ZUNhbGxiYWNrLFxuICAgICAgICApO1xuICAgICAgY2FzZSBcInlvXCI6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxzLm1hcFZhbHVlKShcbiAgICAgICAgICBtYXRjaC5vcmRpbmFsTnVtYmVyKGRhdGVTdHJpbmcsIHtcbiAgICAgICAgICAgIHVuaXQ6IFwieWVhclwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHZhbHVlQ2FsbGJhY2ssXG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5tYXBWYWx1ZSkoXG4gICAgICAgICAgKDAsIF91dGlscy5wYXJzZU5EaWdpdHMpKHRva2VuLmxlbmd0aCwgZGF0ZVN0cmluZyksXG4gICAgICAgICAgdmFsdWVDYWxsYmFjayxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZShfZGF0ZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUuaXNUd29EaWdpdFllYXIgfHwgdmFsdWUueWVhciA+IDA7XG4gIH1cblxuICBzZXQoZGF0ZSwgZmxhZ3MsIHZhbHVlKSB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICBpZiAodmFsdWUuaXNUd29EaWdpdFllYXIpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUd29EaWdpdFllYXIgPSAoMCwgX3V0aWxzLm5vcm1hbGl6ZVR3b0RpZ2l0WWVhcikoXG4gICAgICAgIHZhbHVlLnllYXIsXG4gICAgICAgIGN1cnJlbnRZZWFyLFxuICAgICAgKTtcbiAgICAgIGRhdGUuc2V0RnVsbFllYXIobm9ybWFsaXplZFR3b0RpZ2l0WWVhciwgMCwgMSk7XG4gICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgeWVhciA9XG4gICAgICAhKFwiZXJhXCIgaW4gZmxhZ3MpIHx8IGZsYWdzLmVyYSA9PT0gMSA/IHZhbHVlLnllYXIgOiAxIC0gdmFsdWUueWVhcjtcbiAgICBkYXRlLnNldEZ1bGxZZWFyKHllYXIsIDAsIDEpO1xuICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbn1cbmV4cG9ydHMuWWVhclBhcnNlciA9IFllYXJQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZGF5UGVyaW9kRW51bVRvSG91cnMgPSBkYXlQZXJpb2RFbnVtVG9Ib3VycztcbmV4cG9ydHMuaXNMZWFwWWVhckluZGV4ID0gaXNMZWFwWWVhckluZGV4O1xuZXhwb3J0cy5tYXBWYWx1ZSA9IG1hcFZhbHVlO1xuZXhwb3J0cy5ub3JtYWxpemVUd29EaWdpdFllYXIgPSBub3JtYWxpemVUd29EaWdpdFllYXI7XG5leHBvcnRzLnBhcnNlQW55RGlnaXRzU2lnbmVkID0gcGFyc2VBbnlEaWdpdHNTaWduZWQ7XG5leHBvcnRzLnBhcnNlTkRpZ2l0cyA9IHBhcnNlTkRpZ2l0cztcbmV4cG9ydHMucGFyc2VORGlnaXRzU2lnbmVkID0gcGFyc2VORGlnaXRzU2lnbmVkO1xuZXhwb3J0cy5wYXJzZU51bWVyaWNQYXR0ZXJuID0gcGFyc2VOdW1lcmljUGF0dGVybjtcbmV4cG9ydHMucGFyc2VUaW1lem9uZVBhdHRlcm4gPSBwYXJzZVRpbWV6b25lUGF0dGVybjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi4vLi4vY29uc3RhbnRzLmpzXCIpO1xuXG52YXIgX2NvbnN0YW50cyA9IHJlcXVpcmUoXCIuL2NvbnN0YW50cy5qc1wiKTtcblxuZnVuY3Rpb24gbWFwVmFsdWUocGFyc2VGblJlc3VsdCwgbWFwRm4pIHtcbiAgaWYgKCFwYXJzZUZuUmVzdWx0KSB7XG4gICAgcmV0dXJuIHBhcnNlRm5SZXN1bHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZhbHVlOiBtYXBGbihwYXJzZUZuUmVzdWx0LnZhbHVlKSxcbiAgICByZXN0OiBwYXJzZUZuUmVzdWx0LnJlc3QsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlTnVtZXJpY1BhdHRlcm4ocGF0dGVybiwgZGF0ZVN0cmluZykge1xuICBjb25zdCBtYXRjaFJlc3VsdCA9IGRhdGVTdHJpbmcubWF0Y2gocGF0dGVybik7XG5cbiAgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogcGFyc2VJbnQobWF0Y2hSZXN1bHRbMF0sIDEwKSxcbiAgICByZXN0OiBkYXRlU3RyaW5nLnNsaWNlKG1hdGNoUmVzdWx0WzBdLmxlbmd0aCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGltZXpvbmVQYXR0ZXJuKHBhdHRlcm4sIGRhdGVTdHJpbmcpIHtcbiAgY29uc3QgbWF0Y2hSZXN1bHQgPSBkYXRlU3RyaW5nLm1hdGNoKHBhdHRlcm4pO1xuXG4gIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIElucHV0IGlzICdaJ1xuICBpZiAobWF0Y2hSZXN1bHRbMF0gPT09IFwiWlwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgcmVzdDogZGF0ZVN0cmluZy5zbGljZSgxKSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgc2lnbiA9IG1hdGNoUmVzdWx0WzFdID09PSBcIitcIiA/IDEgOiAtMTtcbiAgY29uc3QgaG91cnMgPSBtYXRjaFJlc3VsdFsyXSA/IHBhcnNlSW50KG1hdGNoUmVzdWx0WzJdLCAxMCkgOiAwO1xuICBjb25zdCBtaW51dGVzID0gbWF0Y2hSZXN1bHRbM10gPyBwYXJzZUludChtYXRjaFJlc3VsdFszXSwgMTApIDogMDtcbiAgY29uc3Qgc2Vjb25kcyA9IG1hdGNoUmVzdWx0WzVdID8gcGFyc2VJbnQobWF0Y2hSZXN1bHRbNV0sIDEwKSA6IDA7XG5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTpcbiAgICAgIHNpZ24gKlxuICAgICAgKGhvdXJzICogX2luZGV4Lm1pbGxpc2Vjb25kc0luSG91ciArXG4gICAgICAgIG1pbnV0ZXMgKiBfaW5kZXgubWlsbGlzZWNvbmRzSW5NaW51dGUgK1xuICAgICAgICBzZWNvbmRzICogX2luZGV4Lm1pbGxpc2Vjb25kc0luU2Vjb25kKSxcbiAgICByZXN0OiBkYXRlU3RyaW5nLnNsaWNlKG1hdGNoUmVzdWx0WzBdLmxlbmd0aCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlQW55RGlnaXRzU2lnbmVkKGRhdGVTdHJpbmcpIHtcbiAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuYW55RGlnaXRzU2lnbmVkLFxuICAgIGRhdGVTdHJpbmcsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTkRpZ2l0cyhuLCBkYXRlU3RyaW5nKSB7XG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5zaW5nbGVEaWdpdCxcbiAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLnR3b0RpZ2l0cyxcbiAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICk7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLnRocmVlRGlnaXRzLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuZm91ckRpZ2l0cyxcbiAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG5ldyBSZWdFeHAoXCJeXFxcXGR7MSxcIiArIG4gKyBcIn1cIiksIGRhdGVTdHJpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlTkRpZ2l0c1NpZ25lZChuLCBkYXRlU3RyaW5nKSB7XG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKFxuICAgICAgICBfY29uc3RhbnRzLm51bWVyaWNQYXR0ZXJucy5zaW5nbGVEaWdpdFNpZ25lZCxcbiAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLnR3b0RpZ2l0c1NpZ25lZCxcbiAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICk7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIHBhcnNlTnVtZXJpY1BhdHRlcm4oXG4gICAgICAgIF9jb25zdGFudHMubnVtZXJpY1BhdHRlcm5zLnRocmVlRGlnaXRzU2lnbmVkLFxuICAgICAgICBkYXRlU3RyaW5nLFxuICAgICAgKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gcGFyc2VOdW1lcmljUGF0dGVybihcbiAgICAgICAgX2NvbnN0YW50cy5udW1lcmljUGF0dGVybnMuZm91ckRpZ2l0c1NpZ25lZCxcbiAgICAgICAgZGF0ZVN0cmluZyxcbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBwYXJzZU51bWVyaWNQYXR0ZXJuKG5ldyBSZWdFeHAoXCJeLT9cXFxcZHsxLFwiICsgbiArIFwifVwiKSwgZGF0ZVN0cmluZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF5UGVyaW9kRW51bVRvSG91cnMoZGF5UGVyaW9kKSB7XG4gIHN3aXRjaCAoZGF5UGVyaW9kKSB7XG4gICAgY2FzZSBcIm1vcm5pbmdcIjpcbiAgICAgIHJldHVybiA0O1xuICAgIGNhc2UgXCJldmVuaW5nXCI6XG4gICAgICByZXR1cm4gMTc7XG4gICAgY2FzZSBcInBtXCI6XG4gICAgY2FzZSBcIm5vb25cIjpcbiAgICBjYXNlIFwiYWZ0ZXJub29uXCI6XG4gICAgICByZXR1cm4gMTI7XG4gICAgY2FzZSBcImFtXCI6XG4gICAgY2FzZSBcIm1pZG5pZ2h0XCI6XG4gICAgY2FzZSBcIm5pZ2h0XCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVR3b0RpZ2l0WWVhcih0d29EaWdpdFllYXIsIGN1cnJlbnRZZWFyKSB7XG4gIGNvbnN0IGlzQ29tbW9uRXJhID0gY3VycmVudFllYXIgPiAwO1xuICAvLyBBYnNvbHV0ZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgeWVhcjpcbiAgLy8gMSAtPiAxIEFDXG4gIC8vIDAgLT4gMSBCQ1xuICAvLyAtMSAtPiAyIEJDXG4gIGNvbnN0IGFic0N1cnJlbnRZZWFyID0gaXNDb21tb25FcmEgPyBjdXJyZW50WWVhciA6IDEgLSBjdXJyZW50WWVhcjtcblxuICBsZXQgcmVzdWx0O1xuICBpZiAoYWJzQ3VycmVudFllYXIgPD0gNTApIHtcbiAgICByZXN1bHQgPSB0d29EaWdpdFllYXIgfHwgMTAwO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHJhbmdlRW5kID0gYWJzQ3VycmVudFllYXIgKyA1MDtcbiAgICBjb25zdCByYW5nZUVuZENlbnR1cnkgPSBNYXRoLnRydW5jKHJhbmdlRW5kIC8gMTAwKSAqIDEwMDtcbiAgICBjb25zdCBpc1ByZXZpb3VzQ2VudHVyeSA9IHR3b0RpZ2l0WWVhciA+PSByYW5nZUVuZCAlIDEwMDtcbiAgICByZXN1bHQgPSB0d29EaWdpdFllYXIgKyByYW5nZUVuZENlbnR1cnkgLSAoaXNQcmV2aW91c0NlbnR1cnkgPyAxMDAgOiAwKTtcbiAgfVxuXG4gIHJldHVybiBpc0NvbW1vbkVyYSA/IHJlc3VsdCA6IDEgLSByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzTGVhcFllYXJJbmRleCh5ZWFyKSB7XG4gIHJldHVybiB5ZWFyICUgNDAwID09PSAwIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXQgPSBzZXQ7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vc2V0TW9udGguanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IGRhdGUgdmFsdWVzIHRvIGEgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCBkYXRlIHZhbHVlcyB0byBhIGdpdmVuIGRhdGUuXG4gKlxuICogU2V0cyB0aW1lIHZhbHVlcyB0byBkYXRlIGZyb20gb2JqZWN0IGB2YWx1ZXNgLlxuICogQSB2YWx1ZSBpcyBub3Qgc2V0IGlmIGl0IGlzIHVuZGVmaW5lZCBvciBudWxsIG9yIGRvZXNuJ3QgZXhpc3QgaW4gYHZhbHVlc2AuXG4gKlxuICogTm90ZSBhYm91dCBidW5kbGUgc2l6ZTogYHNldGAgZG9lcyBub3QgaW50ZXJuYWxseSB1c2UgYHNldFhgIGZ1bmN0aW9ucyBmcm9tIGRhdGUtZm5zIGJ1dCBpbnN0ZWFkIG9wdHNcbiAqIHRvIHVzZSBuYXRpdmUgYERhdGUjc2V0WGAgbWV0aG9kcy4gSWYgeW91IHVzZSB0aGlzIGZ1bmN0aW9uLCB5b3UgbWF5IG5vdCB3YW50IHRvIGluY2x1ZGUgdGhlXG4gKiBvdGhlciBgc2V0WGAgZnVuY3Rpb25zIHRoYXQgZGF0ZS1mbnMgcHJvdmlkZXMgaWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQgdGhlIGJ1bmRsZSBzaXplLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSBkYXRlIHZhbHVlcyB0byBiZSBzZXRcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCBvcHRpb25zIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUcmFuc2Zvcm0gMSBTZXB0ZW1iZXIgMjAxNCBpbnRvIDIwIE9jdG9iZXIgMjAxNSBpbiBhIHNpbmdsZSBsaW5lOlxuICogY29uc3QgcmVzdWx0ID0gc2V0KG5ldyBEYXRlKDIwMTQsIDgsIDIwKSwgeyB5ZWFyOiAyMDE1LCBtb250aDogOSwgZGF0ZTogMjAgfSlcbiAqIC8vPT4gVHVlIE9jdCAyMCAyMDE1IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCAxMiBQTSB0byAxIFNlcHRlbWJlciAyMDE0IDAxOjIzOjQ1IHRvIDEgU2VwdGVtYmVyIDIwMTQgMTI6MDA6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzZXQobmV3IERhdGUoMjAxNCwgOCwgMSwgMSwgMjMsIDQ1KSwgeyBob3VyczogMTIgfSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDEyOjIzOjQ1XG4gKi9cblxuZnVuY3Rpb24gc2V0KGRhdGUsIHZhbHVlcykge1xuICBsZXQgX2RhdGUgPSAoMCwgX2luZGV4My50b0RhdGUpKGRhdGUpO1xuXG4gIC8vIENoZWNrIGlmIGRhdGUgaXMgSW52YWxpZCBEYXRlIGJlY2F1c2UgRGF0ZS5wcm90b3R5cGUuc2V0RnVsbFllYXIgaWdub3JlcyB0aGUgdmFsdWUgb2YgSW52YWxpZCBEYXRlXG4gIGlmIChpc05hTigrX2RhdGUpKSB7XG4gICAgcmV0dXJuICgwLCBfaW5kZXguY29uc3RydWN0RnJvbSkoZGF0ZSwgTmFOKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMueWVhciAhPSBudWxsKSB7XG4gICAgX2RhdGUuc2V0RnVsbFllYXIodmFsdWVzLnllYXIpO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5tb250aCAhPSBudWxsKSB7XG4gICAgX2RhdGUgPSAoMCwgX2luZGV4Mi5zZXRNb250aCkoX2RhdGUsIHZhbHVlcy5tb250aCk7XG4gIH1cblxuICBpZiAodmFsdWVzLmRhdGUgIT0gbnVsbCkge1xuICAgIF9kYXRlLnNldERhdGUodmFsdWVzLmRhdGUpO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5ob3VycyAhPSBudWxsKSB7XG4gICAgX2RhdGUuc2V0SG91cnModmFsdWVzLmhvdXJzKTtcbiAgfVxuXG4gIGlmICh2YWx1ZXMubWludXRlcyAhPSBudWxsKSB7XG4gICAgX2RhdGUuc2V0TWludXRlcyh2YWx1ZXMubWludXRlcyk7XG4gIH1cblxuICBpZiAodmFsdWVzLnNlY29uZHMgIT0gbnVsbCkge1xuICAgIF9kYXRlLnNldFNlY29uZHModmFsdWVzLnNlY29uZHMpO1xuICB9XG5cbiAgaWYgKHZhbHVlcy5taWxsaXNlY29uZHMgIT0gbnVsbCkge1xuICAgIF9kYXRlLnNldE1pbGxpc2Vjb25kcyh2YWx1ZXMubWlsbGlzZWNvbmRzKTtcbiAgfVxuXG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXREYXkgPSBzZXREYXk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkRGF5cy5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIik7XG5cbi8qKlxuICogVGhlIHtAbGluayBzZXREYXl9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzZXREYXlcbiAqIEBjYXRlZ29yeSBXZWVrZGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgZGF5IG9mIHRoZSB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gZGF5IC0gVGhlIGRheSBvZiB0aGUgd2VlayBvZiB0aGUgbmV3IGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgZGF5IG9mIHRoZSB3ZWVrIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgd2VlayBkYXkgdG8gU3VuZGF5LCB3aXRoIHRoZSBkZWZhdWx0IHdlZWtTdGFydHNPbiBvZiBTdW5kYXk6XG4gKiBjb25zdCByZXN1bHQgPSBzZXREYXkobmV3IERhdGUoMjAxNCwgOCwgMSksIDApXG4gKiAvLz0+IFN1biBBdWcgMzEgMjAxNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgd2VlayBkYXkgdG8gU3VuZGF5LCB3aXRoIGEgd2Vla1N0YXJ0c09uIG9mIE1vbmRheTpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldERheShuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMCwgeyB3ZWVrU3RhcnRzT246IDEgfSlcbiAqIC8vPT4gU3VuIFNlcCAwNyAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldERheShkYXRlLCBkYXksIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4My5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgY29uc3Qgd2Vla1N0YXJ0c09uID1cbiAgICBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgMDtcblxuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IGN1cnJlbnREYXkgPSBfZGF0ZS5nZXREYXkoKTtcblxuICBjb25zdCByZW1haW5kZXIgPSBkYXkgJSA3O1xuICBjb25zdCBkYXlJbmRleCA9IChyZW1haW5kZXIgKyA3KSAlIDc7XG5cbiAgY29uc3QgZGVsdGEgPSA3IC0gd2Vla1N0YXJ0c09uO1xuICBjb25zdCBkaWZmID1cbiAgICBkYXkgPCAwIHx8IGRheSA+IDZcbiAgICAgID8gZGF5IC0gKChjdXJyZW50RGF5ICsgZGVsdGEpICUgNylcbiAgICAgIDogKChkYXlJbmRleCArIGRlbHRhKSAlIDcpIC0gKChjdXJyZW50RGF5ICsgZGVsdGEpICUgNyk7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZERheXMpKF9kYXRlLCBkaWZmKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRIb3VycyA9IHNldEhvdXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRIb3Vyc1xuICogQGNhdGVnb3J5IEhvdXIgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSBob3VycyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgaG91cnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gaG91cnMgLSBUaGUgaG91cnMgb2YgdGhlIG5ldyBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGhvdXJzIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgNCBob3VycyB0byAxIFNlcHRlbWJlciAyMDE0IDExOjMwOjAwOlxuICogY29uc3QgcmVzdWx0ID0gc2V0SG91cnMobmV3IERhdGUoMjAxNCwgOCwgMSwgMTEsIDMwKSwgNClcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDA0OjMwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldEhvdXJzKGRhdGUsIGhvdXJzKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBfZGF0ZS5zZXRIb3Vycyhob3Vycyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRJU09EYXkgPSBzZXRJU09EYXk7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkRGF5cy5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vZ2V0SVNPRGF5LmpzXCIpO1xudmFyIF9pbmRleDMgPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc2V0SVNPRGF5XG4gKiBAY2F0ZWdvcnkgV2Vla2RheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIGRheSBvZiB0aGUgSVNPIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIGRheSBvZiB0aGUgSVNPIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKiBJU08gd2VlayBzdGFydHMgd2l0aCBNb25kYXkuXG4gKiA3IGlzIHRoZSBpbmRleCBvZiBTdW5kYXksIDEgaXMgdGhlIGluZGV4IG9mIE1vbmRheSBldGMuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gZGF5IC0gVGhlIGRheSBvZiB0aGUgSVNPIHdlZWsgb2YgdGhlIG5ldyBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheSBvZiB0aGUgSVNPIHdlZWsgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCBTdW5kYXkgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldElTT0RheShuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgNylcbiAqIC8vPT4gU3VuIFNlcCAwNyAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldElTT0RheShkYXRlLCBkYXkpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4My50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBjdXJyZW50RGF5ID0gKDAsIF9pbmRleDIuZ2V0SVNPRGF5KShfZGF0ZSk7XG4gIGNvbnN0IGRpZmYgPSBkYXkgLSBjdXJyZW50RGF5O1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGREYXlzKShfZGF0ZSwgZGlmZik7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc2V0SVNPV2VlayA9IHNldElTT1dlZWs7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vZ2V0SVNPV2Vlay5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldElTT1dlZWtcbiAqIEBjYXRlZ29yeSBJU08gV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIElTTyB3ZWVrIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSBJU08gd2VlayB0byB0aGUgZ2l2ZW4gZGF0ZSwgc2F2aW5nIHRoZSB3ZWVrZGF5IG51bWJlci5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gd2VlayAtIFRoZSBJU08gd2VlayBvZiB0aGUgbmV3IGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgSVNPIHdlZWsgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB0aGUgNTNyZCBJU08gd2VlayB0byA3IEF1Z3VzdCAyMDA0OlxuICogY29uc3QgcmVzdWx0ID0gc2V0SVNPV2VlayhuZXcgRGF0ZSgyMDA0LCA3LCA3KSwgNTMpXG4gKiAvLz0+IFNhdCBKYW4gMDEgMjAwNSAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzZXRJU09XZWVrKGRhdGUsIHdlZWspIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkaWZmID0gKDAsIF9pbmRleC5nZXRJU09XZWVrKShfZGF0ZSkgLSB3ZWVrO1xuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYgKiA3KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldE1pbnV0ZXMgPSBzZXRNaW51dGVzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRNaW51dGVzXG4gKiBAY2F0ZWdvcnkgTWludXRlIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgbWludXRlcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgbWludXRlcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBtaW51dGVzIC0gVGhlIG1pbnV0ZXMgb2YgdGhlIG5ldyBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIG1pbnV0ZXMgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCA0NSBtaW51dGVzIHRvIDEgU2VwdGVtYmVyIDIwMTQgMTE6MzA6NDA6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRNaW51dGVzKG5ldyBEYXRlKDIwMTQsIDgsIDEsIDExLCAzMCwgNDApLCA0NSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDExOjQ1OjQwXG4gKi9cbmZ1bmN0aW9uIHNldE1pbnV0ZXMoZGF0ZSwgbWludXRlcykge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgX2RhdGUuc2V0TWludXRlcyhtaW51dGVzKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldE1vbnRoID0gc2V0TW9udGg7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vZ2V0RGF5c0luTW9udGguanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgbW9udGggdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIG1vbnRoIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIG1vbnRoIC0gVGhlIG1vbnRoIGluZGV4IHRvIHNldCAoMC0xMSlcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgbW9udGggc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCBGZWJydWFyeSB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc2V0TW9udGgobmV3IERhdGUoMjAxNCwgOCwgMSksIDEpXG4gKiAvLz0+IFNhdCBGZWIgMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzZXRNb250aChkYXRlLCBtb250aCkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgzLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXRlKCk7XG5cbiAgY29uc3QgZGF0ZVdpdGhEZXNpcmVkTW9udGggPSAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBkYXRlV2l0aERlc2lyZWRNb250aC5zZXRGdWxsWWVhcih5ZWFyLCBtb250aCwgMTUpO1xuICBkYXRlV2l0aERlc2lyZWRNb250aC5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3QgZGF5c0luTW9udGggPSAoMCwgX2luZGV4Mi5nZXREYXlzSW5Nb250aCkoZGF0ZVdpdGhEZXNpcmVkTW9udGgpO1xuICAvLyBTZXQgdGhlIGxhc3QgZGF5IG9mIHRoZSBuZXcgbW9udGhcbiAgLy8gaWYgdGhlIG9yaWdpbmFsIGRhdGUgd2FzIHRoZSBsYXN0IGRheSBvZiB0aGUgbG9uZ2VyIG1vbnRoXG4gIF9kYXRlLnNldE1vbnRoKG1vbnRoLCBNYXRoLm1pbihkYXksIGRheXNJbk1vbnRoKSk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zZXRRdWFydGVyID0gc2V0UXVhcnRlcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9zZXRNb250aC5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHNldFF1YXJ0ZXJcbiAqIEBjYXRlZ29yeSBRdWFydGVyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgeWVhciBxdWFydGVyIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSB5ZWFyIHF1YXJ0ZXIgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gcXVhcnRlciAtIFRoZSBxdWFydGVyIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBxdWFydGVyIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgdGhlIDJuZCBxdWFydGVyIHRvIDIgSnVseSAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc2V0UXVhcnRlcihuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgMilcbiAqIC8vPT4gV2VkIEFwciAwMiAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHNldFF1YXJ0ZXIoZGF0ZSwgcXVhcnRlcikge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgyLnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IG9sZFF1YXJ0ZXIgPSBNYXRoLnRydW5jKF9kYXRlLmdldE1vbnRoKCkgLyAzKSArIDE7XG4gIGNvbnN0IGRpZmYgPSBxdWFydGVyIC0gb2xkUXVhcnRlcjtcbiAgcmV0dXJuICgwLCBfaW5kZXguc2V0TW9udGgpKF9kYXRlLCBfZGF0ZS5nZXRNb250aCgpICsgZGlmZiAqIDMpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldFNlY29uZHMgPSBzZXRTZWNvbmRzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRTZWNvbmRzXG4gKiBAY2F0ZWdvcnkgU2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNldCB0aGUgc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBzZWNvbmRzIC0gVGhlIHNlY29uZHMgb2YgdGhlIG5ldyBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHNlY29uZHMgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCA0NSBzZWNvbmRzIHRvIDEgU2VwdGVtYmVyIDIwMTQgMTE6MzA6NDA6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRTZWNvbmRzKG5ldyBEYXRlKDIwMTQsIDgsIDEsIDExLCAzMCwgNDApLCA0NSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDExOjMwOjQ1XG4gKi9cbmZ1bmN0aW9uIHNldFNlY29uZHMoZGF0ZSwgc2Vjb25kcykge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgX2RhdGUuc2V0U2Vjb25kcyhzZWNvbmRzKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldFdlZWsgPSBzZXRXZWVrO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2dldFdlZWsuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHNldFdlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIGxvY2FsIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIGxvY2FsIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUsIHNhdmluZyB0aGUgd2Vla2RheSBudW1iZXIuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gd2VlayAtIFRoZSB3ZWVrIG9mIHRoZSBuZXcgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIGxvY2FsIHdlZWsgc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB0aGUgMXN0IHdlZWsgdG8gMiBKYW51YXJ5IDIwMDUgd2l0aCBkZWZhdWx0IG9wdGlvbnM6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCAxKVxuICogLy89PiBTdW4gRGVjIDI2IDIwMDQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU2V0IHRoZSAxc3Qgd2VlayB0byAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCAxLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiBTdW4gSmFuIDQgMjAwNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzZXRXZWVrKGRhdGUsIHdlZWssIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSAoMCwgX2luZGV4Mi50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkaWZmID0gKDAsIF9pbmRleC5nZXRXZWVrKShfZGF0ZSwgb3B0aW9ucykgLSB3ZWVrO1xuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYgKiA3KTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnNldFllYXIgPSBzZXRZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzZXRZZWFyXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTZXQgdGhlIHllYXIgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIHllYXIgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0geWVhciAtIFRoZSB5ZWFyIG9mIHRoZSBuZXcgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSB5ZWFyIHNldFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgeWVhciAyMDEzIHRvIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzZXRZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAyMDEzKVxuICogLy89PiBTdW4gU2VwIDAxIDIwMTMgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc2V0WWVhcihkYXRlLCB5ZWFyKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIudG9EYXRlKShkYXRlKTtcblxuICAvLyBDaGVjayBpZiBkYXRlIGlzIEludmFsaWQgRGF0ZSBiZWNhdXNlIERhdGUucHJvdG90eXBlLnNldEZ1bGxZZWFyIGlnbm9yZXMgdGhlIHZhbHVlIG9mIEludmFsaWQgRGF0ZVxuICBpZiAoaXNOYU4oK19kYXRlKSkge1xuICAgIHJldHVybiAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIE5hTik7XG4gIH1cblxuICBfZGF0ZS5zZXRGdWxsWWVhcih5ZWFyKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZEYXkgPSBzdGFydE9mRGF5O1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mRGF5XG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGRheSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSBkYXlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgZGF5IGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZkRheShuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBUdWUgU2VwIDAyIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZkRheShkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZJU09XZWVrID0gc3RhcnRPZklTT1dlZWs7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vc3RhcnRPZldlZWsuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZklTT1dlZWtcbiAqIEBjYXRlZ29yeSBJU08gV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mSVNPV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZklTT1dlZWsoZGF0ZSkge1xuICByZXR1cm4gKDAsIF9pbmRleC5zdGFydE9mV2VlaykoZGF0ZSwgeyB3ZWVrU3RhcnRzT246IDEgfSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZklTT1dlZWtZZWFyID0gc3RhcnRPZklTT1dlZWtZZWFyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2dldElTT1dlZWtZZWFyLmpzXCIpO1xudmFyIF9pbmRleDIgPSByZXF1aXJlKFwiLi9zdGFydE9mSVNPV2Vlay5qc1wiKTtcbnZhciBfaW5kZXgzID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mSVNPV2Vla1llYXJcbiAqIEBjYXRlZ29yeSBJU08gV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIsXG4gKiB3aGljaCBhbHdheXMgc3RhcnRzIDMgZGF5cyBiZWZvcmUgdGhlIHllYXIncyBmaXJzdCBUaHVyc2RheS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciAyIEp1bHkgMjAwNTpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZJU09XZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSlcbiAqIC8vPT4gTW9uIEphbiAwMyAyMDA1IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0T2ZJU09XZWVrWWVhcihkYXRlKSB7XG4gIGNvbnN0IHllYXIgPSAoMCwgX2luZGV4LmdldElTT1dlZWtZZWFyKShkYXRlKTtcbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gKDAsIF9pbmRleDMuY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIGZvdXJ0aE9mSmFudWFyeS5zZXRGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gKDAsIF9pbmRleDIuc3RhcnRPZklTT1dlZWspKGZvdXJ0aE9mSmFudWFyeSk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZk1vbnRoID0gc3RhcnRPZk1vbnRoO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIG1vbnRoXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIG1vbnRoIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZk1vbnRoKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mTW9udGgoZGF0ZSkge1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgudG9EYXRlKShkYXRlKTtcbiAgX2RhdGUuc2V0RGF0ZSgxKTtcbiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mUXVhcnRlciA9IHN0YXJ0T2ZRdWFydGVyO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL3RvRGF0ZS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mUXVhcnRlclxuICogQGNhdGVnb3J5IFF1YXJ0ZXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgcXVhcnRlciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgeWVhciBxdWFydGVyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHF1YXJ0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgcXVhcnRlciBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZRdWFydGVyKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFR1ZSBKdWwgMDEgMjAxNCAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdGFydE9mUXVhcnRlcihkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBjdXJyZW50TW9udGggPSBfZGF0ZS5nZXRNb250aCgpO1xuICBjb25zdCBtb250aCA9IGN1cnJlbnRNb250aCAtIChjdXJyZW50TW9udGggJSAzKTtcbiAgX2RhdGUuc2V0TW9udGgobW9udGgsIDEpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN0YXJ0T2ZXZWVrID0gc3RhcnRPZldlZWs7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vdG9EYXRlLmpzXCIpO1xuXG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIik7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFN1biBBdWcgMzEgMjAxNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0aGUgd2VlayBzdGFydHMgb24gTW9uZGF5LCB0aGUgc3RhcnQgb2YgdGhlIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZldlZWsoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9ICgwLCBfaW5kZXgyLmdldERlZmF1bHRPcHRpb25zKSgpO1xuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleC50b0RhdGUpKGRhdGUpO1xuICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTtcbiAgY29uc3QgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247XG5cbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgLSBkaWZmKTtcbiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdGFydE9mV2Vla1llYXIgPSBzdGFydE9mV2Vla1llYXI7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcbnZhciBfaW5kZXgyID0gcmVxdWlyZShcIi4vZ2V0V2Vla1llYXIuanNcIik7XG52YXIgX2luZGV4MyA9IHJlcXVpcmUoXCIuL3N0YXJ0T2ZXZWVrLmpzXCIpO1xuXG52YXIgX2luZGV4NCA9IHJlcXVpcmUoXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIik7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mV2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mV2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1RoZV9JU09fd2Vla19kYXRlX3N5c3RlbVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDUgd2l0aCBkZWZhdWx0IHNldHRpbmdzOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBTdW4gRGVjIDI2IDIwMDQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDVcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHdlZWtcbiAqIC8vIGFuZCA0IEphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZldlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSAoMCwgX2luZGV4NC5nZXREZWZhdWx0T3B0aW9ucykoKTtcbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB5ZWFyID0gKDAsIF9pbmRleDIuZ2V0V2Vla1llYXIpKGRhdGUsIG9wdGlvbnMpO1xuICBjb25zdCBmaXJzdFdlZWsgPSAoMCwgX2luZGV4LmNvbnN0cnVjdEZyb20pKGRhdGUsIDApO1xuICBmaXJzdFdlZWsuc2V0RnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBfZGF0ZSA9ICgwLCBfaW5kZXgzLnN0YXJ0T2ZXZWVrKShmaXJzdFdlZWssIG9wdGlvbnMpO1xuICByZXR1cm4gX2RhdGU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuc3RhcnRPZlllYXIgPSBzdGFydE9mWWVhcjtcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi90b0RhdGUuanNcIik7XG52YXIgX2luZGV4MiA9IHJlcXVpcmUoXCIuL2NvbnN0cnVjdEZyb20uanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZlllYXJcbiAqIEBjYXRlZ29yeSBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMDApKVxuICogLy89PiBXZWQgSmFuIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3RhcnRPZlllYXIoZGF0ZSkge1xuICBjb25zdCBjbGVhbkRhdGUgPSAoMCwgX2luZGV4LnRvRGF0ZSkoZGF0ZSk7XG4gIGNvbnN0IF9kYXRlID0gKDAsIF9pbmRleDIuY29uc3RydWN0RnJvbSkoZGF0ZSwgMCk7XG4gIF9kYXRlLnNldEZ1bGxZZWFyKGNsZWFuRGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdWJEYXlzID0gc3ViRGF5cztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGREYXlzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN1YkRheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2YgZGF5cyB0byBiZSBzdWJ0cmFjdGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBkYXlzIHN1YnRyYWN0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgMTAgZGF5cyBmcm9tIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJEYXlzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCAxMClcbiAqIC8vPT4gRnJpIEF1ZyAyMiAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN1YkRheXMoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZERheXMpKGRhdGUsIC1hbW91bnQpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN1Yk1vbnRocyA9IHN1Yk1vbnRocztcbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi9hZGRNb250aHMuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3ViTW9udGhzXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbW9udGhzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtb250aHMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIG1vbnRocyB0byBiZSBzdWJ0cmFjdGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtb250aHMgc3VidHJhY3RlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCA1IG1vbnRocyBmcm9tIDEgRmVicnVhcnkgMjAxNTpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1Yk1vbnRocyhuZXcgRGF0ZSgyMDE1LCAxLCAxKSwgNSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN1Yk1vbnRocyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkTW9udGhzKShkYXRlLCAtYW1vdW50KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdWJRdWFydGVycyA9IHN1YlF1YXJ0ZXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZFF1YXJ0ZXJzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN1YlF1YXJ0ZXJzXG4gKiBAY2F0ZWdvcnkgUXVhcnRlciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFyIHF1YXJ0ZXJzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFyIHF1YXJ0ZXJzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0gYW1vdW50IC0gVGhlIGFtb3VudCBvZiBxdWFydGVycyB0byBiZSBzdWJ0cmFjdGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBxdWFydGVycyBzdWJ0cmFjdGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFN1YnRyYWN0IDMgcXVhcnRlcnMgZnJvbSAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc3ViUXVhcnRlcnMobmV3IERhdGUoMjAxNCwgOCwgMSksIDMpXG4gKiAvLz0+IFN1biBEZWMgMDEgMjAxMyAwMDowMDowMFxuICovXG5mdW5jdGlvbiBzdWJRdWFydGVycyhkYXRlLCBhbW91bnQpIHtcbiAgcmV0dXJuICgwLCBfaW5kZXguYWRkUXVhcnRlcnMpKGRhdGUsIC1hbW91bnQpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLnN1YldlZWtzID0gc3ViV2Vla3M7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vYWRkV2Vla3MuanNcIik7XG5cbi8qKlxuICogQG5hbWUgc3ViV2Vla3NcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdlZWtzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB3ZWVrcyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIGFtb3VudCAtIFRoZSBhbW91bnQgb2Ygd2Vla3MgdG8gYmUgc3VidHJhY3RlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IGRhdGUgd2l0aCB0aGUgd2Vla3Mgc3VidHJhY3RlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTdWJ0cmFjdCA0IHdlZWtzIGZyb20gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN1YldlZWtzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA0KVxuICogLy89PiBNb24gQXVnIDA0IDIwMTQgMDA6MDA6MDBcbiAqL1xuZnVuY3Rpb24gc3ViV2Vla3MoZGF0ZSwgYW1vdW50KSB7XG4gIHJldHVybiAoMCwgX2luZGV4LmFkZFdlZWtzKShkYXRlLCAtYW1vdW50KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5zdWJZZWFycyA9IHN1YlllYXJzO1xudmFyIF9pbmRleCA9IHJlcXVpcmUoXCIuL2FkZFllYXJzLmpzXCIpO1xuXG4vKipcbiAqIEBuYW1lIHN1YlllYXJzXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB5ZWFycyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhcnMgZnJvbSB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSBhbW91bnQgLSBUaGUgYW1vdW50IG9mIHllYXJzIHRvIGJlIHN1YnRyYWN0ZWQuXG4gKlxuICogQHJldHVybnMgVGhlIG5ldyBkYXRlIHdpdGggdGhlIHllYXJzIHN1YnRyYWN0ZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgNSB5ZWFycyBmcm9tIDEgU2VwdGVtYmVyIDIwMTQ6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJZZWFycyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgNSlcbiAqIC8vPT4gVHVlIFNlcCAwMSAyMDA5IDAwOjAwOjAwXG4gKi9cbmZ1bmN0aW9uIHN1YlllYXJzKGRhdGUsIGFtb3VudCkge1xuICByZXR1cm4gKDAsIF9pbmRleC5hZGRZZWFycykoZGF0ZSwgLWFtb3VudCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMudG9EYXRlID0gdG9EYXRlO1xuXG4vKipcbiAqIEBuYW1lIHRvRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXRzIGNsb25lLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIG51bWJlciwgaXQgaXMgdHJlYXRlZCBhcyBhIHRpbWVzdGFtcC5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgbm9uZSBvZiB0aGUgYWJvdmUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiAqKk5vdGUqKjogKmFsbCogRGF0ZSBhcmd1bWVudHMgcGFzc2VkIHRvIGFueSAqZGF0ZS1mbnMqIGZ1bmN0aW9uIGlzIHByb2Nlc3NlZCBieSBgdG9EYXRlYC5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5mdW5jdGlvbiB0b0RhdGUoYXJndW1lbnQpIHtcbiAgY29uc3QgYXJnU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50KTtcblxuICAvLyBDbG9uZSB0aGUgZGF0ZVxuICBpZiAoXG4gICAgYXJndW1lbnQgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgKHR5cGVvZiBhcmd1bWVudCA9PT0gXCJvYmplY3RcIiAmJiBhcmdTdHIgPT09IFwiW29iamVjdCBEYXRlXVwiKVxuICApIHtcbiAgICAvLyBQcmV2ZW50IHRoZSBkYXRlIHRvIGxvc2UgdGhlIG1pbGxpc2Vjb25kcyB3aGVuIHBhc3NlZCB0byBuZXcgRGF0ZSgpIGluIElFMTBcbiAgICByZXR1cm4gbmV3IGFyZ3VtZW50LmNvbnN0cnVjdG9yKCthcmd1bWVudCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgdHlwZW9mIGFyZ3VtZW50ID09PSBcIm51bWJlclwiIHx8XG4gICAgYXJnU3RyID09PSBcIltvYmplY3QgTnVtYmVyXVwiIHx8XG4gICAgdHlwZW9mIGFyZ3VtZW50ID09PSBcInN0cmluZ1wiIHx8XG4gICAgYXJnU3RyID09PSBcIltvYmplY3QgU3RyaW5nXVwiXG4gICkge1xuICAgIC8vIFRPRE86IENhbiB3ZSBnZXQgcmlkIG9mIGFzP1xuICAgIHJldHVybiBuZXcgRGF0ZShhcmd1bWVudCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETzogQ2FuIHdlIGdldCByaWQgb2YgYXM/XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy50cmFuc3Bvc2UgPSB0cmFuc3Bvc2U7XG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vY29uc3RydWN0RnJvbS5qc1wiKTtcblxuLyoqXG4gKiBAbmFtZSB0cmFuc3Bvc2VcbiAqIEBjYXRlZ29yeSBHZW5lcmljIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFRyYW5zcG9zZSB0aGUgZGF0ZSB0byB0aGUgZ2l2ZW4gY29uc3RydWN0b3IuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgZnVuY3Rpb24gdHJhbnNwb3NlcyB0aGUgZGF0ZSB0byB0aGUgZ2l2ZW4gY29uc3RydWN0b3IuIEl0IGhlbHBzIHlvdVxuICogdG8gdHJhbnNwb3NlIHRoZSBkYXRlIGluIHRoZSBzeXN0ZW0gdGltZSB6b25lIHRvIHNheSBgVVRDRGF0ZWAgb3IgYW55IG90aGVyXG4gKiBkYXRlIGV4dGVuc2lvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVJbnB1dFR5cGUgLSBUaGUgaW5wdXQgYERhdGVgIHR5cGUgZGVyaXZlZCBmcm9tIHRoZSBwYXNzZWQgYXJndW1lbnQuXG4gKiBAdHlwZVBhcmFtIERhdGVPdXRwdXRUeXBlIC0gVGhlIG91dHB1dCBgRGF0ZWAgdHlwZSBkZXJpdmVkIGZyb20gdGhlIHBhc3NlZCBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gZnJvbURhdGUgLSBUaGUgZGF0ZSB0byB1c2UgdmFsdWVzIGZyb21cbiAqIEBwYXJhbSBjb25zdHJ1Y3RvciAtIFRoZSBkYXRlIGNvbnN0cnVjdG9yIHRvIHVzZVxuICpcbiAqIEByZXR1cm5zIERhdGUgdHJhbnNwb3NlZCB0byB0aGUgZ2l2ZW4gY29uc3RydWN0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIEp1bHkgMTAsIDIwMjIgMDA6MDAgaW4gbG9jYWxlIHRpbWUgem9uZVxuICogY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDIwMjIsIDYsIDEwKVxuICogLy89PiAnU3VuIEp1bCAxMCAyMDIyIDAwOjAwOjAwIEdNVCswODAwIChTaW5nYXBvcmUgU3RhbmRhcmQgVGltZSknXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRyYW5zcG9zZSB0aGUgZGF0ZSB0byBKdWx5IDEwLCAyMDIyIDAwOjAwIGluIFVUQ1xuICogdHJhbnNwb3NlKGRhdGUsIFVUQ0RhdGUpXG4gKiAvLz0+ICdTdW4gSnVsIDEwIDIwMjIgMDA6MDA6MDAgR01UKzAwMDAgKENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lKSdcbiAqL1xuZnVuY3Rpb24gdHJhbnNwb3NlKGZyb21EYXRlLCBjb25zdHJ1Y3Rvcikge1xuICBjb25zdCBkYXRlID1cbiAgICBjb25zdHJ1Y3RvciBpbnN0YW5jZW9mIERhdGVcbiAgICAgID8gKDAsIF9pbmRleC5jb25zdHJ1Y3RGcm9tKShjb25zdHJ1Y3RvciwgMClcbiAgICAgIDogbmV3IGNvbnN0cnVjdG9yKDApO1xuICBkYXRlLnNldEZ1bGxZZWFyKFxuICAgIGZyb21EYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgZnJvbURhdGUuZ2V0TW9udGgoKSxcbiAgICBmcm9tRGF0ZS5nZXREYXRlKCksXG4gICk7XG4gIGRhdGUuc2V0SG91cnMoXG4gICAgZnJvbURhdGUuZ2V0SG91cnMoKSxcbiAgICBmcm9tRGF0ZS5nZXRNaW51dGVzKCksXG4gICAgZnJvbURhdGUuZ2V0U2Vjb25kcygpLFxuICAgIGZyb21EYXRlLmdldE1pbGxpc2Vjb25kcygpLFxuICApO1xuICByZXR1cm4gZGF0ZTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWRvbS5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgU2NoZWR1bGVyID0gcmVxdWlyZSgnc2NoZWR1bGVyJyk7XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuXG52YXIgc3VwcHJlc3NXYXJuaW5nID0gZmFsc2U7XG5mdW5jdGlvbiBzZXRTdXBwcmVzc1dhcm5pbmcobmV3U3VwcHJlc3NXYXJuaW5nKSB7XG4gIHtcbiAgICBzdXBwcmVzc1dhcm5pbmcgPSBuZXdTdXBwcmVzc1dhcm5pbmc7XG4gIH1cbn0gLy8gSW4gREVWLCBjYWxscyB0byBjb25zb2xlLndhcm4gYW5kIGNvbnNvbGUuZXJyb3IgZ2V0IHJlcGxhY2VkXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICBpZiAoIXN1cHByZXNzV2FybmluZykge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICB7XG4gICAgaWYgKCFzdXBwcmVzc1dhcm5pbmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBGdW5jdGlvbkNvbXBvbmVudCA9IDA7XG52YXIgQ2xhc3NDb21wb25lbnQgPSAxO1xudmFyIEluZGV0ZXJtaW5hdGVDb21wb25lbnQgPSAyOyAvLyBCZWZvcmUgd2Uga25vdyB3aGV0aGVyIGl0IGlzIGZ1bmN0aW9uIG9yIGNsYXNzXG5cbnZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLlxuXG52YXIgSG9zdFBvcnRhbCA9IDQ7IC8vIEEgc3VidHJlZS4gQ291bGQgYmUgYW4gZW50cnkgcG9pbnQgdG8gYSBkaWZmZXJlbnQgcmVuZGVyZXIuXG5cbnZhciBIb3N0Q29tcG9uZW50ID0gNTtcbnZhciBIb3N0VGV4dCA9IDY7XG52YXIgRnJhZ21lbnQgPSA3O1xudmFyIE1vZGUgPSA4O1xudmFyIENvbnRleHRDb25zdW1lciA9IDk7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gMTA7XG52YXIgRm9yd2FyZFJlZiA9IDExO1xudmFyIFByb2ZpbGVyID0gMTI7XG52YXIgU3VzcGVuc2VDb21wb25lbnQgPSAxMztcbnZhciBNZW1vQ29tcG9uZW50ID0gMTQ7XG52YXIgU2ltcGxlTWVtb0NvbXBvbmVudCA9IDE1O1xudmFyIExhenlDb21wb25lbnQgPSAxNjtcbnZhciBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQgPSAxNztcbnZhciBEZWh5ZHJhdGVkRnJhZ21lbnQgPSAxODtcbnZhciBTdXNwZW5zZUxpc3RDb21wb25lbnQgPSAxOTtcbnZhciBTY29wZUNvbXBvbmVudCA9IDIxO1xudmFyIE9mZnNjcmVlbkNvbXBvbmVudCA9IDIyO1xudmFyIExlZ2FjeUhpZGRlbkNvbXBvbmVudCA9IDIzO1xudmFyIENhY2hlQ29tcG9uZW50ID0gMjQ7XG52YXIgVHJhY2luZ01hcmtlckNvbXBvbmVudCA9IDI1O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlQ2xpZW50UmVuZGVyRmFsbGJhY2tPblRleHRNaXNtYXRjaCA9IHRydWU7IC8vIFRPRE86IE5lZWQgdG8gcmV2aWV3IHRoaXMgY29kZSBvbmUgbW9yZSB0aW1lIGJlZm9yZSBsYW5kaW5nXG4vLyB0aGUgcmVhY3QtcmVjb25jaWxlciBwYWNrYWdlLlxuXG52YXIgZW5hYmxlTmV3UmVjb25jaWxlciA9IGZhbHNlOyAvLyBTdXBwb3J0IGxlZ2FjeSBQcmltZXIgc3VwcG9ydCBvbiBpbnRlcm5hbCBGQiB3d3dcblxudmFyIGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gPSBmYWxzZTsgLy8gRkItb25seSB1c2FnZS4gVGhlIG5ldyBBUEkgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MuXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG5cbnZhciBlbmFibGVTdXNwZW5zZUF2b2lkVGhpc0ZhbGxiYWNrID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaXp6XG4vLyBSZWFjdCBET00gQ2hvcHBpbmcgQmxvY2tcbi8vXG4vLyBTaW1pbGFyIHRvIG1haW4gQ2hvcHBpbmcgQmxvY2sgYnV0IG9ubHkgZmxhZ3MgcmVsYXRlZCB0byBSZWFjdCBET00uIFRoZXNlIGFyZVxuLy8gZ3JvdXBlZCBiZWNhdXNlIHdlIHdpbGwgbGlrZWx5IGJhdGNoIGFsbCBvZiB0aGVtIGludG8gYSBzaW5nbGUgbWFqb3IgcmVsZWFzZS5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEaXNhYmxlIHN1cHBvcnQgZm9yIGNvbW1lbnQgbm9kZXMgYXMgUmVhY3QgRE9NIGNvbnRhaW5lcnMuIEFscmVhZHkgZGlzYWJsZWRcbi8vIGluIG9wZW4gc291cmNlLCBidXQgd3d3IGNvZGViYXNlIHN0aWxsIHJlbGllcyBvbiBpdC4gTmVlZCB0byByZW1vdmUuXG5cbnZhciBkaXNhYmxlQ29tbWVudHNBc0RPTUNvbnRhaW5lcnMgPSB0cnVlOyAvLyBEaXNhYmxlIGphdmFzY3JpcHQ6IFVSTCBzdHJpbmdzIGluIGhyZWYgZm9yIFhTUyBwcm90ZWN0aW9uLlxuLy8gYW5kIGNsaWVudCByZW5kZXJpbmcsIG1vc3RseSB0byBhbGxvdyBKU1ggYXR0cmlidXRlcyB0byBhcHBseSB0byB0aGUgY3VzdG9tXG4vLyBlbGVtZW50J3Mgb2JqZWN0IHByb3BlcnRpZXMgaW5zdGVhZCBvZiBvbmx5IEhUTUwgYXR0cmlidXRlcy5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTEzNDdcblxudmFyIGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgPSBmYWxzZTsgLy8gRGlzYWJsZXMgY2hpbGRyZW4gZm9yIDx0ZXh0YXJlYT4gZWxlbWVudHNcbnZhciB3YXJuQWJvdXRTdHJpbmdSZWZzID0gdHJ1ZTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlYnVnZ2luZyBhbmQgRGV2VG9vbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBZGRzIHVzZXIgdGltaW5nIG1hcmtzIGZvciBlLmcuIHN0YXRlIHVwZGF0ZXMsIHN1c3BlbnNlLCBhbmQgd29yayBsb29wIHN0dWZmLFxuLy8gZm9yIGFuIGV4cGVyaW1lbnRhbCB0aW1lbGluZSB0b29sLlxuXG52YXIgZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyID0gdHJ1ZTsgLy8gSGVscHMgaWRlbnRpZnkgc2lkZSBlZmZlY3RzIGluIHJlbmRlci1waGFzZSBsaWZlY3ljbGUgaG9va3MgYW5kIHNldFN0YXRlXG5cbnZhciBlbmFibGVQcm9maWxlclRpbWVyID0gdHJ1ZTsgLy8gUmVjb3JkIGR1cmF0aW9ucyBmb3IgY29tbWl0IGFuZCBwYXNzaXZlIGVmZmVjdHMgcGhhc2VzLlxuXG52YXIgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyA9IHRydWU7IC8vIFBoYXNlIHBhcmFtIHBhc3NlZCB0byBvblJlbmRlciBjYWxsYmFjayBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIGFuIFwidXBkYXRlXCIgYW5kIGEgXCJjYXNjYWRpbmctdXBkYXRlXCIuXG5cbnZhciBhbGxOYXRpdmVFdmVudHMgPSBuZXcgU2V0KCk7XG4vKipcbiAqIE1hcHBpbmcgZnJvbSByZWdpc3RyYXRpb24gbmFtZSB0byBldmVudCBuYW1lXG4gKi9cblxuXG52YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IHt9O1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbixcbiAqIHVzZWQgdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGV2ZW50IGhhbmRsZXJzLiBBdmFpbGFibGVcbiAqIG9ubHkgaW4gdHJ1ZS5cbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxudmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSAge30gOyAvLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgaW4gdHJ1ZVxuXG5mdW5jdGlvbiByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgJ0NhcHR1cmUnLCBkZXBlbmRlbmNpZXMpO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdKSB7XG4gICAgICBlcnJvcignRXZlbnRSZWdpc3RyeTogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgJyArICdyZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4nLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gZGVwZW5kZW5jaWVzO1xuXG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSByZWdpc3RyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykge1xuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5vbmRibGNsaWNrID0gcmVnaXN0cmF0aW9uTmFtZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5hZGQoZGVwZW5kZW5jaWVzW2ldKTtcbiAgfVxufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qXG4gKiBUaGUgYCcnICsgdmFsdWVgIHBhdHRlcm4gKHVzZWQgaW4gaW4gcGVyZi1zZW5zaXRpdmUgY29kZSkgdGhyb3dzIGZvciBTeW1ib2xcbiAqIGFuZCBUZW1wb3JhbC4qIHR5cGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjIwNjQuXG4gKlxuICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB3aWxsIHRocm93IGFuIGVhc2llci10by11bmRlcnN0YW5kLFxuICogZWFzaWVyLXRvLWRlYnVnIGV4Y2VwdGlvbiB3aXRoIGEgY2xlYXIgZXJyb3JzIG1lc3NhZ2UgbWVzc2FnZSBleHBsYWluaW5nIHRoZVxuICogcHJvYmxlbS4gKEluc3RlYWQgb2YgYSBjb25mdXNpbmcgZXhjZXB0aW9uIHRocm93biBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uXG4gKiBvZiB0aGUgYHZhbHVlYCBvYmplY3QpLlxuICovXG4vLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuZnVuY3Rpb24gdHlwZU5hbWUodmFsdWUpIHtcbiAge1xuICAgIC8vIHRvU3RyaW5nVGFnIGlzIG5lZWRlZCBmb3IgbmFtZXNwYWNlZCB0eXBlcyBsaWtlIFRlbXBvcmFsLkluc3RhbnRcbiAgICB2YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZztcbiAgICB2YXIgdHlwZSA9IGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JztcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxufSAvLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuXG5cbmZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gIHtcbiAgICB0cnkge1xuICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQnc1xuICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LFxuICAvLyBET00gYXR0cmlidXRlLCBDU1MgcHJvcGVydHksIHN0cmluZyByZWYsIGV0Yy4pIGFuZCB3aGVuIFJlYWN0IHRyaWVkIHRvXG4gIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuICAvL1xuICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZXMgdGhhdCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIGFyZSBgU3ltYm9sYCBpbnN0YW5jZXNcbiAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGFcbiAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzXG4gIC8vIGV4Y2VwdGlvbi4gKExpYnJhcnkgYXV0aG9ycyBkbyB0aGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyBidWlsdC1pblxuICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b21cbiAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLilcbiAgLy9cbiAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuXG4gIC8vXG4gIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuXG4gIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dFxuICAvLyB0aGF0IHNob3dzIHRoZSB0eXBlIChTeW1ib2wsIFRlbXBvcmFsLlBsYWluRGF0ZSwgZXRjLikgdGhhdCBjYXVzZWQgdGhlXG4gIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHNcbiAgLy8gYW5jZXN0b3IgY29tcG9uZW50cyB3aGVyZSB0aGUgZXhjZXB0aW9uIGhhcHBlbmVkLlxuICAvL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGF0dHJpYnV0ZU5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBhdHRyaWJ1dGUgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgYXR0cmlidXRlTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrUHJvcFN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIHByb3AgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgcHJvcE5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tDU1NQcm9wZXJ0eVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIENTUyBwcm9wZXJ0eSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBwcm9wTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0h0bWxTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBIVE1MIG1hcmt1cCB1c2VzIGEgdmFsdWUgb2YgdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdGb3JtIGZpZWxkIHZhbHVlcyAodmFsdWUsIGNoZWNrZWQsIGRlZmF1bHRWYWx1ZSwgb3IgZGVmYXVsdENoZWNrZWQgcHJvcHMpJyArICcgbXVzdCBiZSBzdHJpbmdzLCBub3QgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG4vLyBBIHJlc2VydmVkIGF0dHJpYnV0ZS5cbi8vIEl0IGlzIGhhbmRsZWQgYnkgUmVhY3Qgc2VwYXJhdGVseSBhbmQgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cbnZhciBSRVNFUlZFRCA9IDA7IC8vIEEgc2ltcGxlIHN0cmluZyBhdHRyaWJ1dGUuXG4vLyBBdHRyaWJ1dGVzIHRoYXQgYXJlbid0IGluIHRoZSBmaWx0ZXIgYXJlIHByZXN1bWVkIHRvIGhhdmUgdGhpcyB0eXBlLlxuXG52YXIgU1RSSU5HID0gMTsgLy8gQSBzdHJpbmcgYXR0cmlidXRlIHRoYXQgYWNjZXB0cyBib29sZWFucyBpbiBSZWFjdC4gSW4gSFRNTCwgdGhlc2UgYXJlIGNhbGxlZFxuLy8gXCJlbnVtZXJhdGVkXCIgYXR0cmlidXRlcyB3aXRoIFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIgYXMgcG9zc2libGUgdmFsdWVzLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJ0cnVlXCIgc3RyaW5nLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIHNldCB0byBhIFwiZmFsc2VcIiBzdHJpbmcuXG5cbnZhciBCT09MRUFOSVNIX1NUUklORyA9IDI7IC8vIEEgcmVhbCBib29sZWFuIGF0dHJpYnV0ZS5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHByZXNlbnQgKHNldCBlaXRoZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIGl0cyBuYW1lKS5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBvbWl0dGVkLlxuXG52YXIgQk9PTEVBTiA9IDM7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZmxhZyBhcyB3ZWxsIGFzIHdpdGggYSB2YWx1ZS5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHByZXNlbnQgKHNldCBlaXRoZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIGl0cyBuYW1lKS5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBvbWl0dGVkLlxuLy8gRm9yIGFueSBvdGhlciB2YWx1ZSwgc2hvdWxkIGJlIHByZXNlbnQgd2l0aCB0aGF0IHZhbHVlLlxuXG52YXIgT1ZFUkxPQURFRF9CT09MRUFOID0gNDsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgTlVNRVJJQyA9IDU7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIHBvc2l0aXZlIG51bWVyaWMuXG4vLyBXaGVuIGZhbHN5LCBpdCBzaG91bGQgYmUgcmVtb3ZlZC5cblxudmFyIFBPU0lUSVZFX05VTUVSSUMgPSA2O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG52YXIgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiA9IFwiOkEtWl9hLXpcXFxcdTAwQzAtXFxcXHUwMEQ2XFxcXHUwMEQ4LVxcXFx1MDBGNlxcXFx1MDBGOC1cXFxcdTAyRkZcXFxcdTAzNzAtXFxcXHUwMzdEXFxcXHUwMzdGLVxcXFx1MUZGRlxcXFx1MjAwQy1cXFxcdTIwMERcXFxcdTIwNzAtXFxcXHUyMThGXFxcXHUyQzAwLVxcXFx1MkZFRlxcXFx1MzAwMS1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZGRFwiO1xuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuICovXG5cbnZhciBBVFRSSUJVVEVfTkFNRV9DSEFSID0gQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArIFwiXFxcXC0uMC05XFxcXHUwMEI3XFxcXHUwMzAwLVxcXFx1MDM2RlxcXFx1MjAzRi1cXFxcdTIwNDBcIjtcbnZhciBWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWCA9IG5ldyBSZWdFeHAoJ15bJyArIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyAnXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG52YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG5mdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblxuICB7XG4gICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICByZXR1cm4gcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiAobmFtZVswXSA9PT0gJ28nIHx8IG5hbWVbMF0gPT09ICdPJykgJiYgKG5hbWVbMV0gPT09ICduJyB8fCBuYW1lWzFdID09PSAnTicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOiAvLyAkRmxvd0lzc3VlIHN5bWJvbCBpcyBwZXJmZWN0bHkgdmFsaWQgaGVyZVxuXG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICB7XG4gICAgICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SW5mby5hY2NlcHRzQm9vbGVhbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZWZpeCA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICE9PSAnZGF0YS0nICYmIHByZWZpeCAhPT0gJ2FyaWEtJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcblxuICAgIHN3aXRjaCAocHJvcGVydHlJbmZvLnR5cGUpIHtcbiAgICAgIGNhc2UgQk9PTEVBTjpcbiAgICAgICAgcmV0dXJuICF2YWx1ZTtcblxuICAgICAgY2FzZSBPVkVSTE9BREVEX0JPT0xFQU46XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gZmFsc2U7XG5cbiAgICAgIGNhc2UgTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKTtcblxuICAgICAgY2FzZSBQT1NJVElWRV9OVU1FUklDOlxuICAgICAgICByZXR1cm4gaXNOYU4odmFsdWUpIHx8IHZhbHVlIDwgMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXRQcm9wZXJ0eUluZm8obmFtZSkge1xuICByZXR1cm4gcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHByb3BlcnRpZXNbbmFtZV0gOiBudWxsO1xufVxuXG5mdW5jdGlvbiBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgdHlwZSwgbXVzdFVzZVByb3BlcnR5LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVOYW1lc3BhY2UsIHNhbml0aXplVVJMLCByZW1vdmVFbXB0eVN0cmluZykge1xuICB0aGlzLmFjY2VwdHNCb29sZWFucyA9IHR5cGUgPT09IEJPT0xFQU5JU0hfU1RSSU5HIHx8IHR5cGUgPT09IEJPT0xFQU4gfHwgdHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOO1xuICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lO1xuICB0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZSA9IGF0dHJpYnV0ZU5hbWVzcGFjZTtcbiAgdGhpcy5tdXN0VXNlUHJvcGVydHkgPSBtdXN0VXNlUHJvcGVydHk7XG4gIHRoaXMucHJvcGVydHlOYW1lID0gbmFtZTtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5zYW5pdGl6ZVVSTCA9IHNhbml0aXplVVJMO1xuICB0aGlzLnJlbW92ZUVtcHR5U3RyaW5nID0gcmVtb3ZlRW1wdHlTdHJpbmc7XG59IC8vIFdoZW4gYWRkaW5nIGF0dHJpYnV0ZXMgdG8gdGhpcyBsaXN0LCBiZSBzdXJlIHRvIGFsc28gYWRkIHRoZW0gdG9cbi8vIHRoZSBgcG9zc2libGVTdGFuZGFyZE5hbWVzYCBtb2R1bGUgdG8gZW5zdXJlIGNhc2luZyBhbmQgaW5jb3JyZWN0XG4vLyBuYW1lIHdhcm5pbmdzLlxuXG5cbnZhciBwcm9wZXJ0aWVzID0ge307IC8vIFRoZXNlIHByb3BzIGFyZSByZXNlcnZlZCBieSBSZWFjdC4gVGhleSBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxuXG52YXIgcmVzZXJ2ZWRQcm9wcyA9IFsnY2hpbGRyZW4nLCAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLCAvLyBUT0RPOiBUaGlzIHByZXZlbnRzIHRoZSBhc3NpZ25tZW50IG9mIGRlZmF1bHRWYWx1ZSB0byByZWd1bGFyXG4vLyBlbGVtZW50cyAobm90IGp1c3QgaW5wdXRzKS4gTm93IHRoYXQgUmVhY3RET01JbnB1dCBhc3NpZ25zIHRvIHRoZVxuLy8gZGVmYXVsdFZhbHVlIHByb3BlcnR5IC0tIGRvIHdlIG5lZWQgdGhpcz9cbidkZWZhdWx0VmFsdWUnLCAnZGVmYXVsdENoZWNrZWQnLCAnaW5uZXJIVE1MJywgJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZycsICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLCAnc3R5bGUnXTtcblxucmVzZXJ2ZWRQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFJFU0VSVkVELCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gQSBmZXcgUmVhY3Qgc3RyaW5nIGF0dHJpYnV0ZXMgaGF2ZSBhIGRpZmZlcmVudCBuYW1lLlxuLy8gVGhpcyBpcyBhIG1hcHBpbmcgZnJvbSBSZWFjdCBwcm9wIG5hbWVzIHRvIHRoZSBhdHRyaWJ1dGUgbmFtZXMuXG5cbltbJ2FjY2VwdENoYXJzZXQnLCAnYWNjZXB0LWNoYXJzZXQnXSwgWydjbGFzc05hbWUnLCAnY2xhc3MnXSwgWydodG1sRm9yJywgJ2ZvciddLCBbJ2h0dHBFcXVpdicsICdodHRwLWVxdWl2J11dLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyIG5hbWUgPSBfcmVmWzBdLFxuICAgICAgYXR0cmlidXRlTmFtZSA9IF9yZWZbMV07XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBcImVudW1lcmF0ZWRcIiBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG5cblsnY29udGVudEVkaXRhYmxlJywgJ2RyYWdnYWJsZScsICdzcGVsbENoZWNrJywgJ3ZhbHVlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOSVNIX1NUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIFwiZW51bWVyYXRlZFwiIFNWRyBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIuXG4vLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5XG4vLyB0aGVzZSBhcmVuJ3QgYm9vbGVhbiBhdHRyaWJ1dGVzICh0aGV5IGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MpLlxuLy8gU2luY2UgdGhlc2UgYXJlIFNWRyBhdHRyaWJ1dGVzLCB0aGVpciBhdHRyaWJ1dGUgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuXG5bJ2F1dG9SZXZlcnNlJywgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLCAnZm9jdXNhYmxlJywgJ3ByZXNlcnZlQWxwaGEnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYm9vbGVhbiBhdHRyaWJ1dGVzLlxuXG5bJ2FsbG93RnVsbFNjcmVlbicsICdhc3luYycsIC8vIE5vdGU6IHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyB3cml0dGVuIHRvIHRoZSBET01cbi8vIG9uIHRoZSBjbGllbnQgc2lkZSBiZWNhdXNlIHRoZSBicm93c2VycyBhcmUgaW5jb25zaXN0ZW50LiBJbnN0ZWFkIHdlIGNhbGwgZm9jdXMoKS5cbidhdXRvRm9jdXMnLCAnYXV0b1BsYXknLCAnY29udHJvbHMnLCAnZGVmYXVsdCcsICdkZWZlcicsICdkaXNhYmxlZCcsICdkaXNhYmxlUGljdHVyZUluUGljdHVyZScsICdkaXNhYmxlUmVtb3RlUGxheWJhY2snLCAnZm9ybU5vVmFsaWRhdGUnLCAnaGlkZGVuJywgJ2xvb3AnLCAnbm9Nb2R1bGUnLCAnbm9WYWxpZGF0ZScsICdvcGVuJywgJ3BsYXlzSW5saW5lJywgJ3JlYWRPbmx5JywgJ3JlcXVpcmVkJywgJ3JldmVyc2VkJywgJ3Njb3BlZCcsICdzZWFtbGVzcycsIC8vIE1pY3JvZGF0YVxuJ2l0ZW1TY29wZSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIHRoZSBmZXcgUmVhY3QgcHJvcHMgdGhhdCB3ZSBzZXQgYXMgRE9NIHByb3BlcnRpZXNcbi8vIHJhdGhlciB0aGFuIGF0dHJpYnV0ZXMuIFRoZXNlIGFyZSBhbGwgYm9vbGVhbnMuXG5cblsnY2hlY2tlZCcsIC8vIE5vdGU6IGBvcHRpb24uc2VsZWN0ZWRgIGlzIG5vdCB1cGRhdGVkIGlmIGBzZWxlY3QubXVsdGlwbGVgIGlzXG4vLyBkaXNhYmxlZCB3aXRoIGByZW1vdmVBdHRyaWJ1dGVgLiBXZSBoYXZlIHNwZWNpYWwgbG9naWMgZm9yIGhhbmRsaW5nIHRoaXMuXG4nbXVsdGlwbGUnLCAnbXV0ZWQnLCAnc2VsZWN0ZWQnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU4sIHRydWUsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBhcmUgXCJvdmVybG9hZGVkIGJvb2xlYW5zXCI6IHRoZXkgYmVoYXZlIGxpa2Vcbi8vIGJvb2xlYW5zLCBidXQgY2FuIGFsc28gYWNjZXB0IGEgc3RyaW5nIHZhbHVlLlxuXG5bJ2NhcHR1cmUnLCAnZG93bmxvYWQnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIE9WRVJMT0FERURfQk9PTEVBTiwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGJlIHBvc2l0aXZlIG51bWJlcnMuXG5cblsnY29scycsICdyb3dzJywgJ3NpemUnLCAnc3BhbicgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUE9TSVRJVkVfTlVNRVJJQywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGJlIG51bWJlcnMuXG5cblsncm93U3BhbicsICdzdGFydCddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgTlVNRVJJQywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTtcbnZhciBDQU1FTElaRSA9IC9bXFwtXFw6XShbYS16XSkvZztcblxudmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgcmV0dXJuIHRva2VuWzFdLnRvVXBwZXJDYXNlKCk7XG59OyAvLyBUaGlzIGlzIGEgbGlzdCBvZiBhbGwgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBuZWVkIHNwZWNpYWwgY2FzaW5nLCBuYW1lc3BhY2luZyxcbi8vIG9yIGJvb2xlYW4gdmFsdWUgYXNzaWdubWVudC4gUmVndWxhciBhdHRyaWJ1dGVzIHRoYXQganVzdCBhY2NlcHQgc3RyaW5nc1xuLy8gYW5kIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXJlIG9taXR0ZWQsIGp1c3QgbGlrZSBpbiB0aGUgSFRNTCBhdHRyaWJ1dGUgZmlsdGVyLlxuLy8gU29tZSBvZiB0aGVzZSBhdHRyaWJ1dGVzIGNhbiBiZSBoYXJkIHRvIGZpbmQuIFRoaXMgbGlzdCB3YXMgY3JlYXRlZCBieVxuLy8gc2NyYXBpbmcgdGhlIE1ETiBkb2N1bWVudGF0aW9uLlxuXG5cblsnYWNjZW50LWhlaWdodCcsICdhbGlnbm1lbnQtYmFzZWxpbmUnLCAnYXJhYmljLWZvcm0nLCAnYmFzZWxpbmUtc2hpZnQnLCAnY2FwLWhlaWdodCcsICdjbGlwLXBhdGgnLCAnY2xpcC1ydWxlJywgJ2NvbG9yLWludGVycG9sYXRpb24nLCAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJywgJ2NvbG9yLXByb2ZpbGUnLCAnY29sb3ItcmVuZGVyaW5nJywgJ2RvbWluYW50LWJhc2VsaW5lJywgJ2VuYWJsZS1iYWNrZ3JvdW5kJywgJ2ZpbGwtb3BhY2l0eScsICdmaWxsLXJ1bGUnLCAnZmxvb2QtY29sb3InLCAnZmxvb2Qtb3BhY2l0eScsICdmb250LWZhbWlseScsICdmb250LXNpemUnLCAnZm9udC1zaXplLWFkanVzdCcsICdmb250LXN0cmV0Y2gnLCAnZm9udC1zdHlsZScsICdmb250LXZhcmlhbnQnLCAnZm9udC13ZWlnaHQnLCAnZ2x5cGgtbmFtZScsICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJywgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJywgJ2hvcml6LWFkdi14JywgJ2hvcml6LW9yaWdpbi14JywgJ2ltYWdlLXJlbmRlcmluZycsICdsZXR0ZXItc3BhY2luZycsICdsaWdodGluZy1jb2xvcicsICdtYXJrZXItZW5kJywgJ21hcmtlci1taWQnLCAnbWFya2VyLXN0YXJ0JywgJ292ZXJsaW5lLXBvc2l0aW9uJywgJ292ZXJsaW5lLXRoaWNrbmVzcycsICdwYWludC1vcmRlcicsICdwYW5vc2UtMScsICdwb2ludGVyLWV2ZW50cycsICdyZW5kZXJpbmctaW50ZW50JywgJ3NoYXBlLXJlbmRlcmluZycsICdzdG9wLWNvbG9yJywgJ3N0b3Atb3BhY2l0eScsICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJywgJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJywgJ3N0cm9rZS1kYXNoYXJyYXknLCAnc3Ryb2tlLWRhc2hvZmZzZXQnLCAnc3Ryb2tlLWxpbmVjYXAnLCAnc3Ryb2tlLWxpbmVqb2luJywgJ3N0cm9rZS1taXRlcmxpbWl0JywgJ3N0cm9rZS1vcGFjaXR5JywgJ3N0cm9rZS13aWR0aCcsICd0ZXh0LWFuY2hvcicsICd0ZXh0LWRlY29yYXRpb24nLCAndGV4dC1yZW5kZXJpbmcnLCAndW5kZXJsaW5lLXBvc2l0aW9uJywgJ3VuZGVybGluZS10aGlja25lc3MnLCAndW5pY29kZS1iaWRpJywgJ3VuaWNvZGUtcmFuZ2UnLCAndW5pdHMtcGVyLWVtJywgJ3YtYWxwaGFiZXRpYycsICd2LWhhbmdpbmcnLCAndi1pZGVvZ3JhcGhpYycsICd2LW1hdGhlbWF0aWNhbCcsICd2ZWN0b3ItZWZmZWN0JywgJ3ZlcnQtYWR2LXknLCAndmVydC1vcmlnaW4teCcsICd2ZXJ0LW9yaWdpbi15JywgJ3dvcmQtc3BhY2luZycsICd3cml0aW5nLW1vZGUnLCAneG1sbnM6eGxpbmsnLCAneC1oZWlnaHQnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bGluayBuYW1lc3BhY2UuXG5cblsneGxpbms6YWN0dWF0ZScsICd4bGluazphcmNyb2xlJywgJ3hsaW5rOnJvbGUnLCAneGxpbms6c2hvdycsICd4bGluazp0aXRsZScsICd4bGluazp0eXBlJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhtbCBuYW1lc3BhY2UuXG5cblsneG1sOmJhc2UnLCAneG1sOmxhbmcnLCAneG1sOnNwYWNlJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJywgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhdHRyaWJ1dGUgZXhpc3RzIGJvdGggaW4gSFRNTCBhbmQgU1ZHLlxuLy8gVGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGNhc2Utc2Vuc2l0aXZlIGluIFNWRyBzbyB3ZSBjYW4ndCBqdXN0IHVzZVxuLy8gdGhlIFJlYWN0IG5hbWUgbGlrZSB3ZSBkbyBmb3IgYXR0cmlidXRlcyB0aGF0IGV4aXN0IG9ubHkgaW4gSFRNTC5cblxuWyd0YWJJbmRleCcsICdjcm9zc09yaWdpbiddLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgcHJvcGVydGllc1thdHRyaWJ1dGVOYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoYXR0cmlidXRlTmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhdHRyaWJ1dGVzIGFjY2VwdCBVUkxzLiBUaGVzZSBtdXN0IG5vdCBhbGxvdyBqYXZhc2NyaXB0OiBVUkxTLlxuLy8gVGhlc2Ugd2lsbCBhbHNvIG5lZWQgdG8gYWNjZXB0IFRydXN0ZWQgVHlwZXMgb2JqZWN0IGluIHRoZSBmdXR1cmUuXG5cbnZhciB4bGlua0hyZWYgPSAneGxpbmtIcmVmJztcbnByb3BlcnRpZXNbeGxpbmtIcmVmXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoJ3hsaW5rSHJlZicsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuJ3hsaW5rOmhyZWYnLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIHRydWUsIC8vIHNhbml0aXplVVJMXG5mYWxzZSk7XG5bJ3NyYycsICdocmVmJywgJ2FjdGlvbicsICdmb3JtQWN0aW9uJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICBwcm9wZXJ0aWVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChhdHRyaWJ1dGVOYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICB0cnVlLCAvLyBzYW5pdGl6ZVVSTFxuICB0cnVlKTtcbn0pO1xuXG4vLyBhbmQgYW55IG5ld2xpbmUgb3IgdGFiIGFyZSBmaWx0ZXJlZCBvdXQgYXMgaWYgdGhleSdyZSBub3QgcGFydCBvZiB0aGUgVVJMLlxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmwtcGFyc2luZ1xuLy8gVGFiIG9yIG5ld2xpbmUgYXJlIGRlZmluZWQgYXMgXFxyXFxuXFx0OlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2FzY2lpLXRhYi1vci1uZXdsaW5lXG4vLyBBIEMwIGNvbnRyb2wgaXMgYSBjb2RlIHBvaW50IGluIHRoZSByYW5nZSBcXHUwMDAwIE5VTEwgdG8gXFx1MDAxRlxuLy8gSU5GT1JNQVRJT04gU0VQQVJBVE9SIE9ORSwgaW5jbHVzaXZlOlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2MwLWNvbnRyb2wtb3Itc3BhY2VcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG52YXIgaXNKYXZhU2NyaXB0UHJvdG9jb2wgPSAvXltcXHUwMDAwLVxcdTAwMUYgXSpqW1xcclxcblxcdF0qYVtcXHJcXG5cXHRdKnZbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qc1tcXHJcXG5cXHRdKmNbXFxyXFxuXFx0XSpyW1xcclxcblxcdF0qaVtcXHJcXG5cXHRdKnBbXFxyXFxuXFx0XSp0W1xcclxcblxcdF0qXFw6L2k7XG52YXIgZGlkV2FybiA9IGZhbHNlO1xuXG5mdW5jdGlvbiBzYW5pdGl6ZVVSTCh1cmwpIHtcbiAge1xuICAgIGlmICghZGlkV2FybiAmJiBpc0phdmFTY3JpcHRQcm90b2NvbC50ZXN0KHVybCkpIHtcbiAgICAgIGRpZFdhcm4gPSB0cnVlO1xuXG4gICAgICBlcnJvcignQSBmdXR1cmUgdmVyc2lvbiBvZiBSZWFjdCB3aWxsIGJsb2NrIGphdmFzY3JpcHQ6IFVSTHMgYXMgYSBzZWN1cml0eSBwcmVjYXV0aW9uLiAnICsgJ1VzZSBldmVudCBoYW5kbGVycyBpbnN0ZWFkIGlmIHlvdSBjYW4uIElmIHlvdSBuZWVkIHRvIGdlbmVyYXRlIHVuc2FmZSBIVE1MIHRyeSAnICsgJ3VzaW5nIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGluc3RlYWQuIFJlYWN0IHdhcyBwYXNzZWQgJXMuJywgSlNPTi5zdHJpbmdpZnkodXJsKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuIE9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICogVGhlIFwiZXhwZWN0ZWRcIiBhcmd1bWVudCBpcyB1c2VkIGFzIGEgaGludCBvZiB3aGF0IHRoZSBleHBlY3RlZCB2YWx1ZSBpcy5cbiAqIFNvbWUgcHJvcGVydGllcyBoYXZlIG11bHRpcGxlIGVxdWl2YWxlbnQgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8pIHtcbiAge1xuICAgIGlmIChwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5KSB7XG4gICAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcbiAgICAgIHJldHVybiBub2RlW3Byb3BlcnR5TmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgY2hlY2sgcHJvdGVjdHMgbXVsdGlwbGUgdXNlcyBvZiBgZXhwZWN0ZWRgLCB3aGljaCBpcyB3aHkgdGhlXG4gICAgICAvLyByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvbiBydWxlIGlzIGRpc2FibGVkIGluIHNldmVyYWwgc3BvdHNcbiAgICAgIC8vIGJlbG93LlxuICAgICAge1xuICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKGV4cGVjdGVkLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCBwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBmdWxseSBkaXNhYmxlZCBqYXZhc2NyaXB0OiBVUkxzLCBhbmQgaWZcbiAgICAgICAgLy8gdGhlIGh5ZHJhdGlvbiBpcyBzdWNjZXNzZnVsIG9mIGEgamF2YXNjcmlwdDogVVJMLCB3ZVxuICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHdhcm4gb24gdGhlIGNsaWVudC5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICAgIHNhbml0aXplVVJMKCcnICsgZXhwZWN0ZWQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lO1xuICAgICAgdmFyIHN0cmluZ1ZhbHVlID0gbnVsbDtcblxuICAgICAgaWYgKHByb3BlcnR5SW5mby50eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4pIHtcbiAgICAgICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICAgIC8vIFdlIGhhZCBhbiBhdHRyaWJ1dGUgYnV0IHNob3VsZG4ndCBoYXZlIGhhZCBvbmUsIHNvIHJlYWQgaXRcbiAgICAgICAgICAvLyBmb3IgdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mby50eXBlID09PSBCT09MRUFOKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyB3YXMgYSBib29sZWFuLCBpdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSB2YWx1ZSBpc1xuICAgICAgICAgIC8vIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZSBpdCBpcyB0aGUgc2FtZSBhcyB0aGUgZXhwZWN0ZWQuXG4gICAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgICB9IC8vIEV2ZW4gaWYgdGhpcyBwcm9wZXJ0eSB1c2VzIGEgbmFtZXNwYWNlIHdlIHVzZSBnZXRBdHRyaWJ1dGVcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSBhc3N1bWUgaXRzIG5hbWVzcGFjZWQgbmFtZSBpcyB0aGUgc2FtZSBhcyBvdXIgY29uZmlnLlxuICAgICAgICAvLyBUbyB1c2UgZ2V0QXR0cmlidXRlTlMgd2UgbmVlZCB0aGUgbG9jYWwgbmFtZSB3aGljaCB3ZSBkb24ndCBoYXZlXG4gICAgICAgIC8vIGluIG91ciBjb25maWcgYXRtLlxuXG5cbiAgICAgICAgc3RyaW5nVmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlID09PSBudWxsID8gZXhwZWN0ZWQgOiBzdHJpbmdWYWx1ZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICB9IGVsc2UgaWYgKHN0cmluZ1ZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBmb3IgYSBhdHRyaWJ1dGUgb24gYSBub2RlLiBPbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB1c2VkIGFzIGEgaGludCBvZiB3aGF0IHRoZSBleHBlY3RlZCB2YWx1ZSBpcy4gU29tZVxuICogYXR0cmlidXRlcyBoYXZlIG11bHRpcGxlIGVxdWl2YWxlbnQgdmFsdWVzLlxuICovXG5cbmZ1bmN0aW9uIGdldFZhbHVlRm9yQXR0cmlidXRlKG5vZGUsIG5hbWUsIGV4cGVjdGVkLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICB7XG4gICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBudWxsO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuXG4gICAge1xuICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCB2YWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcblxuICBpZiAoc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICB2YWx1ZSA9IG51bGw7XG4gIH1cblxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZyB8fCBwcm9wZXJ0eUluZm8gPT09IG51bGwpIHtcbiAgICBpZiAoaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkge1xuICAgICAgdmFyIF9hdHRyaWJ1dGVOYW1lID0gbmFtZTtcblxuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKF9hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHtcbiAgICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKF9hdHRyaWJ1dGVOYW1lLCAgJycgKyB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG11c3RVc2VQcm9wZXJ0eSA9IHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHk7XG5cbiAgaWYgKG11c3RVc2VQcm9wZXJ0eSkge1xuICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB2YXIgdHlwZSA9IHByb3BlcnR5SW5mby50eXBlO1xuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdHlwZSA9PT0gQk9PTEVBTiA/IGZhbHNlIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnRyYXJ5IHRvIGBzZXRBdHRyaWJ1dGVgLCBvYmplY3QgcHJvcGVydGllcyBhcmUgcHJvcGVybHlcbiAgICAgIC8vIGB0b1N0cmluZ2BlZCBieSBJRTgvOS5cbiAgICAgIG5vZGVbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSAvLyBUaGUgcmVzdCBhcmUgdHJlYXRlZCBhcyBhdHRyaWJ1dGVzIHdpdGggc3BlY2lhbCBjYXNlcy5cblxuXG4gIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUsXG4gICAgICBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZXNwYWNlO1xuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBfdHlwZSA9IHByb3BlcnR5SW5mby50eXBlO1xuICAgIHZhciBhdHRyaWJ1dGVWYWx1ZTtcblxuICAgIGlmIChfdHlwZSA9PT0gQk9PTEVBTiB8fCBfdHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOICYmIHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAvLyBJZiBhdHRyaWJ1dGUgdHlwZSBpcyBib29sZWFuLCB3ZSBrbm93IGZvciBzdXJlIGl0IHdvbid0IGJlIGFuIGV4ZWN1dGlvbiBzaW5rXG4gICAgICAvLyBhbmQgd2Ugd29uJ3QgcmVxdWlyZSBUcnVzdGVkIFR5cGUgaGVyZS5cbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGBzZXRBdHRyaWJ1dGVgIHdpdGggb2JqZWN0cyBiZWNvbWVzIG9ubHkgYFtvYmplY3RdYCBpbiBJRTgvOSxcbiAgICAgIC8vICgnJyArIHZhbHVlKSBtYWtlcyBpdCBvdXRwdXQgdGhlIGNvcnJlY3QgdG9TdHJpbmcoKS12YWx1ZS5cbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnNhbml0aXplVVJMKSB7XG4gICAgICAgIHNhbml0aXplVVJMKGF0dHJpYnV0ZVZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhdHRyaWJ1dGVOYW1lc3BhY2UpIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlTlMoYXR0cmlidXRlTmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5Jyk7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJyk7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbnZhciBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG52YXIgUkVBQ1RfQ0FDSEVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNhY2hlJyk7XG52YXIgUkVBQ1RfVFJBQ0lOR19NQVJLRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnRyYWNpbmdfbWFya2VyJyk7XG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDsgLy8gU2V0IHRoZSBkaXNwYXRjaGVyIGluIERFViBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgY2FsbCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uXG4gICAgLy8gZm9yIHdhcm5pbmdzLlxuXG4gICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUNsYXNzQ29tcG9uZW50RnJhbWUoY3Rvciwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShjdG9yLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaWJlcihmaWJlcikge1xuICB2YXIgb3duZXIgPSAgZmliZXIuX2RlYnVnT3duZXIgPyBmaWJlci5fZGVidWdPd25lci50eXBlIDogbnVsbCA7XG4gIHZhciBzb3VyY2UgPSAgZmliZXIuX2RlYnVnU291cmNlIDtcblxuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnTGF6eScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUucmVuZGVyKTtcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVDbGFzc0NvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2Qod29ya0luUHJvZ3Jlc3MpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICBkbyB7XG4gICAgICBpbmZvICs9IGRlc2NyaWJlRmliZXIobm9kZSk7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSk7XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfSBjYXRjaCAoeCkge1xuICAgIHJldHVybiAnXFxuRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogJyArIHgubWVzc2FnZSArICdcXG4nICsgeC5zdGFjaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZSQxKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lIHx8IChmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWUpO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCBzaGFyZWQvZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUkMSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikge1xuICB2YXIgdGFnID0gZmliZXIudGFnLFxuICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdDYWNoZSc7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZSQxKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAgcmV0dXJuICdEZWh5ZHJhdGVkRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lJDEodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAvLyBIb3N0IGNvbXBvbmVudCB0eXBlIGlzIHRoZSBkaXNwbGF5IG5hbWUgKGUuZy4gXCJkaXZcIiwgXCJWaWV3XCIpXG4gICAgICByZXR1cm4gdHlwZTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gJ1Jvb3QnO1xuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHJldHVybiAnVGV4dCc7XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICAvLyBOYW1lIGNvbWVzIGZyb20gdGhlIHR5cGUgaW4gdGhpcyBjYXNlOyB3ZSBkb24ndCBoYXZlIGEgdGFnLlxuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgIGNhc2UgTW9kZTpcbiAgICAgIGlmICh0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFKSB7XG4gICAgICAgIC8vIERvbid0IGJlIGxlc3Mgc3BlY2lmaWMgdGhhbiBzaGFyZWQvZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlXG4gICAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnTW9kZSc7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnT2Zmc2NyZWVuJztcblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1Njb3BlJztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdUcmFjaW5nTWFya2VyJztcbiAgICAvLyBUaGUgZGlzcGxheSBuYW1lIGZvciB0aGlzIHRhZ3MgY29tZSBmcm9tIHRoZSB1c2VyLXByb3ZpZGVkIHR5cGU6XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xudmFyIGN1cnJlbnQgPSBudWxsO1xudmFyIGlzUmVuZGVyaW5nID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgb3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIHR5cGVvZiBvd25lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldigpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSAvLyBTYWZlIGJlY2F1c2UgaWYgY3VycmVudCBmaWJlciBleGlzdHMsIHdlIGFyZSByZWNvbmNpbGluZyxcbiAgICAvLyBhbmQgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgd29yay1pbi1wcm9ncmVzcyB2ZXJzaW9uLlxuXG5cbiAgICByZXR1cm4gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKGN1cnJlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0Q3VycmVudEZpYmVyKCkge1xuICB7XG4gICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuICAgIGN1cnJlbnQgPSBudWxsO1xuICAgIGlzUmVuZGVyaW5nID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRGaWJlcihmaWJlcikge1xuICB7XG4gICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBmaWJlciA9PT0gbnVsbCA/IG51bGwgOiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2O1xuICAgIGN1cnJlbnQgPSBmaWJlcjtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXIoKSB7XG4gIHtcbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNSZW5kZXJpbmcocmVuZGVyaW5nKSB7XG4gIHtcbiAgICBpc1JlbmRlcmluZyA9IHJlbmRlcmluZztcbiAgfVxufVxuXG4vLyBGbG93IGRvZXMgbm90IGFsbG93IHN0cmluZyBjb25jYXRlbmF0aW9uIG9mIG1vc3Qgbm9uLXN0cmluZyB0eXBlcy4gVG8gd29ya1xuLy8gYXJvdW5kIHRoaXMgbGltaXRhdGlvbiwgd2UgdXNlIGFuIG9wYXF1ZSB0eXBlIHRoYXQgY2FuIG9ubHkgYmUgb2J0YWluZWQgYnlcbi8vIHBhc3NpbmcgdGhlIHZhbHVlIHRocm91Z2ggZ2V0VG9TdHJpbmdWYWx1ZSBmaXJzdC5cbmZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIFRoZSBjb2VyY2lvbiBzYWZldHkgY2hlY2sgaXMgcGVyZm9ybWVkIGluIGdldFRvU3RyaW5nVmFsdWUoKS5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkge1xuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGZ1bmN0aW9uLCBzeW1ib2wgYXJlIGFzc2lnbmVkIGFzIGVtcHR5IHN0cmluZ3NcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG52YXIgaGFzUmVhZE9ubHlWYWx1ZSA9IHtcbiAgYnV0dG9uOiB0cnVlLFxuICBjaGVja2JveDogdHJ1ZSxcbiAgaW1hZ2U6IHRydWUsXG4gIGhpZGRlbjogdHJ1ZSxcbiAgcmFkaW86IHRydWUsXG4gIHJlc2V0OiB0cnVlLFxuICBzdWJtaXQ6IHRydWVcbn07XG5mdW5jdGlvbiBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKHRhZ05hbWUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoIShoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8IHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLm9uSW5wdXQgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMudmFsdWUgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cblxuICAgIGlmICghKHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmNoZWNrZWQgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDaGVja2FibGUoZWxlbSkge1xuICB2YXIgdHlwZSA9IGVsZW0udHlwZTtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrZXIobm9kZSkge1xuICByZXR1cm4gbm9kZS5fdmFsdWVUcmFja2VyO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hUcmFja2VyKG5vZGUpIHtcbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVGcm9tTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZSA9ICcnO1xuXG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmIChpc0NoZWNrYWJsZShub2RlKSkge1xuICAgIHZhbHVlID0gbm9kZS5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRyYWNrVmFsdWVPbk5vZGUobm9kZSkge1xuICB2YXIgdmFsdWVGaWVsZCA9IGlzQ2hlY2thYmxlKG5vZGUpID8gJ2NoZWNrZWQnIDogJ3ZhbHVlJztcbiAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUuY29uc3RydWN0b3IucHJvdG90eXBlLCB2YWx1ZUZpZWxkKTtcblxuICB7XG4gICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKG5vZGVbdmFsdWVGaWVsZF0pO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRWYWx1ZSA9ICcnICsgbm9kZVt2YWx1ZUZpZWxkXTsgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWxcbiAgLy8gYW5kIGRvbid0IHRyYWNrIHZhbHVlIHdpbGwgY2F1c2Ugb3ZlciByZXBvcnRpbmcgb2YgY2hhbmdlcyxcbiAgLy8gYnV0IGl0J3MgYmV0dGVyIHRoZW4gYSBoYXJkIGZhaWx1cmVcbiAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKVxuXG4gIGlmIChub2RlLmhhc093blByb3BlcnR5KHZhbHVlRmllbGQpIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0LFxuICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIHNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICB9XG4gIH0pOyAvLyBXZSBjb3VsZCd2ZSBwYXNzZWQgdGhpcyB0aGUgZmlyc3QgdGltZVxuICAvLyBidXQgaXQgdHJpZ2dlcnMgYSBidWcgaW4gSUUxMSBhbmQgRWRnZSAxNC8xNS5cbiAgLy8gQ2FsbGluZyBkZWZpbmVQcm9wZXJ0eSgpIGFnYWluIHNob3VsZCBiZSBlcXVpdmFsZW50LlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExNzY4XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGVcbiAgfSk7XG4gIHZhciB0cmFja2VyID0ge1xuICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgIH0sXG4gICAgc2V0VmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgIH0sXG4gICAgc3RvcFRyYWNraW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXRhY2hUcmFja2VyKG5vZGUpO1xuICAgICAgZGVsZXRlIG5vZGVbdmFsdWVGaWVsZF07XG4gICAgfVxuICB9O1xuICByZXR1cm4gdHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2sobm9kZSkge1xuICBpZiAoZ2V0VHJhY2tlcihub2RlKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBUT0RPOiBPbmNlIGl0J3MganVzdCBGaWJlciB3ZSBjYW4gbW92ZSB0aGlzIHRvIG5vZGUuX3dyYXBwZXJTdGF0ZVxuXG5cbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gdHJhY2tWYWx1ZU9uTm9kZShub2RlKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG5vZGUpIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRyYWNrZXIgPSBnZXRUcmFja2VyKG5vZGUpOyAvLyBpZiB0aGVyZSBpcyBubyB0cmFja2VyIGF0IHRoaXMgcG9pbnQgaXQncyB1bmxpa2VseVxuICAvLyB0aGF0IHRyeWluZyBhZ2FpbiB3aWxsIHN1Y2NlZWRcblxuICBpZiAoIXRyYWNrZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBsYXN0VmFsdWUgPSB0cmFja2VyLmdldFZhbHVlKCk7XG4gIHZhciBuZXh0VmFsdWUgPSBnZXRWYWx1ZUZyb21Ob2RlKG5vZGUpO1xuXG4gIGlmIChuZXh0VmFsdWUgIT09IGxhc3RWYWx1ZSkge1xuICAgIHRyYWNrZXIuc2V0VmFsdWUobmV4dFZhbHVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudChkb2MpIHtcbiAgZG9jID0gZG9jIHx8ICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiB1bmRlZmluZWQpO1xuXG4gIGlmICh0eXBlb2YgZG9jID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jLmFjdGl2ZUVsZW1lbnQgfHwgZG9jLmJvZHk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZG9jLmJvZHk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gZmFsc2U7XG52YXIgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpc0NvbnRyb2xsZWQocHJvcHMpIHtcbiAgdmFyIHVzZXNDaGVja2VkID0gcHJvcHMudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBwcm9wcy50eXBlID09PSAncmFkaW8nO1xuICByZXR1cm4gdXNlc0NoZWNrZWQgPyBwcm9wcy5jaGVja2VkICE9IG51bGwgOiBwcm9wcy52YWx1ZSAhPSBudWxsO1xufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxpbnB1dD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyB0aGVzZSBvcHRpb25hbFxuICogcHJvcHM6IGBjaGVja2VkYCwgYHZhbHVlYCwgYGRlZmF1bHRDaGVja2VkYCwgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICpcbiAqIElmIGBjaGVja2VkYCBvciBgdmFsdWVgIGFyZSBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zXG4gKiB0aGF0IGFmZmVjdCB0aGUgY2hlY2tlZCBzdGF0ZSBvciB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiB0aGV5IGFyZSBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgbm90XG4gKiB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBwcm9wcyBtdXN0IGNoYW5nZSBpbiBvcmRlciBmb3JcbiAqIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCBhcyB1bmNoZWNrZWQgKG9yIGBkZWZhdWx0Q2hlY2tlZGApXG4gKiB3aXRoIGFuIGVtcHR5IHZhbHVlIChvciBgZGVmYXVsdFZhbHVlYCkuXG4gKlxuICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTIvV0QtaHRtbDUtMjAxMjEwMjUvdGhlLWlucHV0LWVsZW1lbnQuaHRtbFxuICovXG5cblxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuICB2YXIgaG9zdFByb3BzID0gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGRlZmF1bHRDaGVja2VkOiB1bmRlZmluZWQsXG4gICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGVja2VkOiBjaGVja2VkICE9IG51bGwgPyBjaGVja2VkIDogbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkXG4gIH0pO1xuICByZXR1cm4gaG9zdFByb3BzO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZShlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygnaW5wdXQnLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuY2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCBjaGVja2VkIGFuZCBkZWZhdWx0Q2hlY2tlZCBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgY2hlY2tlZCBwcm9wLCBvciB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7XG5cbiAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgPyAnJyA6IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIGluaXRpYWxDaGVja2VkOiBwcm9wcy5jaGVja2VkICE9IG51bGwgPyBwcm9wcy5jaGVja2VkIDogcHJvcHMuZGVmYXVsdENoZWNrZWQsXG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlICE9IG51bGwgPyBwcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZSksXG4gICAgY29udHJvbGxlZDogaXNDb250cm9sbGVkKHByb3BzKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlQ2hlY2tlZChlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZDtcblxuICBpZiAoY2hlY2tlZCAhPSBudWxsKSB7XG4gICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCAnY2hlY2tlZCcsIGNoZWNrZWQsIGZhbHNlKTtcbiAgfVxufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIHZhciBjb250cm9sbGVkID0gaXNDb250cm9sbGVkKHByb3BzKTtcblxuICAgIGlmICghbm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgY29udHJvbGxlZCAmJiAhZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGNoYW5naW5nIGFuIHVuY29udHJvbGxlZCBpbnB1dCB0byBiZSBjb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSB1bmRlZmluZWQgdG8gJyArICdhIGRlZmluZWQgdmFsdWUsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLl93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiAhY29udHJvbGxlZCAmJiAhZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGNoYW5naW5nIGEgY29udHJvbGxlZCBpbnB1dCB0byBiZSB1bmNvbnRyb2xsZWQuICcgKyAnVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IHRoZSB2YWx1ZSBjaGFuZ2luZyBmcm9tIGEgZGVmaW5lZCB0byAnICsgJ3VuZGVmaW5lZCwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ2hlY2tlZChlbGVtZW50LCBwcm9wcyk7XG4gIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpO1xuICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiBub2RlLnZhbHVlID09PSAnJyB8fCAvLyBXZSBleHBsaWNpdGx5IHdhbnQgdG8gY29lcmNlIHRvIG51bWJlciBoZXJlIGlmIHBvc3NpYmxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBub2RlLnZhbHVlICE9IHZhbHVlKSB7XG4gICAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnZhbHVlICE9PSB0b1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCcpIHtcbiAgICAvLyBTdWJtaXQvcmVzZXQgaW5wdXRzIG5lZWQgdGhlIGF0dHJpYnV0ZSByZW1vdmVkIGNvbXBsZXRlbHkgdG8gYXZvaWRcbiAgICAvLyBibGFuay10ZXh0IGJ1dHRvbnMuXG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgY29tZXMgZnJvbSBhIGNhc2NhZGUgb2ZcbiAgICAvLyBwcm9wZXJ0aWVzOlxuICAgIC8vICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eVxuICAgIC8vICAzLiBPdGhlcndpc2UgdGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZVxuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGl0IG9ubHkgY2hhbmdlcyB3aGVuIGl0IG5lZWRzXG4gICAgLy8gdG8gYmUgcmVtb3ZlZCwgc3VjaCBhcyB0cmFuc2l0aW9uaW5nIGZyb20gYSBjaGVja2JveCBpbnRvIGEgdGV4dCBpbnB1dFxuICAgIGlmIChwcm9wcy5jaGVja2VkID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhcHJvcHMuZGVmYXVsdENoZWNrZWQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyKGVsZW1lbnQsIHByb3BzLCBpc0h5ZHJhdGluZykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7IC8vIERvIG5vdCBhc3NpZ24gdmFsdWUgaWYgaXQgaXMgYWxyZWFkeSBzZXQuIFRoaXMgcHJldmVudHMgdXNlciB0ZXh0IGlucHV0XG4gIC8vIGZyb20gYmVpbmcgbG9zdCBkdXJpbmcgU1NSIGh5ZHJhdGlvbi5cblxuICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykgfHwgcHJvcHMuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWYWx1ZScpKSB7XG4gICAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuICAgIHZhciBpc0J1dHRvbiA9IHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCc7IC8vIEF2b2lkIHNldHRpbmcgdmFsdWUgYXR0cmlidXRlIG9uIHN1Ym1pdC9yZXNldCBpbnB1dHMgYXMgaXQgb3ZlcnJpZGVzIHRoZVxuICAgIC8vIGRlZmF1bHQgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIuIFNlZTogIzEyODcyXG5cbiAgICBpZiAoaXNCdXR0b24gJiYgKHByb3BzLnZhbHVlID09PSB1bmRlZmluZWQgfHwgcHJvcHMudmFsdWUgPT09IG51bGwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGluaXRpYWxWYWx1ZSA9IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpOyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAgIC8vIGZyb20gYmVpbmcgbG9zdCBkdXJpbmcgU1NSIGh5ZHJhdGlvbi5cblxuICAgIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAgIHtcbiAgICAgICAgLy8gV2hlbiBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzaG91bGQgdXNlXG4gICAgICAgIC8vIHRoZSB3cmFwcGVyU3RhdGUuX2luaXRpYWxWYWx1ZSBwcm9wZXJ0eS4gVGhpcyB1c2VzOlxuICAgICAgICAvL1xuICAgICAgICAvLyAgIDEuIFRoZSB2YWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAyLiBUaGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgICAgICAvLyAgIDMuIEFuIGVtcHR5IHN0cmluZ1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgbm9kZS52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyBzeW5jaHJvbml6ZWQgdG8gdGhlIHByb3BlcnR5LFxuICAgICAgLy8gc28gd2UgYXNzaWduIGRlZmF1bHRWYWx1ZSB0byB0aGUgc2FtZSB0aGluZyBhcyB0aGUgdmFsdWUgcHJvcGVydHlcbiAgICAgIC8vIGFzc2lnbm1lbnQgc3RlcCBhYm92ZS5cbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgIH1cbiAgfSAvLyBOb3JtYWxseSwgd2UnZCBqdXN0IGRvIGBub2RlLmNoZWNrZWQgPSBub2RlLmNoZWNrZWRgIHVwb24gaW5pdGlhbCBtb3VudCwgbGVzcyB0aGlzIGJ1Z1xuICAvLyB0aGlzIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhIGNocm9tZSBidWcgd2hlcmUgc2V0dGluZyBkZWZhdWx0Q2hlY2tlZFxuICAvLyB3aWxsIHNvbWV0aW1lcyBpbmZsdWVuY2UgdGhlIHZhbHVlIG9mIGNoZWNrZWQgKGV2ZW4gYWZ0ZXIgZGV0YWNobWVudCkuXG4gIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NjA4NDE2XG4gIC8vIFdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgdW5zZXQgbmFtZSB0byBhdm9pZCBkaXNydXB0aW5nIHJhZGlvIGJ1dHRvbiBncm91cHMuXG5cblxuICB2YXIgbmFtZSA9IG5vZGUubmFtZTtcblxuICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICBub2RlLm5hbWUgPSAnJztcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBib3RoIHRoZSBjaGVja2VkIHByb3BlcnR5IGFuZFxuICAgIC8vIGF0dHJpYnV0ZSBhcmUgYXNzaWduZWQgYXQgdGhlIHNhbWUgdGltZSB1c2luZyBkZWZhdWx0Q2hlY2tlZC4gVGhpcyB1c2VzOlxuICAgIC8vXG4gICAgLy8gICAxLiBUaGUgY2hlY2tlZCBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAvLyAgIDIuIFRoZSBkZWZhdWx0Q2hlY2tlZCBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAvLyAgIDMuIE90aGVyd2lzZSwgZmFsc2VcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gIW5vZGUuZGVmYXVsdENoZWNrZWQ7XG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkO1xuICB9XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gbmFtZTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHVwZGF0ZVdyYXBwZXIobm9kZSwgcHJvcHMpO1xuICB1cGRhdGVOYW1lZENvdXNpbnMobm9kZSwgcHJvcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVOYW1lZENvdXNpbnMocm9vdE5vZGUsIHByb3BzKSB7XG4gIHZhciBuYW1lID0gcHJvcHMubmFtZTtcblxuICBpZiAocHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuYW1lICE9IG51bGwpIHtcbiAgICB2YXIgcXVlcnlSb290ID0gcm9vdE5vZGU7XG5cbiAgICB3aGlsZSAocXVlcnlSb290LnBhcmVudE5vZGUpIHtcbiAgICAgIHF1ZXJ5Um9vdCA9IHF1ZXJ5Um9vdC5wYXJlbnROb2RlO1xuICAgIH0gLy8gSWYgYHJvb3ROb2RlLmZvcm1gIHdhcyBub24tbnVsbCwgdGhlbiB3ZSBjb3VsZCB0cnkgYGZvcm0uZWxlbWVudHNgLFxuICAgIC8vIGJ1dCB0aGF0IHNvbWV0aW1lcyBiZWhhdmVzIHN0cmFuZ2VseSBpbiBJRTguIFdlIGNvdWxkIGFsc28gdHJ5IHVzaW5nXG4gICAgLy8gYGZvcm0uZ2V0RWxlbWVudHNCeU5hbWVgLCBidXQgdGhhdCB3aWxsIG9ubHkgcmV0dXJuIGRpcmVjdCBjaGlsZHJlblxuICAgIC8vIGFuZCB3b24ndCBpbmNsdWRlIGlucHV0cyB0aGF0IHVzZSB0aGUgSFRNTDUgYGZvcm09YCBhdHRyaWJ1dGUuIFNpbmNlXG4gICAgLy8gdGhlIGlucHV0IG1pZ2h0IG5vdCBldmVuIGJlIGluIGEgZm9ybS4gSXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gdGhlXG4gICAgLy8gZG9jdW1lbnQuIExldCdzIGp1c3QgdXNlIHRoZSBsb2NhbCBgcXVlcnlTZWxlY3RvckFsbGAgdG8gZW5zdXJlIHdlIGRvbid0XG4gICAgLy8gbWlzcyBhbnl0aGluZy5cblxuXG4gICAge1xuICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihuYW1lLCAnbmFtZScpO1xuICAgIH1cblxuICAgIHZhciBncm91cCA9IHF1ZXJ5Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPScgKyBKU09OLnN0cmluZ2lmeSgnJyArIG5hbWUpICsgJ11bdHlwZT1cInJhZGlvXCJdJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgb3RoZXJOb2RlID0gZ3JvdXBbaV07XG5cbiAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5kZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0XG4gICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS5cbiAgICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0aCBub24tUmVhY3Qgb25lcy5cblxuXG4gICAgICB2YXIgb3RoZXJQcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUob3RoZXJOb2RlKTtcblxuICAgICAgaWYgKCFvdGhlclByb3BzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3RET01JbnB1dDogTWl4aW5nIFJlYWN0IGFuZCBub24tUmVhY3QgcmFkaW8gaW5wdXRzIHdpdGggdGhlICcgKyAnc2FtZSBgbmFtZWAgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH0gLy8gV2UgbmVlZCB1cGRhdGUgdGhlIHRyYWNrZWQgdmFsdWUgb24gdGhlIG5hbWVkIGNvdXNpbiBzaW5jZSB0aGUgdmFsdWVcbiAgICAgIC8vIHdhcyBjaGFuZ2VkIGJ1dCB0aGUgaW5wdXQgc2F3IG5vIGV2ZW50IG9yIHZhbHVlIHNldFxuXG5cbiAgICAgIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG90aGVyTm9kZSk7IC8vIElmIHRoaXMgaXMgYSBjb250cm9sbGVkIHJhZGlvIGJ1dHRvbiBncm91cCwgZm9yY2luZyB0aGUgaW5wdXQgdGhhdFxuICAgICAgLy8gd2FzIHByZXZpb3VzbHkgY2hlY2tlZCB0byB1cGRhdGUgd2lsbCBjYXVzZSBpdCB0byBiZSBjb21lIHJlLWNoZWNrZWRcbiAgICAgIC8vIGFzIGFwcHJvcHJpYXRlLlxuXG4gICAgICB1cGRhdGVXcmFwcGVyKG90aGVyTm9kZSwgb3RoZXJQcm9wcyk7XG4gICAgfVxuICB9XG59IC8vIEluIENocm9tZSwgYXNzaWduaW5nIGRlZmF1bHRWYWx1ZSB0byBjZXJ0YWluIGlucHV0IHR5cGVzIHRyaWdnZXJzIGlucHV0IHZhbGlkYXRpb24uXG4vLyBGb3IgbnVtYmVyIGlucHV0cywgdGhlIGRpc3BsYXkgdmFsdWUgbG9zZXMgdHJhaWxpbmcgZGVjaW1hbCBwb2ludHMuIEZvciBlbWFpbCBpbnB1dHMsXG4vLyBDaHJvbWUgcmFpc2VzIFwiVGhlIHNwZWNpZmllZCB2YWx1ZSA8eD4gaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiLlxuLy9cbi8vIEhlcmUgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZWZhdWx0VmFsdWUgaGFzIGFjdHVhbGx5IGNoYW5nZWQsIGF2b2lkaW5nIHRoZXNlIHByb2JsZW1zXG4vLyB3aGVuIHRoZSB1c2VyIGlzIGlucHV0dGluZyB0ZXh0XG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjUzXG5cblxuZnVuY3Rpb24gc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHR5cGUsIHZhbHVlKSB7XG4gIGlmICggLy8gRm9jdXNlZCBudW1iZXIgaW5wdXRzIHN5bmNocm9uaXplIG9uIGJsdXIuIFNlZSBDaGFuZ2VFdmVudFBsdWdpbi5qc1xuICB0eXBlICE9PSAnbnVtYmVyJyB8fCBnZXRBY3RpdmVFbGVtZW50KG5vZGUub3duZXJEb2N1bWVudCkgIT09IG5vZGUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuZGVmYXVsdFZhbHVlICE9PSB0b1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSBmYWxzZTtcbnZhciBkaWRXYXJuSW52YWxpZENoaWxkID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRJbm5lckhUTUwgPSBmYWxzZTtcbi8qKlxuICogSW1wbGVtZW50cyBhbiA8b3B0aW9uPiBob3N0IGNvbXBvbmVudCB0aGF0IHdhcm5zIHdoZW4gYHNlbGVjdGVkYCBpcyBzZXQuXG4gKi9cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgLy8gSWYgYSB2YWx1ZSBpcyBub3QgcHJvdmlkZWQsIHRoZW4gdGhlIGNoaWxkcmVuIG11c3QgYmUgc2ltcGxlLlxuICAgIGlmIChwcm9wcy52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnb2JqZWN0JyAmJiBwcm9wcy5jaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKHByb3BzLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkQ2hpbGQpIHtcbiAgICAgICAgICAgIGRpZFdhcm5JbnZhbGlkQ2hpbGQgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignQ2Fubm90IGluZmVyIHRoZSBvcHRpb24gdmFsdWUgb2YgY29tcGxleCBjaGlsZHJlbi4gJyArICdQYXNzIGEgYHZhbHVlYCBwcm9wIG9yIHVzZSBhIHBsYWluIHN0cmluZyBhcyBjaGlsZHJlbiB0byA8b3B0aW9uPi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgICAgIGlmICghZGlkV2FybkludmFsaWRJbm5lckhUTUwpIHtcbiAgICAgICAgICBkaWRXYXJuSW52YWxpZElubmVySFRNTCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUGFzcyBhIGB2YWx1ZWAgcHJvcCBpZiB5b3Ugc2V0IGRhbmdlcm91c2x5SW5uZXJIVE1MIHNvIFJlYWN0IGtub3dzICcgKyAnd2hpY2ggdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBUT0RPOiBSZW1vdmUgc3VwcG9ydCBmb3IgYHNlbGVjdGVkYCBpbiA8b3B0aW9uPi5cblxuXG4gICAgaWYgKHByb3BzLnNlbGVjdGVkICE9IG51bGwgJiYgIWRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uKSB7XG4gICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIG9uIDxzZWxlY3Q+IGluc3RlYWQgb2YgJyArICdzZXR0aW5nIGBzZWxlY3RlZGAgb24gPG9wdGlvbj4uJyk7XG5cbiAgICAgIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMShlbGVtZW50LCBwcm9wcykge1xuICAvLyB2YWx1ZT1cIlwiIHNob3VsZCBtYWtlIGEgdmFsdWUgYXR0cmlidXRlICgjNjIxOSlcbiAgaWYgKHByb3BzLnZhbHVlICE9IG51bGwpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKSkpO1xuICB9XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxO1xuXG57XG4gIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgdmFyIG93bmVyTmFtZSA9IGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCk7XG5cbiAgaWYgKG93bmVyTmFtZSkge1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgdmFsdWVQcm9wTmFtZXMgPSBbJ3ZhbHVlJywgJ2RlZmF1bHRWYWx1ZSddO1xuLyoqXG4gKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIGZvciBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqL1xuXG5mdW5jdGlvbiBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcykge1xuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygnc2VsZWN0JywgcHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZVByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbaV07XG5cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb3BOYW1lSXNBcnJheSA9IGlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTtcblxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFwcm9wTmFtZUlzQXJyYXkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhbiBhcnJheSBpZiAnICsgJ2BtdWx0aXBsZWAgaXMgdHJ1ZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9IGVsc2UgaWYgKCFwcm9wcy5tdWx0aXBsZSAmJiBwcm9wTmFtZUlzQXJyYXkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhIHNjYWxhciAnICsgJ3ZhbHVlIGlmIGBtdWx0aXBsZWAgaXMgZmFsc2UuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVPcHRpb25zKG5vZGUsIG11bHRpcGxlLCBwcm9wVmFsdWUsIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICB2YXIgb3B0aW9ucyA9IG5vZGUub3B0aW9ucztcblxuICBpZiAobXVsdGlwbGUpIHtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZXMgPSBwcm9wVmFsdWU7XG4gICAgdmFyIHNlbGVjdGVkVmFsdWUgPSB7fTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIFByZWZpeCB0byBhdm9pZCBjaGFvcyB3aXRoIHNwZWNpYWwga2V5cy5cbiAgICAgIHNlbGVjdGVkVmFsdWVbJyQnICsgc2VsZWN0ZWRWYWx1ZXNbaV1dID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgb3B0aW9ucy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBzZWxlY3RlZCA9IHNlbGVjdGVkVmFsdWUuaGFzT3duUHJvcGVydHkoJyQnICsgb3B0aW9uc1tfaV0udmFsdWUpO1xuXG4gICAgICBpZiAob3B0aW9uc1tfaV0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RlZCAmJiBzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRG8gbm90IHNldCBgc2VsZWN0LnZhbHVlYCBhcyBleGFjdCBiZWhhdmlvciBpc24ndCBjb25zaXN0ZW50IGFjcm9zcyBhbGxcbiAgICAvLyBicm93c2VycyBmb3IgYWxsIGNhc2VzLlxuICAgIHZhciBfc2VsZWN0ZWRWYWx1ZSA9IHRvU3RyaW5nKGdldFRvU3RyaW5nVmFsdWUocHJvcFZhbHVlKSk7XG5cbiAgICB2YXIgZGVmYXVsdFNlbGVjdGVkID0gbnVsbDtcblxuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG9wdGlvbnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgaWYgKG9wdGlvbnNbX2kyXS52YWx1ZSA9PT0gX3NlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgb3B0aW9uc1tfaTJdLnNlbGVjdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICAgICAgb3B0aW9uc1tfaTJdLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgPT09IG51bGwgJiYgIW9wdGlvbnNbX2kyXS5kaXNhYmxlZCkge1xuICAgICAgICBkZWZhdWx0U2VsZWN0ZWQgPSBvcHRpb25zW19pMl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRTZWxlY3RlZCAhPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdFNlbGVjdGVkLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogSW1wbGVtZW50cyBhIDxzZWxlY3Q+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIG9wdGlvbmFsbHkgc2V0dGluZyB0aGVcbiAqIHByb3BzIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLiBJZiBgbXVsdGlwbGVgIGlzIGZhbHNlLCB0aGUgcHJvcCBtdXN0IGJlIGFcbiAqIHN0cmluZ2FibGUuIElmIGBtdWx0aXBsZWAgaXMgdHJ1ZSwgdGhlIHByb3AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdhYmxlcy5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBjaGFuZ2UgdGhlXG4gKiBzZWxlY3RlZCBvcHRpb24gd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIHJlbmRlcmVkIG9wdGlvbnMuXG4gKlxuICogSWYgaXQgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgb3B0aW9ucyB3aWxsIG5vdFxuICogdXBkYXRlIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9ucy4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBvcHRpb25zIHRvIHVwZGF0ZS5cbiAqXG4gKiBJZiBgZGVmYXVsdFZhbHVlYCBpcyBwcm92aWRlZCwgYW55IG9wdGlvbnMgd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWVzIHdpbGwgYmVcbiAqIHNlbGVjdGVkLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkXG4gIH0pO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIHdhc011bHRpcGxlOiAhIXByb3BzLm11bHRpcGxlXG4gIH07XG5cbiAge1xuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSkge1xuICAgICAgZXJyb3IoJ1NlbGVjdCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgbm9kZS5tdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0VXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB3YXNNdWx0aXBsZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAod2FzTXVsdGlwbGUgIT09ICEhcHJvcHMubXVsdGlwbGUpIHtcbiAgICAvLyBGb3Igc2ltcGxpY2l0eSwgcmVhcHBseSBgZGVmYXVsdFZhbHVlYCBpZiBgbXVsdGlwbGVgIGlzIHRvZ2dsZWQuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldmVydCB0aGUgc2VsZWN0IGJhY2sgdG8gaXRzIGRlZmF1bHQgdW5zZWxlY3RlZCBzdGF0ZS5cbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMubXVsdGlwbGUgPyBbXSA6ICcnLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbERlZmF1bHRWYWwgPSBmYWxzZTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHRleHRhcmVhPiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIGB2YWx1ZWAsIGFuZFxuICogYGRlZmF1bHRWYWx1ZWAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB0cmFkaXRpb25hbCBET00gQVBJIGJlY2F1c2UgdmFsdWUgaXNcbiAqIHVzdWFsbHkgc2V0IGFzIFBDREFUQSBjaGlsZHJlbi5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlXG4gKiB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbFxuICogbm90IHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGVtcHR5IHZhbHVlLCB0aGUgcHJvcFxuICogYGRlZmF1bHRWYWx1ZWAgaWYgc3BlY2lmaWVkLCBvciB0aGUgY2hpbGRyZW4gY29udGVudCAoZGVwcmVjYXRlZCkuXG4gKi9cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBkb2VzIG5vdCBtYWtlIHNlbnNlIG9uIDx0ZXh0YXJlYT4uJyk7XG4gIH0gLy8gQWx3YXlzIHNldCBjaGlsZHJlbiB0byB0aGUgc2FtZSB0aGluZy4gSW4gSUU5LCB0aGUgc2VsZWN0aW9uIHJhbmdlIHdpbGxcbiAgLy8gZ2V0IHJlc2V0IGlmIGB0ZXh0Q29udGVudGAgaXMgbXV0YXRlZC4gIFdlIGNvdWxkIGFkZCBhIGNoZWNrIGluIHNldFRleHRDb250ZW50XG4gIC8vIHRvIG9ubHkgc2V0IHRoZSB2YWx1ZSBpZi93aGVuIHRoZSB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIG5vZGUgdmFsdWUgKHdoaWNoIHdvdWxkXG4gIC8vIGNvbXBsZXRlbHkgc29sdmUgdGhpcyBJRTkgYnVnKSwgYnV0IFNlYmFzdGlhbitTb3BoaWUgc2VlbWVkIHRvIGxpa2UgdGhpc1xuICAvLyBzb2x1dGlvbi4gVGhlIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4gb3Igb2JqZWN0IHNvIHRoYXQncyB3aHkgaXQncyBmb3JjZWRcbiAgLy8gdG8gYmUgYSBzdHJpbmcuXG5cblxuICB2YXIgaG9zdFByb3BzID0gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgY2hpbGRyZW46IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpXG4gIH0pO1xuXG4gIHJldHVybiBob3N0UHJvcHM7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCd0ZXh0YXJlYScsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsRGVmYXVsdFZhbCkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGEgdGV4dGFyZWEgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnVGV4dGFyZWEgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHRleHRhcmVhICcgKyAnYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnKTtcblxuICAgICAgZGlkV2FyblZhbERlZmF1bHRWYWwgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbml0aWFsVmFsdWUgPSBwcm9wcy52YWx1ZTsgLy8gT25seSBib3RoZXIgZmV0Y2hpbmcgZGVmYXVsdCB2YWx1ZSBpZiB3ZSdyZSBnb2luZyB0byB1c2UgaXRcblxuICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuXG4gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcgJyArICdjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignPHRleHRhcmVhPiBjYW4gb25seSBoYXZlIGF0IG1vc3Qgb25lIGNoaWxkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGluaXRpYWxWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUoaW5pdGlhbFZhbHVlKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSk7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICB2YXIgbmV3VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7IC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkXG5cbiAgICBpZiAobmV3VmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgJiYgbm9kZS5kZWZhdWx0VmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdFxuICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cblxuICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50OyAvLyBPbmx5IHNldCBub2RlLnZhbHVlIGlmIHRleHRDb250ZW50IGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZFxuICAvLyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZVxuICAvLyB3aWxsIHBvcHVsYXRlIHRleHRDb250ZW50IGFzIHdlbGwuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwMTUyNS9cblxuICBpZiAodGV4dENvbnRlbnQgPT09IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICBpZiAodGV4dENvbnRlbnQgIT09ICcnICYmIHRleHRDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gRE9NIGNvbXBvbmVudCBpcyBzdGlsbCBtb3VudGVkOyB1cGRhdGVcbiAgdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKTtcbn1cblxudmFyIEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xudmFyIE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xudmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOyAvLyBBc3N1bWVzIHRoZXJlIGlzIG5vIHBhcmVudCBuYW1lc3BhY2UuXG5cbmZ1bmN0aW9uIGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N2Zyc6XG4gICAgICByZXR1cm4gU1ZHX05BTUVTUEFDRTtcblxuICAgIGNhc2UgJ21hdGgnOlxuICAgICAgcmV0dXJuIE1BVEhfTkFNRVNQQUNFO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGROYW1lc3BhY2UocGFyZW50TmFtZXNwYWNlLCB0eXBlKSB7XG4gIGlmIChwYXJlbnROYW1lc3BhY2UgPT0gbnVsbCB8fCBwYXJlbnROYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgLy8gTm8gKG9yIGRlZmF1bHQpIHBhcmVudCBuYW1lc3BhY2U6IHBvdGVudGlhbCBlbnRyeSBwb2ludC5cbiAgICByZXR1cm4gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PT0gU1ZHX05BTUVTUEFDRSAmJiB0eXBlID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyBXZSdyZSBsZWF2aW5nIFNWRy5cbiAgICByZXR1cm4gSFRNTF9OQU1FU1BBQ0U7XG4gIH0gLy8gQnkgZGVmYXVsdCwgcGFzcyBuYW1lc3BhY2UgYmVsb3cuXG5cblxuICByZXR1cm4gcGFyZW50TmFtZXNwYWNlO1xufVxuXG4vKiBnbG9iYWxzIE1TQXBwICovXG5cbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gd2hpY2ggaGFzICd1bnNhZmUnIHByaXZpbGVnZXMgKHJlcXVpcmVkIGJ5IHdpbmRvd3M4IGFwcHMpXG4gKi9cbnZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgaWYgKHR5cGVvZiBNU0FwcCAhPT0gJ3VuZGVmaW5lZCcgJiYgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jO1xuICB9XG59O1xuXG52YXIgcmV1c2FibGVTVkdDb250YWluZXI7XG4vKipcbiAqIFNldCB0aGUgaW5uZXJIVE1MIHByb3BlcnR5IG9mIGEgbm9kZVxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcbiAqIEBpbnRlcm5hbFxuICovXG5cbnZhciBzZXRJbm5lckhUTUwgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBodG1sKSB7XG4gIGlmIChub2RlLm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuXG4gICAgaWYgKCEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9kZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZVxuICAgICAgLy8gbmV3IG1hcmt1cCBpbiBhIHRlbXAgbm9kZSBhbmQgdGhlbiBtb3ZlIHRoZSBjaGlsZCBub2RlcyBhY3Jvc3MgaW50b1xuICAgICAgLy8gdGhlIHRhcmdldCBub2RlXG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0bWwudmFsdWVPZigpLnRvU3RyaW5nKCkgKyAnPC9zdmc+JztcbiAgICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xufSk7XG5cbi8qKlxuICogSFRNTCBub2RlVHlwZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIG5vZGVcbiAqL1xudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xudmFyIERPQ1VNRU5UX05PREUgPSA5O1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZS4gRm9yIHRleHQgdXBkYXRlcywgaXQncyBmYXN0ZXJcbiAqIHRvIHNldCB0aGUgYG5vZGVWYWx1ZWAgb2YgdGhlIFRleHQgbm9kZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBgLnRleHRDb250ZW50YCB3aGljaCB3aWxsIHJlbW92ZSB0aGUgZXhpc3Rpbmcgbm9kZSBhbmQgY3JlYXRlIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkge1xuICBpZiAodGV4dCkge1xuICAgIHZhciBmaXJzdENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZCA9PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59O1xuXG4vLyBMaXN0IGRlcml2ZWQgZnJvbSBHZWNrbyBzb3VyY2UgY29kZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvLWRldi9ibG9iLzRlNjM4ZWZjNzEvbGF5b3V0L3N0eWxlL3Rlc3QvcHJvcGVydHlfZGF0YWJhc2UuanNcbnZhciBzaG9ydGhhbmRUb0xvbmdoYW5kID0ge1xuICBhbmltYXRpb246IFsnYW5pbWF0aW9uRGVsYXknLCAnYW5pbWF0aW9uRGlyZWN0aW9uJywgJ2FuaW1hdGlvbkR1cmF0aW9uJywgJ2FuaW1hdGlvbkZpbGxNb2RlJywgJ2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50JywgJ2FuaW1hdGlvbk5hbWUnLCAnYW5pbWF0aW9uUGxheVN0YXRlJywgJ2FuaW1hdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIGJhY2tncm91bmQ6IFsnYmFja2dyb3VuZEF0dGFjaG1lbnQnLCAnYmFja2dyb3VuZENsaXAnLCAnYmFja2dyb3VuZENvbG9yJywgJ2JhY2tncm91bmRJbWFnZScsICdiYWNrZ3JvdW5kT3JpZ2luJywgJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWScsICdiYWNrZ3JvdW5kUmVwZWF0JywgJ2JhY2tncm91bmRTaXplJ10sXG4gIGJhY2tncm91bmRQb3NpdGlvbjogWydiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknXSxcbiAgYm9yZGVyOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCcsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJCbG9ja0VuZDogWydib3JkZXJCbG9ja0VuZENvbG9yJywgJ2JvcmRlckJsb2NrRW5kU3R5bGUnLCAnYm9yZGVyQmxvY2tFbmRXaWR0aCddLFxuICBib3JkZXJCbG9ja1N0YXJ0OiBbJ2JvcmRlckJsb2NrU3RhcnRDb2xvcicsICdib3JkZXJCbG9ja1N0YXJ0U3R5bGUnLCAnYm9yZGVyQmxvY2tTdGFydFdpZHRoJ10sXG4gIGJvcmRlckJvdHRvbTogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCddLFxuICBib3JkZXJDb2xvcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJUb3BDb2xvciddLFxuICBib3JkZXJJbWFnZTogWydib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lRW5kOiBbJ2JvcmRlcklubGluZUVuZENvbG9yJywgJ2JvcmRlcklubGluZUVuZFN0eWxlJywgJ2JvcmRlcklubGluZUVuZFdpZHRoJ10sXG4gIGJvcmRlcklubGluZVN0YXJ0OiBbJ2JvcmRlcklubGluZVN0YXJ0Q29sb3InLCAnYm9yZGVySW5saW5lU3RhcnRTdHlsZScsICdib3JkZXJJbmxpbmVTdGFydFdpZHRoJ10sXG4gIGJvcmRlckxlZnQ6IFsnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnXSxcbiAgYm9yZGVyUmFkaXVzOiBbJ2JvcmRlckJvdHRvbUxlZnRSYWRpdXMnLCAnYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMnLCAnYm9yZGVyVG9wTGVmdFJhZGl1cycsICdib3JkZXJUb3BSaWdodFJhZGl1cyddLFxuICBib3JkZXJSaWdodDogWydib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCddLFxuICBib3JkZXJTdHlsZTogWydib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJUb3BTdHlsZSddLFxuICBib3JkZXJUb3A6IFsnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyV2lkdGg6IFsnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgY29sdW1uUnVsZTogWydjb2x1bW5SdWxlQ29sb3InLCAnY29sdW1uUnVsZVN0eWxlJywgJ2NvbHVtblJ1bGVXaWR0aCddLFxuICBjb2x1bW5zOiBbJ2NvbHVtbkNvdW50JywgJ2NvbHVtbldpZHRoJ10sXG4gIGZsZXg6IFsnZmxleEJhc2lzJywgJ2ZsZXhHcm93JywgJ2ZsZXhTaHJpbmsnXSxcbiAgZmxleEZsb3c6IFsnZmxleERpcmVjdGlvbicsICdmbGV4V3JhcCddLFxuICBmb250OiBbJ2ZvbnRGYW1pbHknLCAnZm9udEZlYXR1cmVTZXR0aW5ncycsICdmb250S2VybmluZycsICdmb250TGFuZ3VhZ2VPdmVycmlkZScsICdmb250U2l6ZScsICdmb250U2l6ZUFkanVzdCcsICdmb250U3RyZXRjaCcsICdmb250U3R5bGUnLCAnZm9udFZhcmlhbnQnLCAnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbicsICdmb250V2VpZ2h0JywgJ2xpbmVIZWlnaHQnXSxcbiAgZm9udFZhcmlhbnQ6IFsnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbiddLFxuICBnYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkOiBbJ2dyaWRBdXRvQ29sdW1ucycsICdncmlkQXV0b0Zsb3cnLCAnZ3JpZEF1dG9Sb3dzJywgJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBncmlkQXJlYTogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCcsICdncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkQ29sdW1uOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0J10sXG4gIGdyaWRDb2x1bW5HYXA6IFsnY29sdW1uR2FwJ10sXG4gIGdyaWRHYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkUm93OiBbJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRSb3dHYXA6IFsncm93R2FwJ10sXG4gIGdyaWRUZW1wbGF0ZTogWydncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgbGlzdFN0eWxlOiBbJ2xpc3RTdHlsZUltYWdlJywgJ2xpc3RTdHlsZVBvc2l0aW9uJywgJ2xpc3RTdHlsZVR5cGUnXSxcbiAgbWFyZ2luOiBbJ21hcmdpbkJvdHRvbScsICdtYXJnaW5MZWZ0JywgJ21hcmdpblJpZ2h0JywgJ21hcmdpblRvcCddLFxuICBtYXJrZXI6IFsnbWFya2VyRW5kJywgJ21hcmtlck1pZCcsICdtYXJrZXJTdGFydCddLFxuICBtYXNrOiBbJ21hc2tDbGlwJywgJ21hc2tDb21wb3NpdGUnLCAnbWFza0ltYWdlJywgJ21hc2tNb2RlJywgJ21hc2tPcmlnaW4nLCAnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJywgJ21hc2tSZXBlYXQnLCAnbWFza1NpemUnXSxcbiAgbWFza1Bvc2l0aW9uOiBbJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWSddLFxuICBvdXRsaW5lOiBbJ291dGxpbmVDb2xvcicsICdvdXRsaW5lU3R5bGUnLCAnb3V0bGluZVdpZHRoJ10sXG4gIG92ZXJmbG93OiBbJ292ZXJmbG93WCcsICdvdmVyZmxvd1knXSxcbiAgcGFkZGluZzogWydwYWRkaW5nQm90dG9tJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdSaWdodCcsICdwYWRkaW5nVG9wJ10sXG4gIHBsYWNlQ29udGVudDogWydhbGlnbkNvbnRlbnQnLCAnanVzdGlmeUNvbnRlbnQnXSxcbiAgcGxhY2VJdGVtczogWydhbGlnbkl0ZW1zJywgJ2p1c3RpZnlJdGVtcyddLFxuICBwbGFjZVNlbGY6IFsnYWxpZ25TZWxmJywgJ2p1c3RpZnlTZWxmJ10sXG4gIHRleHREZWNvcmF0aW9uOiBbJ3RleHREZWNvcmF0aW9uQ29sb3InLCAndGV4dERlY29yYXRpb25MaW5lJywgJ3RleHREZWNvcmF0aW9uU3R5bGUnXSxcbiAgdGV4dEVtcGhhc2lzOiBbJ3RleHRFbXBoYXNpc0NvbG9yJywgJ3RleHRFbXBoYXNpc1N0eWxlJ10sXG4gIHRyYW5zaXRpb246IFsndHJhbnNpdGlvbkRlbGF5JywgJ3RyYW5zaXRpb25EdXJhdGlvbicsICd0cmFuc2l0aW9uUHJvcGVydHknLCAndHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIHdvcmRXcmFwOiBbJ292ZXJmbG93V3JhcCddXG59O1xuXG4vKipcbiAqIENTUyBwcm9wZXJ0aWVzIHdoaWNoIGFjY2VwdCBudW1iZXJzIGJ1dCBhcmUgbm90IGluIHVuaXRzIG9mIFwicHhcIi5cbiAqL1xudmFyIGlzVW5pdGxlc3NOdW1iZXIgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBhc3BlY3RSYXRpbzogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUsXG4gIGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG4gIGJvcmRlckltYWdlV2lkdGg6IHRydWUsXG4gIGJveEZsZXg6IHRydWUsXG4gIGJveEZsZXhHcm91cDogdHJ1ZSxcbiAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgY29sdW1uczogdHJ1ZSxcbiAgZmxleDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhQb3NpdGl2ZTogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZmxleE5lZ2F0aXZlOiB0cnVlLFxuICBmbGV4T3JkZXI6IHRydWUsXG4gIGdyaWRBcmVhOiB0cnVlLFxuICBncmlkUm93OiB0cnVlLFxuICBncmlkUm93RW5kOiB0cnVlLFxuICBncmlkUm93U3BhbjogdHJ1ZSxcbiAgZ3JpZFJvd1N0YXJ0OiB0cnVlLFxuICBncmlkQ29sdW1uOiB0cnVlLFxuICBncmlkQ29sdW1uRW5kOiB0cnVlLFxuICBncmlkQ29sdW1uU3BhbjogdHJ1ZSxcbiAgZ3JpZENvbHVtblN0YXJ0OiB0cnVlLFxuICBmb250V2VpZ2h0OiB0cnVlLFxuICBsaW5lQ2xhbXA6IHRydWUsXG4gIGxpbmVIZWlnaHQ6IHRydWUsXG4gIG9wYWNpdHk6IHRydWUsXG4gIG9yZGVyOiB0cnVlLFxuICBvcnBoYW5zOiB0cnVlLFxuICB0YWJTaXplOiB0cnVlLFxuICB3aWRvd3M6IHRydWUsXG4gIHpJbmRleDogdHJ1ZSxcbiAgem9vbTogdHJ1ZSxcbiAgLy8gU1ZHLXJlbGF0ZWQgcHJvcGVydGllc1xuICBmaWxsT3BhY2l0eTogdHJ1ZSxcbiAgZmxvb2RPcGFjaXR5OiB0cnVlLFxuICBzdG9wT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaGFycmF5OiB0cnVlLFxuICBzdHJva2VEYXNob2Zmc2V0OiB0cnVlLFxuICBzdHJva2VNaXRlcmxpbWl0OiB0cnVlLFxuICBzdHJva2VPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VXaWR0aDogdHJ1ZVxufTtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeCB2ZW5kb3Itc3BlY2lmaWMgcHJlZml4LCBlZzogV2Via2l0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHN0eWxlIG5hbWUsIGVnOiB0cmFuc2l0aW9uRHVyYXRpb25cbiAqIEByZXR1cm4ge3N0cmluZ30gc3R5bGUgbmFtZSBwcmVmaXhlZCB3aXRoIGBwcmVmaXhgLCBwcm9wZXJseSBjYW1lbENhc2VkLCBlZzpcbiAqIFdlYmtpdFRyYW5zaXRpb25EdXJhdGlvblxuICovXG5cbmZ1bmN0aW9uIHByZWZpeEtleShwcmVmaXgsIGtleSkge1xuICByZXR1cm4gcHJlZml4ICsga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cmluZygxKTtcbn1cbi8qKlxuICogU3VwcG9ydCBzdHlsZSBuYW1lcyB0aGF0IG1heSBjb21lIHBhc3NlZCBpbiBwcmVmaXhlZCBieSBhZGRpbmcgcGVybXV0YXRpb25zXG4gKiBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cblxuXG52YXIgcHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdtcycsICdNb3onLCAnTyddOyAvLyBVc2luZyBPYmplY3Qua2V5cyBoZXJlLCBvciBlbHNlIHRoZSB2YW5pbGxhIGZvci1pbiBsb29wIG1ha2VzIElFOCBnbyBpbnRvIGFuXG4vLyBpbmZpbml0ZSBsb29wLCBiZWNhdXNlIGl0IGl0ZXJhdGVzIG92ZXIgdGhlIG5ld2x5IGFkZGVkIHByb3BzIHRvby5cblxuT2JqZWN0LmtleXMoaXNVbml0bGVzc051bWJlcikuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBwcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBpc1VuaXRsZXNzTnVtYmVyW3ByZWZpeEtleShwcmVmaXgsIHByb3ApXSA9IGlzVW5pdGxlc3NOdW1iZXJbcHJvcF07XG4gIH0pO1xufSk7XG5cbi8qKlxuICogQ29udmVydCBhIHZhbHVlIGludG8gdGhlIHByb3BlciBjc3Mgd3JpdGFibGUgdmFsdWUuIFRoZSBzdHlsZSBuYW1lIGBuYW1lYFxuICogc2hvdWxkIGJlIGxvZ2ljYWwgKG5vIGh5cGhlbnMpLCBhcyBzcGVjaWZpZWRcbiAqIGluIGBDU1NQcm9wZXJ0eS5pc1VuaXRsZXNzTnVtYmVyYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBDU1MgcHJvcGVydHkgbmFtZSBzdWNoIGFzIGB0b3BNYXJnaW5gLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBDU1MgcHJvcGVydHkgdmFsdWUgc3VjaCBhcyBgMTBweGAuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgc3R5bGUgdmFsdWUgd2l0aCBkaW1lbnNpb25zIGFwcGxpZWQuXG4gKi9cblxuZnVuY3Rpb24gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShuYW1lLCB2YWx1ZSwgaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAvLyBOb3RlIHRoYXQgd2UndmUgcmVtb3ZlZCBlc2NhcGVUZXh0Rm9yQnJvd3NlcigpIGNhbGxzIGhlcmUgc2luY2UgdGhlXG4gIC8vIHdob2xlIHN0cmluZyB3aWxsIGJlIGVzY2FwZWQgd2hlbiB0aGUgYXR0cmlidXRlIGlzIGluamVjdGVkIGludG9cbiAgLy8gdGhlIG1hcmt1cC4gSWYgeW91IHByb3ZpZGUgdW5zYWZlIHVzZXIgZGF0YSBoZXJlIHRoZXkgY2FuIGluamVjdFxuICAvLyBhcmJpdHJhcnkgQ1NTIHdoaWNoIG1heSBiZSBwcm9ibGVtYXRpYyAoSSBjb3VsZG4ndCByZXBybyB0aGlzKTpcbiAgLy8gaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9YU1NfRmlsdGVyX0V2YXNpb25fQ2hlYXRfU2hlZXRcbiAgLy8gaHR0cDovL3d3dy50aGVzcGFubmVyLmNvLnVrLzIwMDcvMTEvMjYvdWx0aW1hdGUteHNzLWNzcy1pbmplY3Rpb24vXG4gIC8vIFRoaXMgaXMgbm90IGFuIFhTUyBob2xlIGJ1dCBpbnN0ZWFkIGEgcG90ZW50aWFsIENTUyBpbmplY3Rpb24gaXNzdWVcbiAgLy8gd2hpY2ggaGFzIGxlYWQgdG8gYSBncmVhdGVyIGRpc2N1c3Npb24gYWJvdXQgaG93IHdlJ3JlIGdvaW5nIHRvXG4gIC8vIHRydXN0IFVSTHMgbW92aW5nIGZvcndhcmQuIFNlZSAjMjExNTkwMVxuICB2YXIgaXNFbXB0eSA9IHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xuXG4gIGlmIChpc0VtcHR5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKCFpc0N1c3RvbVByb3BlcnR5ICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IDAgJiYgIShpc1VuaXRsZXNzTnVtYmVyLmhhc093blByb3BlcnR5KG5hbWUpICYmIGlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pKSB7XG4gICAgcmV0dXJuIHZhbHVlICsgJ3B4JzsgLy8gUHJlc3VtZXMgaW1wbGljaXQgJ3B4JyBzdWZmaXggZm9yIHVuaXRsZXNzIG51bWJlcnNcbiAgfVxuXG4gIHtcbiAgICBjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuICgnJyArIHZhbHVlKS50cmltKCk7XG59XG5cbnZhciB1cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZztcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tb3otdHJhbnNpdGlvblwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKVxuICogICA8IFwiLW1zLXRyYW5zaXRpb25cIlxuICpcbiAqIEFzIE1vZGVybml6ciBzdWdnZXN0cyAoaHR0cDovL21vZGVybml6ci5jb20vZG9jcy8jcHJlZml4ZWQpLCBhbiBgbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGAtbXMtYC5cbiAqL1xuXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUobmFtZSkge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKHVwcGVyY2FzZVBhdHRlcm4sICctJDEnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxkIGJlIGNhcGl0YWxpemVkXG4gIHZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4gPSAvXig/OndlYmtpdHxtb3p8bylbQS1aXS87XG4gIHZhciBtc1BhdHRlcm4kMSA9IC9eLW1zLS87XG4gIHZhciBoeXBoZW5QYXR0ZXJuID0gLy0oLikvZzsgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG5cbiAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiA9IC87XFxzKiQvO1xuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG4gIHZhciB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIGNhbWVsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShoeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCAvLyBBcyBBbmRpIFNtaXRoIHN1Z2dlc3RzXG4gICAgLy8gKGh0dHA6Ly93d3cuYW5kaXNtaXRoLmNvbS9ibG9nLzIwMTIvMDIvbW9kZXJuaXpyLXByZWZpeGVkLyksIGFuIGAtbXNgIHByZWZpeFxuICAgIC8vIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYG1zYC5cbiAgICBjYW1lbGl6ZShuYW1lLnJlcGxhY2UobXNQYXR0ZXJuJDEsICdtcy0nKSkpO1xuICB9O1xuXG4gIHZhciB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCB2ZW5kb3ItcHJlZml4ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKFwiU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uLiBcIiArICdUcnkgXCIlczogJXNcIiBpbnN0ZWFkLicsIG5hbWUsIHZhbHVlLnJlcGxhY2UoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLCAnJykpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvck5hTlZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5ID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvckluZmluaXR5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgSW5maW5pdHlgIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmIChuYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbihuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc05hTihuYW1lLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSQxID0gd2FyblZhbGlkU3R5bGU7XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogVGhpcyBjcmVhdGVzIGEgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgc3R5bGVcbiAqIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgYnkgc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBJdCBieS1wYXNzZXMgd2FybmluZ3MgYW5kXG4gKiBzZWN1cml0eSBjaGVja3Mgc28gaXQncyBub3Qgc2FmZSB0byB1c2UgdGhpcyB2YWx1ZSBmb3IgYW55dGhpbmcgb3RoZXIgdGhhblxuICogY29tcGFyaXNvbi4gSXQgaXMgb25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKHN0eWxlcykge1xuICB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSAnJztcbiAgICB2YXIgZGVsaW1pdGVyID0gJyc7XG5cbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGVsaW1pdGVyICsgKGlzQ3VzdG9tUHJvcGVydHkgPyBzdHlsZU5hbWUgOiBoeXBoZW5hdGVTdHlsZU5hbWUoc3R5bGVOYW1lKSkgKyAnOic7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpO1xuICAgICAgICBkZWxpbWl0ZXIgPSAnOyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzXG4gKiAnJyAoZW1wdHkgc3RyaW5nKSwgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgd2lsbCBiZSB1bnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcblxuICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcblxuICAgIHtcbiAgICAgIGlmICghaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZSQxKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdHlsZVZhbHVlID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBpc0N1c3RvbVByb3BlcnR5KTtcblxuICAgIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICAgIHN0eWxlTmFtZSA9ICdjc3NGbG9hdCc7XG4gICAgfVxuXG4gICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xufVxuLyoqXG4gKiBHaXZlbiB7Y29sb3I6ICdyZWQnLCBvdmVyZmxvdzogJ2hpZGRlbid9IHJldHVybnMge1xuICogICBjb2xvcjogJ2NvbG9yJyxcbiAqICAgb3ZlcmZsb3dYOiAnb3ZlcmZsb3cnLFxuICogICBvdmVyZmxvd1k6ICdvdmVyZmxvdycsXG4gKiB9LiBUaGlzIGNhbiBiZSByZWFkIGFzIFwidGhlIG92ZXJmbG93WSBwcm9wZXJ0eSB3YXMgc2V0IGJ5IHRoZSBvdmVyZmxvd1xuICogc2hvcnRoYW5kXCIuIFRoYXQgaXMsIHRoZSB2YWx1ZXMgYXJlIHRoZSBwcm9wZXJ0eSB0aGF0IGVhY2ggd2FzIGRlcml2ZWQgZnJvbS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZXMpIHtcbiAgdmFyIGV4cGFuZGVkID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgIHZhciBsb25naGFuZHMgPSBzaG9ydGhhbmRUb0xvbmdoYW5kW2tleV0gfHwgW2tleV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdoYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwYW5kZWRbbG9uZ2hhbmRzW2ldXSA9IGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5kZWQ7XG59XG4vKipcbiAqIFdoZW4gbWl4aW5nIHNob3J0aGFuZCBhbmQgbG9uZ2hhbmQgcHJvcGVydHkgbmFtZXMsIHdlIHdhcm4gZHVyaW5nIHVwZGF0ZXMgaWZcbiAqIHdlIGV4cGVjdCBhbiBpbmNvcnJlY3QgcmVzdWx0IHRvIG9jY3VyLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YXJuIGZvcjpcbiAqXG4gKiBVcGRhdGluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBvdmVyd3JpdHRlbik6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2JheicsIGZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICdiYXonXG4gKiBSZW1vdmluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBsb3N0IHRvbyk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJydcbiAqIFJlbW92aW5nIGEgbG9uZ2hhbmQgcHJvcGVydHkgKHNob3VsZCByZXZlcnQgdG8gc2hvcnRoYW5kOyBkb2Vzbid0KTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnZm9vJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udFZhcmlhbnQgPSAnJ1xuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFN0eWxlcykge1xuICB7XG4gICAgaWYgKCFuZXh0U3R5bGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGV4cGFuZGVkVXBkYXRlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZVVwZGF0ZXMpO1xuICAgIHZhciBleHBhbmRlZFN0eWxlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChuZXh0U3R5bGVzKTtcbiAgICB2YXIgd2FybmVkQWJvdXQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBleHBhbmRlZFVwZGF0ZXMpIHtcbiAgICAgIHZhciBvcmlnaW5hbEtleSA9IGV4cGFuZGVkVXBkYXRlc1trZXldO1xuICAgICAgdmFyIGNvcnJlY3RPcmlnaW5hbEtleSA9IGV4cGFuZGVkU3R5bGVzW2tleV07XG5cbiAgICAgIGlmIChjb3JyZWN0T3JpZ2luYWxLZXkgJiYgb3JpZ2luYWxLZXkgIT09IGNvcnJlY3RPcmlnaW5hbEtleSkge1xuICAgICAgICB2YXIgd2FybmluZ0tleSA9IG9yaWdpbmFsS2V5ICsgJywnICsgY29ycmVjdE9yaWdpbmFsS2V5O1xuXG4gICAgICAgIGlmICh3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2FybmVkQWJvdXRbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclcyBhIHN0eWxlIHByb3BlcnR5IGR1cmluZyByZXJlbmRlciAoJXMpIHdoZW4gYSAnICsgJ2NvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gJyArIFwiYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIFwiICsgJ2ZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggJyArICdzZXBhcmF0ZSB2YWx1ZXMuJywgaXNWYWx1ZUVtcHR5KHN0eWxlVXBkYXRlc1tvcmlnaW5hbEtleV0pID8gJ1JlbW92aW5nJyA6ICdVcGRhdGluZycsIG9yaWdpbmFsS2V5LCBjb3JyZWN0T3JpZ2luYWxLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIGxpc3QgZm9yXG4vLyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy5cbnZhciBvbWl0dGVkQ2xvc2VUYWdzID0ge1xuICBhcmVhOiB0cnVlLFxuICBiYXNlOiB0cnVlLFxuICBicjogdHJ1ZSxcbiAgY29sOiB0cnVlLFxuICBlbWJlZDogdHJ1ZSxcbiAgaHI6IHRydWUsXG4gIGltZzogdHJ1ZSxcbiAgaW5wdXQ6IHRydWUsXG4gIGtleWdlbjogdHJ1ZSxcbiAgbGluazogdHJ1ZSxcbiAgbWV0YTogdHJ1ZSxcbiAgcGFyYW06IHRydWUsXG4gIHNvdXJjZTogdHJ1ZSxcbiAgdHJhY2s6IHRydWUsXG4gIHdicjogdHJ1ZSAvLyBOT1RFOiBtZW51aXRlbSdzIGNsb3NlIHRhZyBzaG91bGQgYmUgb21pdHRlZCwgYnV0IHRoYXQgY2F1c2VzIHByb2JsZW1zLlxuXG59O1xuXG4vLyBgb21pdHRlZENsb3NlVGFnc2AgZXhjZXB0IHRoYXQgYG1lbnVpdGVtYCBzaG91bGQgc3RpbGwgaGF2ZSBpdHMgY2xvc2luZyB0YWcuXG5cbnZhciB2b2lkRWxlbWVudFRhZ3MgPSBhc3NpZ24oe1xuICBtZW51aXRlbTogdHJ1ZVxufSwgb21pdHRlZENsb3NlVGFncyk7XG5cbnZhciBIVE1MID0gJ19faHRtbCc7XG5cbmZ1bmN0aW9uIGFzc2VydFZhbGlkUHJvcHModGFnLCBwcm9wcykge1xuICBpZiAoIXByb3BzKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIE5vdGUgdGhlIHVzZSBvZiBgPT1gIHdoaWNoIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWQuXG5cblxuICBpZiAodm9pZEVsZW1lbnRUYWdzW3RhZ10pIHtcbiAgICBpZiAocHJvcHMuY2hpbGRyZW4gIT0gbnVsbCB8fCBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGFnICsgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciBcIiArICd1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgIGlmIChwcm9wcy5jaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHNldCBvbmUgb2YgYGNoaWxkcmVuYCBvciBgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT09ICdvYmplY3QnIHx8ICEoSFRNTCBpbiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJlIGluIHRoZSBmb3JtIGB7X19odG1sOiAuLi59YC4gJyArICdQbGVhc2UgdmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rhbmdlcm91c2x5LXNldC1pbm5lci1odG1sICcgKyAnZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmICghcHJvcHMuc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nICYmIHByb3BzLmNvbnRlbnRFZGl0YWJsZSAmJiBwcm9wcy5jaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgYGNvbnRlbnRFZGl0YWJsZWAgYW5kIGNvbnRhaW5zIGBjaGlsZHJlbmAgbWFuYWdlZCBieSAnICsgJ1JlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhhdCBub25lIG9mICcgKyAndGhvc2Ugbm9kZXMgYXJlIHVuZXhwZWN0ZWRseSBtb2RpZmllZCBvciBkdXBsaWNhdGVkLiBUaGlzIGlzICcgKyAncHJvYmFibHkgbm90IGludGVudGlvbmFsLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5zdHlsZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wcy5zdHlsZSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgJyArIFwibm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArICdlbSd9fSB3aGVuIFwiICsgJ3VzaW5nIEpTWC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0N1c3RvbUNvbXBvbmVudCh0YWdOYW1lLCBwcm9wcykge1xuICBpZiAodGFnTmFtZS5pbmRleE9mKCctJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAvLyBUaGVzZSBhcmUgcmVzZXJ2ZWQgU1ZHIGFuZCBNYXRoTUwgZWxlbWVudHMuXG4gICAgLy8gV2UgZG9uJ3QgbWluZCB0aGlzIGxpc3QgdG9vIG11Y2ggYmVjYXVzZSB3ZSBleHBlY3QgaXQgdG8gbmV2ZXIgZ3Jvdy5cbiAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gdHJhY2sgdGhlIG5hbWVzcGFjZSBpbiBhIGZldyBwbGFjZXMgd2hpY2ggaXMgY29udm9sdXRlZC5cbiAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3VzdG9tLWVsZW1lbnRzLWNvcmUtY29uY2VwdHNcbiAgICBjYXNlICdhbm5vdGF0aW9uLXhtbCc6XG4gICAgY2FzZSAnY29sb3ItcHJvZmlsZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlJzpcbiAgICBjYXNlICdmb250LWZhY2Utc3JjJzpcbiAgICBjYXNlICdmb250LWZhY2UtdXJpJzpcbiAgICBjYXNlICdmb250LWZhY2UtZm9ybWF0JzpcbiAgICBjYXNlICdmb250LWZhY2UtbmFtZSc6XG4gICAgY2FzZSAnbWlzc2luZy1nbHlwaCc6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGUgSFRNTCBvciBTVkcgYWxsb3dlZCBhdHRyaWJ1dGUgbGlzdCwgYmUgc3VyZSB0b1xuLy8gYWxzbyBhZGQgdGhlbSB0byB0aGlzIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3QgbmFtZVxuLy8gd2FybmluZ3MuXG52YXIgcG9zc2libGVTdGFuZGFyZE5hbWVzID0ge1xuICAvLyBIVE1MXG4gIGFjY2VwdDogJ2FjY2VwdCcsXG4gIGFjY2VwdGNoYXJzZXQ6ICdhY2NlcHRDaGFyc2V0JyxcbiAgJ2FjY2VwdC1jaGFyc2V0JzogJ2FjY2VwdENoYXJzZXQnLFxuICBhY2Nlc3NrZXk6ICdhY2Nlc3NLZXknLFxuICBhY3Rpb246ICdhY3Rpb24nLFxuICBhbGxvd2Z1bGxzY3JlZW46ICdhbGxvd0Z1bGxTY3JlZW4nLFxuICBhbHQ6ICdhbHQnLFxuICBhczogJ2FzJyxcbiAgYXN5bmM6ICdhc3luYycsXG4gIGF1dG9jYXBpdGFsaXplOiAnYXV0b0NhcGl0YWxpemUnLFxuICBhdXRvY29tcGxldGU6ICdhdXRvQ29tcGxldGUnLFxuICBhdXRvY29ycmVjdDogJ2F1dG9Db3JyZWN0JyxcbiAgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyxcbiAgYXV0b3BsYXk6ICdhdXRvUGxheScsXG4gIGF1dG9zYXZlOiAnYXV0b1NhdmUnLFxuICBjYXB0dXJlOiAnY2FwdHVyZScsXG4gIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLFxuICBjZWxsc3BhY2luZzogJ2NlbGxTcGFjaW5nJyxcbiAgY2hhbGxlbmdlOiAnY2hhbGxlbmdlJyxcbiAgY2hhcnNldDogJ2NoYXJTZXQnLFxuICBjaGVja2VkOiAnY2hlY2tlZCcsXG4gIGNoaWxkcmVuOiAnY2hpbGRyZW4nLFxuICBjaXRlOiAnY2l0ZScsXG4gIGNsYXNzOiAnY2xhc3NOYW1lJyxcbiAgY2xhc3NpZDogJ2NsYXNzSUQnLFxuICBjbGFzc25hbWU6ICdjbGFzc05hbWUnLFxuICBjb2xzOiAnY29scycsXG4gIGNvbHNwYW46ICdjb2xTcGFuJyxcbiAgY29udGVudDogJ2NvbnRlbnQnLFxuICBjb250ZW50ZWRpdGFibGU6ICdjb250ZW50RWRpdGFibGUnLFxuICBjb250ZXh0bWVudTogJ2NvbnRleHRNZW51JyxcbiAgY29udHJvbHM6ICdjb250cm9scycsXG4gIGNvbnRyb2xzbGlzdDogJ2NvbnRyb2xzTGlzdCcsXG4gIGNvb3JkczogJ2Nvb3JkcycsXG4gIGNyb3Nzb3JpZ2luOiAnY3Jvc3NPcmlnaW4nLFxuICBkYW5nZXJvdXNseXNldGlubmVyaHRtbDogJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJyxcbiAgZGF0YTogJ2RhdGEnLFxuICBkYXRldGltZTogJ2RhdGVUaW1lJyxcbiAgZGVmYXVsdDogJ2RlZmF1bHQnLFxuICBkZWZhdWx0Y2hlY2tlZDogJ2RlZmF1bHRDaGVja2VkJyxcbiAgZGVmYXVsdHZhbHVlOiAnZGVmYXVsdFZhbHVlJyxcbiAgZGVmZXI6ICdkZWZlcicsXG4gIGRpcjogJ2RpcicsXG4gIGRpc2FibGVkOiAnZGlzYWJsZWQnLFxuICBkaXNhYmxlcGljdHVyZWlucGljdHVyZTogJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJyxcbiAgZGlzYWJsZXJlbW90ZXBsYXliYWNrOiAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJyxcbiAgZG93bmxvYWQ6ICdkb3dubG9hZCcsXG4gIGRyYWdnYWJsZTogJ2RyYWdnYWJsZScsXG4gIGVuY3R5cGU6ICdlbmNUeXBlJyxcbiAgZW50ZXJrZXloaW50OiAnZW50ZXJLZXlIaW50JyxcbiAgZm9yOiAnaHRtbEZvcicsXG4gIGZvcm06ICdmb3JtJyxcbiAgZm9ybW1ldGhvZDogJ2Zvcm1NZXRob2QnLFxuICBmb3JtYWN0aW9uOiAnZm9ybUFjdGlvbicsXG4gIGZvcm1lbmN0eXBlOiAnZm9ybUVuY1R5cGUnLFxuICBmb3Jtbm92YWxpZGF0ZTogJ2Zvcm1Ob1ZhbGlkYXRlJyxcbiAgZm9ybXRhcmdldDogJ2Zvcm1UYXJnZXQnLFxuICBmcmFtZWJvcmRlcjogJ2ZyYW1lQm9yZGVyJyxcbiAgaGVhZGVyczogJ2hlYWRlcnMnLFxuICBoZWlnaHQ6ICdoZWlnaHQnLFxuICBoaWRkZW46ICdoaWRkZW4nLFxuICBoaWdoOiAnaGlnaCcsXG4gIGhyZWY6ICdocmVmJyxcbiAgaHJlZmxhbmc6ICdocmVmTGFuZycsXG4gIGh0bWxmb3I6ICdodG1sRm9yJyxcbiAgaHR0cGVxdWl2OiAnaHR0cEVxdWl2JyxcbiAgJ2h0dHAtZXF1aXYnOiAnaHR0cEVxdWl2JyxcbiAgaWNvbjogJ2ljb24nLFxuICBpZDogJ2lkJyxcbiAgaW1hZ2VzaXplczogJ2ltYWdlU2l6ZXMnLFxuICBpbWFnZXNyY3NldDogJ2ltYWdlU3JjU2V0JyxcbiAgaW5uZXJodG1sOiAnaW5uZXJIVE1MJyxcbiAgaW5wdXRtb2RlOiAnaW5wdXRNb2RlJyxcbiAgaW50ZWdyaXR5OiAnaW50ZWdyaXR5JyxcbiAgaXM6ICdpcycsXG4gIGl0ZW1pZDogJ2l0ZW1JRCcsXG4gIGl0ZW1wcm9wOiAnaXRlbVByb3AnLFxuICBpdGVtcmVmOiAnaXRlbVJlZicsXG4gIGl0ZW1zY29wZTogJ2l0ZW1TY29wZScsXG4gIGl0ZW10eXBlOiAnaXRlbVR5cGUnLFxuICBrZXlwYXJhbXM6ICdrZXlQYXJhbXMnLFxuICBrZXl0eXBlOiAna2V5VHlwZScsXG4gIGtpbmQ6ICdraW5kJyxcbiAgbGFiZWw6ICdsYWJlbCcsXG4gIGxhbmc6ICdsYW5nJyxcbiAgbGlzdDogJ2xpc3QnLFxuICBsb29wOiAnbG9vcCcsXG4gIGxvdzogJ2xvdycsXG4gIG1hbmlmZXN0OiAnbWFuaWZlc3QnLFxuICBtYXJnaW53aWR0aDogJ21hcmdpbldpZHRoJyxcbiAgbWFyZ2luaGVpZ2h0OiAnbWFyZ2luSGVpZ2h0JyxcbiAgbWF4OiAnbWF4JyxcbiAgbWF4bGVuZ3RoOiAnbWF4TGVuZ3RoJyxcbiAgbWVkaWE6ICdtZWRpYScsXG4gIG1lZGlhZ3JvdXA6ICdtZWRpYUdyb3VwJyxcbiAgbWV0aG9kOiAnbWV0aG9kJyxcbiAgbWluOiAnbWluJyxcbiAgbWlubGVuZ3RoOiAnbWluTGVuZ3RoJyxcbiAgbXVsdGlwbGU6ICdtdWx0aXBsZScsXG4gIG11dGVkOiAnbXV0ZWQnLFxuICBuYW1lOiAnbmFtZScsXG4gIG5vbW9kdWxlOiAnbm9Nb2R1bGUnLFxuICBub25jZTogJ25vbmNlJyxcbiAgbm92YWxpZGF0ZTogJ25vVmFsaWRhdGUnLFxuICBvcGVuOiAnb3BlbicsXG4gIG9wdGltdW06ICdvcHRpbXVtJyxcbiAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICBwbGFjZWhvbGRlcjogJ3BsYWNlaG9sZGVyJyxcbiAgcGxheXNpbmxpbmU6ICdwbGF5c0lubGluZScsXG4gIHBvc3RlcjogJ3Bvc3RlcicsXG4gIHByZWxvYWQ6ICdwcmVsb2FkJyxcbiAgcHJvZmlsZTogJ3Byb2ZpbGUnLFxuICByYWRpb2dyb3VwOiAncmFkaW9Hcm91cCcsXG4gIHJlYWRvbmx5OiAncmVhZE9ubHknLFxuICByZWZlcnJlcnBvbGljeTogJ3JlZmVycmVyUG9saWN5JyxcbiAgcmVsOiAncmVsJyxcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIHJldmVyc2VkOiAncmV2ZXJzZWQnLFxuICByb2xlOiAncm9sZScsXG4gIHJvd3M6ICdyb3dzJyxcbiAgcm93c3BhbjogJ3Jvd1NwYW4nLFxuICBzYW5kYm94OiAnc2FuZGJveCcsXG4gIHNjb3BlOiAnc2NvcGUnLFxuICBzY29wZWQ6ICdzY29wZWQnLFxuICBzY3JvbGxpbmc6ICdzY3JvbGxpbmcnLFxuICBzZWFtbGVzczogJ3NlYW1sZXNzJyxcbiAgc2VsZWN0ZWQ6ICdzZWxlY3RlZCcsXG4gIHNoYXBlOiAnc2hhcGUnLFxuICBzaXplOiAnc2l6ZScsXG4gIHNpemVzOiAnc2l6ZXMnLFxuICBzcGFuOiAnc3BhbicsXG4gIHNwZWxsY2hlY2s6ICdzcGVsbENoZWNrJyxcbiAgc3JjOiAnc3JjJyxcbiAgc3JjZG9jOiAnc3JjRG9jJyxcbiAgc3JjbGFuZzogJ3NyY0xhbmcnLFxuICBzcmNzZXQ6ICdzcmNTZXQnLFxuICBzdGFydDogJ3N0YXJ0JyxcbiAgc3RlcDogJ3N0ZXAnLFxuICBzdHlsZTogJ3N0eWxlJyxcbiAgc3VtbWFyeTogJ3N1bW1hcnknLFxuICB0YWJpbmRleDogJ3RhYkluZGV4JyxcbiAgdGFyZ2V0OiAndGFyZ2V0JyxcbiAgdGl0bGU6ICd0aXRsZScsXG4gIHR5cGU6ICd0eXBlJyxcbiAgdXNlbWFwOiAndXNlTWFwJyxcbiAgdmFsdWU6ICd2YWx1ZScsXG4gIHdpZHRoOiAnd2lkdGgnLFxuICB3bW9kZTogJ3dtb2RlJyxcbiAgd3JhcDogJ3dyYXAnLFxuICAvLyBTVkdcbiAgYWJvdXQ6ICdhYm91dCcsXG4gIGFjY2VudGhlaWdodDogJ2FjY2VudEhlaWdodCcsXG4gICdhY2NlbnQtaGVpZ2h0JzogJ2FjY2VudEhlaWdodCcsXG4gIGFjY3VtdWxhdGU6ICdhY2N1bXVsYXRlJyxcbiAgYWRkaXRpdmU6ICdhZGRpdGl2ZScsXG4gIGFsaWdubWVudGJhc2VsaW5lOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJzogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgYWxsb3dyZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogJ2FscGhhYmV0aWMnLFxuICBhbXBsaXR1ZGU6ICdhbXBsaXR1ZGUnLFxuICBhcmFiaWNmb3JtOiAnYXJhYmljRm9ybScsXG4gICdhcmFiaWMtZm9ybSc6ICdhcmFiaWNGb3JtJyxcbiAgYXNjZW50OiAnYXNjZW50JyxcbiAgYXR0cmlidXRlbmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGV0eXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9yZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAnYXppbXV0aCcsXG4gIGJhc2VmcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgYmFzZWxpbmVzaGlmdDogJ2Jhc2VsaW5lU2hpZnQnLFxuICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmVTaGlmdCcsXG4gIGJhc2Vwcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYm94OiAnYmJveCcsXG4gIGJlZ2luOiAnYmVnaW4nLFxuICBiaWFzOiAnYmlhcycsXG4gIGJ5OiAnYnknLFxuICBjYWxjbW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwaGVpZ2h0OiAnY2FwSGVpZ2h0JyxcbiAgJ2NhcC1oZWlnaHQnOiAnY2FwSGVpZ2h0JyxcbiAgY2xpcDogJ2NsaXAnLFxuICBjbGlwcGF0aDogJ2NsaXBQYXRoJyxcbiAgJ2NsaXAtcGF0aCc6ICdjbGlwUGF0aCcsXG4gIGNsaXBwYXRodW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY2xpcHJ1bGU6ICdjbGlwUnVsZScsXG4gICdjbGlwLXJ1bGUnOiAnY2xpcFJ1bGUnLFxuICBjb2xvcjogJ2NvbG9yJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJzogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICBjb2xvcnByb2ZpbGU6ICdjb2xvclByb2ZpbGUnLFxuICAnY29sb3ItcHJvZmlsZSc6ICdjb2xvclByb2ZpbGUnLFxuICBjb2xvcnJlbmRlcmluZzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgJ2NvbG9yLXJlbmRlcmluZyc6ICdjb2xvclJlbmRlcmluZycsXG4gIGNvbnRlbnRzY3JpcHR0eXBlOiAnY29udGVudFNjcmlwdFR5cGUnLFxuICBjb250ZW50c3R5bGV0eXBlOiAnY29udGVudFN0eWxlVHlwZScsXG4gIGN1cnNvcjogJ2N1cnNvcicsXG4gIGN4OiAnY3gnLFxuICBjeTogJ2N5JyxcbiAgZDogJ2QnLFxuICBkYXRhdHlwZTogJ2RhdGF0eXBlJyxcbiAgZGVjZWxlcmF0ZTogJ2RlY2VsZXJhdGUnLFxuICBkZXNjZW50OiAnZGVzY2VudCcsXG4gIGRpZmZ1c2Vjb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogJ2RpcmVjdGlvbicsXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcbiAgZGl2aXNvcjogJ2Rpdmlzb3InLFxuICBkb21pbmFudGJhc2VsaW5lOiAnZG9taW5hbnRCYXNlbGluZScsXG4gICdkb21pbmFudC1iYXNlbGluZSc6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgZHVyOiAnZHVyJyxcbiAgZHg6ICdkeCcsXG4gIGR5OiAnZHknLFxuICBlZGdlbW9kZTogJ2VkZ2VNb2RlJyxcbiAgZWxldmF0aW9uOiAnZWxldmF0aW9uJyxcbiAgZW5hYmxlYmFja2dyb3VuZDogJ2VuYWJsZUJhY2tncm91bmQnLFxuICAnZW5hYmxlLWJhY2tncm91bmQnOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gIGVuZDogJ2VuZCcsXG4gIGV4cG9uZW50OiAnZXhwb25lbnQnLFxuICBleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gIGZpbGw6ICdmaWxsJyxcbiAgZmlsbG9wYWNpdHk6ICdmaWxsT3BhY2l0eScsXG4gICdmaWxsLW9wYWNpdHknOiAnZmlsbE9wYWNpdHknLFxuICBmaWxscnVsZTogJ2ZpbGxSdWxlJyxcbiAgJ2ZpbGwtcnVsZSc6ICdmaWxsUnVsZScsXG4gIGZpbHRlcjogJ2ZpbHRlcicsXG4gIGZpbHRlcnJlczogJ2ZpbHRlclJlcycsXG4gIGZpbHRlcnVuaXRzOiAnZmlsdGVyVW5pdHMnLFxuICBmbG9vZG9wYWNpdHk6ICdmbG9vZE9wYWNpdHknLFxuICAnZmxvb2Qtb3BhY2l0eSc6ICdmbG9vZE9wYWNpdHknLFxuICBmbG9vZGNvbG9yOiAnZmxvb2RDb2xvcicsXG4gICdmbG9vZC1jb2xvcic6ICdmbG9vZENvbG9yJyxcbiAgZm9jdXNhYmxlOiAnZm9jdXNhYmxlJyxcbiAgZm9udGZhbWlseTogJ2ZvbnRGYW1pbHknLFxuICAnZm9udC1mYW1pbHknOiAnZm9udEZhbWlseScsXG4gIGZvbnRzaXplOiAnZm9udFNpemUnLFxuICAnZm9udC1zaXplJzogJ2ZvbnRTaXplJyxcbiAgZm9udHNpemVhZGp1c3Q6ICdmb250U2l6ZUFkanVzdCcsXG4gICdmb250LXNpemUtYWRqdXN0JzogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgZm9udHN0cmV0Y2g6ICdmb250U3RyZXRjaCcsXG4gICdmb250LXN0cmV0Y2gnOiAnZm9udFN0cmV0Y2gnLFxuICBmb250c3R5bGU6ICdmb250U3R5bGUnLFxuICAnZm9udC1zdHlsZSc6ICdmb250U3R5bGUnLFxuICBmb250dmFyaWFudDogJ2ZvbnRWYXJpYW50JyxcbiAgJ2ZvbnQtdmFyaWFudCc6ICdmb250VmFyaWFudCcsXG4gIGZvbnR3ZWlnaHQ6ICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnQtd2VpZ2h0JzogJ2ZvbnRXZWlnaHQnLFxuICBmb3JtYXQ6ICdmb3JtYXQnLFxuICBmcm9tOiAnZnJvbScsXG4gIGZ4OiAnZngnLFxuICBmeTogJ2Z5JyxcbiAgZzE6ICdnMScsXG4gIGcyOiAnZzInLFxuICBnbHlwaG5hbWU6ICdnbHlwaE5hbWUnLFxuICAnZ2x5cGgtbmFtZSc6ICdnbHlwaE5hbWUnLFxuICBnbHlwaG9yaWVudGF0aW9uaG9yaXpvbnRhbDogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICBnbHlwaG9yaWVudGF0aW9udmVydGljYWw6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgZ2x5cGhyZWY6ICdnbHlwaFJlZicsXG4gIGdyYWRpZW50dHJhbnNmb3JtOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gIGhhbmdpbmc6ICdoYW5naW5nJyxcbiAgaG9yaXphZHZ4OiAnaG9yaXpBZHZYJyxcbiAgJ2hvcml6LWFkdi14JzogJ2hvcml6QWR2WCcsXG4gIGhvcml6b3JpZ2lueDogJ2hvcml6T3JpZ2luWCcsXG4gICdob3Jpei1vcmlnaW4teCc6ICdob3Jpek9yaWdpblgnLFxuICBpZGVvZ3JhcGhpYzogJ2lkZW9ncmFwaGljJyxcbiAgaW1hZ2VyZW5kZXJpbmc6ICdpbWFnZVJlbmRlcmluZycsXG4gICdpbWFnZS1yZW5kZXJpbmcnOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICBpbjI6ICdpbjInLFxuICBpbjogJ2luJyxcbiAgaW5saXN0OiAnaW5saXN0JyxcbiAgaW50ZXJjZXB0OiAnaW50ZXJjZXB0JyxcbiAgazE6ICdrMScsXG4gIGsyOiAnazInLFxuICBrMzogJ2szJyxcbiAgazQ6ICdrNCcsXG4gIGs6ICdrJyxcbiAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsdW5pdGxlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAna2VybmluZycsXG4gIGtleXBvaW50czogJ2tleVBvaW50cycsXG4gIGtleXNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5dGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aGFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlcnNwYWNpbmc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ2xldHRlci1zcGFjaW5nJzogJ2xldHRlclNwYWNpbmcnLFxuICBsaWdodGluZ2NvbG9yOiAnbGlnaHRpbmdDb2xvcicsXG4gICdsaWdodGluZy1jb2xvcic6ICdsaWdodGluZ0NvbG9yJyxcbiAgbGltaXRpbmdjb25lYW5nbGU6ICdsaW1pdGluZ0NvbmVBbmdsZScsXG4gIGxvY2FsOiAnbG9jYWwnLFxuICBtYXJrZXJlbmQ6ICdtYXJrZXJFbmQnLFxuICAnbWFya2VyLWVuZCc6ICdtYXJrZXJFbmQnLFxuICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJtaWQ6ICdtYXJrZXJNaWQnLFxuICAnbWFya2VyLW1pZCc6ICdtYXJrZXJNaWQnLFxuICBtYXJrZXJzdGFydDogJ21hcmtlclN0YXJ0JyxcbiAgJ21hcmtlci1zdGFydCc6ICdtYXJrZXJTdGFydCcsXG4gIG1hcmtlcnVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJ3aWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogJ21hc2snLFxuICBtYXNrY29udGVudHVuaXRzOiAnbWFza0NvbnRlbnRVbml0cycsXG4gIG1hc2t1bml0czogJ21hc2tVbml0cycsXG4gIG1hdGhlbWF0aWNhbDogJ21hdGhlbWF0aWNhbCcsXG4gIG1vZGU6ICdtb2RlJyxcbiAgbnVtb2N0YXZlczogJ251bU9jdGF2ZXMnLFxuICBvZmZzZXQ6ICdvZmZzZXQnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG9wZXJhdG9yOiAnb3BlcmF0b3InLFxuICBvcmRlcjogJ29yZGVyJyxcbiAgb3JpZW50OiAnb3JpZW50JyxcbiAgb3JpZW50YXRpb246ICdvcmllbnRhdGlvbicsXG4gIG9yaWdpbjogJ29yaWdpbicsXG4gIG92ZXJmbG93OiAnb3ZlcmZsb3cnLFxuICBvdmVybGluZXBvc2l0aW9uOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gICdvdmVybGluZS1wb3NpdGlvbic6ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgb3ZlcmxpbmV0aGlja25lc3M6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gICdvdmVybGluZS10aGlja25lc3MnOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICBwYWludG9yZGVyOiAncGFpbnRPcmRlcicsXG4gICdwYWludC1vcmRlcic6ICdwYWludE9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZTEnLFxuICAncGFub3NlLTEnOiAncGFub3NlMScsXG4gIHBhdGhsZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJudHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm51bml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJldmVudHM6ICdwb2ludGVyRXZlbnRzJyxcbiAgJ3BvaW50ZXItZXZlbnRzJzogJ3BvaW50ZXJFdmVudHMnLFxuICBwb2ludHM6ICdwb2ludHMnLFxuICBwb2ludHNhdHg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNhdHk6ICdwb2ludHNBdFknLFxuICBwb2ludHNhdHo6ICdwb2ludHNBdFonLFxuICBwcmVmaXg6ICdwcmVmaXgnLFxuICBwcmVzZXJ2ZWFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlYXNwZWN0cmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHByb3BlcnR5OiAncHJvcGVydHknLFxuICByOiAncicsXG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIHJlZng6ICdyZWZYJyxcbiAgcmVmeTogJ3JlZlknLFxuICByZW5kZXJpbmdpbnRlbnQ6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICAncmVuZGVyaW5nLWludGVudCc6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICByZXBlYXRjb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0ZHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRleHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRmZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXNvdXJjZTogJ3Jlc291cmNlJyxcbiAgcmVzdGFydDogJ3Jlc3RhcnQnLFxuICByZXN1bHQ6ICdyZXN1bHQnLFxuICByZXN1bHRzOiAncmVzdWx0cycsXG4gIHJvdGF0ZTogJ3JvdGF0ZScsXG4gIHJ4OiAncngnLFxuICByeTogJ3J5JyxcbiAgc2NhbGU6ICdzY2FsZScsXG4gIHNlY3VyaXR5OiAnc2VjdXJpdHknLFxuICBzZWVkOiAnc2VlZCcsXG4gIHNoYXBlcmVuZGVyaW5nOiAnc2hhcGVSZW5kZXJpbmcnLFxuICAnc2hhcGUtcmVuZGVyaW5nJzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgc2xvcGU6ICdzbG9wZScsXG4gIHNwYWNpbmc6ICdzcGFjaW5nJyxcbiAgc3BlY3VsYXJjb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAnc3BlZWQnLFxuICBzcHJlYWRtZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkZGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6ICdzdGVtaCcsXG4gIHN0ZW12OiAnc3RlbXYnLFxuICBzdGl0Y2h0aWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcGNvbG9yOiAnc3RvcENvbG9yJyxcbiAgJ3N0b3AtY29sb3InOiAnc3RvcENvbG9yJyxcbiAgc3RvcG9wYWNpdHk6ICdzdG9wT3BhY2l0eScsXG4gICdzdG9wLW9wYWNpdHknOiAnc3RvcE9wYWNpdHknLFxuICBzdHJpa2V0aHJvdWdocG9zaXRpb246ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbic6ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyc6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgc3RyaW5nOiAnc3RyaW5nJyxcbiAgc3Ryb2tlOiAnc3Ryb2tlJyxcbiAgc3Ryb2tlZGFzaGFycmF5OiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgc3Ryb2tlZGFzaG9mZnNldDogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gIHN0cm9rZWxpbmVjYXA6ICdzdHJva2VMaW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lY2FwJzogJ3N0cm9rZUxpbmVjYXAnLFxuICBzdHJva2VsaW5lam9pbjogJ3N0cm9rZUxpbmVqb2luJyxcbiAgJ3N0cm9rZS1saW5lam9pbic6ICdzdHJva2VMaW5lam9pbicsXG4gIHN0cm9rZW1pdGVybGltaXQ6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JzogJ3N0cm9rZU1pdGVybGltaXQnLFxuICBzdHJva2V3aWR0aDogJ3N0cm9rZVdpZHRoJyxcbiAgJ3N0cm9rZS13aWR0aCc6ICdzdHJva2VXaWR0aCcsXG4gIHN0cm9rZW9wYWNpdHk6ICdzdHJva2VPcGFjaXR5JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JzogJ3N0cm9rZU9wYWNpdHknLFxuICBzdXBwcmVzc2NvbnRlbnRlZGl0YWJsZXdhcm5pbmc6ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLFxuICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLFxuICBzdXJmYWNlc2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1sYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldHg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0eTogJ3RhcmdldFknLFxuICB0ZXh0YW5jaG9yOiAndGV4dEFuY2hvcicsXG4gICd0ZXh0LWFuY2hvcic6ICd0ZXh0QW5jaG9yJyxcbiAgdGV4dGRlY29yYXRpb246ICd0ZXh0RGVjb3JhdGlvbicsXG4gICd0ZXh0LWRlY29yYXRpb24nOiAndGV4dERlY29yYXRpb24nLFxuICB0ZXh0bGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gIHRleHRyZW5kZXJpbmc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgJ3RleHQtcmVuZGVyaW5nJzogJ3RleHRSZW5kZXJpbmcnLFxuICB0bzogJ3RvJyxcbiAgdHJhbnNmb3JtOiAndHJhbnNmb3JtJyxcbiAgdHlwZW9mOiAndHlwZW9mJyxcbiAgdTE6ICd1MScsXG4gIHUyOiAndTInLFxuICB1bmRlcmxpbmVwb3NpdGlvbjogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgJ3VuZGVybGluZS1wb3NpdGlvbic6ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gIHVuZGVybGluZXRoaWNrbmVzczogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gIHVuaWNvZGU6ICd1bmljb2RlJyxcbiAgdW5pY29kZWJpZGk6ICd1bmljb2RlQmlkaScsXG4gICd1bmljb2RlLWJpZGknOiAndW5pY29kZUJpZGknLFxuICB1bmljb2RlcmFuZ2U6ICd1bmljb2RlUmFuZ2UnLFxuICAndW5pY29kZS1yYW5nZSc6ICd1bmljb2RlUmFuZ2UnLFxuICB1bml0c3BlcmVtOiAndW5pdHNQZXJFbScsXG4gICd1bml0cy1wZXItZW0nOiAndW5pdHNQZXJFbScsXG4gIHVuc2VsZWN0YWJsZTogJ3Vuc2VsZWN0YWJsZScsXG4gIHZhbHBoYWJldGljOiAndkFscGhhYmV0aWMnLFxuICAndi1hbHBoYWJldGljJzogJ3ZBbHBoYWJldGljJyxcbiAgdmFsdWVzOiAndmFsdWVzJyxcbiAgdmVjdG9yZWZmZWN0OiAndmVjdG9yRWZmZWN0JyxcbiAgJ3ZlY3Rvci1lZmZlY3QnOiAndmVjdG9yRWZmZWN0JyxcbiAgdmVyc2lvbjogJ3ZlcnNpb24nLFxuICB2ZXJ0YWR2eTogJ3ZlcnRBZHZZJyxcbiAgJ3ZlcnQtYWR2LXknOiAndmVydEFkdlknLFxuICB2ZXJ0b3JpZ2lueDogJ3ZlcnRPcmlnaW5YJyxcbiAgJ3ZlcnQtb3JpZ2luLXgnOiAndmVydE9yaWdpblgnLFxuICB2ZXJ0b3JpZ2lueTogJ3ZlcnRPcmlnaW5ZJyxcbiAgJ3ZlcnQtb3JpZ2luLXknOiAndmVydE9yaWdpblknLFxuICB2aGFuZ2luZzogJ3ZIYW5naW5nJyxcbiAgJ3YtaGFuZ2luZyc6ICd2SGFuZ2luZycsXG4gIHZpZGVvZ3JhcGhpYzogJ3ZJZGVvZ3JhcGhpYycsXG4gICd2LWlkZW9ncmFwaGljJzogJ3ZJZGVvZ3JhcGhpYycsXG4gIHZpZXdib3g6ICd2aWV3Qm94JyxcbiAgdmlld3RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAndmlzaWJpbGl0eScsXG4gIHZtYXRoZW1hdGljYWw6ICd2TWF0aGVtYXRpY2FsJyxcbiAgJ3YtbWF0aGVtYXRpY2FsJzogJ3ZNYXRoZW1hdGljYWwnLFxuICB2b2NhYjogJ3ZvY2FiJyxcbiAgd2lkdGhzOiAnd2lkdGhzJyxcbiAgd29yZHNwYWNpbmc6ICd3b3JkU3BhY2luZycsXG4gICd3b3JkLXNwYWNpbmcnOiAnd29yZFNwYWNpbmcnLFxuICB3cml0aW5nbW9kZTogJ3dyaXRpbmdNb2RlJyxcbiAgJ3dyaXRpbmctbW9kZSc6ICd3cml0aW5nTW9kZScsXG4gIHgxOiAneDEnLFxuICB4MjogJ3gyJyxcbiAgeDogJ3gnLFxuICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhoZWlnaHQ6ICd4SGVpZ2h0JyxcbiAgJ3gtaGVpZ2h0JzogJ3hIZWlnaHQnLFxuICB4bGlua2FjdHVhdGU6ICd4bGlua0FjdHVhdGUnLFxuICAneGxpbms6YWN0dWF0ZSc6ICd4bGlua0FjdHVhdGUnLFxuICB4bGlua2FyY3JvbGU6ICd4bGlua0FyY3JvbGUnLFxuICAneGxpbms6YXJjcm9sZSc6ICd4bGlua0FyY3JvbGUnLFxuICB4bGlua2hyZWY6ICd4bGlua0hyZWYnLFxuICAneGxpbms6aHJlZic6ICd4bGlua0hyZWYnLFxuICB4bGlua3JvbGU6ICd4bGlua1JvbGUnLFxuICAneGxpbms6cm9sZSc6ICd4bGlua1JvbGUnLFxuICB4bGlua3Nob3c6ICd4bGlua1Nob3cnLFxuICAneGxpbms6c2hvdyc6ICd4bGlua1Nob3cnLFxuICB4bGlua3RpdGxlOiAneGxpbmtUaXRsZScsXG4gICd4bGluazp0aXRsZSc6ICd4bGlua1RpdGxlJyxcbiAgeGxpbmt0eXBlOiAneGxpbmtUeXBlJyxcbiAgJ3hsaW5rOnR5cGUnOiAneGxpbmtUeXBlJyxcbiAgeG1sYmFzZTogJ3htbEJhc2UnLFxuICAneG1sOmJhc2UnOiAneG1sQmFzZScsXG4gIHhtbGxhbmc6ICd4bWxMYW5nJyxcbiAgJ3htbDpsYW5nJzogJ3htbExhbmcnLFxuICB4bWxuczogJ3htbG5zJyxcbiAgJ3htbDpzcGFjZSc6ICd4bWxTcGFjZScsXG4gIHhtbG5zeGxpbms6ICd4bWxuc1hsaW5rJyxcbiAgJ3htbG5zOnhsaW5rJzogJ3htbG5zWGxpbmsnLFxuICB4bWxzcGFjZTogJ3htbFNwYWNlJyxcbiAgeTE6ICd5MScsXG4gIHkyOiAneTInLFxuICB5OiAneScsXG4gIHljaGFubmVsc2VsZWN0b3I6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcbiAgejogJ3onLFxuICB6b29tYW5kcGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBhcmlhUHJvcGVydGllcyA9IHtcbiAgJ2FyaWEtY3VycmVudCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWRlc2NyaXB0aW9uJzogMCxcbiAgJ2FyaWEtZGV0YWlscyc6IDAsXG4gICdhcmlhLWRpc2FibGVkJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtaGlkZGVuJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtaW52YWxpZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWtleXNob3J0Y3V0cyc6IDAsXG4gICdhcmlhLWxhYmVsJzogMCxcbiAgJ2FyaWEtcm9sZWRlc2NyaXB0aW9uJzogMCxcbiAgLy8gV2lkZ2V0IEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXV0b2NvbXBsZXRlJzogMCxcbiAgJ2FyaWEtY2hlY2tlZCc6IDAsXG4gICdhcmlhLWV4cGFuZGVkJzogMCxcbiAgJ2FyaWEtaGFzcG9wdXAnOiAwLFxuICAnYXJpYS1sZXZlbCc6IDAsXG4gICdhcmlhLW1vZGFsJzogMCxcbiAgJ2FyaWEtbXVsdGlsaW5lJzogMCxcbiAgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJzogMCxcbiAgJ2FyaWEtb3JpZW50YXRpb24nOiAwLFxuICAnYXJpYS1wbGFjZWhvbGRlcic6IDAsXG4gICdhcmlhLXByZXNzZWQnOiAwLFxuICAnYXJpYS1yZWFkb25seSc6IDAsXG4gICdhcmlhLXJlcXVpcmVkJzogMCxcbiAgJ2FyaWEtc2VsZWN0ZWQnOiAwLFxuICAnYXJpYS1zb3J0JzogMCxcbiAgJ2FyaWEtdmFsdWVtYXgnOiAwLFxuICAnYXJpYS12YWx1ZW1pbic6IDAsXG4gICdhcmlhLXZhbHVlbm93JzogMCxcbiAgJ2FyaWEtdmFsdWV0ZXh0JzogMCxcbiAgLy8gTGl2ZSBSZWdpb24gQXR0cmlidXRlc1xuICAnYXJpYS1hdG9taWMnOiAwLFxuICAnYXJpYS1idXN5JzogMCxcbiAgJ2FyaWEtbGl2ZSc6IDAsXG4gICdhcmlhLXJlbGV2YW50JzogMCxcbiAgLy8gRHJhZy1hbmQtRHJvcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWRyb3BlZmZlY3QnOiAwLFxuICAnYXJpYS1ncmFiYmVkJzogMCxcbiAgLy8gUmVsYXRpb25zaGlwIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCc6IDAsXG4gICdhcmlhLWNvbGNvdW50JzogMCxcbiAgJ2FyaWEtY29saW5kZXgnOiAwLFxuICAnYXJpYS1jb2xzcGFuJzogMCxcbiAgJ2FyaWEtY29udHJvbHMnOiAwLFxuICAnYXJpYS1kZXNjcmliZWRieSc6IDAsXG4gICdhcmlhLWVycm9ybWVzc2FnZSc6IDAsXG4gICdhcmlhLWZsb3d0byc6IDAsXG4gICdhcmlhLWxhYmVsbGVkYnknOiAwLFxuICAnYXJpYS1vd25zJzogMCxcbiAgJ2FyaWEtcG9zaW5zZXQnOiAwLFxuICAnYXJpYS1yb3djb3VudCc6IDAsXG4gICdhcmlhLXJvd2luZGV4JzogMCxcbiAgJ2FyaWEtcm93c3Bhbic6IDAsXG4gICdhcmlhLXNldHNpemUnOiAwXG59O1xuXG52YXIgd2FybmVkUHJvcGVydGllcyA9IHt9O1xudmFyIHJBUklBID0gbmV3IFJlZ0V4cCgnXihhcmlhKS1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgckFSSUFDYW1lbCA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSh0YWdOYW1lLCBuYW1lKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAockFSSUFDYW1lbC50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgYXJpYU5hbWUgPSAnYXJpYS0nICsgbmFtZS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIGNvcnJlY3ROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoYXJpYU5hbWUpID8gYXJpYU5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKGNvcnJlY3ROYW1lID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gQVJJQSBhdHRyaWJ1dGVzIGZvbGxvdyB0aGUgcGF0dGVybiBhcmlhLSogYW5kIG11c3QgYmUgbG93ZXJjYXNlLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IGNvcnJlY3ROYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIGNvcnJlY3ROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJBUklBLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lID09IG51bGwpIHtcbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHZhciBpbnZhbGlkUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5KHR5cGUsIGtleSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IGludmFsaWRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcyk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVOdWxsID0gZmFsc2U7XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgaWYgKHR5cGUgIT09ICdpbnB1dCcgJiYgdHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0eXBlICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wcyAhPSBudWxsICYmIHByb3BzLnZhbHVlID09PSBudWxsICYmICFkaWRXYXJuVmFsdWVOdWxsKSB7XG4gICAgICBkaWRXYXJuVmFsdWVOdWxsID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnICYmIHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgJyArICd0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgc3RyaW5nIHRvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgJyArICdmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICB2YXIgd2FybmVkUHJvcGVydGllcyQxID0ge307XG4gIHZhciBFVkVOVF9OQU1FX1JFR0VYID0gL15vbi4vO1xuICB2YXIgSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYID0gL15vblteQS1aXS87XG4gIHZhciByQVJJQSQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKS1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG4gIHZhciByQVJJQUNhbWVsJDEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gKHRhZ05hbWUsIG5hbWUsIHZhbHVlLCBldmVudFJlZ2lzdHJ5KSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwod2FybmVkUHJvcGVydGllcyQxLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNpbicgfHwgbG93ZXJDYXNlZE5hbWUgPT09ICdvbmZvY3Vzb3V0Jykge1xuICAgICAgZXJyb3IoJ1JlYWN0IHVzZXMgb25Gb2N1cyBhbmQgb25CbHVyIGluc3RlYWQgb2Ygb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0LiAnICsgJ0FsbCBSZWFjdCBldmVudHMgYXJlIG5vcm1hbGl6ZWQgdG8gYnViYmxlLCBzbyBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQgJyArICdhcmUgbm90IG5lZWRlZC9zdXBwb3J0ZWQgYnkgUmVhY3QuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFdlIGNhbid0IHJlbHkgb24gdGhlIGV2ZW50IHN5c3RlbSBiZWluZyBpbmplY3RlZCBvbiB0aGUgc2VydmVyLlxuXG5cbiAgICBpZiAoZXZlbnRSZWdpc3RyeSAhPSBudWxsKSB7XG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IGV2ZW50UmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyxcbiAgICAgICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gZXZlbnRSZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdIDogbnVsbDtcblxuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAgIGVycm9yKCdVbmtub3duIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gSXQgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAvLyBJZiBubyBldmVudCBwbHVnaW5zIGhhdmUgYmVlbiBpbmplY3RlZCwgd2UgYXJlIGluIGEgc2VydmVyIGVudmlyb25tZW50LlxuICAgICAgLy8gU28gd2UgY2FuJ3QgdGVsbCBpZiB0aGUgZXZlbnQgbmFtZSBpcyBjb3JyZWN0IGZvciBzdXJlLCBidXQgd2UgY2FuIGZpbHRlclxuICAgICAgLy8gb3V0IGtub3duIGJhZCBvbmVzIGxpa2UgYG9uY2xpY2tgLiBXZSBjYW4ndCBzdWdnZXN0IGEgc3BlY2lmaWMgcmVwbGFjZW1lbnQgdGhvdWdoLlxuICAgICAgaWYgKElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gJyArICdSZWFjdCBldmVudHMgdXNlIHRoZSBjYW1lbENhc2UgbmFtaW5nIGNvbnZlbnRpb24sIGZvciBleGFtcGxlIGBvbkNsaWNrYC4nLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gTGV0IHRoZSBBUklBIGF0dHJpYnV0ZSBob29rIHZhbGlkYXRlIEFSSUEgYXR0cmlidXRlc1xuXG5cbiAgICBpZiAockFSSUEkMS50ZXN0KG5hbWUpIHx8IHJBUklBQ2FtZWwkMS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdpbm5lcmh0bWwnKSB7XG4gICAgICBlcnJvcignRGlyZWN0bHkgc2V0dGluZyBwcm9wZXJ0eSBgaW5uZXJIVE1MYCBpcyBub3QgcGVybWl0dGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBsb29rdXAgZG9jdW1lbnRhdGlvbiBvbiBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnYXJpYScpIHtcbiAgICAgIGVycm9yKCdUaGUgYGFyaWFgIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBpbiBSZWFjdC4gJyArICdQYXNzIGluZGl2aWR1YWwgYGFyaWEtYCBhdHRyaWJ1dGVzIGluc3RlYWQuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdpcycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYSBgJXNgIGZvciBhIHN0cmluZyBhdHRyaWJ1dGUgYGlzYC4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCB0eXBlb2YgdmFsdWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsdWUpKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgTmFOIGZvciB0aGUgYCVzYCBhdHRyaWJ1dGUuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgbmFtZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpO1xuICAgIHZhciBpc1Jlc2VydmVkID0gcHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRDsgLy8gS25vd24gYXR0cmlidXRlcyBzaG91bGQgbWF0Y2ggdGhlIGNhc2luZyBzcGVjaWZpZWQgaW4gdGhlIHByb3BlcnR5IGNvbmZpZy5cblxuICAgIGlmIChwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7XG4gICAgICB2YXIgc3RhbmRhcmROYW1lID0gcG9zc2libGVTdGFuZGFyZE5hbWVzW2xvd2VyQ2FzZWROYW1lXTtcblxuICAgICAgaWYgKHN0YW5kYXJkTmFtZSAhPT0gbmFtZSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBET00gcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgc3RhbmRhcmROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1Jlc2VydmVkICYmIG5hbWUgIT09IGxvd2VyQ2FzZWROYW1lKSB7XG4gICAgICAvLyBVbmtub3duIGF0dHJpYnV0ZXMgc2hvdWxkIGhhdmUgbG93ZXJjYXNlIGNhc2luZyBzaW5jZSB0aGF0J3MgaG93IHRoZXlcbiAgICAgIC8vIHdpbGwgYmUgY2FzZWQgYW55d2F5IHdpdGggc2VydmVyIHJlbmRlcmluZy5cbiAgICAgIGVycm9yKCdSZWFjdCBkb2VzIG5vdCByZWNvZ25pemUgdGhlIGAlc2AgcHJvcCBvbiBhIERPTSBlbGVtZW50LiBJZiB5b3UgJyArICdpbnRlbnRpb25hbGx5IHdhbnQgaXQgdG8gYXBwZWFyIGluIHRoZSBET00gYXMgYSBjdXN0b20gJyArICdhdHRyaWJ1dGUsIHNwZWxsIGl0IGFzIGxvd2VyY2FzZSBgJXNgIGluc3RlYWQuICcgKyAnSWYgeW91IGFjY2lkZW50YWxseSBwYXNzZWQgaXQgZnJvbSBhIHBhcmVudCBjb21wb25lbnQsIHJlbW92ZSAnICsgJ2l0IGZyb20gdGhlIERPTSBlbGVtZW50LicsIG5hbWUsIGxvd2VyQ2FzZWROYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBlcnJvcignUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG4nICsgJ0lmIHlvdSB3YW50IHRvIHdyaXRlIGl0IHRvIHRoZSBET00sIHBhc3MgYSBzdHJpbmcgaW5zdGVhZDogJyArICclcz1cIiVzXCIgb3IgJXM9e3ZhbHVlLnRvU3RyaW5nKCl9LicsIHZhbHVlLCBuYW1lLCBuYW1lLCB2YWx1ZSwgbmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG4nICsgJ0lmIHlvdSB3YW50IHRvIHdyaXRlIGl0IHRvIHRoZSBET00sIHBhc3MgYSBzdHJpbmcgaW5zdGVhZDogJyArICclcz1cIiVzXCIgb3IgJXM9e3ZhbHVlLnRvU3RyaW5nKCl9LlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lLCBuYW1lLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gTm93IHRoYXQgd2UndmUgdmFsaWRhdGVkIGNhc2luZywgZG8gbm90IHZhbGlkYXRlXG4gICAgLy8gZGF0YSB0eXBlcyBmb3IgcmVzZXJ2ZWQgcHJvcHNcblxuXG4gICAgaWYgKGlzUmVzZXJ2ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2FybiB3aGVuIGEga25vd24gYXR0cmlidXRlIGlzIGEgYmFkIHR5cGVcblxuXG4gICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIFdhcm4gd2hlbiBwYXNzaW5nIHRoZSBzdHJpbmdzICdmYWxzZScgb3IgJ3RydWUnIGludG8gYSBib29sZWFuIHByb3BcblxuXG4gICAgaWYgKCh2YWx1ZSA9PT0gJ2ZhbHNlJyB8fCB2YWx1ZSA9PT0gJ3RydWUnKSAmJiBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCB0aGUgc3RyaW5nIGAlc2AgZm9yIHRoZSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiAnICsgJyVzICcgKyAnRGlkIHlvdSBtZWFuICVzPXslc30/JywgdmFsdWUsIG5hbWUsIHZhbHVlID09PSAnZmFsc2UnID8gJ1RoZSBicm93c2VyIHdpbGwgaW50ZXJwcmV0IGl0IGFzIGEgdHJ1dGh5IHZhbHVlLicgOiAnQWx0aG91Z2ggdGhpcyB3b3JrcywgaXQgd2lsbCBub3Qgd29yayBhcyBleHBlY3RlZCBpZiB5b3UgcGFzcyB0aGUgc3RyaW5nIFwiZmFsc2VcIi4nLCBuYW1lLCB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxudmFyIHdhcm5Vbmtub3duUHJvcGVydGllcyA9IGZ1bmN0aW9uICh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSkge1xuICB7XG4gICAgdmFyIHVua25vd25Qcm9wcyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkkMSh0eXBlLCBrZXksIHByb3BzW2tleV0sIGV2ZW50UmVnaXN0cnkpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgdW5rbm93blByb3BzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSB1bmtub3duUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgICB9KS5qb2luKCcsICcpO1xuXG4gICAgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBwcm9wICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIGl0IGZyb20gdGhlIGVsZW1lbnQsICcgKyAnb3IgcGFzcyBhIHN0cmluZyBvciBudW1iZXIgdmFsdWUgdG8ga2VlcCBpdCBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciAnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfSBlbHNlIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID4gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWVzIGZvciBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gRWl0aGVyIHJlbW92ZSB0aGVtIGZyb20gdGhlIGVsZW1lbnQsICcgKyAnb3IgcGFzcyBhIHN0cmluZyBvciBudW1iZXIgdmFsdWUgdG8ga2VlcCB0aGVtIGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuVW5rbm93blByb3BlcnRpZXModHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpO1xufVxuXG52YXIgSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgPSAxO1xudmFyIElTX05PTl9ERUxFR0FURUQgPSAxIDw8IDE7XG52YXIgSVNfQ0FQVFVSRV9QSEFTRSA9IDEgPDwgMjtcbi8vIHNldCB0byBMRUdBQ1lfRkJfU1VQUE9SVC4gTEVHQUNZX0ZCX1NVUFBPUlQgb25seSBnZXRzIHNldCB3aGVuXG4vLyB3ZSBjYWxsIHdpbGxEZWZlckxhdGVyRm9yTGVnYWN5RkJTdXBwb3J0LCB0aHVzIG5vdCBiYWlsaW5nIG91dFxuLy8gd2lsbCByZXN1bHQgaW4gZW5kbGVzcyBjeWNsZXMgbGlrZSBhbiBpbmZpbml0ZSBsb29wLlxuLy8gV2UgYWxzbyBkb24ndCB3YW50IHRvIGRlZmVyIGR1cmluZyBldmVudCByZXBsYXlpbmcuXG5cbnZhciBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUyA9IElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFIHwgSVNfTk9OX0RFTEVHQVRFRCB8IElTX0NBUFRVUkVfUEhBU0U7XG5cbi8vIFRoaXMgZXhpc3RzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBSZWFjdERPTUV2ZW50UmVwbGF5aW5nXG4vLyBhbmQgRE9NUGx1Z2luRXZlbnRTeXN0ZW0uXG52YXIgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHNldFJlcGxheWluZ0V2ZW50KGV2ZW50KSB7XG4gIHtcbiAgICBpZiAoY3VycmVudFJlcGxheWluZ0V2ZW50ICE9PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgY3VycmVudGx5IHJlcGxheWluZyBldmVudCB0byBiZSBudWxsLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gZXZlbnQ7XG59XG5mdW5jdGlvbiByZXNldFJlcGxheWluZ0V2ZW50KCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gbm90IGJlIG51bGwuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBudWxsO1xufVxuZnVuY3Rpb24gaXNSZXBsYXlpbmdFdmVudChldmVudCkge1xuICByZXR1cm4gZXZlbnQgPT09IGN1cnJlbnRSZXBsYXlpbmdFdmVudDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0YXJnZXQgbm9kZSBmcm9tIGEgbmF0aXZlIGJyb3dzZXIgZXZlbnQgYnkgYWNjb3VudGluZyBmb3JcbiAqIGluY29uc2lzdGVuY2llcyBpbiBicm93c2VyIERPTSBBUElzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge0RPTUV2ZW50VGFyZ2V0fSBUYXJnZXQgbm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkge1xuICAvLyBGYWxsYmFjayB0byBuYXRpdmVFdmVudC5zcmNFbGVtZW50IGZvciBJRTlcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwNlxuICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93OyAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzXG5cbiAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkge1xuICAgIHRhcmdldCA9IHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudDtcbiAgfSAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRleHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RFIGlzIDMpLlxuICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbFxuXG5cbiAgcmV0dXJuIHRhcmdldC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXQ7XG59XG5cbnZhciByZXN0b3JlSW1wbCA9IG51bGw7XG52YXIgcmVzdG9yZVRhcmdldCA9IG51bGw7XG52YXIgcmVzdG9yZVF1ZXVlID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFdlIHBlcmZvcm0gdGhpcyB0cmFuc2xhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBsb29wIHNvIHRoYXQgd2VcbiAgLy8gYWx3YXlzIHJlY2VpdmUgdGhlIGNvcnJlY3QgZmliZXIgaGVyZVxuICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0KTtcblxuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAvLyBVbm1vdW50ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIHJlc3RvcmVJbXBsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oKSBuZWVkcyB0byBiZSBjYWxsZWQgdG8gaGFuZGxlIGEgdGFyZ2V0IGZvciBjb250cm9sbGVkICcgKyAnZXZlbnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgdmFyIHN0YXRlTm9kZSA9IGludGVybmFsSW5zdGFuY2Uuc3RhdGVOb2RlOyAvLyBHdWFyZCBhZ2FpbnN0IEZpYmVyIGJlaW5nIHVubW91bnRlZC5cblxuICBpZiAoc3RhdGVOb2RlKSB7XG4gICAgdmFyIF9wcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUoc3RhdGVOb2RlKTtcblxuICAgIHJlc3RvcmVJbXBsKGludGVybmFsSW5zdGFuY2Uuc3RhdGVOb2RlLCBpbnRlcm5hbEluc3RhbmNlLnR5cGUsIF9wcm9wcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKGltcGwpIHtcbiAgcmVzdG9yZUltcGwgPSBpbXBsO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVN0YXRlUmVzdG9yZSh0YXJnZXQpIHtcbiAgaWYgKHJlc3RvcmVUYXJnZXQpIHtcbiAgICBpZiAocmVzdG9yZVF1ZXVlKSB7XG4gICAgICByZXN0b3JlUXVldWUucHVzaCh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN0b3JlUXVldWUgPSBbdGFyZ2V0XTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdG9yZVRhcmdldCA9IHRhcmdldDtcbiAgfVxufVxuZnVuY3Rpb24gbmVlZHNTdGF0ZVJlc3RvcmUoKSB7XG4gIHJldHVybiByZXN0b3JlVGFyZ2V0ICE9PSBudWxsIHx8IHJlc3RvcmVRdWV1ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCkge1xuICBpZiAoIXJlc3RvcmVUYXJnZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdGFyZ2V0ID0gcmVzdG9yZVRhcmdldDtcbiAgdmFyIHF1ZXVlZFRhcmdldHMgPSByZXN0b3JlUXVldWU7XG4gIHJlc3RvcmVUYXJnZXQgPSBudWxsO1xuICByZXN0b3JlUXVldWUgPSBudWxsO1xuICByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpO1xuXG4gIGlmIChxdWV1ZWRUYXJnZXRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZWRUYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN0b3JlU3RhdGVPZlRhcmdldChxdWV1ZWRUYXJnZXRzW2ldKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gdGhlIHJlbmRlcmVyLiBTdWNoIGFzIHdoZW4gd2UncmUgZGlzcGF0Y2hpbmcgZXZlbnRzIG9yIGlmIHRoaXJkIHBhcnR5XG4vLyBsaWJyYXJpZXMgbmVlZCB0byBjYWxsIGJhdGNoZWRVcGRhdGVzLiBFdmVudHVhbGx5LCB0aGlzIEFQSSB3aWxsIGdvIGF3YXkgd2hlblxuLy8gZXZlcnl0aGluZyBpcyBiYXRjaGVkIGJ5IGRlZmF1bHQuIFdlJ2xsIHRoZW4gaGF2ZSBhIHNpbWlsYXIgQVBJIHRvIG9wdC1vdXQgb2Zcbi8vIHNjaGVkdWxlZCB3b3JrIGFuZCBpbnN0ZWFkIGRvIHN5bmNocm9ub3VzIHdvcmsuXG4vLyBEZWZhdWx0c1xuXG52YXIgYmF0Y2hlZFVwZGF0ZXNJbXBsID0gZnVuY3Rpb24gKGZuLCBib29ra2VlcGluZykge1xuICByZXR1cm4gZm4oYm9va2tlZXBpbmcpO1xufTtcblxudmFyIGZsdXNoU3luY0ltcGwgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZpbmlzaEV2ZW50SGFuZGxlcigpIHtcbiAgLy8gSGVyZSB3ZSB3YWl0IHVudGlsIGFsbCB1cGRhdGVzIGhhdmUgcHJvcGFnYXRlZCwgd2hpY2ggaXMgaW1wb3J0YW50XG4gIC8vIHdoZW4gdXNpbmcgY29udHJvbGxlZCBjb21wb25lbnRzIHdpdGhpbiBsYXllcnM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OFxuICAvLyBUaGVuIHdlIHJlc3RvcmUgc3RhdGUgb2YgYW55IGNvbnRyb2xsZWQgY29tcG9uZW50LlxuICB2YXIgY29udHJvbGxlZENvbXBvbmVudHNIYXZlUGVuZGluZ1VwZGF0ZXMgPSBuZWVkc1N0YXRlUmVzdG9yZSgpO1xuXG4gIGlmIChjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcykge1xuICAgIC8vIElmIGEgY29udHJvbGxlZCBldmVudCB3YXMgZmlyZWQsIHdlIG1heSBuZWVkIHRvIHJlc3RvcmUgdGhlIHN0YXRlIG9mXG4gICAgLy8gdGhlIERPTSBub2RlIGJhY2sgdG8gdGhlIGNvbnRyb2xsZWQgdmFsdWUuIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gUmVhY3RcbiAgICAvLyBiYWlscyBvdXQgb2YgdGhlIHVwZGF0ZSB3aXRob3V0IHRvdWNoaW5nIHRoZSBET00uXG4gICAgLy8gVE9ETzogUmVzdG9yZSBzdGF0ZSBpbiB0aGUgbWljcm90YXNrLCBhZnRlciB0aGUgZGlzY3JldGUgdXBkYXRlcyBmbHVzaCxcbiAgICAvLyBpbnN0ZWFkIG9mIGVhcmx5IGZsdXNoaW5nIHRoZW0gaGVyZS5cbiAgICBmbHVzaFN5bmNJbXBsKCk7XG4gICAgcmVzdG9yZVN0YXRlSWZOZWVkZWQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXRjaGVkVXBkYXRlcyhmbiwgYSwgYikge1xuICBpZiAoaXNJbnNpZGVFdmVudEhhbmRsZXIpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYSwgYik7XG4gIH1cblxuICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYmF0Y2hlZFVwZGF0ZXNJbXBsKGZuLCBhLCBiKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xuICAgIGZpbmlzaEV2ZW50SGFuZGxlcigpO1xuICB9XG59IC8vIFRPRE86IFJlcGxhY2Ugd2l0aCBmbHVzaFN5bmNcbmZ1bmN0aW9uIHNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oX2JhdGNoZWRVcGRhdGVzSW1wbCwgX2Rpc2NyZXRlVXBkYXRlc0ltcGwsIF9mbHVzaFN5bmNJbXBsKSB7XG4gIGJhdGNoZWRVcGRhdGVzSW1wbCA9IF9iYXRjaGVkVXBkYXRlc0ltcGw7XG4gIGZsdXNoU3luY0ltcGwgPSBfZmx1c2hTeW5jSW1wbDtcbn1cblxuZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpIHtcbiAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnO1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmV2ZW50TW91c2VFdmVudChuYW1lLCB0eXBlLCBwcm9wcykge1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdvbkNsaWNrJzpcbiAgICBjYXNlICdvbkNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGljayc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VEb3duJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bkNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZUNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VVcCc6XG4gICAgY2FzZSAnb25Nb3VzZVVwQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZUVudGVyJzpcbiAgICAgIHJldHVybiAhIShwcm9wcy5kaXNhYmxlZCAmJiBpc0ludGVyYWN0aXZlKHR5cGUpKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAqIEByZXR1cm4gez9mdW5jdGlvbn0gVGhlIHN0b3JlZCBjYWxsYmFjay5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgdmFyIHN0YXRlTm9kZSA9IGluc3Quc3RhdGVOb2RlO1xuXG4gIGlmIChzdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzIChleDogb25sb2FkIGV2ZW50cyBpbiBpbmNyZW1lbnRhbCBtb2RlKS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUoc3RhdGVOb2RlKTtcblxuICBpZiAocHJvcHMgPT09IG51bGwpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gcHJvcHNbcmVnaXN0cmF0aW9uTmFtZV07XG5cbiAgaWYgKHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGluc3QudHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobGlzdGVuZXIgJiYgdHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgYFwiICsgcmVnaXN0cmF0aW9uTmFtZSArIFwiYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGBcIiArIHR5cGVvZiBsaXN0ZW5lciArIFwiYCB0eXBlLlwiKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxudmFyIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gZmFsc2U7IC8vIENoZWNrIGlmIGJyb3dzZXIgc3VwcG9ydCBldmVudHMgd2l0aCBwYXNzaXZlIGxpc3RlbmVyc1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L2FkZEV2ZW50TGlzdGVuZXIjU2FmZWx5X2RldGVjdGluZ19vcHRpb25fc3VwcG9ydFxuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHRyeSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7fTsgLy8gJEZsb3dGaXhNZTogSWdub3JlIEZsb3cgY29tcGxhaW5pbmcgYWJvdXQgbmVlZGluZyBhIHZhbHVlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9ucywgJ3Bhc3NpdmUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZChuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBmdW5jQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG5cbiAgdHJ5IHtcbiAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICB9XG59XG5cbnZhciBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZDtcblxue1xuICAvLyBJbiBERVYgbW9kZSwgd2Ugc3dhcCBvdXQgaW52b2tlR3VhcmRlZENhbGxiYWNrIGZvciBhIHNwZWNpYWwgdmVyc2lvblxuICAvLyB0aGF0IHBsYXlzIG1vcmUgbmljZWx5IHdpdGggdGhlIGJyb3dzZXIncyBEZXZUb29scy4gVGhlIGlkZWEgaXMgdG8gcHJlc2VydmVcbiAgLy8gXCJQYXVzZSBvbiBleGNlcHRpb25zXCIgYmVoYXZpb3IuIEJlY2F1c2UgUmVhY3Qgd3JhcHMgYWxsIHVzZXItcHJvdmlkZWRcbiAgLy8gZnVuY3Rpb25zIGluIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYW5kIHRoZSBwcm9kdWN0aW9uIHZlcnNpb24gb2ZcbiAgLy8gaW52b2tlR3VhcmRlZENhbGxiYWNrIHVzZXMgYSB0cnktY2F0Y2gsIGFsbCB1c2VyIGV4Y2VwdGlvbnMgYXJlIHRyZWF0ZWRcbiAgLy8gbGlrZSBjYXVnaHQgZXhjZXB0aW9ucywgYW5kIHRoZSBEZXZUb29scyB3b24ndCBwYXVzZSB1bmxlc3MgdGhlIGRldmVsb3BlclxuICAvLyB0YWtlcyB0aGUgZXh0cmEgc3RlcCBvZiBlbmFibGluZyBwYXVzZSBvbiBjYXVnaHQgZXhjZXB0aW9ucy4gVGhpcyBpc1xuICAvLyB1bmludHVpdGl2ZSwgdGhvdWdoLCBiZWNhdXNlIGV2ZW4gdGhvdWdoIFJlYWN0IGhhcyBjYXVnaHQgdGhlIGVycm9yLCBmcm9tXG4gIC8vIHRoZSBkZXZlbG9wZXIncyBwZXJzcGVjdGl2ZSwgdGhlIGVycm9yIGlzIHVuY2F1Z2h0LlxuICAvL1xuICAvLyBUbyBwcmVzZXJ2ZSB0aGUgZXhwZWN0ZWQgXCJQYXVzZSBvbiBleGNlcHRpb25zXCIgYmVoYXZpb3IsIHdlIGRvbid0IHVzZSBhXG4gIC8vIHRyeS1jYXRjaCBpbiBERVYuIEluc3RlYWQsIHdlIHN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggYSBmYWtlIGV2ZW50IHRvIGEgZmFrZVxuICAvLyBET00gbm9kZSwgYW5kIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2sgZnJvbSBpbnNpZGUgYW4gZXZlbnQgaGFuZGxlclxuICAvLyBmb3IgdGhhdCBmYWtlIGV2ZW50LiBJZiB0aGUgY2FsbGJhY2sgdGhyb3dzLCB0aGUgZXJyb3IgaXMgXCJjYXB0dXJlZFwiIHVzaW5nXG4gIC8vIGEgZ2xvYmFsIGV2ZW50IGhhbmRsZXIuIEJ1dCBiZWNhdXNlIHRoZSBlcnJvciBoYXBwZW5zIGluIGEgZGlmZmVyZW50XG4gIC8vIGV2ZW50IGxvb3AgY29udGV4dCwgaXQgZG9lcyBub3QgaW50ZXJydXB0IHRoZSBub3JtYWwgcHJvZ3JhbSBmbG93LlxuICAvLyBFZmZlY3RpdmVseSwgdGhpcyBnaXZlcyB1cyB0cnktY2F0Y2ggYmVoYXZpb3Igd2l0aG91dCBhY3R1YWxseSB1c2luZ1xuICAvLyB0cnktY2F0Y2guIE5lYXQhXG4gIC8vIENoZWNrIHRoYXQgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEFQSXMgd2UgbmVlZCB0byBpbXBsZW1lbnQgb3VyIHNwZWNpYWxcbiAgLy8gREVWIHZlcnNpb24gb2YgaW52b2tlR3VhcmRlZENhbGxiYWNrXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmFrZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdyZWFjdCcpO1xuXG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCA9IGZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja0RldihuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgICAvLyBJZiBkb2N1bWVudCBkb2Vzbid0IGV4aXN0IHdlIGtub3cgZm9yIHN1cmUgd2Ugd2lsbCBjcmFzaCBpbiB0aGlzIG1ldGhvZFxuICAgICAgLy8gd2hlbiB3ZSBjYWxsIGRvY3VtZW50LmNyZWF0ZUV2ZW50KCkuIEhvd2V2ZXIgdGhpcyBjYW4gY2F1c2UgY29uZnVzaW5nXG4gICAgICAvLyBlcnJvcnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9jcmVhdGUtcmVhY3QtYXBwL2lzc3Vlcy8zNDgyXG4gICAgICAvLyBTbyB3ZSBwcmVlbXB0aXZlbHkgdGhyb3cgd2l0aCBhIGJldHRlciBtZXNzYWdlIGluc3RlYWQuXG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCBkb2N1bWVudCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgZG9jdW1lbnRgIGdsb2JhbCB3YXMgZGVmaW5lZCB3aGVuIFJlYWN0IHdhcyBpbml0aWFsaXplZCwgYnV0IGlzIG5vdCAnICsgJ2RlZmluZWQgYW55bW9yZS4gVGhpcyBjYW4gaGFwcGVuIGluIGEgdGVzdCBlbnZpcm9ubWVudCBpZiBhIGNvbXBvbmVudCAnICsgJ3NjaGVkdWxlcyBhbiB1cGRhdGUgZnJvbSBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGJ1dCB0aGUgdGVzdCBoYXMgYWxyZWFkeSAnICsgJ2ZpbmlzaGVkIHJ1bm5pbmcuIFRvIHNvbHZlIHRoaXMsIHlvdSBjYW4gZWl0aGVyIHVubW91bnQgdGhlIGNvbXBvbmVudCBhdCAnICsgJ3RoZSBlbmQgb2YgeW91ciB0ZXN0IChhbmQgZW5zdXJlIHRoYXQgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGdldCAnICsgJ2NhbmNlbGVkIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGApLCBvciB5b3UgY2FuIGNoYW5nZSB0aGUgdGVzdCBpdHNlbGYgJyArICd0byBiZSBhc3luY2hyb25vdXMuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICAgIHZhciBkaWRDYWxsID0gZmFsc2U7IC8vIEtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3IuIFdlXG4gICAgICAvLyBzZXQgdGhpcyB0byB0cnVlIGF0IHRoZSBiZWdpbm5pbmcsIHRoZW4gc2V0IGl0IHRvIGZhbHNlIHJpZ2h0IGFmdGVyXG4gICAgICAvLyBjYWxsaW5nIHRoZSBmdW5jdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIGVycm9ycywgYGRpZEVycm9yYCB3aWxsIG5ldmVyIGJlXG4gICAgICAvLyBzZXQgdG8gZmFsc2UuIFRoaXMgc3RyYXRlZ3kgd29ya3MgZXZlbiBpZiB0aGUgYnJvd3NlciBpcyBmbGFreSBhbmRcbiAgICAgIC8vIGZhaWxzIHRvIGNhbGwgb3VyIGdsb2JhbCBlcnJvciBoYW5kbGVyLCBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVseSBvblxuICAgICAgLy8gdGhlIGVycm9yIGV2ZW50IGF0IGFsbC5cblxuICAgICAgdmFyIGRpZEVycm9yID0gdHJ1ZTsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHZhbHVlIG9mIHdpbmRvdy5ldmVudCBzbyB0aGF0IHdlIGNhbiByZXNldCBpdFxuICAgICAgLy8gZHVyaW5nIHRoZSBjYWxsYmFjayB0byBsZXQgdXNlciBjb2RlIGFjY2VzcyB3aW5kb3cuZXZlbnQgaW4gdGhlXG4gICAgICAvLyBicm93c2VycyB0aGF0IHN1cHBvcnQgaXQuXG5cbiAgICAgIHZhciB3aW5kb3dFdmVudCA9IHdpbmRvdy5ldmVudDsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIGRlc2NyaXB0b3Igb2Ygd2luZG93LmV2ZW50IHRvIHJlc3RvcmUgaXQgYWZ0ZXIgZXZlbnRcbiAgICAgIC8vIGRpc3BhdGNoaW5nOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjg4XG5cbiAgICAgIHZhciB3aW5kb3dFdmVudERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2V2ZW50Jyk7XG5cbiAgICAgIGZ1bmN0aW9uIHJlc3RvcmVBZnRlckRpc3BhdGNoKCkge1xuICAgICAgICAvLyBXZSBpbW1lZGlhdGVseSByZW1vdmUgdGhlIGNhbGxiYWNrIGZyb20gZXZlbnQgbGlzdGVuZXJzIHNvIHRoYXRcbiAgICAgICAgLy8gbmVzdGVkIGBpbnZva2VHdWFyZGVkQ2FsbGJhY2tgIGNhbGxzIGRvIG5vdCBjbGFzaC4gT3RoZXJ3aXNlLCBhXG4gICAgICAgIC8vIG5lc3RlZCBjYWxsIHdvdWxkIHRyaWdnZXIgdGhlIGZha2UgZXZlbnQgaGFuZGxlcnMgb2YgYW55IGNhbGwgaGlnaGVyXG4gICAgICAgIC8vIGluIHRoZSBzdGFjay5cbiAgICAgICAgZmFrZU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTsgLy8gV2UgY2hlY2sgZm9yIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSB0byBwcmV2ZW50IHRoZVxuICAgICAgICAvLyB3aW5kb3cuZXZlbnQgYXNzaWdubWVudCBpbiBib3RoIElFIDw9IDEwIGFzIHRoZXkgdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgLy8gXCJNZW1iZXIgbm90IGZvdW5kXCIgaW4gc3RyaWN0IG1vZGUsIGFuZCBpbiBGaXJlZm94IHdoaWNoIGRvZXMgbm90XG4gICAgICAgIC8vIHN1cHBvcnQgd2luZG93LmV2ZW50LlxuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmV2ZW50ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykpIHtcbiAgICAgICAgICB3aW5kb3cuZXZlbnQgPSB3aW5kb3dFdmVudDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYW4gZXZlbnQgaGFuZGxlciBmb3Igb3VyIGZha2UgZXZlbnQuIFdlIHdpbGwgc3luY2hyb25vdXNseVxuICAgICAgLy8gZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQgdXNpbmcgYGRpc3BhdGNoRXZlbnRgLiBJbnNpZGUgdGhlIGhhbmRsZXIsIHdlXG4gICAgICAvLyBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrLlxuXG5cbiAgICAgIHZhciBmdW5jQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG5cbiAgICAgIGZ1bmN0aW9uIGNhbGxDYWxsYmFjaygpIHtcbiAgICAgICAgZGlkQ2FsbCA9IHRydWU7XG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICAgICAgICBkaWRFcnJvciA9IGZhbHNlO1xuICAgICAgfSAvLyBDcmVhdGUgYSBnbG9iYWwgZXJyb3IgZXZlbnQgaGFuZGxlci4gV2UgdXNlIHRoaXMgdG8gY2FwdHVyZSB0aGUgdmFsdWVcbiAgICAgIC8vIHRoYXQgd2FzIHRocm93bi4gSXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgZXJyb3IgaGFuZGxlciB3aWxsIGZpcmUgbW9yZVxuICAgICAgLy8gdGhhbiBvbmNlOyBmb3IgZXhhbXBsZSwgaWYgbm9uLVJlYWN0IGNvZGUgYWxzbyBjYWxscyBgZGlzcGF0Y2hFdmVudGBcbiAgICAgIC8vIGFuZCBhIGhhbmRsZXIgZm9yIHRoYXQgZXZlbnQgdGhyb3dzLiBXZSBzaG91bGQgYmUgcmVzaWxpZW50IHRvIG1vc3Qgb2ZcbiAgICAgIC8vIHRob3NlIGNhc2VzLiBFdmVuIGlmIG91ciBlcnJvciBldmVudCBoYW5kbGVyIGZpcmVzIG1vcmUgdGhhbiBvbmNlLCB0aGVcbiAgICAgIC8vIGxhc3QgZXJyb3IgZXZlbnQgaXMgYWx3YXlzIHVzZWQuIElmIHRoZSBjYWxsYmFjayBhY3R1YWxseSBkb2VzIGVycm9yLFxuICAgICAgLy8gd2Uga25vdyB0aGF0IHRoZSBsYXN0IGVycm9yIGV2ZW50IGlzIHRoZSBjb3JyZWN0IG9uZSwgYmVjYXVzZSBpdCdzIG5vdFxuICAgICAgLy8gcG9zc2libGUgZm9yIGFueXRoaW5nIGVsc2UgdG8gaGF2ZSBoYXBwZW5lZCBpbiBiZXR3ZWVuIG91ciBjYWxsYmFja1xuICAgICAgLy8gZXJyb3JpbmcgYW5kIHRoZSBjb2RlIHRoYXQgZm9sbG93cyB0aGUgYGRpc3BhdGNoRXZlbnRgIGNhbGwgYmVsb3cuIElmXG4gICAgICAvLyB0aGUgY2FsbGJhY2sgZG9lc24ndCBlcnJvciwgYnV0IHRoZSBlcnJvciBldmVudCB3YXMgZmlyZWQsIHdlIGtub3cgdG9cbiAgICAgIC8vIGlnbm9yZSBpdCBiZWNhdXNlIGBkaWRFcnJvcmAgd2lsbCBiZSBmYWxzZSwgYXMgZGVzY3JpYmVkIGFib3ZlLlxuXG5cbiAgICAgIHZhciBlcnJvcjsgLy8gVXNlIHRoaXMgdG8gdHJhY2sgd2hldGhlciB0aGUgZXJyb3IgZXZlbnQgaXMgZXZlciBjYWxsZWQuXG5cbiAgICAgIHZhciBkaWRTZXRFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIGlzQ3Jvc3NPcmlnaW5FcnJvciA9IGZhbHNlO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVXaW5kb3dFcnJvcihldmVudCkge1xuICAgICAgICBlcnJvciA9IGV2ZW50LmVycm9yO1xuICAgICAgICBkaWRTZXRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgaWYgKGVycm9yID09PSBudWxsICYmIGV2ZW50LmNvbG5vID09PSAwICYmIGV2ZW50LmxpbmVubyA9PT0gMCkge1xuICAgICAgICAgIGlzQ3Jvc3NPcmlnaW5FcnJvciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IgaGFuZGxlciBoYXMgcHJldmVudGVkIGRlZmF1bHQuXG4gICAgICAgICAgLy8gQnJvd3NlcnMgc2lsZW5jZSB0aGUgZXJyb3IgcmVwb3J0IGlmIHRoaXMgaGFwcGVucy5cbiAgICAgICAgICAvLyBXZSdsbCByZW1lbWJlciB0aGlzIHRvIGxhdGVyIGRlY2lkZSB3aGV0aGVyIHRvIGxvZyBpdCBvciBub3QuXG4gICAgICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZXJyb3IuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChpbm5lcikgey8vIElnbm9yZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy8gQ3JlYXRlIGEgZmFrZSBldmVudCB0eXBlLlxuXG5cbiAgICAgIHZhciBldnRUeXBlID0gXCJyZWFjdC1cIiArIChuYW1lID8gbmFtZSA6ICdpbnZva2VndWFyZGVkY2FsbGJhY2snKTsgLy8gQXR0YWNoIG91ciBldmVudCBoYW5kbGVyc1xuXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoYW5kbGVXaW5kb3dFcnJvcik7XG4gICAgICBmYWtlTm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBTeW5jaHJvbm91c2x5IGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50LiBJZiB0aGUgdXNlci1wcm92aWRlZCBmdW5jdGlvblxuICAgICAgLy8gZXJyb3JzLCBpdCB3aWxsIHRyaWdnZXIgb3VyIGdsb2JhbCBlcnJvciBoYW5kbGVyLlxuXG4gICAgICBldnQuaW5pdEV2ZW50KGV2dFR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gICAgICBmYWtlTm9kZS5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cbiAgICAgIGlmICh3aW5kb3dFdmVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2V2ZW50Jywgd2luZG93RXZlbnREZXNjcmlwdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpZENhbGwgJiYgZGlkRXJyb3IpIHtcbiAgICAgICAgaWYgKCFkaWRTZXRFcnJvcikge1xuICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBlcnJvcmVkLCBidXQgdGhlIGVycm9yIGV2ZW50IG5ldmVyIGZpcmVkLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0FuIGVycm9yIHdhcyB0aHJvd24gaW5zaWRlIG9uZSBvZiB5b3VyIGNvbXBvbmVudHMsIGJ1dCBSZWFjdCAnICsgXCJkb2Vzbid0IGtub3cgd2hhdCBpdCB3YXMuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBicm93c2VyIFwiICsgJ2ZsYWtpbmVzcy4gUmVhY3QgZG9lcyBpdHMgYmVzdCB0byBwcmVzZXJ2ZSB0aGUgXCJQYXVzZSBvbiAnICsgJ2V4Y2VwdGlvbnNcIiBiZWhhdmlvciBvZiB0aGUgRGV2VG9vbHMsIHdoaWNoIHJlcXVpcmVzIHNvbWUgJyArIFwiREVWLW1vZGUgb25seSB0cmlja3MuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVzZSBkb24ndCB3b3JrIGluIFwiICsgJ3lvdXIgYnJvd3Nlci4gVHJ5IHRyaWdnZXJpbmcgdGhlIGVycm9yIGluIHByb2R1Y3Rpb24gbW9kZSwgJyArICdvciBzd2l0Y2hpbmcgdG8gYSBtb2Rlcm4gYnJvd3Nlci4gSWYgeW91IHN1c3BlY3QgdGhhdCB0aGlzIGlzICcgKyAnYWN0dWFsbHkgYW4gaXNzdWUgd2l0aCBSZWFjdCwgcGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDcm9zc09yaWdpbkVycm9yKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcIkEgY3Jvc3Mtb3JpZ2luIGVycm9yIHdhcyB0aHJvd24uIFJlYWN0IGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gXCIgKyAndGhlIGFjdHVhbCBlcnJvciBvYmplY3QgaW4gZGV2ZWxvcG1lbnQuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jcm9zc29yaWdpbi1lcnJvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICB9IC8vIFJlbW92ZSBvdXIgZXZlbnQgbGlzdGVuZXJzXG5cblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuXG4gICAgICBpZiAoIWRpZENhbGwpIHtcbiAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nLCBhbmQgb3VyIGV2ZW50IHdhcyBub3QgZGlzcGF0Y2hlZC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjczNFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2NTg1XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgcHJvZHVjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgcmV0dXJuIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbnZhciBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsJDEgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsO1xuXG52YXIgaGFzRXJyb3IgPSBmYWxzZTtcbnZhciBjYXVnaHRFcnJvciA9IG51bGw7IC8vIFVzZWQgYnkgZXZlbnQgc3lzdGVtIHRvIGNhcHR1cmUvcmV0aHJvdyB0aGUgZmlyc3QgZXJyb3IuXG5cbnZhciBoYXNSZXRocm93RXJyb3IgPSBmYWxzZTtcbnZhciByZXRocm93RXJyb3IgPSBudWxsO1xudmFyIHJlcG9ydGVyID0ge1xuICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgfVxufTtcbi8qKlxuICogQ2FsbCBhIGZ1bmN0aW9uIHdoaWxlIGd1YXJkaW5nIGFnYWluc3QgZXJyb3JzIHRoYXQgaGFwcGVucyB3aXRoaW4gaXQuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIGl0IHRocm93cywgb3RoZXJ3aXNlIG51bGwuXG4gKlxuICogSW4gcHJvZHVjdGlvbiwgdGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHRyeS1jYXRjaC4gVGhlIHJlYXNvbiB3ZSBkb24ndFxuICogdXNlIGEgdHJ5LWNhdGNoIGRpcmVjdGx5IGlzIHNvIHRoYXQgd2UgY2FuIHN3YXAgb3V0IGEgZGlmZmVyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiBpbiBERVYgbW9kZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsJDEuYXBwbHkocmVwb3J0ZXIsIGFyZ3VtZW50cyk7XG59XG4vKipcbiAqIFNhbWUgYXMgaW52b2tlR3VhcmRlZENhbGxiYWNrLCBidXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZXJyb3IsIGl0IHN0b3Jlc1xuICogaXQgaW4gYSBnbG9iYWwgc28gaXQgY2FuIGJlIHJldGhyb3duIGJ5IGByZXRocm93Q2F1Z2h0RXJyb3JgIGxhdGVyLlxuICogVE9ETzogU2VlIGlmIGNhdWdodEVycm9yIGFuZCByZXRocm93RXJyb3IgY2FuIGJlIHVuaWZpZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja0FuZENhdGNoRmlyc3RFcnJvcihuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgIGlmICghaGFzUmV0aHJvd0Vycm9yKSB7XG4gICAgICBoYXNSZXRocm93RXJyb3IgPSB0cnVlO1xuICAgICAgcmV0aHJvd0Vycm9yID0gZXJyb3I7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIER1cmluZyBleGVjdXRpb24gb2YgZ3VhcmRlZCBmdW5jdGlvbnMgd2Ugd2lsbCBjYXB0dXJlIHRoZSBmaXJzdCBlcnJvciB3aGljaFxuICogd2Ugd2lsbCByZXRocm93IHRvIGJlIGhhbmRsZWQgYnkgdGhlIHRvcCBsZXZlbCBlcnJvciBoYW5kbGVyLlxuICovXG5cbmZ1bmN0aW9uIHJldGhyb3dDYXVnaHRFcnJvcigpIHtcbiAgaWYgKGhhc1JldGhyb3dFcnJvcikge1xuICAgIHZhciBlcnJvciA9IHJldGhyb3dFcnJvcjtcbiAgICBoYXNSZXRocm93RXJyb3IgPSBmYWxzZTtcbiAgICByZXRocm93RXJyb3IgPSBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5mdW5jdGlvbiBoYXNDYXVnaHRFcnJvcigpIHtcbiAgcmV0dXJuIGhhc0Vycm9yO1xufVxuZnVuY3Rpb24gY2xlYXJDYXVnaHRFcnJvcigpIHtcbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2F1Z2h0RXJyb3I7XG4gICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBjYXVnaHRFcnJvciA9IG51bGw7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJDYXVnaHRFcnJvciB3YXMgY2FsbGVkIGJ1dCBubyBlcnJvciB3YXMgY2FwdHVyZWQuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIGBSZWFjdEluc3RhbmNlTWFwYCBtYWludGFpbnMgYSBtYXBwaW5nIGZyb20gYSBwdWJsaWMgZmFjaW5nIHN0YXRlZnVsXG4gKiBpbnN0YW5jZSAoa2V5KSBhbmQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uICh2YWx1ZSkuIFRoaXMgYWxsb3dzIHB1YmxpY1xuICogbWV0aG9kcyB0byBhY2NlcHQgdGhlIHVzZXIgZmFjaW5nIGluc3RhbmNlIGFzIGFuIGFyZ3VtZW50IGFuZCBtYXAgdGhlbSBiYWNrXG4gKiB0byBpbnRlcm5hbCBtZXRob2RzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBpcyBjdXJyZW50bHkgc2hhcmVkIGFuZCBhc3N1bWVkIHRvIGJlIHN0YXRlbGVzcy5cbiAqIElmIHRoaXMgYmVjb21lcyBhbiBhY3R1YWwgTWFwLCB0aGF0IHdpbGwgYnJlYWsuXG4gKi9cbmZ1bmN0aW9uIGdldChrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHM7XG59XG5mdW5jdGlvbiBoYXMoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxzICE9PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICBrZXkuX3JlYWN0SW50ZXJuYWxzID0gdmFsdWU7XG59XG5cbi8vIERvbid0IGNoYW5nZSB0aGVzZSB0d28gdmFsdWVzLiBUaGV5J3JlIHVzZWQgYnkgUmVhY3QgRGV2IFRvb2xzLlxudmFyIE5vRmxhZ3MgPVxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgUGVyZm9ybWVkV29yayA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTsgLy8gWW91IGNhbiBjaGFuZ2UgdGhlIHJlc3QgKGFuZCBhZGQgbW9yZSkuXG5cbnZhciBQbGFjZW1lbnQgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yO1xudmFyIFVwZGF0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQ7XG52YXIgQ2hpbGREZWxldGlvbiA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ29udGVudFJlc2V0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgQ2FsbGJhY2sgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgRGlkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIEZvcmNlQ2xpZW50UmVuZGVyID1cbi8qICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBSZWYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7XG52YXIgU25hcHNob3QgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBQYXNzaXZlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG4yMDQ4O1xudmFyIEh5ZHJhdGluZyA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVmlzaWJpbGl0eSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuODE5MjtcbnZhciBTdG9yZUNvbnNpc3RlbmN5ID1cbi8qICAgICAgICAgICAgICovXG4xNjM4NDtcbnZhciBMaWZlY3ljbGVFZmZlY3RNYXNrID0gUGFzc2l2ZSB8IFVwZGF0ZSB8IENhbGxiYWNrIHwgUmVmIHwgU25hcHNob3QgfCBTdG9yZUNvbnNpc3RlbmN5OyAvLyBVbmlvbiBvZiBhbGwgY29tbWl0IGZsYWdzIChmbGFncyB3aXRoIHRoZSBsaWZldGltZSBvZiBhIHBhcnRpY3VsYXIgY29tbWl0KVxuXG52YXIgSG9zdEVmZmVjdE1hc2sgPVxuLyogICAgICAgICAgICAgICAqL1xuMzI3Njc7IC8vIFRoZXNlIGFyZSBub3QgcmVhbGx5IHNpZGUgZWZmZWN0cywgYnV0IHdlIHN0aWxsIHJldXNlIHRoaXMgZmllbGQuXG5cbnZhciBJbmNvbXBsZXRlID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4zMjc2ODtcbnZhciBTaG91bGRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICovXG42NTUzNjtcbnZhciBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlID1cbi8qICovXG4xMzEwNzI7XG52YXIgRm9ya2VkID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTA0ODU3NjsgLy8gU3RhdGljIHRhZ3MgZGVzY3JpYmUgYXNwZWN0cyBvZiBhIGZpYmVyIHRoYXQgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHJlbmRlcixcbi8vIGUuZy4gYSBmaWJlciB1c2VzIGEgcGFzc2l2ZSBlZmZlY3QgKGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHVwZGF0ZXMgb24gdGhpcyBwYXJ0aWN1bGFyIHJlbmRlcikuXG4vLyBUaGlzIGVuYWJsZXMgdXMgdG8gZGVmZXIgbW9yZSB3b3JrIGluIHRoZSB1bm1vdW50IGNhc2UsXG4vLyBzaW5jZSB3ZSBjYW4gZGVmZXIgdHJhdmVyc2luZyB0aGUgdHJlZSBkdXJpbmcgbGF5b3V0IHRvIGxvb2sgZm9yIFBhc3NpdmUgZWZmZWN0cyxcbi8vIGFuZCBpbnN0ZWFkIHJlbHkgb24gdGhlIHN0YXRpYyBmbGFnIGFzIGEgc2lnbmFsIHRoYXQgdGhlcmUgbWF5IGJlIGNsZWFudXAgd29yay5cblxudmFyIFJlZlN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjIwOTcxNTI7XG52YXIgTGF5b3V0U3RhdGljID1cbi8qICAgICAgICAgICAgICAgICAqL1xuNDE5NDMwNDtcbnZhciBQYXNzaXZlU3RhdGljID1cbi8qICAgICAgICAgICAgICAgICovXG44Mzg4NjA4OyAvLyBUaGVzZSBmbGFncyBhbGxvdyB1cyB0byB0cmF2ZXJzZSB0byBmaWJlcnMgdGhhdCBoYXZlIGVmZmVjdHMgb24gbW91bnRcbi8vIHdpdGhvdXQgdHJhdmVyc2luZyB0aGUgZW50aXJlIHRyZWUgYWZ0ZXIgZXZlcnkgY29tbWl0IGZvclxuLy8gZG91YmxlIGludm9raW5nXG5cbnZhciBNb3VudExheW91dERldiA9XG4vKiAgICAgICAgICAgICAgICovXG4xNjc3NzIxNjtcbnZhciBNb3VudFBhc3NpdmVEZXYgPVxuLyogICAgICAgICAgICAgICovXG4zMzU1NDQzMjsgLy8gR3JvdXBzIG9mIGZsYWdzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGNvbW1pdCBwaGFzZSB0byBza2lwIG92ZXIgdHJlZXMgdGhhdFxuLy8gZG9uJ3QgY29udGFpbiBlZmZlY3RzLCBieSBjaGVja2luZyBzdWJ0cmVlRmxhZ3MuXG5cbnZhciBCZWZvcmVNdXRhdGlvbk1hc2sgPSAvLyBUT0RPOiBSZW1vdmUgVXBkYXRlIGZsYWcgZnJvbSBiZWZvcmUgbXV0YXRpb24gcGhhc2UgYnkgcmUtbGFuZGluZyBWaXNpYmlsaXR5XG4vLyBmbGFnIGxvZ2ljIChzZWUgIzIwMDQzKVxuVXBkYXRlIHwgU25hcHNob3QgfCAoIDApO1xudmFyIE11dGF0aW9uTWFzayA9IFBsYWNlbWVudCB8IFVwZGF0ZSB8IENoaWxkRGVsZXRpb24gfCBDb250ZW50UmVzZXQgfCBSZWYgfCBIeWRyYXRpbmcgfCBWaXNpYmlsaXR5O1xudmFyIExheW91dE1hc2sgPSBVcGRhdGUgfCBDYWxsYmFjayB8IFJlZiB8IFZpc2liaWxpdHk7IC8vIFRPRE86IFNwbGl0IGludG8gUGFzc2l2ZU1vdW50TWFzayBhbmQgUGFzc2l2ZVVubW91bnRNYXNrXG5cbnZhciBQYXNzaXZlTWFzayA9IFBhc3NpdmUgfCBDaGlsZERlbGV0aW9uOyAvLyBVbmlvbiBvZiB0YWdzIHRoYXQgZG9uJ3QgZ2V0IHJlc2V0IG9uIGNsb25lcy5cbi8vIFRoaXMgYWxsb3dzIGNlcnRhaW4gY29uY2VwdHMgdG8gcGVyc2lzdCB3aXRob3V0IHJlY2FsY3VsYXRpbmcgdGhlbSxcbi8vIGUuZy4gd2hldGhlciBhIHN1YnRyZWUgY29udGFpbnMgcGFzc2l2ZSBlZmZlY3RzIG9yIHBvcnRhbHMuXG5cbnZhciBTdGF0aWNNYXNrID0gTGF5b3V0U3RhdGljIHwgUGFzc2l2ZVN0YXRpYyB8IFJlZlN0YXRpYztcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG5mdW5jdGlvbiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSB7XG4gIHZhciBub2RlID0gZmliZXI7XG4gIHZhciBuZWFyZXN0TW91bnRlZCA9IGZpYmVyO1xuXG4gIGlmICghZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGlzIG1pZ2h0IGJlIGEgbmV3IHRyZWUgdGhhdCBpc24ndCBpbnNlcnRlZFxuICAgIC8vIHlldC4gSWYgaXQgaXMsIHRoZW4gaXQgd2lsbCBoYXZlIGEgcGVuZGluZyBpbnNlcnRpb24gZWZmZWN0IG9uIGl0LlxuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGU7XG5cbiAgICBkbyB7XG4gICAgICBub2RlID0gbmV4dE5vZGU7XG5cbiAgICAgIGlmICgobm9kZS5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbiBvciBpbi1wcm9ncmVzcyBoeWRyYXRpb24uIFRoZSBuZWFyZXN0IHBvc3NpYmxlXG4gICAgICAgIC8vIG1vdW50ZWQgZmliZXIgaXMgdGhlIHBhcmVudCBidXQgd2UgbmVlZCB0byBjb250aW51ZSB0byBmaWd1cmUgb3V0XG4gICAgICAgIC8vIGlmIHRoYXQgb25lIGlzIHN0aWxsIG1vdW50ZWQuXG4gICAgICAgIG5lYXJlc3RNb3VudGVkID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHROb2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobmV4dE5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChub2RlLnJldHVybikge1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBUT0RPOiBDaGVjayBpZiB0aGlzIHdhcyBhIG5lc3RlZCBIb3N0Um9vdCB3aGVuIHVzZWQgd2l0aFxuICAgIC8vIHJlbmRlckNvbnRhaW5lckludG9TdWJ0cmVlLlxuICAgIHJldHVybiBuZWFyZXN0TW91bnRlZDtcbiAgfSAvLyBJZiB3ZSBkaWRuJ3QgaGl0IHRoZSByb290LCB0aGF0IG1lYW5zIHRoYXQgd2UncmUgaW4gYW4gZGlzY29ubmVjdGVkIHRyZWVcbiAgLy8gdGhhdCBoYXMgYmVlbiB1bm1vdW50ZWQuXG5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRDb250YWluZXJGcm9tRmliZXIoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QgPyBmaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA6IG51bGw7XG59XG5mdW5jdGlvbiBpc0ZpYmVyTW91bnRlZChmaWJlcikge1xuICByZXR1cm4gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgPT09IGZpYmVyO1xufVxuZnVuY3Rpb24gaXNNb3VudGVkKGNvbXBvbmVudCkge1xuICB7XG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgb3duZXJGaWJlciA9IG93bmVyO1xuICAgICAgdmFyIGluc3RhbmNlID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICghaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgaXNNb3VudGVkIGluc2lkZSBpdHMgcmVuZGVyKCkgZnVuY3Rpb24uICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyRmliZXIpIHx8ICdBIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuXG4gIGlmICghZmliZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgPT09IGZpYmVyO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRJc01vdW50ZWQoZmliZXIpIHtcbiAgaWYgKGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpICE9PSBmaWJlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKCFhbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoZW4gd2Ugb25seSBuZWVkIHRvIGNoZWNrIGlmIGl0IGlzIG1vdW50ZWQuXG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcik7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gZmliZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmaWJlcjtcbiAgfSAvLyBJZiB3ZSBoYXZlIHR3byBwb3NzaWJsZSBicmFuY2hlcywgd2UnbGwgd2FsayBiYWNrd2FyZHMgdXAgdG8gdGhlIHJvb3RcbiAgLy8gdG8gc2VlIHdoYXQgcGF0aCB0aGUgcm9vdCBwb2ludHMgdG8uIE9uIHRoZSB3YXkgd2UgbWF5IGhpdCBvbmUgb2YgdGhlXG4gIC8vIHNwZWNpYWwgY2FzZXMgYW5kIHdlJ2xsIGRlYWwgd2l0aCB0aGVtLlxuXG5cbiAgdmFyIGEgPSBmaWJlcjtcbiAgdmFyIGIgPSBhbHRlcm5hdGU7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgcGFyZW50QSA9IGEucmV0dXJuO1xuXG4gICAgaWYgKHBhcmVudEEgPT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIGF0IHRoZSByb290LlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIHBhcmVudEIgPSBwYXJlbnRBLmFsdGVybmF0ZTtcblxuICAgIGlmIChwYXJlbnRCID09PSBudWxsKSB7XG4gICAgICAvLyBUaGVyZSBpcyBubyBhbHRlcm5hdGUuIFRoaXMgaXMgYW4gdW51c3VhbCBjYXNlLiBDdXJyZW50bHksIGl0IG9ubHlcbiAgICAgIC8vIGhhcHBlbnMgd2hlbiBhIFN1c3BlbnNlIGNvbXBvbmVudCBpcyBoaWRkZW4uIEFuIGV4dHJhIGZyYWdtZW50IGZpYmVyXG4gICAgICAvLyBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIHRoZSBTdXNwZW5zZSBmaWJlciBhbmQgaXRzIGNoaWxkcmVuLiBTa2lwXG4gICAgICAvLyBvdmVyIHRoaXMgZXh0cmEgZnJhZ21lbnQgZmliZXIgYW5kIHByb2NlZWQgdG8gdGhlIG5leHQgcGFyZW50LlxuICAgICAgdmFyIG5leHRQYXJlbnQgPSBwYXJlbnRBLnJldHVybjtcblxuICAgICAgaWYgKG5leHRQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgYSA9IGIgPSBuZXh0UGFyZW50O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gSWYgdGhlcmUncyBubyBwYXJlbnQsIHdlJ3JlIGF0IHRoZSByb290LlxuXG5cbiAgICAgIGJyZWFrO1xuICAgIH0gLy8gSWYgYm90aCBjb3BpZXMgb2YgdGhlIHBhcmVudCBmaWJlciBwb2ludCB0byB0aGUgc2FtZSBjaGlsZCwgd2UgY2FuXG4gICAgLy8gYXNzdW1lIHRoYXQgdGhlIGNoaWxkIGlzIGN1cnJlbnQuIFRoaXMgaGFwcGVucyB3aGVuIHdlIGJhaWxvdXQgb24gbG93XG4gICAgLy8gcHJpb3JpdHk6IHRoZSBiYWlsZWQgb3V0IGZpYmVyJ3MgY2hpbGQgcmV1c2VzIHRoZSBjdXJyZW50IGNoaWxkLlxuXG5cbiAgICBpZiAocGFyZW50QS5jaGlsZCA9PT0gcGFyZW50Qi5jaGlsZCkge1xuICAgICAgdmFyIGNoaWxkID0gcGFyZW50QS5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICAgIGlmIChjaGlsZCA9PT0gYSkge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoaWxkID09PSBiKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEIgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gYWx0ZXJuYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgfSAvLyBXZSBzaG91bGQgbmV2ZXIgaGF2ZSBhbiBhbHRlcm5hdGUgZm9yIGFueSBtb3VudGluZyBub2RlLiBTbyB0aGUgb25seVxuICAgICAgLy8gd2F5IHRoaXMgY291bGQgcG9zc2libHkgaGFwcGVuIGlzIGlmIHRoaXMgd2FzIHVubW91bnRlZCwgaWYgYXQgYWxsLlxuXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIGlmIChhLnJldHVybiAhPT0gYi5yZXR1cm4pIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlciBvZiBBIGFuZCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgQiBwb2ludCB0byBkaWZmZXJlbnRcbiAgICAgIC8vIGZpYmVycy4gV2UgYXNzdW1lIHRoYXQgcmV0dXJuIHBvaW50ZXJzIG5ldmVyIGNyaXNzLWNyb3NzLCBzbyBBIG11c3RcbiAgICAgIC8vIGJlbG9uZyB0byB0aGUgY2hpbGQgc2V0IG9mIEEucmV0dXJuLCBhbmQgQiBtdXN0IGJlbG9uZyB0byB0aGUgY2hpbGRcbiAgICAgIC8vIHNldCBvZiBCLnJldHVybi5cbiAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgYiA9IHBhcmVudEI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlcnMgcG9pbnQgdG8gdGhlIHNhbWUgZmliZXIuIFdlJ2xsIGhhdmUgdG8gdXNlIHRoZVxuICAgICAgLy8gZGVmYXVsdCwgc2xvdyBwYXRoOiBzY2FuIHRoZSBjaGlsZCBzZXRzIG9mIGVhY2ggcGFyZW50IGFsdGVybmF0ZSB0byBzZWVcbiAgICAgIC8vIHdoaWNoIGNoaWxkIGJlbG9uZ3MgdG8gd2hpY2ggc2V0LlxuICAgICAgLy9cbiAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQSdzIGNoaWxkIHNldFxuICAgICAgdmFyIGRpZEZpbmRDaGlsZCA9IGZhbHNlO1xuICAgICAgdmFyIF9jaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAvLyBTZWFyY2ggcGFyZW50IEIncyBjaGlsZCBzZXRcbiAgICAgICAgX2NoaWxkID0gcGFyZW50Qi5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoaWxkIHdhcyBub3QgZm91bmQgaW4gZWl0aGVyIHBhcmVudCBzZXQuIFRoaXMgaW5kaWNhdGVzIGEgYnVnICcgKyAnaW4gUmVhY3QgcmVsYXRlZCB0byB0aGUgcmV0dXJuIHBvaW50ZXIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGEuYWx0ZXJuYXRlICE9PSBiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXR1cm4gZmliZXJzIHNob3VsZCBhbHdheXMgYmUgZWFjaCBvdGhlcnMnIGFsdGVybmF0ZXMuIFwiICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9IC8vIElmIHRoZSByb290IGlzIG5vdCBhIGhvc3QgY29udGFpbmVyLCB3ZSdyZSBpbiBhIGRpc2Nvbm5lY3RlZCB0cmVlLiBJLmUuXG4gIC8vIHVubW91bnRlZC5cblxuXG4gIGlmIChhLnRhZyAhPT0gSG9zdFJvb3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgfVxuXG4gIGlmIChhLnN0YXRlTm9kZS5jdXJyZW50ID09PSBhKSB7XG4gICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgIHJldHVybiBmaWJlcjtcbiAgfSAvLyBPdGhlcndpc2UgQiBoYXMgdG8gYmUgY3VycmVudCBicmFuY2guXG5cblxuICByZXR1cm4gYWx0ZXJuYXRlO1xufVxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXIocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgIT09IG51bGwgPyBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwoY3VycmVudFBhcmVudCkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwobm9kZSkge1xuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHZhciBtYXRjaCA9IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChjaGlsZCk7XG5cbiAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG5cbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG4gIHJldHVybiBjdXJyZW50UGFyZW50ICE9PSBudWxsID8gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChjdXJyZW50UGFyZW50KSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwobm9kZSkge1xuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIGlmIChjaGlsZC50YWcgIT09IEhvc3RQb3J0YWwpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwoY2hpbGQpO1xuXG4gICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBUaGlzIG1vZHVsZSBvbmx5IGV4aXN0cyBhcyBhbiBFU00gd3JhcHBlciBhcm91bmQgdGhlIGV4dGVybmFsIENvbW1vbkpTXG52YXIgc2NoZWR1bGVDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xudmFyIGNhbmNlbENhbGxiYWNrID0gU2NoZWR1bGVyLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xudmFyIHNob3VsZFlpZWxkID0gU2NoZWR1bGVyLnVuc3RhYmxlX3Nob3VsZFlpZWxkO1xudmFyIHJlcXVlc3RQYWludCA9IFNjaGVkdWxlci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ7XG52YXIgbm93ID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCA9IFNjaGVkdWxlci51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eTtcbnZhciBOb3JtYWxQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eTtcbnZhciBMb3dQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Mb3dQcmlvcml0eTtcbnZhciBJZGxlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSWRsZVByaW9yaXR5O1xuLy8gdGhpcyBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0IG9uIHRoZSBzY2hlZHVsZXIsIGJ1dCBpdCAqZG9lcypcbi8vIG9uIHNjaGVkdWxlci91bnN0YWJsZV9tb2NrLCB3aGljaCB3ZSdsbCBuZWVkIGZvciBpbnRlcm5hbCB0ZXN0aW5nXG52YXIgdW5zdGFibGVfeWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV95aWVsZFZhbHVlO1xudmFyIHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlID0gU2NoZWR1bGVyLnVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlO1xuXG52YXIgcmVuZGVyZXJJRCA9IG51bGw7XG52YXIgaW5qZWN0ZWRIb29rID0gbnVsbDtcbnZhciBpbmplY3RlZFByb2ZpbGluZ0hvb2tzID0gbnVsbDtcbnZhciBoYXNMb2dnZWRFcnJvciA9IGZhbHNlO1xudmFyIGlzRGV2VG9vbHNQcmVzZW50ID0gdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCc7XG5mdW5jdGlvbiBpbmplY3RJbnRlcm5hbHMoaW50ZXJuYWxzKSB7XG4gIGlmICh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIE5vIERldlRvb2xzXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGhvb2sgPSBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187XG5cbiAgaWYgKGhvb2suaXNEaXNhYmxlZCkge1xuICAgIC8vIFRoaXMgaXNuJ3QgYSByZWFsIHByb3BlcnR5IG9uIHRoZSBob29rLCBidXQgaXQgY2FuIGJlIHNldCB0byBvcHQgb3V0XG4gICAgLy8gb2YgRGV2VG9vbHMgaW50ZWdyYXRpb24gYW5kIGFzc29jaWF0ZWQgd2FybmluZ3MgYW5kIGxvZ3MuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zODc3XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIWhvb2suc3VwcG9ydHNGaWJlcikge1xuICAgIHtcbiAgICAgIGVycm9yKCdUaGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgUmVhY3QgRGV2VG9vbHMgaXMgdG9vIG9sZCBhbmQgd2lsbCBub3Qgd29yayAnICsgJ3dpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBSZWFjdC4gUGxlYXNlIHVwZGF0ZSBSZWFjdCBEZXZUb29scy4gJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnKTtcbiAgICB9IC8vIERldlRvb2xzIGV4aXN0cywgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBzdXBwb3J0IEZpYmVyLlxuXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlcikge1xuICAgICAgLy8gQ29uZGl0aW9uYWxseSBpbmplY3QgdGhlc2UgaG9va3Mgb25seSBpZiBUaW1lbGluZSBwcm9maWxlciBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBidWlsZC5cbiAgICAgIC8vIFRoaXMgZ2l2ZXMgRGV2VG9vbHMgYSB3YXkgdG8gZmVhdHVyZSBkZXRlY3QgdGhhdCBpc24ndCB0aWVkIHRvIHZlcnNpb24gbnVtYmVyXG4gICAgICAvLyAoc2luY2UgcHJvZmlsaW5nIGFuZCB0aW1lbGluZSBhcmUgY29udHJvbGxlZCBieSBkaWZmZXJlbnQgZmVhdHVyZSBmbGFncykuXG4gICAgICBpbnRlcm5hbHMgPSBhc3NpZ24oe30sIGludGVybmFscywge1xuICAgICAgICBnZXRMYW5lTGFiZWxNYXA6IGdldExhbmVMYWJlbE1hcCxcbiAgICAgICAgaW5qZWN0UHJvZmlsaW5nSG9va3M6IGluamVjdFByb2ZpbGluZ0hvb2tzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXJlcklEID0gaG9vay5pbmplY3QoaW50ZXJuYWxzKTsgLy8gV2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5qZWN0ZWQsIHNvIG5vdyBpdCBpcyBzYWZlIHRvIHNldCB1cCBob29rcy5cblxuICAgIGluamVjdGVkSG9vayA9IGhvb2s7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIENhdGNoIGFsbCBlcnJvcnMgYmVjYXVzZSBpdCBpcyB1bnNhZmUgdG8gdGhyb3cgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgIHtcbiAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzLicsIGVycik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhvb2suY2hlY2tEQ0UpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSByZWFsIERldlRvb2xzLlxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgbGlrZWx5IGEgaG9vayBpbnN0YWxsZWQgYnkgRmFzdCBSZWZyZXNoIHJ1bnRpbWUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBvblNjaGVkdWxlUm9vdChyb290LCBjaGlsZHJlbikge1xuICB7XG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIGNoaWxkcmVuKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoICFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRSb290KHJvb3QsIGV2ZW50UHJpb3JpdHkpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBkaWRFcnJvciA9IChyb290LmN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gRGlkQ2FwdHVyZTtcblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5O1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgICAgICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgc2NoZWR1bGVyUHJpb3JpdHksIGRpZEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCB1bmRlZmluZWQsIGRpZEVycm9yKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Qb3N0Q29tbWl0Um9vdChyb290KSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRVbm1vdW50KGZpYmVyKSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQocmVuZGVyZXJJRCwgZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhuZXdJc1N0cmljdE1vZGUpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgdW5zdGFibGVfeWllbGRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gV2UncmUgaW4gYSB0ZXN0IGJlY2F1c2UgU2NoZWR1bGVyLnVuc3RhYmxlX3lpZWxkVmFsdWUgb25seSBleGlzdHNcbiAgICAgIC8vIGluIFNjaGVkdWxlck1vY2suIFRvIHJlZHVjZSB0aGUgbm9pc2UgaW4gc3RyaWN0IG1vZGUgdGVzdHMsXG4gICAgICAvLyBzdXBwcmVzcyB3YXJuaW5ncyBhbmQgZGlzYWJsZSBzY2hlZHVsZXIgeWllbGRpbmcgZHVyaW5nIHRoZSBkb3VibGUgcmVuZGVyXG4gICAgICB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZShuZXdJc1N0cmljdE1vZGUpO1xuICAgICAgc2V0U3VwcHJlc3NXYXJuaW5nKG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgfVxuXG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5zZXRTdHJpY3RNb2RlKHJlbmRlcmVySUQsIG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBQcm9maWxlciBBUEkgaG9va3NcblxuZnVuY3Rpb24gaW5qZWN0UHJvZmlsaW5nSG9va3MocHJvZmlsaW5nSG9va3MpIHtcbiAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcyA9IHByb2ZpbGluZ0hvb2tzO1xufVxuXG5mdW5jdGlvbiBnZXRMYW5lTGFiZWxNYXAoKSB7XG4gIHtcbiAgICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICAgIHZhciBsYW5lID0gMTtcblxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBUb3RhbExhbmVzOyBpbmRleCsrKSB7XG4gICAgICB2YXIgbGFiZWwgPSBnZXRMYWJlbEZvckxhbmUobGFuZSk7XG4gICAgICBtYXAuc2V0KGxhbmUsIGxhYmVsKTtcbiAgICAgIGxhbmUgKj0gMjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tbWl0U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRFcnJvcmVkKGZpYmVyLCB0aHJvd25WYWx1ZSwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRFcnJvcmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRFcnJvcmVkKGZpYmVyLCB0aHJvd25WYWx1ZSwgbGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFN1c3BlbmRlZChmaWJlciwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50U3VzcGVuZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRTdXNwZW5kZWQoZmliZXIsIHdha2VhYmxlLCBsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyWWllbGRlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJZaWVsZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJZaWVsZGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclNjaGVkdWxlZChsYW5lKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgTm9Nb2RlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4wOyAvLyBUT0RPOiBSZW1vdmUgQ29uY3VycmVudE1vZGUgYnkgcmVhZGluZyBmcm9tIHRoZSByb290IHRhZyBpbnN0ZWFkXG5cbnZhciBDb25jdXJyZW50TW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgUHJvZmlsZU1vZGUgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yO1xudmFyIFN0cmljdExlZ2FjeU1vZGUgPVxuLyogICAgICAgICAgICAgICAqL1xuODtcbnZhciBTdHJpY3RFZmZlY3RzTW9kZSA9XG4vKiAgICAgICAgICAgICAgKi9cbjE2O1xuXG4vLyBUT0RPOiBUaGlzIGlzIHByZXR0eSB3ZWxsIHN1cHBvcnRlZCBieSBicm93c2Vycy4gTWF5YmUgd2UgY2FuIGRyb3AgaXQuXG52YXIgY2x6MzIgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IGNsejMyRmFsbGJhY2s7IC8vIENvdW50IGxlYWRpbmcgemVyb3MuXG4vLyBCYXNlZCBvbjpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvY2x6MzJcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG5mdW5jdGlvbiBjbHozMkZhbGxiYWNrKHgpIHtcbiAgdmFyIGFzVWludCA9IHggPj4+IDA7XG5cbiAgaWYgKGFzVWludCA9PT0gMCkge1xuICAgIHJldHVybiAzMjtcbiAgfVxuXG4gIHJldHVybiAzMSAtIChsb2coYXNVaW50KSAvIExOMiB8IDApIHwgMDtcbn1cblxuLy8gSWYgdGhvc2UgdmFsdWVzIGFyZSBjaGFuZ2VkIHRoYXQgcGFja2FnZSBzaG91bGQgYmUgcmVidWlsdCBhbmQgcmVkZXBsb3llZC5cblxudmFyIFRvdGFsTGFuZXMgPSAzMTtcbnZhciBOb0xhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgTm9MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBTeW5jTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xO1xudmFyIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUgPVxuLyogICAgKi9cbjI7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZSA9XG4vKiAgICAgICAgICAgICAqL1xuNDtcbnZhciBEZWZhdWx0SHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICovXG44O1xudmFyIERlZmF1bHRMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjE2O1xudmFyIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgICAgICovXG4zMjtcbnZhciBUcmFuc2l0aW9uTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG40MTk0MjQwO1xudmFyIFRyYW5zaXRpb25MYW5lMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG42NDtcbnZhciBUcmFuc2l0aW9uTGFuZTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIFRyYW5zaXRpb25MYW5lMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4yNTY7XG52YXIgVHJhbnNpdGlvbkxhbmU0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUxMjtcbnZhciBUcmFuc2l0aW9uTGFuZTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBUcmFuc2l0aW9uTGFuZTYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBUcmFuc2l0aW9uTGFuZTcgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDA5NjtcbnZhciBUcmFuc2l0aW9uTGFuZTggPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuODE5MjtcbnZhciBUcmFuc2l0aW9uTGFuZTkgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTYzODQ7XG52YXIgVHJhbnNpdGlvbkxhbmUxMCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjMyNzY4O1xudmFyIFRyYW5zaXRpb25MYW5lMTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG42NTUzNjtcbnZhciBUcmFuc2l0aW9uTGFuZTEyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTMxMDcyO1xudmFyIFRyYW5zaXRpb25MYW5lMTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4yNjIxNDQ7XG52YXIgVHJhbnNpdGlvbkxhbmUxNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUyNDI4ODtcbnZhciBUcmFuc2l0aW9uTGFuZTE1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTA0ODU3NjtcbnZhciBUcmFuc2l0aW9uTGFuZTE2ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA5NzE1MjtcbnZhciBSZXRyeUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMzAwMjM0MjQ7XG52YXIgUmV0cnlMYW5lMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQxOTQzMDQ7XG52YXIgUmV0cnlMYW5lMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgzODg2MDg7XG52YXIgUmV0cnlMYW5lMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE2Nzc3MjE2O1xudmFyIFJldHJ5TGFuZTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4zMzU1NDQzMjtcbnZhciBSZXRyeUxhbmU1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjcxMDg4NjQ7XG52YXIgU29tZVJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG52YXIgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAqL1xuMTM0MjE3NzI4O1xudmFyIE5vbklkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI2ODQzNTQ1NTtcbnZhciBJZGxlSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICAgICovXG4yNjg0MzU0NTY7XG52YXIgSWRsZUxhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTM2ODcwOTEyO1xudmFyIE9mZnNjcmVlbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjEwNzM3NDE4MjQ7IC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGV4cGVyaW1lbnRhbCB0aW1lbGluZSAocmVhY3QtZGV2dG9vbHMtdGltZWxpbmUpXG4vLyBJdCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIExhbmVzIHZhbHVlcyBhYm92ZS5cblxuZnVuY3Rpb24gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpIHtcbiAge1xuICAgIGlmIChsYW5lICYgU3luY0xhbmUpIHtcbiAgICAgIHJldHVybiAnU3luYyc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0lucHV0Q29udGludW91c0h5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJbnB1dENvbnRpbnVvdXNMYW5lKSB7XG4gICAgICByZXR1cm4gJ0lucHV0Q29udGludW91cyc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBEZWZhdWx0SHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdEZWZhdWx0SHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIERlZmF1bHRMYW5lKSB7XG4gICAgICByZXR1cm4gJ0RlZmF1bHQnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnVHJhbnNpdGlvbkh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpIHtcbiAgICAgIHJldHVybiAnVHJhbnNpdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBSZXRyeUxhbmVzKSB7XG4gICAgICByZXR1cm4gJ1JldHJ5JztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnU2VsZWN0aXZlSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElkbGVIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0lkbGVIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSWRsZUxhbmUpIHtcbiAgICAgIHJldHVybiAnSWRsZSc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBPZmZzY3JlZW5MYW5lKSB7XG4gICAgICByZXR1cm4gJ09mZnNjcmVlbic7XG4gICAgfVxuICB9XG59XG52YXIgTm9UaW1lc3RhbXAgPSAtMTtcbnZhciBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7XG52YXIgbmV4dFJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGxhbmVzKSB7XG4gIHN3aXRjaCAoZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcykpIHtcbiAgICBjYXNlIFN5bmNMYW5lOlxuICAgICAgcmV0dXJuIFN5bmNMYW5lO1xuXG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzTGFuZTtcblxuICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gRGVmYXVsdEh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgICAgcmV0dXJuIERlZmF1bHRMYW5lO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICAgIHJldHVybiBsYW5lcyAmIFRyYW5zaXRpb25MYW5lcztcblxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICByZXR1cm4gbGFuZXMgJiBSZXRyeUxhbmVzO1xuXG4gICAgY2FzZSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElkbGVIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIElkbGVIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICAgIHJldHVybiBJZGxlTGFuZTtcblxuICAgIGNhc2UgT2Zmc2NyZWVuTGFuZTpcbiAgICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBiZSByZWFjaGFibGUsIGJ1dCBhcyBhIGZhbGxiYWNrLCByZXR1cm4gdGhlIGVudGlyZSBiaXRtYXNrLlxuXG5cbiAgICAgIHJldHVybiBsYW5lcztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROZXh0TGFuZXMocm9vdCwgd2lwTGFuZXMpIHtcbiAgLy8gRWFybHkgYmFpbG91dCBpZiB0aGVyZSdzIG5vIHBlbmRpbmcgd29yayBsZWZ0LlxuICB2YXIgcGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG5cbiAgaWYgKHBlbmRpbmdMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIHJldHVybiBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIG5leHRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7IC8vIERvIG5vdCB3b3JrIG9uIGFueSBpZGxlIHdvcmsgdW50aWwgYWxsIHRoZSBub24taWRsZSB3b3JrIGhhcyBmaW5pc2hlZCxcbiAgLy8gZXZlbiBpZiB0aGUgd29yayBpcyBzdXNwZW5kZWQuXG5cbiAgdmFyIG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiBOb25JZGxlTGFuZXM7XG5cbiAgaWYgKG5vbklkbGVQZW5kaW5nTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICB2YXIgbm9uSWRsZVVuYmxvY2tlZExhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgIGlmIChub25JZGxlVW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKG5vbklkbGVVbmJsb2NrZWRMYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBub25JZGxlUGluZ2VkTGFuZXMgPSBub25JZGxlUGVuZGluZ0xhbmVzICYgcGluZ2VkTGFuZXM7XG5cbiAgICAgIGlmIChub25JZGxlUGluZ2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVBpbmdlZExhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIHdvcmsgaXMgSWRsZS5cbiAgICB2YXIgdW5ibG9ja2VkTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICBpZiAodW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHVuYmxvY2tlZExhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHBpbmdlZExhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobmV4dExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGFibGUgaWYgd2UncmUgc3VzcGVuZGVkXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgd2FybmluZyBpbiB0aGlzIHBhdGggaWYgYSBmYWxsYmFjayB0aW1lciBpcyBub3Qgc2NoZWR1bGVkLlxuICAgIHJldHVybiBOb0xhbmVzO1xuICB9IC8vIElmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiBhIHJlbmRlciwgc3dpdGNoaW5nIGxhbmVzIHdpbGwgaW50ZXJydXB0XG4gIC8vIGl0IGFuZCB3ZSdsbCBsb3NlIG91ciBwcm9ncmVzcy4gV2Ugc2hvdWxkIG9ubHkgZG8gdGhpcyBpZiB0aGUgbmV3IGxhbmVzIGFyZVxuICAvLyBoaWdoZXIgcHJpb3JpdHkuXG5cblxuICBpZiAod2lwTGFuZXMgIT09IE5vTGFuZXMgJiYgd2lwTGFuZXMgIT09IG5leHRMYW5lcyAmJiAvLyBJZiB3ZSBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHRoZW4gaW50ZXJydXB0aW5nIGlzIGZpbmUuIERvbid0XG4gIC8vIGJvdGhlciB3YWl0aW5nIHVudGlsIHRoZSByb290IGlzIGNvbXBsZXRlLlxuICAod2lwTGFuZXMgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICB2YXIgbmV4dExhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKG5leHRMYW5lcyk7XG4gICAgdmFyIHdpcExhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKHdpcExhbmVzKTtcblxuICAgIGlmICggLy8gVGVzdHMgd2hldGhlciB0aGUgbmV4dCBsYW5lIGlzIGVxdWFsIG9yIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIHdpcFxuICAgIC8vIG9uZS4gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXRzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICAgIG5leHRMYW5lID49IHdpcExhbmUgfHwgLy8gRGVmYXVsdCBwcmlvcml0eSB1cGRhdGVzIHNob3VsZCBub3QgaW50ZXJydXB0IHRyYW5zaXRpb24gdXBkYXRlcy4gVGhlXG4gICAgLy8gb25seSBkaWZmZXJlbmNlIGJldHdlZW4gZGVmYXVsdCB1cGRhdGVzIGFuZCB0cmFuc2l0aW9uIHVwZGF0ZXMgaXMgdGhhdFxuICAgIC8vIGRlZmF1bHQgdXBkYXRlcyBkbyBub3Qgc3VwcG9ydCByZWZyZXNoIHRyYW5zaXRpb25zLlxuICAgIG5leHRMYW5lID09PSBEZWZhdWx0TGFuZSAmJiAod2lwTGFuZSAmIFRyYW5zaXRpb25MYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICAgIC8vIEtlZXAgd29ya2luZyBvbiB0aGUgZXhpc3RpbmcgaW4tcHJvZ3Jlc3MgdHJlZS4gRG8gbm90IGludGVycnVwdC5cbiAgICAgIHJldHVybiB3aXBMYW5lcztcbiAgICB9XG4gIH1cblxuICBpZiAoKG5leHRMYW5lcyAmIElucHV0Q29udGludW91c0xhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgLy8gV2hlbiB1cGRhdGVzIGFyZSBzeW5jIGJ5IGRlZmF1bHQsIHdlIGVudGFuZ2xlIGNvbnRpbnVvdXMgcHJpb3JpdHkgdXBkYXRlc1xuICAgIC8vIGFuZCBkZWZhdWx0IHVwZGF0ZXMsIHNvIHRoZXkgcmVuZGVyIGluIHRoZSBzYW1lIGJhdGNoLiBUaGUgb25seSByZWFzb25cbiAgICAvLyB0aGV5IHVzZSBzZXBhcmF0ZSBsYW5lcyBpcyBiZWNhdXNlIGNvbnRpbnVvdXMgdXBkYXRlcyBzaG91bGQgaW50ZXJydXB0XG4gICAgLy8gdHJhbnNpdGlvbnMsIGJ1dCBkZWZhdWx0IHVwZGF0ZXMgc2hvdWxkIG5vdC5cbiAgICBuZXh0TGFuZXMgfD0gcGVuZGluZ0xhbmVzICYgRGVmYXVsdExhbmU7XG4gIH0gLy8gQ2hlY2sgZm9yIGVudGFuZ2xlZCBsYW5lcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGJhdGNoLlxuICAvL1xuICAvLyBBIGxhbmUgaXMgc2FpZCB0byBiZSBlbnRhbmdsZWQgd2l0aCBhbm90aGVyIHdoZW4gaXQncyBub3QgYWxsb3dlZCB0byByZW5kZXJcbiAgLy8gaW4gYSBiYXRjaCB0aGF0IGRvZXMgbm90IGFsc28gaW5jbHVkZSB0aGUgb3RoZXIgbGFuZS4gVHlwaWNhbGx5IHdlIGRvIHRoaXNcbiAgLy8gd2hlbiBtdWx0aXBsZSB1cGRhdGVzIGhhdmUgdGhlIHNhbWUgc291cmNlLCBhbmQgd2Ugb25seSB3YW50IHRvIHJlc3BvbmQgdG9cbiAgLy8gdGhlIG1vc3QgcmVjZW50IGV2ZW50IGZyb20gdGhhdCBzb3VyY2UuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBhcHBseSBlbnRhbmdsZW1lbnRzICphZnRlciogY2hlY2tpbmcgZm9yIHBhcnRpYWwgd29yayBhYm92ZS5cbiAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIGEgbGFuZSBpcyBlbnRhbmdsZWQgZHVyaW5nIGFuIGludGVybGVhdmVkIGV2ZW50IHdoaWxlXG4gIC8vIGl0J3MgYWxyZWFkeSByZW5kZXJpbmcsIHdlIHdvbid0IGludGVycnVwdCBpdC4gVGhpcyBpcyBpbnRlbnRpb25hbCwgc2luY2VcbiAgLy8gZW50YW5nbGVtZW50IGlzIHVzdWFsbHkgXCJiZXN0IGVmZm9ydFwiOiB3ZSdsbCB0cnkgb3VyIGJlc3QgdG8gcmVuZGVyIHRoZVxuICAvLyBsYW5lcyBpbiB0aGUgc2FtZSBiYXRjaCwgYnV0IGl0J3Mgbm90IHdvcnRoIHRocm93aW5nIG91dCBwYXJ0aWFsbHlcbiAgLy8gY29tcGxldGVkIHdvcmsgaW4gb3JkZXIgdG8gZG8gaXQuXG4gIC8vIFRPRE86IFJlY29uc2lkZXIgdGhpcy4gVGhlIGNvdW50ZXItYXJndW1lbnQgaXMgdGhhdCB0aGUgcGFydGlhbCB3b3JrXG4gIC8vIHJlcHJlc2VudHMgYW4gaW50ZXJtZWRpYXRlIHN0YXRlLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIHNob3cgdG8gdGhlIHVzZXIuXG4gIC8vIEFuZCBieSBzcGVuZGluZyBleHRyYSB0aW1lIGZpbmlzaGluZyBpdCwgd2UncmUgaW5jcmVhc2luZyB0aGUgYW1vdW50IG9mXG4gIC8vIHRpbWUgaXQgdGFrZXMgdG8gc2hvdyB0aGUgZmluYWwgc3RhdGUsIHdoaWNoIGlzIHdoYXQgdGhleSBhcmUgYWN0dWFsbHlcbiAgLy8gd2FpdGluZyBmb3IuXG4gIC8vXG4gIC8vIEZvciB0aG9zZSBleGNlcHRpb25zIHdoZXJlIGVudGFuZ2xlbWVudCBpcyBzZW1hbnRpY2FsbHkgaW1wb3J0YW50LCBsaWtlXG4gIC8vIHVzZU11dGFibGVTb3VyY2UsIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwYXJ0aWFsIHdvcmsgYXQgdGhlXG4gIC8vIHRpbWUgd2UgYXBwbHkgdGhlIGVudGFuZ2xlbWVudC5cblxuXG4gIHZhciBlbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXM7XG5cbiAgaWYgKGVudGFuZ2xlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gICAgdmFyIGxhbmVzID0gbmV4dExhbmVzICYgZW50YW5nbGVkTGFuZXM7XG5cbiAgICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICAgIG5leHRMYW5lcyB8PSBlbnRhbmdsZW1lbnRzW2luZGV4XTtcbiAgICAgIGxhbmVzICY9IH5sYW5lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0TGFuZXM7XG59XG5mdW5jdGlvbiBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV2ZW50VGltZSA9IGV2ZW50VGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV2ZW50VGltZSA+IG1vc3RSZWNlbnRFdmVudFRpbWUpIHtcbiAgICAgIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBldmVudFRpbWU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cblxuICByZXR1cm4gbW9zdFJlY2VudEV2ZW50VGltZTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKSB7XG4gIHN3aXRjaCAobGFuZSkge1xuICAgIGNhc2UgU3luY0xhbmU6XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIC8vIFVzZXIgaW50ZXJhY3Rpb25zIHNob3VsZCBleHBpcmUgc2xpZ2h0bHkgbW9yZSBxdWlja2x5LlxuICAgICAgLy9cbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbnN0YW50IGFzIGluIFNjaGVkdWxlci5qcy5cbiAgICAgIC8vIFdoZW4gd2UgbWFkZSBpdCBsYXJnZXIsIGEgcHJvZHVjdCBtZXRyaWMgaW4gd3d3IHJlZ3Jlc3NlZCwgc3VnZ2VzdGluZ1xuICAgICAgLy8gdGhlcmUncyBhIHVzZXIgaW50ZXJhY3Rpb24gdGhhdCdzIGJlaW5nIHN0YXJ2ZWQgYnkgYSBzZXJpZXMgb2ZcbiAgICAgIC8vIHN5bmNocm9ub3VzIHVwZGF0ZXMuIElmIHRoYXQgdGhlb3J5IGlzIGNvcnJlY3QsIHRoZSBwcm9wZXIgc29sdXRpb24gaXNcbiAgICAgIC8vIHRvIGZpeCB0aGUgc3RhcnZhdGlvbi4gSG93ZXZlciwgdGhpcyBzY2VuYXJpbyBzdXBwb3J0cyB0aGUgaWRlYSB0aGF0XG4gICAgICAvLyBleHBpcmF0aW9uIHRpbWVzIGFyZSBhbiBpbXBvcnRhbnQgc2FmZWd1YXJkIHdoZW4gc3RhcnZhdGlvblxuICAgICAgLy8gZG9lcyBoYXBwZW4uXG4gICAgICByZXR1cm4gY3VycmVudFRpbWUgKyAyNTA7XG5cbiAgICBjYXNlIERlZmF1bHRIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgY2FzZSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgICByZXR1cm4gY3VycmVudFRpbWUgKyA1MDAwO1xuXG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIC8vIFRPRE86IFJldHJpZXMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gZXhwaXJlIGlmIHRoZXkgYXJlIENQVSBib3VuZCBmb3JcbiAgICAgIC8vIHRvbyBsb25nLCBidXQgd2hlbiBJIG1hZGUgdGhpcyBjaGFuZ2UgaXQgY2F1c2VkIGEgc3Bpa2UgaW4gYnJvd3NlclxuICAgICAgLy8gY3Jhc2hlcy4gVGhlcmUgbXVzdCBiZSBzb21lIG90aGVyIHVuZGVybHlpbmcgYnVnOyBub3Qgc3VwZXIgdXJnZW50IGJ1dFxuICAgICAgLy8gaWRlYWxseSBzaG91bGQgZmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4gVW5mb3J0dW5hdGVseSB3ZSBkb24ndCBoYXZlXG4gICAgICAvLyBhIHJlcHJvIGZvciB0aGUgY3Jhc2hlcywgb25seSBkZXRlY3RlZCB2aWEgcHJvZHVjdGlvbiBtZXRyaWNzLlxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuXG4gICAgY2FzZSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSWRsZUh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICBjYXNlIE9mZnNjcmVlbkxhbmU6XG4gICAgICAvLyBBbnl0aGluZyBpZGxlIHByaW9yaXR5IG9yIGxvd2VyIHNob3VsZCBuZXZlciBleHBpcmUuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICBlcnJvcignU2hvdWxkIGhhdmUgZm91bmQgbWF0Y2hpbmcgbGFuZXMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IFRoaXMgZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB3ZSB5aWVsZC4gV2UgY2FuIG9wdGltaXplIGJ5IHN0b3JpbmdcbiAgLy8gdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZSBvbiB0aGUgcm9vdC4gVGhlbiB1c2UgdGhhdCB0byBxdWlja2x5IGJhaWwgb3V0XG4gIC8vIG9mIHRoaXMgZnVuY3Rpb24uXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBlbmRpbmcgbGFuZXMgYW5kIGNoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlaXJcbiAgLy8gZXhwaXJhdGlvbiB0aW1lLiBJZiBzbywgd2UnbGwgYXNzdW1lIHRoZSB1cGRhdGUgaXMgYmVpbmcgc3RhcnZlZCBhbmQgbWFya1xuICAvLyBpdCBhcyBleHBpcmVkIHRvIGZvcmNlIGl0IHRvIGZpbmlzaC5cblxuICB2YXIgbGFuZXMgPSBwZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV4cGlyYXRpb25UaW1lID09PSBOb1RpbWVzdGFtcCkge1xuICAgICAgLy8gRm91bmQgYSBwZW5kaW5nIGxhbmUgd2l0aCBubyBleHBpcmF0aW9uIHRpbWUuIElmIGl0J3Mgbm90IHN1c3BlbmRlZCwgb3JcbiAgICAgIC8vIGlmIGl0J3MgcGluZ2VkLCBhc3N1bWUgaXQncyBDUFUtYm91bmQuIENvbXB1dGUgYSBuZXcgZXhwaXJhdGlvbiB0aW1lXG4gICAgICAvLyB1c2luZyB0aGUgY3VycmVudCB0aW1lLlxuICAgICAgaWYgKChsYW5lICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzIHx8IChsYW5lICYgcGluZ2VkTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIC8vIEFzc3VtZXMgdGltZXN0YW1wcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaGlzIGxhbmUgZXhwaXJlZFxuICAgICAgcm9vdC5leHBpcmVkTGFuZXMgfD0gbGFuZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufSAvLyBUaGlzIHJldHVybnMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcGVuZGluZyBsYW5lcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleVxuLy8gYXJlIHN1c3BlbmRlZC5cblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5UGVuZGluZ0xhbmVzKHJvb3QpIHtcbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHJvb3QucGVuZGluZ0xhbmVzKTtcbn1cbmZ1bmN0aW9uIGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpIHtcbiAgdmFyIGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gPSByb290LnBlbmRpbmdMYW5lcyAmIH5PZmZzY3JlZW5MYW5lO1xuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuIGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW47XG4gIH1cblxuICBpZiAoZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiAmIE9mZnNjcmVlbkxhbmUpIHtcbiAgICByZXR1cm4gT2Zmc2NyZWVuTGFuZTtcbiAgfVxuXG4gIHJldHVybiBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNTeW5jTGFuZShsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgU3luY0xhbmUpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNOb25JZGxlV29yayhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgTm9uSWRsZUxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFJldHJ5TGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKGxhbmVzKSB7XG4gIHZhciBVcmdlbnRMYW5lcyA9IFN5bmNMYW5lIHwgSW5wdXRDb250aW51b3VzTGFuZSB8IERlZmF1bHRMYW5lO1xuICByZXR1cm4gKGxhbmVzICYgVXJnZW50TGFuZXMpID09PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFRyYW5zaXRpb25MYW5lcykgPT09IGxhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpIHtcblxuICB2YXIgU3luY0RlZmF1bHRMYW5lcyA9IElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUgfCBJbnB1dENvbnRpbnVvdXNMYW5lIHwgRGVmYXVsdEh5ZHJhdGlvbkxhbmUgfCBEZWZhdWx0TGFuZTtcbiAgcmV0dXJuIChsYW5lcyAmIFN5bmNEZWZhdWx0TGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNFeHBpcmVkTGFuZShyb290LCBsYW5lcykge1xuICAvLyBUaGlzIGlzIGEgc2VwYXJhdGUgY2hlY2sgZnJvbSBpbmNsdWRlc0Jsb2NraW5nTGFuZSBiZWNhdXNlIGEgbGFuZSBjYW5cbiAgLy8gZXhwaXJlIGFmdGVyIGEgcmVuZGVyIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuXG4gIHJldHVybiAobGFuZXMgJiByb290LmV4cGlyZWRMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpc1RyYW5zaXRpb25MYW5lKGxhbmUpIHtcbiAgcmV0dXJuIChsYW5lICYgVHJhbnNpdGlvbkxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCkge1xuICAvLyBDeWNsZSB0aHJvdWdoIHRoZSBsYW5lcywgYXNzaWduaW5nIGVhY2ggbmV3IHRyYW5zaXRpb24gdG8gdGhlIG5leHQgbGFuZS5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBtZWFucyBldmVyeSB0cmFuc2l0aW9uIGdldHMgaXRzIG93biBsYW5lLCB1bnRpbCB3ZVxuICAvLyBydW4gb3V0IG9mIGxhbmVzIGFuZCBjeWNsZSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuXG4gIHZhciBsYW5lID0gbmV4dFRyYW5zaXRpb25MYW5lO1xuICBuZXh0VHJhbnNpdGlvbkxhbmUgPDw9IDE7XG5cbiAgaWYgKChuZXh0VHJhbnNpdGlvbkxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgbmV4dFRyYW5zaXRpb25MYW5lID0gVHJhbnNpdGlvbkxhbmUxO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBjbGFpbU5leHRSZXRyeUxhbmUoKSB7XG4gIHZhciBsYW5lID0gbmV4dFJldHJ5TGFuZTtcbiAgbmV4dFJldHJ5TGFuZSA8PD0gMTtcblxuICBpZiAoKG5leHRSZXRyeUxhbmUgJiBSZXRyeUxhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIG5leHRSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSB7XG4gIHJldHVybiBsYW5lcyAmIC1sYW5lcztcbn1cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lKGxhbmVzKSB7XG4gIC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBnZXRzIGlubGluZWQuIE9ubHkgZXhpc3RzIHNvIHRvIGNvbW11bmljYXRlIHRoYXQgaXRcbiAgLy8gZG9lc24ndCBtYXR0ZXIgd2hpY2ggYml0IGlzIHNlbGVjdGVkOyB5b3UgY2FuIHBpY2sgYW55IGJpdCB3aXRob3V0XG4gIC8vIGFmZmVjdGluZyB0aGUgYWxnb3JpdGhtcyB3aGVyZSBpdHMgdXNlZC4gSGVyZSBJJ20gdXNpbmdcbiAgLy8gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBmZXdlc3Qgb3BlcmF0aW9ucy5cbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKSB7XG4gIHJldHVybiAzMSAtIGNsejMyKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbGFuZVRvSW5kZXgobGFuZSkge1xuICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lKTtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXNTb21lTGFuZShhLCBiKSB7XG4gIHJldHVybiAoYSAmIGIpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNTdWJzZXRPZkxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiAoc2V0ICYgc3Vic2V0KSA9PT0gc3Vic2V0O1xufVxuZnVuY3Rpb24gbWVyZ2VMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhIHwgYjtcbn1cbmZ1bmN0aW9uIHJlbW92ZUxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiBzZXQgJiB+c3Vic2V0O1xufVxuZnVuY3Rpb24gaW50ZXJzZWN0TGFuZXMoYSwgYikge1xuICByZXR1cm4gYSAmIGI7XG59IC8vIFNlZW1zIHJlZHVuZGFudCwgYnV0IGl0IGNoYW5nZXMgdGhlIHR5cGUgZnJvbSBhIHNpbmdsZSBsYW5lICh1c2VkIGZvclxuLy8gdXBkYXRlcykgdG8gYSBncm91cCBvZiBsYW5lcyAodXNlZCBmb3IgZmx1c2hpbmcgd29yaykuXG5cbmZ1bmN0aW9uIGxhbmVUb0xhbmVzKGxhbmUpIHtcbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBoaWdoZXJQcmlvcml0eUxhbmUoYSwgYikge1xuICAvLyBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGJpdCByYW5nZXMgZGVjcmVhc2UgaW4gcHJpb3JpdHkgYXMgeW91IGdvIGxlZnQuXG4gIHJldHVybiBhICE9PSBOb0xhbmUgJiYgYSA8IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxhbmVNYXAoaW5pdGlhbCkge1xuICAvLyBJbnRlbnRpb25hbGx5IHB1c2hpbmcgb25lIGJ5IG9uZS5cbiAgLy8gaHR0cHM6Ly92OC5kZXYvYmxvZy9lbGVtZW50cy1raW5kcyNhdm9pZC1jcmVhdGluZy1ob2xlc1xuICB2YXIgbGFuZU1hcCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVG90YWxMYW5lczsgaSsrKSB7XG4gICAgbGFuZU1hcC5wdXNoKGluaXRpYWwpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmVNYXA7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgdXBkYXRlTGFuZSwgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGVuZGluZ0xhbmVzIHw9IHVwZGF0ZUxhbmU7IC8vIElmIHRoZXJlIGFyZSBhbnkgc3VzcGVuZGVkIHRyYW5zaXRpb25zLCBpdCdzIHBvc3NpYmxlIHRoaXMgbmV3IHVwZGF0ZVxuICAvLyBjb3VsZCB1bmJsb2NrIHRoZW0uIENsZWFyIHRoZSBzdXNwZW5kZWQgbGFuZXMgc28gdGhhdCB3ZSBjYW4gdHJ5IHJlbmRlcmluZ1xuICAvLyB0aGVtIGFnYWluLlxuICAvL1xuICAvLyBUT0RPOiBXZSByZWFsbHkgb25seSBuZWVkIHRvIHVuc3VzcGVuZCBvbmx5IGxhbmVzIHRoYXQgYXJlIGluIHRoZVxuICAvLyBgc3VidHJlZUxhbmVzYCBvZiB0aGUgdXBkYXRlZCBmaWJlciwgb3IgdGhlIHVwZGF0ZSBsYW5lcyBvZiB0aGUgcmV0dXJuXG4gIC8vIHBhdGguIFRoaXMgd291bGQgZXhjbHVkZSBzdXNwZW5kZWQgdXBkYXRlcyBpbiBhbiB1bnJlbGF0ZWQgc2libGluZyB0cmVlLFxuICAvLyBzaW5jZSB0aGVyZSdzIG5vIHdheSBmb3IgdGhpcyB1cGRhdGUgdG8gdW5ibG9jayBpdC5cbiAgLy9cbiAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpZiB0aGUgaW5jb21pbmcgdXBkYXRlIGlzIGlkbGUsIGJlY2F1c2Ugd2UgbmV2ZXIgcHJvY2Vzc1xuICAvLyBpZGxlIHVwZGF0ZXMgdW50aWwgYWZ0ZXIgYWxsIHRoZSByZWd1bGFyIHVwZGF0ZXMgaGF2ZSBmaW5pc2hlZDsgdGhlcmUncyBub1xuICAvLyB3YXkgaXQgY291bGQgdW5ibG9jayBhIHRyYW5zaXRpb24uXG5cbiAgaWYgKHVwZGF0ZUxhbmUgIT09IElkbGVMYW5lKSB7XG4gICAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcm9vdC5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgodXBkYXRlTGFuZSk7IC8vIFdlIGNhbiBhbHdheXMgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRpbWVzdGFtcCBiZWNhdXNlIHdlIHByZWZlciB0aGUgbW9zdFxuICAvLyByZWNlbnQgZXZlbnQsIGFuZCB3ZSBhc3N1bWUgdGltZSBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG5cbiAgZXZlbnRUaW1lc1tpbmRleF0gPSBldmVudFRpbWU7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICByb290LnN1c3BlbmRlZExhbmVzIHw9IHN1c3BlbmRlZExhbmVzO1xuICByb290LnBpbmdlZExhbmVzICY9IH5zdXNwZW5kZWRMYW5lczsgLy8gVGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIENQVS1ib3VuZC4gQ2xlYXIgdGhlaXIgZXhwaXJhdGlvbiB0aW1lcy5cblxuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7XG4gIHZhciBsYW5lcyA9IHN1c3BlbmRlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcywgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGluZ2VkTGFuZXMgfD0gcm9vdC5zdXNwZW5kZWRMYW5lcyAmIHBpbmdlZExhbmVzO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RGaW5pc2hlZChyb290LCByZW1haW5pbmdMYW5lcykge1xuICB2YXIgbm9Mb25nZXJQZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcyAmIH5yZW1haW5pbmdMYW5lcztcbiAgcm9vdC5wZW5kaW5nTGFuZXMgPSByZW1haW5pbmdMYW5lczsgLy8gTGV0J3MgdHJ5IGV2ZXJ5dGhpbmcgYWdhaW5cblxuICByb290LnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHJvb3QuZXhwaXJlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290Lm11dGFibGVSZWFkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QuZW50YW5nbGVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBDbGVhciB0aGUgbGFuZXMgdGhhdCBubyBsb25nZXIgaGF2ZSBwZW5kaW5nIHdvcmtcblxuICB2YXIgbGFuZXMgPSBub0xvbmdlclBlbmRpbmdMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdID0gTm9MYW5lcztcbiAgICBldmVudFRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgZW50YW5nbGVkTGFuZXMpIHtcbiAgLy8gSW4gYWRkaXRpb24gdG8gZW50YW5nbGluZyBlYWNoIG9mIHRoZSBnaXZlbiBsYW5lcyB3aXRoIGVhY2ggb3RoZXIsIHdlIGFsc29cbiAgLy8gaGF2ZSB0byBjb25zaWRlciBfdHJhbnNpdGl2ZV8gZW50YW5nbGVtZW50cy4gRm9yIGVhY2ggbGFuZSB0aGF0IGlzIGFscmVhZHlcbiAgLy8gZW50YW5nbGVkIHdpdGggKmFueSogb2YgdGhlIGdpdmVuIGxhbmVzLCB0aGF0IGxhbmUgaXMgbm93IHRyYW5zaXRpdmVseVxuICAvLyBlbnRhbmdsZWQgd2l0aCAqYWxsKiB0aGUgZ2l2ZW4gbGFuZXMuXG4gIC8vXG4gIC8vIFRyYW5zbGF0ZWQ6IElmIEMgaXMgZW50YW5nbGVkIHdpdGggQSwgdGhlbiBlbnRhbmdsaW5nIEEgd2l0aCBCIGFsc29cbiAgLy8gZW50YW5nbGVzIEMgd2l0aCBCLlxuICAvL1xuICAvLyBJZiB0aGlzIGlzIGhhcmQgdG8gZ3Jhc3AsIGl0IG1pZ2h0IGhlbHAgdG8gaW50ZW50aW9uYWxseSBicmVhayB0aGlzXG4gIC8vIGZ1bmN0aW9uIGFuZCBsb29rIGF0IHRoZSB0ZXN0cyB0aGF0IGZhaWwgaW4gUmVhY3RUcmFuc2l0aW9uLXRlc3QuanMuIFRyeVxuICAvLyBjb21tZW50aW5nIG91dCBvbmUgb2YgdGhlIGNvbmRpdGlvbnMgYmVsb3cuXG4gIHZhciByb290RW50YW5nbGVkTGFuZXMgPSByb290LmVudGFuZ2xlZExhbmVzIHw9IGVudGFuZ2xlZExhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGxhbmVzID0gcm9vdEVudGFuZ2xlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcykge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcblxuICAgIGlmICggLy8gSXMgdGhpcyBvbmUgb2YgdGhlIG5ld2x5IGVudGFuZ2xlZCBsYW5lcz9cbiAgICBsYW5lICYgZW50YW5nbGVkTGFuZXMgfCAvLyBJcyB0aGlzIGxhbmUgdHJhbnNpdGl2ZWx5IGVudGFuZ2xlZCB3aXRoIHRoZSBuZXdseSBlbnRhbmdsZWQgbGFuZXM/XG4gICAgZW50YW5nbGVtZW50c1tpbmRleF0gJiBlbnRhbmdsZWRMYW5lcykge1xuICAgICAgZW50YW5nbGVtZW50c1tpbmRleF0gfD0gZW50YW5nbGVkTGFuZXM7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb24ocm9vdCwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHJlbmRlckxhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKHJlbmRlckxhbmVzKTtcbiAgdmFyIGxhbmU7XG5cbiAgc3dpdGNoIChyZW5kZXJMYW5lKSB7XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgbGFuZSA9IElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgICBsYW5lID0gRGVmYXVsdEh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgbGFuZSA9IFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVMYW5lOlxuICAgICAgbGFuZSA9IElkbGVIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRXZlcnl0aGluZyBlbHNlIGlzIGFscmVhZHkgZWl0aGVyIGEgaHlkcmF0aW9uIGxhbmUsIG9yIHNob3VsZG4ndFxuICAgICAgLy8gYmUgcmV0cmllZCBhdCBhIGh5ZHJhdGlvbiBsYW5lLlxuICAgICAgbGFuZSA9IE5vTGFuZTtcbiAgICAgIGJyZWFrO1xuICB9IC8vIENoZWNrIGlmIHRoZSBsYW5lIHdlIGNob3NlIGlzIHN1c3BlbmRlZC4gSWYgc28sIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2VcbiAgLy8gYWxyZWFkeSBhdHRlbXB0ZWQgYW5kIGZhaWxlZCB0byBoeWRyYXRlIGF0IHRoYXQgbGV2ZWwuIEFsc28gY2hlY2sgaWYgd2UncmVcbiAgLy8gYWxyZWFkeSByZW5kZXJpbmcgdGhhdCBsYW5lLCB3aGljaCBpcyByYXJlIGJ1dCBjb3VsZCBoYXBwZW4uXG5cblxuICBpZiAoKGxhbmUgJiAocm9vdC5zdXNwZW5kZWRMYW5lcyB8IHJlbmRlckxhbmVzKSkgIT09IE5vTGFuZSkge1xuICAgIC8vIEdpdmUgdXAgdHJ5aW5nIHRvIGh5ZHJhdGUgYW5kIGZhbGwgYmFjayB0byBjbGllbnQgcmVuZGVyLlxuICAgIHJldHVybiBOb0xhbmU7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZXMpIHtcblxuICBpZiAoIWlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXA7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIHVwZGF0ZXJzID0gcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcFtpbmRleF07XG4gICAgdXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKSB7XG5cbiAgaWYgKCFpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gcm9vdC5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwO1xuICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgdXBkYXRlcnMgPSBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwW2luZGV4XTtcblxuICAgIGlmICh1cGRhdGVycy5zaXplID4gMCkge1xuICAgICAgdXBkYXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICBpZiAoYWx0ZXJuYXRlID09PSBudWxsIHx8ICFtZW1vaXplZFVwZGF0ZXJzLmhhcyhhbHRlcm5hdGUpKSB7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5hZGQoZmliZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25zRm9yTGFuZXMocm9vdCwgbGFuZXMpIHtcbiAge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciBEaXNjcmV0ZUV2ZW50UHJpb3JpdHkgPSBTeW5jTGFuZTtcbnZhciBDb250aW51b3VzRXZlbnRQcmlvcml0eSA9IElucHV0Q29udGludW91c0xhbmU7XG52YXIgRGVmYXVsdEV2ZW50UHJpb3JpdHkgPSBEZWZhdWx0TGFuZTtcbnZhciBJZGxlRXZlbnRQcmlvcml0eSA9IElkbGVMYW5lO1xudmFyIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IE5vTGFuZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpIHtcbiAgcmV0dXJuIGN1cnJlbnRVcGRhdGVQcmlvcml0eTtcbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShuZXdQcmlvcml0eSkge1xuICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBuZXdQcmlvcml0eTtcbn1cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eShwcmlvcml0eSwgZm4pIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBjdXJyZW50VXBkYXRlUHJpb3JpdHk7XG5cbiAgdHJ5IHtcbiAgICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBwcmV2aW91c1ByaW9yaXR5O1xuICB9XG59XG5mdW5jdGlvbiBoaWdoZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgIT09IDAgJiYgYSA8IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGxvd2VyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhID09PSAwIHx8IGEgPiBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBpc0hpZ2hlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSAhPT0gMCAmJiBhIDwgYjtcbn1cbmZ1bmN0aW9uIGxhbmVzVG9FdmVudFByaW9yaXR5KGxhbmVzKSB7XG4gIHZhciBsYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcyk7XG5cbiAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5LCBsYW5lKSkge1xuICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eShDb250aW51b3VzRXZlbnRQcmlvcml0eSwgbGFuZSkpIHtcbiAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG4gIH1cblxuICBpZiAoaW5jbHVkZXNOb25JZGxlV29yayhsYW5lKSkge1xuICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIHJldHVybiBJZGxlRXZlbnRQcmlvcml0eTtcbn1cblxuLy8gVGhpcyBpcyBpbXBvcnRlZCBieSB0aGUgZXZlbnQgcmVwbGF5aW5nIGltcGxlbWVudGF0aW9uIGluIFJlYWN0IERPTS4gSXQnc1xuLy8gaW4gYSBzZXBhcmF0ZSBmaWxlIHRvIGJyZWFrIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSByZW5kZXJlciBhbmRcbi8vIHRoZSByZWNvbmNpbGVyLlxuZnVuY3Rpb24gaXNSb290RGVoeWRyYXRlZChyb290KSB7XG4gIHZhciBjdXJyZW50U3RhdGUgPSByb290LmN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIGN1cnJlbnRTdGF0ZS5pc0RlaHlkcmF0ZWQ7XG59XG5cbnZhciBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uO1xuXG5mdW5jdGlvbiBzZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZm4pIHtcbiAgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiA9IGZuO1xufVxuZnVuY3Rpb24gYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKSB7XG4gIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpO1xufVxudmFyIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uO1xuZnVuY3Rpb24gc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24gPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5ID0gZm47XG59XG52YXIgZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDE7XG5mdW5jdGlvbiBzZXRHZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoZm4pIHtcbiAgZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDEgPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eTtcbmZ1bmN0aW9uIHNldEF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KGZuKSB7XG4gIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5ID0gZm47XG59IC8vIFRPRE86IFVwZ3JhZGUgdGhpcyBkZWZpbml0aW9uIG9uY2Ugd2UncmUgb24gYSBuZXdlciB2ZXJzaW9uIG9mIEZsb3cgdGhhdFxuLy8gaGFzIHRoaXMgZGVmaW5pdGlvbiBidWlsdC1pbi5cblxudmFyIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTsgLy8gVGhlIHF1ZXVlIG9mIGRpc2NyZXRlIGV2ZW50cyB0byBiZSByZXBsYXllZC5cblxudmFyIHF1ZXVlZERpc2NyZXRlRXZlbnRzID0gW107IC8vIEluZGljYXRlcyBpZiBhbnkgY29udGludW91cyBldmVudCB0YXJnZXRzIGFyZSBub24tbnVsbCBmb3IgZWFybHkgYmFpbG91dC5cbi8vIGlmIHRoZSBsYXN0IHRhcmdldCB3YXMgZGVoeWRyYXRlZC5cblxudmFyIHF1ZXVlZEZvY3VzID0gbnVsbDtcbnZhciBxdWV1ZWREcmFnID0gbnVsbDtcbnZhciBxdWV1ZWRNb3VzZSA9IG51bGw7IC8vIEZvciBwb2ludGVyIGV2ZW50cyB0aGVyZSBjYW4gYmUgb25lIGxhdGVzdCBldmVudCBwZXIgcG9pbnRlcklkLlxuXG52YXIgcXVldWVkUG9pbnRlcnMgPSBuZXcgTWFwKCk7XG52YXIgcXVldWVkUG9pbnRlckNhcHR1cmVzID0gbmV3IE1hcCgpOyAvLyBXZSBjb3VsZCBjb25zaWRlciByZXBsYXlpbmcgc2VsZWN0aW9uY2hhbmdlIGFuZCB0b3VjaG1vdmVzIHRvby5cblxudmFyIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cyA9IFtdO1xudmFyIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cyA9IFsnbW91c2Vkb3duJywgJ21vdXNldXAnLCAndG91Y2hjYW5jZWwnLCAndG91Y2hlbmQnLCAndG91Y2hzdGFydCcsICdhdXhjbGljaycsICdkYmxjbGljaycsICdwb2ludGVyY2FuY2VsJywgJ3BvaW50ZXJkb3duJywgJ3BvaW50ZXJ1cCcsICdkcmFnZW5kJywgJ2RyYWdzdGFydCcsICdkcm9wJywgJ2NvbXBvc2l0aW9uZW5kJywgJ2NvbXBvc2l0aW9uc3RhcnQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdpbnB1dCcsICd0ZXh0SW5wdXQnLCAvLyBJbnRlbnRpb25hbGx5IGNhbWVsQ2FzZVxuJ2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ2NsaWNrJywgJ2NoYW5nZScsICdjb250ZXh0bWVudScsICdyZXNldCcsICdzdWJtaXQnXTtcbmZ1bmN0aW9uIGlzRGlzY3JldGVFdmVudFRoYXRSZXF1aXJlc0h5ZHJhdGlvbihldmVudFR5cGUpIHtcbiAgcmV0dXJuIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cy5pbmRleE9mKGV2ZW50VHlwZSkgPiAtMTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUXVldWVkUmVwbGF5YWJsZUV2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiB7XG4gICAgYmxvY2tlZE9uOiBibG9ja2VkT24sXG4gICAgZG9tRXZlbnROYW1lOiBkb21FdmVudE5hbWUsXG4gICAgZXZlbnRTeXN0ZW1GbGFnczogZXZlbnRTeXN0ZW1GbGFncyxcbiAgICBuYXRpdmVFdmVudDogbmF0aXZlRXZlbnQsXG4gICAgdGFyZ2V0Q29udGFpbmVyczogW3RhcmdldENvbnRhaW5lcl1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgcXVldWVkRm9jdXMgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgICBxdWV1ZWRNb3VzZSA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJJZCA9IG5hdGl2ZUV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuZGVsZXRlKHBvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZGVsZXRlKF9wb2ludGVySWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KGV4aXN0aW5nUXVldWVkRXZlbnQsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChleGlzdGluZ1F1ZXVlZEV2ZW50ID09PSBudWxsIHx8IGV4aXN0aW5nUXVldWVkRXZlbnQubmF0aXZlRXZlbnQgIT09IG5hdGl2ZUV2ZW50KSB7XG4gICAgdmFyIHF1ZXVlZEV2ZW50ID0gY3JlYXRlUXVldWVkUmVwbGF5YWJsZUV2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICAgIGlmIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIHZhciBfZmliZXIyID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShibG9ja2VkT24pO1xuXG4gICAgICBpZiAoX2ZpYmVyMiAhPT0gbnVsbCkge1xuICAgICAgICAvLyBBdHRlbXB0IHRvIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiB0aGlzIHRhcmdldC5cbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXVlZEV2ZW50O1xuICB9IC8vIElmIHdlIGhhdmUgYWxyZWFkeSBxdWV1ZWQgdGhpcyBleGFjdCBldmVudCwgdGhlbiBpdCdzIGJlY2F1c2VcbiAgLy8gdGhlIGRpZmZlcmVudCBldmVudCBzeXN0ZW1zIGhhdmUgZGlmZmVyZW50IERPTSBldmVudCBsaXN0ZW5lcnMuXG4gIC8vIFdlIGNhbiBhY2N1bXVsYXRlIHRoZSBmbGFncywgYW5kIHRoZSB0YXJnZXRDb250YWluZXJzLCBhbmRcbiAgLy8gc3RvcmUgYSBzaW5nbGUgZXZlbnQgdG8gYmUgcmVwbGF5ZWQuXG5cblxuICBleGlzdGluZ1F1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MgfD0gZXZlbnRTeXN0ZW1GbGFncztcbiAgdmFyIHRhcmdldENvbnRhaW5lcnMgPSBleGlzdGluZ1F1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgaWYgKHRhcmdldENvbnRhaW5lciAhPT0gbnVsbCAmJiB0YXJnZXRDb250YWluZXJzLmluZGV4T2YodGFyZ2V0Q29udGFpbmVyKSA9PT0gLTEpIHtcbiAgICB0YXJnZXRDb250YWluZXJzLnB1c2godGFyZ2V0Q29udGFpbmVyKTtcbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1F1ZXVlZEV2ZW50O1xufVxuXG5mdW5jdGlvbiBxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRoZXNlIHNldCByZWxhdGVkVGFyZ2V0IHRvIG51bGwgYmVjYXVzZSB0aGUgcmVwbGF5ZWQgZXZlbnQgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIHdlXG4gIC8vIG1vdmVkIGZyb20gb3V0c2lkZSB0aGUgd2luZG93IChubyB0YXJnZXQpIG9udG8gdGhlIHRhcmdldCBvbmNlIGl0IGh5ZHJhdGVzLlxuICAvLyBJbnN0ZWFkIG9mIG11dGF0aW5nIHdlIGNvdWxkIGNsb25lIHRoZSBldmVudC5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZvY3VzRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRm9jdXMgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZEZvY3VzLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBmb2N1c0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgZHJhZ0V2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZERyYWcgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZERyYWcsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGRyYWdFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIG1vdXNlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkTW91c2UgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZE1vdXNlLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBtb3VzZUV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBwb2ludGVyRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIHBvaW50ZXJJZCA9IHBvaW50ZXJFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJzLnNldChwb2ludGVySWQsIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkUG9pbnRlcnMuZ2V0KHBvaW50ZXJJZCkgfHwgbnVsbCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcG9pbnRlckV2ZW50KSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgICAge1xuICAgICAgICB2YXIgX3BvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgX3BvaW50ZXJJZDIgPSBfcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLnNldChfcG9pbnRlcklkMiwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZ2V0KF9wb2ludGVySWQyKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBfcG9pbnRlckV2ZW50KSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBDaGVjayBpZiB0aGlzIHRhcmdldCBpcyB1bmJsb2NrZWQuIFJldHVybnMgdHJ1ZSBpZiBpdCdzIHVuYmxvY2tlZC5cblxuZnVuY3Rpb24gYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHF1ZXVlZFRhcmdldCkge1xuICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNoYXJlcyBhIGxvdCBvZiBsb2dpYyB3aXRoIGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQuXG4gIC8vIFRyeSB0byB1bmlmeSB0aGVtLiBJdCdzIGEgYml0IHRyaWNreSBzaW5jZSBpdCB3b3VsZCByZXF1aXJlIHR3byByZXR1cm5cbiAgLy8gdmFsdWVzLlxuICB2YXIgdGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHF1ZXVlZFRhcmdldC50YXJnZXQpO1xuXG4gIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0YXJnZXRJbnN0KTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmxvY2tlZCBvbiBoeWRyYXRpbmcgdGhpcyBib3VuZGFyeS5cbiAgICAgICAgICAvLyBJbmNyZWFzZSBpdHMgcHJpb3JpdHkuXG4gICAgICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IGluc3RhbmNlO1xuICAgICAgICAgIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KHF1ZXVlZFRhcmdldC5wcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICB2YXIgcm9vdCA9IG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBnZXRDb250YWluZXJGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpOyAvLyBXZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBhIHdheSB0byBpbmNyZWFzZSB0aGUgcHJpb3JpdHkgb2ZcbiAgICAgICAgICAvLyBhIHJvb3Qgb3RoZXIgdGhhbiBzeW5jLlxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlRXhwbGljaXRIeWRyYXRpb25UYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgd2lsbCByZWFkIHRoZSBwcmlvcml0eSBpZiBpdCdzIGRpc3BhdGNoZWQgYnkgdGhlIFJlYWN0XG4gIC8vIGV2ZW50IHN5c3RlbSBidXQgbm90IG5hdGl2ZSBldmVudHMuIFNob3VsZCByZWFkIHdpbmRvdy5ldmVudC50eXBlLCBsaWtlXG4gIC8vIHdlIGRvIGZvciB1cGRhdGVzIChnZXRDdXJyZW50RXZlbnRQcmlvcml0eSkuXG4gIHZhciB1cGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxKCk7XG4gIHZhciBxdWV1ZWRUYXJnZXQgPSB7XG4gICAgYmxvY2tlZE9uOiBudWxsLFxuICAgIHRhcmdldDogdGFyZ2V0LFxuICAgIHByaW9yaXR5OiB1cGRhdGVQcmlvcml0eVxuICB9O1xuICB2YXIgaSA9IDA7XG5cbiAgZm9yICg7IGkgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBTdG9wIG9uY2Ugd2UgaGl0IHRoZSBmaXJzdCB0YXJnZXQgd2l0aCBsb3dlciBwcmlvcml0eSB0aGFuXG4gICAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkodXBkYXRlUHJpb3JpdHksIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1tpXS5wcmlvcml0eSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5zcGxpY2UoaSwgMCwgcXVldWVkVGFyZ2V0KTtcblxuICBpZiAoaSA9PT0gMCkge1xuICAgIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRXZlbnQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0YXJnZXRDb250YWluZXJzID0gcXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICB3aGlsZSAodGFyZ2V0Q29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHRhcmdldENvbnRhaW5lciA9IHRhcmdldENvbnRhaW5lcnNbMF07XG4gICAgdmFyIG5leHRCbG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KHF1ZXVlZEV2ZW50LmRvbUV2ZW50TmFtZSwgcXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBxdWV1ZWRFdmVudC5uYXRpdmVFdmVudCk7XG5cbiAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB2YXIgbmF0aXZlRXZlbnQgPSBxdWV1ZWRFdmVudC5uYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIG5hdGl2ZUV2ZW50Q2xvbmUgPSBuZXcgbmF0aXZlRXZlbnQuY29uc3RydWN0b3IobmF0aXZlRXZlbnQudHlwZSwgbmF0aXZlRXZlbnQpO1xuICAgICAgICBzZXRSZXBsYXlpbmdFdmVudChuYXRpdmVFdmVudENsb25lKTtcbiAgICAgICAgbmF0aXZlRXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7XG4gICAgICAgIHJlc2V0UmVwbGF5aW5nRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC4gVHJ5IGFnYWluIGxhdGVyLlxuICAgICAgdmFyIF9maWJlcjMgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKG5leHRCbG9ja2VkT24pO1xuXG4gICAgICBpZiAoX2ZpYmVyMyAhPT0gbnVsbCkge1xuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIzKTtcbiAgICAgIH1cblxuICAgICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIFRoaXMgdGFyZ2V0IGNvbnRhaW5lciB3YXMgc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQuIFRyeSB0aGUgbmV4dC5cblxuXG4gICAgdGFyZ2V0Q29udGFpbmVycy5zaGlmdCgpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcChxdWV1ZWRFdmVudCwga2V5LCBtYXApIHtcbiAgaWYgKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRXZlbnQpKSB7XG4gICAgbWFwLmRlbGV0ZShrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxheVVuYmxvY2tlZEV2ZW50cygpIHtcbiAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IGZhbHNlO1xuXG5cbiAgaWYgKHF1ZXVlZEZvY3VzICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRm9jdXMpKSB7XG4gICAgcXVldWVkRm9jdXMgPSBudWxsO1xuICB9XG5cbiAgaWYgKHF1ZXVlZERyYWcgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWREcmFnKSkge1xuICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICB9XG5cbiAgaWYgKHF1ZXVlZE1vdXNlICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkTW91c2UpKSB7XG4gICAgcXVldWVkTW91c2UgPSBudWxsO1xuICB9XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXApO1xuICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZm9yRWFjaChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXApO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCkge1xuICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuXG4gICAgaWYgKCFoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0KSB7XG4gICAgICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gdHJ1ZTsgLy8gU2NoZWR1bGUgYSBjYWxsYmFjayB0byBhdHRlbXB0IHJlcGxheWluZyBhcyBtYW55IGV2ZW50cyBhcyBhcmVcbiAgICAgIC8vIG5vdyB1bmJsb2NrZWQuIFRoaXMgZmlyc3QgbWlnaHQgbm90IGFjdHVhbGx5IGJlIHVuYmxvY2tlZCB5ZXQuXG4gICAgICAvLyBXZSBjb3VsZCBjaGVjayBpdCBlYXJseSB0byBhdm9pZCBzY2hlZHVsaW5nIGFuIHVubmVjZXNzYXJ5IGNhbGxiYWNrLlxuXG4gICAgICBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksIHJlcGxheVVuYmxvY2tlZEV2ZW50cyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJldHJ5SWZCbG9ja2VkT24odW5ibG9ja2VkKSB7XG4gIC8vIE1hcmsgYW55dGhpbmcgdGhhdCB3YXMgYmxvY2tlZCBvbiB0aGlzIGFzIG5vIGxvbmdlciBibG9ja2VkXG4gIC8vIGFuZCBlbGlnaWJsZSBmb3IgYSByZXBsYXkuXG4gIGlmIChxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERpc2NyZXRlRXZlbnRzWzBdLCB1bmJsb2NrZWQpOyAvLyBUaGlzIGlzIGEgZXhwb25lbnRpYWwgc2VhcmNoIGZvciBlYWNoIGJvdW5kYXJ5IHRoYXQgY29tbWl0cy4gSSB0aGluayBpdCdzXG4gICAgLy8gd29ydGggaXQgYmVjYXVzZSB3ZSBleHBlY3QgdmVyeSBmZXcgZGlzY3JldGUgZXZlbnRzIHRvIHF1ZXVlIHVwIGFuZCBvbmNlXG4gICAgLy8gd2UgYXJlIGFjdHVhbGx5IGZ1bGx5IHVuYmxvY2tlZCBpdCB3aWxsIGJlIGZhc3QgdG8gcmVwbGF5IHRoZW0uXG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHF1ZXVlZERpc2NyZXRlRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVldWVkRXZlbnQgPSBxdWV1ZWREaXNjcmV0ZUV2ZW50c1tpXTtcblxuICAgICAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHF1ZXVlZEZvY3VzICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEZvY3VzLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgaWYgKHF1ZXVlZERyYWcgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRHJhZywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRNb3VzZSwgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIHZhciB1bmJsb2NrID0gZnVuY3Rpb24gKHF1ZXVlZEV2ZW50KSB7XG4gICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKTtcbiAgfTtcblxuICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKHVuYmxvY2spO1xuICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZm9yRWFjaCh1bmJsb2NrKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBxdWV1ZWRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbX2ldO1xuXG4gICAgaWYgKHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIG5leHRFeHBsaWNpdFRhcmdldCA9IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1swXTtcblxuICAgIGlmIChuZXh0RXhwbGljaXRUYXJnZXQuYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBzdGlsbCBibG9ja2VkLlxuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChuZXh0RXhwbGljaXRUYXJnZXQpO1xuXG4gICAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBXZSdyZSB1bmJsb2NrZWQuXG4gICAgICAgIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZzsgLy8gVE9ETzogY2FuIHdlIHN0b3AgZXhwb3J0aW5nIHRoZXNlP1xuXG52YXIgX2VuYWJsZWQgPSB0cnVlOyAvLyBUaGlzIGlzIGV4cG9ydGVkIGluIEZCIGJ1aWxkcyBmb3IgdXNlIGJ5IGxlZ2FjeSBGQiBsYXllciBpbmZyYS5cbi8vIFdlJ2QgbGlrZSB0byByZW1vdmUgdGhpcyBidXQgaXQncyBub3QgY2xlYXIgaWYgdGhpcyBpcyBzYWZlLlxuXG5mdW5jdGlvbiBzZXRFbmFibGVkKGVuYWJsZWQpIHtcbiAgX2VuYWJsZWQgPSAhIWVuYWJsZWQ7XG59XG5mdW5jdGlvbiBpc0VuYWJsZWQoKSB7XG4gIHJldHVybiBfZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBldmVudFByaW9yaXR5ID0gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpO1xuICB2YXIgbGlzdGVuZXJXcmFwcGVyO1xuXG4gIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcldyYXBwZXIuYmluZChudWxsLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcik7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRGlzY3JldGVFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaENvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoQ29udGludW91c0V2ZW50UHJpb3JpdHkpO1xuICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIGlmICghX2VuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgZGlzcGF0Y2hFdmVudFdpdGhFbmFibGVDYXB0dXJlUGhhc2VTZWxlY3RpdmVIeWRyYXRpb25XaXRob3V0RGlzY3JldGVFdmVudFJlcGxheShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRXaXRoRW5hYmxlQ2FwdHVyZVBoYXNlU2VsZWN0aXZlSHlkcmF0aW9uV2l0aG91dERpc2NyZXRlRXZlbnRSZXBsYXkoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBibG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgaWYgKGJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCByZXR1cm5fdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTtcbiAgICBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSkge1xuICAgIG5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHJldHVybjtcbiAgfSAvLyBXZSBuZWVkIHRvIGNsZWFyIG9ubHkgaWYgd2UgZGlkbid0IHF1ZXVlIGJlY2F1c2VcbiAgLy8gcXVldWVpbmcgaXMgYWNjdW11bGF0aXZlLlxuXG5cbiAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UgJiYgaXNEaXNjcmV0ZUV2ZW50VGhhdFJlcXVpcmVzSHlkcmF0aW9uKGRvbUV2ZW50TmFtZSkpIHtcbiAgICB3aGlsZSAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgZmliZXIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChmaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV4dEJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICAgICAgaWYgKG5leHRCbG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHJldHVybl90YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gYmxvY2tlZE9uKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBibG9ja2VkT24gPSBuZXh0QmxvY2tlZE9uO1xuICAgIH1cblxuICAgIGlmIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIG5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSAvLyBUaGlzIGlzIG5vdCByZXBsYXlhYmxlIHNvIHdlJ2xsIGludm9rZSBpdCBidXQgd2l0aG91dCBhIHRhcmdldCxcbiAgLy8gaW4gY2FzZSB0aGUgZXZlbnQgc3lzdGVtIG5lZWRzIHRvIHRyYWNlIGl0LlxuXG5cbiAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIG51bGwsIHRhcmdldENvbnRhaW5lcik7XG59XG5cbnZhciByZXR1cm5fdGFyZ2V0SW5zdCA9IG51bGw7IC8vIFJldHVybnMgYSBTdXNwZW5zZUluc3RhbmNlIG9yIENvbnRhaW5lciBpZiBpdCdzIGJsb2NrZWQuXG4vLyBUaGUgcmV0dXJuX3RhcmdldEluc3QgZmllbGQgYWJvdmUgaXMgY29uY2VwdHVhbGx5IHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZS5cblxuZnVuY3Rpb24gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVE9ETzogV2FybiBpZiBfZW5hYmxlZCBpcyBmYWxzZS5cbiAgcmV0dXJuX3RhcmdldEluc3QgPSBudWxsO1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCk7XG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0YXJnZXRJbnN0KTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB0cmVlIGhhcyBiZWVuIHVubW91bnRlZCBhbHJlYWR5LiBEaXNwYXRjaCB3aXRob3V0IGEgdGFyZ2V0LlxuICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7XG5cbiAgICAgIGlmICh0YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFF1ZXVlIHRoZSBldmVudCB0byBiZSByZXBsYXllZCBsYXRlci4gQWJvcnQgZGlzcGF0Y2hpbmcgc2luY2Ugd2VcbiAgICAgICAgICAvLyBkb24ndCB3YW50IHRoaXMgZXZlbnQgZGlzcGF0Y2hlZCB0d2ljZSB0aHJvdWdoIHRoZSBldmVudCBzeXN0ZW0uXG4gICAgICAgICAgLy8gVE9ETzogSWYgdGhpcyBpcyB0aGUgZmlyc3QgZGlzY3JldGUgZXZlbnQgaW4gdGhlIHF1ZXVlLiBTY2hlZHVsZSBhbiBpbmNyZWFzZWRcbiAgICAgICAgICAvLyBwcmlvcml0eSBmb3IgdGhpcyBib3VuZGFyeS5cbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH0gLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBzb21ldGhpbmcgd2VudCB3cm9uZyBidXQgdG8gYXZvaWQgYmxvY2tpbmdcbiAgICAgICAgLy8gdGhlIHdob2xlIHN5c3RlbSwgZGlzcGF0Y2ggdGhlIGV2ZW50IHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICAgIC8vIFRPRE86IFdhcm4uXG5cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICB2YXIgcm9vdCA9IG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgaGFwcGVucyBkdXJpbmcgYSByZXBsYXkgc29tZXRoaW5nIHdlbnQgd3JvbmcgYW5kIGl0IG1pZ2h0IGJsb2NrXG4gICAgICAgICAgLy8gdGhlIHdob2xlIHN5c3RlbS5cbiAgICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gdGFyZ2V0SW5zdCkge1xuICAgICAgICAvLyBJZiB3ZSBnZXQgYW4gZXZlbnQgKGV4OiBpbWcgb25sb2FkKSBiZWZvcmUgY29tbWl0dGluZyB0aGF0XG4gICAgICAgIC8vIGNvbXBvbmVudCdzIG1vdW50LCBpZ25vcmUgaXQgZm9yIG5vdyAodGhhdCBpcywgdHJlYXQgaXQgYXMgaWYgaXQgd2FzIGFuXG4gICAgICAgIC8vIGV2ZW50IG9uIGEgbm9uLVJlYWN0IHRyZWUpLiBXZSBtaWdodCBhbHNvIGNvbnNpZGVyIHF1ZXVlaW5nIGV2ZW50cyBhbmRcbiAgICAgICAgLy8gZGlzcGF0Y2hpbmcgdGhlbSBhZnRlciB0aGUgbW91bnQuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDsgLy8gV2UncmUgbm90IGJsb2NrZWQgb24gYW55dGhpbmcuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRFdmVudFByaW9yaXR5KGRvbUV2ZW50TmFtZSkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIC8vIFVzZWQgYnkgU2ltcGxlRXZlbnRQbHVnaW46XG4gICAgY2FzZSAnY2FuY2VsJzpcbiAgICBjYXNlICdjbGljayc6XG4gICAgY2FzZSAnY2xvc2UnOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICBjYXNlICdjb3B5JzpcbiAgICBjYXNlICdjdXQnOlxuICAgIGNhc2UgJ2F1eGNsaWNrJzpcbiAgICBjYXNlICdkYmxjbGljayc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICBjYXNlICdkcm9wJzpcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ2ludmFsaWQnOlxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdtb3VzZXVwJzpcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgY2FzZSAncGF1c2UnOlxuICAgIGNhc2UgJ3BsYXknOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVydXAnOlxuICAgIGNhc2UgJ3JhdGVjaGFuZ2UnOlxuICAgIGNhc2UgJ3Jlc2V0JzpcbiAgICBjYXNlICdyZXNpemUnOlxuICAgIGNhc2UgJ3NlZWtlZCc6XG4gICAgY2FzZSAnc3VibWl0JzpcbiAgICBjYXNlICd0b3VjaGNhbmNlbCc6XG4gICAgY2FzZSAndG91Y2hlbmQnOlxuICAgIGNhc2UgJ3RvdWNoc3RhcnQnOlxuICAgIGNhc2UgJ3ZvbHVtZWNoYW5nZSc6IC8vIFVzZWQgYnkgcG9seWZpbGxzOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnY2hhbmdlJzpcbiAgICBjYXNlICdzZWxlY3Rpb25jaGFuZ2UnOlxuICAgIGNhc2UgJ3RleHRJbnB1dCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9udXBkYXRlJzogLy8gT25seSBlbmFibGVDcmVhdGVFdmVudEhhbmRsZUFQSTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6IC8vIE5vdCB1c2VkIGJ5IFJlYWN0IGJ1dCBjb3VsZCBiZSBieSB1c2VyIGNvZGU6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdiZWZvcmVpbnB1dCc6XG4gICAgY2FzZSAnYmx1cic6XG4gICAgY2FzZSAnZnVsbHNjcmVlbmNoYW5nZSc6XG4gICAgY2FzZSAnZm9jdXMnOlxuICAgIGNhc2UgJ2hhc2hjaGFuZ2UnOlxuICAgIGNhc2UgJ3BvcHN0YXRlJzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3NlbGVjdHN0YXJ0JzpcbiAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG5cbiAgICBjYXNlICdkcmFnJzpcbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdleGl0JzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJtb3ZlJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICBjYXNlICd0b2dnbGUnOlxuICAgIGNhc2UgJ3RvdWNobW92ZSc6XG4gICAgY2FzZSAnd2hlZWwnOiAvLyBOb3QgdXNlZCBieSBSZWFjdCBidXQgY291bGQgYmUgYnkgdXNlciBjb2RlOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnbW91c2VlbnRlcic6XG4gICAgY2FzZSAnbW91c2VsZWF2ZSc6XG4gICAgY2FzZSAncG9pbnRlcmVudGVyJzpcbiAgICBjYXNlICdwb2ludGVybGVhdmUnOlxuICAgICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuXG4gICAgY2FzZSAnbWVzc2FnZSc6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIG1pZ2h0IGJlIGluIHRoZSBTY2hlZHVsZXIgY2FsbGJhY2suXG4gICAgICAgIC8vIEV2ZW50dWFsbHkgdGhpcyBtZWNoYW5pc20gd2lsbCBiZSByZXBsYWNlZCBieSBhIGNoZWNrXG4gICAgICAgIC8vIG9mIHRoZSBjdXJyZW50IHByaW9yaXR5IG9uIHRoZSBuYXRpdmUgc2NoZWR1bGVyLlxuICAgICAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHkgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpO1xuXG4gICAgICAgIHN3aXRjaCAoc2NoZWR1bGVyUHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgICAgICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgTG93U2NoZWR1bGVyUHJpb3JpdHksIHNvbWVob3cuIE1heWJlIHRoZSBzYW1lIGxhbmUgYXMgaHlkcmF0aW9uLlxuICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gSWRsZUV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBUaGVzZSB2YXJpYWJsZXMgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGV4dCBjb250ZW50IG9mIGEgdGFyZ2V0IG5vZGUsXG4gKiBhbGxvd2luZyBjb21wYXJpc29uIG9mIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIElkZW50aWZ5IHRoZSBub2RlIHdoZXJlIHNlbGVjdGlvbiBjdXJyZW50bHkgYmVnaW5zLCB0aGVuIG9ic2VydmVcbiAqIGJvdGggaXRzIHRleHQgY29udGVudCBhbmQgaXRzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIERPTS4gU2luY2UgdGhlXG4gKiBicm93c2VyIG1heSBuYXRpdmVseSByZXBsYWNlIHRoZSB0YXJnZXQgbm9kZSBkdXJpbmcgY29tcG9zaXRpb24sIHdlIGNhblxuICogdXNlIGl0cyBwb3NpdGlvbiB0byBmaW5kIGl0cyByZXBsYWNlbWVudC5cbiAqXG4gKlxuICovXG52YXIgcm9vdCA9IG51bGw7XG52YXIgc3RhcnRUZXh0ID0gbnVsbDtcbnZhciBmYWxsYmFja1RleHQgPSBudWxsO1xuZnVuY3Rpb24gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCkge1xuICByb290ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIHN0YXJ0VGV4dCA9IGdldFRleHQoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXNldCgpIHtcbiAgcm9vdCA9IG51bGw7XG4gIHN0YXJ0VGV4dCA9IG51bGw7XG4gIGZhbGxiYWNrVGV4dCA9IG51bGw7XG59XG5mdW5jdGlvbiBnZXREYXRhKCkge1xuICBpZiAoZmFsbGJhY2tUZXh0KSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbiAgfVxuXG4gIHZhciBzdGFydDtcbiAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQ7XG4gIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICB2YXIgZW5kO1xuICB2YXIgZW5kVmFsdWUgPSBnZXRUZXh0KCk7XG4gIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG5cbiAgZm9yIChlbmQgPSAxOyBlbmQgPD0gbWluRW5kOyBlbmQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoIC0gZW5kXSAhPT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0gZW5kXSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVkO1xuICBmYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgc2xpY2VUYWlsKTtcbiAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHQoKSB7XG4gIGlmICgndmFsdWUnIGluIHJvb3QpIHtcbiAgICByZXR1cm4gcm9vdC52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByb290LnRleHRDb250ZW50O1xufVxuXG4vKipcbiAqIGBjaGFyQ29kZWAgcmVwcmVzZW50cyB0aGUgYWN0dWFsIFwiY2hhcmFjdGVyIGNvZGVcIiBhbmQgaXMgc2FmZSB0byB1c2Ugd2l0aFxuICogYFN0cmluZy5mcm9tQ2hhckNvZGVgLiBBcyBzdWNoLCBvbmx5IGtleXMgdGhhdCBjb3JyZXNwb25kIHRvIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBwcm9kdWNlIGEgdmFsaWQgYGNoYXJDb2RlYCwgdGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgaXMgRW50ZXIuXG4gKiBUaGUgVGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBgY2hhckNvZGVgLFxuICogcHJlc3VtYWJseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB0YWItY2hhcmFjdGVyIGluIGJyb3dzZXJzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge251bWJlcn0gTm9ybWFsaXplZCBgY2hhckNvZGVgIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjaGFyQ29kZTtcbiAgdmFyIGtleUNvZGUgPSBuYXRpdmVFdmVudC5rZXlDb2RlO1xuXG4gIGlmICgnY2hhckNvZGUnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgY2hhckNvZGUgPSBuYXRpdmVFdmVudC5jaGFyQ29kZTsgLy8gRkYgZG9lcyBub3Qgc2V0IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLlxuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfSAvLyBJRSBhbmQgRWRnZSAob24gV2luZG93cykgYW5kIENocm9tZSAvIFNhZmFyaSAob24gV2luZG93cyBhbmQgTGludXgpXG4gIC8vIHJlcG9ydCBFbnRlciBhcyBjaGFyQ29kZSAxMCB3aGVuIGN0cmwgaXMgcHJlc3NlZC5cblxuXG4gIGlmIChjaGFyQ29kZSA9PT0gMTApIHtcbiAgICBjaGFyQ29kZSA9IDEzO1xuICB9IC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuXG5cbiAgaWYgKGNoYXJDb2RlID49IDMyIHx8IGNoYXJDb2RlID09PSAxMykge1xuICAgIHJldHVybiBjaGFyQ29kZTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYSBmYWN0b3J5IHNvIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuZWQgY29uc3RydWN0b3JzLlxuLy8gSWYgd2UgaGFkIGEgc2luZ2xlIGNvbnN0cnVjdG9yLCBpdCB3b3VsZCBiZSBtZWdhbW9ycGhpYyBhbmQgZW5naW5lcyB3b3VsZCBkZW9wdC5cblxuXG5mdW5jdGlvbiBjcmVhdGVTeW50aGV0aWNFdmVudChJbnRlcmZhY2UpIHtcbiAgLyoqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgYXJlIGRpc3BhdGNoZWQgYnkgZXZlbnQgcGx1Z2lucywgdHlwaWNhbGx5IGluIHJlc3BvbnNlIHRvIGFcbiAgICogdG9wLWxldmVsIGV2ZW50IGRlbGVnYXRpb24gaGFuZGxlci5cbiAgICpcbiAgICogVGhlc2Ugc3lzdGVtcyBzaG91bGQgZ2VuZXJhbGx5IHVzZSBwb29saW5nIHRvIHJlZHVjZSB0aGUgZnJlcXVlbmN5IG9mIGdhcmJhZ2VcbiAgICogY29sbGVjdGlvbi4gVGhlIHN5c3RlbSBzaG91bGQgY2hlY2sgYGlzUGVyc2lzdGVudGAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlXG4gICAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAgICogbmVlZCBhIHBlcnNpc3RlZCBldmVudCBzaG91bGQgaW52b2tlIGBwZXJzaXN0YC5cbiAgICpcbiAgICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICAgKiBub3JtYWxpemluZyBicm93c2VyIHF1aXJrcy4gU3ViY2xhc3NlcyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBpbXBsZW1lbnQgYVxuICAgKiBET00gaW50ZXJmYWNlOyBjdXN0b20gYXBwbGljYXRpb24tc3BlY2lmaWMgZXZlbnRzIGNhbiBhbHNvIHN1YmNsYXNzIHRoaXMuXG4gICAqL1xuICBmdW5jdGlvbiBTeW50aGV0aWNCYXNlRXZlbnQocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lO1xuICAgIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0O1xuICAgIHRoaXMudHlwZSA9IHJlYWN0RXZlbnRUeXBlO1xuICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICB0aGlzLnRhcmdldCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShfcHJvcE5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW19wcm9wTmFtZV07XG5cbiAgICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbm9ybWFsaXplKG5hdGl2ZUV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W19wcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkIDogbmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IGZhbHNlO1xuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhc3NpZ24oU3ludGhldGljQmFzZUV2ZW50LnByb3RvdHlwZSwge1xuICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcblxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyAkRmxvd0ZpeE1lIC0gZmxvdyBpcyBub3QgYXdhcmUgb2YgYHVua25vd25gIGluIElFXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5yZXR1cm5WYWx1ZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcbiAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyAkRmxvd0ZpeE1lIC0gZmxvdyBpcyBub3QgYXdhcmUgb2YgYHVua25vd25gIGluIElFXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5jYW5jZWxCdWJibGUgIT09ICd1bmtub3duJykge1xuICAgICAgICAvLyBUaGUgQ2hhbmdlRXZlbnRQbHVnaW4gcmVnaXN0ZXJzIGEgXCJwcm9wZXJ0eWNoYW5nZVwiIGV2ZW50IGZvclxuICAgICAgICAvLyBJRS4gVGhpcyBldmVudCBkb2VzIG5vdCBzdXBwb3J0IGJ1YmJsaW5nIG9yIGNhbmNlbGxpbmcsIGFuZFxuICAgICAgICAvLyBhbnkgcmVmZXJlbmNlcyB0byBjYW5jZWxCdWJibGUgdGhyb3cgXCJNZW1iZXIgbm90IGZvdW5kXCIuICBBXG4gICAgICAgIC8vIHR5cGVvZiBjaGVjayBvZiBcInVua25vd25cIiBjaXJjdW12ZW50cyB0aGlzIGlzc3VlIChhbmQgaXMgYWxzb1xuICAgICAgICAvLyBJRSBzcGVjaWZpYykuXG4gICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2UgcmVsZWFzZSBhbGwgZGlzcGF0Y2hlZCBgU3ludGhldGljRXZlbnRgcyBhZnRlciBlYWNoIGV2ZW50IGxvb3AsIGFkZGluZ1xuICAgICAqIHRoZW0gYmFjayBpbnRvIHRoZSBwb29sLiBUaGlzIGFsbG93cyBhIHdheSB0byBob2xkIG9udG8gYSByZWZlcmVuY2UgdGhhdFxuICAgICAqIHdvbid0IGJlIGFkZGVkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKi9cbiAgICBwZXJzaXN0OiBmdW5jdGlvbiAoKSB7Ly8gTW9kZXJuIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGlzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc1BlcnNpc3RlbnQ6IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlXG4gIH0pO1xuICByZXR1cm4gU3ludGhldGljQmFzZUV2ZW50O1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBFdmVudEludGVyZmFjZSA9IHtcbiAgZXZlbnRQaGFzZTogMCxcbiAgYnViYmxlczogMCxcbiAgY2FuY2VsYWJsZTogMCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IDAsXG4gIGlzVHJ1c3RlZDogMFxufTtcbnZhciBTeW50aGV0aWNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIFVJRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIHZpZXc6IDAsXG4gIGRldGFpbDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVUlFdmVudEludGVyZmFjZSk7XG52YXIgbGFzdE1vdmVtZW50WDtcbnZhciBsYXN0TW92ZW1lbnRZO1xudmFyIGxhc3RNb3VzZUV2ZW50O1xuXG5mdW5jdGlvbiB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZShldmVudCkge1xuICBpZiAoZXZlbnQgIT09IGxhc3RNb3VzZUV2ZW50KSB7XG4gICAgaWYgKGxhc3RNb3VzZUV2ZW50ICYmIGV2ZW50LnR5cGUgPT09ICdtb3VzZW1vdmUnKSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gZXZlbnQuc2NyZWVuWCAtIGxhc3RNb3VzZUV2ZW50LnNjcmVlblg7XG4gICAgICBsYXN0TW92ZW1lbnRZID0gZXZlbnQuc2NyZWVuWSAtIGxhc3RNb3VzZUV2ZW50LnNjcmVlblk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RNb3ZlbWVudFggPSAwO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IDA7XG4gICAgfVxuXG4gICAgbGFzdE1vdXNlRXZlbnQgPSBldmVudDtcbiAgfVxufVxuLyoqXG4gKiBAaW50ZXJmYWNlIE1vdXNlRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIE1vdXNlRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgc2NyZWVuWDogMCxcbiAgc2NyZWVuWTogMCxcbiAgY2xpZW50WDogMCxcbiAgY2xpZW50WTogMCxcbiAgcGFnZVg6IDAsXG4gIHBhZ2VZOiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gIGJ1dHRvbjogMCxcbiAgYnV0dG9uczogMCxcbiAgcmVsYXRlZFRhcmdldDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC5zcmNFbGVtZW50ID8gZXZlbnQudG9FbGVtZW50IDogZXZlbnQuZnJvbUVsZW1lbnQ7XG4gICAgcmV0dXJuIGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gIH0sXG4gIG1vdmVtZW50WDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFgnIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRYO1xuICAgIH1cblxuICAgIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKGV2ZW50KTtcbiAgICByZXR1cm4gbGFzdE1vdmVtZW50WDtcbiAgfSxcbiAgbW92ZW1lbnRZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WScgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFk7XG4gICAgfSAvLyBEb24ndCBuZWVkIHRvIGNhbGwgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoKSBoZXJlXG4gICAgLy8gYmVjYXVzZSBpdCdzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhbHJlYWR5IHJ1biB3aGVuIG1vdmVtZW50WFxuICAgIC8vIHdhcyBjb3BpZWQuXG5cblxuICAgIHJldHVybiBsYXN0TW92ZW1lbnRZO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChNb3VzZUV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBEcmFnRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBEcmFnRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YVRyYW5zZmVyOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0RyYWdFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KERyYWdFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIEZvY3VzRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgcmVsYXRlZFRhcmdldDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNGb2N1c0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRm9jdXNFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1hbmltYXRpb25zLyNBbmltYXRpb25FdmVudC1pbnRlcmZhY2VcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0FuaW1hdGlvbkV2ZW50XG4gKi9cblxudmFyIEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBhbmltYXRpb25OYW1lOiAwLFxuICBlbGFwc2VkVGltZTogMCxcbiAgcHNldWRvRWxlbWVudDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNBbmltYXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jbGlwYm9hcmQtYXBpcy9cbiAqL1xuXG52YXIgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDbGlwYm9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9zaXRpb25ldmVudHNcbiAqL1xuXG52YXIgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDVcbiAqICAgICAgLyNldmVudHMtaW5wdXRldmVudHNcbiAqL1xuLy8gSGFwcGVucyB0byBzaGFyZSB0aGUgc2FtZSBsaXN0IGZvciBub3cuXG5cbnZhciBTeW50aGV0aWNJbnB1dEV2ZW50ID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudDtcbi8qKlxuICogTm9ybWFsaXphdGlvbiBvZiBkZXByZWNhdGVkIEhUTUw1IGBrZXlgIHZhbHVlc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xuXG52YXIgbm9ybWFsaXplS2V5ID0ge1xuICBFc2M6ICdFc2NhcGUnLFxuICBTcGFjZWJhcjogJyAnLFxuICBMZWZ0OiAnQXJyb3dMZWZ0JyxcbiAgVXA6ICdBcnJvd1VwJyxcbiAgUmlnaHQ6ICdBcnJvd1JpZ2h0JyxcbiAgRG93bjogJ0Fycm93RG93bicsXG4gIERlbDogJ0RlbGV0ZScsXG4gIFdpbjogJ09TJyxcbiAgTWVudTogJ0NvbnRleHRNZW51JyxcbiAgQXBwczogJ0NvbnRleHRNZW51JyxcbiAgU2Nyb2xsOiAnU2Nyb2xsTG9jaycsXG4gIE1velByaW50YWJsZUtleTogJ1VuaWRlbnRpZmllZCdcbn07XG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbGVnYWN5IGBrZXlDb2RlYCB0byBIVE1MNSBga2V5YFxuICogT25seSBzcGVjaWFsIGtleXMgc3VwcG9ydGVkLCBhbGwgb3RoZXJzIGRlcGVuZCBvbiBrZXlib2FyZCBsYXlvdXQgb3IgYnJvd3NlclxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xuXG52YXIgdHJhbnNsYXRlVG9LZXkgPSB7XG4gICc4JzogJ0JhY2tzcGFjZScsXG4gICc5JzogJ1RhYicsXG4gICcxMic6ICdDbGVhcicsXG4gICcxMyc6ICdFbnRlcicsXG4gICcxNic6ICdTaGlmdCcsXG4gICcxNyc6ICdDb250cm9sJyxcbiAgJzE4JzogJ0FsdCcsXG4gICcxOSc6ICdQYXVzZScsXG4gICcyMCc6ICdDYXBzTG9jaycsXG4gICcyNyc6ICdFc2NhcGUnLFxuICAnMzInOiAnICcsXG4gICczMyc6ICdQYWdlVXAnLFxuICAnMzQnOiAnUGFnZURvd24nLFxuICAnMzUnOiAnRW5kJyxcbiAgJzM2JzogJ0hvbWUnLFxuICAnMzcnOiAnQXJyb3dMZWZ0JyxcbiAgJzM4JzogJ0Fycm93VXAnLFxuICAnMzknOiAnQXJyb3dSaWdodCcsXG4gICc0MCc6ICdBcnJvd0Rvd24nLFxuICAnNDUnOiAnSW5zZXJ0JyxcbiAgJzQ2JzogJ0RlbGV0ZScsXG4gICcxMTInOiAnRjEnLFxuICAnMTEzJzogJ0YyJyxcbiAgJzExNCc6ICdGMycsXG4gICcxMTUnOiAnRjQnLFxuICAnMTE2JzogJ0Y1JyxcbiAgJzExNyc6ICdGNicsXG4gICcxMTgnOiAnRjcnLFxuICAnMTE5JzogJ0Y4JyxcbiAgJzEyMCc6ICdGOScsXG4gICcxMjEnOiAnRjEwJyxcbiAgJzEyMic6ICdGMTEnLFxuICAnMTIzJzogJ0YxMicsXG4gICcxNDQnOiAnTnVtTG9jaycsXG4gICcxNDUnOiAnU2Nyb2xsTG9jaycsXG4gICcyMjQnOiAnTWV0YSdcbn07XG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBga2V5YCBwcm9wZXJ0eS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudEtleShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQua2V5KSB7XG4gICAgLy8gTm9ybWFsaXplIGluY29uc2lzdGVudCB2YWx1ZXMgcmVwb3J0ZWQgYnkgYnJvd3NlcnMgZHVlIHRvXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIG9mIGEgd29ya2luZyBkcmFmdCBzcGVjaWZpY2F0aW9uLlxuICAgIC8vIEZpcmVGb3ggaW1wbGVtZW50cyBga2V5YCBidXQgcmV0dXJucyBgTW96UHJpbnRhYmxlS2V5YCBmb3IgYWxsXG4gICAgLy8gcHJpbnRhYmxlIGNoYXJhY3RlcnMgKG5vcm1hbGl6ZWQgdG8gYFVuaWRlbnRpZmllZGApLCBpZ25vcmUgaXQuXG4gICAgdmFyIGtleSA9IG5vcm1hbGl6ZUtleVtuYXRpdmVFdmVudC5rZXldIHx8IG5hdGl2ZUV2ZW50LmtleTtcblxuICAgIGlmIChrZXkgIT09ICdVbmlkZW50aWZpZWQnKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfSAvLyBCcm93c2VyIGRvZXMgbm90IGltcGxlbWVudCBga2V5YCwgcG9seWZpbGwgYXMgbXVjaCBvZiBpdCBhcyB3ZSBjYW4uXG5cblxuICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgIHZhciBjaGFyQ29kZSA9IGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpOyAvLyBUaGUgZW50ZXIta2V5IGlzIHRlY2huaWNhbGx5IGJvdGggcHJpbnRhYmxlIGFuZCBub24tcHJpbnRhYmxlIGFuZCBjYW5cbiAgICAvLyB0aHVzIGJlIGNhcHR1cmVkIGJ5IGBrZXlwcmVzc2AsIG5vIG90aGVyIG5vbi1wcmludGFibGUga2V5IHNob3VsZC5cblxuICAgIHJldHVybiBjaGFyQ29kZSA9PT0gMTMgPyAnRW50ZXInIDogU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gIH1cblxuICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAvLyBXaGlsZSB1c2VyIGtleWJvYXJkIGxheW91dCBkZXRlcm1pbmVzIHRoZSBhY3R1YWwgbWVhbmluZyBvZiBlYWNoXG4gICAgLy8gYGtleUNvZGVgIHZhbHVlLCBhbG1vc3QgYWxsIGZ1bmN0aW9uIGtleXMgaGF2ZSBhIHVuaXZlcnNhbCB2YWx1ZS5cbiAgICByZXR1cm4gdHJhbnNsYXRlVG9LZXlbbmF0aXZlRXZlbnQua2V5Q29kZV0gfHwgJ1VuaWRlbnRpZmllZCc7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbW9kaWZpZXIga2V5IHRvIHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5IGluIHRoZSBldmVudC5cbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNrZXlzLU1vZGlmaWVyc1xuICovXG5cblxudmFyIG1vZGlmaWVyS2V5VG9Qcm9wID0ge1xuICBBbHQ6ICdhbHRLZXknLFxuICBDb250cm9sOiAnY3RybEtleScsXG4gIE1ldGE6ICdtZXRhS2V5JyxcbiAgU2hpZnQ6ICdzaGlmdEtleSdcbn07IC8vIE9sZGVyIGJyb3dzZXJzIChTYWZhcmkgPD0gMTAsIGlPUyBTYWZhcmkgPD0gMTAuMikgZG8gbm90IHN1cHBvcnRcbi8vIGdldE1vZGlmaWVyU3RhdGUuIElmIGdldE1vZGlmaWVyU3RhdGUgaXMgbm90IHN1cHBvcnRlZCwgd2UgbWFwIGl0IHRvIGEgc2V0IG9mXG4vLyBtb2RpZmllciBrZXlzIGV4cG9zZWQgYnkgdGhlIGV2ZW50LiBJbiB0aGlzIGNhc2UsIExvY2sta2V5cyBhcmUgbm90IHN1cHBvcnRlZC5cblxuZnVuY3Rpb24gbW9kaWZpZXJTdGF0ZUdldHRlcihrZXlBcmcpIHtcbiAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gdGhpcztcbiAgdmFyIG5hdGl2ZUV2ZW50ID0gc3ludGhldGljRXZlbnQubmF0aXZlRXZlbnQ7XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUpIHtcbiAgICByZXR1cm4gbmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShrZXlBcmcpO1xuICB9XG5cbiAgdmFyIGtleVByb3AgPSBtb2RpZmllcktleVRvUHJvcFtrZXlBcmddO1xuICByZXR1cm4ga2V5UHJvcCA/ICEhbmF0aXZlRXZlbnRba2V5UHJvcF0gOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRNb2RpZmllclN0YXRlKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBtb2RpZmllclN0YXRlR2V0dGVyO1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEtleWJvYXJkRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIEtleWJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAga2V5OiBnZXRFdmVudEtleSxcbiAgY29kZTogMCxcbiAgbG9jYXRpb246IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIHJlcGVhdDogMCxcbiAgbG9jYWxlOiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gIC8vIExlZ2FjeSBJbnRlcmZhY2VcbiAgY2hhckNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBjaGFyQ29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleVByZXNzIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHRoZSBhY3R1YWwgcHJpbnRhYmxlIGNoYXJhY3Rlci5cbiAgICAvLyBLZXlQcmVzcyBpcyBkZXByZWNhdGVkLCBidXQgaXRzIHJlcGxhY2VtZW50IGlzIG5vdCB5ZXQgZmluYWwgYW5kIG5vdFxuICAgIC8vIGltcGxlbWVudGVkIGluIGFueSBtYWpvciBicm93c2VyLiBPbmx5IEtleVByZXNzIGhhcyBjaGFyQ29kZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9LFxuICBrZXlDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBga2V5Q29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleURvd24vVXAgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gcGh5c2ljYWwga2V5Ym9hcmQga2V5LlxuICAgIC8vIFRoZSBhY3R1YWwgbWVhbmluZyBvZiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdXNlcnMnIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZC4gQXNzdW1pbmcgdGhhdCBpdCBpcyBhIFVTIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHByb3ZpZGVzIGEgc3VycHJpc2luZ2x5IGFjY3VyYXRlIG1hcHBpbmcgZm9yIFVTIGFuZCBFdXJvcGVhbiB1c2Vycy5cbiAgICAvLyBEdWUgdG8gdGhpcywgaXQgaXMgbGVmdCB0byB0aGUgdXNlciB0byBpbXBsZW1lbnQgYXQgdGhpcyB0aW1lLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIHdoaWNoOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgd2hpY2hgIGlzIGFuIGFsaWFzIGZvciBlaXRoZXIgYGtleUNvZGVgIG9yIGBjaGFyQ29kZWAgZGVwZW5kaW5nIG9uIHRoZVxuICAgIC8vIHR5cGUgb2YgdGhlIGV2ZW50LlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNLZXlib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoS2V5Ym9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgUG9pbnRlckV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3BvaW50ZXJldmVudHMvXG4gKi9cblxudmFyIFBvaW50ZXJFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBwb2ludGVySWQ6IDAsXG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIHByZXNzdXJlOiAwLFxuICB0YW5nZW50aWFsUHJlc3N1cmU6IDAsXG4gIHRpbHRYOiAwLFxuICB0aWx0WTogMCxcbiAgdHdpc3Q6IDAsXG4gIHBvaW50ZXJUeXBlOiAwLFxuICBpc1ByaW1hcnk6IDBcbn0pO1xuXG52YXIgU3ludGhldGljUG9pbnRlckV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoUG9pbnRlckV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBUb3VjaEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy9cbiAqL1xuXG52YXIgVG91Y2hFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICB0b3VjaGVzOiAwLFxuICB0YXJnZXRUb3VjaGVzOiAwLFxuICBjaGFuZ2VkVG91Y2hlczogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlXG59KTtcblxudmFyIFN5bnRoZXRpY1RvdWNoRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUb3VjaEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtdHJhbnNpdGlvbnMtMjAwOTAzMjAvI3RyYW5zaXRpb24tZXZlbnRzLVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVHJhbnNpdGlvbkV2ZW50XG4gKi9cblxudmFyIFRyYW5zaXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgcHJvcGVydHlOYW1lOiAwLFxuICBlbGFwc2VkVGltZTogMCxcbiAgcHNldWRvRWxlbWVudDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFdoZWVsRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBXaGVlbEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRlbHRhWDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVgnIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFYIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFYYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKHJpZ2h0IGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVgnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFYIDogMDtcbiAgfSxcbiAgZGVsdGFZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWScgaW4gZXZlbnQgPyBldmVudC5kZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVlgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFZJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhYCBmb3IgSUU8OSBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YSA6IDA7XG4gIH0sXG4gIGRlbHRhWjogMCxcbiAgLy8gQnJvd3NlcnMgd2l0aG91dCBcImRlbHRhTW9kZVwiIGlzIHJlcG9ydGluZyBpbiByYXcgd2hlZWwgZGVsdGEgd2hlcmUgb25lXG4gIC8vIG5vdGNoIG9uIHRoZSBzY3JvbGwgaXMgYWx3YXlzICsvLSAxMjAsIHJvdWdobHkgZXF1aXZhbGVudCB0byBwaXhlbHMuXG4gIC8vIEEgZ29vZCBhcHByb3hpbWF0aW9uIG9mIERPTV9ERUxUQV9MSU5FICgxKSBpcyA1JSBvZiB2aWV3cG9ydCBzaXplIG9yXG4gIC8vIH40MCBwaXhlbHMsIGZvciBET01fREVMVEFfU0NSRUVOICgyKSBpdCBpcyA4Ny41JSBvZiB2aWV3cG9ydCBzaXplLlxuICBkZWx0YU1vZGU6IDBcbn0pO1xuXG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFdoZWVsRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxuXG52YXIgU1RBUlRfS0VZQ09ERSA9IDIyOTtcbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG52YXIgZG9jdW1lbnRNb2RlID0gbnVsbDtcblxuaWYgKGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59IC8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG5cblxudmFyIGNhblVzZVRleHRJbnB1dEV2ZW50ID0gY2FuVXNlRE9NICYmICdUZXh0RXZlbnQnIGluIHdpbmRvdyAmJiAhZG9jdW1lbnRNb2RlOyAvLyBJbiBJRTkrLCB3ZSBoYXZlIGFjY2VzcyB0byBjb21wb3NpdGlvbiBldmVudHMsIGJ1dCB0aGUgZGF0YSBzdXBwbGllZFxuLy8gYnkgdGhlIG5hdGl2ZSBjb21wb3NpdGlvbmVuZCBldmVudCBtYXkgYmUgaW5jb3JyZWN0LiBKYXBhbmVzZSBpZGVvZ3JhcGhpY1xuLy8gc3BhY2VzLCBmb3IgaW5zdGFuY2UgKFxcdTMwMDApIGFyZSBub3QgcmVjb3JkZWQgY29ycmVjdGx5LlxuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBjYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG52YXIgU1BBQ0VCQVJfQ09ERSA9IDMyO1xudmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNQQUNFQkFSX0NPREUpO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkJlZm9yZUlucHV0JywgWydjb21wb3NpdGlvbmVuZCcsICdrZXlwcmVzcycsICd0ZXh0SW5wdXQnLCAncGFzdGUnXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvbkVuZCcsIFsnY29tcG9zaXRpb25lbmQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblN0YXJ0JywgWydjb21wb3NpdGlvbnN0YXJ0JywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25VcGRhdGUnLCBbJ2NvbXBvc2l0aW9udXBkYXRlJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xufSAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9uIHRoZSBzcGFjZSBrZXkuXG5cblxudmFyIGhhc1NwYWNlS2V5cHJlc3MgPSBmYWxzZTtcbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNzdW1lZCB0byBiZSBhIGNvbW1hbmQuXG4gKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZveCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzXG4gKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuXG4gKi9cblxuZnVuY3Rpb24gaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIChuYXRpdmVFdmVudC5jdHJsS2V5IHx8IG5hdGl2ZUV2ZW50LmFsdEtleSB8fCBuYXRpdmVFdmVudC5tZXRhS2V5KSAmJiAvLyBjdHJsS2V5ICYmIGFsdEtleSBpcyBlcXVpdmFsZW50IHRvIEFsdEdyLCBhbmQgaXMgbm90IGEgY29tbWFuZC5cbiAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25TdGFydCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25FbmQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uVXBkYXRlJztcbiAgfVxufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMgZXZlbnQgc2lnbmlmaWVzIHRoYXRcbiAqIGNvbXBvc2l0aW9uIGhhcyBiZWd1bj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nICYmIG5hdGl2ZUV2ZW50LmtleUNvZGUgPT09IFNUQVJUX0tFWUNPREU7XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xlYXIgSU1FIGlucHV0LlxuICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTtcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgICAgLy8gRXhwZWN0IElNRSBrZXlDb2RlIG9uIGVhY2gga2V5ZG93bi4gSWYgd2UgZ2V0IGFueSBvdGhlclxuICAgICAgLy8gY29kZSB3ZSBtdXN0IGhhdmUgZXhpdGVkIGVhcmxpZXIuXG4gICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIC8vIEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlhIGEgQ3VzdG9tRXZlbnQsXG4gKiB3aXRoIHRoZSBgZGF0YWAgcHJvcGVydHkgcG9wdWxhdGVkIGluIHRoZSBgZGV0YWlsYCBvYmplY3QuIElmIHRoaXNcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgZXZlbnQgb2JqZWN0LCB1c2UgaXQuIElmIG5vdCwgdGhpcyBpcyBhIHBsYWluXG4gKiBjb21wb3NpdGlvbiBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9zdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG5cbiAgaWYgKHR5cGVvZiBkZXRhaWwgPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBkZXRhaWwpIHtcbiAgICByZXR1cm4gZGV0YWlsLmRhdGE7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgYSBjb21wb3NpdGlvbiBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IEtvcmVhbiBJTUUuXG4gKiBPdXIgZmFsbGJhY2sgbW9kZSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBJRSdzIEtvcmVhbiBJTUUsXG4gKiBzbyBqdXN0IHVzZSBuYXRpdmUgY29tcG9zaXRpb24gZXZlbnRzIHdoZW4gS29yZWFuIElNRSBpcyB1c2VkLlxuICogQWx0aG91Z2ggQ29tcG9zaXRpb25FdmVudC5sb2NhbGUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCxcbiAqIGl0IGlzIGF2YWlsYWJsZSBpbiBJRSwgd2hlcmUgb3VyIGZhbGxiYWNrIG1vZGUgaXMgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuXG5mdW5jdGlvbiBpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuYXRpdmVFdmVudC5sb2NhbGUgPT09ICdrbyc7XG59IC8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBzdGF0dXMsIGlmIGFueS5cblxuXG52YXIgaXNDb21wb3NpbmcgPSBmYWxzZTtcbi8qKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LlxuICovXG5cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBldmVudFR5cGU7XG4gIHZhciBmYWxsYmFja0RhdGE7XG5cbiAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpO1xuICB9IGVsc2UgaWYgKCFpc0NvbXBvc2luZykge1xuICAgIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25TdGFydCc7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uRW5kJztcbiAgfVxuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgY29tcG9zaXRpb24gaXMgc3RvcmVkIHN0YXRpY2FsbHkgYW5kIG11c3Qgbm90IGJlXG4gICAgLy8gb3ZlcndyaXR0ZW4gd2hpbGUgY29tcG9zaXRpb24gY29udGludWVzLlxuICAgIGlmICghaXNDb21wb3NpbmcgJiYgZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvblN0YXJ0Jykge1xuICAgICAgaXNDb21wb3NpbmcgPSBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25FbmQnKSB7XG4gICAgICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gZ2V0RGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgZXZlbnRUeXBlKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljQ29tcG9zaXRpb25FdmVudChldmVudFR5cGUsIGRvbUV2ZW50TmFtZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcblxuICAgIGlmIChmYWxsYmFja0RhdGEpIHtcbiAgICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRlZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LlxuICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBwcm9wZXJ0eSBvZiBuYXRpdmUgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZS5cbiAgICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjdXN0b21EYXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChjdXN0b21EYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGV2ZW50LmRhdGEgPSBjdXN0b21EYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcblxuICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNTcGFjZUtleXByZXNzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSO1xuXG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICAgIC8vIFJlY29yZCB0aGUgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgdmFyIGNoYXJzID0gbmF0aXZlRXZlbnQuZGF0YTsgLy8gSWYgaXQncyBhIHNwYWNlYmFyIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVseS4gQW5kcm9pZCBDaHJvbWVcbiAgICAgIC8vIGRvZXNuJ3QgZ2l2ZSB1cyBrZXljb2Rlcywgc28gd2UgbmVlZCB0byBpZ25vcmUgaXQuXG5cbiAgICAgIGlmIChjaGFycyA9PT0gU1BBQ0VCQVJfQ0hBUiAmJiBoYXNTcGFjZUtleXByZXNzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hhcnM7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRm9yIG90aGVyIG5hdGl2ZSBldmVudCB0eXBlcywgZG8gbm90aGluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGVcbiAqIGFwcHJvcHJpYXRlIHN0cmluZyB0byB1c2UgZm9yIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBvc2luZyAoSU1FKSBhbmQgdXNpbmcgYSBmYWxsYmFjayB0byBkbyBzbyxcbiAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LlxuICAvLyBJZiBjb21wb3NpdGlvbiBldmVudCBpcyBhdmFpbGFibGUsIHdlIGV4dHJhY3QgYSBzdHJpbmcgb25seSBhdFxuICAvLyBjb21wb3NpdGlvbmV2ZW50LCBvdGhlcndpc2UgZXh0cmFjdCBpdCBhdCBmYWxsYmFjayBldmVudHMuXG4gIGlmIChpc0NvbXBvc2luZykge1xuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICdjb21wb3NpdGlvbmVuZCcgfHwgIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiYgaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICB2YXIgY2hhcnMgPSBnZXREYXRhKCk7XG4gICAgICByZXNldCgpO1xuICAgICAgaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiBjaGFycztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywgdGhyb3cgb3V0IHRoZSBpbnB1dFxuICAgICAgLy8gY2hhcnMuIFBhc3RlIGV2ZW50cyBzaG91bGQgbm90IGxlYWQgdG8gQmVmb3JlSW5wdXQgZXZlbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIEFzIG9mIHYyNywgRmlyZWZveCBtYXkgZmlyZSBrZXlwcmVzcyBldmVudHMgZXZlbiB3aGVuIG5vIGNoYXJhY3RlclxuICAgICAgICogd2lsbCBiZSBpbnNlcnRlZC4gQSBmZXcgcG9zc2liaWxpdGllczpcbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgYDBgLiBBcnJvdyBrZXlzLCBFc2Mga2V5LCBldGMuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBhdmFpbGFibGUuXG4gICAgICAgKiAgIEV4OiAnQWx0R3IgKyBkYCBpbiBQb2xpc2guIFRoZXJlIGlzIG5vIG1vZGlmaWVkIGNoYXJhY3RlciBmb3JcbiAgICAgICAqICAgdGhpcyBrZXkgY29tYmluYXRpb24gYW5kIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICogICBkb2N1bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdheS5cbiAgICAgICAqICAgTm8gYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBjb21iaW5hdGlvbiBpc1xuICAgICAgICogICBiZWluZyB1c2VkLiBFeDogYENtZCtDYC4gTm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLCBhbmQgbm9cbiAgICAgICAqICAgYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICovXG4gICAgICBpZiAoIWlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAvLyBJRSBmaXJlcyB0aGUgYGtleXByZXNzYCBldmVudCB3aGVuIGEgdXNlciB0eXBlcyBhbiBlbW9qaSB2aWFcbiAgICAgICAgLy8gVG91Y2gga2V5Ym9hcmQgb2YgV2luZG93cy4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgYGNoYXJgIHByb3BlcnR5XG4gICAgICAgIC8vIGhvbGRzIGFuIGVtb2ppIGNoYXJhY3RlciBsaWtlIGBcXHVEODNEXFx1REUwQWAuICBCZWNhdXNlIGl0cyBsZW5ndGhcbiAgICAgICAgLy8gaXMgMiwgdGhlIHByb3BlcnR5IGB3aGljaGAgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVtb2ppIGNvcnJlY3RseS5cbiAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UsIHdlIGRpcmVjdGx5IHJldHVybiB0aGUgYGNoYXJgIHByb3BlcnR5IGluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXNpbmcgYHdoaWNoYC5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmNoYXIgJiYgbmF0aXZlRXZlbnQuY2hhci5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAobmF0aXZlRXZlbnQud2hpY2gpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRXh0cmFjdCBhIFN5bnRoZXRpY0lucHV0RXZlbnQgZm9yIGBiZWZvcmVJbnB1dGAsIGJhc2VkIG9uIGVpdGhlciBuYXRpdmVcbiAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLlxuICpcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBjaGFycztcblxuICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHtcbiAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gLy8gSWYgbm8gY2hhcmFjdGVycyBhcmUgYmVpbmcgaW5zZXJ0ZWQsIG5vIEJlZm9yZUlucHV0IGV2ZW50IHNob3VsZFxuICAvLyBiZSBmaXJlZC5cblxuXG4gIGlmICghY2hhcnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgJ29uQmVmb3JlSW5wdXQnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljSW5wdXRFdmVudCgnb25CZWZvcmVJbnB1dCcsICdiZWZvcmVpbnB1dCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gICAgZXZlbnQuZGF0YSA9IGNoYXJzO1xuICB9XG59XG4vKipcbiAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2hcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNldmVudHMtaW5wdXRldmVudHMuXG4gKlxuICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24gdGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudFxuICogYXZhaWxhYmxlIGluIENocm9tZSwgU2FmYXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyXG4gKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuXG4gKlxuICogYGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3NlcnMsIGFuZFxuICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzXG4gKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3RcbiAqIGF2YWlsYWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBpbnNlcnRlZFxuICogaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gKlxuICogVGhpcyBwbHVnaW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMsIHRodXNcbiAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmRcbiAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cbnZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICBjb2xvcjogdHJ1ZSxcbiAgZGF0ZTogdHJ1ZSxcbiAgZGF0ZXRpbWU6IHRydWUsXG4gICdkYXRldGltZS1sb2NhbCc6IHRydWUsXG4gIGVtYWlsOiB0cnVlLFxuICBtb250aDogdHJ1ZSxcbiAgbnVtYmVyOiB0cnVlLFxuICBwYXNzd29yZDogdHJ1ZSxcbiAgcmFuZ2U6IHRydWUsXG4gIHNlYXJjaDogdHJ1ZSxcbiAgdGVsOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICB0aW1lOiB0cnVlLFxuICB1cmw6IHRydWUsXG4gIHdlZWs6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKlxuICogTk9URTogVGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igbm9uLWdlbmVyaWMgZXZlbnRzIHN1Y2ggYXMgYGNoYW5nZWAsXG4gKiBgcmVzZXRgLCBgbG9hZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0YC5cbiAqXG4gKiBCb3Jyb3dzIGZyb20gTW9kZXJuaXpyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVTdWZmaXggRXZlbnQgbmFtZSwgZS5nLiBcImNsaWNrXCIuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuXG4gKiBAaW50ZXJuYWxcbiAqIEBsaWNlbnNlIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuICovXG5cbmZ1bmN0aW9uIGlzRXZlbnRTdXBwb3J0ZWQoZXZlbnROYW1lU3VmZml4KSB7XG4gIGlmICghY2FuVXNlRE9NKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudE5hbWVTdWZmaXg7XG4gIHZhciBpc1N1cHBvcnRlZCA9IChldmVudE5hbWUgaW4gZG9jdW1lbnQpO1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDEoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25DaGFuZ2UnLCBbJ2NoYW5nZScsICdjbGljaycsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2lucHV0JywgJ2tleWRvd24nLCAna2V5dXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIHRhcmdldCkge1xuICAvLyBGbGFnIHRoaXMgZXZlbnQgbG9vcCBhcyBuZWVkaW5nIHN0YXRlIHJlc3RvcmUuXG4gIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KTtcbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhpbnN0LCAnb25DaGFuZ2UnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uQ2hhbmdlJywgJ2NoYW5nZScsIG51bGwsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIEZvciBJRSBzaGltc1xuICovXG5cblxudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjaGFuZ2VgIGV2ZW50XG4gKi9cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09ICdmaWxlJztcbn1cblxuZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkpOyAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cblxuICBiYXRjaGVkVXBkYXRlcyhydW5FdmVudEluQmF0Y2gsIGRpc3BhdGNoUXVldWUpO1xufVxuXG5mdW5jdGlvbiBydW5FdmVudEluQmF0Y2goZGlzcGF0Y2hRdWV1ZSkge1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCAwKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpO1xuXG4gIGlmICh1cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXROb2RlKSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGlucHV0YCBldmVudFxuICovXG5cblxudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIC8vIElFOSBjbGFpbXMgdG8gc3VwcG9ydCB0aGUgaW5wdXQgZXZlbnQgYnV0IGZhaWxzIHRvIHRyaWdnZXIgaXQgd2hlblxuICAvLyBkZWxldGluZyB0ZXh0LCBzbyB3ZSBpZ25vcmUgaXRzIGlucHV0IGV2ZW50cy5cbiAgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gaXNFdmVudFN1cHBvcnRlZCgnaW5wdXQnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA5KTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNoYW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50XG4gKiBhbmQgb3ZlcnJpZGUgdGhlIHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZyb21cbiAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50bHktdHJhY2tlZCBlbGVtZW50LFxuICogaWYgYW55IGV4aXN0cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xuICBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eUNoYW5nZShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICE9PSAndmFsdWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCkpIHtcbiAgICBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3VzaW4nKSB7XG4gICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gIH1cbn0gLy8gRm9yIElFOCBhbmQgSUU5LlxuXG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdzZWxlY3Rpb25jaGFuZ2UnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleXVwJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJykge1xuICAgIC8vIE9uIHRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQsIHRoZSB0YXJnZXQgaXMganVzdCBkb2N1bWVudCB3aGljaCBpc24ndFxuICAgIC8vIGhlbHBmdWwgZm9yIHVzIHNvIGp1c3QgY2hlY2sgYWN0aXZlRWxlbWVudCBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gOTklIG9mIHRoZSB0aW1lLCBrZXlkb3duIGFuZCBrZXl1cCBhcmVuJ3QgbmVjZXNzYXJ5LiBJRTggZmFpbHMgdG8gZmlyZVxuICAgIC8vIHByb3BlcnR5Y2hhbmdlIG9uIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhZnRlciBzZXR0aW5nIGB2YWx1ZWAgZnJvbSBhXG4gICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseVxuICAgIC8vIGdldHMgaXQgYW5kIGNhdGNoaW5nIGtleWRvd24gbGV0cyB1cyBmaXJlIGFuIGV2ZW50IGZvciB0aGUgZmlyc3RcbiAgICAvLyBrZXlzdHJva2UgaWYgdXNlciBkb2VzIGEga2V5IHJlcGVhdCAoaXQnbGwgYmUgYSBsaXR0bGUgZGVsYXllZDogcmlnaHRcbiAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0b1xuICAgIC8vIGZpcmUgc2VsZWN0aW9uY2hhbmdlIG5vcm1hbGx5LlxuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpO1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50XG4gKi9cblxuXG5mdW5jdGlvbiBzaG91bGRVc2VDbGlja0V2ZW50KGVsZW0pIHtcbiAgLy8gVXNlIHRoZSBgY2xpY2tgIGV2ZW50IHRvIGRldGVjdCBjaGFuZ2VzIHRvIGNoZWNrYm94IGFuZCByYWRpbyBpbnB1dHMuXG4gIC8vIFRoaXMgYXBwcm9hY2ggd29ya3MgYWNyb3NzIGFsbCBicm93c2Vycywgd2hlcmVhcyBgY2hhbmdlYCBkb2VzIG5vdCBmaXJlXG4gIC8vIHVudGlsIGBibHVyYCBpbiBJRTguXG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjbGljaycpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdpbnB1dCcgfHwgZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZTtcblxuICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5jb250cm9sbGVkIHx8IG5vZGUudHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCAnbnVtYmVyJywgbm9kZS52YWx1ZSk7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25DaGFuZ2VgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBjaGFuZ2UgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy4gVGhpcyBldmVudCBmaXJlcyBhdCBhIHRpbWUgd2hlbiBpdCdzIHBvc3NpYmxlIHRvXG4gKiBjaGFuZ2UgdGhlIGVsZW1lbnQncyB2YWx1ZSB3aXRob3V0IHNlZWluZyBhIGZsaWNrZXIuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gc2VsZWN0XG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuICB2YXIgZ2V0VGFyZ2V0SW5zdEZ1bmMsIGhhbmRsZUV2ZW50RnVuYztcblxuICBpZiAoc2hvdWxkVXNlQ2hhbmdlRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudDtcbiAgfSBlbHNlIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBpZiAoaXNJbnB1dEV2ZW50U3VwcG9ydGVkKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2hvdWxkVXNlQ2xpY2tFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7XG4gIH1cblxuICBpZiAoZ2V0VGFyZ2V0SW5zdEZ1bmMpIHtcbiAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAoaW5zdCkge1xuICAgICAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhbmRsZUV2ZW50RnVuYykge1xuICAgIGhhbmRsZUV2ZW50RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldE5vZGUsIHRhcmdldEluc3QpO1xuICB9IC8vIFdoZW4gYmx1cnJpbmcsIHNldCB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciBudW1iZXIgaW5wdXRzXG5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cih0YXJnZXROb2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQyKCkge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlRW50ZXInLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUxlYXZlJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckVudGVyJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJMZWF2ZScsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbn1cbi8qKlxuICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXRcbiAqIHdlIGRvIG5vdCBleHRyYWN0IGR1cGxpY2F0ZSBldmVudHMuIEhvd2V2ZXIsIG1vdmluZyB0aGUgbW91c2UgaW50byB0aGVcbiAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBpc092ZXJFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3ZlcicgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInO1xuICB2YXIgaXNPdXRFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JztcblxuICBpZiAoaXNPdmVyRXZlbnQgJiYgIWlzUmVwbGF5aW5nRXZlbnQobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhbiBvdmVyIGV2ZW50IHdpdGggYSB0YXJnZXQsIHdlIG1pZ2h0IGhhdmUgYWxyZWFkeSBkaXNwYXRjaGVkXG4gICAgLy8gdGhlIGV2ZW50IGluIHRoZSBvdXQgZXZlbnQgb2YgdGhlIG90aGVyIHRhcmdldC4gSWYgdGhpcyBpcyByZXBsYXllZCxcbiAgICAvLyB0aGVuIGl0J3MgYmVjYXVzZSB3ZSBjb3VsZG4ndCBkaXNwYXRjaCBhZ2FpbnN0IHRoaXMgdGFyZ2V0IHByZXZpb3VzbHlcbiAgICAvLyBzbyB3ZSBoYXZlIHRvIGRvIGl0IG5vdyBpbnN0ZWFkLlxuICAgIHZhciByZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC5mcm9tRWxlbWVudDtcblxuICAgIGlmIChyZWxhdGVkKSB7XG4gICAgICAvLyBJZiB0aGUgcmVsYXRlZCBub2RlIGlzIG1hbmFnZWQgYnkgUmVhY3QsIHdlIGNhbiBhc3N1bWUgdGhhdCB3ZSBoYXZlXG4gICAgICAvLyBhbHJlYWR5IGRpc3BhdGNoZWQgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnRzIGR1cmluZyBpdHMgbW91c2VvdXQuXG4gICAgICBpZiAoZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocmVsYXRlZCkgfHwgaXNDb250YWluZXJNYXJrZWRBc1Jvb3QocmVsYXRlZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaXNPdXRFdmVudCAmJiAhaXNPdmVyRXZlbnQpIHtcbiAgICAvLyBNdXN0IG5vdCBiZSBhIG1vdXNlIG9yIHBvaW50ZXIgaW4gb3Igb3V0IC0gaWdub3JpbmcuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHdpbjsgLy8gVE9ETzogd2h5IGlzIHRoaXMgbnVsbGFibGUgaW4gdGhlIHR5cGVzIGJ1dCB3ZSByZWFkIGZyb20gaXQ/XG5cbiAgaWYgKG5hdGl2ZUV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICAvLyBgbmF0aXZlRXZlbnRUYXJnZXRgIGlzIHByb2JhYmx5IGEgd2luZG93IG9iamVjdC5cbiAgICB3aW4gPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBgb3duZXJEb2N1bWVudGAgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBpbiBJRTguXG4gICAgdmFyIGRvYyA9IG5hdGl2ZUV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICBpZiAoZG9jKSB7XG4gICAgICB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgd2luID0gd2luZG93O1xuICAgIH1cbiAgfVxuXG4gIHZhciBmcm9tO1xuICB2YXIgdG87XG5cbiAgaWYgKGlzT3V0RXZlbnQpIHtcbiAgICB2YXIgX3JlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnRvRWxlbWVudDtcblxuICAgIGZyb20gPSB0YXJnZXRJbnN0O1xuICAgIHRvID0gX3JlbGF0ZWQgPyBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShfcmVsYXRlZCkgOiBudWxsO1xuXG4gICAgaWYgKHRvICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRvKTtcblxuICAgICAgaWYgKHRvICE9PSBuZWFyZXN0TW91bnRlZCB8fCB0by50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgdG8udGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgICB0byA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE1vdmluZyB0byBhIG5vZGUgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cuXG4gICAgZnJvbSA9IG51bGw7XG4gICAgdG8gPSB0YXJnZXRJbnN0O1xuICB9XG5cbiAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgLy8gTm90aGluZyBwZXJ0YWlucyB0byBvdXIgbWFuYWdlZCBjb21wb25lbnRzLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50O1xuICB2YXIgbGVhdmVFdmVudFR5cGUgPSAnb25Nb3VzZUxlYXZlJztcbiAgdmFyIGVudGVyRXZlbnRUeXBlID0gJ29uTW91c2VFbnRlcic7XG4gIHZhciBldmVudFR5cGVQcmVmaXggPSAnbW91c2UnO1xuXG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3ZlcicpIHtcbiAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgbGVhdmVFdmVudFR5cGUgPSAnb25Qb2ludGVyTGVhdmUnO1xuICAgIGVudGVyRXZlbnRUeXBlID0gJ29uUG9pbnRlckVudGVyJztcbiAgICBldmVudFR5cGVQcmVmaXggPSAncG9pbnRlcic7XG4gIH1cblxuICB2YXIgZnJvbU5vZGUgPSBmcm9tID09IG51bGwgPyB3aW4gOiBnZXROb2RlRnJvbUluc3RhbmNlKGZyb20pO1xuICB2YXIgdG9Ob2RlID0gdG8gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UodG8pO1xuICB2YXIgbGVhdmUgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKGxlYXZlRXZlbnRUeXBlLCBldmVudFR5cGVQcmVmaXggKyAnbGVhdmUnLCBmcm9tLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBsZWF2ZS50YXJnZXQgPSBmcm9tTm9kZTtcbiAgbGVhdmUucmVsYXRlZFRhcmdldCA9IHRvTm9kZTtcbiAgdmFyIGVudGVyID0gbnVsbDsgLy8gV2Ugc2hvdWxkIG9ubHkgcHJvY2VzcyB0aGlzIG5hdGl2ZUV2ZW50IGlmIHdlIGFyZSBwcm9jZXNzaW5nXG4gIC8vIHRoZSBmaXJzdCBhbmNlc3Rvci4gTmV4dCB0aW1lLCB3ZSB3aWxsIGlnbm9yZSB0aGUgZXZlbnQuXG5cbiAgdmFyIG5hdGl2ZVRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKG5hdGl2ZVRhcmdldEluc3QgPT09IHRhcmdldEluc3QpIHtcbiAgICB2YXIgZW50ZXJFdmVudCA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IoZW50ZXJFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdlbnRlcicsIHRvLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGVudGVyRXZlbnQudGFyZ2V0ID0gdG9Ob2RlO1xuICAgIGVudGVyRXZlbnQucmVsYXRlZFRhcmdldCA9IGZyb21Ob2RlO1xuICAgIGVudGVyID0gZW50ZXJFdmVudDtcbiAgfVxuXG4gIGFjY3VtdWxhdGVFbnRlckxlYXZlVHdvUGhhc2VMaXN0ZW5lcnMoZGlzcGF0Y2hRdWV1ZSwgbGVhdmUsIGVudGVyLCBmcm9tLCB0byk7XG59XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgcmV0dXJuIHggPT09IHkgJiYgKHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5KSB8fCB4ICE9PSB4ICYmIHkgIT09IHkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgO1xufVxuXG52YXIgb2JqZWN0SXMgPSB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaXM7XG5cbi8qKlxuICogUGVyZm9ybXMgZXF1YWxpdHkgYnkgaXRlcmF0aW5nIHRocm91Z2gga2V5cyBvbiBhbiBvYmplY3QgYW5kIHJldHVybmluZyBmYWxzZVxuICogd2hlbiBhbnkga2V5IGhhcyB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBzdHJpY3RseSBlcXVhbCBiZXR3ZWVuIHRoZSBhcmd1bWVudHMuXG4gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgdmFsdWVzIG9mIGFsbCBrZXlzIGFyZSBzdHJpY3RseSBlcXVhbC5cbiAqL1xuXG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAob2JqZWN0SXMob2JqQSwgb2JqQikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3VycmVudEtleSA9IGtleXNBW2ldO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGN1cnJlbnRLZXkpIHx8ICFvYmplY3RJcyhvYmpBW2N1cnJlbnRLZXldLCBvYmpCW2N1cnJlbnRLZXldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVuIGFueSBub2RlIHJldHVybiB0aGUgZmlyc3QgbGVhZiBub2RlIHdpdGhvdXQgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cbmZ1bmN0aW9uIGdldExlYWZOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuLyoqXG4gKiBHZXQgdGhlIG5leHQgc2libGluZyB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgd2lsbCB3YWxrIHVwIHRoZVxuICogRE9NIGlmIGEgbm9kZSdzIHNpYmxpbmdzIGhhdmUgYmVlbiBleGhhdXN0ZWQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cblxuZnVuY3Rpb24gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChyb290LCBvZmZzZXQpIHtcbiAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgdmFyIG5vZGVTdGFydCA9IDA7XG4gIHZhciBub2RlRW5kID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb3V0ZXJOb2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGdldE9mZnNldHMob3V0ZXJOb2RlKSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gb3V0ZXJOb2RlLm93bmVyRG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBvd25lckRvY3VtZW50ICYmIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbiAmJiB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBhbmNob3JOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0OyAvLyBJbiBGaXJlZm94LCBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgY2FuIGJlIFwiYW5vbnltb3VzIGRpdnNcIiwgZS5nLiB0aGVcbiAgLy8gdXAvZG93biBidXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPVwibnVtYmVyXCI+LiBBbm9ueW1vdXMgZGl2cyBkbyBub3Qgc2VlbSB0b1xuICAvLyBleHBvc2UgcHJvcGVydGllcywgdHJpZ2dlcmluZyBhIFwiUGVybWlzc2lvbiBkZW5pZWQgZXJyb3JcIiBpZiBhbnkgb2YgaXRzXG4gIC8vIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkLiBUaGUgb25seSBzZWVtaW5nbHkgcG9zc2libGUgd2F5IHRvIGF2b2lkIGVycm9yaW5nXG4gIC8vIGlzIHRvIGFjY2VzcyBhIHByb3BlcnR5IHRoYXQgdHlwaWNhbGx5IHdvcmtzIGZvciBub24tYW5vbnltb3VzIGRpdnMgYW5kXG4gIC8vIGNhdGNoIGFueSBlcnJvciB0aGF0IG1heSBvdGhlcndpc2UgYXJpc2UuIFNlZVxuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDg0MjdcblxuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICAgIGFuY2hvck5vZGUubm9kZVR5cGU7XG4gICAgZm9jdXNOb2RlLm5vZGVUeXBlO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCk7XG59XG4vKipcbiAqIFJldHVybnMge3N0YXJ0LCBlbmR9IHdoZXJlIGBzdGFydGAgaXMgdGhlIGNoYXJhY3Rlci9jb2RlcG9pbnQgaW5kZXggb2ZcbiAqIChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpIHdpdGhpbiB0aGUgdGV4dENvbnRlbnQgb2YgYG91dGVyTm9kZWAsIGFuZFxuICogYGVuZGAgaXMgdGhlIGluZGV4IG9mIChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KS5cbiAqXG4gKiBSZXR1cm5zIG51bGwgaWYgeW91IHBhc3MgaW4gZ2FyYmFnZSBpbnB1dCBidXQgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgY3Jhc2guXG4gKlxuICogRXhwb3J0ZWQgb25seSBmb3IgdGVzdGluZy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIGluZGV4V2l0aGluQW5jaG9yID0gMDtcbiAgdmFyIGluZGV4V2l0aGluRm9jdXMgPSAwO1xuICB2YXIgbm9kZSA9IG91dGVyTm9kZTtcbiAgdmFyIHBhcmVudE5vZGUgPSBudWxsO1xuXG4gIG91dGVyOiB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBuZXh0ID0gbnVsbDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gYW5jaG9yTm9kZSAmJiAoYW5jaG9yT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGggKyBhbmNob3JPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmb2N1c05vZGUgJiYgKGZvY3VzT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoICsgZm9jdXNPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgICAgbGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5maXJzdENoaWxkKSA9PT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBmaXJzdCBjaGlsZCBgbmV4dGAuXG5cblxuICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgICBub2RlID0gbmV4dDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IG91dGVyTm9kZSkge1xuICAgICAgICAvLyBJZiBgb3V0ZXJOb2RlYCBoYXMgY2hpbGRyZW4sIHRoaXMgaXMgYWx3YXlzIHRoZSBzZWNvbmQgdGltZSB2aXNpdGluZ1xuICAgICAgICAvLyBpdC4gSWYgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIGlzIHN0aWxsIHRoZSBmaXJzdCBsb29wLCBhbmQgdGhlIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgc2VsZWN0aW9uIGlzIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBib3RoIGVxdWFsIHRvIHRoaXMgbm9kZVxuICAgICAgICAvLyBhbmQgYm90aCBvZmZzZXRzIDAsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBoYXZlIGhhbmRsZWQgYWJvdmUuXG4gICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gYW5jaG9yTm9kZSAmJiArK2luZGV4V2l0aGluQW5jaG9yID09PSBhbmNob3JPZmZzZXQpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBmb2N1c05vZGUgJiYgKytpbmRleFdpdGhpbkZvY3VzID09PSBmb2N1c09mZnNldCkge1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUubmV4dFNpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gcGFyZW50Tm9kZTtcbiAgICAgIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIG5leHQgc2libGluZyBgbmV4dGAuXG5cblxuICAgIG5vZGUgPSBuZXh0O1xuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAoV291bGQgaGFwcGVuIGlmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYXJlbid0XG4gICAgLy8gYWN0dWFsbHkgaW5zaWRlIHRoZSBwYXNzZWQtaW4gbm9kZS4pXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBlbmQ6IGVuZFxuICB9O1xufVxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cblxuZnVuY3Rpb24gc2V0T2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBkb2MgJiYgZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgLy8gRWRnZSBmYWlscyB3aXRoIFwiT2JqZWN0IGV4cGVjdGVkXCIgaW4gc29tZSBzY2VuYXJpb3MuXG4gIC8vIChGb3IgaW5zdGFuY2U6IFRpbnlNQ0UgZWRpdG9yIHVzZWQgaW4gYSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHBhc3RpbmcgdG8gYWRkIG1vcmUsXG4gIC8vIGZhaWxzIHdoZW4gcGFzdGluZyAxMDArIGl0ZW1zKVxuXG4gIGlmICghd2luLmdldFNlbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gIHZhciBsZW5ndGggPSBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpOyAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuXG4gIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3aXRoIGEgc2luZ2xlIHJhbmdlLlxuXG4gIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkge1xuICAgIHZhciB0ZW1wID0gZW5kO1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gdGVtcDtcbiAgfVxuXG4gIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpO1xuICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpO1xuXG4gIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHtcbiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDEgJiYgc2VsZWN0aW9uLmFuY2hvck5vZGUgPT09IHN0YXJ0TWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmFuY2hvck9mZnNldCA9PT0gc3RhcnRNYXJrZXIub2Zmc2V0ICYmIHNlbGVjdGlvbi5mb2N1c05vZGUgPT09IGVuZE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5mb2N1c09mZnNldCA9PT0gZW5kTWFya2VyLm9mZnNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNldCk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSB7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RleHROb2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuXG5mdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHtcbiAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHtcbiAgICByZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpO1xuICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5jb250YWlucyhpbm5lck5vZGUpO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIGNvbnRhaW5zTm9kZShub2RlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBub2RlKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luRnJhbWUoaWZyYW1lKSB7XG4gIHRyeSB7XG4gICAgLy8gQWNjZXNzaW5nIHRoZSBjb250ZW50RG9jdW1lbnQgb2YgYSBIVE1MSWZyYW1lRWxlbWVudCBjYW4gY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAvLyB0byB0aHJvdywgZS5nLiBpZiBpdCBoYXMgYSBjcm9zcy1vcmlnaW4gc3JjIGF0dHJpYnV0ZS5cbiAgICAvLyBTYWZhcmkgd2lsbCBzaG93IGFuIGVycm9yIGluIHRoZSBjb25zb2xlIHdoZW4gdGhlIGFjY2VzcyByZXN1bHRzIGluIFwiQmxvY2tlZCBhIGZyYW1lIHdpdGggb3JpZ2luXCIuIGUuZzpcbiAgICAvLyBpZnJhbWUuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIC8vIEEgc2FmZXR5IHdheSBpcyB0byBhY2Nlc3Mgb25lIG9mIHRoZSBjcm9zcyBvcmlnaW4gcHJvcGVydGllczogV2luZG93IG9yIExvY2F0aW9uXG4gICAgLy8gV2hpY2ggbWlnaHQgcmVzdWx0IGluIFwiU2VjdXJpdHlFcnJvclwiIERPTSBFeGNlcHRpb24gYW5kIGl0IGlzIGNvbXBhdGlibGUgdG8gU2FmYXJpLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Jyb3dzZXJzLmh0bWwjaW50ZWdyYXRpb24td2l0aC1pZGxcbiAgICByZXR1cm4gdHlwZW9mIGlmcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWYgPT09ICdzdHJpbmcnO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudERlZXAoKSB7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuXG4gIHdoaWxlIChlbGVtZW50IGluc3RhbmNlb2Ygd2luLkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgaWYgKGlzU2FtZU9yaWdpbkZyYW1lKGVsZW1lbnQpKSB7XG4gICAgICB3aW4gPSBlbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KHdpbi5kb2N1bWVudCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbi8qKlxuICogQFJlYWN0SW5wdXRTZWxlY3Rpb246IFJlYWN0IGlucHV0IHNlbGVjdGlvbiBtb2R1bGUuIEJhc2VkIG9uIFNlbGVjdGlvbi5qcyxcbiAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3RcbiAqIGFzc3VtZSBidXR0b25zIGhhdmUgcmFuZ2Ugc2VsZWN0aW9ucyBhbGxvd2VkKS5cbiAqIElucHV0IHNlbGVjdGlvbiBtb2R1bGUgZm9yIFJlYWN0LlxuICovXG5cbi8qKlxuICogQGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczogd2UgZ2V0IHRoZSBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBzZWxlY3Rpb25cbiAqIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG8tbm90LWFwcGx5LCBsb29raW5nIGF0IGBzZWxlY3Rpb25TdGFydGBcbiAqIGFuZCBgc2VsZWN0aW9uRW5kYCByb3dzLlxuICovXG5cblxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAndGV4dCcgfHwgZWxlbS50eXBlID09PSAnc2VhcmNoJyB8fCBlbGVtLnR5cGUgPT09ICd0ZWwnIHx8IGVsZW0udHlwZSA9PT0gJ3VybCcgfHwgZWxlbS50eXBlID09PSAncGFzc3dvcmQnKSB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKTtcbn1cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCkge1xuICB2YXIgZm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICByZXR1cm4ge1xuICAgIGZvY3VzZWRFbGVtOiBmb2N1c2VkRWxlbSxcbiAgICBzZWxlY3Rpb25SYW5nZTogaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGZvY3VzZWRFbGVtKSA/IGdldFNlbGVjdGlvbihmb2N1c2VkRWxlbSkgOiBudWxsXG4gIH07XG59XG4vKipcbiAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LFxuICogcmVzdG9yZSBpdC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdCBjb3VsZCByZW1vdmUgZG9tXG4gKiBub2RlcyBhbmQgcGxhY2UgdGhlbSBiYWNrIGluLCByZXN1bHRpbmcgaW4gZm9jdXMgYmVpbmcgbG9zdC5cbiAqL1xuXG5mdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHtcbiAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtO1xuICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7XG5cbiAgaWYgKGN1ckZvY3VzZWRFbGVtICE9PSBwcmlvckZvY3VzZWRFbGVtICYmIGlzSW5Eb2N1bWVudChwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgIGlmIChwcmlvclNlbGVjdGlvblJhbmdlICE9PSBudWxsICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgc2V0U2VsZWN0aW9uKHByaW9yRm9jdXNlZEVsZW0sIHByaW9yU2VsZWN0aW9uUmFuZ2UpO1xuICAgIH0gLy8gRm9jdXNpbmcgYSBub2RlIGNhbiBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiwgd2hpY2ggaXMgdW5kZXNpcmFibGVcblxuXG4gICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgIHZhciBhbmNlc3RvciA9IHByaW9yRm9jdXNlZEVsZW07XG5cbiAgICB3aGlsZSAoYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlKSB7XG4gICAgICBpZiAoYW5jZXN0b3Iubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICBhbmNlc3RvcnMucHVzaCh7XG4gICAgICAgICAgZWxlbWVudDogYW5jZXN0b3IsXG4gICAgICAgICAgbGVmdDogYW5jZXN0b3Iuc2Nyb2xsTGVmdCxcbiAgICAgICAgICB0b3A6IGFuY2VzdG9yLnNjcm9sbFRvcFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuY2VzdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluZm8gPSBhbmNlc3RvcnNbaV07XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxUb3AgPSBpbmZvLnRvcDtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQGdldFNlbGVjdGlvbjogR2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIGZvY3VzZWQgdGV4dGFyZWEsIGlucHV0IG9yXG4gKiBjb250ZW50RWRpdGFibGUgbm9kZS5cbiAqIC1AaW5wdXQ6IExvb2sgdXAgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0XG4gKiAtQHJldHVybiB7c3RhcnQ6IHNlbGVjdGlvblN0YXJ0LCBlbmQ6IHNlbGVjdGlvbkVuZH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24oaW5wdXQpIHtcbiAgdmFyIHNlbGVjdGlvbjtcblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0ge1xuICAgICAgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIENvbnRlbnQgZWRpdGFibGUgb3Igb2xkIElFIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IGdldE9mZnNldHMoaW5wdXQpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGVjdGlvbiB8fCB7XG4gICAgc3RhcnQ6IDAsXG4gICAgZW5kOiAwXG4gIH07XG59XG4vKipcbiAqIEBzZXRTZWxlY3Rpb246IFNldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSB0ZXh0YXJlYSBvciBpbnB1dCBhbmQgZm9jdXNlc1xuICogdGhlIGlucHV0LlxuICogLUBpbnB1dCAgICAgU2V0IHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dCBvciB0ZXh0YXJlYVxuICogLUBvZmZzZXRzICAgT2JqZWN0IG9mIHNhbWUgZm9ybSB0aGF0IGlzIHJldHVybmVkIGZyb20gZ2V0KlxuICovXG5cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgb2Zmc2V0cykge1xuICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQ7XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gc3RhcnQ7XG4gIH1cblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHNldE9mZnNldHMoaW5wdXQsIG9mZnNldHMpO1xuICB9XG59XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uU2VsZWN0JywgWydmb2N1c291dCcsICdjb250ZXh0bWVudScsICdkcmFnZW5kJywgJ2ZvY3VzaW4nLCAna2V5ZG93bicsICdrZXl1cCcsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbnZhciBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xudmFyIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xudmFyIG1vdXNlRG93biA9IGZhbHNlO1xuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbiQxKG5vZGUpIHtcbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gbm9kZSAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobm9kZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG5vZGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IG5vZGUuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgd2luID0gbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5jaG9yTm9kZTogc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQ6IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGU6IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldDogc2VsZWN0aW9uLmZvY3VzT2Zmc2V0XG4gICAgfTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0YXJnZXQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldERvY3VtZW50KGV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBldmVudFRhcmdldC53aW5kb3cgPT09IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQuZG9jdW1lbnQgOiBldmVudFRhcmdldC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IGV2ZW50VGFyZ2V0IDogZXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbn1cbi8qKlxuICogUG9sbCBzZWxlY3Rpb24gdG8gc2VlIHdoZXRoZXIgaXQncyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gKiBAcmV0dXJuIHs/U3ludGhldGljRXZlbnR9XG4gKi9cblxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCQxID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCQxICE9PSBnZXRBY3RpdmVFbGVtZW50KGRvYykpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuXG5cbiAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24kMShhY3RpdmVFbGVtZW50JDEpO1xuXG4gIGlmICghbGFzdFNlbGVjdGlvbiB8fCAhc2hhbGxvd0VxdWFsKGxhc3RTZWxlY3Rpb24sIGN1cnJlbnRTZWxlY3Rpb24pKSB7XG4gICAgbGFzdFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhhY3RpdmVFbGVtZW50SW5zdCQxLCAnb25TZWxlY3QnKTtcblxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvblNlbGVjdCcsICdzZWxlY3QnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgICBldmVudC50YXJnZXQgPSBhY3RpdmVFbGVtZW50JDE7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uU2VsZWN0YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgc2VsZWN0IGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gY29udGVudEVkaXRhYmxlXG4gKlxuICogVGhpcyBkaWZmZXJzIGZyb20gbmF0aXZlIGJyb3dzZXIgaW1wbGVtZW50YXRpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqIC0gRmlyZXMgb24gY29udGVudEVkaXRhYmxlIGZpZWxkcyBhcyB3ZWxsIGFzIGlucHV0cy5cbiAqIC0gRmlyZXMgZm9yIGNvbGxhcHNlZCBzZWxlY3Rpb24uXG4gKiAtIEZpcmVzIGFmdGVyIHVzZXIgaW5wdXQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgLy8gVHJhY2sgdGhlIGlucHV0IG5vZGUgdGhhdCBoYXMgZm9jdXMuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpIHx8IHRhcmdldE5vZGUuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpIHtcbiAgICAgICAgYWN0aXZlRWxlbWVudCQxID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgYWN0aXZlRWxlbWVudEluc3QkMSA9IHRhcmdldEluc3Q7XG4gICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGw7XG4gICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDtcbiAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgYnJlYWs7XG4gICAgLy8gRG9uJ3QgZmlyZSB0aGUgZXZlbnQgd2hpbGUgdGhlIHVzZXIgaXMgZHJhZ2dpbmcuIFRoaXMgbWF0Y2hlcyB0aGVcbiAgICAvLyBzZW1hbnRpY3Mgb2YgdGhlIG5hdGl2ZSBzZWxlY3QgZXZlbnQuXG5cbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgICAgbW91c2VEb3duID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgIGNhc2UgJ21vdXNldXAnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgICAgbW91c2VEb3duID0gZmFsc2U7XG4gICAgICBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgYnJlYWs7XG4gICAgLy8gQ2hyb21lIGFuZCBJRSBmaXJlIG5vbi1zdGFuZGFyZCBldmVudCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFuZ2VkIChhbmRcbiAgICAvLyBzb21ldGltZXMgd2hlbiBpdCBoYXNuJ3QpLiBJRSdzIGV2ZW50IGZpcmVzIG91dCBvZiBvcmRlciB3aXRoIHJlc3BlY3RcbiAgICAvLyB0byBrZXkgYW5kIGlucHV0IGV2ZW50cyBvbiBkZWxldGlvbiwgc28gd2UgZGlzY2FyZCBpdC5cbiAgICAvL1xuICAgIC8vIEZpcmVmb3ggZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbmNoYW5nZSwgc28gY2hlY2sgc2VsZWN0aW9uIHN0YXR1c1xuICAgIC8vIGFmdGVyIGVhY2gga2V5IGVudHJ5LiBUaGUgc2VsZWN0aW9uIGNoYW5nZXMgYWZ0ZXIga2V5ZG93biBhbmQgYmVmb3JlXG4gICAgLy8ga2V5dXAsIGJ1dCB3ZSBjaGVjayBvbiBrZXlkb3duIGFzIHdlbGwgaW4gdGhlIGNhc2Ugb2YgaG9sZGluZyBkb3duIGFcbiAgICAvLyBrZXksIHdoZW4gbXVsdGlwbGUga2V5ZG93biBldmVudHMgYXJlIGZpcmVkIGJ1dCBvbmx5IG9uZSBrZXl1cCBpcy5cbiAgICAvLyBUaGlzIGlzIGFsc28gb3VyIGFwcHJvYWNoIGZvciBJRSBoYW5kbGluZywgZm9yIHRoZSByZWFzb24gYWJvdmUuXG5cbiAgICBjYXNlICdzZWxlY3Rpb25jaGFuZ2UnOlxuICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIG1hcHBpbmcgb2Ygc3RhbmRhcmQgdmVuZG9yIHByZWZpeGVzIHVzaW5nIHRoZSBkZWZpbmVkIHN0eWxlIHByb3BlcnR5IGFuZCBldmVudCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZVByb3BcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gbWFrZVByZWZpeE1hcChzdHlsZVByb3AsIGV2ZW50TmFtZSkge1xuICB2YXIgcHJlZml4ZXMgPSB7fTtcbiAgcHJlZml4ZXNbc3R5bGVQcm9wLnRvTG93ZXJDYXNlKCldID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHByZWZpeGVzWydXZWJraXQnICsgc3R5bGVQcm9wXSA9ICd3ZWJraXQnICsgZXZlbnROYW1lO1xuICBwcmVmaXhlc1snTW96JyArIHN0eWxlUHJvcF0gPSAnbW96JyArIGV2ZW50TmFtZTtcbiAgcmV0dXJuIHByZWZpeGVzO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdG8gYSBjb25maWd1cmFibGUgbGlzdCBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cblxuXG52YXIgdmVuZG9yUHJlZml4ZXMgPSB7XG4gIGFuaW1hdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkVuZCcpLFxuICBhbmltYXRpb25pdGVyYXRpb246IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25JdGVyYXRpb24nKSxcbiAgYW5pbWF0aW9uc3RhcnQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25TdGFydCcpLFxuICB0cmFuc2l0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdUcmFuc2l0aW9uJywgJ1RyYW5zaXRpb25FbmQnKVxufTtcbi8qKlxuICogRXZlbnQgbmFtZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBkZXRlY3RlZCBhbmQgcHJlZml4ZWQgKGlmIGFwcGxpY2FibGUpLlxuICovXG5cbnZhciBwcmVmaXhlZEV2ZW50TmFtZXMgPSB7fTtcbi8qKlxuICogRWxlbWVudCB0byBjaGVjayBmb3IgcHJlZml4ZXMgb24uXG4gKi9cblxudmFyIHN0eWxlID0ge307XG4vKipcbiAqIEJvb3RzdHJhcCBpZiBhIERPTSBleGlzdHMuXG4gKi9cblxuaWYgKGNhblVzZURPTSkge1xuICBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLnN0eWxlOyAvLyBPbiBzb21lIHBsYXRmb3JtcywgaW4gcGFydGljdWxhciBzb21lIHJlbGVhc2VzIG9mIEFuZHJvaWQgNC54LFxuICAvLyB0aGUgdW4tcHJlZml4ZWQgXCJhbmltYXRpb25cIiBhbmQgXCJ0cmFuc2l0aW9uXCIgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBvbiB0aGVcbiAgLy8gc3R5bGUgb2JqZWN0IGJ1dCB0aGUgZXZlbnRzIHRoYXQgZmlyZSB3aWxsIHN0aWxsIGJlIHByZWZpeGVkLCBzbyB3ZSBuZWVkXG4gIC8vIHRvIGNoZWNrIGlmIHRoZSB1bi1wcmVmaXhlZCBldmVudHMgYXJlIHVzYWJsZSwgYW5kIGlmIG5vdCByZW1vdmUgdGhlbSBmcm9tIHRoZSBtYXAuXG5cbiAgaWYgKCEoJ0FuaW1hdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbmVuZC5hbmltYXRpb247XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb247XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbjtcbiAgfSAvLyBTYW1lIGFzIGFib3ZlXG5cblxuICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgfVxufVxuLyoqXG4gKiBBdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdmVuZG9yIHByZWZpeGVkIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKGV2ZW50TmFtZSkge1xuICBpZiAocHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0pIHtcbiAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV07XG4gIH0gZWxzZSBpZiAoIXZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV0pIHtcbiAgICByZXR1cm4gZXZlbnROYW1lO1xuICB9XG5cbiAgdmFyIHByZWZpeE1hcCA9IHZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV07XG5cbiAgZm9yICh2YXIgc3R5bGVQcm9wIGluIHByZWZpeE1hcCkge1xuICAgIGlmIChwcmVmaXhNYXAuaGFzT3duUHJvcGVydHkoc3R5bGVQcm9wKSAmJiBzdHlsZVByb3AgaW4gc3R5bGUpIHtcbiAgICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHByZWZpeE1hcFtzdHlsZVByb3BdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudE5hbWU7XG59XG5cbnZhciBBTklNQVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbmVuZCcpO1xudmFyIEFOSU1BVElPTl9JVEVSQVRJT04gPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uaXRlcmF0aW9uJyk7XG52YXIgQU5JTUFUSU9OX1NUQVJUID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbnN0YXJ0Jyk7XG52YXIgVFJBTlNJVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcpO1xuXG52YXIgdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMgPSBuZXcgTWFwKCk7IC8vIE5PVEU6IENhcGl0YWxpemF0aW9uIGlzIGltcG9ydGFudCBpbiB0aGlzIGxpc3QhXG4vL1xuLy8gRS5nLiBpdCBuZWVkcyBcInBvaW50ZXJEb3duXCIsIG5vdCBcInBvaW50ZXJkb3duXCIuXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2UgZGVyaXZlIGJvdGggUmVhY3QgbmFtZSAoXCJvblBvaW50ZXJEb3duXCIpXG4vLyBhbmQgRE9NIG5hbWUgKFwicG9pbnRlcmRvd25cIikgZnJvbSB0aGUgc2FtZSBsaXN0LlxuLy9cbi8vIEV4Y2VwdGlvbnMgdGhhdCBkb24ndCBtYXRjaCB0aGlzIGNvbnZlbnRpb24gYXJlIGxpc3RlZCBzZXBhcmF0ZWx5LlxuLy9cbi8vIHByZXR0aWVyLWlnbm9yZVxuXG52YXIgc2ltcGxlRXZlbnRQbHVnaW5FdmVudHMgPSBbJ2Fib3J0JywgJ2F1eENsaWNrJywgJ2NhbmNlbCcsICdjYW5QbGF5JywgJ2NhblBsYXlUaHJvdWdoJywgJ2NsaWNrJywgJ2Nsb3NlJywgJ2NvbnRleHRNZW51JywgJ2NvcHknLCAnY3V0JywgJ2RyYWcnLCAnZHJhZ0VuZCcsICdkcmFnRW50ZXInLCAnZHJhZ0V4aXQnLCAnZHJhZ0xlYXZlJywgJ2RyYWdPdmVyJywgJ2RyYWdTdGFydCcsICdkcm9wJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2dvdFBvaW50ZXJDYXB0dXJlJywgJ2lucHV0JywgJ2ludmFsaWQnLCAna2V5RG93bicsICdrZXlQcmVzcycsICdrZXlVcCcsICdsb2FkJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZFN0YXJ0JywgJ2xvc3RQb2ludGVyQ2FwdHVyZScsICdtb3VzZURvd24nLCAnbW91c2VNb3ZlJywgJ21vdXNlT3V0JywgJ21vdXNlT3ZlcicsICdtb3VzZVVwJywgJ3Bhc3RlJywgJ3BhdXNlJywgJ3BsYXknLCAncGxheWluZycsICdwb2ludGVyQ2FuY2VsJywgJ3BvaW50ZXJEb3duJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJPdXQnLCAncG9pbnRlck92ZXInLCAncG9pbnRlclVwJywgJ3Byb2dyZXNzJywgJ3JhdGVDaGFuZ2UnLCAncmVzZXQnLCAncmVzaXplJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VibWl0JywgJ3N1c3BlbmQnLCAndGltZVVwZGF0ZScsICd0b3VjaENhbmNlbCcsICd0b3VjaEVuZCcsICd0b3VjaFN0YXJ0JywgJ3ZvbHVtZUNoYW5nZScsICdzY3JvbGwnLCAndG9nZ2xlJywgJ3RvdWNoTW92ZScsICd3YWl0aW5nJywgJ3doZWVsJ107XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlRXZlbnQoZG9tRXZlbnROYW1lLCByZWFjdE5hbWUpIHtcbiAgdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuc2V0KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlYWN0TmFtZSwgW2RvbUV2ZW50TmFtZV0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZUV2ZW50cygpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaW1wbGVFdmVudFBsdWdpbkV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldmVudE5hbWUgPSBzaW1wbGVFdmVudFBsdWdpbkV2ZW50c1tpXTtcbiAgICB2YXIgZG9tRXZlbnROYW1lID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudE5hbWVbMF0udG9VcHBlckNhc2UoKSArIGV2ZW50TmFtZS5zbGljZSgxKTtcbiAgICByZWdpc3RlclNpbXBsZUV2ZW50KGRvbUV2ZW50TmFtZSwgJ29uJyArIGNhcGl0YWxpemVkRXZlbnQpO1xuICB9IC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgZXZlbnQgbmFtZXMgZG9uJ3QgbWF0Y2guXG5cblxuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9FTkQsICdvbkFuaW1hdGlvbkVuZCcpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9JVEVSQVRJT04sICdvbkFuaW1hdGlvbkl0ZXJhdGlvbicpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9TVEFSVCwgJ29uQW5pbWF0aW9uU3RhcnQnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZGJsY2xpY2snLCAnb25Eb3VibGVDbGljaycpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdmb2N1c2luJywgJ29uRm9jdXMnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZm9jdXNvdXQnLCAnb25CbHVyJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoVFJBTlNJVElPTl9FTkQsICdvblRyYW5zaXRpb25FbmQnKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ0KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHJlYWN0TmFtZSA9IHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzLmdldChkb21FdmVudE5hbWUpO1xuXG4gIGlmIChyZWFjdE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNFdmVudDtcbiAgdmFyIHJlYWN0RXZlbnRUeXBlID0gZG9tRXZlbnROYW1lO1xuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEga2V5cHJlc3MgZXZlbnQgZm9yIGZ1bmN0aW9uIGtleXMgdG9vLiBUaGlzIHJlbW92ZXNcbiAgICAgIC8vIHRoZSB1bndhbnRlZCBrZXlwcmVzcyBldmVudHMuIEVudGVyIGlzIGhvd2V2ZXIgYm90aCBwcmludGFibGUgYW5kXG4gICAgICAvLyBub24tcHJpbnRhYmxlLiBPbmUgd291bGQgZXhwZWN0IFRhYiB0byBiZSBhcyB3ZWxsIChidXQgaXQgaXNuJ3QpLlxuICAgICAgaWYgKGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgcmVhY3RFdmVudFR5cGUgPSAnZm9jdXMnO1xuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgcmVhY3RFdmVudFR5cGUgPSAnYmx1cic7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdiZWZvcmVibHVyJzpcbiAgICBjYXNlICdhZnRlcmJsdXInOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY2xpY2snOlxuICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEgY2xpY2sgZXZlbnQgb24gcmlnaHQgbW91c2UgY2xpY2tzLiBUaGlzIHJlbW92ZXMgdGhlXG4gICAgICAvLyB1bndhbnRlZCBjbGljayBldmVudHMuXG4gICAgICBpZiAobmF0aXZlRXZlbnQuYnV0dG9uID09PSAyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ2F1eGNsaWNrJzpcbiAgICBjYXNlICdkYmxjbGljayc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgIGNhc2UgJ21vdXNldXAnOiAvLyBUT0RPOiBEaXNhYmxlZCBlbGVtZW50cyBzaG91bGQgbm90IHJlc3BvbmQgdG8gbW91c2UgZXZlbnRzXG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkcmFnJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdleGl0JzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICBjYXNlICdkcmFnc3RhcnQnOlxuICAgIGNhc2UgJ2Ryb3AnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRHJhZ0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0b3VjaGNhbmNlbCc6XG4gICAgY2FzZSAndG91Y2hlbmQnOlxuICAgIGNhc2UgJ3RvdWNobW92ZSc6XG4gICAgY2FzZSAndG91Y2hzdGFydCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUb3VjaEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEFOSU1BVElPTl9FTkQ6XG4gICAgY2FzZSBBTklNQVRJT05fSVRFUkFUSU9OOlxuICAgIGNhc2UgQU5JTUFUSU9OX1NUQVJUOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQW5pbWF0aW9uRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVFJBTlNJVElPTl9FTkQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3Njcm9sbCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNVSUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd3aGVlbCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNXaGVlbEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb3B5JzpcbiAgICBjYXNlICdjdXQnOlxuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICBjYXNlICdwb2ludGVyZG93bic6XG4gICAgY2FzZSAncG9pbnRlcm1vdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdwb2ludGVydXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgaW5DYXB0dXJlUGhhc2UgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UpICE9PSAwO1xuXG4gIHtcbiAgICAvLyBTb21lIGV2ZW50cyBkb24ndCBidWJibGUgaW4gdGhlIGJyb3dzZXIuXG4gICAgLy8gSW4gdGhlIHBhc3QsIFJlYWN0IGhhcyBhbHdheXMgYnViYmxlZCB0aGVtLCBidXQgdGhpcyBjYW4gYmUgc3VycHJpc2luZy5cbiAgICAvLyBXZSdyZSBnb2luZyB0byB0cnkgYWxpZ25pbmcgY2xvc2VyIHRvIHRoZSBicm93c2VyIGJlaGF2aW9yIGJ5IG5vdCBidWJibGluZ1xuICAgIC8vIHRoZW0gaW4gUmVhY3QgZWl0aGVyLiBXZSdsbCBzdGFydCBieSBub3QgYnViYmxpbmcgb25TY3JvbGwsIGFuZCB0aGVuIGV4cGFuZC5cbiAgICB2YXIgYWNjdW11bGF0ZVRhcmdldE9ubHkgPSAhaW5DYXB0dXJlUGhhc2UgJiYgLy8gVE9ETzogaWRlYWxseSwgd2UnZCBldmVudHVhbGx5IGFkZCBhbGwgZXZlbnRzIGZyb21cbiAgICAvLyBub25EZWxlZ2F0ZWRFdmVudHMgbGlzdCBpbiBET01QbHVnaW5FdmVudFN5c3RlbS5cbiAgICAvLyBUaGVuIHdlIGNhbiByZW1vdmUgdGhpcyBzcGVjaWFsIGxpc3QuXG4gICAgLy8gVGhpcyBpcyBhIGJyZWFraW5nIGNoYW5nZSB0aGF0IGNhbiB3YWl0IHVudGlsIFJlYWN0IDE4LlxuICAgIGRvbUV2ZW50TmFtZSA9PT0gJ3Njcm9sbCc7XG5cbiAgICB2YXIgX2xpc3RlbmVycyA9IGFjY3VtdWxhdGVTaW5nbGVQaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCByZWFjdE5hbWUsIG5hdGl2ZUV2ZW50LnR5cGUsIGluQ2FwdHVyZVBoYXNlLCBhY2N1bXVsYXRlVGFyZ2V0T25seSk7XG5cbiAgICBpZiAoX2xpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGNyZWF0ZSBldmVudCBsYXppbHkuXG4gICAgICB2YXIgX2V2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihyZWFjdE5hbWUsIHJlYWN0RXZlbnRUeXBlLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogX2V2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IF9saXN0ZW5lcnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdG9wLWxldmVsIHNpZGUgZWZmZWN0LlxucmVnaXN0ZXJTaW1wbGVFdmVudHMoKTtcbnJlZ2lzdGVyRXZlbnRzJDIoKTtcbnJlZ2lzdGVyRXZlbnRzJDEoKTtcbnJlZ2lzdGVyRXZlbnRzJDMoKTtcbnJlZ2lzdGVyRXZlbnRzKCk7XG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkNShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIC8vIFRPRE86IHdlIHNob3VsZCByZW1vdmUgdGhlIGNvbmNlcHQgb2YgYSBcIlNpbXBsZUV2ZW50UGx1Z2luXCIuXG4gIC8vIFRoaXMgaXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGV2ZW50IHN5c3RlbS4gQWxsXG4gIC8vIHRoZSBvdGhlciBwbHVnaW5zIGFyZSBlc3NlbnRpYWxseSBwb2x5ZmlsbHMuIFNvIHRoZSBwbHVnaW5cbiAgLy8gc2hvdWxkIHByb2JhYmx5IGJlIGlubGluZWQgc29tZXdoZXJlIGFuZCBoYXZlIGl0cyBsb2dpY1xuICAvLyBiZSBjb3JlIHRoZSB0byBldmVudCBzeXN0ZW0uIFRoaXMgd291bGQgcG90ZW50aWFsbHkgYWxsb3dcbiAgLy8gdXMgdG8gc2hpcCBidWlsZHMgb2YgUmVhY3Qgd2l0aG91dCB0aGUgcG9seWZpbGxlZCBwbHVnaW5zIGJlbG93LlxuICBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICB2YXIgc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucyA9IChldmVudFN5c3RlbUZsYWdzICYgU0hPVUxEX05PVF9QUk9DRVNTX1BPTFlGSUxMX0VWRU5UX1BMVUdJTlMpID09PSAwOyAvLyBXZSBkb24ndCBwcm9jZXNzIHRoZXNlIGV2ZW50cyB1bmxlc3Mgd2UgYXJlIGluIHRoZVxuICAvLyBldmVudCdzIG5hdGl2ZSBcImJ1YmJsZVwiIHBoYXNlLCB3aGljaCBtZWFucyB0aGF0IHdlJ3JlXG4gIC8vIG5vdCBpbiB0aGUgY2FwdHVyZSBwaGFzZS4gVGhhdCdzIGJlY2F1c2Ugd2UgZW11bGF0ZVxuICAvLyB0aGUgY2FwdHVyZSBwaGFzZSBoZXJlIHN0aWxsLiBUaGlzIGlzIGEgdHJhZGUtb2ZmLFxuICAvLyBiZWNhdXNlIGluIGFuIGlkZWFsIHdvcmxkIHdlIHdvdWxkIG5vdCBlbXVsYXRlIGFuZCB1c2VcbiAgLy8gdGhlIHBoYXNlcyBwcm9wZXJseSwgbGlrZSB3ZSBkbyB3aXRoIHRoZSBTaW1wbGVFdmVudFxuICAvLyBwbHVnaW4uIEhvd2V2ZXIsIHRoZSBwbHVnaW5zIGJlbG93IGVpdGhlciBleHBlY3RcbiAgLy8gZW11bGF0aW9uIChFbnRlckxlYXZlKSBvciB1c2Ugc3RhdGUgbG9jYWxpemVkIHRvIHRoYXRcbiAgLy8gcGx1Z2luIChCZWZvcmVJbnB1dCwgQ2hhbmdlLCBTZWxlY3QpLiBUaGUgc3RhdGUgaW5cbiAgLy8gdGhlc2UgbW9kdWxlcyBjb21wbGljYXRlcyB0aGluZ3MsIGFzIHlvdSdsbCBlc3NlbnRpYWxseVxuICAvLyBnZXQgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhcHR1cmUgcGhhc2UgZXZlbnQgbWlnaHQgY2hhbmdlXG4gIC8vIHN0YXRlLCBvbmx5IGZvciB0aGUgZm9sbG93aW5nIGJ1YmJsZSBldmVudCB0byBjb21lIGluXG4gIC8vIGxhdGVyIGFuZCBub3QgdHJpZ2dlciBhbnl0aGluZyBhcyB0aGUgc3RhdGUgbm93XG4gIC8vIGludmFsaWRhdGVzIHRoZSBoZXVyaXN0aWNzIG9mIHRoZSBldmVudCBwbHVnaW4uIFdlXG4gIC8vIGNvdWxkIGFsdGVyIGFsbCB0aGVzZSBwbHVnaW5zIHRvIHdvcmsgaW4gc3VjaCB3YXlzLCBidXRcbiAgLy8gdGhhdCBtaWdodCBjYXVzZSBvdGhlciB1bmtub3duIHNpZGUtZWZmZWN0cyB0aGF0IHdlXG4gIC8vIGNhbid0IGZvcmVzZWUgcmlnaHQgbm93LlxuXG4gIGlmIChzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zKSB7XG4gICAgZXh0cmFjdEV2ZW50cyQyKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMkMyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIH1cbn0gLy8gTGlzdCBvZiBldmVudHMgdGhhdCBuZWVkIHRvIGJlIGluZGl2aWR1YWxseSBhdHRhY2hlZCB0byBtZWRpYSBlbGVtZW50cy5cblxuXG52YXIgbWVkaWFFdmVudFR5cGVzID0gWydhYm9ydCcsICdjYW5wbGF5JywgJ2NhbnBsYXl0aHJvdWdoJywgJ2R1cmF0aW9uY2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2xvYWRlZGRhdGEnLCAnbG9hZGVkbWV0YWRhdGEnLCAnbG9hZHN0YXJ0JywgJ3BhdXNlJywgJ3BsYXknLCAncGxheWluZycsICdwcm9ncmVzcycsICdyYXRlY2hhbmdlJywgJ3Jlc2l6ZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAndGltZXVwZGF0ZScsICd2b2x1bWVjaGFuZ2UnLCAnd2FpdGluZyddOyAvLyBXZSBzaG91bGQgbm90IGRlbGVnYXRlIHRoZXNlIGV2ZW50cyB0byB0aGUgY29udGFpbmVyLCBidXQgcmF0aGVyXG4vLyBzZXQgdGhlbSBvbiB0aGUgYWN0dWFsIHRhcmdldCBlbGVtZW50IGl0c2VsZi4gVGhpcyBpcyBwcmltYXJpbHlcbi8vIGJlY2F1c2UgdGhlc2UgZXZlbnRzIGRvIG5vdCBjb25zaXN0ZW50bHkgYnViYmxlIGluIHRoZSBET00uXG5cbnZhciBub25EZWxlZ2F0ZWRFdmVudHMgPSBuZXcgU2V0KFsnY2FuY2VsJywgJ2Nsb3NlJywgJ2ludmFsaWQnLCAnbG9hZCcsICdzY3JvbGwnLCAndG9nZ2xlJ10uY29uY2F0KG1lZGlhRXZlbnRUeXBlcykpO1xuXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHZhciB0eXBlID0gZXZlbnQudHlwZSB8fCAndW5rbm93bi1ldmVudCc7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IodHlwZSwgbGlzdGVuZXIsIHVuZGVmaW5lZCwgZXZlbnQpO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGRpc3BhdGNoTGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcHJldmlvdXNJbnN0YW5jZTtcblxuICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICBmb3IgKHZhciBpID0gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IGRpc3BhdGNoTGlzdGVuZXJzW2ldLFxuICAgICAgICAgIGluc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuaW5zdGFuY2UsXG4gICAgICAgICAgY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKGluc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRfaSA9IGRpc3BhdGNoTGlzdGVuZXJzW19pXSxcbiAgICAgICAgICBfaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuaW5zdGFuY2UsXG4gICAgICAgICAgX2N1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBfbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kubGlzdGVuZXI7XG5cbiAgICAgIGlmIChfaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgX2xpc3RlbmVyLCBfY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gX2luc3RhbmNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaFF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9kaXNwYXRjaFF1ZXVlJGkgPSBkaXNwYXRjaFF1ZXVlW2ldLFxuICAgICAgICBldmVudCA9IF9kaXNwYXRjaFF1ZXVlJGkuZXZlbnQsXG4gICAgICAgIGxpc3RlbmVycyA9IF9kaXNwYXRjaFF1ZXVlJGkubGlzdGVuZXJzO1xuICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBsaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKTsgLy8gIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICB9IC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LlxuXG5cbiAgcmV0aHJvd0NhdWdodEVycm9yKCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKTtcbn1cblxuZnVuY3Rpb24gbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEVsZW1lbnQpIHtcbiAge1xuICAgIGlmICghbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpKSB7XG4gICAgICBlcnJvcignRGlkIG5vdCBleHBlY3QgYSBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCkgY2FsbCBmb3IgXCIlc1wiLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGRvbUV2ZW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIgPSBmYWxzZTtcbiAgdmFyIGxpc3RlbmVyU2V0ID0gZ2V0RXZlbnRMaXN0ZW5lclNldCh0YXJnZXRFbGVtZW50KTtcbiAgdmFyIGxpc3RlbmVyU2V0S2V5ID0gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcblxuICBpZiAoIWxpc3RlbmVyU2V0LmhhcyhsaXN0ZW5lclNldEtleSkpIHtcbiAgICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBkb21FdmVudE5hbWUsIElTX05PTl9ERUxFR0FURUQsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyLCB0YXJnZXQpIHtcbiAge1xuICAgIGlmIChub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkgJiYgIWlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBhIGxpc3RlblRvTmF0aXZlRXZlbnQoKSBjYWxsIGZvciBcIiVzXCIgaW4gdGhlIGJ1YmJsZSBwaGFzZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBkb21FdmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBldmVudFN5c3RlbUZsYWdzID0gMDtcblxuICBpZiAoaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgIGV2ZW50U3lzdGVtRmxhZ3MgfD0gSVNfQ0FQVFVSRV9QSEFTRTtcbiAgfVxuXG4gIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldCwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcbn0gLy8gVGhpcyBpcyBvbmx5IHVzZWQgYnkgY3JlYXRlRXZlbnRIYW5kbGUgd2hlbiB0aGVcbnZhciBsaXN0ZW5pbmdNYXJrZXIgPSAnX3JlYWN0TGlzdGVuaW5nJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuZnVuY3Rpb24gbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgaWYgKCFyb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSA9IHRydWU7XG4gICAgYWxsTmF0aXZlRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGRvbUV2ZW50TmFtZSkge1xuICAgICAgLy8gV2UgaGFuZGxlIHNlbGVjdGlvbmNoYW5nZSBzZXBhcmF0ZWx5IGJlY2F1c2UgaXRcbiAgICAgIC8vIGRvZXNuJ3QgYnViYmxlIGFuZCBuZWVkcyB0byBiZSBvbiB0aGUgZG9jdW1lbnQuXG4gICAgICBpZiAoZG9tRXZlbnROYW1lICE9PSAnc2VsZWN0aW9uY2hhbmdlJykge1xuICAgICAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCBmYWxzZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIHRydWUsIHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckVsZW1lbnQgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xuXG4gICAgaWYgKG93bmVyRG9jdW1lbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQgYWxzbyBuZWVkcyBkZWR1cGxpY2F0aW9uXG4gICAgICAvLyBidXQgaXQgaXMgYXR0YWNoZWQgdG8gdGhlIGRvY3VtZW50LlxuICAgICAgaWYgKCFvd25lckRvY3VtZW50W2xpc3RlbmluZ01hcmtlcl0pIHtcbiAgICAgICAgb3duZXJEb2N1bWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudCgnc2VsZWN0aW9uY2hhbmdlJywgZmFsc2UsIG93bmVyRG9jdW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgaXNEZWZlcnJlZExpc3RlbmVyRm9yTGVnYWN5RkJTdXBwb3J0KSB7XG4gIHZhciBsaXN0ZW5lciA9IGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKTsgLy8gSWYgcGFzc2l2ZSBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCwgdGhlbiB0aGUgZXZlbnQgd2lsbCBiZVxuICAvLyBhY3RpdmUgYW5kIG5vdCBwYXNzaXZlLlxuXG4gIHZhciBpc1Bhc3NpdmVMaXN0ZW5lciA9IHVuZGVmaW5lZDtcblxuICBpZiAocGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQpIHtcbiAgICAvLyBCcm93c2VycyBpbnRyb2R1Y2VkIGFuIGludGVydmVudGlvbiwgbWFraW5nIHRoZXNlIGV2ZW50c1xuICAgIC8vIHBhc3NpdmUgYnkgZGVmYXVsdCBvbiBkb2N1bWVudC4gUmVhY3QgZG9lc24ndCBiaW5kIHRoZW1cbiAgICAvLyB0byBkb2N1bWVudCBhbnltb3JlLCBidXQgY2hhbmdpbmcgdGhpcyBub3cgd291bGQgdW5kb1xuICAgIC8vIHRoZSBwZXJmb3JtYW5jZSB3aW5zIGZyb20gdGhlIGNoYW5nZS4gU28gd2UgZW11bGF0ZVxuICAgIC8vIHRoZSBleGlzdGluZyBiZWhhdmlvciBtYW51YWxseSBvbiB0aGUgcm9vdHMgbm93LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTk2NTFcbiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAndG91Y2hzdGFydCcgfHwgZG9tRXZlbnROYW1lID09PSAndG91Y2htb3ZlJyB8fCBkb21FdmVudE5hbWUgPT09ICd3aGVlbCcpIHtcbiAgICAgIGlzUGFzc2l2ZUxpc3RlbmVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB0YXJnZXRDb250YWluZXIgPSAgdGFyZ2V0Q29udGFpbmVyO1xuICB2YXIgdW5zdWJzY3JpYmVMaXN0ZW5lcjsgLy8gV2hlbiBsZWdhY3lGQlN1cHBvcnQgaXMgZW5hYmxlZCwgaXQncyBmb3Igd2hlbiB3ZVxuXG5cbiAgaWYgKGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICBpZiAoaXNQYXNzaXZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lciwgaXNQYXNzaXZlTGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lciwgaXNQYXNzaXZlTGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc01hdGNoaW5nUm9vdENvbnRhaW5lcihncmFuZENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHJldHVybiBncmFuZENvbnRhaW5lciA9PT0gdGFyZ2V0Q29udGFpbmVyIHx8IGdyYW5kQ29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgJiYgZ3JhbmRDb250YWluZXIucGFyZW50Tm9kZSA9PT0gdGFyZ2V0Q29udGFpbmVyO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBhbmNlc3Rvckluc3QgPSB0YXJnZXRJbnN0O1xuXG4gIGlmICgoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFKSA9PT0gMCAmJiAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX05PTl9ERUxFR0FURUQpID09PSAwKSB7XG4gICAgdmFyIHRhcmdldENvbnRhaW5lck5vZGUgPSB0YXJnZXRDb250YWluZXI7IC8vIElmIHdlIGFyZSB1c2luZyB0aGUgbGVnYWN5IEZCIHN1cHBvcnQgZmxhZywgd2VcblxuICAgIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgYmVsb3cgbG9naWMgYXR0ZW1wdHMgdG8gd29yayBvdXQgaWYgd2UgbmVlZCB0byBjaGFuZ2VcbiAgICAgIC8vIHRoZSB0YXJnZXQgZmliZXIgdG8gYSBkaWZmZXJlbnQgYW5jZXN0b3IuIFdlIGhhZCBzaW1pbGFyIGxvZ2ljXG4gICAgICAvLyBpbiB0aGUgbGVnYWN5IGV2ZW50IHN5c3RlbSwgZXhjZXB0IHRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuXG4gICAgICAvLyBzeXN0ZW1zIGlzIHRoYXQgdGhlIG1vZGVybiBldmVudCBzeXN0ZW0gbm93IGhhcyBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgLy8gYXR0YWNoZWQgdG8gZWFjaCBSZWFjdCBSb290IGFuZCBSZWFjdCBQb3J0YWwgUm9vdC4gVG9nZXRoZXIsXG4gICAgICAvLyB0aGUgRE9NIG5vZGVzIHJlcHJlc2VudGluZyB0aGVzZSByb290cyBhcmUgdGhlIFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gVG8gZmlndXJlIG91dCB3aGljaCBhbmNlc3RvciBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlLCB3ZSB0cmF2ZXJzZVxuICAgICAgLy8gdXAgdGhlIGZpYmVyIHRyZWUgZnJvbSB0aGUgdGFyZ2V0IGluc3RhbmNlIGFuZCBhdHRlbXB0IHRvIGZpbmRcbiAgICAgIC8vIHJvb3QgYm91bmRhcmllcyB0aGF0IG1hdGNoIHRoYXQgb2Ygb3VyIGN1cnJlbnQgXCJyb290Q29udGFpbmVyXCIuXG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoYXQgXCJyb290Q29udGFpbmVyXCIsIHdlIGZpbmQgdGhlIHBhcmVudCBmaWJlclxuICAgICAgLy8gc3ViLXRyZWUgZm9yIHRoYXQgcm9vdCBhbmQgbWFrZSB0aGF0IG91ciBhbmNlc3RvciBpbnN0YW5jZS5cbiAgICAgIHZhciBub2RlID0gdGFyZ2V0SW5zdDtcblxuICAgICAgbWFpbkxvb3A6IHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5vZGVUYWcgPSBub2RlLnRhZztcblxuICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFJvb3QgfHwgbm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgIHZhciBjb250YWluZXIgPSBub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChub2RlVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IGlzIGEgcG9ydGFsLCBidXQgaXQncyBub3QgdGhlIHJvb3RDb250YWluZXIgd2UncmUgbG9va2luZyBmb3IuXG4gICAgICAgICAgICAvLyBOb3JtYWxseSBwb3J0YWxzIGhhbmRsZSB0aGVpciBvd24gZXZlbnRzIGFsbCB0aGUgd2F5IGRvd24gdG8gdGhlIHJvb3QuXG4gICAgICAgICAgICAvLyBTbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBzdG9wIG5vdy4gSG93ZXZlciwgd2UgZG9uJ3Qga25vdyBpZiB0aGlzIHBvcnRhbFxuICAgICAgICAgICAgLy8gd2FzIHBhcnQgb2YgKm91ciogcm9vdC5cbiAgICAgICAgICAgIHZhciBncmFuZE5vZGUgPSBub2RlLnJldHVybjtcblxuICAgICAgICAgICAgd2hpbGUgKGdyYW5kTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgZ3JhbmRUYWcgPSBncmFuZE5vZGUudGFnO1xuXG4gICAgICAgICAgICAgIGlmIChncmFuZFRhZyA9PT0gSG9zdFJvb3QgfHwgZ3JhbmRUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgZ3JhbmRDb250YWluZXIgPSBncmFuZE5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yIGFuZCB3ZSBmb3VuZCBpdCBhc1xuICAgICAgICAgICAgICAgICAgLy8gYSBwYXJlbnQgb2YgdGhlIFBvcnRhbC4gVGhhdCBtZWFucyB3ZSBjYW4gaWdub3JlIGl0IGJlY2F1c2UgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBQb3J0YWwgd2lsbCBidWJibGUgdGhyb3VnaCB0byB1cy5cbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBncmFuZE5vZGUgPSBncmFuZE5vZGUucmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gTm93IHdlIG5lZWQgdG8gZmluZCBpdCdzIGNvcnJlc3BvbmRpbmcgaG9zdCBmaWJlciBpbiB0aGUgb3RoZXJcbiAgICAgICAgICAvLyB0cmVlLiBUbyBkbyB0aGlzIHdlIGNhbiB1c2UgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUsIGJ1dCB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgZmliZXIgaXMgYSBob3N0IGluc3RhbmNlLCBvdGhlcndpc2VcbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHRyYXZlcnNlIHVwIHRocm91Z2ggdGhlIERPTSB0aWxsIHdlIGZpbmQgdGhlIGNvcnJlY3RcbiAgICAgICAgICAvLyBub2RlIHRoYXQgaXMgZnJvbSB0aGUgb3RoZXIgdHJlZS5cblxuXG4gICAgICAgICAgd2hpbGUgKGNvbnRhaW5lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShjb250YWluZXIpO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnROb2RlLnRhZztcblxuICAgICAgICAgICAgaWYgKHBhcmVudFRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBwYXJlbnRUYWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgICAgICAgIG5vZGUgPSBhbmNlc3Rvckluc3QgPSBwYXJlbnROb2RlO1xuICAgICAgICAgICAgICBjb250aW51ZSBtYWluTG9vcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIGFuY2VzdG9ySW5zdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICByZXR1cm4ge1xuICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICBsaXN0ZW5lcjogbGlzdGVuZXIsXG4gICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldFxuICB9O1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnRUeXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHksIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjYXB0dXJlTmFtZSA9IHJlYWN0TmFtZSAhPT0gbnVsbCA/IHJlYWN0TmFtZSArICdDYXB0dXJlJyA6IG51bGw7XG4gIHZhciByZWFjdEV2ZW50TmFtZSA9IGluQ2FwdHVyZVBoYXNlID8gY2FwdHVyZU5hbWUgOiByZWFjdE5hbWU7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0RmliZXI7XG4gIHZhciBsYXN0SG9zdENvbXBvbmVudCA9IG51bGw7IC8vIEFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBhbmQgbGlzdGVuZXJzIHZpYSB0aGUgdGFyZ2V0IC0+IHJvb3QgcGF0aC5cblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICB2YXIgX2luc3RhbmNlMiA9IGluc3RhbmNlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2UyLnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlMi50YWc7IC8vIEhhbmRsZSBsaXN0ZW5lcnMgdGhhdCBhcmUgb24gSG9zdENvbXBvbmVudHMgKGkuZS4gPGRpdj4pXG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgbGFzdEhvc3RDb21wb25lbnQgPSBzdGF0ZU5vZGU7IC8vIGNyZWF0ZUV2ZW50SGFuZGxlIGxpc3RlbmVyc1xuXG5cbiAgICAgIGlmIChyZWFjdEV2ZW50TmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVhY3RFdmVudE5hbWUpO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgbGlzdGVuZXIsIGxhc3RIb3N0Q29tcG9uZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIElmIHdlIGFyZSBvbmx5IGFjY3VtdWxhdGluZyBldmVudHMgZm9yIHRoZSB0YXJnZXQsIHRoZW4gd2UgZG9uJ3RcbiAgICAvLyBjb250aW51ZSB0byBwcm9wYWdhdGUgdGhyb3VnaCB0aGUgUmVhY3QgZmliZXIgdHJlZSB0byBmaW5kIG90aGVyXG4gICAgLy8gbGlzdGVuZXJzLlxuXG5cbiAgICBpZiAoYWNjdW11bGF0ZVRhcmdldE9ubHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH0gLy8gSWYgd2UgYXJlIHByb2Nlc3NpbmcgdGhlIG9uQmVmb3JlQmx1ciBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIHRha2VcblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVycztcbn0gLy8gV2Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gZm9yOlxuLy8gLSBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luXG4vLyAtIENoYW5nZUV2ZW50UGx1Z2luXG4vLyAtIFNlbGVjdEV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoZXNlIHBsdWdpbnNcbi8vIGluIHRoZSBidWJibGUgcGhhc2UsIHNvIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSB0d29cbi8vIHBoYXNlIGV2ZW50IGxpc3RlbmVycyAodmlhIGVtdWxhdGlvbikuXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRGaWJlciwgcmVhY3ROYW1lKSB7XG4gIHZhciBjYXB0dXJlTmFtZSA9IHJlYWN0TmFtZSArICdDYXB0dXJlJztcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UzID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTMuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UzLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudFRhcmdldCA9IHN0YXRlTm9kZTtcbiAgICAgIHZhciBjYXB0dXJlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZU5hbWUpO1xuXG4gICAgICBpZiAoY2FwdHVyZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBidWJibGVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdE5hbWUpO1xuXG4gICAgICBpZiAoYnViYmxlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVycztcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50KGluc3QpIHtcbiAgaWYgKGluc3QgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRvIHtcbiAgICBpbnN0ID0gaW5zdC5yZXR1cm47IC8vIFRPRE86IElmIHRoaXMgaXMgYSBIb3N0Um9vdCB3ZSBtaWdodCB3YW50IHRvIGJhaWwgb3V0LlxuICAgIC8vIFRoYXQgaXMgZGVwZW5kaW5nIG9uIGlmIHdlIHdhbnQgbmVzdGVkIHN1YnRyZWVzIChsYXllcnMpIHRvIGJ1YmJsZVxuICAgIC8vIGV2ZW50cyB0byB0aGVpciBwYXJlbnQuIFdlIGNvdWxkIGFsc28gZ28gdGhyb3VnaCBwYXJlbnROb2RlIG9uIHRoZVxuICAgIC8vIGhvc3Qgbm9kZSBidXQgdGhhdCB3b3VsZG4ndCB3b3JrIGZvciBSZWFjdCBOYXRpdmUgYW5kIGRvZXNuJ3QgbGV0IHVzXG4gICAgLy8gZG8gdGhlIHBvcnRhbCBmZWF0dXJlLlxuICB9IHdoaWxlIChpbnN0ICYmIGluc3QudGFnICE9PSBIb3N0Q29tcG9uZW50KTtcblxuICBpZiAoaW5zdCkge1xuICAgIHJldHVybiBpbnN0O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIFJldHVybiB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciBvZiBBIGFuZCBCLCBvciBudWxsIGlmIHRoZXkgYXJlIGluXG4gKiBkaWZmZXJlbnQgdHJlZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRMb3dlc3RDb21tb25BbmNlc3RvcihpbnN0QSwgaW5zdEIpIHtcbiAgdmFyIG5vZGVBID0gaW5zdEE7XG4gIHZhciBub2RlQiA9IGluc3RCO1xuICB2YXIgZGVwdGhBID0gMDtcblxuICBmb3IgKHZhciB0ZW1wQSA9IG5vZGVBOyB0ZW1wQTsgdGVtcEEgPSBnZXRQYXJlbnQodGVtcEEpKSB7XG4gICAgZGVwdGhBKys7XG4gIH1cblxuICB2YXIgZGVwdGhCID0gMDtcblxuICBmb3IgKHZhciB0ZW1wQiA9IG5vZGVCOyB0ZW1wQjsgdGVtcEIgPSBnZXRQYXJlbnQodGVtcEIpKSB7XG4gICAgZGVwdGhCKys7XG4gIH0gLy8gSWYgQSBpcyBkZWVwZXIsIGNyYXdsIHVwLlxuXG5cbiAgd2hpbGUgKGRlcHRoQSAtIGRlcHRoQiA+IDApIHtcbiAgICBub2RlQSA9IGdldFBhcmVudChub2RlQSk7XG4gICAgZGVwdGhBLS07XG4gIH0gLy8gSWYgQiBpcyBkZWVwZXIsIGNyYXdsIHVwLlxuXG5cbiAgd2hpbGUgKGRlcHRoQiAtIGRlcHRoQSA+IDApIHtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gICAgZGVwdGhCLS07XG4gIH0gLy8gV2FsayBpbiBsb2Nrc3RlcCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG5cblxuICB2YXIgZGVwdGggPSBkZXB0aEE7XG5cbiAgd2hpbGUgKGRlcHRoLS0pIHtcbiAgICBpZiAobm9kZUEgPT09IG5vZGVCIHx8IG5vZGVCICE9PSBudWxsICYmIG5vZGVBID09PSBub2RlQi5hbHRlcm5hdGUpIHtcbiAgICAgIHJldHVybiBub2RlQTtcbiAgICB9XG5cbiAgICBub2RlQSA9IGdldFBhcmVudChub2RlQSk7XG4gICAgbm9kZUIgPSBnZXRQYXJlbnQobm9kZUIpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZXZlbnQsIHRhcmdldCwgY29tbW9uLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50Ll9yZWFjdE5hbWU7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0O1xuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIGlmIChpbnN0YW5jZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgX2luc3RhbmNlNCA9IGluc3RhbmNlLFxuICAgICAgICBhbHRlcm5hdGUgPSBfaW5zdGFuY2U0LmFsdGVybmF0ZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlNC5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTQudGFnO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGNvbW1vbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICBpZiAoY2FwdHVyZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaW5DYXB0dXJlUGhhc2UpIHtcbiAgICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgYnViYmxlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggIT09IDApIHtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgfVxufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEVudGVyTGVhdmVFdmVudFBsdWdpblxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIG9ubHkgcHJvY2VzcyB0aGlzIHBsdWdpblxuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzLlxuXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlVHdvUGhhc2VMaXN0ZW5lcnMoZGlzcGF0Y2hRdWV1ZSwgbGVhdmVFdmVudCwgZW50ZXJFdmVudCwgZnJvbSwgdG8pIHtcbiAgdmFyIGNvbW1vbiA9IGZyb20gJiYgdG8gPyBnZXRMb3dlc3RDb21tb25BbmNlc3Rvcihmcm9tLCB0bykgOiBudWxsO1xuXG4gIGlmIChmcm9tICE9PSBudWxsKSB7XG4gICAgYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBmcm9tLCBjb21tb24sIGZhbHNlKTtcbiAgfVxuXG4gIGlmICh0byAhPT0gbnVsbCAmJiBlbnRlckV2ZW50ICE9PSBudWxsKSB7XG4gICAgYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBlbnRlckV2ZW50LCB0bywgY29tbW9uLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBjYXB0dXJlKSB7XG4gIHJldHVybiBkb21FdmVudE5hbWUgKyBcIl9fXCIgKyAoY2FwdHVyZSA/ICdjYXB0dXJlJyA6ICdidWJibGUnKTtcbn1cblxudmFyIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gZmFsc2U7XG52YXIgREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwgPSAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnO1xudmFyIFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyA9ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnO1xudmFyIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HID0gJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZyc7XG52YXIgQVVUT0ZPQ1VTID0gJ2F1dG9Gb2N1cyc7XG52YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nO1xudmFyIFNUWUxFID0gJ3N0eWxlJztcbnZhciBIVE1MJDEgPSAnX19odG1sJztcbnZhciB3YXJuZWRVbmtub3duVGFncztcbnZhciB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50O1xudmFyIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZTtcbnZhciB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzO1xudmFyIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcjtcbnZhciBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nO1xudmFyIG5vcm1hbGl6ZUhUTUw7XG5cbntcbiAgd2FybmVkVW5rbm93blRhZ3MgPSB7XG4gICAgLy8gVGhlcmUgYXJlIHdvcmtpbmcgcG9seWZpbGxzIGZvciA8ZGlhbG9nPi4gTGV0IHBlb3BsZSB1c2UgaXQuXG4gICAgZGlhbG9nOiB0cnVlLFxuICAgIC8vIEVsZWN0cm9uIHNoaXBzIGEgY3VzdG9tIDx3ZWJ2aWV3PiB0YWcgdG8gZGlzcGxheSBleHRlcm5hbCB3ZWIgY29udGVudCBpblxuICAgIC8vIGFuIGlzb2xhdGVkIGZyYW1lIGFuZCBwcm9jZXNzLlxuICAgIC8vIFRoaXMgdGFnIGlzIG5vdCBwcmVzZW50IGluIG5vbiBFbGVjdHJvbiBlbnZpcm9ubWVudHMgc3VjaCBhcyBKU0RvbSB3aGljaFxuICAgIC8vIGlzIG9mdGVuIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gICAgLy8gQHNlZSBodHRwczovL2VsZWN0cm9uanMub3JnL2RvY3MvYXBpL3dlYnZpZXctdGFnXG4gICAgd2VidmlldzogdHJ1ZVxuICB9O1xuXG4gIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQgPSBmdW5jdGlvbiAodHlwZSwgcHJvcHMpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXModHlwZSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyQxKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcywge1xuICAgICAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llczogcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyxcbiAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNcbiAgICB9KTtcbiAgfTsgLy8gSUUgMTEgcGFyc2VzICYgbm9ybWFsaXplcyB0aGUgc3R5bGUgYXR0cmlidXRlIGFzIG9wcG9zZWQgdG8gb3RoZXJcbiAgLy8gYnJvd3NlcnMuIEl0IGFkZHMgc3BhY2VzIGFuZCBzb3J0cyB0aGUgcHJvcGVydGllcyBpbiBzb21lXG4gIC8vIG5vbi1hbHBoYWJldGljYWwgb3JkZXIuIEhhbmRsaW5nIHRoYXQgd291bGQgcmVxdWlyZSBzb3J0aW5nIENTU1xuICAvLyBwcm9wZXJ0aWVzIGluIHRoZSBjbGllbnQgJiBzZXJ2ZXIgdmVyc2lvbnMgb3IgYXBwbHlpbmdcbiAgLy8gYGV4cGVjdGVkU3R5bGVgIHRvIGEgdGVtcG9yYXJ5IERPTSBub2RlIHRvIHJlYWQgaXRzIGBzdHlsZWAgYXR0cmlidXRlXG4gIC8vIG5vcm1hbGl6ZWQuIFNpbmNlIGl0IG9ubHkgYWZmZWN0cyBJRSwgd2UncmUgc2tpcHBpbmcgc3R5bGUgd2FybmluZ3NcbiAgLy8gaW4gdGhhdCBicm93c2VyIGNvbXBsZXRlbHkgaW4gZmF2b3Igb2YgZG9pbmcgYWxsIHRoYXQgd29yay5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE4MDdcblxuXG4gIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmcgPSBjYW5Vc2VET00gJiYgIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcblxuICB3YXJuRm9yUHJvcERpZmZlcmVuY2UgPSBmdW5jdGlvbiAocHJvcE5hbWUsIHNlcnZlclZhbHVlLCBjbGllbnRWYWx1ZSkge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBub3JtYWxpemVkQ2xpZW50VmFsdWUgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoY2xpZW50VmFsdWUpO1xuICAgIHZhciBub3JtYWxpemVkU2VydmVyVmFsdWUgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVmFsdWUpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSA9PT0gbm9ybWFsaXplZENsaWVudFZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Byb3AgYCVzYCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6ICVzIENsaWVudDogJXMnLCBwcm9wTmFtZSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZFNlcnZlclZhbHVlKSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZENsaWVudFZhbHVlKSk7XG4gIH07XG5cbiAgd2FybkZvckV4dHJhQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lcykge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICBhdHRyaWJ1dGVOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBuYW1lcy5wdXNoKG5hbWUpO1xuICAgIH0pO1xuXG4gICAgZXJyb3IoJ0V4dHJhIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2VydmVyOiAlcycsIG5hbWVzKTtcbiAgfTtcblxuICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAocmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHtcbiAgICBpZiAobGlzdGVuZXIgPT09IGZhbHNlKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBgZmFsc2VgLlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYCVzYCB0eXBlLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcik7XG4gICAgfVxuICB9OyAvLyBQYXJzZSB0aGUgSFRNTCBhbmQgcmVhZCBpdCBiYWNrIHRvIG5vcm1hbGl6ZSB0aGUgSFRNTCBzdHJpbmcgc28gdGhhdCBpdFxuICAvLyBjYW4gYmUgdXNlZCBmb3IgY29tcGFyaXNvbi5cblxuXG4gIG5vcm1hbGl6ZUhUTUwgPSBmdW5jdGlvbiAocGFyZW50LCBodG1sKSB7XG4gICAgLy8gV2UgY291bGQgaGF2ZSBjcmVhdGVkIGEgc2VwYXJhdGUgZG9jdW1lbnQgaGVyZSB0byBhdm9pZFxuICAgIC8vIHJlLWluaXRpYWxpemluZyBjdXN0b20gZWxlbWVudHMgaWYgdGhleSBleGlzdC4gQnV0IHRoaXMgYnJlYWtzXG4gICAgLy8gaG93IDxub3NjcmlwdD4gaXMgYmVpbmcgaGFuZGxlZC4gU28gd2UgdXNlIHRoZSBzYW1lIGRvY3VtZW50LlxuICAgIC8vIFNlZSB0aGUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMTE1Ny5cbiAgICB2YXIgdGVzdEVsZW1lbnQgPSBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSA/IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50LnRhZ05hbWUpIDogcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHBhcmVudC5uYW1lc3BhY2VVUkksIHBhcmVudC50YWdOYW1lKTtcbiAgICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0ZXN0RWxlbWVudC5pbm5lckhUTUw7XG4gIH07XG59IC8vIEhUTUwgcGFyc2luZyBub3JtYWxpemVzIENSIGFuZCBDUkxGIHRvIExGLlxuLy8gSXQgYWxzbyBjYW4gdHVybiBcXHUwMDAwIGludG8gXFx1RkZGRCBpbnNpZGUgYXR0cmlidXRlcy5cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zaW5nbGUtcGFnZS5odG1sI3ByZXByb2Nlc3NpbmctdGhlLWlucHV0LXN0cmVhbVxuLy8gSWYgd2UgaGF2ZSBhIG1pc21hdGNoLCBpdCBtaWdodCBiZSBjYXVzZWQgYnkgdGhhdC5cbi8vIFdlIHdpbGwgc3RpbGwgcGF0Y2ggdXAgaW4gdGhpcyBjYXNlIGJ1dCBub3QgZmlyZSB0aGUgd2FybmluZy5cblxuXG52YXIgTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYID0gL1xcclxcbj8vZztcbnZhciBOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVggPSAvXFx1MDAwMHxcXHVGRkZEL2c7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShtYXJrdXApIHtcbiAge1xuICAgIGNoZWNrSHRtbFN0cmluZ0NvZXJjaW9uKG1hcmt1cCk7XG4gIH1cblxuICB2YXIgbWFya3VwU3RyaW5nID0gdHlwZW9mIG1hcmt1cCA9PT0gJ3N0cmluZycgPyBtYXJrdXAgOiAnJyArIG1hcmt1cDtcbiAgcmV0dXJuIG1hcmt1cFN0cmluZy5yZXBsYWNlKE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCwgJ1xcbicpLnJlcGxhY2UoTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChzZXJ2ZXJUZXh0LCBjbGllbnRUZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHZhciBub3JtYWxpemVkQ2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgdmFyIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0ID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclRleHQpO1xuXG4gIGlmIChub3JtYWxpemVkU2VydmVyVGV4dCA9PT0gbm9ybWFsaXplZENsaWVudFRleHQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2hvdWxkV2FybkRldikge1xuICAgIHtcbiAgICAgIGlmICghZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUZXh0IGNvbnRlbnQgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiBcIiVzXCIgQ2xpZW50OiBcIiVzXCInLCBub3JtYWxpemVkU2VydmVyVGV4dCwgbm9ybWFsaXplZENsaWVudFRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpc0NvbmN1cnJlbnRNb2RlICYmIGVuYWJsZUNsaWVudFJlbmRlckZhbGxiYWNrT25UZXh0TWlzbWF0Y2gpIHtcbiAgICAvLyBJbiBjb25jdXJyZW50IHJvb3RzLCB3ZSB0aHJvdyB3aGVuIHRoZXJlJ3MgYSB0ZXh0IG1pc21hdGNoIGFuZCByZXZlcnQgdG9cbiAgICAvLyBjbGllbnQgcmVuZGVyaW5nLCB1cCB0byB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RleHQgY29udGVudCBkb2VzIG5vdCBtYXRjaCBzZXJ2ZXItcmVuZGVyZWQgSFRNTC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgcmV0dXJuIHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckVsZW1lbnQgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQobm9kZSkge1xuICAvLyBNb2JpbGUgU2FmYXJpIGRvZXMgbm90IGZpcmUgcHJvcGVybHkgYnViYmxlIGNsaWNrIGV2ZW50cyBvblxuICAvLyBub24taW50ZXJhY3RpdmUgZWxlbWVudHMsIHdoaWNoIG1lYW5zIGRlbGVnYXRlZCBjbGljayBsaXN0ZW5lcnMgZG8gbm90XG4gIC8vIGZpcmUuIFRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGJ1ZyBpbnZvbHZlcyBhdHRhY2hpbmcgYW4gZW1wdHkgY2xpY2tcbiAgLy8gbGlzdGVuZXIgb24gdGhlIHRhcmdldCBub2RlLlxuICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZlbnRfZGVsLmh0bWxcbiAgLy8gSnVzdCBzZXQgaXQgdXNpbmcgdGhlIG9uY2xpY2sgcHJvcGVydHkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIG1hbmFnZSBhbnlcbiAgLy8gYm9va2tlZXBpbmcgZm9yIGl0LiBOb3Qgc3VyZSBpZiB3ZSBuZWVkIHRvIGNsZWFyIGl0IHdoZW4gdGhlIGxpc3RlbmVyIGlzXG4gIC8vIHJlbW92ZWQuXG4gIC8vIFRPRE86IE9ubHkgZG8gdGhpcyBmb3IgdGhlIHJlbGV2YW50IFNhZmFyaXMgbWF5YmU/XG4gIG5vZGUub25jbGljayA9IG5vb3A7XG59XG5cbmZ1bmN0aW9uIHNldEluaXRpYWxET01Qcm9wZXJ0aWVzKHRhZywgZG9tRWxlbWVudCwgcm9vdENvbnRhaW5lckVsZW1lbnQsIG5leHRQcm9wcywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgZm9yICh2YXIgcHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICBpZiAoIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cblxuXG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBuZXh0UHJvcCk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgbmV4dEh0bWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIEF2b2lkIHNldHRpbmcgaW5pdGlhbCB0ZXh0Q29udGVudCB3aGVuIHRoZSB0ZXh0IGlzIGVtcHR5LiBJbiBJRTExIHNldHRpbmdcbiAgICAgICAgLy8gdGV4dENvbnRlbnQgb24gYSA8dGV4dGFyZWE+IHdpbGwgY2F1c2UgdGhlIHBsYWNlaG9sZGVyIHRvIG5vdFxuICAgICAgICAvLyBzaG93IHdpdGhpbiB0aGUgPHRleHRhcmVhPiB1bnRpbCBpdCBoYXMgYmVlbiBmb2N1c2VkIGFuZCBibHVycmVkIGFnYWluLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzY3MzEjaXNzdWVjb21tZW50LTI1NDg3NDU1M1xuICAgICAgICB2YXIgY2FuU2V0VGV4dENvbnRlbnQgPSB0YWcgIT09ICd0ZXh0YXJlYScgfHwgbmV4dFByb3AgIT09ICcnO1xuXG4gICAgICAgIGlmIChjYW5TZXRUZXh0Q29udGVudCkge1xuICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IEFVVE9GT0NVUykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURPTVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgd2FzQ3VzdG9tQ29tcG9uZW50VGFnLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAvLyBUT0RPOiBIYW5kbGUgd2FzQ3VzdG9tQ29tcG9uZW50VGFnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdXBkYXRlUGF5bG9hZC5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBwcm9wS2V5ID0gdXBkYXRlUGF5bG9hZFtpXTtcbiAgICB2YXIgcHJvcFZhbHVlID0gdXBkYXRlUGF5bG9hZFtpICsgMV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBwcm9wVmFsdWUsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQsIHBhcmVudE5hbWVzcGFjZSkge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWc7IC8vIFdlIGNyZWF0ZSB0YWdzIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlaXIgcGFyZW50IGNvbnRhaW5lciwgZXhjZXB0IEhUTUxcbiAgLy8gdGFncyBnZXQgbm8gbmFtZXNwYWNlLlxuXG4gIHZhciBvd25lckRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgdmFyIGRvbUVsZW1lbnQ7XG4gIHZhciBuYW1lc3BhY2VVUkkgPSBwYXJlbnROYW1lc3BhY2U7XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICBuYW1lc3BhY2VVUkkgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIHtcbiAgICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpOyAvLyBTaG91bGQgdGhpcyBjaGVjayBiZSBnYXRlZCBieSBwYXJlbnQgbmFtZXNwYWNlPyBOb3Qgc3VyZSB3ZSB3YW50IHRvXG4gICAgICAvLyBhbGxvdyA8U1ZHPiBvciA8bUFUSD4uXG5cbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgdHlwZSAhPT0gdHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGVycm9yKCc8JXMgLz4gaXMgdXNpbmcgaW5jb3JyZWN0IGNhc2luZy4gJyArICdVc2UgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cywgJyArICdvciBsb3dlcmNhc2UgZm9yIEhUTUwgZWxlbWVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdzY3JpcHQnKSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgXCJwYXJzZXItaW5zZXJ0ZWRcIiBmbGFnIGlzXG4gICAgICAvLyBzZXQgdG8gdHJ1ZSBhbmQgaXQgZG9lcyBub3QgZXhlY3V0ZVxuICAgICAgdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGRpdi5pbm5lckhUTUwgPSAnPHNjcmlwdD48JyArICcvc2NyaXB0Pic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCBhIHNjcmlwdCBlbGVtZW50LlxuXG4gICAgICB2YXIgZmlyc3RDaGlsZCA9IGRpdi5maXJzdENoaWxkO1xuICAgICAgZG9tRWxlbWVudCA9IGRpdi5yZW1vdmVDaGlsZChmaXJzdENoaWxkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vICRGbG93SXNzdWUgYGNyZWF0ZUVsZW1lbnRgIHNob3VsZCBiZSB1cGRhdGVkIGZvciBXZWIgQ29tcG9uZW50c1xuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlLCB7XG4gICAgICAgIGlzOiBwcm9wcy5pc1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNoIGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjYXVzZSBvZiBhIEZpcmVmb3ggYnVnLlxuICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNjg5NlxuICAgICAgLy8gYW5kIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjI0MFxuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsgLy8gTm9ybWFsbHkgYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgaW4gYHNldEluaXRpYWxET01Qcm9wZXJ0aWVzYCwgaG93ZXZlciB0aGUgYG11bHRpcGxlYCBhbmQgYHNpemVgXG4gICAgICAvLyBhdHRyaWJ1dGVzIG9uIGBzZWxlY3RgcyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgYG9wdGlvbmBzIGFyZSBpbnNlcnRlZC5cbiAgICAgIC8vIFRoaXMgcHJldmVudHM6XG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBkb2VzIG5vdCBzY3JvbGwgdG8gdGhlIGNvcnJlY3Qgb3B0aW9uIGJlY2F1c2Ugc2luZ3VsYXJcbiAgICAgIC8vICBgc2VsZWN0YCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IHBpY2sgdGhlIGZpcnN0IGl0ZW0gIzEzMjIyXG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBzZXQgdGhlIGZpcnN0IGl0ZW0gYXMgc2VsZWN0ZWQgZGVzcGl0ZSB0aGUgYHNpemVgIGF0dHJpYnV0ZSAjMTQyMzlcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMjIyXG4gICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDIzOVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBkb21FbGVtZW50O1xuXG4gICAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAgIG5vZGUubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnNpemUpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGEgc2l6ZSBncmVhdGVyIHRoYW4gMSBjYXVzZXMgYSBzZWxlY3QgdG8gYmVoYXZlIGxpa2UgYG11bHRpcGxlPXRydWVgLCB3aGVyZVxuICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgbm8gb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIGEgc2VsZWN0IGluIFwic2luZ2xlIHNlbGVjdGlvbiBtb2RlXCIuXG4gICAgICAgICAgbm9kZS5zaXplID0gcHJvcHMuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0eXBlKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgaWYgKCFpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9tRWxlbWVudCkgPT09ICdbb2JqZWN0IEhUTUxVbmtub3duRWxlbWVudF0nICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFVua25vd25UYWdzLCB0eXBlKSkge1xuICAgICAgICB3YXJuZWRVbmtub3duVGFnc1t0eXBlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RoZSB0YWcgPCVzPiBpcyB1bnJlY29nbml6ZWQgaW4gdGhpcyBicm93c2VyLiAnICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBSZWFjdCBjb21wb25lbnQsIHN0YXJ0IGl0cyBuYW1lIHdpdGggJyArICdhbiB1cHBlcmNhc2UgbGV0dGVyLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkb21FbGVtZW50O1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG59XG5mdW5jdGlvbiBzZXRJbml0aWFsUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIHJhd1Byb3BzLCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTtcblxuICB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgdmFyIHByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2NhbmNlbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2xvc2UnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICBjYXNlICdlbWJlZCc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgbG9hZCBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGVycm9yIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBlcnJvciBhbmQgbG9hZCBldmVudHMuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCBwcm9wcyk7XG4gIHNldEluaXRpYWxET01Qcm9wZXJ0aWVzKHRhZywgZG9tRWxlbWVudCwgcm9vdENvbnRhaW5lckVsZW1lbnQsIHByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyKGRvbUVsZW1lbnQsIHJhd1Byb3BzLCBmYWxzZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxufSAvLyBDYWxjdWxhdGUgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvIG9iamVjdHMuXG5cbmZ1bmN0aW9uIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcbiAgdmFyIGxhc3RQcm9wcztcbiAgdmFyIG5leHRQcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBsYXN0UHJvcHMgPSBsYXN0UmF3UHJvcHM7XG4gICAgICBuZXh0UHJvcHMgPSBuZXh0UmF3UHJvcHM7XG5cbiAgICAgIGlmICh0eXBlb2YgbGFzdFByb3BzLm9uQ2xpY2sgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG5leHRQcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCBuZXh0UHJvcHMpO1xuICB2YXIgcHJvcEtleTtcbiAgdmFyIHN0eWxlTmFtZTtcbiAgdmFyIHN0eWxlVXBkYXRlcyA9IG51bGw7XG5cbiAgZm9yIChwcm9wS2V5IGluIGxhc3RQcm9wcykge1xuICAgIGlmIChuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgIWxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBsYXN0UHJvcHNbcHJvcEtleV0gPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB2YXIgbGFzdFN0eWxlID0gbGFzdFByb3BzW3Byb3BLZXldO1xuXG4gICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0U3R5bGUpIHtcbiAgICAgICAgaWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MIHx8IHByb3BLZXkgPT09IENISUxEUkVOKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBBVVRPRk9DVVMpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgIC8vIHRoYXQgdGhlIFwiY3VycmVudFwiIGZpYmVyIHBvaW50ZXIgZ2V0cyB1cGRhdGVkIHNvIHdlIG5lZWQgYSBjb21taXRcbiAgICAgIC8vIHRvIHVwZGF0ZSB0aGlzIGVsZW1lbnQuXG4gICAgICBpZiAoIXVwZGF0ZVBheWxvYWQpIHtcbiAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgYWxsIG90aGVyIGRlbGV0ZWQgcHJvcGVydGllcyB3ZSBhZGQgaXQgdG8gdGhlIHF1ZXVlLiBXZSB1c2VcbiAgICAgIC8vIHRoZSBhbGxvd2VkIHByb3BlcnR5IGxpc3QgaW4gdGhlIGNvbW1pdCBwaGFzZSBpbnN0ZWFkLlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAocHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG4gICAgdmFyIGxhc3RQcm9wID0gbGFzdFByb3BzICE9IG51bGwgPyBsYXN0UHJvcHNbcHJvcEtleV0gOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBuZXh0UHJvcCA9PT0gbGFzdFByb3AgfHwgbmV4dFByb3AgPT0gbnVsbCAmJiBsYXN0UHJvcCA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0UHJvcCkge1xuICAgICAgICAvLyBVbnNldCBzdHlsZXMgb24gYGxhc3RQcm9wYCBidXQgbm90IG9uIGBuZXh0UHJvcGAuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RQcm9wKSB7XG4gICAgICAgICAgaWYgKGxhc3RQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgKCFuZXh0UHJvcCB8fCAhbmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkpIHtcbiAgICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgbGFzdFByb3BgLlxuXG5cbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAobmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiBsYXN0UHJvcFtzdHlsZU5hbWVdICE9PSBuZXh0UHJvcFtzdHlsZU5hbWVdKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSBuZXh0UHJvcFtzdHlsZU5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuXG4gICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZC5wdXNoKHByb3BLZXksIHN0eWxlVXBkYXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZVVwZGF0ZXMgPSBuZXh0UHJvcDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgbGFzdEh0bWwgPSBsYXN0UHJvcCA/IGxhc3RQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChsYXN0SHRtbCAhPT0gbmV4dEh0bWwpIHtcbiAgICAgICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbmV4dEh0bWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgLy8gV2UgZWFnZXJseSBsaXN0ZW4gdG8gdGhpcyBldmVuIHRob3VnaCB3ZSBoYXZlbid0IGNvbW1pdHRlZCB5ZXQuXG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkICYmIGxhc3RQcm9wICE9PSBuZXh0UHJvcCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZVxuICAgICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBwcm9wcyBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAgIC8vIHRvIHVwZGF0ZSB0aGlzIGVsZW1lbnQuXG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFueSBvdGhlciBwcm9wZXJ0eSB3ZSBhbHdheXMgYWRkIGl0IHRvIHRoZSBxdWV1ZSBhbmQgdGhlbiB3ZVxuICAgICAgLy8gZmlsdGVyIGl0IG91dCB1c2luZyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGR1cmluZyB0aGUgY29tbWl0LlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAge1xuICAgICAgdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFByb3BzW1NUWUxFXSk7XG4gICAgfVxuXG4gICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKFNUWUxFLCBzdHlsZVVwZGF0ZXMpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMpIHtcbiAgLy8gVXBkYXRlIGNoZWNrZWQgKmJlZm9yZSogbmFtZS5cbiAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiB1cGRhdGUsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY2hlY2tlZC5cbiAgLy8gV2hlbiBhIGNoZWNrZWQgcmFkaW8gdHJpZXMgdG8gY2hhbmdlIG5hbWUsIGJyb3dzZXIgbWFrZXMgYW5vdGhlciByYWRpbydzIGNoZWNrZWQgZmFsc2UuXG4gIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgbmV4dFJhd1Byb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmV4dFJhd1Byb3BzLm5hbWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZUNoZWNrZWQoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB3YXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIGxhc3RSYXdQcm9wcyk7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbmV4dFJhd1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYuXG5cbiAgdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTsgLy8gVE9ETzogRW5zdXJlIHRoYXQgYW4gdXBkYXRlIGdldHMgc2NoZWR1bGVkIGlmIGFueSBvZiB0aGUgc3BlY2lhbCBwcm9wc1xuICAvLyBjaGFuZ2VkLlxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVXBkYXRlIHRoZSB3cmFwcGVyIGFyb3VuZCBpbnB1dHMgKmFmdGVyKiB1cGRhdGluZyBwcm9wcy4gVGhpcyBoYXMgdG9cbiAgICAgIC8vIGhhcHBlbiBhZnRlciBgdXBkYXRlRE9NUHJvcGVydGllc2AuIE90aGVyd2lzZSBIVE1MNSBpbnB1dCB2YWxpZGF0aW9uc1xuICAgICAgLy8gcmFpc2Ugd2FybmluZ3MgYW5kIHByZXZlbnQgdGhlIG5ldyB2YWx1ZSBmcm9tIGJlaW5nIGFzc2lnbmVkLlxuICAgICAgdXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICB1cGRhdGVXcmFwcGVyJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgLy8gcmVjb25jaWxpYXRpb25cbiAgICAgIHBvc3RVcGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wTmFtZSkge1xuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICghcG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV0gfHwgbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckVsZW1lbnQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnO1xuICB2YXIgZXh0cmFBdHRyaWJ1dGVOYW1lcztcblxuICB7XG4gICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcmF3UHJvcHMpO1xuICB9IC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuXG5cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICBjYXNlICdlbWJlZCc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgbG9hZCBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgYWxsIHRoZSBtZWRpYSBldmVudHMuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1tpXSwgZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBlcnJvciBhbmQgbG9hZCBldmVudHMuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSB0b2dnbGUgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCd0b2dnbGUnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIGV4dHJhQXR0cmlidXRlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBkb21FbGVtZW50LmF0dHJpYnV0ZXM7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXR0cmlidXRlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlc1tfaV0ubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkXG4gICAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTA2NzYuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlc1tfaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuXG4gIGZvciAodmFyIHByb3BLZXkgaW4gcmF3UHJvcHMpIHtcbiAgICBpZiAoIXJhd1Byb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSByYXdQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gRm9yIHRleHQgY29udGVudCBjaGlsZHJlbiB3ZSBjb21wYXJlIGFnYWluc3QgdGV4dENvbnRlbnQuIFRoaXNcbiAgICAgIC8vIG1pZ2h0IG1hdGNoIGFkZGl0aW9uYWwgSFRNTCB0aGF0IGlzIGhpZGRlbiB3aGVuIHdlIHJlYWQgaXQgdXNpbmdcbiAgICAgIC8vIHRleHRDb250ZW50LiBFLmcuIFwiZm9vXCIgd2lsbCBtYXRjaCBcImY8c3Bhbj5vbzwvc3Bhbj5cIiBidXQgdGhhdCBzdGlsbFxuICAgICAgLy8gc2F0aXNmaWVzIG91ciByZXF1aXJlbWVudC4gT3VyIHJlcXVpcmVtZW50IGlzIG5vdCB0byBwcm9kdWNlIHBlcmZlY3RcbiAgICAgIC8vIEhUTUwgYW5kIGF0dHJpYnV0ZXMuIElkZWFsbHkgd2Ugc2hvdWxkIHByZXNlcnZlIHN0cnVjdHVyZSBidXQgaXQnc1xuICAgICAgLy8gb2sgbm90IHRvIGlmIHRoZSB2aXNpYmxlIGNvbnRlbnQgaXMgc3RpbGwgZW5vdWdoIHRvIGluZGljYXRlIHdoYXRcbiAgICAgIC8vIGV2ZW4gbGlzdGVuZXJzIHRoZXNlIG5vZGVzIG1pZ2h0IGJlIHdpcmVkIHVwIHRvLlxuICAgICAgLy8gVE9ETzogV2FybiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gYSBzaW5nbGUgdGV4dE5vZGUgYXMgYSBjaGlsZC5cbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSB1c2UgZG9tRWxlbWVudC5maXJzdENoaWxkLm5vZGVWYWx1ZSB0byBjb21wYXJlP1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09IG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCBuZXh0UHJvcF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudC50ZXh0Q29udGVudCAhPT0gJycgKyBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChkb21FbGVtZW50LnRleHRDb250ZW50LCBuZXh0UHJvcCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgJycgKyBuZXh0UHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNob3VsZFdhcm5EZXYgJiYgdHJ1ZSAmJiAvLyBDb252aW5jZSBGbG93IHdlJ3ZlIGNhbGN1bGF0ZWQgaXQgKGl0J3MgREVWLW9ubHkgaW4gdGhpcyBtZXRob2QuKVxuICAgIHR5cGVvZiBpc0N1c3RvbUNvbXBvbmVudFRhZyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBwcm9wZXJ0aWVzIGNvcnJlc3BvbmQgdG8gdGhlaXIgZXhwZWN0ZWQgdmFsdWVzLlxuICAgICAgdmFyIHNlcnZlclZhbHVlID0gdm9pZCAwO1xuICAgICAgdmFyIHByb3BlcnR5SW5mbyA9IGlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgPyBudWxsIDogZ2V0UHJvcGVydHlJbmZvKHByb3BLZXkpO1xuXG4gICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddID09PSB0cnVlKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyB8fCAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgcHJvcEtleSA9PT0gJ3ZhbHVlJyB8fCBwcm9wS2V5ID09PSAnY2hlY2tlZCcgfHwgcHJvcEtleSA9PT0gJ3NlbGVjdGVkJykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgICB2YXIgc2VydmVySFRNTCA9IGRvbUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRIVE1MID0gbm9ybWFsaXplSFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRIVE1MICE9PSBzZXJ2ZXJIVE1MKSB7XG4gICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVySFRNTCwgZXhwZWN0ZWRIVE1MKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTtcblxuICAgICAgICBpZiAoY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZykge1xuICAgICAgICAgIHZhciBleHBlY3RlZFN0eWxlID0gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKG5leHRQcm9wKTtcbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuXG4gICAgICAgICAgaWYgKGV4cGVjdGVkU3R5bGUgIT09IHNlcnZlclZhbHVlKSB7XG4gICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIGV4cGVjdGVkU3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiAhZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3ApO1xuXG4gICAgICAgIGlmIChuZXh0UHJvcCAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghc2hvdWxkSWdub3JlQXR0cmlidXRlKHByb3BLZXksIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpICYmICFzaG91bGRSZW1vdmVBdHRyaWJ1dGUocHJvcEtleSwgbmV4dFByb3AsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgICAgIHZhciBpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIHByb3BlcnR5SW5mbyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIG93bk5hbWVzcGFjZSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICAgICAgICAgIGlmIChvd25OYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICBvd25OYW1lc3BhY2UgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodGFnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3duTmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BLZXkpO1xuXG4gICAgICAgICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBudWxsICYmIHN0YW5kYXJkTmFtZSAhPT0gcHJvcEtleSkge1xuICAgICAgICAgICAgICAvLyBJZiBhbiBTVkcgcHJvcCBpcyBzdXBwbGllZCB3aXRoIGJhZCBjYXNpbmcsIGl0IHdpbGxcbiAgICAgICAgICAgICAgLy8gYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBmcm9tIEhUTUwsIGJ1dCB3aWxsIHByb2R1Y2UgYSBtaXNtYXRjaFxuICAgICAgICAgICAgICAvLyAoYW5kIHdvdWxkIGJlIGluY29ycmVjdGx5IHJlbmRlcmVkIG9uIHRoZSBjbGllbnQpLlxuICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBhbHJlYWR5IHdhcm4gYWJvdXQgYmFkIGNhc2luZyBlbHNld2hlcmUuXG4gICAgICAgICAgICAgIC8vIFNvIHdlJ2xsIHNraXAgdGhlIG1pc2xlYWRpbmcgZXh0cmEgbWlzbWF0Y2ggd2FybmluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICAgIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IHRydWU7IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShzdGFuZGFyZE5hbWUpO1xuICAgICAgICAgICAgfSAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cblxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZG9udFdhcm5DdXN0b21FbGVtZW50ID0gZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCAgO1xuXG4gICAgICAgIGlmICghZG9udFdhcm5DdXN0b21FbGVtZW50ICYmIG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSAmJiAhaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKHNob3VsZFdhcm5EZXYpIHtcbiAgICAgIGlmICggLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5zaXplID4gMCAmJiByYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzKGV4dHJhQXR0cmlidXRlTmFtZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlcihkb21FbGVtZW50LCByYXdQcm9wcywgdHJ1ZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgLy8gRm9yIGlucHV0IGFuZCB0ZXh0YXJlYSB3ZSBjdXJyZW50IGFsd2F5cyBzZXQgdGhlIHZhbHVlIHByb3BlcnR5IGF0XG4gICAgICAvLyBwb3N0IG1vdW50IHRvIGZvcmNlIGl0IHRvIGRpdmVyZ2UgZnJvbSBhdHRyaWJ1dGVzLiBIb3dldmVyLCBmb3JcbiAgICAgIC8vIG9wdGlvbiBhbmQgc2VsZWN0IHdlIGRvbid0IHF1aXRlIGRvIHRoZSBzYW1lIHRoaW5nIGFuZCBzZWxlY3RcbiAgICAgIC8vIGlzIG5vdCByZXNpbGllbnQgdG8gdGhlIERPTSBzdGF0ZSBjaGFuZ2luZyBzbyB3ZSBkb24ndCBkbyB0aGF0IGhlcmUuXG4gICAgICAvLyBUT0RPOiBDb25zaWRlciBub3QgZG9pbmcgdGhpcyBmb3IgaW5wdXQgYW5kIHRleHRhcmVhLlxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHR5cGVvZiByYXdQcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVQYXlsb2FkO1xufVxuZnVuY3Rpb24gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0Tm9kZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB2YXIgaXNEaWZmZXJlbnQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWUgIT09IHRleHQ7XG4gIHJldHVybiBpc0RpZmZlcmVudDtcbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgPCVzPiBpbiA8JXM+LicsIGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIHRoZSB0ZXh0IG5vZGUgXCIlc1wiIGluIDwlcz4uJywgY2hpbGQubm9kZVZhbHVlLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdGFnLCBwcm9wcykge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyA8JXM+IGluIDwlcz4uJywgdGFnLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgICAvLyBXZSBleHBlY3QgdG8gaW5zZXJ0IGVtcHR5IHRleHQgbm9kZXMgc2luY2UgdGhleSdyZSBub3QgcmVwcmVzZW50ZWQgaW5cbiAgICAgIC8vIHRoZSBIVE1MLlxuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgc3BlY2lhbCBjYXNlIGlmIHdlIGNhbiBqdXN0IGF2b2lkIGluc2VydGluZyBlbXB0eVxuICAgICAgLy8gdGV4dCBub2Rlcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIHRleHQgbm9kZSBmb3IgXCIlc1wiIGluIDwlcz4uJywgdGV4dCwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGRvbUVsZW1lbnQsIHRhZywgcHJvcHMpIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKCkge307XG5cbnZhciB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gVGhpcyB2YWxpZGF0aW9uIGNvZGUgd2FzIHdyaXR0ZW4gYmFzZWQgb24gdGhlIEhUTUw1IHBhcnNpbmcgc3BlYzpcbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgLy9cbiAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBjYXRjaCBhbGwgaW52YWxpZCBuZXN0aW5nLCBub3IgZG9lcyBpdCB0cnkgdG8gKGFzIGl0J3NcbiAgLy8gbm90IGNsZWFyIHdoYXQgcHJhY3RpY2FsIGJlbmVmaXQgZG9pbmcgc28gcHJvdmlkZXMpOyBpbnN0ZWFkLCB3ZSB3YXJuIG9ubHlcbiAgLy8gZm9yIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgd2lsbCBnaXZlIGEgcGFyc2UgdHJlZSBkaWZmZXJpbmcgZnJvbSB3aGF0IFJlYWN0XG4gIC8vIGludGVuZGVkLiBGb3IgZXhhbXBsZSwgPGI+PGRpdj48L2Rpdj48L2I+IGlzIGludmFsaWQgYnV0IHdlIGRvbid0IHdhcm5cbiAgLy8gYmVjYXVzZSBpdCBzdGlsbCBwYXJzZXMgY29ycmVjdGx5OyB3ZSBkbyB3YXJuIGZvciBvdGhlciBjYXNlcyBsaWtlIG5lc3RlZFxuICAvLyA8cD4gdGFncyB3aGVyZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBpbXBsaWNpdGx5IGNsb3NlcyB0aGVcbiAgLy8gZmlyc3QsIGNhdXNpbmcgYSBjb25mdXNpbmcgbWVzcy5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG5cbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJywgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlvbi1wb2ludFxuICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3IgPHRpdGxlPiwgaW5jbHVkaW5nIGl0IGhlcmVcbiAgLy8gZXJycyBvbiB0aGUgc2lkZSBvZiBmZXdlciB3YXJuaW5nc1xuICAnZm9yZWlnbk9iamVjdCcsICdkZXNjJywgJ3RpdGxlJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLWJ1dHRvbi1zY29wZVxuXG4gIHZhciBidXR0b25TY29wZVRhZ3MgPSBpblNjb3BlVGFncy5jb25jYXQoWydidXR0b24nXSk7IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2dlbmVyYXRlLWltcGxpZWQtZW5kLXRhZ3NcblxuICB2YXIgaW1wbGllZEVuZFRhZ3MgPSBbJ2RkJywgJ2R0JywgJ2xpJywgJ29wdGlvbicsICdvcHRncm91cCcsICdwJywgJ3JwJywgJ3J0J107XG4gIHZhciBlbXB0eUFuY2VzdG9ySW5mbyA9IHtcbiAgICBjdXJyZW50OiBudWxsLFxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcbiAgICBsaXN0SXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLFxuICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsXG4gIH07XG5cbiAgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcpIHtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gYXNzaWduKHt9LCBvbGRJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvKTtcblxuICAgIHZhciBpbmZvID0ge1xuICAgICAgdGFnOiB0YWdcbiAgICB9O1xuXG4gICAgaWYgKGluU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChidXR0b25TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gbnVsbDtcbiAgICB9IC8vIFNlZSBydWxlcyBmb3IgJ2xpJywgJ2RkJywgJ2R0JyBzdGFydCB0YWdzIGluXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuXG5cbiAgICBpZiAoc3BlY2lhbFRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSAmJiB0YWcgIT09ICdhZGRyZXNzJyAmJiB0YWcgIT09ICdkaXYnICYmIHRhZyAhPT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgIH1cblxuICAgIGFuY2VzdG9ySW5mby5jdXJyZW50ID0gaW5mbztcblxuICAgIGlmICh0YWcgPT09ICdmb3JtJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmZvcm1UYWcgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdhJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYnV0dG9uJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdub2JyJykge1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2xpJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdkZCcgfHwgdGFnID09PSAnZHQnKSB7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNlc3RvckluZm87XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgaXNUYWdWYWxpZFdpdGhQYXJlbnQgPSBmdW5jdGlvbiAodGFnLCBwYXJlbnRUYWcpIHtcbiAgICAvLyBGaXJzdCwgbGV0J3MgY2hlY2sgaWYgd2UncmUgaW4gYW4gdW51c3VhbCBwYXJzaW5nIG1vZGUuLi5cbiAgICBzd2l0Y2ggKHBhcmVudFRhZykge1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluc2VsZWN0XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICdvcHRncm91cCcgfHwgdGFnID09PSAnI3RleHQnO1xuXG4gICAgICBjYXNlICdvcHRncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nLCBzZWVpbmcgYW4gPG9wdGlvbj4gZG9lc24ndCBtZWFuIHdlJ3JlIGluIGEgPHNlbGVjdD5cbiAgICAgIC8vIGJ1dFxuXG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGRcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNhcHRpb25cbiAgICAgIC8vIE5vIHNwZWNpYWwgYmVoYXZpb3Igc2luY2UgdGhlc2UgcnVsZXMgZmFsbCBiYWNrIHRvIFwiaW4gYm9keVwiIG1vZGUgZm9yXG4gICAgICAvLyBhbGwgZXhjZXB0IHNwZWNpYWwgdGFibGUgbm9kZXMgd2hpY2ggY2F1c2UgYmFkIHBhcnNpbmcgYmVoYXZpb3IgYW55d2F5LlxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludHJcblxuICAgICAgY2FzZSAndHInOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndGgnIHx8IHRhZyA9PT0gJ3RkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50Ym9keVxuXG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0cicgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY29sZ3JvdXBcblxuICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY29sJyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50YWJsZVxuXG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjYXB0aW9uJyB8fCB0YWcgPT09ICdjb2xncm91cCcgfHwgdGFnID09PSAndGJvZHknIHx8IHRhZyA9PT0gJ3Rmb290JyB8fCB0YWcgPT09ICd0aGVhZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluaGVhZFxuXG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2Jhc2UnIHx8IHRhZyA9PT0gJ2Jhc2Vmb250JyB8fCB0YWcgPT09ICdiZ3NvdW5kJyB8fCB0YWcgPT09ICdsaW5rJyB8fCB0YWcgPT09ICdtZXRhJyB8fCB0YWcgPT09ICd0aXRsZScgfHwgdGFnID09PSAnbm9zY3JpcHQnIHx8IHRhZyA9PT0gJ25vZnJhbWVzJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3MuaHRtbCN0aGUtaHRtbC1lbGVtZW50XG5cbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaGVhZCcgfHwgdGFnID09PSAnYm9keScgfHwgdGFnID09PSAnZnJhbWVzZXQnO1xuXG4gICAgICBjYXNlICdmcmFtZXNldCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdmcmFtZSc7XG5cbiAgICAgIGNhc2UgJyNkb2N1bWVudCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdodG1sJztcbiAgICB9IC8vIFByb2JhYmx5IGluIHRoZSBcImluIGJvZHlcIiBwYXJzaW5nIG1vZGUsIHNvIHdlIG91dGxhdyBvbmx5IHRhZyBjb21ib3NcbiAgICAvLyB3aGVyZSB0aGUgcGFyc2luZyBydWxlcyBjYXVzZSBpbXBsaWNpdCBvcGVucyBvciBjbG9zZXMgdG8gYmUgYWRkZWQuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuXG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnICE9PSAnaDEnICYmIHBhcmVudFRhZyAhPT0gJ2gyJyAmJiBwYXJlbnRUYWcgIT09ICdoMycgJiYgcGFyZW50VGFnICE9PSAnaDQnICYmIHBhcmVudFRhZyAhPT0gJ2g1JyAmJiBwYXJlbnRUYWcgIT09ICdoNic7XG5cbiAgICAgIGNhc2UgJ3JwJzpcbiAgICAgIGNhc2UgJ3J0JzpcbiAgICAgICAgcmV0dXJuIGltcGxpZWRFbmRUYWdzLmluZGV4T2YocGFyZW50VGFnKSA9PT0gLTE7XG5cbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgY2FzZSAnY2FwdGlvbic6XG4gICAgICBjYXNlICdjb2wnOlxuICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgY2FzZSAnZnJhbWUnOlxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgIGNhc2UgJ3RoJzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgLy8gVGhlc2UgdGFncyBhcmUgb25seSB2YWxpZCB3aXRoIGEgZmV3IHBhcmVudHMgdGhhdCBoYXZlIHNwZWNpYWwgY2hpbGRcbiAgICAgICAgLy8gcGFyc2luZyBydWxlcyAtLSBpZiB3ZSdyZSBkb3duIGhlcmUsIHRoZW4gbm9uZSBvZiB0aG9zZSBtYXRjaGVkIGFuZFxuICAgICAgICAvLyBzbyB3ZSBhbGxvdyBpdCBvbmx5IGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgcGFyZW50IGlzLCBhcyBhbGwgb3RoZXJcbiAgICAgICAgLy8gY2FzZXMgYXJlIGludmFsaWQuXG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgPT0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cblxuXG4gIHZhciBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnID0gZnVuY3Rpb24gKHRhZywgYW5jZXN0b3JJbmZvKSB7XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2FkZHJlc3MnOlxuICAgICAgY2FzZSAnYXJ0aWNsZSc6XG4gICAgICBjYXNlICdhc2lkZSc6XG4gICAgICBjYXNlICdibG9ja3F1b3RlJzpcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBjYXNlICdkaXInOlxuICAgICAgY2FzZSAnZGl2JzpcbiAgICAgIGNhc2UgJ2RsJzpcbiAgICAgIGNhc2UgJ2ZpZWxkc2V0JzpcbiAgICAgIGNhc2UgJ2ZpZ2NhcHRpb24nOlxuICAgICAgY2FzZSAnZmlndXJlJzpcbiAgICAgIGNhc2UgJ2Zvb3Rlcic6XG4gICAgICBjYXNlICdoZWFkZXInOlxuICAgICAgY2FzZSAnaGdyb3VwJzpcbiAgICAgIGNhc2UgJ21haW4nOlxuICAgICAgY2FzZSAnbWVudSc6XG4gICAgICBjYXNlICduYXYnOlxuICAgICAgY2FzZSAnb2wnOlxuICAgICAgY2FzZSAncCc6XG4gICAgICBjYXNlICdzZWN0aW9uJzpcbiAgICAgIGNhc2UgJ3N1bW1hcnknOlxuICAgICAgY2FzZSAndWwnOlxuICAgICAgY2FzZSAncHJlJzpcbiAgICAgIGNhc2UgJ2xpc3RpbmcnOlxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgY2FzZSAnaHInOlxuICAgICAgY2FzZSAneG1wJzpcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZm9ybVRhZyB8fCBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2xpJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdkZCc6XG4gICAgICBjYXNlICdkdCc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIC8vIFNwZWMgc2F5cyBzb21ldGhpbmcgYWJvdXQgc3RvcmluZyBhIGxpc3Qgb2YgbWFya2VycywgYnV0IGl0IHNvdW5kc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoaXMgY2hlY2suXG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ25vYnInOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHZhciBkaWRXYXJuJDEgPSB7fTtcblxuICB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoY2hpbGRUYWcsIGNoaWxkVGV4dCwgYW5jZXN0b3JJbmZvKSB7XG4gICAgYW5jZXN0b3JJbmZvID0gYW5jZXN0b3JJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvO1xuICAgIHZhciBwYXJlbnRJbmZvID0gYW5jZXN0b3JJbmZvLmN1cnJlbnQ7XG4gICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudEluZm8gJiYgcGFyZW50SW5mby50YWc7XG5cbiAgICBpZiAoY2hpbGRUZXh0ICE9IG51bGwpIHtcbiAgICAgIGlmIChjaGlsZFRhZyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3Rpbmc6IHdoZW4gY2hpbGRUZXh0IGlzIHBhc3NlZCwgY2hpbGRUYWcgc2hvdWxkIGJlIG51bGwnKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGRUYWcgPSAnI3RleHQnO1xuICAgIH1cblxuICAgIHZhciBpbnZhbGlkUGFyZW50ID0gaXNUYWdWYWxpZFdpdGhQYXJlbnQoY2hpbGRUYWcsIHBhcmVudFRhZykgPyBudWxsIDogcGFyZW50SW5mbztcbiAgICB2YXIgaW52YWxpZEFuY2VzdG9yID0gaW52YWxpZFBhcmVudCA/IG51bGwgOiBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnKGNoaWxkVGFnLCBhbmNlc3RvckluZm8pO1xuICAgIHZhciBpbnZhbGlkUGFyZW50T3JBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgfHwgaW52YWxpZEFuY2VzdG9yO1xuXG4gICAgaWYgKCFpbnZhbGlkUGFyZW50T3JBbmNlc3Rvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBhbmNlc3RvclRhZyA9IGludmFsaWRQYXJlbnRPckFuY2VzdG9yLnRhZztcbiAgICB2YXIgd2FybktleSA9ICEhaW52YWxpZFBhcmVudCArICd8JyArIGNoaWxkVGFnICsgJ3wnICsgYW5jZXN0b3JUYWc7XG5cbiAgICBpZiAoZGlkV2FybiQxW3dhcm5LZXldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybiQxW3dhcm5LZXldID0gdHJ1ZTtcbiAgICB2YXIgdGFnRGlzcGxheU5hbWUgPSBjaGlsZFRhZztcbiAgICB2YXIgd2hpdGVzcGFjZUluZm8gPSAnJztcblxuICAgIGlmIChjaGlsZFRhZyA9PT0gJyN0ZXh0Jykge1xuICAgICAgaWYgKC9cXFMvLnRlc3QoY2hpbGRUZXh0KSkge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdUZXh0IG5vZGVzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1doaXRlc3BhY2UgdGV4dCBub2Rlcyc7XG4gICAgICAgIHdoaXRlc3BhY2VJbmZvID0gXCIgTWFrZSBzdXJlIHlvdSBkb24ndCBoYXZlIGFueSBleHRyYSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFncyBvbiBcIiArICdlYWNoIGxpbmUgb2YgeW91ciBzb3VyY2UgY29kZS4nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YWdEaXNwbGF5TmFtZSA9ICc8JyArIGNoaWxkVGFnICsgJz4nO1xuICAgIH1cblxuICAgIGlmIChpbnZhbGlkUGFyZW50KSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICBpZiAoYW5jZXN0b3JUYWcgPT09ICd0YWJsZScgJiYgY2hpbGRUYWcgPT09ICd0cicpIHtcbiAgICAgICAgaW5mbyArPSAnIEFkZCBhIDx0Ym9keT4sIDx0aGVhZD4gb3IgPHRmb290PiB0byB5b3VyIGNvZGUgdG8gbWF0Y2ggdGhlIERPTSB0cmVlIGdlbmVyYXRlZCBieSAnICsgJ3RoZSBicm93c2VyLic7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGNoaWxkIG9mIDwlcz4uJXMlcycsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZywgd2hpdGVzcGFjZUluZm8sIGluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBkZXNjZW5kYW50IG9mICcgKyAnPCVzPi4nLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcpO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDEgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBTVVNQRU5TRV9TVEFSVF9EQVRBID0gJyQnO1xudmFyIFNVU1BFTlNFX0VORF9EQVRBID0gJy8kJztcbnZhciBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgPSAnJD8nO1xudmFyIFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgPSAnJCEnO1xudmFyIFNUWUxFJDEgPSAnc3R5bGUnO1xudmFyIGV2ZW50c0VuYWJsZWQgPSBudWxsO1xudmFyIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gbnVsbDtcbmZ1bmN0aW9uIGdldFJvb3RIb3N0Q29udGV4dChyb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgdmFyIHR5cGU7XG4gIHZhciBuYW1lc3BhY2U7XG4gIHZhciBub2RlVHlwZSA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5ub2RlVHlwZTtcblxuICBzd2l0Y2ggKG5vZGVUeXBlKSB7XG4gICAgY2FzZSBET0NVTUVOVF9OT0RFOlxuICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcbiAgICAgIHtcbiAgICAgICAgdHlwZSA9IG5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gJyNkb2N1bWVudCcgOiAnI2ZyYWdtZW50JztcbiAgICAgICAgdmFyIHJvb3QgPSByb290Q29udGFpbmVySW5zdGFuY2UuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBuYW1lc3BhY2UgPSByb290ID8gcm9vdC5uYW1lc3BhY2VVUkkgOiBnZXRDaGlsZE5hbWVzcGFjZShudWxsLCAnJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyByb290Q29udGFpbmVySW5zdGFuY2UucGFyZW50Tm9kZSA6IHJvb3RDb250YWluZXJJbnN0YW5jZTtcbiAgICAgICAgdmFyIG93bk5hbWVzcGFjZSA9IGNvbnRhaW5lci5uYW1lc3BhY2VVUkkgfHwgbnVsbDtcbiAgICAgICAgdHlwZSA9IGNvbnRhaW5lci50YWdOYW1lO1xuICAgICAgICBuYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShvd25OYW1lc3BhY2UsIHR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxuXG4gIHtcbiAgICB2YXIgdmFsaWRhdGVkVGFnID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBhbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKG51bGwsIHZhbGlkYXRlZFRhZyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgYW5jZXN0b3JJbmZvOiBhbmNlc3RvckluZm9cbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZEhvc3RDb250ZXh0KHBhcmVudEhvc3RDb250ZXh0LCB0eXBlLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAge1xuICAgIHZhciBwYXJlbnRIb3N0Q29udGV4dERldiA9IHBhcmVudEhvc3RDb250ZXh0O1xuICAgIHZhciBuYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnRIb3N0Q29udGV4dERldi5uYW1lc3BhY2UsIHR5cGUpO1xuICAgIHZhciBhbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKHBhcmVudEhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgYW5jZXN0b3JJbmZvOiBhbmNlc3RvckluZm9cbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBwcmVwYXJlRm9yQ29tbWl0KGNvbnRhaW5lckluZm8pIHtcbiAgZXZlbnRzRW5hYmxlZCA9IGlzRW5hYmxlZCgpO1xuICBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCk7XG4gIHZhciBhY3RpdmVJbnN0YW5jZSA9IG51bGw7XG5cbiAgc2V0RW5hYmxlZChmYWxzZSk7XG4gIHJldHVybiBhY3RpdmVJbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHJlc2V0QWZ0ZXJDb21taXQoY29udGFpbmVySW5mbykge1xuICByZXN0b3JlU2VsZWN0aW9uKHNlbGVjdGlvbkluZm9ybWF0aW9uKTtcbiAgc2V0RW5hYmxlZChldmVudHNFbmFibGVkKTtcbiAgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHZhciBwYXJlbnROYW1lc3BhY2U7XG5cbiAge1xuICAgIC8vIFRPRE86IHRha2UgbmFtZXNwYWNlIGludG8gYWNjb3VudCB3aGVuIHZhbGlkYXRpbmcuXG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgdmFsaWRhdGVET01OZXN0aW5nKHR5cGUsIG51bGwsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInKSB7XG4gICAgICB2YXIgc3RyaW5nID0gJycgKyBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBvd25BbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgc3RyaW5nLCBvd25BbmNlc3RvckluZm8pO1xuICAgIH1cblxuICAgIHBhcmVudE5hbWVzcGFjZSA9IGhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZTtcbiAgfVxuXG4gIHZhciBkb21FbGVtZW50ID0gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBwYXJlbnROYW1lc3BhY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBkb21FbGVtZW50KTtcbiAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBwcm9wcyk7XG4gIHJldHVybiBkb21FbGVtZW50O1xufVxuZnVuY3Rpb24gYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbihkb21FbGVtZW50LCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICBzZXRJbml0aWFsUHJvcGVydGllcyhkb21FbGVtZW50LCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdidXR0b24nOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJldHVybiAhIXByb3BzLmF1dG9Gb2N1cztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVVcGRhdGUoZG9tRWxlbWVudCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcblxuICAgIGlmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gIT09IHR5cGVvZiBvbGRQcm9wcy5jaGlsZHJlbiAmJiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgbmV3UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIHByb3BzKSB7XG4gIHJldHVybiB0eXBlID09PSAndGV4dGFyZWEnIHx8IHR5cGUgPT09ICdub3NjcmlwdCcgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInIHx8IHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PT0gJ29iamVjdCcgJiYgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT09IG51bGwgJiYgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sICE9IG51bGw7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0SW5zdGFuY2UodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHRleHQsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7XG4gIH1cblxuICB2YXIgdGV4dE5vZGUgPSBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0Tm9kZSk7XG4gIHJldHVybiB0ZXh0Tm9kZTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRFdmVudFByaW9yaXR5KCkge1xuICB2YXIgY3VycmVudEV2ZW50ID0gd2luZG93LmV2ZW50O1xuXG4gIGlmIChjdXJyZW50RXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIHJldHVybiBnZXRFdmVudFByaW9yaXR5KGN1cnJlbnRFdmVudC50eXBlKTtcbn1cbi8vIGlmIGEgY29tcG9uZW50IGp1c3QgaW1wb3J0cyBSZWFjdERPTSAoZS5nLiBmb3IgZmluZERPTU5vZGUpLlxuLy8gU29tZSBlbnZpcm9ubWVudHMgbWlnaHQgbm90IGhhdmUgc2V0VGltZW91dCBvciBjbGVhclRpbWVvdXQuXG5cbnZhciBzY2hlZHVsZVRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgY2FuY2VsVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgbm9UaW1lb3V0ID0gLTE7XG52YXIgbG9jYWxQcm9taXNlID0gdHlwZW9mIFByb21pc2UgPT09ICdmdW5jdGlvbicgPyBQcm9taXNlIDogdW5kZWZpbmVkOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgc2NoZWR1bGVNaWNyb3Rhc2sgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IHR5cGVvZiBsb2NhbFByb21pc2UgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHJldHVybiBsb2NhbFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKGNhbGxiYWNrKS5jYXRjaChoYW5kbGVFcnJvckluTmV4dFRpY2spO1xufSA6IHNjaGVkdWxlVGltZW91dDsgLy8gVE9ETzogRGV0ZXJtaW5lIHRoZSBiZXN0IGZhbGxiYWNrIGhlcmUuXG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9ySW5OZXh0VGljayhlcnJvcikge1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNvbW1pdE1vdW50KGRvbUVsZW1lbnQsIHR5cGUsIG5ld1Byb3BzLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIC8vIERlc3BpdGUgdGhlIG5hbWluZyB0aGF0IG1pZ2h0IGltcGx5IG90aGVyd2lzZSwgdGhpcyBtZXRob2Qgb25seVxuICAvLyBmaXJlcyBpZiB0aGVyZSBpcyBhbiBgVXBkYXRlYCBlZmZlY3Qgc2NoZWR1bGVkIGR1cmluZyBtb3VudGluZy5cbiAgLy8gVGhpcyBoYXBwZW5zIGlmIGBmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbmAgcmV0dXJucyBgdHJ1ZWAgKHdoaWNoIGl0XG4gIC8vIGRvZXMgdG8gaW1wbGVtZW50IHRoZSBgYXV0b0ZvY3VzYCBhdHRyaWJ1dGUgb24gdGhlIGNsaWVudCkuIEJ1dFxuICAvLyB0aGVyZSBhcmUgYWxzbyBvdGhlciBjYXNlcyB3aGVuIHRoaXMgbWlnaHQgaGFwcGVuIChzdWNoIGFzIHBhdGNoaW5nXG4gIC8vIHVwIHRleHQgY29udGVudCBkdXJpbmcgaHlkcmF0aW9uIG1pc21hdGNoKS4gU28gd2UnbGwgY2hlY2sgdGhpcyBhZ2Fpbi5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpZiAobmV3UHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgIGRvbUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKG5ld1Byb3BzLnNyYykge1xuICAgICAgICAgIGRvbUVsZW1lbnQuc3JjID0gbmV3UHJvcHMuc3JjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGUoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIC8vIEFwcGx5IHRoZSBkaWZmIHRvIHRoZSBET00gbm9kZS5cbiAgdXBkYXRlUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpOyAvLyBVcGRhdGUgdGhlIHByb3BzIGhhbmRsZSBzbyB0aGF0IHdlIGtub3cgd2hpY2ggcHJvcHMgYXJlIHRoZSBvbmVzIHdpdGhcbiAgLy8gd2l0aCBjdXJyZW50IGV2ZW50IGhhbmRsZXJzLlxuXG4gIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgbmV3UHJvcHMpO1xufVxuZnVuY3Rpb24gcmVzZXRUZXh0Q29udGVudChkb21FbGVtZW50KSB7XG4gIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsICcnKTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFRleHRVcGRhdGUodGV4dEluc3RhbmNlLCBvbGRUZXh0LCBuZXdUZXh0KSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSBuZXdUZXh0O1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkVG9Db250YWluZXIoY29udGFpbmVyLCBjaGlsZCkge1xuICB2YXIgcGFyZW50Tm9kZTtcblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBwYXJlbnROb2RlID0gY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGNvbnRhaW5lcik7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lcjtcbiAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgfSAvLyBUaGlzIGNvbnRhaW5lciBtaWdodCBiZSB1c2VkIGZvciBhIHBvcnRhbC5cbiAgLy8gSWYgc29tZXRoaW5nIGluc2lkZSBhIHBvcnRhbCBpcyBjbGlja2VkLCB0aGF0IGNsaWNrIHNob3VsZCBidWJibGVcbiAgLy8gdGhyb3VnaCB0aGUgUmVhY3QgdHJlZS4gSG93ZXZlciwgb24gTW9iaWxlIFNhZmFyaSB0aGUgY2xpY2sgd291bGRcbiAgLy8gbmV2ZXIgYnViYmxlIHRocm91Z2ggdGhlICpET00qIHRyZWUgdW5sZXNzIGFuIGFuY2VzdG9yIHdpdGggb25jbGlja1xuICAvLyBldmVudCBleGlzdHMuIFNvIHdlIHdvdWxkbid0IHNlZSBpdCBhbmQgZGlzcGF0Y2ggaXQuXG4gIC8vIFRoaXMgaXMgd2h5IHdlIGVuc3VyZSB0aGF0IG5vbiBSZWFjdCByb290IGNvbnRhaW5lcnMgaGF2ZSBpbmxpbmUgb25jbGlja1xuICAvLyBkZWZpbmVkLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExOTE4XG5cblxuICB2YXIgcmVhY3RSb290Q29udGFpbmVyID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgaWYgKChyZWFjdFJvb3RDb250YWluZXIgPT09IG51bGwgfHwgcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQpICYmIHBhcmVudE5vZGUub25jbGljayA9PT0gbnVsbCkge1xuICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQocGFyZW50Tm9kZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnRJbnN0YW5jZSwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xufVxuZnVuY3Rpb24gaW5zZXJ0SW5Db250YWluZXJCZWZvcmUoY29udGFpbmVyLCBjaGlsZCwgYmVmb3JlQ2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiByZW1vdmVDaGlsZEZyb21Db250YWluZXIoY29udGFpbmVyLCBjaGlsZCkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgfVxufVxuZnVuY3Rpb24gY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KHBhcmVudEluc3RhbmNlLCBzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZTsgLy8gRGVsZXRlIGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICBkbyB7XG4gICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChub2RlKTtcblxuICAgIGlmIChuZXh0Tm9kZSAmJiBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5leHROb2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChuZXh0Tm9kZSk7IC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuICAgICAgICAgIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBuZXh0Tm9kZTtcbiAgfSB3aGlsZSAobm9kZSk7IC8vIFRPRE86IFdhcm4sIHdlIGRpZG4ndCBmaW5kIHRoZSBlbmQgY29tbWVudCBib3VuZGFyeS5cbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG5cbiAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoY29udGFpbmVyLCBzdXNwZW5zZUluc3RhbmNlKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShjb250YWluZXIucGFyZW50Tm9kZSwgc3VzcGVuc2VJbnN0YW5jZSk7XG4gIH0gZWxzZSBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY29udGFpbmVyLCBzdXNwZW5zZUluc3RhbmNlKTtcbiAgfSAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cblxuICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG59XG5mdW5jdGlvbiBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgLy8gVE9ETzogRG9lcyB0aGlzIHdvcmsgZm9yIGFsbCBlbGVtZW50IHR5cGVzPyBXaGF0IGFib3V0IE1hdGhNTD8gU2hvdWxkIHdlXG4gIC8vIHBhc3MgaG9zdCBjb250ZXh0IHRvIHRoaXMgbWV0aG9kP1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGUgPSBpbnN0YW5jZS5zdHlsZTtcblxuICBpZiAodHlwZW9mIHN0eWxlLnNldFByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnbm9uZScsICdpbXBvcnRhbnQnKTtcbiAgfSBlbHNlIHtcbiAgICBzdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG59XG5mdW5jdGlvbiBoaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gJyc7XG59XG5mdW5jdGlvbiB1bmhpZGVJbnN0YW5jZShpbnN0YW5jZSwgcHJvcHMpIHtcbiAgaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgdmFyIHN0eWxlUHJvcCA9IHByb3BzW1NUWUxFJDFdO1xuICB2YXIgZGlzcGxheSA9IHN0eWxlUHJvcCAhPT0gdW5kZWZpbmVkICYmIHN0eWxlUHJvcCAhPT0gbnVsbCAmJiBzdHlsZVByb3AuaGFzT3duUHJvcGVydHkoJ2Rpc3BsYXknKSA/IHN0eWxlUHJvcC5kaXNwbGF5IDogbnVsbDtcbiAgaW5zdGFuY2Uuc3R5bGUuZGlzcGxheSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoJ2Rpc3BsYXknLCBkaXNwbGF5KTtcbn1cbmZ1bmN0aW9uIHVuaGlkZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHQpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IHRleHQ7XG59XG5mdW5jdGlvbiBjbGVhckNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnRleHRDb250ZW50ID0gJyc7XG4gIH0gZWxzZSBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgaWYgKGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIuZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY2FuSHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcykge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgIT09IEVMRU1FTlRfTk9ERSB8fCB0eXBlLnRvTG93ZXJDYXNlKCkgIT09IGluc3RhbmNlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGFuIGVsZW1lbnQgbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UoaW5zdGFuY2UsIHRleHQpIHtcbiAgaWYgKHRleHQgPT09ICcnIHx8IGluc3RhbmNlLm5vZGVUeXBlICE9PSBURVhUX05PREUpIHtcbiAgICAvLyBFbXB0eSBzdHJpbmdzIGFyZSBub3QgcGFyc2VkIGJ5IEhUTUwgc28gdGhlcmUgd29uJ3QgYmUgYSBjb3JyZWN0IG1hdGNoIGhlcmUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHRleHQgbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKGluc3RhbmNlKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgLy8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IHBhcnNlZCBieSBIVE1MIHNvIHRoZXJlIHdvbid0IGJlIGEgY29ycmVjdCBtYXRjaCBoZXJlLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYSBzdXNwZW5zZSBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEE7XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2tFcnJvckRldGFpbHMoaW5zdGFuY2UpIHtcbiAgdmFyIGRhdGFzZXQgPSBpbnN0YW5jZS5uZXh0U2libGluZyAmJiBpbnN0YW5jZS5uZXh0U2libGluZy5kYXRhc2V0O1xuICB2YXIgZGlnZXN0LCBtZXNzYWdlLCBzdGFjaztcblxuICBpZiAoZGF0YXNldCkge1xuICAgIGRpZ2VzdCA9IGRhdGFzZXQuZGdzdDtcblxuICAgIHtcbiAgICAgIG1lc3NhZ2UgPSBkYXRhc2V0Lm1zZztcbiAgICAgIHN0YWNrID0gZGF0YXNldC5zdGNrO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIGRpZ2VzdDogZGlnZXN0LFxuICAgICAgc3RhY2s6IHN0YWNrXG4gICAgfTtcbiAgfSAvLyBsZXQgdmFsdWUgPSB7bWVzc2FnZTogdW5kZWZpbmVkLCBoYXNoOiB1bmRlZmluZWR9O1xuICAvLyBjb25zdCBuZXh0U2libGluZyA9IGluc3RhbmNlLm5leHRTaWJsaW5nO1xuICAvLyBpZiAobmV4dFNpYmxpbmcpIHtcbiAgLy8gICBjb25zdCBkYXRhc2V0ID0gKChuZXh0U2libGluZzogYW55KTogSFRNTFRlbXBsYXRlRWxlbWVudCkuZGF0YXNldDtcbiAgLy8gICB2YWx1ZS5tZXNzYWdlID0gZGF0YXNldC5tc2c7XG4gIC8vICAgdmFsdWUuaGFzaCA9IGRhdGFzZXQuaGFzaDtcbiAgLy8gICBpZiAodHJ1ZSkge1xuICAvLyAgICAgdmFsdWUuc3RhY2sgPSBkYXRhc2V0LnN0YWNrO1xuICAvLyAgIH1cbiAgLy8gfVxuICAvLyByZXR1cm4gdmFsdWU7XG5cbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyU3VzcGVuc2VJbnN0YW5jZVJldHJ5KGluc3RhbmNlLCBjYWxsYmFjaykge1xuICBpbnN0YW5jZS5fcmVhY3RSZXRyeSA9IGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZShub2RlKSB7XG4gIC8vIFNraXAgbm9uLWh5ZHJhdGFibGUgbm9kZXMuXG4gIGZvciAoOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgdmFyIG5vZGVUeXBlID0gbm9kZS5ub2RlVHlwZTtcblxuICAgIGlmIChub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgbm9kZURhdGEgPSBub2RlLmRhdGE7XG5cbiAgICAgIGlmIChub2RlRGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBub2RlRGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBub2RlRGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZURhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKGluc3RhbmNlLm5leHRTaWJsaW5nKTtcbn1cbmZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkKHBhcmVudEluc3RhbmNlKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShwYXJlbnRJbnN0YW5jZS5maXJzdENoaWxkKTtcbn1cbmZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lcikge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50Q29udGFpbmVyLmZpcnN0Q2hpbGQpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShwYXJlbnRJbnN0YW5jZS5uZXh0U2libGluZyk7XG59XG5mdW5jdGlvbiBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGluc3RhbmNlKTsgLy8gVE9ETzogUG9zc2libHkgZGVmZXIgdGhpcyB1bnRpbCB0aGUgY29tbWl0IHBoYXNlIHdoZXJlIGFsbCB0aGUgZXZlbnRzXG4gIC8vIGdldCBhdHRhY2hlZC5cblxuICB1cGRhdGVGaWJlclByb3BzKGluc3RhbmNlLCBwcm9wcyk7XG4gIHZhciBwYXJlbnROYW1lc3BhY2U7XG5cbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHBhcmVudE5hbWVzcGFjZSA9IGhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZTtcbiAgfSAvLyBUT0RPOiBUZW1wb3JhcnkgaGFjayB0byBjaGVjayBpZiB3ZSdyZSBpbiBhIGNvbmN1cnJlbnQgcm9vdC4gV2UgY2FuIGRlbGV0ZVxuICAvLyB3aGVuIHRoZSBsZWdhY3kgcm9vdCBBUEkgaXMgcmVtb3ZlZC5cblxuXG4gIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKGludGVybmFsSW5zdGFuY2VIYW5kbGUubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICByZXR1cm4gZGlmZkh5ZHJhdGVkUHJvcGVydGllcyhpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHRleHRJbnN0YW5jZSk7IC8vIFRPRE86IFRlbXBvcmFyeSBoYWNrIHRvIGNoZWNrIGlmIHdlJ3JlIGluIGEgY29uY3VycmVudCByb290LiBXZSBjYW4gZGVsZXRlXG4gIC8vIHdoZW4gdGhlIGxlZ2FjeSByb290IEFQSSBpcyByZW1vdmVkLlxuXG4gIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKGludGVybmFsSW5zdGFuY2VIYW5kbGUubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICByZXR1cm4gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0SW5zdGFuY2UsIHRleHQpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBzdXNwZW5zZUluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHN1c3BlbnNlSW5zdGFuY2UubmV4dFNpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gIH0gLy8gVE9ETzogV2Fybiwgd2UgZGlkbid0IGZpbmQgdGhlIGVuZCBjb21tZW50IGJvdW5kYXJ5LlxuXG5cbiAgcmV0dXJuIG51bGw7XG59IC8vIFJldHVybnMgdGhlIFN1c3BlbnNlSW5zdGFuY2UgaWYgdGhpcyBub2RlIGlzIGEgZGlyZWN0IGNoaWxkIG9mIGFcbi8vIFN1c3BlbnNlSW5zdGFuY2UuIEkuZS4gaWYgaXRzIHByZXZpb3VzIHNpYmxpbmcgaXMgYSBDb21tZW50IHdpdGhcbi8vIFNVU1BFTlNFX3hfU1RBUlRfREFUQS4gT3RoZXJ3aXNlLCBudWxsLlxuXG5mdW5jdGlvbiBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldEluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gdGFyZ2V0SW5zdGFuY2UucHJldmlvdXNTaWJsaW5nOyAvLyBTa2lwIHBhc3QgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBub2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG4gIHJldHJ5SWZCbG9ja2VkT24oY29udGFpbmVyKTtcbn1cbmZ1bmN0aW9uIGNvbW1pdEh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7XG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cbiAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVVuaHlkcmF0ZWRUYWlsSW5zdGFuY2VzKHBhcmVudFR5cGUpIHtcbiAgcmV0dXJuIHBhcmVudFR5cGUgIT09ICdoZWFkJyAmJiBwYXJlbnRUeXBlICE9PSAnYm9keSc7XG59XG5mdW5jdGlvbiBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHZhciBzaG91bGRXYXJuRGV2ID0gdHJ1ZTtcbiAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHRleHRJbnN0YW5jZS5ub2RlVmFsdWUsIHRleHQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICBpZiAocGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICB2YXIgc2hvdWxkV2FybkRldiA9IHRydWU7XG4gICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHRleHRJbnN0YW5jZS5ub2RlVmFsdWUsIHRleHQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSkge1xuICB7XG4gICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG5cbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnROb2RlLCBpbnN0YW5jZSk7XG4gICAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAge1xuICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0eXBlLCBwcm9wcykge1xuICB7XG4gICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudENvbnRhaW5lciwgdHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdGV4dCkge1xuICB7XG4gICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCB0eXBlLCBwcm9wcykge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuXG4gICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlICE9PSBudWxsKSB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgdGV4dCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuXG4gICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlICE9PSBudWxsKSB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0eXBlLCBwcm9wcywgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgdHlwZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAge1xuICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50SW5zdGFuY2UsIHRleHQpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3JIeWRyYXRpbmdDb250YWluZXIocGFyZW50Q29udGFpbmVyKSB7XG4gIHtcbiAgICAvLyBUT0RPOiBUaGlzIGdldHMgbG9nZ2VkIGJ5IG9uUmVjb3ZlcmFibGVFcnJvciwgdG9vLCBzbyB3ZSBzaG91bGQgYmVcbiAgICAvLyBhYmxlIHRvIHJlbW92ZSBpdC5cbiAgICBlcnJvcignQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbi4gVGhlIHNlcnZlciBIVE1MIHdhcyByZXBsYWNlZCB3aXRoIGNsaWVudCBjb250ZW50IGluIDwlcz4uJywgcGFyZW50Q29udGFpbmVyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlUG9ydGFsTW91bnQocG9ydGFsSW5zdGFuY2UpIHtcbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocG9ydGFsSW5zdGFuY2UpO1xufVxuXG52YXIgcmFuZG9tS2V5ID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG52YXIgaW50ZXJuYWxJbnN0YW5jZUtleSA9ICdfX3JlYWN0RmliZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbFByb3BzS2V5ID0gJ19fcmVhY3RQcm9wcyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXkgPSAnX19yZWFjdENvbnRhaW5lciQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyc0tleSA9ICdfX3JlYWN0RXZlbnRzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXkgPSAnX19yZWFjdExpc3RlbmVycyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVzU2V0S2V5ID0gJ19fcmVhY3RIYW5kbGVzJCcgKyByYW5kb21LZXk7XG5mdW5jdGlvbiBkZXRhY2hEZWxldGVkSW5zdGFuY2Uobm9kZSkge1xuICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uIGhvc3QgY29tcG9uZW50cy4gSSBkb24ndCB0aGluayBhbGwgb2ZcbiAgLy8gdGhlc2UgZmllbGRzIGFyZSByZWxldmFudC5cbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsUHJvcHNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlckxpc3RlbmVyc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVzU2V0S2V5XTtcbn1cbmZ1bmN0aW9uIHByZWNhY2hlRmliZXJOb2RlKGhvc3RJbnN0LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0gPSBob3N0SW5zdDtcbn1cbmZ1bmN0aW9uIG1hcmtDb250YWluZXJBc1Jvb3QoaG9zdFJvb3QsIG5vZGUpIHtcbiAgbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSA9IGhvc3RSb290O1xufVxuZnVuY3Rpb24gdW5tYXJrQ29udGFpbmVyQXNSb290KG5vZGUpIHtcbiAgbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSA9IG51bGw7XG59XG5mdW5jdGlvbiBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChub2RlKSB7XG4gIHJldHVybiAhIW5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG59IC8vIEdpdmVuIGEgRE9NIG5vZGUsIHJldHVybiB0aGUgY2xvc2VzdCBIb3N0Q29tcG9uZW50IG9yIEhvc3RUZXh0IGZpYmVyIGFuY2VzdG9yLlxuLy8gSWYgdGhlIHRhcmdldCBub2RlIGlzIHBhcnQgb2YgYSBoeWRyYXRlZCBvciBub3QgeWV0IHJlbmRlcmVkIHN1YnRyZWUsIHRoZW5cbi8vIHRoaXMgbWF5IGFsc28gcmV0dXJuIGEgU3VzcGVuc2VDb21wb25lbnQgb3IgSG9zdFJvb3QgdG8gaW5kaWNhdGUgdGhhdC5cbi8vIENvbmNlcHR1YWxseSB0aGUgSG9zdFJvb3QgZmliZXIgaXMgYSBjaGlsZCBvZiB0aGUgQ29udGFpbmVyIG5vZGUuIFNvIGlmIHlvdVxuLy8gcGFzcyB0aGUgQ29udGFpbmVyIG5vZGUgYXMgdGhlIHRhcmdldE5vZGUsIHlvdSB3aWxsIG5vdCBhY3R1YWxseSBnZXQgdGhlXG4vLyBIb3N0Um9vdCBiYWNrLiBUbyBnZXQgdG8gdGhlIEhvc3RSb290LCB5b3UgbmVlZCB0byBwYXNzIGEgY2hpbGQgb2YgaXQuXG4vLyBUaGUgc2FtZSB0aGluZyBhcHBsaWVzIHRvIFN1c3BlbnNlIGJvdW5kYXJpZXMuXG5cbmZ1bmN0aW9uIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHRhcmdldE5vZGUpIHtcbiAgdmFyIHRhcmdldEluc3QgPSB0YXJnZXROb2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gIGlmICh0YXJnZXRJbnN0KSB7XG4gICAgLy8gRG9uJ3QgcmV0dXJuIEhvc3RSb290IG9yIFN1c3BlbnNlQ29tcG9uZW50IGhlcmUuXG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH0gLy8gSWYgdGhlIGRpcmVjdCBldmVudCB0YXJnZXQgaXNuJ3QgYSBSZWFjdCBvd25lZCBET00gbm9kZSwgd2UgbmVlZCB0byBsb29rXG4gIC8vIHRvIHNlZSBpZiBvbmUgb2YgaXRzIHBhcmVudHMgaXMgYSBSZWFjdCBvd25lZCBET00gbm9kZS5cblxuXG4gIHZhciBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5wYXJlbnROb2RlO1xuXG4gIHdoaWxlIChwYXJlbnROb2RlKSB7XG4gICAgLy8gV2UnbGwgY2hlY2sgaWYgdGhpcyBpcyBhIGNvbnRhaW5lciByb290IHRoYXQgY291bGQgaW5jbHVkZVxuICAgIC8vIFJlYWN0IG5vZGVzIGluIHRoZSBmdXR1cmUuIFdlIG5lZWQgdG8gY2hlY2sgdGhpcyBmaXJzdCBiZWNhdXNlXG4gICAgLy8gaWYgd2UncmUgYSBjaGlsZCBvZiBhIGRlaHlkcmF0ZWQgY29udGFpbmVyLCB3ZSBuZWVkIHRvIGZpcnN0XG4gICAgLy8gZmluZCB0aGF0IGlubmVyIGNvbnRhaW5lciBiZWZvcmUgbW92aW5nIG9uIHRvIGZpbmRpbmcgdGhlIHBhcmVudFxuICAgIC8vIGluc3RhbmNlLiBOb3RlIHRoYXQgd2UgZG9uJ3QgY2hlY2sgdGhpcyBmaWVsZCBvbiAgdGhlIHRhcmdldE5vZGVcbiAgICAvLyBpdHNlbGYgYmVjYXVzZSB0aGUgZmliZXJzIGFyZSBjb25jZXB0dWFsbHkgYmV0d2VlbiB0aGUgY29udGFpbmVyXG4gICAgLy8gbm9kZSBhbmQgdGhlIGZpcnN0IGNoaWxkLiBJdCBpc24ndCBzdXJyb3VuZGluZyB0aGUgY29udGFpbmVyIG5vZGUuXG4gICAgLy8gSWYgaXQncyBub3QgYSBjb250YWluZXIsIHdlIGNoZWNrIGlmIGl0J3MgYW4gaW5zdGFuY2UuXG4gICAgdGFyZ2V0SW5zdCA9IHBhcmVudE5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gfHwgcGFyZW50Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICAgIGlmICh0YXJnZXRJbnN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIHdhc24ndCB0aGUgZGlyZWN0IHRhcmdldCBvZiB0aGUgZXZlbnQsIHdlIG1pZ2h0IGhhdmVcbiAgICAgIC8vIHN0ZXBwZWQgcGFzdCBkZWh5ZHJhdGVkIERPTSBub2RlcyB0byBnZXQgaGVyZS4gSG93ZXZlciB0aGV5IGNvdWxkXG4gICAgICAvLyBhbHNvIGhhdmUgYmVlbiBub24tUmVhY3Qgbm9kZXMuIFdlIG5lZWQgdG8gYW5zd2VyIHdoaWNoIG9uZS5cbiAgICAgIC8vIElmIHdlIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGhhdmUgYW55IGNoaWxkcmVuLCB0aGVuIHRoZXJlIGNhbid0IGJlXG4gICAgICAvLyBhIG5lc3RlZCBzdXNwZW5zZSBib3VuZGFyeSB3aXRoaW4gaXQuIFNvIHdlIGNhbiB1c2UgdGhpcyBhcyBhIGZhc3RcbiAgICAgIC8vIGJhaWxvdXQuIE1vc3Qgb2YgdGhlIHRpbWUsIHdoZW4gcGVvcGxlIGFkZCBub24tUmVhY3QgY2hpbGRyZW4gdG9cbiAgICAgIC8vIHRoZSB0cmVlLCBpdCBpcyB1c2luZyBhIHJlZiB0byBhIGNoaWxkLWxlc3MgRE9NIG5vZGUuXG4gICAgICAvLyBOb3JtYWxseSB3ZSdkIG9ubHkgbmVlZCB0byBjaGVjayBvbmUgb2YgdGhlIGZpYmVycyBiZWNhdXNlIGlmIGl0XG4gICAgICAvLyBoYXMgZXZlciBnb25lIGZyb20gaGF2aW5nIGNoaWxkcmVuIHRvIGRlbGV0aW5nIHRoZW0gb3IgdmljZSB2ZXJzYVxuICAgICAgLy8gaXQgd291bGQgaGF2ZSBkZWxldGVkIHRoZSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IG5lc3RlZCBpbnNpZGUgYWxyZWFkeS5cbiAgICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHRoZSBIb3N0Um9vdCBzdGFydHMgb3V0IHdpdGggYW4gYWx0ZXJuYXRlIGl0IG1pZ2h0XG4gICAgICAvLyBoYXZlIG9uZSBvbiB0aGUgYWx0ZXJuYXRlIHNvIHdlIG5lZWQgdG8gY2hlY2sgaW4gY2FzZSB0aGlzIHdhcyBhXG4gICAgICAvLyByb290LlxuICAgICAgdmFyIGFsdGVybmF0ZSA9IHRhcmdldEluc3QuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAodGFyZ2V0SW5zdC5jaGlsZCAhPT0gbnVsbCB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgYWx0ZXJuYXRlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIC8vIE5leHQgd2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBub2RlIHRoYXQgc2tpcHBlZCBwYXN0IGlzXG4gICAgICAgIC8vIG5lc3RlZCB3aXRoaW4gYSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFuZCBpZiBzbywgd2hpY2ggb25lLlxuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2UodGFyZ2V0Tm9kZSk7XG5cbiAgICAgICAgd2hpbGUgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBmb3VuZCBhIHN1c3BlbnNlIGluc3RhbmNlLiBUaGF0IG1lYW5zIHRoYXQgd2UgaGF2ZW4ndFxuICAgICAgICAgIC8vIGh5ZHJhdGVkIGl0IHlldC4gRXZlbiB0aG91Z2ggd2UgbGVhdmUgdGhlIGNvbW1lbnRzIGluIHRoZVxuICAgICAgICAgIC8vIERPTSBhZnRlciBoeWRyYXRpbmcsIGFuZCB0aGVyZSBhcmUgYm91bmRhcmllcyBpbiB0aGUgRE9NXG4gICAgICAgICAgLy8gdGhhdCBjb3VsZCBhbHJlYWR5IGJlIGh5ZHJhdGVkLCB3ZSB3b3VsZG4ndCBoYXZlIGZvdW5kIHRoZW1cbiAgICAgICAgICAvLyB0aHJvdWdoIHRoaXMgcGFzcyBzaW5jZSBpZiB0aGUgdGFyZ2V0IGlzIGh5ZHJhdGVkIGl0IHdvdWxkXG4gICAgICAgICAgLy8gaGF2ZSBoYWQgYW4gaW50ZXJuYWxJbnN0YW5jZUtleSBvbiBpdC5cbiAgICAgICAgICAvLyBMZXQncyBnZXQgdGhlIGZpYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgU3VzcGVuc2VDb21wb25lbnRcbiAgICAgICAgICAvLyBhcyB0aGUgZGVlcGVzdCBpbnN0YW5jZS5cbiAgICAgICAgICB2YXIgdGFyZ2V0U3VzcGVuc2VJbnN0ID0gc3VzcGVuc2VJbnN0YW5jZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICAgICAgICAgIGlmICh0YXJnZXRTdXNwZW5zZUluc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRTdXNwZW5zZUluc3Q7XG4gICAgICAgICAgfSAvLyBJZiB3ZSBkb24ndCBmaW5kIGEgRmliZXIgb24gdGhlIGNvbW1lbnQsIGl0IG1pZ2h0IGJlIGJlY2F1c2VcbiAgICAgICAgICAvLyB3ZSBoYXZlbid0IGdvdHRlbiB0byBoeWRyYXRlIGl0IHlldC4gVGhlcmUgbWlnaHQgc3RpbGwgYmUgYVxuICAgICAgICAgIC8vIHBhcmVudCBib3VuZGFyeSB0aGF0IGhhc24ndCBhYm92ZSB0aGlzIG9uZSBzbyB3ZSBuZWVkIHRvIGZpbmRcbiAgICAgICAgICAvLyB0aGUgb3V0ZXIgbW9zdCB0aGF0IGlzIGtub3duLlxuXG5cbiAgICAgICAgICBzdXNwZW5zZUluc3RhbmNlID0gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTsgLy8gSWYgd2UgZG9uJ3QgZmluZCBvbmUsIHRoZW4gdGhhdCBzaG91bGQgbWVhbiB0aGF0IHRoZSBwYXJlbnRcbiAgICAgICAgICAvLyBob3N0IGNvbXBvbmVudCBhbHNvIGhhc24ndCBoeWRyYXRlZCB5ZXQuIFdlIGNhbiByZXR1cm4gaXRcbiAgICAgICAgICAvLyBiZWxvdyBzaW5jZSBpdCB3aWxsIGJhaWwgb3V0IG9uIHRoZSBpc01vdW50ZWQgY2hlY2sgbGF0ZXIuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gICAgfVxuXG4gICAgdGFyZ2V0Tm9kZSA9IHBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIFJlYWN0RE9NQ29tcG9uZW50IG9yIFJlYWN0RE9NVGV4dENvbXBvbmVudFxuICogaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIG5vZGUgd2FzIG5vdCByZW5kZXJlZCBieSB0aGlzIFJlYWN0LlxuICovXG5cbmZ1bmN0aW9uIGdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkge1xuICB2YXIgaW5zdCA9IG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0gfHwgbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XTtcblxuICBpZiAoaW5zdCkge1xuICAgIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQgfHwgaW5zdC50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50IHx8IGluc3QudGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgcmV0dXJuIGluc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBHaXZlbiBhIFJlYWN0RE9NQ29tcG9uZW50IG9yIFJlYWN0RE9NVGV4dENvbXBvbmVudCwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBET00gbm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXROb2RlRnJvbUluc3RhbmNlKGluc3QpIHtcbiAgaWYgKGluc3QudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGluc3QudGFnID09PSBIb3N0VGV4dCkge1xuICAgIC8vIEluIEZpYmVyIHRoaXMsIGlzIGp1c3QgdGhlIHN0YXRlIG5vZGUgcmlnaHQgbm93LiBXZSBhc3N1bWUgaXQgd2lsbCBiZVxuICAgIC8vIGEgaG9zdCBjb21wb25lbnQgb3IgaG9zdCB0ZXh0LlxuICAgIHJldHVybiBpbnN0LnN0YXRlTm9kZTtcbiAgfSAvLyBXaXRob3V0IHRoaXMgZmlyc3QgaW52YXJpYW50LCBwYXNzaW5nIGEgbm9uLURPTS1jb21wb25lbnQgdHJpZ2dlcnMgdGhlIG5leHRcbiAgLy8gaW52YXJpYW50IGZvciBhIG1pc3NpbmcgcGFyZW50LCB3aGljaCBpcyBzdXBlciBjb25mdXNpbmcuXG5cblxuICB0aHJvdyBuZXcgRXJyb3IoJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJyk7XG59XG5mdW5jdGlvbiBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGVbaW50ZXJuYWxQcm9wc0tleV0gfHwgbnVsbDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUZpYmVyUHJvcHMobm9kZSwgcHJvcHMpIHtcbiAgbm9kZVtpbnRlcm5hbFByb3BzS2V5XSA9IHByb3BzO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRMaXN0ZW5lclNldChub2RlKSB7XG4gIHZhciBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV07XG5cbiAgaWYgKGVsZW1lbnRMaXN0ZW5lclNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZWxlbWVudExpc3RlbmVyU2V0ID0gbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldID0gbmV3IFNldCgpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRMaXN0ZW5lclNldDtcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsdWVTdGFjayA9IFtdO1xudmFyIGZpYmVyU3RhY2s7XG5cbntcbiAgZmliZXJTdGFjayA9IFtdO1xufVxuXG52YXIgaW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY3JlYXRlQ3Vyc29yKGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGN1cnJlbnQ6IGRlZmF1bHRWYWx1ZVxuICB9O1xufVxuXG5mdW5jdGlvbiBwb3AoY3Vyc29yLCBmaWJlcikge1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcG9wLicpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBpZiAoZmliZXIgIT09IGZpYmVyU3RhY2tbaW5kZXhdKSB7XG4gICAgICBlcnJvcignVW5leHBlY3RlZCBGaWJlciBwb3BwZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZVN0YWNrW2luZGV4XTtcbiAgdmFsdWVTdGFja1tpbmRleF0gPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IG51bGw7XG4gIH1cblxuICBpbmRleC0tO1xufVxuXG5mdW5jdGlvbiBwdXNoKGN1cnNvciwgdmFsdWUsIGZpYmVyKSB7XG4gIGluZGV4Kys7XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gY3Vyc29yLmN1cnJlbnQ7XG5cbiAge1xuICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gZmliZXI7XG4gIH1cblxuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlO1xufVxuXG52YXIgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0O1xuXG57XG4gIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dCA9IHt9O1xufVxuXG52YXIgZW1wdHlDb250ZXh0T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eUNvbnRleHRPYmplY3QpO1xufSAvLyBBIGN1cnNvciB0byB0aGUgY3VycmVudCBtZXJnZWQgY29udGV4dCBvYmplY3Qgb24gdGhlIHN0YWNrLlxuXG5cbnZhciBjb250ZXh0U3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZW1wdHlDb250ZXh0T2JqZWN0KTsgLy8gQSBjdXJzb3IgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29udGV4dCBoYXMgY2hhbmdlZC5cblxudmFyIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZmFsc2UpOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBjb250ZXh0IG9iamVjdCB0aGF0IHdhcyBvbiB0aGUgc3RhY2suXG4vLyBXZSB1c2UgdGhpcyB0byBnZXQgYWNjZXNzIHRvIHRoZSBwYXJlbnQgY29udGV4dCBhZnRlciB3ZSBoYXZlIGFscmVhZHlcbi8vIHB1c2hlZCB0aGUgbmV4dCBjb250ZXh0IHByb3ZpZGVyLCBhbmQgbm93IG5lZWQgdG8gbWVyZ2UgdGhlaXIgY29udGV4dHMuXG5cbnZhciBwcmV2aW91c0NvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbmZ1bmN0aW9uIGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIpIHtcbiAge1xuICAgIGlmIChkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIgJiYgaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgLy8gSWYgdGhlIGZpYmVyIGlzIGEgY29udGV4dCBwcm92aWRlciBpdHNlbGYsIHdoZW4gd2UgcmVhZCBpdHMgY29udGV4dFxuICAgICAgLy8gd2UgbWF5IGhhdmUgYWxyZWFkeSBwdXNoZWQgaXRzIG93biBjaGlsZCBjb250ZXh0IG9uIHRoZSBzdGFjay4gQSBjb250ZXh0XG4gICAgICAvLyBwcm92aWRlciBzaG91bGQgbm90IFwic2VlXCIgaXRzIG93biBjaGlsZCBjb250ZXh0LiBUaGVyZWZvcmUgd2UgcmVhZCB0aGVcbiAgICAgIC8vIHByZXZpb3VzIChwYXJlbnQpIGNvbnRleHQgaW5zdGVhZCBmb3IgYSBjb250ZXh0IHByb3ZpZGVyLlxuICAgICAgcmV0dXJuIHByZXZpb3VzQ29udGV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIG1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID0gdW5tYXNrZWRDb250ZXh0O1xuICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0ID0gbWFza2VkQ29udGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gdHlwZS5jb250ZXh0VHlwZXM7XG5cbiAgICBpZiAoIWNvbnRleHRUeXBlcykge1xuICAgICAgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICB9IC8vIEF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIHVubWFza2VkIGNvbnRleHQgaGFzIGNoYW5nZWQuXG4gICAgLy8gRmFpbGluZyB0byBkbyB0aGlzIHdpbGwgcmVzdWx0IGluIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuXG4gICAgLy8gVGhpcyBtYXkgdHJpZ2dlciBpbmZpbml0ZSBsb29wcyBpZiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGNhbGxzIHNldFN0YXRlLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9PT0gdW5tYXNrZWRDb250ZXh0KSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBjb250ZXh0VHlwZXMpIHtcbiAgICAgIGNvbnRleHRba2V5XSA9IHVubWFza2VkQ29udGV4dFtrZXldO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ1Vua25vd24nO1xuICAgICAgY2hlY2tQcm9wVHlwZXMoY29udGV4dFR5cGVzLCBjb250ZXh0LCAnY29udGV4dCcsIG5hbWUpO1xuICAgIH0gLy8gQ2FjaGUgdW5tYXNrZWQgY29udGV4dCBzbyB3ZSBjYW4gYXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgbmVjZXNzYXJ5LlxuICAgIC8vIENvbnRleHQgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIGNsYXNzIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgc28gY2hlY2sgZm9yIGluc3RhbmNlLlxuXG5cbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNDb250ZXh0Q2hhbmdlZCgpIHtcbiAge1xuICAgIHJldHVybiBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIodHlwZSkge1xuICB7XG4gICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlcztcbiAgICByZXR1cm4gY2hpbGRDb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY2hpbGRDb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BDb250ZXh0KGZpYmVyKSB7XG4gIHtcbiAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BUb3BMZXZlbENvbnRleHRPYmplY3QoZmliZXIpIHtcbiAge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3QoZmliZXIsIGNvbnRleHQsIGRpZENoYW5nZSkge1xuICB7XG4gICAgaWYgKGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50ICE9PSBlbXB0eUNvbnRleHRPYmplY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBjb250ZXh0IGZvdW5kIG9uIHN0YWNrLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIGNvbnRleHQsIGZpYmVyKTtcbiAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NDaGlsZENvbnRleHQoZmliZXIsIHR5cGUsIHBhcmVudENvbnRleHQpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB0eXBlLmNoaWxkQ29udGV4dFR5cGVzOyAvLyBUT0RPIChidmF1Z2huKSBSZXBsYWNlIHRoaXMgYmVoYXZpb3Igd2l0aCBhbiBpbnZhcmlhbnQoKSBpbiB0aGUgZnV0dXJlLlxuICAgIC8vIEl0IGhhcyBvbmx5IGJlZW4gYWRkZWQgaW4gRmliZXIgdG8gbWF0Y2ggdGhlICh1bmludGVudGlvbmFsKSBiZWhhdmlvciBpbiBTdGFjay5cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuXG4gICAgICAgIGlmICghd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0W2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgICAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0W2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCclcy5jaGlsZENvbnRleHRUeXBlcyBpcyBzcGVjaWZpZWQgYnV0IHRoZXJlIGlzIG5vIGdldENoaWxkQ29udGV4dCgpIG1ldGhvZCAnICsgJ29uIHRoZSBpbnN0YW5jZS4gWW91IGNhbiBlaXRoZXIgZGVmaW5lIGdldENoaWxkQ29udGV4dCgpIG9uICVzIG9yIHJlbW92ZSAnICsgJ2NoaWxkQ29udGV4dFR5cGVzIGZyb20gaXQuJywgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcmVudENvbnRleHQ7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkQ29udGV4dCA9IGluc3RhbmNlLmdldENoaWxkQ29udGV4dCgpO1xuXG4gICAgZm9yICh2YXIgY29udGV4dEtleSBpbiBjaGlsZENvbnRleHQpIHtcbiAgICAgIGlmICghKGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0VHlwZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nKSArIFwiLmdldENoaWxkQ29udGV4dCgpOiBrZXkgXFxcIlwiICsgY29udGV4dEtleSArIFwiXFxcIiBpcyBub3QgZGVmaW5lZCBpbiBjaGlsZENvbnRleHRUeXBlcy5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0LCAnY2hpbGQgY29udGV4dCcsIG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBhc3NpZ24oe30sIHBhcmVudENvbnRleHQsIGNoaWxkQ29udGV4dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcykge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOyAvLyBXZSBwdXNoIHRoZSBjb250ZXh0IGFzIGVhcmx5IGFzIHBvc3NpYmxlIHRvIGVuc3VyZSBzdGFjayBpbnRlZ3JpdHkuXG4gICAgLy8gSWYgdGhlIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0IHlldCwgd2Ugd2lsbCBwdXNoIG51bGwgYXQgZmlyc3QsXG4gICAgLy8gYW5kIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIGxhdGVyIHdoZW4gaW52YWxpZGF0aW5nIHRoZSBjb250ZXh0LlxuXG4gICAgdmFyIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0ID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgfHwgZW1wdHlDb250ZXh0T2JqZWN0OyAvLyBSZW1lbWJlciB0aGUgcGFyZW50IGNvbnRleHQgc28gd2UgY2FuIG1lcmdlIHdpdGggaXQgbGF0ZXIuXG4gICAgLy8gSW5oZXJpdCB0aGUgcGFyZW50J3MgZGlkLXBlcmZvcm0td29yayB2YWx1ZSB0byBhdm9pZCBpbmFkdmVydGVudGx5IGJsb2NraW5nIHVwZGF0ZXMuXG5cbiAgICBwcmV2aW91c0NvbnRleHQgPSBjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudDtcbiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgbWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIHR5cGUsIGRpZENoYW5nZSkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBoYXZlIGFuIGluc3RhbmNlIGJ5IHRoaXMgcG9pbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoZGlkQ2hhbmdlKSB7XG4gICAgICAvLyBNZXJnZSBwYXJlbnQgYW5kIG93biBjb250ZXh0LlxuICAgICAgLy8gU2tpcCB0aGlzIGlmIHdlJ3JlIG5vdCB1cGRhdGluZyBkdWUgdG8gc0NVLlxuICAgICAgLy8gVGhpcyBhdm9pZHMgdW5uZWNlc3NhcmlseSByZWNvbXB1dGluZyBtZW1vaXplZCB2YWx1ZXMuXG4gICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IHByb2Nlc3NDaGlsZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHR5cGUsIHByZXZpb3VzQ29udGV4dCk7XG4gICAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IG1lcmdlZENvbnRleHQ7IC8vIFJlcGxhY2UgdGhlIG9sZCAob3IgZW1wdHkpIGNvbnRleHQgd2l0aCB0aGUgbmV3IG9uZS5cbiAgICAgIC8vIEl0IGlzIGltcG9ydGFudCB0byB1bndpbmQgdGhlIGNvbnRleHQgaW4gdGhlIHJldmVyc2Ugb3JkZXIuXG5cbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7IC8vIE5vdyBwdXNoIHRoZSBuZXcgY29udGV4dCBhbmQgbWFyayB0aGF0IGl0IGhhcyBjaGFuZ2VkLlxuXG4gICAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgbWVyZ2VkQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIHdvcmtJblByb2dyZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50VW5tYXNrZWRDb250ZXh0KGZpYmVyKSB7XG4gIHtcbiAgICAvLyBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IHVzZWQgd2l0aCByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjsgbm90IHN1cmUgaWYgaXRcbiAgICAvLyBtYWtlcyBzZW5zZSBlbHNld2hlcmVcbiAgICBpZiAoIWlzRmliZXJNb3VudGVkKGZpYmVyKSB8fCBmaWJlci50YWcgIT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHN1YnRyZWUgcGFyZW50IHRvIGJlIGEgbW91bnRlZCBjbGFzcyBjb21wb25lbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgZG8ge1xuICAgICAgc3dpdGNoIChub2RlLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5jb250ZXh0O1xuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIENvbXBvbmVudCA9IG5vZGUudHlwZTtcblxuICAgICAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlICE9PSBudWxsKTtcblxuICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgdW5leHBlY3RlZCBkZXRhY2hlZCBzdWJ0cmVlIHBhcmVudC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbnZhciBMZWdhY3lSb290ID0gMDtcbnZhciBDb25jdXJyZW50Um9vdCA9IDE7XG5cbnZhciBzeW5jUXVldWUgPSBudWxsO1xudmFyIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IGZhbHNlO1xudmFyIGlzRmx1c2hpbmdTeW5jUXVldWUgPSBmYWxzZTtcbmZ1bmN0aW9uIHNjaGVkdWxlU3luY0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIC8vIFB1c2ggdGhpcyBjYWxsYmFjayBpbnRvIGFuIGludGVybmFsIHF1ZXVlLiBXZSdsbCBmbHVzaCB0aGVzZSBlaXRoZXIgaW5cbiAgLy8gdGhlIG5leHQgdGljaywgb3IgZWFybGllciBpZiBzb21ldGhpbmcgY2FsbHMgYGZsdXNoU3luY0NhbGxiYWNrUXVldWVgLlxuICBpZiAoc3luY1F1ZXVlID09PSBudWxsKSB7XG4gICAgc3luY1F1ZXVlID0gW2NhbGxiYWNrXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQdXNoIG9udG8gZXhpc3RpbmcgcXVldWUuIERvbid0IG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFjayBiZWNhdXNlXG4gICAgLy8gd2UgYWxyZWFkeSBzY2hlZHVsZWQgb25lIHdoZW4gd2UgY3JlYXRlZCB0aGUgcXVldWUuXG4gICAgc3luY1F1ZXVlLnB1c2goY2FsbGJhY2spO1xuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUxlZ2FjeVN5bmNDYWxsYmFjayhjYWxsYmFjaykge1xuICBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSB0cnVlO1xuICBzY2hlZHVsZVN5bmNDYWxsYmFjayhjYWxsYmFjayk7XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCkge1xuICAvLyBPbmx5IGZsdXNoZXMgdGhlIHF1ZXVlIGlmIHRoZXJlJ3MgYSBsZWdhY3kgc3luYyBjYWxsYmFjayBzY2hlZHVsZWQuXG4gIC8vIFRPRE86IFRoZXJlJ3Mgb25seSBhIHNpbmdsZSB0eXBlIG9mIGNhbGxiYWNrOiBwZXJmb3JtU3luY09uV29ya09uUm9vdC4gU29cbiAgLy8gaXQgbWlnaHQgbWFrZSBtb3JlIHNlbnNlIGZvciB0aGUgcXVldWUgdG8gYmUgYSBsaXN0IG9mIHJvb3RzIGluc3RlYWQgb2YgYVxuICAvLyBsaXN0IG9mIGdlbmVyaWMgY2FsbGJhY2tzLiBUaGVuIHdlIGNhbiBoYXZlIHR3bzogb25lIGZvciBsZWdhY3kgcm9vdHMsIG9uZVxuICAvLyBmb3IgY29uY3VycmVudCByb290cy4gQW5kIHRoaXMgbWV0aG9kIHdvdWxkIG9ubHkgZmx1c2ggdGhlIGxlZ2FjeSBvbmVzLlxuICBpZiAoaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzKSB7XG4gICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoU3luY0NhbGxiYWNrcygpIHtcbiAgaWYgKCFpc0ZsdXNoaW5nU3luY1F1ZXVlICYmIHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFByZXZlbnQgcmUtZW50cmFuY2UuXG4gICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IHRydWU7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBwcmV2aW91c1VwZGF0ZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIGlzU3luYyA9IHRydWU7XG4gICAgICB2YXIgcXVldWUgPSBzeW5jUXVldWU7IC8vIFRPRE86IElzIHRoaXMgbmVjZXNzYXJ5IGFueW1vcmU/IFRoZSBvbmx5IHVzZXIgY29kZSB0aGF0IHJ1bnMgaW4gdGhpc1xuICAgICAgLy8gcXVldWUgaXMgaW4gdGhlIHJlbmRlciBvciBjb21taXQgcGhhc2VzLlxuXG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcblxuICAgICAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayhpc1N5bmMpO1xuICAgICAgICB9IHdoaWxlIChjYWxsYmFjayAhPT0gbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHN5bmNRdWV1ZSA9IG51bGw7XG4gICAgICBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgc29tZXRoaW5nIHRocm93cywgbGVhdmUgdGhlIHJlbWFpbmluZyBjYWxsYmFja3Mgb24gdGhlIHF1ZXVlLlxuICAgICAgaWYgKHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICBzeW5jUXVldWUgPSBzeW5jUXVldWUuc2xpY2UoaSArIDEpO1xuICAgICAgfSAvLyBSZXN1bWUgZmx1c2hpbmcgaW4gdGhlIG5leHQgdGlja1xuXG5cbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2soSW1tZWRpYXRlUHJpb3JpdHksIGZsdXNoU3luY0NhbGxiYWNrcyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzVXBkYXRlUHJpb3JpdHkpO1xuICAgICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBUT0RPOiBVc2UgdGhlIHVuaWZpZWQgZmliZXIgc3RhY2sgbW9kdWxlIGluc3RlYWQgb2YgdGhpcyBsb2NhbCBvbmU/XG4vLyBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBpdCB5ZXQgdG8gZGVyaXNrIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uLCBiZWNhdXNlXG4vLyB0aGUgd2F5IHdlIHB1c2gvcG9wIHRoZXNlIHZhbHVlcyBpcyBhIGJpdCB1bnVzdWFsLiBJZiB0aGVyZSdzIGEgbWlzdGFrZSwgSSdkXG4vLyByYXRoZXIgdGhlIGlkcyBiZSB3cm9uZyB0aGFuIGNyYXNoIHRoZSB3aG9sZSByZWNvbmNpbGVyLlxudmFyIGZvcmtTdGFjayA9IFtdO1xudmFyIGZvcmtTdGFja0luZGV4ID0gMDtcbnZhciB0cmVlRm9ya1Byb3ZpZGVyID0gbnVsbDtcbnZhciB0cmVlRm9ya0NvdW50ID0gMDtcbnZhciBpZFN0YWNrID0gW107XG52YXIgaWRTdGFja0luZGV4ID0gMDtcbnZhciB0cmVlQ29udGV4dFByb3ZpZGVyID0gbnVsbDtcbnZhciB0cmVlQ29udGV4dElkID0gMTtcbnZhciB0cmVlQ29udGV4dE92ZXJmbG93ID0gJyc7XG5mdW5jdGlvbiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICByZXR1cm4gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9ya2VkKSAhPT0gTm9GbGFncztcbn1cbmZ1bmN0aW9uIGdldEZvcmtzQXRMZXZlbCh3b3JrSW5Qcm9ncmVzcykge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgcmV0dXJuIHRyZWVGb3JrQ291bnQ7XG59XG5mdW5jdGlvbiBnZXRUcmVlSWQoKSB7XG4gIHZhciBvdmVyZmxvdyA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIHZhciBpZFdpdGhMZWFkaW5nQml0ID0gdHJlZUNvbnRleHRJZDtcbiAgdmFyIGlkID0gaWRXaXRoTGVhZGluZ0JpdCAmIH5nZXRMZWFkaW5nQml0KGlkV2l0aExlYWRpbmdCaXQpO1xuICByZXR1cm4gaWQudG9TdHJpbmcoMzIpICsgb3ZlcmZsb3c7XG59XG5mdW5jdGlvbiBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4pIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYWZ0ZXIgd2UgcmVjb25jaWxlIGFuIGFycmF5IChvciBpdGVyYXRvcikgb2YgY2hpbGRcbiAgLy8gZmliZXJzLCBiZWNhdXNlIHRoYXQncyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBrbm93IGhvdyBtYW55IGNoaWxkcmVuIGluXG4gIC8vIHRoZSB3aG9sZSBzZXQgd2l0aG91dCBkb2luZyBleHRyYSB3b3JrIGxhdGVyLCBvciBzdG9yaW5nIGFkZHRpb25hbFxuICAvLyBpbmZvcm1hdGlvbiBvbiB0aGUgZmliZXIuXG4gIC8vXG4gIC8vIFRoYXQncyB3aHkgdGhpcyBmdW5jdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIHB1c2hUcmVlSWQg4oCUIGl0J3MgY2FsbGVkIGR1cmluZ1xuICAvLyB0aGUgcmVuZGVyIHBoYXNlIG9mIHRoZSBmb3JrIHBhcmVudCwgbm90IHRoZSBjaGlsZCwgd2hpY2ggaXMgd2hlcmUgd2UgcHVzaFxuICAvLyB0aGUgb3RoZXIgY29udGV4dCB2YWx1ZXMuXG4gIC8vXG4gIC8vIEluIHRoZSBGaXp6IGltcGxlbWVudGF0aW9uIHRoaXMgaXMgbXVjaCBzaW1wbGVyIGJlY2F1c2UgdGhlIGNoaWxkIGlzXG4gIC8vIHJlbmRlcmVkIGluIHRoZSBzYW1lIGNhbGxzdGFjayBhcyB0aGUgcGFyZW50LlxuICAvL1xuICAvLyBJdCBtaWdodCBiZSBiZXR0ZXIgdG8ganVzdCBhZGQgYSBgZm9ya3NgIGZpZWxkIHRvIHRoZSBGaWJlciB0eXBlLiBJdCB3b3VsZFxuICAvLyBtYWtlIHRoaXMgbW9kdWxlIHNpbXBsZXIuXG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXgrK10gPSB0cmVlRm9ya0NvdW50O1xuICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXgrK10gPSB0cmVlRm9ya1Byb3ZpZGVyO1xuICB0cmVlRm9ya1Byb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIHRyZWVGb3JrQ291bnQgPSB0b3RhbENoaWxkcmVuO1xufVxuZnVuY3Rpb24gcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbiwgaW5kZXgpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gIHRyZWVDb250ZXh0UHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIGJhc2VJZFdpdGhMZWFkaW5nQml0ID0gdHJlZUNvbnRleHRJZDtcbiAgdmFyIGJhc2VPdmVyZmxvdyA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7IC8vIFRoZSBsZWZ0bW9zdCAxIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLCBub24taW5jbHVzaXZlLiBJdCdzIG5vdCBwYXJ0XG4gIC8vIG9mIHRoZSBpZDsgd2UgdXNlIGl0IHRvIGFjY291bnQgZm9yIGxlYWRpbmcgMHMuXG5cbiAgdmFyIGJhc2VMZW5ndGggPSBnZXRCaXRMZW5ndGgoYmFzZUlkV2l0aExlYWRpbmdCaXQpIC0gMTtcbiAgdmFyIGJhc2VJZCA9IGJhc2VJZFdpdGhMZWFkaW5nQml0ICYgfigxIDw8IGJhc2VMZW5ndGgpO1xuICB2YXIgc2xvdCA9IGluZGV4ICsgMTtcbiAgdmFyIGxlbmd0aCA9IGdldEJpdExlbmd0aCh0b3RhbENoaWxkcmVuKSArIGJhc2VMZW5ndGg7IC8vIDMwIGlzIHRoZSBtYXggbGVuZ3RoIHdlIGNhbiBzdG9yZSB3aXRob3V0IG92ZXJmbG93aW5nLCB0YWtpbmcgaW50b1xuICAvLyBjb25zaWRlcmF0aW9uIHRoZSBsZWFkaW5nIDEgd2UgdXNlIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuXG5cbiAgaWYgKGxlbmd0aCA+IDMwKSB7XG4gICAgLy8gV2Ugb3ZlcmZsb3dlZCB0aGUgYml0d2lzZS1zYWZlIHJhbmdlLiBGYWxsIGJhY2sgdG8gc2xvd2VyIGFsZ29yaXRobS5cbiAgICAvLyBUaGlzIGJyYW5jaCBhc3N1bWVzIHRoZSBsZW5ndGggb2YgdGhlIGJhc2UgaWQgaXMgZ3JlYXRlciB0aGFuIDU7IGl0IHdvbid0XG4gICAgLy8gd29yayBmb3Igc21hbGxlciBpZHMsIGJlY2F1c2UgeW91IG5lZWQgNSBiaXRzIHBlciBjaGFyYWN0ZXIuXG4gICAgLy9cbiAgICAvLyBXZSBlbmNvZGUgdGhlIGlkIGluIG11bHRpcGxlIHN0ZXBzOiBmaXJzdCB0aGUgYmFzZSBpZCwgdGhlbiB0aGVcbiAgICAvLyByZW1haW5pbmcgZGlnaXRzLlxuICAgIC8vXG4gICAgLy8gRWFjaCA1IGJpdCBzZXF1ZW5jZSBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBiYXNlIDMyIGNoYXJhY3Rlci4gU28gZm9yXG4gICAgLy8gZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQgaWQgaXMgMjMgYml0cyBsb25nLCB3ZSBjYW4gY29udmVydCAyMCBvZiB0aG9zZVxuICAgIC8vIGJpdHMgaW50byBhIHN0cmluZyBvZiA0IGNoYXJhY3RlcnMsIHdpdGggMyBiaXRzIGxlZnQgb3Zlci5cbiAgICAvL1xuICAgIC8vIEZpcnN0IGNhbGN1bGF0ZSBob3cgbWFueSBiaXRzIGluIHRoZSBiYXNlIGlkIHJlcHJlc2VudCBhIGNvbXBsZXRlXG4gICAgLy8gc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy5cbiAgICB2YXIgbnVtYmVyT2ZPdmVyZmxvd0JpdHMgPSBiYXNlTGVuZ3RoIC0gYmFzZUxlbmd0aCAlIDU7IC8vIFRoZW4gY3JlYXRlIGEgYml0bWFzayB0aGF0IHNlbGVjdHMgb25seSB0aG9zZSBiaXRzLlxuXG4gICAgdmFyIG5ld092ZXJmbG93Qml0cyA9ICgxIDw8IG51bWJlck9mT3ZlcmZsb3dCaXRzKSAtIDE7IC8vIFNlbGVjdCB0aGUgYml0cywgYW5kIGNvbnZlcnQgdGhlbSB0byBhIGJhc2UgMzIgc3RyaW5nLlxuXG4gICAgdmFyIG5ld092ZXJmbG93ID0gKGJhc2VJZCAmIG5ld092ZXJmbG93Qml0cykudG9TdHJpbmcoMzIpOyAvLyBOb3cgd2UgY2FuIHJlbW92ZSB0aG9zZSBiaXRzIGZyb20gdGhlIGJhc2UgaWQuXG5cbiAgICB2YXIgcmVzdE9mQmFzZUlkID0gYmFzZUlkID4+IG51bWJlck9mT3ZlcmZsb3dCaXRzO1xuICAgIHZhciByZXN0T2ZCYXNlTGVuZ3RoID0gYmFzZUxlbmd0aCAtIG51bWJlck9mT3ZlcmZsb3dCaXRzOyAvLyBGaW5hbGx5LCBlbmNvZGUgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgdXNpbmcgdGhlIG5vcm1hbCBhbGdvcml0aG0uIEJlY2F1c2VcbiAgICAvLyB3ZSBtYWRlIG1vcmUgcm9vbSwgdGhpcyB0aW1lIGl0IHdvbid0IG92ZXJmbG93LlxuXG4gICAgdmFyIHJlc3RPZkxlbmd0aCA9IGdldEJpdExlbmd0aCh0b3RhbENoaWxkcmVuKSArIHJlc3RPZkJhc2VMZW5ndGg7XG4gICAgdmFyIHJlc3RPZk5ld0JpdHMgPSBzbG90IDw8IHJlc3RPZkJhc2VMZW5ndGg7XG4gICAgdmFyIGlkID0gcmVzdE9mTmV3Qml0cyB8IHJlc3RPZkJhc2VJZDtcbiAgICB2YXIgb3ZlcmZsb3cgPSBuZXdPdmVyZmxvdyArIGJhc2VPdmVyZmxvdztcbiAgICB0cmVlQ29udGV4dElkID0gMSA8PCByZXN0T2ZMZW5ndGggfCBpZDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gb3ZlcmZsb3c7XG4gIH0gZWxzZSB7XG4gICAgLy8gTm9ybWFsIHBhdGhcbiAgICB2YXIgbmV3Qml0cyA9IHNsb3QgPDwgYmFzZUxlbmd0aDtcblxuICAgIHZhciBfaWQgPSBuZXdCaXRzIHwgYmFzZUlkO1xuXG4gICAgdmFyIF9vdmVyZmxvdyA9IGJhc2VPdmVyZmxvdztcbiAgICB0cmVlQ29udGV4dElkID0gMSA8PCBsZW5ndGggfCBfaWQ7XG4gICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IF9vdmVyZmxvdztcbiAgfVxufVxuZnVuY3Rpb24gcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcykge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTsgLy8gVGhpcyBjb21wb25lbnQgbWF0ZXJpYWxpemVkIGFuIGlkLiBUaGlzIHdpbGwgYWZmZWN0IGFueSBpZHMgdGhhdCBhcHBlYXJcbiAgLy8gaW4gaXRzIGNoaWxkcmVuLlxuXG4gIHZhciByZXR1cm5GaWJlciA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IDE7XG4gICAgdmFyIHNsb3RJbmRleCA9IDA7XG4gICAgcHVzaFRyZWVGb3JrKHdvcmtJblByb2dyZXNzLCBudW1iZXJPZkZvcmtzKTtcbiAgICBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCBudW1iZXJPZkZvcmtzLCBzbG90SW5kZXgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEJpdExlbmd0aChudW1iZXIpIHtcbiAgcmV0dXJuIDMyIC0gY2x6MzIobnVtYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGVhZGluZ0JpdChpZCkge1xuICByZXR1cm4gMSA8PCBnZXRCaXRMZW5ndGgoaWQpIC0gMTtcbn1cblxuZnVuY3Rpb24gcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gUmVzdG9yZSB0aGUgcHJldmlvdXMgdmFsdWVzLlxuICAvLyBUaGlzIGlzIGEgYml0IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBvdGhlciBjb250ZXh0LWxpa2UgbW9kdWxlcyBpbiBGaWJlclxuICAvLyBiZWNhdXNlIHRoZSBzYW1lIEZpYmVyIG1heSBhcHBlYXIgb24gdGhlIHN0YWNrIG11bHRpcGxlIHRpbWVzIGFuZCBmb3JcbiAgLy8gZGlmZmVyZW50IHJlYXNvbnMuIFdlIGhhdmUgdG8ga2VlcCBwb3BwaW5nIHVudGlsIHRoZSB3b3JrLWluLXByb2dyZXNzIGlzXG4gIC8vIG5vIGxvbmdlciBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzID09PSB0cmVlRm9ya1Byb3ZpZGVyKSB7XG4gICAgdHJlZUZvcmtQcm92aWRlciA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XTtcbiAgICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlRm9ya0NvdW50ID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdO1xuICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsO1xuICB9XG5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzID09PSB0cmVlQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgdHJlZUNvbnRleHRQcm92aWRlciA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdO1xuICAgIGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGw7XG4gICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdO1xuICAgIGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGw7XG4gICAgdHJlZUNvbnRleHRJZCA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdO1xuICAgIGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFN1c3BlbmRlZFRyZWVDb250ZXh0KCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcblxuICBpZiAodHJlZUNvbnRleHRQcm92aWRlciAhPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdHJlZUNvbnRleHRJZCxcbiAgICAgIG92ZXJmbG93OiB0cmVlQ29udGV4dE92ZXJmbG93XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5kZWRDb250ZXh0KSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0SWQ7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dFByb3ZpZGVyO1xuICB0cmVlQ29udGV4dElkID0gc3VzcGVuZGVkQ29udGV4dC5pZDtcbiAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IHN1c3BlbmRlZENvbnRleHQub3ZlcmZsb3c7XG4gIHRyZWVDb250ZXh0UHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbn1cblxuZnVuY3Rpb24gd2FybklmTm90SHlkcmF0aW5nKCkge1xuICB7XG4gICAgaWYgKCFnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gYmUgaHlkcmF0aW5nLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSAnICsgJ2FuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIG1heSBoYXZlIGJlZW4gYW4gaW5zZXJ0aW9uIG9yIGEgaHlkcmF0aW9uLlxuXG52YXIgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsO1xudmFyIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xudmFyIGlzSHlkcmF0aW5nID0gZmFsc2U7IC8vIFRoaXMgZmxhZyBhbGxvd3MgZm9yIHdhcm5pbmcgc3VwcmVzc2lvbiB3aGVuIHdlIGV4cGVjdCB0aGVyZSB0byBiZSBtaXNtYXRjaGVzXG4vLyBkdWUgdG8gZWFybGllciBtaXNtYXRjaGVzIG9yIGEgc3VzcGVuZGVkIGZpYmVyLlxuXG52YXIgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTsgLy8gSHlkcmF0aW9uIGVycm9ycyB0aGF0IHdlcmUgdGhyb3duIGluc2lkZSB0aGlzIGJvdW5kYXJ5XG5cbnZhciBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuXG5mdW5jdGlvbiB3YXJuSWZIeWRyYXRpbmcoKSB7XG4gIHtcbiAgICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICAgIGVycm9yKCdXZSBzaG91bGQgbm90IGJlIGh5ZHJhdGluZyBoZXJlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhIGJ1Zy4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKSB7XG4gIHtcbiAgICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZFN1c3BlbmRPckVycm9yV2hpbGVIeWRyYXRpbmdERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gZGlkU3VzcGVuZE9yRXJyb3JERVY7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW50ZXJIeWRyYXRpb25TdGF0ZShmaWJlcikge1xuXG4gIHZhciBwYXJlbnRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5Db250YWluZXIocGFyZW50SW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWVudGVySHlkcmF0aW9uU3RhdGVGcm9tRGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIsIHN1c3BlbnNlSW5zdGFuY2UsIHRyZWVDb250ZXh0KSB7XG5cbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlO1xuXG4gIGlmICh0cmVlQ29udGV4dCAhPT0gbnVsbCkge1xuICAgIHJlc3RvcmVTdXNwZW5kZWRUcmVlQ29udGV4dChmaWJlciwgdHJlZUNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihyZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbywgaW5zdGFuY2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgICAgICAgICBkaWROb3RIeWRyYXRlSW5zdGFuY2UocmV0dXJuRmliZXIudHlwZSwgcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcywgcmV0dXJuRmliZXIuc3RhdGVOb2RlLCBpbnN0YW5jZSwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSByZXR1cm5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIGlmIChzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkLCBpbnN0YW5jZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVsZXRlSHlkcmF0YWJsZUluc3RhbmNlKHJldHVybkZpYmVyLCBpbnN0YW5jZSkge1xuICB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBpbnN0YW5jZSk7XG4gIHZhciBjaGlsZFRvRGVsZXRlID0gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKTtcbiAgY2hpbGRUb0RlbGV0ZS5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgY2hpbGRUb0RlbGV0ZS5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2NoaWxkVG9EZWxldGVdO1xuICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRpb25zLnB1c2goY2hpbGRUb0RlbGV0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZGlkU3VzcGVuZE9yRXJyb3JERVYpIHtcbiAgICAgIC8vIEluc2lkZSBhIGJvdW5kYXJ5IHRoYXQgYWxyZWFkeSBzdXNwZW5kZWQuIFdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgdGhlXG4gICAgICAvLyBzaWJsaW5ncyBvZiBhIHN1c3BlbmRlZCBub2RlLiBUaGUgbWlzbWF0Y2ggbWF5IGJlIGR1ZSB0byB0aGUgbWlzc2luZ1xuICAgICAgLy8gZGF0YSwgc28gaXQncyBwcm9iYWJseSBhIGZhbHNlIHBvc2l0aXZlLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIHR5cGUgPSBmaWJlci50eXBlO1xuICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0eXBlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHZhciB0ZXh0ID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICB2YXIgcGFyZW50SW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIF90eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgICB2YXIgX3Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICAgIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgX3R5cGUsIF9wcm9wcywgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIF90ZXh0ID0gZmliZXIucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgICAgICAgICAgdmFyIF9pc0NvbmN1cnJlbnRNb2RlID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICAgICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgX3RleHQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICAgICAgX2lzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gcmV0dXJuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgX3BhcmVudEluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuICAgICAgICAgIGlmIChfcGFyZW50SW5zdGFuY2UgIT09IG51bGwpIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciBfdHlwZTIgPSBmaWJlci50eXBlO1xuICAgICAgICAgICAgICB2YXIgX3Byb3BzMiA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UoX3BhcmVudEluc3RhbmNlLCBfdHlwZTIpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIF90ZXh0MiA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKF9wYXJlbnRJbnN0YW5jZSwgX3RleHQyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpIHtcbiAgZmliZXIuZmxhZ3MgPSBmaWJlci5mbGFncyAmIH5IeWRyYXRpbmcgfCBQbGFjZW1lbnQ7XG4gIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkge1xuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSBmaWJlci50eXBlO1xuICAgICAgICB2YXIgcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGNhbkh5ZHJhdGVJbnN0YW5jZShuZXh0SW5zdGFuY2UsIHR5cGUpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkKGluc3RhbmNlKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0ZXh0ID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShuZXh0SW5zdGFuY2UsIHRleHQpO1xuXG4gICAgICAgIGlmICh0ZXh0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSB0ZXh0SW5zdGFuY2U7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjsgLy8gVGV4dCBJbnN0YW5jZXMgZG9uJ3QgaGF2ZSBjaGlsZHJlbiBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gaHlkcmF0ZS5cblxuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShuZXh0SW5zdGFuY2UpO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB7XG4gICAgICAgICAgICBkZWh5ZHJhdGVkOiBzdXNwZW5zZUluc3RhbmNlLFxuICAgICAgICAgICAgdHJlZUNvbnRleHQ6IGdldFN1c3BlbmRlZFRyZWVDb250ZXh0KCksXG4gICAgICAgICAgICByZXRyeUxhbmU6IE9mZnNjcmVlbkxhbmVcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZpYmVyLm1lbW9pemVkU3RhdGUgPSBzdXNwZW5zZVN0YXRlOyAvLyBTdG9yZSB0aGUgZGVoeWRyYXRlZCBmcmFnbWVudCBhcyBhIGNoaWxkIGZpYmVyLlxuICAgICAgICAgIC8vIFRoaXMgc2ltcGxpZmllcyB0aGUgY29kZSBmb3IgZ2V0SG9zdFNpYmxpbmcgYW5kIGRlbGV0aW5nIG5vZGVzLFxuICAgICAgICAgIC8vIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSB0byBjb25zaWRlciBhbGwgU3VzcGVuc2UgYm91bmRhcmllcyBhbmRcbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGV5J3JlIGRlaHlkcmF0ZWQgb25lcyBvciBub3QuXG5cbiAgICAgICAgICB2YXIgZGVoeWRyYXRlZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICAgIGRlaHlkcmF0ZWRGcmFnbWVudC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgICAgICBmaWJlci5jaGlsZCA9IGRlaHlkcmF0ZWRGcmFnbWVudDtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOyAvLyBXaGlsZSBhIFN1c3BlbnNlIEluc3RhbmNlIGRvZXMgaGF2ZSBjaGlsZHJlbiwgd2Ugd29uJ3Qgc3RlcCBpbnRvXG4gICAgICAgICAgLy8gaXQgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLiBJbnN0ZWFkLCB3ZSdsbCByZWVudGVyIGl0IGxhdGVyLlxuXG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpIHtcbiAgcmV0dXJuIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUgJiYgKGZpYmVyLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3M7XG59XG5cbmZ1bmN0aW9uIHRocm93T25IeWRyYXRpb25NaXNtYXRjaChmaWJlcikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0h5ZHJhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgaW5pdGlhbCBVSSBkb2VzIG5vdCBtYXRjaCB3aGF0IHdhcyAnICsgJ3JlbmRlcmVkIG9uIHRoZSBzZXJ2ZXIuJyk7XG59XG5cbmZ1bmN0aW9uIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKGZpYmVyKSB7XG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICBpZiAoIW5leHRJbnN0YW5jZSkge1xuICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgIH0gLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cblxuXG4gICAgaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSA9IG5leHRJbnN0YW5jZTtcblxuICBpZiAoIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTtcbiAgICB9IC8vIElmIHdlIGNhbid0IGh5ZHJhdGUgdGhpcyBpbnN0YW5jZSBsZXQncyB0cnkgdGhlIG5leHQgb25lLlxuICAgIC8vIFdlIHVzZSB0aGlzIGFzIGEgaGV1cmlzdGljLiBJdCdzIGJhc2VkIG9uIGludHVpdGlvbiBhbmQgbm90IGRhdGEgc28gaXRcbiAgICAvLyBtaWdodCBiZSBmbGF3ZWQgb3IgdW5uZWNlc3NhcnkuXG5cblxuICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhmaXJzdEF0dGVtcHRlZEluc3RhbmNlKTtcbiAgICB2YXIgcHJldkh5ZHJhdGlvblBhcmVudEZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG5cbiAgICBpZiAoIW5leHRJbnN0YW5jZSB8fCAhdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgICAgLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cbiAgICAgIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2UgbWF0Y2hlZCB0aGUgbmV4dCBvbmUsIHdlJ2xsIG5vdyBhc3N1bWUgdGhhdCB0aGUgZmlyc3Qgb25lIHdhc1xuICAgIC8vIHN1cGVyZmx1b3VzIGFuZCB3ZSdsbCBkZWxldGUgaXQuIFNpbmNlIHdlIGNhbid0IGVhZ2VybHkgZGVsZXRlIGl0XG4gICAgLy8gd2UnbGwgaGF2ZSB0byBzY2hlZHVsZSBhIGRlbGV0aW9uLiBUbyBkbyB0aGF0LCB0aGlzIG5vZGUgbmVlZHMgYSBkdW1teVxuICAgIC8vIGZpYmVyIGFzc29jaWF0ZWQgd2l0aCBpdC5cblxuXG4gICAgZGVsZXRlSHlkcmF0YWJsZUluc3RhbmNlKHByZXZIeWRyYXRpb25QYXJlbnRGaWJlciwgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZShmaWJlciwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuXG4gIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIHNob3VsZFdhcm5JZk1pc21hdGNoRGV2ID0gIWRpZFN1c3BlbmRPckVycm9yREVWO1xuICB2YXIgdXBkYXRlUGF5bG9hZCA9IGh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgZmliZXIsIHNob3VsZFdhcm5JZk1pc21hdGNoRGV2KTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgZmliZXIudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkOyAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmVcbiAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuXG5cbiAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgdGV4dEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgdGV4dENvbnRlbnQgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICB2YXIgc2hvdWxkVXBkYXRlID0gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCBmaWJlcik7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlIGlzIGNhbGxlZCBpbiBhIGNvbnRleHQgd2hlcmUgdGhlXG4gICAgLy8gaHlkcmF0aW9uIHBhcmVudCBpcyB0aGUgcGFyZW50IGhvc3QgY29tcG9uZW50IG9mIHRoaXMgaG9zdCB0ZXh0LlxuICAgIHZhciByZXR1cm5GaWJlciA9IGh5ZHJhdGlvblBhcmVudEZpYmVyO1xuXG4gICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICB2YXIgcGFyZW50SW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIHZhciBfaXNDb25jdXJyZW50TW9kZTIgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgIF9pc0NvbmN1cnJlbnRNb2RlMik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RTdXNwZW5zZUluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUgIT09IG51bGwgPyBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgOiBudWxsO1xuXG4gIGlmICghc3VzcGVuc2VJbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICBoeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCAmJiBwYXJlbnQudGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIHBhcmVudC50YWcgIT09IEhvc3RSb290ICYmIHBhcmVudC50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gcGFyZW50O1xufVxuXG5mdW5jdGlvbiBwb3BIeWRyYXRpb25TdGF0ZShmaWJlcikge1xuXG4gIGlmIChmaWJlciAhPT0gaHlkcmF0aW9uUGFyZW50RmliZXIpIHtcbiAgICAvLyBXZSdyZSBkZWVwZXIgdGhhbiB0aGUgY3VycmVudCBoeWRyYXRpb24gY29udGV4dCwgaW5zaWRlIGFuIGluc2VydGVkXG4gICAgLy8gdHJlZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgLy8gSWYgd2UncmUgbm90IGN1cnJlbnRseSBoeWRyYXRpbmcgYnV0IHdlJ3JlIGluIGEgaHlkcmF0aW9uIGNvbnRleHQsIHRoZW5cbiAgICAvLyB3ZSB3ZXJlIGFuIGluc2VydGlvbiBhbmQgbm93IG5lZWQgdG8gcG9wIHVwIHJlZW50ZXIgaHlkcmF0aW9uIG9mIG91clxuICAgIC8vIHNpYmxpbmdzLlxuICAgIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuICAgIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbnkgcmVtYWluaW5nIGh5ZHJhdGFibGUgbm9kZXMsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZW0gbm93LlxuICAvLyBXZSBvbmx5IGRvIHRoaXMgZGVlcGVyIHRoYW4gaGVhZCBhbmQgYm9keSBzaW5jZSB0aGV5IHRlbmQgdG8gaGF2ZSByYW5kb21cbiAgLy8gb3RoZXIgbm9kZXMgaW4gdGhlbS4gV2UgYWxzbyBpZ25vcmUgY29tcG9uZW50cyB3aXRoIHB1cmUgdGV4dCBjb250ZW50IGluXG4gIC8vIHNpZGUgb2YgdGhlbS4gV2UgYWxzbyBkb24ndCBkZWxldGUgYW55dGhpbmcgaW5zaWRlIHRoZSByb290IGNvbnRhaW5lci5cblxuXG4gIGlmIChmaWJlci50YWcgIT09IEhvc3RSb290ICYmIChmaWJlci50YWcgIT09IEhvc3RDb21wb25lbnQgfHwgc2hvdWxkRGVsZXRlVW5oeWRyYXRlZFRhaWxJbnN0YW5jZXMoZmliZXIudHlwZSkgJiYgIXNob3VsZFNldFRleHRDb250ZW50KGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMpKSkge1xuICAgIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gICAgaWYgKG5leHRJbnN0YW5jZSkge1xuICAgICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICAgIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMoZmliZXIpO1xuICAgICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdoaWxlIChuZXh0SW5zdGFuY2UpIHtcbiAgICAgICAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIsIG5leHRJbnN0YW5jZSk7XG4gICAgICAgICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5leHRJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcblxuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gaHlkcmF0aW9uUGFyZW50RmliZXIgPyBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmliZXIuc3RhdGVOb2RlKSA6IG51bGw7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGFzVW5oeWRyYXRlZFRhaWxOb2RlcygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nICYmIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMoZmliZXIpIHtcbiAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgd2hpbGUgKG5leHRJbnN0YW5jZSkge1xuICAgIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UoZmliZXIsIG5leHRJbnN0YW5jZSk7XG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5leHRJbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRIeWRyYXRpb25TdGF0ZSgpIHtcblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpIHtcbiAgaWYgKGh5ZHJhdGlvbkVycm9ycyAhPT0gbnVsbCkge1xuICAgIC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYSBmb3JjZWQgY2xpZW50IHJlbmRlci4gVGhlIGVycm9ycyB0aGF0IG9jY3VycmVkXG4gICAgLy8gZHVyaW5nIHRoZSBoeWRyYXRpb24gYXR0ZW1wdCBhcmUgbm93IHJlY292ZXJlZC4gV2Ugd2lsbCBsb2cgdGhlbSBpblxuICAgIC8vIGNvbW1pdCBwaGFzZSwgb25jZSB0aGUgZW50aXJlIHRyZWUgaGFzIGZpbmlzaGVkLlxuICAgIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoaHlkcmF0aW9uRXJyb3JzKTtcbiAgICBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElzSHlkcmF0aW5nKCkge1xuICByZXR1cm4gaXNIeWRyYXRpbmc7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSHlkcmF0aW9uRXJyb3IoZXJyb3IpIHtcbiAgaWYgKGh5ZHJhdGlvbkVycm9ycyA9PT0gbnVsbCkge1xuICAgIGh5ZHJhdGlvbkVycm9ycyA9IFtlcnJvcl07XG4gIH0gZWxzZSB7XG4gICAgaHlkcmF0aW9uRXJyb3JzLnB1c2goZXJyb3IpO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7XG52YXIgTm9UcmFuc2l0aW9uID0gbnVsbDtcbmZ1bmN0aW9uIHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpIHtcbiAgcmV0dXJuIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbjtcbn1cblxudmFyIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzID0ge1xuICByZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fSxcbiAgcmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LFxuICBmbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nOiBmdW5jdGlvbiAoKSB7fSxcbiAgZGlzY2FyZFBlbmRpbmdXYXJuaW5nczogZnVuY3Rpb24gKCkge31cbn07XG5cbntcbiAgdmFyIGZpbmRTdHJpY3RSb290ID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgdmFyIG1heWJlU3RyaWN0Um9vdCA9IG51bGw7XG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBtYXliZVN0cmljdFJvb3QgPSBub2RlO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heWJlU3RyaWN0Um9vdDtcbiAgfTtcblxuICB2YXIgc2V0VG9Tb3J0ZWRTdHJpbmcgPSBmdW5jdGlvbiAoc2V0KSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBhcnJheS5wdXNoKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJyYXkuc29ydCgpLmpvaW4oJywgJyk7XG4gIH07XG5cbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107IC8vIFRyYWNrcyBjb21wb25lbnRzIHdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQuXG5cbiAgdmFyIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMgPSBuZXcgU2V0KCk7XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7XG4gICAgLy8gRGVkdXBlIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cbiAgICBpZiAoZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5oYXMoZmliZXIudHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cy5cbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFdlIGRvIGFuIGluaXRpYWwgcGFzcyB0byBnYXRoZXIgY29tcG9uZW50IG5hbWVzXG4gICAgdmFyIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9IC8vIEZpbmFsbHksIHdlIGZsdXNoIGFsbCB0aGUgd2FybmluZ3NcbiAgICAvLyBVTlNBRkVfIG9uZXMgYmVmb3JlIHRoZSBkZXByZWNhdGVkIG9uZXMsIHNpbmNlIHRoZXknbGwgYmUgJ2xvdWRlcidcblxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkIGFuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIHNvcnRlZE5hbWVzKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgXCIqIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIFwiICsgJ3JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMyID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzMik7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMyA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbE1vdW50IGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbE1vdW50IHRvIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczMpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXM0ID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCByZWZhY3RvciB5b3VyIFwiICsgJ2NvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXM0KTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNSA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxVcGRhdGUgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFVwZGF0ZSB0byBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCk7IC8vIFRyYWNrcyBjb21wb25lbnRzIHdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQuXG5cbiAgdmFyIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQgPSBuZXcgU2V0KCk7XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7XG4gICAgdmFyIHN0cmljdFJvb3QgPSBmaW5kU3RyaWN0Um9vdChmaWJlcik7XG5cbiAgICBpZiAoc3RyaWN0Um9vdCA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBTdHJpY3RNb2RlIGNvbXBvbmVudCBpbiBhIHN0cmljdCBtb2RlIHRyZWUuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRGVkdXAgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuXG5cbiAgICBpZiAoZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5oYXMoZmliZXIudHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgd2FybmluZ3NGb3JSb290ID0gcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLmdldChzdHJpY3RSb290KTtcblxuICAgIGlmIChmaWJlci50eXBlLmNvbnRleHRUeXBlcyAhPSBudWxsIHx8IGZpYmVyLnR5cGUuY2hpbGRDb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBpbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAod2FybmluZ3NGb3JSb290ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd2FybmluZ3NGb3JSb290ID0gW107XG4gICAgICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5zZXQoc3RyaWN0Um9vdCwgd2FybmluZ3NGb3JSb290KTtcbiAgICAgIH1cblxuICAgICAgd2FybmluZ3NGb3JSb290LnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlckFycmF5LCBzdHJpY3RSb290KSB7XG4gICAgICBpZiAoZmliZXJBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmlyc3RGaWJlciA9IGZpYmVyQXJyYXlbMF07XG4gICAgICB2YXIgdW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICBmaWJlckFycmF5LmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIHVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaXJzdEZpYmVyKTtcblxuICAgICAgICBlcnJvcignTGVnYWN5IGNvbnRleHQgQVBJIGhhcyBiZWVuIGRldGVjdGVkIHdpdGhpbiBhIHN0cmljdC1tb2RlIHRyZWUuJyArICdcXG5cXG5UaGUgb2xkIEFQSSB3aWxsIGJlIHN1cHBvcnRlZCBpbiBhbGwgMTYueCByZWxlYXNlcywgYnV0IGFwcGxpY2F0aW9ucyAnICsgJ3VzaW5nIGl0IHNob3VsZCBtaWdyYXRlIHRvIHRoZSBuZXcgdmVyc2lvbi4nICsgJ1xcblxcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0Jywgc29ydGVkTmFtZXMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCk7XG4gIH07XG59XG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzO1xudmFyIGRpZFdhcm5BYm91dEdlbmVyYXRvcnM7XG52YXIgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmc7XG52YXIgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nO1xuXG52YXIgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQsIHJldHVybkZpYmVyKSB7fTtcblxue1xuICBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xuICAvKipcbiAgICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICAgKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAgICogdXBkYXRlcy5cbiAgICovXG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG4gIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZyA9IHt9O1xuXG4gIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge1xuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjaGlsZC5fc3RvcmUgfHwgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCB8fCBjaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2hpbGQuX3N0b3JlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdCBDb21wb25lbnQgaW4gd2FybkZvck1pc3NpbmdLZXkgc2hvdWxkIGhhdmUgYSBfc3RvcmUuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBjaGlsZC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciAnICsgJ21vcmUgaW5mb3JtYXRpb24uJyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzUmVhY3RDbGFzcyh0eXBlKSB7XG4gIHJldHVybiB0eXBlLnByb3RvdHlwZSAmJiB0eXBlLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50O1xufVxuXG5mdW5jdGlvbiBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpIHtcbiAgdmFyIG1peGVkUmVmID0gZWxlbWVudC5yZWY7XG5cbiAgaWYgKG1peGVkUmVmICE9PSBudWxsICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdvYmplY3QnKSB7XG4gICAge1xuICAgICAgLy8gVE9ETzogQ2xlYW4gdGhpcyB1cCBvbmNlIHdlIHR1cm4gb24gdGhlIHN0cmluZyByZWYgd2FybmluZyBmb3JcbiAgICAgIC8vIGV2ZXJ5b25lLCBiZWNhdXNlIHRoZSBzdHJpY3QgbW9kZSBjYXNlIHdpbGwgbm8gbG9uZ2VyIGJlIHJlbGV2YW50XG4gICAgICBpZiAoKHJldHVybkZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlIHx8IHdhcm5BYm91dFN0cmluZ1JlZnMpICYmIC8vIFdlIHdhcm4gaW4gUmVhY3RFbGVtZW50LmpzIGlmIG93bmVyIGFuZCBzZWxmIGFyZSBlcXVhbCBmb3Igc3RyaW5nIHJlZnNcbiAgICAgIC8vIGJlY2F1c2UgdGhlc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uXG4gICAgICAvLyB1c2luZyBhIGNvZGVtb2QuIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byB3YXJuIGFib3V0IHN0cmluZyByZWZzIGFnYWluLlxuICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9zZWxmICYmIGVsZW1lbnQuX293bmVyLnN0YXRlTm9kZSAhPT0gZWxlbWVudC5fc2VsZikgJiYgLy8gV2lsbCBhbHJlYWR5IHRocm93IHdpdGggXCJGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBoYXZlIHN0cmluZyByZWZzXCJcbiAgICAgICEoZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkgJiYgLy8gV2lsbCBhbHJlYWR5IHdhcm4gd2l0aCBcIkZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGJlIGdpdmVuIHJlZnNcIlxuICAgICAgISh0eXBlb2YgZWxlbWVudC50eXBlID09PSAnZnVuY3Rpb24nICYmICFpc1JlYWN0Q2xhc3MoZWxlbWVudC50eXBlKSkgJiYgLy8gV2lsbCBhbHJlYWR5IHRocm93IHdpdGggXCJFbGVtZW50IHJlZiB3YXMgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChzb21lU3RyaW5nUmVmKSBidXQgbm8gb3duZXIgd2FzIHNldFwiXG4gICAgICBlbGVtZW50Ll9vd25lcikge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gU3VwcG9ydCBmb3Igc3RyaW5nIHJlZnMgJyArICd3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gV2UgcmVjb21tZW5kIHVzaW5nICcgKyAndXNlUmVmKCkgb3IgY3JlYXRlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnLCBjb21wb25lbnROYW1lLCBtaXhlZFJlZik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5fb3duZXIpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIGluc3Q7XG5cbiAgICAgIGlmIChvd25lcikge1xuICAgICAgICB2YXIgb3duZXJGaWJlciA9IG93bmVyO1xuXG4gICAgICAgIGlmIChvd25lckZpYmVyLnRhZyAhPT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnMuICcgKyAnV2UgcmVjb21tZW5kIHVzaW5nIHVzZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0ID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5zdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG93bmVyIGZvciBzdHJpbmcgcmVmIFwiICsgbWl4ZWRSZWYgKyBcIi4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgXCIgKyAnYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgIH0gLy8gQXNzaWduaW5nIHRoaXMgdG8gYSBjb25zdCBzbyBGbG93IGtub3dzIGl0IHdvbid0IGNoYW5nZSBpbiB0aGUgY2xvc3VyZVxuXG5cbiAgICAgIHZhciByZXNvbHZlZEluc3QgPSBpbnN0O1xuXG4gICAgICB7XG4gICAgICAgIGNoZWNrUHJvcFN0cmluZ0NvZXJjaW9uKG1peGVkUmVmLCAncmVmJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHJpbmdSZWYgPSAnJyArIG1peGVkUmVmOyAvLyBDaGVjayBpZiBwcmV2aW91cyBzdHJpbmcgcmVmIG1hdGNoZXMgbmV3IHN0cmluZyByZWZcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5yZWYgIT09IG51bGwgJiYgdHlwZW9mIGN1cnJlbnQucmVmID09PSAnZnVuY3Rpb24nICYmIGN1cnJlbnQucmVmLl9zdHJpbmdSZWYgPT09IHN0cmluZ1JlZikge1xuICAgICAgICByZXR1cm4gY3VycmVudC5yZWY7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWYgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHJlZnMgPSByZXNvbHZlZEluc3QucmVmcztcblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBkZWxldGUgcmVmc1tzdHJpbmdSZWZdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZnNbc3RyaW5nUmVmXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZWYuX3N0cmluZ1JlZiA9IHN0cmluZ1JlZjtcbiAgICAgIHJldHVybiByZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgbWl4ZWRSZWYgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVmIHRvIGJlIGEgZnVuY3Rpb24sIGEgc3RyaW5nLCBhbiBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlUmVmKCksIG9yIG51bGwuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudC5fb3duZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoXCIgKyBtaXhlZFJlZiArIFwiKSBidXQgbm8gb3duZXIgd2FzIHNldC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZlwiICsgJyB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGZ1bmN0aW9uIGNvbXBvbmVudFxcbicgKyBcIjIuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudCdzIHJlbmRlciBtZXRob2RcXG5cIiArICczLiBZb3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlZnMtbXVzdC1oYXZlLW93bmVyIGZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaXhlZFJlZjtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCkge1xuICB2YXIgY2hpbGRTdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3Q2hpbGQpO1xuICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMobmV3Q2hpbGQpLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZFN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xufVxuXG5mdW5jdGlvbiB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdGdW5jdGlvbnMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkLiBUaGlzIG1heSBoYXBwZW4gaWYgJyArICd5b3UgcmV0dXJuIGEgQ29tcG9uZW50IGluc3RlYWQgb2YgPENvbXBvbmVudCAvPiBmcm9tIHJlbmRlci4gJyArICdPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTGF6eShsYXp5VHlwZSkge1xuICB2YXIgcGF5bG9hZCA9IGxhenlUeXBlLl9wYXlsb2FkO1xuICB2YXIgaW5pdCA9IGxhenlUeXBlLl9pbml0O1xuICByZXR1cm4gaW5pdChwYXlsb2FkKTtcbn0gLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGV4aXN0cyBiZWNhdXNlIEkgZXhwZWN0IHRvIGNsb25lIHRoZSBjb2RlIGluIGVhY2ggcGF0aFxuLy8gdG8gYmUgYWJsZSB0byBvcHRpbWl6ZSBlYWNoIHBhdGggaW5kaXZpZHVhbGx5IGJ5IGJyYW5jaGluZyBlYXJseS4gVGhpcyBuZWVkc1xuLy8gYSBjb21waWxlciBvciB3ZSBjYW4gZG8gaXQgbWFudWFsbHkuIEhlbHBlcnMgdGhhdCBkb24ndCBuZWVkIHRoaXMgYnJhbmNoaW5nXG4vLyBsaXZlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbi5cblxuXG5mdW5jdGlvbiBDaGlsZFJlY29uY2lsZXIoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICBmdW5jdGlvbiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGRUb0RlbGV0ZSkge1xuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2NoaWxkVG9EZWxldGVdO1xuICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY2hpbGRUb0RlbGV0ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBUT0RPOiBGb3IgdGhlIHNob3VsZENsb25lIGNhc2UsIHRoaXMgY291bGQgYmUgbWljcm8tb3B0aW1pemVkIGEgYml0IGJ5XG4gICAgLy8gYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQgd2UndmUgYWxyZWFkeSBhZGRlZCBldmVyeXRoaW5nLlxuXG5cbiAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkVG9EZWxldGUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGlsZHJlbiB0byBhIHRlbXBvcmFyeSBtYXAgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGVtIGJ5XG4gICAgLy8ga2V5cyBxdWlja2x5LiBJbXBsaWNpdCAobnVsbCkga2V5cyBnZXQgYWRkZWQgdG8gdGhpcyBzZXQgd2l0aCB0aGVpciBpbmRleFxuICAgIC8vIGluc3RlYWQuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgdmFyIGV4aXN0aW5nQ2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChleGlzdGluZ0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBpZiAoZXhpc3RpbmdDaGlsZC5rZXkgIT09IG51bGwpIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5rZXksIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5pbmRleCwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gIH1cblxuICBmdW5jdGlvbiB1c2VGaWJlcihmaWJlciwgcGVuZGluZ1Byb3BzKSB7XG4gICAgLy8gV2UgY3VycmVudGx5IHNldCBzaWJsaW5nIHRvIG51bGwgYW5kIGluZGV4IHRvIDAgaGVyZSBiZWNhdXNlIGl0IGlzIGVhc3lcbiAgICAvLyB0byBmb3JnZXQgdG8gZG8gYmVmb3JlIHJldHVybmluZyBpdC4gRS5nLiBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLlxuICAgIHZhciBjbG9uZSA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGZpYmVyLCBwZW5kaW5nUHJvcHMpO1xuICAgIGNsb25lLmluZGV4ID0gMDtcbiAgICBjbG9uZS5zaWJsaW5nID0gbnVsbDtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcblxuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gRHVyaW5nIGh5ZHJhdGlvbiwgdGhlIHVzZUlkIGFsZ29yaXRobSBuZWVkcyB0byBrbm93IHdoaWNoIGZpYmVycyBhcmVcbiAgICAgIC8vIHBhcnQgb2YgYSBsaXN0IG9mIGNoaWxkcmVuIChhcnJheXMsIGl0ZXJhdG9ycykuXG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBGb3JrZWQ7XG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50ID0gbmV3RmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBvbGRJbmRleCA9IGN1cnJlbnQuaW5kZXg7XG5cbiAgICAgIGlmIChvbGRJbmRleCA8IGxhc3RQbGFjZWRJbmRleCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgbW92ZS5cbiAgICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpdGVtIGNhbiBzdGF5IGluIHBsYWNlLlxuICAgICAgICByZXR1cm4gb2xkSW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uLlxuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhXG4gICAgLy8gcGxhY2VtZW50IGZvciBpbnNlcnRpbmcgbmV3IGNoaWxkcmVuLlxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGaWJlcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50LCB0ZXh0Q29udGVudCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCwgbGFuZXMpIHtcbiAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAoZWxlbWVudFR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgbGFuZXMsIGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGN1cnJlbnQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGN1cnJlbnQsIGVsZW1lbnQpICkgfHwgLy8gTGF6eSB0eXBlcyBzaG91bGQgcmVjb25jaWxlIHRoZWlyIHJlc29sdmVkIHR5cGUuXG4gICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIEhvdCBSZWxvYWRpbmcgY2hlY2sgYWJvdmUsXG4gICAgICAvLyBiZWNhdXNlIGhvdCByZWxvYWRpbmcgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBwcm9kIGJlY2F1c2VcbiAgICAgIC8vIGl0IGRvZXNuJ3QgcmVzdXNwZW5kLiBTbyB3ZSBjYW4ndCBsZXQgdGhlIGNhbGwgYmVsb3cgc3VzcGVuZC5cbiAgICAgIHR5cGVvZiBlbGVtZW50VHlwZSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudFR5cGUgIT09IG51bGwgJiYgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJiByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGN1cnJlbnQudHlwZSkge1xuICAgICAgICAvLyBNb3ZlIGJhc2VkIG9uIGluZGV4XG4gICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIGVsZW1lbnQucHJvcHMpO1xuICAgICAgICBleGlzdGluZy5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICB7XG4gICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICB9XG4gICAgfSAvLyBJbnNlcnRcblxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudCwgcG9ydGFsLCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0UG9ydGFsIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gIT09IHBvcnRhbC5jb250YWluZXJJbmZvIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uICE9PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBmcmFnbWVudCwgbGFuZXMsIGtleSkge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBGcmFnbWVudCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZyYWdtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywga2V5KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBmcmFnbWVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCgnJyArIG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIG51bGwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZDIgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQyLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICB2YXIgX2NyZWF0ZWQzID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBudWxsKTtcblxuICAgICAgICBfY3JlYXRlZDMucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgIHJldHVybiBfY3JlYXRlZDM7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAvLyBVcGRhdGUgdGhlIGZpYmVyIGlmIHRoZSBrZXlzIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuXG4gICAgdmFyIGtleSA9IG9sZEZpYmVyICE9PSBudWxsID8gb2xkRmliZXIua2V5IDogbnVsbDtcblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZFxuICAgICAgLy8gd2UgY2FuIGNvbnRpbnVlIHRvIHJlcGxhY2UgaXQgd2l0aG91dCBhYm9ydGluZyBldmVuIGlmIGl0IGlzIG5vdCBhIHRleHRcbiAgICAgIC8vIG5vZGUuXG4gICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG9sZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLCBzbyB3ZSBuZWl0aGVyIGhhdmUgdG8gY2hlY2sgdGhlIG9sZCBub3JcbiAgICAgIC8vIG5ldyBub2RlIGZvciB0aGUga2V5LiBJZiBib3RoIGFyZSB0ZXh0IG5vZGVzLCB0aGV5IG1hdGNoLlxuICAgICAgdmFyIG1hdGNoZWRGaWJlciA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbDtcbiAgICAgIHJldHVybiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgbWF0Y2hlZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdDaGlsZC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXkpIHx8IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyMiA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0NoaWxkLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleSkgfHwgbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICB2YXIgX21hdGNoZWRGaWJlcjMgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMywgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBXYXJucyBpZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSBvciBtaXNzaW5nIGtleVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JyB8fCBjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ga25vd25LZXlzO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGNoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHdhcm5Gb3JNaXNzaW5nS2V5KGNoaWxkLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgdmFyIGtleSA9IGNoaWxkLmtleTtcblxuICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtub3duS2V5cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAga25vd25LZXlzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAga25vd25LZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFrbm93bktleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yKCdFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksIGAlc2AuICcgKyAnS2V5cyBzaG91bGQgYmUgdW5pcXVlIHNvIHRoYXQgY29tcG9uZW50cyBtYWludGFpbiB0aGVpciBpZGVudGl0eSAnICsgJ2Fjcm9zcyB1cGRhdGVzLiBOb24tdW5pcXVlIGtleXMgbWF5IGNhdXNlIGNoaWxkcmVuIHRvIGJlICcgKyAnZHVwbGljYXRlZCBhbmQvb3Igb21pdHRlZCDigJQgdGhlIGJlaGF2aW9yIGlzIHVuc3VwcG9ydGVkIGFuZCAnICsgJ2NvdWxkIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uLicsIGtleSk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGNoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gY2hpbGQuX2luaXQ7XG4gICAgICAgICAgd2Fybk9uSW52YWxpZEtleShpbml0KHBheWxvYWQpLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ga25vd25LZXlzO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuLCBsYW5lcykge1xuICAgIC8vIFRoaXMgYWxnb3JpdGhtIGNhbid0IG9wdGltaXplIGJ5IHNlYXJjaGluZyBmcm9tIGJvdGggZW5kcyBzaW5jZSB3ZVxuICAgIC8vIGRvbid0IGhhdmUgYmFja3BvaW50ZXJzIG9uIGZpYmVycy4gSSdtIHRyeWluZyB0byBzZWUgaG93IGZhciB3ZSBjYW4gZ2V0XG4gICAgLy8gd2l0aCB0aGF0IG1vZGVsLiBJZiBpdCBlbmRzIHVwIG5vdCBiZWluZyB3b3J0aCB0aGUgdHJhZGVvZmZzLCB3ZSBjYW5cbiAgICAvLyBhZGQgaXQgbGF0ZXIuXG4gICAgLy8gRXZlbiB3aXRoIGEgdHdvIGVuZGVkIG9wdGltaXphdGlvbiwgd2UnZCB3YW50IHRvIG9wdGltaXplIGZvciB0aGUgY2FzZVxuICAgIC8vIHdoZXJlIHRoZXJlIGFyZSBmZXcgY2hhbmdlcyBhbmQgYnJ1dGUgZm9yY2UgdGhlIGNvbXBhcmlzb24gaW5zdGVhZCBvZlxuICAgIC8vIGdvaW5nIGZvciB0aGUgTWFwLiBJdCdkIGxpa2UgdG8gZXhwbG9yZSBoaXR0aW5nIHRoYXQgcGF0aCBmaXJzdCBpblxuICAgIC8vIGZvcndhcmQtb25seSBtb2RlIGFuZCBvbmx5IGdvIGZvciB0aGUgTWFwIG9uY2Ugd2Ugbm90aWNlIHRoYXQgd2UgbmVlZFxuICAgIC8vIGxvdHMgb2YgbG9vayBhaGVhZC4gVGhpcyBkb2Vzbid0IGhhbmRsZSByZXZlcnNhbCBhcyB3ZWxsIGFzIHR3byBlbmRlZFxuICAgIC8vIHNlYXJjaCBidXQgdGhhdCdzIHVudXN1YWwuIEJlc2lkZXMsIGZvciB0aGUgdHdvIGVuZGVkIG9wdGltaXphdGlvbiB0b1xuICAgIC8vIHdvcmsgb24gSXRlcmFibGVzLCB3ZSdkIG5lZWQgdG8gY29weSB0aGUgd2hvbGUgc2V0LlxuICAgIC8vIEluIHRoaXMgZmlyc3QgaXRlcmF0aW9uLCB3ZSdsbCBqdXN0IGxpdmUgd2l0aCBoaXR0aW5nIHRoZSBiYWQgY2FzZVxuICAgIC8vIChhZGRpbmcgZXZlcnl0aGluZyB0byBhIE1hcCkgaW4gZm9yIGV2ZXJ5IGluc2VydC9tb3ZlLlxuICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjb2RlLCBhbHNvIHVwZGF0ZSByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKCkgd2hpY2hcbiAgICAvLyB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobS5cbiAgICB7XG4gICAgICAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IG5ld0NoaWxkcmVuW2ldO1xuICAgICAgICBrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzTmV3RmliZXIgPSBudWxsO1xuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuXG4gICAgZm9yICg7IG9sZEZpYmVyICE9PSBudWxsICYmIG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIGlmIChvbGRGaWJlci5pbmRleCA+IG5ld0lkeCkge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlcjtcbiAgICAgICAgb2xkRmliZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICBpZiAob2xkRmliZXIgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgc2xvdCwgYnV0IHdlIGRpZG4ndCByZXVzZSB0aGUgZXhpc3RpbmcgZmliZXIsIHNvIHdlXG4gICAgICAgICAgLy8gbmVlZCB0byBkZWxldGUgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgIH1cblxuICAgIGlmIChuZXdJZHggPT09IG5ld0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBudW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgICB2YXIgX25ld0ZpYmVyID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgICBpZiAoX25ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfSAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cblxuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOyAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG5cbiAgICBmb3IgKDsgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgdmFyIF9uZXdGaWJlcjIgPSB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgaWYgKF9uZXdGaWJlcjIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyMi5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXIyLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjIua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjI7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICB2YXIgX251bWJlck9mRm9ya3MyID0gbmV3SWR4O1xuICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczIpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuSXRlcmFibGUsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBhcyByZWNvbmNpbGVDaGlsZHJlbkFycmF5KCksXG4gICAgLy8gYnV0IHVzaW5nIHRoZSBpdGVyYXRvciBpbnN0ZWFkLlxuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBvYmplY3QgaXMgbm90IGFuIGl0ZXJhYmxlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gJyArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCByZW5kZXJpbmcgR2VuZXJhdG9ycyBiZWNhdXNlIGl0J3MgYSBtdXRhdGlvbi5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyOTk1XG4gICAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IHRvU3RyaW5nVGFnXG4gICAgICBuZXdDaGlsZHJlbkl0ZXJhYmxlW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdHZW5lcmF0b3InKSB7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0R2VuZXJhdG9ycykge1xuICAgICAgICAgIGVycm9yKCdVc2luZyBHZW5lcmF0b3JzIGFzIGNoaWxkcmVuIGlzIHVuc3VwcG9ydGVkIGFuZCB3aWxsIGxpa2VseSB5aWVsZCAnICsgJ3VuZXhwZWN0ZWQgcmVzdWx0cyBiZWNhdXNlIGVudW1lcmF0aW5nIGEgZ2VuZXJhdG9yIG11dGF0ZXMgaXQuICcgKyAnWW91IG1heSBjb252ZXJ0IGl0IHRvIGFuIGFycmF5IHdpdGggYEFycmF5LmZyb20oKWAgb3IgdGhlICcgKyAnYFsuLi5zcHJlYWRdYCBvcGVyYXRvciBiZWZvcmUgcmVuZGVyaW5nLiBLZWVwIGluIG1pbmQgJyArICd5b3UgbWlnaHQgbmVlZCB0byBwb2x5ZmlsbCB0aGVzZSBmZWF0dXJlcyBmb3Igb2xkZXIgYnJvd3NlcnMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gdHJ1ZTtcbiAgICAgIH0gLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG5cblxuICAgICAgaWYgKG5ld0NoaWxkcmVuSXRlcmFibGUuZW50cmllcyA9PT0gaXRlcmF0b3JGbikge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dE1hcHMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgIH0gLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICAvLyBXZSdsbCBnZXQgYSBkaWZmZXJlbnQgaXRlcmF0b3IgbGF0ZXIgZm9yIHRoZSBtYWluIHBhc3MuXG5cblxuICAgICAgdmFyIF9uZXdDaGlsZHJlbiA9IGl0ZXJhdG9yRm4uY2FsbChuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgICAgaWYgKF9uZXdDaGlsZHJlbikge1xuICAgICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgICB2YXIgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpO1xuXG4gICAgICAgIGZvciAoOyAhX3N0ZXAuZG9uZTsgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAobmV3Q2hpbGRyZW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBpdGVyYWJsZSBvYmplY3QgcHJvdmlkZWQgbm8gaXRlcmF0b3IuJyk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcbiAgICB2YXIgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBudW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlcjMgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIzID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjMsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIzO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczMgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfSAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cblxuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOyAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG5cbiAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgIHZhciBfbmV3RmliZXI0ID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXI0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjQuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyNC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXI0LmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXI0LCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXI0O1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgdmFyIF9udW1iZXJPZkZvcmtzNCA9IG5ld0lkeDtcbiAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3M0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQsIGxhbmVzKSB7XG4gICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIGNoZWNrIGZvciBrZXlzIG9uIHRleHQgbm9kZXMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhXG4gICAgLy8gd2F5IHRvIGRlZmluZSB0aGVtLlxuICAgIGlmIChjdXJyZW50Rmlyc3RDaGlsZCAhPT0gbnVsbCAmJiBjdXJyZW50Rmlyc3RDaGlsZC50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gZXhpc3Rpbmcgbm9kZSBzbyBsZXQncyBqdXN0IHVwZGF0ZSBpdCBhbmQgZGVsZXRlXG4gICAgICAvLyB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nKTtcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9IC8vIFRoZSBleGlzdGluZyBmaXJzdCBjaGlsZCBpcyBub3QgYSB0ZXh0IG5vZGUgc28gd2UgbmVlZCB0byBjcmVhdGUgb25lXG4gICAgLy8gYW5kIGRlbGV0ZSB0aGUgZXhpc3Rpbmcgb25lcy5cblxuXG4gICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGVsZW1lbnQsIGxhbmVzKSB7XG4gICAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IEZyYWdtZW50KSB7XG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbik7XG4gICAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSB8fCAoIC8vIEtlZXAgdGhpcyBjaGVjayBpbmxpbmUgc28gaXQgb25seSBydW5zIG9uIHRoZSBmYWxzZSBwYXRoOlxuICAgICAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY2hpbGQsIGVsZW1lbnQpICkgfHwgLy8gTGF6eSB0eXBlcyBzaG91bGQgcmVjb25jaWxlIHRoZWlyIHJlc29sdmVkIHR5cGUuXG4gICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBIb3QgUmVsb2FkaW5nIGNoZWNrIGFib3ZlLFxuICAgICAgICAgIC8vIGJlY2F1c2UgaG90IHJlbG9hZGluZyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHByb2QgYmVjYXVzZVxuICAgICAgICAgIC8vIGl0IGRvZXNuJ3QgcmVzdXNwZW5kLiBTbyB3ZSBjYW4ndCBsZXQgdGhlIGNhbGwgYmVsb3cgc3VzcGVuZC5cbiAgICAgICAgICB0eXBlb2YgZWxlbWVudFR5cGUgPT09ICdvYmplY3QnICYmIGVsZW1lbnRUeXBlICE9PSBudWxsICYmIGVsZW1lbnRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiYgcmVzb2x2ZUxhenkoZWxlbWVudFR5cGUpID09PSBjaGlsZC50eXBlKSB7XG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG5cbiAgICAgICAgICAgIHZhciBfZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcyk7XG5cbiAgICAgICAgICAgIF9leGlzdGluZy5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGNoaWxkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIF9leGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBfZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICBfZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9leGlzdGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRGlkbid0IG1hdGNoLlxuXG5cbiAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgIF9jcmVhdGVkNC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50KTtcbiAgICAgIF9jcmVhdGVkNC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBfY3JlYXRlZDQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgcG9ydGFsLCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBwb3J0YWwua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gSG9zdFBvcnRhbCAmJiBjaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT0gcG9ydGFsLmNvbnRhaW5lckluZm8gJiYgY2hpbGQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uID09PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9IC8vIFRoaXMgQVBJIHdpbGwgdGFnIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSBzaWRlLWVmZmVjdCBvZiB0aGUgcmVjb25jaWxpYXRpb25cbiAgLy8gaXRzZWxmLiBUaGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNpZGUtZWZmZWN0IGxpc3QgYXMgd2UgcGFzcyB0aHJvdWdoIHRoZVxuICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC5cblxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVjdXJzaXZlLlxuICAgIC8vIElmIHRoZSB0b3AgbGV2ZWwgaXRlbSBpcyBhbiBhcnJheSwgd2UgdHJlYXQgaXQgYXMgYSBzZXQgb2YgY2hpbGRyZW4sXG4gICAgLy8gbm90IGFzIGEgZnJhZ21lbnQuIE5lc3RlZCBhcnJheXMgb24gdGhlIG90aGVyIGhhbmQgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAgLy8gZnJhZ21lbnQgbm9kZXMuIFJlY3Vyc2lvbiBoYXBwZW5zIGF0IHRoZSBub3JtYWwgZmxvdy5cbiAgICAvLyBIYW5kbGUgdG9wIGxldmVsIHVua2V5ZWQgZnJhZ21lbnRzIGFzIGlmIHRoZXkgd2VyZSBhcnJheXMuXG4gICAgLy8gVGhpcyBsZWFkcyB0byBhbiBhbWJpZ3VpdHkgYmV0d2VlbiA8PntbLi4uXX08Lz4gYW5kIDw+Li4uPC8+LlxuICAgIC8vIFdlIHRyZWF0IHRoZSBhbWJpZ3VvdXMgY2FzZXMgYWJvdmUgdGhlIHNhbWUuXG4gICAgdmFyIGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQgPSB0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsICYmIG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgJiYgbmV3Q2hpbGQua2V5ID09PSBudWxsO1xuXG4gICAgaWYgKGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW47XG4gICAgfSAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzXG5cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpKTtcblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDsgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBiZSBub24tcmVjdXJzaXZlLlxuXG4gICAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCAnJyArIG5ld0NoaWxkLCBsYW5lcykpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9IC8vIFJlbWFpbmluZyBjYXNlcyBhcmUgYWxsIHRyZWF0ZWQgYXMgZW1wdHkuXG5cblxuICAgIHJldHVybiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzO1xufVxuXG52YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIodHJ1ZSk7XG52YXIgbW91bnRDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcihmYWxzZSk7XG5mdW5jdGlvbiBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50LmNoaWxkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXN1bWluZyB3b3JrIG5vdCB5ZXQgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcyk7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHdoaWxlIChjdXJyZW50Q2hpbGQuc2libGluZyAhPT0gbnVsbCkge1xuICAgIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnRDaGlsZC5zaWJsaW5nO1xuICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQuc2libGluZyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcyk7XG4gICAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIH1cblxuICBuZXdDaGlsZC5zaWJsaW5nID0gbnVsbDtcbn0gLy8gUmVzZXQgYSB3b3JrSW5Qcm9ncmVzcyBjaGlsZCBzZXQgdG8gcHJlcGFyZSBpdCBmb3IgYSBzZWNvbmQgcGFzcy5cblxuZnVuY3Rpb24gcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgdmFyIGNoaWxkID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgcmVzZXRXb3JrSW5Qcm9ncmVzcyhjaGlsZCwgbGFuZXMpO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG52YXIgdmFsdWVDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCk7XG52YXIgcmVuZGVyZXJTaWdpbDtcblxue1xuICAvLyBVc2UgdGhpcyB0byBkZXRlY3QgbXVsdGlwbGUgcmVuZGVyZXJzIHVzaW5nIHRoZSBzYW1lIGNvbnRleHRcbiAgcmVuZGVyZXJTaWdpbCA9IHt9O1xufVxuXG52YXIgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xudmFyIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG52YXIgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcbnZhciBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG5mdW5jdGlvbiByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSBSZWFjdCB5aWVsZHMgZXhlY3V0aW9uLCB0byBlbnN1cmUgYHJlYWRDb250ZXh0YFxuICAvLyBjYW5ub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xuXG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCkge1xuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBwdXNoUHJvdmlkZXIocHJvdmlkZXJGaWJlciwgY29udGV4dCwgbmV4dFZhbHVlKSB7XG4gIHtcbiAgICBwdXNoKHZhbHVlQ3Vyc29yLCBjb250ZXh0Ll9jdXJyZW50VmFsdWUsIHByb3ZpZGVyRmliZXIpO1xuICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IG5leHRWYWx1ZTtcblxuICAgIHtcbiAgICAgIGlmIChjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IG51bGwgJiYgY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSByZW5kZXJlclNpZ2lsKSB7XG4gICAgICAgIGVycm9yKCdEZXRlY3RlZCBtdWx0aXBsZSByZW5kZXJlcnMgY29uY3VycmVudGx5IHJlbmRlcmluZyB0aGUgJyArICdzYW1lIGNvbnRleHQgcHJvdmlkZXIuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSByZW5kZXJlclNpZ2lsO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9wUHJvdmlkZXIoY29udGV4dCwgcHJvdmlkZXJGaWJlcikge1xuICB2YXIgY3VycmVudFZhbHVlID0gdmFsdWVDdXJzb3IuY3VycmVudDtcbiAgcG9wKHZhbHVlQ3Vyc29yLCBwcm92aWRlckZpYmVyKTtcblxuICB7XG4gICAge1xuICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChwYXJlbnQsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgLy8gVXBkYXRlIHRoZSBjaGlsZCBsYW5lcyBvZiBhbGwgdGhlIGFuY2VzdG9ycywgaW5jbHVkaW5nIHRoZSBhbHRlcm5hdGVzLlxuICB2YXIgbm9kZSA9IHBhcmVudDtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIHZhciBhbHRlcm5hdGUgPSBub2RlLmFsdGVybmF0ZTtcblxuICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBub2RlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmICFpc1N1YnNldE9mTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChub2RlICE9PSBwcm9wYWdhdGlvblJvb3QpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcm9wYWdhdGlvbiByb290IHdoZW4gc2NoZWR1bGluZyBjb250ZXh0IHdvcmsuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZV9lYWdlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcblxuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICBmaWJlci5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBuZXh0RmliZXIgPSB2b2lkIDA7IC8vIFZpc2l0IHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbGlzdCA9IGZpYmVyLmRlcGVuZGVuY2llcztcblxuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgIHZhciBkZXBlbmRlbmN5ID0gbGlzdC5maXJzdENvbnRleHQ7XG5cbiAgICAgIHdoaWxlIChkZXBlbmRlbmN5ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZXh0IG1hdGNoZXMuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5LmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgICAgICAvLyBNYXRjaCEgU2NoZWR1bGUgYW4gdXBkYXRlIG9uIHRoaXMgZmliZXIuXG4gICAgICAgICAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgZm9yY2UgdXBkYXRlIG9uIHRoZSB3b3JrLWluLXByb2dyZXNzLlxuICAgICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTtcbiAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTsgLy8gVE9ETzogQmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgd29yay1pbi1wcm9ncmVzcywgdGhpcyB3aWxsIGFkZCB0aGVcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0byB0aGUgY3VycmVudCBmaWJlciwgdG9vLCB3aGljaCBtZWFucyBpdCB3aWxsIHBlcnNpc3QgZXZlbiBpZlxuICAgICAgICAgICAgLy8gdGhpcyByZW5kZXIgaXMgdGhyb3duIGF3YXkuIFNpbmNlIGl0J3MgYSByYWNlIGNvbmRpdGlvbiwgbm90IHN1cmUgaXQnc1xuICAgICAgICAgICAgLy8gd29ydGggZml4aW5nLlxuICAgICAgICAgICAgLy8gSW5saW5lZCBgZW5xdWV1ZVVwZGF0ZWAgdG8gcmVtb3ZlIGludGVybGVhdmVkIHVwZGF0ZSBjaGVja1xuXG4gICAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSA7IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG4gICAgICAgICAgICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgICAgICAgICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpOyAvLyBNYXJrIHRoZSB1cGRhdGVkIGxhbmVzIG9uIHRoZSBsaXN0LCB0b28uXG5cbiAgICAgICAgICBsaXN0LmxhbmVzID0gbWVyZ2VMYW5lcyhsaXN0LmxhbmVzLCByZW5kZXJMYW5lcyk7IC8vIFNpbmNlIHdlIGFscmVhZHkgZm91bmQgYSBtYXRjaCwgd2UgY2FuIHN0b3AgdHJhdmVyc2luZyB0aGVcbiAgICAgICAgICAvLyBkZXBlbmRlbmN5IGxpc3QuXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5Lm5leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENvbnRleHRQcm92aWRlcikge1xuICAgICAgLy8gRG9uJ3Qgc2NhbiBkZWVwZXIgaWYgdGhpcyBpcyBhIG1hdGNoaW5nIHByb3ZpZGVyXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy50eXBlID8gbnVsbCA6IGZpYmVyLmNoaWxkO1xuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBpcyBpbiB0aGlzIHN1YnRyZWUsIHdlIGRvbid0IGtub3dcbiAgICAgIC8vIGlmIGl0IHdpbGwgaGF2ZSBhbnkgY29udGV4dCBjb25zdW1lcnMgaW4gaXQuIFRoZSBiZXN0IHdlIGNhbiBkbyBpc1xuICAgICAgLy8gbWFyayBpdCBhcyBoYXZpbmcgdXBkYXRlcy5cbiAgICAgIHZhciBwYXJlbnRTdXNwZW5zZSA9IGZpYmVyLnJldHVybjtcblxuICAgICAgaWYgKHBhcmVudFN1c3BlbnNlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2UganVzdCBjYW1lIGZyb20gYSBwYXJlbnQgc28gd2UgbXVzdCBoYXZlIGhhZCBhIHBhcmVudC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50U3VzcGVuc2UubGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudFN1c3BlbnNlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX2FsdGVybmF0ZSA9IHBhcmVudFN1c3BlbnNlLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKF9hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgX2FsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoX2FsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgcGFzc2luZyB0aGlzIGZpYmVyIGFzIHRoZSBwYXJlbnRcbiAgICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byBzY2hlZHVsZSB0aGlzIGZpYmVyIGFzIGhhdmluZyB3b3JrXG4gICAgICAvLyBvbiBpdHMgY2hpbGRyZW4uIFdlJ2xsIHVzZSB0aGUgY2hpbGRMYW5lcyBvblxuICAgICAgLy8gdGhpcyBmaWJlciB0byBpbmRpY2F0ZSB0aGF0IGEgY29udGV4dCBoYXMgY2hhbmdlZC5cblxuXG4gICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudFN1c3BlbnNlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgbmV4dEZpYmVyID0gZmliZXIuc2libGluZztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhdmVyc2UgZG93bi5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgIH1cblxuICAgIGlmIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgbmV4dEZpYmVyLnJldHVybiA9IGZpYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjaGlsZC4gVHJhdmVyc2UgdG8gbmV4dCBzaWJsaW5nLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXI7XG5cbiAgICAgIHdoaWxlIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5leHRGaWJlciA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAvLyBXZSdyZSBiYWNrIHRvIHRoZSByb290IG9mIHRoaXMgc3VidHJlZS4gRXhpdC5cbiAgICAgICAgICBuZXh0RmliZXIgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNpYmxpbmcgPSBuZXh0RmliZXIuc2libGluZztcblxuICAgICAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIHNpYmxpbmcgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICAgICAgc2libGluZy5yZXR1cm4gPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgICAgIG5leHRGaWJlciA9IHNpYmxpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gTm8gbW9yZSBzaWJsaW5ncy4gVHJhdmVyc2UgdXAuXG5cblxuICAgICAgICBuZXh0RmliZXIgPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gbmV4dEZpYmVyO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbiAgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcbiAgdmFyIGRlcGVuZGVuY2llcyA9IHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcztcblxuICBpZiAoZGVwZW5kZW5jaWVzICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgdmFyIGZpcnN0Q29udGV4dCA9IGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQ7XG5cbiAgICAgIGlmIChmaXJzdENvbnRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoZGVwZW5kZW5jaWVzLmxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgICAvLyBDb250ZXh0IGxpc3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuIE1hcmsgdGhhdCB0aGlzIGZpYmVyIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgICAgIH0gLy8gUmVzZXQgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgbGlzdFxuXG5cbiAgICAgICAgZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZWFkQ29udGV4dChjb250ZXh0KSB7XG4gIHtcbiAgICAvLyBUaGlzIHdhcm5pbmcgd291bGQgZmlyZSBpZiB5b3UgcmVhZCBjb250ZXh0IGluc2lkZSBhIEhvb2sgbGlrZSB1c2VNZW1vLlxuICAgIC8vIFVubGlrZSB0aGUgY2xhc3MgY2hlY2sgYmVsb3csIGl0J3Mgbm90IGVuZm9yY2VkIGluIHByb2R1Y3Rpb24gZm9yIHBlcmYuXG4gICAgaWYgKGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYpIHtcbiAgICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdmFsdWUgPSAgY29udGV4dC5fY3VycmVudFZhbHVlIDtcblxuICBpZiAobGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID09PSBjb250ZXh0KSA7IGVsc2Uge1xuICAgIHZhciBjb250ZXh0SXRlbSA9IHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgICBtZW1vaXplZFZhbHVlOiB2YWx1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9PT0gbnVsbCkge1xuICAgICAgaWYgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gICAgICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IGRlcGVuZGVuY3kgZm9yIHRoaXMgY29tcG9uZW50LiBDcmVhdGUgYSBuZXcgbGlzdC5cblxuXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBjb250ZXh0SXRlbTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmRlcGVuZGVuY2llcyA9IHtcbiAgICAgICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGZpcnN0Q29udGV4dDogY29udGV4dEl0ZW1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCBhIG5ldyBjb250ZXh0IGl0ZW0uXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBsYXN0Q29udGV4dERlcGVuZGVuY3kubmV4dCA9IGNvbnRleHRJdGVtO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gcmVuZGVyLiBXaGVuIHRoaXMgcmVuZGVyIGV4aXRzLCBlaXRoZXIgYmVjYXVzZSBpdCBmaW5pc2hlcyBvciBiZWNhdXNlIGl0IGlzXG4vLyBpbnRlcnJ1cHRlZCwgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbCBiZSB0cmFuc2ZlcnJlZCBvbnRvIHRoZSBtYWluIHBhcnRcbi8vIG9mIHRoZSBxdWV1ZS5cblxudmFyIGNvbmN1cnJlbnRRdWV1ZXMgPSBudWxsO1xuZnVuY3Rpb24gcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSkge1xuICBpZiAoY29uY3VycmVudFF1ZXVlcyA9PT0gbnVsbCkge1xuICAgIGNvbmN1cnJlbnRRdWV1ZXMgPSBbcXVldWVdO1xuICB9IGVsc2Uge1xuICAgIGNvbmN1cnJlbnRRdWV1ZXMucHVzaChxdWV1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmlzaFF1ZXVlaW5nQ29uY3VycmVudFVwZGF0ZXMoKSB7XG4gIC8vIFRyYW5zZmVyIHRoZSBpbnRlcmxlYXZlZCB1cGRhdGVzIG9udG8gdGhlIG1haW4gcXVldWUuIEVhY2ggcXVldWUgaGFzIGFcbiAgLy8gYHBlbmRpbmdgIGZpZWxkIGFuZCBhbiBgaW50ZXJsZWF2ZWRgIGZpZWxkLiBXaGVuIHRoZXkgYXJlIG5vdCBudWxsLCB0aGV5XG4gIC8vIHBvaW50IHRvIHRoZSBsYXN0IG5vZGUgaW4gYSBjaXJjdWxhciBsaW5rZWQgbGlzdC4gV2UgbmVlZCB0byBhcHBlbmQgdGhlXG4gIC8vIGludGVybGVhdmVkIGxpc3QgdG8gdGhlIGVuZCBvZiB0aGUgcGVuZGluZyBsaXN0IGJ5IGpvaW5pbmcgdGhlbSBpbnRvIGFcbiAgLy8gc2luZ2xlLCBjaXJjdWxhciBsaXN0LlxuICBpZiAoY29uY3VycmVudFF1ZXVlcyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uY3VycmVudFF1ZXVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlID0gY29uY3VycmVudFF1ZXVlc1tpXTtcbiAgICAgIHZhciBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICAgICAgaWYgKGxhc3RJbnRlcmxlYXZlZFVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBxdWV1ZS5pbnRlcmxlYXZlZCA9IG51bGw7XG4gICAgICAgIHZhciBmaXJzdEludGVybGVhdmVkVXBkYXRlID0gbGFzdEludGVybGVhdmVkVXBkYXRlLm5leHQ7XG4gICAgICAgIHZhciBsYXN0UGVuZGluZ1VwZGF0ZSA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKGxhc3RQZW5kaW5nVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGZpcnN0UGVuZGluZ1VwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGU7XG4gICAgICAgICAgbGFzdEludGVybGVhdmVkVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZS5wZW5kaW5nID0gbGFzdEludGVybGVhdmVkVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmN1cnJlbnRRdWV1ZXMgPSBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZUFuZEVhZ2VybHlCYWlsb3V0KGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciBpbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudENsYXNzVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciBpbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG4gIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpIHtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn0gLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIG91dHNpZGUgdGhpcyBtb2R1bGUgc2hvdWxkIG9ubHkgYmUgZG9uZSBmb3IgYmFja3dhcmRzXG4vLyBjb21wYXRpYmlsaXR5IGFuZCBzaG91bGQgYWx3YXlzIGJlIGFjY29tcGFuaWVkIGJ5IGEgd2FybmluZy5cblxudmFyIHVuc2FmZV9tYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdCA9IG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290O1xuXG5mdW5jdGlvbiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChzb3VyY2VGaWJlciwgbGFuZSkge1xuICAvLyBVcGRhdGUgdGhlIHNvdXJjZSBmaWJlcidzIGxhbmVzXG4gIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgbGFuZSk7XG4gIHZhciBhbHRlcm5hdGUgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCBsYW5lKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoYWx0ZXJuYXRlID09PSBudWxsICYmIChzb3VyY2VGaWJlci5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlcik7XG4gICAgfVxuICB9IC8vIFdhbGsgdGhlIHBhcmVudCBwYXRoIHRvIHRoZSByb290IGFuZCB1cGRhdGUgdGhlIGNoaWxkIGxhbmVzLlxuXG5cbiAgdmFyIG5vZGUgPSBzb3VyY2VGaWJlcjtcbiAgdmFyIHBhcmVudCA9IHNvdXJjZUZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgcGFyZW50LmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudC5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICBhbHRlcm5hdGUgPSBwYXJlbnQuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoKHBhcmVudC5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IHBhcmVudDtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIHZhciByb290ID0gbm9kZS5zdGF0ZU5vZGU7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxudmFyIFVwZGF0ZVN0YXRlID0gMDtcbnZhciBSZXBsYWNlU3RhdGUgPSAxO1xudmFyIEZvcmNlVXBkYXRlID0gMjtcbnZhciBDYXB0dXJlVXBkYXRlID0gMzsgLy8gR2xvYmFsIHN0YXRlIHRoYXQgaXMgcmVzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiBjYWxsaW5nIGBwcm9jZXNzVXBkYXRlUXVldWVgLlxuLy8gSXQgc2hvdWxkIG9ubHkgYmUgcmVhZCByaWdodCBhZnRlciBjYWxsaW5nIGBwcm9jZXNzVXBkYXRlUXVldWVgLCB2aWFcbi8vIGBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nYC5cblxudmFyIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG52YXIgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZTtcbnZhciBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWU7XG5cbntcbiAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IGZhbHNlO1xuICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBpbml0aWFsaXplVXBkYXRlUXVldWUoZmliZXIpIHtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIGJhc2VTdGF0ZTogZmliZXIubWVtb2l6ZWRTdGF0ZSxcbiAgICBmaXJzdEJhc2VVcGRhdGU6IG51bGwsXG4gICAgbGFzdEJhc2VVcGRhdGU6IG51bGwsXG4gICAgc2hhcmVkOiB7XG4gICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgICBsYW5lczogTm9MYW5lc1xuICAgIH0sXG4gICAgZWZmZWN0czogbnVsbFxuICB9O1xuICBmaWJlci51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xufVxuZnVuY3Rpb24gY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBDbG9uZSB0aGUgdXBkYXRlIHF1ZXVlIGZyb20gY3VycmVudC4gVW5sZXNzIGl0J3MgYWxyZWFkeSBhIGNsb25lLlxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHtcbiAgICB2YXIgY2xvbmUgPSB7XG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRRdWV1ZS5iYXNlU3RhdGUsXG4gICAgICBmaXJzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUsXG4gICAgICBsYXN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlLFxuICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICB9O1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY2xvbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBldmVudFRpbWU6IGV2ZW50VGltZSxcbiAgICBsYW5lOiBsYW5lLFxuICAgIHRhZzogVXBkYXRlU3RhdGUsXG4gICAgcGF5bG9hZDogbnVsbCxcbiAgICBjYWxsYmFjazogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcblxuICB7XG4gICAgaWYgKGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9PT0gc2hhcmVkUXVldWUgJiYgIWRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUpIHtcbiAgICAgIGVycm9yKCdBbiB1cGRhdGUgKHNldFN0YXRlLCByZXBsYWNlU3RhdGUsIG9yIGZvcmNlVXBkYXRlKSB3YXMgc2NoZWR1bGVkICcgKyAnZnJvbSBpbnNpZGUgYW4gdXBkYXRlIGZ1bmN0aW9uLiBVcGRhdGUgZnVuY3Rpb25zIHNob3VsZCBiZSBwdXJlLCAnICsgJ3dpdGggemVybyBzaWRlLWVmZmVjdHMuIENvbnNpZGVyIHVzaW5nIGNvbXBvbmVudERpZFVwZGF0ZSBvciBhICcgKyAnY2FsbGJhY2suJyk7XG5cbiAgICAgIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc1Vuc2FmZUNsYXNzUmVuZGVyUGhhc2VVcGRhdGUoKSkge1xuICAgIC8vIFRoaXMgaXMgYW4gdW5zYWZlIHJlbmRlciBwaGFzZSB1cGRhdGUuIEFkZCBkaXJlY3RseSB0byB0aGUgdXBkYXRlXG4gICAgLy8gcXVldWUgc28gd2UgY2FuIHByb2Nlc3MgaXQgaW1tZWRpYXRlbHkgZHVyaW5nIHRoZSBjdXJyZW50IHJlbmRlci5cbiAgICB2YXIgcGVuZGluZyA9IHNoYXJlZFF1ZXVlLnBlbmRpbmc7XG5cbiAgICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICAgIH1cblxuICAgIHNoYXJlZFF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7IC8vIFVwZGF0ZSB0aGUgY2hpbGRMYW5lcyBldmVuIHRob3VnaCB3ZSdyZSBtb3N0IGxpa2VseSBhbHJlYWR5IHJlbmRlcmluZ1xuICAgIC8vIHRoaXMgZmliZXIuIFRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGluIHRoZSBjYXNlIHdoZXJlIHlvdVxuICAgIC8vIHVwZGF0ZSBhIGRpZmZlcmVudCBjb21wb25lbnQgZHVyaW5nIHJlbmRlciBwaGFzZSB0aGFuIHRoZSBvbmUgdGhhdCBpc1xuICAgIC8vIGN1cnJlbnRseSByZW5kZXJpbmdzIChhIHBhdHRlcm4gdGhhdCBpcyBhY2NvbXBhbmllZCBieSBhIHdhcm5pbmcpLlxuXG4gICAgcmV0dXJuIHVuc2FmZV9tYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVucXVldWVDb25jdXJyZW50Q2xhc3NVcGRhdGUoZmliZXIsIHNoYXJlZFF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuICB9XG59XG5mdW5jdGlvbiBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIE9ubHkgb2NjdXJzIGlmIHRoZSBmaWJlciBoYXMgYmVlbiB1bm1vdW50ZWQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuXG4gIGlmIChpc1RyYW5zaXRpb25MYW5lKGxhbmUpKSB7XG4gICAgdmFyIHF1ZXVlTGFuZXMgPSBzaGFyZWRRdWV1ZS5sYW5lczsgLy8gSWYgYW55IGVudGFuZ2xlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIHBlbmRpbmcgb24gdGhlIHJvb3QsIHRoZW4gdGhleSBtdXN0XG4gICAgLy8gaGF2ZSBmaW5pc2hlZC4gV2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSwgd2hpY2ggcmVwcmVzZW50c1xuICAgIC8vIGEgc3VwZXJzZXQgb2YgdGhlIGFjdHVhbGx5IHBlbmRpbmcgbGFuZXMuIEluIHNvbWUgY2FzZXMgd2UgbWF5IGVudGFuZ2xlXG4gICAgLy8gbW9yZSB0aGFuIHdlIG5lZWQgdG8sIGJ1dCB0aGF0J3MgT0suIEluIGZhY3QgaXQncyB3b3JzZSBpZiB3ZSAqZG9uJ3QqXG4gICAgLy8gZW50YW5nbGUgd2hlbiB3ZSBzaG91bGQuXG5cbiAgICBxdWV1ZUxhbmVzID0gaW50ZXJzZWN0TGFuZXMocXVldWVMYW5lcywgcm9vdC5wZW5kaW5nTGFuZXMpOyAvLyBFbnRhbmdsZSB0aGUgbmV3IHRyYW5zaXRpb24gbGFuZSB3aXRoIHRoZSBvdGhlciB0cmFuc2l0aW9uIGxhbmVzLlxuXG4gICAgdmFyIG5ld1F1ZXVlTGFuZXMgPSBtZXJnZUxhbmVzKHF1ZXVlTGFuZXMsIGxhbmUpO1xuICAgIHNoYXJlZFF1ZXVlLmxhbmVzID0gbmV3UXVldWVMYW5lczsgLy8gRXZlbiBpZiBxdWV1ZS5sYW5lcyBhbHJlYWR5IGluY2x1ZGUgbGFuZSwgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbiBpZlxuICAgIC8vIHRoZSBsYW5lIGZpbmlzaGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZW50YW5nbGVkIGl0LiBTbyB3ZSBuZWVkIHRvXG4gICAgLy8gZW50YW5nbGUgaXQgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZS5cblxuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG5ld1F1ZXVlTGFuZXMpO1xuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNhcHR1cmVkVXBkYXRlKSB7XG4gIC8vIENhcHR1cmVkIHVwZGF0ZXMgYXJlIHVwZGF0ZXMgdGhhdCBhcmUgdGhyb3duIGJ5IGEgY2hpbGQgZHVyaW5nIHRoZSByZW5kZXJcbiAgLy8gcGhhc2UuIFRoZXkgc2hvdWxkIGJlIGRpc2NhcmRlZCBpZiB0aGUgcmVuZGVyIGlzIGFib3J0ZWQuIFRoZXJlZm9yZSxcbiAgLy8gd2Ugc2hvdWxkIG9ubHkgcHV0IHRoZW0gb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUsIG5vdCB0aGUgY3VycmVudCBvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBDaGVjayBpZiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyBhIGNsb25lLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgICAgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaXMgdGhlIHNhbWUgYXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW5cbiAgICAgIC8vIHdlIGJhaWwgb3V0IG9uIGEgcGFyZW50IGZpYmVyIHRoYXQgdGhlbiBjYXB0dXJlcyBhbiBlcnJvciB0aHJvd24gYnlcbiAgICAgIC8vIGEgY2hpbGQuIFNpbmNlIHdlIHdhbnQgdG8gYXBwZW5kIHRoZSB1cGRhdGUgb25seSB0byB0aGUgd29yay1pblxuICAgICAgLy8gLXByb2dyZXNzIHF1ZXVlLCB3ZSBuZWVkIHRvIGNsb25lIHRoZSB1cGRhdGVzLiBXZSB1c3VhbGx5IGNsb25lIGR1cmluZ1xuICAgICAgLy8gcHJvY2Vzc1VwZGF0ZVF1ZXVlLCBidXQgdGhhdCBkaWRuJ3QgaGFwcGVuIGluIHRoaXMgY2FzZSBiZWNhdXNlIHdlXG4gICAgICAvLyBza2lwcGVkIG92ZXIgdGhlIHBhcmVudCB3aGVuIHdlIGJhaWxlZCBvdXQuXG4gICAgICB2YXIgbmV3Rmlyc3QgPSBudWxsO1xuICAgICAgdmFyIG5ld0xhc3QgPSBudWxsO1xuICAgICAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHVwZGF0ZXMgYW5kIGNsb25lIHRoZW0uXG4gICAgICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlLmV2ZW50VGltZSxcbiAgICAgICAgICAgIGxhbmU6IHVwZGF0ZS5sYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICAgICAgbmV3TGFzdCA9IGNsb25lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwpOyAvLyBBcHBlbmQgdGhlIGNhcHR1cmVkIHVwZGF0ZSB0aGUgZW5kIG9mIHRoZSBjbG9uZWQgbGlzdC5cblxuXG4gICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgICAgbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGVyZSBhcmUgbm8gYmFzZSB1cGRhdGVzLlxuICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgIH1cblxuICAgICAgcXVldWUgPSB7XG4gICAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgICAgZmlyc3RCYXNlVXBkYXRlOiBuZXdGaXJzdCxcbiAgICAgICAgbGFzdEJhc2VVcGRhdGU6IG5ld0xhc3QsXG4gICAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSAvLyBBcHBlbmQgdGhlIHVwZGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuXG5cbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgaWYgKGxhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgcXVldWUuZmlyc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGNhcHR1cmVkVXBkYXRlO1xuICB9XG5cbiAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBwcmV2U3RhdGUsIG5leHRQcm9wcywgaW5zdGFuY2UpIHtcbiAgc3dpdGNoICh1cGRhdGUudGFnKSB7XG4gICAgY2FzZSBSZXBsYWNlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXlsb2FkID0gdXBkYXRlLnBheWxvYWQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbmV4dFN0YXRlID0gcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4aXREaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgICAgIH0gLy8gU3RhdGUgb2JqZWN0XG5cblxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2FwdHVyZVVwZGF0ZTpcbiAgICAgIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgIH1cbiAgICAvLyBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBVcGRhdGVTdGF0ZTpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wYXlsb2FkID0gdXBkYXRlLnBheWxvYWQ7XG4gICAgICAgIHZhciBwYXJ0aWFsU3RhdGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIFVwZGF0ZXIgZnVuY3Rpb25cbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFydGlhbFN0YXRlID0gX3BheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBhcnRpYWwgc3RhdGUgb2JqZWN0XG4gICAgICAgICAgcGFydGlhbFN0YXRlID0gX3BheWxvYWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydGlhbFN0YXRlID09PSBudWxsIHx8IHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gTnVsbCBhbmQgdW5kZWZpbmVkIGFyZSB0cmVhdGVkIGFzIG5vLW9wcy5cbiAgICAgICAgICByZXR1cm4gcHJldlN0YXRlO1xuICAgICAgICB9IC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG5cblxuICAgICAgICByZXR1cm4gYXNzaWduKHt9LCBwcmV2U3RhdGUsIHBhcnRpYWxTdGF0ZSk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZvcmNlVXBkYXRlOlxuICAgICAge1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gcHJldlN0YXRlO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIHByb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhbHdheXMgbm9uLW51bGwgb24gYSBDbGFzc0NvbXBvbmVudCBvciBIb3N0Um9vdFxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxuICB7XG4gICAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gcXVldWUuc2hhcmVkO1xuICB9XG5cbiAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7IC8vIENoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMuIElmIHNvLCB0cmFuc2ZlciB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsOyAvLyBUaGUgcGVuZGluZyBxdWV1ZSBpcyBjaXJjdWxhci4gRGlzY29ubmVjdCB0aGUgcG9pbnRlciBiZXR3ZWVuIGZpcnN0XG4gICAgLy8gYW5kIGxhc3Qgc28gdGhhdCBpdCdzIG5vbi1jaXJjdWxhci5cblxuICAgIHZhciBsYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDsgLy8gQXBwZW5kIHBlbmRpbmcgdXBkYXRlcyB0byBiYXNlIHF1ZXVlXG5cbiAgICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9XG5cbiAgICBsYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlOyAvLyBJZiB0aGVyZSdzIGEgY3VycmVudCBxdWV1ZSwgYW5kIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGJhc2UgcXVldWUsIHRoZW5cbiAgICAvLyB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZSB1cGRhdGVzIHRvIHRoYXQgcXVldWUsIHRvby4gQmVjYXVzZSB0aGUgYmFzZVxuICAgIC8vIHF1ZXVlIGlzIGEgc2luZ2x5LWxpbmtlZCBsaXN0IHdpdGggbm8gY3ljbGVzLCB3ZSBjYW4gYXBwZW5kIHRvIGJvdGhcbiAgICAvLyBsaXN0cyBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2Ygc3RydWN0dXJhbCBzaGFyaW5nLlxuICAgIC8vIFRPRE86IFBhc3MgYGN1cnJlbnRgIGFzIGFyZ3VtZW50XG5cbiAgICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gICAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcbiAgICAgIHZhciBjdXJyZW50TGFzdEJhc2VVcGRhdGUgPSBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgIT09IGxhc3RCYXNlVXBkYXRlKSB7XG4gICAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFRoZXNlIHZhbHVlcyBtYXkgY2hhbmdlIGFzIHdlIHByb2Nlc3MgdGhlIHF1ZXVlLlxuXG5cbiAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiB1cGRhdGVzIHRvIGNvbXB1dGUgdGhlIHJlc3VsdC5cbiAgICB2YXIgbmV3U3RhdGUgPSBxdWV1ZS5iYXNlU3RhdGU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gYWNjdW11bGF0ZSB0aGlzLiBJbnN0ZWFkLCB3ZSBjYW4gcmVtb3ZlIHJlbmRlckxhbmVzXG4gICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cbiAgICB2YXIgbmV3TGFuZXMgPSBOb0xhbmVzO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdGaXJzdEJhc2VVcGRhdGUgPSBudWxsO1xuICAgIHZhciBuZXdMYXN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG4gICAgICB2YXIgdXBkYXRlRXZlbnRUaW1lID0gdXBkYXRlLmV2ZW50VGltZTtcblxuICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMocmVuZGVyTGFuZXMsIHVwZGF0ZUxhbmUpKSB7XG4gICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgLy8gc2tpcHBlZCB1cGRhdGUsIHRoZSBwcmV2aW91cyB1cGRhdGUvc3RhdGUgaXMgdGhlIG5ldyBiYXNlXG4gICAgICAgIC8vIHVwZGF0ZS9zdGF0ZS5cbiAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLFxuICAgICAgICAgIGxhbmU6IHVwZGF0ZUxhbmUsXG4gICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuXG5cbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2Nsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBuZXdTdGF0ZSA9IGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgbmV3U3RhdGUsIHByb3BzLCBpbnN0YW5jZSk7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHVwZGF0ZS5jYWxsYmFjaztcblxuICAgICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwgJiYgLy8gSWYgdGhlIHVwZGF0ZSB3YXMgYWxyZWFkeSBjb21taXR0ZWQsIHdlIHNob3VsZCBub3QgcXVldWUgaXRzXG4gICAgICAgIC8vIGNhbGxiYWNrIGFnYWluLlxuICAgICAgICB1cGRhdGUubGFuZSAhPT0gTm9MYW5lKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gQ2FsbGJhY2s7XG4gICAgICAgICAgdmFyIGVmZmVjdHMgPSBxdWV1ZS5lZmZlY3RzO1xuXG4gICAgICAgICAgaWYgKGVmZmVjdHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlLmVmZmVjdHMgPSBbdXBkYXRlXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWZmZWN0cy5wdXNoKHVwZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuXG4gICAgICBpZiAodXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nO1xuXG4gICAgICAgIGlmIChwZW5kaW5nUXVldWUgPT09IG51bGwpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBmcm9tIGluc2lkZSBhIHJlZHVjZXIuIEFkZCB0aGUgbmV3XG4gICAgICAgICAgLy8gcGVuZGluZyB1cGRhdGVzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYW5kIGtlZXAgcHJvY2Vzc2luZy5cbiAgICAgICAgICB2YXIgX2xhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlOyAvLyBJbnRlbnRpb25hbGx5IHVuc291bmQuIFBlbmRpbmcgdXBkYXRlcyBmb3JtIGEgY2lyY3VsYXIgbGlzdCwgYnV0IHdlXG4gICAgICAgICAgLy8gdW5yYXZlbCB0aGVtIHdoZW4gdHJhbnNmZXJyaW5nIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG5cbiAgICAgICAgICB2YXIgX2ZpcnN0UGVuZGluZ1VwZGF0ZSA9IF9sYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgICAgICAgIF9sYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDtcbiAgICAgICAgICB1cGRhdGUgPSBfZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICAgIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICAgIHF1ZXVlLnNoYXJlZC5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9XG5cbiAgICBxdWV1ZS5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgcXVldWUuZmlyc3RCYXNlVXBkYXRlID0gbmV3Rmlyc3RCYXNlVXBkYXRlO1xuICAgIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGU7IC8vIEludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHN0b3JlZCBvbiBhIHNlcGFyYXRlIHF1ZXVlLiBXZSBhcmVuJ3QgZ29pbmcgdG9cbiAgICAvLyBwcm9jZXNzIHRoZW0gZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgd2UgZG8gbmVlZCB0byB0cmFjayB3aGljaCBsYW5lc1xuICAgIC8vIGFyZSByZW1haW5pbmcuXG5cbiAgICB2YXIgbGFzdEludGVybGVhdmVkID0gcXVldWUuc2hhcmVkLmludGVybGVhdmVkO1xuXG4gICAgaWYgKGxhc3RJbnRlcmxlYXZlZCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGludGVybGVhdmVkID0gbGFzdEludGVybGVhdmVkO1xuXG4gICAgICBkbyB7XG4gICAgICAgIG5ld0xhbmVzID0gbWVyZ2VMYW5lcyhuZXdMYW5lcywgaW50ZXJsZWF2ZWQubGFuZSk7XG4gICAgICAgIGludGVybGVhdmVkID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICAgIH0gd2hpbGUgKGludGVybGVhdmVkICE9PSBsYXN0SW50ZXJsZWF2ZWQpO1xuICAgIH0gZWxzZSBpZiAoZmlyc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAvLyBgcXVldWUubGFuZXNgIGlzIHVzZWQgZm9yIGVudGFuZ2xpbmcgdHJhbnNpdGlvbnMuIFdlIGNhbiBzZXQgaXQgYmFjayB0b1xuICAgICAgLy8gemVybyBvbmNlIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgIHF1ZXVlLnNoYXJlZC5sYW5lcyA9IE5vTGFuZXM7XG4gICAgfSAvLyBTZXQgdGhlIHJlbWFpbmluZyBleHBpcmF0aW9uIHRpbWUgdG8gYmUgd2hhdGV2ZXIgaXMgcmVtYWluaW5nIGluIHRoZSBxdWV1ZS5cbiAgICAvLyBUaGlzIHNob3VsZCBiZSBmaW5lIGJlY2F1c2UgdGhlIG9ubHkgdHdvIG90aGVyIHRoaW5ncyB0aGF0IGNvbnRyaWJ1dGUgdG9cbiAgICAvLyBleHBpcmF0aW9uIHRpbWUgYXJlIHByb3BzIGFuZCBjb250ZXh0LiBXZSdyZSBhbHJlYWR5IGluIHRoZSBtaWRkbGUgb2YgdGhlXG4gICAgLy8gYmVnaW4gcGhhc2UgYnkgdGhlIHRpbWUgd2Ugc3RhcnQgcHJvY2Vzc2luZyB0aGUgcXVldWUsIHNvIHdlJ3ZlIGFscmVhZHlcbiAgICAvLyBkZWFsdCB3aXRoIHRoZSBwcm9wcy4gQ29udGV4dCBpbiBjb21wb25lbnRzIHRoYXQgc3BlY2lmeVxuICAgIC8vIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB0cmlja3k7IGJ1dCB3ZSdsbCBoYXZlIHRvIGFjY291bnQgZm9yXG4gICAgLy8gdGhhdCByZWdhcmRsZXNzLlxuXG5cbiAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKG5ld0xhbmVzKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG5ld0xhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIHtcbiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDYWxsYmFjayhjYWxsYmFjaywgY29udGV4dCkge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBhcyBjYWxsYmFjay4gRXhwZWN0ZWQgYSBmdW5jdGlvbi4gSW5zdGVhZCAnICsgKFwicmVjZWl2ZWQ6IFwiICsgY2FsbGJhY2spKTtcbiAgfVxuXG4gIGNhbGxiYWNrLmNhbGwoY29udGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCkge1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHtcbiAgcmV0dXJuIGhhc0ZvcmNlVXBkYXRlO1xufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFF1ZXVlLCBpbnN0YW5jZSkge1xuICAvLyBDb21taXQgdGhlIGVmZmVjdHNcbiAgdmFyIGVmZmVjdHMgPSBmaW5pc2hlZFF1ZXVlLmVmZmVjdHM7XG4gIGZpbmlzaGVkUXVldWUuZWZmZWN0cyA9IG51bGw7XG5cbiAgaWYgKGVmZmVjdHMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZmZlY3QgPSBlZmZlY3RzW2ldO1xuICAgICAgdmFyIGNhbGxiYWNrID0gZWZmZWN0LmNhbGxiYWNrO1xuXG4gICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgZWZmZWN0LmNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBOT19DT05URVhUID0ge307XG52YXIgY29udGV4dFN0YWNrQ3Vyc29yJDEgPSBjcmVhdGVDdXJzb3IoTk9fQ09OVEVYVCk7XG52YXIgY29udGV4dEZpYmVyU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTk9fQ09OVEVYVCk7XG52YXIgcm9vdEluc3RhbmNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTk9fQ09OVEVYVCk7XG5cbmZ1bmN0aW9uIHJlcXVpcmVkQ29udGV4dChjKSB7XG4gIGlmIChjID09PSBOT19DT05URVhUKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBob3N0IGNvbnRleHQgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiBnZXRSb290SG9zdENvbnRhaW5lcigpIHtcbiAgdmFyIHJvb3RJbnN0YW5jZSA9IHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgcmV0dXJuIHJvb3RJbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250YWluZXIoZmliZXIsIG5leHRSb290SW5zdGFuY2UpIHtcbiAgLy8gUHVzaCBjdXJyZW50IHJvb3QgaW5zdGFuY2Ugb250byB0aGUgc3RhY2s7XG4gIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHJlc2V0IHJvb3Qgd2hlbiBwb3J0YWxzIGFyZSBwb3BwZWQuXG4gIHB1c2gocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIG5leHRSb290SW5zdGFuY2UsIGZpYmVyKTsgLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cbiAgcHVzaChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIsIGZpYmVyKTsgLy8gRmluYWxseSwgd2UgbmVlZCB0byBwdXNoIHRoZSBob3N0IGNvbnRleHQgdG8gdGhlIHN0YWNrLlxuICAvLyBIb3dldmVyLCB3ZSBjYW4ndCBqdXN0IGNhbGwgZ2V0Um9vdEhvc3RDb250ZXh0KCkgYW5kIHB1c2ggaXQgYmVjYXVzZVxuICAvLyB3ZSdkIGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGVudHJpZXMgb24gdGhlIHN0YWNrIGRlcGVuZGluZyBvblxuICAvLyB3aGV0aGVyIGdldFJvb3RIb3N0Q29udGV4dCgpIHRocm93cyBzb21ld2hlcmUgaW4gcmVuZGVyZXIgY29kZSBvciBub3QuXG4gIC8vIFNvIHdlIHB1c2ggYW4gZW1wdHkgdmFsdWUgZmlyc3QuIFRoaXMgbGV0cyB1cyBzYWZlbHkgdW53aW5kIG9uIGVycm9ycy5cblxuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBOT19DT05URVhULCBmaWJlcik7XG4gIHZhciBuZXh0Um9vdENvbnRleHQgPSBnZXRSb290SG9zdENvbnRleHQobmV4dFJvb3RJbnN0YW5jZSk7IC8vIE5vdyB0aGF0IHdlIGtub3cgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IHRocm93LCByZXBsYWNlIGl0LlxuXG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Um9vdENvbnRleHQsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcG9wSG9zdENvbnRhaW5lcihmaWJlcikge1xuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIHBvcChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRIb3N0Q29udGV4dCgpIHtcbiAgdmFyIGNvbnRleHQgPSByZXF1aXJlZENvbnRleHQoY29udGV4dFN0YWNrQ3Vyc29yJDEuY3VycmVudCk7XG4gIHJldHVybiBjb250ZXh0O1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdENvbnRleHQoZmliZXIpIHtcbiAgdmFyIHJvb3RJbnN0YW5jZSA9IHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgdmFyIGNvbnRleHQgPSByZXF1aXJlZENvbnRleHQoY29udGV4dFN0YWNrQ3Vyc29yJDEuY3VycmVudCk7XG4gIHZhciBuZXh0Q29udGV4dCA9IGdldENoaWxkSG9zdENvbnRleHQoY29udGV4dCwgZmliZXIudHlwZSk7IC8vIERvbid0IHB1c2ggdGhpcyBGaWJlcidzIGNvbnRleHQgdW5sZXNzIGl0J3MgdW5pcXVlLlxuXG4gIGlmIChjb250ZXh0ID09PSBuZXh0Q29udGV4dCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBUcmFjayB0aGUgY29udGV4dCBhbmQgdGhlIEZpYmVyIHRoYXQgcHJvdmlkZWQgaXQuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBwb3Agb25seSBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cblxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIC8vIERvIG5vdCBwb3AgdW5sZXNzIHRoaXMgRmliZXIgcHJvdmlkZWQgdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgLy8gcHVzaEhvc3RDb250ZXh0KCkgb25seSBwdXNoZXMgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG4gIGlmIChjb250ZXh0RmliZXJTdGFja0N1cnNvci5jdXJyZW50ICE9PSBmaWJlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxudmFyIERlZmF1bHRTdXNwZW5zZUNvbnRleHQgPSAwOyAvLyBUaGUgU3VzcGVuc2UgQ29udGV4dCBpcyBzcGxpdCBpbnRvIHR3byBwYXJ0cy4gVGhlIGxvd2VyIGJpdHMgaXNcbi8vIGluaGVyaXRlZCBkZWVwbHkgZG93biB0aGUgc3VidHJlZS4gVGhlIHVwcGVyIGJpdHMgb25seSBhZmZlY3Rcbi8vIHRoaXMgaW1tZWRpYXRlIHN1c3BlbnNlIGJvdW5kYXJ5IGFuZCBnZXRzIHJlc2V0IGVhY2ggbmV3XG4vLyBib3VuZGFyeSBvciBzdXNwZW5zZSBsaXN0LlxuXG52YXIgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2sgPSAxOyAvLyBTdWJ0cmVlIEZsYWdzOlxuLy8gSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0IGluZGljYXRlcyB0aGF0IG9uZSBvZiBvdXIgcGFyZW50IFN1c3BlbnNlXG4vLyBib3VuZGFyaWVzIGlzIG5vdCBjdXJyZW50bHkgc2hvd2luZyB2aXNpYmxlIG1haW4gY29udGVudC5cbi8vIEVpdGhlciBiZWNhdXNlIGl0IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIG9yIGlzIG5vdCBtb3VudGVkIGF0IGFsbC5cbi8vIFdlIGNhbiB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgZGVzaXJhYmxlIHRvIHRyaWdnZXIgYSBmYWxsYmFjayBhdFxuLy8gdGhlIHBhcmVudC4gSWYgbm90LCB0aGVuIHdlIG1pZ2h0IG5lZWQgdG8gdHJpZ2dlciB1bmRlc2lyYWJsZSBib3VuZGFyaWVzXG4vLyBhbmQvb3Igc3VzcGVuZCB0aGUgY29tbWl0IHRvIGF2b2lkIGhpZGluZyB0aGUgcGFyZW50IGNvbnRlbnQuXG5cbnZhciBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQgPSAxOyAvLyBTaGFsbG93IEZsYWdzOlxuLy8gRm9yY2VTdXNwZW5zZUZhbGxiYWNrIGNhbiBiZSB1c2VkIGJ5IFN1c3BlbnNlTGlzdCB0byBmb3JjZSBuZXdseSBhZGRlZFxuLy8gaXRlbXMgaW50byB0aGVpciBmYWxsYmFjayBzdGF0ZSBkdXJpbmcgb25lIG9mIHRoZSByZW5kZXIgcGFzc2VzLlxuXG52YXIgRm9yY2VTdXNwZW5zZUZhbGxiYWNrID0gMjtcbnZhciBzdXNwZW5zZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKERlZmF1bHRTdXNwZW5zZUNvbnRleHQpO1xuZnVuY3Rpb24gaGFzU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIGZsYWcpIHtcbiAgcmV0dXJuIChwYXJlbnRDb250ZXh0ICYgZmxhZykgIT09IDA7XG59XG5mdW5jdGlvbiBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0ICYgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2s7XG59XG5mdW5jdGlvbiBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHNoYWxsb3dDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0ICYgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2sgfCBzaGFsbG93Q29udGV4dDtcbn1cbmZ1bmN0aW9uIGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgc3VidHJlZUNvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgfCBzdWJ0cmVlQ29udGV4dDtcbn1cbmZ1bmN0aW9uIHB1c2hTdXNwZW5zZUNvbnRleHQoZmliZXIsIG5ld0NvbnRleHQpIHtcbiAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBuZXdDb250ZXh0LCBmaWJlcik7XG59XG5mdW5jdGlvbiBwb3BTdXNwZW5zZUNvbnRleHQoZmliZXIpIHtcbiAgcG9wKHN1c3BlbnNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKHdvcmtJblByb2dyZXNzLCBoYXNJbnZpc2libGVQYXJlbnQpIHtcbiAgLy8gSWYgaXQgd2FzIHRoZSBwcmltYXJ5IGNoaWxkcmVuIHRoYXQganVzdCBzdXNwZW5kZWQsIGNhcHR1cmUgYW5kIHJlbmRlciB0aGVcbiAgLy8gZmFsbGJhY2suIE90aGVyd2lzZSwgZG9uJ3QgY2FwdHVyZSBhbmQgYnViYmxlIHRvIHRoZSBuZXh0IGJvdW5kYXJ5LlxuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV4dFN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAvLyBBIGRlaHlkcmF0ZWQgYm91bmRhcnkgYWx3YXlzIGNhcHR1cmVzLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wczsgLy8gUmVndWxhciBib3VuZGFyaWVzIGFsd2F5cyBjYXB0dXJlLlxuXG4gIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiBpdCdzIGEgYm91bmRhcnkgd2Ugc2hvdWxkIGF2b2lkLCB0aGVuIHdlIHByZWZlciB0byBidWJibGUgdXAgdG8gdGhlXG59XG5mdW5jdGlvbiBmaW5kRmlyc3RTdXNwZW5kZWQocm93KSB7XG4gIHZhciBub2RlID0gcm93O1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGRlaHlkcmF0ZWQgPSBzdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChkZWh5ZHJhdGVkID09PSBudWxsIHx8IGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoZGVoeWRyYXRlZCkgfHwgaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soZGVoeWRyYXRlZCkpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlTGlzdENvbXBvbmVudCAmJiAvLyByZXZlYWxPcmRlciB1bmRlZmluZWQgY2FuJ3QgYmUgdHJ1c3RlZCBiZWNhdXNlIGl0IGRvbid0XG4gICAgLy8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGl0IHN1c3BlbmRlZCBvciBub3QuXG4gICAgbm9kZS5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBkaWRTdXNwZW5kID0gKG5vZGUuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgICAgaWYgKGRpZFN1c3BlbmQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSByb3cpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gcm93KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIE5vRmxhZ3MkMSA9XG4vKiAgICovXG4wOyAvLyBSZXByZXNlbnRzIHdoZXRoZXIgZWZmZWN0IHNob3VsZCBmaXJlLlxuXG52YXIgSGFzRWZmZWN0ID1cbi8qICovXG4xOyAvLyBSZXByZXNlbnRzIHRoZSBwaGFzZSBpbiB3aGljaCB0aGUgZWZmZWN0IChub3QgdGhlIGNsZWFuLXVwKSBmaXJlcy5cblxudmFyIEluc2VydGlvbiA9XG4vKiAgKi9cbjI7XG52YXIgTGF5b3V0ID1cbi8qICAgICovXG40O1xudmFyIFBhc3NpdmUkMSA9XG4vKiAgICovXG44O1xuXG4vLyBhbmQgc2hvdWxkIGJlIHJlc2V0IGJlZm9yZSBzdGFydGluZyBhIG5ldyByZW5kZXIuXG4vLyBUaGlzIHRyYWNrcyB3aGljaCBtdXRhYmxlIHNvdXJjZXMgbmVlZCB0byBiZSByZXNldCBhZnRlciBhIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzU291cmNlcyA9IFtdO1xuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtdXRhYmxlU291cmNlID0gd29ya0luUHJvZ3Jlc3NTb3VyY2VzW2ldO1xuXG4gICAge1xuICAgICAgbXV0YWJsZVNvdXJjZS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aCA9IDA7XG59XG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmVyc2lvbiB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nIG1hdGNoZXMgdGhlIG9uZVxuLy8gdGhhdCBpcyBldmVudHVhbGx5IHJlYWQgZHVyaW5nIGh5ZHJhdGlvbi5cbi8vIElmIHRoZXkgZG9uJ3QgbWF0Y2ggdGhlcmUncyBhIHBvdGVudGlhbCB0ZWFyIGFuZCBhIGZ1bGwgZGVvcHQgcmVuZGVyIGlzIHJlcXVpcmVkLlxuXG5mdW5jdGlvbiByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSkge1xuICB2YXIgZ2V0VmVyc2lvbiA9IG11dGFibGVTb3VyY2UuX2dldFZlcnNpb247XG4gIHZhciB2ZXJzaW9uID0gZ2V0VmVyc2lvbihtdXRhYmxlU291cmNlLl9zb3VyY2UpOyAvLyBUT0RPIENsZWFyIHRoaXMgZGF0YSBvbmNlIGFsbCBwZW5kaW5nIGh5ZHJhdGlvbiB3b3JrIGlzIGZpbmlzaGVkLlxuICAvLyBSZXRhaW5pbmcgaXQgZm9yZXZlciBtYXkgaW50ZXJmZXJlIHdpdGggR0MuXG5cbiAgaWYgKHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9PSBudWxsKSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gW211dGFibGVTb3VyY2UsIHZlcnNpb25dO1xuICB9IGVsc2Uge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG11dGFibGVTb3VyY2UsIHZlcnNpb24pO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3Q7XG5cbntcbiAgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG4vLyBUaGVzZSBhcmUgc2V0IHJpZ2h0IGJlZm9yZSBjYWxsaW5nIHRoZSBjb21wb25lbnQuXG52YXIgcmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci4gSSd2ZSBuYW1lZCBpdCBkaWZmZXJlbnRseSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tXG4vLyB0aGUgd29yay1pbi1wcm9ncmVzcyBob29rLlxuXG52YXIgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7IC8vIEhvb2tzIGFyZSBzdG9yZWQgYXMgYSBsaW5rZWQgbGlzdCBvbiB0aGUgZmliZXIncyBtZW1vaXplZFN0YXRlIGZpZWxkLiBUaGVcbi8vIGN1cnJlbnQgaG9vayBsaXN0IGlzIHRoZSBsaXN0IHRoYXQgYmVsb25ncyB0byB0aGUgY3VycmVudCBmaWJlci4gVGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGhvb2sgbGlzdCBpcyBhIG5ldyBsaXN0IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG5cbnZhciBjdXJyZW50SG9vayA9IG51bGw7XG52YXIgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDsgLy8gV2hldGhlciBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBhdCBhbnkgcG9pbnQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIFRoaXNcbi8vIGRvZXMgbm90IGdldCByZXNldCBpZiB3ZSBkbyBhbm90aGVyIHJlbmRlciBwYXNzOyBvbmx5IHdoZW4gd2UncmUgY29tcGxldGVseVxuLy8gZmluaXNoZWQgZXZhbHVhdGluZyB0aGlzIGNvbXBvbmVudC4gVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gc28gd2Uga25vd1xuLy8gd2hldGhlciB3ZSBuZWVkIHRvIGNsZWFyIHJlbmRlciBwaGFzZSB1cGRhdGVzIGFmdGVyIGEgdGhyb3cuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7IC8vIFdoZXJlIGFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIG9ubHkgZHVyaW5nIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzLiBUaGlzXG4vLyBnZXRzIHJlc2V0IGFmdGVyIGVhY2ggYXR0ZW1wdC5cbi8vIFRPRE86IE1heWJlIHRoZXJlJ3Mgc29tZSB3YXkgdG8gY29uc29saWRhdGUgdGhpcyB3aXRoXG4vLyBgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZWAuIE9yIHdpdGggYG51bWJlck9mUmVSZW5kZXJzYC5cblxudmFyIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlOyAvLyBDb3VudHMgdGhlIG51bWJlciBvZiB1c2VJZCBob29rcyBpbiB0aGlzIGNvbXBvbmVudC5cblxudmFyIGxvY2FsSWRDb3VudGVyID0gMDsgLy8gVXNlZCBmb3IgaWRzIHRoYXQgYXJlIGdlbmVyYXRlZCBjb21wbGV0ZWx5IGNsaWVudC1zaWRlIChpLmUuIG5vdCBkdXJpbmdcbi8vIGh5ZHJhdGlvbikuIFRoaXMgY291bnRlciBpcyBnbG9iYWwsIHNvIGNsaWVudCBpZHMgYXJlIG5vdCBzdGFibGUgYWNyb3NzXG4vLyByZW5kZXIgYXR0ZW1wdHMuXG5cbnZhciBnbG9iYWxDbGllbnRJZENvdW50ZXIgPSAwO1xudmFyIFJFX1JFTkRFUl9MSU1JVCA9IDI1OyAvLyBJbiBERVYsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgcHJpbWl0aXZlIGhvb2tcblxudmFyIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDsgLy8gSW4gREVWLCB0aGlzIGxpc3QgZW5zdXJlcyB0aGF0IGhvb2tzIGFyZSBjYWxsZWQgaW4gdGhlIHNhbWUgb3JkZXIgYmV0d2VlbiByZW5kZXJzLlxuLy8gVGhlIGxpc3Qgc3RvcmVzIHRoZSBvcmRlciBvZiBob29rcyB1c2VkIGR1cmluZyB0aGUgaW5pdGlhbCByZW5kZXIgKG1vdW50KS5cbi8vIFN1YnNlcXVlbnQgcmVuZGVycyAodXBkYXRlcykgcmVmZXJlbmNlIHRoaXMgbGlzdC5cblxudmFyIGhvb2tUeXBlc0RldiA9IG51bGw7XG52YXIgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gSW4gREVWLCB0aGlzIHRyYWNrcyB3aGV0aGVyIGN1cnJlbnRseSByZW5kZXJpbmcgY29tcG9uZW50IG5lZWRzIHRvIGlnbm9yZVxuLy8gdGhlIGRlcGVuZGVuY2llcyBmb3IgSG9va3MgdGhhdCBuZWVkIHRoZW0gKGUuZy4gdXNlRWZmZWN0IG9yIHVzZU1lbW8pLlxuLy8gV2hlbiB0cnVlLCBzdWNoIEhvb2tzIHdpbGwgYWx3YXlzIGJlIFwicmVtb3VudGVkXCIuIE9ubHkgdXNlZCBkdXJpbmcgaG90IHJlbG9hZC5cblxudmFyIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG5cbmZ1bmN0aW9uIG1vdW50SG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ID09PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNEZXYgPSBbaG9va05hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rVHlwZXNEZXYucHVzaChob29rTmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYrKztcblxuICAgICAgaWYgKGhvb2tUeXBlc0Rldltob29rVHlwZXNVcGRhdGVJbmRleERldl0gIT09IGhvb2tOYW1lKSB7XG4gICAgICAgIHdhcm5Pbkhvb2tNaXNtYXRjaEluRGV2KGhvb2tOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcykge1xuICB7XG4gICAgaWYgKGRlcHMgIT09IHVuZGVmaW5lZCAmJiBkZXBzICE9PSBudWxsICYmICFpc0FycmF5KGRlcHMpKSB7XG4gICAgICAvLyBWZXJpZnkgZGVwcywgYnV0IG9ubHkgb24gbW91bnQgdG8gYXZvaWQgZXh0cmEgY2hlY2tzLlxuICAgICAgLy8gSXQncyB1bmxpa2VseSB0aGVpciB0eXBlIHdvdWxkIGNoYW5nZSBhcyB1c3VhbGx5IHlvdSBkZWZpbmUgdGhlbSBpbmxpbmUuXG4gICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCB0aGF0IGlzIG5vdCBhbiBhcnJheSAoaW5zdGVhZCwgcmVjZWl2ZWQgYCVzYCkuIFdoZW4gJyArICdzcGVjaWZpZWQsIHRoZSBmaW5hbCBhcmd1bWVudCBtdXN0IGJlIGFuIGFycmF5LicsIGN1cnJlbnRIb29rTmFtZUluRGV2LCB0eXBlb2YgZGVwcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Pbkhvb2tNaXNtYXRjaEluRGV2KGN1cnJlbnRIb29rTmFtZSkge1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpO1xuXG4gICAgaWYgKCFkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB0YWJsZSA9ICcnO1xuICAgICAgICB2YXIgc2Vjb25kQ29sdW1uU3RhcnQgPSAzMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBob29rVHlwZXNVcGRhdGVJbmRleERldjsgaSsrKSB7XG4gICAgICAgICAgdmFyIG9sZEhvb2tOYW1lID0gaG9va1R5cGVzRGV2W2ldO1xuICAgICAgICAgIHZhciBuZXdIb29rTmFtZSA9IGkgPT09IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID8gY3VycmVudEhvb2tOYW1lIDogb2xkSG9va05hbWU7XG4gICAgICAgICAgdmFyIHJvdyA9IGkgKyAxICsgXCIuIFwiICsgb2xkSG9va05hbWU7IC8vIEV4dHJhIHNwYWNlIHNvIHNlY29uZCBjb2x1bW4gbGluZXMgdXBcbiAgICAgICAgICAvLyBsb2wgQCBJRSBub3Qgc3VwcG9ydGluZyBTdHJpbmcjcmVwZWF0XG5cbiAgICAgICAgICB3aGlsZSAocm93Lmxlbmd0aCA8IHNlY29uZENvbHVtblN0YXJ0KSB7XG4gICAgICAgICAgICByb3cgKz0gJyAnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdyArPSBuZXdIb29rTmFtZSArICdcXG4nO1xuICAgICAgICAgIHRhYmxlICs9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCdSZWFjdCBoYXMgZGV0ZWN0ZWQgYSBjaGFuZ2UgaW4gdGhlIG9yZGVyIG9mIEhvb2tzIGNhbGxlZCBieSAlcy4gJyArICdUaGlzIHdpbGwgbGVhZCB0byBidWdzIGFuZCBlcnJvcnMgaWYgbm90IGZpeGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHRoZSBSdWxlcyBvZiBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzXFxuXFxuJyArICcgICBQcmV2aW91cyByZW5kZXIgICAgICAgICAgICBOZXh0IHJlbmRlclxcbicgKyAnICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyArICclcycgKyAnICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXFxuJywgY29tcG9uZW50TmFtZSwgdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvcicgKyAnIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4nICsgJzIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4nICsgJzMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLicpO1xufVxuXG5mdW5jdGlvbiBhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSB7XG4gIHtcbiAgICBpZiAoaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMpIHtcbiAgICAgIC8vIE9ubHkgdHJ1ZSB3aGVuIHRoaXMgY29tcG9uZW50IGlzIGJlaW5nIGhvdCByZWxvYWRlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJldkRlcHMgPT09IG51bGwpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCBub3QgZHVyaW5nICcgKyAndGhlIHByZXZpb3VzIHJlbmRlci4gRXZlbiB0aG91Z2ggdGhlIGZpbmFsIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCAnICsgJ2l0cyB0eXBlIGNhbm5vdCBjaGFuZ2UgYmV0d2VlbiByZW5kZXJzLicsIGN1cnJlbnRIb29rTmFtZUluRGV2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIGNvbXBhcmluZyBsZW5ndGhzIGluIHByb2QgYmVjYXVzZSB0aGVzZSBhcnJheXMgc2hvdWxkIGJlXG4gICAgLy8gcGFzc2VkIGlubGluZS5cbiAgICBpZiAobmV4dERlcHMubGVuZ3RoICE9PSBwcmV2RGVwcy5sZW5ndGgpIHtcbiAgICAgIGVycm9yKCdUaGUgZmluYWwgYXJndW1lbnQgcGFzc2VkIHRvICVzIGNoYW5nZWQgc2l6ZSBiZXR3ZWVuIHJlbmRlcnMuIFRoZSAnICsgJ29yZGVyIGFuZCBzaXplIG9mIHRoaXMgYXJyYXkgbXVzdCByZW1haW4gY29uc3RhbnQuXFxuXFxuJyArICdQcmV2aW91czogJXNcXG4nICsgJ0luY29taW5nOiAlcycsIGN1cnJlbnRIb29rTmFtZUluRGV2LCBcIltcIiArIHByZXZEZXBzLmpvaW4oJywgJykgKyBcIl1cIiwgXCJbXCIgKyBuZXh0RGVwcy5qb2luKCcsICcpICsgXCJdXCIpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldkRlcHMubGVuZ3RoICYmIGkgPCBuZXh0RGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvYmplY3RJcyhuZXh0RGVwc1tpXSwgcHJldkRlcHNbaV0pKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBzZWNvbmRBcmcsIG5leHRSZW5kZXJMYW5lcykge1xuICByZW5kZXJMYW5lcyA9IG5leHRSZW5kZXJMYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5fZGVidWdIb29rVHlwZXMgOiBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIFVzZWQgZm9yIGhvdCByZWxvYWRpbmc6XG5cbiAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXNldFxuICAvLyBjdXJyZW50SG9vayA9IG51bGw7XG4gIC8vIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gIC8vIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgLy8gbG9jYWxJZENvdW50ZXIgPSAwO1xuICAvLyBUT0RPIFdhcm4gaWYgbm8gaG9va3MgYXJlIHVzZWQgYXQgYWxsIGR1cmluZyBtb3VudCwgdGhlbiBzb21lIGFyZSB1c2VkIGR1cmluZyB1cGRhdGUuXG4gIC8vIEN1cnJlbnRseSB3ZSB3aWxsIGlkZW50aWZ5IHRoZSB1cGRhdGUgcmVuZGVyIGFzIGEgbW91bnQgYmVjYXVzZSBtZW1vaXplZFN0YXRlID09PSBudWxsLlxuICAvLyBUaGlzIGlzIHRyaWNreSBiZWNhdXNlIGl0J3MgdmFsaWQgZm9yIGNlcnRhaW4gdHlwZXMgb2YgY29tcG9uZW50cyAoZS5nLiBSZWFjdC5sYXp5KVxuICAvLyBVc2luZyBtZW1vaXplZFN0YXRlIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBtb3VudC91cGRhdGUgb25seSB3b3JrcyBpZiBhdCBsZWFzdCBvbmUgc3RhdGVmdWwgaG9vayBpcyB1c2VkLlxuICAvLyBOb24tc3RhdGVmdWwgaG9va3MgKGUuZy4gY29udGV4dCkgZG9uJ3QgZ2V0IGFkZGVkIHRvIG1lbW9pemVkU3RhdGUsXG4gIC8vIHNvIG1lbW9pemVkU3RhdGUgd291bGQgYmUgbnVsbCBkdXJpbmcgdXBkYXRlcyBhbmQgbW91bnRzLlxuXG4gIHtcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICB9IGVsc2UgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGhhbmRsZXMgYW4gZWRnZSBjYXNlIHdoZXJlIGEgY29tcG9uZW50IGlzIHVwZGF0aW5nLFxuICAgICAgLy8gYnV0IG5vIHN0YXRlZnVsIGhvb2tzIGhhdmUgYmVlbiB1c2VkLlxuICAgICAgLy8gV2Ugd2FudCB0byBtYXRjaCB0aGUgcHJvZHVjdGlvbiBjb2RlIGJlaGF2aW9yICh3aGljaCB3aWxsIHVzZSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50KSxcbiAgICAgIC8vIGJ1dCB3aXRoIHRoZSBleHRyYSBERVYgdmFsaWRhdGlvbiB0byBlbnN1cmUgaG9va3Mgb3JkZXJpbmcgaGFzbid0IGNoYW5nZWQuXG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgZG9lcyB0aGF0LlxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICB9XG4gIH1cblxuICB2YXIgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7IC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhIHJlbmRlciBwaGFzZSB1cGRhdGVcblxuICBpZiAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKSB7XG4gICAgLy8gS2VlcCByZW5kZXJpbmcgaW4gYSBsb29wIGZvciBhcyBsb25nIGFzIHJlbmRlciBwaGFzZSB1cGRhdGVzIGNvbnRpbnVlIHRvXG4gICAgLy8gYmUgc2NoZWR1bGVkLiBVc2UgYSBjb3VudGVyIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuXG4gICAgdmFyIG51bWJlck9mUmVSZW5kZXJzID0gMDtcblxuICAgIGRvIHtcbiAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlO1xuICAgICAgbG9jYWxJZENvdW50ZXIgPSAwO1xuXG4gICAgICBpZiAobnVtYmVyT2ZSZVJlbmRlcnMgPj0gUkVfUkVOREVSX0xJTUlUKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVG9vIG1hbnkgcmUtcmVuZGVycy4gUmVhY3QgbGltaXRzIHRoZSBudW1iZXIgb2YgcmVuZGVycyB0byBwcmV2ZW50ICcgKyAnYW4gaW5maW5pdGUgbG9vcC4nKTtcbiAgICAgIH1cblxuICAgICAgbnVtYmVyT2ZSZVJlbmRlcnMgKz0gMTtcblxuICAgICAge1xuICAgICAgICAvLyBFdmVuIHdoZW4gaG90IHJlbG9hZGluZywgYWxsb3cgZGVwZW5kZW5jaWVzIHRvIHN0YWJpbGl6ZVxuICAgICAgICAvLyBhZnRlciBmaXJzdCByZW5kZXIgdG8gcHJldmVudCBpbmZpbml0ZSByZW5kZXIgcGhhc2UgdXBkYXRlcy5cbiAgICAgICAgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcbiAgICAgIH0gLy8gU3RhcnQgb3ZlciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RcblxuXG4gICAgICBjdXJyZW50SG9vayA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuXG4gICAgICB7XG4gICAgICAgIC8vIEFsc28gdmFsaWRhdGUgaG9vayBvcmRlciBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMuXG4gICAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgICB9XG5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA7XG4gICAgICBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTtcbiAgICB9IHdoaWxlIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpO1xuICB9IC8vIFdlIGNhbiBhc3N1bWUgdGhlIHByZXZpb3VzIGRpc3BhdGNoZXIgaXMgYWx3YXlzIHRoaXMgb25lLCBzaW5jZSB3ZSBzZXQgaXRcbiAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmNlLlxuXG5cbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0hvb2tUeXBlcyA9IGhvb2tUeXBlc0RldjtcbiAgfSAvLyBUaGlzIGNoZWNrIHVzZXMgY3VycmVudEhvb2sgc28gdGhhdCBpdCB3b3JrcyB0aGUgc2FtZSBpbiBERVYgYW5kIHByb2QgYnVuZGxlcy5cbiAgLy8gaG9va1R5cGVzRGV2IGNvdWxkIGNhdGNoIG1vcmUgY2FzZXMgKGUuZy4gY29udGV4dCkgYnV0IG9ubHkgaW4gREVWIGJ1bmRsZXMuXG5cblxuICB2YXIgZGlkUmVuZGVyVG9vRmV3SG9va3MgPSBjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBjdXJyZW50SG9vay5uZXh0ICE9PSBudWxsO1xuICByZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsO1xuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIENvbmZpcm0gdGhhdCBhIHN0YXRpYyBmbGFnIHdhcyBub3QgYWRkZWQgb3IgcmVtb3ZlZCBzaW5jZSB0aGUgbGFzdFxuICAgIC8vIHJlbmRlci4gSWYgdGhpcyBmaXJlcywgaXQgc3VnZ2VzdHMgdGhhdCB3ZSBpbmNvcnJlY3RseSByZXNldCB0aGUgc3RhdGljXG4gICAgLy8gZmxhZ3MgaW4gc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBjb2RlYmFzZS4gVGhpcyBoYXMgaGFwcGVuZWQgYmVmb3JlLCBmb3JcbiAgICAvLyBleGFtcGxlLCBpbiB0aGUgU3VzcGVuc2VMaXN0IGltcGxlbWVudGF0aW9uLlxuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZmxhZ3MgJiBTdGF0aWNNYXNrKSAhPT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgU3RhdGljTWFzaykgJiYgLy8gRGlzYWJsZSB0aGlzIHdhcm5pbmcgaW4gbGVnYWN5IG1vZGUsIGJlY2F1c2UgbGVnYWN5IFN1c3BlbnNlIGlzIHdlaXJkXG4gICAgLy8gYW5kIGNyZWF0ZXMgZmFsc2UgcG9zaXRpdmVzLiBUbyBtYWtlIHRoaXMgd29yayBpbiBsZWdhY3kgbW9kZSwgd2UnZFxuICAgIC8vIG5lZWQgdG8gbWFyayBmaWJlcnMgdGhhdCBjb21taXQgaW4gYW4gaW5jb21wbGV0ZSBzdGF0ZSwgc29tZWhvdy4gRm9yXG4gICAgLy8gbm93IEknbGwgZGlzYWJsZSB0aGUgd2FybmluZyB0aGF0IG1vc3Qgb2YgdGhlIGJ1Z3MgdGhhdCB3b3VsZCB0cmlnZ2VyXG4gICAgLy8gaXQgYXJlIGVpdGhlciBleGNsdXNpdmUgdG8gY29uY3VycmVudCBtb2RlIG9yIGV4aXN0IGluIGJvdGguXG4gICAgKGN1cnJlbnQubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICBlcnJvcignSW50ZXJuYWwgUmVhY3QgZXJyb3I6IEV4cGVjdGVkIHN0YXRpYyBmbGFnIHdhcyBtaXNzaW5nLiBQbGVhc2UgJyArICdub3RpZnkgdGhlIFJlYWN0IHRlYW0uJyk7XG4gICAgfVxuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBUaGlzIGlzIHJlc2V0IGJ5IGNoZWNrRGlkUmVuZGVySWRIb29rXG4gIC8vIGxvY2FsSWRDb3VudGVyID0gMDtcblxuICBpZiAoZGlkUmVuZGVyVG9vRmV3SG9va3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIGZld2VyIGhvb2tzIHRoYW4gZXhwZWN0ZWQuIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBhbiBhY2NpZGVudGFsICcgKyAnZWFybHkgcmV0dXJuIHN0YXRlbWVudC4nKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGNoZWNrRGlkUmVuZGVySWRIb29rKCkge1xuICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlcnkgcmVuZGVyV2l0aEhvb2tzIGNhbGwuXG4gIC8vIENvbmNlcHR1YWxseSwgaXQncyBwYXJ0IG9mIHRoZSByZXR1cm4gdmFsdWUgb2YgcmVuZGVyV2l0aEhvb2tzOyBpdCdzIG9ubHkgYVxuICAvLyBzZXBhcmF0ZSBmdW5jdGlvbiB0byBhdm9pZCB1c2luZyBhbiBhcnJheSB0dXBsZS5cbiAgdmFyIGRpZFJlbmRlcklkSG9vayA9IGxvY2FsSWRDb3VudGVyICE9PSAwO1xuICBsb2NhbElkQ291bnRlciA9IDA7XG4gIHJldHVybiBkaWRSZW5kZXJJZEhvb2s7XG59XG5mdW5jdGlvbiBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byByZXNldCB0aGUgZmxhZ3MgaGVyZSwgYmVjYXVzZSB0aGV5J3JlIHJlc2V0IGluIHRoZVxuICAvLyBjb21wbGV0ZSBwaGFzZSAoYnViYmxlUHJvcGVydGllcykuXG5cbiAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfihNb3VudFBhc3NpdmVEZXYgfCBNb3VudExheW91dERldiB8IFBhc3NpdmUgfCBVcGRhdGUpO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH4oUGFzc2l2ZSB8IFVwZGF0ZSk7XG4gIH1cblxuICBjdXJyZW50LmxhbmVzID0gcmVtb3ZlTGFuZXMoY3VycmVudC5sYW5lcywgbGFuZXMpO1xufVxuZnVuY3Rpb24gcmVzZXRIb29rc0FmdGVyVGhyb3coKSB7XG4gIC8vIFdlIGNhbiBhc3N1bWUgdGhlIHByZXZpb3VzIGRpc3BhdGNoZXIgaXMgYWx3YXlzIHRoaXMgb25lLCBzaW5jZSB3ZSBzZXQgaXRcbiAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmNlLlxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSkge1xuICAgIC8vIFRoZXJlIHdlcmUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciB0aGlzIHJlbmRlclxuICAgIC8vIHBoYXNlLCB3aGljaCB3ZSBhcmUgbm93IGFib3J0aW5nLiBSZW1vdmUgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWVzIHNvXG4gICAgLy8gdGhleSBkbyBub3QgcGVyc2lzdCB0byB0aGUgbmV4dCByZW5kZXIuIERvIG5vdCByZW1vdmUgdXBkYXRlcyBmcm9tIGhvb2tzXG4gICAgLy8gdGhhdCB3ZXJlbid0IHByb2Nlc3NlZC5cbiAgICAvL1xuICAgIC8vIE9ubHkgcmVzZXQgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWUgaWYgaXQgaGFzIGEgY2xvbmUuIElmIGl0IGRvZXNcbiAgICAvLyBub3QgaGF2ZSBhIGNsb25lLCB0aGF0IG1lYW5zIGl0IHdhc24ndCBwcm9jZXNzZWQsIGFuZCB0aGUgdXBkYXRlcyB3ZXJlXG4gICAgLy8gc2NoZWR1bGVkIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgdmFyIGhvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICAgICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBob29rID0gaG9vay5uZXh0O1xuICAgIH1cblxuICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgfVxuXG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbiAgbG9jYWxJZENvdW50ZXIgPSAwO1xufVxuXG5mdW5jdGlvbiBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgdmFyIGhvb2sgPSB7XG4gICAgbWVtb2l6ZWRTdGF0ZTogbnVsbCxcbiAgICBiYXNlU3RhdGU6IG51bGwsXG4gICAgYmFzZVF1ZXVlOiBudWxsLFxuICAgIHF1ZXVlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgaG9vayBpbiB0aGUgbGlzdFxuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZSA9IHdvcmtJblByb2dyZXNzSG9vayA9IGhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3RcbiAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCA9IGhvb2s7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NIb29rO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBib3RoIGZvciB1cGRhdGVzIGFuZCBmb3IgcmUtcmVuZGVycyB0cmlnZ2VyZWQgYnkgYVxuICAvLyByZW5kZXIgcGhhc2UgdXBkYXRlLiBJdCBhc3N1bWVzIHRoZXJlIGlzIGVpdGhlciBhIGN1cnJlbnQgaG9vayB3ZSBjYW5cbiAgLy8gY2xvbmUsIG9yIGEgd29yay1pbi1wcm9ncmVzcyBob29rIGZyb20gYSBwcmV2aW91cyByZW5kZXIgcGFzcyB0aGF0IHdlIGNhblxuICAvLyB1c2UgYXMgYSBiYXNlLiBXaGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGJhc2UgbGlzdCwgd2UgbXVzdCBzd2l0Y2ggdG9cbiAgLy8gdGhlIGRpc3BhdGNoZXIgdXNlZCBmb3IgbW91bnRzLlxuICB2YXIgbmV4dEN1cnJlbnRIb29rO1xuXG4gIGlmIChjdXJyZW50SG9vayA9PT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50ID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Q3VycmVudEhvb2sgPSBudWxsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50SG9vay5uZXh0O1xuICB9XG5cbiAgdmFyIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2s7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGU7XG4gIH0gZWxzZSB7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICB9XG5cbiAgaWYgKG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgIT09IG51bGwpIHtcbiAgICAvLyBUaGVyZSdzIGFscmVhZHkgYSB3b3JrLWluLXByb2dyZXNzLiBSZXVzZSBpdC5cbiAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgfSBlbHNlIHtcbiAgICAvLyBDbG9uZSBmcm9tIHRoZSBjdXJyZW50IGhvb2suXG4gICAgaWYgKG5leHRDdXJyZW50SG9vayA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW5kZXJlZCBtb3JlIGhvb2tzIHRoYW4gZHVyaW5nIHRoZSBwcmV2aW91cyByZW5kZXIuJyk7XG4gICAgfVxuXG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gICAgdmFyIG5ld0hvb2sgPSB7XG4gICAgICBtZW1vaXplZFN0YXRlOiBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlLFxuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50SG9vay5iYXNlU3RhdGUsXG4gICAgICBiYXNlUXVldWU6IGN1cnJlbnRIb29rLmJhc2VRdWV1ZSxcbiAgICAgIHF1ZXVlOiBjdXJyZW50SG9vay5xdWV1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgaG9vayBpbiB0aGUgbGlzdC5cbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZSA9IHdvcmtJblByb2dyZXNzSG9vayA9IG5ld0hvb2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBuZXdIb29rO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSB7XG4gIHJldHVybiB7XG4gICAgbGFzdEVmZmVjdDogbnVsbCxcbiAgICBzdG9yZXM6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmFzaWNTdGF0ZVJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAvLyAkRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSBtaXhlZCB0eXBlc1xuICByZXR1cm4gdHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGFjdGlvbihzdGF0ZSkgOiBhY3Rpb247XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIGluaXRpYWxTdGF0ZTtcblxuICBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdChpbml0aWFsQXJnKTtcbiAgfSBlbHNlIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsQXJnO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IHJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICBob29rLnF1ZXVlID0gcXVldWU7XG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoID0gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAocXVldWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyO1xuICB2YXIgY3VycmVudCA9IGN1cnJlbnRIb29rOyAvLyBUaGUgbGFzdCByZWJhc2UgdXBkYXRlIHRoYXQgaXMgTk9UIHBhcnQgb2YgdGhlIGJhc2Ugc3RhdGUuXG5cbiAgdmFyIGJhc2VRdWV1ZSA9IGN1cnJlbnQuYmFzZVF1ZXVlOyAvLyBUaGUgbGFzdCBwZW5kaW5nIHVwZGF0ZSB0aGF0IGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG5cbiAgdmFyIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmdRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgbmV3IHVwZGF0ZXMgdGhhdCBoYXZlbid0IGJlZW4gcHJvY2Vzc2VkIHlldC5cbiAgICAvLyBXZSdsbCBhZGQgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cbiAgICBpZiAoYmFzZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAvLyBNZXJnZSB0aGUgcGVuZGluZyBxdWV1ZSBhbmQgdGhlIGJhc2UgcXVldWUuXG4gICAgICB2YXIgYmFzZUZpcnN0ID0gYmFzZVF1ZXVlLm5leHQ7XG4gICAgICB2YXIgcGVuZGluZ0ZpcnN0ID0gcGVuZGluZ1F1ZXVlLm5leHQ7XG4gICAgICBiYXNlUXVldWUubmV4dCA9IHBlbmRpbmdGaXJzdDtcbiAgICAgIHBlbmRpbmdRdWV1ZS5uZXh0ID0gYmFzZUZpcnN0O1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChjdXJyZW50LmJhc2VRdWV1ZSAhPT0gYmFzZVF1ZXVlKSB7XG4gICAgICAgIC8vIEludGVybmFsIGludmFyaWFudCB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBmZWFzaWJseSBjb3VsZCBpblxuICAgICAgICAvLyB0aGUgZnV0dXJlIGlmIHdlIGltcGxlbWVudCByZXN1bWluZywgb3Igc29tZSBmb3JtIG9mIHRoYXQuXG4gICAgICAgIGVycm9yKCdJbnRlcm5hbCBlcnJvcjogRXhwZWN0ZWQgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSB0byBiZSBhIGNsb25lLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudC5iYXNlUXVldWUgPSBiYXNlUXVldWUgPSBwZW5kaW5nUXVldWU7XG4gICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoYmFzZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gV2UgaGF2ZSBhIHF1ZXVlIHRvIHByb2Nlc3MuXG4gICAgdmFyIGZpcnN0ID0gYmFzZVF1ZXVlLm5leHQ7XG4gICAgdmFyIG5ld1N0YXRlID0gY3VycmVudC5iYXNlU3RhdGU7XG4gICAgdmFyIG5ld0Jhc2VTdGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUZpcnN0ID0gbnVsbDtcbiAgICB2YXIgbmV3QmFzZVF1ZXVlTGFzdCA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0O1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHVwZGF0ZUxhbmUgPSB1cGRhdGUubGFuZTtcblxuICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMocmVuZGVyTGFuZXMsIHVwZGF0ZUxhbmUpKSB7XG4gICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgLy8gc2tpcHBlZCB1cGRhdGUsIHRoZSBwcmV2aW91cyB1cGRhdGUvc3RhdGUgaXMgdGhlIG5ldyBiYXNlXG4gICAgICAgIC8vIHVwZGF0ZS9zdGF0ZS5cbiAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgIGxhbmU6IHVwZGF0ZUxhbmUsXG4gICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgIGhhc0VhZ2VyU3RhdGU6IHVwZGF0ZS5oYXNFYWdlclN0YXRlLFxuICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUZpcnN0ID0gbmV3QmFzZVF1ZXVlTGFzdCA9IGNsb25lO1xuICAgICAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBjbG9uZTtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG4gICAgICAgIC8vIFRPRE86IERvbid0IG5lZWQgdG8gYWNjdW11bGF0ZSB0aGlzLiBJbnN0ZWFkLCB3ZSBjYW4gcmVtb3ZlXG4gICAgICAgIC8vIHJlbmRlckxhbmVzIGZyb20gdGhlIG9yaWdpbmFsIGxhbmVzLlxuXG5cbiAgICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgdXBkYXRlTGFuZSk7XG4gICAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXModXBkYXRlTGFuZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIGhhdmUgc3VmZmljaWVudCBwcmlvcml0eS5cbiAgICAgICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2Nsb25lID0ge1xuICAgICAgICAgICAgLy8gVGhpcyB1cGRhdGUgaXMgZ29pbmcgdG8gYmUgY29tbWl0dGVkIHNvIHdlIG5ldmVyIHdhbnQgdW5jb21taXRcbiAgICAgICAgICAgIC8vIGl0LiBVc2luZyBOb0xhbmUgd29ya3MgYmVjYXVzZSAwIGlzIGEgc3Vic2V0IG9mIGFsbCBiaXRtYXNrcywgc29cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBuZXZlciBiZSBza2lwcGVkIGJ5IHRoZSBjaGVjayBhYm92ZS5cbiAgICAgICAgICAgIGxhbmU6IE5vTGFuZSxcbiAgICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICAgIGhhc0VhZ2VyU3RhdGU6IHVwZGF0ZS5oYXNFYWdlclN0YXRlLFxuICAgICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBpZiAodXBkYXRlLmhhc0VhZ2VyU3RhdGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHVwZGF0ZSBpcyBhIHN0YXRlIHVwZGF0ZSAobm90IGEgcmVkdWNlcikgYW5kIHdhcyBwcm9jZXNzZWQgZWFnZXJseSxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXNlIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlXG4gICAgICAgICAgbmV3U3RhdGUgPSB1cGRhdGUuZWFnZXJTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYWN0aW9uID0gdXBkYXRlLmFjdGlvbjtcbiAgICAgICAgICBuZXdTdGF0ZSA9IHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgfSB3aGlsZSAodXBkYXRlICE9PSBudWxsICYmIHVwZGF0ZSAhPT0gZmlyc3QpO1xuXG4gICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBuZXdCYXNlUXVldWVGaXJzdDtcbiAgICB9IC8vIE1hcmsgdGhhdCB0aGUgZmliZXIgcGVyZm9ybWVkIHdvcmssIGJ1dCBvbmx5IGlmIHRoZSBuZXcgc3RhdGUgaXNcbiAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS5cblxuXG4gICAgaWYgKCFvYmplY3RJcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSkge1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICBob29rLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBob29rLmJhc2VRdWV1ZSA9IG5ld0Jhc2VRdWV1ZUxhc3Q7XG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBJbnRlcmxlYXZlZCB1cGRhdGVzIGFyZSBzdG9yZWQgb24gYSBzZXBhcmF0ZSBxdWV1ZS4gV2UgYXJlbid0IGdvaW5nIHRvXG4gIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzXG4gIC8vIGFyZSByZW1haW5pbmcuXG5cblxuICB2YXIgbGFzdEludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGxhc3RJbnRlcmxlYXZlZCAhPT0gbnVsbCkge1xuICAgIHZhciBpbnRlcmxlYXZlZCA9IGxhc3RJbnRlcmxlYXZlZDtcblxuICAgIGRvIHtcbiAgICAgIHZhciBpbnRlcmxlYXZlZExhbmUgPSBpbnRlcmxlYXZlZC5sYW5lO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgaW50ZXJsZWF2ZWRMYW5lKTtcbiAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoaW50ZXJsZWF2ZWRMYW5lKTtcbiAgICAgIGludGVybGVhdmVkID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICB9IHdoaWxlIChpbnRlcmxlYXZlZCAhPT0gbGFzdEludGVybGVhdmVkKTtcbiAgfSBlbHNlIGlmIChiYXNlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBgcXVldWUubGFuZXNgIGlzIHVzZWQgZm9yIGVudGFuZ2xpbmcgdHJhbnNpdGlvbnMuIFdlIGNhbiBzZXQgaXQgYmFjayB0b1xuICAgIC8vIHplcm8gb25jZSB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgcXVldWUubGFuZXMgPSBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjsgLy8gVGhpcyBpcyBhIHJlLXJlbmRlci4gQXBwbHkgdGhlIG5ldyByZW5kZXIgcGhhc2UgdXBkYXRlcyB0byB0aGUgcHJldmlvdXNcbiAgLy8gd29yay1pbi1wcm9ncmVzcyBob29rLlxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICB2YXIgbGFzdFJlbmRlclBoYXNlVXBkYXRlID0gcXVldWUucGVuZGluZztcbiAgdmFyIG5ld1N0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChsYXN0UmVuZGVyUGhhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgcXVldWUgZG9lc24ndCBwZXJzaXN0IHBhc3QgdGhpcyByZW5kZXIgcGFzcy5cbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICB2YXIgZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IGxhc3RSZW5kZXJQaGFzZVVwZGF0ZS5uZXh0O1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgLy8gUHJvY2VzcyB0aGlzIHJlbmRlciBwaGFzZSB1cGRhdGUuIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlXG4gICAgICAvLyBwcmlvcml0eSBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50XG4gICAgICAvLyByZW5kZXIncy5cbiAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgfSB3aGlsZSAodXBkYXRlICE9PSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlKTsgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlOyAvLyBEb24ndCBwZXJzaXN0IHRoZSBzdGF0ZSBhY2N1bXVsYXRlZCBmcm9tIHRoZSByZW5kZXIgcGhhc2UgdXBkYXRlcyB0b1xuICAgIC8vIHRoZSBiYXNlIHN0YXRlIHVubGVzcyB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgLy8gVE9ETzogTm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgZGVzaXJlZCBzZW1hbnRpY3MsIGJ1dCBpdCdzIHdoYXQgd2VcbiAgICAvLyBkbyBmb3IgZ0RTRlAuIEkgY2FuJ3QgcmVtZW1iZXIgd2h5LlxuXG4gICAgaWYgKGhvb2suYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICByZXR1cm4gW25ld1N0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIG1vdW50TXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlTXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZmliZXIgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0U25hcHNob3Q7XG4gIHZhciBpc0h5ZHJhdGluZyA9IGdldElzSHlkcmF0aW5nKCk7XG5cbiAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgaWYgKGdldFNlcnZlclNuYXBzaG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBnZXRTZXJ2ZXJTbmFwc2hvdCwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yICcgKyAnc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQuIFdpbGwgcmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuJyk7XG4gICAgfVxuXG4gICAgbmV4dFNuYXBzaG90ID0gZ2V0U2VydmVyU25hcHNob3QoKTtcblxuICAgIHtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgaWYgKG5leHRTbmFwc2hvdCAhPT0gZ2V0U2VydmVyU25hcHNob3QoKSkge1xuICAgICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNlcnZlclNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5leHRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICAgIHZhciBjYWNoZWRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAgICAgICAgaWYgKCFvYmplY3RJcyhuZXh0U25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSkge1xuICAgICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBVbmxlc3Mgd2UncmUgcmVuZGVyaW5nIGEgYmxvY2tpbmcgbGFuZSwgc2NoZWR1bGUgYSBjb25zaXN0ZW5jeSBjaGVjay5cbiAgICAvLyBSaWdodCBiZWZvcmUgY29tbWl0dGluZywgd2Ugd2lsbCB3YWxrIHRoZSB0cmVlIGFuZCBjaGVjayBpZiBhbnkgb2YgdGhlXG4gICAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZC5cbiAgICAvL1xuICAgIC8vIFdlIHdvbid0IGRvIHRoaXMgaWYgd2UncmUgaHlkcmF0aW5nIHNlcnZlci1yZW5kZXJlZCBjb250ZW50LCBiZWNhdXNlIGlmXG4gICAgLy8gdGhlIGNvbnRlbnQgaXMgc3RhbGUsIGl0J3MgYWxyZWFkeSB2aXNpYmxlIGFueXdheS4gSW5zdGVhZCB3ZSdsbCBwYXRjaFxuICAgIC8vIGl0IHVwIGluIGEgcGFzc2l2ZSBlZmZlY3QuXG5cblxuICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIHdvcmstaW4tcHJvZ3Jlc3Mgcm9vdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCByZW5kZXJMYW5lcykpIHtcbiAgICAgIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCBuZXh0U25hcHNob3QpO1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoZSBjdXJyZW50IHNuYXBzaG90IGZyb20gdGhlIHN0b3JlIG9uIGV2ZXJ5IHJlbmRlci4gVGhpcyBicmVha3MgdGhlXG4gIC8vIG5vcm1hbCBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3MgYmVjYXVzZSBzdG9yZSB1cGRhdGVzIGFyZVxuICAvLyBhbHdheXMgc3luY2hyb25vdXMuXG5cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXh0U25hcHNob3Q7XG4gIHZhciBpbnN0ID0ge1xuICAgIHZhbHVlOiBuZXh0U25hcHNob3QsXG4gICAgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90XG4gIH07XG4gIGhvb2sucXVldWUgPSBpbnN0OyAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZS5cblxuICBtb3VudEVmZmVjdChzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIHN1YnNjcmliZSksIFtzdWJzY3JpYmVdKTsgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIHVwZGF0ZSB0aGUgbXV0YWJsZSBpbnN0YW5jZSBmaWVsZHMuIFdlIHdpbGwgdXBkYXRlXG4gIC8vIHRoaXMgd2hlbmV2ZXIgc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgb3IgdmFsdWUgY2hhbmdlcy4gQmVjYXVzZSB0aGVyZSdzIG5vXG4gIC8vIGNsZWFuLXVwIGZ1bmN0aW9uLCBhbmQgd2UgdHJhY2sgdGhlIGRlcHMgY29ycmVjdGx5LCB3ZSBjYW4gY2FsbCBwdXNoRWZmZWN0XG4gIC8vIGRpcmVjdGx5LCB3aXRob3V0IHN0b3JpbmcgYW55IGFkZGl0aW9uYWwgc3RhdGUuIEZvciB0aGUgc2FtZSByZWFzb24sIHdlXG4gIC8vIGRvbid0IG5lZWQgdG8gc2V0IGEgc3RhdGljIGZsYWcsIGVpdGhlci5cbiAgLy8gVE9ETzogV2UgY2FuIG1vdmUgdGhpcyB0byB0aGUgcGFzc2l2ZSBwaGFzZSBvbmNlIHdlIGFkZCBhIHByZS1jb21taXRcbiAgLy8gY29uc2lzdGVuY3kgY2hlY2suIFNlZSB0aGUgbmV4dCBjb21tZW50LlxuXG4gIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmU7XG4gIHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgUGFzc2l2ZSQxLCB1cGRhdGVTdG9yZUluc3RhbmNlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpLCB1bmRlZmluZWQsIG51bGwpO1xuICByZXR1cm4gbmV4dFNuYXBzaG90O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZmliZXIgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpOyAvLyBSZWFkIHRoZSBjdXJyZW50IHNuYXBzaG90IGZyb20gdGhlIHN0b3JlIG9uIGV2ZXJ5IHJlbmRlci4gVGhpcyBicmVha3MgdGhlXG4gIC8vIG5vcm1hbCBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3MgYmVjYXVzZSBzdG9yZSB1cGRhdGVzIGFyZVxuICAvLyBhbHdheXMgc3luY2hyb25vdXMuXG5cbiAgdmFyIG5leHRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAge1xuICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgIHZhciBjYWNoZWRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAgICAgIGlmICghb2JqZWN0SXMobmV4dFNuYXBzaG90LCBjYWNoZWRTbmFwc2hvdCkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBwcmV2U25hcHNob3QgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzbmFwc2hvdENoYW5nZWQgPSAhb2JqZWN0SXMocHJldlNuYXBzaG90LCBuZXh0U25hcHNob3QpO1xuXG4gIGlmIChzbmFwc2hvdENoYW5nZWQpIHtcbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXh0U25hcHNob3Q7XG4gICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gaG9vay5xdWV1ZTtcbiAgdXBkYXRlRWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW3N1YnNjcmliZV0pOyAvLyBXaGVuZXZlciBnZXRTbmFwc2hvdCBvciBzdWJzY3JpYmUgY2hhbmdlcywgd2UgbmVlZCB0byBjaGVjayBpbiB0aGVcbiAgLy8gY29tbWl0IHBoYXNlIGlmIHRoZXJlIHdhcyBhbiBpbnRlcmxlYXZlZCBtdXRhdGlvbi4gSW4gY29uY3VycmVudCBtb2RlXG4gIC8vIHRoaXMgY2FuIGhhcHBlbiBhbGwgdGhlIHRpbWUsIGJ1dCBldmVuIGluIHN5bmNocm9ub3VzIG1vZGUsIGFuIGVhcmxpZXJcbiAgLy8gZWZmZWN0IG1heSBoYXZlIG11dGF0ZWQgdGhlIHN0b3JlLlxuXG4gIGlmIChpbnN0LmdldFNuYXBzaG90ICE9PSBnZXRTbmFwc2hvdCB8fCBzbmFwc2hvdENoYW5nZWQgfHwgLy8gQ2hlY2sgaWYgdGhlIHN1c2JjcmliZSBmdW5jdGlvbiBjaGFuZ2VkLiBXZSBjYW4gc2F2ZSBzb21lIG1lbW9yeSBieVxuICAvLyBjaGVja2luZyB3aGV0aGVyIHdlIHNjaGVkdWxlZCBhIHN1YnNjcmlwdGlvbiBlZmZlY3QgYWJvdmUuXG4gIHdvcmtJblByb2dyZXNzSG9vayAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzc0hvb2subWVtb2l6ZWRTdGF0ZS50YWcgJiBIYXNFZmZlY3QpIHtcbiAgICBmaWJlci5mbGFncyB8PSBQYXNzaXZlO1xuICAgIHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgUGFzc2l2ZSQxLCB1cGRhdGVTdG9yZUluc3RhbmNlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpLCB1bmRlZmluZWQsIG51bGwpOyAvLyBVbmxlc3Mgd2UncmUgcmVuZGVyaW5nIGEgYmxvY2tpbmcgbGFuZSwgc2NoZWR1bGUgYSBjb25zaXN0ZW5jeSBjaGVjay5cbiAgICAvLyBSaWdodCBiZWZvcmUgY29tbWl0dGluZywgd2Ugd2lsbCB3YWxrIHRoZSB0cmVlIGFuZCBjaGVjayBpZiBhbnkgb2YgdGhlXG4gICAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZC5cblxuICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIHdvcmstaW4tcHJvZ3Jlc3Mgcm9vdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCByZW5kZXJMYW5lcykpIHtcbiAgICAgIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCBuZXh0U25hcHNob3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0U25hcHNob3Q7XG59XG5cbmZ1bmN0aW9uIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCByZW5kZXJlZFNuYXBzaG90KSB7XG4gIGZpYmVyLmZsYWdzIHw9IFN0b3JlQ29uc2lzdGVuY3k7XG4gIHZhciBjaGVjayA9IHtcbiAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QsXG4gICAgdmFsdWU6IHJlbmRlcmVkU25hcHNob3RcbiAgfTtcbiAgdmFyIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZTtcblxuICBpZiAoY29tcG9uZW50VXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKTtcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlID0gY29tcG9uZW50VXBkYXRlUXVldWU7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUuc3RvcmVzID0gW2NoZWNrXTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc3RvcmVzID0gY29tcG9uZW50VXBkYXRlUXVldWUuc3RvcmVzO1xuXG4gICAgaWYgKHN0b3JlcyA9PT0gbnVsbCkge1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUuc3RvcmVzID0gW2NoZWNrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcmVzLnB1c2goY2hlY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTdG9yZUluc3RhbmNlKGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSB7XG4gIC8vIFRoZXNlIGFyZSB1cGRhdGVkIGluIHRoZSBwYXNzaXZlIHBoYXNlXG4gIGluc3QudmFsdWUgPSBuZXh0U25hcHNob3Q7XG4gIGluc3QuZ2V0U25hcHNob3QgPSBnZXRTbmFwc2hvdDsgLy8gU29tZXRoaW5nIG1heSBoYXZlIGJlZW4gbXV0YXRlZCBpbiBiZXR3ZWVuIHJlbmRlciBhbmQgY29tbWl0LiBUaGlzIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiBpbiBhbiBldmVudCB0aGF0IGZpcmVkIGJlZm9yZSB0aGUgcGFzc2l2ZSBlZmZlY3RzLCBvciBpdCBjb3VsZFxuICAvLyBoYXZlIGJlZW4gaW4gYSBsYXlvdXQgZWZmZWN0LiBJbiB0aGF0IGNhc2UsIHdlIHdvdWxkIGhhdmUgdXNlZCB0aGUgb2xkXG4gIC8vIHNuYXBzaG8gYW5kIGdldFNuYXBzaG90IHZhbHVlcyB0byBiYWlsIG91dC4gV2UgbmVlZCB0byBjaGVjayBvbmUgbW9yZSB0aW1lLlxuXG4gIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdWJzY3JpYmVUb1N0b3JlKGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpIHtcbiAgdmFyIGhhbmRsZVN0b3JlQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoZSBzdG9yZSBjaGFuZ2VkLiBDaGVjayBpZiB0aGUgc25hcHNob3QgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlXG4gICAgLy8gcmVhZCBmcm9tIHRoZSBzdG9yZS5cbiAgICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgICBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpO1xuICAgIH1cbiAgfTsgLy8gU3Vic2NyaWJlIHRvIHRoZSBzdG9yZSBhbmQgcmV0dXJuIGEgY2xlYW4tdXAgZnVuY3Rpb24uXG5cblxuICByZXR1cm4gc3Vic2NyaWJlKGhhbmRsZVN0b3JlQ2hhbmdlKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSB7XG4gIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7XG4gIHZhciBwcmV2VmFsdWUgPSBpbnN0LnZhbHVlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5leHRWYWx1ZSA9IGxhdGVzdEdldFNuYXBzaG90KCk7XG4gICAgcmV0dXJuICFvYmplY3RJcyhwcmV2VmFsdWUsIG5leHRWYWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKSB7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGUoKTtcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSB7XG4gICAgcGVuZGluZzogbnVsbCxcbiAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICBsYW5lczogTm9MYW5lcyxcbiAgICBkaXNwYXRjaDogbnVsbCxcbiAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiBiYXNpY1N0YXRlUmVkdWNlcixcbiAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gIH07XG4gIGhvb2sucXVldWUgPSBxdWV1ZTtcbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaFNldFN0YXRlLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcHVzaEVmZmVjdCh0YWcsIGNyZWF0ZSwgZGVzdHJveSwgZGVwcykge1xuICB2YXIgZWZmZWN0ID0ge1xuICAgIHRhZzogdGFnLFxuICAgIGNyZWF0ZTogY3JlYXRlLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgZGVwczogZGVwcyxcbiAgICAvLyBDaXJjdWxhclxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgdmFyIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZTtcblxuICBpZiAoY29tcG9uZW50VXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKTtcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlID0gY29tcG9uZW50VXBkYXRlUXVldWU7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICB9IGVsc2Uge1xuICAgIHZhciBsYXN0RWZmZWN0ID0gY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgIGlmIChsYXN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgIGxhc3RFZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICAgIGVmZmVjdC5uZXh0ID0gZmlyc3RFZmZlY3Q7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlZmZlY3Q7XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAge1xuICAgIHZhciBfcmVmMiA9IHtcbiAgICAgIGN1cnJlbnQ6IGluaXRpYWxWYWx1ZVxuICAgIH07XG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gX3JlZjI7XG4gICAgcmV0dXJuIF9yZWYyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIGhvb2subWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgdW5kZWZpbmVkLCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBkZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gIGlmIChjdXJyZW50SG9vayAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2RWZmZWN0ID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICBkZXN0cm95ID0gcHJldkVmZmVjdC5kZXN0cm95O1xuXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2RWZmZWN0LmRlcHM7XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChNb3VudFBhc3NpdmVEZXYgfCBQYXNzaXZlIHwgUGFzc2l2ZVN0YXRpYywgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBtb3VudEVmZmVjdEltcGwoUGFzc2l2ZSB8IFBhc3NpdmVTdGF0aWMsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFBhc3NpdmUsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlLCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICB7XG4gICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gIH1cblxuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gIH1cblxuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdChjcmVhdGUsIHJlZikge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZWZDYWxsYmFjayA9IHJlZjtcblxuICAgIHZhciBfaW5zdCA9IGNyZWF0ZSgpO1xuXG4gICAgcmVmQ2FsbGJhY2soX2luc3QpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZDYWxsYmFjayhudWxsKTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKHJlZiAhPT0gbnVsbCAmJiByZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciByZWZPYmplY3QgPSByZWY7XG5cbiAgICB7XG4gICAgICBpZiAoIXJlZk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpKSB7XG4gICAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgZmlyc3QgYXJndW1lbnQgdG8gZWl0aGVyIGJlIGEgJyArICdyZWYgY2FsbGJhY2sgb3IgUmVhY3QuY3JlYXRlUmVmKCkgb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCAnYW4gb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKHJlZk9iamVjdCkuam9pbignLCAnKSArICd9Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9pbnN0MiA9IGNyZWF0ZSgpO1xuXG4gICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBfaW5zdDI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZk9iamVjdC5jdXJyZW50ID0gbnVsbDtcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuXG5cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gIHtcbiAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgfVxuXG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuXG5cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikgey8vIFRoaXMgaG9vayBpcyBub3JtYWxseSBhIG5vLW9wLlxuICAvLyBUaGUgcmVhY3QtZGVidWctaG9va3MgcGFja2FnZSBpbmplY3RzIGl0cyBvd24gaW1wbGVtZW50YXRpb25cbiAgLy8gc28gdGhhdCBlLmcuIERldlRvb2xzIGNhbiBkaXNwbGF5IGN1c3RvbSBob29rIHZhbHVlcy5cbn1cblxudmFyIHVwZGF0ZURlYnVnVmFsdWUgPSBtb3VudERlYnVnVmFsdWU7XG5cbmZ1bmN0aW9uIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBtb3VudE1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgLy8gQXNzdW1lIHRoZXNlIGFyZSBkZWZpbmVkLiBJZiB0aGV5J3JlIG5vdCwgYXJlSG9va0lucHV0c0VxdWFsIHdpbGwgd2Fybi5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByZXNvbHZlZEN1cnJlbnRIb29rID0gY3VycmVudEhvb2s7XG4gIHZhciBwcmV2VmFsdWUgPSByZXNvbHZlZEN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAgaWYgKGN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlcmVuZGVyIGR1cmluZyBhIG1vdW50LlxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVyZW5kZXIgZHVyaW5nIGFuIHVwZGF0ZS5cbiAgICB2YXIgcHJldlZhbHVlID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSkge1xuICB2YXIgc2hvdWxkRGVmZXJWYWx1ZSA9ICFpbmNsdWRlc09ubHlOb25VcmdlbnRMYW5lcyhyZW5kZXJMYW5lcyk7XG5cbiAgaWYgKHNob3VsZERlZmVyVmFsdWUpIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVyZ2VudCB1cGRhdGUuIElmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCwga2VlcCB1c2luZyB0aGVcbiAgICAvLyBwcmV2aW91cyB2YWx1ZSBhbmQgc3Bhd24gYSBkZWZlcnJlZCByZW5kZXIgdG8gdXBkYXRlIGl0IGxhdGVyLlxuICAgIGlmICghb2JqZWN0SXModmFsdWUsIHByZXZWYWx1ZSkpIHtcbiAgICAgIC8vIFNjaGVkdWxlIGEgZGVmZXJyZWQgcmVuZGVyXG4gICAgICB2YXIgZGVmZXJyZWRMYW5lID0gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIGRlZmVycmVkTGFuZSk7XG4gICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGRlZmVycmVkTGFuZSk7IC8vIFNldCB0aGlzIHRvIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVuZGVyZWQgdmFsdWUgaXMgaW5jb25zaXN0ZW50XG4gICAgICAvLyBmcm9tIHRoZSBsYXRlc3QgdmFsdWUuIFRoZSBuYW1lIFwiYmFzZVN0YXRlXCIgZG9lc24ndCByZWFsbHkgbWF0Y2ggaG93IHdlXG4gICAgICAvLyB1c2UgaXQgYmVjYXVzZSB3ZSdyZSByZXVzaW5nIGEgc3RhdGUgaG9vayBmaWVsZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGFcbiAgICAgIC8vIG5ldyBvbmUuXG5cbiAgICAgIGhvb2suYmFzZVN0YXRlID0gdHJ1ZTtcbiAgICB9IC8vIFJldXNlIHRoZSBwcmV2aW91cyB2YWx1ZVxuXG5cbiAgICByZXR1cm4gcHJldlZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgbm90IGFuIHVyZ2VudCB1cGRhdGUsIHNvIHdlIGNhbiB1c2UgdGhlIGxhdGVzdCB2YWx1ZSByZWdhcmRsZXNzXG4gICAgLy8gb2Ygd2hhdCBpdCBpcy4gTm8gbmVlZCB0byBkZWZlciBpdC5cbiAgICAvLyBIb3dldmVyLCBpZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGEgc3Bhd25lZCByZW5kZXIsIHRoZW4gd2UgbmVlZCB0byBtYXJrXG4gICAgLy8gdGhpcyBhcyBhbiB1cGRhdGUgdG8gcHJldmVudCB0aGUgZmliZXIgZnJvbSBiYWlsaW5nIG91dC5cbiAgICAvL1xuICAgIC8vIGBiYXNlU3RhdGVgIGlzIHRydWUgd2hlbiB0aGUgY3VycmVudCB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcmVuZGVyZWRcbiAgICAvLyB2YWx1ZS4gVGhlIG5hbWUgZG9lc24ndCByZWFsbHkgbWF0Y2ggaG93IHdlIHVzZSBpdCBiZWNhdXNlIHdlJ3JlIHJldXNpbmdcbiAgICAvLyBhIHN0YXRlIGhvb2sgZmllbGQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAgaWYgKGhvb2suYmFzZVN0YXRlKSB7XG4gICAgICAvLyBGbGlwIHRoaXMgYmFjayB0byBmYWxzZS5cbiAgICAgIGhvb2suYmFzZVN0YXRlID0gZmFsc2U7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2V0UGVuZGluZywgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGhpZ2hlckV2ZW50UHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSwgQ29udGludW91c0V2ZW50UHJpb3JpdHkpKTtcbiAgc2V0UGVuZGluZyh0cnVlKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSB7fTtcbiAgdmFyIGN1cnJlbnRUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICB0cnkge1xuICAgIHNldFBlbmRpbmcoZmFsc2UpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuXG4gICAge1xuICAgICAgaWYgKHByZXZUcmFuc2l0aW9uID09PSBudWxsICYmIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzKSB7XG4gICAgICAgIHZhciB1cGRhdGVkRmliZXJzQ291bnQgPSBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5zaXplO1xuXG4gICAgICAgIGlmICh1cGRhdGVkRmliZXJzQ291bnQgPiAxMCkge1xuICAgICAgICAgIHdhcm4oJ0RldGVjdGVkIGEgbGFyZ2UgbnVtYmVyIG9mIHVwZGF0ZXMgaW5zaWRlIHN0YXJ0VHJhbnNpdGlvbi4gJyArICdJZiB0aGlzIGlzIGR1ZSB0byBhIHN1YnNjcmlwdGlvbiBwbGVhc2UgcmUtd3JpdGUgaXQgdG8gdXNlIFJlYWN0IHByb3ZpZGVkIGhvb2tzLiAnICsgJ090aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50VHJhbnNpdGlvbigpIHtcbiAgdmFyIF9tb3VudFN0YXRlID0gbW91bnRTdGF0ZShmYWxzZSksXG4gICAgICBpc1BlbmRpbmcgPSBfbW91bnRTdGF0ZVswXSxcbiAgICAgIHNldFBlbmRpbmcgPSBfbW91bnRTdGF0ZVsxXTsgLy8gVGhlIGBzdGFydGAgbWV0aG9kIG5ldmVyIGNoYW5nZXMuXG5cblxuICB2YXIgc3RhcnQgPSBzdGFydFRyYW5zaXRpb24uYmluZChudWxsLCBzZXRQZW5kaW5nKTtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBzdGFydDtcbiAgcmV0dXJuIFtpc1BlbmRpbmcsIHN0YXJ0XTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVHJhbnNpdGlvbigpIHtcbiAgdmFyIF91cGRhdGVTdGF0ZSA9IHVwZGF0ZVN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfdXBkYXRlU3RhdGVbMF07XG5cbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHN0YXJ0ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclRyYW5zaXRpb24oKSB7XG4gIHZhciBfcmVyZW5kZXJTdGF0ZSA9IHJlcmVuZGVyU3RhdGUoKSxcbiAgICAgIGlzUGVuZGluZyA9IF9yZXJlbmRlclN0YXRlWzBdO1xuXG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBzdGFydCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIFtpc1BlbmRpbmcsIHN0YXJ0XTtcbn1cblxudmFyIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2UgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldElzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2VJbkRFVigpIHtcbiAge1xuICAgIHJldHVybiBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50SWQoKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTsgLy8gVE9ETzogSW4gRml6eiwgaWQgZ2VuZXJhdGlvbiBpcyBzcGVjaWZpYyB0byBlYWNoIHNlcnZlciBjb25maWcuIE1heWJlIHdlXG4gIC8vIHNob3VsZCBkbyB0aGlzIGluIEZpYmVyLCB0b28/IERlZmVycmluZyB0aGlzIGRlY2lzaW9uIGZvciBub3cgYmVjYXVzZVxuICAvLyB0aGVyZSdzIG5vIG90aGVyIHBsYWNlIHRvIHN0b3JlIHRoZSBwcmVmaXggZXhjZXB0IGZvciBhbiBpbnRlcm5hbCBmaWVsZCBvblxuICAvLyB0aGUgcHVibGljIGNyZWF0ZVJvb3Qgb2JqZWN0LCB3aGljaCB0aGUgZmliZXIgdHJlZSBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZVxuICAvLyBhIHJlZmVyZW5jZSB0by5cblxuICB2YXIgaWRlbnRpZmllclByZWZpeCA9IHJvb3QuaWRlbnRpZmllclByZWZpeDtcbiAgdmFyIGlkO1xuXG4gIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgdmFyIHRyZWVJZCA9IGdldFRyZWVJZCgpOyAvLyBVc2UgYSBjYXB0aWFsIFIgcHJlZml4IGZvciBzZXJ2ZXItZ2VuZXJhdGVkIGlkcy5cblxuICAgIGlkID0gJzonICsgaWRlbnRpZmllclByZWZpeCArICdSJyArIHRyZWVJZDsgLy8gVW5sZXNzIHRoaXMgaXMgdGhlIGZpcnN0IGlkIGF0IHRoaXMgbGV2ZWwsIGFwcGVuZCBhIG51bWJlciBhdCB0aGUgZW5kXG4gICAgLy8gdGhhdCByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiB0aGlzIHVzZUlkIGhvb2sgYW1vbmcgYWxsIHRoZSB1c2VJZFxuICAgIC8vIGhvb2tzIGZvciB0aGlzIGZpYmVyLlxuXG4gICAgdmFyIGxvY2FsSWQgPSBsb2NhbElkQ291bnRlcisrO1xuXG4gICAgaWYgKGxvY2FsSWQgPiAwKSB7XG4gICAgICBpZCArPSAnSCcgKyBsb2NhbElkLnRvU3RyaW5nKDMyKTtcbiAgICB9XG5cbiAgICBpZCArPSAnOic7XG4gIH0gZWxzZSB7XG4gICAgLy8gVXNlIGEgbG93ZXJjYXNlIHIgcHJlZml4IGZvciBjbGllbnQtZ2VuZXJhdGVkIGlkcy5cbiAgICB2YXIgZ2xvYmFsQ2xpZW50SWQgPSBnbG9iYWxDbGllbnRJZENvdW50ZXIrKztcbiAgICBpZCA9ICc6JyArIGlkZW50aWZpZXJQcmVmaXggKyAncicgKyBnbG9iYWxDbGllbnRJZC50b1N0cmluZygzMikgKyAnOic7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBpZDtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJZCgpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIGlkID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoUmVkdWNlckFjdGlvbihmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBoYXNFYWdlclN0YXRlOiBmYWxzZSxcbiAgICBlYWdlclN0YXRlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcblxuICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpIHtcbiAgICBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hTZXRTdGF0ZShmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBoYXNFYWdlclN0YXRlOiBmYWxzZSxcbiAgICBlYWdlclN0YXRlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcblxuICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpIHtcbiAgICBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChmaWJlci5sYW5lcyA9PT0gTm9MYW5lcyAmJiAoYWx0ZXJuYXRlID09PSBudWxsIHx8IGFsdGVybmF0ZS5sYW5lcyA9PT0gTm9MYW5lcykpIHtcbiAgICAgIC8vIFRoZSBxdWV1ZSBpcyBjdXJyZW50bHkgZW1wdHksIHdoaWNoIG1lYW5zIHdlIGNhbiBlYWdlcmx5IGNvbXB1dGUgdGhlXG4gICAgICAvLyBuZXh0IHN0YXRlIGJlZm9yZSBlbnRlcmluZyB0aGUgcmVuZGVyIHBoYXNlLiBJZiB0aGUgbmV3IHN0YXRlIGlzIHRoZVxuICAgICAgLy8gc2FtZSBhcyB0aGUgY3VycmVudCBzdGF0ZSwgd2UgbWF5IGJlIGFibGUgdG8gYmFpbCBvdXQgZW50aXJlbHkuXG4gICAgICB2YXIgbGFzdFJlbmRlcmVkUmVkdWNlciA9IHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXI7XG5cbiAgICAgIGlmIChsYXN0UmVuZGVyZWRSZWR1Y2VyICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlcjtcblxuICAgICAgICB7XG4gICAgICAgICAgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gcXVldWUubGFzdFJlbmRlcmVkU3RhdGU7XG4gICAgICAgICAgdmFyIGVhZ2VyU3RhdGUgPSBsYXN0UmVuZGVyZWRSZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTsgLy8gU3Rhc2ggdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGUsIGFuZCB0aGUgcmVkdWNlciB1c2VkIHRvIGNvbXB1dGVcbiAgICAgICAgICAvLyBpdCwgb24gdGhlIHVwZGF0ZSBvYmplY3QuIElmIHRoZSByZWR1Y2VyIGhhc24ndCBjaGFuZ2VkIGJ5IHRoZVxuICAgICAgICAgIC8vIHRpbWUgd2UgZW50ZXIgdGhlIHJlbmRlciBwaGFzZSwgdGhlbiB0aGUgZWFnZXIgc3RhdGUgY2FuIGJlIHVzZWRcbiAgICAgICAgICAvLyB3aXRob3V0IGNhbGxpbmcgdGhlIHJlZHVjZXIgYWdhaW4uXG5cbiAgICAgICAgICB1cGRhdGUuaGFzRWFnZXJTdGF0ZSA9IHRydWU7XG4gICAgICAgICAgdXBkYXRlLmVhZ2VyU3RhdGUgPSBlYWdlclN0YXRlO1xuXG4gICAgICAgICAgaWYgKG9iamVjdElzKGVhZ2VyU3RhdGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgICAgICAgIC8vIEZhc3QgcGF0aC4gV2UgY2FuIGJhaWwgb3V0IHdpdGhvdXQgc2NoZWR1bGluZyBSZWFjdCB0byByZS1yZW5kZXIuXG4gICAgICAgICAgICAvLyBJdCdzIHN0aWxsIHBvc3NpYmxlIHRoYXQgd2UnbGwgbmVlZCB0byByZWJhc2UgdGhpcyB1cGRhdGUgbGF0ZXIsXG4gICAgICAgICAgICAvLyBpZiB0aGUgY29tcG9uZW50IHJlLXJlbmRlcnMgZm9yIGEgZGlmZmVyZW50IHJlYXNvbiBhbmQgYnkgdGhhdFxuICAgICAgICAgICAgLy8gdGltZSB0aGUgcmVkdWNlciBoYXMgY2hhbmdlZC5cbiAgICAgICAgICAgIC8vIFRPRE86IERvIHdlIHN0aWxsIG5lZWQgdG8gZW50YW5nbGUgdHJhbnNpdGlvbnMgaW4gdGhpcyBjYXNlP1xuICAgICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlQW5kRWFnZXJseUJhaWxvdXQoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsvLyBTdXBwcmVzcyB0aGUgZXJyb3IuIEl0IHdpbGwgdGhyb3cgYWdhaW4gaW4gdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKTtcbiAgICB9XG4gIH1cblxuICBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgcmV0dXJuIGZpYmVyID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKSB7XG4gIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBTdGFzaCBpdCBpbiBhIGxhemlseS1jcmVhdGVkIG1hcCBvZlxuICAvLyBxdWV1ZSAtPiBsaW5rZWQgbGlzdCBvZiB1cGRhdGVzLiBBZnRlciB0aGlzIHJlbmRlciBwYXNzLCB3ZSdsbCByZXN0YXJ0XG4gIC8vIGFuZCBhcHBseSB0aGUgc3Rhc2hlZCB1cGRhdGVzIG9uIHRvcCBvZiB0aGUgd29yay1pbi1wcm9ncmVzcyBob29rLlxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gdHJ1ZTtcbiAgdmFyIHBlbmRpbmcgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG59IC8vIFRPRE86IE1vdmUgdG8gUmVhY3RGaWJlckNvbmN1cnJlbnRVcGRhdGVzP1xuXG5cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSkge1xuICBpZiAoaXNUcmFuc2l0aW9uTGFuZShsYW5lKSkge1xuICAgIHZhciBxdWV1ZUxhbmVzID0gcXVldWUubGFuZXM7IC8vIElmIGFueSBlbnRhbmdsZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBwZW5kaW5nIG9uIHRoZSByb290LCB0aGVuIHRoZXlcbiAgICAvLyBtdXN0IGhhdmUgZmluaXNoZWQuIFdlIGNhbiByZW1vdmUgdGhlbSBmcm9tIHRoZSBzaGFyZWQgcXVldWUsIHdoaWNoXG4gICAgLy8gcmVwcmVzZW50cyBhIHN1cGVyc2V0IG9mIHRoZSBhY3R1YWxseSBwZW5kaW5nIGxhbmVzLiBJbiBzb21lIGNhc2VzIHdlXG4gICAgLy8gbWF5IGVudGFuZ2xlIG1vcmUgdGhhbiB3ZSBuZWVkIHRvLCBidXQgdGhhdCdzIE9LLiBJbiBmYWN0IGl0J3Mgd29yc2UgaWZcbiAgICAvLyB3ZSAqZG9uJ3QqIGVudGFuZ2xlIHdoZW4gd2Ugc2hvdWxkLlxuXG4gICAgcXVldWVMYW5lcyA9IGludGVyc2VjdExhbmVzKHF1ZXVlTGFuZXMsIHJvb3QucGVuZGluZ0xhbmVzKTsgLy8gRW50YW5nbGUgdGhlIG5ldyB0cmFuc2l0aW9uIGxhbmUgd2l0aCB0aGUgb3RoZXIgdHJhbnNpdGlvbiBsYW5lcy5cblxuICAgIHZhciBuZXdRdWV1ZUxhbmVzID0gbWVyZ2VMYW5lcyhxdWV1ZUxhbmVzLCBsYW5lKTtcbiAgICBxdWV1ZS5sYW5lcyA9IG5ld1F1ZXVlTGFuZXM7IC8vIEV2ZW4gaWYgcXVldWUubGFuZXMgYWxyZWFkeSBpbmNsdWRlIGxhbmUsIHdlIGRvbid0IGtub3cgZm9yIGNlcnRhaW4gaWZcbiAgICAvLyB0aGUgbGFuZSBmaW5pc2hlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIGVudGFuZ2xlZCBpdC4gU28gd2UgbmVlZCB0b1xuICAgIC8vIGVudGFuZ2xlIGl0IGFnYWluLCBqdXN0IHRvIGJlIHN1cmUuXG5cbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBuZXdRdWV1ZUxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSwgYWN0aW9uKSB7XG5cbiAge1xuICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gIH1cbn1cblxudmFyIENvbnRleHRPbmx5RGlzcGF0Y2hlciA9IHtcbiAgcmVhZENvbnRleHQ6IHJlYWRDb250ZXh0LFxuICB1c2VDYWxsYmFjazogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VDb250ZXh0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUluc2VydGlvbkVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VMYXlvdXRFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTWVtbzogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWR1Y2VyOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VTdGF0ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWJ1Z1ZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlZmVycmVkVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlVHJhbnNpdGlvbjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNdXRhYmxlU291cmNlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUlkOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxufTtcblxudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG5cbntcbiAgdmFyIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBlcnJvcignQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gIH07XG5cbiAgdmFyIHdhcm5JbnZhbGlkSG9va0FjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBlcnJvcignRG8gbm90IGNhbGwgSG9va3MgaW5zaWRlIHVzZUVmZmVjdCguLi4pLCB1c2VNZW1vKC4uLiksIG9yIG90aGVyIGJ1aWx0LWluIEhvb2tzLiAnICsgJ1lvdSBjYW4gb25seSBjYWxsIEhvb2tzIGF0IHRoZSB0b3AgbGV2ZWwgb2YgeW91ciBSZWFjdCBmdW5jdGlvbi4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzJyk7XG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG59XG5cbnZhciBub3ckMSA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG52YXIgY29tbWl0VGltZSA9IDA7XG52YXIgbGF5b3V0RWZmZWN0U3RhcnRUaW1lID0gLTE7XG52YXIgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbnZhciBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gLTE7XG4vKipcbiAqIFRyYWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVwZGF0ZSB3YXMgYSBuZXN0ZWQvY2FzY2FkaW5nIHVwZGF0ZSAoc2NoZWR1bGVkIGZyb20gYSBsYXlvdXQgZWZmZWN0KS5cbiAqXG4gKiBUaGUgb3ZlcmFsbCBzZXF1ZW5jZSBpczpcbiAqICAgMS4gcmVuZGVyXG4gKiAgIDIuIGNvbW1pdCAoYW5kIGNhbGwgYG9uUmVuZGVyYCwgYG9uQ29tbWl0YClcbiAqICAgMy4gY2hlY2sgZm9yIG5lc3RlZCB1cGRhdGVzXG4gKiAgIDQuIGZsdXNoIHBhc3NpdmUgZWZmZWN0cyAoYW5kIGNhbGwgYG9uUG9zdENvbW1pdGApXG4gKlxuICogTmVzdGVkIHVwZGF0ZXMgYXJlIGlkZW50aWZpZWQgaW4gc3RlcCAzIGFib3ZlLFxuICogYnV0IHN0ZXAgNCBzdGlsbCBhcHBsaWVzIHRvIHRoZSB3b3JrIHRoYXQgd2FzIGp1c3QgY29tbWl0dGVkLlxuICogV2UgdXNlIHR3byBmbGFncyB0byB0cmFjayBuZXN0ZWQgdXBkYXRlcyB0aGVuOlxuICogb25lIHRyYWNrcyB3aGV0aGVyIHRoZSB1cGNvbWluZyB1cGRhdGUgaXMgYSBuZXN0ZWQgdXBkYXRlLFxuICogYW5kIHRoZSBvdGhlciB0cmFja3Mgd2hldGhlciB0aGUgY3VycmVudCB1cGRhdGUgd2FzIGEgbmVzdGVkIHVwZGF0ZS5cbiAqIFRoZSBmaXJzdCB2YWx1ZSBnZXRzIHN5bmNlZCB0byB0aGUgc2Vjb25kIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLlxuICovXG5cbnZhciBjdXJyZW50VXBkYXRlSXNOZXN0ZWQgPSBmYWxzZTtcbnZhciBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkge1xuICByZXR1cm4gY3VycmVudFVwZGF0ZUlzTmVzdGVkO1xufVxuXG5mdW5jdGlvbiBtYXJrTmVzdGVkVXBkYXRlU2NoZWR1bGVkKCkge1xuICB7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldE5lc3RlZFVwZGF0ZUZsYWcoKSB7XG4gIHtcbiAgICBjdXJyZW50VXBkYXRlSXNOZXN0ZWQgPSBmYWxzZTtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzeW5jTmVzdGVkVXBkYXRlRmxhZygpIHtcbiAge1xuICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IG5lc3RlZFVwZGF0ZVNjaGVkdWxlZDtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDb21taXRUaW1lKCkge1xuICByZXR1cm4gY29tbWl0VGltZTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkQ29tbWl0VGltZSgpIHtcblxuICBjb21taXRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRQcm9maWxlclRpbWVyKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSBub3ckMSgpO1xuXG4gIGlmIChmaWJlci5hY3R1YWxTdGFydFRpbWUgPCAwKSB7XG4gICAgZmliZXIuYWN0dWFsU3RhcnRUaW1lID0gbm93JDEoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZyhmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZmliZXIsIG92ZXJyaWRlQmFzZVRpbWUpIHtcblxuICBpZiAocHJvZmlsZXJTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBwcm9maWxlclN0YXJ0VGltZTtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcblxuICAgIGlmIChvdmVycmlkZUJhc2VUaW1lKSB7XG4gICAgICBmaWJlci5zZWxmQmFzZUR1cmF0aW9uID0gZWxhcHNlZFRpbWU7XG4gICAgfVxuXG4gICAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaWJlcikge1xuXG4gIGlmIChsYXlvdXRFZmZlY3RTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBsYXlvdXRFZmZlY3RTdGFydFRpbWU7XG4gICAgbGF5b3V0RWZmZWN0U3RhcnRUaW1lID0gLTE7IC8vIFN0b3JlIGR1cmF0aW9uIG9uIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3JcbiAgICAvLyBPciB0aGUgcm9vdCAoZm9yIHRoZSBEZXZUb29scyBQcm9maWxlciB0byByZWFkKVxuXG4gICAgdmFyIHBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAgd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpYmVyKSB7XG5cbiAgaWYgKHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lO1xuICAgIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSAtMTsgLy8gU3RvcmUgZHVyYXRpb24gb24gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3RvclxuICAgIC8vIE9yIHRoZSByb290IChmb3IgdGhlIERldlRvb2xzIFByb2ZpbGVyIHRvIHJlYWQpXG5cbiAgICB2YXIgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcm9vdC5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChwYXJlbnRTdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIERldGFjaGVkIGZpYmVycyBoYXZlIHRoZWlyIHN0YXRlIG5vZGUgY2xlYXJlZCBvdXQuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSByZXR1cm4gcG9pbnRlciBpcyBhbHNvIGNsZWFyZWQgb3V0LFxuICAgICAgICAgICAgLy8gc28gd2Ugd29uJ3QgYmUgYWJsZSB0byByZXBvcnQgdGhlIHRpbWUgc3BlbnQgaW4gdGhpcyBQcm9maWxlcidzIHN1YnRyZWUuXG4gICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKSB7XG5cbiAgbGF5b3V0RWZmZWN0U3RhcnRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKSB7XG5cbiAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24oZmliZXIpIHtcbiAgLy8gVHJhbnNmZXIgdGltZSBzcGVudCByZW5kZXJpbmcgdGhlc2UgY2hpbGRyZW4gc28gd2UgZG9uJ3QgbG9zZSBpdFxuICAvLyBhZnRlciB3ZSByZXJlbmRlci4gVGhpcyBpcyB1c2VkIGFzIGEgaGVscGVyIGluIHNwZWNpYWwgY2FzZXNcbiAgLy8gd2hlcmUgd2Ugc2hvdWxkIGNvdW50IHRoZSB3b3JrIG9mIG11bHRpcGxlIHBhc3Nlcy5cbiAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkKSB7XG4gICAgZmliZXIuYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCBiYXNlUHJvcHMpIHtcbiAgaWYgKENvbXBvbmVudCAmJiBDb21wb25lbnQuZGVmYXVsdFByb3BzKSB7XG4gICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzLiBUYWtlbiBmcm9tIFJlYWN0RWxlbWVudFxuICAgIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgYmFzZVByb3BzKTtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gQ29tcG9uZW50LmRlZmF1bHRQcm9wcztcblxuICAgIGZvciAodmFyIHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG5cbiAgcmV0dXJuIGJhc2VQcm9wcztcbn1cblxudmFyIGZha2VJbnRlcm5hbEluc3RhbmNlID0ge307XG52YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGU7XG52YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlO1xudmFyIHdhcm5PbkludmFsaWRDYWxsYmFjaztcbnZhciBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcztcbnZhciBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGU7XG52YXIgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMSA9IG5ldyBTZXQoKTtcbiAgdmFyIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjayA9IG5ldyBTZXQoKTtcblxuICB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IG51bGwgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IGNhbGxlck5hbWUgKyAnXycgKyBjYWxsYmFjaztcblxuICAgIGlmICghZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmhhcyhrZXkpKSB7XG4gICAgICBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suYWRkKGtleSk7XG5cbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfTtcblxuICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUgPSBmdW5jdGlvbiAodHlwZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpOiBBIHZhbGlkIHN0YXRlIG9iamVjdCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gJyArICdZb3UgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9OyAvLyBUaGlzIGlzIHNvIGdyb3NzIGJ1dCBpdCdzIGF0IGxlYXN0IG5vbi1jcml0aWNhbCBhbmQgY2FuIGJlIHJlbW92ZWQgaWZcbiAgLy8gaXQgY2F1c2VzIHByb2JsZW1zLiBUaGlzIGlzIG1lYW50IHRvIGdpdmUgYSBuaWNlciBlcnJvciBtZXNzYWdlIGZvclxuICAvLyBSZWFjdERPTTE1LnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHJlYWN0RE9NMTZDb21wb25lbnQsXG4gIC8vIC4uLikpIHdoaWNoIG90aGVyd2lzZSB0aHJvd3MgYSBcIl9wcm9jZXNzQ2hpbGRDb250ZXh0IGlzIG5vdCBhIGZ1bmN0aW9uXCJcbiAgLy8gZXhjZXB0aW9uLlxuXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZha2VJbnRlcm5hbEluc3RhbmNlLCAnX3Byb2Nlc3NDaGlsZENvbnRleHQnLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBSZWFjdCAxNisuIFRoaXMgbGlrZWx5ICcgKyAnbWVhbnMgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGFuZCBhcmUgYXR0ZW1wdGluZyB0byBuZXN0ICcgKyAnYSBSZWFjdCAxNSB0cmVlIGluc2lkZSBhIFJlYWN0IDE2IHRyZWUgdXNpbmcgJyArIFwidW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIsIHdoaWNoIGlzbid0IHN1cHBvcnRlZC4gVHJ5IFwiICsgJ3RvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBvbmx5IG9uZSBjb3B5IG9mIFJlYWN0IChhbmQgaWRlYWxseSwgc3dpdGNoICcgKyAndG8gUmVhY3RET00uY3JlYXRlUG9ydGFsKS4nKTtcbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZnJlZXplKGZha2VJbnRlcm5hbEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV4dFByb3BzKSB7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcGFydGlhbFN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcblxuICB7XG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW4gZXh0cmEgdGltZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG4gICAgICAgIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlKGN0b3IsIHBhcnRpYWxTdGF0ZSk7XG4gIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gIHZhciBtZW1vaXplZFN0YXRlID0gcGFydGlhbFN0YXRlID09PSBudWxsIHx8IHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkID8gcHJldlN0YXRlIDogYXNzaWduKHt9LCBwcmV2U3RhdGUsIHBhcnRpYWxTdGF0ZSk7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBtZW1vaXplZFN0YXRlOyAvLyBPbmNlIHRoZSB1cGRhdGUgcXVldWUgaXMgZW1wdHksIHBlcnNpc3QgdGhlIGRlcml2ZWQgc3RhdGUgb250byB0aGVcbiAgLy8gYmFzZSBzdGF0ZS5cblxuICBpZiAod29ya0luUHJvZ3Jlc3MubGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBRdWV1ZSBpcyBhbHdheXMgbm9uLW51bGwgZm9yIGNsYXNzZXNcbiAgICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgICB1cGRhdGVRdWV1ZS5iYXNlU3RhdGUgPSBtZW1vaXplZFN0YXRlO1xuICB9XG59XG5cbnZhciBjbGFzc0NvbXBvbmVudFVwZGF0ZXIgPSB7XG4gIGlzTW91bnRlZDogaXNNb3VudGVkLFxuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH0sXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gUmVwbGFjZVN0YXRlO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3JlcGxhY2VTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH0sXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKGluc3QsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgc2hvdWxkVXBkYXRlID0gaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuXG4gICAge1xuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW4gZXh0cmEgdGltZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJyVzLnNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBSZXR1cm5lZCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhICcgKyAnYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbiAgfVxuXG4gIGlmIChjdG9yLnByb3RvdHlwZSAmJiBjdG9yLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCkge1xuICAgIHJldHVybiAhc2hhbGxvd0VxdWFsKG9sZFByb3BzLCBuZXdQcm9wcykgfHwgIXNoYWxsb3dFcXVhbChvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcbiAgICB2YXIgcmVuZGVyUHJlc2VudCA9IGluc3RhbmNlLnJlbmRlcjtcblxuICAgIGlmICghcmVuZGVyUHJlc2VudCkge1xuICAgICAgaWYgKGN0b3IucHJvdG90eXBlICYmIHR5cGVvZiBjdG9yLnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IGRpZCB5b3UgYWNjaWRlbnRhbGx5IHJldHVybiBhbiBvYmplY3QgZnJvbSB0aGUgY29uc3RydWN0b3I/JywgbmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogeW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBkZWZpbmUgYHJlbmRlcmAuJywgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmdldEluaXRpYWxTdGF0ZSAmJiAhaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkICYmICFpbnN0YW5jZS5zdGF0ZSkge1xuICAgICAgZXJyb3IoJ2dldEluaXRpYWxTdGF0ZSB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdEaWQgeW91IG1lYW4gdG8gZGVmaW5lIGEgc3RhdGUgcHJvcGVydHkgaW5zdGVhZD8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzICYmICFpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnVXNlIGEgc3RhdGljIHByb3BlcnR5IHRvIGRlZmluZSBkZWZhdWx0UHJvcHMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcFR5cGVzKSB7XG4gICAgICBlcnJvcigncHJvcFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgcHJvcFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlKSB7XG4gICAgICBlcnJvcignY29udGV4dFR5cGUgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBjb250ZXh0VHlwZSBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChjdG9yLmNoaWxkQ29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEuaGFzKGN0b3IpICYmIC8vIFN0cmljdCBNb2RlIGhhcyBpdHMgb3duIHdhcm5pbmcgZm9yIGxlZ2FjeSBjb250ZXh0LCBzbyB3ZSBjYW4gc2tpcFxuICAgICAgLy8gdGhpcyBvbmUuXG4gICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmFkZChjdG9yKTtcblxuICAgICAgICBlcnJvcignJXMgdXNlcyB0aGUgbGVnYWN5IGNoaWxkQ29udGV4dFR5cGVzIEFQSSB3aGljaCBpcyBubyBsb25nZXIgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLiBVc2UgJyArICdSZWFjdC5jcmVhdGVDb250ZXh0KCkgaW5zdGVhZFxcblxcbi4nICsgJ0xlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9sZWdhY3ktY29udGV4dCcsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3Rvci5jb250ZXh0VHlwZXMgJiYgIWRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5oYXMoY3RvcikgJiYgLy8gU3RyaWN0IE1vZGUgaGFzIGl0cyBvd24gd2FybmluZyBmb3IgbGVnYWN5IGNvbnRleHQsIHNvIHdlIGNhbiBza2lwXG4gICAgICAvLyB0aGlzIG9uZS5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyB1c2VzIHRoZSBsZWdhY3kgY29udGV4dFR5cGVzIEFQSSB3aGljaCBpcyBubyBsb25nZXIgc3VwcG9ydGVkICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLiBVc2UgJyArICdSZWFjdC5jcmVhdGVDb250ZXh0KCkgd2l0aCBzdGF0aWMgY29udGV4dFR5cGUgaW5zdGVhZC5cXG5cXG4nICsgJ0xlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9sZWdhY3ktY29udGV4dCcsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCdjb250ZXh0VHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBjb250ZXh0VHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN0b3IuY29udGV4dFR5cGUgJiYgY3Rvci5jb250ZXh0VHlwZXMgJiYgIWRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzLmhhcyhjdG9yKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5hZGQoY3Rvcik7XG5cbiAgICAgICAgZXJyb3IoJyVzIGRlY2xhcmVzIGJvdGggY29udGV4dFR5cGVzIGFuZCBjb250ZXh0VHlwZSBzdGF0aWMgcHJvcGVydGllcy4gJyArICdUaGUgbGVnYWN5IGNvbnRleHRUeXBlcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRTaG91bGRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVhbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArICdleHBlY3RlZCB0byByZXR1cm4gYSB2YWx1ZS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgJiYgdHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpLiAnICsgJ3Nob3VsZENvbXBvbmVudFVwZGF0ZSBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiBleHRlbmRpbmcgUmVhY3QuUHVyZUNvbXBvbmVudC4gJyArICdQbGVhc2UgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgaXMgdXNlZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0EgcHVyZSBjb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkVW5tb3VudCgpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0RpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsVW5tb3VudCgpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFJlY2VpdmVQcm9wcygpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0lmIHlvdSBtZWFudCB0byB1cGRhdGUgdGhlIHN0YXRlIGluIHJlc3BvbnNlIHRvIGNoYW5naW5nIHByb3BzLCAnICsgJ3VzZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCkuIElmIHlvdSBtZWFudCB0byBmZXRjaCBkYXRhIG9yICcgKyAncnVuIHNpZGUtZWZmZWN0cyBvciBtdXRhdGlvbnMgYWZ0ZXIgUmVhY3QgaGFzIHVwZGF0ZWQgdGhlIFVJLCB1c2UgY29tcG9uZW50RGlkVXBkYXRlKCkuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBoYXNNdXRhdGVkUHJvcHMgPSBpbnN0YW5jZS5wcm9wcyAhPT0gbmV3UHJvcHM7XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IHVuZGVmaW5lZCAmJiBoYXNNdXRhdGVkUHJvcHMpIHtcbiAgICAgIGVycm9yKCclcyguLi4pOiBXaGVuIGNhbGxpbmcgc3VwZXIoKSBpbiBgJXNgLCBtYWtlIHN1cmUgdG8gcGFzcyAnICsgXCJ1cCB0aGUgc2FtZSBwcm9wcyB0aGF0IHlvdXIgY29tcG9uZW50J3MgY29uc3RydWN0b3Igd2FzIHBhc3NlZC5cIiwgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZXJyb3IoJ1NldHRpbmcgZGVmYXVsdFByb3BzIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgaWdub3JlZC4nICsgJyBJbnN0ZWFkLCBkZWZpbmUgZGVmYXVsdFByb3BzIGFzIGEgc3RhdGljIHByb3BlcnR5IG9uICVzLicsIG5hbWUsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJyAmJiAhZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmhhcyhjdG9yKSkge1xuICAgICAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmFkZChjdG9yKTtcblxuICAgICAgZXJyb3IoJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIHNob3VsZCBiZSB1c2VkIHdpdGggY29tcG9uZW50RGlkVXBkYXRlKCkuICcgKyAnVGhpcyBjb21wb25lbnQgZGVmaW5lcyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIG9ubHkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgaXMgZGVmaW5lZCBhcyBhIHN0YXRpYyBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGFuIGluc3RhbmNlIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgICBpZiAoX3N0YXRlICYmICh0eXBlb2YgX3N0YXRlICE9PSAnb2JqZWN0JyB8fCBpc0FycmF5KF9zdGF0ZSkpKSB7XG4gICAgICBlcnJvcignJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGN0b3IuY2hpbGRDb250ZXh0VHlwZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvcignJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byAnICsgJ3VzZSBnZXRDaGlsZENvbnRleHQoKS4nLCBuYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS51cGRhdGVyID0gY2xhc3NDb21wb25lbnRVcGRhdGVyO1xuICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gVGhlIGluc3RhbmNlIG5lZWRzIGFjY2VzcyB0byB0aGUgZmliZXIgc28gdGhhdCBpdCBjYW4gc2NoZWR1bGUgdXBkYXRlc1xuXG4gIHNldChpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gIHtcbiAgICBpbnN0YW5jZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gZmFrZUludGVybmFsSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgcHJvcHMpIHtcbiAgdmFyIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gZmFsc2U7XG4gIHZhciB1bm1hc2tlZENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIHtcbiAgICBpZiAoJ2NvbnRleHRUeXBlJyBpbiBjdG9yKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IC8vIEFsbG93IG51bGwgZm9yIGNvbmRpdGlvbmFsIGRlY2xhcmF0aW9uXG4gICAgICBjb250ZXh0VHlwZSA9PT0gbnVsbCB8fCBjb250ZXh0VHlwZSAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgJiYgY29udGV4dFR5cGUuX2NvbnRleHQgPT09IHVuZGVmaW5lZDsgLy8gTm90IGEgPENvbnRleHQuQ29uc3VtZXI+XG5cbiAgICAgIGlmICghaXNWYWxpZCAmJiAhZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmhhcyhjdG9yKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuYWRkKGN0b3IpO1xuICAgICAgICB2YXIgYWRkZW5kdW0gPSAnJztcblxuICAgICAgICBpZiAoY29udGV4dFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gdW5kZWZpbmVkLiAnICsgJ1RoaXMgY2FuIGJlIGNhdXNlZCBieSBhIHR5cG8gb3IgYnkgbWl4aW5nIHVwIG5hbWVkIGFuZCBkZWZhdWx0IGltcG9ydHMuICcgKyAnVGhpcyBjYW4gYWxzbyBoYXBwZW4gZHVlIHRvIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSwgc28gJyArICd0cnkgbW92aW5nIHRoZSBjcmVhdGVDb250ZXh0KCkgY2FsbCB0byBhIHNlcGFyYXRlIGZpbGUuJztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhICcgKyB0eXBlb2YgY29udGV4dFR5cGUgKyAnLic7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Qcm92aWRlciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIDxDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LkNvbnN1bWVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGFuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjb250ZXh0VHlwZSkuam9pbignLCAnKSArICd9Lic7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignJXMgZGVmaW5lcyBhbiBpbnZhbGlkIGNvbnRleHRUeXBlLiAnICsgJ2NvbnRleHRUeXBlIHNob3VsZCBwb2ludCB0byB0aGUgQ29udGV4dCBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlQ29udGV4dCgpLiVzJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnLCBhZGRlbmR1bSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBjb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IGN0b3IuY29udGV4dFR5cGVzO1xuICAgIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gY29udGV4dFR5cGVzICE9PSBudWxsICYmIGNvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnRleHQgPSBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA/IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCkgOiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIEluc3RhbnRpYXRlIHR3aWNlIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cblxuICB7XG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGluc3RhbmNlID0gbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSAhPT0gbnVsbCAmJiBpbnN0YW5jZS5zdGF0ZSAhPT0gdW5kZWZpbmVkID8gaW5zdGFuY2Uuc3RhdGUgOiBudWxsO1xuICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcblxuICB7XG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBzdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCdgJXNgIHVzZXMgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYnV0IGl0cyBpbml0aWFsIHN0YXRlIGlzICcgKyAnJXMuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkLiBJbnN0ZWFkLCBkZWZpbmUgdGhlIGluaXRpYWwgc3RhdGUgYnkgJyArICdhc3NpZ25pbmcgYW4gb2JqZWN0IHRvIGB0aGlzLnN0YXRlYCBpbiB0aGUgY29uc3RydWN0b3Igb2YgYCVzYC4gJyArICdUaGlzIGVuc3VyZXMgdGhhdCBgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzYCBhcmd1bWVudHMgaGF2ZSBhIGNvbnNpc3RlbnQgc2hhcGUuJywgY29tcG9uZW50TmFtZSwgaW5zdGFuY2Uuc3RhdGUgPT09IG51bGwgPyAnbnVsbCcgOiAndW5kZWZpbmVkJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfSAvLyBJZiBuZXcgY29tcG9uZW50IEFQSXMgYXJlIGRlZmluZWQsIFwidW5zYWZlXCIgbGlmZWN5Y2xlcyB3b24ndCBiZSBjYWxsZWQuXG4gICAgLy8gV2FybiBhYm91dCB0aGVzZSBsaWZlY3ljbGVzIGlmIHRoZXkgYXJlIHByZXNlbnQuXG4gICAgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIG1ldGhvZHMgdGhvdWdoLlxuXG5cbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGZvdW5kV2lsbE1vdW50TmFtZSA9IG51bGw7XG4gICAgICB2YXIgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9IG51bGw7XG4gICAgICB2YXIgZm91bmRXaWxsVXBkYXRlTmFtZSA9IG51bGw7XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdjb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlJztcbiAgICAgIH1cblxuICAgICAgaWYgKGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsIHx8IGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIF9jb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICAgIHZhciBuZXdBcGlOYW1lID0gdHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nID8gJ2dldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpJyA6ICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpJztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUuaGFzKF9jb21wb25lbnROYW1lKSkge1xuICAgICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUuYWRkKF9jb21wb25lbnROYW1lKTtcblxuICAgICAgICAgIGVycm9yKCdVbnNhZmUgbGVnYWN5IGxpZmVjeWNsZXMgd2lsbCBub3QgYmUgY2FsbGVkIGZvciBjb21wb25lbnRzIHVzaW5nIG5ldyBjb21wb25lbnQgQVBJcy5cXG5cXG4nICsgJyVzIHVzZXMgJXMgYnV0IGFsc28gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZWdhY3kgbGlmZWN5Y2xlczolcyVzJXNcXG5cXG4nICsgJ1RoZSBhYm92ZSBsaWZlY3ljbGVzIHNob3VsZCBiZSByZW1vdmVkLiBMZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOlxcbicgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcycsIF9jb21wb25lbnROYW1lLCBuZXdBcGlOYW1lLCBmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxNb3VudE5hbWUgOiAnJywgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgOiAnJywgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbFVwZGF0ZU5hbWUgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2FjaGUgdW5tYXNrZWQgY29udGV4dCBzbyB3ZSBjYW4gYXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgbmVjZXNzYXJ5LlxuICAvLyBSZWFjdEZpYmVyQ29udGV4dCB1c3VhbGx5IHVwZGF0ZXMgdGhpcyBjYWNoZSBidXQgY2FuJ3QgZm9yIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2VzLlxuXG5cbiAgaWYgKGlzTGVnYWN5Q29udGV4dENvbnN1bWVyKSB7XG4gICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBjYWxsQ29tcG9uZW50V2lsbE1vdW50KHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSkge1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpO1xuICB9XG5cbiAgaWYgKG9sZFN0YXRlICE9PSBpbnN0YW5jZS5zdGF0ZSkge1xuICAgIHtcbiAgICAgIGVycm9yKCclcy5jb21wb25lbnRXaWxsTW91bnQoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvIHRoaXMuc3RhdGUgaXMgJyArIFwiZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpIHtcbiAgdmFyIG9sZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cblxuICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IG9sZFN0YXRlKSB7XG4gICAge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvICcgKyBcInRoaXMuc3RhdGUgaXMgZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufSAvLyBJbnZva2VzIHRoZSBtb3VudCBsaWZlLWN5Y2xlcyBvbiBhIHByZXZpb3VzbHkgbmV2ZXIgcmVuZGVyZWQgaW5zdGFuY2UuXG5cblxuZnVuY3Rpb24gbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIGluc3RhbmNlLnJlZnMgPSB7fTtcbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgaW5zdGFuY2UuY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB7XG4gICAgaWYgKGluc3RhbmNlLnN0YXRlID09PSBuZXdQcm9wcykge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXM6IEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhc3NpZ24gcHJvcHMgZGlyZWN0bHkgdG8gc3RhdGUgJyArIFwiYmVjYXVzZSB1cGRhdGVzIHRvIHByb3BzIHdvbid0IGJlIHJlZmxlY3RlZCBpbiBzdGF0ZS4gXCIgKyAnSW4gbW9zdCBjYXNlcywgaXQgaXMgYmV0dGVyIHRvIHVzZSBwcm9wcyBkaXJlY3RseS4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3Mod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH0gLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cblxuICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBjYWxsQ29tcG9uZW50V2lsbE1vdW50KHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7IC8vIElmIHdlIGhhZCBhZGRpdGlvbmFsIHN0YXRlIHVwZGF0ZXMgZHVyaW5nIHRoaXMgbGlmZS1jeWNsZSwgbGV0J3NcbiAgICAvLyBwcm9jZXNzIHRoZW0gbm93LlxuXG4gICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAgICB7XG4gICAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgICB9XG5cbiAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVNb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG4gIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7IC8vIE5vdGU6IER1cmluZyB0aGVzZSBsaWZlLWN5Y2xlcywgaW5zdGFuY2UucHJvcHMvaW5zdGFuY2Uuc3RhdGUgYXJlIHdoYXRcbiAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSBcImN1cnJlbnRcIi4gSG93ZXZlcixcbiAgLy8gZHVyaW5nIGNvbXBvbmVudERpZFVwZGF0ZSB3ZSBwYXNzIHRoZSBcImN1cnJlbnRcIiBwcm9wcy5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cbiAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBvbGRDb250ZXh0ICE9PSBuZXh0Q29udGV4dCkge1xuICAgICAgY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCk7XG4gIHZhciBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBuZXdTdGF0ZSA9IGluc3RhbmNlLnN0YXRlID0gb2xkU3RhdGU7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAob2xkUHJvcHMgPT09IG5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgICAgIH1cblxuICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgICB9XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB8fCBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2ZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAgICAgIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgICB9XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IF9maWJlckZsYWdzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfZmliZXJGbGFnczIgPSBVcGRhdGU7XG5cbiAgICAgIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MyIHw9IExheW91dFN0YXRpYztcbiAgICAgIH1cblxuICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIF9maWJlckZsYWdzMiB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gX2ZpYmVyRmxhZ3MyO1xuICAgIH0gLy8gSWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmVkIGZhbHNlLCB3ZSBzaG91bGQgc3RpbGwgdXBkYXRlIHRoZVxuICAgIC8vIG1lbW9pemVkIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuXG5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBuZXdQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gVXBkYXRlIHRoZSBleGlzdGluZyBpbnN0YW5jZSdzIHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgcG9pbnRlcnMgZXZlblxuICAvLyBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJucyBmYWxzZS5cblxuXG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gbmV3U3RhdGU7XG4gIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbn0gLy8gSW52b2tlcyB0aGUgdXBkYXRlIGxpZmUtY3ljbGVzIGFuZCByZXR1cm5zIGZhbHNlIGlmIGl0IHNob3VsZG4ndCByZXJlbmRlci5cblxuXG5mdW5jdGlvbiB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIHVucmVzb2x2ZWRPbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID8gdW5yZXNvbHZlZE9sZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyh3b3JrSW5Qcm9ncmVzcy50eXBlLCB1bnJlc29sdmVkT2xkUHJvcHMpO1xuICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzO1xuICB2YXIgdW5yZXNvbHZlZE5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIG5leHRDb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBuZXh0Q29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIG5leHRVbm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IHVucmVzb2x2ZWROZXdQcm9wcyB8fCBvbGRDb250ZXh0ICE9PSBuZXh0Q29udGV4dCkge1xuICAgICAgY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCk7XG4gIHZhciBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBuZXdTdGF0ZSA9IGluc3RhbmNlLnN0YXRlID0gb2xkU3RhdGU7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAodW5yZXNvbHZlZE9sZFByb3BzID09PSB1bnJlc29sdmVkTmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgJiYgIShlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uICAgKSkge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpIHx8IC8vIFRPRE86IEluIHNvbWUgY2FzZXMsIHdlJ2xsIGVuZCB1cCBjaGVja2luZyBpZiBjb250ZXh0IGhhcyBjaGFuZ2VkIHR3aWNlLFxuICAvLyBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAgaGFzIGJlZW4gY2FsbGVkLiBOb3QgaWRlYWwsXG4gIC8vIGJ1dCBJJ20gbG9hdGggdG8gcmVmYWN0b3IgdGhpcyBmdW5jdGlvbi4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIG1lbW9pemVkXG4gIC8vIGNvbXBvbmVudHMgc28gaXQncyBub3QgdGhhdCBjb21tb24uXG4gIGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gICA7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgcHJvcHMvc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlKSB7XG4gIC8vIElmIHRoZSB2YWx1ZSBpcyBhbiBlcnJvciwgY2FsbCB0aGlzIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIGl0IGlzIHRocm93blxuICAvLyBzbyB0aGUgc3RhY2sgaXMgYWNjdXJhdGUuXG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHNvdXJjZTogc291cmNlLFxuICAgIHN0YWNrOiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2Qoc291cmNlKSxcbiAgICBkaWdlc3Q6IG51bGxcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhcHR1cmVkVmFsdWUodmFsdWUsIGRpZ2VzdCwgc3RhY2spIHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBudWxsLFxuICAgIHN0YWNrOiBzdGFjayAhPSBudWxsID8gc3RhY2sgOiBudWxsLFxuICAgIGRpZ2VzdDogZGlnZXN0ICE9IG51bGwgPyBkaWdlc3QgOiBudWxsXG4gIH07XG59XG5cbi8vIFRoaXMgbW9kdWxlIGlzIGZvcmtlZCBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuLy8gQnkgZGVmYXVsdCwgcmV0dXJuIGB0cnVlYCB0byBsb2cgZXJyb3JzIHRvIHRoZSBjb25zb2xlLlxuLy8gRm9ya3MgY2FuIHJldHVybiBgZmFsc2VgIGlmIHRoaXMgaXNuJ3QgZGVzaXJhYmxlLlxuZnVuY3Rpb24gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxvZ0NhcHR1cmVkRXJyb3IoYm91bmRhcnksIGVycm9ySW5mbykge1xuICB0cnkge1xuICAgIHZhciBsb2dFcnJvciA9IHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKTsgLy8gQWxsb3cgaW5qZWN0ZWQgc2hvd0Vycm9yRGlhbG9nKCkgdG8gcHJldmVudCBkZWZhdWx0IGNvbnNvbGUuZXJyb3IgbG9nZ2luZy5cbiAgICAvLyBUaGlzIGVuYWJsZXMgcmVuZGVyZXJzIGxpa2UgUmVhY3ROYXRpdmUgdG8gYmV0dGVyIG1hbmFnZSByZWRib3ggYmVoYXZpb3IuXG5cbiAgICBpZiAobG9nRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgaWYgKHRydWUpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBlcnJvckluZm8uc291cmNlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnOyAvLyBCcm93c2VycyBzdXBwb3J0IHNpbGVuY2luZyB1bmNhdWdodCBlcnJvcnMgYnkgY2FsbGluZ1xuICAgICAgLy8gYHByZXZlbnREZWZhdWx0KClgIGluIHdpbmRvdyBgZXJyb3JgIGhhbmRsZXIuXG4gICAgICAvLyBXZSByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbiBhcyBhbiBleHBhbmRvIG9uIHRoZSBlcnJvci5cblxuICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgICBpZiAoYm91bmRhcnkudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIC8vIFRoZSBlcnJvciBpcyByZWNvdmVyYWJsZSBhbmQgd2FzIHNpbGVuY2VkLlxuICAgICAgICAgIC8vIElnbm9yZSBpdCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuICAgICAgICAgIC8vIFRoaXMgaXMgaGFuZHkgZm9yIHRlc3RpbmcgZXJyb3IgYm91bmRhcmllcyB3aXRob3V0IG5vaXNlLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBUaGUgZXJyb3IgaXMgZmF0YWwuIFNpbmNlIHRoZSBzaWxlbmNpbmcgbWlnaHQgaGF2ZVxuICAgICAgICAvLyBiZWVuIGFjY2lkZW50YWwsIHdlJ2xsIHN1cmZhY2UgaXQgYW55d2F5LlxuICAgICAgICAvLyBIb3dldmVyLCB0aGUgYnJvd3NlciB3b3VsZCBoYXZlIHNpbGVuY2VkIHRoZSBvcmlnaW5hbCBlcnJvclxuICAgICAgICAvLyBzbyB3ZSdsbCBwcmludCBpdCBmaXJzdCwgYW5kIHRoZW4gcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuXG5cbiAgICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgICAgICAvLyBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgYmxvY2ssIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTMzODRcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBzb3VyY2UgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHNvdXJjZSkgOiBudWxsO1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWVNZXNzYWdlID0gY29tcG9uZW50TmFtZSA/IFwiVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIHRoZSA8XCIgKyBjb21wb25lbnROYW1lICsgXCI+IGNvbXBvbmVudDpcIiA6ICdUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gb25lIG9mIHlvdXIgUmVhY3QgY29tcG9uZW50czonO1xuICAgICAgdmFyIGVycm9yQm91bmRhcnlNZXNzYWdlO1xuXG4gICAgICBpZiAoYm91bmRhcnkudGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9ICdDb25zaWRlciBhZGRpbmcgYW4gZXJyb3IgYm91bmRhcnkgdG8geW91ciB0cmVlIHRvIGN1c3RvbWl6ZSBlcnJvciBoYW5kbGluZyBiZWhhdmlvci5cXG4nICsgJ1Zpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9lcnJvci1ib3VuZGFyaWVzIHRvIGxlYXJuIG1vcmUgYWJvdXQgZXJyb3IgYm91bmRhcmllcy4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVycm9yQm91bmRhcnlOYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihib3VuZGFyeSkgfHwgJ0Fub255bW91cyc7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gXCJSZWFjdCB3aWxsIHRyeSB0byByZWNyZWF0ZSB0aGlzIGNvbXBvbmVudCB0cmVlIGZyb20gc2NyYXRjaCBcIiArIChcInVzaW5nIHRoZSBlcnJvciBib3VuZGFyeSB5b3UgcHJvdmlkZWQsIFwiICsgZXJyb3JCb3VuZGFyeU5hbWUgKyBcIi5cIik7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21iaW5lZE1lc3NhZ2UgPSBjb21wb25lbnROYW1lTWVzc2FnZSArIFwiXFxuXCIgKyBjb21wb25lbnRTdGFjayArIFwiXFxuXFxuXCIgKyAoXCJcIiArIGVycm9yQm91bmRhcnlNZXNzYWdlKTsgLy8gSW4gZGV2ZWxvcG1lbnQsIHdlIHByb3ZpZGUgb3VyIG93biBtZXNzYWdlIHdpdGgganVzdCB0aGUgY29tcG9uZW50IHN0YWNrLlxuICAgICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZSBhbmQgSlMgc3RhY2sgYmVjYXVzZSB0aGUgYnJvd3NlclxuICAgICAgLy8gaGFzIGFscmVhZHkgcHJpbnRlZCBpdC4gRXZlbiBpZiB0aGUgYXBwbGljYXRpb24gc3dhbGxvd3MgdGhlIGVycm9yLCBpdCBpcyBzdGlsbFxuICAgICAgLy8gZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIHRoYW5rcyB0byB0aGUgREVWLW9ubHkgZmFrZSBldmVudCB0cmljayBpbiBSZWFjdEVycm9yVXRpbHMuXG5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oY29tYmluZWRNZXNzYWdlKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIHByb2R1Y3Rpb24sIHdlIHByaW50IHRoZSBlcnJvciBkaXJlY3RseS5cbiAgICAgIC8vIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBtZXNzYWdlLCB0aGUgSlMgc3RhY2ssIGFuZCBhbnl0aGluZyB0aGUgYnJvd3NlciB3YW50cyB0byBzaG93LlxuICAgICAgLy8gV2UgcGFzcyB0aGUgZXJyb3Igb2JqZWN0IGluc3RlYWQgb2YgY3VzdG9tIG1lc3NhZ2Ugc28gdGhhdCB0aGUgYnJvd3NlciBkaXNwbGF5cyB0aGUgZXJyb3IgbmF0aXZlbHkuXG4gICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFBvc3NpYmx5V2Vha01hcCQxID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuXG5mdW5jdGlvbiBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTsgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cblxuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogbnVsbFxuICB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvcik7XG4gICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZmliZXIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIHVwZGF0ZS5wYXlsb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvciQxKTtcbiAgICB9O1xuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAge1xuICAgICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gIGlmIChpbnN0ICE9PSBudWxsICYmIHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcblxuICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVG8gcHJlc2VydmUgdGhlIHByZWV4aXN0aW5nIHJldHJ5IGJlaGF2aW9yIG9mIGVycm9yIGJvdW5kYXJpZXMsXG4gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb25lcyBhbHJlYWR5IGZhaWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgICAgLy8gVGhpcyBnZXRzIHJlc2V0IGJlZm9yZSB3ZSB5aWVsZCBiYWNrIHRvIHRoZSBicm93c2VyLlxuICAgICAgICAvLyBUT0RPOiBXYXJuIGluIHN0cmljdCBtb2RlIGlmIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpc1xuICAgICAgICAvLyBub3QgZGVmaW5lZC5cbiAgICAgICAgbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVycm9yJDEgPSBlcnJvckluZm8udmFsdWU7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICB0aGlzLmNvbXBvbmVudERpZENhdGNoKGVycm9yJDEsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJ1xuICAgICAgfSk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBJZiBjb21wb25lbnREaWRDYXRjaCBpcyB0aGUgb25seSBlcnJvciBib3VuZGFyeSBtZXRob2QgZGVmaW5lZCxcbiAgICAgICAgICAvLyB0aGVuIGl0IG5lZWRzIHRvIGNhbGwgc2V0U3RhdGUgdG8gcmVjb3ZlciBmcm9tIGVycm9ycy5cbiAgICAgICAgICAvLyBJZiBubyBzdGF0ZSB1cGRhdGUgaXMgc2NoZWR1bGVkIHRoZW4gdGhlIGJvdW5kYXJ5IHdpbGwgc3dhbGxvdyB0aGUgZXJyb3IuXG4gICAgICAgICAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGZpYmVyLmxhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICAgICAgICAgIGVycm9yKCclczogRXJyb3IgYm91bmRhcmllcyBzaG91bGQgaW1wbGVtZW50IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpLiAnICsgJ0luIHRoYXQgbWV0aG9kLCByZXR1cm4gYSBzdGF0ZSB1cGRhdGUgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIG9yIGZhbGxiYWNrIFVJLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gQXR0YWNoIGEgcGluZyBsaXN0ZW5lclxuICAvL1xuICAvLyBUaGUgZGF0YSBtaWdodCByZXNvbHZlIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIGNvbW1pdCB0aGUgZmFsbGJhY2suIE9yLFxuICAvLyBpbiB0aGUgY2FzZSBvZiBhIHJlZnJlc2gsIHdlJ2xsIG5ldmVyIGNvbW1pdCBhIGZhbGxiYWNrLiBTbyB3ZSBuZWVkIHRvXG4gIC8vIGF0dGFjaCBhIGxpc3RlbmVyIG5vdy4gV2hlbiBpdCByZXNvbHZlcyAoXCJwaW5nc1wiKSwgd2UgY2FuIGRlY2lkZSB3aGV0aGVyIHRvXG4gIC8vIHRyeSByZW5kZXJpbmcgdGhlIHRyZWUgYWdhaW4uXG4gIC8vXG4gIC8vIE9ubHkgYXR0YWNoIGEgbGlzdGVuZXIgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBsYW5lc1xuICAvLyB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nICh3aGljaCBhY3RzIGxpa2UgYSBcInRocmVhZCBJRFwiIGhlcmUpLlxuICAvL1xuICAvLyBXZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpbiBjb25jdXJyZW50IG1vZGUuIExlZ2FjeSBTdXNwZW5zZSBhbHdheXNcbiAgLy8gY29tbWl0cyBmYWxsYmFja3Mgc3luY2hyb25vdXNseSwgc28gdGhlcmUgYXJlIG5vIHBpbmdzLlxuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG4gIHZhciB0aHJlYWRJRHM7XG5cbiAgaWYgKHBpbmdDYWNoZSA9PT0gbnVsbCkge1xuICAgIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCQxKCk7XG4gICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyZWFkSURzID0gcGluZ0NhY2hlLmdldCh3YWtlYWJsZSk7XG5cbiAgICBpZiAodGhyZWFkSURzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocmVhZElEcyA9IG5ldyBTZXQoKTtcbiAgICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0aHJlYWRJRHMuaGFzKGxhbmVzKSkge1xuICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIHRocmVhZCBJRCB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgdGhyZWFkSURzLmFkZChsYW5lcyk7XG4gICAgdmFyIHBpbmcgPSBwaW5nU3VzcGVuZGVkUm9vdC5iaW5kKG51bGwsIHJvb3QsIHdha2VhYmxlLCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzXG4gICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdha2VhYmxlLnRoZW4ocGluZywgcGluZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoUmV0cnlMaXN0ZW5lcihzdXNwZW5zZUJvdW5kYXJ5LCByb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gUmV0cnkgbGlzdGVuZXJcbiAgLy9cbiAgLy8gSWYgdGhlIGZhbGxiYWNrIGRvZXMgY29tbWl0LCB3ZSBuZWVkIHRvIGF0dGFjaCBhIGRpZmZlcmVudCB0eXBlIG9mXG4gIC8vIGxpc3RlbmVyLiBUaGlzIG9uZSBzY2hlZHVsZXMgYW4gdXBkYXRlIG9uIHRoZSBTdXNwZW5zZSBib3VuZGFyeSB0byB0dXJuXG4gIC8vIHRoZSBmYWxsYmFjayBzdGF0ZSBvZmYuXG4gIC8vXG4gIC8vIFN0YXNoIHRoZSB3YWtlYWJsZSBvbiB0aGUgYm91bmRhcnkgZmliZXIgc28gd2UgY2FuIGFjY2VzcyBpdCBpbiB0aGVcbiAgLy8gY29tbWl0IHBoYXNlLlxuICAvL1xuICAvLyBXaGVuIHRoZSB3YWtlYWJsZSByZXNvbHZlcywgd2UnbGwgYXR0ZW1wdCB0byByZW5kZXIgdGhlIGJvdW5kYXJ5XG4gIC8vIGFnYWluIChcInJldHJ5XCIpLlxuICB2YXIgd2FrZWFibGVzID0gc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZTtcblxuICBpZiAod2FrZWFibGVzID09PSBudWxsKSB7XG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gbmV3IFNldCgpO1xuICAgIHVwZGF0ZVF1ZXVlLmFkZCh3YWtlYWJsZSk7XG4gICAgc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICB9IGVsc2Uge1xuICAgIHdha2VhYmxlcy5hZGQod2FrZWFibGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ29tcG9uZW50KHNvdXJjZUZpYmVyLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gQSBsZWdhY3kgbW9kZSBTdXNwZW5zZSBxdWlyaywgb25seSByZWxldmFudCB0byBob29rIGNvbXBvbmVudHMuXG5cblxuICB2YXIgdGFnID0gc291cmNlRmliZXIudGFnO1xuXG4gIGlmICgoc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmICh0YWcgPT09IEZ1bmN0aW9uQ29tcG9uZW50IHx8IHRhZyA9PT0gRm9yd2FyZFJlZiB8fCB0YWcgPT09IFNpbXBsZU1lbW9Db21wb25lbnQpKSB7XG4gICAgdmFyIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudFNvdXJjZSkge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBjdXJyZW50U291cmNlLnVwZGF0ZVF1ZXVlO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnRTb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gY3VycmVudFNvdXJjZS5sYW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKSB7XG4gIHZhciBub2RlID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgJiYgc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9IC8vIFRoaXMgYm91bmRhcnkgYWxyZWFkeSBjYXB0dXJlZCBkdXJpbmcgdGhpcyByZW5kZXIuIENvbnRpbnVlIHRvIHRoZSBuZXh0XG4gICAgLy8gYm91bmRhcnkuXG5cblxuICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShzdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIG1hcmtzIGEgU3VzcGVuc2UgYm91bmRhcnkgc28gdGhhdCB3aGVuIHdlJ3JlIHVud2luZGluZyB0aGUgc3RhY2ssXG4gIC8vIGl0IGNhcHR1cmVzIHRoZSBzdXNwZW5kZWQgXCJleGNlcHRpb25cIiBhbmQgZG9lcyBhIHNlY29uZCAoZmFsbGJhY2spIHBhc3MuXG4gIGlmICgoc3VzcGVuc2VCb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAvLyBMZWdhY3kgTW9kZSBTdXNwZW5zZVxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGJvdW5kYXJ5IGlzIGluIGxlZ2FjeSBtb2RlLCB3ZSBzaG91bGQgKm5vdCpcbiAgICAvLyBzdXNwZW5kIHRoZSBjb21taXQuIFByZXRlbmQgYXMgaWYgdGhlIHN1c3BlbmRlZCBjb21wb25lbnQgcmVuZGVyZWRcbiAgICAvLyBudWxsIGFuZCBrZWVwIHJlbmRlcmluZy4gV2hlbiB0aGUgU3VzcGVuc2UgYm91bmRhcnkgY29tcGxldGVzLFxuICAgIC8vIHdlJ2xsIGRvIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIHRoZSBmYWxsYmFjay5cbiAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeSA9PT0gcmV0dXJuRmliZXIpIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBzdXNwZW5kZWQgd2hpbGUgcmVjb25jaWxpbmcgdGhlIGNoaWxkcmVuIG9mXG4gICAgICAvLyBhIFN1c3BlbnNlIGJvdW5kYXJ5J3MgaW5uZXIgT2Zmc2NyZWVuIHdyYXBwZXIgZmliZXIuIFRoaXMgaGFwcGVuc1xuICAgICAgLy8gd2hlbiBhIFJlYWN0LmxhenkgY29tcG9uZW50IGlzIGEgZGlyZWN0IGNoaWxkIG9mIGFcbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LlxuICAgICAgLy9cbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJpZXMgYXJlIGltcGxlbWVudGVkIGFzIG11bHRpcGxlIGZpYmVycywgYnV0IHRoZXlcbiAgICAgIC8vIGFyZSBhIHNpbmdsZSBjb25jZXB0dWFsIHVuaXQuIFRoZSBsZWdhY3kgbW9kZSBiZWhhdmlvciB3aGVyZSB3ZVxuICAgICAgLy8gcHJldGVuZCB0aGUgc3VzcGVuZGVkIGZpYmVyIGNvbW1pdHRlZCBhcyBgbnVsbGAgd29uJ3Qgd29yayxcbiAgICAgIC8vIGJlY2F1c2UgaW4gdGhpcyBjYXNlIHRoZSBcInN1c3BlbmRlZFwiIGZpYmVyIGlzIHRoZSBpbm5lclxuICAgICAgLy8gT2Zmc2NyZWVuIHdyYXBwZXIuXG4gICAgICAvL1xuICAgICAgLy8gQmVjYXVzZSB0aGUgY29udGVudHMgb2YgdGhlIGJvdW5kYXJ5IGhhdmVuJ3Qgc3RhcnRlZCByZW5kZXJpbmdcbiAgICAgIC8vIHlldCAoaS5lLiBub3RoaW5nIGluIHRoZSB0cmVlIGhhcyBwYXJ0aWFsbHkgcmVuZGVyZWQpIHdlIGNhblxuICAgICAgLy8gc3dpdGNoIHRvIHRoZSByZWd1bGFyLCBjb25jdXJyZW50IG1vZGUgYmVoYXZpb3I6IG1hcmsgdGhlXG4gICAgICAvLyBib3VuZGFyeSB3aXRoIFNob3VsZENhcHR1cmUgYW5kIGVudGVyIHRoZSB1bndpbmQgcGhhc2UuXG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2U7IC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgIC8vIEJ1dCB3ZSBzaG91bGRuJ3QgY2FsbCBhbnkgbGlmZWN5Y2xlIG1ldGhvZHMgb3IgY2FsbGJhY2tzLiBSZW1vdmVcbiAgICAgIC8vIGFsbCBsaWZlY3ljbGUgZWZmZWN0IHRhZ3MuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzICY9IH4oTGlmZWN5Y2xlRWZmZWN0TWFzayB8IEluY29tcGxldGUpO1xuXG4gICAgICBpZiAoc291cmNlRmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICB2YXIgY3VycmVudFNvdXJjZUZpYmVyID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50LiBDaGFuZ2UgdGhlIHRhZyBzbyBpdCdzIG5vdCBtaXN0YWtlbiBmb3IgYVxuICAgICAgICAgIC8vIGNvbXBsZXRlZCBjbGFzcyBjb21wb25lbnQuIEZvciBleGFtcGxlLCB3ZSBzaG91bGQgbm90IGNhbGxcbiAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgIHNvdXJjZUZpYmVyLnRhZyA9IEluY29tcGxldGVDbGFzc0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgLy8gc2luY2UgaXQncyBrbm93biB0byBiZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFVzZSBhIGZvcmNlIHVwZGF0ZSB0b1xuICAgICAgICAgIC8vIHByZXZlbnQgYSBiYWlsIG91dC5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBTeW5jTGFuZSk7XG4gICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuICAgICAgICAgIGVucXVldWVVcGRhdGUoc291cmNlRmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS4gTWFyayBpdCB3aXRoIFN5bmMgcHJpb3JpdHkgdG9cbiAgICAgIC8vIGluZGljYXRlIHRoYXQgaXQgc3RpbGwgaGFzIHBlbmRpbmcgd29yay5cblxuXG4gICAgICBzb3VyY2VGaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoc291cmNlRmliZXIubGFuZXMsIFN5bmNMYW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VzcGVuc2VCb3VuZGFyeTtcbiAgfSAvLyBDb25maXJtZWQgdGhhdCB0aGUgYm91bmRhcnkgaXMgaW4gYSBjb25jdXJyZW50IG1vZGUgdHJlZS4gQ29udGludWVcbiAgLy8gd2l0aCB0aGUgbm9ybWFsIHN1c3BlbmQgcGF0aC5cbiAgLy9cbiAgLy8gQWZ0ZXIgdGhpcyB3ZSdsbCB1c2UgYSBzZXQgb2YgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzXG4gIC8vIHJlbmRlciBwYXNzIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gb3IgcmVzdGFydCBvciBcInN1c3BlbmRcIiB0aGUgY29tbWl0LlxuICAvLyBUaGUgYWN0dWFsIGxvZ2ljIGZvciB0aGlzIGlzIHNwcmVhZCBvdXQgaW4gZGlmZmVyZW50IHBsYWNlcy5cbiAgLy9cbiAgLy8gVGhpcyBmaXJzdCBwcmluY2lwbGUgaXMgdGhhdCBpZiB3ZSdyZSBnb2luZyB0byBzdXNwZW5kIHdoZW4gd2UgY29tcGxldGVcbiAgLy8gYSByb290LCB0aGVuIHdlIHNob3VsZCBhbHNvIHJlc3RhcnQgaWYgd2UgZ2V0IGFuIHVwZGF0ZSBvciBwaW5nIHRoYXRcbiAgLy8gbWlnaHQgdW5zdXNwZW5kIGl0LCBhbmQgdmljZSB2ZXJzYS4gVGhlIG9ubHkgcmVhc29uIHRvIHN1c3BlbmQgaXNcbiAgLy8gYmVjYXVzZSB5b3UgdGhpbmsgeW91IG1pZ2h0IHdhbnQgdG8gcmVzdGFydCBiZWZvcmUgY29tbWl0dGluZy4gSG93ZXZlcixcbiAgLy8gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJlc3RhcnQgb25seSB3aGlsZSBpbiB0aGUgcGVyaW9kIHdlJ3JlIHN1c3BlbmRlZC5cbiAgLy9cbiAgLy8gUmVzdGFydGluZyB0b28gYWdncmVzc2l2ZWx5IGlzIGFsc28gbm90IGdvb2QgYmVjYXVzZSBpdCBzdGFydmVzIG91dCBhbnlcbiAgLy8gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFNvIHdlIHVzZSBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGVuLlxuICAvLyBTdXNwZW5zZSBIZXVyaXN0aWNzXG4gIC8vXG4gIC8vIElmIG5vdGhpbmcgdGhyZXcgYSBQcm9taXNlIG9yIGFsbCB0aGUgc2FtZSBmYWxsYmFja3MgYXJlIGFscmVhZHkgc2hvd2luZyxcbiAgLy8gdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuXG4gIC8vXG4gIC8vIElmIHRoaXMgaXMgYW4gaW5pdGlhbCByZW5kZXIgb2YgYSBuZXcgdHJlZSBvZiBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAvLyB0aG9zZSB0cmlnZ2VyIGEgZmFsbGJhY2ssIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGNhbiBzaG93IHRoZSBpbml0aWFsIGxvYWRpbmcgc3RhdGUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS5cbiAgLy9cbiAgLy8gSWYgd2UgaGl0IGEgXCJEZWxheWVkXCIgY2FzZSwgc3VjaCBhcyB3aGVuIHdlJ2Qgc3dpdGNoIGZyb20gY29udGVudCBiYWNrIGludG9cbiAgLy8gYSBmYWxsYmFjaywgdGhlbiB3ZSBzaG91bGQgYWx3YXlzIHN1c3BlbmQvcmVzdGFydC4gVHJhbnNpdGlvbnMgYXBwbHlcbiAgLy8gdG8gdGhpcyBjYXNlLiBJZiBub25lIGlzIGRlZmluZWQsIEpORCBpcyB1c2VkIGluc3RlYWQuXG4gIC8vXG4gIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIGFuZCBpdCBnZXRzIFwicmV0cmllZFwiLCBhbGxvd2luZyB1cyB0byBzaG93XG4gIC8vIGFub3RoZXIgbGV2ZWwsIGJ1dCB0aGVyZSdzIHN0aWxsIGFuIGlubmVyIGJvdW5kYXJ5IHRoYXQgd291bGQgc2hvdyBhIGZhbGxiYWNrLFxuICAvLyB0aGVuIHdlIHN1c3BlbmQvcmVzdGFydCBmb3IgNTAwbXMgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBzaG93ZWQgYSBmYWxsYmFja1xuICAvLyBhbnl3aGVyZSBpbiB0aGUgdHJlZS4gVGhpcyBlZmZlY3RpdmVseSB0aHJvdHRsZXMgcHJvZ3Jlc3NpdmUgbG9hZGluZyBpbnRvIGFcbiAgLy8gY29uc2lzdGVudCB0cmFpbiBvZiBjb21taXRzLiBUaGlzIGFsc28gZ2l2ZXMgdXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVzdGFydCB0b1xuICAvLyBnZXQgdG8gdGhlIGNvbXBsZXRlZCBzdGF0ZSBzbGlnaHRseSBlYXJsaWVyLlxuICAvL1xuICAvLyBJZiB0aGVyZSdzIGFtYmlndWl0eSBkdWUgdG8gYmF0Y2hpbmcgaXQncyByZXNvbHZlZCBpbiBwcmVmZXJlbmNlIG9mOlxuICAvLyAxKSBcImRlbGF5ZWRcIiwgMikgXCJpbml0aWFsIHJlbmRlclwiLCAzKSBcInJldHJ5XCIuXG4gIC8vXG4gIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgYSBcImJ1c3lcIiBzdGF0ZSBkb2Vzbid0IGdldCBmb3JjZSBjb21taXR0ZWQuIFdlIHdhbnQgdG9cbiAgLy8gZW5zdXJlIHRoYXQgbmV3IGluaXRpYWwgbG9hZGluZyBzdGF0ZXMgY2FuIGNvbW1pdCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuXG5cbiAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBTaG91bGRDYXB0dXJlOyAvLyBUT0RPOiBJIHRoaW5rIHdlIGNhbiByZW1vdmUgdGhpcywgc2luY2Ugd2Ugbm93IHVzZSBgRGlkQ2FwdHVyZWAgaW5cbiAgLy8gdGhlIGJlZ2luIHBoYXNlIHRvIHByZXZlbnQgYW4gZWFybHkgYmFpbG91dC5cblxuICBzdXNwZW5zZUJvdW5kYXJ5LmxhbmVzID0gcm9vdFJlbmRlckxhbmVzO1xuICByZXR1cm4gc3VzcGVuc2VCb3VuZGFyeTtcbn1cblxuZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24ocm9vdCwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCB2YWx1ZSwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS5cbiAgc291cmNlRmliZXIuZmxhZ3MgfD0gSW5jb21wbGV0ZTtcblxuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnNcbiAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRoaXMgaXMgYSB3YWtlYWJsZS4gVGhlIGNvbXBvbmVudCBzdXNwZW5kZWQuXG4gICAgdmFyIHdha2VhYmxlID0gdmFsdWU7XG4gICAgcmVzZXRTdXNwZW5kZWRDb21wb25lbnQoc291cmNlRmliZXIpO1xuXG4gICAge1xuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCk7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICB2YXIgc3VzcGVuc2VCb3VuZGFyeSA9IGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKTtcblxuICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5ICE9PSBudWxsKSB7XG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzICY9IH5Gb3JjZUNsaWVudFJlbmRlcjtcbiAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShzdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7IC8vIFdlIG9ubHkgYXR0YWNoIHBpbmcgbGlzdGVuZXJzIGluIGNvbmN1cnJlbnQgbW9kZS4gTGVnYWN5IFN1c3BlbnNlIGFsd2F5c1xuICAgICAgLy8gY29tbWl0cyBmYWxsYmFja3Mgc3luY2hyb25vdXNseSwgc28gdGhlcmUgYXJlIG5vIHBpbmdzLlxuXG4gICAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBhdHRhY2hSZXRyeUxpc3RlbmVyKHN1c3BlbnNlQm91bmRhcnksIHJvb3QsIHdha2VhYmxlKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gYm91bmRhcnkgd2FzIGZvdW5kLiBVbmxlc3MgdGhpcyBpcyBhIHN5bmMgdXBkYXRlLCB0aGlzIGlzIE9LLlxuICAgICAgLy8gV2UgY2FuIHN1c3BlbmQgYW5kIHdhaXQgZm9yIG1vcmUgZGF0YSB0byBhcnJpdmUuXG4gICAgICBpZiAoIWluY2x1ZGVzU3luY0xhbmUocm9vdFJlbmRlckxhbmVzKSkge1xuICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHN5bmMgdXBkYXRlLiBTdXNwZW5kLiBTaW5jZSB3ZSdyZSBub3QgYWN0aXZhdGluZyBhXG4gICAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LCB0aGlzIHdpbGwgdW53aW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IHdpdGhvdXRcbiAgICAgICAgLy8gcGVyZm9ybWluZyBhIHNlY29uZCBwYXNzIHRvIHJlbmRlciBhIGZhbGxiYWNrLiAoVGhpcyBpcyBhcmd1YWJseSBob3dcbiAgICAgICAgLy8gcmVmcmVzaCB0cmFuc2l0aW9ucyBzaG91bGQgd29yaywgdG9vLCBzaW5jZSB3ZSdyZSBub3QgZ29pbmcgdG8gY29tbWl0XG4gICAgICAgIC8vIHRoZSBmYWxsYmFja3MgYW55d2F5LilcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBjYXNlIGFsc28gYXBwbGllcyB0byBpbml0aWFsIGh5ZHJhdGlvbi5cbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gVGhpcyBpcyBhIHN5bmMvZGlzY3JldGUgdXBkYXRlLiBXZSB0cmVhdCB0aGlzIGNhc2UgbGlrZSBhbiBlcnJvclxuICAgICAgLy8gYmVjYXVzZSBkaXNjcmV0ZSByZW5kZXJzIGFyZSBleHBlY3RlZCB0byBwcm9kdWNlIGEgY29tcGxldGUgdHJlZVxuICAgICAgLy8gc3luY2hyb25vdXNseSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoIGV4dGVybmFsIHN0YXRlLlxuXG5cbiAgICAgIHZhciB1bmNhdWdodFN1c3BlbnNlRXJyb3IgPSBuZXcgRXJyb3IoJ0EgY29tcG9uZW50IHN1c3BlbmRlZCB3aGlsZSByZXNwb25kaW5nIHRvIHN5bmNocm9ub3VzIGlucHV0LiBUaGlzICcgKyAnd2lsbCBjYXVzZSB0aGUgVUkgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIGxvYWRpbmcgaW5kaWNhdG9yLiBUbyAnICsgJ2ZpeCwgdXBkYXRlcyB0aGF0IHN1c3BlbmQgc2hvdWxkIGJlIHdyYXBwZWQgJyArICd3aXRoIHN0YXJ0VHJhbnNpdGlvbi4nKTsgLy8gSWYgd2UncmUgb3V0c2lkZSBhIHRyYW5zaXRpb24sIGZhbGwgdGhyb3VnaCB0byB0aGUgcmVndWxhciBlcnJvciBwYXRoLlxuICAgICAgLy8gVGhlIGVycm9yIHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZSBuZWFyZXN0IHN1c3BlbnNlIGJvdW5kYXJ5LlxuXG4gICAgICB2YWx1ZSA9IHVuY2F1Z2h0U3VzcGVuc2VFcnJvcjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlZ3VsYXIgZXJyb3IsIG5vdCBhIFN1c3BlbnNlIHdha2VhYmxlLlxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTtcblxuICAgICAgdmFyIF9zdXNwZW5zZUJvdW5kYXJ5ID0gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpOyAvLyBJZiB0aGUgZXJyb3Igd2FzIHRocm93biBkdXJpbmcgaHlkcmF0aW9uLCB3ZSBtYXkgYmUgYWJsZSB0byByZWNvdmVyIGJ5XG4gICAgICAvLyBkaXNjYXJkaW5nIHRoZSBkZWh5ZHJhdGVkIGNvbnRlbnQgYW5kIHN3aXRjaGluZyB0byBhIGNsaWVudCByZW5kZXIuXG4gICAgICAvLyBJbnN0ZWFkIG9mIHN1cmZhY2luZyB0aGUgZXJyb3IsIGZpbmQgdGhlIG5lYXJlc3QgU3VzcGVuc2UgYm91bmRhcnlcbiAgICAgIC8vIGFuZCByZW5kZXIgaXQgYWdhaW4gd2l0aG91dCBoeWRyYXRpb24uXG5cblxuICAgICAgaWYgKF9zdXNwZW5zZUJvdW5kYXJ5ICE9PSBudWxsKSB7XG4gICAgICAgIGlmICgoX3N1c3BlbnNlQm91bmRhcnkuZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFNldCBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBzaG91bGQgdHJ5IHJlbmRlcmluZyB0aGUgbm9ybWFsXG4gICAgICAgICAgLy8gY2hpbGRyZW4gYWdhaW4sIG5vdCB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgX3N1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG4gICAgICAgIH1cblxuICAgICAgICBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoX3N1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gRXZlbiB0aG91Z2ggdGhlIHVzZXIgbWF5IG5vdCBiZSBhZmZlY3RlZCBieSB0aGlzIGVycm9yLCB3ZSBzaG91bGRcbiAgICAgICAgLy8gc3RpbGwgbG9nIGl0IHNvIGl0IGNhbiBiZSBmaXhlZC5cblxuICAgICAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlRmliZXIpO1xuICByZW5kZXJEaWRFcnJvcih2YWx1ZSk7IC8vIFdlIGRpZG4ndCBmaW5kIGEgYm91bmRhcnkgdGhhdCBjb3VsZCBoYW5kbGUgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4gU3RhcnRcbiAgLy8gb3ZlciBhbmQgdHJhdmVyc2UgcGFyZW50IHBhdGggYWdhaW4sIHRoaXMgdGltZSB0cmVhdGluZyB0aGUgZXhjZXB0aW9uXG4gIC8vIGFzIGFuIGVycm9yLlxuXG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTtcbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfZXJyb3JJbmZvLCBsYW5lKTtcbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIHVwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIENhcHR1cmUgYW5kIHJldHJ5XG4gICAgICAgIHZhciBlcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzICYmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuXG4gICAgICAgICAgdmFyIF9sYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcblxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgX2xhbmUpOyAvLyBTY2hlZHVsZSB0aGUgZXJyb3IgYm91bmRhcnkgdG8gcmUtcmVuZGVyIHVzaW5nIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICAgIHZhciBfdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgZXJyb3JJbmZvLCBfbGFuZSk7XG5cbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIF91cGRhdGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICB9IHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCk7XG59XG5cbmZ1bmN0aW9uIGdldFN1c3BlbmRlZENhY2hlKCkge1xuICB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IHN1c3BlbmRzLiBJdCByZXR1cm5zIHRoZVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRCYWRDbGFzcztcbnZhciBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcztcbnZhciBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzO1xudmFyIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyO1xudmFyIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zO1xudmFyIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0QmFkQ2xhc3MgPSB7fTtcbiAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnMgPSB7fTtcbiAgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlciA9IHt9O1xuICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9ucyA9IHt9O1xuICBkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG59XG5cbmZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhIGZyZXNoIG5ldyBjb21wb25lbnQgdGhhdCBoYXNuJ3QgYmVlbiByZW5kZXJlZCB5ZXQsIHdlXG4gICAgLy8gd29uJ3QgdXBkYXRlIGl0cyBjaGlsZCBzZXQgYnkgYXBwbHlpbmcgbWluaW1hbCBzaWRlLWVmZmVjdHMuIEluc3RlYWQsXG4gICAgLy8gd2Ugd2lsbCBhZGQgdGhlbSBhbGwgdG8gdGhlIGNoaWxkIGJlZm9yZSBpdCBnZXRzIHJlbmRlcmVkLiBUaGF0IG1lYW5zXG4gICAgLy8gd2UgY2FuIG9wdGltaXplIHRoaXMgcmVjb25jaWxpYXRpb24gcGFzcyBieSBub3QgdHJhY2tpbmcgc2lkZS1lZmZlY3RzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgY2hpbGQgaXMgdGhlIHNhbWUgYXMgdGhlIHdvcmsgaW4gcHJvZ3Jlc3MsIGl0IG1lYW5zIHRoYXRcbiAgICAvLyB3ZSBoYXZlbid0IHlldCBzdGFydGVkIGFueSB3b3JrIG9uIHRoZXNlIGNoaWxkcmVuLiBUaGVyZWZvcmUsIHdlIHVzZVxuICAgIC8vIHRoZSBjbG9uZSBhbGdvcml0aG0gdG8gY3JlYXRlIGEgY29weSBvZiBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4uXG4gICAgLy8gSWYgd2UgaGFkIGFueSBwcm9ncmVzc2VkIHdvcmsgYWxyZWFkeSwgdGhhdCBpcyBpbnZhbGlkIGF0IHRoaXMgcG9pbnQgc29cbiAgICAvLyBsZXQncyB0aHJvdyBpdCBvdXQuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGZvcmsgb2YgcmVjb25jaWxlQ2hpbGRyZW4uIEl0J3MgdXNlZCBpbiBjYXNlcyB3aGVyZSB3ZVxuICAvLyB3YW50IHRvIHJlY29uY2lsZSB3aXRob3V0IG1hdGNoaW5nIGFnYWluc3QgdGhlIGV4aXN0aW5nIHNldC4gVGhpcyBoYXMgdGhlXG4gIC8vIGVmZmVjdCBvZiBhbGwgY3VycmVudCBjaGlsZHJlbiBiZWluZyB1bm1vdW50ZWQ7IGV2ZW4gaWYgdGhlIHR5cGUgYW5kIGtleVxuICAvLyBhcmUgdGhlIHNhbWUsIHRoZSBvbGQgY2hpbGQgaXMgdW5tb3VudGVkIGFuZCBhIG5ldyBjaGlsZCBpcyBjcmVhdGVkLlxuICAvL1xuICAvLyBUbyBkbyB0aGlzLCB3ZSdyZSBnb2luZyB0byBnbyB0aHJvdWdoIHRoZSByZWNvbmNpbGUgYWxnb3JpdGhtIHR3aWNlLiBJblxuICAvLyB0aGUgZmlyc3QgcGFzcywgd2Ugc2NoZWR1bGUgYSBkZWxldGlvbiBmb3IgYWxsIHRoZSBjdXJyZW50IGNoaWxkcmVuIGJ5XG4gIC8vIHBhc3NpbmcgbnVsbC5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpOyAvLyBJbiB0aGUgc2Vjb25kIHBhc3MsIHdlIG1vdW50IHRoZSBuZXcgY2hpbGRyZW4uIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgd2VcbiAgLy8gcGFzcyBudWxsIGluIHBsYWNlIG9mIHdoZXJlIHdlIHVzdWFsbHkgcGFzcyB0aGUgY3VycmVudCBjaGlsZCBzZXQuIFRoaXMgaGFzXG4gIC8vIHRoZSBlZmZlY3Qgb2YgcmVtb3VudGluZyBhbGwgY2hpbGRyZW4gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZWlyXG4gIC8vIGlkZW50aXRpZXMgbWF0Y2guXG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZvcndhcmRSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyBhZnRlciB0aGUgZmlyc3QgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlbmRlciA9IENvbXBvbmVudC5yZW5kZXI7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFRoZSByZXN0IGlzIGEgZm9yayBvZiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudFxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHZhciBoYXNJZDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlciwgbmV4dFByb3BzLCByZWYsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFJlY2VpdmVVcGRhdGUpIHtcbiAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdmFyIHR5cGUgPSBDb21wb25lbnQudHlwZTtcblxuICAgIGlmIChpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpICYmIENvbXBvbmVudC5jb21wYXJlID09PSBudWxsICYmIC8vIFNpbXBsZU1lbW9Db21wb25lbnQgY29kZXBhdGggZG9lc24ndCByZXNvbHZlIG91dGVyIHByb3BzIGVpdGhlci5cbiAgICBDb21wb25lbnQuZGVmYXVsdFByb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXNvbHZlZFR5cGUgPSB0eXBlO1xuXG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKTtcbiAgICAgIH0gLy8gSWYgdGhpcyBpcyBhIHBsYWluIGZ1bmN0aW9uIGNvbXBvbmVudCB3aXRob3V0IGRlZmF1bHQgcHJvcHMsXG4gICAgICAvLyBhbmQgd2l0aCBvbmx5IHRoZSBkZWZhdWx0IHNoYWxsb3cgY29tcGFyaXNvbiwgd2UgdXBncmFkZSBpdFxuICAgICAgLy8gdG8gYSBTaW1wbGVNZW1vQ29tcG9uZW50IHRvIGFsbG93IGZhc3QgcGF0aCB1cGRhdGVzLlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IFNpbXBsZU1lbW9Db21wb25lbnQ7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZWRUeXBlO1xuXG4gICAgICB7XG4gICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgdHlwZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZXNvbHZlZFR5cGUsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgICAgZXJyb3IoJyVzOiBTdXBwb3J0IGZvciBkZWZhdWx0UHJvcHMgd2lsbCBiZSByZW1vdmVkIGZyb20gbWVtbyBjb21wb25lbnRzICcgKyAnaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gVXNlIEphdmFTY3JpcHQgZGVmYXVsdCBwYXJhbWV0ZXJzIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGlsZCA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyhDb21wb25lbnQudHlwZSwgbnVsbCwgbmV4dFByb3BzLCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MubW9kZSwgcmVuZGVyTGFuZXMpO1xuICAgIGNoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICBjaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHtcbiAgICB2YXIgX3R5cGUgPSBDb21wb25lbnQudHlwZTtcbiAgICB2YXIgX2lubmVyUHJvcFR5cGVzID0gX3R5cGUucHJvcFR5cGVzO1xuXG4gICAgaWYgKF9pbm5lclByb3BUeXBlcykge1xuICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgIC8vIFdlIGNvdWxkIG1vdmUgaXQgdGhlcmUsIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdGhpcyBmb3IgbGF6eSBjb2RlIHBhdGguXG4gICAgICBjaGVja1Byb3BUeXBlcyhfaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKF90eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFRoaXMgaXMgYWx3YXlzIGV4YWN0bHkgb25lIGNoaWxkXG5cbiAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICBpZiAoIWhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCkge1xuICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgcHJvcHMgd2l0aCByZXNvbHZlZCBkZWZhdWx0UHJvcHMsXG4gICAgLy8gdW5saWtlIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB3aGljaCB3aWxsIGJlIHRoZSB1bnJlc29sdmVkIG9uZXMuXG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzOyAvLyBEZWZhdWx0IHRvIHNoYWxsb3cgY29tcGFyaXNvblxuXG4gICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBjb21wYXJlID0gY29tcGFyZSAhPT0gbnVsbCA/IGNvbXBhcmUgOiBzaGFsbG93RXF1YWw7XG5cbiAgICBpZiAoY29tcGFyZShwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBuZXh0UHJvcHMpO1xuICBuZXdDaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICByZXR1cm4gbmV3Q2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBpbm5lciByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBvdXRlck1lbW9UeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG5cbiAgICAgIGlmIChvdXRlck1lbW9UeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgLy8gV2Ugd2FybiB3aGVuIHlvdSBkZWZpbmUgcHJvcFR5cGVzIG9uIGxhenkoKVxuICAgICAgICAvLyBzbyBsZXQncyBqdXN0IHNraXAgb3ZlciBpdCB0byBmaW5kIG1lbW8oKSBvdXRlciB3cmFwcGVyLlxuICAgICAgICAvLyBJbm5lciBwcm9wcyBmb3IgbWVtbyBhcmUgdmFsaWRhdGVkIGxhdGVyLlxuICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IG91dGVyTWVtb1R5cGU7XG4gICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IGluaXQocGF5bG9hZCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBvdXRlck1lbW9UeXBlID0gbnVsbDtcbiAgICAgICAgfSAvLyBJbm5lciBwcm9wVHlwZXMgd2lsbCBiZSB2YWxpZGF0ZWQgaW4gdGhlIGZ1bmN0aW9uIGNvbXBvbmVudCBwYXRoLlxuXG5cbiAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gb3V0ZXJNZW1vVHlwZSAmJiBvdXRlck1lbW9UeXBlLnByb3BUeXBlcztcblxuICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCAoU2ltcGxlTWVtb0NvbXBvbmVudCBoYXMgbm8gZGVmYXVsdFByb3BzKVxuICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG91dGVyTWVtb1R5cGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcblxuICAgIGlmIChzaGFsbG93RXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYgJiYgKCAvLyBQcmV2ZW50IGJhaWxvdXQgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQuXG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7IC8vIFRoZSBwcm9wcyBhcmUgc2hhbGxvd2x5IGVxdWFsLiBSZXVzZSB0aGUgcHJldmlvdXMgcHJvcHMgb2JqZWN0LCBsaWtlIHdlXG4gICAgICAvLyB3b3VsZCBkdXJpbmcgYSBub3JtYWwgZmliZXIgYmFpbG91dC5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIHN0cm9uZyBndWFyYW50ZWVzIHRoYXQgdGhlIHByb3BzIG9iamVjdCBpcyByZWZlcmVudGlhbGx5XG4gICAgICAvLyBlcXVhbCBkdXJpbmcgdXBkYXRlcyB3aGVyZSB3ZSBjYW4ndCBiYWlsIG91dCBhbnl3YXkg4oCUIGxpa2UgaWYgdGhlIHByb3BzXG4gICAgICAvLyBhcmUgc2hhbGxvd2x5IGVxdWFsLCBidXQgdGhlcmUncyBhIGxvY2FsIHN0YXRlIG9yIGNvbnRleHQgdXBkYXRlIGluIHRoZVxuICAgICAgLy8gc2FtZSBiYXRjaC5cbiAgICAgIC8vXG4gICAgICAvLyBIb3dldmVyLCBhcyBhIHByaW5jaXBsZSwgd2Ugc2hvdWxkIGFpbSB0byBtYWtlIHRoZSBiZWhhdmlvciBjb25zaXN0ZW50XG4gICAgICAvLyBhY3Jvc3MgZGlmZmVyZW50IHdheXMgb2YgbWVtb2l6aW5nIGEgY29tcG9uZW50LiBGb3IgZXhhbXBsZSwgUmVhY3QubWVtb1xuICAgICAgLy8gaGFzIGEgZGlmZmVyZW50IGludGVybmFsIEZpYmVyIGxheW91dCBpZiB5b3UgcGFzcyBhIG5vcm1hbCBmdW5jdGlvblxuICAgICAgLy8gY29tcG9uZW50IChTaW1wbGVNZW1vQ29tcG9uZW50KSB2ZXJzdXMgaWYgeW91IHBhc3MgYSBkaWZmZXJlbnQgdHlwZVxuICAgICAgLy8gbGlrZSBmb3J3YXJkUmVmIChNZW1vQ29tcG9uZW50KS4gQnV0IHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuICAgICAgLy8gV3JhcHBpbmcgYSBjb21wb25lbnQgaW4gZm9yd2FyZFJlZiAob3IgUmVhY3QubGF6eSwgZXRjKSBzaG91bGRuJ3RcbiAgICAgIC8vIGFmZmVjdCB3aGV0aGVyIHRoZSBwcm9wcyBvYmplY3QgaXMgcmV1c2VkIGR1cmluZyBhIGJhaWxvdXQuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IG5leHRQcm9wcyA9IHByZXZQcm9wcztcblxuICAgICAgaWYgKCFjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgbGFuZXMgd2VyZSBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYmVnaW5Xb3JrLiBXZSdyZVxuICAgICAgICAvLyBhYm91dCB0byBiYWlsIG91dCwgYnV0IHRoZXJlIG1pZ2h0IGJlIG90aGVyIGxhbmVzIHRoYXQgd2VyZW4ndFxuICAgICAgICAvLyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCByZW5kZXIuIFVzdWFsbHksIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGVcbiAgICAgICAgLy8gcmVtYWluaW5nIHVwZGF0ZXMgaXMgYWNjdW11bGF0ZWQgZHVyaW5nIHRoZSBldmFsdWF0aW9uIG9mIHRoZVxuICAgICAgICAvLyBjb21wb25lbnQgKGkuZS4gd2hlbiBwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUpLiBCdXQgc2luY2Ugc2luY2VcbiAgICAgICAgLy8gd2UncmUgYmFpbGluZyBvdXQgZWFybHkgKndpdGhvdXQqIGV2YWx1YXRpbmcgdGhlIGNvbXBvbmVudCwgd2UgbmVlZFxuICAgICAgICAvLyB0byBhY2NvdW50IGZvciBpdCBoZXJlLCB0b28uIFJlc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBmaWJlci5cbiAgICAgICAgLy8gTk9URTogVGhpcyBvbmx5IGFwcGxpZXMgdG8gU2ltcGxlTWVtb0NvbXBvbmVudCwgbm90IE1lbW9Db21wb25lbnQsXG4gICAgICAgIC8vIGJlY2F1c2UgYSBNZW1vQ29tcG9uZW50IGZpYmVyIGRvZXMgbm90IGhhdmUgaG9va3Mgb3IgYW4gdXBkYXRlIHF1ZXVlO1xuICAgICAgICAvLyByYXRoZXIsIGl0IHdyYXBzIGFyb3VuZCBhbiBpbm5lciBjb21wb25lbnQsIHdoaWNoIG1heSBvciBtYXkgbm90XG4gICAgICAgIC8vIGNvbnRhaW5zIGhvb2tzLlxuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoZSByZXNldCBhdCBpbiBiZWdpbldvcmsgb3V0IG9mIHRoZSBjb21tb24gcGF0aCBzbyB0aGF0XG4gICAgICAgIC8vIHRoaXMgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFN0YXRlIDogbnVsbDtcblxuICBpZiAobmV4dFByb3BzLm1vZGUgPT09ICdoaWRkZW4nIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiApIHtcbiAgICAvLyBSZW5kZXJpbmcgYSBoaWRkZW4gdHJlZS5cbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gbGVnYWN5IHN5bmMgbW9kZSwgZG9uJ3QgZGVmZXIgdGhlIHN1YnRyZWUuIFJlbmRlciBpdCBub3cuXG4gICAgICAvLyBUT0RPOiBDb25zaWRlciBob3cgT2Zmc2NyZWVuIHNob3VsZCB3b3JrIHdpdGggdHJhbnNpdGlvbnMgaW4gdGhlIGZ1dHVyZVxuICAgICAgdmFyIG5leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5leHRTdGF0ZTtcblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgIHZhciBzcGF3bmVkQ2FjaGVQb29sID0gbnVsbDsgLy8gV2UncmUgaGlkZGVuLCBhbmQgd2UncmUgbm90IHJlbmRlcmluZyBhdCBPZmZzY3JlZW4uIFdlIHdpbGwgYmFpbCBvdXRcbiAgICAgIC8vIGFuZCByZXN1bWUgdGhpcyB0cmVlIGxhdGVyLlxuXG4gICAgICB2YXIgbmV4dEJhc2VMYW5lcztcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgcHJldkJhc2VMYW5lcyA9IHByZXZTdGF0ZS5iYXNlTGFuZXM7XG4gICAgICAgIG5leHRCYXNlTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZCYXNlTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRCYXNlTGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICAgIH0gLy8gU2NoZWR1bGUgdGhpcyBmaWJlciB0byByZS1yZW5kZXIgYXQgb2Zmc2NyZWVuIHByaW9yaXR5LiBUaGVuIGJhaWxvdXQuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gICAgICB2YXIgX25leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBuZXh0QmFzZUxhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IHNwYXduZWRDYWNoZVBvb2wsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGU7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgICAvLyB0byBhdm9pZCBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC5cblxuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIG5leHRCYXNlTGFuZXMpO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHJlbmRlci4gVGhlIHN1cnJvdW5kaW5nIHZpc2libGUgY29udGVudCBoYXMgYWxyZWFkeVxuICAgICAgLy8gY29tbWl0dGVkLiBOb3cgd2UgcmVzdW1lIHJlbmRlcmluZyB0aGUgaGlkZGVuIHRyZWUuXG4gICAgICAvLyBSZW5kZXJpbmcgYXQgb2Zmc2NyZWVuLCBzbyB3ZSBjYW4gY2xlYXIgdGhlIGJhc2UgbGFuZXMuXG4gICAgICB2YXIgX25leHRTdGF0ZTIgPSB7XG4gICAgICAgIGJhc2VMYW5lczogTm9MYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBfbmV4dFN0YXRlMjsgLy8gUHVzaCB0aGUgbGFuZXMgdGhhdCB3ZXJlIHNraXBwZWQgd2hlbiB3ZSBiYWlsZWQgb3V0LlxuXG4gICAgICB2YXIgc3VidHJlZVJlbmRlckxhbmVzID0gcHJldlN0YXRlICE9PSBudWxsID8gcHJldlN0YXRlLmJhc2VMYW5lcyA6IHJlbmRlckxhbmVzO1xuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlbmRlcmluZyBhIHZpc2libGUgdHJlZS5cbiAgICB2YXIgX3N1YnRyZWVSZW5kZXJMYW5lcztcblxuICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIGdvaW5nIGZyb20gaGlkZGVuIC0+IHZpc2libGUuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2U3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSB3ZXJlbid0IHByZXZpb3VzbHkgaGlkZGVuLCBhbmQgd2Ugc3RpbGwgYXJlbid0LCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAgIC8vIHNwZWNpYWwgdG8gZG8uIE5lZWQgdG8gcHVzaCB0byB0aGUgc3RhY2sgcmVnYXJkbGVzcywgdGhvdWdoLCB0byBhdm9pZFxuICAgICAgLy8gYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgfVxuXG4gICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBfc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufSAvLyBOb3RlOiBUaGVzZSBoYXBwZW4gdG8gaGF2ZSBpZGVudGljYWwgYmVnaW4gcGhhc2VzLCBmb3Igbm93LiBXZSBzaG91bGRuJ3QgaG9sZFxuXG5mdW5jdGlvbiB1cGRhdGVGcmFnbWVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMuY2hpbGRyZW47XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcblxuICAgIHtcbiAgICAgIC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG4gICAgICB2YXIgc3RhdGVOb2RlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwgJiYgcmVmICE9PSBudWxsIHx8IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5yZWYgIT09IHJlZikge1xuICAgIC8vIFNjaGVkdWxlIGEgUmVmIGVmZmVjdFxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcblxuICAgIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZlN0YXRpYztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBjb250ZXh0O1xuXG4gIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIG5leHRDaGlsZHJlbjtcbiAgdmFyIGhhc0lkO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmICFkaWRSZWNlaXZlVXBkYXRlKSB7XG4gICAgYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7XG4gICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIC8vIFRoaXMgaXMgdXNlZCBieSBEZXZUb29scyB0byBmb3JjZSBhIGJvdW5kYXJ5IHRvIGVycm9yLlxuICAgIHN3aXRjaCAoc2hvdWxkRXJyb3Iod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICBjYXNlIGZhbHNlOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgY3RvciA9IHdvcmtJblByb2dyZXNzLnR5cGU7IC8vIFRPRE8gVGhpcyB3YXkgb2YgcmVzZXR0aW5nIHRoZSBlcnJvciBib3VuZGFyeSBzdGF0ZSBpcyBhIGhhY2suXG4gICAgICAgICAgLy8gSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM/XG5cbiAgICAgICAgICB2YXIgdGVtcEluc3RhbmNlID0gbmV3IGN0b3Iod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcywgX2luc3RhbmNlLmNvbnRleHQpO1xuICAgICAgICAgIHZhciBzdGF0ZSA9IHRlbXBJbnN0YW5jZS5zdGF0ZTtcblxuICAgICAgICAgIF9pbnN0YW5jZS51cGRhdGVyLmVucXVldWVTZXRTdGF0ZShfaW5zdGFuY2UsIHN0YXRlLCBudWxsKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcblxuICAgICAgICAgIHZhciBlcnJvciQxID0gbmV3IEVycm9yKCdTaW11bGF0ZWQgZXJyb3IgY29taW5nIGZyb20gRGV2VG9vbHMnKTtcbiAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIGxhbmUpOyAvLyBTY2hlZHVsZSB0aGUgZXJyb3IgYm91bmRhcnkgdG8gcmUtcmVuZGVyIHVzaW5nIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciQxLCB3b3JrSW5Qcm9ncmVzcyksIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIHNob3VsZFVwZGF0ZTtcblxuICBpZiAoaW5zdGFuY2UgPT09IG51bGwpIHtcbiAgICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsgLy8gSW4gdGhlIGluaXRpYWwgcGFzcyB3ZSBtaWdodCBuZWVkIHRvIGNvbnN0cnVjdCB0aGUgaW5zdGFuY2UuXG5cbiAgICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIEluIGEgcmVzdW1lLCB3ZSdsbCBhbHJlYWR5IGhhdmUgYW4gaW5zdGFuY2Ugd2UgY2FuIHJldXNlLlxuICAgIHNob3VsZFVwZGF0ZSA9IHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRVcGRhdGUgPSB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIG5leHRVbml0T2ZXb3JrID0gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIHZhciBpbnN0ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKHNob3VsZFVwZGF0ZSAmJiBpbnN0LnByb3BzICE9PSBuZXh0UHJvcHMpIHtcbiAgICAgIGlmICghZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICBlcnJvcignSXQgbG9va3MgbGlrZSAlcyBpcyByZWFzc2lnbmluZyBpdHMgb3duIGB0aGlzLnByb3BzYCB3aGlsZSByZW5kZXJpbmcuICcgKyAnVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBjYW4gbGVhZCB0byBjb25mdXNpbmcgYnVncy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnYSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRVbml0T2ZXb3JrO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFJlZnMgc2hvdWxkIHVwZGF0ZSBldmVuIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlXG4gIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgZGlkQ2FwdHVyZUVycm9yID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKCFzaG91bGRVcGRhdGUgJiYgIWRpZENhcHR1cmVFcnJvcikge1xuICAgIC8vIENvbnRleHQgcHJvdmlkZXJzIHNob3VsZCBkZWZlciB0byBzQ1UgZm9yIHJlbmRlcmluZ1xuICAgIGlmIChoYXNDb250ZXh0KSB7XG4gICAgICBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOyAvLyBSZXJlbmRlclxuXG4gIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICB2YXIgbmV4dENoaWxkcmVuO1xuXG4gIGlmIChkaWRDYXB0dXJlRXJyb3IgJiYgdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBJZiB3ZSBjYXB0dXJlZCBhbiBlcnJvciwgYnV0IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpcyBub3QgZGVmaW5lZCxcbiAgICAvLyB1bm1vdW50IGFsbCB0aGUgY2hpbGRyZW4uIGNvbXBvbmVudERpZENhdGNoIHdpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIHRvXG4gICAgLy8gcmUtcmVuZGVyIGEgZmFsbGJhY2suIFRoaXMgaXMgdGVtcG9yYXJ5IHVudGlsIHdlIG1pZ3JhdGUgZXZlcnlvbmUgdG9cbiAgICAvLyB0aGUgbmV3IEFQSS5cbiAgICAvLyBUT0RPOiBXYXJuIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcblxuICAgIHtcbiAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICAgIG5leHRDaGlsZHJlbiA9IGluc3RhbmNlLnJlbmRlcigpO1xuXG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGRpZENhcHR1cmVFcnJvcikge1xuICAgIC8vIElmIHdlJ3JlIHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVjb25jaWxlIHdpdGhvdXQgcmV1c2luZyBhbnkgb2ZcbiAgICAvLyB0aGUgZXhpc3RpbmcgY2hpbGRyZW4uIENvbmNlcHR1YWxseSwgdGhlIG5vcm1hbCBjaGlsZHJlbiBhbmQgdGhlIGNoaWxkcmVuXG4gICAgLy8gdGhhdCBhcmUgc2hvd24gb24gZXJyb3IgYXJlIHR3byBkaWZmZXJlbnQgc2V0cywgc28gd2Ugc2hvdWxkbid0IHJldXNlXG4gICAgLy8gbm9ybWFsIGNoaWxkcmVuIGV2ZW4gaWYgdGhlaXIgaWRlbnRpdGllcyBtYXRjaC5cbiAgICBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gTWVtb2l6ZSBzdGF0ZSB1c2luZyB0aGUgdmFsdWVzIHdlIGp1c3QgdXNlZCB0byByZW5kZXIuXG4gIC8vIFRPRE86IFJlc3RydWN0dXJlIHNvIHdlIG5ldmVyIHJlYWQgdmFsdWVzIGZyb20gdGhlIGluc3RhbmNlLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlOyAvLyBUaGUgY29udGV4dCBtaWdodCBoYXZlIGNoYW5nZWQgc28gd2UgbmVlZCB0byByZWNhbGN1bGF0ZSBpdC5cblxuICBpZiAoaGFzQ29udGV4dCkge1xuICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LnBlbmRpbmdDb250ZXh0LCByb290LnBlbmRpbmdDb250ZXh0ICE9PSByb290LmNvbnRleHQpO1xuICB9IGVsc2UgaWYgKHJvb3QuY29udGV4dCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgYmUgc2V0XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250ZXh0LCBmYWxzZSk7XG4gIH1cblxuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250YWluZXJJbmZvKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIGN1cnJlbnQgZmliZXIuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH1cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHByZXZDaGlsZHJlbiA9IHByZXZTdGF0ZS5lbGVtZW50O1xuICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cblxuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFN0YXRlLmVsZW1lbnQ7XG5cbiAgaWYgKCBwcmV2U3RhdGUuaXNEZWh5ZHJhdGVkKSB7XG4gICAgLy8gVGhpcyBpcyBhIGh5ZHJhdGlvbiByb290IHdob3NlIHNoZWxsIGhhcyBub3QgeWV0IGh5ZHJhdGVkLiBXZSBzaG91bGRcbiAgICAvLyBhdHRlbXB0IHRvIGh5ZHJhdGUuXG4gICAgLy8gRmxpcCBpc0RlaHlkcmF0ZWQgdG8gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB3aGVuIHRoaXMgcmVuZGVyXG4gICAgLy8gZmluaXNoZXMsIHRoZSByb290IHdpbGwgbm8gbG9uZ2VyIGJlIGRlaHlkcmF0ZWQuXG4gICAgdmFyIG92ZXJyaWRlU3RhdGUgPSB7XG4gICAgICBlbGVtZW50OiBuZXh0Q2hpbGRyZW4sXG4gICAgICBpc0RlaHlkcmF0ZWQ6IGZhbHNlLFxuICAgICAgY2FjaGU6IG5leHRTdGF0ZS5jYWNoZSxcbiAgICAgIHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6IG5leHRTdGF0ZS5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLFxuICAgICAgdHJhbnNpdGlvbnM6IG5leHRTdGF0ZS50cmFuc2l0aW9uc1xuICAgIH07XG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7IC8vIGBiYXNlU3RhdGVgIGNhbiBhbHdheXMgYmUgdGhlIGxhc3Qgc3RhdGUgYmVjYXVzZSB0aGUgcm9vdCBkb2Vzbid0XG4gICAgLy8gaGF2ZSByZWR1Y2VyIGZ1bmN0aW9ucyBzbyBpdCBkb2Vzbid0IG5lZWQgcmViYXNpbmcuXG5cbiAgICB1cGRhdGVRdWV1ZS5iYXNlU3RhdGUgPSBvdmVycmlkZVN0YXRlO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBvdmVycmlkZVN0YXRlO1xuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9yY2VDbGllbnRSZW5kZXIpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBlcnJvcmVkIGR1cmluZyBhIHByZXZpb3VzIGF0dGVtcHQgdG8gaHlkcmF0ZSB0aGUgc2hlbGwsIHNvIHdlXG4gICAgICAvLyBmb3JjZWQgYSBjbGllbnQgcmVuZGVyLlxuICAgICAgdmFyIHJlY292ZXJhYmxlRXJyb3IgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihuZXcgRXJyb3IoJ1RoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBoeWRyYXRpbmcuIEJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbmVkIG91dHNpZGUgJyArICdvZiBhIFN1c3BlbnNlIGJvdW5kYXJ5LCB0aGUgZW50aXJlIHJvb3Qgd2lsbCBzd2l0Y2ggdG8gJyArICdjbGllbnQgcmVuZGVyaW5nLicpLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIHJlY292ZXJhYmxlRXJyb3IpO1xuICAgIH0gZWxzZSBpZiAobmV4dENoaWxkcmVuICE9PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHZhciBfcmVjb3ZlcmFibGVFcnJvciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKG5ldyBFcnJvcignVGhpcyByb290IHJlY2VpdmVkIGFuIGVhcmx5IHVwZGF0ZSwgYmVmb3JlIGFueXRoaW5nIHdhcyBhYmxlICcgKyAnaHlkcmF0ZS4gU3dpdGNoZWQgdGhlIGVudGlyZSByb290IHRvIGNsaWVudCByZW5kZXJpbmcuJyksIHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgcmV0dXJuIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCBfcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBvdXRlcm1vc3Qgc2hlbGwgaGFzIG5vdCBoeWRyYXRlZCB5ZXQuIFN0YXJ0IGh5ZHJhdGluZy5cbiAgICAgIGVudGVySHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB2YXIgY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2hpbGQ7XG4gICAgICB2YXIgbm9kZSA9IGNoaWxkO1xuXG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAvLyBNYXJrIGVhY2ggY2hpbGQgYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGRcbiAgICAgICAgLy8gbm9kZSBoYXMgZnVsbHkgbW91bnRlZCB5ZXQsIGFuZCBmb3Igc2NoZWR1bGluZyBldmVudCByZXBsYXlpbmcuXG4gICAgICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET01cbiAgICAgICAgLy8gbXV0YXRpb25zIGJlY2F1c2UgaXQgYWxyZWFkeSBleGlzdHMuXG4gICAgICAgIG5vZGUuZmxhZ3MgPSBub2RlLmZsYWdzICYgflBsYWNlbWVudCB8IEh5ZHJhdGluZztcbiAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUm9vdCBpcyBub3QgZGVoeWRyYXRlZC4gRWl0aGVyIHRoaXMgaXMgYSBjbGllbnQtb25seSByb290LCBvciBpdFxuICAgIC8vIGFscmVhZHkgaHlkcmF0ZWQuXG4gICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuXG4gICAgaWYgKG5leHRDaGlsZHJlbiA9PT0gcHJldkNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIHJlY292ZXJhYmxlRXJyb3IpIHtcbiAgLy8gUmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuXG4gIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgcXVldWVIeWRyYXRpb25FcnJvcihyZWNvdmVyYWJsZUVycm9yKTtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJldlByb3BzID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG51bGw7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBpc0RpcmVjdFRleHRDaGlsZCA9IHNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIG5leHRQcm9wcyk7XG5cbiAgaWYgKGlzRGlyZWN0VGV4dENoaWxkKSB7XG4gICAgLy8gV2Ugc3BlY2lhbCBjYXNlIGEgZGlyZWN0IHRleHQgY2hpbGQgb2YgYSBob3N0IG5vZGUuIFRoaXMgaXMgYSBjb21tb25cbiAgICAvLyBjYXNlLiBXZSB3b24ndCBoYW5kbGUgaXQgYXMgYSByZWlmaWVkIGNoaWxkLiBXZSB3aWxsIGluc3RlYWQgaGFuZGxlXG4gICAgLy8gdGhpcyBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudCB0aGF0IGFsc28gaGFzIGFjY2VzcyB0byB0aGlzIHByb3AuIFRoYXRcbiAgICAvLyBhdm9pZHMgYWxsb2NhdGluZyBhbm90aGVyIEhvc3RUZXh0IGZpYmVyIGFuZCB0cmF2ZXJzaW5nIGl0LlxuICAgIG5leHRDaGlsZHJlbiA9IG51bGw7XG4gIH0gZWxzZSBpZiAocHJldlByb3BzICE9PSBudWxsICYmIHNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIHByZXZQcm9wcykpIHtcbiAgICAvLyBJZiB3ZSdyZSBzd2l0Y2hpbmcgZnJvbSBhIGRpcmVjdCB0ZXh0IGNoaWxkIHRvIGEgbm9ybWFsIGNoaWxkLCBvciB0b1xuICAgIC8vIGVtcHR5LCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHRoZSB0ZXh0IGNvbnRlbnQgdG8gYmUgcmVzZXQuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gQ29udGVudFJlc2V0O1xuICB9XG5cbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0VGV4dChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuIFRoaXMgaXMgdGVybWluYWwuIFdlJ2xsIGRvIHRoZSBjb21wbGV0aW9uIHN0ZXBcbiAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIuXG5cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXp5Q29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZWxlbWVudFR5cGUsIHJlbmRlckxhbmVzKSB7XG4gIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbGF6eUNvbXBvbmVudCA9IGVsZW1lbnRUeXBlO1xuICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcbiAgdmFyIENvbXBvbmVudCA9IGluaXQocGF5bG9hZCk7IC8vIFN0b3JlIHRoZSB1bndyYXBwZWQgY29tcG9uZW50IGluIHRoZSB0eXBlLlxuXG4gIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQ7XG4gIHZhciByZXNvbHZlZFRhZyA9IHdvcmtJblByb2dyZXNzLnRhZyA9IHJlc29sdmVMYXp5Q29tcG9uZW50VGFnKENvbXBvbmVudCk7XG4gIHZhciByZXNvbHZlZFByb3BzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHByb3BzKTtcbiAgdmFyIGNoaWxkO1xuXG4gIHN3aXRjaCAocmVzb2x2ZWRUYWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGb3J3YXJkUmVmKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIHJlc29sdmVkUHJvcHMsIC8vIFJlc29sdmVkIGZvciBvdXRlciBvbmx5XG4gICAgICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlTWVtb0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudC50eXBlLCByZXNvbHZlZFByb3BzKSwgLy8gVGhlIGlubmVyIHR5cGUgY2FuIGhhdmUgZGVmYXVsdHMgdG9vXG4gICAgICAgIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICB9XG5cbiAgdmFyIGhpbnQgPSAnJztcblxuICB7XG4gICAgaWYgKENvbXBvbmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgQ29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiBDb21wb25lbnQuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgaGludCA9ICcgRGlkIHlvdSB3cmFwIGEgY29tcG9uZW50IGluIFJlYWN0LmxhenkoKSBtb3JlIHRoYW4gb25jZT8nO1xuICAgIH1cbiAgfSAvLyBUaGlzIG1lc3NhZ2UgaW50ZW50aW9uYWxseSBkb2Vzbid0IG1lbnRpb24gRm9yd2FyZFJlZiBvciBNZW1vQ29tcG9uZW50XG4gIC8vIGJlY2F1c2UgdGhlIGZhY3QgdGhhdCBpdCdzIGEgc2VwYXJhdGUgdHlwZSBvZiB3b3JrIGlzIGFuXG4gIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbC5cblxuXG4gIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgdHlwZSBpcyBpbnZhbGlkLiBSZWNlaXZlZCBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0bzogXCIgKyBDb21wb25lbnQgKyBcIi4gXCIgKyAoXCJMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi5cIiArIGhpbnQpKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOyAvLyBQcm9tb3RlIHRoZSBmaWJlciB0byBhIGNsYXNzIGFuZCB0cnkgcmVuZGVyaW5nIGFnYWluLlxuXG4gIHdvcmtJblByb2dyZXNzLnRhZyA9IENsYXNzQ29tcG9uZW50OyAvLyBUaGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGEgZm9yayBvZiBgdXBkYXRlQ2xhc3NDb21wb25lbnRgXG4gIC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gIHZhciBoYXNDb250ZXh0O1xuXG4gIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgaGFzQ29udGV4dCA9IHRydWU7XG4gICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gZWxzZSB7XG4gICAgaGFzQ29udGV4dCA9IGZhbHNlO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMpO1xuICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiBmaW5pc2hDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50SW5kZXRlcm1pbmF0ZUNvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBjb250ZXh0O1xuXG4gIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGZhbHNlKTtcbiAgICBjb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciB2YWx1ZTtcbiAgdmFyIGhhc0lkO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB7XG4gICAgaWYgKENvbXBvbmVudC5wcm90b3R5cGUgJiYgdHlwZW9mIENvbXBvbmVudC5wcm90b3R5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcihcIlRoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gaGF2ZSBhIHJlbmRlciBtZXRob2QsIGJ1dCBkb2Vzbid0IGV4dGVuZCBSZWFjdC5Db21wb25lbnQuIFwiICsgJ1RoaXMgaXMgbGlrZWx5IHRvIGNhdXNlIGVycm9ycy4gQ2hhbmdlICVzIHRvIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgbnVsbCk7XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICB7XG4gICAgLy8gU3VwcG9ydCBmb3IgbW9kdWxlIGNvbXBvbmVudHMgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcmVtb3ZlZCBiZWhpbmQgYSBmbGFnLlxuICAgIC8vIFdoZXRoZXIgb3Igbm90IGl0IHdvdWxkIGNyYXNoIGxhdGVyLCB3ZSB3YW50IHRvIHNob3cgYSBnb29kIG1lc3NhZ2UgaW4gREVWIGZpcnN0LlxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGJlIGEgZnVuY3Rpb24gY29tcG9uZW50IHRoYXQgcmV0dXJucyBhIGNsYXNzIGluc3RhbmNlLiAnICsgJ0NoYW5nZSAlcyB0byBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4gJyArIFwiSWYgeW91IGNhbid0IHVzZSBhIGNsYXNzIHRyeSBhc3NpZ25pbmcgdGhlIHByb3RvdHlwZSBvbiB0aGUgZnVuY3Rpb24gYXMgYSB3b3JrYXJvdW5kLiBcIiArIFwiYCVzLnByb3RvdHlwZSA9IFJlYWN0LkNvbXBvbmVudC5wcm90b3R5cGVgLiBEb24ndCB1c2UgYW4gYXJyb3cgZnVuY3Rpb24gc2luY2UgaXQgXCIgKyAnY2Fubm90IGJlIGNhbGxlZCB3aXRoIGBuZXdgIGJ5IFJlYWN0LicsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSwgX2NvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIC8vIFJ1biB0aGVzZSBjaGVja3MgaW4gcHJvZHVjdGlvbiBvbmx5IGlmIHRoZSBmbGFnIGlzIG9mZi5cbiAgLy8gRXZlbnR1YWxseSB3ZSdsbCBkZWxldGUgdGhpcyBicmFuY2ggYWx0b2dldGhlci5cbiAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS4kJHR5cGVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lMiA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0pIHtcbiAgICAgICAgZXJyb3IoJ1RoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gYmUgYSBmdW5jdGlvbiBjb21wb25lbnQgdGhhdCByZXR1cm5zIGEgY2xhc3MgaW5zdGFuY2UuICcgKyAnQ2hhbmdlICVzIHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLiAnICsgXCJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuIFwiICsgXCJgJXMucHJvdG90eXBlID0gUmVhY3QuQ29tcG9uZW50LnByb3RvdHlwZWAuIERvbid0IHVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzaW5jZSBpdCBcIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUyLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgY2xhc3MgaW5zdGFuY2VcblxuXG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gQ2xhc3NDb21wb25lbnQ7IC8vIFRocm93IG91dCBhbnkgaG9va3MgdGhhdCB3ZXJlIHVzZWQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7IC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gICAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAgIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICAgIHZhciBoYXNDb250ZXh0ID0gZmFsc2U7XG5cbiAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgaGFzQ29udGV4dCA9IHRydWU7XG4gICAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzQ29udGV4dCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSB2YWx1ZS5zdGF0ZSAhPT0gbnVsbCAmJiB2YWx1ZS5zdGF0ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUuc3RhdGUgOiBudWxsO1xuICAgIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCB2YWx1ZSk7XG4gICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgcmV0dXJuIGZpbmlzaENsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQcm9jZWVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyBhIGZ1bmN0aW9uIGNvbXBvbmVudFxuICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IEZ1bmN0aW9uQ29tcG9uZW50O1xuXG4gICAge1xuXG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIHJlY29uY2lsZUNoaWxkcmVuKG51bGwsIHdvcmtJblByb2dyZXNzLCB2YWx1ZSwgcmVuZGVyTGFuZXMpO1xuXG4gICAge1xuICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCkge1xuICB7XG4gICAgaWYgKENvbXBvbmVudCkge1xuICAgICAgaWYgKENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogY2hpbGRDb250ZXh0VHlwZXMgY2Fubm90IGJlIGRlZmluZWQgb24gYSBmdW5jdGlvbiBjb21wb25lbnQuJywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MucmVmICE9PSBudWxsKSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuICAgICAgdmFyIG93bmVyTmFtZSA9IGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCk7XG5cbiAgICAgIGlmIChvd25lck5hbWUpIHtcbiAgICAgICAgaW5mbyArPSAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICAgICAgfVxuXG4gICAgICB2YXIgd2FybmluZ0tleSA9IG93bmVyTmFtZSB8fCAnJztcbiAgICAgIHZhciBkZWJ1Z1NvdXJjZSA9IHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZTtcblxuICAgICAgaWYgKGRlYnVnU291cmNlKSB7XG4gICAgICAgIHdhcm5pbmdLZXkgPSBkZWJ1Z1NvdXJjZS5maWxlTmFtZSArICc6JyArIGRlYnVnU291cmNlLmxpbmVOdW1iZXI7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmc1t3YXJuaW5nS2V5XSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ0Z1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGJlIGdpdmVuIHJlZnMuICcgKyAnQXR0ZW1wdHMgdG8gYWNjZXNzIHRoaXMgcmVmIHdpbGwgZmFpbC4gJyArICdEaWQgeW91IG1lYW4gdG8gdXNlIFJlYWN0LmZvcndhcmRSZWYoKT8lcycsIGluZm8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICggQ29tcG9uZW50LmRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCclczogU3VwcG9ydCBmb3IgZGVmYXVsdFByb3BzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGZ1bmN0aW9uIGNvbXBvbmVudHMgJyArICdpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBVc2UgSmF2YVNjcmlwdCBkZWZhdWx0IHBhcmFtZXRlcnMgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTMgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdKSB7XG4gICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuJywgX2NvbXBvbmVudE5hbWUzKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lM10gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50LmNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBDb21wb25lbnQuY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTQgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lNF0pIHtcbiAgICAgICAgZXJyb3IoJyVzOiBGdW5jdGlvbiBjb21wb25lbnRzIGRvIG5vdCBzdXBwb3J0IGNvbnRleHRUeXBlLicsIF9jb21wb25lbnROYW1lNCk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lNF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgU1VTUEVOREVEX01BUktFUiA9IHtcbiAgZGVoeWRyYXRlZDogbnVsbCxcbiAgdHJlZUNvbnRleHQ6IG51bGwsXG4gIHJldHJ5TGFuZTogTm9MYW5lXG59O1xuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlTGFuZXM6IHJlbmRlckxhbmVzLFxuICAgIGNhY2hlUG9vbDogZ2V0U3VzcGVuZGVkQ2FjaGUoKSxcbiAgICB0cmFuc2l0aW9uczogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNhY2hlUG9vbCA9IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICBiYXNlTGFuZXM6IG1lcmdlTGFuZXMocHJldk9mZnNjcmVlblN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpLFxuICAgIGNhY2hlUG9vbDogY2FjaGVQb29sLFxuICAgIHRyYW5zaXRpb25zOiBwcmV2T2Zmc2NyZWVuU3RhdGUudHJhbnNpdGlvbnNcbiAgfTtcbn0gLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIGlubGluZSB0aGlzIGJhY2tcblxuXG5mdW5jdGlvbiBzaG91bGRSZW1haW5PbkZhbGxiYWNrKHN1c3BlbnNlQ29udGV4dCwgY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgd2UgbmVlZCB0b1xuICAvLyByZW1haW4gb24gdGhhdCBmYWxsYmFjayByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGNvbnRlbnQgaGFzIHJlc29sdmVkLlxuICAvLyBGb3IgZXhhbXBsZSwgU3VzcGVuc2VMaXN0IGNvb3JkaW5hdGVzIHdoZW4gbmVzdGVkIGNvbnRlbnQgYXBwZWFycy5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICAvLyBDdXJyZW50bHkgc2hvd2luZyBjb250ZW50LiBEb24ndCBoaWRlIGl0LCBldmVuIGlmIEZvcmNlU3VzcGVuc2VGYWxsYmFja1xuICAgICAgLy8gaXMgdHJ1ZS4gTW9yZSBwcmVjaXNlIG5hbWUgbWlnaHQgYmUgXCJGb3JjZVJlbWFpblN1c3BlbnNlRmFsbGJhY2tcIi5cbiAgICAgIC8vIE5vdGU6IFRoaXMgaXMgYSBmYWN0b3Jpbmcgc21lbGwuIENhbid0IHJlbWFpbiBvbiBhIGZhbGxiYWNrIGlmIHRoZXJlJ3NcbiAgICAgIC8vIG5vIGZhbGxiYWNrIHRvIHJlbWFpbiBvbi5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gLy8gTm90IGN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIENvbnN1bHQgdGhlIFN1c3BlbnNlIGNvbnRleHQuXG5cblxuICByZXR1cm4gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogU2hvdWxkIG5vdCByZW1vdmUgcmVuZGVyIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgZHVyaW5nIHRoaXMgcmVuZGVyXG4gIHJldHVybiByZW1vdmVMYW5lcyhjdXJyZW50LmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIFRoaXMgaXMgdXNlZCBieSBEZXZUb29scyB0byBmb3JjZSBhIGJvdW5kYXJ5IHRvIHN1c3BlbmQuXG5cbiAge1xuICAgIGlmIChzaG91bGRTdXNwZW5kKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvd0ZhbGxiYWNrID0gZmFsc2U7XG4gIHZhciBkaWRTdXNwZW5kID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKGRpZFN1c3BlbmQgfHwgc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQpKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoaXMgYm91bmRhcnkncyBzdWJ0cmVlIGFscmVhZHkgc3VzcGVuZGVkLiBTd2l0Y2ggdG9cbiAgICAvLyByZW5kZXJpbmcgdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgIHNob3dGYWxsYmFjayA9IHRydWU7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfkRpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXR0ZW1wdGluZyB0aGUgbWFpbiBjb250ZW50XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50IG9yIHRoaXMgYm91bmRhcnkgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgc3RhdGUuXG4gICAgICAvLyBNYXJrIHRoaXMgc3VidHJlZSBjb250ZXh0IGFzIGhhdmluZyBhdCBsZWFzdCBvbmUgaW52aXNpYmxlIHBhcmVudCB0aGF0IGNvdWxkXG4gICAgICAvLyBoYW5kbGUgdGhlIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gQXZvaWRlZCBib3VuZGFyaWVzIGFyZSBub3QgY29uc2lkZXJlZCBzaW5jZSB0aGV5IGNhbm5vdCBoYW5kbGUgcHJlZmVycmVkIGZhbGxiYWNrIHN0YXRlcy5cbiAgICAgIHtcbiAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gYWRkU3VidHJlZVN1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gT0ssIHRoZSBuZXh0IHBhcnQgaXMgY29uZnVzaW5nLiBXZSdyZSBhYm91dCB0byByZWNvbmNpbGUgdGhlIFN1c3BlbnNlXG4gIC8vIGJvdW5kYXJ5J3MgY2hpbGRyZW4uIFRoaXMgaW52b2x2ZXMgc29tZSBjdXN0b20gcmVjb25jaWxpYXRpb24gbG9naWMuIFR3b1xuICAvLyBtYWluIHJlYXNvbnMgdGhpcyBpcyBzbyBjb21wbGljYXRlZC5cbiAgLy9cbiAgLy8gRmlyc3QsIExlZ2FjeSBNb2RlIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gVGhlXG4gIC8vIHByaW1hcnkgdHJlZSB3aWxsIGNvbW1pdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUsIHNvIHdoZW4gd2UgZG8gdGhlXG4gIC8vIHNlY29uZCBwYXNzIHRvIHJlbmRlciB0aGUgZmFsbGJhY2ssIHdlIGRvIHNvbWUgZXhjZWVkaW5nbHksIHVoLCBjbGV2ZXJcbiAgLy8gaGFja3MgdG8gbWFrZSB0aGF0IG5vdCB0b3RhbGx5IGJyZWFrLiBMaWtlIHRyYW5zZmVycmluZyBlZmZlY3RzIGFuZFxuICAvLyBkZWxldGlvbnMgZnJvbSBoaWRkZW4gdHJlZS4gSW4gQ29uY3VycmVudCBNb2RlLCBpdCdzIG11Y2ggc2ltcGxlcixcbiAgLy8gYmVjYXVzZSB3ZSBiYWlsb3V0IG9uIHRoZSBwcmltYXJ5IHRyZWUgY29tcGxldGVseSBhbmQgbGVhdmUgaXQgaW4gaXRzIG9sZFxuICAvLyBzdGF0ZSwgbm8gZWZmZWN0cy4gU2FtZSBhcyB3aGF0IHdlIGRvIGZvciBPZmZzY3JlZW4gKGV4Y2VwdCB0aGF0XG4gIC8vIE9mZnNjcmVlbiBkb2Vzbid0IGhhdmUgdGhlIGZpcnN0IHJlbmRlciBwYXNzKS5cbiAgLy9cbiAgLy8gU2Vjb25kIGlzIGh5ZHJhdGlvbi4gRHVyaW5nIGh5ZHJhdGlvbiwgdGhlIFN1c3BlbnNlIGZpYmVyIGhhcyBhIHNsaWdodGx5XG4gIC8vIGRpZmZlcmVudCBsYXlvdXQsIHdoZXJlIHRoZSBjaGlsZCBwb2ludHMgdG8gYSBkZWh5ZHJhdGVkIGZyYWdtZW50LCB3aGljaFxuICAvLyBjb250YWlucyB0aGUgRE9NIHJlbmRlcmVkIGJ5IHRoZSBzZXJ2ZXIuXG4gIC8vXG4gIC8vIFRoaXJkLCBldmVuIGlmIHlvdSBzZXQgYWxsIHRoYXQgYXNpZGUsIFN1c3BlbnNlIGlzIGxpa2UgZXJyb3IgYm91bmRhcmllcyBpblxuICAvLyB0aGF0IHdlIGZpcnN0IHdlIHRyeSB0byByZW5kZXIgb25lIHRyZWUsIGFuZCBpZiB0aGF0IGZhaWxzLCB3ZSByZW5kZXIgYWdhaW5cbiAgLy8gYW5kIHN3aXRjaCB0byBhIGRpZmZlcmVudCB0cmVlLiBMaWtlIGEgdHJ5L2NhdGNoIGJsb2NrLiBTbyB3ZSBoYXZlIHRvIHRyYWNrXG4gIC8vIHdoaWNoIGJyYW5jaCB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nLiBJZGVhbGx5IHdlIHdvdWxkIG1vZGVsIHRoaXMgdXNpbmdcbiAgLy8gYSBzdGFjay5cblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIEluaXRpYWwgbW91bnRcbiAgICAvLyBTcGVjaWFsIHBhdGggZm9yIGh5ZHJhdGlvblxuICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBoeWRyYXRpbmcsIHRyeSB0byBoeWRyYXRlIHRoaXMgYm91bmRhcnkuXG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpOyAvLyBUaGlzIGNvdWxkJ3ZlIGJlZW4gYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudC5cblxuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICB2YXIgZGVoeWRyYXRlZCA9IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgaWYgKGRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG1vdW50RGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KHdvcmtJblByb2dyZXNzLCBkZWh5ZHJhdGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgZmFsbGJhY2tGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuXG4gICAgICByZXR1cm4gZmFsbGJhY2tGcmFnbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVwZGF0ZS5cbiAgICAvLyBTcGVjaWFsIHBhdGggZm9yIGh5ZHJhdGlvblxuICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2RlaHlkcmF0ZWQgPSBwcmV2U3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgaWYgKF9kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGRpZFN1c3BlbmQsIG5leHRQcm9wcywgX2RlaHlkcmF0ZWQsIHByZXZTdGF0ZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93RmFsbGJhY2spIHtcbiAgICAgIHZhciBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbiwgX25leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdGF0ZSA9IGN1cnJlbnQuY2hpbGQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIubWVtb2l6ZWRTdGF0ZSA9IHByZXZPZmZzY3JlZW5TdGF0ZSA9PT0gbnVsbCA/IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykgOiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLmNoaWxkTGFuZXMgPSBnZXRSZW1haW5pbmdXb3JrSW5QcmltYXJ5VHJlZShjdXJyZW50LCByZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbjIgPSBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzID0gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuMiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSk7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gICAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSk7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKG9mZnNjcmVlblByb3BzLCBtb2RlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbmAgaXMgYGFueWAgdHlwZWQsIHNvIHdlIHVzZVxuICAvLyB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LlxuICByZXR1cm4gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKG9mZnNjcmVlblByb3BzLCBtb2RlLCBOb0xhbmVzLCBudWxsKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZVdvcmtJblByb2dyZXNzYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlIHRoaXNcbiAgLy8gd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH0pO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgfVxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gbnVsbDtcblxuICBpZiAoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIC8vIERlbGV0ZSB0aGUgZmFsbGJhY2sgY2hpbGQgZnJhZ21lbnRcbiAgICB2YXIgZGVsZXRpb25zID0gd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gW2N1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnRdO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDtcbiAgdmFyIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZztcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuXG4gIGlmICggLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseVxuICAvLyBjb21wbGV0ZWQsIGV2ZW4gdGhvdWdoIGl0J3MgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLlxuICAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIE1ha2Ugc3VyZSB3ZSdyZSBvbiB0aGUgc2Vjb25kIHBhc3MsIGkuZS4gdGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgd2FzXG4gIC8vIGFscmVhZHkgY2xvbmVkLiBJbiBsZWdhY3kgbW9kZSwgdGhlIG9ubHkgY2FzZSB3aGVyZSB0aGlzIGlzbid0IHRydWUgaXNcbiAgLy8gd2hlbiBEZXZUb29scyBmb3JjZXMgdXMgdG8gZGlzcGxheSBhIGZhbGxiYWNrOyB3ZSBza2lwIHRoZSBmaXJzdCByZW5kZXJcbiAgLy8gcGFzcyBlbnRpcmVseSBhbmQgZ28gc3RyYWlnaHQgdG8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjay4gKEluIENvbmN1cnJlbnRcbiAgLy8gTW9kZSwgU3VzcGVuc2VMaXN0IGNhbiBhbHNvIHRyaWdnZXIgdGhpcyBzY2VuYXJpbywgYnV0IHRoaXMgaXMgYSBsZWdhY3ktXG4gIC8vIG9ubHkgY29kZXBhdGguKVxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCAhPT0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50KSB7XG4gICAgdmFyIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgfSAvLyBUaGUgZmFsbGJhY2sgZmliZXIgd2FzIGFkZGVkIGFzIGEgZGVsZXRpb24gZHVyaW5nIHRoZSBmaXJzdCBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIHJlbWFpbiBvbiB0aGUgZmFsbGJhY2ssIHdlIG5vIGxvbmdlciB3YW50XG4gICAgLy8gdG8gZGVsZXRlIGl0LlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHByaW1hcnlDaGlsZFByb3BzKTsgLy8gU2luY2Ugd2UncmUgcmV1c2luZyBhIGN1cnJlbnQgdHJlZSwgd2UgbmVlZCB0byByZXVzZSB0aGUgZmxhZ3MsIHRvby5cbiAgICAvLyAoV2UgZG9uJ3QgZG8gdGhpcyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBpbiBsZWdhY3kgbW9kZSB3ZSBkb24ndCByZS11c2VcbiAgICAvLyB0aGUgY3VycmVudCB0cmVlOyBzZWUgcHJldmlvdXMgYnJhbmNoLilcblxuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnN1YnRyZWVGbGFncyA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICB9XG5cbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcblxuICBpZiAoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQsIGZhbGxiYWNrQ2hpbGRyZW4pO1xuICB9IGVsc2Uge1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlIGJvdW5kYXJ5KSBhbHJlYWR5XG4gICAgLy8gbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIH1cblxuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIHJlY292ZXJhYmxlRXJyb3IpIHtcbiAgLy8gRmFsbGluZyBiYWNrIHRvIGNsaWVudCByZW5kZXJpbmcuIEJlY2F1c2UgdGhpcyBoYXMgcGVyZm9ybWFuY2VcbiAgLy8gaW1wbGljYXRpb25zLCBpdCdzIGNvbnNpZGVyZWQgYSByZWNvdmVyYWJsZSBlcnJvciwgZXZlbiB0aG91Z2ggdGhlIHVzZXJcbiAgLy8gbGlrZWx5IHdvbid0IG9ic2VydmUgYW55dGhpbmcgd3Jvbmcgd2l0aCB0aGUgVUkuXG4gIC8vXG4gIC8vIFRoZSBlcnJvciBpcyBwYXNzZWQgaW4gYXMgYW4gYXJndW1lbnQgdG8gZW5mb3JjZSB0aGF0IGV2ZXJ5IGNhbGxlciBwcm92aWRlXG4gIC8vIGEgY3VzdG9tIG1lc3NhZ2UsIG9yIGV4cGxpY2l0bHkgb3B0IG91dCAoY3VycmVudGx5IHRoZSBvbmx5IHBhdGggdGhhdCBvcHRzXG4gIC8vIG91dCBpcyBsZWdhY3kgbW9kZTsgZXZlcnkgY29uY3VycmVudCBwYXRoIHByb3ZpZGVzIGFuIGVycm9yKS5cbiAgaWYgKHJlY292ZXJhYmxlRXJyb3IgIT09IG51bGwpIHtcbiAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICB9IC8vIFRoaXMgd2lsbCBhZGQgdGhlIG9sZCBmaWJlciB0byB0aGUgZGVsZXRpb24gbGlzdFxuXG5cbiAgcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTsgLy8gV2UncmUgbm93IG5vdCBzdXNwZW5kZWQgbm9yIGRlaHlkcmF0ZWQuXG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlIGJvdW5kYXJ5KSBhbHJlYWR5XG4gIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlRmFsbGJhY2tBZnRlclJldHJ5V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgZmliZXJNb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgZmliZXJNb2RlKTtcbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIGZpYmVyTW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2VcbiAgLy8gYm91bmRhcnkpIGFscmVhZHkgbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgLy8gV2Ugd2lsbCBoYXZlIGRyb3BwZWQgdGhlIGVmZmVjdCBsaXN0IHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgIC8vIGRlbGV0aW9uLiBXZSBuZWVkIHRvIHJlY29uY2lsZSB0byBkZWxldGUgdGhlIGN1cnJlbnQgY2hpbGQuXG4gICAgcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCByZW5kZXJMYW5lcykge1xuICAvLyBEdXJpbmcgdGhlIGZpcnN0IHBhc3MsIHdlJ2xsIGJhaWwgb3V0IGFuZCBub3QgZHJpbGwgaW50byB0aGUgY2hpbGRyZW4uXG4gIC8vIEluc3RlYWQsIHdlJ2xsIGxlYXZlIHRoZSBjb250ZW50IGluIHBsYWNlIGFuZCB0cnkgdG8gaHlkcmF0ZSBpdCBsYXRlci5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICB7XG4gICAgICBlcnJvcignQ2Fubm90IGh5ZHJhdGUgU3VzcGVuc2UgaW4gbGVnYWN5IG1vZGUuIFN3aXRjaCBmcm9tICcgKyAnUmVhY3RET00uaHlkcmF0ZShlbGVtZW50LCBjb250YWluZXIpIHRvICcgKyAnUmVhY3RET01DbGllbnQuaHlkcmF0ZVJvb3QoY29udGFpbmVyLCA8QXBwIC8+KScgKyAnLnJlbmRlcihlbGVtZW50KSBvciByZW1vdmUgdGhlIFN1c3BlbnNlIGNvbXBvbmVudHMgZnJvbSAnICsgJ3RoZSBzZXJ2ZXIgcmVuZGVyZWQgY29tcG9uZW50cy4nKTtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKFN5bmNMYW5lKTtcbiAgfSBlbHNlIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgIC8vIFRoaXMgaXMgYSBjbGllbnQtb25seSBib3VuZGFyeS4gU2luY2Ugd2Ugd29uJ3QgZ2V0IGFueSBjb250ZW50IGZyb20gdGhlIHNlcnZlclxuICAgIC8vIGZvciB0aGlzLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHRoYXQgYXQgYSBoaWdoZXIgcHJpb3JpdHkgYmFzZWQgb24gd2hlbiBpdCB3b3VsZFxuICAgIC8vIGhhdmUgdGltZWQgb3V0LiBJbiB0aGVvcnkgd2UgY291bGQgcmVuZGVyIGl0IGluIHRoaXMgcGFzcyBidXQgaXQgd291bGQgaGF2ZSB0aGVcbiAgICAvLyB3cm9uZyBwcmlvcml0eSBhc3NvY2lhdGVkIHdpdGggaXQgYW5kIHdpbGwgcHJldmVudCBoeWRyYXRpb24gb2YgcGFyZW50IHBhdGguXG4gICAgLy8gSW5zdGVhZCwgd2UnbGwgbGVhdmUgd29yayBsZWZ0IG9uIGl0IHRvIHJlbmRlciBpdCBpbiBhIHNlcGFyYXRlIGNvbW1pdC5cbiAgICAvLyBUT0RPIFRoaXMgdGltZSBzaG91bGQgYmUgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHNlcnZlciByZW5kZXJlZCByZXNwb25zZSB0aGF0IGlzXG4gICAgLy8gYSBwYXJlbnQgdG8gdGhpcyBib3VuZGFyeSB3YXMgZGlzcGxheWVkLiBIb3dldmVyLCBzaW5jZSB3ZSBjdXJyZW50bHkgZG9uJ3QgaGF2ZVxuICAgIC8vIGEgcHJvdG9jb2wgdG8gdHJhbnNmZXIgdGhhdCB0aW1lLCB3ZSdsbCBqdXN0IGVzdGltYXRlIGl0IGJ5IHVzaW5nIHRoZSBjdXJyZW50XG4gICAgLy8gdGltZS4gVGhpcyB3aWxsIG1lYW4gdGhhdCBTdXNwZW5zZSB0aW1lb3V0cyBhcmUgc2xpZ2h0bHkgc2hpZnRlZCB0byBsYXRlciB0aGFuXG4gICAgLy8gdGhleSBzaG91bGQgYmUuXG4gICAgLy8gU2NoZWR1bGUgYSBub3JtYWwgcHJpIHVwZGF0ZSB0byByZW5kZXIgdGhpcyBjb250ZW50LlxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoRGVmYXVsdEh5ZHJhdGlvbkxhbmUpO1xuICB9IGVsc2Uge1xuICAgIC8vIFdlJ2xsIGNvbnRpbnVlIGh5ZHJhdGluZyB0aGUgcmVzdCBhdCBvZmZzY3JlZW4gcHJpb3JpdHkgc2luY2Ugd2UnbGwgYWxyZWFkeVxuICAgIC8vIGJlIHNob3dpbmcgdGhlIHJpZ2h0IGNvbnRlbnQgY29taW5nIGZyb20gdGhlIHNlcnZlciwgaXQgaXMgbm8gcnVzaC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKE9mZnNjcmVlbkxhbmUpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZGlkU3VzcGVuZCwgbmV4dFByb3BzLCBzdXNwZW5zZUluc3RhbmNlLCBzdXNwZW5zZVN0YXRlLCByZW5kZXJMYW5lcykge1xuICBpZiAoIWRpZFN1c3BlbmQpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCByZW5kZXIgcGFzcy4gQXR0ZW1wdCB0byBoeWRyYXRlLlxuICAgIC8vIFdlIHNob3VsZCBuZXZlciBiZSBoeWRyYXRpbmcgYXQgdGhpcyBwb2ludCBiZWNhdXNlIGl0IGlzIHRoZSBmaXJzdCBwYXNzLFxuICAgIC8vIGJ1dCBhZnRlciB3ZSd2ZSBhbHJlYWR5IGNvbW1pdHRlZCBvbmNlLlxuICAgIHdhcm5JZkh5ZHJhdGluZygpO1xuXG4gICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIC8vIFRPRE86IFdoZW4gd2UgZGVsZXRlIGxlZ2FjeSBtb2RlLCB3ZSBzaG91bGQgbWFrZSB0aGlzIGVycm9yIGFyZ3VtZW50XG4gICAgICAvLyByZXF1aXJlZCDigJQgZXZlcnkgY29uY3VycmVudCBtb2RlIHBhdGggdGhhdCBjYXVzZXMgaHlkcmF0aW9uIHRvXG4gICAgICAvLyBkZS1vcHQgdG8gY2xpZW50IHJlbmRlcmluZyBzaG91bGQgaGF2ZSBhbiBlcnJvciBtZXNzYWdlLlxuICAgICAgbnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgICAvLyBUaGlzIGJvdW5kYXJ5IGlzIGluIGEgcGVybWFuZW50IGZhbGxiYWNrIHN0YXRlLiBJbiB0aGlzIGNhc2UsIHdlJ2xsIG5ldmVyXG4gICAgICAvLyBnZXQgYW4gdXBkYXRlIGFuZCB3ZSdsbCBuZXZlciBiZSBhYmxlIHRvIGh5ZHJhdGUgdGhlIGZpbmFsIGNvbnRlbnQuIExldCdzIGp1c3QgdHJ5IHRoZVxuICAgICAgLy8gY2xpZW50IHNpZGUgcmVuZGVyIGluc3RlYWQuXG4gICAgICB2YXIgZGlnZXN0LCBtZXNzYWdlLCBzdGFjaztcblxuICAgICAge1xuICAgICAgICB2YXIgX2dldFN1c3BlbnNlSW5zdGFuY2VGID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrRXJyb3JEZXRhaWxzKHN1c3BlbnNlSW5zdGFuY2UpO1xuXG4gICAgICAgIGRpZ2VzdCA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5kaWdlc3Q7XG4gICAgICAgIG1lc3NhZ2UgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYubWVzc2FnZTtcbiAgICAgICAgc3RhY2sgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYuc3RhY2s7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvcjtcblxuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignVGhlIHNlcnZlciBjb3VsZCBub3QgZmluaXNoIHRoaXMgU3VzcGVuc2UgYm91bmRhcnksIGxpa2VseSAnICsgJ2R1ZSB0byBhbiBlcnJvciBkdXJpbmcgc2VydmVyIHJlbmRlcmluZy4gU3dpdGNoZWQgdG8gJyArICdjbGllbnQgcmVuZGVyaW5nLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2FwdHVyZWRWYWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUoZXJyb3IsIGRpZ2VzdCwgc3RhY2spO1xuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgY2FwdHVyZWRWYWx1ZSk7XG4gICAgfVxuICAgIC8vIGFueSBjb250ZXh0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHRyZWF0IGlzIGFzIGlmIHRoZSBpbnB1dCBtaWdodCBoYXZlIGNoYW5nZWQuXG5cblxuICAgIHZhciBoYXNDb250ZXh0Q2hhbmdlZCA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIGN1cnJlbnQuY2hpbGRMYW5lcyk7XG5cbiAgICBpZiAoZGlkUmVjZWl2ZVVwZGF0ZSB8fCBoYXNDb250ZXh0Q2hhbmdlZCkge1xuICAgICAgLy8gVGhpcyBib3VuZGFyeSBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgZmlyc3QgcmVuZGVyLiBUaGlzIG1lYW5zIHRoYXQgd2UgYXJlIG5vdyB1bmFibGUgdG9cbiAgICAgIC8vIGh5ZHJhdGUgaXQuIFdlIG1pZ2h0IHN0aWxsIGJlIGFibGUgdG8gaHlkcmF0ZSBpdCB1c2luZyBhIGhpZ2hlciBwcmlvcml0eSBsYW5lLlxuICAgICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGF0dGVtcHRIeWRyYXRpb25BdExhbmUgPSBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uKHJvb3QsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICBpZiAoYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSAhPT0gTm9MYW5lICYmIGF0dGVtcHRIeWRyYXRpb25BdExhbmUgIT09IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lKSB7XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBtdXRhdGluZyBzaW5jZSB0aGlzIHJlbmRlciB3aWxsIGdldCBpbnRlcnJ1cHRlZC4gVGhpc1xuICAgICAgICAgIC8vIGlzIG9uZSBvZiB0aGUgdmVyeSByYXJlIHRpbWVzIHdoZXJlIHdlIG11dGF0ZSB0aGUgY3VycmVudCB0cmVlXG4gICAgICAgICAgLy8gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICAgICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lOyAvLyBUT0RPOiBJZGVhbGx5IHRoaXMgd291bGQgaW5oZXJpdCB0aGUgZXZlbnQgdGltZSBvZiB0aGUgY3VycmVudCByZW5kZXJcblxuICAgICAgICAgIHZhciBldmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcbiAgICAgICAgICBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoY3VycmVudCwgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSk7XG4gICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGN1cnJlbnQsIGF0dGVtcHRIeWRyYXRpb25BdExhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gSWYgd2UgaGF2ZSBzY2hlZHVsZWQgaGlnaGVyIHByaSB3b3JrIGFib3ZlLCB0aGlzIHdpbGwgcHJvYmFibHkganVzdCBhYm9ydCB0aGUgcmVuZGVyXG4gICAgICAvLyBzaW5jZSB3ZSBub3cgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgd29yaywgYnV0IGluIGNhc2UgaXQgZG9lc24ndCwgd2UgbmVlZCB0byBwcmVwYXJlIHRvXG4gICAgICAvLyByZW5kZXIgc29tZXRoaW5nLCBpZiB3ZSB0aW1lIG91dC4gRXZlbiBpZiB0aGF0IHJlcXVpcmVzIHVzIHRvIGRlbGV0ZSBldmVyeXRoaW5nIGFuZFxuICAgICAgLy8gc2tpcCBoeWRyYXRpb24uXG4gICAgICAvLyBEZWxheSBoYXZpbmcgdG8gZG8gdGhpcyBhcyBsb25nIGFzIHRoZSBzdXNwZW5zZSB0aW1lb3V0IGFsbG93cyB1cy5cblxuXG4gICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG5cbiAgICAgIHZhciBfY2FwdHVyZWRWYWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUobmV3IEVycm9yKCdUaGlzIFN1c3BlbnNlIGJvdW5kYXJ5IHJlY2VpdmVkIGFuIHVwZGF0ZSBiZWZvcmUgaXQgZmluaXNoZWQgJyArICdoeWRyYXRpbmcuIFRoaXMgY2F1c2VkIHRoZSBib3VuZGFyeSB0byBzd2l0Y2ggdG8gY2xpZW50IHJlbmRlcmluZy4gJyArICdUaGUgdXN1YWwgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHdyYXAgdGhlIG9yaWdpbmFsIHVwZGF0ZSAnICsgJ2luIHN0YXJ0VHJhbnNpdGlvbi4nKSk7XG5cbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIF9jYXB0dXJlZFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIHN0aWxsIHBlbmRpbmcgbW9yZSBkYXRhIGZyb20gdGhlIHNlcnZlciwgc28gd2UgY2FuJ3QgaHlkcmF0ZSBpdHNcbiAgICAgIC8vIGNvbnRlbnQuIFdlIHRyZWF0IGl0IGFzIGlmIHRoaXMgY29tcG9uZW50IHN1c3BlbmRlZCBpdHNlbGYuIEl0IG1pZ2h0IHNlZW0gYXMgaWZcbiAgICAgIC8vIHdlIGNvdWxkIGp1c3QgdHJ5IHRvIHJlbmRlciBpdCBjbGllbnQtc2lkZSBpbnN0ZWFkLiBIb3dldmVyLCB0aGlzIHdpbGwgcGVyZm9ybSBhXG4gICAgICAvLyBsb3Qgb2YgdW5uZWNlc3Nhcnkgd29yayBhbmQgaXMgdW5saWtlbHkgdG8gY29tcGxldGUgc2luY2UgaXQgb2Z0ZW4gd2lsbCBzdXNwZW5kXG4gICAgICAvLyBvbiBtaXNzaW5nIGRhdGEgYW55d2F5LiBBZGRpdGlvbmFsbHksIHRoZSBzZXJ2ZXIgbWlnaHQgYmUgYWJsZSB0byByZW5kZXIgbW9yZVxuICAgICAgLy8gdGhhbiB3ZSBjYW4gb24gdGhlIGNsaWVudCB5ZXQuIEluIHRoYXQgY2FzZSB3ZSdkIGVuZCB1cCB3aXRoIG1vcmUgZmFsbGJhY2sgc3RhdGVzXG4gICAgICAvLyBvbiB0aGUgY2xpZW50IHRoYW4gaWYgd2UganVzdCBsZWF2ZSBpdCBhbG9uZS4gSWYgdGhlIHNlcnZlciB0aW1lcyBvdXQgb3IgZXJyb3JzXG4gICAgICAvLyB0aGVzZSBzaG91bGQgdXBkYXRlIHRoaXMgYm91bmRhcnkgdG8gdGhlIHBlcm1hbmVudCBGYWxsYmFjayBzdGF0ZSBpbnN0ZWFkLlxuICAgICAgLy8gTWFyayBpdCBhcyBoYXZpbmcgY2FwdHVyZWQgKGkuZS4gc3VzcGVuZGVkKS5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7IC8vIExlYXZlIHRoZSBjaGlsZCBpbiBwbGFjZS4gSS5lLiB0aGUgZGVoeWRyYXRlZCBmcmFnbWVudC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIHJldHJ5IHRoaXMgYm91bmRhcnkgb25jZSB0aGUgc2VydmVyIGhhcyBzZW50IHRoZSByZXN1bHQuXG5cbiAgICAgIHZhciByZXRyeSA9IHJldHJ5RGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkuYmluZChudWxsLCBjdXJyZW50KTtcbiAgICAgIHJlZ2lzdGVyU3VzcGVuc2VJbnN0YW5jZVJldHJ5KHN1c3BlbnNlSW5zdGFuY2UsIHJldHJ5KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBhdHRlbXB0LlxuICAgICAgcmVlbnRlckh5ZHJhdGlvblN0YXRlRnJvbURlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCBzdXNwZW5zZVN0YXRlLnRyZWVDb250ZXh0KTtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4pOyAvLyBNYXJrIHRoZSBjaGlsZHJlbiBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGRcbiAgICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET01cbiAgICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5mbGFncyB8PSBIeWRyYXRpbmc7XG4gICAgICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNlY29uZCByZW5kZXIgcGFzcy4gV2UgYWxyZWFkeSBhdHRlbXB0ZWQgdG8gaHlkcmF0ZWQsIGJ1dFxuICAgIC8vIHNvbWV0aGluZyBlaXRoZXIgc3VzcGVuZGVkIG9yIGVycm9yZWQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9yY2VDbGllbnRSZW5kZXIpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBlcnJvcmVkIGR1cmluZyBoeWRyYXRpb24uIFRyeSBhZ2FpbiB3aXRob3V0IGh5ZHJhdGluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5Gb3JjZUNsaWVudFJlbmRlcjtcblxuICAgICAgdmFyIF9jYXB0dXJlZFZhbHVlMiA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUobmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nIHRoaXMgU3VzcGVuc2UgYm91bmRhcnkuICcgKyAnU3dpdGNoZWQgdG8gY2xpZW50IHJlbmRlcmluZy4nKSk7XG5cbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIF9jYXB0dXJlZFZhbHVlMik7XG4gICAgfSBlbHNlIGlmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBTb21ldGhpbmcgc3VzcGVuZGVkIGFuZCB3ZSBzaG91bGQgc3RpbGwgYmUgaW4gZGVoeWRyYXRlZCBtb2RlLlxuICAgICAgLy8gTGVhdmUgdGhlIGV4aXN0aW5nIGNoaWxkIGluIHBsYWNlLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBUaGUgZGVoeWRyYXRlZCBjb21wbGV0aW9uIHBhc3MgZXhwZWN0cyB0aGlzIGZsYWcgdG8gYmUgdGhlcmVcbiAgICAgIC8vIGJ1dCB0aGUgbm9ybWFsIHN1c3BlbnNlIHBhc3MgZG9lc24ndC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXNwZW5kZWQgYnV0IHdlIHNob3VsZCBubyBsb25nZXIgYmUgaW4gZGVoeWRyYXRlZCBtb2RlLlxuICAgICAgLy8gVGhlcmVmb3JlIHdlIG5vdyBoYXZlIHRvIHJlbmRlciB0aGUgZmFsbGJhY2suXG4gICAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBuZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcbiAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tBZnRlclJldHJ5V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ0ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ0Lm1lbW9pemVkU3RhdGUgPSBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIoZmliZXIsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKGZpYmVyLnJldHVybiwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCk7XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgZmlyc3RDaGlsZCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTWFyayBhbnkgU3VzcGVuc2UgYm91bmRhcmllcyB3aXRoIGZhbGxiYWNrcyBhcyBoYXZpbmcgd29yayB0byBkby5cbiAgLy8gSWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgZm9yY2VkIGludG8gZmFsbGJhY2tzLCB0aGV5IG1heSBub3cgYmUgYWJsZVxuICAvLyB0byB1bmJsb2NrLlxuICB2YXIgbm9kZSA9IGZpcnN0Q2hpbGQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIobm9kZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQpIHtcbiAgICAgIC8vIElmIHRoZSB0YWlsIGlzIGhpZGRlbiB0aGVyZSBtaWdodCBub3QgYmUgYW4gU3VzcGVuc2UgYm91bmRhcmllc1xuICAgICAgLy8gdG8gc2NoZWR1bGUgd29yayBvbi4gSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgb24gdGhlXG4gICAgICAvLyBsaXN0IGl0c2VsZi5cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gdHJhdmVyc2UgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBsaXN0IHNpbmNlXG4gICAgICAvLyB0aGUgbGlzdCB3aWxsIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIHdoZW4gaXQgcmVyZW5kZXJzLlxuICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZExhc3RDb250ZW50Um93KGZpcnN0Q2hpbGQpIHtcbiAgLy8gVGhpcyBpcyBnb2luZyB0byBmaW5kIHRoZSBsYXN0IHJvdyBhbW9uZyB0aGVzZSBjaGlsZHJlbiB0aGF0IGlzIGFscmVhZHlcbiAgLy8gc2hvd2luZyBjb250ZW50IG9uIHRoZSBzY3JlZW4sIGFzIG9wcG9zZWQgdG8gYmVpbmcgaW4gZmFsbGJhY2sgc3RhdGUgb3JcbiAgLy8gbmV3LiBJZiBhIHJvdyBoYXMgbXVsdGlwbGUgU3VzcGVuc2UgYm91bmRhcmllcywgYW55IG9mIHRoZW0gYmVpbmcgaW4gdGhlXG4gIC8vIGZhbGxiYWNrIHN0YXRlLCBjb3VudHMgYXMgdGhlIHdob2xlIHJvdyBiZWluZyBpbiBhIGZhbGxiYWNrIHN0YXRlLlxuICAvLyBOb3RlIHRoYXQgdGhlIFwicm93c1wiIHdpbGwgYmUgd29ya0luUHJvZ3Jlc3MsIGJ1dCBhbnkgbmVzdGVkIGNoaWxkcmVuXG4gIC8vIHdpbGwgc3RpbGwgYmUgY3VycmVudCBzaW5jZSB3ZSBoYXZlbid0IHJlbmRlcmVkIHRoZW0geWV0LiBUaGUgbW91bnRlZFxuICAvLyBvcmRlciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBuZXcgb3JkZXIuIFdlIHVzZSB0aGUgbmV3IG9yZGVyLlxuICB2YXIgcm93ID0gZmlyc3RDaGlsZDtcbiAgdmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDtcblxuICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgIGxhc3RDb250ZW50Um93ID0gcm93O1xuICAgIH1cblxuICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RDb250ZW50Um93O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAocmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCAmJiByZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICd0b2dldGhlcicgJiYgIWRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSkge1xuICAgICAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiByZXZlYWxPcmRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1VzZSBsb3dlcmNhc2UgXCIlc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnZm9yd2FyZCc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1JlYWN0IHVzZXMgdGhlIC1zIHN1ZmZpeCBpbiB0aGUgc3BlbGxpbmcuIFVzZSBcIiVzc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAodGFpbE1vZGUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdKSB7XG4gICAgICBpZiAodGFpbE1vZGUgIT09ICdjb2xsYXBzZWQnICYmIHRhaWxNb2RlICE9PSAnaGlkZGVuJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciB0YWlsIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwiY29sbGFwc2VkXCIgb3IgXCJoaWRkZW5cIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCc8U3VzcGVuc2VMaXN0IHRhaWw9XCIlc1wiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgJyArICdcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIi4gJyArICdEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSByZXZlYWxPcmRlcj1cImZvcndhcmRzXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkU2xvdCwgaW5kZXgpIHtcbiAge1xuICAgIHZhciBpc0FuQXJyYXkgPSBpc0FycmF5KGNoaWxkU2xvdCk7XG4gICAgdmFyIGlzSXRlcmFibGUgPSAhaXNBbkFycmF5ICYmIHR5cGVvZiBnZXRJdGVyYXRvckZuKGNoaWxkU2xvdCkgPT09ICdmdW5jdGlvbic7XG5cbiAgICBpZiAoaXNBbkFycmF5IHx8IGlzSXRlcmFibGUpIHtcbiAgICAgIHZhciB0eXBlID0gaXNBbkFycmF5ID8gJ2FycmF5JyA6ICdpdGVyYWJsZSc7XG5cbiAgICAgIGVycm9yKCdBIG5lc3RlZCAlcyB3YXMgcGFzc2VkIHRvIHJvdyAjJXMgaW4gPFN1c3BlbnNlTGlzdCAvPi4gV3JhcCBpdCBpbiAnICsgJ2FuIGFkZGl0aW9uYWwgU3VzcGVuc2VMaXN0IHRvIGNvbmZpZ3VyZSBpdHMgcmV2ZWFsT3JkZXI6ICcgKyAnPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+IC4uLiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPnslc308L1N1c3BlbnNlTGlzdD4gLi4uICcgKyAnPC9TdXNwZW5zZUxpc3Q+JywgdHlwZSwgaW5kZXgsIHR5cGUpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3VzcGVuc2VMaXN0Q2hpbGRyZW4oY2hpbGRyZW4sIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAoKHJldmVhbE9yZGVyID09PSAnZm9yd2FyZHMnIHx8IHJldmVhbE9yZGVyID09PSAnYmFja3dhcmRzJykgJiYgY2hpbGRyZW4gIT09IHVuZGVmaW5lZCAmJiBjaGlsZHJlbiAhPT0gbnVsbCAmJiBjaGlsZHJlbiAhPT0gZmFsc2UpIHtcbiAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkcmVuW2ldLCBpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW5JdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7XG5cbiAgICAgICAgICBpZiAoY2hpbGRyZW5JdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHN0ZXAgPSBjaGlsZHJlbkl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHZhciBfaSA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKHN0ZXAudmFsdWUsIF9pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF9pKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yKCdBIHNpbmdsZSByb3cgd2FzIHBhc3NlZCB0byBhIDxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9XCIlc1wiIC8+LiAnICsgJ1RoaXMgaXMgbm90IHVzZWZ1bCBzaW5jZSBpdCBuZWVkcyBtdWx0aXBsZSByb3dzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBwYXNzIG11bHRpcGxlIGNoaWxkcmVuIG9yIGFuIGFycmF5PycsIHJldmVhbE9yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGlzQmFja3dhcmRzLCB0YWlsLCBsYXN0Q29udGVudFJvdywgdGFpbE1vZGUpIHtcbiAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocmVuZGVyU3RhdGUgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0ge1xuICAgICAgaXNCYWNrd2FyZHM6IGlzQmFja3dhcmRzLFxuICAgICAgcmVuZGVyaW5nOiBudWxsLFxuICAgICAgcmVuZGVyaW5nU3RhcnRUaW1lOiAwLFxuICAgICAgbGFzdDogbGFzdENvbnRlbnRSb3csXG4gICAgICB0YWlsOiB0YWlsLFxuICAgICAgdGFpbE1vZGU6IHRhaWxNb2RlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSBjYW4gcmV1c2UgdGhlIGV4aXN0aW5nIG9iamVjdCBmcm9tIHByZXZpb3VzIHJlbmRlcnMuXG4gICAgcmVuZGVyU3RhdGUuaXNCYWNrd2FyZHMgPSBpc0JhY2t3YXJkcztcbiAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBudWxsO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IDA7XG4gICAgcmVuZGVyU3RhdGUubGFzdCA9IGxhc3RDb250ZW50Um93O1xuICAgIHJlbmRlclN0YXRlLnRhaWwgPSB0YWlsO1xuICAgIHJlbmRlclN0YXRlLnRhaWxNb2RlID0gdGFpbE1vZGU7XG4gIH1cbn0gLy8gVGhpcyBjYW4gZW5kIHVwIHJlbmRlcmluZyB0aGlzIGNvbXBvbmVudCBtdWx0aXBsZSBwYXNzZXMuXG4vLyBUaGUgZmlyc3QgcGFzcyBzcGxpdHMgdGhlIGNoaWxkcmVuIGZpYmVycyBpbnRvIHR3byBzZXRzLiBBIGhlYWQgYW5kIHRhaWwuXG4vLyBXZSBmaXJzdCByZW5kZXIgdGhlIGhlYWQuIElmIGFueXRoaW5nIGlzIGluIGZhbGxiYWNrIHN0YXRlLCB3ZSBkbyBhbm90aGVyXG4vLyBwYXNzIHRocm91Z2ggYmVnaW5Xb3JrIHRvIHJlcmVuZGVyIGFsbCBjaGlsZHJlbiAoaW5jbHVkaW5nIHRoZSB0YWlsKSB3aXRoXG4vLyB0aGUgZm9yY2Ugc3VzcGVuZCBjb250ZXh0LiBJZiB0aGUgZmlyc3QgcmVuZGVyIGRpZG4ndCBoYXZlIGFueXRoaW5nIGluXG4vLyBpbiBmYWxsYmFjayBzdGF0ZS4gVGhlbiB3ZSByZW5kZXIgZWFjaCByb3cgaW4gdGhlIHRhaWwgb25lLWJ5LW9uZS5cbi8vIFRoYXQgaGFwcGVucyBpbiB0aGUgY29tcGxldGVXb3JrIHBoYXNlIHdpdGhvdXQgZ29pbmcgYmFjayB0byBiZWdpbldvcmsuXG5cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcmV2ZWFsT3JkZXIgPSBuZXh0UHJvcHMucmV2ZWFsT3JkZXI7XG4gIHZhciB0YWlsTW9kZSA9IG5leHRQcm9wcy50YWlsO1xuICB2YXIgbmV3Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhbGlkYXRlUmV2ZWFsT3JkZXIocmV2ZWFsT3JkZXIpO1xuICB2YWxpZGF0ZVRhaWxPcHRpb25zKHRhaWxNb2RlLCByZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlU3VzcGVuc2VMaXN0Q2hpbGRyZW4obmV3Q2hpbGRyZW4sIHJldmVhbE9yZGVyKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIHZhciBzaG91bGRGb3JjZUZhbGxiYWNrID0gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcblxuICBpZiAoc2hvdWxkRm9yY2VGYWxsYmFjaykge1xuICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGRpZFN1c3BlbmRCZWZvcmUgPSBjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgLy8gSWYgd2UgcHJldmlvdXNseSBmb3JjZWQgYSBmYWxsYmFjaywgd2UgbmVlZCB0byBzY2hlZHVsZSB3b3JrXG4gICAgICAvLyBvbiBhbnkgbmVzdGVkIGJvdW5kYXJpZXMgdG8gbGV0IHRoZW0ga25vdyB0byB0cnkgdG8gcmVuZGVyXG4gICAgICAvLyBhZ2Fpbi4gVGhpcyBpcyB0aGUgc2FtZSBhcyBjb250ZXh0IHVwZGF0aW5nLlxuICAgICAgcHJvcGFnYXRlU3VzcGVuc2VDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZCwgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIH1cblxuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIFN1c3BlbnNlTGlzdCBkb2Vzbid0IHdvcmsgc28gd2UganVzdFxuICAgIC8vIHVzZSBtYWtlIGl0IGEgbm9vcCBieSB0cmVhdGluZyBpdCBhcyB0aGUgZGVmYXVsdCByZXZlYWxPcmRlci5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHJldmVhbE9yZGVyKSB7XG4gICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGFzdENvbnRlbnRSb3cgPSBmaW5kTGFzdENvbnRlbnRSb3cod29ya0luUHJvZ3Jlc3MuY2hpbGQpO1xuICAgICAgICAgIHZhciB0YWlsO1xuXG4gICAgICAgICAgaWYgKGxhc3RDb250ZW50Um93ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgd2hvbGUgbGlzdCBpcyBwYXJ0IG9mIHRoZSB0YWlsLlxuICAgICAgICAgICAgLy8gVE9ETzogV2UgY291bGQgZmFzdCBwYXRoIGJ5IGp1c3QgcmVuZGVyaW5nIHRoZSB0YWlsIG5vdy5cbiAgICAgICAgICAgIHRhaWwgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgdGFpbCByb3dzIGFmdGVyIHRoZSBjb250ZW50IHJvdy5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGVtIHNlcGFyYXRlbHkgbGF0ZXIuXG4gICAgICAgICAgICB0YWlsID0gbGFzdENvbnRlbnRSb3cuc2libGluZztcbiAgICAgICAgICAgIGxhc3RDb250ZW50Um93LnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gZmluZCB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSdyZSBnb2luZyB0byByZXZlcnNlIHRoZSBsaXN0IG9mIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvLyB3ZSBwYXNzIGluIHRoZSBtZWFudGltZS4gVGhhdCdzIGdvaW5nIHRvIGJlIG91ciB0YWlsIGluIHJldmVyc2VcbiAgICAgICAgICAvLyBvcmRlci5cbiAgICAgICAgICB2YXIgX3RhaWwgPSBudWxsO1xuICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFpbiBjb250ZW50LlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJvdztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXh0Um93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICByb3cuc2libGluZyA9IF90YWlsO1xuICAgICAgICAgICAgX3RhaWwgPSByb3c7XG4gICAgICAgICAgICByb3cgPSBuZXh0Um93O1xuICAgICAgICAgIH0gLy8gVE9ETzogSWYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgaXMgbnVsbCwgd2UgY2FuIGNvbnRpbnVlIG9uIHRoZSB0YWlsIGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIHRydWUsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgX3RhaWwsIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB0YWlsTW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICB7XG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBudWxsLCAvLyB0YWlsXG4gICAgICAgICAgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHVuZGVmaW5lZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHJldmVhbCBvcmRlciBpcyB0aGUgc2FtZSBhcyBub3QgaGF2aW5nXG4gICAgICAgICAgLy8gYSBib3VuZGFyeS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUG9ydGFscyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlIGRvbid0IGFwcGVuZCB0aGUgY2hpbGRyZW4gZHVyaW5nIG1vdW50XG4gICAgLy8gYnV0IGF0IGNvbW1pdC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gdHJhY2sgaW5zZXJ0aW9ucyB3aGljaCB0aGUgbm9ybWFsXG4gICAgLy8gZmxvdyBkb2Vzbid0IGRvIGR1cmluZyBtb3VudC4gVGhpcyBkb2Vzbid0IGhhcHBlbiBhdCB0aGUgcm9vdCBiZWNhdXNlXG4gICAgLy8gdGhlIHJvb3QgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgXCJjdXJyZW50XCIgd2l0aCBhIG51bGwgY2hpbGQuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgdW5pZnlpbmcgdGhpcyB3aXRoIGhvdyB0aGUgcm9vdCB3b3Jrcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBwcm92aWRlclR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyVHlwZS5fY29udGV4dDtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgbmV3VmFsdWUgPSBuZXdQcm9wcy52YWx1ZTtcblxuICB7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBuZXdQcm9wcykpIHtcbiAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIpIHtcbiAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgYHZhbHVlYCBwcm9wIGlzIHJlcXVpcmVkIGZvciB0aGUgYDxDb250ZXh0LlByb3ZpZGVyPmAuIERpZCB5b3UgbWlzc3BlbGwgaXQgb3IgZm9yZ2V0IHRvIHBhc3MgaXQ/Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3ZpZGVyUHJvcFR5cGVzID0gd29ya0luUHJvZ3Jlc3MudHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAocHJvdmlkZXJQcm9wVHlwZXMpIHtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3ZpZGVyUHJvcFR5cGVzLCBuZXdQcm9wcywgJ3Byb3AnLCAnQ29udGV4dC5Qcm92aWRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgbmV3VmFsdWUpO1xuXG4gIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBvbGRWYWx1ZSA9IG9sZFByb3BzLnZhbHVlO1xuXG4gICAgICBpZiAob2JqZWN0SXMob2xkVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICAvLyBObyBjaGFuZ2UuIEJhaWxvdXQgZWFybHkgaWYgY2hpbGRyZW4gYXJlIHRoZSBzYW1lLlxuICAgICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGNvbnRleHQgdmFsdWUgY2hhbmdlZC4gU2VhcmNoIGZvciBtYXRjaGluZyBjb25zdW1lcnMgYW5kIHNjaGVkdWxlXG4gICAgICAgIC8vIHRoZW0gdG8gdXBkYXRlLlxuICAgICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5ld0NoaWxkcmVuID0gbmV3UHJvcHMuY2hpbGRyZW47XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dENvbnN1bWVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGU7IC8vIFRoZSBsb2dpYyBiZWxvdyBmb3IgQ29udGV4dCBkaWZmZXJzIGRlcGVuZGluZyBvbiBQUk9EIG9yIERFViBtb2RlLiBJblxuICAvLyBERVYgbW9kZSwgd2UgY3JlYXRlIGEgc2VwYXJhdGUgb2JqZWN0IGZvciBDb250ZXh0LkNvbnN1bWVyIHRoYXQgYWN0c1xuICAvLyBsaWtlIGEgcHJveHkgdG8gQ29udGV4dC4gVGhpcyBwcm94eSBvYmplY3QgYWRkcyB1bm5lY2Vzc2FyeSBjb2RlIGluIFBST0RcbiAgLy8gc28gd2UgdXNlIHRoZSBvbGQgYmVoYXZpb3VyIChDb250ZXh0LkNvbnN1bWVyIHJlZmVyZW5jZXMgQ29udGV4dCkgdG9cbiAgLy8gcmVkdWNlIHNpemUgYW5kIG92ZXJoZWFkLiBUaGUgc2VwYXJhdGUgb2JqZWN0IHJlZmVyZW5jZXMgY29udGV4dCB2aWFcbiAgLy8gYSBwcm9wZXJ0eSBjYWxsZWQgXCJfY29udGV4dFwiLCB3aGljaCBhbHNvIGdpdmVzIHVzIHRoZSBhYmlsaXR5IHRvIGNoZWNrXG4gIC8vIGluIERFViBtb2RlIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIG9yIG5vdCBhbmQgd2FybiBpZiBpdCBkb2VzIG5vdC5cblxuICB7XG4gICAgaWYgKGNvbnRleHQuX2NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBtYXkgYmUgYmVjYXVzZSBpdCdzIGEgQ29udGV4dCAocmF0aGVyIHRoYW4gYSBDb25zdW1lcikuXG4gICAgICAvLyBPciBpdCBtYXkgYmUgYmVjYXVzZSBpdCdzIG9sZGVyIFJlYWN0IHdoZXJlIHRoZXkncmUgdGhlIHNhbWUgdGhpbmcuXG4gICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gd2FybiBpZiB3ZSdyZSBzdXJlIGl0J3MgYSBuZXcgUmVhY3QuXG4gICAgICBpZiAoY29udGV4dCAhPT0gY29udGV4dC5Db25zdW1lcikge1xuICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lcikge1xuICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0PiBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0Ll9jb250ZXh0O1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJlbmRlciA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0EgY29udGV4dCBjb25zdW1lciB3YXMgcmVuZGVyZWQgd2l0aCBtdWx0aXBsZSBjaGlsZHJlbiwgb3IgYSBjaGlsZCAnICsgXCJ0aGF0IGlzbid0IGEgZnVuY3Rpb24uIEEgY29udGV4dCBjb25zdW1lciBleHBlY3RzIGEgc2luZ2xlIGNoaWxkIFwiICsgJ3RoYXQgaXMgYSBmdW5jdGlvbi4gSWYgeW91IGRpZCBwYXNzIGEgZnVuY3Rpb24sIG1ha2Ugc3VyZSB0aGVyZSAnICsgJ2lzIG5vIHRyYWlsaW5nIG9yIGxlYWRpbmcgd2hpdGVzcGFjZSBhcm91bmQgaXQuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5ld1ZhbHVlID0gcmVhZENvbnRleHQoY29udGV4dCk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCkge1xuICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBBIGxhenkgY29tcG9uZW50IG9ubHkgbW91bnRzIGlmIGl0IHN1c3BlbmRlZCBpbnNpZGUgYSBub24tXG4gICAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlXG4gICAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIGFsdGVybmF0ZSBwb2ludGVycy5cbiAgICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIFJldXNlIHByZXZpb3VzIGRlcGVuZGVuY2llc1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB9XG5cbiAge1xuICAgIC8vIERvbid0IHVwZGF0ZSBcImJhc2VcIiByZW5kZXIgdGltZXMgZm9yIGJhaWxvdXRzLlxuICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKCk7XG4gIH1cblxuICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlIGNoaWxkcmVuIGhhdmUgYW55IHBlbmRpbmcgd29yay5cblxuICBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpKSB7XG4gICAgLy8gVGhlIGNoaWxkcmVuIGRvbid0IGhhdmUgYW55IHdvcmsgZWl0aGVyLiBXZSBjYW4gc2tpcCB0aGVtLlxuICAgIC8vIFRPRE86IE9uY2Ugd2UgYWRkIGJhY2sgcmVzdW1pbmcsIHdlIHNob3VsZCBjaGVjayBpZiB0aGUgY2hpbGRyZW4gYXJlXG4gICAgLy8gYSB3b3JrLWluLXByb2dyZXNzIHNldC4gSWYgc28sIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlaXIgZWZmZWN0cy5cbiAgICB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gVGhpcyBmaWJlciBkb2Vzbid0IGhhdmUgd29yaywgYnV0IGl0cyBzdWJ0cmVlIGRvZXMuIENsb25lIHRoZSBjaGlsZFxuICAvLyBmaWJlcnMgYW5kIGNvbnRpbnVlLlxuXG5cbiAgY2xvbmVDaGlsZEZpYmVycyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gcmVtb3VudEZpYmVyKGN1cnJlbnQsIG9sZFdvcmtJblByb2dyZXNzLCBuZXdXb3JrSW5Qcm9ncmVzcykge1xuICB7XG4gICAgdmFyIHJldHVybkZpYmVyID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gICAgaWYgKHJldHVybkZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc3dhcCB0aGUgcm9vdCBmaWJlci4nKTtcbiAgICB9IC8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgb2xkIGN1cnJlbnQuXG4gICAgLy8gSXQgd2lsbCBnZXQgZGVsZXRlZC5cblxuXG4gICAgY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgIG9sZFdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIENvbm5lY3QgdG8gdGhlIG5ldyB0cmVlLlxuXG4gICAgbmV3V29ya0luUHJvZ3Jlc3MuaW5kZXggPSBvbGRXb3JrSW5Qcm9ncmVzcy5pbmRleDtcbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5zaWJsaW5nID0gb2xkV29ya0luUHJvZ3Jlc3Muc2libGluZztcbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5yZXR1cm4gPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmVmID0gb2xkV29ya0luUHJvZ3Jlc3MucmVmOyAvLyBSZXBsYWNlIHRoZSBjaGlsZC9zaWJsaW5nIHBvaW50ZXJzIGFib3ZlIGl0LlxuXG4gICAgaWYgKG9sZFdvcmtJblByb2dyZXNzID09PSByZXR1cm5GaWJlci5jaGlsZCkge1xuICAgICAgcmV0dXJuRmliZXIuY2hpbGQgPSBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHByZXZTaWJsaW5nID0gcmV0dXJuRmliZXIuY2hpbGQ7XG5cbiAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHBhcmVudCB0byBoYXZlIGEgY2hpbGQuJyk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChwcmV2U2libGluZy5zaWJsaW5nICE9PSBvbGRXb3JrSW5Qcm9ncmVzcykge1xuICAgICAgICBwcmV2U2libGluZyA9IHByZXZTaWJsaW5nLnNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHByZXZTaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgdGhlIHByZXZpb3VzIHNpYmxpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJldlNpYmxpbmcuc2libGluZyA9IG5ld1dvcmtJblByb2dyZXNzO1xuICAgIH0gLy8gRGVsZXRlIHRoZSBvbGQgZmliZXIgYW5kIHBsYWNlIHRoZSBuZXcgb25lLlxuICAgIC8vIFNpbmNlIHRoZSBvbGQgZmliZXIgaXMgZGlzY29ubmVjdGVkLCB3ZSBoYXZlIHRvIHNjaGVkdWxlIGl0IG1hbnVhbGx5LlxuXG5cbiAgICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2N1cnJlbnRdO1xuICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY3VycmVudCk7XG4gICAgfVxuXG4gICAgbmV3V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50OyAvLyBSZXN0YXJ0IHdvcmsgZnJvbSB0aGUgbmV3IGZpYmVyLlxuXG4gICAgcmV0dXJuIG5ld1dvcmtJblByb2dyZXNzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIEJlZm9yZSBwZXJmb3JtaW5nIGFuIGVhcmx5IGJhaWxvdXQsIHdlIG11c3QgY2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmdcbiAgLy8gdXBkYXRlcyBvciBjb250ZXh0LlxuICB2YXIgdXBkYXRlTGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHVwZGF0ZUxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBObyBwZW5kaW5nIHVwZGF0ZSwgYnV0IGJlY2F1c2UgY29udGV4dCBpcyBwcm9wYWdhdGVkIGxhemlseSwgd2UgbmVlZFxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYXR0ZW1wdEVhcmx5QmFpbG91dElmTm9TY2hlZHVsZWRVcGRhdGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZmliZXIgZG9lcyBub3QgaGF2ZSBhbnkgcGVuZGluZyB3b3JrLiBCYWlsb3V0IHdpdGhvdXQgZW50ZXJpbmdcbiAgLy8gdGhlIGJlZ2luIHBoYXNlLiBUaGVyZSdzIHN0aWxsIHNvbWUgYm9va2tlZXBpbmcgd2UgdGhhdCBuZWVkcyB0byBiZSBkb25lXG4gIC8vIGluIHRoaXMgb3B0aW1pemVkIHBhdGgsIG1vc3RseSBwdXNoaW5nIHN0dWZmIG9udG8gdGhlIHN0YWNrLlxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAge1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnZhbHVlO1xuICAgICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICAgIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgbmV3VmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICB7XG4gICAgICAgIC8vIFByb2ZpbGVyIHNob3VsZCBvbmx5IGNhbGwgb25SZW5kZXIgd2hlbiBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzIGFjdHVhbGx5IHJlbmRlcmVkLlxuICAgICAgICB2YXIgaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG5cbiAgICAgICAgaWYgKGhhc0NoaWxkV29yaykge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBSZXNldCBlZmZlY3QgZHVyYXRpb25zIGZvciB0aGUgbmV4dCBldmVudHVhbCBlZmZlY3QgcGhhc2UuXG4gICAgICAgICAgLy8gVGhlc2UgYXJlIHJlc2V0IGR1cmluZyByZW5kZXIgdG8gYWxsb3cgdGhlIERldlRvb2xzIGNvbW1pdCBob29rIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSxcbiAgICAgICAgICB2YXIgc3RhdGVOb2RlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChzdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTsgLy8gV2Uga25vdyB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgc3VzcGVuZCBhZ2FpbiBiZWNhdXNlIGlmIGl0IGhhc1xuICAgICAgICAgICAgLy8gYmVlbiB1bnN1c3BlbmRlZCBpdCBoYXMgY29tbWl0dGVkIGFzIGEgcmVzb2x2ZWQgU3VzcGVuc2UgY29tcG9uZW50LlxuICAgICAgICAgICAgLy8gSWYgaXQgbmVlZHMgdG8gYmUgcmV0cmllZCwgaXQgc2hvdWxkIGhhdmUgd29yayBzY2hlZHVsZWQgb24gaXQuXG5cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7IC8vIFdlIHNob3VsZCBuZXZlciByZW5kZXIgdGhlIGNoaWxkcmVuIG9mIGEgZGVoeWRyYXRlZCBib3VuZGFyeSB1bnRpbCB3ZVxuICAgICAgICAgICAgLy8gdXBncmFkZSBpdC4gV2UgcmV0dXJuIG51bGwgaW5zdGVhZCBvZiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrLlxuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9IC8vIElmIHRoaXMgYm91bmRhcnkgaXMgY3VycmVudGx5IHRpbWVkIG91dCwgd2UgbmVlZCB0byBkZWNpZGVcbiAgICAgICAgICAvLyB3aGV0aGVyIHRvIHJldHJ5IHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBvciB0byBza2lwIG92ZXIgaXQgYW5kXG4gICAgICAgICAgLy8gZ28gc3RyYWlnaHQgdG8gdGhlIGZhbGxiYWNrLiBDaGVjayB0aGUgcHJpb3JpdHkgb2YgdGhlIHByaW1hcnlcbiAgICAgICAgICAvLyBjaGlsZCBmcmFnbWVudC5cblxuXG4gICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgdmFyIHByaW1hcnlDaGlsZExhbmVzID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcztcblxuICAgICAgICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBwcmltYXJ5Q2hpbGRMYW5lcykpIHtcbiAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBVc2UgdGhlIG5vcm1hbCBwYXRoXG4gICAgICAgICAgICAvLyB0byBhdHRlbXB0IHRvIHJlbmRlciB0aGUgcHJpbWFyeSBjaGlsZHJlbiBhZ2Fpbi5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCBkb2VzIG5vdCBoYXZlIHBlbmRpbmcgd29yayBtYXJrZWRcbiAgICAgICAgICAgIC8vIG9uIGl0XG4gICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTsgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gZG8gbm90IGhhdmUgcGVuZGluZyB3b3JrIHdpdGggc3VmZmljaWVudFxuICAgICAgICAgICAgLy8gcHJpb3JpdHkuIEJhaWxvdXQuXG5cbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBmYWxsYmFjayBjaGlsZHJlbiBoYXZlIHBlbmRpbmcgd29yay4gU2tpcCBvdmVyIHRoZVxuICAgICAgICAgICAgICAvLyBwcmltYXJ5IGNoaWxkcmVuIGFuZCB3b3JrIG9uIHRoZSBmYWxsYmFjay5cbiAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBjYW4gcmV0dXJuIGBudWxsYCBoZXJlIGJlY2F1c2Ugd2UgYWxyZWFkeSBjaGVja2VkXG4gICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlcmUgd2VyZSBuZXN0ZWQgY29udGV4dCBjb25zdW1lcnMsIHZpYSB0aGUgY2FsbCB0b1xuICAgICAgICAgICAgICAvLyBgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29ya2AgYWJvdmUuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBkaWRTdXNwZW5kQmVmb3JlID0gKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgICAgICB2YXIgX2hhc0NoaWxkV29yayA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpO1xuXG4gICAgICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICAgIC8vIElmIHNvbWV0aGluZyB3YXMgaW4gZmFsbGJhY2sgc3RhdGUgbGFzdCB0aW1lLCBhbmQgd2UgaGF2ZSBhbGwgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGNoaWxkcmVuIHRoZW4gd2UncmUgc3RpbGwgaW4gcHJvZ3Jlc3NpdmUgbG9hZGluZyBzdGF0ZS5cbiAgICAgICAgICAgIC8vIFNvbWV0aGluZyBtaWdodCBnZXQgdW5ibG9ja2VkIGJ5IHN0YXRlIHVwZGF0ZXMgb3IgcmV0cmllcyBpbiB0aGVcbiAgICAgICAgICAgIC8vIHRyZWUgd2hpY2ggd2lsbCBhZmZlY3QgdGhlIHRhaWwuIFNvIHdlIG5lZWQgdG8gdXNlIHRoZSBub3JtYWxcbiAgICAgICAgICAgIC8vIHBhdGggdG8gY29tcHV0ZSB0aGUgY29ycmVjdCB0YWlsLlxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH0gLy8gSWYgbm9uZSBvZiB0aGUgY2hpbGRyZW4gaGFkIGFueSB3b3JrLCB0aGF0IG1lYW5zIHRoYXQgbm9uZSBvZlxuICAgICAgICAgIC8vIHRoZW0gZ290IHJldHJpZWQgc28gdGhleSdsbCBzdGlsbCBiZSBibG9ja2VkIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuXG5cblxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQgYmVmb3JlIGFuZCB3ZSdyZSByZW5kZXJpbmcgdGhlIHNhbWUgY2hpbGRyZW4sXG4gICAgICAgIC8vIHRoZW4gdGhlIHRhaWwgZG9lc24ndCBtYXR0ZXIuIEFueXRoaW5nIG5ldyB0aGF0IHN1c3BlbmRzIHdpbGwgd29ya1xuICAgICAgICAvLyBpbiB0aGUgXCJ0b2dldGhlclwiIG1vZGUsIHNvIHdlIGNhbiBjb250aW51ZSBmcm9tIHRoZSBzdGF0ZSB3ZSBoYWQuXG5cblxuICAgICAgICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRvIHRoZSBcInRvZ2V0aGVyXCIgbW9kZSBpbiBjYXNlIHdlJ3ZlIHN0YXJ0ZWQgYSBkaWZmZXJlbnRcbiAgICAgICAgICAvLyB1cGRhdGUgaW4gdGhlIHBhc3QgYnV0IGRpZG4ndCBjb21wbGV0ZSBpdC5cbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBudWxsO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBudWxsO1xuICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3RFZmZlY3QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KTtcblxuICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAvLyB0aGVtIGdvdCByZXRyaWVkIHNvIHRoZXknbGwgc3RpbGwgYmUgYmxvY2tlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiB0aGUgdHJlZSBzdGlsbCBuZWVkcyB0byBiZSBkZWZlcnJlZC4gVGhpcyBpc1xuICAgICAgICAvLyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBsb2dpYyB1c2VkIGluIHRoZSBub3JtYWwgdXBkYXRlIHBhdGgsXG4gICAgICAgIC8vIHNvIHdlJ2xsIGp1c3QgZW50ZXIgdGhhdC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB3ZSdsbCBiYWlsIG91dFxuICAgICAgICAvLyBhdCB0aGUgbmV4dCBsZXZlbCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBiZWNhdXNlIHRoZSBjaGlsZCBwcm9wc1xuICAgICAgICAvLyBoYXZlIG5vdCBjaGFuZ2VkLiBXaGljaCBpcyBmaW5lLlxuICAgICAgICAvLyBUT0RPOiBQcm9iYWJseSBzaG91bGQgcmVmYWN0b3IgYGJlZ2luV29ya2AgdG8gc3BsaXQgdGhlIGJhaWxvdXRcbiAgICAgICAgLy8gcGF0aCBmcm9tIHRoZSBub3JtYWwgcGF0aC4gSSdtIHRlbXB0ZWQgdG8gZG8gYSBsYWJlbGVkIGJyZWFrIGhlcmVcbiAgICAgICAgLy8gYnV0IEkgd29uJ3QgOilcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzO1xuICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBiZWdpbldvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ICYmIGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgd2lsbCByZXN0YXJ0IHRoZSBiZWdpbiBwaGFzZSB3aXRoIGEgbmV3IGZpYmVyLlxuICAgICAgcmV0dXJuIHJlbW91bnRGaWJlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHdvcmtJblByb2dyZXNzLmtleSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciB8fCBudWxsLCB3b3JrSW5Qcm9ncmVzcy5tb2RlLCB3b3JrSW5Qcm9ncmVzcy5sYW5lcykpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgaGFzQ29udGV4dENoYW5nZWQoKSB8fCAoIC8vIEZvcmNlIGEgcmUtcmVuZGVyIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VkIGR1ZSB0byBob3QgcmVsb2FkOlxuICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSBjdXJyZW50LnR5cGUgKSkge1xuICAgICAgLy8gSWYgcHJvcHMgb3IgY29udGV4dCBjaGFuZ2VkLCBtYXJrIHRoZSBmaWJlciBhcyBoYXZpbmcgcGVyZm9ybWVkIHdvcmsuXG4gICAgICAvLyBUaGlzIG1heSBiZSB1bnNldCBpZiB0aGUgcHJvcHMgYXJlIGRldGVybWluZWQgdG8gYmUgZXF1YWwgbGF0ZXIgKG1lbW8pLlxuICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5laXRoZXIgcHJvcHMgbm9yIGxlZ2FjeSBjb250ZXh0IGNoYW5nZXMuIENoZWNrIGlmIHRoZXJlJ3MgYSBwZW5kaW5nXG4gICAgICAvLyB1cGRhdGUgb3IgY29udGV4dCBjaGFuZ2UuXG4gICAgICB2YXIgaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ID0gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBpZiAoIWhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCAmJiAvLyBJZiB0aGlzIGlzIHRoZSBzZWNvbmQgcGFzcyBvZiBhbiBlcnJvciBvciBzdXNwZW5zZSBib3VuZGFyeSwgdGhlcmVcbiAgICAgIC8vIG1heSBub3QgYmUgd29yayBzY2hlZHVsZWQgb24gYGN1cnJlbnRgLCBzbyB3ZSBjaGVjayBmb3IgdGhpcyBmbGFnLlxuICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gTm8gcGVuZGluZyB1cGRhdGVzIG9yIGNvbnRleHQuIEJhaWwgb3V0IG5vdy5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gYXR0ZW1wdEVhcmx5QmFpbG91dElmTm9TY2hlZHVsZWRVcGRhdGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIG9uIHRoaXMgZmliZXIsIGJ1dCB0aGVyZSBhcmUgbm8gbmV3IHByb3BzXG4gICAgICAgIC8vIG5vciBsZWdhY3kgY29udGV4dC4gU2V0IHRoaXMgdG8gZmFsc2UuIElmIGFuIHVwZGF0ZSBxdWV1ZSBvciBjb250ZXh0XG4gICAgICAgIC8vIGNvbnN1bWVyIHByb2R1Y2VzIGEgY2hhbmdlZCB2YWx1ZSwgaXQgd2lsbCBzZXQgdGhpcyB0byB0cnVlLiBPdGhlcndpc2UsXG4gICAgICAgIC8vIHRoZSBjb21wb25lbnQgd2lsbCBhc3N1bWUgdGhlIGNoaWxkcmVuIGhhdmUgbm90IGNoYW5nZWQgYW5kIGJhaWwgb3V0LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGlzRm9ya2VkQ2hpbGQod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGNoaWxkIGJlbG9uZ3MgdG8gYSBsaXN0IG9mIG11bGlwbGUgY2hpbGRyZW4gaW5cbiAgICAgIC8vIGl0cyBwYXJlbnQuXG4gICAgICAvL1xuICAgICAgLy8gSW4gYSB0cnVlIG11bHRpLXRocmVhZGVkIGltcGxlbWVudGF0aW9uLCB3ZSB3b3VsZCByZW5kZXIgY2hpbGRyZW4gb25cbiAgICAgIC8vIHBhcmFsbGVsIHRocmVhZHMuIFRoaXMgd291bGQgcmVwcmVzZW50IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgcmVuZGVyXG4gICAgICAvLyB0aHJlYWQgZm9yIHRoaXMgc3VidHJlZS5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBvbmx5IHVzZSB0aGlzIGZvciBpZCBnZW5lcmF0aW9uIGR1cmluZyBoeWRyYXRpb24sIHdoaWNoIGlzIHdoeSB0aGVcbiAgICAgIC8vIGxvZ2ljIGlzIGxvY2F0ZWQgaW4gdGhpcyBzcGVjaWFsIGJyYW5jaC5cbiAgICAgIHZhciBzbG90SW5kZXggPSB3b3JrSW5Qcm9ncmVzcy5pbmRleDtcbiAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gZ2V0Rm9ya3NBdExldmVsKCk7XG4gICAgICBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCBudW1iZXJPZkZvcmtzLCBzbG90SW5kZXgpO1xuICAgIH1cbiAgfSAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjbGVhciBwZW5kaW5nIHVwZGF0ZSBwcmlvcml0eS5cbiAgLy8gVE9ETzogVGhpcyBhc3N1bWVzIHRoYXQgd2UncmUgYWJvdXQgdG8gZXZhbHVhdGUgdGhlIGNvbXBvbmVudCBhbmQgcHJvY2Vzc1xuICAvLyB0aGUgdXBkYXRlIHF1ZXVlLiBIb3dldmVyLCB0aGVyZSdzIGFuIGV4Y2VwdGlvbjogU2ltcGxlTWVtb0NvbXBvbmVudFxuICAvLyBzb21ldGltZXMgYmFpbHMgb3V0IGxhdGVyIGluIHRoZSBiZWdpbiBwaGFzZS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB3ZSBzaG91bGRcbiAgLy8gbW92ZSB0aGlzIGFzc2lnbm1lbnQgb3V0IG9mIHRoZSBjb21tb24gcGF0aCBhbmQgaW50byBlYWNoIGJyYW5jaC5cblxuXG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lcztcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIG1vdW50SW5kZXRlcm1pbmF0ZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgZWxlbWVudFR5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTtcbiAgICAgICAgcmV0dXJuIG1vdW50TGF6eUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZWxlbWVudFR5cGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBDb21wb25lbnQgPyB1bnJlc29sdmVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgdW5yZXNvbHZlZFByb3BzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQgPyBfdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50LCBfdW5yZXNvbHZlZFByb3BzKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9Db21wb25lbnQsIF9yZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RSb290KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0VGV4dChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICByZXR1cm4gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gdHlwZSA/IF91bnJlc29sdmVkUHJvcHMyIDogcmVzb2x2ZURlZmF1bHRQcm9wcyh0eXBlLCBfdW5yZXNvbHZlZFByb3BzMik7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZvcndhcmRSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIF9yZXNvbHZlZFByb3BzMiwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBNb2RlOlxuICAgICAgcmV0dXJuIHVwZGF0ZU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICByZXR1cm4gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dENvbnN1bWVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfdHlwZTIgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIFJlc29sdmUgb3V0ZXIgcHJvcHMgZmlyc3QsIHRoZW4gcmVzb2x2ZSBpbm5lciBwcm9wcy5cblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIsIF91bnJlc29sdmVkUHJvcHMzKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBfdHlwZTIucHJvcFR5cGVzO1xuXG4gICAgICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIF9yZXNvbHZlZFByb3BzMywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoX3R5cGUyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIudHlwZSwgX3Jlc29sdmVkUHJvcHMzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF90eXBlMiwgX3Jlc29sdmVkUHJvcHMzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudDIgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczQgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50MiA/IF91bnJlc29sdmVkUHJvcHM0IDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50MiwgX3VucmVzb2x2ZWRQcm9wczQpO1xuXG4gICAgICAgIHJldHVybiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudDIsIF9yZXNvbHZlZFByb3BzNCwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFwiICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBUYWcgdGhlIGZpYmVyIHdpdGggYW4gdXBkYXRlIGVmZmVjdC4gVGhpcyB0dXJucyBhIFBsYWNlbWVudCBpbnRvXG4gIC8vIGEgUGxhY2VtZW50QW5kVXBkYXRlLlxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcykge1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWY7XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZlN0YXRpYztcbiAgfVxufVxuXG52YXIgYXBwZW5kQWxsQ2hpbGRyZW47XG52YXIgdXBkYXRlSG9zdENvbnRhaW5lcjtcbnZhciB1cGRhdGVIb3N0Q29tcG9uZW50JDE7XG52YXIgdXBkYXRlSG9zdFRleHQkMTtcblxue1xuICAvLyBNdXRhdGlvbiBtb2RlXG4gIGFwcGVuZEFsbENoaWxkcmVuID0gZnVuY3Rpb24gKHBhcmVudCwgd29ya0luUHJvZ3Jlc3MsIG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSwgaXNIaWRkZW4pIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBjcmVhdGVkIGJ1dCB3ZSBuZWVkIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnQsIG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfTtcblxuICB1cGRhdGVIb3N0Q29udGFpbmVyID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7Ly8gTm9vcFxuICB9O1xuXG4gIHVwZGF0ZUhvc3RDb21wb25lbnQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gYWx0ZXJuYXRlLCB0aGF0IG1lYW5zIHRoaXMgaXMgYW4gdXBkYXRlIGFuZCB3ZSBuZWVkIHRvXG4gICAgLy8gc2NoZWR1bGUgYSBzaWRlLWVmZmVjdCB0byBkbyB0aGUgdXBkYXRlcy5cbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG5cbiAgICBpZiAob2xkUHJvcHMgPT09IG5ld1Byb3BzKSB7XG4gICAgICAvLyBJbiBtdXRhdGlvbiBtb2RlLCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIGEgYmFpbG91dCBiZWNhdXNlXG4gICAgICAvLyB3ZSB3b24ndCB0b3VjaCB0aGlzIG5vZGUgZXZlbiBpZiBjaGlsZHJlbiBjaGFuZ2VkLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSWYgd2UgZ2V0IHVwZGF0ZWQgYmVjYXVzZSBvbmUgb2Ygb3VyIGNoaWxkcmVuIHVwZGF0ZWQsIHdlIGRvbid0XG4gICAgLy8gaGF2ZSBuZXdQcm9wcyBzbyB3ZSdsbCBoYXZlIHRvIHJldXNlIHRoZW0uXG4gICAgLy8gVE9ETzogU3BsaXQgdGhlIHVwZGF0ZSBBUEkgYXMgc2VwYXJhdGUgZm9yIHRoZSBwcm9wcyB2cy4gY2hpbGRyZW4uXG4gICAgLy8gRXZlbiBiZXR0ZXIgd291bGQgYmUgaWYgY2hpbGRyZW4gd2VyZW4ndCBzcGVjaWFsIGNhc2VkIGF0IGFsbCB0aG8uXG5cblxuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICB2YXIgY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTsgLy8gVE9ETzogRXhwZXJpZW5jaW5nIGFuIGVycm9yIHdoZXJlIG9sZFByb3BzIGlzIG51bGwuIFN1Z2dlc3RzIGEgaG9zdFxuICAgIC8vIGNvbXBvbmVudCBpcyBoaXR0aW5nIHRoZSByZXN1bWUgcGF0aC4gRmlndXJlIG91dCB3aHkuIFBvc3NpYmx5XG4gICAgLy8gcmVsYXRlZCB0byBgaGlkZGVuYC5cblxuICAgIHZhciB1cGRhdGVQYXlsb2FkID0gcHJlcGFyZVVwZGF0ZShpbnN0YW5jZSwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCk7IC8vIFRPRE86IFR5cGUgdGhpcyBzcGVjaWZpYyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50LlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkOyAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmVcbiAgICAvLyBpcyBhIG5ldyByZWYgd2UgbWFyayB0aGlzIGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGlzIGRvbmUgaW4gY29tbWl0V29yay5cblxuICAgIGlmICh1cGRhdGVQYXlsb2FkKSB7XG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdFRleHQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgIC8vIElmIHRoZSB0ZXh0IGRpZmZlcnMsIG1hcmsgaXQgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaW4gZG9uZSBpbiBjb21taXRXb3JrLlxuICAgIGlmIChvbGRUZXh0ICE9PSBuZXdUZXh0KSB7XG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrKSB7XG4gIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgLy8gSWYgd2UncmUgaHlkcmF0aW5nLCB3ZSBzaG91bGQgY29uc3VtZSBhcyBtYW55IGl0ZW1zIGFzIHdlIGNhblxuICAgIC8vIHNvIHdlIGRvbid0IGxlYXZlIGFueSBiZWhpbmQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3dpdGNoIChyZW5kZXJTdGF0ZS50YWlsTW9kZSkge1xuICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgdGFpbE5vZGUgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICB2YXIgbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAodGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAodGFpbE5vZGUuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsYXN0VGFpbE5vZGUgPSB0YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YWlsTm9kZSA9IHRhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAobGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZXRhY2ggdGhlIGluc2VydGlvbiBhZnRlciB0aGUgbGFzdCBub2RlIHRoYXQgd2FzIGFscmVhZHlcbiAgICAgICAgICAvLyBpbnNlcnRlZC5cbiAgICAgICAgICBsYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgJ2NvbGxhcHNlZCc6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgX3RhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIF9sYXN0VGFpbE5vZGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChfdGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoX3RhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX2xhc3RUYWlsTm9kZSA9IF90YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGFpbE5vZGUgPSBfdGFpbE5vZGUuc2libGluZztcbiAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIHNpbXBseSBnb2luZyB0byBkZWxldGUgYWxsIGluc2VydGlvbnMgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxhc3QgcmVuZGVyZWQgaXRlbS5cblxuXG4gICAgICAgIGlmIChfbGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICBpZiAoIWhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjayAmJiByZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBXZSBzdXNwZW5kZWQgZHVyaW5nIHRoZSBoZWFkLiBXZSB3YW50IHRvIHNob3cgYXQgbGVhc3Qgb25lXG4gICAgICAgICAgICAvLyByb3cgYXQgdGhlIHRhaWwuIFNvIHdlJ2xsIGtlZXAgb24gYW5kIGN1dCBvZmYgdGhlIHJlc3QuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgX2xhc3RUYWlsTm9kZS5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1YmJsZVByb3BlcnRpZXMoY29tcGxldGVkV29yaykge1xuICB2YXIgZGlkQmFpbG91dCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlICE9PSBudWxsICYmIGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlLmNoaWxkID09PSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciBzdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuXG4gIGlmICghZGlkQmFpbG91dCkge1xuICAgIC8vIEJ1YmJsZSB1cCB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lLlxuICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgICAgLy8gcHJvZmlsZXIgZHVyYXRpb25zLlxuICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoY2hpbGQubGFuZXMsIGNoaWxkLmNoaWxkTGFuZXMpKTtcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLmZsYWdzOyAvLyBXaGVuIGEgZmliZXIgaXMgY2xvbmVkLCBpdHMgYWN0dWFsRHVyYXRpb24gaXMgcmVzZXQgdG8gMC4gVGhpcyB2YWx1ZSB3aWxsXG4gICAgICAgIC8vIG9ubHkgYmUgdXBkYXRlZCBpZiB3b3JrIGlzIGRvbmUgb24gdGhlIGZpYmVyIChpLmUuIGl0IGRvZXNuJ3QgYmFpbG91dCkuXG4gICAgICAgIC8vIFdoZW4gd29yayBpcyBkb25lLCBpdCBzaG91bGQgYnViYmxlIHRvIHRoZSBwYXJlbnQncyBhY3R1YWxEdXJhdGlvbi4gSWZcbiAgICAgICAgLy8gdGhlIGZpYmVyIGhhcyBub3QgYmVlbiBjbG9uZWQgdGhvdWdoLCAobWVhbmluZyBubyB3b3JrIHdhcyBkb25lKSwgdGhlblxuICAgICAgICAvLyB0aGlzIHZhbHVlIHdpbGwgcmVmbGVjdCB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgd29ya2luZyBvbiBhIHByZXZpb3VzXG4gICAgICAgIC8vIHJlbmRlci4gSW4gdGhhdCBjYXNlIGl0IHNob3VsZCBub3QgYnViYmxlLiBXZSBkZXRlcm1pbmUgd2hldGhlciBpdCB3YXNcbiAgICAgICAgLy8gY2xvbmVkIGJ5IGNvbXBhcmluZyB0aGUgY2hpbGQgcG9pbnRlci5cblxuICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdHJlZUJhc2VEdXJhdGlvbiArPSBjaGlsZC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IHRyZWVCYXNlRHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkLmxhbmVzLCBfY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5mbGFnczsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZVxuICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGhcbiAgICAgICAgLy8gdGhlIHJlbmRlciBwaGFzZS4gV2lsbCBhZGRyZXNzIGR1cmluZyByZWZhY3RvciB0byBhbHRlcm5hdGUgbW9kZWwuXG5cbiAgICAgICAgX2NoaWxkLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgfSBlbHNlIHtcbiAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXRcbiAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICAgIHZhciBfdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHZhciBfY2hpbGQyID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZDIgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQyLmxhbmVzLCBfY2hpbGQyLmNoaWxkTGFuZXMpKTsgLy8gXCJTdGF0aWNcIiBmbGFncyBzaGFyZSB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpYmVyL2hvb2sgdGhleSBiZWxvbmcgdG8sXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyXG4gICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGlnbm9yZSB0aGVtLlxuXG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLmZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgX3RyZWVCYXNlRHVyYXRpb24gKz0gX2NoaWxkMi50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBfY2hpbGQyID0gX2NoaWxkMi5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSBfdHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jaGlsZDMgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkMyAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZDMubGFuZXMsIF9jaGlsZDMuY2hpbGRMYW5lcykpOyAvLyBcIlN0YXRpY1wiIGZsYWdzIHNoYXJlIHRoZSBsaWZldGltZSBvZiB0aGUgZmliZXIvaG9vayB0aGV5IGJlbG9uZyB0byxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGJ1YmJsZSB0aG9zZSB1cCBldmVuIGR1cmluZyBhIGJhaWxvdXQuIEFsbCB0aGUgb3RoZXJcbiAgICAgICAgLy8gZmxhZ3MgaGF2ZSBhIGxpZmV0aW1lIG9ubHkgb2YgYSBzaW5nbGUgcmVuZGVyICsgY29tbWl0LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaWdub3JlIHRoZW0uXG5cbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuZmxhZ3MgJiBTdGF0aWNNYXNrOyAvLyBVcGRhdGUgdGhlIHJldHVybiBwb2ludGVyIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuIFRoaXMgaXMgYSBjb2RlXG4gICAgICAgIC8vIHNtZWxsIGJlY2F1c2UgaXQgYXNzdW1lcyB0aGUgY29tbWl0IHBoYXNlIGlzIG5ldmVyIGNvbmN1cnJlbnQgd2l0aFxuICAgICAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLiBXaWxsIGFkZHJlc3MgZHVyaW5nIHJlZmFjdG9yIHRvIGFsdGVybmF0ZSBtb2RlbC5cblxuICAgICAgICBfY2hpbGQzLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZDMgPSBfY2hpbGQzLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3MgfD0gc3VidHJlZUZsYWdzO1xuICB9XG5cbiAgY29tcGxldGVkV29yay5jaGlsZExhbmVzID0gbmV3Q2hpbGRMYW5lcztcbiAgcmV0dXJuIGRpZEJhaWxvdXQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlRGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRTdGF0ZSkge1xuICBpZiAoaGFzVW5oeWRyYXRlZFRhaWxOb2RlcygpICYmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUgJiYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKHdvcmtJblByb2dyZXNzKTtcbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXIgfCBJbmNvbXBsZXRlIHwgU2hvdWxkQ2FwdHVyZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCAmJiBuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgIC8vIFdlIG1pZ2h0IGJlIGluc2lkZSBhIGh5ZHJhdGlvbiBzdGF0ZSB0aGUgZmlyc3QgdGltZSB3ZSdyZSBwaWNraW5nIHVwIHRoaXNcbiAgICAvLyBTdXNwZW5zZSBib3VuZGFyeSwgYW5kIGFsc28gYWZ0ZXIgd2UndmUgcmVlbnRlcmVkIGl0IGZvciBmdXJ0aGVyIGh5ZHJhdGlvbi5cbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgaWYgKCF3YXNIeWRyYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQgd2FzIGNvbXBsZXRlZCB3aXRob3V0IGEgaHlkcmF0ZWQgbm9kZS4gJyArICdUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICB2YXIgaXNUaW1lZE91dFN1c3BlbnNlID0gbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKGlzVGltZWRPdXRTdXNwZW5zZSkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBtaWdodCBoYXZlIHJlZW50ZXJlZCB0aGlzIGJvdW5kYXJ5IHRvIGh5ZHJhdGUgaXQuIElmIHNvLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBoeWRyYXRpb25cbiAgICAgIC8vIHN0YXRlIHNpbmNlIHdlJ3JlIG5vdyBleGl0aW5nIG91dCBvZiBpdC4gcG9wSHlkcmF0aW9uU3RhdGUgZG9lc24ndCBkbyB0aGF0IGZvciB1cy5cbiAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcblxuICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgYm91bmRhcnkgZGlkIG5vdCBzdXNwZW5kIHNvIGl0J3Mgbm93IGh5ZHJhdGVkIGFuZCB1bnN1c3BlbmRlZC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBtYXJrIHRoaXMgYm91bmRhcnlcbiAgICAgIC8vIGFzIGhhdmluZyBoeWRyYXRlZCBzbyBldmVudHMga25vdyB0aGF0IHRoZXkncmUgZnJlZSB0byBiZSBpbnZva2VkLlxuICAgICAgLy8gSXQncyBhbHNvIGEgc2lnbmFsIHRvIHJlcGxheSBldmVudHMgYW5kIHRoZSBzdXNwZW5zZSBjYWxsYmFjay5cbiAgICAgIC8vIElmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggcmV0cnkgbGlzdGVuZXJzLlxuICAgICAgLy8gU28gd2UgbWlnaHQgYXMgd2VsbCBhbHdheXMgbWFyayB0aGlzLlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgdmFyIF9pc1RpbWVkT3V0U3VzcGVuc2UgPSBuZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoX2lzVGltZWRPdXRTdXNwZW5zZSkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChfcHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBfcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoaXMgdHJlZS4gSWYgdGhpcyB3YXMgYSBmb3JjZWQgY2xpZW50IHJlbmRlcixcbiAgICAvLyB0aGVyZSBtYXkgaGF2ZSBiZWVuIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uXG4gICAgLy8gYXR0ZW1wdC4gSWYgc28sIGFkZCB0aGVtIHRvIGEgcXVldWUgc28gd2UgY2FuIGxvZyB0aGVtIGluIHRoZVxuICAgIC8vIGNvbW1pdCBwaGFzZS5cbiAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpOyAvLyBGYWxsIHRocm91Z2ggdG8gbm9ybWFsIFN1c3BlbnNlIHBhdGhcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cblxuICBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIEZyYWdtZW50OlxuICAgIGNhc2UgTW9kZTpcbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZpYmVyUm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuXG4gICAgICAgIGlmIChmaWJlclJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBmaWJlclJvb3QuY29udGV4dCA9IGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dDtcbiAgICAgICAgICBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5jaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCBwb3Agc28gdGhhdCB3ZSBjYW4gZGVsZXRlIGFueSByZW1haW5pbmcgY2hpbGRyZW5cbiAgICAgICAgICAvLyB0aGF0IHdlcmVuJ3QgaHlkcmF0ZWQuXG4gICAgICAgICAgdmFyIHdhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKHdhc0h5ZHJhdGVkKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgdGhlbiB3ZSdsbCBuZWVkIHRvIHNjaGVkdWxlIGFuIHVwZGF0ZSBmb3JcbiAgICAgICAgICAgIC8vIHRoZSBjb21taXQgc2lkZS1lZmZlY3RzIG9uIHRoZSByb290LlxuICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKCAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2xpZW50IHJvb3RcbiAgICAgICAgICAgICAgIXByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQgfHwgLy8gQ2hlY2sgaWYgd2UgcmV2ZXJ0ZWQgdG8gY2xpZW50IHJlbmRlcmluZyAoZS5nLiBkdWUgdG8gYW4gZXJyb3IpXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBjbGVhciB0aGlzIGNvbnRhaW5lciBhdCB0aGUgc3RhcnQgb2YgdGhlXG4gICAgICAgICAgICAgICAgLy8gbmV4dCBjb21taXQuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBSZWFjdCByZW5kZXJpbmcgaW50byBhXG4gICAgICAgICAgICAgICAgLy8gY29udGFpbmVyIHdpdGggcHJldmlvdXMgY2hpbGRyZW4uIEl0J3MgYWxzbyBzYWZlIHRvIGRvIGZvclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgdG9vLCBiZWNhdXNlIGN1cnJlbnQuY2hpbGQgd291bGQgb25seSBiZSBudWxsIGlmIHRoZVxuICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHJlbmRlciB3YXMgbnVsbCAoc28gdGhlIGNvbnRhaW5lciB3b3VsZCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgLy8gYmUgZW1wdHkpLlxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90OyAvLyBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLCB0aGVyZSBtYXkgaGF2ZSBiZWVuXG4gICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmFibGUgZXJyb3JzIGR1cmluZyBmaXJzdCBoeWRyYXRpb24gYXR0ZW1wdC4gSWYgc28sIGFkZFxuICAgICAgICAgICAgICAgIC8vIHRoZW0gdG8gYSBxdWV1ZSBzbyB3ZSBjYW4gbG9nIHRoZW0gaW4gdGhlIGNvbW1pdCBwaGFzZS5cblxuICAgICAgICAgICAgICAgIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhvc3RDb21wb25lbnQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudC5yZWYgIT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFuZXdQcm9wcykge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cblxuXG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpOyAvLyBUT0RPOiBNb3ZlIGNyZWF0ZUluc3RhbmNlIHRvIGJlZ2luV29yayBhbmQga2VlcCBpdCBvbiBhIGNvbnRleHRcbiAgICAgICAgICAvLyBcInN0YWNrXCIgYXMgdGhlIHBhcmVudC4gVGhlbiBhcHBlbmQgY2hpbGRyZW4gYXMgd2UgZ28gaW4gYmVnaW5Xb3JrXG4gICAgICAgICAgLy8gb3IgY29tcGxldGVXb3JrIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIHdhbnQgdG8gYWRkIHRoZW0gdG9wLT5kb3duIG9yXG4gICAgICAgICAgLy8gYm90dG9tLT51cC4gVG9wLT5kb3duIGlzIGZhc3RlciBpbiBJRTExLlxuXG4gICAgICAgICAgdmFyIF93YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBhbmQgY3JlYXRlSW5zdGFuY2Ugc3RlcCBpbnRvIHRoZSBiZWdpblBoYXNlXG4gICAgICAgICAgICAvLyB0byBjb25zb2xpZGF0ZS5cbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgY2hhbmdlcyB0byB0aGUgaHlkcmF0ZWQgbm9kZSBuZWVkIHRvIGJlIGFwcGxpZWQgYXQgdGhlXG4gICAgICAgICAgICAgIC8vIGNvbW1pdC1waGFzZSB3ZSBtYXJrIHRoaXMgYXMgc3VjaC5cbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgYXBwZW5kQWxsQ2hpbGRyZW4oaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gaW5zdGFuY2U7IC8vIENlcnRhaW4gcmVuZGVyZXJzIHJlcXVpcmUgY29tbWl0LXRpbWUgZWZmZWN0cyBmb3IgaW5pdGlhbCBtb3VudC5cbiAgICAgICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgc3VwcG9ydHMgYXV0by1mb2N1cyBmb3IgY2VydGFpbiBlbGVtZW50cykuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgc3VjaCByZW5kZXJlcnMgZ2V0IHNjaGVkdWxlZCBmb3IgbGF0ZXIgd29yay5cblxuICAgICAgICAgICAgaWYgKGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGluc3RhbmNlLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSkge1xuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MucmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHJlZiBvbiBhIGhvc3Qgbm9kZSB3ZSBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1RleHQgPSBuZXdQcm9wcztcblxuICAgICAgICBpZiAoY3VycmVudCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBvbGRUZXh0ID0gY3VycmVudC5tZW1vaXplZFByb3BzOyAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZFxuICAgICAgICAgIC8vIHRvIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG5cbiAgICAgICAgICB1cGRhdGVIb3N0VGV4dCQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBvbGRUZXh0LCBuZXdUZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5ld1RleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfSAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhYm9ydCB3b3JrLlxuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9yb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpO1xuXG4gICAgICAgICAgdmFyIF9jdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpO1xuXG4gICAgICAgICAgdmFyIF93YXNIeWRyYXRlZDIgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAoX3dhc0h5ZHJhdGVkMikge1xuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3JlYXRlVGV4dEluc3RhbmNlKG5ld1RleHQsIF9yb290Q29udGFpbmVySW5zdGFuY2UsIF9jdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsgLy8gU3BlY2lhbCBwYXRoIGZvciBkZWh5ZHJhdGVkIGJvdW5kYXJpZXMuIFdlIG1heSBldmVudHVhbGx5IG1vdmUgdGhpc1xuICAgICAgICAvLyB0byBpdHMgb3duIGZpYmVyIHR5cGUgc28gdGhhdCB3ZSBjYW4gYWRkIG90aGVyIGtpbmRzIG9mIGh5ZHJhdGlvblxuICAgICAgICAvLyBib3VuZGFyaWVzIHRoYXQgYXJlbid0IGFzc29jaWF0ZWQgd2l0aCBhIFN1c3BlbnNlIHRyZWUuIEluIGFudGljaXBhdGlvblxuICAgICAgICAvLyBvZiBzdWNoIGEgcmVmYWN0b3IsIGFsbCB0aGUgaHlkcmF0aW9uIGxvZ2ljIGlzIGNvbnRhaW5lZCBpblxuICAgICAgICAvLyB0aGlzIGJyYW5jaC5cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZmFsbHRocm91Z2hUb05vcm1hbFN1c3BlbnNlUGF0aCA9IGNvbXBsZXRlRGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRTdGF0ZSk7XG5cbiAgICAgICAgICBpZiAoIWZhbGx0aHJvdWdoVG9Ob3JtYWxTdXNwZW5zZVBhdGgpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlLiBUaGVyZSB3ZXJlIHJlbWFpbmluZyB1bmh5ZHJhdGVkIG5vZGVzLiBXZSB0cmVhdFxuICAgICAgICAgICAgICAvLyB0aGlzIGFzIGEgbWlzbWF0Y2guIFJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLlxuICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBEaWQgbm90IGZpbmlzaCBoeWRyYXRpbmcsIGVpdGhlciBiZWNhdXNlIHRoaXMgaXMgdGhlIGluaXRpYWxcbiAgICAgICAgICAgICAgLy8gcmVuZGVyIG9yIGJlY2F1c2Ugc29tZXRoaW5nIHN1c3BlbmRlZC5cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBDb250aW51ZSB3aXRoIHRoZSBub3JtYWwgU3VzcGVuc2UgcGF0aC5cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZC4gUmUtcmVuZGVyIHdpdGggdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7IC8vIERvIG5vdCByZXNldCB0aGUgZWZmZWN0IGxpc3QuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH0gLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV4dERpZFRpbWVvdXQgPSBuZXh0U3RhdGUgIT09IG51bGw7XG4gICAgICAgIHZhciBwcmV2RGlkVGltZW91dCA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICAvLyBhIHBhc3NpdmUgZWZmZWN0LCB3aGljaCBpcyB3aGVuIHdlIHByb2Nlc3MgdGhlIHRyYW5zaXRpb25zXG5cblxuICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQgIT09IHByZXZEaWRUaW1lb3V0KSB7XG4gICAgICAgICAgLy8gYW4gZWZmZWN0IHRvIHRvZ2dsZSB0aGUgc3VidHJlZSdzIHZpc2liaWxpdHkuIFdoZW4gd2Ugc3dpdGNoIGZyb21cbiAgICAgICAgICAvLyBmYWxsYmFjayAtPiBwcmltYXJ5LCB0aGUgaW5uZXIgT2Zmc2NyZWVuIGZpYmVyIHNjaGVkdWxlcyB0aGlzIGVmZmVjdFxuICAgICAgICAgIC8vIGFzIHBhcnQgb2YgaXRzIG5vcm1hbCBjb21wbGV0ZSBwaGFzZS4gQnV0IHdoZW4gd2Ugc3dpdGNoIGZyb21cbiAgICAgICAgICAvLyBwcmltYXJ5IC0+IGZhbGxiYWNrLCB0aGUgaW5uZXIgT2Zmc2NyZWVuIGZpYmVyIGRvZXMgbm90IGhhdmUgYSBjb21wbGV0ZVxuICAgICAgICAgIC8vIHBoYXNlLiBTbyB3ZSBuZWVkIHRvIHNjaGVkdWxlIGl0cyBlZmZlY3QgaGVyZS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFdlIGFsc28gdXNlIHRoaXMgZmxhZyB0byBjb25uZWN0L2Rpc2Nvbm5lY3QgdGhlIGVmZmVjdHMsIGJ1dCB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxvZ2ljIGFwcGxpZXM6IHdoZW4gcmUtY29ubmVjdGluZywgdGhlIE9mZnNjcmVlbiBmaWJlcidzIGNvbXBsZXRlXG4gICAgICAgICAgLy8gcGhhc2Ugd2lsbCBoYW5kbGUgc2NoZWR1bGluZyB0aGUgZWZmZWN0LiBJdCdzIG9ubHkgd2hlbiB0aGUgZmFsbGJhY2tcbiAgICAgICAgICAvLyBpcyBhY3RpdmUgdGhhdCB3ZSBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuXG5cblxuICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCkge1xuICAgICAgICAgICAgdmFyIF9vZmZzY3JlZW5GaWJlcjIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIF9vZmZzY3JlZW5GaWJlcjIuZmxhZ3MgfD0gVmlzaWJpbGl0eTsgLy8gVE9ETzogVGhpcyB3aWxsIHN0aWxsIHN1c3BlbmQgYSBzeW5jaHJvbm91cyB0cmVlIGlmIGFueXRoaW5nXG4gICAgICAgICAgICAvLyBpbiB0aGUgY29uY3VycmVudCB0cmVlIGFscmVhZHkgc3VzcGVuZGVkIGR1cmluZyB0aGlzIHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBrbm93biBidWcuXG5cbiAgICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBiYWNrIHRvIHRocm93RXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBpcyB0b28gbGF0ZVxuICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbGFyZ2UgdHJlZSB3aGljaCBpcyBjb21tb24gZm9yIGluaXRpYWwgbG9hZHMuIFdlXG4gICAgICAgICAgICAgIC8vIGRvbid0IGtub3cgaWYgd2Ugc2hvdWxkIHJlc3RhcnQgYSByZW5kZXIgb3Igbm90IHVudGlsIHdlIGdldFxuICAgICAgICAgICAgICAvLyB0aGlzIG1hcmtlciwgYW5kIHRoaXMgaXMgdG9vIGxhdGUuXG4gICAgICAgICAgICAgIC8vIElmIHRoaXMgcmVuZGVyIGFscmVhZHkgaGFkIGEgcGluZyBvciBsb3dlciBwcmkgdXBkYXRlcyxcbiAgICAgICAgICAgICAgLy8gYW5kIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2Uga25vdyB3ZSdyZSBnb2luZyB0byBzdXNwZW5kIHdlXG4gICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhYmxlIHRvIGltbWVkaWF0ZWx5IHJlc3RhcnQgZnJvbSB3aXRoaW4gdGhyb3dFeGNlcHRpb24uXG4gICAgICAgICAgICAgIHZhciBoYXNJbnZpc2libGVDaGlsZENvbnRleHQgPSBjdXJyZW50ID09PSBudWxsICYmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrICE9PSB0cnVlIHx8ICFlbmFibGVTdXNwZW5zZUF2b2lkVGhpc0ZhbGxiYWNrKTtcblxuICAgICAgICAgICAgICBpZiAoaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0IHx8IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBpbiBhbiBpbnZpc2libGUgdHJlZSBvciBhIG5ldyByZW5kZXIsIHRoZW4gc2hvd2luZ1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgYm91bmRhcnkgaXMgb2suXG4gICAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZCgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UncmUgZ29pbmcgdG8gaGF2ZSB0byBoaWRlIGNvbnRlbnQgc28gd2Ugc2hvdWxkXG4gICAgICAgICAgICAgICAgLy8gc3VzcGVuZCBmb3IgbG9uZ2VyIGlmIHBvc3NpYmxlLlxuICAgICAgICAgICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3YWtlYWJsZXMgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcblxuICAgICAgICBpZiAod2FrZWFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCBhIHJldHJ5IGxpc3RlbmVyIHRvIHRoZSBwcm9taXNlLlxuICAgICAgICAgIC8vIFRPRE86IE1vdmUgdG8gcGFzc2l2ZSBwaGFzZVxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICBpZiAocHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgcHJlcGFyZVBvcnRhbE1vdW50KHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgIH1cblxuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgLy8gUG9wIHByb3ZpZGVyIGZpYmVyXG4gICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFNhbWUgYXMgY2xhc3MgY29tcG9uZW50IGNhc2UuIEkgcHV0IGl0IGRvd24gaGVyZSBzbyB0aGF0IHRoZSB0YWdzIGFyZVxuICAgICAgICAvLyBzZXF1ZW50aWFsIHRvIGVuc3VyZSB0aGlzIHN3aXRjaCBpcyBjb21waWxlZCB0byBhIGp1bXAgdGFibGUuXG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoX0NvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgaW4gdGhlIGRlZmF1bHQsIFwiaW5kZXBlbmRlbnRcIiBtb2RlLlxuICAgICAgICAgIC8vIFdlIGRvbid0IGRvIGFueXRoaW5nIGluIHRoaXMgbW9kZS5cbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaWRTdXNwZW5kQWxyZWFkeSA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuICAgICAgICB2YXIgcmVuZGVyZWRUYWlsID0gcmVuZGVyU3RhdGUucmVuZGVyaW5nO1xuXG4gICAgICAgIGlmIChyZW5kZXJlZFRhaWwgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBqdXN0IHJlbmRlcmVkIHRoZSBoZWFkLlxuICAgICAgICAgIGlmICghZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHBhc3MuIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiBhbnl0aGluZyBpcyBzdGlsbFxuICAgICAgICAgICAgLy8gc3VzcGVuZGVkIGluIHRoZSByZW5kZXJlZCBzZXQuXG4gICAgICAgICAgICAvLyBJZiBuZXcgY29udGVudCB1bnN1c3BlbmRlZCwgYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSBjb250ZW50IHRoYXRcbiAgICAgICAgICAgIC8vIGRpZG4ndC4gVGhlbiB3ZSBuZWVkIHRvIGRvIGEgc2Vjb25kIHBhc3MgdGhhdCBmb3JjZXMgZXZlcnl0aGluZ1xuICAgICAgICAgICAgLy8gdG8ga2VlcCBzaG93aW5nIHRoZWlyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGJlIHN1c3BlbmRlZCBpZiBzb21ldGhpbmcgaW4gdGhpcyByZW5kZXIgcGFzcyBzdXNwZW5kZWQsIG9yXG4gICAgICAgICAgICAvLyBzb21ldGhpbmcgaW4gdGhlIHByZXZpb3VzIGNvbW1pdHRlZCBwYXNzIHN1c3BlbmRlZC4gT3RoZXJ3aXNlLFxuICAgICAgICAgICAgLy8gdGhlcmUncyBubyBjaGFuY2Ugc28gd2UgY2FuIHNraXAgdGhlIGV4cGVuc2l2ZSBjYWxsIHRvXG4gICAgICAgICAgICAvLyBmaW5kRmlyc3RTdXNwZW5kZWQuXG4gICAgICAgICAgICB2YXIgY2Fubm90QmVTdXNwZW5kZWQgPSByZW5kZXJIYXNOb3RTdXNwZW5kZWRZZXQoKSAmJiAoY3VycmVudCA9PT0gbnVsbCB8fCAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKTtcblxuICAgICAgICAgICAgaWYgKCFjYW5ub3RCZVN1c3BlbmRlZCkge1xuICAgICAgICAgICAgICB2YXIgcm93ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBzdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocm93KTtcblxuICAgICAgICAgICAgICAgIGlmIChzdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gSWYgdGhpcyBpcyBhIG5ld2x5IHN1c3BlbmRlZCB0cmVlLCBpdCBtaWdodCBub3QgZ2V0IGNvbW1pdHRlZCBhc1xuICAgICAgICAgICAgICAgICAgLy8gcGFydCBvZiB0aGUgc2Vjb25kIHBhc3MuIEluIHRoYXQgY2FzZSBub3RoaW5nIHdpbGwgc3Vic2NyaWJlIHRvXG4gICAgICAgICAgICAgICAgICAvLyBpdHMgdGhlbmFibGVzLiBJbnN0ZWFkLCB3ZSdsbCB0cmFuc2ZlciBpdHMgdGhlbmFibGVzIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gU3VzcGVuc2VMaXN0IHNvIHRoYXQgaXQgY2FuIHJldHJ5IGlmIHRoZXkgcmVzb2x2ZS5cbiAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIG9mIHRoZXNlIGluIHRoZSBsaXN0IGJ1dCBzaW5jZSB3ZSdyZVxuICAgICAgICAgICAgICAgICAgLy8gZ29pbmcgdG8gd2FpdCBmb3IgYWxsIG9mIHRoZW0gYW55d2F5LCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIG9uZXMgZ2V0cyB0byBwaW5nLiBJbiB0aGVvcnkgd2UgY291bGQgZ2V0IGNsZXZlciBhbmQga2VlcFxuICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgb2YgaG93IG1hbnkgZGVwZW5kZW5jaWVzIHJlbWFpbiBidXQgaXQgZ2V0cyB0cmlja3kgYmVjYXVzZVxuICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1lYW50aW1lLCB3ZSBjYW4gYWRkL3JlbW92ZS9jaGFuZ2UgaXRlbXMgYW5kIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGJhaWwgb3V0IG9mIHRoZSBsb29wIGJlZm9yZSBmaW5kaW5nIGFueSBidXQgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBtYXR0ZXIgc2luY2UgdGhhdCBtZWFucyB0aGF0IHRoZSBvdGhlciBib3VuZGFyaWVzIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHdlIGRpZCBmaW5kIGFscmVhZHkgaGFzIHRoZWlyIGxpc3RlbmVycyBhdHRhY2hlZC5cblxuICAgICAgICAgICAgICAgICAgdmFyIG5ld1RoZW5hYmxlcyA9IHN1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICAgICAgaWYgKG5ld1RoZW5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG5ld1RoZW5hYmxlcztcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICAgICAgICAgICAgfSAvLyBSZXJlbmRlciB0aGUgd2hvbGUgbGlzdCwgYnV0IHRoaXMgdGltZSwgd2UnbGwgZm9yY2UgZmFsbGJhY2tzXG4gICAgICAgICAgICAgICAgICAvLyB0byBzdGF5IGluIHBsYWNlLlxuICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGVmZmVjdCBmbGFncyBiZWZvcmUgZG9pbmcgdGhlIHNlY29uZCBwYXNzIHNpbmNlIHRoYXQncyBub3cgaW52YWxpZC5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBjaGlsZCBmaWJlcnMgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuXG5cblxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICAgICAgICAgICAgICAgIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsgLy8gU2V0IHVwIHRoZSBTdXNwZW5zZSBDb250ZXh0IHRvIGZvcmNlIHN1c3BlbnNlIGFuZCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgLy8gcmVyZW5kZXIgdGhlIGNoaWxkcmVuLlxuXG4gICAgICAgICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKSk7IC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsICYmIG5vdygpID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBidXQgd2Ugc3RpbGwgaGF2ZSByb3dzXG4gICAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHRhaWwuIFdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyIGF0dGVtcHRzIHRvIHJlbmRlclxuICAgICAgICAgICAgICAvLyB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpO1xuICAgICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBnb2luZyB0byByZW5kZXIgdGhlIHRhaWwuXG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBcHBlbmQgdGhlIHJlbmRlcmVkIHJvdyB0byB0aGUgY2hpbGQgbGlzdC5cbiAgICAgICAgICBpZiAoIWRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICB2YXIgX3N1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyZW5kZXJlZFRhaWwpO1xuXG4gICAgICAgICAgICBpZiAoX3N1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7IC8vIEVuc3VyZSB3ZSB0cmFuc2ZlciB0aGUgdXBkYXRlIHF1ZXVlIHRvIHRoZSBwYXJlbnQgc28gdGhhdCBpdCBkb2Vzbid0XG4gICAgICAgICAgICAgIC8vIGdldCBsb3N0IGlmIHRoaXMgcm93IGVuZHMgdXAgZHJvcHBlZCBkdXJpbmcgYSBzZWNvbmQgcGFzcy5cblxuICAgICAgICAgICAgICB2YXIgX25ld1RoZW5hYmxlcyA9IF9zdXNwZW5kZWQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICAgICAgaWYgKF9uZXdUaGVuYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IF9uZXdUaGVuYWJsZXM7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCB0cnVlKTsgLy8gVGhpcyBtaWdodCBoYXZlIGJlZW4gbW9kaWZpZWQuXG5cbiAgICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgPT09IG51bGwgJiYgcmVuZGVyU3RhdGUudGFpbE1vZGUgPT09ICdoaWRkZW4nICYmICFyZW5kZXJlZFRhaWwuYWx0ZXJuYXRlICYmICFnZXRJc0h5ZHJhdGluZygpIC8vIFdlIGRvbid0IGN1dCBpdCBpZiB3ZSdyZSBoeWRyYXRpbmcuXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgLy8gV2UncmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICggLy8gVGhlIHRpbWUgaXQgdG9vayB0byByZW5kZXIgbGFzdCByb3cgaXMgZ3JlYXRlciB0aGFuIHRoZSByZW1haW5pbmdcbiAgICAgICAgICAgIC8vIHRpbWUgd2UgaGF2ZSB0byByZW5kZXIuIFNvIHJlbmRlcmluZyBvbmUgbW9yZSByb3cgd291bGQgbGlrZWx5XG4gICAgICAgICAgICAvLyBleGNlZWQgaXQuXG4gICAgICAgICAgICBub3coKSAqIDIgLSByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkgJiYgcmVuZGVyTGFuZXMgIT09IE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBub3cgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYW5kIHdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyXG4gICAgICAgICAgICAgIC8vIGF0dGVtcHRzIHRvIHJlbmRlciB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBpcyB1c3VhbGx5IGZhc3Rlci5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVuZGVyU3RhdGUuaXNCYWNrd2FyZHMpIHtcbiAgICAgICAgICAgIC8vIFRoZSBlZmZlY3QgbGlzdCBvZiB0aGUgYmFja3dhcmRzIHRhaWwgd2lsbCBoYXZlIGJlZW4gYWRkZWRcbiAgICAgICAgICAgIC8vIHRvIHRoZSBlbmQuIFRoaXMgYnJlYWtzIHRoZSBndWFyYW50ZWUgdGhhdCBsaWZlLWN5Y2xlcyBmaXJlIGluXG4gICAgICAgICAgICAvLyBzaWJsaW5nIG9yZGVyIGJ1dCB0aGF0IGlzbid0IGEgc3Ryb25nIGd1YXJhbnRlZSBwcm9taXNlZCBieSBSZWFjdC5cbiAgICAgICAgICAgIC8vIEVzcGVjaWFsbHkgc2luY2UgdGhlc2UgbWlnaHQgYWxzbyBqdXN0IHBvcCBpbiBkdXJpbmcgZnV0dXJlIGNvbW1pdHMuXG4gICAgICAgICAgICAvLyBBcHBlbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC5cbiAgICAgICAgICAgIHJlbmRlcmVkVGFpbC5zaWJsaW5nID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZXZpb3VzU2libGluZyA9IHJlbmRlclN0YXRlLmxhc3Q7XG5cbiAgICAgICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNTaWJsaW5nLnNpYmxpbmcgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVuZGVyU3RhdGUubGFzdCA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIHN0aWxsIGhhdmUgdGFpbCByb3dzIHRvIHJlbmRlci5cbiAgICAgICAgICAvLyBQb3AgYSByb3cuXG4gICAgICAgICAgdmFyIG5leHQgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG5leHQ7XG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG5leHQuc2libGluZztcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPSBub3coKTtcbiAgICAgICAgICBuZXh0LnNpYmxpbmcgPSBudWxsOyAvLyBSZXN0b3JlIHRoZSBjb250ZXh0LlxuICAgICAgICAgIC8vIFRPRE86IFdlIGNhbiBwcm9iYWJseSBqdXN0IGF2b2lkIHBvcHBpbmcgaXQgaW5zdGVhZCBhbmQgb25seVxuICAgICAgICAgIC8vIHNldHRpbmcgaXQgdGhlIGZpcnN0IHRpbWUgd2UgZ28gZnJvbSBub3Qgc3VzcGVuZGVkIHRvIHN1c3BlbmRlZC5cblxuICAgICAgICAgIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG5cbiAgICAgICAgICBpZiAoZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7IC8vIERvIGEgcGFzcyBvdmVyIHRoZSBuZXh0IHJvdy5cbiAgICAgICAgICAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgX25leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIHZhciBuZXh0SXNIaWRkZW4gPSBfbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9wcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIHByZXZJc0hpZGRlbiA9IF9wcmV2U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAocHJldklzSGlkZGVuICE9PSBuZXh0SXNIaWRkZW4gJiYgKCAvLyBMZWdhY3lIaWRkZW4gZG9lc24ndCBkbyBhbnkgaGlkaW5nIOKAlCBpdCBvbmx5IHByZS1yZW5kZXJzLlxuICAgICAgICAgICFlbmFibGVMZWdhY3lIaWRkZW4gKSkge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVmlzaWJpbGl0eTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5leHRJc0hpZGRlbiB8fCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgZm9yIGhpZGRlbiBjaGlsZHJlbiB1bmxlc3Mgd2UncmUgcmVuZGVyaW5nXG4gICAgICAgICAgLy8gYXQgb2Zmc2NyZWVuIHByaW9yaXR5LlxuICAgICAgICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKHN1YnRyZWVSZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBpbnNlcnRpb24gb3IgdXBkYXRlIGluIHRoZSBoaWRkZW4gc3VidHJlZS5cbiAgICAgICAgICAgICAgLy8gSWYgc28sIHdlIG5lZWQgdG8gaGlkZSB0aG9zZSBub2RlcyBpbiB0aGUgY29tbWl0IHBoYXNlLCBzb1xuICAgICAgICAgICAgICAvLyBzY2hlZHVsZSBhIHZpc2liaWxpdHkgZWZmZWN0LlxuICAgICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyAmIChQbGFjZW1lbnQgfCBVcGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVmlzaWJpbGl0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICsgd29ya0luUHJvZ3Jlc3MudGFnICsgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gXCIgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiB1bndpbmRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIHZhciBfZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoKF9mbGFncyAmIFNob3VsZENhcHR1cmUpICE9PSBOb0ZsYWdzICYmIChfZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgcmVuZGVyIHRoYXQgd2Fzbid0IGNhcHR1cmVkIGJ5IGEgc3VzcGVuc2VcbiAgICAgICAgICAvLyBib3VuZGFyeS4gRG8gYSBzZWNvbmQgcGFzcyBvbiB0aGUgcm9vdCB0byB1bm1vdW50IHRoZSBjaGlsZHJlbi5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH0gLy8gV2UgdW53b3VuZCB0byB0aGUgcm9vdCB3aXRob3V0IGNvbXBsZXRpbmcgaXQuIEV4aXQuXG5cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogcG9wSHlkcmF0aW9uU3RhdGVcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RocmV3IGluIG5ld2x5IG1vdW50ZWQgZGVoeWRyYXRlZCBjb21wb25lbnQuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZmxhZ3MyID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKF9mbGFnczIgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBfZmxhZ3MyICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlOyAvLyBDYXB0dXJlZCBhIHN1c3BlbnNlIGVmZmVjdC4gUmUtcmVuZGVyIHRoZSBib3VuZGFyeS5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTsgLy8gU3VzcGVuc2VMaXN0IGRvZXNuJ3QgYWN0dWFsbHkgY2F0Y2ggYW55dGhpbmcuIEl0IHNob3VsZCd2ZSBiZWVuXG4gICAgICAgIC8vIGNhdWdodCBieSBhIG5lc3RlZCBib3VuZGFyeS4gSWYgbm90LCBpdCBzaG91bGQgYnViYmxlIHRocm91Z2guXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcblxuICBzd2l0Y2ggKGludGVycnVwdGVkV29yay50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5jaGlsZENvbnRleHRUeXBlcztcblxuICAgICAgICBpZiAoY2hpbGRDb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY2hpbGRDb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBvcENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSBpbnRlcnJ1cHRlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIGNvbnRleHQgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG51bGw7XG5cbntcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBuZXcgU2V0KCk7XG59IC8vIFVzZWQgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIHRoZSBPZmZzY3JlZW4gY29tcG9uZW50IHN0YWNrLlxuLy8gQWxsb3dzIHVzIHRvIGF2b2lkIHRyYXZlcnNpbmcgdGhlIHJldHVybiBwYXRoIHRvIGZpbmQgdGhlIG5lYXJlc3QgT2Zmc2NyZWVuIGFuY2VzdG9yLlxuLy8gT25seSB1c2VkIHdoZW4gZW5hYmxlU3VzcGVuc2VMYXlvdXRFZmZlY3RTZW1hbnRpY3MgaXMgZW5hYmxlZC5cblxuXG52YXIgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gZmFsc2U7XG52YXIgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IGZhbHNlO1xudmFyIFBvc3NpYmx5V2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcbnZhciBuZXh0RWZmZWN0ID0gbnVsbDsgLy8gVXNlZCBmb3IgUHJvZmlsaW5nIGJ1aWxkcyB0byB0cmFjayB1cGRhdGVycy5cblxudmFyIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG52YXIgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuZnVuY3Rpb24gcmVwb3J0VW5jYXVnaHRFcnJvckluREVWKGVycm9yKSB7XG4gIC8vIFdyYXBwaW5nIGVhY2ggc21hbGwgcGFydCBvZiB0aGUgY29tbWl0IHBoYXNlIGludG8gYSBndWFyZGVkXG4gIC8vIGNhbGxiYWNrIGlzIGEgYml0IHRvbyBzbG93IChodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMTY2NikuXG4gIC8vIEJ1dCB3ZSByZWx5IG9uIGl0IHRvIHN1cmZhY2UgZXJyb3JzIHRvIERFViB0b29scyBsaWtlIG92ZXJsYXlzXG4gIC8vIChodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIxNzEyKS5cbiAgLy8gQXMgYSBjb21wcm9taXNlLCByZXRocm93IG9ubHkgY2F1Z2h0IGVycm9ycyBpbiBhIGd1YXJkLlxuICB7XG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuICAgIGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgfVxufVxuXG52YXIgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyID0gZnVuY3Rpb24gKGN1cnJlbnQsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICB9XG59OyAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHRyeSB7XG4gICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQsIGN1cnJlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCB1bm1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSkge1xuICB0cnkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lcihjdXJyZW50LCBpbnN0YW5jZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnREaWRNb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSkge1xuICB0cnkge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUF0dGFjaFJlZihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHRyeSB7XG4gICAgY29tbWl0QXR0YWNoUmVmKGN1cnJlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB2YXIgcmVmID0gY3VycmVudC5yZWY7XG5cbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcmV0VmFsO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlbmFibGVQcm9maWxlckNvbW1pdEhvb2tzICYmIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgIHJldFZhbCA9IHJlZihudWxsKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldFZhbCA9IHJlZihudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0VmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsYmFjayByZWYgaW4gJXMuICcgKyAnQSBjYWxsYmFjayByZWYgc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbi4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxEZXN0cm95KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpIHtcbiAgdHJ5IHtcbiAgICBkZXN0cm95KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59XG5cbnZhciBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBudWxsO1xudmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlO1xuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpcnN0Q2hpbGQpIHtcbiAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gcHJlcGFyZUZvckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pO1xuICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2JlZ2luKCk7IC8vIFdlIG5vIGxvbmdlciBuZWVkIHRvIHRyYWNrIHRoZSBhY3RpdmUgaW5zdGFuY2UgZmliZXJcblxuICB2YXIgc2hvdWxkRmlyZSA9IHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1cjtcbiAgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG4gIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG4gIHJldHVybiBzaG91bGRGaXJlO1xufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfYmVnaW4oKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gVGhpcyBwaGFzZSBpcyBvbmx5IHVzZWQgZm9yIGJlZm9yZUFjdGl2ZUluc3RhbmNlQmx1ci5cblxuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBCZWZvcmVNdXRhdGlvbk1hc2spICE9PSBOb0ZsYWdzICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZSgpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICB0cnkge1xuICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmspIHtcbiAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG5cbiAgaWYgKChmbGFncyAmIFNuYXBzaG90KSAhPT0gTm9GbGFncykge1xuICAgIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNuYXBzaG90ID0gaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IHByZXZQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIHByZXZQcm9wcyksIHByZXZTdGF0ZSk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGRpZFdhcm5TZXQgPSBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblNldC5oYXMoZmluaXNoZWRXb3JrLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3IoJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUgPSBzbmFwc2hvdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgY2xlYXJDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gZm9yIHRoZXNlIGNvbXBvbmVudCB0eXBlc1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgJyArICdsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KGZsYWdzLCBmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG5cbiAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKChlZmZlY3QudGFnICYgZmxhZ3MpID09PSBmbGFncykge1xuICAgICAgICAvLyBVbm1vdW50XG4gICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGZpbmlzaGVkV29yaywgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChmbGFncywgZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gTW91bnRcblxuXG4gICAgICAgIHZhciBjcmVhdGUgPSBlZmZlY3QuY3JlYXRlO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWZmZWN0LmRlc3Ryb3kgPSBjcmVhdGUoKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuXG4gICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZGVzdHJveSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGhvb2tOYW1lID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoKGVmZmVjdC50YWcgJiBMYXlvdXQpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChlZmZlY3QudGFnICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlRWZmZWN0JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGFkZGVuZHVtID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoZGVzdHJveSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICcgWW91IHJldHVybmVkIG51bGwuIElmIHlvdXIgZWZmZWN0IGRvZXMgbm90IHJlcXVpcmUgY2xlYW4gJyArICd1cCwgcmV0dXJuIHVuZGVmaW5lZCAob3Igbm90aGluZykuJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlc3Ryb3kudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICdcXG5cXG5JdCBsb29rcyBsaWtlIHlvdSB3cm90ZSAnICsgaG9va05hbWUgKyAnKGFzeW5jICgpID0+IC4uLikgb3IgcmV0dXJuZWQgYSBQcm9taXNlLiAnICsgJ0luc3RlYWQsIHdyaXRlIHRoZSBhc3luYyBmdW5jdGlvbiBpbnNpZGUgeW91ciBlZmZlY3QgJyArICdhbmQgY2FsbCBpdCBpbW1lZGlhdGVseTpcXG5cXG4nICsgaG9va05hbWUgKyAnKCgpID0+IHtcXG4nICsgJyAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKCkge1xcbicgKyAnICAgIC8vIFlvdSBjYW4gYXdhaXQgaGVyZVxcbicgKyAnICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgTXlBUEkuZ2V0RGF0YShzb21lSWQpO1xcbicgKyAnICAgIC8vIC4uLlxcbicgKyAnICB9XFxuJyArICcgIGZldGNoRGF0YSgpO1xcbicgKyBcIn0sIFtzb21lSWRdKTsgLy8gT3IgW10gaWYgZWZmZWN0IGRvZXNuJ3QgbmVlZCBwcm9wcyBvciBzdGF0ZVxcblxcblwiICsgJ0xlYXJuIG1vcmUgYWJvdXQgZGF0YSBmZXRjaGluZyB3aXRoIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaG9va3MtZGF0YS1mZXRjaGluZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICcgWW91IHJldHVybmVkOiAnICsgZGVzdHJveTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3IoJyVzIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sICcgKyAnd2hpY2ggaXMgdXNlZCBmb3IgY2xlYW4tdXAuJXMnLCBob29rTmFtZSwgYWRkZW5kdW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlRWZmZWN0RHVyYXRpb25zKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKSB7XG4gIHtcbiAgICAvLyBPbmx5IFByb2ZpbGVycyB3aXRoIHdvcmsgaW4gdGhlaXIgc3VidHJlZSB3aWxsIGhhdmUgYW4gVXBkYXRlIGVmZmVjdCBzY2hlZHVsZWQuXG4gICAgaWYgKChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgaWQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUuaWQsXG4gICAgICAgICAgICAgICAgb25Qb3N0Q29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLm9uUG9zdENvbW1pdDsgLy8gVGhpcyB2YWx1ZSB3aWxsIHN0aWxsIHJlZmxlY3QgdGhlIHByZXZpb3VzIGNvbW1pdCBwaGFzZS5cbiAgICAgICAgICAgIC8vIEl0IGRvZXMgbm90IGdldCByZXNldCB1bnRpbCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY29tbWl0IHBoYXNlLlxuXG4gICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBwaGFzZSA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgPT09IG51bGwgPyAnbW91bnQnIDogJ3VwZGF0ZSc7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvblBvc3RDb21taXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgb25Qb3N0Q29tbWl0KGlkLCBwaGFzZSwgcGFzc2l2ZUVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgIH0gLy8gQnViYmxlIHRpbWVzIHRvIHRoZSBuZXh0IG5lYXJlc3QgYW5jZXN0b3IgUHJvZmlsZXIuXG4gICAgICAgICAgICAvLyBBZnRlciB3ZSBwcm9jZXNzIHRoYXQgUHJvZmlsZXIsIHdlJ2xsIGJ1YmJsZSBmdXJ0aGVyIHVwLlxuXG5cbiAgICAgICAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47XG5cbiAgICAgICAgICAgIG91dGVyOiB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcblxuICAgICAgICAgICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdE9uRmliZXIoZmluaXNoZWRSb290LCBjdXJyZW50LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIGlmICgoZmluaXNoZWRXb3JrLmZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoICFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGxheW91dCBlZmZlY3RzIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCAoZHVyaW5nIG11dGF0aW9uIHBoYXNlKS5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSB0byBwcmV2ZW50IHNpYmxpbmcgY29tcG9uZW50IGVmZmVjdHMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIsXG4gICAgICAgICAgICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IHNob3VsZCBuZXZlciBvdmVycmlkZSBhIHJlZiBzZXRcbiAgICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZE1vdW50LiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJldlByb3BzID0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIFRPRE86IEkgdGhpbmsgdGhpcyBpcyBub3cgYWx3YXlzIG5vbi1udWxsIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cblxuXG4gICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuXG4gICAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIHVwZGF0ZVF1ZXVlLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IEkgdGhpbmsgdGhpcyBpcyBub3cgYWx3YXlzIG5vbi1udWxsIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cbiAgICAgICAgICB2YXIgX3VwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKF91cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsuY2hpbGQudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZ2V0UHVibGljSW5zdGFuY2UoZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBfdXBkYXRlUXVldWUsIF9pbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBSZW5kZXJlcnMgbWF5IHNjaGVkdWxlIHdvcmsgdG8gYmUgZG9uZSBhZnRlciBob3N0IGNvbXBvbmVudHMgYXJlIG1vdW50ZWRcbiAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIG1heSBzY2hlZHVsZSBhdXRvLWZvY3VzIGZvciBpbnB1dHMgYW5kIGZvcm0gY29udHJvbHMpLlxuICAgICAgICAgIC8vIFRoZXNlIGVmZmVjdHMgc2hvdWxkIG9ubHkgYmUgY29tbWl0dGVkIHdoZW4gY29tcG9uZW50cyBhcmUgZmlyc3QgbW91bnRlZCxcbiAgICAgICAgICAvLyBha2Egd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50L2FsdGVybmF0ZS5cblxuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsICYmIGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTtcbiAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgY29tbWl0TW91bnQoX2luc3RhbmNlMiwgdHlwZSwgcHJvcHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIG5vIGxpZmUtY3ljbGVzIGFzc29jaWF0ZWQgd2l0aCB0ZXh0LlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHBvcnRhbHMuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgb25Db21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uQ29tbWl0LFxuICAgICAgICAgICAgICAgIG9uUmVuZGVyID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vblJlbmRlcjtcbiAgICAgICAgICAgIHZhciBlZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBwaGFzZSA9IGN1cnJlbnQgPT09IG51bGwgPyAnbW91bnQnIDogJ3VwZGF0ZSc7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvblJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBvblJlbmRlcihmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGZpbmlzaGVkV29yay5hY3R1YWxEdXJhdGlvbiwgZmluaXNoZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24sIGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUsIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygb25Db21taXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBvbkNvbW1pdChmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgICAgfSAvLyBTY2hlZHVsZSBhIHBhc3NpdmUgZWZmZWN0IGZvciB0aGlzIFByb2ZpbGVyIHRvIGNhbGwgb25Qb3N0Q29tbWl0IGhvb2tzLlxuICAgICAgICAgICAgICAvLyBUaGlzIGVmZmVjdCBzaG91bGQgYmUgc2NoZWR1bGVkIGV2ZW4gaWYgdGhlcmUgaXMgbm8gb25Qb3N0Q29tbWl0IGNhbGxiYWNrIGZvciB0aGlzIFByb2ZpbGVyLFxuICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBlZmZlY3QgaXMgYWxzbyB3aGVyZSB0aW1lcyBidWJibGUgdG8gcGFyZW50IFByb2ZpbGVycy5cblxuXG4gICAgICAgICAgICAgIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpbmlzaGVkV29yayk7IC8vIFByb3BhZ2F0ZSBsYXlvdXQgZWZmZWN0IGR1cmF0aW9ucyB0byB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yLlxuICAgICAgICAgICAgICAvLyBEbyBub3QgcmVzZXQgdGhlc2UgdmFsdWVzIHVudGlsIHRoZSBuZXh0IHJlbmRlciBzbyBEZXZUb29scyBoYXMgYSBjaGFuY2UgdG8gcmVhZCB0aGVtIGZpcnN0LlxuXG4gICAgICAgICAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47XG5cbiAgICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgJyArICdsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoICFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAge1xuICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFJlZikge1xuICAgICAgICBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzT25GaWJlcihub2RlKSB7XG4gIC8vIFR1cm4gb24gbGF5b3V0IGVmZmVjdHMgaW4gYSB0cmVlIHRoYXQgcHJldmlvdXNseSBkaXNhcHBlYXJlZC5cbiAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBMYXlvdXRTdGF0aWNcbiAgc3dpdGNoIChub2RlLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBub2RlLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50RGlkTW91bnQobm9kZSwgbm9kZS5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNhZmVseUF0dGFjaFJlZihub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlBdHRhY2hSZWYobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihmaW5pc2hlZFdvcmssIGlzSGlkZGVuKSB7XG4gIC8vIE9ubHkgaGlkZSBvciB1bmhpZGUgdGhlIHRvcC1tb3N0IGhvc3Qgbm9kZXMuXG4gIHZhciBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gZmluaXNoZWRXb3JrO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7XG4gICAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbm9kZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1bmhpZGVJbnN0YW5jZShub2RlLnN0YXRlTm9kZSwgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UzID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgICBoaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdW5oaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgobm9kZS50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gTGVnYWN5SGlkZGVuQ29tcG9uZW50KSAmJiBub2RlLm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgbm9kZSAhPT0gZmluaXNoZWRXb3JrKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbm9kZSkge1xuICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG5vZGUpIHtcbiAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yaykge1xuICB2YXIgcmVmID0gZmluaXNoZWRXb3JrLnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICB2YXIgaW5zdGFuY2VUb1VzZTtcblxuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gZ2V0UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGluc3RhbmNlO1xuICAgIH0gLy8gTW92ZWQgb3V0c2lkZSB0byBlbnN1cmUgRENFIHdvcmtzIHdpdGggdGhpcyBmbGFnXG5cbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJldFZhbDtcblxuICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIHJldFZhbCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRWYWwgPSByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXRWYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBhIGNhbGxiYWNrIHJlZiBpbiAlcy4gJyArICdBIGNhbGxiYWNrIHJlZiBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoIXJlZi5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmVmIG9iamVjdCBwcm92aWRlZCBmb3IgJXMuICcgKyAnVXNlIGVpdGhlciBhIHJlZi1zZXR0ZXIgZnVuY3Rpb24gb3IgUmVhY3QuY3JlYXRlUmVmKCkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyTXV0YXRpb24oZmliZXIpIHtcbiAgLy8gQ3V0IG9mZiB0aGUgcmV0dXJuIHBvaW50ZXIgdG8gZGlzY29ubmVjdCBpdCBmcm9tIHRoZSB0cmVlLlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gZGV0ZWN0IGFuZCB3YXJuIGFnYWluc3Qgc3RhdGUgdXBkYXRlcyBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LlxuICAvLyBJdCBhbHNvIHByZXZlbnRzIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIGZyb20gd2l0aGluIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzLlxuICAvL1xuICAvLyBJZGVhbGx5LCB3ZSBzaG91bGQgYWxzbyBjbGVhciB0aGUgY2hpbGQgcG9pbnRlciBvZiB0aGUgcGFyZW50IGFsdGVybmF0ZSB0byBsZXQgdGhpc1xuICAvLyBnZXQgR0M6ZWQgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggZm9yIHN1cmUgd2hpY2ggcGFyZW50IGlzIHRoZSBjdXJyZW50XG4gIC8vIG9uZSBzbyB3ZSdsbCBzZXR0bGUgZm9yIEdDOmluZyB0aGUgc3VidHJlZSBvZiB0aGlzIGNoaWxkLlxuICAvLyBUaGlzIGNoaWxkIGl0c2VsZiB3aWxsIGJlIEdDOmVkIHdoZW4gdGhlIHBhcmVudCB1cGRhdGVzIHRoZSBuZXh0IHRpbWUuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjbGVhciBjaGlsZCBvciBzaWJsaW5nIHBvaW50ZXJzIHlldC5cbiAgLy8gVGhleSdyZSBuZWVkZWQgZm9yIHBhc3NpdmUgZWZmZWN0cyBhbmQgZm9yIGZpbmRET01Ob2RlLlxuICAvLyBXZSBkZWZlciB0aG9zZSBmaWVsZHMsIGFuZCBhbGwgb3RoZXIgY2xlYW51cCwgdG8gdGhlIHBhc3NpdmUgcGhhc2UgKHNlZSBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cykuXG4gIC8vXG4gIC8vIERvbid0IHJlc2V0IHRoZSBhbHRlcm5hdGUgeWV0LCBlaXRoZXIuIFdlIG5lZWQgdGhhdCBzbyB3ZSBjYW4gZGV0YWNoIHRoZVxuICAvLyBhbHRlcm5hdGUncyBmaWVsZHMgaW4gdGhlIHBhc3NpdmUgcGhhc2UuIENsZWFyaW5nIHRoZSByZXR1cm4gcG9pbnRlciBpc1xuICAvLyBzdWZmaWNpZW50IGZvciBmaW5kRE9NTm9kZSBzZW1hbnRpY3MuXG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5yZXR1cm4gPSBudWxsO1xuICB9XG5cbiAgZmliZXIucmV0dXJuID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgZmliZXIuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhhbHRlcm5hdGUpO1xuICB9IC8vIE5vdGU6IERlZmVuc2l2ZWx5IHVzaW5nIG5lZ2F0aW9uIGluc3RlYWQgb2YgPCBpbiBjYXNlXG4gIC8vIGBkZWxldGVkVHJlZUNsZWFuVXBMZXZlbGAgaXMgdW5kZWZpbmVkLlxuXG5cbiAge1xuICAgIC8vIENsZWFyIGN5Y2xpY2FsIEZpYmVyIGZpZWxkcy4gVGhpcyBsZXZlbCBhbG9uZSBpcyBkZXNpZ25lZCB0byByb3VnaGx5XG4gICAgLy8gYXBwcm94aW1hdGUgdGhlIHBsYW5uZWQgRmliZXIgcmVmYWN0b3IuIEluIHRoYXQgd29ybGQsIGBzZXRTdGF0ZWAgd2lsbCBiZVxuICAgIC8vIGJvdW5kIHRvIGEgc3BlY2lhbCBcImluc3RhbmNlXCIgb2JqZWN0IGluc3RlYWQgb2YgYSBGaWJlci4gVGhlIEluc3RhbmNlXG4gICAgLy8gb2JqZWN0IHdpbGwgbm90IGhhdmUgYW55IG9mIHRoZXNlIGZpZWxkcy4gSXQgd2lsbCBvbmx5IGJlIGNvbm5lY3RlZCB0b1xuICAgIC8vIHRoZSBmaWJlciB0cmVlIHZpYSBhIHNpbmdsZSBsaW5rIGF0IHRoZSByb290LiBTbyBpZiB0aGlzIGxldmVsIGFsb25lIGlzXG4gICAgLy8gc3VmZmljaWVudCB0byBmaXggbWVtb3J5IGlzc3VlcywgdGhhdCBib2RlcyB3ZWxsIGZvciBvdXIgcGxhbnMuXG4gICAgZmliZXIuY2hpbGQgPSBudWxsO1xuICAgIGZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgZmliZXIuc2libGluZyA9IG51bGw7IC8vIFRoZSBgc3RhdGVOb2RlYCBpcyBjeWNsaWNhbCBiZWNhdXNlIG9uIGhvc3Qgbm9kZXMgaXQgcG9pbnRzIHRvIHRoZSBob3N0XG4gICAgLy8gdHJlZSwgd2hpY2ggaGFzIGl0cyBvd24gcG9pbnRlcnMgdG8gY2hpbGRyZW4sIHBhcmVudHMsIGFuZCBzaWJsaW5ncy5cbiAgICAvLyBUaGUgb3RoZXIgaG9zdCBub2RlcyBhbHNvIHBvaW50IGJhY2sgdG8gZmliZXJzLCBzbyB3ZSBzaG91bGQgZGV0YWNoIHRoYXRcbiAgICAvLyBvbmUsIHRvby5cblxuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgZGV0YWNoRGVsZXRlZEluc3RhbmNlKGhvc3RJbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDsgLy8gSSdtIGludGVudGlvbmFsbHkgbm90IGNsZWFyaW5nIHRoZSBgcmV0dXJuYCBmaWVsZCBpbiB0aGlzIGxldmVsLiBXZVxuICAgIC8vIGFscmVhZHkgZGlzY29ubmVjdCB0aGUgYHJldHVybmAgcG9pbnRlciBhdCB0aGUgcm9vdCBvZiB0aGUgZGVsZXRlZFxuICAgIC8vIHN1YnRyZWUgKGluIGBkZXRhY2hGaWJlck11dGF0aW9uYCkuIEJlc2lkZXMsIGByZXR1cm5gIGJ5IGl0c2VsZiBpcyBub3RcbiAgICAvLyBjeWNsaWNhbCDigJQgaXQncyBvbmx5IGN5Y2xpY2FsIHdoZW4gY29tYmluZWQgd2l0aCBgY2hpbGRgLCBgc2libGluZ2AsIGFuZFxuICAgIC8vIGBhbHRlcm5hdGVgLiBCdXQgd2UnbGwgY2xlYXIgaXQgaW4gdGhlIG5leHQgbGV2ZWwgYW55d2F5LCBqdXN0IGluIGNhc2UuXG5cbiAgICB7XG4gICAgICBmaWJlci5fZGVidWdPd25lciA9IG51bGw7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gVGhlb3JldGljYWxseSwgbm90aGluZyBpbiBoZXJlIHNob3VsZCBiZSBuZWNlc3NhcnksIGJlY2F1c2Ugd2UgYWxyZWFkeVxuICAgICAgLy8gZGlzY29ubmVjdGVkIHRoZSBmaWJlciBmcm9tIHRoZSB0cmVlLiBTbyBldmVuIGlmIHNvbWV0aGluZyBsZWFrcyB0aGlzXG4gICAgICAvLyBwYXJ0aWN1bGFyIGZpYmVyLCBpdCB3b24ndCBsZWFrIGFueXRoaW5nIGVsc2VcbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGJyYW5jaCBpcyB0byBiZSBzdXBlciBhZ2dyZXNzaXZlIHNvIHdlIGNhbiBtZWFzdXJlXG4gICAgICAvLyBpZiB0aGVyZSdzIGFueSBkaWZmZXJlbmNlIGluIG1lbW9yeSBpbXBhY3QuIElmIHRoZXJlIGlzLCB0aGF0IGNvdWxkXG4gICAgICAvLyBpbmRpY2F0ZSBhIFJlYWN0IGxlYWsgd2UgZG9uJ3Qga25vdyBhYm91dC5cbiAgICAgIGZpYmVyLnJldHVybiA9IG51bGw7XG4gICAgICBmaWJlci5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgICBmaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IG51bGw7XG4gICAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBUT0RPOiBNb3ZlIHRvIGBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcmAgaW5zdGVhZC5cblxuICAgICAgZmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRIb3N0UGFyZW50RmliZXIoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGlzSG9zdFBhcmVudChwYXJlbnQpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IEhvc3RSb290IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFBvcnRhbDtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFNpYmxpbmcoZmliZXIpIHtcbiAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0XG4gIC8vIG5vZGUuIFVuZm9ydHVuYXRlbHksIGlmIG11bHRpcGxlIGluc2VydGlvbnMgYXJlIGRvbmUgaW4gYSByb3cgd2UgaGF2ZSB0b1xuICAvLyBzZWFyY2ggcGFzdCB0aGVtLiBUaGlzIGxlYWRzIHRvIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgdGhlIG5leHQgc2libGluZy5cbiAgLy8gVE9ETzogRmluZCBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzLlxuICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gIHNpYmxpbmdzOiB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLCBsZXQncyB0cnkgdGhlIG5leHQgc2libGluZy5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgaXNIb3N0UGFyZW50KG5vZGUucmV0dXJuKSkge1xuICAgICAgICAvLyBJZiB3ZSBwb3Agb3V0IG9mIHRoZSByb290IG9yIGhpdCB0aGUgcGFyZW50IHRoZSBmaWJlciB3ZSBhcmUgdGhlXG4gICAgICAgIC8vIGxhc3Qgc2libGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcblxuICAgIHdoaWxlIChub2RlLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBub2RlLnRhZyAhPT0gSG9zdFRleHQgJiYgbm9kZS50YWcgIT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgaXQgaXMgbm90IGhvc3Qgbm9kZSBhbmQsIHdlIG1pZ2h0IGhhdmUgYSBob3N0IG5vZGUgaW5zaWRlIGl0LlxuICAgICAgLy8gVHJ5IHRvIHNlYXJjaCBkb3duIHVudGlsIHdlIGZpbmQgb25lLlxuICAgICAgaWYgKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgIC8vIFdlIGFsc28gc2tpcCBwb3J0YWxzIGJlY2F1c2UgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhpcyBob3N0IHRyZWUuXG5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgPT09IG51bGwgfHwgbm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgfVxuICAgIH0gLy8gQ2hlY2sgaWYgdGhpcyBob3N0IG5vZGUgaXMgc3RhYmxlIG9yIGFib3V0IHRvIGJlIHBsYWNlZC5cblxuXG4gICAgaWYgKCEobm9kZS5mbGFncyAmIFBsYWNlbWVudCkpIHtcbiAgICAgIC8vIEZvdW5kIGl0IVxuICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKSB7XG5cblxuICB2YXIgcGFyZW50RmliZXIgPSBnZXRIb3N0UGFyZW50RmliZXIoZmluaXNoZWRXb3JrKTsgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG5cbiAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKHBhcmVudEZpYmVyLmZsYWdzICYgQ29udGVudFJlc2V0KSB7XG4gICAgICAgICAgLy8gUmVzZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgcGFyZW50IGJlZm9yZSBkb2luZyBhbnkgaW5zZXJ0aW9uc1xuICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQocGFyZW50KTsgLy8gQ2xlYXIgQ29udGVudFJlc2V0IGZyb20gdGhlIGVmZmVjdCB0YWdcblxuICAgICAgICAgIHBhcmVudEZpYmVyLmZsYWdzICY9IH5Db250ZW50UmVzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTsgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgICAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG5cbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGZpbmlzaGVkV29yaywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICB2YXIgX3BhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgIHZhciBfYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGZpbmlzaGVkV29yaywgX2JlZm9yZSwgX3BhcmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBob3N0IHBhcmVudCBmaWJlci4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCkge1xuICAgIHZhciBzdGF0ZU5vZGUgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEluQ29udGFpbmVyQmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKHBhcmVudCwgc3RhdGVOb2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2Uge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShub2RlLCBiZWZvcmUsIHBhcmVudCkge1xuICB2YXIgdGFnID0gbm9kZS50YWc7XG4gIHZhciBpc0hvc3QgPSB0YWcgPT09IEhvc3RDb21wb25lbnQgfHwgdGFnID09PSBIb3N0VGV4dDtcblxuICBpZiAoaXNIb3N0KSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgaW5zZXJ0QmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZChwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKHNpYmxpbmcsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgc2libGluZyA9IHNpYmxpbmcuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gVGhlc2UgYXJlIHRyYWNrZWQgb24gdGhlIHN0YWNrIGFzIHdlIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFcbi8vIGRlbGV0ZWQgc3VidHJlZS5cbi8vIFRPRE86IFVwZGF0ZSB0aGVzZSBkdXJpbmcgdGhlIHdob2xlIG11dGF0aW9uIHBoYXNlLCBub3QganVzdCBkdXJpbmdcbi8vIGEgZGVsZXRpb24uXG5cblxudmFyIGhvc3RQYXJlbnQgPSBudWxsO1xudmFyIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcikge1xuICB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgZGVsZXRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQsIGRldGFjaCByZWZzLCBjbGVhblxuICAgIC8vIHVwIG1vdW50ZWQgbGF5b3V0IGVmZmVjdHMsIGFuZCBjYWxsIGNvbXBvbmVudFdpbGxVbm1vdW50LlxuICAgIC8vIFdlIG9ubHkgbmVlZCB0byByZW1vdmUgdGhlIHRvcG1vc3QgaG9zdCBjaGlsZCBpbiBlYWNoIGJyYW5jaC4gQnV0IHRoZW4gd2VcbiAgICAvLyBzdGlsbCBuZWVkIHRvIGtlZXAgdHJhdmVyc2luZyB0byB1bm1vdW50IGVmZmVjdHMsIHJlZnMsIGFuZCBjV1UuIFRPRE86IFdlXG4gICAgLy8gY291bGQgc3BsaXQgdGhpcyBpbnRvIHR3byBzZXBhcmF0ZSB0cmF2ZXJzYWxzIGZ1bmN0aW9ucywgd2hlcmUgdGhlIHNlY29uZFxuICAgIC8vIG9uZSBkb2Vzbid0IGluY2x1ZGUgYW55IHJlbW92ZUNoaWxkIGxvZ2ljLiBUaGlzIGlzIG1heWJlIHRoZSBzYW1lXG4gICAgLy8gZnVuY3Rpb24gYXMgXCJkaXNhcHBlYXJMYXlvdXRFZmZlY3RzXCIgKG9yIHdoYXRldmVyIHRoYXQgdHVybnMgaW50byBhZnRlclxuICAgIC8vIHRoZSBsYXlvdXQgcGhhc2UgaXMgcmVmYWN0b3JlZCB0byB1c2UgcmVjdXJzaW9uKS5cbiAgICAvLyBCZWZvcmUgc3RhcnRpbmcsIGZpbmQgdGhlIG5lYXJlc3QgaG9zdCBwYXJlbnQgb24gdGhlIHN0YWNrIHNvIHdlIGtub3dcbiAgICAvLyB3aGljaCBpbnN0YW5jZS9jb250YWluZXIgdG8gcmVtb3ZlIHRoZSBjaGlsZHJlbiBmcm9tLlxuICAgIC8vIFRPRE86IEluc3RlYWQgb2Ygc2VhcmNoaW5nIHVwIHRoZSBmaWJlciByZXR1cm4gcGF0aCBvbiBldmVyeSBkZWxldGlvbiwgd2VcbiAgICAvLyBjYW4gdHJhY2sgdGhlIG5lYXJlc3QgaG9zdCBjb21wb25lbnQgb24gdGhlIEpTIHN0YWNrIGFzIHdlIHRyYXZlcnNlIHRoZVxuICAgIC8vIHRyZWUgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UuIFRoaXMgd291bGQgbWFrZSBpbnNlcnRpb25zIGZhc3RlciwgdG9vLlxuICAgIHZhciBwYXJlbnQgPSByZXR1cm5GaWJlcjtcblxuICAgIGZpbmRQYXJlbnQ6IHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaG9zdFBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSAnICsgJ2EgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKHJvb3QsIHJldHVybkZpYmVyLCBkZWxldGVkRmliZXIpO1xuICAgIGhvc3RQYXJlbnQgPSBudWxsO1xuICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuICB9XG5cbiAgZGV0YWNoRmliZXJNdXRhdGlvbihkZWxldGVkRmliZXIpO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgcGFyZW50KSB7XG4gIC8vIFRPRE86IFVzZSBhIHN0YXRpYyBmbGFnIHRvIHNraXAgdHJlZXMgdGhhdCBkb24ndCBoYXZlIHVubW91bnQgZWZmZWN0c1xuICB2YXIgY2hpbGQgPSBwYXJlbnQuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGNoaWxkKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcikge1xuICBvbkNvbW1pdFVubW91bnQoZGVsZXRlZEZpYmVyKTsgLy8gVGhlIGNhc2VzIGluIHRoaXMgb3V0ZXIgc3dpdGNoIG1vZGlmeSB0aGUgc3RhY2sgYmVmb3JlIHRoZXkgdHJhdmVyc2VcbiAgLy8gaW50byB0aGVpciBzdWJ0cmVlLiBUaGVyZSBhcmUgc2ltcGxlciBjYXNlcyBpbiB0aGUgaW5uZXIgc3dpdGNoXG4gIC8vIHRoYXQgZG9uJ3QgbW9kaWZ5IHRoZSBzdGFjay5cblxuICBzd2l0Y2ggKGRlbGV0ZWRGaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICB9IC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoIHRvIG5leHQgYnJhbmNoXG5cbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byByZW1vdmUgdGhlIG5lYXJlc3QgaG9zdCBjaGlsZC4gU2V0IHRoZSBob3N0IHBhcmVudFxuICAgICAgICAvLyB0byBgbnVsbGAgb24gdGhlIHN0YWNrIHRvIGluZGljYXRlIHRoYXQgbmVzdGVkIGNoaWxkcmVuIGRvbid0XG4gICAgICAgIC8vIG5lZWQgdG8gYmUgcmVtb3ZlZC5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IHByZXZIb3N0UGFyZW50O1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG5cbiAgICAgICAgICBpZiAoaG9zdFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gTm93IHRoYXQgYWxsIHRoZSBjaGlsZCBlZmZlY3RzIGhhdmUgdW5tb3VudGVkLCB3ZSBjYW4gcmVtb3ZlIHRoZVxuICAgICAgICAgICAgLy8gbm9kZSBmcm9tIHRoZSB0cmVlLlxuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZChob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gRGVsZXRlIHRoZSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnQuXG5cblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGhvc3RQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChob3N0UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXaGVuIHdlIGdvIGludG8gYSBwb3J0YWwsIGl0IGJlY29tZXMgdGhlIHBhcmVudCB0byByZW1vdmUgZnJvbS5cbiAgICAgICAgICB2YXIgX3ByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgICAgICB2YXIgX3ByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBfcHJldkhvc3RQYXJlbnQ7XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gX3ByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBkZWxldGVkRmliZXIudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgICAgICAgICAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBfZWZmZWN0ID0gZWZmZWN0LFxuICAgICAgICAgICAgICAgICAgICBkZXN0cm95ID0gX2VmZmVjdC5kZXN0cm95LFxuICAgICAgICAgICAgICAgICAgICB0YWcgPSBfZWZmZWN0LnRhZztcblxuICAgICAgICAgICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YWcgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChkZWxldGVkRmliZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWxldGVkRmliZXIubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCAvLyBUT0RPOiBSZW1vdmUgdGhpcyBkZWFkIGZsYWdcbiAgICAgICAgIGRlbGV0ZWRGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIG9mZnNjcmVlbiBjb21wb25lbnQgaXMgaGlkZGVuLCB3ZSBhbHJlYWR5IHVubW91bnRlZCBpdC4gQmVmb3JlXG4gICAgICAgICAgLy8gZGVsZXRpbmcgdGhlIGNoaWxkcmVuLCB0cmFjayB0aGF0IGl0J3MgYWxyZWFkeSB1bm1vdW50ZWQgc28gdGhhdCB3ZVxuICAgICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gdW5tb3VudCB0aGUgZWZmZWN0cyBhZ2Fpbi5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGUgdHJlZSBpcyBoaWRkZW4sIGluIG1vc3QgY2FzZXMgd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2tpcFxuICAgICAgICAgIC8vIG92ZXIgdGhlIG5lc3RlZCBjaGlsZHJlbiBlbnRpcmVseS4gQW4gZXhjZXB0aW9uIGlzIHdlIGhhdmVuJ3QgeWV0IGZvdW5kXG4gICAgICAgICAgLy8gdGhlIHRvcG1vc3QgaG9zdCBub2RlIHRvIGRlbGV0ZSwgd2hpY2ggd2UgYWxyZWFkeSB0cmFjayBvbiB0aGUgc3RhY2suXG4gICAgICAgICAgLy8gQnV0IHRoZSBvdGhlciBjYXNlIGlzIHBvcnRhbHMsIHdoaWNoIG5lZWQgdG8gYmUgZGV0YWNoZWQgbm8gbWF0dGVyIGhvd1xuICAgICAgICAgIC8vIGRlZXBseSB0aGV5IGFyZSBuZXN0ZWQuIFdlIHNob3VsZCB1c2UgYSBzdWJ0cmVlIGZsYWcgdG8gdHJhY2sgd2hldGhlciBhXG4gICAgICAgICAgLy8gc3VidHJlZSBpbmNsdWRlcyBhIG5lc3RlZCBwb3J0YWwuXG4gICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgZGVsZXRlZEZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKSB7XG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0byBwYXNzaXZlIHBoYXNlXG4gIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuXG4gIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXdTdGF0ZSA9PT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgdGhlbiBpdCB3aWxsIGhhdmUgYSBzZXQgb2Ygd2FrZWFibGVzLlxuICAvLyBGb3IgZWFjaCB3YWtlYWJsZSwgYXR0YWNoIGEgbGlzdGVuZXIgc28gdGhhdCB3aGVuIGl0IHJlc29sdmVzLCBSZWFjdFxuICAvLyBhdHRlbXB0cyB0byByZS1yZW5kZXIgdGhlIGJvdW5kYXJ5IGluIHRoZSBwcmltYXJ5IChwcmUtdGltZW91dCkgc3RhdGUuXG4gIHZhciB3YWtlYWJsZXMgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgaWYgKHdha2VhYmxlcyAhPT0gbnVsbCkge1xuICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgdmFyIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgaWYgKHJldHJ5Q2FjaGUgPT09IG51bGwpIHtcbiAgICAgIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID0gbmV3IFBvc3NpYmx5V2Vha1NldCgpO1xuICAgIH1cblxuICAgIHdha2VhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uICh3YWtlYWJsZSkge1xuICAgICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgYm91bmRhcnkgZmliZXIgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgICAgdmFyIHJldHJ5ID0gcmVzb2x2ZVJldHJ5V2FrZWFibGUuYmluZChudWxsLCBmaW5pc2hlZFdvcmssIHdha2VhYmxlKTtcblxuICAgICAgaWYgKCFyZXRyeUNhY2hlLmhhcyh3YWtlYWJsZSkpIHtcbiAgICAgICAgcmV0cnlDYWNoZS5hZGQod2FrZWFibGUpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgICAgIGlmIChpblByb2dyZXNzTGFuZXMgIT09IG51bGwgJiYgaW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIGFzc29jaWF0ZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnMgd2l0aCBpdC5cbiAgICAgICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhpblByb2dyZXNzUm9vdCwgaW5Qcm9ncmVzc0xhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IEVycm9yKCdFeHBlY3RlZCBmaW5pc2hlZCByb290IGFuZCBsYW5lcyB0byBiZSBzZXQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2FrZWFibGUudGhlbihyZXRyeSwgcmV0cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IC8vIFRoaXMgZnVuY3Rpb24gZGV0ZWN0cyB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgZ29lcyBmcm9tIHZpc2libGUgdG8gaGlkZGVuLlxuZnVuY3Rpb24gY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMpIHtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7XG4gIGluUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290KTtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgbGFuZXMpIHtcbiAgLy8gRGVsZXRpb25zIGVmZmVjdHMgY2FuIGJlIHNjaGVkdWxlZCBvbiBhbnkgZmliZXIgdHlwZS4gVGhleSBuZWVkIHRvIGhhcHBlblxuICAvLyBiZWZvcmUgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGFlIGZpcmVkLlxuICB2YXIgZGVsZXRpb25zID0gcGFyZW50RmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjaGlsZFRvRGVsZXRlLCBwYXJlbnRGaWJlciwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBwcmV2RGVidWdGaWJlciA9IGdldEN1cnJlbnRGaWJlcigpO1xuXG4gIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiBNdXRhdGlvbk1hc2spIHtcbiAgICB2YXIgY2hpbGQgPSBwYXJlbnRGaWJlci5jaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGNoaWxkKTtcbiAgICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoY2hpbGQsIHJvb3QpO1xuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHNldEN1cnJlbnRGaWJlcihwcmV2RGVidWdGaWJlcik7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcykge1xuICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFnczsgLy8gVGhlIGVmZmVjdCBmbGFnIHNob3VsZCBiZSBjaGVja2VkICphZnRlciogd2UgcmVmaW5lIHRoZSB0eXBlIG9mIGZpYmVyLFxuICAvLyBiZWNhdXNlIHRoZSBmaWJlciB0YWcgaXMgbW9yZSBzcGVjaWZpYy4gQW4gZXhjZXB0aW9uIGlzIGFueSBmbGFnIHJlbGF0ZWRcbiAgLy8gdG8gcmVjb25jaWxhdGlvbiwgYmVjYXVzZSB0aG9zZSBjYW4gYmUgc2V0IG9uIGFsbCBmaWJlciB0eXBlcy5cblxuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH0gLy8gTGF5b3V0IGVmZmVjdHMgYXJlIGRlc3Ryb3llZCBkdXJpbmcgdGhlIG11dGF0aW9uIHBoYXNlIHNvIHRoYXQgYWxsXG4gICAgICAgICAgLy8gZGVzdHJveSBmdW5jdGlvbnMgZm9yIGFsbCBmaWJlcnMgYXJlIGNhbGxlZCBiZWZvcmUgYW55IGNyZWF0ZSBmdW5jdGlvbnMuXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLFxuICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldFxuICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG5cblxuICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFJlZikge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETzogQ29udGVudFJlc2V0IGdldHMgY2xlYXJlZCBieSB0aGUgY2hpbGRyZW4gZHVyaW5nIHRoZSBjb21taXRcbiAgICAgICAgICAvLyBwaGFzZS4gVGhpcyBpcyBhIHJlZmFjdG9yIGhhemFyZCBiZWNhdXNlIGl0IG1lYW5zIHdlIG11c3QgcmVhZFxuICAgICAgICAgIC8vIGZsYWdzIHRoZSBmbGFncyBhZnRlciBgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzYCBoYXMgYWxyZWFkeSBydW47XG4gICAgICAgICAgLy8gdGhlIG9yZGVyIG1hdHRlcnMuIFdlIHNob3VsZCByZWZhY3RvciBzbyB0aGF0IENvbnRlbnRSZXNldCBkb2VzIG5vdFxuICAgICAgICAgIC8vIHJlbHkgb24gbXV0YXRpbmcgdGhlIGZsYWcgZHVyaW5nIGNvbW1pdC4gTGlrZSBieSBzZXR0aW5nIGEgZmxhZ1xuICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlIGluc3RlYWQuXG4gICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmVzZXRUZXh0Q29udGVudChpbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2U0ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKF9pbnN0YW5jZTQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBDb21taXQgdGhlIHdvcmsgcHJlcGFyZWQgZWFybGllci5cbiAgICAgICAgICAgICAgdmFyIG5ld1Byb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3UHJvcHM7XG4gICAgICAgICAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGU7IC8vIFRPRE86IFR5cGUgdGhlIHVwZGF0ZVF1ZXVlIHRvIGJlIHNwZWNpZmljIHRvIGhvc3QgY29tcG9uZW50cy5cblxuICAgICAgICAgICAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAgICAgICAgICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb21taXRVcGRhdGUoX2luc3RhbmNlNCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBzaG91bGQgaGF2ZSBhIHRleHQgbm9kZSBpbml0aWFsaXplZC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHZhciBuZXdUZXh0ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpblxuICAgICAgICAgICAgLy8gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdUZXh0O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2Um9vdFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICAgIGlmIChwcmV2Um9vdFN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb21taXRIeWRyYXRlZENvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgdmFyIG9mZnNjcmVlbkZpYmVyID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIGlmIChvZmZzY3JlZW5GaWJlci5mbGFncyAmIFZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgb2Zmc2NyZWVuSW5zdGFuY2UgPSBvZmZzY3JlZW5GaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIG5ld1N0YXRlID0gb2Zmc2NyZWVuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgaXNIaWRkZW4gPSBuZXdTdGF0ZSAhPT0gbnVsbDsgLy8gVHJhY2sgdGhlIGN1cnJlbnQgc3RhdGUgb24gdGhlIE9mZnNjcmVlbiBpbnN0YW5jZSBzbyB3ZSBjYW5cbiAgICAgICAgICAvLyByZWFkIGl0IGR1cmluZyBhbiBldmVudFxuXG4gICAgICAgICAgb2Zmc2NyZWVuSW5zdGFuY2UuaXNIaWRkZW4gPSBpc0hpZGRlbjtcblxuICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgdmFyIHdhc0hpZGRlbiA9IG9mZnNjcmVlbkZpYmVyLmFsdGVybmF0ZSAhPT0gbnVsbCAmJiBvZmZzY3JlZW5GaWJlci5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKCF3YXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0byBwYXNzaXZlIHBoYXNlXG4gICAgICAgICAgICAgIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRTdXNwZW5zZUNhbGxiYWNrKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX3dhc0hpZGRlbiA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnXG4gICAgICAgICBmaW5pc2hlZFdvcmsubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgLy8gQmVmb3JlIGNvbW1pdHRpbmcgdGhlIGNoaWxkcmVuLCB0cmFjayBvbiB0aGUgc3RhY2sgd2hldGhlciB0aGlzXG4gICAgICAgICAgLy8gb2Zmc2NyZWVuIHN1YnRyZWUgd2FzIGFscmVhZHkgaGlkZGVuLCBzbyB0aGF0IHdlIGRvbid0IHVubW91bnQgdGhlXG4gICAgICAgICAgLy8gZWZmZWN0cyBhZ2Fpbi5cbiAgICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fCBfd2FzSGlkZGVuO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVmlzaWJpbGl0eSkge1xuICAgICAgICAgIHZhciBfb2Zmc2NyZWVuSW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBfbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgIHZhciBfaXNIaWRkZW4gPSBfbmV3U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICB2YXIgb2Zmc2NyZWVuQm91bmRhcnkgPSBmaW5pc2hlZFdvcms7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHN0YXRlIG9uIHRoZSBPZmZzY3JlZW4gaW5zdGFuY2Ugc28gd2UgY2FuXG4gICAgICAgICAgLy8gcmVhZCBpdCBkdXJpbmcgYW4gZXZlbnRcblxuICAgICAgICAgIF9vZmZzY3JlZW5JbnN0YW5jZS5pc0hpZGRlbiA9IF9pc0hpZGRlbjtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChfaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaWYgKCFfd2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKChvZmZzY3JlZW5Cb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBvZmZzY3JlZW5Cb3VuZGFyeTtcbiAgICAgICAgICAgICAgICAgIHZhciBvZmZzY3JlZW5DaGlsZCA9IG9mZnNjcmVlbkJvdW5kYXJ5LmNoaWxkO1xuXG4gICAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2NyZWVuQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdCA9IG9mZnNjcmVlbkNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKG9mZnNjcmVlbkNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuQ2hpbGQgPSBvZmZzY3JlZW5DaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgbmVlZHMgdG8gcnVuIHdoZW5ldmVyIHRoZXJlJ3MgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZVxuICAgICAgICAgICAgLy8gaW5zaWRlIGEgaGlkZGVuIE9mZnNjcmVlbiB0cmVlLlxuICAgICAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4ob2Zmc2NyZWVuQm91bmRhcnksIF9pc0hpZGRlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yaykge1xuICAvLyBQbGFjZW1lbnQgZWZmZWN0cyAoaW5zZXJ0aW9ucywgcmVvcmRlcnMpIGNhbiBiZSBzY2hlZHVsZWQgb24gYW55IGZpYmVyXG4gIC8vIHR5cGUuIFRoZXkgbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHRoZSBjaGlsZHJlbiBlZmZlY3RzIGhhdmUgZmlyZWQsIGJ1dFxuICAvLyBiZWZvcmUgdGhlIGVmZmVjdHMgb24gdGhpcyBmaWJlciBoYXZlIGZpcmVkLlxuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG5cbiAgaWYgKGZsYWdzICYgUGxhY2VtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICB9IC8vIENsZWFyIHRoZSBcInBsYWNlbWVudFwiIGZyb20gZWZmZWN0IHRhZyBzbyB0aGF0IHdlIGtub3cgdGhhdCB0aGlzIGlzXG4gICAgLy8gaW5zZXJ0ZWQsIGJlZm9yZSBhbnkgbGlmZS1jeWNsZXMgbGlrZSBjb21wb25lbnREaWRNb3VudCBnZXRzIGNhbGxlZC5cbiAgICAvLyBUT0RPOiBmaW5kRE9NTm9kZSBkb2Vzbid0IHJlbHkgb24gdGhpcyBhbnkgbW9yZSBidXQgaXNNb3VudGVkIGRvZXNcbiAgICAvLyBhbmQgaXNNb3VudGVkIGlzIGRlcHJlY2F0ZWQgYW55d2F5IHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIGtpbGwgdGhpcy5cblxuXG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5QbGFjZW1lbnQ7XG4gIH1cblxuICBpZiAoZmxhZ3MgJiBIeWRyYXRpbmcpIHtcbiAgICBmaW5pc2hlZFdvcmsuZmxhZ3MgJj0gfkh5ZHJhdGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7XG4gIGluUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgbmV4dEVmZmVjdCA9IGZpbmlzaGVkV29yaztcbiAgY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbiAgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICAvLyBTdXNwZW5zZSBsYXlvdXQgZWZmZWN0cyBzZW1hbnRpY3MgZG9uJ3QgY2hhbmdlIGZvciBsZWdhY3kgcm9vdHMuXG4gIHZhciBpc01vZGVyblJvb3QgPSAoc3VidHJlZVJvb3QubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKCBmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCAmJiBpc01vZGVyblJvb3QpIHtcbiAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgT2Zmc2NyZWVuIHN0YWNrJ3Mgc3RhdGUuXG4gICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgdmFyIG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGlzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcblxuICAgICAgaWYgKG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbikge1xuICAgICAgICAvLyBUaGUgT2Zmc2NyZWVuIHRyZWUgaXMgaGlkZGVuLiBTa2lwIG92ZXIgaXRzIGxheW91dCBlZmZlY3RzLlxuICAgICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPIChPZmZzY3JlZW4pIEFsc28gY2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dE1hc2tcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICAgIHZhciB3YXNIaWRkZW4gPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIG5ld09mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSB3YXNIaWRkZW4gfHwgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47IC8vIFRyYXZlcnNlIHRoZSBPZmZzY3JlZW4gc3VidHJlZSB3aXRoIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBhcyB0aGUgcm9vdC5cblxuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuXG4gICAgICAgIGlmIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuICYmICFwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3Qgb2YgYSByZWFwcGVhcmluZyBib3VuZGFyeS4gVHVybiBpdHMgbGF5b3V0IGVmZmVjdHNcbiAgICAgICAgICAvLyBiYWNrIG9uLlxuICAgICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oZmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkID0gZmlyc3RDaGlsZDtcblxuICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihjaGlsZCwgLy8gTmV3IHJvb3Q7IGJ1YmJsZSBiYWNrIHVwIHRvIGhlcmUgYW5kIHN0b3AuXG4gICAgICAgICAgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfSAvLyBSZXN0b3JlIE9mZnNjcmVlbiBzdGF0ZSBhbmQgcmVzdW1lIGluIG91ci1wcm9ncmVzcyB0cmF2ZXJzYWwuXG5cblxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihyb290LCBjdXJyZW50LCBmaWJlciwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiAoUmVmU3RhdGljIHwgTGF5b3V0U3RhdGljKVxuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIGZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgUmVmU3RhdGljXG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhXG4gICAgICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gTmVzdGVkIE9mZnNjcmVlbiB0cmVlIGlzIGFscmVhZHkgaGlkZGVuLiBEb24ndCBkaXNhcHBlYXJcbiAgICAgICAgICAgIC8vIGl0cyBlZmZlY3RzLlxuICAgICAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0gLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0U3RhdGljXG5cblxuICAgIGlmIChmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50KSB7XG4gICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgLy8gTmVzdGVkIE9mZnNjcmVlbiB0cmVlIGlzIHN0aWxsIGhpZGRlbi4gRG9uJ3QgcmUtYXBwZWFyIGl0cyBlZmZlY3RzLlxuICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpY1xuXG5cbiAgICBpZiAoZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0XG4gICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuXG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljXG5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c09uRmliZXIoZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIG5vZGUgbWF5IGhhdmUgYmVlbiByZXVzZWQgZnJvbSBhIHByZXZpb3VzIHJlbmRlciwgc28gd2UgY2FuJ3RcbiAgICAgIC8vIGFzc3VtZSBpdHMgcmV0dXJuIHBvaW50ZXIgaXMgY29ycmVjdC5cbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyAmJiBmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIocm9vdCwgZmliZXIsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRPbkZpYmVyKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHMoZmlyc3RDaGlsZCkge1xuICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2JlZ2luKCk7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChuZXh0RWZmZWN0LmZsYWdzICYgQ2hpbGREZWxldGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHZhciBkZWxldGlvbnMgPSBmaWJlci5kZWxldGlvbnM7XG5cbiAgICAgIGlmIChkZWxldGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmliZXJUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXJUb0RlbGV0ZTtcbiAgICAgICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKGZpYmVyVG9EZWxldGUsIGZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBBIGZpYmVyIHdhcyBkZWxldGVkIGZyb20gdGhpcyBwYXJlbnQgZmliZXIsIGJ1dCBpdCdzIHN0aWxsIHBhcnQgb2ZcbiAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgKGFsdGVybmF0ZSkgcGFyZW50IGZpYmVyJ3MgbGlzdCBvZiBjaGlsZHJlbi4gQmVjYXVzZVxuICAgICAgICAgIC8vIGNoaWxkcmVuIGFyZSBhIGxpbmtlZCBsaXN0LCBhbiBlYXJsaWVyIHNpYmxpbmcgdGhhdCdzIHN0aWxsIGFsaXZlXG4gICAgICAgICAgLy8gd2lsbCBiZSBjb25uZWN0ZWQgdG8gdGhlIGRlbGV0ZWQgZmliZXIgdmlhIGl0cyBgYWx0ZXJuYXRlYDpcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vICAgbGl2ZSBmaWJlclxuICAgICAgICAgIC8vICAgLS1hbHRlcm5hdGUtLT4gcHJldmlvdXMgbGl2ZSBmaWJlclxuICAgICAgICAgIC8vICAgLS1zaWJsaW5nLS0+IGRlbGV0ZWQgZmliZXJcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFdlIGNhbid0IGRpc2Nvbm5lY3QgYGFsdGVybmF0ZWAgb24gbm9kZXMgdGhhdCBoYXZlbid0IGJlZW4gZGVsZXRlZFxuICAgICAgICAgIC8vIHlldCwgYnV0IHdlIGNhbiBkaXNjb25uZWN0IHRoZSBgc2libGluZ2AgYW5kIGBjaGlsZGAgcG9pbnRlcnMuXG4gICAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGRldGFjaGVkQ2hpbGQgPSBwcmV2aW91c0ZpYmVyLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAoZGV0YWNoZWRDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c0ZpYmVyLmNoaWxkID0gbnVsbDtcblxuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIGRldGFjaGVkU2libGluZyA9IGRldGFjaGVkQ2hpbGQuc2libGluZztcbiAgICAgICAgICAgICAgICBkZXRhY2hlZENoaWxkLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIGRldGFjaGVkQ2hpbGQgPSBkZXRhY2hlZFNpYmxpbmc7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihmaWJlcik7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihkZWxldGVkU3VidHJlZVJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBEZWxldGlvbiBlZmZlY3RzIGZpcmUgaW4gcGFyZW50IC0+IGNoaWxkIG9yZGVyXG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgZmliZXIgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnXG5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyKGZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkOyAvLyBUT0RPOiBPbmx5IHRyYXZlcnNlIHN1YnRyZWUgaWYgaXQgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnLiAoQnV0LCBpZiB3ZVxuICAgIC8vIGRvIHRoaXMsIHN0aWxsIG5lZWQgdG8gaGFuZGxlIGBkZWxldGVkVHJlZUNsZWFuVXBMZXZlbGAgY29ycmVjdGx5LilcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfY29tcGxldGUoZGVsZXRlZFN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9jb21wbGV0ZShkZWxldGVkU3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB7XG4gICAgICAvLyBSZWN1cnNpdmVseSB0cmF2ZXJzZSB0aGUgZW50aXJlIGRlbGV0ZWQgdHJlZSBhbmQgY2xlYW4gdXAgZmliZXIgZmllbGRzLlxuICAgICAgLy8gVGhpcyBpcyBtb3JlIGFnZ3Jlc3NpdmUgdGhhbiBpZGVhbCwgYW5kIHRoZSBsb25nIHRlcm0gZ29hbCBpcyB0byBvbmx5XG4gICAgICAvLyBoYXZlIHRvIGRldGFjaCB0aGUgZGVsZXRlZCB0cmVlIGF0IHRoZSByb290LlxuICAgICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZmliZXIpO1xuXG4gICAgICBpZiAoZmliZXIgPT09IGRlbGV0ZWRTdWJ0cmVlUm9vdCkge1xuICAgICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IHJldHVybkZpYmVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgc3dpdGNoIChjdXJyZW50LnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSwgY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn0gLy8gVE9ETzogUmV1c2UgcmVhcHBlYXJMYXlvdXRFZmZlY3RzIHRyYXZlcnNhbCBoZXJlP1xuXG5cbmZ1bmN0aW9uIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaWJlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VQYXNzaXZlRWZmZWN0TW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpYmVyKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUxheW91dEVmZmVjdFVubW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGZpYmVyLCBmaWJlci5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VQYXNzaXZlRWZmZWN0VW5tb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgQ09NUE9ORU5UX1RZUEUgPSAwO1xudmFyIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IDE7XG52YXIgUk9MRV9UWVBFID0gMjtcbnZhciBURVNUX05BTUVfVFlQRSA9IDM7XG52YXIgVEVYVF9UWVBFID0gNDtcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcikge1xuICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgQ09NUE9ORU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLmNvbXBvbmVudCcpO1xuICBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLmhhc19wc2V1ZG9fY2xhc3MnKTtcbiAgUk9MRV9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5yb2xlJyk7XG4gIFRFU1RfTkFNRV9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci50ZXN0X2lkJyk7XG4gIFRFWFRfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IudGV4dCcpO1xufVxudmFyIGNvbW1pdEhvb2tzID0gW107XG5mdW5jdGlvbiBvbkNvbW1pdFJvb3QkMSgpIHtcbiAge1xuICAgIGNvbW1pdEhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGNvbW1pdEhvb2spIHtcbiAgICAgIHJldHVybiBjb21taXRIb29rKCk7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWU7XG5mdW5jdGlvbiBpc0xlZ2FjeUFjdEVudmlyb25tZW50KGZpYmVyKSB7XG4gIHtcbiAgICAvLyBMZWdhY3kgbW9kZS4gV2UgcHJlc2VydmUgdGhlIGJlaGF2aW9yIG9mIFJlYWN0IDE3J3MgYWN0LiBJdCBhc3N1bWVzIGFuXG4gICAgLy8gYWN0IGVudmlyb25tZW50IHdoZW5ldmVyIGBqZXN0YCBpcyBkZWZpbmVkLCBidXQgeW91IGNhbiBzdGlsbCB0dXJuIG9mZlxuICAgIC8vIHNwdXJpb3VzIHdhcm5pbmdzIGJ5IHNldHRpbmcgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGV4cGxpY2l0bHlcbiAgICAvLyB0byBmYWxzZS5cbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIOKAkyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7IC8vICRGbG93RXhwZWN0ZWRFcnJvciAtIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IGplc3RcblxuICAgIHZhciBqZXN0SXNEZWZpbmVkID0gdHlwZW9mIGplc3QgIT09ICd1bmRlZmluZWQnO1xuICAgIHJldHVybiAgamVzdElzRGVmaW5lZCAmJiBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgIT09IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpIHtcbiAge1xuICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPSAvLyAkRmxvd0V4cGVjdGVkRXJyb3Ig4oCTIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBnbG9iYWxcbiAgICB0eXBlb2YgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UICE9PSAndW5kZWZpbmVkJyA/IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICYmIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IEluY2x1ZGUgbGluayB0byByZWxldmFudCBkb2N1bWVudGF0aW9uIHBhZ2UuXG4gICAgICBlcnJvcignVGhlIGN1cnJlbnQgdGVzdGluZyBlbnZpcm9ubWVudCBpcyBub3QgY29uZmlndXJlZCB0byBzdXBwb3J0ICcgKyAnYWN0KC4uLiknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsO1xuICB9XG59XG5cbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWU7XG52YXIgTm9Db250ZXh0ID1cbi8qICAgICAgICAgICAgICovXG4wO1xudmFyIEJhdGNoZWRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgUmVuZGVyQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBDb21taXRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICovXG40O1xudmFyIFJvb3RJblByb2dyZXNzID0gMDtcbnZhciBSb290RmF0YWxFcnJvcmVkID0gMTtcbnZhciBSb290RXJyb3JlZCA9IDI7XG52YXIgUm9vdFN1c3BlbmRlZCA9IDM7XG52YXIgUm9vdFN1c3BlbmRlZFdpdGhEZWxheSA9IDQ7XG52YXIgUm9vdENvbXBsZXRlZCA9IDU7XG52YXIgUm9vdERpZE5vdENvbXBsZXRlID0gNjsgLy8gRGVzY3JpYmVzIHdoZXJlIHdlIGFyZSBpbiB0aGUgUmVhY3QgZXhlY3V0aW9uIHN0YWNrXG5cbnZhciBleGVjdXRpb25Db250ZXh0ID0gTm9Db250ZXh0OyAvLyBUaGUgcm9vdCB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsOyAvLyBUaGUgZmliZXIgd2UncmUgd29ya2luZyBvblxuXG52YXIgd29ya0luUHJvZ3Jlc3MgPSBudWxsOyAvLyBUaGUgbGFuZXMgd2UncmUgcmVuZGVyaW5nXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFN0YWNrIHRoYXQgYWxsb3dzIGNvbXBvbmVudHMgdG8gY2hhbmdlIHRoZSByZW5kZXIgbGFuZXMgZm9yIGl0cyBzdWJ0cmVlXG4vLyBUaGlzIGlzIGEgc3VwZXJzZXQgb2YgdGhlIGxhbmVzIHdlIHN0YXJ0ZWQgd29ya2luZyBvbiBhdCB0aGUgcm9vdC4gVGhlIG9ubHlcbi8vIGNhc2Ugd2hlcmUgaXQncyBkaWZmZXJlbnQgZnJvbSBgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXNgIGlzIHdoZW4gd2Vcbi8vIGVudGVyIGEgc3VidHJlZSB0aGF0IGlzIGhpZGRlbiBhbmQgbmVlZHMgdG8gYmUgdW5oaWRkZW46IFN1c3BlbnNlIGFuZFxuLy8gT2Zmc2NyZWVuIGNvbXBvbmVudC5cbi8vXG4vLyBNb3N0IHRoaW5ncyBpbiB0aGUgd29yayBsb29wIHNob3VsZCBkZWFsIHdpdGggd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMuXG4vLyBNb3N0IHRoaW5ncyBpbiBiZWdpbi9jb21wbGV0ZSBwaGFzZXMgc2hvdWxkIGRlYWwgd2l0aCBzdWJ0cmVlUmVuZGVyTGFuZXMuXG5cbnZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xudmFyIHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOb0xhbmVzKTsgLy8gV2hldGhlciB0byByb290IGNvbXBsZXRlZCwgZXJyb3JlZCwgc3VzcGVuZGVkLCBldGMuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7IC8vIEEgZmF0YWwgZXJyb3IsIGlmIG9uZSBpcyB0aHJvd25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsOyAvLyBcIkluY2x1ZGVkXCIgbGFuZXMgcmVmZXIgdG8gbGFuZXMgdGhhdCB3ZXJlIHdvcmtlZCBvbiBkdXJpbmcgdGhpcyByZW5kZXIuIEl0J3Ncbi8vIHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIGByZW5kZXJMYW5lc2AgYmVjYXVzZSBgcmVuZGVyTGFuZXNgIGNhbiBjaGFuZ2UgYXMgeW91XG4vLyBlbnRlciBhbmQgZXhpdCBhbiBPZmZzY3JlZW4gdHJlZS4gVGhpcyB2YWx1ZSBpcyB0aGUgY29tYmluYXRpb24gb2YgYWxsIHJlbmRlclxuLy8gbGFuZXMgZm9yIHRoZSBlbnRpcmUgcmVuZGVyIHBoYXNlLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrIGxlZnQgb3ZlciBieSBjb21wb25lbnRzIHRoYXQgd2VyZSB2aXNpdGVkIGR1cmluZyB0aGlzIHJlbmRlci4gT25seVxuLy8gaW5jbHVkZXMgdW5wcm9jZXNzZWQgdXBkYXRlcywgbm90IHdvcmsgaW4gYmFpbGVkIG91dCBjaGlsZHJlbi5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7IC8vIExhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIChpbiBhbiBpbnRlcmxlYXZlZCBldmVudCkgZHVyaW5nIHRoaXMgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSAoKm5vdCogYW4gaW50ZXJsZWF2ZWQgZXZlbnQpLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzOyAvLyBFcnJvcnMgdGhhdCBhcmUgdGhyb3duIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7IC8vIFRoZXNlIGFyZSBlcnJvcnMgdGhhdCB3ZSByZWNvdmVyZWQgZnJvbSB3aXRob3V0IHN1cmZhY2luZyB0aGVtIHRvIHRoZSBVSS5cbi8vIFdlIHdpbGwgbG9nIHRoZW0gb25jZSB0aGUgdHJlZSBjb21taXRzLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBudWxsOyAvLyBUaGUgbW9zdCByZWNlbnQgdGltZSB3ZSBjb21taXR0ZWQgYSBmYWxsYmFjay4gVGhpcyBsZXRzIHVzIGVuc3VyZSBhIHRyYWluXG4vLyBtb2RlbCB3aGVyZSB3ZSBkb24ndCBjb21taXQgbmV3IGxvYWRpbmcgc3RhdGVzIGluIHRvbyBxdWljayBzdWNjZXNzaW9uLlxuXG52YXIgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IDA7XG52YXIgRkFMTEJBQ0tfVEhST1RUTEVfTVMgPSA1MDA7IC8vIFRoZSBhYnNvbHV0ZSB0aW1lIGZvciB3aGVuIHdlIHNob3VsZCBzdGFydCBnaXZpbmcgdXAgb24gcmVuZGVyaW5nXG4vLyBtb3JlIGFuZCBwcmVmZXIgQ1BVIHN1c3BlbnNlIGhldXJpc3RpY3MgaW5zdGVhZC5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBJbmZpbml0eTsgLy8gSG93IGxvbmcgYSByZW5kZXIgaXMgc3VwcG9zZWQgdG8gdGFrZSBiZWZvcmUgd2Ugc3RhcnQgZm9sbG93aW5nIENQVVxuLy8gc3VzcGVuc2UgaGV1cmlzdGljcyBhbmQgb3B0IG91dCBvZiByZW5kZXJpbmcgbW9yZSBjb250ZW50LlxuXG52YXIgUkVOREVSX1RJTUVPVVRfTVMgPSA1MDA7XG52YXIgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlc2V0UmVuZGVyVGltZXIoKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBub3coKSArIFJFTkRFUl9USU1FT1VUX01TO1xufVxuXG5mdW5jdGlvbiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkge1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZTtcbn1cbnZhciBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG52YXIgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbnZhciBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7IC8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVByb2ZpbGVyTmVzdGVkVXBkYXRlU2NoZWR1bGVkSG9vayBpcyB0cnVlO1xudmFyIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcbnZhciBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cyA9IFtdO1xudmFyIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSBudWxsOyAvLyBVc2UgdGhlc2UgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIG9mIG5lc3RlZCB1cGRhdGVzXG5cbnZhciBORVNURURfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG52YXIgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCA9IDUwO1xudmFyIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG52YXIgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7IC8vIElmIHR3byB1cGRhdGVzIGFyZSBzY2hlZHVsZWQgd2l0aGluIHRoZSBzYW1lIGV2ZW50LCB3ZSBzaG91bGQgdHJlYXQgdGhlaXJcbi8vIGV2ZW50IHRpbWVzIGFzIHNpbXVsdGFuZW91cywgZXZlbiBpZiB0aGUgYWN0dWFsIGNsb2NrIHRpbWUgaGFzIGFkdmFuY2VkXG4vLyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGNhbGwuXG5cbnZhciBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG52YXIgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBOb0xhbmVzO1xudmFyIGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCkge1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290O1xufVxuZnVuY3Rpb24gcmVxdWVzdEV2ZW50VGltZSgpIHtcbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIC8vIFdlJ3JlIGluc2lkZSBSZWFjdCwgc28gaXQncyBmaW5lIHRvIHJlYWQgdGhlIGFjdHVhbCB0aW1lLlxuICAgIHJldHVybiBub3coKTtcbiAgfSAvLyBXZSdyZSBub3QgaW5zaWRlIFJlYWN0LCBzbyB3ZSBtYXkgYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGJyb3dzZXIgZXZlbnQuXG5cblxuICBpZiAoY3VycmVudEV2ZW50VGltZSAhPT0gTm9UaW1lc3RhbXApIHtcbiAgICAvLyBVc2UgdGhlIHNhbWUgc3RhcnQgdGltZSBmb3IgYWxsIHVwZGF0ZXMgdW50aWwgd2UgZW50ZXIgUmVhY3QgYWdhaW4uXG4gICAgcmV0dXJuIGN1cnJlbnRFdmVudFRpbWU7XG4gIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlIHNpbmNlIFJlYWN0IHlpZWxkZWQuIENvbXB1dGUgYSBuZXcgc3RhcnQgdGltZS5cblxuXG4gIGN1cnJlbnRFdmVudFRpbWUgPSBub3coKTtcbiAgcmV0dXJuIGN1cnJlbnRFdmVudFRpbWU7XG59XG5mdW5jdGlvbiByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcikge1xuICAvLyBTcGVjaWFsIGNhc2VzXG4gIHZhciBtb2RlID0gZmliZXIubW9kZTtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFRoZXNlIGFyZSBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQuIFRoZVxuICAgIC8vIG9sZCBiZWhhdmlvciBpcyB0byBnaXZlIHRoaXMgdGhlIHNhbWUgXCJ0aHJlYWRcIiAobGFuZXMpIGFzXG4gICAgLy8gd2hhdGV2ZXIgaXMgY3VycmVudGx5IHJlbmRlcmluZy4gU28gaWYgeW91IGNhbGwgYHNldFN0YXRlYCBvbiBhIGNvbXBvbmVudFxuICAgIC8vIHRoYXQgaGFwcGVucyBsYXRlciBpbiB0aGUgc2FtZSByZW5kZXIsIGl0IHdpbGwgZmx1c2guIElkZWFsbHksIHdlIHdhbnQgdG9cbiAgICAvLyByZW1vdmUgdGhlIHNwZWNpYWwgY2FzZSBhbmQgdHJlYXQgdGhlbSBhcyBpZiB0aGV5IGNhbWUgZnJvbSBhblxuICAgIC8vIGludGVybGVhdmVkIGV2ZW50LiBSZWdhcmRsZXNzLCB0aGlzIHBhdHRlcm4gaXMgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLlxuICAgIC8vIFRoaXMgYmVoYXZpb3IgaXMgb25seSBhIGZhbGxiYWNrLiBUaGUgZmxhZyBvbmx5IGV4aXN0cyB1bnRpbCB3ZSBjYW4gcm9sbFxuICAgIC8vIG91dCB0aGUgc2V0U3RhdGUgd2FybmluZywgc2luY2UgZXhpc3RpbmcgY29kZSBtaWdodCBhY2NpZGVudGFsbHkgcmVseSBvblxuICAgIC8vIHRoZSBjdXJyZW50IGJlaGF2aW9yLlxuICAgIHJldHVybiBwaWNrQXJiaXRyYXJ5TGFuZSh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaXNUcmFuc2l0aW9uID0gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkgIT09IE5vVHJhbnNpdGlvbjtcblxuICBpZiAoaXNUcmFuc2l0aW9uKSB7XG4gICAgaWYgKCBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gIT09IG51bGwpIHtcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gICAgICBpZiAoIXRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgICAgIH1cblxuICAgICAgdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5hZGQoZmliZXIpO1xuICAgIH0gLy8gVGhlIGFsZ29yaXRobSBmb3IgYXNzaWduaW5nIGFuIHVwZGF0ZSB0byBhIGxhbmUgc2hvdWxkIGJlIHN0YWJsZSBmb3IgYWxsXG4gICAgLy8gdXBkYXRlcyBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoaW4gdGhlIHNhbWUgZXZlbnQuIFRvIGRvIHRoaXMsIHRoZVxuICAgIC8vIGlucHV0cyB0byB0aGUgYWxnb3JpdGhtIG11c3QgYmUgdGhlIHNhbWUuXG4gICAgLy9cbiAgICAvLyBUaGUgdHJpY2sgd2UgdXNlIGlzIHRvIGNhY2hlIHRoZSBmaXJzdCBvZiBlYWNoIG9mIHRoZXNlIGlucHV0cyB3aXRoaW4gYW5cbiAgICAvLyBldmVudC4gVGhlbiByZXNldCB0aGUgY2FjaGVkIHZhbHVlcyBvbmNlIHdlIGNhbiBiZSBzdXJlIHRoZSBldmVudCBpc1xuICAgIC8vIG92ZXIuIE91ciBoZXVyaXN0aWMgZm9yIHRoYXQgaXMgd2hlbmV2ZXIgd2UgZW50ZXIgYSBjb25jdXJyZW50IHdvcmsgbG9vcC5cblxuXG4gICAgaWYgKGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID09PSBOb0xhbmUpIHtcbiAgICAgIC8vIEFsbCB0cmFuc2l0aW9ucyB3aXRoaW4gdGhlIHNhbWUgZXZlbnQgYXJlIGFzc2lnbmVkIHRoZSBzYW1lIGxhbmUuXG4gICAgICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lO1xuICB9IC8vIFVwZGF0ZXMgb3JpZ2luYXRpbmcgaW5zaWRlIGNlcnRhaW4gUmVhY3QgbWV0aG9kcywgbGlrZSBmbHVzaFN5bmMsIGhhdmVcbiAgLy8gdGhlaXIgcHJpb3JpdHkgc2V0IGJ5IHRyYWNraW5nIGl0IHdpdGggYSBjb250ZXh0IHZhcmlhYmxlLlxuICAvL1xuICAvLyBUaGUgb3BhcXVlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29uZmlnIGlzIGludGVybmFsbHkgYSBsYW5lLCBzbyB3ZSBjYW5cbiAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuXG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS5cblxuXG4gIHZhciB1cGRhdGVMYW5lID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgaWYgKHVwZGF0ZUxhbmUgIT09IE5vTGFuZSkge1xuICAgIHJldHVybiB1cGRhdGVMYW5lO1xuICB9IC8vIFRoaXMgdXBkYXRlIG9yaWdpbmF0ZWQgb3V0c2lkZSBSZWFjdC4gQXNrIHRoZSBob3N0IGVudmlyb25tZW50IGZvciBhblxuICAvLyBhcHByb3ByaWF0ZSBwcmlvcml0eSwgYmFzZWQgb24gdGhlIHR5cGUgb2YgZXZlbnQuXG4gIC8vXG4gIC8vIFRoZSBvcGFxdWUgdHlwZSByZXR1cm5lZCBieSB0aGUgaG9zdCBjb25maWcgaXMgaW50ZXJuYWxseSBhIGxhbmUsIHNvIHdlIGNhblxuICAvLyB1c2UgdGhhdCBkaXJlY3RseS5cbiAgLy8gVE9ETzogTW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiB0byB0aGUgZXZlbnQgcHJpb3JpdHkgbW9kdWxlLlxuXG5cbiAgdmFyIGV2ZW50TGFuZSA9IGdldEN1cnJlbnRFdmVudFByaW9yaXR5KCk7XG4gIHJldHVybiBldmVudExhbmU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RSZXRyeUxhbmUoZmliZXIpIHtcbiAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgYHJlcXVlc3RVcGRhdGVMYW5lYCBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIFN1c3BlbnNlXG4gIC8vIFwicmV0cmllc1wiIOKAlCBhIHNwZWNpYWwgdXBkYXRlIHRoYXQgYXR0ZW1wdHMgdG8gZmxpcCBhIFN1c3BlbnNlIGJvdW5kYXJ5XG4gIC8vIGZyb20gaXRzIHBsYWNlaG9sZGVyIHN0YXRlIHRvIGl0cyBwcmltYXJ5L3Jlc29sdmVkIHN0YXRlLlxuICAvLyBTcGVjaWFsIGNhc2VzXG4gIHZhciBtb2RlID0gZmliZXIubW9kZTtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfVxuXG4gIHJldHVybiBjbGFpbU5leHRSZXRyeUxhbmUoKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpIHtcbiAgY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCk7XG5cbiAge1xuICAgIGlmIChpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QpIHtcbiAgICAgIGVycm9yKCd1c2VJbnNlcnRpb25FZmZlY3QgbXVzdCBub3Qgc2NoZWR1bGUgdXBkYXRlcy4nKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cykge1xuICAgICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgfVxuICB9IC8vIE1hcmsgdGhhdCB0aGUgcm9vdCBoYXMgYSBwZW5kaW5nIHVwZGF0ZS5cblxuXG4gIG1hcmtSb290VXBkYXRlZChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0xhbmVzICYmIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFRoaXMgdXBkYXRlIHdhcyBkaXNwYXRjaGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzIGlzIGEgbWlzdGFrZVxuICAgIC8vIGlmIHRoZSB1cGRhdGUgb3JpZ2luYXRlcyBmcm9tIHVzZXIgc3BhY2UgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBsb2NhbFxuICAgIC8vIGhvb2sgdXBkYXRlcywgd2hpY2ggYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgYW5kIGRvbid0IHJlYWNoIHRoaXNcbiAgICAvLyBmdW5jdGlvbiksIGJ1dCB0aGVyZSBhcmUgc29tZSBpbnRlcm5hbCBSZWFjdCBmZWF0dXJlcyB0aGF0IHVzZSB0aGlzIGFzXG4gICAgLy8gYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCBsaWtlIHNlbGVjdGl2ZSBoeWRyYXRpb24uXG4gICAgd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpOyAvLyBUcmFjayBsYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSBub3JtYWwgdXBkYXRlLCBzY2hlZHVsZWQgZnJvbSBvdXRzaWRlIHRoZSByZW5kZXIgcGhhc2UuIEZvclxuICAgIC8vIGV4YW1wbGUsIGR1cmluZyBhbiBpbnB1dCBldmVudC5cbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpO1xuXG4gICAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgICAgLy8gUmVjZWl2ZWQgYW4gdXBkYXRlIHRvIGEgdHJlZSB0aGF0J3MgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJpbmcuIE1hcmtcbiAgICAgIC8vIHRoYXQgdGhlcmUgd2FzIGFuIGludGVybGVhdmVkIHVwZGF0ZSB3b3JrIG9uIHRoaXMgcm9vdC4gVW5sZXNzIHRoZVxuICAgICAgLy8gYGRlZmVyUmVuZGVyUGhhc2VVcGRhdGVUb05leHRCYXRjaGAgZmxhZyBpcyBvZmYgYW5kIHRoaXMgaXMgYSByZW5kZXJcbiAgICAgIC8vIHBoYXNlIHVwZGF0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB0cmVhdCByZW5kZXIgcGhhc2UgdXBkYXRlcyBhcyBpZlxuICAgICAgLy8gdGhleSB3ZXJlIGludGVybGVhdmVkLCBmb3IgYmFja3dhcmRzIGNvbXBhdCByZWFzb25zLlxuICAgICAgaWYgKCAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzLCBsYW5lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkpIHtcbiAgICAgICAgLy8gVGhlIHJvb3QgYWxyZWFkeSBzdXNwZW5kZWQgd2l0aCBhIGRlbGF5LCB3aGljaCBtZWFucyB0aGlzIHJlbmRlclxuICAgICAgICAvLyBkZWZpbml0ZWx5IHdvbid0IGZpbmlzaC4gU2luY2Ugd2UgaGF2ZSBhIG5ldyB1cGRhdGUsIGxldCdzIG1hcmsgaXQgYXNcbiAgICAgICAgLy8gc3VzcGVuZGVkIG5vdywgcmlnaHQgYmVmb3JlIG1hcmtpbmcgdGhlIGluY29taW5nIHVwZGF0ZS4gVGhpcyBoYXMgdGhlXG4gICAgICAgIC8vIGVmZmVjdCBvZiBpbnRlcnJ1cHRpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIGFuZCBzd2l0Y2hpbmcgdG8gdGhlIHVwZGF0ZS5cbiAgICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBvdmVycmlkZSBwaW5ncyB0aGF0IGhhcHBlbiB3aGlsZSB3ZSd2ZVxuICAgICAgICAvLyBhbHJlYWR5IHN0YXJ0ZWQgcmVuZGVyaW5nLlxuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcblxuICAgIGlmIChsYW5lID09PSBTeW5jTGFuZSAmJiBleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQgJiYgKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAvLyBUcmVhdCBgYWN0YCBhcyBpZiBpdCdzIGluc2lkZSBgYmF0Y2hlZFVwZGF0ZXNgLCBldmVuIGluIGxlZ2FjeSBtb2RlLlxuICAgICEoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuaXNCYXRjaGluZ0xlZ2FjeSkpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBzeW5jaHJvbm91cyB3b3JrIG5vdywgdW5sZXNzIHdlJ3JlIGFscmVhZHkgd29ya2luZyBvciBpbnNpZGVcbiAgICAgIC8vIGEgYmF0Y2guIFRoaXMgaXMgaW50ZW50aW9uYWxseSBpbnNpZGUgc2NoZWR1bGVVcGRhdGVPbkZpYmVyIGluc3RlYWQgb2ZcbiAgICAgIC8vIHNjaGVkdWxlQ2FsbGJhY2tGb3JGaWJlciB0byBwcmVzZXJ2ZSB0aGUgYWJpbGl0eSB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAvLyB3aXRob3V0IGltbWVkaWF0ZWx5IGZsdXNoaW5nIGl0LiBXZSBvbmx5IGRvIHRoaXMgZm9yIHVzZXItaW5pdGlhdGVkXG4gICAgICAvLyB1cGRhdGVzLCB0byBwcmVzZXJ2ZSBoaXN0b3JpY2FsIGJlaGF2aW9yIG9mIGxlZ2FjeSBtb2RlLlxuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVJbml0aWFsSHlkcmF0aW9uT25Sb290KHJvb3QsIGxhbmUsIGV2ZW50VGltZSkge1xuICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBmb3JrIG9mIHNjaGVkdWxlVXBkYXRlT25GaWJlciB0aGF0IGlzIG9ubHkgdXNlZCB0b1xuICAvLyBzY2hlZHVsZSB0aGUgaW5pdGlhbCBoeWRyYXRpb24gb2YgYSByb290IHRoYXQgaGFzIGp1c3QgYmVlbiBjcmVhdGVkLiBNb3N0XG4gIC8vIG9mIHRoZSBzdHVmZiBpbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgY2FuIGJlIHNraXBwZWQuXG4gIC8vXG4gIC8vIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBzZXBhcmF0ZSBwYXRoLCB0aG91Z2gsIGlzIHRvIGRpc3Rpbmd1aXNoIHRoZVxuICAvLyBpbml0aWFsIGNoaWxkcmVuIGZyb20gc3Vic2VxdWVudCB1cGRhdGVzLiBJbiBmdWxseSBjbGllbnQtcmVuZGVyZWQgcm9vdHNcbiAgLy8gKGNyZWF0ZVJvb3QgaW5zdGVhZCBvZiBoeWRyYXRlUm9vdCksIGFsbCB0b3AtbGV2ZWwgcmVuZGVycyBhcmUgbW9kZWxlZCBhc1xuICAvLyB1cGRhdGVzLCBidXQgaHlkcmF0aW9uIHJvb3RzIGFyZSBzcGVjaWFsIGJlY2F1c2UgdGhlIGluaXRpYWwgcmVuZGVyIG11c3RcbiAgLy8gbWF0Y2ggd2hhdCB3YXMgcmVuZGVyZWQgb24gdGhlIHNlcnZlci5cbiAgdmFyIGN1cnJlbnQgPSByb290LmN1cnJlbnQ7XG4gIGN1cnJlbnQubGFuZXMgPSBsYW5lO1xuICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG59XG5mdW5jdGlvbiBpc1Vuc2FmZUNsYXNzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpIHtcbiAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIE9ubHkgY2FsbGVkIGJ5IGNsYXNzIGNvbXBvbmVudHMsXG4gIC8vIHdoaWNoIHNwZWNpYWwgKGRlcHJlY2F0ZWQpIGJlaGF2aW9yIGZvciBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmUgcHJvcHMuXG4gIHJldHVybiAoLy8gVE9ETzogUmVtb3ZlIG91dGRhdGVkIGRlZmVyUmVuZGVyUGhhc2VVcGRhdGVUb05leHRCYXRjaCBleHBlcmltZW50LiBXZVxuICAgIC8vIGRlY2lkZWQgbm90IHRvIGVuYWJsZSBpdC5cbiAgICAgKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0XG4gICk7XG59IC8vIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNjaGVkdWxlIGEgdGFzayBmb3IgYSByb290LiBUaGVyZSdzIG9ubHkgb25lIHRhc2sgcGVyXG4vLyByb290OyBpZiBhIHRhc2sgd2FzIGFscmVhZHkgc2NoZWR1bGVkLCB3ZSdsbCBjaGVjayB0byBtYWtlIHN1cmUgdGhlIHByaW9yaXR5XG4vLyBvZiB0aGUgZXhpc3RpbmcgdGFzayBpcyB0aGUgc2FtZSBhcyB0aGUgcHJpb3JpdHkgb2YgdGhlIG5leHQgbGV2ZWwgdGhhdCB0aGVcbi8vIHJvb3QgaGFzIHdvcmsgb24uIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGV2ZXJ5IHVwZGF0ZSwgYW5kIHJpZ2h0IGJlZm9yZVxuLy8gZXhpdGluZyBhIHRhc2suXG5cbmZ1bmN0aW9uIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBjdXJyZW50VGltZSkge1xuICB2YXIgZXhpc3RpbmdDYWxsYmFja05vZGUgPSByb290LmNhbGxiYWNrTm9kZTsgLy8gQ2hlY2sgaWYgYW55IGxhbmVzIGFyZSBiZWluZyBzdGFydmVkIGJ5IG90aGVyIHdvcmsuIElmIHNvLCBtYXJrIHRoZW0gYXNcbiAgLy8gZXhwaXJlZCBzbyB3ZSBrbm93IHRvIHdvcmsgb24gdGhvc2UgbmV4dC5cblxuICBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKTsgLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGxhbmVzIHRvIHdvcmsgb24sIGFuZCB0aGVpciBwcmlvcml0eS5cblxuICB2YXIgbmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzIDogTm9MYW5lcyk7XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogVGhlcmUncyBub3RoaW5nIHRvIHdvcmsgb24uXG4gICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxDYWxsYmFjayQxKGV4aXN0aW5nQ2FsbGJhY2tOb2RlKTtcbiAgICB9XG5cbiAgICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gICAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lO1xuICAgIHJldHVybjtcbiAgfSAvLyBXZSB1c2UgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgbGFuZSB0byByZXByZXNlbnQgdGhlIHByaW9yaXR5IG9mIHRoZSBjYWxsYmFjay5cblxuXG4gIHZhciBuZXdDYWxsYmFja1ByaW9yaXR5ID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShuZXh0TGFuZXMpOyAvLyBDaGVjayBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIHRhc2suIFdlIG1heSBiZSBhYmxlIHRvIHJldXNlIGl0LlxuXG4gIHZhciBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPSByb290LmNhbGxiYWNrUHJpb3JpdHk7XG5cbiAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tQcmlvcml0eSA9PT0gbmV3Q2FsbGJhY2tQcmlvcml0eSAmJiAvLyBTcGVjaWFsIGNhc2UgcmVsYXRlZCB0byBgYWN0YC4gSWYgdGhlIGN1cnJlbnRseSBzY2hlZHVsZWQgdGFzayBpcyBhXG4gIC8vIFNjaGVkdWxlciB0YXNrLCByYXRoZXIgdGhhbiBhbiBgYWN0YCB0YXNrLCBjYW5jZWwgaXQgYW5kIHJlLXNjaGVkdWxlZFxuICAvLyBvbiB0aGUgYGFjdGAgcXVldWUuXG4gICEoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gZmFrZUFjdENhbGxiYWNrTm9kZSkpIHtcbiAgICB7XG4gICAgICAvLyBJZiB3ZSdyZSBnb2luZyB0byByZS11c2UgYW4gZXhpc3RpbmcgdGFzaywgaXQgbmVlZHMgdG8gZXhpc3QuXG4gICAgICAvLyBBc3N1bWUgdGhhdCBkaXNjcmV0ZSB1cGRhdGUgbWljcm90YXNrcyBhcmUgbm9uLWNhbmNlbGxhYmxlIGFuZCBudWxsLlxuICAgICAgLy8gVE9ETzogVGVtcG9yYXJ5IHVudGlsIHdlIGNvbmZpcm0gdGhpcyB3YXJuaW5nIGlzIG5vdCBmaXJlZC5cbiAgICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSA9PSBudWxsICYmIGV4aXN0aW5nQ2FsbGJhY2tQcmlvcml0eSAhPT0gU3luY0xhbmUpIHtcbiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHNjaGVkdWxlZCBjYWxsYmFjayB0byBleGlzdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFRoZSBwcmlvcml0eSBoYXNuJ3QgY2hhbmdlZC4gV2UgY2FuIHJldXNlIHRoZSBleGlzdGluZyB0YXNrLiBFeGl0LlxuXG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgIT0gbnVsbCkge1xuICAgIC8vIENhbmNlbCB0aGUgZXhpc3RpbmcgY2FsbGJhY2suIFdlJ2xsIHNjaGVkdWxlIGEgbmV3IG9uZSBiZWxvdy5cbiAgICBjYW5jZWxDYWxsYmFjayQxKGV4aXN0aW5nQ2FsbGJhY2tOb2RlKTtcbiAgfSAvLyBTY2hlZHVsZSBhIG5ldyBjYWxsYmFjay5cblxuXG4gIHZhciBuZXdDYWxsYmFja05vZGU7XG5cbiAgaWYgKG5ld0NhbGxiYWNrUHJpb3JpdHkgPT09IFN5bmNMYW5lKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBTeW5jIFJlYWN0IGNhbGxiYWNrcyBhcmUgc2NoZWR1bGVkIG9uIGEgc3BlY2lhbFxuICAgIC8vIGludGVybmFsIHF1ZXVlXG4gICAgaWYgKHJvb3QudGFnID09PSBMZWdhY3lSb290KSB7XG4gICAgICBpZiAoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuaXNCYXRjaGluZ0xlZ2FjeSAhPT0gbnVsbCkge1xuICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGVMZWdhY3lTeW5jQ2FsbGJhY2socGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlZHVsZVN5bmNDYWxsYmFjayhwZXJmb3JtU3luY1dvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gRmx1c2ggdGhlIHF1ZXVlIGluIGEgbWljcm90YXNrLlxuICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSW5zaWRlIGBhY3RgLCB1c2Ugb3VyIGludGVybmFsIGBhY3RgIHF1ZXVlIHNvIHRoYXQgdGhlc2UgZ2V0IGZsdXNoZWRcbiAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzY29wZSBldmVuIHdoZW4gdXNpbmcgdGhlIHN5bmMgdmVyc2lvblxuICAgICAgICAvLyBvZiBgYWN0YC5cbiAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50LnB1c2goZmx1c2hTeW5jQ2FsbGJhY2tzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVkdWxlTWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBJbiBTYWZhcmksIGFwcGVuZGluZyBhbiBpZnJhbWUgZm9yY2VzIG1pY3JvdGFza3MgdG8gcnVuLlxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjI0NTlcbiAgICAgICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHJ1bm5pbmcgY2FsbGJhY2tzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyXG4gICAgICAgICAgLy8gb3IgY29tbWl0IHNvIHdlIG5lZWQgdG8gY2hlY2sgYWdhaW5zdCB0aGF0LlxuICAgICAgICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdvdWxkIHN0aWxsIHByZW1hdHVyZWx5IGZsdXNoIHRoZSBjYWxsYmFja3NcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaGFwcGVucyBvdXRzaWRlIHJlbmRlciBvciBjb21taXQgcGhhc2UgKGUuZy4gaW4gYW4gZXZlbnQpLlxuICAgICAgICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXdDYWxsYmFja05vZGUgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eUxldmVsO1xuXG4gICAgc3dpdGNoIChsYW5lc1RvRXZlbnRQcmlvcml0eShuZXh0TGFuZXMpKSB7XG4gICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IEltbWVkaWF0ZVByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IElkbGVQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbmV3Q2FsbGJhY2tOb2RlID0gc2NoZWR1bGVDYWxsYmFjayQxKHNjaGVkdWxlclByaW9yaXR5TGV2ZWwsIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfVxuXG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IG5ld0NhbGxiYWNrUHJpb3JpdHk7XG4gIHJvb3QuY2FsbGJhY2tOb2RlID0gbmV3Q2FsbGJhY2tOb2RlO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgZXZlcnkgY29uY3VycmVudCB0YXNrLCBpLmUuIGFueXRoaW5nIHRoYXRcbi8vIGdvZXMgdGhyb3VnaCBTY2hlZHVsZXIuXG5cblxuZnVuY3Rpb24gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KHJvb3QsIGRpZFRpbWVvdXQpIHtcbiAge1xuICAgIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpO1xuICB9IC8vIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gYSBSZWFjdCBldmVudCwgd2UgY2FuIGNsZWFyIHRoZSBjdXJyZW50XG4gIC8vIGV2ZW50IHRpbWUuIFRoZSBuZXh0IHVwZGF0ZSB3aWxsIGNvbXB1dGUgYSBuZXcgZXZlbnQgdGltZS5cblxuXG4gIGN1cnJlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcbiAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBOb0xhbmVzO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9IC8vIEZsdXNoIGFueSBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBiZWZvcmUgZGVjaWRpbmcgd2hpY2ggbGFuZXMgdG8gd29yayBvbixcbiAgLy8gaW4gY2FzZSB0aGV5IHNjaGVkdWxlIGFkZGl0aW9uYWwgd29yay5cblxuXG4gIHZhciBvcmlnaW5hbENhbGxiYWNrTm9kZSA9IHJvb3QuY2FsbGJhY2tOb2RlO1xuICB2YXIgZGlkRmx1c2hQYXNzaXZlRWZmZWN0cyA9IGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcblxuICBpZiAoZGlkRmx1c2hQYXNzaXZlRWZmZWN0cykge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGUgcGFzc2l2ZSBlZmZlY3QgcGhhc2UgbWF5IGhhdmUgY2FuY2VsZWQgdGhlIGN1cnJlbnQgdGFzay5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFzayBub2RlIGZvciB0aGlzIHJvb3Qgd2FzIGNoYW5nZWQuXG4gICAgaWYgKHJvb3QuY2FsbGJhY2tOb2RlICE9PSBvcmlnaW5hbENhbGxiYWNrTm9kZSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgdGFzayB3YXMgY2FuY2VsZWQuIEV4aXQuIFdlIGRvbid0IG5lZWQgdG8gY2FsbFxuICAgICAgLy8gYGVuc3VyZVJvb3RJc1NjaGVkdWxlZGAgYmVjYXVzZSB0aGUgY2hlY2sgYWJvdmUgaW1wbGllcyBlaXRoZXIgdGhhdFxuICAgICAgLy8gdGhlcmUncyBhIG5ldyB0YXNrLCBvciB0aGF0IHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290LlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCB1c2luZyB0aGUgZmllbGRzIHN0b3JlZFxuICAvLyBvbiB0aGUgcm9vdC5cblxuXG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcuIFRoaXMgaXMgbmV2ZXIgZXhwZWN0ZWQgdG8gaGFwcGVuLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFdlIGRpc2FibGUgdGltZS1zbGljaW5nIGluIHNvbWUgY2FzZXM6IGlmIHRoZSB3b3JrIGhhcyBiZWVuIENQVS1ib3VuZFxuICAvLyBmb3IgdG9vIGxvbmcgKFwiZXhwaXJlZFwiIHdvcmssIHRvIHByZXZlbnQgc3RhcnZhdGlvbiksIG9yIHdlJ3JlIGluXG4gIC8vIHN5bmMtdXBkYXRlcy1ieS1kZWZhdWx0IG1vZGUuXG4gIC8vIFRPRE86IFdlIG9ubHkgY2hlY2sgYGRpZFRpbWVvdXRgIGRlZmVuc2l2ZWx5LCB0byBhY2NvdW50IGZvciBhIFNjaGVkdWxlclxuICAvLyBidWcgd2UncmUgc3RpbGwgaW52ZXN0aWdhdGluZy4gT25jZSB0aGUgYnVnIGluIFNjaGVkdWxlciBpcyBmaXhlZCxcbiAgLy8gd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSB0cmFjayBleHBpcmF0aW9uIG91cnNlbHZlcy5cblxuXG4gIHZhciBzaG91bGRUaW1lU2xpY2UgPSAhaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpICYmICFpbmNsdWRlc0V4cGlyZWRMYW5lKHJvb3QsIGxhbmVzKSAmJiAoICFkaWRUaW1lb3V0KTtcbiAgdmFyIGV4aXRTdGF0dXMgPSBzaG91bGRUaW1lU2xpY2UgPyByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykgOiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG5cbiAgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGxcbiAgICAgIC8vIHJlbmRlciBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbFxuICAgICAgLy8gaW5jbHVkZXMgYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyXG4gICAgICAvLyB0aGUgc2Vjb25kIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG4gICAgICB2YXIgZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICAgIGlmIChlcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbGFuZXMgPSBlcnJvclJldHJ5TGFuZXM7XG4gICAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgICB2YXIgZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICAgIHRocm93IGZhdGFsRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3REaWROb3RDb21wbGV0ZSkge1xuICAgICAgLy8gVGhlIHJlbmRlciB1bndvdW5kIHdpdGhvdXQgY29tcGxldGluZyB0aGUgdHJlZS4gVGhpcyBoYXBwZW5zIGluIHNwZWNpYWxcbiAgICAgIC8vIGNhc2VzIHdoZXJlIG5lZWQgdG8gZXhpdCB0aGUgY3VycmVudCByZW5kZXIgd2l0aG91dCBwcm9kdWNpbmcgYVxuICAgICAgLy8gY29uc2lzdGVudCB0cmVlIG9yIGNvbW1pdHRpbmcuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gZHVyaW5nIGEgY29uY3VycmVudCByZW5kZXIsIG5vdCBhIGRpc2NyZXRlIG9yXG4gICAgICAvLyBzeW5jaHJvbm91cyB1cGRhdGUuIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgY2hlY2tlZCBmb3IgdGhpcyB3aGVuIHdlXG4gICAgICAvLyB1bndvdW5kIHRoZSBzdGFjay5cbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmVuZGVyIGNvbXBsZXRlZC5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmVuZGVyIG1heSBoYXZlIHlpZWxkZWQgdG8gYSBjb25jdXJyZW50IGV2ZW50LCBhbmQgaWYgc28sXG4gICAgICAvLyBjb25maXJtIHRoYXQgYW55IG5ld2x5IHJlbmRlcmVkIHN0b3JlcyBhcmUgY29uc2lzdGVudC5cbiAgICAgIC8vIFRPRE86IEl0J3MgcG9zc2libGUgdGhhdCBldmVuIGEgY29uY3VycmVudCByZW5kZXIgbWF5IG5ldmVyIGhhdmUgeWllbGRlZFxuICAgICAgLy8gdG8gdGhlIG1haW4gdGhyZWFkLCBpZiBpdCB3YXMgZmFzdCBlbm91Z2gsIG9yIGlmIGl0IGV4cGlyZWQuIFdlIGNvdWxkXG4gICAgICAvLyBza2lwIHRoZSBjb25zaXN0ZW5jeSBjaGVjayBpbiB0aGF0IGNhc2UsIHRvby5cbiAgICAgIHZhciByZW5kZXJXYXNDb25jdXJyZW50ID0gIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKTtcbiAgICAgIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAocmVuZGVyV2FzQ29uY3VycmVudCAmJiAhaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKGZpbmlzaGVkV29yaykpIHtcbiAgICAgICAgLy8gQSBzdG9yZSB3YXMgbXV0YXRlZCBpbiBhbiBpbnRlcmxlYXZlZCBldmVudC4gUmVuZGVyIGFnYWluLFxuICAgICAgICAvLyBzeW5jaHJvbm91c2x5LCB0byBibG9jayBmdXJ0aGVyIG11dGF0aW9ucy5cbiAgICAgICAgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTsgLy8gV2UgbmVlZCB0byBjaGVjayBhZ2FpbiBpZiBzb21ldGhpbmcgdGhyZXdcblxuICAgICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAgICAgICB2YXIgX2Vycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgICAgICAgaWYgKF9lcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgICAgIGxhbmVzID0gX2Vycm9yUmV0cnlMYW5lcztcbiAgICAgICAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBfZXJyb3JSZXRyeUxhbmVzKTsgLy8gV2UgYXNzdW1lIHRoZSB0cmVlIGlzIG5vdyBjb25zaXN0ZW50IGJlY2F1c2Ugd2UgZGlkbid0IHlpZWxkIHRvIGFueVxuICAgICAgICAgICAgLy8gY29uY3VycmVudCBldmVudHMuXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgICAgICB2YXIgX2ZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgICAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgICAgICAgdGhyb3cgX2ZhdGFsRXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIFRoZSBuZXh0IHN0ZXAgaXMgZWl0aGVyIHRvIGNvbW1pdCBpdCxcbiAgICAgIC8vIG9yLCBpZiBzb21ldGhpbmcgc3VzcGVuZGVkLCB3YWl0IHRvIGNvbW1pdCBpdCBhZnRlciBhIHRpbWVvdXQuXG5cblxuICAgICAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gICAgICByb290LmZpbmlzaGVkTGFuZXMgPSBsYW5lcztcbiAgICAgIGZpbmlzaENvbmN1cnJlbnRSZW5kZXIocm9vdCwgZXhpdFN0YXR1cywgbGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKHJvb3QuY2FsbGJhY2tOb2RlID09PSBvcmlnaW5hbENhbGxiYWNrTm9kZSkge1xuICAgIC8vIFRoZSB0YXNrIG5vZGUgc2NoZWR1bGVkIGZvciB0aGlzIHJvb3QgaXMgdGhlIHNhbWUgb25lIHRoYXQnc1xuICAgIC8vIGN1cnJlbnRseSBleGVjdXRlZC4gTmVlZCB0byByZXR1cm4gYSBjb250aW51YXRpb24uXG4gICAgcmV0dXJuIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcykge1xuICAvLyBJZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaHlkcmF0aW9uLCBkaXNjYXJkIHNlcnZlciByZXNwb25zZSBhbmQgZmFsbFxuICAvLyBiYWNrIHRvIGNsaWVudCBzaWRlIHJlbmRlci5cbiAgLy8gQmVmb3JlIHJlbmRlcmluZyBhZ2Fpbiwgc2F2ZSB0aGUgZXJyb3JzIGZyb20gdGhlIHByZXZpb3VzIGF0dGVtcHQuXG4gIHZhciBlcnJvcnNGcm9tRmlyc3RBdHRlbXB0ID0gd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycztcblxuICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgIC8vIFRoZSBzaGVsbCBmYWlsZWQgdG8gaHlkcmF0ZS4gU2V0IGEgZmxhZyB0byBmb3JjZSBhIGNsaWVudCByZW5kZXJpbmdcbiAgICAvLyBkdXJpbmcgdGhlIG5leHQgYXR0ZW1wdC4gVG8gZG8gdGhpcywgd2UgY2FsbCBwcmVwYXJlRnJlc2hTdGFjayBub3dcbiAgICAvLyB0byBjcmVhdGUgdGhlIHJvb3Qgd29yay1pbi1wcm9ncmVzcyBmaWJlci4gVGhpcyBpcyBhIGJpdCB3ZWlyZCBpbiB0ZXJtc1xuICAgIC8vIG9mIGZhY3RvcmluZywgYmVjYXVzZSBpdCByZWxpZXMgb24gcmVuZGVyUm9vdFN5bmMgbm90IGNhbGxpbmdcbiAgICAvLyBwcmVwYXJlRnJlc2hTdGFjayBhZ2FpbiBpbiB0aGUgY2FsbCBiZWxvdywgd2hpY2ggaGFwcGVucyBiZWNhdXNlIHRoZVxuICAgIC8vIHJvb3QgYW5kIGxhbmVzIGhhdmVuJ3QgY2hhbmdlZC5cbiAgICAvL1xuICAgIC8vIFRPRE86IEkgdGhpbmsgd2hhdCB3ZSBzaG91bGQgZG8gaXMgc2V0IEZvcmNlQ2xpZW50UmVuZGVyIGluc2lkZVxuICAgIC8vIHRocm93RXhjZXB0aW9uLCBsaWtlIHdlIGRvIGZvciBuZXN0ZWQgU3VzcGVuc2UgYm91bmRhcmllcy4gVGhlIHJlYXNvblxuICAgIC8vIGl0J3MgaGVyZSBpbnN0ZWFkIGlzIHNvIHdlIGNhbiBzd2l0Y2ggdG8gdGhlIHN5bmNocm9ub3VzIHdvcmsgbG9vcCwgdG9vLlxuICAgIC8vIFNvbWV0aGluZyB0byBjb25zaWRlciBmb3IgYSBmdXR1cmUgcmVmYWN0b3IuXG4gICAgdmFyIHJvb3RXb3JrSW5Qcm9ncmVzcyA9IHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgcm9vdFdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuXG4gICAge1xuICAgICAgZXJyb3JIeWRyYXRpbmdDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG5cbiAgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RFcnJvcmVkKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIHJlbmRlcmluZyBvbiByZXRyeVxuICAgIC8vIFRoZSBlcnJvcnMgZnJvbSB0aGUgZmFpbGVkIGZpcnN0IGF0dGVtcHQgaGF2ZSBiZWVuIHJlY292ZXJlZC4gQWRkXG4gICAgLy8gdGhlbSB0byB0aGUgY29sbGVjdGlvbiBvZiByZWNvdmVyYWJsZSBlcnJvcnMuIFdlJ2xsIGxvZyB0aGVtIGluIHRoZVxuICAgIC8vIGNvbW1pdCBwaGFzZS5cbiAgICB2YXIgZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycztcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGVycm9yc0Zyb21GaXJzdEF0dGVtcHQ7IC8vIFRoZSBlcnJvcnMgZnJvbSB0aGUgc2Vjb25kIGF0dGVtcHQgc2hvdWxkIGJlIHF1ZXVlZCBhZnRlciB0aGUgZXJyb3JzXG4gICAgLy8gZnJvbSB0aGUgZmlyc3QgYXR0ZW1wdCwgdG8gcHJlc2VydmUgdGhlIGNhdXNhbCBzZXF1ZW5jZS5cblxuICAgIGlmIChlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCAhPT0gbnVsbCkge1xuICAgICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXRTdGF0dXM7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoZXJyb3JzKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gZXJyb3JzO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLnB1c2guYXBwbHkod29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIGVycm9ycyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcykge1xuICBzd2l0Y2ggKGV4aXRTdGF0dXMpIHtcbiAgICBjYXNlIFJvb3RJblByb2dyZXNzOlxuICAgIGNhc2UgUm9vdEZhdGFsRXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb290IGRpZCBub3QgY29tcGxldGUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgLy8gRmxvdyBrbm93cyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWlucyBpZiBJIGFkZCBhIGJyZWFrXG4gICAgLy8gc3RhdGVtZW50LCBidXQgZXNsaW50IGRvZXNuJ3Qga25vdyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWluc1xuICAgIC8vIGlmIEkgZG8uIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBSb290RXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBhdHRlbXB0ZWQgdG8gcmV0cnkgdGhpcyB0cmVlLiBJZiB3ZSByZWFjaGVkXG4gICAgICAgIC8vIHRoaXMgcG9pbnQsIGl0IGVycm9yZWQgYWdhaW4uIENvbW1pdCBpdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290U3VzcGVuZGVkOlxuICAgICAge1xuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTsgLy8gV2UgaGF2ZSBhbiBhY2NlcHRhYmxlIGxvYWRpbmcgc3RhdGUuIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB3ZVxuICAgICAgICAvLyBzaG91bGQgaW1tZWRpYXRlbHkgY29tbWl0IGl0IG9yIHdhaXQgYSBiaXQuXG5cbiAgICAgICAgaWYgKGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpICYmIC8vIGRvIG5vdCBkZWxheSBpZiB3ZSdyZSBpbnNpZGUgYW4gYWN0KCkgc2NvcGVcbiAgICAgICAgIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyByZW5kZXIgb25seSBpbmNsdWRlZCByZXRyaWVzLCBubyB1cGRhdGVzLiBUaHJvdHRsZSBjb21taXR0aW5nXG4gICAgICAgICAgLy8gcmV0cmllcyBzbyB0aGF0IHdlIGRvbid0IHNob3cgdG9vIG1hbnkgbG9hZGluZyBzdGF0ZXMgdG9vIHF1aWNrbHkuXG4gICAgICAgICAgdmFyIG1zVW50aWxUaW1lb3V0ID0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSArIEZBTExCQUNLX1RIUk9UVExFX01TIC0gbm93KCk7IC8vIERvbid0IGJvdGhlciB3aXRoIGEgdmVyeSBzaG9ydCBzdXNwZW5zZSB0aW1lLlxuXG4gICAgICAgICAgaWYgKG1zVW50aWxUaW1lb3V0ID4gMTApIHtcbiAgICAgICAgICAgIHZhciBuZXh0TGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgTm9MYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChuZXh0TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgICAgICAgLy8gVGhlcmUncyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290LlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcblxuICAgICAgICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMoc3VzcGVuZGVkTGFuZXMsIGxhbmVzKSkge1xuICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgcHJlZmVyIHRvIHJlbmRlciB0aGUgZmFsbGJhY2sgb2YgYXQgdGhlIGxhc3RcbiAgICAgICAgICAgICAgLy8gc3VzcGVuZGVkIGxldmVsLiBQaW5nIHRoZSBsYXN0IHN1c3BlbmRlZCBsZXZlbCB0byB0cnlcbiAgICAgICAgICAgICAgLy8gcmVuZGVyaW5nIGl0IGFnYWluLlxuICAgICAgICAgICAgICAvLyBGSVhNRTogV2hhdCBpZiB0aGUgc3VzcGVuZGVkIGxhbmVzIGFyZSBJZGxlPyBTaG91bGQgbm90IHJlc3RhcnQuXG4gICAgICAgICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICAgICAgICAgIG1hcmtSb290UGluZ2VkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IC8vIFRoZSByZW5kZXIgaXMgc3VzcGVuZGVkLCBpdCBoYXNuJ3QgdGltZWQgb3V0LCBhbmQgdGhlcmUncyBub1xuICAgICAgICAgICAgLy8gbG93ZXIgcHJpb3JpdHkgd29yayB0byBkby4gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFja1xuICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHksIHdhaXQgZm9yIG1vcmUgZGF0YSB0byBhcnJpdmUuXG5cblxuICAgICAgICAgICAgcm9vdC50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KGNvbW1pdFJvb3QuYmluZChudWxsLCByb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyksIG1zVW50aWxUaW1lb3V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBUaGUgd29yayBleHBpcmVkLiBDb21taXQgaW1tZWRpYXRlbHkuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgdHJhbnNpdGlvbiwgc28gd2Ugc2hvdWxkIGV4aXQgd2l0aG91dCBjb21taXR0aW5nIGFcbiAgICAgICAgICAvLyBwbGFjZWhvbGRlciBhbmQgd2l0aG91dCBzY2hlZHVsaW5nIGEgdGltZW91dC4gRGVsYXkgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgLy8gdW50aWwgd2UgcmVjZWl2ZSBtb3JlIGRhdGEuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB0cmFuc2l0aW9uLCBidXQgd2UgZGlkIHRyaWdnZXIgYW4gYXZvaWRlZCBzdGF0ZS5cbiAgICAgICAgICAvLyBTY2hlZHVsZSBhIHBsYWNlaG9sZGVyIHRvIGRpc3BsYXkgYWZ0ZXIgYSBzaG9ydCBkZWxheSwgdXNpbmcgdGhlIEp1c3RcbiAgICAgICAgICAvLyBOb3RpY2VhYmxlIERpZmZlcmVuY2UuXG4gICAgICAgICAgLy8gVE9ETzogSXMgdGhlIEpORCBvcHRpbWl6YXRpb24gd29ydGggdGhlIGFkZGVkIGNvbXBsZXhpdHk/IElmIHRoaXMgaXNcbiAgICAgICAgICAvLyB0aGUgb25seSByZWFzb24gd2UgdHJhY2sgdGhlIGV2ZW50IHRpbWUsIHRoZW4gcHJvYmFibHkgbm90LlxuICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nLlxuICAgICAgICAgIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcyk7XG4gICAgICAgICAgdmFyIGV2ZW50VGltZU1zID0gbW9zdFJlY2VudEV2ZW50VGltZTtcbiAgICAgICAgICB2YXIgdGltZUVsYXBzZWRNcyA9IG5vdygpIC0gZXZlbnRUaW1lTXM7XG5cbiAgICAgICAgICB2YXIgX21zVW50aWxUaW1lb3V0ID0gam5kKHRpbWVFbGFwc2VkTXMpIC0gdGltZUVsYXBzZWRNczsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cblxuICAgICAgICAgIGlmIChfbXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFjayBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICAgICAgICAvLyB0byBhcnJpdmUuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKSwgX21zVW50aWxUaW1lb3V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBDb21taXQgdGhlIHBsYWNlaG9sZGVyLlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290Q29tcGxldGVkOlxuICAgICAge1xuICAgICAgICAvLyBUaGUgd29yayBjb21wbGV0ZWQuIFJlYWR5IHRvIGNvbW1pdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHJvb3QgZXhpdCBzdGF0dXMuJyk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKGZpbmlzaGVkV29yaykge1xuICAvLyBTZWFyY2ggdGhlIHJlbmRlcmVkIHRyZWUgZm9yIGV4dGVybmFsIHN0b3JlIHJlYWRzLCBhbmQgY2hlY2sgd2hldGhlciB0aGVcbiAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZCBpbiBhIGNvbmN1cnJlbnQgZXZlbnQuIEludGVudGlvbmFsbHkgdXNpbmcgYW4gaXRlcmF0aXZlXG4gIC8vIGxvb3AgaW5zdGVhZCBvZiByZWN1cnNpb24gc28gd2UgY2FuIGV4aXQgZWFybHkuXG4gIHZhciBub2RlID0gZmluaXNoZWRXb3JrO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG5vZGUuZmxhZ3MgJiBTdG9yZUNvbnNpc3RlbmN5KSB7XG4gICAgICB2YXIgdXBkYXRlUXVldWUgPSBub2RlLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGNoZWNrcyA9IHVwZGF0ZVF1ZXVlLnN0b3JlcztcblxuICAgICAgICBpZiAoY2hlY2tzICE9PSBudWxsKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGVjayA9IGNoZWNrc1tpXTtcbiAgICAgICAgICAgIHZhciBnZXRTbmFwc2hvdCA9IGNoZWNrLmdldFNuYXBzaG90O1xuICAgICAgICAgICAgdmFyIHJlbmRlcmVkVmFsdWUgPSBjaGVjay52YWx1ZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCFvYmplY3RJcyhnZXRTbmFwc2hvdCgpLCByZW5kZXJlZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIGFuIGluY29uc2lzdGVudCBzdG9yZS5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIElmIGBnZXRTbmFwc2hvdGAgdGhyb3dzLCByZXR1cm4gYGZhbHNlYC4gVGhpcyB3aWxsIHNjaGVkdWxlXG4gICAgICAgICAgICAgIC8vIGEgcmUtcmVuZGVyLCBhbmQgdGhlIGVycm9yIHdpbGwgYmUgcmV0aHJvd24gZHVyaW5nIHJlbmRlci5cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAobm9kZS5zdWJ0cmVlRmxhZ3MgJiBTdG9yZUNvbnNpc3RlbmN5ICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IGNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfSAvLyBGbG93IGRvZXNuJ3Qga25vdyB0aGlzIGlzIHVucmVhY2hhYmxlLCBidXQgZXNsaW50IGRvZXNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICAvLyBXaGVuIHN1c3BlbmRpbmcsIHdlIHNob3VsZCBhbHdheXMgZXhjbHVkZSBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIG9yIChtb3JlXG4gIC8vIHJhcmVseSwgc2luY2Ugd2UgdHJ5IHRvIGF2b2lkIGl0KSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAvLyBUT0RPOiBMb2wgbWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gZmFjdG9yIHRoaXMgYmVzaWRlcyB0aGlzXG4gIC8vIG9ibm94aW91c2x5IG5hbWVkIGZ1bmN0aW9uIDopXG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzKTtcbiAgc3VzcGVuZGVkTGFuZXMgPSByZW1vdmVMYW5lcyhzdXNwZW5kZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMpO1xuICBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcyk7XG59IC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBzeW5jaHJvbm91cyB0YXNrcyB0aGF0IGRvbid0IGdvXG4vLyB0aHJvdWdoIFNjaGVkdWxlclxuXG5cbmZ1bmN0aW9uIHBlcmZvcm1TeW5jV29ya09uUm9vdChyb290KSB7XG4gIHtcbiAgICBzeW5jTmVzdGVkVXBkYXRlRmxhZygpO1xuICB9XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH1cblxuICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICBpZiAoIWluY2x1ZGVzU29tZUxhbmUobGFuZXMsIFN5bmNMYW5lKSkge1xuICAgIC8vIFRoZXJlJ3Mgbm8gcmVtYWluaW5nIHN5bmMgd29yayBsZWZ0LlxuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcblxuICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGwgcmVuZGVyXG4gICAgLy8gc3luY2hyb25vdXNseSB0byBibG9jayBjb25jdXJyZW50IGRhdGEgbXV0YXRpb25zLCBhbmQgd2UnbGwgaW5jbHVkZXNcbiAgICAvLyBhbGwgcGVuZGluZyB1cGRhdGVzIGFyZSBpbmNsdWRlZC4gSWYgaXQgc3RpbGwgZmFpbHMgYWZ0ZXIgdGhlIHNlY29uZFxuICAgIC8vIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG4gICAgdmFyIGVycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgaWYgKGVycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbGFuZXMgPSBlcnJvclJldHJ5TGFuZXM7XG4gICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHRocm93IGZhdGFsRXJyb3I7XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdERpZE5vdENvbXBsZXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSb290IGRpZCBub3QgY29tcGxldGUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIEJlY2F1c2UgdGhpcyBpcyBhIHN5bmMgcmVuZGVyLCB3ZVxuICAvLyB3aWxsIGNvbW1pdCBpdCBldmVuIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQuXG5cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTsgLy8gQmVmb3JlIGV4aXRpbmcsIG1ha2Ugc3VyZSB0aGVyZSdzIGEgY2FsbGJhY2sgc2NoZWR1bGVkIGZvciB0aGUgbmV4dFxuICAvLyBwZW5kaW5nIGxldmVsLlxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmbHVzaFJvb3Qocm9vdCwgbGFuZXMpIHtcbiAgaWYgKGxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbWVyZ2VMYW5lcyhsYW5lcywgU3luY0xhbmUpKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBiYXRjaGVkVXBkYXRlcyQxKGZuLCBhKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oYSk7XG4gIH0gZmluYWxseSB7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBJZiB0aGVyZSB3ZXJlIGxlZ2FjeSBzeW5jIHVwZGF0ZXMsIGZsdXNoIHRoZW0gYXQgdGhlIGVuZCBvZiB0aGUgb3V0ZXJcbiAgICAvLyBtb3N0IGJhdGNoZWRVcGRhdGVzLWxpa2UgbWV0aG9kLlxuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCAmJiAvLyBUcmVhdCBgYWN0YCBhcyBpZiBpdCdzIGluc2lkZSBgYmF0Y2hlZFVwZGF0ZXNgLCBldmVuIGluIGxlZ2FjeSBtb2RlLlxuICAgICEoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuaXNCYXRjaGluZ0xlZ2FjeSkpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpc2NyZXRlVXBkYXRlcyhmbiwgYSwgYiwgYywgZCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIHJldHVybiBmbihhLCBiLCBjLCBkKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0KSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgfVxuICB9XG59IC8vIE92ZXJsb2FkIHRoZSBkZWZpbml0aW9uIHRvIHRoZSB0d28gdmFsaWQgc2lnbmF0dXJlcy5cbi8vIFdhcm5pbmcsIHRoaXMgb3B0cy1vdXQgb2YgY2hlY2tpbmcgdGhlIGZ1bmN0aW9uIGJvZHkuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmZ1bmN0aW9uIGZsdXNoU3luYyhmbikge1xuICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgZmx1c2ggcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgLy8gbmV4dCBldmVudCwgbm90IGF0IHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIG9uZS5cbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsICYmIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzLnRhZyA9PT0gTGVnYWN5Um9vdCAmJiAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH1cblxuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuXG4gICAgaWYgKGZuKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gRmx1c2ggdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAvLyBOb3RlIHRoYXQgdGhpcyB3aWxsIGhhcHBlbiBldmVuIGlmIGJhdGNoZWRVcGRhdGVzIGlzIGhpZ2hlciB1cFxuICAgIC8vIHRoZSBzdGFjay5cblxuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gaXNBbHJlYWR5UmVuZGVyaW5nKCkge1xuICAvLyBVc2VkIGJ5IHRoZSByZW5kZXJlciB0byBwcmludCBhIHdhcm5pbmcgaWYgY2VydGFpbiBBUElzIGFyZSBjYWxsZWQgZnJvbVxuICAvLyB0aGUgd3JvbmcgY29udGV4dC5cbiAgcmV0dXJuICAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoUmVuZGVyTGFuZXMoZmliZXIsIGxhbmVzKSB7XG4gIHB1c2goc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLCBzdWJ0cmVlUmVuZGVyTGFuZXMsIGZpYmVyKTtcbiAgc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhzdWJ0cmVlUmVuZGVyTGFuZXMsIGxhbmVzKTtcbiAgd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcywgbGFuZXMpO1xufVxuZnVuY3Rpb24gcG9wUmVuZGVyTGFuZXMoZmliZXIpIHtcbiAgc3VidHJlZVJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLmN1cnJlbnQ7XG4gIHBvcChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpIHtcbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBudWxsO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgdGltZW91dEhhbmRsZSA9IHJvb3QudGltZW91dEhhbmRsZTtcblxuICBpZiAodGltZW91dEhhbmRsZSAhPT0gbm9UaW1lb3V0KSB7XG4gICAgLy8gVGhlIHJvb3QgcHJldmlvdXMgc3VzcGVuZGVkIGFuZCBzY2hlZHVsZWQgYSB0aW1lb3V0IHRvIGNvbW1pdCBhIGZhbGxiYWNrXG4gICAgLy8gc3RhdGUuIE5vdyB0aGF0IHdlIGhhdmUgYWRkaXRpb25hbCB3b3JrLCBjYW5jZWwgdGhlIHRpbWVvdXQuXG4gICAgcm9vdC50aW1lb3V0SGFuZGxlID0gbm9UaW1lb3V0OyAvLyAkRmxvd0ZpeE1lIENvbXBsYWlucyBub1RpbWVvdXQgaXMgbm90IGEgVGltZW91dElELCBkZXNwaXRlIHRoZSBjaGVjayBhYm92ZVxuXG4gICAgY2FuY2VsVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIHZhciBpbnRlcnJ1cHRlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgICB3aGlsZSAoaW50ZXJydXB0ZWRXb3JrICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGludGVycnVwdGVkV29yay5hbHRlcm5hdGU7XG4gICAgICB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGludGVycnVwdGVkV29yayA9IGludGVycnVwdGVkV29yay5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgdmFyIHJvb3RXb3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKHJvb3QuY3VycmVudCwgbnVsbCk7XG4gIHdvcmtJblByb2dyZXNzID0gcm9vdFdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IHN1YnRyZWVSZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBsYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IG51bGw7XG4gIGZpbmlzaFF1ZXVlaW5nQ29uY3VycmVudFVwZGF0ZXMoKTtcblxuICB7XG4gICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZGlzY2FyZFBlbmRpbmdXYXJuaW5ncygpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3RXb3JrSW5Qcm9ncmVzcztcbn1cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpIHtcbiAgZG8ge1xuICAgIHZhciBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc2V0IG1vZHVsZS1sZXZlbCBzdGF0ZSB0aGF0IHdhcyBzZXQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIHJlc2V0SG9va3NBZnRlclRocm93KCk7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpOyAvLyBUT0RPOiBJIGZvdW5kIGFuZCBhZGRlZCB0aGlzIG1pc3NpbmcgbGluZSB3aGlsZSBpbnZlc3RpZ2F0aW5nIGFcbiAgICAgIC8vIHNlcGFyYXRlIGlzc3VlLiBXcml0ZSBhIHJlZ3Jlc3Npb24gdGVzdCB1c2luZyBzdHJpbmcgcmVmcy5cblxuICAgICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcblxuICAgICAgaWYgKGVycm9yZWRXb3JrID09PSBudWxsIHx8IGVycm9yZWRXb3JrLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBFeHBlY3RlZCB0byBiZSB3b3JraW5nIG9uIGEgbm9uLXJvb3QgZmliZXIuIFRoaXMgaXMgYSBmYXRhbCBlcnJvclxuICAgICAgICAvLyBiZWNhdXNlIHRoZXJlJ3Mgbm8gYW5jZXN0b3IgdGhhdCBjYW4gaGFuZGxlIGl0OyB0aGUgcm9vdCBpc1xuICAgICAgICAvLyBzdXBwb3NlZCB0byBjYXB0dXJlIGFsbCBlcnJvcnMgdGhhdCB3ZXJlbid0IGNhdWdodCBieSBhbiBlcnJvclxuICAgICAgICAvLyBib3VuZGFyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RGYXRhbEVycm9yZWQ7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSB0aHJvd25WYWx1ZTsgLy8gU2V0IGB3b3JrSW5Qcm9ncmVzc2AgdG8gbnVsbC4gVGhpcyByZXByZXNlbnRzIGFkdmFuY2luZyB0byB0aGUgbmV4dFxuICAgICAgICAvLyBzaWJsaW5nLCBvciB0aGUgcGFyZW50IGlmIHRoZXJlIGFyZSBubyBzaWJsaW5ncy4gQnV0IHNpbmNlIHRoZSByb290XG4gICAgICAgIC8vIGhhcyBubyBzaWJsaW5ncyBub3IgYSBwYXJlbnQsIHdlIHNldCBpdCB0byBudWxsLiBVc3VhbGx5IHRoaXMgaXNcbiAgICAgICAgLy8gaGFuZGxlZCBieSBgY29tcGxldGVVbml0T2ZXb3JrYCBvciBgdW53aW5kV29ya2AsIGJ1dCBzaW5jZSB3ZSdyZVxuICAgICAgICAvLyBpbnRlbnRpb25hbGx5IG5vdCBjYWxsaW5nIHRob3NlLCB3ZSBuZWVkIHNldCBpdCBoZXJlLlxuICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBjYWxsaW5nIGB1bndpbmRXb3JrYCB0byBwb3AgdGhlIGNvbnRleHRzLlxuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlcnJvcmVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSB0aW1lIHNwZW50IHJlbmRlcmluZyBiZWZvcmUgYW4gZXJyb3Igd2FzIHRocm93bi4gVGhpc1xuICAgICAgICAvLyBhdm9pZHMgaW5hY2N1cmF0ZSBQcm9maWxlciBkdXJhdGlvbnMgaW4gdGhlIGNhc2Ugb2YgYVxuICAgICAgICAvLyBzdXNwZW5kZWQgcmVuZGVyLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGVycm9yZWRXb3JrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlcikge1xuICAgICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuXG4gICAgICAgIGlmICh0aHJvd25WYWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhyb3duVmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0aHJvd25WYWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIHdha2VhYmxlID0gdGhyb3duVmFsdWU7XG4gICAgICAgICAgbWFya0NvbXBvbmVudFN1c3BlbmRlZChlcnJvcmVkV29yaywgd2FrZWFibGUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXJrQ29tcG9uZW50RXJyb3JlZChlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvd0V4Y2VwdGlvbihyb290LCBlcnJvcmVkV29yay5yZXR1cm4sIGVycm9yZWRXb3JrLCB0aHJvd25WYWx1ZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgY29tcGxldGVVbml0T2ZXb3JrKGVycm9yZWRXb3JrKTtcbiAgICB9IGNhdGNoICh5ZXRBbm90aGVyVGhyb3duVmFsdWUpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBpbiB0aGUgcmV0dXJuIHBhdGggYWxzbyB0aHJldy5cbiAgICAgIHRocm93blZhbHVlID0geWV0QW5vdGhlclRocm93blZhbHVlO1xuXG4gICAgICBpZiAod29ya0luUHJvZ3Jlc3MgPT09IGVycm9yZWRXb3JrICYmIGVycm9yZWRXb3JrICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIHRoaXMgYm91bmRhcnkgaGFzIGFscmVhZHkgZXJyb3JlZCwgdGhlbiB3ZSBoYWQgdHJvdWJsZSBwcm9jZXNzaW5nXG4gICAgICAgIC8vIHRoZSBlcnJvci4gQnViYmxlIGl0IHRvIHRoZSBuZXh0IGJvdW5kYXJ5LlxuICAgICAgICBlcnJvcmVkV29yayA9IGVycm9yZWRXb3JrLnJldHVybjtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBlcnJvcmVkV29yaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yZWRXb3JrID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gUmV0dXJuIHRvIHRoZSBub3JtYWwgd29yayBsb29wLlxuXG5cbiAgICByZXR1cm47XG4gIH0gd2hpbGUgKHRydWUpO1xufVxuXG5mdW5jdGlvbiBwdXNoRGlzcGF0Y2hlcigpIHtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQ7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIGlmIChwcmV2RGlzcGF0Y2hlciA9PT0gbnVsbCkge1xuICAgIC8vIFRoZSBSZWFjdCBpc29tb3JwaGljIHBhY2thZ2UgZG9lcyBub3QgaW5jbHVkZSBhIGRlZmF1bHQgZGlzcGF0Y2hlci5cbiAgICAvLyBJbnN0ZWFkIHRoZSBmaXJzdCByZW5kZXJlciB3aWxsIGxhemlseSBhdHRhY2ggb25lLCBpbiBvcmRlciB0byBnaXZlXG4gICAgLy8gbmljZXIgZXJyb3IgbWVzc2FnZXMuXG4gICAgcmV0dXJuIENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcHJldkRpc3BhdGNoZXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcikge1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xufVxuXG5mdW5jdGlvbiBtYXJrQ29tbWl0VGltZU9mRmFsbGJhY2soKSB7XG4gIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSBub3coKTtcbn1cbmZ1bmN0aW9uIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobGFuZSkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBtZXJnZUxhbmVzKGxhbmUsIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyk7XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdFN1c3BlbmRlZDtcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzIHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWQgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheTtcbiAgfSAvLyBDaGVjayBpZiB0aGVyZSBhcmUgdXBkYXRlcyB0aGF0IHdlIHNraXBwZWQgdHJlZSB0aGF0IG1pZ2h0IGhhdmUgdW5ibG9ja2VkXG4gIC8vIHRoaXMgcmVuZGVyLlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gbnVsbCAmJiAoaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMpIHx8IGluY2x1ZGVzTm9uSWRsZVdvcmsod29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMpKSkge1xuICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgcmVuZGVyIGFzIHN1c3BlbmRlZCBzbyB0aGF0IHdlIHN3aXRjaCB0byB3b3JraW5nIG9uXG4gICAgLy8gdGhlIHVwZGF0ZXMgdGhhdCB3ZXJlIHNraXBwZWQuIFVzdWFsbHkgd2Ugb25seSBzdXNwZW5kIGF0IHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIC8vIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBhbHdheXMgbWFyayB0aGUgcm9vdCBhcyBzdXNwZW5kZWQgaW1tZWRpYXRlbHlcbiAgICAvLyAoaW5zaWRlIHRoaXMgZnVuY3Rpb24pLCBzaW5jZSBieSBzdXNwZW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHJlbmRlclxuICAgIC8vIHBoYXNlIGludHJvZHVjZXMgYSBwb3RlbnRpYWwgbWlzdGFrZSB3aGVyZSB3ZSBzdXNwZW5kIGxhbmVzIHRoYXQgd2VyZVxuICAgIC8vIHBpbmdlZCBvciB1cGRhdGVkIHdoaWxlIHdlIHdlcmUgcmVuZGVyaW5nLlxuICAgIG1hcmtSb290U3VzcGVuZGVkJDEod29ya0luUHJvZ3Jlc3NSb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZEVycm9yKGVycm9yKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzICE9PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RFcnJvcmVkO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gW2Vycm9yXTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzLnB1c2goZXJyb3IpO1xuICB9XG59IC8vIENhbGxlZCBkdXJpbmcgcmVuZGVyIHRvIGRldGVybWluZSBpZiBhbnl0aGluZyBoYXMgc3VzcGVuZGVkLlxuLy8gUmV0dXJucyBmYWxzZSBpZiB3ZSdyZSBub3Qgc3VyZS5cblxuZnVuY3Rpb24gcmVuZGVySGFzTm90U3VzcGVuZGVkWWV0KCkge1xuICAvLyBJZiBzb21ldGhpbmcgZXJyb3JlZCBvciBjb21wbGV0ZWQsIHdlIGNhbid0IHJlYWxseSBiZSBzdXJlLFxuICAvLyBzbyB0aG9zZSBhcmUgZmFsc2UuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcztcbn1cblxuZnVuY3Rpb24gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBSZW5kZXJDb250ZXh0O1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBwdXNoRGlzcGF0Y2hlcigpOyAvLyBJZiB0aGUgcm9vdCBvciBsYW5lcyBoYXZlIGNoYW5nZWQsIHRocm93IG91dCB0aGUgZXhpc3Rpbmcgc3RhY2tcbiAgLy8gYW5kIHByZXBhcmUgYSBmcmVzaCBvbmUuIE90aGVyd2lzZSB3ZSdsbCBjb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZi5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcykge1xuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICAgICAgICBpZiAobWVtb2l6ZWRVcGRhdGVycy5zaXplID4gMCkge1xuICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICAgICAgfSAvLyBBdCB0aGlzIHBvaW50LCBtb3ZlIEZpYmVycyB0aGF0IHNjaGVkdWxlZCB0aGUgdXBjb21pbmcgd29yayBmcm9tIHRoZSBNYXAgdG8gdGhlIFNldC5cbiAgICAgICAgLy8gSWYgd2UgYmFpbG91dCBvbiB0aGlzIHdvcmssIHdlJ2xsIG1vdmUgdGhlbSBiYWNrIChsaWtlIGFib3ZlKS5cbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gbW92ZSB0aGVtIG5vdyBpbiBjYXNlIHRoZSB3b3JrIHNwYXducyBtb3JlIHdvcmsgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aCBkaWZmZXJlbnQgdXBkYXRlcnMuXG4gICAgICAgIC8vIFRoYXQgd2F5IHdlIGNhbiBrZWVwIHRoZSBjdXJyZW50IHVwZGF0ZSBhbmQgZnV0dXJlIHVwZGF0ZXMgc2VwYXJhdGUuXG5cblxuICAgICAgICBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGRvIHtcbiAgICB0cnkge1xuICAgICAgd29ya0xvb3BTeW5jKCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoICh0aHJvd25WYWx1ZSkge1xuICAgICAgaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpO1xuICAgIH1cbiAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcbiAgcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcik7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyBhIHN5bmMgcmVuZGVyLCBzbyB3ZSBzaG91bGQgaGF2ZSBmaW5pc2hlZCB0aGUgd2hvbGUgdHJlZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb21taXQgYW4gaW5jb21wbGV0ZSByb290LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSAnICsgJ2J1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBTZXQgdGhpcyB0byBudWxsIHRvIGluZGljYXRlIHRoZXJlJ3Mgbm8gaW4tcHJvZ3Jlc3MgcmVuZGVyLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbn0gLy8gVGhlIHdvcmsgbG9vcCBpcyBhbiBleHRyZW1lbHkgaG90IHBhdGguIFRlbGwgQ2xvc3VyZSBub3QgdG8gaW5saW5lIGl0LlxuXG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BTeW5jKCkge1xuICAvLyBBbHJlYWR5IHRpbWVkIG91dCwgc28gcGVyZm9ybSB3b3JrIHdpdGhvdXQgY2hlY2tpbmcgaWYgd2UgbmVlZCB0byB5aWVsZC5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgICAgIH0gLy8gQXQgdGhpcyBwb2ludCwgbW92ZSBGaWJlcnMgdGhhdCBzY2hlZHVsZWQgdGhlIHVwY29taW5nIHdvcmsgZnJvbSB0aGUgTWFwIHRvIHRoZSBTZXQuXG4gICAgICAgIC8vIElmIHdlIGJhaWxvdXQgb24gdGhpcyB3b3JrLCB3ZSdsbCBtb3ZlIHRoZW0gYmFjayAobGlrZSBhYm92ZSkuXG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIG1vdmUgdGhlbSBub3cgaW4gY2FzZSB0aGUgd29yayBzcGF3bnMgbW9yZSB3b3JrIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGggZGlmZmVyZW50IHVwZGF0ZXJzLlxuICAgICAgICAvLyBUaGF0IHdheSB3ZSBjYW4ga2VlcCB0aGUgY3VycmVudCB1cGRhdGUgYW5kIGZ1dHVyZSB1cGRhdGVzIHNlcGFyYXRlLlxuXG5cbiAgICAgICAgbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcygpO1xuICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcENvbmN1cnJlbnQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcik7XG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFN0aWxsIHdvcmsgcmVtYWluaW5nLlxuICAgIHtcbiAgICAgIG1hcmtSZW5kZXJZaWVsZGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJvb3RJblByb2dyZXNzO1xuICB9IGVsc2Uge1xuICAgIC8vIENvbXBsZXRlZCB0aGUgdHJlZS5cbiAgICB7XG4gICAgICBtYXJrUmVuZGVyU3RvcHBlZCgpO1xuICAgIH0gLy8gU2V0IHRoaXMgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGVyZSdzIG5vIGluLXByb2dyZXNzIHJlbmRlci5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFJldHVybiB0aGUgZmluYWwgZXhpdCBzdGF0dXMuXG5cbiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbiAgfVxufVxuLyoqIEBub2lubGluZSAqL1xuXG5cbmZ1bmN0aW9uIHdvcmtMb29wQ29uY3VycmVudCgpIHtcbiAgLy8gUGVyZm9ybSB3b3JrIHVudGlsIFNjaGVkdWxlciBhc2tzIHVzIHRvIHlpZWxkXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCAmJiAhc2hvdWxkWWllbGQoKSkge1xuICAgIHBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwZXJmb3JtVW5pdE9mV29yayh1bml0T2ZXb3JrKSB7XG4gIC8vIFRoZSBjdXJyZW50LCBmbHVzaGVkLCBzdGF0ZSBvZiB0aGlzIGZpYmVyIGlzIHRoZSBhbHRlcm5hdGUuIElkZWFsbHlcbiAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgLy8gbmVlZCBhbiBhZGRpdGlvbmFsIGZpZWxkIG9uIHRoZSB3b3JrIGluIHByb2dyZXNzLlxuICB2YXIgY3VycmVudCA9IHVuaXRPZldvcmsuYWx0ZXJuYXRlO1xuICBzZXRDdXJyZW50RmliZXIodW5pdE9mV29yayk7XG4gIHZhciBuZXh0O1xuXG4gIGlmICggKHVuaXRPZldvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgc3RhcnRQcm9maWxlclRpbWVyKHVuaXRPZldvcmspO1xuICAgIG5leHQgPSBiZWdpbldvcmskMShjdXJyZW50LCB1bml0T2ZXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEodW5pdE9mV29yaywgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB1bml0T2ZXb3JrLm1lbW9pemVkUHJvcHMgPSB1bml0T2ZXb3JrLnBlbmRpbmdQcm9wcztcblxuICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgIC8vIElmIHRoaXMgZG9lc24ndCBzcGF3biBuZXcgd29yaywgY29tcGxldGUgdGhlIGN1cnJlbnQgd29yay5cbiAgICBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yayk7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MgPSBuZXh0O1xuICB9XG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gQXR0ZW1wdCB0byBjb21wbGV0ZSB0aGUgY3VycmVudCB1bml0IG9mIHdvcmssIHRoZW4gbW92ZSB0byB0aGUgbmV4dFxuICAvLyBzaWJsaW5nLiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBzaWJsaW5ncywgcmV0dXJuIHRvIHRoZSBwYXJlbnQgZmliZXIuXG4gIHZhciBjb21wbGV0ZWRXb3JrID0gdW5pdE9mV29yaztcblxuICBkbyB7XG4gICAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAgIC8vIG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZSBtZWFucyB0aGF0IHdlIGRvbid0XG4gICAgLy8gbmVlZCBhbiBhZGRpdGlvbmFsIGZpZWxkIG9uIHRoZSB3b3JrIGluIHByb2dyZXNzLlxuICAgIHZhciBjdXJyZW50ID0gY29tcGxldGVkV29yay5hbHRlcm5hdGU7XG4gICAgdmFyIHJldHVybkZpYmVyID0gY29tcGxldGVkV29yay5yZXR1cm47IC8vIENoZWNrIGlmIHRoZSB3b3JrIGNvbXBsZXRlZCBvciBpZiBzb21ldGhpbmcgdGhyZXcuXG5cbiAgICBpZiAoKGNvbXBsZXRlZFdvcmsuZmxhZ3MgJiBJbmNvbXBsZXRlKSA9PT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgdmFyIG5leHQgPSB2b2lkIDA7XG5cbiAgICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgIG5leHQgPSBjb21wbGV0ZVdvcmsoY3VycmVudCwgY29tcGxldGVkV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcihjb21wbGV0ZWRXb3JrKTtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpOyAvLyBVcGRhdGUgcmVuZGVyIGR1cmF0aW9uIGFzc3VtaW5nIHdlIGRpZG4ndCBlcnJvci5cblxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGNvbXBsZXRlZFdvcmssIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcblxuICAgICAgaWYgKG5leHQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ29tcGxldGluZyB0aGlzIGZpYmVyIHNwYXduZWQgbmV3IHdvcmsuIFdvcmsgb24gdGhhdCBuZXh0LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBmaWJlciBkaWQgbm90IGNvbXBsZXRlIGJlY2F1c2Ugc29tZXRoaW5nIHRocmV3LiBQb3AgdmFsdWVzIG9mZlxuICAgICAgLy8gdGhlIHN0YWNrIHdpdGhvdXQgZW50ZXJpbmcgdGhlIGNvbXBsZXRlIHBoYXNlLiBJZiB0aGlzIGlzIGEgYm91bmRhcnksXG4gICAgICAvLyBjYXB0dXJlIHZhbHVlcyBpZiBwb3NzaWJsZS5cbiAgICAgIHZhciBfbmV4dCA9IHVud2luZFdvcmsoY3VycmVudCwgY29tcGxldGVkV29yayk7IC8vIEJlY2F1c2UgdGhpcyBmaWJlciBkaWQgbm90IGNvbXBsZXRlLCBkb24ndCByZXNldCBpdHMgbGFuZXMuXG5cblxuICAgICAgaWYgKF9uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIGNvbXBsZXRpbmcgdGhpcyB3b3JrIHNwYXduZWQgbmV3IHdvcmssIGRvIHRoYXQgbmV4dC4gV2UnbGwgY29tZVxuICAgICAgICAvLyBiYWNrIGhlcmUgYWdhaW4uXG4gICAgICAgIC8vIFNpbmNlIHdlJ3JlIHJlc3RhcnRpbmcsIHJlbW92ZSBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIGhvc3QgZWZmZWN0XG4gICAgICAgIC8vIGZyb20gdGhlIGVmZmVjdCB0YWcuXG4gICAgICAgIF9uZXh0LmZsYWdzICY9IEhvc3RFZmZlY3RNYXNrO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IF9uZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgcmVuZGVyIGR1cmF0aW9uIGZvciB0aGUgZmliZXIgdGhhdCBlcnJvcmVkLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGNvbXBsZXRlZFdvcmssIGZhbHNlKTsgLy8gSW5jbHVkZSB0aGUgdGltZSBzcGVudCB3b3JraW5nIG9uIGZhaWxlZCBjaGlsZHJlbiBiZWZvcmUgY29udGludWluZy5cblxuICAgICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIE1hcmsgdGhlIHBhcmVudCBmaWJlciBhcyBpbmNvbXBsZXRlIGFuZCBjbGVhciBpdHMgc3VidHJlZSBmbGFncy5cbiAgICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gSW5jb21wbGV0ZTtcbiAgICAgICAgcmV0dXJuRmliZXIuc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdlJ3ZlIHVud291bmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3QuXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RGlkTm90Q29tcGxldGU7XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzaWJsaW5nRmliZXIgPSBjb21wbGV0ZWRXb3JrLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZ0ZpYmVyICE9PSBudWxsKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIHdvcmsgdG8gZG8gaW4gdGhpcyByZXR1cm5GaWJlciwgZG8gdGhhdCBuZXh0LlxuICAgICAgd29ya0luUHJvZ3Jlc3MgPSBzaWJsaW5nRmliZXI7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBPdGhlcndpc2UsIHJldHVybiB0byB0aGUgcGFyZW50XG5cblxuICAgIGNvbXBsZXRlZFdvcmsgPSByZXR1cm5GaWJlcjsgLy8gVXBkYXRlIHRoZSBuZXh0IHRoaW5nIHdlJ3JlIHdvcmtpbmcgb24gaW4gY2FzZSBzb21ldGhpbmcgdGhyb3dzLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjb21wbGV0ZWRXb3JrO1xuICB9IHdoaWxlIChjb21wbGV0ZWRXb3JrICE9PSBudWxsKTsgLy8gV2UndmUgcmVhY2hlZCB0aGUgcm9vdC5cblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcykge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290Q29tcGxldGVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJvb3Qocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zKSB7XG4gIC8vIFRPRE86IFRoaXMgbm8gbG9uZ2VyIG1ha2VzIGFueSBzZW5zZS4gV2UgYWxyZWFkeSB3cmFwIHRoZSBtdXRhdGlvbiBhbmRcbiAgLy8gbGF5b3V0IHBoYXNlcy4gU2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlLlxuICB2YXIgcHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICBjb21taXRSb290SW1wbChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMsIHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJvb3RJbXBsKHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucywgcmVuZGVyUHJpb3JpdHlMZXZlbCkge1xuICBkbyB7XG4gICAgLy8gYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIHdpbGwgY2FsbCBgZmx1c2hTeW5jVXBkYXRlUXVldWVgIGF0IHRoZSBlbmQsIHdoaWNoXG4gICAgLy8gbWVhbnMgYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIHdpbGwgc29tZXRpbWVzIHJlc3VsdCBpbiBhZGRpdGlvbmFsXG4gICAgLy8gcGFzc2l2ZSBlZmZlY3RzLiBTbyB3ZSBuZWVkIHRvIGtlZXAgZmx1c2hpbmcgaW4gYSBsb29wIHVudGlsIHRoZXJlIGFyZVxuICAgIC8vIG5vIG1vcmUgcGVuZGluZyBlZmZlY3RzLlxuICAgIC8vIFRPRE86IE1pZ2h0IGJlIGJldHRlciBpZiBgZmx1c2hQYXNzaXZlRWZmZWN0c2AgZGlkIG5vdCBhdXRvbWF0aWNhbGx5XG4gICAgLy8gZmx1c2ggc3luY2hyb25vdXMgd29yayBhdCB0aGUgZW5kLCB0byBhdm9pZCBmYWN0b3JpbmcgaGF6YXJkcyBsaWtlIHRoaXMuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9IHdoaWxlIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCk7XG5cbiAgZmx1c2hSZW5kZXJQaGFzZVN0cmljdE1vZGVXYXJuaW5nc0luREVWKCk7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH1cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7XG4gIHZhciBsYW5lcyA9IHJvb3QuZmluaXNoZWRMYW5lcztcblxuICB7XG4gICAgbWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgaWYgKGZpbmlzaGVkV29yayA9PT0gbnVsbCkge1xuXG4gICAge1xuICAgICAgbWFya0NvbW1pdFN0b3BwZWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBpZiAobGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAgICAgZXJyb3IoJ3Jvb3QuZmluaXNoZWRMYW5lcyBzaG91bGQgbm90IGJlIGVtcHR5IGR1cmluZyBhIGNvbW1pdC4gVGhpcyBpcyBhICcgKyAnYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcblxuICBpZiAoZmluaXNoZWRXb3JrID09PSByb290LmN1cnJlbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb21taXQgdGhlIHNhbWUgdHJlZSBhcyBiZWZvcmUuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSAnICsgJ2EgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfSAvLyBjb21taXRSb290IG5ldmVyIHJldHVybnMgYSBjb250aW51YXRpb247IGl0IGFsd2F5cyBmaW5pc2hlcyBzeW5jaHJvbm91c2x5LlxuICAvLyBTbyB3ZSBjYW4gY2xlYXIgdGhlc2Ugbm93IHRvIGFsbG93IGEgbmV3IGNhbGxiYWNrIHRvIGJlIHNjaGVkdWxlZC5cblxuXG4gIHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lOyAvLyBVcGRhdGUgdGhlIGZpcnN0IGFuZCBsYXN0IHBlbmRpbmcgdGltZXMgb24gdGhpcyByb290LiBUaGUgbmV3IGZpcnN0XG4gIC8vIHBlbmRpbmcgdGltZSBpcyB3aGF0ZXZlciBpcyBsZWZ0IG9uIHRoZSByb290IGZpYmVyLlxuXG4gIHZhciByZW1haW5pbmdMYW5lcyA9IG1lcmdlTGFuZXMoZmluaXNoZWRXb3JrLmxhbmVzLCBmaW5pc2hlZFdvcmsuY2hpbGRMYW5lcyk7XG4gIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpO1xuXG4gIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBXZSBjYW4gcmVzZXQgdGhlc2Ugbm93IHRoYXQgdGhleSBhcmUgZmluaXNoZWQuXG4gICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICB9IC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cywgc2NoZWR1bGUgYSBjYWxsYmFjayB0byBwcm9jZXNzIHRoZW0uXG4gIC8vIERvIHRoaXMgYXMgZWFybHkgYXMgcG9zc2libGUsIHNvIGl0IGlzIHF1ZXVlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSB0aGF0XG4gIC8vIG1pZ2h0IGdldCBzY2hlZHVsZWQgaW4gdGhlIGNvbW1pdCBwaGFzZS4gKFNlZSAjMTY3MTQuKVxuICAvLyBUT0RPOiBEZWxldGUgYWxsIG90aGVyIHBsYWNlcyB0aGF0IHNjaGVkdWxlIHRoZSBwYXNzaXZlIGVmZmVjdCBjYWxsYmFja1xuICAvLyBUaGV5J3JlIHJlZHVuZGFudC5cblxuXG4gIGlmICgoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyB8fCAoZmluaXNoZWRXb3JrLmZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgICAgLy8gdG8gc3RvcmUgaXQgaW4gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyB1bnRpbCB0aGV5IGdldCBwcm9jZXNzZWRcbiAgICAgIC8vIFdlIG5lZWQgdG8gcGFzcyB0aGlzIHRocm91Z2ggYXMgYW4gYXJndW1lbnQgdG8gY29tbWl0Um9vdFxuICAgICAgLy8gYmVjYXVzZSB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zIG1pZ2h0IGhhdmUgY2hhbmdlZCBiZXR3ZWVuXG4gICAgICAvLyB0aGUgcHJldmlvdXMgcmVuZGVyIGFuZCBjb21taXQgaWYgd2UgdGhyb3R0bGUgdGhlIGNvbW1pdFxuICAgICAgLy8gd2l0aCBzZXRUaW1lb3V0XG5cbiAgICAgIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSB0cmFuc2l0aW9ucztcbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShOb3JtYWxQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7IC8vIFRoaXMgcmVuZGVyIHRyaWdnZXJlZCBwYXNzaXZlIGVmZmVjdHM6IHJlbGVhc2UgdGhlIHJvb3QgY2FjaGUgcG9vbFxuICAgICAgICAvLyAqYWZ0ZXIqIHBhc3NpdmUgZWZmZWN0cyBmaXJlIHRvIGF2b2lkIGZyZWVpbmcgYSBjYWNoZSBwb29sIHRoYXQgbWF5XG4gICAgICAgIC8vIGJlIHJlZmVyZW5jZWQgYnkgYSBub2RlIGluIHRoZSB0cmVlIChIb3N0Um9vdCwgQ2FjaGUgYm91bmRhcnkgZXRjKVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgZWZmZWN0cyBpbiB0aGUgd2hvbGUgdHJlZS5cbiAgLy8gVE9ETzogVGhpcyBpcyBsZWZ0IG92ZXIgZnJvbSB0aGUgZWZmZWN0IGxpc3QgaW1wbGVtZW50YXRpb24sIHdoZXJlIHdlIGhhZFxuICAvLyB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBgZmlyc3RFZmZlY3RgIHRvIHNhdGlzZnkgRmxvdy4gSSB0aGluayB0aGVcbiAgLy8gb25seSBvdGhlciByZWFzb24gdGhpcyBvcHRpbWl6YXRpb24gZXhpc3RzIGlzIGJlY2F1c2UgaXQgYWZmZWN0cyBwcm9maWxpbmcuXG4gIC8vIFJlY29uc2lkZXIgd2hldGhlciB0aGlzIGlzIG5lY2Vzc2FyeS5cblxuXG4gIHZhciBzdWJ0cmVlSGFzRWZmZWN0cyA9IChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgKEJlZm9yZU11dGF0aW9uTWFzayB8IE11dGF0aW9uTWFzayB8IExheW91dE1hc2sgfCBQYXNzaXZlTWFzaykpICE9PSBOb0ZsYWdzO1xuICB2YXIgcm9vdEhhc0VmZmVjdCA9IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAoQmVmb3JlTXV0YXRpb25NYXNrIHwgTXV0YXRpb25NYXNrIHwgTGF5b3V0TWFzayB8IFBhc3NpdmVNYXNrKSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKHN1YnRyZWVIYXNFZmZlY3RzIHx8IHJvb3RIYXNFZmZlY3QpIHtcbiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgZXhlY3V0aW9uQ29udGV4dCB8PSBDb21taXRDb250ZXh0OyAvLyBSZXNldCB0aGlzIHRvIG51bGwgYmVmb3JlIGNhbGxpbmcgbGlmZWN5Y2xlc1xuXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDsgLy8gVGhlIGNvbW1pdCBwaGFzZSBpcyBicm9rZW4gaW50byBzZXZlcmFsIHN1Yi1waGFzZXMuIFdlIGRvIGEgc2VwYXJhdGUgcGFzc1xuICAgIC8vIG9mIHRoZSBlZmZlY3QgbGlzdCBmb3IgZWFjaCBwaGFzZTogYWxsIG11dGF0aW9uIGVmZmVjdHMgY29tZSBiZWZvcmUgYWxsXG4gICAgLy8gbGF5b3V0IGVmZmVjdHMsIGFuZCBzbyBvbi5cbiAgICAvLyBUaGUgZmlyc3QgcGhhc2UgYSBcImJlZm9yZSBtdXRhdGlvblwiIHBoYXNlLiBXZSB1c2UgdGhpcyBwaGFzZSB0byByZWFkIHRoZVxuICAgIC8vIHN0YXRlIG9mIHRoZSBob3N0IHRyZWUgcmlnaHQgYmVmb3JlIHdlIG11dGF0ZSBpdC4gVGhpcyBpcyB3aGVyZVxuICAgIC8vIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlIGlzIGNhbGxlZC5cblxuICAgIHZhciBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcblxuICAgIHtcbiAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgY29tbWl0IHRpbWUgdG8gYmUgc2hhcmVkIGJ5IGFsbCBQcm9maWxlcnMgaW4gdGhpc1xuICAgICAgLy8gYmF0Y2guIFRoaXMgZW5hYmxlcyB0aGVtIHRvIGJlIGdyb3VwZWQgbGF0ZXIuXG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuXG5cbiAgICBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG5cbiAgICByZXNldEFmdGVyQ29tbWl0KHJvb3QuY29udGFpbmVySW5mbyk7IC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIHRyZWUgaXMgbm93IHRoZSBjdXJyZW50IHRyZWUuIFRoaXMgbXVzdCBjb21lIGFmdGVyXG4gICAgLy8gdGhlIG11dGF0aW9uIHBoYXNlLCBzbyB0aGF0IHRoZSBwcmV2aW91cyB0cmVlIGlzIHN0aWxsIGN1cnJlbnQgZHVyaW5nXG4gICAgLy8gY29tcG9uZW50V2lsbFVubW91bnQsIGJ1dCBiZWZvcmUgdGhlIGxheW91dCBwaGFzZSwgc28gdGhhdCB0aGUgZmluaXNoZWRcbiAgICAvLyB3b3JrIGlzIGN1cnJlbnQgZHVyaW5nIGNvbXBvbmVudERpZE1vdW50L1VwZGF0ZS5cblxuICAgIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yazsgLy8gVGhlIG5leHQgcGhhc2UgaXMgdGhlIGxheW91dCBwaGFzZSwgd2hlcmUgd2UgY2FsbCBlZmZlY3RzIHRoYXQgcmVhZFxuXG4gICAge1xuICAgICAgbWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG5cbiAgICBjb21taXRMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgcm9vdCwgbGFuZXMpO1xuXG4gICAge1xuICAgICAgbWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICAgIC8vIG9wcG9ydHVuaXR5IHRvIHBhaW50LlxuXG5cbiAgICByZXF1ZXN0UGFpbnQoKTtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIFJlc2V0IHRoZSBwcmlvcml0eSB0byB0aGUgcHJldmlvdXMgbm9uLXN5bmMgdmFsdWUuXG5cbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gZWZmZWN0cy5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIE1lYXN1cmUgdGhlc2UgYW55d2F5IHNvIHRoZSBmbGFtZWdyYXBoIGV4cGxpY2l0bHkgc2hvd3MgdGhhdCB0aGVyZSB3ZXJlXG4gICAgLy8gbm8gZWZmZWN0cy5cbiAgICAvLyBUT0RPOiBNYXliZSB0aGVyZSdzIGEgYmV0dGVyIHdheSB0byByZXBvcnQgdGhpcy5cblxuICAgIHtcbiAgICAgIHJlY29yZENvbW1pdFRpbWUoKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cyA9IHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzO1xuXG4gIGlmIChyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgIC8vIFRoaXMgY29tbWl0IGhhcyBwYXNzaXZlIGVmZmVjdHMuIFN0YXNoIGEgcmVmZXJlbmNlIHRvIHRoZW0uIEJ1dCBkb24ndFxuICAgIC8vIHNjaGVkdWxlIGEgY2FsbGJhY2sgdW50aWwgYWZ0ZXIgZmx1c2hpbmcgbGF5b3V0IHdvcmsuXG4gICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgICByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IHJvb3Q7XG4gICAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBsYW5lcztcbiAgfSBlbHNlIHtcblxuICAgIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDtcbiAgICB9XG4gIH0gLy8gUmVhZCB0aGlzIGFnYWluLCBzaW5jZSBhbiBlZmZlY3QgbWlnaHQgaGF2ZSB1cGRhdGVkIGl0XG5cblxuICByZW1haW5pbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzOyAvLyBDaGVjayBpZiB0aGVyZSdzIHJlbWFpbmluZyB3b3JrIG9uIHRoaXMgcm9vdFxuICAvLyBUT0RPOiBUaGlzIGlzIHBhcnQgb2YgdGhlIGBjb21wb25lbnREaWRDYXRjaGAgaW1wbGVtZW50YXRpb24uIEl0cyBwdXJwb3NlXG4gIC8vIGlzIHRvIGRldGVjdCB3aGV0aGVyIHNvbWV0aGluZyBtaWdodCBoYXZlIGNhbGxlZCBzZXRTdGF0ZSBpbnNpZGVcbiAgLy8gYGNvbXBvbmVudERpZENhdGNoYC4gVGhlIG1lY2hhbmlzbSBpcyBrbm93biB0byBiZSBmbGF3ZWQgYmVjYXVzZSBgc2V0U3RhdGVgXG4gIC8vIGluc2lkZSBgY29tcG9uZW50RGlkQ2F0Y2hgIGlzIGl0c2VsZiBmbGF3ZWQg4oCUIHRoYXQncyB3aHkgd2UgcmVjb21tZW5kXG4gIC8vIGBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3JgIGluc3RlYWQuIEhvd2V2ZXIsIGl0IGNvdWxkIGJlIGltcHJvdmVkIGJ5XG4gIC8vIGNoZWNraW5nIGlmIHJlbWFpbmluZ0xhbmVzIGluY2x1ZGVzIFN5bmMgd29yaywgaW5zdGVhZCBvZiB3aGV0aGVyIHRoZXJlJ3NcbiAgLy8gYW55IHdvcmsgcmVtYWluaW5nIGF0IGFsbCAod2hpY2ggd291bGQgYWxzbyBpbmNsdWRlIHN0dWZmIGxpa2UgU3VzcGVuc2VcbiAgLy8gcmV0cmllcyBvciB0cmFuc2l0aW9ucykuIEl0J3MgYmVlbiBsaWtlIHRoaXMgZm9yIGEgd2hpbGUsIHRob3VnaCwgc28gZml4aW5nXG4gIC8vIGl0IHByb2JhYmx5IGlzbid0IHRoYXQgdXJnZW50LlxuXG4gIGlmIChyZW1haW5pbmdMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmssIHdlIGNhbiBjbGVhciB0aGUgc2V0IG9mIGFscmVhZHkgZmFpbGVkXG4gICAgLy8gZXJyb3IgYm91bmRhcmllcy5cbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKCFyb290RGlkSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYocm9vdC5jdXJyZW50LCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgb25Db21taXRSb290KGZpbmlzaGVkV29yay5zdGF0ZU5vZGUsIHJlbmRlclByaW9yaXR5TGV2ZWwpO1xuXG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIHJvb3QubWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBvbkNvbW1pdFJvb3QkMSgpO1xuICB9IC8vIEFsd2F5cyBjYWxsIHRoaXMgYmVmb3JlIGV4aXRpbmcgYGNvbW1pdFJvb3RgLCB0byBlbnN1cmUgdGhhdCBhbnlcbiAgLy8gYWRkaXRpb25hbCB3b3JrIG9uIHRoaXMgcm9vdCBpcyBzY2hlZHVsZWQuXG5cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyZWNvdmVyYWJsZUVycm9ycyAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlIHdlcmUgZXJyb3JzIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHJlY292ZXJlZCBmcm9tIHRoZW0gd2l0aG91dFxuICAgIC8vIG5lZWRpbmcgdG8gc3VyZmFjZSBpdCB0byB0aGUgVUkuIFdlIGxvZyB0aGVtIGhlcmUuXG4gICAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IHJvb3Qub25SZWNvdmVyYWJsZUVycm9yO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvdmVyYWJsZUVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJlY292ZXJhYmxlRXJyb3IgPSByZWNvdmVyYWJsZUVycm9yc1tpXTtcbiAgICAgIHZhciBjb21wb25lbnRTdGFjayA9IHJlY292ZXJhYmxlRXJyb3Iuc3RhY2s7XG4gICAgICB2YXIgZGlnZXN0ID0gcmVjb3ZlcmFibGVFcnJvci5kaWdlc3Q7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IocmVjb3ZlcmFibGVFcnJvci52YWx1ZSwge1xuICAgICAgICBjb21wb25lbnRTdGFjazogY29tcG9uZW50U3RhY2ssXG4gICAgICAgIGRpZ2VzdDogZGlnZXN0XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoaGFzVW5jYXVnaHRFcnJvcikge1xuICAgIGhhc1VuY2F1Z2h0RXJyb3IgPSBmYWxzZTtcbiAgICB2YXIgZXJyb3IkMSA9IGZpcnN0VW5jYXVnaHRFcnJvcjtcbiAgICBmaXJzdFVuY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHRocm93IGVycm9yJDE7XG4gIH0gLy8gSWYgdGhlIHBhc3NpdmUgZWZmZWN0cyBhcmUgdGhlIHJlc3VsdCBvZiBhIGRpc2NyZXRlIHJlbmRlciwgZmx1c2ggdGhlbVxuICAvLyBzeW5jaHJvbm91c2x5IGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdGFzayBzbyB0aGF0IHRoZSByZXN1bHQgaXNcbiAgLy8gaW1tZWRpYXRlbHkgb2JzZXJ2YWJsZS4gT3RoZXJ3aXNlLCB3ZSBhc3N1bWUgdGhhdCB0aGV5IGFyZSBub3RcbiAgLy8gb3JkZXItZGVwZW5kZW50IGFuZCBkbyBub3QgbmVlZCB0byBiZSBvYnNlcnZlZCBieSBleHRlcm5hbCBzeXN0ZW1zLCBzbyB3ZVxuICAvLyBjYW4gd2FpdCB1bnRpbCBhZnRlciBwYWludC5cbiAgLy8gVE9ETzogV2UgY2FuIG9wdGltaXplIHRoaXMgYnkgbm90IHNjaGVkdWxpbmcgdGhlIGNhbGxiYWNrIGVhcmxpZXIuIFNpbmNlIHdlXG4gIC8vIGN1cnJlbnRseSBzY2hlZHVsZSB0aGUgY2FsbGJhY2sgaW4gbXVsdGlwbGUgcGxhY2VzLCB3aWxsIHdhaXQgdW50aWwgdGhvc2VcbiAgLy8gYXJlIGNvbnNvbGlkYXRlZC5cblxuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzLCBTeW5jTGFuZSkgJiYgcm9vdC50YWcgIT09IExlZ2FjeVJvb3QpIHtcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gLy8gUmVhZCB0aGlzIGFnYWluLCBzaW5jZSBhIHBhc3NpdmUgZWZmZWN0IG1pZ2h0IGhhdmUgdXBkYXRlZCBpdFxuXG5cbiAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW1haW5pbmdMYW5lcywgU3luY0xhbmUpKSB7XG4gICAge1xuICAgICAgbWFya05lc3RlZFVwZGF0ZVNjaGVkdWxlZCgpO1xuICAgIH0gLy8gQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcm9vdCBzeW5jaHJvbm91c2x5IHJlLXJlbmRlcnMgd2l0aG91dFxuICAgIC8vIGZpbmlzaGluZy4gSWYgdGhlcmUgYXJlIHRvbyBtYW55LCBpdCBpbmRpY2F0ZXMgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AuXG5cblxuICAgIGlmIChyb290ID09PSByb290V2l0aE5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgIG5lc3RlZFVwZGF0ZUNvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IHJvb3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgfSAvLyBJZiBsYXlvdXQgd29yayB3YXMgc2NoZWR1bGVkLCBmbHVzaCBpdCBub3cuXG5cblxuICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcblxuICB7XG4gICAgbWFya0NvbW1pdFN0b3BwZWQoKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzKCkge1xuICAvLyBSZXR1cm5zIHdoZXRoZXIgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgZmx1c2hlZC5cbiAgLy8gVE9ETzogQ29tYmluZSB0aGlzIGNoZWNrIHdpdGggdGhlIG9uZSBpbiBmbHVzaFBhc3NpdmVFRmZlY3RzSW1wbC4gV2Ugc2hvdWxkXG4gIC8vIHByb2JhYmx5IGp1c3QgY29tYmluZSB0aGUgdHdvIGZ1bmN0aW9ucy4gSSBiZWxpZXZlIHRoZXkgd2VyZSBvbmx5IHNlcGFyYXRlXG4gIC8vIGluIHRoZSBmaXJzdCBwbGFjZSBiZWNhdXNlIHdlIHVzZWQgdG8gd3JhcCBpdCB3aXRoXG4gIC8vIGBTY2hlZHVsZXIucnVuV2l0aFByaW9yaXR5YCwgd2hpY2ggYWNjZXB0cyBhIGZ1bmN0aW9uLiBCdXQgbm93IHdlIHRyYWNrIHRoZVxuICAvLyBwcmlvcml0eSB3aXRoaW4gUmVhY3QgaXRzZWxmLCBzbyB3ZSBjYW4gbXV0YXRlIHRoZSB2YXJpYWJsZSBkaXJlY3RseS5cbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKSB7XG4gICAgdmFyIHJlbmRlclByaW9yaXR5ID0gbGFuZXNUb0V2ZW50UHJpb3JpdHkocGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMpO1xuICAgIHZhciBwcmlvcml0eSA9IGxvd2VyRXZlbnRQcmlvcml0eShEZWZhdWx0RXZlbnRQcmlvcml0eSwgcmVuZGVyUHJpb3JpdHkpO1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJpb3JpdHkpO1xuICAgICAgcmV0dXJuIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uOyAvLyBPbmNlIHBhc3NpdmUgZWZmZWN0cyBoYXZlIHJ1biBmb3IgdGhlIHRyZWUgLSBnaXZpbmcgY29tcG9uZW50cyBhXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3QoZmliZXIpIHtcbiAge1xuICAgIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzLnB1c2goZmliZXIpO1xuXG4gICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgICAgc2NoZWR1bGVDYWxsYmFjayQxKE5vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0c0ltcGwoKSB7XG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBDYWNoZSBhbmQgY2xlYXIgdGhlIHRyYW5zaXRpb25zIGZsYWdcblxuXG4gIHZhciB0cmFuc2l0aW9ucyA9IHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnM7XG4gIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSBudWxsO1xuICB2YXIgcm9vdCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzO1xuICB2YXIgbGFuZXMgPSBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcztcbiAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsOyAvLyBUT0RPOiBUaGlzIGlzIHNvbWV0aW1lcyBvdXQgb2Ygc3luYyB3aXRoIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzLlxuICAvLyBGaWd1cmUgb3V0IHdoeSBhbmQgZml4IGl0LiBJdCdzIG5vdCBjYXVzaW5nIGFueSBrbm93biBpc3N1ZXMgKHByb2JhYmx5XG4gIC8vIGJlY2F1c2UgaXQncyBvbmx5IHVzZWQgZm9yIHByb2ZpbGluZyksIGJ1dCBpdCdzIGEgcmVmYWN0b3IgaGF6YXJkLlxuXG4gIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmx1c2ggcGFzc2l2ZSBlZmZlY3RzIHdoaWxlIGFscmVhZHkgcmVuZGVyaW5nLicpO1xuICB9XG5cbiAge1xuICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICB9XG5cbiAge1xuICAgIG1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBDb21taXRDb250ZXh0O1xuICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHMocm9vdC5jdXJyZW50KTtcbiAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0cyhyb290LCByb290LmN1cnJlbnQsIGxhbmVzLCB0cmFuc2l0aW9ucyk7IC8vIFRPRE86IE1vdmUgdG8gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c1xuXG4gIHtcbiAgICB2YXIgcHJvZmlsZXJFZmZlY3RzID0gcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHM7XG4gICAgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvZmlsZXJFZmZlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX2ZpYmVyID0gcHJvZmlsZXJFZmZlY3RzW2ldO1xuICAgICAgY29tbWl0UGFzc2l2ZUVmZmVjdER1cmF0aW9ucyhyb290LCBfZmliZXIpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBtYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCk7XG4gIH1cblxuICB7XG4gICAgY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKHJvb3QuY3VycmVudCwgdHJ1ZSk7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuXG4gIHtcbiAgICAvLyBJZiBhZGRpdGlvbmFsIHBhc3NpdmUgZWZmZWN0cyB3ZXJlIHNjaGVkdWxlZCwgaW5jcmVtZW50IGEgY291bnRlci4gSWYgdGhpc1xuICAgIC8vIGV4Y2VlZHMgdGhlIGxpbWl0LCB3ZSdsbCBmaXJlIGEgd2FybmluZy5cbiAgICBpZiAoZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaWYgKHJvb3QgPT09IHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gcm9vdDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICB9XG5cbiAgICBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH0gLy8gVE9ETzogTW92ZSB0byBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzXG5cblxuICBvblBvc3RDb21taXRSb290KHJvb3QpO1xuXG4gIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gcm9vdC5jdXJyZW50LnN0YXRlTm9kZTtcbiAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkICE9PSBudWxsICYmIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmhhcyhpbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBtYXJrTGVnYWN5RXJyb3JCb3VuZGFyeUFzRmFpbGVkKGluc3RhbmNlKSB7XG4gIGlmIChsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9PT0gbnVsbCkge1xuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbmV3IFNldChbaW5zdGFuY2VdKTtcbiAgfSBlbHNlIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5hZGQoaW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcihlcnJvcikge1xuICBpZiAoIWhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gdHJ1ZTtcbiAgICBmaXJzdFVuY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgfVxufVxuXG52YXIgb25VbmNhdWdodEVycm9yID0gcHJlcGFyZVRvVGhyb3dVbmNhdWdodEVycm9yO1xuXG5mdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChyb290RmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvcikge1xuICB2YXIgZXJyb3JJbmZvID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IsIHNvdXJjZUZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShyb290RmliZXIsIGVycm9ySW5mbywgU3luY0xhbmUpO1xuICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUocm9vdEZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihzb3VyY2VGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IkMSkge1xuICB7XG4gICAgcmVwb3J0VW5jYXVnaHRFcnJvckluREVWKGVycm9yJDEpO1xuICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gIH1cblxuICBpZiAoc291cmNlRmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIEVycm9yIHdhcyB0aHJvd24gYXQgdGhlIHJvb3QuIFRoZXJlIGlzIG5vIHBhcmVudCwgc28gdGhlIHJvb3RcbiAgICAvLyBpdHNlbGYgc2hvdWxkIGNhcHR1cmUgaXQuXG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qoc291cmNlRmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvciQxKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZmliZXIgPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlciA9IG5lYXJlc3RNb3VudGVkQW5jZXN0b3I7XG4gIH1cblxuICB3aGlsZSAoZmliZXIgIT09IG51bGwpIHtcbiAgICBpZiAoZmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3QoZmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvciQxKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBjdG9yID0gZmliZXIudHlwZTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSB7XG4gICAgICAgIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciQxLCBzb3VyY2VGaWJlcik7XG4gICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTtcbiAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcblxuICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgIG1hcmtSb290VXBkYXRlZChyb290LCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlciA9IGZpYmVyLnJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBUT0RPOiBVbnRpbCB3ZSByZS1sYW5kIHNraXBVbm1vdW50ZWRCb3VuZGFyaWVzIChzZWUgIzIwMTQ3KSwgdGhpcyB3YXJuaW5nXG4gICAgLy8gd2lsbCBmaXJlIGZvciBlcnJvcnMgdGhhdCBhcmUgdGhyb3duIGJ5IGRlc3Ryb3kgZnVuY3Rpb25zIGluc2lkZSBkZWxldGVkXG4gICAgLy8gdHJlZXMuIFdoYXQgaXQgc2hvdWxkIGluc3RlYWQgZG8gaXMgcHJvcGFnYXRlIHRoZSBlcnJvciB0byB0aGUgcGFyZW50IG9mXG4gICAgLy8gdGhlIGRlbGV0ZWQgdHJlZS4gSW4gdGhlIG1lYW50aW1lLCBkbyBub3QgYWRkIHRoaXMgd2FybmluZyB0byB0aGVcbiAgICAvLyBhbGxvd2xpc3Q7IHRoaXMgaXMgb25seSBmb3Igb3VyIGludGVybmFsIHVzZS5cbiAgICBlcnJvcignSW50ZXJuYWwgUmVhY3QgZXJyb3I6IEF0dGVtcHRlZCB0byBjYXB0dXJlIGEgY29tbWl0IHBoYXNlIGVycm9yICcgKyAnaW5zaWRlIGEgZGV0YWNoZWQgdHJlZS4gVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4gUmVhY3QuIExpa2VseSAnICsgJ2NhdXNlcyBpbmNsdWRlIGRlbGV0aW5nIHRoZSBzYW1lIGZpYmVyIG1vcmUgdGhhbiBvbmNlLCBjb21taXR0aW5nIGFuICcgKyAnYWxyZWFkeS1maW5pc2hlZCB0cmVlLCBvciBhbiBpbmNvbnNpc3RlbnQgcmV0dXJuIHBvaW50ZXIuXFxuXFxuJyArICdFcnJvciBtZXNzYWdlOlxcblxcbiVzJywgZXJyb3IkMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBpbmdTdXNwZW5kZWRSb290KHJvb3QsIHdha2VhYmxlLCBwaW5nZWRMYW5lcykge1xuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG5cbiAgaWYgKHBpbmdDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHBpbmdDYWNoZS5kZWxldGUod2FrZWFibGUpO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMpO1xuICB3YXJuSWZTdXNwZW5zZVJlc29sdXRpb25Ob3RXcmFwcGVkV2l0aEFjdERFVihyb290KTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ID09PSByb290ICYmIGlzU3Vic2V0T2ZMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcywgcGluZ2VkTGFuZXMpKSB7XG4gICAgLy8gUmVjZWl2ZWQgYSBwaW5nIGF0IHRoZSBzYW1lIHByaW9yaXR5IGxldmVsIGF0IHdoaWNoIHdlJ3JlIGN1cnJlbnRseVxuICAgIC8vIHJlbmRlcmluZy4gV2UgbWlnaHQgd2FudCB0byByZXN0YXJ0IHRoaXMgcmVuZGVyLiBUaGlzIHNob3VsZCBtaXJyb3JcbiAgICAvLyB0aGUgbG9naWMgb2Ygd2hldGhlciBvciBub3QgYSByb290IHN1c3BlbmRzIG9uY2UgaXQgY29tcGxldGVzLlxuICAgIC8vIFRPRE86IElmIHdlJ3JlIHJlbmRlcmluZyBzeW5jIGVpdGhlciBkdWUgdG8gU3luYywgQmF0Y2hlZCBvciBleHBpcmVkLFxuICAgIC8vIHdlIHNob3VsZCBwcm9iYWJseSBuZXZlciByZXN0YXJ0LlxuICAgIC8vIElmIHdlJ3JlIHN1c3BlbmRlZCB3aXRoIGRlbGF5LCBvciBpZiBpdCdzIGEgcmV0cnksIHdlJ2xsIGFsd2F5cyBzdXNwZW5kXG4gICAgLy8gc28gd2UgY2FuIGFsd2F5cyByZXN0YXJ0LlxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5IHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWQgJiYgaW5jbHVkZXNPbmx5UmV0cmllcyh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcykgJiYgbm93KCkgLSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lIDwgRkFMTEJBQ0tfVEhST1RUTEVfTVMpIHtcbiAgICAgIC8vIFJlc3RhcnQgZnJvbSB0aGUgcm9vdC5cbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFdmVuIHRob3VnaCB3ZSBjYW4ndCByZXN0YXJ0IHJpZ2h0IG5vdywgd2UgbWlnaHQgZ2V0IGFuXG4gICAgICAvLyBvcHBvcnR1bml0eSBsYXRlci4gU28gd2UgbWFyayB0aGlzIHJlbmRlciBhcyBoYXZpbmcgYSBwaW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzLCBwaW5nZWRMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG59XG5cbmZ1bmN0aW9uIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpIHtcbiAgLy8gVGhlIGJvdW5kYXJ5IGZpYmVyIChhIFN1c3BlbnNlIGNvbXBvbmVudCBvciBTdXNwZW5zZUxpc3QgY29tcG9uZW50KVxuICAvLyBwcmV2aW91c2x5IHdhcyByZW5kZXJlZCBpbiBpdHMgZmFsbGJhY2sgc3RhdGUuIE9uZSBvZiB0aGUgcHJvbWlzZXMgdGhhdFxuICAvLyBzdXNwZW5kZWQgaXQgaGFzIHJlc29sdmVkLCB3aGljaCBtZWFucyBhdCBsZWFzdCBwYXJ0IG9mIHRoZSB0cmVlIHdhc1xuICAvLyBsaWtlbHkgdW5ibG9ja2VkLiBUcnkgcmVuZGVyaW5nIGFnYWluLCBhdCBhIG5ldyBsYW5lcy5cbiAgaWYgKHJldHJ5TGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgLy8gVE9ETzogQXNzaWduIHRoaXMgdG8gYHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lYD8gdG8gYXZvaWRcbiAgICAvLyB1bm5lY2Vzc2FyeSBlbnRhbmdsZW1lbnQ/XG4gICAgcmV0cnlMYW5lID0gcmVxdWVzdFJldHJ5TGFuZShib3VuZGFyeUZpYmVyKTtcbiAgfSAvLyBUT0RPOiBTcGVjaWFsIGNhc2UgaWRsZSBwcmlvcml0eT9cblxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgcmV0cnlMYW5lLCBldmVudFRpbWUpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJldHJ5RGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoYm91bmRhcnlGaWJlcikge1xuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGJvdW5kYXJ5RmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJldHJ5TGFuZSA9IE5vTGFuZTtcblxuICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lO1xuICB9XG5cbiAgcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlUmV0cnlXYWtlYWJsZShib3VuZGFyeUZpYmVyLCB3YWtlYWJsZSkge1xuICB2YXIgcmV0cnlMYW5lID0gTm9MYW5lOyAvLyBEZWZhdWx0XG5cbiAgdmFyIHJldHJ5Q2FjaGU7XG5cbiAgc3dpdGNoIChib3VuZGFyeUZpYmVyLnRhZykge1xuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGU7XG4gICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGJvdW5kYXJ5RmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgcmV0cnlMYW5lID0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGU7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BpbmdlZCB1bmtub3duIHN1c3BlbnNlIGJvdW5kYXJ5IHR5cGUuICcgKyAnVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfVxuXG4gIGlmIChyZXRyeUNhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHdha2VhYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcmV0cnlDYWNoZS5kZWxldGUod2FrZWFibGUpO1xuICB9XG5cbiAgcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSk7XG59IC8vIENvbXB1dGVzIHRoZSBuZXh0IEp1c3QgTm90aWNlYWJsZSBEaWZmZXJlbmNlIChKTkQpIGJvdW5kYXJ5LlxuLy8gVGhlIHRoZW9yeSBpcyB0aGF0IGEgcGVyc29uIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLlxuLy8gVGhlcmVmb3JlLCBpZiB3ZSB3YWl0IGEgYml0IGxvbmdlciB0aGFuIG5lY2Vzc2FyeSB0aGF0IHdvbid0IHRyYW5zbGF0ZSB0byBhIG5vdGljZWFibGVcbi8vIGRpZmZlcmVuY2UgaW4gdGhlIGV4cGVyaWVuY2UuIEhvd2V2ZXIsIHdhaXRpbmcgZm9yIGxvbmdlciBtaWdodCBtZWFuIHRoYXQgd2UgY2FuIGF2b2lkXG4vLyBzaG93aW5nIGFuIGludGVybWVkaWF0ZSBsb2FkaW5nIHN0YXRlLiBUaGUgbG9uZ2VyIHdlIGhhdmUgYWxyZWFkeSB3YWl0ZWQsIHRoZSBoYXJkZXIgaXRcbi8vIGlzIHRvIHRlbGwgc21hbGwgZGlmZmVyZW5jZXMgaW4gdGltZS4gVGhlcmVmb3JlLCB0aGUgbG9uZ2VyIHdlJ3ZlIGFscmVhZHkgd2FpdGVkLFxuLy8gdGhlIGxvbmdlciB3ZSBjYW4gd2FpdCBhZGRpdGlvbmFsbHkuIEF0IHNvbWUgcG9pbnQgd2UgaGF2ZSB0byBnaXZlIHVwIHRob3VnaC5cbi8vIFdlIHBpY2sgYSB0cmFpbiBtb2RlbCB3aGVyZSB0aGUgbmV4dCBib3VuZGFyeSBjb21taXRzIGF0IGEgY29uc2lzdGVudCBzY2hlZHVsZS5cbi8vIFRoZXNlIHBhcnRpY3VsYXIgbnVtYmVycyBhcmUgdmFndWUgZXN0aW1hdGVzLiBXZSBleHBlY3QgdG8gYWRqdXN0IHRoZW0gYmFzZWQgb24gcmVzZWFyY2guXG5cbmZ1bmN0aW9uIGpuZCh0aW1lRWxhcHNlZCkge1xuICByZXR1cm4gdGltZUVsYXBzZWQgPCAxMjAgPyAxMjAgOiB0aW1lRWxhcHNlZCA8IDQ4MCA/IDQ4MCA6IHRpbWVFbGFwc2VkIDwgMTA4MCA/IDEwODAgOiB0aW1lRWxhcHNlZCA8IDE5MjAgPyAxOTIwIDogdGltZUVsYXBzZWQgPCAzMDAwID8gMzAwMCA6IHRpbWVFbGFwc2VkIDwgNDMyMCA/IDQzMjAgOiBjZWlsKHRpbWVFbGFwc2VkIC8gMTk2MCkgKiAxOTYwO1xufVxuXG5mdW5jdGlvbiBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKSB7XG4gIGlmIChuZXN0ZWRVcGRhdGVDb3VudCA+IE5FU1RFRF9VUERBVEVfTElNSVQpIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gbnVsbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgJ3JlcGVhdGVkbHkgY2FsbHMgc2V0U3RhdGUgaW5zaWRlIGNvbXBvbmVudFdpbGxVcGRhdGUgb3IgJyArICdjb21wb25lbnREaWRVcGRhdGUuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIG5lc3RlZCB1cGRhdGVzIHRvICcgKyAncHJldmVudCBpbmZpbml0ZSBsb29wcy4nKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAobmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID4gTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUKSB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7XG5cbiAgICAgIGVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArIFwiY2FsbHMgc2V0U3RhdGUgaW5zaWRlIHVzZUVmZmVjdCwgYnV0IHVzZUVmZmVjdCBlaXRoZXIgZG9lc24ndCBcIiArICdoYXZlIGEgZGVwZW5kZW5jeSBhcnJheSwgb3Igb25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgY2hhbmdlcyBvbiAnICsgJ2V2ZXJ5IHJlbmRlci4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hSZW5kZXJQaGFzZVN0cmljdE1vZGVXYXJuaW5nc0luREVWKCkge1xuICB7XG4gICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZygpO1xuXG4gICAge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKGZpYmVyLCBoYXNQYXNzaXZlRWZmZWN0cykge1xuICB7XG4gICAgLy8gVE9ETyAoU3RyaWN0RWZmZWN0cykgU2hvdWxkIHdlIHNldCBhIG1hcmtlciBvbiB0aGUgcm9vdCBpZiBpdCBjb250YWlucyBzdHJpY3QgZWZmZWN0c1xuICAgIC8vIHNvIHdlIGRvbid0IHRyYXZlcnNlIHVubmVjZXNzYXJpbHk/IHNpbWlsYXIgdG8gc3VidHJlZUZsYWdzIGJ1dCBqdXN0IGF0IHRoZSByb290IGxldmVsLlxuICAgIC8vIE1heWJlIG5vdCBhIGJpZyBkZWFsIHNpbmNlIHRoaXMgaXMgREVWIG9ubHkgYmVoYXZpb3IuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50TGF5b3V0RGV2LCBpbnZva2VMYXlvdXRFZmZlY3RVbm1vdW50SW5ERVYpO1xuXG4gICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50UGFzc2l2ZURldiwgaW52b2tlUGFzc2l2ZUVmZmVjdFVubW91bnRJbkRFVik7XG4gICAgfVxuXG4gICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudExheW91dERldiwgaW52b2tlTGF5b3V0RWZmZWN0TW91bnRJbkRFVik7XG5cbiAgICBpZiAoaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRQYXNzaXZlRGV2LCBpbnZva2VQYXNzaXZlRWZmZWN0TW91bnRJbkRFVik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VFZmZlY3RzSW5EZXYoZmlyc3RDaGlsZCwgZmliZXJGbGFncywgaW52b2tlRWZmZWN0Rm4pIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHZhciBjdXJyZW50ID0gZmlyc3RDaGlsZDtcbiAgICB2YXIgc3VidHJlZVJvb3QgPSBudWxsO1xuXG4gICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmltYXJ5U3VidHJlZUZsYWcgPSBjdXJyZW50LnN1YnRyZWVGbGFncyAmIGZpYmVyRmxhZ3M7XG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBzdWJ0cmVlUm9vdCAmJiBjdXJyZW50LmNoaWxkICE9PSBudWxsICYmIHByaW1hcnlTdWJ0cmVlRmxhZyAhPT0gTm9GbGFncykge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIGZpYmVyRmxhZ3MpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgaW52b2tlRWZmZWN0Rm4oY3VycmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudC5zaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuc2libGluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50ID0gc3VidHJlZVJvb3QgPSBjdXJyZW50LnJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG51bGw7XG5mdW5jdGlvbiB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0KSB7XG4gICAgICAvLyBXZSBsZXQgdGhlIG90aGVyIHdhcm5pbmcgYWJvdXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgZGVhbCB3aXRoIHRoaXMgb25lLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGFnID0gZmliZXIudGFnO1xuXG4gICAgaWYgKHRhZyAhPT0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCAmJiB0YWcgIT09IEhvc3RSb290ICYmIHRhZyAhPT0gQ2xhc3NDb21wb25lbnQgJiYgdGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiB0YWcgIT09IEZvcndhcmRSZWYgJiYgdGFnICE9PSBNZW1vQ29tcG9uZW50ICYmIHRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkge1xuICAgICAgLy8gT25seSB3YXJuIGZvciB1c2VyLWRlZmluZWQgY29tcG9uZW50cywgbm90IGludGVybmFsIG9uZXMgbGlrZSBTdXNwZW5zZS5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIHNob3cgdGhlIHdob2xlIHN0YWNrIGJ1dCBkZWR1cGUgb24gdGhlIHRvcCBjb21wb25lbnQncyBuYW1lIGJlY2F1c2VcbiAgICAvLyB0aGUgcHJvYmxlbWF0aWMgY29kZSBhbG1vc3QgYWx3YXlzIGxpZXMgaW5zaWRlIHRoYXQgY29tcG9uZW50LlxuXG5cbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdSZWFjdENvbXBvbmVudCc7XG5cbiAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBuZXcgU2V0KFtjb21wb25lbnROYW1lXSk7XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIGVycm9yKFwiQ2FuJ3QgcGVyZm9ybSBhIFJlYWN0IHN0YXRlIHVwZGF0ZSBvbiBhIGNvbXBvbmVudCB0aGF0IGhhc24ndCBtb3VudGVkIHlldC4gXCIgKyAnVGhpcyBpbmRpY2F0ZXMgdGhhdCB5b3UgaGF2ZSBhIHNpZGUtZWZmZWN0IGluIHlvdXIgcmVuZGVyIGZ1bmN0aW9uIHRoYXQgJyArICdhc3luY2hyb25vdXNseSBsYXRlciBjYWxscyB0cmllcyB0byB1cGRhdGUgdGhlIGNvbXBvbmVudC4gTW92ZSB0aGlzIHdvcmsgdG8gJyArICd1c2VFZmZlY3QgaW5zdGVhZC4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG52YXIgYmVnaW5Xb3JrJDE7XG5cbntcbiAgdmFyIGR1bW15RmliZXIgPSBudWxsO1xuXG4gIGJlZ2luV29yayQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKSB7XG4gICAgLy8gSWYgYSBjb21wb25lbnQgdGhyb3dzIGFuIGVycm9yLCB3ZSByZXBsYXkgaXQgYWdhaW4gaW4gYSBzeW5jaHJvbm91c2x5XG4gICAgLy8gZGlzcGF0Y2hlZCBldmVudCwgc28gdGhhdCB0aGUgZGVidWdnZXIgd2lsbCB0cmVhdCBpdCBhcyBhbiB1bmNhdWdodFxuICAgIC8vIGVycm9yIFNlZSBSZWFjdEVycm9yVXRpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgLy8gQmVmb3JlIGVudGVyaW5nIHRoZSBiZWdpbiBwaGFzZSwgY29weSB0aGUgd29yay1pbi1wcm9ncmVzcyBvbnRvIGEgZHVtbXlcbiAgICAvLyBmaWJlci4gSWYgYmVnaW5Xb3JrIHRocm93cywgd2UnbGwgdXNlIHRoaXMgdG8gcmVzZXQgdGhlIHN0YXRlLlxuICAgIHZhciBvcmlnaW5hbFdvcmtJblByb2dyZXNzQ29weSA9IGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKGR1bW15RmliZXIsIHVuaXRPZldvcmspO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBiZWdpbldvcmsoY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpO1xuICAgIH0gY2F0Y2ggKG9yaWdpbmFsRXJyb3IpIHtcbiAgICAgIGlmIChkaWRTdXNwZW5kT3JFcnJvcldoaWxlSHlkcmF0aW5nREVWKCkgfHwgb3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBEb24ndCByZXBsYXkgcHJvbWlzZXMuXG4gICAgICAgIC8vIERvbid0IHJlcGxheSBlcnJvcnMgaWYgd2UgYXJlIGh5ZHJhdGluZyBhbmQgaGF2ZSBhbHJlYWR5IHN1c3BlbmRlZCBvciBoYW5kbGVkIGFuIGVycm9yXG4gICAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgICB9IC8vIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgd2l0aCBoYW5kbGVFcnJvcjsgYW55IGNoYW5nZXMgaGVyZSBtdXN0IGhhdmVcbiAgICAgIC8vIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyB0aGVyZS5cblxuXG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIHJlc2V0SG9va3NBZnRlclRocm93KCk7IC8vIERvbid0IHJlc2V0IGN1cnJlbnQgZGVidWcgZmliZXIsIHNpbmNlIHdlJ3JlIGFib3V0IHRvIHdvcmsgb24gdGhlXG4gICAgICAvLyBzYW1lIGZpYmVyIGFnYWluLlxuICAgICAgLy8gVW53aW5kIHRoZSBmYWlsZWQgc3RhY2sgZnJhbWVcblxuICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIHVuaXRPZldvcmspOyAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIG9mIHRoZSBmaWJlci5cblxuICAgICAgYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYodW5pdE9mV29yaywgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkpO1xuXG4gICAgICBpZiAoIHVuaXRPZldvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBwcm9maWxlciB0aW1lci5cbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKHVuaXRPZldvcmspO1xuICAgICAgfSAvLyBSdW4gYmVnaW5Xb3JrIGFnYWluLlxuXG5cbiAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBiZWdpbldvcmssIG51bGwsIGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcblxuICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgdmFyIHJlcGxheUVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGF5RXJyb3IgPT09ICdvYmplY3QnICYmIHJlcGxheUVycm9yICE9PSBudWxsICYmIHJlcGxheUVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgIW9yaWdpbmFsRXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgICAgIC8vIElmIHN1cHByZXNzZWQsIGxldCB0aGUgZmxhZyBjYXJyeSBvdmVyIHRvIHRoZSBvcmlnaW5hbCBlcnJvciB3aGljaCBpcyB0aGUgb25lIHdlJ2xsIHJldGhyb3cuXG4gICAgICAgICAgb3JpZ2luYWxFcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBXZSBhbHdheXMgdGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yIGluIGNhc2UgdGhlIHNlY29uZCByZW5kZXIgcGFzcyBpcyBub3QgaWRlbXBvdGVudC5cbiAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBhIG1lbW9pemVkIGZ1bmN0aW9uIG9yIENvbW1vbkpTIG1vZHVsZSBkb2Vzbid0IHRocm93IGFmdGVyIGZpcnN0IGludm9jYXRpb24uXG5cblxuICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICB9XG4gIH07XG59XG5cbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9IGZhbHNlO1xudmFyIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudDtcblxue1xuICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQgPSBuZXcgU2V0KCk7XG59XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaXNSZW5kZXJpbmcgJiYgIWdldElzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2VJbkRFVigpKSB7XG4gICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSA9IHdvcmtJblByb2dyZXNzICYmIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdVbmtub3duJzsgLy8gRGVkdXBlIGJ5IHRoZSByZW5kZXJpbmcgY29tcG9uZW50IGJlY2F1c2UgaXQncyB0aGUgb25lIHRoYXQgbmVlZHMgdG8gYmUgZml4ZWQuXG5cbiAgICAgICAgICAgIHZhciBkZWR1cGVLZXkgPSByZW5kZXJpbmdDb21wb25lbnROYW1lO1xuXG4gICAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudC5oYXMoZGVkdXBlS2V5KSkge1xuICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuYWRkKGRlZHVwZUtleSk7XG4gICAgICAgICAgICAgIHZhciBzZXRTdGF0ZUNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYSBjb21wb25lbnQgKGAlc2ApIHdoaWxlIHJlbmRlcmluZyBhICcgKyAnZGlmZmVyZW50IGNvbXBvbmVudCAoYCVzYCkuIFRvIGxvY2F0ZSB0aGUgYmFkIHNldFN0YXRlKCkgY2FsbCBpbnNpZGUgYCVzYCwgJyArICdmb2xsb3cgdGhlIHN0YWNrIHRyYWNlIGFzIGRlc2NyaWJlZCBpbiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc2V0c3RhdGUtaW4tcmVuZGVyJywgc2V0U3RhdGVDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlcikge1xuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCkuIFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgJyArICdmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuJyk7XG5cbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG4gICAgICBtZW1vaXplZFVwZGF0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxpbmdGaWJlcikge1xuICAgICAgICBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgc2NoZWR1bGluZ0ZpYmVyLCBsYW5lcyk7XG4gICAgICB9KTsgLy8gVGhpcyBmdW5jdGlvbiBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGNsZWFyIG1lbW9pemVkIHVwZGF0ZXJzLlxuICAgICAgLy8gVGhvc2UgbWF5IHN0aWxsIGJlIHJlbGV2YW50IHRvIHRoZSBjdXJyZW50IGNvbW1pdFxuICAgICAgLy8gYW5kIGEgZnV0dXJlIG9uZSAoZS5nLiBTdXNwZW5zZSkuXG4gICAgfVxuICB9XG59XG52YXIgZmFrZUFjdENhbGxiYWNrTm9kZSA9IHt9O1xuXG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrJDEocHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spIHtcbiAge1xuICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYW4gYGFjdGAgc2NvcGUsIGJ5cGFzcyBTY2hlZHVsZXIgYW5kIHB1c2ggdG9cbiAgICAvLyB0aGUgYGFjdGAgcXVldWUgaW5zdGVhZC5cbiAgICB2YXIgYWN0UXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQ7XG5cbiAgICBpZiAoYWN0UXVldWUgIT09IG51bGwpIHtcbiAgICAgIGFjdFF1ZXVlLnB1c2goY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIGZha2VBY3RDYWxsYmFja05vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FuY2VsQ2FsbGJhY2skMShjYWxsYmFja05vZGUpIHtcbiAgaWYgKCBjYWxsYmFja05vZGUgPT09IGZha2VBY3RDYWxsYmFja05vZGUpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gSW4gcHJvZHVjdGlvbiwgYWx3YXlzIGNhbGwgU2NoZWR1bGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgc3RyaXBwZWQgb3V0LlxuXG5cbiAgcmV0dXJuIGNhbmNlbENhbGxiYWNrKGNhbGxiYWNrTm9kZSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpIHtcbiAgLy8gTmV2ZXIgZm9yY2UgZmx1c2ggaW4gcHJvZHVjdGlvbi4gVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2V0IHN0cmlwcGVkIG91dC5cbiAgcmV0dXJuICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlVwZGF0ZXNOb3RXcmFwcGVkV2l0aEFjdERFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgaWYgKCFpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgIC8vIE5vdCBpbiBhbiBhY3QgZW52aXJvbm1lbnQuIE5vIG5lZWQgdG8gd2Fybi5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWdhY3kgbW9kZSBoYXMgYWRkaXRpb25hbCBjYXNlcyB3aGVyZSB3ZSBzdXBwcmVzcyBhIHdhcm5pbmcuXG4gICAgICBpZiAoIWlzTGVnYWN5QWN0RW52aXJvbm1lbnQoKSkge1xuICAgICAgICAvLyBOb3QgaW4gYW4gYWN0IGVudmlyb25tZW50LiBObyBuZWVkIHRvIHdhcm4uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgIT09IE5vQ29udGV4dCkge1xuICAgICAgICAvLyBMZWdhY3kgbW9kZSBkb2Vzbid0IHdhcm4gaWYgdGhlIHVwZGF0ZSBpcyBiYXRjaGVkLCBpLmUuXG4gICAgICAgIC8vIGJhdGNoZWRVcGRhdGVzIG9yIGZsdXNoU3luYy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmliZXIudGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiBmaWJlci50YWcgIT09IEZvcndhcmRSZWYgJiYgZmliZXIudGFnICE9PSBTaW1wbGVNZW1vQ29tcG9uZW50KSB7XG4gICAgICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHByZS1ob29rcyBjb2RlLCBsZWdhY3kgbW9kZSBvbmx5XG4gICAgICAgIC8vIHdhcm5zIGZvciB1cGRhdGVzIHRoYXQgb3JpZ2luYXRlIGZyb20gYSBob29rLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICAgIGVycm9yKCdBbiB1cGRhdGUgdG8gJXMgaW5zaWRlIGEgdGVzdCB3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCBjYXVzZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBzaG91bGQgYmUgJyArICd3cmFwcGVkIGludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaXJlIGV2ZW50cyB0aGF0IHVwZGF0ZSBzdGF0ZSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN1c3BlbnNlUmVzb2x1dGlvbk5vdFdyYXBwZWRXaXRoQWN0REVWKHJvb3QpIHtcbiAge1xuICAgIGlmIChyb290LnRhZyAhPT0gTGVnYWN5Um9vdCAmJiBpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpICYmIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0Egc3VzcGVuZGVkIHJlc291cmNlIGZpbmlzaGVkIGxvYWRpbmcgaW5zaWRlIGEgdGVzdCwgYnV0IHRoZSBldmVudCAnICsgJ3dhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IHJlc29sdmVzIHN1c3BlbmRlZCBkYXRhIHNob3VsZCBiZSB3cmFwcGVkICcgKyAnaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpbmlzaCBsb2FkaW5nIHN1c3BlbmRlZCBkYXRhICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0Jyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChpc1J1bm5pbmcpIHtcbiAge1xuICAgIGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9IGlzUnVubmluZztcbiAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzICovXG52YXIgcmVzb2x2ZUZhbWlseSA9IG51bGw7IC8vICRGbG93Rml4TWUgRmxvdyBnZXRzIGNvbmZ1c2VkIGJ5IGEgV2Vha1NldCBmZWF0dXJlIGNoZWNrIGJlbG93LlxuXG52YXIgZmFpbGVkQm91bmRhcmllcyA9IG51bGw7XG52YXIgc2V0UmVmcmVzaEhhbmRsZXIgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICB7XG4gICAgcmVzb2x2ZUZhbWlseSA9IGhhbmRsZXI7XG4gIH1cbn07XG5mdW5jdGlvbiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseSh0eXBlKTtcblxuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfSAvLyBVc2UgdGhlIGxhdGVzdCBrbm93biBpbXBsZW1lbnRhdGlvbi5cblxuXG4gICAgcmV0dXJuIGZhbWlseS5jdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICAvLyBObyBpbXBsZW1lbnRhdGlvbiBkaWZmZXJlbmNlcy5cbiAgcmV0dXJuIHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHJlYWwgZm9yd2FyZFJlZi4gRG9uJ3Qgd2FudCB0byBjcmFzaCBlYXJseS5cbiAgICAgIGlmICh0eXBlICE9PSBudWxsICYmIHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRm9yd2FyZFJlZiBpcyBzcGVjaWFsIGJlY2F1c2UgaXRzIHJlc29sdmVkIC50eXBlIGlzIGFuIG9iamVjdCxcbiAgICAgICAgLy8gYnV0IGl0J3MgcG9zc2libGUgdGhhdCB3ZSBvbmx5IGhhdmUgaXRzIGlubmVyIHJlbmRlciBmdW5jdGlvbiBpbiB0aGUgbWFwLlxuICAgICAgICAvLyBJZiB0aGF0IGlubmVyIHJlbmRlciBmdW5jdGlvbiBpcyBkaWZmZXJlbnQsIHdlJ2xsIGJ1aWxkIGEgbmV3IGZvcndhcmRSZWYgdHlwZS5cbiAgICAgICAgdmFyIGN1cnJlbnRSZW5kZXIgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZS5yZW5kZXIpO1xuXG4gICAgICAgIGlmICh0eXBlLnJlbmRlciAhPT0gY3VycmVudFJlbmRlcikge1xuICAgICAgICAgIHZhciBzeW50aGV0aWNUeXBlID0ge1xuICAgICAgICAgICAgJCR0eXBlb2Y6IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUsXG4gICAgICAgICAgICByZW5kZXI6IGN1cnJlbnRSZW5kZXJcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKHR5cGUuZGlzcGxheU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3ludGhldGljVHlwZS5kaXNwbGF5TmFtZSA9IHR5cGUuZGlzcGxheU5hbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN5bnRoZXRpY1R5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfSAvLyBVc2UgdGhlIGxhdGVzdCBrbm93biBpbXBsZW1lbnRhdGlvbi5cblxuXG4gICAgcmV0dXJuIGZhbWlseS5jdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoZmliZXIsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBwcmV2VHlwZSA9IGZpYmVyLmVsZW1lbnRUeXBlO1xuICAgIHZhciBuZXh0VHlwZSA9IGVsZW1lbnQudHlwZTsgLy8gSWYgd2UgZ290IGhlcmUsIHdlIGtub3cgdHlwZXMgYXJlbid0ID09PSBlcXVhbC5cblxuICAgIHZhciBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IGZhbHNlO1xuICAgIHZhciAkJHR5cGVvZk5leHRUeXBlID0gdHlwZW9mIG5leHRUeXBlID09PSAnb2JqZWN0JyAmJiBuZXh0VHlwZSAhPT0gbnVsbCA/IG5leHRUeXBlLiQkdHlwZW9mIDogbnVsbDtcblxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5leHRUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGlubmVyIHR5cGUgeWV0LlxuICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gYXNzdW1lIHRoYXQgdGhlIGxhenkgaW5uZXIgdHlwZSBpcyBzdGFibGUsXG4gICAgICAgICAgICAvLyBhbmQgc28gaXQgaXMgc3VmZmljaWVudCB0byBhdm9pZCByZWNvbmNpbGluZyBpdCBhd2F5LlxuICAgICAgICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIHVud3JhcCBvciBhY3R1YWxseSB1c2UgdGhlIG5ldyBsYXp5IHR5cGUuXG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IGlmIGl0IHdhcyBidXQgY2FuIG5vIGxvbmdlciBiZSBzaW1wbGUsXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGRuJ3Qgc2V0IHRoaXMuXG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBDaGVjayBpZiBib3RoIHR5cGVzIGhhdmUgYSBmYW1pbHkgYW5kIGl0J3MgdGhlIHNhbWUgb25lLlxuXG5cbiAgICBpZiAobmVlZHNDb21wYXJlRmFtaWxpZXMpIHtcbiAgICAgIC8vIE5vdGU6IG1lbW8oKSBhbmQgZm9yd2FyZFJlZigpIHdlJ2xsIGNvbXBhcmUgb3V0ZXIgcmF0aGVyIHRoYW4gaW5uZXIgdHlwZS5cbiAgICAgIC8vIFRoaXMgbWVhbnMgYm90aCBvZiB0aGVtIG5lZWQgdG8gYmUgcmVnaXN0ZXJlZCB0byBwcmVzZXJ2ZSBzdGF0ZS5cbiAgICAgIC8vIElmIHdlIHVud3JhcHBlZCBhbmQgY29tcGFyZWQgdGhlIGlubmVyIHR5cGVzIGZvciB3cmFwcGVycyBpbnN0ZWFkLFxuICAgICAgLy8gdGhlbiB3ZSB3b3VsZCByaXNrIGZhbHNlbHkgc2F5aW5nIHR3byBzZXBhcmF0ZSBtZW1vKEZvbylcbiAgICAgIC8vIGNhbGxzIGFyZSBlcXVpdmFsZW50IGJlY2F1c2UgdGhleSB3cmFwIHRoZSBzYW1lIEZvbyBmdW5jdGlvbi5cbiAgICAgIHZhciBwcmV2RmFtaWx5ID0gcmVzb2x2ZUZhbWlseShwcmV2VHlwZSk7XG5cbiAgICAgIGlmIChwcmV2RmFtaWx5ICE9PSB1bmRlZmluZWQgJiYgcHJldkZhbWlseSA9PT0gcmVzb2x2ZUZhbWlseShuZXh0VHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcikge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBXZWFrU2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMgPT09IG51bGwpIHtcbiAgICAgIGZhaWxlZEJvdW5kYXJpZXMgPSBuZXcgV2Vha1NldCgpO1xuICAgIH1cblxuICAgIGZhaWxlZEJvdW5kYXJpZXMuYWRkKGZpYmVyKTtcbiAgfVxufVxudmFyIHNjaGVkdWxlUmVmcmVzaCA9IGZ1bmN0aW9uIChyb290LCB1cGRhdGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzdGFsZUZhbWlsaWVzID0gdXBkYXRlLnN0YWxlRmFtaWxpZXMsXG4gICAgICAgIHVwZGF0ZWRGYW1pbGllcyA9IHVwZGF0ZS51cGRhdGVkRmFtaWxpZXM7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY2hlZHVsZVJvb3QgPSBmdW5jdGlvbiAocm9vdCwgZWxlbWVudCkge1xuICB7XG4gICAgaWYgKHJvb3QuY29udGV4dCAhPT0gZW1wdHlDb250ZXh0T2JqZWN0KSB7XG4gICAgICAvLyBTdXBlciBlZGdlIGNhc2U6IHJvb3QgaGFzIGEgbGVnYWN5IF9yZW5kZXJTdWJ0cmVlIGNvbnRleHRcbiAgICAgIC8vIGJ1dCB3ZSBkb24ndCBrbm93IHRoZSBwYXJlbnRDb21wb25lbnQgc28gd2UgY2FuJ3QgcGFzcyBpdC5cbiAgICAgIC8vIEp1c3QgaWdub3JlLiBXZSdsbCBkZWxldGUgdGhpcyB3aXRoIF9yZW5kZXJTdWJ0cmVlIGNvZGUgcGF0aCBsYXRlci5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCByb290LCBudWxsLCBudWxsKTtcbiAgICB9KTtcbiAgfVxufTtcblxuZnVuY3Rpb24gc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShmaWJlciwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKSB7XG4gIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlLFxuICAgICAgICBjaGlsZCA9IGZpYmVyLmNoaWxkLFxuICAgICAgICBzaWJsaW5nID0gZmliZXIuc2libGluZyxcbiAgICAgICAgdGFnID0gZmliZXIudGFnLFxuICAgICAgICB0eXBlID0gZmliZXIudHlwZTtcbiAgICB2YXIgY2FuZGlkYXRlVHlwZSA9IG51bGw7XG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZS5yZW5kZXI7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlc29sdmVGYW1pbHkgdG8gYmUgc2V0IGR1cmluZyBob3QgcmVsb2FkLicpO1xuICAgIH1cblxuICAgIHZhciBuZWVkc1JlbmRlciA9IGZhbHNlO1xuICAgIHZhciBuZWVkc1JlbW91bnQgPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseShjYW5kaWRhdGVUeXBlKTtcblxuICAgICAgaWYgKGZhbWlseSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChzdGFsZUZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh1cGRhdGVkRmFtaWxpZXMuaGFzKGZhbWlseSkpIHtcbiAgICAgICAgICBpZiAodGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmVlZHNSZW5kZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzICE9PSBudWxsKSB7XG4gICAgICBpZiAoZmFpbGVkQm91bmRhcmllcy5oYXMoZmliZXIpIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBmYWlsZWRCb3VuZGFyaWVzLmhhcyhhbHRlcm5hdGUpKSB7XG4gICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCkge1xuICAgICAgZmliZXIuX2RlYnVnTmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobmVlZHNSZW1vdW50IHx8IG5lZWRzUmVuZGVyKSB7XG4gICAgICB2YXIgX3Jvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKF9yb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihfcm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsICYmICFuZWVkc1JlbW91bnQpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoY2hpbGQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoc2libGluZywgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCA9IGZ1bmN0aW9uIChyb290LCBmYW1pbGllcykge1xuICB7XG4gICAgdmFyIGhvc3RJbnN0YW5jZXMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHR5cGVzID0gbmV3IFNldChmYW1pbGllcy5tYXAoZnVuY3Rpb24gKGZhbWlseSkge1xuICAgICAgcmV0dXJuIGZhbWlseS5jdXJyZW50O1xuICAgIH0pKTtcbiAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkocm9vdC5jdXJyZW50LCB0eXBlcywgaG9zdEluc3RhbmNlcyk7XG4gICAgcmV0dXJuIGhvc3RJbnN0YW5jZXM7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShmaWJlciwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkLFxuICAgICAgICBzaWJsaW5nID0gZmliZXIuc2libGluZyxcbiAgICAgICAgdGFnID0gZmliZXIudGFnLFxuICAgICAgICB0eXBlID0gZmliZXIudHlwZTtcbiAgICB2YXIgY2FuZGlkYXRlVHlwZSA9IG51bGw7XG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZS5yZW5kZXI7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBkaWRNYXRjaCA9IGZhbHNlO1xuXG4gICAgaWYgKGNhbmRpZGF0ZVR5cGUgIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlcy5oYXMoY2FuZGlkYXRlVHlwZSkpIHtcbiAgICAgICAgZGlkTWF0Y2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaWRNYXRjaCkge1xuICAgICAgLy8gV2UgaGF2ZSBhIG1hdGNoLiBUaGlzIG9ubHkgZHJpbGxzIGRvd24gdG8gdGhlIGNsb3Nlc3QgaG9zdCBjb21wb25lbnRzLlxuICAgICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIHNlYXJjaCBkZWVwZXIgYmVjYXVzZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZ2l2aW5nXG4gICAgICAvLyB2aXN1YWwgZmVlZGJhY2ssIFwiZmxhc2hpbmdcIiBvdXRlcm1vc3QgcGFyZW50IHJlY3RhbmdsZXMgaXMgc3VmZmljaWVudC5cbiAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIG1hdGNoLCBtYXliZSB0aGVyZSB3aWxsIGJlIG9uZSBmdXJ0aGVyIGRvd24gaW4gdGhlIGNoaWxkIHRyZWUuXG4gICAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KGNoaWxkLCB0eXBlcywgaG9zdEluc3RhbmNlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShzaWJsaW5nLCB0eXBlcywgaG9zdEluc3RhbmNlcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBmb3VuZEhvc3RJbnN0YW5jZXMgPSBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpO1xuXG4gICAgaWYgKGZvdW5kSG9zdEluc3RhbmNlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55IGhvc3QgY2hpbGRyZW4sIGZhbGxiYWNrIHRvIGNsb3Nlc3QgaG9zdCBwYXJlbnQuXG5cblxuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgc3dpdGNoIChub2RlLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byByZWFjaCByb290IGZpcnN0LicpO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRDaGlsZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmFsc2U7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIC8vIFdlIGdvdCBhIG1hdGNoLlxuICAgICAgICBmb3VuZEhvc3RJbnN0YW5jZXMgPSB0cnVlO1xuICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZSk7IC8vIFRoZXJlIG1heSBzdGlsbCBiZSBtb3JlLCBzbyBrZWVwIHNlYXJjaGluZy5cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZpYmVyKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEhvc3RJbnN0YW5jZXM7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaWJlcikge1xuICAgICAgICAgIHJldHVybiBmb3VuZEhvc3RJbnN0YW5jZXM7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgaGFzQmFkTWFwUG9seWZpbGw7XG5cbntcbiAgaGFzQmFkTWFwUG9seWZpbGwgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIHZhciBub25FeHRlbnNpYmxlT2JqZWN0ID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgKi9cblxuICAgIG5ldyBNYXAoW1tub25FeHRlbnNpYmxlT2JqZWN0LCBudWxsXV0pO1xuICAgIG5ldyBTZXQoW25vbkV4dGVuc2libGVPYmplY3RdKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAqL1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVE9ETzogQ29uc2lkZXIgd2FybmluZyBhYm91dCBiYWQgcG9seWZpbGxzXG4gICAgaGFzQmFkTWFwUG9seWZpbGwgPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gIC8vIEluc3RhbmNlXG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmtleSA9IGtleTtcbiAgdGhpcy5lbGVtZW50VHlwZSA9IG51bGw7XG4gIHRoaXMudHlwZSA9IG51bGw7XG4gIHRoaXMuc3RhdGVOb2RlID0gbnVsbDsgLy8gRmliZXJcblxuICB0aGlzLnJldHVybiA9IG51bGw7XG4gIHRoaXMuY2hpbGQgPSBudWxsO1xuICB0aGlzLnNpYmxpbmcgPSBudWxsO1xuICB0aGlzLmluZGV4ID0gMDtcbiAgdGhpcy5yZWYgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wcztcbiAgdGhpcy5tZW1vaXplZFByb3BzID0gbnVsbDtcbiAgdGhpcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIHRoaXMubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHRoaXMuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgdGhpcy5tb2RlID0gbW9kZTsgLy8gRWZmZWN0c1xuXG4gIHRoaXMuZmxhZ3MgPSBOb0ZsYWdzO1xuICB0aGlzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMuZGVsZXRpb25zID0gbnVsbDtcbiAgdGhpcy5sYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuYWx0ZXJuYXRlID0gbnVsbDtcblxuICB7XG4gICAgLy8gTm90ZTogVGhlIGZvbGxvd2luZyBpcyBkb25lIHRvIGF2b2lkIGEgdjggcGVyZm9ybWFuY2UgY2xpZmYuXG4gICAgLy9cbiAgICAvLyBJbml0aWFsaXppbmcgdGhlIGZpZWxkcyBiZWxvdyB0byBzbWlzIGFuZCBsYXRlciB1cGRhdGluZyB0aGVtIHdpdGhcbiAgICAvLyBkb3VibGUgdmFsdWVzIHdpbGwgY2F1c2UgRmliZXJzIHRvIGVuZCB1cCBoYXZpbmcgc2VwYXJhdGUgc2hhcGVzLlxuICAgIC8vIFRoaXMgYmVoYXZpb3IvYnVnIGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCBPYmplY3QucHJldmVudEV4dGVuc2lvbigpLlxuICAgIC8vIEZvcnR1bmF0ZWx5IHRoaXMgb25seSBpbXBhY3RzIERFViBidWlsZHMuXG4gICAgLy8gVW5mb3J0dW5hdGVseSBpdCBtYWtlcyBSZWFjdCB1bnVzYWJseSBzbG93IGZvciBzb21lIGFwcGxpY2F0aW9ucy5cbiAgICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzLCBpbml0aWFsaXplIHRoZSBmaWVsZHMgYmVsb3cgd2l0aCBkb3VibGVzLlxuICAgIC8vXG4gICAgLy8gTGVhcm4gbW9yZSBhYm91dCB0aGlzIGhlcmU6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDM2NVxuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTg1MzhcbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IE51bWJlci5OYU47XG4gICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOOyAvLyBJdCdzIG9rYXkgdG8gcmVwbGFjZSB0aGUgaW5pdGlhbCBkb3VibGVzIHdpdGggc21pcyBhZnRlciBpbml0aWFsaXphdGlvbi5cbiAgICAvLyBUaGlzIHdvbid0IHRyaWdnZXIgdGhlIHBlcmZvcm1hbmNlIGNsaWZmIG1lbnRpb25lZCBhYm92ZSxcbiAgICAvLyBhbmQgaXQgc2ltcGxpZmllcyBvdGhlciBwcm9maWxlciBjb2RlIChpbmNsdWRpbmcgRGV2VG9vbHMpLlxuXG4gICAgdGhpcy5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSAwO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gIH1cblxuICB7XG4gICAgLy8gVGhpcyBpc24ndCBkaXJlY3RseSB1c2VkIGJ1dCBpcyBoYW5keSBmb3IgZGVidWdnaW5nIGludGVybmFsczpcbiAgICB0aGlzLl9kZWJ1Z1NvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdPd25lciA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdOZWVkc1JlbW91bnQgPSBmYWxzZTtcbiAgICB0aGlzLl9kZWJ1Z0hvb2tUeXBlcyA9IG51bGw7XG5cbiAgICBpZiAoIWhhc0JhZE1hcFBvbHlmaWxsICYmIHR5cGVvZiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0aGlzKTtcbiAgICB9XG4gIH1cbn0gLy8gVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCByYXRoZXIgdGhhbiBhIFBPSk8gY29uc3RydWN0b3IsIHN0aWxsXG4vLyBwbGVhc2UgZW5zdXJlIHdlIGRvIHRoZSBmb2xsb3dpbmc6XG4vLyAxKSBOb2JvZHkgc2hvdWxkIGFkZCBhbnkgaW5zdGFuY2UgbWV0aG9kcyBvbiB0aGlzLiBJbnN0YW5jZSBtZXRob2RzIGNhbiBiZVxuLy8gICAgbW9yZSBkaWZmaWN1bHQgdG8gcHJlZGljdCB3aGVuIHRoZXkgZ2V0IG9wdGltaXplZCBhbmQgdGhleSBhcmUgYWxtb3N0XG4vLyAgICBuZXZlciBpbmxpbmVkIHByb3Blcmx5IGluIHN0YXRpYyBjb21waWxlcnMuXG4vLyAyKSBOb2JvZHkgc2hvdWxkIHJlbHkgb24gYGluc3RhbmNlb2YgRmliZXJgIGZvciB0eXBlIHRlc3RpbmcuIFdlIHNob3VsZFxuLy8gICAgYWx3YXlzIGtub3cgd2hlbiBpdCBpcyBhIGZpYmVyLlxuLy8gMykgV2UgbWlnaHQgd2FudCB0byBleHBlcmltZW50IHdpdGggdXNpbmcgbnVtZXJpYyBrZXlzIHNpbmNlIHRoZXkgYXJlIGVhc2llclxuLy8gICAgdG8gb3B0aW1pemUgaW4gYSBub24tSklUIGVudmlyb25tZW50LlxuLy8gNCkgV2UgY2FuIGVhc2lseSBnbyBmcm9tIGEgY29uc3RydWN0b3IgdG8gYSBjcmVhdGVGaWJlciBvYmplY3QgbGl0ZXJhbCBpZiB0aGF0XG4vLyAgICBpcyBmYXN0ZXIuXG4vLyA1KSBJdCBzaG91bGQgYmUgZWFzeSB0byBwb3J0IHRoaXMgdG8gYSBDIHN0cnVjdCBhbmQga2VlcCBhIEMgaW1wbGVtZW50YXRpb25cbi8vICAgIGNvbXBhdGlibGUuXG5cblxudmFyIGNyZWF0ZUZpYmVyID0gZnVuY3Rpb24gKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gJEZsb3dGaXhNZTogdGhlIHNoYXBlcyBhcmUgZXhhY3QgaGVyZSBidXQgRmxvdyBkb2Vzbid0IGxpa2UgY29uc3RydWN0b3JzXG4gIHJldHVybiBuZXcgRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhc2hvdWxkQ29uc3RydWN0JDEodHlwZSkgJiYgdHlwZS5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5Q29tcG9uZW50VGFnKENvbXBvbmVudCkge1xuICBpZiAodHlwZW9mIENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpID8gQ2xhc3NDb21wb25lbnQgOiBGdW5jdGlvbkNvbXBvbmVudDtcbiAgfSBlbHNlIGlmIChDb21wb25lbnQgIT09IHVuZGVmaW5lZCAmJiBDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBDb21wb25lbnQuJCR0eXBlb2Y7XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgIHJldHVybiBGb3J3YXJkUmVmO1xuICAgIH1cblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICByZXR1cm4gTWVtb0NvbXBvbmVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDtcbn0gLy8gVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBhbHRlcm5hdGUgZmliZXIgdG8gZG8gd29yayBvbi5cblxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgcGVuZGluZ1Byb3BzKSB7XG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IGN1cnJlbnQuYWx0ZXJuYXRlO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gbnVsbCkge1xuICAgIC8vIFdlIHVzZSBhIGRvdWJsZSBidWZmZXJpbmcgcG9vbGluZyB0ZWNobmlxdWUgYmVjYXVzZSB3ZSBrbm93IHRoYXQgd2UnbGxcbiAgICAvLyBvbmx5IGV2ZXIgbmVlZCBhdCBtb3N0IHR3byB2ZXJzaW9ucyBvZiBhIHRyZWUuIFdlIHBvb2wgdGhlIFwib3RoZXJcIiB1bnVzZWRcbiAgICAvLyBub2RlIHRoYXQgd2UncmUgZnJlZSB0byByZXVzZS4gVGhpcyBpcyBsYXppbHkgY3JlYXRlZCB0byBhdm9pZCBhbGxvY2F0aW5nXG4gICAgLy8gZXh0cmEgb2JqZWN0cyBmb3IgdGhpbmdzIHRoYXQgYXJlIG5ldmVyIHVwZGF0ZWQuIEl0IGFsc28gYWxsb3cgdXMgdG9cbiAgICAvLyByZWNsYWltIHRoZSBleHRyYSBtZW1vcnkgaWYgbmVlZGVkLlxuICAgIHdvcmtJblByb2dyZXNzID0gY3JlYXRlRmliZXIoY3VycmVudC50YWcsIHBlbmRpbmdQcm9wcywgY3VycmVudC5rZXksIGN1cnJlbnQubW9kZSk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPSBjdXJyZW50LmVsZW1lbnRUeXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudC5zdGF0ZU5vZGU7XG5cbiAgICB7XG4gICAgICAvLyBERVYtb25seSBmaWVsZHNcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZSA9IGN1cnJlbnQuX2RlYnVnU291cmNlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gY3VycmVudC5fZGVidWdIb29rVHlwZXM7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gY3VycmVudDtcbiAgICBjdXJyZW50LmFsdGVybmF0ZSA9IHdvcmtJblByb2dyZXNzO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wczsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBhbHRlcm5hdGUuXG4gICAgLy8gUmVzZXQgdGhlIGVmZmVjdCB0YWcuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IE5vRmxhZ3M7IC8vIFRoZSBlZmZlY3RzIGFyZSBubyBsb25nZXIgdmFsaWQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBXZSBpbnRlbnRpb25hbGx5IHJlc2V0LCByYXRoZXIgdGhhbiBjb3B5LCBhY3R1YWxEdXJhdGlvbiAmIGFjdHVhbFN0YXJ0VGltZS5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgdGltZSBmcm9tIGVuZGxlc3NseSBhY2N1bXVsYXRpbmcgaW4gbmV3IGNvbW1pdHMuXG4gICAgICAvLyBUaGlzIGhhcyB0aGUgZG93bnNpZGUgb2YgcmVzZXR0aW5nIHZhbHVlcyBmb3IgZGlmZmVyZW50IHByaW9yaXR5IHJlbmRlcnMsXG4gICAgICAvLyBCdXQgd29ya3MgZm9yIHlpZWxkaW5nICh0aGUgY29tbW9uIGNhc2UpIGFuZCBzaG91bGQgc3VwcG9ydCByZXN1bWluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIH1cbiAgfSAvLyBSZXNldCBhbGwgZWZmZWN0cyBleGNlcHQgc3RhdGljIG9uZXMuXG4gIC8vIFN0YXRpYyBlZmZlY3RzIGFyZSBub3Qgc3BlY2lmaWMgdG8gYSByZW5kZXIuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGN1cnJlbnQuZmxhZ3MgJiBTdGF0aWNNYXNrO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gY3VycmVudC5jaGlsZExhbmVzO1xuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBDbG9uZSB0aGUgZGVwZW5kZW5jaWVzIG9iamVjdC4gVGhpcyBpcyBtdXRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLCBzb1xuICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuXG5cbiAgdmFyIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudERlcGVuZGVuY2llcyA9PT0gbnVsbCA/IG51bGwgOiB7XG4gICAgbGFuZXM6IGN1cnJlbnREZXBlbmRlbmNpZXMubGFuZXMsXG4gICAgZmlyc3RDb250ZXh0OiBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dFxuICB9OyAvLyBUaGVzZSB3aWxsIGJlIG92ZXJyaWRkZW4gZHVyaW5nIHRoZSBwYXJlbnQncyByZWNvbmNpbGlhdGlvblxuXG4gIHdvcmtJblByb2dyZXNzLnNpYmxpbmcgPSBjdXJyZW50LnNpYmxpbmc7XG4gIHdvcmtJblByb2dyZXNzLmluZGV4ID0gY3VycmVudC5pbmRleDtcbiAgd29ya0luUHJvZ3Jlc3MucmVmID0gY3VycmVudC5yZWY7XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgfVxuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgPSBjdXJyZW50Ll9kZWJ1Z05lZWRzUmVtb3VudDtcblxuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59IC8vIFVzZWQgdG8gcmV1c2UgYSBGaWJlciBmb3IgYSBzZWNvbmQgcGFzcy5cblxuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzcyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyByZXNldHMgdGhlIEZpYmVyIHRvIHdoYXQgY3JlYXRlRmliZXIgb3IgY3JlYXRlV29ya0luUHJvZ3Jlc3Mgd291bGRcbiAgLy8gaGF2ZSBzZXQgdGhlIHZhbHVlcyB0byBiZWZvcmUgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLiBJZGVhbGx5IHRoaXMgd291bGRuJ3RcbiAgLy8gYmUgbmVjZXNzYXJ5IGJ1dCB1bmZvcnR1bmF0ZWx5IG1hbnkgY29kZSBwYXRocyByZWFkcyBmcm9tIHRoZSB3b3JrSW5Qcm9ncmVzc1xuICAvLyB3aGVuIHRoZXkgc2hvdWxkIGJlIHJlYWRpbmcgZnJvbSBjdXJyZW50IGFuZCB3cml0aW5nIHRvIHdvcmtJblByb2dyZXNzLlxuICAvLyBXZSBhc3N1bWUgcGVuZGluZ1Byb3BzLCBpbmRleCwga2V5LCByZWYsIHJldHVybiBhcmUgc3RpbGwgdW50b3VjaGVkIHRvXG4gIC8vIGF2b2lkIGRvaW5nIGFub3RoZXIgcmVjb25jaWxpYXRpb24uXG4gIC8vIFJlc2V0IHRoZSBlZmZlY3QgZmxhZ3MgYnV0IGtlZXAgYW55IFBsYWNlbWVudCB0YWdzLCBzaW5jZSB0aGF0J3Mgc29tZXRoaW5nXG4gIC8vIHRoYXQgY2hpbGQgZmliZXIgaXMgc2V0dGluZywgbm90IHRoZSByZWNvbmNpbGlhdGlvbi5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gU3RhdGljTWFzayB8IFBsYWNlbWVudDsgLy8gVGhlIGVmZmVjdHMgYXJlIG5vIGxvbmdlciB2YWxpZC5cblxuICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFJlc2V0IHRvIGNyZWF0ZUZpYmVyJ3MgaW5pdGlhbCB2YWx1ZXMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBudWxsO1xuXG4gICAge1xuICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbFRpbWUgY291bnRzLiBJdCdzIHVzZWZ1bCB0byBhY2N1bXVsYXRlXG4gICAgICAvLyBhY3R1YWwgdGltZSBhY3Jvc3MgbXVsdGlwbGUgcmVuZGVyIHBhc3Nlcy5cbiAgICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSAwO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlc2V0IHRvIHRoZSBjbG9uZWQgdmFsdWVzIHRoYXQgY3JlYXRlV29ya0luUHJvZ3Jlc3Mgd291bGQndmUuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuXG5cbiAgICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgICAgbGFuZXM6IGN1cnJlbnREZXBlbmRlbmNpZXMubGFuZXMsXG4gICAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gICAgfTtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59XG5mdW5jdGlvbiBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlKSB7XG4gIHZhciBtb2RlO1xuXG4gIGlmICh0YWcgPT09IENvbmN1cnJlbnRSb290KSB7XG4gICAgbW9kZSA9IENvbmN1cnJlbnRNb2RlO1xuXG4gICAgaWYgKGlzU3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgbW9kZSB8PSBTdHJpY3RMZWdhY3lNb2RlO1xuXG4gICAgICB7XG4gICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG1vZGUgPSBOb01vZGU7XG4gIH1cblxuICBpZiAoIGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgLy8gQWx3YXlzIGNvbGxlY3QgcHJvZmlsZSB0aW1pbmdzIHdoZW4gRGV2VG9vbHMgYXJlIHByZXNlbnQuXG4gICAgLy8gVGhpcyBlbmFibGVzIERldlRvb2xzIHRvIHN0YXJ0IGNhcHR1cmluZyB0aW1pbmcgYXQgYW55IHBvaW504oCTXG4gICAgLy8gV2l0aG91dCBzb21lIG5vZGVzIGluIHRoZSB0cmVlIGhhdmluZyBlbXB0eSBiYXNlIHRpbWVzLlxuICAgIG1vZGUgfD0gUHJvZmlsZU1vZGU7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRmliZXIoSG9zdFJvb3QsIG51bGwsIG51bGwsIG1vZGUpO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIC8vIFJlYWN0JEVsZW1lbnRUeXBlXG5rZXksIHBlbmRpbmdQcm9wcywgb3duZXIsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlclRhZyA9IEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7IC8vIFRoZSByZXNvbHZlZCB0eXBlIGlzIHNldCBpZiB3ZSBrbm93IHdoYXQgdGhlIGZpbmFsIHR5cGUgd2lsbCBiZS4gSS5lLiBpdCdzIG5vdCBsYXp5LlxuXG4gIHZhciByZXNvbHZlZFR5cGUgPSB0eXBlO1xuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChzaG91bGRDb25zdHJ1Y3QkMSh0eXBlKSkge1xuICAgICAgZmliZXJUYWcgPSBDbGFzc0NvbXBvbmVudDtcblxuICAgICAge1xuICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcocmVzb2x2ZWRUeXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcocmVzb2x2ZWRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgZmliZXJUYWcgPSBIb3N0Q29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIGdldFRhZzogc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21GcmFnbWVudChwZW5kaW5nUHJvcHMuY2hpbGRyZW4sIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgIGZpYmVyVGFnID0gTW9kZTtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RMZWdhY3lNb2RlO1xuXG4gICAgICAgIGlmICggKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIC8vIFN0cmljdCBlZmZlY3RzIHNob3VsZCBuZXZlciBydW4gb24gbGVnYWN5IHJvb3RzXG4gICAgICAgICAgbW9kZSB8PSBTdHJpY3RFZmZlY3RzTW9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX09GRlNDUkVFTl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9TQ09QRV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9DQUNIRV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9UUkFDSU5HX01BUktFUl9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0UHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjb25zdW1lclxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dENvbnN1bWVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBGb3J3YXJkUmVmO1xuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcocmVzb2x2ZWRUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBNZW1vQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IExhenlDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRUeXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIFwiICsgJ25hbWVkIGltcG9ydHMuJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG93bmVyTmFtZSA9IG93bmVyID8gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lcikgOiBudWxsO1xuXG4gICAgICAgICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgdHlwZSBpcyBpbnZhbGlkOiBleHBlY3RlZCBhIHN0cmluZyAoZm9yIGJ1aWx0LWluICcgKyAnY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSAnICsgKFwiYnV0IGdvdDogXCIgKyAodHlwZSA9PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0eXBlKSArIFwiLlwiICsgaW5mbykpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoZmliZXJUYWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSB0eXBlO1xuICBmaWJlci50eXBlID0gcmVzb2x2ZWRUeXBlO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IG93bmVyO1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCBtb2RlLCBsYW5lcykge1xuICB2YXIgb3duZXIgPSBudWxsO1xuXG4gIHtcbiAgICBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IGVsZW1lbnQucHJvcHM7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCBrZXksIHBlbmRpbmdQcm9wcywgb3duZXIsIG1vZGUsIGxhbmVzKTtcblxuICB7XG4gICAgZmliZXIuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50cywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihGcmFnbWVudCwgZWxlbWVudHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIHBlbmRpbmdQcm9wcy5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdQcm9maWxlciBtdXN0IHNwZWNpZnkgYW4gXCJpZFwiIG9mIHR5cGUgYHN0cmluZ2AgYXMgYSBwcm9wLiBSZWNlaXZlZCB0aGUgdHlwZSBgJXNgIGluc3RlYWQuJywgdHlwZW9mIHBlbmRpbmdQcm9wcy5pZCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoUHJvZmlsZXIsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlIHwgUHJvZmlsZU1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLnN0YXRlTm9kZSA9IHtcbiAgICAgIGVmZmVjdER1cmF0aW9uOiAwLFxuICAgICAgcGFzc2l2ZUVmZmVjdER1cmF0aW9uOiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlQ29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2VMaXN0KHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihTdXNwZW5zZUxpc3RDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoT2Zmc2NyZWVuQ29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfT0ZGU0NSRUVOX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHZhciBwcmltYXJ5Q2hpbGRJbnN0YW5jZSA9IHtcbiAgICBpc0hpZGRlbjogZmFsc2VcbiAgfTtcbiAgZmliZXIuc3RhdGVOb2RlID0gcHJpbWFyeUNoaWxkSW5zdGFuY2U7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVRleHQoY29udGVudCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFRleHQsIGNvbnRlbnQsIG51bGwsIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdENvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSAnREVMRVRFRCc7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbURlaHlkcmF0ZWRGcmFnbWVudChkZWh5ZHJhdGVkTm9kZSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihEZWh5ZHJhdGVkRnJhZ21lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIGZpYmVyLnN0YXRlTm9kZSA9IGRlaHlkcmF0ZWROb2RlO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCBtb2RlLCBsYW5lcykge1xuICB2YXIgcGVuZGluZ1Byb3BzID0gcG9ydGFsLmNoaWxkcmVuICE9PSBudWxsID8gcG9ydGFsLmNoaWxkcmVuIDogW107XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RQb3J0YWwsIHBlbmRpbmdQcm9wcywgcG9ydGFsLmtleSwgbW9kZSk7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIGZpYmVyLnN0YXRlTm9kZSA9IHtcbiAgICBjb250YWluZXJJbmZvOiBwb3J0YWwuY29udGFpbmVySW5mbyxcbiAgICBwZW5kaW5nQ2hpbGRyZW46IG51bGwsXG4gICAgLy8gVXNlZCBieSBwZXJzaXN0ZW50IHVwZGF0ZXNcbiAgICBpbXBsZW1lbnRhdGlvbjogcG9ydGFsLmltcGxlbWVudGF0aW9uXG4gIH07XG4gIHJldHVybiBmaWJlcjtcbn0gLy8gVXNlZCBmb3Igc3Rhc2hpbmcgV0lQIHByb3BlcnRpZXMgdG8gcmVwbGF5IGZhaWxlZCB3b3JrIGluIERFVi5cblxuZnVuY3Rpb24gYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYodGFyZ2V0LCBzb3VyY2UpIHtcbiAgaWYgKHRhcmdldCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgRmliZXIncyBpbml0aWFsIHByb3BlcnRpZXMgd2lsbCBhbHdheXMgYmUgb3ZlcndyaXR0ZW4uXG4gICAgLy8gV2Ugb25seSB1c2UgYSBGaWJlciB0byBlbnN1cmUgdGhlIHNhbWUgaGlkZGVuIGNsYXNzIHNvIERFViBpc24ndCBzbG93LlxuICAgIHRhcmdldCA9IGNyZWF0ZUZpYmVyKEluZGV0ZXJtaW5hdGVDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIH0gLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IHdyaXR0ZW4gYXMgYSBsaXN0IG9mIGFsbCBwcm9wZXJ0aWVzLlxuICAvLyBXZSB0cmllZCB0byB1c2UgT2JqZWN0LmFzc2lnbigpIGluc3RlYWQgYnV0IHRoaXMgaXMgY2FsbGVkIGluXG4gIC8vIHRoZSBob3R0ZXN0IHBhdGgsIGFuZCBPYmplY3QuYXNzaWduKCkgd2FzIHRvbyBzbG93OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyNTAyXG4gIC8vIFRoaXMgY29kZSBpcyBERVYtb25seSBzbyBzaXplIGlzIG5vdCBhIGNvbmNlcm4uXG5cblxuICB0YXJnZXQudGFnID0gc291cmNlLnRhZztcbiAgdGFyZ2V0LmtleSA9IHNvdXJjZS5rZXk7XG4gIHRhcmdldC5lbGVtZW50VHlwZSA9IHNvdXJjZS5lbGVtZW50VHlwZTtcbiAgdGFyZ2V0LnR5cGUgPSBzb3VyY2UudHlwZTtcbiAgdGFyZ2V0LnN0YXRlTm9kZSA9IHNvdXJjZS5zdGF0ZU5vZGU7XG4gIHRhcmdldC5yZXR1cm4gPSBzb3VyY2UucmV0dXJuO1xuICB0YXJnZXQuY2hpbGQgPSBzb3VyY2UuY2hpbGQ7XG4gIHRhcmdldC5zaWJsaW5nID0gc291cmNlLnNpYmxpbmc7XG4gIHRhcmdldC5pbmRleCA9IHNvdXJjZS5pbmRleDtcbiAgdGFyZ2V0LnJlZiA9IHNvdXJjZS5yZWY7XG4gIHRhcmdldC5wZW5kaW5nUHJvcHMgPSBzb3VyY2UucGVuZGluZ1Byb3BzO1xuICB0YXJnZXQubWVtb2l6ZWRQcm9wcyA9IHNvdXJjZS5tZW1vaXplZFByb3BzO1xuICB0YXJnZXQudXBkYXRlUXVldWUgPSBzb3VyY2UudXBkYXRlUXVldWU7XG4gIHRhcmdldC5tZW1vaXplZFN0YXRlID0gc291cmNlLm1lbW9pemVkU3RhdGU7XG4gIHRhcmdldC5kZXBlbmRlbmNpZXMgPSBzb3VyY2UuZGVwZW5kZW5jaWVzO1xuICB0YXJnZXQubW9kZSA9IHNvdXJjZS5tb2RlO1xuICB0YXJnZXQuZmxhZ3MgPSBzb3VyY2UuZmxhZ3M7XG4gIHRhcmdldC5zdWJ0cmVlRmxhZ3MgPSBzb3VyY2Uuc3VidHJlZUZsYWdzO1xuICB0YXJnZXQuZGVsZXRpb25zID0gc291cmNlLmRlbGV0aW9ucztcbiAgdGFyZ2V0LmxhbmVzID0gc291cmNlLmxhbmVzO1xuICB0YXJnZXQuY2hpbGRMYW5lcyA9IHNvdXJjZS5jaGlsZExhbmVzO1xuICB0YXJnZXQuYWx0ZXJuYXRlID0gc291cmNlLmFsdGVybmF0ZTtcblxuICB7XG4gICAgdGFyZ2V0LmFjdHVhbER1cmF0aW9uID0gc291cmNlLmFjdHVhbER1cmF0aW9uO1xuICAgIHRhcmdldC5hY3R1YWxTdGFydFRpbWUgPSBzb3VyY2UuYWN0dWFsU3RhcnRUaW1lO1xuICAgIHRhcmdldC5zZWxmQmFzZUR1cmF0aW9uID0gc291cmNlLnNlbGZCYXNlRHVyYXRpb247XG4gICAgdGFyZ2V0LnRyZWVCYXNlRHVyYXRpb24gPSBzb3VyY2UudHJlZUJhc2VEdXJhdGlvbjtcbiAgfVxuXG4gIHRhcmdldC5fZGVidWdTb3VyY2UgPSBzb3VyY2UuX2RlYnVnU291cmNlO1xuICB0YXJnZXQuX2RlYnVnT3duZXIgPSBzb3VyY2UuX2RlYnVnT3duZXI7XG4gIHRhcmdldC5fZGVidWdOZWVkc1JlbW91bnQgPSBzb3VyY2UuX2RlYnVnTmVlZHNSZW1vdW50O1xuICB0YXJnZXQuX2RlYnVnSG9va1R5cGVzID0gc291cmNlLl9kZWJ1Z0hvb2tUeXBlcztcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcikge1xuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5jb250YWluZXJJbmZvID0gY29udGFpbmVySW5mbztcbiAgdGhpcy5wZW5kaW5nQ2hpbGRyZW4gPSBudWxsO1xuICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICB0aGlzLnBpbmdDYWNoZSA9IG51bGw7XG4gIHRoaXMuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgdGhpcy50aW1lb3V0SGFuZGxlID0gbm9UaW1lb3V0O1xuICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdDb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5jYWxsYmFja05vZGUgPSBudWxsO1xuICB0aGlzLmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7XG4gIHRoaXMuZXZlbnRUaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9MYW5lcyk7XG4gIHRoaXMuZXhwaXJhdGlvblRpbWVzID0gY3JlYXRlTGFuZU1hcChOb1RpbWVzdGFtcCk7XG4gIHRoaXMucGVuZGluZ0xhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmV4cGlyZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMubXV0YWJsZVJlYWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZW50YW5nbGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlbWVudHMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmlkZW50aWZpZXJQcmVmaXggPSBpZGVudGlmaWVyUHJlZml4O1xuICB0aGlzLm9uUmVjb3ZlcmFibGVFcnJvciA9IG9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICB7XG4gICAgdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICB0aGlzLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gIH1cblxuICB7XG4gICAgdGhpcy5tZW1vaXplZFVwZGF0ZXJzID0gbmV3IFNldCgpO1xuICAgIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gdGhpcy5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgVG90YWxMYW5lczsgX2krKykge1xuICAgICAgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcC5wdXNoKG5ldyBTZXQoKSk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIENvbmN1cnJlbnRSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gaHlkcmF0ZSA/ICdoeWRyYXRlUm9vdCgpJyA6ICdjcmVhdGVSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBMZWdhY3lSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gaHlkcmF0ZSA/ICdoeWRyYXRlKCknIDogJ3JlbmRlcigpJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIC8vIFRPRE86IFdlIGhhdmUgc2V2ZXJhbCBvZiB0aGVzZSBhcmd1bWVudHMgdGhhdCBhcmUgY29uY2VwdHVhbGx5IHBhcnQgb2YgdGhlXG4vLyBob3N0IGNvbmZpZywgYnV0IGJlY2F1c2UgdGhleSBhcmUgcGFzc2VkIGluIGF0IHJ1bnRpbWUsIHdlIGhhdmUgdG8gdGhyZWFkXG4vLyB0aGVtIHRocm91Z2ggdGhlIHJvb3QgY29uc3RydWN0b3IuIFBlcmhhcHMgd2Ugc2hvdWxkIHB1dCB0aGVtIGFsbCBpbnRvIGFcbi8vIHNpbmdsZSB0eXBlLCBsaWtlIGEgRHluYW1pY0hvc3RDb25maWcgdGhhdCBpcyBkZWZpbmVkIGJ5IHRoZSByZW5kZXJlci5cbmlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgcm9vdCA9IG5ldyBGaWJlclJvb3ROb2RlKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgLy8gc3RhdGVOb2RlIGlzIGFueS5cblxuXG4gIHZhciB1bmluaXRpYWxpemVkRmliZXIgPSBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZywgaXNTdHJpY3RNb2RlKTtcbiAgcm9vdC5jdXJyZW50ID0gdW5pbml0aWFsaXplZEZpYmVyO1xuICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDtcblxuICB7XG4gICAgdmFyIF9pbml0aWFsU3RhdGUgPSB7XG4gICAgICBlbGVtZW50OiBpbml0aWFsQ2hpbGRyZW4sXG4gICAgICBpc0RlaHlkcmF0ZWQ6IGh5ZHJhdGUsXG4gICAgICBjYWNoZTogbnVsbCxcbiAgICAgIC8vIG5vdCBlbmFibGVkIHlldFxuICAgICAgdHJhbnNpdGlvbnM6IG51bGwsXG4gICAgICBwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOiBudWxsXG4gICAgfTtcbiAgICB1bmluaXRpYWxpemVkRmliZXIubWVtb2l6ZWRTdGF0ZSA9IF9pbml0aWFsU3RhdGU7XG4gIH1cblxuICBpbml0aWFsaXplVXBkYXRlUXVldWUodW5pbml0aWFsaXplZEZpYmVyKTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTguMy4xJztcblxuZnVuY3Rpb24gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXJJbmZvLCAvLyBUT0RPOiBmaWd1cmUgb3V0IHRoZSBBUEkgZm9yIGNyb3NzLXJlbmRlcmVyIGltcGxlbWVudGF0aW9uLlxuaW1wbGVtZW50YXRpb24pIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB7XG4gICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihrZXkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvdyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgUG9ydGFsXG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BPUlRBTF9UWVBFLFxuICAgIGtleToga2V5ID09IG51bGwgPyBudWxsIDogJycgKyBrZXksXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgIGNvbnRhaW5lckluZm86IGNvbnRhaW5lckluZm8sXG4gICAgaW1wbGVtZW50YXRpb246IGltcGxlbWVudGF0aW9uXG4gIH07XG59XG5cbnZhciBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzO1xudmFyIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlO1xuXG57XG4gIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGUgPSB7fTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KSB7XG4gIGlmICghcGFyZW50Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgfVxuXG4gIHZhciBmaWJlciA9IGdldChwYXJlbnRDb21wb25lbnQpO1xuICB2YXIgcGFyZW50Q29udGV4dCA9IGZpbmRDdXJyZW50VW5tYXNrZWRDb250ZXh0KGZpYmVyKTtcblxuICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgIHZhciBDb21wb25lbnQgPSBmaWJlci50eXBlO1xuXG4gICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCBDb21wb25lbnQsIHBhcmVudENvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJlbnRDb250ZXh0O1xufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlV2l0aFdhcm5pbmcoY29tcG9uZW50LCBtZXRob2ROYW1lKSB7XG4gIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICAgIGlmIChmaWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGNvbXBvbmVudCkuam9pbignLCcpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiBcIiArIGtleXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaG9zdEZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGhvc3RGaWJlcik7XG5cbiAgICAgICAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCBpcyBpbnNpZGUgU3RyaWN0TW9kZS4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCByZW5kZXJzIFN0cmljdE1vZGUgY2hpbGRyZW4uICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAvLyBJZGVhbGx5IHRoaXMgc2hvdWxkIHJlc2V0IHRvIHByZXZpb3VzIGJ1dCB0aGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgaW5cbiAgICAgICAgICAvLyByZW5kZXIgYW5kIHRoZXJlJ3MgYW5vdGhlciB3YXJuaW5nIGZvciB0aGF0IGFueXdheS5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgICAgc2V0Q3VycmVudEZpYmVyKHByZXZpb3VzRmliZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIGh5ZHJhdGUgPSBmYWxzZTtcbiAgdmFyIGluaXRpYWxDaGlsZHJlbiA9IG51bGw7XG4gIHJldHVybiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xufVxuZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgLy8gVE9ETzogUmVtb3ZlIGBjYWxsYmFja2Agd2hlbiB3ZSBkZWxldGUgbGVnYWN5IG1vZGUuXG5jYWxsYmFjaywgY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBoeWRyYXRlID0gdHJ1ZTtcbiAgdmFyIHJvb3QgPSBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpOyAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gRmliZXJSb290IGNvbnN0cnVjdG9yXG5cbiAgcm9vdC5jb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUobnVsbCk7IC8vIFNjaGVkdWxlIHRoZSBpbml0aWFsIHJlbmRlci4gSW4gYSBoeWRyYXRpb24gcm9vdCwgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbVxuICAvLyBhIHJlZ3VsYXIgdXBkYXRlIGJlY2F1c2UgdGhlIGluaXRpYWwgcmVuZGVyIG11c3QgbWF0Y2ggd2FzIHdhcyByZW5kZXJlZFxuICAvLyBvbiB0aGUgc2VydmVyLlxuICAvLyBOT1RFOiBUaGlzIHVwZGF0ZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgaGF2ZSBhIHBheWxvYWQuIFdlJ3JlIG9ubHkgdXNpbmdcbiAgLy8gdGhlIHVwZGF0ZSB0byBzY2hlZHVsZSB3b3JrIG9uIHRoZSByb290IGZpYmVyIChhbmQsIGZvciBsZWdhY3kgcm9vdHMsIHRvXG4gIC8vIGVucXVldWUgdGhlIGNhbGxiYWNrIGlmIG9uZSBpcyBwcm92aWRlZCkuXG5cbiAgdmFyIGN1cnJlbnQgPSByb290LmN1cnJlbnQ7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCk7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCA/IGNhbGxiYWNrIDogbnVsbDtcbiAgZW5xdWV1ZVVwZGF0ZShjdXJyZW50LCB1cGRhdGUsIGxhbmUpO1xuICBzY2hlZHVsZUluaXRpYWxIeWRyYXRpb25PblJvb3Qocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5mdW5jdGlvbiB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBvblNjaGVkdWxlUm9vdChjb250YWluZXIsIGVsZW1lbnQpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnQkMSA9IGNvbnRhaW5lci5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGN1cnJlbnQkMSk7XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSk7XG4gIH1cblxuICB2YXIgY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCk7XG5cbiAgaWYgKGNvbnRhaW5lci5jb250ZXh0ID09PSBudWxsKSB7XG4gICAgY29udGFpbmVyLmNvbnRleHQgPSBjb250ZXh0O1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5wZW5kaW5nQ29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmIGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSB0cnVlO1xuXG4gICAgICBlcnJvcignUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7ICcgKyAndHJpZ2dlcmluZyBuZXN0ZWQgY29tcG9uZW50IHVwZGF0ZXMgZnJvbSByZW5kZXIgaXMgbm90IGFsbG93ZWQuICcgKyAnSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluIGNvbXBvbmVudERpZFVwZGF0ZS5cXG5cXG4nICsgJ0NoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudCkgfHwgJ1Vua25vd24nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG4gIHVwZGF0ZS5wYXlsb2FkID0ge1xuICAgIGVsZW1lbnQ6IGVsZW1lbnRcbiAgfTtcbiAgY2FsbGJhY2sgPSBjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrO1xuXG4gIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICB9XG5cbiAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQkMSwgdXBkYXRlLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBjdXJyZW50JDEsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBjdXJyZW50JDEsIGxhbmUpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRQdWJsaWNSb290SW5zdGFuY2UoY29udGFpbmVyKSB7XG4gIHZhciBjb250YWluZXJGaWJlciA9IGNvbnRhaW5lci5jdXJyZW50O1xuXG4gIGlmICghY29udGFpbmVyRmliZXIuY2hpbGQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoY29udGFpbmVyRmliZXIuY2hpbGQudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZTtcbiAgfVxufVxuZnVuY3Rpb24gYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uJDEoZmliZXIpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIC8vIEZsdXNoIHRoZSBmaXJzdCBzY2hlZHVsZWQgXCJ1cGRhdGVcIi5cbiAgICAgICAgICB2YXIgbGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlQZW5kaW5nTGFuZXMocm9vdCk7XG4gICAgICAgICAgZmx1c2hSb290KHJvb3QsIGxhbmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7IC8vIElmIHdlJ3JlIHN0aWxsIGJsb2NrZWQgYWZ0ZXIgdGhpcywgd2UgbmVlZCB0byBpbmNyZWFzZVxuICAgICAgICAvLyB0aGUgcHJpb3JpdHkgb2YgYW55IHByb21pc2VzIHJlc29sdmluZyB3aXRoaW4gdGhpc1xuICAgICAgICAvLyBib3VuZGFyeSBzbyB0aGF0IHRoZXkgbmV4dCBhdHRlbXB0IGFsc28gaGFzIGhpZ2hlciBwcmkuXG5cbiAgICAgICAgdmFyIHJldHJ5TGFuZSA9IFN5bmNMYW5lO1xuICAgICAgICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgcmV0cnlMYW5lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSkge1xuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwgJiYgc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBoaWdoZXJQcmlvcml0eUxhbmUoc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUsIHJldHJ5TGFuZSk7XG4gIH1cbn0gLy8gSW5jcmVhc2VzIHRoZSBwcmlvcml0eSBvZiB0aGVuYWJsZXMgd2hlbiB0aGV5IHJlc29sdmUgd2l0aGluIHRoaXMgYm91bmRhcnkuXG5cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSkge1xuICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgbWFya1JldHJ5TGFuZUltcGwoYWx0ZXJuYXRlLCByZXRyeUxhbmUpO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2VcbiAgICAvLyB0aGVpciBwcmlvcml0eSBhbmQgdGhleSBzaG91bGQgbm90IHN1c3BlbmQgb24gSS9PLFxuICAgIC8vIHNpbmNlIHlvdSBoYXZlIHRvIHdyYXAgYW55dGhpbmcgdGhhdCBtaWdodCBzdXNwZW5kIGluXG4gICAgLy8gU3VzcGVuc2UuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGxhbmUgPSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxuXG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSQxKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2VcbiAgICAvLyB0aGVpciBwcmlvcml0eSBvdGhlciB0aGFuIHN5bmNocm9ub3VzbHkgZmx1c2ggaXQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9XG5cbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbnZhciBzaG91bGRFcnJvckltcGwgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRFcnJvcihmaWJlcikge1xuICByZXR1cm4gc2hvdWxkRXJyb3JJbXBsKGZpYmVyKTtcbn1cblxudmFyIHNob3VsZFN1c3BlbmRJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZFN1c3BlbmQoZmliZXIpIHtcbiAgcmV0dXJuIHNob3VsZFN1c3BlbmRJbXBsKGZpYmVyKTtcbn1cbnZhciBvdmVycmlkZUhvb2tTdGF0ZSA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHMgPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IG51bGw7XG52YXIgc2NoZWR1bGVVcGRhdGUgPSBudWxsO1xudmFyIHNldEVycm9ySGFuZGxlciA9IG51bGw7XG52YXIgc2V0U3VzcGVuc2VIYW5kbGVyID0gbnVsbDtcblxue1xuICB2YXIgY29weVdpdGhEZWxldGVJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShrZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRba2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoRGVsZXRlSW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhEZWxldGUgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoRGVsZXRlSW1wbChvYmosIHBhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZUltcGwgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCkge1xuICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gb2xkUGF0aC5sZW5ndGgpIHtcbiAgICAgIHZhciBuZXdLZXkgPSBuZXdQYXRoW2luZGV4XTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgICB1cGRhdGVkW25ld0tleV0gPSB1cGRhdGVkW29sZEtleV07XG5cbiAgICAgIGlmIChpc0FycmF5KHVwZGF0ZWQpKSB7XG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKG9sZEtleSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtvbGRLZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICB1cGRhdGVkW29sZEtleV0gPSBjb3B5V2l0aFJlbmFtZUltcGwoIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICAgIG9ialtvbGRLZXldLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZSA9IGZ1bmN0aW9uIChvYmosIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBpZiAob2xkUGF0aC5sZW5ndGggIT09IG5ld1BhdGgubGVuZ3RoKSB7XG4gICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgb2YgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdQYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBpZiAob2xkUGF0aFtpXSAhPT0gbmV3UGF0aFtpXSkge1xuICAgICAgICAgIHdhcm4oJ2NvcHlXaXRoUmVuYW1lKCkgZXhwZWN0cyBwYXRocyB0byBiZSB0aGUgc2FtZSBleGNlcHQgZm9yIHRoZSBkZWVwZXN0IGtleScpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvcHlXaXRoUmVuYW1lSW1wbChvYmosIG9sZFBhdGgsIG5ld1BhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldEltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCwgdmFsdWUpIHtcbiAgICBpZiAoaW5kZXggPj0gcGF0aC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgdXBkYXRlZFtrZXldID0gY29weVdpdGhTZXRJbXBsKG9ialtrZXldLCBwYXRoLCBpbmRleCArIDEsIHZhbHVlKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXQgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCB2YWx1ZSkge1xuICAgIHJldHVybiBjb3B5V2l0aFNldEltcGwob2JqLCBwYXRoLCAwLCB2YWx1ZSk7XG4gIH07XG5cbiAgdmFyIGZpbmRIb29rID0gZnVuY3Rpb24gKGZpYmVyLCBpZCkge1xuICAgIC8vIEZvciBub3csIHRoZSBcImlkXCIgb2Ygc3RhdGVmdWwgaG9va3MgaXMganVzdCB0aGUgc3RhdGVmdWwgaG9vayBpbmRleC5cbiAgICAvLyBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB3aXRoIGUuZy4gbmVzdGVkIGhvb2tzLlxuICAgIHZhciBjdXJyZW50SG9vayA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoY3VycmVudEhvb2sgIT09IG51bGwgJiYgaWQgPiAwKSB7XG4gICAgICBjdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gICAgICBpZC0tO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50SG9vaztcbiAgfTsgLy8gU3VwcG9ydCBEZXZUb29scyBlZGl0YWJsZSB2YWx1ZXMgZm9yIHVzZVN0YXRlIGFuZCB1c2VSZWR1Y2VyLlxuXG5cbiAgb3ZlcnJpZGVIb29rU3RhdGUgPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoLCB2YWx1ZSkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aFNldChob29rLm1lbW9pemVkU3RhdGUsIHBhdGgsIHZhbHVlKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhEZWxldGUoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhSZW5hbWUoaG9vay5tZW1vaXplZFN0YXRlLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIHByb3BzIGZvciBmdW5jdGlvbiBjb21wb25lbnRzLCBmb3J3YXJkUmVmLCBtZW1vLCBob3N0IGNvbXBvbmVudHMsIGV0Yy5cblxuXG4gIG92ZXJyaWRlUHJvcHMgPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgsIHZhbHVlKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhTZXQoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCwgdmFsdWUpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aERlbGV0ZShmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhSZW5hbWUoZmliZXIubWVtb2l6ZWRQcm9wcywgb2xkUGF0aCwgbmV3UGF0aCk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBzY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBzZXRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkRXJyb3JJbXBsKSB7XG4gICAgc2hvdWxkRXJyb3JJbXBsID0gbmV3U2hvdWxkRXJyb3JJbXBsO1xuICB9O1xuXG4gIHNldFN1c3BlbnNlSGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRTdXNwZW5kSW1wbCkge1xuICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SW50b0RldlRvb2xzKGRldlRvb2xzQ29uZmlnKSB7XG4gIHZhciBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSA9IGRldlRvb2xzQ29uZmlnLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO1xuICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoe1xuICAgIGJ1bmRsZVR5cGU6IGRldlRvb2xzQ29uZmlnLmJ1bmRsZVR5cGUsXG4gICAgdmVyc2lvbjogZGV2VG9vbHNDb25maWcudmVyc2lvbixcbiAgICByZW5kZXJlclBhY2thZ2VOYW1lOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlclBhY2thZ2VOYW1lLFxuICAgIHJlbmRlcmVyQ29uZmlnOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlckNvbmZpZyxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZTogb3ZlcnJpZGVIb29rU3RhdGUsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wczogb3ZlcnJpZGVQcm9wcyxcbiAgICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aDogb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoLFxuICAgIHNldEVycm9ySGFuZGxlcjogc2V0RXJyb3JIYW5kbGVyLFxuICAgIHNldFN1c3BlbnNlSGFuZGxlcjogc2V0U3VzcGVuc2VIYW5kbGVyLFxuICAgIHNjaGVkdWxlVXBkYXRlOiBzY2hlZHVsZVVwZGF0ZSxcbiAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjogZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIsXG4gICAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlIHx8IGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UsXG4gICAgLy8gUmVhY3QgUmVmcmVzaFxuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDogIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSZWZyZXNoOiAgc2NoZWR1bGVSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJvb3Q6ICBzY2hlZHVsZVJvb3QgLFxuICAgIHNldFJlZnJlc2hIYW5kbGVyOiAgc2V0UmVmcmVzaEhhbmRsZXIgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gYXBwZW5kIG93bmVyIHN0YWNrcyB0byBlcnJvciBtZXNzYWdlcyBpbiBERVYgbW9kZS5cbiAgICBnZXRDdXJyZW50RmliZXI6ICBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scyAsXG4gICAgLy8gRW5hYmxlcyBEZXZUb29scyB0byBkZXRlY3QgcmVjb25jaWxlciB2ZXJzaW9uIHJhdGhlciB0aGFuIHJlbmRlcmVyIHZlcnNpb25cbiAgICAvLyB3aGljaCBtYXkgbm90IG1hdGNoIGZvciB0aGlyZCBwYXJ0eSByZW5kZXJlcnMuXG4gICAgcmVjb25jaWxlclZlcnNpb246IFJlYWN0VmVyc2lvblxuICB9KTtcbn1cblxuLyogZ2xvYmFsIHJlcG9ydEVycm9yICovXG5cbnZhciBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yID0gdHlwZW9mIHJlcG9ydEVycm9yID09PSAnZnVuY3Rpb24nID8gLy8gSW4gbW9kZXJuIGJyb3dzZXJzLCByZXBvcnRFcnJvciB3aWxsIGRpc3BhdGNoIGFuIGVycm9yIGV2ZW50LFxuLy8gZW11bGF0aW5nIGFuIHVuY2F1Z2h0IEphdmFTY3JpcHQgZXJyb3IuXG5yZXBvcnRFcnJvciA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAvLyBJbiBvbGRlciBicm93c2VycyBhbmQgdGVzdCBlbnZpcm9ubWVudHMsIGZhbGxiYWNrIHRvIGNvbnNvbGUuZXJyb3IuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcbiAgY29uc29sZVsnZXJyb3InXShlcnJvcik7XG59O1xuXG5mdW5jdGlvbiBSZWFjdERPTVJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBSZWFjdERPTVJvb3QucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcblxuICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBhbiB1bm1vdW50ZWQgcm9vdC4nKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkQ29udGFpbmVyKGFyZ3VtZW50c1sxXSkpIHtcbiAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgY29udGFpbmVyIHRvIHRoZSBzZWNvbmQgYXJndW1lbnQgb2Ygcm9vdC5yZW5kZXIoLi4uKS4gJyArIFwiWW91IGRvbid0IG5lZWQgdG8gcGFzcyBpdCBhZ2FpbiBzaW5jZSB5b3UgYWxyZWFkeSBwYXNzZWQgaXQgdG8gY3JlYXRlIHRoZSByb290LlwiKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignWW91IHBhc3NlZCBhIHNlY29uZCBhcmd1bWVudCB0byByb290LnJlbmRlciguLi4pIGJ1dCBpdCBvbmx5IGFjY2VwdHMgJyArICdvbmUgYXJndW1lbnQuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKHJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhlICcgKyAncm9vdCBjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyBcInJvb3QudW5tb3VudCgpIHRvIGVtcHR5IGEgcm9vdCdzIGNvbnRhaW5lci5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIG51bGwsIG51bGwpO1xufTtcblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCd1bm1vdW50KC4uLik6IGRvZXMgbm90IHN1cHBvcnQgYSBjYWxsYmFjayBhcmd1bWVudC4gJyArICdUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgcmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIGEgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IG51bGw7XG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIHtcbiAgICAgIGlmIChpc0FscmVhZHlSZW5kZXJpbmcoKSkge1xuICAgICAgICBlcnJvcignQXR0ZW1wdGVkIHRvIHN5bmNocm9ub3VzbHkgdW5tb3VudCBhIHJvb3Qgd2hpbGUgUmVhY3Qgd2FzIGFscmVhZHkgJyArICdyZW5kZXJpbmcuIFJlYWN0IGNhbm5vdCBmaW5pc2ggdW5tb3VudGluZyB0aGUgcm9vdCB1bnRpbCB0aGUgJyArICdjdXJyZW50IHJlbmRlciBoYXMgY29tcGxldGVkLCB3aGljaCBtYXkgbGVhZCB0byBhIHJhY2UgY29uZGl0aW9uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIobnVsbCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVSb290KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcik7XG4gIHZhciBpc1N0cmljdE1vZGUgPSBmYWxzZTtcbiAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTtcbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSAnJztcbiAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3I7XG4gIHZhciB0cmFuc2l0aW9uQ2FsbGJhY2tzID0gbnVsbDtcblxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICBpZiAob3B0aW9ucy5oeWRyYXRlKSB7XG4gICAgICAgIHdhcm4oJ2h5ZHJhdGUgdGhyb3VnaCBjcmVhdGVSb290IGlzIGRlcHJlY2F0ZWQuIFVzZSBSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pIGluc3RlYWQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucy4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBKU1ggZWxlbWVudCB0byBjcmVhdGVSb290LiBZb3UgcHJvYmFibHkgbWVhbnQgdG8gJyArICdjYWxsIHJvb3QucmVuZGVyIGluc3RlYWQuICcgKyAnRXhhbXBsZSB1c2FnZTpcXG5cXG4nICsgJyAgbGV0IHJvb3QgPSBjcmVhdGVSb290KGRvbUNvbnRhaW5lcik7XFxuJyArICcgIHJvb3QucmVuZGVyKDxBcHAgLz4pOycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgaXNTdHJpY3RNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pZGVudGlmaWVyUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJhbnNpdGlvbkNhbGxiYWNrcyA9IG9wdGlvbnMudHJhbnNpdGlvbkNhbGxiYWNrcztcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXIsIENvbmN1cnJlbnRSb290LCBudWxsLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuICB2YXIgcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHJldHVybiBuZXcgUmVhY3RET01Sb290KHJvb3QpO1xufVxuXG5mdW5jdGlvbiBSZWFjdERPTUh5ZHJhdGlvblJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVIeWRyYXRpb24odGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCk7XG4gIH1cbn1cblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbiA9IHNjaGVkdWxlSHlkcmF0aW9uO1xuZnVuY3Rpb24gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2h5ZHJhdGVSb290KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcik7XG5cbiAge1xuICAgIGlmIChpbml0aWFsQ2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IoJ011c3QgcHJvdmlkZSBpbml0aWFsIGNoaWxkcmVuIGFzIHNlY29uZCBhcmd1bWVudCB0byBoeWRyYXRlUm9vdC4gJyArICdFeGFtcGxlIHVzYWdlOiBoeWRyYXRlUm9vdChkb21Db250YWluZXIsIDxBcHAgLz4pJyk7XG4gICAgfVxuICB9IC8vIEZvciBub3cgd2UgcmV1c2UgdGhlIHdob2xlIGJhZyBvZiBvcHRpb25zIHNpbmNlIHRoZXkgY29udGFpblxuICAvLyB0aGUgaHlkcmF0aW9uIGNhbGxiYWNrcy5cblxuXG4gIHZhciBoeWRyYXRpb25DYWxsYmFja3MgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDogbnVsbDsgLy8gVE9ETzogRGVsZXRlIHRoaXMgb3B0aW9uXG5cbiAgdmFyIG11dGFibGVTb3VyY2VzID0gb3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaHlkcmF0ZWRTb3VyY2VzIHx8IG51bGw7XG4gIHZhciBpc1N0cmljdE1vZGUgPSBmYWxzZTtcbiAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTtcbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSAnJztcbiAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgaXNTdHJpY3RNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pZGVudGlmaWVyUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgbnVsbCwgY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpOyAvLyBUaGlzIGNhbid0IGJlIGEgY29tbWVudCBub2RlIHNpbmNlIGh5ZHJhdGlvbiBkb2Vzbid0IHdvcmsgb24gY29tbWVudCBub2RlcyBhbnl3YXkuXG5cbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoY29udGFpbmVyKTtcblxuICBpZiAobXV0YWJsZVNvdXJjZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dGFibGVTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IG11dGFibGVTb3VyY2VzW2ldO1xuICAgICAgcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVhY3RET01IeWRyYXRpb25Sb290KHJvb3QpO1xufVxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8ICFkaXNhYmxlQ29tbWVudHNBc0RPTUNvbnRhaW5lcnMgICkpO1xufSAvLyBUT0RPOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiB3aGljaCBhbHNvIGluY2x1ZGVzIGNvbW1lbnQgbm9kZXMuXG4vLyBXZSBvbmx5IHVzZSBpdCBpbiBwbGFjZXMgdGhhdCBhcmUgY3VycmVudGx5IG1vcmUgcmVsYXhlZC5cblxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lckxlZ2FjeShub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAnKSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKSB7XG4gIHtcbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgY29udGFpbmVyLnRhZ05hbWUgJiYgY29udGFpbmVyLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSB7XG4gICAgICBlcnJvcignY3JlYXRlUm9vdCgpOiBDcmVhdGluZyByb290cyBkaXJlY3RseSB3aXRoIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSB1c2luZyBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikpIHtcbiAgICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NLnJlbmRlcigpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0ICcgKyAnaGFzIGFscmVhZHkgYmVlbiBwYXNzZWQgdG8gY3JlYXRlUm9vdCgpIGJlZm9yZS4gSW5zdGVhZCwgY2FsbCAnICsgJ3Jvb3QucmVuZGVyKCkgb24gdGhlIGV4aXN0aW5nIHJvb3QgaW5zdGVhZCBpZiB5b3Ugd2FudCB0byB1cGRhdGUgaXQuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncztcblxue1xuICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciAmJiBjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyLmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlKSB7XG4gICAgICAgIGlmIChob3N0SW5zdGFuY2UucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoaXMgJyArICdjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyAnUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSB0byBlbXB0eSBhIGNvbnRhaW5lci4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0ID0gISFjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgdmFyIGhhc05vblJvb3RSZWFjdENoaWxkID0gISEocm9vdEVsICYmIGdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKSk7XG5cbiAgICBpZiAoaGFzTm9uUm9vdFJlYWN0Q2hpbGQgJiYgIWlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogUmVwbGFjaW5nIFJlYWN0LXJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSBuZXcgcm9vdCAnICsgJ2NvbXBvbmVudC4gSWYgeW91IGludGVuZGVkIHRvIHVwZGF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCAnICsgJ3lvdSBzaG91bGQgaW5zdGVhZCBoYXZlIHRoZSBleGlzdGluZyBjaGlsZHJlbiB1cGRhdGUgdGhlaXIgc3RhdGUgJyArICdhbmQgcmVuZGVyIHRoZSBuZXcgY29tcG9uZW50cyBpbnN0ZWFkIG9mIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyLicpO1xuICAgIH1cblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBjb250YWluZXIudGFnTmFtZSAmJiBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQk9EWScpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoKTogUmVuZGVyaW5nIGNvbXBvbmVudHMgZGlyZWN0bHkgaW50byBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIHJldHVybiBjb250YWluZXIuZG9jdW1lbnRFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wT25SZWNvdmVyYWJsZUVycm9yKCkgey8vIFRoaXMgaXNuJ3QgcmVhY2hhYmxlIGJlY2F1c2Ugb25SZWNvdmVyYWJsZUVycm9yIGlzbid0IGNhbGxlZCBpbiB0aGVcbiAgLy8gbGVnYWN5IEFQSS5cbn1cblxuZnVuY3Rpb24gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2ssIGlzSHlkcmF0aW9uQ29udGFpbmVyKSB7XG4gIGlmIChpc0h5ZHJhdGlvbkNvbnRhaW5lcikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciByb290ID0gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgY2FsbGJhY2ssIGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzXG4gICAgZmFsc2UsIC8vIGlzU3RyaWN0TW9kZVxuICAgIGZhbHNlLCAvLyBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLFxuICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4XG4gICAgbm9vcE9uUmVjb3ZlcmFibGVFcnJvcik7XG4gICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSByb290O1xuICAgIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuICAgIHZhciByb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG4gICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgIGZsdXNoU3luYygpO1xuICAgIHJldHVybiByb290O1xuICB9IGVsc2Uge1xuICAgIC8vIEZpcnN0IGNsZWFyIGFueSBleGlzdGluZyBjb250ZW50LlxuICAgIHZhciByb290U2libGluZztcblxuICAgIHdoaWxlIChyb290U2libGluZyA9IGNvbnRhaW5lci5sYXN0Q2hpbGQpIHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChyb290U2libGluZyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9vcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2UoX3Jvb3QpO1xuXG4gICAgICAgIF9vcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX3Jvb3QgPSBjcmVhdGVDb250YWluZXIoY29udGFpbmVyLCBMZWdhY3lSb290LCBudWxsLCAvLyBoeWRyYXRpb25DYWxsYmFja3NcbiAgICBmYWxzZSwgLy8gaXNTdHJpY3RNb2RlXG4gICAgZmFsc2UsIC8vIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsXG4gICAgJycsIC8vIGlkZW50aWZpZXJQcmVmaXhcbiAgICBub29wT25SZWNvdmVyYWJsZUVycm9yKTtcblxuICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gX3Jvb3Q7XG4gICAgbWFya0NvbnRhaW5lckFzUm9vdChfcm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuXG4gICAgdmFyIF9yb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG5cbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhfcm9vdENvbnRhaW5lckVsZW1lbnQpOyAvLyBJbml0aWFsIG1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBfcm9vdCwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gICAgfSk7XG4gICAgcmV0dXJuIF9yb290O1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBjaGlsZHJlbiwgY29udGFpbmVyLCBmb3JjZUh5ZHJhdGUsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzKGNvbnRhaW5lcik7XG4gICAgd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaywgJ3JlbmRlcicpO1xuICB9XG5cbiAgdmFyIG1heWJlUm9vdCA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICB2YXIgcm9vdDtcblxuICBpZiAoIW1heWJlUm9vdCkge1xuICAgIC8vIEluaXRpYWwgbW91bnRcbiAgICByb290ID0gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaywgZm9yY2VIeWRyYXRlKTtcbiAgfSBlbHNlIHtcbiAgICByb290ID0gbWF5YmVSb290O1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbiAgICAgICAgb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfSAvLyBVcGRhdGVcblxuXG4gICAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG59XG5cbnZhciBkaWRXYXJuQWJvdXRGaW5kRE9NTm9kZSA9IGZhbHNlO1xuZnVuY3Rpb24gZmluZERPTU5vZGUoY29tcG9uZW50T3JFbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dEZpbmRET01Ob2RlKSB7XG4gICAgICBkaWRXYXJuQWJvdXRGaW5kRE9NTm9kZSA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdmaW5kRE9NTm9kZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgJyArICdyZWxlYXNlLiBJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgJyArICd0byByZWZlcmVuY2UuIExlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJyk7XG4gICAgfVxuXG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIkMy5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIHdhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gb3duZXIuc3RhdGVOb2RlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcjtcblxuICAgICAgaWYgKCF3YXJuZWRBYm91dFJlZnNJblJlbmRlcikge1xuICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGZpbmRET01Ob2RlIGluc2lkZSBpdHMgcmVuZGVyKCkuICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3duZXIudHlwZSkgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHtcbiAgICByZXR1cm4gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudE9yRWxlbWVudCwgJ2ZpbmRET01Ob2RlJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLmh5ZHJhdGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiBSZWFjdCAxOC4gVXNlIGh5ZHJhdGVSb290ICcgKyAnaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byB0aGUgbmV3IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgJyArIFwiaWYgaXQncyBydW5uaW5nIFJlYWN0IDE3LiBMZWFybiBcIiArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLmh5ZHJhdGUoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgZWxlbWVudCk/Jyk7XG4gICAgfVxuICB9IC8vIFRPRE86IHRocm93IG9yIHdhcm4gaWYgd2UgY291bGRuJ3QgaHlkcmF0ZT9cblxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBlbGVtZW50LCBjb250YWluZXIsIHRydWUsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHJlbmRlcihlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00ucmVuZGVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBjcmVhdGVSb290ICcgKyAnaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byB0aGUgbmV3IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgJyArIFwiaWYgaXQncyBydW5uaW5nIFJlYWN0IDE3LiBMZWFybiBcIiArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlcigpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC5yZW5kZXIoZWxlbWVudCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgZmFsc2UsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcigpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgJyArICdpbiBSZWFjdCAxOC4gQ29uc2lkZXIgdXNpbmcgYSBwb3J0YWwgaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byAnICsgXCJ0aGUgY3JlYXRlUm9vdCBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzIGlmIGl0J3MgcnVubmluZyBSZWFjdCBcIiArICcxNy4gTGVhcm4gbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyTm9kZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICBpZiAocGFyZW50Q29tcG9uZW50ID09IG51bGwgfHwgIWhhcyhwYXJlbnRDb21wb25lbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwYXJlbnRDb21wb25lbnQgbXVzdCBiZSBhIHZhbGlkIFJlYWN0IENvbXBvbmVudCcpO1xuICB9XG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgZmFsc2UsIGNhbGxiYWNrKTtcbn1cbnZhciBkaWRXYXJuQWJvdXRVbm1vdW50Q29tcG9uZW50QXROb2RlID0gZmFsc2U7XG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRhaW5lcikge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXRVbm1vdW50Q29tcG9uZW50QXROb2RlKSB7XG4gICAgICBkaWRXYXJuQWJvdXRVbm1vdW50Q29tcG9uZW50QXROb2RlID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ3VubW91bnRDb21wb25lbnRBdE5vZGUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSAnICsgJ25leHQgbWFqb3IgcmVsZWFzZS4gU3dpdGNoIHRvIHRoZSBjcmVhdGVSb290IEFQSS4gTGVhcm4gJyArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5tb3VudENvbXBvbmVudEF0Tm9kZSguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnVubW91bnQoKT8nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIpIHtcbiAgICB7XG4gICAgICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgICB2YXIgcmVuZGVyZWRCeURpZmZlcmVudFJlYWN0ID0gcm9vdEVsICYmICFnZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCk7XG5cbiAgICAgIGlmIChyZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QpIHtcbiAgICAgICAgZXJyb3IoXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IGFub3RoZXIgY29weSBvZiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFVubW91bnQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkLlxuXG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgbnVsbCwgY29udGFpbmVyLCBmYWxzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgc2hvdWxkIHByb2JhYmx5IHVzZSBgZGVsZXRlIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyYFxuICAgICAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgfSk7IC8vIElmIHlvdSBjYWxsIHVubW91bnRDb21wb25lbnRBdE5vZGUgdHdpY2UgaW4gcXVpY2sgc3VjY2Vzc2lvbiwgeW91J2xsXG4gICAgLy8gZ2V0IGB0cnVlYCB0d2ljZS4gVGhhdCdzIHByb2JhYmx5IGZpbmU/XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICB2YXIgX3Jvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuXG4gICAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShfcm9vdEVsICYmIGdldEluc3RhbmNlRnJvbU5vZGUoX3Jvb3RFbCkpOyAvLyBDaGVjayBpZiB0aGUgY29udGFpbmVyIGl0c2VsZiBpcyBhIFJlYWN0IHJvb3Qgbm9kZS5cblxuICAgICAgdmFyIGlzQ29udGFpbmVyUmVhY3RSb290ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIucGFyZW50Tm9kZSkgJiYgISFjb250YWluZXIucGFyZW50Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gICAgICBpZiAoaGFzTm9uUm9vdFJlYWN0Q2hpbGQpIHtcbiAgICAgICAgZXJyb3IoXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IFJlYWN0IGFuZCBpcyBub3QgYSB0b3AtbGV2ZWwgY29udGFpbmVyLiAlcycsIGlzQ29udGFpbmVyUmVhY3RSb290ID8gJ1lvdSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgcGFzc2VkIGluIGEgUmVhY3Qgcm9vdCBub2RlIGluc3RlYWQgJyArICdvZiBpdHMgY29udGFpbmVyLicgOiAnSW5zdGVhZCwgaGF2ZSB0aGUgcGFyZW50IGNvbXBvbmVudCB1cGRhdGUgaXRzIHN0YXRlIGFuZCAnICsgJ3JlcmVuZGVyIGluIG9yZGVyIHRvIHJlbW92ZSB0aGlzIGNvbXBvbmVudC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuc2V0QXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiQxKTtcbnNldEF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uJDEpO1xuc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSQxKTtcbnNldEdldEN1cnJlbnRVcGRhdGVQcmlvcml0eShnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkpO1xuc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocnVuV2l0aFByaW9yaXR5KTtcblxue1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIE1hcCBoYXMgbm8gcHJvdG90eXBlXG4gIE1hcC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBTZXQgaGFzIG5vIHByb3RvdHlwZVxuICBTZXQucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuY2xlYXIgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVycm9yKCdSZWFjdCBkZXBlbmRzIG9uIE1hcCBhbmQgU2V0IGJ1aWx0LWluIHR5cGVzLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgfVxufVxuXG5zZXRSZXN0b3JlSW1wbGVtZW50YXRpb24ocmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKTtcbnNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oYmF0Y2hlZFVwZGF0ZXMkMSwgZGlzY3JldGVVcGRhdGVzLCBmbHVzaFN5bmMpO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwkMShjaGlsZHJlbiwgY29udGFpbmVyKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH0gLy8gVE9ETzogcGFzcyBSZWFjdERPTSBwb3J0YWwgaW1wbGVtZW50YXRpb24gYXMgdGhpcmQgYXJndW1lbnRcbiAgLy8gJEZsb3dGaXhNZSBUaGUgRmxvdyB0eXBlIGlzIG9wYXF1ZSBidXQgdGhlcmUncyBubyB3YXkgdG8gYWN0dWFsbHkgY3JlYXRlIGl0LlxuXG5cbiAgcmV0dXJuIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVyLCBudWxsLCBrZXkpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKTtcbn1cblxudmFyIEludGVybmFscyA9IHtcbiAgdXNpbmdDbGllbnRFbnRyeVBvaW50OiBmYWxzZSxcbiAgLy8gS2VlcCBpbiBzeW5jIHdpdGggUmVhY3RUZXN0VXRpbHMuanMuXG4gIC8vIFRoaXMgaXMgYW4gYXJyYXkgZm9yIGJldHRlciBtaW5pZmljYXRpb24uXG4gIEV2ZW50czogW2dldEluc3RhbmNlRnJvbU5vZGUsIGdldE5vZGVGcm9tSW5zdGFuY2UsIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUsIGVucXVldWVTdGF0ZVJlc3RvcmUsIHJlc3RvcmVTdGF0ZUlmTmVlZGVkLCBiYXRjaGVkVXBkYXRlcyQxXVxufTtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdCQxKGNvbnRhaW5lciwgb3B0aW9ucykge1xuICB7XG4gICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICFmYWxzZSkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGNyZWF0ZVJvb3QgZnJvbSBcInJlYWN0LWRvbVwiIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnWW91IHNob3VsZCBpbnN0ZWFkIGltcG9ydCBpdCBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGh5ZHJhdGVSb290JDEoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAge1xuICAgIGlmICghSW50ZXJuYWxzLnVzaW5nQ2xpZW50RW50cnlQb2ludCAmJiAhZmFsc2UpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGltcG9ydGluZyBoeWRyYXRlUm9vdCBmcm9tIFwicmVhY3QtZG9tXCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3Ugc2hvdWxkIGluc3RlYWQgaW1wb3J0IGl0IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKTtcbn0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLlxuLy8gV2FybmluZywgdGhpcyBvcHRzLW91dCBvZiBjaGVja2luZyB0aGUgZnVuY3Rpb24gYm9keS5cblxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5mdW5jdGlvbiBmbHVzaFN5bmMkMShmbikge1xuICB7XG4gICAgaWYgKGlzQWxyZWFkeVJlbmRlcmluZygpKSB7XG4gICAgICBlcnJvcignZmx1c2hTeW5jIHdhcyBjYWxsZWQgZnJvbSBpbnNpZGUgYSBsaWZlY3ljbGUgbWV0aG9kLiBSZWFjdCBjYW5ub3QgJyArICdmbHVzaCB3aGVuIFJlYWN0IGlzIGFscmVhZHkgcmVuZGVyaW5nLiBDb25zaWRlciBtb3ZpbmcgdGhpcyBjYWxsIHRvICcgKyAnYSBzY2hlZHVsZXIgdGFzayBvciBtaWNybyB0YXNrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmbHVzaFN5bmMoZm4pO1xufVxudmFyIGZvdW5kRGV2VG9vbHMgPSBpbmplY3RJbnRvRGV2VG9vbHMoe1xuICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUsXG4gIGJ1bmRsZVR5cGU6ICAxICxcbiAgdmVyc2lvbjogUmVhY3RWZXJzaW9uLFxuICByZW5kZXJlclBhY2thZ2VOYW1lOiAncmVhY3QtZG9tJ1xufSk7XG5cbntcbiAgaWYgKCFmb3VuZERldlRvb2xzICYmIGNhblVzZURPTSAmJiB3aW5kb3cudG9wID09PSB3aW5kb3cuc2VsZikge1xuICAgIC8vIElmIHdlJ3JlIGluIENocm9tZSBvciBGaXJlZm94LCBwcm92aWRlIGEgZG93bmxvYWQgbGluayBpZiBub3QgaW5zdGFsbGVkLlxuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZScpID4gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFZGdlJykgPT09IC0xIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID4gLTEpIHtcbiAgICAgIHZhciBwcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbDsgLy8gRG9uJ3Qgd2FybiBpbiBleG90aWMgY2FzZXMgbGlrZSBjaHJvbWUtZXh0ZW5zaW9uOi8vLlxuXG4gICAgICBpZiAoL14oaHR0cHM/fGZpbGUpOiQvLnRlc3QocHJvdG9jb2wpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcbiAgICAgICAgY29uc29sZS5pbmZvKCclY0Rvd25sb2FkIHRoZSBSZWFjdCBEZXZUb29scyAnICsgJ2ZvciBhIGJldHRlciBkZXZlbG9wbWVudCBleHBlcmllbmNlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycgKyAocHJvdG9jb2wgPT09ICdmaWxlOicgPyAnXFxuWW91IG1pZ2h0IG5lZWQgdG8gdXNlIGEgbG9jYWwgSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgZmlsZTovLyk6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzLWZhcScgOiAnJyksICdmb250LXdlaWdodDpib2xkJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBJbnRlcm5hbHM7XG5leHBvcnRzLmNyZWF0ZVBvcnRhbCA9IGNyZWF0ZVBvcnRhbCQxO1xuZXhwb3J0cy5jcmVhdGVSb290ID0gY3JlYXRlUm9vdCQxO1xuZXhwb3J0cy5maW5kRE9NTm9kZSA9IGZpbmRET01Ob2RlO1xuZXhwb3J0cy5mbHVzaFN5bmMgPSBmbHVzaFN5bmMkMTtcbmV4cG9ydHMuaHlkcmF0ZSA9IGh5ZHJhdGU7XG5leHBvcnRzLmh5ZHJhdGVSb290ID0gaHlkcmF0ZVJvb3QkMTtcbmV4cG9ydHMucmVuZGVyID0gcmVuZGVyO1xuZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbmV4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPSBiYXRjaGVkVXBkYXRlcyQxO1xuZXhwb3J0cy51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciA9IHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBtLmNyZWF0ZVJvb3Q7XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBtLmh5ZHJhdGVSb290O1xufSBlbHNlIHtcbiAgdmFyIGkgPSBtLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBmdW5jdGlvbihjLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5jcmVhdGVSb290KGMsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGZ1bmN0aW9uKGMsIGgsIG8pIHtcbiAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtLmh5ZHJhdGVSb290KGMsIGgsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gY2hlY2tEQ0UoKSB7XG4gIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbiAgaWYgKFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBUaGlzIGJyYW5jaCBpcyB1bnJlYWNoYWJsZSBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWRcbiAgICAvLyBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGNvbmRpdGlvbiBpcyB0cnVlIG9ubHkgaW4gZGV2ZWxvcG1lbnQuXG4gICAgLy8gVGhlcmVmb3JlIGlmIHRoZSBicmFuY2ggaXMgc3RpbGwgaGVyZSwgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIHdhc24ndFxuICAgIC8vIHByb3Blcmx5IGFwcGxpZWQuXG4gICAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBtZXNzYWdlLiBSZWFjdCBEZXZUb29scyByZWxpZXMgb24gaXQuIEFsc28gbWFrZSBzdXJlXG4gICAgLy8gdGhpcyBtZXNzYWdlIGRvZXNuJ3Qgb2NjdXIgZWxzZXdoZXJlIGluIHRoaXMgZnVuY3Rpb24sIG9yIGl0IHdpbGwgY2F1c2VcbiAgICAvLyBhIGZhbHNlIHBvc2l0aXZlLlxuICAgIHRocm93IG5ldyBFcnJvcignXl9eJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29kZSBhYm92ZSBoYXMgYmVlbiBkZWFkIGNvZGUgZWxpbWluYXRlZCAoRENFJ2QpLlxuICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShjaGVja0RDRSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIERldlRvb2xzIHNob3VsZG4ndCBjcmFzaCBSZWFjdCwgbm8gbWF0dGVyIHdoYXQuXG4gICAgLy8gV2Ugc2hvdWxkIHN0aWxsIHJlcG9ydCBpbiBjYXNlIHdlIGJyZWFrIHRoaXMgY29kZS5cbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gRENFIGNoZWNrIHNob3VsZCBoYXBwZW4gYmVmb3JlIFJlYWN0RE9NIGJ1bmRsZSBleGVjdXRlcyBzbyB0aGF0XG4gIC8vIERldlRvb2xzIGNhbiByZXBvcnQgYmFkIG1pbmlmaWNhdGlvbiBkdXJpbmcgaW5qZWN0aW9uLlxuICBjaGVja0RDRSgpO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20uZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHNjaGVkdWxlci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTtcbnZhciBlbmFibGVQcm9maWxpbmcgPSBmYWxzZTtcbnZhciBmcmFtZVlpZWxkTXMgPSA1O1xuXG5mdW5jdGlvbiBwdXNoKGhlYXAsIG5vZGUpIHtcbiAgdmFyIGluZGV4ID0gaGVhcC5sZW5ndGg7XG4gIGhlYXAucHVzaChub2RlKTtcbiAgc2lmdFVwKGhlYXAsIG5vZGUsIGluZGV4KTtcbn1cbmZ1bmN0aW9uIHBlZWsoaGVhcCkge1xuICByZXR1cm4gaGVhcC5sZW5ndGggPT09IDAgPyBudWxsIDogaGVhcFswXTtcbn1cbmZ1bmN0aW9uIHBvcChoZWFwKSB7XG4gIGlmIChoZWFwLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGZpcnN0ID0gaGVhcFswXTtcbiAgdmFyIGxhc3QgPSBoZWFwLnBvcCgpO1xuXG4gIGlmIChsYXN0ICE9PSBmaXJzdCkge1xuICAgIGhlYXBbMF0gPSBsYXN0O1xuICAgIHNpZnREb3duKGhlYXAsIGxhc3QsIDApO1xuICB9XG5cbiAgcmV0dXJuIGZpcnN0O1xufVxuXG5mdW5jdGlvbiBzaWZ0VXAoaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuXG4gIHdoaWxlIChpbmRleCA+IDApIHtcbiAgICB2YXIgcGFyZW50SW5kZXggPSBpbmRleCAtIDEgPj4+IDE7XG4gICAgdmFyIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuXG4gICAgaWYgKGNvbXBhcmUocGFyZW50LCBub2RlKSA+IDApIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgbGFyZ2VyLiBTd2FwIHBvc2l0aW9ucy5cbiAgICAgIGhlYXBbcGFyZW50SW5kZXhdID0gbm9kZTtcbiAgICAgIGhlYXBbaW5kZXhdID0gcGFyZW50O1xuICAgICAgaW5kZXggPSBwYXJlbnRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaWZ0RG93bihoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG4gIHZhciBsZW5ndGggPSBoZWFwLmxlbmd0aDtcbiAgdmFyIGhhbGZMZW5ndGggPSBsZW5ndGggPj4+IDE7XG5cbiAgd2hpbGUgKGluZGV4IDwgaGFsZkxlbmd0aCkge1xuICAgIHZhciBsZWZ0SW5kZXggPSAoaW5kZXggKyAxKSAqIDIgLSAxO1xuICAgIHZhciBsZWZ0ID0gaGVhcFtsZWZ0SW5kZXhdO1xuICAgIHZhciByaWdodEluZGV4ID0gbGVmdEluZGV4ICsgMTtcbiAgICB2YXIgcmlnaHQgPSBoZWFwW3JpZ2h0SW5kZXhdOyAvLyBJZiB0aGUgbGVmdCBvciByaWdodCBub2RlIGlzIHNtYWxsZXIsIHN3YXAgd2l0aCB0aGUgc21hbGxlciBvZiB0aG9zZS5cblxuICAgIGlmIChjb21wYXJlKGxlZnQsIG5vZGUpIDwgMCkge1xuICAgICAgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbGVmdCkgPCAwKSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFwW2luZGV4XSA9IGxlZnQ7XG4gICAgICAgIGhlYXBbbGVmdEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gbGVmdEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBub2RlKSA8IDApIHtcbiAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBjaGlsZCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgLy8gQ29tcGFyZSBzb3J0IGluZGV4IGZpcnN0LCB0aGVuIHRhc2sgaWQuXG4gIHZhciBkaWZmID0gYS5zb3J0SW5kZXggLSBiLnNvcnRJbmRleDtcbiAgcmV0dXJuIGRpZmYgIT09IDAgPyBkaWZmIDogYS5pZCAtIGIuaWQ7XG59XG5cbi8vIFRPRE86IFVzZSBzeW1ib2xzP1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gMTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSAzO1xudmFyIExvd1ByaW9yaXR5ID0gNDtcbnZhciBJZGxlUHJpb3JpdHkgPSA1O1xuXG5mdW5jdGlvbiBtYXJrVGFza0Vycm9yZWQodGFzaywgbXMpIHtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbnZhciBoYXNQZXJmb3JtYW5jZU5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJztcblxuaWYgKGhhc1BlcmZvcm1hbmNlTm93KSB7XG4gIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgbG9jYWxEYXRlID0gRGF0ZTtcbiAgdmFyIGluaXRpYWxUaW1lID0gbG9jYWxEYXRlLm5vdygpO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCkgLSBpbml0aWFsVGltZTtcbiAgfTtcbn0gLy8gTWF4IDMxIGJpdCBpbnRlZ2VyLiBUaGUgbWF4IGludGVnZXIgc2l6ZSBpbiBWOCBmb3IgMzItYml0IHN5c3RlbXMuXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxuXG5cbnZhciBtYXhTaWduZWQzMUJpdEludCA9IDEwNzM3NDE4MjM7IC8vIFRpbWVzIG91dCBpbW1lZGlhdGVseVxuXG52YXIgSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQgPSAtMTsgLy8gRXZlbnR1YWxseSB0aW1lcyBvdXRcblxudmFyIFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVCA9IDI1MDtcbnZhciBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVCA9IDUwMDA7XG52YXIgTE9XX1BSSU9SSVRZX1RJTUVPVVQgPSAxMDAwMDsgLy8gTmV2ZXIgdGltZXMgb3V0XG5cbnZhciBJRExFX1BSSU9SSVRZX1RJTUVPVVQgPSBtYXhTaWduZWQzMUJpdEludDsgLy8gVGFza3MgYXJlIHN0b3JlZCBvbiBhIG1pbiBoZWFwXG5cbnZhciB0YXNrUXVldWUgPSBbXTtcbnZhciB0aW1lclF1ZXVlID0gW107IC8vIEluY3JlbWVudGluZyBpZCBjb3VudGVyLiBVc2VkIHRvIG1haW50YWluIGluc2VydGlvbiBvcmRlci5cblxudmFyIHRhc2tJZENvdW50ZXIgPSAxOyAvLyBQYXVzaW5nIHRoZSBzY2hlZHVsZXIgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG52YXIgY3VycmVudFRhc2sgPSBudWxsO1xudmFyIGN1cnJlbnRQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7IC8vIFRoaXMgaXMgc2V0IHdoaWxlIHBlcmZvcm1pbmcgd29yaywgdG8gcHJldmVudCByZS1lbnRyYW5jZS5cblxudmFyIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbnZhciBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xudmFyIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTsgLy8gQ2FwdHVyZSBsb2NhbCByZWZlcmVuY2VzIHRvIG5hdGl2ZSBBUElzLCBpbiBjYXNlIGEgcG9seWZpbGwgb3ZlcnJpZGVzIHRoZW0uXG5cbnZhciBsb2NhbFNldFRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiBudWxsO1xudmFyIGxvY2FsQ2xlYXJUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IG51bGw7XG52YXIgbG9jYWxTZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyA/IHNldEltbWVkaWF0ZSA6IG51bGw7IC8vIElFIGFuZCBOb2RlLmpzICsganNkb21cblxudmFyIGlzSW5wdXRQZW5kaW5nID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnNjaGVkdWxpbmcgIT09IHVuZGVmaW5lZCAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyAhPT0gdW5kZWZpbmVkID8gbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZykgOiBudWxsO1xuXG5mdW5jdGlvbiBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKSB7XG4gIC8vIENoZWNrIGZvciB0YXNrcyB0aGF0IGFyZSBubyBsb25nZXIgZGVsYXllZCBhbmQgYWRkIHRoZW0gdG8gdGhlIHF1ZXVlLlxuICB2YXIgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gIHdoaWxlICh0aW1lciAhPT0gbnVsbCkge1xuICAgIGlmICh0aW1lci5jYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGltZXIgd2FzIGNhbmNlbGxlZC5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICB9IGVsc2UgaWYgKHRpbWVyLnN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGltZXIgZmlyZWQuIFRyYW5zZmVyIHRvIHRoZSB0YXNrIHF1ZXVlLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgICAgdGltZXIuc29ydEluZGV4ID0gdGltZXIuZXhwaXJhdGlvblRpbWU7XG4gICAgICBwdXNoKHRhc2tRdWV1ZSwgdGltZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1haW5pbmcgdGltZXJzIGFyZSBwZW5kaW5nLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUaW1lb3V0KGN1cnJlbnRUaW1lKSB7XG4gIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCkge1xuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgIT09IG51bGwpIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoV29yayhoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuXG5cbiAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgIC8vIFdlIHNjaGVkdWxlZCBhIHRpbWVvdXQgYnV0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC4gQ2FuY2VsIGl0LlxuICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICB9XG5cbiAgaXNQZXJmb3JtaW5nV29yayA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIGlmIChlbmFibGVQcm9maWxpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICAgICAgICAgIG1hcmtUYXNrRXJyb3JlZChjdXJyZW50VGFzaywgY3VycmVudFRpbWUpO1xuICAgICAgICAgIGN1cnJlbnRUYXNrLmlzUXVldWVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2F0Y2ggaW4gcHJvZCBjb2RlIHBhdGguXG4gICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VGFzayA9IG51bGw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGluaXRpYWxUaW1lO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG5cbiAgd2hpbGUgKGN1cnJlbnRUYXNrICE9PSBudWxsICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICkpIHtcbiAgICBpZiAoY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPiBjdXJyZW50VGltZSAmJiAoIWhhc1RpbWVSZW1haW5pbmcgfHwgc2hvdWxkWWllbGRUb0hvc3QoKSkpIHtcbiAgICAgIC8vIFRoaXMgY3VycmVudFRhc2sgaGFzbid0IGV4cGlyZWQsIGFuZCB3ZSd2ZSByZWFjaGVkIHRoZSBkZWFkbGluZS5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRUYXNrLmNhbGxiYWNrO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBudWxsO1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50VGFzay5wcmlvcml0eUxldmVsO1xuICAgICAgdmFyIGRpZFVzZXJDYWxsYmFja1RpbWVvdXQgPSBjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZTtcblxuICAgICAgdmFyIGNvbnRpbnVhdGlvbkNhbGxiYWNrID0gY2FsbGJhY2soZGlkVXNlckNhbGxiYWNrVGltZW91dCk7XG4gICAgICBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrID09PSBwZWVrKHRhc2tRdWV1ZSkpIHtcbiAgICAgICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG4gIH0gLy8gUmV0dXJuIHdoZXRoZXIgdGhlcmUncyBhZGRpdGlvbmFsIHdvcmtcblxuXG4gIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX25leHQoZXZlbnRIYW5kbGVyKSB7XG4gIHZhciBwcmlvcml0eUxldmVsO1xuXG4gIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgIC8vIFNoaWZ0IGRvd24gdG8gbm9ybWFsIHByaW9yaXR5XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBBbnl0aGluZyBsb3dlciB0aGFuIG5vcm1hbCBwcmlvcml0eSBzaG91bGQgcmVtYWluIGF0IHRoZSBjdXJyZW50IGxldmVsLlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV93cmFwQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgdmFyIHBhcmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGlzIGlzIGEgZm9yayBvZiBydW5XaXRoUHJpb3JpdHksIGlubGluZWQgZm9yIHBlcmZvcm1hbmNlLlxuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHBhcmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICB2YXIgc3RhcnRUaW1lO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCkge1xuICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZGVsYXk7XG5cbiAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lICsgZGVsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0O1xuXG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJRExFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gTE9XX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIHRpbWVvdXQgPSBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gc3RhcnRUaW1lICsgdGltZW91dDtcbiAgdmFyIG5ld1Rhc2sgPSB7XG4gICAgaWQ6IHRhc2tJZENvdW50ZXIrKyxcbiAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCxcbiAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICBleHBpcmF0aW9uVGltZTogZXhwaXJhdGlvblRpbWUsXG4gICAgc29ydEluZGV4OiAtMVxuICB9O1xuXG4gIGlmIChzdGFydFRpbWUgPiBjdXJyZW50VGltZSkge1xuICAgIC8vIFRoaXMgaXMgYSBkZWxheWVkIHRhc2suXG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBzdGFydFRpbWU7XG4gICAgcHVzaCh0aW1lclF1ZXVlLCBuZXdUYXNrKTtcblxuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgPT09IG51bGwgJiYgbmV3VGFzayA9PT0gcGVlayh0aW1lclF1ZXVlKSkge1xuICAgICAgLy8gQWxsIHRhc2tzIGFyZSBkZWxheWVkLCBhbmQgdGhpcyBpcyB0aGUgdGFzayB3aXRoIHRoZSBlYXJsaWVzdCBkZWxheS5cbiAgICAgIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbiBleGlzdGluZyB0aW1lb3V0LlxuICAgICAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IHRydWU7XG4gICAgICB9IC8vIFNjaGVkdWxlIGEgdGltZW91dC5cblxuXG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IGV4cGlyYXRpb25UaW1lO1xuICAgIHB1c2godGFza1F1ZXVlLCBuZXdUYXNrKTtcbiAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWUgd2UgeWllbGQuXG5cblxuICAgIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3VGFzaztcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcGF1c2VFeGVjdXRpb24oKSB7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uKCkge1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkge1xuICByZXR1cm4gcGVlayh0YXNrUXVldWUpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjayh0YXNrKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHlvdSBjYW4ndCByZW1vdmUgYXJiaXRyYXJ5IG5vZGVzIGZyb20gYW5cbiAgLy8gYXJyYXkgYmFzZWQgaGVhcCwgb25seSB0aGUgZmlyc3Qgb25lLilcblxuXG4gIHRhc2suY2FsbGJhY2sgPSBudWxsO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRQcmlvcml0eUxldmVsO1xufVxuXG52YXIgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbnZhciBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xudmFyIHRhc2tUaW1lb3V0SUQgPSAtMTsgLy8gU2NoZWR1bGVyIHBlcmlvZGljYWxseSB5aWVsZHMgaW4gY2FzZSB0aGVyZSBpcyBvdGhlciB3b3JrIG9uIHRoZSBtYWluXG4vLyB0aHJlYWQsIGxpa2UgdXNlciBldmVudHMuIEJ5IGRlZmF1bHQsIGl0IHlpZWxkcyBtdWx0aXBsZSB0aW1lcyBwZXIgZnJhbWUuXG4vLyBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGFsaWduIHdpdGggZnJhbWUgYm91bmRhcmllcywgc2luY2UgbW9zdCB0YXNrcyBkb24ndFxuLy8gbmVlZCB0byBiZSBmcmFtZSBhbGlnbmVkOyBmb3IgdGhvc2UgdGhhdCBkbywgdXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cblxudmFyIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG52YXIgc3RhcnRUaW1lID0gLTE7XG5cbmZ1bmN0aW9uIHNob3VsZFlpZWxkVG9Ib3N0KCkge1xuICB2YXIgdGltZUVsYXBzZWQgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpIC0gc3RhcnRUaW1lO1xuXG4gIGlmICh0aW1lRWxhcHNlZCA8IGZyYW1lSW50ZXJ2YWwpIHtcbiAgICAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIG9ubHkgYmVlbiBibG9ja2VkIGZvciBhIHJlYWxseSBzaG9ydCBhbW91bnQgb2YgdGltZTtcbiAgICAvLyBzbWFsbGVyIHRoYW4gYSBzaW5nbGUgZnJhbWUuIERvbid0IHlpZWxkIHlldC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGhlIG1haW4gdGhyZWFkIGhhcyBiZWVuIGJsb2NrZWQgZm9yIGEgbm9uLW5lZ2xpZ2libGUgYW1vdW50IG9mIHRpbWUuIFdlXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFBhaW50KCkge1xuXG59XG5cbmZ1bmN0aW9uIGZvcmNlRnJhbWVSYXRlKGZwcykge1xuICBpZiAoZnBzIDwgMCB8fCBmcHMgPiAxMjUpIHtcbiAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICBjb25zb2xlWydlcnJvciddKCdmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgJyArICdmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChmcHMgPiAwKSB7XG4gICAgZnJhbWVJbnRlcnZhbCA9IE1hdGguZmxvb3IoMTAwMCAvIGZwcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzZXQgdGhlIGZyYW1lcmF0ZVxuICAgIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG4gIH1cbn1cblxudmFyIHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHNjaGVkdWxlZEhvc3RDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IHRpbWUgc28gd2UgY2FuIG1lYXN1cmUgaG93IGxvbmcgdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gaGFzIGJlZW4gYmxvY2tlZC5cblxuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIHZhciBoYXNUaW1lUmVtYWluaW5nID0gdHJ1ZTsgLy8gSWYgYSBzY2hlZHVsZXIgdGFzayB0aHJvd3MsIGV4aXQgdGhlIGN1cnJlbnQgYnJvd3NlciB0YXNrIHNvIHRoZVxuICAgIC8vIGVycm9yIGNhbiBiZSBvYnNlcnZlZC5cbiAgICAvL1xuICAgIC8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGEgdHJ5LWNhdGNoLCBzaW5jZSB0aGF0IG1ha2VzIHNvbWUgZGVidWdnaW5nXG4gICAgLy8gdGVjaG5pcXVlcyBoYXJkZXIuIEluc3RlYWQsIGlmIGBzY2hlZHVsZWRIb3N0Q2FsbGJhY2tgIGVycm9ycywgdGhlblxuICAgIC8vIGBoYXNNb3JlV29ya2Agd2lsbCByZW1haW4gdHJ1ZSwgYW5kIHdlJ2xsIGNvbnRpbnVlIHRoZSB3b3JrIGxvb3AuXG5cbiAgICB2YXIgaGFzTW9yZVdvcmsgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhhc01vcmVXb3JrID0gc2NoZWR1bGVkSG9zdENhbGxiYWNrKGhhc1RpbWVSZW1haW5pbmcsIGN1cnJlbnRUaW1lKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGhhc01vcmVXb3JrKSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSB3b3JrLCBzY2hlZHVsZSB0aGUgbmV4dCBtZXNzYWdlIGV2ZW50IGF0IHRoZSBlbmRcbiAgICAgICAgLy8gb2YgdGhlIHByZWNlZGluZyBvbmUuXG4gICAgICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICAgICAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICB9IC8vIFlpZWxkaW5nIHRvIHRoZSBicm93c2VyIHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0byBwYWludCwgc28gd2UgY2FuXG59O1xuXG52YXIgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbmlmICh0eXBlb2YgbG9jYWxTZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gTm9kZS5qcyBhbmQgb2xkIElFLlxuICAvLyBUaGVyZSdzIGEgZmV3IHJlYXNvbnMgZm9yIHdoeSB3ZSBwcmVmZXIgc2V0SW1tZWRpYXRlLlxuICAvL1xuICAvLyBVbmxpa2UgTWVzc2FnZUNoYW5uZWwsIGl0IGRvZXNuJ3QgcHJldmVudCBhIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gIC8vIChFdmVuIHRob3VnaCB0aGlzIGlzIGEgRE9NIGZvcmsgb2YgdGhlIFNjaGVkdWxlciwgeW91IGNvdWxkIGdldCBoZXJlXG4gIC8vIHdpdGggYSBtaXggb2YgTm9kZS5qcyAxNSssIHdoaWNoIGhhcyBhIE1lc3NhZ2VDaGFubmVsLCBhbmQganNkb20uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIwNzU2XG4gIC8vXG4gIC8vIEJ1dCBhbHNvLCBpdCBydW5zIGVhcmxpZXIgd2hpY2ggaXMgdGhlIHNlbWFudGljIHdlIHdhbnQuXG4gIC8vIElmIG90aGVyIGJyb3dzZXJzIGV2ZXIgaW1wbGVtZW50IGl0LCBpdCdzIGJldHRlciB0byB1c2UgaXQuXG4gIC8vIEFsdGhvdWdoIGJvdGggb2YgdGhlc2Ugd291bGQgYmUgaW5mZXJpb3IgdG8gbmF0aXZlIHNjaGVkdWxpbmcuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0SW1tZWRpYXRlKHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSk7XG4gIH07XG59IGVsc2UgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gRE9NIGFuZCBXb3JrZXIgZW52aXJvbm1lbnRzLlxuICAvLyBXZSBwcmVmZXIgTWVzc2FnZUNoYW5uZWwgYmVjYXVzZSBvZiB0aGUgNG1zIHNldFRpbWVvdXQgY2xhbXBpbmcuXG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydC5wb3N0TWVzc2FnZShudWxsKTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIFdlIHNob3VsZCBvbmx5IGZhbGxiYWNrIGhlcmUgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldFRpbWVvdXQocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lLCAwKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RDYWxsYmFjayhjYWxsYmFjaykge1xuICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICBpZiAoIWlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSB0cnVlO1xuICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RUaW1lb3V0KGNhbGxiYWNrLCBtcykge1xuICB0YXNrVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayhleHBvcnRzLnVuc3RhYmxlX25vdygpKTtcbiAgfSwgbXMpO1xufVxuXG5mdW5jdGlvbiBjYW5jZWxIb3N0VGltZW91dCgpIHtcbiAgbG9jYWxDbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCk7XG4gIHRhc2tUaW1lb3V0SUQgPSAtMTtcbn1cblxudmFyIHVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHJlcXVlc3RQYWludDtcbnZhciB1bnN0YWJsZV9Qcm9maWxpbmcgPSAgbnVsbDtcblxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5ID0gTG93UHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZyA9IHVuc3RhYmxlX1Byb2ZpbGluZztcbmV4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sgPSB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb24gPSB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmb3JjZUZyYW1lUmF0ZTtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUgPSB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZTtcbmV4cG9ydHMudW5zdGFibGVfbmV4dCA9IHVuc3RhYmxlX25leHQ7XG5leHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uID0gdW5zdGFibGVfcGF1c2VFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHVuc3RhYmxlX3JlcXVlc3RQYWludDtcbmV4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5ID0gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrID0gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBzaG91bGRZaWVsZFRvSG9zdDtcbmV4cG9ydHMudW5zdGFibGVfd3JhcENhbGxiYWNrID0gdW5zdGFibGVfd3JhcENhbGxiYWNrO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEcmFnZ2FibGVDb3JlXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9EcmFnZ2FibGVDb3JlLmRlZmF1bHQ7XG4gIH1cbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfcHJvcFR5cGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSk7XG52YXIgX3JlYWN0RG9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3QtZG9tXCIpKTtcbnZhciBfY2xzeCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsc3hcIikpO1xudmFyIF9kb21GbnMgPSByZXF1aXJlKFwiLi91dGlscy9kb21GbnNcIik7XG52YXIgX3Bvc2l0aW9uRm5zID0gcmVxdWlyZShcIi4vdXRpbHMvcG9zaXRpb25GbnNcIik7XG52YXIgX3NoaW1zID0gcmVxdWlyZShcIi4vdXRpbHMvc2hpbXNcIik7XG52YXIgX0RyYWdnYWJsZUNvcmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0RyYWdnYWJsZUNvcmVcIikpO1xudmFyIF9sb2cgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3V0aWxzL2xvZ1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgdmFyIGNhY2hlTm9kZUludGVyb3AgPSBuZXcgV2Vha01hcCgpOyByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChub2RlSW50ZXJvcCkgeyByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7IH0pKG5vZGVJbnRlcm9wKTsgfVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkgeyBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHsgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpOyByZXR1cm4gdHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmICh0eXBlb2YgcmVzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7IH0gLyo6OiBpbXBvcnQgdHlwZSB7Q29udHJvbFBvc2l0aW9uLCBQb3NpdGlvbk9mZnNldENvbnRyb2xQb3NpdGlvbiwgRHJhZ2dhYmxlQ29yZVByb3BzLCBEcmFnZ2FibGVDb3JlRGVmYXVsdFByb3BzfSBmcm9tICcuL0RyYWdnYWJsZUNvcmUnOyovXG4vKjo6IGltcG9ydCB0eXBlIHtCb3VuZHMsIERyYWdnYWJsZUV2ZW50SGFuZGxlcn0gZnJvbSAnLi91dGlscy90eXBlcyc7Ki9cbi8qOjogaW1wb3J0IHR5cGUge0VsZW1lbnQgYXMgUmVhY3RFbGVtZW50fSBmcm9tICdyZWFjdCc7Ki9cbi8qOjogdHlwZSBEcmFnZ2FibGVTdGF0ZSA9IHtcbiAgZHJhZ2dpbmc6IGJvb2xlYW4sXG4gIGRyYWdnZWQ6IGJvb2xlYW4sXG4gIHg6IG51bWJlciwgeTogbnVtYmVyLFxuICBzbGFja1g6IG51bWJlciwgc2xhY2tZOiBudW1iZXIsXG4gIGlzRWxlbWVudFNWRzogYm9vbGVhbixcbiAgcHJldlByb3BzUG9zaXRpb246ID9Db250cm9sUG9zaXRpb24sXG59OyovXG4vKjo6IGV4cG9ydCB0eXBlIERyYWdnYWJsZURlZmF1bHRQcm9wcyA9IHtcbiAgLi4uRHJhZ2dhYmxlQ29yZURlZmF1bHRQcm9wcyxcbiAgYXhpczogJ2JvdGgnIHwgJ3gnIHwgJ3knIHwgJ25vbmUnLFxuICBib3VuZHM6IEJvdW5kcyB8IHN0cmluZyB8IGZhbHNlLFxuICBkZWZhdWx0Q2xhc3NOYW1lOiBzdHJpbmcsXG4gIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2luZzogc3RyaW5nLFxuICBkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dlZDogc3RyaW5nLFxuICBkZWZhdWx0UG9zaXRpb246IENvbnRyb2xQb3NpdGlvbixcbiAgc2NhbGU6IG51bWJlcixcbn07Ki9cbi8qOjogZXhwb3J0IHR5cGUgRHJhZ2dhYmxlUHJvcHMgPSB7XG4gIC4uLkRyYWdnYWJsZUNvcmVQcm9wcyxcbiAgLi4uRHJhZ2dhYmxlRGVmYXVsdFByb3BzLFxuICBwb3NpdGlvbk9mZnNldDogUG9zaXRpb25PZmZzZXRDb250cm9sUG9zaXRpb24sXG4gIHBvc2l0aW9uOiBDb250cm9sUG9zaXRpb24sXG59OyovXG4vL1xuLy8gRGVmaW5lIDxEcmFnZ2FibGU+XG4vL1xuY2xhc3MgRHJhZ2dhYmxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IC8qOjogPERyYWdnYWJsZVByb3BzLCBEcmFnZ2FibGVTdGF0ZT4qL3tcbiAgLy8gUmVhY3QgMTYuMytcbiAgLy8gQXJpdHkgKHByb3BzLCBzdGF0ZSlcbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhfcmVmIC8qOjogKi8sIF9yZWYyIC8qOjogKi8pIC8qOiA/UGFydGlhbDxEcmFnZ2FibGVTdGF0ZT4qL3tcbiAgICBsZXQge1xuICAgICAgcG9zaXRpb25cbiAgICB9IC8qOiBEcmFnZ2FibGVQcm9wcyovID0gX3JlZiAvKjogRHJhZ2dhYmxlUHJvcHMqLztcbiAgICBsZXQge1xuICAgICAgcHJldlByb3BzUG9zaXRpb25cbiAgICB9IC8qOiBEcmFnZ2FibGVTdGF0ZSovID0gX3JlZjIgLyo6IERyYWdnYWJsZVN0YXRlKi87XG4gICAgLy8gU2V0IHgveSBpZiBhIG5ldyBwb3NpdGlvbiBpcyBwcm92aWRlZCBpbiBwcm9wcyB0aGF0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSBwcmV2aW91cy5cbiAgICBpZiAocG9zaXRpb24gJiYgKCFwcmV2UHJvcHNQb3NpdGlvbiB8fCBwb3NpdGlvbi54ICE9PSBwcmV2UHJvcHNQb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkgIT09IHByZXZQcm9wc1Bvc2l0aW9uLnkpKSB7XG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlOiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgJWonLCB7XG4gICAgICAgIHBvc2l0aW9uLFxuICAgICAgICBwcmV2UHJvcHNQb3NpdGlvblxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBwb3NpdGlvbi54LFxuICAgICAgICB5OiBwb3NpdGlvbi55LFxuICAgICAgICBwcmV2UHJvcHNQb3NpdGlvbjoge1xuICAgICAgICAgIC4uLnBvc2l0aW9uXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0cnVjdG9yKHByb3BzIC8qOiBEcmFnZ2FibGVQcm9wcyovKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uRHJhZ1N0YXJ0XCIsIChlLCBjb3JlRGF0YSkgPT4ge1xuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZTogb25EcmFnU3RhcnQ6ICVqJywgY29yZURhdGEpO1xuXG4gICAgICAvLyBTaG9ydC1jaXJjdWl0IGlmIHVzZXIncyBjYWxsYmFjayBraWxsZWQgaXQuXG4gICAgICBjb25zdCBzaG91bGRTdGFydCA9IHRoaXMucHJvcHMub25TdGFydChlLCAoMCwgX3Bvc2l0aW9uRm5zLmNyZWF0ZURyYWdnYWJsZURhdGEpKHRoaXMsIGNvcmVEYXRhKSk7XG4gICAgICAvLyBLaWxscyBzdGFydCBldmVudCBvbiBjb3JlIGFzIHdlbGwsIHNvIG1vdmUgaGFuZGxlcnMgYXJlIG5ldmVyIGJvdW5kLlxuICAgICAgaWYgKHNob3VsZFN0YXJ0ID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nOiB0cnVlLFxuICAgICAgICBkcmFnZ2VkOiB0cnVlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvbkRyYWdcIiwgKGUsIGNvcmVEYXRhKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc3RhdGUuZHJhZ2dpbmcpIHJldHVybiBmYWxzZTtcbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGU6IG9uRHJhZzogJWonLCBjb3JlRGF0YSk7XG4gICAgICBjb25zdCB1aURhdGEgPSAoMCwgX3Bvc2l0aW9uRm5zLmNyZWF0ZURyYWdnYWJsZURhdGEpKHRoaXMsIGNvcmVEYXRhKTtcbiAgICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICB4OiB1aURhdGEueCxcbiAgICAgICAgeTogdWlEYXRhLnksXG4gICAgICAgIHNsYWNrWDogMCxcbiAgICAgICAgc2xhY2tZOiAwXG4gICAgICB9O1xuXG4gICAgICAvLyBLZWVwIHdpdGhpbiBib3VuZHMuXG4gICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMpIHtcbiAgICAgICAgLy8gU2F2ZSBvcmlnaW5hbCB4IGFuZCB5LlxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeCxcbiAgICAgICAgICB5XG4gICAgICAgIH0gPSBuZXdTdGF0ZTtcblxuICAgICAgICAvLyBBZGQgc2xhY2sgdG8gdGhlIHZhbHVlcyB1c2VkIHRvIGNhbGN1bGF0ZSBib3VuZCBwb3NpdGlvbi4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IGlmXG4gICAgICAgIC8vIHdlIHN0YXJ0IHJlbW92aW5nIHNsYWNrLCB0aGUgZWxlbWVudCB3b24ndCByZWFjdCB0byBpdCByaWdodCBhd2F5IHVudGlsIGl0J3MgYmVlblxuICAgICAgICAvLyBjb21wbGV0ZWx5IHJlbW92ZWQuXG4gICAgICAgIG5ld1N0YXRlLnggKz0gdGhpcy5zdGF0ZS5zbGFja1g7XG4gICAgICAgIG5ld1N0YXRlLnkgKz0gdGhpcy5zdGF0ZS5zbGFja1k7XG5cbiAgICAgICAgLy8gR2V0IGJvdW5kIHBvc2l0aW9uLiBUaGlzIHdpbGwgY2VpbC9mbG9vciB0aGUgeCBhbmQgeSB3aXRoaW4gdGhlIGJvdW5kYXJpZXMuXG4gICAgICAgIGNvbnN0IFtuZXdTdGF0ZVgsIG5ld1N0YXRlWV0gPSAoMCwgX3Bvc2l0aW9uRm5zLmdldEJvdW5kUG9zaXRpb24pKHRoaXMsIG5ld1N0YXRlLngsIG5ld1N0YXRlLnkpO1xuICAgICAgICBuZXdTdGF0ZS54ID0gbmV3U3RhdGVYO1xuICAgICAgICBuZXdTdGF0ZS55ID0gbmV3U3RhdGVZO1xuXG4gICAgICAgIC8vIFJlY2FsY3VsYXRlIHNsYWNrIGJ5IG5vdGluZyBob3cgbXVjaCB3YXMgc2hhdmVkIGJ5IHRoZSBib3VuZFBvc2l0aW9uIGhhbmRsZXIuXG4gICAgICAgIG5ld1N0YXRlLnNsYWNrWCA9IHRoaXMuc3RhdGUuc2xhY2tYICsgKHggLSBuZXdTdGF0ZS54KTtcbiAgICAgICAgbmV3U3RhdGUuc2xhY2tZID0gdGhpcy5zdGF0ZS5zbGFja1kgKyAoeSAtIG5ld1N0YXRlLnkpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgZXZlbnQgd2UgZmlyZSB0byByZWZsZWN0IHdoYXQgcmVhbGx5IGhhcHBlbmVkIGFmdGVyIGJvdW5kcyB0b29rIGVmZmVjdC5cbiAgICAgICAgdWlEYXRhLnggPSBuZXdTdGF0ZS54O1xuICAgICAgICB1aURhdGEueSA9IG5ld1N0YXRlLnk7XG4gICAgICAgIHVpRGF0YS5kZWx0YVggPSBuZXdTdGF0ZS54IC0gdGhpcy5zdGF0ZS54O1xuICAgICAgICB1aURhdGEuZGVsdGFZID0gbmV3U3RhdGUueSAtIHRoaXMuc3RhdGUueTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvcnQtY2lyY3VpdCBpZiB1c2VyJ3MgY2FsbGJhY2sga2lsbGVkIGl0LlxuICAgICAgY29uc3Qgc2hvdWxkVXBkYXRlID0gdGhpcy5wcm9wcy5vbkRyYWcoZSwgdWlEYXRhKTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJvbkRyYWdTdG9wXCIsIChlLCBjb3JlRGF0YSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnN0YXRlLmRyYWdnaW5nKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFNob3J0LWNpcmN1aXQgaWYgdXNlcidzIGNhbGxiYWNrIGtpbGxlZCBpdC5cbiAgICAgIGNvbnN0IHNob3VsZENvbnRpbnVlID0gdGhpcy5wcm9wcy5vblN0b3AoZSwgKDAsIF9wb3NpdGlvbkZucy5jcmVhdGVEcmFnZ2FibGVEYXRhKSh0aGlzLCBjb3JlRGF0YSkpO1xuICAgICAgaWYgKHNob3VsZENvbnRpbnVlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZTogb25EcmFnU3RvcDogJWonLCBjb3JlRGF0YSk7XG4gICAgICBjb25zdCBuZXdTdGF0ZSAvKjogUGFydGlhbDxEcmFnZ2FibGVTdGF0ZT4qLyA9IHtcbiAgICAgICAgZHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgICBzbGFja1g6IDAsXG4gICAgICAgIHNsYWNrWTogMFxuICAgICAgfTtcblxuICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbnRyb2xsZWQgY29tcG9uZW50LCB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uIHdpbGwgYmUgdG9cbiAgICAgIC8vIHJldmVydCBiYWNrIHRvIHRoZSBvbGQgcG9zaXRpb24uIFdlIGV4cGVjdCBhIGhhbmRsZXIgb24gYG9uRHJhZ1N0b3BgLCBhdCB0aGUgbGVhc3QuXG4gICAgICBjb25zdCBjb250cm9sbGVkID0gQm9vbGVhbih0aGlzLnByb3BzLnBvc2l0aW9uKTtcbiAgICAgIGlmIChjb250cm9sbGVkKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHlcbiAgICAgICAgfSA9IHRoaXMucHJvcHMucG9zaXRpb247XG4gICAgICAgIG5ld1N0YXRlLnggPSB4O1xuICAgICAgICBuZXdTdGF0ZS55ID0geTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH0pO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAvLyBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgY3VycmVudGx5IGRyYWdnaW5nLlxuICAgICAgZHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgLy8gV2hldGhlciBvciBub3Qgd2UgaGF2ZSBiZWVuIGRyYWdnZWQgYmVmb3JlLlxuICAgICAgZHJhZ2dlZDogZmFsc2UsXG4gICAgICAvLyBDdXJyZW50IHRyYW5zZm9ybSB4IGFuZCB5LlxuICAgICAgeDogcHJvcHMucG9zaXRpb24gPyBwcm9wcy5wb3NpdGlvbi54IDogcHJvcHMuZGVmYXVsdFBvc2l0aW9uLngsXG4gICAgICB5OiBwcm9wcy5wb3NpdGlvbiA/IHByb3BzLnBvc2l0aW9uLnkgOiBwcm9wcy5kZWZhdWx0UG9zaXRpb24ueSxcbiAgICAgIHByZXZQcm9wc1Bvc2l0aW9uOiB7XG4gICAgICAgIC4uLnByb3BzLnBvc2l0aW9uXG4gICAgICB9LFxuICAgICAgLy8gVXNlZCBmb3IgY29tcGVuc2F0aW5nIGZvciBvdXQtb2YtYm91bmRzIGRyYWdzXG4gICAgICBzbGFja1g6IDAsXG4gICAgICBzbGFja1k6IDAsXG4gICAgICAvLyBDYW4gb25seSBkZXRlcm1pbmUgaWYgU1ZHIGFmdGVyIG1vdW50aW5nXG4gICAgICBpc0VsZW1lbnRTVkc6IGZhbHNlXG4gICAgfTtcbiAgICBpZiAocHJvcHMucG9zaXRpb24gJiYgIShwcm9wcy5vbkRyYWcgfHwgcHJvcHMub25TdG9wKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybignQSBgcG9zaXRpb25gIHdhcyBhcHBsaWVkIHRvIHRoaXMgPERyYWdnYWJsZT4sIHdpdGhvdXQgZHJhZyBoYW5kbGVycy4gVGhpcyB3aWxsIG1ha2UgdGhpcyAnICsgJ2NvbXBvbmVudCBlZmZlY3RpdmVseSB1bmRyYWdnYWJsZS4gUGxlYXNlIGF0dGFjaCBgb25EcmFnYCBvciBgb25TdG9wYCBoYW5kbGVycyBzbyB5b3UgY2FuIGFkanVzdCB0aGUgJyArICdgcG9zaXRpb25gIG9mIHRoaXMgZWxlbWVudC4nKTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBlbGVtZW50IHBhc3NlZCBpcyBhbiBpbnN0YW5jZW9mIFNWR0VsZW1lbnRcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5TVkdFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmZpbmRET01Ob2RlKCkgaW5zdGFuY2VvZiB3aW5kb3cuU1ZHRWxlbWVudCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzRWxlbWVudFNWRzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZHJhZ2dpbmc6IGZhbHNlXG4gICAgfSk7IC8vIHByZXZlbnRzIGludmFyaWFudCBpZiB1bm1vdW50ZWQgd2hpbGUgZHJhZ2dpbmdcbiAgfVxuXG4gIC8vIFJlYWN0IFN0cmljdCBNb2RlIGNvbXBhdGliaWxpdHk6IGlmIGBub2RlUmVmYCBpcyBwYXNzZWQsIHdlIHdpbGwgdXNlIGl0IGluc3RlYWQgb2YgdHJ5aW5nIHRvIGZpbmRcbiAgLy8gdGhlIHVuZGVybHlpbmcgRE9NIG5vZGUgb3Vyc2VsdmVzLiBTZWUgdGhlIFJFQURNRSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgZmluZERPTU5vZGUoKSAvKjogP0hUTUxFbGVtZW50Ki97XG4gICAgdmFyIF90aGlzJHByb3BzJG5vZGVSZWYkYywgX3RoaXMkcHJvcHM7XG4gICAgcmV0dXJuIChfdGhpcyRwcm9wcyRub2RlUmVmJGMgPSAoX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzKSA9PT0gbnVsbCB8fCBfdGhpcyRwcm9wcyA9PT0gdm9pZCAwIHx8IChfdGhpcyRwcm9wcyA9IF90aGlzJHByb3BzLm5vZGVSZWYpID09PSBudWxsIHx8IF90aGlzJHByb3BzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRwcm9wcy5jdXJyZW50KSAhPT0gbnVsbCAmJiBfdGhpcyRwcm9wcyRub2RlUmVmJGMgIT09IHZvaWQgMCA/IF90aGlzJHByb3BzJG5vZGVSZWYkYyA6IF9yZWFjdERvbS5kZWZhdWx0LmZpbmRET01Ob2RlKHRoaXMpO1xuICB9XG4gIHJlbmRlcigpIC8qOiBSZWFjdEVsZW1lbnQ8YW55Piove1xuICAgIGNvbnN0IHtcbiAgICAgIGF4aXMsXG4gICAgICBib3VuZHMsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGRlZmF1bHRQb3NpdGlvbixcbiAgICAgIGRlZmF1bHRDbGFzc05hbWUsXG4gICAgICBkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dpbmcsXG4gICAgICBkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dlZCxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgcG9zaXRpb25PZmZzZXQsXG4gICAgICBzY2FsZSxcbiAgICAgIC4uLmRyYWdnYWJsZUNvcmVQcm9wc1xuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCBzdHlsZSA9IHt9O1xuICAgIGxldCBzdmdUcmFuc2Zvcm0gPSBudWxsO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBjb250cm9sbGVkLCB3ZSBkb24ndCB3YW50IHRvIG1vdmUgaXQgLSB1bmxlc3MgaXQncyBkcmFnZ2luZy5cbiAgICBjb25zdCBjb250cm9sbGVkID0gQm9vbGVhbihwb3NpdGlvbik7XG4gICAgY29uc3QgZHJhZ2dhYmxlID0gIWNvbnRyb2xsZWQgfHwgdGhpcy5zdGF0ZS5kcmFnZ2luZztcbiAgICBjb25zdCB2YWxpZFBvc2l0aW9uID0gcG9zaXRpb24gfHwgZGVmYXVsdFBvc2l0aW9uO1xuICAgIGNvbnN0IHRyYW5zZm9ybU9wdHMgPSB7XG4gICAgICAvLyBTZXQgbGVmdCBpZiBob3Jpem9udGFsIGRyYWcgaXMgZW5hYmxlZFxuICAgICAgeDogKDAsIF9wb3NpdGlvbkZucy5jYW5EcmFnWCkodGhpcykgJiYgZHJhZ2dhYmxlID8gdGhpcy5zdGF0ZS54IDogdmFsaWRQb3NpdGlvbi54LFxuICAgICAgLy8gU2V0IHRvcCBpZiB2ZXJ0aWNhbCBkcmFnIGlzIGVuYWJsZWRcbiAgICAgIHk6ICgwLCBfcG9zaXRpb25GbnMuY2FuRHJhZ1kpKHRoaXMpICYmIGRyYWdnYWJsZSA/IHRoaXMuc3RhdGUueSA6IHZhbGlkUG9zaXRpb24ueVxuICAgIH07XG5cbiAgICAvLyBJZiB0aGlzIGVsZW1lbnQgd2FzIFNWRywgd2UgdXNlIHRoZSBgdHJhbnNmb3JtYCBhdHRyaWJ1dGUuXG4gICAgaWYgKHRoaXMuc3RhdGUuaXNFbGVtZW50U1ZHKSB7XG4gICAgICBzdmdUcmFuc2Zvcm0gPSAoMCwgX2RvbUZucy5jcmVhdGVTVkdUcmFuc2Zvcm0pKHRyYW5zZm9ybU9wdHMsIHBvc2l0aW9uT2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIGEgQ1NTIHRyYW5zZm9ybSB0byBtb3ZlIHRoZSBlbGVtZW50IGFyb3VuZC4gVGhpcyBhbGxvd3MgdXMgdG8gbW92ZSB0aGUgZWxlbWVudCBhcm91bmRcbiAgICAgIC8vIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgd2hldGhlciBvciBub3QgaXQgaXMgcmVsYXRpdmVseSBvciBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQuXG4gICAgICAvLyBJZiB0aGUgaXRlbSB5b3UgYXJlIGRyYWdnaW5nIGFscmVhZHkgaGFzIGEgdHJhbnNmb3JtIHNldCwgd3JhcCBpdCBpbiBhIDxzcGFuPiBzbyA8RHJhZ2dhYmxlPlxuICAgICAgLy8gaGFzIGEgY2xlYW4gc2xhdGUuXG4gICAgICBzdHlsZSA9ICgwLCBfZG9tRm5zLmNyZWF0ZUNTU1RyYW5zZm9ybSkodHJhbnNmb3JtT3B0cywgcG9zaXRpb25PZmZzZXQpO1xuICAgIH1cblxuICAgIC8vIE1hcmsgd2l0aCBjbGFzcyB3aGlsZSBkcmFnZ2luZ1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9ICgwLCBfY2xzeC5kZWZhdWx0KShjaGlsZHJlbi5wcm9wcy5jbGFzc05hbWUgfHwgJycsIGRlZmF1bHRDbGFzc05hbWUsIHtcbiAgICAgIFtkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dpbmddOiB0aGlzLnN0YXRlLmRyYWdnaW5nLFxuICAgICAgW2RlZmF1bHRDbGFzc05hbWVEcmFnZ2VkXTogdGhpcy5zdGF0ZS5kcmFnZ2VkXG4gICAgfSk7XG5cbiAgICAvLyBSZXVzZSB0aGUgY2hpbGQgcHJvdmlkZWRcbiAgICAvLyBUaGlzIG1ha2VzIGl0IGZsZXhpYmxlIHRvIHVzZSB3aGF0ZXZlciBlbGVtZW50IGlzIHdhbnRlZCAoZGl2LCB1bCwgZXRjKVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfRHJhZ2dhYmxlQ29yZS5kZWZhdWx0LCBfZXh0ZW5kcyh7fSwgZHJhZ2dhYmxlQ29yZVByb3BzLCB7XG4gICAgICBvblN0YXJ0OiB0aGlzLm9uRHJhZ1N0YXJ0LFxuICAgICAgb25EcmFnOiB0aGlzLm9uRHJhZyxcbiAgICAgIG9uU3RvcDogdGhpcy5vbkRyYWdTdG9wXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoUmVhY3QuQ2hpbGRyZW4ub25seShjaGlsZHJlbiksIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgLi4uY2hpbGRyZW4ucHJvcHMuc3R5bGUsXG4gICAgICAgIC4uLnN0eWxlXG4gICAgICB9LFxuICAgICAgdHJhbnNmb3JtOiBzdmdUcmFuc2Zvcm1cbiAgICB9KSk7XG4gIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IERyYWdnYWJsZTtcbl9kZWZpbmVQcm9wZXJ0eShEcmFnZ2FibGUsIFwiZGlzcGxheU5hbWVcIiwgJ0RyYWdnYWJsZScpO1xuX2RlZmluZVByb3BlcnR5KERyYWdnYWJsZSwgXCJwcm9wVHlwZXNcIiwge1xuICAvLyBBY2NlcHRzIGFsbCBwcm9wcyA8RHJhZ2dhYmxlQ29yZT4gYWNjZXB0cy5cbiAgLi4uX0RyYWdnYWJsZUNvcmUuZGVmYXVsdC5wcm9wVHlwZXMsXG4gIC8qKlxuICAgKiBgYXhpc2AgZGV0ZXJtaW5lcyB3aGljaCBheGlzIHRoZSBkcmFnZ2FibGUgY2FuIG1vdmUuXG4gICAqXG4gICAqICBOb3RlIHRoYXQgYWxsIGNhbGxiYWNrcyB3aWxsIHN0aWxsIHJldHVybiBkYXRhIGFzIG5vcm1hbC4gVGhpcyBvbmx5XG4gICAqICBjb250cm9scyBmbHVzaGluZyB0byB0aGUgRE9NLlxuICAgKlxuICAgKiAnYm90aCcgYWxsb3dzIG1vdmVtZW50IGhvcml6b250YWxseSBhbmQgdmVydGljYWxseS5cbiAgICogJ3gnIGxpbWl0cyBtb3ZlbWVudCB0byBob3Jpem9udGFsIGF4aXMuXG4gICAqICd5JyBsaW1pdHMgbW92ZW1lbnQgdG8gdmVydGljYWwgYXhpcy5cbiAgICogJ25vbmUnIGxpbWl0cyBhbGwgbW92ZW1lbnQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvICdib3RoJy5cbiAgICovXG4gIGF4aXM6IF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZihbJ2JvdGgnLCAneCcsICd5JywgJ25vbmUnXSksXG4gIC8qKlxuICAgKiBgYm91bmRzYCBkZXRlcm1pbmVzIHRoZSByYW5nZSBvZiBtb3ZlbWVudCBhdmFpbGFibGUgdG8gdGhlIGVsZW1lbnQuXG4gICAqIEF2YWlsYWJsZSB2YWx1ZXMgYXJlOlxuICAgKlxuICAgKiAncGFyZW50JyByZXN0cmljdHMgbW92ZW1lbnQgd2l0aGluIHRoZSBEcmFnZ2FibGUncyBwYXJlbnQgbm9kZS5cbiAgICpcbiAgICogQWx0ZXJuYXRpdmVseSwgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMsIGFsbCBvZiB3aGljaCBhcmUgb3B0aW9uYWw6XG4gICAqXG4gICAqIHtsZWZ0OiBMRUZUX0JPVU5ELCByaWdodDogUklHSFRfQk9VTkQsIGJvdHRvbTogQk9UVE9NX0JPVU5ELCB0b3A6IFRPUF9CT1VORH1cbiAgICpcbiAgICogQWxsIHZhbHVlcyBhcmUgaW4gcHguXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiAgIGxldCBBcHAgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgKiAgICAgICAgIHJldHVybiAoXG4gICAqICAgICAgICAgICAgPERyYWdnYWJsZSBib3VuZHM9e3tyaWdodDogMzAwLCBib3R0b206IDMwMH19PlxuICAgKiAgICAgICAgICAgICAgPGRpdj5Db250ZW50PC9kaXY+XG4gICAqICAgICAgICAgICA8L0RyYWdnYWJsZT5cbiAgICogICAgICAgICApO1xuICAgKiAgICAgICB9XG4gICAqICAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYm91bmRzOiBfcHJvcFR5cGVzLmRlZmF1bHQub25lT2ZUeXBlKFtfcHJvcFR5cGVzLmRlZmF1bHQuc2hhcGUoe1xuICAgIGxlZnQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsXG4gICAgcmlnaHQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsXG4gICAgdG9wOiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLFxuICAgIGJvdHRvbTogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlclxuICB9KSwgX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZywgX3Byb3BUeXBlcy5kZWZhdWx0Lm9uZU9mKFtmYWxzZV0pXSksXG4gIGRlZmF1bHRDbGFzc05hbWU6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIGRlZmF1bHRDbGFzc05hbWVEcmFnZ2luZzogX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZyxcbiAgZGVmYXVsdENsYXNzTmFtZURyYWdnZWQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG4gIC8qKlxuICAgKiBgZGVmYXVsdFBvc2l0aW9uYCBzcGVjaWZpZXMgdGhlIHggYW5kIHkgdGhhdCB0aGUgZHJhZ2dlZCBpdGVtIHNob3VsZCBzdGFydCBhdFxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogICAgICBsZXQgQXBwID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICogICAgICAgICAgICAgIHJldHVybiAoXG4gICAqICAgICAgICAgICAgICAgICAgPERyYWdnYWJsZSBkZWZhdWx0UG9zaXRpb249e3t4OiAyNSwgeTogMjV9fT5cbiAgICogICAgICAgICAgICAgICAgICAgICAgPGRpdj5JIHN0YXJ0IHdpdGggdHJhbnNmb3JtWDogMjVweCBhbmQgdHJhbnNmb3JtWTogMjVweDs8L2Rpdj5cbiAgICogICAgICAgICAgICAgICAgICA8L0RyYWdnYWJsZT5cbiAgICogICAgICAgICAgICAgICk7XG4gICAqICAgICAgICAgIH1cbiAgICogICAgICB9KTtcbiAgICogYGBgXG4gICAqL1xuICBkZWZhdWx0UG9zaXRpb246IF9wcm9wVHlwZXMuZGVmYXVsdC5zaGFwZSh7XG4gICAgeDogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlcixcbiAgICB5OiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyXG4gIH0pLFxuICBwb3NpdGlvbk9mZnNldDogX3Byb3BUeXBlcy5kZWZhdWx0LnNoYXBlKHtcbiAgICB4OiBfcHJvcFR5cGVzLmRlZmF1bHQub25lT2ZUeXBlKFtfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLCBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nXSksXG4gICAgeTogX3Byb3BUeXBlcy5kZWZhdWx0Lm9uZU9mVHlwZShbX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlciwgX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZ10pXG4gIH0pLFxuICAvKipcbiAgICogYHBvc2l0aW9uYCwgaWYgcHJlc2VudCwgZGVmaW5lcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogIFRoaXMgaXMgc2ltaWxhciB0byBob3cgZm9ybSBlbGVtZW50cyBpbiBSZWFjdCB3b3JrIC0gaWYgbm8gYHBvc2l0aW9uYCBpcyBzdXBwbGllZCwgdGhlIGNvbXBvbmVudFxuICAgKiAgaXMgdW5jb250cm9sbGVkLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogICAgICBsZXQgQXBwID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICogICAgICAgICAgICAgIHJldHVybiAoXG4gICAqICAgICAgICAgICAgICAgICAgPERyYWdnYWJsZSBwb3NpdGlvbj17e3g6IDI1LCB5OiAyNX19PlxuICAgKiAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pkkgc3RhcnQgd2l0aCB0cmFuc2Zvcm1YOiAyNXB4IGFuZCB0cmFuc2Zvcm1ZOiAyNXB4OzwvZGl2PlxuICAgKiAgICAgICAgICAgICAgICAgIDwvRHJhZ2dhYmxlPlxuICAgKiAgICAgICAgICAgICAgKTtcbiAgICogICAgICAgICAgfVxuICAgKiAgICAgIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHBvc2l0aW9uOiBfcHJvcFR5cGVzLmRlZmF1bHQuc2hhcGUoe1xuICAgIHg6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsXG4gICAgeTogX3Byb3BUeXBlcy5kZWZhdWx0Lm51bWJlclxuICB9KSxcbiAgLyoqXG4gICAqIFRoZXNlIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlZmluZWQgb24gdGhlIGNoaWxkLCBub3QgaGVyZS5cbiAgICovXG4gIGNsYXNzTmFtZTogX3NoaW1zLmRvbnRTZXRNZSxcbiAgc3R5bGU6IF9zaGltcy5kb250U2V0TWUsXG4gIHRyYW5zZm9ybTogX3NoaW1zLmRvbnRTZXRNZVxufSk7XG5fZGVmaW5lUHJvcGVydHkoRHJhZ2dhYmxlLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIC4uLl9EcmFnZ2FibGVDb3JlLmRlZmF1bHQuZGVmYXVsdFByb3BzLFxuICBheGlzOiAnYm90aCcsXG4gIGJvdW5kczogZmFsc2UsXG4gIGRlZmF1bHRDbGFzc05hbWU6ICdyZWFjdC1kcmFnZ2FibGUnLFxuICBkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dpbmc6ICdyZWFjdC1kcmFnZ2FibGUtZHJhZ2dpbmcnLFxuICBkZWZhdWx0Q2xhc3NOYW1lRHJhZ2dlZDogJ3JlYWN0LWRyYWdnYWJsZS1kcmFnZ2VkJyxcbiAgZGVmYXVsdFBvc2l0aW9uOiB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH0sXG4gIHNjYWxlOiAxXG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX3Byb3BUeXBlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xudmFyIF9yZWFjdERvbSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0LWRvbVwiKSk7XG52YXIgX2RvbUZucyA9IHJlcXVpcmUoXCIuL3V0aWxzL2RvbUZuc1wiKTtcbnZhciBfcG9zaXRpb25GbnMgPSByZXF1aXJlKFwiLi91dGlscy9wb3NpdGlvbkZuc1wiKTtcbnZhciBfc2hpbXMgPSByZXF1aXJlKFwiLi91dGlscy9zaGltc1wiKTtcbnZhciBfbG9nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi91dGlscy9sb2dcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZUJhYmVsSW50ZXJvcCA9IG5ldyBXZWFrTWFwKCk7IHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgcmV0dXJuIChfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAobm9kZUludGVyb3ApIHsgcmV0dXJuIG5vZGVJbnRlcm9wID8gY2FjaGVOb2RlSW50ZXJvcCA6IGNhY2hlQmFiZWxJbnRlcm9wOyB9KShub2RlSW50ZXJvcCk7IH1cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaiwgbm9kZUludGVyb3ApIHsgaWYgKCFub2RlSW50ZXJvcCAmJiBvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKGtleSAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBrZXkgPSBfdG9Qcm9wZXJ0eUtleShrZXkpOyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykgeyB2YXIga2V5ID0gX3RvUHJpbWl0aXZlKGFyZywgXCJzdHJpbmdcIik7IHJldHVybiB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkgeyBpZiAodHlwZW9mIGlucHV0ICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7IHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkgeyB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8IFwiZGVmYXVsdFwiKTsgaWYgKHR5cGVvZiByZXMgIT09IFwib2JqZWN0XCIpIHJldHVybiByZXM7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTsgfVxuLyo6OiBpbXBvcnQgdHlwZSB7RXZlbnRIYW5kbGVyLCBNb3VzZVRvdWNoRXZlbnR9IGZyb20gJy4vdXRpbHMvdHlwZXMnOyovXG4vKjo6IGltcG9ydCB0eXBlIHtFbGVtZW50IGFzIFJlYWN0RWxlbWVudH0gZnJvbSAncmVhY3QnOyovXG4vLyBTaW1wbGUgYWJzdHJhY3Rpb24gZm9yIGRyYWdnaW5nIGV2ZW50cyBuYW1lcy5cbmNvbnN0IGV2ZW50c0ZvciA9IHtcbiAgdG91Y2g6IHtcbiAgICBzdGFydDogJ3RvdWNoc3RhcnQnLFxuICAgIG1vdmU6ICd0b3VjaG1vdmUnLFxuICAgIHN0b3A6ICd0b3VjaGVuZCdcbiAgfSxcbiAgbW91c2U6IHtcbiAgICBzdGFydDogJ21vdXNlZG93bicsXG4gICAgbW92ZTogJ21vdXNlbW92ZScsXG4gICAgc3RvcDogJ21vdXNldXAnXG4gIH1cbn07XG5cbi8vIERlZmF1bHQgdG8gbW91c2UgZXZlbnRzLlxubGV0IGRyYWdFdmVudEZvciA9IGV2ZW50c0Zvci5tb3VzZTtcbi8qOjogZXhwb3J0IHR5cGUgRHJhZ2dhYmxlRGF0YSA9IHtcbiAgbm9kZTogSFRNTEVsZW1lbnQsXG4gIHg6IG51bWJlciwgeTogbnVtYmVyLFxuICBkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIsXG4gIGxhc3RYOiBudW1iZXIsIGxhc3RZOiBudW1iZXIsXG59OyovXG4vKjo6IGV4cG9ydCB0eXBlIERyYWdnYWJsZUV2ZW50SGFuZGxlciA9IChlOiBNb3VzZUV2ZW50LCBkYXRhOiBEcmFnZ2FibGVEYXRhKSA9PiB2b2lkIHwgZmFsc2U7Ki9cbi8qOjogZXhwb3J0IHR5cGUgQ29udHJvbFBvc2l0aW9uID0ge3g6IG51bWJlciwgeTogbnVtYmVyfTsqL1xuLyo6OiBleHBvcnQgdHlwZSBQb3NpdGlvbk9mZnNldENvbnRyb2xQb3NpdGlvbiA9IHt4OiBudW1iZXJ8c3RyaW5nLCB5OiBudW1iZXJ8c3RyaW5nfTsqL1xuLyo6OiBleHBvcnQgdHlwZSBEcmFnZ2FibGVDb3JlRGVmYXVsdFByb3BzID0ge1xuICBhbGxvd0FueUNsaWNrOiBib29sZWFuLFxuICBkaXNhYmxlZDogYm9vbGVhbixcbiAgZW5hYmxlVXNlclNlbGVjdEhhY2s6IGJvb2xlYW4sXG4gIG9uU3RhcnQ6IERyYWdnYWJsZUV2ZW50SGFuZGxlcixcbiAgb25EcmFnOiBEcmFnZ2FibGVFdmVudEhhbmRsZXIsXG4gIG9uU3RvcDogRHJhZ2dhYmxlRXZlbnRIYW5kbGVyLFxuICBvbk1vdXNlRG93bjogKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQsXG4gIHNjYWxlOiBudW1iZXIsXG59OyovXG4vKjo6IGV4cG9ydCB0eXBlIERyYWdnYWJsZUNvcmVQcm9wcyA9IHtcbiAgLi4uRHJhZ2dhYmxlQ29yZURlZmF1bHRQcm9wcyxcbiAgY2FuY2VsOiBzdHJpbmcsXG4gIGNoaWxkcmVuOiBSZWFjdEVsZW1lbnQ8YW55PixcbiAgb2Zmc2V0UGFyZW50OiBIVE1MRWxlbWVudCxcbiAgZ3JpZDogW251bWJlciwgbnVtYmVyXSxcbiAgaGFuZGxlOiBzdHJpbmcsXG4gIG5vZGVSZWY/OiA/UmVhY3QuRWxlbWVudFJlZjxhbnk+LFxufTsqL1xuLy9cbi8vIERlZmluZSA8RHJhZ2dhYmxlQ29yZT4uXG4vL1xuLy8gPERyYWdnYWJsZUNvcmU+IGlzIGZvciBhZHZhbmNlZCB1c2FnZSBvZiA8RHJhZ2dhYmxlPi4gSXQgbWFpbnRhaW5zIG1pbmltYWwgaW50ZXJuYWwgc3RhdGUgc28gaXQgY2FuXG4vLyB3b3JrIHdlbGwgd2l0aCBsaWJyYXJpZXMgdGhhdCByZXF1aXJlIG1vcmUgY29udHJvbCBvdmVyIHRoZSBlbGVtZW50LlxuLy9cblxuY2xhc3MgRHJhZ2dhYmxlQ29yZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCAvKjo6IDxEcmFnZ2FibGVDb3JlUHJvcHM+Ki97XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiZHJhZ2dpbmdcIiwgZmFsc2UpO1xuICAgIC8vIFVzZWQgd2hpbGUgZHJhZ2dpbmcgdG8gZGV0ZXJtaW5lIGRlbHRhcy5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJsYXN0WFwiLCBOYU4pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImxhc3RZXCIsIE5hTik7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwidG91Y2hJZGVudGlmaWVyXCIsIG51bGwpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm1vdW50ZWRcIiwgZmFsc2UpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImhhbmRsZURyYWdTdGFydFwiLCBlID0+IHtcbiAgICAgIC8vIE1ha2UgaXQgcG9zc2libGUgdG8gYXR0YWNoIGV2ZW50IGhhbmRsZXJzIG9uIHRvcCBvZiB0aGlzIG9uZS5cbiAgICAgIHRoaXMucHJvcHMub25Nb3VzZURvd24oZSk7XG5cbiAgICAgIC8vIE9ubHkgYWNjZXB0IGxlZnQtY2xpY2tzLlxuICAgICAgaWYgKCF0aGlzLnByb3BzLmFsbG93QW55Q2xpY2sgJiYgdHlwZW9mIGUuYnV0dG9uID09PSAnbnVtYmVyJyAmJiBlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBHZXQgbm9kZXMuIEJlIHN1cmUgdG8gZ3JhYiByZWxhdGl2ZSBkb2N1bWVudCAoY291bGQgYmUgaWZyYW1lZClcbiAgICAgIGNvbnN0IHRoaXNOb2RlID0gdGhpcy5maW5kRE9NTm9kZSgpO1xuICAgICAgaWYgKCF0aGlzTm9kZSB8fCAhdGhpc05vZGUub3duZXJEb2N1bWVudCB8fCAhdGhpc05vZGUub3duZXJEb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignPERyYWdnYWJsZUNvcmU+IG5vdCBtb3VudGVkIG9uIERyYWdTdGFydCEnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb3duZXJEb2N1bWVudFxuICAgICAgfSA9IHRoaXNOb2RlO1xuXG4gICAgICAvLyBTaG9ydCBjaXJjdWl0IGlmIGhhbmRsZSBvciBjYW5jZWwgcHJvcCB3YXMgcHJvdmlkZWQgYW5kIHNlbGVjdG9yIGRvZXNuJ3QgbWF0Y2guXG4gICAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCB8fCAhKGUudGFyZ2V0IGluc3RhbmNlb2Ygb3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5Ob2RlKSB8fCB0aGlzLnByb3BzLmhhbmRsZSAmJiAhKDAsIF9kb21GbnMubWF0Y2hlc1NlbGVjdG9yQW5kUGFyZW50c1RvKShlLnRhcmdldCwgdGhpcy5wcm9wcy5oYW5kbGUsIHRoaXNOb2RlKSB8fCB0aGlzLnByb3BzLmNhbmNlbCAmJiAoMCwgX2RvbUZucy5tYXRjaGVzU2VsZWN0b3JBbmRQYXJlbnRzVG8pKGUudGFyZ2V0LCB0aGlzLnByb3BzLmNhbmNlbCwgdGhpc05vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUHJldmVudCBzY3JvbGxpbmcgb24gbW9iaWxlIGRldmljZXMsIGxpa2UgaXBhZC9pcGhvbmUuXG4gICAgICAvLyBJbXBvcnRhbnQgdGhhdCB0aGlzIGlzIGFmdGVyIGhhbmRsZS9jYW5jZWwuXG4gICAgICBpZiAoZS50eXBlID09PSAndG91Y2hzdGFydCcpIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgLy8gU2V0IHRvdWNoIGlkZW50aWZpZXIgaW4gY29tcG9uZW50IHN0YXRlIGlmIHRoaXMgaXMgYSB0b3VjaCBldmVudC4gVGhpcyBhbGxvd3MgdXMgdG9cbiAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gaW5kaXZpZHVhbCB0b3VjaGVzIG9uIG11bHRpdG91Y2ggc2NyZWVucyBieSBpZGVudGlmeWluZyB3aGljaFxuICAgICAgLy8gdG91Y2hwb2ludCB3YXMgc2V0IHRvIHRoaXMgZWxlbWVudC5cbiAgICAgIGNvbnN0IHRvdWNoSWRlbnRpZmllciA9ICgwLCBfZG9tRm5zLmdldFRvdWNoSWRlbnRpZmllcikoZSk7XG4gICAgICB0aGlzLnRvdWNoSWRlbnRpZmllciA9IHRvdWNoSWRlbnRpZmllcjtcblxuICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGRyYWcgcG9pbnQgZnJvbSB0aGUgZXZlbnQuIFRoaXMgaXMgdXNlZCBhcyB0aGUgb2Zmc2V0LlxuICAgICAgY29uc3QgcG9zaXRpb24gPSAoMCwgX3Bvc2l0aW9uRm5zLmdldENvbnRyb2xQb3NpdGlvbikoZSwgdG91Y2hJZGVudGlmaWVyLCB0aGlzKTtcbiAgICAgIGlmIChwb3NpdGlvbiA9PSBudWxsKSByZXR1cm47IC8vIG5vdCBwb3NzaWJsZSBidXQgc2F0aXNmaWVzIGZsb3dcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHBvc2l0aW9uO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gZXZlbnQgb2JqZWN0IHdpdGggYWxsIHRoZSBkYXRhIHBhcmVudHMgbmVlZCB0byBtYWtlIGEgZGVjaXNpb24gaGVyZS5cbiAgICAgIGNvbnN0IGNvcmVFdmVudCA9ICgwLCBfcG9zaXRpb25GbnMuY3JlYXRlQ29yZURhdGEpKHRoaXMsIHgsIHkpO1xuICAgICAgKDAsIF9sb2cuZGVmYXVsdCkoJ0RyYWdnYWJsZUNvcmU6IGhhbmRsZURyYWdTdGFydDogJWonLCBjb3JlRXZlbnQpO1xuXG4gICAgICAvLyBDYWxsIGV2ZW50IGhhbmRsZXIuIElmIGl0IHJldHVybnMgZXhwbGljaXQgZmFsc2UsIGNhbmNlbC5cbiAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdjYWxsaW5nJywgdGhpcy5wcm9wcy5vblN0YXJ0KTtcbiAgICAgIGNvbnN0IHNob3VsZFVwZGF0ZSA9IHRoaXMucHJvcHMub25TdGFydChlLCBjb3JlRXZlbnQpO1xuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gZmFsc2UgfHwgdGhpcy5tb3VudGVkID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAvLyBBZGQgYSBzdHlsZSB0byB0aGUgYm9keSB0byBkaXNhYmxlIHVzZXItc2VsZWN0LiBUaGlzIHByZXZlbnRzIHRleHQgZnJvbVxuICAgICAgLy8gYmVpbmcgc2VsZWN0ZWQgYWxsIG92ZXIgdGhlIHBhZ2UuXG4gICAgICBpZiAodGhpcy5wcm9wcy5lbmFibGVVc2VyU2VsZWN0SGFjaykgKDAsIF9kb21GbnMuYWRkVXNlclNlbGVjdFN0eWxlcykob3duZXJEb2N1bWVudCk7XG5cbiAgICAgIC8vIEluaXRpYXRlIGRyYWdnaW5nLiBTZXQgdGhlIGN1cnJlbnQgeCBhbmQgeSBhcyBvZmZzZXRzXG4gICAgICAvLyBzbyB3ZSBrbm93IGhvdyBtdWNoIHdlJ3ZlIG1vdmVkIGR1cmluZyB0aGUgZHJhZy4gVGhpcyBhbGxvd3MgdXNcbiAgICAgIC8vIHRvIGRyYWcgZWxlbWVudHMgYXJvdW5kIGV2ZW4gaWYgdGhleSBoYXZlIGJlZW4gbW92ZWQsIHdpdGhvdXQgaXNzdWUuXG4gICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMubGFzdFggPSB4O1xuICAgICAgdGhpcy5sYXN0WSA9IHk7XG5cbiAgICAgIC8vIEFkZCBldmVudHMgdG8gdGhlIGRvY3VtZW50IGRpcmVjdGx5IHNvIHdlIGNhdGNoIHdoZW4gdGhlIHVzZXIncyBtb3VzZS90b3VjaCBtb3ZlcyBvdXRzaWRlIG9mXG4gICAgICAvLyB0aGlzIGVsZW1lbnQuIFdlIHVzZSBkaWZmZXJlbnQgZXZlbnRzIGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGRldGVjdGVkIHRoYXQgdGhpc1xuICAgICAgLy8gaXMgYSB0b3VjaC1jYXBhYmxlIGRldmljZS5cbiAgICAgICgwLCBfZG9tRm5zLmFkZEV2ZW50KShvd25lckRvY3VtZW50LCBkcmFnRXZlbnRGb3IubW92ZSwgdGhpcy5oYW5kbGVEcmFnKTtcbiAgICAgICgwLCBfZG9tRm5zLmFkZEV2ZW50KShvd25lckRvY3VtZW50LCBkcmFnRXZlbnRGb3Iuc3RvcCwgdGhpcy5oYW5kbGVEcmFnU3RvcCk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaGFuZGxlRHJhZ1wiLCBlID0+IHtcbiAgICAgIC8vIEdldCB0aGUgY3VycmVudCBkcmFnIHBvaW50IGZyb20gdGhlIGV2ZW50LiBUaGlzIGlzIHVzZWQgYXMgdGhlIG9mZnNldC5cbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gKDAsIF9wb3NpdGlvbkZucy5nZXRDb250cm9sUG9zaXRpb24pKGUsIHRoaXMudG91Y2hJZGVudGlmaWVyLCB0aGlzKTtcbiAgICAgIGlmIChwb3NpdGlvbiA9PSBudWxsKSByZXR1cm47XG4gICAgICBsZXQge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gcG9zaXRpb247XG5cbiAgICAgIC8vIFNuYXAgdG8gZ3JpZCBpZiBwcm9wIGhhcyBiZWVuIHByb3ZpZGVkXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnByb3BzLmdyaWQpKSB7XG4gICAgICAgIGxldCBkZWx0YVggPSB4IC0gdGhpcy5sYXN0WCxcbiAgICAgICAgICBkZWx0YVkgPSB5IC0gdGhpcy5sYXN0WTtcbiAgICAgICAgW2RlbHRhWCwgZGVsdGFZXSA9ICgwLCBfcG9zaXRpb25GbnMuc25hcFRvR3JpZCkodGhpcy5wcm9wcy5ncmlkLCBkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgIGlmICghZGVsdGFYICYmICFkZWx0YVkpIHJldHVybjsgLy8gc2tpcCB1c2VsZXNzIGRyYWdcbiAgICAgICAgeCA9IHRoaXMubGFzdFggKyBkZWx0YVgsIHkgPSB0aGlzLmxhc3RZICsgZGVsdGFZO1xuICAgICAgfVxuICAgICAgY29uc3QgY29yZUV2ZW50ID0gKDAsIF9wb3NpdGlvbkZucy5jcmVhdGVDb3JlRGF0YSkodGhpcywgeCwgeSk7XG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlQ29yZTogaGFuZGxlRHJhZzogJWonLCBjb3JlRXZlbnQpO1xuXG4gICAgICAvLyBDYWxsIGV2ZW50IGhhbmRsZXIuIElmIGl0IHJldHVybnMgZXhwbGljaXQgZmFsc2UsIHRyaWdnZXIgZW5kLlxuICAgICAgY29uc3Qgc2hvdWxkVXBkYXRlID0gdGhpcy5wcm9wcy5vbkRyYWcoZSwgY29yZUV2ZW50KTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IGZhbHNlIHx8IHRoaXMubW91bnRlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyAkRmxvd0lnbm9yZVxuICAgICAgICAgIHRoaXMuaGFuZGxlRHJhZ1N0b3AobmV3IE1vdXNlRXZlbnQoJ21vdXNldXAnKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIE9sZCBicm93c2Vyc1xuICAgICAgICAgIGNvbnN0IGV2ZW50ID0gKChkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudHMnKSAvKjogYW55Ki8pIC8qOiBNb3VzZVRvdWNoRXZlbnQqLyk7XG4gICAgICAgICAgLy8gSSBzZWUgd2h5IHRoaXMgaW5zYW5pdHkgd2FzIGRlcHJlY2F0ZWRcbiAgICAgICAgICAvLyAkRmxvd0lnbm9yZVxuICAgICAgICAgIGV2ZW50LmluaXRNb3VzZUV2ZW50KCdtb3VzZXVwJywgdHJ1ZSwgdHJ1ZSwgd2luZG93LCAwLCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCwgbnVsbCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVEcmFnU3RvcChldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0WCA9IHg7XG4gICAgICB0aGlzLmxhc3RZID0geTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJoYW5kbGVEcmFnU3RvcFwiLCBlID0+IHtcbiAgICAgIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSAoMCwgX3Bvc2l0aW9uRm5zLmdldENvbnRyb2xQb3NpdGlvbikoZSwgdGhpcy50b3VjaElkZW50aWZpZXIsIHRoaXMpO1xuICAgICAgaWYgKHBvc2l0aW9uID09IG51bGwpIHJldHVybjtcbiAgICAgIGxldCB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSBwb3NpdGlvbjtcblxuICAgICAgLy8gU25hcCB0byBncmlkIGlmIHByb3AgaGFzIGJlZW4gcHJvdmlkZWRcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucHJvcHMuZ3JpZCkpIHtcbiAgICAgICAgbGV0IGRlbHRhWCA9IHggLSB0aGlzLmxhc3RYIHx8IDA7XG4gICAgICAgIGxldCBkZWx0YVkgPSB5IC0gdGhpcy5sYXN0WSB8fCAwO1xuICAgICAgICBbZGVsdGFYLCBkZWx0YVldID0gKDAsIF9wb3NpdGlvbkZucy5zbmFwVG9HcmlkKSh0aGlzLnByb3BzLmdyaWQsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgICAgeCA9IHRoaXMubGFzdFggKyBkZWx0YVgsIHkgPSB0aGlzLmxhc3RZICsgZGVsdGFZO1xuICAgICAgfVxuICAgICAgY29uc3QgY29yZUV2ZW50ID0gKDAsIF9wb3NpdGlvbkZucy5jcmVhdGVDb3JlRGF0YSkodGhpcywgeCwgeSk7XG5cbiAgICAgIC8vIENhbGwgZXZlbnQgaGFuZGxlclxuICAgICAgY29uc3Qgc2hvdWxkQ29udGludWUgPSB0aGlzLnByb3BzLm9uU3RvcChlLCBjb3JlRXZlbnQpO1xuICAgICAgaWYgKHNob3VsZENvbnRpbnVlID09PSBmYWxzZSB8fCB0aGlzLm1vdW50ZWQgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCB0aGlzTm9kZSA9IHRoaXMuZmluZERPTU5vZGUoKTtcbiAgICAgIGlmICh0aGlzTm9kZSkge1xuICAgICAgICAvLyBSZW1vdmUgdXNlci1zZWxlY3QgaGFja1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5lbmFibGVVc2VyU2VsZWN0SGFjaykgKDAsIF9kb21GbnMucmVtb3ZlVXNlclNlbGVjdFN0eWxlcykodGhpc05vZGUub3duZXJEb2N1bWVudCk7XG4gICAgICB9XG4gICAgICAoMCwgX2xvZy5kZWZhdWx0KSgnRHJhZ2dhYmxlQ29yZTogaGFuZGxlRHJhZ1N0b3A6ICVqJywgY29yZUV2ZW50KTtcblxuICAgICAgLy8gUmVzZXQgdGhlIGVsLlxuICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0WCA9IE5hTjtcbiAgICAgIHRoaXMubGFzdFkgPSBOYU47XG4gICAgICBpZiAodGhpc05vZGUpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgICgwLCBfbG9nLmRlZmF1bHQpKCdEcmFnZ2FibGVDb3JlOiBSZW1vdmluZyBoYW5kbGVycycpO1xuICAgICAgICAoMCwgX2RvbUZucy5yZW1vdmVFdmVudCkodGhpc05vZGUub3duZXJEb2N1bWVudCwgZHJhZ0V2ZW50Rm9yLm1vdmUsIHRoaXMuaGFuZGxlRHJhZyk7XG4gICAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KSh0aGlzTm9kZS5vd25lckRvY3VtZW50LCBkcmFnRXZlbnRGb3Iuc3RvcCwgdGhpcy5oYW5kbGVEcmFnU3RvcCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25Nb3VzZURvd25cIiwgZSA9PiB7XG4gICAgICBkcmFnRXZlbnRGb3IgPSBldmVudHNGb3IubW91c2U7IC8vIG9uIHRvdWNoc2NyZWVuIGxhcHRvcHMgd2UgY291bGQgc3dpdGNoIGJhY2sgdG8gbW91c2VcblxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KGUpO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm9uTW91c2VVcFwiLCBlID0+IHtcbiAgICAgIGRyYWdFdmVudEZvciA9IGV2ZW50c0Zvci5tb3VzZTtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZURyYWdTdG9wKGUpO1xuICAgIH0pO1xuICAgIC8vIFNhbWUgYXMgb25Nb3VzZURvd24gKHN0YXJ0IGRyYWcpLCBidXQgbm93IGNvbnNpZGVyIHRoaXMgYSB0b3VjaCBkZXZpY2UuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25Ub3VjaFN0YXJ0XCIsIGUgPT4ge1xuICAgICAgLy8gV2UncmUgb24gYSB0b3VjaCBkZXZpY2Ugbm93LCBzbyBjaGFuZ2UgdGhlIGV2ZW50IGhhbmRsZXJzXG4gICAgICBkcmFnRXZlbnRGb3IgPSBldmVudHNGb3IudG91Y2g7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVEcmFnU3RhcnQoZSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwib25Ub3VjaEVuZFwiLCBlID0+IHtcbiAgICAgIC8vIFdlJ3JlIG9uIGEgdG91Y2ggZGV2aWNlIG5vdywgc28gY2hhbmdlIHRoZSBldmVudCBoYW5kbGVyc1xuICAgICAgZHJhZ0V2ZW50Rm9yID0gZXZlbnRzRm9yLnRvdWNoO1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRHJhZ1N0b3AoZSk7XG4gICAgfSk7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgICAvLyBUb3VjaCBoYW5kbGVycyBtdXN0IGJlIGFkZGVkIHdpdGgge3Bhc3NpdmU6IGZhbHNlfSB0byBiZSBjYW5jZWxhYmxlLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDEvc2Nyb2xsaW5nLWludGVydmVudGlvblxuICAgIGNvbnN0IHRoaXNOb2RlID0gdGhpcy5maW5kRE9NTm9kZSgpO1xuICAgIGlmICh0aGlzTm9kZSkge1xuICAgICAgKDAsIF9kb21GbnMuYWRkRXZlbnQpKHRoaXNOb2RlLCBldmVudHNGb3IudG91Y2guc3RhcnQsIHRoaXMub25Ub3VjaFN0YXJ0LCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgLy8gUmVtb3ZlIGFueSBsZWZ0b3ZlciBldmVudCBoYW5kbGVycy4gUmVtb3ZlIGJvdGggdG91Y2ggYW5kIG1vdXNlIGhhbmRsZXJzIGluIGNhc2VcbiAgICAvLyBzb21lIGJyb3dzZXIgcXVpcmsgY2F1c2VkIGEgdG91Y2ggZXZlbnQgdG8gZmlyZSBkdXJpbmcgYSBtb3VzZSBtb3ZlLCBvciB2aWNlIHZlcnNhLlxuICAgIGNvbnN0IHRoaXNOb2RlID0gdGhpcy5maW5kRE9NTm9kZSgpO1xuICAgIGlmICh0aGlzTm9kZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBvd25lckRvY3VtZW50XG4gICAgICB9ID0gdGhpc05vZGU7XG4gICAgICAoMCwgX2RvbUZucy5yZW1vdmVFdmVudCkob3duZXJEb2N1bWVudCwgZXZlbnRzRm9yLm1vdXNlLm1vdmUsIHRoaXMuaGFuZGxlRHJhZyk7XG4gICAgICAoMCwgX2RvbUZucy5yZW1vdmVFdmVudCkob3duZXJEb2N1bWVudCwgZXZlbnRzRm9yLnRvdWNoLm1vdmUsIHRoaXMuaGFuZGxlRHJhZyk7XG4gICAgICAoMCwgX2RvbUZucy5yZW1vdmVFdmVudCkob3duZXJEb2N1bWVudCwgZXZlbnRzRm9yLm1vdXNlLnN0b3AsIHRoaXMuaGFuZGxlRHJhZ1N0b3ApO1xuICAgICAgKDAsIF9kb21GbnMucmVtb3ZlRXZlbnQpKG93bmVyRG9jdW1lbnQsIGV2ZW50c0Zvci50b3VjaC5zdG9wLCB0aGlzLmhhbmRsZURyYWdTdG9wKTtcbiAgICAgICgwLCBfZG9tRm5zLnJlbW92ZUV2ZW50KSh0aGlzTm9kZSwgZXZlbnRzRm9yLnRvdWNoLnN0YXJ0LCB0aGlzLm9uVG91Y2hTdGFydCwge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5wcm9wcy5lbmFibGVVc2VyU2VsZWN0SGFjaykgKDAsIF9kb21GbnMucmVtb3ZlVXNlclNlbGVjdFN0eWxlcykob3duZXJEb2N1bWVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVhY3QgU3RyaWN0IE1vZGUgY29tcGF0aWJpbGl0eTogaWYgYG5vZGVSZWZgIGlzIHBhc3NlZCwgd2Ugd2lsbCB1c2UgaXQgaW5zdGVhZCBvZiB0cnlpbmcgdG8gZmluZFxuICAvLyB0aGUgdW5kZXJseWluZyBET00gbm9kZSBvdXJzZWx2ZXMuIFNlZSB0aGUgUkVBRE1FIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICBmaW5kRE9NTm9kZSgpIC8qOiA/SFRNTEVsZW1lbnQqL3tcbiAgICB2YXIgX3RoaXMkcHJvcHMsIF90aGlzJHByb3BzMjtcbiAgICByZXR1cm4gKF90aGlzJHByb3BzID0gdGhpcy5wcm9wcykgIT09IG51bGwgJiYgX3RoaXMkcHJvcHMgIT09IHZvaWQgMCAmJiBfdGhpcyRwcm9wcy5ub2RlUmVmID8gKF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMpID09PSBudWxsIHx8IF90aGlzJHByb3BzMiA9PT0gdm9pZCAwIHx8IChfdGhpcyRwcm9wczIgPSBfdGhpcyRwcm9wczIubm9kZVJlZikgPT09IG51bGwgfHwgX3RoaXMkcHJvcHMyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRwcm9wczIuY3VycmVudCA6IF9yZWFjdERvbS5kZWZhdWx0LmZpbmRET01Ob2RlKHRoaXMpO1xuICB9XG4gIHJlbmRlcigpIC8qOiBSZWFjdC5FbGVtZW50PGFueT4qL3tcbiAgICAvLyBSZXVzZSB0aGUgY2hpbGQgcHJvdmlkZWRcbiAgICAvLyBUaGlzIG1ha2VzIGl0IGZsZXhpYmxlIHRvIHVzZSB3aGF0ZXZlciBlbGVtZW50IGlzIHdhbnRlZCAoZGl2LCB1bCwgZXRjKVxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KFJlYWN0LkNoaWxkcmVuLm9ubHkodGhpcy5wcm9wcy5jaGlsZHJlbiksIHtcbiAgICAgIC8vIE5vdGU6IG1vdXNlTW92ZSBoYW5kbGVyIGlzIGF0dGFjaGVkIHRvIGRvY3VtZW50IHNvIGl0IHdpbGwgc3RpbGwgZnVuY3Rpb25cbiAgICAgIC8vIHdoZW4gdGhlIHVzZXIgZHJhZ3MgcXVpY2tseSBhbmQgbGVhdmVzIHRoZSBib3VuZHMgb2YgdGhlIGVsZW1lbnQuXG4gICAgICBvbk1vdXNlRG93bjogdGhpcy5vbk1vdXNlRG93bixcbiAgICAgIG9uTW91c2VVcDogdGhpcy5vbk1vdXNlVXAsXG4gICAgICAvLyBvblRvdWNoU3RhcnQgaXMgYWRkZWQgb24gYGNvbXBvbmVudERpZE1vdW50YCBzbyB0aGV5IGNhbiBiZSBhZGRlZCB3aXRoXG4gICAgICAvLyB7cGFzc2l2ZTogZmFsc2V9LCB3aGljaCBhbGxvd3MgaXQgdG8gY2FuY2VsLiBTZWVcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi91cGRhdGVzLzIwMTcvMDEvc2Nyb2xsaW5nLWludGVydmVudGlvblxuICAgICAgb25Ub3VjaEVuZDogdGhpcy5vblRvdWNoRW5kXG4gICAgfSk7XG4gIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IERyYWdnYWJsZUNvcmU7XG5fZGVmaW5lUHJvcGVydHkoRHJhZ2dhYmxlQ29yZSwgXCJkaXNwbGF5TmFtZVwiLCAnRHJhZ2dhYmxlQ29yZScpO1xuX2RlZmluZVByb3BlcnR5KERyYWdnYWJsZUNvcmUsIFwicHJvcFR5cGVzXCIsIHtcbiAgLyoqXG4gICAqIGBhbGxvd0FueUNsaWNrYCBhbGxvd3MgZHJhZ2dpbmcgdXNpbmcgYW55IG1vdXNlIGJ1dHRvbi5cbiAgICogQnkgZGVmYXVsdCwgd2Ugb25seSBhY2NlcHQgdGhlIGxlZnQgYnV0dG9uLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgYWxsb3dBbnlDbGljazogX3Byb3BUeXBlcy5kZWZhdWx0LmJvb2wsXG4gIGNoaWxkcmVuOiBfcHJvcFR5cGVzLmRlZmF1bHQubm9kZS5pc1JlcXVpcmVkLFxuICAvKipcbiAgICogYGRpc2FibGVkYCwgaWYgdHJ1ZSwgc3RvcHMgdGhlIDxEcmFnZ2FibGU+IGZyb20gZHJhZ2dpbmcuIEFsbCBoYW5kbGVycyxcbiAgICogd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGBvbk1vdXNlRG93bmAsIHdpbGwgbm90IGZpcmUuXG4gICAqL1xuICBkaXNhYmxlZDogX3Byb3BUeXBlcy5kZWZhdWx0LmJvb2wsXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCB3ZSBhZGQgJ3VzZXItc2VsZWN0Om5vbmUnIGF0dHJpYnV0ZXMgdG8gdGhlIGRvY3VtZW50IGJvZHlcbiAgICogdG8gcHJldmVudCB1Z2x5IHRleHQgc2VsZWN0aW9uIGR1cmluZyBkcmFnLiBJZiB0aGlzIGlzIGNhdXNpbmcgcHJvYmxlbXNcbiAgICogZm9yIHlvdXIgYXBwLCBzZXQgdGhpcyB0byBgZmFsc2VgLlxuICAgKi9cbiAgZW5hYmxlVXNlclNlbGVjdEhhY2s6IF9wcm9wVHlwZXMuZGVmYXVsdC5ib29sLFxuICAvKipcbiAgICogYG9mZnNldFBhcmVudGAsIGlmIHNldCwgdXNlcyB0aGUgcGFzc2VkIERPTSBub2RlIHRvIGNvbXB1dGUgZHJhZyBvZmZzZXRzXG4gICAqIGluc3RlYWQgb2YgdXNpbmcgdGhlIHBhcmVudCBub2RlLlxuICAgKi9cbiAgb2Zmc2V0UGFyZW50OiBmdW5jdGlvbiAocHJvcHMgLyo6IERyYWdnYWJsZUNvcmVQcm9wcyovLCBwcm9wTmFtZSAvKjogJEtleXM8RHJhZ2dhYmxlQ29yZVByb3BzPiovKSB7XG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSAmJiBwcm9wc1twcm9wTmFtZV0ubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRHJhZ2dhYmxlXFwncyBvZmZzZXRQYXJlbnQgbXVzdCBiZSBhIERPTSBOb2RlLicpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIGBncmlkYCBzcGVjaWZpZXMgdGhlIHggYW5kIHkgdGhhdCBkcmFnZ2luZyBzaG91bGQgc25hcCB0by5cbiAgICovXG4gIGdyaWQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5hcnJheU9mKF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIpLFxuICAvKipcbiAgICogYGhhbmRsZWAgc3BlY2lmaWVzIGEgc2VsZWN0b3IgdG8gYmUgdXNlZCBhcyB0aGUgaGFuZGxlIHRoYXQgaW5pdGlhdGVzIGRyYWcuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiAgIGxldCBBcHAgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICAgIHJlbmRlcjogZnVuY3Rpb24gKCkge1xuICAgKiAgICAgICAgIHJldHVybiAoXG4gICAqICAgICAgICAgICAgPERyYWdnYWJsZSBoYW5kbGU9XCIuaGFuZGxlXCI+XG4gICAqICAgICAgICAgICAgICA8ZGl2PlxuICAgKiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGFuZGxlXCI+Q2xpY2sgbWUgdG8gZHJhZzwvZGl2PlxuICAgKiAgICAgICAgICAgICAgICAgIDxkaXY+VGhpcyBpcyBzb21lIG90aGVyIGNvbnRlbnQ8L2Rpdj5cbiAgICogICAgICAgICAgICAgIDwvZGl2PlxuICAgKiAgICAgICAgICAgPC9EcmFnZ2FibGU+XG4gICAqICAgICAgICAgKTtcbiAgICogICAgICAgfVxuICAgKiAgIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGhhbmRsZTogX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZyxcbiAgLyoqXG4gICAqIGBjYW5jZWxgIHNwZWNpZmllcyBhIHNlbGVjdG9yIHRvIGJlIHVzZWQgdG8gcHJldmVudCBkcmFnIGluaXRpYWxpemF0aW9uLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogICBsZXQgQXBwID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICogICAgICAgICAgIHJldHVybihcbiAgICogICAgICAgICAgICAgICA8RHJhZ2dhYmxlIGNhbmNlbD1cIi5jYW5jZWxcIj5cbiAgICogICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICogICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNhbmNlbFwiPllvdSBjYW4ndCBkcmFnIGZyb20gaGVyZTwvZGl2PlxuICAgKiAgICAgICAgICAgICAgICAgICAgIDxkaXY+RHJhZ2dpbmcgaGVyZSB3b3JrcyBmaW5lPC9kaXY+XG4gICAqICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgKiAgICAgICAgICAgICAgIDwvRHJhZ2dhYmxlPlxuICAgKiAgICAgICAgICAgKTtcbiAgICogICAgICAgfVxuICAgKiAgIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGNhbmNlbDogX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZyxcbiAgLyogSWYgcnVubmluZyBpbiBSZWFjdCBTdHJpY3QgbW9kZSwgUmVhY3RET00uZmluZERPTU5vZGUoKSBpcyBkZXByZWNhdGVkLlxuICAgKiBVbmZvcnR1bmF0ZWx5LCBpbiBvcmRlciBmb3IgPERyYWdnYWJsZT4gdG8gd29yayBwcm9wZXJseSwgd2UgbmVlZCByYXcgYWNjZXNzXG4gICAqIHRvIHRoZSB1bmRlcmx5aW5nIERPTSBub2RlLiBJZiB5b3Ugd2FudCB0byBhdm9pZCB0aGUgd2FybmluZywgcGFzcyBhIGBub2RlUmVmYFxuICAgKiBhcyBpbiB0aGlzIGV4YW1wbGU6XG4gICAqXG4gICAqIGZ1bmN0aW9uIE15Q29tcG9uZW50KCkge1xuICAgKiAgIGNvbnN0IG5vZGVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAqICAgcmV0dXJuIChcbiAgICogICAgIDxEcmFnZ2FibGUgbm9kZVJlZj17bm9kZVJlZn0+XG4gICAqICAgICAgIDxkaXYgcmVmPXtub2RlUmVmfT5FeGFtcGxlIFRhcmdldDwvZGl2PlxuICAgKiAgICAgPC9EcmFnZ2FibGU+XG4gICAqICAgKTtcbiAgICogfVxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhcmJpdHJhcmlseSBuZXN0ZWQgY29tcG9uZW50cywgc28gbG9uZyBhcyB0aGUgcmVmIGVuZHMgdXBcbiAgICogcG9pbnRpbmcgdG8gdGhlIGFjdHVhbCBjaGlsZCBET00gbm9kZSBhbmQgbm90IGEgY3VzdG9tIGNvbXBvbmVudC5cbiAgICovXG4gIG5vZGVSZWY6IF9wcm9wVHlwZXMuZGVmYXVsdC5vYmplY3QsXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBkcmFnZ2luZyBzdGFydHMuXG4gICAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYm9vbGVhbiBmYWxzZSwgZHJhZ2dpbmcgd2lsbCBiZSBjYW5jZWxlZC5cbiAgICovXG4gIG9uU3RhcnQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5mdW5jLFxuICAvKipcbiAgICogQ2FsbGVkIHdoaWxlIGRyYWdnaW5nLlxuICAgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJvb2xlYW4gZmFsc2UsIGRyYWdnaW5nIHdpbGwgYmUgY2FuY2VsZWQuXG4gICAqL1xuICBvbkRyYWc6IF9wcm9wVHlwZXMuZGVmYXVsdC5mdW5jLFxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gZHJhZ2dpbmcgc3RvcHMuXG4gICAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYm9vbGVhbiBmYWxzZSwgdGhlIGRyYWcgd2lsbCByZW1haW4gYWN0aXZlLlxuICAgKi9cbiAgb25TdG9wOiBfcHJvcFR5cGVzLmRlZmF1bHQuZnVuYyxcbiAgLyoqXG4gICAqIEEgd29ya2Fyb3VuZCBvcHRpb24gd2hpY2ggY2FuIGJlIHBhc3NlZCBpZiBvbk1vdXNlRG93biBuZWVkcyB0byBiZSBhY2Nlc3NlZCxcbiAgICogc2luY2UgaXQnbGwgYWx3YXlzIGJlIGJsb2NrZWQgKGFzIHRoZXJlIGlzIGludGVybmFsIHVzZSBvZiBvbk1vdXNlRG93bilcbiAgICovXG4gIG9uTW91c2VEb3duOiBfcHJvcFR5cGVzLmRlZmF1bHQuZnVuYyxcbiAgLyoqXG4gICAqIGBzY2FsZWAsIGlmIHNldCwgYXBwbGllcyBzY2FsaW5nIHdoaWxlIGRyYWdnaW5nIGFuIGVsZW1lbnRcbiAgICovXG4gIHNjYWxlOiBfcHJvcFR5cGVzLmRlZmF1bHQubnVtYmVyLFxuICAvKipcbiAgICogVGhlc2UgcHJvcGVydGllcyBzaG91bGQgYmUgZGVmaW5lZCBvbiB0aGUgY2hpbGQsIG5vdCBoZXJlLlxuICAgKi9cbiAgY2xhc3NOYW1lOiBfc2hpbXMuZG9udFNldE1lLFxuICBzdHlsZTogX3NoaW1zLmRvbnRTZXRNZSxcbiAgdHJhbnNmb3JtOiBfc2hpbXMuZG9udFNldE1lXG59KTtcbl9kZWZpbmVQcm9wZXJ0eShEcmFnZ2FibGVDb3JlLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIGFsbG93QW55Q2xpY2s6IGZhbHNlLFxuICAvLyBieSBkZWZhdWx0IG9ubHkgYWNjZXB0IGxlZnQgY2xpY2tcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBlbmFibGVVc2VyU2VsZWN0SGFjazogdHJ1ZSxcbiAgb25TdGFydDogZnVuY3Rpb24gKCkge30sXG4gIG9uRHJhZzogZnVuY3Rpb24gKCkge30sXG4gIG9uU3RvcDogZnVuY3Rpb24gKCkge30sXG4gIG9uTW91c2VEb3duOiBmdW5jdGlvbiAoKSB7fSxcbiAgc2NhbGU6IDFcbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5jb25zdCB7XG4gIGRlZmF1bHQ6IERyYWdnYWJsZSxcbiAgRHJhZ2dhYmxlQ29yZVxufSA9IHJlcXVpcmUoJy4vRHJhZ2dhYmxlJyk7XG5cbi8vIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgbGliIGV4cG9ydGVkIDxEcmFnZ2FibGU+IGFzIHRoZSByb290IGV4cG9ydC4gQXMgdG8gbm8tLy8gdGhlbSwgb3IgVHlwZVNjcmlwdCwgd2UgZXhwb3J0ICpib3RoKiBhcyB0aGUgcm9vdCBhbmQgYXMgJ2RlZmF1bHQnLlxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9temFicmlza2llL3JlYWN0LWRyYWdnYWJsZS9wdWxsLzI1NFxuLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9temFicmlza2llL3JlYWN0LWRyYWdnYWJsZS9pc3N1ZXMvMjY2XG5tb2R1bGUuZXhwb3J0cyA9IERyYWdnYWJsZTtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBEcmFnZ2FibGU7XG5tb2R1bGUuZXhwb3J0cy5EcmFnZ2FibGVDb3JlID0gRHJhZ2dhYmxlQ29yZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuYWRkQ2xhc3NOYW1lID0gYWRkQ2xhc3NOYW1lO1xuZXhwb3J0cy5hZGRFdmVudCA9IGFkZEV2ZW50O1xuZXhwb3J0cy5hZGRVc2VyU2VsZWN0U3R5bGVzID0gYWRkVXNlclNlbGVjdFN0eWxlcztcbmV4cG9ydHMuY3JlYXRlQ1NTVHJhbnNmb3JtID0gY3JlYXRlQ1NTVHJhbnNmb3JtO1xuZXhwb3J0cy5jcmVhdGVTVkdUcmFuc2Zvcm0gPSBjcmVhdGVTVkdUcmFuc2Zvcm07XG5leHBvcnRzLmdldFRvdWNoID0gZ2V0VG91Y2g7XG5leHBvcnRzLmdldFRvdWNoSWRlbnRpZmllciA9IGdldFRvdWNoSWRlbnRpZmllcjtcbmV4cG9ydHMuZ2V0VHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbjtcbmV4cG9ydHMuaW5uZXJIZWlnaHQgPSBpbm5lckhlaWdodDtcbmV4cG9ydHMuaW5uZXJXaWR0aCA9IGlubmVyV2lkdGg7XG5leHBvcnRzLm1hdGNoZXNTZWxlY3RvciA9IG1hdGNoZXNTZWxlY3RvcjtcbmV4cG9ydHMubWF0Y2hlc1NlbGVjdG9yQW5kUGFyZW50c1RvID0gbWF0Y2hlc1NlbGVjdG9yQW5kUGFyZW50c1RvO1xuZXhwb3J0cy5vZmZzZXRYWUZyb21QYXJlbnQgPSBvZmZzZXRYWUZyb21QYXJlbnQ7XG5leHBvcnRzLm91dGVySGVpZ2h0ID0gb3V0ZXJIZWlnaHQ7XG5leHBvcnRzLm91dGVyV2lkdGggPSBvdXRlcldpZHRoO1xuZXhwb3J0cy5yZW1vdmVDbGFzc05hbWUgPSByZW1vdmVDbGFzc05hbWU7XG5leHBvcnRzLnJlbW92ZUV2ZW50ID0gcmVtb3ZlRXZlbnQ7XG5leHBvcnRzLnJlbW92ZVVzZXJTZWxlY3RTdHlsZXMgPSByZW1vdmVVc2VyU2VsZWN0U3R5bGVzO1xudmFyIF9zaGltcyA9IHJlcXVpcmUoXCIuL3NoaW1zXCIpO1xudmFyIF9nZXRQcmVmaXggPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9nZXRQcmVmaXhcIikpO1xuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsgdmFyIGNhY2hlTm9kZUludGVyb3AgPSBuZXcgV2Vha01hcCgpOyByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChub2RlSW50ZXJvcCkgeyByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7IH0pKG5vZGVJbnRlcm9wKTsgfVxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqLCBub2RlSW50ZXJvcCkgeyBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG4vKjo6IGltcG9ydCB0eXBlIHtDb250cm9sUG9zaXRpb24sIFBvc2l0aW9uT2Zmc2V0Q29udHJvbFBvc2l0aW9uLCBNb3VzZVRvdWNoRXZlbnR9IGZyb20gJy4vdHlwZXMnOyovXG5sZXQgbWF0Y2hlc1NlbGVjdG9yRnVuYyA9ICcnO1xuZnVuY3Rpb24gbWF0Y2hlc1NlbGVjdG9yKGVsIC8qOiBOb2RlKi8sIHNlbGVjdG9yIC8qOiBzdHJpbmcqLykgLyo6IGJvb2xlYW4qL3tcbiAgaWYgKCFtYXRjaGVzU2VsZWN0b3JGdW5jKSB7XG4gICAgbWF0Y2hlc1NlbGVjdG9yRnVuYyA9ICgwLCBfc2hpbXMuZmluZEluQXJyYXkpKFsnbWF0Y2hlcycsICd3ZWJraXRNYXRjaGVzU2VsZWN0b3InLCAnbW96TWF0Y2hlc1NlbGVjdG9yJywgJ21zTWF0Y2hlc1NlbGVjdG9yJywgJ29NYXRjaGVzU2VsZWN0b3InXSwgZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgLy8gJEZsb3dJZ25vcmU6IERvZXNuJ3QgdGhpbmsgZWxlbWVudHMgYXJlIGluZGV4YWJsZVxuICAgICAgcmV0dXJuICgwLCBfc2hpbXMuaXNGdW5jdGlvbikoZWxbbWV0aG9kXSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBNaWdodCBub3QgYmUgZm91bmQgZW50aXJlbHkgKG5vdCBhbiBFbGVtZW50PykgLSBpbiB0aGF0IGNhc2UsIGJhaWxcbiAgLy8gJEZsb3dJZ25vcmU6IERvZXNuJ3QgdGhpbmsgZWxlbWVudHMgYXJlIGluZGV4YWJsZVxuICBpZiAoISgwLCBfc2hpbXMuaXNGdW5jdGlvbikoZWxbbWF0Y2hlc1NlbGVjdG9yRnVuY10pKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gJEZsb3dJZ25vcmU6IERvZXNuJ3QgdGhpbmsgZWxlbWVudHMgYXJlIGluZGV4YWJsZVxuICByZXR1cm4gZWxbbWF0Y2hlc1NlbGVjdG9yRnVuY10oc2VsZWN0b3IpO1xufVxuXG4vLyBXb3JrcyB1cCB0aGUgdHJlZSB0byB0aGUgZHJhZ2dhYmxlIGl0c2VsZiBhdHRlbXB0aW5nIHRvIG1hdGNoIHNlbGVjdG9yLlxuZnVuY3Rpb24gbWF0Y2hlc1NlbGVjdG9yQW5kUGFyZW50c1RvKGVsIC8qOiBOb2RlKi8sIHNlbGVjdG9yIC8qOiBzdHJpbmcqLywgYmFzZU5vZGUgLyo6IE5vZGUqLykgLyo6IGJvb2xlYW4qL3tcbiAgbGV0IG5vZGUgPSBlbDtcbiAgZG8ge1xuICAgIGlmIChtYXRjaGVzU2VsZWN0b3Iobm9kZSwgc2VsZWN0b3IpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobm9kZSA9PT0gYmFzZU5vZGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyAkRmxvd0lnbm9yZVtpbmNvbXBhdGlibGUtdHlwZV1cbiAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICB9IHdoaWxlIChub2RlKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gYWRkRXZlbnQoZWwgLyo6ID9Ob2RlKi8sIGV2ZW50IC8qOiBzdHJpbmcqLywgaGFuZGxlciAvKjogRnVuY3Rpb24qLywgaW5wdXRPcHRpb25zIC8qOiBPYmplY3QqLykgLyo6IHZvaWQqL3tcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgLi4uaW5wdXRPcHRpb25zXG4gIH07XG4gIC8vICRGbG93SWdub3JlW21ldGhvZC11bmJpbmRpbmddXG4gIGlmIChlbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAoZWwuYXR0YWNoRXZlbnQpIHtcbiAgICBlbC5hdHRhY2hFdmVudCgnb24nICsgZXZlbnQsIGhhbmRsZXIpO1xuICB9IGVsc2Uge1xuICAgIC8vICRGbG93SWdub3JlOiBEb2Vzbid0IHRoaW5rIGVsZW1lbnRzIGFyZSBpbmRleGFibGVcbiAgICBlbFsnb24nICsgZXZlbnRdID0gaGFuZGxlcjtcbiAgfVxufVxuZnVuY3Rpb24gcmVtb3ZlRXZlbnQoZWwgLyo6ID9Ob2RlKi8sIGV2ZW50IC8qOiBzdHJpbmcqLywgaGFuZGxlciAvKjogRnVuY3Rpb24qLywgaW5wdXRPcHRpb25zIC8qOiBPYmplY3QqLykgLyo6IHZvaWQqL3tcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgLi4uaW5wdXRPcHRpb25zXG4gIH07XG4gIC8vICRGbG93SWdub3JlW21ldGhvZC11bmJpbmRpbmddXG4gIGlmIChlbC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAoZWwuZGV0YWNoRXZlbnQpIHtcbiAgICBlbC5kZXRhY2hFdmVudCgnb24nICsgZXZlbnQsIGhhbmRsZXIpO1xuICB9IGVsc2Uge1xuICAgIC8vICRGbG93SWdub3JlOiBEb2Vzbid0IHRoaW5rIGVsZW1lbnRzIGFyZSBpbmRleGFibGVcbiAgICBlbFsnb24nICsgZXZlbnRdID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gb3V0ZXJIZWlnaHQobm9kZSAvKjogSFRNTEVsZW1lbnQqLykgLyo6IG51bWJlciove1xuICAvLyBUaGlzIGlzIGRlbGliZXJhdGVseSBleGNsdWRpbmcgbWFyZ2luIGZvciBvdXIgY2FsY3VsYXRpb25zLCBzaW5jZSB3ZSBhcmUgdXNpbmdcbiAgLy8gb2Zmc2V0VG9wIHdoaWNoIGlzIGluY2x1ZGluZyBtYXJnaW4uIFNlZSBnZXRCb3VuZFBvc2l0aW9uXG4gIGxldCBoZWlnaHQgPSBub2RlLmNsaWVudEhlaWdodDtcbiAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICBoZWlnaHQgKz0gKDAsIF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGgpO1xuICBoZWlnaHQgKz0gKDAsIF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUuYm9yZGVyQm90dG9tV2lkdGgpO1xuICByZXR1cm4gaGVpZ2h0O1xufVxuZnVuY3Rpb24gb3V0ZXJXaWR0aChub2RlIC8qOiBIVE1MRWxlbWVudCovKSAvKjogbnVtYmVyKi97XG4gIC8vIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IGV4Y2x1ZGluZyBtYXJnaW4gZm9yIG91ciBjYWxjdWxhdGlvbnMsIHNpbmNlIHdlIGFyZSB1c2luZ1xuICAvLyBvZmZzZXRMZWZ0IHdoaWNoIGlzIGluY2x1ZGluZyBtYXJnaW4uIFNlZSBnZXRCb3VuZFBvc2l0aW9uXG4gIGxldCB3aWR0aCA9IG5vZGUuY2xpZW50V2lkdGg7XG4gIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgd2lkdGggKz0gKDAsIF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoKTtcbiAgd2lkdGggKz0gKDAsIF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUuYm9yZGVyUmlnaHRXaWR0aCk7XG4gIHJldHVybiB3aWR0aDtcbn1cbmZ1bmN0aW9uIGlubmVySGVpZ2h0KG5vZGUgLyo6IEhUTUxFbGVtZW50Ki8pIC8qOiBudW1iZXIqL3tcbiAgbGV0IGhlaWdodCA9IG5vZGUuY2xpZW50SGVpZ2h0O1xuICBjb25zdCBjb21wdXRlZFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gIGhlaWdodCAtPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5wYWRkaW5nVG9wKTtcbiAgaGVpZ2h0IC09ICgwLCBfc2hpbXMuaW50KShjb21wdXRlZFN0eWxlLnBhZGRpbmdCb3R0b20pO1xuICByZXR1cm4gaGVpZ2h0O1xufVxuZnVuY3Rpb24gaW5uZXJXaWR0aChub2RlIC8qOiBIVE1MRWxlbWVudCovKSAvKjogbnVtYmVyKi97XG4gIGxldCB3aWR0aCA9IG5vZGUuY2xpZW50V2lkdGg7XG4gIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgd2lkdGggLT0gKDAsIF9zaGltcy5pbnQpKGNvbXB1dGVkU3R5bGUucGFkZGluZ0xlZnQpO1xuICB3aWR0aCAtPSAoMCwgX3NoaW1zLmludCkoY29tcHV0ZWRTdHlsZS5wYWRkaW5nUmlnaHQpO1xuICByZXR1cm4gd2lkdGg7XG59XG4vKjo6IGludGVyZmFjZSBFdmVudFdpdGhPZmZzZXQge1xuICBjbGllbnRYOiBudW1iZXIsIGNsaWVudFk6IG51bWJlclxufSovXG4vLyBHZXQgZnJvbSBvZmZzZXRQYXJlbnRcbmZ1bmN0aW9uIG9mZnNldFhZRnJvbVBhcmVudChldnQgLyo6IEV2ZW50V2l0aE9mZnNldCovLCBvZmZzZXRQYXJlbnQgLyo6IEhUTUxFbGVtZW50Ki8sIHNjYWxlIC8qOiBudW1iZXIqLykgLyo6IENvbnRyb2xQb3NpdGlvbiove1xuICBjb25zdCBpc0JvZHkgPSBvZmZzZXRQYXJlbnQgPT09IG9mZnNldFBhcmVudC5vd25lckRvY3VtZW50LmJvZHk7XG4gIGNvbnN0IG9mZnNldFBhcmVudFJlY3QgPSBpc0JvZHkgPyB7XG4gICAgbGVmdDogMCxcbiAgICB0b3A6IDBcbiAgfSA6IG9mZnNldFBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgeCA9IChldnQuY2xpZW50WCArIG9mZnNldFBhcmVudC5zY3JvbGxMZWZ0IC0gb2Zmc2V0UGFyZW50UmVjdC5sZWZ0KSAvIHNjYWxlO1xuICBjb25zdCB5ID0gKGV2dC5jbGllbnRZICsgb2Zmc2V0UGFyZW50LnNjcm9sbFRvcCAtIG9mZnNldFBhcmVudFJlY3QudG9wKSAvIHNjYWxlO1xuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ1NTVHJhbnNmb3JtKGNvbnRyb2xQb3MgLyo6IENvbnRyb2xQb3NpdGlvbiovLCBwb3NpdGlvbk9mZnNldCAvKjogUG9zaXRpb25PZmZzZXRDb250cm9sUG9zaXRpb24qLykgLyo6IE9iamVjdCove1xuICBjb25zdCB0cmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uKGNvbnRyb2xQb3MsIHBvc2l0aW9uT2Zmc2V0LCAncHgnKTtcbiAgcmV0dXJuIHtcbiAgICBbKDAsIF9nZXRQcmVmaXguYnJvd3NlclByZWZpeFRvS2V5KSgndHJhbnNmb3JtJywgX2dldFByZWZpeC5kZWZhdWx0KV06IHRyYW5zbGF0aW9uXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVTVkdUcmFuc2Zvcm0oY29udHJvbFBvcyAvKjogQ29udHJvbFBvc2l0aW9uKi8sIHBvc2l0aW9uT2Zmc2V0IC8qOiBQb3NpdGlvbk9mZnNldENvbnRyb2xQb3NpdGlvbiovKSAvKjogc3RyaW5nKi97XG4gIGNvbnN0IHRyYW5zbGF0aW9uID0gZ2V0VHJhbnNsYXRpb24oY29udHJvbFBvcywgcG9zaXRpb25PZmZzZXQsICcnKTtcbiAgcmV0dXJuIHRyYW5zbGF0aW9uO1xufVxuZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb24oX3JlZiAvKjo6ICovLCBwb3NpdGlvbk9mZnNldCAvKjogUG9zaXRpb25PZmZzZXRDb250cm9sUG9zaXRpb24qLywgdW5pdFN1ZmZpeCAvKjogc3RyaW5nKi8pIC8qOiBzdHJpbmcqL3tcbiAgbGV0IHtcbiAgICB4LFxuICAgIHlcbiAgfSAvKjogQ29udHJvbFBvc2l0aW9uKi8gPSBfcmVmIC8qOiBDb250cm9sUG9zaXRpb24qLztcbiAgbGV0IHRyYW5zbGF0aW9uID0gXCJ0cmFuc2xhdGUoXCIuY29uY2F0KHgpLmNvbmNhdCh1bml0U3VmZml4LCBcIixcIikuY29uY2F0KHkpLmNvbmNhdCh1bml0U3VmZml4LCBcIilcIik7XG4gIGlmIChwb3NpdGlvbk9mZnNldCkge1xuICAgIGNvbnN0IGRlZmF1bHRYID0gXCJcIi5jb25jYXQodHlwZW9mIHBvc2l0aW9uT2Zmc2V0LnggPT09ICdzdHJpbmcnID8gcG9zaXRpb25PZmZzZXQueCA6IHBvc2l0aW9uT2Zmc2V0LnggKyB1bml0U3VmZml4KTtcbiAgICBjb25zdCBkZWZhdWx0WSA9IFwiXCIuY29uY2F0KHR5cGVvZiBwb3NpdGlvbk9mZnNldC55ID09PSAnc3RyaW5nJyA/IHBvc2l0aW9uT2Zmc2V0LnkgOiBwb3NpdGlvbk9mZnNldC55ICsgdW5pdFN1ZmZpeCk7XG4gICAgdHJhbnNsYXRpb24gPSBcInRyYW5zbGF0ZShcIi5jb25jYXQoZGVmYXVsdFgsIFwiLCBcIikuY29uY2F0KGRlZmF1bHRZLCBcIilcIikgKyB0cmFuc2xhdGlvbjtcbiAgfVxuICByZXR1cm4gdHJhbnNsYXRpb247XG59XG5mdW5jdGlvbiBnZXRUb3VjaChlIC8qOiBNb3VzZVRvdWNoRXZlbnQqLywgaWRlbnRpZmllciAvKjogbnVtYmVyKi8pIC8qOiA/e2NsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyfSove1xuICByZXR1cm4gZS50YXJnZXRUb3VjaGVzICYmICgwLCBfc2hpbXMuZmluZEluQXJyYXkpKGUudGFyZ2V0VG91Y2hlcywgdCA9PiBpZGVudGlmaWVyID09PSB0LmlkZW50aWZpZXIpIHx8IGUuY2hhbmdlZFRvdWNoZXMgJiYgKDAsIF9zaGltcy5maW5kSW5BcnJheSkoZS5jaGFuZ2VkVG91Y2hlcywgdCA9PiBpZGVudGlmaWVyID09PSB0LmlkZW50aWZpZXIpO1xufVxuZnVuY3Rpb24gZ2V0VG91Y2hJZGVudGlmaWVyKGUgLyo6IE1vdXNlVG91Y2hFdmVudCovKSAvKjogP251bWJlciove1xuICBpZiAoZS50YXJnZXRUb3VjaGVzICYmIGUudGFyZ2V0VG91Y2hlc1swXSkgcmV0dXJuIGUudGFyZ2V0VG91Y2hlc1swXS5pZGVudGlmaWVyO1xuICBpZiAoZS5jaGFuZ2VkVG91Y2hlcyAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdKSByZXR1cm4gZS5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyO1xufVxuXG4vLyBVc2VyLXNlbGVjdCBIYWNrczpcbi8vXG4vLyBVc2VmdWwgZm9yIHByZXZlbnRpbmcgYmx1ZSBoaWdobGlnaHRzIGFsbCBvdmVyIGV2ZXJ5dGhpbmcgd2hlbiBkcmFnZ2luZy5cblxuLy8gTm90ZSB3ZSdyZSBwYXNzaW5nIGBkb2N1bWVudGAgYi9jIHdlIGNvdWxkIGJlIGlmcmFtZWRcbmZ1bmN0aW9uIGFkZFVzZXJTZWxlY3RTdHlsZXMoZG9jIC8qOiA/RG9jdW1lbnQqLykge1xuICBpZiAoIWRvYykgcmV0dXJuO1xuICBsZXQgc3R5bGVFbCA9IGRvYy5nZXRFbGVtZW50QnlJZCgncmVhY3QtZHJhZ2dhYmxlLXN0eWxlLWVsJyk7XG4gIGlmICghc3R5bGVFbCkge1xuICAgIHN0eWxlRWwgPSBkb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZUVsLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgIHN0eWxlRWwuaWQgPSAncmVhY3QtZHJhZ2dhYmxlLXN0eWxlLWVsJztcbiAgICBzdHlsZUVsLmlubmVySFRNTCA9ICcucmVhY3QtZHJhZ2dhYmxlLXRyYW5zcGFyZW50LXNlbGVjdGlvbiAqOjotbW96LXNlbGVjdGlvbiB7YWxsOiBpbmhlcml0O31cXG4nO1xuICAgIHN0eWxlRWwuaW5uZXJIVE1MICs9ICcucmVhY3QtZHJhZ2dhYmxlLXRyYW5zcGFyZW50LXNlbGVjdGlvbiAqOjpzZWxlY3Rpb24ge2FsbDogaW5oZXJpdDt9XFxuJztcbiAgICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzdHlsZUVsKTtcbiAgfVxuICBpZiAoZG9jLmJvZHkpIGFkZENsYXNzTmFtZShkb2MuYm9keSwgJ3JlYWN0LWRyYWdnYWJsZS10cmFuc3BhcmVudC1zZWxlY3Rpb24nKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVVzZXJTZWxlY3RTdHlsZXMoZG9jIC8qOiA/RG9jdW1lbnQqLykge1xuICBpZiAoIWRvYykgcmV0dXJuO1xuICB0cnkge1xuICAgIGlmIChkb2MuYm9keSkgcmVtb3ZlQ2xhc3NOYW1lKGRvYy5ib2R5LCAncmVhY3QtZHJhZ2dhYmxlLXRyYW5zcGFyZW50LXNlbGVjdGlvbicpO1xuICAgIC8vICRGbG93SWdub3JlOiBJRVxuICAgIGlmIChkb2Muc2VsZWN0aW9uKSB7XG4gICAgICAvLyAkRmxvd0lnbm9yZTogSUVcbiAgICAgIGRvYy5zZWxlY3Rpb24uZW1wdHkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtb3ZlIHNlbGVjdGlvbiBjYXVzZWQgYnkgc2Nyb2xsLCB1bmxlc3MgaXQncyBhIGZvY3VzZWQgaW5wdXRcbiAgICAgIC8vICh3ZSB1c2UgZG9jLmRlZmF1bHRWaWV3IGluIGNhc2Ugd2UncmUgaW4gYW4gaWZyYW1lKVxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gKGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3cpLmdldFNlbGVjdGlvbigpO1xuICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udHlwZSAhPT0gJ0NhcmV0Jykge1xuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gcHJvYmFibHkgSUVcbiAgfVxufVxuZnVuY3Rpb24gYWRkQ2xhc3NOYW1lKGVsIC8qOiBIVE1MRWxlbWVudCovLCBjbGFzc05hbWUgLyo6IHN0cmluZyovKSB7XG4gIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFlbC5jbGFzc05hbWUubWF0Y2gobmV3IFJlZ0V4cChcIig/Ol58XFxcXHMpXCIuY29uY2F0KGNsYXNzTmFtZSwgXCIoPyFcXFxcUylcIikpKSkge1xuICAgICAgZWwuY2xhc3NOYW1lICs9IFwiIFwiLmNvbmNhdChjbGFzc05hbWUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVtb3ZlQ2xhc3NOYW1lKGVsIC8qOiBIVE1MRWxlbWVudCovLCBjbGFzc05hbWUgLyo6IHN0cmluZyovKSB7XG4gIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cChcIig/Ol58XFxcXHMpXCIuY29uY2F0KGNsYXNzTmFtZSwgXCIoPyFcXFxcUylcIiksICdnJyksICcnKTtcbiAgfVxufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5icm93c2VyUHJlZml4VG9LZXkgPSBicm93c2VyUHJlZml4VG9LZXk7XG5leHBvcnRzLmJyb3dzZXJQcmVmaXhUb1N0eWxlID0gYnJvd3NlclByZWZpeFRvU3R5bGU7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5leHBvcnRzLmdldFByZWZpeCA9IGdldFByZWZpeDtcbmNvbnN0IHByZWZpeGVzID0gWydNb3onLCAnV2Via2l0JywgJ08nLCAnbXMnXTtcbmZ1bmN0aW9uIGdldFByZWZpeCgpIC8qOiBzdHJpbmcqL3tcbiAgdmFyIF93aW5kb3ckZG9jdW1lbnQ7XG4gIGxldCBwcm9wIC8qOiBzdHJpbmcqLyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ3RyYW5zZm9ybSc7XG4gIC8vIEVuc3VyZSB3ZSdyZSBydW5uaW5nIGluIGFuIGVudmlyb25tZW50IHdoZXJlIHRoZXJlIGlzIGFjdHVhbGx5IGEgZ2xvYmFsXG4gIC8vIGB3aW5kb3dgIG9ialxuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiAnJztcblxuICAvLyBJZiB3ZSdyZSBpbiBhIHBzZXVkby1icm93c2VyIHNlcnZlci1zaWRlIGVudmlyb25tZW50LCB0aGlzIGFjY2Vzc1xuICAvLyBwYXRoIG1heSBub3QgZXhpc3QsIHNvIGJhaWwgb3V0IGlmIGl0IGRvZXNuJ3QuXG4gIGNvbnN0IHN0eWxlID0gKF93aW5kb3ckZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQpID09PSBudWxsIHx8IF93aW5kb3ckZG9jdW1lbnQgPT09IHZvaWQgMCB8fCAoX3dpbmRvdyRkb2N1bWVudCA9IF93aW5kb3ckZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA9PT0gbnVsbCB8fCBfd2luZG93JGRvY3VtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfd2luZG93JGRvY3VtZW50LnN0eWxlO1xuICBpZiAoIXN0eWxlKSByZXR1cm4gJyc7XG4gIGlmIChwcm9wIGluIHN0eWxlKSByZXR1cm4gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYnJvd3NlclByZWZpeFRvS2V5KHByb3AsIHByZWZpeGVzW2ldKSBpbiBzdHlsZSkgcmV0dXJuIHByZWZpeGVzW2ldO1xuICB9XG4gIHJldHVybiAnJztcbn1cbmZ1bmN0aW9uIGJyb3dzZXJQcmVmaXhUb0tleShwcm9wIC8qOiBzdHJpbmcqLywgcHJlZml4IC8qOiBzdHJpbmcqLykgLyo6IHN0cmluZyove1xuICByZXR1cm4gcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4KS5jb25jYXQoa2ViYWJUb1RpdGxlQ2FzZShwcm9wKSkgOiBwcm9wO1xufVxuZnVuY3Rpb24gYnJvd3NlclByZWZpeFRvU3R5bGUocHJvcCAvKjogc3RyaW5nKi8sIHByZWZpeCAvKjogc3RyaW5nKi8pIC8qOiBzdHJpbmcqL3tcbiAgcmV0dXJuIHByZWZpeCA/IFwiLVwiLmNvbmNhdChwcmVmaXgudG9Mb3dlckNhc2UoKSwgXCItXCIpLmNvbmNhdChwcm9wKSA6IHByb3A7XG59XG5mdW5jdGlvbiBrZWJhYlRvVGl0bGVDYXNlKHN0ciAvKjogc3RyaW5nKi8pIC8qOiBzdHJpbmcqL3tcbiAgbGV0IG91dCA9ICcnO1xuICBsZXQgc2hvdWxkQ2FwaXRhbGl6ZSA9IHRydWU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHNob3VsZENhcGl0YWxpemUpIHtcbiAgICAgIG91dCArPSBzdHJbaV0udG9VcHBlckNhc2UoKTtcbiAgICAgIHNob3VsZENhcGl0YWxpemUgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHN0cltpXSA9PT0gJy0nKSB7XG4gICAgICBzaG91bGRDYXBpdGFsaXplID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0ICs9IHN0cltpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gRGVmYXVsdCBleHBvcnQgaXMgdGhlIHByZWZpeCBpdHNlbGYsIGxpa2UgJ01veicsICdXZWJraXQnLCBldGNcbi8vIE5vdGUgdGhhdCB5b3UgbWF5IGhhdmUgdG8gcmUtdGVzdCBmb3IgY2VydGFpbiB0aGluZ3M7IGZvciBpbnN0YW5jZSwgQ2hyb21lIDUwXG4vLyBjYW4gaGFuZGxlIHVucHJlZml4ZWQgYHRyYW5zZm9ybWAsIGJ1dCBub3QgdW5wcmVmaXhlZCBgdXNlci1zZWxlY3RgXG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSAoZ2V0UHJlZml4KCkgLyo6IHN0cmluZyovKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGxvZztcbi8qZXNsaW50IG5vLWNvbnNvbGU6MCovXG5mdW5jdGlvbiBsb2coKSB7XG4gIGlmICh1bmRlZmluZWQpIGNvbnNvbGUubG9nKC4uLmFyZ3VtZW50cyk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNhbkRyYWdYID0gY2FuRHJhZ1g7XG5leHBvcnRzLmNhbkRyYWdZID0gY2FuRHJhZ1k7XG5leHBvcnRzLmNyZWF0ZUNvcmVEYXRhID0gY3JlYXRlQ29yZURhdGE7XG5leHBvcnRzLmNyZWF0ZURyYWdnYWJsZURhdGEgPSBjcmVhdGVEcmFnZ2FibGVEYXRhO1xuZXhwb3J0cy5nZXRCb3VuZFBvc2l0aW9uID0gZ2V0Qm91bmRQb3NpdGlvbjtcbmV4cG9ydHMuZ2V0Q29udHJvbFBvc2l0aW9uID0gZ2V0Q29udHJvbFBvc2l0aW9uO1xuZXhwb3J0cy5zbmFwVG9HcmlkID0gc25hcFRvR3JpZDtcbnZhciBfc2hpbXMgPSByZXF1aXJlKFwiLi9zaGltc1wiKTtcbnZhciBfZG9tRm5zID0gcmVxdWlyZShcIi4vZG9tRm5zXCIpO1xuLyo6OiBpbXBvcnQgdHlwZSBEcmFnZ2FibGUgZnJvbSAnLi4vRHJhZ2dhYmxlJzsqL1xuLyo6OiBpbXBvcnQgdHlwZSB7Qm91bmRzLCBDb250cm9sUG9zaXRpb24sIERyYWdnYWJsZURhdGEsIE1vdXNlVG91Y2hFdmVudH0gZnJvbSAnLi90eXBlcyc7Ki9cbi8qOjogaW1wb3J0IHR5cGUgRHJhZ2dhYmxlQ29yZSBmcm9tICcuLi9EcmFnZ2FibGVDb3JlJzsqL1xuZnVuY3Rpb24gZ2V0Qm91bmRQb3NpdGlvbihkcmFnZ2FibGUgLyo6IERyYWdnYWJsZSovLCB4IC8qOiBudW1iZXIqLywgeSAvKjogbnVtYmVyKi8pIC8qOiBbbnVtYmVyLCBudW1iZXJdKi97XG4gIC8vIElmIG5vIGJvdW5kcywgc2hvcnQtY2lyY3VpdCBhbmQgbW92ZSBvblxuICBpZiAoIWRyYWdnYWJsZS5wcm9wcy5ib3VuZHMpIHJldHVybiBbeCwgeV07XG5cbiAgLy8gQ2xvbmUgbmV3IGJvdW5kc1xuICBsZXQge1xuICAgIGJvdW5kc1xuICB9ID0gZHJhZ2dhYmxlLnByb3BzO1xuICBib3VuZHMgPSB0eXBlb2YgYm91bmRzID09PSAnc3RyaW5nJyA/IGJvdW5kcyA6IGNsb25lQm91bmRzKGJvdW5kcyk7XG4gIGNvbnN0IG5vZGUgPSBmaW5kRE9NTm9kZShkcmFnZ2FibGUpO1xuICBpZiAodHlwZW9mIGJvdW5kcyA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7XG4gICAgICBvd25lckRvY3VtZW50XG4gICAgfSA9IG5vZGU7XG4gICAgY29uc3Qgb3duZXJXaW5kb3cgPSBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIGxldCBib3VuZE5vZGU7XG4gICAgaWYgKGJvdW5kcyA9PT0gJ3BhcmVudCcpIHtcbiAgICAgIGJvdW5kTm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm91bmROb2RlID0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGJvdW5kcyk7XG4gICAgfVxuICAgIGlmICghKGJvdW5kTm9kZSBpbnN0YW5jZW9mIG93bmVyV2luZG93LkhUTUxFbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb3VuZHMgc2VsZWN0b3IgXCInICsgYm91bmRzICsgJ1wiIGNvdWxkIG5vdCBmaW5kIGFuIGVsZW1lbnQuJyk7XG4gICAgfVxuICAgIGNvbnN0IGJvdW5kTm9kZUVsIC8qOiBIVE1MRWxlbWVudCovID0gYm91bmROb2RlOyAvLyBmb3IgRmxvdywgY2FuJ3Qgc2VlbSB0byByZWZpbmUgY29ycmVjdGx5XG4gICAgY29uc3Qgbm9kZVN0eWxlID0gb3duZXJXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcbiAgICBjb25zdCBib3VuZE5vZGVTdHlsZSA9IG93bmVyV2luZG93LmdldENvbXB1dGVkU3R5bGUoYm91bmROb2RlRWwpO1xuICAgIC8vIENvbXB1dGUgYm91bmRzLiBUaGlzIGlzIGEgcGFpbiB3aXRoIHBhZGRpbmcgYW5kIG9mZnNldHMgYnV0IHRoaXMgZ2V0cyBpdCBleGFjdGx5IHJpZ2h0LlxuICAgIGJvdW5kcyA9IHtcbiAgICAgIGxlZnQ6IC1ub2RlLm9mZnNldExlZnQgKyAoMCwgX3NoaW1zLmludCkoYm91bmROb2RlU3R5bGUucGFkZGluZ0xlZnQpICsgKDAsIF9zaGltcy5pbnQpKG5vZGVTdHlsZS5tYXJnaW5MZWZ0KSxcbiAgICAgIHRvcDogLW5vZGUub2Zmc2V0VG9wICsgKDAsIF9zaGltcy5pbnQpKGJvdW5kTm9kZVN0eWxlLnBhZGRpbmdUb3ApICsgKDAsIF9zaGltcy5pbnQpKG5vZGVTdHlsZS5tYXJnaW5Ub3ApLFxuICAgICAgcmlnaHQ6ICgwLCBfZG9tRm5zLmlubmVyV2lkdGgpKGJvdW5kTm9kZUVsKSAtICgwLCBfZG9tRm5zLm91dGVyV2lkdGgpKG5vZGUpIC0gbm9kZS5vZmZzZXRMZWZ0ICsgKDAsIF9zaGltcy5pbnQpKGJvdW5kTm9kZVN0eWxlLnBhZGRpbmdSaWdodCkgLSAoMCwgX3NoaW1zLmludCkobm9kZVN0eWxlLm1hcmdpblJpZ2h0KSxcbiAgICAgIGJvdHRvbTogKDAsIF9kb21GbnMuaW5uZXJIZWlnaHQpKGJvdW5kTm9kZUVsKSAtICgwLCBfZG9tRm5zLm91dGVySGVpZ2h0KShub2RlKSAtIG5vZGUub2Zmc2V0VG9wICsgKDAsIF9zaGltcy5pbnQpKGJvdW5kTm9kZVN0eWxlLnBhZGRpbmdCb3R0b20pIC0gKDAsIF9zaGltcy5pbnQpKG5vZGVTdHlsZS5tYXJnaW5Cb3R0b20pXG4gICAgfTtcbiAgfVxuXG4gIC8vIEtlZXAgeCBhbmQgeSBiZWxvdyByaWdodCBhbmQgYm90dG9tIGxpbWl0cy4uLlxuICBpZiAoKDAsIF9zaGltcy5pc051bSkoYm91bmRzLnJpZ2h0KSkgeCA9IE1hdGgubWluKHgsIGJvdW5kcy5yaWdodCk7XG4gIGlmICgoMCwgX3NoaW1zLmlzTnVtKShib3VuZHMuYm90dG9tKSkgeSA9IE1hdGgubWluKHksIGJvdW5kcy5ib3R0b20pO1xuXG4gIC8vIEJ1dCBhYm92ZSBsZWZ0IGFuZCB0b3AgbGltaXRzLlxuICBpZiAoKDAsIF9zaGltcy5pc051bSkoYm91bmRzLmxlZnQpKSB4ID0gTWF0aC5tYXgoeCwgYm91bmRzLmxlZnQpO1xuICBpZiAoKDAsIF9zaGltcy5pc051bSkoYm91bmRzLnRvcCkpIHkgPSBNYXRoLm1heCh5LCBib3VuZHMudG9wKTtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cbmZ1bmN0aW9uIHNuYXBUb0dyaWQoZ3JpZCAvKjogW251bWJlciwgbnVtYmVyXSovLCBwZW5kaW5nWCAvKjogbnVtYmVyKi8sIHBlbmRpbmdZIC8qOiBudW1iZXIqLykgLyo6IFtudW1iZXIsIG51bWJlcl0qL3tcbiAgY29uc3QgeCA9IE1hdGgucm91bmQocGVuZGluZ1ggLyBncmlkWzBdKSAqIGdyaWRbMF07XG4gIGNvbnN0IHkgPSBNYXRoLnJvdW5kKHBlbmRpbmdZIC8gZ3JpZFsxXSkgKiBncmlkWzFdO1xuICByZXR1cm4gW3gsIHldO1xufVxuZnVuY3Rpb24gY2FuRHJhZ1goZHJhZ2dhYmxlIC8qOiBEcmFnZ2FibGUqLykgLyo6IGJvb2xlYW4qL3tcbiAgcmV0dXJuIGRyYWdnYWJsZS5wcm9wcy5heGlzID09PSAnYm90aCcgfHwgZHJhZ2dhYmxlLnByb3BzLmF4aXMgPT09ICd4Jztcbn1cbmZ1bmN0aW9uIGNhbkRyYWdZKGRyYWdnYWJsZSAvKjogRHJhZ2dhYmxlKi8pIC8qOiBib29sZWFuKi97XG4gIHJldHVybiBkcmFnZ2FibGUucHJvcHMuYXhpcyA9PT0gJ2JvdGgnIHx8IGRyYWdnYWJsZS5wcm9wcy5heGlzID09PSAneSc7XG59XG5cbi8vIEdldCB7eCwgeX0gcG9zaXRpb25zIGZyb20gZXZlbnQuXG5mdW5jdGlvbiBnZXRDb250cm9sUG9zaXRpb24oZSAvKjogTW91c2VUb3VjaEV2ZW50Ki8sIHRvdWNoSWRlbnRpZmllciAvKjogP251bWJlciovLCBkcmFnZ2FibGVDb3JlIC8qOiBEcmFnZ2FibGVDb3JlKi8pIC8qOiA/Q29udHJvbFBvc2l0aW9uKi97XG4gIGNvbnN0IHRvdWNoT2JqID0gdHlwZW9mIHRvdWNoSWRlbnRpZmllciA9PT0gJ251bWJlcicgPyAoMCwgX2RvbUZucy5nZXRUb3VjaCkoZSwgdG91Y2hJZGVudGlmaWVyKSA6IG51bGw7XG4gIGlmICh0eXBlb2YgdG91Y2hJZGVudGlmaWVyID09PSAnbnVtYmVyJyAmJiAhdG91Y2hPYmopIHJldHVybiBudWxsOyAvLyBub3QgdGhlIHJpZ2h0IHRvdWNoXG4gIGNvbnN0IG5vZGUgPSBmaW5kRE9NTm9kZShkcmFnZ2FibGVDb3JlKTtcbiAgLy8gVXNlciBjYW4gcHJvdmlkZSBhbiBvZmZzZXRQYXJlbnQgaWYgZGVzaXJlZC5cbiAgY29uc3Qgb2Zmc2V0UGFyZW50ID0gZHJhZ2dhYmxlQ29yZS5wcm9wcy5vZmZzZXRQYXJlbnQgfHwgbm9kZS5vZmZzZXRQYXJlbnQgfHwgbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIHJldHVybiAoMCwgX2RvbUZucy5vZmZzZXRYWUZyb21QYXJlbnQpKHRvdWNoT2JqIHx8IGUsIG9mZnNldFBhcmVudCwgZHJhZ2dhYmxlQ29yZS5wcm9wcy5zY2FsZSk7XG59XG5cbi8vIENyZWF0ZSBhbiBkYXRhIG9iamVjdCBleHBvc2VkIGJ5IDxEcmFnZ2FibGVDb3JlPidzIGV2ZW50c1xuZnVuY3Rpb24gY3JlYXRlQ29yZURhdGEoZHJhZ2dhYmxlIC8qOiBEcmFnZ2FibGVDb3JlKi8sIHggLyo6IG51bWJlciovLCB5IC8qOiBudW1iZXIqLykgLyo6IERyYWdnYWJsZURhdGEqL3tcbiAgY29uc3QgaXNTdGFydCA9ICEoMCwgX3NoaW1zLmlzTnVtKShkcmFnZ2FibGUubGFzdFgpO1xuICBjb25zdCBub2RlID0gZmluZERPTU5vZGUoZHJhZ2dhYmxlKTtcbiAgaWYgKGlzU3RhcnQpIHtcbiAgICAvLyBJZiB0aGlzIGlzIG91ciBmaXJzdCBtb3ZlLCB1c2UgdGhlIHggYW5kIHkgYXMgbGFzdCBjb29yZHMuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGUsXG4gICAgICBkZWx0YVg6IDAsXG4gICAgICBkZWx0YVk6IDAsXG4gICAgICBsYXN0WDogeCxcbiAgICAgIGxhc3RZOiB5LFxuICAgICAgeCxcbiAgICAgIHlcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSBjYWxjdWxhdGUgcHJvcGVyIHZhbHVlcy5cbiAgICByZXR1cm4ge1xuICAgICAgbm9kZSxcbiAgICAgIGRlbHRhWDogeCAtIGRyYWdnYWJsZS5sYXN0WCxcbiAgICAgIGRlbHRhWTogeSAtIGRyYWdnYWJsZS5sYXN0WSxcbiAgICAgIGxhc3RYOiBkcmFnZ2FibGUubGFzdFgsXG4gICAgICBsYXN0WTogZHJhZ2dhYmxlLmxhc3RZLFxuICAgICAgeCxcbiAgICAgIHlcbiAgICB9O1xuICB9XG59XG5cbi8vIENyZWF0ZSBhbiBkYXRhIGV4cG9zZWQgYnkgPERyYWdnYWJsZT4ncyBldmVudHNcbmZ1bmN0aW9uIGNyZWF0ZURyYWdnYWJsZURhdGEoZHJhZ2dhYmxlIC8qOiBEcmFnZ2FibGUqLywgY29yZURhdGEgLyo6IERyYWdnYWJsZURhdGEqLykgLyo6IERyYWdnYWJsZURhdGEqL3tcbiAgY29uc3Qgc2NhbGUgPSBkcmFnZ2FibGUucHJvcHMuc2NhbGU7XG4gIHJldHVybiB7XG4gICAgbm9kZTogY29yZURhdGEubm9kZSxcbiAgICB4OiBkcmFnZ2FibGUuc3RhdGUueCArIGNvcmVEYXRhLmRlbHRhWCAvIHNjYWxlLFxuICAgIHk6IGRyYWdnYWJsZS5zdGF0ZS55ICsgY29yZURhdGEuZGVsdGFZIC8gc2NhbGUsXG4gICAgZGVsdGFYOiBjb3JlRGF0YS5kZWx0YVggLyBzY2FsZSxcbiAgICBkZWx0YVk6IGNvcmVEYXRhLmRlbHRhWSAvIHNjYWxlLFxuICAgIGxhc3RYOiBkcmFnZ2FibGUuc3RhdGUueCxcbiAgICBsYXN0WTogZHJhZ2dhYmxlLnN0YXRlLnlcbiAgfTtcbn1cblxuLy8gQSBsb3QgZmFzdGVyIHRoYW4gc3RyaW5naWZ5L3BhcnNlXG5mdW5jdGlvbiBjbG9uZUJvdW5kcyhib3VuZHMgLyo6IEJvdW5kcyovKSAvKjogQm91bmRzKi97XG4gIHJldHVybiB7XG4gICAgbGVmdDogYm91bmRzLmxlZnQsXG4gICAgdG9wOiBib3VuZHMudG9wLFxuICAgIHJpZ2h0OiBib3VuZHMucmlnaHQsXG4gICAgYm90dG9tOiBib3VuZHMuYm90dG9tXG4gIH07XG59XG5mdW5jdGlvbiBmaW5kRE9NTm9kZShkcmFnZ2FibGUgLyo6IERyYWdnYWJsZSB8IERyYWdnYWJsZUNvcmUqLykgLyo6IEhUTUxFbGVtZW50Ki97XG4gIGNvbnN0IG5vZGUgPSBkcmFnZ2FibGUuZmluZERPTU5vZGUoKTtcbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCc8RHJhZ2dhYmxlQ29yZT46IFVubW91bnRlZCBkdXJpbmcgZXZlbnQhJyk7XG4gIH1cbiAgLy8gJEZsb3dJZ25vcmUgd2UgY2FuJ3QgYXNzZXJ0IG9uIEhUTUxFbGVtZW50IGR1ZSB0byB0ZXN0cy4uLiBGSVhNRVxuICByZXR1cm4gbm9kZTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZG9udFNldE1lID0gZG9udFNldE1lO1xuZXhwb3J0cy5maW5kSW5BcnJheSA9IGZpbmRJbkFycmF5O1xuZXhwb3J0cy5pbnQgPSBpbnQ7XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuZXhwb3J0cy5pc051bSA9IGlzTnVtO1xuLy8gQGNyZWRpdHMgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcm9nb3pobmlrb2ZmL2E0M2NmZWQyN2M0MWU0ZTY4Y2RjXG5mdW5jdGlvbiBmaW5kSW5BcnJheShhcnJheSAvKjogQXJyYXk8YW55PiB8IFRvdWNoTGlzdCovLCBjYWxsYmFjayAvKjogRnVuY3Rpb24qLykgLyo6IGFueSove1xuICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY2FsbGJhY2suYXBwbHkoY2FsbGJhY2ssIFthcnJheVtpXSwgaSwgYXJyYXldKSkgcmV0dXJuIGFycmF5W2ldO1xuICB9XG59XG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGZ1bmMgLyo6IGFueSovKSAvKjogYm9vbGVhbiAlY2hlY2tzKi97XG4gIC8vICRGbG93SWdub3JlW21ldGhvZC11bmJpbmRpbmddXG4gIHJldHVybiB0eXBlb2YgZnVuYyA9PT0gJ2Z1bmN0aW9uJyB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZnVuYykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5mdW5jdGlvbiBpc051bShudW0gLyo6IGFueSovKSAvKjogYm9vbGVhbiAlY2hlY2tzKi97XG4gIHJldHVybiB0eXBlb2YgbnVtID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obnVtKTtcbn1cbmZ1bmN0aW9uIGludChhIC8qOiBzdHJpbmcqLykgLyo6IG51bWJlciove1xuICByZXR1cm4gcGFyc2VJbnQoYSwgMTApO1xufVxuZnVuY3Rpb24gZG9udFNldE1lKHByb3BzIC8qOiBPYmplY3QqLywgcHJvcE5hbWUgLyo6IHN0cmluZyovLCBjb21wb25lbnROYW1lIC8qOiBzdHJpbmcqLykgLyo6ID9FcnJvciove1xuICBpZiAocHJvcHNbcHJvcE5hbWVdKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcIkludmFsaWQgcHJvcCBcIi5jb25jYXQocHJvcE5hbWUsIFwiIHBhc3NlZCB0byBcIikuY29uY2F0KGNvbXBvbmVudE5hbWUsIFwiIC0gZG8gbm90IHNldCB0aGlzLCBzZXQgaXQgb24gdGhlIGNoaWxkLlwiKSk7XG4gIH1cbn0iLCJmdW5jdGlvbiByKGUpe3ZhciB0LGYsbj1cIlwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZSluKz1lO2Vsc2UgaWYoXCJvYmplY3RcIj09dHlwZW9mIGUpaWYoQXJyYXkuaXNBcnJheShlKSlmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0mJihmPXIoZVt0XSkpJiYobiYmKG4rPVwiIFwiKSxuKz1mKTtlbHNlIGZvcih0IGluIGUpZVt0XSYmKG4mJihuKz1cIiBcIiksbis9dCk7cmV0dXJuIG59ZXhwb3J0IGZ1bmN0aW9uIGNsc3goKXtmb3IodmFyIGUsdCxmPTAsbj1cIlwiO2Y8YXJndW1lbnRzLmxlbmd0aDspKGU9YXJndW1lbnRzW2YrK10pJiYodD1yKGUpKSYmKG4mJihuKz1cIiBcIiksbis9dCk7cmV0dXJuIG59ZXhwb3J0IGRlZmF1bHQgY2xzeDsiLCIvKiBnbG9iYWwgTWFwOnJlYWRvbmx5LCBTZXQ6cmVhZG9ubHksIEFycmF5QnVmZmVyOnJlYWRvbmx5ICovXG5cbnZhciBoYXNFbGVtZW50VHlwZSA9IHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJztcbnZhciBoYXNNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nO1xudmFyIGhhc1NldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbic7XG52YXIgaGFzQXJyYXlCdWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgISFBcnJheUJ1ZmZlci5pc1ZpZXc7XG5cbi8vIE5vdGU6IFdlICoqZG9uJ3QqKiBuZWVkIGBlbnZIYXNCaWdJbnQ2NEFycmF5YCBpbiBmZGUgZXM2L2luZGV4LmpzXG5cbmZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgLy8gU1RBUlQ6IGZhc3QtZGVlcC1lcXVhbCBlczYvaW5kZXguanMgMy4xLjNcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFNUQVJUOiBNb2RpZmljYXRpb25zOlxuICAgIC8vIDEuIEV4dHJhIGBoYXM8VHlwZT4gJiZgIGhlbHBlcnMgaW4gaW5pdGlhbCBjb25kaXRpb24gYWxsb3cgZXM2IGNvZGVcbiAgICAvLyAgICB0byBjby1leGlzdCB3aXRoIGVzNS5cbiAgICAvLyAyLiBSZXBsYWNlIGBmb3Igb2ZgIHdpdGggZXM1IGNvbXBsaWFudCBpdGVyYXRpb24gdXNpbmcgYGZvcmAuXG4gICAgLy8gICAgQmFzaWNhbGx5LCB0YWtlOlxuICAgIC8vXG4gICAgLy8gICAgYGBganNcbiAgICAvLyAgICBmb3IgKGkgb2YgYS5lbnRyaWVzKCkpXG4gICAgLy8gICAgICBpZiAoIWIuaGFzKGlbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgYGBgXG4gICAgLy9cbiAgICAvLyAgICAuLi4gYW5kIGNvbnZlcnQgdG86XG4gICAgLy9cbiAgICAvLyAgICBgYGBqc1xuICAgIC8vICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgLy8gICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAvLyAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICBgYGBcbiAgICAvL1xuICAgIC8vICAgICoqTm90ZSoqOiBgaWAgYWNjZXNzIHN3aXRjaGVzIHRvIGBpLnZhbHVlYC5cbiAgICB2YXIgaXQ7XG4gICAgaWYgKGhhc01hcCAmJiAoYSBpbnN0YW5jZW9mIE1hcCkgJiYgKGIgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICBpdCA9IGEuZW50cmllcygpO1xuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAgICAgaWYgKCFlcXVhbChpLnZhbHVlWzFdLCBiLmdldChpLnZhbHVlWzBdKSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChoYXNTZXQgJiYgKGEgaW5zdGFuY2VvZiBTZXQpICYmIChiIGluc3RhbmNlb2YgU2V0KSkge1xuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICBpdCA9IGEuZW50cmllcygpO1xuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAgICAgaWYgKCFiLmhhcyhpLnZhbHVlWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIEVORDogTW9kaWZpY2F0aW9uc1xuXG4gICAgaWYgKGhhc0FycmF5QnVmZmVyICYmIEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYikpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGEuY29uc3RydWN0b3IgPT09IFJlZ0V4cCkgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICAgIC8vIFNUQVJUOiBNb2RpZmljYXRpb25zOlxuICAgIC8vIEFwcGx5IGd1YXJkcyBmb3IgYE9iamVjdC5jcmVhdGUobnVsbClgIGhhbmRsaW5nLiBTZWU6XG4gICAgLy8gLSBodHRwczovL2dpdGh1Yi5jb20vRm9ybWlkYWJsZUxhYnMvcmVhY3QtZmFzdC1jb21wYXJlL2lzc3Vlcy82NFxuICAgIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2Vwb2JlcmV6a2luL2Zhc3QtZGVlcC1lcXVhbC9pc3N1ZXMvNDlcbiAgICBpZiAoYS52YWx1ZU9mICE9PSBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YgJiYgdHlwZW9mIGEudmFsdWVPZiA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgYi52YWx1ZU9mID09PSAnZnVuY3Rpb24nKSByZXR1cm4gYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpO1xuICAgIGlmIChhLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nICYmIHR5cGVvZiBhLnRvU3RyaW5nID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBiLnRvU3RyaW5nID09PSAnZnVuY3Rpb24nKSByZXR1cm4gYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCk7XG4gICAgLy8gRU5EOiBNb2RpZmljYXRpb25zXG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEVORDogZmFzdC1kZWVwLWVxdWFsXG5cbiAgICAvLyBTVEFSVDogcmVhY3QtZmFzdC1jb21wYXJlXG4gICAgLy8gY3VzdG9tIGhhbmRsaW5nIGZvciBET00gZWxlbWVudHNcbiAgICBpZiAoaGFzRWxlbWVudFR5cGUgJiYgYSBpbnN0YW5jZW9mIEVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIGN1c3RvbSBoYW5kbGluZyBmb3IgUmVhY3QvUHJlYWN0XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICBpZiAoKGtleXNbaV0gPT09ICdfb3duZXInIHx8IGtleXNbaV0gPT09ICdfX3YnIHx8IGtleXNbaV0gPT09ICdfX28nKSAmJiBhLiQkdHlwZW9mKSB7XG4gICAgICAgIC8vIFJlYWN0LXNwZWNpZmljOiBhdm9pZCB0cmF2ZXJzaW5nIFJlYWN0IGVsZW1lbnRzJyBfb3duZXJcbiAgICAgICAgLy8gUHJlYWN0LXNwZWNpZmljOiBhdm9pZCB0cmF2ZXJzaW5nIFByZWFjdCBlbGVtZW50cycgX192IGFuZCBfX29cbiAgICAgICAgLy8gICAgX192ID0gJF9vcmlnaW5hbCAvICRfdm5vZGVcbiAgICAgICAgLy8gICAgX19vID0gJF9vd25lclxuICAgICAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGNvbnRhaW4gY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgYXJlIG5vdCBuZWVkZWQgd2hlblxuICAgICAgICAvLyBjb21wYXJpbmcgdGhlIGFjdHVhbCBlbGVtZW50cyAoYW5kIG5vdCB0aGVpciBvd25lcnMpXG4gICAgICAgIC8vIC4kJHR5cGVvZiBhbmQgLl9zdG9yZSBvbiBqdXN0IHJlYXNvbmFibGUgbWFya2VycyBvZiBlbGVtZW50c1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhbGwgb3RoZXIgcHJvcGVydGllcyBzaG91bGQgYmUgdHJhdmVyc2VkIGFzIHVzdWFsXG4gICAgICBpZiAoIWVxdWFsKGFba2V5c1tpXV0sIGJba2V5c1tpXV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEVORDogcmVhY3QtZmFzdC1jb21wYXJlXG5cbiAgICAvLyBTVEFSVDogZmFzdC1kZWVwLWVxdWFsXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xufVxuLy8gZW5kIGZhc3QtZGVlcC1lcXVhbFxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRXF1YWwoYSwgYikge1xuICB0cnkge1xuICAgIHJldHVybiBlcXVhbChhLCBiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKChlcnJvci5tZXNzYWdlIHx8ICcnKS5tYXRjaCgvc3RhY2t8cmVjdXJzaW9uL2kpKSkge1xuICAgICAgLy8gd2FybiBvbiBjaXJjdWxhciByZWZlcmVuY2VzLCBkb24ndCBjcmFzaFxuICAgICAgLy8gYnJvd3NlcnMgZ2l2ZSB0aGlzIGRpZmZlcmVudCBlcnJvcnMgbmFtZSBhbmQgbWVzc2FnZXM6XG4gICAgICAvLyBjaHJvbWUvc2FmYXJpOiBcIlJhbmdlRXJyb3JcIiwgXCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiXG4gICAgICAvLyBmaXJlZm94OiBcIkludGVybmFsRXJyb3JcIiwgdG9vIG11Y2ggcmVjdXJzaW9uXCJcbiAgICAgIC8vIGVkZ2U6IFwiRXJyb3JcIiwgXCJPdXQgb2Ygc3RhY2sgc3BhY2VcIlxuICAgICAgY29uc29sZS53YXJuKCdyZWFjdC1mYXN0LWNvbXBhcmUgY2Fubm90IGhhbmRsZSBjaXJjdWxhciByZWZzJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIHNvbWUgb3RoZXIgZXJyb3IuIHdlIHNob3VsZCBkZWZpbml0ZWx5IGtub3cgYWJvdXQgdGhlc2VcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICdmb2N1cy1sb2NrL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbmxpbmVQcm9wIH0gZnJvbSAnLi91dGlsJztcbnZhciBBdXRvRm9jdXNJbnNpZGUgPSBmdW5jdGlvbiBBdXRvRm9jdXNJbnNpZGUoX3JlZikge1xuICB2YXIgX3JlZiRkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQsXG4gICAgZGlzYWJsZWQgPSBfcmVmJGRpc2FibGVkID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkZGlzYWJsZWQsXG4gICAgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuLFxuICAgIF9yZWYkY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgY2xhc3NOYW1lID0gX3JlZiRjbGFzc05hbWUgPT09IHZvaWQgMCA/IHVuZGVmaW5lZCA6IF9yZWYkY2xhc3NOYW1lO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIGlubGluZVByb3AoY29uc3RhbnRzLkZPQ1VTX0FVVE8sICFkaXNhYmxlZCksIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9KSwgY2hpbGRyZW4pO1xufTtcbkF1dG9Gb2N1c0luc2lkZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgQXV0b0ZvY3VzSW5zaWRlOyIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRm9jdXNMb2NrVUkgZnJvbSAnLi9Mb2NrJztcbmltcG9ydCBGb2N1c1RyYXAgZnJvbSAnLi9UcmFwJztcbnZhciBGb2N1c0xvY2tDb21iaW5hdGlvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZvY3VzTG9ja1VJQ29tYmluYXRpb24ocHJvcHMsIHJlZikge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9jdXNMb2NrVUksIF9leHRlbmRzKHtcbiAgICBzaWRlQ2FyOiBGb2N1c1RyYXAsXG4gICAgcmVmOiByZWZcbiAgfSwgcHJvcHMpKTtcbn0pO1xudmFyIF9yZWYgPSBGb2N1c0xvY2tVSS5wcm9wVHlwZXMgfHwge30sXG4gIHNpZGVDYXIgPSBfcmVmLnNpZGVDYXIsXG4gIHByb3BUeXBlcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIFtcInNpZGVDYXJcIl0pO1xuRm9jdXNMb2NrQ29tYmluYXRpb24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gcHJvcFR5cGVzIDoge307XG5leHBvcnQgZGVmYXVsdCBGb2N1c0xvY2tDb21iaW5hdGlvbjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuZXhwb3J0IHZhciBoaWRkZW5HdWFyZCA9IHtcbiAgd2lkdGg6ICcxcHgnLFxuICBoZWlnaHQ6ICcwcHgnLFxuICBwYWRkaW5nOiAwLFxuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIHBvc2l0aW9uOiAnZml4ZWQnLFxuICB0b3A6ICcxcHgnLFxuICBsZWZ0OiAnMXB4J1xufTtcbnZhciBJbkZvY3VzR3VhcmQgPSBmdW5jdGlvbiBJbkZvY3VzR3VhcmQoX3JlZikge1xuICB2YXIgX3JlZiRjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgY2hpbGRyZW4gPSBfcmVmJGNoaWxkcmVuID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRjaGlsZHJlbjtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBcImd1YXJkLWZpcnN0XCIsXG4gICAgXCJkYXRhLWZvY3VzLWd1YXJkXCI6IHRydWUsXG4gICAgXCJkYXRhLWZvY3VzLWF1dG8tZ3VhcmRcIjogdHJ1ZSxcbiAgICBzdHlsZTogaGlkZGVuR3VhcmRcbiAgfSksIGNoaWxkcmVuLCBjaGlsZHJlbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAga2V5OiBcImd1YXJkLWxhc3RcIixcbiAgICBcImRhdGEtZm9jdXMtZ3VhcmRcIjogdHJ1ZSxcbiAgICBcImRhdGEtZm9jdXMtYXV0by1ndWFyZFwiOiB0cnVlLFxuICAgIHN0eWxlOiBoaWRkZW5HdWFyZFxuICB9KSk7XG59O1xuSW5Gb2N1c0d1YXJkLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBJbkZvY3VzR3VhcmQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJ2ZvY3VzLWxvY2svY29uc3RhbnRzJztcbmltcG9ydCB7IGlubGluZVByb3AgfSBmcm9tICcuL3V0aWwnO1xudmFyIEZyZWVGb2N1c0luc2lkZSA9IGZ1bmN0aW9uIEZyZWVGb2N1c0luc2lkZShfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWU7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7fSwgaW5saW5lUHJvcChjb25zdGFudHMuRk9DVVNfQUxMT1csIHRydWUpLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSksIGNoaWxkcmVuKTtcbn07XG5GcmVlRm9jdXNJbnNpZGUucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBGcmVlRm9jdXNJbnNpZGU7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBub2RlLCBib29sLCBzdHJpbmcsIGFueSwgYXJyYXlPZiwgb25lT2ZUeXBlLCBvYmplY3QsIGZ1bmMgfSBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICdmb2N1cy1sb2NrL2NvbnN0YW50cyc7XG5pbXBvcnQgeyB1c2VNZXJnZVJlZnMgfSBmcm9tICd1c2UtY2FsbGJhY2stcmVmJztcbmltcG9ydCB7IGhpZGRlbkd1YXJkIH0gZnJvbSAnLi9Gb2N1c0d1YXJkJztcbmltcG9ydCB7IG1lZGl1bUZvY3VzLCBtZWRpdW1CbHVyLCBtZWRpdW1TaWRlY2FyIH0gZnJvbSAnLi9tZWRpdW0nO1xuaW1wb3J0IHsgZm9jdXNTY29wZSB9IGZyb20gJy4vc2NvcGUnO1xudmFyIGVtcHR5QXJyYXkgPSBbXTtcbnZhciBGb2N1c0xvY2sgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb2N1c0xvY2tVSShwcm9wcywgcGFyZW50UmVmKSB7XG4gIHZhciBfZXh0ZW5kczI7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSgpLFxuICAgIHJlYWxPYnNlcnZlZCA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICBzZXRPYnNlcnZlZCA9IF9SZWFjdCR1c2VTdGF0ZVsxXTtcbiAgdmFyIG9ic2VydmVkID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBpc0FjdGl2ZSA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBvcmlnaW5hbEZvY3VzZWRFbGVtZW50ID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlMiA9IFJlYWN0LnVzZVN0YXRlKHt9KSxcbiAgICB1cGRhdGUgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICBfcHJvcHMkZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWQsXG4gICAgX3Byb3BzJG5vRm9jdXNHdWFyZHMgPSBwcm9wcy5ub0ZvY3VzR3VhcmRzLFxuICAgIG5vRm9jdXNHdWFyZHMgPSBfcHJvcHMkbm9Gb2N1c0d1YXJkcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkbm9Gb2N1c0d1YXJkcyxcbiAgICBfcHJvcHMkcGVyc2lzdGVudEZvY3UgPSBwcm9wcy5wZXJzaXN0ZW50Rm9jdXMsXG4gICAgcGVyc2lzdGVudEZvY3VzID0gX3Byb3BzJHBlcnNpc3RlbnRGb2N1ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRwZXJzaXN0ZW50Rm9jdSxcbiAgICBfcHJvcHMkY3Jvc3NGcmFtZSA9IHByb3BzLmNyb3NzRnJhbWUsXG4gICAgY3Jvc3NGcmFtZSA9IF9wcm9wcyRjcm9zc0ZyYW1lID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGNyb3NzRnJhbWUsXG4gICAgX3Byb3BzJGF1dG9Gb2N1cyA9IHByb3BzLmF1dG9Gb2N1cyxcbiAgICBhdXRvRm9jdXMgPSBfcHJvcHMkYXV0b0ZvY3VzID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGF1dG9Gb2N1cyxcbiAgICBhbGxvd1RleHRTZWxlY3Rpb24gPSBwcm9wcy5hbGxvd1RleHRTZWxlY3Rpb24sXG4gICAgZ3JvdXAgPSBwcm9wcy5ncm91cCxcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgd2hpdGVMaXN0ID0gcHJvcHMud2hpdGVMaXN0LFxuICAgIGhhc1Bvc2l0aXZlSW5kaWNlcyA9IHByb3BzLmhhc1Bvc2l0aXZlSW5kaWNlcyxcbiAgICBfcHJvcHMkc2hhcmRzID0gcHJvcHMuc2hhcmRzLFxuICAgIHNoYXJkcyA9IF9wcm9wcyRzaGFyZHMgPT09IHZvaWQgMCA/IGVtcHR5QXJyYXkgOiBfcHJvcHMkc2hhcmRzLFxuICAgIF9wcm9wcyRhcyA9IHByb3BzLmFzLFxuICAgIENvbnRhaW5lciA9IF9wcm9wcyRhcyA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkYXMsXG4gICAgX3Byb3BzJGxvY2tQcm9wcyA9IHByb3BzLmxvY2tQcm9wcyxcbiAgICBjb250YWluZXJQcm9wcyA9IF9wcm9wcyRsb2NrUHJvcHMgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGxvY2tQcm9wcyxcbiAgICBTaWRlQ2FyID0gcHJvcHMuc2lkZUNhcixcbiAgICBfcHJvcHMkcmV0dXJuRm9jdXMgPSBwcm9wcy5yZXR1cm5Gb2N1cyxcbiAgICBzaG91bGRSZXR1cm5Gb2N1cyA9IF9wcm9wcyRyZXR1cm5Gb2N1cyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkcmV0dXJuRm9jdXMsXG4gICAgZm9jdXNPcHRpb25zID0gcHJvcHMuZm9jdXNPcHRpb25zLFxuICAgIG9uQWN0aXZhdGlvbkNhbGxiYWNrID0gcHJvcHMub25BY3RpdmF0aW9uLFxuICAgIG9uRGVhY3RpdmF0aW9uQ2FsbGJhY2sgPSBwcm9wcy5vbkRlYWN0aXZhdGlvbjtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTMgPSBSZWFjdC51c2VTdGF0ZSh7fSksXG4gICAgaWQgPSBfUmVhY3QkdXNlU3RhdGUzWzBdO1xuICB2YXIgb25BY3RpdmF0aW9uID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgY2FwdHVyZUZvY3VzUmVzdG9yZSA9IF9yZWYuY2FwdHVyZUZvY3VzUmVzdG9yZTtcbiAgICBpZiAoIW9yaWdpbmFsRm9jdXNlZEVsZW1lbnQuY3VycmVudCkge1xuICAgICAgdmFyIF9kb2N1bWVudDtcbiAgICAgIHZhciBhY3RpdmVFbGVtZW50ID0gKF9kb2N1bWVudCA9IGRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBvcmlnaW5hbEZvY3VzZWRFbGVtZW50LmN1cnJlbnQgPSBhY3RpdmVFbGVtZW50O1xuICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgb3JpZ2luYWxGb2N1c2VkRWxlbWVudC5jdXJyZW50ID0gY2FwdHVyZUZvY3VzUmVzdG9yZShhY3RpdmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9ic2VydmVkLmN1cnJlbnQgJiYgb25BY3RpdmF0aW9uQ2FsbGJhY2spIHtcbiAgICAgIG9uQWN0aXZhdGlvbkNhbGxiYWNrKG9ic2VydmVkLmN1cnJlbnQpO1xuICAgIH1cbiAgICBpc0FjdGl2ZS5jdXJyZW50ID0gdHJ1ZTtcbiAgICB1cGRhdGUoKTtcbiAgfSwgW29uQWN0aXZhdGlvbkNhbGxiYWNrXSk7XG4gIHZhciBvbkRlYWN0aXZhdGlvbiA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICBpc0FjdGl2ZS5jdXJyZW50ID0gZmFsc2U7XG4gICAgaWYgKG9uRGVhY3RpdmF0aW9uQ2FsbGJhY2spIHtcbiAgICAgIG9uRGVhY3RpdmF0aW9uQ2FsbGJhY2sob2JzZXJ2ZWQuY3VycmVudCk7XG4gICAgfVxuICAgIHVwZGF0ZSgpO1xuICB9LCBbb25EZWFjdGl2YXRpb25DYWxsYmFja10pO1xuICB2YXIgcmV0dXJuRm9jdXMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoYWxsb3dEZWZlcikge1xuICAgIHZhciBmb2N1c1Jlc3RvcmUgPSBvcmlnaW5hbEZvY3VzZWRFbGVtZW50LmN1cnJlbnQ7XG4gICAgaWYgKGZvY3VzUmVzdG9yZSkge1xuICAgICAgdmFyIHJldHVybkZvY3VzVG8gPSAodHlwZW9mIGZvY3VzUmVzdG9yZSA9PT0gJ2Z1bmN0aW9uJyA/IGZvY3VzUmVzdG9yZSgpIDogZm9jdXNSZXN0b3JlKSB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgdmFyIGhvd1RvUmV0dXJuRm9jdXMgPSB0eXBlb2Ygc2hvdWxkUmV0dXJuRm9jdXMgPT09ICdmdW5jdGlvbicgPyBzaG91bGRSZXR1cm5Gb2N1cyhyZXR1cm5Gb2N1c1RvKSA6IHNob3VsZFJldHVybkZvY3VzO1xuICAgICAgaWYgKGhvd1RvUmV0dXJuRm9jdXMpIHtcbiAgICAgICAgdmFyIHJldHVybkZvY3VzT3B0aW9ucyA9IHR5cGVvZiBob3dUb1JldHVybkZvY3VzID09PSAnb2JqZWN0JyA/IGhvd1RvUmV0dXJuRm9jdXMgOiB1bmRlZmluZWQ7XG4gICAgICAgIG9yaWdpbmFsRm9jdXNlZEVsZW1lbnQuY3VycmVudCA9IG51bGw7XG4gICAgICAgIGlmIChhbGxvd0RlZmVyKSB7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuRm9jdXNUby5mb2N1cyhyZXR1cm5Gb2N1c09wdGlvbnMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybkZvY3VzVG8uZm9jdXMocmV0dXJuRm9jdXNPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwgW3Nob3VsZFJldHVybkZvY3VzXSk7XG4gIHZhciBvbkZvY3VzID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGlzQWN0aXZlLmN1cnJlbnQpIHtcbiAgICAgIG1lZGl1bUZvY3VzLnVzZU1lZGl1bShldmVudCk7XG4gICAgfVxuICB9LCBbXSk7XG4gIHZhciBvbkJsdXIgPSBtZWRpdW1CbHVyLnVzZU1lZGl1bTtcbiAgdmFyIHNldE9ic2VydmVOb2RlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5ld09ic2VydmVkKSB7XG4gICAgaWYgKG9ic2VydmVkLmN1cnJlbnQgIT09IG5ld09ic2VydmVkKSB7XG4gICAgICBvYnNlcnZlZC5jdXJyZW50ID0gbmV3T2JzZXJ2ZWQ7XG4gICAgICBzZXRPYnNlcnZlZChuZXdPYnNlcnZlZCk7XG4gICAgfVxuICB9LCBbXSk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBhbGxvd1RleHRTZWxlY3Rpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1JlYWN0LUZvY3VzLUxvY2s6IGFsbG93VGV4dFNlbGVjdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBlbmFibGVkIGJ5IGRlZmF1bHQnKTtcbiAgICB9XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghb2JzZXJ2ZWQuY3VycmVudCAmJiB0eXBlb2YgQ29udGFpbmVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGb2N1c0xvY2s6IGNvdWxkIG5vdCBvYnRhaW4gcmVmIHRvIGludGVybmFsIG5vZGUnKTtcbiAgICAgIH1cbiAgICB9LCBbXSk7XG4gIH1cbiAgdmFyIGxvY2tQcm9wcyA9IF9leHRlbmRzKChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW2NvbnN0YW50cy5GT0NVU19ESVNBQkxFRF0gPSBkaXNhYmxlZCAmJiAnZGlzYWJsZWQnLCBfZXh0ZW5kczJbY29uc3RhbnRzLkZPQ1VTX0dST1VQXSA9IGdyb3VwLCBfZXh0ZW5kczIpLCBjb250YWluZXJQcm9wcyk7XG4gIHZhciBoYXNMZWFkaW5nR3VhcmRzID0gbm9Gb2N1c0d1YXJkcyAhPT0gdHJ1ZTtcbiAgdmFyIGhhc1RhaWxpbmdHdWFyZHMgPSBoYXNMZWFkaW5nR3VhcmRzICYmIG5vRm9jdXNHdWFyZHMgIT09ICd0YWlsJztcbiAgdmFyIG1lcmdlZFJlZiA9IHVzZU1lcmdlUmVmcyhbcGFyZW50UmVmLCBzZXRPYnNlcnZlTm9kZV0pO1xuICB2YXIgZm9jdXNTY29wZVZhbHVlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9ic2VydmVkOiBvYnNlcnZlZCxcbiAgICAgIHNoYXJkczogc2hhcmRzLFxuICAgICAgZW5hYmxlZDogIWRpc2FibGVkLFxuICAgICAgYWN0aXZlOiBpc0FjdGl2ZS5jdXJyZW50XG4gICAgfTtcbiAgfSwgW2Rpc2FibGVkLCBpc0FjdGl2ZS5jdXJyZW50LCBzaGFyZHMsIHJlYWxPYnNlcnZlZF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGhhc0xlYWRpbmdHdWFyZHMgJiYgW1xuICAvKiNfX1BVUkVfXyovXG4gIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJndWFyZC1maXJzdFwiLFxuICAgIFwiZGF0YS1mb2N1cy1ndWFyZFwiOiB0cnVlLFxuICAgIHRhYkluZGV4OiBkaXNhYmxlZCA/IC0xIDogMCxcbiAgICBzdHlsZTogaGlkZGVuR3VhcmRcbiAgfSksIGhhc1Bvc2l0aXZlSW5kaWNlcyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiZ3VhcmQtbmVhcmVzdFwiLFxuICAgIFwiZGF0YS1mb2N1cy1ndWFyZFwiOiB0cnVlLFxuICAgIHRhYkluZGV4OiBkaXNhYmxlZCA/IC0xIDogMSxcbiAgICBzdHlsZTogaGlkZGVuR3VhcmRcbiAgfSkgOiBudWxsXSwgIWRpc2FibGVkICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNpZGVDYXIsIHtcbiAgICBpZDogaWQsXG4gICAgc2lkZUNhcjogbWVkaXVtU2lkZWNhcixcbiAgICBvYnNlcnZlZDogcmVhbE9ic2VydmVkLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBwZXJzaXN0ZW50Rm9jdXM6IHBlcnNpc3RlbnRGb2N1cyxcbiAgICBjcm9zc0ZyYW1lOiBjcm9zc0ZyYW1lLFxuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIHdoaXRlTGlzdDogd2hpdGVMaXN0LFxuICAgIHNoYXJkczogc2hhcmRzLFxuICAgIG9uQWN0aXZhdGlvbjogb25BY3RpdmF0aW9uLFxuICAgIG9uRGVhY3RpdmF0aW9uOiBvbkRlYWN0aXZhdGlvbixcbiAgICByZXR1cm5Gb2N1czogcmV0dXJuRm9jdXMsXG4gICAgZm9jdXNPcHRpb25zOiBmb2N1c09wdGlvbnNcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbnRhaW5lciwgX2V4dGVuZHMoe1xuICAgIHJlZjogbWVyZ2VkUmVmXG4gIH0sIGxvY2tQcm9wcywge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIG9uQmx1cjogb25CbHVyLFxuICAgIG9uRm9jdXM6IG9uRm9jdXNcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KGZvY3VzU2NvcGUuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZm9jdXNTY29wZVZhbHVlXG4gIH0sIGNoaWxkcmVuKSksIGhhc1RhaWxpbmdHdWFyZHMgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIFwiZGF0YS1mb2N1cy1ndWFyZFwiOiB0cnVlLFxuICAgIHRhYkluZGV4OiBkaXNhYmxlZCA/IC0xIDogMCxcbiAgICBzdHlsZTogaGlkZGVuR3VhcmRcbiAgfSkpO1xufSk7XG5Gb2N1c0xvY2sucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICBjaGlsZHJlbjogbm9kZSxcbiAgZGlzYWJsZWQ6IGJvb2wsXG4gIHJldHVybkZvY3VzOiBvbmVPZlR5cGUoW2Jvb2wsIG9iamVjdCwgZnVuY10pLFxuICBmb2N1c09wdGlvbnM6IG9iamVjdCxcbiAgbm9Gb2N1c0d1YXJkczogYm9vbCxcbiAgaGFzUG9zaXRpdmVJbmRpY2VzOiBib29sLFxuICBhbGxvd1RleHRTZWxlY3Rpb246IGJvb2wsXG4gIGF1dG9Gb2N1czogYm9vbCxcbiAgcGVyc2lzdGVudEZvY3VzOiBib29sLFxuICBjcm9zc0ZyYW1lOiBib29sLFxuICBncm91cDogc3RyaW5nLFxuICBjbGFzc05hbWU6IHN0cmluZyxcbiAgd2hpdGVMaXN0OiBmdW5jLFxuICBzaGFyZHM6IGFycmF5T2YoYW55KSxcbiAgYXM6IG9uZU9mVHlwZShbc3RyaW5nLCBmdW5jLCBvYmplY3RdKSxcbiAgbG9ja1Byb3BzOiBvYmplY3QsXG4gIG9uQWN0aXZhdGlvbjogZnVuYyxcbiAgb25EZWFjdGl2YXRpb246IGZ1bmMsXG4gIHNpZGVDYXI6IGFueS5pc1JlcXVpcmVkXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBGb2N1c0xvY2s7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICogYXMgY29uc3RhbnRzIGZyb20gJ2ZvY3VzLWxvY2svY29uc3RhbnRzJztcbmltcG9ydCB7IGlubGluZVByb3AgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgbWVkaXVtRWZmZWN0IH0gZnJvbSAnLi9tZWRpdW0nO1xuZXhwb3J0IHZhciB1c2VGb2N1c0luc2lkZSA9IGZ1bmN0aW9uIHVzZUZvY3VzSW5zaWRlKG9ic2VydmVkUmVmKSB7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVuYWJsZWQgPSB0cnVlO1xuICAgIG1lZGl1bUVmZmVjdC51c2VNZWRpdW0oZnVuY3Rpb24gKGNhcikge1xuICAgICAgdmFyIG9ic2VydmVkID0gb2JzZXJ2ZWRSZWYgJiYgb2JzZXJ2ZWRSZWYuY3VycmVudDtcbiAgICAgIGlmIChlbmFibGVkICYmIG9ic2VydmVkKSB7XG4gICAgICAgIGlmICghY2FyLmZvY3VzSW5zaWRlKG9ic2VydmVkKSkge1xuICAgICAgICAgIGNhci5tb3ZlRm9jdXNJbnNpZGUob2JzZXJ2ZWQsIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGVuYWJsZWQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbb2JzZXJ2ZWRSZWZdKTtcbn07XG5mdW5jdGlvbiBNb3ZlRm9jdXNJbnNpZGUoX3JlZikge1xuICB2YXIgX3JlZiRkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQsXG4gICAgaXNEaXNhYmxlZCA9IF9yZWYkZGlzYWJsZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRkaXNhYmxlZCxcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gIHZhciByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHVzZUZvY3VzSW5zaWRlKGlzRGlzYWJsZWQgPyB1bmRlZmluZWQgOiByZWYpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIGlubGluZVByb3AoY29uc3RhbnRzLkZPQ1VTX0FVVE8sICFpc0Rpc2FibGVkKSwge1xuICAgIHJlZjogcmVmLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gIH0pLCBjaGlsZHJlbik7XG59XG5Nb3ZlRm9jdXNJbnNpZGUucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IE1vdmVGb2N1c0luc2lkZTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpdGhTaWRlRWZmZWN0IGZyb20gJ3JlYWN0LWNsaWVudHNpZGUtZWZmZWN0JztcbmltcG9ydCB7IG1vdmVGb2N1c0luc2lkZSwgZm9jdXNJbnNpZGUsIGZvY3VzSXNIaWRkZW4sIGV4cGFuZEZvY3VzYWJsZU5vZGVzLCBmb2N1c05leHRFbGVtZW50LCBmb2N1c1ByZXZFbGVtZW50LCBmb2N1c0ZpcnN0RWxlbWVudCwgZm9jdXNMYXN0RWxlbWVudCwgY2FwdHVyZUZvY3VzUmVzdG9yZSB9IGZyb20gJ2ZvY3VzLWxvY2snO1xuaW1wb3J0IHsgZGVmZXJBY3Rpb24sIGV4dHJhY3RSZWYgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgbWVkaXVtRm9jdXMsIG1lZGl1bUJsdXIsIG1lZGl1bUVmZmVjdCB9IGZyb20gJy4vbWVkaXVtJztcbnZhciBmb2N1c09uQm9keSA9IGZ1bmN0aW9uIGZvY3VzT25Cb2R5KCkge1xuICByZXR1cm4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keTtcbn07XG52YXIgaXNGcmVlRm9jdXMgPSBmdW5jdGlvbiBpc0ZyZWVGb2N1cygpIHtcbiAgcmV0dXJuIGZvY3VzT25Cb2R5KCkgfHwgZm9jdXNJc0hpZGRlbigpO1xufTtcbnZhciBsYXN0QWN0aXZlVHJhcCA9IG51bGw7XG52YXIgbGFzdEFjdGl2ZUZvY3VzID0gbnVsbDtcbnZhciBsYXN0UG9ydGFsZWRFbGVtZW50ID0gbnVsbDtcbnZhciBmb2N1c1dhc091dHNpZGVXaW5kb3cgPSBmYWxzZTtcbnZhciBkZWZhdWx0V2hpdGVsaXN0ID0gZnVuY3Rpb24gZGVmYXVsdFdoaXRlbGlzdCgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIGZvY3VzV2hpdGVsaXN0ZWQgPSBmdW5jdGlvbiBmb2N1c1doaXRlbGlzdGVkKGFjdGl2ZUVsZW1lbnQpIHtcbiAgcmV0dXJuIChsYXN0QWN0aXZlVHJhcC53aGl0ZUxpc3QgfHwgZGVmYXVsdFdoaXRlbGlzdCkoYWN0aXZlRWxlbWVudCk7XG59O1xudmFyIHJlY29yZFBvcnRhbCA9IGZ1bmN0aW9uIHJlY29yZFBvcnRhbChvYnNlcnZlck5vZGUsIHBvcnRhbGVkRWxlbWVudCkge1xuICBsYXN0UG9ydGFsZWRFbGVtZW50ID0ge1xuICAgIG9ic2VydmVyTm9kZTogb2JzZXJ2ZXJOb2RlLFxuICAgIHBvcnRhbGVkRWxlbWVudDogcG9ydGFsZWRFbGVtZW50XG4gIH07XG59O1xudmFyIGZvY3VzSXNQb3J0YWxlZFBhaXIgPSBmdW5jdGlvbiBmb2N1c0lzUG9ydGFsZWRQYWlyKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGxhc3RQb3J0YWxlZEVsZW1lbnQgJiYgbGFzdFBvcnRhbGVkRWxlbWVudC5wb3J0YWxlZEVsZW1lbnQgPT09IGVsZW1lbnQ7XG59O1xuZnVuY3Rpb24gYXV0b0d1YXJkKHN0YXJ0SW5kZXgsIGVuZCwgc3RlcCwgYWxsTm9kZXMpIHtcbiAgdmFyIGxhc3RHdWFyZCA9IG51bGw7XG4gIHZhciBpID0gc3RhcnRJbmRleDtcbiAgZG8ge1xuICAgIHZhciBpdGVtID0gYWxsTm9kZXNbaV07XG4gICAgaWYgKGl0ZW0uZ3VhcmQpIHtcbiAgICAgIGlmIChpdGVtLm5vZGUuZGF0YXNldC5mb2N1c0F1dG9HdWFyZCkge1xuICAgICAgICBsYXN0R3VhcmQgPSBpdGVtO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXRlbS5sb2NrSXRlbSkge1xuICAgICAgaWYgKGkgIT09IHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGFzdEd1YXJkID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9IHdoaWxlICgoaSArPSBzdGVwKSAhPT0gZW5kKTtcbiAgaWYgKGxhc3RHdWFyZCkge1xuICAgIGxhc3RHdWFyZC5ub2RlLnRhYkluZGV4ID0gMDtcbiAgfVxufVxudmFyIGZvY3VzV2FzT3V0c2lkZSA9IGZ1bmN0aW9uIGZvY3VzV2FzT3V0c2lkZShjcm9zc0ZyYW1lT3B0aW9uKSB7XG4gIGlmIChjcm9zc0ZyYW1lT3B0aW9uKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oZm9jdXNXYXNPdXRzaWRlV2luZG93KTtcbiAgfVxuICByZXR1cm4gZm9jdXNXYXNPdXRzaWRlV2luZG93ID09PSAnbWVhbndoaWxlJztcbn07XG52YXIgY2hlY2tJbkhvc3QgPSBmdW5jdGlvbiBjaGVja0luSG9zdChjaGVjaywgZWwsIGJvdW5kYXJ5KSB7XG4gIHJldHVybiBlbCAmJiAoZWwuaG9zdCA9PT0gY2hlY2sgJiYgKCFlbC5hY3RpdmVFbGVtZW50IHx8IGJvdW5kYXJ5LmNvbnRhaW5zKGVsLmFjdGl2ZUVsZW1lbnQpKSB8fCBlbC5wYXJlbnROb2RlICYmIGNoZWNrSW5Ib3N0KGNoZWNrLCBlbC5wYXJlbnROb2RlLCBib3VuZGFyeSkpO1xufTtcbnZhciB3aXRoaW5Ib3N0ID0gZnVuY3Rpb24gd2l0aGluSG9zdChhY3RpdmVFbGVtZW50LCB3b3JraW5nQXJlYSkge1xuICByZXR1cm4gd29ya2luZ0FyZWEuc29tZShmdW5jdGlvbiAoYXJlYSkge1xuICAgIHJldHVybiBjaGVja0luSG9zdChhY3RpdmVFbGVtZW50LCBhcmVhLCBhcmVhKTtcbiAgfSk7XG59O1xudmFyIGFjdGl2YXRlVHJhcCA9IGZ1bmN0aW9uIGFjdGl2YXRlVHJhcCgpIHtcbiAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICBpZiAobGFzdEFjdGl2ZVRyYXApIHtcbiAgICB2YXIgX2xhc3RBY3RpdmVUcmFwID0gbGFzdEFjdGl2ZVRyYXAsXG4gICAgICBvYnNlcnZlZCA9IF9sYXN0QWN0aXZlVHJhcC5vYnNlcnZlZCxcbiAgICAgIHBlcnNpc3RlbnRGb2N1cyA9IF9sYXN0QWN0aXZlVHJhcC5wZXJzaXN0ZW50Rm9jdXMsXG4gICAgICBhdXRvRm9jdXMgPSBfbGFzdEFjdGl2ZVRyYXAuYXV0b0ZvY3VzLFxuICAgICAgc2hhcmRzID0gX2xhc3RBY3RpdmVUcmFwLnNoYXJkcyxcbiAgICAgIGNyb3NzRnJhbWUgPSBfbGFzdEFjdGl2ZVRyYXAuY3Jvc3NGcmFtZSxcbiAgICAgIGZvY3VzT3B0aW9ucyA9IF9sYXN0QWN0aXZlVHJhcC5mb2N1c09wdGlvbnM7XG4gICAgdmFyIHdvcmtpbmdOb2RlID0gb2JzZXJ2ZWQgfHwgbGFzdFBvcnRhbGVkRWxlbWVudCAmJiBsYXN0UG9ydGFsZWRFbGVtZW50LnBvcnRhbGVkRWxlbWVudDtcbiAgICB2YXIgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHdvcmtpbmdOb2RlKSB7XG4gICAgICB2YXIgd29ya2luZ0FyZWEgPSBbd29ya2luZ05vZGVdLmNvbmNhdChzaGFyZHMubWFwKGV4dHJhY3RSZWYpLmZpbHRlcihCb29sZWFuKSk7XG4gICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQgfHwgZm9jdXNXaGl0ZWxpc3RlZChhY3RpdmVFbGVtZW50KSkge1xuICAgICAgICBpZiAocGVyc2lzdGVudEZvY3VzIHx8IGZvY3VzV2FzT3V0c2lkZShjcm9zc0ZyYW1lKSB8fCAhaXNGcmVlRm9jdXMoKSB8fCAhbGFzdEFjdGl2ZUZvY3VzICYmIGF1dG9Gb2N1cykge1xuICAgICAgICAgIGlmICh3b3JraW5nTm9kZSAmJiAhKGZvY3VzSW5zaWRlKHdvcmtpbmdBcmVhKSB8fCBhY3RpdmVFbGVtZW50ICYmIHdpdGhpbkhvc3QoYWN0aXZlRWxlbWVudCwgd29ya2luZ0FyZWEpIHx8IGZvY3VzSXNQb3J0YWxlZFBhaXIoYWN0aXZlRWxlbWVudCwgd29ya2luZ05vZGUpKSkge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50ICYmICFsYXN0QWN0aXZlRm9jdXMgJiYgYWN0aXZlRWxlbWVudCAmJiAhYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgICAgIGlmIChhY3RpdmVFbGVtZW50LmJsdXIpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmZvY3VzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQgPSBtb3ZlRm9jdXNJbnNpZGUod29ya2luZ0FyZWEsIGxhc3RBY3RpdmVGb2N1cywge1xuICAgICAgICAgICAgICAgIGZvY3VzT3B0aW9uczogZm9jdXNPcHRpb25zXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBsYXN0UG9ydGFsZWRFbGVtZW50ID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvY3VzV2FzT3V0c2lkZVdpbmRvdyA9IGZhbHNlO1xuICAgICAgICAgIGxhc3RBY3RpdmVGb2N1cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkb2N1bWVudCAmJiBhY3RpdmVFbGVtZW50ICE9PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZvY3VzLWF1dG8tZ3VhcmRdJykpIHtcbiAgICAgICAgdmFyIG5ld0FjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICB2YXIgYWxsTm9kZXMgPSBleHBhbmRGb2N1c2FibGVOb2Rlcyh3b3JraW5nQXJlYSk7XG4gICAgICAgIHZhciBmb2N1c2VkSW5kZXggPSBhbGxOb2Rlcy5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICB2YXIgbm9kZSA9IF9yZWYubm9kZTtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfSkuaW5kZXhPZihuZXdBY3RpdmVFbGVtZW50KTtcbiAgICAgICAgaWYgKGZvY3VzZWRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgYWxsTm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgICAgdmFyIGd1YXJkID0gX3JlZjIuZ3VhcmQsXG4gICAgICAgICAgICAgIG5vZGUgPSBfcmVmMi5ub2RlO1xuICAgICAgICAgICAgcmV0dXJuIGd1YXJkICYmIG5vZGUuZGF0YXNldC5mb2N1c0F1dG9HdWFyZDtcbiAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBfcmVmMy5ub2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd0YWJJbmRleCcpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGF1dG9HdWFyZChmb2N1c2VkSW5kZXgsIGFsbE5vZGVzLmxlbmd0aCwgKzEsIGFsbE5vZGVzKTtcbiAgICAgICAgICBhdXRvR3VhcmQoZm9jdXNlZEluZGV4LCAtMSwgLTEsIGFsbE5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBvblRyYXAgPSBmdW5jdGlvbiBvblRyYXAoZXZlbnQpIHtcbiAgaWYgKGFjdGl2YXRlVHJhcCgpICYmIGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxufTtcbnZhciBvbkJsdXIgPSBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gIHJldHVybiBkZWZlckFjdGlvbihhY3RpdmF0ZVRyYXApO1xufTtcbnZhciBvbkZvY3VzID0gZnVuY3Rpb24gb25Gb2N1cyhldmVudCkge1xuICB2YXIgc291cmNlID0gZXZlbnQudGFyZ2V0O1xuICB2YXIgY3VycmVudE5vZGUgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICBpZiAoIWN1cnJlbnROb2RlLmNvbnRhaW5zKHNvdXJjZSkpIHtcbiAgICByZWNvcmRQb3J0YWwoY3VycmVudE5vZGUsIHNvdXJjZSk7XG4gIH1cbn07XG52YXIgRm9jdXNXYXRjaGVyID0gZnVuY3Rpb24gRm9jdXNXYXRjaGVyKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG52YXIgRm9jdXNUcmFwID0gZnVuY3Rpb24gRm9jdXNUcmFwKF9yZWY0KSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWY0LmNoaWxkcmVuO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIG9uQmx1cjogb25CbHVyLFxuICAgIG9uRm9jdXM6IG9uRm9jdXNcbiAgfSwgY2hpbGRyZW4pO1xufTtcbkZvY3VzVHJhcC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkXG59IDoge307XG52YXIgb25XaW5kb3dCbHVyID0gZnVuY3Rpb24gb25XaW5kb3dCbHVyKCkge1xuICBmb2N1c1dhc091dHNpZGVXaW5kb3cgPSAnanVzdCc7XG4gIGRlZmVyQWN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICBmb2N1c1dhc091dHNpZGVXaW5kb3cgPSAnbWVhbndoaWxlJztcbiAgfSk7XG59O1xudmFyIGF0dGFjaEhhbmRsZXIgPSBmdW5jdGlvbiBhdHRhY2hIYW5kbGVyKCkge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgb25UcmFwKTtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBvbkJsdXIpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIG9uV2luZG93Qmx1cik7XG59O1xudmFyIGRldGFjaEhhbmRsZXIgPSBmdW5jdGlvbiBkZXRhY2hIYW5kbGVyKCkge1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c2luJywgb25UcmFwKTtcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBvbkJsdXIpO1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIG9uV2luZG93Qmx1cik7XG59O1xuZnVuY3Rpb24gcmVkdWNlUHJvcHNUb1N0YXRlKHByb3BzTGlzdCkge1xuICByZXR1cm4gcHJvcHNMaXN0LmZpbHRlcihmdW5jdGlvbiAoX3JlZjUpIHtcbiAgICB2YXIgZGlzYWJsZWQgPSBfcmVmNS5kaXNhYmxlZDtcbiAgICByZXR1cm4gIWRpc2FibGVkO1xuICB9KTtcbn1cbnZhciBmb2N1c0xvY2tBUEkgPSB7XG4gIG1vdmVGb2N1c0luc2lkZTogbW92ZUZvY3VzSW5zaWRlLFxuICBmb2N1c0luc2lkZTogZm9jdXNJbnNpZGUsXG4gIGZvY3VzTmV4dEVsZW1lbnQ6IGZvY3VzTmV4dEVsZW1lbnQsXG4gIGZvY3VzUHJldkVsZW1lbnQ6IGZvY3VzUHJldkVsZW1lbnQsXG4gIGZvY3VzRmlyc3RFbGVtZW50OiBmb2N1c0ZpcnN0RWxlbWVudCxcbiAgZm9jdXNMYXN0RWxlbWVudDogZm9jdXNMYXN0RWxlbWVudCxcbiAgY2FwdHVyZUZvY3VzUmVzdG9yZTogY2FwdHVyZUZvY3VzUmVzdG9yZVxufTtcbmZ1bmN0aW9uIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQodHJhcHMpIHtcbiAgdmFyIHRyYXAgPSB0cmFwcy5zbGljZSgtMSlbMF07XG4gIGlmICh0cmFwICYmICFsYXN0QWN0aXZlVHJhcCkge1xuICAgIGF0dGFjaEhhbmRsZXIoKTtcbiAgfVxuICB2YXIgbGFzdFRyYXAgPSBsYXN0QWN0aXZlVHJhcDtcbiAgdmFyIHNhbWVUcmFwID0gbGFzdFRyYXAgJiYgdHJhcCAmJiB0cmFwLmlkID09PSBsYXN0VHJhcC5pZDtcbiAgbGFzdEFjdGl2ZVRyYXAgPSB0cmFwO1xuICBpZiAobGFzdFRyYXAgJiYgIXNhbWVUcmFwKSB7XG4gICAgbGFzdFRyYXAub25EZWFjdGl2YXRpb24oKTtcbiAgICBpZiAoIXRyYXBzLmZpbHRlcihmdW5jdGlvbiAoX3JlZjYpIHtcbiAgICAgIHZhciBpZCA9IF9yZWY2LmlkO1xuICAgICAgcmV0dXJuIGlkID09PSBsYXN0VHJhcC5pZDtcbiAgICB9KS5sZW5ndGgpIHtcbiAgICAgIGxhc3RUcmFwLnJldHVybkZvY3VzKCF0cmFwKTtcbiAgICB9XG4gIH1cbiAgaWYgKHRyYXApIHtcbiAgICBsYXN0QWN0aXZlRm9jdXMgPSBudWxsO1xuICAgIGlmICghc2FtZVRyYXAgfHwgbGFzdFRyYXAub2JzZXJ2ZWQgIT09IHRyYXAub2JzZXJ2ZWQpIHtcbiAgICAgIHRyYXAub25BY3RpdmF0aW9uKGZvY3VzTG9ja0FQSSk7XG4gICAgfVxuICAgIGFjdGl2YXRlVHJhcCh0cnVlKTtcbiAgICBkZWZlckFjdGlvbihhY3RpdmF0ZVRyYXApO1xuICB9IGVsc2Uge1xuICAgIGRldGFjaEhhbmRsZXIoKTtcbiAgICBsYXN0QWN0aXZlRm9jdXMgPSBudWxsO1xuICB9XG59XG5tZWRpdW1Gb2N1cy5hc3NpZ25TeW5jTWVkaXVtKG9uRm9jdXMpO1xubWVkaXVtQmx1ci5hc3NpZ25NZWRpdW0ob25CbHVyKTtcbm1lZGl1bUVmZmVjdC5hc3NpZ25NZWRpdW0oZnVuY3Rpb24gKGNiKSB7XG4gIHJldHVybiBjYihmb2N1c0xvY2tBUEkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCB3aXRoU2lkZUVmZmVjdChyZWR1Y2VQcm9wc1RvU3RhdGUsIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQpKEZvY3VzV2F0Y2hlcik7IiwiaW1wb3J0IEZvY3VzTG9ja1VJIGZyb20gJy4vTG9jayc7XG5pbXBvcnQgQXV0b0ZvY3VzSW5zaWRlIGZyb20gJy4vQXV0b0ZvY3VzSW5zaWRlJztcbmltcG9ydCBNb3ZlRm9jdXNJbnNpZGUsIHsgdXNlRm9jdXNJbnNpZGUgfSBmcm9tICcuL01vdmVGb2N1c0luc2lkZSc7XG5pbXBvcnQgRnJlZUZvY3VzSW5zaWRlIGZyb20gJy4vRnJlZUZvY3VzSW5zaWRlJztcbmltcG9ydCBJbkZvY3VzR3VhcmQgZnJvbSAnLi9Gb2N1c0d1YXJkJztcbmltcG9ydCB7IHVzZUZvY3VzQ29udHJvbGxlciwgdXNlRm9jdXNTY29wZSB9IGZyb20gJy4vdXNlLWZvY3VzLXNjb3BlJztcbmltcG9ydCB7IHVzZUZvY3VzU3RhdGUgfSBmcm9tICcuL3VzZS1mb2N1cy1zdGF0ZSc7XG5leHBvcnQgeyBBdXRvRm9jdXNJbnNpZGUsIE1vdmVGb2N1c0luc2lkZSwgRnJlZUZvY3VzSW5zaWRlLCBJbkZvY3VzR3VhcmQsIEZvY3VzTG9ja1VJLCB1c2VGb2N1c0luc2lkZSwgdXNlRm9jdXNDb250cm9sbGVyLCB1c2VGb2N1c1Njb3BlLCB1c2VGb2N1c1N0YXRlIH07XG5leHBvcnQgZGVmYXVsdCBGb2N1c0xvY2tVSTsiLCJpbXBvcnQgRm9jdXNMb2NrIGZyb20gJy4vQ29tYmluYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9VSSc7XG5leHBvcnQgZGVmYXVsdCBGb2N1c0xvY2s7IiwiaW1wb3J0IHsgY3JlYXRlTWVkaXVtLCBjcmVhdGVTaWRlY2FyTWVkaXVtIH0gZnJvbSAndXNlLXNpZGVjYXInO1xuZXhwb3J0IHZhciBtZWRpdW1Gb2N1cyA9IGNyZWF0ZU1lZGl1bSh7fSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyIHRhcmdldCA9IF9yZWYudGFyZ2V0LFxuICAgIGN1cnJlbnRUYXJnZXQgPSBfcmVmLmN1cnJlbnRUYXJnZXQ7XG4gIHJldHVybiB7XG4gICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldFxuICB9O1xufSk7XG5leHBvcnQgdmFyIG1lZGl1bUJsdXIgPSBjcmVhdGVNZWRpdW0oKTtcbmV4cG9ydCB2YXIgbWVkaXVtRWZmZWN0ID0gY3JlYXRlTWVkaXVtKCk7XG5leHBvcnQgdmFyIG1lZGl1bVNpZGVjYXIgPSBjcmVhdGVTaWRlY2FyTWVkaXVtKHtcbiAgYXN5bmM6IHRydWUsXG4gIHNzcjogdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xufSk7IiwiZXhwb3J0IHZhciBjcmVhdGVOYW5vRXZlbnRzID0gZnVuY3Rpb24gY3JlYXRlTmFub0V2ZW50cygpIHtcbiAgcmV0dXJuIHtcbiAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGV2ZW50KSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDAsIGNhbGxiYWNrcyA9IHRoaXMuZXZlbnRzW2V2ZW50XSB8fCBbXSwgbGVuZ3RoID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tpXS5hcHBseShjYWxsYmFja3MsIGFyZ3MpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZXZlbnRzOiB7fSxcbiAgICBvbjogZnVuY3Rpb24gb24oZXZlbnQsIGNiKSB7XG4gICAgICB2YXIgX3RoaXMkZXZlbnRzLFxuICAgICAgICBfdGhpcyA9IHRoaXM7XG4gICAgICAoKF90aGlzJGV2ZW50cyA9IHRoaXMuZXZlbnRzKVtldmVudF0gfHwgKF90aGlzJGV2ZW50c1tldmVudF0gPSBbXSkpLnB1c2goY2IpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzJGV2ZW50cyRldmVudDtcbiAgICAgICAgX3RoaXMuZXZlbnRzW2V2ZW50XSA9IChfdGhpcyRldmVudHMkZXZlbnQgPSBfdGhpcy5ldmVudHNbZXZlbnRdKSA9PSBudWxsID8gdm9pZCAwIDogX3RoaXMkZXZlbnRzJGV2ZW50LmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHJldHVybiBjYiAhPT0gaTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn07IiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCB2YXIgZm9jdXNTY29wZSA9IC8qI19fUFVSRV9fKi9jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmb2N1c1Njb3BlIH0gZnJvbSAnLi9zY29wZSc7XG5pbXBvcnQgeyBtZWRpdW1FZmZlY3QgfSBmcm9tICcuL21lZGl1bSc7XG5pbXBvcnQgeyBleHRyYWN0UmVmIH0gZnJvbSAnLi91dGlsJztcbnZhciBjb2xsYXBzZVJlZnMgPSBmdW5jdGlvbiBjb2xsYXBzZVJlZnMoc2hhcmRzKSB7XG4gIHJldHVybiBzaGFyZHMubWFwKGV4dHJhY3RSZWYpLmZpbHRlcihCb29sZWFuKTtcbn07XG52YXIgd2l0aE1lZGl1bSA9IGZ1bmN0aW9uIHdpdGhNZWRpdW0oZm4pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgcmV0dXJuIG1lZGl1bUVmZmVjdC51c2VNZWRpdW0oZnVuY3Rpb24gKCkge1xuICAgICAgcmVzb2x2ZShmbi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cykpO1xuICAgIH0pO1xuICB9KTtcbn07XG5leHBvcnQgdmFyIHVzZUZvY3VzQ29udHJvbGxlciA9IGZ1bmN0aW9uIHVzZUZvY3VzQ29udHJvbGxlcigpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHNoYXJkcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBzaGFyZHNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgaWYgKCFzaGFyZHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VGb2N1c0NvbnRyb2xsZXIgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHRhcmdldCBlbGVtZW50Jyk7XG4gIH1cbiAgdmFyIHJlZiA9IHVzZVJlZihzaGFyZHMpO1xuICByZWYuY3VycmVudCA9IHNoYXJkcztcbiAgcmV0dXJuIHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdXRvRm9jdXM6IGZ1bmN0aW9uIGF1dG9Gb2N1cyhmb2N1c09wdGlvbnMpIHtcbiAgICAgICAgaWYgKGZvY3VzT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgZm9jdXNPcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdpdGhNZWRpdW0oZnVuY3Rpb24gKGNhcikge1xuICAgICAgICAgIHJldHVybiBjYXIubW92ZUZvY3VzSW5zaWRlKGNvbGxhcHNlUmVmcyhyZWYuY3VycmVudCksIG51bGwsIGZvY3VzT3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZvY3VzTmV4dDogZnVuY3Rpb24gZm9jdXNOZXh0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhNZWRpdW0oZnVuY3Rpb24gKGNhcikge1xuICAgICAgICAgIGNhci5tb3ZlRm9jdXNJbnNpZGUoY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KSwgbnVsbCk7XG4gICAgICAgICAgY2FyLmZvY3VzTmV4dEVsZW1lbnQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCwgX2V4dGVuZHMoe1xuICAgICAgICAgICAgc2NvcGU6IGNvbGxhcHNlUmVmcyhyZWYuY3VycmVudClcbiAgICAgICAgICB9LCBvcHRpb25zKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZvY3VzUHJldjogZnVuY3Rpb24gZm9jdXNQcmV2KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhNZWRpdW0oZnVuY3Rpb24gKGNhcikge1xuICAgICAgICAgIGNhci5tb3ZlRm9jdXNJbnNpZGUoY29sbGFwc2VSZWZzKHJlZi5jdXJyZW50KSwgbnVsbCk7XG4gICAgICAgICAgY2FyLmZvY3VzUHJldkVsZW1lbnQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCwgX2V4dGVuZHMoe1xuICAgICAgICAgICAgc2NvcGU6IGNvbGxhcHNlUmVmcyhyZWYuY3VycmVudClcbiAgICAgICAgICB9LCBvcHRpb25zKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZvY3VzRmlyc3Q6IGZ1bmN0aW9uIGZvY3VzRmlyc3Qob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gd2l0aE1lZGl1bShmdW5jdGlvbiAoY2FyKSB7XG4gICAgICAgICAgY2FyLmZvY3VzRmlyc3RFbGVtZW50KGNvbGxhcHNlUmVmcyhyZWYuY3VycmVudCksIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmb2N1c0xhc3Q6IGZ1bmN0aW9uIGZvY3VzTGFzdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB3aXRoTWVkaXVtKGZ1bmN0aW9uIChjYXIpIHtcbiAgICAgICAgICBjYXIuZm9jdXNMYXN0RWxlbWVudChjb2xsYXBzZVJlZnMocmVmLmN1cnJlbnQpLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW10pO1xufTtcbmV4cG9ydCB2YXIgdXNlRm9jdXNTY29wZSA9IGZ1bmN0aW9uIHVzZUZvY3VzU2NvcGUoKSB7XG4gIHZhciBzY29wZSA9IHVzZUNvbnRleHQoZm9jdXNTY29wZSk7XG4gIGlmICghc2NvcGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvY3VzTG9jayBpcyByZXF1aXJlZCB0byBvcGVyYXRlIHdpdGggRm9jdXNTY29wZScpO1xuICB9XG4gIHJldHVybiB1c2VGb2N1c0NvbnRyb2xsZXIuYXBwbHkodm9pZCAwLCBbc2NvcGUub2JzZXJ2ZWRdLmNvbmNhdChzY29wZS5zaGFyZHMpKTtcbn07IiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZU5hbm9FdmVudHMgfSBmcm9tICcuL25hbm8tZXZlbnRzJztcbnZhciBtYWluYnVzID0gY3JlYXRlTmFub0V2ZW50cygpO1xudmFyIHN1YnNjcmliZUNvdW50ZXIgPSAwO1xudmFyIG9uRm9jdXNJbiA9IGZ1bmN0aW9uIG9uRm9jdXNJbihldmVudCkge1xuICByZXR1cm4gbWFpbmJ1cy5lbWl0KCdhc3NpZ24nLCBldmVudC50YXJnZXQpO1xufTtcbnZhciBvbkZvY3VzT3V0ID0gZnVuY3Rpb24gb25Gb2N1c091dChldmVudCkge1xuICByZXR1cm4gbWFpbmJ1cy5lbWl0KCdyZXNldCcsIGV2ZW50LnRhcmdldCk7XG59O1xudmFyIHVzZURvY3VtZW50Rm9jdXNTdWJzY3JpYmUgPSBmdW5jdGlvbiB1c2VEb2N1bWVudEZvY3VzU3Vic2NyaWJlKCkge1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3Vic2NyaWJlQ291bnRlcikge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG9uRm9jdXNJbik7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXNPdXQpO1xuICAgIH1cbiAgICBzdWJzY3JpYmVDb3VudGVyICs9IDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHN1YnNjcmliZUNvdW50ZXIgLT0gMTtcbiAgICAgIGlmICghc3Vic2NyaWJlQ291bnRlcikge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c2luJywgb25Gb2N1c0luKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBvbkZvY3VzT3V0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG59O1xudmFyIGdldEZvY3VzU3RhdGUgPSBmdW5jdGlvbiBnZXRGb2N1c1N0YXRlKHRhcmdldCwgY3VycmVudCkge1xuICBpZiAodGFyZ2V0ID09PSBjdXJyZW50KSB7XG4gICAgcmV0dXJuICdzZWxmJztcbiAgfVxuICBpZiAoY3VycmVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgcmV0dXJuICd3aXRoaW4nO1xuICB9XG4gIHJldHVybiAnd2l0aGluLWJvdW5kYXJ5Jztcbn07XG5leHBvcnQgdmFyIHVzZUZvY3VzU3RhdGUgPSBmdW5jdGlvbiB1c2VGb2N1c1N0YXRlKGNhbGxiYWNrcykge1xuICBpZiAoY2FsbGJhY2tzID09PSB2b2lkIDApIHtcbiAgICBjYWxsYmFja3MgPSB7fTtcbiAgfVxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoZmFsc2UpLFxuICAgIGFjdGl2ZSA9IF91c2VTdGF0ZVswXSxcbiAgICBzZXRBY3RpdmUgPSBfdXNlU3RhdGVbMV07XG4gIHZhciBfdXNlU3RhdGUyID0gdXNlU3RhdGUoJycpLFxuICAgIHN0YXRlID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRTdGF0ZSA9IF91c2VTdGF0ZTJbMV07XG4gIHZhciByZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBmb2N1c1N0YXRlID0gdXNlUmVmKHt9KTtcbiAgdmFyIHN0YXRlVHJhY2tlciA9IHVzZVJlZihmYWxzZSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJlZi5jdXJyZW50KSB7XG4gICAgICB2YXIgaXNBbHJlYWR5Rm9jdXNlZCA9IHJlZi5jdXJyZW50ID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IHx8IHJlZi5jdXJyZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICAgICAgc2V0QWN0aXZlKGlzQWxyZWFkeUZvY3VzZWQpO1xuICAgICAgc2V0U3RhdGUoZ2V0Rm9jdXNTdGF0ZShkb2N1bWVudC5hY3RpdmVFbGVtZW50LCByZWYuY3VycmVudCkpO1xuICAgICAgaWYgKGlzQWxyZWFkeUZvY3VzZWQgJiYgY2FsbGJhY2tzLm9uRm9jdXMpIHtcbiAgICAgICAgY2FsbGJhY2tzLm9uRm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKTtcbiAgdmFyIG9uRm9jdXMgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoZSkge1xuICAgIGZvY3VzU3RhdGUuY3VycmVudCA9IHtcbiAgICAgIGZvY3VzZWQ6IHRydWUsXG4gICAgICBzdGF0ZTogZ2V0Rm9jdXNTdGF0ZShlLnRhcmdldCwgZS5jdXJyZW50VGFyZ2V0KVxuICAgIH07XG4gIH0sIFtdKTtcbiAgdXNlRG9jdW1lbnRGb2N1c1N1YnNjcmliZSgpO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBmb3V0ID0gbWFpbmJ1cy5vbigncmVzZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb2N1c1N0YXRlLmN1cnJlbnQgPSB7fTtcbiAgICB9KTtcbiAgICB2YXIgZmluID0gbWFpbmJ1cy5vbignYXNzaWduJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gZm9jdXNTdGF0ZS5jdXJyZW50LmZvY3VzZWQgfHwgZmFsc2U7XG4gICAgICBzZXRBY3RpdmUobmV3U3RhdGUpO1xuICAgICAgc2V0U3RhdGUoZm9jdXNTdGF0ZS5jdXJyZW50LnN0YXRlIHx8ICcnKTtcbiAgICAgIGlmIChuZXdTdGF0ZSAhPT0gc3RhdGVUcmFja2VyLmN1cnJlbnQpIHtcbiAgICAgICAgc3RhdGVUcmFja2VyLmN1cnJlbnQgPSBuZXdTdGF0ZTtcbiAgICAgICAgaWYgKG5ld1N0YXRlKSB7XG4gICAgICAgICAgY2FsbGJhY2tzLm9uRm9jdXMgJiYgY2FsbGJhY2tzLm9uRm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFja3Mub25CbHVyICYmIGNhbGxiYWNrcy5vbkJsdXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3V0KCk7XG4gICAgICBmaW4oKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiB7XG4gICAgYWN0aXZlOiBhY3RpdmUsXG4gICAgc3RhdGU6IHN0YXRlLFxuICAgIG9uRm9jdXM6IG9uRm9jdXMsXG4gICAgcmVmOiByZWZcbiAgfTtcbn07IiwiZXhwb3J0IGZ1bmN0aW9uIGRlZmVyQWN0aW9uKGFjdGlvbikge1xuICBzZXRUaW1lb3V0KGFjdGlvbiwgMSk7XG59XG5leHBvcnQgdmFyIGlubGluZVByb3AgPSBmdW5jdGlvbiBpbmxpbmVQcm9wKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBvYmogPSB7fTtcbiAgb2JqW25hbWVdID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59O1xuZXhwb3J0IHZhciBleHRyYWN0UmVmID0gZnVuY3Rpb24gZXh0cmFjdFJlZihyZWYpIHtcbiAgcmV0dXJuIHJlZiAmJiAnY3VycmVudCcgaW4gcmVmID8gcmVmLmN1cnJlbnQgOiByZWY7XG59OyIsImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgd2l0aFNpZGVFZmZlY3QgZnJvbSAncmVhY3Qtc2lkZS1lZmZlY3QnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAncmVhY3QtZmFzdC1jb21wYXJlJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgb2JqZWN0QXNzaWduIGZyb20gJ29iamVjdC1hc3NpZ24nO1xuXG52YXIgQVRUUklCVVRFX05BTUVTID0ge1xuICAgIEJPRFk6IFwiYm9keUF0dHJpYnV0ZXNcIixcbiAgICBIVE1MOiBcImh0bWxBdHRyaWJ1dGVzXCIsXG4gICAgVElUTEU6IFwidGl0bGVBdHRyaWJ1dGVzXCJcbn07XG5cbnZhciBUQUdfTkFNRVMgPSB7XG4gICAgQkFTRTogXCJiYXNlXCIsXG4gICAgQk9EWTogXCJib2R5XCIsXG4gICAgSEVBRDogXCJoZWFkXCIsXG4gICAgSFRNTDogXCJodG1sXCIsXG4gICAgTElOSzogXCJsaW5rXCIsXG4gICAgTUVUQTogXCJtZXRhXCIsXG4gICAgTk9TQ1JJUFQ6IFwibm9zY3JpcHRcIixcbiAgICBTQ1JJUFQ6IFwic2NyaXB0XCIsXG4gICAgU1RZTEU6IFwic3R5bGVcIixcbiAgICBUSVRMRTogXCJ0aXRsZVwiXG59O1xuXG52YXIgVkFMSURfVEFHX05BTUVTID0gT2JqZWN0LmtleXMoVEFHX05BTUVTKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gVEFHX05BTUVTW25hbWVdO1xufSk7XG5cbnZhciBUQUdfUFJPUEVSVElFUyA9IHtcbiAgICBDSEFSU0VUOiBcImNoYXJzZXRcIixcbiAgICBDU1NfVEVYVDogXCJjc3NUZXh0XCIsXG4gICAgSFJFRjogXCJocmVmXCIsXG4gICAgSFRUUEVRVUlWOiBcImh0dHAtZXF1aXZcIixcbiAgICBJTk5FUl9IVE1MOiBcImlubmVySFRNTFwiLFxuICAgIElURU1fUFJPUDogXCJpdGVtcHJvcFwiLFxuICAgIE5BTUU6IFwibmFtZVwiLFxuICAgIFBST1BFUlRZOiBcInByb3BlcnR5XCIsXG4gICAgUkVMOiBcInJlbFwiLFxuICAgIFNSQzogXCJzcmNcIixcbiAgICBUQVJHRVQ6IFwidGFyZ2V0XCJcbn07XG5cbnZhciBSRUFDVF9UQUdfTUFQID0ge1xuICAgIGFjY2Vzc2tleTogXCJhY2Nlc3NLZXlcIixcbiAgICBjaGFyc2V0OiBcImNoYXJTZXRcIixcbiAgICBjbGFzczogXCJjbGFzc05hbWVcIixcbiAgICBjb250ZW50ZWRpdGFibGU6IFwiY29udGVudEVkaXRhYmxlXCIsXG4gICAgY29udGV4dG1lbnU6IFwiY29udGV4dE1lbnVcIixcbiAgICBcImh0dHAtZXF1aXZcIjogXCJodHRwRXF1aXZcIixcbiAgICBpdGVtcHJvcDogXCJpdGVtUHJvcFwiLFxuICAgIHRhYmluZGV4OiBcInRhYkluZGV4XCJcbn07XG5cbnZhciBIRUxNRVRfUFJPUFMgPSB7XG4gICAgREVGQVVMVF9USVRMRTogXCJkZWZhdWx0VGl0bGVcIixcbiAgICBERUZFUjogXCJkZWZlclwiLFxuICAgIEVOQ09ERV9TUEVDSUFMX0NIQVJBQ1RFUlM6IFwiZW5jb2RlU3BlY2lhbENoYXJhY3RlcnNcIixcbiAgICBPTl9DSEFOR0VfQ0xJRU5UX1NUQVRFOiBcIm9uQ2hhbmdlQ2xpZW50U3RhdGVcIixcbiAgICBUSVRMRV9URU1QTEFURTogXCJ0aXRsZVRlbXBsYXRlXCJcbn07XG5cbnZhciBIVE1MX1RBR19NQVAgPSBPYmplY3Qua2V5cyhSRUFDVF9UQUdfTUFQKS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwga2V5KSB7XG4gICAgb2JqW1JFQUNUX1RBR19NQVBba2V5XV0gPSBrZXk7XG4gICAgcmV0dXJuIG9iajtcbn0sIHt9KTtcblxudmFyIFNFTEZfQ0xPU0lOR19UQUdTID0gW1RBR19OQU1FUy5OT1NDUklQVCwgVEFHX05BTUVTLlNDUklQVCwgVEFHX05BTUVTLlNUWUxFXTtcblxudmFyIEhFTE1FVF9BVFRSSUJVVEUgPSBcImRhdGEtcmVhY3QtaGVsbWV0XCI7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG59O1xuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxudmFyIG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKG9iaiwga2V5cykge1xuICB2YXIgdGFyZ2V0ID0ge307XG5cbiAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlO1xuICAgIHRhcmdldFtpXSA9IG9ialtpXTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxudmFyIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzID0gZnVuY3Rpb24gZW5jb2RlU3BlY2lhbENoYXJhY3RlcnMoc3RyKSB7XG4gICAgdmFyIGVuY29kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcblxuICAgIGlmIChlbmNvZGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoc3RyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpLnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpLnJlcGxhY2UoLycvZywgXCImI3gyNztcIik7XG59O1xuXG52YXIgZ2V0VGl0bGVGcm9tUHJvcHNMaXN0ID0gZnVuY3Rpb24gZ2V0VGl0bGVGcm9tUHJvcHNMaXN0KHByb3BzTGlzdCkge1xuICAgIHZhciBpbm5lcm1vc3RUaXRsZSA9IGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgVEFHX05BTUVTLlRJVExFKTtcbiAgICB2YXIgaW5uZXJtb3N0VGVtcGxhdGUgPSBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIEhFTE1FVF9QUk9QUy5USVRMRV9URU1QTEFURSk7XG5cbiAgICBpZiAoaW5uZXJtb3N0VGVtcGxhdGUgJiYgaW5uZXJtb3N0VGl0bGUpIHtcbiAgICAgICAgLy8gdXNlIGZ1bmN0aW9uIGFyZyB0byBhdm9pZCBuZWVkIHRvIGVzY2FwZSAkIGNoYXJhY3RlcnNcbiAgICAgICAgcmV0dXJuIGlubmVybW9zdFRlbXBsYXRlLnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlubmVybW9zdFRpdGxlKSA/IGlubmVybW9zdFRpdGxlLmpvaW4oXCJcIikgOiBpbm5lcm1vc3RUaXRsZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIGlubmVybW9zdERlZmF1bHRUaXRsZSA9IGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgSEVMTUVUX1BST1BTLkRFRkFVTFRfVElUTEUpO1xuXG4gICAgcmV0dXJuIGlubmVybW9zdFRpdGxlIHx8IGlubmVybW9zdERlZmF1bHRUaXRsZSB8fCB1bmRlZmluZWQ7XG59O1xuXG52YXIgZ2V0T25DaGFuZ2VDbGllbnRTdGF0ZSA9IGZ1bmN0aW9uIGdldE9uQ2hhbmdlQ2xpZW50U3RhdGUocHJvcHNMaXN0KSB7XG4gICAgcmV0dXJuIGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgSEVMTUVUX1BST1BTLk9OX0NIQU5HRV9DTElFTlRfU1RBVEUpIHx8IGZ1bmN0aW9uICgpIHt9O1xufTtcblxudmFyIGdldEF0dHJpYnV0ZXNGcm9tUHJvcHNMaXN0ID0gZnVuY3Rpb24gZ2V0QXR0cmlidXRlc0Zyb21Qcm9wc0xpc3QodGFnVHlwZSwgcHJvcHNMaXN0KSB7XG4gICAgcmV0dXJuIHByb3BzTGlzdC5maWx0ZXIoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcHJvcHNbdGFnVHlwZV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgfSkubWFwKGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICByZXR1cm4gcHJvcHNbdGFnVHlwZV07XG4gICAgfSkucmVkdWNlKGZ1bmN0aW9uICh0YWdBdHRycywgY3VycmVudCkge1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHRhZ0F0dHJzLCBjdXJyZW50KTtcbiAgICB9LCB7fSk7XG59O1xuXG52YXIgZ2V0QmFzZVRhZ0Zyb21Qcm9wc0xpc3QgPSBmdW5jdGlvbiBnZXRCYXNlVGFnRnJvbVByb3BzTGlzdChwcmltYXJ5QXR0cmlidXRlcywgcHJvcHNMaXN0KSB7XG4gICAgcmV0dXJuIHByb3BzTGlzdC5maWx0ZXIoZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcHJvcHNbVEFHX05BTUVTLkJBU0VdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIH0pLm1hcChmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHByb3BzW1RBR19OQU1FUy5CQVNFXTtcbiAgICB9KS5yZXZlcnNlKCkucmVkdWNlKGZ1bmN0aW9uIChpbm5lcm1vc3RCYXNlVGFnLCB0YWcpIHtcbiAgICAgICAgaWYgKCFpbm5lcm1vc3RCYXNlVGFnLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0YWcpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYXR0cmlidXRlS2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgbG93ZXJDYXNlQXR0cmlidXRlS2V5ID0gYXR0cmlidXRlS2V5LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocHJpbWFyeUF0dHJpYnV0ZXMuaW5kZXhPZihsb3dlckNhc2VBdHRyaWJ1dGVLZXkpICE9PSAtMSAmJiB0YWdbbG93ZXJDYXNlQXR0cmlidXRlS2V5XSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXJtb3N0QmFzZVRhZy5jb25jYXQodGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5uZXJtb3N0QmFzZVRhZztcbiAgICB9LCBbXSk7XG59O1xuXG52YXIgZ2V0VGFnc0Zyb21Qcm9wc0xpc3QgPSBmdW5jdGlvbiBnZXRUYWdzRnJvbVByb3BzTGlzdCh0YWdOYW1lLCBwcmltYXJ5QXR0cmlidXRlcywgcHJvcHNMaXN0KSB7XG4gICAgLy8gQ2FsY3VsYXRlIGxpc3Qgb2YgdGFncywgZ2l2aW5nIHByaW9yaXR5IGlubmVybW9zdCBjb21wb25lbnQgKGVuZCBvZiB0aGUgcHJvcHNsaXN0KVxuICAgIHZhciBhcHByb3ZlZFNlZW5UYWdzID0ge307XG5cbiAgICByZXR1cm4gcHJvcHNMaXN0LmZpbHRlcihmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHNbdGFnTmFtZV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHByb3BzW3RhZ05hbWVdICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB3YXJuKFwiSGVsbWV0OiBcIiArIHRhZ05hbWUgKyBcIiBzaG91bGQgYmUgb2YgdHlwZSBcXFwiQXJyYXlcXFwiLiBJbnN0ZWFkIGZvdW5kIHR5cGUgXFxcIlwiICsgX3R5cGVvZihwcm9wc1t0YWdOYW1lXSkgKyBcIlxcXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pLm1hcChmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHByb3BzW3RhZ05hbWVdO1xuICAgIH0pLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24gKGFwcHJvdmVkVGFncywgaW5zdGFuY2VUYWdzKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZVNlZW5UYWdzID0ge307XG5cbiAgICAgICAgaW5zdGFuY2VUYWdzLmZpbHRlcihmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgICAgICB2YXIgcHJpbWFyeUF0dHJpYnV0ZUtleSA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGFnKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVLZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBsb3dlckNhc2VBdHRyaWJ1dGVLZXkgPSBhdHRyaWJ1dGVLZXkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgcnVsZSB3aXRoIGxpbmsgdGFncywgc2luY2UgcmVsIGFuZCBocmVmIGFyZSBib3RoIHByaW1hcnkgdGFncywgcmVsIHRha2VzIHByaW9yaXR5XG4gICAgICAgICAgICAgICAgaWYgKHByaW1hcnlBdHRyaWJ1dGVzLmluZGV4T2YobG93ZXJDYXNlQXR0cmlidXRlS2V5KSAhPT0gLTEgJiYgIShwcmltYXJ5QXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5SRUwgJiYgdGFnW3ByaW1hcnlBdHRyaWJ1dGVLZXldLnRvTG93ZXJDYXNlKCkgPT09IFwiY2Fub25pY2FsXCIpICYmICEobG93ZXJDYXNlQXR0cmlidXRlS2V5ID09PSBUQUdfUFJPUEVSVElFUy5SRUwgJiYgdGFnW2xvd2VyQ2FzZUF0dHJpYnV0ZUtleV0udG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZXNoZWV0XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlBdHRyaWJ1dGVLZXkgPSBsb3dlckNhc2VBdHRyaWJ1dGVLZXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgaW5uZXJIVE1MIHdoaWNoIGRvZXNuJ3Qgd29yayBsb3dlcmNhc2VkXG4gICAgICAgICAgICAgICAgaWYgKHByaW1hcnlBdHRyaWJ1dGVzLmluZGV4T2YoYXR0cmlidXRlS2V5KSAhPT0gLTEgJiYgKGF0dHJpYnV0ZUtleSA9PT0gVEFHX1BST1BFUlRJRVMuSU5ORVJfSFRNTCB8fCBhdHRyaWJ1dGVLZXkgPT09IFRBR19QUk9QRVJUSUVTLkNTU19URVhUIHx8IGF0dHJpYnV0ZUtleSA9PT0gVEFHX1BST1BFUlRJRVMuSVRFTV9QUk9QKSkge1xuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QXR0cmlidXRlS2V5ID0gYXR0cmlidXRlS2V5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFwcmltYXJ5QXR0cmlidXRlS2V5IHx8ICF0YWdbcHJpbWFyeUF0dHJpYnV0ZUtleV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRhZ1twcmltYXJ5QXR0cmlidXRlS2V5XS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAoIWFwcHJvdmVkU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV0pIHtcbiAgICAgICAgICAgICAgICBhcHByb3ZlZFNlZW5UYWdzW3ByaW1hcnlBdHRyaWJ1dGVLZXldID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaW5zdGFuY2VTZWVuVGFnc1twcmltYXJ5QXR0cmlidXRlS2V5XSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFhcHByb3ZlZFNlZW5UYWdzW3ByaW1hcnlBdHRyaWJ1dGVLZXldW3ZhbHVlXSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlU2VlblRhZ3NbcHJpbWFyeUF0dHJpYnV0ZUtleV1bdmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KS5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwcm92ZWRUYWdzLnB1c2godGFnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNlZW4gdGFncyB3aXRoIHRhZ3MgZnJvbSB0aGlzIGluc3RhbmNlXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoaW5zdGFuY2VTZWVuVGFncyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZUtleSA9IGtleXNbaV07XG4gICAgICAgICAgICB2YXIgdGFnVW5pb24gPSBvYmplY3RBc3NpZ24oe30sIGFwcHJvdmVkU2VlblRhZ3NbYXR0cmlidXRlS2V5XSwgaW5zdGFuY2VTZWVuVGFnc1thdHRyaWJ1dGVLZXldKTtcblxuICAgICAgICAgICAgYXBwcm92ZWRTZWVuVGFnc1thdHRyaWJ1dGVLZXldID0gdGFnVW5pb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwcm92ZWRUYWdzO1xuICAgIH0sIFtdKS5yZXZlcnNlKCk7XG59O1xuXG52YXIgZ2V0SW5uZXJtb3N0UHJvcGVydHkgPSBmdW5jdGlvbiBnZXRJbm5lcm1vc3RQcm9wZXJ0eShwcm9wc0xpc3QsIHByb3BlcnR5KSB7XG4gICAgZm9yICh2YXIgaSA9IHByb3BzTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgcHJvcHMgPSBwcm9wc0xpc3RbaV07XG5cbiAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzW3Byb3BlcnR5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufTtcblxudmFyIHJlZHVjZVByb3BzVG9TdGF0ZSA9IGZ1bmN0aW9uIHJlZHVjZVByb3BzVG9TdGF0ZShwcm9wc0xpc3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBiYXNlVGFnOiBnZXRCYXNlVGFnRnJvbVByb3BzTGlzdChbVEFHX1BST1BFUlRJRVMuSFJFRiwgVEFHX1BST1BFUlRJRVMuVEFSR0VUXSwgcHJvcHNMaXN0KSxcbiAgICAgICAgYm9keUF0dHJpYnV0ZXM6IGdldEF0dHJpYnV0ZXNGcm9tUHJvcHNMaXN0KEFUVFJJQlVURV9OQU1FUy5CT0RZLCBwcm9wc0xpc3QpLFxuICAgICAgICBkZWZlcjogZ2V0SW5uZXJtb3N0UHJvcGVydHkocHJvcHNMaXN0LCBIRUxNRVRfUFJPUFMuREVGRVIpLFxuICAgICAgICBlbmNvZGU6IGdldElubmVybW9zdFByb3BlcnR5KHByb3BzTGlzdCwgSEVMTUVUX1BST1BTLkVOQ09ERV9TUEVDSUFMX0NIQVJBQ1RFUlMpLFxuICAgICAgICBodG1sQXR0cmlidXRlczogZ2V0QXR0cmlidXRlc0Zyb21Qcm9wc0xpc3QoQVRUUklCVVRFX05BTUVTLkhUTUwsIHByb3BzTGlzdCksXG4gICAgICAgIGxpbmtUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuTElOSywgW1RBR19QUk9QRVJUSUVTLlJFTCwgVEFHX1BST1BFUlRJRVMuSFJFRl0sIHByb3BzTGlzdCksXG4gICAgICAgIG1ldGFUYWdzOiBnZXRUYWdzRnJvbVByb3BzTGlzdChUQUdfTkFNRVMuTUVUQSwgW1RBR19QUk9QRVJUSUVTLk5BTUUsIFRBR19QUk9QRVJUSUVTLkNIQVJTRVQsIFRBR19QUk9QRVJUSUVTLkhUVFBFUVVJViwgVEFHX1BST1BFUlRJRVMuUFJPUEVSVFksIFRBR19QUk9QRVJUSUVTLklURU1fUFJPUF0sIHByb3BzTGlzdCksXG4gICAgICAgIG5vc2NyaXB0VGFnczogZ2V0VGFnc0Zyb21Qcm9wc0xpc3QoVEFHX05BTUVTLk5PU0NSSVBULCBbVEFHX1BST1BFUlRJRVMuSU5ORVJfSFRNTF0sIHByb3BzTGlzdCksXG4gICAgICAgIG9uQ2hhbmdlQ2xpZW50U3RhdGU6IGdldE9uQ2hhbmdlQ2xpZW50U3RhdGUocHJvcHNMaXN0KSxcbiAgICAgICAgc2NyaXB0VGFnczogZ2V0VGFnc0Zyb21Qcm9wc0xpc3QoVEFHX05BTUVTLlNDUklQVCwgW1RBR19QUk9QRVJUSUVTLlNSQywgVEFHX1BST1BFUlRJRVMuSU5ORVJfSFRNTF0sIHByb3BzTGlzdCksXG4gICAgICAgIHN0eWxlVGFnczogZ2V0VGFnc0Zyb21Qcm9wc0xpc3QoVEFHX05BTUVTLlNUWUxFLCBbVEFHX1BST1BFUlRJRVMuQ1NTX1RFWFRdLCBwcm9wc0xpc3QpLFxuICAgICAgICB0aXRsZTogZ2V0VGl0bGVGcm9tUHJvcHNMaXN0KHByb3BzTGlzdCksXG4gICAgICAgIHRpdGxlQXR0cmlidXRlczogZ2V0QXR0cmlidXRlc0Zyb21Qcm9wc0xpc3QoQVRUUklCVVRFX05BTUVTLlRJVExFLCBwcm9wc0xpc3QpXG4gICAgfTtcbn07XG5cbnZhciByYWZQb2x5ZmlsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2xvY2sgPSBEYXRlLm5vdygpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIGlmIChjdXJyZW50VGltZSAtIGNsb2NrID4gMTYpIHtcbiAgICAgICAgICAgIGNsb2NrID0gY3VycmVudFRpbWU7XG4gICAgICAgICAgICBjYWxsYmFjayhjdXJyZW50VGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByYWZQb2x5ZmlsbChjYWxsYmFjayk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgIH07XG59KCk7XG5cbnZhciBjYWZQb2x5ZmlsbCA9IGZ1bmN0aW9uIGNhZlBvbHlmaWxsKGlkKSB7XG4gICAgcmV0dXJuIGNsZWFyVGltZW91dChpZCk7XG59O1xuXG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgfHwgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHJhZlBvbHlmaWxsIDogZ2xvYmFsLnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCByYWZQb2x5ZmlsbDtcblxudmFyIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCB3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWUgfHwgd2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGNhZlBvbHlmaWxsIDogZ2xvYmFsLmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGNhZlBvbHlmaWxsO1xuXG52YXIgd2FybiA9IGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gICAgcmV0dXJuIGNvbnNvbGUgJiYgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gXCJmdW5jdGlvblwiICYmIGNvbnNvbGUud2Fybihtc2cpO1xufTtcblxudmFyIF9oZWxtZXRDYWxsYmFjayA9IG51bGw7XG5cbnZhciBoYW5kbGVDbGllbnRTdGF0ZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNsaWVudFN0YXRlQ2hhbmdlKG5ld1N0YXRlKSB7XG4gICAgaWYgKF9oZWxtZXRDYWxsYmFjaykge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShfaGVsbWV0Q2FsbGJhY2spO1xuICAgIH1cblxuICAgIGlmIChuZXdTdGF0ZS5kZWZlcikge1xuICAgICAgICBfaGVsbWV0Q2FsbGJhY2sgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29tbWl0VGFnQ2hhbmdlcyhuZXdTdGF0ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF9oZWxtZXRDYWxsYmFjayA9IG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29tbWl0VGFnQ2hhbmdlcyhuZXdTdGF0ZSk7XG4gICAgICAgIF9oZWxtZXRDYWxsYmFjayA9IG51bGw7XG4gICAgfVxufTtcblxudmFyIGNvbW1pdFRhZ0NoYW5nZXMgPSBmdW5jdGlvbiBjb21taXRUYWdDaGFuZ2VzKG5ld1N0YXRlLCBjYikge1xuICAgIHZhciBiYXNlVGFnID0gbmV3U3RhdGUuYmFzZVRhZyxcbiAgICAgICAgYm9keUF0dHJpYnV0ZXMgPSBuZXdTdGF0ZS5ib2R5QXR0cmlidXRlcyxcbiAgICAgICAgaHRtbEF0dHJpYnV0ZXMgPSBuZXdTdGF0ZS5odG1sQXR0cmlidXRlcyxcbiAgICAgICAgbGlua1RhZ3MgPSBuZXdTdGF0ZS5saW5rVGFncyxcbiAgICAgICAgbWV0YVRhZ3MgPSBuZXdTdGF0ZS5tZXRhVGFncyxcbiAgICAgICAgbm9zY3JpcHRUYWdzID0gbmV3U3RhdGUubm9zY3JpcHRUYWdzLFxuICAgICAgICBvbkNoYW5nZUNsaWVudFN0YXRlID0gbmV3U3RhdGUub25DaGFuZ2VDbGllbnRTdGF0ZSxcbiAgICAgICAgc2NyaXB0VGFncyA9IG5ld1N0YXRlLnNjcmlwdFRhZ3MsXG4gICAgICAgIHN0eWxlVGFncyA9IG5ld1N0YXRlLnN0eWxlVGFncyxcbiAgICAgICAgdGl0bGUgPSBuZXdTdGF0ZS50aXRsZSxcbiAgICAgICAgdGl0bGVBdHRyaWJ1dGVzID0gbmV3U3RhdGUudGl0bGVBdHRyaWJ1dGVzO1xuXG4gICAgdXBkYXRlQXR0cmlidXRlcyhUQUdfTkFNRVMuQk9EWSwgYm9keUF0dHJpYnV0ZXMpO1xuICAgIHVwZGF0ZUF0dHJpYnV0ZXMoVEFHX05BTUVTLkhUTUwsIGh0bWxBdHRyaWJ1dGVzKTtcblxuICAgIHVwZGF0ZVRpdGxlKHRpdGxlLCB0aXRsZUF0dHJpYnV0ZXMpO1xuXG4gICAgdmFyIHRhZ1VwZGF0ZXMgPSB7XG4gICAgICAgIGJhc2VUYWc6IHVwZGF0ZVRhZ3MoVEFHX05BTUVTLkJBU0UsIGJhc2VUYWcpLFxuICAgICAgICBsaW5rVGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuTElOSywgbGlua1RhZ3MpLFxuICAgICAgICBtZXRhVGFnczogdXBkYXRlVGFncyhUQUdfTkFNRVMuTUVUQSwgbWV0YVRhZ3MpLFxuICAgICAgICBub3NjcmlwdFRhZ3M6IHVwZGF0ZVRhZ3MoVEFHX05BTUVTLk5PU0NSSVBULCBub3NjcmlwdFRhZ3MpLFxuICAgICAgICBzY3JpcHRUYWdzOiB1cGRhdGVUYWdzKFRBR19OQU1FUy5TQ1JJUFQsIHNjcmlwdFRhZ3MpLFxuICAgICAgICBzdHlsZVRhZ3M6IHVwZGF0ZVRhZ3MoVEFHX05BTUVTLlNUWUxFLCBzdHlsZVRhZ3MpXG4gICAgfTtcblxuICAgIHZhciBhZGRlZFRhZ3MgPSB7fTtcbiAgICB2YXIgcmVtb3ZlZFRhZ3MgPSB7fTtcblxuICAgIE9iamVjdC5rZXlzKHRhZ1VwZGF0ZXMpLmZvckVhY2goZnVuY3Rpb24gKHRhZ1R5cGUpIHtcbiAgICAgICAgdmFyIF90YWdVcGRhdGVzJHRhZ1R5cGUgPSB0YWdVcGRhdGVzW3RhZ1R5cGVdLFxuICAgICAgICAgICAgbmV3VGFncyA9IF90YWdVcGRhdGVzJHRhZ1R5cGUubmV3VGFncyxcbiAgICAgICAgICAgIG9sZFRhZ3MgPSBfdGFnVXBkYXRlcyR0YWdUeXBlLm9sZFRhZ3M7XG5cblxuICAgICAgICBpZiAobmV3VGFncy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFkZGVkVGFnc1t0YWdUeXBlXSA9IG5ld1RhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9sZFRhZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZW1vdmVkVGFnc1t0YWdUeXBlXSA9IHRhZ1VwZGF0ZXNbdGFnVHlwZV0ub2xkVGFncztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgY2IgJiYgY2IoKTtcblxuICAgIG9uQ2hhbmdlQ2xpZW50U3RhdGUobmV3U3RhdGUsIGFkZGVkVGFncywgcmVtb3ZlZFRhZ3MpO1xufTtcblxudmFyIGZsYXR0ZW5BcnJheSA9IGZ1bmN0aW9uIGZsYXR0ZW5BcnJheShwb3NzaWJsZUFycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocG9zc2libGVBcnJheSkgPyBwb3NzaWJsZUFycmF5LmpvaW4oXCJcIikgOiBwb3NzaWJsZUFycmF5O1xufTtcblxudmFyIHVwZGF0ZVRpdGxlID0gZnVuY3Rpb24gdXBkYXRlVGl0bGUodGl0bGUsIGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAodHlwZW9mIHRpdGxlICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50LnRpdGxlICE9PSB0aXRsZSkge1xuICAgICAgICBkb2N1bWVudC50aXRsZSA9IGZsYXR0ZW5BcnJheSh0aXRsZSk7XG4gICAgfVxuXG4gICAgdXBkYXRlQXR0cmlidXRlcyhUQUdfTkFNRVMuVElUTEUsIGF0dHJpYnV0ZXMpO1xufTtcblxudmFyIHVwZGF0ZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGVzKHRhZ05hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICB2YXIgZWxlbWVudFRhZyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpWzBdO1xuXG4gICAgaWYgKCFlbGVtZW50VGFnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaGVsbWV0QXR0cmlidXRlU3RyaW5nID0gZWxlbWVudFRhZy5nZXRBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSk7XG4gICAgdmFyIGhlbG1ldEF0dHJpYnV0ZXMgPSBoZWxtZXRBdHRyaWJ1dGVTdHJpbmcgPyBoZWxtZXRBdHRyaWJ1dGVTdHJpbmcuc3BsaXQoXCIsXCIpIDogW107XG4gICAgdmFyIGF0dHJpYnV0ZXNUb1JlbW92ZSA9IFtdLmNvbmNhdChoZWxtZXRBdHRyaWJ1dGVzKTtcbiAgICB2YXIgYXR0cmlidXRlS2V5cyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVLZXlzW2ldO1xuICAgICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZV0gfHwgXCJcIjtcblxuICAgICAgICBpZiAoZWxlbWVudFRhZy5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGVsZW1lbnRUYWcuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhlbG1ldEF0dHJpYnV0ZXMuaW5kZXhPZihhdHRyaWJ1dGUpID09PSAtMSkge1xuICAgICAgICAgICAgaGVsbWV0QXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5kZXhUb1NhdmUgPSBhdHRyaWJ1dGVzVG9SZW1vdmUuaW5kZXhPZihhdHRyaWJ1dGUpO1xuICAgICAgICBpZiAoaW5kZXhUb1NhdmUgIT09IC0xKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzVG9SZW1vdmUuc3BsaWNlKGluZGV4VG9TYXZlLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gYXR0cmlidXRlc1RvUmVtb3ZlLmxlbmd0aCAtIDE7IF9pID49IDA7IF9pLS0pIHtcbiAgICAgICAgZWxlbWVudFRhZy5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlc1RvUmVtb3ZlW19pXSk7XG4gICAgfVxuXG4gICAgaWYgKGhlbG1ldEF0dHJpYnV0ZXMubGVuZ3RoID09PSBhdHRyaWJ1dGVzVG9SZW1vdmUubGVuZ3RoKSB7XG4gICAgICAgIGVsZW1lbnRUYWcucmVtb3ZlQXR0cmlidXRlKEhFTE1FVF9BVFRSSUJVVEUpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudFRhZy5nZXRBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSkgIT09IGF0dHJpYnV0ZUtleXMuam9pbihcIixcIikpIHtcbiAgICAgICAgZWxlbWVudFRhZy5zZXRBdHRyaWJ1dGUoSEVMTUVUX0FUVFJJQlVURSwgYXR0cmlidXRlS2V5cy5qb2luKFwiLFwiKSk7XG4gICAgfVxufTtcblxudmFyIHVwZGF0ZVRhZ3MgPSBmdW5jdGlvbiB1cGRhdGVUYWdzKHR5cGUsIHRhZ3MpIHtcbiAgICB2YXIgaGVhZEVsZW1lbnQgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoVEFHX05BTUVTLkhFQUQpO1xuICAgIHZhciB0YWdOb2RlcyA9IGhlYWRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodHlwZSArIFwiW1wiICsgSEVMTUVUX0FUVFJJQlVURSArIFwiXVwiKTtcbiAgICB2YXIgb2xkVGFncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRhZ05vZGVzKTtcbiAgICB2YXIgbmV3VGFncyA9IFtdO1xuICAgIHZhciBpbmRleFRvRGVsZXRlID0gdm9pZCAwO1xuXG4gICAgaWYgKHRhZ3MgJiYgdGFncy5sZW5ndGgpIHtcbiAgICAgICAgdGFncy5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICAgIHZhciBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgYXR0cmlidXRlIGluIHRhZykge1xuICAgICAgICAgICAgICAgIGlmICh0YWcuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlID09PSBUQUdfUFJPUEVSVElFUy5JTk5FUl9IVE1MKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTCA9IHRhZy5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlID09PSBUQUdfUFJPUEVSVElFUy5DU1NfVEVYVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gdGFnLmNzc1RleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGFnLmNzc1RleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHR5cGVvZiB0YWdbYXR0cmlidXRlXSA9PT0gXCJ1bmRlZmluZWRcIiA/IFwiXCIgOiB0YWdbYXR0cmlidXRlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShIRUxNRVRfQVRUUklCVVRFLCBcInRydWVcIik7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBhIGR1cGxpY2F0ZSB0YWcgZnJvbSBkb21UYWdzdG9SZW1vdmUsIHNvIGl0IGlzbid0IGNsZWFyZWQuXG4gICAgICAgICAgICBpZiAob2xkVGFncy5zb21lKGZ1bmN0aW9uIChleGlzdGluZ1RhZywgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpbmRleFRvRGVsZXRlID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQuaXNFcXVhbE5vZGUoZXhpc3RpbmdUYWcpO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICBvbGRUYWdzLnNwbGljZShpbmRleFRvRGVsZXRlLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3VGFncy5wdXNoKG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbGRUYWdzLmZvckVhY2goZnVuY3Rpb24gKHRhZykge1xuICAgICAgICByZXR1cm4gdGFnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFnKTtcbiAgICB9KTtcbiAgICBuZXdUYWdzLmZvckVhY2goZnVuY3Rpb24gKHRhZykge1xuICAgICAgICByZXR1cm4gaGVhZEVsZW1lbnQuYXBwZW5kQ2hpbGQodGFnKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIG9sZFRhZ3M6IG9sZFRhZ3MsXG4gICAgICAgIG5ld1RhZ3M6IG5ld1RhZ3NcbiAgICB9O1xufTtcblxudmFyIGdlbmVyYXRlRWxlbWVudEF0dHJpYnV0ZXNBc1N0cmluZyA9IGZ1bmN0aW9uIGdlbmVyYXRlRWxlbWVudEF0dHJpYnV0ZXNBc1N0cmluZyhhdHRyaWJ1dGVzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLnJlZHVjZShmdW5jdGlvbiAoc3RyLCBrZXkpIHtcbiAgICAgICAgdmFyIGF0dHIgPSB0eXBlb2YgYXR0cmlidXRlc1trZXldICE9PSBcInVuZGVmaW5lZFwiID8ga2V5ICsgXCI9XFxcIlwiICsgYXR0cmlidXRlc1trZXldICsgXCJcXFwiXCIgOiBcIlwiICsga2V5O1xuICAgICAgICByZXR1cm4gc3RyID8gc3RyICsgXCIgXCIgKyBhdHRyIDogYXR0cjtcbiAgICB9LCBcIlwiKTtcbn07XG5cbnZhciBnZW5lcmF0ZVRpdGxlQXNTdHJpbmcgPSBmdW5jdGlvbiBnZW5lcmF0ZVRpdGxlQXNTdHJpbmcodHlwZSwgdGl0bGUsIGF0dHJpYnV0ZXMsIGVuY29kZSkge1xuICAgIHZhciBhdHRyaWJ1dGVTdHJpbmcgPSBnZW5lcmF0ZUVsZW1lbnRBdHRyaWJ1dGVzQXNTdHJpbmcoYXR0cmlidXRlcyk7XG4gICAgdmFyIGZsYXR0ZW5lZFRpdGxlID0gZmxhdHRlbkFycmF5KHRpdGxlKTtcbiAgICByZXR1cm4gYXR0cmlidXRlU3RyaW5nID8gXCI8XCIgKyB0eXBlICsgXCIgXCIgKyBIRUxNRVRfQVRUUklCVVRFICsgXCI9XFxcInRydWVcXFwiIFwiICsgYXR0cmlidXRlU3RyaW5nICsgXCI+XCIgKyBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVycyhmbGF0dGVuZWRUaXRsZSwgZW5jb2RlKSArIFwiPC9cIiArIHR5cGUgKyBcIj5cIiA6IFwiPFwiICsgdHlwZSArIFwiIFwiICsgSEVMTUVUX0FUVFJJQlVURSArIFwiPVxcXCJ0cnVlXFxcIj5cIiArIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzKGZsYXR0ZW5lZFRpdGxlLCBlbmNvZGUpICsgXCI8L1wiICsgdHlwZSArIFwiPlwiO1xufTtcblxudmFyIGdlbmVyYXRlVGFnc0FzU3RyaW5nID0gZnVuY3Rpb24gZ2VuZXJhdGVUYWdzQXNTdHJpbmcodHlwZSwgdGFncywgZW5jb2RlKSB7XG4gICAgcmV0dXJuIHRhZ3MucmVkdWNlKGZ1bmN0aW9uIChzdHIsIHRhZykge1xuICAgICAgICB2YXIgYXR0cmlidXRlSHRtbCA9IE9iamVjdC5rZXlzKHRhZykuZmlsdGVyKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIHJldHVybiAhKGF0dHJpYnV0ZSA9PT0gVEFHX1BST1BFUlRJRVMuSU5ORVJfSFRNTCB8fCBhdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLkNTU19URVhUKTtcbiAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uIChzdHJpbmcsIGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSB0eXBlb2YgdGFnW2F0dHJpYnV0ZV0gPT09IFwidW5kZWZpbmVkXCIgPyBhdHRyaWJ1dGUgOiBhdHRyaWJ1dGUgKyBcIj1cXFwiXCIgKyBlbmNvZGVTcGVjaWFsQ2hhcmFjdGVycyh0YWdbYXR0cmlidXRlXSwgZW5jb2RlKSArIFwiXFxcIlwiO1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZyA/IHN0cmluZyArIFwiIFwiICsgYXR0ciA6IGF0dHI7XG4gICAgICAgIH0sIFwiXCIpO1xuXG4gICAgICAgIHZhciB0YWdDb250ZW50ID0gdGFnLmlubmVySFRNTCB8fCB0YWcuY3NzVGV4dCB8fCBcIlwiO1xuXG4gICAgICAgIHZhciBpc1NlbGZDbG9zaW5nID0gU0VMRl9DTE9TSU5HX1RBR1MuaW5kZXhPZih0eXBlKSA9PT0gLTE7XG5cbiAgICAgICAgcmV0dXJuIHN0ciArIFwiPFwiICsgdHlwZSArIFwiIFwiICsgSEVMTUVUX0FUVFJJQlVURSArIFwiPVxcXCJ0cnVlXFxcIiBcIiArIGF0dHJpYnV0ZUh0bWwgKyAoaXNTZWxmQ2xvc2luZyA/IFwiLz5cIiA6IFwiPlwiICsgdGFnQ29udGVudCArIFwiPC9cIiArIHR5cGUgKyBcIj5cIik7XG4gICAgfSwgXCJcIik7XG59O1xuXG52YXIgY29udmVydEVsZW1lbnRBdHRyaWJ1dGVzdG9SZWFjdFByb3BzID0gZnVuY3Rpb24gY29udmVydEVsZW1lbnRBdHRyaWJ1dGVzdG9SZWFjdFByb3BzKGF0dHJpYnV0ZXMpIHtcbiAgICB2YXIgaW5pdFByb3BzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwga2V5KSB7XG4gICAgICAgIG9ialtSRUFDVF9UQUdfTUFQW2tleV0gfHwga2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCBpbml0UHJvcHMpO1xufTtcblxudmFyIGNvbnZlcnRSZWFjdFByb3BzdG9IdG1sQXR0cmlidXRlcyA9IGZ1bmN0aW9uIGNvbnZlcnRSZWFjdFByb3BzdG9IdG1sQXR0cmlidXRlcyhwcm9wcykge1xuICAgIHZhciBpbml0QXR0cmlidXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocHJvcHMpLnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgICAgICAgb2JqW0hUTUxfVEFHX01BUFtrZXldIHx8IGtleV0gPSBwcm9wc1trZXldO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sIGluaXRBdHRyaWJ1dGVzKTtcbn07XG5cbnZhciBnZW5lcmF0ZVRpdGxlQXNSZWFjdENvbXBvbmVudCA9IGZ1bmN0aW9uIGdlbmVyYXRlVGl0bGVBc1JlYWN0Q29tcG9uZW50KHR5cGUsIHRpdGxlLCBhdHRyaWJ1dGVzKSB7XG4gICAgdmFyIF9pbml0UHJvcHM7XG5cbiAgICAvLyBhc3NpZ25pbmcgaW50byBhbiBhcnJheSB0byBkZWZpbmUgdG9TdHJpbmcgZnVuY3Rpb24gb24gaXRcbiAgICB2YXIgaW5pdFByb3BzID0gKF9pbml0UHJvcHMgPSB7XG4gICAgICAgIGtleTogdGl0bGVcbiAgICB9LCBfaW5pdFByb3BzW0hFTE1FVF9BVFRSSUJVVEVdID0gdHJ1ZSwgX2luaXRQcm9wcyk7XG4gICAgdmFyIHByb3BzID0gY29udmVydEVsZW1lbnRBdHRyaWJ1dGVzdG9SZWFjdFByb3BzKGF0dHJpYnV0ZXMsIGluaXRQcm9wcyk7XG5cbiAgICByZXR1cm4gW1JlYWN0LmNyZWF0ZUVsZW1lbnQoVEFHX05BTUVTLlRJVExFLCBwcm9wcywgdGl0bGUpXTtcbn07XG5cbnZhciBnZW5lcmF0ZVRhZ3NBc1JlYWN0Q29tcG9uZW50ID0gZnVuY3Rpb24gZ2VuZXJhdGVUYWdzQXNSZWFjdENvbXBvbmVudCh0eXBlLCB0YWdzKSB7XG4gICAgcmV0dXJuIHRhZ3MubWFwKGZ1bmN0aW9uICh0YWcsIGkpIHtcbiAgICAgICAgdmFyIF9tYXBwZWRUYWc7XG5cbiAgICAgICAgdmFyIG1hcHBlZFRhZyA9IChfbWFwcGVkVGFnID0ge1xuICAgICAgICAgICAga2V5OiBpXG4gICAgICAgIH0sIF9tYXBwZWRUYWdbSEVMTUVUX0FUVFJJQlVURV0gPSB0cnVlLCBfbWFwcGVkVGFnKTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0YWcpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdmFyIG1hcHBlZEF0dHJpYnV0ZSA9IFJFQUNUX1RBR19NQVBbYXR0cmlidXRlXSB8fCBhdHRyaWJ1dGU7XG5cbiAgICAgICAgICAgIGlmIChtYXBwZWRBdHRyaWJ1dGUgPT09IFRBR19QUk9QRVJUSUVTLklOTkVSX0hUTUwgfHwgbWFwcGVkQXR0cmlidXRlID09PSBUQUdfUFJPUEVSVElFUy5DU1NfVEVYVCkge1xuICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gdGFnLmlubmVySFRNTCB8fCB0YWcuY3NzVGV4dDtcbiAgICAgICAgICAgICAgICBtYXBwZWRUYWcuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPSB7IF9faHRtbDogY29udGVudCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXBwZWRUYWdbbWFwcGVkQXR0cmlidXRlXSA9IHRhZ1thdHRyaWJ1dGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh0eXBlLCBtYXBwZWRUYWcpO1xuICAgIH0pO1xufTtcblxudmFyIGdldE1ldGhvZHNGb3JUYWcgPSBmdW5jdGlvbiBnZXRNZXRob2RzRm9yVGFnKHR5cGUsIHRhZ3MsIGVuY29kZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFRBR19OQU1FUy5USVRMRTpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9Db21wb25lbnQ6IGZ1bmN0aW9uIHRvQ29tcG9uZW50KCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVUaXRsZUFzUmVhY3RDb21wb25lbnQodHlwZSwgdGFncy50aXRsZSwgdGFncy50aXRsZUF0dHJpYnV0ZXMsIGVuY29kZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVRpdGxlQXNTdHJpbmcodHlwZSwgdGFncy50aXRsZSwgdGFncy50aXRsZUF0dHJpYnV0ZXMsIGVuY29kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBBVFRSSUJVVEVfTkFNRVMuQk9EWTpcbiAgICAgICAgY2FzZSBBVFRSSUJVVEVfTkFNRVMuSFRNTDpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdG9Db21wb25lbnQ6IGZ1bmN0aW9uIHRvQ29tcG9uZW50KCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydEVsZW1lbnRBdHRyaWJ1dGVzdG9SZWFjdFByb3BzKHRhZ3MpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVFbGVtZW50QXR0cmlidXRlc0FzU3RyaW5nKHRhZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvQ29tcG9uZW50OiBmdW5jdGlvbiB0b0NvbXBvbmVudCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVGFnc0FzUmVhY3RDb21wb25lbnQodHlwZSwgdGFncyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVRhZ3NBc1N0cmluZyh0eXBlLCB0YWdzLCBlbmNvZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgfVxufTtcblxudmFyIG1hcFN0YXRlT25TZXJ2ZXIgPSBmdW5jdGlvbiBtYXBTdGF0ZU9uU2VydmVyKF9yZWYpIHtcbiAgICB2YXIgYmFzZVRhZyA9IF9yZWYuYmFzZVRhZyxcbiAgICAgICAgYm9keUF0dHJpYnV0ZXMgPSBfcmVmLmJvZHlBdHRyaWJ1dGVzLFxuICAgICAgICBlbmNvZGUgPSBfcmVmLmVuY29kZSxcbiAgICAgICAgaHRtbEF0dHJpYnV0ZXMgPSBfcmVmLmh0bWxBdHRyaWJ1dGVzLFxuICAgICAgICBsaW5rVGFncyA9IF9yZWYubGlua1RhZ3MsXG4gICAgICAgIG1ldGFUYWdzID0gX3JlZi5tZXRhVGFncyxcbiAgICAgICAgbm9zY3JpcHRUYWdzID0gX3JlZi5ub3NjcmlwdFRhZ3MsXG4gICAgICAgIHNjcmlwdFRhZ3MgPSBfcmVmLnNjcmlwdFRhZ3MsXG4gICAgICAgIHN0eWxlVGFncyA9IF9yZWYuc3R5bGVUYWdzLFxuICAgICAgICBfcmVmJHRpdGxlID0gX3JlZi50aXRsZSxcbiAgICAgICAgdGl0bGUgPSBfcmVmJHRpdGxlID09PSB1bmRlZmluZWQgPyBcIlwiIDogX3JlZiR0aXRsZSxcbiAgICAgICAgdGl0bGVBdHRyaWJ1dGVzID0gX3JlZi50aXRsZUF0dHJpYnV0ZXM7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZTogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuQkFTRSwgYmFzZVRhZywgZW5jb2RlKSxcbiAgICAgICAgYm9keUF0dHJpYnV0ZXM6IGdldE1ldGhvZHNGb3JUYWcoQVRUUklCVVRFX05BTUVTLkJPRFksIGJvZHlBdHRyaWJ1dGVzLCBlbmNvZGUpLFxuICAgICAgICBodG1sQXR0cmlidXRlczogZ2V0TWV0aG9kc0ZvclRhZyhBVFRSSUJVVEVfTkFNRVMuSFRNTCwgaHRtbEF0dHJpYnV0ZXMsIGVuY29kZSksXG4gICAgICAgIGxpbms6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLkxJTkssIGxpbmtUYWdzLCBlbmNvZGUpLFxuICAgICAgICBtZXRhOiBnZXRNZXRob2RzRm9yVGFnKFRBR19OQU1FUy5NRVRBLCBtZXRhVGFncywgZW5jb2RlKSxcbiAgICAgICAgbm9zY3JpcHQ6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLk5PU0NSSVBULCBub3NjcmlwdFRhZ3MsIGVuY29kZSksXG4gICAgICAgIHNjcmlwdDogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuU0NSSVBULCBzY3JpcHRUYWdzLCBlbmNvZGUpLFxuICAgICAgICBzdHlsZTogZ2V0TWV0aG9kc0ZvclRhZyhUQUdfTkFNRVMuU1RZTEUsIHN0eWxlVGFncywgZW5jb2RlKSxcbiAgICAgICAgdGl0bGU6IGdldE1ldGhvZHNGb3JUYWcoVEFHX05BTUVTLlRJVExFLCB7IHRpdGxlOiB0aXRsZSwgdGl0bGVBdHRyaWJ1dGVzOiB0aXRsZUF0dHJpYnV0ZXMgfSwgZW5jb2RlKVxuICAgIH07XG59O1xuXG52YXIgSGVsbWV0ID0gZnVuY3Rpb24gSGVsbWV0KENvbXBvbmVudCkge1xuICAgIHZhciBfY2xhc3MsIF90ZW1wO1xuXG4gICAgcmV0dXJuIF90ZW1wID0gX2NsYXNzID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgICAgICAgaW5oZXJpdHMoSGVsbWV0V3JhcHBlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICAgICAgZnVuY3Rpb24gSGVsbWV0V3JhcHBlcigpIHtcbiAgICAgICAgICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEhlbG1ldFdyYXBwZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiAhaXNFcXVhbCh0aGlzLnByb3BzLCBuZXh0UHJvcHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLm1hcE5lc3RlZENoaWxkcmVuVG9Qcm9wcyA9IGZ1bmN0aW9uIG1hcE5lc3RlZENoaWxkcmVuVG9Qcm9wcyhjaGlsZCwgbmVzdGVkQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmICghbmVzdGVkQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuU0NSSVBUOlxuICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLk5PU0NSSVBUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBuZXN0ZWRDaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuU1RZTEU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0OiBuZXN0ZWRDaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCI8XCIgKyBjaGlsZC50eXBlICsgXCIgLz4gZWxlbWVudHMgYXJlIHNlbGYtY2xvc2luZyBhbmQgY2FuIG5vdCBjb250YWluIGNoaWxkcmVuLiBSZWZlciB0byBvdXIgQVBJIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiKTtcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5mbGF0dGVuQXJyYXlUeXBlQ2hpbGRyZW4gPSBmdW5jdGlvbiBmbGF0dGVuQXJyYXlUeXBlQ2hpbGRyZW4oX3JlZikge1xuICAgICAgICAgICAgdmFyIF9iYWJlbEhlbHBlcnMkZXh0ZW5kcztcblxuICAgICAgICAgICAgdmFyIGNoaWxkID0gX3JlZi5jaGlsZCxcbiAgICAgICAgICAgICAgICBhcnJheVR5cGVDaGlsZHJlbiA9IF9yZWYuYXJyYXlUeXBlQ2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgbmV3Q2hpbGRQcm9wcyA9IF9yZWYubmV3Q2hpbGRQcm9wcyxcbiAgICAgICAgICAgICAgICBuZXN0ZWRDaGlsZHJlbiA9IF9yZWYubmVzdGVkQ2hpbGRyZW47XG5cbiAgICAgICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgYXJyYXlUeXBlQ2hpbGRyZW4sIChfYmFiZWxIZWxwZXJzJGV4dGVuZHMgPSB7fSwgX2JhYmVsSGVscGVycyRleHRlbmRzW2NoaWxkLnR5cGVdID0gW10uY29uY2F0KGFycmF5VHlwZUNoaWxkcmVuW2NoaWxkLnR5cGVdIHx8IFtdLCBbX2V4dGVuZHMoe30sIG5ld0NoaWxkUHJvcHMsIHRoaXMubWFwTmVzdGVkQ2hpbGRyZW5Ub1Byb3BzKGNoaWxkLCBuZXN0ZWRDaGlsZHJlbikpXSksIF9iYWJlbEhlbHBlcnMkZXh0ZW5kcykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEhlbG1ldFdyYXBwZXIucHJvdG90eXBlLm1hcE9iamVjdFR5cGVDaGlsZHJlbiA9IGZ1bmN0aW9uIG1hcE9iamVjdFR5cGVDaGlsZHJlbihfcmVmMikge1xuICAgICAgICAgICAgdmFyIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczIsIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczM7XG5cbiAgICAgICAgICAgIHZhciBjaGlsZCA9IF9yZWYyLmNoaWxkLFxuICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gX3JlZjIubmV3UHJvcHMsXG4gICAgICAgICAgICAgICAgbmV3Q2hpbGRQcm9wcyA9IF9yZWYyLm5ld0NoaWxkUHJvcHMsXG4gICAgICAgICAgICAgICAgbmVzdGVkQ2hpbGRyZW4gPSBfcmVmMi5uZXN0ZWRDaGlsZHJlbjtcblxuICAgICAgICAgICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuVElUTEU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgbmV3UHJvcHMsIChfYmFiZWxIZWxwZXJzJGV4dGVuZHMyID0ge30sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczJbY2hpbGQudHlwZV0gPSBuZXN0ZWRDaGlsZHJlbiwgX2JhYmVsSGVscGVycyRleHRlbmRzMi50aXRsZUF0dHJpYnV0ZXMgPSBfZXh0ZW5kcyh7fSwgbmV3Q2hpbGRQcm9wcyksIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczIpKTtcblxuICAgICAgICAgICAgICAgIGNhc2UgVEFHX05BTUVTLkJPRFk6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgbmV3UHJvcHMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlBdHRyaWJ1dGVzOiBfZXh0ZW5kcyh7fSwgbmV3Q2hpbGRQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5IVE1MOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIG5ld1Byb3BzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlczogX2V4dGVuZHMoe30sIG5ld0NoaWxkUHJvcHMpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIG5ld1Byb3BzLCAoX2JhYmVsSGVscGVycyRleHRlbmRzMyA9IHt9LCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMzW2NoaWxkLnR5cGVdID0gX2V4dGVuZHMoe30sIG5ld0NoaWxkUHJvcHMpLCBfYmFiZWxIZWxwZXJzJGV4dGVuZHMzKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUubWFwQXJyYXlUeXBlQ2hpbGRyZW5Ub1Byb3BzID0gZnVuY3Rpb24gbWFwQXJyYXlUeXBlQ2hpbGRyZW5Ub1Byb3BzKGFycmF5VHlwZUNoaWxkcmVuLCBuZXdQcm9wcykge1xuICAgICAgICAgICAgdmFyIG5ld0ZsYXR0ZW5lZFByb3BzID0gX2V4dGVuZHMoe30sIG5ld1Byb3BzKTtcblxuICAgICAgICAgICAgT2JqZWN0LmtleXMoYXJyYXlUeXBlQ2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGFycmF5Q2hpbGROYW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczQ7XG5cbiAgICAgICAgICAgICAgICBuZXdGbGF0dGVuZWRQcm9wcyA9IF9leHRlbmRzKHt9LCBuZXdGbGF0dGVuZWRQcm9wcywgKF9iYWJlbEhlbHBlcnMkZXh0ZW5kczQgPSB7fSwgX2JhYmVsSGVscGVycyRleHRlbmRzNFthcnJheUNoaWxkTmFtZV0gPSBhcnJheVR5cGVDaGlsZHJlblthcnJheUNoaWxkTmFtZV0sIF9iYWJlbEhlbHBlcnMkZXh0ZW5kczQpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3RmxhdHRlbmVkUHJvcHM7XG4gICAgICAgIH07XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUud2Fybk9uSW52YWxpZENoaWxkcmVuID0gZnVuY3Rpb24gd2Fybk9uSW52YWxpZENoaWxkcmVuKGNoaWxkLCBuZXN0ZWRDaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGlmICghVkFMSURfVEFHX05BTUVTLnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnR5cGUgPT09IG5hbWU7XG4gICAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZC50eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3YXJuKFwiWW91IG1heSBiZSBhdHRlbXB0aW5nIHRvIG5lc3QgPEhlbG1ldD4gY29tcG9uZW50cyB3aXRoaW4gZWFjaCBvdGhlciwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIFJlZmVyIHRvIG91ciBBUEkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhcm4oXCJPbmx5IGVsZW1lbnRzIHR5cGVzIFwiICsgVkFMSURfVEFHX05BTUVTLmpvaW4oXCIsIFwiKSArIFwiIGFyZSBhbGxvd2VkLiBIZWxtZXQgZG9lcyBub3Qgc3VwcG9ydCByZW5kZXJpbmcgPFwiICsgY2hpbGQudHlwZSArIFwiPiBlbGVtZW50cy4gUmVmZXIgdG8gb3VyIEFQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5lc3RlZENoaWxkcmVuICYmIHR5cGVvZiBuZXN0ZWRDaGlsZHJlbiAhPT0gXCJzdHJpbmdcIiAmJiAoIUFycmF5LmlzQXJyYXkobmVzdGVkQ2hpbGRyZW4pIHx8IG5lc3RlZENoaWxkcmVuLnNvbWUoZnVuY3Rpb24gKG5lc3RlZENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgbmVzdGVkQ2hpbGQgIT09IFwic3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgfSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkhlbG1ldCBleHBlY3RzIGEgc3RyaW5nIGFzIGEgY2hpbGQgb2YgPFwiICsgY2hpbGQudHlwZSArIFwiPi4gRGlkIHlvdSBmb3JnZXQgdG8gd3JhcCB5b3VyIGNoaWxkcmVuIGluIGJyYWNlcz8gKCA8XCIgKyBjaGlsZC50eXBlICsgXCI+e2BgfTwvXCIgKyBjaGlsZC50eXBlICsgXCI+ICkgUmVmZXIgdG8gb3VyIEFQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBIZWxtZXRXcmFwcGVyLnByb3RvdHlwZS5tYXBDaGlsZHJlblRvUHJvcHMgPSBmdW5jdGlvbiBtYXBDaGlsZHJlblRvUHJvcHMoY2hpbGRyZW4sIG5ld1Byb3BzKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICAgICAgdmFyIGFycmF5VHlwZUNoaWxkcmVuID0ge307XG5cbiAgICAgICAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgIGlmICghY2hpbGQgfHwgIWNoaWxkLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgX2NoaWxkJHByb3BzID0gY2hpbGQucHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIG5lc3RlZENoaWxkcmVuID0gX2NoaWxkJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZFByb3BzID0gb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX2NoaWxkJHByb3BzLCBbXCJjaGlsZHJlblwiXSk7XG5cbiAgICAgICAgICAgICAgICB2YXIgbmV3Q2hpbGRQcm9wcyA9IGNvbnZlcnRSZWFjdFByb3BzdG9IdG1sQXR0cmlidXRlcyhjaGlsZFByb3BzKTtcblxuICAgICAgICAgICAgICAgIF90aGlzMi53YXJuT25JbnZhbGlkQ2hpbGRyZW4oY2hpbGQsIG5lc3RlZENoaWxkcmVuKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoY2hpbGQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5MSU5LOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5NRVRBOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5OT1NDUklQVDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUQUdfTkFNRVMuU0NSSVBUOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFRBR19OQU1FUy5TVFlMRTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5VHlwZUNoaWxkcmVuID0gX3RoaXMyLmZsYXR0ZW5BcnJheVR5cGVDaGlsZHJlbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQ6IGNoaWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5VHlwZUNoaWxkcmVuOiBhcnJheVR5cGVDaGlsZHJlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZFByb3BzOiBuZXdDaGlsZFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZENoaWxkcmVuOiBuZXN0ZWRDaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHMgPSBfdGhpczIubWFwT2JqZWN0VHlwZUNoaWxkcmVuKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZDogY2hpbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHM6IG5ld1Byb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkUHJvcHM6IG5ld0NoaWxkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ2hpbGRyZW46IG5lc3RlZENoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBuZXdQcm9wcyA9IHRoaXMubWFwQXJyYXlUeXBlQ2hpbGRyZW5Ub1Byb3BzKGFycmF5VHlwZUNoaWxkcmVuLCBuZXdQcm9wcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3UHJvcHM7XG4gICAgICAgIH07XG5cbiAgICAgICAgSGVsbWV0V3JhcHBlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgcHJvcHMgPSBvYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFtcImNoaWxkcmVuXCJdKTtcblxuICAgICAgICAgICAgdmFyIG5ld1Byb3BzID0gX2V4dGVuZHMoe30sIHByb3BzKTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgbmV3UHJvcHMgPSB0aGlzLm1hcENoaWxkcmVuVG9Qcm9wcyhjaGlsZHJlbiwgbmV3UHJvcHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIG5ld1Byb3BzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjcmVhdGVDbGFzcyhIZWxtZXRXcmFwcGVyLCBudWxsLCBbe1xuICAgICAgICAgICAga2V5OiBcImNhblVzZURPTVwiLFxuXG5cbiAgICAgICAgICAgIC8vIENvbXBvbmVudC5wZWVrIGNvbWVzIGZyb20gcmVhY3Qtc2lkZS1lZmZlY3Q6XG4gICAgICAgICAgICAvLyBGb3IgdGVzdGluZywgeW91IG1heSB1c2UgYSBzdGF0aWMgcGVlaygpIG1ldGhvZCBhdmFpbGFibGUgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudC5cbiAgICAgICAgICAgIC8vIEl0IGxldHMgeW91IGdldCB0aGUgY3VycmVudCBzdGF0ZSB3aXRob3V0IHJlc2V0dGluZyB0aGUgbW91bnRlZCBpbnN0YW5jZSBzdGFjay5cbiAgICAgICAgICAgIC8vIERvbuKAmXQgdXNlIGl0IGZvciBhbnl0aGluZyBvdGhlciB0aGFuIHRlc3RpbmcuXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGJhc2U6IHtcInRhcmdldFwiOiBcIl9ibGFua1wiLCBcImhyZWZcIjogXCJodHRwOi8vbXlzaXRlLmNvbS9cIn1cbiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBib2R5QXR0cmlidXRlczoge1wiY2xhc3NOYW1lXCI6IFwicm9vdFwifVxuICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGRlZmF1bHRUaXRsZTogXCJEZWZhdWx0IFRpdGxlXCJcbiAgICAgICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVmZXI6IHRydWVcbiAgICAgICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5jb2RlU3BlY2lhbENoYXJhY3RlcnM6IHRydWVcbiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBodG1sQXR0cmlidXRlczoge1wibGFuZ1wiOiBcImVuXCIsIFwiYW1wXCI6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGxpbms6IFt7XCJyZWxcIjogXCJjYW5vbmljYWxcIiwgXCJocmVmXCI6IFwiaHR0cDovL215c2l0ZS5jb20vZXhhbXBsZVwifV1cbiAgICAgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1ldGE6IFt7XCJuYW1lXCI6IFwiZGVzY3JpcHRpb25cIiwgXCJjb250ZW50XCI6IFwiVGVzdCBkZXNjcmlwdGlvblwifV1cbiAgICAgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG5vc2NyaXB0OiBbe1wiaW5uZXJIVE1MXCI6IFwiPGltZyBzcmM9J2h0dHA6Ly9teXNpdGUuY29tL2pzL3Rlc3QuanMnXCJ9XVxuICAgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25DaGFuZ2VDbGllbnRTdGF0ZTogXCIobmV3U3RhdGUpID0+IGNvbnNvbGUubG9nKG5ld1N0YXRlKVwiXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBzY3JpcHQ6IFt7XCJ0eXBlXCI6IFwidGV4dC9qYXZhc2NyaXB0XCIsIFwic3JjXCI6IFwiaHR0cDovL215c2l0ZS5jb20vanMvdGVzdC5qc1wifV1cbiAgICAgICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHN0eWxlOiBbe1widHlwZVwiOiBcInRleHQvY3NzXCIsIFwiY3NzVGV4dFwiOiBcImRpdiB7IGRpc3BsYXk6IGJsb2NrOyBjb2xvcjogYmx1ZTsgfVwifV1cbiAgICAgICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZTogXCJUaXRsZVwiXG4gICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGl0bGVBdHRyaWJ1dGVzOiB7XCJpdGVtcHJvcFwiOiBcIm5hbWVcIn1cbiAgICAgICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZVRlbXBsYXRlOiBcIk15U2l0ZS5jb20gLSAlc1wiXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gc2V0JCQxKGNhblVzZURPTSkge1xuICAgICAgICAgICAgICAgIENvbXBvbmVudC5jYW5Vc2VET00gPSBjYW5Vc2VET007XG4gICAgICAgICAgICB9XG4gICAgICAgIH1dKTtcbiAgICAgICAgcmV0dXJuIEhlbG1ldFdyYXBwZXI7XG4gICAgfShSZWFjdC5Db21wb25lbnQpLCBfY2xhc3MucHJvcFR5cGVzID0ge1xuICAgICAgICBiYXNlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgICBib2R5QXR0cmlidXRlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5ub2RlKSwgUHJvcFR5cGVzLm5vZGVdKSxcbiAgICAgICAgZGVmYXVsdFRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICBkZWZlcjogUHJvcFR5cGVzLmJvb2wsXG4gICAgICAgIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICAgIGxpbms6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuICAgICAgICBtZXRhOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICAgICAgbm9zY3JpcHQ6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuICAgICAgICBvbkNoYW5nZUNsaWVudFN0YXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgc2NyaXB0OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KSxcbiAgICAgICAgc3R5bGU6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxuICAgICAgICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgdGl0bGVBdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgICB0aXRsZVRlbXBsYXRlOiBQcm9wVHlwZXMuc3RyaW5nXG4gICAgfSwgX2NsYXNzLmRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgZGVmZXI6IHRydWUsXG4gICAgICAgIGVuY29kZVNwZWNpYWxDaGFyYWN0ZXJzOiB0cnVlXG4gICAgfSwgX2NsYXNzLnBlZWsgPSBDb21wb25lbnQucGVlaywgX2NsYXNzLnJld2luZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1hcHBlZFN0YXRlID0gQ29tcG9uZW50LnJld2luZCgpO1xuICAgICAgICBpZiAoIW1hcHBlZFN0YXRlKSB7XG4gICAgICAgICAgICAvLyBwcm92aWRlIGZhbGxiYWNrIGlmIG1hcHBlZFN0YXRlIGlzIHVuZGVmaW5lZFxuICAgICAgICAgICAgbWFwcGVkU3RhdGUgPSBtYXBTdGF0ZU9uU2VydmVyKHtcbiAgICAgICAgICAgICAgICBiYXNlVGFnOiBbXSxcbiAgICAgICAgICAgICAgICBib2R5QXR0cmlidXRlczoge30sXG4gICAgICAgICAgICAgICAgZW5jb2RlU3BlY2lhbENoYXJhY3RlcnM6IHRydWUsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICAgICAgICAgIGxpbmtUYWdzOiBbXSxcbiAgICAgICAgICAgICAgICBtZXRhVGFnczogW10sXG4gICAgICAgICAgICAgICAgbm9zY3JpcHRUYWdzOiBbXSxcbiAgICAgICAgICAgICAgICBzY3JpcHRUYWdzOiBbXSxcbiAgICAgICAgICAgICAgICBzdHlsZVRhZ3M6IFtdLFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIlwiLFxuICAgICAgICAgICAgICAgIHRpdGxlQXR0cmlidXRlczoge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcHBlZFN0YXRlO1xuICAgIH0sIF90ZW1wO1xufTtcblxudmFyIE51bGxDb21wb25lbnQgPSBmdW5jdGlvbiBOdWxsQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBudWxsO1xufTtcblxudmFyIEhlbG1ldFNpZGVFZmZlY3RzID0gd2l0aFNpZGVFZmZlY3QocmVkdWNlUHJvcHNUb1N0YXRlLCBoYW5kbGVDbGllbnRTdGF0ZUNoYW5nZSwgbWFwU3RhdGVPblNlcnZlcikoTnVsbENvbXBvbmVudCk7XG5cbnZhciBIZWxtZXRFeHBvcnQgPSBIZWxtZXQoSGVsbWV0U2lkZUVmZmVjdHMpO1xuSGVsbWV0RXhwb3J0LnJlbmRlclN0YXRpYyA9IEhlbG1ldEV4cG9ydC5yZXdpbmQ7XG5cbmV4cG9ydCBkZWZhdWx0IEhlbG1ldEV4cG9ydDtcbmV4cG9ydCB7IEhlbG1ldEV4cG9ydCBhcyBIZWxtZXQgfTtcbiIsIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnNlcnZlcl9jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5Jyk7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfU0VSVkVSX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIFN1c3BlbnNlTGlzdCA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQ29uY3VycmVudE1vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlTGlzdChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG59XG5cbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5TdXNwZW5zZUxpc3QgPSBTdXNwZW5zZUxpc3Q7XG5leHBvcnRzLmlzQXN5bmNNb2RlID0gaXNBc3luY01vZGU7XG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBpc0NvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lciA9IGlzQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGlzQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGlzRm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7XG5leHBvcnRzLmlzTGF6eSA9IGlzTGF6eTtcbmV4cG9ydHMuaXNNZW1vID0gaXNNZW1vO1xuZXhwb3J0cy5pc1BvcnRhbCA9IGlzUG9ydGFsO1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gaXNQcm9maWxlcjtcbmV4cG9ydHMuaXNTdHJpY3RNb2RlID0gaXNTdHJpY3RNb2RlO1xuZXhwb3J0cy5pc1N1c3BlbnNlID0gaXNTdXNwZW5zZTtcbmV4cG9ydHMuaXNTdXNwZW5zZUxpc3QgPSBpc1N1c3BlbnNlTGlzdDtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlO1xuZXhwb3J0cy50eXBlT2YgPSB0eXBlT2Y7XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsImltcG9ydCB7Y3JlYXRlRWxlbWVudCxDb21wb25lbnR9ZnJvbSdyZWFjdCc7aW1wb3J0IHtmaW5kRE9NTm9kZX1mcm9tJ3JlYWN0LWRvbSc7ZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuXG4gIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn0vKipcbiAqIENoZWNrIHdoZXRoZXIgc29tZSBET00gbm9kZSBpcyBvdXIgQ29tcG9uZW50J3Mgbm9kZS5cbiAqL1xuZnVuY3Rpb24gaXNOb2RlRm91bmQoY3VycmVudCwgY29tcG9uZW50Tm9kZSwgaWdub3JlQ2xhc3MpIHtcbiAgaWYgKGN1cnJlbnQgPT09IGNvbXBvbmVudE5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBTVkcgPHVzZS8+IGVsZW1lbnRzIGRvIG5vdCB0ZWNobmljYWxseSByZXNpZGUgaW4gdGhlIHJlbmRlcmVkIERPTSwgc29cbiAgLy8gdGhleSBkbyBub3QgaGF2ZSBjbGFzc0xpc3QgZGlyZWN0bHksIGJ1dCB0aGV5IG9mZmVyIGEgbGluayB0byB0aGVpclxuICAvLyBjb3JyZXNwb25kaW5nIGVsZW1lbnQsIHdoaWNoIGNhbiBoYXZlIGNsYXNzTGlzdC4gVGhpcyBleHRyYSBjaGVjayBpcyBmb3JcbiAgLy8gdGhhdCBjYXNlLlxuICAvLyBTZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL3N0cnVjdC5odG1sI0ludGVyZmFjZVNWR1VzZUVsZW1lbnRcbiAgLy8gRGlzY3Vzc2lvbjogaHR0cHM6Ly9naXRodWIuY29tL1BvbWF4L3JlYWN0LW9uY2xpY2tvdXRzaWRlL3B1bGwvMTdcblxuXG4gIGlmIChjdXJyZW50LmNvcnJlc3BvbmRpbmdFbGVtZW50KSB7XG4gICAgcmV0dXJuIGN1cnJlbnQuY29ycmVzcG9uZGluZ0VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGlnbm9yZUNsYXNzKTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50LmNsYXNzTGlzdC5jb250YWlucyhpZ25vcmVDbGFzcyk7XG59XG4vKipcbiAqIFRyeSB0byBmaW5kIG91ciBub2RlIGluIGEgaGllcmFyY2h5IG9mIG5vZGVzLCByZXR1cm5pbmcgdGhlIGRvY3VtZW50XG4gKiBub2RlIGFzIGhpZ2hlc3Qgbm9kZSBpZiBvdXIgbm9kZSBpcyBub3QgZm91bmQgaW4gdGhlIHBhdGggdXAuXG4gKi9cblxuZnVuY3Rpb24gZmluZEhpZ2hlc3QoY3VycmVudCwgY29tcG9uZW50Tm9kZSwgaWdub3JlQ2xhc3MpIHtcbiAgaWYgKGN1cnJlbnQgPT09IGNvbXBvbmVudE5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiBzb3VyY2U9bG9jYWwgdGhlbiB0aGlzIGV2ZW50IGNhbWUgZnJvbSAnc29tZXdoZXJlJ1xuICAvLyBpbnNpZGUgYW5kIHNob3VsZCBiZSBpZ25vcmVkLiBXZSBjb3VsZCBoYW5kbGUgdGhpcyB3aXRoXG4gIC8vIGEgbGF5ZXJlZCBhcHByb2FjaCwgdG9vLCBidXQgdGhhdCByZXF1aXJlcyBnb2luZyBiYWNrIHRvXG4gIC8vIHRoaW5raW5nIGluIHRlcm1zIG9mIERvbSBub2RlIG5lc3RpbmcsIHJ1bm5pbmcgY291bnRlclxuICAvLyB0byBSZWFjdCdzICd5b3Ugc2hvdWxkbid0IGNhcmUgYWJvdXQgdGhlIERPTScgcGhpbG9zb3BoeS5cbiAgLy8gQWxzbyBjb3ZlciBzaGFkb3dSb290IG5vZGUgYnkgY2hlY2tpbmcgY3VycmVudC5ob3N0XG5cblxuICB3aGlsZSAoY3VycmVudC5wYXJlbnROb2RlIHx8IGN1cnJlbnQuaG9zdCkge1xuICAgIC8vIE9ubHkgY2hlY2sgbm9ybWFsIG5vZGUgd2l0aG91dCBzaGFkb3dSb290XG4gICAgaWYgKGN1cnJlbnQucGFyZW50Tm9kZSAmJiBpc05vZGVGb3VuZChjdXJyZW50LCBjb21wb25lbnROb2RlLCBpZ25vcmVDbGFzcykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudE5vZGUgfHwgY3VycmVudC5ob3N0O1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG4vKipcbiAqIENoZWNrIGlmIHRoZSBicm93c2VyIHNjcm9sbGJhciB3YXMgY2xpY2tlZFxuICovXG5cbmZ1bmN0aW9uIGNsaWNrZWRTY3JvbGxiYXIoZXZ0KSB7XG4gIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggPD0gZXZ0LmNsaWVudFggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCA8PSBldnQuY2xpZW50WTtcbn0vLyBpZGVhbGx5IHdpbGwgZ2V0IHJlcGxhY2VkIHdpdGggZXh0ZXJuYWwgZGVwXG4vLyB3aGVuIHJhZnJleC9kZXRlY3QtcGFzc2l2ZS1ldmVudHMjNCBhbmQgcmFmcmV4L2RldGVjdC1wYXNzaXZlLWV2ZW50cyM1IGdldCBtZXJnZWQgaW5cbnZhciB0ZXN0UGFzc2l2ZUV2ZW50U3VwcG9ydCA9IGZ1bmN0aW9uIHRlc3RQYXNzaXZlRXZlbnRTdXBwb3J0KCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhc3NpdmUgPSBmYWxzZTtcbiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcGFzc2l2ZSA9IHRydWU7XG4gICAgfVxuICB9KTtcblxuICB2YXIgbm9vcCA9IGZ1bmN0aW9uIG5vb3AoKSB7fTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmVFdmVudFN1cHBvcnQnLCBub29wLCBvcHRpb25zKTtcbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlRXZlbnRTdXBwb3J0Jywgbm9vcCwgb3B0aW9ucyk7XG4gIHJldHVybiBwYXNzaXZlO1xufTtmdW5jdGlvbiBhdXRvSW5jKHNlZWQpIHtcbiAgaWYgKHNlZWQgPT09IHZvaWQgMCkge1xuICAgIHNlZWQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKytzZWVkO1xuICB9O1xufVxuXG52YXIgdWlkID0gYXV0b0luYygpO3ZhciBwYXNzaXZlRXZlbnRTdXBwb3J0O1xudmFyIGhhbmRsZXJzTWFwID0ge307XG52YXIgZW5hYmxlZEluc3RhbmNlcyA9IHt9O1xudmFyIHRvdWNoRXZlbnRzID0gWyd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZSddO1xudmFyIElHTk9SRV9DTEFTU19OQU1FID0gJ2lnbm9yZS1yZWFjdC1vbmNsaWNrb3V0c2lkZSc7XG4vKipcbiAqIE9wdGlvbnMgZm9yIGFkZEV2ZW50SGFuZGxlciBhbmQgcmVtb3ZlRXZlbnRIYW5kbGVyXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRIYW5kbGVyT3B0aW9ucyhpbnN0YW5jZSwgZXZlbnROYW1lKSB7XG4gIHZhciBoYW5kbGVyT3B0aW9ucyA9IHt9O1xuICB2YXIgaXNUb3VjaEV2ZW50ID0gdG91Y2hFdmVudHMuaW5kZXhPZihldmVudE5hbWUpICE9PSAtMTtcblxuICBpZiAoaXNUb3VjaEV2ZW50ICYmIHBhc3NpdmVFdmVudFN1cHBvcnQpIHtcbiAgICBoYW5kbGVyT3B0aW9ucy5wYXNzaXZlID0gIWluc3RhbmNlLnByb3BzLnByZXZlbnREZWZhdWx0O1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZXJPcHRpb25zO1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyB0aGUgSE9DIGZ1bmN0aW9uIHRoYXQgeW91J2xsIHVzZVxuICogaW4gb3JkZXIgdG8gaW1wYXJ0IG9uT3V0c2lkZUNsaWNrIGxpc3RlbmluZyB0byBhblxuICogYXJiaXRyYXJ5IGNvbXBvbmVudC4gSXQgZ2V0cyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGVcbiAqIGJvb3RzdHJhcHBpbmcgY29kZSB0byB5aWVsZCBhbiBpbnN0YW5jZSBvZiB0aGVcbiAqIG9uQ2xpY2tPdXRzaWRlSE9DIGZ1bmN0aW9uIGRlZmluZWQgaW5zaWRlIHNldHVwSE9DKCkuXG4gKi9cblxuXG5mdW5jdGlvbiBvbkNsaWNrT3V0c2lkZUhPQyhXcmFwcGVkQ29tcG9uZW50LCBjb25maWcpIHtcbiAgdmFyIF9jbGFzcywgX3RlbXA7XG5cbiAgdmFyIGNvbXBvbmVudE5hbWUgPSBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcbiAgcmV0dXJuIF90ZW1wID0gX2NsYXNzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzTG9vc2Uob25DbGlja091dHNpZGUsIF9Db21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gb25DbGlja091dHNpZGUocHJvcHMpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMpIHx8IHRoaXM7XG5cbiAgICAgIF90aGlzLl9fb3V0c2lkZUNsaWNrSGFuZGxlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAodHlwZW9mIF90aGlzLl9fY2xpY2tPdXRzaWRlSGFuZGxlclByb3AgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBfdGhpcy5fX2NsaWNrT3V0c2lkZUhhbmRsZXJQcm9wKGV2ZW50KTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbnN0YW5jZSA9IF90aGlzLmdldEluc3RhbmNlKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5wcm9wcy5oYW5kbGVDbGlja091dHNpZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpbnN0YW5jZS5wcm9wcy5oYW5kbGVDbGlja091dHNpZGUoZXZlbnQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuaGFuZGxlQ2xpY2tPdXRzaWRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaW5zdGFuY2UuaGFuZGxlQ2xpY2tPdXRzaWRlKGV2ZW50KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcmFwcGVkQ29tcG9uZW50OiBcIiArIGNvbXBvbmVudE5hbWUgKyBcIiBsYWNrcyBhIGhhbmRsZUNsaWNrT3V0c2lkZShldmVudCkgZnVuY3Rpb24gZm9yIHByb2Nlc3Npbmcgb3V0c2lkZSBjbGljayBldmVudHMuXCIpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuX19nZXRDb21wb25lbnROb2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBfdGhpcy5nZXRJbnN0YW5jZSgpO1xuXG4gICAgICAgIGlmIChjb25maWcgJiYgdHlwZW9mIGNvbmZpZy5zZXRDbGlja091dHNpZGVSZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gY29uZmlnLnNldENsaWNrT3V0c2lkZVJlZigpKGluc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2Uuc2V0Q2xpY2tPdXRzaWRlUmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlLnNldENsaWNrT3V0c2lkZVJlZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbmRET01Ob2RlKGluc3RhbmNlKTtcbiAgICAgIH07XG5cbiAgICAgIF90aGlzLmVuYWJsZU9uQ2xpY2tPdXRzaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCBlbmFibGVkSW5zdGFuY2VzW190aGlzLl91aWRdKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXNzaXZlRXZlbnRTdXBwb3J0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHBhc3NpdmVFdmVudFN1cHBvcnQgPSB0ZXN0UGFzc2l2ZUV2ZW50U3VwcG9ydCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5hYmxlZEluc3RhbmNlc1tfdGhpcy5fdWlkXSA9IHRydWU7XG4gICAgICAgIHZhciBldmVudHMgPSBfdGhpcy5wcm9wcy5ldmVudFR5cGVzO1xuXG4gICAgICAgIGlmICghZXZlbnRzLmZvckVhY2gpIHtcbiAgICAgICAgICBldmVudHMgPSBbZXZlbnRzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhhbmRsZXJzTWFwW190aGlzLl91aWRdID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKF90aGlzLmNvbXBvbmVudE5vZGUgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgICBpZiAoX3RoaXMuaW5pdFRpbWVTdGFtcCA+IGV2ZW50LnRpbWVTdGFtcCkgcmV0dXJuO1xuXG4gICAgICAgICAgaWYgKF90aGlzLnByb3BzLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5leGNsdWRlU2Nyb2xsYmFyICYmIGNsaWNrZWRTY3JvbGxiYXIoZXZlbnQpKSByZXR1cm47XG4gICAgICAgICAgdmFyIGN1cnJlbnQgPSBldmVudC5jb21wb3NlZCAmJiBldmVudC5jb21wb3NlZFBhdGggJiYgZXZlbnQuY29tcG9zZWRQYXRoKCkuc2hpZnQoKSB8fCBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICBpZiAoZmluZEhpZ2hlc3QoY3VycmVudCwgX3RoaXMuY29tcG9uZW50Tm9kZSwgX3RoaXMucHJvcHMub3V0c2lkZUNsaWNrSWdub3JlQ2xhc3MpICE9PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLl9fb3V0c2lkZUNsaWNrSGFuZGxlcihldmVudCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyc01hcFtfdGhpcy5fdWlkXSwgZ2V0RXZlbnRIYW5kbGVyT3B0aW9ucyhfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgZXZlbnROYW1lKSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMuZGlzYWJsZU9uQ2xpY2tPdXRzaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWxldGUgZW5hYmxlZEluc3RhbmNlc1tfdGhpcy5fdWlkXTtcbiAgICAgICAgdmFyIGZuID0gaGFuZGxlcnNNYXBbX3RoaXMuX3VpZF07XG5cbiAgICAgICAgaWYgKGZuICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB2YXIgZXZlbnRzID0gX3RoaXMucHJvcHMuZXZlbnRUeXBlcztcblxuICAgICAgICAgIGlmICghZXZlbnRzLmZvckVhY2gpIHtcbiAgICAgICAgICAgIGV2ZW50cyA9IFtldmVudHNdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZm4sIGdldEV2ZW50SGFuZGxlck9wdGlvbnMoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIGV2ZW50TmFtZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRlbGV0ZSBoYW5kbGVyc01hcFtfdGhpcy5fdWlkXTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3RoaXMuZ2V0UmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgICByZXR1cm4gX3RoaXMuaW5zdGFuY2VSZWYgPSByZWY7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5fdWlkID0gdWlkKCk7XG4gICAgICBfdGhpcy5pbml0VGltZVN0YW1wID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjY2VzcyB0aGUgV3JhcHBlZENvbXBvbmVudCdzIGluc3RhbmNlLlxuICAgICAqL1xuXG5cbiAgICB2YXIgX3Byb3RvID0gb25DbGlja091dHNpZGUucHJvdG90eXBlO1xuXG4gICAgX3Byb3RvLmdldEluc3RhbmNlID0gZnVuY3Rpb24gZ2V0SW5zdGFuY2UoKSB7XG4gICAgICBpZiAoV3JhcHBlZENvbXBvbmVudC5wcm90b3R5cGUgJiYgIVdyYXBwZWRDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWYgPSB0aGlzLmluc3RhbmNlUmVmO1xuICAgICAgcmV0dXJuIHJlZi5nZXRJbnN0YW5jZSA/IHJlZi5nZXRJbnN0YW5jZSgpIDogcmVmO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgY2xpY2sgbGlzdGVuZXJzIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50LFxuICAgICAqIGxpbmtlZCB0byB0aGlzIGNvbXBvbmVudCdzIHN0YXRlLlxuICAgICAqL1xuICAgIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgLy8gSWYgd2UgYXJlIGluIGFuIGVudmlyb25tZW50IHdpdGhvdXQgYSBET00gc3VjaFxuICAgICAgLy8gYXMgc2hhbGxvdyByZW5kZXJpbmcgb3Igc25hcHNob3RzIHRoZW4gd2UgZXhpdFxuICAgICAgLy8gZWFybHkgdG8gcHJldmVudCBhbnkgdW5oYW5kbGVkIGVycm9ycyBiZWluZyB0aHJvd24uXG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZ2V0SW5zdGFuY2UoKTtcblxuICAgICAgaWYgKGNvbmZpZyAmJiB0eXBlb2YgY29uZmlnLmhhbmRsZUNsaWNrT3V0c2lkZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLl9fY2xpY2tPdXRzaWRlSGFuZGxlclByb3AgPSBjb25maWcuaGFuZGxlQ2xpY2tPdXRzaWRlKGluc3RhbmNlKTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX19jbGlja091dHNpZGVIYW5kbGVyUHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyYXBwZWRDb21wb25lbnQ6IFwiICsgY29tcG9uZW50TmFtZSArIFwiIGxhY2tzIGEgZnVuY3Rpb24gZm9yIHByb2Nlc3Npbmcgb3V0c2lkZSBjbGljayBldmVudHMgc3BlY2lmaWVkIGJ5IHRoZSBoYW5kbGVDbGlja091dHNpZGUgY29uZmlnIG9wdGlvbi5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5jb21wb25lbnROb2RlID0gdGhpcy5fX2dldENvbXBvbmVudE5vZGUoKTsgLy8gcmV0dXJuIGVhcmx5IHNvIHdlIGRvbnQgaW5pdGlhdGUgb25DbGlja091dHNpZGVcblxuICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZU9uQ2xpY2tPdXRzaWRlKSByZXR1cm47XG4gICAgICB0aGlzLmVuYWJsZU9uQ2xpY2tPdXRzaWRlKCk7XG4gICAgfTtcblxuICAgIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudE5vZGUgPSB0aGlzLl9fZ2V0Q29tcG9uZW50Tm9kZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIGRvY3VtZW50J3MgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGlzIGNvbXBvbmVudFxuICAgICAqL1xuICAgIDtcblxuICAgIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5kaXNhYmxlT25DbGlja091dHNpZGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuIGJlIGNhbGxlZCB0byBleHBsaWNpdGx5IGVuYWJsZSBldmVudCBsaXN0ZW5pbmdcbiAgICAgKiBmb3IgY2xpY2tzIGFuZCB0b3VjaGVzIG91dHNpZGUgb2YgdGhpcyBlbGVtZW50LlxuICAgICAqL1xuICAgIDtcblxuICAgIC8qKlxuICAgICAqIFBhc3MtdGhyb3VnaCByZW5kZXJcbiAgICAgKi9cbiAgICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICAgIF90aGlzJHByb3BzLmV4Y2x1ZGVTY3JvbGxiYXI7XG4gICAgICAgICAgdmFyIHByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3RoaXMkcHJvcHMsIFtcImV4Y2x1ZGVTY3JvbGxiYXJcIl0pO1xuXG4gICAgICBpZiAoV3JhcHBlZENvbXBvbmVudC5wcm90b3R5cGUgJiYgV3JhcHBlZENvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCkge1xuICAgICAgICBwcm9wcy5yZWYgPSB0aGlzLmdldFJlZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3BzLndyYXBwZWRSZWYgPSB0aGlzLmdldFJlZjtcbiAgICAgIH1cblxuICAgICAgcHJvcHMuZGlzYWJsZU9uQ2xpY2tPdXRzaWRlID0gdGhpcy5kaXNhYmxlT25DbGlja091dHNpZGU7XG4gICAgICBwcm9wcy5lbmFibGVPbkNsaWNrT3V0c2lkZSA9IHRoaXMuZW5hYmxlT25DbGlja091dHNpZGU7XG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBwcm9wcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBvbkNsaWNrT3V0c2lkZTtcbiAgfShDb21wb25lbnQpLCBfY2xhc3MuZGlzcGxheU5hbWUgPSBcIk9uQ2xpY2tPdXRzaWRlKFwiICsgY29tcG9uZW50TmFtZSArIFwiKVwiLCBfY2xhc3MuZGVmYXVsdFByb3BzID0ge1xuICAgIGV2ZW50VHlwZXM6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSxcbiAgICBleGNsdWRlU2Nyb2xsYmFyOiBjb25maWcgJiYgY29uZmlnLmV4Y2x1ZGVTY3JvbGxiYXIgfHwgZmFsc2UsXG4gICAgb3V0c2lkZUNsaWNrSWdub3JlQ2xhc3M6IElHTk9SRV9DTEFTU19OQU1FLFxuICAgIHByZXZlbnREZWZhdWx0OiBmYWxzZSxcbiAgICBzdG9wUHJvcGFnYXRpb246IGZhbHNlXG4gIH0sIF9jbGFzcy5nZXRDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gV3JhcHBlZENvbXBvbmVudC5nZXRDbGFzcyA/IFdyYXBwZWRDb21wb25lbnQuZ2V0Q2xhc3MoKSA6IFdyYXBwZWRDb21wb25lbnQ7XG4gIH0sIF90ZW1wO1xufWV4cG9ydCBkZWZhdWx0IG9uQ2xpY2tPdXRzaWRlSE9DO2V4cG9ydHtJR05PUkVfQ0xBU1NfTkFNRX07IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgc3R5bGVTaW5nbGV0b24gfSBmcm9tICdyZWFjdC1zdHlsZS1zaW5nbGV0b24nO1xuaW1wb3J0IHsgZnVsbFdpZHRoQ2xhc3NOYW1lLCB6ZXJvUmlnaHRDbGFzc05hbWUsIG5vU2Nyb2xsYmFyc0NsYXNzTmFtZSwgcmVtb3ZlZEJhclNpemVWYXJpYWJsZSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGdldEdhcFdpZHRoIH0gZnJvbSAnLi91dGlscyc7XG52YXIgU3R5bGUgPSBzdHlsZVNpbmdsZXRvbigpO1xuLy8gaW1wb3J0YW50IHRpcCAtIG9uY2Ugd2UgbWVhc3VyZSBzY3JvbGxCYXIgd2lkdGggYW5kIHJlbW92ZSB0aGVtXG4vLyB3ZSBjb3VsZCBub3QgcmVwZWF0IHRoaXMgb3BlcmF0aW9uXG4vLyB0aHVzIHdlIGFyZSB1c2luZyBzdHlsZS1zaW5nbGV0b24gLSBvbmx5IHRoZSBmaXJzdCBcInlldCBjb3JyZWN0XCIgc3R5bGUgd2lsbCBiZSBhcHBsaWVkLlxudmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uIChfYSwgYWxsb3dSZWxhdGl2ZSwgZ2FwTW9kZSwgaW1wb3J0YW50KSB7XG4gICAgdmFyIGxlZnQgPSBfYS5sZWZ0LCB0b3AgPSBfYS50b3AsIHJpZ2h0ID0gX2EucmlnaHQsIGdhcCA9IF9hLmdhcDtcbiAgICBpZiAoZ2FwTW9kZSA9PT0gdm9pZCAwKSB7IGdhcE1vZGUgPSAnbWFyZ2luJzsgfVxuICAgIHJldHVybiBcIlxcbiAgLlwiLmNvbmNhdChub1Njcm9sbGJhcnNDbGFzc05hbWUsIFwiIHtcXG4gICBvdmVyZmxvdzogaGlkZGVuIFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gICBwYWRkaW5nLXJpZ2h0OiBcIikuY29uY2F0KGdhcCwgXCJweCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICB9XFxuICBib2R5IHtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbiBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47XFxuICAgIFwiKS5jb25jYXQoW1xuICAgICAgICBhbGxvd1JlbGF0aXZlICYmIFwicG9zaXRpb246IHJlbGF0aXZlIFwiLmNvbmNhdChpbXBvcnRhbnQsIFwiO1wiKSxcbiAgICAgICAgZ2FwTW9kZSA9PT0gJ21hcmdpbicgJiZcbiAgICAgICAgICAgIFwiXFxuICAgIHBhZGRpbmctbGVmdDogXCIuY29uY2F0KGxlZnQsIFwicHg7XFxuICAgIHBhZGRpbmctdG9wOiBcIikuY29uY2F0KHRvcCwgXCJweDtcXG4gICAgcGFkZGluZy1yaWdodDogXCIpLmNvbmNhdChyaWdodCwgXCJweDtcXG4gICAgbWFyZ2luLWxlZnQ6MDtcXG4gICAgbWFyZ2luLXRvcDowO1xcbiAgICBtYXJnaW4tcmlnaHQ6IFwiKS5jb25jYXQoZ2FwLCBcInB4IFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gICAgXCIpLFxuICAgICAgICBnYXBNb2RlID09PSAncGFkZGluZycgJiYgXCJwYWRkaW5nLXJpZ2h0OiBcIi5jb25jYXQoZ2FwLCBcInB4IFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcIiksXG4gICAgXVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5qb2luKCcnKSwgXCJcXG4gIH1cXG4gIFxcbiAgLlwiKS5jb25jYXQoemVyb1JpZ2h0Q2xhc3NOYW1lLCBcIiB7XFxuICAgIHJpZ2h0OiBcIikuY29uY2F0KGdhcCwgXCJweCBcIikuY29uY2F0KGltcG9ydGFudCwgXCI7XFxuICB9XFxuICBcXG4gIC5cIikuY29uY2F0KGZ1bGxXaWR0aENsYXNzTmFtZSwgXCIge1xcbiAgICBtYXJnaW4tcmlnaHQ6IFwiKS5jb25jYXQoZ2FwLCBcInB4IFwiKS5jb25jYXQoaW1wb3J0YW50LCBcIjtcXG4gIH1cXG4gIFxcbiAgLlwiKS5jb25jYXQoemVyb1JpZ2h0Q2xhc3NOYW1lLCBcIiAuXCIpLmNvbmNhdCh6ZXJvUmlnaHRDbGFzc05hbWUsIFwiIHtcXG4gICAgcmlnaHQ6IDAgXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgfVxcbiAgXFxuICAuXCIpLmNvbmNhdChmdWxsV2lkdGhDbGFzc05hbWUsIFwiIC5cIikuY29uY2F0KGZ1bGxXaWR0aENsYXNzTmFtZSwgXCIge1xcbiAgICBtYXJnaW4tcmlnaHQ6IDAgXCIpLmNvbmNhdChpbXBvcnRhbnQsIFwiO1xcbiAgfVxcbiAgXFxuICBib2R5IHtcXG4gICAgXCIpLmNvbmNhdChyZW1vdmVkQmFyU2l6ZVZhcmlhYmxlLCBcIjogXCIpLmNvbmNhdChnYXAsIFwicHg7XFxuICB9XFxuXCIpO1xufTtcbi8qKlxuICogUmVtb3ZlcyBwYWdlIHNjcm9sbGJhciBhbmQgYmxvY2tzIHBhZ2Ugc2Nyb2xsIHdoZW4gbW91bnRlZFxuICovXG5leHBvcnQgdmFyIFJlbW92ZVNjcm9sbEJhciA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHZhciBub1JlbGF0aXZlID0gcHJvcHMubm9SZWxhdGl2ZSwgbm9JbXBvcnRhbnQgPSBwcm9wcy5ub0ltcG9ydGFudCwgX2EgPSBwcm9wcy5nYXBNb2RlLCBnYXBNb2RlID0gX2EgPT09IHZvaWQgMCA/ICdtYXJnaW4nIDogX2E7XG4gICAgLypcbiAgICAgZ2FwIHdpbGwgYmUgbWVhc3VyZWQgb24gZXZlcnkgY29tcG9uZW50IG1vdW50XG4gICAgIGhvd2V2ZXIgaXQgd2lsbCBiZSB1c2VkIG9ubHkgYnkgdGhlIFwiZmlyc3RcIiBpbnZvY2F0aW9uXG4gICAgIGR1ZSB0byBzaW5nbGV0b24gbmF0dXJlIG9mIDxTdHlsZVxuICAgICAqL1xuICAgIHZhciBnYXAgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldEdhcFdpZHRoKGdhcE1vZGUpOyB9LCBbZ2FwTW9kZV0pO1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN0eWxlLCB7IHN0eWxlczogZ2V0U3R5bGVzKGdhcCwgIW5vUmVsYXRpdmUsIGdhcE1vZGUsICFub0ltcG9ydGFudCA/ICchaW1wb3J0YW50JyA6ICcnKSB9KTtcbn07XG4iLCJleHBvcnQgdmFyIHplcm9SaWdodENsYXNzTmFtZSA9ICdyaWdodC1zY3JvbGwtYmFyLXBvc2l0aW9uJztcbmV4cG9ydCB2YXIgZnVsbFdpZHRoQ2xhc3NOYW1lID0gJ3dpZHRoLWJlZm9yZS1zY3JvbGwtYmFyJztcbmV4cG9ydCB2YXIgbm9TY3JvbGxiYXJzQ2xhc3NOYW1lID0gJ3dpdGgtc2Nyb2xsLWJhcnMtaGlkZGVuJztcbi8qKlxuICogTmFtZSBvZiBhIENTUyB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBhbW91bnQgb2YgXCJoaWRkZW5cIiBzY3JvbGxiYXJcbiAqICEgbWlnaHQgYmUgdW5kZWZpbmVkICEgdXNlIHdpbGwgZmFsbGJhY2shXG4gKi9cbmV4cG9ydCB2YXIgcmVtb3ZlZEJhclNpemVWYXJpYWJsZSA9ICctLXJlbW92ZWQtYm9keS1zY3JvbGwtYmFyLXNpemUnO1xuIiwiaW1wb3J0IHsgUmVtb3ZlU2Nyb2xsQmFyIH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgemVyb1JpZ2h0Q2xhc3NOYW1lLCBmdWxsV2lkdGhDbGFzc05hbWUsIG5vU2Nyb2xsYmFyc0NsYXNzTmFtZSwgcmVtb3ZlZEJhclNpemVWYXJpYWJsZSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGdldEdhcFdpZHRoIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgeyBSZW1vdmVTY3JvbGxCYXIsIHplcm9SaWdodENsYXNzTmFtZSwgZnVsbFdpZHRoQ2xhc3NOYW1lLCBub1Njcm9sbGJhcnNDbGFzc05hbWUsIHJlbW92ZWRCYXJTaXplVmFyaWFibGUsIGdldEdhcFdpZHRoLCB9O1xuIiwiZXhwb3J0IHZhciB6ZXJvR2FwID0ge1xuICAgIGxlZnQ6IDAsXG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGdhcDogMCxcbn07XG52YXIgcGFyc2UgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4gcGFyc2VJbnQoeCB8fCAnJywgMTApIHx8IDA7IH07XG52YXIgZ2V0T2Zmc2V0ID0gZnVuY3Rpb24gKGdhcE1vZGUpIHtcbiAgICB2YXIgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KTtcbiAgICB2YXIgbGVmdCA9IGNzW2dhcE1vZGUgPT09ICdwYWRkaW5nJyA/ICdwYWRkaW5nTGVmdCcgOiAnbWFyZ2luTGVmdCddO1xuICAgIHZhciB0b3AgPSBjc1tnYXBNb2RlID09PSAncGFkZGluZycgPyAncGFkZGluZ1RvcCcgOiAnbWFyZ2luVG9wJ107XG4gICAgdmFyIHJpZ2h0ID0gY3NbZ2FwTW9kZSA9PT0gJ3BhZGRpbmcnID8gJ3BhZGRpbmdSaWdodCcgOiAnbWFyZ2luUmlnaHQnXTtcbiAgICByZXR1cm4gW3BhcnNlKGxlZnQpLCBwYXJzZSh0b3ApLCBwYXJzZShyaWdodCldO1xufTtcbmV4cG9ydCB2YXIgZ2V0R2FwV2lkdGggPSBmdW5jdGlvbiAoZ2FwTW9kZSkge1xuICAgIGlmIChnYXBNb2RlID09PSB2b2lkIDApIHsgZ2FwTW9kZSA9ICdtYXJnaW4nOyB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB6ZXJvR2FwO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0cyA9IGdldE9mZnNldChnYXBNb2RlKTtcbiAgICB2YXIgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICB2YXIgd2luZG93V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiBvZmZzZXRzWzBdLFxuICAgICAgICB0b3A6IG9mZnNldHNbMV0sXG4gICAgICAgIHJpZ2h0OiBvZmZzZXRzWzJdLFxuICAgICAgICBnYXA6IE1hdGgubWF4KDAsIHdpbmRvd1dpZHRoIC0gZG9jdW1lbnRXaWR0aCArIG9mZnNldHNbMl0gLSBvZmZzZXRzWzBdKSxcbiAgICB9O1xufTtcbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSZW1vdmVTY3JvbGwgfSBmcm9tICcuL1VJJztcbmltcG9ydCBTaWRlQ2FyIGZyb20gJy4vc2lkZWNhcic7XG52YXIgUmVhY3RSZW1vdmVTY3JvbGwgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7IHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZW1vdmVTY3JvbGwsIF9fYXNzaWduKHt9LCBwcm9wcywgeyByZWY6IHJlZiwgc2lkZUNhcjogU2lkZUNhciB9KSkpOyB9KTtcblJlYWN0UmVtb3ZlU2Nyb2xsLmNsYXNzTmFtZXMgPSBSZW1vdmVTY3JvbGwuY2xhc3NOYW1lcztcbmV4cG9ydCBkZWZhdWx0IFJlYWN0UmVtb3ZlU2Nyb2xsO1xuIiwiaW1wb3J0IHsgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgUmVtb3ZlU2Nyb2xsQmFyIH0gZnJvbSAncmVhY3QtcmVtb3ZlLXNjcm9sbC1iYXInO1xuaW1wb3J0IHsgc3R5bGVTaW5nbGV0b24gfSBmcm9tICdyZWFjdC1zdHlsZS1zaW5nbGV0b24nO1xuaW1wb3J0IHsgbm9uUGFzc2l2ZSB9IGZyb20gJy4vYWdncmVzaXZlQ2FwdHVyZSc7XG5pbXBvcnQgeyBoYW5kbGVTY3JvbGwsIGxvY2F0aW9uQ291bGRCZVNjcm9sbGVkIH0gZnJvbSAnLi9oYW5kbGVTY3JvbGwnO1xuZXhwb3J0IHZhciBnZXRUb3VjaFhZID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdjaGFuZ2VkVG91Y2hlcycgaW4gZXZlbnQgPyBbZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCwgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WV0gOiBbMCwgMF07XG59O1xuZXhwb3J0IHZhciBnZXREZWx0YVhZID0gZnVuY3Rpb24gKGV2ZW50KSB7IHJldHVybiBbZXZlbnQuZGVsdGFYLCBldmVudC5kZWx0YVldOyB9O1xudmFyIGV4dHJhY3RSZWYgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgcmV0dXJuIHJlZiAmJiAnY3VycmVudCcgaW4gcmVmID8gcmVmLmN1cnJlbnQgOiByZWY7XG59O1xudmFyIGRlbHRhQ29tcGFyZSA9IGZ1bmN0aW9uICh4LCB5KSB7IHJldHVybiB4WzBdID09PSB5WzBdICYmIHhbMV0gPT09IHlbMV07IH07XG52YXIgZ2VuZXJhdGVTdHlsZSA9IGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gXCJcXG4gIC5ibG9jay1pbnRlcmFjdGl2aXR5LVwiLmNvbmNhdChpZCwgXCIge3BvaW50ZXItZXZlbnRzOiBub25lO31cXG4gIC5hbGxvdy1pbnRlcmFjdGl2aXR5LVwiKS5jb25jYXQoaWQsIFwiIHtwb2ludGVyLWV2ZW50czogYWxsO31cXG5cIik7IH07XG52YXIgaWRDb3VudGVyID0gMDtcbnZhciBsb2NrU3RhY2sgPSBbXTtcbmV4cG9ydCBmdW5jdGlvbiBSZW1vdmVTY3JvbGxTaWRlQ2FyKHByb3BzKSB7XG4gICAgdmFyIHNob3VsZFByZXZlbnRRdWV1ZSA9IFJlYWN0LnVzZVJlZihbXSk7XG4gICAgdmFyIHRvdWNoU3RhcnRSZWYgPSBSZWFjdC51c2VSZWYoWzAsIDBdKTtcbiAgICB2YXIgYWN0aXZlQXhpcyA9IFJlYWN0LnVzZVJlZigpO1xuICAgIHZhciBpZCA9IFJlYWN0LnVzZVN0YXRlKGlkQ291bnRlcisrKVswXTtcbiAgICB2YXIgU3R5bGUgPSBSZWFjdC51c2VTdGF0ZShzdHlsZVNpbmdsZXRvbilbMF07XG4gICAgdmFyIGxhc3RQcm9wcyA9IFJlYWN0LnVzZVJlZihwcm9wcyk7XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGFzdFByb3BzLmN1cnJlbnQgPSBwcm9wcztcbiAgICB9LCBbcHJvcHNdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocHJvcHMuaW5lcnQpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChcImJsb2NrLWludGVyYWN0aXZpdHktXCIuY29uY2F0KGlkKSk7XG4gICAgICAgICAgICB2YXIgYWxsb3dfMSA9IF9fc3ByZWFkQXJyYXkoW3Byb3BzLmxvY2tSZWYuY3VycmVudF0sIChwcm9wcy5zaGFyZHMgfHwgW10pLm1hcChleHRyYWN0UmVmKSwgdHJ1ZSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICAgICAgYWxsb3dfMS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuY2xhc3NMaXN0LmFkZChcImFsbG93LWludGVyYWN0aXZpdHktXCIuY29uY2F0KGlkKSk7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoXCJibG9jay1pbnRlcmFjdGl2aXR5LVwiLmNvbmNhdChpZCkpO1xuICAgICAgICAgICAgICAgIGFsbG93XzEuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5yZW1vdmUoXCJhbGxvdy1pbnRlcmFjdGl2aXR5LVwiLmNvbmNhdChpZCkpOyB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH0sIFtwcm9wcy5pbmVydCwgcHJvcHMubG9ja1JlZi5jdXJyZW50LCBwcm9wcy5zaGFyZHNdKTtcbiAgICB2YXIgc2hvdWxkQ2FuY2VsRXZlbnQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQsIHBhcmVudCkge1xuICAgICAgICBpZiAoJ3RvdWNoZXMnIGluIGV2ZW50ICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gIWxhc3RQcm9wcy5jdXJyZW50LmFsbG93UGluY2hab29tO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0b3VjaCA9IGdldFRvdWNoWFkoZXZlbnQpO1xuICAgICAgICB2YXIgdG91Y2hTdGFydCA9IHRvdWNoU3RhcnRSZWYuY3VycmVudDtcbiAgICAgICAgdmFyIGRlbHRhWCA9ICdkZWx0YVgnIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFYIDogdG91Y2hTdGFydFswXSAtIHRvdWNoWzBdO1xuICAgICAgICB2YXIgZGVsdGFZID0gJ2RlbHRhWScgaW4gZXZlbnQgPyBldmVudC5kZWx0YVkgOiB0b3VjaFN0YXJ0WzFdIC0gdG91Y2hbMV07XG4gICAgICAgIHZhciBjdXJyZW50QXhpcztcbiAgICAgICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgdmFyIG1vdmVEaXJlY3Rpb24gPSBNYXRoLmFicyhkZWx0YVgpID4gTWF0aC5hYnMoZGVsdGFZKSA/ICdoJyA6ICd2JztcbiAgICAgICAgLy8gYWxsb3cgaG9yaXpvbnRhbCB0b3VjaCBtb3ZlIG9uIFJhbmdlIGlucHV0cy4gVGhleSB3aWxsIG5vdCBjYXVzZSBhbnkgc2Nyb2xsXG4gICAgICAgIGlmICgndG91Y2hlcycgaW4gZXZlbnQgJiYgbW92ZURpcmVjdGlvbiA9PT0gJ2gnICYmIHRhcmdldC50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhbkJlU2Nyb2xsZWRJbk1haW5EaXJlY3Rpb24gPSBsb2NhdGlvbkNvdWxkQmVTY3JvbGxlZChtb3ZlRGlyZWN0aW9uLCB0YXJnZXQpO1xuICAgICAgICBpZiAoIWNhbkJlU2Nyb2xsZWRJbk1haW5EaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYW5CZVNjcm9sbGVkSW5NYWluRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBjdXJyZW50QXhpcyA9IG1vdmVEaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50QXhpcyA9IG1vdmVEaXJlY3Rpb24gPT09ICd2JyA/ICdoJyA6ICd2JztcbiAgICAgICAgICAgIGNhbkJlU2Nyb2xsZWRJbk1haW5EaXJlY3Rpb24gPSBsb2NhdGlvbkNvdWxkQmVTY3JvbGxlZChtb3ZlRGlyZWN0aW9uLCB0YXJnZXQpO1xuICAgICAgICAgICAgLy8gb3RoZXIgYXhpcyBtaWdodCBiZSBub3Qgc2Nyb2xsYWJsZVxuICAgICAgICB9XG4gICAgICAgIGlmICghY2FuQmVTY3JvbGxlZEluTWFpbkRpcmVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWN0aXZlQXhpcy5jdXJyZW50ICYmICdjaGFuZ2VkVG91Y2hlcycgaW4gZXZlbnQgJiYgKGRlbHRhWCB8fCBkZWx0YVkpKSB7XG4gICAgICAgICAgICBhY3RpdmVBeGlzLmN1cnJlbnQgPSBjdXJyZW50QXhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWN1cnJlbnRBeGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FuY2VsaW5nQXhpcyA9IGFjdGl2ZUF4aXMuY3VycmVudCB8fCBjdXJyZW50QXhpcztcbiAgICAgICAgcmV0dXJuIGhhbmRsZVNjcm9sbChjYW5jZWxpbmdBeGlzLCBwYXJlbnQsIGV2ZW50LCBjYW5jZWxpbmdBeGlzID09PSAnaCcgPyBkZWx0YVggOiBkZWx0YVksIHRydWUpO1xuICAgIH0sIFtdKTtcbiAgICB2YXIgc2hvdWxkUHJldmVudCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChfZXZlbnQpIHtcbiAgICAgICAgdmFyIGV2ZW50ID0gX2V2ZW50O1xuICAgICAgICBpZiAoIWxvY2tTdGFjay5sZW5ndGggfHwgbG9ja1N0YWNrW2xvY2tTdGFjay5sZW5ndGggLSAxXSAhPT0gU3R5bGUpIHtcbiAgICAgICAgICAgIC8vIG5vdCB0aGUgbGFzdCBhY3RpdmVcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsdGEgPSAnZGVsdGFZJyBpbiBldmVudCA/IGdldERlbHRhWFkoZXZlbnQpIDogZ2V0VG91Y2hYWShldmVudCk7XG4gICAgICAgIHZhciBzb3VyY2VFdmVudCA9IHNob3VsZFByZXZlbnRRdWV1ZS5jdXJyZW50LmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5uYW1lID09PSBldmVudC50eXBlICYmIChlLnRhcmdldCA9PT0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnRhcmdldCA9PT0gZS5zaGFkb3dQYXJlbnQpICYmIGRlbHRhQ29tcGFyZShlLmRlbHRhLCBkZWx0YSk7IH0pWzBdO1xuICAgICAgICAvLyBzZWxmIGV2ZW50LCBhbmQgc2hvdWxkIGJlIGNhbmNlbGVkXG4gICAgICAgIGlmIChzb3VyY2VFdmVudCAmJiBzb3VyY2VFdmVudC5zaG91bGQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdXRzaWRlIG9yIHNoYXJkIGV2ZW50XG4gICAgICAgIGlmICghc291cmNlRXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBzaGFyZE5vZGVzID0gKGxhc3RQcm9wcy5jdXJyZW50LnNoYXJkcyB8fCBbXSlcbiAgICAgICAgICAgICAgICAubWFwKGV4dHJhY3RSZWYpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUuY29udGFpbnMoZXZlbnQudGFyZ2V0KTsgfSk7XG4gICAgICAgICAgICB2YXIgc2hvdWxkU3RvcCA9IHNoYXJkTm9kZXMubGVuZ3RoID4gMCA/IHNob3VsZENhbmNlbEV2ZW50KGV2ZW50LCBzaGFyZE5vZGVzWzBdKSA6ICFsYXN0UHJvcHMuY3VycmVudC5ub0lzb2xhdGlvbjtcbiAgICAgICAgICAgIGlmIChzaG91bGRTdG9wKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgdmFyIHNob3VsZENhbmNlbCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChuYW1lLCBkZWx0YSwgdGFyZ2V0LCBzaG91bGQpIHtcbiAgICAgICAgdmFyIGV2ZW50ID0geyBuYW1lOiBuYW1lLCBkZWx0YTogZGVsdGEsIHRhcmdldDogdGFyZ2V0LCBzaG91bGQ6IHNob3VsZCwgc2hhZG93UGFyZW50OiBnZXRPdXRlcm1vc3RTaGFkb3dQYXJlbnQodGFyZ2V0KSB9O1xuICAgICAgICBzaG91bGRQcmV2ZW50UXVldWUuY3VycmVudC5wdXNoKGV2ZW50KTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzaG91bGRQcmV2ZW50UXVldWUuY3VycmVudCA9IHNob3VsZFByZXZlbnRRdWV1ZS5jdXJyZW50LmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSAhPT0gZXZlbnQ7IH0pO1xuICAgICAgICB9LCAxKTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIHNjcm9sbFRvdWNoU3RhcnQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdG91Y2hTdGFydFJlZi5jdXJyZW50ID0gZ2V0VG91Y2hYWShldmVudCk7XG4gICAgICAgIGFjdGl2ZUF4aXMuY3VycmVudCA9IHVuZGVmaW5lZDtcbiAgICB9LCBbXSk7XG4gICAgdmFyIHNjcm9sbFdoZWVsID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHNob3VsZENhbmNlbChldmVudC50eXBlLCBnZXREZWx0YVhZKGV2ZW50KSwgZXZlbnQudGFyZ2V0LCBzaG91bGRDYW5jZWxFdmVudChldmVudCwgcHJvcHMubG9ja1JlZi5jdXJyZW50KSk7XG4gICAgfSwgW10pO1xuICAgIHZhciBzY3JvbGxUb3VjaE1vdmUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc2hvdWxkQ2FuY2VsKGV2ZW50LnR5cGUsIGdldFRvdWNoWFkoZXZlbnQpLCBldmVudC50YXJnZXQsIHNob3VsZENhbmNlbEV2ZW50KGV2ZW50LCBwcm9wcy5sb2NrUmVmLmN1cnJlbnQpKTtcbiAgICB9LCBbXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbG9ja1N0YWNrLnB1c2goU3R5bGUpO1xuICAgICAgICBwcm9wcy5zZXRDYWxsYmFja3Moe1xuICAgICAgICAgICAgb25TY3JvbGxDYXB0dXJlOiBzY3JvbGxXaGVlbCxcbiAgICAgICAgICAgIG9uV2hlZWxDYXB0dXJlOiBzY3JvbGxXaGVlbCxcbiAgICAgICAgICAgIG9uVG91Y2hNb3ZlQ2FwdHVyZTogc2Nyb2xsVG91Y2hNb3ZlLFxuICAgICAgICB9KTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBzaG91bGRQcmV2ZW50LCBub25QYXNzaXZlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgc2hvdWxkUHJldmVudCwgbm9uUGFzc2l2ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBzY3JvbGxUb3VjaFN0YXJ0LCBub25QYXNzaXZlKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxvY2tTdGFjayA9IGxvY2tTdGFjay5maWx0ZXIoZnVuY3Rpb24gKGluc3QpIHsgcmV0dXJuIGluc3QgIT09IFN0eWxlOyB9KTtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgc2hvdWxkUHJldmVudCwgbm9uUGFzc2l2ZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBzaG91bGRQcmV2ZW50LCBub25QYXNzaXZlKTtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBzY3JvbGxUb3VjaFN0YXJ0LCBub25QYXNzaXZlKTtcbiAgICAgICAgfTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIHJlbW92ZVNjcm9sbEJhciA9IHByb3BzLnJlbW92ZVNjcm9sbEJhciwgaW5lcnQgPSBwcm9wcy5pbmVydDtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgIGluZXJ0ID8gUmVhY3QuY3JlYXRlRWxlbWVudChTdHlsZSwgeyBzdHlsZXM6IGdlbmVyYXRlU3R5bGUoaWQpIH0pIDogbnVsbCxcbiAgICAgICAgcmVtb3ZlU2Nyb2xsQmFyID8gUmVhY3QuY3JlYXRlRWxlbWVudChSZW1vdmVTY3JvbGxCYXIsIHsgZ2FwTW9kZTogcHJvcHMuZ2FwTW9kZSB9KSA6IG51bGwpKTtcbn1cbmZ1bmN0aW9uIGdldE91dGVybW9zdFNoYWRvd1BhcmVudChub2RlKSB7XG4gICAgdmFyIHNoYWRvd1BhcmVudCA9IG51bGw7XG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgICBzaGFkb3dQYXJlbnQgPSBub2RlLmhvc3Q7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3dQYXJlbnQ7XG59XG4iLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmdWxsV2lkdGhDbGFzc05hbWUsIHplcm9SaWdodENsYXNzTmFtZSB9IGZyb20gJ3JlYWN0LXJlbW92ZS1zY3JvbGwtYmFyL2NvbnN0YW50cyc7XG5pbXBvcnQgeyB1c2VNZXJnZVJlZnMgfSBmcm9tICd1c2UtY2FsbGJhY2stcmVmJztcbmltcG9ydCB7IGVmZmVjdENhciB9IGZyb20gJy4vbWVkaXVtJztcbnZhciBub3RoaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybjtcbn07XG4vKipcbiAqIFJlbW92ZXMgc2Nyb2xsYmFyIGZyb20gdGhlIHBhZ2UgYW5kIGNvbnRhaW4gdGhlIHNjcm9sbCB3aXRoaW4gdGhlIExvY2tcbiAqL1xudmFyIFJlbW92ZVNjcm9sbCA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCBwYXJlbnRSZWYpIHtcbiAgICB2YXIgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIHZhciBfYSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICAgICAgb25TY3JvbGxDYXB0dXJlOiBub3RoaW5nLFxuICAgICAgICBvbldoZWVsQ2FwdHVyZTogbm90aGluZyxcbiAgICAgICAgb25Ub3VjaE1vdmVDYXB0dXJlOiBub3RoaW5nLFxuICAgIH0pLCBjYWxsYmFja3MgPSBfYVswXSwgc2V0Q2FsbGJhY2tzID0gX2FbMV07XG4gICAgdmFyIGZvcndhcmRQcm9wcyA9IHByb3BzLmZvcndhcmRQcm9wcywgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbiwgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLCByZW1vdmVTY3JvbGxCYXIgPSBwcm9wcy5yZW1vdmVTY3JvbGxCYXIsIGVuYWJsZWQgPSBwcm9wcy5lbmFibGVkLCBzaGFyZHMgPSBwcm9wcy5zaGFyZHMsIHNpZGVDYXIgPSBwcm9wcy5zaWRlQ2FyLCBub0lzb2xhdGlvbiA9IHByb3BzLm5vSXNvbGF0aW9uLCBpbmVydCA9IHByb3BzLmluZXJ0LCBhbGxvd1BpbmNoWm9vbSA9IHByb3BzLmFsbG93UGluY2hab29tLCBfYiA9IHByb3BzLmFzLCBDb250YWluZXIgPSBfYiA9PT0gdm9pZCAwID8gJ2RpdicgOiBfYiwgZ2FwTW9kZSA9IHByb3BzLmdhcE1vZGUsIHJlc3QgPSBfX3Jlc3QocHJvcHMsIFtcImZvcndhcmRQcm9wc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwicmVtb3ZlU2Nyb2xsQmFyXCIsIFwiZW5hYmxlZFwiLCBcInNoYXJkc1wiLCBcInNpZGVDYXJcIiwgXCJub0lzb2xhdGlvblwiLCBcImluZXJ0XCIsIFwiYWxsb3dQaW5jaFpvb21cIiwgXCJhc1wiLCBcImdhcE1vZGVcIl0pO1xuICAgIHZhciBTaWRlQ2FyID0gc2lkZUNhcjtcbiAgICB2YXIgY29udGFpbmVyUmVmID0gdXNlTWVyZ2VSZWZzKFtyZWYsIHBhcmVudFJlZl0pO1xuICAgIHZhciBjb250YWluZXJQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXN0KSwgY2FsbGJhY2tzKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgIGVuYWJsZWQgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2lkZUNhciwgeyBzaWRlQ2FyOiBlZmZlY3RDYXIsIHJlbW92ZVNjcm9sbEJhcjogcmVtb3ZlU2Nyb2xsQmFyLCBzaGFyZHM6IHNoYXJkcywgbm9Jc29sYXRpb246IG5vSXNvbGF0aW9uLCBpbmVydDogaW5lcnQsIHNldENhbGxiYWNrczogc2V0Q2FsbGJhY2tzLCBhbGxvd1BpbmNoWm9vbTogISFhbGxvd1BpbmNoWm9vbSwgbG9ja1JlZjogcmVmLCBnYXBNb2RlOiBnYXBNb2RlIH0pKSxcbiAgICAgICAgZm9yd2FyZFByb3BzID8gKFJlYWN0LmNsb25lRWxlbWVudChSZWFjdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbnRhaW5lclByb3BzKSwgeyByZWY6IGNvbnRhaW5lclJlZiB9KSkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGFpbmVyLCBfX2Fzc2lnbih7fSwgY29udGFpbmVyUHJvcHMsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWUsIHJlZjogY29udGFpbmVyUmVmIH0pLCBjaGlsZHJlbikpKSk7XG59KTtcblJlbW92ZVNjcm9sbC5kZWZhdWx0UHJvcHMgPSB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICByZW1vdmVTY3JvbGxCYXI6IHRydWUsXG4gICAgaW5lcnQ6IGZhbHNlLFxufTtcblJlbW92ZVNjcm9sbC5jbGFzc05hbWVzID0ge1xuICAgIGZ1bGxXaWR0aDogZnVsbFdpZHRoQ2xhc3NOYW1lLFxuICAgIHplcm9SaWdodDogemVyb1JpZ2h0Q2xhc3NOYW1lLFxufTtcbmV4cG9ydCB7IFJlbW92ZVNjcm9sbCB9O1xuIiwidmFyIHBhc3NpdmVTdXBwb3J0ZWQgPSBmYWxzZTtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHBhc3NpdmVTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHBhc3NpdmVTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG59XG5leHBvcnQgdmFyIG5vblBhc3NpdmUgPSBwYXNzaXZlU3VwcG9ydGVkID8geyBwYXNzaXZlOiBmYWxzZSB9IDogZmFsc2U7XG4iLCJ2YXIgYWx3YXlzQ29udGFpbnNTY3JvbGwgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIC8vIHRleHRhcmVhIHdpbGwgYWx3YXlzIF9jb250YWluXyBzY3JvbGwgaW5zaWRlIHNlbGYuIEl0IG9ubHkgY2FuIGJlIGhpZGRlblxuICAgIHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdURVhUQVJFQSc7XG59O1xudmFyIGVsZW1lbnRDYW5CZVNjcm9sbGVkID0gZnVuY3Rpb24gKG5vZGUsIG92ZXJmbG93KSB7XG4gICAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgIHJldHVybiAoXG4gICAgLy8gbm90LW5vdC1zY3JvbGxhYmxlXG4gICAgc3R5bGVzW292ZXJmbG93XSAhPT0gJ2hpZGRlbicgJiZcbiAgICAgICAgLy8gY29udGFpbnMgc2Nyb2xsIGluc2lkZSBzZWxmXG4gICAgICAgICEoc3R5bGVzLm92ZXJmbG93WSA9PT0gc3R5bGVzLm92ZXJmbG93WCAmJiAhYWx3YXlzQ29udGFpbnNTY3JvbGwobm9kZSkgJiYgc3R5bGVzW292ZXJmbG93XSA9PT0gJ3Zpc2libGUnKSk7XG59O1xudmFyIGVsZW1lbnRDb3VsZEJlVlNjcm9sbGVkID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIGVsZW1lbnRDYW5CZVNjcm9sbGVkKG5vZGUsICdvdmVyZmxvd1knKTsgfTtcbnZhciBlbGVtZW50Q291bGRCZUhTY3JvbGxlZCA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBlbGVtZW50Q2FuQmVTY3JvbGxlZChub2RlLCAnb3ZlcmZsb3dYJyk7IH07XG5leHBvcnQgdmFyIGxvY2F0aW9uQ291bGRCZVNjcm9sbGVkID0gZnVuY3Rpb24gKGF4aXMsIG5vZGUpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICB2YXIgY3VycmVudCA9IG5vZGU7XG4gICAgZG8ge1xuICAgICAgICAvLyBTa2lwIG92ZXIgc2hhZG93IHJvb3RcbiAgICAgICAgaWYgKHR5cGVvZiBTaGFkb3dSb290ICE9PSAndW5kZWZpbmVkJyAmJiBjdXJyZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaXNTY3JvbGxhYmxlID0gZWxlbWVudENvdWxkQmVTY3JvbGxlZChheGlzLCBjdXJyZW50KTtcbiAgICAgICAgaWYgKGlzU2Nyb2xsYWJsZSkge1xuICAgICAgICAgICAgdmFyIF9hID0gZ2V0U2Nyb2xsVmFyaWFibGVzKGF4aXMsIGN1cnJlbnQpLCBzID0gX2FbMV0sIGQgPSBfYVsyXTtcbiAgICAgICAgICAgIGlmIChzID4gZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudE5vZGU7XG4gICAgfSB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBvd25lckRvY3VtZW50LmJvZHkpO1xuICAgIHJldHVybiBmYWxzZTtcbn07XG52YXIgZ2V0VlNjcm9sbFZhcmlhYmxlcyA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBzY3JvbGxUb3AgPSBfYS5zY3JvbGxUb3AsIHNjcm9sbEhlaWdodCA9IF9hLnNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0ID0gX2EuY2xpZW50SGVpZ2h0O1xuICAgIHJldHVybiBbXG4gICAgICAgIHNjcm9sbFRvcCxcbiAgICAgICAgc2Nyb2xsSGVpZ2h0LFxuICAgICAgICBjbGllbnRIZWlnaHQsXG4gICAgXTtcbn07XG52YXIgZ2V0SFNjcm9sbFZhcmlhYmxlcyA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBzY3JvbGxMZWZ0ID0gX2Euc2Nyb2xsTGVmdCwgc2Nyb2xsV2lkdGggPSBfYS5zY3JvbGxXaWR0aCwgY2xpZW50V2lkdGggPSBfYS5jbGllbnRXaWR0aDtcbiAgICByZXR1cm4gW1xuICAgICAgICBzY3JvbGxMZWZ0LFxuICAgICAgICBzY3JvbGxXaWR0aCxcbiAgICAgICAgY2xpZW50V2lkdGgsXG4gICAgXTtcbn07XG52YXIgZWxlbWVudENvdWxkQmVTY3JvbGxlZCA9IGZ1bmN0aW9uIChheGlzLCBub2RlKSB7XG4gICAgcmV0dXJuIGF4aXMgPT09ICd2JyA/IGVsZW1lbnRDb3VsZEJlVlNjcm9sbGVkKG5vZGUpIDogZWxlbWVudENvdWxkQmVIU2Nyb2xsZWQobm9kZSk7XG59O1xudmFyIGdldFNjcm9sbFZhcmlhYmxlcyA9IGZ1bmN0aW9uIChheGlzLCBub2RlKSB7XG4gICAgcmV0dXJuIGF4aXMgPT09ICd2JyA/IGdldFZTY3JvbGxWYXJpYWJsZXMobm9kZSkgOiBnZXRIU2Nyb2xsVmFyaWFibGVzKG5vZGUpO1xufTtcbnZhciBnZXREaXJlY3Rpb25GYWN0b3IgPSBmdW5jdGlvbiAoYXhpcywgZGlyZWN0aW9uKSB7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVsZW1lbnQncyBkaXJlY3Rpb24gaXMgcnRsIChyaWdodC10by1sZWZ0KSwgdGhlbiBzY3JvbGxMZWZ0IGlzIDAgd2hlbiB0aGUgc2Nyb2xsYmFyIGlzIGF0IGl0cyByaWdodG1vc3QgcG9zaXRpb24sXG4gICAgICogYW5kIHRoZW4gaW5jcmVhc2luZ2x5IG5lZ2F0aXZlIGFzIHlvdSBzY3JvbGwgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBjb250ZW50LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvc2Nyb2xsTGVmdFxuICAgICAqL1xuICAgIHJldHVybiBheGlzID09PSAnaCcgJiYgZGlyZWN0aW9uID09PSAncnRsJyA/IC0xIDogMTtcbn07XG5leHBvcnQgdmFyIGhhbmRsZVNjcm9sbCA9IGZ1bmN0aW9uIChheGlzLCBlbmRUYXJnZXQsIGV2ZW50LCBzb3VyY2VEZWx0YSwgbm9PdmVyc2Nyb2xsKSB7XG4gICAgdmFyIGRpcmVjdGlvbkZhY3RvciA9IGdldERpcmVjdGlvbkZhY3RvcihheGlzLCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbmRUYXJnZXQpLmRpcmVjdGlvbik7XG4gICAgdmFyIGRlbHRhID0gZGlyZWN0aW9uRmFjdG9yICogc291cmNlRGVsdGE7XG4gICAgLy8gZmluZCBzY3JvbGxhYmxlIHRhcmdldFxuICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgdmFyIHRhcmdldEluTG9jayA9IGVuZFRhcmdldC5jb250YWlucyh0YXJnZXQpO1xuICAgIHZhciBzaG91bGRDYW5jZWxTY3JvbGwgPSBmYWxzZTtcbiAgICB2YXIgaXNEZWx0YVBvc2l0aXZlID0gZGVsdGEgPiAwO1xuICAgIHZhciBhdmFpbGFibGVTY3JvbGwgPSAwO1xuICAgIHZhciBhdmFpbGFibGVTY3JvbGxUb3AgPSAwO1xuICAgIGRvIHtcbiAgICAgICAgdmFyIF9hID0gZ2V0U2Nyb2xsVmFyaWFibGVzKGF4aXMsIHRhcmdldCksIHBvc2l0aW9uID0gX2FbMF0sIHNjcm9sbF8xID0gX2FbMV0sIGNhcGFjaXR5ID0gX2FbMl07XG4gICAgICAgIHZhciBlbGVtZW50U2Nyb2xsID0gc2Nyb2xsXzEgLSBjYXBhY2l0eSAtIGRpcmVjdGlvbkZhY3RvciAqIHBvc2l0aW9uO1xuICAgICAgICBpZiAocG9zaXRpb24gfHwgZWxlbWVudFNjcm9sbCkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRDb3VsZEJlU2Nyb2xsZWQoYXhpcywgdGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVNjcm9sbCArPSBlbGVtZW50U2Nyb2xsO1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVNjcm9sbFRvcCArPSBwb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0Lmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKFxuICAgIC8vIHBvcnRhbGVkIGNvbnRlbnRcbiAgICAoIXRhcmdldEluTG9jayAmJiB0YXJnZXQgIT09IGRvY3VtZW50LmJvZHkpIHx8XG4gICAgICAgIC8vIHNlbGYgY29udGVudFxuICAgICAgICAodGFyZ2V0SW5Mb2NrICYmIChlbmRUYXJnZXQuY29udGFpbnModGFyZ2V0KSB8fCBlbmRUYXJnZXQgPT09IHRhcmdldCkpKTtcbiAgICAvLyBoYW5kbGUgZXBzaWxvbiBhcm91bmQgMCAobm9uIHN0YW5kYXJkIHpvb20gbGV2ZWxzKVxuICAgIGlmIChpc0RlbHRhUG9zaXRpdmUgJiZcbiAgICAgICAgKChub092ZXJzY3JvbGwgJiYgTWF0aC5hYnMoYXZhaWxhYmxlU2Nyb2xsKSA8IDEpIHx8ICghbm9PdmVyc2Nyb2xsICYmIGRlbHRhID4gYXZhaWxhYmxlU2Nyb2xsKSkpIHtcbiAgICAgICAgc2hvdWxkQ2FuY2VsU2Nyb2xsID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWlzRGVsdGFQb3NpdGl2ZSAmJlxuICAgICAgICAoKG5vT3ZlcnNjcm9sbCAmJiBNYXRoLmFicyhhdmFpbGFibGVTY3JvbGxUb3ApIDwgMSkgfHwgKCFub092ZXJzY3JvbGwgJiYgLWRlbHRhID4gYXZhaWxhYmxlU2Nyb2xsVG9wKSkpIHtcbiAgICAgICAgc2hvdWxkQ2FuY2VsU2Nyb2xsID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNob3VsZENhbmNlbFNjcm9sbDtcbn07XG4iLCJpbXBvcnQgeyBjcmVhdGVTaWRlY2FyTWVkaXVtIH0gZnJvbSAndXNlLXNpZGVjYXInO1xuZXhwb3J0IHZhciBlZmZlY3RDYXIgPSBjcmVhdGVTaWRlY2FyTWVkaXVtKCk7XG4iLCJpbXBvcnQgeyBleHBvcnRTaWRlY2FyIH0gZnJvbSAndXNlLXNpZGVjYXInO1xuaW1wb3J0IHsgUmVtb3ZlU2Nyb2xsU2lkZUNhciB9IGZyb20gJy4vU2lkZUVmZmVjdCc7XG5pbXBvcnQgeyBlZmZlY3RDYXIgfSBmcm9tICcuL21lZGl1bSc7XG5leHBvcnQgZGVmYXVsdCBleHBvcnRTaWRlY2FyKGVmZmVjdENhciwgUmVtb3ZlU2Nyb2xsU2lkZUNhcik7XG4iLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBQdXJlQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IERyYWdnYWJsZSBmcm9tICdyZWFjdC1kcmFnZ2FibGUnO1xuaW1wb3J0IHsgUmVzaXphYmxlIH0gZnJvbSAncmUtcmVzaXphYmxlJztcbmltcG9ydCB7IGZsdXNoU3luYyB9IGZyb20gJ3JlYWN0LWRvbSc7XG5cbi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXHJcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcblxyXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXHJcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcclxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cclxuXHJcblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xyXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbnZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cblxudmFyIHJlc2l6YWJsZVN0eWxlID0ge1xuICAgIHdpZHRoOiBcImF1dG9cIixcbiAgICBoZWlnaHQ6IFwiYXV0b1wiLFxuICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICB0b3A6IDAsXG4gICAgbGVmdDogMCxcbn07XG52YXIgZ2V0RW5hYmxlUmVzaXppbmdCeUZsYWcgPSBmdW5jdGlvbiAoZmxhZykgeyByZXR1cm4gKHtcbiAgICBib3R0b206IGZsYWcsXG4gICAgYm90dG9tTGVmdDogZmxhZyxcbiAgICBib3R0b21SaWdodDogZmxhZyxcbiAgICBsZWZ0OiBmbGFnLFxuICAgIHJpZ2h0OiBmbGFnLFxuICAgIHRvcDogZmxhZyxcbiAgICB0b3BMZWZ0OiBmbGFnLFxuICAgIHRvcFJpZ2h0OiBmbGFnLFxufSk7IH07XG52YXIgUm5kID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSbmQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUm5kKHByb3BzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5yZXNpemluZ1Bvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIF90aGlzLm9mZnNldEZyb21QYXJlbnQgPSB7IGxlZnQ6IDAsIHRvcDogMCB9O1xuICAgICAgICBfdGhpcy5yZXNpemFibGVFbGVtZW50ID0geyBjdXJyZW50OiBudWxsIH07XG4gICAgICAgIF90aGlzLm9yaWdpbmFsUG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICByZXNpemluZzogZmFsc2UsXG4gICAgICAgICAgICBib3VuZHM6IHtcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWF4V2lkdGg6IHByb3BzLm1heFdpZHRoLFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiBwcm9wcy5tYXhIZWlnaHQsXG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLm9uUmVzaXplU3RhcnQgPSBfdGhpcy5vblJlc2l6ZVN0YXJ0LmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5vblJlc2l6ZSA9IF90aGlzLm9uUmVzaXplLmJpbmQoX3RoaXMpO1xuICAgICAgICBfdGhpcy5vblJlc2l6ZVN0b3AgPSBfdGhpcy5vblJlc2l6ZVN0b3AuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uRHJhZ1N0YXJ0ID0gX3RoaXMub25EcmFnU3RhcnQuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLm9uRHJhZyA9IF90aGlzLm9uRHJhZy5iaW5kKF90aGlzKTtcbiAgICAgICAgX3RoaXMub25EcmFnU3RvcCA9IF90aGlzLm9uRHJhZ1N0b3AuYmluZChfdGhpcyk7XG4gICAgICAgIF90aGlzLmdldE1heFNpemVzRnJvbVByb3BzID0gX3RoaXMuZ2V0TWF4U2l6ZXNGcm9tUHJvcHMuYmluZChfdGhpcyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUm5kLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVPZmZzZXRGcm9tUGFyZW50KCk7XG4gICAgICAgIHZhciBfYSA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudCwgbGVmdCA9IF9hLmxlZnQsIHRvcCA9IF9hLnRvcDtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5nZXREcmFnZ2FibGVQb3NpdGlvbigpLCB4ID0gX2IueCwgeSA9IF9iLnk7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHg6IHggLSBsZWZ0LFxuICAgICAgICAgICAgeTogeSAtIHRvcCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEhBQ0s6IEFwcGx5IHBvc2l0aW9uIGFkanVzdG1lbnRcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH07XG4gICAgLy8gSEFDSzogVG8gZ2V0IGByZWFjdC1kcmFnZ2FibGVgIHN0YXRlIHggYW5kIHkuXG4gICAgUm5kLnByb3RvdHlwZS5nZXREcmFnZ2FibGVQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5kcmFnZ2FibGUuc3RhdGUsIHggPSBfYS54LCB5ID0gX2EueTtcbiAgICAgICAgcmV0dXJuIHsgeDogeCwgeTogeSB9O1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5nZXRQYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6YWJsZSAmJiB0aGlzLnJlc2l6YWJsZS5wYXJlbnROb2RlO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5nZXRQYXJlbnRTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemFibGUuZ2V0UGFyZW50U2l6ZSgpO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5nZXRNYXhTaXplc0Zyb21Qcm9wcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1heFdpZHRoID0gdHlwZW9mIHRoaXMucHJvcHMubWF4V2lkdGggPT09IFwidW5kZWZpbmVkXCIgPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IHRoaXMucHJvcHMubWF4V2lkdGg7XG4gICAgICAgIHZhciBtYXhIZWlnaHQgPSB0eXBlb2YgdGhpcy5wcm9wcy5tYXhIZWlnaHQgPT09IFwidW5kZWZpbmVkXCIgPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IHRoaXMucHJvcHMubWF4SGVpZ2h0O1xuICAgICAgICByZXR1cm4geyBtYXhXaWR0aDogbWF4V2lkdGgsIG1heEhlaWdodDogbWF4SGVpZ2h0IH07XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLmdldFNlbGZFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemFibGUgJiYgdGhpcy5yZXNpemFibGUucmVzaXphYmxlO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5nZXRPZmZzZXRIZWlnaHQgPSBmdW5jdGlvbiAoYm91bmRhcnkpIHtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5wcm9wcy5zY2FsZTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnByb3BzLmJvdW5kcykge1xuICAgICAgICAgICAgY2FzZSBcIndpbmRvd1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQgLyBzY2FsZTtcbiAgICAgICAgICAgIGNhc2UgXCJib2R5XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0IC8gc2NhbGU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBib3VuZGFyeS5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUuZ2V0T2Zmc2V0V2lkdGggPSBmdW5jdGlvbiAoYm91bmRhcnkpIHtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5wcm9wcy5zY2FsZTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnByb3BzLmJvdW5kcykge1xuICAgICAgICAgICAgY2FzZSBcIndpbmRvd1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCAvIHNjYWxlO1xuICAgICAgICAgICAgY2FzZSBcImJvZHlcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCAvIHNjYWxlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYm91bmRhcnkub2Zmc2V0V2lkdGg7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUub25EcmFnU3RhcnQgPSBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkRyYWdTdGFydCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkRyYWdTdGFydChlLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcG9zID0gdGhpcy5nZXREcmFnZ2FibGVQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLm9yaWdpbmFsUG9zaXRpb24gPSBwb3M7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5ib3VuZHMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICB2YXIgc2NhbGUgPSB0aGlzLnByb3BzLnNjYWxlO1xuICAgICAgICB2YXIgYm91bmRhcnk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJwYXJlbnRcIikge1xuICAgICAgICAgICAgYm91bmRhcnkgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwiYm9keVwiKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50UmVjdF8xID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdmFyIHBhcmVudExlZnRfMSA9IHBhcmVudFJlY3RfMS5sZWZ0O1xuICAgICAgICAgICAgdmFyIHBhcmVudFRvcF8xID0gcGFyZW50UmVjdF8xLnRvcDtcbiAgICAgICAgICAgIHZhciBib2R5UmVjdCA9IGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB2YXIgbGVmdF8xID0gLShwYXJlbnRMZWZ0XzEgLSBwYXJlbnQub2Zmc2V0TGVmdCAqIHNjYWxlIC0gYm9keVJlY3QubGVmdCkgLyBzY2FsZTtcbiAgICAgICAgICAgIHZhciB0b3BfMSA9IC0ocGFyZW50VG9wXzEgLSBwYXJlbnQub2Zmc2V0VG9wICogc2NhbGUgLSBib2R5UmVjdC50b3ApIC8gc2NhbGU7XG4gICAgICAgICAgICB2YXIgcmlnaHQgPSAoZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCAtIHRoaXMucmVzaXphYmxlLnNpemUud2lkdGggKiBzY2FsZSkgLyBzY2FsZSArIGxlZnRfMTtcbiAgICAgICAgICAgIHZhciBib3R0b20gPSAoZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQgLSB0aGlzLnJlc2l6YWJsZS5zaXplLmhlaWdodCAqIHNjYWxlKSAvIHNjYWxlICsgdG9wXzE7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZSh7IGJvdW5kczogeyB0b3A6IHRvcF8xLCByaWdodDogcmlnaHQsIGJvdHRvbTogYm90dG9tLCBsZWZ0OiBsZWZ0XzEgfSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJ3aW5kb3dcIikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgcGFyZW50UmVjdF8yID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdmFyIHBhcmVudExlZnRfMiA9IHBhcmVudFJlY3RfMi5sZWZ0O1xuICAgICAgICAgICAgdmFyIHBhcmVudFRvcF8yID0gcGFyZW50UmVjdF8yLnRvcDtcbiAgICAgICAgICAgIHZhciBsZWZ0XzIgPSAtKHBhcmVudExlZnRfMiAtIHBhcmVudC5vZmZzZXRMZWZ0ICogc2NhbGUpIC8gc2NhbGU7XG4gICAgICAgICAgICB2YXIgdG9wXzIgPSAtKHBhcmVudFRvcF8yIC0gcGFyZW50Lm9mZnNldFRvcCAqIHNjYWxlKSAvIHNjYWxlO1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gKHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy5yZXNpemFibGUuc2l6ZS53aWR0aCAqIHNjYWxlKSAvIHNjYWxlICsgbGVmdF8yO1xuICAgICAgICAgICAgdmFyIGJvdHRvbSA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLnJlc2l6YWJsZS5zaXplLmhlaWdodCAqIHNjYWxlKSAvIHNjYWxlICsgdG9wXzI7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZSh7IGJvdW5kczogeyB0b3A6IHRvcF8yLCByaWdodDogcmlnaHQsIGJvdHRvbTogYm90dG9tLCBsZWZ0OiBsZWZ0XzIgfSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5ib3VuZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGJvdW5kYXJ5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnByb3BzLmJvdW5kcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgYm91bmRhcnkgPSB0aGlzLnByb3BzLmJvdW5kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShib3VuZGFyeSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBib3VuZGFyeVJlY3QgPSBib3VuZGFyeS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIGJvdW5kYXJ5TGVmdCA9IGJvdW5kYXJ5UmVjdC5sZWZ0O1xuICAgICAgICB2YXIgYm91bmRhcnlUb3AgPSBib3VuZGFyeVJlY3QudG9wO1xuICAgICAgICB2YXIgcGFyZW50UmVjdCA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIHBhcmVudExlZnQgPSBwYXJlbnRSZWN0LmxlZnQ7XG4gICAgICAgIHZhciBwYXJlbnRUb3AgPSBwYXJlbnRSZWN0LnRvcDtcbiAgICAgICAgdmFyIGxlZnQgPSAoYm91bmRhcnlMZWZ0IC0gcGFyZW50TGVmdCkgLyBzY2FsZTtcbiAgICAgICAgdmFyIHRvcCA9IGJvdW5kYXJ5VG9wIC0gcGFyZW50VG9wO1xuICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldEZyb21QYXJlbnQoKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudDtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBib3VuZHM6IHtcbiAgICAgICAgICAgICAgICB0b3A6IHRvcCAtIG9mZnNldC50b3AsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IGxlZnQgKyAoYm91bmRhcnkub2Zmc2V0V2lkdGggLSB0aGlzLnJlc2l6YWJsZS5zaXplLndpZHRoKSAtIG9mZnNldC5sZWZ0IC8gc2NhbGUsXG4gICAgICAgICAgICAgICAgYm90dG9tOiB0b3AgKyAoYm91bmRhcnkub2Zmc2V0SGVpZ2h0IC0gdGhpcy5yZXNpemFibGUuc2l6ZS5oZWlnaHQpIC0gb2Zmc2V0LnRvcCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBsZWZ0IC0gb2Zmc2V0LmxlZnQgLyBzY2FsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5vbkRyYWcgPSBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMub25EcmFnKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLm9mZnNldEZyb21QYXJlbnQsIGxlZnQgPSBfYS5sZWZ0LCB0b3AgPSBfYS50b3A7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5kcmFnQXhpcyB8fCB0aGlzLnByb3BzLmRyYWdBeGlzID09PSBcImJvdGhcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMub25EcmFnKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiBkYXRhLnggKyBsZWZ0LCB5OiBkYXRhLnkgKyB0b3AgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuZHJhZ0F4aXMgPT09IFwieFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vbkRyYWcoZSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRhdGEpLCB7IHg6IGRhdGEueCArIGxlZnQsIHk6IHRoaXMub3JpZ2luYWxQb3NpdGlvbi55ICsgdG9wLCBkZWx0YVk6IDAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuZHJhZ0F4aXMgPT09IFwieVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vbkRyYWcoZSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRhdGEpLCB7IHg6IHRoaXMub3JpZ2luYWxQb3NpdGlvbi54ICsgbGVmdCwgeTogZGF0YS55ICsgdG9wLCBkZWx0YVg6IDAgfSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLm9uRHJhZ1N0b3AgPSBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMub25EcmFnU3RvcClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5vZmZzZXRGcm9tUGFyZW50LCBsZWZ0ID0gX2EubGVmdCwgdG9wID0gX2EudG9wO1xuICAgICAgICBpZiAoIXRoaXMucHJvcHMuZHJhZ0F4aXMgfHwgdGhpcy5wcm9wcy5kcmFnQXhpcyA9PT0gXCJib3RoXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLm9uRHJhZ1N0b3AoZSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRhdGEpLCB7IHg6IGRhdGEueCArIGxlZnQsIHk6IGRhdGEueSArIHRvcCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5kcmFnQXhpcyA9PT0gXCJ4XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLm9uRHJhZ1N0b3AoZSwgX19hc3NpZ24oX19hc3NpZ24oe30sIGRhdGEpLCB7IHg6IGRhdGEueCArIGxlZnQsIHk6IHRoaXMub3JpZ2luYWxQb3NpdGlvbi55ICsgdG9wLCBkZWx0YVk6IDAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucHJvcHMuZHJhZ0F4aXMgPT09IFwieVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vbkRyYWdTdG9wKGUsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkYXRhKSwgeyB4OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueCArIGxlZnQsIHk6IGRhdGEueSArIHRvcCwgZGVsdGFYOiAwIH0pKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5vblJlc2l6ZVN0YXJ0ID0gZnVuY3Rpb24gKGUsIGRpciwgZWxlbWVudFJlZikge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHJlc2l6aW5nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHNjYWxlID0gdGhpcy5wcm9wcy5zY2FsZTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudDtcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuZ2V0RHJhZ2dhYmxlUG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5yZXNpemluZ1Bvc2l0aW9uID0geyB4OiBwb3MueCArIG9mZnNldC5sZWZ0LCB5OiBwb3MueSArIG9mZnNldC50b3AgfTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0gcG9zO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IHRoaXMuZ2V0UGFyZW50KCk7XG4gICAgICAgICAgICB2YXIgYm91bmRhcnkgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwicGFyZW50XCIpIHtcbiAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHBhcmVudF8xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwiYm9keVwiKSB7XG4gICAgICAgICAgICAgICAgYm91bmRhcnkgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9wcy5ib3VuZHMgPT09IFwid2luZG93XCIpIHtcbiAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHdpbmRvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnByb3BzLmJvdW5kcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BzLmJvdW5kcyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgYm91bmRhcnkgPSB0aGlzLnByb3BzLmJvdW5kcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzZWxmXzEgPSB0aGlzLmdldFNlbGZFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAoc2VsZl8xIGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICAgICAgICAgIChib3VuZGFyeSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IGJvdW5kYXJ5ID09PSB3aW5kb3cpICYmXG4gICAgICAgICAgICAgICAgcGFyZW50XzEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0TWF4U2l6ZXNGcm9tUHJvcHMoKSwgbWF4V2lkdGggPSBfYS5tYXhXaWR0aCwgbWF4SGVpZ2h0ID0gX2EubWF4SGVpZ2h0O1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTaXplID0gdGhpcy5nZXRQYXJlbnRTaXplKCk7XG4gICAgICAgICAgICAgICAgaWYgKG1heFdpZHRoICYmIHR5cGVvZiBtYXhXaWR0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF4V2lkdGguZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmF0aW8gPSBOdW1iZXIobWF4V2lkdGgucmVwbGFjZShcIiVcIiwgXCJcIikpIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggPSBwYXJlbnRTaXplLndpZHRoICogcmF0aW87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWF4V2lkdGguZW5kc1dpdGgoXCJweFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggPSBOdW1iZXIobWF4V2lkdGgucmVwbGFjZShcInB4XCIsIFwiXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWF4SGVpZ2h0ICYmIHR5cGVvZiBtYXhIZWlnaHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1heEhlaWdodC5lbmRzV2l0aChcIiVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYXRpbyA9IE51bWJlcihtYXhIZWlnaHQucmVwbGFjZShcIiVcIiwgXCJcIikpIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gcGFyZW50U2l6ZS5oZWlnaHQgKiByYXRpbztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXhIZWlnaHQuZW5kc1dpdGgoXCJweFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTnVtYmVyKG1heEhlaWdodC5yZXBsYWNlKFwicHhcIiwgXCJcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBzZWxmUmVjdCA9IHNlbGZfMS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZkxlZnQgPSBzZWxmUmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIHZhciBzZWxmVG9wID0gc2VsZlJlY3QudG9wO1xuICAgICAgICAgICAgICAgIHZhciBib3VuZGFyeVJlY3QgPSB0aGlzLnByb3BzLmJvdW5kcyA9PT0gXCJ3aW5kb3dcIiA/IHsgbGVmdDogMCwgdG9wOiAwIH0gOiBib3VuZGFyeS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICB2YXIgYm91bmRhcnlMZWZ0ID0gYm91bmRhcnlSZWN0LmxlZnQ7XG4gICAgICAgICAgICAgICAgdmFyIGJvdW5kYXJ5VG9wID0gYm91bmRhcnlSZWN0LnRvcDtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0V2lkdGggPSB0aGlzLmdldE9mZnNldFdpZHRoKGJvdW5kYXJ5KTtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gdGhpcy5nZXRPZmZzZXRIZWlnaHQoYm91bmRhcnkpO1xuICAgICAgICAgICAgICAgIHZhciBoYXNMZWZ0ID0gZGlyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoXCJsZWZ0XCIpO1xuICAgICAgICAgICAgICAgIHZhciBoYXNSaWdodCA9IGRpci50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFwicmlnaHRcIik7XG4gICAgICAgICAgICAgICAgdmFyIGhhc1RvcCA9IGRpci5zdGFydHNXaXRoKFwidG9wXCIpO1xuICAgICAgICAgICAgICAgIHZhciBoYXNCb3R0b20gPSBkaXIuc3RhcnRzV2l0aChcImJvdHRvbVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoKGhhc0xlZnQgfHwgaGFzVG9wKSAmJiB0aGlzLnJlc2l6YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4ID0gKHNlbGZMZWZ0IC0gYm91bmRhcnlMZWZ0KSAvIHNjYWxlICsgdGhpcy5yZXNpemFibGUuc2l6ZS53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG1heFdpZHRoOiBtYXggPiBOdW1iZXIobWF4V2lkdGgpID8gbWF4V2lkdGggOiBtYXggfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElORk86IFRvIHNldCBib3VuZHMgaW4gYGxvY2sgYXNwZWN0IHJhdGlvIHdpdGggYm91bmRzYCBjYXNlLiBTZWUgYWxzbyB0aGF0IHN0b3J5LlxuICAgICAgICAgICAgICAgIGlmIChoYXNSaWdodCB8fCAodGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW8gJiYgIWhhc0xlZnQgJiYgIWhhc1RvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IG9mZnNldFdpZHRoICsgKGJvdW5kYXJ5TGVmdCAtIHNlbGZMZWZ0KSAvIHNjYWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgbWF4V2lkdGg6IG1heCA+IE51bWJlcihtYXhXaWR0aCkgPyBtYXhXaWR0aCA6IG1heCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChoYXNUb3AgfHwgaGFzTGVmdCkgJiYgdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IChzZWxmVG9wIC0gYm91bmRhcnlUb3ApIC8gc2NhbGUgKyB0aGlzLnJlc2l6YWJsZS5zaXplLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG1heCA+IE51bWJlcihtYXhIZWlnaHQpID8gbWF4SGVpZ2h0IDogbWF4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSU5GTzogVG8gc2V0IGJvdW5kcyBpbiBgbG9jayBhc3BlY3QgcmF0aW8gd2l0aCBib3VuZHNgIGNhc2UuIFNlZSBhbHNvIHRoYXQgc3RvcnkuXG4gICAgICAgICAgICAgICAgaWYgKGhhc0JvdHRvbSB8fCAodGhpcy5wcm9wcy5sb2NrQXNwZWN0UmF0aW8gJiYgIWhhc1RvcCAmJiAhaGFzTGVmdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IG9mZnNldEhlaWdodCArIChib3VuZGFyeVRvcCAtIHNlbGZUb3ApIC8gc2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBtYXggPiBOdW1iZXIobWF4SGVpZ2h0KSA/IG1heEhlaWdodCA6IG1heCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IHRoaXMucHJvcHMubWF4V2lkdGgsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiB0aGlzLnByb3BzLm1heEhlaWdodCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uUmVzaXplU3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25SZXNpemVTdGFydChlLCBkaXIsIGVsZW1lbnRSZWYpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLm9uUmVzaXplID0gZnVuY3Rpb24gKGUsIGRpcmVjdGlvbiwgZWxlbWVudFJlZiwgZGVsdGEpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gSU5GTzogQXBwbHkgeCBhbmQgeSBwb3NpdGlvbiBhZGp1c3RtZW50cyBjYXVzZWQgYnkgcmVzaXppbmcgdG8gZHJhZ2dhYmxlXG4gICAgICAgIHZhciBuZXdQb3MgPSB7IHg6IHRoaXMub3JpZ2luYWxQb3NpdGlvbi54LCB5OiB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueSB9O1xuICAgICAgICB2YXIgbGVmdCA9IC1kZWx0YS53aWR0aDtcbiAgICAgICAgdmFyIHRvcCA9IC1kZWx0YS5oZWlnaHQ7XG4gICAgICAgIHZhciBkaXJlY3Rpb25zID0gW1widG9wXCIsIFwibGVmdFwiLCBcInRvcExlZnRcIiwgXCJib3R0b21MZWZ0XCIsIFwidG9wUmlnaHRcIl07XG4gICAgICAgIGlmIChkaXJlY3Rpb25zLmluY2x1ZGVzKGRpcmVjdGlvbikpIHtcbiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IFwiYm90dG9tTGVmdFwiKSB7XG4gICAgICAgICAgICAgICAgbmV3UG9zLnggKz0gbGVmdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gXCJ0b3BSaWdodFwiKSB7XG4gICAgICAgICAgICAgICAgbmV3UG9zLnkgKz0gdG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3UG9zLnggKz0gbGVmdDtcbiAgICAgICAgICAgICAgICBuZXdQb3MueSArPSB0b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRyYWdnYWJsZVN0YXRlID0gdGhpcy5kcmFnZ2FibGUuc3RhdGU7XG4gICAgICAgIGlmIChuZXdQb3MueCAhPT0gZHJhZ2dhYmxlU3RhdGUueCB8fCBuZXdQb3MueSAhPT0gZHJhZ2dhYmxlU3RhdGUueSkge1xuICAgICAgICAgICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnZ2FibGUuc2V0U3RhdGUobmV3UG9zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0RnJvbVBhcmVudCgpO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXRGcm9tUGFyZW50O1xuICAgICAgICB2YXIgeCA9IHRoaXMuZ2V0RHJhZ2dhYmxlUG9zaXRpb24oKS54ICsgb2Zmc2V0LmxlZnQ7XG4gICAgICAgIHZhciB5ID0gdGhpcy5nZXREcmFnZ2FibGVQb3NpdGlvbigpLnkgKyBvZmZzZXQudG9wO1xuICAgICAgICB0aGlzLnJlc2l6aW5nUG9zaXRpb24gPSB7IHg6IHgsIHk6IHkgfTtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLm9uUmVzaXplKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnByb3BzLm9uUmVzaXplKGUsIGRpcmVjdGlvbiwgZWxlbWVudFJlZiwgZGVsdGEsIHtcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5LFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJuZC5wcm90b3R5cGUub25SZXNpemVTdG9wID0gZnVuY3Rpb24gKGUsIGRpcmVjdGlvbiwgZWxlbWVudFJlZiwgZGVsdGEpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICByZXNpemluZzogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmdldE1heFNpemVzRnJvbVByb3BzKCksIG1heFdpZHRoID0gX2EubWF4V2lkdGgsIG1heEhlaWdodCA9IF9hLm1heEhlaWdodDtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG1heFdpZHRoOiBtYXhXaWR0aCwgbWF4SGVpZ2h0OiBtYXhIZWlnaHQgfSk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uUmVzaXplU3RvcCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vblJlc2l6ZVN0b3AoZSwgZGlyZWN0aW9uLCBlbGVtZW50UmVmLCBkZWx0YSwgdGhpcy5yZXNpemluZ1Bvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS51cGRhdGVTaXplID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc2l6YWJsZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5yZXNpemFibGUudXBkYXRlU2l6ZSh7IHdpZHRoOiBzaXplLndpZHRoLCBoZWlnaHQ6IHNpemUuaGVpZ2h0IH0pO1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbiA9IGZ1bmN0aW9uIChwb3NpdGlvbikge1xuICAgICAgICB0aGlzLmRyYWdnYWJsZS5zZXRTdGF0ZShwb3NpdGlvbik7XG4gICAgfTtcbiAgICBSbmQucHJvdG90eXBlLnVwZGF0ZU9mZnNldEZyb21QYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzY2FsZSA9IHRoaXMucHJvcHMuc2NhbGU7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXMuZ2V0U2VsZkVsZW1lbnQoKTtcbiAgICAgICAgaWYgKCFwYXJlbnQgfHwgc2VsZiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudFJlY3QgPSBwYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBwYXJlbnRMZWZ0ID0gcGFyZW50UmVjdC5sZWZ0O1xuICAgICAgICB2YXIgcGFyZW50VG9wID0gcGFyZW50UmVjdC50b3A7XG4gICAgICAgIHZhciBzZWxmUmVjdCA9IHNlbGYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuZ2V0RHJhZ2dhYmxlUG9zaXRpb24oKTtcbiAgICAgICAgdmFyIHNjcm9sbExlZnQgPSBwYXJlbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgdmFyIHNjcm9sbFRvcCA9IHBhcmVudC5zY3JvbGxUb3A7XG4gICAgICAgIHRoaXMub2Zmc2V0RnJvbVBhcmVudCA9IHtcbiAgICAgICAgICAgIGxlZnQ6IHNlbGZSZWN0LmxlZnQgLSBwYXJlbnRMZWZ0ICsgc2Nyb2xsTGVmdCAtIHBvc2l0aW9uLnggKiBzY2FsZSxcbiAgICAgICAgICAgIHRvcDogc2VsZlJlY3QudG9wIC0gcGFyZW50VG9wICsgc2Nyb2xsVG9wIC0gcG9zaXRpb24ueSAqIHNjYWxlLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgUm5kLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIGRpc2FibGVEcmFnZ2luZyA9IF9hLmRpc2FibGVEcmFnZ2luZywgc3R5bGUgPSBfYS5zdHlsZSwgZHJhZ0hhbmRsZUNsYXNzTmFtZSA9IF9hLmRyYWdIYW5kbGVDbGFzc05hbWUsIHBvc2l0aW9uID0gX2EucG9zaXRpb24sIG9uTW91c2VEb3duID0gX2Eub25Nb3VzZURvd24sIG9uTW91c2VVcCA9IF9hLm9uTW91c2VVcCwgZHJhZ0F4aXMgPSBfYS5kcmFnQXhpcywgZHJhZ0dyaWQgPSBfYS5kcmFnR3JpZCwgYm91bmRzID0gX2EuYm91bmRzLCBlbmFibGVVc2VyU2VsZWN0SGFjayA9IF9hLmVuYWJsZVVzZXJTZWxlY3RIYWNrLCBjYW5jZWwgPSBfYS5jYW5jZWwsIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIG9uUmVzaXplU3RhcnQgPSBfYS5vblJlc2l6ZVN0YXJ0LCBvblJlc2l6ZSA9IF9hLm9uUmVzaXplLCBvblJlc2l6ZVN0b3AgPSBfYS5vblJlc2l6ZVN0b3AsIG9uRHJhZ1N0YXJ0ID0gX2Eub25EcmFnU3RhcnQsIG9uRHJhZyA9IF9hLm9uRHJhZywgb25EcmFnU3RvcCA9IF9hLm9uRHJhZ1N0b3AsIHJlc2l6ZUhhbmRsZVN0eWxlcyA9IF9hLnJlc2l6ZUhhbmRsZVN0eWxlcywgcmVzaXplSGFuZGxlQ2xhc3NlcyA9IF9hLnJlc2l6ZUhhbmRsZUNsYXNzZXMsIHJlc2l6ZUhhbmRsZUNvbXBvbmVudCA9IF9hLnJlc2l6ZUhhbmRsZUNvbXBvbmVudCwgZW5hYmxlUmVzaXppbmcgPSBfYS5lbmFibGVSZXNpemluZywgcmVzaXplR3JpZCA9IF9hLnJlc2l6ZUdyaWQsIHJlc2l6ZUhhbmRsZVdyYXBwZXJDbGFzcyA9IF9hLnJlc2l6ZUhhbmRsZVdyYXBwZXJDbGFzcywgcmVzaXplSGFuZGxlV3JhcHBlclN0eWxlID0gX2EucmVzaXplSGFuZGxlV3JhcHBlclN0eWxlLCBzY2FsZSA9IF9hLnNjYWxlLCBhbGxvd0FueUNsaWNrID0gX2EuYWxsb3dBbnlDbGljaywgcmVzaXphYmxlUHJvcHMgPSBfX3Jlc3QoX2EsIFtcImRpc2FibGVEcmFnZ2luZ1wiLCBcInN0eWxlXCIsIFwiZHJhZ0hhbmRsZUNsYXNzTmFtZVwiLCBcInBvc2l0aW9uXCIsIFwib25Nb3VzZURvd25cIiwgXCJvbk1vdXNlVXBcIiwgXCJkcmFnQXhpc1wiLCBcImRyYWdHcmlkXCIsIFwiYm91bmRzXCIsIFwiZW5hYmxlVXNlclNlbGVjdEhhY2tcIiwgXCJjYW5jZWxcIiwgXCJjaGlsZHJlblwiLCBcIm9uUmVzaXplU3RhcnRcIiwgXCJvblJlc2l6ZVwiLCBcIm9uUmVzaXplU3RvcFwiLCBcIm9uRHJhZ1N0YXJ0XCIsIFwib25EcmFnXCIsIFwib25EcmFnU3RvcFwiLCBcInJlc2l6ZUhhbmRsZVN0eWxlc1wiLCBcInJlc2l6ZUhhbmRsZUNsYXNzZXNcIiwgXCJyZXNpemVIYW5kbGVDb21wb25lbnRcIiwgXCJlbmFibGVSZXNpemluZ1wiLCBcInJlc2l6ZUdyaWRcIiwgXCJyZXNpemVIYW5kbGVXcmFwcGVyQ2xhc3NcIiwgXCJyZXNpemVIYW5kbGVXcmFwcGVyU3R5bGVcIiwgXCJzY2FsZVwiLCBcImFsbG93QW55Q2xpY2tcIl0pO1xuICAgICAgICB2YXIgZGVmYXVsdFZhbHVlID0gdGhpcy5wcm9wcy5kZWZhdWx0ID8gX19hc3NpZ24oe30sIHRoaXMucHJvcHMuZGVmYXVsdCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFJlbW92ZSB1bmtub3duIHByb3BzLCBzZWUgYWxzbyBodHRwczovL3JlYWN0anMub3JnL3dhcm5pbmdzL3Vua25vd24tcHJvcC5odG1sXG4gICAgICAgIGRlbGV0ZSByZXNpemFibGVQcm9wcy5kZWZhdWx0O1xuICAgICAgICB2YXIgY3Vyc29yU3R5bGUgPSBkaXNhYmxlRHJhZ2dpbmcgfHwgZHJhZ0hhbmRsZUNsYXNzTmFtZSA/IHsgY3Vyc29yOiBcImF1dG9cIiB9IDogeyBjdXJzb3I6IFwibW92ZVwiIH07XG4gICAgICAgIHZhciBpbm5lclN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHJlc2l6YWJsZVN0eWxlKSwgY3Vyc29yU3R5bGUpLCBzdHlsZSk7XG4gICAgICAgIHZhciBfYiA9IHRoaXMub2Zmc2V0RnJvbVBhcmVudCwgbGVmdCA9IF9iLmxlZnQsIHRvcCA9IF9iLnRvcDtcbiAgICAgICAgdmFyIGRyYWdnYWJsZVBvc2l0aW9uO1xuICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIGRyYWdnYWJsZVBvc2l0aW9uID0ge1xuICAgICAgICAgICAgICAgIHg6IHBvc2l0aW9uLnggLSBsZWZ0LFxuICAgICAgICAgICAgICAgIHk6IHBvc2l0aW9uLnkgLSB0b3AsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIElORk86IE1ha2UgdW5jb250b3JvbGxlZCBjb21wb25lbnQgd2hlbiByZXNpemluZyB0byBjb250cm9sIHBvc2l0aW9uIGJ5IHNldFBvc3Rpb24uXG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnN0YXRlLnJlc2l6aW5nID8gdW5kZWZpbmVkIDogZHJhZ2dhYmxlUG9zaXRpb247XG4gICAgICAgIHZhciBkcmFnQXhpc09yVW5kZWZpbmVkID0gdGhpcy5zdGF0ZS5yZXNpemluZyA/IFwiYm90aFwiIDogZHJhZ0F4aXM7XG4gICAgICAgIHJldHVybiAoY3JlYXRlRWxlbWVudChEcmFnZ2FibGUsIHsgcmVmOiBmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgIGlmICghYylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIF90aGlzLmRyYWdnYWJsZSA9IGM7XG4gICAgICAgICAgICB9LCBoYW5kbGU6IGRyYWdIYW5kbGVDbGFzc05hbWUgPyBcIi5cIi5jb25jYXQoZHJhZ0hhbmRsZUNsYXNzTmFtZSkgOiB1bmRlZmluZWQsIGRlZmF1bHRQb3NpdGlvbjogZGVmYXVsdFZhbHVlLCBvbk1vdXNlRG93bjogb25Nb3VzZURvd24sIFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgb25Nb3VzZVVwOiBvbk1vdXNlVXAsIG9uU3RhcnQ6IHRoaXMub25EcmFnU3RhcnQsIG9uRHJhZzogdGhpcy5vbkRyYWcsIG9uU3RvcDogdGhpcy5vbkRyYWdTdG9wLCBheGlzOiBkcmFnQXhpc09yVW5kZWZpbmVkLCBkaXNhYmxlZDogZGlzYWJsZURyYWdnaW5nLCBncmlkOiBkcmFnR3JpZCwgYm91bmRzOiBib3VuZHMgPyB0aGlzLnN0YXRlLmJvdW5kcyA6IHVuZGVmaW5lZCwgcG9zaXRpb246IHBvcywgZW5hYmxlVXNlclNlbGVjdEhhY2s6IGVuYWJsZVVzZXJTZWxlY3RIYWNrLCBjYW5jZWw6IGNhbmNlbCwgc2NhbGU6IHNjYWxlLCBhbGxvd0FueUNsaWNrOiBhbGxvd0FueUNsaWNrLCBub2RlUmVmOiB0aGlzLnJlc2l6YWJsZUVsZW1lbnQgfSxcbiAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnQoUmVzaXphYmxlLCBfX2Fzc2lnbih7fSwgcmVzaXphYmxlUHJvcHMsIHsgcmVmOiBmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWMpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlc2l6YWJsZSA9IGM7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlc2l6YWJsZUVsZW1lbnQuY3VycmVudCA9IGMucmVzaXphYmxlO1xuICAgICAgICAgICAgICAgIH0sIGRlZmF1bHRTaXplOiBkZWZhdWx0VmFsdWUsIHNpemU6IHRoaXMucHJvcHMuc2l6ZSwgZW5hYmxlOiB0eXBlb2YgZW5hYmxlUmVzaXppbmcgPT09IFwiYm9vbGVhblwiID8gZ2V0RW5hYmxlUmVzaXppbmdCeUZsYWcoZW5hYmxlUmVzaXppbmcpIDogZW5hYmxlUmVzaXppbmcsIG9uUmVzaXplU3RhcnQ6IHRoaXMub25SZXNpemVTdGFydCwgb25SZXNpemU6IHRoaXMub25SZXNpemUsIG9uUmVzaXplU3RvcDogdGhpcy5vblJlc2l6ZVN0b3AsIHN0eWxlOiBpbm5lclN0eWxlLCBtaW5XaWR0aDogdGhpcy5wcm9wcy5taW5XaWR0aCwgbWluSGVpZ2h0OiB0aGlzLnByb3BzLm1pbkhlaWdodCwgbWF4V2lkdGg6IHRoaXMuc3RhdGUucmVzaXppbmcgPyB0aGlzLnN0YXRlLm1heFdpZHRoIDogdGhpcy5wcm9wcy5tYXhXaWR0aCwgbWF4SGVpZ2h0OiB0aGlzLnN0YXRlLnJlc2l6aW5nID8gdGhpcy5zdGF0ZS5tYXhIZWlnaHQgOiB0aGlzLnByb3BzLm1heEhlaWdodCwgZ3JpZDogcmVzaXplR3JpZCwgaGFuZGxlV3JhcHBlckNsYXNzOiByZXNpemVIYW5kbGVXcmFwcGVyQ2xhc3MsIGhhbmRsZVdyYXBwZXJTdHlsZTogcmVzaXplSGFuZGxlV3JhcHBlclN0eWxlLCBsb2NrQXNwZWN0UmF0aW86IHRoaXMucHJvcHMubG9ja0FzcGVjdFJhdGlvLCBsb2NrQXNwZWN0UmF0aW9FeHRyYVdpZHRoOiB0aGlzLnByb3BzLmxvY2tBc3BlY3RSYXRpb0V4dHJhV2lkdGgsIGxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0OiB0aGlzLnByb3BzLmxvY2tBc3BlY3RSYXRpb0V4dHJhSGVpZ2h0LCBoYW5kbGVTdHlsZXM6IHJlc2l6ZUhhbmRsZVN0eWxlcywgaGFuZGxlQ2xhc3NlczogcmVzaXplSGFuZGxlQ2xhc3NlcywgaGFuZGxlQ29tcG9uZW50OiByZXNpemVIYW5kbGVDb21wb25lbnQsIHNjYWxlOiB0aGlzLnByb3BzLnNjYWxlIH0pLCBjaGlsZHJlbikpKTtcbiAgICB9O1xuICAgIFJuZC5kZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIG1heFdpZHRoOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgICAgbWF4SGVpZ2h0OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgICAgc2NhbGU6IDEsXG4gICAgICAgIG9uUmVzaXplU3RhcnQ6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25SZXNpemU6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgb25SZXNpemVTdG9wOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uRHJhZ1N0YXJ0OiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIG9uRHJhZzogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICBvbkRyYWdTdG9wOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgfTtcbiAgICByZXR1cm4gUm5kO1xufShQdXJlQ29tcG9uZW50KSk7XG5cbmV4cG9ydCB7IFJuZCB9O1xuIiwiaW1wb3J0IHsgY25iIH0gZnJvbSAnY25idWlsZGVyJztcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHpvb21MZXZlbCB9IGZyb20gJ3pvb20tbGV2ZWwnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlQ29yZSB9IGZyb20gJ3JlYWN0LWRyYWdnYWJsZSc7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxudmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gIH0gOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgfSwgX3R5cGVvZihvYmopO1xufVxuXG52YXIgZG9jID0gKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKGRvY3VtZW50KSkgPT09ICdvYmplY3QnID8gZG9jdW1lbnQgOiBudWxsO1xudmFyIGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgaXNVbmRlZiA9IGZ1bmN0aW9uIGlzVW5kZWYodikge1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnO1xufTtcbnZhciBpc0Z1biA9IGZ1bmN0aW9uIGlzRnVuKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nO1xufTtcbnZhciBpc051bSA9IGZ1bmN0aW9uIGlzTnVtKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSAnbnVtYmVyJztcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIFdpbGwgcmV0dXJuIHJlbmRlcmVyIHJlc3VsdCBpZiBwcmVzZW50ZWQsIGRpdiBlbGVtZW50IG90aGVyd2lzZS5cclxuICogSWYgcmVuZGVyZXIgaXMgcHJlc2VudGVkIGl0J2xsIHJlY2VpdmUgYGVsZW1lbnRSZWZgIGZ1bmN0aW9uIHdoaWNoIHNob3VsZCBiZSB1c2VkIGFzIEhUTUxFbGVtZW50J3MgcmVmLlxyXG4gKlxyXG4gKiBAcGFyYW0gcHJvcHMge0VsZW1lbnRQcm9wc1dpdGhFbGVtZW50UmVmQW5kUmVuZGVyZXJ9XHJcbiAqIEBwYXJhbSBlbGVtZW50UmVmIHtFbGVtZW50UmVmfVxyXG4gKi9cblxudmFyIHJlbmRlckRpdldpdGhSZW5kZXJlciA9IGZ1bmN0aW9uIHJlbmRlckRpdldpdGhSZW5kZXJlcihwcm9wcywgZWxlbWVudFJlZikge1xuICBpZiAoaXNGdW4ocHJvcHMucmVuZGVyZXIpKSB7XG4gICAgcHJvcHMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gICAgdmFyIHJlbmRlcmVyID0gcHJvcHMucmVuZGVyZXI7XG4gICAgZGVsZXRlIHByb3BzLnJlbmRlcmVyO1xuICAgIHJldHVybiByZW5kZXJlcihwcm9wcyk7XG4gIH1cblxuICBkZWxldGUgcHJvcHMuZWxlbWVudFJlZjtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX19hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgcmVmOiBlbGVtZW50UmVmXG4gIH0pKTtcbn07XG5cbnZhciBnZXRJbm5lclNpemUgPSBmdW5jdGlvbiBnZXRJbm5lclNpemUoZWwsIGRpbWVuc2lvbiwgcGFkZGluZzEsIHBhZGRpbmcyKSB7XG4gIHZhciBzdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKGVsKTtcblxuICBpZiAoc3R5bGVzLmJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIChOdW1iZXIucGFyc2VGbG9hdChzdHlsZXNbZGltZW5zaW9uXSkgfHwgMCkgLSAoTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzW3BhZGRpbmcxXSkgfHwgMCkgLSAoTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzW3BhZGRpbmcyXSkgfHwgMCkpO1xuICB9XG5cbiAgcmV0dXJuIE51bWJlci5wYXJzZUZsb2F0KHN0eWxlc1tkaW1lbnNpb25dKSB8fCAwO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJuIGVsZW1lbnQncyBoZWlnaHQgd2l0aG91dCBwYWRkaW5nXHJcbiAqL1xuXG5cbnZhciBnZXRJbm5lckhlaWdodCA9IGZ1bmN0aW9uIGdldElubmVySGVpZ2h0KGVsKSB7XG4gIHJldHVybiBnZXRJbm5lclNpemUoZWwsICdoZWlnaHQnLCAncGFkZGluZ1RvcCcsICdwYWRkaW5nQm90dG9tJyk7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gZWxlbWVudCdzIHdpZHRoIHdpdGhvdXQgcGFkZGluZ1xyXG4gKi9cblxudmFyIGdldElubmVyV2lkdGggPSBmdW5jdGlvbiBnZXRJbm5lcldpZHRoKGVsKSB7XG4gIHJldHVybiBnZXRJbm5lclNpemUoZWwsICd3aWR0aCcsICdwYWRkaW5nTGVmdCcsICdwYWRkaW5nUmlnaHQnKTtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIFJldHVybiB1bmlxdWUgVVVJRCB2NFxyXG4gKi9cblxudmFyIHV1aWQgPSBmdW5jdGlvbiB1dWlkKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvd1xuICB2YXIgdXVpZCA9ICcnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKykge1xuICAgIHN3aXRjaCAoaSkge1xuICAgICAgY2FzZSA4OlxuICAgICAgY2FzZSAyMDpcbiAgICAgICAge1xuICAgICAgICAgIHV1aWQgKz0gXCItXCIuY29uY2F0KE1hdGgudHJ1bmMoTWF0aC5yYW5kb20oKSAqIDE2KS50b1N0cmluZygxNikpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgMTI6XG4gICAgICAgIHtcbiAgICAgICAgICB1dWlkICs9ICctNCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAxNjpcbiAgICAgICAge1xuICAgICAgICAgIHV1aWQgKz0gXCItXCIuY29uY2F0KChNYXRoLnJhbmRvbSgpICogMTYgfCAwICYgMyB8IDgpLnRvU3RyaW5nKDE2KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIHV1aWQgKz0gTWF0aC50cnVuYyhNYXRoLnJhbmRvbSgpICogMTYpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1dWlkO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2FsY3VsYXRlIHRodW1iIHNpemUgZm9yIGdpdmVuIHZpZXdwb3J0IGFuZCB0cmFjayBwYXJhbWV0ZXJzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb250ZW50U2l6ZSAtIFNjcm9sbGFibGUgY29udGVudCBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2aWV3cG9ydFNpemUgLSBWaWV3cG9ydCBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0cmFja1NpemUgLSBUcmFjayBzaXplIHRodW1iIGNhbiBtb3ZlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW5pbWFsU2l6ZSAtIE1pbmltYWwgdGh1bWIncyBzaXplXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhpbWFsU2l6ZSAtIE1heGltYWwgdGh1bWIncyBzaXplXHJcbiAqL1xuXG52YXIgY2FsY1RodW1iU2l6ZSA9IGZ1bmN0aW9uIGNhbGNUaHVtYlNpemUoY29udGVudFNpemUsIHZpZXdwb3J0U2l6ZSwgdHJhY2tTaXplLCBtaW5pbWFsU2l6ZSwgbWF4aW1hbFNpemUpIHtcbiAgaWYgKHZpZXdwb3J0U2l6ZSA+PSBjb250ZW50U2l6ZSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHRodW1iU2l6ZSA9IHZpZXdwb3J0U2l6ZSAvIGNvbnRlbnRTaXplICogdHJhY2tTaXplO1xuXG4gIGlmIChpc051bShtYXhpbWFsU2l6ZSkpIHtcbiAgICB0aHVtYlNpemUgPSBNYXRoLm1pbihtYXhpbWFsU2l6ZSwgdGh1bWJTaXplKTtcbiAgfVxuXG4gIGlmIChpc051bShtaW5pbWFsU2l6ZSkpIHtcbiAgICB0aHVtYlNpemUgPSBNYXRoLm1heChtaW5pbWFsU2l6ZSwgdGh1bWJTaXplKTtcbiAgfVxuXG4gIHJldHVybiB0aHVtYlNpemU7XG59O1xuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDYWxjdWxhdGUgdGh1bWIgb2Zmc2V0IGZvciBnaXZlbiB2aWV3cG9ydCwgdHJhY2sgYW5kIHRodW1iIHBhcmFtZXRlcnNcclxuICpcclxuICogQHBhcmFtIHtudW1iZXJ9IGNvbnRlbnRTaXplIC0gU2Nyb2xsYWJsZSBjb250ZW50IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHZpZXdwb3J0U2l6ZSAtIFZpZXdwb3J0IHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHRyYWNrU2l6ZSAtIFRyYWNrIHNpemUgdGh1bWIgY2FuIG1vdmVcclxuICogQHBhcmFtIHtudW1iZXJ9IHRodW1iU2l6ZSAtIFRodW1iIHNpemVcclxuICogQHBhcmFtIHtudW1iZXJ9IHNjcm9sbCAtIFNjcm9sbCB2YWx1ZSB0byByZXByZXNlbnRcclxuICovXG5cbnZhciBjYWxjVGh1bWJPZmZzZXQgPSBmdW5jdGlvbiBjYWxjVGh1bWJPZmZzZXQoY29udGVudFNpemUsIHZpZXdwb3J0U2l6ZSwgdHJhY2tTaXplLCB0aHVtYlNpemUsIHNjcm9sbCkge1xuICBpZiAoIXNjcm9sbCB8fCAhdGh1bWJTaXplIHx8IHZpZXdwb3J0U2l6ZSA+PSBjb250ZW50U2l6ZSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuICh0cmFja1NpemUgLSB0aHVtYlNpemUpICogc2Nyb2xsIC8gKGNvbnRlbnRTaXplIC0gdmlld3BvcnRTaXplKTtcbn07XG4vKipcclxuICogQGRlc2NyaXB0aW9uIENhbGN1bGF0ZSBzY3JvbGwgZm9yIGdpdmVuIHZpZXdwb3J0LCB0cmFjayBhbmQgdGh1bWIgcGFyYW1ldGVyc1xyXG4gKlxyXG4gKiBAcGFyYW0ge251bWJlcn0gY29udGVudFNpemUgLSBTY3JvbGxhYmxlIGNvbnRlbnQgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmlld3BvcnRTaXplIC0gVmlld3BvcnQgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdHJhY2tTaXplIC0gVHJhY2sgc2l6ZSB0aHVtYiBjYW4gbW92ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdGh1bWJTaXplIC0gVGh1bWIgc2l6ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gdGh1bWJPZmZzZXQgLSBUaHVtYidzIG9mZnNldCByZXByZXNlbnRpbmcgdGhlIHNjcm9sbFxyXG4gKi9cblxudmFyIGNhbGNTY3JvbGxGb3JUaHVtYk9mZnNldCA9IGZ1bmN0aW9uIGNhbGNTY3JvbGxGb3JUaHVtYk9mZnNldChjb250ZW50U2l6ZSwgdmlld3BvcnRTaXplLCB0cmFja1NpemUsIHRodW1iU2l6ZSwgdGh1bWJPZmZzZXQpIHtcbiAgaWYgKCF0aHVtYk9mZnNldCB8fCAhdGh1bWJTaXplIHx8IHZpZXdwb3J0U2l6ZSA+PSBjb250ZW50U2l6ZSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHRodW1iT2Zmc2V0ICogKGNvbnRlbnRTaXplIC0gdmlld3BvcnRTaXplKSAvICh0cmFja1NpemUgLSB0aHVtYlNpemUpO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gUmV0dXJucyBzY3JvbGxiYXIgd2lkdGggc3BlY2lmaWMgZm9yIGN1cnJlbnQgZW52aXJvbm1lbnQuIENhbiByZXR1cm4gdW5kZWZpbmVkIGlmIERPTSBpcyBub3QgcmVhZHkgeWV0LlxyXG4gKi9cblxudmFyIGdldFNjcm9sbGJhcldpZHRoID0gZnVuY3Rpb24gZ2V0U2Nyb2xsYmFyV2lkdGgoZm9yY2UpIHtcbiAgaWYgKGZvcmNlID09PSB2b2lkIDApIHtcbiAgICBmb3JjZSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKCFkb2MpIHtcbiAgICBnZXRTY3JvbGxiYXJXaWR0aC5fY2FjaGUgPSAwO1xuICAgIHJldHVybiBnZXRTY3JvbGxiYXJXaWR0aC5fY2FjaGU7XG4gIH1cblxuICBpZiAoIWZvcmNlICYmICFpc1VuZGVmKGdldFNjcm9sbGJhcldpZHRoLl9jYWNoZSkpIHtcbiAgICByZXR1cm4gZ2V0U2Nyb2xsYmFyV2lkdGguX2NhY2hlO1xuICB9XG5cbiAgdmFyIGVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBlbC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMHB4O2hlaWdodDoxMDBweDt0b3A6LTk5OXB4O2xlZnQ6LTk5OXB4O292ZXJmbG93OnNjcm9sbDsnKTtcbiAgZG9jLmJvZHkuYXBwZW5kKGVsKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICBpZiAoZWwuY2xpZW50V2lkdGggPT09IDApIHtcbiAgICAvLyBEbyBub3QgZXZlbiBjYWNoZSB0aGlzIHZhbHVlIGJlY2F1c2UgdGhlcmUgaXMgbm8gY2FsY3VsYXRpb25zLiBJc3N1ZSBodHRwczovL2dpdGh1Yi5jb20veG9ib3R5aS9yZWFjdC1zY3JvbGxiYXJzLWN1c3RvbS9pc3N1ZXMvMTIzXG4gICAgZWwucmVtb3ZlKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZ2V0U2Nyb2xsYmFyV2lkdGguX2NhY2hlID0gMTAwIC0gZWwuY2xpZW50V2lkdGg7XG4gIGVsLnJlbW92ZSgpO1xuICByZXR1cm4gZ2V0U2Nyb2xsYmFyV2lkdGguX2NhY2hlO1xufTtcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gRGV0ZWN0IG5lZWQgb2YgaG9yaXpvbnRhbCBzY3JvbGwgcmV2ZXJzZSB3aGlsZSBSVEwuXHJcbiAqL1xuXG52YXIgc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbCA9IGZ1bmN0aW9uIHNob3VsZFJldmVyc2VSdGxTY3JvbGwoZm9yY2UpIHtcbiAgaWYgKGZvcmNlID09PSB2b2lkIDApIHtcbiAgICBmb3JjZSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKCFmb3JjZSAmJiAhaXNVbmRlZihzaG91bGRSZXZlcnNlUnRsU2Nyb2xsLl9jYWNoZSkpIHtcbiAgICByZXR1cm4gc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbC5fY2FjaGU7XG4gIH1cblxuICBpZiAoIWRvYykge1xuICAgIHNob3VsZFJldmVyc2VSdGxTY3JvbGwuX2NhY2hlID0gZmFsc2U7XG4gICAgcmV0dXJuIHNob3VsZFJldmVyc2VSdGxTY3JvbGwuX2NhY2hlO1xuICB9XG5cbiAgdmFyIGVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB2YXIgY2hpbGQgPSBkb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGVsLmFwcGVuZChjaGlsZCk7XG4gIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAncG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwcHg7aGVpZ2h0OjEwMHB4O3RvcDotOTk5cHg7bGVmdDotOTk5cHg7b3ZlcmZsb3c6c2Nyb2xsO2RpcmVjdGlvbjpydGwnKTtcbiAgY2hpbGQuc2V0QXR0cmlidXRlKCdzdHlsZScsICd3aWR0aDoxMDAwcHg7aGVpZ2h0OjEwMDBweCcpO1xuICBkb2MuYm9keS5hcHBlbmQoZWwpO1xuICBlbC5zY3JvbGxMZWZ0ID0gLTUwO1xuICBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsLl9jYWNoZSA9IGVsLnNjcm9sbExlZnQgPT09IC01MDtcbiAgZWwucmVtb3ZlKCk7XG4gIHJldHVybiBzaG91bGRSZXZlcnNlUnRsU2Nyb2xsLl9jYWNoZTtcbn07XG5cbnZhciBFbWl0dHIgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFbWl0dHIobWF4SGFuZGxlcnMpIHtcbiAgICBpZiAobWF4SGFuZGxlcnMgPT09IHZvaWQgMCkge1xuICAgICAgbWF4SGFuZGxlcnMgPSAxMDtcbiAgICB9XG5cbiAgICB0aGlzLnNldE1heEhhbmRsZXJzKG1heEhhbmRsZXJzKTtcbiAgICB0aGlzLl9oYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cblxuICBFbWl0dHIuX2NhbGxFdmVudEhhbmRsZXJzID0gZnVuY3Rpb24gKGVtaXR0ZXIsIGhhbmRsZXJzLCBhcmdzKSB7XG4gICAgaWYgKCFoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaGFuZGxlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBSZWZsZWN0LmFwcGx5KGhhbmRsZXJzWzBdLCBlbWl0dGVyLCBhcmdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBoYW5kbGVycyA9IF9fc3ByZWFkQXJyYXkoW10sIGhhbmRsZXJzLCB0cnVlKTtcbiAgICB2YXIgaWR4O1xuXG4gICAgZm9yIChpZHggPSAwOyBpZHggPCBoYW5kbGVycy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICBSZWZsZWN0LmFwcGx5KGhhbmRsZXJzW2lkeF0sIGVtaXR0ZXIsIGFyZ3MpO1xuICAgIH1cbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLnNldE1heEhhbmRsZXJzID0gZnVuY3Rpb24gKGNvdW50KSB7XG4gICAgaWYgKCFpc051bShjb3VudCkgfHwgY291bnQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIG1heEhhbmRsZXJzIHRvIGJlIGEgcG9zaXRpdmUgbnVtYmVyLCBnb3QgJ1wiLmNvbmNhdChjb3VudCwgXCInIG9mIHR5cGUgXCIpLmNvbmNhdChfdHlwZW9mKGNvdW50KSkpO1xuICAgIH1cblxuICAgIHRoaXMuX21heEhhbmRsZXJzID0gY291bnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5nZXRNYXhIYW5kbGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4SGFuZGxlcnM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuXG4gICAgaWYgKF90eXBlb2YodGhpcy5faGFuZGxlcnNbbmFtZV0pICE9PSAnb2JqZWN0JyB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLl9oYW5kbGVyc1tuYW1lXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBFbWl0dHIuX2NhbGxFdmVudEhhbmRsZXJzKHRoaXMsIHRoaXMuX2hhbmRsZXJzW25hbWVdLCBhcmdzKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIEVtaXR0ci5fYWRkSGFuZGxlcih0aGlzLCBuYW1lLCBoYW5kbGVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUucHJlcGVuZE9uID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBFbWl0dHIuX2FkZEhhbmRsZXIodGhpcywgbmFtZSwgaGFuZGxlciwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIGlmICghaXNGdW4oaGFuZGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBldmVudCBoYW5kbGVyIHRvIGJlIGEgZnVuY3Rpb24sIGdvdCBcIi5jb25jYXQoX3R5cGVvZihoYW5kbGVyKSkpO1xuICAgIH1cblxuICAgIEVtaXR0ci5fYWRkSGFuZGxlcih0aGlzLCBuYW1lLCB0aGlzLl93cmFwT25jZUhhbmRsZXIobmFtZSwgaGFuZGxlcikpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5wcmVwZW5kT25jZSA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgaWYgKCFpc0Z1bihoYW5kbGVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIGV2ZW50IGhhbmRsZXIgdG8gYmUgYSBmdW5jdGlvbiwgZ290IFwiLmNvbmNhdChfdHlwZW9mKGhhbmRsZXIpKSk7XG4gICAgfVxuXG4gICAgRW1pdHRyLl9hZGRIYW5kbGVyKHRoaXMsIG5hbWUsIHRoaXMuX3dyYXBPbmNlSGFuZGxlcihuYW1lLCBoYW5kbGVyKSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBFbWl0dHIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgRW1pdHRyLl9yZW1vdmVIYW5kbGVyKHRoaXMsIG5hbWUsIGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgRW1pdHRyLnByb3RvdHlwZS5yZW1vdmVBbGxIYW5kbGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVycztcbiAgICB0aGlzLl9oYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdmFyIHJlbW92ZUhhbmRsZXJzID0gaGFuZGxlcnMucmVtb3ZlSGFuZGxlcjtcbiAgICBkZWxldGUgaGFuZGxlcnMucmVtb3ZlSGFuZGxlcjtcbiAgICB2YXIgaWR4O1xuICAgIHZhciBldmVudE5hbWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBndWFyZC1mb3ItaW4sbm8tcmVzdHJpY3RlZC1zeW50YXhcblxuICAgIGZvciAoZXZlbnROYW1lIGluIGhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGlkeCA9IGhhbmRsZXJzW2V2ZW50TmFtZV0ubGVuZ3RoIC0gMTsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgIEVtaXR0ci5fY2FsbEV2ZW50SGFuZGxlcnModGhpcywgcmVtb3ZlSGFuZGxlcnMsIFtldmVudE5hbWUsIGhhbmRsZXJzW2V2ZW50TmFtZV1baWR4XS5oYW5kbGVyIHx8IGhhbmRsZXJzW2V2ZW50TmFtZV1baWR4XV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEVtaXR0ci5wcm90b3R5cGUuX3dyYXBPbmNlSGFuZGxlciA9IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyKSB7XG4gICAgdmFyIG9uY2VTdGF0ZSA9IHtcbiAgICAgIGZpcmVkOiBmYWxzZSxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZXIsXG4gICAgICB3cmFwcGVkSGFuZGxlcjogdW5kZWZpbmVkLFxuICAgICAgZW1pdHRlcjogdGhpcyxcbiAgICAgIGV2ZW50OiBuYW1lXG4gICAgfTtcblxuICAgIHZhciB3cmFwcGVkSGFuZGxlciA9IEVtaXR0ci5fb25jZVdyYXBwZXIuYmluZChvbmNlU3RhdGUpO1xuXG4gICAgb25jZVN0YXRlLndyYXBwZWRIYW5kbGVyID0gd3JhcHBlZEhhbmRsZXI7XG4gICAgd3JhcHBlZEhhbmRsZXIuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgd3JhcHBlZEhhbmRsZXIuZXZlbnQgPSBuYW1lO1xuICAgIHJldHVybiB3cmFwcGVkSGFuZGxlcjtcbiAgfTtcblxuICBFbWl0dHIuX2FkZEhhbmRsZXIgPSBmdW5jdGlvbiAoZW1pdHRlciwgbmFtZSwgaGFuZGxlciwgcHJlcGVuZCkge1xuICAgIGlmIChwcmVwZW5kID09PSB2b2lkIDApIHtcbiAgICAgIHByZXBlbmQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRnVuKGhhbmRsZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRXhwZWN0ZWQgZXZlbnQgaGFuZGxlciB0byBiZSBhIGZ1bmN0aW9uLCBnb3QgXCIuY29uY2F0KF90eXBlb2YoaGFuZGxlcikpKTtcbiAgICB9XG5cbiAgICBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXSA9IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdIHx8IFtdO1xuICAgIGVtaXR0ZXIuZW1pdCgnYWRkSGFuZGxlcicsIG5hbWUsIGhhbmRsZXIpO1xuXG4gICAgaWYgKHByZXBlbmQpIHtcbiAgICAgIGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdLnVuc2hpZnQoaGFuZGxlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdLnB1c2goaGFuZGxlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVtaXR0ZXI7XG4gIH07XG5cbiAgRW1pdHRyLl9vbmNlV3JhcHBlciA9IGZ1bmN0aW9uIF9vbmNlV3JhcHBlcigpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgICAgdGhpcy5lbWl0dGVyLm9mZih0aGlzLmV2ZW50LCB0aGlzLndyYXBwZWRIYW5kbGVyKTtcbiAgICAgIFJlZmxlY3QuYXBwbHkodGhpcy5oYW5kbGVyLCB0aGlzLmVtaXR0ZXIsIGFyZ3MpO1xuICAgIH1cbiAgfTtcblxuICBFbWl0dHIuX3JlbW92ZUhhbmRsZXIgPSBmdW5jdGlvbiAoZW1pdHRlciwgbmFtZSwgaGFuZGxlcikge1xuICAgIGlmICghaXNGdW4oaGFuZGxlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBldmVudCBoYW5kbGVyIHRvIGJlIGEgZnVuY3Rpb24sIGdvdCBcIi5jb25jYXQoX3R5cGVvZihoYW5kbGVyKSkpO1xuICAgIH1cblxuICAgIGlmIChpc1VuZGVmKGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdKSB8fCAhZW1pdHRlci5faGFuZGxlcnNbbmFtZV0ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZW1pdHRlcjtcbiAgICB9XG5cbiAgICB2YXIgaWR4ID0gLTE7XG5cbiAgICBpZiAoZW1pdHRlci5faGFuZGxlcnNbbmFtZV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAoZW1pdHRlci5faGFuZGxlcnNbbmFtZV1bMF0gPT09IGhhbmRsZXIgfHwgZW1pdHRlci5faGFuZGxlcnNbbmFtZV1bMF0uaGFuZGxlciA9PT0gaGFuZGxlcikge1xuICAgICAgICBpZHggPSAwO1xuICAgICAgICBoYW5kbGVyID0gZW1pdHRlci5faGFuZGxlcnNbbmFtZV1bMF0uaGFuZGxlciB8fCBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVswXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChpZHggPSBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXS5sZW5ndGggLSAxOyBpZHggPj0gMDsgaWR4LS0pIHtcbiAgICAgICAgaWYgKGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdW2lkeF0gPT09IGhhbmRsZXIgfHwgZW1pdHRlci5faGFuZGxlcnNbbmFtZV1baWR4XS5oYW5kbGVyID09PSBoYW5kbGVyKSB7XG4gICAgICAgICAgaGFuZGxlciA9IGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdW2lkeF0uaGFuZGxlciB8fCBlbWl0dGVyLl9oYW5kbGVyc1tuYW1lXVtpZHhdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBlbWl0dGVyO1xuICAgIH1cblxuICAgIGlmIChpZHggPT09IDApIHtcbiAgICAgIGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdLnNoaWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXR0ZXIuX2hhbmRsZXJzW25hbWVdLnNwbGljZShpZHgsIDEpO1xuICAgIH1cblxuICAgIGVtaXR0ZXIuZW1pdCgncmVtb3ZlSGFuZGxlcicsIG5hbWUsIGhhbmRsZXIpO1xuICAgIHJldHVybiBlbWl0dGVyO1xuICB9O1xuXG4gIHJldHVybiBFbWl0dHI7XG59KCk7XG5cbnZhciBSQUZMb29wID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUkFGTG9vcCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgdGFyZ2V0cyB0byB1cGRhdGVcclxuICAgICAqL1xuXG5cbiAgICB0aGlzLnRhcmdldHMgPSBbXTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBJRCBvZiByZXF1ZXN0ZWQgYW5pbWF0aW9uIGZyYW1lLiBWYWx1YWJsZSBvbmx5IGlmIGxvb3AgaXMgYWN0aXZlIGFuZCBoYXMgaXRlbXMgdG8gaXRlcmF0ZS5cclxuICAgICAqL1xuXG4gICAgdGhpcy5hbmltYXRpb25GcmFtZUlEID0gMDtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBMb29wJ3Mgc3RhdGUuXHJcbiAgICAgKi9cblxuICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU3RhcnQgdGhlIGxvb3AgaWYgaXQgd2Fzbid0IHlldC5cclxuICAgICAqL1xuXG4gICAgdGhpcy5zdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3RoaXMuX2lzQWN0aXZlICYmIF90aGlzLnRhcmdldHMubGVuZ3RoKSB7XG4gICAgICAgIF90aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgIGlmIChfdGhpcy5hbmltYXRpb25GcmFtZUlEKSBjYW5jZWxBbmltYXRpb25GcmFtZShfdGhpcy5hbmltYXRpb25GcmFtZUlEKTtcbiAgICAgICAgX3RoaXMuYW5pbWF0aW9uRnJhbWVJRCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShfdGhpcy5yYWZDYWxsYmFjayk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFN0b3AgdGhlIGxvb3AgaWYgaXMgd2FzIGFjdGl2ZS5cclxuICAgICAqL1xuXG5cbiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuX2lzQWN0aXZlKSB7XG4gICAgICAgIF90aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoX3RoaXMuYW5pbWF0aW9uRnJhbWVJRCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX3RoaXMuYW5pbWF0aW9uRnJhbWVJRCk7XG4gICAgICAgIF90aGlzLmFuaW1hdGlvbkZyYW1lSUQgPSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgdGFyZ2V0IHRvIHRoZSBpdGVyYXRpb24gbGlzdCBpZiBpdCdzIG5vdCB0aGVyZS5cclxuICAgICAqL1xuXG5cbiAgICB0aGlzLmFkZFRhcmdldCA9IGZ1bmN0aW9uICh0YXJnZXQsIHNpbGVudCkge1xuICAgICAgaWYgKHNpbGVudCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHNpbGVudCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV90aGlzLnRhcmdldHMuaW5jbHVkZXModGFyZ2V0KSkge1xuICAgICAgICBfdGhpcy50YXJnZXRzLnB1c2godGFyZ2V0KTtcblxuICAgICAgICBpZiAoX3RoaXMudGFyZ2V0cy5sZW5ndGggPT09IDEgJiYgIXNpbGVudCkgX3RoaXMuc3RhcnQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlIHRhcmdldCBmcm9tIGl0ZXJhdGlvbiBsaXN0IGlmIGl0IHdhcyB0aGVyZS5cclxuICAgICAqL1xuXG5cbiAgICB0aGlzLnJlbW92ZVRhcmdldCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIHZhciBpZHggPSBfdGhpcy50YXJnZXRzLmluZGV4T2YodGFyZ2V0KTtcblxuICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgX3RoaXMudGFyZ2V0cy5zcGxpY2UoaWR4LCAxKTtcblxuICAgICAgICBpZiAoX3RoaXMudGFyZ2V0cy5sZW5ndGggPT09IDApIF90aGlzLnN0b3AoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2FsbGJhY2sgdGhhdCBjYWxsZWQgZWFjaCBhbmltYXRpb24gZnJhbWUuXHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy5yYWZDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3RoaXMuX2lzQWN0aXZlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzLnRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFfdGhpcy50YXJnZXRzW2ldLl91bm1vdW50ZWQpIF90aGlzLnRhcmdldHNbaV0udXBkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmFuaW1hdGlvbkZyYW1lSUQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMucmFmQ2FsbGJhY2spO1xuICAgICAgcmV0dXJuIF90aGlzLmFuaW1hdGlvbkZyYW1lSUQ7XG4gICAgfTtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSQUZMb29wLnByb3RvdHlwZSwgXCJpc0FjdGl2ZVwiLCB7XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTG9vcCdzIHN0YXRlLlxyXG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXNBY3RpdmU7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIHJldHVybiBSQUZMb29wO1xufSgpO1xudmFyIExvb3AgPSBuZXcgUkFGTG9vcCgpO1xuXG52YXIgQVhJU19ESVJFQ1RJT047XG5cbihmdW5jdGlvbiAoQVhJU19ESVJFQ1RJT04pIHtcbiAgQVhJU19ESVJFQ1RJT05bXCJYXCJdID0gXCJ4XCI7XG4gIEFYSVNfRElSRUNUSU9OW1wiWVwiXSA9IFwieVwiO1xufSkoQVhJU19ESVJFQ1RJT04gfHwgKEFYSVNfRElSRUNUSU9OID0ge30pKTtcblxudmFyIFRSQUNLX0NMSUNLX0JFSEFWSU9SO1xuXG4oZnVuY3Rpb24gKFRSQUNLX0NMSUNLX0JFSEFWSU9SKSB7XG4gIFRSQUNLX0NMSUNLX0JFSEFWSU9SW1wiSlVNUFwiXSA9IFwianVtcFwiO1xuICBUUkFDS19DTElDS19CRUhBVklPUltcIlNURVBcIl0gPSBcInN0ZXBcIjtcbn0pKFRSQUNLX0NMSUNLX0JFSEFWSU9SIHx8IChUUkFDS19DTElDS19CRUhBVklPUiA9IHt9KSk7XG5cbnZhciBTY3JvbGxiYXJUaHVtYiA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhTY3JvbGxiYXJUaHVtYiwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBTY3JvbGxiYXJUaHVtYigpIHtcbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcblxuICAgIF90aGlzLmVsZW1lbnQgPSBudWxsO1xuICAgIF90aGlzLmluaXRpYWxPZmZzZXRYID0gMDtcbiAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WSA9IDA7XG4gICAgX3RoaXMuZWxlbWVudFJlZkhhY2sgPSBSZWFjdC5jcmVhdGVSZWYoKTtcbiAgICBfdGhpcy5sYXN0RHJhZ0RhdGEgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIGRlbHRhWDogMCxcbiAgICAgIGRlbHRhWTogMCxcbiAgICAgIGxhc3RYOiAwLFxuICAgICAgbGFzdFk6IDBcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlT25EcmFnU3RhcnQgPSBmdW5jdGlvbiAoZXYsIGRhdGEpIHtcbiAgICAgIGlmICghX3RoaXMuZWxlbWVudCkge1xuICAgICAgICBfdGhpcy5oYW5kbGVPbkRyYWdTdG9wKGV2LCBkYXRhKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgICAgX3RoaXMucHJldlVzZXJTZWxlY3QgPSBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3Q7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9ICdub25lJztcbiAgICAgICAgX3RoaXMucHJldk9uU2VsZWN0U3RhcnQgPSBkb2N1bWVudC5vbnNlbGVjdHN0YXJ0O1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIFNjcm9sbGJhclRodW1iLnNlbGVjdFN0YXJ0UmVwbGFjZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMucHJvcHMub25EcmFnU3RhcnQpIHtcbiAgICAgICAgX3RoaXMucHJvcHMub25EcmFnU3RhcnQoX3RoaXMubGFzdERyYWdEYXRhID0ge1xuICAgICAgICAgIHg6IGRhdGEueCAtIF90aGlzLmluaXRpYWxPZmZzZXRYLFxuICAgICAgICAgIHk6IGRhdGEueSAtIF90aGlzLmluaXRpYWxPZmZzZXRZLFxuICAgICAgICAgIGxhc3RYOiBkYXRhLmxhc3RYIC0gX3RoaXMuaW5pdGlhbE9mZnNldFgsXG4gICAgICAgICAgbGFzdFk6IGRhdGEubGFzdFkgLSBfdGhpcy5pbml0aWFsT2Zmc2V0WSxcbiAgICAgICAgICBkZWx0YVg6IGRhdGEuZGVsdGFYLFxuICAgICAgICAgIGRlbHRhWTogZGF0YS5kZWx0YVlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZHJhZ2dpbmcnKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlT25EcmFnID0gZnVuY3Rpb24gKGV2LCBkYXRhKSB7XG4gICAgICBpZiAoIV90aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMuaGFuZGxlT25EcmFnU3RvcChldiwgZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMucHJvcHMub25EcmFnKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uRHJhZyhfdGhpcy5sYXN0RHJhZ0RhdGEgPSB7XG4gICAgICAgICAgeDogZGF0YS54IC0gX3RoaXMuaW5pdGlhbE9mZnNldFgsXG4gICAgICAgICAgeTogZGF0YS55IC0gX3RoaXMuaW5pdGlhbE9mZnNldFksXG4gICAgICAgICAgbGFzdFg6IGRhdGEubGFzdFggLSBfdGhpcy5pbml0aWFsT2Zmc2V0WCxcbiAgICAgICAgICBsYXN0WTogZGF0YS5sYXN0WSAtIF90aGlzLmluaXRpYWxPZmZzZXRZLFxuICAgICAgICAgIGRlbHRhWDogZGF0YS5kZWx0YVgsXG4gICAgICAgICAgZGVsdGFZOiBkYXRhLmRlbHRhWVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlT25EcmFnU3RvcCA9IGZ1bmN0aW9uIChldiwgZGF0YSkge1xuICAgICAgdmFyIHJlc3VsdERhdGEgPSBkYXRhID8ge1xuICAgICAgICB4OiBkYXRhLnggLSBfdGhpcy5pbml0aWFsT2Zmc2V0WCxcbiAgICAgICAgeTogZGF0YS55IC0gX3RoaXMuaW5pdGlhbE9mZnNldFksXG4gICAgICAgIGxhc3RYOiBkYXRhLmxhc3RYIC0gX3RoaXMuaW5pdGlhbE9mZnNldFgsXG4gICAgICAgIGxhc3RZOiBkYXRhLmxhc3RZIC0gX3RoaXMuaW5pdGlhbE9mZnNldFksXG4gICAgICAgIGRlbHRhWDogZGF0YS5kZWx0YVgsXG4gICAgICAgIGRlbHRhWTogZGF0YS5kZWx0YVlcbiAgICAgIH0gOiBfdGhpcy5sYXN0RHJhZ0RhdGE7XG4gICAgICBpZiAoX3RoaXMucHJvcHMub25EcmFnRW5kKSBfdGhpcy5wcm9wcy5vbkRyYWdFbmQocmVzdWx0RGF0YSk7XG4gICAgICBpZiAoX3RoaXMuZWxlbWVudCkgX3RoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnZ2luZycpO1xuXG4gICAgICBpZiAoaXNCcm93c2VyKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9IF90aGlzLnByZXZVc2VyU2VsZWN0O1xuXG4gICAgICAgIGlmIChfdGhpcy5wcmV2T25TZWxlY3RTdGFydCkge1xuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0JywgX3RoaXMucHJldk9uU2VsZWN0U3RhcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMucHJldk9uU2VsZWN0U3RhcnQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WCA9IDA7XG4gICAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WSA9IDA7XG4gICAgICBfdGhpcy5sYXN0RHJhZ0RhdGEgPSB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIGRlbHRhWDogMCxcbiAgICAgICAgZGVsdGFZOiAwLFxuICAgICAgICBsYXN0WDogMCxcbiAgICAgICAgbGFzdFk6IDBcbiAgICAgIH07XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU9uTW91c2VEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICBpZiAoIV90aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICghaXNVbmRlZihldi5vZmZzZXRYKSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBfdGhpcy5pbml0aWFsT2Zmc2V0WCA9IGV2Lm9mZnNldFg7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbiAgICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldFkgPSBldi5vZmZzZXRZO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlY3QgPSBfdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIF90aGlzLmluaXRpYWxPZmZzZXRYID0gKGV2LmNsaWVudFggfHwgZXYudG91Y2hlc1swXS5jbGllbnRYKSAtIHJlY3QubGVmdDtcbiAgICAgICAgX3RoaXMuaW5pdGlhbE9mZnNldFkgPSAoZXYuY2xpZW50WSB8fCBldi50b3VjaGVzWzBdLmNsaWVudFkpIC0gcmVjdC50b3A7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWYgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMuZWxlbWVudFJlZikpIF90aGlzLnByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIF90aGlzLmVsZW1lbnQgPSByZWY7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcblxuICAgICAgX3RoaXMuZWxlbWVudFJlZkhhY2suY3VycmVudCA9IHJlZjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgU2Nyb2xsYmFyVGh1bWIucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiPFNjcm9sbGJhclRodW1iPiBFbGVtZW50IHdhcyBub3QgY3JlYXRlZC4gUG9zc2libHkgeW91IGhhdmVuJ3QgcHJvdmlkZWQgSFRNTERpdkVsZW1lbnQgdG8gcmVuZGVyZXIncyBgZWxlbWVudFJlZmAgZnVuY3Rpb24uXCIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIFNjcm9sbGJhclRodW1iLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmhhbmRsZU9uRHJhZ1N0b3AoKTtcbiAgICB0aGlzLmVsZW1lbnRSZWYobnVsbCk7XG4gIH07XG5cbiAgU2Nyb2xsYmFyVGh1bWIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2EgPSB0aGlzLnByb3BzO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EuZWxlbWVudFJlZjtcbiAgICAgICAgdmFyIGF4aXMgPSBfYS5heGlzO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eub25EcmFnO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eub25EcmFnRW5kO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eub25EcmFnU3RhcnQ7XG4gICAgICAgIHZhciBwcm9wcyA9IF9fcmVzdChfYSwgW1wiZWxlbWVudFJlZlwiLCBcImF4aXNcIiwgXCJvbkRyYWdcIiwgXCJvbkRyYWdFbmRcIiwgXCJvbkRyYWdTdGFydFwiXSk7XG5cbiAgICBwcm9wcy5jbGFzc05hbWUgPSBjbmIoJ1Njcm9sbGJhcnNDdXN0b20tVGh1bWInLCBheGlzID09PSBBWElTX0RJUkVDVElPTi5YID8gJ1Njcm9sbGJhcnNDdXN0b20tVGh1bWJYJyA6ICdTY3JvbGxiYXJzQ3VzdG9tLVRodW1iWScsIHByb3BzLmNsYXNzTmFtZSk7XG5cbiAgICBpZiAocHJvcHMucmVuZGVyZXIpIHtcbiAgICAgIHByb3BzLmF4aXMgPSBheGlzO1xuICAgIH1cblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KERyYWdnYWJsZUNvcmUsIHtcbiAgICAgIGFsbG93QW55Q2xpY2s6IGZhbHNlLFxuICAgICAgZW5hYmxlVXNlclNlbGVjdEhhY2s6IGZhbHNlLFxuICAgICAgb25Nb3VzZURvd246IHRoaXMuaGFuZGxlT25Nb3VzZURvd24sXG4gICAgICBvbkRyYWc6IHRoaXMuaGFuZGxlT25EcmFnLFxuICAgICAgb25TdGFydDogdGhpcy5oYW5kbGVPbkRyYWdTdGFydCxcbiAgICAgIG9uU3RvcDogdGhpcy5oYW5kbGVPbkRyYWdTdG9wLFxuICAgICAgbm9kZVJlZjogdGhpcy5lbGVtZW50UmVmSGFja1xuICAgIH0sIHJlbmRlckRpdldpdGhSZW5kZXJlcihwcm9wcywgdGhpcy5lbGVtZW50UmVmKSk7XG4gIH07XG5cbiAgU2Nyb2xsYmFyVGh1bWIuc2VsZWN0U3RhcnRSZXBsYWNlciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgcmV0dXJuIFNjcm9sbGJhclRodW1iO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG52YXIgU2Nyb2xsYmFyVHJhY2sgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU2Nyb2xsYmFyVHJhY2ssIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gU2Nyb2xsYmFyVHJhY2soKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5lbGVtZW50ID0gbnVsbDtcblxuICAgIF90aGlzLmVsZW1lbnRSZWYgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMuZWxlbWVudFJlZikpIF90aGlzLnByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIF90aGlzLmVsZW1lbnQgPSByZWY7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICBpZiAoIWV2IHx8ICFfdGhpcy5lbGVtZW50IHx8IGV2LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy5vbkNsaWNrKSAmJiBldi50YXJnZXQgPT09IF90aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFpc1VuZGVmKGV2Lm9mZnNldFgpKSB7XG4gICAgICAgICAgX3RoaXMucHJvcHMub25DbGljayhldiwge1xuICAgICAgICAgICAgYXhpczogX3RoaXMucHJvcHMuYXhpcyxcbiAgICAgICAgICAgIG9mZnNldDogX3RoaXMucHJvcHMuYXhpcyA9PT0gQVhJU19ESVJFQ1RJT04uWCA/IGV2Lm9mZnNldFggOiBldi5vZmZzZXRZXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gc3VwcG9ydCBmb3Igb2xkIGJyb3dzZXJzXG5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIHZhciByZWN0ID0gX3RoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG5cbiAgICAgICAgICBfdGhpcy5wcm9wcy5vbkNsaWNrKGV2LCB7XG4gICAgICAgICAgICBheGlzOiBfdGhpcy5wcm9wcy5heGlzLFxuICAgICAgICAgICAgb2Zmc2V0OiBfdGhpcy5wcm9wcy5heGlzID09PSBBWElTX0RJUkVDVElPTi5YID8gKGV2LmNsaWVudFggfHwgZXYudG91Y2hlc1swXS5jbGllbnRYKSAtIHJlY3QubGVmdCA6IChldi5jbGllbnRZIHx8IGV2LnRvdWNoZXNbMF0uY2xpZW50WSkgLSByZWN0LnRvcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBTY3JvbGxiYXJUcmFjay5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IHdhcyBub3QgY3JlYXRlZC4gUG9zc2libHkgeW91IGhhdmVuJ3QgcHJvdmlkZWQgSFRNTERpdkVsZW1lbnQgdG8gcmVuZGVyZXIncyBgZWxlbWVudFJlZmAgZnVuY3Rpb24uXCIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGljayk7XG4gIH07XG5cbiAgU2Nyb2xsYmFyVHJhY2sucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZWxlbWVudFJlZihudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgU2Nyb2xsYmFyVHJhY2sucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2EgPSB0aGlzLnByb3BzO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EuZWxlbWVudFJlZjtcbiAgICAgICAgdmFyIGF4aXMgPSBfYS5heGlzO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eub25DbGljaztcbiAgICAgICAgdmFyIHByb3BzID0gX19yZXN0KF9hLCBbXCJlbGVtZW50UmVmXCIsIFwiYXhpc1wiLCBcIm9uQ2xpY2tcIl0pO1xuXG4gICAgcHJvcHMuY2xhc3NOYW1lID0gY25iKCdTY3JvbGxiYXJzQ3VzdG9tLVRyYWNrJywgYXhpcyA9PT0gQVhJU19ESVJFQ1RJT04uWCA/ICdTY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWCcgOiAnU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1knLCBwcm9wcy5jbGFzc05hbWUpO1xuXG4gICAgaWYgKHByb3BzLnJlbmRlcmVyKSB7XG4gICAgICBwcm9wcy5heGlzID0gYXhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyRGl2V2l0aFJlbmRlcmVyKHByb3BzLCB0aGlzLmVsZW1lbnRSZWYpO1xuICB9O1xuXG4gIHJldHVybiBTY3JvbGxiYXJUcmFjaztcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIHN0eWxlID0ge1xuICBob2xkZXI6IHtcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIGhlaWdodDogJzEwMCUnXG4gIH0sXG4gIHdyYXBwZXI6IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB0b3A6IDAsXG4gICAgbGVmdDogMCxcbiAgICBib3R0b206IDAsXG4gICAgcmlnaHQ6IDBcbiAgfSxcbiAgY29udGVudDoge1xuICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnXG4gIH0sXG4gIHRyYWNrOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgIGJvcmRlclJhZGl1czogNCxcbiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLC4xKScsXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZSdcbiAgICB9LFxuICAgIHg6IHtcbiAgICAgIGhlaWdodDogMTAsXG4gICAgICB3aWR0aDogJ2NhbGMoMTAwJSAtIDIwcHgpJyxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDEwXG4gICAgfSxcbiAgICB5OiB7XG4gICAgICB3aWR0aDogMTAsXG4gICAgICBoZWlnaHQ6ICdjYWxjKDEwMCUgLSAyMHB4KScsXG4gICAgICB0b3A6IDEwXG4gICAgfVxuICB9LFxuICB0aHVtYjoge1xuICAgIGNvbW1vbjoge1xuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICBib3JkZXJSYWRpdXM6IDQsXG4gICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLDAsMCwuNCknXG4gICAgfSxcbiAgICB4OiB7XG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHdpZHRoOiAwXG4gICAgfSxcbiAgICB5OiB7XG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfVxuICB9XG59O1xuXG52YXIgcGFnZVpvb21MZXZlbCA9IGlzQnJvd3NlciA/IHpvb21MZXZlbCgpIDogMTtcblxuaWYgKGlzQnJvd3Nlcikge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgIHBhZ2Vab29tTGV2ZWwgPSB6b29tTGV2ZWwoKTtcbiAgfSwge1xuICAgIHBhc3NpdmU6IHRydWVcbiAgfSk7XG59XG5cbnZhciBTY3JvbGxiYXJDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIHBhcmVudFNjcm9sbGJhcjogbnVsbFxufSk7XG5cbnZhciBTY3JvbGxiYXIgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU2Nyb2xsYmFyLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIFNjcm9sbGJhcihwcm9wcykge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKSB8fCB0aGlzO1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCBjdXJyZW50IHNjcm9sbC1yZWxhdGVkIHZhbHVlcy48YnIvPlxyXG4gICAgICogSWYgPGk+Zm9yY2U8L2k+IGlmIHRydXRoeSAtIHdpbGwgcmVjYWxjdWxhdGUgdGhlbSBpbnN0ZWFkIG9mIHJldHVybmluZyBjYWNoZWQgdmFsdWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gU2Nyb2xsU3RhdGVcclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5nZXRTY3JvbGxTdGF0ZSA9IGZ1bmN0aW9uIChmb3JjZSkge1xuICAgICAgaWYgKGZvcmNlID09PSB2b2lkIDApIHtcbiAgICAgICAgZm9yY2UgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLnNjcm9sbFZhbHVlcyAmJiAhZm9yY2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKHt9LCBfdGhpcy5zY3JvbGxWYWx1ZXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2Nyb2xsU3RhdGUgPSB7XG4gICAgICAgIGNsaWVudEhlaWdodDogMCxcbiAgICAgICAgY2xpZW50V2lkdGg6IDAsXG4gICAgICAgIGNvbnRlbnRTY3JvbGxIZWlnaHQ6IDAsXG4gICAgICAgIGNvbnRlbnRTY3JvbGxXaWR0aDogMCxcbiAgICAgICAgc2Nyb2xsSGVpZ2h0OiAwLFxuICAgICAgICBzY3JvbGxXaWR0aDogMCxcbiAgICAgICAgc2Nyb2xsVG9wOiAwLFxuICAgICAgICBzY3JvbGxMZWZ0OiAwLFxuICAgICAgICBzY3JvbGxZQmxvY2tlZDogZmFsc2UsXG4gICAgICAgIHNjcm9sbFhCbG9ja2VkOiBmYWxzZSxcbiAgICAgICAgc2Nyb2xsWVBvc3NpYmxlOiBmYWxzZSxcbiAgICAgICAgc2Nyb2xsWFBvc3NpYmxlOiBmYWxzZSxcbiAgICAgICAgdHJhY2tZVmlzaWJsZTogZmFsc2UsXG4gICAgICAgIHRyYWNrWFZpc2libGU6IGZhbHNlLFxuICAgICAgICB6b29tTGV2ZWw6IHBhZ2Vab29tTGV2ZWwgKiAxLFxuICAgICAgICBpc1JUTDogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgICAgdmFyIHByb3BzID0gX3RoaXMucHJvcHM7XG4gICAgICBzY3JvbGxTdGF0ZS5pc1JUTCA9IF90aGlzLnN0YXRlLmlzUlRMO1xuICAgICAgc2Nyb2xsU3RhdGUuc2Nyb2xsWUJsb2NrZWQgPSBwcm9wcy5ub1Njcm9sbCB8fCBwcm9wcy5ub1Njcm9sbFk7XG4gICAgICBzY3JvbGxTdGF0ZS5zY3JvbGxYQmxvY2tlZCA9IHByb3BzLm5vU2Nyb2xsIHx8IHByb3BzLm5vU2Nyb2xsWDtcblxuICAgICAgaWYgKF90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICBzY3JvbGxTdGF0ZS5jbGllbnRIZWlnaHQgPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICBzY3JvbGxTdGF0ZS5jbGllbnRXaWR0aCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgc2Nyb2xsU3RhdGUuc2Nyb2xsSGVpZ2h0ID0gX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgc2Nyb2xsU3RhdGUuc2Nyb2xsV2lkdGggPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbFRvcCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICAgIHNjcm9sbFN0YXRlLnNjcm9sbExlZnQgPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgc2Nyb2xsU3RhdGUuc2Nyb2xsWVBvc3NpYmxlID0gIXNjcm9sbFN0YXRlLnNjcm9sbFlCbG9ja2VkICYmIHNjcm9sbFN0YXRlLnNjcm9sbEhlaWdodCA+IHNjcm9sbFN0YXRlLmNsaWVudEhlaWdodDtcbiAgICAgICAgc2Nyb2xsU3RhdGUuc2Nyb2xsWFBvc3NpYmxlID0gIXNjcm9sbFN0YXRlLnNjcm9sbFhCbG9ja2VkICYmIHNjcm9sbFN0YXRlLnNjcm9sbFdpZHRoID4gc2Nyb2xsU3RhdGUuY2xpZW50V2lkdGg7XG4gICAgICAgIHNjcm9sbFN0YXRlLnRyYWNrWVZpc2libGUgPSBzY3JvbGxTdGF0ZS5zY3JvbGxZUG9zc2libGUgfHwgcHJvcHMucGVybWFuZW50VHJhY2tzIHx8IHByb3BzLnBlcm1hbmVudFRyYWNrWTtcbiAgICAgICAgc2Nyb2xsU3RhdGUudHJhY2tYVmlzaWJsZSA9IHNjcm9sbFN0YXRlLnNjcm9sbFhQb3NzaWJsZSB8fCBwcm9wcy5wZXJtYW5lbnRUcmFja3MgfHwgcHJvcHMucGVybWFuZW50VHJhY2tYO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMuY29udGVudEVsZW1lbnQpIHtcbiAgICAgICAgc2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbEhlaWdodCA9IF90aGlzLmNvbnRlbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgc2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbFdpZHRoID0gX3RoaXMuY29udGVudEVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzY3JvbGxTdGF0ZTtcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNjcm9sbCB0byB0b3AgYm9yZGVyXHJcbiAgICAgKi9cblxuXG4gICAgX3RoaXMuc2Nyb2xsVG9Ub3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTY3JvbGwgdG8gbGVmdCBib3JkZXJcclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5zY3JvbGxUb0xlZnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2Nyb2xsIHRvIGJvdHRvbSBib3JkZXJcclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5zY3JvbGxUb0JvdHRvbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxIZWlnaHQgLSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfTtcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTY3JvbGwgdG8gcmlnaHQgYm9yZGVyXHJcbiAgICAgKi9cblxuXG4gICAgX3RoaXMuc2Nyb2xsVG9SaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsV2lkdGggLSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9O1xuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNldCB0aGUgc2Nyb2xscyBhdCBnaXZlbiBjb29yZGluYXRlcy48YnIvPlxyXG4gICAgICogSWYgY29vcmRpbmF0ZSBpcyB1bmRlZmluZWQgLSBjdXJyZW50IHNjcm9sbCB2YWx1ZSB3aWxsIHBlcnNpc3QuXHJcbiAgICAgKi9cblxuXG4gICAgX3RoaXMuc2Nyb2xsVG8gPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgaWYgKF90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICBpZiAoaXNOdW0oeCkpIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0geDtcbiAgICAgICAgaWYgKGlzTnVtKHkpKSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0geTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2VudGVyIHRoZSB2aWV3cG9ydCBhdCBnaXZlbiBjb29yZGluYXRlcy48YnIvPlxyXG4gICAgICogSWYgY29vcmRpbmF0ZSBpcyB1bmRlZmluZWQgLSBjdXJyZW50IHNjcm9sbCB2YWx1ZSB3aWxsIHBlcnNpc3QuXHJcbiAgICAgKi9cblxuXG4gICAgX3RoaXMuY2VudGVyQXQgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgaWYgKF90aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICBpZiAoaXNOdW0oeCkpIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0geCAtIF90aGlzLnNjcm9sbGVyRWxlbWVudC5jbGllbnRXaWR0aCAvIDI7XG4gICAgICAgIGlmIChpc051bSh5KSkgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IHkgLSBfdGhpcy5zY3JvbGxlckVsZW1lbnQuY2xpZW50SGVpZ2h0IC8gMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH07XG5cbiAgICBfdGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoZm9yY2UpIHtcbiAgICAgIGlmIChmb3JjZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGZvcmNlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghX3RoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gYXV0b2RldGVjdCBkaXJlY3Rpb24gaWYgbm90IGRlZmluZWRcblxuXG4gICAgICBpZiAoaXNVbmRlZihfdGhpcy5zdGF0ZS5pc1JUTCkpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGlzUlRMOiBnZXRDb21wdXRlZFN0eWxlKF90aGlzLnNjcm9sbGVyRWxlbWVudCkuZGlyZWN0aW9uID09PSAncnRsJ1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gX3RoaXMuZ2V0U2Nyb2xsU3RhdGUoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNjcm9sbFN0YXRlID0gX3RoaXMuZ2V0U2Nyb2xsU3RhdGUodHJ1ZSk7XG5cbiAgICAgIHZhciBwcmV2U2Nyb2xsU3RhdGUgPSBfX2Fzc2lnbih7fSwgX3RoaXMuc2Nyb2xsVmFsdWVzKTtcblxuICAgICAgdmFyIHByb3BzID0gX3RoaXMucHJvcHM7XG4gICAgICB2YXIgYml0bWFzayA9IDA7XG5cbiAgICAgIGlmICghZm9yY2UpIHtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5jbGllbnRIZWlnaHQgIT09IHNjcm9sbFN0YXRlLmNsaWVudEhlaWdodCkgYml0bWFzayB8PSBNYXRoLnRydW5jKDEpO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLmNsaWVudFdpZHRoICE9PSBzY3JvbGxTdGF0ZS5jbGllbnRXaWR0aCkgYml0bWFzayB8PSAxIDw8IDE7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsSGVpZ2h0ICE9PSBzY3JvbGxTdGF0ZS5zY3JvbGxIZWlnaHQpIGJpdG1hc2sgfD0gMSA8PCAyO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbFdpZHRoICE9PSBzY3JvbGxTdGF0ZS5zY3JvbGxXaWR0aCkgYml0bWFzayB8PSAxIDw8IDM7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsVG9wICE9PSBzY3JvbGxTdGF0ZS5zY3JvbGxUb3ApIGJpdG1hc2sgfD0gMSA8PCA0O1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbExlZnQgIT09IHNjcm9sbFN0YXRlLnNjcm9sbExlZnQpIGJpdG1hc2sgfD0gMSA8PCA1O1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnNjcm9sbFlCbG9ja2VkICE9PSBzY3JvbGxTdGF0ZS5zY3JvbGxZQmxvY2tlZCkgYml0bWFzayB8PSAxIDw8IDY7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWEJsb2NrZWQgIT09IHNjcm9sbFN0YXRlLnNjcm9sbFhCbG9ja2VkKSBiaXRtYXNrIHw9IDEgPDwgNztcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxZUG9zc2libGUgIT09IHNjcm9sbFN0YXRlLnNjcm9sbFlQb3NzaWJsZSkgYml0bWFzayB8PSAxIDw8IDg7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWFBvc3NpYmxlICE9PSBzY3JvbGxTdGF0ZS5zY3JvbGxYUG9zc2libGUpIGJpdG1hc2sgfD0gMSA8PCA5O1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLnRyYWNrWVZpc2libGUgIT09IHNjcm9sbFN0YXRlLnRyYWNrWVZpc2libGUpIGJpdG1hc2sgfD0gMSA8PCAxMDtcbiAgICAgICAgaWYgKHByZXZTY3JvbGxTdGF0ZS50cmFja1hWaXNpYmxlICE9PSBzY3JvbGxTdGF0ZS50cmFja1hWaXNpYmxlKSBiaXRtYXNrIHw9IDEgPDwgMTE7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuaXNSVEwgIT09IHNjcm9sbFN0YXRlLmlzUlRMKSBiaXRtYXNrIHw9IDEgPDwgMTI7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbEhlaWdodCAhPT0gc2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbEhlaWdodCkgYml0bWFzayB8PSAxIDw8IDEzO1xuICAgICAgICBpZiAocHJldlNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxXaWR0aCAhPT0gc2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbFdpZHRoKSBiaXRtYXNrIHw9IDEgPDwgMTQ7XG4gICAgICAgIGlmIChwcmV2U2Nyb2xsU3RhdGUuem9vbUxldmVsICE9PSBzY3JvbGxTdGF0ZS56b29tTGV2ZWwpIGJpdG1hc2sgfD0gMSA8PCAxNTsgLy8gaWYgbm90IGZvcmNlZCBhbmQgbm90aGluZyBoYXMgY2hhbmdlZCAtIHNraXAgdGhpcyB1cGRhdGVcblxuICAgICAgICBpZiAoYml0bWFzayA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBwcmV2U2Nyb2xsU3RhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpdG1hc2sgPSAzMjc2NztcbiAgICAgIH1cblxuICAgICAgaWYgKCFwcm9wcy5uYXRpdmUgJiYgX3RoaXMuaG9sZGVyRWxlbWVudCkge1xuICAgICAgICBpZiAoYml0bWFzayAmIDEgPDwgMTMgJiYgKHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyIHx8IHByb3BzLnRyYW5zbGF0ZUNvbnRlbnRTaXplWVRvSG9sZGVyKSkge1xuICAgICAgICAgIF90aGlzLmhvbGRlckVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQoc2Nyb2xsU3RhdGUuY29udGVudFNjcm9sbEhlaWdodCwgXCJweFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiaXRtYXNrICYgMSA8PCAxNCAmJiAocHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVzVG9Ib2xkZXIgfHwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVYVG9Ib2xkZXIpKSB7XG4gICAgICAgICAgX3RoaXMuaG9sZGVyRWxlbWVudC5zdHlsZS53aWR0aCA9IFwiXCIuY29uY2F0KHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxXaWR0aCwgXCJweFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZXNUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVlUb0hvbGRlciB8fCBwcm9wcy50cmFuc2xhdGVDb250ZW50U2l6ZVhUb0hvbGRlcikge1xuICAgICAgICAgIGlmICghc2Nyb2xsU3RhdGUuY2xpZW50SGVpZ2h0ICYmIHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxIZWlnaHQgfHwgIXNjcm9sbFN0YXRlLmNsaWVudFdpZHRoICYmIHNjcm9sbFN0YXRlLmNvbnRlbnRTY3JvbGxXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBpZiBzY3JvbGxiYXJzIHZpc2liaWxpdHkgaGFzIGNoYW5nZWRcblxuXG4gICAgICBpZiAoYml0bWFzayAmIDEgPDwgMTAgfHwgYml0bWFzayAmIDEgPDwgMTEpIHtcbiAgICAgICAgcHJldlNjcm9sbFN0YXRlLnNjcm9sbFlCbG9ja2VkID0gc2Nyb2xsU3RhdGUuc2Nyb2xsWUJsb2NrZWQ7XG4gICAgICAgIHByZXZTY3JvbGxTdGF0ZS5zY3JvbGxYQmxvY2tlZCA9IHNjcm9sbFN0YXRlLnNjcm9sbFhCbG9ja2VkO1xuICAgICAgICBwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWVBvc3NpYmxlID0gc2Nyb2xsU3RhdGUuc2Nyb2xsWVBvc3NpYmxlO1xuICAgICAgICBwcmV2U2Nyb2xsU3RhdGUuc2Nyb2xsWFBvc3NpYmxlID0gc2Nyb2xsU3RhdGUuc2Nyb2xsWFBvc3NpYmxlO1xuXG4gICAgICAgIGlmIChfdGhpcy50cmFja1lFbGVtZW50ICYmIGJpdG1hc2sgJiAxIDw8IDEwKSB7XG4gICAgICAgICAgX3RoaXMudHJhY2tZRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gc2Nyb2xsU3RhdGUudHJhY2tZVmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF90aGlzLnRyYWNrWEVsZW1lbnQgJiYgYml0bWFzayAmIDEgPDwgMTEpIHtcbiAgICAgICAgICBfdGhpcy50cmFja1hFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBzY3JvbGxTdGF0ZS50cmFja1hWaXNpYmxlID8gJycgOiAnbm9uZSc7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5zY3JvbGxWYWx1ZXMgPSBwcmV2U2Nyb2xsU3RhdGU7XG5cbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHRyYWNrWVZpc2libGU6IF90aGlzLnNjcm9sbFZhbHVlcy50cmFja1lWaXNpYmxlID0gc2Nyb2xsU3RhdGUudHJhY2tZVmlzaWJsZSxcbiAgICAgICAgICB0cmFja1hWaXNpYmxlOiBfdGhpcy5zY3JvbGxWYWx1ZXMudHJhY2tYVmlzaWJsZSA9IHNjcm9sbFN0YXRlLnRyYWNrWFZpc2libGVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAocHJvcHMubmF0aXZlID8gX3RoaXMudXBkYXRlck5hdGl2ZSA6IF90aGlzLnVwZGF0ZXJDdXN0b20pKGJpdG1hc2ssIHNjcm9sbFN0YXRlKTtcbiAgICAgIF90aGlzLnNjcm9sbFZhbHVlcyA9IHNjcm9sbFN0YXRlO1xuXG4gICAgICBpZiAoIXByb3BzLm5hdGl2ZSAmJiBiaXRtYXNrICYgMSA8PCAxNSkge1xuICAgICAgICBnZXRTY3JvbGxiYXJXaWR0aCh0cnVlKTtcblxuICAgICAgICBfdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5ldmVudEVtaXR0ZXIuZW1pdCgndXBkYXRlJywgX19hc3NpZ24oe30sIHNjcm9sbFN0YXRlKSwgcHJldlNjcm9sbFN0YXRlKTtcblxuICAgICAgaWYgKGJpdG1hc2sgJiAxIDw8IDQgfHwgYml0bWFzayAmIDEgPDwgNSkgX3RoaXMuZXZlbnRFbWl0dGVyLmVtaXQoJ3Njcm9sbCcsIF9fYXNzaWduKHt9LCBzY3JvbGxTdGF0ZSksIHByZXZTY3JvbGxTdGF0ZSk7XG4gICAgICByZXR1cm4gX3RoaXMuc2Nyb2xsVmFsdWVzO1xuICAgIH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG5cblxuICAgIF90aGlzLnVwZGF0ZXJOYXRpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBqdXN0IGZvciBmdXR1cmVcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBfdGhpcy51cGRhdGVyQ3VzdG9tID0gZnVuY3Rpb24gKGJpdG1hc2ssIHNjcm9sbFZhbHVlcykge1xuICAgICAgdmFyIHByb3BzID0gX3RoaXMucHJvcHM7XG5cbiAgICAgIGlmIChfdGhpcy50cmFja1lFbGVtZW50KSB7XG4gICAgICAgIGlmIChfdGhpcy50aHVtYllFbGVtZW50ICYmIChiaXRtYXNrICYgTWF0aC50cnVuYygxKSB8fCBiaXRtYXNrICYgMSA8PCAyIHx8IGJpdG1hc2sgJiAxIDw8IDQgfHwgYml0bWFzayAmIDEgPDwgNiB8fCBiaXRtYXNrICYgMSA8PCA4KSkge1xuICAgICAgICAgIGlmIChzY3JvbGxWYWx1ZXMuc2Nyb2xsWVBvc3NpYmxlKSB7XG4gICAgICAgICAgICB2YXIgdHJhY2tJbm5lclNpemUgPSBnZXRJbm5lckhlaWdodChfdGhpcy50cmFja1lFbGVtZW50KTtcbiAgICAgICAgICAgIHZhciB0aHVtYlNpemUgPSBjYWxjVGh1bWJTaXplKHNjcm9sbFZhbHVlcy5zY3JvbGxIZWlnaHQsIHNjcm9sbFZhbHVlcy5jbGllbnRIZWlnaHQsIHRyYWNrSW5uZXJTaXplLCBwcm9wcy5taW5pbWFsVGh1bWJZU2l6ZSB8fCBwcm9wcy5taW5pbWFsVGh1bWJTaXplLCBwcm9wcy5tYXhpbWFsVGh1bWJZU2l6ZSB8fCBwcm9wcy5tYXhpbWFsVGh1bWJTaXplKTtcbiAgICAgICAgICAgIHZhciB0aHVtYk9mZnNldCA9IGNhbGNUaHVtYk9mZnNldChzY3JvbGxWYWx1ZXMuc2Nyb2xsSGVpZ2h0LCBzY3JvbGxWYWx1ZXMuY2xpZW50SGVpZ2h0LCB0cmFja0lubmVyU2l6ZSwgdGh1bWJTaXplLCBzY3JvbGxWYWx1ZXMuc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgIF90aGlzLnRodW1iWUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGVZKFwiLmNvbmNhdCh0aHVtYk9mZnNldCwgXCJweClcIik7XG4gICAgICAgICAgICBfdGhpcy50aHVtYllFbGVtZW50LnN0eWxlLmhlaWdodCA9IFwiXCIuY29uY2F0KHRodW1iU2l6ZSwgXCJweFwiKTtcbiAgICAgICAgICAgIF90aGlzLnRodW1iWUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy50aHVtYllFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgICAgICAgICAgX3RoaXMudGh1bWJZRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMHB4JztcbiAgICAgICAgICAgIF90aGlzLnRodW1iWUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLnRyYWNrWEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKF90aGlzLnRodW1iWEVsZW1lbnQgJiYgKGJpdG1hc2sgJiAxIDw8IDEgfHwgYml0bWFzayAmIDEgPDwgMyB8fCBiaXRtYXNrICYgMSA8PCA1IHx8IGJpdG1hc2sgJiAxIDw8IDcgfHwgYml0bWFzayAmIDEgPDwgOSB8fCBiaXRtYXNrICYgMSA8PCAxMikpIHtcbiAgICAgICAgICBpZiAoc2Nyb2xsVmFsdWVzLnNjcm9sbFhQb3NzaWJsZSkge1xuICAgICAgICAgICAgdmFyIHRyYWNrSW5uZXJTaXplID0gZ2V0SW5uZXJXaWR0aChfdGhpcy50cmFja1hFbGVtZW50KTtcbiAgICAgICAgICAgIHZhciB0aHVtYlNpemUgPSBjYWxjVGh1bWJTaXplKHNjcm9sbFZhbHVlcy5zY3JvbGxXaWR0aCwgc2Nyb2xsVmFsdWVzLmNsaWVudFdpZHRoLCB0cmFja0lubmVyU2l6ZSwgcHJvcHMubWluaW1hbFRodW1iWFNpemUgfHwgcHJvcHMubWluaW1hbFRodW1iU2l6ZSwgcHJvcHMubWF4aW1hbFRodW1iWFNpemUgfHwgcHJvcHMubWF4aW1hbFRodW1iU2l6ZSk7XG4gICAgICAgICAgICB2YXIgdGh1bWJPZmZzZXQgPSBjYWxjVGh1bWJPZmZzZXQoc2Nyb2xsVmFsdWVzLnNjcm9sbFdpZHRoLCBzY3JvbGxWYWx1ZXMuY2xpZW50V2lkdGgsIHRyYWNrSW5uZXJTaXplLCB0aHVtYlNpemUsIHNjcm9sbFZhbHVlcy5zY3JvbGxMZWZ0KTtcblxuICAgICAgICAgICAgaWYgKF90aGlzLnN0YXRlLmlzUlRMICYmIHNob3VsZFJldmVyc2VSdGxTY3JvbGwoKSkge1xuICAgICAgICAgICAgICB0aHVtYk9mZnNldCArPSB0cmFja0lubmVyU2l6ZSAtIHRodW1iU2l6ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX3RoaXMudGh1bWJYRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBcInRyYW5zbGF0ZVgoXCIuY29uY2F0KHRodW1iT2Zmc2V0LCBcInB4KVwiKTtcbiAgICAgICAgICAgIF90aGlzLnRodW1iWEVsZW1lbnQuc3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdCh0aHVtYlNpemUsIFwicHhcIik7XG4gICAgICAgICAgICBfdGhpcy50aHVtYlhFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMudGh1bWJYRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgICAgICAgICAgIF90aGlzLnRodW1iWEVsZW1lbnQuc3R5bGUud2lkdGggPSAnMHB4JztcbiAgICAgICAgICAgIF90aGlzLnRodW1iWEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZIb2xkZXIgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy5ob2xkZXJFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmV3JhcHBlciA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLndyYXBwZXJFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMud3JhcHBlclByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLndyYXBwZXJQcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZTY3JvbGxlciA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLnNjcm9sbGVyUHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMuc2Nyb2xsZXJQcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZDb250ZW50ID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMuY29udGVudEVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy5jb250ZW50UHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMuY29udGVudFByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZlRyYWNrWCA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLnRyYWNrWEVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy50cmFja1hQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy50cmFja1hQcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmVsZW1lbnRSZWZUcmFja1kgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICBfdGhpcy50cmFja1lFbGVtZW50ID0gcmVmO1xuXG4gICAgICBpZiAoaXNGdW4oX3RoaXMucHJvcHMudHJhY2tZUHJvcHMuZWxlbWVudFJlZikpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudHJhY2tZUHJvcHMuZWxlbWVudFJlZihyZWYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5lbGVtZW50UmVmVGh1bWJYID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgX3RoaXMudGh1bWJYRWxlbWVudCA9IHJlZjtcblxuICAgICAgaWYgKGlzRnVuKF90aGlzLnByb3BzLnRodW1iWFByb3BzLmVsZW1lbnRSZWYpKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRodW1iWFByb3BzLmVsZW1lbnRSZWYocmVmKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuZWxlbWVudFJlZlRodW1iWSA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgIF90aGlzLnRodW1iWUVsZW1lbnQgPSByZWY7XG5cbiAgICAgIGlmIChpc0Z1bihfdGhpcy5wcm9wcy50aHVtYllQcm9wcy5lbGVtZW50UmVmKSkge1xuICAgICAgICBfdGhpcy5wcm9wcy50aHVtYllQcm9wcy5lbGVtZW50UmVmKHJlZik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRyYWNrWENsaWNrID0gZnVuY3Rpb24gKGV2LCB2YWx1ZXMpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy50cmFja1hQcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRyYWNrWFByb3BzLm9uQ2xpY2soZXYsIHZhbHVlcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghX3RoaXMuc2Nyb2xsZXJFbGVtZW50IHx8ICFfdGhpcy50cmFja1hFbGVtZW50IHx8ICFfdGhpcy50aHVtYlhFbGVtZW50IHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMgfHwgIV90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxYUG9zc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uKCk7XG5cbiAgICAgIHZhciB0aHVtYlNpemUgPSBfdGhpcy50aHVtYlhFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgdmFyIHRyYWNrSW5uZXJTaXplID0gZ2V0SW5uZXJXaWR0aChfdGhpcy50cmFja1hFbGVtZW50KTtcbiAgICAgIHZhciB0aHVtYk9mZnNldCA9IChfdGhpcy5zY3JvbGxWYWx1ZXMuaXNSVEwgJiYgc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbCgpID8gdmFsdWVzLm9mZnNldCArIHRodW1iU2l6ZSAvIDIgLSB0cmFja0lubmVyU2l6ZSA6IHZhbHVlcy5vZmZzZXQgLSB0aHVtYlNpemUgLyAyKSAtIChOdW1iZXIucGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKF90aGlzLnRyYWNrWEVsZW1lbnQpLnBhZGRpbmdMZWZ0KSB8fCAwKTtcbiAgICAgIHZhciB0YXJnZXQgPSBjYWxjU2Nyb2xsRm9yVGh1bWJPZmZzZXQoX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFdpZHRoLCBfdGhpcy5zY3JvbGxWYWx1ZXMuY2xpZW50V2lkdGgsIHRyYWNrSW5uZXJTaXplLCB0aHVtYlNpemUsIHRodW1iT2Zmc2V0KTtcblxuICAgICAgaWYgKF90aGlzLnByb3BzLnRyYWNrQ2xpY2tCZWhhdmlvciA9PT0gVFJBQ0tfQ0xJQ0tfQkVIQVZJT1IuU1RFUCkge1xuICAgICAgICB0YXJnZXQgPSAoX3RoaXMuc2Nyb2xsVmFsdWVzLmlzUlRMID8gX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbExlZnQgPiB0YXJnZXQgOiBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsTGVmdCA8IHRhcmdldCkgPyBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsTGVmdCArIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRXaWR0aCA6IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxMZWZ0IC0gX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudFdpZHRoO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsTGVmdCA9IHRhcmdldDtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVHJhY2tZQ2xpY2sgPSBmdW5jdGlvbiAoZXYsIHZhbHVlcykge1xuICAgICAgaWYgKF90aGlzLnByb3BzLnRyYWNrWVByb3BzLm9uQ2xpY2spIF90aGlzLnByb3BzLnRyYWNrWVByb3BzLm9uQ2xpY2soZXYsIHZhbHVlcyk7XG5cbiAgICAgIGlmICghX3RoaXMuc2Nyb2xsZXJFbGVtZW50IHx8ICFfdGhpcy50cmFja1lFbGVtZW50IHx8ICFfdGhpcy50aHVtYllFbGVtZW50IHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMgfHwgIV90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxZUG9zc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uKCk7XG5cbiAgICAgIHZhciB0aHVtYlNpemUgPSBfdGhpcy50aHVtYllFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIHZhciB0YXJnZXQgPSBjYWxjU2Nyb2xsRm9yVGh1bWJPZmZzZXQoX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbEhlaWdodCwgX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudEhlaWdodCwgZ2V0SW5uZXJIZWlnaHQoX3RoaXMudHJhY2tZRWxlbWVudCksIHRodW1iU2l6ZSwgdmFsdWVzLm9mZnNldCAtIHRodW1iU2l6ZSAvIDIpIC0gKE51bWJlci5wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoX3RoaXMudHJhY2tZRWxlbWVudCkucGFkZGluZ1RvcCkgfHwgMCk7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy50cmFja0NsaWNrQmVoYXZpb3IgPT09IFRSQUNLX0NMSUNLX0JFSEFWSU9SLkpVTVApIHtcbiAgICAgICAgX3RoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IHRhcmdldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsVG9wIDwgdGFyZ2V0ID8gX3RoaXMuc2Nyb2xsVmFsdWVzLnNjcm9sbFRvcCArIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRIZWlnaHQgOiBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsVG9wIC0gX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudEhlaWdodDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVHJhY2tZTW91c2VXaGVlbCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgdmFyIHByb3BzID0gX3RoaXMucHJvcHM7XG5cbiAgICAgIGlmIChwcm9wcy50cmFja1lQcm9wcyAmJiBwcm9wcy50cmFja1lQcm9wcy5vbldoZWVsKSB7XG4gICAgICAgIHByb3BzLnRyYWNrWVByb3BzLm9uV2hlZWwoZXYpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuZGlzYWJsZVRyYWNrc01vdXNld2hlZWxTY3JvbGxpbmcgfHwgcHJvcHMuZGlzYWJsZVRyYWNrWU1vdXNld2hlZWxTY3JvbGxpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uKCk7XG5cbiAgICAgIGlmICghX3RoaXMuc2Nyb2xsZXJFbGVtZW50IHx8IF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxZQmxvY2tlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnNjcm9sbFRvcCArPSBldi5kZWx0YVk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRyYWNrWE1vdXNlV2hlZWwgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgIHZhciBwcm9wcyA9IF90aGlzLnByb3BzO1xuXG4gICAgICBpZiAocHJvcHMudHJhY2tYUHJvcHMgJiYgcHJvcHMudHJhY2tYUHJvcHMub25XaGVlbCkge1xuICAgICAgICBwcm9wcy50cmFja1hQcm9wcy5vbldoZWVsKGV2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmRpc2FibGVUcmFja3NNb3VzZXdoZWVsU2Nyb2xsaW5nIHx8IHByb3BzLmRpc2FibGVUcmFja1hNb3VzZXdoZWVsU2Nyb2xsaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbigpO1xuXG4gICAgICBpZiAoIV90aGlzLnNjcm9sbGVyRWxlbWVudCB8fCBfdGhpcy5zY3JvbGxWYWx1ZXMuc2Nyb2xsWEJsb2NrZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zY3JvbGxMZWZ0ICs9IGV2LmRlbHRhWDtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVGh1bWJYRHJhZyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICB2YXIgX2E7XG5cbiAgICAgIGlmICghX3RoaXMudHJhY2tYRWxlbWVudCB8fCAhX3RoaXMudGh1bWJYRWxlbWVudCB8fCAhX3RoaXMuc2Nyb2xsZXJFbGVtZW50IHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMgfHwgIV90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxYUG9zc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uKCk7XG5cbiAgICAgIHZhciB0cmFja1JlY3QgPSBfdGhpcy50cmFja1hFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICB2YXIgc3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZShfdGhpcy50cmFja1hFbGVtZW50KTtcbiAgICAgIHZhciBwYWRkaW5nTGVmdCA9IE51bWJlci5wYXJzZUZsb2F0KHN0eWxlcy5wYWRkaW5nTGVmdCkgfHwgMDtcbiAgICAgIHZhciBwYWRkaW5nUmlnaHQgPSBOdW1iZXIucGFyc2VGbG9hdChzdHlsZXMucGFkZGluZ1JpZ2h0KSB8fCAwO1xuICAgICAgdmFyIHRyYWNrSW5uZXJTaXplID0gdHJhY2tSZWN0LndpZHRoIC0gcGFkZGluZ0xlZnQgLSBwYWRkaW5nUmlnaHQ7XG4gICAgICB2YXIgdGh1bWJTaXplID0gX3RoaXMudGh1bWJYRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIHZhciBvZmZzZXQgPSBfdGhpcy5zY3JvbGxWYWx1ZXMuaXNSVEwgJiYgc2hvdWxkUmV2ZXJzZVJ0bFNjcm9sbCgpID8gZGF0YS54ICsgdGh1bWJTaXplIC0gdHJhY2tJbm5lclNpemUgKyBwYWRkaW5nTGVmdCA6IGRhdGEubGFzdFggLSBwYWRkaW5nTGVmdDtcbiAgICAgIF90aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0gY2FsY1Njcm9sbEZvclRodW1iT2Zmc2V0KF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxXaWR0aCwgX3RoaXMuc2Nyb2xsVmFsdWVzLmNsaWVudFdpZHRoLCB0cmFja0lubmVyU2l6ZSwgdGh1bWJTaXplLCBvZmZzZXQpO1xuXG4gICAgICBpZiAoKF9hID0gX3RoaXMucHJvcHMudGh1bWJYUHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkRyYWcpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudGh1bWJYUHJvcHMub25EcmFnKGRhdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUaHVtYlhEcmFnRW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgX3RoaXMuaGFuZGxlVGh1bWJYRHJhZyhkYXRhKTtcblxuICAgICAgaWYgKChfYSA9IF90aGlzLnByb3BzLnRodW1iWFByb3BzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25EcmFnRW5kKSB7XG4gICAgICAgIF90aGlzLnByb3BzLnRodW1iWFByb3BzLm9uRHJhZ0VuZChkYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVGh1bWJZRHJhZyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICB2YXIgX2E7XG5cbiAgICAgIGlmICghX3RoaXMuc2Nyb2xsZXJFbGVtZW50IHx8ICFfdGhpcy50cmFja1lFbGVtZW50IHx8ICFfdGhpcy50aHVtYllFbGVtZW50IHx8ICFfdGhpcy5zY3JvbGxWYWx1ZXMgfHwgIV90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxZUG9zc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uKCk7XG5cbiAgICAgIHZhciB0cmFja1JlY3QgPSBfdGhpcy50cmFja1lFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICB2YXIgc3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZShfdGhpcy50cmFja1lFbGVtZW50KTtcbiAgICAgIHZhciBwYWRkaW5nVG9wID0gTnVtYmVyLnBhcnNlRmxvYXQoc3R5bGVzLnBhZGRpbmdUb3ApIHx8IDA7XG4gICAgICB2YXIgcGFkZGluZ0JvdHRvbSA9IE51bWJlci5wYXJzZUZsb2F0KHN0eWxlcy5wYWRkaW5nQm90dG9tKSB8fCAwO1xuICAgICAgdmFyIHRyYWNrSW5uZXJTaXplID0gdHJhY2tSZWN0LmhlaWdodCAtIHBhZGRpbmdUb3AgLSBwYWRkaW5nQm90dG9tO1xuICAgICAgdmFyIHRodW1iU2l6ZSA9IF90aGlzLnRodW1iWUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgdmFyIG9mZnNldCA9IGRhdGEueSAtIHBhZGRpbmdUb3A7XG4gICAgICBfdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gY2FsY1Njcm9sbEZvclRodW1iT2Zmc2V0KF90aGlzLnNjcm9sbFZhbHVlcy5zY3JvbGxIZWlnaHQsIF90aGlzLnNjcm9sbFZhbHVlcy5jbGllbnRIZWlnaHQsIHRyYWNrSW5uZXJTaXplLCB0aHVtYlNpemUsIG9mZnNldCk7XG5cbiAgICAgIGlmICgoX2EgPSBfdGhpcy5wcm9wcy50aHVtYllQcm9wcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uRHJhZykge1xuICAgICAgICBfdGhpcy5wcm9wcy50aHVtYllQcm9wcy5vbkRyYWcoZGF0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRodW1iWURyYWdFbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBfdGhpcy5oYW5kbGVUaHVtYllEcmFnKGRhdGEpO1xuXG4gICAgICBpZiAoKF9hID0gX3RoaXMucHJvcHMudGh1bWJZUHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkRyYWdFbmQpIHtcbiAgICAgICAgX3RoaXMucHJvcHMudGh1bWJZUHJvcHMub25EcmFnRW5kKGRhdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVTY3JvbGxlclNjcm9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb24oKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuX3Njcm9sbERldGVjdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3RoaXMuX3Njcm9sbERldGVjdGlvblRPKSB7XG4gICAgICAgIF90aGlzLmV2ZW50RW1pdHRlci5lbWl0KCdzY3JvbGxTdGFydCcsIF90aGlzLmdldFNjcm9sbFN0YXRlKCkpO1xuICAgICAgfSBlbHNlIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uVE8pO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uVE8gPSBpc0Jyb3dzZXIgPyB3aW5kb3cuc2V0VGltZW91dChfdGhpcy5fc2Nyb2xsRGV0ZWN0aW9uQ2FsbGJhY2ssIF90aGlzLnByb3BzLnNjcm9sbERldGVjdGlvblRocmVzaG9sZCB8fCAwKSA6IG51bGw7XG4gICAgfTtcblxuICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb25DYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLl9zY3JvbGxEZXRlY3Rpb25UTyA9IG51bGw7XG5cbiAgICAgIF90aGlzLmV2ZW50RW1pdHRlci5lbWl0KCdzY3JvbGxTdG9wJywgX3RoaXMuZ2V0U2Nyb2xsU3RhdGUoKSk7XG4gICAgfTtcblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgdHJhY2tYVmlzaWJsZTogZmFsc2UsXG4gICAgICB0cmFja1lWaXNpYmxlOiBmYWxzZSxcbiAgICAgIGlzUlRMOiBwcm9wcy5ydGxcbiAgICB9O1xuICAgIF90aGlzLnNjcm9sbFZhbHVlcyA9IF90aGlzLmdldFNjcm9sbFN0YXRlKHRydWUpO1xuICAgIF90aGlzLmV2ZW50RW1pdHRlciA9IG5ldyBFbWl0dHIoMTUpO1xuICAgIGlmIChwcm9wcy5vblVwZGF0ZSkgX3RoaXMuZXZlbnRFbWl0dGVyLm9uKCd1cGRhdGUnLCBwcm9wcy5vblVwZGF0ZSk7XG4gICAgaWYgKHByb3BzLm9uU2Nyb2xsKSBfdGhpcy5ldmVudEVtaXR0ZXIub24oJ3Njcm9sbCcsIHByb3BzLm9uU2Nyb2xsKTtcbiAgICBpZiAocHJvcHMub25TY3JvbGxTdGFydCkgX3RoaXMuZXZlbnRFbWl0dGVyLm9uKCdzY3JvbGxTdGFydCcsIHByb3BzLm9uU2Nyb2xsU3RhcnQpO1xuICAgIGlmIChwcm9wcy5vblNjcm9sbFN0b3ApIF90aGlzLmV2ZW50RW1pdHRlci5vbignc2Nyb2xsU3RvcCcsIHByb3BzLm9uU2Nyb2xsU3RvcCk7XG4gICAgX3RoaXMuaWQgPSB1dWlkKCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNjcm9sbGJhci5wcm90b3R5cGUsIFwic2Nyb2xsVG9wXCIsIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvc29ydC1jb21wXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh0b3ApIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxUb3AgPSB0b3A7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTY3JvbGxiYXIucHJvdG90eXBlLCBcInNjcm9sbExlZnRcIiwge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KGxlZnQpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNjcm9sbGJhci5wcm90b3R5cGUsIFwic2Nyb2xsSGVpZ2h0XCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNjcm9sbGJhci5wcm90b3R5cGUsIFwic2Nyb2xsV2lkdGhcIiwge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTY3JvbGxiYXIucHJvdG90eXBlLCBcImNsaWVudEhlaWdodFwiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxlckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsZXJFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTY3JvbGxiYXIucHJvdG90eXBlLCBcImNsaWVudFdpZHRoXCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxlckVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvc29ydC1jb21wXG5cbiAgU2Nyb2xsYmFyLmNhbGN1bGF0ZVN0eWxlcyA9IGZ1bmN0aW9uIChwcm9wcywgc3RhdGUsIHNjcm9sbFZhbHVlcywgc2Nyb2xsYmFyV2lkdGgpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG5cbiAgICB2YXIgdXNlRGVmYXVsdFN0eWxlcyA9ICFwcm9wcy5ub0RlZmF1bHRTdHlsZXM7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhvbGRlcjogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUuaG9sZGVyKSwge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgfSksIHByb3BzLnN0eWxlKSxcbiAgICAgIHdyYXBwZXI6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZS53cmFwcGVyKSwgIXByb3BzLmRpc2FibGVUcmFja3NXaWR0aENvbXBlbnNhdGlvbiAmJiAhcHJvcHMuZGlzYWJsZVRyYWNrWVdpZHRoQ29tcGVuc2F0aW9uICYmIChfYSA9IHt9LCBfYVtzdGF0ZS5pc1JUTCA/ICdsZWZ0JyA6ICdyaWdodCddID0gc3RhdGUudHJhY2tZVmlzaWJsZSA/IDEwIDogMCwgX2EpKSwgIXByb3BzLmRpc2FibGVUcmFja3NXaWR0aENvbXBlbnNhdGlvbiAmJiAhcHJvcHMuZGlzYWJsZVRyYWNrWFdpZHRoQ29tcGVuc2F0aW9uICYmIHtcbiAgICAgICAgYm90dG9tOiBzdGF0ZS50cmFja1hWaXNpYmxlID8gMTAgOiAwXG4gICAgICB9KSksIHByb3BzLndyYXBwZXJQcm9wcy5zdHlsZSksIHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgICAgfSksXG4gICAgICBjb250ZW50OiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS5jb250ZW50KSwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVzVG9Ib2xkZXIgfHwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVZVG9Ib2xkZXIgfHwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVYVG9Ib2xkZXIgPyB7XG4gICAgICAgIGRpc3BsYXk6ICd0YWJsZS1jZWxsJ1xuICAgICAgfSA6IHtcbiAgICAgICAgcGFkZGluZzogMC4wNSAvLyBuZWVkZWQgdG8gZGlzYWJsZSBtYXJnaW4gY29sbGFwc2luZyB3aXRob3V0IGZsZXhib3hlcywgb3RoZXIgcG9zc2libGUgc29sdXRpb25zIGhlcmU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzE4NjM0L2hvdy10by1kaXNhYmxlLW1hcmdpbi1jb2xsYXBzaW5nXG5cbiAgICAgIH0pLCB1c2VEZWZhdWx0U3R5bGVzICYmICEocHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVzVG9Ib2xkZXIgfHwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVZVG9Ib2xkZXIpICYmIHtcbiAgICAgICAgbWluSGVpZ2h0OiAnMTAwJSdcbiAgICAgIH0pLCB1c2VEZWZhdWx0U3R5bGVzICYmICEocHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVzVG9Ib2xkZXIgfHwgcHJvcHMudHJhbnNsYXRlQ29udGVudFNpemVYVG9Ib2xkZXIpICYmIHtcbiAgICAgICAgbWluV2lkdGg6ICcxMDAlJ1xuICAgICAgfSksIHByb3BzLmNvbnRlbnRQcm9wcy5zdHlsZSksXG4gICAgICBzY3JvbGxlcjogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oKF9iID0ge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICBib3R0b206IDAsXG4gICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICBwYWRkaW5nQm90dG9tOiAhc2Nyb2xsYmFyV2lkdGggJiYgc2Nyb2xsVmFsdWVzLnNjcm9sbFhQb3NzaWJsZSA/IHByb3BzLmZhbGxiYWNrU2Nyb2xsYmFyV2lkdGggOiB1bmRlZmluZWRcbiAgICAgIH0sIF9iW3N0YXRlLmlzUlRMID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnXSA9ICFzY3JvbGxiYXJXaWR0aCAmJiBzY3JvbGxWYWx1ZXMuc2Nyb2xsWVBvc3NpYmxlID8gcHJvcHMuZmFsbGJhY2tTY3JvbGxiYXJXaWR0aCA6IHVuZGVmaW5lZCwgX2IpLCBwcm9wcy5zY3JvbGxlclByb3BzLnN0eWxlKSwgIWlzVW5kZWYocHJvcHMucnRsKSAmJiB7XG4gICAgICAgIGRpcmVjdGlvbjogcHJvcHMucnRsID8gJ3J0bCcgOiAnbHRyJ1xuICAgICAgfSksIHByb3BzLm1vbWVudHVtICYmIHtcbiAgICAgICAgV2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc6ICd0b3VjaCdcbiAgICAgIH0pLCAoX2MgPSB7XG4gICAgICAgIG92ZXJmbG93WTogc2Nyb2xsVmFsdWVzLnNjcm9sbFlQb3NzaWJsZSA/ICdzY3JvbGwnIDogJ2hpZGRlbicsXG4gICAgICAgIG92ZXJmbG93WDogc2Nyb2xsVmFsdWVzLnNjcm9sbFhQb3NzaWJsZSA/ICdzY3JvbGwnIDogJ2hpZGRlbicsXG4gICAgICAgIG1hcmdpbkJvdHRvbTogc2Nyb2xsVmFsdWVzLnNjcm9sbFhQb3NzaWJsZSA/IC0oc2Nyb2xsYmFyV2lkdGggfHwgcHJvcHMuZmFsbGJhY2tTY3JvbGxiYXJXaWR0aCkgLSBOdW1iZXIoc2Nyb2xsVmFsdWVzLnpvb21MZXZlbCAhPT0gMSkgOiB1bmRlZmluZWRcbiAgICAgIH0sIF9jW3N0YXRlLmlzUlRMID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0J10gPSBzY3JvbGxWYWx1ZXMuc2Nyb2xsWVBvc3NpYmxlID8gLShzY3JvbGxiYXJXaWR0aCB8fCBwcm9wcy5mYWxsYmFja1Njcm9sbGJhcldpZHRoKSAtIE51bWJlcihzY3JvbGxWYWx1ZXMuem9vbUxldmVsICE9PSAxKSA6IHVuZGVmaW5lZCwgX2MpKSxcbiAgICAgIHRyYWNrWDogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudHJhY2suY29tbW9uKSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50cmFjay54KSwgcHJvcHMudHJhY2tYUHJvcHMuc3R5bGUpLCAhc3RhdGUudHJhY2tYVmlzaWJsZSAmJiB7XG4gICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgfSksXG4gICAgICB0cmFja1k6IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRyYWNrLmNvbW1vbiksIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudHJhY2sueSksIHVzZURlZmF1bHRTdHlsZXMgJiYgKF9kID0ge30sIF9kW3N0YXRlLmlzUlRMID8gJ2xlZnQnIDogJ3JpZ2h0J10gPSAwLCBfZCkpLCBwcm9wcy50cmFja1lQcm9wcy5zdHlsZSksICFzdGF0ZS50cmFja1lWaXNpYmxlICYmIHtcbiAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICB9KSxcbiAgICAgIHRodW1iWDogX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIHVzZURlZmF1bHRTdHlsZXMgJiYgc3R5bGUudGh1bWIuY29tbW9uKSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50aHVtYi54KSwgcHJvcHMudGh1bWJYUHJvcHMuc3R5bGUpLFxuICAgICAgdGh1bWJZOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdXNlRGVmYXVsdFN0eWxlcyAmJiBzdHlsZS50aHVtYi5jb21tb24pLCB1c2VEZWZhdWx0U3R5bGVzICYmIHN0eWxlLnRodW1iLnkpLCBwcm9wcy50aHVtYllQcm9wcy5zdHlsZSlcbiAgICB9O1xuICB9O1xuXG4gIFNjcm9sbGJhci5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnNjcm9sbGVyRWxlbWVudCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInNjcm9sbGVyIGVsZW1lbnQgd2FzIG5vdCBjcmVhdGVkLiBQb3NzaWJseSB5b3UgaGF2ZW4ndCBwcm92aWRlZCBIVE1MRGl2RWxlbWVudCB0byByZW5kZXJlcidzIGBlbGVtZW50UmVmYCBmdW5jdGlvbi5cIik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29udGVudEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb250ZW50IGVsZW1lbnQgd2FzIG5vdCBjcmVhdGVkLiBQb3NzaWJseSB5b3UgaGF2ZW4ndCBwcm92aWRlZCBIVE1MRGl2RWxlbWVudCB0byByZW5kZXJlcidzIGBlbGVtZW50UmVmYCBmdW5jdGlvbi5cIik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKCFwcm9wcy5uYXRpdmUgJiYgIXByb3BzLm1vYmlsZU5hdGl2ZSkge1xuICAgICAgLy8gVG9EbzogbW92ZSBuYXRpdmUgc3RhdGUgdG8gdGhlIHN0YXRlIHNvIGl0IGNhbiBiZSBzeW5jaHJvbml6ZWRcbiAgICAgIGlmICghdGhpcy5ob2xkZXJFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImhvbGRlciBlbGVtZW50IHdhcyBub3QgY3JlYXRlZC4gUG9zc2libHkgeW91IGhhdmVuJ3QgcHJvdmlkZWQgSFRNTERpdkVsZW1lbnQgdG8gcmVuZGVyZXIncyBgZWxlbWVudFJlZmAgZnVuY3Rpb24uXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMud3JhcHBlckVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwid3JhcHBlciBlbGVtZW50IHdhcyBub3QgY3JlYXRlZC4gUG9zc2libHkgeW91IGhhdmVuJ3QgcHJvdmlkZWQgSFRNTERpdkVsZW1lbnQgdG8gcmVuZGVyZXIncyBgZWxlbWVudFJlZmAgZnVuY3Rpb24uXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIExvb3AuYWRkVGFyZ2V0KHRoaXMpO1xuXG4gICAgaWYgKCFpc1VuZGVmKHByb3BzLnNjcm9sbFRvcCkpIHtcbiAgICAgIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCA9IHByb3BzLnNjcm9sbFRvcDtcbiAgICB9XG5cbiAgICBpZiAoIWlzVW5kZWYocHJvcHMuc2Nyb2xsTGVmdCkpIHtcbiAgICAgIHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbExlZnQgPSBwcm9wcy5zY3JvbGxMZWZ0O1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlKHRydWUpO1xuICB9O1xuXG4gIFNjcm9sbGJhci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgTG9vcC5yZW1vdmVUYXJnZXQodGhpcyk7XG4gIH07XG5cbiAgU2Nyb2xsYmFyLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICBpZiAoIXRoaXMuc2Nyb2xsZXJFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcblxuICAgIGlmIChwcm9wcy5ydGwgIT09IHByZXZQcm9wcy5ydGwgJiYgcHJvcHMucnRsICE9PSB0aGlzLnN0YXRlLmlzUlRMKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNSVEw6IHByb3BzLnJ0bFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuaXNSVEwgIT09IHByZXZTdGF0ZS5pc1JUTCkge1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzVW5kZWYocHJvcHMuc2Nyb2xsVG9wKSAmJiBwcm9wcy5zY3JvbGxUb3AgIT09IHRoaXMuc2Nyb2xsZXJFbGVtZW50LnNjcm9sbFRvcCkge1xuICAgICAgdGhpcy5zY3JvbGxlckVsZW1lbnQuc2Nyb2xsVG9wID0gcHJvcHMuc2Nyb2xsVG9wO1xuICAgIH1cblxuICAgIGlmICghaXNVbmRlZihwcm9wcy5zY3JvbGxMZWZ0KSAmJiBwcm9wcy5zY3JvbGxMZWZ0ICE9PSB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0KSB7XG4gICAgICB0aGlzLnNjcm9sbGVyRWxlbWVudC5zY3JvbGxMZWZ0ID0gcHJvcHMuc2Nyb2xsTGVmdDtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLm9uVXBkYXRlICE9PSBwcm9wcy5vblVwZGF0ZSkge1xuICAgICAgaWYgKHByZXZQcm9wcy5vblVwZGF0ZSkgdGhpcy5ldmVudEVtaXR0ZXIub2ZmKCd1cGRhdGUnLCBwcmV2UHJvcHMub25VcGRhdGUpO1xuICAgICAgaWYgKHByb3BzLm9uVXBkYXRlKSB0aGlzLmV2ZW50RW1pdHRlci5vbigndXBkYXRlJywgcHJvcHMub25VcGRhdGUpO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMub25TY3JvbGwgIT09IHByb3BzLm9uU2Nyb2xsKSB7XG4gICAgICBpZiAocHJldlByb3BzLm9uU2Nyb2xsKSB0aGlzLmV2ZW50RW1pdHRlci5vZmYoJ3Njcm9sbCcsIHByZXZQcm9wcy5vblNjcm9sbCk7XG4gICAgICBpZiAocHJvcHMub25TY3JvbGwpIHRoaXMuZXZlbnRFbWl0dGVyLm9uKCdzY3JvbGwnLCBwcm9wcy5vblNjcm9sbCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5vblNjcm9sbFN0YXJ0ICE9PSBwcm9wcy5vblNjcm9sbFN0YXJ0KSB7XG4gICAgICBpZiAocHJldlByb3BzLm9uU2Nyb2xsU3RhcnQpIHRoaXMuZXZlbnRFbWl0dGVyLm9mZignc2Nyb2xsU3RhcnQnLCBwcmV2UHJvcHMub25TY3JvbGxTdGFydCk7XG4gICAgICBpZiAocHJvcHMub25TY3JvbGxTdGFydCkgdGhpcy5ldmVudEVtaXR0ZXIub24oJ3Njcm9sbFN0YXJ0JywgcHJvcHMub25TY3JvbGxTdGFydCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5vblNjcm9sbFN0b3AgIT09IHByb3BzLm9uU2Nyb2xsU3RvcCkge1xuICAgICAgaWYgKHByZXZQcm9wcy5vblNjcm9sbFN0b3ApIHRoaXMuZXZlbnRFbWl0dGVyLm9mZignc2Nyb2xsU3RvcCcsIHByZXZQcm9wcy5vblNjcm9sbFN0b3ApO1xuICAgICAgaWYgKHByb3BzLm9uU2Nyb2xsU3RvcCkgdGhpcy5ldmVudEVtaXR0ZXIub24oJ3Njcm9sbFN0b3AnLCBwcm9wcy5vblNjcm9sbFN0b3ApO1xuICAgIH1cbiAgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3NvcnQtY29tcFxuXG5cbiAgU2Nyb2xsYmFyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY3JlYXRlQ29udGV4dCA9IF9hLmNyZWF0ZUNvbnRleHQsXG4gICAgICAgIHJ0bCA9IF9hLnJ0bCxcbiAgICAgICAgbmF0aXZlID0gX2EubmF0aXZlLFxuICAgICAgICBtb2JpbGVOYXRpdmUgPSBfYS5tb2JpbGVOYXRpdmUsXG4gICAgICAgIG1vbWVudHVtID0gX2EubW9tZW50dW07XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5ub0RlZmF1bHRTdHlsZXM7XG4gICAgICAgIHZhciBkaXNhYmxlVHJhY2tzTW91c2V3aGVlbFNjcm9sbGluZyA9IF9hLmRpc2FibGVUcmFja3NNb3VzZXdoZWVsU2Nyb2xsaW5nLFxuICAgICAgICBkaXNhYmxlVHJhY2tYTW91c2V3aGVlbFNjcm9sbGluZyA9IF9hLmRpc2FibGVUcmFja1hNb3VzZXdoZWVsU2Nyb2xsaW5nLFxuICAgICAgICBkaXNhYmxlVHJhY2tZTW91c2V3aGVlbFNjcm9sbGluZyA9IF9hLmRpc2FibGVUcmFja1lNb3VzZXdoZWVsU2Nyb2xsaW5nO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EuZGlzYWJsZVRyYWNrc1dpZHRoQ29tcGVuc2F0aW9uO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EuZGlzYWJsZVRyYWNrWFdpZHRoQ29tcGVuc2F0aW9uO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EuZGlzYWJsZVRyYWNrWVdpZHRoQ29tcGVuc2F0aW9uO1xuICAgICAgICB2YXIgbm9TY3JvbGxYID0gX2Eubm9TY3JvbGxYLFxuICAgICAgICBub1Njcm9sbFkgPSBfYS5ub1Njcm9sbFksXG4gICAgICAgIG5vU2Nyb2xsID0gX2Eubm9TY3JvbGwsXG4gICAgICAgIHBlcm1hbmVudFRyYWNrWCA9IF9hLnBlcm1hbmVudFRyYWNrWCxcbiAgICAgICAgcGVybWFuZW50VHJhY2tZID0gX2EucGVybWFuZW50VHJhY2tZLFxuICAgICAgICBwZXJtYW5lbnRUcmFja3MgPSBfYS5wZXJtYW5lbnRUcmFja3MsXG4gICAgICAgIHJlbW92ZVRyYWNrc1doZW5Ob3RVc2VkID0gX2EucmVtb3ZlVHJhY2tzV2hlbk5vdFVzZWQsXG4gICAgICAgIHJlbW92ZVRyYWNrWVdoZW5Ob3RVc2VkID0gX2EucmVtb3ZlVHJhY2tZV2hlbk5vdFVzZWQsXG4gICAgICAgIHJlbW92ZVRyYWNrWFdoZW5Ob3RVc2VkID0gX2EucmVtb3ZlVHJhY2tYV2hlbk5vdFVzZWQ7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5taW5pbWFsVGh1bWJTaXplO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EubWF4aW1hbFRodW1iU2l6ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm1pbmltYWxUaHVtYlhTaXplO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EubWF4aW1hbFRodW1iWFNpemU7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5taW5pbWFsVGh1bWJZU2l6ZTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm1heGltYWxUaHVtYllTaXplO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EuZmFsbGJhY2tTY3JvbGxiYXJXaWR0aDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLnNjcm9sbFRvcDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLnNjcm9sbExlZnQ7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS50cmFja0NsaWNrQmVoYXZpb3I7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5zY3JvbGxEZXRlY3Rpb25UaHJlc2hvbGQ7XG4gICAgICAgIHZhciBwcm9wc1dyYXBwZXJQcm9wcyA9IF9hLndyYXBwZXJQcm9wcyxcbiAgICAgICAgcHJvcHNTY3JvbGxlclByb3BzID0gX2Euc2Nyb2xsZXJQcm9wcyxcbiAgICAgICAgcHJvcHNDb250ZW50UHJvcHMgPSBfYS5jb250ZW50UHJvcHMsXG4gICAgICAgIHByb3BzVHJhY2tYUHJvcHMgPSBfYS50cmFja1hQcm9wcyxcbiAgICAgICAgcHJvcHNUcmFja1lQcm9wcyA9IF9hLnRyYWNrWVByb3BzLFxuICAgICAgICBwcm9wc1RodW1iWFByb3BzID0gX2EudGh1bWJYUHJvcHMsXG4gICAgICAgIHByb3BzVGh1bWJZUHJvcHMgPSBfYS50aHVtYllQcm9wcyxcbiAgICAgICAgcHJvcHNTY3JvbGxiYXJXaWR0aCA9IF9hLnNjcm9sbGJhcldpZHRoO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EuZWxlbWVudFJlZjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLm9uVXBkYXRlO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eub25TY3JvbGw7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS5vblNjcm9sbFN0YXJ0O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2Eub25TY3JvbGxTdG9wO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2EudHJhbnNsYXRlQ29udGVudFNpemVzVG9Ib2xkZXI7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfYS50cmFuc2xhdGVDb250ZW50U2l6ZVlUb0hvbGRlcjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9hLnRyYW5zbGF0ZUNvbnRlbnRTaXplWFRvSG9sZGVyO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbixcbiAgICAgICAgcHJvcHNIb2xkZXJQcm9wcyA9IF9fcmVzdChfYSwgW1wiY3JlYXRlQ29udGV4dFwiLCBcInJ0bFwiLCBcIm5hdGl2ZVwiLCBcIm1vYmlsZU5hdGl2ZVwiLCBcIm1vbWVudHVtXCIsIFwibm9EZWZhdWx0U3R5bGVzXCIsIFwiZGlzYWJsZVRyYWNrc01vdXNld2hlZWxTY3JvbGxpbmdcIiwgXCJkaXNhYmxlVHJhY2tYTW91c2V3aGVlbFNjcm9sbGluZ1wiLCBcImRpc2FibGVUcmFja1lNb3VzZXdoZWVsU2Nyb2xsaW5nXCIsIFwiZGlzYWJsZVRyYWNrc1dpZHRoQ29tcGVuc2F0aW9uXCIsIFwiZGlzYWJsZVRyYWNrWFdpZHRoQ29tcGVuc2F0aW9uXCIsIFwiZGlzYWJsZVRyYWNrWVdpZHRoQ29tcGVuc2F0aW9uXCIsIFwibm9TY3JvbGxYXCIsIFwibm9TY3JvbGxZXCIsIFwibm9TY3JvbGxcIiwgXCJwZXJtYW5lbnRUcmFja1hcIiwgXCJwZXJtYW5lbnRUcmFja1lcIiwgXCJwZXJtYW5lbnRUcmFja3NcIiwgXCJyZW1vdmVUcmFja3NXaGVuTm90VXNlZFwiLCBcInJlbW92ZVRyYWNrWVdoZW5Ob3RVc2VkXCIsIFwicmVtb3ZlVHJhY2tYV2hlbk5vdFVzZWRcIiwgXCJtaW5pbWFsVGh1bWJTaXplXCIsIFwibWF4aW1hbFRodW1iU2l6ZVwiLCBcIm1pbmltYWxUaHVtYlhTaXplXCIsIFwibWF4aW1hbFRodW1iWFNpemVcIiwgXCJtaW5pbWFsVGh1bWJZU2l6ZVwiLCBcIm1heGltYWxUaHVtYllTaXplXCIsIFwiZmFsbGJhY2tTY3JvbGxiYXJXaWR0aFwiLCBcInNjcm9sbFRvcFwiLCBcInNjcm9sbExlZnRcIiwgXCJ0cmFja0NsaWNrQmVoYXZpb3JcIiwgXCJzY3JvbGxEZXRlY3Rpb25UaHJlc2hvbGRcIiwgXCJ3cmFwcGVyUHJvcHNcIiwgXCJzY3JvbGxlclByb3BzXCIsIFwiY29udGVudFByb3BzXCIsIFwidHJhY2tYUHJvcHNcIiwgXCJ0cmFja1lQcm9wc1wiLCBcInRodW1iWFByb3BzXCIsIFwidGh1bWJZUHJvcHNcIiwgXCJzY3JvbGxiYXJXaWR0aFwiLCBcImVsZW1lbnRSZWZcIiwgXCJvblVwZGF0ZVwiLCBcIm9uU2Nyb2xsXCIsIFwib25TY3JvbGxTdGFydFwiLCBcIm9uU2Nyb2xsU3RvcFwiLCBcInRyYW5zbGF0ZUNvbnRlbnRTaXplc1RvSG9sZGVyXCIsIFwidHJhbnNsYXRlQ29udGVudFNpemVZVG9Ib2xkZXJcIiwgXCJ0cmFuc2xhdGVDb250ZW50U2l6ZVhUb0hvbGRlclwiLCBcImNoaWxkcmVuXCJdKTtcblxuICAgIHZhciBzY3JvbGxiYXJXaWR0aCA9ICFpc1VuZGVmKHByb3BzU2Nyb2xsYmFyV2lkdGgpID8gcHJvcHNTY3JvbGxiYXJXaWR0aCA6IGdldFNjcm9sbGJhcldpZHRoKCkgfHwgMDtcblxuICAgIGlmIChuYXRpdmUgfHwgIXNjcm9sbGJhcldpZHRoICYmIG1vYmlsZU5hdGl2ZSkge1xuICAgICAgdGhpcy5lbGVtZW50UmVmSG9sZGVyKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmV3JhcHBlcihudWxsKTtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRyYWNrWChudWxsKTtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRyYWNrWShudWxsKTtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRodW1iWChudWxsKTtcbiAgICAgIHRoaXMuZWxlbWVudFJlZlRodW1iWShudWxsKTtcblxuICAgICAgdmFyIGNvbnRlbnRQcm9wc18xID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHByb3BzQ29udGVudFByb3BzKSwge1xuICAgICAgICBrZXk6ICdTY3JvbGxiYXJzQ3VzdG9tLUNvbnRlbnQnLFxuICAgICAgICBjbGFzc05hbWU6IGNuYignU2Nyb2xsYmFyc0N1c3RvbS1Db250ZW50JywgcHJvcHNDb250ZW50UHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICB9KTtcblxuICAgICAgdmFyIHNjcm9sbGVyUHJvcHNfMSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc0hvbGRlclByb3BzKSwge1xuICAgICAgICBjbGFzc05hbWU6IGNuYignU2Nyb2xsYmFyc0N1c3RvbSBuYXRpdmUnLCB0aGlzLnN0YXRlLnRyYWNrWVZpc2libGUgJiYgJ3RyYWNrWVZpc2libGUnLCB0aGlzLnN0YXRlLnRyYWNrWFZpc2libGUgJiYgJ3RyYWNrWFZpc2libGUnLCB0aGlzLnN0YXRlLmlzUlRMICYmICdydGwnLCBwcm9wc0hvbGRlclByb3BzLmNsYXNzTmFtZSksXG4gICAgICAgIHN0eWxlOiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNIb2xkZXJQcm9wcy5zdHlsZSksICFpc1VuZGVmKHJ0bCkgJiYge1xuICAgICAgICAgIGRpcmVjdGlvbjogcnRsID8gJ3J0bCcgOiAnbHRyJ1xuICAgICAgICB9KSwgbW9tZW50dW0gJiYge1xuICAgICAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAndG91Y2gnXG4gICAgICAgIH0pLCB7XG4gICAgICAgICAgb3ZlcmZsb3dYOiBub1Njcm9sbCB8fCBub1Njcm9sbFggPyAnaGlkZGVuJyA6IHBlcm1hbmVudFRyYWNrcyB8fCBwZXJtYW5lbnRUcmFja1ggPyAnc2Nyb2xsJyA6ICdhdXRvJyxcbiAgICAgICAgICBvdmVyZmxvd1k6IG5vU2Nyb2xsIHx8IG5vU2Nyb2xsWSA/ICdoaWRkZW4nIDogcGVybWFuZW50VHJhY2tzIHx8IHBlcm1hbmVudFRyYWNrWSA/ICdzY3JvbGwnIDogJ2F1dG8nXG4gICAgICAgIH0pLFxuICAgICAgICBvblNjcm9sbDogdGhpcy5oYW5kbGVTY3JvbGxlclNjcm9sbCxcbiAgICAgICAgY2hpbGRyZW46IHJlbmRlckRpdldpdGhSZW5kZXJlcihjb250ZW50UHJvcHNfMSwgdGhpcy5lbGVtZW50UmVmQ29udGVudCksXG4gICAgICAgIHJlbmRlcmVyOiBwcm9wc1Njcm9sbGVyUHJvcHMucmVuZGVyZXIsXG4gICAgICAgIGVsZW1lbnRSZWY6IHByb3BzU2Nyb2xsZXJQcm9wcy5lbGVtZW50UmVmXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlbmRlckRpdldpdGhSZW5kZXJlcihzY3JvbGxlclByb3BzXzEsIHRoaXMuZWxlbWVudFJlZlNjcm9sbGVyKTtcbiAgICB9XG5cbiAgICB2YXIgc3R5bGVzID0gU2Nyb2xsYmFyLmNhbGN1bGF0ZVN0eWxlcyh0aGlzLnByb3BzLCB0aGlzLnN0YXRlLCB0aGlzLnNjcm9sbFZhbHVlcywgc2Nyb2xsYmFyV2lkdGgpO1xuICAgIHZhciBob2xkZXJDaGlsZHJlbiA9IFtdO1xuXG4gICAgdmFyIGNvbnRlbnRQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc0NvbnRlbnRQcm9wcyksIHtcbiAgICAgIGtleTogJ1Njcm9sbGJhcnNDdXN0b20tQ29udGVudCcsXG4gICAgICBjbGFzc05hbWU6IGNuYignU2Nyb2xsYmFyc0N1c3RvbS1Db250ZW50JywgcHJvcHNDb250ZW50UHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgIHN0eWxlOiBzdHlsZXMuY29udGVudCxcbiAgICAgIGNoaWxkcmVuOiBjcmVhdGVDb250ZXh0ID8gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L2pzeC1uby1jb25zdHJ1Y3RlZC1jb250ZXh0LXZhbHVlc1xuICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxiYXJDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcGFyZW50U2Nyb2xsYmFyOiB0aGlzXG4gICAgICAgIH1cbiAgICAgIH0sIGNoaWxkcmVuKSA6IGNoaWxkcmVuXG4gICAgfSk7XG5cbiAgICB2YXIgc2Nyb2xsZXJQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc1Njcm9sbGVyUHJvcHMpLCB7XG4gICAgICBrZXk6ICdTY3JvbGxiYXJzQ3VzdG9tLVNjcm9sbGVyJyxcbiAgICAgIGNsYXNzTmFtZTogY25iKCdTY3JvbGxiYXJzQ3VzdG9tLVNjcm9sbGVyJywgcHJvcHNTY3JvbGxlclByb3BzLmNsYXNzTmFtZSksXG4gICAgICBzdHlsZTogc3R5bGVzLnNjcm9sbGVyLFxuICAgICAgY2hpbGRyZW46IHJlbmRlckRpdldpdGhSZW5kZXJlcihjb250ZW50UHJvcHMsIHRoaXMuZWxlbWVudFJlZkNvbnRlbnQpLFxuICAgICAgb25TY3JvbGw6IHRoaXMuaGFuZGxlU2Nyb2xsZXJTY3JvbGxcbiAgICB9KTtcblxuICAgIHZhciB3cmFwcGVyUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNXcmFwcGVyUHJvcHMpLCB7XG4gICAgICBrZXk6ICdTY3JvbGxiYXJzQ3VzdG9tLVdyYXBwZXInLFxuICAgICAgY2xhc3NOYW1lOiBjbmIoJ1Njcm9sbGJhcnNDdXN0b20tV3JhcHBlcicsIHByb3BzV3JhcHBlclByb3BzLmNsYXNzTmFtZSksXG4gICAgICBzdHlsZTogc3R5bGVzLndyYXBwZXIsXG4gICAgICBjaGlsZHJlbjogcmVuZGVyRGl2V2l0aFJlbmRlcmVyKHNjcm9sbGVyUHJvcHMsIHRoaXMuZWxlbWVudFJlZlNjcm9sbGVyKVxuICAgIH0pO1xuXG4gICAgaG9sZGVyQ2hpbGRyZW4ucHVzaChyZW5kZXJEaXZXaXRoUmVuZGVyZXIod3JhcHBlclByb3BzLCB0aGlzLmVsZW1lbnRSZWZXcmFwcGVyKSk7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS50cmFja1lWaXNpYmxlIHx8ICFyZW1vdmVUcmFja3NXaGVuTm90VXNlZCAmJiAhcmVtb3ZlVHJhY2tZV2hlbk5vdFVzZWQpIHtcbiAgICAgIHZhciB0aHVtYllQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc1RodW1iWVByb3BzKSwge1xuICAgICAgICBrZXk6ICdTY3JvbGxiYXJzQ3VzdG9tLVRodW1iWScsXG4gICAgICAgIHN0eWxlOiBzdHlsZXMudGh1bWJZLFxuICAgICAgICBlbGVtZW50UmVmOiB0aGlzLmVsZW1lbnRSZWZUaHVtYlksXG4gICAgICAgIG9uRHJhZzogdGhpcy5oYW5kbGVUaHVtYllEcmFnLFxuICAgICAgICBvbkRyYWdFbmQ6IHRoaXMuaGFuZGxlVGh1bWJZRHJhZ0VuZCxcbiAgICAgICAgYXhpczogQVhJU19ESVJFQ1RJT04uWVxuICAgICAgfSk7XG5cbiAgICAgIHZhciB0cmFja1lQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc1RyYWNrWVByb3BzKSwge1xuICAgICAgICBrZXk6ICdTY3JvbGxiYXJzQ3VzdG9tLVRyYWNrWScsXG4gICAgICAgIHN0eWxlOiBzdHlsZXMudHJhY2tZLFxuICAgICAgICBlbGVtZW50UmVmOiB0aGlzLmVsZW1lbnRSZWZUcmFja1ksXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlVHJhY2tZQ2xpY2tcbiAgICAgIH0pLCAoZGlzYWJsZVRyYWNrc01vdXNld2hlZWxTY3JvbGxpbmcgfHwgZGlzYWJsZVRyYWNrWU1vdXNld2hlZWxTY3JvbGxpbmcpICYmIHtcbiAgICAgICAgb25XaGVlbDogdGhpcy5oYW5kbGVUcmFja1lNb3VzZVdoZWVsXG4gICAgICB9KSwge1xuICAgICAgICBheGlzOiBBWElTX0RJUkVDVElPTi5ZXG4gICAgICB9KTtcblxuICAgICAgdHJhY2tZUHJvcHMuY2hpbGRyZW4gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGJhclRodW1iLCBfX2Fzc2lnbih7fSwgdGh1bWJZUHJvcHMpKTtcbiAgICAgIGhvbGRlckNoaWxkcmVuLnB1c2goUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxiYXJUcmFjaywgX19hc3NpZ24oe30sIHRyYWNrWVByb3BzKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUcmFja1kobnVsbCk7XG4gICAgICB0aGlzLmVsZW1lbnRSZWZUaHVtYlkobnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUudHJhY2tYVmlzaWJsZSB8fCAhcmVtb3ZlVHJhY2tzV2hlbk5vdFVzZWQgJiYgIXJlbW92ZVRyYWNrWFdoZW5Ob3RVc2VkKSB7XG4gICAgICB2YXIgdGh1bWJYUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNUaHVtYlhQcm9wcyksIHtcbiAgICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1UaHVtYlgnLFxuICAgICAgICBzdHlsZTogc3R5bGVzLnRodW1iWCxcbiAgICAgICAgZWxlbWVudFJlZjogdGhpcy5lbGVtZW50UmVmVGh1bWJYLFxuICAgICAgICBvbkRyYWc6IHRoaXMuaGFuZGxlVGh1bWJYRHJhZyxcbiAgICAgICAgb25EcmFnRW5kOiB0aGlzLmhhbmRsZVRodW1iWERyYWdFbmQsXG4gICAgICAgIGF4aXM6IEFYSVNfRElSRUNUSU9OLlhcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgdHJhY2tYUHJvcHMgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJvcHNUcmFja1hQcm9wcyksIHtcbiAgICAgICAga2V5OiAnU2Nyb2xsYmFyc0N1c3RvbS1UcmFja1gnLFxuICAgICAgICBzdHlsZTogc3R5bGVzLnRyYWNrWCxcbiAgICAgICAgZWxlbWVudFJlZjogdGhpcy5lbGVtZW50UmVmVHJhY2tYLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZVRyYWNrWENsaWNrXG4gICAgICB9KSwgKGRpc2FibGVUcmFja3NNb3VzZXdoZWVsU2Nyb2xsaW5nIHx8IGRpc2FibGVUcmFja1hNb3VzZXdoZWVsU2Nyb2xsaW5nKSAmJiB7XG4gICAgICAgIG9uV2hlZWw6IHRoaXMuaGFuZGxlVHJhY2tYTW91c2VXaGVlbFxuICAgICAgfSksIHtcbiAgICAgICAgYXhpczogQVhJU19ESVJFQ1RJT04uWFxuICAgICAgfSk7XG5cbiAgICAgIHRyYWNrWFByb3BzLmNoaWxkcmVuID0gUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxiYXJUaHVtYiwgX19hc3NpZ24oe30sIHRodW1iWFByb3BzKSk7XG4gICAgICBob2xkZXJDaGlsZHJlbi5wdXNoKFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsYmFyVHJhY2ssIF9fYXNzaWduKHt9LCB0cmFja1hQcm9wcykpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50UmVmVHJhY2tYKG51bGwpO1xuICAgICAgdGhpcy5lbGVtZW50UmVmVGh1bWJYKG51bGwpO1xuICAgIH1cblxuICAgIHZhciBob2xkZXJQcm9wcyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBwcm9wc0hvbGRlclByb3BzKSwge1xuICAgICAgY2xhc3NOYW1lOiBjbmIoJ1Njcm9sbGJhcnNDdXN0b20nLCB0aGlzLnN0YXRlLnRyYWNrWVZpc2libGUgJiYgJ3RyYWNrWVZpc2libGUnLCB0aGlzLnN0YXRlLnRyYWNrWFZpc2libGUgJiYgJ3RyYWNrWFZpc2libGUnLCB0aGlzLnN0YXRlLmlzUlRMICYmICdydGwnLCBwcm9wc0hvbGRlclByb3BzLmNsYXNzTmFtZSksXG4gICAgICBzdHlsZTogc3R5bGVzLmhvbGRlcixcbiAgICAgIGNoaWxkcmVuOiBob2xkZXJDaGlsZHJlblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlbmRlckRpdldpdGhSZW5kZXJlcihob2xkZXJQcm9wcywgdGhpcy5lbGVtZW50UmVmSG9sZGVyKTtcbiAgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3N0YXRpYy1wcm9wZXJ0eS1wbGFjZW1lbnRcblxuXG4gIFNjcm9sbGJhci5jb250ZXh0VHlwZSA9IFNjcm9sbGJhckNvbnRleHQ7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9zdGF0aWMtcHJvcGVydHktcGxhY2VtZW50XG5cbiAgU2Nyb2xsYmFyLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBtb21lbnR1bTogdHJ1ZSxcbiAgICBtaW5pbWFsVGh1bWJTaXplOiAzMCxcbiAgICBmYWxsYmFja1Njcm9sbGJhcldpZHRoOiAyMCxcbiAgICB0cmFja0NsaWNrQmVoYXZpb3I6IFRSQUNLX0NMSUNLX0JFSEFWSU9SLkpVTVAsXG4gICAgc2Nyb2xsRGV0ZWN0aW9uVGhyZXNob2xkOiAxMDAsXG4gICAgd3JhcHBlclByb3BzOiB7fSxcbiAgICBzY3JvbGxlclByb3BzOiB7fSxcbiAgICBjb250ZW50UHJvcHM6IHt9LFxuICAgIHRyYWNrWFByb3BzOiB7fSxcbiAgICB0cmFja1lQcm9wczoge30sXG4gICAgdGh1bWJYUHJvcHM6IHt9LFxuICAgIHRodW1iWVByb3BzOiB7fVxuICB9O1xuICByZXR1cm4gU2Nyb2xsYmFyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnQgeyBTY3JvbGxiYXIsIFNjcm9sbGJhckNvbnRleHQsIFNjcm9sbGJhciBhcyBkZWZhdWx0IH07XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZXgpIHsgcmV0dXJuIChleCAmJiAodHlwZW9mIGV4ID09PSAnb2JqZWN0JykgJiYgJ2RlZmF1bHQnIGluIGV4KSA/IGV4WydkZWZhdWx0J10gOiBleDsgfVxuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIFJlYWN0X19kZWZhdWx0ID0gX2ludGVyb3BEZWZhdWx0KFJlYWN0KTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzcztcbn1cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5mdW5jdGlvbiB3aXRoU2lkZUVmZmVjdChyZWR1Y2VQcm9wc1RvU3RhdGUsIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQsIG1hcFN0YXRlT25TZXJ2ZXIpIHtcbiAgaWYgKHR5cGVvZiByZWR1Y2VQcm9wc1RvU3RhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlZHVjZVByb3BzVG9TdGF0ZSB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBoYW5kbGVTdGF0ZUNoYW5nZU9uQ2xpZW50IHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIG1hcFN0YXRlT25TZXJ2ZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBtYXBTdGF0ZU9uU2VydmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBtYXBTdGF0ZU9uU2VydmVyIHRvIGVpdGhlciBiZSB1bmRlZmluZWQgb3IgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERpc3BsYXlOYW1lKFdyYXBwZWRDb21wb25lbnQpIHtcbiAgICByZXR1cm4gV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gd3JhcChXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgaWYgKHR5cGVvZiBXcmFwcGVkQ29tcG9uZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIFdyYXBwZWRDb21wb25lbnQgdG8gYmUgYSBSZWFjdCBjb21wb25lbnQuJyk7XG4gICAgfVxuXG4gICAgdmFyIG1vdW50ZWRJbnN0YW5jZXMgPSBbXTtcbiAgICB2YXIgc3RhdGU7XG5cbiAgICBmdW5jdGlvbiBlbWl0Q2hhbmdlKCkge1xuICAgICAgc3RhdGUgPSByZWR1Y2VQcm9wc1RvU3RhdGUobW91bnRlZEluc3RhbmNlcy5tYXAoZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5wcm9wcztcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKFNpZGVFZmZlY3QuY2FuVXNlRE9NKSB7XG4gICAgICAgIGhhbmRsZVN0YXRlQ2hhbmdlT25DbGllbnQoc3RhdGUpO1xuICAgICAgfSBlbHNlIGlmIChtYXBTdGF0ZU9uU2VydmVyKSB7XG4gICAgICAgIHN0YXRlID0gbWFwU3RhdGVPblNlcnZlcihzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIFNpZGVFZmZlY3QgPVxuICAgIC8qI19fUFVSRV9fKi9cbiAgICBmdW5jdGlvbiAoX1B1cmVDb21wb25lbnQpIHtcbiAgICAgIF9pbmhlcml0c0xvb3NlKFNpZGVFZmZlY3QsIF9QdXJlQ29tcG9uZW50KTtcblxuICAgICAgZnVuY3Rpb24gU2lkZUVmZmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIF9QdXJlQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IHRvIHVzZSBkaXNwbGF5TmFtZSBvZiB3cmFwcGVkIGNvbXBvbmVudFxuICAgICAgLy8gRXhwb3NlIGNhblVzZURPTSBzbyB0ZXN0cyBjYW4gbW9ua2V5cGF0Y2ggaXRcbiAgICAgIFNpZGVFZmZlY3QucGVlayA9IGZ1bmN0aW9uIHBlZWsoKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH07XG5cbiAgICAgIFNpZGVFZmZlY3QucmV3aW5kID0gZnVuY3Rpb24gcmV3aW5kKCkge1xuICAgICAgICBpZiAoU2lkZUVmZmVjdC5jYW5Vc2VET00pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgb25seSBjYWxsIHJld2luZCgpIG9uIHRoZSBzZXJ2ZXIuIENhbGwgcGVlaygpIHRvIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVjb3JkZWRTdGF0ZSA9IHN0YXRlO1xuICAgICAgICBzdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgbW91bnRlZEluc3RhbmNlcyA9IFtdO1xuICAgICAgICByZXR1cm4gcmVjb3JkZWRTdGF0ZTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBfcHJvdG8gPSBTaWRlRWZmZWN0LnByb3RvdHlwZTtcblxuICAgICAgX3Byb3RvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPSBmdW5jdGlvbiBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgICBtb3VudGVkSW5zdGFuY2VzLnB1c2godGhpcyk7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIGVtaXRDaGFuZ2UoKTtcbiAgICAgIH07XG5cbiAgICAgIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB2YXIgaW5kZXggPSBtb3VudGVkSW5zdGFuY2VzLmluZGV4T2YodGhpcyk7XG4gICAgICAgIG1vdW50ZWRJbnN0YW5jZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgZW1pdENoYW5nZSgpO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwgdGhpcy5wcm9wcyk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gU2lkZUVmZmVjdDtcbiAgICB9KFJlYWN0LlB1cmVDb21wb25lbnQpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KFNpZGVFZmZlY3QsIFwiZGlzcGxheU5hbWVcIiwgXCJTaWRlRWZmZWN0KFwiICsgZ2V0RGlzcGxheU5hbWUoV3JhcHBlZENvbXBvbmVudCkgKyBcIilcIik7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoU2lkZUVmZmVjdCwgXCJjYW5Vc2VET01cIiwgY2FuVXNlRE9NKTtcblxuICAgIHJldHVybiBTaWRlRWZmZWN0O1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdpdGhTaWRlRWZmZWN0O1xuIiwiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSxyZXF1aXJlKFwicmVhY3RcIikscmVxdWlyZShcInNpZ25hdHVyZV9wYWRcIikscmVxdWlyZShcInRyaW0tY2FudmFzXCIpKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcInByb3AtdHlwZXNcIixcInJlYWN0XCIsXCJzaWduYXR1cmVfcGFkXCIsXCJ0cmltLWNhbnZhc1wiXSx0KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlNpZ25hdHVyZUNhbnZhcz10KHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpLHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwic2lnbmF0dXJlX3BhZFwiKSxyZXF1aXJlKFwidHJpbS1jYW52YXNcIikpOmUuU2lnbmF0dXJlQ2FudmFzPXQoZVtcInByb3AtdHlwZXNcIl0sZS5yZWFjdCxlLnNpZ25hdHVyZV9wYWQsZVtcInRyaW0tY2FudmFzXCJdKX0odGhpcyxmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyKXtpZihuW3JdKXJldHVybiBuW3JdLmV4cG9ydHM7dmFyIGE9bltyXT17ZXhwb3J0czp7fSxpZDpyLGxvYWRlZDohMX07cmV0dXJuIGVbcl0uY2FsbChhLmV4cG9ydHMsYSxhLmV4cG9ydHMsdCksYS5sb2FkZWQ9ITAsYS5leHBvcnRzfXZhciBuPXt9O3JldHVybiB0Lm09ZSx0LmM9bix0LnA9XCJcIix0KDApfShbZnVuY3Rpb24oZSx0LG4pe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fWZ1bmN0aW9uIGEoZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSl0LmluZGV4T2Yocik+PTB8fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiYobltyXT1lW3JdKTtyZXR1cm4gbn1mdW5jdGlvbiBvKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX1mdW5jdGlvbiBpKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiF0fHxcIm9iamVjdFwiIT10eXBlb2YgdCYmXCJmdW5jdGlvblwiIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gdShlLHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKSxmPW4oMSkscD1yKGYpLGw9bigyKSxkPXIobCksdj1uKDMpLGg9cih2KSxfPW4oNCksZz1yKF8pLG09ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciBlLG4scix1O28odGhpcyx0KTtmb3IodmFyIHM9YXJndW1lbnRzLmxlbmd0aCxjPUFycmF5KHMpLGY9MDtmPHM7ZisrKWNbZl09YXJndW1lbnRzW2ZdO3JldHVybiBuPXI9aSh0aGlzLChlPXQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpLmNhbGwuYXBwbHkoZSxbdGhpc10uY29uY2F0KGMpKSksci5fc2lnUGFkPW51bGwsci5fZXhjbHVkZU91clByb3BzPWZ1bmN0aW9uKCl7dmFyIGU9ci5wcm9wcyx0PShlLmNhbnZhc1Byb3BzLGUuY2xlYXJPblJlc2l6ZSxhKGUsW1wiY2FudmFzUHJvcHNcIixcImNsZWFyT25SZXNpemVcIl0pKTtyZXR1cm4gdH0sci5nZXRDYW52YXM9ZnVuY3Rpb24oKXtyZXR1cm4gci5fY2FudmFzfSxyLmdldFRyaW1tZWRDYW52YXM9ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO3JldHVybiBlLndpZHRoPXIuX2NhbnZhcy53aWR0aCxlLmhlaWdodD1yLl9jYW52YXMuaGVpZ2h0LGUuZ2V0Q29udGV4dChcIjJkXCIpLmRyYXdJbWFnZShyLl9jYW52YXMsMCwwKSwoMCxnLmRlZmF1bHQpKGUpfSxyLmdldFNpZ25hdHVyZVBhZD1mdW5jdGlvbigpe3JldHVybiByLl9zaWdQYWR9LHIuX2NoZWNrQ2xlYXJPblJlc2l6ZT1mdW5jdGlvbigpe3IucHJvcHMuY2xlYXJPblJlc2l6ZSYmci5fcmVzaXplQ2FudmFzKCl9LHIuX3Jlc2l6ZUNhbnZhcz1mdW5jdGlvbigpe3ZhciBlPXIucHJvcHMuY2FudmFzUHJvcHN8fHt9LHQ9ZS53aWR0aCxuPWUuaGVpZ2h0O2lmKCF0fHwhbil7dmFyIGE9ci5fY2FudmFzLG89TWF0aC5tYXgod2luZG93LmRldmljZVBpeGVsUmF0aW98fDEsMSk7dHx8KGEud2lkdGg9YS5vZmZzZXRXaWR0aCpvKSxufHwoYS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQqbyksYS5nZXRDb250ZXh0KFwiMmRcIikuc2NhbGUobyxvKSxyLmNsZWFyKCl9fSxyLm9uPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsci5fY2hlY2tDbGVhck9uUmVzaXplKSxyLl9zaWdQYWQub24oKX0sci5vZmY9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixyLl9jaGVja0NsZWFyT25SZXNpemUpLHIuX3NpZ1BhZC5vZmYoKX0sci5jbGVhcj1mdW5jdGlvbigpe3JldHVybiByLl9zaWdQYWQuY2xlYXIoKX0sci5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHIuX3NpZ1BhZC5pc0VtcHR5KCl9LHIuZnJvbURhdGFVUkw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5fc2lnUGFkLmZyb21EYXRhVVJMKGUsdCl9LHIudG9EYXRhVVJMPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuX3NpZ1BhZC50b0RhdGFVUkwoZSx0KX0sci5mcm9tRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gci5fc2lnUGFkLmZyb21EYXRhKGUpfSxyLnRvRGF0YT1mdW5jdGlvbigpe3JldHVybiByLl9zaWdQYWQudG9EYXRhKCl9LHU9bixpKHIsdSl9cmV0dXJuIHUodCxlKSxjKHQsW3trZXk6XCJjb21wb25lbnREaWRNb3VudFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fc2lnUGFkPW5ldyBoLmRlZmF1bHQodGhpcy5fY2FudmFzLHRoaXMuX2V4Y2x1ZGVPdXJQcm9wcygpKSx0aGlzLl9yZXNpemVDYW52YXMoKSx0aGlzLm9uKCl9fSx7a2V5OlwiY29tcG9uZW50V2lsbFVubW91bnRcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub2ZmKCl9fSx7a2V5OlwiY29tcG9uZW50RGlkVXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXtPYmplY3QuYXNzaWduKHRoaXMuX3NpZ1BhZCx0aGlzLl9leGNsdWRlT3VyUHJvcHMoKSl9fSx7a2V5OlwicmVuZGVyXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5wcm9wcy5jYW52YXNQcm9wcztyZXR1cm4gZC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIixzKHtyZWY6ZnVuY3Rpb24odCl7ZS5fY2FudmFzPXR9fSx0KSl9fV0pLHR9KGwuQ29tcG9uZW50KTttLnByb3BUeXBlcz17dmVsb2NpdHlGaWx0ZXJXZWlnaHQ6cC5kZWZhdWx0Lm51bWJlcixtaW5XaWR0aDpwLmRlZmF1bHQubnVtYmVyLG1heFdpZHRoOnAuZGVmYXVsdC5udW1iZXIsbWluRGlzdGFuY2U6cC5kZWZhdWx0Lm51bWJlcixkb3RTaXplOnAuZGVmYXVsdC5vbmVPZlR5cGUoW3AuZGVmYXVsdC5udW1iZXIscC5kZWZhdWx0LmZ1bmNdKSxwZW5Db2xvcjpwLmRlZmF1bHQuc3RyaW5nLHRocm90dGxlOnAuZGVmYXVsdC5udW1iZXIsb25FbmQ6cC5kZWZhdWx0LmZ1bmMsb25CZWdpbjpwLmRlZmF1bHQuZnVuYyxjYW52YXNQcm9wczpwLmRlZmF1bHQub2JqZWN0LGNsZWFyT25SZXNpemU6cC5kZWZhdWx0LmJvb2x9LG0uZGVmYXVsdFByb3BzPXtjbGVhck9uUmVzaXplOiEwfSx0LmRlZmF1bHQ9bX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZX0sZnVuY3Rpb24oZSxuKXtlLmV4cG9ydHM9dH0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9bn0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9cn1dKX0pOyIsImltcG9ydCB7IHN0eWxlSG9va1NpbmdsZXRvbiB9IGZyb20gJy4vaG9vayc7XG4vKipcbiAqIGNyZWF0ZSBhIENvbXBvbmVudCB0byBhZGQgc3R5bGVzIG9uIGRlbWFuZFxuICogLSBzdHlsZXMgYXJlIGFkZGVkIHdoZW4gZmlyc3QgaW5zdGFuY2UgaXMgbW91bnRlZFxuICogLSBzdHlsZXMgYXJlIHJlbW92ZWQgd2hlbiB0aGUgbGFzdCBpbnN0YW5jZSBpcyB1bm1vdW50ZWRcbiAqIC0gY2hhbmdpbmcgc3R5bGVzIGluIHJ1bnRpbWUgZG9lcyBub3RoaW5nIHVubGVzcyBkeW5hbWljIGlzIHNldC4gQnV0IHdpdGggbXVsdGlwbGUgY29tcG9uZW50cyB0aGF0IGNhbiBsZWFkIHRvIHRoZSB1bmRlZmluZWQgYmVoYXZpb3JcbiAqL1xuZXhwb3J0IHZhciBzdHlsZVNpbmdsZXRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdXNlU3R5bGUgPSBzdHlsZUhvb2tTaW5nbGV0b24oKTtcbiAgICB2YXIgU2hlZXQgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIHN0eWxlcyA9IF9hLnN0eWxlcywgZHluYW1pYyA9IF9hLmR5bmFtaWM7XG4gICAgICAgIHVzZVN0eWxlKHN0eWxlcywgZHluYW1pYyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIFNoZWV0O1xufTtcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHN0eWxlc2hlZXRTaW5nbGV0b24gfSBmcm9tICcuL3NpbmdsZXRvbic7XG4vKipcbiAqIGNyZWF0ZXMgYSBob29rIHRvIGNvbnRyb2wgc3R5bGUgc2luZ2xldG9uXG4gKiBAc2VlIHtAbGluayBzdHlsZVNpbmdsZXRvbn0gZm9yIGEgc2FmZXIgY29tcG9uZW50IHZlcnNpb25cbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHVzZVN0eWxlID0gc3R5bGVIb29rU2luZ2xldG9uKCk7XG4gKiAvLy9cbiAqIHVzZVN0eWxlKCdib2R5IHsgb3ZlcmZsb3c6IGhpZGRlbn0nKTtcbiAqL1xuZXhwb3J0IHZhciBzdHlsZUhvb2tTaW5nbGV0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNoZWV0ID0gc3R5bGVzaGVldFNpbmdsZXRvbigpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3R5bGVzLCBpc0R5bmFtaWMpIHtcbiAgICAgICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNoZWV0LmFkZChzdHlsZXMpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzaGVldC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sIFtzdHlsZXMgJiYgaXNEeW5hbWljXSk7XG4gICAgfTtcbn07XG4iLCJleHBvcnQgeyBzdHlsZVNpbmdsZXRvbiB9IGZyb20gJy4vY29tcG9uZW50JztcbmV4cG9ydCB7IHN0eWxlc2hlZXRTaW5nbGV0b24gfSBmcm9tICcuL3NpbmdsZXRvbic7XG5leHBvcnQgeyBzdHlsZUhvb2tTaW5nbGV0b24gfSBmcm9tICcuL2hvb2snO1xuIiwiaW1wb3J0IHsgZ2V0Tm9uY2UgfSBmcm9tICdnZXQtbm9uY2UnO1xuZnVuY3Rpb24gbWFrZVN0eWxlVGFnKCkge1xuICAgIGlmICghZG9jdW1lbnQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHZhciB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHRhZy50eXBlID0gJ3RleHQvY3NzJztcbiAgICB2YXIgbm9uY2UgPSBnZXROb25jZSgpO1xuICAgIGlmIChub25jZSkge1xuICAgICAgICB0YWcuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZztcbn1cbmZ1bmN0aW9uIGluamVjdFN0eWxlcyh0YWcsIGNzcykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodGFnLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0YWcuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluc2VydFN0eWxlVGFnKHRhZykge1xuICAgIHZhciBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdO1xuICAgIGhlYWQuYXBwZW5kQ2hpbGQodGFnKTtcbn1cbmV4cG9ydCB2YXIgc3R5bGVzaGVldFNpbmdsZXRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY291bnRlciA9IDA7XG4gICAgdmFyIHN0eWxlc2hlZXQgPSBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFkZDogZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICAgICAgICBpZiAoY291bnRlciA9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKChzdHlsZXNoZWV0ID0gbWFrZVN0eWxlVGFnKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdFN0eWxlcyhzdHlsZXNoZWV0LCBzdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydFN0eWxlVGFnKHN0eWxlc2hlZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb3VudGVyLS07XG4gICAgICAgICAgICBpZiAoIWNvdW50ZXIgJiYgc3R5bGVzaGVldCkge1xuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQucGFyZW50Tm9kZSAmJiBzdHlsZXNoZWV0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVzaGVldCk7XG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuXG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG52YXIgZW5hYmxlQ2FjaGVFbGVtZW50ID0gZmFsc2U7XG52YXIgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgPSBmYWxzZTsgLy8gTm8ga25vd24gYnVncywgYnV0IG5lZWRzIHBlcmZvcm1hbmNlIHRlc3RpbmdcblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcbi8vIHN0dWZmLiBJbnRlbmRlZCB0byBlbmFibGUgUmVhY3QgY29yZSBtZW1iZXJzIHRvIG1vcmUgZWFzaWx5IGRlYnVnIHNjaGVkdWxpbmdcbi8vIGlzc3VlcyBpbiBERVYgYnVpbGRzLlxuXG52YXIgZW5hYmxlRGVidWdUcmFjaW5nID0gZmFsc2U7IC8vIFRyYWNrIHdoaWNoIEZpYmVyKHMpIHNjaGVkdWxlIHJlbmRlciB3b3JrLlxuXG52YXIgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRTtcblxue1xuICBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFID0gU3ltYm9sLmZvcigncmVhY3QubW9kdWxlLnJlZmVyZW5jZScpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgZW5hYmxlRGVidWdUcmFjaW5nICB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiAgfHwgdHlwZSA9PT0gUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgIHx8IGVuYWJsZUNhY2hlRWxlbWVudCAgfHwgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIFRoaXMgbmVlZHMgdG8gaW5jbHVkZSBhbGwgcG9zc2libGUgbW9kdWxlIHJlZmVyZW5jZSBvYmplY3RcbiAgICAvLyB0eXBlcyBzdXBwb3J0ZWQgYnkgYW55IEZsaWdodCBjb25maWd1cmF0aW9uIGFueXdoZXJlIHNpbmNlXG4gICAgLy8gd2UgZG9uJ3Qga25vdyB3aGljaCBGbGlnaHQgYnVpbGQgdGhpcyB3aWxsIGVuZCB1cCBiZWluZyB1c2VkXG4gICAgLy8gd2l0aC5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFIHx8IHR5cGUuZ2V0TW9kdWxlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgIHByZWZpeCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgICAgfVxuICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuXG5cblxuICAgIHJldHVybiAnXFxuJyArIHByZWZpeCArIG5hbWU7XG4gIH1cbn1cbnZhciByZWVudHJ5ID0gZmFsc2U7XG52YXIgY29tcG9uZW50RnJhbWVDYWNoZTtcblxue1xuICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuICBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuXG4gIGlmICggIWZuIHx8IHJlZW50cnkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB7XG4gICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udHJvbDtcbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLlxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldmlvdXNEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHtcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUsIHNob3VsZENvbnN0cnVjdCh0eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAvLyBNZW1vIG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBrZXk6IHRydWUsXG4gIHJlZjogdHJ1ZSxcbiAgX19zZWxmOiB0cnVlLFxuICBfX3NvdXJjZTogdHJ1ZVxufTtcbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bjtcbnZhciBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bjtcbnZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZywgc2VsZikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIHNlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IHNlbGYpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSk7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignQ29tcG9uZW50IFwiJXNcIiBjb250YWlucyB0aGUgc3RyaW5nIHJlZiBcIiVzXCIuICcgKyAnU3VwcG9ydCBmb3Igc3RyaW5nIHJlZnMgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuICcgKyAnVGhpcyBjYXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvbi4gJyArICdXZSBhc2sgeW91IHRvIG1hbnVhbGx5IGZpeCB0aGlzIGNhc2UgYnkgdXNpbmcgdXNlUmVmKCkgb3IgY3JlYXRlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB7XG4gICAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB7XG4gICAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZmNzL3B1bGwvMTA3XG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICovXG5cbmZ1bmN0aW9uIGpzeERFVih0eXBlLCBjb25maWcsIG1heWJlS2V5LCBzb3VyY2UsIHNlbGYpIHtcbiAge1xuICAgIHZhciBwcm9wTmFtZTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gICAgdmFyIHByb3BzID0ge307XG4gICAgdmFyIGtleSA9IG51bGw7XG4gICAgdmFyIHJlZiA9IG51bGw7IC8vIEN1cnJlbnRseSwga2V5IGNhbiBiZSBzcHJlYWQgaW4gYXMgYSBwcm9wLiBUaGlzIGNhdXNlcyBhIHBvdGVudGlhbFxuICAgIC8vIGlzc3VlIGlmIGtleSBpcyBhbHNvIGV4cGxpY2l0bHkgZGVjbGFyZWQgKGllLiA8ZGl2IHsuLi5wcm9wc30ga2V5PVwiSGlcIiAvPlxuICAgIC8vIG9yIDxkaXYga2V5PVwiSGlcIiB7Li4ucHJvcHN9IC8+ICkuIFdlIHdhbnQgdG8gZGVwcmVjYXRlIGtleSBzcHJlYWQsXG4gICAgLy8gYnV0IGFzIGFuIGludGVybWVkaWFyeSBzdGVwLCB3ZSB3aWxsIHVzZSBqc3hERVYgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0XG4gICAgLy8gPGRpdiB7Li4ucHJvcHN9IGtleT1cIkhpXCIgLz4sIGJlY2F1c2Ugd2UgYXJlbid0IGN1cnJlbnRseSBhYmxlIHRvIHRlbGwgaWZcbiAgICAvLyBrZXkgaXMgZXhwbGljaXRseSBkZWNsYXJlZCB0byBiZSB1bmRlZmluZWQgb3Igbm90LlxuXG4gICAgaWYgKG1heWJlS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihtYXliZUtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgbWF5YmVLZXk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZywgc2VsZik7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG5cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gICAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlLmRlZmF1bHRQcm9wcztcblxuICAgICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIHtcbiAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50KSB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQudHlwZSk7XG5cbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oc291cmNlKSB7XG4gIHtcbiAgICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBmaWxlTmFtZSA9IHNvdXJjZS5maWxlTmFtZS5yZXBsYWNlKC9eLipbXFxcXFxcL10vLCAnJyk7XG4gICAgICB2YXIgbGluZU51bWJlciA9IHNvdXJjZS5saW5lTnVtYmVyO1xuICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG5cblxudmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAge1xuICAgIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgICBpZiAoIWluZm8pIHtcbiAgICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZm87XG4gIH1cbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAge1xuICAgIGlmICghZWxlbWVudC5fc3RvcmUgfHwgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkIHx8IGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICAgIGlmIChvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlOyAvLyBVc3VhbGx5IHRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBvZmZlbmRlciwgYnV0IGlmIGl0IGFjY2VwdHMgY2hpbGRyZW4gYXMgYVxuICAgIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgICB2YXIgY2hpbGRPd25lciA9ICcnO1xuXG4gICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCkge1xuICAgICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgICB9XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAge1xuICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheShub2RlKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRW50cnkgaXRlcmF0b3JzIHVzZWQgdG8gcHJvdmlkZSBpbXBsaWNpdCBrZXlzLFxuICAgICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChub2RlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IHRydWU7IC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG5cbiAgICAgIHZhciBfbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgICAgZXJyb3IoJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIF9uYW1lIHx8ICdVbmtub3duJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiAhdHlwZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJyk7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGEgZnJhZ21lbnQsIHZhbGlkYXRlIHRoYXQgaXQgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2l0aCBmcmFnbWVudCBwcm9wc1xuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGZyYWdtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZnJhZ21lbnQpIHtcbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcblxuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhZ21lbnQucmVmICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuQWJvdXRLZXlTcHJlYWQgPSB7fTtcbmZ1bmN0aW9uIGpzeFdpdGhWYWxpZGF0aW9uKHR5cGUsIHByb3BzLCBrZXksIGlzU3RhdGljQ2hpbGRyZW4sIHNvdXJjZSwgc2VsZikge1xuICB7XG4gICAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgICAvLyBzdWNjZWVkIGFuZCB0aGVyZSB3aWxsIGxpa2VseSBiZSBlcnJvcnMgaW4gcmVuZGVyLlxuXG4gICAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBzb3VyY2VJbmZvID0gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oc291cmNlKTtcblxuICAgICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgICAgaW5mbyArPSBzb3VyY2VJbmZvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSAnbnVsbCc7XG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXkodHlwZSkpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKCdSZWFjdC5qc3g6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnQgPSBqc3hERVYodHlwZSwgcHJvcHMsIGtleSwgc291cmNlLCBzZWxmKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgICAvLyBUT0RPOiBEcm9wIHRoaXMgd2hlbiB0aGVzZSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQuXG5cbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9IC8vIFNraXAga2V5IHdhcm5pbmcgaWYgdGhlIHR5cGUgaXNuJ3QgdmFsaWQgc2luY2Ugb3VyIGtleSB2YWxpZGF0aW9uIGxvZ2ljXG4gICAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAgIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgICAvLyAoUmVuZGVyaW5nIHdpbGwgdGhyb3cgd2l0aCBhIGhlbHBmdWwgbWVzc2FnZSBhbmQgYXMgc29vbiBhcyB0aGUgdHlwZSBpc1xuICAgIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gICAgaWYgKHZhbGlkVHlwZSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG5cbiAgICAgIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY0NoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGNoaWxkcmVuW2ldLCB0eXBlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZShjaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yKCdSZWFjdC5qc3g6IFN0YXRpYyBjaGlsZHJlbiBzaG91bGQgYWx3YXlzIGJlIGFuIGFycmF5LiAnICsgJ1lvdSBhcmUgbGlrZWx5IGV4cGxpY2l0bHkgY2FsbGluZyBSZWFjdC5qc3hzIG9yIFJlYWN0LmpzeERFVi4gJyArICdVc2UgdGhlIEJhYmVsIHRyYW5zZm9ybSBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhjaGlsZHJlbiwgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChwcm9wcywgJ2tleScpKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICByZXR1cm4gayAhPT0gJ2tleSc7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgYmVmb3JlRXhhbXBsZSA9IGtleXMubGVuZ3RoID4gMCA/ICd7a2V5OiBzb21lS2V5LCAnICsga2V5cy5qb2luKCc6IC4uLiwgJykgKyAnOiAuLi59JyA6ICd7a2V5OiBzb21lS2V5fSc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRLZXlTcHJlYWRbY29tcG9uZW50TmFtZSArIGJlZm9yZUV4YW1wbGVdKSB7XG4gICAgICAgICAgdmFyIGFmdGVyRXhhbXBsZSA9IGtleXMubGVuZ3RoID4gMCA/ICd7JyArIGtleXMuam9pbignOiAuLi4sICcpICsgJzogLi4ufScgOiAne30nO1xuXG4gICAgICAgICAgZXJyb3IoJ0EgcHJvcHMgb2JqZWN0IGNvbnRhaW5pbmcgYSBcImtleVwiIHByb3AgaXMgYmVpbmcgc3ByZWFkIGludG8gSlNYOlxcbicgKyAnICBsZXQgcHJvcHMgPSAlcztcXG4nICsgJyAgPCVzIHsuLi5wcm9wc30gLz5cXG4nICsgJ1JlYWN0IGtleXMgbXVzdCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gSlNYIHdpdGhvdXQgdXNpbmcgc3ByZWFkOlxcbicgKyAnICBsZXQgcHJvcHMgPSAlcztcXG4nICsgJyAgPCVzIGtleT17c29tZUtleX0gey4uLnByb3BzfSAvPicsIGJlZm9yZUV4YW1wbGUsIGNvbXBvbmVudE5hbWUsIGFmdGVyRXhhbXBsZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRLZXlTcHJlYWRbY29tcG9uZW50TmFtZSArIGJlZm9yZUV4YW1wbGVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG59IC8vIFRoZXNlIHR3byBmdW5jdGlvbnMgZXhpc3QgdG8gc3RpbGwgZ2V0IGNoaWxkIHdhcm5pbmdzIGluIGRldlxuLy8gZXZlbiB3aXRoIHRoZSBwcm9kIHRyYW5zZm9ybS4gVGhpcyBtZWFucyB0aGF0IGpzeERFViBpcyBwdXJlbHlcbi8vIG9wdC1pbiBiZWhhdmlvciBmb3IgYmV0dGVyIG1lc3NhZ2VzIGJ1dCB0aGF0IHdlIHdvbid0IHN0b3Bcbi8vIGdpdmluZyB5b3Ugd2FybmluZ3MgaWYgeW91IHVzZSBwcm9kdWN0aW9uIGFwaXMuXG5cbmZ1bmN0aW9uIGpzeFdpdGhWYWxpZGF0aW9uU3RhdGljKHR5cGUsIHByb3BzLCBrZXkpIHtcbiAge1xuICAgIHJldHVybiBqc3hXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywga2V5LCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24ganN4V2l0aFZhbGlkYXRpb25EeW5hbWljKHR5cGUsIHByb3BzLCBrZXkpIHtcbiAge1xuICAgIHJldHVybiBqc3hXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywga2V5LCBmYWxzZSk7XG4gIH1cbn1cblxudmFyIGpzeCA9ICBqc3hXaXRoVmFsaWRhdGlvbkR5bmFtaWMgOyAvLyB3ZSBtYXkgd2FudCB0byBzcGVjaWFsIGNhc2UganN4cyBpbnRlcm5hbGx5IHRvIHRha2UgYWR2YW50YWdlIG9mIHN0YXRpYyBjaGlsZHJlbi5cbi8vIGZvciBub3cgd2UgY2FuIHNoaXAgaWRlbnRpY2FsIHByb2QgZnVuY3Rpb25zXG5cbnZhciBqc3hzID0gIGpzeFdpdGhWYWxpZGF0aW9uU3RhdGljIDtcblxuZXhwb3J0cy5GcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG5leHBvcnRzLmpzeCA9IGpzeDtcbmV4cG9ydHMuanN4cyA9IGpzeHM7XG4gIH0pKCk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdFZlcnNpb24gPSAnMTguMy4xJztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5Jyk7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBkaXNwYXRjaGVyLlxuICovXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGJhdGNoJ3MgY29uZmlndXJhdGlvbiBzdWNoIGFzIGhvdyBsb25nIGFuIHVwZGF0ZVxuICogc2hvdWxkIHN1c3BlbmQgZm9yIGlmIGl0IG5lZWRzIHRvLlxuICovXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcgPSB7XG4gIHRyYW5zaXRpb246IG51bGxcbn07XG5cbnZhciBSZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IHtcbiAgY3VycmVudDogbnVsbCxcbiAgLy8gVXNlZCB0byByZXByb2R1Y2UgYmVoYXZpb3Igb2YgYGJhdGNoZWRVcGRhdGVzYCBpbiBsZWdhY3kgbW9kZS5cbiAgaXNCYXRjaGluZ0xlZ2FjeTogZmFsc2UsXG4gIGRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlOiBmYWxzZVxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IHt9O1xudmFyIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBudWxsO1xuZnVuY3Rpb24gc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKSB7XG4gIHtcbiAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gIH1cbn1cblxue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZSA9IGZ1bmN0aW9uIChzdGFjaykge1xuICAgIHtcbiAgICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgICB9XG4gIH07IC8vIFN0YWNrIGltcGxlbWVudGF0aW9uIGluamVjdGVkIGJ5IHRoZSBjdXJyZW50IHJlbmRlcmVyLlxuXG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhY2sgPSAnJzsgLy8gQWRkIGFuIGV4dHJhIHRvcCBmcmFtZSB3aGlsZSBhbiBlbGVtZW50IGlzIGJlaW5nIHZhbGlkYXRlZFxuXG4gICAgaWYgKGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUpIHtcbiAgICAgIHN0YWNrICs9IGN1cnJlbnRFeHRyYVN0YWNrRnJhbWU7XG4gICAgfSAvLyBEZWxlZ2F0ZSB0byB0aGUgaW5qZWN0ZWQgcmVuZGVyZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cblxuXG4gICAgdmFyIGltcGwgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjaztcblxuICAgIGlmIChpbXBsKSB7XG4gICAgICBzdGFjayArPSBpbXBsKCkgfHwgJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG4vLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nXG4vLyBpc3N1ZXMgaW4gREVWIGJ1aWxkcy5cblxudmFyIGVuYWJsZURlYnVnVHJhY2luZyA9IGZhbHNlOyAvLyBUcmFjayB3aGljaCBGaWJlcihzKSBzY2hlZHVsZSByZW5kZXIgd29yay5cblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0ge1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyOiBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzogUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsXG4gIFJlYWN0Q3VycmVudE93bmVyOiBSZWFjdEN1cnJlbnRPd25lclxufTtcblxue1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZTtcbn1cblxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICB7XG4gICAge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IHt9O1xuXG5mdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkge1xuICB7XG4gICAgdmFyIF9jb25zdHJ1Y3RvciA9IHB1YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gX2NvbnN0cnVjdG9yICYmIChfY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgX2NvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJztcbiAgICB2YXIgd2FybmluZ0tleSA9IGNvbXBvbmVudE5hbWUgKyBcIi5cIiArIGNhbGxlck5hbWU7XG5cbiAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXJyb3IoXCJDYW4ndCBjYWxsICVzIG9uIGEgY29tcG9uZW50IHRoYXQgaXMgbm90IHlldCBtb3VudGVkLiBcIiArICdUaGlzIGlzIGEgbm8tb3AsIGJ1dCBpdCBtaWdodCBpbmRpY2F0ZSBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiAnICsgJ0luc3RlYWQsIGFzc2lnbiB0byBgdGhpcy5zdGF0ZWAgZGlyZWN0bHkgb3IgZGVmaW5lIGEgYHN0YXRlID0ge307YCAnICsgJ2NsYXNzIHByb3BlcnR5IHdpdGggdGhlIGRlc2lyZWQgc3RhdGUgaW4gdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBjb21wb25lbnROYW1lKTtcblxuICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSA9IHRydWU7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBpcyB0aGUgYWJzdHJhY3QgQVBJIGZvciBhbiB1cGRhdGUgcXVldWUuXG4gKi9cblxuXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gTmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcbiAgfVxufTtcblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbnZhciBlbXB0eU9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIGhlbHBlcnMgZm9yIHRoZSB1cGRhdGluZyBzdGF0ZSBvZiBhIGNvbXBvbmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0OyAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZVxuICAvLyByZW5kZXJlci5cblxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5Db21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcbi8qKlxuICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyB0byBtdXRhdGVcbiAqIHN0YXRlLiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCB3aWxsIHJ1biBzeW5jaHJvbm91c2x5LFxuICogYXMgdGhleSBtYXkgZXZlbnR1YWxseSBiZSBiYXRjaGVkIHRvZ2V0aGVyLiAgWW91IGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsXG4gKiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2FsbCB0byBzZXRTdGF0ZSBpcyBhY3R1YWxseVxuICogY29tcGxldGVkLlxuICpcbiAqIFdoZW4gYSBmdW5jdGlvbiBpcyBwcm92aWRlZCB0byBzZXRTdGF0ZSwgaXQgd2lsbCBiZSBjYWxsZWQgYXQgc29tZSBwb2ludCBpblxuICogdGhlIGZ1dHVyZSAobm90IHN5bmNocm9ub3VzbHkpLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSB1cCB0byBkYXRlXG4gKiBjb21wb25lbnQgYXJndW1lbnRzIChzdGF0ZSwgcHJvcHMsIGNvbnRleHQpLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGRpZmZlcmVudFxuICogZnJvbSB0aGlzLiogYmVjYXVzZSB5b3VyIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYWZ0ZXIgcmVjZWl2ZVByb3BzIGJ1dCBiZWZvcmVcbiAqIHNob3VsZENvbXBvbmVudFVwZGF0ZSwgYW5kIHRoaXMgbmV3IHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgd2lsbCBub3QgeWV0IGJlXG4gKiBhc3NpZ25lZCB0byB0aGlzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIG9yIGZ1bmN0aW9uIHRvXG4gKiAgICAgICAgcHJvZHVjZSBuZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggY3VycmVudCBzdGF0ZS5cbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIHBhcnRpYWxTdGF0ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHBhcnRpYWxTdGF0ZSAhPT0gJ2Z1bmN0aW9uJyAmJiBwYXJ0aWFsU3RhdGUgIT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0U3RhdGUoLi4uKTogdGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3IgYSAnICsgJ2Z1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy4nKTtcbiAgfVxuXG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcywgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG59O1xuLyoqXG4gKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAqXG4gKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAqXG4gKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICpcbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuXG5Db21wb25lbnQucHJvdG90eXBlLmZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcywgY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xufTtcbi8qKlxuICogRGVwcmVjYXRlZCBBUElzLiBUaGVzZSBBUElzIHVzZWQgdG8gZXhpc3Qgb24gY2xhc3NpYyBSZWFjdCBjbGFzc2VzIGJ1dCBzaW5jZVxuICogd2Ugd291bGQgbGlrZSB0byBkZXByZWNhdGUgdGhlbSwgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgdGhlbSBvdmVyIHRvIHRoaXNcbiAqIG1vZGVybiBiYXNlIGNsYXNzLiBJbnN0ZWFkLCB3ZSBkZWZpbmUgYSBnZXR0ZXIgdGhhdCB3YXJucyBpZiBpdCdzIGFjY2Vzc2VkLlxuICovXG5cblxue1xuICB2YXIgZGVwcmVjYXRlZEFQSXMgPSB7XG4gICAgaXNNb3VudGVkOiBbJ2lzTW91bnRlZCcsICdJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGluZyByZXF1ZXN0cyBpbiAnICsgJ2NvbXBvbmVudFdpbGxVbm1vdW50IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLiddLFxuICAgIHJlcGxhY2VTdGF0ZTogWydyZXBsYWNlU3RhdGUnLCAnUmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBzZXRTdGF0ZSBpbnN0ZWFkIChzZWUgJyArICdodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzMyMzYpLiddXG4gIH07XG5cbiAgdmFyIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyA9IGZ1bmN0aW9uIChtZXRob2ROYW1lLCBpbmZvKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudC5wcm90b3R5cGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB3YXJuKCclcyguLi4pIGlzIGRlcHJlY2F0ZWQgaW4gcGxhaW4gSmF2YVNjcmlwdCBSZWFjdCBjbGFzc2VzLiAlcycsIGluZm9bMF0sIGluZm9bMV0pO1xuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgZm9yICh2YXIgZm5OYW1lIGluIGRlcHJlY2F0ZWRBUElzKSB7XG4gICAgaWYgKGRlcHJlY2F0ZWRBUElzLmhhc093blByb3BlcnR5KGZuTmFtZSkpIHtcbiAgICAgIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhmbk5hbWUsIGRlcHJlY2F0ZWRBUElzW2ZuTmFtZV0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBDb21wb25lbnREdW1teSgpIHt9XG5cbkNvbXBvbmVudER1bW15LnByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4vKipcbiAqIENvbnZlbmllbmNlIGNvbXBvbmVudCB3aXRoIGRlZmF1bHQgc2hhbGxvdyBlcXVhbGl0eSBjaGVjayBmb3Igc0NVLlxuICovXG5cbmZ1bmN0aW9uIFB1cmVDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cblxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxudmFyIHB1cmVDb21wb25lbnRQcm90b3R5cGUgPSBQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFB1cmVDb21wb25lbnQ7IC8vIEF2b2lkIGFuIGV4dHJhIHByb3RvdHlwZSBqdW1wIGZvciB0aGVzZSBtZXRob2RzLlxuXG5hc3NpZ24ocHVyZUNvbXBvbmVudFByb3RvdHlwZSwgQ29tcG9uZW50LnByb3RvdHlwZSk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gdHJ1ZTtcblxuLy8gYW4gaW1tdXRhYmxlIG9iamVjdCB3aXRoIGEgc2luZ2xlIG11dGFibGUgdmFsdWVcbmZ1bmN0aW9uIGNyZWF0ZVJlZigpIHtcbiAgdmFyIHJlZk9iamVjdCA9IHtcbiAgICBjdXJyZW50OiBudWxsXG4gIH07XG5cbiAge1xuICAgIE9iamVjdC5zZWFsKHJlZk9iamVjdCk7XG4gIH1cblxuICByZXR1cm4gcmVmT2JqZWN0O1xufVxuXG52YXIgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYSkge1xuICByZXR1cm4gaXNBcnJheUltcGwoYSk7XG59XG5cbi8qXG4gKiBUaGUgYCcnICsgdmFsdWVgIHBhdHRlcm4gKHVzZWQgaW4gaW4gcGVyZi1zZW5zaXRpdmUgY29kZSkgdGhyb3dzIGZvciBTeW1ib2xcbiAqIGFuZCBUZW1wb3JhbC4qIHR5cGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjIwNjQuXG4gKlxuICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB3aWxsIHRocm93IGFuIGVhc2llci10by11bmRlcnN0YW5kLFxuICogZWFzaWVyLXRvLWRlYnVnIGV4Y2VwdGlvbiB3aXRoIGEgY2xlYXIgZXJyb3JzIG1lc3NhZ2UgbWVzc2FnZSBleHBsYWluaW5nIHRoZVxuICogcHJvYmxlbS4gKEluc3RlYWQgb2YgYSBjb25mdXNpbmcgZXhjZXB0aW9uIHRocm93biBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uXG4gKiBvZiB0aGUgYHZhbHVlYCBvYmplY3QpLlxuICovXG4vLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuZnVuY3Rpb24gdHlwZU5hbWUodmFsdWUpIHtcbiAge1xuICAgIC8vIHRvU3RyaW5nVGFnIGlzIG5lZWRlZCBmb3IgbmFtZXNwYWNlZCB0eXBlcyBsaWtlIFRlbXBvcmFsLkluc3RhbnRcbiAgICB2YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZztcbiAgICB2YXIgdHlwZSA9IGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JztcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxufSAvLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuXG5cbmZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gIHtcbiAgICB0cnkge1xuICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQnc1xuICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LFxuICAvLyBET00gYXR0cmlidXRlLCBDU1MgcHJvcGVydHksIHN0cmluZyByZWYsIGV0Yy4pIGFuZCB3aGVuIFJlYWN0IHRyaWVkIHRvXG4gIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuICAvL1xuICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZXMgdGhhdCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIGFyZSBgU3ltYm9sYCBpbnN0YW5jZXNcbiAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGFcbiAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzXG4gIC8vIGV4Y2VwdGlvbi4gKExpYnJhcnkgYXV0aG9ycyBkbyB0aGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyBidWlsdC1pblxuICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b21cbiAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLilcbiAgLy9cbiAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuXG4gIC8vXG4gIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuXG4gIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dFxuICAvLyB0aGF0IHNob3dzIHRoZSB0eXBlIChTeW1ib2wsIFRlbXBvcmFsLlBsYWluRGF0ZSwgZXRjLikgdGhhdCBjYXVzZWQgdGhlXG4gIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHNcbiAgLy8gYW5jZXN0b3IgY29tcG9uZW50cyB3aGVyZSB0aGUgZXhjZXB0aW9uIGhhcHBlbmVkLlxuICAvL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBrZXk6IHRydWUsXG4gIHJlZjogdHJ1ZSxcbiAgX19zZWxmOiB0cnVlLFxuICBfX3NvdXJjZTogdHJ1ZVxufTtcbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biwgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24sIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG5cbntcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIGNvbmZpZy5fX3NlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IGNvbmZpZy5fX3NlbGYpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSk7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignQ29tcG9uZW50IFwiJXNcIiBjb250YWlucyB0aGUgc3RyaW5nIHJlZiBcIiVzXCIuICcgKyAnU3VwcG9ydCBmb3Igc3RyaW5nIHJlZnMgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuICcgKyAnVGhpcyBjYXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvbi4gJyArICdXZSBhc2sgeW91IHRvIG1hbnVhbGx5IGZpeCB0aGlzIGNhc2UgYnkgdXNpbmcgdXNlUmVmKCkgb3IgY3JlYXRlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnLCBjb21wb25lbnROYW1lLCBjb25maWcucmVmKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5cblxudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3dzIHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9OyAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmYWxzZVxuICAgIH0pOyAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNlbGZcbiAgICB9KTsgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzb3VyY2VcbiAgICB9KTtcblxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjY3JlYXRlZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWU7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICB2YXIgcHJvcHMgPSB7fTtcbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciByZWYgPSBudWxsO1xuICB2YXIgc2VsZiA9IG51bGw7XG4gIHZhciBzb3VyY2UgPSBudWxsO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuXG4gICAgICB7XG4gICAgICAgIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICBzZWxmID0gY29uZmlnLl9fc2VsZiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NlbGY7XG4gICAgc291cmNlID0gY29uZmlnLl9fc291cmNlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc291cmNlOyAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuXG5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZShjaGlsZEFycmF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH0gLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG5cblxuICBpZiAodHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcykge1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlLmRlZmF1bHRQcm9wcztcblxuICAgIGZvciAocHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKGtleSB8fCByZWYpIHtcbiAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7XG59XG5mdW5jdGlvbiBjbG9uZUFuZFJlcGxhY2VLZXkob2xkRWxlbWVudCwgbmV3S2V5KSB7XG4gIHZhciBuZXdFbGVtZW50ID0gUmVhY3RFbGVtZW50KG9sZEVsZW1lbnQudHlwZSwgbmV3S2V5LCBvbGRFbGVtZW50LnJlZiwgb2xkRWxlbWVudC5fc2VsZiwgb2xkRWxlbWVudC5fc291cmNlLCBvbGRFbGVtZW50Ll9vd25lciwgb2xkRWxlbWVudC5wcm9wcyk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuLyoqXG4gKiBDbG9uZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCB1c2luZyBlbGVtZW50IGFzIHRoZSBzdGFydGluZyBwb2ludC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjY2xvbmVlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgaWYgKGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgXCIgKyBlbGVtZW50ICsgXCIuXCIpO1xuICB9XG5cbiAgdmFyIHByb3BOYW1lOyAvLyBPcmlnaW5hbCBwcm9wcyBhcmUgY29waWVkXG5cbiAgdmFyIHByb3BzID0gYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHJlZiA9IGVsZW1lbnQucmVmOyAvLyBTZWxmIGlzIHByZXNlcnZlZCBzaW5jZSB0aGUgb3duZXIgaXMgcHJlc2VydmVkLlxuXG4gIHZhciBzZWxmID0gZWxlbWVudC5fc2VsZjsgLy8gU291cmNlIGlzIHByZXNlcnZlZCBzaW5jZSBjbG9uZUVsZW1lbnQgaXMgdW5saWtlbHkgdG8gYmUgdGFyZ2V0ZWQgYnkgYVxuICAvLyB0cmFuc3BpbGVyLCBhbmQgdGhlIG9yaWdpbmFsIHNvdXJjZSBpcyBwcm9iYWJseSBhIGJldHRlciBpbmRpY2F0b3Igb2YgdGhlXG4gIC8vIHRydWUgb3duZXIuXG5cbiAgdmFyIHNvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTsgLy8gT3duZXIgd2lsbCBiZSBwcmVzZXJ2ZWQsIHVubGVzcyByZWYgaXMgb3ZlcnJpZGRlblxuXG4gIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICAvLyBTaWxlbnRseSBzdGVhbCB0aGUgcmVmIGZyb20gdGhlIHBhcmVudC5cbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgICBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHNcblxuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcblxuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcztcbiAgICB9XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5cbnZhciBTRVBBUkFUT1IgPSAnLic7XG52YXIgU1VCU0VQQVJBVE9SID0gJzonO1xuLyoqXG4gKiBFc2NhcGUgYW5kIHdyYXAga2V5IHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgcmVhY3RpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gYmUgZXNjYXBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGVzY2FwZWQga2V5LlxuICovXG5cbmZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgdmFyIGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZztcbiAgdmFyIGVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0nOiAnPTAnLFxuICAgICc6JzogJz0yJ1xuICB9O1xuICB2YXIgZXNjYXBlZFN0cmluZyA9IGtleS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuICByZXR1cm4gJyQnICsgZXNjYXBlZFN0cmluZztcbn1cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cblxudmFyIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbnZhciB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCA9IC9cXC8rL2c7XG5cbmZ1bmN0aW9uIGVzY2FwZVVzZXJQcm92aWRlZEtleSh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UodXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsICckJi8nKTtcbn1cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGVsZW1lbnQgd2l0aGluIGEgc2V0LlxuICpcbiAqIEBwYXJhbSB7Kn0gZWxlbWVudCBBIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRLZXkoZWxlbWVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ29iamVjdCcgJiYgZWxlbWVudCAhPT0gbnVsbCAmJiBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAge1xuICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihlbGVtZW50LmtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVzY2FwZSgnJyArIGVsZW1lbnQua2V5KTtcbiAgfSAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuXG5cbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuZnVuY3Rpb24gbWFwSW50b0FycmF5KGNoaWxkcmVuLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmFtZVNvRmFyLCBjYWxsYmFjaykge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBjaGlsZHJlbjtcblxuICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgLy8gQWxsIG9mIHRoZSBhYm92ZSBhcmUgcGVyY2VpdmVkIGFzIG51bGwuXG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgdmFyIGludm9rZUNhbGxiYWNrID0gZmFsc2U7XG5cbiAgaWYgKGNoaWxkcmVuID09PSBudWxsKSB7XG4gICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHN3aXRjaCAoY2hpbGRyZW4uJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICB9XG4gIH1cblxuICBpZiAoaW52b2tlQ2FsbGJhY2spIHtcbiAgICB2YXIgX2NoaWxkID0gY2hpbGRyZW47XG4gICAgdmFyIG1hcHBlZENoaWxkID0gY2FsbGJhY2soX2NoaWxkKTsgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzOlxuXG4gICAgdmFyIGNoaWxkS2V5ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldEVsZW1lbnRLZXkoX2NoaWxkLCAwKSA6IG5hbWVTb0ZhcjtcblxuICAgIGlmIChpc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgICAgdmFyIGVzY2FwZWRDaGlsZEtleSA9ICcnO1xuXG4gICAgICBpZiAoY2hpbGRLZXkgIT0gbnVsbCkge1xuICAgICAgICBlc2NhcGVkQ2hpbGRLZXkgPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoY2hpbGRLZXkpICsgJy8nO1xuICAgICAgfVxuXG4gICAgICBtYXBJbnRvQXJyYXkobWFwcGVkQ2hpbGQsIGFycmF5LCBlc2NhcGVkQ2hpbGRLZXksICcnLCBmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobWFwcGVkQ2hpbGQgIT0gbnVsbCkge1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KG1hcHBlZENoaWxkKSkge1xuICAgICAgICB7XG4gICAgICAgICAgLy8gVGhlIGBpZmAgc3RhdGVtZW50IGhlcmUgcHJldmVudHMgYXV0by1kaXNhYmxpbmcgb2YgdGhlIHNhZmVcbiAgICAgICAgICAvLyBjb2VyY2lvbiBFU0xpbnQgcnVsZSwgc28gd2UgbXVzdCBtYW51YWxseSBkaXNhYmxlIGl0IGJlbG93LlxuICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICAgIGlmIChtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSkge1xuICAgICAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihtYXBwZWRDaGlsZC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1hcHBlZENoaWxkID0gY2xvbmVBbmRSZXBsYWNlS2V5KG1hcHBlZENoaWxkLCAvLyBLZWVwIGJvdGggdGhlIChtYXBwZWQpIGFuZCBvbGQga2V5cyBpZiB0aGV5IGRpZmZlciwganVzdCBhc1xuICAgICAgICAvLyB0cmF2ZXJzZUFsbENoaWxkcmVuIHVzZWQgdG8gZG8gZm9yIG9iamVjdHMgYXMgY2hpbGRyZW5cbiAgICAgICAgZXNjYXBlZFByZWZpeCArICggLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5XG4gICAgICAgIG1hcHBlZENoaWxkLmtleSAmJiAoIV9jaGlsZCB8fCBfY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpID8gLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBleGlzdGluZyBlbGVtZW50J3Mga2V5IGNhbiBiZSBhIG51bWJlclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgICAgZXNjYXBlVXNlclByb3ZpZGVkS2V5KCcnICsgbWFwcGVkQ2hpbGQua2V5KSArICcvJyA6ICcnKSArIGNoaWxkS2V5KTtcbiAgICAgIH1cblxuICAgICAgYXJyYXkucHVzaChtYXBwZWRDaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgY2hpbGQ7XG4gIHZhciBuZXh0TmFtZTtcbiAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuXG5cbiAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjtcblxuICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGkpO1xuICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBpdGVyYWJsZUNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAgIHtcbiAgICAgICAgLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG4gICAgICAgIGlmIChpdGVyYXRvckZuID09PSBpdGVyYWJsZUNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dE1hcHMpIHtcbiAgICAgICAgICAgIHdhcm4oJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChpdGVyYWJsZUNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGlpID0gMDtcblxuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7XG4gICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICB2YXIgY2hpbGRyZW5TdHJpbmcgPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcpICsgXCIpLiBcIiArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VidHJlZUNvdW50O1xufVxuXG4vKipcbiAqIE1hcHMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm1hcFxuICpcbiAqIFRoZSBwcm92aWRlZCBtYXBGdW5jdGlvbihjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmdW5jIFRoZSBtYXAgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBmb3IgbWFwRnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCBjb250YWluaW5nIHRoZSBvcmRlcmVkIG1hcCBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGNvdW50ID0gMDtcbiAgbWFwSW50b0FycmF5KGNoaWxkcmVuLCByZXN1bHQsICcnLCAnJywgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgY291bnQrKyk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb3VudCB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXNcbiAqIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuY291bnRcbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbi5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvdW50Q2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIG4gPSAwO1xuICBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKCkge1xuICAgIG4rKzsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nXG4gIH0pO1xuICByZXR1cm4gbjtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5mb3JlYWNoXG4gKlxuICogVGhlIHByb3ZpZGVkIGZvckVhY2hGdW5jKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZvckVhY2hGdW5jXG4gKiBAcGFyYW0geyp9IGZvckVhY2hDb250ZXh0IENvbnRleHQgZm9yIGZvckVhY2hDb250ZXh0LlxuICovXG5mdW5jdGlvbiBmb3JFYWNoQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVhY2hGdW5jLCBmb3JFYWNoQ29udGV4dCkge1xuICBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKCkge1xuICAgIGZvckVhY2hGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIERvbid0IHJldHVybiBhbnl0aGluZy5cbiAgfSwgZm9yRWFjaENvbnRleHQpO1xufVxuLyoqXG4gKiBGbGF0dGVuIGEgY2hpbGRyZW4gb2JqZWN0ICh0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmApIGFuZFxuICogcmV0dXJuIGFuIGFycmF5IHdpdGggYXBwcm9wcmlhdGVseSByZS1rZXllZCBjaGlsZHJlbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW50b2FycmF5XG4gKi9cblxuXG5mdW5jdGlvbiB0b0FycmF5KGNoaWxkcmVuKSB7XG4gIHJldHVybiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9KSB8fCBbXTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgaW4gYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuIGFuZCB2ZXJpZmllcyB0aGF0IHRoZXJlXG4gKiBpcyBvbmx5IG9uZSBjaGlsZCBpbiB0aGUgY29sbGVjdGlvbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5vbmx5XG4gKlxuICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYSBzaW5nbGUgY2hpbGQgZ2V0c1xuICogcGFzc2VkIHdpdGhvdXQgYSB3cmFwcGVyLCBidXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdG9cbiAqIGFic3RyYWN0IGF3YXkgdGhlIHBhcnRpY3VsYXIgc3RydWN0dXJlIG9mIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gY2hpbGRyZW4gQ2hpbGQgY29sbGVjdGlvbiBzdHJ1Y3R1cmUuXG4gKiBAcmV0dXJuIHtSZWFjdEVsZW1lbnR9IFRoZSBmaXJzdCBhbmQgb25seSBgUmVhY3RFbGVtZW50YCBjb250YWluZWQgaW4gdGhlXG4gKiBzdHJ1Y3R1cmUuXG4gKi9cblxuXG5mdW5jdGlvbiBvbmx5Q2hpbGQoY2hpbGRyZW4pIHtcbiAgaWYgKCFpc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLicpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSkge1xuICAvLyBUT0RPOiBTZWNvbmQgYXJndW1lbnQgdXNlZCB0byBiZSBhbiBvcHRpb25hbCBgY2FsY3VsYXRlQ2hhbmdlZEJpdHNgXG4gIC8vIGZ1bmN0aW9uLiBXYXJuIHRvIHJlc2VydmUgZm9yIGZ1dHVyZSB1c2U/XG4gIHZhciBjb250ZXh0ID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgLy8gQXMgYSB3b3JrYXJvdW5kIHRvIHN1cHBvcnQgbXVsdGlwbGUgY29uY3VycmVudCByZW5kZXJlcnMsIHdlIGNhdGVnb3JpemVcbiAgICAvLyBzb21lIHJlbmRlcmVycyBhcyBwcmltYXJ5IGFuZCBvdGhlcnMgYXMgc2Vjb25kYXJ5LiBXZSBvbmx5IGV4cGVjdFxuICAgIC8vIHRoZXJlIHRvIGJlIHR3byBjb25jdXJyZW50IHJlbmRlcmVycyBhdCBtb3N0OiBSZWFjdCBOYXRpdmUgKHByaW1hcnkpIGFuZFxuICAgIC8vIEZhYnJpYyAoc2Vjb25kYXJ5KTsgUmVhY3QgRE9NIChwcmltYXJ5KSBhbmQgUmVhY3QgQVJUIChzZWNvbmRhcnkpLlxuICAgIC8vIFNlY29uZGFyeSByZW5kZXJlcnMgc3RvcmUgdGhlaXIgY29udGV4dCB2YWx1ZXMgb24gc2VwYXJhdGUgZmllbGRzLlxuICAgIF9jdXJyZW50VmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICBfY3VycmVudFZhbHVlMjogZGVmYXVsdFZhbHVlLFxuICAgIC8vIFVzZWQgdG8gdHJhY2sgaG93IG1hbnkgY29uY3VycmVudCByZW5kZXJlcnMgdGhpcyBjb250ZXh0IGN1cnJlbnRseVxuICAgIC8vIHN1cHBvcnRzIHdpdGhpbiBpbiBhIHNpbmdsZSByZW5kZXJlci4gU3VjaCBhcyBwYXJhbGxlbCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgIF90aHJlYWRDb3VudDogMCxcbiAgICAvLyBUaGVzZSBhcmUgY2lyY3VsYXJcbiAgICBQcm92aWRlcjogbnVsbCxcbiAgICBDb25zdW1lcjogbnVsbCxcbiAgICAvLyBBZGQgdGhlc2UgdG8gdXNlIHNhbWUgaGlkZGVuIGNsYXNzIGluIFZNIGFzIFNlcnZlckNvbnRleHRcbiAgICBfZGVmYXVsdFZhbHVlOiBudWxsLFxuICAgIF9nbG9iYWxOYW1lOiBudWxsXG4gIH07XG4gIGNvbnRleHQuUHJvdmlkZXIgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BST1ZJREVSX1RZUEUsXG4gICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgfTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSBmYWxzZTtcblxuICB7XG4gICAgLy8gQSBzZXBhcmF0ZSBvYmplY3QsIGJ1dCBwcm94aWVzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgb2JqZWN0IGZvclxuICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBoYXMgYSBkaWZmZXJlbnQgJCR0eXBlb2YsIHNvIHdlIGNhbiBwcm9wZXJseVxuICAgIC8vIHdhcm4gZm9yIHRoZSBpbmNvcnJlY3QgdXNhZ2Ugb2YgQ29udGV4dCBhcyBhIENvbnN1bWVyLlxuICAgIHZhciBDb25zdW1lciA9IHtcbiAgICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgICBfY29udGV4dDogY29udGV4dFxuICAgIH07IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG5vdCBzZXR0aW5nIGEgdmFsdWUsIHdoaWNoIGlzIGludGVudGlvbmFsIGhlcmVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENvbnN1bWVyLCB7XG4gICAgICBQcm92aWRlcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuUHJvdmlkZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuUHJvdmlkZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuUHJvdmlkZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9Qcm92aWRlcikge1xuICAgICAgICAgIGNvbnRleHQuUHJvdmlkZXIgPSBfUHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBfY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZTI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUyKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlMiA9IF9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX3RocmVhZENvdW50OiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll90aHJlYWRDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX3RocmVhZENvdW50KSB7XG4gICAgICAgICAgY29udGV4dC5fdGhyZWFkQ291bnQgPSBfdGhyZWFkQ291bnQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBDb25zdW1lcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuQ29uc3VtZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuQ29uc3VtZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkaXNwbGF5TmFtZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5kaXNwbGF5TmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyKSB7XG4gICAgICAgICAgICB3YXJuKCdTZXR0aW5nIGBkaXNwbGF5TmFtZWAgb24gQ29udGV4dC5Db25zdW1lciBoYXMgbm8gZWZmZWN0LiAnICsgXCJZb3Ugc2hvdWxkIHNldCBpdCBkaXJlY3RseSBvbiB0aGUgY29udGV4dCB3aXRoIENvbnRleHQuZGlzcGxheU5hbWUgPSAnJXMnLlwiLCBkaXNwbGF5TmFtZSk7XG5cbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbWlzc2luZyBwcm9wZXJ0aWVzIGJlY2F1c2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIGRlZmluZVByb3BlcnR5XG5cbiAgICBjb250ZXh0LkNvbnN1bWVyID0gQ29uc3VtZXI7XG4gIH1cblxuICB7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID0gbnVsbDtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIyID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBjb250ZXh0O1xufVxuXG52YXIgVW5pbml0aWFsaXplZCA9IC0xO1xudmFyIFBlbmRpbmcgPSAwO1xudmFyIFJlc29sdmVkID0gMTtcbnZhciBSZWplY3RlZCA9IDI7XG5cbmZ1bmN0aW9uIGxhenlJbml0aWFsaXplcihwYXlsb2FkKSB7XG4gIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICB2YXIgY3RvciA9IHBheWxvYWQuX3Jlc3VsdDtcbiAgICB2YXIgdGhlbmFibGUgPSBjdG9yKCk7IC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgLy8gVGhpcyBtaWdodCB0aHJvdyBlaXRoZXIgYmVjYXVzZSBpdCdzIG1pc3Npbmcgb3IgdGhyb3dzLiBJZiBzbywgd2UgdHJlYXQgaXRcbiAgICAvLyBhcyBzdGlsbCB1bmluaXRpYWxpemVkIGFuZCB0cnkgYWdhaW4gbmV4dCB0aW1lLiBXaGljaCBpcyB0aGUgc2FtZSBhcyB3aGF0XG4gICAgLy8gaGFwcGVucyBpZiB0aGUgY3RvciBvciBhbnkgd3JhcHBlcnMgcHJvY2Vzc2luZyB0aGUgY3RvciB0aHJvd3MuIFRoaXMgbWlnaHRcbiAgICAvLyBlbmQgdXAgZml4aW5nIGl0IGlmIHRoZSByZXNvbHV0aW9uIHdhcyBhIGNvbmN1cnJlbmN5IGJ1Zy5cblxuICAgIHRoZW5hYmxlLnRoZW4oZnVuY3Rpb24gKG1vZHVsZU9iamVjdCkge1xuICAgICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUGVuZGluZyB8fCBwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAgICAgdmFyIHJlc29sdmVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVzb2x2ZWQuX3N0YXR1cyA9IFJlc29sdmVkO1xuICAgICAgICByZXNvbHZlZC5fcmVzdWx0ID0gbW9kdWxlT2JqZWN0O1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUGVuZGluZyB8fCBwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAgICAgdmFyIHJlamVjdGVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVqZWN0ZWQuX3N0YXR1cyA9IFJlamVjdGVkO1xuICAgICAgICByZWplY3RlZC5fcmVzdWx0ID0gZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAvLyBJbiBjYXNlLCB3ZSdyZSBzdGlsbCB1bmluaXRpYWxpemVkLCB0aGVuIHdlJ3JlIHdhaXRpbmcgZm9yIHRoZSB0aGVuYWJsZVxuICAgICAgLy8gdG8gcmVzb2x2ZS4gU2V0IGl0IGFzIHBlbmRpbmcgaW4gdGhlIG1lYW50aW1lLlxuICAgICAgdmFyIHBlbmRpbmcgPSBwYXlsb2FkO1xuICAgICAgcGVuZGluZy5fc3RhdHVzID0gUGVuZGluZztcbiAgICAgIHBlbmRpbmcuX3Jlc3VsdCA9IHRoZW5hYmxlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFJlc29sdmVkKSB7XG4gICAgdmFyIG1vZHVsZU9iamVjdCA9IHBheWxvYWQuX3Jlc3VsdDtcblxuICAgIHtcbiAgICAgIGlmIChtb2R1bGVPYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wJyArICdvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICdjb25zdCBNeUNvbXBvbmVudCA9IGxhenkoKCkgPT4gaW1wJyArIFwib3J0KCcuL015Q29tcG9uZW50JykpXFxuXFxuXCIgKyAnRGlkIHlvdSBhY2NpZGVudGFsbHkgcHV0IGN1cmx5IGJyYWNlcyBhcm91bmQgdGhlIGltcG9ydD8nLCBtb2R1bGVPYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICghKCdkZWZhdWx0JyBpbiBtb2R1bGVPYmplY3QpKSB7XG4gICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXAnICsgJ29ydCgpIGNhbGwuICcgKyAnSW5zdGVhZCByZWNlaXZlZDogJXNcXG5cXG5Zb3VyIGNvZGUgc2hvdWxkIGxvb2sgbGlrZTogXFxuICAnICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2NvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXAnICsgXCJvcnQoJy4vTXlDb21wb25lbnQnKSlcIiwgbW9kdWxlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbW9kdWxlT2JqZWN0LmRlZmF1bHQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgcGF5bG9hZC5fcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGxhenkoY3Rvcikge1xuICB2YXIgcGF5bG9hZCA9IHtcbiAgICAvLyBXZSB1c2UgdGhlc2UgZmllbGRzIHRvIHN0b3JlIHRoZSByZXN1bHQuXG4gICAgX3N0YXR1czogVW5pbml0aWFsaXplZCxcbiAgICBfcmVzdWx0OiBjdG9yXG4gIH07XG4gIHZhciBsYXp5VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfTEFaWV9UWVBFLFxuICAgIF9wYXlsb2FkOiBwYXlsb2FkLFxuICAgIF9pbml0OiBsYXp5SW5pdGlhbGl6ZXJcbiAgfTtcblxuICB7XG4gICAgLy8gSW4gcHJvZHVjdGlvbiwgdGhpcyB3b3VsZCBqdXN0IHNldCBpdCBvbiB0aGUgb2JqZWN0LlxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG4gICAgdmFyIHByb3BUeXBlczsgLy8gJEZsb3dGaXhNZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGF6eVR5cGUsIHtcbiAgICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0UHJvcHM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld0RlZmF1bHRQcm9wcykge1xuICAgICAgICAgIGVycm9yKCdSZWFjdC5sYXp5KC4uLik6IEl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gYXNzaWduIGBkZWZhdWx0UHJvcHNgIHRvICcgKyAnYSBsYXp5IGNvbXBvbmVudCBpbXBvcnQuIEVpdGhlciBzcGVjaWZ5IHRoZW0gd2hlcmUgdGhlIGNvbXBvbmVudCAnICsgJ2lzIGRlZmluZWQsIG9yIGNyZWF0ZSBhIHdyYXBwaW5nIGNvbXBvbmVudCBhcm91bmQgaXQuJyk7XG5cbiAgICAgICAgICBkZWZhdWx0UHJvcHMgPSBuZXdEZWZhdWx0UHJvcHM7IC8vIE1hdGNoIHByb2R1Y3Rpb24gYmVoYXZpb3IgbW9yZSBjbG9zZWx5OlxuICAgICAgICAgIC8vICRGbG93Rml4TWVcblxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ2RlZmF1bHRQcm9wcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb3BUeXBlczoge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBwcm9wVHlwZXM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld1Byb3BUeXBlcykge1xuICAgICAgICAgIGVycm9yKCdSZWFjdC5sYXp5KC4uLik6IEl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gYXNzaWduIGBwcm9wVHlwZXNgIHRvICcgKyAnYSBsYXp5IGNvbXBvbmVudCBpbXBvcnQuIEVpdGhlciBzcGVjaWZ5IHRoZW0gd2hlcmUgdGhlIGNvbXBvbmVudCAnICsgJ2lzIGRlZmluZWQsIG9yIGNyZWF0ZSBhIHdyYXBwaW5nIGNvbXBvbmVudCBhcm91bmQgaXQuJyk7XG5cbiAgICAgICAgICBwcm9wVHlwZXMgPSBuZXdQcm9wVHlwZXM7IC8vIE1hdGNoIHByb2R1Y3Rpb24gYmVoYXZpb3IgbW9yZSBjbG9zZWx5OlxuICAgICAgICAgIC8vICRGbG93Rml4TWVcblxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ3Byb3BUeXBlcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxhenlUeXBlO1xufVxuXG5mdW5jdGlvbiBmb3J3YXJkUmVmKHJlbmRlcikge1xuICB7XG4gICAgaWYgKHJlbmRlciAhPSBudWxsICYmIHJlbmRlci4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICBlcnJvcignZm9yd2FyZFJlZiByZXF1aXJlcyBhIHJlbmRlciBmdW5jdGlvbiBidXQgcmVjZWl2ZWQgYSBgbWVtb2AgJyArICdjb21wb25lbnQuIEluc3RlYWQgb2YgZm9yd2FyZFJlZihtZW1vKC4uLikpLCB1c2UgJyArICdtZW1vKGZvcndhcmRSZWYoLi4uKSkuJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVuZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignZm9yd2FyZFJlZiByZXF1aXJlcyBhIHJlbmRlciBmdW5jdGlvbiBidXQgd2FzIGdpdmVuICVzLicsIHJlbmRlciA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiByZW5kZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVuZGVyLmxlbmd0aCAhPT0gMCAmJiByZW5kZXIubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgYWNjZXB0IGV4YWN0bHkgdHdvIHBhcmFtZXRlcnM6IHByb3BzIGFuZCByZWYuICVzJywgcmVuZGVyLmxlbmd0aCA9PT0gMSA/ICdEaWQgeW91IGZvcmdldCB0byB1c2UgdGhlIHJlZiBwYXJhbWV0ZXI/JyA6ICdBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlbmRlciAhPSBudWxsKSB7XG4gICAgICBpZiAocmVuZGVyLmRlZmF1bHRQcm9wcyAhPSBudWxsIHx8IHJlbmRlci5wcm9wVHlwZXMgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGRvIG5vdCBzdXBwb3J0IHByb3BUeXBlcyBvciBkZWZhdWx0UHJvcHMuICcgKyAnRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyBhIFJlYWN0IGNvbXBvbmVudD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUsXG4gICAgcmVuZGVyOiByZW5kZXJcbiAgfTtcblxuICB7XG4gICAgdmFyIG93bk5hbWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnRUeXBlLCAnZGlzcGxheU5hbWUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb3duTmFtZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIG93bk5hbWUgPSBuYW1lOyAvLyBUaGUgaW5uZXIgY29tcG9uZW50IHNob3VsZG4ndCBpbmhlcml0IHRoaXMgZGlzcGxheSBuYW1lIGluIG1vc3QgY2FzZXMsXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIGNvbXBvbmVudCBtYXkgYmUgdXNlZCBlbHNld2hlcmUuXG4gICAgICAgIC8vIEJ1dCBpdCdzIG5pY2UgZm9yIGFub255bW91cyBmdW5jdGlvbnMgdG8gaW5oZXJpdCB0aGUgbmFtZSxcbiAgICAgICAgLy8gc28gdGhhdCBvdXIgY29tcG9uZW50LXN0YWNrIGdlbmVyYXRpb24gbG9naWMgd2lsbCBkaXNwbGF5IHRoZWlyIGZyYW1lcy5cbiAgICAgICAgLy8gQW4gYW5vbnltb3VzIGZ1bmN0aW9uIGdlbmVyYWxseSBzdWdnZXN0cyBhIHBhdHRlcm4gbGlrZTpcbiAgICAgICAgLy8gICBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7Li4ufSk7XG4gICAgICAgIC8vIFRoaXMga2luZCBvZiBpbm5lciBmdW5jdGlvbiBpcyBub3QgdXNlZCBlbHNld2hlcmUgc28gdGhlIHNpZGUgZWZmZWN0IGlzIG9rYXkuXG5cbiAgICAgICAgaWYgKCFyZW5kZXIubmFtZSAmJiAhcmVuZGVyLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgcmVuZGVyLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRUeXBlO1xufVxuXG52YXIgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRTtcblxue1xuICBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFID0gU3ltYm9sLmZvcigncmVhY3QubW9kdWxlLnJlZmVyZW5jZScpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgZW5hYmxlRGVidWdUcmFjaW5nICB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiAgfHwgdHlwZSA9PT0gUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgIHx8IGVuYWJsZUNhY2hlRWxlbWVudCAgfHwgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIFRoaXMgbmVlZHMgdG8gaW5jbHVkZSBhbGwgcG9zc2libGUgbW9kdWxlIHJlZmVyZW5jZSBvYmplY3RcbiAgICAvLyB0eXBlcyBzdXBwb3J0ZWQgYnkgYW55IEZsaWdodCBjb25maWd1cmF0aW9uIGFueXdoZXJlIHNpbmNlXG4gICAgLy8gd2UgZG9uJ3Qga25vdyB3aGljaCBGbGlnaHQgYnVpbGQgdGhpcyB3aWxsIGVuZCB1cCBiZWluZyB1c2VkXG4gICAgLy8gd2l0aC5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFIHx8IHR5cGUuZ2V0TW9kdWxlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBtZW1vKHR5cGUsIGNvbXBhcmUpIHtcbiAge1xuICAgIGlmICghaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpKSB7XG4gICAgICBlcnJvcignbWVtbzogVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBjb21wb25lbnQuIEluc3RlYWQgJyArICdyZWNlaXZlZDogJXMnLCB0eXBlID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfTUVNT19UWVBFLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgY29tcGFyZTogY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbXBhcmVcbiAgfTtcblxuICB7XG4gICAgdmFyIG93bk5hbWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnRUeXBlLCAnZGlzcGxheU5hbWUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb3duTmFtZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIG93bk5hbWUgPSBuYW1lOyAvLyBUaGUgaW5uZXIgY29tcG9uZW50IHNob3VsZG4ndCBpbmhlcml0IHRoaXMgZGlzcGxheSBuYW1lIGluIG1vc3QgY2FzZXMsXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIGNvbXBvbmVudCBtYXkgYmUgdXNlZCBlbHNld2hlcmUuXG4gICAgICAgIC8vIEJ1dCBpdCdzIG5pY2UgZm9yIGFub255bW91cyBmdW5jdGlvbnMgdG8gaW5oZXJpdCB0aGUgbmFtZSxcbiAgICAgICAgLy8gc28gdGhhdCBvdXIgY29tcG9uZW50LXN0YWNrIGdlbmVyYXRpb24gbG9naWMgd2lsbCBkaXNwbGF5IHRoZWlyIGZyYW1lcy5cbiAgICAgICAgLy8gQW4gYW5vbnltb3VzIGZ1bmN0aW9uIGdlbmVyYWxseSBzdWdnZXN0cyBhIHBhdHRlcm4gbGlrZTpcbiAgICAgICAgLy8gICBSZWFjdC5tZW1vKChwcm9wcykgPT4gey4uLn0pO1xuICAgICAgICAvLyBUaGlzIGtpbmQgb2YgaW5uZXIgZnVuY3Rpb24gaXMgbm90IHVzZWQgZWxzZXdoZXJlIHNvIHRoZSBzaWRlIGVmZmVjdCBpcyBva2F5LlxuXG4gICAgICAgIGlmICghdHlwZS5uYW1lICYmICF0eXBlLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgdHlwZS5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURpc3BhdGNoZXIoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50O1xuXG4gIHtcbiAgICBpZiAoZGlzcGF0Y2hlciA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3InICsgJyBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuJyArICcyLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuJyArICczLiBZb3UgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QgaW4gdGhlIHNhbWUgYXBwXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS4nKTtcbiAgICB9XG4gIH0gLy8gV2lsbCByZXN1bHQgaW4gYSBudWxsIGFjY2VzcyBlcnJvciBpZiBhY2Nlc3NlZCBvdXRzaWRlIHJlbmRlciBwaGFzZS4gV2VcbiAgLy8gaW50ZW50aW9uYWxseSBkb24ndCB0aHJvdyBvdXIgb3duIGVycm9yIGJlY2F1c2UgdGhpcyBpcyBpbiBhIGhvdCBwYXRoLlxuICAvLyBBbHNvIGhlbHBzIGVuc3VyZSB0aGlzIGlzIGlubGluZWQuXG5cblxuICByZXR1cm4gZGlzcGF0Y2hlcjtcbn1cbmZ1bmN0aW9uIHVzZUNvbnRleHQoQ29udGV4dCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG5cbiAge1xuICAgIC8vIFRPRE86IGFkZCBhIG1vcmUgZ2VuZXJpYyB3YXJuaW5nIGZvciBpbnZhbGlkIHZhbHVlcy5cbiAgICBpZiAoQ29udGV4dC5fY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcmVhbENvbnRleHQgPSBDb250ZXh0Ll9jb250ZXh0OyAvLyBEb24ndCBkZWR1cGxpY2F0ZSBiZWNhdXNlIHRoaXMgbGVnaXRpbWF0ZWx5IGNhdXNlcyBidWdzXG4gICAgICAvLyBhbmQgbm9ib2R5IHNob3VsZCBiZSB1c2luZyB0aGlzIGluIGV4aXN0aW5nIGNvZGUuXG5cbiAgICAgIGlmIChyZWFsQ29udGV4dC5Db25zdW1lciA9PT0gQ29udGV4dCkge1xuICAgICAgICBlcnJvcignQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuQ29uc3VtZXIpIGlzIG5vdCBzdXBwb3J0ZWQsIG1heSBjYXVzZSBidWdzLCBhbmQgd2lsbCBiZSAnICsgJ3JlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfSBlbHNlIGlmIChyZWFsQ29udGV4dC5Qcm92aWRlciA9PT0gQ29udGV4dCkge1xuICAgICAgICBlcnJvcignQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuUHJvdmlkZXIpIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNvbnRleHQoQ29udGV4dCk7XG59XG5mdW5jdGlvbiB1c2VTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VTdGF0ZShpbml0aWFsU3RhdGUpO1xufVxuZnVuY3Rpb24gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbn1cbmZ1bmN0aW9uIHVzZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWYoaW5pdGlhbFZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTWVtbyhjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VNZW1vKGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICB7XG4gICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgfVxufVxuZnVuY3Rpb24gdXNlVHJhbnNpdGlvbigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VUcmFuc2l0aW9uKCk7XG59XG5mdW5jdGlvbiB1c2VEZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB1c2VJZCgpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJZCgpO1xufVxuZnVuY3Rpb24gdXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG59XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgIHByZWZpeCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgICAgfVxuICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuXG5cblxuICAgIHJldHVybiAnXFxuJyArIHByZWZpeCArIG5hbWU7XG4gIH1cbn1cbnZhciByZWVudHJ5ID0gZmFsc2U7XG52YXIgY29tcG9uZW50RnJhbWVDYWNoZTtcblxue1xuICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuICBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuXG4gIGlmICggIWZuIHx8IHJlZW50cnkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB7XG4gICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udHJvbDtcbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLlxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldmlvdXNEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsgLy8gU2V0IHRoZSBkaXNwYXRjaGVyIGluIERFViBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgY2FsbCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uXG4gICAgLy8gZm9yIHdhcm5pbmdzLlxuXG4gICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTsgLy8gSWYgb3VyIGNvbXBvbmVudCBmcmFtZSBpcyBsYWJlbGVkIFwiPGFub255bW91cz5cIlxuICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCBcImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW4gdG8gbWFrZSB0aGUgc3RhY2sgbW9yZSByZWFkYWJsZS5cblxuXG4gICAgICAgICAgICAgICAgaWYgKGZuLmRpc3BsYXlOYW1lICYmIF9mcmFtZS5pbmNsdWRlcygnPGFub255bW91cz4nKSkge1xuICAgICAgICAgICAgICAgICAgX2ZyYW1lID0gX2ZyYW1lLnJlcGxhY2UoJzxhbm9ueW1vdXM+JywgZm4uZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHtcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUsIHNob3VsZENvbnN0cnVjdCh0eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAvLyBNZW1vIG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd247XG5cbntcbiAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSk7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oc291cmNlKSB7XG4gIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBmaWxlTmFtZSA9IHNvdXJjZS5maWxlTmFtZS5yZXBsYWNlKC9eLipbXFxcXFxcL10vLCAnJyk7XG4gICAgdmFyIGxpbmVOdW1iZXIgPSBzb3VyY2UubGluZU51bWJlcjtcbiAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKGVsZW1lbnRQcm9wcykge1xuICBpZiAoZWxlbWVudFByb3BzICE9PSBudWxsICYmIGVsZW1lbnRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKGVsZW1lbnRQcm9wcy5fX3NvdXJjZSk7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICogdXBkYXRlcy5cbiAqL1xuXG5cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgaWYgKCFpbmZvKSB7XG4gICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG5cbiAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHRvcC1sZXZlbCByZW5kZXIgY2FsbCB1c2luZyA8XCIgKyBwYXJlbnROYW1lICsgXCI+LlwiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmZvO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuXG4gKiBUaGlzIGVsZW1lbnQgaXMgaW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmVcbiAqIHJlb3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFyZSByZXF1aXJlZCB0b1xuICogaGF2ZSBhIFwia2V5XCIgcHJvcGVydHkgYXNzaWduZWQgdG8gaXQuIEVycm9yIHN0YXR1c2VzIGFyZSBjYWNoZWQgc28gYSB3YXJuaW5nXG4gKiB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGhhdCByZXF1aXJlcyBhIGtleS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gIGlmIChvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlOyAvLyBVc3VhbGx5IHRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBvZmZlbmRlciwgYnV0IGlmIGl0IGFjY2VwdHMgY2hpbGRyZW4gYXMgYVxuICAvLyBwcm9wZXJ0eSwgaXQgbWF5IGJlIHRoZSBjcmVhdG9yIG9mIHRoZSBjaGlsZCB0aGF0J3MgcmVzcG9uc2libGUgZm9yXG4gIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICB2YXIgY2hpbGRPd25lciA9ICcnO1xuXG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGVsZW1lbnQuX293bmVyLnR5cGUpICsgXCIuXCI7XG4gIH1cblxuICB7XG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgfVxufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaXNBcnJheShub2RlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcblxuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAvLyBUaGlzIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiBhIHZhbGlkIGxvY2F0aW9uLlxuICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gRW50cnkgaXRlcmF0b3JzIHVzZWQgdG8gcHJvdmlkZSBpbXBsaWNpdCBrZXlzLFxuICAgICAgLy8gYnV0IG5vdyB3ZSBwcmludCBhIHNlcGFyYXRlIHdhcm5pbmcgZm9yIHRoZW0gbGF0ZXIuXG4gICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gbm9kZS5lbnRyaWVzKSB7XG4gICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChub2RlKTtcbiAgICAgICAgdmFyIHN0ZXA7XG5cbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMgcHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbixcbiAqIHByb3ZpZGVkIGJ5IHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJvcFR5cGVzO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBOb3RlOiBNZW1vIG9ubHkgY2hlY2tzIG91dGVyIHByb3BzIGhlcmUuXG4gICAgLy8gSW5uZXIgcHJvcHMgYXJlIGNoZWNrZWQgaW4gdGhlIHJlY29uY2lsZXIuXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSkge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICAgIGVycm9yKCdDb21wb25lbnQgJXMgZGVjbGFyZWQgYFByb3BUeXBlc2AgaW5zdGVhZCBvZiBgcHJvcFR5cGVzYC4gRGlkIHlvdSBtaXNzcGVsbCB0aGUgcHJvcGVydHkgYXNzaWdubWVudD8nLCBfbmFtZSB8fCAnVW5rbm93bicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHlwZS5nZXREZWZhdWx0UHJvcHMgPT09ICdmdW5jdGlvbicgJiYgIXR5cGUuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIGlzIG9ubHkgdXNlZCBvbiBjbGFzc2ljIFJlYWN0LmNyZWF0ZUNsYXNzICcgKyAnZGVmaW5pdGlvbnMuIFVzZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBgZGVmYXVsdFByb3BzYCBpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhIGZyYWdtZW50LCB2YWxpZGF0ZSB0aGF0IGl0IGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdpdGggZnJhZ21lbnQgcHJvcHNcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBmcmFnbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVGcmFnbWVudFByb3BzKGZyYWdtZW50KSB7XG4gIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyYWdtZW50LnByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmIChrZXkgIT09ICdjaGlsZHJlbicgJiYga2V5ICE9PSAna2V5Jykge1xuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgICBlcnJvcignSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gJyArICdSZWFjdC5GcmFnbWVudCBjYW4gb25seSBoYXZlIGBrZXlgIGFuZCBgY2hpbGRyZW5gIHByb3BzLicsIGtleSk7XG5cbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYWdtZW50LnJlZiAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBgcmVmYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLicpO1xuXG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uKHR5cGUsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgdmFsaWRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpOyAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAvLyBzdWNjZWVkIGFuZCB0aGVyZSB3aWxsIGxpa2VseSBiZSBlcnJvcnMgaW4gcmVuZGVyLlxuXG4gIGlmICghdmFsaWRUeXBlKSB7XG4gICAgdmFyIGluZm8gPSAnJztcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VJbmZvID0gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhwcm9wcyk7XG5cbiAgICBpZiAoc291cmNlSW5mbykge1xuICAgICAgaW5mbyArPSBzb3VyY2VJbmZvO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuICAgIH1cblxuICAgIHZhciB0eXBlU3RyaW5nO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnbnVsbCc7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHR5cGUpKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ2FycmF5JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSBcIjxcIiArIChnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnVW5rbm93bicpICsgXCIgLz5cIjtcbiAgICAgIGluZm8gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IGV4cG9ydCBhIEpTWCBsaXRlcmFsIGluc3RlYWQgb2YgYSBjb21wb25lbnQ/JztcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZVN0cmluZyA9IHR5cGVvZiB0eXBlO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGVycm9yKCdSZWFjdC5jcmVhdGVFbGVtZW50OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciAnICsgJ2J1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgJyArICdjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGVTdHJpbmcsIGluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50ID0gY3JlYXRlRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBUaGUgcmVzdWx0IGNhbiBiZSBudWxsaXNoIGlmIGEgbW9jayBvciBhIGN1c3RvbSBmdW5jdGlvbiBpcyB1c2VkLlxuICAvLyBUT0RPOiBEcm9wIHRoaXMgd2hlbiB0aGVzZSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQuXG5cbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9IC8vIFNraXAga2V5IHdhcm5pbmcgaWYgdGhlIHR5cGUgaXNuJ3QgdmFsaWQgc2luY2Ugb3VyIGtleSB2YWxpZGF0aW9uIGxvZ2ljXG4gIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy5cbiAgLy8gV2UgZG9uJ3Qgd2FudCBleGNlcHRpb24gYmVoYXZpb3IgdG8gZGlmZmVyIGJldHdlZW4gZGV2IGFuZCBwcm9kLlxuICAvLyAoUmVuZGVyaW5nIHdpbGwgdGhyb3cgd2l0aCBhIGhlbHBmdWwgbWVzc2FnZSBhbmQgYXMgc29vbiBhcyB0aGUgdHlwZSBpc1xuICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pXG5cblxuICBpZiAodmFsaWRUeXBlKSB7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZWxlbWVudCk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbnZhciBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IGZhbHNlO1xuZnVuY3Rpb24gY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uKHR5cGUpIHtcbiAgdmFyIHZhbGlkYXRlZEZhY3RvcnkgPSBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24uYmluZChudWxsLCB0eXBlKTtcbiAgdmFsaWRhdGVkRmFjdG9yeS50eXBlID0gdHlwZTtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSkge1xuICAgICAgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSB0cnVlO1xuXG4gICAgICB3YXJuKCdSZWFjdC5jcmVhdGVGYWN0b3J5KCkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gQ29uc2lkZXIgdXNpbmcgSlNYICcgKyAnb3IgdXNlIFJlYWN0LmNyZWF0ZUVsZW1lbnQoKSBkaXJlY3RseSBpbnN0ZWFkLicpO1xuICAgIH0gLy8gTGVnYWN5IGhvb2s6IHJlbW92ZSBpdFxuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsaWRhdGVkRmFjdG9yeSwgJ3R5cGUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB3YXJuKCdGYWN0b3J5LnR5cGUgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHRoZSBjbGFzcyBkaXJlY3RseSAnICsgJ2JlZm9yZSBwYXNzaW5nIGl0IHRvIGNyZWF0ZUZhY3RvcnkuJyk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0eXBlJywge1xuICAgICAgICAgIHZhbHVlOiB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZWRGYWN0b3J5O1xufVxuZnVuY3Rpb24gY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24oZWxlbWVudCwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gIHZhciBuZXdFbGVtZW50ID0gY2xvbmVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIG5ld0VsZW1lbnQudHlwZSk7XG4gIH1cblxuICB2YWxpZGF0ZVByb3BUeXBlcyhuZXdFbGVtZW50KTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihzY29wZSwgb3B0aW9ucykge1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0ge307XG4gIHZhciBjdXJyZW50VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICB0cnkge1xuICAgIHNjb3BlKCk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuXG4gICAge1xuICAgICAgaWYgKHByZXZUcmFuc2l0aW9uID09PSBudWxsICYmIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzKSB7XG4gICAgICAgIHZhciB1cGRhdGVkRmliZXJzQ291bnQgPSBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5zaXplO1xuXG4gICAgICAgIGlmICh1cGRhdGVkRmliZXJzQ291bnQgPiAxMCkge1xuICAgICAgICAgIHdhcm4oJ0RldGVjdGVkIGEgbGFyZ2UgbnVtYmVyIG9mIHVwZGF0ZXMgaW5zaWRlIHN0YXJ0VHJhbnNpdGlvbi4gJyArICdJZiB0aGlzIGlzIGR1ZSB0byBhIHN1YnNjcmlwdGlvbiBwbGVhc2UgcmUtd3JpdGUgaXQgdG8gdXNlIFJlYWN0IHByb3ZpZGVkIGhvb2tzLiAnICsgJ090aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9IGZhbHNlO1xudmFyIGVucXVldWVUYXNrSW1wbCA9IG51bGw7XG5mdW5jdGlvbiBlbnF1ZXVlVGFzayh0YXNrKSB7XG4gIGlmIChlbnF1ZXVlVGFza0ltcGwgPT09IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgLy8gcmVhZCByZXF1aXJlIG9mZiB0aGUgbW9kdWxlIG9iamVjdCB0byBnZXQgYXJvdW5kIHRoZSBidW5kbGVycy5cbiAgICAgIC8vIHdlIGRvbid0IHdhbnQgdGhlbSB0byBkZXRlY3QgYSByZXF1aXJlIGFuZCBidW5kbGUgYSBOb2RlIHBvbHlmaWxsLlxuICAgICAgdmFyIHJlcXVpcmVTdHJpbmcgPSAoJ3JlcXVpcmUnICsgTWF0aC5yYW5kb20oKSkuc2xpY2UoMCwgNyk7XG4gICAgICB2YXIgbm9kZVJlcXVpcmUgPSBtb2R1bGUgJiYgbW9kdWxlW3JlcXVpcmVTdHJpbmddOyAvLyBhc3N1bWluZyB3ZSdyZSBpbiBub2RlLCBsZXQncyB0cnkgdG8gZ2V0IG5vZGUnc1xuICAgICAgLy8gdmVyc2lvbiBvZiBzZXRJbW1lZGlhdGUsIGJ5cGFzc2luZyBmYWtlIHRpbWVycyBpZiBhbnkuXG5cbiAgICAgIGVucXVldWVUYXNrSW1wbCA9IG5vZGVSZXF1aXJlLmNhbGwobW9kdWxlLCAndGltZXJzJykuc2V0SW1tZWRpYXRlO1xuICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIC8vIHdlJ3JlIGluIGEgYnJvd3NlclxuICAgICAgLy8gd2UgY2FuJ3QgdXNlIHJlZ3VsYXIgdGltZXJzIGJlY2F1c2UgdGhleSBtYXkgc3RpbGwgYmUgZmFrZWRcbiAgICAgIC8vIHNvIHdlIHRyeSBNZXNzYWdlQ2hhbm5lbCtwb3N0TWVzc2FnZSBpbnN0ZWFkXG4gICAgICBlbnF1ZXVlVGFza0ltcGwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmIChkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1RoaXMgYnJvd3NlciBkb2VzIG5vdCBoYXZlIGEgTWVzc2FnZUNoYW5uZWwgaW1wbGVtZW50YXRpb24sICcgKyAnc28gZW5xdWV1aW5nIHRhc2tzIHZpYSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aWxsIGZhaWwuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUgYXQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3VlcyAnICsgJ2lmIHlvdSBlbmNvdW50ZXIgdGhpcyB3YXJuaW5nLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gY2FsbGJhY2s7XG4gICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UodW5kZWZpbmVkKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVucXVldWVUYXNrSW1wbCh0YXNrKTtcbn1cblxudmFyIGFjdFNjb3BlRGVwdGggPSAwO1xudmFyIGRpZFdhcm5Ob0F3YWl0QWN0ID0gZmFsc2U7XG5mdW5jdGlvbiBhY3QoY2FsbGJhY2spIHtcbiAge1xuICAgIC8vIGBhY3RgIGNhbGxzIGNhbiBiZSBuZXN0ZWQsIHNvIHdlIHRyYWNrIHRoZSBkZXB0aC4gVGhpcyByZXByZXNlbnRzIHRoZVxuICAgIC8vIG51bWJlciBvZiBgYWN0YCBzY29wZXMgb24gdGhlIHN0YWNrLlxuICAgIHZhciBwcmV2QWN0U2NvcGVEZXB0aCA9IGFjdFNjb3BlRGVwdGg7XG4gICAgYWN0U2NvcGVEZXB0aCsrO1xuXG4gICAgaWYgKFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIG91dGVybW9zdCBgYWN0YCBzY29wZS4gSW5pdGlhbGl6ZSB0aGUgcXVldWUuIFRoZSByZWNvbmNpbGVyXG4gICAgICAvLyB3aWxsIGRldGVjdCB0aGUgcXVldWUgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIFNjaGVkdWxlci5cbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgcHJldklzQmF0Y2hpbmdMZWdhY3kgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5O1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVXNlZCB0byByZXByb2R1Y2UgYmVoYXZpb3Igb2YgYGJhdGNoZWRVcGRhdGVzYCBpbiBsZWdhY3kgbW9kZS4gT25seVxuICAgICAgLy8gc2V0IHRvIGB0cnVlYCB3aGlsZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIG5vdCBmb3IgdXBkYXRlc1xuICAgICAgLy8gdHJpZ2dlcmVkIGR1cmluZyBhbiBhc3luYyBldmVudCwgYmVjYXVzZSB0aGlzIGlzIGhvdyB0aGUgbGVnYWN5XG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBgYWN0YCBiZWhhdmVkLlxuICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeSA9IHRydWU7XG4gICAgICByZXN1bHQgPSBjYWxsYmFjaygpOyAvLyBSZXBsaWNhdGUgYmVoYXZpb3Igb2Ygb3JpZ2luYWwgYGFjdGAgaW1wbGVtZW50YXRpb24gaW4gbGVnYWN5IG1vZGUsXG4gICAgICAvLyB3aGljaCBmbHVzaGVkIHVwZGF0ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNjb3BlIGZ1bmN0aW9uIGV4aXRzLCBldmVuXG4gICAgICAvLyBpZiBpdCdzIGFuIGFzeW5jIGZ1bmN0aW9uLlxuXG4gICAgICBpZiAoIXByZXZJc0JhdGNoaW5nTGVnYWN5ICYmIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlKSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeSA9IHByZXZJc0JhdGNoaW5nTGVnYWN5O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdGhlbmFibGVSZXN1bHQgPSByZXN1bHQ7IC8vIFRoZSBjYWxsYmFjayBpcyBhbiBhc3luYyBmdW5jdGlvbiAoaS5lLiByZXR1cm5lZCBhIHByb21pc2UpLiBXYWl0XG4gICAgICAvLyBmb3IgaXQgdG8gcmVzb2x2ZSBiZWZvcmUgZXhpdGluZyB0aGUgY3VycmVudCBzY29wZS5cblxuICAgICAgdmFyIHdhc0F3YWl0ZWQgPSBmYWxzZTtcbiAgICAgIHZhciB0aGVuYWJsZSA9IHtcbiAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHdhc0F3YWl0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoZW5hYmxlUmVzdWx0LnRoZW4oZnVuY3Rpb24gKHJldHVyblZhbHVlKSB7XG4gICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG5cbiAgICAgICAgICAgIGlmIChhY3RTY29wZURlcHRoID09PSAwKSB7XG4gICAgICAgICAgICAgIC8vIFdlJ3ZlIGV4aXRlZCB0aGUgb3V0ZXJtb3N0IGFjdCBzY29wZS4gUmVjdXJzaXZlbHkgZmx1c2ggdGhlXG4gICAgICAgICAgICAgIC8vIHF1ZXVlIHVudGlsIHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmsuXG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayB0aHJldyBhbiBlcnJvci5cbiAgICAgICAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuTm9Bd2FpdEFjdCAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHt9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghd2FzQXdhaXRlZCkge1xuICAgICAgICAgICAgICBkaWRXYXJuTm9Bd2FpdEFjdCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgZXJyb3IoJ1lvdSBjYWxsZWQgYWN0KGFzeW5jICgpID0+IC4uLikgd2l0aG91dCBhd2FpdC4gJyArICdUaGlzIGNvdWxkIGxlYWQgdG8gdW5leHBlY3RlZCB0ZXN0aW5nIGJlaGF2aW91ciwgJyArICdpbnRlcmxlYXZpbmcgbXVsdGlwbGUgYWN0IGNhbGxzIGFuZCBtaXhpbmcgdGhlaXIgJyArICdzY29wZXMuICcgKyAnWW91IHNob3VsZCAtIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pOycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGVuYWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJldHVyblZhbHVlID0gcmVzdWx0OyAvLyBUaGUgY2FsbGJhY2sgaXMgbm90IGFuIGFzeW5jIGZ1bmN0aW9uLiBFeGl0IHRoZSBjdXJyZW50IHNjb3BlXG4gICAgICAvLyBpbW1lZGlhdGVseSwgd2l0aG91dCBhd2FpdGluZy5cblxuICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuXG4gICAgICBpZiAoYWN0U2NvcGVEZXB0aCA9PT0gMCkge1xuICAgICAgICAvLyBFeGl0aW5nIHRoZSBvdXRlcm1vc3QgYWN0IHNjb3BlLiBGbHVzaCB0aGUgcXVldWUuXG4gICAgICAgIHZhciBfcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgICAgIGlmIChfcXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICBmbHVzaEFjdFF1ZXVlKF9xdWV1ZSk7XG4gICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IG51bGw7XG4gICAgICAgIH0gLy8gUmV0dXJuIGEgdGhlbmFibGUuIElmIHRoZSB1c2VyIGF3YWl0cyBpdCwgd2UnbGwgZmx1c2ggYWdhaW4gaW5cbiAgICAgICAgLy8gY2FzZSBhZGRpdGlvbmFsIHdvcmsgd2FzIHNjaGVkdWxlZCBieSBhIG1pY3JvdGFzay5cblxuXG4gICAgICAgIHZhciBfdGhlbmFibGUgPSB7XG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgLy8gQ29uZmlybSB3ZSBoYXZlbid0IHJlLWVudGVyZWQgYW5vdGhlciBgYWN0YCBzY29wZSwgaW4gY2FzZVxuICAgICAgICAgICAgLy8gdGhlIHVzZXIgZG9lcyBzb21ldGhpbmcgd2VpcmQgbGlrZSBhd2FpdCB0aGUgdGhlbmFibGVcbiAgICAgICAgICAgIC8vIG11bHRpcGxlIHRpbWVzLlxuICAgICAgICAgICAgaWYgKFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmx1c2ggdGhlIHF1ZXVlIHVudGlsIHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmsuXG4gICAgICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBbXTtcbiAgICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGVuYWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNpbmNlIHdlJ3JlIGluc2lkZSBhIG5lc3RlZCBgYWN0YCBzY29wZSwgdGhlIHJldHVybmVkIHRoZW5hYmxlXG4gICAgICAgIC8vIGltbWVkaWF0ZWx5IHJlc29sdmVzLiBUaGUgb3V0ZXIgc2NvcGUgd2lsbCBmbHVzaCB0aGUgcXVldWUuXG4gICAgICAgIHZhciBfdGhlbmFibGUyID0ge1xuICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGVuYWJsZTI7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKSB7XG4gIHtcbiAgICBpZiAocHJldkFjdFNjb3BlRGVwdGggIT09IGFjdFNjb3BlRGVwdGggLSAxKSB7XG4gICAgICBlcnJvcignWW91IHNlZW0gdG8gaGF2ZSBvdmVybGFwcGluZyBhY3QoKSBjYWxscywgdGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0JlIHN1cmUgdG8gYXdhaXQgcHJldmlvdXMgYWN0KCkgY2FsbHMgYmVmb3JlIG1ha2luZyBhIG5ldyBvbmUuICcpO1xuICAgIH1cblxuICAgIGFjdFNjb3BlRGVwdGggPSBwcmV2QWN0U2NvcGVEZXB0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpIHtcbiAge1xuICAgIHZhciBxdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7XG5cbiAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpO1xuICAgICAgICBlbnF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gTm8gYWRkaXRpb25hbCB3b3JrIHdhcyBzY2hlZHVsZWQuIEZpbmlzaC5cbiAgICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEtlZXAgZmx1c2hpbmcgd29yayB1bnRpbCB0aGVyZSdzIG5vbmUgbGVmdC5cbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgaXNGbHVzaGluZyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmbHVzaEFjdFF1ZXVlKHF1ZXVlKSB7XG4gIHtcbiAgICBpZiAoIWlzRmx1c2hpbmcpIHtcbiAgICAgIC8vIFByZXZlbnQgcmUtZW50cmFuY2UuXG4gICAgICBpc0ZsdXNoaW5nID0gdHJ1ZTtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjYWxsYmFjayA9IHF1ZXVlW2ldO1xuXG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayh0cnVlKTtcbiAgICAgICAgICB9IHdoaWxlIChjYWxsYmFjayAhPT0gbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgc29tZXRoaW5nIHRocm93cywgbGVhdmUgdGhlIHJlbWFpbmluZyBjYWxsYmFja3Mgb24gdGhlIHF1ZXVlLlxuICAgICAgICBxdWV1ZSA9IHF1ZXVlLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBjcmVhdGVFbGVtZW50JDEgPSAgY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjbG9uZUVsZW1lbnQkMSA9ICBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY3JlYXRlRmFjdG9yeSA9ICBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24gO1xudmFyIENoaWxkcmVuID0ge1xuICBtYXA6IG1hcENoaWxkcmVuLFxuICBmb3JFYWNoOiBmb3JFYWNoQ2hpbGRyZW4sXG4gIGNvdW50OiBjb3VudENoaWxkcmVuLFxuICB0b0FycmF5OiB0b0FycmF5LFxuICBvbmx5OiBvbmx5Q2hpbGRcbn07XG5cbmV4cG9ydHMuQ2hpbGRyZW4gPSBDaGlsZHJlbjtcbmV4cG9ydHMuQ29tcG9uZW50ID0gQ29tcG9uZW50O1xuZXhwb3J0cy5GcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG5leHBvcnRzLlByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbmV4cG9ydHMuUHVyZUNvbXBvbmVudCA9IFB1cmVDb21wb25lbnQ7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gUmVhY3RTaGFyZWRJbnRlcm5hbHM7XG5leHBvcnRzLmFjdCA9IGFjdDtcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gY2xvbmVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0O1xuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gY3JlYXRlRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeTtcbmV4cG9ydHMuY3JlYXRlUmVmID0gY3JlYXRlUmVmO1xuZXhwb3J0cy5mb3J3YXJkUmVmID0gZm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnQgPSBpc1ZhbGlkRWxlbWVudDtcbmV4cG9ydHMubGF6eSA9IGxhenk7XG5leHBvcnRzLm1lbW8gPSBtZW1vO1xuZXhwb3J0cy5zdGFydFRyYW5zaXRpb24gPSBzdGFydFRyYW5zaXRpb247XG5leHBvcnRzLnVuc3RhYmxlX2FjdCA9IGFjdDtcbmV4cG9ydHMudXNlQ2FsbGJhY2sgPSB1c2VDYWxsYmFjaztcbmV4cG9ydHMudXNlQ29udGV4dCA9IHVzZUNvbnRleHQ7XG5leHBvcnRzLnVzZURlYnVnVmFsdWUgPSB1c2VEZWJ1Z1ZhbHVlO1xuZXhwb3J0cy51c2VEZWZlcnJlZFZhbHVlID0gdXNlRGVmZXJyZWRWYWx1ZTtcbmV4cG9ydHMudXNlRWZmZWN0ID0gdXNlRWZmZWN0O1xuZXhwb3J0cy51c2VJZCA9IHVzZUlkO1xuZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gdXNlSW1wZXJhdGl2ZUhhbmRsZTtcbmV4cG9ydHMudXNlSW5zZXJ0aW9uRWZmZWN0ID0gdXNlSW5zZXJ0aW9uRWZmZWN0O1xuZXhwb3J0cy51c2VMYXlvdXRFZmZlY3QgPSB1c2VMYXlvdXRFZmZlY3Q7XG5leHBvcnRzLnVzZU1lbW8gPSB1c2VNZW1vO1xuZXhwb3J0cy51c2VSZWR1Y2VyID0gdXNlUmVkdWNlcjtcbmV4cG9ydHMudXNlUmVmID0gdXNlUmVmO1xuZXhwb3J0cy51c2VTdGF0ZSA9IHVzZVN0YXRlO1xuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlO1xuZXhwb3J0cy51c2VUcmFuc2l0aW9uID0gdXNlVHJhbnNpdGlvbjtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsImltcG9ydCAnZm9jdXMtb3V0bGluZS1tYW5hZ2VyJztcbmltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VSZWYsIENvbXBvbmVudCwgY3JlYXRlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNuIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHNjcm9sbFNtb290aCBmcm9tICdzY3JvbGwtc21vb3RoJztcbmltcG9ydCBTY3JvbGxwYXJlbnQgZnJvbSAnc2Nyb2xscGFyZW50JztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2guZGVib3VuY2UnO1xuaW1wb3J0IEZvY3VzTG9jayBmcm9tICdyZWFjdC1mb2N1cy1sb2NrJztcbmltcG9ydCBzdHlsZWQsIHsgY3JlYXRlR2xvYmFsU3R5bGUgfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSAncmVhY3QtZG9tJztcblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkociwgYSkge1xuICAobnVsbCA9PSBhIHx8IGEgPiByLmxlbmd0aCkgJiYgKGEgPSByLmxlbmd0aCk7XG4gIGZvciAodmFyIGUgPSAwLCBuID0gQXJyYXkoYSk7IGUgPCBhOyBlKyspIG5bZV0gPSByW2VdO1xuICByZXR1cm4gbjtcbn1cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gcjtcbn1cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoZSkge1xuICBpZiAodm9pZCAwID09PSBlKSB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIHJldHVybiBlO1xufVxuZnVuY3Rpb24gX2NhbGxTdXBlcih0LCBvLCBlKSB7XG4gIHJldHVybiBvID0gX2dldFByb3RvdHlwZU9mKG8pLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LCBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgPyBSZWZsZWN0LmNvbnN0cnVjdChvLCBlIHx8IFtdLCBfZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IpIDogby5hcHBseSh0LCBlKSk7XG59XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soYSwgbikge1xuICBpZiAoIShhIGluc3RhbmNlb2YgbikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyhlLCByKSB7XG4gIGZvciAodmFyIHQgPSAwOyB0IDwgci5sZW5ndGg7IHQrKykge1xuICAgIHZhciBvID0gclt0XTtcbiAgICBvLmVudW1lcmFibGUgPSBvLmVudW1lcmFibGUgfHwgITEsIG8uY29uZmlndXJhYmxlID0gITAsIFwidmFsdWVcIiBpbiBvICYmIChvLndyaXRhYmxlID0gITApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgX3RvUHJvcGVydHlLZXkoby5rZXkpLCBvKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKGUsIHIsIHQpIHtcbiAgcmV0dXJuIHIgJiYgX2RlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIHIpLCB0ICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHQpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZTtcbn1cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHIsIGUpIHtcbiAgdmFyIHQgPSBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgcltTeW1ib2wuaXRlcmF0b3JdIHx8IHJbXCJAQGl0ZXJhdG9yXCJdO1xuICBpZiAoIXQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyKSB8fCAodCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyKSkgfHwgZSAmJiByICYmIFwibnVtYmVyXCIgPT0gdHlwZW9mIHIubGVuZ3RoKSB7XG4gICAgICB0ICYmIChyID0gdCk7XG4gICAgICB2YXIgbiA9IDAsXG4gICAgICAgIEYgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHM6IEYsXG4gICAgICAgIG46IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gbiA+PSByLmxlbmd0aCA/IHtcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgIGRvbmU6ICExLFxuICAgICAgICAgICAgdmFsdWU6IHJbbisrXVxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGU6IGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgdGhyb3cgcjtcbiAgICAgICAgfSxcbiAgICAgICAgZjogRlxuICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xuICB9XG4gIHZhciBvLFxuICAgIGEgPSAhMCxcbiAgICB1ID0gITE7XG4gIHJldHVybiB7XG4gICAgczogZnVuY3Rpb24gKCkge1xuICAgICAgdCA9IHQuY2FsbChyKTtcbiAgICB9LFxuICAgIG46IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByID0gdC5uZXh0KCk7XG4gICAgICByZXR1cm4gYSA9IHIuZG9uZSwgcjtcbiAgICB9LFxuICAgIGU6IGZ1bmN0aW9uIChyKSB7XG4gICAgICB1ID0gITAsIG8gPSByO1xuICAgIH0sXG4gICAgZjogZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYSB8fCBudWxsID09IHQucmV0dXJuIHx8IHQucmV0dXJuKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAodSkgdGhyb3cgbztcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkge1xuICByZXR1cm4gKHIgPSBfdG9Qcm9wZXJ0eUtleShyKSkgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCB7XG4gICAgdmFsdWU6IHQsXG4gICAgZW51bWVyYWJsZTogITAsXG4gICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICB3cml0YWJsZTogITBcbiAgfSkgOiBlW3JdID0gdCwgZTtcbn1cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZih0KSB7XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO1xuICB9LCBfZ2V0UHJvdG90eXBlT2YodCk7XG59XG5mdW5jdGlvbiBfaW5oZXJpdHModCwgZSkge1xuICBpZiAoXCJmdW5jdGlvblwiICE9IHR5cGVvZiBlICYmIG51bGwgIT09IGUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHQsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgfVxuICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwicHJvdG90eXBlXCIsIHtcbiAgICB3cml0YWJsZTogITFcbiAgfSksIGUgJiYgX3NldFByb3RvdHlwZU9mKHQsIGUpO1xufVxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgdCA9ICFCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gIH0gY2F0Y2ggKHQpIHt9XG4gIHJldHVybiAoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gISF0O1xuICB9KSgpO1xufVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHtcbiAgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgU3ltYm9sICYmIHJbU3ltYm9sLml0ZXJhdG9yXSB8fCByW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gdCkge1xuICAgIHZhciBlLFxuICAgICAgbixcbiAgICAgIGksXG4gICAgICB1LFxuICAgICAgYSA9IFtdLFxuICAgICAgZiA9ICEwLFxuICAgICAgbyA9ICExO1xuICAgIHRyeSB7XG4gICAgICBpZiAoaSA9ICh0ID0gdC5jYWxsKHIpKS5uZXh0LCAwID09PSBsKSB7XG4gICAgICAgIGlmIChPYmplY3QodCkgIT09IHQpIHJldHVybjtcbiAgICAgICAgZiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKGYgPSAoZSA9IGkuY2FsbCh0KSkuZG9uZSkgJiYgKGEucHVzaChlLnZhbHVlKSwgYS5sZW5ndGggIT09IGwpOyBmID0gITApO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIG8gPSAhMCwgbiA9IHI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghZiAmJiBudWxsICE9IHQucmV0dXJuICYmICh1ID0gdC5yZXR1cm4oKSwgT2JqZWN0KHUpICE9PSB1KSkgcmV0dXJuO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKG8pIHRocm93IG47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9XG59XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7XG4gIHZhciB0ID0gT2JqZWN0LmtleXMoZSk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTtcbiAgICB9KSksIHQucHVzaC5hcHBseSh0LCBvKTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKGUpIHtcbiAgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307XG4gICAgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0W3JdKTtcbiAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIHIpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHQsIGUpIHtcbiAgaWYgKGUgJiYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIGUgfHwgXCJmdW5jdGlvblwiID09IHR5cGVvZiBlKSkgcmV0dXJuIGU7XG4gIGlmICh2b2lkIDAgIT09IGUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZFwiKTtcbiAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQodCk7XG59XG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCwgZSkge1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fID0gZSwgdDtcbiAgfSwgX3NldFByb3RvdHlwZU9mKHQsIGUpO1xufVxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkociwgZSkge1xuICByZXR1cm4gX2FycmF5V2l0aEhvbGVzKHIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBlKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkociwgZSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpO1xufVxuZnVuY3Rpb24gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChlLCB0KSB7XG4gIHJldHVybiB0IHx8ICh0ID0gZS5zbGljZSgwKSksIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwge1xuICAgIHJhdzoge1xuICAgICAgdmFsdWU6IE9iamVjdC5mcmVlemUodClcbiAgICB9XG4gIH0pKTtcbn1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8ICF0KSByZXR1cm4gdDtcbiAgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgaSkgcmV0dXJuIGk7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7XG59XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gXCJzeW1ib2xcIiA9PSB0eXBlb2YgaSA/IGkgOiBpICsgXCJcIjtcbn1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7XG4gIGlmIChyKSB7XG4gICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKTtcbiAgICB2YXIgdCA9IHt9LnRvU3RyaW5nLmNhbGwocikuc2xpY2UoOCwgLTEpO1xuICAgIHJldHVybiBcIk9iamVjdFwiID09PSB0ICYmIHIuY29uc3RydWN0b3IgJiYgKHQgPSByLmNvbnN0cnVjdG9yLm5hbWUpLCBcIk1hcFwiID09PSB0IHx8IFwiU2V0XCIgPT09IHQgPyBBcnJheS5mcm9tKHIpIDogXCJBcmd1bWVudHNcIiA9PT0gdCB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSA/IF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIDogdm9pZCAwO1xuICB9XG59XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkOTtcbnZhciBHbG9iYWxTdHlsZSA9IGNyZWF0ZUdsb2JhbFN0eWxlKF90ZW1wbGF0ZU9iamVjdCQ5IHx8IChfdGVtcGxhdGVPYmplY3QkOSA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICAuZm9jdXMtb3V0bGluZS1oaWRkZW4gOmZvY3VzIHtcXG4gICAgICBvdXRsaW5lOiBub25lO1xcbiAgfVxcblwiXSkpKTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCQ4O1xudmFyIFN2Z0J1dHRvbiA9IHN0eWxlZC5idXR0b24oX3RlbXBsYXRlT2JqZWN0JDggfHwgKF90ZW1wbGF0ZU9iamVjdCQ4ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgcGFkZGluZzogMDtcXG4gIGJvcmRlcjogMDtcXG4gIGJhY2tncm91bmQ6IG5vbmU7XFxuICBmb250LXNpemU6IDA7XFxuICBjdXJzb3I6IFwiLCBcIjtcXG5cIl0pKSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5kaXNhYmxlZCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcic7XG59KTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCQ3LCBfdGVtcGxhdGVPYmplY3QyO1xudmFyIExhYmVsID0gc3R5bGVkLnNwYW4oX3RlbXBsYXRlT2JqZWN0JDcgfHwgKF90ZW1wbGF0ZU9iamVjdCQ3ID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXG4gIGxpbmUtaGVpZ2h0OiAxO1xcblwiXSkpKTtcbmZ1bmN0aW9uIEFycm93KF9yZWYpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2sgPSBfcmVmLm9uQ2xpY2ssXG4gICAgaW52ZXJ0ZWQgPSBfcmVmLmludmVydGVkLFxuICAgIGxhYmVsID0gX3JlZi5sYWJlbCxcbiAgICBkaXNhYmxlZCA9IF9yZWYuZGlzYWJsZWQ7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTdmdCdXR0b24sIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIFwiZGF0YS10b3VyLWVsZW1cIjogXCJcIi5jb25jYXQoaW52ZXJ0ZWQgPyAncmlnaHQnIDogJ2xlZnQnLCBcIi1hcnJvd1wiKSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWRcbiAgfSwgbGFiZWwgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMYWJlbCwgbnVsbCwgbGFiZWwpIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHZpZXdCb3g6IFwiMCAwIDE4LjQgMTQuNFwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogaW52ZXJ0ZWQgPyAnTTE3IDcuMkgxTTEwLjggMUwxNyA3LjJsLTYuMiA2LjInIDogJ00xLjQgNy4yaDE2TTcuNiAxTDEuNCA3LjJsNi4yIDYuMicsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgc3Ryb2tlOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjJcIixcbiAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgc3Ryb2tlTWl0ZXJsaW1pdDogXCIxMFwiXG4gIH0pKSk7XG59XG5BcnJvdy5wcm9wVHlwZXMgPSB7XG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpbnZlcnRlZDogUHJvcFR5cGVzLmJvb2wsXG4gIGxhYmVsOiBQcm9wVHlwZXMubm9kZSxcbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sXG59O1xudmFyIEFycm93JDEgPSBzdHlsZWQoQXJyb3cpKF90ZW1wbGF0ZU9iamVjdDIgfHwgKF90ZW1wbGF0ZU9iamVjdDIgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgY29sb3I6IFwiLCBcIjtcXG5cXG4gIFwiLCBcIjtcXG4gIFwiLCBcIjtcXG5cXG4gICY6aG92ZXIge1xcbiAgICBjb2xvcjogXCIsIFwiO1xcbiAgfVxcblwiXSkpLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmRpc2FibGVkID8gJyNjYWNjY2UnIDogJyM2NDY0NjQnO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5pbnZlcnRlZCA/ICdtYXJnaW4tbGVmdDogMjRweDsnIDogJ21hcmdpbi1yaWdodDogMjRweDsnO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiAhcHJvcHMubGFiZWwgJiYgXCJcXG4gICAgd2lkdGg6IDE2cHg7XFxuICAgIGhlaWdodDogMTJweDtcXG4gICAgZmxleDogMCAwIDE2cHg7XFxuICBcIjtcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuZGlzYWJsZWQgPyAnI2NhY2NjZScgOiAnIzAwMCc7XG59KTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCQ2O1xuZnVuY3Rpb24gQ2xvc2UoX3JlZikge1xuICB2YXIgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgb25DbGljayA9IF9yZWYub25DbGljayxcbiAgICBhcmlhTGFiZWwgPSBfcmVmLmFyaWFMYWJlbDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN2Z0J1dHRvbiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgXCJhcmlhLWxhYmVsXCI6IGFyaWFMYWJlbFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgdmlld0JveDogXCIwIDAgOS4xIDkuMVwiLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSxcbiAgICByb2xlOiBcInByZXNlbnRhdGlvblwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIixcbiAgICBkOiBcIk01LjkgNC41bDIuOC0yLjhjLjQtLjQuNC0xIDAtMS40LS40LS40LTEtLjQtMS40IDBMNC41IDMuMSAxLjcuM0MxLjMtLjEuNy0uMS4zLjNjLS40LjQtLjQgMSAwIDEuNGwyLjggMi44TC4zIDcuNGMtLjQuNC0uNCAxIDAgMS40LjIuMi40LjMuNy4zcy41LS4xLjctLjNMNC41IDZsMi44IDIuOGMuMy4yLjUuMy44LjNzLjUtLjEuNy0uM2MuNC0uNC40LTEgMC0xLjRMNS45IDQuNXpcIlxuICB9KSkpO1xufVxuQ2xvc2UucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgYXJpYUxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xudmFyIFN0eWxlZENsb3NlID0gc3R5bGVkKENsb3NlKShfdGVtcGxhdGVPYmplY3QkNiB8fCAoX3RlbXBsYXRlT2JqZWN0JDYgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAyMnB4O1xcbiAgcmlnaHQ6IDIycHg7XFxuICB3aWR0aDogOXB4O1xcbiAgaGVpZ2h0OiA5cHg7XFxuICBjb2xvcjogIzVlNWU1ZTtcXG4gICY6aG92ZXIge1xcbiAgICBjb2xvcjogIzAwMDtcXG4gIH1cXG5cIl0pKSk7XG5cbmZ1bmN0aW9uIGdldE5vZGVSZWN0KG5vZGUpIHtcbiAgdmFyIF9ub2RlJGdldEJvdW5kaW5nQ2xpZSA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgdG9wID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLnRvcCxcbiAgICByaWdodCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS5yaWdodCxcbiAgICBib3R0b20gPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUuYm90dG9tLFxuICAgIGxlZnQgPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUubGVmdCxcbiAgICB3aWR0aCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS53aWR0aCxcbiAgICBoZWlnaHQgPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUuaGVpZ2h0O1xuICByZXR1cm4ge1xuICAgIHRvcDogdG9wLFxuICAgIHJpZ2h0OiByaWdodCxcbiAgICBib3R0b206IGJvdHRvbSxcbiAgICBsZWZ0OiBsZWZ0LFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufVxuZnVuY3Rpb24gZ2V0SGlnaGxpZ2h0ZWRSZWN0KG5vZGUsIHN0ZXApIHtcbiAgaWYgKCFzdGVwLmhpZ2hsaWdodGVkU2VsZWN0b3JzKSB7XG4gICAgcmV0dXJuIGdldE5vZGVSZWN0KG5vZGUpO1xuICB9XG4gIHZhciBhdHRycyA9IGdldE5vZGVSZWN0KG5vZGUpO1xuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc3RlcC5oaWdobGlnaHRlZFNlbGVjdG9ycyksXG4gICAgX3N0ZXA7XG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IF9zdGVwLnZhbHVlO1xuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyB8fCBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHJlY3QgPSBnZXROb2RlUmVjdChlbGVtZW50KTtcbiAgICAgIGlmIChyZWN0LnRvcCA8IGF0dHJzLnRvcCkge1xuICAgICAgICBhdHRycy50b3AgPSByZWN0LnRvcDtcbiAgICAgIH1cbiAgICAgIGlmIChyZWN0LnJpZ2h0ID4gYXR0cnMucmlnaHQpIHtcbiAgICAgICAgYXR0cnMucmlnaHQgPSByZWN0LnJpZ2h0O1xuICAgICAgfVxuICAgICAgaWYgKHJlY3QuYm90dG9tID4gYXR0cnMuYm90dG9tKSB7XG4gICAgICAgIGF0dHJzLmJvdHRvbSA9IHJlY3QuYm90dG9tO1xuICAgICAgfVxuICAgICAgaWYgKHJlY3QubGVmdCA8IGF0dHJzLmxlZnQpIHtcbiAgICAgICAgYXR0cnMubGVmdCA9IHJlY3QubGVmdDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxuICBhdHRycy53aWR0aCA9IGF0dHJzLnJpZ2h0IC0gYXR0cnMubGVmdDtcbiAgYXR0cnMuaGVpZ2h0ID0gYXR0cnMuYm90dG9tIC0gYXR0cnMudG9wO1xuICByZXR1cm4gYXR0cnM7XG59XG5mdW5jdGlvbiBpblZpZXcoX3JlZikge1xuICB2YXIgdG9wID0gX3JlZi50b3AsXG4gICAgcmlnaHQgPSBfcmVmLnJpZ2h0LFxuICAgIGJvdHRvbSA9IF9yZWYuYm90dG9tLFxuICAgIGxlZnQgPSBfcmVmLmxlZnQsXG4gICAgdyA9IF9yZWYudyxcbiAgICBoID0gX3JlZi5oLFxuICAgIF9yZWYkdGhyZXNob2xkID0gX3JlZi50aHJlc2hvbGQsXG4gICAgdGhyZXNob2xkID0gX3JlZiR0aHJlc2hvbGQgPT09IHZvaWQgMCA/IDAgOiBfcmVmJHRocmVzaG9sZDtcbiAgcmV0dXJuIHRvcCA+PSAwICsgdGhyZXNob2xkICYmIGxlZnQgPj0gMCArIHRocmVzaG9sZCAmJiBib3R0b20gPD0gaCAtIHRocmVzaG9sZCAmJiByaWdodCA8PSB3IC0gdGhyZXNob2xkO1xufVxuZnVuY3Rpb24gaXNCb2R5KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgPT09IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKSB8fCBub2RlID09PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sJyk7XG59XG52YXIgaXNIb3JpeiA9IGZ1bmN0aW9uIGlzSG9yaXoocG9zKSB7XG4gIHJldHVybiAvKGxlZnR8cmlnaHQpLy50ZXN0KHBvcyk7XG59O1xudmFyIGlzT3V0c2lkZVggPSBmdW5jdGlvbiBpc091dHNpZGVYKHZhbCwgd2luZG93V2lkdGgpIHtcbiAgcmV0dXJuIHZhbCA+IHdpbmRvd1dpZHRoO1xufTtcbnZhciBpc091dHNpZGVZID0gZnVuY3Rpb24gaXNPdXRzaWRlWSh2YWwsIHdpbmRvd0hlaWdodCkge1xuICByZXR1cm4gdmFsID4gd2luZG93SGVpZ2h0O1xufTtcbnZhciBzYWZlID0gZnVuY3Rpb24gc2FmZShzdW0pIHtcbiAgcmV0dXJuIHN1bSA8IDAgPyAwIDogc3VtO1xufTtcbmZ1bmN0aW9uIGJlc3RQb3NpdGlvbk9mKHBvc2l0aW9ucykge1xuICByZXR1cm4gT2JqZWN0LmtleXMocG9zaXRpb25zKS5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IHAsXG4gICAgICB2YWx1ZTogcG9zaXRpb25zW3BdXG4gICAgfTtcbiAgfSkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLnZhbHVlIC0gYS52YWx1ZTtcbiAgfSkubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHAucG9zaXRpb247XG4gIH0pO1xufVxuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDU7XG52YXIgR3VpZGUgPSBzdHlsZWQuZGl2KF90ZW1wbGF0ZU9iamVjdCQ1IHx8IChfdGVtcGxhdGVPYmplY3QkNSA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICAtLXJlYWN0b3VyLWFjY2VudDogXCIsIFwiO1xcbiAgXCIsIFwiXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcztcXG4gIHRvcDogMDtcXG4gIGxlZnQ6IDA7XFxuICB6LWluZGV4OiAxMDAwMDAwO1xcblxcbiAgdHJhbnNmb3JtOiBcIiwgXCI7XFxuXCJdKSksIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuYWNjZW50Q29sb3I7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmRlZmF1bHRTdHlsZXMgPyBcIlxcbiAgbWF4LXdpZHRoOiAzMzFweDtcXG4gIG1pbi13aWR0aDogMTUwcHg7XFxuICBwYWRkaW5nLXJpZ2h0OiA0MHB4O1xcbiAgYm9yZGVyLXJhZGl1czogXCIuY29uY2F0KHByb3BzLnJvdW5kZWQsIFwicHg7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgcGFkZGluZzogMjRweCAzMHB4O1xcbiAgYm94LXNoYWRvdzogMCAwLjVlbSAzZW0gcmdiYSgwLCAwLCAwLCAwLjMpO1xcbiAgY29sb3I6IGluaGVyaXQ7XFxuICBcIikgOiAnJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICB2YXIgdGFyZ2V0VG9wID0gcHJvcHMudGFyZ2V0VG9wLFxuICAgIHRhcmdldFJpZ2h0ID0gcHJvcHMudGFyZ2V0UmlnaHQsXG4gICAgdGFyZ2V0Qm90dG9tID0gcHJvcHMudGFyZ2V0Qm90dG9tLFxuICAgIHRhcmdldExlZnQgPSBwcm9wcy50YXJnZXRMZWZ0LFxuICAgIHdpbmRvd1dpZHRoID0gcHJvcHMud2luZG93V2lkdGgsXG4gICAgd2luZG93SGVpZ2h0ID0gcHJvcHMud2luZG93SGVpZ2h0LFxuICAgIGhlbHBlcldpZHRoID0gcHJvcHMuaGVscGVyV2lkdGgsXG4gICAgaGVscGVySGVpZ2h0ID0gcHJvcHMuaGVscGVySGVpZ2h0LFxuICAgIGhlbHBlclBvc2l0aW9uID0gcHJvcHMuaGVscGVyUG9zaXRpb24sXG4gICAgcGFkZGluZyA9IHByb3BzLnBhZGRpbmc7XG4gIHZhciBhdmFpbGFibGUgPSB7XG4gICAgbGVmdDogdGFyZ2V0TGVmdCxcbiAgICByaWdodDogd2luZG93V2lkdGggLSB0YXJnZXRSaWdodCxcbiAgICB0b3A6IHRhcmdldFRvcCxcbiAgICBib3R0b206IHdpbmRvd0hlaWdodCAtIHRhcmdldEJvdHRvbVxuICB9O1xuICB2YXIgY291bGRQb3NpdGlvbkF0ID0gZnVuY3Rpb24gY291bGRQb3NpdGlvbkF0KHBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIGF2YWlsYWJsZVtwb3NpdGlvbl0gPiAoaXNIb3Jpeihwb3NpdGlvbikgPyBoZWxwZXJXaWR0aCArIHBhZGRpbmcgKiAyIDogaGVscGVySGVpZ2h0ICsgcGFkZGluZyAqIDIpO1xuICB9O1xuICB2YXIgYXV0b1Bvc2l0aW9uID0gZnVuY3Rpb24gYXV0b1Bvc2l0aW9uKGNvb3Jkcykge1xuICAgIHZhciBwb3NpdGlvbnNPcmRlciA9IGJlc3RQb3NpdGlvbk9mKGF2YWlsYWJsZSk7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwb3NpdGlvbnNPcmRlci5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGNvdWxkUG9zaXRpb25BdChwb3NpdGlvbnNPcmRlcltqXSkpIHtcbiAgICAgICAgcmV0dXJuIGNvb3Jkc1twb3NpdGlvbnNPcmRlcltqXV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb29yZHMuY2VudGVyO1xuICB9O1xuICB2YXIgcG9zID0gZnVuY3Rpb24gcG9zKGhlbHBlclBvc2l0aW9uKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGVscGVyUG9zaXRpb24pKSB7XG4gICAgICB2YXIgaXNPdXRYID0gaXNPdXRzaWRlWChoZWxwZXJQb3NpdGlvblswXSwgd2luZG93V2lkdGgpO1xuICAgICAgdmFyIGlzT3V0WSA9IGlzT3V0c2lkZVkoaGVscGVyUG9zaXRpb25bMV0sIHdpbmRvd0hlaWdodCk7XG4gICAgICB2YXIgd2FybiA9IGZ1bmN0aW9uIHdhcm4oYXhpcywgbnVtKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIlwiLmNvbmNhdChheGlzLCBcIjpcIikuY29uY2F0KG51bSwgXCIgaXMgb3V0c2lkZSB3aW5kb3csIGZhbGxpbmcgYmFjayB0byBjZW50ZXJcIikpO1xuICAgICAgfTtcbiAgICAgIGlmIChpc091dFgpIHdhcm4oJ3gnLCBoZWxwZXJQb3NpdGlvblswXSk7XG4gICAgICBpZiAoaXNPdXRZKSB3YXJuKCd5JywgaGVscGVyUG9zaXRpb25bMV0pO1xuICAgICAgcmV0dXJuIFtpc091dFggPyB3aW5kb3dXaWR0aCAvIDIgLSBoZWxwZXJXaWR0aCAvIDIgOiBoZWxwZXJQb3NpdGlvblswXSwgaXNPdXRZID8gd2luZG93SGVpZ2h0IC8gMiAtIGhlbHBlckhlaWdodCAvIDIgOiBoZWxwZXJQb3NpdGlvblsxXV07XG4gICAgfVxuICAgIHZhciBoWCA9IGlzT3V0c2lkZVgodGFyZ2V0TGVmdCArIGhlbHBlcldpZHRoLCB3aW5kb3dXaWR0aCkgPyBpc091dHNpZGVYKHRhcmdldFJpZ2h0ICsgcGFkZGluZywgd2luZG93V2lkdGgpID8gdGFyZ2V0UmlnaHQgLSBoZWxwZXJXaWR0aCA6IHRhcmdldFJpZ2h0IC0gaGVscGVyV2lkdGggKyBwYWRkaW5nIDogdGFyZ2V0TGVmdCAtIHBhZGRpbmc7XG4gICAgdmFyIHggPSBoWCA+IHBhZGRpbmcgPyBoWCA6IHBhZGRpbmc7XG4gICAgdmFyIGhZID0gaXNPdXRzaWRlWSh0YXJnZXRUb3AgKyBoZWxwZXJIZWlnaHQsIHdpbmRvd0hlaWdodCkgPyBpc091dHNpZGVZKHRhcmdldEJvdHRvbSArIHBhZGRpbmcsIHdpbmRvd0hlaWdodCkgPyB0YXJnZXRCb3R0b20gLSBoZWxwZXJIZWlnaHQgOiB0YXJnZXRCb3R0b20gLSBoZWxwZXJIZWlnaHQgKyBwYWRkaW5nIDogdGFyZ2V0VG9wIC0gcGFkZGluZztcbiAgICB2YXIgeSA9IGhZID4gcGFkZGluZyA/IGhZIDogcGFkZGluZztcbiAgICB2YXIgY29vcmRzID0ge1xuICAgICAgdG9wOiBbeCwgdGFyZ2V0VG9wIC0gaGVscGVySGVpZ2h0IC0gcGFkZGluZyAqIDJdLFxuICAgICAgcmlnaHQ6IFt0YXJnZXRSaWdodCArIHBhZGRpbmcgKiAyLCB5XSxcbiAgICAgIGJvdHRvbTogW3gsIHRhcmdldEJvdHRvbSArIHBhZGRpbmcgKiAyXSxcbiAgICAgIGxlZnQ6IFt0YXJnZXRMZWZ0IC0gaGVscGVyV2lkdGggLSBwYWRkaW5nICogMiwgeV0sXG4gICAgICBjZW50ZXI6IFt3aW5kb3dXaWR0aCAvIDIgLSBoZWxwZXJXaWR0aCAvIDIsIHdpbmRvd0hlaWdodCAvIDIgLSBoZWxwZXJIZWlnaHQgLyAyXVxuICAgIH07XG4gICAgaWYgKGhlbHBlclBvc2l0aW9uID09PSAnY2VudGVyJyB8fCBjb3VsZFBvc2l0aW9uQXQoaGVscGVyUG9zaXRpb24pKSB7XG4gICAgICByZXR1cm4gY29vcmRzW2hlbHBlclBvc2l0aW9uXTtcbiAgICB9XG4gICAgcmV0dXJuIGF1dG9Qb3NpdGlvbihjb29yZHMpO1xuICB9O1xuICB2YXIgcCA9IHBvcyhoZWxwZXJQb3NpdGlvbik7XG4gIHJldHVybiBcInRyYW5zbGF0ZShcIi5jb25jYXQoTWF0aC5yb3VuZChwWzBdKSwgXCJweCwgXCIpLmNvbmNhdChNYXRoLnJvdW5kKHBbMV0pLCBcInB4KVwiKTtcbn0pO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0JDQ7XG52YXIgQmFkZ2UgPSBzdHlsZWQuc3BhbihfdGVtcGxhdGVPYmplY3QkNCB8fCAoX3RlbXBsYXRlT2JqZWN0JDQgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXG4gIGJhY2tncm91bmQ6IHZhcigtLXJlYWN0b3VyLWFjY2VudCk7XFxuICBiYWNrZ3JvdW5kOiBcIiwgXCI7XFxuICBoZWlnaHQ6IDEuODc1ZW07XFxuICBsaW5lLWhlaWdodDogMjtcXG4gIHBhZGRpbmctbGVmdDogMC44MTI1ZW07XFxuICBwYWRkaW5nLXJpZ2h0OiAwLjgxMjVlbTtcXG4gIGZvbnQtc2l6ZTogMWVtO1xcbiAgYm9yZGVyLXJhZGl1czogMS42MjVlbTtcXG4gIGNvbG9yOiB3aGl0ZTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGJveC1zaGFkb3c6IDAgMC4yNWVtIDAuNWVtIHJnYmEoMCwgMCwgMCwgMC4zKTtcXG4gIHRvcDogLTAuODEyNWVtO1xcbiAgbGVmdDogLTAuODEyNWVtO1xcblwiXSkpLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmFjY2VudENvbG9yO1xufSk7XG5cbnZhciBfdGVtcGxhdGVPYmplY3QkMztcbnZhciBDb250cm9scyA9IHN0eWxlZC5kaXYoX3RlbXBsYXRlT2JqZWN0JDMgfHwgKF90ZW1wbGF0ZU9iamVjdCQzID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBtYXJnaW4tdG9wOiAyNHB4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcblwiXSkpKTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCQyO1xudmFyIE5hdmlnYXRpb24gPSBzdHlsZWQubmF2KF90ZW1wbGF0ZU9iamVjdCQyIHx8IChfdGVtcGxhdGVPYmplY3QkMiA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBjb3VudGVyLXJlc2V0OiBkb3Q7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgZmxleC13cmFwOiB3cmFwO1xcblwiXSkpKTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCQxO1xudmFyIERvdCA9IHN0eWxlZC5idXR0b24oX3RlbXBsYXRlT2JqZWN0JDEgfHwgKF90ZW1wbGF0ZU9iamVjdCQxID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gIGNvdW50ZXItaW5jcmVtZW50OiBkb3Q7XFxuICB3aWR0aDogOHB4O1xcbiAgaGVpZ2h0OiA4cHg7XFxuICBib3JkZXI6IFwiLCBcIjtcXG5cXG4gIGJvcmRlci1yYWRpdXM6IDEwMCU7XFxuICBwYWRkaW5nOiAwO1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW46IDRweDtcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgdHJhbnNmb3JtIDAuM3M7XFxuICBjdXJzb3I6IFwiLCBcIjtcXG4gIHRyYW5zZm9ybTogc2NhbGUoXCIsIFwiKTtcXG5cXG4gIGNvbG9yOiBcIiwgXCI7XFxuICBiYWNrZ3JvdW5kOiBcIiwgXCI7XFxuXFxuICBjb2xvcjogXCIsIFwiO1xcbiAgYmFja2dyb3VuZDogXCIsIFwiO1xcblxcbiAgJjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBjb3VudGVyKGRvdCk7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgYm90dG9tOiBjYWxjKDEwMCUgKyAwLjI1ZW0pO1xcbiAgICBsZWZ0OiA1MCU7XFxuICAgIG9wYWNpdHk6IDA7XFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDFlbSk7XFxuICAgIHRyYW5zaXRpb246IDAuM3M7XFxuICAgIGRpc3BsYXk6IFwiLCBcIjtcXG4gIH1cXG5cXG4gICY6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XFxuXFxuICAgICY6YmVmb3JlIHtcXG4gICAgICBvcGFjaXR5OiAwLjU7XFxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTJweCk7XFxuICAgIH1cXG4gIH1cXG5cIl0pKSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5jdXJyZW50ID09PSBwcm9wcy5pbmRleCA/ICcwJyA6ICcxcHggc29saWQgI2NhY2NjZSc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmRpc2FibGVkID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJztcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuY3VycmVudCA9PT0gcHJvcHMuaW5kZXggPyAxLjI1IDogMTtcbn0sIGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuY3VycmVudCA9PT0gcHJvcHMuaW5kZXggPyAndmFyKC0tcmVhY3RvdXItYWNjZW50KScgOiAnI2NhY2NjZSc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLmN1cnJlbnQgPT09IHByb3BzLmluZGV4ID8gJ3ZhcigtLXJlYWN0b3VyLWFjY2VudCknIDogJ25vbmUnO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5jdXJyZW50ID09PSBwcm9wcy5pbmRleCA/IHByb3BzLmFjY2VudENvbG9yIDogJyNjYWNjY2UnO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5jdXJyZW50ID09PSBwcm9wcy5pbmRleCA/IHByb3BzLmFjY2VudENvbG9yIDogJ25vbmUnO1xufSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5zaG93TnVtYmVyID8gJ2Jsb2NrJyA6ICdub25lJztcbn0pO1xuXG52YXIgX3RlbXBsYXRlT2JqZWN0O1xudmFyIFN2Z01hc2tXcmFwcGVyID0gc3R5bGVkLmRpdihfdGVtcGxhdGVPYmplY3QgfHwgKF90ZW1wbGF0ZU9iamVjdCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoW1wiXFxuICBvcGFjaXR5OiBcIiwgXCI7XFxuICBjb2xvcjogXCIsIFwiO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiAwO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgei1pbmRleDogOTk5OTk7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG5cIl0pKSwgZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiAhcHJvcHMubWFza0NsYXNzTmFtZSAmJiAwLjc7XG59LCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuICFwcm9wcy5tYXNrQ2xhc3NOYW1lICYmICcjMDAwJztcbn0pO1xuZnVuY3Rpb24gU3ZnTWFzayhfcmVmKSB7XG4gIHZhciB3aW5kb3dXaWR0aCA9IF9yZWYud2luZG93V2lkdGgsXG4gICAgd2luZG93SGVpZ2h0ID0gX3JlZi53aW5kb3dIZWlnaHQsXG4gICAgdGFyZ2V0V2lkdGggPSBfcmVmLnRhcmdldFdpZHRoLFxuICAgIHRhcmdldEhlaWdodCA9IF9yZWYudGFyZ2V0SGVpZ2h0LFxuICAgIHRhcmdldFRvcCA9IF9yZWYudGFyZ2V0VG9wLFxuICAgIHRhcmdldExlZnQgPSBfcmVmLnRhcmdldExlZnQsXG4gICAgcGFkZGluZyA9IF9yZWYucGFkZGluZyxcbiAgICByb3VuZGVkID0gX3JlZi5yb3VuZGVkLFxuICAgIHJvdW5kZWRTdGVwID0gX3JlZi5yb3VuZGVkU3RlcCxcbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24gPSBfcmVmLmRpc2FibGVJbnRlcmFjdGlvbixcbiAgICBkaXNhYmxlSW50ZXJhY3Rpb25DbGFzc05hbWUgPSBfcmVmLmRpc2FibGVJbnRlcmFjdGlvbkNsYXNzTmFtZSxcbiAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICBvbkNsaWNrID0gX3JlZi5vbkNsaWNrLFxuICAgIGhpZ2hsaWdodGVkQm9yZGVyID0gX3JlZi5oaWdobGlnaHRlZEJvcmRlcjtcbiAgdmFyIHdpZHRoID0gc2FmZSh0YXJnZXRXaWR0aCArIHBhZGRpbmcgKiAyKTtcbiAgdmFyIGhlaWdodCA9IHNhZmUodGFyZ2V0SGVpZ2h0ICsgcGFkZGluZyAqIDIpO1xuICB2YXIgdG9wID0gc2FmZSh0YXJnZXRUb3AgLSBwYWRkaW5nKTtcbiAgdmFyIGxlZnQgPSBzYWZlKHRhcmdldExlZnQgLSBwYWRkaW5nKTtcbiAgdmFyIHJvdW5kZWRSYWRpdXMgPSByb3VuZGVkU3RlcCA/IE1hdGgubWluKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMikgOiByb3VuZGVkO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ZnTWFza1dyYXBwZXIsIHtcbiAgICBvbkNsaWNrOiBvbkNsaWNrLFxuICAgIG1hc2tDbGFzc05hbWU6IGNsYXNzTmFtZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgd2lkdGg6IHdpbmRvd1dpZHRoLFxuICAgIGhlaWdodDogd2luZG93SGVpZ2h0LFxuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibWFza1wiLCB7XG4gICAgaWQ6IFwibWFzay1tYWluXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgd2lkdGg6IHdpbmRvd1dpZHRoLFxuICAgIGhlaWdodDogd2luZG93SGVpZ2h0LFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiBsZWZ0LFxuICAgIHk6IHRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgZmlsbDogXCJibGFja1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IGxlZnQgLSAxLFxuICAgIHk6IHRvcCAtIDEsXG4gICAgd2lkdGg6IHJvdW5kZWRSYWRpdXMsXG4gICAgaGVpZ2h0OiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwge1xuICAgIGN4OiBsZWZ0ICsgcm91bmRlZFJhZGl1cyxcbiAgICBjeTogdG9wICsgcm91bmRlZFJhZGl1cyxcbiAgICByOiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiBsZWZ0ICsgd2lkdGggLSByb3VuZGVkUmFkaXVzICsgMSxcbiAgICB5OiB0b3AgLSAxLFxuICAgIHdpZHRoOiByb3VuZGVkUmFkaXVzLFxuICAgIGhlaWdodDogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogbGVmdCArIHdpZHRoIC0gcm91bmRlZFJhZGl1cyxcbiAgICBjeTogdG9wICsgcm91bmRlZFJhZGl1cyxcbiAgICByOiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiBsZWZ0IC0gMSxcbiAgICB5OiB0b3AgKyBoZWlnaHQgLSByb3VuZGVkUmFkaXVzICsgMSxcbiAgICB3aWR0aDogcm91bmRlZFJhZGl1cyxcbiAgICBoZWlnaHQ6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IGxlZnQgKyByb3VuZGVkUmFkaXVzLFxuICAgIGN5OiB0b3AgKyBoZWlnaHQgLSByb3VuZGVkUmFkaXVzLFxuICAgIHI6IHJvdW5kZWRSYWRpdXMsXG4gICAgZmlsbDogXCJibGFja1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IGxlZnQgKyB3aWR0aCAtIHJvdW5kZWRSYWRpdXMgKyAxLFxuICAgIHk6IHRvcCArIGhlaWdodCAtIHJvdW5kZWRSYWRpdXMgKyAxLFxuICAgIHdpZHRoOiByb3VuZGVkUmFkaXVzLFxuICAgIGhlaWdodDogcm91bmRlZFJhZGl1cyxcbiAgICBmaWxsOiBcIndoaXRlXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogbGVmdCArIHdpZHRoIC0gcm91bmRlZFJhZGl1cyxcbiAgICBjeTogdG9wICsgaGVpZ2h0IC0gcm91bmRlZFJhZGl1cyxcbiAgICByOiByb3VuZGVkUmFkaXVzLFxuICAgIGZpbGw6IFwiYmxhY2sgXCJcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIsIHtcbiAgICBpZDogXCJjbGlwLXBhdGhcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3aWR0aDogd2luZG93V2lkdGgsXG4gICAgaGVpZ2h0OiB0b3BcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogMCxcbiAgICB5OiB0b3AsXG4gICAgd2lkdGg6IGxlZnQsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogdGFyZ2V0TGVmdCArIHRhcmdldFdpZHRoICsgcGFkZGluZyxcbiAgICB5OiB0b3AsXG4gICAgd2lkdGg6IHNhZmUod2luZG93V2lkdGggLSB0YXJnZXRXaWR0aCAtIGxlZnQpLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IDAsXG4gICAgeTogdGFyZ2V0VG9wICsgdGFyZ2V0SGVpZ2h0ICsgcGFkZGluZyxcbiAgICB3aWR0aDogd2luZG93V2lkdGgsXG4gICAgaGVpZ2h0OiBzYWZlKHdpbmRvd0hlaWdodCAtIHRhcmdldEhlaWdodCAtIHRvcClcbiAgfSkpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgd2lkdGg6IHdpbmRvd1dpZHRoLFxuICAgIGhlaWdodDogd2luZG93SGVpZ2h0LFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgbWFzazogXCJ1cmwoI21hc2stbWFpbilcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgd2lkdGg6IHdpbmRvd1dpZHRoLFxuICAgIGhlaWdodDogd2luZG93SGVpZ2h0LFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgY2xpcFBhdGg6IFwidXJsKCNjbGlwLXBhdGgpXCIsXG4gICAgcG9pbnRlckV2ZW50czogXCJhdXRvXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgeDogbGVmdCxcbiAgICB5OiB0b3AsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHBvaW50ZXJFdmVudHM6IFwiYXV0b1wiLFxuICAgIGZpbGw6IFwidHJhbnNwYXJlbnRcIixcbiAgICBkaXNwbGF5OiBkaXNhYmxlSW50ZXJhY3Rpb24gPyAnYmxvY2snIDogJ25vbmUnLFxuICAgIGNsYXNzTmFtZTogZGlzYWJsZUludGVyYWN0aW9uQ2xhc3NOYW1lXG4gIH0pLCBoaWdobGlnaHRlZEJvcmRlciAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIHg6IHNhZmUobGVmdCArIGhpZ2hsaWdodGVkQm9yZGVyLndpZHRoIC8gMi4wKSxcbiAgICB5OiBzYWZlKHRvcCArIGhpZ2hsaWdodGVkQm9yZGVyLndpZHRoIC8gMi4wKSxcbiAgICB3aWR0aDogc2FmZSh3aWR0aCAtIGhpZ2hsaWdodGVkQm9yZGVyLndpZHRoKSxcbiAgICBoZWlnaHQ6IHNhZmUoaGVpZ2h0IC0gaGlnaGxpZ2h0ZWRCb3JkZXIud2lkdGgpLFxuICAgIHBvaW50ZXJFdmVudHM6IFwiYXV0b1wiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHN0cm9rZVdpZHRoOiBoaWdobGlnaHRlZEJvcmRlci53aWR0aCxcbiAgICBzdHJva2U6IGhpZ2hsaWdodGVkQm9yZGVyLmNvbG9yLFxuICAgIHJ4OiByb3VuZGVkUmFkaXVzIC0gMlxuICB9KSkpO1xufVxuU3ZnTWFzay5wcm9wVHlwZXMgPSB7XG4gIHdpbmRvd1dpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHdpbmRvd0hlaWdodDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB0YXJnZXRXaWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB0YXJnZXRIZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdGFyZ2V0VG9wOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHRhcmdldExlZnQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcGFkZGluZzogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICByb3VuZGVkOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHJvdW5kZWRTdGVwOiBQcm9wVHlwZXMuYm9vbCxcbiAgZGlzYWJsZUludGVyYWN0aW9uOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBkaXNhYmxlSW50ZXJhY3Rpb25DbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgaGlnaGxpZ2h0ZWRCb3JkZXI6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgY29sb3I6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICB3aWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkXG4gIH0pXG59O1xuXG52YXIgUmVhY3RvdXJSZXNpemVPYnNlcnZlciA9IChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgc3RlcCA9IF9yZWYuc3RlcCxcbiAgICByZWZyZXNoID0gX3JlZi5yZWZyZXNoO1xuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoMCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgbXV0YXRpb25zQ291bnRlciA9IF91c2VTdGF0ZTJbMF0sXG4gICAgc2V0TXV0YXRpb25zQ291bnRlciA9IF91c2VTdGF0ZTJbMV07XG5cbiAgLy8gb25seSB1c2UgdG8gbm90aWZ5IG1haW4gbG9naWMgYmVsb3dcbiAgLy8gdGhhdCBhIHJlc2l6ZU9ic2VydmFibGUgaGFzIGJlZW4gYWRkZWQgdG8gRE9NIChvciByZW1vdmVkIGZyb20gaXQpXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzdGVwLnJlc2l6ZU9ic2VydmFibGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBpbmNyZW1lbnRNdXRhdGlvbnNDb3VudGVySWZPYnNlcnZhYmxlID0gZnVuY3Rpb24gaW5jcmVtZW50TXV0YXRpb25zQ291bnRlcklmT2JzZXJ2YWJsZShub2Rlcykge1xuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG5vZGVzKSxcbiAgICAgICAgX3N0ZXA7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgICAgICAgICB2YXIgbm9kZSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGlmICghbm9kZS5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gMTsgLy8gY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGZvdW5kID0gc3RlcC5yZXNpemVPYnNlcnZhYmxlcy5maW5kKGZ1bmN0aW9uIChvYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5tYXRjaGVzKG9ic2VydmFibGUpIHx8IG5vZGUucXVlcnlTZWxlY3RvcihvYnNlcnZhYmxlKSAhPSBudWxsO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgc2V0TXV0YXRpb25zQ291bnRlcihtdXRhdGlvbnNDb3VudGVyICsgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgIGlmIChfbG9vcCgpKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zTGlzdCkge1xuICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihtdXRhdGlvbnNMaXN0KSxcbiAgICAgICAgX3N0ZXAyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgbXV0YXRpb24gPSBfc3RlcDIudmFsdWU7XG4gICAgICAgICAgaWYgKDAgIT09IG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpbmNyZW1lbnRNdXRhdGlvbnNDb3VudGVySWZPYnNlcnZhYmxlKG11dGF0aW9uLmFkZGVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoMCAhPT0gbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgaW5jcmVtZW50TXV0YXRpb25zQ291bnRlcklmT2JzZXJ2YWJsZShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIG9ic2VydmFibGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTtcbiAgICB2YXIgY29uZmlnID0ge1xuICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZVxuICAgIH07XG4gICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG9ic2VydmFibGUsIGNvbmZpZyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH07XG4gIH0sIFtzdGVwLCBtdXRhdGlvbnNDb3VudGVyXSk7XG5cbiAgLy8gdGhlIG1haW4gbG9naWMgaXMgaGVyZVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3RlcC5yZXNpemVPYnNlcnZhYmxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICAgIHJlZnJlc2goKTtcbiAgICB9KTtcbiAgICB2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHN0ZXAucmVzaXplT2JzZXJ2YWJsZXMpLFxuICAgICAgX3N0ZXAzO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOykge1xuICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IF9zdGVwMy52YWx1ZTtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG9ic2VydmFibGUpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9pdGVyYXRvcjMuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IzLmYoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9LCBbc3RlcCwgbXV0YXRpb25zQ291bnRlcl0pO1xuICByZXR1cm4gbnVsbDtcbn0pO1xuXG52YXIgUmVhY3RvdXJNdXRhdGlvbk9ic2VydmVyID0gKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBzdGVwID0gX3JlZi5zdGVwLFxuICAgIHJlZnJlc2ggPSBfcmVmLnJlZnJlc2g7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzdGVwLm11dGF0aW9uT2JzZXJ2YWJsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJlZnJlc2hIaWdobGlnaHRlZFJlZ2lvbklmT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIHJlZnJlc2hIaWdobGlnaHRlZFJlZ2lvbklmT2JzZXJ2YWJsZShub2Rlcykge1xuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG5vZGVzKSxcbiAgICAgICAgX3N0ZXA7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgICAgICAgICB2YXIgbm9kZSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGlmICghbm9kZS5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gMTsgLy8gY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGZvdW5kID0gc3RlcC5tdXRhdGlvbk9ic2VydmFibGVzLmZpbmQoZnVuY3Rpb24gKG9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLm1hdGNoZXMob2JzZXJ2YWJsZSkgfHwgbm9kZS5xdWVyeVNlbGVjdG9yKG9ic2VydmFibGUpICE9IG51bGw7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICByZWZyZXNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgIGlmIChfbG9vcCgpKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zTGlzdCkge1xuICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihtdXRhdGlvbnNMaXN0KSxcbiAgICAgICAgX3N0ZXAyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgbXV0YXRpb24gPSBfc3RlcDIudmFsdWU7XG4gICAgICAgICAgaWYgKDAgIT09IG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZWZyZXNoSGlnaGxpZ2h0ZWRSZWdpb25JZk9ic2VydmFibGUobXV0YXRpb24uYWRkZWROb2Rlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgwICE9PSBtdXRhdGlvbi5yZW1vdmVkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZWZyZXNoSGlnaGxpZ2h0ZWRSZWdpb25JZk9ic2VydmFibGUobXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBvYnNlcnZhYmxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHk7XG4gICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIHN1YnRyZWU6IHRydWVcbiAgICB9O1xuICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShvYnNlcnZhYmxlLCBjb25maWcpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9LCBbc3RlcF0pO1xuICByZXR1cm4gbnVsbDtcbn0pO1xuXG5mdW5jdGlvbiBQb3J0YWwoX3JlZikge1xuICB2YXIgY2hpbGRyZW4gPSBfcmVmLmNoaWxkcmVuO1xuICB2YXIgcmVmID0gdXNlUmVmKG51bGwpO1xuICBpZiAocmVmLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICByZWYuY3VycmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHJlZi5jdXJyZW50LnNldEF0dHJpYnV0ZSgnaWQnLCAnX19fcmVhY3RvdXInKTtcbiAgfVxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocmVmLmN1cnJlbnQpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbcmVmXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCByZWYuY3VycmVudCk7XG59XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGRpc2FibGVGb2N1c0xvY2s6IFByb3BUeXBlcy5ib29sLFxuICBiYWRnZUNvbnRlbnQ6IFByb3BUeXBlcy5mdW5jLFxuICBoaWdobGlnaHRlZE1hc2tDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubm9kZSwgUHJvcFR5cGVzLmVsZW1lbnRdKSxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBjbG9zZUJ1dHRvbkFyaWFMYWJlbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgY2xvc2VXaXRoTWFzazogUHJvcFR5cGVzLmJvb2wsXG4gIGluVmlld1RocmVzaG9sZDogUHJvcFR5cGVzLm51bWJlcixcbiAgaXNPcGVuOiBQcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBsYXN0U3RlcE5leHRCdXR0b246IFByb3BUeXBlcy5ub2RlLFxuICBtYXNrQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBtYXNrU3BhY2U6IFByb3BUeXBlcy5udW1iZXIsXG4gIG5leHRCdXR0b246IFByb3BUeXBlcy5ub2RlLFxuICBvbkFmdGVyT3BlbjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQmVmb3JlQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuICBvblJlcXVlc3RDbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG4gIHByZXZCdXR0b246IFByb3BUeXBlcy5ub2RlLFxuICBzY3JvbGxEdXJhdGlvbjogUHJvcFR5cGVzLm51bWJlcixcbiAgc2Nyb2xsT2Zmc2V0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBzaG93QnV0dG9uczogUHJvcFR5cGVzLmJvb2wsXG4gIHNob3dDbG9zZUJ1dHRvbjogUHJvcFR5cGVzLmJvb2wsXG4gIHNob3dOYXZpZ2F0aW9uOiBQcm9wVHlwZXMuYm9vbCxcbiAgc2hvd05hdmlnYXRpb25OdW1iZXI6IFByb3BUeXBlcy5ib29sLFxuICBzaG93TnVtYmVyOiBQcm9wVHlwZXMuYm9vbCxcbiAgc3RhcnRBdDogUHJvcFR5cGVzLm51bWJlcixcbiAgZ29Ub1N0ZXA6IFByb3BUeXBlcy5udW1iZXIsXG4gIGdldEN1cnJlbnRTdGVwOiBQcm9wVHlwZXMuZnVuYyxcbiAgbmV4dFN0ZXA6IFByb3BUeXBlcy5mdW5jLFxuICBwcmV2U3RlcDogUHJvcFR5cGVzLmZ1bmMsXG4gIHN0ZXBzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc2hhcGUoe1xuICAgIHNlbGVjdG9yOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvbnRlbnQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ub2RlLCBQcm9wVHlwZXMuZWxlbWVudCwgUHJvcFR5cGVzLmZ1bmNdKS5pc1JlcXVpcmVkLFxuICAgIHBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKSwgUHJvcFR5cGVzLm9uZU9mKFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0JywgJ2NlbnRlciddKV0pLFxuICAgIGFjdGlvbjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgc3RlcEludGVyYWN0aW9uOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBuYXZEb3RBcmlhTGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgcm91bmRlZFN0ZXA6IFByb3BUeXBlcy5ib29sXG4gIH0pKSxcbiAgdXBkYXRlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICB1cGRhdGVEZWxheTogUHJvcFR5cGVzLm51bWJlcixcbiAgZGlzYWJsZUludGVyYWN0aW9uOiBQcm9wVHlwZXMuYm9vbCxcbiAgZGlzYWJsZURvdHNOYXZpZ2F0aW9uOiBQcm9wVHlwZXMuYm9vbCxcbiAgZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mKFsnZXNjJywgJ3JpZ2h0JywgJ2xlZnQnXSkpLCBQcm9wVHlwZXMuYm9vbF0pLFxuICByb3VuZGVkOiBQcm9wVHlwZXMubnVtYmVyLFxuICBhY2NlbnRDb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgaGlnaGxpZ2h0ZWRCb3JkZXI6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgY29sb3I6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICB3aWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkXG4gIH0pXG59O1xudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgZGlzYWJsZUZvY3VzTG9jazogZmFsc2UsXG4gIHNob3dOYXZpZ2F0aW9uOiB0cnVlLFxuICBzaG93TmF2aWdhdGlvbk51bWJlcjogdHJ1ZSxcbiAgc2hvd0J1dHRvbnM6IHRydWUsXG4gIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgY2xvc2VCdXR0b25BcmlhTGFiZWw6ICdDbG9zZScsXG4gIHNob3dOdW1iZXI6IHRydWUsXG4gIHNjcm9sbER1cmF0aW9uOiAxLFxuICBtYXNrU3BhY2U6IDEwLFxuICB1cGRhdGVEZWxheTogMSxcbiAgZGlzYWJsZUludGVyYWN0aW9uOiBmYWxzZSxcbiAgcm91bmRlZDogMCxcbiAgYWNjZW50Q29sb3I6ICcjMDA3YWZmJyxcbiAgY2xvc2VXaXRoTWFzazogdHJ1ZVxufTtcblxudmFyIENOID0ge1xuICBtYXNrOiB7XG4gICAgYmFzZTogJ3JlYWN0b3VyX19tYXNrJyxcbiAgICBpc09wZW46ICdyZWFjdG91cl9fbWFzay0taXMtb3BlbicsXG4gICAgZGlzYWJsZUludGVyYWN0aW9uOiAncmVhY3RvdXJfX21hc2stLWRpc2FibGUtaW50ZXJhY3Rpb24nXG4gIH0sXG4gIGhlbHBlcjoge1xuICAgIGJhc2U6ICdyZWFjdG91cl9faGVscGVyJyxcbiAgICBpc09wZW46ICdyZWFjdG91cl9faGVscGVyLS1pcy1vcGVuJ1xuICB9LFxuICBkb3Q6IHtcbiAgICBiYXNlOiAncmVhY3RvdXJfX2RvdCcsXG4gICAgYWN0aXZlOiAncmVhY3RvdXJfX2RvdC0taXMtYWN0aXZlJ1xuICB9XG59O1xuXG52YXIgVG91ciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBmdW5jdGlvbiBUb3VyKCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVG91cik7XG4gICAgX3RoaXMgPSBfY2FsbFN1cGVyKHRoaXMsIFRvdXIpO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJ1bmxvY2tGb2N1c1wiLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZm9jdXNVbmxvY2tlZDogdHJ1ZVxuICAgICAgfSwgY2FsbGJhY2soKSk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcInNob3dTdGVwXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3RoaXMuaGVscGVyIHx8ICFfdGhpcy5oZWxwZXIuY3VycmVudCkgcmV0dXJuO1xuICAgICAgdmFyIHN0ZXBzID0gX3RoaXMucHJvcHMuc3RlcHM7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgY3VycmVudCA9IF90aGlzJHN0YXRlLmN1cnJlbnQsXG4gICAgICAgIGZvY3VzVW5sb2NrZWQgPSBfdGhpcyRzdGF0ZS5mb2N1c1VubG9ja2VkO1xuICAgICAgaWYgKGZvY3VzVW5sb2NrZWQpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGZvY3VzVW5sb2NrZWQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIHN0ZXAgPSBzdGVwc1tjdXJyZW50XTtcbiAgICAgIHZhciBub2RlID0gc3RlcC5zZWxlY3RvciA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc3RlcC5zZWxlY3RvcikgOiBudWxsO1xuICAgICAgdmFyIHN0ZXBDYWxsYmFjayA9IGZ1bmN0aW9uIHN0ZXBDYWxsYmFjayhvKSB7XG4gICAgICAgIGlmIChzdGVwLmFjdGlvbiAmJiB0eXBlb2Ygc3RlcC5hY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBfdGhpcy51bmxvY2tGb2N1cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcC5hY3Rpb24obyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoc3RlcC5vYnNlcnZlKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHN0ZXAub2JzZXJ2ZSk7XG4gICAgICAgIHZhciBjb25maWcgPSB7XG4gICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgaWYgKHByZXZTdGF0ZS5vYnNlcnZlcikge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHByZXZTdGF0ZS5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9ic2VydmVyOiBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7XG4gICAgICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChtdXRhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0JyAmJiBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHZhciBjYiA9IGZ1bmN0aW9uIGNiKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcENhbGxiYWNrKG11dGF0aW9uLmFkZGVkTm9kZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuY2FsY3VsYXRlTm9kZShtdXRhdGlvbi5hZGRlZE5vZGVzWzBdLCBzdGVwLCBjYik7XG4gICAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXV0YXRpb24udHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHZhciBfY2IgPSBmdW5jdGlvbiBfY2IoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGVwQ2FsbGJhY2sobm9kZSk7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgX3RoaXMuY2FsY3VsYXRlTm9kZShub2RlLCBzdGVwLCBfY2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH07XG4gICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuc3RhdGUub2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXQsIGNvbmZpZyk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKF90aGlzLnN0YXRlLm9ic2VydmVyKSB7XG4gICAgICAgICAgX3RoaXMuc3RhdGUub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIG9ic2VydmVyOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIHZhciBjYiA9IGZ1bmN0aW9uIGNiKCkge1xuICAgICAgICAgIHJldHVybiBzdGVwQ2FsbGJhY2sobm9kZSk7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmNhbGN1bGF0ZU5vZGUobm9kZSwgc3RlcCwgY2IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoc2V0Tm9kZVN0YXRlKG51bGwsIHN0ZXAsIF90aGlzLmhlbHBlci5jdXJyZW50KSwgc3RlcENhbGxiYWNrKTtcbiAgICAgICAgc3RlcC5zZWxlY3RvciAmJiBjb25zb2xlLndhcm4oXCJEb2Vzbid0IGZpbmQgYSBET00gbm9kZSAnXCIuY29uY2F0KHN0ZXAuc2VsZWN0b3IsIFwiJy4gUGxlYXNlIGNoZWNrIHRoZSAnc3RlcHMnIFRvdXIgcHJvcCBBcnJheSBhdCBwb3NpdGlvbiBcIikuY29uY2F0KGN1cnJlbnQsIFwiLlwiKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcImNhbGN1bGF0ZU5vZGVcIiwgZnVuY3Rpb24gKG5vZGUsIHN0ZXAsIGNiKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgc2Nyb2xsRHVyYXRpb24gPSBfdGhpcyRwcm9wcy5zY3JvbGxEdXJhdGlvbixcbiAgICAgICAgaW5WaWV3VGhyZXNob2xkID0gX3RoaXMkcHJvcHMuaW5WaWV3VGhyZXNob2xkLFxuICAgICAgICBzY3JvbGxPZmZzZXQgPSBfdGhpcyRwcm9wcy5zY3JvbGxPZmZzZXQ7XG4gICAgICB2YXIgYXR0cnMgPSBnZXRIaWdobGlnaHRlZFJlY3Qobm9kZSwgc3RlcCk7XG4gICAgICB2YXIgdyA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gICAgICB2YXIgaCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTtcbiAgICAgIGlmICghaW5WaWV3KF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBhdHRycyksIHt9LCB7XG4gICAgICAgIHc6IHcsXG4gICAgICAgIGg6IGgsXG4gICAgICAgIHRocmVzaG9sZDogaW5WaWV3VGhyZXNob2xkXG4gICAgICB9KSkpIHtcbiAgICAgICAgdmFyIHBhcmVudFNjcm9sbCA9IFNjcm9sbHBhcmVudChub2RlKTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHNjcm9sbE9mZnNldCA/IHNjcm9sbE9mZnNldCA6IGF0dHJzLmhlaWdodCA+IGggPyAtMjUgOiAtKGggLyAyKSArIGF0dHJzLmhlaWdodCAvIDI7XG4gICAgICAgIHNjcm9sbFNtb290aC50byhub2RlLCB7XG4gICAgICAgICAgY29udGV4dDogaXNCb2R5KHBhcmVudFNjcm9sbCkgPyB3aW5kb3cgOiBwYXJlbnRTY3JvbGwsXG4gICAgICAgICAgZHVyYXRpb246IHNjcm9sbER1cmF0aW9uLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhuZCkge1xuICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUoc2V0Tm9kZVN0YXRlKG5kLCBzdGVwLCBfdGhpcy5oZWxwZXIuY3VycmVudCksIGNiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoc2V0Tm9kZVN0YXRlKG5vZGUsIHN0ZXAsIF90aGlzLmhlbHBlci5jdXJyZW50KSwgY2IpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJyZWNhbGN1bGF0ZU5vZGVcIiwgZnVuY3Rpb24gKHN0ZXApIHtcbiAgICAgIHZhciBub2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzdGVwLnNlbGVjdG9yKTtcbiAgICAgIHZhciBzdGVwQ2FsbGJhY2sgPSBmdW5jdGlvbiBzdGVwQ2FsbGJhY2sobykge1xuICAgICAgICBpZiAoc3RlcC5hY3Rpb24gJiYgdHlwZW9mIHN0ZXAuYWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgX3RoaXMudW5sb2NrRm9jdXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAuYWN0aW9uKG8pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgX3RoaXMuY2FsY3VsYXRlTm9kZShub2RlLCBzdGVwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzdGVwQ2FsbGJhY2sobm9kZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBfZGVmaW5lUHJvcGVydHkoX3RoaXMsIFwibWFza0NsaWNrSGFuZGxlclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICBjbG9zZVdpdGhNYXNrID0gX3RoaXMkcHJvcHMyLmNsb3NlV2l0aE1hc2ssXG4gICAgICAgIG9uUmVxdWVzdENsb3NlID0gX3RoaXMkcHJvcHMyLm9uUmVxdWVzdENsb3NlO1xuICAgICAgaWYgKGNsb3NlV2l0aE1hc2sgJiYgIWUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDTi5tYXNrLmRpc2FibGVJbnRlcmFjdGlvbikpIHtcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2UoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcIm5leHRTdGVwXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgc3RlcHMgPSBfdGhpcyRwcm9wczMuc3RlcHMsXG4gICAgICAgIGdldEN1cnJlbnRTdGVwID0gX3RoaXMkcHJvcHMzLmdldEN1cnJlbnRTdGVwO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICB2YXIgbmV4dFN0ZXAgPSBwcmV2U3RhdGUuY3VycmVudCA8IHN0ZXBzLmxlbmd0aCAtIDEgPyBwcmV2U3RhdGUuY3VycmVudCArIDEgOiBwcmV2U3RhdGUuY3VycmVudDtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRDdXJyZW50U3RlcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGdldEN1cnJlbnRTdGVwKG5leHRTdGVwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGN1cnJlbnQ6IG5leHRTdGVwXG4gICAgICAgIH07XG4gICAgICB9LCBfdGhpcy5zaG93U3RlcCk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcInByZXZTdGVwXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBnZXRDdXJyZW50U3RlcCA9IF90aGlzLnByb3BzLmdldEN1cnJlbnRTdGVwO1xuICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICB2YXIgbmV4dFN0ZXAgPSBwcmV2U3RhdGUuY3VycmVudCA+IDAgPyBwcmV2U3RhdGUuY3VycmVudCAtIDEgOiBwcmV2U3RhdGUuY3VycmVudDtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRDdXJyZW50U3RlcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGdldEN1cnJlbnRTdGVwKG5leHRTdGVwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGN1cnJlbnQ6IG5leHRTdGVwXG4gICAgICAgIH07XG4gICAgICB9LCBfdGhpcy5zaG93U3RlcCk7XG4gICAgfSk7XG4gICAgX2RlZmluZVByb3BlcnR5KF90aGlzLCBcImdvdG9TdGVwXCIsIGZ1bmN0aW9uIChuKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gX3RoaXMucHJvcHMsXG4gICAgICAgIHN0ZXBzID0gX3RoaXMkcHJvcHM0LnN0ZXBzLFxuICAgICAgICBnZXRDdXJyZW50U3RlcCA9IF90aGlzJHByb3BzNC5nZXRDdXJyZW50U3RlcDtcbiAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgdmFyIG5leHRTdGVwID0gc3RlcHNbbl0gPyBuIDogcHJldlN0YXRlLmN1cnJlbnQ7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0Q3VycmVudFN0ZXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBnZXRDdXJyZW50U3RlcChuZXh0U3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjdXJyZW50OiBuZXh0U3RlcFxuICAgICAgICB9O1xuICAgICAgfSwgX3RoaXMuc2hvd1N0ZXApO1xuICAgIH0pO1xuICAgIF9kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJrZXlEb3duSGFuZGxlclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNSA9IF90aGlzLnByb3BzLFxuICAgICAgICBvblJlcXVlc3RDbG9zZSA9IF90aGlzJHByb3BzNS5vblJlcXVlc3RDbG9zZSxcbiAgICAgICAgbmV4dFN0ZXAgPSBfdGhpcyRwcm9wczUubmV4dFN0ZXAsXG4gICAgICAgIHByZXZTdGVwID0gX3RoaXMkcHJvcHM1LnByZXZTdGVwLFxuICAgICAgICBkaXNhYmxlS2V5Ym9hcmROYXZpZ2F0aW9uID0gX3RoaXMkcHJvcHM1LmRpc2FibGVLZXlib2FyZE5hdmlnYXRpb247XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb24gPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGlzRXNjRGlzYWJsZWQsIGlzUmlnaHREaXNhYmxlZCwgaXNMZWZ0RGlzYWJsZWQ7XG4gICAgICBpZiAoZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbikge1xuICAgICAgICBpc0VzY0Rpc2FibGVkID0gZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbi5pbmNsdWRlcygnZXNjJyk7XG4gICAgICAgIGlzUmlnaHREaXNhYmxlZCA9IGRpc2FibGVLZXlib2FyZE5hdmlnYXRpb24uaW5jbHVkZXMoJ3JpZ2h0Jyk7XG4gICAgICAgIGlzTGVmdERpc2FibGVkID0gZGlzYWJsZUtleWJvYXJkTmF2aWdhdGlvbi5pbmNsdWRlcygnbGVmdCcpO1xuICAgICAgfVxuICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcgJiYgIWlzRXNjRGlzYWJsZWQpIHtcbiAgICAgICAgLy8gZXNjXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb25SZXF1ZXN0Q2xvc2UoKTtcbiAgICAgIH1cbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDM5ICYmICFpc1JpZ2h0RGlzYWJsZWQpIHtcbiAgICAgICAgLy8gcmlnaHRcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0eXBlb2YgbmV4dFN0ZXAgPT09ICdmdW5jdGlvbicgPyBuZXh0U3RlcCgpIDogX3RoaXMubmV4dFN0ZXAoKTtcbiAgICAgIH1cbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDM3ICYmICFpc0xlZnREaXNhYmxlZCkge1xuICAgICAgICAvLyBsZWZ0XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdHlwZW9mIHByZXZTdGVwID09PSAnZnVuY3Rpb24nID8gcHJldlN0ZXAoKSA6IF90aGlzLnByZXZTdGVwKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBpc09wZW46IGZhbHNlLFxuICAgICAgY3VycmVudDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwLFxuICAgICAgdzogMCxcbiAgICAgIGg6IDAsXG4gICAgICBpbkRPTTogZmFsc2UsXG4gICAgICBvYnNlcnZlcjogbnVsbCxcbiAgICAgIGZvY3VzVW5sb2NrZWQ6IGZhbHNlXG4gICAgfTtcbiAgICBfdGhpcy5oZWxwZXIgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMuaGVscGVyRWxlbWVudCA9IG51bGw7XG4gICAgX3RoaXMuZGVib3VuY2VkU2hvd1N0ZXAgPSBkZWJvdW5jZShfdGhpcy5zaG93U3RlcCwgNzApO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBfaW5oZXJpdHMoVG91ciwgX0NvbXBvbmVudCk7XG4gIHJldHVybiBfY3JlYXRlQ2xhc3MoVG91ciwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgaXNPcGVuID0gX3RoaXMkcHJvcHM2LmlzT3BlbixcbiAgICAgICAgc3RhcnRBdCA9IF90aGlzJHByb3BzNi5zdGFydEF0O1xuICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICB0aGlzLm9wZW4oc3RhcnRBdCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgdmFyIF90aGlzJHByb3BzNyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGlzT3BlbiA9IF90aGlzJHByb3BzNy5pc09wZW4sXG4gICAgICAgIHVwZGF0ZSA9IF90aGlzJHByb3BzNy51cGRhdGUsXG4gICAgICAgIHVwZGF0ZURlbGF5ID0gX3RoaXMkcHJvcHM3LnVwZGF0ZURlbGF5O1xuICAgICAgaWYgKCFpc09wZW4gJiYgbmV4dFByb3BzLmlzT3Blbikge1xuICAgICAgICB0aGlzLm9wZW4obmV4dFByb3BzLnN0YXJ0QXQpO1xuICAgICAgfSBlbHNlIGlmIChpc09wZW4gJiYgIW5leHRQcm9wcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT3BlbiAmJiB1cGRhdGUgIT09IG5leHRQcm9wcy51cGRhdGUpIHtcbiAgICAgICAgaWYgKG5leHRQcm9wcy5zdGVwc1t0aGlzLnN0YXRlLmN1cnJlbnRdKSB7XG4gICAgICAgICAgc2V0VGltZW91dCh0aGlzLnNob3dTdGVwLCB1cGRhdGVEZWxheSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vblJlcXVlc3RDbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNPcGVuICYmIG5leHRQcm9wcy5pc09wZW4gJiYgdGhpcy5zdGF0ZS5jdXJyZW50ICE9PSBuZXh0UHJvcHMuZ29Ub1N0ZXApIHtcbiAgICAgICAgdGhpcy5nb3RvU3RlcChuZXh0UHJvcHMuZ29Ub1N0ZXApO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHZhciBpc09wZW4gPSB0aGlzLnByb3BzLmlzT3BlbjtcbiAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhdGUub2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9wZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb3BlbihzdGFydEF0KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBvbkFmdGVyT3BlbiA9IHRoaXMucHJvcHMub25BZnRlck9wZW47XG4gICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc09wZW46IHRydWUsXG4gICAgICAgICAgY3VycmVudDogc3RhcnRBdCAhPT0gdW5kZWZpbmVkID8gc3RhcnRBdCA6IHByZXZTdGF0ZS5jdXJyZW50XG4gICAgICAgIH07XG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoX3RoaXMyLnNob3dTdGVwLCAxKTtcbiAgICAgICAgX3RoaXMyLmhlbHBlckVsZW1lbnQgPSBfdGhpczIuaGVscGVyLmN1cnJlbnQ7XG4gICAgICAgIGlmICghX3RoaXMyLnByb3BzLmRpc2FibGVGb2N1c0xvY2spIF90aGlzMi5oZWxwZXIuY3VycmVudC5mb2N1cygpO1xuICAgICAgICBpZiAob25BZnRlck9wZW4pIHtcbiAgICAgICAgICBvbkFmdGVyT3BlbihfdGhpczIuaGVscGVyRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuZGVib3VuY2VkU2hvd1N0ZXAsIGZhbHNlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlEb3duSGFuZGxlciwgZmFsc2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbG9zZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICBpZiAocHJldlN0YXRlLm9ic2VydmVyKSB7XG4gICAgICAgICAgcHJldlN0YXRlLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzT3BlbjogZmFsc2UsXG4gICAgICAgICAgb2JzZXJ2ZXI6IG51bGxcbiAgICAgICAgfTtcbiAgICAgIH0sIHRoaXMub25CZWZvcmVDbG9zZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5kZWJvdW5jZWRTaG93U3RlcCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5RG93bkhhbmRsZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbkJlZm9yZUNsb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uQmVmb3JlQ2xvc2UoKSB7XG4gICAgICB2YXIgb25CZWZvcmVDbG9zZSA9IHRoaXMucHJvcHMub25CZWZvcmVDbG9zZTtcbiAgICAgIGlmIChvbkJlZm9yZUNsb3NlKSB7XG4gICAgICAgIG9uQmVmb3JlQ2xvc2UodGhpcy5oZWxwZXJFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuICAgICAgdmFyIF90aGlzJHByb3BzOCA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzOC5jbGFzc05hbWUsXG4gICAgICAgIHN0ZXBzID0gX3RoaXMkcHJvcHM4LnN0ZXBzLFxuICAgICAgICBtYXNrQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHM4Lm1hc2tDbGFzc05hbWUsXG4gICAgICAgIHNob3dCdXR0b25zID0gX3RoaXMkcHJvcHM4LnNob3dCdXR0b25zLFxuICAgICAgICBzaG93Q2xvc2VCdXR0b24gPSBfdGhpcyRwcm9wczguc2hvd0Nsb3NlQnV0dG9uLFxuICAgICAgICBjbG9zZUJ1dHRvbkFyaWFMYWJlbCA9IF90aGlzJHByb3BzOC5jbG9zZUJ1dHRvbkFyaWFMYWJlbCxcbiAgICAgICAgc2hvd05hdmlnYXRpb24gPSBfdGhpcyRwcm9wczguc2hvd05hdmlnYXRpb24sXG4gICAgICAgIHNob3dOYXZpZ2F0aW9uTnVtYmVyID0gX3RoaXMkcHJvcHM4LnNob3dOYXZpZ2F0aW9uTnVtYmVyLFxuICAgICAgICBzaG93TnVtYmVyID0gX3RoaXMkcHJvcHM4LnNob3dOdW1iZXIsXG4gICAgICAgIG9uUmVxdWVzdENsb3NlID0gX3RoaXMkcHJvcHM4Lm9uUmVxdWVzdENsb3NlLFxuICAgICAgICBtYXNrU3BhY2UgPSBfdGhpcyRwcm9wczgubWFza1NwYWNlLFxuICAgICAgICBsYXN0U3RlcE5leHRCdXR0b24gPSBfdGhpcyRwcm9wczgubGFzdFN0ZXBOZXh0QnV0dG9uLFxuICAgICAgICBuZXh0QnV0dG9uID0gX3RoaXMkcHJvcHM4Lm5leHRCdXR0b24sXG4gICAgICAgIHByZXZCdXR0b24gPSBfdGhpcyRwcm9wczgucHJldkJ1dHRvbixcbiAgICAgICAgYmFkZ2VDb250ZW50ID0gX3RoaXMkcHJvcHM4LmJhZGdlQ29udGVudCxcbiAgICAgICAgaGlnaGxpZ2h0ZWRNYXNrQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHM4LmhpZ2hsaWdodGVkTWFza0NsYXNzTmFtZSxcbiAgICAgICAgZGlzYWJsZUludGVyYWN0aW9uID0gX3RoaXMkcHJvcHM4LmRpc2FibGVJbnRlcmFjdGlvbixcbiAgICAgICAgZGlzYWJsZURvdHNOYXZpZ2F0aW9uID0gX3RoaXMkcHJvcHM4LmRpc2FibGVEb3RzTmF2aWdhdGlvbixcbiAgICAgICAgbmV4dFN0ZXAgPSBfdGhpcyRwcm9wczgubmV4dFN0ZXAsXG4gICAgICAgIHByZXZTdGVwID0gX3RoaXMkcHJvcHM4LnByZXZTdGVwLFxuICAgICAgICByb3VuZGVkID0gX3RoaXMkcHJvcHM4LnJvdW5kZWQsXG4gICAgICAgIGFjY2VudENvbG9yID0gX3RoaXMkcHJvcHM4LmFjY2VudENvbG9yLFxuICAgICAgICBDdXN0b21IZWxwZXIgPSBfdGhpcyRwcm9wczguQ3VzdG9tSGVscGVyLFxuICAgICAgICBkaXNhYmxlRm9jdXNMb2NrID0gX3RoaXMkcHJvcHM4LmRpc2FibGVGb2N1c0xvY2ssXG4gICAgICAgIGhpZ2hsaWdodGVkQm9yZGVyID0gX3RoaXMkcHJvcHM4LmhpZ2hsaWdodGVkQm9yZGVyO1xuICAgICAgdmFyIF90aGlzJHN0YXRlMiA9IHRoaXMuc3RhdGUsXG4gICAgICAgIGlzT3BlbiA9IF90aGlzJHN0YXRlMi5pc09wZW4sXG4gICAgICAgIGN1cnJlbnQgPSBfdGhpcyRzdGF0ZTIuY3VycmVudCxcbiAgICAgICAgaW5ET00gPSBfdGhpcyRzdGF0ZTIuaW5ET00sXG4gICAgICAgIHRhcmdldFRvcCA9IF90aGlzJHN0YXRlMi50b3AsXG4gICAgICAgIHRhcmdldFJpZ2h0ID0gX3RoaXMkc3RhdGUyLnJpZ2h0LFxuICAgICAgICB0YXJnZXRCb3R0b20gPSBfdGhpcyRzdGF0ZTIuYm90dG9tLFxuICAgICAgICB0YXJnZXRMZWZ0ID0gX3RoaXMkc3RhdGUyLmxlZnQsXG4gICAgICAgIHRhcmdldFdpZHRoID0gX3RoaXMkc3RhdGUyLndpZHRoLFxuICAgICAgICB0YXJnZXRIZWlnaHQgPSBfdGhpcyRzdGF0ZTIuaGVpZ2h0LFxuICAgICAgICB3aW5kb3dXaWR0aCA9IF90aGlzJHN0YXRlMi53LFxuICAgICAgICB3aW5kb3dIZWlnaHQgPSBfdGhpcyRzdGF0ZTIuaCxcbiAgICAgICAgaGVscGVyV2lkdGggPSBfdGhpcyRzdGF0ZTIuaGVscGVyV2lkdGgsXG4gICAgICAgIGhlbHBlckhlaWdodCA9IF90aGlzJHN0YXRlMi5oZWxwZXJIZWlnaHQsXG4gICAgICAgIGhlbHBlclBvc2l0aW9uID0gX3RoaXMkc3RhdGUyLmhlbHBlclBvc2l0aW9uO1xuICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9ydGFsLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChHbG9iYWxTdHlsZSwgbnVsbCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0b3VyUmVzaXplT2JzZXJ2ZXIsIHtcbiAgICAgICAgICBzdGVwOiBzdGVwc1tjdXJyZW50XSxcbiAgICAgICAgICByZWZyZXNoOiBmdW5jdGlvbiByZWZyZXNoKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5yZWNhbGN1bGF0ZU5vZGUoc3RlcHNbY3VycmVudF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0b3VyTXV0YXRpb25PYnNlcnZlciwge1xuICAgICAgICAgIHN0ZXA6IHN0ZXBzW2N1cnJlbnRdLFxuICAgICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLnJlY2FsY3VsYXRlTm9kZShzdGVwc1tjdXJyZW50XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3ZnTWFzaywge1xuICAgICAgICAgIG9uQ2xpY2s6IHRoaXMubWFza0NsaWNrSGFuZGxlcixcbiAgICAgICAgICBmb3J3YXJkUmVmOiBmdW5jdGlvbiBmb3J3YXJkUmVmKGMpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMubWFzayA9IGM7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB3aW5kb3dXaWR0aDogd2luZG93V2lkdGgsXG4gICAgICAgICAgd2luZG93SGVpZ2h0OiB3aW5kb3dIZWlnaHQsXG4gICAgICAgICAgdGFyZ2V0V2lkdGg6IHRhcmdldFdpZHRoLFxuICAgICAgICAgIHRhcmdldEhlaWdodDogdGFyZ2V0SGVpZ2h0LFxuICAgICAgICAgIHRhcmdldFRvcDogdGFyZ2V0VG9wLFxuICAgICAgICAgIHRhcmdldExlZnQ6IHRhcmdldExlZnQsXG4gICAgICAgICAgcGFkZGluZzogbWFza1NwYWNlLFxuICAgICAgICAgIHJvdW5kZWQ6IHJvdW5kZWQsXG4gICAgICAgICAgcm91bmRlZFN0ZXA6IHN0ZXBzW2N1cnJlbnRdLnJvdW5kZWRTdGVwLFxuICAgICAgICAgIGNsYXNzTmFtZTogbWFza0NsYXNzTmFtZSxcbiAgICAgICAgICBkaXNhYmxlSW50ZXJhY3Rpb246IHN0ZXBzW2N1cnJlbnRdLnN0ZXBJbnRlcmFjdGlvbiA9PT0gZmFsc2UgfHwgZGlzYWJsZUludGVyYWN0aW9uID8gIXN0ZXBzW2N1cnJlbnRdLnN0ZXBJbnRlcmFjdGlvbiA6IGRpc2FibGVJbnRlcmFjdGlvbixcbiAgICAgICAgICBkaXNhYmxlSW50ZXJhY3Rpb25DbGFzc05hbWU6IFwiXCIuY29uY2F0KENOLm1hc2suZGlzYWJsZUludGVyYWN0aW9uLCBcIiBcIikuY29uY2F0KGhpZ2hsaWdodGVkTWFza0NsYXNzTmFtZSksXG4gICAgICAgICAgaGlnaGxpZ2h0ZWRCb3JkZXI6IGhpZ2hsaWdodGVkQm9yZGVyXG4gICAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb2N1c0xvY2ssIHtcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZUZvY3VzTG9jayxcbiAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlXG4gICAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEd1aWRlLCB7XG4gICAgICAgICAgcmVmOiB0aGlzLmhlbHBlcixcbiAgICAgICAgICB0YXJnZXRIZWlnaHQ6IHRhcmdldEhlaWdodCxcbiAgICAgICAgICB0YXJnZXRXaWR0aDogdGFyZ2V0V2lkdGgsXG4gICAgICAgICAgdGFyZ2V0VG9wOiB0YXJnZXRUb3AsXG4gICAgICAgICAgdGFyZ2V0UmlnaHQ6IHRhcmdldFJpZ2h0LFxuICAgICAgICAgIHRhcmdldEJvdHRvbTogdGFyZ2V0Qm90dG9tLFxuICAgICAgICAgIHRhcmdldExlZnQ6IHRhcmdldExlZnQsXG4gICAgICAgICAgd2luZG93V2lkdGg6IHdpbmRvd1dpZHRoLFxuICAgICAgICAgIHdpbmRvd0hlaWdodDogd2luZG93SGVpZ2h0LFxuICAgICAgICAgIGhlbHBlcldpZHRoOiBoZWxwZXJXaWR0aCxcbiAgICAgICAgICBoZWxwZXJIZWlnaHQ6IGhlbHBlckhlaWdodCxcbiAgICAgICAgICBoZWxwZXJQb3NpdGlvbjogaGVscGVyUG9zaXRpb24sXG4gICAgICAgICAgcGFkZGluZzogbWFza1NwYWNlLFxuICAgICAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgICAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgICAgICAgIHN0eWxlOiBzdGVwc1tjdXJyZW50XS5zdHlsZSA/IHN0ZXBzW2N1cnJlbnRdLnN0eWxlIDoge30sXG4gICAgICAgICAgcm91bmRlZDogcm91bmRlZCxcbiAgICAgICAgICBjbGFzc05hbWU6IGNuKENOLmhlbHBlci5iYXNlLCBjbGFzc05hbWUsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgQ04uaGVscGVyLmlzT3BlbiwgaXNPcGVuKSksXG4gICAgICAgICAgYWNjZW50Q29sb3I6IGFjY2VudENvbG9yLFxuICAgICAgICAgIGRlZmF1bHRTdHlsZXM6ICFDdXN0b21IZWxwZXIsXG4gICAgICAgICAgcm9sZTogXCJkaWFsb2dcIlxuICAgICAgICB9LCBDdXN0b21IZWxwZXIgPyAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDdXN0b21IZWxwZXIsIHtcbiAgICAgICAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgICAgICAgIHRvdGFsU3RlcHM6IHN0ZXBzLmxlbmd0aCxcbiAgICAgICAgICBnb3RvU3RlcDogdGhpcy5nb3RvU3RlcCxcbiAgICAgICAgICBjbG9zZTogb25SZXF1ZXN0Q2xvc2UsXG4gICAgICAgICAgY29udGVudDogc3RlcHNbY3VycmVudF0gJiYgKHR5cGVvZiBzdGVwc1tjdXJyZW50XS5jb250ZW50ID09PSAnZnVuY3Rpb24nID8gc3RlcHNbY3VycmVudF0uY29udGVudCh7XG4gICAgICAgICAgICBjbG9zZTogb25SZXF1ZXN0Q2xvc2UsXG4gICAgICAgICAgICBnb1RvOiB0aGlzLmdvdG9TdGVwLFxuICAgICAgICAgICAgaW5ET006IGluRE9NLFxuICAgICAgICAgICAgc3RlcDogY3VycmVudCArIDFcbiAgICAgICAgICB9KSA6IHN0ZXBzW2N1cnJlbnRdLmNvbnRlbnQpXG4gICAgICAgIH0sIHRoaXMucHJvcHMuY2hpbGRyZW4pIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIHRoaXMucHJvcHMuY2hpbGRyZW4sIHN0ZXBzW2N1cnJlbnRdICYmICh0eXBlb2Ygc3RlcHNbY3VycmVudF0uY29udGVudCA9PT0gJ2Z1bmN0aW9uJyA/IHN0ZXBzW2N1cnJlbnRdLmNvbnRlbnQoe1xuICAgICAgICAgIGNsb3NlOiBvblJlcXVlc3RDbG9zZSxcbiAgICAgICAgICBnb1RvOiB0aGlzLmdvdG9TdGVwLFxuICAgICAgICAgIGluRE9NOiBpbkRPTSxcbiAgICAgICAgICBzdGVwOiBjdXJyZW50ICsgMVxuICAgICAgICB9KSA6IHN0ZXBzW2N1cnJlbnRdLmNvbnRlbnQpLCBzaG93TnVtYmVyICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhZGdlLCB7XG4gICAgICAgICAgXCJkYXRhLXRvdXItZWxlbVwiOiBcImJhZGdlXCIsXG4gICAgICAgICAgYWNjZW50Q29sb3I6IGFjY2VudENvbG9yXG4gICAgICAgIH0sIHR5cGVvZiBiYWRnZUNvbnRlbnQgPT09ICdmdW5jdGlvbicgPyBiYWRnZUNvbnRlbnQoY3VycmVudCArIDEsIHN0ZXBzLmxlbmd0aCkgOiBjdXJyZW50ICsgMSksIChzaG93QnV0dG9ucyB8fCBzaG93TmF2aWdhdGlvbikgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udHJvbHMsIHtcbiAgICAgICAgICBcImRhdGEtdG91ci1lbGVtXCI6IFwiY29udHJvbHNcIlxuICAgICAgICB9LCBzaG93QnV0dG9ucyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBcnJvdyQxLCB7XG4gICAgICAgICAgb25DbGljazogdHlwZW9mIHByZXZTdGVwID09PSAnZnVuY3Rpb24nID8gcHJldlN0ZXAgOiB0aGlzLnByZXZTdGVwLFxuICAgICAgICAgIGRpc2FibGVkOiBjdXJyZW50ID09PSAwLFxuICAgICAgICAgIGxhYmVsOiBwcmV2QnV0dG9uID8gcHJldkJ1dHRvbiA6IG51bGxcbiAgICAgICAgfSksIHNob3dOYXZpZ2F0aW9uICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE5hdmlnYXRpb24sIHtcbiAgICAgICAgICBcImRhdGEtdG91ci1lbGVtXCI6IFwibmF2aWdhdGlvblwiXG4gICAgICAgIH0sIHN0ZXBzLm1hcChmdW5jdGlvbiAocywgaSkge1xuICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEb3QsIHtcbiAgICAgICAgICAgIGtleTogXCJcIi5jb25jYXQocy5zZWxlY3RvciA/IHMuc2VsZWN0b3IgOiAndW5kZWYnLCBcIl9cIikuY29uY2F0KGkpLFxuICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5nb3RvU3RlcChpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjdXJyZW50OiBjdXJyZW50LFxuICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICBhY2NlbnRDb2xvcjogYWNjZW50Q29sb3IsXG4gICAgICAgICAgICBkaXNhYmxlZDogY3VycmVudCA9PT0gaSB8fCBkaXNhYmxlRG90c05hdmlnYXRpb24sXG4gICAgICAgICAgICBzaG93TnVtYmVyOiBzaG93TmF2aWdhdGlvbk51bWJlcixcbiAgICAgICAgICAgIFwiZGF0YS10b3VyLWVsZW1cIjogXCJkb3RcIixcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY24oQ04uZG90LmJhc2UsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgQ04uZG90LmFjdGl2ZSwgY3VycmVudCA9PT0gaSkpLFxuICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IHMubmF2RG90QXJpYUxhYmVsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKSwgc2hvd0J1dHRvbnMgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQXJyb3ckMSwge1xuICAgICAgICAgIG9uQ2xpY2s6IGN1cnJlbnQgPT09IHN0ZXBzLmxlbmd0aCAtIDEgPyBsYXN0U3RlcE5leHRCdXR0b24gPyBvblJlcXVlc3RDbG9zZSA6IGZ1bmN0aW9uICgpIHt9IDogdHlwZW9mIG5leHRTdGVwID09PSAnZnVuY3Rpb24nID8gbmV4dFN0ZXAgOiB0aGlzLm5leHRTdGVwLFxuICAgICAgICAgIGRpc2FibGVkOiAhbGFzdFN0ZXBOZXh0QnV0dG9uICYmIGN1cnJlbnQgPT09IHN0ZXBzLmxlbmd0aCAtIDEsXG4gICAgICAgICAgaW52ZXJ0ZWQ6IHRydWUsXG4gICAgICAgICAgbGFiZWw6IGxhc3RTdGVwTmV4dEJ1dHRvbiAmJiBjdXJyZW50ID09PSBzdGVwcy5sZW5ndGggLSAxID8gbGFzdFN0ZXBOZXh0QnV0dG9uIDogbmV4dEJ1dHRvbiA/IG5leHRCdXR0b24gOiBudWxsXG4gICAgICAgIH0pKSwgc2hvd0Nsb3NlQnV0dG9uICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFN0eWxlZENsb3NlLCB7XG4gICAgICAgICAgb25DbGljazogb25SZXF1ZXN0Q2xvc2UsXG4gICAgICAgICAgY2xhc3NOYW1lOiBcInJlYWN0b3VyX19jbG9zZVwiLFxuICAgICAgICAgIGFyaWFMYWJlbDogY2xvc2VCdXR0b25BcmlhTGFiZWxcbiAgICAgICAgfSkpKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG59KENvbXBvbmVudCk7XG52YXIgc2V0Tm9kZVN0YXRlID0gZnVuY3Rpb24gc2V0Tm9kZVN0YXRlKG5vZGUsIHN0ZXAsIGhlbHBlcikge1xuICBpZiAoIWhlbHBlcikgcmV0dXJuO1xuICB2YXIgdyA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gIHZhciBoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuICB2YXIgX2h4JGdldE5vZGVSZWN0ID0gZ2V0Tm9kZVJlY3QoaGVscGVyKSxcbiAgICBoZWxwZXJXaWR0aCA9IF9oeCRnZXROb2RlUmVjdC53aWR0aCxcbiAgICBoZWxwZXJIZWlnaHQgPSBfaHgkZ2V0Tm9kZVJlY3QuaGVpZ2h0O1xuICB2YXIgYXR0cnMgPSB7XG4gICAgdG9wOiBoICsgMTAsXG4gICAgcmlnaHQ6IHcgLyAyICsgOSxcbiAgICBib3R0b206IGggLyAyICsgOSxcbiAgICBsZWZ0OiB3IC8gMiAtIGhlbHBlcldpZHRoIC8gMixcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDAsXG4gICAgdzogdyxcbiAgICBoOiBoLFxuICAgIGhlbHBlclBvc2l0aW9uOiAnY2VudGVyJ1xuICB9O1xuICBpZiAobm9kZSkge1xuICAgIGF0dHJzID0gZ2V0SGlnaGxpZ2h0ZWRSZWN0KG5vZGUsIHN0ZXApO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgcmV0dXJuIF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHtcbiAgICAgIHc6IHcsXG4gICAgICBoOiBoLFxuICAgICAgaGVscGVyV2lkdGg6IGhlbHBlcldpZHRoLFxuICAgICAgaGVscGVySGVpZ2h0OiBoZWxwZXJIZWlnaHQsXG4gICAgICBoZWxwZXJQb3NpdGlvbjogc3RlcC5wb3NpdGlvblxuICAgIH0sIGF0dHJzKSwge30sIHtcbiAgICAgIGluRE9NOiBub2RlID8gdHJ1ZSA6IGZhbHNlXG4gICAgfSk7XG4gIH07XG59O1xuVG91ci5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Ub3VyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0IGRlZmF1bHQgVG91cjtcbmV4cG9ydCB7IEFycm93JDEgYXMgQXJyb3csIEJhZGdlLCBTdHlsZWRDbG9zZSBhcyBDbG9zZSwgQ29udHJvbHMsIERvdCwgTmF2aWdhdGlvbiB9O1xuIiwiLyohXG4gIENvcHlyaWdodCAoYykgMjAxOCBKZWQgV2F0c29uLlxuICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKE1JVCksIHNlZVxuICBodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzXG4qL1xuLyogZ2xvYmFsIGRlZmluZSAqL1xuXG4oZnVuY3Rpb24gKCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dmFyIGhhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5cdGZ1bmN0aW9uIGNsYXNzTmFtZXMoKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0aWYgKCFhcmcpIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG5cblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJyB8fCBhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnKTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0XHRcdGlmIChhcmcubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dmFyIGlubmVyID0gY2xhc3NOYW1lcy5hcHBseShudWxsLCBhcmcpO1xuXHRcdFx0XHRcdGlmIChpbm5lcikge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGlubmVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYXJnVHlwZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0aWYgKGFyZy50b1N0cmluZyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykge1xuXHRcdFx0XHRcdGZvciAodmFyIGtleSBpbiBhcmcpIHtcblx0XHRcdFx0XHRcdGlmIChoYXNPd24uY2FsbChhcmcsIGtleSkgJiYgYXJnW2tleV0pIHtcblx0XHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNsYXNzZXMucHVzaChhcmcudG9TdHJpbmcoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG5cdH1cblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRjbGFzc05hbWVzLmRlZmF1bHQgPSBjbGFzc05hbWVzO1xuXHRcdG1vZHVsZS5leHBvcnRzID0gY2xhc3NOYW1lcztcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gcmVnaXN0ZXIgYXMgJ2NsYXNzbmFtZXMnLCBjb25zaXN0ZW50IHdpdGggbnBtIHBhY2thZ2UgbmFtZVxuXHRcdGRlZmluZSgnY2xhc3NuYW1lcycsIFtdLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gY2xhc3NOYW1lcztcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR3aW5kb3cuY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXM7XG5cdH1cbn0oKSk7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG4gIHZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfTtcbn1cblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/RnVuY3Rpb259IGdldFN0YWNrIFJldHVybnMgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZ2V0U3RhY2spIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoXG4gICAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArXG4gICAgICAgICAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciAmJiAhKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJyArXG4gICAgICAgICAgICBsb2NhdGlvbiArICcgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICcgKyB0eXBlb2YgZXJyb3IgKyAnLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgKHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldHMgd2FybmluZyBjYWNoZSB3aGVuIHRlc3RpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUHJvcFR5cGVzO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgY2hlY2tQcm9wVHlwZXMgPSByZXF1aXJlKCcuL2NoZWNrUHJvcFR5cGVzJyk7XG5cbnZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gIC8qIGdsb2JhbCBTeW1ib2wgKi9cbiAgdmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xuICB2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICAgKlxuICAgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAgICpcbiAgICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAgICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAgICogICAgICAgLi4uXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlXG4gICAqIHN1cHBsaWVkIHRvIFJlYWN0IGNvbXBvbmVudHMuIEV4YW1wbGUgdXNhZ2U6XG4gICAqXG4gICAqICAgdmFyIFByb3BzID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTtcbiAgICogICB2YXIgTXlBcnRpY2xlID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBwcm9wIG5hbWVkIFwiZGVzY3JpcHRpb25cIi5cbiAgICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZyxcbiAgICpcbiAgICogICAgICAgLy8gQSByZXF1aXJlZCBlbnVtIHByb3AgbmFtZWQgXCJjYXRlZ29yeVwiLlxuICAgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9zJ10pLmlzUmVxdWlyZWQsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCBcImRpYWxvZ1wiIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLlxuICAgKiAgICAgICBkaWFsb2c6IFByb3BzLmluc3RhbmNlT2YoRGlhbG9nKS5pc1JlcXVpcmVkXG4gICAqICAgICB9LFxuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogQSBtb3JlIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOlxuICAgKlxuICAgKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAgICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJlZCk/XG4gICAqXG4gICAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAgICogYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIFVSSSBwcm9wIG5hbWVkIFwiaHJlZlwiLlxuICAgKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgKiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICAgKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICAgKiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgKiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFtZSArICcgaW4gJyArXG4gICAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgKiAgICAgICAgICApO1xuICAgKiAgICAgICAgfVxuICAgKiAgICAgIH1cbiAgICogICAgfSxcbiAgICogICAgcmVuZGVyOiBmdW5jdGlvbigpIHsuLi59XG4gICAqICB9KTtcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIHZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksXG4gICAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgICBmdW5jOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignZnVuY3Rpb24nKSxcbiAgICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdudW1iZXInKSxcbiAgICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgICBzdHJpbmc6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzdHJpbmcnKSxcbiAgICBzeW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSxcblxuICAgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSxcbiAgICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gICAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksXG4gICAgZWxlbWVudFR5cGU6IGNyZWF0ZUVsZW1lbnRUeXBlVHlwZUNoZWNrZXIoKSxcbiAgICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICAgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksXG4gICAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsXG4gICAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsXG4gICAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIsXG4gICAgZXhhY3Q6IGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gICAqL1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSovXG4gIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gICAgfVxuICB9XG4gIC8qZXNsaW50LWVuYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuXG4gIC8qKlxuICAgKiBXZSB1c2UgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgcGVvcGxlIG1heSBjYWxsXG4gICAqIFByb3BUeXBlcyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIsIHdlIGRvbid0IHVzZSByZWFsXG4gICAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFueXdheSwgYW5kIGNyZWF0aW5nIHRoZW1cbiAgICogaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdFxuICAgKiBoYXBwZW5zIGluIG9uZU9mVHlwZSgpIGZvciBhbnkgdHlwZSBiZWZvcmUgdGhlIG9uZSB0aGF0IG1hdGNoZWQuXG4gICAqL1xuICBmdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAnJztcbiAgfVxuICAvLyBNYWtlIGBpbnN0YW5jZW9mIEVycm9yYCBzdGlsbCB3b3JrIGZvciByZXR1cm5lZCBlcnJvcnMuXG4gIFByb3BUeXBlRXJyb3IucHJvdG90eXBlID0gRXJyb3IucHJvdG90eXBlO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZSA9IHt9O1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50ID0gMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICBjb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICBwcm9wRnVsbE5hbWUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICAgIGlmIChzZWNyZXQgIT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAgIGlmICh0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gICAgICAgICAgLy8gTmV3IGJlaGF2aW9yIG9ubHkgZm9yIHVzZXJzIG9mIGBwcm9wLXR5cGVzYCBwYWNrYWdlXG4gICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICdVc2UgYFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpYCB0byBjYWxsIHRoZW0uICcgK1xuICAgICAgICAgICAgJ1JlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAvLyBPbGQgYmVoYXZpb3IgZm9yIHBlb3BsZSB1c2luZyBSZWFjdC5Qcm9wVHlwZXNcbiAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBjb21wb25lbnROYW1lICsgJzonICsgcHJvcE5hbWU7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIW1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSAmJlxuICAgICAgICAgICAgLy8gQXZvaWQgc3BhbW1pbmcgdGhlIGNvbnNvbGUgYmVjYXVzZSB0aGV5IGFyZSBvZnRlbiBub3QgYWN0aW9uYWJsZSBleGNlcHQgZm9yIGxpYiBhdXRob3JzXG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA8IDNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICAgJ1lvdSBhcmUgbWFudWFsbHkgY2FsbGluZyBhIFJlYWN0LlByb3BUeXBlcyB2YWxpZGF0aW9uICcgK1xuICAgICAgICAgICAgICAnZnVuY3Rpb24gZm9yIHRoZSBgJyArIHByb3BGdWxsTmFtZSArICdgIHByb3Agb24gYCcgKyBjb21wb25lbnROYW1lICArICdgLiBUaGlzIGlzIGRlcHJlY2F0ZWQgJyArXG4gICAgICAgICAgICAgICdhbmQgd2lsbCB0aHJvdyBpbiB0aGUgc3RhbmRhbG9uZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAgICdZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIGEgdGhpcmQtcGFydHkgUHJvcFR5cGVzICcgK1xuICAgICAgICAgICAgICAnbGlicmFyeS4gU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1kb250LWNhbGwtcHJvcHR5cGVzICcgKyAnZm9yIGRldGFpbHMuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSA9IHRydWU7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAnICsgKCdpbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgbnVsbGAuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICAgIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRydWUpO1xuXG4gICAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICAvLyBgcHJvcFZhbHVlYCBiZWluZyBpbnN0YW5jZSBvZiwgc2F5LCBkYXRlL3JlZ2V4cCwgcGFzcyB0aGUgJ29iamVjdCdcbiAgICAgICAgLy8gY2hlY2ssIGJ1dCB3ZSBjYW4gb2ZmZXIgYSBtb3JlIHByZWNpc2UgZXJyb3IgbWVzc2FnZSBoZXJlIHJhdGhlciB0aGFuXG4gICAgICAgIC8vICdvZiB0eXBlIGBvYmplY3RgJy5cbiAgICAgICAgdmFyIHByZWNpc2VUeXBlID0gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcmVjaXNlVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnYCcgKyBleHBlY3RlZFR5cGUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGFycmF5LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwgaSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICdbJyArIGkgKyAnXScsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghUmVhY3RJcy5pc1ZhbGlkRWxlbWVudFR5cGUocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQgdHlwZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gYXJyYXksIGdvdCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLiAnICtcbiAgICAgICAgICAgICdBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHdyaXRlIG9uZU9mKHgsIHksIHopIGluc3RlYWQgb2Ygb25lT2YoW3gsIHksIHpdKS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpcyhwcm9wVmFsdWUsIGV4cGVjdGVkVmFsdWVzW2ldKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZFZhbHVlcywgZnVuY3Rpb24gcmVwbGFjZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgU3RyaW5nKHByb3BWYWx1ZSkgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgICAgaWYgKGhhcyhwcm9wVmFsdWUsIGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZS4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgY2hlY2sgZnVuY3Rpb25zLCBidXQgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkICcgKyBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcoY2hlY2tlcikgKyAnIGF0IGluZGV4ICcgKyBpICsgJy4nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgICAgaWYgKGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCkgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIWlzTm9kZShwcm9wc1twcm9wTmFtZV0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWxsIGtleXMgaW4gY2FzZSBzb21lIGFyZSByZXF1aXJlZCBidXQgbWlzc2luZyBmcm9tXG4gICAgICAvLyBwcm9wcy5cbiAgICAgIHZhciBhbGxLZXlzID0gYXNzaWduKHt9LCBwcm9wc1twcm9wTmFtZV0sIHNoYXBlVHlwZXMpO1xuICAgICAgZm9yICh2YXIga2V5IGluIGFsbEtleXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBrZXkgYCcgKyBrZXkgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nICtcbiAgICAgICAgICAgICdcXG5CYWQgb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkocHJvcHNbcHJvcE5hbWVdLCBudWxsLCAnICAnKSArXG4gICAgICAgICAgICAnXFxuVmFsaWQga2V5czogJyArICBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzaGFwZVR5cGVzKSwgbnVsbCwgJyAgJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZW9mIHByb3BWYWx1ZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gIXByb3BWYWx1ZTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFZhbHVlLmV2ZXJ5KGlzTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4ocHJvcFZhbHVlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gICAgLy8gTmF0aXZlIFN5bWJvbC5cbiAgICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBmYWxzeSB2YWx1ZSBjYW4ndCBiZSBhIFN5bWJvbFxuICAgIGlmICghcHJvcFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSA9PT0gJ1N5bWJvbCdcbiAgICBpZiAocHJvcFZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNwZWMgY29tcGxpYW50IFN5bWJvbHMgd2hpY2ggYXJlIHBvbHlmaWxsZWQuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuXG4gIGZ1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSkge1xuICAgIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdhcnJheSc7XG4gICAgfVxuICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIE9sZCB3ZWJraXRzIChhdCBsZWFzdCB1bnRpbCBBbmRyb2lkIDQuMCkgcmV0dXJuICdmdW5jdGlvbicgcmF0aGVyIHRoYW5cbiAgICAgIC8vICdvYmplY3QnIGZvciB0eXBlb2YgYSBSZWdFeHAuIFdlJ2xsIG5vcm1hbGl6ZSB0aGlzIGhlcmUgc28gdGhhdCAvYmxhL1xuICAgICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmplY3QuXG4gICAgICByZXR1cm4gJ29iamVjdCc7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBUaGlzIGhhbmRsZXMgbW9yZSB0eXBlcyB0aGFuIGBnZXRQcm9wVHlwZWAuIE9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gIC8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXJgLlxuICBmdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJycgKyBwcm9wVmFsdWU7XG4gICAgfVxuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuICdkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiAncmVnZXhwJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHBvc3RmaXhlZCB0byBhIHdhcm5pbmcgYWJvdXQgYW4gaW52YWxpZCB0eXBlLlxuICAvLyBGb3IgZXhhbXBsZSwgXCJ1bmRlZmluZWRcIiBvciBcIm9mIHR5cGUgYXJyYXlcIlxuICBmdW5jdGlvbiBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcodmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHJldHVybiAnYW4gJyArIHR5cGU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgY2FzZSAncmVnZXhwJzpcbiAgICAgICAgcmV0dXJuICdhICcgKyB0eXBlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QsIGlmIGFueS5cbiAgZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKHByb3BWYWx1ZSkge1xuICAgIGlmICghcHJvcFZhbHVlLmNvbnN0cnVjdG9yIHx8ICFwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSkge1xuICAgICAgcmV0dXJuIEFOT05ZTU9VUztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbiAgUmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMgPSBjaGVja1Byb3BUeXBlcztcbiAgUmVhY3RQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBjaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZTtcbiAgUmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzID0gUmVhY3RQcm9wVHlwZXM7XG5cbiAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IGRldmVsb3BtZW50IGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gdHJ1ZTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoUmVhY3RJcy5pc0VsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufSBlbHNlIHtcbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zJykoKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIGhhc1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKSA6IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKSA6IDB4ZWFjYjtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKSA6IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKSA6IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKSA6IDB4ZWFjZDtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0JykgOiAweGVhY2U7IC8vIFRPRE86IFdlIGRvbid0IHVzZSBBc3luY01vZGUgb3IgQ29uY3VycmVudE1vZGUgYW55bW9yZS4gVGhleSB3ZXJlIHRlbXBvcmFyeVxuLy8gKHVuc3RhYmxlKSBBUElzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQuIENhbiB3ZSByZW1vdmUgdGhlIHN5bWJvbHM/XG5cbnZhciBSRUFDVF9BU1lOQ19NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5hc3luY19tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5jb25jdXJyZW50X21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKSA6IDB4ZWFkMDtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKSA6IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0JykgOiAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubWVtbycpIDogMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKSA6IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYmxvY2snKSA6IDB4ZWFkOTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZnVuZGFtZW50YWwnKSA6IDB4ZWFkNTtcbnZhciBSRUFDVF9SRVNQT05ERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnJlc3BvbmRlcicpIDogMHhlYWQ2O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zY29wZScpIDogMHhlYWQ3O1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IC8vIE5vdGU6IGl0cyB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyBpZiBpdCdzIGEgcG9seWZpbGwuXG4gIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9SRVNQT05ERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9TQ09QRV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0JMT0NLX1RZUEUpO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0FTWU5DX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoJCR0eXBlb2ZUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn0gLy8gQXN5bmNNb2RlIGlzIGRlcHJlY2F0ZWQgYWxvbmcgd2l0aCBpc0FzeW5jTW9kZVxuXG52YXIgQXN5bmNNb2RlID0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xudmFyIENvbmN1cnJlbnRNb2RlID0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTsgLy8gQXN5bmNNb2RlIHNob3VsZCBiZSBkZXByZWNhdGVkXG5cbmZ1bmN0aW9uIGlzQXN5bmNNb2RlKG9iamVjdCkge1xuICB7XG4gICAgaWYgKCFoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSB0cnVlOyAvLyBVc2luZyBjb25zb2xlWyd3YXJuJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuXG4gICAgICBjb25zb2xlWyd3YXJuJ10oJ1RoZSBSZWFjdElzLmlzQXN5bmNNb2RlKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE3Ky4gVXBkYXRlIHlvdXIgY29kZSB0byB1c2UgJyArICdSZWFjdElzLmlzQ29uY3VycmVudE1vZGUoKSBpbnN0ZWFkLiBJdCBoYXMgdGhlIGV4YWN0IHNhbWUgQVBJLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkgfHwgdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9WSURFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNGb3J3YXJkUmVmKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZyYWdtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0xhenkob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xufVxuZnVuY3Rpb24gaXNNZW1vKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX01FTU9fVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUG9ydGFsKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xufVxuZnVuY3Rpb24gaXNQcm9maWxlcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdHJpY3RNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N1c3BlbnNlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG59XG5cbmV4cG9ydHMuQXN5bmNNb2RlID0gQXN5bmNNb2RlO1xuZXhwb3J0cy5Db25jdXJyZW50TW9kZSA9IENvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5Db250ZXh0Q29uc3VtZXIgPSBDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLkNvbnRleHRQcm92aWRlciA9IENvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuRWxlbWVudCA9IEVsZW1lbnQ7XG5leHBvcnRzLkZvcndhcmRSZWYgPSBGb3J3YXJkUmVmO1xuZXhwb3J0cy5GcmFnbWVudCA9IEZyYWdtZW50O1xuZXhwb3J0cy5MYXp5ID0gTGF6eTtcbmV4cG9ydHMuTWVtbyA9IE1lbW87XG5leHBvcnRzLlBvcnRhbCA9IFBvcnRhbDtcbmV4cG9ydHMuUHJvZmlsZXIgPSBQcm9maWxlcjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFN0cmljdE1vZGU7XG5leHBvcnRzLlN1c3BlbnNlID0gU3VzcGVuc2U7XG5leHBvcnRzLmlzQXN5bmNNb2RlID0gaXNBc3luY01vZGU7XG5leHBvcnRzLmlzQ29uY3VycmVudE1vZGUgPSBpc0NvbmN1cnJlbnRNb2RlO1xuZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lciA9IGlzQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGlzQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG5leHBvcnRzLmlzRm9yd2FyZFJlZiA9IGlzRm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7XG5leHBvcnRzLmlzTGF6eSA9IGlzTGF6eTtcbmV4cG9ydHMuaXNNZW1vID0gaXNNZW1vO1xuZXhwb3J0cy5pc1BvcnRhbCA9IGlzUG9ydGFsO1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gaXNQcm9maWxlcjtcbmV4cG9ydHMuaXNTdHJpY3RNb2RlID0gaXNTdHJpY3RNb2RlO1xuZXhwb3J0cy5pc1N1c3BlbnNlID0gaXNTdXNwZW5zZTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlO1xuZXhwb3J0cy50eXBlT2YgPSB0eXBlT2Y7XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFJlZ2V4UGFyc2VyXG4gKiBQYXJzZXMgYSBzdHJpbmcgaW5wdXQuXG4gKlxuICogQG5hbWUgUmVnZXhQYXJzZXJcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBzdHJpbmcgaW5wdXQgdGhhdCBzaG91bGQgYmUgcGFyc2VkIGFzIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJuIHtSZWdFeHB9IFRoZSBwYXJzZWQgcmVndWxhciBleHByZXNzaW9uLlxuICovXG52YXIgUmVnZXhQYXJzZXIgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIC8vIFZhbGlkYXRlIGlucHV0XG4gICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0LiBJbnB1dCBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGlucHV0XG4gICAgdmFyIG0gPSBpbnB1dC5tYXRjaCgvKFxcLz8pKC4rKVxcMShbYS16XSopL2kpO1xuXG4gICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwgdGhyb3cgYW4gZXJyb3JcbiAgICBpZiAoIW0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24gZm9ybWF0LlwiKTtcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgdmFsaWQgZmxhZ3M6ICdnJywgJ2knLCAnbScsICdzJywgJ3UnLCBhbmQgJ3knXG4gICAgdmFyIHZhbGlkRmxhZ3MgPSBBcnJheS5mcm9tKG5ldyBTZXQobVszXSkpLmZpbHRlcihmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICByZXR1cm4gXCJnaW1zdXlcIi5pbmNsdWRlcyhmbGFnKTtcbiAgICB9KS5qb2luKFwiXCIpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSByZWd1bGFyIGV4cHJlc3Npb25cbiAgICByZXR1cm4gbmV3IFJlZ0V4cChtWzJdLCB2YWxpZEZsYWdzKTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX3Njcm9sbFNtb290aCA9IHJlcXVpcmUoJy4vc2Nyb2xsU21vb3RoJyk7XG5cbnZhciBfc2Nyb2xsU21vb3RoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Njcm9sbFNtb290aCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgX3JlZiRxdWVyeSA9IF9yZWYucXVlcnksXG4gICAgICBxdWVyeSA9IF9yZWYkcXVlcnkgPT09IHVuZGVmaW5lZCA/ICdbaHJlZl49XCIjXCJdOm5vdChbaHJlZj1cIiNcIl0nIDogX3JlZiRxdWVyeSxcbiAgICAgIF9yZWYkbWF0Y2ggPSBfcmVmLm1hdGNoLFxuICAgICAgbWF0Y2ggPSBfcmVmJG1hdGNoID09PSB1bmRlZmluZWQgPyBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldC5oYXNoLnN1YnN0cmluZygxKSk7XG4gIH0gOiBfcmVmJG1hdGNoLFxuICAgICAgX3JlZiRoYXNoQ2hhbmdlID0gX3JlZi5oYXNoQ2hhbmdlLFxuICAgICAgaGFzaENoYW5nZSA9IF9yZWYkaGFzaENoYW5nZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9yZWYkaGFzaENoYW5nZSxcbiAgICAgIHNjcm9sbFNtb290aENvbmZpZyA9IF9yZWYuc2Nyb2xsU21vb3RoQ29uZmlnO1xuXG4gIHZhciBsaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpO1xuICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXIoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgZGVzdCA9IG1hdGNoKGUudGFyZ2V0KTtcblxuICAgIGlmICghZGVzdCkgcmV0dXJuO1xuXG4gICAgaWYgKGhhc2hDaGFuZ2UpIHtcbiAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIG51bGwsICcjJyArIGRlc3QuaWQpO1xuICAgIH1cblxuICAgICgwLCBfc2Nyb2xsU21vb3RoMi5kZWZhdWx0KShkZXN0LCBfZXh0ZW5kcyh7fSwgc2Nyb2xsU21vb3RoQ29uZmlnKSk7XG4gIH07XG5cbiAgQXJyYXkuZnJvbShsaW5rcykubWFwKGZ1bmN0aW9uIChsaW5rKSB7XG4gICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIsIGZhbHNlKTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2Nyb2xsU21vb3RoID0gcmVxdWlyZSgnLi9zY3JvbGxTbW9vdGgnKTtcblxudmFyIF9zY3JvbGxTbW9vdGgyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2Nyb2xsU21vb3RoKTtcblxudmFyIF90b29scyA9IHJlcXVpcmUoJy4vdG9vbHMnKTtcblxudmFyIF9hbmNob3JTY3JvbGwgPSByZXF1aXJlKCcuL2FuY2hvclNjcm9sbCcpO1xuXG52YXIgX2FuY2hvclNjcm9sbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hbmNob3JTY3JvbGwpO1xuXG52YXIgX29ic2VydmUgPSByZXF1aXJlKCcuL29ic2VydmUnKTtcblxudmFyIF9vYnNlcnZlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29ic2VydmUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHRvOiBfc2Nyb2xsU21vb3RoMi5kZWZhdWx0LFxuICBjYWxjRW5kUG9pbnQ6IF90b29scy5jYWxjRW5kUG9pbnQsXG4gIGFuY2hvclNjcm9sbDogX2FuY2hvclNjcm9sbDIuZGVmYXVsdCxcbiAgb2JzZXJ2ZTogX29ic2VydmUyLmRlZmF1bHRcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgIF9yZWYkYWN0aXZlQ2xhc3MgPSBfcmVmLmFjdGl2ZUNsYXNzLFxuICAgICAgYWN0aXZlQ2xhc3MgPSBfcmVmJGFjdGl2ZUNsYXNzID09PSB1bmRlZmluZWQgPyAnYWN0aXZlJyA6IF9yZWYkYWN0aXZlQ2xhc3MsXG4gICAgICBfcmVmJHF1ZXJ5ID0gX3JlZi5xdWVyeSxcbiAgICAgIHF1ZXJ5ID0gX3JlZiRxdWVyeSA9PT0gdW5kZWZpbmVkID8gJ1tocmVmXj1cIiNcIl06bm90KFtocmVmPVwiI1wiXSk6bm90KFtocmVmPVwiIzBcIl0pJyA6IF9yZWYkcXVlcnksXG4gICAgICBfcmVmJHRocmVzaG9sZCA9IF9yZWYudGhyZXNob2xkLFxuICAgICAgdGhyZXNob2xkID0gX3JlZiR0aHJlc2hvbGQgPT09IHVuZGVmaW5lZCA/IFswLjI1LCAwLjUsIDAuNzVdIDogX3JlZiR0aHJlc2hvbGQsXG4gICAgICBfcmVmJGRldGVjdFR5cGUgPSBfcmVmLmRldGVjdFR5cGUsXG4gICAgICBkZXRlY3RUeXBlID0gX3JlZiRkZXRlY3RUeXBlID09PSB1bmRlZmluZWQgPyAnbWF4JyA6IF9yZWYkZGV0ZWN0VHlwZTtcblxuICB2YXIgb3B0aW9ucyA9IHsgdGhyZXNob2xkOiB0aHJlc2hvbGQgfTtcblxuICB2YXIgcmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbiByZW1vdmVDbGFzcyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzcyk7XG4gIH07XG4gIHZhciBhZGRDbGFzcyA9IGZ1bmN0aW9uIGFkZENsYXNzKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcbiAgfTtcblxuICB2YXIgdW5zZXRBbGxBY3RpdmVzID0gZnVuY3Rpb24gdW5zZXRBbGxBY3RpdmVzKCkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgYWN0aXZlQ2xhc3MpLmZvckVhY2gocmVtb3ZlQ2xhc3MpO1xuICB9O1xuXG4gIHZhciBzZXRBY3RpdmUgPSBmdW5jdGlvbiBzZXRBY3RpdmUoYWN0aXZlTm9kZSkge1xuICAgIHVuc2V0QWxsQWN0aXZlcygpO1xuICAgIGFkZENsYXNzKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2FbaHJlZj1cIiMnICsgYWN0aXZlTm9kZS5pZCArICdcIl0nKSk7XG4gIH07XG5cbiAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soZW50cmllcykge1xuICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgIGlmIChlbnRyeS5pbnRlcnNlY3Rpb25SYXRpbyA+PSBNYXRoW2RldGVjdFR5cGVdLmFwcGx5KE1hdGgsIF90b0NvbnN1bWFibGVBcnJheSh0aHJlc2hvbGQpKSkge1xuICAgICAgICBzZXRBY3RpdmUoZW50cnkudGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICB2YXIgbGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KTtcbiAgdmFyIG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGNhbGxiYWNrLCBvcHRpb25zKTtcbiAgdmFyIG9ic2VydmVUYXJnZXQgPSBmdW5jdGlvbiBvYnNlcnZlVGFyZ2V0KGxpbmspIHtcbiAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyBsaW5rLmhhc2guc2xpY2UoMSkpO1xuICAgIG9ic2VydmVyLm9ic2VydmUodGFyZ2V0KTtcbiAgfTtcblxuICBsaW5rcy5mb3JFYWNoKG9ic2VydmVUYXJnZXQpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF90b29scyA9IHJlcXVpcmUoXCIuL3Rvb2xzXCIpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgIF9yZWYkZHVyYXRpb24gPSBfcmVmLmR1cmF0aW9uLFxuICAgICAgZHVyYXRpb24gPSBfcmVmJGR1cmF0aW9uID09PSB1bmRlZmluZWQgPyA1MDAgOiBfcmVmJGR1cmF0aW9uLFxuICAgICAgX3JlZiRjb250ZXh0ID0gX3JlZi5jb250ZXh0LFxuICAgICAgY29udGV4dCA9IF9yZWYkY29udGV4dCA9PT0gdW5kZWZpbmVkID8gd2luZG93IDogX3JlZiRjb250ZXh0LFxuICAgICAgX3JlZiRvZmZzZXQgPSBfcmVmLm9mZnNldCxcbiAgICAgIG9mZnNldCA9IF9yZWYkb2Zmc2V0ID09PSB1bmRlZmluZWQgPyAwIDogX3JlZiRvZmZzZXQsXG4gICAgICBfcmVmJGVhc2UgPSBfcmVmLmVhc2UsXG4gICAgICBlYXNlID0gX3JlZiRlYXNlID09PSB1bmRlZmluZWQgPyBcImVhc2VJbk91dEN1YmljXCIgOiBfcmVmJGVhc2UsXG4gICAgICBjYWxsYmFjayA9IF9yZWYuY2FsbGJhY2s7XG5cbiAgaWYgKCh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yod2luZG93KSkgIT09IFwib2JqZWN0XCIpIHJldHVybjtcblxuICB2YXIgc3RhcnQgPSBjb250ZXh0LnNjcm9sbFRvcCAhPT0gbnVsbCAmJiBjb250ZXh0LnNjcm9sbFRvcCAhPT0gdW5kZWZpbmVkID8gY29udGV4dC5zY3JvbGxUb3AgOiB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gIHZhciBlbmQgPSAoMCwgX3Rvb2xzLmNhbGNFbmRQb2ludCkodGFyZ2V0LCBjb250ZXh0LCBvZmZzZXQpO1xuICB2YXIgY2xvY2sgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgdmFyIHJBRiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbiAgdmFyIHRpY2sgPSBmdW5jdGlvbiB0aWNrKCkge1xuICAgIHZhciBlbGFwc2VkID0gcGVyZm9ybWFuY2Uubm93KCkgLSBjbG9jaztcbiAgICB2YXIgcG9zID0gKDAsIF90b29scy5zZXRQb3NpdGlvbikoc3RhcnQsIGVuZCwgZWxhcHNlZCwgZHVyYXRpb24sIGVhc2UpO1xuICAgIGlmIChjb250ZXh0ICE9PSB3aW5kb3cpIHtcbiAgICAgIGNvbnRleHQuc2Nyb2xsVG9wID0gcG9zO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuc2Nyb2xsKDAsIHBvcyk7XG4gICAgfVxuXG4gICAgaWYgKGVsYXBzZWQgPiBkdXJhdGlvbikge1xuICAgICAgdHlwZW9mIGNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIgJiYgY2FsbGJhY2sodGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgckFGKHRpY2spO1xuICAgIH1cbiAgfTtcblxuICB0aWNrKCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciBlYXNlRnVuY3Rpb25zID0gZXhwb3J0cy5lYXNlRnVuY3Rpb25zID0ge1xuICBsaW5lYXI6IGZ1bmN0aW9uIGxpbmVhcih0KSB7XG4gICAgcmV0dXJuIHQ7XG4gIH0sXG4gIGVhc2VJblF1YWQ6IGZ1bmN0aW9uIGVhc2VJblF1YWQodCkge1xuICAgIHJldHVybiB0ICogdDtcbiAgfSxcbiAgZWFzZU91dFF1YWQ6IGZ1bmN0aW9uIGVhc2VPdXRRdWFkKHQpIHtcbiAgICByZXR1cm4gdCAqICgyIC0gdCk7XG4gIH0sXG4gIGVhc2VJbk91dFF1YWQ6IGZ1bmN0aW9uIGVhc2VJbk91dFF1YWQodCkge1xuICAgIHJldHVybiB0IDwgLjUgPyAyICogdCAqIHQgOiAtMSArICg0IC0gMiAqIHQpICogdDtcbiAgfSxcbiAgZWFzZUluQ3ViaWM6IGZ1bmN0aW9uIGVhc2VJbkN1YmljKHQpIHtcbiAgICByZXR1cm4gdCAqIHQgKiB0O1xuICB9LFxuICBlYXNlT3V0Q3ViaWM6IGZ1bmN0aW9uIGVhc2VPdXRDdWJpYyh0KSB7XG4gICAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbiAgfSxcbiAgZWFzZUluT3V0Q3ViaWM6IGZ1bmN0aW9uIGVhc2VJbk91dEN1YmljKHQpIHtcbiAgICByZXR1cm4gdCA8IC41ID8gNCAqIHQgKiB0ICogdCA6ICh0IC0gMSkgKiAoMiAqIHQgLSAyKSAqICgyICogdCAtIDIpICsgMTtcbiAgfSxcbiAgZWFzZUluUXVhcnQ6IGZ1bmN0aW9uIGVhc2VJblF1YXJ0KHQpIHtcbiAgICByZXR1cm4gdCAqIHQgKiB0ICogdDtcbiAgfSxcbiAgZWFzZU91dFF1YXJ0OiBmdW5jdGlvbiBlYXNlT3V0UXVhcnQodCkge1xuICAgIHJldHVybiAxIC0gLS10ICogdCAqIHQgKiB0O1xuICB9LFxuICBlYXNlSW5PdXRRdWFydDogZnVuY3Rpb24gZWFzZUluT3V0UXVhcnQodCkge1xuICAgIHJldHVybiB0IDwgLjUgPyA4ICogdCAqIHQgKiB0ICogdCA6IDEgLSA4ICogLS10ICogdCAqIHQgKiB0O1xuICB9LFxuICBlYXNlSW5RdWludDogZnVuY3Rpb24gZWFzZUluUXVpbnQodCkge1xuICAgIHJldHVybiB0ICogdCAqIHQgKiB0ICogdDtcbiAgfSxcbiAgZWFzZU91dFF1aW50OiBmdW5jdGlvbiBlYXNlT3V0UXVpbnQodCkge1xuICAgIHJldHVybiAxICsgLS10ICogdCAqIHQgKiB0ICogdDtcbiAgfSxcbiAgZWFzZUluT3V0UXVpbnQ6IGZ1bmN0aW9uIGVhc2VJbk91dFF1aW50KHQpIHtcbiAgICByZXR1cm4gdCA8IC41ID8gMTYgKiB0ICogdCAqIHQgKiB0ICogdCA6IDEgKyAxNiAqIC0tdCAqIHQgKiB0ICogdCAqIHQ7XG4gIH1cbn07XG5cbnZhciBpc051bWVyaWMgPSBleHBvcnRzLmlzTnVtZXJpYyA9IGZ1bmN0aW9uIGlzTnVtZXJpYyhuKSB7XG4gIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdChuKSkgJiYgaXNGaW5pdGUobik7XG59O1xuXG52YXIgc2V0UG9zaXRpb24gPSBleHBvcnRzLnNldFBvc2l0aW9uID0gZnVuY3Rpb24gc2V0UG9zaXRpb24oYmVnaW4sIGVuZCwgZWxhcHNlZCwgZHVyYXRpb24pIHtcbiAgdmFyIGVhc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6ICdlYXNlSW5PdXRDdWJpYyc7XG5cbiAgcmV0dXJuIGVsYXBzZWQgPiBkdXJhdGlvbiA/IGVuZCA6IGJlZ2luICsgKGVuZCAtIGJlZ2luKSAqIGVhc2VGdW5jdGlvbnNbZWFzZV0oZWxhcHNlZCAvIGR1cmF0aW9uKTtcbn07XG5cbnZhciBjYWxjRW5kUG9pbnQgPSBleHBvcnRzLmNhbGNFbmRQb2ludCA9IGZ1bmN0aW9uIGNhbGNFbmRQb2ludCh0YXJnZXQpIHtcbiAgdmFyIGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHdpbmRvdztcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMDtcblxuICBpZiAoaXNOdW1lcmljKHRhcmdldCkpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodGFyZ2V0KSArIG9mZnNldDtcbiAgfVxuXG4gIHZhciB5ID0gY29udGV4dCA9PT0gd2luZG93IHx8IGNvbnRleHQgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA/IHdpbmRvdy5wYWdlWU9mZnNldCA6IGNvbnRleHQuc2Nyb2xsVG9wIC0gY29udGV4dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG5cbiAgdmFyIGRpc3RhbmNlID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdodG1sJyA/IC15IDogdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHk7XG5cbiAgcmV0dXJuIGRpc3RhbmNlICsgb2Zmc2V0O1xufTsiLCIoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5TY3JvbGxwYXJlbnQgPSBmYWN0b3J5KCk7XG4gIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICB2YXIgcmVnZXggPSAvKGF1dG98c2Nyb2xsKS87XG5cbiAgdmFyIHBhcmVudHMgPSBmdW5jdGlvbiAobm9kZSwgcHMpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlID09PSBudWxsKSB7IHJldHVybiBwczsgfVxuXG4gICAgcmV0dXJuIHBhcmVudHMobm9kZS5wYXJlbnROb2RlLCBwcy5jb25jYXQoW25vZGVdKSk7XG4gIH07XG5cbiAgdmFyIHN0eWxlID0gZnVuY3Rpb24gKG5vZGUsIHByb3ApIHtcbiAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKHByb3ApO1xuICB9O1xuXG4gIHZhciBvdmVyZmxvdyA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIHN0eWxlKG5vZGUsIFwib3ZlcmZsb3dcIikgKyBzdHlsZShub2RlLCBcIm92ZXJmbG93LXlcIikgKyBzdHlsZShub2RlLCBcIm92ZXJmbG93LXhcIik7XG4gIH07XG5cbiAgdmFyIHNjcm9sbCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICByZXR1cm4gcmVnZXgudGVzdChvdmVyZmxvdyhub2RlKSk7XG4gIH07XG5cbiAgdmFyIHNjcm9sbFBhcmVudCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSkge1xuICAgICAgcmV0dXJuIDtcbiAgICB9XG5cbiAgICB2YXIgcHMgPSBwYXJlbnRzKG5vZGUucGFyZW50Tm9kZSwgW10pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKHNjcm9sbChwc1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIHBzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgfTtcblxuICByZXR1cm4gc2Nyb2xsUGFyZW50O1xufSkpO1xuIiwiLy9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQiwgY29tcGFyZSwgY29tcGFyZUNvbnRleHQpIHtcbiAgdmFyIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIG9iakEsIG9iakIpIDogdm9pZCAwO1xuXG4gIGlmIChyZXQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiAhIXJldDtcbiAgfVxuXG4gIGlmIChvYmpBID09PSBvYmpCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09IFwib2JqZWN0XCIgfHwgIW9iakEgfHwgdHlwZW9mIG9iakIgIT09IFwib2JqZWN0XCIgfHwgIW9iakIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGJIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYmluZChvYmpCKTtcblxuICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBrZXlzQS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG5cbiAgICBpZiAoIWJIYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlQSA9IG9iakFba2V5XTtcbiAgICB2YXIgdmFsdWVCID0gb2JqQltrZXldO1xuXG4gICAgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgdmFsdWVBLCB2YWx1ZUIsIGtleSkgOiB2b2lkIDA7XG5cbiAgICBpZiAocmV0ID09PSBmYWxzZSB8fCAocmV0ID09PSB2b2lkIDAgJiYgdmFsdWVBICE9PSB2YWx1ZUIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcmVhY3QtZGF0ZXBpY2tlci5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcmVhY3QtZGF0ZXBpY2tlci5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2luZGV4LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2luZGV4LmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vb3BlbnNpZ25kcml2ZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvZGlzdC9janMuanMhLi9vcGVuc2lnbmRyaXZlLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc2lnbmF0dXJlLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NpZ25hdHVyZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsImltcG9ydHt0eXBlT2YgYXMgZSxpc0VsZW1lbnQgYXMgdCxpc1ZhbGlkRWxlbWVudFR5cGUgYXMgbn1mcm9tXCJyZWFjdC1pc1wiO2ltcG9ydCByLHt1c2VTdGF0ZSBhcyBvLHVzZUNvbnRleHQgYXMgcyx1c2VNZW1vIGFzIGksdXNlRWZmZWN0IGFzIGEsdXNlUmVmIGFzIGMsY3JlYXRlRWxlbWVudCBhcyB1LHVzZUxheW91dEVmZmVjdCBhcyBsfWZyb21cInJlYWN0XCI7aW1wb3J0IGQgZnJvbVwic2hhbGxvd2VxdWFsXCI7aW1wb3J0IGggZnJvbVwiQGVtb3Rpb24vc3R5bGlzXCI7aW1wb3J0IHAgZnJvbVwiQGVtb3Rpb24vdW5pdGxlc3NcIjtpbXBvcnQgZiBmcm9tXCJAZW1vdGlvbi9pcy1wcm9wLXZhbGlkXCI7aW1wb3J0IG0gZnJvbVwiaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3NcIjtmdW5jdGlvbiB5KCl7cmV0dXJuKHk9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0pLmFwcGx5KHRoaXMsYXJndW1lbnRzKX12YXIgdj1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bZVswXV0scj0wLG89dC5sZW5ndGg7cjxvO3IrPTEpbi5wdXNoKHRbcl0sZVtyKzFdKTtyZXR1cm4gbn0sZz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXQmJlwib2JqZWN0XCI9PXR5cGVvZiB0JiZcIltvYmplY3QgT2JqZWN0XVwiPT09KHQudG9TdHJpbmc/dC50b1N0cmluZygpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkmJiFlKHQpfSxTPU9iamVjdC5mcmVlemUoW10pLHc9T2JqZWN0LmZyZWV6ZSh7fSk7ZnVuY3Rpb24gRShlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBlfWZ1bmN0aW9uIGIoZSl7cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmXCJzdHJpbmdcIj09dHlwZW9mIGUmJmV8fGUuZGlzcGxheU5hbWV8fGUubmFtZXx8XCJDb21wb25lbnRcIn1mdW5jdGlvbiBfKGUpe3JldHVybiBlJiZcInN0cmluZ1wiPT10eXBlb2YgZS5zdHlsZWRDb21wb25lbnRJZH12YXIgTj1cInVuZGVmaW5lZFwiIT10eXBlb2YgcHJvY2VzcyYmdm9pZCAwIT09cHJvY2Vzcy5lbnYmJihwcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfQVRUUnx8cHJvY2Vzcy5lbnYuU0NfQVRUUil8fFwiZGF0YS1zdHlsZWRcIixBPVwiNS4zLjExXCIsQz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZcIkhUTUxFbGVtZW50XCJpbiB3aW5kb3csST1Cb29sZWFuKFwiYm9vbGVhblwiPT10eXBlb2YgU0NfRElTQUJMRV9TUEVFRFk/U0NfRElTQUJMRV9TUEVFRFk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHByb2Nlc3MmJnZvaWQgMCE9PXByb2Nlc3MuZW52JiYodm9pZCAwIT09cHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NDX0RJU0FCTEVfU1BFRURZJiZcIlwiIT09cHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NDX0RJU0FCTEVfU1BFRURZP1wiZmFsc2VcIiE9PXByb2Nlc3MuZW52LlJFQUNUX0FQUF9TQ19ESVNBQkxFX1NQRUVEWSYmcHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NDX0RJU0FCTEVfU1BFRURZOnZvaWQgMCE9PXByb2Nlc3MuZW52LlNDX0RJU0FCTEVfU1BFRURZJiZcIlwiIT09cHJvY2Vzcy5lbnYuU0NfRElTQUJMRV9TUEVFRFk/XCJmYWxzZVwiIT09cHJvY2Vzcy5lbnYuU0NfRElTQUJMRV9TUEVFRFkmJnByb2Nlc3MuZW52LlNDX0RJU0FCTEVfU1BFRURZOlwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYpKSxQPXt9LE89XCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOVj97MTpcIkNhbm5vdCBjcmVhdGUgc3R5bGVkLWNvbXBvbmVudCBmb3IgY29tcG9uZW50OiAlcy5cXG5cXG5cIiwyOlwiQ2FuJ3QgY29sbGVjdCBzdHlsZXMgb25jZSB5b3UndmUgY29uc3VtZWQgYSBgU2VydmVyU3R5bGVTaGVldGAncyBzdHlsZXMhIGBTZXJ2ZXJTdHlsZVNoZWV0YCBpcyBhIG9uZSBvZmYgaW5zdGFuY2UgZm9yIGVhY2ggc2VydmVyLXNpZGUgcmVuZGVyIGN5Y2xlLlxcblxcbi0gQXJlIHlvdSB0cnlpbmcgdG8gcmV1c2UgaXQgYWNyb3NzIHJlbmRlcnM/XFxuLSBBcmUgeW91IGFjY2lkZW50YWxseSBjYWxsaW5nIGNvbGxlY3RTdHlsZXMgdHdpY2U/XFxuXFxuXCIsMzpcIlN0cmVhbWluZyBTU1IgaXMgb25seSBzdXBwb3J0ZWQgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50OyBQbGVhc2UgZG8gbm90IHRyeSB0byBjYWxsIHRoaXMgbWV0aG9kIGluIHRoZSBicm93c2VyLlxcblxcblwiLDQ6XCJUaGUgYFN0eWxlU2hlZXRNYW5hZ2VyYCBleHBlY3RzIGEgdmFsaWQgdGFyZ2V0IG9yIHNoZWV0IHByb3AhXFxuXFxuLSBEb2VzIHRoaXMgZXJyb3Igb2NjdXIgb24gdGhlIGNsaWVudCBhbmQgaXMgeW91ciB0YXJnZXQgZmFsc3k/XFxuLSBEb2VzIHRoaXMgZXJyb3Igb2NjdXIgb24gdGhlIHNlcnZlciBhbmQgaXMgdGhlIHNoZWV0IGZhbHN5P1xcblxcblwiLDU6XCJUaGUgY2xvbmUgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIG9uIHRoZSBjbGllbnQhXFxuXFxuLSBBcmUgeW91IHJ1bm5pbmcgaW4gYSBjbGllbnQtbGlrZSBlbnZpcm9ubWVudCBvbiB0aGUgc2VydmVyP1xcbi0gQXJlIHlvdSB0cnlpbmcgdG8gcnVuIFNTUiBvbiB0aGUgY2xpZW50P1xcblxcblwiLDY6XCJUcnlpbmcgdG8gaW5zZXJ0IGEgbmV3IHN0eWxlIHRhZywgYnV0IHRoZSBnaXZlbiBOb2RlIGlzIHVubW91bnRlZCFcXG5cXG4tIEFyZSB5b3UgdXNpbmcgYSBjdXN0b20gdGFyZ2V0IHRoYXQgaXNuJ3QgbW91bnRlZD9cXG4tIERvZXMgeW91ciBkb2N1bWVudCBub3QgaGF2ZSBhIHZhbGlkIGhlYWQgZWxlbWVudD9cXG4tIEhhdmUgeW91IGFjY2lkZW50YWxseSByZW1vdmVkIGEgc3R5bGUgdGFnIG1hbnVhbGx5P1xcblxcblwiLDc6J1RoZW1lUHJvdmlkZXI6IFBsZWFzZSByZXR1cm4gYW4gb2JqZWN0IGZyb20geW91ciBcInRoZW1lXCIgcHJvcCBmdW5jdGlvbiwgZS5nLlxcblxcbmBgYGpzXFxudGhlbWU9eygpID0+ICh7fSl9XFxuYGBgXFxuXFxuJyw4OidUaGVtZVByb3ZpZGVyOiBQbGVhc2UgbWFrZSB5b3VyIFwidGhlbWVcIiBwcm9wIGFuIG9iamVjdC5cXG5cXG4nLDk6XCJNaXNzaW5nIGRvY3VtZW50IGA8aGVhZD5gXFxuXFxuXCIsMTA6XCJDYW5ub3QgZmluZCBhIFN0eWxlU2hlZXQgaW5zdGFuY2UuIFVzdWFsbHkgdGhpcyBoYXBwZW5zIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb3BpZXMgb2Ygc3R5bGVkLWNvbXBvbmVudHMgbG9hZGVkIGF0IG9uY2UuIENoZWNrIG91dCB0aGlzIGlzc3VlIGZvciBob3cgdG8gdHJvdWJsZXNob290IGFuZCBmaXggdGhlIGNvbW1vbiBjYXNlcyB3aGVyZSB0aGlzIHNpdHVhdGlvbiBjYW4gaGFwcGVuOiBodHRwczovL2dpdGh1Yi5jb20vc3R5bGVkLWNvbXBvbmVudHMvc3R5bGVkLWNvbXBvbmVudHMvaXNzdWVzLzE5NDEjaXNzdWVjb21tZW50LTQxNzg2MjAyMVxcblxcblwiLDExOlwiX1RoaXMgZXJyb3Igd2FzIHJlcGxhY2VkIHdpdGggYSBkZXYtdGltZSB3YXJuaW5nLCBpdCB3aWxsIGJlIGRlbGV0ZWQgZm9yIHY0IGZpbmFsLl8gW2NyZWF0ZUdsb2JhbFN0eWxlXSByZWNlaXZlZCBjaGlsZHJlbiB3aGljaCB3aWxsIG5vdCBiZSByZW5kZXJlZC4gUGxlYXNlIHVzZSB0aGUgY29tcG9uZW50IHdpdGhvdXQgcGFzc2luZyBjaGlsZHJlbiBlbGVtZW50cy5cXG5cXG5cIiwxMjpcIkl0IHNlZW1zIHlvdSBhcmUgaW50ZXJwb2xhdGluZyBhIGtleWZyYW1lIGRlY2xhcmF0aW9uICglcykgaW50byBhbiB1bnRhZ2dlZCBzdHJpbmcuIFRoaXMgd2FzIHN1cHBvcnRlZCBpbiBzdHlsZWQtY29tcG9uZW50cyB2MywgYnV0IGlzIG5vdCBsb25nZXIgc3VwcG9ydGVkIGluIHY0IGFzIGtleWZyYW1lcyBhcmUgbm93IGluamVjdGVkIG9uLWRlbWFuZC4gUGxlYXNlIHdyYXAgeW91ciBzdHJpbmcgaW4gdGhlIGNzc1xcXFxgXFxcXGAgaGVscGVyIHdoaWNoIGVuc3VyZXMgdGhlIHN0eWxlcyBhcmUgaW5qZWN0ZWQgY29ycmVjdGx5LiBTZWUgaHR0cHM6Ly93d3cuc3R5bGVkLWNvbXBvbmVudHMuY29tL2RvY3MvYXBpI2Nzc1xcblxcblwiLDEzOlwiJXMgaXMgbm90IGEgc3R5bGVkIGNvbXBvbmVudCBhbmQgY2Fubm90IGJlIHJlZmVycmVkIHRvIHZpYSBjb21wb25lbnQgc2VsZWN0b3IuIFNlZSBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9hZHZhbmNlZCNyZWZlcnJpbmctdG8tb3RoZXItY29tcG9uZW50cyBmb3IgbW9yZSBkZXRhaWxzLlxcblxcblwiLDE0OidUaGVtZVByb3ZpZGVyOiBcInRoZW1lXCIgcHJvcCBpcyByZXF1aXJlZC5cXG5cXG4nLDE1OlwiQSBzdHlsaXMgcGx1Z2luIGhhcyBiZWVuIHN1cHBsaWVkIHRoYXQgaXMgbm90IG5hbWVkLiBXZSBuZWVkIGEgbmFtZSBmb3IgZWFjaCBwbHVnaW4gdG8gYmUgYWJsZSB0byBwcmV2ZW50IHN0eWxpbmcgY29sbGlzaW9ucyBiZXR3ZWVuIGRpZmZlcmVudCBzdHlsaXMgY29uZmlndXJhdGlvbnMgd2l0aGluIHRoZSBzYW1lIGFwcC4gQmVmb3JlIHlvdSBwYXNzIHlvdXIgcGx1Z2luIHRvIGA8U3R5bGVTaGVldE1hbmFnZXIgc3R5bGlzUGx1Z2lucz17W119PmAsIHBsZWFzZSBtYWtlIHN1cmUgZWFjaCBwbHVnaW4gaXMgdW5pcXVlbHktbmFtZWQsIGUuZy5cXG5cXG5gYGBqc1xcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbXBvcnRlZFBsdWdpbiwgJ25hbWUnLCB7IHZhbHVlOiAnc29tZS11bmlxdWUtbmFtZScgfSk7XFxuYGBgXFxuXFxuXCIsMTY6XCJSZWFjaGVkIHRoZSBsaW1pdCBvZiBob3cgbWFueSBzdHlsZWQgY29tcG9uZW50cyBtYXkgYmUgY3JlYXRlZCBhdCBncm91cCAlcy5cXG5Zb3UgbWF5IG9ubHkgY3JlYXRlIHVwIHRvIDEsMDczLDc0MSw4MjQgY29tcG9uZW50cy4gSWYgeW91J3JlIGNyZWF0aW5nIGNvbXBvbmVudHMgZHluYW1pY2FsbHksXFxuYXMgZm9yIGluc3RhbmNlIGluIHlvdXIgcmVuZGVyIG1ldGhvZCB0aGVuIHlvdSBtYXkgYmUgcnVubmluZyBpbnRvIHRoaXMgbGltaXRhdGlvbi5cXG5cXG5cIiwxNzpcIkNTU1N0eWxlU2hlZXQgY291bGQgbm90IGJlIGZvdW5kIG9uIEhUTUxTdHlsZUVsZW1lbnQuXFxuSGFzIHN0eWxlZC1jb21wb25lbnRzJyBzdHlsZSB0YWcgYmVlbiB1bm1vdW50ZWQgb3IgYWx0ZXJlZCBieSBhbm90aGVyIHNjcmlwdD9cXG5cIn06e307ZnVuY3Rpb24gUigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoPD0wP3ZvaWQgMDphcmd1bWVudHNbMF0sdD1bXSxuPTEscj1hcmd1bWVudHMubGVuZ3RoO248cjtuKz0xKXQucHVzaChuPDB8fGFyZ3VtZW50cy5sZW5ndGg8PW4/dm9pZCAwOmFyZ3VtZW50c1tuXSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZT1lLnJlcGxhY2UoLyVbYS16XS8sdCl9KSksZX1mdW5jdGlvbiBEKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCkscj0xO3I8dDtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTt0aHJvd1wicHJvZHVjdGlvblwiPT09cHJvY2Vzcy5lbnYuTk9ERV9FTlY/bmV3IEVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQuIFNlZSBodHRwczovL2dpdC5pby9KVUlhRSNcIitlK1wiIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiKyhuLmxlbmd0aD4wP1wiIEFyZ3M6IFwiK24uam9pbihcIiwgXCIpOlwiXCIpKTpuZXcgRXJyb3IoUi5hcHBseSh2b2lkIDAsW09bZV1dLmNvbmNhdChuKSkudHJpbSgpKX12YXIgaj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5ncm91cFNpemVzPW5ldyBVaW50MzJBcnJheSg1MTIpLHRoaXMubGVuZ3RoPTUxMix0aGlzLnRhZz1lfXZhciB0PWUucHJvdG90eXBlO3JldHVybiB0LmluZGV4T2ZHcm91cD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPTA7bjxlO24rKyl0Kz10aGlzLmdyb3VwU2l6ZXNbbl07cmV0dXJuIHR9LHQuaW5zZXJ0UnVsZXM9ZnVuY3Rpb24oZSx0KXtpZihlPj10aGlzLmdyb3VwU2l6ZXMubGVuZ3RoKXtmb3IodmFyIG49dGhpcy5ncm91cFNpemVzLHI9bi5sZW5ndGgsbz1yO2U+PW87KShvPDw9MSk8MCYmRCgxNixcIlwiK2UpO3RoaXMuZ3JvdXBTaXplcz1uZXcgVWludDMyQXJyYXkobyksdGhpcy5ncm91cFNpemVzLnNldChuKSx0aGlzLmxlbmd0aD1vO2Zvcih2YXIgcz1yO3M8bztzKyspdGhpcy5ncm91cFNpemVzW3NdPTB9Zm9yKHZhciBpPXRoaXMuaW5kZXhPZkdyb3VwKGUrMSksYT0wLGM9dC5sZW5ndGg7YTxjO2ErKyl0aGlzLnRhZy5pbnNlcnRSdWxlKGksdFthXSkmJih0aGlzLmdyb3VwU2l6ZXNbZV0rKyxpKyspfSx0LmNsZWFyR3JvdXA9ZnVuY3Rpb24oZSl7aWYoZTx0aGlzLmxlbmd0aCl7dmFyIHQ9dGhpcy5ncm91cFNpemVzW2VdLG49dGhpcy5pbmRleE9mR3JvdXAoZSkscj1uK3Q7dGhpcy5ncm91cFNpemVzW2VdPTA7Zm9yKHZhciBvPW47bzxyO28rKyl0aGlzLnRhZy5kZWxldGVSdWxlKG4pfX0sdC5nZXRHcm91cD1mdW5jdGlvbihlKXt2YXIgdD1cIlwiO2lmKGU+PXRoaXMubGVuZ3RofHwwPT09dGhpcy5ncm91cFNpemVzW2VdKXJldHVybiB0O2Zvcih2YXIgbj10aGlzLmdyb3VwU2l6ZXNbZV0scj10aGlzLmluZGV4T2ZHcm91cChlKSxvPXIrbixzPXI7czxvO3MrKyl0Kz10aGlzLnRhZy5nZXRSdWxlKHMpK1wiLyohc2MqL1xcblwiO3JldHVybiB0fSxlfSgpLFQ9bmV3IE1hcCx4PW5ldyBNYXAsaz0xLFY9ZnVuY3Rpb24oZSl7aWYoVC5oYXMoZSkpcmV0dXJuIFQuZ2V0KGUpO2Zvcig7eC5oYXMoayk7KWsrKzt2YXIgdD1rKys7cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmKCgwfHQpPDB8fHQ+MTw8MzApJiZEKDE2LFwiXCIrdCksVC5zZXQoZSx0KSx4LnNldCh0LGUpLHR9LEI9ZnVuY3Rpb24oZSl7cmV0dXJuIHguZ2V0KGUpfSx6PWZ1bmN0aW9uKGUsdCl7dD49ayYmKGs9dCsxKSxULnNldChlLHQpLHguc2V0KHQsZSl9LE09XCJzdHlsZVtcIitOKyddW2RhdGEtc3R5bGVkLXZlcnNpb249XCI1LjMuMTFcIl0nLEc9bmV3IFJlZ0V4cChcIl5cIitOKydcXFxcLmcoXFxcXGQrKVxcXFxbaWQ9XCIoW1xcXFx3XFxcXGQtXSspXCJcXFxcXS4qP1wiKFteXCJdKiknKSxMPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsbz1uLnNwbGl0KFwiLFwiKSxzPTAsaT1vLmxlbmd0aDtzPGk7cysrKShyPW9bc10pJiZlLnJlZ2lzdGVyTmFtZSh0LHIpfSxGPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSh0LnRleHRDb250ZW50fHxcIlwiKS5zcGxpdChcIi8qIXNjKi9cXG5cIikscj1bXSxvPTAscz1uLmxlbmd0aDtvPHM7bysrKXt2YXIgaT1uW29dLnRyaW0oKTtpZihpKXt2YXIgYT1pLm1hdGNoKEcpO2lmKGEpe3ZhciBjPTB8cGFyc2VJbnQoYVsxXSwxMCksdT1hWzJdOzAhPT1jJiYoeih1LGMpLEwoZSx1LGFbM10pLGUuZ2V0VGFnKCkuaW5zZXJ0UnVsZXMoYyxyKSksci5sZW5ndGg9MH1lbHNlIHIucHVzaChpKX19fSxZPWZ1bmN0aW9uKCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIF9fd2VicGFja19ub25jZV9fP19fd2VicGFja19ub25jZV9fOm51bGx9LHE9ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuaGVhZCxuPWV8fHQscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIiksbz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5jaGlsZE5vZGVzLG49dC5sZW5ndGg7bj49MDtuLS0pe3ZhciByPXRbbl07aWYociYmMT09PXIubm9kZVR5cGUmJnIuaGFzQXR0cmlidXRlKE4pKXJldHVybiByfX0obikscz12b2lkIDAhPT1vP28ubmV4dFNpYmxpbmc6bnVsbDtyLnNldEF0dHJpYnV0ZShOLFwiYWN0aXZlXCIpLHIuc2V0QXR0cmlidXRlKFwiZGF0YS1zdHlsZWQtdmVyc2lvblwiLFwiNS4zLjExXCIpO3ZhciBpPVkoKTtyZXR1cm4gaSYmci5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLGkpLG4uaW5zZXJ0QmVmb3JlKHIscykscn0sSD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9dGhpcy5lbGVtZW50PXEoZSk7dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKSksdGhpcy5zaGVldD1mdW5jdGlvbihlKXtpZihlLnNoZWV0KXJldHVybiBlLnNoZWV0O2Zvcih2YXIgdD1kb2N1bWVudC5zdHlsZVNoZWV0cyxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXt2YXIgbz10W25dO2lmKG8ub3duZXJOb2RlPT09ZSlyZXR1cm4gb31EKDE3KX0odCksdGhpcy5sZW5ndGg9MH12YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5pbnNlcnRSdWxlPWZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiB0aGlzLnNoZWV0Lmluc2VydFJ1bGUodCxlKSx0aGlzLmxlbmd0aCsrLCEwfWNhdGNoKGUpe3JldHVybiExfX0sdC5kZWxldGVSdWxlPWZ1bmN0aW9uKGUpe3RoaXMuc2hlZXQuZGVsZXRlUnVsZShlKSx0aGlzLmxlbmd0aC0tfSx0LmdldFJ1bGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zaGVldC5jc3NSdWxlc1tlXTtyZXR1cm4gdm9pZCAwIT09dCYmXCJzdHJpbmdcIj09dHlwZW9mIHQuY3NzVGV4dD90LmNzc1RleHQ6XCJcIn0sZX0oKSwkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt2YXIgdD10aGlzLmVsZW1lbnQ9cShlKTt0aGlzLm5vZGVzPXQuY2hpbGROb2Rlcyx0aGlzLmxlbmd0aD0wfXZhciB0PWUucHJvdG90eXBlO3JldHVybiB0Lmluc2VydFJ1bGU9ZnVuY3Rpb24oZSx0KXtpZihlPD10aGlzLmxlbmd0aCYmZT49MCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCkscj10aGlzLm5vZGVzW2VdO3JldHVybiB0aGlzLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKG4scnx8bnVsbCksdGhpcy5sZW5ndGgrKywhMH1yZXR1cm4hMX0sdC5kZWxldGVSdWxlPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLm5vZGVzW2VdKSx0aGlzLmxlbmd0aC0tfSx0LmdldFJ1bGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU8dGhpcy5sZW5ndGg/dGhpcy5ub2Rlc1tlXS50ZXh0Q29udGVudDpcIlwifSxlfSgpLFc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMucnVsZXM9W10sdGhpcy5sZW5ndGg9MH12YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5pbnNlcnRSdWxlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU8PXRoaXMubGVuZ3RoJiYodGhpcy5ydWxlcy5zcGxpY2UoZSwwLHQpLHRoaXMubGVuZ3RoKyssITApfSx0LmRlbGV0ZVJ1bGU9ZnVuY3Rpb24oZSl7dGhpcy5ydWxlcy5zcGxpY2UoZSwxKSx0aGlzLmxlbmd0aC0tfSx0LmdldFJ1bGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU8dGhpcy5sZW5ndGg/dGhpcy5ydWxlc1tlXTpcIlwifSxlfSgpLFU9QyxKPXtpc1NlcnZlcjohQyx1c2VDU1NPTUluamVjdGlvbjohSX0sWD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4pe3ZvaWQgMD09PWUmJihlPXcpLHZvaWQgMD09PXQmJih0PXt9KSx0aGlzLm9wdGlvbnM9eSh7fSxKLHt9LGUpLHRoaXMuZ3M9dCx0aGlzLm5hbWVzPW5ldyBNYXAobiksdGhpcy5zZXJ2ZXI9ISFlLmlzU2VydmVyLCF0aGlzLnNlcnZlciYmQyYmVSYmKFU9ITEsZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoTSksbj0wLHI9dC5sZW5ndGg7bjxyO24rKyl7dmFyIG89dFtuXTtvJiZcImFjdGl2ZVwiIT09by5nZXRBdHRyaWJ1dGUoTikmJihGKGUsbyksby5wYXJlbnROb2RlJiZvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobykpfX0odGhpcykpfWUucmVnaXN0ZXJJZD1mdW5jdGlvbihlKXtyZXR1cm4gVihlKX07dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQucmVjb25zdHJ1Y3RXaXRoT3B0aW9ucz1mdW5jdGlvbih0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0hMCksbmV3IGUoeSh7fSx0aGlzLm9wdGlvbnMse30sdCksdGhpcy5ncyxuJiZ0aGlzLm5hbWVzfHx2b2lkIDApfSx0LmFsbG9jYXRlR1NJbnN0YW5jZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nc1tlXT0odGhpcy5nc1tlXXx8MCkrMX0sdC5nZXRUYWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWd8fCh0aGlzLnRhZz0obj0odD10aGlzLm9wdGlvbnMpLmlzU2VydmVyLHI9dC51c2VDU1NPTUluamVjdGlvbixvPXQudGFyZ2V0LGU9bj9uZXcgVyhvKTpyP25ldyBIKG8pOm5ldyAkKG8pLG5ldyBqKGUpKSk7dmFyIGUsdCxuLHIsb30sdC5oYXNOYW1lRm9ySWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5uYW1lcy5oYXMoZSkmJnRoaXMubmFtZXMuZ2V0KGUpLmhhcyh0KX0sdC5yZWdpc3Rlck5hbWU9ZnVuY3Rpb24oZSx0KXtpZihWKGUpLHRoaXMubmFtZXMuaGFzKGUpKXRoaXMubmFtZXMuZ2V0KGUpLmFkZCh0KTtlbHNle3ZhciBuPW5ldyBTZXQ7bi5hZGQodCksdGhpcy5uYW1lcy5zZXQoZSxuKX19LHQuaW5zZXJ0UnVsZXM9ZnVuY3Rpb24oZSx0LG4pe3RoaXMucmVnaXN0ZXJOYW1lKGUsdCksdGhpcy5nZXRUYWcoKS5pbnNlcnRSdWxlcyhWKGUpLG4pfSx0LmNsZWFyTmFtZXM9ZnVuY3Rpb24oZSl7dGhpcy5uYW1lcy5oYXMoZSkmJnRoaXMubmFtZXMuZ2V0KGUpLmNsZWFyKCl9LHQuY2xlYXJSdWxlcz1mdW5jdGlvbihlKXt0aGlzLmdldFRhZygpLmNsZWFyR3JvdXAoVihlKSksdGhpcy5jbGVhck5hbWVzKGUpfSx0LmNsZWFyVGFnPWZ1bmN0aW9uKCl7dGhpcy50YWc9dm9pZCAwfSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmdldFRhZygpLG49dC5sZW5ndGgscj1cIlwiLG89MDtvPG47bysrKXt2YXIgcz1CKG8pO2lmKHZvaWQgMCE9PXMpe3ZhciBpPWUubmFtZXMuZ2V0KHMpLGE9dC5nZXRHcm91cChvKTtpZihpJiZhJiZpLnNpemUpe3ZhciBjPU4rXCIuZ1wiK28rJ1tpZD1cIicrcysnXCJdJyx1PVwiXCI7dm9pZCAwIT09aSYmaS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmxlbmd0aD4wJiYodSs9ZStcIixcIil9KSkscis9XCJcIithK2MrJ3tjb250ZW50OlwiJyt1KydcIn0vKiFzYyovXFxuJ319fXJldHVybiByfSh0aGlzKX0sZX0oKSxaPS8oYSkoZCkvZ2ksSz1mdW5jdGlvbihlKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlKyhlPjI1PzM5Ojk3KSl9O2Z1bmN0aW9uIFEoZSl7dmFyIHQsbj1cIlwiO2Zvcih0PU1hdGguYWJzKGUpO3Q+NTI7dD10LzUyfDApbj1LKHQlNTIpK247cmV0dXJuKEsodCU1MikrbikucmVwbGFjZShaLFwiJDEtJDJcIil9dmFyIGVlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQubGVuZ3RoO247KWU9MzMqZV50LmNoYXJDb2RlQXQoLS1uKTtyZXR1cm4gZX0sdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGVlKDUzODEsZSl9O2Z1bmN0aW9uIG5lKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCs9MSl7dmFyIG49ZVt0XTtpZihFKG4pJiYhXyhuKSlyZXR1cm4hMX1yZXR1cm4hMH12YXIgcmU9dGUoXCI1LjMuMTFcIiksb2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxuKXt0aGlzLnJ1bGVzPWUsdGhpcy5zdGF0aWNSdWxlc0lkPVwiXCIsdGhpcy5pc1N0YXRpYz1cInByb2R1Y3Rpb25cIj09PXByb2Nlc3MuZW52Lk5PREVfRU5WJiYodm9pZCAwPT09bnx8bi5pc1N0YXRpYykmJm5lKGUpLHRoaXMuY29tcG9uZW50SWQ9dCx0aGlzLmJhc2VIYXNoPWVlKHJlLHQpLHRoaXMuYmFzZVN0eWxlPW4sWC5yZWdpc3RlcklkKHQpfXJldHVybiBlLnByb3RvdHlwZS5nZW5lcmF0ZUFuZEluamVjdFN0eWxlcz1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5jb21wb25lbnRJZCxvPVtdO2lmKHRoaXMuYmFzZVN0eWxlJiZvLnB1c2godGhpcy5iYXNlU3R5bGUuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXMoZSx0LG4pKSx0aGlzLmlzU3RhdGljJiYhbi5oYXNoKWlmKHRoaXMuc3RhdGljUnVsZXNJZCYmdC5oYXNOYW1lRm9ySWQocix0aGlzLnN0YXRpY1J1bGVzSWQpKW8ucHVzaCh0aGlzLnN0YXRpY1J1bGVzSWQpO2Vsc2V7dmFyIHM9X2UodGhpcy5ydWxlcyxlLHQsbikuam9pbihcIlwiKSxpPVEoZWUodGhpcy5iYXNlSGFzaCxzKT4+PjApO2lmKCF0Lmhhc05hbWVGb3JJZChyLGkpKXt2YXIgYT1uKHMsXCIuXCIraSx2b2lkIDAscik7dC5pbnNlcnRSdWxlcyhyLGksYSl9by5wdXNoKGkpLHRoaXMuc3RhdGljUnVsZXNJZD1pfWVsc2V7Zm9yKHZhciBjPXRoaXMucnVsZXMubGVuZ3RoLHU9ZWUodGhpcy5iYXNlSGFzaCxuLmhhc2gpLGw9XCJcIixkPTA7ZDxjO2QrKyl7dmFyIGg9dGhpcy5ydWxlc1tkXTtpZihcInN0cmluZ1wiPT10eXBlb2YgaClsKz1oLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJih1PWVlKHUsaCtkKSk7ZWxzZSBpZihoKXt2YXIgcD1fZShoLGUsdCxuKSxmPUFycmF5LmlzQXJyYXkocCk/cC5qb2luKFwiXCIpOnA7dT1lZSh1LGYrZCksbCs9Zn19aWYobCl7dmFyIG09USh1Pj4+MCk7aWYoIXQuaGFzTmFtZUZvcklkKHIsbSkpe3ZhciB5PW4obCxcIi5cIittLHZvaWQgMCxyKTt0Lmluc2VydFJ1bGVzKHIsbSx5KX1vLnB1c2gobSl9fXJldHVybiBvLmpvaW4oXCIgXCIpfSxlfSgpLHNlPS9eXFxzKlxcL1xcLy4qJC9nbSxpZT1bXCI6XCIsXCJbXCIsXCIuXCIsXCIjXCJdO2Z1bmN0aW9uIGFlKGUpe3ZhciB0LG4scixvLHM9dm9pZCAwPT09ZT93OmUsaT1zLm9wdGlvbnMsYT12b2lkIDA9PT1pP3c6aSxjPXMucGx1Z2lucyx1PXZvaWQgMD09PWM/UzpjLGw9bmV3IGgoYSksZD1bXSxwPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7aWYodCl0cnl7ZSh0K1wifVwiKX1jYXRjaChlKXt9fXJldHVybiBmdW5jdGlvbihuLHIsbyxzLGksYSxjLHUsbCxkKXtzd2l0Y2gobil7Y2FzZSAxOmlmKDA9PT1sJiY2ND09PXIuY2hhckNvZGVBdCgwKSlyZXR1cm4gZShyK1wiO1wiKSxcIlwiO2JyZWFrO2Nhc2UgMjppZigwPT09dSlyZXR1cm4gcitcIi8qfCovXCI7YnJlYWs7Y2FzZSAzOnN3aXRjaCh1KXtjYXNlIDEwMjpjYXNlIDExMjpyZXR1cm4gZShvWzBdK3IpLFwiXCI7ZGVmYXVsdDpyZXR1cm4gcisoMD09PWQ/XCIvKnwqL1wiOlwiXCIpfWNhc2UtMjpyLnNwbGl0KFwiLyp8Ki99XCIpLmZvckVhY2godCl9fX0oKGZ1bmN0aW9uKGUpe2QucHVzaChlKX0pKSxmPWZ1bmN0aW9uKGUscixzKXtyZXR1cm4gMD09PXImJi0xIT09aWUuaW5kZXhPZihzW24ubGVuZ3RoXSl8fHMubWF0Y2gobyk/ZTpcIi5cIit0fTtmdW5jdGlvbiBtKGUscyxpLGEpe3ZvaWQgMD09PWEmJihhPVwiJlwiKTt2YXIgYz1lLnJlcGxhY2Uoc2UsXCJcIiksdT1zJiZpP2krXCIgXCIrcytcIiB7IFwiK2MrXCIgfVwiOmM7cmV0dXJuIHQ9YSxuPXMscj1uZXcgUmVnRXhwKFwiXFxcXFwiK24rXCJcXFxcYlwiLFwiZ1wiKSxvPW5ldyBSZWdFeHAoXCIoXFxcXFwiK24rXCJcXFxcYil7Mix9XCIpLGwoaXx8IXM/XCJcIjpzLHUpfXJldHVybiBsLnVzZShbXS5jb25jYXQodSxbZnVuY3Rpb24oZSx0LG8pezI9PT1lJiZvLmxlbmd0aCYmb1swXS5sYXN0SW5kZXhPZihuKT4wJiYob1swXT1vWzBdLnJlcGxhY2UocixmKSl9LHAsZnVuY3Rpb24oZSl7aWYoLTI9PT1lKXt2YXIgdD1kO3JldHVybiBkPVtdLHR9fV0pKSxtLmhhc2g9dS5sZW5ndGg/dS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubmFtZXx8RCgxNSksZWUoZSx0Lm5hbWUpfSksNTM4MSkudG9TdHJpbmcoKTpcIlwiLG19dmFyIGNlPXIuY3JlYXRlQ29udGV4dCgpLHVlPWNlLkNvbnN1bWVyLGxlPXIuY3JlYXRlQ29udGV4dCgpLGRlPShsZS5Db25zdW1lcixuZXcgWCksaGU9YWUoKTtmdW5jdGlvbiBwZSgpe3JldHVybiBzKGNlKXx8ZGV9ZnVuY3Rpb24gZmUoKXtyZXR1cm4gcyhsZSl8fGhlfWZ1bmN0aW9uIG1lKGUpe3ZhciB0PW8oZS5zdHlsaXNQbHVnaW5zKSxuPXRbMF0scz10WzFdLGM9cGUoKSx1PWkoKGZ1bmN0aW9uKCl7dmFyIHQ9YztyZXR1cm4gZS5zaGVldD90PWUuc2hlZXQ6ZS50YXJnZXQmJih0PXQucmVjb25zdHJ1Y3RXaXRoT3B0aW9ucyh7dGFyZ2V0OmUudGFyZ2V0fSwhMSkpLGUuZGlzYWJsZUNTU09NSW5qZWN0aW9uJiYodD10LnJlY29uc3RydWN0V2l0aE9wdGlvbnMoe3VzZUNTU09NSW5qZWN0aW9uOiExfSkpLHR9KSxbZS5kaXNhYmxlQ1NTT01JbmplY3Rpb24sZS5zaGVldCxlLnRhcmdldF0pLGw9aSgoZnVuY3Rpb24oKXtyZXR1cm4gYWUoe29wdGlvbnM6e3ByZWZpeDohZS5kaXNhYmxlVmVuZG9yUHJlZml4ZXN9LHBsdWdpbnM6bn0pfSksW2UuZGlzYWJsZVZlbmRvclByZWZpeGVzLG5dKTtyZXR1cm4gYSgoZnVuY3Rpb24oKXtkKG4sZS5zdHlsaXNQbHVnaW5zKXx8cyhlLnN0eWxpc1BsdWdpbnMpfSksW2Uuc3R5bGlzUGx1Z2luc10pLHIuY3JlYXRlRWxlbWVudChjZS5Qcm92aWRlcix7dmFsdWU6dX0sci5jcmVhdGVFbGVtZW50KGxlLlByb3ZpZGVyLHt2YWx1ZTpsfSxcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WP3IuQ2hpbGRyZW4ub25seShlLmNoaWxkcmVuKTplLmNoaWxkcmVuKSl9dmFyIHllPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3ZhciBuPXRoaXM7dGhpcy5pbmplY3Q9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD1oZSk7dmFyIHI9bi5uYW1lK3QuaGFzaDtlLmhhc05hbWVGb3JJZChuLmlkLHIpfHxlLmluc2VydFJ1bGVzKG4uaWQscix0KG4ucnVsZXMscixcIkBrZXlmcmFtZXNcIikpfSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEQoMTIsU3RyaW5nKG4ubmFtZSkpfSx0aGlzLm5hbWU9ZSx0aGlzLmlkPVwic2Mta2V5ZnJhbWVzLVwiK2UsdGhpcy5ydWxlcz10fXJldHVybiBlLnByb3RvdHlwZS5nZXROYW1lPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1oZSksdGhpcy5uYW1lK2UuaGFzaH0sZX0oKSx2ZT0vKFtBLVpdKS8sZ2U9LyhbQS1aXSkvZyxTZT0vXm1zLS8sd2U9ZnVuY3Rpb24oZSl7cmV0dXJuXCItXCIrZS50b0xvd2VyQ2FzZSgpfTtmdW5jdGlvbiBFZShlKXtyZXR1cm4gdmUudGVzdChlKT9lLnJlcGxhY2UoZ2Usd2UpLnJlcGxhY2UoU2UsXCItbXMtXCIpOmV9dmFyIGJlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lfHwhMT09PWV8fFwiXCI9PT1lfTtmdW5jdGlvbiBfZShlLG4scixvKXtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIHMsaT1bXSxhPTAsYz1lLmxlbmd0aDthPGM7YSs9MSlcIlwiIT09KHM9X2UoZVthXSxuLHIsbykpJiYoQXJyYXkuaXNBcnJheShzKT9pLnB1c2guYXBwbHkoaSxzKTppLnB1c2gocykpO3JldHVybiBpfWlmKGJlKGUpKXJldHVyblwiXCI7aWYoXyhlKSlyZXR1cm5cIi5cIitlLnN0eWxlZENvbXBvbmVudElkO2lmKEUoZSkpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mKGw9ZSl8fGwucHJvdG90eXBlJiZsLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50fHwhbilyZXR1cm4gZTt2YXIgdT1lKG4pO3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJnQodSkmJmNvbnNvbGUud2FybihiKGUpK1wiIGlzIG5vdCBhIHN0eWxlZCBjb21wb25lbnQgYW5kIGNhbm5vdCBiZSByZWZlcnJlZCB0byB2aWEgY29tcG9uZW50IHNlbGVjdG9yLiBTZWUgaHR0cHM6Ly93d3cuc3R5bGVkLWNvbXBvbmVudHMuY29tL2RvY3MvYWR2YW5jZWQjcmVmZXJyaW5nLXRvLW90aGVyLWNvbXBvbmVudHMgZm9yIG1vcmUgZGV0YWlscy5cIiksX2UodSxuLHIsbyl9dmFyIGw7cmV0dXJuIGUgaW5zdGFuY2VvZiB5ZT9yPyhlLmluamVjdChyLG8pLGUuZ2V0TmFtZShvKSk6ZTpnKGUpP2Z1bmN0aW9uIGUodCxuKXt2YXIgcixvLHM9W107Zm9yKHZhciBpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmIWJlKHRbaV0pJiYoQXJyYXkuaXNBcnJheSh0W2ldKSYmdFtpXS5pc0Nzc3x8RSh0W2ldKT9zLnB1c2goRWUoaSkrXCI6XCIsdFtpXSxcIjtcIik6Zyh0W2ldKT9zLnB1c2guYXBwbHkocyxlKHRbaV0saSkpOnMucHVzaChFZShpKStcIjogXCIrKHI9aSxudWxsPT0obz10W2ldKXx8XCJib29sZWFuXCI9PXR5cGVvZiBvfHxcIlwiPT09bz9cIlwiOlwibnVtYmVyXCIhPXR5cGVvZiBvfHwwPT09b3x8ciBpbiBwfHxyLnN0YXJ0c1dpdGgoXCItLVwiKT9TdHJpbmcobykudHJpbSgpOm8rXCJweFwiKStcIjtcIikpO3JldHVybiBuP1tuK1wiIHtcIl0uY29uY2F0KHMsW1wifVwiXSk6c30oZSk6ZS50b1N0cmluZygpfXZhciBOZT1mdW5jdGlvbihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKSYmKGUuaXNDc3M9ITApLGV9O2Z1bmN0aW9uIEFlKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCkscj0xO3I8dDtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtyZXR1cm4gRShlKXx8ZyhlKT9OZShfZSh2KFMsW2VdLmNvbmNhdChuKSkpKTowPT09bi5sZW5ndGgmJjE9PT1lLmxlbmd0aCYmXCJzdHJpbmdcIj09dHlwZW9mIGVbMF0/ZTpOZShfZSh2KGUsbikpKX12YXIgQ2U9L2ludmFsaWQgaG9vayBjYWxsL2ksSWU9bmV3IFNldCxQZT1mdW5jdGlvbihlLHQpe2lmKFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYpe3ZhciBuPVwiVGhlIGNvbXBvbmVudCBcIitlKyh0Pycgd2l0aCB0aGUgaWQgb2YgXCInK3QrJ1wiJzpcIlwiKStcIiBoYXMgYmVlbiBjcmVhdGVkIGR5bmFtaWNhbGx5LlxcbllvdSBtYXkgc2VlIHRoaXMgd2FybmluZyBiZWNhdXNlIHlvdSd2ZSBjYWxsZWQgc3R5bGVkIGluc2lkZSBhbm90aGVyIGNvbXBvbmVudC5cXG5UbyByZXNvbHZlIHRoaXMgb25seSBjcmVhdGUgbmV3IFN0eWxlZENvbXBvbmVudHMgb3V0c2lkZSBvZiBhbnkgcmVuZGVyIG1ldGhvZCBhbmQgZnVuY3Rpb24gY29tcG9uZW50LlwiLHI9Y29uc29sZS5lcnJvcjt0cnl7dmFyIG89ITA7Y29uc29sZS5lcnJvcj1mdW5jdGlvbihlKXtpZihDZS50ZXN0KGUpKW89ITEsSWUuZGVsZXRlKG4pO2Vsc2V7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscz1uZXcgQXJyYXkodD4xP3QtMTowKSxpPTE7aTx0O2krKylzW2ktMV09YXJndW1lbnRzW2ldO3IuYXBwbHkodm9pZCAwLFtlXS5jb25jYXQocykpfX0sYygpLG8mJiFJZS5oYXMobikmJihjb25zb2xlLndhcm4obiksSWUuYWRkKG4pKX1jYXRjaChlKXtDZS50ZXN0KGUubWVzc2FnZSkmJkllLmRlbGV0ZShuKX1maW5hbGx5e2NvbnNvbGUuZXJyb3I9cn19fSxPZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPXcpLGUudGhlbWUhPT1uLnRoZW1lJiZlLnRoZW1lfHx0fHxuLnRoZW1lfSxSZT0vWyFcIiMkJSYnKCkqKywuLzo7PD0+P0BbXFxcXFxcXV5ge3x9fi1dKy9nLERlPS8oXi18LSQpL2c7ZnVuY3Rpb24gamUoZSl7cmV0dXJuIGUucmVwbGFjZShSZSxcIi1cIikucmVwbGFjZShEZSxcIlwiKX12YXIgVGU9ZnVuY3Rpb24oZSl7cmV0dXJuIFEodGUoZSk+Pj4wKX07ZnVuY3Rpb24geGUoZSl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGUmJihcInByb2R1Y3Rpb25cIj09PXByb2Nlc3MuZW52Lk5PREVfRU5WfHxlLmNoYXJBdCgwKT09PWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkpfXZhciBrZT1mdW5jdGlvbihlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBlfHxcIm9iamVjdFwiPT10eXBlb2YgZSYmbnVsbCE9PWUmJiFBcnJheS5pc0FycmF5KGUpfSxWZT1mdW5jdGlvbihlKXtyZXR1cm5cIl9fcHJvdG9fX1wiIT09ZSYmXCJjb25zdHJ1Y3RvclwiIT09ZSYmXCJwcm90b3R5cGVcIiE9PWV9O2Z1bmN0aW9uIEJlKGUsdCxuKXt2YXIgcj1lW25dO2tlKHQpJiZrZShyKT96ZShyLHQpOmVbbl09dH1mdW5jdGlvbiB6ZShlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0PjE/dC0xOjApLHI9MTtyPHQ7cisrKW5bci0xXT1hcmd1bWVudHNbcl07Zm9yKHZhciBvPTAscz1uO288cy5sZW5ndGg7bysrKXt2YXIgaT1zW29dO2lmKGtlKGkpKWZvcih2YXIgYSBpbiBpKVZlKGEpJiZCZShlLGlbYV0sYSl9cmV0dXJuIGV9dmFyIE1lPXIuY3JlYXRlQ29udGV4dCgpLEdlPU1lLkNvbnN1bWVyO2Z1bmN0aW9uIExlKGUpe3ZhciB0PXMoTWUpLG49aSgoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZighZSlyZXR1cm4gRCgxNCk7aWYoRShlKSl7dmFyIG49ZSh0KTtyZXR1cm5cInByb2R1Y3Rpb25cIj09PXByb2Nlc3MuZW52Lk5PREVfRU5WfHxudWxsIT09biYmIUFycmF5LmlzQXJyYXkobikmJlwib2JqZWN0XCI9PXR5cGVvZiBuP246RCg3KX1yZXR1cm4gQXJyYXkuaXNBcnJheShlKXx8XCJvYmplY3RcIiE9dHlwZW9mIGU/RCg4KTp0P3koe30sdCx7fSxlKTplfShlLnRoZW1lLHQpfSksW2UudGhlbWUsdF0pO3JldHVybiBlLmNoaWxkcmVuP3IuY3JlYXRlRWxlbWVudChNZS5Qcm92aWRlcix7dmFsdWU6bn0sZS5jaGlsZHJlbik6bnVsbH12YXIgRmU9e307ZnVuY3Rpb24gWWUoZSx0LG4pe3ZhciBvPV8oZSksaT0heGUoZSksYT10LmF0dHJzLGM9dm9pZCAwPT09YT9TOmEsbD10LmNvbXBvbmVudElkLGQ9dm9pZCAwPT09bD9mdW5jdGlvbihlLHQpe3ZhciBuPVwic3RyaW5nXCIhPXR5cGVvZiBlP1wic2NcIjpqZShlKTtGZVtuXT0oRmVbbl18fDApKzE7dmFyIHI9bitcIi1cIitUZShcIjUuMy4xMVwiK24rRmVbbl0pO3JldHVybiB0P3QrXCItXCIrcjpyfSh0LmRpc3BsYXlOYW1lLHQucGFyZW50Q29tcG9uZW50SWQpOmwsaD10LmRpc3BsYXlOYW1lLHA9dm9pZCAwPT09aD9mdW5jdGlvbihlKXtyZXR1cm4geGUoZSk/XCJzdHlsZWQuXCIrZTpcIlN0eWxlZChcIitiKGUpK1wiKVwifShlKTpoLHY9dC5kaXNwbGF5TmFtZSYmdC5jb21wb25lbnRJZD9qZSh0LmRpc3BsYXlOYW1lKStcIi1cIit0LmNvbXBvbmVudElkOnQuY29tcG9uZW50SWR8fGQsZz1vJiZlLmF0dHJzP0FycmF5LnByb3RvdHlwZS5jb25jYXQoZS5hdHRycyxjKS5maWx0ZXIoQm9vbGVhbik6YyxOPXQuc2hvdWxkRm9yd2FyZFByb3A7byYmZS5zaG91bGRGb3J3YXJkUHJvcCYmKE49dC5zaG91bGRGb3J3YXJkUHJvcD9mdW5jdGlvbihuLHIsbyl7cmV0dXJuIGUuc2hvdWxkRm9yd2FyZFByb3AobixyLG8pJiZ0LnNob3VsZEZvcndhcmRQcm9wKG4scixvKX06ZS5zaG91bGRGb3J3YXJkUHJvcCk7dmFyIEEsQz1uZXcgb2Uobix2LG8/ZS5jb21wb25lbnRTdHlsZTp2b2lkIDApLEk9Qy5pc1N0YXRpYyYmMD09PWMubGVuZ3RoLFA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZS5hdHRycyxpPWUuY29tcG9uZW50U3R5bGUsYT1lLmRlZmF1bHRQcm9wcyxjPWUuZm9sZGVkQ29tcG9uZW50SWRzLGw9ZS5zaG91bGRGb3J3YXJkUHJvcCxkPWUuc3R5bGVkQ29tcG9uZW50SWQsaD1lLnRhcmdldCxwPWZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1lJiYoZT13KTt2YXIgcj15KHt9LHQse3RoZW1lOmV9KSxvPXt9O3JldHVybiBuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0LG4scyxpPWU7Zm9yKHQgaW4gRShpKSYmKGk9aShyKSksaSlyW3RdPW9bdF09XCJjbGFzc05hbWVcIj09PXQ/KG49b1t0XSxzPWlbdF0sbiYmcz9uK1wiIFwiK3M6bnx8cyk6aVt0XX0pKSxbcixvXX0oT2UodCxzKE1lKSxhKXx8dyx0LG8pLG09cFswXSx2PXBbMV0sZz1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1wZSgpLHM9ZmUoKSxpPXQ/ZS5nZW5lcmF0ZUFuZEluamVjdFN0eWxlcyh3LG8scyk6ZS5nZW5lcmF0ZUFuZEluamVjdFN0eWxlcyhuLG8scyk7cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmIXQmJnImJnIoaSksaX0oaSxyLG0sXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOVj9lLndhcm5Ub29NYW55Q2xhc3Nlczp2b2lkIDApLFM9bixiPXYuJGFzfHx0LiRhc3x8di5hc3x8dC5hc3x8aCxfPXhlKGIpLE49diE9PXQ/eSh7fSx0LHt9LHYpOnQsQT17fTtmb3IodmFyIEMgaW4gTilcIiRcIiE9PUNbMF0mJlwiYXNcIiE9PUMmJihcImZvcndhcmRlZEFzXCI9PT1DP0EuYXM9TltDXToobD9sKEMsZixiKTohX3x8ZihDKSkmJihBW0NdPU5bQ10pKTtyZXR1cm4gdC5zdHlsZSYmdi5zdHlsZSE9PXQuc3R5bGUmJihBLnN0eWxlPXkoe30sdC5zdHlsZSx7fSx2LnN0eWxlKSksQS5jbGFzc05hbWU9QXJyYXkucHJvdG90eXBlLmNvbmNhdChjLGQsZyE9PWQ/ZzpudWxsLHQuY2xhc3NOYW1lLHYuY2xhc3NOYW1lKS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIiksQS5yZWY9Uyx1KGIsQSl9KEEsZSx0LEkpfTtyZXR1cm4gUC5kaXNwbGF5TmFtZT1wLChBPXIuZm9yd2FyZFJlZihQKSkuYXR0cnM9ZyxBLmNvbXBvbmVudFN0eWxlPUMsQS5kaXNwbGF5TmFtZT1wLEEuc2hvdWxkRm9yd2FyZFByb3A9TixBLmZvbGRlZENvbXBvbmVudElkcz1vP0FycmF5LnByb3RvdHlwZS5jb25jYXQoZS5mb2xkZWRDb21wb25lbnRJZHMsZS5zdHlsZWRDb21wb25lbnRJZCk6UyxBLnN0eWxlZENvbXBvbmVudElkPXYsQS50YXJnZXQ9bz9lLnRhcmdldDplLEEud2l0aENvbXBvbmVudD1mdW5jdGlvbihlKXt2YXIgcj10LmNvbXBvbmVudElkLG89ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lKXJldHVybnt9O3ZhciBuLHIsbz17fSxzPU9iamVjdC5rZXlzKGUpO2ZvcihyPTA7cjxzLmxlbmd0aDtyKyspbj1zW3JdLHQuaW5kZXhPZihuKT49MHx8KG9bbl09ZVtuXSk7cmV0dXJuIG99KHQsW1wiY29tcG9uZW50SWRcIl0pLHM9ciYmcitcIi1cIisoeGUoZSk/ZTpqZShiKGUpKSk7cmV0dXJuIFllKGUseSh7fSxvLHthdHRyczpnLGNvbXBvbmVudElkOnN9KSxuKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KEEsXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvbGRlZERlZmF1bHRQcm9wc30sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2ZvbGRlZERlZmF1bHRQcm9wcz1vP3plKHt9LGUuZGVmYXVsdFByb3BzLHQpOnR9fSksXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmKFBlKHAsdiksQS53YXJuVG9vTWFueUNsYXNzZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fSxyPSExO3JldHVybiBmdW5jdGlvbihvKXtpZighciYmKG5bb109ITAsT2JqZWN0LmtleXMobikubGVuZ3RoPj0yMDApKXt2YXIgcz10Pycgd2l0aCB0aGUgaWQgb2YgXCInK3QrJ1wiJzpcIlwiO2NvbnNvbGUud2FybihcIk92ZXIgMjAwIGNsYXNzZXMgd2VyZSBnZW5lcmF0ZWQgZm9yIGNvbXBvbmVudCBcIitlK3MrXCIuXFxuQ29uc2lkZXIgdXNpbmcgdGhlIGF0dHJzIG1ldGhvZCwgdG9nZXRoZXIgd2l0aCBhIHN0eWxlIG9iamVjdCBmb3IgZnJlcXVlbnRseSBjaGFuZ2VkIHN0eWxlcy5cXG5FeGFtcGxlOlxcbiAgY29uc3QgQ29tcG9uZW50ID0gc3R5bGVkLmRpdi5hdHRycyhwcm9wcyA9PiAoe1xcbiAgICBzdHlsZToge1xcbiAgICAgIGJhY2tncm91bmQ6IHByb3BzLmJhY2tncm91bmQsXFxuICAgIH0sXFxuICB9KSlgd2lkdGg6IDEwMCU7YFxcblxcbiAgPENvbXBvbmVudCAvPlwiKSxyPSEwLG49e319fX0ocCx2KSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEEsXCJ0b1N0cmluZ1wiLHt2YWx1ZTpmdW5jdGlvbigpe3JldHVyblwiLlwiK0Euc3R5bGVkQ29tcG9uZW50SWR9fSksaSYmbShBLGUse2F0dHJzOiEwLGNvbXBvbmVudFN0eWxlOiEwLGRpc3BsYXlOYW1lOiEwLGZvbGRlZENvbXBvbmVudElkczohMCxzaG91bGRGb3J3YXJkUHJvcDohMCxzdHlsZWRDb21wb25lbnRJZDohMCx0YXJnZXQ6ITAsd2l0aENvbXBvbmVudDohMH0pLEF9dmFyIHFlPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBlKHQscixvKXtpZih2b2lkIDA9PT1vJiYobz13KSwhbihyKSlyZXR1cm4gRCgxLFN0cmluZyhyKSk7dmFyIHM9ZnVuY3Rpb24oKXtyZXR1cm4gdChyLG8sQWUuYXBwbHkodm9pZCAwLGFyZ3VtZW50cykpfTtyZXR1cm4gcy53aXRoQ29uZmlnPWZ1bmN0aW9uKG4pe3JldHVybiBlKHQscix5KHt9LG8se30sbikpfSxzLmF0dHJzPWZ1bmN0aW9uKG4pe3JldHVybiBlKHQscix5KHt9LG8se2F0dHJzOkFycmF5LnByb3RvdHlwZS5jb25jYXQoby5hdHRycyxuKS5maWx0ZXIoQm9vbGVhbil9KSl9LHN9KFllLGUpfTtbXCJhXCIsXCJhYmJyXCIsXCJhZGRyZXNzXCIsXCJhcmVhXCIsXCJhcnRpY2xlXCIsXCJhc2lkZVwiLFwiYXVkaW9cIixcImJcIixcImJhc2VcIixcImJkaVwiLFwiYmRvXCIsXCJiaWdcIixcImJsb2NrcXVvdGVcIixcImJvZHlcIixcImJyXCIsXCJidXR0b25cIixcImNhbnZhc1wiLFwiY2FwdGlvblwiLFwiY2l0ZVwiLFwiY29kZVwiLFwiY29sXCIsXCJjb2xncm91cFwiLFwiZGF0YVwiLFwiZGF0YWxpc3RcIixcImRkXCIsXCJkZWxcIixcImRldGFpbHNcIixcImRmblwiLFwiZGlhbG9nXCIsXCJkaXZcIixcImRsXCIsXCJkdFwiLFwiZW1cIixcImVtYmVkXCIsXCJmaWVsZHNldFwiLFwiZmlnY2FwdGlvblwiLFwiZmlndXJlXCIsXCJmb290ZXJcIixcImZvcm1cIixcImgxXCIsXCJoMlwiLFwiaDNcIixcImg0XCIsXCJoNVwiLFwiaDZcIixcImhlYWRcIixcImhlYWRlclwiLFwiaGdyb3VwXCIsXCJoclwiLFwiaHRtbFwiLFwiaVwiLFwiaWZyYW1lXCIsXCJpbWdcIixcImlucHV0XCIsXCJpbnNcIixcImtiZFwiLFwia2V5Z2VuXCIsXCJsYWJlbFwiLFwibGVnZW5kXCIsXCJsaVwiLFwibGlua1wiLFwibWFpblwiLFwibWFwXCIsXCJtYXJrXCIsXCJtYXJxdWVlXCIsXCJtZW51XCIsXCJtZW51aXRlbVwiLFwibWV0YVwiLFwibWV0ZXJcIixcIm5hdlwiLFwibm9zY3JpcHRcIixcIm9iamVjdFwiLFwib2xcIixcIm9wdGdyb3VwXCIsXCJvcHRpb25cIixcIm91dHB1dFwiLFwicFwiLFwicGFyYW1cIixcInBpY3R1cmVcIixcInByZVwiLFwicHJvZ3Jlc3NcIixcInFcIixcInJwXCIsXCJydFwiLFwicnVieVwiLFwic1wiLFwic2FtcFwiLFwic2NyaXB0XCIsXCJzZWN0aW9uXCIsXCJzZWxlY3RcIixcInNtYWxsXCIsXCJzb3VyY2VcIixcInNwYW5cIixcInN0cm9uZ1wiLFwic3R5bGVcIixcInN1YlwiLFwic3VtbWFyeVwiLFwic3VwXCIsXCJ0YWJsZVwiLFwidGJvZHlcIixcInRkXCIsXCJ0ZXh0YXJlYVwiLFwidGZvb3RcIixcInRoXCIsXCJ0aGVhZFwiLFwidGltZVwiLFwidGl0bGVcIixcInRyXCIsXCJ0cmFja1wiLFwidVwiLFwidWxcIixcInZhclwiLFwidmlkZW9cIixcIndiclwiLFwiY2lyY2xlXCIsXCJjbGlwUGF0aFwiLFwiZGVmc1wiLFwiZWxsaXBzZVwiLFwiZm9yZWlnbk9iamVjdFwiLFwiZ1wiLFwiaW1hZ2VcIixcImxpbmVcIixcImxpbmVhckdyYWRpZW50XCIsXCJtYXJrZXJcIixcIm1hc2tcIixcInBhdGhcIixcInBhdHRlcm5cIixcInBvbHlnb25cIixcInBvbHlsaW5lXCIsXCJyYWRpYWxHcmFkaWVudFwiLFwicmVjdFwiLFwic3RvcFwiLFwic3ZnXCIsXCJ0ZXh0XCIsXCJ0ZXh0UGF0aFwiLFwidHNwYW5cIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7cWVbZV09cWUoZSl9KSk7dmFyIEhlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3RoaXMucnVsZXM9ZSx0aGlzLmNvbXBvbmVudElkPXQsdGhpcy5pc1N0YXRpYz1uZShlKSxYLnJlZ2lzdGVySWQodGhpcy5jb21wb25lbnRJZCsxKX12YXIgdD1lLnByb3RvdHlwZTtyZXR1cm4gdC5jcmVhdGVTdHlsZXM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89cihfZSh0aGlzLnJ1bGVzLHQsbixyKS5qb2luKFwiXCIpLFwiXCIpLHM9dGhpcy5jb21wb25lbnRJZCtlO24uaW5zZXJ0UnVsZXMocyxzLG8pfSx0LnJlbW92ZVN0eWxlcz1mdW5jdGlvbihlLHQpe3QuY2xlYXJSdWxlcyh0aGlzLmNvbXBvbmVudElkK2UpfSx0LnJlbmRlclN0eWxlcz1mdW5jdGlvbihlLHQsbixyKXtlPjImJlgucmVnaXN0ZXJJZCh0aGlzLmNvbXBvbmVudElkK2UpLHRoaXMucmVtb3ZlU3R5bGVzKGUsbiksdGhpcy5jcmVhdGVTdHlsZXMoZSx0LG4scil9LGV9KCk7ZnVuY3Rpb24gJGUoZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodD4xP3QtMTowKSxvPTE7bzx0O28rKyluW28tMV09YXJndW1lbnRzW29dO3ZhciBpPUFlLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KG4pKSxhPVwic2MtZ2xvYmFsLVwiK1RlKEpTT04uc3RyaW5naWZ5KGkpKSx1PW5ldyBIZShpLGEpO2Z1bmN0aW9uIGQoZSl7dmFyIHQ9cGUoKSxuPWZlKCksbz1zKE1lKSxkPWModC5hbGxvY2F0ZUdTSW5zdGFuY2UoYSkpLmN1cnJlbnQ7cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmci5DaGlsZHJlbi5jb3VudChlLmNoaWxkcmVuKSYmY29uc29sZS53YXJuKFwiVGhlIGdsb2JhbCBzdHlsZSBjb21wb25lbnQgXCIrYStcIiB3YXMgZ2l2ZW4gY2hpbGQgSlNYLiBjcmVhdGVHbG9iYWxTdHlsZSBkb2VzIG5vdCByZW5kZXIgY2hpbGRyZW4uXCIpLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJmkuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGUmJi0xIT09ZS5pbmRleE9mKFwiQGltcG9ydFwiKX0pKSYmY29uc29sZS53YXJuKFwiUGxlYXNlIGRvIG5vdCB1c2UgQGltcG9ydCBDU1Mgc3ludGF4IGluIGNyZWF0ZUdsb2JhbFN0eWxlIGF0IHRoaXMgdGltZSwgYXMgdGhlIENTU09NIEFQSXMgd2UgdXNlIGluIHByb2R1Y3Rpb24gZG8gbm90IGhhbmRsZSBpdCB3ZWxsLiBJbnN0ZWFkLCB3ZSByZWNvbW1lbmQgdXNpbmcgYSBsaWJyYXJ5IHN1Y2ggYXMgcmVhY3QtaGVsbWV0IHRvIGluamVjdCBhIHR5cGljYWwgPGxpbms+IG1ldGEgdGFnIHRvIHRoZSBzdHlsZXNoZWV0LCBvciBzaW1wbHkgZW1iZWRkaW5nIGl0IG1hbnVhbGx5IGluIHlvdXIgaW5kZXguaHRtbCA8aGVhZD4gc2VjdGlvbiBmb3IgYSBzaW1wbGVyIGFwcC5cIiksdC5zZXJ2ZXImJmgoZCxlLHQsbyxuKSxsKChmdW5jdGlvbigpe2lmKCF0LnNlcnZlcilyZXR1cm4gaChkLGUsdCxvLG4pLGZ1bmN0aW9uKCl7cmV0dXJuIHUucmVtb3ZlU3R5bGVzKGQsdCl9fSksW2QsZSx0LG8sbl0pLG51bGx9ZnVuY3Rpb24gaChlLHQsbixyLG8pe2lmKHUuaXNTdGF0aWMpdS5yZW5kZXJTdHlsZXMoZSxQLG4sbyk7ZWxzZXt2YXIgcz15KHt9LHQse3RoZW1lOk9lKHQscixkLmRlZmF1bHRQcm9wcyl9KTt1LnJlbmRlclN0eWxlcyhlLHMsbixvKX19cmV0dXJuXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmUGUoYSksci5tZW1vKGQpfWZ1bmN0aW9uIFdlKGUpe1wicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBuYXZpZ2F0b3ImJlwiUmVhY3ROYXRpdmVcIj09PW5hdmlnYXRvci5wcm9kdWN0JiZjb25zb2xlLndhcm4oXCJga2V5ZnJhbWVzYCBjYW5ub3QgYmUgdXNlZCBvbiBSZWFjdE5hdGl2ZSwgb25seSBvbiB0aGUgd2ViLiBUbyBkbyBhbmltYXRpb24gaW4gUmVhY3ROYXRpdmUgcGxlYXNlIHVzZSBBbmltYXRlZC5cIik7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodD4xP3QtMTowKSxyPTE7cjx0O3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3ZhciBvPUFlLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KG4pKS5qb2luKFwiXCIpLHM9VGUobyk7cmV0dXJuIG5ldyB5ZShzLG8pfXZhciBVZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzO3RoaXMuX2VtaXRTaGVldENTUz1mdW5jdGlvbigpe3ZhciB0PWUuaW5zdGFuY2UudG9TdHJpbmcoKTtpZighdClyZXR1cm5cIlwiO3ZhciBuPVkoKTtyZXR1cm5cIjxzdHlsZSBcIitbbiYmJ25vbmNlPVwiJytuKydcIicsTisnPVwidHJ1ZVwiJywnZGF0YS1zdHlsZWQtdmVyc2lvbj1cIjUuMy4xMVwiJ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpK1wiPlwiK3QrXCI8L3N0eWxlPlwifSx0aGlzLmdldFN0eWxlVGFncz1mdW5jdGlvbigpe3JldHVybiBlLnNlYWxlZD9EKDIpOmUuX2VtaXRTaGVldENTUygpfSx0aGlzLmdldFN0eWxlRWxlbWVudD1mdW5jdGlvbigpe3ZhciB0O2lmKGUuc2VhbGVkKXJldHVybiBEKDIpO3ZhciBuPSgodD17fSlbTl09XCJcIix0W1wiZGF0YS1zdHlsZWQtdmVyc2lvblwiXT1cIjUuMy4xMVwiLHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e19faHRtbDplLmluc3RhbmNlLnRvU3RyaW5nKCl9LHQpLG89WSgpO3JldHVybiBvJiYobi5ub25jZT1vKSxbci5jcmVhdGVFbGVtZW50KFwic3R5bGVcIix5KHt9LG4se2tleTpcInNjLTAtMFwifSkpXX0sdGhpcy5zZWFsPWZ1bmN0aW9uKCl7ZS5zZWFsZWQ9ITB9LHRoaXMuaW5zdGFuY2U9bmV3IFgoe2lzU2VydmVyOiEwfSksdGhpcy5zZWFsZWQ9ITF9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuY29sbGVjdFN0eWxlcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zZWFsZWQ/RCgyKTpyLmNyZWF0ZUVsZW1lbnQobWUse3NoZWV0OnRoaXMuaW5zdGFuY2V9LGUpfSx0LmludGVybGVhdmVXaXRoTm9kZVN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gRCgzKX0sZX0oKSxKZT1mdW5jdGlvbihlKXt2YXIgdD1yLmZvcndhcmRSZWYoKGZ1bmN0aW9uKHQsbil7dmFyIG89cyhNZSksaT1lLmRlZmF1bHRQcm9wcyxhPU9lKHQsbyxpKTtyZXR1cm5cInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZ2b2lkIDA9PT1hJiZjb25zb2xlLndhcm4oJ1t3aXRoVGhlbWVdIFlvdSBhcmUgbm90IHVzaW5nIGEgVGhlbWVQcm92aWRlciBub3IgcGFzc2luZyBhIHRoZW1lIHByb3Agb3IgYSB0aGVtZSBpbiBkZWZhdWx0UHJvcHMgaW4gY29tcG9uZW50IGNsYXNzIFwiJytiKGUpKydcIicpLHIuY3JlYXRlRWxlbWVudChlLHkoe30sdCx7dGhlbWU6YSxyZWY6bn0pKX0pKTtyZXR1cm4gbSh0LGUpLHQuZGlzcGxheU5hbWU9XCJXaXRoVGhlbWUoXCIrYihlKStcIilcIix0fSxYZT1mdW5jdGlvbigpe3JldHVybiBzKE1lKX0sWmU9e1N0eWxlU2hlZXQ6WCxtYXN0ZXJTaGVldDpkZX07XCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG5hdmlnYXRvciYmXCJSZWFjdE5hdGl2ZVwiPT09bmF2aWdhdG9yLnByb2R1Y3QmJmNvbnNvbGUud2FybihcIkl0IGxvb2tzIGxpa2UgeW91J3ZlIGltcG9ydGVkICdzdHlsZWQtY29tcG9uZW50cycgb24gUmVhY3QgTmF0aXZlLlxcblBlcmhhcHMgeW91J3JlIGxvb2tpbmcgdG8gaW1wb3J0ICdzdHlsZWQtY29tcG9uZW50cy9uYXRpdmUnP1xcblJlYWQgbW9yZSBhYm91dCB0aGlzIGF0IGh0dHBzOi8vd3d3LnN0eWxlZC1jb21wb25lbnRzLmNvbS9kb2NzL2Jhc2ljcyNyZWFjdC1uYXRpdmVcIiksXCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmXCJ0ZXN0XCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvd1tcIl9fc3R5bGVkLWNvbXBvbmVudHMtaW5pdF9fXCJdPXdpbmRvd1tcIl9fc3R5bGVkLWNvbXBvbmVudHMtaW5pdF9fXCJdfHwwLDE9PT13aW5kb3dbXCJfX3N0eWxlZC1jb21wb25lbnRzLWluaXRfX1wiXSYmY29uc29sZS53YXJuKFwiSXQgbG9va3MgbGlrZSB0aGVyZSBhcmUgc2V2ZXJhbCBpbnN0YW5jZXMgb2YgJ3N0eWxlZC1jb21wb25lbnRzJyBpbml0aWFsaXplZCBpbiB0aGlzIGFwcGxpY2F0aW9uLiBUaGlzIG1heSBjYXVzZSBkeW5hbWljIHN0eWxlcyB0byBub3QgcmVuZGVyIHByb3Blcmx5LCBlcnJvcnMgZHVyaW5nIHRoZSByZWh5ZHJhdGlvbiBwcm9jZXNzLCBhIG1pc3NpbmcgdGhlbWUgcHJvcCwgYW5kIG1ha2VzIHlvdXIgYXBwbGljYXRpb24gYmlnZ2VyIHdpdGhvdXQgZ29vZCByZWFzb24uXFxuXFxuU2VlIGh0dHBzOi8vcy1jLnNoLzJCQVh6ZWQgZm9yIG1vcmUgaW5mby5cIiksd2luZG93W1wiX19zdHlsZWQtY29tcG9uZW50cy1pbml0X19cIl0rPTEpO2V4cG9ydCBkZWZhdWx0IHFlO2V4cG9ydHtVZSBhcyBTZXJ2ZXJTdHlsZVNoZWV0LHVlIGFzIFN0eWxlU2hlZXRDb25zdW1lcixjZSBhcyBTdHlsZVNoZWV0Q29udGV4dCxtZSBhcyBTdHlsZVNoZWV0TWFuYWdlcixHZSBhcyBUaGVtZUNvbnN1bWVyLE1lIGFzIFRoZW1lQ29udGV4dCxMZSBhcyBUaGVtZVByb3ZpZGVyLFplIGFzIF9fUFJJVkFURV9fLCRlIGFzIGNyZWF0ZUdsb2JhbFN0eWxlLEFlIGFzIGNzcyxfIGFzIGlzU3R5bGVkQ29tcG9uZW50LFdlIGFzIGtleWZyYW1lcyxYZSBhcyB1c2VUaGVtZSxBIGFzIHZlcnNpb24sSmUgYXMgd2l0aFRoZW1lfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0eWxlZC1jb21wb25lbnRzLmJyb3dzZXIuZXNtLmpzLm1hcFxuIiwidmFyIHVuaXRsZXNzS2V5cyA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IDEsXG4gIGJvcmRlckltYWdlT3V0c2V0OiAxLFxuICBib3JkZXJJbWFnZVNsaWNlOiAxLFxuICBib3JkZXJJbWFnZVdpZHRoOiAxLFxuICBib3hGbGV4OiAxLFxuICBib3hGbGV4R3JvdXA6IDEsXG4gIGJveE9yZGluYWxHcm91cDogMSxcbiAgY29sdW1uQ291bnQ6IDEsXG4gIGNvbHVtbnM6IDEsXG4gIGZsZXg6IDEsXG4gIGZsZXhHcm93OiAxLFxuICBmbGV4UG9zaXRpdmU6IDEsXG4gIGZsZXhTaHJpbms6IDEsXG4gIGZsZXhOZWdhdGl2ZTogMSxcbiAgZmxleE9yZGVyOiAxLFxuICBncmlkUm93OiAxLFxuICBncmlkUm93RW5kOiAxLFxuICBncmlkUm93U3BhbjogMSxcbiAgZ3JpZFJvd1N0YXJ0OiAxLFxuICBncmlkQ29sdW1uOiAxLFxuICBncmlkQ29sdW1uRW5kOiAxLFxuICBncmlkQ29sdW1uU3BhbjogMSxcbiAgZ3JpZENvbHVtblN0YXJ0OiAxLFxuICBtc0dyaWRSb3c6IDEsXG4gIG1zR3JpZFJvd1NwYW46IDEsXG4gIG1zR3JpZENvbHVtbjogMSxcbiAgbXNHcmlkQ29sdW1uU3BhbjogMSxcbiAgZm9udFdlaWdodDogMSxcbiAgbGluZUhlaWdodDogMSxcbiAgb3BhY2l0eTogMSxcbiAgb3JkZXI6IDEsXG4gIG9ycGhhbnM6IDEsXG4gIHRhYlNpemU6IDEsXG4gIHdpZG93czogMSxcbiAgekluZGV4OiAxLFxuICB6b29tOiAxLFxuICBXZWJraXRMaW5lQ2xhbXA6IDEsXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IDEsXG4gIGZsb29kT3BhY2l0eTogMSxcbiAgc3RvcE9wYWNpdHk6IDEsXG4gIHN0cm9rZURhc2hhcnJheTogMSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogMSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogMSxcbiAgc3Ryb2tlT3BhY2l0eTogMSxcbiAgc3Ryb2tlV2lkdGg6IDFcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHVuaXRsZXNzS2V5cztcbiIsIi8qIVxuKiB0YWJiYWJsZSA2LjIuMFxuKiBAbGljZW5zZSBNSVQsIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL3RhYmJhYmxlL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiovXG4vLyBOT1RFOiBzZXBhcmF0ZSBgOm5vdCgpYCBzZWxlY3RvcnMgaGFzIGJyb2FkZXIgYnJvd3NlciBzdXBwb3J0IHRoYW4gdGhlIG5ld2VyXG4vLyAgYDpub3QoW2luZXJ0XSwgW2luZXJ0XSAqKWAgKEZlYiAyMDIzKVxuLy8gQ0FSRUZVTDogSlNEb20gZG9lcyBub3Qgc3VwcG9ydCBgOm5vdChbaW5lcnRdICopYCBhcyBhIHNlbGVjdG9yOyB1c2luZyBpdCBjYXVzZXNcbi8vICB0aGUgZW50aXJlIHF1ZXJ5IHRvIGZhaWwsIHJlc3VsdGluZyBpbiBubyBub2RlcyBmb3VuZCwgd2hpY2ggd2lsbCBicmVhayBhIGxvdFxuLy8gIG9mIHRoaW5ncy4uLiBzbyB3ZSBoYXZlIHRvIHJlbHkgb24gSlMgdG8gaWRlbnRpZnkgbm9kZXMgaW5zaWRlIGFuIGluZXJ0IGNvbnRhaW5lclxudmFyIGNhbmRpZGF0ZVNlbGVjdG9ycyA9IFsnaW5wdXQ6bm90KFtpbmVydF0pJywgJ3NlbGVjdDpub3QoW2luZXJ0XSknLCAndGV4dGFyZWE6bm90KFtpbmVydF0pJywgJ2FbaHJlZl06bm90KFtpbmVydF0pJywgJ2J1dHRvbjpub3QoW2luZXJ0XSknLCAnW3RhYmluZGV4XTpub3Qoc2xvdCk6bm90KFtpbmVydF0pJywgJ2F1ZGlvW2NvbnRyb2xzXTpub3QoW2luZXJ0XSknLCAndmlkZW9bY29udHJvbHNdOm5vdChbaW5lcnRdKScsICdbY29udGVudGVkaXRhYmxlXTpub3QoW2NvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJdKTpub3QoW2luZXJ0XSknLCAnZGV0YWlscz5zdW1tYXJ5OmZpcnN0LW9mLXR5cGU6bm90KFtpbmVydF0pJywgJ2RldGFpbHM6bm90KFtpbmVydF0pJ107XG52YXIgY2FuZGlkYXRlU2VsZWN0b3IgPSAvKiAjX19QVVJFX18gKi9jYW5kaWRhdGVTZWxlY3RvcnMuam9pbignLCcpO1xudmFyIE5vRWxlbWVudCA9IHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJztcbnZhciBtYXRjaGVzID0gTm9FbGVtZW50ID8gZnVuY3Rpb24gKCkge30gOiBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzIHx8IEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3RvcjtcbnZhciBnZXRSb290Tm9kZSA9ICFOb0VsZW1lbnQgJiYgRWxlbWVudC5wcm90b3R5cGUuZ2V0Um9vdE5vZGUgPyBmdW5jdGlvbiAoZWxlbWVudCkge1xuICB2YXIgX2VsZW1lbnQkZ2V0Um9vdE5vZGU7XG4gIHJldHVybiBlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfZWxlbWVudCRnZXRSb290Tm9kZSA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUpID09PSBudWxsIHx8IF9lbGVtZW50JGdldFJvb3ROb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZWxlbWVudCRnZXRSb290Tm9kZS5jYWxsKGVsZW1lbnQpO1xufSA6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIG5vZGUgaXMgaW5lcnQgb3IgaW4gYW4gaW5lcnQgYW5jZXN0b3IuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IFtub2RlXVxuICogQHBhcmFtIHtib29sZWFufSBbbG9va1VwXSBJZiB0cnVlIGFuZCBgbm9kZWAgaXMgbm90IGluZXJ0LCBsb29rcyB1cCBhdCBhbmNlc3RvcnMgdG9cbiAqICBzZWUgaWYgYW55IG9mIHRoZW0gYXJlIGluZXJ0LiBJZiBmYWxzZSwgb25seSBgbm9kZWAgaXRzZWxmIGlzIGNvbnNpZGVyZWQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBpbmVydCBpdHNlbGYgb3IgYnkgd2F5IG9mIGJlaW5nIGluIGFuIGluZXJ0IGFuY2VzdG9yLlxuICogIEZhbHNlIGlmIGBub2RlYCBpcyBmYWxzeS5cbiAqL1xudmFyIGlzSW5lcnQgPSBmdW5jdGlvbiBpc0luZXJ0KG5vZGUsIGxvb2tVcCkge1xuICB2YXIgX25vZGUkZ2V0QXR0cmlidXRlO1xuICBpZiAobG9va1VwID09PSB2b2lkIDApIHtcbiAgICBsb29rVXAgPSB0cnVlO1xuICB9XG4gIC8vIENBUkVGVUw6IEpTRG9tIGRvZXMgbm90IHN1cHBvcnQgaW5lcnQgYXQgYWxsLCBzbyB3ZSBjYW4ndCB1c2UgdGhlIGBIVE1MRWxlbWVudC5pbmVydGBcbiAgLy8gIEpTIEFQSSBwcm9wZXJ0eTsgd2UgaGF2ZSB0byBjaGVjayB0aGUgYXR0cmlidXRlLCB3aGljaCBjYW4gZWl0aGVyIGJlIGVtcHR5IG9yICd0cnVlJztcbiAgLy8gIGlmIGl0J3MgYG51bGxgIChub3Qgc3BlY2lmaWVkKSBvciAnZmFsc2UnLCBpdCdzIGFuIGFjdGl2ZSBlbGVtZW50XG4gIHZhciBpbmVydEF0dCA9IG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9ub2RlJGdldEF0dHJpYnV0ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKSA9PT0gbnVsbCB8fCBfbm9kZSRnZXRBdHRyaWJ1dGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ub2RlJGdldEF0dHJpYnV0ZS5jYWxsKG5vZGUsICdpbmVydCcpO1xuICB2YXIgaW5lcnQgPSBpbmVydEF0dCA9PT0gJycgfHwgaW5lcnRBdHQgPT09ICd0cnVlJztcblxuICAvLyBOT1RFOiB0aGlzIGNvdWxkIGFsc28gYmUgaGFuZGxlZCB3aXRoIGBub2RlLm1hdGNoZXMoJ1tpbmVydF0sIDppcyhbaW5lcnRdICopJylgXG4gIC8vICBpZiBpdCB3ZXJlbid0IGZvciBgbWF0Y2hlcygpYCBub3QgYmVpbmcgYSBmdW5jdGlvbiBvbiBzaGFkb3cgcm9vdHM7IHRoZSBmb2xsb3dpbmdcbiAgLy8gIGNvZGUgd29ya3MgZm9yIGFueSBraW5kIG9mIG5vZGVcbiAgLy8gQ0FSRUZVTDogSlNEb20gZG9lcyBub3QgYXBwZWFyIHRvIHN1cHBvcnQgY2VydGFpbiBzZWxlY3RvcnMgbGlrZSBgOm5vdChbaW5lcnRdICopYFxuICAvLyAgc28gaXQgbGlrZWx5IHdvdWxkIG5vdCBzdXBwb3J0IGA6aXMoW2luZXJ0XSAqKWAgZWl0aGVyLi4uXG4gIHZhciByZXN1bHQgPSBpbmVydCB8fCBsb29rVXAgJiYgbm9kZSAmJiBpc0luZXJ0KG5vZGUucGFyZW50Tm9kZSk7IC8vIHJlY3Vyc2l2ZVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBub2RlJ3MgY29udGVudCBpcyBlZGl0YWJsZS5cbiAqIEBwYXJhbSB7RWxlbWVudH0gW25vZGVdXG4gKiBAcmV0dXJucyBUcnVlIGlmIGl0J3MgY29udGVudC1lZGl0YWJsZTsgZmFsc2UgaWYgaXQncyBub3Qgb3IgYG5vZGVgIGlzIGZhbHN5LlxuICovXG52YXIgaXNDb250ZW50RWRpdGFibGUgPSBmdW5jdGlvbiBpc0NvbnRlbnRFZGl0YWJsZShub2RlKSB7XG4gIHZhciBfbm9kZSRnZXRBdHRyaWJ1dGUyO1xuICAvLyBDQVJFRlVMOiBKU0RvbSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgSFRNTEVsZW1lbnQuaXNDb250ZW50RWRpdGFibGVgIEFQSSBzbyB3ZSBoYXZlXG4gIC8vICB0byB1c2UgdGhlIGF0dHJpYnV0ZSBkaXJlY3RseSB0byBjaGVjayBmb3IgdGhpcywgd2hpY2ggY2FuIGVpdGhlciBiZSBlbXB0eSBvciAndHJ1ZSc7XG4gIC8vICBpZiBpdCdzIGBudWxsYCAobm90IHNwZWNpZmllZCkgb3IgJ2ZhbHNlJywgaXQncyBhIG5vbi1lZGl0YWJsZSBlbGVtZW50XG4gIHZhciBhdHRWYWx1ZSA9IG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9ub2RlJGdldEF0dHJpYnV0ZTIgPSBub2RlLmdldEF0dHJpYnV0ZSkgPT09IG51bGwgfHwgX25vZGUkZ2V0QXR0cmlidXRlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX25vZGUkZ2V0QXR0cmlidXRlMi5jYWxsKG5vZGUsICdjb250ZW50ZWRpdGFibGUnKTtcbiAgcmV0dXJuIGF0dFZhbHVlID09PSAnJyB8fCBhdHRWYWx1ZSA9PT0gJ3RydWUnO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIGNvbnRhaW5lciB0byBjaGVjayBpblxuICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQ29udGFpbmVyIGFkZCBjb250YWluZXIgdG8gY2hlY2tcbiAqIEBwYXJhbSB7KG5vZGU6IEVsZW1lbnQpID0+IGJvb2xlYW59IGZpbHRlciBmaWx0ZXIgY2FuZGlkYXRlc1xuICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAqL1xudmFyIGdldENhbmRpZGF0ZXMgPSBmdW5jdGlvbiBnZXRDYW5kaWRhdGVzKGVsLCBpbmNsdWRlQ29udGFpbmVyLCBmaWx0ZXIpIHtcbiAgLy8gZXZlbiBpZiBgaW5jbHVkZUNvbnRhaW5lcj1mYWxzZWAsIHdlIHN0aWxsIGhhdmUgdG8gY2hlY2sgaXQgZm9yIGluZXJ0bmVzcyBiZWNhdXNlXG4gIC8vICBpZiBpdCdzIGluZXJ0LCBhbGwgaXRzIGNoaWxkcmVuIGFyZSBpbmVydFxuICBpZiAoaXNJbmVydChlbCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGNhbmRpZGF0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoZWwucXVlcnlTZWxlY3RvckFsbChjYW5kaWRhdGVTZWxlY3RvcikpO1xuICBpZiAoaW5jbHVkZUNvbnRhaW5lciAmJiBtYXRjaGVzLmNhbGwoZWwsIGNhbmRpZGF0ZVNlbGVjdG9yKSkge1xuICAgIGNhbmRpZGF0ZXMudW5zaGlmdChlbCk7XG4gIH1cbiAgY2FuZGlkYXRlcyA9IGNhbmRpZGF0ZXMuZmlsdGVyKGZpbHRlcik7XG4gIHJldHVybiBjYW5kaWRhdGVzO1xufTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0U2hhZG93Um9vdFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IHRvIGNoZWNrIGZvciBzaGFkb3cgcm9vdFxuICogQHJldHVybnMge1NoYWRvd1Jvb3R8Ym9vbGVhbn0gU2hhZG93Um9vdCBpZiBhdmFpbGFibGUgb3IgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGEgc2hhZG93Um9vdCBpcyBhdHRhY2hlZCBidXQgbm90IGF2YWlsYWJsZS5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTaGFkb3dSb290RmlsdGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHNoYWRvd0hvc3ROb2RlIHRoZSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHNoYWRvdyBjb250ZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhIHNoYWRvdyByb290IGNvdWxkIHBvdGVudGlhbGx5IGNvbnRhaW4gdmFsaWQgY2FuZGlkYXRlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENhbmRpZGF0ZVNjb3BlXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHNjb3BlUGFyZW50IGNvbnRhaW5zIGlubmVyIGNhbmRpZGF0ZXNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBjYW5kaWRhdGVzIGxpc3Qgb2YgY2FuZGlkYXRlcyBmb3VuZCBpbiB0aGUgc2NvcGUgcGFyZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJdGVyYXRpdmVPcHRpb25zXG4gKiBAcHJvcGVydHkge0dldFNoYWRvd1Jvb3R8Ym9vbGVhbn0gZ2V0U2hhZG93Um9vdCB0cnVlIGlmIHNoYWRvdyBzdXBwb3J0IGlzIGVuYWJsZWQ7IGZhbHN5IGlmIG5vdDtcbiAqICBpZiBhIGZ1bmN0aW9uLCBpbXBsaWVzIHNoYWRvdyBzdXBwb3J0IGlzIGVuYWJsZWQgYW5kIGVpdGhlciByZXR1cm5zIHRoZSBzaGFkb3cgcm9vdCBvZiBhbiBlbGVtZW50XG4gKiAgb3IgYSBib29sZWFuIHN0YXRpbmcgaWYgaXQgaGFzIGFuIHVuZGlzY2xvc2VkIHNoYWRvdyByb290XG4gKiBAcHJvcGVydHkgeyhub2RlOiBFbGVtZW50KSA9PiBib29sZWFufSBmaWx0ZXIgZmlsdGVyIGNhbmRpZGF0ZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZmxhdHRlbiBpZiB0cnVlIHRoZW4gcmVzdWx0IHdpbGwgZmxhdHRlbiBhbnkgQ2FuZGlkYXRlU2NvcGUgaW50byB0aGUgcmV0dXJuZWQgbGlzdFxuICogQHByb3BlcnR5IHtTaGFkb3dSb290RmlsdGVyfSBzaGFkb3dSb290RmlsdGVyIGZpbHRlciBzaGFkb3cgcm9vdHM7XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnRbXX0gZWxlbWVudHMgbGlzdCBvZiBlbGVtZW50IGNvbnRhaW5lcnMgdG8gbWF0Y2ggY2FuZGlkYXRlcyBmcm9tXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVDb250YWluZXIgYWRkIGNvbnRhaW5lciBsaXN0IHRvIGNoZWNrXG4gKiBAcGFyYW0ge0l0ZXJhdGl2ZU9wdGlvbnN9IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtBcnJheS48RWxlbWVudHxDYW5kaWRhdGVTY29wZT59XG4gKi9cbnZhciBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkgPSBmdW5jdGlvbiBnZXRDYW5kaWRhdGVzSXRlcmF0aXZlbHkoZWxlbWVudHMsIGluY2x1ZGVDb250YWluZXIsIG9wdGlvbnMpIHtcbiAgdmFyIGNhbmRpZGF0ZXMgPSBbXTtcbiAgdmFyIGVsZW1lbnRzVG9DaGVjayA9IEFycmF5LmZyb20oZWxlbWVudHMpO1xuICB3aGlsZSAoZWxlbWVudHNUb0NoZWNrLmxlbmd0aCkge1xuICAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNUb0NoZWNrLnNoaWZ0KCk7XG4gICAgaWYgKGlzSW5lcnQoZWxlbWVudCwgZmFsc2UpKSB7XG4gICAgICAvLyBubyBuZWVkIHRvIGxvb2sgdXAgc2luY2Ugd2UncmUgZHJpbGxpbmcgZG93blxuICAgICAgLy8gYW55dGhpbmcgaW5zaWRlIHRoaXMgY29udGFpbmVyIHdpbGwgYWxzbyBiZSBpbmVydFxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTTE9UJykge1xuICAgICAgLy8gYWRkIHNoYWRvdyBkb20gc2xvdCBzY29wZSAoc2xvdCBpdHNlbGYgY2Fubm90IGJlIGZvY3VzYWJsZSlcbiAgICAgIHZhciBhc3NpZ25lZCA9IGVsZW1lbnQuYXNzaWduZWRFbGVtZW50cygpO1xuICAgICAgdmFyIGNvbnRlbnQgPSBhc3NpZ25lZC5sZW5ndGggPyBhc3NpZ25lZCA6IGVsZW1lbnQuY2hpbGRyZW47XG4gICAgICB2YXIgbmVzdGVkQ2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXNJdGVyYXRpdmVseShjb250ZW50LCB0cnVlLCBvcHRpb25zKTtcbiAgICAgIGlmIChvcHRpb25zLmZsYXR0ZW4pIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoLmFwcGx5KGNhbmRpZGF0ZXMsIG5lc3RlZENhbmRpZGF0ZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgICBzY29wZVBhcmVudDogZWxlbWVudCxcbiAgICAgICAgICBjYW5kaWRhdGVzOiBuZXN0ZWRDYW5kaWRhdGVzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjaGVjayBjYW5kaWRhdGUgZWxlbWVudFxuICAgICAgdmFyIHZhbGlkQ2FuZGlkYXRlID0gbWF0Y2hlcy5jYWxsKGVsZW1lbnQsIGNhbmRpZGF0ZVNlbGVjdG9yKTtcbiAgICAgIGlmICh2YWxpZENhbmRpZGF0ZSAmJiBvcHRpb25zLmZpbHRlcihlbGVtZW50KSAmJiAoaW5jbHVkZUNvbnRhaW5lciB8fCAhZWxlbWVudHMuaW5jbHVkZXMoZWxlbWVudCkpKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMucHVzaChlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gaXRlcmF0ZSBvdmVyIHNoYWRvdyBjb250ZW50IGlmIHBvc3NpYmxlXG4gICAgICB2YXIgc2hhZG93Um9vdCA9IGVsZW1lbnQuc2hhZG93Um9vdCB8fFxuICAgICAgLy8gY2hlY2sgZm9yIGFuIHVuZGlzY2xvc2VkIHNoYWRvd1xuICAgICAgdHlwZW9mIG9wdGlvbnMuZ2V0U2hhZG93Um9vdCA9PT0gJ2Z1bmN0aW9uJyAmJiBvcHRpb25zLmdldFNoYWRvd1Jvb3QoZWxlbWVudCk7XG5cbiAgICAgIC8vIG5vIGluZXJ0IGxvb2sgdXAgYmVjYXVzZSB3ZSdyZSBhbHJlYWR5IGRyaWxsaW5nIGRvd24gYW5kIGNoZWNraW5nIGZvciBpbmVydG5lc3NcbiAgICAgIC8vICBvbiB0aGUgd2F5IGRvd24sIHNvIGFsbCBjb250YWluZXJzIHRvIHRoaXMgcm9vdCBub2RlIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlblxuICAgICAgLy8gIHZldHRlZCBhcyBub24taW5lcnRcbiAgICAgIHZhciB2YWxpZFNoYWRvd1Jvb3QgPSAhaXNJbmVydChzaGFkb3dSb290LCBmYWxzZSkgJiYgKCFvcHRpb25zLnNoYWRvd1Jvb3RGaWx0ZXIgfHwgb3B0aW9ucy5zaGFkb3dSb290RmlsdGVyKGVsZW1lbnQpKTtcbiAgICAgIGlmIChzaGFkb3dSb290ICYmIHZhbGlkU2hhZG93Um9vdCkge1xuICAgICAgICAvLyBhZGQgc2hhZG93IGRvbSBzY29wZSBJSUYgYSBzaGFkb3cgcm9vdCBub2RlIHdhcyBnaXZlbjsgb3RoZXJ3aXNlLCBhbiB1bmRpc2Nsb3NlZFxuICAgICAgICAvLyAgc2hhZG93IGV4aXN0cywgc28gbG9vayBhdCBsaWdodCBkb20gY2hpbGRyZW4gYXMgZmFsbGJhY2sgQlVUIGNyZWF0ZSBhIHNjb3BlIGZvciBhbnlcbiAgICAgICAgLy8gIGNoaWxkIGNhbmRpZGF0ZXMgZm91bmQgYmVjYXVzZSB0aGV5J3JlIGxpa2VseSBzbG90dGVkIGVsZW1lbnRzIChlbGVtZW50cyB0aGF0IGFyZVxuICAgICAgICAvLyAgY2hpbGRyZW4gb2YgdGhlIHdlYiBjb21wb25lbnQgZWxlbWVudCAod2hpY2ggaGFzIHRoZSBzaGFkb3cpLCBpbiB0aGUgbGlnaHQgZG9tLCBidXRcbiAgICAgICAgLy8gIHNsb3R0ZWQgc29tZXdoZXJlIF9pbnNpZGVfIHRoZSB1bmRpc2Nsb3NlZCBzaGFkb3cpIC0tIHRoZSBzY29wZSBpcyBjcmVhdGVkIGJlbG93LFxuICAgICAgICAvLyAgX2FmdGVyXyB3ZSByZXR1cm4gZnJvbSB0aGlzIHJlY3Vyc2l2ZSBjYWxsXG4gICAgICAgIHZhciBfbmVzdGVkQ2FuZGlkYXRlcyA9IGdldENhbmRpZGF0ZXNJdGVyYXRpdmVseShzaGFkb3dSb290ID09PSB0cnVlID8gZWxlbWVudC5jaGlsZHJlbiA6IHNoYWRvd1Jvb3QuY2hpbGRyZW4sIHRydWUsIG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy5mbGF0dGVuKSB7XG4gICAgICAgICAgY2FuZGlkYXRlcy5wdXNoLmFwcGx5KGNhbmRpZGF0ZXMsIF9uZXN0ZWRDYW5kaWRhdGVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICAgICAgc2NvcGVQYXJlbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgICBjYW5kaWRhdGVzOiBfbmVzdGVkQ2FuZGlkYXRlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGVyZSdzIG5vdCBzaGFkb3cgc28ganVzdCBkaWcgaW50byB0aGUgZWxlbWVudCdzIChsaWdodCBkb20pIGNoaWxkcmVuXG4gICAgICAgIC8vICBfX3dpdGhvdXRfXyBnaXZpbmcgdGhlIGVsZW1lbnQgc3BlY2lhbCBzY29wZSB0cmVhdG1lbnRcbiAgICAgICAgZWxlbWVudHNUb0NoZWNrLnVuc2hpZnQuYXBwbHkoZWxlbWVudHNUb0NoZWNrLCBlbGVtZW50LmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZXM7XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBub2RlIGhhcyBhbiBleHBsaWNpdGx5IHNwZWNpZmllZCBgdGFiaW5kZXhgIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHNvOyBmYWxzZSBpZiBub3QuXG4gKi9cbnZhciBoYXNUYWJJbmRleCA9IGZ1bmN0aW9uIGhhc1RhYkluZGV4KG5vZGUpIHtcbiAgcmV0dXJuICFpc05hTihwYXJzZUludChub2RlLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgMTApKTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIHRoZSB0YWIgaW5kZXggb2YgYSBnaXZlbiBub2RlLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHJldHVybnMge251bWJlcn0gVGFiIG9yZGVyIChuZWdhdGl2ZSwgMCwgb3IgcG9zaXRpdmUgbnVtYmVyKS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBgbm9kZWAgaXMgZmFsc3kuXG4gKi9cbnZhciBnZXRUYWJJbmRleCA9IGZ1bmN0aW9uIGdldFRhYkluZGV4KG5vZGUpIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cbiAgaWYgKG5vZGUudGFiSW5kZXggPCAwKSB7XG4gICAgLy8gaW4gQ2hyb21lLCA8ZGV0YWlscy8+LCA8YXVkaW8gY29udHJvbHMvPiBhbmQgPHZpZGVvIGNvbnRyb2xzLz4gZWxlbWVudHMgZ2V0IGEgZGVmYXVsdFxuICAgIC8vIGB0YWJJbmRleGAgb2YgLTEgd2hlbiB0aGUgJ3RhYmluZGV4JyBhdHRyaWJ1dGUgaXNuJ3Qgc3BlY2lmaWVkIGluIHRoZSBET00sXG4gICAgLy8geWV0IHRoZXkgYXJlIHN0aWxsIHBhcnQgb2YgdGhlIHJlZ3VsYXIgdGFiIG9yZGVyOyBpbiBGRiwgdGhleSBnZXQgYSBkZWZhdWx0XG4gICAgLy8gYHRhYkluZGV4YCBvZiAwOyBzaW5jZSBDaHJvbWUgc3RpbGwgcHV0cyB0aG9zZSBlbGVtZW50cyBpbiB0aGUgcmVndWxhciB0YWJcbiAgICAvLyBvcmRlciwgY29uc2lkZXIgdGhlaXIgdGFiIGluZGV4IHRvIGJlIDAuXG4gICAgLy8gQWxzbyBicm93c2VycyBkbyBub3QgcmV0dXJuIGB0YWJJbmRleGAgY29ycmVjdGx5IGZvciBjb250ZW50RWRpdGFibGUgbm9kZXM7XG4gICAgLy8gc28gaWYgdGhleSBkb24ndCBoYXZlIGEgdGFiaW5kZXggYXR0cmlidXRlIHNwZWNpZmljYWxseSBzZXQsIGFzc3VtZSBpdCdzIDAuXG4gICAgaWYgKCgvXihBVURJT3xWSURFT3xERVRBSUxTKSQvLnRlc3Qobm9kZS50YWdOYW1lKSB8fCBpc0NvbnRlbnRFZGl0YWJsZShub2RlKSkgJiYgIWhhc1RhYkluZGV4KG5vZGUpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vZGUudGFiSW5kZXg7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB0aGUgdGFiIGluZGV4IG9mIGEgZ2l2ZW4gbm9kZSBfX2ZvciBzb3J0IG9yZGVyIHB1cnBvc2VzX18uXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1Njb3BlXSBUcnVlIGZvciBhIGN1c3RvbSBlbGVtZW50IHdpdGggc2hhZG93IHJvb3Qgb3Igc2xvdCB0aGF0LCBieSBkZWZhdWx0LFxuICogIGhhcyB0YWJJbmRleCAtMSwgYnV0IG5lZWRzIHRvIGJlIHNvcnRlZCBieSBkb2N1bWVudCBvcmRlciBpbiBvcmRlciBmb3IgaXRzIGNvbnRlbnQgdG8gYmVcbiAqICBpbnNlcnRlZCBpbnRvIHRoZSBjb3JyZWN0IHNvcnQgcG9zaXRpb24uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUYWIgb3JkZXIgKG5lZ2F0aXZlLCAwLCBvciBwb3NpdGl2ZSBudW1iZXIpLlxuICovXG52YXIgZ2V0U29ydE9yZGVyVGFiSW5kZXggPSBmdW5jdGlvbiBnZXRTb3J0T3JkZXJUYWJJbmRleChub2RlLCBpc1Njb3BlKSB7XG4gIHZhciB0YWJJbmRleCA9IGdldFRhYkluZGV4KG5vZGUpO1xuICBpZiAodGFiSW5kZXggPCAwICYmIGlzU2NvcGUgJiYgIWhhc1RhYkluZGV4KG5vZGUpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHRhYkluZGV4O1xufTtcbnZhciBzb3J0T3JkZXJlZFRhYmJhYmxlcyA9IGZ1bmN0aW9uIHNvcnRPcmRlcmVkVGFiYmFibGVzKGEsIGIpIHtcbiAgcmV0dXJuIGEudGFiSW5kZXggPT09IGIudGFiSW5kZXggPyBhLmRvY3VtZW50T3JkZXIgLSBiLmRvY3VtZW50T3JkZXIgOiBhLnRhYkluZGV4IC0gYi50YWJJbmRleDtcbn07XG52YXIgaXNJbnB1dCA9IGZ1bmN0aW9uIGlzSW5wdXQobm9kZSkge1xuICByZXR1cm4gbm9kZS50YWdOYW1lID09PSAnSU5QVVQnO1xufTtcbnZhciBpc0hpZGRlbklucHV0ID0gZnVuY3Rpb24gaXNIaWRkZW5JbnB1dChub2RlKSB7XG4gIHJldHVybiBpc0lucHV0KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ2hpZGRlbic7XG59O1xudmFyIGlzRGV0YWlsc1dpdGhTdW1tYXJ5ID0gZnVuY3Rpb24gaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkge1xuICB2YXIgciA9IG5vZGUudGFnTmFtZSA9PT0gJ0RFVEFJTFMnICYmIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShub2RlLmNoaWxkcmVuKS5zb21lKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC50YWdOYW1lID09PSAnU1VNTUFSWSc7XG4gIH0pO1xuICByZXR1cm4gcjtcbn07XG52YXIgZ2V0Q2hlY2tlZFJhZGlvID0gZnVuY3Rpb24gZ2V0Q2hlY2tlZFJhZGlvKG5vZGVzLCBmb3JtKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobm9kZXNbaV0uY2hlY2tlZCAmJiBub2Rlc1tpXS5mb3JtID09PSBmb3JtKSB7XG4gICAgICByZXR1cm4gbm9kZXNbaV07XG4gICAgfVxuICB9XG59O1xudmFyIGlzVGFiYmFibGVSYWRpbyA9IGZ1bmN0aW9uIGlzVGFiYmFibGVSYWRpbyhub2RlKSB7XG4gIGlmICghbm9kZS5uYW1lKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIHJhZGlvU2NvcGUgPSBub2RlLmZvcm0gfHwgZ2V0Um9vdE5vZGUobm9kZSk7XG4gIHZhciBxdWVyeVJhZGlvcyA9IGZ1bmN0aW9uIHF1ZXJ5UmFkaW9zKG5hbWUpIHtcbiAgICByZXR1cm4gcmFkaW9TY29wZS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cIicgKyBuYW1lICsgJ1wiXScpO1xuICB9O1xuICB2YXIgcmFkaW9TZXQ7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LkNTUyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5DU1MuZXNjYXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmFkaW9TZXQgPSBxdWVyeVJhZGlvcyh3aW5kb3cuQ1NTLmVzY2FwZShub2RlLm5hbWUpKTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgcmFkaW9TZXQgPSBxdWVyeVJhZGlvcyhub2RlLm5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0xvb2tzIGxpa2UgeW91IGhhdmUgYSByYWRpbyBidXR0b24gd2l0aCBhIG5hbWUgYXR0cmlidXRlIGNvbnRhaW5pbmcgaW52YWxpZCBDU1Mgc2VsZWN0b3IgY2hhcmFjdGVycyBhbmQgbmVlZCB0aGUgQ1NTLmVzY2FwZSBwb2x5ZmlsbDogJXMnLCBlcnIubWVzc2FnZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHZhciBjaGVja2VkID0gZ2V0Q2hlY2tlZFJhZGlvKHJhZGlvU2V0LCBub2RlLmZvcm0pO1xuICByZXR1cm4gIWNoZWNrZWQgfHwgY2hlY2tlZCA9PT0gbm9kZTtcbn07XG52YXIgaXNSYWRpbyA9IGZ1bmN0aW9uIGlzUmFkaW8obm9kZSkge1xuICByZXR1cm4gaXNJbnB1dChub2RlKSAmJiBub2RlLnR5cGUgPT09ICdyYWRpbyc7XG59O1xudmFyIGlzTm9uVGFiYmFibGVSYWRpbyA9IGZ1bmN0aW9uIGlzTm9uVGFiYmFibGVSYWRpbyhub2RlKSB7XG4gIHJldHVybiBpc1JhZGlvKG5vZGUpICYmICFpc1RhYmJhYmxlUmFkaW8obm9kZSk7XG59O1xuXG4vLyBkZXRlcm1pbmVzIGlmIGEgbm9kZSBpcyB1bHRpbWF0ZWx5IGF0dGFjaGVkIHRvIHRoZSB3aW5kb3cncyBkb2N1bWVudFxudmFyIGlzTm9kZUF0dGFjaGVkID0gZnVuY3Rpb24gaXNOb2RlQXR0YWNoZWQobm9kZSkge1xuICB2YXIgX25vZGVSb290O1xuICAvLyBUaGUgcm9vdCBub2RlIGlzIHRoZSBzaGFkb3cgcm9vdCBpZiB0aGUgbm9kZSBpcyBpbiBhIHNoYWRvdyBET007IHNvbWUgZG9jdW1lbnQgb3RoZXJ3aXNlXG4gIC8vICAoYnV0IE5PVCBfdGhlXyBkb2N1bWVudDsgc2VlIHNlY29uZCAnSWYnIGNvbW1lbnQgYmVsb3cgZm9yIG1vcmUpLlxuICAvLyBJZiByb290Tm9kZSBpcyBzaGFkb3cgcm9vdCwgaXQnbGwgaGF2ZSBhIGhvc3QsIHdoaWNoIGlzIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBzaGFkb3dcbiAgLy8gIGlzIGF0dGFjaGVkLCBhbmQgdGhlIG9uZSB3ZSBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgaW4gdGhlIGRvY3VtZW50IG9yIG5vdCAoYmVjYXVzZSB0aGVcbiAgLy8gIHNoYWRvdywgYW5kIGFsbCBub2RlcyBpdCBjb250YWlucywgaXMgbmV2ZXIgY29uc2lkZXJlZCBpbiB0aGUgZG9jdW1lbnQgc2luY2Ugc2hhZG93c1xuICAvLyAgYmVoYXZlIGxpa2Ugc2VsZi1jb250YWluZWQgRE9NczsgYnV0IGlmIHRoZSBzaGFkb3cncyBIT1NULCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBkb2N1bWVudCxcbiAgLy8gIGlzIGhpZGRlbiwgb3IgaXMgbm90IGluIHRoZSBkb2N1bWVudCBpdHNlbGYgYnV0IGlzIGRldGFjaGVkLCBpdCB3aWxsIGFmZmVjdCB0aGUgc2hhZG93J3NcbiAgLy8gIHZpc2liaWxpdHksIGluY2x1ZGluZyBhbGwgdGhlIG5vZGVzIGl0IGNvbnRhaW5zKS4gVGhlIGhvc3QgY291bGQgYmUgYW55IG5vcm1hbCBub2RlLFxuICAvLyAgb3IgYSBjdXN0b20gZWxlbWVudCAoaS5lLiB3ZWIgY29tcG9uZW50KS4gRWl0aGVyIHdheSwgdGhhdCdzIHRoZSBvbmUgdGhhdCBpcyBjb25zaWRlcmVkXG4gIC8vICBwYXJ0IG9mIHRoZSBkb2N1bWVudCwgbm90IHRoZSBzaGFkb3cgcm9vdCwgbm9yIGFueSBvZiBpdHMgY2hpbGRyZW4gKGkuZS4gdGhlIG5vZGUgYmVpbmdcbiAgLy8gIHRlc3RlZCkuXG4gIC8vIFRvIGZ1cnRoZXIgY29tcGxpY2F0ZSB0aGluZ3MsIHdlIGhhdmUgdG8gbG9vayBhbGwgdGhlIHdheSB1cCB1bnRpbCB3ZSBmaW5kIGEgc2hhZG93IEhPU1RcbiAgLy8gIHRoYXQgaXMgYXR0YWNoZWQgKG9yIGZpbmQgbm9uZSkgYmVjYXVzZSB0aGUgbm9kZSBtaWdodCBiZSBpbiBuZXN0ZWQgc2hhZG93cy4uLlxuICAvLyBJZiByb290Tm9kZSBpcyBub3QgYSBzaGFkb3cgcm9vdCwgaXQgd29uJ3QgaGF2ZSBhIGhvc3QsIGFuZCBzbyByb290Tm9kZSBzaG91bGQgYmUgdGhlXG4gIC8vICBkb2N1bWVudCAocGVyIHRoZSBkb2NzKSBhbmQgd2hpbGUgaXQncyBhIERvY3VtZW50LXR5cGUgb2JqZWN0LCB0aGF0IGRvY3VtZW50IGRvZXMgbm90XG4gIC8vICBhcHBlYXIgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG5vZGUncyBgb3duZXJEb2N1bWVudGAgZm9yIHNvbWUgcmVhc29uLCBzbyBpdCdzIHNhZmVyXG4gIC8vICB0byBpZ25vcmUgdGhlIHJvb3ROb2RlIGF0IHRoaXMgcG9pbnQsIGFuZCB1c2UgYG5vZGUub3duZXJEb2N1bWVudGAuIE90aGVyd2lzZSxcbiAgLy8gIHVzaW5nIGByb290Tm9kZS5jb250YWlucyhub2RlKWAgd2lsbCBfYWx3YXlzXyBiZSB0cnVlIHdlJ2xsIGdldCBmYWxzZS1wb3NpdGl2ZXMgd2hlblxuICAvLyAgbm9kZSBpcyBhY3R1YWxseSBkZXRhY2hlZC5cbiAgLy8gTk9URTogSWYgYG5vZGVSb290SG9zdGAgb3IgYG5vZGVgIGhhcHBlbnMgdG8gYmUgdGhlIGBkb2N1bWVudGAgaXRzZWxmICh3aGljaCBpcyBwb3NzaWJsZVxuICAvLyAgaWYgYSB0YWJiYWJsZS9mb2N1c2FibGUgbm9kZSB3YXMgcXVpY2tseSBhZGRlZCB0byB0aGUgRE9NLCBmb2N1c2VkLCBhbmQgdGhlbiByZW1vdmVkXG4gIC8vICBmcm9tIHRoZSBET00gYXMgaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZvY3VzLXRyYXAvZm9jdXMtdHJhcC1yZWFjdC9pc3N1ZXMvOTA1KSwgdGhlblxuICAvLyAgYG93bmVyRG9jdW1lbnRgIHdpbGwgYmUgYG51bGxgLCBoZW5jZSB0aGUgb3B0aW9uYWwgY2hhaW5pbmcgb24gaXQuXG4gIHZhciBub2RlUm9vdCA9IG5vZGUgJiYgZ2V0Um9vdE5vZGUobm9kZSk7XG4gIHZhciBub2RlUm9vdEhvc3QgPSAoX25vZGVSb290ID0gbm9kZVJvb3QpID09PSBudWxsIHx8IF9ub2RlUm9vdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX25vZGVSb290Lmhvc3Q7XG5cbiAgLy8gaW4gc29tZSBjYXNlcywgYSBkZXRhY2hlZCBub2RlIHdpbGwgcmV0dXJuIGl0c2VsZiBhcyB0aGUgcm9vdCBpbnN0ZWFkIG9mIGEgZG9jdW1lbnQgb3JcbiAgLy8gIHNoYWRvdyByb290IG9iamVjdCwgaW4gd2hpY2ggY2FzZSwgd2Ugc2hvdWxkbid0IHRyeSB0byBsb29rIGZ1cnRoZXIgdXAgdGhlIGhvc3QgY2hhaW5cbiAgdmFyIGF0dGFjaGVkID0gZmFsc2U7XG4gIGlmIChub2RlUm9vdCAmJiBub2RlUm9vdCAhPT0gbm9kZSkge1xuICAgIHZhciBfbm9kZVJvb3RIb3N0LCBfbm9kZVJvb3RIb3N0JG93bmVyRG8sIF9ub2RlJG93bmVyRG9jdW1lbnQ7XG4gICAgYXR0YWNoZWQgPSAhISgoX25vZGVSb290SG9zdCA9IG5vZGVSb290SG9zdCkgIT09IG51bGwgJiYgX25vZGVSb290SG9zdCAhPT0gdm9pZCAwICYmIChfbm9kZVJvb3RIb3N0JG93bmVyRG8gPSBfbm9kZVJvb3RIb3N0Lm93bmVyRG9jdW1lbnQpICE9PSBudWxsICYmIF9ub2RlUm9vdEhvc3Qkb3duZXJEbyAhPT0gdm9pZCAwICYmIF9ub2RlUm9vdEhvc3Qkb3duZXJEby5jb250YWlucyhub2RlUm9vdEhvc3QpIHx8IG5vZGUgIT09IG51bGwgJiYgbm9kZSAhPT0gdm9pZCAwICYmIChfbm9kZSRvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50KSAhPT0gbnVsbCAmJiBfbm9kZSRvd25lckRvY3VtZW50ICE9PSB2b2lkIDAgJiYgX25vZGUkb3duZXJEb2N1bWVudC5jb250YWlucyhub2RlKSk7XG4gICAgd2hpbGUgKCFhdHRhY2hlZCAmJiBub2RlUm9vdEhvc3QpIHtcbiAgICAgIHZhciBfbm9kZVJvb3QyLCBfbm9kZVJvb3RIb3N0MiwgX25vZGVSb290SG9zdDIkb3duZXJEO1xuICAgICAgLy8gc2luY2UgaXQncyBub3QgYXR0YWNoZWQgYW5kIHdlIGhhdmUgYSByb290IGhvc3QsIHRoZSBub2RlIE1VU1QgYmUgaW4gYSBuZXN0ZWQgc2hhZG93IERPTSxcbiAgICAgIC8vICB3aGljaCBtZWFucyB3ZSBuZWVkIHRvIGdldCB0aGUgaG9zdCdzIGhvc3QgYW5kIGNoZWNrIGlmIHRoYXQgcGFyZW50IGhvc3QgaXMgY29udGFpbmVkXG4gICAgICAvLyAgaW4gKGkuZS4gYXR0YWNoZWQgdG8pIHRoZSBkb2N1bWVudFxuICAgICAgbm9kZVJvb3QgPSBnZXRSb290Tm9kZShub2RlUm9vdEhvc3QpO1xuICAgICAgbm9kZVJvb3RIb3N0ID0gKF9ub2RlUm9vdDIgPSBub2RlUm9vdCkgPT09IG51bGwgfHwgX25vZGVSb290MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX25vZGVSb290Mi5ob3N0O1xuICAgICAgYXR0YWNoZWQgPSAhISgoX25vZGVSb290SG9zdDIgPSBub2RlUm9vdEhvc3QpICE9PSBudWxsICYmIF9ub2RlUm9vdEhvc3QyICE9PSB2b2lkIDAgJiYgKF9ub2RlUm9vdEhvc3QyJG93bmVyRCA9IF9ub2RlUm9vdEhvc3QyLm93bmVyRG9jdW1lbnQpICE9PSBudWxsICYmIF9ub2RlUm9vdEhvc3QyJG93bmVyRCAhPT0gdm9pZCAwICYmIF9ub2RlUm9vdEhvc3QyJG93bmVyRC5jb250YWlucyhub2RlUm9vdEhvc3QpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF0dGFjaGVkO1xufTtcbnZhciBpc1plcm9BcmVhID0gZnVuY3Rpb24gaXNaZXJvQXJlYShub2RlKSB7XG4gIHZhciBfbm9kZSRnZXRCb3VuZGluZ0NsaWUgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgIHdpZHRoID0gX25vZGUkZ2V0Qm91bmRpbmdDbGllLndpZHRoLFxuICAgIGhlaWdodCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS5oZWlnaHQ7XG4gIHJldHVybiB3aWR0aCA9PT0gMCAmJiBoZWlnaHQgPT09IDA7XG59O1xudmFyIGlzSGlkZGVuID0gZnVuY3Rpb24gaXNIaWRkZW4obm9kZSwgX3JlZikge1xuICB2YXIgZGlzcGxheUNoZWNrID0gX3JlZi5kaXNwbGF5Q2hlY2ssXG4gICAgZ2V0U2hhZG93Um9vdCA9IF9yZWYuZ2V0U2hhZG93Um9vdDtcbiAgLy8gTk9URTogdmlzaWJpbGl0eSB3aWxsIGJlIGB1bmRlZmluZWRgIGlmIG5vZGUgaXMgZGV0YWNoZWQgZnJvbSB0aGUgZG9jdW1lbnRcbiAgLy8gIChzZWUgbm90ZXMgYWJvdXQgdGhpcyBmdXJ0aGVyIGRvd24pLCB3aGljaCBtZWFucyB3ZSB3aWxsIGNvbnNpZGVyIGl0IHZpc2libGVcbiAgLy8gICh0aGlzIGlzIGxlZ2FjeSBiZWhhdmlvciBmcm9tIGEgdmVyeSBsb25nIHdheSBiYWNrKVxuICAvLyBOT1RFOiB3ZSBjaGVjayB0aGlzIHJlZ2FyZGxlc3Mgb2YgYGRpc3BsYXlDaGVjaz1cIm5vbmVcImAgYmVjYXVzZSB0aGlzIGlzIGFcbiAgLy8gIF92aXNpYmlsaXR5XyBjaGVjaywgbm90IGEgX2Rpc3BsYXlfIGNoZWNrXG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKG5vZGUpLnZpc2liaWxpdHkgPT09ICdoaWRkZW4nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIGlzRGlyZWN0U3VtbWFyeSA9IG1hdGNoZXMuY2FsbChub2RlLCAnZGV0YWlscz5zdW1tYXJ5OmZpcnN0LW9mLXR5cGUnKTtcbiAgdmFyIG5vZGVVbmRlckRldGFpbHMgPSBpc0RpcmVjdFN1bW1hcnkgPyBub2RlLnBhcmVudEVsZW1lbnQgOiBub2RlO1xuICBpZiAobWF0Y2hlcy5jYWxsKG5vZGVVbmRlckRldGFpbHMsICdkZXRhaWxzOm5vdChbb3Blbl0pIConKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghZGlzcGxheUNoZWNrIHx8IGRpc3BsYXlDaGVjayA9PT0gJ2Z1bGwnIHx8IGRpc3BsYXlDaGVjayA9PT0gJ2xlZ2FjeS1mdWxsJykge1xuICAgIGlmICh0eXBlb2YgZ2V0U2hhZG93Um9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gZmlndXJlIG91dCBpZiB3ZSBzaG91bGQgY29uc2lkZXIgdGhlIG5vZGUgdG8gYmUgaW4gYW4gdW5kaXNjbG9zZWQgc2hhZG93IGFuZCB1c2UgdGhlXG4gICAgICAvLyAgJ25vbi16ZXJvLWFyZWEnIGZhbGxiYWNrXG4gICAgICB2YXIgb3JpZ2luYWxOb2RlID0gbm9kZTtcbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIHZhciBwYXJlbnRFbGVtZW50ID0gbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICB2YXIgcm9vdE5vZGUgPSBnZXRSb290Tm9kZShub2RlKTtcbiAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgJiYgIXBhcmVudEVsZW1lbnQuc2hhZG93Um9vdCAmJiBnZXRTaGFkb3dSb290KHBhcmVudEVsZW1lbnQpID09PSB0cnVlIC8vIGNoZWNrIGlmIHRoZXJlJ3MgYW4gdW5kaXNjbG9zZWQgc2hhZG93XG4gICAgICAgICkge1xuICAgICAgICAgIC8vIG5vZGUgaGFzIGFuIHVuZGlzY2xvc2VkIHNoYWRvdyB3aGljaCBtZWFucyB3ZSBjYW4gb25seSB0cmVhdCBpdCBhcyBhIGJsYWNrIGJveCwgc28gd2VcbiAgICAgICAgICAvLyAgZmFsbCBiYWNrIHRvIGEgbm9uLXplcm8tYXJlYSB0ZXN0XG4gICAgICAgICAgcmV0dXJuIGlzWmVyb0FyZWEobm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5hc3NpZ25lZFNsb3QpIHtcbiAgICAgICAgICAvLyBpdGVyYXRlIHVwIHNsb3RcbiAgICAgICAgICBub2RlID0gbm9kZS5hc3NpZ25lZFNsb3Q7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhcmVudEVsZW1lbnQgJiYgcm9vdE5vZGUgIT09IG5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgIC8vIGNyb3NzIHNoYWRvdyBib3VuZGFyeVxuICAgICAgICAgIG5vZGUgPSByb290Tm9kZS5ob3N0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGl0ZXJhdGUgdXAgbm9ybWFsIGRvbVxuICAgICAgICAgIG5vZGUgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBub2RlID0gb3JpZ2luYWxOb2RlO1xuICAgIH1cbiAgICAvLyBlbHNlLCBgZ2V0U2hhZG93Um9vdGAgbWlnaHQgYmUgdHJ1ZSwgYnV0IGFsbCB0aGF0IGRvZXMgaXMgZW5hYmxlIHNoYWRvdyBET00gc3VwcG9ydFxuICAgIC8vICAoaS5lLiBpdCBkb2VzIG5vdCBhbHNvIHByZXN1bWUgdGhhdCBhbGwgbm9kZXMgbWlnaHQgaGF2ZSB1bmRpc2Nsb3NlZCBzaGFkb3dzKTsgb3JcbiAgICAvLyAgaXQgbWlnaHQgYmUgYSBmYWxzeSB2YWx1ZSwgd2hpY2ggbWVhbnMgc2hhZG93IERPTSBzdXBwb3J0IGlzIGRpc2FibGVkXG5cbiAgICAvLyBTaW5jZSB3ZSBkaWRuJ3QgZmluZCBpdCBzaXR0aW5nIGluIGFuIHVuZGlzY2xvc2VkIHNoYWRvdyAob3Igc2hhZG93cyBhcmUgZGlzYWJsZWQpXG4gICAgLy8gIG5vdyB3ZSBjYW4ganVzdCB0ZXN0IHRvIHNlZSBpZiBpdCB3b3VsZCBub3JtYWxseSBiZSB2aXNpYmxlIG9yIG5vdCwgcHJvdmlkZWQgaXQnc1xuICAgIC8vICBhdHRhY2hlZCB0byB0aGUgbWFpbiBkb2N1bWVudC5cbiAgICAvLyBOT1RFOiBXZSBtdXN0IGNvbnNpZGVyIGNhc2Ugd2hlcmUgbm9kZSBpcyBpbnNpZGUgYSBzaGFkb3cgRE9NIGFuZCBnaXZlbiBkaXJlY3RseSB0b1xuICAgIC8vICBgaXNUYWJiYWJsZSgpYCBvciBgaXNGb2N1c2FibGUoKWAgLS0gcmVnYXJkbGVzcyBvZiBgZ2V0U2hhZG93Um9vdGAgb3B0aW9uIHNldHRpbmcuXG5cbiAgICBpZiAoaXNOb2RlQXR0YWNoZWQobm9kZSkpIHtcbiAgICAgIC8vIHRoaXMgd29ya3Mgd2hlcmV2ZXIgdGhlIG5vZGUgaXM6IGlmIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGNsaWVudCByZWN0LCBpdCdzXG4gICAgICAvLyAgc29tZWhvdyBkaXNwbGF5ZWQ7IGl0IGFsc28gY292ZXJzIHRoZSBDU1MgJ2Rpc3BsYXk6IGNvbnRlbnRzJyBjYXNlIHdoZXJlIHRoZVxuICAgICAgLy8gIG5vZGUgaXRzZWxmIGlzIGhpZGRlbiBpbiBwbGFjZSBvZiBpdHMgY29udGVudHM7IGFuZCB0aGVyZSdzIG5vIG5lZWQgdG8gc2VhcmNoXG4gICAgICAvLyAgdXAgdGhlIGhpZXJhcmNoeSBlaXRoZXJcbiAgICAgIHJldHVybiAhbm9kZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBFbHNlLCB0aGUgbm9kZSBpc24ndCBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnQsIHdoaWNoIG1lYW5zIHRoZSBgZ2V0Q2xpZW50UmVjdHMoKWBcbiAgICAvLyAgQVBJIHdpbGwgX19hbHdheXNfXyByZXR1cm4gemVybyByZWN0cyAodGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSwgaWYgUmVhY3RcbiAgICAvLyAgaXMgdXNlZCB0byByZW5kZXIgbm9kZXMgb250byBhIGRldGFjaGVkIHRyZWUsIGFzIGNvbmZpcm1lZCBpbiB0aGlzIHRocmVhZDpcbiAgICAvLyAgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy85MTE3I2lzc3VlY29tbWVudC0yODQyMjg4NzApXG4gICAgLy9cbiAgICAvLyBJdCBhbHNvIG1lYW5zIHRoYXQgZXZlbiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5kaXNwbGF5IHdpbGwgcmV0dXJuIGB1bmRlZmluZWRgXG4gICAgLy8gIGJlY2F1c2Ugc3R5bGVzIGFyZSBvbmx5IGNvbXB1dGVkIGZvciBub2RlcyB0aGF0IGFyZSBpbiB0aGUgZG9jdW1lbnQuXG4gICAgLy9cbiAgICAvLyBOT1RFOiBUSElTIEhBUyBCRUVOIFRIRSBDQVNFIEZPUiBZRUFSUy4gSXQgaXMgbm90IG5ldywgbm9yIGlzIGl0IGNhdXNlZCBieSB0YWJiYWJsZVxuICAgIC8vICBzb21laG93LiBUaG91Z2ggaXQgd2FzIG5ldmVyIHN0YXRlZCBvZmZpY2lhbGx5LCBhbnlvbmUgd2hvIGhhcyBldmVyIHVzZWQgdGFiYmFibGVcbiAgICAvLyAgQVBJcyBvbiBub2RlcyBpbiBkZXRhY2hlZCBjb250YWluZXJzIGhhcyBhY3R1YWxseSBpbXBsaWNpdGx5IHVzZWQgdGFiYmFibGUgaW4gd2hhdFxuICAgIC8vICB3YXMgbGF0ZXIgKGFzIG9mIHY1LjIuMCBvbiBBcHIgOSwgMjAyMSkgY2FsbGVkIGBkaXNwbGF5Q2hlY2s9XCJub25lXCJgIG1vZGUgLS0gZXNzZW50aWFsbHlcbiAgICAvLyAgY29uc2lkZXJpbmcgX19ldmVyeXRoaW5nX18gdG8gYmUgdmlzaWJsZSBiZWNhdXNlIG9mIHRoZSBpbm5hYmlsaXR5IHRvIGRldGVybWluZSBzdHlsZXMuXG4gICAgLy9cbiAgICAvLyB2Ni4wLjA6IEFzIG9mIHRoaXMgbWFqb3IgcmVsZWFzZSwgdGhlIGRlZmF1bHQgJ2Z1bGwnIG9wdGlvbiBfX25vIGxvbmdlciB0cmVhdHMgZGV0YWNoZWRcbiAgICAvLyAgbm9kZXMgYXMgdmlzaWJsZSB3aXRoIHRoZSAnbm9uZScgZmFsbGJhY2suX19cbiAgICBpZiAoZGlzcGxheUNoZWNrICE9PSAnbGVnYWN5LWZ1bGwnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gaGlkZGVuXG4gICAgfVxuICAgIC8vIGVsc2UsIGZhbGxiYWNrIHRvICdub25lJyBtb2RlIGFuZCBjb25zaWRlciB0aGUgbm9kZSB2aXNpYmxlXG4gIH0gZWxzZSBpZiAoZGlzcGxheUNoZWNrID09PSAnbm9uLXplcm8tYXJlYScpIHtcbiAgICAvLyBOT1RFOiBFdmVuIHRob3VnaCB0aGlzIHRlc3RzIHRoYXQgdGhlIG5vZGUncyBjbGllbnQgcmVjdCBpcyBub24temVybyB0byBkZXRlcm1pbmVcbiAgICAvLyAgd2hldGhlciBpdCdzIGRpc3BsYXllZCwgYW5kIHRoYXQgYSBkZXRhY2hlZCBub2RlIHdpbGwgX19hbHdheXNfXyBoYXZlIGEgemVyby1hcmVhXG4gICAgLy8gIGNsaWVudCByZWN0LCB3ZSBkb24ndCBzcGVjaWFsLWNhc2UgZm9yIHdoZXRoZXIgdGhlIG5vZGUgaXMgYXR0YWNoZWQgb3Igbm90LiBJblxuICAgIC8vICB0aGlzIG1vZGUsIHdlIGRvIHdhbnQgdG8gY29uc2lkZXIgbm9kZXMgdGhhdCBoYXZlIGEgemVybyBhcmVhIHRvIGJlIGhpZGRlbiBhdCBhbGxcbiAgICAvLyAgdGltZXMsIGFuZCB0aGF0IGluY2x1ZGVzIGF0dGFjaGVkIG9yIG5vdC5cbiAgICByZXR1cm4gaXNaZXJvQXJlYShub2RlKTtcbiAgfVxuXG4gIC8vIHZpc2libGUsIGFzIGZhciBhcyB3ZSBjYW4gdGVsbCwgb3IgcGVyIGN1cnJlbnQgYGRpc3BsYXlDaGVjaz1ub25lYCBtb2RlLCB3ZSBhc3N1bWVcbiAgLy8gIGl0J3MgdmlzaWJsZVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vLyBmb3JtIGZpZWxkcyAobmVzdGVkKSBpbnNpZGUgYSBkaXNhYmxlZCBmaWVsZHNldCBhcmUgbm90IGZvY3VzYWJsZS90YWJiYWJsZVxuLy8gIHVubGVzcyB0aGV5IGFyZSBpbiB0aGUgX2ZpcnN0XyA8bGVnZW5kPiBlbGVtZW50IG9mIHRoZSB0b3AtbW9zdCBkaXNhYmxlZFxuLy8gIGZpZWxkc2V0XG52YXIgaXNEaXNhYmxlZEZyb21GaWVsZHNldCA9IGZ1bmN0aW9uIGlzRGlzYWJsZWRGcm9tRmllbGRzZXQobm9kZSkge1xuICBpZiAoL14oSU5QVVR8QlVUVE9OfFNFTEVDVHxURVhUQVJFQSkkLy50ZXN0KG5vZGUudGFnTmFtZSkpIHtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50RWxlbWVudDtcbiAgICAvLyBjaGVjayBpZiBgbm9kZWAgaXMgY29udGFpbmVkIGluIGEgZGlzYWJsZWQgPGZpZWxkc2V0PlxuICAgIHdoaWxlIChwYXJlbnROb2RlKSB7XG4gICAgICBpZiAocGFyZW50Tm9kZS50YWdOYW1lID09PSAnRklFTERTRVQnICYmIHBhcmVudE5vZGUuZGlzYWJsZWQpIHtcbiAgICAgICAgLy8gbG9vayBmb3IgdGhlIGZpcnN0IDxsZWdlbmQ+IGFtb25nIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGlzYWJsZWQgPGZpZWxkc2V0PlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudE5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBwYXJlbnROb2RlLmNoaWxkcmVuLml0ZW0oaSk7XG4gICAgICAgICAgLy8gd2hlbiB0aGUgZmlyc3QgPGxlZ2VuZD4gKGluIGRvY3VtZW50IG9yZGVyKSBpcyBmb3VuZFxuICAgICAgICAgIGlmIChjaGlsZC50YWdOYW1lID09PSAnTEVHRU5EJykge1xuICAgICAgICAgICAgLy8gaWYgaXRzIHBhcmVudCA8ZmllbGRzZXQ+IGlzIG5vdCBuZXN0ZWQgaW4gYW5vdGhlciBkaXNhYmxlZCA8ZmllbGRzZXQ+LFxuICAgICAgICAgICAgLy8gcmV0dXJuIHdoZXRoZXIgYG5vZGVgIGlzIGEgZGVzY2VuZGFudCBvZiBpdHMgZmlyc3QgPGxlZ2VuZD5cbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzLmNhbGwocGFyZW50Tm9kZSwgJ2ZpZWxkc2V0W2Rpc2FibGVkXSAqJykgPyB0cnVlIDogIWNoaWxkLmNvbnRhaW5zKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgZGlzYWJsZWQgPGZpZWxkc2V0PiBjb250YWluaW5nIGBub2RlYCBoYXMgbm8gPGxlZ2VuZD5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgfVxuXG4gIC8vIGVsc2UsIG5vZGUncyB0YWJiYWJsZS9mb2N1c2FibGUgc3RhdGUgc2hvdWxkIG5vdCBiZSBhZmZlY3RlZCBieSBhIGZpZWxkc2V0J3NcbiAgLy8gIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGVcbiAgcmV0dXJuIGZhbHNlO1xufTtcbnZhciBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlID0gZnVuY3Rpb24gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZShvcHRpb25zLCBub2RlKSB7XG4gIGlmIChub2RlLmRpc2FibGVkIHx8XG4gIC8vIHdlIG11c3QgZG8gYW4gaW5lcnQgbG9vayB1cCB0byBmaWx0ZXIgb3V0IGFueSBlbGVtZW50cyBpbnNpZGUgYW4gaW5lcnQgYW5jZXN0b3JcbiAgLy8gIGJlY2F1c2Ugd2UncmUgbGltaXRlZCBpbiB0aGUgdHlwZSBvZiBzZWxlY3RvcnMgd2UgY2FuIHVzZSBpbiBKU0RvbSAoc2VlIHJlbGF0ZWRcbiAgLy8gIG5vdGUgcmVsYXRlZCB0byBgY2FuZGlkYXRlU2VsZWN0b3JzYClcbiAgaXNJbmVydChub2RlKSB8fCBpc0hpZGRlbklucHV0KG5vZGUpIHx8IGlzSGlkZGVuKG5vZGUsIG9wdGlvbnMpIHx8XG4gIC8vIEZvciBhIGRldGFpbHMgZWxlbWVudCB3aXRoIGEgc3VtbWFyeSwgdGhlIHN1bW1hcnkgZWxlbWVudCBnZXRzIHRoZSBmb2N1c1xuICBpc0RldGFpbHNXaXRoU3VtbWFyeShub2RlKSB8fCBpc0Rpc2FibGVkRnJvbUZpZWxkc2V0KG5vZGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBpc05vZGVNYXRjaGluZ1NlbGVjdG9yVGFiYmFibGUgPSBmdW5jdGlvbiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yVGFiYmFibGUob3B0aW9ucywgbm9kZSkge1xuICBpZiAoaXNOb25UYWJiYWJsZVJhZGlvKG5vZGUpIHx8IGdldFRhYkluZGV4KG5vZGUpIDwgMCB8fCAhaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZShvcHRpb25zLCBub2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgaXNWYWxpZFNoYWRvd1Jvb3RUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzVmFsaWRTaGFkb3dSb290VGFiYmFibGUoc2hhZG93SG9zdE5vZGUpIHtcbiAgdmFyIHRhYkluZGV4ID0gcGFyc2VJbnQoc2hhZG93SG9zdE5vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpLCAxMCk7XG4gIGlmIChpc05hTih0YWJJbmRleCkgfHwgdGFiSW5kZXggPj0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIElmIGEgY3VzdG9tIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IG5lZ2F0aXZlIHRhYmluZGV4LFxuICAvLyBicm93c2VycyB3aWxsIG5vdCBhbGxvdyB0YWIgdGFyZ2V0aW5nIHNhaWQgZWxlbWVudCdzIGNoaWxkcmVuLlxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXkuPEVsZW1lbnR8Q2FuZGlkYXRlU2NvcGU+fSBjYW5kaWRhdGVzXG4gKiBAcmV0dXJucyBFbGVtZW50W11cbiAqL1xudmFyIHNvcnRCeU9yZGVyID0gZnVuY3Rpb24gc29ydEJ5T3JkZXIoY2FuZGlkYXRlcykge1xuICB2YXIgcmVndWxhclRhYmJhYmxlcyA9IFtdO1xuICB2YXIgb3JkZXJlZFRhYmJhYmxlcyA9IFtdO1xuICBjYW5kaWRhdGVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICB2YXIgaXNTY29wZSA9ICEhaXRlbS5zY29wZVBhcmVudDtcbiAgICB2YXIgZWxlbWVudCA9IGlzU2NvcGUgPyBpdGVtLnNjb3BlUGFyZW50IDogaXRlbTtcbiAgICB2YXIgY2FuZGlkYXRlVGFiaW5kZXggPSBnZXRTb3J0T3JkZXJUYWJJbmRleChlbGVtZW50LCBpc1Njb3BlKTtcbiAgICB2YXIgZWxlbWVudHMgPSBpc1Njb3BlID8gc29ydEJ5T3JkZXIoaXRlbS5jYW5kaWRhdGVzKSA6IGVsZW1lbnQ7XG4gICAgaWYgKGNhbmRpZGF0ZVRhYmluZGV4ID09PSAwKSB7XG4gICAgICBpc1Njb3BlID8gcmVndWxhclRhYmJhYmxlcy5wdXNoLmFwcGx5KHJlZ3VsYXJUYWJiYWJsZXMsIGVsZW1lbnRzKSA6IHJlZ3VsYXJUYWJiYWJsZXMucHVzaChlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3JkZXJlZFRhYmJhYmxlcy5wdXNoKHtcbiAgICAgICAgZG9jdW1lbnRPcmRlcjogaSxcbiAgICAgICAgdGFiSW5kZXg6IGNhbmRpZGF0ZVRhYmluZGV4LFxuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBpc1Njb3BlOiBpc1Njb3BlLFxuICAgICAgICBjb250ZW50OiBlbGVtZW50c1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9yZGVyZWRUYWJiYWJsZXMuc29ydChzb3J0T3JkZXJlZFRhYmJhYmxlcykucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHNvcnRhYmxlKSB7XG4gICAgc29ydGFibGUuaXNTY29wZSA/IGFjYy5wdXNoLmFwcGx5KGFjYywgc29ydGFibGUuY29udGVudCkgOiBhY2MucHVzaChzb3J0YWJsZS5jb250ZW50KTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSkuY29uY2F0KHJlZ3VsYXJUYWJiYWJsZXMpO1xufTtcbnZhciB0YWJiYWJsZSA9IGZ1bmN0aW9uIHRhYmJhYmxlKGNvbnRhaW5lciwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGNhbmRpZGF0ZXM7XG4gIGlmIChvcHRpb25zLmdldFNoYWRvd1Jvb3QpIHtcbiAgICBjYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5KFtjb250YWluZXJdLCBvcHRpb25zLmluY2x1ZGVDb250YWluZXIsIHtcbiAgICAgIGZpbHRlcjogaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlLmJpbmQobnVsbCwgb3B0aW9ucyksXG4gICAgICBmbGF0dGVuOiBmYWxzZSxcbiAgICAgIGdldFNoYWRvd1Jvb3Q6IG9wdGlvbnMuZ2V0U2hhZG93Um9vdCxcbiAgICAgIHNoYWRvd1Jvb3RGaWx0ZXI6IGlzVmFsaWRTaGFkb3dSb290VGFiYmFibGVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlcyhjb250YWluZXIsIG9wdGlvbnMuaW5jbHVkZUNvbnRhaW5lciwgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlLmJpbmQobnVsbCwgb3B0aW9ucykpO1xuICB9XG4gIHJldHVybiBzb3J0QnlPcmRlcihjYW5kaWRhdGVzKTtcbn07XG52YXIgZm9jdXNhYmxlID0gZnVuY3Rpb24gZm9jdXNhYmxlKGNvbnRhaW5lciwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGNhbmRpZGF0ZXM7XG4gIGlmIChvcHRpb25zLmdldFNoYWRvd1Jvb3QpIHtcbiAgICBjYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlc0l0ZXJhdGl2ZWx5KFtjb250YWluZXJdLCBvcHRpb25zLmluY2x1ZGVDb250YWluZXIsIHtcbiAgICAgIGZpbHRlcjogaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpLFxuICAgICAgZmxhdHRlbjogdHJ1ZSxcbiAgICAgIGdldFNoYWRvd1Jvb3Q6IG9wdGlvbnMuZ2V0U2hhZG93Um9vdFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzKGNvbnRhaW5lciwgb3B0aW9ucy5pbmNsdWRlQ29udGFpbmVyLCBpc05vZGVNYXRjaGluZ1NlbGVjdG9yRm9jdXNhYmxlLmJpbmQobnVsbCwgb3B0aW9ucykpO1xuICB9XG4gIHJldHVybiBjYW5kaWRhdGVzO1xufTtcbnZhciBpc1RhYmJhYmxlID0gZnVuY3Rpb24gaXNUYWJiYWJsZShub2RlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG5vZGUgcHJvdmlkZWQnKTtcbiAgfVxuICBpZiAobWF0Y2hlcy5jYWxsKG5vZGUsIGNhbmRpZGF0ZVNlbGVjdG9yKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZShvcHRpb25zLCBub2RlKTtcbn07XG52YXIgZm9jdXNhYmxlQ2FuZGlkYXRlU2VsZWN0b3IgPSAvKiAjX19QVVJFX18gKi9jYW5kaWRhdGVTZWxlY3RvcnMuY29uY2F0KCdpZnJhbWUnKS5qb2luKCcsJyk7XG52YXIgaXNGb2N1c2FibGUgPSBmdW5jdGlvbiBpc0ZvY3VzYWJsZShub2RlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG5vZGUgcHJvdmlkZWQnKTtcbiAgfVxuICBpZiAobWF0Y2hlcy5jYWxsKG5vZGUsIGZvY3VzYWJsZUNhbmRpZGF0ZVNlbGVjdG9yKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUob3B0aW9ucywgbm9kZSk7XG59O1xuXG5leHBvcnQgeyBmb2N1c2FibGUsIGdldFRhYkluZGV4LCBpc0ZvY3VzYWJsZSwgaXNUYWJiYWJsZSwgdGFiYmFibGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbS5qcy5tYXBcbiIsIiFmdW5jdGlvbihlLHQpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLHQpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMudHJpbUNhbnZhcz10KCk6ZS50cmltQ2FudmFzPXQoKX0odGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe2lmKHJbbl0pcmV0dXJuIHJbbl0uZXhwb3J0czt2YXIgbz1yW25dPXtleHBvcnRzOnt9LGlkOm4sbG9hZGVkOiExfTtyZXR1cm4gZVtuXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyx0KSxvLmxvYWRlZD0hMCxvLmV4cG9ydHN9dmFyIHI9e307cmV0dXJuIHQubT1lLHQuYz1yLHQucD1cIlwiLHQoMCl9KFtmdW5jdGlvbihlLHQpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9ZS5nZXRDb250ZXh0KFwiMmRcIikscj1lLndpZHRoLG49ZS5oZWlnaHQsbz10LmdldEltYWdlRGF0YSgwLDAscixuKS5kYXRhLGY9YSghMCxyLG4sbyksaT1hKCExLHIsbixvKSxjPXUoITAscixuLG8pLGQ9dSghMSxyLG4sbykscD1kLWMrMSxsPWktZisxLHM9dC5nZXRJbWFnZURhdGEoYyxmLHAsbCk7cmV0dXJuIGUud2lkdGg9cCxlLmhlaWdodD1sLHQuY2xlYXJSZWN0KDAsMCxwLGwpLHQucHV0SW1hZ2VEYXRhKHMsMCwwKSxlfWZ1bmN0aW9uIG4oZSx0LHIsbil7cmV0dXJue3JlZDpuWzQqKHIqdCtlKV0sZ3JlZW46bls0KihyKnQrZSkrMV0sYmx1ZTpuWzQqKHIqdCtlKSsyXSxhbHBoYTpuWzQqKHIqdCtlKSszXX19ZnVuY3Rpb24gbyhlLHQscixvKXtyZXR1cm4gbihlLHQscixvKS5hbHBoYX1mdW5jdGlvbiBhKGUsdCxyLG4pe2Zvcih2YXIgYT1lPzE6LTEsdT1lPzA6ci0xLGY9dTtlP2Y8cjpmPi0xO2YrPWEpZm9yKHZhciBpPTA7aTx0O2krKylpZihvKGksZix0LG4pKXJldHVybiBmO3JldHVybiBudWxsfWZ1bmN0aW9uIHUoZSx0LHIsbil7Zm9yKHZhciBhPWU/MTotMSx1PWU/MDp0LTEsZj11O2U/Zjx0OmY+LTE7Zis9YSlmb3IodmFyIGk9MDtpPHI7aSsrKWlmKG8oZixpLHQsbikpcmV0dXJuIGY7cmV0dXJuIG51bGx9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5kZWZhdWx0PXJ9XSl9KTsiLCIvKipcbiAqIEFzc2lnbnMgYSB2YWx1ZSBmb3IgYSBnaXZlbiByZWYsIG5vIG1hdHRlciBvZiB0aGUgcmVmIGZvcm1hdFxuICogQHBhcmFtIHtSZWZPYmplY3R9IHJlZiAtIGEgY2FsbGJhY2sgZnVuY3Rpb24gb3IgcmVmIG9iamVjdFxuICogQHBhcmFtIHZhbHVlIC0gYSBuZXcgdmFsdWVcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVLYXNoZXkvdXNlLWNhbGxiYWNrLXJlZiNhc3NpZ25yZWZcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByZWZPYmplY3QgPSB1c2VSZWYoKTtcbiAqIGNvbnN0IHJlZkZuID0gKHJlZikgPT4gey4uLi59XG4gKlxuICogYXNzaWduUmVmKHJlZk9iamVjdCwgXCJyZWZWYWx1ZVwiKTtcbiAqIGFzc2lnblJlZihyZWZGbiwgXCJyZWZWYWx1ZVwiKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnblJlZihyZWYsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVmKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVmKSB7XG4gICAgICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZWY7XG59XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBhc3NpZ25SZWYgfSBmcm9tICcuL2Fzc2lnblJlZic7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZiB9IGZyb20gJy4vdXNlUmVmJztcbnZhciB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG52YXIgY3VycmVudFZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIE1lcmdlcyB0d28gb3IgbW9yZSByZWZzIHRvZ2V0aGVyIHByb3ZpZGluZyBhIHNpbmdsZSBpbnRlcmZhY2UgdG8gc2V0IHRoZWlyIHZhbHVlXG4gKiBAcGFyYW0ge1JlZk9iamVjdHxSZWZ9IHJlZnNcbiAqIEByZXR1cm5zIHtNdXRhYmxlUmVmT2JqZWN0fSAtIGEgbmV3IHJlZiwgd2hpY2ggdHJhbnNsYXRlcyBhbGwgY2hhbmdlcyB0byB7cmVmc31cbiAqXG4gKiBAc2VlIHtAbGluayBtZXJnZVJlZnN9IGEgdmVyc2lvbiB3aXRob3V0IGJ1aXQtaW4gbWVtb2l6YXRpb25cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RoZUthc2hleS91c2UtY2FsbGJhY2stcmVmI3VzZW1lcmdlcmVmc1xuICogQGV4YW1wbGVcbiAqIGNvbnN0IENvbXBvbmVudCA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHtcbiAqICAgY29uc3Qgb3duUmVmID0gdXNlUmVmKCk7XG4gKiAgIGNvbnN0IGRvbVJlZiA9IHVzZU1lcmdlUmVmcyhbcmVmLCBvd25SZWZdKTsgLy8g8J+RiCBtZXJnZSB0b2dldGhlclxuICogICByZXR1cm4gPGRpdiByZWY9e2RvbVJlZn0+Li4uPC9kaXY+XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNZXJnZVJlZnMocmVmcywgZGVmYXVsdFZhbHVlKSB7XG4gICAgdmFyIGNhbGxiYWNrUmVmID0gdXNlQ2FsbGJhY2tSZWYoZGVmYXVsdFZhbHVlIHx8IG51bGwsIGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gcmVmcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHsgcmV0dXJuIGFzc2lnblJlZihyZWYsIG5ld1ZhbHVlKTsgfSk7XG4gICAgfSk7XG4gICAgLy8gaGFuZGxlIHJlZnMgY2hhbmdlcyAtIGFkZGVkIG9yIHJlbW92ZWRcbiAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gY3VycmVudFZhbHVlcy5nZXQoY2FsbGJhY2tSZWYpO1xuICAgICAgICBpZiAob2xkVmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBwcmV2UmVmc18xID0gbmV3IFNldChvbGRWYWx1ZSk7XG4gICAgICAgICAgICB2YXIgbmV4dFJlZnNfMSA9IG5ldyBTZXQocmVmcyk7XG4gICAgICAgICAgICB2YXIgY3VycmVudF8xID0gY2FsbGJhY2tSZWYuY3VycmVudDtcbiAgICAgICAgICAgIHByZXZSZWZzXzEuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0UmVmc18xLmhhcyhyZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2lnblJlZihyZWYsIG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbmV4dFJlZnNfMS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXZSZWZzXzEuaGFzKHJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzaWduUmVmKHJlZiwgY3VycmVudF8xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50VmFsdWVzLnNldChjYWxsYmFja1JlZiwgcmVmcyk7XG4gICAgfSwgW3JlZnNdKTtcbiAgICByZXR1cm4gY2FsbGJhY2tSZWY7XG59XG4iLCJpbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogY3JlYXRlcyBhIE11dGFibGVSZWYgd2l0aCByZWYgY2hhbmdlIGNhbGxiYWNrXG4gKiBAcGFyYW0gaW5pdGlhbFZhbHVlIC0gaW5pdGlhbCByZWYgdmFsdWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gYSBjYWxsYmFjayB0byBydW4gd2hlbiB2YWx1ZSBjaGFuZ2VzXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHJlZiA9IHVzZUNhbGxiYWNrUmVmKDAsIChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IGNvbnNvbGUubG9nKG9sZFZhbHVlLCAnLT4nLCBuZXdWYWx1ZSk7XG4gKiByZWYuY3VycmVudCA9IDE7XG4gKiAvLyBwcmludHMgMCAtPiAxXG4gKlxuICogQHNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvaG9va3MtcmVmZXJlbmNlLmh0bWwjdXNlcmVmXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVLYXNoZXkvdXNlLWNhbGxiYWNrLXJlZiN1c2VjYWxsYmFja3JlZi0tLXRvLXJlcGxhY2UtcmVhY3R1c2VyZWZcbiAqIEByZXR1cm5zIHtNdXRhYmxlUmVmT2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ2FsbGJhY2tSZWYoaW5pdGlhbFZhbHVlLCBjYWxsYmFjaykge1xuICAgIHZhciByZWYgPSB1c2VTdGF0ZShmdW5jdGlvbiAoKSB7IHJldHVybiAoe1xuICAgICAgICAvLyB2YWx1ZVxuICAgICAgICB2YWx1ZTogaW5pdGlhbFZhbHVlLFxuICAgICAgICAvLyBsYXN0IGNhbGxiYWNrXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgLy8gXCJtZW1vaXplZFwiIHB1YmxpYyBpbnRlcmZhY2VcbiAgICAgICAgZmFjYWRlOiB7XG4gICAgICAgICAgICBnZXQgY3VycmVudCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmLnZhbHVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCBjdXJyZW50KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhc3QgPSByZWYudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZi52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZWYuY2FsbGJhY2sodmFsdWUsIGxhc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7IH0pWzBdO1xuICAgIC8vIHVwZGF0ZSBjYWxsYmFja1xuICAgIHJlZi5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHJldHVybiByZWYuZmFjYWRlO1xufVxuIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIFNpZGVDYXIgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgc2lkZUNhciA9IF9hLnNpZGVDYXIsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcInNpZGVDYXJcIl0pO1xuICAgIGlmICghc2lkZUNhcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpZGVjYXI6IHBsZWFzZSBwcm92aWRlIGBzaWRlQ2FyYCBwcm9wZXJ0eSB0byBpbXBvcnQgdGhlIHJpZ2h0IGNhcicpO1xuICAgIH1cbiAgICB2YXIgVGFyZ2V0ID0gc2lkZUNhci5yZWFkKCk7XG4gICAgaWYgKCFUYXJnZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaWRlY2FyIG1lZGl1bSBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFyZ2V0LCBfX2Fzc2lnbih7fSwgcmVzdCkpO1xufTtcblNpZGVDYXIuaXNTaWRlQ2FyRXhwb3J0ID0gdHJ1ZTtcbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRTaWRlY2FyKG1lZGl1bSwgZXhwb3J0ZWQpIHtcbiAgICBtZWRpdW0udXNlTWVkaXVtKGV4cG9ydGVkKTtcbiAgICByZXR1cm4gU2lkZUNhcjtcbn1cbiIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5mdW5jdGlvbiBJdG9JKGEpIHtcbiAgICByZXR1cm4gYTtcbn1cbmZ1bmN0aW9uIGlubmVyQ3JlYXRlTWVkaXVtKGRlZmF1bHRzLCBtaWRkbGV3YXJlKSB7XG4gICAgaWYgKG1pZGRsZXdhcmUgPT09IHZvaWQgMCkgeyBtaWRkbGV3YXJlID0gSXRvSTsgfVxuICAgIHZhciBidWZmZXIgPSBbXTtcbiAgICB2YXIgYXNzaWduZWQgPSBmYWxzZTtcbiAgICB2YXIgbWVkaXVtID0ge1xuICAgICAgICByZWFkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoYXNzaWduZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpZGVjYXI6IGNvdWxkIG5vdCBgcmVhZGAgZnJvbSBhbiBgYXNzaWduZWRgIG1lZGl1bS4gYHJlYWRgIGNvdWxkIGJlIHVzZWQgb25seSB3aXRoIGB1c2VNZWRpdW1gLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyW2J1ZmZlci5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICAgICAgfSxcbiAgICAgICAgdXNlTWVkaXVtOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBtaWRkbGV3YXJlKGRhdGEsIGFzc2lnbmVkKTtcbiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXIuZmlsdGVyKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4ICE9PSBpdGVtOyB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGFzc2lnblN5bmNNZWRpdW06IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgYXNzaWduZWQgPSB0cnVlO1xuICAgICAgICAgICAgd2hpbGUgKGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2JzID0gYnVmZmVyO1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICAgICAgICAgIGNicy5mb3JFYWNoKGNiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciA9IHtcbiAgICAgICAgICAgICAgICBwdXNoOiBmdW5jdGlvbiAoeCkgeyByZXR1cm4gY2IoeCk7IH0sXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiAoKSB7IHJldHVybiBidWZmZXI7IH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBhc3NpZ25NZWRpdW06IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgYXNzaWduZWQgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIHBlbmRpbmdRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2JzID0gYnVmZmVyO1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICAgICAgICAgIGNicy5mb3JFYWNoKGNiKTtcbiAgICAgICAgICAgICAgICBwZW5kaW5nUXVldWUgPSBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZXhlY3V0ZVF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBjYnMgPSBwZW5kaW5nUXVldWU7XG4gICAgICAgICAgICAgICAgcGVuZGluZ1F1ZXVlID0gW107XG4gICAgICAgICAgICAgICAgY2JzLmZvckVhY2goY2IpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBjeWNsZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZXhlY3V0ZVF1ZXVlKTsgfTtcbiAgICAgICAgICAgIGN5Y2xlKCk7XG4gICAgICAgICAgICBidWZmZXIgPSB7XG4gICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1F1ZXVlLnB1c2goeCk7XG4gICAgICAgICAgICAgICAgICAgIGN5Y2xlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1F1ZXVlID0gcGVuZGluZ1F1ZXVlLmZpbHRlcihmaWx0ZXIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIG1lZGl1bTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZWRpdW0oZGVmYXVsdHMsIG1pZGRsZXdhcmUpIHtcbiAgICBpZiAobWlkZGxld2FyZSA9PT0gdm9pZCAwKSB7IG1pZGRsZXdhcmUgPSBJdG9JOyB9XG4gICAgcmV0dXJuIGlubmVyQ3JlYXRlTWVkaXVtKGRlZmF1bHRzLCBtaWRkbGV3YXJlKTtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2lkZWNhck1lZGl1bShvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgbWVkaXVtID0gaW5uZXJDcmVhdGVNZWRpdW0obnVsbCk7XG4gICAgbWVkaXVtLm9wdGlvbnMgPSBfX2Fzc2lnbih7IGFzeW5jOiB0cnVlLCBzc3I6IGZhbHNlIH0sIG9wdGlvbnMpO1xuICAgIHJldHVybiBtZWRpdW07XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiB1c2Utc3luYy1leHRlcm5hbC1zdG9yZS13aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxudmFyIHVzZVN5bmNFeHRlcm5hbFN0b3JlID0gUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmU7XG5cbi8vIGZvciBDb21tb25KUyBpbnRlcm9wLlxuXG52YXIgdXNlUmVmID0gUmVhY3QudXNlUmVmLFxuICAgIHVzZUVmZmVjdCA9IFJlYWN0LnVzZUVmZmVjdCxcbiAgICB1c2VNZW1vID0gUmVhY3QudXNlTWVtbyxcbiAgICB1c2VEZWJ1Z1ZhbHVlID0gUmVhY3QudXNlRGVidWdWYWx1ZTsgLy8gU2FtZSBhcyB1c2VTeW5jRXh0ZXJuYWxTdG9yZSwgYnV0IHN1cHBvcnRzIHNlbGVjdG9yIGFuZCBpc0VxdWFsIGFyZ3VtZW50cy5cblxuZnVuY3Rpb24gdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3Ioc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QsIHNlbGVjdG9yLCBpc0VxdWFsKSB7XG4gIC8vIFVzZSB0aGlzIHRvIHRyYWNrIHRoZSByZW5kZXJlZCBzbmFwc2hvdC5cbiAgdmFyIGluc3RSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHZhciBpbnN0O1xuXG4gIGlmIChpbnN0UmVmLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICBpbnN0ID0ge1xuICAgICAgaGFzVmFsdWU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG51bGxcbiAgICB9O1xuICAgIGluc3RSZWYuY3VycmVudCA9IGluc3Q7XG4gIH0gZWxzZSB7XG4gICAgaW5zdCA9IGluc3RSZWYuY3VycmVudDtcbiAgfVxuXG4gIHZhciBfdXNlTWVtbyA9IHVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIC8vIFRyYWNrIHRoZSBtZW1vaXplZCBzdGF0ZSB1c2luZyBjbG9zdXJlIHZhcmlhYmxlcyB0aGF0IGFyZSBsb2NhbCB0byB0aGlzXG4gICAgLy8gbWVtb2l6ZWQgaW5zdGFuY2Ugb2YgYSBnZXRTbmFwc2hvdCBmdW5jdGlvbi4gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgYVxuICAgIC8vIHVzZVJlZiBob29rLCBiZWNhdXNlIHRoYXQgc3RhdGUgd291bGQgYmUgc2hhcmVkIGFjcm9zcyBhbGwgY29uY3VycmVudFxuICAgIC8vIGNvcGllcyBvZiB0aGUgaG9vay9jb21wb25lbnQuXG4gICAgdmFyIGhhc01lbW8gPSBmYWxzZTtcbiAgICB2YXIgbWVtb2l6ZWRTbmFwc2hvdDtcbiAgICB2YXIgbWVtb2l6ZWRTZWxlY3Rpb247XG5cbiAgICB2YXIgbWVtb2l6ZWRTZWxlY3RvciA9IGZ1bmN0aW9uIChuZXh0U25hcHNob3QpIHtcbiAgICAgIGlmICghaGFzTWVtbykge1xuICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSB0aGUgaG9vayBpcyBjYWxsZWQsIHRoZXJlIGlzIG5vIG1lbW9pemVkIHJlc3VsdC5cbiAgICAgICAgaGFzTWVtbyA9IHRydWU7XG4gICAgICAgIG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3Q7XG5cbiAgICAgICAgdmFyIF9uZXh0U2VsZWN0aW9uID0gc2VsZWN0b3IobmV4dFNuYXBzaG90KTtcblxuICAgICAgICBpZiAoaXNFcXVhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gRXZlbiBpZiB0aGUgc2VsZWN0b3IgaGFzIGNoYW5nZWQsIHRoZSBjdXJyZW50bHkgcmVuZGVyZWQgc2VsZWN0aW9uXG4gICAgICAgICAgLy8gbWF5IGJlIGVxdWFsIHRvIHRoZSBuZXcgc2VsZWN0aW9uLiBXZSBzaG91bGQgYXR0ZW1wdCB0byByZXVzZSB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IHZhbHVlIGlmIHBvc3NpYmxlLCB0byBwcmVzZXJ2ZSBkb3duc3RyZWFtIG1lbW9pemF0aW9ucy5cbiAgICAgICAgICBpZiAoaW5zdC5oYXNWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBpbnN0LnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoaXNFcXVhbChjdXJyZW50U2VsZWN0aW9uLCBfbmV4dFNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtZW1vaXplZFNlbGVjdGlvbiA9IF9uZXh0U2VsZWN0aW9uO1xuICAgICAgICByZXR1cm4gX25leHRTZWxlY3Rpb247XG4gICAgICB9IC8vIFdlIG1heSBiZSBhYmxlIHRvIHJldXNlIHRoZSBwcmV2aW91cyBpbnZvY2F0aW9uJ3MgcmVzdWx0LlxuXG5cbiAgICAgIC8vIFdlIG1heSBiZSBhYmxlIHRvIHJldXNlIHRoZSBwcmV2aW91cyBpbnZvY2F0aW9uJ3MgcmVzdWx0LlxuICAgICAgdmFyIHByZXZTbmFwc2hvdCA9IG1lbW9pemVkU25hcHNob3Q7XG4gICAgICB2YXIgcHJldlNlbGVjdGlvbiA9IG1lbW9pemVkU2VsZWN0aW9uO1xuXG4gICAgICBpZiAob2JqZWN0SXMocHJldlNuYXBzaG90LCBuZXh0U25hcHNob3QpKSB7XG4gICAgICAgIC8vIFRoZSBzbmFwc2hvdCBpcyB0aGUgc2FtZSBhcyBsYXN0IHRpbWUuIFJldXNlIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uXG4gICAgICAgIHJldHVybiBwcmV2U2VsZWN0aW9uO1xuICAgICAgfSAvLyBUaGUgc25hcHNob3QgaGFzIGNoYW5nZWQsIHNvIHdlIG5lZWQgdG8gY29tcHV0ZSBhIG5ldyBzZWxlY3Rpb24uXG5cblxuICAgICAgLy8gVGhlIHNuYXBzaG90IGhhcyBjaGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIGNvbXB1dGUgYSBuZXcgc2VsZWN0aW9uLlxuICAgICAgdmFyIG5leHRTZWxlY3Rpb24gPSBzZWxlY3RvcihuZXh0U25hcHNob3QpOyAvLyBJZiBhIGN1c3RvbSBpc0VxdWFsIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB1c2UgdGhhdCB0byBjaGVjayBpZiB0aGUgZGF0YVxuICAgICAgLy8gaGFzIGNoYW5nZWQuIElmIGl0IGhhc24ndCwgcmV0dXJuIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uIFRoYXQgc2lnbmFsc1xuICAgICAgLy8gdG8gUmVhY3QgdGhhdCB0aGUgc2VsZWN0aW9ucyBhcmUgY29uY2VwdHVhbGx5IGVxdWFsLCBhbmQgd2UgY2FuIGJhaWxcbiAgICAgIC8vIG91dCBvZiByZW5kZXJpbmcuXG5cbiAgICAgIC8vIElmIGEgY3VzdG9tIGlzRXF1YWwgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHVzZSB0aGF0IHRvIGNoZWNrIGlmIHRoZSBkYXRhXG4gICAgICAvLyBoYXMgY2hhbmdlZC4gSWYgaXQgaGFzbid0LCByZXR1cm4gdGhlIHByZXZpb3VzIHNlbGVjdGlvbi4gVGhhdCBzaWduYWxzXG4gICAgICAvLyB0byBSZWFjdCB0aGF0IHRoZSBzZWxlY3Rpb25zIGFyZSBjb25jZXB0dWFsbHkgZXF1YWwsIGFuZCB3ZSBjYW4gYmFpbFxuICAgICAgLy8gb3V0IG9mIHJlbmRlcmluZy5cbiAgICAgIGlmIChpc0VxdWFsICE9PSB1bmRlZmluZWQgJiYgaXNFcXVhbChwcmV2U2VsZWN0aW9uLCBuZXh0U2VsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gcHJldlNlbGVjdGlvbjtcbiAgICAgIH1cblxuICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcbiAgICAgIG1lbW9pemVkU2VsZWN0aW9uID0gbmV4dFNlbGVjdGlvbjtcbiAgICAgIHJldHVybiBuZXh0U2VsZWN0aW9uO1xuICAgIH07IC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3RhbnQgc28gdGhhdCBGbG93IGtub3dzIGl0IGNhbid0IGNoYW5nZS5cblxuXG4gICAgLy8gQXNzaWduaW5nIHRoaXMgdG8gYSBjb25zdGFudCBzbyB0aGF0IEZsb3cga25vd3MgaXQgY2FuJ3QgY2hhbmdlLlxuICAgIHZhciBtYXliZUdldFNlcnZlclNuYXBzaG90ID0gZ2V0U2VydmVyU25hcHNob3QgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBnZXRTZXJ2ZXJTbmFwc2hvdDtcblxuICAgIHZhciBnZXRTbmFwc2hvdFdpdGhTZWxlY3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZW1vaXplZFNlbGVjdG9yKGdldFNuYXBzaG90KCkpO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0U2VydmVyU25hcHNob3RXaXRoU2VsZWN0b3IgPSBtYXliZUdldFNlcnZlclNuYXBzaG90ID09PSBudWxsID8gdW5kZWZpbmVkIDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG1lbW9pemVkU2VsZWN0b3IobWF5YmVHZXRTZXJ2ZXJTbmFwc2hvdCgpKTtcbiAgICB9O1xuICAgIHJldHVybiBbZ2V0U25hcHNob3RXaXRoU2VsZWN0b3IsIGdldFNlcnZlclNuYXBzaG90V2l0aFNlbGVjdG9yXTtcbiAgfSwgW2dldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCwgc2VsZWN0b3IsIGlzRXF1YWxdKSxcbiAgICAgIGdldFNlbGVjdGlvbiA9IF91c2VNZW1vWzBdLFxuICAgICAgZ2V0U2VydmVyU2VsZWN0aW9uID0gX3VzZU1lbW9bMV07XG5cbiAgdmFyIHZhbHVlID0gdXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTZWxlY3Rpb24sIGdldFNlcnZlclNlbGVjdGlvbik7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaW5zdC5oYXNWYWx1ZSA9IHRydWU7XG4gICAgaW5zdC52YWx1ZSA9IHZhbHVlO1xuICB9LCBbdmFsdWVdKTtcbiAgdXNlRGVidWdWYWx1ZSh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtd2l0aC1zZWxlY3Rvci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS13aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1BWFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbWF4LmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTklMXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9uaWwuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJwYXJzZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcGFyc2UuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdHJpbmdpZnlcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3N0cmluZ2lmeS5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInYxXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF92LmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjFUb1Y2XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF92MVRvVi5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInYzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF92Mi5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInY0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF92My5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInY1XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF92NC5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInY2XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF92NS5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInY2VG9WMVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjZUb1YuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2N1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdjYuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2YWxpZGF0ZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdmFsaWRhdGUuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2ZXJzaW9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF92ZXJzaW9uLmRlZmF1bHQ7XG4gIH1cbn0pO1xudmFyIF9tYXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL21heC5qc1wiKSk7XG52YXIgX25pbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbmlsLmpzXCIpKTtcbnZhciBfcGFyc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlLmpzXCIpKTtcbnZhciBfc3RyaW5naWZ5ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIikpO1xudmFyIF92ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92MS5qc1wiKSk7XG52YXIgX3YxVG9WID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92MVRvVjYuanNcIikpO1xudmFyIF92MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjMuanNcIikpO1xudmFyIF92MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjQuanNcIikpO1xudmFyIF92NCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjUuanNcIikpO1xudmFyIF92NSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjYuanNcIikpO1xudmFyIF92NlRvViA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjZUb1YxLmpzXCIpKTtcbnZhciBfdjYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y3LmpzXCIpKTtcbnZhciBfdmFsaWRhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3ZhbGlkYXRlLmpzXCIpKTtcbnZhciBfdmVyc2lvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdmVyc2lvbi5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSAnZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmJzsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbi8qXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgSmF2YVNjcmlwdCBNRDVcbiAqXG4gKiBNb2RpZmljYXRpb24gb2YgSmF2YVNjcmlwdCBNRDVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtTUQ1XG4gKlxuICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIEJhc2VkIG9uXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjIgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDA5XG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBtb3JlIGluZm8uXG4gKi9cbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobXNnLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzW2ldID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtZDVUb0hleEVuY29kZWRBcnJheSh3b3Jkc1RvTWQ1KGJ5dGVzVG9Xb3JkcyhieXRlcyksIGJ5dGVzLmxlbmd0aCAqIDgpKTtcbn1cblxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcyB0byBhbiBhcnJheSBvZiBieXRlc1xuICovXG5mdW5jdGlvbiBtZDVUb0hleEVuY29kZWRBcnJheShpbnB1dCkge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDMyOyBpICs9IDgpIHtcbiAgICB2YXIgeCA9IGlucHV0W2kgPj4gNV0gPj4+IGkgJSAzMiAmIDB4ZmY7XG4gICAgdmFyIGhleCA9IHBhcnNlSW50KGhleFRhYi5jaGFyQXQoeCA+Pj4gNCAmIDB4MGYpICsgaGV4VGFiLmNoYXJBdCh4ICYgMHgwZiksIDE2KTtcbiAgICBvdXRwdXQucHVzaChoZXgpO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIG91dHB1dCBsZW5ndGggd2l0aCBwYWRkaW5nIGFuZCBiaXQgbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aDgpIHtcbiAgcmV0dXJuIChpbnB1dExlbmd0aDggKyA2NCA+Pj4gOSA8PCA0KSArIDE0ICsgMTtcbn1cblxuLypcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMsIGFuZCBhIGJpdCBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHdvcmRzVG9NZDUoeCwgbGVuKSB7XG4gIC8qIGFwcGVuZCBwYWRkaW5nICovXG4gIHhbbGVuID4+IDVdIHw9IDB4ODAgPDwgbGVuICUgMzI7XG4gIHhbZ2V0T3V0cHV0TGVuZ3RoKGxlbikgLSAxXSA9IGxlbjtcbiAgdmFyIGEgPSAxNzMyNTg0MTkzO1xuICB2YXIgYiA9IC0yNzE3MzM4Nzk7XG4gIHZhciBjID0gLTE3MzI1ODQxOTQ7XG4gIHZhciBkID0gMjcxNzMzODc4O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgdmFyIG9sZGEgPSBhO1xuICAgIHZhciBvbGRiID0gYjtcbiAgICB2YXIgb2xkYyA9IGM7XG4gICAgdmFyIG9sZGQgPSBkO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2ldLCA3LCAtNjgwODc2OTM2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE3LCA2MDYxMDU4MTkpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAzXSwgMjIsIC0xMDQ0NTI1MzMwKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgNF0sIDcsIC0xNzY0MTg4OTcpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA1XSwgMTIsIDEyMDAwODA0MjYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgN10sIDIyLCAtNDU3MDU5ODMpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNywgMTc3MDAzNTQxNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDldLCAxMiwgLTE5NTg0MTQ0MTcpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE3LCAtNDIwNjMpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNywgMTgwNDYwMzY4Mik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDEzXSwgMTIsIC00MDM0MTEwMSk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTVdLCAyMiwgMTIzNjUzNTMyOSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgNV0sIDQsIC0zNzg1NTgpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNiwgMTgzOTAzMDU2Mik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDE0XSwgMjMsIC0zNTMwOTU1Nik7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA0LCAtMTUzMDk5MjA2MCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDRdLCAxMSwgMTI3Mjg5MzM1Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNiwgLTE1NTQ5NzYzMik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMTNdLCA0LCA2ODEyNzkxNzQpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2ldLCAxMSwgLTM1ODUzNzIyMik7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNiwgLTcyMjUyMTk3OSk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDZdLCAyMywgNzYwMjkxODkpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNCwgLTY0MDM2NDQ4Nyk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE2LCA1MzA3NDI1MjApO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2ldLCA2LCAtMTk4NjMwODQ0KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgN10sIDEwLCAxMTI2ODkxNDE1KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA1XSwgMjEsIC01NzQzNDA1NSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNiwgMTcwMDQ4NTU3MSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE1LCAtMTA1MTUyMyk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNiwgMTg3MzMxMzM1OSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDE1XSwgMTAsIC0zMDYxMTc0NCk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNSwgLTE1NjAxOTgzODApO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxM10sIDIxLCAxMzA5MTUxNjQ5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgNF0sIDYsIC0xNDU1MjMwNzApO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNSwgNzE4Nzg3MjU5KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcbiAgICBhID0gc2FmZUFkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZUFkZChiLCBvbGRiKTtcbiAgICBjID0gc2FmZUFkZChjLCBvbGRjKTtcbiAgICBkID0gc2FmZUFkZChkLCBvbGRkKTtcbiAgfVxuICByZXR1cm4gW2EsIGIsIGMsIGRdO1xufVxuXG4vKlxuICogQ29udmVydCBhbiBhcnJheSBieXRlcyB0byBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gKiBDaGFyYWN0ZXJzID4yNTUgaGF2ZSB0aGVpciBoaWdoLWJ5dGUgc2lsZW50bHkgaWdub3JlZC5cbiAqL1xuZnVuY3Rpb24gYnl0ZXNUb1dvcmRzKGlucHV0KSB7XG4gIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlbmd0aDggPSBpbnB1dC5sZW5ndGggKiA4O1xuICB2YXIgb3V0cHV0ID0gbmV3IFVpbnQzMkFycmF5KGdldE91dHB1dExlbmd0aChsZW5ndGg4KSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoODsgaSArPSA4KSB7XG4gICAgb3V0cHV0W2kgPj4gNV0gfD0gKGlucHV0W2kgLyA4XSAmIDB4ZmYpIDw8IGkgJSAzMjtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKlxuICogQWRkIGludGVnZXJzLCB3cmFwcGluZyBhdCAyXjMyLiBUaGlzIHVzZXMgMTYtYml0IG9wZXJhdGlvbnMgaW50ZXJuYWxseVxuICogdG8gd29yayBhcm91bmQgYnVncyBpbiBzb21lIEpTIGludGVycHJldGVycy5cbiAqL1xuZnVuY3Rpb24gc2FmZUFkZCh4LCB5KSB7XG4gIHZhciBsc3cgPSAoeCAmIDB4ZmZmZikgKyAoeSAmIDB4ZmZmZik7XG4gIHZhciBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcbiAgcmV0dXJuIG1zdyA8PCAxNiB8IGxzdyAmIDB4ZmZmZjtcbn1cblxuLypcbiAqIEJpdHdpc2Ugcm90YXRlIGEgMzItYml0IG51bWJlciB0byB0aGUgbGVmdC5cbiAqL1xuZnVuY3Rpb24gYml0Um90YXRlTGVmdChudW0sIGNudCkge1xuICByZXR1cm4gbnVtIDw8IGNudCB8IG51bSA+Pj4gMzIgLSBjbnQ7XG59XG5cbi8qXG4gKiBUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IHRoZSBmb3VyIGJhc2ljIG9wZXJhdGlvbnMgdGhlIGFsZ29yaXRobSB1c2VzLlxuICovXG5mdW5jdGlvbiBtZDVjbW4ocSwgYSwgYiwgeCwgcywgdCkge1xuICByZXR1cm4gc2FmZUFkZChiaXRSb3RhdGVMZWZ0KHNhZmVBZGQoc2FmZUFkZChhLCBxKSwgc2FmZUFkZCh4LCB0KSksIHMpLCBiKTtcbn1cbmZ1bmN0aW9uIG1kNWZmKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgYyB8IH5iICYgZCwgYSwgYiwgeCwgcywgdCk7XG59XG5mdW5jdGlvbiBtZDVnZyhhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYiAmIGQgfCBjICYgfmQsIGEsIGIsIHgsIHMsIHQpO1xufVxuZnVuY3Rpb24gbWQ1aGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XG59XG5mdW5jdGlvbiBtZDVpaShhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYyBeIChiIHwgfmQpLCBhLCBiLCB4LCBzLCB0KTtcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IG1kNTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciByYW5kb21VVUlEID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQgJiYgY3J5cHRvLnJhbmRvbVVVSUQuYmluZChjcnlwdG8pO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0ge1xuICByYW5kb21VVUlEXG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3ZhbGlkYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92YWxpZGF0ZS5qc1wiKSk7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG5mdW5jdGlvbiBwYXJzZSh1dWlkKSB7XG4gIGlmICghKDAsIF92YWxpZGF0ZS5kZWZhdWx0KSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cbiAgdmFyIHY7XG4gIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxNik7XG5cbiAgLy8gUGFyc2UgIyMjIyMjIyMtLi4uLi0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG4gIGFyclswXSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgwLCA4KSwgMTYpKSA+Pj4gMjQ7XG4gIGFyclsxXSA9IHYgPj4+IDE2ICYgMHhmZjtcbiAgYXJyWzJdID0gdiA+Pj4gOCAmIDB4ZmY7XG4gIGFyclszXSA9IHYgJiAweGZmO1xuXG4gIC8vIFBhcnNlIC4uLi4uLi4uLSMjIyMtLi4uLi0uLi4uLS4uLi4uLi4uLi4uLlxuICBhcnJbNF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoOSwgMTMpLCAxNikpID4+PiA4O1xuICBhcnJbNV0gPSB2ICYgMHhmZjtcblxuICAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLSMjIyMtLi4uLi0uLi4uLi4uLi4uLi5cbiAgYXJyWzZdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDE0LCAxOCksIDE2KSkgPj4+IDg7XG4gIGFycls3XSA9IHYgJiAweGZmO1xuXG4gIC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tLi4uLi0jIyMjLS4uLi4uLi4uLi4uLlxuICBhcnJbOF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMTksIDIzKSwgMTYpKSA+Pj4gODtcbiAgYXJyWzldID0gdiAmIDB4ZmY7XG5cbiAgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLS4uLi4tIyMjIyMjIyMjIyMjXG4gIC8vIChVc2UgXCIvXCIgdG8gYXZvaWQgMzItYml0IHRydW5jYXRpb24gd2hlbiBiaXQtc2hpZnRpbmcgaGlnaC1vcmRlciBieXRlcylcbiAgYXJyWzEwXSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgyNCwgMzYpLCAxNikpIC8gMHgxMDAwMDAwMDAwMCAmIDB4ZmY7XG4gIGFyclsxMV0gPSB2IC8gMHgxMDAwMDAwMDAgJiAweGZmO1xuICBhcnJbMTJdID0gdiA+Pj4gMjQgJiAweGZmO1xuICBhcnJbMTNdID0gdiA+Pj4gMTYgJiAweGZmO1xuICBhcnJbMTRdID0gdiA+Pj4gOCAmIDB4ZmY7XG4gIGFyclsxNV0gPSB2ICYgMHhmZjtcbiAgcmV0dXJuIGFycjtcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHBhcnNlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gL14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS04XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB8ZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmKSQvaTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHJuZztcbi8vIFVuaXF1ZSBJRCBjcmVhdGlvbiByZXF1aXJlcyBhIGhpZ2ggcXVhbGl0eSByYW5kb20gIyBnZW5lcmF0b3IuIEluIHRoZSBicm93c2VyIHdlIHRoZXJlZm9yZVxuLy8gcmVxdWlyZSB0aGUgY3J5cHRvIEFQSSBhbmQgZG8gbm90IHN1cHBvcnQgYnVpbHQtaW4gZmFsbGJhY2sgdG8gbG93ZXIgcXVhbGl0eSByYW5kb20gbnVtYmVyXG4vLyBnZW5lcmF0b3JzIChsaWtlIE1hdGgucmFuZG9tKCkpLlxuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uXG4gICAgZ2V0UmFuZG9tVmFsdWVzID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKTtcbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ2V0UmFuZG9tVmFsdWVzKHJuZHM4KTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHggXiB5IF4gejtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCAmIHkgXiB4ICYgeiBeIHkgJiB6O1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cbmZ1bmN0aW9uIFJPVEwoeCwgbikge1xuICByZXR1cm4geCA8PCBuIHwgeCA+Pj4gMzIgLSBuO1xufVxuZnVuY3Rpb24gc2hhMShieXRlcykge1xuICB2YXIgSyA9IFsweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjLCAweGNhNjJjMWQ2XTtcbiAgdmFyIEggPSBbMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMF07XG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgICAgYnl0ZXMucHVzaChtc2cuY2hhckNvZGVBdChpKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGJ5dGVzKSkge1xuICAgIC8vIENvbnZlcnQgQXJyYXktbGlrZSB0byBBcnJheVxuICAgIGJ5dGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYnl0ZXMpO1xuICB9XG4gIGJ5dGVzLnB1c2goMHg4MCk7XG4gIHZhciBsID0gYnl0ZXMubGVuZ3RoIC8gNCArIDI7XG4gIHZhciBOID0gTWF0aC5jZWlsKGwgLyAxNik7XG4gIHZhciBNID0gbmV3IEFycmF5KE4pO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgYXJyW2pdID0gYnl0ZXNbX2kgKiA2NCArIGogKiA0XSA8PCAyNCB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDFdIDw8IDE2IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMl0gPDwgOCB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDNdO1xuICAgIH1cbiAgICBNW19pXSA9IGFycjtcbiAgfVxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBOOyArK19pMikge1xuICAgIHZhciBXID0gbmV3IFVpbnQzMkFycmF5KDgwKTtcbiAgICBmb3IgKHZhciB0ID0gMDsgdCA8IDE2OyArK3QpIHtcbiAgICAgIFdbdF0gPSBNW19pMl1bdF07XG4gICAgfVxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuICAgIHZhciBhID0gSFswXTtcbiAgICB2YXIgYiA9IEhbMV07XG4gICAgdmFyIGMgPSBIWzJdO1xuICAgIHZhciBkID0gSFszXTtcbiAgICB2YXIgZSA9IEhbNF07XG4gICAgZm9yICh2YXIgX3QyID0gMDsgX3QyIDwgODA7ICsrX3QyKSB7XG4gICAgICB2YXIgcyA9IE1hdGguZmxvb3IoX3QyIC8gMjApO1xuICAgICAgdmFyIFQgPSBST1RMKGEsIDUpICsgZihzLCBiLCBjLCBkKSArIGUgKyBLW3NdICsgV1tfdDJdID4+PiAwO1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIGMgPSBST1RMKGIsIDMwKSA+Pj4gMDtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IFQ7XG4gICAgfVxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cbiAgcmV0dXJuIFtIWzBdID4+IDI0ICYgMHhmZiwgSFswXSA+PiAxNiAmIDB4ZmYsIEhbMF0gPj4gOCAmIDB4ZmYsIEhbMF0gJiAweGZmLCBIWzFdID4+IDI0ICYgMHhmZiwgSFsxXSA+PiAxNiAmIDB4ZmYsIEhbMV0gPj4gOCAmIDB4ZmYsIEhbMV0gJiAweGZmLCBIWzJdID4+IDI0ICYgMHhmZiwgSFsyXSA+PiAxNiAmIDB4ZmYsIEhbMl0gPj4gOCAmIDB4ZmYsIEhbMl0gJiAweGZmLCBIWzNdID4+IDI0ICYgMHhmZiwgSFszXSA+PiAxNiAmIDB4ZmYsIEhbM10gPj4gOCAmIDB4ZmYsIEhbM10gJiAweGZmLCBIWzRdID4+IDI0ICYgMHhmZiwgSFs0XSA+PiAxNiAmIDB4ZmYsIEhbNF0gPj4gOCAmIDB4ZmYsIEhbNF0gJiAweGZmXTtcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHNoYTE7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5leHBvcnRzLnVuc2FmZVN0cmluZ2lmeSA9IHVuc2FmZVN0cmluZ2lmeTtcbnZhciBfdmFsaWRhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3ZhbGlkYXRlLmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xudmFyIGJ5dGVUb0hleCA9IFtdO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc2xpY2UoMSkpO1xufVxuZnVuY3Rpb24gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgLy9cbiAgLy8gTm90ZSB0byBmdXR1cmUtc2VsZjogTm8sIHlvdSBjYW4ndCByZW1vdmUgdGhlIGB0b0xvd2VyQ2FzZSgpYCBjYWxsLlxuICAvLyBSRUY6IGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZC9wdWxsLzY3NyNpc3N1ZWNvbW1lbnQtMTc1NzM1MTM1MVxuICByZXR1cm4gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICB2YXIgdXVpZCA9IHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCk7XG4gIC8vIENvbnNpc3RlbmN5IGNoZWNrIGZvciB2YWxpZCBVVUlELiAgSWYgdGhpcyB0aHJvd3MsIGl0J3MgbGlrZWx5IGR1ZSB0byBvbmVcbiAgLy8gb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gLSBPbmUgb3IgbW9yZSBpbnB1dCBhcnJheSB2YWx1ZXMgZG9uJ3QgbWFwIHRvIGEgaGV4IG9jdGV0IChsZWFkaW5nIHRvXG4gIC8vIFwidW5kZWZpbmVkXCIgaW4gdGhlIHV1aWQpXG4gIC8vIC0gSW52YWxpZCBpbnB1dCB2YWx1ZXMgZm9yIHRoZSBSRkMgYHZlcnNpb25gIG9yIGB2YXJpYW50YCBmaWVsZHNcbiAgaWYgKCEoMCwgX3ZhbGlkYXRlLmRlZmF1bHQpKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgfVxuICByZXR1cm4gdXVpZDtcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHN0cmluZ2lmeTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcm5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ybmcuanNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG4vLyAqKmB2MSgpYCAtIEdlbmVyYXRlIHRpbWUtYmFzZWQgVVVJRCoqXG4vL1xuLy8gSW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL0xpb3NLL1VVSUQuanNcbi8vIGFuZCBodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvdXVpZC5odG1sXG5cbnZhciBfbm9kZUlkO1xudmFyIF9jbG9ja3NlcTtcblxuLy8gUHJldmlvdXMgdXVpZCBjcmVhdGlvbiB0aW1lXG52YXIgX2xhc3RNU2VjcyA9IDA7XG52YXIgX2xhc3ROU2VjcyA9IDA7XG5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQgZm9yIEFQSSBkZXRhaWxzXG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgbmV3IEFycmF5KDE2KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlO1xuICB2YXIgY2xvY2tzZXEgPSBvcHRpb25zLmNsb2Nrc2VxO1xuXG4gIC8vIHYxIG9ubHk6IFVzZSBjYWNoZWQgYG5vZGVgIGFuZCBgY2xvY2tzZXFgIHZhbHVlc1xuICBpZiAoIW9wdGlvbnMuX3Y2KSB7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICBub2RlID0gX25vZGVJZDtcbiAgICB9XG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIGNsb2Nrc2VxID0gX2Nsb2Nrc2VxO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB3ZSBuZWVkIGVudHJvcHkuICBXZSBkbyB0aGlzIGxhemlseSB0byBtaW5pbWl6ZSBpc3N1ZXNcbiAgLy8gcmVsYXRlZCB0byBpbnN1ZmZpY2llbnQgc3lzdGVtIGVudHJvcHkuICBTZWUgIzE4OVxuICBpZiAobm9kZSA9PSBudWxsIHx8IGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICB2YXIgc2VlZEJ5dGVzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IF9ybmcuZGVmYXVsdCkoKTtcblxuICAgIC8vIFJhbmRvbWl6ZSBub2RlXG4gICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgbm9kZSA9IFtzZWVkQnl0ZXNbMF0sIHNlZWRCeXRlc1sxXSwgc2VlZEJ5dGVzWzJdLCBzZWVkQnl0ZXNbM10sIHNlZWRCeXRlc1s0XSwgc2VlZEJ5dGVzWzVdXTtcblxuICAgICAgLy8gdjEgb25seTogY2FjaGUgbm9kZSB2YWx1ZSBmb3IgcmV1c2VcbiAgICAgIGlmICghX25vZGVJZCAmJiAhb3B0aW9ucy5fdjYpIHtcbiAgICAgICAgLy8gcGVyIFJGQzQxMjIgNC41OiBTZXQgTUFDIG11bHRpY2FzdCBiaXQgKHYxIG9ubHkpXG4gICAgICAgIG5vZGVbMF0gfD0gMHgwMTsgLy8gU2V0IG11bHRpY2FzdCBiaXRcblxuICAgICAgICBfbm9kZUlkID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSYW5kb21pemUgY2xvY2tzZXFcbiAgICBpZiAoY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuMi4yLCByYW5kb21pemUgKDE0IGJpdCkgY2xvY2tzZXFcbiAgICAgIGNsb2Nrc2VxID0gKHNlZWRCeXRlc1s2XSA8PCA4IHwgc2VlZEJ5dGVzWzddKSAmIDB4M2ZmZjtcbiAgICAgIGlmIChfY2xvY2tzZXEgPT09IHVuZGVmaW5lZCAmJiAhb3B0aW9ucy5fdjYpIHtcbiAgICAgICAgX2Nsb2Nrc2VxID0gY2xvY2tzZXE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gdjEgJiB2NiB0aW1lc3RhbXBzIGFyZSAxMDAgbmFuby1zZWNvbmQgdW5pdHMgc2luY2UgdGhlIEdyZWdvcmlhbiBlcG9jaCxcbiAgLy8gKDE1ODItMTAtMTUgMDA6MDApLiAgSlNOdW1iZXJzIGFyZW4ndCBwcmVjaXNlIGVub3VnaCBmb3IgdGhpcywgc28gdGltZSBpc1xuICAvLyBoYW5kbGVkIGludGVybmFsbHkgYXMgJ21zZWNzJyAoaW50ZWdlciBtaWxsaXNlY29uZHMpIGFuZCAnbnNlY3MnXG4gIC8vICgxMDAtbmFub3NlY29uZHMgb2Zmc2V0IGZyb20gbXNlY3MpIHNpbmNlIHVuaXggZXBvY2gsIDE5NzAtMDEtMDEgMDA6MDAuXG4gIHZhciBtc2VjcyA9IG9wdGlvbnMubXNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubXNlY3MgOiBEYXRlLm5vdygpO1xuXG4gIC8vIFBlciA0LjIuMS4yLCB1c2UgY291bnQgb2YgdXVpZCdzIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgY2xvY2tcbiAgLy8gY3ljbGUgdG8gc2ltdWxhdGUgaGlnaGVyIHJlc29sdXRpb24gY2xvY2tcbiAgdmFyIG5zZWNzID0gb3B0aW9ucy5uc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5uc2VjcyA6IF9sYXN0TlNlY3MgKyAxO1xuXG4gIC8vIFRpbWUgc2luY2UgbGFzdCB1dWlkIGNyZWF0aW9uIChpbiBtc2VjcylcbiAgdmFyIGR0ID0gbXNlY3MgLSBfbGFzdE1TZWNzICsgKG5zZWNzIC0gX2xhc3ROU2VjcykgLyAxMDAwMDtcblxuICAvLyBQZXIgNC4yLjEuMiwgQnVtcCBjbG9ja3NlcSBvbiBjbG9jayByZWdyZXNzaW9uXG4gIGlmIChkdCA8IDAgJiYgb3B0aW9ucy5jbG9ja3NlcSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2xvY2tzZXEgPSBjbG9ja3NlcSArIDEgJiAweDNmZmY7XG4gIH1cblxuICAvLyBSZXNldCBuc2VjcyBpZiBjbG9jayByZWdyZXNzZXMgKG5ldyBjbG9ja3NlcSkgb3Igd2UndmUgbW92ZWQgb250byBhIG5ld1xuICAvLyB0aW1lIGludGVydmFsXG4gIGlmICgoZHQgPCAwIHx8IG1zZWNzID4gX2xhc3RNU2VjcykgJiYgb3B0aW9ucy5uc2VjcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbnNlY3MgPSAwO1xuICB9XG5cbiAgLy8gUGVyIDQuMi4xLjIgVGhyb3cgZXJyb3IgaWYgdG9vIG1hbnkgdXVpZHMgYXJlIHJlcXVlc3RlZFxuICBpZiAobnNlY3MgPj0gMTAwMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlY1wiKTtcbiAgfVxuICBfbGFzdE1TZWNzID0gbXNlY3M7XG4gIF9sYXN0TlNlY3MgPSBuc2VjcztcbiAgX2Nsb2Nrc2VxID0gY2xvY2tzZXE7XG5cbiAgLy8gUGVyIDQuMS40IC0gQ29udmVydCBmcm9tIHVuaXggZXBvY2ggdG8gR3JlZ29yaWFuIGVwb2NoXG4gIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwO1xuXG4gIC8vIGB0aW1lX2xvd2BcbiAgdmFyIHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICBiW2krK10gPSB0bCA+Pj4gMjQgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gMTYgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsICYgMHhmZjtcblxuICAvLyBgdGltZV9taWRgXG4gIHZhciB0bWggPSBtc2VjcyAvIDB4MTAwMDAwMDAwICogMTAwMDAgJiAweGZmZmZmZmY7XG4gIGJbaSsrXSA9IHRtaCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRtaCAmIDB4ZmY7XG5cbiAgLy8gYHRpbWVfaGlnaF9hbmRfdmVyc2lvbmBcbiAgYltpKytdID0gdG1oID4+PiAyNCAmIDB4ZiB8IDB4MTA7IC8vIGluY2x1ZGUgdmVyc2lvblxuICBiW2krK10gPSB0bWggPj4+IDE2ICYgMHhmZjtcblxuICAvLyBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGAgKFBlciA0LjIuMiAtIGluY2x1ZGUgdmFyaWFudClcbiAgYltpKytdID0gY2xvY2tzZXEgPj4+IDggfCAweDgwO1xuXG4gIC8vIGBjbG9ja19zZXFfbG93YFxuICBiW2krK10gPSBjbG9ja3NlcSAmIDB4ZmY7XG5cbiAgLy8gYG5vZGVgXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgNjsgKytuKSB7XG4gICAgYltpICsgbl0gPSBub2RlW25dO1xuICB9XG4gIHJldHVybiBidWYgfHwgKDAsIF9zdHJpbmdpZnkudW5zYWZlU3RyaW5naWZ5KShiKTtcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHYxOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdjFUb1Y2O1xudmFyIF9wYXJzZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGFyc2UuanNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG4vKipcbiAqIENvbnZlcnQgYSB2MSBVVUlEIHRvIGEgdjYgVVVJRFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfFVpbnQ4QXJyYXl9IHV1aWQgLSBUaGUgdjEgVVVJRCB0byBjb252ZXJ0IHRvIHY2XG4gKiBAcmV0dXJucyB7c3RyaW5nfFVpbnQ4QXJyYXl9IFRoZSB2NiBVVUlEIGFzIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGB1dWlkYCBhcmdcbiAqIChzdHJpbmcgb3IgVWludDhBcnJheSlcbiAqL1xuZnVuY3Rpb24gdjFUb1Y2KHV1aWQpIHtcbiAgdmFyIHYxQnl0ZXMgPSB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgPyAoMCwgX3BhcnNlLmRlZmF1bHQpKHV1aWQpIDogdXVpZDtcbiAgdmFyIHY2Qnl0ZXMgPSBfdjFUb1Y2KHYxQnl0ZXMpO1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnID8gKDAsIF9zdHJpbmdpZnkudW5zYWZlU3RyaW5naWZ5KSh2NkJ5dGVzKSA6IHY2Qnl0ZXM7XG59XG5cbi8vIERvIHRoZSBmaWVsZCB0cmFuc2Zvcm1hdGlvbiBuZWVkZWQgZm9yIHYxIC0+IHY2XG5mdW5jdGlvbiBfdjFUb1Y2KHYxQnl0ZXMsIHJhbmRvbWl6ZSA9IGZhbHNlKSB7XG4gIHJldHVybiBVaW50OEFycmF5Lm9mKCh2MUJ5dGVzWzZdICYgMHgwZikgPDwgNCB8IHYxQnl0ZXNbN10gPj4gNCAmIDB4MGYsICh2MUJ5dGVzWzddICYgMHgwZikgPDwgNCB8ICh2MUJ5dGVzWzRdICYgMHhmMCkgPj4gNCwgKHYxQnl0ZXNbNF0gJiAweDBmKSA8PCA0IHwgKHYxQnl0ZXNbNV0gJiAweGYwKSA+PiA0LCAodjFCeXRlc1s1XSAmIDB4MGYpIDw8IDQgfCAodjFCeXRlc1swXSAmIDB4ZjApID4+IDQsICh2MUJ5dGVzWzBdICYgMHgwZikgPDwgNCB8ICh2MUJ5dGVzWzFdICYgMHhmMCkgPj4gNCwgKHYxQnl0ZXNbMV0gJiAweDBmKSA8PCA0IHwgKHYxQnl0ZXNbMl0gJiAweGYwKSA+PiA0LCAweDYwIHwgdjFCeXRlc1syXSAmIDB4MGYsIHYxQnl0ZXNbM10sIHYxQnl0ZXNbOF0sIHYxQnl0ZXNbOV0sIHYxQnl0ZXNbMTBdLCB2MUJ5dGVzWzExXSwgdjFCeXRlc1sxMl0sIHYxQnl0ZXNbMTNdLCB2MUJ5dGVzWzE0XSwgdjFCeXRlc1sxNV0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF92ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92MzUuanNcIikpO1xudmFyIF9tZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbWQ1LmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbnZhciB2MyA9ICgwLCBfdi5kZWZhdWx0KSgndjMnLCAweDMwLCBfbWQuZGVmYXVsdCk7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2MzsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuVVJMID0gZXhwb3J0cy5ETlMgPSB2b2lkIDA7XG5leHBvcnRzLmRlZmF1bHQgPSB2MzU7XG52YXIgX3N0cmluZ2lmeSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbnZhciBfcGFyc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlLmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsgLy8gVVRGOCBlc2NhcGVcblxuICB2YXIgYnl0ZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBieXRlcy5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpKTtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG52YXIgRE5TID0gZXhwb3J0cy5ETlMgPSAnNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbnZhciBVUkwgPSBleHBvcnRzLlVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZnVuY3Rpb24gdjM1KG5hbWUsIHZlcnNpb24sIGhhc2hmdW5jKSB7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCh2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCkge1xuICAgIHZhciBfbmFtZXNwYWNlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzcGFjZSA9ICgwLCBfcGFyc2UuZGVmYXVsdCkobmFtZXNwYWNlKTtcbiAgICB9XG4gICAgaWYgKCgoX25hbWVzcGFjZSA9IG5hbWVzcGFjZSkgPT09IG51bGwgfHwgX25hbWVzcGFjZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX25hbWVzcGFjZS5sZW5ndGgpICE9PSAxNikge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdOYW1lc3BhY2UgbXVzdCBiZSBhcnJheS1saWtlICgxNiBpdGVyYWJsZSBpbnRlZ2VyIHZhbHVlcywgMC0yNTUpJyk7XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSBoYXNoIG9mIG5hbWVzcGFjZSBhbmQgdmFsdWUsIFBlciA0LjNcbiAgICAvLyBGdXR1cmU6IFVzZSBzcHJlYWQgc3ludGF4IHdoZW4gc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGUuZy4gYGJ5dGVzID1cbiAgICAvLyBoYXNoZnVuYyhbLi4ubmFtZXNwYWNlLCAuLi4gdmFsdWVdKWBcbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNiArIHZhbHVlLmxlbmd0aCk7XG4gICAgYnl0ZXMuc2V0KG5hbWVzcGFjZSk7XG4gICAgYnl0ZXMuc2V0KHZhbHVlLCBuYW1lc3BhY2UubGVuZ3RoKTtcbiAgICBieXRlcyA9IGhhc2hmdW5jKGJ5dGVzKTtcbiAgICBieXRlc1s2XSA9IGJ5dGVzWzZdICYgMHgwZiB8IHZlcnNpb247XG4gICAgYnl0ZXNbOF0gPSBieXRlc1s4XSAmIDB4M2YgfCAweDgwO1xuICAgIGlmIChidWYpIHtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG4gICAgcmV0dXJuICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkoYnl0ZXMpO1xuICB9XG5cbiAgLy8gRnVuY3Rpb24jbmFtZSBpcyBub3Qgc2V0dGFibGUgb24gc29tZSBwbGF0Zm9ybXMgKCMyNzApXG4gIHRyeSB7XG4gICAgZ2VuZXJhdGVVVUlELm5hbWUgPSBuYW1lO1xuICB9IGNhdGNoIChlcnIpIHt9XG5cbiAgLy8gRm9yIENvbW1vbkpTIGRlZmF1bHQgZXhwb3J0IHN1cHBvcnRcbiAgZ2VuZXJhdGVVVUlELkROUyA9IEROUztcbiAgZ2VuZXJhdGVVVUlELlVSTCA9IFVSTDtcbiAgcmV0dXJuIGdlbmVyYXRlVVVJRDtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfbmF0aXZlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9uYXRpdmUuanNcIikpO1xudmFyIF9ybmcgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JuZy5qc1wiKSk7XG52YXIgX3N0cmluZ2lmeSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIGlmIChfbmF0aXZlLmRlZmF1bHQucmFuZG9tVVVJRCAmJiAhYnVmICYmICFvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9uYXRpdmUuZGVmYXVsdC5yYW5kb21VVUlEKCk7XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IF9ybmcuZGVmYXVsdCkoKTtcblxuICAvLyBQZXIgNC40LCBzZXQgYml0cyBmb3IgdmVyc2lvbiBhbmQgYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7XG5cbiAgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cbiAgcmV0dXJuICgwLCBfc3RyaW5naWZ5LnVuc2FmZVN0cmluZ2lmeSkocm5kcyk7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2NDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfdiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjM1LmpzXCIpKTtcbnZhciBfc2hhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zaGExLmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbnZhciB2NSA9ICgwLCBfdi5kZWZhdWx0KSgndjUnLCAweDUwLCBfc2hhLmRlZmF1bHQpO1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdjU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2NjtcbnZhciBfc3RyaW5naWZ5ID0gcmVxdWlyZShcIi4vc3RyaW5naWZ5LmpzXCIpO1xudmFyIF92ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92MS5qc1wiKSk7XG52YXIgX3YxVG9WID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92MVRvVjYuanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7IHZhciB0ID0gT2JqZWN0LmtleXMoZSk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsgciAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChyKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHIpLmVudW1lcmFibGU7IH0pKSwgdC5wdXNoLmFwcGx5KHQsIG8pOyB9IHJldHVybiB0OyB9XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpIHsgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tyXSA/IGFyZ3VtZW50c1tyXSA6IHt9OyByICUgMiA/IG93bktleXMoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBfZGVmaW5lUHJvcGVydHkoZSwgciwgdFtyXSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7IH0pOyB9IHJldHVybiBlOyB9XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkgeyByZXR1cm4gKHIgPSBfdG9Qcm9wZXJ0eUtleShyKSkgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCByLCB7IHZhbHVlOiB0LCBlbnVtZXJhYmxlOiAhMCwgY29uZmlndXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwIH0pIDogZVtyXSA9IHQsIGU7IH1cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpIHsgdmFyIGkgPSBfdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7IHJldHVybiBcInN5bWJvbFwiID09IHR5cGVvZiBpID8gaSA6IGkgKyBcIlwiOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUodCwgcikgeyBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgdCB8fCAhdCkgcmV0dXJuIHQ7IHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOyBpZiAodm9pZCAwICE9PSBlKSB7IHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpOyBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgaSkgcmV0dXJuIGk7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTsgfSByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOyB9XG4vKipcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtVaW50OEFycmF5PX0gYnVmXG4gKiBAcGFyYW0ge251bWJlcj19IG9mZnNldFxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gdjYob3B0aW9ucyA9IHt9LCBidWYsIG9mZnNldCA9IDApIHtcbiAgLy8gdjYgaXMgdjEgd2l0aCBkaWZmZXJlbnQgZmllbGQgbGF5b3V0LCBzbyB3ZSBzdGFydCB3aXRoIGEgdjEgVVVJRCwgYWxiZWl0XG4gIC8vIHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IGJlaGF2aW9yIGFyb3VuZCBob3cgdGhlIGNsb2NrX3NlcSBhbmQgbm9kZSBmaWVsZHNcbiAgLy8gYXJlIHJhbmRvbWl6ZWQsIHdoaWNoIGlzIHdoeSB3ZSBjYWxsIHYxIHdpdGggX3Y2OiB0cnVlLlxuICB2YXIgYnl0ZXMgPSAoMCwgX3YuZGVmYXVsdCkoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb25zKSwge30sIHtcbiAgICBfdjY6IHRydWVcbiAgfSksIG5ldyBVaW50OEFycmF5KDE2KSk7XG5cbiAgLy8gUmVvcmRlciB0aGUgZmllbGRzIHRvIHY2IGxheW91dC5cbiAgYnl0ZXMgPSAoMCwgX3YxVG9WLmRlZmF1bHQpKGJ5dGVzKTtcblxuICAvLyBSZXR1cm4gYXMgYSBieXRlIGFycmF5IGlmIHJlcXVlc3RlZFxuICBpZiAoYnVmKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuICByZXR1cm4gKDAsIF9zdHJpbmdpZnkudW5zYWZlU3RyaW5naWZ5KShieXRlcyk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2NlRvVjE7XG52YXIgX3BhcnNlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZS5qc1wiKSk7XG52YXIgX3N0cmluZ2lmeSA9IHJlcXVpcmUoXCIuL3N0cmluZ2lmeS5qc1wiKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbi8qKlxuICogQ29udmVydCBhIHY2IFVVSUQgdG8gYSB2MSBVVUlEXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheX0gdXVpZCAtIFRoZSB2NiBVVUlEIHRvIGNvbnZlcnQgdG8gdjZcbiAqIEByZXR1cm5zIHtzdHJpbmd8VWludDhBcnJheX0gVGhlIHYxIFVVSUQgYXMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgYHV1aWRgIGFyZ1xuICogKHN0cmluZyBvciBVaW50OEFycmF5KVxuICovXG5mdW5jdGlvbiB2NlRvVjEodXVpZCkge1xuICB2YXIgdjZCeXRlcyA9IHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyA/ICgwLCBfcGFyc2UuZGVmYXVsdCkodXVpZCkgOiB1dWlkO1xuICB2YXIgdjFCeXRlcyA9IF92NlRvVjEodjZCeXRlcyk7XG4gIHJldHVybiB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgPyAoMCwgX3N0cmluZ2lmeS51bnNhZmVTdHJpbmdpZnkpKHYxQnl0ZXMpIDogdjFCeXRlcztcbn1cblxuLy8gRG8gdGhlIGZpZWxkIHRyYW5zZm9ybWF0aW9uIG5lZWRlZCBmb3IgdjYgLT4gdjFcbmZ1bmN0aW9uIF92NlRvVjEodjZCeXRlcykge1xuICByZXR1cm4gVWludDhBcnJheS5vZigodjZCeXRlc1szXSAmIDB4MGYpIDw8IDQgfCB2NkJ5dGVzWzRdID4+IDQgJiAweDBmLCAodjZCeXRlc1s0XSAmIDB4MGYpIDw8IDQgfCAodjZCeXRlc1s1XSAmIDB4ZjApID4+IDQsICh2NkJ5dGVzWzVdICYgMHgwZikgPDwgNCB8IHY2Qnl0ZXNbNl0gJiAweDBmLCB2NkJ5dGVzWzddLCAodjZCeXRlc1sxXSAmIDB4MGYpIDw8IDQgfCAodjZCeXRlc1syXSAmIDB4ZjApID4+IDQsICh2NkJ5dGVzWzJdICYgMHgwZikgPDwgNCB8ICh2NkJ5dGVzWzNdICYgMHhmMCkgPj4gNCwgMHgxMCB8ICh2NkJ5dGVzWzBdICYgMHhmMCkgPj4gNCwgKHY2Qnl0ZXNbMF0gJiAweDBmKSA8PCA0IHwgKHY2Qnl0ZXNbMV0gJiAweGYwKSA+PiA0LCB2NkJ5dGVzWzhdLCB2NkJ5dGVzWzldLCB2NkJ5dGVzWzEwXSwgdjZCeXRlc1sxMV0sIHY2Qnl0ZXNbMTJdLCB2NkJ5dGVzWzEzXSwgdjZCeXRlc1sxNF0sIHY2Qnl0ZXNbMTVdKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcm5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ybmcuanNcIikpO1xudmFyIF9zdHJpbmdpZnkgPSByZXF1aXJlKFwiLi9zdHJpbmdpZnkuanNcIik7XG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KGUpIHsgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OyB9XG4vKipcbiAqIFVVSUQgVjcgLSBVbml4IEVwb2NoIHRpbWUtYmFzZWQgVVVJRFxuICpcbiAqIFRoZSBJRVRGIGhhcyBwdWJsaXNoZWQgUkZDOTU2MiwgaW50cm9kdWNpbmcgMyBuZXcgVVVJRCB2ZXJzaW9ucyAoNiw3LDgpLiBUaGlzXG4gKiBpbXBsZW1lbnRhdGlvbiBvZiBWNyBpcyBiYXNlZCBvbiB0aGUgYWNjZXB0ZWQsIHRob3VnaCBub3QgeWV0IGFwcHJvdmVkLFxuICogcmV2aXNpb25zLlxuICpcbiAqIFJGQyA5NTYyOmh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5NTYyLmh0bWwgVW5pdmVyc2FsbHkgVW5pcXVlXG4gKiBJRGVudGlmaWVycyAoVVVJRHMpXG5cbiAqXG4gKiBTYW1wbGUgVjcgdmFsdWU6XG4gKiBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTU2Mi5odG1sI25hbWUtZXhhbXBsZS1vZi1hLXV1aWR2Ny12YWx1ZVxuICpcbiAqIE1vbm90b25pYyBCaXQgTGF5b3V0OiBSRkMgcmZjOTU2Mi42LjIgTWV0aG9kIDEsIERlZGljYXRlZCBDb3VudGVyIEJpdHMgcmVmOlxuICogICAgIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5NTYyLmh0bWwjc2VjdGlvbi02LjItNS4xXG4gKlxuICogICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzIDAgMSAyIDMgNCA1IDZcbiAqICAgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMVxuICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgdW5peF90c19tcyAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICogIHwgICAgICAgICAgdW5peF90c19tcyAgICAgICAgICAgfCAgdmVyICB8ICAgICAgICBzZXFfaGkgICAgICAgICB8XG4gKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAqICB8dmFyfCAgICAgICAgICAgICAgIHNlcV9sb3cgICAgICAgICAgICAgICB8ICAgICAgICByYW5kICAgICAgICAgfFxuICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICpcbiAqIHNlcSBpcyBhIDMxIGJpdCBzZXJpYWxpemVkIGNvdW50ZXI7IGNvbXByaXNlZCBvZiAxMiBiaXQgc2VxX2hpIGFuZCAxOSBiaXRcbiAqIHNlcV9sb3csIGFuZCByYW5kb21seSBpbml0aWFsaXplZCB1cG9uIHRpbWVzdGFtcCBjaGFuZ2UuIDMxIGJpdCBjb3VudGVyIHNpemVcbiAqIHdhcyBzZWxlY3RlZCBhcyBhbnkgYml0d2lzZSBvcGVyYXRpb25zIGluIG5vZGUgYXJlIGRvbmUgYXMgX3NpZ25lZF8gMzIgYml0XG4gKiBpbnRzLiB3ZSBleGNsdWRlIHRoZSBzaWduIGJpdC5cbiAqL1xuXG52YXIgX3NlcUxvdyA9IG51bGw7XG52YXIgX3NlcUhpZ2ggPSBudWxsO1xudmFyIF9tc2VjcyA9IDA7XG5mdW5jdGlvbiB2NyhvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBpbml0aWFsaXplIGJ1ZmZlciBhbmQgcG9pbnRlclxuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgbmV3IFVpbnQ4QXJyYXkoMTYpO1xuXG4gIC8vIHJuZHMgaXMgVWludDhBcnJheSgxNikgZmlsbGVkIHdpdGggcmFuZG9tIGJ5dGVzXG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IF9ybmcuZGVmYXVsdCkoKTtcblxuICAvLyBtaWxsaXNlY29uZHMgc2luY2UgdW5peCBlcG9jaCwgMTk3MC0wMS0wMSAwMDowMFxuICB2YXIgbXNlY3MgPSBvcHRpb25zLm1zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1zZWNzIDogRGF0ZS5ub3coKTtcblxuICAvLyBzZXEgaXMgdXNlciBwcm92aWRlZCAzMSBiaXQgY291bnRlclxuICB2YXIgc2VxID0gb3B0aW9ucy5zZXEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc2VxIDogbnVsbDtcblxuICAvLyBpbml0aWFsaXplIGxvY2FsIHNlcSBoaWdoL2xvdyBwYXJ0c1xuICB2YXIgc2VxSGlnaCA9IF9zZXFIaWdoO1xuICB2YXIgc2VxTG93ID0gX3NlcUxvdztcblxuICAvLyBjaGVjayBpZiBjbG9jayBoYXMgYWR2YW5jZWQgYW5kIHVzZXIgaGFzIG5vdCBwcm92aWRlZCBtc2Vjc1xuICBpZiAobXNlY3MgPiBfbXNlY3MgJiYgb3B0aW9ucy5tc2VjcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgX21zZWNzID0gbXNlY3M7XG5cbiAgICAvLyB1bmxlc3MgdXNlciBwcm92aWRlZCBzZXEsIHJlc2V0IHNlcSBwYXJ0c1xuICAgIGlmIChzZXEgIT09IG51bGwpIHtcbiAgICAgIHNlcUhpZ2ggPSBudWxsO1xuICAgICAgc2VxTG93ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB3ZSBoYXZlIGEgdXNlciBwcm92aWRlZCBzZXFcbiAgaWYgKHNlcSAhPT0gbnVsbCkge1xuICAgIC8vIHRyaW0gcHJvdmlkZWQgc2VxIHRvIDMxIGJpdHMgb2YgdmFsdWUsIGF2b2lkaW5nIG92ZXJmbG93XG4gICAgaWYgKHNlcSA+IDB4N2ZmZmZmZmYpIHtcbiAgICAgIHNlcSA9IDB4N2ZmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gc3BsaXQgcHJvdmlkZWQgc2VxIGludG8gaGlnaC9sb3cgcGFydHNcbiAgICBzZXFIaWdoID0gc2VxID4+PiAxOSAmIDB4ZmZmO1xuICAgIHNlcUxvdyA9IHNlcSAmIDB4N2ZmZmY7XG4gIH1cblxuICAvLyByYW5kb21seSBpbml0aWFsaXplIHNlcVxuICBpZiAoc2VxSGlnaCA9PT0gbnVsbCB8fCBzZXFMb3cgPT09IG51bGwpIHtcbiAgICBzZXFIaWdoID0gcm5kc1s2XSAmIDB4N2Y7XG4gICAgc2VxSGlnaCA9IHNlcUhpZ2ggPDwgOCB8IHJuZHNbN107XG4gICAgc2VxTG93ID0gcm5kc1s4XSAmIDB4M2Y7IC8vIHBhZCBmb3IgdmFyXG4gICAgc2VxTG93ID0gc2VxTG93IDw8IDggfCBybmRzWzldO1xuICAgIHNlcUxvdyA9IHNlcUxvdyA8PCA1IHwgcm5kc1sxMF0gPj4+IDM7XG4gIH1cblxuICAvLyBpbmNyZW1lbnQgc2VxIGlmIHdpdGhpbiBtc2VjcyB3aW5kb3dcbiAgaWYgKG1zZWNzICsgMTAwMDAgPiBfbXNlY3MgJiYgc2VxID09PSBudWxsKSB7XG4gICAgaWYgKCsrc2VxTG93ID4gMHg3ZmZmZikge1xuICAgICAgc2VxTG93ID0gMDtcbiAgICAgIGlmICgrK3NlcUhpZ2ggPiAweGZmZikge1xuICAgICAgICBzZXFIaWdoID0gMDtcblxuICAgICAgICAvLyBpbmNyZW1lbnQgaW50ZXJuYWwgX21zZWNzLiB0aGlzIGFsbG93cyB1cyB0byBjb250aW51ZSBpbmNyZW1lbnRpbmdcbiAgICAgICAgLy8gd2hpbGUgc3RheWluZyBtb25vdG9uaWMuIE5vdGUsIG9uY2Ugd2UgaGl0IDEwayBtaWxsaXNlY29uZHMgYmV5b25kIHN5c3RlbVxuICAgICAgICAvLyBjbG9jaywgd2Ugd2lsbCByZXNldCBicmVha2luZyBtb25vdG9uaWNpdHkgKGFmdGVyICgyXjMxKSoxMDAwMCBnZW5lcmF0aW9ucylcbiAgICAgICAgX21zZWNzKys7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIHJlc2V0dGluZzsgd2UgaGF2ZSBhZHZhbmNlZCBtb3JlIHRoYW5cbiAgICAvLyAxMGsgbWlsbGlzZWNvbmRzIGJleW9uZCBzeXN0ZW0gY2xvY2tcbiAgICBfbXNlY3MgPSBtc2VjcztcbiAgfVxuICBfc2VxSGlnaCA9IHNlcUhpZ2g7XG4gIF9zZXFMb3cgPSBzZXFMb3c7XG5cbiAgLy8gW2J5dGVzIDAtNV0gNDggYml0cyBvZiBsb2NhbCB0aW1lc3RhbXBcbiAgYltpKytdID0gX21zZWNzIC8gMHgxMDAwMDAwMDAwMCAmIDB4ZmY7XG4gIGJbaSsrXSA9IF9tc2VjcyAvIDB4MTAwMDAwMDAwICYgMHhmZjtcbiAgYltpKytdID0gX21zZWNzIC8gMHgxMDAwMDAwICYgMHhmZjtcbiAgYltpKytdID0gX21zZWNzIC8gMHgxMDAwMCAmIDB4ZmY7XG4gIGJbaSsrXSA9IF9tc2VjcyAvIDB4MTAwICYgMHhmZjtcbiAgYltpKytdID0gX21zZWNzICYgMHhmZjtcblxuICAvLyBbYnl0ZSA2XSAtIHNldCA0IGJpdHMgb2YgdmVyc2lvbiAoNykgd2l0aCBmaXJzdCA0IGJpdHMgc2VxX2hpXG4gIGJbaSsrXSA9IHNlcUhpZ2ggPj4+IDQgJiAweDBmIHwgMHg3MDtcblxuICAvLyBbYnl0ZSA3XSByZW1haW5pbmcgOCBiaXRzIG9mIHNlcV9oaVxuICBiW2krK10gPSBzZXFIaWdoICYgMHhmZjtcblxuICAvLyBbYnl0ZSA4XSAtIHZhcmlhbnQgKDIgYml0cyksIGZpcnN0IDYgYml0cyBzZXFfbG93XG4gIGJbaSsrXSA9IHNlcUxvdyA+Pj4gMTMgJiAweDNmIHwgMHg4MDtcblxuICAvLyBbYnl0ZSA5XSA4IGJpdHMgc2VxX2xvd1xuICBiW2krK10gPSBzZXFMb3cgPj4+IDUgJiAweGZmO1xuXG4gIC8vIFtieXRlIDEwXSByZW1haW5pbmcgNSBiaXRzIHNlcV9sb3csIDMgYml0cyByYW5kb21cbiAgYltpKytdID0gc2VxTG93IDw8IDMgJiAweGZmIHwgcm5kc1sxMF0gJiAweDA3O1xuXG4gIC8vIFtieXRlcyAxMS0xNV0gYWx3YXlzIHJhbmRvbVxuICBiW2krK10gPSBybmRzWzExXTtcbiAgYltpKytdID0gcm5kc1sxMl07XG4gIGJbaSsrXSA9IHJuZHNbMTNdO1xuICBiW2krK10gPSBybmRzWzE0XTtcbiAgYltpKytdID0gcm5kc1sxNV07XG4gIHJldHVybiBidWYgfHwgKDAsIF9zdHJpbmdpZnkudW5zYWZlU3RyaW5naWZ5KShiKTtcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHY3OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9yZWdleCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcmVnZXguanNcIikpO1xuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChlKSB7IHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsgfVxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIF9yZWdleC5kZWZhdWx0LnRlc3QodXVpZCk7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB2YWxpZGF0ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfdmFsaWRhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3ZhbGlkYXRlLmpzXCIpKTtcbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkgeyByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07IH1cbmZ1bmN0aW9uIHZlcnNpb24odXVpZCkge1xuICBpZiAoISgwLCBfdmFsaWRhdGUuZGVmYXVsdCkodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG4gIHJldHVybiBwYXJzZUludCh1dWlkLnNsaWNlKDE0LCAxNSksIDE2KTtcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHZlcnNpb247IiwiLyoqXG4gKiBUaGlzIGZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBgcHJlLXB1Ymxpc2guanNgLlxuICogRG8gbm90IG1hbnVhbGx5IGVkaXQuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFwiYXJlYVwiOiB0cnVlLFxuICBcImJhc2VcIjogdHJ1ZSxcbiAgXCJiclwiOiB0cnVlLFxuICBcImNvbFwiOiB0cnVlLFxuICBcImVtYmVkXCI6IHRydWUsXG4gIFwiaHJcIjogdHJ1ZSxcbiAgXCJpbWdcIjogdHJ1ZSxcbiAgXCJpbnB1dFwiOiB0cnVlLFxuICBcImxpbmtcIjogdHJ1ZSxcbiAgXCJtZXRhXCI6IHRydWUsXG4gIFwicGFyYW1cIjogdHJ1ZSxcbiAgXCJzb3VyY2VcIjogdHJ1ZSxcbiAgXCJ0cmFja1wiOiB0cnVlLFxuICBcIndiclwiOiB0cnVlXG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciBfX0RFVl9fID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcblxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAoX19ERVZfXykge1xuICB2YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGZvcm1hdCwgYXJncykge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuID4gMSA/IGxlbiAtIDEgOiAwKTtcbiAgICBmb3IgKHZhciBrZXkgPSAxOyBrZXkgPCBsZW47IGtleSsrKSB7XG4gICAgICBhcmdzW2tleSAtIDFdID0gYXJndW1lbnRzW2tleV07XG4gICAgfVxuICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArXG4gICAgICBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSk7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfVxuXG4gIHdhcm5pbmcgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYXJncykge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuID4gMiA/IGxlbiAtIDIgOiAwKTtcbiAgICBmb3IgKHZhciBrZXkgPSAyOyBrZXkgPCBsZW47IGtleSsrKSB7XG4gICAgICBhcmdzW2tleSAtIDJdID0gYXJndW1lbnRzW2tleV07XG4gICAgfVxuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylgIHJlcXVpcmVzIGEgd2FybmluZyAnICtcbiAgICAgICAgICAnbWVzc2FnZSBhcmd1bWVudCdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBwcmludFdhcm5pbmcuYXBwbHkobnVsbCwgW2Zvcm1hdF0uY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZztcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnd3MgZG9lcyBub3Qgd29yayBpbiB0aGUgYnJvd3Nlci4gQnJvd3NlciBjbGllbnRzIG11c3QgdXNlIHRoZSBuYXRpdmUgJyArXG4gICAgICAnV2ViU29ja2V0IG9iamVjdCdcbiAgKTtcbn07XG4iLCJmdW5jdGlvbiBlKGUsaSx0LG8pe2Zvcig7aT49dCYmIWUoXCIobWluLXJlc29sdXRpb246IFwiK2kvbytcImRwcHgpXCIpLm1hdGNoZXM7KWktLTtyZXR1cm4gaX1mdW5jdGlvbiBpKGkpe2lmKHZvaWQgMD09PWkmJihpPXdpbmRvdyksIWkpcmV0dXJuIDE7aWYodm9pZCAwIT09aS5kZXZpY2VQaXhlbFJhdGlvKXJldHVybiBpLmRldmljZVBpeGVsUmF0aW87dmFyIHQ9aS5kb2N1bWVudC5mcmFtZXM7cmV0dXJuIHZvaWQgMCE9PXQ/dm9pZCAwIT09dC5kZXZpY2VQaXhlbFJhdGlvP3QuZGV2aWNlUGl4ZWxSYXRpbzp0LnNjcmVlbi5kZXZpY2VYRFBJL3Quc2NyZWVuLnN5c3RlbVhEUEk6dm9pZCAwIT09aS5tYXRjaE1lZGlhP2Z1bmN0aW9uKGkpe2Zvcih2YXIgdD1pLm1hdGNoTWVkaWEsbz0xMCxuPS4xLHI9MSxhPW8sYz0wO2M8NDtjKyspbz0oYT0xMCplKHQsbyxuLHIpKSs5LG49YSxyKj0xMDtyZXR1cm4gYS9yfShpKToxfWZ1bmN0aW9uIHQoZSx0KXt2YXIgbz0oZSBpbnN0YW5jZW9mIEVsZW1lbnQ/Z2V0Q29tcHV0ZWRTdHlsZShlKS56b29tOmUuem9vbSl8fDE7cmV0dXJuIGkodCkqKFwic3RyaW5nXCI9PXR5cGVvZiBvP3BhcnNlRmxvYXQobyk6byl9ZXhwb3J0e3QgYXMgZWxlbWVudFpvb21MZXZlbCxpIGFzIHpvb21MZXZlbH07XG4iLCIvKiAoaWdub3JlZCkgKi8iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2FycmF5L2Zyb21cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9hcnJheS9pcy1hcnJheVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2JpbmRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9jb25jYXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9lbnRyaWVzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZXZlcnlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9maWx0ZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9maW5kLWluZGV4XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvZmluZFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2Zvci1lYWNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvaW5zdGFuY2UvaW5jbHVkZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9pbmRleC1vZlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL2tleXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9tYXBcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9yZWR1Y2VcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zbGljZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3NvcnRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zcGxpY2VcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9pbnN0YW5jZS9zdGFydHMtd2l0aFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2luc3RhbmNlL3ZhbHVlc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL2pzb24vc3RyaW5naWZ5XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvbWFwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvbnVtYmVyL2lzLWludGVnZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvYXNzaWduXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2NyZWF0ZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZW50cmllc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL29iamVjdC9mcmVlemVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9zdGFibGUvb2JqZWN0L2dldC1wcm90b3R5cGUtb2ZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9vYmplY3Qva2V5c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL3BhcnNlLWludFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL3Byb21pc2VcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9zZXQtaW50ZXJ2YWxcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL3N0YWJsZS9zZXQtdGltZW91dFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL3NldFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvc3RhYmxlL3dlYWstbWFwXCIpOyIsInZhciBfT2JqZWN0JGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZShcImNvcmUtanMtcHVyZS9mZWF0dXJlcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xudmFyIHRvUHJvcGVydHlLZXkgPSByZXF1aXJlKFwiLi90b1Byb3BlcnR5S2V5LmpzXCIpO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHtcbiAgcmV0dXJuIChyID0gdG9Qcm9wZXJ0eUtleShyKSkgaW4gZSA/IF9PYmplY3QkZGVmaW5lUHJvcGVydHkoZSwgciwge1xuICAgIHZhbHVlOiB0LFxuICAgIGVudW1lcmFibGU6ICEwLFxuICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgd3JpdGFibGU6ICEwXG4gIH0pIDogZVtyXSA9IHQsIGU7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9kZWZpbmVQcm9wZXJ0eSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoZSkge1xuICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDoge1xuICAgIFwiZGVmYXVsdFwiOiBlXG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgX1N5bWJvbCR0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvZmVhdHVyZXMvc3ltYm9sL3RvLXByaW1pdGl2ZS5qc1wiKTtcbnZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbmZ1bmN0aW9uIHRvUHJpbWl0aXZlKHQsIHIpIHtcbiAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7XG4gIHZhciBlID0gdFtfU3ltYm9sJHRvUHJpbWl0aXZlXTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkge1xuICAgIHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxubW9kdWxlLmV4cG9ydHMgPSB0b1ByaW1pdGl2ZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoXCIuL3RvUHJpbWl0aXZlLmpzXCIpO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IHRvUHJvcGVydHlLZXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgX1N5bWJvbCA9IHJlcXVpcmUoXCJjb3JlLWpzLXB1cmUvZmVhdHVyZXMvc3ltYm9sL2luZGV4LmpzXCIpO1xudmFyIF9TeW1ib2wkaXRlcmF0b3IgPSByZXF1aXJlKFwiY29yZS1qcy1wdXJlL2ZlYXR1cmVzL3N5bWJvbC9pdGVyYXRvci5qc1wiKTtcbmZ1bmN0aW9uIF90eXBlb2Yobykge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIF9TeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgX1N5bWJvbCRpdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvO1xuICB9IDogZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIF9TeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gX1N5bWJvbCAmJiBvICE9PSBfU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbztcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzKSwgX3R5cGVvZihvKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9zdGFibGUvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9zdGFibGUvc3ltYm9sJyk7XG5cbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LmZ1bmN0aW9uLm1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuYXN5bmMtZGlzcG9zZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmRpc3Bvc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5tZXRhZGF0YScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9zdGFibGUvc3ltYm9sL2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL3N0YWJsZS9zeW1ib2wvdG8tcHJpbWl0aXZlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZnJvbScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguQXJyYXkuZnJvbTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXMtYXJyYXknKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLkFycmF5LmlzQXJyYXk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdjb25jYXQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdlbnRyaWVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmV2ZXJ5Jyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2V2ZXJ5Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZpbHRlcicpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdmaWx0ZXInKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZmluZC1pbmRleCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdmaW5kSW5kZXgnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZmluZCcpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdBcnJheScsICdmaW5kJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LmZvci1lYWNoJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2ZvckVhY2gnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnaW5jbHVkZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaW5kZXgtb2YnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnaW5kZXhPZicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ2tleXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuYXJyYXkubWFwJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ21hcCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAncmVkdWNlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LnNsaWNlJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ0FycmF5JywgJ3NsaWNlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5LnNvcnQnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnc29ydCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAnc3BsaWNlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnQXJyYXknLCAndmFsdWVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLmZ1bmN0aW9uLmJpbmQnKTtcbnZhciBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kID0gcmVxdWlyZSgnLi4vLi4vLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbi1wcm90b3R5cGUtbWV0aG9kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCgnRnVuY3Rpb24nLCAnYmluZCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9uL3ZpcnR1YWwvYmluZCcpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5iaW5kO1xuICByZXR1cm4gaXQgPT09IEZ1bmN0aW9uUHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEZ1bmN0aW9uUHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBGdW5jdGlvblByb3RvdHlwZS5iaW5kKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9jb25jYXQnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuY29uY2F0O1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5jb25jYXQpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2V2ZXJ5Jyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmV2ZXJ5O1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5ldmVyeSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvZmlsdGVyJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmZpbHRlcjtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuZmlsdGVyKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9maW5kLWluZGV4Jyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmZpbmRJbmRleDtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuZmluZEluZGV4KSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9maW5kJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmZpbmQ7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLmZpbmQpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBhcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvaW5jbHVkZXMnKTtcbnZhciBzdHJpbmdNZXRob2QgPSByZXF1aXJlKCcuLi9zdHJpbmcvdmlydHVhbC9pbmNsdWRlcycpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG52YXIgU3RyaW5nUHJvdG90eXBlID0gU3RyaW5nLnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LmluY2x1ZGVzO1xuICBpZiAoaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5pbmNsdWRlcykpIHJldHVybiBhcnJheU1ldGhvZDtcbiAgaWYgKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyB8fCBpdCA9PT0gU3RyaW5nUHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKFN0cmluZ1Byb3RvdHlwZSwgaXQpICYmIG93biA9PT0gU3RyaW5nUHJvdG90eXBlLmluY2x1ZGVzKSkge1xuICAgIHJldHVybiBzdHJpbmdNZXRob2Q7XG4gIH0gcmV0dXJuIG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9pbmRleC1vZicpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5pbmRleE9mO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5pbmRleE9mKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9tYXAnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQubWFwO1xuICByZXR1cm4gaXQgPT09IEFycmF5UHJvdG90eXBlIHx8IChpc1Byb3RvdHlwZU9mKEFycmF5UHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBBcnJheVByb3RvdHlwZS5tYXApID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL3JlZHVjZScpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5yZWR1Y2U7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLnJlZHVjZSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvc2xpY2UnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuc2xpY2U7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLnNsaWNlKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgbWV0aG9kID0gcmVxdWlyZSgnLi4vYXJyYXkvdmlydHVhbC9zb3J0Jyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LnNvcnQ7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLnNvcnQpID8gbWV0aG9kIDogb3duO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL3NwbGljZScpO1xuXG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBvd24gPSBpdC5zcGxpY2U7XG4gIHJldHVybiBpdCA9PT0gQXJyYXlQcm90b3R5cGUgfHwgKGlzUHJvdG90eXBlT2YoQXJyYXlQcm90b3R5cGUsIGl0KSAmJiBvd24gPT09IEFycmF5UHJvdG90eXBlLnNwbGljZSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL3N0cmluZy92aXJ0dWFsL3N0YXJ0cy13aXRoJyk7XG5cbnZhciBTdHJpbmdQcm90b3R5cGUgPSBTdHJpbmcucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuc3RhcnRzV2l0aDtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3RyaW5nJyB8fCBpdCA9PT0gU3RyaW5nUHJvdG90eXBlXG4gICAgfHwgKGlzUHJvdG90eXBlT2YoU3RyaW5nUHJvdG90eXBlLCBpdCkgJiYgb3duID09PSBTdHJpbmdQcm90b3R5cGUuc3RhcnRzV2l0aCkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5kYXRlLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnknKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseScpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tanNvbiAtLSBzYWZlXG5pZiAoIXBhdGguSlNPTikgcGF0aC5KU09OID0geyBzdHJpbmdpZnk6IEpTT04uc3RyaW5naWZ5IH07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCwgcmVwbGFjZXIsIHNwYWNlKSB7XG4gIHJldHVybiBhcHBseShwYXRoLkpTT04uc3RyaW5naWZ5LCBudWxsLCBhcmd1bWVudHMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubWFwJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hcC5ncm91cC1ieScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTWFwO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5udW1iZXIuaXMtaW50ZWdlcicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguTnVtYmVyLmlzSW50ZWdlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnbicpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmFzc2lnbjtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmNyZWF0ZScpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG52YXIgT2JqZWN0ID0gcGF0aC5PYmplY3Q7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlKFAsIEQpIHtcbiAgcmV0dXJuIE9iamVjdC5jcmVhdGUoUCwgRCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbnZhciBPYmplY3QgPSBwYXRoLk9iamVjdDtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYyk7XG59O1xuXG5pZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5LnNoYW0pIGRlZmluZVByb3BlcnR5LnNoYW0gPSB0cnVlO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguT2JqZWN0LmVudHJpZXM7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5mcmVlemUnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5mcmVlemU7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxudmFyIE9iamVjdCA9IHBhdGguT2JqZWN0O1xuXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KTtcbn07XG5cbmlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLnNoYW0pIGdldE93blByb3BlcnR5RGVzY3JpcHRvci5zaGFtID0gdHJ1ZTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LmtleXMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLk9iamVjdC5rZXlzO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5wYXJzZS1pbnQnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLnBhcnNlSW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hZ2dyZWdhdGUtZXJyb3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5hbnknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS53aXRoLXJlc29sdmVycycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5Qcm9taXNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnNldCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuZGlmZmVyZW5jZS52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQuaW50ZXJzZWN0aW9uLnYyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnNldC5pcy1kaXNqb2ludC1mcm9tLnYyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnNldC5pcy1zdWJzZXQtb2YudjInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc2V0LmlzLXN1cGVyc2V0LW9mLnYyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnNldC5zeW1tZXRyaWMtZGlmZmVyZW5jZS52MicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zZXQudW5pb24udjInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5TZXQ7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcycpO1xudmFyIGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QgPSByZXF1aXJlKCcuLi8uLi8uLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLXByb3RvdHlwZS1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluUHJvdG90eXBlTWV0aG9kKCdTdHJpbmcnLCAnaW5jbHVkZXMnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4uLy4uLy4uL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoJyk7XG52YXIgZ2V0QnVpbHRJblByb3RvdHlwZU1ldGhvZCA9IHJlcXVpcmUoJy4uLy4uLy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4tcHJvdG90eXBlLW1ldGhvZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW5Qcm90b3R5cGVNZXRob2QoJ1N0cmluZycsICdzdGFydHNXaXRoJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuYXN5bmMtaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5oYXMtaW5zdGFuY2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLmlzLWNvbmNhdC1zcHJlYWRhYmxlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wubWF0Y2gnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoLWFsbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wucmVwbGFjZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuc2VhcmNoJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5zcGVjaWVzJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5zcGxpdCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wudG8tcHJpbWl0aXZlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC51bnNjb3BhYmxlcycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMubWF0aC50by1zdHJpbmctdGFnJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnJlZmxlY3QudG8tc3RyaW5nLXRhZycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGguU3ltYm9sO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3InKTtcbnZhciBXcmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLXdyYXBwZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBXcmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYoJ2l0ZXJhdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmRhdGUudG8tcHJpbWl0aXZlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC50by1wcmltaXRpdmUnKTtcbnZhciBXcmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLXdyYXBwZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBXcmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYoJ3RvUHJpbWl0aXZlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMud2Vhay1tYXAnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLldlYWtNYXA7XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL2Z1bGwvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9mdWxsL3N5bWJvbCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9mdWxsL3N5bWJvbC9pdGVyYXRvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9mdWxsL3N5bWJvbC90by1wcmltaXRpdmUnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9hY3R1YWwvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9hY3R1YWwvc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtcmVnaXN0ZXJlZC1zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5pcy13ZWxsLWtub3duLXN5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmN1c3RvbS1tYXRjaGVyJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wub2JzZXJ2YWJsZScpO1xuLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5pcy1yZWdpc3RlcmVkJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wuaXMtd2VsbC1rbm93bicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLm1hdGNoZXInKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5tZXRhZGF0YS1rZXknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5wYXR0ZXJuLW1hdGNoJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucmVwbGFjZS1hbGwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vYWN0dWFsL3N5bWJvbC9pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9hY3R1YWwvc3ltYm9sL3RvLXByaW1pdGl2ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgdHJ5VG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZycpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogSXNDYWxsYWJsZShhcmd1bWVudCkgaXMgdHJ1ZWBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc0NhbGxhYmxlKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3InKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ29uc3RydWN0b3IoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGEgY29uc3RydWN0b3InKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQb3NzaWJsZVByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wb3NzaWJsZS1wcm90b3R5cGUnKTtcblxudmFyICRTdHJpbmcgPSBTdHJpbmc7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzUG9zc2libGVQcm90b3R5cGUoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKFwiQ2FuJ3Qgc2V0IFwiICsgJFN0cmluZyhhcmd1bWVudCkgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIFBlcmZvcm0gPyBSZXF1aXJlSW50ZXJuYWxTbG90KE0sIFtbU2V0RGF0YV1dKVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCA9PSAnb2JqZWN0JyAmJiAnc2l6ZScgaW4gaXQgJiYgJ2hhcycgaW4gaXQgJiYgJ2FkZCcgaW4gaXQgJiYgJ2RlbGV0ZScgaW4gaXQgJiYgJ2tleXMnIGluIGl0KSByZXR1cm4gaXQ7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGl0KSArICcgaXMgbm90IGEgc2V0Jyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUHJvdG90eXBlKSB7XG4gIGlmIChpc1Byb3RvdHlwZU9mKFByb3RvdHlwZSwgaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKCdJbmNvcnJlY3QgaW52b2NhdGlvbicpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxudmFyICRTdHJpbmcgPSBTdHJpbmc7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogVHlwZShhcmd1bWVudCkgaXMgT2JqZWN0YFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzT2JqZWN0KGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyBuZXcgJFR5cGVFcnJvcigkU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGFuIG9iamVjdCcpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEZGMjYtIGJ1ZzogQXJyYXlCdWZmZXJzIGFyZSBub24tZXh0ZW5zaWJsZSwgYnV0IE9iamVjdC5pc0V4dGVuc2libGUgZG9lcyBub3QgcmVwb3J0IGl0XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoOCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUsIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4gICAgaWYgKE9iamVjdC5pc0V4dGVuc2libGUoYnVmZmVyKSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1ZmZlciwgJ2EnLCB7IHZhbHVlOiA4IH0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5mb3JFYWNoO1xudmFyIGFycmF5TWV0aG9kSXNTdHJpY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdCcpO1xuXG52YXIgU1RSSUNUX01FVEhPRCA9IGFycmF5TWV0aG9kSXNTdHJpY3QoJ2ZvckVhY2gnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbm1vZHVsZS5leHBvcnRzID0gIVNUUklDVF9NRVRIT0QgPyBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gIHJldHVybiAkZm9yRWFjaCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWZvcmVhY2ggLS0gc2FmZVxufSA6IFtdLmZvckVhY2g7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nJyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGlzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3InKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvcicpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcblxudmFyICRBcnJheSA9IEFycmF5O1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBJU19DT05TVFJVQ1RPUiA9IGlzQ29uc3RydWN0b3IodGhpcyk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvciwgbmV4dCwgdmFsdWU7XG4gIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlXG4gIGlmIChpdGVyYXRvck1ldGhvZCAmJiAhKHRoaXMgPT09ICRBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIHJlc3VsdCA9IElTX0NPTlNUUlVDVE9SID8gbmV3IHRoaXMoKSA6IFtdO1xuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoTywgaXRlcmF0b3JNZXRob2QpO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIGZvciAoOyEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKGxlbmd0aCkgOiAkQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIGlmIChsZW5ndGggPT09IDApIHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmUgLS0gTmFOIGNoZWNrXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9PSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgICAgaWYgKHZhbHVlICE9PSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgaWYgKChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSAmJiBPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbiAgaW5jbHVkZXM6IGNyZWF0ZU1ldGhvZCh0cnVlKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZlxuICBpbmRleE9mOiBjcmVhdGVNZXRob2QoZmFsc2UpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBmb3JFYWNoLCBtYXAsIGZpbHRlciwgc29tZSwgZXZlcnksIGZpbmQsIGZpbmRJbmRleCwgZmlsdGVyUmVqZWN0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICB2YXIgSVNfTUFQID0gVFlQRSA9PT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PT0gMztcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09PSA2O1xuICB2YXIgSVNfRklMVEVSX1JFSkVDVCA9IFRZUEUgPT09IDc7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCwgc3BlY2lmaWNDcmVhdGUpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKHNlbGYpO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0KTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBjcmVhdGUgPSBzcGVjaWZpY0NyZWF0ZSB8fCBhcnJheVNwZWNpZXNDcmVhdGU7XG4gICAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiB8fCBJU19GSUxURVJfUkVKRUNUID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsdWUsIHJlc3VsdDtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbHVlID0gc2VsZltpbmRleF07XG4gICAgICByZXN1bHQgPSBib3VuZEZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSB0YXJnZXRbaW5kZXhdID0gcmVzdWx0OyAvLyBtYXBcbiAgICAgICAgZWxzZSBpZiAocmVzdWx0KSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbHVlOyAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcHVzaCh0YXJnZXQsIHZhbHVlKTsgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgNDogcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAvLyBldmVyeVxuICAgICAgICAgIGNhc2UgNzogcHVzaCh0YXJnZXQsIHZhbHVlKTsgICAgICAvLyBmaWx0ZXJSZWplY3RcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogdGFyZ2V0O1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbiAgZm9yRWFjaDogY3JlYXRlTWV0aG9kKDApLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLm1hcGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuICBtYXA6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maWx0ZXJgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWx0ZXJcbiAgZmlsdGVyOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuc29tZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNvbWVcbiAgc29tZTogY3JlYXRlTWV0aG9kKDMpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmV2ZXJ5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnlcbiAgZXZlcnk6IGNyZWF0ZU1ldGhvZCg0KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZFxuICBmaW5kOiBjcmVhdGVNZXRob2QoNSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZEluZGV4XG4gIGZpbmRJbmRleDogY3JlYXRlTWV0aG9kKDYpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlclJlamVjdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFycmF5LWZpbHRlcmluZ1xuICBmaWx0ZXJSZWplY3Q6IGNyZWF0ZU1ldGhvZCg3KVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIFY4X1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdjgtdmVyc2lvbicpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICAvLyBXZSBjYW4ndCB1c2UgdGhpcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHNlcmlvdXMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3N1xuICByZXR1cm4gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IGFycmF5LmNvbnN0cnVjdG9yID0ge307XG4gICAgY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBmb286IDEgfTtcbiAgICB9O1xuICAgIHJldHVybiBhcnJheVtNRVRIT0RfTkFNRV0oQm9vbGVhbikuZm9vICE9PSAxO1xuICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUsIGFyZ3VtZW50KSB7XG4gIHZhciBtZXRob2QgPSBbXVtNRVRIT0RfTkFNRV07XG4gIHJldHVybiAhIW1ldGhvZCAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtY2FsbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgIG1ldGhvZC5jYWxsKG51bGwsIGFyZ3VtZW50IHx8IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0sIDEpO1xuICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbnZhciBSRURVQ0VfRU1QVFkgPSAnUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSc7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyByZWR1Y2UsIHJlZHVjZVJpZ2h0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoSVNfUklHSFQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBjYWxsYmFja2ZuLCBhcmd1bWVudHNMZW5ndGgsIG1lbW8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoYXQpO1xuICAgIHZhciBzZWxmID0gSW5kZXhlZE9iamVjdChPKTtcbiAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgYUNhbGxhYmxlKGNhbGxiYWNrZm4pO1xuICAgIGlmIChsZW5ndGggPT09IDAgJiYgYXJndW1lbnRzTGVuZ3RoIDwgMikgdGhyb3cgbmV3ICRUeXBlRXJyb3IoUkVEVUNFX0VNUFRZKTtcbiAgICB2YXIgaW5kZXggPSBJU19SSUdIVCA/IGxlbmd0aCAtIDEgOiAwO1xuICAgIHZhciBpID0gSVNfUklHSFQgPyAtMSA6IDE7XG4gICAgaWYgKGFyZ3VtZW50c0xlbmd0aCA8IDIpIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgICBtZW1vID0gc2VsZltpbmRleF07XG4gICAgICAgIGluZGV4ICs9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaW5kZXggKz0gaTtcbiAgICAgIGlmIChJU19SSUdIVCA/IGluZGV4IDwgMCA6IGxlbmd0aCA8PSBpbmRleCkge1xuICAgICAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcihSRURVQ0VfRU1QVFkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKDtJU19SSUdIVCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSkgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICAgIG1lbW8gPSBjYWxsYmFja2ZuKG1lbW8sIHNlbGZbaW5kZXhdLCBpbmRleCwgTyk7XG4gICAgfVxuICAgIHJldHVybiBtZW1vO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUucmVkdWNlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUucmVkdWNlXG4gIGxlZnQ6IGNyZWF0ZU1ldGhvZChmYWxzZSksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5yZWR1Y2VyaWdodFxuICByaWdodDogY3JlYXRlTWV0aG9kKHRydWUpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBTYWZhcmkgPCAxMyBkb2VzIG5vdCB0aHJvdyBhbiBlcnJvciBpbiB0aGlzIGNhc2VcbnZhciBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPSBERVNDUklQVE9SUyAmJiAhZnVuY3Rpb24gKCkge1xuICAvLyBtYWtlcyBubyBzZW5zZSB3aXRob3V0IHByb3BlciBzdHJpY3QgbW9kZSBzdXBwb3J0XG4gIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwgJ2xlbmd0aCcsIHsgd3JpdGFibGU6IGZhbHNlIH0pLmxlbmd0aCA9IDE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gU0lMRU5UX09OX05PTl9XUklUQUJMRV9MRU5HVEhfU0VUID8gZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICBpZiAoaXNBcnJheShPKSAmJiAhZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sICdsZW5ndGgnKS53cml0YWJsZSkge1xuICAgIHRocm93IG5ldyAkVHlwZUVycm9yKCdDYW5ub3Qgc2V0IHJlYWQgb25seSAubGVuZ3RoJyk7XG4gIH0gcmV0dXJuIE8ubGVuZ3RoID0gbGVuZ3RoO1xufSA6IGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiAgcmV0dXJuIE8ubGVuZ3RoID0gbGVuZ3RoO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmN1cnJ5VGhpcyhbXS5zbGljZSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG52YXIgc29ydCA9IGZ1bmN0aW9uIChhcnJheSwgY29tcGFyZWZuKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKGxlbmd0aCA8IDgpIHtcbiAgICAvLyBpbnNlcnRpb24gc29ydFxuICAgIHZhciBpID0gMTtcbiAgICB2YXIgZWxlbWVudCwgajtcblxuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICBqID0gaTtcbiAgICAgIGVsZW1lbnQgPSBhcnJheVtpXTtcbiAgICAgIHdoaWxlIChqICYmIGNvbXBhcmVmbihhcnJheVtqIC0gMV0sIGVsZW1lbnQpID4gMCkge1xuICAgICAgICBhcnJheVtqXSA9IGFycmF5Wy0tal07XG4gICAgICB9XG4gICAgICBpZiAoaiAhPT0gaSsrKSBhcnJheVtqXSA9IGVsZW1lbnQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIG1lcmdlIHNvcnRcbiAgICB2YXIgbWlkZGxlID0gZmxvb3IobGVuZ3RoIC8gMik7XG4gICAgdmFyIGxlZnQgPSBzb3J0KGFycmF5U2xpY2UoYXJyYXksIDAsIG1pZGRsZSksIGNvbXBhcmVmbik7XG4gICAgdmFyIHJpZ2h0ID0gc29ydChhcnJheVNsaWNlKGFycmF5LCBtaWRkbGUpLCBjb21wYXJlZm4pO1xuICAgIHZhciBsbGVuZ3RoID0gbGVmdC5sZW5ndGg7XG4gICAgdmFyIHJsZW5ndGggPSByaWdodC5sZW5ndGg7XG4gICAgdmFyIGxpbmRleCA9IDA7XG4gICAgdmFyIHJpbmRleCA9IDA7XG5cbiAgICB3aGlsZSAobGluZGV4IDwgbGxlbmd0aCB8fCByaW5kZXggPCBybGVuZ3RoKSB7XG4gICAgICBhcnJheVtsaW5kZXggKyByaW5kZXhdID0gKGxpbmRleCA8IGxsZW5ndGggJiYgcmluZGV4IDwgcmxlbmd0aClcbiAgICAgICAgPyBjb21wYXJlZm4obGVmdFtsaW5kZXhdLCByaWdodFtyaW5kZXhdKSA8PSAwID8gbGVmdFtsaW5kZXgrK10gOiByaWdodFtyaW5kZXgrK11cbiAgICAgICAgOiBsaW5kZXggPCBsbGVuZ3RoID8gbGVmdFtsaW5kZXgrK10gOiByaWdodFtyaW5kZXgrK107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgJEFycmF5ID0gQXJyYXk7XG5cbi8vIGEgcGFydCBvZiBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlzcGVjaWVzY3JlYXRlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbEFycmF5KSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkge1xuICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKGlzQ29uc3RydWN0b3IoQykgJiYgKEMgPT09ICRBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgZWxzZSBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyAkQXJyYXkgOiBDO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhcnJheVNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG5cbi8vIGBBcnJheVNwZWNpZXNDcmVhdGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXksIGxlbmd0aCkge1xuICByZXR1cm4gbmV3IChhcnJheVNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbEFycmF5KSkobGVuZ3RoID09PSAwID8gMCA6IGxlbmd0aCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UnKTtcblxuLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgRU5UUklFUykge1xuICB0cnkge1xuICAgIHJldHVybiBFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ3Rocm93JywgZXJyb3IpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgbnVtQXJncykge1xuICByZXR1cm4gbnVtQXJncyA9PT0gMSA/IGZ1bmN0aW9uIChvYmplY3QsIGFyZykge1xuICAgIHJldHVybiBvYmplY3RbbWV0aG9kTmFtZV0oYXJnKTtcbiAgfSA6IGZ1bmN0aW9uIChvYmplY3QsIGFyZzEsIGFyZzIpIHtcbiAgICByZXR1cm4gb2JqZWN0W21ldGhvZE5hbWVdKGFyZzEsIGFyZzIpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgY2FsbGVkID0gMDtcbiAgdmFyIGl0ZXJhdG9yV2l0aFJldHVybiA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBkb25lOiAhIWNhbGxlZCsrIH07XG4gICAgfSxcbiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkge1xuICAgICAgU0FGRV9DTE9TSU5HID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIGl0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tLCBuby10aHJvdy1saXRlcmFsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIEFycmF5LmZyb20oaXRlcmF0b3JXaXRoUmV0dXJuLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBTS0lQX0NMT1NJTkcpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IHJldHVybiBmYWxzZTsgfSAvLyB3b3JrYXJvdW5kIG9mIG9sZCBXZWJLaXQgKyBgZXZhbGAgYnVnXG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKHt9LnRvU3RyaW5nKTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHN0cmluZ1NsaWNlKHRvU3RyaW5nKGl0KSwgOCwgLTEpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGNsYXNzb2ZSYXcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIHRhZywgcmVzdWx0O1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSAkT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT09ICdPYmplY3QnICYmIGlzQ2FsbGFibGUoTy5jYWxsZWUpID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvcicpO1xudmFyIGRlZmluZUJ1aWx0SW5zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZScpO1xudmFyIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXItcmVzdWx0LW9iamVjdCcpO1xudmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5mYXN0S2V5O1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBQcm90b3R5cGUpO1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGF0LCB7XG4gICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsXG4gICAgICAgIGluZGV4OiBjcmVhdGUobnVsbCksXG4gICAgICAgIGZpcnN0OiB1bmRlZmluZWQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgc2l6ZTogMFxuICAgICAgfSk7XG4gICAgICBpZiAoIURFU0NSSVBUT1JTKSB0aGF0LnNpemUgPSAwO1xuICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpdGVyYWJsZSkpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB7IHRoYXQ6IHRoYXQsIEFTX0VOVFJJRVM6IElTX01BUCB9KTtcbiAgICB9KTtcblxuICAgIHZhciBQcm90b3R5cGUgPSBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgdmFyIHByZXZpb3VzLCBpbmRleDtcbiAgICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7XG4gICAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5sYXN0ID0gZW50cnkgPSB7XG4gICAgICAgICAgaW5kZXg6IGluZGV4ID0gZmFzdEtleShrZXksIHRydWUpLFxuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBwcmV2aW91czogcHJldmlvdXMgPSBzdGF0ZS5sYXN0LFxuICAgICAgICAgIG5leHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZW1vdmVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXN0YXRlLmZpcnN0KSBzdGF0ZS5maXJzdCA9IGVudHJ5O1xuICAgICAgICBpZiAocHJldmlvdXMpIHByZXZpb3VzLm5leHQgPSBlbnRyeTtcbiAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplKys7XG4gICAgICAgIGVsc2UgdGhhdC5zaXplKys7XG4gICAgICAgIC8vIGFkZCB0byBpbmRleFxuICAgICAgICBpZiAoaW5kZXggIT09ICdGJykgc3RhdGUuaW5kZXhbaW5kZXhdID0gZW50cnk7XG4gICAgICB9IHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICB2YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoYXQpO1xuICAgICAgLy8gZmFzdCBjYXNlXG4gICAgICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gICAgICB2YXIgZW50cnk7XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHN0YXRlLmluZGV4W2luZGV4XTtcbiAgICAgIC8vIGZyb3plbiBvYmplY3QgY2FzZVxuICAgICAgZm9yIChlbnRyeSA9IHN0YXRlLmZpcnN0OyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uZXh0KSB7XG4gICAgICAgIGlmIChlbnRyeS5rZXkgPT09IGtleSkgcmV0dXJuIGVudHJ5O1xuICAgICAgfVxuICAgIH07XG5cbiAgICBkZWZpbmVCdWlsdElucyhQcm90b3R5cGUsIHtcbiAgICAgIC8vIGB7IE1hcCwgU2V0IH0ucHJvdG90eXBlLmNsZWFyKClgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5jbGVhclxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmNsZWFyXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGVudHJ5ID0gc3RhdGUuZmlyc3Q7XG4gICAgICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlbnRyeS5wcmV2aW91cykgZW50cnkucHJldmlvdXMgPSBlbnRyeS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5maXJzdCA9IHN0YXRlLmxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHN0YXRlLmluZGV4ID0gY3JlYXRlKG51bGwpO1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUgPSAwO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGUuZGVsZXRlKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5kZWxldGVcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5kZWxldGVcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uZXh0O1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAgICAgZGVsZXRlIHN0YXRlLmluZGV4W2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeS5yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uZXh0ID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wcmV2aW91cyA9IHByZXY7XG4gICAgICAgICAgaWYgKHN0YXRlLmZpcnN0ID09PSBlbnRyeSkgc3RhdGUuZmlyc3QgPSBuZXh0O1xuICAgICAgICAgIGlmIChzdGF0ZS5sYXN0ID09PSBlbnRyeSkgc3RhdGUubGFzdCA9IHByZXY7XG4gICAgICAgICAgaWYgKERFU0NSSVBUT1JTKSBzdGF0ZS5zaXplLS07XG4gICAgICAgICAgZWxzZSB0aGF0LnNpemUtLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZm9yZWFjaFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmZvcmVhY2hcbiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICAgICAgdmFyIGVudHJ5O1xuICAgICAgICB3aGlsZSAoZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm5leHQgOiBzdGF0ZS5maXJzdCkge1xuICAgICAgICAgIGJvdW5kRnVuY3Rpb24oZW50cnkudmFsdWUsIGVudHJ5LmtleSwgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpIGVudHJ5ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBgeyBNYXAsIFNldH0ucHJvdG90eXBlLmhhcyhrZXkpYCBtZXRob2RzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuaGFzXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuaGFzXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuICEhZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRlZmluZUJ1aWx0SW5zKFByb3RvdHlwZSwgSVNfTUFQID8ge1xuICAgICAgLy8gYE1hcC5wcm90b3R5cGUuZ2V0KGtleSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLmdldFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoaXMsIGtleSk7XG4gICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52YWx1ZTtcbiAgICAgIH0sXG4gICAgICAvLyBgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLnNldFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IDoge1xuICAgICAgLy8gYFNldC5wcm90b3R5cGUuYWRkKHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuYWRkXG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihQcm90b3R5cGUsICdzaXplJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKSB7XG4gICAgdmFyIElURVJBVE9SX05BTUUgPSBDT05TVFJVQ1RPUl9OQU1FICsgJyBJdGVyYXRvcic7XG4gICAgdmFyIGdldEludGVybmFsQ29sbGVjdGlvblN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICB2YXIgZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihJVEVSQVRPUl9OQU1FKTtcbiAgICAvLyBgeyBNYXAsIFNldCB9LnByb3RvdHlwZS57IGtleXMsIHZhbHVlcywgZW50cmllcywgQEBpdGVyYXRvciB9KClgIG1ldGhvZHNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW1hcC5wcm90b3R5cGUuZW50cmllc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS5rZXlzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAucHJvdG90eXBlLnZhbHVlc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWFwLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmVudHJpZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUua2V5c1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS52YWx1ZXNcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUtQEBpdGVyYXRvclxuICAgIGRlZmluZUl0ZXJhdG9yKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgICB0eXBlOiBJVEVSQVRPUl9OQU1FLFxuICAgICAgICB0YXJnZXQ6IGl0ZXJhdGVkLFxuICAgICAgICBzdGF0ZTogZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUoaXRlcmF0ZWQpLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBsYXN0OiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSh0aGlzKTtcbiAgICAgIHZhciBraW5kID0gc3RhdGUua2luZDtcbiAgICAgIHZhciBlbnRyeSA9IHN0YXRlLmxhc3Q7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghc3RhdGUudGFyZ2V0IHx8ICEoc3RhdGUubGFzdCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuc3RhdGUuZmlyc3QpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHN0YXRlLnRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiBzdGVwIGJ5IGtpbmRcbiAgICAgIGlmIChraW5kID09PSAna2V5cycpIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KGVudHJ5LmtleSwgZmFsc2UpO1xuICAgICAgaWYgKGtpbmQgPT09ICd2YWx1ZXMnKSByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdChlbnRyeS52YWx1ZSwgZmFsc2UpO1xuICAgICAgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QoW2VudHJ5LmtleSwgZW50cnkudmFsdWVdLCBmYWxzZSk7XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYHsgTWFwLCBTZXQgfS5wcm90b3R5cGVbQEBzcGVjaWVzXWAgYWNjZXNzb3JzXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXQtbWFwLUBAc3BlY2llc1xuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXNldC1AQHNwZWNpZXNcbiAgICBzZXRTcGVjaWVzKENPTlNUUlVDVE9SX05BTUUpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGRlZmluZUJ1aWx0SW5zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMnKTtcbnZhciBnZXRXZWFrRGF0YSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLmdldFdlYWtEYXRhO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIEFycmF5SXRlcmF0aW9uTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcbnZhciBmaW5kID0gQXJyYXlJdGVyYXRpb25Nb2R1bGUuZmluZDtcbnZhciBmaW5kSW5kZXggPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kSW5kZXg7XG52YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbnZhciBpZCA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciB1bmNhdWdodCBmcm96ZW4ga2V5c1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmZyb3plbiB8fCAoc3RhdGUuZnJvemVuID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7XG59O1xuXG52YXIgVW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbnRyaWVzID0gW107XG59O1xuXG52YXIgZmluZFVuY2F1Z2h0RnJvemVuID0gZnVuY3Rpb24gKHN0b3JlLCBrZXkpIHtcbiAgcmV0dXJuIGZpbmQoc3RvcmUuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gIH0pO1xufTtcblxuVW5jYXVnaHRGcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gISFmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgZW50cnlbMV0gPSB2YWx1ZTtcbiAgICBlbHNlIHRoaXMuZW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0sXG4gICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGluZGV4ID0gZmluZEluZGV4KHRoaXMuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7XG4gICAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgICB9KTtcbiAgICBpZiAofmluZGV4KSBzcGxpY2UodGhpcy5lbnRyaWVzLCBpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIENvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgUHJvdG90eXBlKTtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBpZDogaWQrKyxcbiAgICAgICAgZnJvemVuOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpdGVyYWJsZSkpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB7IHRoYXQ6IHRoYXQsIEFTX0VOVFJJRVM6IElTX01BUCB9KTtcbiAgICB9KTtcblxuICAgIHZhciBQcm90b3R5cGUgPSBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGFuT2JqZWN0KGtleSksIHRydWUpO1xuICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLnNldChrZXksIHZhbHVlKTtcbiAgICAgIGVsc2UgZGF0YVtzdGF0ZS5pZF0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICBkZWZpbmVCdWlsdElucyhQcm90b3R5cGUsIHtcbiAgICAgIC8vIGB7IFdlYWtNYXAsIFdlYWtTZXQgfS5wcm90b3R5cGUuZGVsZXRlKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWtzZXQucHJvdG90eXBlLmRlbGV0ZVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgaGFzT3duKGRhdGEsIHN0YXRlLmlkKSAmJiBkZWxldGUgZGF0YVtzdGF0ZS5pZF07XG4gICAgICB9LFxuICAgICAgLy8gYHsgV2Vha01hcCwgV2Vha1NldCB9LnByb3RvdHlwZS5oYXMoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLnByb3RvdHlwZS5oYXNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha3NldC5wcm90b3R5cGUuaGFzXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgaGFzT3duKGRhdGEsIHN0YXRlLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRlZmluZUJ1aWx0SW5zKFByb3RvdHlwZSwgSVNfTUFQID8ge1xuICAgICAgLy8gYFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC5wcm90b3R5cGUuZ2V0XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5nZXQoa2V5KTtcbiAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGFbc3RhdGUuaWRdIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gYFdlYWtNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWttYXAucHJvdG90eXBlLnNldFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyBgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWtzZXQucHJvdG90eXBlLmFkZFxuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZm9yRWFjaDtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUsIHdyYXBwZXIsIGNvbW1vbikge1xuICB2YXIgSVNfTUFQID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdNYXAnKSAhPT0gLTE7XG4gIHZhciBJU19XRUFLID0gQ09OU1RSVUNUT1JfTkFNRS5pbmRleE9mKCdXZWFrJykgIT09IC0xO1xuICB2YXIgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnO1xuICB2YXIgTmF0aXZlQ29uc3RydWN0b3IgPSBnbG9iYWxUaGlzW0NPTlNUUlVDVE9SX05BTUVdO1xuICB2YXIgTmF0aXZlUHJvdG90eXBlID0gTmF0aXZlQ29uc3RydWN0b3IgJiYgTmF0aXZlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICB2YXIgZXhwb3J0ZWQgPSB7fTtcbiAgdmFyIENvbnN0cnVjdG9yO1xuXG4gIGlmICghREVTQ1JJUFRPUlMgfHwgIWlzQ2FsbGFibGUoTmF0aXZlQ29uc3RydWN0b3IpXG4gICAgfHwgIShJU19XRUFLIHx8IE5hdGl2ZVByb3RvdHlwZS5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbiAoKSB7IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLmVudHJpZXMoKS5uZXh0KCk7IH0pKVxuICApIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIENvbnN0cnVjdG9yID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpO1xuICAgIEludGVybmFsTWV0YWRhdGFNb2R1bGUuZW5hYmxlKCk7XG4gIH0gZWxzZSB7XG4gICAgQ29uc3RydWN0b3IgPSB3cmFwcGVyKGZ1bmN0aW9uICh0YXJnZXQsIGl0ZXJhYmxlKSB7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKGFuSW5zdGFuY2UodGFyZ2V0LCBQcm90b3R5cGUpLCB7XG4gICAgICAgIHR5cGU6IENPTlNUUlVDVE9SX05BTUUsXG4gICAgICAgIGNvbGxlY3Rpb246IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpXG4gICAgICB9KTtcbiAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoaXRlcmFibGUpKSBpdGVyYXRlKGl0ZXJhYmxlLCB0YXJnZXRbQURERVJdLCB7IHRoYXQ6IHRhcmdldCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgIH0pO1xuXG4gICAgdmFyIFByb3RvdHlwZSA9IENvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIGZvckVhY2goWydhZGQnLCAnY2xlYXInLCAnZGVsZXRlJywgJ2ZvckVhY2gnLCAnZ2V0JywgJ2hhcycsICdzZXQnLCAna2V5cycsICd2YWx1ZXMnLCAnZW50cmllcyddLCBmdW5jdGlvbiAoS0VZKSB7XG4gICAgICB2YXIgSVNfQURERVIgPSBLRVkgPT09ICdhZGQnIHx8IEtFWSA9PT0gJ3NldCc7XG4gICAgICBpZiAoS0VZIGluIE5hdGl2ZVByb3RvdHlwZSAmJiAhKElTX1dFQUsgJiYgS0VZID09PSAnY2xlYXInKSkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoUHJvdG90eXBlLCBLRVksIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLmNvbGxlY3Rpb247XG4gICAgICAgICAgaWYgKCFJU19BRERFUiAmJiBJU19XRUFLICYmICFpc09iamVjdChhKSkgcmV0dXJuIEtFWSA9PT0gJ2dldCcgPyB1bmRlZmluZWQgOiBmYWxzZTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gY29sbGVjdGlvbltLRVldKGEgPT09IDAgPyAwIDogYSwgYik7XG4gICAgICAgICAgcmV0dXJuIElTX0FEREVSID8gdGhpcyA6IHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBJU19XRUFLIHx8IGRlZmluZVByb3BlcnR5KFByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykuY29sbGVjdGlvbi5zaXplO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUsIGZhbHNlLCB0cnVlKTtcblxuICBleHBvcnRlZFtDT05TVFJVQ1RPUl9OQU1FXSA9IENvbnN0cnVjdG9yO1xuICAkKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwgZXhwb3J0ZWQpO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQ29uc3RydWN0b3I7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSwgZXhjZXB0aW9ucykge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkgJiYgIShleGNlcHRpb25zICYmIGhhc093bihleGNlcHRpb25zLCBrZXkpKSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgIH1cbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICB2YXIgcmVnZXhwID0gLy4vO1xuICB0cnkge1xuICAgICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApO1xuICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICB0cnkge1xuICAgICAgcmVnZXhwW01BVENIXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApO1xuICAgIH0gY2F0Y2ggKGVycm9yMikgeyAvKiBlbXB0eSAqLyB9XG4gIH0gcmV0dXJuIGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgRi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldHByb3RvdHlwZW9mIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBgQ3JlYXRlSXRlclJlc3VsdE9iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZWl0ZXJyZXN1bHRvYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlLCBkb25lKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogZG9uZSB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBrZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3Rba2V5XSA9IHZhbHVlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHBhZFN0YXJ0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1wYWQnKS5zdGFydDtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcbnZhciAkaXNGaW5pdGUgPSBpc0Zpbml0ZTtcbnZhciBhYnMgPSBNYXRoLmFicztcbnZhciBEYXRlUHJvdG90eXBlID0gRGF0ZS5wcm90b3R5cGU7XG52YXIgbmF0aXZlRGF0ZVRvSVNPU3RyaW5nID0gRGF0ZVByb3RvdHlwZS50b0lTT1N0cmluZztcbnZhciB0aGlzVGltZVZhbHVlID0gdW5jdXJyeVRoaXMoRGF0ZVByb3RvdHlwZS5nZXRUaW1lKTtcbnZhciBnZXRVVENEYXRlID0gdW5jdXJyeVRoaXMoRGF0ZVByb3RvdHlwZS5nZXRVVENEYXRlKTtcbnZhciBnZXRVVENGdWxsWWVhciA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VVRDRnVsbFllYXIpO1xudmFyIGdldFVUQ0hvdXJzID0gdW5jdXJyeVRoaXMoRGF0ZVByb3RvdHlwZS5nZXRVVENIb3Vycyk7XG52YXIgZ2V0VVRDTWlsbGlzZWNvbmRzID0gdW5jdXJyeVRoaXMoRGF0ZVByb3RvdHlwZS5nZXRVVENNaWxsaXNlY29uZHMpO1xudmFyIGdldFVUQ01pbnV0ZXMgPSB1bmN1cnJ5VGhpcyhEYXRlUHJvdG90eXBlLmdldFVUQ01pbnV0ZXMpO1xudmFyIGdldFVUQ01vbnRoID0gdW5jdXJyeVRoaXMoRGF0ZVByb3RvdHlwZS5nZXRVVENNb250aCk7XG52YXIgZ2V0VVRDU2Vjb25kcyA9IHVuY3VycnlUaGlzKERhdGVQcm90b3R5cGUuZ2V0VVRDU2Vjb25kcyk7XG5cbi8vIGBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZ2AgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWRhdGUucHJvdG90eXBlLnRvaXNvc3RyaW5nXG4vLyBQaGFudG9tSlMgLyBvbGQgV2ViS2l0IGZhaWxzIGhlcmU6XG5tb2R1bGUuZXhwb3J0cyA9IChmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuYXRpdmVEYXRlVG9JU09TdHJpbmcuY2FsbChuZXcgRGF0ZSgtNWUxMyAtIDEpKSAhPT0gJzAzODUtMDctMjVUMDc6MDY6MzkuOTk5Wic7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBuYXRpdmVEYXRlVG9JU09TdHJpbmcuY2FsbChuZXcgRGF0ZShOYU4pKTtcbn0pKSA/IGZ1bmN0aW9uIHRvSVNPU3RyaW5nKCkge1xuICBpZiAoISRpc0Zpbml0ZSh0aGlzVGltZVZhbHVlKHRoaXMpKSkgdGhyb3cgbmV3ICRSYW5nZUVycm9yKCdJbnZhbGlkIHRpbWUgdmFsdWUnKTtcbiAgdmFyIGRhdGUgPSB0aGlzO1xuICB2YXIgeWVhciA9IGdldFVUQ0Z1bGxZZWFyKGRhdGUpO1xuICB2YXIgbWlsbGlzZWNvbmRzID0gZ2V0VVRDTWlsbGlzZWNvbmRzKGRhdGUpO1xuICB2YXIgc2lnbiA9IHllYXIgPCAwID8gJy0nIDogeWVhciA+IDk5OTkgPyAnKycgOiAnJztcbiAgcmV0dXJuIHNpZ24gKyBwYWRTdGFydChhYnMoeWVhciksIHNpZ24gPyA2IDogNCwgMCkgK1xuICAgICctJyArIHBhZFN0YXJ0KGdldFVUQ01vbnRoKGRhdGUpICsgMSwgMiwgMCkgK1xuICAgICctJyArIHBhZFN0YXJ0KGdldFVUQ0RhdGUoZGF0ZSksIDIsIDApICtcbiAgICAnVCcgKyBwYWRTdGFydChnZXRVVENIb3VycyhkYXRlKSwgMiwgMCkgK1xuICAgICc6JyArIHBhZFN0YXJ0KGdldFVUQ01pbnV0ZXMoZGF0ZSksIDIsIDApICtcbiAgICAnOicgKyBwYWRTdGFydChnZXRVVENTZWNvbmRzKGRhdGUpLCAyLCAwKSArXG4gICAgJy4nICsgcGFkU3RhcnQobWlsbGlzZWNvbmRzLCAzLCAwKSArXG4gICAgJ1onO1xufSA6IG5hdGl2ZURhdGVUb0lTT1N0cmluZztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgbmFtZSwgZGVzY3JpcHRvcikge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkuZih0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVudW1lcmFibGUpIHRhcmdldFtrZXldID0gdmFsdWU7XG4gIGVsc2UgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHRhcmdldCwga2V5LCB2YWx1ZSk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnVuc2FmZSAmJiB0YXJnZXRba2V5XSkgdGFyZ2V0W2tleV0gPSBzcmNba2V5XTtcbiAgICBlbHNlIGRlZmluZUJ1aWx0SW4odGFyZ2V0LCBrZXksIHNyY1trZXldLCBvcHRpb25zKTtcbiAgfSByZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywga2V5LCB7IHZhbHVlOiB2YWx1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIFApIHtcbiAgaWYgKCFkZWxldGUgT1tQXSkgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBkZWxldGUgcHJvcGVydHkgJyArIHRyeVRvU3RyaW5nKFApICsgJyBvZiAnICsgdHJ5VG9TdHJpbmcoTykpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG4vLyBEZXRlY3QgSUU4J3MgaW5jb21wbGV0ZSBkZWZpbmVQcm9wZXJ0eSBpbXBsZW1lbnRhdGlvblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIDEsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pWzFdICE9PSA3O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG52YXIgZG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgRVhJU1RTID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gRVhJU1RTID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gMHgxRkZGRkZGRkZGRkZGRjsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPiBNQVhfU0FGRV9JTlRFR0VSKSB0aHJvdyAkVHlwZUVycm9yKCdNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGl0ZXJhYmxlIERPTSBjb2xsZWN0aW9uc1xuLy8gZmxhZyAtIGBpdGVyYWJsZWAgaW50ZXJmYWNlIC0gJ2VudHJpZXMnLCAna2V5cycsICd2YWx1ZXMnLCAnZm9yRWFjaCcgbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENTU1J1bGVMaXN0OiAwLFxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiAwLFxuICBDU1NWYWx1ZUxpc3Q6IDAsXG4gIENsaWVudFJlY3RMaXN0OiAwLFxuICBET01SZWN0TGlzdDogMCxcbiAgRE9NU3RyaW5nTGlzdDogMCxcbiAgRE9NVG9rZW5MaXN0OiAxLFxuICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogMCxcbiAgRmlsZUxpc3Q6IDAsXG4gIEhUTUxBbGxDb2xsZWN0aW9uOiAwLFxuICBIVE1MQ29sbGVjdGlvbjogMCxcbiAgSFRNTEZvcm1FbGVtZW50OiAwLFxuICBIVE1MU2VsZWN0RWxlbWVudDogMCxcbiAgTWVkaWFMaXN0OiAwLFxuICBNaW1lVHlwZUFycmF5OiAwLFxuICBOYW1lZE5vZGVNYXA6IDAsXG4gIE5vZGVMaXN0OiAxLFxuICBQYWludFJlcXVlc3RMaXN0OiAwLFxuICBQbHVnaW46IDAsXG4gIFBsdWdpbkFycmF5OiAwLFxuICBTVkdMZW5ndGhMaXN0OiAwLFxuICBTVkdOdW1iZXJMaXN0OiAwLFxuICBTVkdQYXRoU2VnTGlzdDogMCxcbiAgU1ZHUG9pbnRMaXN0OiAwLFxuICBTVkdTdHJpbmdMaXN0OiAwLFxuICBTVkdUcmFuc2Zvcm1MaXN0OiAwLFxuICBTb3VyY2VCdWZmZXJMaXN0OiAwLFxuICBTdHlsZVNoZWV0TGlzdDogMCxcbiAgVGV4dFRyYWNrQ3VlTGlzdDogMCxcbiAgVGV4dFRyYWNrTGlzdDogMCxcbiAgVG91Y2hMaXN0OiAwXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcblxudmFyIGZpcmVmb3ggPSB1c2VyQWdlbnQubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvaSk7XG5cbm1vZHVsZS5leHBvcnRzID0gISFmaXJlZm94ICYmICtmaXJlZm94WzFdO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFVBID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvTVNJRXxUcmlkZW50Ly50ZXN0KFVBKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC9pcGFkfGlwaG9uZXxpcG9kL2kudGVzdCh1c2VyQWdlbnQpICYmIHR5cGVvZiBQZWJibGUgIT0gJ3VuZGVmaW5lZCc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXVzZXItYWdlbnQnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZG9zL25vLXZ1bG5lcmFibGUgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSAvKD86aXBhZHxpcGhvbmV8aXBvZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEVOVklST05NRU5UID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRU5WSVJPTk1FTlQgPT09ICdOT0RFJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdXNlci1hZ2VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IC93ZWIwcyg/IS4qY2hyb21lKS9pLnRlc3QodXNlckFnZW50KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG5cbnZhciBuYXZpZ2F0b3IgPSBnbG9iYWxUaGlzLm5hdmlnYXRvcjtcbnZhciB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudDtcblxubW9kdWxlLmV4cG9ydHMgPSB1c2VyQWdlbnQgPyBTdHJpbmcodXNlckFnZW50KSA6ICcnO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdXNlci1hZ2VudCcpO1xuXG52YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbnZhciBEZW5vID0gZ2xvYmFsVGhpcy5EZW5vO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zIHx8IERlbm8gJiYgRGVuby52ZXJzaW9uO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjg7XG52YXIgbWF0Y2gsIHZlcnNpb247XG5cbmlmICh2OCkge1xuICBtYXRjaCA9IHY4LnNwbGl0KCcuJyk7XG4gIC8vIGluIG9sZCBDaHJvbWUsIHZlcnNpb25zIG9mIFY4IGlzbid0IFY4ID0gQ2hyb21lIC8gMTBcbiAgLy8gYnV0IHRoZWlyIGNvcnJlY3QgdmVyc2lvbnMgYXJlIG5vdCBpbnRlcmVzdGluZyBmb3IgdXNcbiAgdmVyc2lvbiA9IG1hdGNoWzBdID4gMCAmJiBtYXRjaFswXSA8IDQgPyAxIDogKyhtYXRjaFswXSArIG1hdGNoWzFdKTtcbn1cblxuLy8gQnJvd3NlckZTIE5vZGVKUyBgcHJvY2Vzc2AgcG9seWZpbGwgaW5jb3JyZWN0bHkgc2V0IGAudjhgIHRvIGAwLjBgXG4vLyBzbyBjaGVjayBgdXNlckFnZW50YCBldmVuIGlmIGAudjhgIGV4aXN0cywgYnV0IDBcbmlmICghdmVyc2lvbiAmJiB1c2VyQWdlbnQpIHtcbiAgbWF0Y2ggPSB1c2VyQWdlbnQubWF0Y2goL0VkZ2VcXC8oXFxkKykvKTtcbiAgaWYgKCFtYXRjaCB8fCBtYXRjaFsxXSA+PSA3NCkge1xuICAgIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKTtcbiAgICBpZiAobWF0Y2gpIHZlcnNpb24gPSArbWF0Y2hbMV07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2ZXJzaW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50Jyk7XG5cbnZhciB3ZWJraXQgPSB1c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XFwvKFxcZCspXFwuLyk7XG5cbm1vZHVsZS5leHBvcnRzID0gISF3ZWJraXQgJiYgK3dlYmtpdFsxXTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGdsb2JhbCBCdW4sIERlbm8gLS0gZGV0ZWN0aW9uICovXG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgdXNlckFnZW50U3RhcnRzV2l0aCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIHVzZXJBZ2VudC5zbGljZSgwLCBzdHJpbmcubGVuZ3RoKSA9PT0gc3RyaW5nO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xuICBpZiAodXNlckFnZW50U3RhcnRzV2l0aCgnQnVuLycpKSByZXR1cm4gJ0JVTic7XG4gIGlmICh1c2VyQWdlbnRTdGFydHNXaXRoKCdDbG91ZGZsYXJlLVdvcmtlcnMnKSkgcmV0dXJuICdDTE9VREZMQVJFJztcbiAgaWYgKHVzZXJBZ2VudFN0YXJ0c1dpdGgoJ0Rlbm8vJykpIHJldHVybiAnREVOTyc7XG4gIGlmICh1c2VyQWdlbnRTdGFydHNXaXRoKCdOb2RlLmpzLycpKSByZXR1cm4gJ05PREUnO1xuICBpZiAoZ2xvYmFsVGhpcy5CdW4gJiYgdHlwZW9mIEJ1bi52ZXJzaW9uID09ICdzdHJpbmcnKSByZXR1cm4gJ0JVTic7XG4gIGlmIChnbG9iYWxUaGlzLkRlbm8gJiYgdHlwZW9mIERlbm8udmVyc2lvbiA9PSAnb2JqZWN0JykgcmV0dXJuICdERU5PJztcbiAgaWYgKGNsYXNzb2YoZ2xvYmFsVGhpcy5wcm9jZXNzKSA9PT0gJ3Byb2Nlc3MnKSByZXR1cm4gJ05PREUnO1xuICBpZiAoZ2xvYmFsVGhpcy53aW5kb3cgJiYgZ2xvYmFsVGhpcy5kb2N1bWVudCkgcmV0dXJuICdCUk9XU0VSJztcbiAgcmV0dXJuICdSRVNUJztcbn0pKCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG5cbnZhciAkRXJyb3IgPSBFcnJvcjtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG5cbnZhciBURVNUID0gKGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIFN0cmluZyhuZXcgJEVycm9yKGFyZykuc3RhY2spOyB9KSgnenhjYXNkJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVkb3Mvbm8tdnVsbmVyYWJsZSAtLSBzYWZlXG52YXIgVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZID0gL1xcblxccyphdCBbXjpdKjpbXlxcbl0qLztcbnZhciBJU19WOF9PUl9DSEFLUkFfU1RBQ0sgPSBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlkudGVzdChURVNUKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RhY2ssIGRyb3BFbnRyaWVzKSB7XG4gIGlmIChJU19WOF9PUl9DSEFLUkFfU1RBQ0sgJiYgdHlwZW9mIHN0YWNrID09ICdzdHJpbmcnICYmICEkRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UpIHtcbiAgICB3aGlsZSAoZHJvcEVudHJpZXMtLSkgc3RhY2sgPSByZXBsYWNlKHN0YWNrLCBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlksICcnKTtcbiAgfSByZXR1cm4gc3RhY2s7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBjbGVhckVycm9yU3RhY2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2stY2xlYXInKTtcbnZhciBFUlJPUl9TVEFDS19JTlNUQUxMQUJMRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZScpO1xuXG4vLyBub24tc3RhbmRhcmQgVjhcbnZhciBjYXB0dXJlU3RhY2tUcmFjZSA9IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlcnJvciwgQywgc3RhY2ssIGRyb3BFbnRyaWVzKSB7XG4gIGlmIChFUlJPUl9TVEFDS19JTlNUQUxMQUJMRSkge1xuICAgIGlmIChjYXB0dXJlU3RhY2tUcmFjZSkgY2FwdHVyZVN0YWNrVHJhY2UoZXJyb3IsIEMpO1xuICAgIGVsc2UgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGVycm9yLCAnc3RhY2snLCBjbGVhckVycm9yU3RhY2soc3RhY2ssIGRyb3BFbnRyaWVzKSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ2EnKTtcbiAgaWYgKCEoJ3N0YWNrJyBpbiBlcnJvcikpIHJldHVybiB0cnVlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnc3RhY2snLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgNykpO1xuICByZXR1cm4gZXJyb3Iuc3RhY2sgIT09IDc7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHknKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xuLy8gYWRkIGRlYnVnZ2luZyBpbmZvXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlJyk7XG5cbnZhciB3cmFwQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoTmF0aXZlQ29uc3RydWN0b3IpIHtcbiAgdmFyIFdyYXBwZXIgPSBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgV3JhcHBlcikge1xuICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpO1xuICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgTmF0aXZlQ29uc3RydWN0b3IoYSk7XG4gICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcihhLCBiKTtcbiAgICAgIH0gcmV0dXJuIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcihhLCBiLCBjKTtcbiAgICB9IHJldHVybiBhcHBseShOYXRpdmVDb25zdHJ1Y3RvciwgdGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbiAgV3JhcHBlci5wcm90b3R5cGUgPSBOYXRpdmVDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHJldHVybiBXcmFwcGVyO1xufTtcblxuLypcbiAgb3B0aW9ucy50YXJnZXQgICAgICAgICAtIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3RcbiAgb3B0aW9ucy5nbG9iYWwgICAgICAgICAtIHRhcmdldCBpcyB0aGUgZ2xvYmFsIG9iamVjdFxuICBvcHRpb25zLnN0YXQgICAgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnByb3RvICAgICAgICAgIC0gZXhwb3J0IGFzIHByb3RvdHlwZSBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnJlYWwgICAgICAgICAgIC0gcmVhbCBwcm90b3R5cGUgbWV0aG9kIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy5mb3JjZWQgICAgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGVcbiAgb3B0aW9ucy5iaW5kICAgICAgICAgICAtIGJpbmQgbWV0aG9kcyB0byB0aGUgdGFyZ2V0LCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMud3JhcCAgICAgICAgICAgLSB3cmFwIGNvbnN0cnVjdG9ycyB0byBwcmV2ZW50aW5nIGdsb2JhbCBwb2xsdXRpb24sIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy51bnNhZmUgICAgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eVxuICBvcHRpb25zLnNoYW0gICAgICAgICAgIC0gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICBvcHRpb25zLmVudW1lcmFibGUgICAgIC0gZXhwb3J0IGFzIGVudW1lcmFibGUgcHJvcGVydHlcbiAgb3B0aW9ucy5kb250Q2FsbEdldFNldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXRcbiAgb3B0aW9ucy5uYW1lICAgICAgICAgICAtIHRoZSAubmFtZSBvZiB0aGUgZnVuY3Rpb24gaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGtleVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIFBST1RPID0gb3B0aW9ucy5wcm90bztcblxuICB2YXIgbmF0aXZlU291cmNlID0gR0xPQkFMID8gZ2xvYmFsVGhpcyA6IFNUQVRJQyA/IGdsb2JhbFRoaXNbVEFSR0VUXSA6IGdsb2JhbFRoaXNbVEFSR0VUXSAmJiBnbG9iYWxUaGlzW1RBUkdFVF0ucHJvdG90eXBlO1xuXG4gIHZhciB0YXJnZXQgPSBHTE9CQUwgPyBwYXRoIDogcGF0aFtUQVJHRVRdIHx8IGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShwYXRoLCBUQVJHRVQsIHt9KVtUQVJHRVRdO1xuICB2YXIgdGFyZ2V0UHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcblxuICB2YXIgRk9SQ0VELCBVU0VfTkFUSVZFLCBWSVJUVUFMX1BST1RPVFlQRTtcbiAgdmFyIGtleSwgc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5LCBuYXRpdmVQcm9wZXJ0eSwgcmVzdWx0UHJvcGVydHksIGRlc2NyaXB0b3I7XG5cbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgRk9SQ0VEID0gaXNGb3JjZWQoR0xPQkFMID8ga2V5IDogVEFSR0VUICsgKFNUQVRJQyA/ICcuJyA6ICcjJykgKyBrZXksIG9wdGlvbnMuZm9yY2VkKTtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBVU0VfTkFUSVZFID0gIUZPUkNFRCAmJiBuYXRpdmVTb3VyY2UgJiYgaGFzT3duKG5hdGl2ZVNvdXJjZSwga2V5KTtcblxuICAgIHRhcmdldFByb3BlcnR5ID0gdGFyZ2V0W2tleV07XG5cbiAgICBpZiAoVVNFX05BVElWRSkgaWYgKG9wdGlvbnMuZG9udENhbGxHZXRTZXQpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobmF0aXZlU291cmNlLCBrZXkpO1xuICAgICAgbmF0aXZlUHJvcGVydHkgPSBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfSBlbHNlIG5hdGl2ZVByb3BlcnR5ID0gbmF0aXZlU291cmNlW2tleV07XG5cbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIGltcGxlbWVudGF0aW9uXG4gICAgc291cmNlUHJvcGVydHkgPSAoVVNFX05BVElWRSAmJiBuYXRpdmVQcm9wZXJ0eSkgPyBuYXRpdmVQcm9wZXJ0eSA6IHNvdXJjZVtrZXldO1xuXG4gICAgaWYgKCFGT1JDRUQgJiYgIVBST1RPICYmIHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSA9PSB0eXBlb2Ygc291cmNlUHJvcGVydHkpIGNvbnRpbnVlO1xuXG4gICAgLy8gYmluZCBtZXRob2RzIHRvIGdsb2JhbCBmb3IgY2FsbGluZyBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgaWYgKG9wdGlvbnMuYmluZCAmJiBVU0VfTkFUSVZFKSByZXN1bHRQcm9wZXJ0eSA9IGJpbmQoc291cmNlUHJvcGVydHksIGdsb2JhbFRoaXMpO1xuICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2VzIGluIHRoaXMgdmVyc2lvblxuICAgIGVsc2UgaWYgKG9wdGlvbnMud3JhcCAmJiBVU0VfTkFUSVZFKSByZXN1bHRQcm9wZXJ0eSA9IHdyYXBDb25zdHJ1Y3Rvcihzb3VyY2VQcm9wZXJ0eSk7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgZWxzZSBpZiAoUFJPVE8gJiYgaXNDYWxsYWJsZShzb3VyY2VQcm9wZXJ0eSkpIHJlc3VsdFByb3BlcnR5ID0gdW5jdXJyeVRoaXMoc291cmNlUHJvcGVydHkpO1xuICAgIC8vIGRlZmF1bHQgY2FzZVxuICAgIGVsc2UgcmVzdWx0UHJvcGVydHkgPSBzb3VyY2VQcm9wZXJ0eTtcblxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8IChzb3VyY2VQcm9wZXJ0eSAmJiBzb3VyY2VQcm9wZXJ0eS5zaGFtKSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShyZXN1bHRQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG5cbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGFyZ2V0LCBrZXksIHJlc3VsdFByb3BlcnR5KTtcblxuICAgIGlmIChQUk9UTykge1xuICAgICAgVklSVFVBTF9QUk9UT1RZUEUgPSBUQVJHRVQgKyAnUHJvdG90eXBlJztcbiAgICAgIGlmICghaGFzT3duKHBhdGgsIFZJUlRVQUxfUFJPVE9UWVBFKSkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkocGF0aCwgVklSVFVBTF9QUk9UT1RZUEUsIHt9KTtcbiAgICAgIH1cbiAgICAgIC8vIGV4cG9ydCB2aXJ0dWFsIHByb3RvdHlwZSBtZXRob2RzXG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkocGF0aFtWSVJUVUFMX1BST1RPVFlQRV0sIGtleSwgc291cmNlUHJvcGVydHkpO1xuICAgICAgLy8gZXhwb3J0IHJlYWwgcHJvdG90eXBlIG1ldGhvZHNcbiAgICAgIGlmIChvcHRpb25zLnJlYWwgJiYgdGFyZ2V0UHJvdG90eXBlICYmIChGT1JDRUQgfHwgIXRhcmdldFByb3RvdHlwZVtrZXldKSkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGFyZ2V0UHJvdG90eXBlLCBrZXksIHNvdXJjZVByb3BlcnR5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUsIGVzL25vLW9iamVjdC1wcmV2ZW50ZXh0ZW5zaW9ucyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBhcHBseSA9IEZ1bmN0aW9uUHJvdG90eXBlLmFwcGx5O1xudmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tcmVmbGVjdCAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBSZWZsZWN0ID09ICdvYmplY3QnICYmIFJlZmxlY3QuYXBwbHkgfHwgKE5BVElWRV9CSU5EID8gY2FsbC5iaW5kKGFwcGx5KSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhbGwuYXBwbHkoYXBwbHksIGFyZ3VtZW50cyk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBOQVRJVkVfQklORCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZScpO1xuXG52YXIgYmluZCA9IHVuY3VycnlUaGlzKHVuY3VycnlUaGlzLmJpbmQpO1xuXG4vLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0KSB7XG4gIGFDYWxsYWJsZShmbik7XG4gIHJldHVybiB0aGF0ID09PSB1bmRlZmluZWQgPyBmbiA6IE5BVElWRV9CSU5EID8gYmluZChmbiwgdGhhdCkgOiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBzYWZlXG4gIHZhciB0ZXN0ID0gKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkuYmluZCgpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuIHR5cGVvZiB0ZXN0ICE9ICdmdW5jdGlvbicgfHwgdGVzdC5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJyk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcbnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpO1xudmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTtcbnZhciBmYWN0b3JpZXMgPSB7fTtcblxudmFyIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIChDLCBhcmdzTGVuZ3RoLCBhcmdzKSB7XG4gIGlmICghaGFzT3duKGZhY3RvcmllcywgYXJnc0xlbmd0aCkpIHtcbiAgICB2YXIgbGlzdCA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKDsgaSA8IGFyZ3NMZW5ndGg7IGkrKykgbGlzdFtpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIGZhY3Rvcmllc1thcmdzTGVuZ3RoXSA9ICRGdW5jdGlvbignQyxhJywgJ3JldHVybiBuZXcgQygnICsgam9pbihsaXN0LCAnLCcpICsgJyknKTtcbiAgfSByZXR1cm4gZmFjdG9yaWVzW2FyZ3NMZW5ndGhdKEMsIGFyZ3MpO1xufTtcblxuLy8gYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBkZXRlY3Rpb25cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX0JJTkQgPyAkRnVuY3Rpb24uYmluZCA6IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgdmFyIEYgPSBhQ2FsbGFibGUodGhpcyk7XG4gIHZhciBQcm90b3R5cGUgPSBGLnByb3RvdHlwZTtcbiAgdmFyIHBhcnRBcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMsIDEpO1xuICB2YXIgYm91bmRGdW5jdGlvbiA9IGZ1bmN0aW9uIGJvdW5kKC8qIGFyZ3MuLi4gKi8pIHtcbiAgICB2YXIgYXJncyA9IGNvbmNhdChwYXJ0QXJncywgYXJyYXlTbGljZShhcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kRnVuY3Rpb24gPyBjb25zdHJ1Y3QoRiwgYXJncy5sZW5ndGgsIGFyZ3MpIDogRi5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfTtcbiAgaWYgKGlzT2JqZWN0KFByb3RvdHlwZSkpIGJvdW5kRnVuY3Rpb24ucHJvdG90eXBlID0gUHJvdG90eXBlO1xuICByZXR1cm4gYm91bmRGdW5jdGlvbjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX0JJTkQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUnKTtcblxudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfQklORCA/IGNhbGwuYmluZChjYWxsKSA6IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhbGwuYXBwbHkoY2FsbCwgYXJndW1lbnRzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0RGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBFWElTVFMgPSBoYXNPd24oRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJyk7XG4vLyBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZnJvbSBtaW5pZmllZCAvIG1hbmdsZWQgLyBkcm9wcGVkIGZ1bmN0aW9uIG5hbWVzXG52YXIgUFJPUEVSID0gRVhJU1RTICYmIChmdW5jdGlvbiBzb21ldGhpbmcoKSB7IC8qIGVtcHR5ICovIH0pLm5hbWUgPT09ICdzb21ldGhpbmcnO1xudmFyIENPTkZJR1VSQUJMRSA9IEVYSVNUUyAmJiAoIURFU0NSSVBUT1JTIHx8IChERVNDUklQVE9SUyAmJiBnZXREZXNjcmlwdG9yKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpLmNvbmZpZ3VyYWJsZSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRVhJU1RTOiBFWElTVFMsXG4gIFBST1BFUjogUFJPUEVSLFxuICBDT05GSUdVUkFCTEU6IENPTkZJR1VSQUJMRVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgbWV0aG9kKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxuICAgIHJldHVybiB1bmN1cnJ5VGhpcyhhQ2FsbGFibGUoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIGtleSlbbWV0aG9kXSkpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNsYXNzb2ZSYXcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4pIHtcbiAgLy8gTmFzaG9ybiBidWc6XG4gIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzExMjhcbiAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTEzMFxuICBpZiAoY2xhc3NvZlJhdyhmbikgPT09ICdGdW5jdGlvbicpIHJldHVybiB1bmN1cnJ5VGhpcyhmbik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIE5BVElWRV9CSU5EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlJyk7XG5cbnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcbnZhciB1bmN1cnJ5VGhpc1dpdGhCaW5kID0gTkFUSVZFX0JJTkQgJiYgRnVuY3Rpb25Qcm90b3R5cGUuYmluZC5iaW5kKGNhbGwsIGNhbGwpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9CSU5EID8gdW5jdXJyeVRoaXNXaXRoQmluZCA6IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjYWxsLmFwcGx5KGZuLCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SLCBNRVRIT0QpIHtcbiAgdmFyIE5hbWVzcGFjZSA9IHBhdGhbQ09OU1RSVUNUT1IgKyAnUHJvdG90eXBlJ107XG4gIHZhciBwdXJlTWV0aG9kID0gTmFtZXNwYWNlICYmIE5hbWVzcGFjZVtNRVRIT0RdO1xuICBpZiAocHVyZU1ldGhvZCkgcmV0dXJuIHB1cmVNZXRob2Q7XG4gIHZhciBOYXRpdmVDb25zdHJ1Y3RvciA9IGdsb2JhbFRoaXNbQ09OU1RSVUNUT1JdO1xuICB2YXIgTmF0aXZlUHJvdG90eXBlID0gTmF0aXZlQ29uc3RydWN0b3IgJiYgTmF0aXZlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICByZXR1cm4gTmF0aXZlUHJvdG90eXBlICYmIE5hdGl2ZVByb3RvdHlwZVtNRVRIT0RdO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhcmlhYmxlKSB7XG4gIHJldHVybiBpc0NhbGxhYmxlKHZhcmlhYmxlKSA/IHZhcmlhYmxlIDogdW5kZWZpbmVkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKHBhdGhbbmFtZXNwYWNlXSkgfHwgYUZ1bmN0aW9uKGdsb2JhbFRoaXNbbmFtZXNwYWNlXSlcbiAgICA6IHBhdGhbbmFtZXNwYWNlXSAmJiBwYXRoW25hbWVzcGFjZV1bbWV0aG9kXSB8fCBnbG9iYWxUaGlzW25hbWVzcGFjZV0gJiYgZ2xvYmFsVGhpc1tuYW1lc3BhY2VdW21ldGhvZF07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gYEdldEl0ZXJhdG9yRGlyZWN0KG9iailgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMvI3NlYy1nZXRpdGVyYXRvcmRpcmVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB7XG4gICAgaXRlcmF0b3I6IG9iaixcbiAgICBuZXh0OiBvYmoubmV4dCxcbiAgICBkb25lOiBmYWxzZVxuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBnZXRNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LW1ldGhvZCcpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNOdWxsT3JVbmRlZmluZWQoaXQpKSByZXR1cm4gZ2V0TWV0aG9kKGl0LCBJVEVSQVRPUilcbiAgICB8fCBnZXRNZXRob2QoaXQsICdAQGl0ZXJhdG9yJylcbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRyeVRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcnKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCwgdXNpbmdJdGVyYXRvcikge1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGdldEl0ZXJhdG9yTWV0aG9kKGFyZ3VtZW50KSA6IHVzaW5nSXRlcmF0b3I7XG4gIGlmIChhQ2FsbGFibGUoaXRlcmF0b3JNZXRob2QpKSByZXR1cm4gYW5PYmplY3QoY2FsbChpdGVyYXRvck1ldGhvZCwgYXJndW1lbnQpKTtcbiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgaXRlcmFibGUnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG5cbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJlcGxhY2VyKSB7XG4gIGlmIChpc0NhbGxhYmxlKHJlcGxhY2VyKSkgcmV0dXJuIHJlcGxhY2VyO1xuICBpZiAoIWlzQXJyYXkocmVwbGFjZXIpKSByZXR1cm47XG4gIHZhciByYXdMZW5ndGggPSByZXBsYWNlci5sZW5ndGg7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3TGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZWxlbWVudCA9IHJlcGxhY2VyW2ldO1xuICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PSAnc3RyaW5nJykgcHVzaChrZXlzLCBlbGVtZW50KTtcbiAgICBlbHNlIGlmICh0eXBlb2YgZWxlbWVudCA9PSAnbnVtYmVyJyB8fCBjbGFzc29mKGVsZW1lbnQpID09PSAnTnVtYmVyJyB8fCBjbGFzc29mKGVsZW1lbnQpID09PSAnU3RyaW5nJykgcHVzaChrZXlzLCB0b1N0cmluZyhlbGVtZW50KSk7XG4gIH1cbiAgdmFyIGtleXNMZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIHJvb3QgPSB0cnVlO1xuICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBpZiAocm9vdCkge1xuICAgICAgcm9vdCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheSh0aGlzKSkgcmV0dXJuIHZhbHVlO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5c0xlbmd0aDsgaisrKSBpZiAoa2V5c1tqXSA9PT0ga2V5KSByZXR1cm4gdmFsdWU7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQnKTtcblxuLy8gYEdldE1ldGhvZGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldG1ldGhvZFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoViwgUCkge1xuICB2YXIgZnVuYyA9IFZbUF07XG4gIHJldHVybiBpc051bGxPclVuZGVmaW5lZChmdW5jKSA/IHVuZGVmaW5lZCA6IGFDYWxsYWJsZShmdW5jKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcbnZhciBnZXRJdGVyYXRvckRpcmVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItZGlyZWN0Jyk7XG5cbnZhciBJTlZBTElEX1NJWkUgPSAnSW52YWxpZCBzaXplJztcbnZhciAkUmFuZ2VFcnJvciA9IFJhbmdlRXJyb3I7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBtYXggPSBNYXRoLm1heDtcblxudmFyIFNldFJlY29yZCA9IGZ1bmN0aW9uIChzZXQsIGludFNpemUpIHtcbiAgdGhpcy5zZXQgPSBzZXQ7XG4gIHRoaXMuc2l6ZSA9IG1heChpbnRTaXplLCAwKTtcbiAgdGhpcy5oYXMgPSBhQ2FsbGFibGUoc2V0Lmhhcyk7XG4gIHRoaXMua2V5cyA9IGFDYWxsYWJsZShzZXQua2V5cyk7XG59O1xuXG5TZXRSZWNvcmQucHJvdG90eXBlID0ge1xuICBnZXRJdGVyYXRvcjogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRJdGVyYXRvckRpcmVjdChhbk9iamVjdChjYWxsKHRoaXMua2V5cywgdGhpcy5zZXQpKSk7XG4gIH0sXG4gIGluY2x1ZGVzOiBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gY2FsbCh0aGlzLmhhcywgdGhpcy5zZXQsIGl0KTtcbiAgfVxufTtcblxuLy8gYEdldFNldFJlY29yZGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtc2V0LW1ldGhvZHMvI3NlYy1nZXRzZXRyZWNvcmRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICBhbk9iamVjdChvYmopO1xuICB2YXIgbnVtU2l6ZSA9ICtvYmouc2l6ZTtcbiAgLy8gTk9URTogSWYgc2l6ZSBpcyB1bmRlZmluZWQsIHRoZW4gbnVtU2l6ZSB3aWxsIGJlIE5hTlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICBpZiAobnVtU2l6ZSAhPT0gbnVtU2l6ZSkgdGhyb3cgbmV3ICRUeXBlRXJyb3IoSU5WQUxJRF9TSVpFKTtcbiAgdmFyIGludFNpemUgPSB0b0ludGVnZXJPckluZmluaXR5KG51bVNpemUpO1xuICBpZiAoaW50U2l6ZSA8IDApIHRocm93IG5ldyAkUmFuZ2VFcnJvcihJTlZBTElEX1NJWkUpO1xuICByZXR1cm4gbmV3IFNldFJlY29yZChvYmosIGludFNpemUpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1nbG9iYWwtdGhpcyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8XG4gIGNoZWNrKHR5cGVvZiB0aGlzID09ICdvYmplY3QnICYmIHRoaXMpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBmYWxsYmFja1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSB1bmN1cnJ5VGhpcyh7fS5oYXNPd25Qcm9wZXJ0eSk7XG5cbi8vIGBIYXNPd25Qcm9wZXJ0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWhhc293bnByb3BlcnR5XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWhhc293biAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5oYXNPd24gfHwgZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5KHRvT2JqZWN0KGl0KSwga2V5KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlIC0tIHNhZmVcbiAgICBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG4vLyBUaGFua3MgdG8gSUU4IGZvciBpdHMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIURFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9XG4gIH0pLmEgIT09IDc7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG52YXIgc3BsaXQgPSB1bmN1cnJ5VGhpcygnJy5zcGxpdCk7XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuICEkT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7XG59KSA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY2xhc3NvZihpdCkgPT09ICdTdHJpbmcnID8gc3BsaXQoaXQsICcnKSA6ICRPYmplY3QoaXQpO1xufSA6ICRPYmplY3Q7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHN0b3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZScpO1xuXG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IHVuY3VycnlUaGlzKEZ1bmN0aW9uLnRvU3RyaW5nKTtcblxuLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGBjb3JlLWpzQDMuNC4xLTMuNC40YCwgc28gd2UgY2FuJ3QgdXNlIGBzaGFyZWRgIGhlbHBlclxuaWYgKCFpc0NhbGxhYmxlKHN0b3JlLmluc3BlY3RTb3VyY2UpKSB7XG4gIHN0b3JlLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZyhpdCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmUuaW5zcGVjdFNvdXJjZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5Jyk7XG5cbi8vIGBJbnN0YWxsRXJyb3JDYXVzZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtZXJyb3ItY2F1c2UvI3NlYy1lcnJvcm9iamVjdHMtaW5zdGFsbC1lcnJvci1jYXVzZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgb3B0aW9ucykge1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NhdXNlJyBpbiBvcHRpb25zKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sICdjYXVzZScsIG9wdGlvbnMuY2F1c2UpO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbE1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCcpO1xudmFyIGlzRXh0ZW5zaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtZXh0ZW5zaWJsZScpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciBGUkVFWklORyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mcmVlemluZycpO1xuXG52YXIgUkVRVUlSRUQgPSBmYWxzZTtcbnZhciBNRVRBREFUQSA9IHVpZCgnbWV0YScpO1xudmFyIGlkID0gMDtcblxudmFyIHNldE1ldGFkYXRhID0gZnVuY3Rpb24gKGl0KSB7XG4gIGRlZmluZVByb3BlcnR5KGl0LCBNRVRBREFUQSwgeyB2YWx1ZToge1xuICAgIG9iamVjdElEOiAnTycgKyBpZCsrLCAvLyBvYmplY3QgSURcbiAgICB3ZWFrRGF0YToge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG5cbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgLy8gcmV0dXJuIGEgcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhc093bihpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBREFUQV0ub2JqZWN0SUQ7XG59O1xuXG52YXIgZ2V0V2Vha0RhdGEgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICBpZiAoIWhhc093bihpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIHRoZSBzdG9yZSBvZiB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBREFUQV0ud2Vha0RhdGE7XG59O1xuXG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpJTkcgJiYgUkVRVUlSRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzT3duKGl0LCBNRVRBREFUQSkpIHNldE1ldGFkYXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxudmFyIGVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgbWV0YS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG4gIFJFUVVJUkVEID0gdHJ1ZTtcbiAgdmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmY7XG4gIHZhciBzcGxpY2UgPSB1bmN1cnJ5VGhpcyhbXS5zcGxpY2UpO1xuICB2YXIgdGVzdCA9IHt9O1xuICB0ZXN0W01FVEFEQVRBXSA9IDE7XG5cbiAgLy8gcHJldmVudCBleHBvc2luZyBvZiBtZXRhZGF0YSBrZXlcbiAgaWYgKGdldE93blByb3BlcnR5TmFtZXModGVzdCkubGVuZ3RoKSB7XG4gICAgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZXN1bHRbaV0gPT09IE1FVEFEQVRBKSB7XG4gICAgICAgICAgc3BsaWNlKHJlc3VsdCwgaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWxNb2R1bGUuZlxuICAgIH0pO1xuICB9XG59O1xuXG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBlbmFibGU6IGVuYWJsZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2Vha0RhdGE6IGdldFdlYWtEYXRhLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG5cbmhpZGRlbktleXNbTUVUQURBVEFdID0gdHJ1ZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2Vhay1tYXAtYmFzaWMtZGV0ZWN0aW9uJyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEID0gJ09iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkJztcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWxUaGlzLlR5cGVFcnJvcjtcbnZhciBXZWFrTWFwID0gZ2xvYmFsVGhpcy5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQnKTtcbiAgICB9IHJldHVybiBzdGF0ZTtcbiAgfTtcbn07XG5cbmlmIChOQVRJVkVfV0VBS19NQVAgfHwgc2hhcmVkLnN0YXRlKSB7XG4gIHZhciBzdG9yZSA9IHNoYXJlZC5zdGF0ZSB8fCAoc2hhcmVkLnN0YXRlID0gbmV3IFdlYWtNYXAoKSk7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtYXNzaWduIC0tIHByb3RvdHlwZSBtZXRob2RzIHByb3RlY3Rpb24gKi9cbiAgc3RvcmUuZ2V0ID0gc3RvcmUuZ2V0O1xuICBzdG9yZS5oYXMgPSBzdG9yZS5oYXM7XG4gIHN0b3JlLnNldCA9IHN0b3JlLnNldDtcbiAgLyogZXNsaW50LWVuYWJsZSBuby1zZWxmLWFzc2lnbiAtLSBwcm90b3R5cGUgbWV0aG9kcyBwcm90ZWN0aW9uICovXG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAoc3RvcmUuaGFzKGl0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgc3RvcmUuc2V0KGl0LCBtZXRhZGF0YSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9O1xuICBnZXQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gc3RvcmUuZ2V0KGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHN0b3JlLmhhcyhpdCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7XG4gIGhpZGRlbktleXNbU1RBVEVdID0gdHJ1ZTtcbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChoYXNPd24oaXQsIFNUQVRFKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG4vLyBgSXNBcnJheWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZ3VtZW50KSB7XG4gIHJldHVybiBjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ0FycmF5Jztcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90XG52YXIgZG9jdW1lbnRBbGwgPSB0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCcgJiYgZG9jdW1lbnQuYWxsO1xuXG4vLyBgSXNDYWxsYWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXR5cGVvZi11bmRlZmluZWQgLS0gcmVxdWlyZWQgZm9yIHRlc3Rpbmdcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIGRvY3VtZW50QWxsID09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50QWxsICE9PSB1bmRlZmluZWQgPyBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nIHx8IGFyZ3VtZW50ID09PSBkb2N1bWVudEFsbDtcbn0gOiBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGluc3BlY3RTb3VyY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UnKTtcblxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgY29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTtcbnZhciBjb25zdHJ1Y3RvclJlZ0V4cCA9IC9eXFxzKig/OmNsYXNzfGZ1bmN0aW9uKVxcYi87XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGNvbnN0cnVjdG9yUmVnRXhwLmV4ZWMpO1xudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSAhY29uc3RydWN0b3JSZWdFeHAudGVzdChub29wKTtcblxudmFyIGlzQ29uc3RydWN0b3JNb2Rlcm4gPSBmdW5jdGlvbiBpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG4gIGlmICghaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdHJ1Y3Qobm9vcCwgW10sIGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBpc0NvbnN0cnVjdG9yTGVnYWN5ID0gZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHN3aXRjaCAoY2xhc3NvZihhcmd1bWVudCkpIHtcbiAgICBjYXNlICdBc3luY0Z1bmN0aW9uJzpcbiAgICBjYXNlICdHZW5lcmF0b3JGdW5jdGlvbic6XG4gICAgY2FzZSAnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbic6IHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIC8vIHdlIGNhbid0IGNoZWNrIC5wcm90b3R5cGUgc2luY2UgY29uc3RydWN0b3JzIHByb2R1Y2VkIGJ5IC5iaW5kIGhhdmVuJ3QgaXRcbiAgICAvLyBgRnVuY3Rpb24jdG9TdHJpbmdgIHRocm93cyBvbiBzb21lIGJ1aWx0LWl0IGZ1bmN0aW9uIGluIHNvbWUgbGVnYWN5IGVuZ2luZXNcbiAgICAvLyAoZm9yIGV4YW1wbGUsIGBET01RdWFkYCBhbmQgc2ltaWxhciBpbiBGRjQxLSlcbiAgICByZXR1cm4gSU5DT1JSRUNUX1RPX1NUUklORyB8fCAhIWV4ZWMoY29uc3RydWN0b3JSZWdFeHAsIGluc3BlY3RTb3VyY2UoYXJndW1lbnQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuaXNDb25zdHJ1Y3RvckxlZ2FjeS5zaGFtID0gdHJ1ZTtcblxuLy8gYElzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9ICFjb25zdHJ1Y3QgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgY2FsbGVkO1xuICByZXR1cm4gaXNDb25zdHJ1Y3Rvck1vZGVybihpc0NvbnN0cnVjdG9yTW9kZXJuLmNhbGwpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oT2JqZWN0KVxuICAgIHx8ICFpc0NvbnN0cnVjdG9yTW9kZXJuKGZ1bmN0aW9uICgpIHsgY2FsbGVkID0gdHJ1ZTsgfSlcbiAgICB8fCBjYWxsZWQ7XG59KSA/IGlzQ29uc3RydWN0b3JMZWdhY3kgOiBpc0NvbnN0cnVjdG9yTW9kZXJuO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09PSBQT0xZRklMTCA/IHRydWVcbiAgICA6IHZhbHVlID09PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogaXNDYWxsYWJsZShkZXRlY3Rpb24pID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBJc0ludGVncmFsTnVtYmVyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNpbnRlZ3JhbG51bWJlclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW51bWJlci1pc2ludGVnZXIgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyB3ZSBjYW4ndCB1c2UganVzdCBgaXQgPT0gbnVsbGAgc2luY2Ugb2YgYGRvY3VtZW50LmFsbGAgc3BlY2lhbCBjYXNlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90LWFlY1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSBudWxsIHx8IGl0ID09PSB1bmRlZmluZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogaXNDYWxsYWJsZShpdCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gaXNPYmplY3QoYXJndW1lbnQpIHx8IGFyZ3VtZW50ID09PSBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gdHJ1ZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxuLy8gYElzUmVnRXhwYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNyZWdleHBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNsYXNzb2YoaXQpID09PSAnUmVnRXhwJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVTRV9TWU1CT0xfQVNfVUlEID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHZhciAkU3ltYm9sID0gZ2V0QnVpbHRJbignU3ltYm9sJyk7XG4gIHJldHVybiBpc0NhbGxhYmxlKCRTeW1ib2wpICYmIGlzUHJvdG90eXBlT2YoJFN5bWJvbC5wcm90b3R5cGUsICRPYmplY3QoaXQpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJlY29yZCwgZm4sIElURVJBVE9SX0lOU1RFQURfT0ZfUkVDT1JEKSB7XG4gIHZhciBpdGVyYXRvciA9IElURVJBVE9SX0lOU1RFQURfT0ZfUkVDT1JEID8gcmVjb3JkIDogcmVjb3JkLml0ZXJhdG9yO1xuICB2YXIgbmV4dCA9IHJlY29yZC5uZXh0O1xuICB2YXIgc3RlcCwgcmVzdWx0O1xuICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICByZXN1bHQgPSBmbihzdGVwLnZhbHVlKTtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG52YXIgaXNBcnJheUl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgZ2V0SXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yJyk7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIGl0ZXJhdG9yQ2xvc2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbnZhciBSZXN1bHQgPSBmdW5jdGlvbiAoc3RvcHBlZCwgcmVzdWx0KSB7XG4gIHRoaXMuc3RvcHBlZCA9IHN0b3BwZWQ7XG4gIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xufTtcblxudmFyIFJlc3VsdFByb3RvdHlwZSA9IFJlc3VsdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCB1bmJvdW5kRnVuY3Rpb24sIG9wdGlvbnMpIHtcbiAgdmFyIHRoYXQgPSBvcHRpb25zICYmIG9wdGlvbnMudGhhdDtcbiAgdmFyIEFTX0VOVFJJRVMgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuQVNfRU5UUklFUyk7XG4gIHZhciBJU19SRUNPUkQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfUkVDT1JEKTtcbiAgdmFyIElTX0lURVJBVE9SID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklTX0lURVJBVE9SKTtcbiAgdmFyIElOVEVSUlVQVEVEID0gISEob3B0aW9ucyAmJiBvcHRpb25zLklOVEVSUlVQVEVEKTtcbiAgdmFyIGZuID0gYmluZCh1bmJvdW5kRnVuY3Rpb24sIHRoYXQpO1xuICB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBuZXh0LCBzdGVwO1xuXG4gIHZhciBzdG9wID0gZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgIGlmIChpdGVyYXRvcikgaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ25vcm1hbCcsIGNvbmRpdGlvbik7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQodHJ1ZSwgY29uZGl0aW9uKTtcbiAgfTtcblxuICB2YXIgY2FsbEZuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKEFTX0VOVFJJRVMpIHtcbiAgICAgIGFuT2JqZWN0KHZhbHVlKTtcbiAgICAgIHJldHVybiBJTlRFUlJVUFRFRCA/IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSwgc3RvcCkgOiBmbih2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgIH0gcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWUsIHN0b3ApIDogZm4odmFsdWUpO1xuICB9O1xuXG4gIGlmIChJU19SRUNPUkQpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlLml0ZXJhdG9yO1xuICB9IGVsc2UgaWYgKElTX0lURVJBVE9SKSB7XG4gICAgaXRlcmF0b3IgPSBpdGVyYWJsZTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyRm4gPSBnZXRJdGVyYXRvck1ldGhvZChpdGVyYWJsZSk7XG4gICAgaWYgKCFpdGVyRm4pIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGl0ZXJhYmxlKSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG4gICAgLy8gb3B0aW1pc2F0aW9uIGZvciBhcnJheSBpdGVyYXRvcnNcbiAgICBpZiAoaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJGbikpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShpdGVyYWJsZSk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIHJlc3VsdCA9IGNhbGxGbihpdGVyYWJsZVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0ICYmIGlzUHJvdG90eXBlT2YoUmVzdWx0UHJvdG90eXBlLCByZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICAgICAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG4gICAgfVxuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoaXRlcmFibGUsIGl0ZXJGbik7XG4gIH1cblxuICBuZXh0ID0gSVNfUkVDT1JEID8gaXRlcmFibGUubmV4dCA6IGl0ZXJhdG9yLm5leHQ7XG4gIHdoaWxlICghKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBjYWxsRm4oc3RlcC52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ29iamVjdCcgJiYgcmVzdWx0ICYmIGlzUHJvdG90eXBlT2YoUmVzdWx0UHJvdG90eXBlLCByZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICB9IHJldHVybiBuZXcgUmVzdWx0KGZhbHNlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGtpbmQsIHZhbHVlKSB7XG4gIHZhciBpbm5lclJlc3VsdCwgaW5uZXJFcnJvcjtcbiAgYW5PYmplY3QoaXRlcmF0b3IpO1xuICB0cnkge1xuICAgIGlubmVyUmVzdWx0ID0gZ2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG4gICAgaWYgKCFpbm5lclJlc3VsdCkge1xuICAgICAgaWYgKGtpbmQgPT09ICd0aHJvdycpIHRocm93IHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpbm5lclJlc3VsdCA9IGNhbGwoaW5uZXJSZXN1bHQsIGl0ZXJhdG9yKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbm5lckVycm9yID0gdHJ1ZTtcbiAgICBpbm5lclJlc3VsdCA9IGVycm9yO1xuICB9XG4gIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgaWYgKGlubmVyRXJyb3IpIHRocm93IGlubmVyUmVzdWx0O1xuICBhbk9iamVjdChpbm5lclJlc3VsdCk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUnKS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEl0ZXJhdG9yQ29uc3RydWN0b3IsIE5BTUUsIG5leHQsIEVOVU1FUkFCTEVfTkVYVCkge1xuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKCshRU5VTUVSQUJMRV9ORVhULCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JDb25zdHJ1Y3RvciwgVE9fU1RSSU5HX1RBRywgZmFsc2UsIHRydWUpO1xuICBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICByZXR1cm4gSXRlcmF0b3JDb25zdHJ1Y3Rvcjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBGdW5jdGlvbk5hbWUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3RvcicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHknKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBQUk9QRVJfRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5QUk9QRVI7XG52YXIgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuQ09ORklHVVJBQkxFO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gSXRlcmF0b3JzQ29yZS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG52YXIgRU5UUklFUyA9ICdlbnRyaWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYWJsZSwgTkFNRSwgSXRlcmF0b3JDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblxuICB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHtcbiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7XG4gICAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgJiYgS0lORCBpbiBJdGVyYWJsZVByb3RvdHlwZSkgcmV0dXJuIEl0ZXJhYmxlUHJvdG90eXBlW0tJTkRdO1xuXG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzKTsgfTtcbiAgfTtcblxuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IGZhbHNlO1xuICB2YXIgSXRlcmFibGVQcm90b3R5cGUgPSBJdGVyYWJsZS5wcm90b3R5cGU7XG4gIHZhciBuYXRpdmVJdGVyYXRvciA9IEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXVxuICAgIHx8IEl0ZXJhYmxlUHJvdG90eXBlWydAQGl0ZXJhdG9yJ11cbiAgICB8fCBERUZBVUxUICYmIEl0ZXJhYmxlUHJvdG90eXBlW0RFRkFVTFRdO1xuICB2YXIgZGVmYXVsdEl0ZXJhdG9yID0gIUJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgJiYgbmF0aXZlSXRlcmF0b3IgfHwgZ2V0SXRlcmF0aW9uTWV0aG9kKERFRkFVTFQpO1xuICB2YXIgYW55TmF0aXZlSXRlcmF0b3IgPSBOQU1FID09PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yO1xuICB2YXIgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBtZXRob2RzLCBLRVk7XG5cbiAgLy8gZml4IG5hdGl2ZVxuICBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHtcbiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7XG4gICAgaWYgKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0NhbGxhYmxlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0pKSB7XG4gICAgICAgICAgZGVmaW5lQnVpbHRJbihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheS5wcm90b3R5cGUueyB2YWx1ZXMsIEBAaXRlcmF0b3IgfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKFBST1BFUl9GVU5DVElPTl9OQU1FICYmIERFRkFVTFQgPT09IFZBTFVFUyAmJiBuYXRpdmVJdGVyYXRvciAmJiBuYXRpdmVJdGVyYXRvci5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBpZiAoIUlTX1BVUkUgJiYgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYWJsZVByb3RvdHlwZSwgJ25hbWUnLCBWQUxVRVMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlO1xuICAgICAgZGVmYXVsdEl0ZXJhdG9yID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gY2FsbChuYXRpdmVJdGVyYXRvciwgdGhpcyk7IH07XG4gICAgfVxuICB9XG5cbiAgLy8gZXhwb3J0IGFkZGl0aW9uYWwgbWV0aG9kc1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gZGVmYXVsdEl0ZXJhdG9yIDogZ2V0SXRlcmF0aW9uTWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogZ2V0SXRlcmF0aW9uTWV0aG9kKEVOVFJJRVMpXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKEtFWSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfHwgIShLRVkgaW4gSXRlcmFibGVQcm90b3R5cGUpKSB7XG4gICAgICAgIGRlZmluZUJ1aWx0SW4oSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICAvLyBkZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghSVNfUFVSRSB8fCBGT1JDRUQpICYmIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gZGVmYXVsdEl0ZXJhdG9yKSB7XG4gICAgZGVmaW5lQnVpbHRJbihJdGVyYWJsZVByb3RvdHlwZSwgSVRFUkFUT1IsIGRlZmF1bHRJdGVyYXRvciwgeyBuYW1lOiBERUZBVUxUIH0pO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlYCBvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1vYmplY3RcbnZhciBJdGVyYXRvclByb3RvdHlwZSwgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlLCBhcnJheUl0ZXJhdG9yO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1hcnJheS1wcm90b3R5cGUta2V5cyAtLSBzYWZlICovXG5pZiAoW10ua2V5cykge1xuICBhcnJheUl0ZXJhdG9yID0gW10ua2V5cygpO1xuICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgaWYgKCEoJ25leHQnIGluIGFycmF5SXRlcmF0b3IpKSBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gdHJ1ZTtcbiAgZWxzZSB7XG4gICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpO1xuICAgIGlmIChQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpIEl0ZXJhdG9yUHJvdG90eXBlID0gUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG59XG5cbnZhciBORVdfSVRFUkFUT1JfUFJPVE9UWVBFID0gIWlzT2JqZWN0KEl0ZXJhdG9yUHJvdG90eXBlKSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZXN0ID0ge307XG4gIC8vIEZGNDQtIGxlZ2FjeSBpdGVyYXRvcnMgY2FzZVxuICByZXR1cm4gSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdLmNhbGwodGVzdCkgIT09IHRlc3Q7XG59KTtcblxuaWYgKE5FV19JVEVSQVRPUl9QUk9UT1RZUEUpIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5lbHNlIGlmIChJU19QVVJFKSBJdGVyYXRvclByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLUBAaXRlcmF0b3JcbmlmICghaXNDYWxsYWJsZShJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0pKSB7XG4gIGRlZmluZUJ1aWx0SW4oSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSXRlcmF0b3JQcm90b3R5cGU6IEl0ZXJhdG9yUHJvdG90eXBlLFxuICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcblxuLy8gYExlbmd0aE9mQXJyYXlMaWtlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbGVuZ3Rob2ZhcnJheWxpa2Vcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdG9MZW5ndGgob2JqLmxlbmd0aCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgY2FsbGVyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGxlcicpO1xuXG52YXIgTWFwID0gZ2V0QnVpbHRJbignTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNYXA6IE1hcCxcbiAgc2V0OiBjYWxsZXIoJ3NldCcsIDIpLFxuICBnZXQ6IGNhbGxlcignZ2V0JywgMSksXG4gIGhhczogY2FsbGVyKCdoYXMnLCAxKSxcbiAgcmVtb3ZlOiBjYWxsZXIoJ2RlbGV0ZScsIDEpLFxuICBwcm90bzogTWFwLnByb3RvdHlwZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYE1hdGgudHJ1bmNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXRoLnRydW5jXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbWF0aC10cnVuYyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgudHJ1bmMgfHwgZnVuY3Rpb24gdHJ1bmMoeCkge1xuICB2YXIgbiA9ICt4O1xuICByZXR1cm4gKG4gPiAwID8gZmxvb3IgOiBjZWlsKShuKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHNhZmVHZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NhZmUtZ2V0LWJ1aWx0LWluJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBRdWV1ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9xdWV1ZScpO1xudmFyIElTX0lPUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1pb3MnKTtcbnZhciBJU19JT1NfUEVCQkxFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLWlvcy1wZWJibGUnKTtcbnZhciBJU19XRUJPU19XRUJLSVQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtd2Vib3Mtd2Via2l0Jyk7XG52YXIgSVNfTk9ERSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC1pcy1ub2RlJyk7XG5cbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsVGhpcy5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbFRoaXMuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBkb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsVGhpcy5Qcm9taXNlO1xudmFyIG1pY3JvdGFzayA9IHNhZmVHZXRCdWlsdEluKCdxdWV1ZU1pY3JvdGFzaycpO1xudmFyIG5vdGlmeSwgdG9nZ2xlLCBub2RlLCBwcm9taXNlLCB0aGVuO1xuXG4vLyBtb2Rlcm4gZW5naW5lcyBoYXZlIHF1ZXVlTWljcm90YXNrIG1ldGhvZFxuaWYgKCFtaWNyb3Rhc2spIHtcbiAgdmFyIHF1ZXVlID0gbmV3IFF1ZXVlKCk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChJU19OT0RFICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGZuID0gcXVldWUuZ2V0KCkpIHRyeSB7XG4gICAgICBmbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAocXVldWUuaGVhZCkgbm90aWZ5KCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICAvLyBhbHNvIGV4Y2VwdCBXZWJPUyBXZWJraXQgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg5OFxuICBpZiAoIUlTX0lPUyAmJiAhSVNfTk9ERSAmJiAhSVNfV0VCT1NfV0VCS0lUICYmIE11dGF0aW9uT2JzZXJ2ZXIgJiYgZG9jdW1lbnQpIHtcbiAgICB0b2dnbGUgPSB0cnVlO1xuICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmICghSVNfSU9TX1BFQkJMRSAmJiBQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIC8vIHdvcmthcm91bmQgb2YgV2ViS2l0IH4gaU9TIFNhZmFyaSAxMC4xIGJ1Z1xuICAgIHByb21pc2UuY29uc3RydWN0b3IgPSBQcm9taXNlO1xuICAgIHRoZW4gPSBiaW5kKHByb21pc2UudGhlbiwgcHJvbWlzZSk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gTm9kZS5qcyB3aXRob3V0IHByb21pc2VzXG4gIH0gZWxzZSBpZiAoSVNfTk9ERSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ2VcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgLy8gYHdlYnBhY2tgIGRldiBzZXJ2ZXIgYnVnIG9uIElFIGdsb2JhbCBtZXRob2RzIC0gdXNlIGJpbmQoZm4sIGdsb2JhbClcbiAgICBtYWNyb3Rhc2sgPSBiaW5kKG1hY3JvdGFzaywgZ2xvYmFsVGhpcyk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWFjcm90YXNrKGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgbWljcm90YXNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgaWYgKCFxdWV1ZS5oZWFkKSBub3RpZnkoKTtcbiAgICBxdWV1ZS5hZGQoZm4pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pY3JvdGFzaztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUNhbGxhYmxlKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFDYWxsYWJsZShyZWplY3QpO1xufTtcblxuLy8gYE5ld1Byb21pc2VDYXBhYmlsaXR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbmV3cHJvbWlzZWNhcGFiaWxpdHlcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQsICRkZWZhdWx0KSB7XG4gIHJldHVybiBhcmd1bWVudCA9PT0gdW5kZWZpbmVkID8gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyAnJyA6ICRkZWZhdWx0IDogdG9TdHJpbmcoYXJndW1lbnQpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1yZWdleHAnKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc1JlZ0V4cChpdCkpIHtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9uc1wiKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIHRyaW0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0nKS50cmltO1xudmFyIHdoaXRlc3BhY2VzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJyk7XG5cbnZhciAkcGFyc2VJbnQgPSBnbG9iYWxUaGlzLnBhcnNlSW50O1xudmFyIFN5bWJvbCA9IGdsb2JhbFRoaXMuU3ltYm9sO1xudmFyIElURVJBVE9SID0gU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBoZXggPSAvXlsrLV0/MHgvaTtcbnZhciBleGVjID0gdW5jdXJyeVRoaXMoaGV4LmV4ZWMpO1xudmFyIEZPUkNFRCA9ICRwYXJzZUludCh3aGl0ZXNwYWNlcyArICcwOCcpICE9PSA4IHx8ICRwYXJzZUludCh3aGl0ZXNwYWNlcyArICcweDE2JykgIT09IDIyXG4gIC8vIE1TIEVkZ2UgMTgtIGJyb2tlbiB3aXRoIGJveGVkIHN5bWJvbHNcbiAgfHwgKElURVJBVE9SICYmICFmYWlscyhmdW5jdGlvbiAoKSB7ICRwYXJzZUludChPYmplY3QoSVRFUkFUT1IpKTsgfSkpO1xuXG4vLyBgcGFyc2VJbnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wYXJzZWludC1zdHJpbmctcmFkaXhcbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCkge1xuICB2YXIgUyA9IHRyaW0odG9TdHJpbmcoc3RyaW5nKSk7XG4gIHJldHVybiAkcGFyc2VJbnQoUywgKHJhZGl4ID4+PiAwKSB8fCAoZXhlYyhoZXgsIFMpID8gMTYgOiAxMCkpO1xufSA6ICRwYXJzZUludDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgb2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHNhZmVcbnZhciAkYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBzaG91bGQgaGF2ZSBjb3JyZWN0IG9yZGVyIG9mIG9wZXJhdGlvbnMgKEVkZ2UgYnVnKVxuICBpZiAoREVTQ1JJUFRPUlMgJiYgJGFzc2lnbih7IGI6IDEgfSwgJGFzc2lnbihkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICdiJywge1xuICAgICAgICB2YWx1ZTogMyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIHsgYjogMiB9KSkuYiAhPT0gMSkgcmV0dXJuIHRydWU7XG4gIC8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3ltYm9sIC0tIHNhZmVcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgnYXNzaWduIGRldGVjdGlvbicpO1xuICB2YXIgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW3N5bWJvbF0gPSA3O1xuICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtzeW1ib2xdICE9PSA3IHx8IG9iamVjdEtleXMoJGFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9PSBhbHBoYWJldDtcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmY7XG4gIHdoaWxlIChhcmd1bWVudHNMZW5ndGggPiBpbmRleCkge1xuICAgIHZhciBTID0gSW5kZXhlZE9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gY29uY2F0KG9iamVjdEtleXMoUyksIGdldE93blByb3BlcnR5U3ltYm9scyhTKSkgOiBvYmplY3RLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikge1xuICAgICAga2V5ID0ga2V5c1tqKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBjYWxsKHByb3BlcnR5SXNFbnVtZXJhYmxlLCBTLCBrZXkpKSBUW2tleV0gPSBTW2tleV07XG4gICAgfVxuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247XG4iLCIndXNlIHN0cmljdCc7XG4vKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAtLSBvbGQgSUUsIFdTSCAqL1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnRpZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2h0bWwnKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xuXG52YXIgR1QgPSAnPic7XG52YXIgTFQgPSAnPCc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgU0NSSVBUID0gJ3NjcmlwdCc7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBFbXB0eUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuXG52YXIgc2NyaXB0VGFnID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIExUICsgU0NSSVBUICsgR1QgKyBjb250ZW50ICsgTFQgKyAnLycgKyBTQ1JJUFQgKyBHVDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBBY3RpdmVYIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIChhY3RpdmVYRG9jdW1lbnQpIHtcbiAgYWN0aXZlWERvY3VtZW50LndyaXRlKHNjcmlwdFRhZygnJykpO1xuICBhY3RpdmVYRG9jdW1lbnQuY2xvc2UoKTtcbiAgdmFyIHRlbXAgPSBhY3RpdmVYRG9jdW1lbnQucGFyZW50V2luZG93Lk9iamVjdDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtYXNzaWdubWVudCAtLSBhdm9pZCBtZW1vcnkgbGVha1xuICBhY3RpdmVYRG9jdW1lbnQgPSBudWxsO1xuICByZXR1cm4gdGVtcDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgSlMgPSAnamF2YScgKyBTQ1JJUFQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzQ3NVxuICBpZnJhbWUuc3JjID0gU3RyaW5nKEpTKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJ2RvY3VtZW50LkY9T2JqZWN0JykpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICByZXR1cm4gaWZyYW1lRG9jdW1lbnQuRjtcbn07XG5cbi8vIENoZWNrIGZvciBkb2N1bWVudC5kb21haW4gYW5kIGFjdGl2ZSB4IHN1cHBvcnRcbi8vIE5vIG5lZWQgdG8gdXNlIGFjdGl2ZSB4IGFwcHJvYWNoIHdoZW4gZG9jdW1lbnQuZG9tYWluIGlzIG5vdCBzZXRcbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzLzE1MFxuLy8gdmFyaWF0aW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9raXRjYW1icmlkZ2UvZXM1LXNoaW0vY29tbWl0LzRmNzM4YWMwNjYzNDZcbi8vIGF2b2lkIElFIEdDIGJ1Z1xudmFyIGFjdGl2ZVhEb2N1bWVudDtcbnZhciBOdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgYWN0aXZlWERvY3VtZW50ID0gbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGlnbm9yZSAqLyB9XG4gIE51bGxQcm90b09iamVjdCA9IHR5cGVvZiBkb2N1bWVudCAhPSAndW5kZWZpbmVkJ1xuICAgID8gZG9jdW1lbnQuZG9tYWluICYmIGFjdGl2ZVhEb2N1bWVudFxuICAgICAgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCkgLy8gb2xkIElFXG4gICAgICA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpXG4gICAgOiBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCk7IC8vIFdTSFxuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIE51bGxQcm90b09iamVjdCgpO1xufTtcblxuaGlkZGVuS2V5c1tJRV9QUk9UT10gPSB0cnVlO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtY3JlYXRlIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXNNb2R1bGUuZihyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnRpZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydGllcyAtLSBzYWZlXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyAmJiAhVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIHByb3BzID0gdG9JbmRleGVkT2JqZWN0KFByb3BlcnRpZXMpO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKE8sIGtleSA9IGtleXNbaW5kZXgrK10sIHByb3BzW2tleV0pO1xuICByZXR1cm4gTztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciAkZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgRU5VTUVSQUJMRSA9ICdlbnVtZXJhYmxlJztcbnZhciBDT05GSUdVUkFCTEUgPSAnY29uZmlndXJhYmxlJztcbnZhciBXUklUQUJMRSA9ICd3cml0YWJsZSc7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmICh0eXBlb2YgTyA9PT0gJ2Z1bmN0aW9uJyAmJiBQID09PSAncHJvdG90eXBlJyAmJiAndmFsdWUnIGluIEF0dHJpYnV0ZXMgJiYgV1JJVEFCTEUgaW4gQXR0cmlidXRlcyAmJiAhQXR0cmlidXRlc1tXUklUQUJMRV0pIHtcbiAgICB2YXIgY3VycmVudCA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudFtXUklUQUJMRV0pIHtcbiAgICAgIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICAgICAgQXR0cmlidXRlcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBDT05GSUdVUkFCTEUgaW4gQXR0cmlidXRlcyA/IEF0dHJpYnV0ZXNbQ09ORklHVVJBQkxFXSA6IGN1cnJlbnRbQ09ORklHVVJBQkxFXSxcbiAgICAgICAgZW51bWVyYWJsZTogRU5VTUVSQUJMRSBpbiBBdHRyaWJ1dGVzID8gQXR0cmlidXRlc1tFTlVNRVJBQkxFXSA6IGN1cnJlbnRbRU5VTUVSQUJMRV0sXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gIH0gcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbn0gOiAkZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gJGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IG5ldyAkVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByb3BlcnR5LWtleScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JcbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhc093bihPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mLCBPLCBQKSwgT1tQXSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZSAqL1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpLmY7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gYXJyYXlTbGljZSh3aW5kb3dOYW1lcyk7XG4gIH1cbn07XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiBjbGFzc29mKGl0KSA9PT0gJ1dpbmRvdydcbiAgICA/IGdldFdpbmRvd05hbWVzKGl0KVxuICAgIDogJGdldE93blByb3BlcnR5TmFtZXModG9JbmRleGVkT2JqZWN0KGl0KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2VudW0tYnVnLWtleXMnKTtcblxudmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHluYW1lcyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5c3ltYm9scyAtLSBzYWZlXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlcicpO1xuXG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG52YXIgJE9iamVjdCA9IE9iamVjdDtcbnZhciBPYmplY3RQcm90b3R5cGUgPSAkT2JqZWN0LnByb3RvdHlwZTtcblxuLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRwcm90b3R5cGVvZlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/ICRPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykge1xuICB2YXIgb2JqZWN0ID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXNPd24ob2JqZWN0LCBJRV9QUk9UTykpIHJldHVybiBvYmplY3RbSUVfUFJPVE9dO1xuICB2YXIgY29uc3RydWN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gIGlmIChpc0NhbGxhYmxlKGNvbnN0cnVjdG9yKSAmJiBvYmplY3QgaW5zdGFuY2VvZiBjb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mICRPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBBUlJBWV9CVUZGRVJfTk9OX0VYVEVOU0lCTEUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLW5vbi1leHRlbnNpYmxlJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNleHRlbnNpYmxlIC0tIHNhZmVcbnZhciAkaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyAkaXNFeHRlbnNpYmxlKDEpOyB9KTtcblxuLy8gYE9iamVjdC5pc0V4dGVuc2libGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuaXNleHRlbnNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IChGQUlMU19PTl9QUklNSVRJVkVTIHx8IEFSUkFZX0JVRkZFUl9OT05fRVhURU5TSUJMRSkgPyBmdW5jdGlvbiBpc0V4dGVuc2libGUoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFSUkFZX0JVRkZFUl9OT05fRVhURU5TSUJMRSAmJiBjbGFzc29mKGl0KSA9PT0gJ0FycmF5QnVmZmVyJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gJGlzRXh0ZW5zaWJsZSA/ICRpc0V4dGVuc2libGUoaXQpIDogdHJ1ZTtcbn0gOiAkaXNFeHRlbnNpYmxlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzKHt9LmlzUHJvdG90eXBlT2YpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgaW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluZGV4T2Y7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzT3duKGhpZGRlbktleXMsIGtleSkgJiYgaGFzT3duKE8sIGtleSkgJiYgcHVzaChyZXN1bHQsIGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXNPd24oTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+aW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcHVzaChyZXN1bHQsIGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG4vLyBgT2JqZWN0LmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Qua2V5c1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1rZXlzIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhJHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUucHJvcGVydHlpc2VudW1lcmFibGVcbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gLS0gc2FmZSAqL1xudmFyIHVuY3VycnlUaGlzQWNjZXNzb3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWFjY2Vzc29yJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBhUG9zc2libGVQcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUnKTtcblxuLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5zZXRwcm90b3R5cGVvZlxuLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LXNldHByb3RvdHlwZW9mIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7XG4gIHZhciB0ZXN0ID0ge307XG4gIHZhciBzZXR0ZXI7XG4gIHRyeSB7XG4gICAgc2V0dGVyID0gdW5jdXJyeVRoaXNBY2Nlc3NvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJywgJ3NldCcpO1xuICAgIHNldHRlcih0ZXN0LCBbXSk7XG4gICAgQ09SUkVDVF9TRVRURVIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgcmVxdWlyZU9iamVjdENvZXJjaWJsZShPKTtcbiAgICBhUG9zc2libGVQcm90b3R5cGUocHJvdG8pO1xuICAgIGlmICghaXNPYmplY3QoTykpIHJldHVybiBPO1xuICAgIGlmIChDT1JSRUNUX1NFVFRFUikgc2V0dGVyKE8sIHByb3RvKTtcbiAgICBlbHNlIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIE87XG4gIH07XG59KCkgOiB1bmRlZmluZWQpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBvYmplY3RHZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKS5mO1xuXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSB1bmN1cnJ5VGhpcygkcHJvcGVydHlJc0VudW1lcmFibGUpO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxuLy8gaW4gc29tZSBJRSB2ZXJzaW9ucywgYHByb3BlcnR5SXNFbnVtZXJhYmxlYCByZXR1cm5zIGluY29ycmVjdCByZXN1bHQgb24gaW50ZWdlciBrZXlzXG4vLyBvZiBgbnVsbGAgcHJvdG90eXBlIG9iamVjdHNcbnZhciBJRV9CVUcgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtY3JlYXRlIC0tIHNhZmVcbiAgdmFyIE8gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBPWzJdID0gMjtcbiAgcmV0dXJuICFwcm9wZXJ0eUlzRW51bWVyYWJsZShPLCAyKTtcbn0pO1xuXG4vLyBgT2JqZWN0LnsgZW50cmllcywgdmFsdWVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVE9fRU5UUklFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gb2JqZWN0S2V5cyhPKTtcbiAgICB2YXIgSUVfV09SS0FST1VORCA9IElFX0JVRyAmJiBvYmplY3RHZXRQcm90b3R5cGVPZihPKSA9PT0gbnVsbDtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSB7XG4gICAgICBrZXkgPSBrZXlzW2krK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IChJRV9XT1JLQVJPVU5EID8ga2V5IGluIE8gOiBwcm9wZXJ0eUlzRW51bWVyYWJsZShPLCBrZXkpKSkge1xuICAgICAgICBwdXNoKHJlc3VsdCwgVE9fRU5UUklFUyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBPYmplY3QuZW50cmllc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmVudHJpZXNcbiAgZW50cmllczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgT2JqZWN0LnZhbHVlc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnZhbHVlc1xuICB2YWx1ZXM6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVE9fU1RSSU5HX1RBR19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8ge30udG9TdHJpbmcgOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgT3JkaW5hcnlUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0LCBwcmVmKSB7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAocHJlZiA9PT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKGlzQ2FsbGFibGUoZm4gPSBpbnB1dC52YWx1ZU9mKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHByZWYgIT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IG5ldyAkVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChrZXlzLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgdmFsdWU6IGVycm9yIH07XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvcicpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciBpbnNwZWN0U291cmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgRU5WSVJPTk1FTlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBWOF9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXY4LXZlcnNpb24nKTtcblxudmFyIE5hdGl2ZVByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgJiYgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgU1VCQ0xBU1NJTkcgPSBmYWxzZTtcbnZhciBOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQgPSBpc0NhbGxhYmxlKGdsb2JhbFRoaXMuUHJvbWlzZVJlamVjdGlvbkV2ZW50KTtcblxudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gaXNGb3JjZWQoJ1Byb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSA9IGluc3BlY3RTb3VyY2UoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgdmFyIEdMT0JBTF9DT1JFX0pTX1BST01JU0UgPSBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSAhPT0gU3RyaW5nKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIC8vIFY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gIGlmICghR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiBWOF9WRVJTSU9OID09PSA2NikgcmV0dXJuIHRydWU7XG4gIC8vIFdlIG5lZWQgUHJvbWlzZSN7IGNhdGNoLCBmaW5hbGx5IH0gaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICEoTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnY2F0Y2gnXSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10pKSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbiAgaWYgKCFWOF9WRVJTSU9OIHx8IFY4X1ZFUlNJT04gPCA1MSB8fCAhL25hdGl2ZSBjb2RlLy50ZXN0KFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFKSkge1xuICAgIC8vIERldGVjdCBjb3JyZWN0bmVzcyBvZiBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSBuZXcgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUoMSk7IH0pO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgICB9O1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb21pc2UuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlO1xuICAgIFNVQkNMQVNTSU5HID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgICBpZiAoIVNVQkNMQVNTSU5HKSByZXR1cm4gdHJ1ZTtcbiAgLy8gVW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICB9IHJldHVybiAhR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiAoRU5WSVJPTk1FTlQgPT09ICdCUk9XU0VSJyB8fCBFTlZJUk9OTUVOVCA9PT0gJ0RFTk8nKSAmJiAhTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDT05TVFJVQ1RPUjogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IsXG4gIFJFSkVDVElPTl9FVkVOVDogTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5ULFxuICBTVUJDTEFTU0lORzogU1VCQ0xBU1NJTkdcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbFRoaXMuUHJvbWlzZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yJyk7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbicpO1xudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uJykuQ09OU1RSVUNUT1I7XG5cbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSkudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5oZWFkID0gbnVsbDtcbiAgdGhpcy50YWlsID0gbnVsbDtcbn07XG5cblF1ZXVlLnByb3RvdHlwZSA9IHtcbiAgYWRkOiBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZhciBlbnRyeSA9IHsgaXRlbTogaXRlbSwgbmV4dDogbnVsbCB9O1xuICAgIHZhciB0YWlsID0gdGhpcy50YWlsO1xuICAgIGlmICh0YWlsKSB0YWlsLm5leHQgPSBlbnRyeTtcbiAgICBlbHNlIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgIHRoaXMudGFpbCA9IGVudHJ5O1xuICB9LFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZW50cnkgPSB0aGlzLmhlYWQ7XG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICB2YXIgbmV4dCA9IHRoaXMuaGVhZCA9IGVudHJ5Lm5leHQ7XG4gICAgICBpZiAobmV4dCA9PT0gbnVsbCkgdGhpcy50YWlsID0gbnVsbDtcbiAgICAgIHJldHVybiBlbnRyeS5pdGVtO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBRdWV1ZTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYFJlcXVpcmVPYmplY3RDb2VyY2libGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoaXQpKSB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gQXZvaWQgTm9kZUpTIGV4cGVyaW1lbnRhbCB3YXJuaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghREVTQ1JJUFRPUlMpIHJldHVybiBnbG9iYWxUaGlzW25hbWVdO1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWxUaGlzLCBuYW1lKTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIGFwcGx5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5Jyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIEVOVklST05NRU5UID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50Jyk7XG52YXIgVVNFUl9BR0VOVCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC11c2VyLWFnZW50Jyk7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGgnKTtcblxudmFyIEZ1bmN0aW9uID0gZ2xvYmFsVGhpcy5GdW5jdGlvbjtcbi8vIGRpcnR5IElFOS0gYW5kIEJ1biAwLjMuMC0gY2hlY2tzXG52YXIgV1JBUCA9IC9NU0lFIC5cXC4vLnRlc3QoVVNFUl9BR0VOVCkgfHwgRU5WSVJPTk1FTlQgPT09ICdCVU4nICYmIChmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZXJzaW9uID0gZ2xvYmFsVGhpcy5CdW4udmVyc2lvbi5zcGxpdCgnLicpO1xuICByZXR1cm4gdmVyc2lvbi5sZW5ndGggPCAzIHx8IHZlcnNpb25bMF0gPT09ICcwJyAmJiAodmVyc2lvblsxXSA8IDMgfHwgdmVyc2lvblsxXSA9PT0gJzMnICYmIHZlcnNpb25bMl0gPT09ICcwJyk7XG59KSgpO1xuXG4vLyBJRTktIC8gQnVuIDAuMy4wLSBzZXRUaW1lb3V0IC8gc2V0SW50ZXJ2YWwgLyBzZXRJbW1lZGlhdGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZpeFxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGltZXJzLWFuZC11c2VyLXByb21wdHMuaHRtbCN0aW1lcnNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9pc3N1ZXMvMTYzM1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2NoZWR1bGVyLCBoYXNUaW1lQXJnKSB7XG4gIHZhciBmaXJzdFBhcmFtSW5kZXggPSBoYXNUaW1lQXJnID8gMiA6IDE7XG4gIHJldHVybiBXUkFQID8gZnVuY3Rpb24gKGhhbmRsZXIsIHRpbWVvdXQgLyogLCAuLi5hcmd1bWVudHMgKi8pIHtcbiAgICB2YXIgYm91bmRBcmdzID0gdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSkgPiBmaXJzdFBhcmFtSW5kZXg7XG4gICAgdmFyIGZuID0gaXNDYWxsYWJsZShoYW5kbGVyKSA/IGhhbmRsZXIgOiBGdW5jdGlvbihoYW5kbGVyKTtcbiAgICB2YXIgcGFyYW1zID0gYm91bmRBcmdzID8gYXJyYXlTbGljZShhcmd1bWVudHMsIGZpcnN0UGFyYW1JbmRleCkgOiBbXTtcbiAgICB2YXIgY2FsbGJhY2sgPSBib3VuZEFyZ3MgPyBmdW5jdGlvbiAoKSB7XG4gICAgICBhcHBseShmbiwgdGhpcywgcGFyYW1zKTtcbiAgICB9IDogZm47XG4gICAgcmV0dXJuIGhhc1RpbWVBcmcgPyBzY2hlZHVsZXIoY2FsbGJhY2ssIHRpbWVvdXQpIDogc2NoZWR1bGVyKGNhbGxiYWNrKTtcbiAgfSA6IHNjaGVkdWxlcjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgU2V0SGVscGVycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaGVscGVycycpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWl0ZXJhdGUnKTtcblxudmFyIFNldCA9IFNldEhlbHBlcnMuU2V0O1xudmFyIGFkZCA9IFNldEhlbHBlcnMuYWRkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBTZXQoKTtcbiAgaXRlcmF0ZShzZXQsIGZ1bmN0aW9uIChpdCkge1xuICAgIGFkZChyZXN1bHQsIGl0KTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1zZXQnKTtcbnZhciBTZXRIZWxwZXJzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzJyk7XG52YXIgY2xvbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWNsb25lJyk7XG52YXIgc2l6ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc2l6ZScpO1xudmFyIGdldFNldFJlY29yZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc2V0LXJlY29yZCcpO1xudmFyIGl0ZXJhdGVTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWl0ZXJhdGUnKTtcbnZhciBpdGVyYXRlU2ltcGxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlJyk7XG5cbnZhciBoYXMgPSBTZXRIZWxwZXJzLmhhcztcbnZhciByZW1vdmUgPSBTZXRIZWxwZXJzLnJlbW92ZTtcblxuLy8gYFNldC5wcm90b3R5cGUuZGlmZmVyZW5jZWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkaWZmZXJlbmNlKG90aGVyKSB7XG4gIHZhciBPID0gYVNldCh0aGlzKTtcbiAgdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTtcbiAgdmFyIHJlc3VsdCA9IGNsb25lKE8pO1xuICBpZiAoc2l6ZShPKSA8PSBvdGhlclJlYy5zaXplKSBpdGVyYXRlU2V0KE8sIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKG90aGVyUmVjLmluY2x1ZGVzKGUpKSByZW1vdmUocmVzdWx0LCBlKTtcbiAgfSk7XG4gIGVsc2UgaXRlcmF0ZVNpbXBsZShvdGhlclJlYy5nZXRJdGVyYXRvcigpLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChoYXMoTywgZSkpIHJlbW92ZShyZXN1bHQsIGUpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBjYWxsZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2FsbGVyJyk7XG5cbnZhciBTZXQgPSBnZXRCdWlsdEluKCdTZXQnKTtcbnZhciBTZXRQcm90b3R5cGUgPSBTZXQucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgU2V0OiBTZXQsXG4gIGFkZDogY2FsbGVyKCdhZGQnLCAxKSxcbiAgaGFzOiBjYWxsZXIoJ2hhcycsIDEpLFxuICByZW1vdmU6IGNhbGxlcignZGVsZXRlJywgMSksXG4gIHByb3RvOiBTZXRQcm90b3R5cGVcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYVNldCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXNldCcpO1xudmFyIFNldEhlbHBlcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWhlbHBlcnMnKTtcbnZhciBzaXplID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zaXplJyk7XG52YXIgZ2V0U2V0UmVjb3JkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1zZXQtcmVjb3JkJyk7XG52YXIgaXRlcmF0ZVNldCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaXRlcmF0ZScpO1xudmFyIGl0ZXJhdGVTaW1wbGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZS1zaW1wbGUnKTtcblxudmFyIFNldCA9IFNldEhlbHBlcnMuU2V0O1xudmFyIGFkZCA9IFNldEhlbHBlcnMuYWRkO1xudmFyIGhhcyA9IFNldEhlbHBlcnMuaGFzO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pbnRlcnNlY3Rpb25gIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW50ZXJzZWN0aW9uKG90aGVyKSB7XG4gIHZhciBPID0gYVNldCh0aGlzKTtcbiAgdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTtcbiAgdmFyIHJlc3VsdCA9IG5ldyBTZXQoKTtcblxuICBpZiAoc2l6ZShPKSA+IG90aGVyUmVjLnNpemUpIHtcbiAgICBpdGVyYXRlU2ltcGxlKG90aGVyUmVjLmdldEl0ZXJhdG9yKCksIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoaGFzKE8sIGUpKSBhZGQocmVzdWx0LCBlKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyYXRlU2V0KE8sIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAob3RoZXJSZWMuaW5jbHVkZXMoZSkpIGFkZChyZXN1bHQsIGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYVNldCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXNldCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaGVscGVycycpLmhhcztcbnZhciBzaXplID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zaXplJyk7XG52YXIgZ2V0U2V0UmVjb3JkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1zZXQtcmVjb3JkJyk7XG52YXIgaXRlcmF0ZVNldCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaXRlcmF0ZScpO1xudmFyIGl0ZXJhdGVTaW1wbGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZS1zaW1wbGUnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmlzRGlzam9pbnRGcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0LW1ldGhvZHMvI1NldC5wcm90b3R5cGUuaXNEaXNqb2ludEZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNEaXNqb2ludEZyb20ob3RoZXIpIHtcbiAgdmFyIE8gPSBhU2V0KHRoaXMpO1xuICB2YXIgb3RoZXJSZWMgPSBnZXRTZXRSZWNvcmQob3RoZXIpO1xuICBpZiAoc2l6ZShPKSA8PSBvdGhlclJlYy5zaXplKSByZXR1cm4gaXRlcmF0ZVNldChPLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChvdGhlclJlYy5pbmNsdWRlcyhlKSkgcmV0dXJuIGZhbHNlO1xuICB9LCB0cnVlKSAhPT0gZmFsc2U7XG4gIHZhciBpdGVyYXRvciA9IG90aGVyUmVjLmdldEl0ZXJhdG9yKCk7XG4gIHJldHVybiBpdGVyYXRlU2ltcGxlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChoYXMoTywgZSkpIHJldHVybiBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgZmFsc2UpO1xuICB9KSAhPT0gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1zZXQnKTtcbnZhciBzaXplID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zaXplJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaXRlcmF0ZScpO1xudmFyIGdldFNldFJlY29yZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc2V0LXJlY29yZCcpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pc1N1YnNldE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0LW1ldGhvZHMvI1NldC5wcm90b3R5cGUuaXNTdWJzZXRPZlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N1YnNldE9mKG90aGVyKSB7XG4gIHZhciBPID0gYVNldCh0aGlzKTtcbiAgdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTtcbiAgaWYgKHNpemUoTykgPiBvdGhlclJlYy5zaXplKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBpdGVyYXRlKE8sIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKCFvdGhlclJlYy5pbmNsdWRlcyhlKSkgcmV0dXJuIGZhbHNlO1xuICB9LCB0cnVlKSAhPT0gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1zZXQnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWhlbHBlcnMnKS5oYXM7XG52YXIgc2l6ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc2l6ZScpO1xudmFyIGdldFNldFJlY29yZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtc2V0LXJlY29yZCcpO1xudmFyIGl0ZXJhdGVTaW1wbGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZS1zaW1wbGUnKTtcbnZhciBpdGVyYXRvckNsb3NlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmlzU3VwZXJzZXRPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldC1tZXRob2RzLyNTZXQucHJvdG90eXBlLmlzU3VwZXJzZXRPZlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N1cGVyc2V0T2Yob3RoZXIpIHtcbiAgdmFyIE8gPSBhU2V0KHRoaXMpO1xuICB2YXIgb3RoZXJSZWMgPSBnZXRTZXRSZWNvcmQob3RoZXIpO1xuICBpZiAoc2l6ZShPKSA8IG90aGVyUmVjLnNpemUpIHJldHVybiBmYWxzZTtcbiAgdmFyIGl0ZXJhdG9yID0gb3RoZXJSZWMuZ2V0SXRlcmF0b3IoKTtcbiAgcmV0dXJuIGl0ZXJhdGVTaW1wbGUoaXRlcmF0b3IsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKCFoYXMoTywgZSkpIHJldHVybiBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgZmFsc2UpO1xuICB9KSAhPT0gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGl0ZXJhdGVTaW1wbGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZS1zaW1wbGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0LCBmbiwgaW50ZXJydXB0aWJsZSkge1xuICByZXR1cm4gaW50ZXJydXB0aWJsZSA/IGl0ZXJhdGVTaW1wbGUoc2V0LmtleXMoKSwgZm4sIHRydWUpIDogc2V0LmZvckVhY2goZm4pO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0KSB7XG4gIHJldHVybiBzZXQuc2l6ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSkge1xuICB2YXIgQ29uc3RydWN0b3IgPSBnZXRCdWlsdEluKENPTlNUUlVDVE9SX05BTUUpO1xuXG4gIGlmIChERVNDUklQVE9SUyAmJiBDb25zdHJ1Y3RvciAmJiAhQ29uc3RydWN0b3JbU1BFQ0lFU10pIHtcbiAgICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoQ29uc3RydWN0b3IsIFNQRUNJRVMsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICAgIH0pO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFTZXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1zZXQnKTtcbnZhciBTZXRIZWxwZXJzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzJyk7XG52YXIgY2xvbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWNsb25lJyk7XG52YXIgZ2V0U2V0UmVjb3JkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1zZXQtcmVjb3JkJyk7XG52YXIgaXRlcmF0ZVNpbXBsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlLXNpbXBsZScpO1xuXG52YXIgYWRkID0gU2V0SGVscGVycy5hZGQ7XG52YXIgaGFzID0gU2V0SGVscGVycy5oYXM7XG52YXIgcmVtb3ZlID0gU2V0SGVscGVycy5yZW1vdmU7XG5cbi8vIGBTZXQucHJvdG90eXBlLnN5bW1ldHJpY0RpZmZlcmVuY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3ltbWV0cmljRGlmZmVyZW5jZShvdGhlcikge1xuICB2YXIgTyA9IGFTZXQodGhpcyk7XG4gIHZhciBrZXlzSXRlciA9IGdldFNldFJlY29yZChvdGhlcikuZ2V0SXRlcmF0b3IoKTtcbiAgdmFyIHJlc3VsdCA9IGNsb25lKE8pO1xuICBpdGVyYXRlU2ltcGxlKGtleXNJdGVyLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChoYXMoTywgZSkpIHJlbW92ZShyZXN1bHQsIGUpO1xuICAgIGVsc2UgYWRkKHJlc3VsdCwgZSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0Jyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLXN0cmluZycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDLCBTRVRfTUVUSE9EKSB7XG4gIHZhciB0YXJnZXQgPSBTVEFUSUMgPyBpdCA6IGl0ICYmIGl0LnByb3RvdHlwZTtcbiAgaWYgKHRhcmdldCkge1xuICAgIGlmICghaGFzT3duKHRhcmdldCwgVE9fU1RSSU5HX1RBRykpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gICAgfVxuICAgIGlmIChTRVRfTUVUSE9EICYmICFUT19TVFJJTkdfVEFHX1NVUFBPUlQpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0YXJnZXQsICd0b1N0cmluZycsIHRvU3RyaW5nKTtcbiAgICB9XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYVNldCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLXNldCcpO1xudmFyIGFkZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaGVscGVycycpLmFkZDtcbnZhciBjbG9uZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtY2xvbmUnKTtcbnZhciBnZXRTZXRSZWNvcmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LXNldC1yZWNvcmQnKTtcbnZhciBpdGVyYXRlU2ltcGxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUtc2ltcGxlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLnVuaW9uYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHVuaW9uKG90aGVyKSB7XG4gIHZhciBPID0gYVNldCh0aGlzKTtcbiAgdmFyIGtleXNJdGVyID0gZ2V0U2V0UmVjb3JkKG90aGVyKS5nZXRJdGVyYXRvcigpO1xuICB2YXIgcmVzdWx0ID0gY2xvbmUoTyk7XG4gIGl0ZXJhdGVTaW1wbGUoa2V5c0l0ZXIsIGZ1bmN0aW9uIChpdCkge1xuICAgIGFkZChyZXN1bHQsIGl0KTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG5cbnZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5Jyk7XG5cbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsVGhpc1tTSEFSRURdIHx8IGRlZmluZUdsb2JhbFByb3BlcnR5KFNIQVJFRCwge30pO1xuXG4oc3RvcmUudmVyc2lvbnMgfHwgKHN0b3JlLnZlcnNpb25zID0gW10pKS5wdXNoKHtcbiAgdmVyc2lvbjogJzMuMzguMCcsXG4gIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxNC0yMDI0IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJyxcbiAgbGljZW5zZTogJ2h0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2Jsb2IvdjMuMzguMC9MSUNFTlNFJyxcbiAgc291cmNlOiAnaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMnXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlIHx8IHt9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgYUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY29uc3RydWN0b3InKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG4vLyBgU3BlY2llc0NvbnN0cnVjdG9yYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgaXNOdWxsT3JVbmRlZmluZWQoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA/IGRlZmF1bHRDb25zdHJ1Y3RvciA6IGFDb25zdHJ1Y3RvcihTKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgY2hhckNvZGVBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJDb2RlQXQpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIHBvcykge1xuICAgIHZhciBTID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlck9ySW5maW5pdHkocG9zKTtcbiAgICB2YXIgc2l6ZSA9IFMubGVuZ3RoO1xuICAgIHZhciBmaXJzdCwgc2Vjb25kO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgZmlyc3QgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uKTtcbiAgICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplXG4gICAgICB8fCAoc2Vjb25kID0gY2hhckNvZGVBdChTLCBwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkZcbiAgICAgICAgPyBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gY2hhckF0KFMsIHBvc2l0aW9uKVxuICAgICAgICAgIDogZmlyc3RcbiAgICAgICAgOiBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gc3RyaW5nU2xpY2UoUywgcG9zaXRpb24sIHBvc2l0aW9uICsgMilcbiAgICAgICAgICA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyICRyZXBlYXQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbnZhciByZXBlYXQgPSB1bmN1cnJ5VGhpcygkcmVwZWF0KTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHBhZFN0YXJ0LCBwYWRFbmQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChJU19FTkQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nKSB7XG4gICAgdmFyIFMgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgdmFyIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7XG4gICAgdmFyIHN0cmluZ0xlbmd0aCA9IFMubGVuZ3RoO1xuICAgIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogdG9TdHJpbmcoZmlsbFN0cmluZyk7XG4gICAgdmFyIGZpbGxMZW4sIHN0cmluZ0ZpbGxlcjtcbiAgICBpZiAoaW50TWF4TGVuZ3RoIDw9IHN0cmluZ0xlbmd0aCB8fCBmaWxsU3RyID09PSAnJykgcmV0dXJuIFM7XG4gICAgZmlsbExlbiA9IGludE1heExlbmd0aCAtIHN0cmluZ0xlbmd0aDtcbiAgICBzdHJpbmdGaWxsZXIgPSByZXBlYXQoZmlsbFN0ciwgY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTtcbiAgICBpZiAoc3RyaW5nRmlsbGVyLmxlbmd0aCA+IGZpbGxMZW4pIHN0cmluZ0ZpbGxlciA9IHN0cmluZ1NsaWNlKHN0cmluZ0ZpbGxlciwgMCwgZmlsbExlbik7XG4gICAgcmV0dXJuIElTX0VORCA/IFMgKyBzdHJpbmdGaWxsZXIgOiBzdHJpbmdGaWxsZXIgKyBTO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnBhZFN0YXJ0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnBhZHN0YXJ0XG4gIHN0YXJ0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5wYWRFbmRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucGFkZW5kXG4gIGVuZDogY3JlYXRlTWV0aG9kKHRydWUpXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbnZhciAkUmFuZ2VFcnJvciA9IFJhbmdlRXJyb3I7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGVhdGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwZWF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgdmFyIG4gPSB0b0ludGVnZXJPckluZmluaXR5KGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT09IEluZmluaXR5KSB0aHJvdyBuZXcgJFJhbmdlRXJyb3IoJ1dyb25nIG51bWJlciBvZiByZXBldGl0aW9ucycpO1xuICBmb3IgKDtuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpIGlmIChuICYgMSkgcmVzdWx0ICs9IHN0cjtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciB3aGl0ZXNwYWNlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93aGl0ZXNwYWNlcycpO1xuXG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIGx0cmltID0gUmVnRXhwKCdeWycgKyB3aGl0ZXNwYWNlcyArICddKycpO1xudmFyIHJ0cmltID0gUmVnRXhwKCcoXnxbXicgKyB3aGl0ZXNwYWNlcyArICddKVsnICsgd2hpdGVzcGFjZXMgKyAnXSskJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbSwgdHJpbVN0YXJ0LCB0cmltRW5kLCB0cmltTGVmdCwgdHJpbVJpZ2h0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzKSB7XG4gICAgdmFyIHN0cmluZyA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoJHRoaXMpKTtcbiAgICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHJlcGxhY2Uoc3RyaW5nLCBsdHJpbSwgJycpO1xuICAgIGlmIChUWVBFICYgMikgc3RyaW5nID0gcmVwbGFjZShzdHJpbmcsIHJ0cmltLCAnJDEnKTtcbiAgICByZXR1cm4gc3RyaW5nO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbUxlZnQsIHRyaW1TdGFydCB9YCBtZXRob2RzXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltc3RhcnRcbiAgc3RhcnQ6IGNyZWF0ZU1ldGhvZCgxKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUueyB0cmltUmlnaHQsIHRyaW1FbmQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbWVuZFxuICBlbmQ6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUudHJpbWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltXG4gIHRyaW06IGNyZWF0ZU1ldGhvZCgzKVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLXN5bWJvbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xudmFyIFY4X1ZFUlNJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtdjgtdmVyc2lvbicpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xuXG52YXIgJFN0cmluZyA9IGdsb2JhbFRoaXMuU3RyaW5nO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5c3ltYm9scyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgnc3ltYm9sIGRldGVjdGlvbicpO1xuICAvLyBDaHJvbWUgMzggU3ltYm9sIGhhcyBpbmNvcnJlY3QgdG9TdHJpbmcgY29udmVyc2lvblxuICAvLyBgZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzYCBwb2x5ZmlsbCBzeW1ib2xzIGNvbnZlcnRlZCB0byBvYmplY3QgYXJlIG5vdCBTeW1ib2wgaW5zdGFuY2VzXG4gIC8vIG5iOiBEbyBub3QgY2FsbCBgU3RyaW5nYCBkaXJlY3RseSB0byBhdm9pZCB0aGlzIGJlaW5nIG9wdGltaXplZCBvdXQgdG8gYHN5bWJvbCsnJ2Agd2hpY2ggd2lsbCxcbiAgLy8gb2YgY291cnNlLCBmYWlsLlxuICByZXR1cm4gISRTdHJpbmcoc3ltYm9sKSB8fCAhKE9iamVjdChzeW1ib2wpIGluc3RhbmNlb2YgU3ltYm9sKSB8fFxuICAgIC8vIENocm9tZSAzOC00MCBzeW1ib2xzIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gRE9NIGNvbGxlY3Rpb25zIHByb3RvdHlwZXMgdG8gaW5zdGFuY2VzXG4gICAgIVN5bWJvbC5zaGFtICYmIFY4X1ZFUlNJT04gJiYgVjhfVkVSU0lPTiA8IDQxO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xuICB2YXIgU3ltYm9sUHJvdG90eXBlID0gU3ltYm9sICYmIFN5bWJvbC5wcm90b3R5cGU7XG4gIHZhciB2YWx1ZU9mID0gU3ltYm9sUHJvdG90eXBlICYmIFN5bWJvbFByb3RvdHlwZS52YWx1ZU9mO1xuICB2YXIgVE9fUFJJTUlUSVZFID0gd2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpO1xuXG4gIGlmIChTeW1ib2xQcm90b3R5cGUgJiYgIVN5bWJvbFByb3RvdHlwZVtUT19QUklNSVRJVkVdKSB7XG4gICAgLy8gYFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvcHJpbWl0aXZlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciAubGVuZ3RoXG4gICAgZGVmaW5lQnVpbHRJbihTeW1ib2xQcm90b3R5cGUsIFRPX1BSSU1JVElWRSwgZnVuY3Rpb24gKGhpbnQpIHtcbiAgICAgIHJldHVybiBjYWxsKHZhbHVlT2YsIHRoaXMpO1xuICAgIH0sIHsgYXJpdHk6IDEgfSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xudmFyIGtleUZvciA9IFN5bWJvbC5rZXlGb3I7XG52YXIgdGhpc1N5bWJvbFZhbHVlID0gdW5jdXJyeVRoaXMoU3ltYm9sLnByb3RvdHlwZS52YWx1ZU9mKTtcblxuLy8gYFN5bWJvbC5pc1JlZ2lzdGVyZWRTeW1ib2xgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLXN5bWJvbC1wcmVkaWNhdGVzLyNzZWMtc3ltYm9sLWlzcmVnaXN0ZXJlZHN5bWJvbFxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2wuaXNSZWdpc3RlcmVkU3ltYm9sIHx8IGZ1bmN0aW9uIGlzUmVnaXN0ZXJlZFN5bWJvbCh2YWx1ZSkge1xuICB0cnkge1xuICAgIHJldHVybiBrZXlGb3IodGhpc1N5bWJvbFZhbHVlKHZhbHVlKSkgIT09IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTeW1ib2wgPSBnZXRCdWlsdEluKCdTeW1ib2wnKTtcbnZhciAkaXNXZWxsS25vd25TeW1ib2wgPSBTeW1ib2wuaXNXZWxsS25vd25TeW1ib2w7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IGdldEJ1aWx0SW4oJ09iamVjdCcsICdnZXRPd25Qcm9wZXJ0eU5hbWVzJyk7XG52YXIgdGhpc1N5bWJvbFZhbHVlID0gdW5jdXJyeVRoaXMoU3ltYm9sLnByb3RvdHlwZS52YWx1ZU9mKTtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xuXG5mb3IgKHZhciBpID0gMCwgc3ltYm9sS2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKSwgc3ltYm9sS2V5c0xlbmd0aCA9IHN5bWJvbEtleXMubGVuZ3RoOyBpIDwgc3ltYm9sS2V5c0xlbmd0aDsgaSsrKSB7XG4gIC8vIHNvbWUgb2xkIGVuZ2luZXMgdGhyb3dzIG9uIGFjY2VzcyB0byBzb21lIGtleXMgbGlrZSBgYXJndW1lbnRzYCBvciBgY2FsbGVyYFxuICB0cnkge1xuICAgIHZhciBzeW1ib2xLZXkgPSBzeW1ib2xLZXlzW2ldO1xuICAgIGlmIChpc1N5bWJvbChTeW1ib2xbc3ltYm9sS2V5XSkpIHdlbGxLbm93blN5bWJvbChzeW1ib2xLZXkpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59XG5cbi8vIGBTeW1ib2wuaXNXZWxsS25vd25TeW1ib2xgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLXN5bWJvbC1wcmVkaWNhdGVzLyNzZWMtc3ltYm9sLWlzd2VsbGtub3duc3ltYm9sXG4vLyBXZSBzaG91bGQgcGF0Y2ggaXQgZm9yIG5ld2x5IGFkZGVkIHdlbGwta25vd24gc3ltYm9scy4gSWYgaXQncyBub3QgcmVxdWlyZWQsIHRoaXMgbW9kdWxlIGp1c3Qgd2lsbCBub3QgYmUgaW5qZWN0ZWRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNXZWxsS25vd25TeW1ib2wodmFsdWUpIHtcbiAgaWYgKCRpc1dlbGxLbm93blN5bWJvbCAmJiAkaXNXZWxsS25vd25TeW1ib2wodmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICB2YXIgc3ltYm9sID0gdGhpc1N5bWJvbFZhbHVlKHZhbHVlKTtcbiAgICBmb3IgKHZhciBqID0gMCwga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoV2VsbEtub3duU3ltYm9sc1N0b3JlKSwga2V5c0xlbmd0aCA9IGtleXMubGVuZ3RoOyBqIDwga2V5c0xlbmd0aDsgaisrKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxIC0tIHBvbHlmaWxsZWQgc3ltYm9scyBjYXNlXG4gICAgICBpZiAoV2VsbEtub3duU3ltYm9sc1N0b3JlW2tleXNbal1dID09IHN5bWJvbCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmYWxzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG5cbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLXN5bWJvbCAtLSBzYWZlICovXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9TWU1CT0wgJiYgISFTeW1ib2xbJ2ZvciddICYmICEhU3ltYm9sLmtleUZvcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHknKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCcpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgYXJyYXlTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQnKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoJyk7XG52YXIgSVNfSU9TID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLWlvcycpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtbm9kZScpO1xuXG52YXIgc2V0ID0gZ2xvYmFsVGhpcy5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXIgPSBnbG9iYWxUaGlzLmNsZWFySW1tZWRpYXRlO1xudmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWxUaGlzLkRpc3BhdGNoO1xudmFyIEZ1bmN0aW9uID0gZ2xvYmFsVGhpcy5GdW5jdGlvbjtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbFRoaXMuTWVzc2FnZUNoYW5uZWw7XG52YXIgU3RyaW5nID0gZ2xvYmFsVGhpcy5TdHJpbmc7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciAkbG9jYXRpb24sIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xuXG5mYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIERlbm8gdGhyb3dzIGEgUmVmZXJlbmNlRXJyb3Igb24gYGxvY2F0aW9uYCBhY2Nlc3Mgd2l0aG91dCBgLS1sb2NhdGlvbmAgZmxhZ1xuICAkbG9jYXRpb24gPSBnbG9iYWxUaGlzLmxvY2F0aW9uO1xufSk7XG5cbnZhciBydW4gPSBmdW5jdGlvbiAoaWQpIHtcbiAgaWYgKGhhc093bihxdWV1ZSwgaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcblxudmFyIHJ1bm5lciA9IGZ1bmN0aW9uIChpZCkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJ1bihpZCk7XG4gIH07XG59O1xuXG52YXIgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4oZXZlbnQuZGF0YSk7XG59O1xuXG52YXIgZ2xvYmFsUG9zdE1lc3NhZ2VEZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBvbGQgZW5naW5lcyBoYXZlIG5vdCBsb2NhdGlvbi5vcmlnaW5cbiAgZ2xvYmFsVGhpcy5wb3N0TWVzc2FnZShTdHJpbmcoaWQpLCAkbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgJGxvY2F0aW9uLmhvc3QpO1xufTtcblxuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXQgfHwgIWNsZWFyKSB7XG4gIHNldCA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShoYW5kbGVyKSB7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7XG4gICAgdmFyIGZuID0gaXNDYWxsYWJsZShoYW5kbGVyKSA/IGhhbmRsZXIgOiBGdW5jdGlvbihoYW5kbGVyKTtcbiAgICB2YXIgYXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgYXBwbHkoZm4sIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoSVNfTk9ERSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICAvLyBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzYyNFxuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBldmVudExpc3RlbmVyO1xuICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0KTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoXG4gICAgZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyICYmXG4gICAgaXNDYWxsYWJsZShnbG9iYWxUaGlzLnBvc3RNZXNzYWdlKSAmJlxuICAgICFnbG9iYWxUaGlzLmltcG9ydFNjcmlwdHMgJiZcbiAgICAkbG9jYXRpb24gJiYgJGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonICYmXG4gICAgIWZhaWxzKGdsb2JhbFBvc3RNZXNzYWdlRGVmZXIpXG4gICkge1xuICAgIGRlZmVyID0gZ2xvYmFsUG9zdE1lc3NhZ2VEZWZlcjtcbiAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBldmVudExpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChydW5uZXIoaWQpLCAwKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgY2xlYXI6IGNsZWFyXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eScpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIEhlbHBlciBmb3IgYSBwb3B1bGFyIHJlcGVhdGluZyBjYXNlIG9mIHRoZSBzcGVjOlxuLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLlxuLy8gSWYgaW50ZWdlciA8IDAsIGxldCByZXN1bHQgYmUgbWF4KChsZW5ndGggKyBpbnRlZ2VyKSwgMCk7IGVsc2UgbGV0IHJlc3VsdCBiZSBtaW4oaW50ZWdlciwgbGVuZ3RoKS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0cnVuYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9tYXRoLXRydW5jJyk7XG5cbi8vIGBUb0ludGVnZXJPckluZmluaXR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9pbnRlZ2Vyb3JpbmZpbml0eVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIG51bWJlciA9ICthcmd1bWVudDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgcmV0dXJuIG51bWJlciAhPT0gbnVtYmVyIHx8IG51bWJlciA9PT0gMCA/IDAgOiB0cnVuYyhudW1iZXIpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHknKTtcblxudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGxlbiA9IHRvSW50ZWdlck9ySW5maW5pdHkoYXJndW1lbnQpO1xuICByZXR1cm4gbGVuID4gMCA/IG1pbihsZW4sIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxuLy8gYFRvT2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9vYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiAkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG52YXIgZ2V0TWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1tZXRob2QnKTtcbnZhciBvcmRpbmFyeVRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGV4b3RpY1RvUHJpbSA9IGdldE1ldGhvZChpbnB1dCwgVE9fUFJJTUlUSVZFKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGV4b3RpY1RvUHJpbSkge1xuICAgIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnZGVmYXVsdCc7XG4gICAgcmVzdWx0ID0gY2FsbChleG90aWNUb1ByaW0sIGlucHV0LCBwcmVmKTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlc3VsdCkgfHwgaXNTeW1ib2wocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICB0aHJvdyBuZXcgJFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbiAgfVxuICBpZiAocHJlZiA9PT0gdW5kZWZpbmVkKSBwcmVmID0gJ251bWJlcic7XG4gIHJldHVybiBvcmRpbmFyeVRvUHJpbWl0aXZlKGlucHV0LCBwcmVmKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtc3ltYm9sJyk7XG5cbi8vIGBUb1Byb3BlcnR5S2V5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9wcm9wZXJ0eWtleVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGtleSA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCAnc3RyaW5nJyk7XG4gIHJldHVybiBpc1N5bWJvbChrZXkpID8ga2V5IDoga2V5ICsgJyc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciB0ZXN0ID0ge307XG5cbnRlc3RbVE9fU1RSSU5HX1RBR10gPSAneic7XG5cbm1vZHVsZS5leHBvcnRzID0gU3RyaW5nKHRlc3QpID09PSAnW29iamVjdCB6XSc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mJyk7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoY2xhc3NvZihhcmd1bWVudCkgPT09ICdTeW1ib2wnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZycpO1xuICByZXR1cm4gJFN0cmluZyhhcmd1bWVudCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRTdHJpbmcgPSBTdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICRTdHJpbmcoYXJndW1lbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAnT2JqZWN0JztcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcblxudmFyIGlkID0gMDtcbnZhciBwb3N0Zml4ID0gTWF0aC5yYW5kb20oKTtcbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKDEuMC50b1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnICsgKGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXkpICsgJylfJyArIHRvU3RyaW5nKCsraWQgKyBwb3N0Zml4LCAzNik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX1NZTUJPTFxuICAmJiAhU3ltYm9sLnNoYW1cbiAgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIFY4IH4gQ2hyb21lIDM2LVxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzMzNFxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdwcm90b3R5cGUnLCB7XG4gICAgdmFsdWU6IDQyLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KS5wcm90b3R5cGUgIT09IDQyO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocGFzc2VkLCByZXF1aXJlZCkge1xuICBpZiAocGFzc2VkIDwgcmVxdWlyZWQpIHRocm93IG5ldyAkVHlwZUVycm9yKCdOb3QgZW5vdWdoIGFyZ3VtZW50cycpO1xuICByZXR1cm4gcGFzc2VkO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbFRoaXMuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0NhbGxhYmxlKFdlYWtNYXApICYmIC9uYXRpdmUgY29kZS8udGVzdChTdHJpbmcoV2Vha01hcCkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhdGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHtcbiAgdmFyIFN5bWJvbCA9IHBhdGguU3ltYm9sIHx8IChwYXRoLlN5bWJvbCA9IHt9KTtcbiAgaWYgKCFoYXNPd24oU3ltYm9sLCBOQU1FKSkgZGVmaW5lUHJvcGVydHkoU3ltYm9sLCBOQU1FLCB7XG4gICAgdmFsdWU6IHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUuZihOQU1FKVxuICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbmV4cG9ydHMuZiA9IHdlbGxLbm93blN5bWJvbDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xudmFyIFVTRV9TWU1CT0xfQVNfVUlEID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkJyk7XG5cbnZhciBTeW1ib2wgPSBnbG9iYWxUaGlzLlN5bWJvbDtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sWydmb3InXSB8fCBTeW1ib2wgOiBTeW1ib2wgJiYgU3ltYm9sLndpdGhvdXRTZXR0ZXIgfHwgdWlkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghaGFzT3duKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkpIHtcbiAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBOQVRJVkVfU1lNQk9MICYmIGhhc093bihTeW1ib2wsIG5hbWUpXG4gICAgICA/IFN5bWJvbFtuYW1lXVxuICAgICAgOiBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBhIHN0cmluZyBvZiBhbGwgdmFsaWQgdW5pY29kZSB3aGl0ZXNwYWNlc1xubW9kdWxlLmV4cG9ydHMgPSAnXFx1MDAwOVxcdTAwMEFcXHUwMDBCXFx1MDAwQ1xcdTAwMERcXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUyMDAwXFx1MjAwMVxcdTIwMDInICtcbiAgJ1xcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGJztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGluc3RhbGxFcnJvckNhdXNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luc3RhbGwtZXJyb3ItY2F1c2UnKTtcbnZhciBpbnN0YWxsRXJyb3JTdGFjayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgbm9ybWFsaXplU3RyaW5nQXJndW1lbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbm9ybWFsaXplLXN0cmluZy1hcmd1bWVudCcpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciAkRXJyb3IgPSBFcnJvcjtcbnZhciBwdXNoID0gW10ucHVzaDtcblxudmFyICRBZ2dyZWdhdGVFcnJvciA9IGZ1bmN0aW9uIEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSAvKiAsIG9wdGlvbnMgKi8pIHtcbiAgdmFyIGlzSW5zdGFuY2UgPSBpc1Byb3RvdHlwZU9mKEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlLCB0aGlzKTtcbiAgdmFyIHRoYXQ7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIHRoYXQgPSBzZXRQcm90b3R5cGVPZihuZXcgJEVycm9yKCksIGlzSW5zdGFuY2UgPyBnZXRQcm90b3R5cGVPZih0aGlzKSA6IEFnZ3JlZ2F0ZUVycm9yUHJvdG90eXBlKTtcbiAgfSBlbHNlIHtcbiAgICB0aGF0ID0gaXNJbnN0YW5jZSA/IHRoaXMgOiBjcmVhdGUoQWdncmVnYXRlRXJyb3JQcm90b3R5cGUpO1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh0aGF0LCBUT19TVFJJTkdfVEFHLCAnRXJyb3InKTtcbiAgfVxuICBpZiAobWVzc2FnZSAhPT0gdW5kZWZpbmVkKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGhhdCwgJ21lc3NhZ2UnLCBub3JtYWxpemVTdHJpbmdBcmd1bWVudChtZXNzYWdlKSk7XG4gIGluc3RhbGxFcnJvclN0YWNrKHRoYXQsICRBZ2dyZWdhdGVFcnJvciwgdGhhdC5zdGFjaywgMSk7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgaW5zdGFsbEVycm9yQ2F1c2UodGhhdCwgYXJndW1lbnRzWzJdKTtcbiAgdmFyIGVycm9yc0FycmF5ID0gW107XG4gIGl0ZXJhdGUoZXJyb3JzLCBwdXNoLCB7IHRoYXQ6IGVycm9yc0FycmF5IH0pO1xuICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkodGhhdCwgJ2Vycm9ycycsIGVycm9yc0FycmF5KTtcbiAgcmV0dXJuIHRoYXQ7XG59O1xuXG5pZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKCRBZ2dyZWdhdGVFcnJvciwgJEVycm9yKTtcbmVsc2UgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcygkQWdncmVnYXRlRXJyb3IsICRFcnJvciwgeyBuYW1lOiB0cnVlIH0pO1xuXG52YXIgQWdncmVnYXRlRXJyb3JQcm90b3R5cGUgPSAkQWdncmVnYXRlRXJyb3IucHJvdG90eXBlID0gY3JlYXRlKCRFcnJvci5wcm90b3R5cGUsIHtcbiAgY29uc3RydWN0b3I6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCAkQWdncmVnYXRlRXJyb3IpLFxuICBtZXNzYWdlOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJycpLFxuICBuYW1lOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgJ0FnZ3JlZ2F0ZUVycm9yJylcbn0pO1xuXG4vLyBgQWdncmVnYXRlRXJyb3JgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFnZ3JlZ2F0ZS1lcnJvci1jb25zdHJ1Y3RvclxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIGFyaXR5OiAyIH0sIHtcbiAgQWdncmVnYXRlRXJyb3I6ICRBZ2dyZWdhdGVFcnJvclxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHJlcGxhY2VkIHRvIG1vZHVsZSBiZWxvd1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hZ2dyZWdhdGUtZXJyb3IuY29uc3RydWN0b3InKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlJyk7XG52YXIgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXInKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgVjhfVkVSU0lPTiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnZpcm9ubWVudC12OC12ZXJzaW9uJyk7XG5cbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRSA9IHdlbGxLbm93blN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJyk7XG5cbi8vIFdlIGNhbid0IHVzZSB0aGlzIGZlYXR1cmUgZGV0ZWN0aW9uIGluIFY4IHNpbmNlIGl0IGNhdXNlc1xuLy8gZGVvcHRpbWl6YXRpb24gYW5kIHNlcmlvdXMgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUID0gVjhfVkVSU0lPTiA+PSA1MSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgYXJyYXkgPSBbXTtcbiAgYXJyYXlbSVNfQ09OQ0FUX1NQUkVBREFCTEVdID0gZmFsc2U7XG4gIHJldHVybiBhcnJheS5jb25jYXQoKVswXSAhPT0gYXJyYXk7XG59KTtcblxudmFyIGlzQ29uY2F0U3ByZWFkYWJsZSA9IGZ1bmN0aW9uIChPKSB7XG4gIGlmICghaXNPYmplY3QoTykpIHJldHVybiBmYWxzZTtcbiAgdmFyIHNwcmVhZGFibGUgPSBPW0lTX0NPTkNBVF9TUFJFQURBQkxFXTtcbiAgcmV0dXJuIHNwcmVhZGFibGUgIT09IHVuZGVmaW5lZCA/ICEhc3ByZWFkYWJsZSA6IGlzQXJyYXkoTyk7XG59O1xuXG52YXIgRk9SQ0VEID0gIUlTX0NPTkNBVF9TUFJFQURBQkxFX1NVUFBPUlQgfHwgIWFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ2NvbmNhdCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5jb25jYXRcbi8vIHdpdGggYWRkaW5nIHN1cHBvcnQgb2YgQEBpc0NvbmNhdFNwcmVhZGFibGUgYW5kIEBAc3BlY2llc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGFyaXR5OiAxLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIGNvbmNhdDogZnVuY3Rpb24gY29uY2F0KGFyZykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG4gICAgdmFyIG4gPSAwO1xuICAgIHZhciBpLCBrLCBsZW5ndGgsIGxlbiwgRTtcbiAgICBmb3IgKGkgPSAtMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBFID0gaSA9PT0gLTEgPyBPIDogYXJndW1lbnRzW2ldO1xuICAgICAgaWYgKGlzQ29uY2F0U3ByZWFkYWJsZShFKSkge1xuICAgICAgICBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShFKTtcbiAgICAgICAgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyKG4gKyBsZW4pO1xuICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuOyBrKyssIG4rKykgaWYgKGsgaW4gRSkgY3JlYXRlUHJvcGVydHkoQSwgbiwgRVtrXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobiArIDEpO1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShBLCBuKyssIEUpO1xuICAgICAgfVxuICAgIH1cbiAgICBBLmxlbmd0aCA9IG47XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGV2ZXJ5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLmV2ZXJ5O1xudmFyIGFycmF5TWV0aG9kSXNTdHJpY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdCcpO1xuXG52YXIgU1RSSUNUX01FVEhPRCA9IGFycmF5TWV0aG9kSXNTdHJpY3QoJ2V2ZXJ5Jyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZXZlcnlcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFTVFJJQ1RfTUVUSE9EIH0sIHtcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRldmVyeSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGZpbHRlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5maWx0ZXI7XG52YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydCcpO1xuXG52YXIgSEFTX1NQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ2ZpbHRlcicpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWx0ZXJcbi8vIHdpdGggYWRkaW5nIHN1cHBvcnQgb2YgQEBzcGVjaWVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhSEFTX1NQRUNJRVNfU1VQUE9SVCB9LCB7XG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRmaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyICRmaW5kSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZmluZEluZGV4O1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG5cbnZhciBGSU5EX0lOREVYID0gJ2ZpbmRJbmRleCc7XG52YXIgU0tJUFNfSE9MRVMgPSB0cnVlO1xuXG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LXByb3RvdHlwZS1maW5kaW5kZXggLS0gdGVzdGluZ1xuaWYgKEZJTkRfSU5ERVggaW4gW10pIEFycmF5KDEpW0ZJTkRfSU5ERVhdKGZ1bmN0aW9uICgpIHsgU0tJUFNfSE9MRVMgPSBmYWxzZTsgfSk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRpbmRleFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogU0tJUFNfSE9MRVMgfSwge1xuICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiAkZmluZEluZGV4KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoRklORF9JTkRFWCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkZmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24nKS5maW5kO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG5cbnZhciBGSU5EID0gJ2ZpbmQnO1xudmFyIFNLSVBTX0hPTEVTID0gdHJ1ZTtcblxuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1wcm90b3R5cGUtZmluZCAtLSB0ZXN0aW5nXG5pZiAoRklORCBpbiBbXSkgQXJyYXkoMSlbRklORF0oZnVuY3Rpb24gKCkgeyBTS0lQU19IT0xFUyA9IGZhbHNlOyB9KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5maW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFNLSVBTX0hPTEVTIH0sIHtcbiAgZmluZDogZnVuY3Rpb24gZmluZChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKEZJTkQpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mb3ItZWFjaCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LXByb3RvdHlwZS1mb3JlYWNoIC0tIHNhZmVcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFtdLmZvckVhY2ggIT09IGZvckVhY2ggfSwge1xuICBmb3JFYWNoOiBmb3JFYWNoXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGZyb20gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktZnJvbScpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcblxudmFyIElOQ09SUkVDVF9JVEVSQVRJT04gPSAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktZnJvbSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICBBcnJheS5mcm9tKGl0ZXJhYmxlKTtcbn0pO1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGZyb206IGZyb21cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGluY2x1ZGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJykuaW5jbHVkZXM7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xuXG4vLyBGRjk5KyBidWdcbnZhciBCUk9LRU5fT05fU1BBUlNFID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWluY2x1ZGVzIC0tIGRldGVjdGlvblxuICByZXR1cm4gIUFycmF5KDEpLmluY2x1ZGVzKCk7XG59KTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5pbmNsdWRlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogQlJPS0VOX09OX1NQQVJTRSB9LCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhlbCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICByZXR1cm4gJGluY2x1ZGVzKHRoaXMsIGVsLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdpbmNsdWRlcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWluZGV4b2YgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UnKTtcbnZhciAkaW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpLmluZGV4T2Y7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG5cbnZhciBuYXRpdmVJbmRleE9mID0gdW5jdXJyeVRoaXMoW10uaW5kZXhPZik7XG5cbnZhciBORUdBVElWRV9aRVJPID0gISFuYXRpdmVJbmRleE9mICYmIDEgLyBuYXRpdmVJbmRleE9mKFsxXSwgMSwgLTApIDwgMDtcbnZhciBGT1JDRUQgPSBORUdBVElWRV9aRVJPIHx8ICFhcnJheU1ldGhvZElzU3RyaWN0KCdpbmRleE9mJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuaW5kZXhPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgdmFyIGZyb21JbmRleCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBORUdBVElWRV9aRVJPXG4gICAgICAvLyBjb252ZXJ0IC0wIHRvICswXG4gICAgICA/IG5hdGl2ZUluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgZnJvbUluZGV4KSB8fCAwXG4gICAgICA6ICRpbmRleE9mKHRoaXMsIHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xuXG4vLyBgQXJyYXkuaXNBcnJheWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmlzYXJyYXlcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHN0YXQ6IHRydWUgfSwge1xuICBpc0FycmF5OiBpc0FycmF5XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lJyk7XG52YXIgY3JlYXRlSXRlclJlc3VsdE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlci1yZXN1bHQtb2JqZWN0Jyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXNcbi8vIGBBcnJheS5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5rZXlzXG4vLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvclxuLy8gYENyZWF0ZUFycmF5SXRlcmF0b3JgIGludGVybmFsIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVhcnJheWl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogQVJSQVlfSVRFUkFUT1IsXG4gICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXRcbiAgICBpbmRleDogMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgICBraW5kOiBraW5kICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgfSk7XG4vLyBgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIgaW5kZXggPSBzdGF0ZS5pbmRleCsrO1xuICBpZiAoIXRhcmdldCB8fCBpbmRleCA+PSB0YXJnZXQubGVuZ3RoKSB7XG4gICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cbiAgc3dpdGNoIChzdGF0ZS5raW5kKSB7XG4gICAgY2FzZSAna2V5cyc6IHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KGluZGV4LCBmYWxzZSk7XG4gICAgY2FzZSAndmFsdWVzJzogcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodGFyZ2V0W2luZGV4XSwgZmFsc2UpO1xuICB9IHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KFtpbmRleCwgdGFyZ2V0W2luZGV4XV0sIGZhbHNlKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZW1hcHBlZGFyZ3VtZW50c29iamVjdFxudmFyIHZhbHVlcyA9IEl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG4vLyBWOCB+IENocm9tZSA0NS0gYnVnXG5pZiAoIUlTX1BVUkUgJiYgREVTQ1JJUFRPUlMgJiYgdmFsdWVzLm5hbWUgIT09ICd2YWx1ZXMnKSB0cnkge1xuICBkZWZpbmVQcm9wZXJ0eSh2YWx1ZXMsICduYW1lJywgeyB2YWx1ZTogJ3ZhbHVlcycgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkbWFwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbicpLm1hcDtcbnZhciBhcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0Jyk7XG5cbnZhciBIQVNfU1BFQ0lFU19TVVBQT1JUID0gYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCgnbWFwJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLm1hcFxuLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFIQVNfU1BFQ0lFU19TVVBQT1JUIH0sIHtcbiAgbWFwOiBmdW5jdGlvbiBtYXAoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJG1hcCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHJlZHVjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1yZWR1Y2UnKS5sZWZ0O1xudmFyIGFycmF5TWV0aG9kSXNTdHJpY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWlzLXN0cmljdCcpO1xudmFyIENIUk9NRV9WRVJTSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXY4LXZlcnNpb24nKTtcbnZhciBJU19OT0RFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LWlzLW5vZGUnKTtcblxuLy8gQ2hyb21lIDgwLTgyIGhhcyBhIGNyaXRpY2FsIGJ1Z1xuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTA0OTk4MlxudmFyIENIUk9NRV9CVUcgPSAhSVNfTk9ERSAmJiBDSFJPTUVfVkVSU0lPTiA+IDc5ICYmIENIUk9NRV9WRVJTSU9OIDwgODM7XG52YXIgRk9SQ0VEID0gQ0hST01FX0JVRyB8fCAhYXJyYXlNZXRob2RJc1N0cmljdCgncmVkdWNlJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUucmVkdWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZVxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGxlbmd0aCwgbGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3InKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKTtcbnZhciBuYXRpdmVTbGljZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zbGljZScpO1xuXG52YXIgSEFTX1NQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ3NsaWNlJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgJEFycmF5ID0gQXJyYXk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuc2xpY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc2xpY2Vcbi8vIGZhbGxiYWNrIGZvciBub3QgYXJyYXktbGlrZSBFUzMgc3RyaW5ncyBhbmQgRE9NIG9iamVjdHNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFIQVNfU1BFQ0lFU19TVVBQT1JUIH0sIHtcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIGsgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbmd0aCk7XG4gICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZCwgbGVuZ3RoKTtcbiAgICAvLyBpbmxpbmUgYEFycmF5U3BlY2llc0NyZWF0ZWAgZm9yIHVzYWdlIG5hdGl2ZSBgQXJyYXkjc2xpY2VgIHdoZXJlIGl0J3MgcG9zc2libGVcbiAgICB2YXIgQ29uc3RydWN0b3IsIHJlc3VsdCwgbjtcbiAgICBpZiAoaXNBcnJheShPKSkge1xuICAgICAgQ29uc3RydWN0b3IgPSBPLmNvbnN0cnVjdG9yO1xuICAgICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICAgIGlmIChpc0NvbnN0cnVjdG9yKENvbnN0cnVjdG9yKSAmJiAoQ29uc3RydWN0b3IgPT09ICRBcnJheSB8fCBpc0FycmF5KENvbnN0cnVjdG9yLnByb3RvdHlwZSkpKSB7XG4gICAgICAgIENvbnN0cnVjdG9yID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChDb25zdHJ1Y3RvcikpIHtcbiAgICAgICAgQ29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcltTUEVDSUVTXTtcbiAgICAgICAgaWYgKENvbnN0cnVjdG9yID09PSBudWxsKSBDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChDb25zdHJ1Y3RvciA9PT0gJEFycmF5IHx8IENvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZVNsaWNlKE8sIGssIGZpbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdCA9IG5ldyAoQ29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCA/ICRBcnJheSA6IENvbnN0cnVjdG9yKShtYXgoZmluIC0gaywgMCkpO1xuICAgIGZvciAobiA9IDA7IGsgPCBmaW47IGsrKywgbisrKSBpZiAoayBpbiBPKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIG4sIE9ba10pO1xuICAgIHJlc3VsdC5sZW5ndGggPSBuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZScpO1xudmFyIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWxldGUtcHJvcGVydHktb3ItdGhyb3cnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGludGVybmFsU29ydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zb3J0Jyk7XG52YXIgYXJyYXlNZXRob2RJc1N0cmljdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0Jyk7XG52YXIgRkYgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtZmYtdmVyc2lvbicpO1xudmFyIElFX09SX0VER0UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtaWUtb3ItZWRnZScpO1xudmFyIFY4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Vudmlyb25tZW50LXY4LXZlcnNpb24nKTtcbnZhciBXRUJLSVQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtd2Via2l0LXZlcnNpb24nKTtcblxudmFyIHRlc3QgPSBbXTtcbnZhciBuYXRpdmVTb3J0ID0gdW5jdXJyeVRoaXModGVzdC5zb3J0KTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXModGVzdC5wdXNoKTtcblxuLy8gSUU4LVxudmFyIEZBSUxTX09OX1VOREVGSU5FRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdGVzdC5zb3J0KHVuZGVmaW5lZCk7XG59KTtcbi8vIFY4IGJ1Z1xudmFyIEZBSUxTX09OX05VTEwgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHRlc3Quc29ydChudWxsKTtcbn0pO1xuLy8gT2xkIFdlYktpdFxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdzb3J0Jyk7XG5cbnZhciBTVEFCTEVfU09SVCA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGZlYXR1cmUgZGV0ZWN0aW9uIGNhbiBiZSB0b28gc2xvdywgc28gY2hlY2sgZW5naW5lcyB2ZXJzaW9uc1xuICBpZiAoVjgpIHJldHVybiBWOCA8IDcwO1xuICBpZiAoRkYgJiYgRkYgPiAzKSByZXR1cm47XG4gIGlmIChJRV9PUl9FREdFKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFdFQktJVCkgcmV0dXJuIFdFQktJVCA8IDYwMztcblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBjb2RlLCBjaHIsIHZhbHVlLCBpbmRleDtcblxuICAvLyBnZW5lcmF0ZSBhbiBhcnJheSB3aXRoIG1vcmUgNTEyIGVsZW1lbnRzIChDaGFrcmEgYW5kIG9sZCBWOCBmYWlscyBvbmx5IGluIHRoaXMgY2FzZSlcbiAgZm9yIChjb2RlID0gNjU7IGNvZGUgPCA3NjsgY29kZSsrKSB7XG4gICAgY2hyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcblxuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSA2NjogY2FzZSA2OTogY2FzZSA3MDogY2FzZSA3MjogdmFsdWUgPSAzOyBicmVhaztcbiAgICAgIGNhc2UgNjg6IGNhc2UgNzE6IHZhbHVlID0gNDsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB2YWx1ZSA9IDI7XG4gICAgfVxuXG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDc7IGluZGV4KyspIHtcbiAgICAgIHRlc3QucHVzaCh7IGs6IGNociArIGluZGV4LCB2OiB2YWx1ZSB9KTtcbiAgICB9XG4gIH1cblxuICB0ZXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIudiAtIGEudjsgfSk7XG5cbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGVzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjaHIgPSB0ZXN0W2luZGV4XS5rLmNoYXJBdCgwKTtcbiAgICBpZiAocmVzdWx0LmNoYXJBdChyZXN1bHQubGVuZ3RoIC0gMSkgIT09IGNocikgcmVzdWx0ICs9IGNocjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQgIT09ICdER0JFRkhBQ0lKSyc7XG59KTtcblxudmFyIEZPUkNFRCA9IEZBSUxTX09OX1VOREVGSU5FRCB8fCAhRkFJTFNfT05fTlVMTCB8fCAhU1RSSUNUX01FVEhPRCB8fCAhU1RBQkxFX1NPUlQ7XG5cbnZhciBnZXRTb3J0Q29tcGFyZSA9IGZ1bmN0aW9uIChjb21wYXJlZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIC0xO1xuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHJldHVybiAxO1xuICAgIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgcmV0dXJuICtjb21wYXJlZm4oeCwgeSkgfHwgMDtcbiAgICByZXR1cm4gdG9TdHJpbmcoeCkgPiB0b1N0cmluZyh5KSA/IDEgOiAtMTtcbiAgfTtcbn07XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb3J0XG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgYUNhbGxhYmxlKGNvbXBhcmVmbik7XG5cbiAgICB2YXIgYXJyYXkgPSB0b09iamVjdCh0aGlzKTtcblxuICAgIGlmIChTVEFCTEVfU09SVCkgcmV0dXJuIGNvbXBhcmVmbiA9PT0gdW5kZWZpbmVkID8gbmF0aXZlU29ydChhcnJheSkgOiBuYXRpdmVTb3J0KGFycmF5LCBjb21wYXJlZm4pO1xuXG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdmFyIGFycmF5TGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoYXJyYXkpO1xuICAgIHZhciBpdGVtc0xlbmd0aCwgaW5kZXg7XG5cbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBhcnJheUxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKGluZGV4IGluIGFycmF5KSBwdXNoKGl0ZW1zLCBhcnJheVtpbmRleF0pO1xuICAgIH1cblxuICAgIGludGVybmFsU29ydChpdGVtcywgZ2V0U29ydENvbXBhcmUoY29tcGFyZWZuKSk7XG5cbiAgICBpdGVtc0xlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGl0ZW1zKTtcbiAgICBpbmRleCA9IDA7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBpdGVtc0xlbmd0aCkgYXJyYXlbaW5kZXhdID0gaXRlbXNbaW5kZXgrK107XG4gICAgd2hpbGUgKGluZGV4IDwgYXJyYXlMZW5ndGgpIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyhhcnJheSwgaW5kZXgrKyk7XG5cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5Jyk7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UnKTtcbnZhciBzZXRBcnJheUxlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoJyk7XG52YXIgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXInKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBkZWxldGVQcm9wZXJ0eU9yVGhyb3cgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93Jyk7XG52YXIgYXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydCcpO1xuXG52YXIgSEFTX1NQRUNJRVNfU1VQUE9SVCA9IGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoJ3NwbGljZScpO1xuXG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuc3BsaWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnNwbGljZVxuLy8gd2l0aCBhZGRpbmcgc3VwcG9ydCBvZiBAQHNwZWNpZXNcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFIQVNfU1BFQ0lFU19TVVBQT1JUIH0sIHtcbiAgc3BsaWNlOiBmdW5jdGlvbiBzcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50IC8qICwgLi4uaXRlbXMgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICB2YXIgYWN0dWFsU3RhcnQgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gICAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGluc2VydENvdW50LCBhY3R1YWxEZWxldGVDb3VudCwgQSwgaywgZnJvbSwgdG87XG4gICAgaWYgKGFyZ3VtZW50c0xlbmd0aCA9PT0gMCkge1xuICAgICAgaW5zZXJ0Q291bnQgPSBhY3R1YWxEZWxldGVDb3VudCA9IDA7XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHNMZW5ndGggPT09IDEpIHtcbiAgICAgIGluc2VydENvdW50ID0gMDtcbiAgICAgIGFjdHVhbERlbGV0ZUNvdW50ID0gbGVuIC0gYWN0dWFsU3RhcnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc2VydENvdW50ID0gYXJndW1lbnRzTGVuZ3RoIC0gMjtcbiAgICAgIGFjdHVhbERlbGV0ZUNvdW50ID0gbWluKG1heCh0b0ludGVnZXJPckluZmluaXR5KGRlbGV0ZUNvdW50KSwgMCksIGxlbiAtIGFjdHVhbFN0YXJ0KTtcbiAgICB9XG4gICAgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyKGxlbiArIGluc2VydENvdW50IC0gYWN0dWFsRGVsZXRlQ291bnQpO1xuICAgIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgYWN0dWFsRGVsZXRlQ291bnQpO1xuICAgIGZvciAoayA9IDA7IGsgPCBhY3R1YWxEZWxldGVDb3VudDsgaysrKSB7XG4gICAgICBmcm9tID0gYWN0dWFsU3RhcnQgKyBrO1xuICAgICAgaWYgKGZyb20gaW4gTykgY3JlYXRlUHJvcGVydHkoQSwgaywgT1tmcm9tXSk7XG4gICAgfVxuICAgIEEubGVuZ3RoID0gYWN0dWFsRGVsZXRlQ291bnQ7XG4gICAgaWYgKGluc2VydENvdW50IDwgYWN0dWFsRGVsZXRlQ291bnQpIHtcbiAgICAgIGZvciAoayA9IGFjdHVhbFN0YXJ0OyBrIDwgbGVuIC0gYWN0dWFsRGVsZXRlQ291bnQ7IGsrKykge1xuICAgICAgICBmcm9tID0gayArIGFjdHVhbERlbGV0ZUNvdW50O1xuICAgICAgICB0byA9IGsgKyBpbnNlcnRDb3VudDtcbiAgICAgICAgaWYgKGZyb20gaW4gTykgT1t0b10gPSBPW2Zyb21dO1xuICAgICAgICBlbHNlIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyhPLCB0byk7XG4gICAgICB9XG4gICAgICBmb3IgKGsgPSBsZW47IGsgPiBsZW4gLSBhY3R1YWxEZWxldGVDb3VudCArIGluc2VydENvdW50OyBrLS0pIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyhPLCBrIC0gMSk7XG4gICAgfSBlbHNlIGlmIChpbnNlcnRDb3VudCA+IGFjdHVhbERlbGV0ZUNvdW50KSB7XG4gICAgICBmb3IgKGsgPSBsZW4gLSBhY3R1YWxEZWxldGVDb3VudDsgayA+IGFjdHVhbFN0YXJ0OyBrLS0pIHtcbiAgICAgICAgZnJvbSA9IGsgKyBhY3R1YWxEZWxldGVDb3VudCAtIDE7XG4gICAgICAgIHRvID0gayArIGluc2VydENvdW50IC0gMTtcbiAgICAgICAgaWYgKGZyb20gaW4gTykgT1t0b10gPSBPW2Zyb21dO1xuICAgICAgICBlbHNlIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyhPLCB0byk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoayA9IDA7IGsgPCBpbnNlcnRDb3VudDsgaysrKSB7XG4gICAgICBPW2sgKyBhY3R1YWxTdGFydF0gPSBhcmd1bWVudHNbayArIDJdO1xuICAgIH1cbiAgICBzZXRBcnJheUxlbmd0aChPLCBsZW4gLSBhY3R1YWxEZWxldGVDb3VudCArIGluc2VydENvdW50KTtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciB0b0lTT1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kYXRlLXRvLWlzby1zdHJpbmcnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxudmFyIEZPUkNFRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBEYXRlKE5hTikudG9KU09OKCkgIT09IG51bGxcbiAgICB8fCBjYWxsKERhdGUucHJvdG90eXBlLnRvSlNPTiwgeyB0b0lTT1N0cmluZzogZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSB9KSAhPT0gMTtcbn0pO1xuXG4vLyBgRGF0ZS5wcm90b3R5cGUudG9KU09OYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZGF0ZS5wcm90b3R5cGUudG9qc29uXG4kKHsgdGFyZ2V0OiAnRGF0ZScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIHRvSlNPTjogZnVuY3Rpb24gdG9KU09OKGtleSkge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHB2ID0gdG9QcmltaXRpdmUoTywgJ251bWJlcicpO1xuICAgIHJldHVybiB0eXBlb2YgcHYgPT0gJ251bWJlcicgJiYgIWlzRmluaXRlKHB2KSA/IG51bGwgOlxuICAgICAgKCEoJ3RvSVNPU3RyaW5nJyBpbiBPKSAmJiBjbGFzc29mKE8pID09PSAnRGF0ZScpID8gY2FsbCh0b0lTT1N0cmluZywgTykgOiBPLnRvSVNPU3RyaW5nKCk7XG4gIH1cbn0pO1xuIiwiLy8gZW1wdHlcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQnKTtcblxuLy8gYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBkZXRlY3Rpb25cbiQoeyB0YXJnZXQ6ICdGdW5jdGlvbicsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZ1bmN0aW9uLmJpbmQgIT09IGJpbmQgfSwge1xuICBiaW5kOiBiaW5kXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHknKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUnKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcbnZhciBhcnJheVNsaWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlJyk7XG52YXIgZ2V0UmVwbGFjZXJGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtanNvbi1yZXBsYWNlci1mdW5jdGlvbicpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xuXG52YXIgJFN0cmluZyA9IFN0cmluZztcbnZhciAkc3RyaW5naWZ5ID0gZ2V0QnVpbHRJbignSlNPTicsICdzdHJpbmdpZnknKTtcbnZhciBleGVjID0gdW5jdXJyeVRoaXMoLy4vLmV4ZWMpO1xudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgY2hhckNvZGVBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJDb2RlQXQpO1xudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBudW1iZXJUb1N0cmluZyA9IHVuY3VycnlUaGlzKDEuMC50b1N0cmluZyk7XG5cbnZhciB0ZXN0ZXIgPSAvW1xcdUQ4MDAtXFx1REZGRl0vZztcbnZhciBsb3cgPSAvXltcXHVEODAwLVxcdURCRkZdJC87XG52YXIgaGkgPSAvXltcXHVEQzAwLVxcdURGRkZdJC87XG5cbnZhciBXUk9OR19TWU1CT0xTX0NPTlZFUlNJT04gPSAhTkFUSVZFX1NZTUJPTCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBzeW1ib2wgPSBnZXRCdWlsdEluKCdTeW1ib2wnKSgnc3RyaW5naWZ5IGRldGVjdGlvbicpO1xuICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuICByZXR1cm4gJHN0cmluZ2lmeShbc3ltYm9sXSkgIT09ICdbbnVsbF0nXG4gICAgLy8gV2ViS2l0IGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyBudWxsXG4gICAgfHwgJHN0cmluZ2lmeSh7IGE6IHN5bWJvbCB9KSAhPT0gJ3t9J1xuICAgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gICAgfHwgJHN0cmluZ2lmeShPYmplY3Qoc3ltYm9sKSkgIT09ICd7fSc7XG59KTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtd2VsbC1mb3JtZWQtc3RyaW5naWZ5XG52YXIgSUxMX0ZPUk1FRF9VTklDT0RFID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJHN0cmluZ2lmeSgnXFx1REYwNlxcdUQ4MzQnKSAhPT0gJ1wiXFxcXHVkZjA2XFxcXHVkODM0XCInXG4gICAgfHwgJHN0cmluZ2lmeSgnXFx1REVBRCcpICE9PSAnXCJcXFxcdWRlYWRcIic7XG59KTtcblxudmFyIHN0cmluZ2lmeVdpdGhTeW1ib2xzRml4ID0gZnVuY3Rpb24gKGl0LCByZXBsYWNlcikge1xuICB2YXIgYXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzKTtcbiAgdmFyICRyZXBsYWNlciA9IGdldFJlcGxhY2VyRnVuY3Rpb24ocmVwbGFjZXIpO1xuICBpZiAoIWlzQ2FsbGFibGUoJHJlcGxhY2VyKSAmJiAoaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpKSByZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcbiAgYXJnc1sxXSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgLy8gc29tZSBvbGQgaW1wbGVtZW50YXRpb25zIChsaWtlIFdlYktpdCkgY291bGQgcGFzcyBudW1iZXJzIGFzIGtleXNcbiAgICBpZiAoaXNDYWxsYWJsZSgkcmVwbGFjZXIpKSB2YWx1ZSA9IGNhbGwoJHJlcGxhY2VyLCB0aGlzLCAkU3RyaW5nKGtleSksIHZhbHVlKTtcbiAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICB9O1xuICByZXR1cm4gYXBwbHkoJHN0cmluZ2lmeSwgbnVsbCwgYXJncyk7XG59O1xuXG52YXIgZml4SWxsRm9ybWVkID0gZnVuY3Rpb24gKG1hdGNoLCBvZmZzZXQsIHN0cmluZykge1xuICB2YXIgcHJldiA9IGNoYXJBdChzdHJpbmcsIG9mZnNldCAtIDEpO1xuICB2YXIgbmV4dCA9IGNoYXJBdChzdHJpbmcsIG9mZnNldCArIDEpO1xuICBpZiAoKGV4ZWMobG93LCBtYXRjaCkgJiYgIWV4ZWMoaGksIG5leHQpKSB8fCAoZXhlYyhoaSwgbWF0Y2gpICYmICFleGVjKGxvdywgcHJldikpKSB7XG4gICAgcmV0dXJuICdcXFxcdScgKyBudW1iZXJUb1N0cmluZyhjaGFyQ29kZUF0KG1hdGNoLCAwKSwgMTYpO1xuICB9IHJldHVybiBtYXRjaDtcbn07XG5cbmlmICgkc3RyaW5naWZ5KSB7XG4gIC8vIGBKU09OLnN0cmluZ2lmeWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtanNvbi5zdHJpbmdpZnlcbiAgJCh7IHRhcmdldDogJ0pTT04nLCBzdGF0OiB0cnVlLCBhcml0eTogMywgZm9yY2VkOiBXUk9OR19TWU1CT0xTX0NPTlZFUlNJT04gfHwgSUxMX0ZPUk1FRF9VTklDT0RFIH0sIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0LCByZXBsYWNlciwgc3BhY2UpIHtcbiAgICAgIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMpO1xuICAgICAgdmFyIHJlc3VsdCA9IGFwcGx5KFdST05HX1NZTUJPTFNfQ09OVkVSU0lPTiA/IHN0cmluZ2lmeVdpdGhTeW1ib2xzRml4IDogJHN0cmluZ2lmeSwgbnVsbCwgYXJncyk7XG4gICAgICByZXR1cm4gSUxMX0ZPUk1FRF9VTklDT0RFICYmIHR5cGVvZiByZXN1bHQgPT0gJ3N0cmluZycgPyByZXBsYWNlKHJlc3VsdCwgdGVzdGVyLCBmaXhJbGxGb3JtZWQpIDogcmVzdWx0O1xuICAgIH1cbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJyk7XG5cbi8vIEpTT05bQEB0b1N0cmluZ1RhZ10gcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtanNvbi1AQHRvc3RyaW5ndGFnXG5zZXRUb1N0cmluZ1RhZyhnbG9iYWxUaGlzLkpTT04sICdKU09OJywgdHJ1ZSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY29sbGVjdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uJyk7XG52YXIgY29sbGVjdGlvblN0cm9uZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLXN0cm9uZycpO1xuXG4vLyBgTWFwYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXAtb2JqZWN0c1xuY29sbGVjdGlvbignTWFwJywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpIHsgcmV0dXJuIGluaXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCBjb2xsZWN0aW9uU3Ryb25nKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBNYXBIZWxwZXJzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL21hcC1oZWxwZXJzJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxudmFyIE1hcCA9IE1hcEhlbHBlcnMuTWFwO1xudmFyIGhhcyA9IE1hcEhlbHBlcnMuaGFzO1xudmFyIGdldCA9IE1hcEhlbHBlcnMuZ2V0O1xudmFyIHNldCA9IE1hcEhlbHBlcnMuc2V0O1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxudmFyIERPRVNfTk9UX1dPUktfV0lUSF9QUklNSVRJVkVTID0gSVNfUFVSRSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBNYXAuZ3JvdXBCeSgnYWInLCBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaXQ7XG4gIH0pLmdldCgnYScpLmxlbmd0aCAhPT0gMTtcbn0pO1xuXG4vLyBgTWFwLmdyb3VwQnlgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXJyYXktZ3JvdXBpbmdcbiQoeyB0YXJnZXQ6ICdNYXAnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfHwgRE9FU19OT1RfV09SS19XSVRIX1BSSU1JVElWRVMgfSwge1xuICBncm91cEJ5OiBmdW5jdGlvbiBncm91cEJ5KGl0ZW1zLCBjYWxsYmFja2ZuKSB7XG4gICAgcmVxdWlyZU9iamVjdENvZXJjaWJsZShpdGVtcyk7XG4gICAgYUNhbGxhYmxlKGNhbGxiYWNrZm4pO1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgdmFyIGsgPSAwO1xuICAgIGl0ZXJhdGUoaXRlbXMsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIGtleSA9IGNhbGxiYWNrZm4odmFsdWUsIGsrKyk7XG4gICAgICBpZiAoIWhhcyhtYXAsIGtleSkpIHNldChtYXAsIGtleSwgW3ZhbHVlXSk7XG4gICAgICBlbHNlIHB1c2goZ2V0KG1hcCwga2V5KSwgdmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXA7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbW9kdWxlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyByZXBsYWNlZCB0byBtb2R1bGUgYmVsb3dcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMubWFwLmNvbnN0cnVjdG9yJyk7XG4iLCIvLyBlbXB0eVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ3JhbE51bWJlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1pbnRlZ3JhbC1udW1iZXInKTtcblxuLy8gYE51bWJlci5pc0ludGVnZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNpbnRlZ2VyXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzSW50ZWdlcjogaXNJbnRlZ3JhbE51bWJlclxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgYXJpdHk6IDIsIGZvcmNlZDogT2JqZWN0LmFzc2lnbiAhPT0gYXNzaWduIH0sIHtcbiAgYXNzaWduOiBhc3NpZ25cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcblxuLy8gYE9iamVjdC5jcmVhdGVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuY3JlYXRlXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHtcbiAgY3JlYXRlOiBjcmVhdGVcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPYmplY3QuZGVmaW5lUHJvcGVydHkgIT09IGRlZmluZVByb3BlcnR5LCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBkZWZpbmVQcm9wZXJ0eTogZGVmaW5lUHJvcGVydHlcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJGVudHJpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5JykuZW50cmllcztcblxuLy8gYE9iamVjdC5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmVudHJpZXNcbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhPKSB7XG4gICAgcmV0dXJuICRlbnRyaWVzKE8pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBvbkZyZWV6ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLm9uRnJlZXplO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWZyZWV6ZSAtLSBzYWZlXG52YXIgJGZyZWV6ZSA9IE9iamVjdC5mcmVlemU7XG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgJGZyZWV6ZSgxKTsgfSk7XG5cbi8vIGBPYmplY3QuZnJlZXplYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmZyZWV6ZVxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUywgc2hhbTogIUZSRUVaSU5HIH0sIHtcbiAgZnJlZXplOiBmdW5jdGlvbiBmcmVlemUoaXQpIHtcbiAgICByZXR1cm4gJGZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyAkZnJlZXplKG9uRnJlZXplKGl0KSkgOiBpdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG52YXIgRk9SQ0VEID0gIURFU0NSSVBUT1JTIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKDEpOyB9KTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSW5kZXhlZE9iamVjdChpdCksIGtleSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xuXG4vLyBWOCB+IENocm9tZSAzOCBhbmQgMzkgYE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHNgIGZhaWxzIG9uIHByaW1pdGl2ZXNcbi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM0NDNcbnZhciBGT1JDRUQgPSAhTkFUSVZFX1NZTUJPTCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mKDEpOyB9KTtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlzeW1ib2xzXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkge1xuICAgIHZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyAkZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRvT2JqZWN0KGl0KSkgOiBbXTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIG5hdGl2ZUdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlcicpO1xuXG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgbmF0aXZlR2V0UHJvdG90eXBlT2YoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTLCBzaGFtOiAhQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSIH0sIHtcbiAgZ2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKGl0KSB7XG4gICAgcmV0dXJuIG5hdGl2ZUdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7XG4gIH1cbn0pO1xuXG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBuYXRpdmVLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IG5hdGl2ZUtleXMoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Qua2V5c1xuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUyB9LCB7XG4gIGtleXM6IGZ1bmN0aW9uIGtleXMoaXQpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyh0b09iamVjdChpdCkpO1xuICB9XG59KTtcbiIsIi8vIGVtcHR5XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludCcpO1xuXG4vLyBgcGFyc2VJbnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wYXJzZWludC1zdHJpbmctcmFkaXhcbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogcGFyc2VJbnQgIT09ICRwYXJzZUludCB9LCB7XG4gIHBhcnNlSW50OiAkcGFyc2VJbnRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1zdGF0aWNzLWluY29ycmVjdC1pdGVyYXRpb24nKTtcblxuLy8gYFByb21pc2UuYWxsU2V0dGxlZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UuYWxsc2V0dGxlZFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgYWxsU2V0dGxlZDogZnVuY3Rpb24gYWxsU2V0dGxlZChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWU6IHZhbHVlIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB7IHN0YXR1czogJ3JlamVjdGVkJywgcmVhc29uOiBlcnJvciB9O1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCcpO1xudmFyIGFDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWNhbGxhYmxlJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uJyk7XG5cbi8vIGBQcm9taXNlLmFsbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UuYWxsXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgY2FsbCgkcHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBhQ2FsbGFibGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZScpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uJyk7XG5cbnZhciBQUk9NSVNFX0FOWV9FUlJPUiA9ICdObyBvbmUgcHJvbWlzZSByZXNvbHZlZCc7XG5cbi8vIGBQcm9taXNlLmFueWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UuYW55XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICBhbnk6IGZ1bmN0aW9uIGFueShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgQWdncmVnYXRlRXJyb3IgPSBnZXRCdWlsdEluKCdBZ2dyZWdhdGVFcnJvcicpO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgZXJyb3JzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIHZhciBhbHJlYWR5UmVzb2x2ZWQgPSBmYWxzZTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlSZWplY3RlZCA9IGZhbHNlO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgY2FsbChwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmIChhbHJlYWR5UmVqZWN0ZWQgfHwgYWxyZWFkeVJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeVJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBlcnJvcnNbaW5kZXhdID0gZXJyb3I7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIFBST01JU0VfQU5ZX0VSUk9SKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZWplY3QobmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgUFJPTUlTRV9BTllfRVJST1IpKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uJykuQ09OU1RSVUNUT1I7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yJyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcblxudmFyIE5hdGl2ZVByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgJiYgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuLy8gYFByb21pc2UucHJvdG90eXBlLmNhdGNoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IsIHJlYWw6IHRydWUgfSwge1xuICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgfVxufSk7XG5cbi8vIG1ha2VzIHN1cmUgdGhhdCBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzIGBQcm9taXNlI2NhdGNoYCBwcm9wZXJseSB3b3JrcyB3aXRoIHBhdGNoZWQgYFByb21pc2UjdGhlbmBcbmlmICghSVNfUFVSRSAmJiBpc0NhbGxhYmxlKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcikpIHtcbiAgdmFyIG1ldGhvZCA9IGdldEJ1aWx0SW4oJ1Byb21pc2UnKS5wcm90b3R5cGVbJ2NhdGNoJ107XG4gIGlmIChOYXRpdmVQcm9taXNlUHJvdG90eXBlWydjYXRjaCddICE9PSBtZXRob2QpIHtcbiAgICBkZWZpbmVCdWlsdEluKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICdjYXRjaCcsIG1ldGhvZCwgeyB1bnNhZmU6IHRydWUgfSk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIElTX05PREUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW52aXJvbm1lbnQtaXMtbm9kZScpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwnKTtcbnZhciBkZWZpbmVCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBpc0NhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1pbnN0YW5jZScpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9taWNyb3Rhc2snKTtcbnZhciBob3N0UmVwb3J0RXJyb3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycycpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIFF1ZXVlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3F1ZXVlJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvcicpO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvckRldGVjdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbicpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgPSBQcm9taXNlQ29uc3RydWN0b3JEZXRlY3Rpb24uQ09OU1RSVUNUT1I7XG52YXIgTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UID0gUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uLlJFSkVDVElPTl9FVkVOVDtcbnZhciBOQVRJVkVfUFJPTUlTRV9TVUJDTEFTU0lORyA9IFByb21pc2VDb25zdHJ1Y3RvckRldGVjdGlvbi5TVUJDTEFTU0lORztcbnZhciBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFBST01JU0UpO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yID0gTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yO1xudmFyIFByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlUHJvdG90eXBlO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbFRoaXMuVHlwZUVycm9yO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudDtcbnZhciBwcm9jZXNzID0gZ2xvYmFsVGhpcy5wcm9jZXNzO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjtcbnZhciBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eTtcblxudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsVGhpcy5kaXNwYXRjaEV2ZW50KTtcbnZhciBVTkhBTkRMRURfUkVKRUNUSU9OID0gJ3VuaGFuZGxlZHJlamVjdGlvbic7XG52YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7XG52YXIgUEVORElORyA9IDA7XG52YXIgRlVMRklMTEVEID0gMTtcbnZhciBSRUpFQ1RFRCA9IDI7XG52YXIgSEFORExFRCA9IDE7XG52YXIgVU5IQU5ETEVEID0gMjtcblxudmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXIsIG5hdGl2ZVRoZW47XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIGlzQ2FsbGFibGUodGhlbiA9IGl0LnRoZW4pID8gdGhlbiA6IGZhbHNlO1xufTtcblxudmFyIGNhbGxSZWFjdGlvbiA9IGZ1bmN0aW9uIChyZWFjdGlvbiwgc3RhdGUpIHtcbiAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gIHZhciBvayA9IHN0YXRlLnN0YXRlID09PSBGVUxGSUxMRUQ7XG4gIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWw7XG4gIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgdmFyIGRvbWFpbiA9IHJlYWN0aW9uLmRvbWFpbjtcbiAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICB0cnkge1xuICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICBpZiAoIW9rKSB7XG4gICAgICAgIGlmIChzdGF0ZS5yZWplY3Rpb24gPT09IFVOSEFORExFRCkgb25IYW5kbGVVbmhhbmRsZWQoc3RhdGUpO1xuICAgICAgICBzdGF0ZS5yZWplY3Rpb24gPSBIQU5ETEVEO1xuICAgICAgfVxuICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gY2FuIHRocm93XG4gICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgY2FsbCh0aGVuLCByZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICByZWplY3QoZXJyb3IpO1xuICB9XG59O1xuXG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHN0YXRlLCBpc1JlamVjdCkge1xuICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjtcbiAgc3RhdGUubm90aWZpZWQgPSB0cnVlO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgIHZhciByZWFjdGlvbnMgPSBzdGF0ZS5yZWFjdGlvbnM7XG4gICAgdmFyIHJlYWN0aW9uO1xuICAgIHdoaWxlIChyZWFjdGlvbiA9IHJlYWN0aW9ucy5nZXQoKSkge1xuICAgICAgY2FsbFJlYWN0aW9uKHJlYWN0aW9uLCBzdGF0ZSk7XG4gICAgfVxuICAgIHN0YXRlLm5vdGlmaWVkID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFzdGF0ZS5yZWplY3Rpb24pIG9uVW5oYW5kbGVkKHN0YXRlKTtcbiAgfSk7XG59O1xuXG52YXIgZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChuYW1lLCBwcm9taXNlLCByZWFzb24pIHtcbiAgdmFyIGV2ZW50LCBoYW5kbGVyO1xuICBpZiAoRElTUEFUQ0hfRVZFTlQpIHtcbiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2ZW50LnByb21pc2UgPSBwcm9taXNlO1xuICAgIGV2ZW50LnJlYXNvbiA9IHJlYXNvbjtcbiAgICBldmVudC5pbml0RXZlbnQobmFtZSwgZmFsc2UsIHRydWUpO1xuICAgIGdsb2JhbFRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTtcbiAgaWYgKCFOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQgJiYgKGhhbmRsZXIgPSBnbG9iYWxUaGlzWydvbicgKyBuYW1lXSkpIGhhbmRsZXIoZXZlbnQpO1xuICBlbHNlIGlmIChuYW1lID09PSBVTkhBTkRMRURfUkVKRUNUSU9OKSBob3N0UmVwb3J0RXJyb3JzKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCByZWFzb24pO1xufTtcblxudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIGNhbGwodGFzaywgZ2xvYmFsVGhpcywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIHZhciB2YWx1ZSA9IHN0YXRlLnZhbHVlO1xuICAgIHZhciBJU19VTkhBTkRMRUQgPSBpc1VuaGFuZGxlZChzdGF0ZSk7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZiAoSVNfVU5IQU5ETEVEKSB7XG4gICAgICByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKElTX05PREUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGRpc3BhdGNoRXZlbnQoVU5IQU5ETEVEX1JFSkVDVElPTiwgcHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgc3RhdGUucmVqZWN0aW9uID0gSVNfTk9ERSB8fCBpc1VuaGFuZGxlZChzdGF0ZSkgPyBVTkhBTkRMRUQgOiBIQU5ETEVEO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikgdGhyb3cgcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLnJlamVjdGlvbiAhPT0gSEFORExFRCAmJiAhc3RhdGUucGFyZW50O1xufTtcblxudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIGNhbGwodGFzaywgZ2xvYmFsVGhpcywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkoc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlLmZhY2FkZSA9PT0gdmFsdWUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICB2YXIgdGhlbiA9IGlzVGhlbmFibGUodmFsdWUpO1xuICAgIGlmICh0aGVuKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYWxsKHRoZW4sIHZhbHVlLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlc29sdmUsIHdyYXBwZXIsIHN0YXRlKSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZWplY3QsIHdyYXBwZXIsIHN0YXRlKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaW50ZXJuYWxSZWplY3Qod3JhcHBlciwgZXJyb3IsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgICBzdGF0ZS5zdGF0ZSA9IEZVTEZJTExFRDtcbiAgICAgIG5vdGlmeShzdGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbnRlcm5hbFJlamVjdCh7IGRvbmU6IGZhbHNlIH0sIGVycm9yLCBzdGF0ZSk7XG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZVByb3RvdHlwZSk7XG4gICAgYUNhbGxhYmxlKGV4ZWN1dG9yKTtcbiAgICBjYWxsKEludGVybmFsLCB0aGlzKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoYmluZChpbnRlcm5hbFJlc29sdmUsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaW50ZXJuYWxSZWplY3Qoc3RhdGUsIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgUHJvbWlzZVByb3RvdHlwZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBQUk9NSVNFLFxuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICBub3RpZmllZDogZmFsc2UsXG4gICAgICBwYXJlbnQ6IGZhbHNlLFxuICAgICAgcmVhY3Rpb25zOiBuZXcgUXVldWUoKSxcbiAgICAgIHJlamVjdGlvbjogZmFsc2UsXG4gICAgICBzdGF0ZTogUEVORElORyxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfTtcblxuICAvLyBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUudGhlblxuICBJbnRlcm5hbC5wcm90b3R5cGUgPSBkZWZpbmVCdWlsdEluKFByb21pc2VQcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IpKTtcbiAgICBzdGF0ZS5wYXJlbnQgPSB0cnVlO1xuICAgIHJlYWN0aW9uLm9rID0gaXNDYWxsYWJsZShvbkZ1bGZpbGxlZCkgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgcmVhY3Rpb24uZmFpbCA9IGlzQ2FsbGFibGUob25SZWplY3RlZCkgJiYgb25SZWplY3RlZDtcbiAgICByZWFjdGlvbi5kb21haW4gPSBJU19OT0RFID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXRlLnN0YXRlID09PSBQRU5ESU5HKSBzdGF0ZS5yZWFjdGlvbnMuYWRkKHJlYWN0aW9uKTtcbiAgICBlbHNlIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsUmVhY3Rpb24ocmVhY3Rpb24sIHN0YXRlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgfSk7XG5cbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZShwcm9taXNlKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBzdGF0ZSk7XG4gICAgdGhpcy5yZWplY3QgPSBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSk7XG4gIH07XG5cbiAgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yIHx8IEMgPT09IFByb21pc2VXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG5cbiAgaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgbmF0aXZlVGhlbiA9IE5hdGl2ZVByb21pc2VQcm90b3R5cGUudGhlbjtcblxuICAgIGlmICghTkFUSVZFX1BST01JU0VfU1VCQ0xBU1NJTkcpIHtcbiAgICAgIC8vIG1ha2UgYFByb21pc2UjdGhlbmAgcmV0dXJuIGEgcG9seWZpbGxlZCBgUHJvbWlzZWAgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ3RoZW4nLCBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlQ29uc3RydWN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGNhbGwobmF0aXZlVGhlbiwgdGhhdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNjQwXG4gICAgICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIGAuY29uc3RydWN0b3IgPT09IFByb21pc2VgIHdvcmsgZm9yIG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXNcbiAgICB0cnkge1xuICAgICAgZGVsZXRlIE5hdGl2ZVByb21pc2VQcm90b3R5cGUuY29uc3RydWN0b3I7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG4gICAgLy8gbWFrZSBgaW5zdGFuY2VvZiBQcm9taXNlYCB3b3JrIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICBzZXRQcm90b3R5cGVPZihOYXRpdmVQcm9taXNlUHJvdG90eXBlLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIHdyYXA6IHRydWUsIGZvcmNlZDogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3InKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1jYWxsYWJsZScpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgZGVmaW5lQnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4nKTtcblxudmFyIE5hdGl2ZVByb21pc2VQcm90b3R5cGUgPSBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgJiYgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuLy8gU2FmYXJpIGJ1ZyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAwODI5XG52YXIgTk9OX0dFTkVSSUMgPSAhIU5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXRoZW5hYmxlIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIE5hdGl2ZVByb21pc2VQcm90b3R5cGVbJ2ZpbmFsbHknXS5jYWxsKHsgdGhlbjogZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9IH0sIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuLy8gYFByb21pc2UucHJvdG90eXBlLmZpbmFsbHlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5maW5hbGx5XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IE5PTl9HRU5FUklDIH0sIHtcbiAgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgZ2V0QnVpbHRJbignUHJvbWlzZScpKTtcbiAgICB2YXIgaXNGdW5jdGlvbiA9IGlzQ2FsbGFibGUob25GaW5hbGx5KTtcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHksXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5XG4gICAgKTtcbiAgfVxufSk7XG5cbi8vIG1ha2VzIHN1cmUgdGhhdCBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzIGBQcm9taXNlI2ZpbmFsbHlgIHByb3Blcmx5IHdvcmtzIHdpdGggcGF0Y2hlZCBgUHJvbWlzZSN0aGVuYFxuaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKSkge1xuICB2YXIgbWV0aG9kID0gZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnZmluYWxseSddO1xuICBpZiAoTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnZmluYWxseSddICE9PSBtZXRob2QpIHtcbiAgICBkZWZpbmVCdWlsdEluKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICdmaW5hbGx5JywgbWV0aG9kLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbW9kdWxlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyBzcGxpdCB0byBtb2R1bGVzIGxpc3RlZCBiZWxvd1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UuYWxsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UuY2F0Y2gnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMucHJvbWlzZS5yYWNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UucmVqZWN0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnByb21pc2UucmVzb2x2ZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgYUNhbGxhYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1zdGF0aWNzLWluY29ycmVjdC1pdGVyYXRpb24nKTtcblxuLy8gYFByb21pc2UucmFjZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IFBST01JU0VfU1RBVElDU19JTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhQ2FsbGFibGUoQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIGNhbGwoJHByb21pc2VSZXNvbHZlLCBDLCBwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uJykuQ09OU1RSVUNUT1I7XG5cbi8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfSwge1xuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKHRoaXMpO1xuICAgIHZhciBjYXBhYmlsaXR5UmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgY2FwYWJpbGl0eVJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yJyk7XG52YXIgRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKS5DT05TVFJVQ1RPUjtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUnKTtcblxudmFyIFByb21pc2VDb25zdHJ1Y3RvcldyYXBwZXIgPSBnZXRCdWlsdEluKCdQcm9taXNlJyk7XG52YXIgQ0hFQ0tfV1JBUFBFUiA9IElTX1BVUkUgJiYgIUZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SO1xuXG4vLyBgUHJvbWlzZS5yZXNvbHZlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZXNvbHZlXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiB9LCB7XG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDSEVDS19XUkFQUEVSICYmIHRoaXMgPT09IFByb21pc2VDb25zdHJ1Y3RvcldyYXBwZXIgPyBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbi8vIGBQcm9taXNlLndpdGhSZXNvbHZlcnNgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS13aXRoLXJlc29sdmVyc1xuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHtcbiAgd2l0aFJlc29sdmVyczogZnVuY3Rpb24gd2l0aFJlc29sdmVycygpIHtcbiAgICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKHRoaXMpO1xuICAgIHJldHVybiB7XG4gICAgICBwcm9taXNlOiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlLFxuICAgICAgcmVzb2x2ZTogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSxcbiAgICAgIHJlamVjdDogcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0XG4gICAgfTtcbiAgfVxufSk7XG4iLCIvLyBlbXB0eVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNvbGxlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpO1xudmFyIGNvbGxlY3Rpb25TdHJvbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gYFNldGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LW9iamVjdHNcbmNvbGxlY3Rpb24oJ1NldCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBTZXQoKSB7IHJldHVybiBpbml0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgY29sbGVjdGlvblN0cm9uZyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBkaWZmZXJlbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1kaWZmZXJlbmNlJyk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtbWV0aG9kLWFjY2VwdC1zZXQtbGlrZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5kaWZmZXJlbmNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ2RpZmZlcmVuY2UnKSB9LCB7XG4gIGRpZmZlcmVuY2U6IGRpZmZlcmVuY2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBpbnRlcnNlY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWludGVyc2VjdGlvbicpO1xudmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LW1ldGhvZC1hY2NlcHQtc2V0LWxpa2UnKTtcblxudmFyIElOQ09SUkVDVCA9ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpbnRlcnNlY3Rpb24nKSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tLCBlcy9uby1zZXQgLS0gdGVzdGluZ1xuICByZXR1cm4gU3RyaW5nKEFycmF5LmZyb20obmV3IFNldChbMSwgMiwgM10pLmludGVyc2VjdGlvbihuZXcgU2V0KFszLCAyXSkpKSkgIT09ICczLDInO1xufSk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmludGVyc2VjdGlvbmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVCB9LCB7XG4gIGludGVyc2VjdGlvbjogaW50ZXJzZWN0aW9uXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzRGlzam9pbnRGcm9tID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1pcy1kaXNqb2ludC1mcm9tJyk7XG52YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtbWV0aG9kLWFjY2VwdC1zZXQtbGlrZScpO1xuXG4vLyBgU2V0LnByb3RvdHlwZS5pc0Rpc2pvaW50RnJvbWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpc0Rpc2pvaW50RnJvbScpIH0sIHtcbiAgaXNEaXNqb2ludEZyb206IGlzRGlzam9pbnRGcm9tXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzU3Vic2V0T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWlzLXN1YnNldC1vZicpO1xudmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LW1ldGhvZC1hY2NlcHQtc2V0LWxpa2UnKTtcblxuLy8gYFNldC5wcm90b3R5cGUuaXNTdWJzZXRPZmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpc1N1YnNldE9mJykgfSwge1xuICBpc1N1YnNldE9mOiBpc1N1YnNldE9mXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzU3VwZXJzZXRPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtaXMtc3VwZXJzZXQtb2YnKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLmlzU3VwZXJzZXRPZmAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kc1xuJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpc1N1cGVyc2V0T2YnKSB9LCB7XG4gIGlzU3VwZXJzZXRPZjogaXNTdXBlcnNldE9mXG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnNldC5jb25zdHJ1Y3RvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgc3ltbWV0cmljRGlmZmVyZW5jZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtc3ltbWV0cmljLWRpZmZlcmVuY2UnKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLnN5bW1ldHJpY0RpZmZlcmVuY2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHNcbiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgnc3ltbWV0cmljRGlmZmVyZW5jZScpIH0sIHtcbiAgc3ltbWV0cmljRGlmZmVyZW5jZTogc3ltbWV0cmljRGlmZmVyZW5jZVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdW5pb24nKTtcbnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1tZXRob2QtYWNjZXB0LXNldC1saWtlJyk7XG5cbi8vIGBTZXQucHJvdG90eXBlLnVuaW9uYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXNldC1tZXRob2RzXG4kKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ3VuaW9uJykgfSwge1xuICB1bmlvbjogdW5pb25cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgbm90QVJlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ub3QtYS1yZWdleHAnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJyk7XG5cbnZhciBzdHJpbmdJbmRleE9mID0gdW5jdXJyeVRoaXMoJycuaW5kZXhPZik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc1xuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFjb3JyZWN0SXNSZWdFeHBMb2dpYygnaW5jbHVkZXMnKSB9LCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICByZXR1cm4gISF+c3RyaW5nSW5kZXhPZihcbiAgICAgIHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpLFxuICAgICAgdG9TdHJpbmcobm90QVJlZ0V4cChzZWFyY2hTdHJpbmcpKSxcbiAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2hhckF0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUnKS5jaGFyQXQ7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZScpO1xudmFyIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXItcmVzdWx0LW9iamVjdCcpO1xuXG52YXIgU1RSSU5HX0lURVJBVE9SID0gJ1N0cmluZyBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IHRvU3RyaW5nKGl0ZXJhdGVkKSxcbiAgICBpbmRleDogMFxuICB9KTtcbi8vIGAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lc3RyaW5naXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciBzdHJpbmcgPSBzdGF0ZS5zdHJpbmc7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4O1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBzdHJpbmcubGVuZ3RoKSByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdCh1bmRlZmluZWQsIHRydWUpO1xuICBwb2ludCA9IGNoYXJBdChzdHJpbmcsIGluZGV4KTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdChwb2ludCwgZmFsc2UpO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB1bmN1cnJ5VGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXN0cmluZycpO1xudmFyIG5vdEFSZWdFeHAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbm90LWEtcmVnZXhwJyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciBjb3JyZWN0SXNSZWdFeHBMb2dpYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYycpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgbWluID0gTWF0aC5taW47XG5cbnZhciBDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyA9IGNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdzdGFydHNXaXRoJyk7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9wdWxsLzcwMlxudmFyIE1ETl9QT0xZRklMTF9CVUcgPSAhSVNfUFVSRSAmJiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgJiYgISFmdW5jdGlvbiAoKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZy5wcm90b3R5cGUsICdzdGFydHNXaXRoJyk7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLndyaXRhYmxlO1xufSgpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdGFydHN3aXRoXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIU1ETl9QT0xZRklMTF9CVUcgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDIH0sIHtcbiAgc3RhcnRzV2l0aDogZnVuY3Rpb24gc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICB2YXIgdGhhdCA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTtcbiAgICB2YXIgaW5kZXggPSB0b0xlbmd0aChtaW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7XG4gICAgdmFyIHNlYXJjaCA9IHRvU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuIHN0cmluZ1NsaWNlKHRoYXQsIGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5hc3luY0l0ZXJhdG9yYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuYXN5bmNpdGVyYXRvclxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdhc3luY0l0ZXJhdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBOQVRJVkVfU1lNQk9MID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24nKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGhhc093biA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5Jyk7XG52YXIgaXNQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXknKTtcbnZhciAkdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgbmF0aXZlT2JqZWN0Q3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCcpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllc01vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluJyk7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvcicpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC13cmFwcGVkJyk7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xudmFyIGRlZmluZVN5bWJvbFRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1kZWZpbmUtdG8tcHJpbWl0aXZlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgJGZvckVhY2ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uJykuZm9yRWFjaDtcblxudmFyIEhJRERFTiA9IHNoYXJlZEtleSgnaGlkZGVuJyk7XG52YXIgU1lNQk9MID0gJ1N5bWJvbCc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNZTUJPTCk7XG5cbnZhciBPYmplY3RQcm90b3R5cGUgPSBPYmplY3RbUFJPVE9UWVBFXTtcbnZhciAkU3ltYm9sID0gZ2xvYmFsVGhpcy5TeW1ib2w7XG52YXIgU3ltYm9sUHJvdG90eXBlID0gJFN5bWJvbCAmJiAkU3ltYm9sW1BST1RPVFlQRV07XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbFRoaXMuUmFuZ2VFcnJvcjtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWxUaGlzLlR5cGVFcnJvcjtcbnZhciBRT2JqZWN0ID0gZ2xvYmFsVGhpcy5RT2JqZWN0O1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xudmFyIG5hdGl2ZURlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmY7XG52YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxudmFyIEFsbFN5bWJvbHMgPSBzaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPYmplY3RQcm90b3R5cGVTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7XG52YXIgV2VsbEtub3duU3ltYm9sc1N0b3JlID0gc2hhcmVkKCd3a3MnKTtcblxuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgVVNFX1NFVFRFUiA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIGZhbGxiYWNrRGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAoTywgUCwgQXR0cmlidXRlcykge1xuICB2YXIgT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvciA9IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3RQcm90b3R5cGUsIFApO1xuICBpZiAoT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvcikgZGVsZXRlIE9iamVjdFByb3RvdHlwZVtQXTtcbiAgbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gIGlmIChPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yICYmIE8gIT09IE9iamVjdFByb3RvdHlwZSkge1xuICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KE9iamVjdFByb3RvdHlwZSwgUCwgT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvcik7XG4gIH1cbn07XG5cbnZhciBzZXRTeW1ib2xEZXNjcmlwdG9yID0gREVTQ1JJUFRPUlMgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0Q3JlYXRlKG5hdGl2ZURlZmluZVByb3BlcnR5KHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KHRoaXMsICdhJywgeyB2YWx1ZTogNyB9KS5hOyB9XG4gIH0pKS5hICE9PSA3O1xufSkgPyBmYWxsYmFja0RlZmluZVByb3BlcnR5IDogbmF0aXZlRGVmaW5lUHJvcGVydHk7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24gKHRhZywgZGVzY3JpcHRpb24pIHtcbiAgdmFyIHN5bWJvbCA9IEFsbFN5bWJvbHNbdGFnXSA9IG5hdGl2ZU9iamVjdENyZWF0ZShTeW1ib2xQcm90b3R5cGUpO1xuICBzZXRJbnRlcm5hbFN0YXRlKHN5bWJvbCwge1xuICAgIHR5cGU6IFNZTUJPTCxcbiAgICB0YWc6IHRhZyxcbiAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb25cbiAgfSk7XG4gIGlmICghREVTQ1JJUFRPUlMpIHN5bWJvbC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICByZXR1cm4gc3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgaWYgKE8gPT09IE9iamVjdFByb3RvdHlwZSkgJGRlZmluZVByb3BlcnR5KE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIFAsIEF0dHJpYnV0ZXMpO1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleSA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoaGFzT3duKEFsbFN5bWJvbHMsIGtleSkpIHtcbiAgICBpZiAoIUF0dHJpYnV0ZXMuZW51bWVyYWJsZSkge1xuICAgICAgaWYgKCFoYXNPd24oTywgSElEREVOKSkgbmF0aXZlRGVmaW5lUHJvcGVydHkoTywgSElEREVOLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmF0aXZlT2JqZWN0Q3JlYXRlKG51bGwpKSk7XG4gICAgICBPW0hJRERFTl1ba2V5XSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoYXNPd24oTywgSElEREVOKSAmJiBPW0hJRERFTl1ba2V5XSkgT1tISURERU5dW2tleV0gPSBmYWxzZTtcbiAgICAgIEF0dHJpYnV0ZXMgPSBuYXRpdmVPYmplY3RDcmVhdGUoQXR0cmlidXRlcywgeyBlbnVtZXJhYmxlOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgZmFsc2UpIH0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2NyaXB0b3IoTywga2V5LCBBdHRyaWJ1dGVzKTtcbiAgfSByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoTywga2V5LCBBdHRyaWJ1dGVzKTtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIHByb3BlcnRpZXMgPSB0b0luZGV4ZWRPYmplY3QoUHJvcGVydGllcyk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhwcm9wZXJ0aWVzKS5jb25jYXQoJGdldE93blByb3BlcnR5U3ltYm9scyhwcm9wZXJ0aWVzKSk7XG4gICRmb3JFYWNoKGtleXMsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoIURFU0NSSVBUT1JTIHx8IGNhbGwoJHByb3BlcnR5SXNFbnVtZXJhYmxlLCBwcm9wZXJ0aWVzLCBrZXkpKSAkZGVmaW5lUHJvcGVydHkoTywga2V5LCBwcm9wZXJ0aWVzW2tleV0pO1xuICB9KTtcbiAgcmV0dXJuIE87XG59O1xuXG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyBuYXRpdmVPYmplY3RDcmVhdGUoTykgOiAkZGVmaW5lUHJvcGVydGllcyhuYXRpdmVPYmplY3RDcmVhdGUoTyksIFByb3BlcnRpZXMpO1xufTtcblxudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIFAgPSB0b1Byb3BlcnR5S2V5KFYpO1xuICB2YXIgZW51bWVyYWJsZSA9IGNhbGwobmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUsIHRoaXMsIFApO1xuICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG90eXBlICYmIGhhc093bihBbGxTeW1ib2xzLCBQKSAmJiAhaGFzT3duKE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIFApKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlbnVtZXJhYmxlIHx8ICFoYXNPd24odGhpcywgUCkgfHwgIWhhc093bihBbGxTeW1ib2xzLCBQKSB8fCBoYXNPd24odGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1bUF1cbiAgICA/IGVudW1lcmFibGUgOiB0cnVlO1xufTtcblxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICB2YXIgaXQgPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIHZhciBrZXkgPSB0b1Byb3BlcnR5S2V5KFApO1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvdHlwZSAmJiBoYXNPd24oQWxsU3ltYm9scywga2V5KSAmJiAhaGFzT3duKE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIGtleSkpIHJldHVybjtcbiAgdmFyIGRlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSk7XG4gIGlmIChkZXNjcmlwdG9yICYmIGhhc093bihBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzT3duKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIHtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuICB9XG4gIHJldHVybiBkZXNjcmlwdG9yO1xufTtcblxudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHZhciBuYW1lcyA9IG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXModG9JbmRleGVkT2JqZWN0KE8pKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICAkZm9yRWFjaChuYW1lcywgZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICghaGFzT3duKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhc093bihoaWRkZW5LZXlzLCBrZXkpKSBwdXNoKHJlc3VsdCwga2V5KTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG52YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIChPKSB7XG4gIHZhciBJU19PQkpFQ1RfUFJPVE9UWVBFID0gTyA9PT0gT2JqZWN0UHJvdG90eXBlO1xuICB2YXIgbmFtZXMgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKElTX09CSkVDVF9QUk9UT1RZUEUgPyBPYmplY3RQcm90b3R5cGVTeW1ib2xzIDogdG9JbmRleGVkT2JqZWN0KE8pKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICAkZm9yRWFjaChuYW1lcywgZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChoYXNPd24oQWxsU3ltYm9scywga2V5KSAmJiAoIUlTX09CSkVDVF9QUk9UT1RZUEUgfHwgaGFzT3duKE9iamVjdFByb3RvdHlwZSwga2V5KSkpIHtcbiAgICAgIHB1c2gocmVzdWx0LCBBbGxTeW1ib2xzW2tleV0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBgU3ltYm9sYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wtY29uc3RydWN0b3JcbmlmICghTkFUSVZFX1NZTUJPTCkge1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuICAgIGlmIChpc1Byb3RvdHlwZU9mKFN5bWJvbFByb3RvdHlwZSwgdGhpcykpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xuICAgIHZhciBkZXNjcmlwdGlvbiA9ICFhcmd1bWVudHMubGVuZ3RoIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogJHRvU3RyaW5nKGFyZ3VtZW50c1swXSk7XG4gICAgdmFyIHRhZyA9IHVpZChkZXNjcmlwdGlvbik7XG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyICR0aGlzID0gdGhpcyA9PT0gdW5kZWZpbmVkID8gZ2xvYmFsVGhpcyA6IHRoaXM7XG4gICAgICBpZiAoJHRoaXMgPT09IE9iamVjdFByb3RvdHlwZSkgY2FsbChzZXR0ZXIsIE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIHZhbHVlKTtcbiAgICAgIGlmIChoYXNPd24oJHRoaXMsIEhJRERFTikgJiYgaGFzT3duKCR0aGlzW0hJRERFTl0sIHRhZykpICR0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0U3ltYm9sRGVzY3JpcHRvcigkdGhpcywgdGFnLCBkZXNjcmlwdG9yKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICBmYWxsYmFja0RlZmluZVByb3BlcnR5KCR0aGlzLCB0YWcsIGRlc2NyaXB0b3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKERFU0NSSVBUT1JTICYmIFVTRV9TRVRURVIpIHNldFN5bWJvbERlc2NyaXB0b3IoT2JqZWN0UHJvdG90eXBlLCB0YWcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6IHNldHRlciB9KTtcbiAgICByZXR1cm4gd3JhcCh0YWcsIGRlc2NyaXB0aW9uKTtcbiAgfTtcblxuICBTeW1ib2xQcm90b3R5cGUgPSAkU3ltYm9sW1BST1RPVFlQRV07XG5cbiAgZGVmaW5lQnVpbHRJbihTeW1ib2xQcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnRhZztcbiAgfSk7XG5cbiAgZGVmaW5lQnVpbHRJbigkU3ltYm9sLCAnd2l0aG91dFNldHRlcicsIGZ1bmN0aW9uIChkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiB3cmFwKHVpZChkZXNjcmlwdGlvbiksIGRlc2NyaXB0aW9uKTtcbiAgfSk7XG5cbiAgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZiA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgZGVmaW5lUHJvcGVydGllc01vZHVsZS5mID0gJGRlZmluZVByb3BlcnRpZXM7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mID0gZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsLmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUuZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHdyYXAod2VsbEtub3duU3ltYm9sKG5hbWUpLCBuYW1lKTtcbiAgfTtcblxuICBpZiAoREVTQ1JJUFRPUlMpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1TeW1ib2wtZGVzY3JpcHRpb25cbiAgICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoU3ltYm9sUHJvdG90eXBlLCAnZGVzY3JpcHRpb24nLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5kZXNjcmlwdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIUlTX1BVUkUpIHtcbiAgICAgIGRlZmluZUJ1aWx0SW4oT2JqZWN0UHJvdG90eXBlLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHsgdW5zYWZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4kKHsgZ2xvYmFsOiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwgc2hhbTogIU5BVElWRV9TWU1CT0wgfSwge1xuICBTeW1ib2w6ICRTeW1ib2xcbn0pO1xuXG4kZm9yRWFjaChvYmplY3RLZXlzKFdlbGxLbm93blN5bWJvbHNTdG9yZSksIGZ1bmN0aW9uIChuYW1lKSB7XG4gIGRlZmluZVdlbGxLbm93blN5bWJvbChuYW1lKTtcbn0pO1xuXG4kKHsgdGFyZ2V0OiBTWU1CT0wsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9TWU1CT0wgfSwge1xuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgVVNFX1NFVFRFUiA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeyBVU0VfU0VUVEVSID0gZmFsc2U7IH1cbn0pO1xuXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCwgc2hhbTogIURFU0NSSVBUT1JTIH0sIHtcbiAgLy8gYE9iamVjdC5jcmVhdGVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydHlcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllc1xuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvclxufSk7XG5cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHluYW1lc1xuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lc1xufSk7XG5cbi8vIGBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvcHJpbWl0aXZlXG5kZWZpbmVTeW1ib2xUb1ByaW1pdGl2ZSgpO1xuXG4vLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXWAgcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvc3RyaW5ndGFnXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCBTWU1CT0wpO1xuXG5oaWRkZW5LZXlzW0hJRERFTl0gPSB0cnVlO1xuIiwiLy8gZW1wdHlcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1zdHJpbmcnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgTkFUSVZFX1NZTUJPTF9SRUdJU1RSWSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtcmVnaXN0cnktZGV0ZWN0aW9uJyk7XG5cbnZhciBTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5Jyk7XG52YXIgU3ltYm9sVG9TdHJpbmdSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXRvLXN0cmluZy1yZWdpc3RyeScpO1xuXG4vLyBgU3ltYm9sLmZvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5mb3JcbiQoeyB0YXJnZXQ6ICdTeW1ib2wnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MX1JFR0lTVFJZIH0sIHtcbiAgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgc3RyaW5nID0gdG9TdHJpbmcoa2V5KTtcbiAgICBpZiAoaGFzT3duKFN0cmluZ1RvU3ltYm9sUmVnaXN0cnksIHN0cmluZykpIHJldHVybiBTdHJpbmdUb1N5bWJvbFJlZ2lzdHJ5W3N0cmluZ107XG4gICAgdmFyIHN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpKHN0cmluZyk7XG4gICAgU3RyaW5nVG9TeW1ib2xSZWdpc3RyeVtzdHJpbmddID0gc3ltYm9sO1xuICAgIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltYm9sXSA9IHN0cmluZztcbiAgICByZXR1cm4gc3ltYm9sO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuaGFzSW5zdGFuY2VgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5oYXNpbnN0YW5jZVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdoYXNJbnN0YW5jZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGVgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5pc2NvbmNhdHNwcmVhZGFibGVcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnaXNDb25jYXRTcHJlYWRhYmxlJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLml0ZXJhdG9yYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wuaXRlcmF0b3JcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3Mgc3BsaXQgdG8gbW9kdWxlcyBsaXN0ZWQgYmVsb3dcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3ltYm9sLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnN5bWJvbC5mb3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuc3ltYm9sLmtleS1mb3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1zeW1ib2wnKTtcbnZhciB0cnlUb1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90cnktdG8tc3RyaW5nJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpO1xudmFyIE5BVElWRV9TWU1CT0xfUkVHSVNUUlkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLXJlZ2lzdHJ5LWRldGVjdGlvbicpO1xuXG52YXIgU3ltYm9sVG9TdHJpbmdSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXRvLXN0cmluZy1yZWdpc3RyeScpO1xuXG4vLyBgU3ltYm9sLmtleUZvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5rZXlmb3JcbiQoeyB0YXJnZXQ6ICdTeW1ib2wnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MX1JFR0lTVFJZIH0sIHtcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBuZXcgVHlwZUVycm9yKHRyeVRvU3RyaW5nKHN5bSkgKyAnIGlzIG5vdCBhIHN5bWJvbCcpO1xuICAgIGlmIChoYXNPd24oU3ltYm9sVG9TdHJpbmdSZWdpc3RyeSwgc3ltKSkgcmV0dXJuIFN5bWJvbFRvU3RyaW5nUmVnaXN0cnlbc3ltXTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLm1hdGNoQWxsYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wubWF0Y2hhbGxcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnbWF0Y2hBbGwnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wubWF0Y2hgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5tYXRjaFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5yZXBsYWNlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wucmVwbGFjZVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdyZXBsYWNlJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLnNlYXJjaGAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnNlYXJjaFxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdzZWFyY2gnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuc3BlY2llc2Agd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnNwZWNpZXNcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5zcGxpdGAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3ltYm9sLnNwbGl0XG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwbGl0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xudmFyIGRlZmluZVN5bWJvbFRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1kZWZpbmUtdG8tcHJpbWl0aXZlJyk7XG5cbi8vIGBTeW1ib2wudG9QcmltaXRpdmVgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC50b3ByaW1pdGl2ZVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCd0b1ByaW1pdGl2ZScpO1xuXG4vLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3ByaW1pdGl2ZVxuZGVmaW5lU3ltYm9sVG9QcmltaXRpdmUoKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xuXG4vLyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9zdHJpbmd0YWdcbmRlZmluZVdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxuLy8gYFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11gIHByb3BlcnR5XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3N0cmluZ3RhZ1xuc2V0VG9TdHJpbmdUYWcoZ2V0QnVpbHRJbignU3ltYm9sJyksICdTeW1ib2wnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wudW5zY29wYWJsZXNgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC51bnNjb3BhYmxlc1xuZGVmaW5lV2VsbEtub3duU3ltYm9sKCd1bnNjb3BhYmxlcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGRlZmluZUJ1aWx0SW5zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMnKTtcbnZhciBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJyk7XG52YXIgY29sbGVjdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uJyk7XG52YXIgY29sbGVjdGlvbldlYWsgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKS5lbmZvcmNlO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlYWstbWFwLWJhc2ljLWRldGVjdGlvbicpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1pc2FycmF5IC0tIHNhZmVcbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNleHRlbnNpYmxlIC0tIHNhZmVcbnZhciBpc0V4dGVuc2libGUgPSAkT2JqZWN0LmlzRXh0ZW5zaWJsZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNmcm96ZW4gLS0gc2FmZVxudmFyIGlzRnJvemVuID0gJE9iamVjdC5pc0Zyb3plbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaXNzZWFsZWQgLS0gc2FmZVxudmFyIGlzU2VhbGVkID0gJE9iamVjdC5pc1NlYWxlZDtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZnJlZXplIC0tIHNhZmVcbnZhciBmcmVlemUgPSAkT2JqZWN0LmZyZWV6ZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qtc2VhbCAtLSBzYWZlXG52YXIgc2VhbCA9ICRPYmplY3Quc2VhbDtcblxudmFyIElTX0lFMTEgPSAhZ2xvYmFsVGhpcy5BY3RpdmVYT2JqZWN0ICYmICdBY3RpdmVYT2JqZWN0JyBpbiBnbG9iYWxUaGlzO1xudmFyIEludGVybmFsV2Vha01hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgfTtcbn07XG5cbi8vIGBXZWFrTWFwYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLWNvbnN0cnVjdG9yXG52YXIgJFdlYWtNYXAgPSBjb2xsZWN0aW9uKCdXZWFrTWFwJywgd3JhcHBlciwgY29sbGVjdGlvbldlYWspO1xudmFyIFdlYWtNYXBQcm90b3R5cGUgPSAkV2Vha01hcC5wcm90b3R5cGU7XG52YXIgbmF0aXZlU2V0ID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5zZXQpO1xuXG4vLyBDaGFrcmEgRWRnZSBidWc6IGFkZGluZyBmcm96ZW4gYXJyYXlzIHRvIFdlYWtNYXAgdW5mcmVlemUgdGhlbVxudmFyIGhhc01TRWRnZUZyZWV6aW5nQnVnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRlJFRVpJTkcgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBmcm96ZW5BcnJheSA9IGZyZWV6ZShbXSk7XG4gICAgbmF0aXZlU2V0KG5ldyAkV2Vha01hcCgpLCBmcm96ZW5BcnJheSwgMSk7XG4gICAgcmV0dXJuICFpc0Zyb3plbihmcm96ZW5BcnJheSk7XG4gIH0pO1xufTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuLy8gV2UgY2FuJ3QgdXNlIGZlYXR1cmUgZGV0ZWN0aW9uIGJlY2F1c2UgaXQgY3Jhc2ggc29tZSBvbGQgSUUgYnVpbGRzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDg1XG5pZiAoTkFUSVZFX1dFQUtfTUFQKSBpZiAoSVNfSUUxMSkge1xuICBJbnRlcm5hbFdlYWtNYXAgPSBjb2xsZWN0aW9uV2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCAnV2Vha01hcCcsIHRydWUpO1xuICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLmVuYWJsZSgpO1xuICB2YXIgbmF0aXZlRGVsZXRlID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZVsnZGVsZXRlJ10pO1xuICB2YXIgbmF0aXZlSGFzID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5oYXMpO1xuICB2YXIgbmF0aXZlR2V0ID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5nZXQpO1xuICBkZWZpbmVCdWlsdElucyhXZWFrTWFwUHJvdG90eXBlLCB7XG4gICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZURlbGV0ZSh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plblsnZGVsZXRlJ10oa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZURlbGV0ZSh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVIYXModGhpcywga2V5KSB8fCBzdGF0ZS5mcm96ZW4uaGFzKGtleSk7XG4gICAgICB9IHJldHVybiBuYXRpdmVIYXModGhpcywga2V5KTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlSGFzKHRoaXMsIGtleSkgPyBuYXRpdmVHZXQodGhpcywga2V5KSA6IHN0YXRlLmZyb3plbi5nZXQoa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZUdldCh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICBuYXRpdmVIYXModGhpcywga2V5KSA/IG5hdGl2ZVNldCh0aGlzLCBrZXksIHZhbHVlKSA6IHN0YXRlLmZyb3plbi5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgbmF0aXZlU2V0KHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9KTtcbi8vIENoYWtyYSBFZGdlIGZyb3plbiBrZXlzIGZpeFxufSBlbHNlIGlmIChoYXNNU0VkZ2VGcmVlemluZ0J1ZygpKSB7XG4gIGRlZmluZUJ1aWx0SW5zKFdlYWtNYXBQcm90b3R5cGUsIHtcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgYXJyYXlJbnRlZ3JpdHlMZXZlbDtcbiAgICAgIGlmIChpc0FycmF5KGtleSkpIHtcbiAgICAgICAgaWYgKGlzRnJvemVuKGtleSkpIGFycmF5SW50ZWdyaXR5TGV2ZWwgPSBmcmVlemU7XG4gICAgICAgIGVsc2UgaWYgKGlzU2VhbGVkKGtleSkpIGFycmF5SW50ZWdyaXR5TGV2ZWwgPSBzZWFsO1xuICAgICAgfVxuICAgICAgbmF0aXZlU2V0KHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgaWYgKGFycmF5SW50ZWdyaXR5TGV2ZWwpIGFycmF5SW50ZWdyaXR5TGV2ZWwoa2V5KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHJlcGxhY2VkIHRvIG1vZHVsZSBiZWxvd1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3RvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xuXG52YXIgTUVUQURBVEEgPSB3ZWxsS25vd25TeW1ib2woJ21ldGFkYXRhJyk7XG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbi8vIEZ1bmN0aW9uLnByb3RvdHlwZVtAQG1ldGFkYXRhXVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZGVjb3JhdG9yLW1ldGFkYXRhXG5pZiAoRnVuY3Rpb25Qcm90b3R5cGVbTUVUQURBVEFdID09PSB1bmRlZmluZWQpIHtcbiAgZGVmaW5lUHJvcGVydHkoRnVuY3Rpb25Qcm90b3R5cGUsIE1FVEFEQVRBLCB7XG4gICAgdmFsdWU6IG51bGxcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLmFzeW5jRGlzcG9zZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFzeW5jLWV4cGxpY2l0LXJlc291cmNlLW1hbmFnZW1lbnRcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnYXN5bmNEaXNwb3NlJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG4vLyBgU3ltYm9sLmN1c3RvbU1hdGNoZXJgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wYXR0ZXJuLW1hdGNoaW5nXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ2N1c3RvbU1hdGNoZXInKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wuZGlzcG9zZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWV4cGxpY2l0LXJlc291cmNlLW1hbmFnZW1lbnRcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnZGlzcG9zZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNSZWdpc3RlcmVkU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1pcy1yZWdpc3RlcmVkJyk7XG5cbi8vIGBTeW1ib2wuaXNSZWdpc3RlcmVkU3ltYm9sYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1zeW1ib2wtcHJlZGljYXRlcy8jc2VjLXN5bWJvbC1pc3JlZ2lzdGVyZWRzeW1ib2xcbiQoeyB0YXJnZXQ6ICdTeW1ib2wnLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNSZWdpc3RlcmVkU3ltYm9sOiBpc1JlZ2lzdGVyZWRTeW1ib2xcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNSZWdpc3RlcmVkU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3N5bWJvbC1pcy1yZWdpc3RlcmVkJyk7XG5cbi8vIGBTeW1ib2wuaXNSZWdpc3RlcmVkYCBtZXRob2Rcbi8vIG9ic29sZXRlIHZlcnNpb24gb2YgaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLXN5bWJvbC1wcmVkaWNhdGVzLyNzZWMtc3ltYm9sLWlzcmVnaXN0ZXJlZHN5bWJvbFxuJCh7IHRhcmdldDogJ1N5bWJvbCcsIHN0YXQ6IHRydWUsIG5hbWU6ICdpc1JlZ2lzdGVyZWRTeW1ib2wnIH0sIHtcbiAgaXNSZWdpc3RlcmVkOiBpc1JlZ2lzdGVyZWRTeW1ib2xcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3ltYm9sLWlzLXdlbGwta25vd24nKTtcblxuLy8gYFN5bWJvbC5pc1dlbGxLbm93blN5bWJvbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtc3ltYm9sLXByZWRpY2F0ZXMvI3NlYy1zeW1ib2wtaXN3ZWxsa25vd25zeW1ib2xcbi8vIFdlIHNob3VsZCBwYXRjaCBpdCBmb3IgbmV3bHkgYWRkZWQgd2VsbC1rbm93biBzeW1ib2xzLiBJZiBpdCdzIG5vdCByZXF1aXJlZCwgdGhpcyBtb2R1bGUganVzdCB3aWxsIG5vdCBiZSBpbmplY3RlZFxuJCh7IHRhcmdldDogJ1N5bWJvbCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gIGlzV2VsbEtub3duU3ltYm9sOiBpc1dlbGxLbm93blN5bWJvbFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBpc1dlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zeW1ib2wtaXMtd2VsbC1rbm93bicpO1xuXG4vLyBgU3ltYm9sLmlzV2VsbEtub3duYCBtZXRob2Rcbi8vIG9ic29sZXRlIHZlcnNpb24gb2YgaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLXN5bWJvbC1wcmVkaWNhdGVzLyNzZWMtc3ltYm9sLWlzd2VsbGtub3duc3ltYm9sXG4vLyBXZSBzaG91bGQgcGF0Y2ggaXQgZm9yIG5ld2x5IGFkZGVkIHdlbGwta25vd24gc3ltYm9scy4gSWYgaXQncyBub3QgcmVxdWlyZWQsIHRoaXMgbW9kdWxlIGp1c3Qgd2lsbCBub3QgYmUgaW5qZWN0ZWRcbiQoeyB0YXJnZXQ6ICdTeW1ib2wnLCBzdGF0OiB0cnVlLCBuYW1lOiAnaXNXZWxsS25vd25TeW1ib2wnLCBmb3JjZWQ6IHRydWUgfSwge1xuICBpc1dlbGxLbm93bjogaXNXZWxsS25vd25TeW1ib2xcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5tYXRjaGVyYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcGF0dGVybi1tYXRjaGluZ1xuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtYXRjaGVyJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YFxudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5tZXRhZGF0YUtleWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWRlY29yYXRvci1tZXRhZGF0YVxuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdtZXRhZGF0YUtleScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRlZmluZVdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC1kZWZpbmUnKTtcblxuLy8gYFN5bWJvbC5tZXRhZGF0YWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWRlY29yYXRvcnNcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnbWV0YWRhdGEnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wub2JzZXJ2YWJsZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9ic2VydmFibGVcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnb2JzZXJ2YWJsZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogcmVtb3ZlIGZyb20gYGNvcmUtanNANGBcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wtZGVmaW5lJyk7XG5cbi8vIGBTeW1ib2wucGF0dGVybk1hdGNoYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcGF0dGVybi1tYXRjaGluZ1xuZGVmaW5lV2VsbEtub3duU3ltYm9sKCdwYXR0ZXJuTWF0Y2gnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIFRPRE86IHJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgXG52YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLWRlZmluZScpO1xuXG5kZWZpbmVXZWxsS25vd25TeW1ib2woJ3JlcGxhY2VBbGwnKTtcbiIsIi8vIGVtcHR5XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgRE9NSXRlcmFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMnKTtcbnZhciBnbG9iYWxUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbC10aGlzJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgc2V0VG9TdHJpbmdUYWcoZ2xvYmFsVGhpc1tDT0xMRUNUSU9OX05BTUVdLCBDT0xMRUNUSU9OX05BTUUpO1xuICBJdGVyYXRvcnNbQ09MTEVDVElPTl9OQU1FXSA9IEl0ZXJhdG9ycy5BcnJheTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdsb2JhbFRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsLXRoaXMnKTtcbnZhciBzY2hlZHVsZXJzRml4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NjaGVkdWxlcnMtZml4Jyk7XG5cbnZhciBzZXRJbnRlcnZhbCA9IHNjaGVkdWxlcnNGaXgoZ2xvYmFsVGhpcy5zZXRJbnRlcnZhbCwgdHJ1ZSk7XG5cbi8vIEJ1biAvIElFOS0gc2V0SW50ZXJ2YWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZpeFxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGltZXJzLWFuZC11c2VyLXByb21wdHMuaHRtbCNkb20tc2V0aW50ZXJ2YWxcbiQoeyBnbG9iYWw6IHRydWUsIGJpbmQ6IHRydWUsIGZvcmNlZDogZ2xvYmFsVGhpcy5zZXRJbnRlcnZhbCAhPT0gc2V0SW50ZXJ2YWwgfSwge1xuICBzZXRJbnRlcnZhbDogc2V0SW50ZXJ2YWxcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2xvYmFsVGhpcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwtdGhpcycpO1xudmFyIHNjaGVkdWxlcnNGaXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2NoZWR1bGVycy1maXgnKTtcblxudmFyIHNldFRpbWVvdXQgPSBzY2hlZHVsZXJzRml4KGdsb2JhbFRoaXMuc2V0VGltZW91dCwgdHJ1ZSk7XG5cbi8vIEJ1biAvIElFOS0gc2V0VGltZW91dCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZml4XG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS90aW1lcnMtYW5kLXVzZXItcHJvbXB0cy5odG1sI2RvbS1zZXR0aW1lb3V0XG4kKHsgZ2xvYmFsOiB0cnVlLCBiaW5kOiB0cnVlLCBmb3JjZWQ6IGdsb2JhbFRoaXMuc2V0VGltZW91dCAhPT0gc2V0VGltZW91dCB9LCB7XG4gIHNldFRpbWVvdXQ6IHNldFRpbWVvdXRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbW9kdWxlIGZyb20gYGNvcmUtanNANGAgc2luY2UgaXQncyBzcGxpdCB0byBtb2R1bGVzIGxpc3RlZCBiZWxvd1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuc2V0LWludGVydmFsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5zZXQtdGltZW91dCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2FycmF5L2Zyb20nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvYXJyYXkvaXMtYXJyYXknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vLi4vZXMvYXJyYXkvdmlydHVhbC9lbnRyaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uLy4uL2VzL2FycmF5L3ZpcnR1YWwvZm9yLWVhY2gnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vLi4vZXMvYXJyYXkvdmlydHVhbC9rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uLy4uL2VzL2FycmF5L3ZpcnR1YWwvdmFsdWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2JpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2UvY29uY2F0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2VudHJpZXMnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIE5vZGVMaXN0OiB0cnVlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuZW50cmllcztcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuZW50cmllcylcbiAgICB8fCBoYXNPd24oRE9NSXRlcmFibGVzLCBjbGFzc29mKGl0KSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2V2ZXJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2ZpbHRlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9maW5kLWluZGV4Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2ZpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2Zvci1lYWNoJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2gnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIE5vZGVMaXN0OiB0cnVlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQuZm9yRWFjaDtcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUuZm9yRWFjaClcbiAgICB8fCBoYXNPd24oRE9NSXRlcmFibGVzLCBjbGFzc29mKGl0KSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2luY2x1ZGVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL2luZGV4LW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9jbGFzc29mJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHknKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YnKTtcbnZhciBtZXRob2QgPSByZXF1aXJlKCcuLi9hcnJheS92aXJ0dWFsL2tleXMnKTtcblxudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG52YXIgRE9NSXRlcmFibGVzID0ge1xuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIE5vZGVMaXN0OiB0cnVlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgb3duID0gaXQua2V5cztcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUua2V5cylcbiAgICB8fCBoYXNPd24oRE9NSXRlcmFibGVzLCBjbGFzc29mKGl0KSkgPyBtZXRob2QgOiBvd247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL2luc3RhbmNlL21hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9yZWR1Y2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2Uvc2xpY2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2Uvc29ydCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9pbnN0YW5jZS9zcGxpY2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvaW5zdGFuY2Uvc3RhcnRzLXdpdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBoYXNPd24gPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eScpO1xudmFyIGlzUHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZicpO1xudmFyIG1ldGhvZCA9IHJlcXVpcmUoJy4uL2FycmF5L3ZpcnR1YWwvdmFsdWVzJyk7XG5cbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgRE9NVG9rZW5MaXN0OiB0cnVlLFxuICBOb2RlTGlzdDogdHJ1ZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIG93biA9IGl0LnZhbHVlcztcbiAgcmV0dXJuIGl0ID09PSBBcnJheVByb3RvdHlwZSB8fCAoaXNQcm90b3R5cGVPZihBcnJheVByb3RvdHlwZSwgaXQpICYmIG93biA9PT0gQXJyYXlQcm90b3R5cGUudmFsdWVzKVxuICAgIHx8IGhhc093bihET01JdGVyYWJsZXMsIGNsYXNzb2YoaXQpKSA/IG1ldGhvZCA6IG93bjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvanNvbi9zdHJpbmdpZnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvbWFwJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvbnVtYmVyL2lzLWludGVnZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvb2JqZWN0L2Fzc2lnbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9vYmplY3QvY3JlYXRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9kZWZpbmUtcHJvcGVydHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvb2JqZWN0L2VudHJpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvb2JqZWN0L2ZyZWV6ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9vYmplY3QvZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL29iamVjdC9rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uL2VzL3BhcnNlLWludCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBwYXJlbnQgPSByZXF1aXJlKCcuLi8uLi9lcy9wcm9taXNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi50aW1lcnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoLnNldEludGVydmFsO1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIudGltZXJzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5zZXRUaW1lb3V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL3NldCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL3N5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL3N5bWJvbC9pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHBhcmVudCA9IHJlcXVpcmUoJy4uLy4uL2VzL3N5bWJvbC90by1wcmltaXRpdmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcGFyZW50ID0gcmVxdWlyZSgnLi4vLi4vZXMvd2Vhay1tYXAnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmVudDtcbiIsImltcG9ydCB0b1Byb3BlcnR5S2V5IGZyb20gXCIuL3RvUHJvcGVydHlLZXkuanNcIjtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7XG4gIHJldHVybiAociA9IHRvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwge1xuICAgIHZhbHVlOiB0LFxuICAgIGVudW1lcmFibGU6ICEwLFxuICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgd3JpdGFibGU6ICEwXG4gIH0pIDogZVtyXSA9IHQsIGU7XG59XG5leHBvcnQgeyBfZGVmaW5lUHJvcGVydHkgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikge1xuICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7XG4gICAgICB2YXIgdCA9IGFyZ3VtZW50c1tlXTtcbiAgICAgIGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuZXhwb3J0IHsgX2V4dGVuZHMgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBzZXRQcm90b3R5cGVPZiBmcm9tIFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiO1xuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2UodCwgbykge1xuICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLCB0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHQsIHNldFByb3RvdHlwZU9mKHQsIG8pO1xufVxuZXhwb3J0IHsgX2luaGVyaXRzTG9vc2UgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tIFwiLi9kZWZpbmVQcm9wZXJ0eS5qc1wiO1xuZnVuY3Rpb24gb3duS2V5cyhlLCByKSB7XG4gIHZhciB0ID0gT2JqZWN0LmtleXMoZSk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO1xuICAgIHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgcikuZW51bWVyYWJsZTtcbiAgICB9KSksIHQucHVzaC5hcHBseSh0LCBvKTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKGUpIHtcbiAgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHtcbiAgICB2YXIgdCA9IG51bGwgIT0gYXJndW1lbnRzW3JdID8gYXJndW1lbnRzW3JdIDoge307XG4gICAgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pO1xuICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0KSkgOiBvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuZXhwb3J0IHsgX29iamVjdFNwcmVhZDIgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHIsIGUpIHtcbiAgaWYgKG51bGwgPT0gcikgcmV0dXJuIHt9O1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBuIGluIHIpIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG4pKSB7XG4gICAgaWYgKGUuaW5jbHVkZXMobikpIGNvbnRpbnVlO1xuICAgIHRbbl0gPSByW25dO1xuICB9XG4gIHJldHVybiB0O1xufVxuZXhwb3J0IHsgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZih0LCBlKSB7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0O1xuICB9LCBfc2V0UHJvdG90eXBlT2YodCwgZSk7XG59XG5leHBvcnQgeyBfc2V0UHJvdG90eXBlT2YgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikge1xuICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKHQpIHx8ICF0KSByZXR1cm4gdDtcbiAgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh2b2lkIDAgIT09IGUpIHtcbiAgICB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoXCJvYmplY3RcIiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTtcbn1cbmV4cG9ydCB7IHRvUHJpbWl0aXZlIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmltcG9ydCB0b1ByaW1pdGl2ZSBmcm9tIFwiLi90b1ByaW1pdGl2ZS5qc1wiO1xuZnVuY3Rpb24gdG9Qcm9wZXJ0eUtleSh0KSB7XG4gIHZhciBpID0gdG9QcmltaXRpdmUodCwgXCJzdHJpbmdcIik7XG4gIHJldHVybiBcInN5bWJvbFwiID09IF90eXBlb2YoaSkgPyBpIDogaSArIFwiXCI7XG59XG5leHBvcnQgeyB0b1Byb3BlcnR5S2V5IGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfdHlwZW9mKG8pIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG87XG4gIH0gOiBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiBvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG8uY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvO1xuICB9LCBfdHlwZW9mKG8pO1xufVxuZXhwb3J0IHsgX3R5cGVvZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHsgZ2V0U2lkZUF4aXMsIGdldEFsaWdubWVudEF4aXMsIGdldEF4aXNMZW5ndGgsIGdldFNpZGUsIGdldEFsaWdubWVudCwgZXZhbHVhdGUsIGdldFBhZGRpbmdPYmplY3QsIHJlY3RUb0NsaWVudFJlY3QsIG1pbiwgY2xhbXAsIHBsYWNlbWVudHMsIGdldEFsaWdubWVudFNpZGVzLCBnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQsIGdldEV4cGFuZGVkUGxhY2VtZW50cywgZ2V0T3Bwb3NpdGVBeGlzUGxhY2VtZW50cywgc2lkZXMsIG1heCwgZ2V0T3Bwb3NpdGVBeGlzIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzJztcbmV4cG9ydCB7IHJlY3RUb0NsaWVudFJlY3QgfSBmcm9tICdAZmxvYXRpbmctdWkvdXRpbHMnO1xuXG5mdW5jdGlvbiBjb21wdXRlQ29vcmRzRnJvbVBsYWNlbWVudChfcmVmLCBwbGFjZW1lbnQsIHJ0bCkge1xuICBsZXQge1xuICAgIHJlZmVyZW5jZSxcbiAgICBmbG9hdGluZ1xuICB9ID0gX3JlZjtcbiAgY29uc3Qgc2lkZUF4aXMgPSBnZXRTaWRlQXhpcyhwbGFjZW1lbnQpO1xuICBjb25zdCBhbGlnbm1lbnRBeGlzID0gZ2V0QWxpZ25tZW50QXhpcyhwbGFjZW1lbnQpO1xuICBjb25zdCBhbGlnbkxlbmd0aCA9IGdldEF4aXNMZW5ndGgoYWxpZ25tZW50QXhpcyk7XG4gIGNvbnN0IHNpZGUgPSBnZXRTaWRlKHBsYWNlbWVudCk7XG4gIGNvbnN0IGlzVmVydGljYWwgPSBzaWRlQXhpcyA9PT0gJ3knO1xuICBjb25zdCBjb21tb25YID0gcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGggLyAyIC0gZmxvYXRpbmcud2lkdGggLyAyO1xuICBjb25zdCBjb21tb25ZID0gcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0IC8gMiAtIGZsb2F0aW5nLmhlaWdodCAvIDI7XG4gIGNvbnN0IGNvbW1vbkFsaWduID0gcmVmZXJlbmNlW2FsaWduTGVuZ3RoXSAvIDIgLSBmbG9hdGluZ1thbGlnbkxlbmd0aF0gLyAyO1xuICBsZXQgY29vcmRzO1xuICBzd2l0Y2ggKHNpZGUpIHtcbiAgICBjYXNlICd0b3AnOlxuICAgICAgY29vcmRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSAtIGZsb2F0aW5nLmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBjb29yZHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBmbG9hdGluZy53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBjb29yZHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuICBzd2l0Y2ggKGdldEFsaWdubWVudChwbGFjZW1lbnQpKSB7XG4gICAgY2FzZSAnc3RhcnQnOlxuICAgICAgY29vcmRzW2FsaWdubWVudEF4aXNdIC09IGNvbW1vbkFsaWduICogKHJ0bCAmJiBpc1ZlcnRpY2FsID8gLTEgOiAxKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZCc6XG4gICAgICBjb29yZHNbYWxpZ25tZW50QXhpc10gKz0gY29tbW9uQWxpZ24gKiAocnRsICYmIGlzVmVydGljYWwgPyAtMSA6IDEpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIGNvb3Jkcztcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMgdGhhdCB3aWxsIHBsYWNlIHRoZSBmbG9hdGluZyBlbGVtZW50XG4gKiBuZXh0IHRvIGEgZ2l2ZW4gcmVmZXJlbmNlIGVsZW1lbnQuXG4gKlxuICogVGhpcyBleHBvcnQgZG9lcyBub3QgaGF2ZSBhbnkgYHBsYXRmb3JtYCBpbnRlcmZhY2UgbG9naWMuIFlvdSB3aWxsIG5lZWQgdG9cbiAqIHdyaXRlIG9uZSBmb3IgdGhlIHBsYXRmb3JtIHlvdSBhcmUgdXNpbmcgRmxvYXRpbmcgVUkgd2l0aC5cbiAqL1xuY29uc3QgY29tcHV0ZVBvc2l0aW9uID0gYXN5bmMgKHJlZmVyZW5jZSwgZmxvYXRpbmcsIGNvbmZpZykgPT4ge1xuICBjb25zdCB7XG4gICAgcGxhY2VtZW50ID0gJ2JvdHRvbScsXG4gICAgc3RyYXRlZ3kgPSAnYWJzb2x1dGUnLFxuICAgIG1pZGRsZXdhcmUgPSBbXSxcbiAgICBwbGF0Zm9ybVxuICB9ID0gY29uZmlnO1xuICBjb25zdCB2YWxpZE1pZGRsZXdhcmUgPSBtaWRkbGV3YXJlLmZpbHRlcihCb29sZWFuKTtcbiAgY29uc3QgcnRsID0gYXdhaXQgKHBsYXRmb3JtLmlzUlRMID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc1JUTChmbG9hdGluZykpO1xuICBsZXQgcmVjdHMgPSBhd2FpdCBwbGF0Zm9ybS5nZXRFbGVtZW50UmVjdHMoe1xuICAgIHJlZmVyZW5jZSxcbiAgICBmbG9hdGluZyxcbiAgICBzdHJhdGVneVxuICB9KTtcbiAgbGV0IHtcbiAgICB4LFxuICAgIHlcbiAgfSA9IGNvbXB1dGVDb29yZHNGcm9tUGxhY2VtZW50KHJlY3RzLCBwbGFjZW1lbnQsIHJ0bCk7XG4gIGxldCBzdGF0ZWZ1bFBsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgbGV0IG1pZGRsZXdhcmVEYXRhID0ge307XG4gIGxldCByZXNldENvdW50ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZE1pZGRsZXdhcmUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgZm5cbiAgICB9ID0gdmFsaWRNaWRkbGV3YXJlW2ldO1xuICAgIGNvbnN0IHtcbiAgICAgIHg6IG5leHRYLFxuICAgICAgeTogbmV4dFksXG4gICAgICBkYXRhLFxuICAgICAgcmVzZXRcbiAgICB9ID0gYXdhaXQgZm4oe1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBpbml0aWFsUGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQ6IHN0YXRlZnVsUGxhY2VtZW50LFxuICAgICAgc3RyYXRlZ3ksXG4gICAgICBtaWRkbGV3YXJlRGF0YSxcbiAgICAgIHJlY3RzLFxuICAgICAgcGxhdGZvcm0sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2UsXG4gICAgICAgIGZsb2F0aW5nXG4gICAgICB9XG4gICAgfSk7XG4gICAgeCA9IG5leHRYICE9IG51bGwgPyBuZXh0WCA6IHg7XG4gICAgeSA9IG5leHRZICE9IG51bGwgPyBuZXh0WSA6IHk7XG4gICAgbWlkZGxld2FyZURhdGEgPSB7XG4gICAgICAuLi5taWRkbGV3YXJlRGF0YSxcbiAgICAgIFtuYW1lXToge1xuICAgICAgICAuLi5taWRkbGV3YXJlRGF0YVtuYW1lXSxcbiAgICAgICAgLi4uZGF0YVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHJlc2V0ICYmIHJlc2V0Q291bnQgPD0gNTApIHtcbiAgICAgIHJlc2V0Q291bnQrKztcbiAgICAgIGlmICh0eXBlb2YgcmVzZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChyZXNldC5wbGFjZW1lbnQpIHtcbiAgICAgICAgICBzdGF0ZWZ1bFBsYWNlbWVudCA9IHJlc2V0LnBsYWNlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzZXQucmVjdHMpIHtcbiAgICAgICAgICByZWN0cyA9IHJlc2V0LnJlY3RzID09PSB0cnVlID8gYXdhaXQgcGxhdGZvcm0uZ2V0RWxlbWVudFJlY3RzKHtcbiAgICAgICAgICAgIHJlZmVyZW5jZSxcbiAgICAgICAgICAgIGZsb2F0aW5nLFxuICAgICAgICAgICAgc3RyYXRlZ3lcbiAgICAgICAgICB9KSA6IHJlc2V0LnJlY3RzO1xuICAgICAgICB9XG4gICAgICAgICh7XG4gICAgICAgICAgeCxcbiAgICAgICAgICB5XG4gICAgICAgIH0gPSBjb21wdXRlQ29vcmRzRnJvbVBsYWNlbWVudChyZWN0cywgc3RhdGVmdWxQbGFjZW1lbnQsIHJ0bCkpO1xuICAgICAgfVxuICAgICAgaSA9IC0xO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeSxcbiAgICBwbGFjZW1lbnQ6IHN0YXRlZnVsUGxhY2VtZW50LFxuICAgIHN0cmF0ZWd5LFxuICAgIG1pZGRsZXdhcmVEYXRhXG4gIH07XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggYW4gb2JqZWN0IG9mIG92ZXJmbG93IHNpZGUgb2Zmc2V0cyB0aGF0IGRldGVybWluZSBob3cgbXVjaCB0aGVcbiAqIGVsZW1lbnQgaXMgb3ZlcmZsb3dpbmcgYSBnaXZlbiBjbGlwcGluZyBib3VuZGFyeSBvbiBlYWNoIHNpZGUuXG4gKiAtIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGJvdW5kYXJ5IGJ5IHRoYXQgbnVtYmVyIG9mIHBpeGVsc1xuICogLSBuZWdhdGl2ZSA9IGhvdyBtYW55IHBpeGVscyBsZWZ0IGJlZm9yZSBpdCB3aWxsIG92ZXJmbG93XG4gKiAtIDAgPSBsaWVzIGZsdXNoIHdpdGggdGhlIGJvdW5kYXJ5XG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvZGV0ZWN0T3ZlcmZsb3dcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIG9wdGlvbnMpIHtcbiAgdmFyIF9hd2FpdCRwbGF0Zm9ybSRpc0VsZTtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgeCxcbiAgICB5LFxuICAgIHBsYXRmb3JtLFxuICAgIHJlY3RzLFxuICAgIGVsZW1lbnRzLFxuICAgIHN0cmF0ZWd5XG4gIH0gPSBzdGF0ZTtcbiAgY29uc3Qge1xuICAgIGJvdW5kYXJ5ID0gJ2NsaXBwaW5nQW5jZXN0b3JzJyxcbiAgICByb290Qm91bmRhcnkgPSAndmlld3BvcnQnLFxuICAgIGVsZW1lbnRDb250ZXh0ID0gJ2Zsb2F0aW5nJyxcbiAgICBhbHRCb3VuZGFyeSA9IGZhbHNlLFxuICAgIHBhZGRpbmcgPSAwXG4gIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gIGNvbnN0IHBhZGRpbmdPYmplY3QgPSBnZXRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpO1xuICBjb25zdCBhbHRDb250ZXh0ID0gZWxlbWVudENvbnRleHQgPT09ICdmbG9hdGluZycgPyAncmVmZXJlbmNlJyA6ICdmbG9hdGluZyc7XG4gIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1thbHRCb3VuZGFyeSA/IGFsdENvbnRleHQgOiBlbGVtZW50Q29udGV4dF07XG4gIGNvbnN0IGNsaXBwaW5nQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoYXdhaXQgcGxhdGZvcm0uZ2V0Q2xpcHBpbmdSZWN0KHtcbiAgICBlbGVtZW50OiAoKF9hd2FpdCRwbGF0Zm9ybSRpc0VsZSA9IGF3YWl0IChwbGF0Zm9ybS5pc0VsZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzRWxlbWVudChlbGVtZW50KSkpICE9IG51bGwgPyBfYXdhaXQkcGxhdGZvcm0kaXNFbGUgOiB0cnVlKSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IChhd2FpdCAocGxhdGZvcm0uZ2V0RG9jdW1lbnRFbGVtZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5nZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudHMuZmxvYXRpbmcpKSksXG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5LFxuICAgIHN0cmF0ZWd5XG4gIH0pKTtcbiAgY29uc3QgcmVjdCA9IGVsZW1lbnRDb250ZXh0ID09PSAnZmxvYXRpbmcnID8ge1xuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aDogcmVjdHMuZmxvYXRpbmcud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0cy5mbG9hdGluZy5oZWlnaHRcbiAgfSA6IHJlY3RzLnJlZmVyZW5jZTtcbiAgY29uc3Qgb2Zmc2V0UGFyZW50ID0gYXdhaXQgKHBsYXRmb3JtLmdldE9mZnNldFBhcmVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnRzLmZsb2F0aW5nKSk7XG4gIGNvbnN0IG9mZnNldFNjYWxlID0gKGF3YWl0IChwbGF0Zm9ybS5pc0VsZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzRWxlbWVudChvZmZzZXRQYXJlbnQpKSkgPyAoYXdhaXQgKHBsYXRmb3JtLmdldFNjYWxlID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5nZXRTY2FsZShvZmZzZXRQYXJlbnQpKSkgfHwge1xuICAgIHg6IDEsXG4gICAgeTogMVxuICB9IDoge1xuICAgIHg6IDEsXG4gICAgeTogMVxuICB9O1xuICBjb25zdCBlbGVtZW50Q2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QocGxhdGZvcm0uY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3QgPyBhd2FpdCBwbGF0Zm9ybS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCh7XG4gICAgZWxlbWVudHMsXG4gICAgcmVjdCxcbiAgICBvZmZzZXRQYXJlbnQsXG4gICAgc3RyYXRlZ3lcbiAgfSkgOiByZWN0KTtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IChjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3ApIC8gb2Zmc2V0U2NhbGUueSxcbiAgICBib3R0b206IChlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20pIC8gb2Zmc2V0U2NhbGUueSxcbiAgICBsZWZ0OiAoY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0KSAvIG9mZnNldFNjYWxlLngsXG4gICAgcmlnaHQ6IChlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHQpIC8gb2Zmc2V0U2NhbGUueFxuICB9O1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gcG9zaXRpb24gYW4gaW5uZXIgZWxlbWVudCBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBzbyB0aGF0IGl0XG4gKiBhcHBlYXJzIGNlbnRlcmVkIHRvIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hcnJvd1xuICovXG5jb25zdCBhcnJvdyA9IG9wdGlvbnMgPT4gKHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgb3B0aW9ucyxcbiAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIHJlY3RzLFxuICAgICAgcGxhdGZvcm0sXG4gICAgICBlbGVtZW50cyxcbiAgICAgIG1pZGRsZXdhcmVEYXRhXG4gICAgfSA9IHN0YXRlO1xuICAgIC8vIFNpbmNlIGBlbGVtZW50YCBpcyByZXF1aXJlZCwgd2UgZG9uJ3QgUGFydGlhbDw+IHRoZSB0eXBlLlxuICAgIGNvbnN0IHtcbiAgICAgIGVsZW1lbnQsXG4gICAgICBwYWRkaW5nID0gMFxuICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSkgfHwge307XG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBwYWRkaW5nT2JqZWN0ID0gZ2V0UGFkZGluZ09iamVjdChwYWRkaW5nKTtcbiAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH07XG4gICAgY29uc3QgYXhpcyA9IGdldEFsaWdubWVudEF4aXMocGxhY2VtZW50KTtcbiAgICBjb25zdCBsZW5ndGggPSBnZXRBeGlzTGVuZ3RoKGF4aXMpO1xuICAgIGNvbnN0IGFycm93RGltZW5zaW9ucyA9IGF3YWl0IHBsYXRmb3JtLmdldERpbWVuc2lvbnMoZWxlbWVudCk7XG4gICAgY29uc3QgaXNZQXhpcyA9IGF4aXMgPT09ICd5JztcbiAgICBjb25zdCBtaW5Qcm9wID0gaXNZQXhpcyA/ICd0b3AnIDogJ2xlZnQnO1xuICAgIGNvbnN0IG1heFByb3AgPSBpc1lBeGlzID8gJ2JvdHRvbScgOiAncmlnaHQnO1xuICAgIGNvbnN0IGNsaWVudFByb3AgPSBpc1lBeGlzID8gJ2NsaWVudEhlaWdodCcgOiAnY2xpZW50V2lkdGgnO1xuICAgIGNvbnN0IGVuZERpZmYgPSByZWN0cy5yZWZlcmVuY2VbbGVuZ3RoXSArIHJlY3RzLnJlZmVyZW5jZVtheGlzXSAtIGNvb3Jkc1theGlzXSAtIHJlY3RzLmZsb2F0aW5nW2xlbmd0aF07XG4gICAgY29uc3Qgc3RhcnREaWZmID0gY29vcmRzW2F4aXNdIC0gcmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICAgIGNvbnN0IGFycm93T2Zmc2V0UGFyZW50ID0gYXdhaXQgKHBsYXRmb3JtLmdldE9mZnNldFBhcmVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpKTtcbiAgICBsZXQgY2xpZW50U2l6ZSA9IGFycm93T2Zmc2V0UGFyZW50ID8gYXJyb3dPZmZzZXRQYXJlbnRbY2xpZW50UHJvcF0gOiAwO1xuXG4gICAgLy8gRE9NIHBsYXRmb3JtIGNhbiByZXR1cm4gYHdpbmRvd2AgYXMgdGhlIGBvZmZzZXRQYXJlbnRgLlxuICAgIGlmICghY2xpZW50U2l6ZSB8fCAhKGF3YWl0IChwbGF0Zm9ybS5pc0VsZW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzRWxlbWVudChhcnJvd09mZnNldFBhcmVudCkpKSkge1xuICAgICAgY2xpZW50U2l6ZSA9IGVsZW1lbnRzLmZsb2F0aW5nW2NsaWVudFByb3BdIHx8IHJlY3RzLmZsb2F0aW5nW2xlbmd0aF07XG4gICAgfVxuICAgIGNvbnN0IGNlbnRlclRvUmVmZXJlbmNlID0gZW5kRGlmZiAvIDIgLSBzdGFydERpZmYgLyAyO1xuXG4gICAgLy8gSWYgdGhlIHBhZGRpbmcgaXMgbGFyZ2UgZW5vdWdoIHRoYXQgaXQgY2F1c2VzIHRoZSBhcnJvdyB0byBubyBsb25nZXIgYmVcbiAgICAvLyBjZW50ZXJlZCwgbW9kaWZ5IHRoZSBwYWRkaW5nIHNvIHRoYXQgaXQgaXMgY2VudGVyZWQuXG4gICAgY29uc3QgbGFyZ2VzdFBvc3NpYmxlUGFkZGluZyA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dEaW1lbnNpb25zW2xlbmd0aF0gLyAyIC0gMTtcbiAgICBjb25zdCBtaW5QYWRkaW5nID0gbWluKHBhZGRpbmdPYmplY3RbbWluUHJvcF0sIGxhcmdlc3RQb3NzaWJsZVBhZGRpbmcpO1xuICAgIGNvbnN0IG1heFBhZGRpbmcgPSBtaW4ocGFkZGluZ09iamVjdFttYXhQcm9wXSwgbGFyZ2VzdFBvc3NpYmxlUGFkZGluZyk7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGFycm93IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaWYgdGhlIGNlbnRlclxuICAgIC8vIHBvaW50IGlzIG91dHNpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQncyBib3VuZHMuXG4gICAgY29uc3QgbWluJDEgPSBtaW5QYWRkaW5nO1xuICAgIGNvbnN0IG1heCA9IGNsaWVudFNpemUgLSBhcnJvd0RpbWVuc2lvbnNbbGVuZ3RoXSAtIG1heFBhZGRpbmc7XG4gICAgY29uc3QgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd0RpbWVuc2lvbnNbbGVuZ3RoXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgICBjb25zdCBvZmZzZXQgPSBjbGFtcChtaW4kMSwgY2VudGVyLCBtYXgpO1xuXG4gICAgLy8gSWYgdGhlIHJlZmVyZW5jZSBpcyBzbWFsbCBlbm91Z2ggdGhhdCB0aGUgYXJyb3cncyBwYWRkaW5nIGNhdXNlcyBpdCB0b1xuICAgIC8vIHRvIHBvaW50IHRvIG5vdGhpbmcgZm9yIGFuIGFsaWduZWQgcGxhY2VtZW50LCBhZGp1c3QgdGhlIG9mZnNldCBvZiB0aGVcbiAgICAvLyBmbG9hdGluZyBlbGVtZW50IGl0c2VsZi4gVG8gZW5zdXJlIGBzaGlmdCgpYCBjb250aW51ZXMgdG8gdGFrZSBhY3Rpb24sXG4gICAgLy8gYSBzaW5nbGUgcmVzZXQgaXMgcGVyZm9ybWVkIHdoZW4gdGhpcyBpcyB0cnVlLlxuICAgIGNvbnN0IHNob3VsZEFkZE9mZnNldCA9ICFtaWRkbGV3YXJlRGF0YS5hcnJvdyAmJiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSAhPSBudWxsICYmIGNlbnRlciAhPT0gb2Zmc2V0ICYmIHJlY3RzLnJlZmVyZW5jZVtsZW5ndGhdIC8gMiAtIChjZW50ZXIgPCBtaW4kMSA/IG1pblBhZGRpbmcgOiBtYXhQYWRkaW5nKSAtIGFycm93RGltZW5zaW9uc1tsZW5ndGhdIC8gMiA8IDA7XG4gICAgY29uc3QgYWxpZ25tZW50T2Zmc2V0ID0gc2hvdWxkQWRkT2Zmc2V0ID8gY2VudGVyIDwgbWluJDEgPyBjZW50ZXIgLSBtaW4kMSA6IGNlbnRlciAtIG1heCA6IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtheGlzXTogY29vcmRzW2F4aXNdICsgYWxpZ25tZW50T2Zmc2V0LFxuICAgICAgZGF0YToge1xuICAgICAgICBbYXhpc106IG9mZnNldCxcbiAgICAgICAgY2VudGVyT2Zmc2V0OiBjZW50ZXIgLSBvZmZzZXQgLSBhbGlnbm1lbnRPZmZzZXQsXG4gICAgICAgIC4uLihzaG91bGRBZGRPZmZzZXQgJiYge1xuICAgICAgICAgIGFsaWdubWVudE9mZnNldFxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHJlc2V0OiBzaG91bGRBZGRPZmZzZXRcbiAgICB9O1xuICB9XG59KTtcblxuZnVuY3Rpb24gZ2V0UGxhY2VtZW50TGlzdChhbGlnbm1lbnQsIGF1dG9BbGlnbm1lbnQsIGFsbG93ZWRQbGFjZW1lbnRzKSB7XG4gIGNvbnN0IGFsbG93ZWRQbGFjZW1lbnRzU29ydGVkQnlBbGlnbm1lbnQgPSBhbGlnbm1lbnQgPyBbLi4uYWxsb3dlZFBsYWNlbWVudHMuZmlsdGVyKHBsYWNlbWVudCA9PiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSA9PT0gYWxpZ25tZW50KSwgLi4uYWxsb3dlZFBsYWNlbWVudHMuZmlsdGVyKHBsYWNlbWVudCA9PiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSAhPT0gYWxpZ25tZW50KV0gOiBhbGxvd2VkUGxhY2VtZW50cy5maWx0ZXIocGxhY2VtZW50ID0+IGdldFNpZGUocGxhY2VtZW50KSA9PT0gcGxhY2VtZW50KTtcbiAgcmV0dXJuIGFsbG93ZWRQbGFjZW1lbnRzU29ydGVkQnlBbGlnbm1lbnQuZmlsdGVyKHBsYWNlbWVudCA9PiB7XG4gICAgaWYgKGFsaWdubWVudCkge1xuICAgICAgcmV0dXJuIGdldEFsaWdubWVudChwbGFjZW1lbnQpID09PSBhbGlnbm1lbnQgfHwgKGF1dG9BbGlnbm1lbnQgPyBnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudChwbGFjZW1lbnQpICE9PSBwbGFjZW1lbnQgOiBmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IGNob29zaW5nIHRoZSBwbGFjZW1lbnRcbiAqIHRoYXQgaGFzIHRoZSBtb3N0IHNwYWNlIGF2YWlsYWJsZSBhdXRvbWF0aWNhbGx5LCB3aXRob3V0IG5lZWRpbmcgdG8gc3BlY2lmeSBhXG4gKiBwcmVmZXJyZWQgcGxhY2VtZW50LiBBbHRlcm5hdGl2ZSB0byBgZmxpcGAuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXV0b1BsYWNlbWVudFxuICovXG5jb25zdCBhdXRvUGxhY2VtZW50ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdhdXRvUGxhY2VtZW50JyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICB2YXIgX21pZGRsZXdhcmVEYXRhJGF1dG9QLCBfbWlkZGxld2FyZURhdGEkYXV0b1AyLCBfcGxhY2VtZW50c1RoYXRGaXRPbkU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJlY3RzLFxuICAgICAgICBtaWRkbGV3YXJlRGF0YSxcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgZWxlbWVudHNcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY3Jvc3NBeGlzID0gZmFsc2UsXG4gICAgICAgIGFsaWdubWVudCxcbiAgICAgICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLFxuICAgICAgICBhdXRvQWxpZ25tZW50ID0gdHJ1ZSxcbiAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuICAgICAgY29uc3QgcGxhY2VtZW50cyQxID0gYWxpZ25tZW50ICE9PSB1bmRlZmluZWQgfHwgYWxsb3dlZFBsYWNlbWVudHMgPT09IHBsYWNlbWVudHMgPyBnZXRQbGFjZW1lbnRMaXN0KGFsaWdubWVudCB8fCBudWxsLCBhdXRvQWxpZ25tZW50LCBhbGxvd2VkUGxhY2VtZW50cykgOiBhbGxvd2VkUGxhY2VtZW50cztcbiAgICAgIGNvbnN0IG92ZXJmbG93ID0gYXdhaXQgZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIGRldGVjdE92ZXJmbG93T3B0aW9ucyk7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXggPSAoKF9taWRkbGV3YXJlRGF0YSRhdXRvUCA9IG1pZGRsZXdhcmVEYXRhLmF1dG9QbGFjZW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkYXV0b1AuaW5kZXgpIHx8IDA7XG4gICAgICBjb25zdCBjdXJyZW50UGxhY2VtZW50ID0gcGxhY2VtZW50cyQxW2N1cnJlbnRJbmRleF07XG4gICAgICBpZiAoY3VycmVudFBsYWNlbWVudCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFsaWdubWVudFNpZGVzID0gZ2V0QWxpZ25tZW50U2lkZXMoY3VycmVudFBsYWNlbWVudCwgcmVjdHMsIGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKSk7XG5cbiAgICAgIC8vIE1ha2UgYGNvbXB1dGVDb29yZHNgIHN0YXJ0IGZyb20gdGhlIHJpZ2h0IHBsYWNlLlxuICAgICAgaWYgKHBsYWNlbWVudCAhPT0gY3VycmVudFBsYWNlbWVudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudHMkMVswXVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRPdmVyZmxvd3MgPSBbb3ZlcmZsb3dbZ2V0U2lkZShjdXJyZW50UGxhY2VtZW50KV0sIG92ZXJmbG93W2FsaWdubWVudFNpZGVzWzBdXSwgb3ZlcmZsb3dbYWxpZ25tZW50U2lkZXNbMV1dXTtcbiAgICAgIGNvbnN0IGFsbE92ZXJmbG93cyA9IFsuLi4oKChfbWlkZGxld2FyZURhdGEkYXV0b1AyID0gbWlkZGxld2FyZURhdGEuYXV0b1BsYWNlbWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRhdXRvUDIub3ZlcmZsb3dzKSB8fCBbXSksIHtcbiAgICAgICAgcGxhY2VtZW50OiBjdXJyZW50UGxhY2VtZW50LFxuICAgICAgICBvdmVyZmxvd3M6IGN1cnJlbnRPdmVyZmxvd3NcbiAgICAgIH1dO1xuICAgICAgY29uc3QgbmV4dFBsYWNlbWVudCA9IHBsYWNlbWVudHMkMVtjdXJyZW50SW5kZXggKyAxXTtcblxuICAgICAgLy8gVGhlcmUgYXJlIG1vcmUgcGxhY2VtZW50cyB0byBjaGVjay5cbiAgICAgIGlmIChuZXh0UGxhY2VtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5kZXg6IGN1cnJlbnRJbmRleCArIDEsXG4gICAgICAgICAgICBvdmVyZmxvd3M6IGFsbE92ZXJmbG93c1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHBsYWNlbWVudDogbmV4dFBsYWNlbWVudFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBsYWNlbWVudHNTb3J0ZWRCeU1vc3RTcGFjZSA9IGFsbE92ZXJmbG93cy5tYXAoZCA9PiB7XG4gICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChkLnBsYWNlbWVudCk7XG4gICAgICAgIHJldHVybiBbZC5wbGFjZW1lbnQsIGFsaWdubWVudCAmJiBjcm9zc0F4aXMgP1xuICAgICAgICAvLyBDaGVjayBhbG9uZyB0aGUgbWFpbkF4aXMgYW5kIG1haW4gY3Jvc3NBeGlzIHNpZGUuXG4gICAgICAgIGQub3ZlcmZsb3dzLnNsaWNlKDAsIDIpLnJlZHVjZSgoYWNjLCB2KSA9PiBhY2MgKyB2LCAwKSA6XG4gICAgICAgIC8vIENoZWNrIG9ubHkgdGhlIG1haW5BeGlzLlxuICAgICAgICBkLm92ZXJmbG93c1swXSwgZC5vdmVyZmxvd3NdO1xuICAgICAgfSkuc29ydCgoYSwgYikgPT4gYVsxXSAtIGJbMV0pO1xuICAgICAgY29uc3QgcGxhY2VtZW50c1RoYXRGaXRPbkVhY2hTaWRlID0gcGxhY2VtZW50c1NvcnRlZEJ5TW9zdFNwYWNlLmZpbHRlcihkID0+IGRbMl0uc2xpY2UoMCxcbiAgICAgIC8vIEFsaWduZWQgcGxhY2VtZW50cyBzaG91bGQgbm90IGNoZWNrIHRoZWlyIG9wcG9zaXRlIGNyb3NzQXhpc1xuICAgICAgLy8gc2lkZS5cbiAgICAgIGdldEFsaWdubWVudChkWzBdKSA/IDIgOiAzKS5ldmVyeSh2ID0+IHYgPD0gMCkpO1xuICAgICAgY29uc3QgcmVzZXRQbGFjZW1lbnQgPSAoKF9wbGFjZW1lbnRzVGhhdEZpdE9uRSA9IHBsYWNlbWVudHNUaGF0Rml0T25FYWNoU2lkZVswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9wbGFjZW1lbnRzVGhhdEZpdE9uRVswXSkgfHwgcGxhY2VtZW50c1NvcnRlZEJ5TW9zdFNwYWNlWzBdWzBdO1xuICAgICAgaWYgKHJlc2V0UGxhY2VtZW50ICE9PSBwbGFjZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4ICsgMSxcbiAgICAgICAgICAgIG92ZXJmbG93czogYWxsT3ZlcmZsb3dzXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcGxhY2VtZW50OiByZXNldFBsYWNlbWVudFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBmbGlwcGluZyB0aGUgYHBsYWNlbWVudGBcbiAqIGluIG9yZGVyIHRvIGtlZXAgaXQgaW4gdmlldyB3aGVuIHRoZSBwcmVmZXJyZWQgcGxhY2VtZW50KHMpIHdpbGwgb3ZlcmZsb3cgdGhlXG4gKiBjbGlwcGluZyBib3VuZGFyeS4gQWx0ZXJuYXRpdmUgdG8gYGF1dG9QbGFjZW1lbnRgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2ZsaXBcbiAqL1xuY29uc3QgZmxpcCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnZmxpcCcsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRhcnJvdywgX21pZGRsZXdhcmVEYXRhJGZsaXA7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgbWlkZGxld2FyZURhdGEsXG4gICAgICAgIHJlY3RzLFxuICAgICAgICBpbml0aWFsUGxhY2VtZW50LFxuICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgZWxlbWVudHNcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgICAgICBjcm9zc0F4aXM6IGNoZWNrQ3Jvc3NBeGlzID0gdHJ1ZSxcbiAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICAgIGZhbGxiYWNrU3RyYXRlZ3kgPSAnYmVzdEZpdCcsXG4gICAgICAgIGZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb24gPSAnbm9uZScsXG4gICAgICAgIGZsaXBBbGlnbm1lbnQgPSB0cnVlLFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG5cbiAgICAgIC8vIElmIGEgcmVzZXQgYnkgdGhlIGFycm93IHdhcyBjYXVzZWQgZHVlIHRvIGFuIGFsaWdubWVudCBvZmZzZXQgYmVpbmdcbiAgICAgIC8vIGFkZGVkLCB3ZSBzaG91bGQgc2tpcCBhbnkgbG9naWMgbm93IHNpbmNlIGBmbGlwKClgIGhhcyBhbHJlYWR5IGRvbmUgaXRzXG4gICAgICAvLyB3b3JrLlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8yNTQ5I2lzc3VlY29tbWVudC0xNzE5NjAxNjQzXG4gICAgICBpZiAoKF9taWRkbGV3YXJlRGF0YSRhcnJvdyA9IG1pZGRsZXdhcmVEYXRhLmFycm93KSAhPSBudWxsICYmIF9taWRkbGV3YXJlRGF0YSRhcnJvdy5hbGlnbm1lbnRPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IGluaXRpYWxTaWRlQXhpcyA9IGdldFNpZGVBeGlzKGluaXRpYWxQbGFjZW1lbnQpO1xuICAgICAgY29uc3QgaXNCYXNlUGxhY2VtZW50ID0gZ2V0U2lkZShpbml0aWFsUGxhY2VtZW50KSA9PT0gaW5pdGlhbFBsYWNlbWVudDtcbiAgICAgIGNvbnN0IHJ0bCA9IGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKTtcbiAgICAgIGNvbnN0IGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwQWxpZ25tZW50ID8gW2dldE9wcG9zaXRlUGxhY2VtZW50KGluaXRpYWxQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkUGxhY2VtZW50cyhpbml0aWFsUGxhY2VtZW50KSk7XG4gICAgICBjb25zdCBoYXNGYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uID0gZmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbiAhPT0gJ25vbmUnO1xuICAgICAgaWYgKCFzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgJiYgaGFzRmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbikge1xuICAgICAgICBmYWxsYmFja1BsYWNlbWVudHMucHVzaCguLi5nZXRPcHBvc2l0ZUF4aXNQbGFjZW1lbnRzKGluaXRpYWxQbGFjZW1lbnQsIGZsaXBBbGlnbm1lbnQsIGZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb24sIHJ0bCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGxhY2VtZW50cyA9IFtpbml0aWFsUGxhY2VtZW50LCAuLi5mYWxsYmFja1BsYWNlbWVudHNdO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgZGV0ZWN0T3ZlcmZsb3dPcHRpb25zKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93cyA9IFtdO1xuICAgICAgbGV0IG92ZXJmbG93c0RhdGEgPSAoKF9taWRkbGV3YXJlRGF0YSRmbGlwID0gbWlkZGxld2FyZURhdGEuZmxpcCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRmbGlwLm92ZXJmbG93cykgfHwgW107XG4gICAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgICBvdmVyZmxvd3MucHVzaChvdmVyZmxvd1tzaWRlXSk7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tDcm9zc0F4aXMpIHtcbiAgICAgICAgY29uc3Qgc2lkZXMgPSBnZXRBbGlnbm1lbnRTaWRlcyhwbGFjZW1lbnQsIHJlY3RzLCBydGwpO1xuICAgICAgICBvdmVyZmxvd3MucHVzaChvdmVyZmxvd1tzaWRlc1swXV0sIG92ZXJmbG93W3NpZGVzWzFdXSk7XG4gICAgICB9XG4gICAgICBvdmVyZmxvd3NEYXRhID0gWy4uLm92ZXJmbG93c0RhdGEsIHtcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBvdmVyZmxvd3NcbiAgICAgIH1dO1xuXG4gICAgICAvLyBPbmUgb3IgbW9yZSBzaWRlcyBpcyBvdmVyZmxvd2luZy5cbiAgICAgIGlmICghb3ZlcmZsb3dzLmV2ZXJ5KHNpZGUgPT4gc2lkZSA8PSAwKSkge1xuICAgICAgICB2YXIgX21pZGRsZXdhcmVEYXRhJGZsaXAyLCBfb3ZlcmZsb3dzRGF0YSRmaWx0ZXI7XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9ICgoKF9taWRkbGV3YXJlRGF0YSRmbGlwMiA9IG1pZGRsZXdhcmVEYXRhLmZsaXApID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkZmxpcDIuaW5kZXgpIHx8IDApICsgMTtcbiAgICAgICAgY29uc3QgbmV4dFBsYWNlbWVudCA9IHBsYWNlbWVudHNbbmV4dEluZGV4XTtcbiAgICAgICAgaWYgKG5leHRQbGFjZW1lbnQpIHtcbiAgICAgICAgICAvLyBUcnkgbmV4dCBwbGFjZW1lbnQgYW5kIHJlLXJ1biB0aGUgbGlmZWN5Y2xlLlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGluZGV4OiBuZXh0SW5kZXgsXG4gICAgICAgICAgICAgIG92ZXJmbG93czogb3ZlcmZsb3dzRGF0YVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICAgIHBsYWNlbWVudDogbmV4dFBsYWNlbWVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJzdCwgZmluZCB0aGUgY2FuZGlkYXRlcyB0aGF0IGZpdCBvbiB0aGUgbWFpbkF4aXMgc2lkZSBvZiBvdmVyZmxvdyxcbiAgICAgICAgLy8gdGhlbiBmaW5kIHRoZSBwbGFjZW1lbnQgdGhhdCBmaXRzIHRoZSBiZXN0IG9uIHRoZSBtYWluIGNyb3NzQXhpcyBzaWRlLlxuICAgICAgICBsZXQgcmVzZXRQbGFjZW1lbnQgPSAoX292ZXJmbG93c0RhdGEkZmlsdGVyID0gb3ZlcmZsb3dzRGF0YS5maWx0ZXIoZCA9PiBkLm92ZXJmbG93c1swXSA8PSAwKS5zb3J0KChhLCBiKSA9PiBhLm92ZXJmbG93c1sxXSAtIGIub3ZlcmZsb3dzWzFdKVswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9vdmVyZmxvd3NEYXRhJGZpbHRlci5wbGFjZW1lbnQ7XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGZhbGxiYWNrLlxuICAgICAgICBpZiAoIXJlc2V0UGxhY2VtZW50KSB7XG4gICAgICAgICAgc3dpdGNoIChmYWxsYmFja1N0cmF0ZWd5KSB7XG4gICAgICAgICAgICBjYXNlICdiZXN0Rml0JzpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfb3ZlcmZsb3dzRGF0YSRmaWx0ZXIyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IChfb3ZlcmZsb3dzRGF0YSRmaWx0ZXIyID0gb3ZlcmZsb3dzRGF0YS5maWx0ZXIoZCA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoaGFzRmFsbGJhY2tBeGlzU2lkZURpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2lkZUF4aXMgPSBnZXRTaWRlQXhpcyhkLnBsYWNlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2lkZUF4aXMgPT09IGluaXRpYWxTaWRlQXhpcyB8fFxuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBiaWFzIHRvIHRoZSBgeWAgc2lkZSBheGlzIGR1ZSB0byBob3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWRpbmcgZGlyZWN0aW9ucyBmYXZvcmluZyBncmVhdGVyIHdpZHRoLlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2lkZUF4aXMgPT09ICd5JztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0pLm1hcChkID0+IFtkLnBsYWNlbWVudCwgZC5vdmVyZmxvd3MuZmlsdGVyKG92ZXJmbG93ID0+IG92ZXJmbG93ID4gMCkucmVkdWNlKChhY2MsIG92ZXJmbG93KSA9PiBhY2MgKyBvdmVyZmxvdywgMCldKS5zb3J0KChhLCBiKSA9PiBhWzFdIC0gYlsxXSlbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfb3ZlcmZsb3dzRGF0YSRmaWx0ZXIyWzBdO1xuICAgICAgICAgICAgICAgIGlmIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgIHJlc2V0UGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnaW5pdGlhbFBsYWNlbWVudCc6XG4gICAgICAgICAgICAgIHJlc2V0UGxhY2VtZW50ID0gaW5pdGlhbFBsYWNlbWVudDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwbGFjZW1lbnQgIT09IHJlc2V0UGxhY2VtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICAgIHBsYWNlbWVudDogcmVzZXRQbGFjZW1lbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9O1xufTtcblxuZnVuY3Rpb24gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3QpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aFxuICB9O1xufVxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBzaWRlcy5zb21lKHNpZGUgPT4gb3ZlcmZsb3dbc2lkZV0gPj0gMCk7XG59XG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gaGlkZSB0aGUgZmxvYXRpbmcgZWxlbWVudCBpbiBhcHBsaWNhYmxlIHNpdHVhdGlvbnMsIHN1Y2ggYXNcbiAqIHdoZW4gaXQgaXMgbm90IGluIHRoZSBzYW1lIGNsaXBwaW5nIGNvbnRleHQgYXMgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2hpZGVcbiAqL1xuY29uc3QgaGlkZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnaGlkZScsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByZWN0c1xuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdHJhdGVneSA9ICdyZWZlcmVuY2VIaWRkZW4nLFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7XG4gICAgICAgIGNhc2UgJ3JlZmVyZW5jZUhpZGRlbic6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnMsXG4gICAgICAgICAgICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3RzLnJlZmVyZW5jZSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlSGlkZGVuT2Zmc2V0czogb2Zmc2V0cyxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VIaWRkZW46IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvZmZzZXRzKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnZXNjYXBlZCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnMsXG4gICAgICAgICAgICAgIGFsdEJvdW5kYXJ5OiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdHMuZmxvYXRpbmcpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGVzY2FwZWRPZmZzZXRzOiBvZmZzZXRzLFxuICAgICAgICAgICAgICAgIGVzY2FwZWQ6IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvZmZzZXRzKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGdldEJvdW5kaW5nUmVjdChyZWN0cykge1xuICBjb25zdCBtaW5YID0gbWluKC4uLnJlY3RzLm1hcChyZWN0ID0+IHJlY3QubGVmdCkpO1xuICBjb25zdCBtaW5ZID0gbWluKC4uLnJlY3RzLm1hcChyZWN0ID0+IHJlY3QudG9wKSk7XG4gIGNvbnN0IG1heFggPSBtYXgoLi4ucmVjdHMubWFwKHJlY3QgPT4gcmVjdC5yaWdodCkpO1xuICBjb25zdCBtYXhZID0gbWF4KC4uLnJlY3RzLm1hcChyZWN0ID0+IHJlY3QuYm90dG9tKSk7XG4gIHJldHVybiB7XG4gICAgeDogbWluWCxcbiAgICB5OiBtaW5ZLFxuICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcbiAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZXG4gIH07XG59XG5mdW5jdGlvbiBnZXRSZWN0c0J5TGluZShyZWN0cykge1xuICBjb25zdCBzb3J0ZWRSZWN0cyA9IHJlY3RzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS55IC0gYi55KTtcbiAgY29uc3QgZ3JvdXBzID0gW107XG4gIGxldCBwcmV2UmVjdCA9IG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkUmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCByZWN0ID0gc29ydGVkUmVjdHNbaV07XG4gICAgaWYgKCFwcmV2UmVjdCB8fCByZWN0LnkgLSBwcmV2UmVjdC55ID4gcHJldlJlY3QuaGVpZ2h0IC8gMikge1xuICAgICAgZ3JvdXBzLnB1c2goW3JlY3RdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXS5wdXNoKHJlY3QpO1xuICAgIH1cbiAgICBwcmV2UmVjdCA9IHJlY3Q7XG4gIH1cbiAgcmV0dXJuIGdyb3Vwcy5tYXAocmVjdCA9PiByZWN0VG9DbGllbnRSZWN0KGdldEJvdW5kaW5nUmVjdChyZWN0KSkpO1xufVxuLyoqXG4gKiBQcm92aWRlcyBpbXByb3ZlZCBwb3NpdGlvbmluZyBmb3IgaW5saW5lIHJlZmVyZW5jZSBlbGVtZW50cyB0aGF0IGNhbiBzcGFuXG4gKiBvdmVyIG11bHRpcGxlIGxpbmVzLCBzdWNoIGFzIGh5cGVybGlua3Mgb3IgcmFuZ2Ugc2VsZWN0aW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9pbmxpbmVcbiAqL1xuY29uc3QgaW5saW5lID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdpbmxpbmUnLFxuICAgIG9wdGlvbnMsXG4gICAgYXN5bmMgZm4oc3RhdGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBzdHJhdGVneVxuICAgICAgfSA9IHN0YXRlO1xuICAgICAgLy8gQSBNb3VzZUV2ZW50J3MgY2xpZW50e1gsWX0gY29vcmRzIGNhbiBiZSB1cCB0byAyIHBpeGVscyBvZmYgYVxuICAgICAgLy8gQ2xpZW50UmVjdCdzIGJvdW5kcywgZGVzcGl0ZSB0aGUgZXZlbnQgbGlzdGVuZXIgYmVpbmcgdHJpZ2dlcmVkLiBBXG4gICAgICAvLyBwYWRkaW5nIG9mIDIgc2VlbXMgdG8gaGFuZGxlIHRoaXMgaXNzdWUuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHBhZGRpbmcgPSAyLFxuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9ID0gZXZhbHVhdGUob3B0aW9ucywgc3RhdGUpO1xuICAgICAgY29uc3QgbmF0aXZlQ2xpZW50UmVjdHMgPSBBcnJheS5mcm9tKChhd2FpdCAocGxhdGZvcm0uZ2V0Q2xpZW50UmVjdHMgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldENsaWVudFJlY3RzKGVsZW1lbnRzLnJlZmVyZW5jZSkpKSB8fCBbXSk7XG4gICAgICBjb25zdCBjbGllbnRSZWN0cyA9IGdldFJlY3RzQnlMaW5lKG5hdGl2ZUNsaWVudFJlY3RzKTtcbiAgICAgIGNvbnN0IGZhbGxiYWNrID0gcmVjdFRvQ2xpZW50UmVjdChnZXRCb3VuZGluZ1JlY3QobmF0aXZlQ2xpZW50UmVjdHMpKTtcbiAgICAgIGNvbnN0IHBhZGRpbmdPYmplY3QgPSBnZXRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpO1xuICAgICAgZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkge1xuICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIHJlY3RzIGFuZCB0aGV5IGFyZSBkaXNqb2luZWQuXG4gICAgICAgIGlmIChjbGllbnRSZWN0cy5sZW5ndGggPT09IDIgJiYgY2xpZW50UmVjdHNbMF0ubGVmdCA+IGNsaWVudFJlY3RzWzFdLnJpZ2h0ICYmIHggIT0gbnVsbCAmJiB5ICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCByZWN0IGluIHdoaWNoIHRoZSBwb2ludCBpcyBmdWxseSBpbnNpZGUuXG4gICAgICAgICAgcmV0dXJuIGNsaWVudFJlY3RzLmZpbmQocmVjdCA9PiB4ID4gcmVjdC5sZWZ0IC0gcGFkZGluZ09iamVjdC5sZWZ0ICYmIHggPCByZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodCAmJiB5ID4gcmVjdC50b3AgLSBwYWRkaW5nT2JqZWN0LnRvcCAmJiB5IDwgcmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSkgfHwgZmFsbGJhY2s7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVyZSBhcmUgMiBvciBtb3JlIGNvbm5lY3RlZCByZWN0cy5cbiAgICAgICAgaWYgKGNsaWVudFJlY3RzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgaWYgKGdldFNpZGVBeGlzKHBsYWNlbWVudCkgPT09ICd5Jykge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RSZWN0ID0gY2xpZW50UmVjdHNbMF07XG4gICAgICAgICAgICBjb25zdCBsYXN0UmVjdCA9IGNsaWVudFJlY3RzW2NsaWVudFJlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgaXNUb3AgPSBnZXRTaWRlKHBsYWNlbWVudCkgPT09ICd0b3AnO1xuICAgICAgICAgICAgY29uc3QgdG9wID0gZmlyc3RSZWN0LnRvcDtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGxhc3RSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBpc1RvcCA/IGZpcnN0UmVjdC5sZWZ0IDogbGFzdFJlY3QubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gaXNUb3AgPyBmaXJzdFJlY3QucmlnaHQgOiBsYXN0UmVjdC5yaWdodDtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgICBib3R0b20sXG4gICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICB4OiBsZWZ0LFxuICAgICAgICAgICAgICB5OiB0b3BcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGlzTGVmdFNpZGUgPSBnZXRTaWRlKHBsYWNlbWVudCkgPT09ICdsZWZ0JztcbiAgICAgICAgICBjb25zdCBtYXhSaWdodCA9IG1heCguLi5jbGllbnRSZWN0cy5tYXAocmVjdCA9PiByZWN0LnJpZ2h0KSk7XG4gICAgICAgICAgY29uc3QgbWluTGVmdCA9IG1pbiguLi5jbGllbnRSZWN0cy5tYXAocmVjdCA9PiByZWN0LmxlZnQpKTtcbiAgICAgICAgICBjb25zdCBtZWFzdXJlUmVjdHMgPSBjbGllbnRSZWN0cy5maWx0ZXIocmVjdCA9PiBpc0xlZnRTaWRlID8gcmVjdC5sZWZ0ID09PSBtaW5MZWZ0IDogcmVjdC5yaWdodCA9PT0gbWF4UmlnaHQpO1xuICAgICAgICAgIGNvbnN0IHRvcCA9IG1lYXN1cmVSZWN0c1swXS50b3A7XG4gICAgICAgICAgY29uc3QgYm90dG9tID0gbWVhc3VyZVJlY3RzW21lYXN1cmVSZWN0cy5sZW5ndGggLSAxXS5ib3R0b207XG4gICAgICAgICAgY29uc3QgbGVmdCA9IG1pbkxlZnQ7XG4gICAgICAgICAgY29uc3QgcmlnaHQgPSBtYXhSaWdodDtcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgICAgICAgICBjb25zdCBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgIGJvdHRvbSxcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICByaWdodCxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgeDogbGVmdCxcbiAgICAgICAgICAgIHk6IHRvcFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzZXRSZWN0cyA9IGF3YWl0IHBsYXRmb3JtLmdldEVsZW1lbnRSZWN0cyh7XG4gICAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuICAgICAgICB9LFxuICAgICAgICBmbG9hdGluZzogZWxlbWVudHMuZmxvYXRpbmcsXG4gICAgICAgIHN0cmF0ZWd5XG4gICAgICB9KTtcbiAgICAgIGlmIChyZWN0cy5yZWZlcmVuY2UueCAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2UueCB8fCByZWN0cy5yZWZlcmVuY2UueSAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2UueSB8fCByZWN0cy5yZWZlcmVuY2Uud2lkdGggIT09IHJlc2V0UmVjdHMucmVmZXJlbmNlLndpZHRoIHx8IHJlY3RzLnJlZmVyZW5jZS5oZWlnaHQgIT09IHJlc2V0UmVjdHMucmVmZXJlbmNlLmhlaWdodCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICByZWN0czogcmVzZXRSZWN0c1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG59O1xuXG4vLyBGb3IgdHlwZSBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSwgdGhlIGBPZmZzZXRPcHRpb25zYCB0eXBlIHdhcyBhbHNvXG4vLyBEZXJpdmFibGUuXG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZVRvQ29vcmRzKHN0YXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBwbGFjZW1lbnQsXG4gICAgcGxhdGZvcm0sXG4gICAgZWxlbWVudHNcbiAgfSA9IHN0YXRlO1xuICBjb25zdCBydGwgPSBhd2FpdCAocGxhdGZvcm0uaXNSVEwgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzUlRMKGVsZW1lbnRzLmZsb2F0aW5nKSk7XG4gIGNvbnN0IHNpZGUgPSBnZXRTaWRlKHBsYWNlbWVudCk7XG4gIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICBjb25zdCBpc1ZlcnRpY2FsID0gZ2V0U2lkZUF4aXMocGxhY2VtZW50KSA9PT0gJ3knO1xuICBjb25zdCBtYWluQXhpc011bHRpID0gWydsZWZ0JywgJ3RvcCddLmluY2x1ZGVzKHNpZGUpID8gLTEgOiAxO1xuICBjb25zdCBjcm9zc0F4aXNNdWx0aSA9IHJ0bCAmJiBpc1ZlcnRpY2FsID8gLTEgOiAxO1xuICBjb25zdCByYXdWYWx1ZSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gIGxldCB7XG4gICAgbWFpbkF4aXMsXG4gICAgY3Jvc3NBeGlzLFxuICAgIGFsaWdubWVudEF4aXNcbiAgfSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgbWFpbkF4aXM6IHJhd1ZhbHVlLFxuICAgIGNyb3NzQXhpczogMCxcbiAgICBhbGlnbm1lbnRBeGlzOiBudWxsXG4gIH0gOiB7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgY3Jvc3NBeGlzOiAwLFxuICAgIGFsaWdubWVudEF4aXM6IG51bGwsXG4gICAgLi4ucmF3VmFsdWVcbiAgfTtcbiAgaWYgKGFsaWdubWVudCAmJiB0eXBlb2YgYWxpZ25tZW50QXhpcyA9PT0gJ251bWJlcicpIHtcbiAgICBjcm9zc0F4aXMgPSBhbGlnbm1lbnQgPT09ICdlbmQnID8gYWxpZ25tZW50QXhpcyAqIC0xIDogYWxpZ25tZW50QXhpcztcbiAgfVxuICByZXR1cm4gaXNWZXJ0aWNhbCA/IHtcbiAgICB4OiBjcm9zc0F4aXMgKiBjcm9zc0F4aXNNdWx0aSxcbiAgICB5OiBtYWluQXhpcyAqIG1haW5BeGlzTXVsdGlcbiAgfSA6IHtcbiAgICB4OiBtYWluQXhpcyAqIG1haW5BeGlzTXVsdGksXG4gICAgeTogY3Jvc3NBeGlzICogY3Jvc3NBeGlzTXVsdGlcbiAgfTtcbn1cblxuLyoqXG4gKiBNb2RpZmllcyB0aGUgcGxhY2VtZW50IGJ5IHRyYW5zbGF0aW5nIHRoZSBmbG9hdGluZyBlbGVtZW50IGFsb25nIHRoZVxuICogc3BlY2lmaWVkIGF4ZXMuXG4gKiBBIG51bWJlciAoc2hvcnRoYW5kIGZvciBgbWFpbkF4aXNgIG9yIGRpc3RhbmNlKSwgb3IgYW4gYXhlcyBjb25maWd1cmF0aW9uXG4gKiBvYmplY3QgbWF5IGJlIHBhc3NlZC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9vZmZzZXRcbiAqL1xuY29uc3Qgb2Zmc2V0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSAwO1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ29mZnNldCcsXG4gICAgb3B0aW9ucyxcbiAgICBhc3luYyBmbihzdGF0ZSkge1xuICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRvZmZzZSwgX21pZGRsZXdhcmVEYXRhJGFycm93O1xuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG1pZGRsZXdhcmVEYXRhXG4gICAgICB9ID0gc3RhdGU7XG4gICAgICBjb25zdCBkaWZmQ29vcmRzID0gYXdhaXQgY29udmVydFZhbHVlVG9Db29yZHMoc3RhdGUsIG9wdGlvbnMpO1xuXG4gICAgICAvLyBJZiB0aGUgcGxhY2VtZW50IGlzIHRoZSBzYW1lIGFuZCB0aGUgYXJyb3cgY2F1c2VkIGFuIGFsaWdubWVudCBvZmZzZXRcbiAgICAgIC8vIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlIHBvc2l0aW9uaW5nIGNvb3JkaW5hdGVzLlxuICAgICAgaWYgKHBsYWNlbWVudCA9PT0gKChfbWlkZGxld2FyZURhdGEkb2Zmc2UgPSBtaWRkbGV3YXJlRGF0YS5vZmZzZXQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkb2Zmc2UucGxhY2VtZW50KSAmJiAoX21pZGRsZXdhcmVEYXRhJGFycm93ID0gbWlkZGxld2FyZURhdGEuYXJyb3cpICE9IG51bGwgJiYgX21pZGRsZXdhcmVEYXRhJGFycm93LmFsaWdubWVudE9mZnNldCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB4ICsgZGlmZkNvb3Jkcy54LFxuICAgICAgICB5OiB5ICsgZGlmZkNvb3Jkcy55LFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgLi4uZGlmZkNvb3JkcyxcbiAgICAgICAgICBwbGFjZW1lbnRcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBzaGlmdGluZyBpdCBpbiBvcmRlciB0b1xuICoga2VlcCBpdCBpbiB2aWV3IHdoZW4gaXQgd2lsbCBvdmVyZmxvdyB0aGUgY2xpcHBpbmcgYm91bmRhcnkuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2hpZnRcbiAqL1xuY29uc3Qgc2hpZnQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3NoaWZ0JyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHBsYWNlbWVudFxuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBtYWluQXhpczogY2hlY2tNYWluQXhpcyA9IHRydWUsXG4gICAgICAgIGNyb3NzQXhpczogY2hlY2tDcm9zc0F4aXMgPSBmYWxzZSxcbiAgICAgICAgbGltaXRlciA9IHtcbiAgICAgICAgICBmbjogX3JlZiA9PiB7XG4gICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICB5XG4gICAgICAgICAgICB9ID0gX3JlZjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgIHlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH07XG4gICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3QgY3Jvc3NBeGlzID0gZ2V0U2lkZUF4aXMoZ2V0U2lkZShwbGFjZW1lbnQpKTtcbiAgICAgIGNvbnN0IG1haW5BeGlzID0gZ2V0T3Bwb3NpdGVBeGlzKGNyb3NzQXhpcyk7XG4gICAgICBsZXQgbWFpbkF4aXNDb29yZCA9IGNvb3Jkc1ttYWluQXhpc107XG4gICAgICBsZXQgY3Jvc3NBeGlzQ29vcmQgPSBjb29yZHNbY3Jvc3NBeGlzXTtcbiAgICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICAgIGNvbnN0IG1pblNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgICAgIGNvbnN0IG1heFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gJ2JvdHRvbScgOiAncmlnaHQnO1xuICAgICAgICBjb25zdCBtaW4gPSBtYWluQXhpc0Nvb3JkICsgb3ZlcmZsb3dbbWluU2lkZV07XG4gICAgICAgIGNvbnN0IG1heCA9IG1haW5BeGlzQ29vcmQgLSBvdmVyZmxvd1ttYXhTaWRlXTtcbiAgICAgICAgbWFpbkF4aXNDb29yZCA9IGNsYW1wKG1pbiwgbWFpbkF4aXNDb29yZCwgbWF4KTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVja0Nyb3NzQXhpcykge1xuICAgICAgICBjb25zdCBtaW5TaWRlID0gY3Jvc3NBeGlzID09PSAneScgPyAndG9wJyA6ICdsZWZ0JztcbiAgICAgICAgY29uc3QgbWF4U2lkZSA9IGNyb3NzQXhpcyA9PT0gJ3knID8gJ2JvdHRvbScgOiAncmlnaHQnO1xuICAgICAgICBjb25zdCBtaW4gPSBjcm9zc0F4aXNDb29yZCArIG92ZXJmbG93W21pblNpZGVdO1xuICAgICAgICBjb25zdCBtYXggPSBjcm9zc0F4aXNDb29yZCAtIG92ZXJmbG93W21heFNpZGVdO1xuICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGNsYW1wKG1pbiwgY3Jvc3NBeGlzQ29vcmQsIG1heCk7XG4gICAgICB9XG4gICAgICBjb25zdCBsaW1pdGVkQ29vcmRzID0gbGltaXRlci5mbih7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBbbWFpbkF4aXNdOiBtYWluQXhpc0Nvb3JkLFxuICAgICAgICBbY3Jvc3NBeGlzXTogY3Jvc3NBeGlzQ29vcmRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ubGltaXRlZENvb3JkcyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHg6IGxpbWl0ZWRDb29yZHMueCAtIHgsXG4gICAgICAgICAgeTogbGltaXRlZENvb3Jkcy55IC0geVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn07XG4vKipcbiAqIEJ1aWx0LWluIGBsaW1pdGVyYCB0aGF0IHdpbGwgc3RvcCBgc2hpZnQoKWAgYXQgYSBjZXJ0YWluIHBvaW50LlxuICovXG5jb25zdCBsaW1pdFNoaWZ0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG9wdGlvbnMsXG4gICAgZm4oc3RhdGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICByZWN0cyxcbiAgICAgICAgbWlkZGxld2FyZURhdGFcbiAgICAgIH0gPSBzdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb2Zmc2V0ID0gMCxcbiAgICAgICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgICAgICBjcm9zc0F4aXM6IGNoZWNrQ3Jvc3NBeGlzID0gdHJ1ZVxuICAgICAgfSA9IGV2YWx1YXRlKG9wdGlvbnMsIHN0YXRlKTtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNyb3NzQXhpcyA9IGdldFNpZGVBeGlzKHBsYWNlbWVudCk7XG4gICAgICBjb25zdCBtYWluQXhpcyA9IGdldE9wcG9zaXRlQXhpcyhjcm9zc0F4aXMpO1xuICAgICAgbGV0IG1haW5BeGlzQ29vcmQgPSBjb29yZHNbbWFpbkF4aXNdO1xuICAgICAgbGV0IGNyb3NzQXhpc0Nvb3JkID0gY29vcmRzW2Nyb3NzQXhpc107XG4gICAgICBjb25zdCByYXdPZmZzZXQgPSBldmFsdWF0ZShvZmZzZXQsIHN0YXRlKTtcbiAgICAgIGNvbnN0IGNvbXB1dGVkT2Zmc2V0ID0gdHlwZW9mIHJhd09mZnNldCA9PT0gJ251bWJlcicgPyB7XG4gICAgICAgIG1haW5BeGlzOiByYXdPZmZzZXQsXG4gICAgICAgIGNyb3NzQXhpczogMFxuICAgICAgfSA6IHtcbiAgICAgICAgbWFpbkF4aXM6IDAsXG4gICAgICAgIGNyb3NzQXhpczogMCxcbiAgICAgICAgLi4ucmF3T2Zmc2V0XG4gICAgICB9O1xuICAgICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgICAgY29uc3QgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICAgICAgY29uc3QgbGltaXRNaW4gPSByZWN0cy5yZWZlcmVuY2VbbWFpbkF4aXNdIC0gcmVjdHMuZmxvYXRpbmdbbGVuXSArIGNvbXB1dGVkT2Zmc2V0Lm1haW5BeGlzO1xuICAgICAgICBjb25zdCBsaW1pdE1heCA9IHJlY3RzLnJlZmVyZW5jZVttYWluQXhpc10gKyByZWN0cy5yZWZlcmVuY2VbbGVuXSAtIGNvbXB1dGVkT2Zmc2V0Lm1haW5BeGlzO1xuICAgICAgICBpZiAobWFpbkF4aXNDb29yZCA8IGxpbWl0TWluKSB7XG4gICAgICAgICAgbWFpbkF4aXNDb29yZCA9IGxpbWl0TWluO1xuICAgICAgICB9IGVsc2UgaWYgKG1haW5BeGlzQ29vcmQgPiBsaW1pdE1heCkge1xuICAgICAgICAgIG1haW5BeGlzQ29vcmQgPSBsaW1pdE1heDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNoZWNrQ3Jvc3NBeGlzKSB7XG4gICAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkb2Zmc2UsIF9taWRkbGV3YXJlRGF0YSRvZmZzZTI7XG4gICAgICAgIGNvbnN0IGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gICAgICAgIGNvbnN0IGlzT3JpZ2luU2lkZSA9IFsndG9wJywgJ2xlZnQnXS5pbmNsdWRlcyhnZXRTaWRlKHBsYWNlbWVudCkpO1xuICAgICAgICBjb25zdCBsaW1pdE1pbiA9IHJlY3RzLnJlZmVyZW5jZVtjcm9zc0F4aXNdIC0gcmVjdHMuZmxvYXRpbmdbbGVuXSArIChpc09yaWdpblNpZGUgPyAoKF9taWRkbGV3YXJlRGF0YSRvZmZzZSA9IG1pZGRsZXdhcmVEYXRhLm9mZnNldCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRvZmZzZVtjcm9zc0F4aXNdKSB8fCAwIDogMCkgKyAoaXNPcmlnaW5TaWRlID8gMCA6IGNvbXB1dGVkT2Zmc2V0LmNyb3NzQXhpcyk7XG4gICAgICAgIGNvbnN0IGxpbWl0TWF4ID0gcmVjdHMucmVmZXJlbmNlW2Nyb3NzQXhpc10gKyByZWN0cy5yZWZlcmVuY2VbbGVuXSArIChpc09yaWdpblNpZGUgPyAwIDogKChfbWlkZGxld2FyZURhdGEkb2Zmc2UyID0gbWlkZGxld2FyZURhdGEub2Zmc2V0KSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJG9mZnNlMltjcm9zc0F4aXNdKSB8fCAwKSAtIChpc09yaWdpblNpZGUgPyBjb21wdXRlZE9mZnNldC5jcm9zc0F4aXMgOiAwKTtcbiAgICAgICAgaWYgKGNyb3NzQXhpc0Nvb3JkIDwgbGltaXRNaW4pIHtcbiAgICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGxpbWl0TWluO1xuICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQXhpc0Nvb3JkID4gbGltaXRNYXgpIHtcbiAgICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGxpbWl0TWF4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbbWFpbkF4aXNdOiBtYWluQXhpc0Nvb3JkLFxuICAgICAgICBbY3Jvc3NBeGlzXTogY3Jvc3NBeGlzQ29vcmRcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRoYXQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQg4oCUXG4gKiBmb3IgaW5zdGFuY2UsIHByZXZlbnQgaXQgZnJvbSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgYm91bmRhcnkgb3IgbWF0Y2ggdGhlXG4gKiB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2l6ZVxuICovXG5jb25zdCBzaXplID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdzaXplJyxcbiAgICBvcHRpb25zLFxuICAgIGFzeW5jIGZuKHN0YXRlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBlbGVtZW50c1xuICAgICAgfSA9IHN0YXRlO1xuICAgICAgY29uc3Qge1xuICAgICAgICBhcHBseSA9ICgpID0+IHt9LFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBldmFsdWF0ZShvcHRpb25zLCBzdGF0ZSk7XG4gICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KHN0YXRlLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICAgICAgY29uc3QgaXNZQXhpcyA9IGdldFNpZGVBeGlzKHBsYWNlbWVudCkgPT09ICd5JztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgfSA9IHJlY3RzLmZsb2F0aW5nO1xuICAgICAgbGV0IGhlaWdodFNpZGU7XG4gICAgICBsZXQgd2lkdGhTaWRlO1xuICAgICAgaWYgKHNpZGUgPT09ICd0b3AnIHx8IHNpZGUgPT09ICdib3R0b20nKSB7XG4gICAgICAgIGhlaWdodFNpZGUgPSBzaWRlO1xuICAgICAgICB3aWR0aFNpZGUgPSBhbGlnbm1lbnQgPT09ICgoYXdhaXQgKHBsYXRmb3JtLmlzUlRMID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc1JUTChlbGVtZW50cy5mbG9hdGluZykpKSA/ICdzdGFydCcgOiAnZW5kJykgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2lkdGhTaWRlID0gc2lkZTtcbiAgICAgICAgaGVpZ2h0U2lkZSA9IGFsaWdubWVudCA9PT0gJ2VuZCcgPyAndG9wJyA6ICdib3R0b20nO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4aW11bUNsaXBwaW5nSGVpZ2h0ID0gaGVpZ2h0IC0gb3ZlcmZsb3cudG9wIC0gb3ZlcmZsb3cuYm90dG9tO1xuICAgICAgY29uc3QgbWF4aW11bUNsaXBwaW5nV2lkdGggPSB3aWR0aCAtIG92ZXJmbG93LmxlZnQgLSBvdmVyZmxvdy5yaWdodDtcbiAgICAgIGNvbnN0IG92ZXJmbG93QXZhaWxhYmxlSGVpZ2h0ID0gbWluKGhlaWdodCAtIG92ZXJmbG93W2hlaWdodFNpZGVdLCBtYXhpbXVtQ2xpcHBpbmdIZWlnaHQpO1xuICAgICAgY29uc3Qgb3ZlcmZsb3dBdmFpbGFibGVXaWR0aCA9IG1pbih3aWR0aCAtIG92ZXJmbG93W3dpZHRoU2lkZV0sIG1heGltdW1DbGlwcGluZ1dpZHRoKTtcbiAgICAgIGNvbnN0IG5vU2hpZnQgPSAhc3RhdGUubWlkZGxld2FyZURhdGEuc2hpZnQ7XG4gICAgICBsZXQgYXZhaWxhYmxlSGVpZ2h0ID0gb3ZlcmZsb3dBdmFpbGFibGVIZWlnaHQ7XG4gICAgICBsZXQgYXZhaWxhYmxlV2lkdGggPSBvdmVyZmxvd0F2YWlsYWJsZVdpZHRoO1xuICAgICAgaWYgKGlzWUF4aXMpIHtcbiAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBhbGlnbm1lbnQgfHwgbm9TaGlmdCA/IG1pbihvdmVyZmxvd0F2YWlsYWJsZVdpZHRoLCBtYXhpbXVtQ2xpcHBpbmdXaWR0aCkgOiBtYXhpbXVtQ2xpcHBpbmdXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF2YWlsYWJsZUhlaWdodCA9IGFsaWdubWVudCB8fCBub1NoaWZ0ID8gbWluKG92ZXJmbG93QXZhaWxhYmxlSGVpZ2h0LCBtYXhpbXVtQ2xpcHBpbmdIZWlnaHQpIDogbWF4aW11bUNsaXBwaW5nSGVpZ2h0O1xuICAgICAgfVxuICAgICAgaWYgKG5vU2hpZnQgJiYgIWFsaWdubWVudCkge1xuICAgICAgICBjb25zdCB4TWluID0gbWF4KG92ZXJmbG93LmxlZnQsIDApO1xuICAgICAgICBjb25zdCB4TWF4ID0gbWF4KG92ZXJmbG93LnJpZ2h0LCAwKTtcbiAgICAgICAgY29uc3QgeU1pbiA9IG1heChvdmVyZmxvdy50b3AsIDApO1xuICAgICAgICBjb25zdCB5TWF4ID0gbWF4KG92ZXJmbG93LmJvdHRvbSwgMCk7XG4gICAgICAgIGlmIChpc1lBeGlzKSB7XG4gICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB3aWR0aCAtIDIgKiAoeE1pbiAhPT0gMCB8fCB4TWF4ICE9PSAwID8geE1pbiArIHhNYXggOiBtYXgob3ZlcmZsb3cubGVmdCwgb3ZlcmZsb3cucmlnaHQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdmFpbGFibGVIZWlnaHQgPSBoZWlnaHQgLSAyICogKHlNaW4gIT09IDAgfHwgeU1heCAhPT0gMCA/IHlNaW4gKyB5TWF4IDogbWF4KG92ZXJmbG93LnRvcCwgb3ZlcmZsb3cuYm90dG9tKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IGFwcGx5KHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGF2YWlsYWJsZVdpZHRoLFxuICAgICAgICBhdmFpbGFibGVIZWlnaHRcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV4dERpbWVuc2lvbnMgPSBhd2FpdCBwbGF0Zm9ybS5nZXREaW1lbnNpb25zKGVsZW1lbnRzLmZsb2F0aW5nKTtcbiAgICAgIGlmICh3aWR0aCAhPT0gbmV4dERpbWVuc2lvbnMud2lkdGggfHwgaGVpZ2h0ICE9PSBuZXh0RGltZW5zaW9ucy5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcmVjdHM6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9O1xufTtcblxuZXhwb3J0IHsgYXJyb3csIGF1dG9QbGFjZW1lbnQsIGNvbXB1dGVQb3NpdGlvbiwgZGV0ZWN0T3ZlcmZsb3csIGZsaXAsIGhpZGUsIGlubGluZSwgbGltaXRTaGlmdCwgb2Zmc2V0LCBzaGlmdCwgc2l6ZSB9O1xuIiwiaW1wb3J0IHsgcmVjdFRvQ2xpZW50UmVjdCwgZGV0ZWN0T3ZlcmZsb3cgYXMgZGV0ZWN0T3ZlcmZsb3ckMSwgb2Zmc2V0IGFzIG9mZnNldCQxLCBhdXRvUGxhY2VtZW50IGFzIGF1dG9QbGFjZW1lbnQkMSwgc2hpZnQgYXMgc2hpZnQkMSwgZmxpcCBhcyBmbGlwJDEsIHNpemUgYXMgc2l6ZSQxLCBoaWRlIGFzIGhpZGUkMSwgYXJyb3cgYXMgYXJyb3ckMSwgaW5saW5lIGFzIGlubGluZSQxLCBsaW1pdFNoaWZ0IGFzIGxpbWl0U2hpZnQkMSwgY29tcHV0ZVBvc2l0aW9uIGFzIGNvbXB1dGVQb3NpdGlvbiQxIH0gZnJvbSAnQGZsb2F0aW5nLXVpL2NvcmUnO1xuaW1wb3J0IHsgcm91bmQsIGNyZWF0ZUNvb3JkcywgbWF4LCBtaW4sIGZsb29yIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzJztcbmltcG9ydCB7IGdldENvbXB1dGVkU3R5bGUsIGlzSFRNTEVsZW1lbnQsIGlzRWxlbWVudCwgZ2V0V2luZG93LCBpc1dlYktpdCwgZ2V0RnJhbWVFbGVtZW50LCBnZXREb2N1bWVudEVsZW1lbnQsIGlzVG9wTGF5ZXIsIGdldE5vZGVOYW1lLCBpc092ZXJmbG93RWxlbWVudCwgZ2V0Tm9kZVNjcm9sbCwgZ2V0T3ZlcmZsb3dBbmNlc3RvcnMsIGdldFBhcmVudE5vZGUsIGlzTGFzdFRyYXZlcnNhYmxlTm9kZSwgaXNDb250YWluaW5nQmxvY2ssIGlzVGFibGVFbGVtZW50LCBnZXRDb250YWluaW5nQmxvY2sgfSBmcm9tICdAZmxvYXRpbmctdWkvdXRpbHMvZG9tJztcbmV4cG9ydCB7IGdldE92ZXJmbG93QW5jZXN0b3JzIH0gZnJvbSAnQGZsb2F0aW5nLXVpL3V0aWxzL2RvbSc7XG5cbmZ1bmN0aW9uIGdldENzc0RpbWVuc2lvbnMoZWxlbWVudCkge1xuICBjb25zdCBjc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAvLyBJbiB0ZXN0aW5nIGVudmlyb25tZW50cywgdGhlIGB3aWR0aGAgYW5kIGBoZWlnaHRgIHByb3BlcnRpZXMgYXJlIGVtcHR5XG4gIC8vIHN0cmluZ3MgZm9yIFNWRyBlbGVtZW50cywgcmV0dXJuaW5nIE5hTi4gRmFsbGJhY2sgdG8gYDBgIGluIHRoaXMgY2FzZS5cbiAgbGV0IHdpZHRoID0gcGFyc2VGbG9hdChjc3Mud2lkdGgpIHx8IDA7XG4gIGxldCBoZWlnaHQgPSBwYXJzZUZsb2F0KGNzcy5oZWlnaHQpIHx8IDA7XG4gIGNvbnN0IGhhc09mZnNldCA9IGlzSFRNTEVsZW1lbnQoZWxlbWVudCk7XG4gIGNvbnN0IG9mZnNldFdpZHRoID0gaGFzT2Zmc2V0ID8gZWxlbWVudC5vZmZzZXRXaWR0aCA6IHdpZHRoO1xuICBjb25zdCBvZmZzZXRIZWlnaHQgPSBoYXNPZmZzZXQgPyBlbGVtZW50Lm9mZnNldEhlaWdodCA6IGhlaWdodDtcbiAgY29uc3Qgc2hvdWxkRmFsbGJhY2sgPSByb3VuZCh3aWR0aCkgIT09IG9mZnNldFdpZHRoIHx8IHJvdW5kKGhlaWdodCkgIT09IG9mZnNldEhlaWdodDtcbiAgaWYgKHNob3VsZEZhbGxiYWNrKSB7XG4gICAgd2lkdGggPSBvZmZzZXRXaWR0aDtcbiAgICBoZWlnaHQgPSBvZmZzZXRIZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgJDogc2hvdWxkRmFsbGJhY2tcbiAgfTtcbn1cblxuZnVuY3Rpb24gdW53cmFwRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiAhaXNFbGVtZW50KGVsZW1lbnQpID8gZWxlbWVudC5jb250ZXh0RWxlbWVudCA6IGVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldFNjYWxlKGVsZW1lbnQpIHtcbiAgY29uc3QgZG9tRWxlbWVudCA9IHVud3JhcEVsZW1lbnQoZWxlbWVudCk7XG4gIGlmICghaXNIVE1MRWxlbWVudChkb21FbGVtZW50KSkge1xuICAgIHJldHVybiBjcmVhdGVDb29yZHMoMSk7XG4gIH1cbiAgY29uc3QgcmVjdCA9IGRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgJFxuICB9ID0gZ2V0Q3NzRGltZW5zaW9ucyhkb21FbGVtZW50KTtcbiAgbGV0IHggPSAoJCA/IHJvdW5kKHJlY3Qud2lkdGgpIDogcmVjdC53aWR0aCkgLyB3aWR0aDtcbiAgbGV0IHkgPSAoJCA/IHJvdW5kKHJlY3QuaGVpZ2h0KSA6IHJlY3QuaGVpZ2h0KSAvIGhlaWdodDtcblxuICAvLyAwLCBOYU4sIG9yIEluZmluaXR5IHNob3VsZCBhbHdheXMgZmFsbGJhY2sgdG8gMS5cblxuICBpZiAoIXggfHwgIU51bWJlci5pc0Zpbml0ZSh4KSkge1xuICAgIHggPSAxO1xuICB9XG4gIGlmICgheSB8fCAhTnVtYmVyLmlzRmluaXRlKHkpKSB7XG4gICAgeSA9IDE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHlcbiAgfTtcbn1cblxuY29uc3Qgbm9PZmZzZXRzID0gLyojX19QVVJFX18qL2NyZWF0ZUNvb3JkcygwKTtcbmZ1bmN0aW9uIGdldFZpc3VhbE9mZnNldHMoZWxlbWVudCkge1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIGlmICghaXNXZWJLaXQoKSB8fCAhd2luLnZpc3VhbFZpZXdwb3J0KSB7XG4gICAgcmV0dXJuIG5vT2Zmc2V0cztcbiAgfVxuICByZXR1cm4ge1xuICAgIHg6IHdpbi52aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0LFxuICAgIHk6IHdpbi52aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3BcbiAgfTtcbn1cbmZ1bmN0aW9uIHNob3VsZEFkZFZpc3VhbE9mZnNldHMoZWxlbWVudCwgaXNGaXhlZCwgZmxvYXRpbmdPZmZzZXRQYXJlbnQpIHtcbiAgaWYgKGlzRml4ZWQgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWQgPSBmYWxzZTtcbiAgfVxuICBpZiAoIWZsb2F0aW5nT2Zmc2V0UGFyZW50IHx8IGlzRml4ZWQgJiYgZmxvYXRpbmdPZmZzZXRQYXJlbnQgIT09IGdldFdpbmRvdyhlbGVtZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gaXNGaXhlZDtcbn1cblxuZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGluY2x1ZGVTY2FsZSwgaXNGaXhlZFN0cmF0ZWd5LCBvZmZzZXRQYXJlbnQpIHtcbiAgaWYgKGluY2x1ZGVTY2FsZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZVNjYWxlID0gZmFsc2U7XG4gIH1cbiAgaWYgKGlzRml4ZWRTdHJhdGVneSA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZFN0cmF0ZWd5ID0gZmFsc2U7XG4gIH1cbiAgY29uc3QgY2xpZW50UmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IGRvbUVsZW1lbnQgPSB1bndyYXBFbGVtZW50KGVsZW1lbnQpO1xuICBsZXQgc2NhbGUgPSBjcmVhdGVDb29yZHMoMSk7XG4gIGlmIChpbmNsdWRlU2NhbGUpIHtcbiAgICBpZiAob2Zmc2V0UGFyZW50KSB7XG4gICAgICBpZiAoaXNFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgICAgc2NhbGUgPSBnZXRTY2FsZShvZmZzZXRQYXJlbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzY2FsZSA9IGdldFNjYWxlKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBjb25zdCB2aXN1YWxPZmZzZXRzID0gc2hvdWxkQWRkVmlzdWFsT2Zmc2V0cyhkb21FbGVtZW50LCBpc0ZpeGVkU3RyYXRlZ3ksIG9mZnNldFBhcmVudCkgPyBnZXRWaXN1YWxPZmZzZXRzKGRvbUVsZW1lbnQpIDogY3JlYXRlQ29vcmRzKDApO1xuICBsZXQgeCA9IChjbGllbnRSZWN0LmxlZnQgKyB2aXN1YWxPZmZzZXRzLngpIC8gc2NhbGUueDtcbiAgbGV0IHkgPSAoY2xpZW50UmVjdC50b3AgKyB2aXN1YWxPZmZzZXRzLnkpIC8gc2NhbGUueTtcbiAgbGV0IHdpZHRoID0gY2xpZW50UmVjdC53aWR0aCAvIHNjYWxlLng7XG4gIGxldCBoZWlnaHQgPSBjbGllbnRSZWN0LmhlaWdodCAvIHNjYWxlLnk7XG4gIGlmIChkb21FbGVtZW50KSB7XG4gICAgY29uc3Qgd2luID0gZ2V0V2luZG93KGRvbUVsZW1lbnQpO1xuICAgIGNvbnN0IG9mZnNldFdpbiA9IG9mZnNldFBhcmVudCAmJiBpc0VsZW1lbnQob2Zmc2V0UGFyZW50KSA/IGdldFdpbmRvdyhvZmZzZXRQYXJlbnQpIDogb2Zmc2V0UGFyZW50O1xuICAgIGxldCBjdXJyZW50V2luID0gd2luO1xuICAgIGxldCBjdXJyZW50SUZyYW1lID0gZ2V0RnJhbWVFbGVtZW50KGN1cnJlbnRXaW4pO1xuICAgIHdoaWxlIChjdXJyZW50SUZyYW1lICYmIG9mZnNldFBhcmVudCAmJiBvZmZzZXRXaW4gIT09IGN1cnJlbnRXaW4pIHtcbiAgICAgIGNvbnN0IGlmcmFtZVNjYWxlID0gZ2V0U2NhbGUoY3VycmVudElGcmFtZSk7XG4gICAgICBjb25zdCBpZnJhbWVSZWN0ID0gY3VycmVudElGcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudElGcmFtZSk7XG4gICAgICBjb25zdCBsZWZ0ID0gaWZyYW1lUmVjdC5sZWZ0ICsgKGN1cnJlbnRJRnJhbWUuY2xpZW50TGVmdCArIHBhcnNlRmxvYXQoY3NzLnBhZGRpbmdMZWZ0KSkgKiBpZnJhbWVTY2FsZS54O1xuICAgICAgY29uc3QgdG9wID0gaWZyYW1lUmVjdC50b3AgKyAoY3VycmVudElGcmFtZS5jbGllbnRUb3AgKyBwYXJzZUZsb2F0KGNzcy5wYWRkaW5nVG9wKSkgKiBpZnJhbWVTY2FsZS55O1xuICAgICAgeCAqPSBpZnJhbWVTY2FsZS54O1xuICAgICAgeSAqPSBpZnJhbWVTY2FsZS55O1xuICAgICAgd2lkdGggKj0gaWZyYW1lU2NhbGUueDtcbiAgICAgIGhlaWdodCAqPSBpZnJhbWVTY2FsZS55O1xuICAgICAgeCArPSBsZWZ0O1xuICAgICAgeSArPSB0b3A7XG4gICAgICBjdXJyZW50V2luID0gZ2V0V2luZG93KGN1cnJlbnRJRnJhbWUpO1xuICAgICAgY3VycmVudElGcmFtZSA9IGdldEZyYW1lRWxlbWVudChjdXJyZW50V2luKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlY3RUb0NsaWVudFJlY3Qoe1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4LFxuICAgIHlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0KF9yZWYpIHtcbiAgbGV0IHtcbiAgICBlbGVtZW50cyxcbiAgICByZWN0LFxuICAgIG9mZnNldFBhcmVudCxcbiAgICBzdHJhdGVneVxuICB9ID0gX3JlZjtcbiAgY29uc3QgaXNGaXhlZCA9IHN0cmF0ZWd5ID09PSAnZml4ZWQnO1xuICBjb25zdCBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgY29uc3QgdG9wTGF5ZXIgPSBlbGVtZW50cyA/IGlzVG9wTGF5ZXIoZWxlbWVudHMuZmxvYXRpbmcpIDogZmFsc2U7XG4gIGlmIChvZmZzZXRQYXJlbnQgPT09IGRvY3VtZW50RWxlbWVudCB8fCB0b3BMYXllciAmJiBpc0ZpeGVkKSB7XG4gICAgcmV0dXJuIHJlY3Q7XG4gIH1cbiAgbGV0IHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICBsZXQgc2NhbGUgPSBjcmVhdGVDb29yZHMoMSk7XG4gIGNvbnN0IG9mZnNldHMgPSBjcmVhdGVDb29yZHMoMCk7XG4gIGNvbnN0IGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCBpc092ZXJmbG93RWxlbWVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuICAgIGlmIChpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIGNvbnN0IG9mZnNldFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50KTtcbiAgICAgIHNjYWxlID0gZ2V0U2NhbGUob2Zmc2V0UGFyZW50KTtcbiAgICAgIG9mZnNldHMueCA9IG9mZnNldFJlY3QueCArIG9mZnNldFBhcmVudC5jbGllbnRMZWZ0O1xuICAgICAgb2Zmc2V0cy55ID0gb2Zmc2V0UmVjdC55ICsgb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcmVjdC53aWR0aCAqIHNjYWxlLngsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodCAqIHNjYWxlLnksXG4gICAgeDogcmVjdC54ICogc2NhbGUueCAtIHNjcm9sbC5zY3JvbGxMZWZ0ICogc2NhbGUueCArIG9mZnNldHMueCxcbiAgICB5OiByZWN0LnkgKiBzY2FsZS55IC0gc2Nyb2xsLnNjcm9sbFRvcCAqIHNjYWxlLnkgKyBvZmZzZXRzLnlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdHMoZWxlbWVudCkge1xuICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LmdldENsaWVudFJlY3RzKCkpO1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpLmxlZnQgKyBnZXROb2RlU2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59XG5cbi8vIEdldHMgdGhlIGVudGlyZSBzaXplIG9mIHRoZSBzY3JvbGxhYmxlIGRvY3VtZW50IGFyZWEsIGV2ZW4gZXh0ZW5kaW5nIG91dHNpZGVcbi8vIG9mIHRoZSBgPGh0bWw+YCBhbmQgYDxib2R5PmAgcmVjdCBib3VuZHMgaWYgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGUuXG5mdW5jdGlvbiBnZXREb2N1bWVudFJlY3QoZWxlbWVudCkge1xuICBjb25zdCBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICBjb25zdCBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKGVsZW1lbnQpO1xuICBjb25zdCBib2R5ID0gZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHk7XG4gIGNvbnN0IHdpZHRoID0gbWF4KGh0bWwuc2Nyb2xsV2lkdGgsIGh0bWwuY2xpZW50V2lkdGgsIGJvZHkuc2Nyb2xsV2lkdGgsIGJvZHkuY2xpZW50V2lkdGgpO1xuICBjb25zdCBoZWlnaHQgPSBtYXgoaHRtbC5zY3JvbGxIZWlnaHQsIGh0bWwuY2xpZW50SGVpZ2h0LCBib2R5LnNjcm9sbEhlaWdodCwgYm9keS5jbGllbnRIZWlnaHQpO1xuICBsZXQgeCA9IC1zY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIGNvbnN0IHkgPSAtc2Nyb2xsLnNjcm9sbFRvcDtcbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSkuZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgIHggKz0gbWF4KGh0bWwuY2xpZW50V2lkdGgsIGJvZHkuY2xpZW50V2lkdGgpIC0gd2lkdGg7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIGNvbnN0IGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIGNvbnN0IHZpc3VhbFZpZXdwb3J0ID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICBsZXQgd2lkdGggPSBodG1sLmNsaWVudFdpZHRoO1xuICBsZXQgaGVpZ2h0ID0gaHRtbC5jbGllbnRIZWlnaHQ7XG4gIGxldCB4ID0gMDtcbiAgbGV0IHkgPSAwO1xuICBpZiAodmlzdWFsVmlld3BvcnQpIHtcbiAgICB3aWR0aCA9IHZpc3VhbFZpZXdwb3J0LndpZHRoO1xuICAgIGhlaWdodCA9IHZpc3VhbFZpZXdwb3J0LmhlaWdodDtcbiAgICBjb25zdCB2aXN1YWxWaWV3cG9ydEJhc2VkID0gaXNXZWJLaXQoKTtcbiAgICBpZiAoIXZpc3VhbFZpZXdwb3J0QmFzZWQgfHwgdmlzdWFsVmlld3BvcnRCYXNlZCAmJiBzdHJhdGVneSA9PT0gJ2ZpeGVkJykge1xuICAgICAgeCA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQ7XG4gICAgICB5ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4LFxuICAgIHlcbiAgfTtcbn1cblxuLy8gUmV0dXJucyB0aGUgaW5uZXIgY2xpZW50IHJlY3QsIHN1YnRyYWN0aW5nIHNjcm9sbGJhcnMgaWYgcHJlc2VudC5cbmZ1bmN0aW9uIGdldElubmVyQm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIGNvbnN0IGNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgdHJ1ZSwgc3RyYXRlZ3kgPT09ICdmaXhlZCcpO1xuICBjb25zdCB0b3AgPSBjbGllbnRSZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICBjb25zdCBsZWZ0ID0gY2xpZW50UmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICBjb25zdCBzY2FsZSA9IGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRTY2FsZShlbGVtZW50KSA6IGNyZWF0ZUNvb3JkcygxKTtcbiAgY29uc3Qgd2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoICogc2NhbGUueDtcbiAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQgKiBzY2FsZS55O1xuICBjb25zdCB4ID0gbGVmdCAqIHNjYWxlLng7XG4gIGNvbnN0IHkgPSB0b3AgKiBzY2FsZS55O1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4LFxuICAgIHlcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldENsaWVudFJlY3RGcm9tQ2xpcHBpbmdBbmNlc3RvcihlbGVtZW50LCBjbGlwcGluZ0FuY2VzdG9yLCBzdHJhdGVneSkge1xuICBsZXQgcmVjdDtcbiAgaWYgKGNsaXBwaW5nQW5jZXN0b3IgPT09ICd2aWV3cG9ydCcpIHtcbiAgICByZWN0ID0gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KTtcbiAgfSBlbHNlIGlmIChjbGlwcGluZ0FuY2VzdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgcmVjdCA9IGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpO1xuICB9IGVsc2UgaWYgKGlzRWxlbWVudChjbGlwcGluZ0FuY2VzdG9yKSkge1xuICAgIHJlY3QgPSBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ0FuY2VzdG9yLCBzdHJhdGVneSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdmlzdWFsT2Zmc2V0cyA9IGdldFZpc3VhbE9mZnNldHMoZWxlbWVudCk7XG4gICAgcmVjdCA9IHtcbiAgICAgIC4uLmNsaXBwaW5nQW5jZXN0b3IsXG4gICAgICB4OiBjbGlwcGluZ0FuY2VzdG9yLnggLSB2aXN1YWxPZmZzZXRzLngsXG4gICAgICB5OiBjbGlwcGluZ0FuY2VzdG9yLnkgLSB2aXN1YWxPZmZzZXRzLnlcbiAgICB9O1xuICB9XG4gIHJldHVybiByZWN0VG9DbGllbnRSZWN0KHJlY3QpO1xufVxuZnVuY3Rpb24gaGFzRml4ZWRQb3NpdGlvbkFuY2VzdG9yKGVsZW1lbnQsIHN0b3BOb2RlKSB7XG4gIGNvbnN0IHBhcmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuICBpZiAocGFyZW50Tm9kZSA9PT0gc3RvcE5vZGUgfHwgIWlzRWxlbWVudChwYXJlbnROb2RlKSB8fCBpc0xhc3RUcmF2ZXJzYWJsZU5vZGUocGFyZW50Tm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGUocGFyZW50Tm9kZSkucG9zaXRpb24gPT09ICdmaXhlZCcgfHwgaGFzRml4ZWRQb3NpdGlvbkFuY2VzdG9yKHBhcmVudE5vZGUsIHN0b3BOb2RlKTtcbn1cblxuLy8gQSBcImNsaXBwaW5nIGFuY2VzdG9yXCIgaXMgYW4gYG92ZXJmbG93YCBlbGVtZW50IHdpdGggdGhlIGNoYXJhY3RlcmlzdGljIG9mXG4vLyBjbGlwcGluZyAob3IgaGlkaW5nKSBjaGlsZCBlbGVtZW50cy4gVGhpcyByZXR1cm5zIGFsbCBjbGlwcGluZyBhbmNlc3RvcnNcbi8vIG9mIHRoZSBnaXZlbiBlbGVtZW50IHVwIHRoZSB0cmVlLlxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdFbGVtZW50QW5jZXN0b3JzKGVsZW1lbnQsIGNhY2hlKSB7XG4gIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGNhY2hlLmdldChlbGVtZW50KTtcbiAgaWYgKGNhY2hlZFJlc3VsdCkge1xuICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gIH1cbiAgbGV0IHJlc3VsdCA9IGdldE92ZXJmbG93QW5jZXN0b3JzKGVsZW1lbnQsIFtdLCBmYWxzZSkuZmlsdGVyKGVsID0+IGlzRWxlbWVudChlbCkgJiYgZ2V0Tm9kZU5hbWUoZWwpICE9PSAnYm9keScpO1xuICBsZXQgY3VycmVudENvbnRhaW5pbmdCbG9ja0NvbXB1dGVkU3R5bGUgPSBudWxsO1xuICBjb25zdCBlbGVtZW50SXNGaXhlZCA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCc7XG4gIGxldCBjdXJyZW50Tm9kZSA9IGVsZW1lbnRJc0ZpeGVkID8gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSA6IGVsZW1lbnQ7XG5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcbiAgd2hpbGUgKGlzRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgIWlzTGFzdFRyYXZlcnNhYmxlTm9kZShjdXJyZW50Tm9kZSkpIHtcbiAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7XG4gICAgY29uc3QgY3VycmVudE5vZGVJc0NvbnRhaW5pbmcgPSBpc0NvbnRhaW5pbmdCbG9jayhjdXJyZW50Tm9kZSk7XG4gICAgaWYgKCFjdXJyZW50Tm9kZUlzQ29udGFpbmluZyAmJiBjb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgICBjdXJyZW50Q29udGFpbmluZ0Jsb2NrQ29tcHV0ZWRTdHlsZSA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHNob3VsZERyb3BDdXJyZW50Tm9kZSA9IGVsZW1lbnRJc0ZpeGVkID8gIWN1cnJlbnROb2RlSXNDb250YWluaW5nICYmICFjdXJyZW50Q29udGFpbmluZ0Jsb2NrQ29tcHV0ZWRTdHlsZSA6ICFjdXJyZW50Tm9kZUlzQ29udGFpbmluZyAmJiBjb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJyAmJiAhIWN1cnJlbnRDb250YWluaW5nQmxvY2tDb21wdXRlZFN0eWxlICYmIFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmNsdWRlcyhjdXJyZW50Q29udGFpbmluZ0Jsb2NrQ29tcHV0ZWRTdHlsZS5wb3NpdGlvbikgfHwgaXNPdmVyZmxvd0VsZW1lbnQoY3VycmVudE5vZGUpICYmICFjdXJyZW50Tm9kZUlzQ29udGFpbmluZyAmJiBoYXNGaXhlZFBvc2l0aW9uQW5jZXN0b3IoZWxlbWVudCwgY3VycmVudE5vZGUpO1xuICAgIGlmIChzaG91bGREcm9wQ3VycmVudE5vZGUpIHtcbiAgICAgIC8vIERyb3Agbm9uLWNvbnRhaW5pbmcgYmxvY2tzLlxuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcihhbmNlc3RvciA9PiBhbmNlc3RvciAhPT0gY3VycmVudE5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZWNvcmQgbGFzdCBjb250YWluaW5nIGJsb2NrIGZvciBuZXh0IGl0ZXJhdGlvbi5cbiAgICAgIGN1cnJlbnRDb250YWluaW5nQmxvY2tDb21wdXRlZFN0eWxlID0gY29tcHV0ZWRTdHlsZTtcbiAgICB9XG4gICAgY3VycmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGN1cnJlbnROb2RlKTtcbiAgfVxuICBjYWNoZS5zZXQoZWxlbWVudCwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gR2V0cyB0aGUgbWF4aW11bSBhcmVhIHRoYXQgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBpbiBkdWUgdG8gYW55IG51bWJlciBvZlxuLy8gY2xpcHBpbmcgYW5jZXN0b3JzLlxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KF9yZWYpIHtcbiAgbGV0IHtcbiAgICBlbGVtZW50LFxuICAgIGJvdW5kYXJ5LFxuICAgIHJvb3RCb3VuZGFyeSxcbiAgICBzdHJhdGVneVxuICB9ID0gX3JlZjtcbiAgY29uc3QgZWxlbWVudENsaXBwaW5nQW5jZXN0b3JzID0gYm91bmRhcnkgPT09ICdjbGlwcGluZ0FuY2VzdG9ycycgPyBpc1RvcExheWVyKGVsZW1lbnQpID8gW10gOiBnZXRDbGlwcGluZ0VsZW1lbnRBbmNlc3RvcnMoZWxlbWVudCwgdGhpcy5fYykgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICBjb25zdCBjbGlwcGluZ0FuY2VzdG9ycyA9IFsuLi5lbGVtZW50Q2xpcHBpbmdBbmNlc3RvcnMsIHJvb3RCb3VuZGFyeV07XG4gIGNvbnN0IGZpcnN0Q2xpcHBpbmdBbmNlc3RvciA9IGNsaXBwaW5nQW5jZXN0b3JzWzBdO1xuICBjb25zdCBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ0FuY2VzdG9ycy5yZWR1Y2UoKGFjY1JlY3QsIGNsaXBwaW5nQW5jZXN0b3IpID0+IHtcbiAgICBjb25zdCByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21DbGlwcGluZ0FuY2VzdG9yKGVsZW1lbnQsIGNsaXBwaW5nQW5jZXN0b3IsIHN0cmF0ZWd5KTtcbiAgICBhY2NSZWN0LnRvcCA9IG1heChyZWN0LnRvcCwgYWNjUmVjdC50b3ApO1xuICAgIGFjY1JlY3QucmlnaHQgPSBtaW4ocmVjdC5yaWdodCwgYWNjUmVjdC5yaWdodCk7XG4gICAgYWNjUmVjdC5ib3R0b20gPSBtaW4ocmVjdC5ib3R0b20sIGFjY1JlY3QuYm90dG9tKTtcbiAgICBhY2NSZWN0LmxlZnQgPSBtYXgocmVjdC5sZWZ0LCBhY2NSZWN0LmxlZnQpO1xuICAgIHJldHVybiBhY2NSZWN0O1xuICB9LCBnZXRDbGllbnRSZWN0RnJvbUNsaXBwaW5nQW5jZXN0b3IoZWxlbWVudCwgZmlyc3RDbGlwcGluZ0FuY2VzdG9yLCBzdHJhdGVneSkpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdCxcbiAgICBoZWlnaHQ6IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wLFxuICAgIHg6IGNsaXBwaW5nUmVjdC5sZWZ0LFxuICAgIHk6IGNsaXBwaW5nUmVjdC50b3BcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyhlbGVtZW50KSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfSA9IGdldENzc0RpbWVuc2lvbnMoZWxlbWVudCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJlY3RSZWxhdGl2ZVRvT2Zmc2V0UGFyZW50KGVsZW1lbnQsIG9mZnNldFBhcmVudCwgc3RyYXRlZ3kpIHtcbiAgY29uc3QgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIGNvbnN0IGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICBjb25zdCBpc0ZpeGVkID0gc3RyYXRlZ3kgPT09ICdmaXhlZCc7XG4gIGNvbnN0IHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgdHJ1ZSwgaXNGaXhlZCwgb2Zmc2V0UGFyZW50KTtcbiAgbGV0IHNjcm9sbCA9IHtcbiAgICBzY3JvbGxMZWZ0OiAwLFxuICAgIHNjcm9sbFRvcDogMFxuICB9O1xuICBjb25zdCBvZmZzZXRzID0gY3JlYXRlQ29vcmRzKDApO1xuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmICFpc0ZpeGVkKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCBpc092ZXJmbG93RWxlbWVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuICAgIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCkge1xuICAgICAgY29uc3Qgb2Zmc2V0UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUsIGlzRml4ZWQsIG9mZnNldFBhcmVudCk7XG4gICAgICBvZmZzZXRzLnggPSBvZmZzZXRSZWN0LnggKyBvZmZzZXRQYXJlbnQuY2xpZW50TGVmdDtcbiAgICAgIG9mZnNldHMueSA9IG9mZnNldFJlY3QueSArIG9mZnNldFBhcmVudC5jbGllbnRUb3A7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIG9mZnNldHMueCA9IGdldFdpbmRvd1Njcm9sbEJhclgoZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgeCA9IHJlY3QubGVmdCArIHNjcm9sbC5zY3JvbGxMZWZ0IC0gb2Zmc2V0cy54O1xuICBjb25zdCB5ID0gcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55O1xuICByZXR1cm4ge1xuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzU3RhdGljUG9zaXRpb25lZChlbGVtZW50KSB7XG4gIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJztcbn1cblxuZnVuY3Rpb24gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50LCBwb2x5ZmlsbCkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChwb2x5ZmlsbCkge1xuICAgIHJldHVybiBwb2x5ZmlsbChlbGVtZW50KTtcbiAgfVxuICByZXR1cm4gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG59XG5cbi8vIEdldHMgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgcG9zaXRpb25lZCBlbGVtZW50LiBIYW5kbGVzIHNvbWUgZWRnZSBjYXNlcyxcbi8vIHN1Y2ggYXMgdGFibGUgYW5jZXN0b3JzIGFuZCBjcm9zcyBicm93c2VyIGJ1Z3MuXG5mdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCwgcG9seWZpbGwpIHtcbiAgY29uc3Qgd2luID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICBpZiAoaXNUb3BMYXllcihlbGVtZW50KSkge1xuICAgIHJldHVybiB3aW47XG4gIH1cbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgbGV0IHN2Z09mZnNldFBhcmVudCA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgd2hpbGUgKHN2Z09mZnNldFBhcmVudCAmJiAhaXNMYXN0VHJhdmVyc2FibGVOb2RlKHN2Z09mZnNldFBhcmVudCkpIHtcbiAgICAgIGlmIChpc0VsZW1lbnQoc3ZnT2Zmc2V0UGFyZW50KSAmJiAhaXNTdGF0aWNQb3NpdGlvbmVkKHN2Z09mZnNldFBhcmVudCkpIHtcbiAgICAgICAgcmV0dXJuIHN2Z09mZnNldFBhcmVudDtcbiAgICAgIH1cbiAgICAgIHN2Z09mZnNldFBhcmVudCA9IGdldFBhcmVudE5vZGUoc3ZnT2Zmc2V0UGFyZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHdpbjtcbiAgfVxuICBsZXQgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50LCBwb2x5ZmlsbCk7XG4gIHdoaWxlIChvZmZzZXRQYXJlbnQgJiYgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc1N0YXRpY1Bvc2l0aW9uZWQob2Zmc2V0UGFyZW50KSkge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50LCBwb2x5ZmlsbCk7XG4gIH1cbiAgaWYgKG9mZnNldFBhcmVudCAmJiBpc0xhc3RUcmF2ZXJzYWJsZU5vZGUob2Zmc2V0UGFyZW50KSAmJiBpc1N0YXRpY1Bvc2l0aW9uZWQob2Zmc2V0UGFyZW50KSAmJiAhaXNDb250YWluaW5nQmxvY2sob2Zmc2V0UGFyZW50KSkge1xuICAgIHJldHVybiB3aW47XG4gIH1cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luO1xufVxuXG5jb25zdCBnZXRFbGVtZW50UmVjdHMgPSBhc3luYyBmdW5jdGlvbiAoZGF0YSkge1xuICBjb25zdCBnZXRPZmZzZXRQYXJlbnRGbiA9IHRoaXMuZ2V0T2Zmc2V0UGFyZW50IHx8IGdldE9mZnNldFBhcmVudDtcbiAgY29uc3QgZ2V0RGltZW5zaW9uc0ZuID0gdGhpcy5nZXREaW1lbnNpb25zO1xuICBjb25zdCBmbG9hdGluZ0RpbWVuc2lvbnMgPSBhd2FpdCBnZXREaW1lbnNpb25zRm4oZGF0YS5mbG9hdGluZyk7XG4gIHJldHVybiB7XG4gICAgcmVmZXJlbmNlOiBnZXRSZWN0UmVsYXRpdmVUb09mZnNldFBhcmVudChkYXRhLnJlZmVyZW5jZSwgYXdhaXQgZ2V0T2Zmc2V0UGFyZW50Rm4oZGF0YS5mbG9hdGluZyksIGRhdGEuc3RyYXRlZ3kpLFxuICAgIGZsb2F0aW5nOiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIHdpZHRoOiBmbG9hdGluZ0RpbWVuc2lvbnMud2lkdGgsXG4gICAgICBoZWlnaHQ6IGZsb2F0aW5nRGltZW5zaW9ucy5oZWlnaHRcbiAgICB9XG4gIH07XG59O1xuXG5mdW5jdGlvbiBpc1JUTChlbGVtZW50KSB7XG4gIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmRpcmVjdGlvbiA9PT0gJ3J0bCc7XG59XG5cbmNvbnN0IHBsYXRmb3JtID0ge1xuICBjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCxcbiAgZ2V0RG9jdW1lbnRFbGVtZW50LFxuICBnZXRDbGlwcGluZ1JlY3QsXG4gIGdldE9mZnNldFBhcmVudCxcbiAgZ2V0RWxlbWVudFJlY3RzLFxuICBnZXRDbGllbnRSZWN0cyxcbiAgZ2V0RGltZW5zaW9ucyxcbiAgZ2V0U2NhbGUsXG4gIGlzRWxlbWVudCxcbiAgaXNSVExcbn07XG5cbi8vIGh0dHBzOi8vc2FtdGhvci5hdS8yMDIxL29ic2VydmluZy1kb20vXG5mdW5jdGlvbiBvYnNlcnZlTW92ZShlbGVtZW50LCBvbk1vdmUpIHtcbiAgbGV0IGlvID0gbnVsbDtcbiAgbGV0IHRpbWVvdXRJZDtcbiAgY29uc3Qgcm9vdCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICB2YXIgX2lvO1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIChfaW8gPSBpbykgPT0gbnVsbCB8fCBfaW8uZGlzY29ubmVjdCgpO1xuICAgIGlvID0gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiByZWZyZXNoKHNraXAsIHRocmVzaG9sZCkge1xuICAgIGlmIChza2lwID09PSB2b2lkIDApIHtcbiAgICAgIHNraXAgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRocmVzaG9sZCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aHJlc2hvbGQgPSAxO1xuICAgIH1cbiAgICBjbGVhbnVwKCk7XG4gICAgY29uc3Qge1xuICAgICAgbGVmdCxcbiAgICAgIHRvcCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKCFza2lwKSB7XG4gICAgICBvbk1vdmUoKTtcbiAgICB9XG4gICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluc2V0VG9wID0gZmxvb3IodG9wKTtcbiAgICBjb25zdCBpbnNldFJpZ2h0ID0gZmxvb3Iocm9vdC5jbGllbnRXaWR0aCAtIChsZWZ0ICsgd2lkdGgpKTtcbiAgICBjb25zdCBpbnNldEJvdHRvbSA9IGZsb29yKHJvb3QuY2xpZW50SGVpZ2h0IC0gKHRvcCArIGhlaWdodCkpO1xuICAgIGNvbnN0IGluc2V0TGVmdCA9IGZsb29yKGxlZnQpO1xuICAgIGNvbnN0IHJvb3RNYXJnaW4gPSAtaW5zZXRUb3AgKyBcInB4IFwiICsgLWluc2V0UmlnaHQgKyBcInB4IFwiICsgLWluc2V0Qm90dG9tICsgXCJweCBcIiArIC1pbnNldExlZnQgKyBcInB4XCI7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHJvb3RNYXJnaW4sXG4gICAgICB0aHJlc2hvbGQ6IG1heCgwLCBtaW4oMSwgdGhyZXNob2xkKSkgfHwgMVxuICAgIH07XG4gICAgbGV0IGlzRmlyc3RVcGRhdGUgPSB0cnVlO1xuICAgIGZ1bmN0aW9uIGhhbmRsZU9ic2VydmUoZW50cmllcykge1xuICAgICAgY29uc3QgcmF0aW8gPSBlbnRyaWVzWzBdLmludGVyc2VjdGlvblJhdGlvO1xuICAgICAgaWYgKHJhdGlvICE9PSB0aHJlc2hvbGQpIHtcbiAgICAgICAgaWYgKCFpc0ZpcnN0VXBkYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHJlZnJlc2goKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJhdGlvKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHJlZmVyZW5jZSBpcyBjbGlwcGVkLCB0aGUgcmF0aW8gaXMgMC4gVGhyb3R0bGUgdGhlIHJlZnJlc2hcbiAgICAgICAgICAvLyB0byBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3Agb2YgdXBkYXRlcy5cbiAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHJlZnJlc2goZmFsc2UsIDFlLTcpO1xuICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZnJlc2goZmFsc2UsIHJhdGlvKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaXNGaXJzdFVwZGF0ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE9sZGVyIGJyb3dzZXJzIGRvbid0IHN1cHBvcnQgYSBgZG9jdW1lbnRgIGFzIHRoZSByb290IGFuZCB3aWxsIHRocm93IGFuXG4gICAgLy8gZXJyb3IuXG4gICAgdHJ5IHtcbiAgICAgIGlvID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGhhbmRsZU9ic2VydmUsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgLy8gSGFuZGxlIDxpZnJhbWU+c1xuICAgICAgICByb290OiByb290Lm93bmVyRG9jdW1lbnRcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlvID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGhhbmRsZU9ic2VydmUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpby5vYnNlcnZlKGVsZW1lbnQpO1xuICB9XG4gIHJlZnJlc2godHJ1ZSk7XG4gIHJldHVybiBjbGVhbnVwO1xufVxuXG4vKipcbiAqIEF1dG9tYXRpY2FsbHkgdXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgd2hlbiBuZWNlc3NhcnkuXG4gKiBTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZmxvYXRpbmcgZWxlbWVudCBpcyBtb3VudGVkIG9uIHRoZSBET00gb3JcbiAqIHZpc2libGUgb24gdGhlIHNjcmVlbi5cbiAqIEByZXR1cm5zIGNsZWFudXAgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgaW52b2tlZCB3aGVuIHRoZSBmbG9hdGluZyBlbGVtZW50IGlzXG4gKiByZW1vdmVkIGZyb20gdGhlIERPTSBvciBoaWRkZW4gZnJvbSB0aGUgc2NyZWVuLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2F1dG9VcGRhdGVcbiAqL1xuZnVuY3Rpb24gYXV0b1VwZGF0ZShyZWZlcmVuY2UsIGZsb2F0aW5nLCB1cGRhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgYW5jZXN0b3JTY3JvbGwgPSB0cnVlLFxuICAgIGFuY2VzdG9yUmVzaXplID0gdHJ1ZSxcbiAgICBlbGVtZW50UmVzaXplID0gdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAnZnVuY3Rpb24nLFxuICAgIGxheW91dFNoaWZ0ID0gdHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyID09PSAnZnVuY3Rpb24nLFxuICAgIGFuaW1hdGlvbkZyYW1lID0gZmFsc2VcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlZmVyZW5jZUVsID0gdW53cmFwRWxlbWVudChyZWZlcmVuY2UpO1xuICBjb25zdCBhbmNlc3RvcnMgPSBhbmNlc3RvclNjcm9sbCB8fCBhbmNlc3RvclJlc2l6ZSA/IFsuLi4ocmVmZXJlbmNlRWwgPyBnZXRPdmVyZmxvd0FuY2VzdG9ycyhyZWZlcmVuY2VFbCkgOiBbXSksIC4uLmdldE92ZXJmbG93QW5jZXN0b3JzKGZsb2F0aW5nKV0gOiBbXTtcbiAgYW5jZXN0b3JzLmZvckVhY2goYW5jZXN0b3IgPT4ge1xuICAgIGFuY2VzdG9yU2Nyb2xsICYmIGFuY2VzdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHVwZGF0ZSwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgIH0pO1xuICAgIGFuY2VzdG9yUmVzaXplICYmIGFuY2VzdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHVwZGF0ZSk7XG4gIH0pO1xuICBjb25zdCBjbGVhbnVwSW8gPSByZWZlcmVuY2VFbCAmJiBsYXlvdXRTaGlmdCA/IG9ic2VydmVNb3ZlKHJlZmVyZW5jZUVsLCB1cGRhdGUpIDogbnVsbDtcbiAgbGV0IHJlb2JzZXJ2ZUZyYW1lID0gLTE7XG4gIGxldCByZXNpemVPYnNlcnZlciA9IG51bGw7XG4gIGlmIChlbGVtZW50UmVzaXplKSB7XG4gICAgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoX3JlZiA9PiB7XG4gICAgICBsZXQgW2ZpcnN0RW50cnldID0gX3JlZjtcbiAgICAgIGlmIChmaXJzdEVudHJ5ICYmIGZpcnN0RW50cnkudGFyZ2V0ID09PSByZWZlcmVuY2VFbCAmJiByZXNpemVPYnNlcnZlcikge1xuICAgICAgICAvLyBQcmV2ZW50IHVwZGF0ZSBsb29wcyB3aGVuIHVzaW5nIHRoZSBgc2l6ZWAgbWlkZGxld2FyZS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb2F0aW5nLXVpL2Zsb2F0aW5nLXVpL2lzc3Vlcy8xNzQwXG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShmbG9hdGluZyk7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJlb2JzZXJ2ZUZyYW1lKTtcbiAgICAgICAgcmVvYnNlcnZlRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIHZhciBfcmVzaXplT2JzZXJ2ZXI7XG4gICAgICAgICAgKF9yZXNpemVPYnNlcnZlciA9IHJlc2l6ZU9ic2VydmVyKSA9PSBudWxsIHx8IF9yZXNpemVPYnNlcnZlci5vYnNlcnZlKGZsb2F0aW5nKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB1cGRhdGUoKTtcbiAgICB9KTtcbiAgICBpZiAocmVmZXJlbmNlRWwgJiYgIWFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHJlZmVyZW5jZUVsKTtcbiAgICB9XG4gICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShmbG9hdGluZyk7XG4gIH1cbiAgbGV0IGZyYW1lSWQ7XG4gIGxldCBwcmV2UmVmUmVjdCA9IGFuaW1hdGlvbkZyYW1lID8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHJlZmVyZW5jZSkgOiBudWxsO1xuICBpZiAoYW5pbWF0aW9uRnJhbWUpIHtcbiAgICBmcmFtZUxvb3AoKTtcbiAgfVxuICBmdW5jdGlvbiBmcmFtZUxvb3AoKSB7XG4gICAgY29uc3QgbmV4dFJlZlJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QocmVmZXJlbmNlKTtcbiAgICBpZiAocHJldlJlZlJlY3QgJiYgKG5leHRSZWZSZWN0LnggIT09IHByZXZSZWZSZWN0LnggfHwgbmV4dFJlZlJlY3QueSAhPT0gcHJldlJlZlJlY3QueSB8fCBuZXh0UmVmUmVjdC53aWR0aCAhPT0gcHJldlJlZlJlY3Qud2lkdGggfHwgbmV4dFJlZlJlY3QuaGVpZ2h0ICE9PSBwcmV2UmVmUmVjdC5oZWlnaHQpKSB7XG4gICAgICB1cGRhdGUoKTtcbiAgICB9XG4gICAgcHJldlJlZlJlY3QgPSBuZXh0UmVmUmVjdDtcbiAgICBmcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lTG9vcCk7XG4gIH1cbiAgdXBkYXRlKCk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgdmFyIF9yZXNpemVPYnNlcnZlcjI7XG4gICAgYW5jZXN0b3JzLmZvckVhY2goYW5jZXN0b3IgPT4ge1xuICAgICAgYW5jZXN0b3JTY3JvbGwgJiYgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlKTtcbiAgICAgIGFuY2VzdG9yUmVzaXplICYmIGFuY2VzdG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHVwZGF0ZSk7XG4gICAgfSk7XG4gICAgY2xlYW51cElvID09IG51bGwgfHwgY2xlYW51cElvKCk7XG4gICAgKF9yZXNpemVPYnNlcnZlcjIgPSByZXNpemVPYnNlcnZlcikgPT0gbnVsbCB8fCBfcmVzaXplT2JzZXJ2ZXIyLmRpc2Nvbm5lY3QoKTtcbiAgICByZXNpemVPYnNlcnZlciA9IG51bGw7XG4gICAgaWYgKGFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShmcmFtZUlkKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgd2l0aCBhbiBvYmplY3Qgb2Ygb3ZlcmZsb3cgc2lkZSBvZmZzZXRzIHRoYXQgZGV0ZXJtaW5lIGhvdyBtdWNoIHRoZVxuICogZWxlbWVudCBpcyBvdmVyZmxvd2luZyBhIGdpdmVuIGNsaXBwaW5nIGJvdW5kYXJ5IG9uIGVhY2ggc2lkZS5cbiAqIC0gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgYm91bmRhcnkgYnkgdGhhdCBudW1iZXIgb2YgcGl4ZWxzXG4gKiAtIG5lZ2F0aXZlID0gaG93IG1hbnkgcGl4ZWxzIGxlZnQgYmVmb3JlIGl0IHdpbGwgb3ZlcmZsb3dcbiAqIC0gMCA9IGxpZXMgZmx1c2ggd2l0aCB0aGUgYm91bmRhcnlcbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9kZXRlY3RPdmVyZmxvd1xuICovXG5jb25zdCBkZXRlY3RPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93JDE7XG5cbi8qKlxuICogTW9kaWZpZXMgdGhlIHBsYWNlbWVudCBieSB0cmFuc2xhdGluZyB0aGUgZmxvYXRpbmcgZWxlbWVudCBhbG9uZyB0aGVcbiAqIHNwZWNpZmllZCBheGVzLlxuICogQSBudW1iZXIgKHNob3J0aGFuZCBmb3IgYG1haW5BeGlzYCBvciBkaXN0YW5jZSksIG9yIGFuIGF4ZXMgY29uZmlndXJhdGlvblxuICogb2JqZWN0IG1heSBiZSBwYXNzZWQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvb2Zmc2V0XG4gKi9cbmNvbnN0IG9mZnNldCA9IG9mZnNldCQxO1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBjaG9vc2luZyB0aGUgcGxhY2VtZW50XG4gKiB0aGF0IGhhcyB0aGUgbW9zdCBzcGFjZSBhdmFpbGFibGUgYXV0b21hdGljYWxseSwgd2l0aG91dCBuZWVkaW5nIHRvIHNwZWNpZnkgYVxuICogcHJlZmVycmVkIHBsYWNlbWVudC4gQWx0ZXJuYXRpdmUgdG8gYGZsaXBgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2F1dG9QbGFjZW1lbnRcbiAqL1xuY29uc3QgYXV0b1BsYWNlbWVudCA9IGF1dG9QbGFjZW1lbnQkMTtcblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgc2hpZnRpbmcgaXQgaW4gb3JkZXIgdG9cbiAqIGtlZXAgaXQgaW4gdmlldyB3aGVuIGl0IHdpbGwgb3ZlcmZsb3cgdGhlIGNsaXBwaW5nIGJvdW5kYXJ5LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3NoaWZ0XG4gKi9cbmNvbnN0IHNoaWZ0ID0gc2hpZnQkMTtcblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgZmxpcHBpbmcgdGhlIGBwbGFjZW1lbnRgXG4gKiBpbiBvcmRlciB0byBrZWVwIGl0IGluIHZpZXcgd2hlbiB0aGUgcHJlZmVycmVkIHBsYWNlbWVudChzKSB3aWxsIG92ZXJmbG93IHRoZVxuICogY2xpcHBpbmcgYm91bmRhcnkuIEFsdGVybmF0aXZlIHRvIGBhdXRvUGxhY2VtZW50YC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9mbGlwXG4gKi9cbmNvbnN0IGZsaXAgPSBmbGlwJDE7XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0aGF0IGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IOKAlFxuICogZm9yIGluc3RhbmNlLCBwcmV2ZW50IGl0IGZyb20gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIGJvdW5kYXJ5IG9yIG1hdGNoIHRoZVxuICogd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3NpemVcbiAqL1xuY29uc3Qgc2l6ZSA9IHNpemUkMTtcblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIGhpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaW4gYXBwbGljYWJsZSBzaXR1YXRpb25zLCBzdWNoIGFzXG4gKiB3aGVuIGl0IGlzIG5vdCBpbiB0aGUgc2FtZSBjbGlwcGluZyBjb250ZXh0IGFzIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9oaWRlXG4gKi9cbmNvbnN0IGhpZGUgPSBoaWRlJDE7XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhbiBpbm5lciBlbGVtZW50IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHNvIHRoYXQgaXRcbiAqIGFwcGVhcnMgY2VudGVyZWQgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2Fycm93XG4gKi9cbmNvbnN0IGFycm93ID0gYXJyb3ckMTtcblxuLyoqXG4gKiBQcm92aWRlcyBpbXByb3ZlZCBwb3NpdGlvbmluZyBmb3IgaW5saW5lIHJlZmVyZW5jZSBlbGVtZW50cyB0aGF0IGNhbiBzcGFuXG4gKiBvdmVyIG11bHRpcGxlIGxpbmVzLCBzdWNoIGFzIGh5cGVybGlua3Mgb3IgcmFuZ2Ugc2VsZWN0aW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9pbmxpbmVcbiAqL1xuY29uc3QgaW5saW5lID0gaW5saW5lJDE7XG5cbi8qKlxuICogQnVpbHQtaW4gYGxpbWl0ZXJgIHRoYXQgd2lsbCBzdG9wIGBzaGlmdCgpYCBhdCBhIGNlcnRhaW4gcG9pbnQuXG4gKi9cbmNvbnN0IGxpbWl0U2hpZnQgPSBsaW1pdFNoaWZ0JDE7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIHRoYXQgd2lsbCBwbGFjZSB0aGUgZmxvYXRpbmcgZWxlbWVudFxuICogbmV4dCB0byBhIGdpdmVuIHJlZmVyZW5jZSBlbGVtZW50LlxuICovXG5jb25zdCBjb21wdXRlUG9zaXRpb24gPSAocmVmZXJlbmNlLCBmbG9hdGluZywgb3B0aW9ucykgPT4ge1xuICAvLyBUaGlzIGNhY2hlcyB0aGUgZXhwZW5zaXZlIGBnZXRDbGlwcGluZ0VsZW1lbnRBbmNlc3RvcnNgIGZ1bmN0aW9uIHNvIHRoYXRcbiAgLy8gbXVsdGlwbGUgbGlmZWN5Y2xlIHJlc2V0cyByZS11c2UgdGhlIHNhbWUgcmVzdWx0LiBJdCBvbmx5IGxpdmVzIGZvciBhXG4gIC8vIHNpbmdsZSBjYWxsLiBJZiBvdGhlciBmdW5jdGlvbnMgYmVjb21lIGV4cGVuc2l2ZSwgd2UgY2FuIGFkZCB0aGVtIGFzIHdlbGwuXG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcCgpO1xuICBjb25zdCBtZXJnZWRPcHRpb25zID0ge1xuICAgIHBsYXRmb3JtLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgY29uc3QgcGxhdGZvcm1XaXRoQ2FjaGUgPSB7XG4gICAgLi4ubWVyZ2VkT3B0aW9ucy5wbGF0Zm9ybSxcbiAgICBfYzogY2FjaGVcbiAgfTtcbiAgcmV0dXJuIGNvbXB1dGVQb3NpdGlvbiQxKHJlZmVyZW5jZSwgZmxvYXRpbmcsIHtcbiAgICAuLi5tZXJnZWRPcHRpb25zLFxuICAgIHBsYXRmb3JtOiBwbGF0Zm9ybVdpdGhDYWNoZVxuICB9KTtcbn07XG5cbmV4cG9ydCB7IGFycm93LCBhdXRvUGxhY2VtZW50LCBhdXRvVXBkYXRlLCBjb21wdXRlUG9zaXRpb24sIGRldGVjdE92ZXJmbG93LCBmbGlwLCBoaWRlLCBpbmxpbmUsIGxpbWl0U2hpZnQsIG9mZnNldCwgcGxhdGZvcm0sIHNoaWZ0LCBzaXplIH07XG4iLCJpbXBvcnQgeyBjb21wdXRlUG9zaXRpb24sIGFycm93IGFzIGFycm93JDIsIG9mZnNldCBhcyBvZmZzZXQkMSwgc2hpZnQgYXMgc2hpZnQkMSwgbGltaXRTaGlmdCBhcyBsaW1pdFNoaWZ0JDEsIGZsaXAgYXMgZmxpcCQxLCBzaXplIGFzIHNpemUkMSwgYXV0b1BsYWNlbWVudCBhcyBhdXRvUGxhY2VtZW50JDEsIGhpZGUgYXMgaGlkZSQxLCBpbmxpbmUgYXMgaW5saW5lJDEgfSBmcm9tICdAZmxvYXRpbmctdWkvZG9tJztcbmV4cG9ydCB7IGF1dG9VcGRhdGUsIGNvbXB1dGVQb3NpdGlvbiwgZGV0ZWN0T3ZlcmZsb3csIGdldE92ZXJmbG93QW5jZXN0b3JzLCBwbGF0Zm9ybSB9IGZyb20gJ0BmbG9hdGluZy11aS9kb20nO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0LCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG52YXIgaW5kZXggPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gdXNlTGF5b3V0RWZmZWN0IDogdXNlRWZmZWN0O1xuXG4vLyBGb3JrIG9mIGBmYXN0LWRlZXAtZXF1YWxgIHRoYXQgb25seSBkb2VzIHRoZSBjb21wYXJpc29ucyB3ZSBuZWVkIGFuZCBjb21wYXJlc1xuLy8gZnVuY3Rpb25zXG5mdW5jdGlvbiBkZWVwRXF1YWwoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBhID09PSAnZnVuY3Rpb24nICYmIGEudG9TdHJpbmcoKSA9PT0gYi50b1N0cmluZygpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgbGV0IGxlbmd0aDtcbiAgbGV0IGk7XG4gIGxldCBrZXlzO1xuICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspIHtcbiAgICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYltpXSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgaWYgKCF7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleXNbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKGtleSA9PT0gJ19vd25lcicgJiYgYS4kJHR5cGVvZikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghZGVlcEVxdWFsKGFba2V5XSwgYltrZXldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG59XG5cbmZ1bmN0aW9uIGdldERQUihlbGVtZW50KSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiAxO1xuICB9XG4gIGNvbnN0IHdpbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gIHJldHVybiB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xufVxuXG5mdW5jdGlvbiByb3VuZEJ5RFBSKGVsZW1lbnQsIHZhbHVlKSB7XG4gIGNvbnN0IGRwciA9IGdldERQUihlbGVtZW50KTtcbiAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiBkcHIpIC8gZHByO1xufVxuXG5mdW5jdGlvbiB1c2VMYXRlc3RSZWYodmFsdWUpIHtcbiAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKHZhbHVlKTtcbiAgaW5kZXgoKCkgPT4ge1xuICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVmO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gcG9zaXRpb24gYSBmbG9hdGluZyBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3VzZUZsb2F0aW5nXG4gKi9cbmZ1bmN0aW9uIHVzZUZsb2F0aW5nKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBjb25zdCB7XG4gICAgcGxhY2VtZW50ID0gJ2JvdHRvbScsXG4gICAgc3RyYXRlZ3kgPSAnYWJzb2x1dGUnLFxuICAgIG1pZGRsZXdhcmUgPSBbXSxcbiAgICBwbGF0Zm9ybSxcbiAgICBlbGVtZW50czoge1xuICAgICAgcmVmZXJlbmNlOiBleHRlcm5hbFJlZmVyZW5jZSxcbiAgICAgIGZsb2F0aW5nOiBleHRlcm5hbEZsb2F0aW5nXG4gICAgfSA9IHt9LFxuICAgIHRyYW5zZm9ybSA9IHRydWUsXG4gICAgd2hpbGVFbGVtZW50c01vdW50ZWQsXG4gICAgb3BlblxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICBzdHJhdGVneSxcbiAgICBwbGFjZW1lbnQsXG4gICAgbWlkZGxld2FyZURhdGE6IHt9LFxuICAgIGlzUG9zaXRpb25lZDogZmFsc2VcbiAgfSk7XG4gIGNvbnN0IFtsYXRlc3RNaWRkbGV3YXJlLCBzZXRMYXRlc3RNaWRkbGV3YXJlXSA9IFJlYWN0LnVzZVN0YXRlKG1pZGRsZXdhcmUpO1xuICBpZiAoIWRlZXBFcXVhbChsYXRlc3RNaWRkbGV3YXJlLCBtaWRkbGV3YXJlKSkge1xuICAgIHNldExhdGVzdE1pZGRsZXdhcmUobWlkZGxld2FyZSk7XG4gIH1cbiAgY29uc3QgW19yZWZlcmVuY2UsIF9zZXRSZWZlcmVuY2VdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtfZmxvYXRpbmcsIF9zZXRGbG9hdGluZ10gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3Qgc2V0UmVmZXJlbmNlID0gUmVhY3QudXNlQ2FsbGJhY2sobm9kZSA9PiB7XG4gICAgaWYgKG5vZGUgIT09IHJlZmVyZW5jZVJlZi5jdXJyZW50KSB7XG4gICAgICByZWZlcmVuY2VSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICBfc2V0UmVmZXJlbmNlKG5vZGUpO1xuICAgIH1cbiAgfSwgW10pO1xuICBjb25zdCBzZXRGbG9hdGluZyA9IFJlYWN0LnVzZUNhbGxiYWNrKG5vZGUgPT4ge1xuICAgIGlmIChub2RlICE9PSBmbG9hdGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICBmbG9hdGluZ1JlZi5jdXJyZW50ID0gbm9kZTtcbiAgICAgIF9zZXRGbG9hdGluZyhub2RlKTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgY29uc3QgcmVmZXJlbmNlRWwgPSBleHRlcm5hbFJlZmVyZW5jZSB8fCBfcmVmZXJlbmNlO1xuICBjb25zdCBmbG9hdGluZ0VsID0gZXh0ZXJuYWxGbG9hdGluZyB8fCBfZmxvYXRpbmc7XG4gIGNvbnN0IHJlZmVyZW5jZVJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgZmxvYXRpbmdSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IGRhdGFSZWYgPSBSZWFjdC51c2VSZWYoZGF0YSk7XG4gIGNvbnN0IGhhc1doaWxlRWxlbWVudHNNb3VudGVkID0gd2hpbGVFbGVtZW50c01vdW50ZWQgIT0gbnVsbDtcbiAgY29uc3Qgd2hpbGVFbGVtZW50c01vdW50ZWRSZWYgPSB1c2VMYXRlc3RSZWYod2hpbGVFbGVtZW50c01vdW50ZWQpO1xuICBjb25zdCBwbGF0Zm9ybVJlZiA9IHVzZUxhdGVzdFJlZihwbGF0Zm9ybSk7XG4gIGNvbnN0IHVwZGF0ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIXJlZmVyZW5jZVJlZi5jdXJyZW50IHx8ICFmbG9hdGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIHN0cmF0ZWd5LFxuICAgICAgbWlkZGxld2FyZTogbGF0ZXN0TWlkZGxld2FyZVxuICAgIH07XG4gICAgaWYgKHBsYXRmb3JtUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNvbmZpZy5wbGF0Zm9ybSA9IHBsYXRmb3JtUmVmLmN1cnJlbnQ7XG4gICAgfVxuICAgIGNvbXB1dGVQb3NpdGlvbihyZWZlcmVuY2VSZWYuY3VycmVudCwgZmxvYXRpbmdSZWYuY3VycmVudCwgY29uZmlnKS50aGVuKGRhdGEgPT4ge1xuICAgICAgY29uc3QgZnVsbERhdGEgPSB7XG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIGlzUG9zaXRpb25lZDogdHJ1ZVxuICAgICAgfTtcbiAgICAgIGlmIChpc01vdW50ZWRSZWYuY3VycmVudCAmJiAhZGVlcEVxdWFsKGRhdGFSZWYuY3VycmVudCwgZnVsbERhdGEpKSB7XG4gICAgICAgIGRhdGFSZWYuY3VycmVudCA9IGZ1bGxEYXRhO1xuICAgICAgICBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgICAgIHNldERhdGEoZnVsbERhdGEpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwgW2xhdGVzdE1pZGRsZXdhcmUsIHBsYWNlbWVudCwgc3RyYXRlZ3ksIHBsYXRmb3JtUmVmXSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpZiAob3BlbiA9PT0gZmFsc2UgJiYgZGF0YVJlZi5jdXJyZW50LmlzUG9zaXRpb25lZCkge1xuICAgICAgZGF0YVJlZi5jdXJyZW50LmlzUG9zaXRpb25lZCA9IGZhbHNlO1xuICAgICAgc2V0RGF0YShkYXRhID0+ICh7XG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIGlzUG9zaXRpb25lZDogZmFsc2VcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0sIFtvcGVuXSk7XG4gIGNvbnN0IGlzTW91bnRlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGluZGV4KCgpID0+IHtcbiAgICBpc01vdW50ZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlzTW91bnRlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW10pO1xuICBpbmRleCgoKSA9PiB7XG4gICAgaWYgKHJlZmVyZW5jZUVsKSByZWZlcmVuY2VSZWYuY3VycmVudCA9IHJlZmVyZW5jZUVsO1xuICAgIGlmIChmbG9hdGluZ0VsKSBmbG9hdGluZ1JlZi5jdXJyZW50ID0gZmxvYXRpbmdFbDtcbiAgICBpZiAocmVmZXJlbmNlRWwgJiYgZmxvYXRpbmdFbCkge1xuICAgICAgaWYgKHdoaWxlRWxlbWVudHNNb3VudGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHdoaWxlRWxlbWVudHNNb3VudGVkUmVmLmN1cnJlbnQocmVmZXJlbmNlRWwsIGZsb2F0aW5nRWwsIHVwZGF0ZSk7XG4gICAgICB9XG4gICAgICB1cGRhdGUoKTtcbiAgICB9XG4gIH0sIFtyZWZlcmVuY2VFbCwgZmxvYXRpbmdFbCwgdXBkYXRlLCB3aGlsZUVsZW1lbnRzTW91bnRlZFJlZiwgaGFzV2hpbGVFbGVtZW50c01vdW50ZWRdKTtcbiAgY29uc3QgcmVmcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICByZWZlcmVuY2U6IHJlZmVyZW5jZVJlZixcbiAgICBmbG9hdGluZzogZmxvYXRpbmdSZWYsXG4gICAgc2V0UmVmZXJlbmNlLFxuICAgIHNldEZsb2F0aW5nXG4gIH0pLCBbc2V0UmVmZXJlbmNlLCBzZXRGbG9hdGluZ10pO1xuICBjb25zdCBlbGVtZW50cyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUVsLFxuICAgIGZsb2F0aW5nOiBmbG9hdGluZ0VsXG4gIH0pLCBbcmVmZXJlbmNlRWwsIGZsb2F0aW5nRWxdKTtcbiAgY29uc3QgZmxvYXRpbmdTdHlsZXMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBpbml0aWFsU3R5bGVzID0ge1xuICAgICAgcG9zaXRpb246IHN0cmF0ZWd5LFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMFxuICAgIH07XG4gICAgaWYgKCFlbGVtZW50cy5mbG9hdGluZykge1xuICAgICAgcmV0dXJuIGluaXRpYWxTdHlsZXM7XG4gICAgfVxuICAgIGNvbnN0IHggPSByb3VuZEJ5RFBSKGVsZW1lbnRzLmZsb2F0aW5nLCBkYXRhLngpO1xuICAgIGNvbnN0IHkgPSByb3VuZEJ5RFBSKGVsZW1lbnRzLmZsb2F0aW5nLCBkYXRhLnkpO1xuICAgIGlmICh0cmFuc2Zvcm0pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmluaXRpYWxTdHlsZXMsXG4gICAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIixcbiAgICAgICAgLi4uKGdldERQUihlbGVtZW50cy5mbG9hdGluZykgPj0gMS41ICYmIHtcbiAgICAgICAgICB3aWxsQ2hhbmdlOiAndHJhbnNmb3JtJ1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiBzdHJhdGVneSxcbiAgICAgIGxlZnQ6IHgsXG4gICAgICB0b3A6IHlcbiAgICB9O1xuICB9LCBbc3RyYXRlZ3ksIHRyYW5zZm9ybSwgZWxlbWVudHMuZmxvYXRpbmcsIGRhdGEueCwgZGF0YS55XSk7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgLi4uZGF0YSxcbiAgICB1cGRhdGUsXG4gICAgcmVmcyxcbiAgICBlbGVtZW50cyxcbiAgICBmbG9hdGluZ1N0eWxlc1xuICB9KSwgW2RhdGEsIHVwZGF0ZSwgcmVmcywgZWxlbWVudHMsIGZsb2F0aW5nU3R5bGVzXSk7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBwb3NpdGlvbiBhbiBpbm5lciBlbGVtZW50IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHNvIHRoYXQgaXRcbiAqIGFwcGVhcnMgY2VudGVyZWQgdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogVGhpcyB3cmFwcyB0aGUgY29yZSBgYXJyb3dgIG1pZGRsZXdhcmUgdG8gYWxsb3cgUmVhY3QgcmVmcyBhcyB0aGUgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hcnJvd1xuICovXG5jb25zdCBhcnJvdyQxID0gb3B0aW9ucyA9PiB7XG4gIGZ1bmN0aW9uIGlzUmVmKHZhbHVlKSB7XG4gICAgcmV0dXJuIHt9Lmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjdXJyZW50Jyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnYXJyb3cnLFxuICAgIG9wdGlvbnMsXG4gICAgZm4oc3RhdGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcGFkZGluZ1xuICAgICAgfSA9IHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucyhzdGF0ZSkgOiBvcHRpb25zO1xuICAgICAgaWYgKGVsZW1lbnQgJiYgaXNSZWYoZWxlbWVudCkpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQuY3VycmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGFycm93JDIoe1xuICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudC5jdXJyZW50LFxuICAgICAgICAgICAgcGFkZGluZ1xuICAgICAgICAgIH0pLmZuKHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gYXJyb3ckMih7XG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBwYWRkaW5nXG4gICAgICAgIH0pLmZuKHN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIE1vZGlmaWVzIHRoZSBwbGFjZW1lbnQgYnkgdHJhbnNsYXRpbmcgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYWxvbmcgdGhlXG4gKiBzcGVjaWZpZWQgYXhlcy5cbiAqIEEgbnVtYmVyIChzaG9ydGhhbmQgZm9yIGBtYWluQXhpc2Agb3IgZGlzdGFuY2UpLCBvciBhbiBheGVzIGNvbmZpZ3VyYXRpb25cbiAqIG9iamVjdCBtYXkgYmUgcGFzc2VkLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL29mZnNldFxuICovXG5jb25zdCBvZmZzZXQgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4ub2Zmc2V0JDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IGJ5IHNoaWZ0aW5nIGl0IGluIG9yZGVyIHRvXG4gKiBrZWVwIGl0IGluIHZpZXcgd2hlbiBpdCB3aWxsIG92ZXJmbG93IHRoZSBjbGlwcGluZyBib3VuZGFyeS5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9zaGlmdFxuICovXG5jb25zdCBzaGlmdCA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5zaGlmdCQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG4vKipcbiAqIEJ1aWx0LWluIGBsaW1pdGVyYCB0aGF0IHdpbGwgc3RvcCBgc2hpZnQoKWAgYXQgYSBjZXJ0YWluIHBvaW50LlxuICovXG5jb25zdCBsaW1pdFNoaWZ0ID0gKG9wdGlvbnMsIGRlcHMpID0+ICh7XG4gIC4uLmxpbWl0U2hpZnQkMShvcHRpb25zKSxcbiAgb3B0aW9uczogW29wdGlvbnMsIGRlcHNdXG59KTtcblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQgYnkgZmxpcHBpbmcgdGhlIGBwbGFjZW1lbnRgXG4gKiBpbiBvcmRlciB0byBrZWVwIGl0IGluIHZpZXcgd2hlbiB0aGUgcHJlZmVycmVkIHBsYWNlbWVudChzKSB3aWxsIG92ZXJmbG93IHRoZVxuICogY2xpcHBpbmcgYm91bmRhcnkuIEFsdGVybmF0aXZlIHRvIGBhdXRvUGxhY2VtZW50YC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9mbGlwXG4gKi9cbmNvbnN0IGZsaXAgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4uZmxpcCQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdGhhdCBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCDigJRcbiAqIGZvciBpbnN0YW5jZSwgcHJldmVudCBpdCBmcm9tIG92ZXJmbG93aW5nIHRoZSBjbGlwcGluZyBib3VuZGFyeSBvciBtYXRjaCB0aGVcbiAqIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9zaXplXG4gKi9cbmNvbnN0IHNpemUgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4uc2l6ZSQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG4vKipcbiAqIE9wdGltaXplcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBieSBjaG9vc2luZyB0aGUgcGxhY2VtZW50XG4gKiB0aGF0IGhhcyB0aGUgbW9zdCBzcGFjZSBhdmFpbGFibGUgYXV0b21hdGljYWxseSwgd2l0aG91dCBuZWVkaW5nIHRvIHNwZWNpZnkgYVxuICogcHJlZmVycmVkIHBsYWNlbWVudC4gQWx0ZXJuYXRpdmUgdG8gYGZsaXBgLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2F1dG9QbGFjZW1lbnRcbiAqL1xuY29uc3QgYXV0b1BsYWNlbWVudCA9IChvcHRpb25zLCBkZXBzKSA9PiAoe1xuICAuLi5hdXRvUGxhY2VtZW50JDEob3B0aW9ucyksXG4gIG9wdGlvbnM6IFtvcHRpb25zLCBkZXBzXVxufSk7XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBoaWRlIHRoZSBmbG9hdGluZyBlbGVtZW50IGluIGFwcGxpY2FibGUgc2l0dWF0aW9ucywgc3VjaCBhc1xuICogd2hlbiBpdCBpcyBub3QgaW4gdGhlIHNhbWUgY2xpcHBpbmcgY29udGV4dCBhcyB0aGUgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvaGlkZVxuICovXG5jb25zdCBoaWRlID0gKG9wdGlvbnMsIGRlcHMpID0+ICh7XG4gIC4uLmhpZGUkMShvcHRpb25zKSxcbiAgb3B0aW9uczogW29wdGlvbnMsIGRlcHNdXG59KTtcblxuLyoqXG4gKiBQcm92aWRlcyBpbXByb3ZlZCBwb3NpdGlvbmluZyBmb3IgaW5saW5lIHJlZmVyZW5jZSBlbGVtZW50cyB0aGF0IGNhbiBzcGFuXG4gKiBvdmVyIG11bHRpcGxlIGxpbmVzLCBzdWNoIGFzIGh5cGVybGlua3Mgb3IgcmFuZ2Ugc2VsZWN0aW9ucy5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9pbmxpbmVcbiAqL1xuY29uc3QgaW5saW5lID0gKG9wdGlvbnMsIGRlcHMpID0+ICh7XG4gIC4uLmlubGluZSQxKG9wdGlvbnMpLFxuICBvcHRpb25zOiBbb3B0aW9ucywgZGVwc11cbn0pO1xuXG4vKipcbiAqIFByb3ZpZGVzIGRhdGEgdG8gcG9zaXRpb24gYW4gaW5uZXIgZWxlbWVudCBvZiB0aGUgZmxvYXRpbmcgZWxlbWVudCBzbyB0aGF0IGl0XG4gKiBhcHBlYXJzIGNlbnRlcmVkIHRvIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIFRoaXMgd3JhcHMgdGhlIGNvcmUgYGFycm93YCBtaWRkbGV3YXJlIHRvIGFsbG93IFJlYWN0IHJlZnMgYXMgdGhlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3MvYXJyb3dcbiAqL1xuY29uc3QgYXJyb3cgPSAob3B0aW9ucywgZGVwcykgPT4gKHtcbiAgLi4uYXJyb3ckMShvcHRpb25zKSxcbiAgb3B0aW9uczogW29wdGlvbnMsIGRlcHNdXG59KTtcblxuZXhwb3J0IHsgYXJyb3csIGF1dG9QbGFjZW1lbnQsIGZsaXAsIGhpZGUsIGlubGluZSwgbGltaXRTaGlmdCwgb2Zmc2V0LCBzaGlmdCwgc2l6ZSwgdXNlRmxvYXRpbmcgfTtcbiIsImltcG9ydCB7IGlzU2hhZG93Um9vdCwgaXNIVE1MRWxlbWVudCB9IGZyb20gJ0BmbG9hdGluZy11aS91dGlscy9kb20nO1xuXG5mdW5jdGlvbiBhY3RpdmVFbGVtZW50KGRvYykge1xuICBsZXQgYWN0aXZlRWxlbWVudCA9IGRvYy5hY3RpdmVFbGVtZW50O1xuICB3aGlsZSAoKChfYWN0aXZlRWxlbWVudCA9IGFjdGl2ZUVsZW1lbnQpID09IG51bGwgfHwgKF9hY3RpdmVFbGVtZW50ID0gX2FjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hY3RpdmVFbGVtZW50LmFjdGl2ZUVsZW1lbnQpICE9IG51bGwpIHtcbiAgICB2YXIgX2FjdGl2ZUVsZW1lbnQ7XG4gICAgYWN0aXZlRWxlbWVudCA9IGFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O1xuICB9XG4gIHJldHVybiBhY3RpdmVFbGVtZW50O1xufVxuZnVuY3Rpb24gY29udGFpbnMocGFyZW50LCBjaGlsZCkge1xuICBpZiAoIXBhcmVudCB8fCAhY2hpbGQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgcm9vdE5vZGUgPSBjaGlsZC5nZXRSb290Tm9kZSA9PSBudWxsID8gdm9pZCAwIDogY2hpbGQuZ2V0Um9vdE5vZGUoKTtcblxuICAvLyBGaXJzdCwgYXR0ZW1wdCB3aXRoIGZhc3RlciBuYXRpdmUgbWV0aG9kXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyB0aGVuIGZhbGxiYWNrIHRvIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB3aXRoIFNoYWRvdyBET00gc3VwcG9ydFxuICBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgIGxldCBuZXh0ID0gY2hpbGQ7XG4gICAgd2hpbGUgKG5leHQpIHtcbiAgICAgIGlmIChwYXJlbnQgPT09IG5leHQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICB9XG4gIH1cblxuICAvLyBHaXZlIHVwLCB0aGUgcmVzdWx0IGlzIGZhbHNlXG4gIHJldHVybiBmYWxzZTtcbn1cbi8vIEF2b2lkIENocm9tZSBEZXZUb29scyBibHVlIHdhcm5pbmcuXG5mdW5jdGlvbiBnZXRQbGF0Zm9ybSgpIHtcbiAgY29uc3QgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG4gIGlmICh1YURhdGEgIT0gbnVsbCAmJiB1YURhdGEucGxhdGZvcm0pIHtcbiAgICByZXR1cm4gdWFEYXRhLnBsYXRmb3JtO1xuICB9XG4gIHJldHVybiBuYXZpZ2F0b3IucGxhdGZvcm07XG59XG5mdW5jdGlvbiBnZXRVc2VyQWdlbnQoKSB7XG4gIGNvbnN0IHVhRGF0YSA9IG5hdmlnYXRvci51c2VyQWdlbnREYXRhO1xuICBpZiAodWFEYXRhICYmIEFycmF5LmlzQXJyYXkodWFEYXRhLmJyYW5kcykpIHtcbiAgICByZXR1cm4gdWFEYXRhLmJyYW5kcy5tYXAoX3JlZiA9PiB7XG4gICAgICBsZXQge1xuICAgICAgICBicmFuZCxcbiAgICAgICAgdmVyc2lvblxuICAgICAgfSA9IF9yZWY7XG4gICAgICByZXR1cm4gYnJhbmQgKyBcIi9cIiArIHZlcnNpb247XG4gICAgfSkuam9pbignICcpO1xuICB9XG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xufVxuXG4vLyBMaWNlbnNlOiBodHRwczovL2dpdGh1Yi5jb20vYWRvYmUvcmVhY3Qtc3BlY3RydW0vYmxvYi9iMzVkNWMwMmZlOTAwYmFkY2NkMGNmMWE4ZjIzYmI1OTM0MTlmMjM4L3BhY2thZ2VzL0ByZWFjdC1hcmlhL3V0aWxzL3NyYy9pc1ZpcnR1YWxFdmVudC50c1xuZnVuY3Rpb24gaXNWaXJ0dWFsQ2xpY2soZXZlbnQpIHtcbiAgLy8gRklYTUU6IEZpcmVmb3ggaXMgbm93IGVtaXR0aW5nIGEgZGVwcmVjYXRpb24gd2FybmluZyBmb3IgYG1veklucHV0U291cmNlYC5cbiAgLy8gVHJ5IHRvIGZpbmQgYSB3b3JrYXJvdW5kIGZvciB0aGlzLiBgcmVhY3QtYXJpYWAgc291cmNlIHN0aWxsIGhhcyB0aGUgY2hlY2suXG4gIGlmIChldmVudC5tb3pJbnB1dFNvdXJjZSA9PT0gMCAmJiBldmVudC5pc1RydXN0ZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNBbmRyb2lkKCkgJiYgZXZlbnQucG9pbnRlclR5cGUpIHtcbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gJ2NsaWNrJyAmJiBldmVudC5idXR0b25zID09PSAxO1xuICB9XG4gIHJldHVybiBldmVudC5kZXRhaWwgPT09IDAgJiYgIWV2ZW50LnBvaW50ZXJUeXBlO1xufVxuZnVuY3Rpb24gaXNWaXJ0dWFsUG9pbnRlckV2ZW50KGV2ZW50KSB7XG4gIGlmIChpc0pTRE9NKCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICFpc0FuZHJvaWQoKSAmJiBldmVudC53aWR0aCA9PT0gMCAmJiBldmVudC5oZWlnaHQgPT09IDAgfHwgaXNBbmRyb2lkKCkgJiYgZXZlbnQud2lkdGggPT09IDEgJiYgZXZlbnQuaGVpZ2h0ID09PSAxICYmIGV2ZW50LnByZXNzdXJlID09PSAwICYmIGV2ZW50LmRldGFpbCA9PT0gMCAmJiBldmVudC5wb2ludGVyVHlwZSA9PT0gJ21vdXNlJyB8fFxuICAvLyBpT1MgVm9pY2VPdmVyIHJldHVybnMgMC4zMzPigKIgZm9yIHdpZHRoL2hlaWdodC5cbiAgZXZlbnQud2lkdGggPCAxICYmIGV2ZW50LmhlaWdodCA8IDEgJiYgZXZlbnQucHJlc3N1cmUgPT09IDAgJiYgZXZlbnQuZGV0YWlsID09PSAwICYmIGV2ZW50LnBvaW50ZXJUeXBlID09PSAndG91Y2gnO1xufVxuZnVuY3Rpb24gaXNTYWZhcmkoKSB7XG4gIC8vIENocm9tZSBEZXZUb29scyBkb2VzIG5vdCBjb21wbGFpbiBhYm91dCBuYXZpZ2F0b3IudmVuZG9yXG4gIHJldHVybiAvYXBwbGUvaS50ZXN0KG5hdmlnYXRvci52ZW5kb3IpO1xufVxuZnVuY3Rpb24gaXNBbmRyb2lkKCkge1xuICBjb25zdCByZSA9IC9hbmRyb2lkL2k7XG4gIHJldHVybiByZS50ZXN0KGdldFBsYXRmb3JtKCkpIHx8IHJlLnRlc3QoZ2V0VXNlckFnZW50KCkpO1xufVxuZnVuY3Rpb24gaXNNYWMoKSB7XG4gIHJldHVybiBnZXRQbGF0Zm9ybSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnbWFjJykgJiYgIW5hdmlnYXRvci5tYXhUb3VjaFBvaW50cztcbn1cbmZ1bmN0aW9uIGlzSlNET00oKSB7XG4gIHJldHVybiBnZXRVc2VyQWdlbnQoKS5pbmNsdWRlcygnanNkb20vJyk7XG59XG5mdW5jdGlvbiBpc01vdXNlTGlrZVBvaW50ZXJUeXBlKHBvaW50ZXJUeXBlLCBzdHJpY3QpIHtcbiAgLy8gT24gc29tZSBMaW51eCBtYWNoaW5lcyB3aXRoIENocm9taXVtLCBtb3VzZSBpbnB1dHMgcmV0dXJuIGEgYHBvaW50ZXJUeXBlYFxuICAvLyBvZiBcInBlblwiOiBodHRwczovL2dpdGh1Yi5jb20vZmxvYXRpbmctdWkvZmxvYXRpbmctdWkvaXNzdWVzLzIwMTVcbiAgY29uc3QgdmFsdWVzID0gWydtb3VzZScsICdwZW4nXTtcbiAgaWYgKCFzdHJpY3QpIHtcbiAgICB2YWx1ZXMucHVzaCgnJywgdW5kZWZpbmVkKTtcbiAgfVxuICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHBvaW50ZXJUeXBlKTtcbn1cbmZ1bmN0aW9uIGlzUmVhY3RFdmVudChldmVudCkge1xuICByZXR1cm4gJ25hdGl2ZUV2ZW50JyBpbiBldmVudDtcbn1cbmZ1bmN0aW9uIGlzUm9vdEVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudC5tYXRjaGVzKCdodG1sLGJvZHknKTtcbn1cbmZ1bmN0aW9uIGdldERvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIChub2RlID09IG51bGwgPyB2b2lkIDAgOiBub2RlLm93bmVyRG9jdW1lbnQpIHx8IGRvY3VtZW50O1xufVxuZnVuY3Rpb24gaXNFdmVudFRhcmdldFdpdGhpbihldmVudCwgbm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICgnY29tcG9zZWRQYXRoJyBpbiBldmVudCkge1xuICAgIHJldHVybiBldmVudC5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhub2RlKTtcbiAgfVxuXG4gIC8vIFRTIHRoaW5rcyBgZXZlbnRgIGlzIG9mIHR5cGUgbmV2ZXIgYXMgaXQgYXNzdW1lcyBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjb21wb3NlZFBhdGgsIGJ1dCBicm93c2VycyB3aXRob3V0IHNoYWRvdyBkb20gZG9uJ3RcbiAgY29uc3QgZSA9IGV2ZW50O1xuICByZXR1cm4gZS50YXJnZXQgIT0gbnVsbCAmJiBub2RlLmNvbnRhaW5zKGUudGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIGdldFRhcmdldChldmVudCkge1xuICBpZiAoJ2NvbXBvc2VkUGF0aCcgaW4gZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQuY29tcG9zZWRQYXRoKClbMF07XG4gIH1cblxuICAvLyBUUyB0aGlua3MgYGV2ZW50YCBpcyBvZiB0eXBlIG5ldmVyIGFzIGl0IGFzc3VtZXMgYWxsIGJyb3dzZXJzIHN1cHBvcnRcbiAgLy8gYGNvbXBvc2VkUGF0aCgpYCwgYnV0IGJyb3dzZXJzIHdpdGhvdXQgc2hhZG93IERPTSBkb24ndC5cbiAgcmV0dXJuIGV2ZW50LnRhcmdldDtcbn1cbmNvbnN0IFRZUEVBQkxFX1NFTEVDVE9SID0gXCJpbnB1dDpub3QoW3R5cGU9J2hpZGRlbiddKTpub3QoW2Rpc2FibGVkXSksXCIgKyBcIltjb250ZW50ZWRpdGFibGVdOm5vdChbY29udGVudGVkaXRhYmxlPSdmYWxzZSddKSx0ZXh0YXJlYTpub3QoW2Rpc2FibGVkXSlcIjtcbmZ1bmN0aW9uIGlzVHlwZWFibGVFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5tYXRjaGVzKFRZUEVBQkxFX1NFTEVDVE9SKTtcbn1cbmZ1bmN0aW9uIHN0b3BFdmVudChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbn1cbmZ1bmN0aW9uIGlzVHlwZWFibGVDb21ib2JveChlbGVtZW50KSB7XG4gIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2NvbWJvYm94JyAmJiBpc1R5cGVhYmxlRWxlbWVudChlbGVtZW50KTtcbn1cblxuZXhwb3J0IHsgVFlQRUFCTEVfU0VMRUNUT1IsIGFjdGl2ZUVsZW1lbnQsIGNvbnRhaW5zLCBnZXREb2N1bWVudCwgZ2V0UGxhdGZvcm0sIGdldFRhcmdldCwgZ2V0VXNlckFnZW50LCBpc0FuZHJvaWQsIGlzRXZlbnRUYXJnZXRXaXRoaW4sIGlzSlNET00sIGlzTWFjLCBpc01vdXNlTGlrZVBvaW50ZXJUeXBlLCBpc1JlYWN0RXZlbnQsIGlzUm9vdEVsZW1lbnQsIGlzU2FmYXJpLCBpc1R5cGVhYmxlQ29tYm9ib3gsIGlzVHlwZWFibGVFbGVtZW50LCBpc1ZpcnR1YWxDbGljaywgaXNWaXJ0dWFsUG9pbnRlckV2ZW50LCBzdG9wRXZlbnQgfTtcbiIsImZ1bmN0aW9uIGdldE5vZGVOYW1lKG5vZGUpIHtcbiAgaWYgKGlzTm9kZShub2RlKSkge1xuICAgIHJldHVybiAobm9kZS5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgfVxuICAvLyBNb2NrZWQgbm9kZXMgaW4gdGVzdGluZyBlbnZpcm9ubWVudHMgbWF5IG5vdCBiZSBpbnN0YW5jZXMgb2YgTm9kZS4gQnlcbiAgLy8gcmV0dXJuaW5nIGAjZG9jdW1lbnRgIGFuIGluZmluaXRlIGxvb3Agd29uJ3Qgb2NjdXIuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9hdGluZy11aS9mbG9hdGluZy11aS9pc3N1ZXMvMjMxN1xuICByZXR1cm4gJyNkb2N1bWVudCc7XG59XG5mdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICB2YXIgX25vZGUkb3duZXJEb2N1bWVudDtcbiAgcmV0dXJuIChub2RlID09IG51bGwgfHwgKF9ub2RlJG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSB8fCB3aW5kb3c7XG59XG5mdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQobm9kZSkge1xuICB2YXIgX3JlZjtcbiAgcmV0dXJuIChfcmVmID0gKGlzTm9kZShub2RlKSA/IG5vZGUub3duZXJEb2N1bWVudCA6IG5vZGUuZG9jdW1lbnQpIHx8IHdpbmRvdy5kb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9yZWYuZG9jdW1lbnRFbGVtZW50O1xufVxuZnVuY3Rpb24gaXNOb2RlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIE5vZGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBnZXRXaW5kb3codmFsdWUpLk5vZGU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCB8fCB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgdmFsdWUgaW5zdGFuY2VvZiBnZXRXaW5kb3codmFsdWUpLkhUTUxFbGVtZW50O1xufVxuZnVuY3Rpb24gaXNTaGFkb3dSb290KHZhbHVlKSB7XG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgYFNoYWRvd1Jvb3RgIHN1cHBvcnQuXG4gIGlmICh0eXBlb2YgU2hhZG93Um9vdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU2hhZG93Um9vdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuU2hhZG93Um9vdDtcbn1cbmZ1bmN0aW9uIGlzT3ZlcmZsb3dFbGVtZW50KGVsZW1lbnQpIHtcbiAgY29uc3Qge1xuICAgIG92ZXJmbG93LFxuICAgIG92ZXJmbG93WCxcbiAgICBvdmVyZmxvd1ksXG4gICAgZGlzcGxheVxuICB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbnxjbGlwLy50ZXN0KG92ZXJmbG93ICsgb3ZlcmZsb3dZICsgb3ZlcmZsb3dYKSAmJiAhWydpbmxpbmUnLCAnY29udGVudHMnXS5pbmNsdWRlcyhkaXNwbGF5KTtcbn1cbmZ1bmN0aW9uIGlzVGFibGVFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIFsndGFibGUnLCAndGQnLCAndGgnXS5pbmNsdWRlcyhnZXROb2RlTmFtZShlbGVtZW50KSk7XG59XG5mdW5jdGlvbiBpc1RvcExheWVyKGVsZW1lbnQpIHtcbiAgcmV0dXJuIFsnOnBvcG92ZXItb3BlbicsICc6bW9kYWwnXS5zb21lKHNlbGVjdG9yID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQubWF0Y2hlcyhzZWxlY3Rvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBpc0NvbnRhaW5pbmdCbG9jayhlbGVtZW50T3JDc3MpIHtcbiAgY29uc3Qgd2Via2l0ID0gaXNXZWJLaXQoKTtcbiAgY29uc3QgY3NzID0gaXNFbGVtZW50KGVsZW1lbnRPckNzcykgPyBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnRPckNzcykgOiBlbGVtZW50T3JDc3M7XG5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcbiAgcmV0dXJuIGNzcy50cmFuc2Zvcm0gIT09ICdub25lJyB8fCBjc3MucGVyc3BlY3RpdmUgIT09ICdub25lJyB8fCAoY3NzLmNvbnRhaW5lclR5cGUgPyBjc3MuY29udGFpbmVyVHlwZSAhPT0gJ25vcm1hbCcgOiBmYWxzZSkgfHwgIXdlYmtpdCAmJiAoY3NzLmJhY2tkcm9wRmlsdGVyID8gY3NzLmJhY2tkcm9wRmlsdGVyICE9PSAnbm9uZScgOiBmYWxzZSkgfHwgIXdlYmtpdCAmJiAoY3NzLmZpbHRlciA/IGNzcy5maWx0ZXIgIT09ICdub25lJyA6IGZhbHNlKSB8fCBbJ3RyYW5zZm9ybScsICdwZXJzcGVjdGl2ZScsICdmaWx0ZXInXS5zb21lKHZhbHVlID0+IChjc3Mud2lsbENoYW5nZSB8fCAnJykuaW5jbHVkZXModmFsdWUpKSB8fCBbJ3BhaW50JywgJ2xheW91dCcsICdzdHJpY3QnLCAnY29udGVudCddLnNvbWUodmFsdWUgPT4gKGNzcy5jb250YWluIHx8ICcnKS5pbmNsdWRlcyh2YWx1ZSkpO1xufVxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgbGV0IGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcbiAgd2hpbGUgKGlzSFRNTEVsZW1lbnQoY3VycmVudE5vZGUpICYmICFpc0xhc3RUcmF2ZXJzYWJsZU5vZGUoY3VycmVudE5vZGUpKSB7XG4gICAgaWYgKGlzQ29udGFpbmluZ0Jsb2NrKGN1cnJlbnROb2RlKSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgIH0gZWxzZSBpZiAoaXNUb3BMYXllcihjdXJyZW50Tm9kZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoY3VycmVudE5vZGUpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gaXNXZWJLaXQoKSB7XG4gIGlmICh0eXBlb2YgQ1NTID09PSAndW5kZWZpbmVkJyB8fCAhQ1NTLnN1cHBvcnRzKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBDU1Muc3VwcG9ydHMoJy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyJywgJ25vbmUnKTtcbn1cbmZ1bmN0aW9uIGlzTGFzdFRyYXZlcnNhYmxlTm9kZShub2RlKSB7XG4gIHJldHVybiBbJ2h0bWwnLCAnYm9keScsICcjZG9jdW1lbnQnXS5pbmNsdWRlcyhnZXROb2RlTmFtZShub2RlKSk7XG59XG5mdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufVxuZnVuY3Rpb24gZ2V0Tm9kZVNjcm9sbChlbGVtZW50KSB7XG4gIGlmIChpc0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgICAgc2Nyb2xsVG9wOiBlbGVtZW50LnNjcm9sbFRvcFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnNjcm9sbFgsXG4gICAgc2Nyb2xsVG9wOiBlbGVtZW50LnNjcm9sbFlcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFBhcmVudE5vZGUobm9kZSkge1xuICBpZiAoZ2V0Tm9kZU5hbWUobm9kZSkgPT09ICdodG1sJykge1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9XG4gIC8vIFN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlLlxuICBub2RlLmFzc2lnbmVkU2xvdCB8fFxuICAvLyBET00gRWxlbWVudCBkZXRlY3RlZC5cbiAgbm9kZS5wYXJlbnROb2RlIHx8XG4gIC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWQuXG4gIGlzU2hhZG93Um9vdChub2RlKSAmJiBub2RlLmhvc3QgfHxcbiAgLy8gRmFsbGJhY2suXG4gIGdldERvY3VtZW50RWxlbWVudChub2RlKTtcbiAgcmV0dXJuIGlzU2hhZG93Um9vdChyZXN1bHQpID8gcmVzdWx0Lmhvc3QgOiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXROZWFyZXN0T3ZlcmZsb3dBbmNlc3Rvcihub2RlKSB7XG4gIGNvbnN0IHBhcmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKG5vZGUpO1xuICBpZiAoaXNMYXN0VHJhdmVyc2FibGVOb2RlKHBhcmVudE5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudCA/IG5vZGUub3duZXJEb2N1bWVudC5ib2R5IDogbm9kZS5ib2R5O1xuICB9XG4gIGlmIChpc0hUTUxFbGVtZW50KHBhcmVudE5vZGUpICYmIGlzT3ZlcmZsb3dFbGVtZW50KHBhcmVudE5vZGUpKSB7XG4gICAgcmV0dXJuIHBhcmVudE5vZGU7XG4gIH1cbiAgcmV0dXJuIGdldE5lYXJlc3RPdmVyZmxvd0FuY2VzdG9yKHBhcmVudE5vZGUpO1xufVxuZnVuY3Rpb24gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMobm9kZSwgbGlzdCwgdHJhdmVyc2VJZnJhbWVzKSB7XG4gIHZhciBfbm9kZSRvd25lckRvY3VtZW50MjtcbiAgaWYgKGxpc3QgPT09IHZvaWQgMCkge1xuICAgIGxpc3QgPSBbXTtcbiAgfVxuICBpZiAodHJhdmVyc2VJZnJhbWVzID09PSB2b2lkIDApIHtcbiAgICB0cmF2ZXJzZUlmcmFtZXMgPSB0cnVlO1xuICB9XG4gIGNvbnN0IHNjcm9sbGFibGVBbmNlc3RvciA9IGdldE5lYXJlc3RPdmVyZmxvd0FuY2VzdG9yKG5vZGUpO1xuICBjb25zdCBpc0JvZHkgPSBzY3JvbGxhYmxlQW5jZXN0b3IgPT09ICgoX25vZGUkb3duZXJEb2N1bWVudDIgPSBub2RlLm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRvd25lckRvY3VtZW50Mi5ib2R5KTtcbiAgY29uc3Qgd2luID0gZ2V0V2luZG93KHNjcm9sbGFibGVBbmNlc3Rvcik7XG4gIGlmIChpc0JvZHkpIHtcbiAgICBjb25zdCBmcmFtZUVsZW1lbnQgPSBnZXRGcmFtZUVsZW1lbnQod2luKTtcbiAgICByZXR1cm4gbGlzdC5jb25jYXQod2luLCB3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzT3ZlcmZsb3dFbGVtZW50KHNjcm9sbGFibGVBbmNlc3RvcikgPyBzY3JvbGxhYmxlQW5jZXN0b3IgOiBbXSwgZnJhbWVFbGVtZW50ICYmIHRyYXZlcnNlSWZyYW1lcyA/IGdldE92ZXJmbG93QW5jZXN0b3JzKGZyYW1lRWxlbWVudCkgOiBbXSk7XG4gIH1cbiAgcmV0dXJuIGxpc3QuY29uY2F0KHNjcm9sbGFibGVBbmNlc3RvciwgZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoc2Nyb2xsYWJsZUFuY2VzdG9yLCBbXSwgdHJhdmVyc2VJZnJhbWVzKSk7XG59XG5mdW5jdGlvbiBnZXRGcmFtZUVsZW1lbnQod2luKSB7XG4gIHJldHVybiB3aW4ucGFyZW50ICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih3aW4ucGFyZW50KSA/IHdpbi5mcmFtZUVsZW1lbnQgOiBudWxsO1xufVxuXG5leHBvcnQgeyBnZXRDb21wdXRlZFN0eWxlLCBnZXRDb250YWluaW5nQmxvY2ssIGdldERvY3VtZW50RWxlbWVudCwgZ2V0RnJhbWVFbGVtZW50LCBnZXROZWFyZXN0T3ZlcmZsb3dBbmNlc3RvciwgZ2V0Tm9kZU5hbWUsIGdldE5vZGVTY3JvbGwsIGdldE92ZXJmbG93QW5jZXN0b3JzLCBnZXRQYXJlbnROb2RlLCBnZXRXaW5kb3csIGlzQ29udGFpbmluZ0Jsb2NrLCBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQsIGlzTGFzdFRyYXZlcnNhYmxlTm9kZSwgaXNOb2RlLCBpc092ZXJmbG93RWxlbWVudCwgaXNTaGFkb3dSb290LCBpc1RhYmxlRWxlbWVudCwgaXNUb3BMYXllciwgaXNXZWJLaXQgfTtcbiIsIi8qKlxuICogQ3VzdG9tIHBvc2l0aW9uaW5nIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL3ZpcnR1YWwtZWxlbWVudHNcbiAqL1xuXG5jb25zdCBzaWRlcyA9IFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J107XG5jb25zdCBhbGlnbm1lbnRzID0gWydzdGFydCcsICdlbmQnXTtcbmNvbnN0IHBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovc2lkZXMucmVkdWNlKChhY2MsIHNpZGUpID0+IGFjYy5jb25jYXQoc2lkZSwgc2lkZSArIFwiLVwiICsgYWxpZ25tZW50c1swXSwgc2lkZSArIFwiLVwiICsgYWxpZ25tZW50c1sxXSksIFtdKTtcbmNvbnN0IG1pbiA9IE1hdGgubWluO1xuY29uc3QgbWF4ID0gTWF0aC5tYXg7XG5jb25zdCByb3VuZCA9IE1hdGgucm91bmQ7XG5jb25zdCBmbG9vciA9IE1hdGguZmxvb3I7XG5jb25zdCBjcmVhdGVDb29yZHMgPSB2ID0+ICh7XG4gIHg6IHYsXG4gIHk6IHZcbn0pO1xuY29uc3Qgb3Bwb3NpdGVTaWRlTWFwID0ge1xuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnLFxuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nXG59O1xuY29uc3Qgb3Bwb3NpdGVBbGlnbm1lbnRNYXAgPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZnVuY3Rpb24gY2xhbXAoc3RhcnQsIHZhbHVlLCBlbmQpIHtcbiAgcmV0dXJuIG1heChzdGFydCwgbWluKHZhbHVlLCBlbmQpKTtcbn1cbmZ1bmN0aW9uIGV2YWx1YXRlKHZhbHVlLCBwYXJhbSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUocGFyYW0pIDogdmFsdWU7XG59XG5mdW5jdGlvbiBnZXRTaWRlKHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59XG5mdW5jdGlvbiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn1cbmZ1bmN0aW9uIGdldE9wcG9zaXRlQXhpcyhheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59XG5mdW5jdGlvbiBnZXRBeGlzTGVuZ3RoKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbn1cbmZ1bmN0aW9uIGdldFNpZGVBeGlzKHBsYWNlbWVudCkge1xuICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5jbHVkZXMoZ2V0U2lkZShwbGFjZW1lbnQpKSA/ICd5JyA6ICd4Jztcbn1cbmZ1bmN0aW9uIGdldEFsaWdubWVudEF4aXMocGxhY2VtZW50KSB7XG4gIHJldHVybiBnZXRPcHBvc2l0ZUF4aXMoZ2V0U2lkZUF4aXMocGxhY2VtZW50KSk7XG59XG5mdW5jdGlvbiBnZXRBbGlnbm1lbnRTaWRlcyhwbGFjZW1lbnQsIHJlY3RzLCBydGwpIHtcbiAgaWYgKHJ0bCA9PT0gdm9pZCAwKSB7XG4gICAgcnRsID0gZmFsc2U7XG4gIH1cbiAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCk7XG4gIGNvbnN0IGFsaWdubWVudEF4aXMgPSBnZXRBbGlnbm1lbnRBeGlzKHBsYWNlbWVudCk7XG4gIGNvbnN0IGxlbmd0aCA9IGdldEF4aXNMZW5ndGgoYWxpZ25tZW50QXhpcyk7XG4gIGxldCBtYWluQWxpZ25tZW50U2lkZSA9IGFsaWdubWVudEF4aXMgPT09ICd4JyA/IGFsaWdubWVudCA9PT0gKHJ0bCA/ICdlbmQnIDogJ3N0YXJ0JykgPyAncmlnaHQnIDogJ2xlZnQnIDogYWxpZ25tZW50ID09PSAnc3RhcnQnID8gJ2JvdHRvbScgOiAndG9wJztcbiAgaWYgKHJlY3RzLnJlZmVyZW5jZVtsZW5ndGhdID4gcmVjdHMuZmxvYXRpbmdbbGVuZ3RoXSkge1xuICAgIG1haW5BbGlnbm1lbnRTaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpbkFsaWdubWVudFNpZGUpO1xuICB9XG4gIHJldHVybiBbbWFpbkFsaWdubWVudFNpZGUsIGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5BbGlnbm1lbnRTaWRlKV07XG59XG5mdW5jdGlvbiBnZXRFeHBhbmRlZFBsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGNvbnN0IG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgcmV0dXJuIFtnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudChwbGFjZW1lbnQpLCBvcHBvc2l0ZVBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpXTtcbn1cbmZ1bmN0aW9uIGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBhbGlnbm1lbnQgPT4gb3Bwb3NpdGVBbGlnbm1lbnRNYXBbYWxpZ25tZW50XSk7XG59XG5mdW5jdGlvbiBnZXRTaWRlTGlzdChzaWRlLCBpc1N0YXJ0LCBydGwpIHtcbiAgY29uc3QgbHIgPSBbJ2xlZnQnLCAncmlnaHQnXTtcbiAgY29uc3QgcmwgPSBbJ3JpZ2h0JywgJ2xlZnQnXTtcbiAgY29uc3QgdGIgPSBbJ3RvcCcsICdib3R0b20nXTtcbiAgY29uc3QgYnQgPSBbJ2JvdHRvbScsICd0b3AnXTtcbiAgc3dpdGNoIChzaWRlKSB7XG4gICAgY2FzZSAndG9wJzpcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgaWYgKHJ0bCkgcmV0dXJuIGlzU3RhcnQgPyBybCA6IGxyO1xuICAgICAgcmV0dXJuIGlzU3RhcnQgPyBsciA6IHJsO1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiBpc1N0YXJ0ID8gdGIgOiBidDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFtdO1xuICB9XG59XG5mdW5jdGlvbiBnZXRPcHBvc2l0ZUF4aXNQbGFjZW1lbnRzKHBsYWNlbWVudCwgZmxpcEFsaWdubWVudCwgZGlyZWN0aW9uLCBydGwpIHtcbiAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCk7XG4gIGxldCBsaXN0ID0gZ2V0U2lkZUxpc3QoZ2V0U2lkZShwbGFjZW1lbnQpLCBkaXJlY3Rpb24gPT09ICdzdGFydCcsIHJ0bCk7XG4gIGlmIChhbGlnbm1lbnQpIHtcbiAgICBsaXN0ID0gbGlzdC5tYXAoc2lkZSA9PiBzaWRlICsgXCItXCIgKyBhbGlnbm1lbnQpO1xuICAgIGlmIChmbGlwQWxpZ25tZW50KSB7XG4gICAgICBsaXN0ID0gbGlzdC5jb25jYXQobGlzdC5tYXAoZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxpc3Q7XG59XG5mdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgc2lkZSA9PiBvcHBvc2l0ZVNpZGVNYXBbc2lkZV0pO1xufVxuZnVuY3Rpb24gZXhwYW5kUGFkZGluZ09iamVjdChwYWRkaW5nKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwLFxuICAgIC4uLnBhZGRpbmdcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFBhZGRpbmdPYmplY3QocGFkZGluZykge1xuICByZXR1cm4gdHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gZXhwYW5kUGFkZGluZ09iamVjdChwYWRkaW5nKSA6IHtcbiAgICB0b3A6IHBhZGRpbmcsXG4gICAgcmlnaHQ6IHBhZGRpbmcsXG4gICAgYm90dG9tOiBwYWRkaW5nLFxuICAgIGxlZnQ6IHBhZGRpbmdcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlY3RUb0NsaWVudFJlY3QocmVjdCkge1xuICBjb25zdCB7XG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodFxuICB9ID0gcmVjdDtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgdG9wOiB5LFxuICAgIGxlZnQ6IHgsXG4gICAgcmlnaHQ6IHggKyB3aWR0aCxcbiAgICBib3R0b206IHkgKyBoZWlnaHQsXG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5cbmV4cG9ydCB7IGFsaWdubWVudHMsIGNsYW1wLCBjcmVhdGVDb29yZHMsIGV2YWx1YXRlLCBleHBhbmRQYWRkaW5nT2JqZWN0LCBmbG9vciwgZ2V0QWxpZ25tZW50LCBnZXRBbGlnbm1lbnRBeGlzLCBnZXRBbGlnbm1lbnRTaWRlcywgZ2V0QXhpc0xlbmd0aCwgZ2V0RXhwYW5kZWRQbGFjZW1lbnRzLCBnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudCwgZ2V0T3Bwb3NpdGVBeGlzLCBnZXRPcHBvc2l0ZUF4aXNQbGFjZW1lbnRzLCBnZXRPcHBvc2l0ZVBsYWNlbWVudCwgZ2V0UGFkZGluZ09iamVjdCwgZ2V0U2lkZSwgZ2V0U2lkZUF4aXMsIG1heCwgbWluLCBwbGFjZW1lbnRzLCByZWN0VG9DbGllbnRSZWN0LCByb3VuZCwgc2lkZXMgfTtcbiIsIi8vIHBhY2thZ2VzL2NvcmUvcHJpbWl0aXZlL3NyYy9wcmltaXRpdmUudHN4XG5mdW5jdGlvbiBjb21wb3NlRXZlbnRIYW5kbGVycyhvcmlnaW5hbEV2ZW50SGFuZGxlciwgb3VyRXZlbnRIYW5kbGVyLCB7IGNoZWNrRm9yRGVmYXVsdFByZXZlbnRlZCA9IHRydWUgfSA9IHt9KSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgIG9yaWdpbmFsRXZlbnRIYW5kbGVyPy4oZXZlbnQpO1xuICAgIGlmIChjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQgPT09IGZhbHNlIHx8ICFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm4gb3VyRXZlbnRIYW5kbGVyPy4oZXZlbnQpO1xuICAgIH1cbiAgfTtcbn1cbmV4cG9ydCB7XG4gIGNvbXBvc2VFdmVudEhhbmRsZXJzXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiLy8gcGFja2FnZXMvcmVhY3QvYXJyb3cvc3JjL0Fycm93LnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXByaW1pdGl2ZVwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgTkFNRSA9IFwiQXJyb3dcIjtcbnZhciBBcnJvdyA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBjaGlsZHJlbiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSwgLi4uYXJyb3dQcm9wcyB9ID0gcHJvcHM7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgIFByaW1pdGl2ZS5zdmcsXG4gICAge1xuICAgICAgLi4uYXJyb3dQcm9wcyxcbiAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB2aWV3Qm94OiBcIjAgMCAzMCAxMFwiLFxuICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbzogXCJub25lXCIsXG4gICAgICBjaGlsZHJlbjogcHJvcHMuYXNDaGlsZCA/IGNoaWxkcmVuIDogLyogQF9fUFVSRV9fICovIGpzeChcInBvbHlnb25cIiwgeyBwb2ludHM6IFwiMCwwIDMwLDAgMTUsMTBcIiB9KVxuICAgIH1cbiAgKTtcbn0pO1xuQXJyb3cuZGlzcGxheU5hbWUgPSBOQU1FO1xudmFyIFJvb3QgPSBBcnJvdztcbmV4cG9ydCB7XG4gIEFycm93LFxuICBSb290XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L2NvbGxlY3Rpb24vc3JjL0NvbGxlY3Rpb24udHN4XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0U2NvcGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbnRleHRcIjtcbmltcG9ydCB7IHVzZUNvbXBvc2VkUmVmcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzXCI7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1zbG90XCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmZ1bmN0aW9uIGNyZWF0ZUNvbGxlY3Rpb24obmFtZSkge1xuICBjb25zdCBQUk9WSURFUl9OQU1FID0gbmFtZSArIFwiQ29sbGVjdGlvblByb3ZpZGVyXCI7XG4gIGNvbnN0IFtjcmVhdGVDb2xsZWN0aW9uQ29udGV4dCwgY3JlYXRlQ29sbGVjdGlvblNjb3BlXSA9IGNyZWF0ZUNvbnRleHRTY29wZShQUk9WSURFUl9OQU1FKTtcbiAgY29uc3QgW0NvbGxlY3Rpb25Qcm92aWRlckltcGwsIHVzZUNvbGxlY3Rpb25Db250ZXh0XSA9IGNyZWF0ZUNvbGxlY3Rpb25Db250ZXh0KFxuICAgIFBST1ZJREVSX05BTUUsXG4gICAgeyBjb2xsZWN0aW9uUmVmOiB7IGN1cnJlbnQ6IG51bGwgfSwgaXRlbU1hcDogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSB9XG4gICk7XG4gIGNvbnN0IENvbGxlY3Rpb25Qcm92aWRlciA9IChwcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgc2NvcGUsIGNoaWxkcmVuIH0gPSBwcm9wcztcbiAgICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgaXRlbU1hcCA9IFJlYWN0LnVzZVJlZigvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKS5jdXJyZW50O1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbGxlY3Rpb25Qcm92aWRlckltcGwsIHsgc2NvcGUsIGl0ZW1NYXAsIGNvbGxlY3Rpb25SZWY6IHJlZiwgY2hpbGRyZW4gfSk7XG4gIH07XG4gIENvbGxlY3Rpb25Qcm92aWRlci5kaXNwbGF5TmFtZSA9IFBST1ZJREVSX05BTUU7XG4gIGNvbnN0IENPTExFQ1RJT05fU0xPVF9OQU1FID0gbmFtZSArIFwiQ29sbGVjdGlvblNsb3RcIjtcbiAgY29uc3QgQ29sbGVjdGlvblNsb3QgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAgIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgICBjb25zdCB7IHNjb3BlLCBjaGlsZHJlbiB9ID0gcHJvcHM7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdXNlQ29sbGVjdGlvbkNvbnRleHQoQ09MTEVDVElPTl9TTE9UX05BTUUsIHNjb3BlKTtcbiAgICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIGNvbnRleHQuY29sbGVjdGlvblJlZik7XG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChTbG90LCB7IHJlZjogY29tcG9zZWRSZWZzLCBjaGlsZHJlbiB9KTtcbiAgICB9XG4gICk7XG4gIENvbGxlY3Rpb25TbG90LmRpc3BsYXlOYW1lID0gQ09MTEVDVElPTl9TTE9UX05BTUU7XG4gIGNvbnN0IElURU1fU0xPVF9OQU1FID0gbmFtZSArIFwiQ29sbGVjdGlvbkl0ZW1TbG90XCI7XG4gIGNvbnN0IElURU1fREFUQV9BVFRSID0gXCJkYXRhLXJhZGl4LWNvbGxlY3Rpb24taXRlbVwiO1xuICBjb25zdCBDb2xsZWN0aW9uSXRlbVNsb3QgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAgIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgICBjb25zdCB7IHNjb3BlLCBjaGlsZHJlbiwgLi4uaXRlbURhdGEgfSA9IHByb3BzO1xuICAgICAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgICAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgcmVmKTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb2xsZWN0aW9uQ29udGV4dChJVEVNX1NMT1RfTkFNRSwgc2NvcGUpO1xuICAgICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29udGV4dC5pdGVtTWFwLnNldChyZWYsIHsgcmVmLCAuLi5pdGVtRGF0YSB9KTtcbiAgICAgICAgcmV0dXJuICgpID0+IHZvaWQgY29udGV4dC5pdGVtTWFwLmRlbGV0ZShyZWYpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChTbG90LCB7IC4uLnsgW0lURU1fREFUQV9BVFRSXTogXCJcIiB9LCByZWY6IGNvbXBvc2VkUmVmcywgY2hpbGRyZW4gfSk7XG4gICAgfVxuICApO1xuICBDb2xsZWN0aW9uSXRlbVNsb3QuZGlzcGxheU5hbWUgPSBJVEVNX1NMT1RfTkFNRTtcbiAgZnVuY3Rpb24gdXNlQ29sbGVjdGlvbihzY29wZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb2xsZWN0aW9uQ29udGV4dChuYW1lICsgXCJDb2xsZWN0aW9uQ29uc3VtZXJcIiwgc2NvcGUpO1xuICAgIGNvbnN0IGdldEl0ZW1zID0gUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgY29uc3QgY29sbGVjdGlvbk5vZGUgPSBjb250ZXh0LmNvbGxlY3Rpb25SZWYuY3VycmVudDtcbiAgICAgIGlmICghY29sbGVjdGlvbk5vZGUpIHJldHVybiBbXTtcbiAgICAgIGNvbnN0IG9yZGVyZWROb2RlcyA9IEFycmF5LmZyb20oY29sbGVjdGlvbk5vZGUucXVlcnlTZWxlY3RvckFsbChgWyR7SVRFTV9EQVRBX0FUVFJ9XWApKTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShjb250ZXh0Lml0ZW1NYXAudmFsdWVzKCkpO1xuICAgICAgY29uc3Qgb3JkZXJlZEl0ZW1zID0gaXRlbXMuc29ydChcbiAgICAgICAgKGEsIGIpID0+IG9yZGVyZWROb2Rlcy5pbmRleE9mKGEucmVmLmN1cnJlbnQpIC0gb3JkZXJlZE5vZGVzLmluZGV4T2YoYi5yZWYuY3VycmVudClcbiAgICAgICk7XG4gICAgICByZXR1cm4gb3JkZXJlZEl0ZW1zO1xuICAgIH0sIFtjb250ZXh0LmNvbGxlY3Rpb25SZWYsIGNvbnRleHQuaXRlbU1hcF0pO1xuICAgIHJldHVybiBnZXRJdGVtcztcbiAgfVxuICByZXR1cm4gW1xuICAgIHsgUHJvdmlkZXI6IENvbGxlY3Rpb25Qcm92aWRlciwgU2xvdDogQ29sbGVjdGlvblNsb3QsIEl0ZW1TbG90OiBDb2xsZWN0aW9uSXRlbVNsb3QgfSxcbiAgICB1c2VDb2xsZWN0aW9uLFxuICAgIGNyZWF0ZUNvbGxlY3Rpb25TY29wZVxuICBdO1xufVxuZXhwb3J0IHtcbiAgY3JlYXRlQ29sbGVjdGlvblxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L2NvbXBvc2UtcmVmcy9zcmMvY29tcG9zZVJlZnMudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmZ1bmN0aW9uIHNldFJlZihyZWYsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZWYodmFsdWUpO1xuICB9IGVsc2UgaWYgKHJlZiAhPT0gbnVsbCAmJiByZWYgIT09IHZvaWQgMCkge1xuICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNvbXBvc2VSZWZzKC4uLnJlZnMpIHtcbiAgcmV0dXJuIChub2RlKSA9PiByZWZzLmZvckVhY2goKHJlZikgPT4gc2V0UmVmKHJlZiwgbm9kZSkpO1xufVxuZnVuY3Rpb24gdXNlQ29tcG9zZWRSZWZzKC4uLnJlZnMpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNhbGxiYWNrKGNvbXBvc2VSZWZzKC4uLnJlZnMpLCByZWZzKTtcbn1cbmV4cG9ydCB7XG4gIGNvbXBvc2VSZWZzLFxuICB1c2VDb21wb3NlZFJlZnNcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC9jb250ZXh0L3NyYy9jcmVhdGVDb250ZXh0LnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQyKHJvb3RDb21wb25lbnROYW1lLCBkZWZhdWx0Q29udGV4dCkge1xuICBjb25zdCBDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dChkZWZhdWx0Q29udGV4dCk7XG4gIGZ1bmN0aW9uIFByb3ZpZGVyKHByb3BzKSB7XG4gICAgY29uc3QgeyBjaGlsZHJlbiwgLi4uY29udGV4dCB9ID0gcHJvcHM7XG4gICAgY29uc3QgdmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+IGNvbnRleHQsIE9iamVjdC52YWx1ZXMoY29udGV4dCkpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWUsIGNoaWxkcmVuIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHVzZUNvbnRleHQyKGNvbnN1bWVyTmFtZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KENvbnRleHQpO1xuICAgIGlmIChjb250ZXh0KSByZXR1cm4gY29udGV4dDtcbiAgICBpZiAoZGVmYXVsdENvbnRleHQgIT09IHZvaWQgMCkgcmV0dXJuIGRlZmF1bHRDb250ZXh0O1xuICAgIHRocm93IG5ldyBFcnJvcihgXFxgJHtjb25zdW1lck5hbWV9XFxgIG11c3QgYmUgdXNlZCB3aXRoaW4gXFxgJHtyb290Q29tcG9uZW50TmFtZX1cXGBgKTtcbiAgfVxuICBQcm92aWRlci5kaXNwbGF5TmFtZSA9IHJvb3RDb21wb25lbnROYW1lICsgXCJQcm92aWRlclwiO1xuICByZXR1cm4gW1Byb3ZpZGVyLCB1c2VDb250ZXh0Ml07XG59XG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0U2NvcGUoc2NvcGVOYW1lLCBjcmVhdGVDb250ZXh0U2NvcGVEZXBzID0gW10pIHtcbiAgbGV0IGRlZmF1bHRDb250ZXh0cyA9IFtdO1xuICBmdW5jdGlvbiBjcmVhdGVDb250ZXh0Myhyb290Q29tcG9uZW50TmFtZSwgZGVmYXVsdENvbnRleHQpIHtcbiAgICBjb25zdCBCYXNlQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoZGVmYXVsdENvbnRleHQpO1xuICAgIGNvbnN0IGluZGV4ID0gZGVmYXVsdENvbnRleHRzLmxlbmd0aDtcbiAgICBkZWZhdWx0Q29udGV4dHMgPSBbLi4uZGVmYXVsdENvbnRleHRzLCBkZWZhdWx0Q29udGV4dF07XG4gICAgZnVuY3Rpb24gUHJvdmlkZXIocHJvcHMpIHtcbiAgICAgIGNvbnN0IHsgc2NvcGUsIGNoaWxkcmVuLCAuLi5jb250ZXh0IH0gPSBwcm9wcztcbiAgICAgIGNvbnN0IENvbnRleHQgPSBzY29wZT8uW3Njb3BlTmFtZV1baW5kZXhdIHx8IEJhc2VDb250ZXh0O1xuICAgICAgY29uc3QgdmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+IGNvbnRleHQsIE9iamVjdC52YWx1ZXMoY29udGV4dCkpO1xuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZSwgY2hpbGRyZW4gfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVzZUNvbnRleHQyKGNvbnN1bWVyTmFtZSwgc2NvcGUpIHtcbiAgICAgIGNvbnN0IENvbnRleHQgPSBzY29wZT8uW3Njb3BlTmFtZV1baW5kZXhdIHx8IEJhc2VDb250ZXh0O1xuICAgICAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQ29udGV4dCk7XG4gICAgICBpZiAoY29udGV4dCkgcmV0dXJuIGNvbnRleHQ7XG4gICAgICBpZiAoZGVmYXVsdENvbnRleHQgIT09IHZvaWQgMCkgcmV0dXJuIGRlZmF1bHRDb250ZXh0O1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGAke2NvbnN1bWVyTmFtZX1cXGAgbXVzdCBiZSB1c2VkIHdpdGhpbiBcXGAke3Jvb3RDb21wb25lbnROYW1lfVxcYGApO1xuICAgIH1cbiAgICBQcm92aWRlci5kaXNwbGF5TmFtZSA9IHJvb3RDb21wb25lbnROYW1lICsgXCJQcm92aWRlclwiO1xuICAgIHJldHVybiBbUHJvdmlkZXIsIHVzZUNvbnRleHQyXTtcbiAgfVxuICBjb25zdCBjcmVhdGVTY29wZSA9ICgpID0+IHtcbiAgICBjb25zdCBzY29wZUNvbnRleHRzID0gZGVmYXVsdENvbnRleHRzLm1hcCgoZGVmYXVsdENvbnRleHQpID0+IHtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVDb250ZXh0KGRlZmF1bHRDb250ZXh0KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdXNlU2NvcGUoc2NvcGUpIHtcbiAgICAgIGNvbnN0IGNvbnRleHRzID0gc2NvcGU/LltzY29wZU5hbWVdIHx8IHNjb3BlQ29udGV4dHM7XG4gICAgICByZXR1cm4gUmVhY3QudXNlTWVtbyhcbiAgICAgICAgKCkgPT4gKHsgW2BfX3Njb3BlJHtzY29wZU5hbWV9YF06IHsgLi4uc2NvcGUsIFtzY29wZU5hbWVdOiBjb250ZXh0cyB9IH0pLFxuICAgICAgICBbc2NvcGUsIGNvbnRleHRzXVxuICAgICAgKTtcbiAgICB9O1xuICB9O1xuICBjcmVhdGVTY29wZS5zY29wZU5hbWUgPSBzY29wZU5hbWU7XG4gIHJldHVybiBbY3JlYXRlQ29udGV4dDMsIGNvbXBvc2VDb250ZXh0U2NvcGVzKGNyZWF0ZVNjb3BlLCAuLi5jcmVhdGVDb250ZXh0U2NvcGVEZXBzKV07XG59XG5mdW5jdGlvbiBjb21wb3NlQ29udGV4dFNjb3BlcyguLi5zY29wZXMpIHtcbiAgY29uc3QgYmFzZVNjb3BlID0gc2NvcGVzWzBdO1xuICBpZiAoc2NvcGVzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGJhc2VTY29wZTtcbiAgY29uc3QgY3JlYXRlU2NvcGUgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2NvcGVIb29rcyA9IHNjb3Blcy5tYXAoKGNyZWF0ZVNjb3BlMikgPT4gKHtcbiAgICAgIHVzZVNjb3BlOiBjcmVhdGVTY29wZTIoKSxcbiAgICAgIHNjb3BlTmFtZTogY3JlYXRlU2NvcGUyLnNjb3BlTmFtZVxuICAgIH0pKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gdXNlQ29tcG9zZWRTY29wZXMob3ZlcnJpZGVTY29wZXMpIHtcbiAgICAgIGNvbnN0IG5leHRTY29wZXMgPSBzY29wZUhvb2tzLnJlZHVjZSgobmV4dFNjb3BlczIsIHsgdXNlU2NvcGUsIHNjb3BlTmFtZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlUHJvcHMgPSB1c2VTY29wZShvdmVycmlkZVNjb3Blcyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTY29wZSA9IHNjb3BlUHJvcHNbYF9fc2NvcGUke3Njb3BlTmFtZX1gXTtcbiAgICAgICAgcmV0dXJuIHsgLi4ubmV4dFNjb3BlczIsIC4uLmN1cnJlbnRTY29wZSB9O1xuICAgICAgfSwge30pO1xuICAgICAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKHsgW2BfX3Njb3BlJHtiYXNlU2NvcGUuc2NvcGVOYW1lfWBdOiBuZXh0U2NvcGVzIH0pLCBbbmV4dFNjb3Blc10pO1xuICAgIH07XG4gIH07XG4gIGNyZWF0ZVNjb3BlLnNjb3BlTmFtZSA9IGJhc2VTY29wZS5zY29wZU5hbWU7XG4gIHJldHVybiBjcmVhdGVTY29wZTtcbn1cbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbnRleHQyIGFzIGNyZWF0ZUNvbnRleHQsXG4gIGNyZWF0ZUNvbnRleHRTY29wZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L2RpcmVjdGlvbi9zcmMvRGlyZWN0aW9uLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBEaXJlY3Rpb25Db250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh2b2lkIDApO1xudmFyIERpcmVjdGlvblByb3ZpZGVyID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgZGlyLCBjaGlsZHJlbiB9ID0gcHJvcHM7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KERpcmVjdGlvbkNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGRpciwgY2hpbGRyZW4gfSk7XG59O1xuZnVuY3Rpb24gdXNlRGlyZWN0aW9uKGxvY2FsRGlyKSB7XG4gIGNvbnN0IGdsb2JhbERpciA9IFJlYWN0LnVzZUNvbnRleHQoRGlyZWN0aW9uQ29udGV4dCk7XG4gIHJldHVybiBsb2NhbERpciB8fCBnbG9iYWxEaXIgfHwgXCJsdHJcIjtcbn1cbnZhciBQcm92aWRlciA9IERpcmVjdGlvblByb3ZpZGVyO1xuZXhwb3J0IHtcbiAgRGlyZWN0aW9uUHJvdmlkZXIsXG4gIFByb3ZpZGVyLFxuICB1c2VEaXJlY3Rpb25cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCJcInVzZSBjbGllbnRcIjtcblxuLy8gcGFja2FnZXMvcmVhY3QvZGlzbWlzc2FibGUtbGF5ZXIvc3JjL0Rpc21pc3NhYmxlTGF5ZXIudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNvbXBvc2VFdmVudEhhbmRsZXJzIH0gZnJvbSBcIkByYWRpeC11aS9wcmltaXRpdmVcIjtcbmltcG9ydCB7IFByaW1pdGl2ZSwgZGlzcGF0Y2hEaXNjcmV0ZUN1c3RvbUV2ZW50IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wcmltaXRpdmVcIjtcbmltcG9ydCB7IHVzZUNvbXBvc2VkUmVmcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZlwiO1xuaW1wb3J0IHsgdXNlRXNjYXBlS2V5ZG93biB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWVzY2FwZS1rZXlkb3duXCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBESVNNSVNTQUJMRV9MQVlFUl9OQU1FID0gXCJEaXNtaXNzYWJsZUxheWVyXCI7XG52YXIgQ09OVEVYVF9VUERBVEUgPSBcImRpc21pc3NhYmxlTGF5ZXIudXBkYXRlXCI7XG52YXIgUE9JTlRFUl9ET1dOX09VVFNJREUgPSBcImRpc21pc3NhYmxlTGF5ZXIucG9pbnRlckRvd25PdXRzaWRlXCI7XG52YXIgRk9DVVNfT1VUU0lERSA9IFwiZGlzbWlzc2FibGVMYXllci5mb2N1c091dHNpZGVcIjtcbnZhciBvcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzO1xudmFyIERpc21pc3NhYmxlTGF5ZXJDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGxheWVyczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgbGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksXG4gIGJyYW5jaGVzOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpXG59KTtcbnZhciBEaXNtaXNzYWJsZUxheWVyID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHMgPSBmYWxzZSxcbiAgICAgIG9uRXNjYXBlS2V5RG93bixcbiAgICAgIG9uUG9pbnRlckRvd25PdXRzaWRlLFxuICAgICAgb25Gb2N1c091dHNpZGUsXG4gICAgICBvbkludGVyYWN0T3V0c2lkZSxcbiAgICAgIG9uRGlzbWlzcyxcbiAgICAgIC4uLmxheWVyUHJvcHNcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRGlzbWlzc2FibGVMYXllckNvbnRleHQpO1xuICAgIGNvbnN0IFtub2RlLCBzZXROb2RlXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICAgIGNvbnN0IG93bmVyRG9jdW1lbnQgPSBub2RlPy5vd25lckRvY3VtZW50ID8/IGdsb2JhbFRoaXM/LmRvY3VtZW50O1xuICAgIGNvbnN0IFssIGZvcmNlXSA9IFJlYWN0LnVzZVN0YXRlKHt9KTtcbiAgICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCAobm9kZTIpID0+IHNldE5vZGUobm9kZTIpKTtcbiAgICBjb25zdCBsYXllcnMgPSBBcnJheS5mcm9tKGNvbnRleHQubGF5ZXJzKTtcbiAgICBjb25zdCBbaGlnaGVzdExheWVyV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRdID0gWy4uLmNvbnRleHQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRdLnNsaWNlKC0xKTtcbiAgICBjb25zdCBoaWdoZXN0TGF5ZXJXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZEluZGV4ID0gbGF5ZXJzLmluZGV4T2YoaGlnaGVzdExheWVyV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQpO1xuICAgIGNvbnN0IGluZGV4ID0gbm9kZSA/IGxheWVycy5pbmRleE9mKG5vZGUpIDogLTE7XG4gICAgY29uc3QgaXNCb2R5UG9pbnRlckV2ZW50c0Rpc2FibGVkID0gY29udGV4dC5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplID4gMDtcbiAgICBjb25zdCBpc1BvaW50ZXJFdmVudHNFbmFibGVkID0gaW5kZXggPj0gaGlnaGVzdExheWVyV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRJbmRleDtcbiAgICBjb25zdCBwb2ludGVyRG93bk91dHNpZGUgPSB1c2VQb2ludGVyRG93bk91dHNpZGUoKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBjb25zdCBpc1BvaW50ZXJEb3duT25CcmFuY2ggPSBbLi4uY29udGV4dC5icmFuY2hlc10uc29tZSgoYnJhbmNoKSA9PiBicmFuY2guY29udGFpbnModGFyZ2V0KSk7XG4gICAgICBpZiAoIWlzUG9pbnRlckV2ZW50c0VuYWJsZWQgfHwgaXNQb2ludGVyRG93bk9uQnJhbmNoKSByZXR1cm47XG4gICAgICBvblBvaW50ZXJEb3duT3V0c2lkZT8uKGV2ZW50KTtcbiAgICAgIG9uSW50ZXJhY3RPdXRzaWRlPy4oZXZlbnQpO1xuICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSBvbkRpc21pc3M/LigpO1xuICAgIH0sIG93bmVyRG9jdW1lbnQpO1xuICAgIGNvbnN0IGZvY3VzT3V0c2lkZSA9IHVzZUZvY3VzT3V0c2lkZSgoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGNvbnN0IGlzRm9jdXNJbkJyYW5jaCA9IFsuLi5jb250ZXh0LmJyYW5jaGVzXS5zb21lKChicmFuY2gpID0+IGJyYW5jaC5jb250YWlucyh0YXJnZXQpKTtcbiAgICAgIGlmIChpc0ZvY3VzSW5CcmFuY2gpIHJldHVybjtcbiAgICAgIG9uRm9jdXNPdXRzaWRlPy4oZXZlbnQpO1xuICAgICAgb25JbnRlcmFjdE91dHNpZGU/LihldmVudCk7XG4gICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIG9uRGlzbWlzcz8uKCk7XG4gICAgfSwgb3duZXJEb2N1bWVudCk7XG4gICAgdXNlRXNjYXBlS2V5ZG93bigoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGlzSGlnaGVzdExheWVyID0gaW5kZXggPT09IGNvbnRleHQubGF5ZXJzLnNpemUgLSAxO1xuICAgICAgaWYgKCFpc0hpZ2hlc3RMYXllcikgcmV0dXJuO1xuICAgICAgb25Fc2NhcGVLZXlEb3duPy4oZXZlbnQpO1xuICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkICYmIG9uRGlzbWlzcykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvbkRpc21pc3MoKTtcbiAgICAgIH1cbiAgICB9LCBvd25lckRvY3VtZW50KTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgICBpZiAoZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzKSB7XG4gICAgICAgIGlmIChjb250ZXh0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemUgPT09IDApIHtcbiAgICAgICAgICBvcmlnaW5hbEJvZHlQb2ludGVyRXZlbnRzID0gb3duZXJEb2N1bWVudC5ib2R5LnN0eWxlLnBvaW50ZXJFdmVudHM7XG4gICAgICAgICAgb3duZXJEb2N1bWVudC5ib2R5LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLmFkZChub2RlKTtcbiAgICAgIH1cbiAgICAgIGNvbnRleHQubGF5ZXJzLmFkZChub2RlKTtcbiAgICAgIGRpc3BhdGNoVXBkYXRlKCk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzICYmIGNvbnRleHQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZSA9PT0gMSkge1xuICAgICAgICAgIG93bmVyRG9jdW1lbnQuYm9keS5zdHlsZS5wb2ludGVyRXZlbnRzID0gb3JpZ2luYWxCb2R5UG9pbnRlckV2ZW50cztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCBbbm9kZSwgb3duZXJEb2N1bWVudCwgZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzLCBjb250ZXh0XSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuO1xuICAgICAgICBjb250ZXh0LmxheWVycy5kZWxldGUobm9kZSk7XG4gICAgICAgIGNvbnRleHQubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuZGVsZXRlKG5vZGUpO1xuICAgICAgICBkaXNwYXRjaFVwZGF0ZSgpO1xuICAgICAgfTtcbiAgICB9LCBbbm9kZSwgY29udGV4dF0pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVVcGRhdGUgPSAoKSA9PiBmb3JjZSh7fSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKENPTlRFWFRfVVBEQVRFLCBoYW5kbGVVcGRhdGUpO1xuICAgICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoQ09OVEVYVF9VUERBVEUsIGhhbmRsZVVwZGF0ZSk7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgUHJpbWl0aXZlLmRpdixcbiAgICAgIHtcbiAgICAgICAgLi4ubGF5ZXJQcm9wcyxcbiAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgcG9pbnRlckV2ZW50czogaXNCb2R5UG9pbnRlckV2ZW50c0Rpc2FibGVkID8gaXNQb2ludGVyRXZlbnRzRW5hYmxlZCA/IFwiYXV0b1wiIDogXCJub25lXCIgOiB2b2lkIDAsXG4gICAgICAgICAgLi4ucHJvcHMuc3R5bGVcbiAgICAgICAgfSxcbiAgICAgICAgb25Gb2N1c0NhcHR1cmU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uRm9jdXNDYXB0dXJlLCBmb2N1c091dHNpZGUub25Gb2N1c0NhcHR1cmUpLFxuICAgICAgICBvbkJsdXJDYXB0dXJlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkJsdXJDYXB0dXJlLCBmb2N1c091dHNpZGUub25CbHVyQ2FwdHVyZSksXG4gICAgICAgIG9uUG9pbnRlckRvd25DYXB0dXJlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICBwcm9wcy5vblBvaW50ZXJEb3duQ2FwdHVyZSxcbiAgICAgICAgICBwb2ludGVyRG93bk91dHNpZGUub25Qb2ludGVyRG93bkNhcHR1cmVcbiAgICAgICAgKVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5EaXNtaXNzYWJsZUxheWVyLmRpc3BsYXlOYW1lID0gRElTTUlTU0FCTEVfTEFZRVJfTkFNRTtcbnZhciBCUkFOQ0hfTkFNRSA9IFwiRGlzbWlzc2FibGVMYXllckJyYW5jaFwiO1xudmFyIERpc21pc3NhYmxlTGF5ZXJCcmFuY2ggPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KERpc21pc3NhYmxlTGF5ZXJDb250ZXh0KTtcbiAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSByZWYuY3VycmVudDtcbiAgICBpZiAobm9kZSkge1xuICAgICAgY29udGV4dC5icmFuY2hlcy5hZGQobm9kZSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb250ZXh0LmJyYW5jaGVzLmRlbGV0ZShub2RlKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbY29udGV4dC5icmFuY2hlc10pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQcmltaXRpdmUuZGl2LCB7IC4uLnByb3BzLCByZWY6IGNvbXBvc2VkUmVmcyB9KTtcbn0pO1xuRGlzbWlzc2FibGVMYXllckJyYW5jaC5kaXNwbGF5TmFtZSA9IEJSQU5DSF9OQU1FO1xuZnVuY3Rpb24gdXNlUG9pbnRlckRvd25PdXRzaWRlKG9uUG9pbnRlckRvd25PdXRzaWRlLCBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcz8uZG9jdW1lbnQpIHtcbiAgY29uc3QgaGFuZGxlUG9pbnRlckRvd25PdXRzaWRlID0gdXNlQ2FsbGJhY2tSZWYob25Qb2ludGVyRG93bk91dHNpZGUpO1xuICBjb25zdCBpc1BvaW50ZXJJbnNpZGVSZWFjdFRyZWVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBoYW5kbGVDbGlja1JlZiA9IFJlYWN0LnVzZVJlZigoKSA9PiB7XG4gIH0pO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVBvaW50ZXJEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ICYmICFpc1BvaW50ZXJJbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudCkge1xuICAgICAgICBsZXQgaGFuZGxlQW5kRGlzcGF0Y2hQb2ludGVyRG93bk91dHNpZGVFdmVudDIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBoYW5kbGVBbmREaXNwYXRjaEN1c3RvbUV2ZW50KFxuICAgICAgICAgICAgUE9JTlRFUl9ET1dOX09VVFNJREUsXG4gICAgICAgICAgICBoYW5kbGVQb2ludGVyRG93bk91dHNpZGUsXG4gICAgICAgICAgICBldmVudERldGFpbCxcbiAgICAgICAgICAgIHsgZGlzY3JldGU6IHRydWUgfVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBoYW5kbGVBbmREaXNwYXRjaFBvaW50ZXJEb3duT3V0c2lkZUV2ZW50ID0gaGFuZGxlQW5kRGlzcGF0Y2hQb2ludGVyRG93bk91dHNpZGVFdmVudDI7XG4gICAgICAgIGNvbnN0IGV2ZW50RGV0YWlsID0geyBvcmlnaW5hbEV2ZW50OiBldmVudCB9O1xuICAgICAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIikge1xuICAgICAgICAgIG93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrUmVmLmN1cnJlbnQpO1xuICAgICAgICAgIGhhbmRsZUNsaWNrUmVmLmN1cnJlbnQgPSBoYW5kbGVBbmREaXNwYXRjaFBvaW50ZXJEb3duT3V0c2lkZUV2ZW50MjtcbiAgICAgICAgICBvd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGlja1JlZi5jdXJyZW50LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFuZGxlQW5kRGlzcGF0Y2hQb2ludGVyRG93bk91dHNpZGVFdmVudDIoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2tSZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgICBpc1BvaW50ZXJJbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH07XG4gICAgY29uc3QgdGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIG93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICB9LCAwKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgIG93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgIG93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrUmVmLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtvd25lckRvY3VtZW50LCBoYW5kbGVQb2ludGVyRG93bk91dHNpZGVdKTtcbiAgcmV0dXJuIHtcbiAgICAvLyBlbnN1cmVzIHdlIGNoZWNrIFJlYWN0IGNvbXBvbmVudCB0cmVlIChub3QganVzdCBET00gdHJlZSlcbiAgICBvblBvaW50ZXJEb3duQ2FwdHVyZTogKCkgPT4gaXNQb2ludGVySW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSB0cnVlXG4gIH07XG59XG5mdW5jdGlvbiB1c2VGb2N1c091dHNpZGUob25Gb2N1c091dHNpZGUsIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzPy5kb2N1bWVudCkge1xuICBjb25zdCBoYW5kbGVGb2N1c091dHNpZGUgPSB1c2VDYWxsYmFja1JlZihvbkZvY3VzT3V0c2lkZSk7XG4gIGNvbnN0IGlzRm9jdXNJbnNpZGVSZWFjdFRyZWVSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZUZvY3VzID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ICYmICFpc0ZvY3VzSW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgZXZlbnREZXRhaWwgPSB7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50IH07XG4gICAgICAgIGhhbmRsZUFuZERpc3BhdGNoQ3VzdG9tRXZlbnQoRk9DVVNfT1VUU0lERSwgaGFuZGxlRm9jdXNPdXRzaWRlLCBldmVudERldGFpbCwge1xuICAgICAgICAgIGRpc2NyZXRlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIG93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgaGFuZGxlRm9jdXMpO1xuICAgIHJldHVybiAoKSA9PiBvd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIGhhbmRsZUZvY3VzKTtcbiAgfSwgW293bmVyRG9jdW1lbnQsIGhhbmRsZUZvY3VzT3V0c2lkZV0pO1xuICByZXR1cm4ge1xuICAgIG9uRm9jdXNDYXB0dXJlOiAoKSA9PiBpc0ZvY3VzSW5zaWRlUmVhY3RUcmVlUmVmLmN1cnJlbnQgPSB0cnVlLFxuICAgIG9uQmx1ckNhcHR1cmU6ICgpID0+IGlzRm9jdXNJbnNpZGVSZWFjdFRyZWVSZWYuY3VycmVudCA9IGZhbHNlXG4gIH07XG59XG5mdW5jdGlvbiBkaXNwYXRjaFVwZGF0ZSgpIHtcbiAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoQ09OVEVYVF9VUERBVEUpO1xuICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUFuZERpc3BhdGNoQ3VzdG9tRXZlbnQobmFtZSwgaGFuZGxlciwgZGV0YWlsLCB7IGRpc2NyZXRlIH0pIHtcbiAgY29uc3QgdGFyZ2V0ID0gZGV0YWlsLm9yaWdpbmFsRXZlbnQudGFyZ2V0O1xuICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudChuYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBkZXRhaWwgfSk7XG4gIGlmIChoYW5kbGVyKSB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gIGlmIChkaXNjcmV0ZSkge1xuICAgIGRpc3BhdGNoRGlzY3JldGVDdXN0b21FdmVudCh0YXJnZXQsIGV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cbn1cbnZhciBSb290ID0gRGlzbWlzc2FibGVMYXllcjtcbnZhciBCcmFuY2ggPSBEaXNtaXNzYWJsZUxheWVyQnJhbmNoO1xuZXhwb3J0IHtcbiAgQnJhbmNoLFxuICBEaXNtaXNzYWJsZUxheWVyLFxuICBEaXNtaXNzYWJsZUxheWVyQnJhbmNoLFxuICBSb290XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L2Ryb3Bkb3duLW1lbnUvc3JjL0Ryb3Bkb3duTWVudS50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgY29tcG9zZUV2ZW50SGFuZGxlcnMgfSBmcm9tIFwiQHJhZGl4LXVpL3ByaW1pdGl2ZVwiO1xuaW1wb3J0IHsgY29tcG9zZVJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dFNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VDb250cm9sbGFibGVTdGF0ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWNvbnRyb2xsYWJsZS1zdGF0ZVwiO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wcmltaXRpdmVcIjtcbmltcG9ydCAqIGFzIE1lbnVQcmltaXRpdmUgZnJvbSBcIkByYWRpeC11aS9yZWFjdC1tZW51XCI7XG5pbXBvcnQgeyBjcmVhdGVNZW51U2NvcGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LW1lbnVcIjtcbmltcG9ydCB7IHVzZUlkIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1pZFwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgRFJPUERPV05fTUVOVV9OQU1FID0gXCJEcm9wZG93bk1lbnVcIjtcbnZhciBbY3JlYXRlRHJvcGRvd25NZW51Q29udGV4dCwgY3JlYXRlRHJvcGRvd25NZW51U2NvcGVdID0gY3JlYXRlQ29udGV4dFNjb3BlKFxuICBEUk9QRE9XTl9NRU5VX05BTUUsXG4gIFtjcmVhdGVNZW51U2NvcGVdXG4pO1xudmFyIHVzZU1lbnVTY29wZSA9IGNyZWF0ZU1lbnVTY29wZSgpO1xudmFyIFtEcm9wZG93bk1lbnVQcm92aWRlciwgdXNlRHJvcGRvd25NZW51Q29udGV4dF0gPSBjcmVhdGVEcm9wZG93bk1lbnVDb250ZXh0KERST1BET1dOX01FTlVfTkFNRSk7XG52YXIgRHJvcGRvd25NZW51ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBfX3Njb3BlRHJvcGRvd25NZW51LFxuICAgIGNoaWxkcmVuLFxuICAgIGRpcixcbiAgICBvcGVuOiBvcGVuUHJvcCxcbiAgICBkZWZhdWx0T3BlbixcbiAgICBvbk9wZW5DaGFuZ2UsXG4gICAgbW9kYWwgPSB0cnVlXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICBjb25zdCB0cmlnZ2VyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBbb3BlbiA9IGZhbHNlLCBzZXRPcGVuXSA9IHVzZUNvbnRyb2xsYWJsZVN0YXRlKHtcbiAgICBwcm9wOiBvcGVuUHJvcCxcbiAgICBkZWZhdWx0UHJvcDogZGVmYXVsdE9wZW4sXG4gICAgb25DaGFuZ2U6IG9uT3BlbkNoYW5nZVxuICB9KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgRHJvcGRvd25NZW51UHJvdmlkZXIsXG4gICAge1xuICAgICAgc2NvcGU6IF9fc2NvcGVEcm9wZG93bk1lbnUsXG4gICAgICB0cmlnZ2VySWQ6IHVzZUlkKCksXG4gICAgICB0cmlnZ2VyUmVmLFxuICAgICAgY29udGVudElkOiB1c2VJZCgpLFxuICAgICAgb3BlbixcbiAgICAgIG9uT3BlbkNoYW5nZTogc2V0T3BlbixcbiAgICAgIG9uT3BlblRvZ2dsZTogUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4gc2V0T3BlbigocHJldk9wZW4pID0+ICFwcmV2T3BlbiksIFtzZXRPcGVuXSksXG4gICAgICBtb2RhbCxcbiAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuUm9vdCwgeyAuLi5tZW51U2NvcGUsIG9wZW4sIG9uT3BlbkNoYW5nZTogc2V0T3BlbiwgZGlyLCBtb2RhbCwgY2hpbGRyZW4gfSlcbiAgICB9XG4gICk7XG59O1xuRHJvcGRvd25NZW51LmRpc3BsYXlOYW1lID0gRFJPUERPV05fTUVOVV9OQU1FO1xudmFyIFRSSUdHRVJfTkFNRSA9IFwiRHJvcGRvd25NZW51VHJpZ2dlclwiO1xudmFyIERyb3Bkb3duTWVudVRyaWdnZXIgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgZGlzYWJsZWQgPSBmYWxzZSwgLi4udHJpZ2dlclByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlRHJvcGRvd25NZW51Q29udGV4dChUUklHR0VSX05BTUUsIF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICAgIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLkFuY2hvciwgeyBhc0NoaWxkOiB0cnVlLCAuLi5tZW51U2NvcGUsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgUHJpbWl0aXZlLmJ1dHRvbixcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJidXR0b25cIixcbiAgICAgICAgaWQ6IGNvbnRleHQudHJpZ2dlcklkLFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJtZW51XCIsXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBjb250ZXh0Lm9wZW4sXG4gICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiBjb250ZXh0Lm9wZW4gPyBjb250ZXh0LmNvbnRlbnRJZCA6IHZvaWQgMCxcbiAgICAgICAgXCJkYXRhLXN0YXRlXCI6IGNvbnRleHQub3BlbiA/IFwib3BlblwiIDogXCJjbG9zZWRcIixcbiAgICAgICAgXCJkYXRhLWRpc2FibGVkXCI6IGRpc2FibGVkID8gXCJcIiA6IHZvaWQgMCxcbiAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgIC4uLnRyaWdnZXJQcm9wcyxcbiAgICAgICAgcmVmOiBjb21wb3NlUmVmcyhmb3J3YXJkZWRSZWYsIGNvbnRleHQudHJpZ2dlclJlZiksXG4gICAgICAgIG9uUG9pbnRlckRvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uUG9pbnRlckRvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgIGlmICghZGlzYWJsZWQgJiYgZXZlbnQuYnV0dG9uID09PSAwICYmIGV2ZW50LmN0cmxLZXkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb250ZXh0Lm9uT3BlblRvZ2dsZSgpO1xuICAgICAgICAgICAgaWYgKCFjb250ZXh0Lm9wZW4pIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgb25LZXlEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbktleURvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgICAgIGlmIChbXCJFbnRlclwiLCBcIiBcIl0uaW5jbHVkZXMoZXZlbnQua2V5KSkgY29udGV4dC5vbk9wZW5Ub2dnbGUoKTtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93RG93blwiKSBjb250ZXh0Lm9uT3BlbkNoYW5nZSh0cnVlKTtcbiAgICAgICAgICBpZiAoW1wiRW50ZXJcIiwgXCIgXCIsIFwiQXJyb3dEb3duXCJdLmluY2x1ZGVzKGV2ZW50LmtleSkpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgKSB9KTtcbiAgfVxuKTtcbkRyb3Bkb3duTWVudVRyaWdnZXIuZGlzcGxheU5hbWUgPSBUUklHR0VSX05BTUU7XG52YXIgUE9SVEFMX05BTUUgPSBcIkRyb3Bkb3duTWVudVBvcnRhbFwiO1xudmFyIERyb3Bkb3duTWVudVBvcnRhbCA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLnBvcnRhbFByb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLlBvcnRhbCwgeyAuLi5tZW51U2NvcGUsIC4uLnBvcnRhbFByb3BzIH0pO1xufTtcbkRyb3Bkb3duTWVudVBvcnRhbC5kaXNwbGF5TmFtZSA9IFBPUlRBTF9OQU1FO1xudmFyIENPTlRFTlRfTkFNRSA9IFwiRHJvcGRvd25NZW51Q29udGVudFwiO1xudmFyIERyb3Bkb3duTWVudUNvbnRlbnQgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4uY29udGVudFByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlRHJvcGRvd25NZW51Q29udGV4dChDT05URU5UX05BTUUsIF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICAgIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgICBjb25zdCBoYXNJbnRlcmFjdGVkT3V0c2lkZVJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBNZW51UHJpbWl0aXZlLkNvbnRlbnQsXG4gICAgICB7XG4gICAgICAgIGlkOiBjb250ZXh0LmNvbnRlbnRJZCxcbiAgICAgICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogY29udGV4dC50cmlnZ2VySWQsXG4gICAgICAgIC4uLm1lbnVTY29wZSxcbiAgICAgICAgLi4uY29udGVudFByb3BzLFxuICAgICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgICAgb25DbG9zZUF1dG9Gb2N1czogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25DbG9zZUF1dG9Gb2N1cywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKCFoYXNJbnRlcmFjdGVkT3V0c2lkZVJlZi5jdXJyZW50KSBjb250ZXh0LnRyaWdnZXJSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICAgICAgICBoYXNJbnRlcmFjdGVkT3V0c2lkZVJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSksXG4gICAgICAgIG9uSW50ZXJhY3RPdXRzaWRlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkludGVyYWN0T3V0c2lkZSwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxFdmVudCA9IGV2ZW50LmRldGFpbC5vcmlnaW5hbEV2ZW50O1xuICAgICAgICAgIGNvbnN0IGN0cmxMZWZ0Q2xpY2sgPSBvcmlnaW5hbEV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBvcmlnaW5hbEV2ZW50LmN0cmxLZXkgPT09IHRydWU7XG4gICAgICAgICAgY29uc3QgaXNSaWdodENsaWNrID0gb3JpZ2luYWxFdmVudC5idXR0b24gPT09IDIgfHwgY3RybExlZnRDbGljaztcbiAgICAgICAgICBpZiAoIWNvbnRleHQubW9kYWwgfHwgaXNSaWdodENsaWNrKSBoYXNJbnRlcmFjdGVkT3V0c2lkZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgfSksXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgLi4ucHJvcHMuc3R5bGUsXG4gICAgICAgICAgLy8gcmUtbmFtZXNwYWNlIGV4cG9zZWQgY29udGVudCBjdXN0b20gcHJvcGVydGllc1xuICAgICAgICAgIC4uLntcbiAgICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtdHJhbnNmb3JtLW9yaWdpblwiOiBcInZhcigtLXJhZGl4LXBvcHBlci10cmFuc2Zvcm0tb3JpZ2luKVwiLFxuICAgICAgICAgICAgXCItLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC1hdmFpbGFibGUtd2lkdGhcIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoKVwiLFxuICAgICAgICAgICAgXCItLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0XCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS1oZWlnaHQpXCIsXG4gICAgICAgICAgICBcIi0tcmFkaXgtZHJvcGRvd24tbWVudS10cmlnZ2VyLXdpZHRoXCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLWFuY2hvci13aWR0aClcIixcbiAgICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LXRyaWdnZXItaGVpZ2h0XCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHQpXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xuRHJvcGRvd25NZW51Q29udGVudC5kaXNwbGF5TmFtZSA9IENPTlRFTlRfTkFNRTtcbnZhciBHUk9VUF9OQU1FID0gXCJEcm9wZG93bk1lbnVHcm91cFwiO1xudmFyIERyb3Bkb3duTWVudUdyb3VwID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLmdyb3VwUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLkdyb3VwLCB7IC4uLm1lbnVTY29wZSwgLi4uZ3JvdXBQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH1cbik7XG5Ecm9wZG93bk1lbnVHcm91cC5kaXNwbGF5TmFtZSA9IEdST1VQX05BTUU7XG52YXIgTEFCRUxfTkFNRSA9IFwiRHJvcGRvd25NZW51TGFiZWxcIjtcbnZhciBEcm9wZG93bk1lbnVMYWJlbCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5sYWJlbFByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5MYWJlbCwgeyAuLi5tZW51U2NvcGUsIC4uLmxhYmVsUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9XG4pO1xuRHJvcGRvd25NZW51TGFiZWwuZGlzcGxheU5hbWUgPSBMQUJFTF9OQU1FO1xudmFyIElURU1fTkFNRSA9IFwiRHJvcGRvd25NZW51SXRlbVwiO1xudmFyIERyb3Bkb3duTWVudUl0ZW0gPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4uaXRlbVByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5JdGVtLCB7IC4uLm1lbnVTY29wZSwgLi4uaXRlbVByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfVxuKTtcbkRyb3Bkb3duTWVudUl0ZW0uZGlzcGxheU5hbWUgPSBJVEVNX05BTUU7XG52YXIgQ0hFQ0tCT1hfSVRFTV9OQU1FID0gXCJEcm9wZG93bk1lbnVDaGVja2JveEl0ZW1cIjtcbnZhciBEcm9wZG93bk1lbnVDaGVja2JveEl0ZW0gPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4uY2hlY2tib3hJdGVtUHJvcHMgfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuQ2hlY2tib3hJdGVtLCB7IC4uLm1lbnVTY29wZSwgLi4uY2hlY2tib3hJdGVtUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xufSk7XG5Ecm9wZG93bk1lbnVDaGVja2JveEl0ZW0uZGlzcGxheU5hbWUgPSBDSEVDS0JPWF9JVEVNX05BTUU7XG52YXIgUkFESU9fR1JPVVBfTkFNRSA9IFwiRHJvcGRvd25NZW51UmFkaW9Hcm91cFwiO1xudmFyIERyb3Bkb3duTWVudVJhZGlvR3JvdXAgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4ucmFkaW9Hcm91cFByb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLlJhZGlvR3JvdXAsIHsgLi4ubWVudVNjb3BlLCAuLi5yYWRpb0dyb3VwUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xufSk7XG5Ecm9wZG93bk1lbnVSYWRpb0dyb3VwLmRpc3BsYXlOYW1lID0gUkFESU9fR1JPVVBfTkFNRTtcbnZhciBSQURJT19JVEVNX05BTUUgPSBcIkRyb3Bkb3duTWVudVJhZGlvSXRlbVwiO1xudmFyIERyb3Bkb3duTWVudVJhZGlvSXRlbSA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5yYWRpb0l0ZW1Qcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5SYWRpb0l0ZW0sIHsgLi4ubWVudVNjb3BlLCAuLi5yYWRpb0l0ZW1Qcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG59KTtcbkRyb3Bkb3duTWVudVJhZGlvSXRlbS5kaXNwbGF5TmFtZSA9IFJBRElPX0lURU1fTkFNRTtcbnZhciBJTkRJQ0FUT1JfTkFNRSA9IFwiRHJvcGRvd25NZW51SXRlbUluZGljYXRvclwiO1xudmFyIERyb3Bkb3duTWVudUl0ZW1JbmRpY2F0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4uaXRlbUluZGljYXRvclByb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLkl0ZW1JbmRpY2F0b3IsIHsgLi4ubWVudVNjb3BlLCAuLi5pdGVtSW5kaWNhdG9yUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xufSk7XG5Ecm9wZG93bk1lbnVJdGVtSW5kaWNhdG9yLmRpc3BsYXlOYW1lID0gSU5ESUNBVE9SX05BTUU7XG52YXIgU0VQQVJBVE9SX05BTUUgPSBcIkRyb3Bkb3duTWVudVNlcGFyYXRvclwiO1xudmFyIERyb3Bkb3duTWVudVNlcGFyYXRvciA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCAuLi5zZXBhcmF0b3JQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5TZXBhcmF0b3IsIHsgLi4ubWVudVNjb3BlLCAuLi5zZXBhcmF0b3JQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG59KTtcbkRyb3Bkb3duTWVudVNlcGFyYXRvci5kaXNwbGF5TmFtZSA9IFNFUEFSQVRPUl9OQU1FO1xudmFyIEFSUk9XX05BTUUgPSBcIkRyb3Bkb3duTWVudUFycm93XCI7XG52YXIgRHJvcGRvd25NZW51QXJyb3cgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4uYXJyb3dQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KE1lbnVQcmltaXRpdmUuQXJyb3csIHsgLi4ubWVudVNjb3BlLCAuLi5hcnJvd1Byb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfVxuKTtcbkRyb3Bkb3duTWVudUFycm93LmRpc3BsYXlOYW1lID0gQVJST1dfTkFNRTtcbnZhciBEcm9wZG93bk1lbnVTdWIgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBfX3Njb3BlRHJvcGRvd25NZW51LCBjaGlsZHJlbiwgb3Blbjogb3BlblByb3AsIG9uT3BlbkNoYW5nZSwgZGVmYXVsdE9wZW4gfSA9IHByb3BzO1xuICBjb25zdCBtZW51U2NvcGUgPSB1c2VNZW51U2NvcGUoX19zY29wZURyb3Bkb3duTWVudSk7XG4gIGNvbnN0IFtvcGVuID0gZmFsc2UsIHNldE9wZW5dID0gdXNlQ29udHJvbGxhYmxlU3RhdGUoe1xuICAgIHByb3A6IG9wZW5Qcm9wLFxuICAgIGRlZmF1bHRQcm9wOiBkZWZhdWx0T3BlbixcbiAgICBvbkNoYW5nZTogb25PcGVuQ2hhbmdlXG4gIH0pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51UHJpbWl0aXZlLlN1YiwgeyAuLi5tZW51U2NvcGUsIG9wZW4sIG9uT3BlbkNoYW5nZTogc2V0T3BlbiwgY2hpbGRyZW4gfSk7XG59O1xudmFyIFNVQl9UUklHR0VSX05BTUUgPSBcIkRyb3Bkb3duTWVudVN1YlRyaWdnZXJcIjtcbnZhciBEcm9wZG93bk1lbnVTdWJUcmlnZ2VyID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVEcm9wZG93bk1lbnUsIC4uLnN1YlRyaWdnZXJQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IG1lbnVTY29wZSA9IHVzZU1lbnVTY29wZShfX3Njb3BlRHJvcGRvd25NZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudVByaW1pdGl2ZS5TdWJUcmlnZ2VyLCB7IC4uLm1lbnVTY29wZSwgLi4uc3ViVHJpZ2dlclByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbn0pO1xuRHJvcGRvd25NZW51U3ViVHJpZ2dlci5kaXNwbGF5TmFtZSA9IFNVQl9UUklHR0VSX05BTUU7XG52YXIgU1VCX0NPTlRFTlRfTkFNRSA9IFwiRHJvcGRvd25NZW51U3ViQ29udGVudFwiO1xudmFyIERyb3Bkb3duTWVudVN1YkNvbnRlbnQgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZURyb3Bkb3duTWVudSwgLi4uc3ViQ29udGVudFByb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgbWVudVNjb3BlID0gdXNlTWVudVNjb3BlKF9fc2NvcGVEcm9wZG93bk1lbnUpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICBNZW51UHJpbWl0aXZlLlN1YkNvbnRlbnQsXG4gICAge1xuICAgICAgLi4ubWVudVNjb3BlLFxuICAgICAgLi4uc3ViQ29udGVudFByb3BzLFxuICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICBzdHlsZToge1xuICAgICAgICAuLi5wcm9wcy5zdHlsZSxcbiAgICAgICAgLy8gcmUtbmFtZXNwYWNlIGV4cG9zZWQgY29udGVudCBjdXN0b20gcHJvcGVydGllc1xuICAgICAgICAuLi57XG4gICAgICAgICAgXCItLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luXCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLXRyYW5zZm9ybS1vcmlnaW4pXCIsXG4gICAgICAgICAgXCItLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC1hdmFpbGFibGUtd2lkdGhcIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoKVwiLFxuICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodFwiOiBcInZhcigtLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0KVwiLFxuICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LXRyaWdnZXItd2lkdGhcIjogXCJ2YXIoLS1yYWRpeC1wb3BwZXItYW5jaG9yLXdpZHRoKVwiLFxuICAgICAgICAgIFwiLS1yYWRpeC1kcm9wZG93bi1tZW51LXRyaWdnZXItaGVpZ2h0XCI6IFwidmFyKC0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHQpXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgKTtcbn0pO1xuRHJvcGRvd25NZW51U3ViQ29udGVudC5kaXNwbGF5TmFtZSA9IFNVQl9DT05URU5UX05BTUU7XG52YXIgUm9vdDIgPSBEcm9wZG93bk1lbnU7XG52YXIgVHJpZ2dlciA9IERyb3Bkb3duTWVudVRyaWdnZXI7XG52YXIgUG9ydGFsMiA9IERyb3Bkb3duTWVudVBvcnRhbDtcbnZhciBDb250ZW50MiA9IERyb3Bkb3duTWVudUNvbnRlbnQ7XG52YXIgR3JvdXAyID0gRHJvcGRvd25NZW51R3JvdXA7XG52YXIgTGFiZWwyID0gRHJvcGRvd25NZW51TGFiZWw7XG52YXIgSXRlbTIgPSBEcm9wZG93bk1lbnVJdGVtO1xudmFyIENoZWNrYm94SXRlbTIgPSBEcm9wZG93bk1lbnVDaGVja2JveEl0ZW07XG52YXIgUmFkaW9Hcm91cDIgPSBEcm9wZG93bk1lbnVSYWRpb0dyb3VwO1xudmFyIFJhZGlvSXRlbTIgPSBEcm9wZG93bk1lbnVSYWRpb0l0ZW07XG52YXIgSXRlbUluZGljYXRvcjIgPSBEcm9wZG93bk1lbnVJdGVtSW5kaWNhdG9yO1xudmFyIFNlcGFyYXRvcjIgPSBEcm9wZG93bk1lbnVTZXBhcmF0b3I7XG52YXIgQXJyb3cyID0gRHJvcGRvd25NZW51QXJyb3c7XG52YXIgU3ViMiA9IERyb3Bkb3duTWVudVN1YjtcbnZhciBTdWJUcmlnZ2VyMiA9IERyb3Bkb3duTWVudVN1YlRyaWdnZXI7XG52YXIgU3ViQ29udGVudDIgPSBEcm9wZG93bk1lbnVTdWJDb250ZW50O1xuZXhwb3J0IHtcbiAgQXJyb3cyIGFzIEFycm93LFxuICBDaGVja2JveEl0ZW0yIGFzIENoZWNrYm94SXRlbSxcbiAgQ29udGVudDIgYXMgQ29udGVudCxcbiAgRHJvcGRvd25NZW51LFxuICBEcm9wZG93bk1lbnVBcnJvdyxcbiAgRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtLFxuICBEcm9wZG93bk1lbnVDb250ZW50LFxuICBEcm9wZG93bk1lbnVHcm91cCxcbiAgRHJvcGRvd25NZW51SXRlbSxcbiAgRHJvcGRvd25NZW51SXRlbUluZGljYXRvcixcbiAgRHJvcGRvd25NZW51TGFiZWwsXG4gIERyb3Bkb3duTWVudVBvcnRhbCxcbiAgRHJvcGRvd25NZW51UmFkaW9Hcm91cCxcbiAgRHJvcGRvd25NZW51UmFkaW9JdGVtLFxuICBEcm9wZG93bk1lbnVTZXBhcmF0b3IsXG4gIERyb3Bkb3duTWVudVN1YixcbiAgRHJvcGRvd25NZW51U3ViQ29udGVudCxcbiAgRHJvcGRvd25NZW51U3ViVHJpZ2dlcixcbiAgRHJvcGRvd25NZW51VHJpZ2dlcixcbiAgR3JvdXAyIGFzIEdyb3VwLFxuICBJdGVtMiBhcyBJdGVtLFxuICBJdGVtSW5kaWNhdG9yMiBhcyBJdGVtSW5kaWNhdG9yLFxuICBMYWJlbDIgYXMgTGFiZWwsXG4gIFBvcnRhbDIgYXMgUG9ydGFsLFxuICBSYWRpb0dyb3VwMiBhcyBSYWRpb0dyb3VwLFxuICBSYWRpb0l0ZW0yIGFzIFJhZGlvSXRlbSxcbiAgUm9vdDIgYXMgUm9vdCxcbiAgU2VwYXJhdG9yMiBhcyBTZXBhcmF0b3IsXG4gIFN1YjIgYXMgU3ViLFxuICBTdWJDb250ZW50MiBhcyBTdWJDb250ZW50LFxuICBTdWJUcmlnZ2VyMiBhcyBTdWJUcmlnZ2VyLFxuICBUcmlnZ2VyLFxuICBjcmVhdGVEcm9wZG93bk1lbnVTY29wZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9mb2N1cy1ndWFyZHMvc3JjL0ZvY3VzR3VhcmRzLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG52YXIgY291bnQgPSAwO1xuZnVuY3Rpb24gRm9jdXNHdWFyZHMocHJvcHMpIHtcbiAgdXNlRm9jdXNHdWFyZHMoKTtcbiAgcmV0dXJuIHByb3BzLmNoaWxkcmVuO1xufVxuZnVuY3Rpb24gdXNlRm9jdXNHdWFyZHMoKSB7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZWRnZUd1YXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1yYWRpeC1mb2N1cy1ndWFyZF1cIik7XG4gICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsIGVkZ2VHdWFyZHNbMF0gPz8gY3JlYXRlRm9jdXNHdWFyZCgpKTtcbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcImJlZm9yZWVuZFwiLCBlZGdlR3VhcmRzWzFdID8/IGNyZWF0ZUZvY3VzR3VhcmQoKSk7XG4gICAgY291bnQrKztcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1yYWRpeC1mb2N1cy1ndWFyZF1cIikuZm9yRWFjaCgobm9kZSkgPT4gbm9kZS5yZW1vdmUoKSk7XG4gICAgICB9XG4gICAgICBjb3VudC0tO1xuICAgIH07XG4gIH0sIFtdKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZvY3VzR3VhcmQoKSB7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXJhZGl4LWZvY3VzLWd1YXJkXCIsIFwiXCIpO1xuICBlbGVtZW50LnRhYkluZGV4ID0gMDtcbiAgZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gXCJvdXRsaW5lOiBub25lOyBvcGFjaXR5OiAwOyBwb3NpdGlvbjogZml4ZWQ7IHBvaW50ZXItZXZlbnRzOiBub25lXCI7XG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIFJvb3QgPSBGb2N1c0d1YXJkcztcbmV4cG9ydCB7XG4gIEZvY3VzR3VhcmRzLFxuICBSb290LFxuICB1c2VGb2N1c0d1YXJkc1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9mb2N1cy1zY29wZS9zcmMvRm9jdXNTY29wZS50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZWRSZWZzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnNcIjtcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJpbWl0aXZlXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZlwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgQVVUT0ZPQ1VTX09OX01PVU5UID0gXCJmb2N1c1Njb3BlLmF1dG9Gb2N1c09uTW91bnRcIjtcbnZhciBBVVRPRk9DVVNfT05fVU5NT1VOVCA9IFwiZm9jdXNTY29wZS5hdXRvRm9jdXNPblVubW91bnRcIjtcbnZhciBFVkVOVF9PUFRJT05TID0geyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSB9O1xudmFyIEZPQ1VTX1NDT1BFX05BTUUgPSBcIkZvY3VzU2NvcGVcIjtcbnZhciBGb2N1c1Njb3BlID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgbG9vcCA9IGZhbHNlLFxuICAgIHRyYXBwZWQgPSBmYWxzZSxcbiAgICBvbk1vdW50QXV0b0ZvY3VzOiBvbk1vdW50QXV0b0ZvY3VzUHJvcCxcbiAgICBvblVubW91bnRBdXRvRm9jdXM6IG9uVW5tb3VudEF1dG9Gb2N1c1Byb3AsXG4gICAgLi4uc2NvcGVQcm9wc1xuICB9ID0gcHJvcHM7XG4gIGNvbnN0IFtjb250YWluZXIsIHNldENvbnRhaW5lcl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3Qgb25Nb3VudEF1dG9Gb2N1cyA9IHVzZUNhbGxiYWNrUmVmKG9uTW91bnRBdXRvRm9jdXNQcm9wKTtcbiAgY29uc3Qgb25Vbm1vdW50QXV0b0ZvY3VzID0gdXNlQ2FsbGJhY2tSZWYob25Vbm1vdW50QXV0b0ZvY3VzUHJvcCk7XG4gIGNvbnN0IGxhc3RGb2N1c2VkRWxlbWVudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgKG5vZGUpID0+IHNldENvbnRhaW5lcihub2RlKSk7XG4gIGNvbnN0IGZvY3VzU2NvcGUgPSBSZWFjdC51c2VSZWYoe1xuICAgIHBhdXNlZDogZmFsc2UsXG4gICAgcGF1c2UoKSB7XG4gICAgICB0aGlzLnBhdXNlZCA9IHRydWU7XG4gICAgfSxcbiAgICByZXN1bWUoKSB7XG4gICAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSkuY3VycmVudDtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHJhcHBlZCkge1xuICAgICAgbGV0IGhhbmRsZUZvY3VzSW4yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaWYgKGZvY3VzU2NvcGUucGF1c2VkIHx8ICFjb250YWluZXIpIHJldHVybjtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICBpZiAoY29udGFpbmVyLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICBsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCA9IHRhcmdldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb2N1cyhsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCwgeyBzZWxlY3Q6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGhhbmRsZUZvY3VzT3V0MiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGlmIChmb2N1c1Njb3BlLnBhdXNlZCB8fCAhY29udGFpbmVyKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAgICAgICBpZiAocmVsYXRlZFRhcmdldCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5jb250YWlucyhyZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgICAgIGZvY3VzKGxhc3RGb2N1c2VkRWxlbWVudFJlZi5jdXJyZW50LCB7IHNlbGVjdDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSwgaGFuZGxlTXV0YXRpb25zMiA9IGZ1bmN0aW9uKG11dGF0aW9ucykge1xuICAgICAgICBjb25zdCBmb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChmb2N1c2VkRWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSkgcmV0dXJuO1xuICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucykge1xuICAgICAgICAgIGlmIChtdXRhdGlvbi5yZW1vdmVkTm9kZXMubGVuZ3RoID4gMCkgZm9jdXMoY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBoYW5kbGVGb2N1c0luID0gaGFuZGxlRm9jdXNJbjIsIGhhbmRsZUZvY3VzT3V0ID0gaGFuZGxlRm9jdXNPdXQyLCBoYW5kbGVNdXRhdGlvbnMgPSBoYW5kbGVNdXRhdGlvbnMyO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgaGFuZGxlRm9jdXNJbjIpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIGhhbmRsZUZvY3VzT3V0Mik7XG4gICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoaGFuZGxlTXV0YXRpb25zMik7XG4gICAgICBpZiAoY29udGFpbmVyKSBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIGhhbmRsZUZvY3VzSW4yKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIGhhbmRsZUZvY3VzT3V0Mik7XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFt0cmFwcGVkLCBjb250YWluZXIsIGZvY3VzU2NvcGUucGF1c2VkXSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgZm9jdXNTY29wZXNTdGFjay5hZGQoZm9jdXNTY29wZSk7XG4gICAgICBjb25zdCBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgY29uc3QgaGFzRm9jdXNlZENhbmRpZGF0ZSA9IGNvbnRhaW5lci5jb250YWlucyhwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpO1xuICAgICAgaWYgKCFoYXNGb2N1c2VkQ2FuZGlkYXRlKSB7XG4gICAgICAgIGNvbnN0IG1vdW50RXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoQVVUT0ZPQ1VTX09OX01PVU5ULCBFVkVOVF9PUFRJT05TKTtcbiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoQVVUT0ZPQ1VTX09OX01PVU5ULCBvbk1vdW50QXV0b0ZvY3VzKTtcbiAgICAgICAgY29udGFpbmVyLmRpc3BhdGNoRXZlbnQobW91bnRFdmVudCk7XG4gICAgICAgIGlmICghbW91bnRFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgZm9jdXNGaXJzdChyZW1vdmVMaW5rcyhnZXRUYWJiYWJsZUNhbmRpZGF0ZXMoY29udGFpbmVyKSksIHsgc2VsZWN0OiB0cnVlIH0pO1xuICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGZvY3VzKGNvbnRhaW5lcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihBVVRPRk9DVVNfT05fTU9VTlQsIG9uTW91bnRBdXRvRm9jdXMpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB1bm1vdW50RXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoQVVUT0ZPQ1VTX09OX1VOTU9VTlQsIEVWRU5UX09QVElPTlMpO1xuICAgICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKEFVVE9GT0NVU19PTl9VTk1PVU5ULCBvblVubW91bnRBdXRvRm9jdXMpO1xuICAgICAgICAgIGNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KHVubW91bnRFdmVudCk7XG4gICAgICAgICAgaWYgKCF1bm1vdW50RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgZm9jdXMocHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID8/IGRvY3VtZW50LmJvZHksIHsgc2VsZWN0OiB0cnVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihBVVRPRk9DVVNfT05fVU5NT1VOVCwgb25Vbm1vdW50QXV0b0ZvY3VzKTtcbiAgICAgICAgICBmb2N1c1Njb3Blc1N0YWNrLnJlbW92ZShmb2N1c1Njb3BlKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2NvbnRhaW5lciwgb25Nb3VudEF1dG9Gb2N1cywgb25Vbm1vdW50QXV0b0ZvY3VzLCBmb2N1c1Njb3BlXSk7XG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGlmICghbG9vcCAmJiAhdHJhcHBlZCkgcmV0dXJuO1xuICAgICAgaWYgKGZvY3VzU2NvcGUucGF1c2VkKSByZXR1cm47XG4gICAgICBjb25zdCBpc1RhYktleSA9IGV2ZW50LmtleSA9PT0gXCJUYWJcIiAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5O1xuICAgICAgY29uc3QgZm9jdXNlZEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgaWYgKGlzVGFiS2V5ICYmIGZvY3VzZWRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lcjIgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgICBjb25zdCBbZmlyc3QsIGxhc3RdID0gZ2V0VGFiYmFibGVFZGdlcyhjb250YWluZXIyKTtcbiAgICAgICAgY29uc3QgaGFzVGFiYmFibGVFbGVtZW50c0luc2lkZSA9IGZpcnN0ICYmIGxhc3Q7XG4gICAgICAgIGlmICghaGFzVGFiYmFibGVFbGVtZW50c0luc2lkZSkge1xuICAgICAgICAgIGlmIChmb2N1c2VkRWxlbWVudCA9PT0gY29udGFpbmVyMikgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIGZvY3VzZWRFbGVtZW50ID09PSBsYXN0KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaWYgKGxvb3ApIGZvY3VzKGZpcnN0LCB7IHNlbGVjdDogdHJ1ZSB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIGZvY3VzZWRFbGVtZW50ID09PSBmaXJzdCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmIChsb29wKSBmb2N1cyhsYXN0LCB7IHNlbGVjdDogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtsb29wLCB0cmFwcGVkLCBmb2N1c1Njb3BlLnBhdXNlZF1cbiAgKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUHJpbWl0aXZlLmRpdiwgeyB0YWJJbmRleDogLTEsIC4uLnNjb3BlUHJvcHMsIHJlZjogY29tcG9zZWRSZWZzLCBvbktleURvd246IGhhbmRsZUtleURvd24gfSk7XG59KTtcbkZvY3VzU2NvcGUuZGlzcGxheU5hbWUgPSBGT0NVU19TQ09QRV9OQU1FO1xuZnVuY3Rpb24gZm9jdXNGaXJzdChjYW5kaWRhdGVzLCB7IHNlbGVjdCA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgZm9jdXMoY2FuZGlkYXRlLCB7IHNlbGVjdCB9KTtcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gcHJldmlvdXNseUZvY3VzZWRFbGVtZW50KSByZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRhYmJhYmxlRWRnZXMoY29udGFpbmVyKSB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBnZXRUYWJiYWJsZUNhbmRpZGF0ZXMoY29udGFpbmVyKTtcbiAgY29uc3QgZmlyc3QgPSBmaW5kVmlzaWJsZShjYW5kaWRhdGVzLCBjb250YWluZXIpO1xuICBjb25zdCBsYXN0ID0gZmluZFZpc2libGUoY2FuZGlkYXRlcy5yZXZlcnNlKCksIGNvbnRhaW5lcik7XG4gIHJldHVybiBbZmlyc3QsIGxhc3RdO1xufVxuZnVuY3Rpb24gZ2V0VGFiYmFibGVDYW5kaWRhdGVzKGNvbnRhaW5lcikge1xuICBjb25zdCBub2RlcyA9IFtdO1xuICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGNvbnRhaW5lciwgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQsIHtcbiAgICBhY2NlcHROb2RlOiAobm9kZSkgPT4ge1xuICAgICAgY29uc3QgaXNIaWRkZW5JbnB1dCA9IG5vZGUudGFnTmFtZSA9PT0gXCJJTlBVVFwiICYmIG5vZGUudHlwZSA9PT0gXCJoaWRkZW5cIjtcbiAgICAgIGlmIChub2RlLmRpc2FibGVkIHx8IG5vZGUuaGlkZGVuIHx8IGlzSGlkZGVuSW5wdXQpIHJldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9TS0lQO1xuICAgICAgcmV0dXJuIG5vZGUudGFiSW5kZXggPj0gMCA/IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVCA6IE5vZGVGaWx0ZXIuRklMVEVSX1NLSVA7XG4gICAgfVxuICB9KTtcbiAgd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKSBub2Rlcy5wdXNoKHdhbGtlci5jdXJyZW50Tm9kZSk7XG4gIHJldHVybiBub2Rlcztcbn1cbmZ1bmN0aW9uIGZpbmRWaXNpYmxlKGVsZW1lbnRzLCBjb250YWluZXIpIHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgaWYgKCFpc0hpZGRlbihlbGVtZW50LCB7IHVwVG86IGNvbnRhaW5lciB9KSkgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzSGlkZGVuKG5vZGUsIHsgdXBUbyB9KSB7XG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKG5vZGUpLnZpc2liaWxpdHkgPT09IFwiaGlkZGVuXCIpIHJldHVybiB0cnVlO1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmICh1cFRvICE9PSB2b2lkIDAgJiYgbm9kZSA9PT0gdXBUbykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKG5vZGUpLmRpc3BsYXkgPT09IFwibm9uZVwiKSByZXR1cm4gdHJ1ZTtcbiAgICBub2RlID0gbm9kZS5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzU2VsZWN0YWJsZUlucHV0KGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIFwic2VsZWN0XCIgaW4gZWxlbWVudDtcbn1cbmZ1bmN0aW9uIGZvY3VzKGVsZW1lbnQsIHsgc2VsZWN0ID0gZmFsc2UgfSA9IHt9KSB7XG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuZm9jdXMpIHtcbiAgICBjb25zdCBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIGVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgIGlmIChlbGVtZW50ICE9PSBwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgJiYgaXNTZWxlY3RhYmxlSW5wdXQoZWxlbWVudCkgJiYgc2VsZWN0KVxuICAgICAgZWxlbWVudC5zZWxlY3QoKTtcbiAgfVxufVxudmFyIGZvY3VzU2NvcGVzU3RhY2sgPSBjcmVhdGVGb2N1c1Njb3Blc1N0YWNrKCk7XG5mdW5jdGlvbiBjcmVhdGVGb2N1c1Njb3Blc1N0YWNrKCkge1xuICBsZXQgc3RhY2sgPSBbXTtcbiAgcmV0dXJuIHtcbiAgICBhZGQoZm9jdXNTY29wZSkge1xuICAgICAgY29uc3QgYWN0aXZlRm9jdXNTY29wZSA9IHN0YWNrWzBdO1xuICAgICAgaWYgKGZvY3VzU2NvcGUgIT09IGFjdGl2ZUZvY3VzU2NvcGUpIHtcbiAgICAgICAgYWN0aXZlRm9jdXNTY29wZT8ucGF1c2UoKTtcbiAgICAgIH1cbiAgICAgIHN0YWNrID0gYXJyYXlSZW1vdmUoc3RhY2ssIGZvY3VzU2NvcGUpO1xuICAgICAgc3RhY2sudW5zaGlmdChmb2N1c1Njb3BlKTtcbiAgICB9LFxuICAgIHJlbW92ZShmb2N1c1Njb3BlKSB7XG4gICAgICBzdGFjayA9IGFycmF5UmVtb3ZlKHN0YWNrLCBmb2N1c1Njb3BlKTtcbiAgICAgIHN0YWNrWzBdPy5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBhcnJheVJlbW92ZShhcnJheSwgaXRlbSkge1xuICBjb25zdCB1cGRhdGVkQXJyYXkgPSBbLi4uYXJyYXldO1xuICBjb25zdCBpbmRleCA9IHVwZGF0ZWRBcnJheS5pbmRleE9mKGl0ZW0pO1xuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgdXBkYXRlZEFycmF5LnNwbGljZShpbmRleCwgMSk7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZWRBcnJheTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUxpbmtzKGl0ZW1zKSB7XG4gIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udGFnTmFtZSAhPT0gXCJBXCIpO1xufVxudmFyIFJvb3QgPSBGb2N1c1Njb3BlO1xuZXhwb3J0IHtcbiAgRm9jdXNTY29wZSxcbiAgUm9vdFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L2lkL3NyYy9pZC50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtbGF5b3V0LWVmZmVjdFwiO1xudmFyIHVzZVJlYWN0SWQgPSBSZWFjdFtcInVzZUlkXCIudG9TdHJpbmcoKV0gfHwgKCgpID0+IHZvaWQgMCk7XG52YXIgY291bnQgPSAwO1xuZnVuY3Rpb24gdXNlSWQoZGV0ZXJtaW5pc3RpY0lkKSB7XG4gIGNvbnN0IFtpZCwgc2V0SWRdID0gUmVhY3QudXNlU3RhdGUodXNlUmVhY3RJZCgpKTtcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWRldGVybWluaXN0aWNJZCkgc2V0SWQoKHJlYWN0SWQpID0+IHJlYWN0SWQgPz8gU3RyaW5nKGNvdW50KyspKTtcbiAgfSwgW2RldGVybWluaXN0aWNJZF0pO1xuICByZXR1cm4gZGV0ZXJtaW5pc3RpY0lkIHx8IChpZCA/IGByYWRpeC0ke2lkfWAgOiBcIlwiKTtcbn1cbmV4cG9ydCB7XG4gIHVzZUlkXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L21lbnUvc3JjL01lbnUudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNvbXBvc2VFdmVudEhhbmRsZXJzIH0gZnJvbSBcIkByYWRpeC11aS9wcmltaXRpdmVcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbGxlY3Rpb24gfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbGxlY3Rpb25cIjtcbmltcG9ydCB7IHVzZUNvbXBvc2VkUmVmcywgY29tcG9zZVJlZnMgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbXBvc2UtcmVmc1wiO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dFNjb3BlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb250ZXh0XCI7XG5pbXBvcnQgeyB1c2VEaXJlY3Rpb24gfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWRpcmVjdGlvblwiO1xuaW1wb3J0IHsgRGlzbWlzc2FibGVMYXllciB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtZGlzbWlzc2FibGUtbGF5ZXJcIjtcbmltcG9ydCB7IHVzZUZvY3VzR3VhcmRzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1mb2N1cy1ndWFyZHNcIjtcbmltcG9ydCB7IEZvY3VzU2NvcGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWZvY3VzLXNjb3BlXCI7XG5pbXBvcnQgeyB1c2VJZCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtaWRcIjtcbmltcG9ydCAqIGFzIFBvcHBlclByaW1pdGl2ZSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXBvcHBlclwiO1xuaW1wb3J0IHsgY3JlYXRlUG9wcGVyU2NvcGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXBvcHBlclwiO1xuaW1wb3J0IHsgUG9ydGFsIGFzIFBvcnRhbFByaW1pdGl2ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcG9ydGFsXCI7XG5pbXBvcnQgeyBQcmVzZW5jZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtcHJlc2VuY2VcIjtcbmltcG9ydCB7IFByaW1pdGl2ZSwgZGlzcGF0Y2hEaXNjcmV0ZUN1c3RvbUV2ZW50IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wcmltaXRpdmVcIjtcbmltcG9ydCAqIGFzIFJvdmluZ0ZvY3VzR3JvdXAgZnJvbSBcIkByYWRpeC11aS9yZWFjdC1yb3ZpbmctZm9jdXNcIjtcbmltcG9ydCB7IGNyZWF0ZVJvdmluZ0ZvY3VzR3JvdXBTY29wZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3Qtcm92aW5nLWZvY3VzXCI7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1zbG90XCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZiB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWNhbGxiYWNrLXJlZlwiO1xuaW1wb3J0IHsgaGlkZU90aGVycyB9IGZyb20gXCJhcmlhLWhpZGRlblwiO1xuaW1wb3J0IHsgUmVtb3ZlU2Nyb2xsIH0gZnJvbSBcInJlYWN0LXJlbW92ZS1zY3JvbGxcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIFNFTEVDVElPTl9LRVlTID0gW1wiRW50ZXJcIiwgXCIgXCJdO1xudmFyIEZJUlNUX0tFWVMgPSBbXCJBcnJvd0Rvd25cIiwgXCJQYWdlVXBcIiwgXCJIb21lXCJdO1xudmFyIExBU1RfS0VZUyA9IFtcIkFycm93VXBcIiwgXCJQYWdlRG93blwiLCBcIkVuZFwiXTtcbnZhciBGSVJTVF9MQVNUX0tFWVMgPSBbLi4uRklSU1RfS0VZUywgLi4uTEFTVF9LRVlTXTtcbnZhciBTVUJfT1BFTl9LRVlTID0ge1xuICBsdHI6IFsuLi5TRUxFQ1RJT05fS0VZUywgXCJBcnJvd1JpZ2h0XCJdLFxuICBydGw6IFsuLi5TRUxFQ1RJT05fS0VZUywgXCJBcnJvd0xlZnRcIl1cbn07XG52YXIgU1VCX0NMT1NFX0tFWVMgPSB7XG4gIGx0cjogW1wiQXJyb3dMZWZ0XCJdLFxuICBydGw6IFtcIkFycm93UmlnaHRcIl1cbn07XG52YXIgTUVOVV9OQU1FID0gXCJNZW51XCI7XG52YXIgW0NvbGxlY3Rpb24sIHVzZUNvbGxlY3Rpb24sIGNyZWF0ZUNvbGxlY3Rpb25TY29wZV0gPSBjcmVhdGVDb2xsZWN0aW9uKE1FTlVfTkFNRSk7XG52YXIgW2NyZWF0ZU1lbnVDb250ZXh0LCBjcmVhdGVNZW51U2NvcGVdID0gY3JlYXRlQ29udGV4dFNjb3BlKE1FTlVfTkFNRSwgW1xuICBjcmVhdGVDb2xsZWN0aW9uU2NvcGUsXG4gIGNyZWF0ZVBvcHBlclNjb3BlLFxuICBjcmVhdGVSb3ZpbmdGb2N1c0dyb3VwU2NvcGVcbl0pO1xudmFyIHVzZVBvcHBlclNjb3BlID0gY3JlYXRlUG9wcGVyU2NvcGUoKTtcbnZhciB1c2VSb3ZpbmdGb2N1c0dyb3VwU2NvcGUgPSBjcmVhdGVSb3ZpbmdGb2N1c0dyb3VwU2NvcGUoKTtcbnZhciBbTWVudVByb3ZpZGVyLCB1c2VNZW51Q29udGV4dF0gPSBjcmVhdGVNZW51Q29udGV4dChNRU5VX05BTUUpO1xudmFyIFtNZW51Um9vdFByb3ZpZGVyLCB1c2VNZW51Um9vdENvbnRleHRdID0gY3JlYXRlTWVudUNvbnRleHQoTUVOVV9OQU1FKTtcbnZhciBNZW51ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZU1lbnUsIG9wZW4gPSBmYWxzZSwgY2hpbGRyZW4sIGRpciwgb25PcGVuQ2hhbmdlLCBtb2RhbCA9IHRydWUgfSA9IHByb3BzO1xuICBjb25zdCBwb3BwZXJTY29wZSA9IHVzZVBvcHBlclNjb3BlKF9fc2NvcGVNZW51KTtcbiAgY29uc3QgW2NvbnRlbnQsIHNldENvbnRlbnRdID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IGlzVXNpbmdLZXlib2FyZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGhhbmRsZU9wZW5DaGFuZ2UgPSB1c2VDYWxsYmFja1JlZihvbk9wZW5DaGFuZ2UpO1xuICBjb25zdCBkaXJlY3Rpb24gPSB1c2VEaXJlY3Rpb24oZGlyKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gKCkgPT4ge1xuICAgICAgaXNVc2luZ0tleWJvYXJkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZVBvaW50ZXIsIHsgY2FwdHVyZTogdHJ1ZSwgb25jZTogdHJ1ZSB9KTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBoYW5kbGVQb2ludGVyLCB7IGNhcHR1cmU6IHRydWUsIG9uY2U6IHRydWUgfSk7XG4gICAgfTtcbiAgICBjb25zdCBoYW5kbGVQb2ludGVyID0gKCkgPT4gaXNVc2luZ0tleWJvYXJkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBoYW5kbGVQb2ludGVyLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgaGFuZGxlUG9pbnRlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUG9wcGVyUHJpbWl0aXZlLlJvb3QsIHsgLi4ucG9wcGVyU2NvcGUsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgIE1lbnVQcm92aWRlcixcbiAgICB7XG4gICAgICBzY29wZTogX19zY29wZU1lbnUsXG4gICAgICBvcGVuLFxuICAgICAgb25PcGVuQ2hhbmdlOiBoYW5kbGVPcGVuQ2hhbmdlLFxuICAgICAgY29udGVudCxcbiAgICAgIG9uQ29udGVudENoYW5nZTogc2V0Q29udGVudCxcbiAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICBNZW51Um9vdFByb3ZpZGVyLFxuICAgICAgICB7XG4gICAgICAgICAgc2NvcGU6IF9fc2NvcGVNZW51LFxuICAgICAgICAgIG9uQ2xvc2U6IFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IGhhbmRsZU9wZW5DaGFuZ2UoZmFsc2UpLCBbaGFuZGxlT3BlbkNoYW5nZV0pLFxuICAgICAgICAgIGlzVXNpbmdLZXlib2FyZFJlZixcbiAgICAgICAgICBkaXI6IGRpcmVjdGlvbixcbiAgICAgICAgICBtb2RhbCxcbiAgICAgICAgICBjaGlsZHJlblxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICApIH0pO1xufTtcbk1lbnUuZGlzcGxheU5hbWUgPSBNRU5VX05BTUU7XG52YXIgQU5DSE9SX05BTUUgPSBcIk1lbnVBbmNob3JcIjtcbnZhciBNZW51QW5jaG9yID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVNZW51LCAuLi5hbmNob3JQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgcG9wcGVyU2NvcGUgPSB1c2VQb3BwZXJTY29wZShfX3Njb3BlTWVudSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUG9wcGVyUHJpbWl0aXZlLkFuY2hvciwgeyAuLi5wb3BwZXJTY29wZSwgLi4uYW5jaG9yUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9XG4pO1xuTWVudUFuY2hvci5kaXNwbGF5TmFtZSA9IEFOQ0hPUl9OQU1FO1xudmFyIFBPUlRBTF9OQU1FID0gXCJNZW51UG9ydGFsXCI7XG52YXIgW1BvcnRhbFByb3ZpZGVyLCB1c2VQb3J0YWxDb250ZXh0XSA9IGNyZWF0ZU1lbnVDb250ZXh0KFBPUlRBTF9OQU1FLCB7XG4gIGZvcmNlTW91bnQ6IHZvaWQgMFxufSk7XG52YXIgTWVudVBvcnRhbCA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVNZW51LCBmb3JjZU1vdW50LCBjaGlsZHJlbiwgY29udGFpbmVyIH0gPSBwcm9wcztcbiAgY29uc3QgY29udGV4dCA9IHVzZU1lbnVDb250ZXh0KFBPUlRBTF9OQU1FLCBfX3Njb3BlTWVudSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFBvcnRhbFByb3ZpZGVyLCB7IHNjb3BlOiBfX3Njb3BlTWVudSwgZm9yY2VNb3VudCwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goUHJlc2VuY2UsIHsgcHJlc2VudDogZm9yY2VNb3VudCB8fCBjb250ZXh0Lm9wZW4sIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFBvcnRhbFByaW1pdGl2ZSwgeyBhc0NoaWxkOiB0cnVlLCBjb250YWluZXIsIGNoaWxkcmVuIH0pIH0pIH0pO1xufTtcbk1lbnVQb3J0YWwuZGlzcGxheU5hbWUgPSBQT1JUQUxfTkFNRTtcbnZhciBDT05URU5UX05BTUUgPSBcIk1lbnVDb250ZW50XCI7XG52YXIgW01lbnVDb250ZW50UHJvdmlkZXIsIHVzZU1lbnVDb250ZW50Q29udGV4dF0gPSBjcmVhdGVNZW51Q29udGV4dChDT05URU5UX05BTUUpO1xudmFyIE1lbnVDb250ZW50ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCBwb3J0YWxDb250ZXh0ID0gdXNlUG9ydGFsQ29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCB7IGZvcmNlTW91bnQgPSBwb3J0YWxDb250ZXh0LmZvcmNlTW91bnQsIC4uLmNvbnRlbnRQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZU1lbnVDb250ZXh0KENPTlRFTlRfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gdXNlTWVudVJvb3RDb250ZXh0KENPTlRFTlRfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KENvbGxlY3Rpb24uUHJvdmlkZXIsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVNZW51LCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChQcmVzZW5jZSwgeyBwcmVzZW50OiBmb3JjZU1vdW50IHx8IGNvbnRleHQub3BlbiwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goQ29sbGVjdGlvbi5TbG90LCB7IHNjb3BlOiBwcm9wcy5fX3Njb3BlTWVudSwgY2hpbGRyZW46IHJvb3RDb250ZXh0Lm1vZGFsID8gLyogQF9fUFVSRV9fICovIGpzeChNZW51Um9vdENvbnRlbnRNb2RhbCwgeyAuLi5jb250ZW50UHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pIDogLyogQF9fUFVSRV9fICovIGpzeChNZW51Um9vdENvbnRlbnROb25Nb2RhbCwgeyAuLi5jb250ZW50UHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pIH0pIH0pIH0pO1xuICB9XG4pO1xudmFyIE1lbnVSb290Q29udGVudE1vZGFsID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlTWVudUNvbnRleHQoQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIHJlZik7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSByZWYuY3VycmVudDtcbiAgICAgIGlmIChjb250ZW50KSByZXR1cm4gaGlkZU90aGVycyhjb250ZW50KTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBNZW51Q29udGVudEltcGwsXG4gICAgICB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICByZWY6IGNvbXBvc2VkUmVmcyxcbiAgICAgICAgdHJhcEZvY3VzOiBjb250ZXh0Lm9wZW4sXG4gICAgICAgIGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czogY29udGV4dC5vcGVuLFxuICAgICAgICBkaXNhYmxlT3V0c2lkZVNjcm9sbDogdHJ1ZSxcbiAgICAgICAgb25Gb2N1c091dHNpZGU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKFxuICAgICAgICAgIHByb3BzLm9uRm9jdXNPdXRzaWRlLFxuICAgICAgICAgIChldmVudCkgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSxcbiAgICAgICAgICB7IGNoZWNrRm9yRGVmYXVsdFByZXZlbnRlZDogZmFsc2UgfVxuICAgICAgICApLFxuICAgICAgICBvbkRpc21pc3M6ICgpID0+IGNvbnRleHQub25PcGVuQ2hhbmdlKGZhbHNlKVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG52YXIgTWVudVJvb3RDb250ZW50Tm9uTW9kYWwgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VNZW51Q29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgTWVudUNvbnRlbnRJbXBsLFxuICAgIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICB0cmFwRm9jdXM6IGZhbHNlLFxuICAgICAgZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOiBmYWxzZSxcbiAgICAgIGRpc2FibGVPdXRzaWRlU2Nyb2xsOiBmYWxzZSxcbiAgICAgIG9uRGlzbWlzczogKCkgPT4gY29udGV4dC5vbk9wZW5DaGFuZ2UoZmFsc2UpXG4gICAgfVxuICApO1xufSk7XG52YXIgTWVudUNvbnRlbnRJbXBsID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBfX3Njb3BlTWVudSxcbiAgICAgIGxvb3AgPSBmYWxzZSxcbiAgICAgIHRyYXBGb2N1cyxcbiAgICAgIG9uT3BlbkF1dG9Gb2N1cyxcbiAgICAgIG9uQ2xvc2VBdXRvRm9jdXMsXG4gICAgICBkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHMsXG4gICAgICBvbkVudHJ5Rm9jdXMsXG4gICAgICBvbkVzY2FwZUtleURvd24sXG4gICAgICBvblBvaW50ZXJEb3duT3V0c2lkZSxcbiAgICAgIG9uRm9jdXNPdXRzaWRlLFxuICAgICAgb25JbnRlcmFjdE91dHNpZGUsXG4gICAgICBvbkRpc21pc3MsXG4gICAgICBkaXNhYmxlT3V0c2lkZVNjcm9sbCxcbiAgICAgIC4uLmNvbnRlbnRQcm9wc1xuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlTWVudUNvbnRleHQoQ09OVEVOVF9OQU1FLCBfX3Njb3BlTWVudSk7XG4gICAgY29uc3Qgcm9vdENvbnRleHQgPSB1c2VNZW51Um9vdENvbnRleHQoQ09OVEVOVF9OQU1FLCBfX3Njb3BlTWVudSk7XG4gICAgY29uc3QgcG9wcGVyU2NvcGUgPSB1c2VQb3BwZXJTY29wZShfX3Njb3BlTWVudSk7XG4gICAgY29uc3Qgcm92aW5nRm9jdXNHcm91cFNjb3BlID0gdXNlUm92aW5nRm9jdXNHcm91cFNjb3BlKF9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBnZXRJdGVtcyA9IHVzZUNvbGxlY3Rpb24oX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IFtjdXJyZW50SXRlbUlkLCBzZXRDdXJyZW50SXRlbUlkXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICAgIGNvbnN0IGNvbnRlbnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgY29udGVudFJlZiwgY29udGV4dC5vbkNvbnRlbnRDaGFuZ2UpO1xuICAgIGNvbnN0IHRpbWVyUmVmID0gUmVhY3QudXNlUmVmKDApO1xuICAgIGNvbnN0IHNlYXJjaFJlZiA9IFJlYWN0LnVzZVJlZihcIlwiKTtcbiAgICBjb25zdCBwb2ludGVyR3JhY2VUaW1lclJlZiA9IFJlYWN0LnVzZVJlZigwKTtcbiAgICBjb25zdCBwb2ludGVyR3JhY2VJbnRlbnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgcG9pbnRlckRpclJlZiA9IFJlYWN0LnVzZVJlZihcInJpZ2h0XCIpO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyWFJlZiA9IFJlYWN0LnVzZVJlZigwKTtcbiAgICBjb25zdCBTY3JvbGxMb2NrV3JhcHBlciA9IGRpc2FibGVPdXRzaWRlU2Nyb2xsID8gUmVtb3ZlU2Nyb2xsIDogUmVhY3QuRnJhZ21lbnQ7XG4gICAgY29uc3Qgc2Nyb2xsTG9ja1dyYXBwZXJQcm9wcyA9IGRpc2FibGVPdXRzaWRlU2Nyb2xsID8geyBhczogU2xvdCwgYWxsb3dQaW5jaFpvb206IHRydWUgfSA6IHZvaWQgMDtcbiAgICBjb25zdCBoYW5kbGVUeXBlYWhlYWRTZWFyY2ggPSAoa2V5KSA9PiB7XG4gICAgICBjb25zdCBzZWFyY2ggPSBzZWFyY2hSZWYuY3VycmVudCArIGtleTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0SXRlbXMoKS5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmRpc2FibGVkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGN1cnJlbnRNYXRjaCA9IGl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0ucmVmLmN1cnJlbnQgPT09IGN1cnJlbnRJdGVtKT8udGV4dFZhbHVlO1xuICAgICAgY29uc3QgdmFsdWVzID0gaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnRleHRWYWx1ZSk7XG4gICAgICBjb25zdCBuZXh0TWF0Y2ggPSBnZXROZXh0TWF0Y2godmFsdWVzLCBzZWFyY2gsIGN1cnJlbnRNYXRjaCk7XG4gICAgICBjb25zdCBuZXdJdGVtID0gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS50ZXh0VmFsdWUgPT09IG5leHRNYXRjaCk/LnJlZi5jdXJyZW50O1xuICAgICAgKGZ1bmN0aW9uIHVwZGF0ZVNlYXJjaCh2YWx1ZSkge1xuICAgICAgICBzZWFyY2hSZWYuY3VycmVudCA9IHZhbHVlO1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVyUmVmLmN1cnJlbnQpO1xuICAgICAgICBpZiAodmFsdWUgIT09IFwiXCIpIHRpbWVyUmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB1cGRhdGVTZWFyY2goXCJcIiksIDFlMyk7XG4gICAgICB9KShzZWFyY2gpO1xuICAgICAgaWYgKG5ld0l0ZW0pIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBuZXdJdGVtLmZvY3VzKCkpO1xuICAgICAgfVxuICAgIH07XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIHJldHVybiAoKSA9PiB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVyUmVmLmN1cnJlbnQpO1xuICAgIH0sIFtdKTtcbiAgICB1c2VGb2N1c0d1YXJkcygpO1xuICAgIGNvbnN0IGlzUG9pbnRlck1vdmluZ1RvU3VibWVudSA9IFJlYWN0LnVzZUNhbGxiYWNrKChldmVudCkgPT4ge1xuICAgICAgY29uc3QgaXNNb3ZpbmdUb3dhcmRzID0gcG9pbnRlckRpclJlZi5jdXJyZW50ID09PSBwb2ludGVyR3JhY2VJbnRlbnRSZWYuY3VycmVudD8uc2lkZTtcbiAgICAgIHJldHVybiBpc01vdmluZ1Rvd2FyZHMgJiYgaXNQb2ludGVySW5HcmFjZUFyZWEoZXZlbnQsIHBvaW50ZXJHcmFjZUludGVudFJlZi5jdXJyZW50Py5hcmVhKTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBNZW51Q29udGVudFByb3ZpZGVyLFxuICAgICAge1xuICAgICAgICBzY29wZTogX19zY29wZU1lbnUsXG4gICAgICAgIHNlYXJjaFJlZixcbiAgICAgICAgb25JdGVtRW50ZXI6IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgICAgICAgIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzUG9pbnRlck1vdmluZ1RvU3VibWVudShldmVudCkpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbaXNQb2ludGVyTW92aW5nVG9TdWJtZW51XVxuICAgICAgICApLFxuICAgICAgICBvbkl0ZW1MZWF2ZTogUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNQb2ludGVyTW92aW5nVG9TdWJtZW51KGV2ZW50KSkgcmV0dXJuO1xuICAgICAgICAgICAgY29udGVudFJlZi5jdXJyZW50Py5mb2N1cygpO1xuICAgICAgICAgICAgc2V0Q3VycmVudEl0ZW1JZChudWxsKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtpc1BvaW50ZXJNb3ZpbmdUb1N1Ym1lbnVdXG4gICAgICAgICksXG4gICAgICAgIG9uVHJpZ2dlckxlYXZlOiBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1BvaW50ZXJNb3ZpbmdUb1N1Ym1lbnUoZXZlbnQpKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW2lzUG9pbnRlck1vdmluZ1RvU3VibWVudV1cbiAgICAgICAgKSxcbiAgICAgICAgcG9pbnRlckdyYWNlVGltZXJSZWYsXG4gICAgICAgIG9uUG9pbnRlckdyYWNlSW50ZW50Q2hhbmdlOiBSZWFjdC51c2VDYWxsYmFjaygoaW50ZW50KSA9PiB7XG4gICAgICAgICAgcG9pbnRlckdyYWNlSW50ZW50UmVmLmN1cnJlbnQgPSBpbnRlbnQ7XG4gICAgICAgIH0sIFtdKSxcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goU2Nyb2xsTG9ja1dyYXBwZXIsIHsgLi4uc2Nyb2xsTG9ja1dyYXBwZXJQcm9wcywgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgRm9jdXNTY29wZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhc0NoaWxkOiB0cnVlLFxuICAgICAgICAgICAgdHJhcHBlZDogdHJhcEZvY3VzLFxuICAgICAgICAgICAgb25Nb3VudEF1dG9Gb2N1czogY29tcG9zZUV2ZW50SGFuZGxlcnMob25PcGVuQXV0b0ZvY3VzLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgY29udGVudFJlZi5jdXJyZW50Py5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG9uVW5tb3VudEF1dG9Gb2N1czogb25DbG9zZUF1dG9Gb2N1cyxcbiAgICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgICAgICBEaXNtaXNzYWJsZUxheWVyLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXNDaGlsZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHMsXG4gICAgICAgICAgICAgICAgb25Fc2NhcGVLZXlEb3duLFxuICAgICAgICAgICAgICAgIG9uUG9pbnRlckRvd25PdXRzaWRlLFxuICAgICAgICAgICAgICAgIG9uRm9jdXNPdXRzaWRlLFxuICAgICAgICAgICAgICAgIG9uSW50ZXJhY3RPdXRzaWRlLFxuICAgICAgICAgICAgICAgIG9uRGlzbWlzcyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICAgICAgICAgIFJvdmluZ0ZvY3VzR3JvdXAuUm9vdCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYXNDaGlsZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgLi4ucm92aW5nRm9jdXNHcm91cFNjb3BlLFxuICAgICAgICAgICAgICAgICAgICBkaXI6IHJvb3RDb250ZXh0LmRpcixcbiAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb246IFwidmVydGljYWxcIixcbiAgICAgICAgICAgICAgICAgICAgbG9vcCxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhYlN0b3BJZDogY3VycmVudEl0ZW1JZCxcbiAgICAgICAgICAgICAgICAgICAgb25DdXJyZW50VGFiU3RvcElkQ2hhbmdlOiBzZXRDdXJyZW50SXRlbUlkLFxuICAgICAgICAgICAgICAgICAgICBvbkVudHJ5Rm9jdXM6IGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uRW50cnlGb2N1cywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb290Q29udGV4dC5pc1VzaW5nS2V5Ym9hcmRSZWYuY3VycmVudCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHByZXZlbnRTY3JvbGxPbkVudHJ5Rm9jdXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgICAgICAgICAgICAgIFBvcHBlclByaW1pdGl2ZS5Db250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6IFwibWVudVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwidmVydGljYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0YS1zdGF0ZVwiOiBnZXRPcGVuU3RhdGUoY29udGV4dC5vcGVuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0YS1yYWRpeC1tZW51LWNvbnRlbnRcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogcm9vdENvbnRleHQuZGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucG9wcGVyU2NvcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jb250ZW50UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWY6IGNvbXBvc2VkUmVmcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IG91dGxpbmU6IFwibm9uZVwiLCAuLi5jb250ZW50UHJvcHMuc3R5bGUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMoY29udGVudFByb3BzLm9uS2V5RG93biwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNLZXlEb3duSW5zaWRlID0gdGFyZ2V0LmNsb3Nlc3QoXCJbZGF0YS1yYWRpeC1tZW51LWNvbnRlbnRdXCIpID09PSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc01vZGlmaWVyS2V5ID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQubWV0YUtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDaGFyYWN0ZXJLZXkgPSBldmVudC5rZXkubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNLZXlEb3duSW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIikgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTW9kaWZpZXJLZXkgJiYgaXNDaGFyYWN0ZXJLZXkpIGhhbmRsZVR5cGVhaGVhZFNlYXJjaChldmVudC5rZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBjb250ZW50UmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgIT09IGNvbnRlbnQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGSVJTVF9MQVNUX0tFWVMuaW5jbHVkZXMoZXZlbnQua2V5KSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IGdldEl0ZW1zKCkuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5kaXNhYmxlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZU5vZGVzID0gaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExBU1RfS0VZUy5pbmNsdWRlcyhldmVudC5rZXkpKSBjYW5kaWRhdGVOb2Rlcy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzRmlyc3QoY2FuZGlkYXRlTm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkJsdXI6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uQmx1ciwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXZlbnQuY3VycmVudFRhcmdldC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lclJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hSZWYuY3VycmVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25Qb2ludGVyTW92ZTogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLm9uUG9pbnRlck1vdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW5Nb3VzZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRlclhIYXNDaGFuZ2VkID0gbGFzdFBvaW50ZXJYUmVmLmN1cnJlbnQgIT09IGV2ZW50LmNsaWVudFg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQuY29udGFpbnModGFyZ2V0KSAmJiBwb2ludGVyWEhhc0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RpciA9IGV2ZW50LmNsaWVudFggPiBsYXN0UG9pbnRlclhSZWYuY3VycmVudCA/IFwicmlnaHRcIiA6IFwibGVmdFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlckRpclJlZi5jdXJyZW50ID0gbmV3RGlyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBvaW50ZXJYUmVmLmN1cnJlbnQgPSBldmVudC5jbGllbnRYO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICkgfSlcbiAgICAgIH1cbiAgICApO1xuICB9XG4pO1xuTWVudUNvbnRlbnQuZGlzcGxheU5hbWUgPSBDT05URU5UX05BTUU7XG52YXIgR1JPVVBfTkFNRSA9IFwiTWVudUdyb3VwXCI7XG52YXIgTWVudUdyb3VwID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVNZW51LCAuLi5ncm91cFByb3BzIH0gPSBwcm9wcztcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQcmltaXRpdmUuZGl2LCB7IHJvbGU6IFwiZ3JvdXBcIiwgLi4uZ3JvdXBQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH1cbik7XG5NZW51R3JvdXAuZGlzcGxheU5hbWUgPSBHUk9VUF9OQU1FO1xudmFyIExBQkVMX05BTUUgPSBcIk1lbnVMYWJlbFwiO1xudmFyIE1lbnVMYWJlbCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlTWVudSwgLi4ubGFiZWxQcm9wcyB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goUHJpbWl0aXZlLmRpdiwgeyAuLi5sYWJlbFByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KTtcbiAgfVxuKTtcbk1lbnVMYWJlbC5kaXNwbGF5TmFtZSA9IExBQkVMX05BTUU7XG52YXIgSVRFTV9OQU1FID0gXCJNZW51SXRlbVwiO1xudmFyIElURU1fU0VMRUNUID0gXCJtZW51Lml0ZW1TZWxlY3RcIjtcbnZhciBNZW51SXRlbSA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBkaXNhYmxlZCA9IGZhbHNlLCBvblNlbGVjdCwgLi4uaXRlbVByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3Qgcm9vdENvbnRleHQgPSB1c2VNZW51Um9vdENvbnRleHQoSVRFTV9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3QgY29udGVudENvbnRleHQgPSB1c2VNZW51Q29udGVudENvbnRleHQoSVRFTV9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3QgY29tcG9zZWRSZWZzID0gdXNlQ29tcG9zZWRSZWZzKGZvcndhcmRlZFJlZiwgcmVmKTtcbiAgICBjb25zdCBpc1BvaW50ZXJEb3duUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCBoYW5kbGVTZWxlY3QgPSAoKSA9PiB7XG4gICAgICBjb25zdCBtZW51SXRlbSA9IHJlZi5jdXJyZW50O1xuICAgICAgaWYgKCFkaXNhYmxlZCAmJiBtZW51SXRlbSkge1xuICAgICAgICBjb25zdCBpdGVtU2VsZWN0RXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoSVRFTV9TRUxFQ1QsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgbWVudUl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihJVEVNX1NFTEVDVCwgKGV2ZW50KSA9PiBvblNlbGVjdD8uKGV2ZW50KSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICBkaXNwYXRjaERpc2NyZXRlQ3VzdG9tRXZlbnQobWVudUl0ZW0sIGl0ZW1TZWxlY3RFdmVudCk7XG4gICAgICAgIGlmIChpdGVtU2VsZWN0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgIGlzUG9pbnRlckRvd25SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvb3RDb250ZXh0Lm9uQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBNZW51SXRlbUltcGwsXG4gICAgICB7XG4gICAgICAgIC4uLml0ZW1Qcm9wcyxcbiAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICBvbkNsaWNrOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkNsaWNrLCBoYW5kbGVTZWxlY3QpLFxuICAgICAgICBvblBvaW50ZXJEb3duOiAoZXZlbnQpID0+IHtcbiAgICAgICAgICBwcm9wcy5vblBvaW50ZXJEb3duPy4oZXZlbnQpO1xuICAgICAgICAgIGlzUG9pbnRlckRvd25SZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUG9pbnRlclVwOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vblBvaW50ZXJVcCwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKCFpc1BvaW50ZXJEb3duUmVmLmN1cnJlbnQpIGV2ZW50LmN1cnJlbnRUYXJnZXQ/LmNsaWNrKCk7XG4gICAgICAgIH0pLFxuICAgICAgICBvbktleURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uS2V5RG93biwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNUeXBpbmdBaGVhZCA9IGNvbnRlbnRDb250ZXh0LnNlYXJjaFJlZi5jdXJyZW50ICE9PSBcIlwiO1xuICAgICAgICAgIGlmIChkaXNhYmxlZCB8fCBpc1R5cGluZ0FoZWFkICYmIGV2ZW50LmtleSA9PT0gXCIgXCIpIHJldHVybjtcbiAgICAgICAgICBpZiAoU0VMRUNUSU9OX0tFWVMuaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5jbGljaygpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcbk1lbnVJdGVtLmRpc3BsYXlOYW1lID0gSVRFTV9OQU1FO1xudmFyIE1lbnVJdGVtSW1wbCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlTWVudSwgZGlzYWJsZWQgPSBmYWxzZSwgdGV4dFZhbHVlLCAuLi5pdGVtUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGNvbnRlbnRDb250ZXh0ID0gdXNlTWVudUNvbnRlbnRDb250ZXh0KElURU1fTkFNRSwgX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJvdmluZ0ZvY3VzR3JvdXBTY29wZSA9IHVzZVJvdmluZ0ZvY3VzR3JvdXBTY29wZShfX3Njb3BlTWVudSk7XG4gICAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIHJlZik7XG4gICAgY29uc3QgW2lzRm9jdXNlZCwgc2V0SXNGb2N1c2VkXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbdGV4dENvbnRlbnQsIHNldFRleHRDb250ZW50XSA9IFJlYWN0LnVzZVN0YXRlKFwiXCIpO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBtZW51SXRlbSA9IHJlZi5jdXJyZW50O1xuICAgICAgaWYgKG1lbnVJdGVtKSB7XG4gICAgICAgIHNldFRleHRDb250ZW50KChtZW51SXRlbS50ZXh0Q29udGVudCA/PyBcIlwiKS50cmltKCkpO1xuICAgICAgfVxuICAgIH0sIFtpdGVtUHJvcHMuY2hpbGRyZW5dKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIENvbGxlY3Rpb24uSXRlbVNsb3QsXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiBfX3Njb3BlTWVudSxcbiAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgIHRleHRWYWx1ZTogdGV4dFZhbHVlID8/IHRleHRDb250ZW50LFxuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChSb3ZpbmdGb2N1c0dyb3VwLkl0ZW0sIHsgYXNDaGlsZDogdHJ1ZSwgLi4ucm92aW5nRm9jdXNHcm91cFNjb3BlLCBmb2N1c2FibGU6ICFkaXNhYmxlZCwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgUHJpbWl0aXZlLmRpdixcbiAgICAgICAgICB7XG4gICAgICAgICAgICByb2xlOiBcIm1lbnVpdGVtXCIsXG4gICAgICAgICAgICBcImRhdGEtaGlnaGxpZ2h0ZWRcIjogaXNGb2N1c2VkID8gXCJcIiA6IHZvaWQgMCxcbiAgICAgICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiBkaXNhYmxlZCB8fCB2b2lkIDAsXG4gICAgICAgICAgICBcImRhdGEtZGlzYWJsZWRcIjogZGlzYWJsZWQgPyBcIlwiIDogdm9pZCAwLFxuICAgICAgICAgICAgLi4uaXRlbVByb3BzLFxuICAgICAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgICAgICBvblBvaW50ZXJNb3ZlOiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICAgICAgcHJvcHMub25Qb2ludGVyTW92ZSxcbiAgICAgICAgICAgICAgd2hlbk1vdXNlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgY29udGVudENvbnRleHQub25JdGVtTGVhdmUoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50Q29udGV4dC5vbkl0ZW1FbnRlcihldmVudCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBvblBvaW50ZXJMZWF2ZTogY29tcG9zZUV2ZW50SGFuZGxlcnMoXG4gICAgICAgICAgICAgIHByb3BzLm9uUG9pbnRlckxlYXZlLFxuICAgICAgICAgICAgICB3aGVuTW91c2UoKGV2ZW50KSA9PiBjb250ZW50Q29udGV4dC5vbkl0ZW1MZWF2ZShldmVudCkpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgb25Gb2N1czogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Gb2N1cywgKCkgPT4gc2V0SXNGb2N1c2VkKHRydWUpKSxcbiAgICAgICAgICAgIG9uQmx1cjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25CbHVyLCAoKSA9PiBzZXRJc0ZvY3VzZWQoZmFsc2UpKVxuICAgICAgICAgIH1cbiAgICAgICAgKSB9KVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG52YXIgQ0hFQ0tCT1hfSVRFTV9OQU1FID0gXCJNZW51Q2hlY2tib3hJdGVtXCI7XG52YXIgTWVudUNoZWNrYm94SXRlbSA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBjaGVja2VkID0gZmFsc2UsIG9uQ2hlY2tlZENoYW5nZSwgLi4uY2hlY2tib3hJdGVtUHJvcHMgfSA9IHByb3BzO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KEl0ZW1JbmRpY2F0b3JQcm92aWRlciwgeyBzY29wZTogcHJvcHMuX19zY29wZU1lbnUsIGNoZWNrZWQsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudUl0ZW0sXG4gICAgICB7XG4gICAgICAgIHJvbGU6IFwibWVudWl0ZW1jaGVja2JveFwiLFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiBpc0luZGV0ZXJtaW5hdGUoY2hlY2tlZCkgPyBcIm1peGVkXCIgOiBjaGVja2VkLFxuICAgICAgICAuLi5jaGVja2JveEl0ZW1Qcm9wcyxcbiAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICAgIFwiZGF0YS1zdGF0ZVwiOiBnZXRDaGVja2VkU3RhdGUoY2hlY2tlZCksXG4gICAgICAgIG9uU2VsZWN0OiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICBjaGVja2JveEl0ZW1Qcm9wcy5vblNlbGVjdCxcbiAgICAgICAgICAoKSA9PiBvbkNoZWNrZWRDaGFuZ2U/Lihpc0luZGV0ZXJtaW5hdGUoY2hlY2tlZCkgPyB0cnVlIDogIWNoZWNrZWQpLFxuICAgICAgICAgIHsgY2hlY2tGb3JEZWZhdWx0UHJldmVudGVkOiBmYWxzZSB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICApIH0pO1xuICB9XG4pO1xuTWVudUNoZWNrYm94SXRlbS5kaXNwbGF5TmFtZSA9IENIRUNLQk9YX0lURU1fTkFNRTtcbnZhciBSQURJT19HUk9VUF9OQU1FID0gXCJNZW51UmFkaW9Hcm91cFwiO1xudmFyIFtSYWRpb0dyb3VwUHJvdmlkZXIsIHVzZVJhZGlvR3JvdXBDb250ZXh0XSA9IGNyZWF0ZU1lbnVDb250ZXh0KFxuICBSQURJT19HUk9VUF9OQU1FLFxuICB7IHZhbHVlOiB2b2lkIDAsIG9uVmFsdWVDaGFuZ2U6ICgpID0+IHtcbiAgfSB9XG4pO1xudmFyIE1lbnVSYWRpb0dyb3VwID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IHZhbHVlLCBvblZhbHVlQ2hhbmdlLCAuLi5ncm91cFByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBoYW5kbGVWYWx1ZUNoYW5nZSA9IHVzZUNhbGxiYWNrUmVmKG9uVmFsdWVDaGFuZ2UpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFJhZGlvR3JvdXBQcm92aWRlciwgeyBzY29wZTogcHJvcHMuX19zY29wZU1lbnUsIHZhbHVlLCBvblZhbHVlQ2hhbmdlOiBoYW5kbGVWYWx1ZUNoYW5nZSwgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goTWVudUdyb3VwLCB7IC4uLmdyb3VwUHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pIH0pO1xuICB9XG4pO1xuTWVudVJhZGlvR3JvdXAuZGlzcGxheU5hbWUgPSBSQURJT19HUk9VUF9OQU1FO1xudmFyIFJBRElPX0lURU1fTkFNRSA9IFwiTWVudVJhZGlvSXRlbVwiO1xudmFyIE1lbnVSYWRpb0l0ZW0gPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgdmFsdWUsIC4uLnJhZGlvSXRlbVByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlUmFkaW9Hcm91cENvbnRleHQoUkFESU9fSVRFTV9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3QgY2hlY2tlZCA9IHZhbHVlID09PSBjb250ZXh0LnZhbHVlO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KEl0ZW1JbmRpY2F0b3JQcm92aWRlciwgeyBzY29wZTogcHJvcHMuX19zY29wZU1lbnUsIGNoZWNrZWQsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgTWVudUl0ZW0sXG4gICAgICB7XG4gICAgICAgIHJvbGU6IFwibWVudWl0ZW1yYWRpb1wiLFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiBjaGVja2VkLFxuICAgICAgICAuLi5yYWRpb0l0ZW1Qcm9wcyxcbiAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICAgIFwiZGF0YS1zdGF0ZVwiOiBnZXRDaGVja2VkU3RhdGUoY2hlY2tlZCksXG4gICAgICAgIG9uU2VsZWN0OiBjb21wb3NlRXZlbnRIYW5kbGVycyhcbiAgICAgICAgICByYWRpb0l0ZW1Qcm9wcy5vblNlbGVjdCxcbiAgICAgICAgICAoKSA9PiBjb250ZXh0Lm9uVmFsdWVDaGFuZ2U/Lih2YWx1ZSksXG4gICAgICAgICAgeyBjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQ6IGZhbHNlIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgICkgfSk7XG4gIH1cbik7XG5NZW51UmFkaW9JdGVtLmRpc3BsYXlOYW1lID0gUkFESU9fSVRFTV9OQU1FO1xudmFyIElURU1fSU5ESUNBVE9SX05BTUUgPSBcIk1lbnVJdGVtSW5kaWNhdG9yXCI7XG52YXIgW0l0ZW1JbmRpY2F0b3JQcm92aWRlciwgdXNlSXRlbUluZGljYXRvckNvbnRleHRdID0gY3JlYXRlTWVudUNvbnRleHQoXG4gIElURU1fSU5ESUNBVE9SX05BTUUsXG4gIHsgY2hlY2tlZDogZmFsc2UgfVxuKTtcbnZhciBNZW51SXRlbUluZGljYXRvciA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgeyBfX3Njb3BlTWVudSwgZm9yY2VNb3VudCwgLi4uaXRlbUluZGljYXRvclByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBpbmRpY2F0b3JDb250ZXh0ID0gdXNlSXRlbUluZGljYXRvckNvbnRleHQoSVRFTV9JTkRJQ0FUT1JfTkFNRSwgX19zY29wZU1lbnUpO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgUHJlc2VuY2UsXG4gICAgICB7XG4gICAgICAgIHByZXNlbnQ6IGZvcmNlTW91bnQgfHwgaXNJbmRldGVybWluYXRlKGluZGljYXRvckNvbnRleHQuY2hlY2tlZCkgfHwgaW5kaWNhdG9yQ29udGV4dC5jaGVja2VkID09PSB0cnVlLFxuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICBQcmltaXRpdmUuc3BhbixcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5pdGVtSW5kaWNhdG9yUHJvcHMsXG4gICAgICAgICAgICByZWY6IGZvcndhcmRlZFJlZixcbiAgICAgICAgICAgIFwiZGF0YS1zdGF0ZVwiOiBnZXRDaGVja2VkU3RhdGUoaW5kaWNhdG9yQ29udGV4dC5jaGVja2VkKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5NZW51SXRlbUluZGljYXRvci5kaXNwbGF5TmFtZSA9IElURU1fSU5ESUNBVE9SX05BTUU7XG52YXIgU0VQQVJBVE9SX05BTUUgPSBcIk1lbnVTZXBhcmF0b3JcIjtcbnZhciBNZW51U2VwYXJhdG9yID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVNZW51LCAuLi5zZXBhcmF0b3JQcm9wcyB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICBQcmltaXRpdmUuZGl2LFxuICAgICAge1xuICAgICAgICByb2xlOiBcInNlcGFyYXRvclwiLFxuICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCIsXG4gICAgICAgIC4uLnNlcGFyYXRvclByb3BzLFxuICAgICAgICByZWY6IGZvcndhcmRlZFJlZlxuICAgICAgfVxuICAgICk7XG4gIH1cbik7XG5NZW51U2VwYXJhdG9yLmRpc3BsYXlOYW1lID0gU0VQQVJBVE9SX05BTUU7XG52YXIgQVJST1dfTkFNRSA9IFwiTWVudUFycm93XCI7XG52YXIgTWVudUFycm93ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVNZW51LCAuLi5hcnJvd1Byb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBwb3BwZXJTY29wZSA9IHVzZVBvcHBlclNjb3BlKF9fc2NvcGVNZW51KTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQb3BwZXJQcmltaXRpdmUuQXJyb3csIHsgLi4ucG9wcGVyU2NvcGUsIC4uLmFycm93UHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmIH0pO1xuICB9XG4pO1xuTWVudUFycm93LmRpc3BsYXlOYW1lID0gQVJST1dfTkFNRTtcbnZhciBTVUJfTkFNRSA9IFwiTWVudVN1YlwiO1xudmFyIFtNZW51U3ViUHJvdmlkZXIsIHVzZU1lbnVTdWJDb250ZXh0XSA9IGNyZWF0ZU1lbnVDb250ZXh0KFNVQl9OQU1FKTtcbnZhciBNZW51U3ViID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHsgX19zY29wZU1lbnUsIGNoaWxkcmVuLCBvcGVuID0gZmFsc2UsIG9uT3BlbkNoYW5nZSB9ID0gcHJvcHM7XG4gIGNvbnN0IHBhcmVudE1lbnVDb250ZXh0ID0gdXNlTWVudUNvbnRleHQoU1VCX05BTUUsIF9fc2NvcGVNZW51KTtcbiAgY29uc3QgcG9wcGVyU2NvcGUgPSB1c2VQb3BwZXJTY29wZShfX3Njb3BlTWVudSk7XG4gIGNvbnN0IFt0cmlnZ2VyLCBzZXRUcmlnZ2VyXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbY29udGVudCwgc2V0Q29udGVudF0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgaGFuZGxlT3BlbkNoYW5nZSA9IHVzZUNhbGxiYWNrUmVmKG9uT3BlbkNoYW5nZSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHBhcmVudE1lbnVDb250ZXh0Lm9wZW4gPT09IGZhbHNlKSBoYW5kbGVPcGVuQ2hhbmdlKGZhbHNlKTtcbiAgICByZXR1cm4gKCkgPT4gaGFuZGxlT3BlbkNoYW5nZShmYWxzZSk7XG4gIH0sIFtwYXJlbnRNZW51Q29udGV4dC5vcGVuLCBoYW5kbGVPcGVuQ2hhbmdlXSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFBvcHBlclByaW1pdGl2ZS5Sb290LCB7IC4uLnBvcHBlclNjb3BlLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICBNZW51UHJvdmlkZXIsXG4gICAge1xuICAgICAgc2NvcGU6IF9fc2NvcGVNZW51LFxuICAgICAgb3BlbixcbiAgICAgIG9uT3BlbkNoYW5nZTogaGFuZGxlT3BlbkNoYW5nZSxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBvbkNvbnRlbnRDaGFuZ2U6IHNldENvbnRlbnQsXG4gICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgTWVudVN1YlByb3ZpZGVyLFxuICAgICAgICB7XG4gICAgICAgICAgc2NvcGU6IF9fc2NvcGVNZW51LFxuICAgICAgICAgIGNvbnRlbnRJZDogdXNlSWQoKSxcbiAgICAgICAgICB0cmlnZ2VySWQ6IHVzZUlkKCksXG4gICAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgICBvblRyaWdnZXJDaGFuZ2U6IHNldFRyaWdnZXIsXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgKSB9KTtcbn07XG5NZW51U3ViLmRpc3BsYXlOYW1lID0gU1VCX05BTUU7XG52YXIgU1VCX1RSSUdHRVJfTkFNRSA9IFwiTWVudVN1YlRyaWdnZXJcIjtcbnZhciBNZW51U3ViVHJpZ2dlciA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZU1lbnVDb250ZXh0KFNVQl9UUklHR0VSX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCByb290Q29udGV4dCA9IHVzZU1lbnVSb290Q29udGV4dChTVUJfVFJJR0dFUl9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3Qgc3ViQ29udGV4dCA9IHVzZU1lbnVTdWJDb250ZXh0KFNVQl9UUklHR0VSX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IHVzZU1lbnVDb250ZW50Q29udGV4dChTVUJfVFJJR0dFUl9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3Qgb3BlblRpbWVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHsgcG9pbnRlckdyYWNlVGltZXJSZWYsIG9uUG9pbnRlckdyYWNlSW50ZW50Q2hhbmdlIH0gPSBjb250ZW50Q29udGV4dDtcbiAgICBjb25zdCBzY29wZSA9IHsgX19zY29wZU1lbnU6IHByb3BzLl9fc2NvcGVNZW51IH07XG4gICAgY29uc3QgY2xlYXJPcGVuVGltZXIgPSBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBpZiAob3BlblRpbWVyUmVmLmN1cnJlbnQpIHdpbmRvdy5jbGVhclRpbWVvdXQob3BlblRpbWVyUmVmLmN1cnJlbnQpO1xuICAgICAgb3BlblRpbWVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH0sIFtdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4gY2xlYXJPcGVuVGltZXIsIFtjbGVhck9wZW5UaW1lcl0pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBwb2ludGVyR3JhY2VUaW1lciA9IHBvaW50ZXJHcmFjZVRpbWVyUmVmLmN1cnJlbnQ7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHBvaW50ZXJHcmFjZVRpbWVyKTtcbiAgICAgICAgb25Qb2ludGVyR3JhY2VJbnRlbnRDaGFuZ2UobnVsbCk7XG4gICAgICB9O1xuICAgIH0sIFtwb2ludGVyR3JhY2VUaW1lclJlZiwgb25Qb2ludGVyR3JhY2VJbnRlbnRDaGFuZ2VdKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChNZW51QW5jaG9yLCB7IGFzQ2hpbGQ6IHRydWUsIC4uLnNjb3BlLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIE1lbnVJdGVtSW1wbCxcbiAgICAgIHtcbiAgICAgICAgaWQ6IHN1YkNvbnRleHQudHJpZ2dlcklkLFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJtZW51XCIsXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBjb250ZXh0Lm9wZW4sXG4gICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiBzdWJDb250ZXh0LmNvbnRlbnRJZCxcbiAgICAgICAgXCJkYXRhLXN0YXRlXCI6IGdldE9wZW5TdGF0ZShjb250ZXh0Lm9wZW4pLFxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgcmVmOiBjb21wb3NlUmVmcyhmb3J3YXJkZWRSZWYsIHN1YkNvbnRleHQub25UcmlnZ2VyQ2hhbmdlKSxcbiAgICAgICAgb25DbGljazogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgcHJvcHMub25DbGljaz8uKGV2ZW50KTtcbiAgICAgICAgICBpZiAocHJvcHMuZGlzYWJsZWQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgICAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuZm9jdXMoKTtcbiAgICAgICAgICBpZiAoIWNvbnRleHQub3BlbikgY29udGV4dC5vbk9wZW5DaGFuZ2UodHJ1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUG9pbnRlck1vdmU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKFxuICAgICAgICAgIHByb3BzLm9uUG9pbnRlck1vdmUsXG4gICAgICAgICAgd2hlbk1vdXNlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29udGVudENvbnRleHQub25JdGVtRW50ZXIoZXZlbnQpO1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmICghcHJvcHMuZGlzYWJsZWQgJiYgIWNvbnRleHQub3BlbiAmJiAhb3BlblRpbWVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgY29udGVudENvbnRleHQub25Qb2ludGVyR3JhY2VJbnRlbnRDaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICAgIG9wZW5UaW1lclJlZi5jdXJyZW50ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25PcGVuQ2hhbmdlKHRydWUpO1xuICAgICAgICAgICAgICAgIGNsZWFyT3BlblRpbWVyKCk7XG4gICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKSxcbiAgICAgICAgb25Qb2ludGVyTGVhdmU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKFxuICAgICAgICAgIHByb3BzLm9uUG9pbnRlckxlYXZlLFxuICAgICAgICAgIHdoZW5Nb3VzZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNsZWFyT3BlblRpbWVyKCk7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50UmVjdCA9IGNvbnRleHQuY29udGVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBpZiAoY29udGVudFJlY3QpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2lkZSA9IGNvbnRleHQuY29udGVudD8uZGF0YXNldC5zaWRlO1xuICAgICAgICAgICAgICBjb25zdCByaWdodFNpZGUgPSBzaWRlID09PSBcInJpZ2h0XCI7XG4gICAgICAgICAgICAgIGNvbnN0IGJsZWVkID0gcmlnaHRTaWRlID8gLTUgOiA1O1xuICAgICAgICAgICAgICBjb25zdCBjb250ZW50TmVhckVkZ2UgPSBjb250ZW50UmVjdFtyaWdodFNpZGUgPyBcImxlZnRcIiA6IFwicmlnaHRcIl07XG4gICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRGYXJFZGdlID0gY29udGVudFJlY3RbcmlnaHRTaWRlID8gXCJyaWdodFwiIDogXCJsZWZ0XCJdO1xuICAgICAgICAgICAgICBjb250ZW50Q29udGV4dC5vblBvaW50ZXJHcmFjZUludGVudENoYW5nZSh7XG4gICAgICAgICAgICAgICAgYXJlYTogW1xuICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgYSBibGVlZCBvbiBjbGllbnRYIHRvIGVuc3VyZSB0aGF0IG91ciBleGl0IHBvaW50IGlzXG4gICAgICAgICAgICAgICAgICAvLyBjb25zaXN0ZW50bHkgd2l0aGluIHBvbHlnb24gYm91bmRzXG4gICAgICAgICAgICAgICAgICB7IHg6IGV2ZW50LmNsaWVudFggKyBibGVlZCwgeTogZXZlbnQuY2xpZW50WSB9LFxuICAgICAgICAgICAgICAgICAgeyB4OiBjb250ZW50TmVhckVkZ2UsIHk6IGNvbnRlbnRSZWN0LnRvcCB9LFxuICAgICAgICAgICAgICAgICAgeyB4OiBjb250ZW50RmFyRWRnZSwgeTogY29udGVudFJlY3QudG9wIH0sXG4gICAgICAgICAgICAgICAgICB7IHg6IGNvbnRlbnRGYXJFZGdlLCB5OiBjb250ZW50UmVjdC5ib3R0b20gfSxcbiAgICAgICAgICAgICAgICAgIHsgeDogY29udGVudE5lYXJFZGdlLCB5OiBjb250ZW50UmVjdC5ib3R0b20gfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgc2lkZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChwb2ludGVyR3JhY2VUaW1lclJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgcG9pbnRlckdyYWNlVGltZXJSZWYuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICgpID0+IGNvbnRlbnRDb250ZXh0Lm9uUG9pbnRlckdyYWNlSW50ZW50Q2hhbmdlKG51bGwpLFxuICAgICAgICAgICAgICAgIDMwMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29udGVudENvbnRleHQub25UcmlnZ2VyTGVhdmUoZXZlbnQpO1xuICAgICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb250ZW50Q29udGV4dC5vblBvaW50ZXJHcmFjZUludGVudENoYW5nZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgICBvbktleURvd246IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uS2V5RG93biwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNUeXBpbmdBaGVhZCA9IGNvbnRlbnRDb250ZXh0LnNlYXJjaFJlZi5jdXJyZW50ICE9PSBcIlwiO1xuICAgICAgICAgIGlmIChwcm9wcy5kaXNhYmxlZCB8fCBpc1R5cGluZ0FoZWFkICYmIGV2ZW50LmtleSA9PT0gXCIgXCIpIHJldHVybjtcbiAgICAgICAgICBpZiAoU1VCX09QRU5fS0VZU1tyb290Q29udGV4dC5kaXJdLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgICAgICAgIGNvbnRleHQub25PcGVuQ2hhbmdlKHRydWUpO1xuICAgICAgICAgICAgY29udGV4dC5jb250ZW50Py5mb2N1cygpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgKSB9KTtcbiAgfVxuKTtcbk1lbnVTdWJUcmlnZ2VyLmRpc3BsYXlOYW1lID0gU1VCX1RSSUdHRVJfTkFNRTtcbnZhciBTVUJfQ09OVEVOVF9OQU1FID0gXCJNZW51U3ViQ29udGVudFwiO1xudmFyIE1lbnVTdWJDb250ZW50ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCBwb3J0YWxDb250ZXh0ID0gdXNlUG9ydGFsQ29udGV4dChDT05URU5UX05BTUUsIHByb3BzLl9fc2NvcGVNZW51KTtcbiAgICBjb25zdCB7IGZvcmNlTW91bnQgPSBwb3J0YWxDb250ZXh0LmZvcmNlTW91bnQsIC4uLnN1YkNvbnRlbnRQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZU1lbnVDb250ZXh0KENPTlRFTlRfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gdXNlTWVudVJvb3RDb250ZXh0KENPTlRFTlRfTkFNRSwgcHJvcHMuX19zY29wZU1lbnUpO1xuICAgIGNvbnN0IHN1YkNvbnRleHQgPSB1c2VNZW51U3ViQ29udGV4dChTVUJfQ09OVEVOVF9OQU1FLCBwcm9wcy5fX3Njb3BlTWVudSk7XG4gICAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIHJlZik7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goQ29sbGVjdGlvbi5Qcm92aWRlciwgeyBzY29wZTogcHJvcHMuX19zY29wZU1lbnUsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFByZXNlbmNlLCB7IHByZXNlbnQ6IGZvcmNlTW91bnQgfHwgY29udGV4dC5vcGVuLCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChDb2xsZWN0aW9uLlNsb3QsIHsgc2NvcGU6IHByb3BzLl9fc2NvcGVNZW51LCBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIE1lbnVDb250ZW50SW1wbCxcbiAgICAgIHtcbiAgICAgICAgaWQ6IHN1YkNvbnRleHQuY29udGVudElkLFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiBzdWJDb250ZXh0LnRyaWdnZXJJZCxcbiAgICAgICAgLi4uc3ViQ29udGVudFByb3BzLFxuICAgICAgICByZWY6IGNvbXBvc2VkUmVmcyxcbiAgICAgICAgYWxpZ246IFwic3RhcnRcIixcbiAgICAgICAgc2lkZTogcm9vdENvbnRleHQuZGlyID09PSBcInJ0bFwiID8gXCJsZWZ0XCIgOiBcInJpZ2h0XCIsXG4gICAgICAgIGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czogZmFsc2UsXG4gICAgICAgIGRpc2FibGVPdXRzaWRlU2Nyb2xsOiBmYWxzZSxcbiAgICAgICAgdHJhcEZvY3VzOiBmYWxzZSxcbiAgICAgICAgb25PcGVuQXV0b0ZvY3VzOiAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAocm9vdENvbnRleHQuaXNVc2luZ0tleWJvYXJkUmVmLmN1cnJlbnQpIHJlZi5jdXJyZW50Py5mb2N1cygpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2VBdXRvRm9jdXM6IChldmVudCkgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSxcbiAgICAgICAgb25Gb2N1c091dHNpZGU6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uRm9jdXNPdXRzaWRlLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBzdWJDb250ZXh0LnRyaWdnZXIpIGNvbnRleHQub25PcGVuQ2hhbmdlKGZhbHNlKTtcbiAgICAgICAgfSksXG4gICAgICAgIG9uRXNjYXBlS2V5RG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Fc2NhcGVLZXlEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICByb290Q29udGV4dC5vbkNsb3NlKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSksXG4gICAgICAgIG9uS2V5RG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25LZXlEb3duLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0tleURvd25JbnNpZGUgPSBldmVudC5jdXJyZW50VGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XG4gICAgICAgICAgY29uc3QgaXNDbG9zZUtleSA9IFNVQl9DTE9TRV9LRVlTW3Jvb3RDb250ZXh0LmRpcl0uaW5jbHVkZXMoZXZlbnQua2V5KTtcbiAgICAgICAgICBpZiAoaXNLZXlEb3duSW5zaWRlICYmIGlzQ2xvc2VLZXkpIHtcbiAgICAgICAgICAgIGNvbnRleHQub25PcGVuQ2hhbmdlKGZhbHNlKTtcbiAgICAgICAgICAgIHN1YkNvbnRleHQudHJpZ2dlcj8uZm9jdXMoKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICkgfSkgfSkgfSk7XG4gIH1cbik7XG5NZW51U3ViQ29udGVudC5kaXNwbGF5TmFtZSA9IFNVQl9DT05URU5UX05BTUU7XG5mdW5jdGlvbiBnZXRPcGVuU3RhdGUob3Blbikge1xuICByZXR1cm4gb3BlbiA/IFwib3BlblwiIDogXCJjbG9zZWRcIjtcbn1cbmZ1bmN0aW9uIGlzSW5kZXRlcm1pbmF0ZShjaGVja2VkKSB7XG4gIHJldHVybiBjaGVja2VkID09PSBcImluZGV0ZXJtaW5hdGVcIjtcbn1cbmZ1bmN0aW9uIGdldENoZWNrZWRTdGF0ZShjaGVja2VkKSB7XG4gIHJldHVybiBpc0luZGV0ZXJtaW5hdGUoY2hlY2tlZCkgPyBcImluZGV0ZXJtaW5hdGVcIiA6IGNoZWNrZWQgPyBcImNoZWNrZWRcIiA6IFwidW5jaGVja2VkXCI7XG59XG5mdW5jdGlvbiBmb2N1c0ZpcnN0KGNhbmRpZGF0ZXMpIHtcbiAgY29uc3QgUFJFVklPVVNMWV9GT0NVU0VEX0VMRU1FTlQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKGNhbmRpZGF0ZSA9PT0gUFJFVklPVVNMWV9GT0NVU0VEX0VMRU1FTlQpIHJldHVybjtcbiAgICBjYW5kaWRhdGUuZm9jdXMoKTtcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gUFJFVklPVVNMWV9GT0NVU0VEX0VMRU1FTlQpIHJldHVybjtcbiAgfVxufVxuZnVuY3Rpb24gd3JhcEFycmF5KGFycmF5LCBzdGFydEluZGV4KSB7XG4gIHJldHVybiBhcnJheS5tYXAoKF8sIGluZGV4KSA9PiBhcnJheVsoc3RhcnRJbmRleCArIGluZGV4KSAlIGFycmF5Lmxlbmd0aF0pO1xufVxuZnVuY3Rpb24gZ2V0TmV4dE1hdGNoKHZhbHVlcywgc2VhcmNoLCBjdXJyZW50TWF0Y2gpIHtcbiAgY29uc3QgaXNSZXBlYXRlZCA9IHNlYXJjaC5sZW5ndGggPiAxICYmIEFycmF5LmZyb20oc2VhcmNoKS5ldmVyeSgoY2hhcikgPT4gY2hhciA9PT0gc2VhcmNoWzBdKTtcbiAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IGlzUmVwZWF0ZWQgPyBzZWFyY2hbMF0gOiBzZWFyY2g7XG4gIGNvbnN0IGN1cnJlbnRNYXRjaEluZGV4ID0gY3VycmVudE1hdGNoID8gdmFsdWVzLmluZGV4T2YoY3VycmVudE1hdGNoKSA6IC0xO1xuICBsZXQgd3JhcHBlZFZhbHVlcyA9IHdyYXBBcnJheSh2YWx1ZXMsIE1hdGgubWF4KGN1cnJlbnRNYXRjaEluZGV4LCAwKSk7XG4gIGNvbnN0IGV4Y2x1ZGVDdXJyZW50TWF0Y2ggPSBub3JtYWxpemVkU2VhcmNoLmxlbmd0aCA9PT0gMTtcbiAgaWYgKGV4Y2x1ZGVDdXJyZW50TWF0Y2gpIHdyYXBwZWRWYWx1ZXMgPSB3cmFwcGVkVmFsdWVzLmZpbHRlcigodikgPT4gdiAhPT0gY3VycmVudE1hdGNoKTtcbiAgY29uc3QgbmV4dE1hdGNoID0gd3JhcHBlZFZhbHVlcy5maW5kKFxuICAgICh2YWx1ZSkgPT4gdmFsdWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG5vcm1hbGl6ZWRTZWFyY2gudG9Mb3dlckNhc2UoKSlcbiAgKTtcbiAgcmV0dXJuIG5leHRNYXRjaCAhPT0gY3VycmVudE1hdGNoID8gbmV4dE1hdGNoIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gaXNQb2ludEluUG9seWdvbihwb2ludCwgcG9seWdvbikge1xuICBjb25zdCB7IHgsIHkgfSA9IHBvaW50O1xuICBsZXQgaW5zaWRlID0gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwLCBqID0gcG9seWdvbi5sZW5ndGggLSAxOyBpIDwgcG9seWdvbi5sZW5ndGg7IGogPSBpKyspIHtcbiAgICBjb25zdCB4aSA9IHBvbHlnb25baV0ueDtcbiAgICBjb25zdCB5aSA9IHBvbHlnb25baV0ueTtcbiAgICBjb25zdCB4aiA9IHBvbHlnb25bal0ueDtcbiAgICBjb25zdCB5aiA9IHBvbHlnb25bal0ueTtcbiAgICBjb25zdCBpbnRlcnNlY3QgPSB5aSA+IHkgIT09IHlqID4geSAmJiB4IDwgKHhqIC0geGkpICogKHkgLSB5aSkgLyAoeWogLSB5aSkgKyB4aTtcbiAgICBpZiAoaW50ZXJzZWN0KSBpbnNpZGUgPSAhaW5zaWRlO1xuICB9XG4gIHJldHVybiBpbnNpZGU7XG59XG5mdW5jdGlvbiBpc1BvaW50ZXJJbkdyYWNlQXJlYShldmVudCwgYXJlYSkge1xuICBpZiAoIWFyZWEpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgY3Vyc29yUG9zID0geyB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZIH07XG4gIHJldHVybiBpc1BvaW50SW5Qb2x5Z29uKGN1cnNvclBvcywgYXJlYSk7XG59XG5mdW5jdGlvbiB3aGVuTW91c2UoaGFuZGxlcikge1xuICByZXR1cm4gKGV2ZW50KSA9PiBldmVudC5wb2ludGVyVHlwZSA9PT0gXCJtb3VzZVwiID8gaGFuZGxlcihldmVudCkgOiB2b2lkIDA7XG59XG52YXIgUm9vdDMgPSBNZW51O1xudmFyIEFuY2hvcjIgPSBNZW51QW5jaG9yO1xudmFyIFBvcnRhbCA9IE1lbnVQb3J0YWw7XG52YXIgQ29udGVudDIgPSBNZW51Q29udGVudDtcbnZhciBHcm91cCA9IE1lbnVHcm91cDtcbnZhciBMYWJlbCA9IE1lbnVMYWJlbDtcbnZhciBJdGVtMiA9IE1lbnVJdGVtO1xudmFyIENoZWNrYm94SXRlbSA9IE1lbnVDaGVja2JveEl0ZW07XG52YXIgUmFkaW9Hcm91cCA9IE1lbnVSYWRpb0dyb3VwO1xudmFyIFJhZGlvSXRlbSA9IE1lbnVSYWRpb0l0ZW07XG52YXIgSXRlbUluZGljYXRvciA9IE1lbnVJdGVtSW5kaWNhdG9yO1xudmFyIFNlcGFyYXRvciA9IE1lbnVTZXBhcmF0b3I7XG52YXIgQXJyb3cyID0gTWVudUFycm93O1xudmFyIFN1YiA9IE1lbnVTdWI7XG52YXIgU3ViVHJpZ2dlciA9IE1lbnVTdWJUcmlnZ2VyO1xudmFyIFN1YkNvbnRlbnQgPSBNZW51U3ViQ29udGVudDtcbmV4cG9ydCB7XG4gIEFuY2hvcjIgYXMgQW5jaG9yLFxuICBBcnJvdzIgYXMgQXJyb3csXG4gIENoZWNrYm94SXRlbSxcbiAgQ29udGVudDIgYXMgQ29udGVudCxcbiAgR3JvdXAsXG4gIEl0ZW0yIGFzIEl0ZW0sXG4gIEl0ZW1JbmRpY2F0b3IsXG4gIExhYmVsLFxuICBNZW51LFxuICBNZW51QW5jaG9yLFxuICBNZW51QXJyb3csXG4gIE1lbnVDaGVja2JveEl0ZW0sXG4gIE1lbnVDb250ZW50LFxuICBNZW51R3JvdXAsXG4gIE1lbnVJdGVtLFxuICBNZW51SXRlbUluZGljYXRvcixcbiAgTWVudUxhYmVsLFxuICBNZW51UG9ydGFsLFxuICBNZW51UmFkaW9Hcm91cCxcbiAgTWVudVJhZGlvSXRlbSxcbiAgTWVudVNlcGFyYXRvcixcbiAgTWVudVN1YixcbiAgTWVudVN1YkNvbnRlbnQsXG4gIE1lbnVTdWJUcmlnZ2VyLFxuICBQb3J0YWwsXG4gIFJhZGlvR3JvdXAsXG4gIFJhZGlvSXRlbSxcbiAgUm9vdDMgYXMgUm9vdCxcbiAgU2VwYXJhdG9yLFxuICBTdWIsXG4gIFN1YkNvbnRlbnQsXG4gIFN1YlRyaWdnZXIsXG4gIGNyZWF0ZU1lbnVTY29wZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9wb3BwZXIvc3JjL1BvcHBlci50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgdXNlRmxvYXRpbmcsXG4gIGF1dG9VcGRhdGUsXG4gIG9mZnNldCxcbiAgc2hpZnQsXG4gIGxpbWl0U2hpZnQsXG4gIGhpZGUsXG4gIGFycm93IGFzIGZsb2F0aW5nVUlhcnJvdyxcbiAgZmxpcCxcbiAgc2l6ZVxufSBmcm9tIFwiQGZsb2F0aW5nLXVpL3JlYWN0LWRvbVwiO1xuaW1wb3J0ICogYXMgQXJyb3dQcmltaXRpdmUgZnJvbSBcIkByYWRpeC11aS9yZWFjdC1hcnJvd1wiO1xuaW1wb3J0IHsgdXNlQ29tcG9zZWRSZWZzIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1jb21wb3NlLXJlZnNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHRTY29wZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29udGV4dFwiO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wcmltaXRpdmVcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmXCI7XG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1sYXlvdXQtZWZmZWN0XCI7XG5pbXBvcnQgeyB1c2VTaXplIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2Utc2l6ZVwiO1xuaW1wb3J0IHsganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgU0lERV9PUFRJT05TID0gW1widG9wXCIsIFwicmlnaHRcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCJdO1xudmFyIEFMSUdOX09QVElPTlMgPSBbXCJzdGFydFwiLCBcImNlbnRlclwiLCBcImVuZFwiXTtcbnZhciBQT1BQRVJfTkFNRSA9IFwiUG9wcGVyXCI7XG52YXIgW2NyZWF0ZVBvcHBlckNvbnRleHQsIGNyZWF0ZVBvcHBlclNjb3BlXSA9IGNyZWF0ZUNvbnRleHRTY29wZShQT1BQRVJfTkFNRSk7XG52YXIgW1BvcHBlclByb3ZpZGVyLCB1c2VQb3BwZXJDb250ZXh0XSA9IGNyZWF0ZVBvcHBlckNvbnRleHQoUE9QUEVSX05BTUUpO1xudmFyIFBvcHBlciA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IF9fc2NvcGVQb3BwZXIsIGNoaWxkcmVuIH0gPSBwcm9wcztcbiAgY29uc3QgW2FuY2hvciwgc2V0QW5jaG9yXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChQb3BwZXJQcm92aWRlciwgeyBzY29wZTogX19zY29wZVBvcHBlciwgYW5jaG9yLCBvbkFuY2hvckNoYW5nZTogc2V0QW5jaG9yLCBjaGlsZHJlbiB9KTtcbn07XG5Qb3BwZXIuZGlzcGxheU5hbWUgPSBQT1BQRVJfTkFNRTtcbnZhciBBTkNIT1JfTkFNRSA9IFwiUG9wcGVyQW5jaG9yXCI7XG52YXIgUG9wcGVyQW5jaG9yID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7IF9fc2NvcGVQb3BwZXIsIHZpcnR1YWxSZWYsIC4uLmFuY2hvclByb3BzIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlUG9wcGVyQ29udGV4dChBTkNIT1JfTkFNRSwgX19zY29wZVBvcHBlcik7XG4gICAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIHJlZik7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnRleHQub25BbmNob3JDaGFuZ2UodmlydHVhbFJlZj8uY3VycmVudCB8fCByZWYuY3VycmVudCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZpcnR1YWxSZWYgPyBudWxsIDogLyogQF9fUFVSRV9fICovIGpzeChQcmltaXRpdmUuZGl2LCB7IC4uLmFuY2hvclByb3BzLCByZWY6IGNvbXBvc2VkUmVmcyB9KTtcbiAgfVxuKTtcblBvcHBlckFuY2hvci5kaXNwbGF5TmFtZSA9IEFOQ0hPUl9OQU1FO1xudmFyIENPTlRFTlRfTkFNRSA9IFwiUG9wcGVyQ29udGVudFwiO1xudmFyIFtQb3BwZXJDb250ZW50UHJvdmlkZXIsIHVzZUNvbnRlbnRDb250ZXh0XSA9IGNyZWF0ZVBvcHBlckNvbnRleHQoQ09OVEVOVF9OQU1FKTtcbnZhciBQb3BwZXJDb250ZW50ID0gUmVhY3QuZm9yd2FyZFJlZihcbiAgKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBfX3Njb3BlUG9wcGVyLFxuICAgICAgc2lkZSA9IFwiYm90dG9tXCIsXG4gICAgICBzaWRlT2Zmc2V0ID0gMCxcbiAgICAgIGFsaWduID0gXCJjZW50ZXJcIixcbiAgICAgIGFsaWduT2Zmc2V0ID0gMCxcbiAgICAgIGFycm93UGFkZGluZyA9IDAsXG4gICAgICBhdm9pZENvbGxpc2lvbnMgPSB0cnVlLFxuICAgICAgY29sbGlzaW9uQm91bmRhcnkgPSBbXSxcbiAgICAgIGNvbGxpc2lvblBhZGRpbmc6IGNvbGxpc2lvblBhZGRpbmdQcm9wID0gMCxcbiAgICAgIHN0aWNreSA9IFwicGFydGlhbFwiLFxuICAgICAgaGlkZVdoZW5EZXRhY2hlZCA9IGZhbHNlLFxuICAgICAgdXBkYXRlUG9zaXRpb25TdHJhdGVneSA9IFwib3B0aW1pemVkXCIsXG4gICAgICBvblBsYWNlZCxcbiAgICAgIC4uLmNvbnRlbnRQcm9wc1xuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlUG9wcGVyQ29udGV4dChDT05URU5UX05BTUUsIF9fc2NvcGVQb3BwZXIpO1xuICAgIGNvbnN0IFtjb250ZW50LCBzZXRDb250ZW50XSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICAgIGNvbnN0IGNvbXBvc2VkUmVmcyA9IHVzZUNvbXBvc2VkUmVmcyhmb3J3YXJkZWRSZWYsIChub2RlKSA9PiBzZXRDb250ZW50KG5vZGUpKTtcbiAgICBjb25zdCBbYXJyb3csIHNldEFycm93XSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICAgIGNvbnN0IGFycm93U2l6ZSA9IHVzZVNpemUoYXJyb3cpO1xuICAgIGNvbnN0IGFycm93V2lkdGggPSBhcnJvd1NpemU/LndpZHRoID8/IDA7XG4gICAgY29uc3QgYXJyb3dIZWlnaHQgPSBhcnJvd1NpemU/LmhlaWdodCA/PyAwO1xuICAgIGNvbnN0IGRlc2lyZWRQbGFjZW1lbnQgPSBzaWRlICsgKGFsaWduICE9PSBcImNlbnRlclwiID8gXCItXCIgKyBhbGlnbiA6IFwiXCIpO1xuICAgIGNvbnN0IGNvbGxpc2lvblBhZGRpbmcgPSB0eXBlb2YgY29sbGlzaW9uUGFkZGluZ1Byb3AgPT09IFwibnVtYmVyXCIgPyBjb2xsaXNpb25QYWRkaW5nUHJvcCA6IHsgdG9wOiAwLCByaWdodDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCAuLi5jb2xsaXNpb25QYWRkaW5nUHJvcCB9O1xuICAgIGNvbnN0IGJvdW5kYXJ5ID0gQXJyYXkuaXNBcnJheShjb2xsaXNpb25Cb3VuZGFyeSkgPyBjb2xsaXNpb25Cb3VuZGFyeSA6IFtjb2xsaXNpb25Cb3VuZGFyeV07XG4gICAgY29uc3QgaGFzRXhwbGljaXRCb3VuZGFyaWVzID0gYm91bmRhcnkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBkZXRlY3RPdmVyZmxvd09wdGlvbnMgPSB7XG4gICAgICBwYWRkaW5nOiBjb2xsaXNpb25QYWRkaW5nLFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LmZpbHRlcihpc05vdE51bGwpLFxuICAgICAgLy8gd2l0aCBgc3RyYXRlZ3k6ICdmaXhlZCdgLCB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBnZXQgaXQgdG8gcmVzcGVjdCBib3VuZGFyaWVzXG4gICAgICBhbHRCb3VuZGFyeTogaGFzRXhwbGljaXRCb3VuZGFyaWVzXG4gICAgfTtcbiAgICBjb25zdCB7IHJlZnMsIGZsb2F0aW5nU3R5bGVzLCBwbGFjZW1lbnQsIGlzUG9zaXRpb25lZCwgbWlkZGxld2FyZURhdGEgfSA9IHVzZUZsb2F0aW5nKHtcbiAgICAgIC8vIGRlZmF1bHQgdG8gYGZpeGVkYCBzdHJhdGVneSBzbyB1c2VycyBkb24ndCBoYXZlIHRvIHBpY2sgYW5kIHdlIGFsc28gYXZvaWQgZm9jdXMgc2Nyb2xsIGlzc3Vlc1xuICAgICAgc3RyYXRlZ3k6IFwiZml4ZWRcIixcbiAgICAgIHBsYWNlbWVudDogZGVzaXJlZFBsYWNlbWVudCxcbiAgICAgIHdoaWxlRWxlbWVudHNNb3VudGVkOiAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwID0gYXV0b1VwZGF0ZSguLi5hcmdzLCB7XG4gICAgICAgICAgYW5pbWF0aW9uRnJhbWU6IHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kgPT09IFwiYWx3YXlzXCJcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgICAgfSxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIHJlZmVyZW5jZTogY29udGV4dC5hbmNob3JcbiAgICAgIH0sXG4gICAgICBtaWRkbGV3YXJlOiBbXG4gICAgICAgIG9mZnNldCh7IG1haW5BeGlzOiBzaWRlT2Zmc2V0ICsgYXJyb3dIZWlnaHQsIGFsaWdubWVudEF4aXM6IGFsaWduT2Zmc2V0IH0pLFxuICAgICAgICBhdm9pZENvbGxpc2lvbnMgJiYgc2hpZnQoe1xuICAgICAgICAgIG1haW5BeGlzOiB0cnVlLFxuICAgICAgICAgIGNyb3NzQXhpczogZmFsc2UsXG4gICAgICAgICAgbGltaXRlcjogc3RpY2t5ID09PSBcInBhcnRpYWxcIiA/IGxpbWl0U2hpZnQoKSA6IHZvaWQgMCxcbiAgICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgICAgfSksXG4gICAgICAgIGF2b2lkQ29sbGlzaW9ucyAmJiBmbGlwKHsgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zIH0pLFxuICAgICAgICBzaXplKHtcbiAgICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnMsXG4gICAgICAgICAgYXBwbHk6ICh7IGVsZW1lbnRzLCByZWN0cywgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHdpZHRoOiBhbmNob3JXaWR0aCwgaGVpZ2h0OiBhbmNob3JIZWlnaHQgfSA9IHJlY3RzLnJlZmVyZW5jZTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRTdHlsZSA9IGVsZW1lbnRzLmZsb2F0aW5nLnN0eWxlO1xuICAgICAgICAgICAgY29udGVudFN0eWxlLnNldFByb3BlcnR5KFwiLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoXCIsIGAke2F2YWlsYWJsZVdpZHRofXB4YCk7XG4gICAgICAgICAgICBjb250ZW50U3R5bGUuc2V0UHJvcGVydHkoXCItLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0XCIsIGAke2F2YWlsYWJsZUhlaWdodH1weGApO1xuICAgICAgICAgICAgY29udGVudFN0eWxlLnNldFByb3BlcnR5KFwiLS1yYWRpeC1wb3BwZXItYW5jaG9yLXdpZHRoXCIsIGAke2FuY2hvcldpZHRofXB4YCk7XG4gICAgICAgICAgICBjb250ZW50U3R5bGUuc2V0UHJvcGVydHkoXCItLXJhZGl4LXBvcHBlci1hbmNob3ItaGVpZ2h0XCIsIGAke2FuY2hvckhlaWdodH1weGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGFycm93ICYmIGZsb2F0aW5nVUlhcnJvdyh7IGVsZW1lbnQ6IGFycm93LCBwYWRkaW5nOiBhcnJvd1BhZGRpbmcgfSksXG4gICAgICAgIHRyYW5zZm9ybU9yaWdpbih7IGFycm93V2lkdGgsIGFycm93SGVpZ2h0IH0pLFxuICAgICAgICBoaWRlV2hlbkRldGFjaGVkICYmIGhpZGUoeyBzdHJhdGVneTogXCJyZWZlcmVuY2VIaWRkZW5cIiwgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zIH0pXG4gICAgICBdXG4gICAgfSk7XG4gICAgY29uc3QgW3BsYWNlZFNpZGUsIHBsYWNlZEFsaWduXSA9IGdldFNpZGVBbmRBbGlnbkZyb21QbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgICBjb25zdCBoYW5kbGVQbGFjZWQgPSB1c2VDYWxsYmFja1JlZihvblBsYWNlZCk7XG4gICAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgIGlmIChpc1Bvc2l0aW9uZWQpIHtcbiAgICAgICAgaGFuZGxlUGxhY2VkPy4oKTtcbiAgICAgIH1cbiAgICB9LCBbaXNQb3NpdGlvbmVkLCBoYW5kbGVQbGFjZWRdKTtcbiAgICBjb25zdCBhcnJvd1ggPSBtaWRkbGV3YXJlRGF0YS5hcnJvdz8ueDtcbiAgICBjb25zdCBhcnJvd1kgPSBtaWRkbGV3YXJlRGF0YS5hcnJvdz8ueTtcbiAgICBjb25zdCBjYW5ub3RDZW50ZXJBcnJvdyA9IG1pZGRsZXdhcmVEYXRhLmFycm93Py5jZW50ZXJPZmZzZXQgIT09IDA7XG4gICAgY29uc3QgW2NvbnRlbnRaSW5kZXgsIHNldENvbnRlbnRaSW5kZXhdID0gUmVhY3QudXNlU3RhdGUoKTtcbiAgICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKGNvbnRlbnQpIHNldENvbnRlbnRaSW5kZXgod2luZG93LmdldENvbXB1dGVkU3R5bGUoY29udGVudCkuekluZGV4KTtcbiAgICB9LCBbY29udGVudF0pO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgXCJkaXZcIixcbiAgICAgIHtcbiAgICAgICAgcmVmOiByZWZzLnNldEZsb2F0aW5nLFxuICAgICAgICBcImRhdGEtcmFkaXgtcG9wcGVyLWNvbnRlbnQtd3JhcHBlclwiOiBcIlwiLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIC4uLmZsb2F0aW5nU3R5bGVzLFxuICAgICAgICAgIHRyYW5zZm9ybTogaXNQb3NpdGlvbmVkID8gZmxvYXRpbmdTdHlsZXMudHJhbnNmb3JtIDogXCJ0cmFuc2xhdGUoMCwgLTIwMCUpXCIsXG4gICAgICAgICAgLy8ga2VlcCBvZmYgdGhlIHBhZ2Ugd2hlbiBtZWFzdXJpbmdcbiAgICAgICAgICBtaW5XaWR0aDogXCJtYXgtY29udGVudFwiLFxuICAgICAgICAgIHpJbmRleDogY29udGVudFpJbmRleCxcbiAgICAgICAgICBbXCItLXJhZGl4LXBvcHBlci10cmFuc2Zvcm0tb3JpZ2luXCJdOiBbXG4gICAgICAgICAgICBtaWRkbGV3YXJlRGF0YS50cmFuc2Zvcm1PcmlnaW4/LngsXG4gICAgICAgICAgICBtaWRkbGV3YXJlRGF0YS50cmFuc2Zvcm1PcmlnaW4/LnlcbiAgICAgICAgICBdLmpvaW4oXCIgXCIpLFxuICAgICAgICAgIC8vIGhpZGUgdGhlIGNvbnRlbnQgaWYgdXNpbmcgdGhlIGhpZGUgbWlkZGxld2FyZSBhbmQgc2hvdWxkIGJlIGhpZGRlblxuICAgICAgICAgIC8vIHNldCB2aXNpYmlsaXR5IHRvIGhpZGRlbiBhbmQgZGlzYWJsZSBwb2ludGVyIGV2ZW50cyBzbyB0aGUgVUkgYmVoYXZlc1xuICAgICAgICAgIC8vIGFzIGlmIHRoZSBQb3BwZXJDb250ZW50IGlzbid0IHRoZXJlIGF0IGFsbFxuICAgICAgICAgIC4uLm1pZGRsZXdhcmVEYXRhLmhpZGU/LnJlZmVyZW5jZUhpZGRlbiAmJiB7XG4gICAgICAgICAgICB2aXNpYmlsaXR5OiBcImhpZGRlblwiLFxuICAgICAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRpcjogcHJvcHMuZGlyLFxuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICBQb3BwZXJDb250ZW50UHJvdmlkZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NvcGU6IF9fc2NvcGVQb3BwZXIsXG4gICAgICAgICAgICBwbGFjZWRTaWRlLFxuICAgICAgICAgICAgb25BcnJvd0NoYW5nZTogc2V0QXJyb3csXG4gICAgICAgICAgICBhcnJvd1gsXG4gICAgICAgICAgICBhcnJvd1ksXG4gICAgICAgICAgICBzaG91bGRIaWRlQXJyb3c6IGNhbm5vdENlbnRlckFycm93LFxuICAgICAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgICAgICAgICAgIFByaW1pdGl2ZS5kaXYsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcImRhdGEtc2lkZVwiOiBwbGFjZWRTaWRlLFxuICAgICAgICAgICAgICAgIFwiZGF0YS1hbGlnblwiOiBwbGFjZWRBbGlnbixcbiAgICAgICAgICAgICAgICAuLi5jb250ZW50UHJvcHMsXG4gICAgICAgICAgICAgICAgcmVmOiBjb21wb3NlZFJlZnMsXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgIC4uLmNvbnRlbnRQcm9wcy5zdHlsZSxcbiAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBQb3BwZXJDb250ZW50IGhhc24ndCBiZWVuIHBsYWNlZCB5ZXQgKG5vdCBhbGwgbWVhc3VyZW1lbnRzIGRvbmUpXG4gICAgICAgICAgICAgICAgICAvLyB3ZSBwcmV2ZW50IGFuaW1hdGlvbnMgc28gdGhhdCB1c2VycydzIGFuaW1hdGlvbiBkb24ndCBraWNrIGluIHRvbyBlYXJseSByZWZlcnJpbmcgd3Jvbmcgc2lkZXNcbiAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogIWlzUG9zaXRpb25lZCA/IFwibm9uZVwiIDogdm9pZCAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcblBvcHBlckNvbnRlbnQuZGlzcGxheU5hbWUgPSBDT05URU5UX05BTUU7XG52YXIgQVJST1dfTkFNRSA9IFwiUG9wcGVyQXJyb3dcIjtcbnZhciBPUFBPU0lURV9TSURFID0ge1xuICB0b3A6IFwiYm90dG9tXCIsXG4gIHJpZ2h0OiBcImxlZnRcIixcbiAgYm90dG9tOiBcInRvcFwiLFxuICBsZWZ0OiBcInJpZ2h0XCJcbn07XG52YXIgUG9wcGVyQXJyb3cgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIFBvcHBlckFycm93Mihwcm9wcywgZm9yd2FyZGVkUmVmKSB7XG4gIGNvbnN0IHsgX19zY29wZVBvcHBlciwgLi4uYXJyb3dQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IGNvbnRlbnRDb250ZXh0ID0gdXNlQ29udGVudENvbnRleHQoQVJST1dfTkFNRSwgX19zY29wZVBvcHBlcik7XG4gIGNvbnN0IGJhc2VTaWRlID0gT1BQT1NJVEVfU0lERVtjb250ZW50Q29udGV4dC5wbGFjZWRTaWRlXTtcbiAgcmV0dXJuIChcbiAgICAvLyB3ZSBoYXZlIHRvIHVzZSBhbiBleHRyYSB3cmFwcGVyIGJlY2F1c2UgYFJlc2l6ZU9ic2VydmVyYCAodXNlZCBieSBgdXNlU2l6ZWApXG4gICAgLy8gZG9lc24ndCByZXBvcnQgc2l6ZSBhcyB3ZSdkIGV4cGVjdCBvbiBTVkcgZWxlbWVudHMuXG4gICAgLy8gaXQgcmVwb3J0cyB0aGVpciBib3VuZGluZyBib3ggd2hpY2ggaXMgZWZmZWN0aXZlbHkgdGhlIGxhcmdlc3QgcGF0aCBpbnNpZGUgdGhlIFNWRy5cbiAgICAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgXCJzcGFuXCIsXG4gICAgICB7XG4gICAgICAgIHJlZjogY29udGVudENvbnRleHQub25BcnJvd0NoYW5nZSxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgIGxlZnQ6IGNvbnRlbnRDb250ZXh0LmFycm93WCxcbiAgICAgICAgICB0b3A6IGNvbnRlbnRDb250ZXh0LmFycm93WSxcbiAgICAgICAgICBbYmFzZVNpZGVdOiAwLFxuICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjoge1xuICAgICAgICAgICAgdG9wOiBcIlwiLFxuICAgICAgICAgICAgcmlnaHQ6IFwiMCAwXCIsXG4gICAgICAgICAgICBib3R0b206IFwiY2VudGVyIDBcIixcbiAgICAgICAgICAgIGxlZnQ6IFwiMTAwJSAwXCJcbiAgICAgICAgICB9W2NvbnRlbnRDb250ZXh0LnBsYWNlZFNpZGVdLFxuICAgICAgICAgIHRyYW5zZm9ybToge1xuICAgICAgICAgICAgdG9wOiBcInRyYW5zbGF0ZVkoMTAwJSlcIixcbiAgICAgICAgICAgIHJpZ2h0OiBcInRyYW5zbGF0ZVkoNTAlKSByb3RhdGUoOTBkZWcpIHRyYW5zbGF0ZVgoLTUwJSlcIixcbiAgICAgICAgICAgIGJvdHRvbTogYHJvdGF0ZSgxODBkZWcpYCxcbiAgICAgICAgICAgIGxlZnQ6IFwidHJhbnNsYXRlWSg1MCUpIHJvdGF0ZSgtOTBkZWcpIHRyYW5zbGF0ZVgoNTAlKVwiXG4gICAgICAgICAgfVtjb250ZW50Q29udGV4dC5wbGFjZWRTaWRlXSxcbiAgICAgICAgICB2aXNpYmlsaXR5OiBjb250ZW50Q29udGV4dC5zaG91bGRIaWRlQXJyb3cgPyBcImhpZGRlblwiIDogdm9pZCAwXG4gICAgICAgIH0sXG4gICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICAgIEFycm93UHJpbWl0aXZlLlJvb3QsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uYXJyb3dQcm9wcyxcbiAgICAgICAgICAgIHJlZjogZm9yd2FyZGVkUmVmLFxuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgLi4uYXJyb3dQcm9wcy5zdHlsZSxcbiAgICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGUgZWxlbWVudCBjYW4gYmUgbWVhc3VyZWQgY29ycmVjdGx5IChtb3N0bHkgZm9yIGlmIFNWRylcbiAgICAgICAgICAgICAgZGlzcGxheTogXCJibG9ja1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgKVxuICApO1xufSk7XG5Qb3BwZXJBcnJvdy5kaXNwbGF5TmFtZSA9IEFSUk9XX05BTUU7XG5mdW5jdGlvbiBpc05vdE51bGwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsO1xufVxudmFyIHRyYW5zZm9ybU9yaWdpbiA9IChvcHRpb25zKSA9PiAoe1xuICBuYW1lOiBcInRyYW5zZm9ybU9yaWdpblwiLFxuICBvcHRpb25zLFxuICBmbihkYXRhKSB7XG4gICAgY29uc3QgeyBwbGFjZW1lbnQsIHJlY3RzLCBtaWRkbGV3YXJlRGF0YSB9ID0gZGF0YTtcbiAgICBjb25zdCBjYW5ub3RDZW50ZXJBcnJvdyA9IG1pZGRsZXdhcmVEYXRhLmFycm93Py5jZW50ZXJPZmZzZXQgIT09IDA7XG4gICAgY29uc3QgaXNBcnJvd0hpZGRlbiA9IGNhbm5vdENlbnRlckFycm93O1xuICAgIGNvbnN0IGFycm93V2lkdGggPSBpc0Fycm93SGlkZGVuID8gMCA6IG9wdGlvbnMuYXJyb3dXaWR0aDtcbiAgICBjb25zdCBhcnJvd0hlaWdodCA9IGlzQXJyb3dIaWRkZW4gPyAwIDogb3B0aW9ucy5hcnJvd0hlaWdodDtcbiAgICBjb25zdCBbcGxhY2VkU2lkZSwgcGxhY2VkQWxpZ25dID0gZ2V0U2lkZUFuZEFsaWduRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICAgIGNvbnN0IG5vQXJyb3dBbGlnbiA9IHsgc3RhcnQ6IFwiMCVcIiwgY2VudGVyOiBcIjUwJVwiLCBlbmQ6IFwiMTAwJVwiIH1bcGxhY2VkQWxpZ25dO1xuICAgIGNvbnN0IGFycm93WENlbnRlciA9IChtaWRkbGV3YXJlRGF0YS5hcnJvdz8ueCA/PyAwKSArIGFycm93V2lkdGggLyAyO1xuICAgIGNvbnN0IGFycm93WUNlbnRlciA9IChtaWRkbGV3YXJlRGF0YS5hcnJvdz8ueSA/PyAwKSArIGFycm93SGVpZ2h0IC8gMjtcbiAgICBsZXQgeCA9IFwiXCI7XG4gICAgbGV0IHkgPSBcIlwiO1xuICAgIGlmIChwbGFjZWRTaWRlID09PSBcImJvdHRvbVwiKSB7XG4gICAgICB4ID0gaXNBcnJvd0hpZGRlbiA/IG5vQXJyb3dBbGlnbiA6IGAke2Fycm93WENlbnRlcn1weGA7XG4gICAgICB5ID0gYCR7LWFycm93SGVpZ2h0fXB4YDtcbiAgICB9IGVsc2UgaWYgKHBsYWNlZFNpZGUgPT09IFwidG9wXCIpIHtcbiAgICAgIHggPSBpc0Fycm93SGlkZGVuID8gbm9BcnJvd0FsaWduIDogYCR7YXJyb3dYQ2VudGVyfXB4YDtcbiAgICAgIHkgPSBgJHtyZWN0cy5mbG9hdGluZy5oZWlnaHQgKyBhcnJvd0hlaWdodH1weGA7XG4gICAgfSBlbHNlIGlmIChwbGFjZWRTaWRlID09PSBcInJpZ2h0XCIpIHtcbiAgICAgIHggPSBgJHstYXJyb3dIZWlnaHR9cHhgO1xuICAgICAgeSA9IGlzQXJyb3dIaWRkZW4gPyBub0Fycm93QWxpZ24gOiBgJHthcnJvd1lDZW50ZXJ9cHhgO1xuICAgIH0gZWxzZSBpZiAocGxhY2VkU2lkZSA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgIHggPSBgJHtyZWN0cy5mbG9hdGluZy53aWR0aCArIGFycm93SGVpZ2h0fXB4YDtcbiAgICAgIHkgPSBpc0Fycm93SGlkZGVuID8gbm9BcnJvd0FsaWduIDogYCR7YXJyb3dZQ2VudGVyfXB4YDtcbiAgICB9XG4gICAgcmV0dXJuIHsgZGF0YTogeyB4LCB5IH0gfTtcbiAgfVxufSk7XG5mdW5jdGlvbiBnZXRTaWRlQW5kQWxpZ25Gcm9tUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICBjb25zdCBbc2lkZSwgYWxpZ24gPSBcImNlbnRlclwiXSA9IHBsYWNlbWVudC5zcGxpdChcIi1cIik7XG4gIHJldHVybiBbc2lkZSwgYWxpZ25dO1xufVxudmFyIFJvb3QyID0gUG9wcGVyO1xudmFyIEFuY2hvciA9IFBvcHBlckFuY2hvcjtcbnZhciBDb250ZW50ID0gUG9wcGVyQ29udGVudDtcbnZhciBBcnJvdyA9IFBvcHBlckFycm93O1xuZXhwb3J0IHtcbiAgQUxJR05fT1BUSU9OUyxcbiAgQW5jaG9yLFxuICBBcnJvdyxcbiAgQ29udGVudCxcbiAgUG9wcGVyLFxuICBQb3BwZXJBbmNob3IsXG4gIFBvcHBlckFycm93LFxuICBQb3BwZXJDb250ZW50LFxuICBSb290MiBhcyBSb290LFxuICBTSURFX09QVElPTlMsXG4gIGNyZWF0ZVBvcHBlclNjb3BlXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L3BvcnRhbC9zcmMvUG9ydGFsLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wcmltaXRpdmVcIjtcbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWxheW91dC1lZmZlY3RcIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIFBPUlRBTF9OQU1FID0gXCJQb3J0YWxcIjtcbnZhciBQb3J0YWwgPSBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gIGNvbnN0IHsgY29udGFpbmVyOiBjb250YWluZXJQcm9wLCAuLi5wb3J0YWxQcm9wcyB9ID0gcHJvcHM7XG4gIGNvbnN0IFttb3VudGVkLCBzZXRNb3VudGVkXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHNldE1vdW50ZWQodHJ1ZSksIFtdKTtcbiAgY29uc3QgY29udGFpbmVyID0gY29udGFpbmVyUHJvcCB8fCBtb3VudGVkICYmIGdsb2JhbFRoaXM/LmRvY3VtZW50Py5ib2R5O1xuICByZXR1cm4gY29udGFpbmVyID8gUmVhY3RET00uY3JlYXRlUG9ydGFsKC8qIEBfX1BVUkVfXyAqLyBqc3goUHJpbWl0aXZlLmRpdiwgeyAuLi5wb3J0YWxQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSksIGNvbnRhaW5lcikgOiBudWxsO1xufSk7XG5Qb3J0YWwuZGlzcGxheU5hbWUgPSBQT1JUQUxfTkFNRTtcbnZhciBSb290ID0gUG9ydGFsO1xuZXhwb3J0IHtcbiAgUG9ydGFsLFxuICBSb290XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXgubWpzLm1hcFxuIiwiXCJ1c2UgY2xpZW50XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L3ByZXNlbmNlL3NyYy9QcmVzZW5jZS50c3hcbmltcG9ydCAqIGFzIFJlYWN0MiBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IHVzZUNvbXBvc2VkUmVmcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzXCI7XG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1sYXlvdXQtZWZmZWN0XCI7XG5cbi8vIHBhY2thZ2VzL3JlYWN0L3ByZXNlbmNlL3NyYy91c2VTdGF0ZU1hY2hpbmUudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmZ1bmN0aW9uIHVzZVN0YXRlTWFjaGluZShpbml0aWFsU3RhdGUsIG1hY2hpbmUpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZVJlZHVjZXIoKHN0YXRlLCBldmVudCkgPT4ge1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IG1hY2hpbmVbc3RhdGVdW2V2ZW50XTtcbiAgICByZXR1cm4gbmV4dFN0YXRlID8/IHN0YXRlO1xuICB9LCBpbml0aWFsU3RhdGUpO1xufVxuXG4vLyBwYWNrYWdlcy9yZWFjdC9wcmVzZW5jZS9zcmMvUHJlc2VuY2UudHN4XG52YXIgUHJlc2VuY2UgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBwcmVzZW50LCBjaGlsZHJlbiB9ID0gcHJvcHM7XG4gIGNvbnN0IHByZXNlbmNlID0gdXNlUHJlc2VuY2UocHJlc2VudCk7XG4gIGNvbnN0IGNoaWxkID0gdHlwZW9mIGNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCIgPyBjaGlsZHJlbih7IHByZXNlbnQ6IHByZXNlbmNlLmlzUHJlc2VudCB9KSA6IFJlYWN0Mi5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcbiAgY29uc3QgcmVmID0gdXNlQ29tcG9zZWRSZWZzKHByZXNlbmNlLnJlZiwgZ2V0RWxlbWVudFJlZihjaGlsZCkpO1xuICBjb25zdCBmb3JjZU1vdW50ID0gdHlwZW9mIGNoaWxkcmVuID09PSBcImZ1bmN0aW9uXCI7XG4gIHJldHVybiBmb3JjZU1vdW50IHx8IHByZXNlbmNlLmlzUHJlc2VudCA/IFJlYWN0Mi5jbG9uZUVsZW1lbnQoY2hpbGQsIHsgcmVmIH0pIDogbnVsbDtcbn07XG5QcmVzZW5jZS5kaXNwbGF5TmFtZSA9IFwiUHJlc2VuY2VcIjtcbmZ1bmN0aW9uIHVzZVByZXNlbmNlKHByZXNlbnQpIHtcbiAgY29uc3QgW25vZGUsIHNldE5vZGVdID0gUmVhY3QyLnVzZVN0YXRlKCk7XG4gIGNvbnN0IHN0eWxlc1JlZiA9IFJlYWN0Mi51c2VSZWYoe30pO1xuICBjb25zdCBwcmV2UHJlc2VudFJlZiA9IFJlYWN0Mi51c2VSZWYocHJlc2VudCk7XG4gIGNvbnN0IHByZXZBbmltYXRpb25OYW1lUmVmID0gUmVhY3QyLnVzZVJlZihcIm5vbmVcIik7XG4gIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHByZXNlbnQgPyBcIm1vdW50ZWRcIiA6IFwidW5tb3VudGVkXCI7XG4gIGNvbnN0IFtzdGF0ZSwgc2VuZF0gPSB1c2VTdGF0ZU1hY2hpbmUoaW5pdGlhbFN0YXRlLCB7XG4gICAgbW91bnRlZDoge1xuICAgICAgVU5NT1VOVDogXCJ1bm1vdW50ZWRcIixcbiAgICAgIEFOSU1BVElPTl9PVVQ6IFwidW5tb3VudFN1c3BlbmRlZFwiXG4gICAgfSxcbiAgICB1bm1vdW50U3VzcGVuZGVkOiB7XG4gICAgICBNT1VOVDogXCJtb3VudGVkXCIsXG4gICAgICBBTklNQVRJT05fRU5EOiBcInVubW91bnRlZFwiXG4gICAgfSxcbiAgICB1bm1vdW50ZWQ6IHtcbiAgICAgIE1PVU5UOiBcIm1vdW50ZWRcIlxuICAgIH1cbiAgfSk7XG4gIFJlYWN0Mi51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRBbmltYXRpb25OYW1lID0gZ2V0QW5pbWF0aW9uTmFtZShzdHlsZXNSZWYuY3VycmVudCk7XG4gICAgcHJldkFuaW1hdGlvbk5hbWVSZWYuY3VycmVudCA9IHN0YXRlID09PSBcIm1vdW50ZWRcIiA/IGN1cnJlbnRBbmltYXRpb25OYW1lIDogXCJub25lXCI7XG4gIH0sIFtzdGF0ZV0pO1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHN0eWxlcyA9IHN0eWxlc1JlZi5jdXJyZW50O1xuICAgIGNvbnN0IHdhc1ByZXNlbnQgPSBwcmV2UHJlc2VudFJlZi5jdXJyZW50O1xuICAgIGNvbnN0IGhhc1ByZXNlbnRDaGFuZ2VkID0gd2FzUHJlc2VudCAhPT0gcHJlc2VudDtcbiAgICBpZiAoaGFzUHJlc2VudENoYW5nZWQpIHtcbiAgICAgIGNvbnN0IHByZXZBbmltYXRpb25OYW1lID0gcHJldkFuaW1hdGlvbk5hbWVSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IGN1cnJlbnRBbmltYXRpb25OYW1lID0gZ2V0QW5pbWF0aW9uTmFtZShzdHlsZXMpO1xuICAgICAgaWYgKHByZXNlbnQpIHtcbiAgICAgICAgc2VuZChcIk1PVU5UXCIpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50QW5pbWF0aW9uTmFtZSA9PT0gXCJub25lXCIgfHwgc3R5bGVzPy5kaXNwbGF5ID09PSBcIm5vbmVcIikge1xuICAgICAgICBzZW5kKFwiVU5NT1VOVFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGlzQW5pbWF0aW5nID0gcHJldkFuaW1hdGlvbk5hbWUgIT09IGN1cnJlbnRBbmltYXRpb25OYW1lO1xuICAgICAgICBpZiAod2FzUHJlc2VudCAmJiBpc0FuaW1hdGluZykge1xuICAgICAgICAgIHNlbmQoXCJBTklNQVRJT05fT1VUXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbmQoXCJVTk1PVU5UXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwcmV2UHJlc2VudFJlZi5jdXJyZW50ID0gcHJlc2VudDtcbiAgICB9XG4gIH0sIFtwcmVzZW50LCBzZW5kXSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIGNvbnN0IGhhbmRsZUFuaW1hdGlvbkVuZCA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50QW5pbWF0aW9uTmFtZSA9IGdldEFuaW1hdGlvbk5hbWUoc3R5bGVzUmVmLmN1cnJlbnQpO1xuICAgICAgICBjb25zdCBpc0N1cnJlbnRBbmltYXRpb24gPSBjdXJyZW50QW5pbWF0aW9uTmFtZS5pbmNsdWRlcyhldmVudC5hbmltYXRpb25OYW1lKTtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gbm9kZSAmJiBpc0N1cnJlbnRBbmltYXRpb24pIHtcbiAgICAgICAgICBSZWFjdERPTS5mbHVzaFN5bmMoKCkgPT4gc2VuZChcIkFOSU1BVElPTl9FTkRcIikpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgaGFuZGxlQW5pbWF0aW9uU3RhcnQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gbm9kZSkge1xuICAgICAgICAgIHByZXZBbmltYXRpb25OYW1lUmVmLmN1cnJlbnQgPSBnZXRBbmltYXRpb25OYW1lKHN0eWxlc1JlZi5jdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcImFuaW1hdGlvbnN0YXJ0XCIsIGhhbmRsZUFuaW1hdGlvblN0YXJ0KTtcbiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcImFuaW1hdGlvbmNhbmNlbFwiLCBoYW5kbGVBbmltYXRpb25FbmQpO1xuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKFwiYW5pbWF0aW9uZW5kXCIsIGhhbmRsZUFuaW1hdGlvbkVuZCk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhbmltYXRpb25zdGFydFwiLCBoYW5kbGVBbmltYXRpb25TdGFydCk7XG4gICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFuaW1hdGlvbmNhbmNlbFwiLCBoYW5kbGVBbmltYXRpb25FbmQpO1xuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhbmltYXRpb25lbmRcIiwgaGFuZGxlQW5pbWF0aW9uRW5kKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbmQoXCJBTklNQVRJT05fRU5EXCIpO1xuICAgIH1cbiAgfSwgW25vZGUsIHNlbmRdKTtcbiAgcmV0dXJuIHtcbiAgICBpc1ByZXNlbnQ6IFtcIm1vdW50ZWRcIiwgXCJ1bm1vdW50U3VzcGVuZGVkXCJdLmluY2x1ZGVzKHN0YXRlKSxcbiAgICByZWY6IFJlYWN0Mi51c2VDYWxsYmFjaygobm9kZTIpID0+IHtcbiAgICAgIGlmIChub2RlMikgc3R5bGVzUmVmLmN1cnJlbnQgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUyKTtcbiAgICAgIHNldE5vZGUobm9kZTIpO1xuICAgIH0sIFtdKVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0QW5pbWF0aW9uTmFtZShzdHlsZXMpIHtcbiAgcmV0dXJuIHN0eWxlcz8uYW5pbWF0aW9uTmFtZSB8fCBcIm5vbmVcIjtcbn1cbmZ1bmN0aW9uIGdldEVsZW1lbnRSZWYoZWxlbWVudCkge1xuICBsZXQgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlbGVtZW50LnByb3BzLCBcInJlZlwiKT8uZ2V0O1xuICBsZXQgbWF5V2FybiA9IGdldHRlciAmJiBcImlzUmVhY3RXYXJuaW5nXCIgaW4gZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZztcbiAgaWYgKG1heVdhcm4pIHtcbiAgICByZXR1cm4gZWxlbWVudC5yZWY7XG4gIH1cbiAgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlbGVtZW50LCBcInJlZlwiKT8uZ2V0O1xuICBtYXlXYXJuID0gZ2V0dGVyICYmIFwiaXNSZWFjdFdhcm5pbmdcIiBpbiBnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nO1xuICBpZiAobWF5V2Fybikge1xuICAgIHJldHVybiBlbGVtZW50LnByb3BzLnJlZjtcbiAgfVxuICByZXR1cm4gZWxlbWVudC5wcm9wcy5yZWYgfHwgZWxlbWVudC5yZWY7XG59XG5leHBvcnQge1xuICBQcmVzZW5jZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L3ByaW1pdGl2ZS9zcmMvUHJpbWl0aXZlLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyBTbG90IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1zbG90XCI7XG5pbXBvcnQgeyBqc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbnZhciBOT0RFUyA9IFtcbiAgXCJhXCIsXG4gIFwiYnV0dG9uXCIsXG4gIFwiZGl2XCIsXG4gIFwiZm9ybVwiLFxuICBcImgyXCIsXG4gIFwiaDNcIixcbiAgXCJpbWdcIixcbiAgXCJpbnB1dFwiLFxuICBcImxhYmVsXCIsXG4gIFwibGlcIixcbiAgXCJuYXZcIixcbiAgXCJvbFwiLFxuICBcInBcIixcbiAgXCJzcGFuXCIsXG4gIFwic3ZnXCIsXG4gIFwidWxcIlxuXTtcbnZhciBQcmltaXRpdmUgPSBOT0RFUy5yZWR1Y2UoKHByaW1pdGl2ZSwgbm9kZSkgPT4ge1xuICBjb25zdCBOb2RlID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHsgYXNDaGlsZCwgLi4ucHJpbWl0aXZlUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IENvbXAgPSBhc0NoaWxkID8gU2xvdCA6IG5vZGU7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvd1tTeW1ib2wuZm9yKFwicmFkaXgtdWlcIildID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goQ29tcCwgeyAuLi5wcmltaXRpdmVQcm9wcywgcmVmOiBmb3J3YXJkZWRSZWYgfSk7XG4gIH0pO1xuICBOb2RlLmRpc3BsYXlOYW1lID0gYFByaW1pdGl2ZS4ke25vZGV9YDtcbiAgcmV0dXJuIHsgLi4ucHJpbWl0aXZlLCBbbm9kZV06IE5vZGUgfTtcbn0sIHt9KTtcbmZ1bmN0aW9uIGRpc3BhdGNoRGlzY3JldGVDdXN0b21FdmVudCh0YXJnZXQsIGV2ZW50KSB7XG4gIGlmICh0YXJnZXQpIFJlYWN0RE9NLmZsdXNoU3luYygoKSA9PiB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCkpO1xufVxudmFyIFJvb3QgPSBQcmltaXRpdmU7XG5leHBvcnQge1xuICBQcmltaXRpdmUsXG4gIFJvb3QsXG4gIGRpc3BhdGNoRGlzY3JldGVDdXN0b21FdmVudFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBwYWNrYWdlcy9yZWFjdC9yb3ZpbmctZm9jdXMvc3JjL1JvdmluZ0ZvY3VzR3JvdXAudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGNvbXBvc2VFdmVudEhhbmRsZXJzIH0gZnJvbSBcIkByYWRpeC11aS9wcmltaXRpdmVcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbGxlY3Rpb24gfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbGxlY3Rpb25cIjtcbmltcG9ydCB7IHVzZUNvbXBvc2VkUmVmcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzXCI7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0U2NvcGUgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LWNvbnRleHRcIjtcbmltcG9ydCB7IHVzZUlkIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1pZFwiO1xuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1wcmltaXRpdmVcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtY2FsbGJhY2stcmVmXCI7XG5pbXBvcnQgeyB1c2VDb250cm9sbGFibGVTdGF0ZSB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtdXNlLWNvbnRyb2xsYWJsZS1zdGF0ZVwiO1xuaW1wb3J0IHsgdXNlRGlyZWN0aW9uIH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC1kaXJlY3Rpb25cIjtcbmltcG9ydCB7IGpzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xudmFyIEVOVFJZX0ZPQ1VTID0gXCJyb3ZpbmdGb2N1c0dyb3VwLm9uRW50cnlGb2N1c1wiO1xudmFyIEVWRU5UX09QVElPTlMgPSB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlIH07XG52YXIgR1JPVVBfTkFNRSA9IFwiUm92aW5nRm9jdXNHcm91cFwiO1xudmFyIFtDb2xsZWN0aW9uLCB1c2VDb2xsZWN0aW9uLCBjcmVhdGVDb2xsZWN0aW9uU2NvcGVdID0gY3JlYXRlQ29sbGVjdGlvbihHUk9VUF9OQU1FKTtcbnZhciBbY3JlYXRlUm92aW5nRm9jdXNHcm91cENvbnRleHQsIGNyZWF0ZVJvdmluZ0ZvY3VzR3JvdXBTY29wZV0gPSBjcmVhdGVDb250ZXh0U2NvcGUoXG4gIEdST1VQX05BTUUsXG4gIFtjcmVhdGVDb2xsZWN0aW9uU2NvcGVdXG4pO1xudmFyIFtSb3ZpbmdGb2N1c1Byb3ZpZGVyLCB1c2VSb3ZpbmdGb2N1c0NvbnRleHRdID0gY3JlYXRlUm92aW5nRm9jdXNHcm91cENvbnRleHQoR1JPVVBfTkFNRSk7XG52YXIgUm92aW5nRm9jdXNHcm91cCA9IFJlYWN0LmZvcndhcmRSZWYoXG4gIChwcm9wcywgZm9yd2FyZGVkUmVmKSA9PiB7XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goQ29sbGVjdGlvbi5Qcm92aWRlciwgeyBzY29wZTogcHJvcHMuX19zY29wZVJvdmluZ0ZvY3VzR3JvdXAsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KENvbGxlY3Rpb24uU2xvdCwgeyBzY29wZTogcHJvcHMuX19zY29wZVJvdmluZ0ZvY3VzR3JvdXAsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFJvdmluZ0ZvY3VzR3JvdXBJbXBsLCB7IC4uLnByb3BzLCByZWY6IGZvcndhcmRlZFJlZiB9KSB9KSB9KTtcbiAgfVxuKTtcblJvdmluZ0ZvY3VzR3JvdXAuZGlzcGxheU5hbWUgPSBHUk9VUF9OQU1FO1xudmFyIFJvdmluZ0ZvY3VzR3JvdXBJbXBsID0gUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICBjb25zdCB7XG4gICAgX19zY29wZVJvdmluZ0ZvY3VzR3JvdXAsXG4gICAgb3JpZW50YXRpb24sXG4gICAgbG9vcCA9IGZhbHNlLFxuICAgIGRpcixcbiAgICBjdXJyZW50VGFiU3RvcElkOiBjdXJyZW50VGFiU3RvcElkUHJvcCxcbiAgICBkZWZhdWx0Q3VycmVudFRhYlN0b3BJZCxcbiAgICBvbkN1cnJlbnRUYWJTdG9wSWRDaGFuZ2UsXG4gICAgb25FbnRyeUZvY3VzLFxuICAgIHByZXZlbnRTY3JvbGxPbkVudHJ5Rm9jdXMgPSBmYWxzZSxcbiAgICAuLi5ncm91cFByb3BzXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBjb25zdCBjb21wb3NlZFJlZnMgPSB1c2VDb21wb3NlZFJlZnMoZm9yd2FyZGVkUmVmLCByZWYpO1xuICBjb25zdCBkaXJlY3Rpb24gPSB1c2VEaXJlY3Rpb24oZGlyKTtcbiAgY29uc3QgW2N1cnJlbnRUYWJTdG9wSWQgPSBudWxsLCBzZXRDdXJyZW50VGFiU3RvcElkXSA9IHVzZUNvbnRyb2xsYWJsZVN0YXRlKHtcbiAgICBwcm9wOiBjdXJyZW50VGFiU3RvcElkUHJvcCxcbiAgICBkZWZhdWx0UHJvcDogZGVmYXVsdEN1cnJlbnRUYWJTdG9wSWQsXG4gICAgb25DaGFuZ2U6IG9uQ3VycmVudFRhYlN0b3BJZENoYW5nZVxuICB9KTtcbiAgY29uc3QgW2lzVGFiYmluZ0JhY2tPdXQsIHNldElzVGFiYmluZ0JhY2tPdXRdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBoYW5kbGVFbnRyeUZvY3VzID0gdXNlQ2FsbGJhY2tSZWYob25FbnRyeUZvY3VzKTtcbiAgY29uc3QgZ2V0SXRlbXMgPSB1c2VDb2xsZWN0aW9uKF9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwKTtcbiAgY29uc3QgaXNDbGlja0ZvY3VzUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgW2ZvY3VzYWJsZUl0ZW1zQ291bnQsIHNldEZvY3VzYWJsZUl0ZW1zQ291bnRdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IHJlZi5jdXJyZW50O1xuICAgIGlmIChub2RlKSB7XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoRU5UUllfRk9DVVMsIGhhbmRsZUVudHJ5Rm9jdXMpO1xuICAgICAgcmV0dXJuICgpID0+IG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihFTlRSWV9GT0NVUywgaGFuZGxlRW50cnlGb2N1cyk7XG4gICAgfVxuICB9LCBbaGFuZGxlRW50cnlGb2N1c10pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICBSb3ZpbmdGb2N1c1Byb3ZpZGVyLFxuICAgIHtcbiAgICAgIHNjb3BlOiBfX3Njb3BlUm92aW5nRm9jdXNHcm91cCxcbiAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgZGlyOiBkaXJlY3Rpb24sXG4gICAgICBsb29wLFxuICAgICAgY3VycmVudFRhYlN0b3BJZCxcbiAgICAgIG9uSXRlbUZvY3VzOiBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgICAgKHRhYlN0b3BJZCkgPT4gc2V0Q3VycmVudFRhYlN0b3BJZCh0YWJTdG9wSWQpLFxuICAgICAgICBbc2V0Q3VycmVudFRhYlN0b3BJZF1cbiAgICAgICksXG4gICAgICBvbkl0ZW1TaGlmdFRhYjogUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4gc2V0SXNUYWJiaW5nQmFja091dCh0cnVlKSwgW10pLFxuICAgICAgb25Gb2N1c2FibGVJdGVtQWRkOiBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAgICAgKCkgPT4gc2V0Rm9jdXNhYmxlSXRlbXNDb3VudCgocHJldkNvdW50KSA9PiBwcmV2Q291bnQgKyAxKSxcbiAgICAgICAgW11cbiAgICAgICksXG4gICAgICBvbkZvY3VzYWJsZUl0ZW1SZW1vdmU6IFJlYWN0LnVzZUNhbGxiYWNrKFxuICAgICAgICAoKSA9PiBzZXRGb2N1c2FibGVJdGVtc0NvdW50KChwcmV2Q291bnQpID0+IHByZXZDb3VudCAtIDEpLFxuICAgICAgICBbXVxuICAgICAgKSxcbiAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFxuICAgICAgICBQcmltaXRpdmUuZGl2LFxuICAgICAgICB7XG4gICAgICAgICAgdGFiSW5kZXg6IGlzVGFiYmluZ0JhY2tPdXQgfHwgZm9jdXNhYmxlSXRlbXNDb3VudCA9PT0gMCA/IC0xIDogMCxcbiAgICAgICAgICBcImRhdGEtb3JpZW50YXRpb25cIjogb3JpZW50YXRpb24sXG4gICAgICAgICAgLi4uZ3JvdXBQcm9wcyxcbiAgICAgICAgICByZWY6IGNvbXBvc2VkUmVmcyxcbiAgICAgICAgICBzdHlsZTogeyBvdXRsaW5lOiBcIm5vbmVcIiwgLi4ucHJvcHMuc3R5bGUgfSxcbiAgICAgICAgICBvbk1vdXNlRG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Nb3VzZURvd24sICgpID0+IHtcbiAgICAgICAgICAgIGlzQ2xpY2tGb2N1c1JlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBvbkZvY3VzOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbkZvY3VzLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzS2V5Ym9hcmRGb2N1cyA9ICFpc0NsaWNrRm9jdXNSZWYuY3VycmVudDtcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQgJiYgaXNLZXlib2FyZEZvY3VzICYmICFpc1RhYmJpbmdCYWNrT3V0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVudHJ5Rm9jdXNFdmVudCA9IG5ldyBDdXN0b21FdmVudChFTlRSWV9GT0NVUywgRVZFTlRfT1BUSU9OUyk7XG4gICAgICAgICAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudChlbnRyeUZvY3VzRXZlbnQpO1xuICAgICAgICAgICAgICBpZiAoIWVudHJ5Rm9jdXNFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRJdGVtcygpLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5mb2N1c2FibGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUl0ZW0gPSBpdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLmFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSBpdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBjdXJyZW50VGFiU3RvcElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVJdGVtcyA9IFthY3RpdmVJdGVtLCBjdXJyZW50SXRlbSwgLi4uaXRlbXNdLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIEJvb2xlYW5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZU5vZGVzID0gY2FuZGlkYXRlSXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICBmb2N1c0ZpcnN0KGNhbmRpZGF0ZU5vZGVzLCBwcmV2ZW50U2Nyb2xsT25FbnRyeUZvY3VzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNDbGlja0ZvY3VzUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBvbkJsdXI6IGNvbXBvc2VFdmVudEhhbmRsZXJzKHByb3BzLm9uQmx1ciwgKCkgPT4gc2V0SXNUYWJiaW5nQmFja091dChmYWxzZSkpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gICk7XG59KTtcbnZhciBJVEVNX05BTUUgPSBcIlJvdmluZ0ZvY3VzR3JvdXBJdGVtXCI7XG52YXIgUm92aW5nRm9jdXNHcm91cEl0ZW0gPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAocHJvcHMsIGZvcndhcmRlZFJlZikgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIF9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwLFxuICAgICAgZm9jdXNhYmxlID0gdHJ1ZSxcbiAgICAgIGFjdGl2ZSA9IGZhbHNlLFxuICAgICAgdGFiU3RvcElkLFxuICAgICAgLi4uaXRlbVByb3BzXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IGF1dG9JZCA9IHVzZUlkKCk7XG4gICAgY29uc3QgaWQgPSB0YWJTdG9wSWQgfHwgYXV0b0lkO1xuICAgIGNvbnN0IGNvbnRleHQgPSB1c2VSb3ZpbmdGb2N1c0NvbnRleHQoSVRFTV9OQU1FLCBfX3Njb3BlUm92aW5nRm9jdXNHcm91cCk7XG4gICAgY29uc3QgaXNDdXJyZW50VGFiU3RvcCA9IGNvbnRleHQuY3VycmVudFRhYlN0b3BJZCA9PT0gaWQ7XG4gICAgY29uc3QgZ2V0SXRlbXMgPSB1c2VDb2xsZWN0aW9uKF9fc2NvcGVSb3ZpbmdGb2N1c0dyb3VwKTtcbiAgICBjb25zdCB7IG9uRm9jdXNhYmxlSXRlbUFkZCwgb25Gb2N1c2FibGVJdGVtUmVtb3ZlIH0gPSBjb250ZXh0O1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoZm9jdXNhYmxlKSB7XG4gICAgICAgIG9uRm9jdXNhYmxlSXRlbUFkZCgpO1xuICAgICAgICByZXR1cm4gKCkgPT4gb25Gb2N1c2FibGVJdGVtUmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSwgW2ZvY3VzYWJsZSwgb25Gb2N1c2FibGVJdGVtQWRkLCBvbkZvY3VzYWJsZUl0ZW1SZW1vdmVdKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgIENvbGxlY3Rpb24uSXRlbVNsb3QsXG4gICAgICB7XG4gICAgICAgIHNjb3BlOiBfX3Njb3BlUm92aW5nRm9jdXNHcm91cCxcbiAgICAgICAgaWQsXG4gICAgICAgIGZvY3VzYWJsZSxcbiAgICAgICAgYWN0aXZlLFxuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgICBQcmltaXRpdmUuc3BhbixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YWJJbmRleDogaXNDdXJyZW50VGFiU3RvcCA/IDAgOiAtMSxcbiAgICAgICAgICAgIFwiZGF0YS1vcmllbnRhdGlvblwiOiBjb250ZXh0Lm9yaWVudGF0aW9uLFxuICAgICAgICAgICAgLi4uaXRlbVByb3BzLFxuICAgICAgICAgICAgcmVmOiBmb3J3YXJkZWRSZWYsXG4gICAgICAgICAgICBvbk1vdXNlRG93bjogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Nb3VzZURvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWZvY3VzYWJsZSkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgZWxzZSBjb250ZXh0Lm9uSXRlbUZvY3VzKGlkKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgb25Gb2N1czogY29tcG9zZUV2ZW50SGFuZGxlcnMocHJvcHMub25Gb2N1cywgKCkgPT4gY29udGV4dC5vbkl0ZW1Gb2N1cyhpZCkpLFxuICAgICAgICAgICAgb25LZXlEb3duOiBjb21wb3NlRXZlbnRIYW5kbGVycyhwcm9wcy5vbktleURvd24sIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIlRhYlwiICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5vbkl0ZW1TaGlmdFRhYigpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBldmVudC5jdXJyZW50VGFyZ2V0KSByZXR1cm47XG4gICAgICAgICAgICAgIGNvbnN0IGZvY3VzSW50ZW50ID0gZ2V0Rm9jdXNJbnRlbnQoZXZlbnQsIGNvbnRleHQub3JpZW50YXRpb24sIGNvbnRleHQuZGlyKTtcbiAgICAgICAgICAgICAgaWYgKGZvY3VzSW50ZW50ICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5zaGlmdEtleSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRJdGVtcygpLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5mb2N1c2FibGUpO1xuICAgICAgICAgICAgICAgIGxldCBjYW5kaWRhdGVOb2RlcyA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5yZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGZvY3VzSW50ZW50ID09PSBcImxhc3RcIikgY2FuZGlkYXRlTm9kZXMucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvY3VzSW50ZW50ID09PSBcInByZXZcIiB8fCBmb2N1c0ludGVudCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmb2N1c0ludGVudCA9PT0gXCJwcmV2XCIpIGNhbmRpZGF0ZU5vZGVzLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGNhbmRpZGF0ZU5vZGVzLmluZGV4T2YoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICAgICAgICBjYW5kaWRhdGVOb2RlcyA9IGNvbnRleHQubG9vcCA/IHdyYXBBcnJheShjYW5kaWRhdGVOb2RlcywgY3VycmVudEluZGV4ICsgMSkgOiBjYW5kaWRhdGVOb2Rlcy5zbGljZShjdXJyZW50SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBmb2N1c0ZpcnN0KGNhbmRpZGF0ZU5vZGVzKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgKTtcbiAgfVxuKTtcblJvdmluZ0ZvY3VzR3JvdXBJdGVtLmRpc3BsYXlOYW1lID0gSVRFTV9OQU1FO1xudmFyIE1BUF9LRVlfVE9fRk9DVVNfSU5URU5UID0ge1xuICBBcnJvd0xlZnQ6IFwicHJldlwiLFxuICBBcnJvd1VwOiBcInByZXZcIixcbiAgQXJyb3dSaWdodDogXCJuZXh0XCIsXG4gIEFycm93RG93bjogXCJuZXh0XCIsXG4gIFBhZ2VVcDogXCJmaXJzdFwiLFxuICBIb21lOiBcImZpcnN0XCIsXG4gIFBhZ2VEb3duOiBcImxhc3RcIixcbiAgRW5kOiBcImxhc3RcIlxufTtcbmZ1bmN0aW9uIGdldERpcmVjdGlvbkF3YXJlS2V5KGtleSwgZGlyKSB7XG4gIGlmIChkaXIgIT09IFwicnRsXCIpIHJldHVybiBrZXk7XG4gIHJldHVybiBrZXkgPT09IFwiQXJyb3dMZWZ0XCIgPyBcIkFycm93UmlnaHRcIiA6IGtleSA9PT0gXCJBcnJvd1JpZ2h0XCIgPyBcIkFycm93TGVmdFwiIDoga2V5O1xufVxuZnVuY3Rpb24gZ2V0Rm9jdXNJbnRlbnQoZXZlbnQsIG9yaWVudGF0aW9uLCBkaXIpIHtcbiAgY29uc3Qga2V5ID0gZ2V0RGlyZWN0aW9uQXdhcmVLZXkoZXZlbnQua2V5LCBkaXIpO1xuICBpZiAob3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiAmJiBbXCJBcnJvd0xlZnRcIiwgXCJBcnJvd1JpZ2h0XCJdLmluY2x1ZGVzKGtleSkpIHJldHVybiB2b2lkIDA7XG4gIGlmIChvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIgJiYgW1wiQXJyb3dVcFwiLCBcIkFycm93RG93blwiXS5pbmNsdWRlcyhrZXkpKSByZXR1cm4gdm9pZCAwO1xuICByZXR1cm4gTUFQX0tFWV9UT19GT0NVU19JTlRFTlRba2V5XTtcbn1cbmZ1bmN0aW9uIGZvY3VzRmlyc3QoY2FuZGlkYXRlcywgcHJldmVudFNjcm9sbCA9IGZhbHNlKSB7XG4gIGNvbnN0IFBSRVZJT1VTTFlfRk9DVVNFRF9FTEVNRU5UID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChjYW5kaWRhdGUgPT09IFBSRVZJT1VTTFlfRk9DVVNFRF9FTEVNRU5UKSByZXR1cm47XG4gICAgY2FuZGlkYXRlLmZvY3VzKHsgcHJldmVudFNjcm9sbCB9KTtcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gUFJFVklPVVNMWV9GT0NVU0VEX0VMRU1FTlQpIHJldHVybjtcbiAgfVxufVxuZnVuY3Rpb24gd3JhcEFycmF5KGFycmF5LCBzdGFydEluZGV4KSB7XG4gIHJldHVybiBhcnJheS5tYXAoKF8sIGluZGV4KSA9PiBhcnJheVsoc3RhcnRJbmRleCArIGluZGV4KSAlIGFycmF5Lmxlbmd0aF0pO1xufVxudmFyIFJvb3QgPSBSb3ZpbmdGb2N1c0dyb3VwO1xudmFyIEl0ZW0gPSBSb3ZpbmdGb2N1c0dyb3VwSXRlbTtcbmV4cG9ydCB7XG4gIEl0ZW0sXG4gIFJvb3QsXG4gIFJvdmluZ0ZvY3VzR3JvdXAsXG4gIFJvdmluZ0ZvY3VzR3JvdXBJdGVtLFxuICBjcmVhdGVSb3ZpbmdGb2N1c0dyb3VwU2NvcGVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC9zbG90L3NyYy9TbG90LnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjb21wb3NlUmVmcyB9IGZyb20gXCJAcmFkaXgtdWkvcmVhY3QtY29tcG9zZS1yZWZzXCI7XG5pbXBvcnQgeyBGcmFnbWVudCwganN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG52YXIgU2xvdCA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBjaGlsZHJlbiwgLi4uc2xvdFByb3BzIH0gPSBwcm9wcztcbiAgY29uc3QgY2hpbGRyZW5BcnJheSA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pO1xuICBjb25zdCBzbG90dGFibGUgPSBjaGlsZHJlbkFycmF5LmZpbmQoaXNTbG90dGFibGUpO1xuICBpZiAoc2xvdHRhYmxlKSB7XG4gICAgY29uc3QgbmV3RWxlbWVudCA9IHNsb3R0YWJsZS5wcm9wcy5jaGlsZHJlbjtcbiAgICBjb25zdCBuZXdDaGlsZHJlbiA9IGNoaWxkcmVuQXJyYXkubWFwKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkID09PSBzbG90dGFibGUpIHtcbiAgICAgICAgaWYgKFJlYWN0LkNoaWxkcmVuLmNvdW50KG5ld0VsZW1lbnQpID4gMSkgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLm9ubHkobnVsbCk7XG4gICAgICAgIHJldHVybiBSZWFjdC5pc1ZhbGlkRWxlbWVudChuZXdFbGVtZW50KSA/IG5ld0VsZW1lbnQucHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFNsb3RDbG9uZSwgeyAuLi5zbG90UHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmLCBjaGlsZHJlbjogUmVhY3QuaXNWYWxpZEVsZW1lbnQobmV3RWxlbWVudCkgPyBSZWFjdC5jbG9uZUVsZW1lbnQobmV3RWxlbWVudCwgdm9pZCAwLCBuZXdDaGlsZHJlbikgOiBudWxsIH0pO1xuICB9XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KFNsb3RDbG9uZSwgeyAuLi5zbG90UHJvcHMsIHJlZjogZm9yd2FyZGVkUmVmLCBjaGlsZHJlbiB9KTtcbn0pO1xuU2xvdC5kaXNwbGF5TmFtZSA9IFwiU2xvdFwiO1xudmFyIFNsb3RDbG9uZSA9IFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCBmb3J3YXJkZWRSZWYpID0+IHtcbiAgY29uc3QgeyBjaGlsZHJlbiwgLi4uc2xvdFByb3BzIH0gPSBwcm9wcztcbiAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIGNvbnN0IGNoaWxkcmVuUmVmID0gZ2V0RWxlbWVudFJlZihjaGlsZHJlbik7XG4gICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwge1xuICAgICAgLi4ubWVyZ2VQcm9wcyhzbG90UHJvcHMsIGNoaWxkcmVuLnByb3BzKSxcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJlZjogZm9yd2FyZGVkUmVmID8gY29tcG9zZVJlZnMoZm9yd2FyZGVkUmVmLCBjaGlsZHJlblJlZikgOiBjaGlsZHJlblJlZlxuICAgIH0pO1xuICB9XG4gIHJldHVybiBSZWFjdC5DaGlsZHJlbi5jb3VudChjaGlsZHJlbikgPiAxID8gUmVhY3QuQ2hpbGRyZW4ub25seShudWxsKSA6IG51bGw7XG59KTtcblNsb3RDbG9uZS5kaXNwbGF5TmFtZSA9IFwiU2xvdENsb25lXCI7XG52YXIgU2xvdHRhYmxlID0gKHsgY2hpbGRyZW4gfSkgPT4ge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChGcmFnbWVudCwgeyBjaGlsZHJlbiB9KTtcbn07XG5mdW5jdGlvbiBpc1Nsb3R0YWJsZShjaGlsZCkge1xuICByZXR1cm4gUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIGNoaWxkLnR5cGUgPT09IFNsb3R0YWJsZTtcbn1cbmZ1bmN0aW9uIG1lcmdlUHJvcHMoc2xvdFByb3BzLCBjaGlsZFByb3BzKSB7XG4gIGNvbnN0IG92ZXJyaWRlUHJvcHMgPSB7IC4uLmNoaWxkUHJvcHMgfTtcbiAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiBjaGlsZFByb3BzKSB7XG4gICAgY29uc3Qgc2xvdFByb3BWYWx1ZSA9IHNsb3RQcm9wc1twcm9wTmFtZV07XG4gICAgY29uc3QgY2hpbGRQcm9wVmFsdWUgPSBjaGlsZFByb3BzW3Byb3BOYW1lXTtcbiAgICBjb25zdCBpc0hhbmRsZXIgPSAvXm9uW0EtWl0vLnRlc3QocHJvcE5hbWUpO1xuICAgIGlmIChpc0hhbmRsZXIpIHtcbiAgICAgIGlmIChzbG90UHJvcFZhbHVlICYmIGNoaWxkUHJvcFZhbHVlKSB7XG4gICAgICAgIG92ZXJyaWRlUHJvcHNbcHJvcE5hbWVdID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBjaGlsZFByb3BWYWx1ZSguLi5hcmdzKTtcbiAgICAgICAgICBzbG90UHJvcFZhbHVlKC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChzbG90UHJvcFZhbHVlKSB7XG4gICAgICAgIG92ZXJyaWRlUHJvcHNbcHJvcE5hbWVdID0gc2xvdFByb3BWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgIG92ZXJyaWRlUHJvcHNbcHJvcE5hbWVdID0geyAuLi5zbG90UHJvcFZhbHVlLCAuLi5jaGlsZFByb3BWYWx1ZSB9O1xuICAgIH0gZWxzZSBpZiAocHJvcE5hbWUgPT09IFwiY2xhc3NOYW1lXCIpIHtcbiAgICAgIG92ZXJyaWRlUHJvcHNbcHJvcE5hbWVdID0gW3Nsb3RQcm9wVmFsdWUsIGNoaWxkUHJvcFZhbHVlXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IC4uLnNsb3RQcm9wcywgLi4ub3ZlcnJpZGVQcm9wcyB9O1xufVxuZnVuY3Rpb24gZ2V0RWxlbWVudFJlZihlbGVtZW50KSB7XG4gIGxldCBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVsZW1lbnQucHJvcHMsIFwicmVmXCIpPy5nZXQ7XG4gIGxldCBtYXlXYXJuID0gZ2V0dGVyICYmIFwiaXNSZWFjdFdhcm5pbmdcIiBpbiBnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nO1xuICBpZiAobWF5V2Fybikge1xuICAgIHJldHVybiBlbGVtZW50LnJlZjtcbiAgfVxuICBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVsZW1lbnQsIFwicmVmXCIpPy5nZXQ7XG4gIG1heVdhcm4gPSBnZXR0ZXIgJiYgXCJpc1JlYWN0V2FybmluZ1wiIGluIGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmc7XG4gIGlmIChtYXlXYXJuKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQucHJvcHMucmVmO1xuICB9XG4gIHJldHVybiBlbGVtZW50LnByb3BzLnJlZiB8fCBlbGVtZW50LnJlZjtcbn1cbnZhciBSb290ID0gU2xvdDtcbmV4cG9ydCB7XG4gIFJvb3QsXG4gIFNsb3QsXG4gIFNsb3R0YWJsZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L3VzZS1jYWxsYmFjay1yZWYvc3JjL3VzZUNhbGxiYWNrUmVmLnRzeFxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5mdW5jdGlvbiB1c2VDYWxsYmFja1JlZihjYWxsYmFjaykge1xuICBjb25zdCBjYWxsYmFja1JlZiA9IFJlYWN0LnVzZVJlZihjYWxsYmFjayk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY2FsbGJhY2tSZWYuY3VycmVudCA9IGNhbGxiYWNrO1xuICB9KTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4gKC4uLmFyZ3MpID0+IGNhbGxiYWNrUmVmLmN1cnJlbnQ/LiguLi5hcmdzKSwgW10pO1xufVxuZXhwb3J0IHtcbiAgdXNlQ2FsbGJhY2tSZWZcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC91c2UtY29udHJvbGxhYmxlLXN0YXRlL3NyYy91c2VDb250cm9sbGFibGVTdGF0ZS50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWZcIjtcbmZ1bmN0aW9uIHVzZUNvbnRyb2xsYWJsZVN0YXRlKHtcbiAgcHJvcCxcbiAgZGVmYXVsdFByb3AsXG4gIG9uQ2hhbmdlID0gKCkgPT4ge1xuICB9XG59KSB7XG4gIGNvbnN0IFt1bmNvbnRyb2xsZWRQcm9wLCBzZXRVbmNvbnRyb2xsZWRQcm9wXSA9IHVzZVVuY29udHJvbGxlZFN0YXRlKHsgZGVmYXVsdFByb3AsIG9uQ2hhbmdlIH0pO1xuICBjb25zdCBpc0NvbnRyb2xsZWQgPSBwcm9wICE9PSB2b2lkIDA7XG4gIGNvbnN0IHZhbHVlID0gaXNDb250cm9sbGVkID8gcHJvcCA6IHVuY29udHJvbGxlZFByb3A7XG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrUmVmKG9uQ2hhbmdlKTtcbiAgY29uc3Qgc2V0VmFsdWUgPSBSZWFjdC51c2VDYWxsYmFjayhcbiAgICAobmV4dFZhbHVlKSA9PiB7XG4gICAgICBpZiAoaXNDb250cm9sbGVkKSB7XG4gICAgICAgIGNvbnN0IHNldHRlciA9IG5leHRWYWx1ZTtcbiAgICAgICAgY29uc3QgdmFsdWUyID0gdHlwZW9mIG5leHRWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gc2V0dGVyKHByb3ApIDogbmV4dFZhbHVlO1xuICAgICAgICBpZiAodmFsdWUyICE9PSBwcm9wKSBoYW5kbGVDaGFuZ2UodmFsdWUyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFVuY29udHJvbGxlZFByb3AobmV4dFZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtpc0NvbnRyb2xsZWQsIHByb3AsIHNldFVuY29udHJvbGxlZFByb3AsIGhhbmRsZUNoYW5nZV1cbiAgKTtcbiAgcmV0dXJuIFt2YWx1ZSwgc2V0VmFsdWVdO1xufVxuZnVuY3Rpb24gdXNlVW5jb250cm9sbGVkU3RhdGUoe1xuICBkZWZhdWx0UHJvcCxcbiAgb25DaGFuZ2Vcbn0pIHtcbiAgY29uc3QgdW5jb250cm9sbGVkU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShkZWZhdWx0UHJvcCk7XG4gIGNvbnN0IFt2YWx1ZV0gPSB1bmNvbnRyb2xsZWRTdGF0ZTtcbiAgY29uc3QgcHJldlZhbHVlUmVmID0gUmVhY3QudXNlUmVmKHZhbHVlKTtcbiAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2tSZWYob25DaGFuZ2UpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwcmV2VmFsdWVSZWYuY3VycmVudCAhPT0gdmFsdWUpIHtcbiAgICAgIGhhbmRsZUNoYW5nZSh2YWx1ZSk7XG4gICAgICBwcmV2VmFsdWVSZWYuY3VycmVudCA9IHZhbHVlO1xuICAgIH1cbiAgfSwgW3ZhbHVlLCBwcmV2VmFsdWVSZWYsIGhhbmRsZUNoYW5nZV0pO1xuICByZXR1cm4gdW5jb250cm9sbGVkU3RhdGU7XG59XG5leHBvcnQge1xuICB1c2VDb250cm9sbGFibGVTdGF0ZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L3VzZS1lc2NhcGUta2V5ZG93bi9zcmMvdXNlRXNjYXBlS2V5ZG93bi50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2tSZWYgfSBmcm9tIFwiQHJhZGl4LXVpL3JlYWN0LXVzZS1jYWxsYmFjay1yZWZcIjtcbmZ1bmN0aW9uIHVzZUVzY2FwZUtleWRvd24ob25Fc2NhcGVLZXlEb3duUHJvcCwgb3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXM/LmRvY3VtZW50KSB7XG4gIGNvbnN0IG9uRXNjYXBlS2V5RG93biA9IHVzZUNhbGxiYWNrUmVmKG9uRXNjYXBlS2V5RG93blByb3ApO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgb25Fc2NhcGVLZXlEb3duKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIG93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93biwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIHJldHVybiAoKSA9PiBvd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfSwgW29uRXNjYXBlS2V5RG93biwgb3duZXJEb2N1bWVudF0pO1xufVxuZXhwb3J0IHtcbiAgdXNlRXNjYXBlS2V5ZG93blxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8vIHBhY2thZ2VzL3JlYWN0L3VzZS1sYXlvdXQtZWZmZWN0L3NyYy91c2VMYXlvdXRFZmZlY3QudHN4XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbnZhciB1c2VMYXlvdXRFZmZlY3QyID0gQm9vbGVhbihnbG9iYWxUaGlzPy5kb2N1bWVudCkgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiAoKSA9PiB7XG59O1xuZXhwb3J0IHtcbiAgdXNlTGF5b3V0RWZmZWN0MiBhcyB1c2VMYXlvdXRFZmZlY3Rcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iLCIvLyBwYWNrYWdlcy9yZWFjdC91c2Utc2l6ZS9zcmMvdXNlU2l6ZS50c3hcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSBcIkByYWRpeC11aS9yZWFjdC11c2UtbGF5b3V0LWVmZmVjdFwiO1xuZnVuY3Rpb24gdXNlU2l6ZShlbGVtZW50KSB7XG4gIGNvbnN0IFtzaXplLCBzZXRTaXplXSA9IFJlYWN0LnVzZVN0YXRlKHZvaWQgMCk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHNldFNpemUoeyB3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCwgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodCB9KTtcbiAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyaWVzKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1swXTtcbiAgICAgICAgbGV0IHdpZHRoO1xuICAgICAgICBsZXQgaGVpZ2h0O1xuICAgICAgICBpZiAoXCJib3JkZXJCb3hTaXplXCIgaW4gZW50cnkpIHtcbiAgICAgICAgICBjb25zdCBib3JkZXJTaXplRW50cnkgPSBlbnRyeVtcImJvcmRlckJveFNpemVcIl07XG4gICAgICAgICAgY29uc3QgYm9yZGVyU2l6ZSA9IEFycmF5LmlzQXJyYXkoYm9yZGVyU2l6ZUVudHJ5KSA/IGJvcmRlclNpemVFbnRyeVswXSA6IGJvcmRlclNpemVFbnRyeTtcbiAgICAgICAgICB3aWR0aCA9IGJvcmRlclNpemVbXCJpbmxpbmVTaXplXCJdO1xuICAgICAgICAgIGhlaWdodCA9IGJvcmRlclNpemVbXCJibG9ja1NpemVcIl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgIGhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHNldFNpemUoeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgICAgfSk7XG4gICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHsgYm94OiBcImJvcmRlci1ib3hcIiB9KTtcbiAgICAgIHJldHVybiAoKSA9PiByZXNpemVPYnNlcnZlci51bm9ic2VydmUoZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNpemUodm9pZCAwKTtcbiAgICB9XG4gIH0sIFtlbGVtZW50XSk7XG4gIHJldHVybiBzaXplO1xufVxuZXhwb3J0IHtcbiAgdXNlU2l6ZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4Lm1qcy5tYXBcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscywgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24gKi8gaW1wb3J0IHsgbWFrZVJlcXVlc3RDYWxsLCBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXIgfSBmcm9tICcuL21ha2VSZXF1ZXN0Q2FsbC5qcyc7XG5leHBvcnQgY2xhc3MgQXNhcFF1ZXVlIHtcbiAgICAvLyBVc2UgdGhlIGZhc3Rlc3QgbWVhbnMgcG9zc2libGUgdG8gZXhlY3V0ZSBhIHRhc2sgaW4gaXRzIG93biB0dXJuLCB3aXRoXG4gICAgLy8gcHJpb3JpdHkgb3ZlciBvdGhlciBldmVudHMgaW5jbHVkaW5nIElPLCBhbmltYXRpb24sIHJlZmxvdywgYW5kIHJlZHJhd1xuICAgIC8vIGV2ZW50cyBpbiBicm93c2Vycy5cbiAgICAvL1xuICAgIC8vIEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYSB0YXNrIHdpbGwgcGVybWFuZW50bHkgaW50ZXJydXB0IHRoZSBwcm9jZXNzaW5nIG9mXG4gICAgLy8gc3Vic2VxdWVudCB0YXNrcy4gVGhlIGhpZ2hlciBsZXZlbCBgYXNhcGAgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGlmIGFuXG4gICAgLy8gZXhjZXB0aW9uIGlzIHRocm93biBieSBhIHRhc2ssIHRoYXQgdGhlIHRhc2sgcXVldWUgd2lsbCBjb250aW51ZSBmbHVzaGluZyBhc1xuICAgIC8vIHNvb24gYXMgcG9zc2libGUsIGJ1dCBpZiB5b3UgdXNlIGByYXdBc2FwYCBkaXJlY3RseSwgeW91IGFyZSByZXNwb25zaWJsZSB0b1xuICAgIC8vIGVpdGhlciBlbnN1cmUgdGhhdCBubyBleGNlcHRpb25zIGFyZSB0aHJvd24gZnJvbSB5b3VyIHRhc2ssIG9yIHRvIG1hbnVhbGx5XG4gICAgLy8gY2FsbCBgcmF3QXNhcC5yZXF1ZXN0Rmx1c2hgIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG4gICAgZW5xdWV1ZVRhc2sodGFzaykge1xuICAgICAgICBjb25zdCB7IHF1ZXVlOiBxICwgcmVxdWVzdEZsdXNoICB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFxLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVxdWVzdEZsdXNoKCk7XG4gICAgICAgICAgICB0aGlzLmZsdXNoaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFcXVpdmFsZW50IHRvIHB1c2gsIGJ1dCBhdm9pZHMgYSBmdW5jdGlvbiBjYWxsLlxuICAgICAgICBxW3EubGVuZ3RoXSA9IHRhc2s7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgLy8gV2UgcXVldWUgZXJyb3JzIHRvIGVuc3VyZSB0aGV5IGFyZSB0aHJvd24gaW4gcmlnaHQgb3JkZXIgKEZJRk8pLlxuICAgICAgICAvLyBBcnJheS1hcy1xdWV1ZSBpcyBnb29kIGVub3VnaCBoZXJlLCBzaW5jZSB3ZSBhcmUganVzdCBkZWFsaW5nIHdpdGggZXhjZXB0aW9ucy5cbiAgICAgICAgdGhpcy5wZW5kaW5nRXJyb3JzID0gW107XG4gICAgICAgIC8vIE9uY2UgYSBmbHVzaCBoYXMgYmVlbiByZXF1ZXN0ZWQsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gYHJlcXVlc3RGbHVzaGAgYXJlXG4gICAgICAgIC8vIG5lY2Vzc2FyeSB1bnRpbCB0aGUgbmV4dCBgZmx1c2hgIGNvbXBsZXRlcy5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmZsdXNoaW5nID0gZmFsc2U7XG4gICAgICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCB0YXNrIHRvIGV4ZWN1dGUgaW4gdGhlIHRhc2sgcXVldWUuIFRoaXMgaXNcbiAgICAgICAgLy8gcHJlc2VydmVkIGJldHdlZW4gY2FsbHMgdG8gYGZsdXNoYCBzbyB0aGF0IGl0IGNhbiBiZSByZXN1bWVkIGlmXG4gICAgICAgIC8vIGEgdGFzayB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgLy8gSWYgYSB0YXNrIHNjaGVkdWxlcyBhZGRpdGlvbmFsIHRhc2tzIHJlY3Vyc2l2ZWx5LCB0aGUgdGFzayBxdWV1ZSBjYW4gZ3Jvd1xuICAgICAgICAvLyB1bmJvdW5kZWQuIFRvIHByZXZlbnQgbWVtb3J5IGV4aGF1c3Rpb24sIHRoZSB0YXNrIHF1ZXVlIHdpbGwgcGVyaW9kaWNhbGx5XG4gICAgICAgIC8vIHRydW5jYXRlIGFscmVhZHktY29tcGxldGVkIHRhc2tzLlxuICAgICAgICB0aGlzLmNhcGFjaXR5ID0gMTAyNDtcbiAgICAgICAgLy8gVGhlIGZsdXNoIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbGwgdGFza3MgdGhhdCBoYXZlIGJlZW4gc2NoZWR1bGVkIHdpdGhcbiAgICAgICAgLy8gYHJhd0FzYXBgIHVubGVzcyBhbmQgdW50aWwgb25lIG9mIHRob3NlIHRhc2tzIHRocm93cyBhbiBleGNlcHRpb24uXG4gICAgICAgIC8vIElmIGEgdGFzayB0aHJvd3MgYW4gZXhjZXB0aW9uLCBgZmx1c2hgIGVuc3VyZXMgdGhhdCBpdHMgc3RhdGUgd2lsbCByZW1haW5cbiAgICAgICAgLy8gY29uc2lzdGVudCBhbmQgd2lsbCByZXN1bWUgd2hlcmUgaXQgbGVmdCBvZmYgd2hlbiBjYWxsZWQgYWdhaW4uXG4gICAgICAgIC8vIEhvd2V2ZXIsIGBmbHVzaGAgZG9lcyBub3QgbWFrZSBhbnkgYXJyYW5nZW1lbnRzIHRvIGJlIGNhbGxlZCBhZ2FpbiBpZiBhblxuICAgICAgICAvLyBleGNlcHRpb24gaXMgdGhyb3duLlxuICAgICAgICB0aGlzLmZsdXNoID0gKCk9PntcbiAgICAgICAgICAgIGNvbnN0IHsgcXVldWU6IHEgIH0gPSB0aGlzO1xuICAgICAgICAgICAgd2hpbGUodGhpcy5pbmRleCA8IHEubGVuZ3RoKXtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICAgICAgICAgIC8vIEFkdmFuY2UgdGhlIGluZGV4IGJlZm9yZSBjYWxsaW5nIHRoZSB0YXNrLiBUaGlzIGVuc3VyZXMgdGhhdCB3ZSB3aWxsXG4gICAgICAgICAgICAgICAgLy8gYmVnaW4gZmx1c2hpbmcgb24gdGhlIG5leHQgdGFzayB0aGUgdGFzayB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICAgICAgICAgIHFbY3VycmVudEluZGV4XS5jYWxsKCk7XG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBsZWFraW5nIG1lbW9yeSBmb3IgbG9uZyBjaGFpbnMgb2YgcmVjdXJzaXZlIGNhbGxzIHRvIGBhc2FwYC5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjYWxsIGBhc2FwYCB3aXRoaW4gdGFza3Mgc2NoZWR1bGVkIGJ5IGBhc2FwYCwgdGhlIHF1ZXVlIHdpbGxcbiAgICAgICAgICAgICAgICAvLyBncm93LCBidXQgdG8gYXZvaWQgYW4gTyhuKSB3YWxrIGZvciBldmVyeSB0YXNrIHdlIGV4ZWN1dGUsIHdlIGRvbid0XG4gICAgICAgICAgICAgICAgLy8gc2hpZnQgdGFza3Mgb2ZmIHRoZSBxdWV1ZSBhZnRlciB0aGV5IGhhdmUgYmVlbiBleGVjdXRlZC5cbiAgICAgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBwZXJpb2RpY2FsbHkgc2hpZnQgMTAyNCB0YXNrcyBvZmYgdGhlIHF1ZXVlLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ID4gdGhpcy5jYXBhY2l0eSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYW51YWxseSBzaGlmdCBhbGwgdmFsdWVzIHN0YXJ0aW5nIGF0IHRoZSBpbmRleCBiYWNrIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlLlxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHNjYW4gPSAwLCBuZXdMZW5ndGggPSBxLmxlbmd0aCAtIHRoaXMuaW5kZXg7IHNjYW4gPCBuZXdMZW5ndGg7IHNjYW4rKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBxW3NjYW5dID0gcVtzY2FuICsgdGhpcy5pbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcS5sZW5ndGggLT0gdGhpcy5pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgICAgICB0aGlzLmZsdXNoaW5nID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIC8vIEluIGEgd2ViIGJyb3dzZXIsIGV4Y2VwdGlvbnMgYXJlIG5vdCBmYXRhbC4gSG93ZXZlciwgdG8gYXZvaWRcbiAgICAgICAgLy8gc2xvd2luZyBkb3duIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIHRhc2tzLCB3ZSByZXRocm93IHRoZSBlcnJvciBpbiBhXG4gICAgICAgIC8vIGxvd2VyIHByaW9yaXR5IHR1cm4uXG4gICAgICAgIHRoaXMucmVnaXN0ZXJQZW5kaW5nRXJyb3IgPSAoZXJyKT0+e1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nRXJyb3JzLnB1c2goZXJyKTtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdEVycm9yVGhyb3coKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gYHJlcXVlc3RGbHVzaGAgcmVxdWVzdHMgdGhhdCB0aGUgaGlnaCBwcmlvcml0eSBldmVudCBxdWV1ZSBiZSBmbHVzaGVkIGFzXG4gICAgICAgIC8vIHNvb24gYXMgcG9zc2libGUuXG4gICAgICAgIC8vIFRoaXMgaXMgdXNlZnVsIHRvIHByZXZlbnQgYW4gZXJyb3IgdGhyb3duIGluIGEgdGFzayBmcm9tIHN0YWxsaW5nIHRoZSBldmVudFxuICAgICAgICAvLyBxdWV1ZSBpZiB0aGUgZXhjZXB0aW9uIGhhbmRsZWQgYnkgTm9kZS5qc+KAmXNcbiAgICAgICAgLy8gYHByb2Nlc3Mub24oXCJ1bmNhdWdodEV4Y2VwdGlvblwiKWAgb3IgYnkgYSBkb21haW4uXG4gICAgICAgIC8vIGByZXF1ZXN0Rmx1c2hgIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgc3RyYXRlZ3kgYmFzZWQgb24gZGF0YSBjb2xsZWN0ZWQgZnJvbVxuICAgICAgICAvLyBldmVyeSBhdmFpbGFibGUgU2F1Y2VMYWJzIFNlbGVuaXVtIHdlYiBkcml2ZXIgd29ya2VyIGF0IHRpbWUgb2Ygd3JpdGluZy5cbiAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMW1HLTVVWUd1cDVxeEdkRU1Xa2hQNkJXQ3owNTNOVWIyRTFRb1VUVTE2dUEvZWRpdCNnaWQ9NzgzNzI0NTkzXG4gICAgICAgIHRoaXMucmVxdWVzdEZsdXNoID0gbWFrZVJlcXVlc3RDYWxsKHRoaXMuZmx1c2gpO1xuICAgICAgICB0aGlzLnJlcXVlc3RFcnJvclRocm93ID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKCgpPT57XG4gICAgICAgICAgICAvLyBUaHJvdyBmaXJzdCBlcnJvclxuICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ0Vycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLnBlbmRpbmdFcnJvcnMuc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufSAvLyBUaGUgbWVzc2FnZSBjaGFubmVsIHRlY2huaXF1ZSB3YXMgZGlzY292ZXJlZCBieSBNYWx0ZSBVYmwgYW5kIHdhcyB0aGVcbiAvLyBvcmlnaW5hbCBmb3VuZGF0aW9uIGZvciB0aGlzIGxpYnJhcnkuXG4gLy8gaHR0cDovL3d3dy5ub25ibG9ja2luZy5pby8yMDExLzA2L3dpbmRvd25leHR0aWNrLmh0bWxcbiAvLyBTYWZhcmkgNi4wLjUgKGF0IGxlYXN0KSBpbnRlcm1pdHRlbnRseSBmYWlscyB0byBjcmVhdGUgbWVzc2FnZSBwb3J0cyBvbiBhXG4gLy8gcGFnZSdzIGZpcnN0IGxvYWQuIFRoYW5rZnVsbHksIHRoaXMgdmVyc2lvbiBvZiBTYWZhcmkgc3VwcG9ydHNcbiAvLyBNdXRhdGlvbk9ic2VydmVycywgc28gd2UgZG9uJ3QgbmVlZCB0byBmYWxsIGJhY2sgaW4gdGhhdCBjYXNlLlxuIC8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21NZXNzYWdlQ2hhbm5lbChjYWxsYmFjaykge1xuIC8vICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuIC8vICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuIC8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4gLy8gICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuIC8vICAgICB9O1xuIC8vIH1cbiAvLyBGb3IgcmVhc29ucyBleHBsYWluZWQgYWJvdmUsIHdlIGFyZSBhbHNvIHVuYWJsZSB0byB1c2UgYHNldEltbWVkaWF0ZWBcbiAvLyB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy5cbiAvLyBFdmVuIGlmIHdlIHdlcmUsIHRoZXJlIGlzIGFub3RoZXIgYnVnIGluIEludGVybmV0IEV4cGxvcmVyIDEwLlxuIC8vIEl0IGlzIG5vdCBzdWZmaWNpZW50IHRvIGFzc2lnbiBgc2V0SW1tZWRpYXRlYCB0byBgcmVxdWVzdEZsdXNoYCBiZWNhdXNlXG4gLy8gYHNldEltbWVkaWF0ZWAgbXVzdCBiZSBjYWxsZWQgKmJ5IG5hbWUqIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSB3cmFwcGVkIGluIGFcbiAvLyBjbG9zdXJlLlxuIC8vIE5ldmVyIGZvcmdldC5cbiAvLyBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tU2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4gLy8gICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAvLyAgICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4gLy8gICAgIH07XG4gLy8gfVxuIC8vIFNhZmFyaSA2LjAgaGFzIGEgcHJvYmxlbSB3aGVyZSB0aW1lcnMgd2lsbCBnZXQgbG9zdCB3aGlsZSB0aGUgdXNlciBpc1xuIC8vIHNjcm9sbGluZy4gVGhpcyBwcm9ibGVtIGRvZXMgbm90IGltcGFjdCBBU0FQIGJlY2F1c2UgU2FmYXJpIDYuMCBzdXBwb3J0c1xuIC8vIG11dGF0aW9uIG9ic2VydmVycywgc28gdGhhdCBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIGluc3RlYWQuXG4gLy8gSG93ZXZlciwgaWYgd2UgZXZlciBlbGVjdCB0byB1c2UgdGltZXJzIGluIFNhZmFyaSwgdGhlIHByZXZhbGVudCB3b3JrLWFyb3VuZFxuIC8vIGlzIHRvIGFkZCBhIHNjcm9sbCBldmVudCBsaXN0ZW5lciB0aGF0IGNhbGxzIGZvciBhIGZsdXNoLlxuIC8vIGBzZXRUaW1lb3V0YCBkb2VzIG5vdCBjYWxsIHRoZSBwYXNzZWQgY2FsbGJhY2sgaWYgdGhlIGRlbGF5IGlzIGxlc3MgdGhhblxuIC8vIGFwcHJveGltYXRlbHkgNyBpbiB3ZWIgd29ya2VycyBpbiBGaXJlZm94IDggdGhyb3VnaCAxOCwgYW5kIHNvbWV0aW1lcyBub3RcbiAvLyBldmVuIHRoZW4uXG4gLy8gVGhpcyBpcyBmb3IgYGFzYXAuanNgIG9ubHkuXG4gLy8gSXRzIG5hbWUgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcmFuZG9taXplZCB0byBicmVhayBhbnkgY29kZSB0aGF0IGRlcGVuZHMgb25cbiAvLyAvLyBpdHMgZXhpc3RlbmNlLlxuIC8vIHJhd0FzYXAubWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyXG4gLy8gQVNBUCB3YXMgb3JpZ2luYWxseSBhIG5leHRUaWNrIHNoaW0gaW5jbHVkZWQgaW4gUS4gVGhpcyB3YXMgZmFjdG9yZWQgb3V0XG4gLy8gaW50byB0aGlzIEFTQVAgcGFja2FnZS4gSXQgd2FzIGxhdGVyIGFkYXB0ZWQgdG8gUlNWUCB3aGljaCBtYWRlIGZ1cnRoZXJcbiAvLyBhbWVuZG1lbnRzLiBUaGVzZSBkZWNpc2lvbnMsIHBhcnRpY3VsYXJseSB0byBtYXJnaW5hbGl6ZSBNZXNzYWdlQ2hhbm5lbCBhbmRcbiAvLyB0byBjYXB0dXJlIHRoZSBNdXRhdGlvbk9ic2VydmVyIGltcGxlbWVudGF0aW9uIGluIGEgY2xvc3VyZSwgd2VyZSBpbnRlZ3JhdGVkXG4gLy8gYmFjayBpbnRvIEFTQVAgcHJvcGVyLlxuIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9jZGRmNzIzMjU0NmE5Y2Y4NTg1MjRiNzVjZGU2ZjllZGY3MjYyMGE3L2xpYi9yc3ZwL2FzYXAuanNcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXNhcFF1ZXVlLmpzLm1hcCIsIi8vIGBjYWxsYCwganVzdCBsaWtlIGEgZnVuY3Rpb24uXG5leHBvcnQgY2xhc3MgUmF3VGFzayB7XG4gICAgY2FsbCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudGFzayAmJiB0aGlzLnRhc2soKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgIHRoaXMudGFzayA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJlbGVhc2UodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3RydWN0b3Iob25FcnJvciwgcmVsZWFzZSl7XG4gICAgICAgIHRoaXMub25FcnJvciA9IG9uRXJyb3I7XG4gICAgICAgIHRoaXMucmVsZWFzZSA9IHJlbGVhc2U7XG4gICAgICAgIHRoaXMudGFzayA9IG51bGw7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SYXdUYXNrLmpzLm1hcCIsImltcG9ydCB7IFJhd1Rhc2sgfSBmcm9tICcuL1Jhd1Rhc2suanMnO1xuZXhwb3J0IGNsYXNzIFRhc2tGYWN0b3J5IHtcbiAgICBjcmVhdGUodGFzaykge1xuICAgICAgICBjb25zdCB0YXNrcyA9IHRoaXMuZnJlZVRhc2tzO1xuICAgICAgICBjb25zdCB0MSA9IHRhc2tzLmxlbmd0aCA/IHRhc2tzLnBvcCgpIDogbmV3IFJhd1Rhc2sodGhpcy5vbkVycm9yLCAodCk9PnRhc2tzW3Rhc2tzLmxlbmd0aF0gPSB0XG4gICAgICAgICk7XG4gICAgICAgIHQxLnRhc2sgPSB0YXNrO1xuICAgICAgICByZXR1cm4gdDE7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG9uRXJyb3Ipe1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuICAgICAgICB0aGlzLmZyZWVUYXNrcyA9IFtdO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFza0ZhY3RvcnkuanMubWFwIiwiaW1wb3J0IHsgQXNhcFF1ZXVlIH0gZnJvbSAnLi9Bc2FwUXVldWUuanMnO1xuaW1wb3J0IHsgVGFza0ZhY3RvcnkgfSBmcm9tICcuL1Rhc2tGYWN0b3J5LmpzJztcbmNvbnN0IGFzYXBRdWV1ZSA9IG5ldyBBc2FwUXVldWUoKTtcbmNvbnN0IHRhc2tGYWN0b3J5ID0gbmV3IFRhc2tGYWN0b3J5KGFzYXBRdWV1ZS5yZWdpc3RlclBlbmRpbmdFcnJvcik7XG4vKipcbiAqIENhbGxzIGEgdGFzayBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHJldHVybmluZywgaW4gaXRzIG93biBldmVudCwgd2l0aCBwcmlvcml0eVxuICogb3ZlciBvdGhlciBldmVudHMgbGlrZSBhbmltYXRpb24sIHJlZmxvdywgYW5kIHJlcGFpbnQuIEFuIGVycm9yIHRocm93biBmcm9tIGFuXG4gKiBldmVudCB3aWxsIG5vdCBpbnRlcnJ1cHQsIG5vciBldmVuIHN1YnN0YW50aWFsbHkgc2xvdyBkb3duIHRoZSBwcm9jZXNzaW5nIG9mXG4gKiBvdGhlciBldmVudHMsIGJ1dCB3aWxsIGJlIHJhdGhlciBwb3N0cG9uZWQgdG8gYSBsb3dlciBwcmlvcml0eSBldmVudC5cbiAqIEBwYXJhbSB7e2NhbGx9fSB0YXNrIEEgY2FsbGFibGUgb2JqZWN0LCB0eXBpY2FsbHkgYSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vXG4gKiBhcmd1bWVudHMuXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGFzYXAodGFzaykge1xuICAgIGFzYXBRdWV1ZS5lbnF1ZXVlVGFzayh0YXNrRmFjdG9yeS5jcmVhdGUodGFzaykpO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1hc2FwLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vYXNhcC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0FzYXBRdWV1ZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1Rhc2tGYWN0b3J5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyBTYWZhcmkgNiBhbmQgNi4xIGZvciBkZXNrdG9wLCBpUGFkLCBhbmQgaVBob25lIGFyZSB0aGUgb25seSBicm93c2VycyB0aGF0XG4vLyBoYXZlIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIgYnV0IG5vdCB1bi1wcmVmaXhlZCBNdXRhdGlvbk9ic2VydmVyLlxuLy8gTXVzdCB1c2UgYGdsb2JhbGAgb3IgYHNlbGZgIGluc3RlYWQgb2YgYHdpbmRvd2AgdG8gd29yayBpbiBib3RoIGZyYW1lcyBhbmQgd2ViXG4vLyB3b3JrZXJzLiBgZ2xvYmFsYCBpcyBhIHByb3Zpc2lvbiBvZiBCcm93c2VyaWZ5LCBNciwgTXJzLCBvciBNb3AuXG4vKiBnbG9iYWxzIHNlbGYgKi8gY29uc3Qgc2NvcGUgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHNlbGY7XG5jb25zdCBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IHNjb3BlLk11dGF0aW9uT2JzZXJ2ZXIgfHwgc2NvcGUuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbmV4cG9ydCBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4gICAgICAgIC8vIFdlIGRpc3BhdGNoIGEgdGltZW91dCB3aXRoIGEgc3BlY2lmaWVkIGRlbGF5IG9mIDAgZm9yIGVuZ2luZXMgdGhhdFxuICAgICAgICAvLyBjYW4gcmVsaWFibHkgYWNjb21tb2RhdGUgdGhhdCByZXF1ZXN0LiBUaGlzIHdpbGwgdXN1YWxseSBiZSBzbmFwcGVkXG4gICAgICAgIC8vIHRvIGEgNCBtaWxpc2Vjb25kIGRlbGF5LCBidXQgb25jZSB3ZSdyZSBmbHVzaGluZywgdGhlcmUncyBubyBkZWxheVxuICAgICAgICAvLyBiZXR3ZWVuIGV2ZW50cy5cbiAgICAgICAgY29uc3QgdGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoaGFuZGxlVGltZXIsIDApO1xuICAgICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGlzIHRpbWVyIGdldHMgZnJlcXVlbnRseSBkcm9wcGVkIGluIEZpcmVmb3hcbiAgICAgICAgLy8gd29ya2Vycywgd2UgZW5saXN0IGFuIGludGVydmFsIGhhbmRsZSB0aGF0IHdpbGwgdHJ5IHRvIGZpcmVcbiAgICAgICAgLy8gYW4gZXZlbnQgMjAgdGltZXMgcGVyIHNlY29uZCB1bnRpbCBpdCBzdWNjZWVkcy5cbiAgICAgICAgY29uc3QgaW50ZXJ2YWxIYW5kbGUgPSBzZXRJbnRlcnZhbChoYW5kbGVUaW1lciwgNTApO1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVUaW1lcigpIHtcbiAgICAgICAgICAgIC8vIFdoaWNoZXZlciB0aW1lciBzdWNjZWVkcyB3aWxsIGNhbmNlbCBib3RoIHRpbWVycyBhbmRcbiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbEhhbmRsZSk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8vIFRvIHJlcXVlc3QgYSBoaWdoIHByaW9yaXR5IGV2ZW50LCB3ZSBpbmR1Y2UgYSBtdXRhdGlvbiBvYnNlcnZlciBieSB0b2dnbGluZ1xuLy8gdGhlIHRleHQgb2YgYSB0ZXh0IG5vZGUgYmV0d2VlbiBcIjFcIiBhbmQgXCItMVwiLlxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21NdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKSB7XG4gICAgbGV0IHRvZ2dsZSA9IDE7XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7XG4gICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4gICAgICAgIHRvZ2dsZSA9IC10b2dnbGU7XG4gICAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZTtcbiAgICB9O1xufVxuZXhwb3J0IGNvbnN0IG1ha2VSZXF1ZXN0Q2FsbCA9IHR5cGVvZiBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9PT0gJ2Z1bmN0aW9uJyA/IC8vIHJlbGlhYmx5IGV2ZXJ5d2hlcmUgdGhleSBhcmUgaW1wbGVtZW50ZWQuXG4vLyBUaGV5IGFyZSBpbXBsZW1lbnRlZCBpbiBhbGwgbW9kZXJuIGJyb3dzZXJzLlxuLy9cbi8vIC0gQW5kcm9pZCA0LTQuM1xuLy8gLSBDaHJvbWUgMjYtMzRcbi8vIC0gRmlyZWZveCAxNC0yOVxuLy8gLSBJbnRlcm5ldCBFeHBsb3JlciAxMVxuLy8gLSBpUGFkIFNhZmFyaSA2LTcuMVxuLy8gLSBpUGhvbmUgU2FmYXJpIDctNy4xXG4vLyAtIFNhZmFyaSA2LTdcbm1ha2VSZXF1ZXN0Q2FsbEZyb21NdXRhdGlvbk9ic2VydmVyIDogLy8gdGFzayBxdWV1ZSwgYXJlIGltcGxlbWVudGVkIGluIEludGVybmV0IEV4cGxvcmVyIDEwLCBTYWZhcmkgNS4wLTEsIGFuZCBPcGVyYVxuLy8gMTEtMTIsIGFuZCBpbiB3ZWIgd29ya2VycyBpbiBtYW55IGVuZ2luZXMuXG4vLyBBbHRob3VnaCBtZXNzYWdlIGNoYW5uZWxzIHlpZWxkIHRvIGFueSBxdWV1ZWQgcmVuZGVyaW5nIGFuZCBJTyB0YXNrcywgdGhleVxuLy8gd291bGQgYmUgYmV0dGVyIHRoYW4gaW1wb3NpbmcgdGhlIDRtcyBkZWxheSBvZiB0aW1lcnMuXG4vLyBIb3dldmVyLCB0aGV5IGRvIG5vdCB3b3JrIHJlbGlhYmx5IGluIEludGVybmV0IEV4cGxvcmVyIG9yIFNhZmFyaS5cbi8vIEludGVybmV0IEV4cGxvcmVyIDEwIGlzIHRoZSBvbmx5IGJyb3dzZXIgdGhhdCBoYXMgc2V0SW1tZWRpYXRlIGJ1dCBkb2VzXG4vLyBub3QgaGF2ZSBNdXRhdGlvbk9ic2VydmVycy5cbi8vIEFsdGhvdWdoIHNldEltbWVkaWF0ZSB5aWVsZHMgdG8gdGhlIGJyb3dzZXIncyByZW5kZXJlciwgaXQgd291bGQgYmVcbi8vIHByZWZlcnJhYmxlIHRvIGZhbGxpbmcgYmFjayB0byBzZXRUaW1lb3V0IHNpbmNlIGl0IGRvZXMgbm90IGhhdmVcbi8vIHRoZSBtaW5pbXVtIDRtcyBwZW5hbHR5LlxuLy8gVW5mb3J0dW5hdGVseSB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVnIGluIEludGVybmV0IEV4cGxvcmVyIDEwIE1vYmlsZSAoYW5kXG4vLyBEZXNrdG9wIHRvIGEgbGVzc2VyIGV4dGVudCkgdGhhdCByZW5kZXJzIGJvdGggc2V0SW1tZWRpYXRlIGFuZFxuLy8gTWVzc2FnZUNoYW5uZWwgdXNlbGVzcyBmb3IgdGhlIHB1cnBvc2VzIG9mIEFTQVAuXG4vLyBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL3EvaXNzdWVzLzM5NlxuLy8gVGltZXJzIGFyZSBpbXBsZW1lbnRlZCB1bml2ZXJzYWxseS5cbi8vIFdlIGZhbGwgYmFjayB0byB0aW1lcnMgaW4gd29ya2VycyBpbiBtb3N0IGVuZ2luZXMsIGFuZCBpbiBmb3JlZ3JvdW5kXG4vLyBjb250ZXh0cyBpbiB0aGUgZm9sbG93aW5nIGJyb3dzZXJzLlxuLy8gSG93ZXZlciwgbm90ZSB0aGF0IGV2ZW4gdGhpcyBzaW1wbGUgY2FzZSByZXF1aXJlcyBudWFuY2VzIHRvIG9wZXJhdGUgaW4gYVxuLy8gYnJvYWQgc3BlY3RydW0gb2YgYnJvd3NlcnMuXG4vL1xuLy8gLSBGaXJlZm94IDMtMTNcbi8vIC0gSW50ZXJuZXQgRXhwbG9yZXIgNi05XG4vLyAtIGlQYWQgU2FmYXJpIDQuM1xuLy8gLSBMeW54IDIuOC43XG5tYWtlUmVxdWVzdENhbGxGcm9tVGltZXI7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1ha2VSZXF1ZXN0Q2FsbC5qcy5tYXAiLCJleHBvcnQgeyB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hpY2ggeW91ciBwcm9ncmFtIGFzc3VtZXMgdG8gYmUgdHJ1ZS5cbiAqXG4gKiBQcm92aWRlIHNwcmludGYtc3R5bGUgZm9ybWF0IChvbmx5ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50c1xuICogdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJlXG4gKiBleHBlY3RpbmcuXG4gKlxuICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBpbnZhcmlhbnRcbiAqIHdpbGwgcmVtYWluIHRvIGVuc3VyZSBsb2dpYyBkb2VzIG5vdCBkaWZmZXIgaW4gcHJvZHVjdGlvbi5cbiAqLyBleHBvcnQgZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKSB7XG4gICAgaWYgKGlzUHJvZHVjdGlvbigpKSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFyZ0luZGV4ID0gMDtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxIC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgICAgIDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNQcm9kdWN0aW9uKCkge1xuICAgIHJldHVybiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnZbJ05PREVfRU5WJ10gPT09ICdwcm9kdWN0aW9uJztcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8gc3JjL2luZGV4LnRzXG5leHBvcnQgKiBmcm9tIFwicmVkdXhcIjtcbmltcG9ydCB7IHByb2R1Y2UsIGN1cnJlbnQgYXMgY3VycmVudDMsIGZyZWV6ZSwgb3JpZ2luYWwgYXMgb3JpZ2luYWwyLCBpc0RyYWZ0IGFzIGlzRHJhZnQ1IH0gZnJvbSBcImltbWVyXCI7XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RvciwgY3JlYXRlU2VsZWN0b3JDcmVhdG9yIGFzIGNyZWF0ZVNlbGVjdG9yQ3JlYXRvcjIsIGxydU1lbW9pemUsIHdlYWtNYXBNZW1vaXplIGFzIHdlYWtNYXBNZW1vaXplMiB9IGZyb20gXCJyZXNlbGVjdFwiO1xuXG4vLyBzcmMvY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IudHNcbmltcG9ydCB7IGN1cnJlbnQsIGlzRHJhZnQgfSBmcm9tIFwiaW1tZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdG9yQ3JlYXRvciwgd2Vha01hcE1lbW9pemUgfSBmcm9tIFwicmVzZWxlY3RcIjtcbnZhciBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvckNyZWF0b3IgPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCBjcmVhdGVTZWxlY3RvcjIgPSBjcmVhdGVTZWxlY3RvckNyZWF0b3IoLi4uYXJncyk7XG4gIGNvbnN0IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yMiA9IE9iamVjdC5hc3NpZ24oKC4uLmFyZ3MyKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcjIoLi4uYXJnczIpO1xuICAgIGNvbnN0IHdyYXBwZWRTZWxlY3RvciA9ICh2YWx1ZSwgLi4ucmVzdCkgPT4gc2VsZWN0b3IoaXNEcmFmdCh2YWx1ZSkgPyBjdXJyZW50KHZhbHVlKSA6IHZhbHVlLCAuLi5yZXN0KTtcbiAgICBPYmplY3QuYXNzaWduKHdyYXBwZWRTZWxlY3Rvciwgc2VsZWN0b3IpO1xuICAgIHJldHVybiB3cmFwcGVkU2VsZWN0b3I7XG4gIH0sIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yMlxuICB9KTtcbiAgcmV0dXJuIGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yMjtcbn07XG52YXIgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3IgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JDcmVhdG9yKHdlYWtNYXBNZW1vaXplKTtcblxuLy8gc3JjL2NvbmZpZ3VyZVN0b3JlLnRzXG5pbXBvcnQgeyBhcHBseU1pZGRsZXdhcmUsIGNyZWF0ZVN0b3JlLCBjb21wb3NlIGFzIGNvbXBvc2UyLCBjb21iaW5lUmVkdWNlcnMsIGlzUGxhaW5PYmplY3QgYXMgaXNQbGFpbk9iamVjdDIgfSBmcm9tIFwicmVkdXhcIjtcblxuLy8gc3JjL2RldnRvb2xzRXh0ZW5zaW9uLnRzXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSBcInJlZHV4XCI7XG52YXIgY29tcG9zZVdpdGhEZXZUb29scyA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfXyA/IHdpbmRvdy5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9DT01QT1NFX18gOiBmdW5jdGlvbigpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB2b2lkIDA7XG4gIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSBcIm9iamVjdFwiKSByZXR1cm4gY29tcG9zZTtcbiAgcmV0dXJuIGNvbXBvc2UuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn07XG52YXIgZGV2VG9vbHNFbmhhbmNlciA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18gPyB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXyA6IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZnVuY3Rpb24obm9vcDMpIHtcbiAgICByZXR1cm4gbm9vcDM7XG4gIH07XG59O1xuXG4vLyBzcmMvZ2V0RGVmYXVsdE1pZGRsZXdhcmUudHNcbmltcG9ydCB7IHRodW5rIGFzIHRodW5rTWlkZGxld2FyZSwgd2l0aEV4dHJhQXJndW1lbnQgfSBmcm9tIFwicmVkdXgtdGh1bmtcIjtcblxuLy8gc3JjL2NyZWF0ZUFjdGlvbi50c1xuaW1wb3J0IHsgaXNBY3Rpb24gfSBmcm9tIFwicmVkdXhcIjtcblxuLy8gc3JjL3RzSGVscGVycy50c1xudmFyIGhhc01hdGNoRnVuY3Rpb24gPSAodikgPT4ge1xuICByZXR1cm4gdiAmJiB0eXBlb2Ygdi5tYXRjaCA9PT0gXCJmdW5jdGlvblwiO1xufTtcblxuLy8gc3JjL2NyZWF0ZUFjdGlvbi50c1xuZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIHByZXBhcmVBY3Rpb24pIHtcbiAgZnVuY3Rpb24gYWN0aW9uQ3JlYXRvciguLi5hcmdzKSB7XG4gICAgaWYgKHByZXBhcmVBY3Rpb24pIHtcbiAgICAgIGxldCBwcmVwYXJlZCA9IHByZXBhcmVBY3Rpb24oLi4uYXJncyk7XG4gICAgICBpZiAoIXByZXBhcmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDApIDogXCJwcmVwYXJlQWN0aW9uIGRpZCBub3QgcmV0dXJuIGFuIG9iamVjdFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHBheWxvYWQ6IHByZXBhcmVkLnBheWxvYWQsXG4gICAgICAgIC4uLlwibWV0YVwiIGluIHByZXBhcmVkICYmIHtcbiAgICAgICAgICBtZXRhOiBwcmVwYXJlZC5tZXRhXG4gICAgICAgIH0sXG4gICAgICAgIC4uLlwiZXJyb3JcIiBpbiBwcmVwYXJlZCAmJiB7XG4gICAgICAgICAgZXJyb3I6IHByZXBhcmVkLmVycm9yXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlLFxuICAgICAgcGF5bG9hZDogYXJnc1swXVxuICAgIH07XG4gIH1cbiAgYWN0aW9uQ3JlYXRvci50b1N0cmluZyA9ICgpID0+IGAke3R5cGV9YDtcbiAgYWN0aW9uQ3JlYXRvci50eXBlID0gdHlwZTtcbiAgYWN0aW9uQ3JlYXRvci5tYXRjaCA9IChhY3Rpb24pID0+IGlzQWN0aW9uKGFjdGlvbikgJiYgYWN0aW9uLnR5cGUgPT09IHR5cGU7XG4gIHJldHVybiBhY3Rpb25DcmVhdG9yO1xufVxuZnVuY3Rpb24gaXNBY3Rpb25DcmVhdG9yKGFjdGlvbikge1xuICByZXR1cm4gdHlwZW9mIGFjdGlvbiA9PT0gXCJmdW5jdGlvblwiICYmIFwidHlwZVwiIGluIGFjdGlvbiAmJiAvLyBoYXNNYXRjaEZ1bmN0aW9uIG9ubHkgd2FudHMgTWF0Y2hlcnMgYnV0IEkgZG9uJ3Qgc2VlIHRoZSBwb2ludCBpbiByZXdyaXRpbmcgaXRcbiAgaGFzTWF0Y2hGdW5jdGlvbihhY3Rpb24pO1xufVxuZnVuY3Rpb24gaXNGU0EoYWN0aW9uKSB7XG4gIHJldHVybiBpc0FjdGlvbihhY3Rpb24pICYmIE9iamVjdC5rZXlzKGFjdGlvbikuZXZlcnkoaXNWYWxpZEtleSk7XG59XG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleSkge1xuICByZXR1cm4gW1widHlwZVwiLCBcInBheWxvYWRcIiwgXCJlcnJvclwiLCBcIm1ldGFcIl0uaW5kZXhPZihrZXkpID4gLTE7XG59XG5cbi8vIHNyYy9hY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gZ2V0TWVzc2FnZSh0eXBlKSB7XG4gIGNvbnN0IHNwbGl0VHlwZSA9IHR5cGUgPyBgJHt0eXBlfWAuc3BsaXQoXCIvXCIpIDogW107XG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBzcGxpdFR5cGVbc3BsaXRUeXBlLmxlbmd0aCAtIDFdIHx8IFwiYWN0aW9uQ3JlYXRvclwiO1xuICByZXR1cm4gYERldGVjdGVkIGFuIGFjdGlvbiBjcmVhdG9yIHdpdGggdHlwZSBcIiR7dHlwZSB8fCBcInVua25vd25cIn1cIiBiZWluZyBkaXNwYXRjaGVkLiBcbk1ha2Ugc3VyZSB5b3UncmUgY2FsbGluZyB0aGUgYWN0aW9uIGNyZWF0b3IgYmVmb3JlIGRpc3BhdGNoaW5nLCBpLmUuIFxcYGRpc3BhdGNoKCR7YWN0aW9uTmFtZX0oKSlcXGAgaW5zdGVhZCBvZiBcXGBkaXNwYXRjaCgke2FjdGlvbk5hbWV9KVxcYC4gVGhpcyBpcyBuZWNlc3NhcnkgZXZlbiBpZiB0aGUgYWN0aW9uIGhhcyBubyBwYXlsb2FkLmA7XG59XG5mdW5jdGlvbiBjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4gbmV4dChhY3Rpb24pO1xuICB9XG4gIGNvbnN0IHtcbiAgICBpc0FjdGlvbkNyZWF0b3I6IGlzQWN0aW9uQ3JlYXRvcjIgPSBpc0FjdGlvbkNyZWF0b3JcbiAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgIGlmIChpc0FjdGlvbkNyZWF0b3IyKGFjdGlvbikpIHtcbiAgICAgIGNvbnNvbGUud2FybihnZXRNZXNzYWdlKGFjdGlvbi50eXBlKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gIH07XG59XG5cbi8vIHNyYy91dGlscy50c1xuaW1wb3J0IHsgcHJvZHVjZSBhcyBjcmVhdGVOZXh0U3RhdGUsIGlzRHJhZnRhYmxlIH0gZnJvbSBcImltbWVyXCI7XG5mdW5jdGlvbiBnZXRUaW1lTWVhc3VyZVV0aWxzKG1heERlbGF5LCBmbk5hbWUpIHtcbiAgbGV0IGVsYXBzZWQgPSAwO1xuICByZXR1cm4ge1xuICAgIG1lYXN1cmVUaW1lKGZuKSB7XG4gICAgICBjb25zdCBzdGFydGVkID0gRGF0ZS5ub3coKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29uc3QgZmluaXNoZWQgPSBEYXRlLm5vdygpO1xuICAgICAgICBlbGFwc2VkICs9IGZpbmlzaGVkIC0gc3RhcnRlZDtcbiAgICAgIH1cbiAgICB9LFxuICAgIHdhcm5JZkV4Y2VlZGVkKCkge1xuICAgICAgaWYgKGVsYXBzZWQgPiBtYXhEZWxheSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCR7Zm5OYW1lfSB0b29rICR7ZWxhcHNlZH1tcywgd2hpY2ggaXMgbW9yZSB0aGFuIHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAke21heERlbGF5fW1zLiBcbklmIHlvdXIgc3RhdGUgb3IgYWN0aW9ucyBhcmUgdmVyeSBsYXJnZSwgeW91IG1heSB3YW50IHRvIGRpc2FibGUgdGhlIG1pZGRsZXdhcmUgYXMgaXQgbWlnaHQgY2F1c2UgdG9vIG11Y2ggb2YgYSBzbG93ZG93biBpbiBkZXZlbG9wbWVudCBtb2RlLiBTZWUgaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy9hcGkvZ2V0RGVmYXVsdE1pZGRsZXdhcmUgZm9yIGluc3RydWN0aW9ucy5cbkl0IGlzIGRpc2FibGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGF0LmApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGZpbmQoaXRlcmFibGUsIGNvbXBhcmF0b3IpIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBpdGVyYWJsZSkge1xuICAgIGlmIChjb21wYXJhdG9yKGVudHJ5KSkge1xuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxudmFyIFR1cGxlID0gY2xhc3MgX1R1cGxlIGV4dGVuZHMgQXJyYXkge1xuICBjb25zdHJ1Y3RvciguLi5pdGVtcykge1xuICAgIHN1cGVyKC4uLml0ZW1zKTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgX1R1cGxlLnByb3RvdHlwZSk7XG4gIH1cbiAgc3RhdGljIGdldCBbU3ltYm9sLnNwZWNpZXNdKCkge1xuICAgIHJldHVybiBfVHVwbGU7XG4gIH1cbiAgY29uY2F0KC4uLmFycikge1xuICAgIHJldHVybiBzdXBlci5jb25jYXQuYXBwbHkodGhpcywgYXJyKTtcbiAgfVxuICBwcmVwZW5kKC4uLmFycikge1xuICAgIGlmIChhcnIubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJyWzBdKSkge1xuICAgICAgcmV0dXJuIG5ldyBfVHVwbGUoLi4uYXJyWzBdLmNvbmNhdCh0aGlzKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgX1R1cGxlKC4uLmFyci5jb25jYXQodGhpcykpO1xuICB9XG59O1xuZnVuY3Rpb24gZnJlZXplRHJhZnRhYmxlKHZhbCkge1xuICByZXR1cm4gaXNEcmFmdGFibGUodmFsKSA/IGNyZWF0ZU5leHRTdGF0ZSh2YWwsICgpID0+IHtcbiAgfSkgOiB2YWw7XG59XG5mdW5jdGlvbiBlbXBsYWNlKG1hcCwga2V5LCBoYW5kbGVyKSB7XG4gIGlmIChtYXAuaGFzKGtleSkpIHtcbiAgICBsZXQgdmFsdWUgPSBtYXAuZ2V0KGtleSk7XG4gICAgaWYgKGhhbmRsZXIudXBkYXRlKSB7XG4gICAgICB2YWx1ZSA9IGhhbmRsZXIudXBkYXRlKHZhbHVlLCBrZXksIG1hcCk7XG4gICAgICBtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKCFoYW5kbGVyLmluc2VydCkgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTApIDogXCJObyBpbnNlcnQgcHJvdmlkZWQgZm9yIGtleSBub3QgYWxyZWFkeSBpbiBtYXBcIik7XG4gIGNvbnN0IGluc2VydGVkID0gaGFuZGxlci5pbnNlcnQoa2V5LCBtYXApO1xuICBtYXAuc2V0KGtleSwgaW5zZXJ0ZWQpO1xuICByZXR1cm4gaW5zZXJ0ZWQ7XG59XG5cbi8vIHNyYy9pbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGlzSW1tdXRhYmxlRGVmYXVsdCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09IG51bGwgfHwgT2JqZWN0LmlzRnJvemVuKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHRyYWNrRm9yTXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgb2JqKSB7XG4gIGNvbnN0IHRyYWNrZWRQcm9wZXJ0aWVzID0gdHJhY2tQcm9wZXJ0aWVzKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgb2JqKTtcbiAgcmV0dXJuIHtcbiAgICBkZXRlY3RNdXRhdGlvbnMoKSB7XG4gICAgICByZXR1cm4gZGV0ZWN0TXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgdHJhY2tlZFByb3BlcnRpZXMsIG9iaik7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gdHJhY2tQcm9wZXJ0aWVzKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocyA9IFtdLCBvYmosIHBhdGggPSBcIlwiLCBjaGVja2VkT2JqZWN0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpIHtcbiAgY29uc3QgdHJhY2tlZCA9IHtcbiAgICB2YWx1ZTogb2JqXG4gIH07XG4gIGlmICghaXNJbW11dGFibGUob2JqKSAmJiAhY2hlY2tlZE9iamVjdHMuaGFzKG9iaikpIHtcbiAgICBjaGVja2VkT2JqZWN0cy5hZGQob2JqKTtcbiAgICB0cmFja2VkLmNoaWxkcmVuID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xuICAgICAgaWYgKGlnbm9yZVBhdGhzLmxlbmd0aCAmJiBpZ25vcmVQYXRocy5pbmRleE9mKGNoaWxkUGF0aCkgIT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHJhY2tlZC5jaGlsZHJlbltrZXldID0gdHJhY2tQcm9wZXJ0aWVzKGlzSW1tdXRhYmxlLCBpZ25vcmVQYXRocywgb2JqW2tleV0sIGNoaWxkUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cmFja2VkO1xufVxuZnVuY3Rpb24gZGV0ZWN0TXV0YXRpb25zKGlzSW1tdXRhYmxlLCBpZ25vcmVkUGF0aHMgPSBbXSwgdHJhY2tlZFByb3BlcnR5LCBvYmosIHNhbWVQYXJlbnRSZWYgPSBmYWxzZSwgcGF0aCA9IFwiXCIpIHtcbiAgY29uc3QgcHJldk9iaiA9IHRyYWNrZWRQcm9wZXJ0eSA/IHRyYWNrZWRQcm9wZXJ0eS52YWx1ZSA6IHZvaWQgMDtcbiAgY29uc3Qgc2FtZVJlZiA9IHByZXZPYmogPT09IG9iajtcbiAgaWYgKHNhbWVQYXJlbnRSZWYgJiYgIXNhbWVSZWYgJiYgIU51bWJlci5pc05hTihvYmopKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhc011dGF0ZWQ6IHRydWUsXG4gICAgICBwYXRoXG4gICAgfTtcbiAgfVxuICBpZiAoaXNJbW11dGFibGUocHJldk9iaikgfHwgaXNJbW11dGFibGUob2JqKSkge1xuICAgIHJldHVybiB7XG4gICAgICB3YXNNdXRhdGVkOiBmYWxzZVxuICAgIH07XG4gIH1cbiAgY29uc3Qga2V5c1RvRGV0ZWN0ID0ge307XG4gIGZvciAobGV0IGtleSBpbiB0cmFja2VkUHJvcGVydHkuY2hpbGRyZW4pIHtcbiAgICBrZXlzVG9EZXRlY3Rba2V5XSA9IHRydWU7XG4gIH1cbiAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgIGtleXNUb0RldGVjdFtrZXldID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBoYXNJZ25vcmVkUGF0aHMgPSBpZ25vcmVkUGF0aHMubGVuZ3RoID4gMDtcbiAgZm9yIChsZXQga2V5IGluIGtleXNUb0RldGVjdCkge1xuICAgIGNvbnN0IG5lc3RlZFBhdGggPSBwYXRoID8gcGF0aCArIFwiLlwiICsga2V5IDoga2V5O1xuICAgIGlmIChoYXNJZ25vcmVkUGF0aHMpIHtcbiAgICAgIGNvbnN0IGhhc01hdGNoZXMgPSBpZ25vcmVkUGF0aHMuc29tZSgoaWdub3JlZCkgPT4ge1xuICAgICAgICBpZiAoaWdub3JlZCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgIHJldHVybiBpZ25vcmVkLnRlc3QobmVzdGVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5lc3RlZFBhdGggPT09IGlnbm9yZWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChoYXNNYXRjaGVzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBkZXRlY3RNdXRhdGlvbnMoaXNJbW11dGFibGUsIGlnbm9yZWRQYXRocywgdHJhY2tlZFByb3BlcnR5LmNoaWxkcmVuW2tleV0sIG9ialtrZXldLCBzYW1lUmVmLCBuZXN0ZWRQYXRoKTtcbiAgICBpZiAocmVzdWx0Lndhc011dGF0ZWQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgd2FzTXV0YXRlZDogZmFsc2VcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShvcHRpb25zID0ge30pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJldHVybiAoKSA9PiAobmV4dCkgPT4gKGFjdGlvbikgPT4gbmV4dChhY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIGxldCBzdHJpbmdpZnkyID0gZnVuY3Rpb24ob2JqLCBzZXJpYWxpemVyLCBpbmRlbnQsIGRlY3ljbGVyKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBnZXRTZXJpYWxpemUyKHNlcmlhbGl6ZXIsIGRlY3ljbGVyKSwgaW5kZW50KTtcbiAgICB9LCBnZXRTZXJpYWxpemUyID0gZnVuY3Rpb24oc2VyaWFsaXplciwgZGVjeWNsZXIpIHtcbiAgICAgIGxldCBzdGFjayA9IFtdLCBrZXlzID0gW107XG4gICAgICBpZiAoIWRlY3ljbGVyKSBkZWN5Y2xlciA9IGZ1bmN0aW9uKF8sIHZhbHVlKSB7XG4gICAgICAgIGlmIChzdGFja1swXSA9PT0gdmFsdWUpIHJldHVybiBcIltDaXJjdWxhciB+XVwiO1xuICAgICAgICByZXR1cm4gXCJbQ2lyY3VsYXIgfi5cIiArIGtleXMuc2xpY2UoMCwgc3RhY2suaW5kZXhPZih2YWx1ZSkpLmpvaW4oXCIuXCIpICsgXCJdXCI7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgdGhpc1BvcyA9IHN0YWNrLmluZGV4T2YodGhpcyk7XG4gICAgICAgICAgfnRoaXNQb3MgPyBzdGFjay5zcGxpY2UodGhpc1BvcyArIDEpIDogc3RhY2sucHVzaCh0aGlzKTtcbiAgICAgICAgICB+dGhpc1BvcyA/IGtleXMuc3BsaWNlKHRoaXNQb3MsIEluZmluaXR5LCBrZXkpIDoga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgaWYgKH5zdGFjay5pbmRleE9mKHZhbHVlKSkgdmFsdWUgPSBkZWN5Y2xlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Ugc3RhY2sucHVzaCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVyID09IG51bGwgPyB2YWx1ZSA6IHNlcmlhbGl6ZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgc3RyaW5naWZ5ID0gc3RyaW5naWZ5MiwgZ2V0U2VyaWFsaXplID0gZ2V0U2VyaWFsaXplMjtcbiAgICBsZXQge1xuICAgICAgaXNJbW11dGFibGUgPSBpc0ltbXV0YWJsZURlZmF1bHQsXG4gICAgICBpZ25vcmVkUGF0aHMsXG4gICAgICB3YXJuQWZ0ZXIgPSAzMlxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHRyYWNrID0gdHJhY2tGb3JNdXRhdGlvbnMuYmluZChudWxsLCBpc0ltbXV0YWJsZSwgaWdub3JlZFBhdGhzKTtcbiAgICByZXR1cm4gKHtcbiAgICAgIGdldFN0YXRlXG4gICAgfSkgPT4ge1xuICAgICAgbGV0IHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICAgIGxldCB0cmFja2VyID0gdHJhY2soc3RhdGUpO1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHJldHVybiAobmV4dCkgPT4gKGFjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBtZWFzdXJlVXRpbHMgPSBnZXRUaW1lTWVhc3VyZVV0aWxzKHdhcm5BZnRlciwgXCJJbW11dGFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmVcIik7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgIHJlc3VsdCA9IHRyYWNrZXIuZGV0ZWN0TXV0YXRpb25zKCk7XG4gICAgICAgICAgdHJhY2tlciA9IHRyYWNrKHN0YXRlKTtcbiAgICAgICAgICBpZiAocmVzdWx0Lndhc011dGF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE5KSA6IGBBIHN0YXRlIG11dGF0aW9uIHdhcyBkZXRlY3RlZCBiZXR3ZWVuIGRpc3BhdGNoZXMsIGluIHRoZSBwYXRoICcke3Jlc3VsdC5wYXRoIHx8IFwiXCJ9Jy4gIFRoaXMgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvci4gKGh0dHBzOi8vcmVkdXguanMub3JnL3N0eWxlLWd1aWRlL3N0eWxlLWd1aWRlI2RvLW5vdC1tdXRhdGUtc3RhdGUpYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlZEFjdGlvbiA9IG5leHQoYWN0aW9uKTtcbiAgICAgICAgbWVhc3VyZVV0aWxzLm1lYXN1cmVUaW1lKCgpID0+IHtcbiAgICAgICAgICBzdGF0ZSA9IGdldFN0YXRlKCk7XG4gICAgICAgICAgcmVzdWx0ID0gdHJhY2tlci5kZXRlY3RNdXRhdGlvbnMoKTtcbiAgICAgICAgICB0cmFja2VyID0gdHJhY2soc3RhdGUpO1xuICAgICAgICAgIGlmIChyZXN1bHQud2FzTXV0YXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjApIDogYEEgc3RhdGUgbXV0YXRpb24gd2FzIGRldGVjdGVkIGluc2lkZSBhIGRpc3BhdGNoLCBpbiB0aGUgcGF0aDogJHtyZXN1bHQucGF0aCB8fCBcIlwifS4gVGFrZSBhIGxvb2sgYXQgdGhlIHJlZHVjZXIocykgaGFuZGxpbmcgdGhlIGFjdGlvbiAke3N0cmluZ2lmeTIoYWN0aW9uKX0uIChodHRwczovL3JlZHV4LmpzLm9yZy9zdHlsZS1ndWlkZS9zdHlsZS1ndWlkZSNkby1ub3QtbXV0YXRlLXN0YXRlKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1lYXN1cmVVdGlscy53YXJuSWZFeGNlZWRlZCgpO1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2hlZEFjdGlvbjtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxufVxuXG4vLyBzcmMvc2VyaWFsaXphYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLnRzXG5pbXBvcnQgeyBpc0FjdGlvbiBhcyBpc0FjdGlvbjIsIGlzUGxhaW5PYmplY3QgfSBmcm9tIFwicmVkdXhcIjtcbmZ1bmN0aW9uIGlzUGxhaW4odmFsKSB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsO1xuICByZXR1cm4gdmFsID09IG51bGwgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlID09PSBcIm51bWJlclwiIHx8IEFycmF5LmlzQXJyYXkodmFsKSB8fCBpc1BsYWluT2JqZWN0KHZhbCk7XG59XG5mdW5jdGlvbiBmaW5kTm9uU2VyaWFsaXphYmxlVmFsdWUodmFsdWUsIHBhdGggPSBcIlwiLCBpc1NlcmlhbGl6YWJsZSA9IGlzUGxhaW4sIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocyA9IFtdLCBjYWNoZSkge1xuICBsZXQgZm91bmROZXN0ZWRTZXJpYWxpemFibGU7XG4gIGlmICghaXNTZXJpYWxpemFibGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleVBhdGg6IHBhdGggfHwgXCI8cm9vdD5cIixcbiAgICAgIHZhbHVlXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChjYWNoZT8uaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBlbnRyaWVzID0gZ2V0RW50cmllcyAhPSBudWxsID8gZ2V0RW50cmllcyh2YWx1ZSkgOiBPYmplY3QuZW50cmllcyh2YWx1ZSk7XG4gIGNvbnN0IGhhc0lnbm9yZWRQYXRocyA9IGlnbm9yZWRQYXRocy5sZW5ndGggPiAwO1xuICBmb3IgKGNvbnN0IFtrZXksIG5lc3RlZFZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbmVzdGVkUGF0aCA9IHBhdGggPyBwYXRoICsgXCIuXCIgKyBrZXkgOiBrZXk7XG4gICAgaWYgKGhhc0lnbm9yZWRQYXRocykge1xuICAgICAgY29uc3QgaGFzTWF0Y2hlcyA9IGlnbm9yZWRQYXRocy5zb21lKChpZ25vcmVkKSA9PiB7XG4gICAgICAgIGlmIChpZ25vcmVkIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgcmV0dXJuIGlnbm9yZWQudGVzdChuZXN0ZWRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVzdGVkUGF0aCA9PT0gaWdub3JlZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGhhc01hdGNoZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNTZXJpYWxpemFibGUobmVzdGVkVmFsdWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXlQYXRoOiBuZXN0ZWRQYXRoLFxuICAgICAgICB2YWx1ZTogbmVzdGVkVmFsdWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmVzdGVkVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlID0gZmluZE5vblNlcmlhbGl6YWJsZVZhbHVlKG5lc3RlZFZhbHVlLCBuZXN0ZWRQYXRoLCBpc1NlcmlhbGl6YWJsZSwgZ2V0RW50cmllcywgaWdub3JlZFBhdGhzLCBjYWNoZSk7XG4gICAgICBpZiAoZm91bmROZXN0ZWRTZXJpYWxpemFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kTmVzdGVkU2VyaWFsaXphYmxlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY2FjaGUgJiYgaXNOZXN0ZWRGcm96ZW4odmFsdWUpKSBjYWNoZS5hZGQodmFsdWUpO1xuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc05lc3RlZEZyb3plbih2YWx1ZSkge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBuZXN0ZWRWYWx1ZSBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgIGlmICh0eXBlb2YgbmVzdGVkVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgbmVzdGVkVmFsdWUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgIGlmICghaXNOZXN0ZWRGcm96ZW4obmVzdGVkVmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUob3B0aW9ucyA9IHt9KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4gKCkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IG5leHQoYWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7XG4gICAgICBpc1NlcmlhbGl6YWJsZSA9IGlzUGxhaW4sXG4gICAgICBnZXRFbnRyaWVzLFxuICAgICAgaWdub3JlZEFjdGlvbnMgPSBbXSxcbiAgICAgIGlnbm9yZWRBY3Rpb25QYXRocyA9IFtcIm1ldGEuYXJnXCIsIFwibWV0YS5iYXNlUXVlcnlNZXRhXCJdLFxuICAgICAgaWdub3JlZFBhdGhzID0gW10sXG4gICAgICB3YXJuQWZ0ZXIgPSAzMixcbiAgICAgIGlnbm9yZVN0YXRlID0gZmFsc2UsXG4gICAgICBpZ25vcmVBY3Rpb25zID0gZmFsc2UsXG4gICAgICBkaXNhYmxlQ2FjaGUgPSBmYWxzZVxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNhY2hlID0gIWRpc2FibGVDYWNoZSAmJiBXZWFrU2V0ID8gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIChzdG9yZUFQSSkgPT4gKG5leHQpID0+IChhY3Rpb24pID0+IHtcbiAgICAgIGlmICghaXNBY3Rpb24yKGFjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5leHQoYWN0aW9uKTtcbiAgICAgIGNvbnN0IG1lYXN1cmVVdGlscyA9IGdldFRpbWVNZWFzdXJlVXRpbHMod2FybkFmdGVyLCBcIlNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZVwiKTtcbiAgICAgIGlmICghaWdub3JlQWN0aW9ucyAmJiAhKGlnbm9yZWRBY3Rpb25zLmxlbmd0aCAmJiBpZ25vcmVkQWN0aW9ucy5pbmRleE9mKGFjdGlvbi50eXBlKSAhPT0gLTEpKSB7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShhY3Rpb24sIFwiXCIsIGlzU2VyaWFsaXphYmxlLCBnZXRFbnRyaWVzLCBpZ25vcmVkQWN0aW9uUGF0aHMsIGNhY2hlKTtcbiAgICAgICAgICBpZiAoZm91bmRBY3Rpb25Ob25TZXJpYWxpemFibGVWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBrZXlQYXRoLFxuICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSA9IGZvdW5kQWN0aW9uTm9uU2VyaWFsaXphYmxlVmFsdWU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBIG5vbi1zZXJpYWxpemFibGUgdmFsdWUgd2FzIGRldGVjdGVkIGluIGFuIGFjdGlvbiwgaW4gdGhlIHBhdGg6IFxcYCR7a2V5UGF0aH1cXGAuIFZhbHVlOmAsIHZhbHVlLCBcIlxcblRha2UgYSBsb29rIGF0IHRoZSBsb2dpYyB0aGF0IGRpc3BhdGNoZWQgdGhpcyBhY3Rpb246IFwiLCBhY3Rpb24sIFwiXFxuKFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9mYXEvYWN0aW9ucyN3aHktc2hvdWxkLXR5cGUtYmUtYS1zdHJpbmctb3ItYXQtbGVhc3Qtc2VyaWFsaXphYmxlLXdoeS1zaG91bGQtbXktYWN0aW9uLXR5cGVzLWJlLWNvbnN0YW50cylcIiwgXCJcXG4oVG8gYWxsb3cgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgc2VlOiBodHRwczovL3JlZHV4LXRvb2xraXQuanMub3JnL3VzYWdlL3VzYWdlLWd1aWRlI3dvcmtpbmctd2l0aC1ub24tc2VyaWFsaXphYmxlLWRhdGEpXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWlnbm9yZVN0YXRlKSB7XG4gICAgICAgIG1lYXN1cmVVdGlscy5tZWFzdXJlVGltZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZUFQSS5nZXRTdGF0ZSgpO1xuICAgICAgICAgIGNvbnN0IGZvdW5kU3RhdGVOb25TZXJpYWxpemFibGVWYWx1ZSA9IGZpbmROb25TZXJpYWxpemFibGVWYWx1ZShzdGF0ZSwgXCJcIiwgaXNTZXJpYWxpemFibGUsIGdldEVudHJpZXMsIGlnbm9yZWRQYXRocywgY2FjaGUpO1xuICAgICAgICAgIGlmIChmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAga2V5UGF0aCxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0gPSBmb3VuZFN0YXRlTm9uU2VyaWFsaXphYmxlVmFsdWU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBIG5vbi1zZXJpYWxpemFibGUgdmFsdWUgd2FzIGRldGVjdGVkIGluIHRoZSBzdGF0ZSwgaW4gdGhlIHBhdGg6IFxcYCR7a2V5UGF0aH1cXGAuIFZhbHVlOmAsIHZhbHVlLCBgXG5UYWtlIGEgbG9vayBhdCB0aGUgcmVkdWNlcihzKSBoYW5kbGluZyB0aGlzIGFjdGlvbiB0eXBlOiAke2FjdGlvbi50eXBlfS5cbihTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvZmFxL29yZ2FuaXppbmctc3RhdGUjY2FuLWktcHV0LWZ1bmN0aW9ucy1wcm9taXNlcy1vci1vdGhlci1ub24tc2VyaWFsaXphYmxlLWl0ZW1zLWluLW15LXN0b3JlLXN0YXRlKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1lYXN1cmVVdGlscy53YXJuSWZFeGNlZWRlZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9XG59XG5cbi8vIHNyYy9nZXREZWZhdWx0TWlkZGxld2FyZS50c1xuZnVuY3Rpb24gaXNCb29sZWFuKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcImJvb2xlYW5cIjtcbn1cbnZhciBidWlsZEdldERlZmF1bHRNaWRkbGV3YXJlID0gKCkgPT4gZnVuY3Rpb24gZ2V0RGVmYXVsdE1pZGRsZXdhcmUob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgdGh1bmsgPSB0cnVlLFxuICAgIGltbXV0YWJsZUNoZWNrID0gdHJ1ZSxcbiAgICBzZXJpYWxpemFibGVDaGVjayA9IHRydWUsXG4gICAgYWN0aW9uQ3JlYXRvckNoZWNrID0gdHJ1ZVxuICB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgbGV0IG1pZGRsZXdhcmVBcnJheSA9IG5ldyBUdXBsZSgpO1xuICBpZiAodGh1bmspIHtcbiAgICBpZiAoaXNCb29sZWFuKHRodW5rKSkge1xuICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2godGh1bmtNaWRkbGV3YXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWlkZGxld2FyZUFycmF5LnB1c2god2l0aEV4dHJhQXJndW1lbnQodGh1bmsuZXh0cmFBcmd1bWVudCkpO1xuICAgIH1cbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKGltbXV0YWJsZUNoZWNrKSB7XG4gICAgICBsZXQgaW1tdXRhYmxlT3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKCFpc0Jvb2xlYW4oaW1tdXRhYmxlQ2hlY2spKSB7XG4gICAgICAgIGltbXV0YWJsZU9wdGlvbnMgPSBpbW11dGFibGVDaGVjaztcbiAgICAgIH1cbiAgICAgIG1pZGRsZXdhcmVBcnJheS51bnNoaWZ0KGNyZWF0ZUltbXV0YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZShpbW11dGFibGVPcHRpb25zKSk7XG4gICAgfVxuICAgIGlmIChzZXJpYWxpemFibGVDaGVjaykge1xuICAgICAgbGV0IHNlcmlhbGl6YWJsZU9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghaXNCb29sZWFuKHNlcmlhbGl6YWJsZUNoZWNrKSkge1xuICAgICAgICBzZXJpYWxpemFibGVPcHRpb25zID0gc2VyaWFsaXphYmxlQ2hlY2s7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlQXJyYXkucHVzaChjcmVhdGVTZXJpYWxpemFibGVTdGF0ZUludmFyaWFudE1pZGRsZXdhcmUoc2VyaWFsaXphYmxlT3B0aW9ucykpO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uQ3JlYXRvckNoZWNrKSB7XG4gICAgICBsZXQgYWN0aW9uQ3JlYXRvck9wdGlvbnMgPSB7fTtcbiAgICAgIGlmICghaXNCb29sZWFuKGFjdGlvbkNyZWF0b3JDaGVjaykpIHtcbiAgICAgICAgYWN0aW9uQ3JlYXRvck9wdGlvbnMgPSBhY3Rpb25DcmVhdG9yQ2hlY2s7XG4gICAgICB9XG4gICAgICBtaWRkbGV3YXJlQXJyYXkudW5zaGlmdChjcmVhdGVBY3Rpb25DcmVhdG9ySW52YXJpYW50TWlkZGxld2FyZShhY3Rpb25DcmVhdG9yT3B0aW9ucykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWlkZGxld2FyZUFycmF5O1xufTtcblxuLy8gc3JjL2F1dG9CYXRjaEVuaGFuY2VyLnRzXG52YXIgU0hPVUxEX0FVVE9CQVRDSCA9IFwiUlRLX2F1dG9CYXRjaFwiO1xudmFyIHByZXBhcmVBdXRvQmF0Y2hlZCA9ICgpID0+IChwYXlsb2FkKSA9PiAoe1xuICBwYXlsb2FkLFxuICBtZXRhOiB7XG4gICAgW1NIT1VMRF9BVVRPQkFUQ0hdOiB0cnVlXG4gIH1cbn0pO1xudmFyIGNyZWF0ZVF1ZXVlV2l0aFRpbWVyID0gKHRpbWVvdXQpID0+IHtcbiAgcmV0dXJuIChub3RpZnkpID0+IHtcbiAgICBzZXRUaW1lb3V0KG5vdGlmeSwgdGltZW91dCk7XG4gIH07XG59O1xudmFyIHJBRiA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgOiBjcmVhdGVRdWV1ZVdpdGhUaW1lcigxMCk7XG52YXIgYXV0b0JhdGNoRW5oYW5jZXIgPSAob3B0aW9ucyA9IHtcbiAgdHlwZTogXCJyYWZcIlxufSkgPT4gKG5leHQpID0+ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHN0b3JlID0gbmV4dCguLi5hcmdzKTtcbiAgbGV0IG5vdGlmeWluZyA9IHRydWU7XG4gIGxldCBzaG91bGROb3RpZnlBdEVuZE9mVGljayA9IGZhbHNlO1xuICBsZXQgbm90aWZpY2F0aW9uUXVldWVkID0gZmFsc2U7XG4gIGNvbnN0IGxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0IHF1ZXVlQ2FsbGJhY2sgPSBvcHRpb25zLnR5cGUgPT09IFwidGlja1wiID8gcXVldWVNaWNyb3Rhc2sgOiBvcHRpb25zLnR5cGUgPT09IFwicmFmXCIgPyByQUYgOiBvcHRpb25zLnR5cGUgPT09IFwiY2FsbGJhY2tcIiA/IG9wdGlvbnMucXVldWVOb3RpZmljYXRpb24gOiBjcmVhdGVRdWV1ZVdpdGhUaW1lcihvcHRpb25zLnRpbWVvdXQpO1xuICBjb25zdCBub3RpZnlMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgbm90aWZpY2F0aW9uUXVldWVkID0gZmFsc2U7XG4gICAgaWYgKHNob3VsZE5vdGlmeUF0RW5kT2ZUaWNrKSB7XG4gICAgICBzaG91bGROb3RpZnlBdEVuZE9mVGljayA9IGZhbHNlO1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGwpID0+IGwoKSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RvcmUsIHtcbiAgICAvLyBPdmVycmlkZSB0aGUgYmFzZSBgc3RvcmUuc3Vic2NyaWJlYCBtZXRob2QgdG8ga2VlcCBvcmlnaW5hbCBsaXN0ZW5lcnNcbiAgICAvLyBmcm9tIHJ1bm5pbmcgaWYgd2UncmUgZGVsYXlpbmcgbm90aWZpY2F0aW9uc1xuICAgIHN1YnNjcmliZShsaXN0ZW5lcjIpIHtcbiAgICAgIGNvbnN0IHdyYXBwZWRMaXN0ZW5lciA9ICgpID0+IG5vdGlmeWluZyAmJiBsaXN0ZW5lcjIoKTtcbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc3RvcmUuc3Vic2NyaWJlKHdyYXBwZWRMaXN0ZW5lcik7XG4gICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyMik7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyMik7XG4gICAgICB9O1xuICAgIH0sXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGJhc2UgYHN0b3JlLmRpc3BhdGNoYCBtZXRob2Qgc28gdGhhdCB3ZSBjYW4gY2hlY2sgYWN0aW9uc1xuICAgIC8vIGZvciB0aGUgYHNob3VsZEF1dG9CYXRjaGAgZmxhZyBhbmQgZGV0ZXJtaW5lIGlmIGJhdGNoaW5nIGlzIGFjdGl2ZVxuICAgIGRpc3BhdGNoKGFjdGlvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbm90aWZ5aW5nID0gIWFjdGlvbj8ubWV0YT8uW1NIT1VMRF9BVVRPQkFUQ0hdO1xuICAgICAgICBzaG91bGROb3RpZnlBdEVuZE9mVGljayA9ICFub3RpZnlpbmc7XG4gICAgICAgIGlmIChzaG91bGROb3RpZnlBdEVuZE9mVGljaykge1xuICAgICAgICAgIGlmICghbm90aWZpY2F0aW9uUXVldWVkKSB7XG4gICAgICAgICAgICBub3RpZmljYXRpb25RdWV1ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcXVldWVDYWxsYmFjayhub3RpZnlMaXN0ZW5lcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RvcmUuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIG5vdGlmeWluZyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbi8vIHNyYy9nZXREZWZhdWx0RW5oYW5jZXJzLnRzXG52YXIgYnVpbGRHZXREZWZhdWx0RW5oYW5jZXJzID0gKG1pZGRsZXdhcmVFbmhhbmNlcikgPT4gZnVuY3Rpb24gZ2V0RGVmYXVsdEVuaGFuY2VycyhvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBhdXRvQmF0Y2ggPSB0cnVlXG4gIH0gPSBvcHRpb25zID8/IHt9O1xuICBsZXQgZW5oYW5jZXJBcnJheSA9IG5ldyBUdXBsZShtaWRkbGV3YXJlRW5oYW5jZXIpO1xuICBpZiAoYXV0b0JhdGNoKSB7XG4gICAgZW5oYW5jZXJBcnJheS5wdXNoKGF1dG9CYXRjaEVuaGFuY2VyKHR5cGVvZiBhdXRvQmF0Y2ggPT09IFwib2JqZWN0XCIgPyBhdXRvQmF0Y2ggOiB2b2lkIDApKTtcbiAgfVxuICByZXR1cm4gZW5oYW5jZXJBcnJheTtcbn07XG5cbi8vIHNyYy9jb25maWd1cmVTdG9yZS50c1xuZnVuY3Rpb24gY29uZmlndXJlU3RvcmUob3B0aW9ucykge1xuICBjb25zdCBnZXREZWZhdWx0TWlkZGxld2FyZSA9IGJ1aWxkR2V0RGVmYXVsdE1pZGRsZXdhcmUoKTtcbiAgY29uc3Qge1xuICAgIHJlZHVjZXIgPSB2b2lkIDAsXG4gICAgbWlkZGxld2FyZSxcbiAgICBkZXZUb29scyA9IHRydWUsXG4gICAgcHJlbG9hZGVkU3RhdGUgPSB2b2lkIDAsXG4gICAgZW5oYW5jZXJzID0gdm9pZCAwXG4gIH0gPSBvcHRpb25zIHx8IHt9O1xuICBsZXQgcm9vdFJlZHVjZXI7XG4gIGlmICh0eXBlb2YgcmVkdWNlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcm9vdFJlZHVjZXIgPSByZWR1Y2VyO1xuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QyKHJlZHVjZXIpKSB7XG4gICAgcm9vdFJlZHVjZXIgPSBjb21iaW5lUmVkdWNlcnMocmVkdWNlcik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMSkgOiBcImByZWR1Y2VyYCBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LCBhbmQgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdCBvZiBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGNvbWJpbmVSZWR1Y2Vyc1wiKTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIG1pZGRsZXdhcmUgJiYgdHlwZW9mIG1pZGRsZXdhcmUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIpIDogXCJgbWlkZGxld2FyZWAgZmllbGQgbXVzdCBiZSBhIGNhbGxiYWNrXCIpO1xuICB9XG4gIGxldCBmaW5hbE1pZGRsZXdhcmU7XG4gIGlmICh0eXBlb2YgbWlkZGxld2FyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZmluYWxNaWRkbGV3YXJlID0gbWlkZGxld2FyZShnZXREZWZhdWx0TWlkZGxld2FyZSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhQXJyYXkuaXNBcnJheShmaW5hbE1pZGRsZXdhcmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgzKSA6IFwid2hlbiB1c2luZyBhIG1pZGRsZXdhcmUgYnVpbGRlciBmdW5jdGlvbiwgYW4gYXJyYXkgb2YgbWlkZGxld2FyZSBtdXN0IGJlIHJldHVybmVkXCIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaW5hbE1pZGRsZXdhcmUgPSBnZXREZWZhdWx0TWlkZGxld2FyZSgpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgZmluYWxNaWRkbGV3YXJlLnNvbWUoKGl0ZW0pID0+IHR5cGVvZiBpdGVtICE9PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNCkgOiBcImVhY2ggbWlkZGxld2FyZSBwcm92aWRlZCB0byBjb25maWd1cmVTdG9yZSBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gIH1cbiAgbGV0IGZpbmFsQ29tcG9zZSA9IGNvbXBvc2UyO1xuICBpZiAoZGV2VG9vbHMpIHtcbiAgICBmaW5hbENvbXBvc2UgPSBjb21wb3NlV2l0aERldlRvb2xzKHtcbiAgICAgIC8vIEVuYWJsZSBjYXB0dXJlIG9mIHN0YWNrIHRyYWNlcyBmb3IgZGlzcGF0Y2hlZCBSZWR1eCBhY3Rpb25zXG4gICAgICB0cmFjZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiLFxuICAgICAgLi4udHlwZW9mIGRldlRvb2xzID09PSBcIm9iamVjdFwiICYmIGRldlRvb2xzXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgbWlkZGxld2FyZUVuaGFuY2VyID0gYXBwbHlNaWRkbGV3YXJlKC4uLmZpbmFsTWlkZGxld2FyZSk7XG4gIGNvbnN0IGdldERlZmF1bHRFbmhhbmNlcnMgPSBidWlsZEdldERlZmF1bHRFbmhhbmNlcnMobWlkZGxld2FyZUVuaGFuY2VyKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBlbmhhbmNlcnMgJiYgdHlwZW9mIGVuaGFuY2VycyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNSkgOiBcImBlbmhhbmNlcnNgIGZpZWxkIG11c3QgYmUgYSBjYWxsYmFja1wiKTtcbiAgfVxuICBsZXQgc3RvcmVFbmhhbmNlcnMgPSB0eXBlb2YgZW5oYW5jZXJzID09PSBcImZ1bmN0aW9uXCIgPyBlbmhhbmNlcnMoZ2V0RGVmYXVsdEVuaGFuY2VycykgOiBnZXREZWZhdWx0RW5oYW5jZXJzKCk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIUFycmF5LmlzQXJyYXkoc3RvcmVFbmhhbmNlcnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNikgOiBcImBlbmhhbmNlcnNgIGNhbGxiYWNrIG11c3QgcmV0dXJuIGFuIGFycmF5XCIpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgc3RvcmVFbmhhbmNlcnMuc29tZSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gIT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg3KSA6IFwiZWFjaCBlbmhhbmNlciBwcm92aWRlZCB0byBjb25maWd1cmVTdG9yZSBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBmaW5hbE1pZGRsZXdhcmUubGVuZ3RoICYmICFzdG9yZUVuaGFuY2Vycy5pbmNsdWRlcyhtaWRkbGV3YXJlRW5oYW5jZXIpKSB7XG4gICAgY29uc29sZS5lcnJvcihcIm1pZGRsZXdhcmVzIHdlcmUgcHJvdmlkZWQsIGJ1dCBtaWRkbGV3YXJlIGVuaGFuY2VyIHdhcyBub3QgaW5jbHVkZWQgaW4gZmluYWwgZW5oYW5jZXJzIC0gbWFrZSBzdXJlIHRvIGNhbGwgYGdldERlZmF1bHRFbmhhbmNlcnNgXCIpO1xuICB9XG4gIGNvbnN0IGNvbXBvc2VkRW5oYW5jZXIgPSBmaW5hbENvbXBvc2UoLi4uc3RvcmVFbmhhbmNlcnMpO1xuICByZXR1cm4gY3JlYXRlU3RvcmUocm9vdFJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBjb21wb3NlZEVuaGFuY2VyKTtcbn1cblxuLy8gc3JjL2NyZWF0ZVJlZHVjZXIudHNcbmltcG9ydCB7IHByb2R1Y2UgYXMgY3JlYXRlTmV4dFN0YXRlMiwgaXNEcmFmdCBhcyBpc0RyYWZ0MiwgaXNEcmFmdGFibGUgYXMgaXNEcmFmdGFibGUyIH0gZnJvbSBcImltbWVyXCI7XG5cbi8vIHNyYy9tYXBCdWlsZGVycy50c1xuZnVuY3Rpb24gZXhlY3V0ZVJlZHVjZXJCdWlsZGVyQ2FsbGJhY2soYnVpbGRlckNhbGxiYWNrKSB7XG4gIGNvbnN0IGFjdGlvbnNNYXAgPSB7fTtcbiAgY29uc3QgYWN0aW9uTWF0Y2hlcnMgPSBbXTtcbiAgbGV0IGRlZmF1bHRDYXNlUmVkdWNlcjtcbiAgY29uc3QgYnVpbGRlciA9IHtcbiAgICBhZGRDYXNlKHR5cGVPckFjdGlvbkNyZWF0b3IsIHJlZHVjZXIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGFjdGlvbk1hdGNoZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyNikgOiBcImBidWlsZGVyLmFkZENhc2VgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBgYnVpbGRlci5hZGRNYXRjaGVyYFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdENhc2VSZWR1Y2VyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjcpIDogXCJgYnVpbGRlci5hZGRDYXNlYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYGJ1aWxkZXIuYWRkRGVmYXVsdENhc2VgXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlID0gdHlwZW9mIHR5cGVPckFjdGlvbkNyZWF0b3IgPT09IFwic3RyaW5nXCIgPyB0eXBlT3JBY3Rpb25DcmVhdG9yIDogdHlwZU9yQWN0aW9uQ3JlYXRvci50eXBlO1xuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI4KSA6IFwiYGJ1aWxkZXIuYWRkQ2FzZWAgY2Fubm90IGJlIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGFjdGlvbiB0eXBlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgaW4gYWN0aW9uc01hcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyOSkgOiBgXFxgYnVpbGRlci5hZGRDYXNlXFxgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCB0d28gcmVkdWNlcnMgZm9yIHRoZSBzYW1lIGFjdGlvbiB0eXBlICcke3R5cGV9J2ApO1xuICAgICAgfVxuICAgICAgYWN0aW9uc01hcFt0eXBlXSA9IHJlZHVjZXI7XG4gICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9LFxuICAgIGFkZE1hdGNoZXIobWF0Y2hlciwgcmVkdWNlcikge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBpZiAoZGVmYXVsdENhc2VSZWR1Y2VyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzApIDogXCJgYnVpbGRlci5hZGRNYXRjaGVyYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgYGJ1aWxkZXIuYWRkRGVmYXVsdENhc2VgXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhY3Rpb25NYXRjaGVycy5wdXNoKHtcbiAgICAgICAgbWF0Y2hlcixcbiAgICAgICAgcmVkdWNlclxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYnVpbGRlcjtcbiAgICB9LFxuICAgIGFkZERlZmF1bHRDYXNlKHJlZHVjZXIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMxKSA6IFwiYGJ1aWxkZXIuYWRkRGVmYXVsdENhc2VgIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZWZhdWx0Q2FzZVJlZHVjZXIgPSByZWR1Y2VyO1xuICAgICAgcmV0dXJuIGJ1aWxkZXI7XG4gICAgfVxuICB9O1xuICBidWlsZGVyQ2FsbGJhY2soYnVpbGRlcik7XG4gIHJldHVybiBbYWN0aW9uc01hcCwgYWN0aW9uTWF0Y2hlcnMsIGRlZmF1bHRDYXNlUmVkdWNlcl07XG59XG5cbi8vIHNyYy9jcmVhdGVSZWR1Y2VyLnRzXG5mdW5jdGlvbiBpc1N0YXRlRnVuY3Rpb24oeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlZHVjZXIoaW5pdGlhbFN0YXRlLCBtYXBPckJ1aWxkZXJDYWxsYmFjaykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKHR5cGVvZiBtYXBPckJ1aWxkZXJDYWxsYmFjayA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkgOiBcIlRoZSBvYmplY3Qgbm90YXRpb24gZm9yIGBjcmVhdGVSZWR1Y2VyYCBoYXMgYmVlbiByZW1vdmVkLiBQbGVhc2UgdXNlIHRoZSAnYnVpbGRlciBjYWxsYmFjaycgbm90YXRpb24gaW5zdGVhZDogaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy9hcGkvY3JlYXRlUmVkdWNlclwiKTtcbiAgICB9XG4gIH1cbiAgbGV0IFthY3Rpb25zTWFwLCBmaW5hbEFjdGlvbk1hdGNoZXJzLCBmaW5hbERlZmF1bHRDYXNlUmVkdWNlcl0gPSBleGVjdXRlUmVkdWNlckJ1aWxkZXJDYWxsYmFjayhtYXBPckJ1aWxkZXJDYWxsYmFjayk7XG4gIGxldCBnZXRJbml0aWFsU3RhdGU7XG4gIGlmIChpc1N0YXRlRnVuY3Rpb24oaW5pdGlhbFN0YXRlKSkge1xuICAgIGdldEluaXRpYWxTdGF0ZSA9ICgpID0+IGZyZWV6ZURyYWZ0YWJsZShpbml0aWFsU3RhdGUoKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZnJvemVuSW5pdGlhbFN0YXRlID0gZnJlZXplRHJhZnRhYmxlKGluaXRpYWxTdGF0ZSk7XG4gICAgZ2V0SW5pdGlhbFN0YXRlID0gKCkgPT4gZnJvemVuSW5pdGlhbFN0YXRlO1xuICB9XG4gIGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUgPSBnZXRJbml0aWFsU3RhdGUoKSwgYWN0aW9uKSB7XG4gICAgbGV0IGNhc2VSZWR1Y2VycyA9IFthY3Rpb25zTWFwW2FjdGlvbi50eXBlXSwgLi4uZmluYWxBY3Rpb25NYXRjaGVycy5maWx0ZXIoKHtcbiAgICAgIG1hdGNoZXJcbiAgICB9KSA9PiBtYXRjaGVyKGFjdGlvbikpLm1hcCgoe1xuICAgICAgcmVkdWNlcjogcmVkdWNlcjJcbiAgICB9KSA9PiByZWR1Y2VyMildO1xuICAgIGlmIChjYXNlUmVkdWNlcnMuZmlsdGVyKChjcikgPT4gISFjcikubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYXNlUmVkdWNlcnMgPSBbZmluYWxEZWZhdWx0Q2FzZVJlZHVjZXJdO1xuICAgIH1cbiAgICByZXR1cm4gY2FzZVJlZHVjZXJzLnJlZHVjZSgocHJldmlvdXNTdGF0ZSwgY2FzZVJlZHVjZXIpID0+IHtcbiAgICAgIGlmIChjYXNlUmVkdWNlcikge1xuICAgICAgICBpZiAoaXNEcmFmdDIocHJldmlvdXNTdGF0ZSkpIHtcbiAgICAgICAgICBjb25zdCBkcmFmdCA9IHByZXZpb3VzU3RhdGU7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FzZVJlZHVjZXIoZHJhZnQsIGFjdGlvbik7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXNTdGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmICghaXNEcmFmdGFibGUyKHByZXZpb3VzU3RhdGUpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FzZVJlZHVjZXIocHJldmlvdXNTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1N0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOSkgOiBcIkEgY2FzZSByZWR1Y2VyIG9uIGEgbm9uLWRyYWZ0YWJsZSB2YWx1ZSBtdXN0IG5vdCByZXR1cm4gdW5kZWZpbmVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVOZXh0U3RhdGUyKHByZXZpb3VzU3RhdGUsIChkcmFmdCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNhc2VSZWR1Y2VyKGRyYWZ0LCBhY3Rpb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJldmlvdXNTdGF0ZTtcbiAgICB9LCBzdGF0ZSk7XG4gIH1cbiAgcmVkdWNlci5nZXRJbml0aWFsU3RhdGUgPSBnZXRJbml0aWFsU3RhdGU7XG4gIHJldHVybiByZWR1Y2VyO1xufVxuXG4vLyBzcmMvbWF0Y2hlcnMudHNcbnZhciBtYXRjaGVzID0gKG1hdGNoZXIsIGFjdGlvbikgPT4ge1xuICBpZiAoaGFzTWF0Y2hGdW5jdGlvbihtYXRjaGVyKSkge1xuICAgIHJldHVybiBtYXRjaGVyLm1hdGNoKGFjdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1hdGNoZXIoYWN0aW9uKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGlzQW55T2YoLi4ubWF0Y2hlcnMpIHtcbiAgcmV0dXJuIChhY3Rpb24pID0+IHtcbiAgICByZXR1cm4gbWF0Y2hlcnMuc29tZSgobWF0Y2hlcikgPT4gbWF0Y2hlcyhtYXRjaGVyLCBhY3Rpb24pKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGlzQWxsT2YoLi4ubWF0Y2hlcnMpIHtcbiAgcmV0dXJuIChhY3Rpb24pID0+IHtcbiAgICByZXR1cm4gbWF0Y2hlcnMuZXZlcnkoKG1hdGNoZXIpID0+IG1hdGNoZXMobWF0Y2hlciwgYWN0aW9uKSk7XG4gIH07XG59XG5mdW5jdGlvbiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIHZhbGlkU3RhdHVzKSB7XG4gIGlmICghYWN0aW9uIHx8ICFhY3Rpb24ubWV0YSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBoYXNWYWxpZFJlcXVlc3RJZCA9IHR5cGVvZiBhY3Rpb24ubWV0YS5yZXF1ZXN0SWQgPT09IFwic3RyaW5nXCI7XG4gIGNvbnN0IGhhc1ZhbGlkUmVxdWVzdFN0YXR1cyA9IHZhbGlkU3RhdHVzLmluZGV4T2YoYWN0aW9uLm1ldGEucmVxdWVzdFN0YXR1cykgPiAtMTtcbiAgcmV0dXJuIGhhc1ZhbGlkUmVxdWVzdElkICYmIGhhc1ZhbGlkUmVxdWVzdFN0YXR1cztcbn1cbmZ1bmN0aW9uIGlzQXN5bmNUaHVua0FycmF5KGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBhWzBdID09PSBcImZ1bmN0aW9uXCIgJiYgXCJwZW5kaW5nXCIgaW4gYVswXSAmJiBcImZ1bGZpbGxlZFwiIGluIGFbMF0gJiYgXCJyZWplY3RlZFwiIGluIGFbMF07XG59XG5mdW5jdGlvbiBpc1BlbmRpbmcoLi4uYXN5bmNUaHVua3MpIHtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYWN0aW9uKSA9PiBoYXNFeHBlY3RlZFJlcXVlc3RNZXRhZGF0YShhY3Rpb24sIFtcInBlbmRpbmdcIl0pO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzUGVuZGluZygpKGFzeW5jVGh1bmtzWzBdKTtcbiAgfVxuICByZXR1cm4gaXNBbnlPZiguLi5hc3luY1RodW5rcy5tYXAoKGFzeW5jVGh1bmspID0+IGFzeW5jVGh1bmsucGVuZGluZykpO1xufVxuZnVuY3Rpb24gaXNSZWplY3RlZCguLi5hc3luY1RodW5rcykge1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhY3Rpb24pID0+IGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wicmVqZWN0ZWRcIl0pO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzUmVqZWN0ZWQoKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQW55T2YoLi4uYXN5bmNUaHVua3MubWFwKChhc3luY1RodW5rKSA9PiBhc3luY1RodW5rLnJlamVjdGVkKSk7XG59XG5mdW5jdGlvbiBpc1JlamVjdGVkV2l0aFZhbHVlKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGNvbnN0IGhhc0ZsYWcgPSAoYWN0aW9uKSA9PiB7XG4gICAgcmV0dXJuIGFjdGlvbiAmJiBhY3Rpb24ubWV0YSAmJiBhY3Rpb24ubWV0YS5yZWplY3RlZFdpdGhWYWx1ZTtcbiAgfTtcbiAgaWYgKGFzeW5jVGh1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBpc0FsbE9mKGlzUmVqZWN0ZWQoLi4uYXN5bmNUaHVua3MpLCBoYXNGbGFnKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc1JlamVjdGVkV2l0aFZhbHVlKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FsbE9mKGlzUmVqZWN0ZWQoLi4uYXN5bmNUaHVua3MpLCBoYXNGbGFnKTtcbn1cbmZ1bmN0aW9uIGlzRnVsZmlsbGVkKC4uLmFzeW5jVGh1bmtzKSB7XG4gIGlmIChhc3luY1RodW5rcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKGFjdGlvbikgPT4gaGFzRXhwZWN0ZWRSZXF1ZXN0TWV0YWRhdGEoYWN0aW9uLCBbXCJmdWxmaWxsZWRcIl0pO1xuICB9XG4gIGlmICghaXNBc3luY1RodW5rQXJyYXkoYXN5bmNUaHVua3MpKSB7XG4gICAgcmV0dXJuIGlzRnVsZmlsbGVkKCkoYXN5bmNUaHVua3NbMF0pO1xuICB9XG4gIHJldHVybiBpc0FueU9mKC4uLmFzeW5jVGh1bmtzLm1hcCgoYXN5bmNUaHVuaykgPT4gYXN5bmNUaHVuay5mdWxmaWxsZWQpKTtcbn1cbmZ1bmN0aW9uIGlzQXN5bmNUaHVua0FjdGlvbiguLi5hc3luY1RodW5rcykge1xuICBpZiAoYXN5bmNUaHVua3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChhY3Rpb24pID0+IGhhc0V4cGVjdGVkUmVxdWVzdE1ldGFkYXRhKGFjdGlvbiwgW1wicGVuZGluZ1wiLCBcImZ1bGZpbGxlZFwiLCBcInJlamVjdGVkXCJdKTtcbiAgfVxuICBpZiAoIWlzQXN5bmNUaHVua0FycmF5KGFzeW5jVGh1bmtzKSkge1xuICAgIHJldHVybiBpc0FzeW5jVGh1bmtBY3Rpb24oKShhc3luY1RodW5rc1swXSk7XG4gIH1cbiAgcmV0dXJuIGlzQW55T2YoLi4uYXN5bmNUaHVua3MuZmxhdE1hcCgoYXN5bmNUaHVuaykgPT4gW2FzeW5jVGh1bmsucGVuZGluZywgYXN5bmNUaHVuay5yZWplY3RlZCwgYXN5bmNUaHVuay5mdWxmaWxsZWRdKSk7XG59XG5cbi8vIHNyYy9uYW5vaWQudHNcbnZhciB1cmxBbHBoYWJldCA9IFwiTW9kdWxlU3ltYmhhc093blByLTAxMjM0NTY3ODlBQkNERUZHSE5SVmZnY3RpVXZ6X0txWVRKa0x4cFpYSWpRV1wiO1xudmFyIG5hbm9pZCA9IChzaXplID0gMjEpID0+IHtcbiAgbGV0IGlkID0gXCJcIjtcbiAgbGV0IGkgPSBzaXplO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgaWQgKz0gdXJsQWxwaGFiZXRbTWF0aC5yYW5kb20oKSAqIDY0IHwgMF07XG4gIH1cbiAgcmV0dXJuIGlkO1xufTtcblxuLy8gc3JjL2NyZWF0ZUFzeW5jVGh1bmsudHNcbnZhciBjb21tb25Qcm9wZXJ0aWVzID0gW1wibmFtZVwiLCBcIm1lc3NhZ2VcIiwgXCJzdGFja1wiLCBcImNvZGVcIl07XG52YXIgUmVqZWN0V2l0aFZhbHVlID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihwYXlsb2FkLCBtZXRhKSB7XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICB9XG4gIC8qXG4gIHR5cGUtb25seSBwcm9wZXJ0eSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIFJlamVjdFdpdGhWYWx1ZSBhbmQgRnVsZmlsbFdpdGhNZXRhXG4gIGRvZXMgbm90IGV4aXN0IGF0IHJ1bnRpbWVcbiAgKi9cbiAgX3R5cGU7XG59O1xudmFyIEZ1bGZpbGxXaXRoTWV0YSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IocGF5bG9hZCwgbWV0YSkge1xuICAgIHRoaXMucGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgdGhpcy5tZXRhID0gbWV0YTtcbiAgfVxuICAvKlxuICB0eXBlLW9ubHkgcHJvcGVydHkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBSZWplY3RXaXRoVmFsdWUgYW5kIEZ1bGZpbGxXaXRoTWV0YVxuICBkb2VzIG5vdCBleGlzdCBhdCBydW50aW1lXG4gICovXG4gIF90eXBlO1xufTtcbnZhciBtaW5pU2VyaWFsaXplRXJyb3IgPSAodmFsdWUpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHNpbXBsZUVycm9yID0ge307XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBjb21tb25Qcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlW3Byb3BlcnR5XSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBzaW1wbGVFcnJvcltwcm9wZXJ0eV0gPSB2YWx1ZVtwcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaW1wbGVFcnJvcjtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2U6IFN0cmluZyh2YWx1ZSlcbiAgfTtcbn07XG52YXIgY3JlYXRlQXN5bmNUaHVuayA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4ge1xuICBmdW5jdGlvbiBjcmVhdGVBc3luY1RodW5rMih0eXBlUHJlZml4LCBwYXlsb2FkQ3JlYXRvciwgb3B0aW9ucykge1xuICAgIGNvbnN0IGZ1bGZpbGxlZCA9IGNyZWF0ZUFjdGlvbih0eXBlUHJlZml4ICsgXCIvZnVsZmlsbGVkXCIsIChwYXlsb2FkLCByZXF1ZXN0SWQsIGFyZywgbWV0YSkgPT4gKHtcbiAgICAgIHBheWxvYWQsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLm1ldGEgfHwge30sXG4gICAgICAgIGFyZyxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICByZXF1ZXN0U3RhdHVzOiBcImZ1bGZpbGxlZFwiXG4gICAgICB9XG4gICAgfSkpO1xuICAgIGNvbnN0IHBlbmRpbmcgPSBjcmVhdGVBY3Rpb24odHlwZVByZWZpeCArIFwiL3BlbmRpbmdcIiwgKHJlcXVlc3RJZCwgYXJnLCBtZXRhKSA9PiAoe1xuICAgICAgcGF5bG9hZDogdm9pZCAwLFxuICAgICAgbWV0YToge1xuICAgICAgICAuLi5tZXRhIHx8IHt9LFxuICAgICAgICBhcmcsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgcmVxdWVzdFN0YXR1czogXCJwZW5kaW5nXCJcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgY29uc3QgcmVqZWN0ZWQgPSBjcmVhdGVBY3Rpb24odHlwZVByZWZpeCArIFwiL3JlamVjdGVkXCIsIChlcnJvciwgcmVxdWVzdElkLCBhcmcsIHBheWxvYWQsIG1ldGEpID0+ICh7XG4gICAgICBwYXlsb2FkLFxuICAgICAgZXJyb3I6IChvcHRpb25zICYmIG9wdGlvbnMuc2VyaWFsaXplRXJyb3IgfHwgbWluaVNlcmlhbGl6ZUVycm9yKShlcnJvciB8fCBcIlJlamVjdGVkXCIpLFxuICAgICAgbWV0YToge1xuICAgICAgICAuLi5tZXRhIHx8IHt9LFxuICAgICAgICBhcmcsXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgcmVqZWN0ZWRXaXRoVmFsdWU6ICEhcGF5bG9hZCxcbiAgICAgICAgcmVxdWVzdFN0YXR1czogXCJyZWplY3RlZFwiLFxuICAgICAgICBhYm9ydGVkOiBlcnJvcj8ubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIsXG4gICAgICAgIGNvbmRpdGlvbjogZXJyb3I/Lm5hbWUgPT09IFwiQ29uZGl0aW9uRXJyb3JcIlxuICAgICAgfVxuICAgIH0pKTtcbiAgICBmdW5jdGlvbiBhY3Rpb25DcmVhdG9yKGFyZykge1xuICAgICAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUsIGV4dHJhKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IG9wdGlvbnM/LmlkR2VuZXJhdG9yID8gb3B0aW9ucy5pZEdlbmVyYXRvcihhcmcpIDogbmFub2lkKCk7XG4gICAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgbGV0IGFib3J0SGFuZGxlcjtcbiAgICAgICAgbGV0IGFib3J0UmVhc29uO1xuICAgICAgICBmdW5jdGlvbiBhYm9ydChyZWFzb24pIHtcbiAgICAgICAgICBhYm9ydFJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9taXNlID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgbGV0IGZpbmFsQWN0aW9uO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgY29uZGl0aW9uUmVzdWx0ID0gb3B0aW9ucz8uY29uZGl0aW9uPy4oYXJnLCB7XG4gICAgICAgICAgICAgIGdldFN0YXRlLFxuICAgICAgICAgICAgICBleHRyYVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNUaGVuYWJsZShjb25kaXRpb25SZXN1bHQpKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvblJlc3VsdCA9IGF3YWl0IGNvbmRpdGlvblJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25kaXRpb25SZXN1bHQgPT09IGZhbHNlIHx8IGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICB0aHJvdyB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJDb25kaXRpb25FcnJvclwiLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiQWJvcnRlZCBkdWUgdG8gY29uZGl0aW9uIGNhbGxiYWNrIHJldHVybmluZyBmYWxzZS5cIlxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWJvcnRlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgIGFib3J0SGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3Qoe1xuICAgICAgICAgICAgICAgICAgbmFtZTogXCJBYm9ydEVycm9yXCIsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBhYm9ydFJlYXNvbiB8fCBcIkFib3J0ZWRcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkaXNwYXRjaChwZW5kaW5nKHJlcXVlc3RJZCwgYXJnLCBvcHRpb25zPy5nZXRQZW5kaW5nTWV0YT8uKHtcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgZ2V0U3RhdGUsXG4gICAgICAgICAgICAgIGV4dHJhXG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgZmluYWxBY3Rpb24gPSBhd2FpdCBQcm9taXNlLnJhY2UoW2Fib3J0ZWRQcm9taXNlLCBQcm9taXNlLnJlc29sdmUocGF5bG9hZENyZWF0b3IoYXJnLCB7XG4gICAgICAgICAgICAgIGRpc3BhdGNoLFxuICAgICAgICAgICAgICBnZXRTdGF0ZSxcbiAgICAgICAgICAgICAgZXh0cmEsXG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICBhYm9ydCxcbiAgICAgICAgICAgICAgcmVqZWN0V2l0aFZhbHVlOiAodmFsdWUsIG1ldGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlamVjdFdpdGhWYWx1ZSh2YWx1ZSwgbWV0YSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bGZpbGxXaXRoVmFsdWU6ICh2YWx1ZSwgbWV0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVsZmlsbFdpdGhNZXRhKHZhbHVlLCBtZXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVqZWN0V2l0aFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBGdWxmaWxsV2l0aE1ldGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVsZmlsbGVkKHJlc3VsdC5wYXlsb2FkLCByZXF1ZXN0SWQsIGFyZywgcmVzdWx0Lm1ldGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmdWxmaWxsZWQocmVzdWx0LCByZXF1ZXN0SWQsIGFyZyk7XG4gICAgICAgICAgICB9KV0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZmluYWxBY3Rpb24gPSBlcnIgaW5zdGFuY2VvZiBSZWplY3RXaXRoVmFsdWUgPyByZWplY3RlZChudWxsLCByZXF1ZXN0SWQsIGFyZywgZXJyLnBheWxvYWQsIGVyci5tZXRhKSA6IHJlamVjdGVkKGVyciwgcmVxdWVzdElkLCBhcmcpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoYWJvcnRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNraXBEaXNwYXRjaCA9IG9wdGlvbnMgJiYgIW9wdGlvbnMuZGlzcGF0Y2hDb25kaXRpb25SZWplY3Rpb24gJiYgcmVqZWN0ZWQubWF0Y2goZmluYWxBY3Rpb24pICYmIGZpbmFsQWN0aW9uLm1ldGEuY29uZGl0aW9uO1xuICAgICAgICAgIGlmICghc2tpcERpc3BhdGNoKSB7XG4gICAgICAgICAgICBkaXNwYXRjaChmaW5hbEFjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaW5hbEFjdGlvbjtcbiAgICAgICAgfSgpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgICAgICAgYWJvcnQsXG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgIGFyZyxcbiAgICAgICAgICB1bndyYXAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKHVud3JhcFJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjdGlvbkNyZWF0b3IsIHtcbiAgICAgIHBlbmRpbmcsXG4gICAgICByZWplY3RlZCxcbiAgICAgIGZ1bGZpbGxlZCxcbiAgICAgIHNldHRsZWQ6IGlzQW55T2YocmVqZWN0ZWQsIGZ1bGZpbGxlZCksXG4gICAgICB0eXBlUHJlZml4XG4gICAgfSk7XG4gIH1cbiAgY3JlYXRlQXN5bmNUaHVuazIud2l0aFR5cGVzID0gKCkgPT4gY3JlYXRlQXN5bmNUaHVuazI7XG4gIHJldHVybiBjcmVhdGVBc3luY1RodW5rMjtcbn0pKCk7XG5mdW5jdGlvbiB1bndyYXBSZXN1bHQoYWN0aW9uKSB7XG4gIGlmIChhY3Rpb24ubWV0YSAmJiBhY3Rpb24ubWV0YS5yZWplY3RlZFdpdGhWYWx1ZSkge1xuICAgIHRocm93IGFjdGlvbi5wYXlsb2FkO1xuICB9XG4gIGlmIChhY3Rpb24uZXJyb3IpIHtcbiAgICB0aHJvdyBhY3Rpb24uZXJyb3I7XG4gIH1cbiAgcmV0dXJuIGFjdGlvbi5wYXlsb2FkO1xufVxuZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8vIHNyYy9jcmVhdGVTbGljZS50c1xudmFyIGFzeW5jVGh1bmtTeW1ib2wgPSAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcihcInJ0ay1zbGljZS1jcmVhdGVhc3luY3RodW5rXCIpO1xudmFyIGFzeW5jVGh1bmtDcmVhdG9yID0ge1xuICBbYXN5bmNUaHVua1N5bWJvbF06IGNyZWF0ZUFzeW5jVGh1bmtcbn07XG52YXIgUmVkdWNlclR5cGUgPSAvKiBAX19QVVJFX18gKi8gKChSZWR1Y2VyVHlwZTIpID0+IHtcbiAgUmVkdWNlclR5cGUyW1wicmVkdWNlclwiXSA9IFwicmVkdWNlclwiO1xuICBSZWR1Y2VyVHlwZTJbXCJyZWR1Y2VyV2l0aFByZXBhcmVcIl0gPSBcInJlZHVjZXJXaXRoUHJlcGFyZVwiO1xuICBSZWR1Y2VyVHlwZTJbXCJhc3luY1RodW5rXCJdID0gXCJhc3luY1RodW5rXCI7XG4gIHJldHVybiBSZWR1Y2VyVHlwZTI7XG59KShSZWR1Y2VyVHlwZSB8fCB7fSk7XG5mdW5jdGlvbiBnZXRUeXBlKHNsaWNlLCBhY3Rpb25LZXkpIHtcbiAgcmV0dXJuIGAke3NsaWNlfS8ke2FjdGlvbktleX1gO1xufVxuZnVuY3Rpb24gYnVpbGRDcmVhdGVTbGljZSh7XG4gIGNyZWF0b3JzXG59ID0ge30pIHtcbiAgY29uc3QgY0FUID0gY3JlYXRvcnM/LmFzeW5jVGh1bms/Llthc3luY1RodW5rU3ltYm9sXTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVNsaWNlMihvcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHJlZHVjZXJQYXRoID0gbmFtZVxuICAgIH0gPSBvcHRpb25zO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTEpIDogXCJgbmFtZWAgaXMgYSByZXF1aXJlZCBvcHRpb24gZm9yIGNyZWF0ZVNsaWNlXCIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgaWYgKG9wdGlvbnMuaW5pdGlhbFN0YXRlID09PSB2b2lkIDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIllvdSBtdXN0IHByb3ZpZGUgYW4gYGluaXRpYWxTdGF0ZWAgdmFsdWUgdGhhdCBpcyBub3QgYHVuZGVmaW5lZGAuIFlvdSBtYXkgaGF2ZSBtaXNzcGVsbGVkIGBpbml0aWFsU3RhdGVgXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZWR1Y2VycyA9ICh0eXBlb2Ygb3B0aW9ucy5yZWR1Y2VycyA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy5yZWR1Y2VycyhidWlsZFJlZHVjZXJDcmVhdG9ycygpKSA6IG9wdGlvbnMucmVkdWNlcnMpIHx8IHt9O1xuICAgIGNvbnN0IHJlZHVjZXJOYW1lcyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgc2xpY2VDYXNlUmVkdWNlcnNCeU5hbWU6IHt9LFxuICAgICAgc2xpY2VDYXNlUmVkdWNlcnNCeVR5cGU6IHt9LFxuICAgICAgYWN0aW9uQ3JlYXRvcnM6IHt9LFxuICAgICAgc2xpY2VNYXRjaGVyczogW11cbiAgICB9O1xuICAgIGNvbnN0IGNvbnRleHRNZXRob2RzID0ge1xuICAgICAgYWRkQ2FzZSh0eXBlT3JBY3Rpb25DcmVhdG9yLCByZWR1Y2VyMikge1xuICAgICAgICBjb25zdCB0eXBlID0gdHlwZW9mIHR5cGVPckFjdGlvbkNyZWF0b3IgPT09IFwic3RyaW5nXCIgPyB0eXBlT3JBY3Rpb25DcmVhdG9yIDogdHlwZU9yQWN0aW9uQ3JlYXRvci50eXBlO1xuICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMikgOiBcImBjb250ZXh0LmFkZENhc2VgIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBhbiBlbXB0eSBhY3Rpb24gdHlwZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSBpbiBjb250ZXh0LnNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTMpIDogXCJgY29udGV4dC5hZGRDYXNlYCBjYW5ub3QgYmUgY2FsbGVkIHdpdGggdHdvIHJlZHVjZXJzIGZvciB0aGUgc2FtZSBhY3Rpb24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnNsaWNlQ2FzZVJlZHVjZXJzQnlUeXBlW3R5cGVdID0gcmVkdWNlcjI7XG4gICAgICAgIHJldHVybiBjb250ZXh0TWV0aG9kcztcbiAgICAgIH0sXG4gICAgICBhZGRNYXRjaGVyKG1hdGNoZXIsIHJlZHVjZXIyKSB7XG4gICAgICAgIGNvbnRleHQuc2xpY2VNYXRjaGVycy5wdXNoKHtcbiAgICAgICAgICBtYXRjaGVyLFxuICAgICAgICAgIHJlZHVjZXI6IHJlZHVjZXIyXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udGV4dE1ldGhvZHM7XG4gICAgICB9LFxuICAgICAgZXhwb3NlQWN0aW9uKG5hbWUyLCBhY3Rpb25DcmVhdG9yKSB7XG4gICAgICAgIGNvbnRleHQuYWN0aW9uQ3JlYXRvcnNbbmFtZTJdID0gYWN0aW9uQ3JlYXRvcjtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRNZXRob2RzO1xuICAgICAgfSxcbiAgICAgIGV4cG9zZUNhc2VSZWR1Y2VyKG5hbWUyLCByZWR1Y2VyMikge1xuICAgICAgICBjb250ZXh0LnNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lW25hbWUyXSA9IHJlZHVjZXIyO1xuICAgICAgICByZXR1cm4gY29udGV4dE1ldGhvZHM7XG4gICAgICB9XG4gICAgfTtcbiAgICByZWR1Y2VyTmFtZXMuZm9yRWFjaCgocmVkdWNlck5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHJlZHVjZXJEZWZpbml0aW9uID0gcmVkdWNlcnNbcmVkdWNlck5hbWVdO1xuICAgICAgY29uc3QgcmVkdWNlckRldGFpbHMgPSB7XG4gICAgICAgIHJlZHVjZXJOYW1lLFxuICAgICAgICB0eXBlOiBnZXRUeXBlKG5hbWUsIHJlZHVjZXJOYW1lKSxcbiAgICAgICAgY3JlYXRlTm90YXRpb246IHR5cGVvZiBvcHRpb25zLnJlZHVjZXJzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgIH07XG4gICAgICBpZiAoaXNBc3luY1RodW5rU2xpY2VSZWR1Y2VyRGVmaW5pdGlvbihyZWR1Y2VyRGVmaW5pdGlvbikpIHtcbiAgICAgICAgaGFuZGxlVGh1bmtDYXNlUmVkdWNlckRlZmluaXRpb24ocmVkdWNlckRldGFpbHMsIHJlZHVjZXJEZWZpbml0aW9uLCBjb250ZXh0TWV0aG9kcywgY0FUKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhbmRsZU5vcm1hbFJlZHVjZXJEZWZpbml0aW9uKHJlZHVjZXJEZXRhaWxzLCByZWR1Y2VyRGVmaW5pdGlvbiwgY29udGV4dE1ldGhvZHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGJ1aWxkUmVkdWNlcigpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmV4dHJhUmVkdWNlcnMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNCkgOiBcIlRoZSBvYmplY3Qgbm90YXRpb24gZm9yIGBjcmVhdGVTbGljZS5leHRyYVJlZHVjZXJzYCBoYXMgYmVlbiByZW1vdmVkLiBQbGVhc2UgdXNlIHRoZSAnYnVpbGRlciBjYWxsYmFjaycgbm90YXRpb24gaW5zdGVhZDogaHR0cHM6Ly9yZWR1eC10b29sa2l0LmpzLm9yZy9hcGkvY3JlYXRlU2xpY2VcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IFtleHRyYVJlZHVjZXJzID0ge30sIGFjdGlvbk1hdGNoZXJzID0gW10sIGRlZmF1bHRDYXNlUmVkdWNlciA9IHZvaWQgMF0gPSB0eXBlb2Ygb3B0aW9ucy5leHRyYVJlZHVjZXJzID09PSBcImZ1bmN0aW9uXCIgPyBleGVjdXRlUmVkdWNlckJ1aWxkZXJDYWxsYmFjayhvcHRpb25zLmV4dHJhUmVkdWNlcnMpIDogW29wdGlvbnMuZXh0cmFSZWR1Y2Vyc107XG4gICAgICBjb25zdCBmaW5hbENhc2VSZWR1Y2VycyA9IHtcbiAgICAgICAgLi4uZXh0cmFSZWR1Y2VycyxcbiAgICAgICAgLi4uY29udGV4dC5zbGljZUNhc2VSZWR1Y2Vyc0J5VHlwZVxuICAgICAgfTtcbiAgICAgIHJldHVybiBjcmVhdGVSZWR1Y2VyKG9wdGlvbnMuaW5pdGlhbFN0YXRlLCAoYnVpbGRlcikgPT4ge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gZmluYWxDYXNlUmVkdWNlcnMpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZENhc2Uoa2V5LCBmaW5hbENhc2VSZWR1Y2Vyc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBzTSBvZiBjb250ZXh0LnNsaWNlTWF0Y2hlcnMpIHtcbiAgICAgICAgICBidWlsZGVyLmFkZE1hdGNoZXIoc00ubWF0Y2hlciwgc00ucmVkdWNlcik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbSBvZiBhY3Rpb25NYXRjaGVycykge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkTWF0Y2hlcihtLm1hdGNoZXIsIG0ucmVkdWNlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRDYXNlUmVkdWNlcikge1xuICAgICAgICAgIGJ1aWxkZXIuYWRkRGVmYXVsdENhc2UoZGVmYXVsdENhc2VSZWR1Y2VyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdFNlbGYgPSAoc3RhdGUpID0+IHN0YXRlO1xuICAgIGNvbnN0IGluamVjdGVkU2VsZWN0b3JDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgbGV0IF9yZWR1Y2VyO1xuICAgIGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAgICAgaWYgKCFfcmVkdWNlcikgX3JlZHVjZXIgPSBidWlsZFJlZHVjZXIoKTtcbiAgICAgIHJldHVybiBfcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgaWYgKCFfcmVkdWNlcikgX3JlZHVjZXIgPSBidWlsZFJlZHVjZXIoKTtcbiAgICAgIHJldHVybiBfcmVkdWNlci5nZXRJbml0aWFsU3RhdGUoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZVNlbGVjdG9yUHJvcHMocmVkdWNlclBhdGgyLCBpbmplY3RlZCA9IGZhbHNlKSB7XG4gICAgICBmdW5jdGlvbiBzZWxlY3RTbGljZShzdGF0ZSkge1xuICAgICAgICBsZXQgc2xpY2VTdGF0ZSA9IHN0YXRlW3JlZHVjZXJQYXRoMl07XG4gICAgICAgIGlmICh0eXBlb2Ygc2xpY2VTdGF0ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGlmIChpbmplY3RlZCkge1xuICAgICAgICAgICAgc2xpY2VTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNSkgOiBcInNlbGVjdFNsaWNlIHJldHVybmVkIHVuZGVmaW5lZCBmb3IgYW4gdW5pbmplY3RlZCBzbGljZSByZWR1Y2VyXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2xpY2VTdGF0ZTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGdldFNlbGVjdG9ycyhzZWxlY3RTdGF0ZSA9IHNlbGVjdFNlbGYpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3JDYWNoZSA9IGVtcGxhY2UoaW5qZWN0ZWRTZWxlY3RvckNhY2hlLCBpbmplY3RlZCwge1xuICAgICAgICAgIGluc2VydDogKCkgPT4gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKClcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlbXBsYWNlKHNlbGVjdG9yQ2FjaGUsIHNlbGVjdFN0YXRlLCB7XG4gICAgICAgICAgaW5zZXJ0OiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUyLCBzZWxlY3Rvcl0gb2YgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5zZWxlY3RvcnMgPz8ge30pKSB7XG4gICAgICAgICAgICAgIG1hcFtuYW1lMl0gPSB3cmFwU2VsZWN0b3Ioc2VsZWN0b3IsIHNlbGVjdFN0YXRlLCBnZXRJbml0aWFsU3RhdGUsIGluamVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZHVjZXJQYXRoOiByZWR1Y2VyUGF0aDIsXG4gICAgICAgIGdldFNlbGVjdG9ycyxcbiAgICAgICAgZ2V0IHNlbGVjdG9ycygpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0U2VsZWN0b3JzKHNlbGVjdFNsaWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0U2xpY2VcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHNsaWNlID0ge1xuICAgICAgbmFtZSxcbiAgICAgIHJlZHVjZXIsXG4gICAgICBhY3Rpb25zOiBjb250ZXh0LmFjdGlvbkNyZWF0b3JzLFxuICAgICAgY2FzZVJlZHVjZXJzOiBjb250ZXh0LnNsaWNlQ2FzZVJlZHVjZXJzQnlOYW1lLFxuICAgICAgZ2V0SW5pdGlhbFN0YXRlLFxuICAgICAgLi4ubWFrZVNlbGVjdG9yUHJvcHMocmVkdWNlclBhdGgpLFxuICAgICAgaW5qZWN0SW50byhpbmplY3RhYmxlLCB7XG4gICAgICAgIHJlZHVjZXJQYXRoOiBwYXRoT3B0LFxuICAgICAgICAuLi5jb25maWdcbiAgICAgIH0gPSB7fSkge1xuICAgICAgICBjb25zdCBuZXdSZWR1Y2VyUGF0aCA9IHBhdGhPcHQgPz8gcmVkdWNlclBhdGg7XG4gICAgICAgIGluamVjdGFibGUuaW5qZWN0KHtcbiAgICAgICAgICByZWR1Y2VyUGF0aDogbmV3UmVkdWNlclBhdGgsXG4gICAgICAgICAgcmVkdWNlclxuICAgICAgICB9LCBjb25maWcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnNsaWNlLFxuICAgICAgICAgIC4uLm1ha2VTZWxlY3RvclByb3BzKG5ld1JlZHVjZXJQYXRoLCB0cnVlKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHNsaWNlO1xuICB9O1xufVxuZnVuY3Rpb24gd3JhcFNlbGVjdG9yKHNlbGVjdG9yLCBzZWxlY3RTdGF0ZSwgZ2V0SW5pdGlhbFN0YXRlLCBpbmplY3RlZCkge1xuICBmdW5jdGlvbiB3cmFwcGVyKHJvb3RTdGF0ZSwgLi4uYXJncykge1xuICAgIGxldCBzbGljZVN0YXRlID0gc2VsZWN0U3RhdGUocm9vdFN0YXRlKTtcbiAgICBpZiAodHlwZW9mIHNsaWNlU3RhdGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChpbmplY3RlZCkge1xuICAgICAgICBzbGljZVN0YXRlID0gZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNikgOiBcInNlbGVjdFN0YXRlIHJldHVybmVkIHVuZGVmaW5lZCBmb3IgYW4gdW5pbmplY3RlZCBzbGljZSByZWR1Y2VyXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0b3Ioc2xpY2VTdGF0ZSwgLi4uYXJncyk7XG4gIH1cbiAgd3JhcHBlci51bndyYXBwZWQgPSBzZWxlY3RvcjtcbiAgcmV0dXJuIHdyYXBwZXI7XG59XG52YXIgY3JlYXRlU2xpY2UgPSAvKiBAX19QVVJFX18gKi8gYnVpbGRDcmVhdGVTbGljZSgpO1xuZnVuY3Rpb24gYnVpbGRSZWR1Y2VyQ3JlYXRvcnMoKSB7XG4gIGZ1bmN0aW9uIGFzeW5jVGh1bmsocGF5bG9hZENyZWF0b3IsIGNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBfcmVkdWNlckRlZmluaXRpb25UeXBlOiBcImFzeW5jVGh1bmtcIiAvKiBhc3luY1RodW5rICovLFxuICAgICAgcGF5bG9hZENyZWF0b3IsXG4gICAgICAuLi5jb25maWdcbiAgICB9O1xuICB9XG4gIGFzeW5jVGh1bmsud2l0aFR5cGVzID0gKCkgPT4gYXN5bmNUaHVuaztcbiAgcmV0dXJuIHtcbiAgICByZWR1Y2VyKGNhc2VSZWR1Y2VyKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIC8vIGhhY2sgc28gdGhlIHdyYXBwaW5nIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBvcmlnaW5hbFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHdyYXBwZXIgc28gdGhlIGByZWR1Y2VyRGVmaW5pdGlvblR5cGVgIGlzIG5vdCBhc3NpZ25lZCB0byB0aGUgb3JpZ2luYWxcbiAgICAgICAgW2Nhc2VSZWR1Y2VyLm5hbWVdKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gY2FzZVJlZHVjZXIoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH1bY2FzZVJlZHVjZXIubmFtZV0sIHtcbiAgICAgICAgX3JlZHVjZXJEZWZpbml0aW9uVHlwZTogXCJyZWR1Y2VyXCIgLyogcmVkdWNlciAqL1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwcmVwYXJlZFJlZHVjZXIocHJlcGFyZSwgcmVkdWNlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX3JlZHVjZXJEZWZpbml0aW9uVHlwZTogXCJyZWR1Y2VyV2l0aFByZXBhcmVcIiAvKiByZWR1Y2VyV2l0aFByZXBhcmUgKi8sXG4gICAgICAgIHByZXBhcmUsXG4gICAgICAgIHJlZHVjZXJcbiAgICAgIH07XG4gICAgfSxcbiAgICBhc3luY1RodW5rXG4gIH07XG59XG5mdW5jdGlvbiBoYW5kbGVOb3JtYWxSZWR1Y2VyRGVmaW5pdGlvbih7XG4gIHR5cGUsXG4gIHJlZHVjZXJOYW1lLFxuICBjcmVhdGVOb3RhdGlvblxufSwgbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUsIGNvbnRleHQpIHtcbiAgbGV0IGNhc2VSZWR1Y2VyO1xuICBsZXQgcHJlcGFyZUNhbGxiYWNrO1xuICBpZiAoXCJyZWR1Y2VyXCIgaW4gbWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUpIHtcbiAgICBpZiAoY3JlYXRlTm90YXRpb24gJiYgIWlzQ2FzZVJlZHVjZXJXaXRoUHJlcGFyZURlZmluaXRpb24obWF5YmVSZWR1Y2VyV2l0aFByZXBhcmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNykgOiBcIlBsZWFzZSB1c2UgdGhlIGBjcmVhdGUucHJlcGFyZWRSZWR1Y2VyYCBub3RhdGlvbiBmb3IgcHJlcGFyZWQgYWN0aW9uIGNyZWF0b3JzIHdpdGggdGhlIGBjcmVhdGVgIG5vdGF0aW9uLlwiKTtcbiAgICB9XG4gICAgY2FzZVJlZHVjZXIgPSBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZS5yZWR1Y2VyO1xuICAgIHByZXBhcmVDYWxsYmFjayA9IG1heWJlUmVkdWNlcldpdGhQcmVwYXJlLnByZXBhcmU7XG4gIH0gZWxzZSB7XG4gICAgY2FzZVJlZHVjZXIgPSBtYXliZVJlZHVjZXJXaXRoUHJlcGFyZTtcbiAgfVxuICBjb250ZXh0LmFkZENhc2UodHlwZSwgY2FzZVJlZHVjZXIpLmV4cG9zZUNhc2VSZWR1Y2VyKHJlZHVjZXJOYW1lLCBjYXNlUmVkdWNlcikuZXhwb3NlQWN0aW9uKHJlZHVjZXJOYW1lLCBwcmVwYXJlQ2FsbGJhY2sgPyBjcmVhdGVBY3Rpb24odHlwZSwgcHJlcGFyZUNhbGxiYWNrKSA6IGNyZWF0ZUFjdGlvbih0eXBlKSk7XG59XG5mdW5jdGlvbiBpc0FzeW5jVGh1bmtTbGljZVJlZHVjZXJEZWZpbml0aW9uKHJlZHVjZXJEZWZpbml0aW9uKSB7XG4gIHJldHVybiByZWR1Y2VyRGVmaW5pdGlvbi5fcmVkdWNlckRlZmluaXRpb25UeXBlID09PSBcImFzeW5jVGh1bmtcIiAvKiBhc3luY1RodW5rICovO1xufVxuZnVuY3Rpb24gaXNDYXNlUmVkdWNlcldpdGhQcmVwYXJlRGVmaW5pdGlvbihyZWR1Y2VyRGVmaW5pdGlvbikge1xuICByZXR1cm4gcmVkdWNlckRlZmluaXRpb24uX3JlZHVjZXJEZWZpbml0aW9uVHlwZSA9PT0gXCJyZWR1Y2VyV2l0aFByZXBhcmVcIiAvKiByZWR1Y2VyV2l0aFByZXBhcmUgKi87XG59XG5mdW5jdGlvbiBoYW5kbGVUaHVua0Nhc2VSZWR1Y2VyRGVmaW5pdGlvbih7XG4gIHR5cGUsXG4gIHJlZHVjZXJOYW1lXG59LCByZWR1Y2VyRGVmaW5pdGlvbiwgY29udGV4dCwgY0FUKSB7XG4gIGlmICghY0FUKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTgpIDogXCJDYW5ub3QgdXNlIGBjcmVhdGUuYXN5bmNUaHVua2AgaW4gdGhlIGJ1aWx0LWluIGBjcmVhdGVTbGljZWAuIFVzZSBgYnVpbGRDcmVhdGVTbGljZSh7IGNyZWF0b3JzOiB7IGFzeW5jVGh1bms6IGFzeW5jVGh1bmtDcmVhdG9yIH0gfSlgIHRvIGNyZWF0ZSBhIGN1c3RvbWlzZWQgdmVyc2lvbiBvZiBgY3JlYXRlU2xpY2VgLlwiKTtcbiAgfVxuICBjb25zdCB7XG4gICAgcGF5bG9hZENyZWF0b3IsXG4gICAgZnVsZmlsbGVkLFxuICAgIHBlbmRpbmcsXG4gICAgcmVqZWN0ZWQsXG4gICAgc2V0dGxlZCxcbiAgICBvcHRpb25zXG4gIH0gPSByZWR1Y2VyRGVmaW5pdGlvbjtcbiAgY29uc3QgdGh1bmsgPSBjQVQodHlwZSwgcGF5bG9hZENyZWF0b3IsIG9wdGlvbnMpO1xuICBjb250ZXh0LmV4cG9zZUFjdGlvbihyZWR1Y2VyTmFtZSwgdGh1bmspO1xuICBpZiAoZnVsZmlsbGVkKSB7XG4gICAgY29udGV4dC5hZGRDYXNlKHRodW5rLmZ1bGZpbGxlZCwgZnVsZmlsbGVkKTtcbiAgfVxuICBpZiAocGVuZGluZykge1xuICAgIGNvbnRleHQuYWRkQ2FzZSh0aHVuay5wZW5kaW5nLCBwZW5kaW5nKTtcbiAgfVxuICBpZiAocmVqZWN0ZWQpIHtcbiAgICBjb250ZXh0LmFkZENhc2UodGh1bmsucmVqZWN0ZWQsIHJlamVjdGVkKTtcbiAgfVxuICBpZiAoc2V0dGxlZCkge1xuICAgIGNvbnRleHQuYWRkTWF0Y2hlcih0aHVuay5zZXR0bGVkLCBzZXR0bGVkKTtcbiAgfVxuICBjb250ZXh0LmV4cG9zZUNhc2VSZWR1Y2VyKHJlZHVjZXJOYW1lLCB7XG4gICAgZnVsZmlsbGVkOiBmdWxmaWxsZWQgfHwgbm9vcCxcbiAgICBwZW5kaW5nOiBwZW5kaW5nIHx8IG5vb3AsXG4gICAgcmVqZWN0ZWQ6IHJlamVjdGVkIHx8IG5vb3AsXG4gICAgc2V0dGxlZDogc2V0dGxlZCB8fCBub29wXG4gIH0pO1xufVxuZnVuY3Rpb24gbm9vcCgpIHtcbn1cblxuLy8gc3JjL2VudGl0aWVzL2VudGl0eV9zdGF0ZS50c1xuZnVuY3Rpb24gZ2V0SW5pdGlhbEVudGl0eVN0YXRlKCkge1xuICByZXR1cm4ge1xuICAgIGlkczogW10sXG4gICAgZW50aXRpZXM6IHt9XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVJbml0aWFsU3RhdGVGYWN0b3J5KHN0YXRlQWRhcHRlcikge1xuICBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoYWRkaXRpb25hbFN0YXRlID0ge30sIGVudGl0aWVzKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBPYmplY3QuYXNzaWduKGdldEluaXRpYWxFbnRpdHlTdGF0ZSgpLCBhZGRpdGlvbmFsU3RhdGUpO1xuICAgIHJldHVybiBlbnRpdGllcyA/IHN0YXRlQWRhcHRlci5zZXRBbGwoc3RhdGUsIGVudGl0aWVzKSA6IHN0YXRlO1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2V0SW5pdGlhbFN0YXRlXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9zdGF0ZV9zZWxlY3RvcnMudHNcbmZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9yc0ZhY3RvcnkoKSB7XG4gIGZ1bmN0aW9uIGdldFNlbGVjdG9ycyhzZWxlY3RTdGF0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgY3JlYXRlU2VsZWN0b3I6IGNyZWF0ZVNlbGVjdG9yMiA9IGNyZWF0ZURyYWZ0U2FmZVNlbGVjdG9yXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3Qgc2VsZWN0SWRzID0gKHN0YXRlKSA9PiBzdGF0ZS5pZHM7XG4gICAgY29uc3Qgc2VsZWN0RW50aXRpZXMgPSAoc3RhdGUpID0+IHN0YXRlLmVudGl0aWVzO1xuICAgIGNvbnN0IHNlbGVjdEFsbCA9IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RJZHMsIHNlbGVjdEVudGl0aWVzLCAoaWRzLCBlbnRpdGllcykgPT4gaWRzLm1hcCgoaWQpID0+IGVudGl0aWVzW2lkXSkpO1xuICAgIGNvbnN0IHNlbGVjdElkID0gKF8sIGlkKSA9PiBpZDtcbiAgICBjb25zdCBzZWxlY3RCeUlkID0gKGVudGl0aWVzLCBpZCkgPT4gZW50aXRpZXNbaWRdO1xuICAgIGNvbnN0IHNlbGVjdFRvdGFsID0gY3JlYXRlU2VsZWN0b3IyKHNlbGVjdElkcywgKGlkcykgPT4gaWRzLmxlbmd0aCk7XG4gICAgaWYgKCFzZWxlY3RTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0SWRzLFxuICAgICAgICBzZWxlY3RFbnRpdGllcyxcbiAgICAgICAgc2VsZWN0QWxsLFxuICAgICAgICBzZWxlY3RUb3RhbCxcbiAgICAgICAgc2VsZWN0QnlJZDogY3JlYXRlU2VsZWN0b3IyKHNlbGVjdEVudGl0aWVzLCBzZWxlY3RJZCwgc2VsZWN0QnlJZClcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdEdsb2JhbGl6ZWRFbnRpdGllcyA9IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RTdGF0ZSwgc2VsZWN0RW50aXRpZXMpO1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RJZHM6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RTdGF0ZSwgc2VsZWN0SWRzKSxcbiAgICAgIHNlbGVjdEVudGl0aWVzOiBzZWxlY3RHbG9iYWxpemVkRW50aXRpZXMsXG4gICAgICBzZWxlY3RBbGw6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RTdGF0ZSwgc2VsZWN0QWxsKSxcbiAgICAgIHNlbGVjdFRvdGFsOiBjcmVhdGVTZWxlY3RvcjIoc2VsZWN0U3RhdGUsIHNlbGVjdFRvdGFsKSxcbiAgICAgIHNlbGVjdEJ5SWQ6IGNyZWF0ZVNlbGVjdG9yMihzZWxlY3RHbG9iYWxpemVkRW50aXRpZXMsIHNlbGVjdElkLCBzZWxlY3RCeUlkKVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZXRTZWxlY3RvcnNcbiAgfTtcbn1cblxuLy8gc3JjL2VudGl0aWVzL3N0YXRlX2FkYXB0ZXIudHNcbmltcG9ydCB7IHByb2R1Y2UgYXMgY3JlYXRlTmV4dFN0YXRlMywgaXNEcmFmdCBhcyBpc0RyYWZ0MyB9IGZyb20gXCJpbW1lclwiO1xudmFyIGlzRHJhZnRUeXBlZCA9IGlzRHJhZnQzO1xuZnVuY3Rpb24gY3JlYXRlU2luZ2xlQXJndW1lbnRTdGF0ZU9wZXJhdG9yKG11dGF0b3IpIHtcbiAgY29uc3Qgb3BlcmF0b3IgPSBjcmVhdGVTdGF0ZU9wZXJhdG9yKChfLCBzdGF0ZSkgPT4gbXV0YXRvcihzdGF0ZSkpO1xuICByZXR1cm4gZnVuY3Rpb24gb3BlcmF0aW9uKHN0YXRlKSB7XG4gICAgcmV0dXJuIG9wZXJhdG9yKHN0YXRlLCB2b2lkIDApO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlU3RhdGVPcGVyYXRvcihtdXRhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiBvcGVyYXRpb24oc3RhdGUsIGFyZykge1xuICAgIGZ1bmN0aW9uIGlzUGF5bG9hZEFjdGlvbkFyZ3VtZW50KGFyZzIpIHtcbiAgICAgIHJldHVybiBpc0ZTQShhcmcyKTtcbiAgICB9XG4gICAgY29uc3QgcnVuTXV0YXRvciA9IChkcmFmdCkgPT4ge1xuICAgICAgaWYgKGlzUGF5bG9hZEFjdGlvbkFyZ3VtZW50KGFyZykpIHtcbiAgICAgICAgbXV0YXRvcihhcmcucGF5bG9hZCwgZHJhZnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXV0YXRvcihhcmcsIGRyYWZ0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChpc0RyYWZ0VHlwZWQoc3RhdGUpKSB7XG4gICAgICBydW5NdXRhdG9yKHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZU5leHRTdGF0ZTMoc3RhdGUsIHJ1bk11dGF0b3IpO1xuICB9O1xufVxuXG4vLyBzcmMvZW50aXRpZXMvdXRpbHMudHNcbmltcG9ydCB7IGN1cnJlbnQgYXMgY3VycmVudDIsIGlzRHJhZnQgYXMgaXNEcmFmdDQgfSBmcm9tIFwiaW1tZXJcIjtcbmZ1bmN0aW9uIHNlbGVjdElkVmFsdWUoZW50aXR5LCBzZWxlY3RJZCkge1xuICBjb25zdCBrZXkgPSBzZWxlY3RJZChlbnRpdHkpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGtleSA9PT0gdm9pZCAwKSB7XG4gICAgY29uc29sZS53YXJuKFwiVGhlIGVudGl0eSBwYXNzZWQgdG8gdGhlIGBzZWxlY3RJZGAgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgdW5kZWZpbmVkLlwiLCBcIllvdSBzaG91bGQgcHJvYmFibHkgcHJvdmlkZSB5b3VyIG93biBgc2VsZWN0SWRgIGltcGxlbWVudGF0aW9uLlwiLCBcIlRoZSBlbnRpdHkgdGhhdCB3YXMgcGFzc2VkOlwiLCBlbnRpdHksIFwiVGhlIGBzZWxlY3RJZGAgaW1wbGVtZW50YXRpb246XCIsIHNlbGVjdElkLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiBrZXk7XG59XG5mdW5jdGlvbiBlbnN1cmVFbnRpdGllc0FycmF5KGVudGl0aWVzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShlbnRpdGllcykpIHtcbiAgICBlbnRpdGllcyA9IE9iamVjdC52YWx1ZXMoZW50aXRpZXMpO1xuICB9XG4gIHJldHVybiBlbnRpdGllcztcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnQodmFsdWUpIHtcbiAgcmV0dXJuIGlzRHJhZnQ0KHZhbHVlKSA/IGN1cnJlbnQyKHZhbHVlKSA6IHZhbHVlO1xufVxuZnVuY3Rpb24gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKSB7XG4gIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gIGNvbnN0IGV4aXN0aW5nSWRzQXJyYXkgPSBnZXRDdXJyZW50KHN0YXRlLmlkcyk7XG4gIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChleGlzdGluZ0lkc0FycmF5KTtcbiAgY29uc3QgYWRkZWQgPSBbXTtcbiAgY29uc3QgdXBkYXRlZCA9IFtdO1xuICBmb3IgKGNvbnN0IGVudGl0eSBvZiBuZXdFbnRpdGllcykge1xuICAgIGNvbnN0IGlkID0gc2VsZWN0SWRWYWx1ZShlbnRpdHksIHNlbGVjdElkKTtcbiAgICBpZiAoZXhpc3RpbmdJZHMuaGFzKGlkKSkge1xuICAgICAgdXBkYXRlZC5wdXNoKHtcbiAgICAgICAgaWQsXG4gICAgICAgIGNoYW5nZXM6IGVudGl0eVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZGVkLnB1c2goZW50aXR5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFthZGRlZCwgdXBkYXRlZCwgZXhpc3RpbmdJZHNBcnJheV07XG59XG5cbi8vIHNyYy9lbnRpdGllcy91bnNvcnRlZF9zdGF0ZV9hZGFwdGVyLnRzXG5mdW5jdGlvbiBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCkge1xuICBmdW5jdGlvbiBhZGRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICBjb25zdCBrZXkgPSBzZWxlY3RJZFZhbHVlKGVudGl0eSwgc2VsZWN0SWQpO1xuICAgIGlmIChrZXkgaW4gc3RhdGUuZW50aXRpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGUuaWRzLnB1c2goa2V5KTtcbiAgICBzdGF0ZS5lbnRpdGllc1trZXldID0gZW50aXR5O1xuICB9XG4gIGZ1bmN0aW9uIGFkZE1hbnlNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgbmV3RW50aXRpZXMpIHtcbiAgICAgIGFkZE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldE9uZU11dGFibHkoZW50aXR5LCBzdGF0ZSkge1xuICAgIGNvbnN0IGtleSA9IHNlbGVjdElkVmFsdWUoZW50aXR5LCBzZWxlY3RJZCk7XG4gICAgaWYgKCEoa2V5IGluIHN0YXRlLmVudGl0aWVzKSkge1xuICAgICAgc3RhdGUuaWRzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgO1xuICAgIHN0YXRlLmVudGl0aWVzW2tleV0gPSBlbnRpdHk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgbmV3RW50aXRpZXMgPSBlbnN1cmVFbnRpdGllc0FycmF5KG5ld0VudGl0aWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBuZXdFbnRpdGllcykge1xuICAgICAgc2V0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gc2V0QWxsTXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIHN0YXRlLmlkcyA9IFtdO1xuICAgIHN0YXRlLmVudGl0aWVzID0ge307XG4gICAgYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVPbmVNdXRhYmx5KGtleSwgc3RhdGUpIHtcbiAgICByZXR1cm4gcmVtb3ZlTWFueU11dGFibHkoW2tleV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVNYW55TXV0YWJseShrZXlzLCBzdGF0ZSkge1xuICAgIGxldCBkaWRNdXRhdGUgPSBmYWxzZTtcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleSBpbiBzdGF0ZS5lbnRpdGllcykge1xuICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNba2V5XTtcbiAgICAgICAgZGlkTXV0YXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZGlkTXV0YXRlKSB7XG4gICAgICBzdGF0ZS5pZHMgPSBzdGF0ZS5pZHMuZmlsdGVyKChpZCkgPT4gaWQgaW4gc3RhdGUuZW50aXRpZXMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiByZW1vdmVBbGxNdXRhYmx5KHN0YXRlKSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwge1xuICAgICAgaWRzOiBbXSxcbiAgICAgIGVudGl0aWVzOiB7fVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHRha2VOZXdLZXkoa2V5cywgdXBkYXRlLCBzdGF0ZSkge1xuICAgIGNvbnN0IG9yaWdpbmFsMyA9IHN0YXRlLmVudGl0aWVzW3VwZGF0ZS5pZF07XG4gICAgaWYgKG9yaWdpbmFsMyA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZWQgPSBPYmplY3QuYXNzaWduKHt9LCBvcmlnaW5hbDMsIHVwZGF0ZS5jaGFuZ2VzKTtcbiAgICBjb25zdCBuZXdLZXkgPSBzZWxlY3RJZFZhbHVlKHVwZGF0ZWQsIHNlbGVjdElkKTtcbiAgICBjb25zdCBoYXNOZXdLZXkgPSBuZXdLZXkgIT09IHVwZGF0ZS5pZDtcbiAgICBpZiAoaGFzTmV3S2V5KSB7XG4gICAgICBrZXlzW3VwZGF0ZS5pZF0gPSBuZXdLZXk7XG4gICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICB9XG4gICAgO1xuICAgIHN0YXRlLmVudGl0aWVzW25ld0tleV0gPSB1cGRhdGVkO1xuICAgIHJldHVybiBoYXNOZXdLZXk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlT25lTXV0YWJseSh1cGRhdGUsIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU1hbnlNdXRhYmx5KFt1cGRhdGVdLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBkYXRlTWFueU11dGFibHkodXBkYXRlcywgc3RhdGUpIHtcbiAgICBjb25zdCBuZXdLZXlzID0ge307XG4gICAgY29uc3QgdXBkYXRlc1BlckVudGl0eSA9IHt9O1xuICAgIHVwZGF0ZXMuZm9yRWFjaCgodXBkYXRlKSA9PiB7XG4gICAgICBpZiAodXBkYXRlLmlkIGluIHN0YXRlLmVudGl0aWVzKSB7XG4gICAgICAgIHVwZGF0ZXNQZXJFbnRpdHlbdXBkYXRlLmlkXSA9IHtcbiAgICAgICAgICBpZDogdXBkYXRlLmlkLFxuICAgICAgICAgIC8vIFNwcmVhZHMgaWdub3JlIGZhbHN5IHZhbHVlcywgc28gdGhpcyB3b3JrcyBldmVuIGlmIHRoZXJlIGlzbid0XG4gICAgICAgICAgLy8gYW4gZXhpc3RpbmcgdXBkYXRlIGFscmVhZHkgYXQgdGhpcyBrZXlcbiAgICAgICAgICBjaGFuZ2VzOiB7XG4gICAgICAgICAgICAuLi51cGRhdGVzUGVyRW50aXR5W3VwZGF0ZS5pZF0/LmNoYW5nZXMsXG4gICAgICAgICAgICAuLi51cGRhdGUuY2hhbmdlc1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1cGRhdGVzID0gT2JqZWN0LnZhbHVlcyh1cGRhdGVzUGVyRW50aXR5KTtcbiAgICBjb25zdCBkaWRNdXRhdGVFbnRpdGllcyA9IHVwZGF0ZXMubGVuZ3RoID4gMDtcbiAgICBpZiAoZGlkTXV0YXRlRW50aXRpZXMpIHtcbiAgICAgIGNvbnN0IGRpZE11dGF0ZUlkcyA9IHVwZGF0ZXMuZmlsdGVyKCh1cGRhdGUpID0+IHRha2VOZXdLZXkobmV3S2V5cywgdXBkYXRlLCBzdGF0ZSkpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoZGlkTXV0YXRlSWRzKSB7XG4gICAgICAgIHN0YXRlLmlkcyA9IE9iamVjdC52YWx1ZXMoc3RhdGUuZW50aXRpZXMpLm1hcCgoZSkgPT4gc2VsZWN0SWRWYWx1ZShlLCBzZWxlY3RJZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBzZXJ0TWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cHNlcnRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBjb25zdCBbYWRkZWQsIHVwZGF0ZWRdID0gc3BsaXRBZGRlZFVwZGF0ZWRFbnRpdGllcyhuZXdFbnRpdGllcywgc2VsZWN0SWQsIHN0YXRlKTtcbiAgICB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVkLCBzdGF0ZSk7XG4gICAgYWRkTWFueU11dGFibHkoYWRkZWQsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbW92ZUFsbDogY3JlYXRlU2luZ2xlQXJndW1lbnRTdGF0ZU9wZXJhdG9yKHJlbW92ZUFsbE11dGFibHkpLFxuICAgIGFkZE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcihhZGRPbmVNdXRhYmx5KSxcbiAgICBhZGRNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKGFkZE1hbnlNdXRhYmx5KSxcbiAgICBzZXRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0T25lTXV0YWJseSksXG4gICAgc2V0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRNYW55TXV0YWJseSksXG4gICAgc2V0QWxsOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldEFsbE11dGFibHkpLFxuICAgIHVwZGF0ZU9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cGRhdGVPbmVNdXRhYmx5KSxcbiAgICB1cGRhdGVNYW55OiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU1hbnlNdXRhYmx5KSxcbiAgICB1cHNlcnRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0T25lTXV0YWJseSksXG4gICAgdXBzZXJ0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRNYW55TXV0YWJseSksXG4gICAgcmVtb3ZlT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHJlbW92ZU9uZU11dGFibHkpLFxuICAgIHJlbW92ZU1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IocmVtb3ZlTWFueU11dGFibHkpXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9zb3J0ZWRfc3RhdGVfYWRhcHRlci50c1xuZnVuY3Rpb24gZmluZEluc2VydEluZGV4KHNvcnRlZEl0ZW1zLCBpdGVtLCBjb21wYXJpc29uRnVuY3Rpb24pIHtcbiAgbGV0IGxvd0luZGV4ID0gMDtcbiAgbGV0IGhpZ2hJbmRleCA9IHNvcnRlZEl0ZW1zLmxlbmd0aDtcbiAgd2hpbGUgKGxvd0luZGV4IDwgaGlnaEluZGV4KSB7XG4gICAgbGV0IG1pZGRsZUluZGV4ID0gbG93SW5kZXggKyBoaWdoSW5kZXggPj4+IDE7XG4gICAgY29uc3QgY3VycmVudEl0ZW0gPSBzb3J0ZWRJdGVtc1ttaWRkbGVJbmRleF07XG4gICAgY29uc3QgcmVzID0gY29tcGFyaXNvbkZ1bmN0aW9uKGl0ZW0sIGN1cnJlbnRJdGVtKTtcbiAgICBpZiAocmVzID49IDApIHtcbiAgICAgIGxvd0luZGV4ID0gbWlkZGxlSW5kZXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWdoSW5kZXggPSBtaWRkbGVJbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxvd0luZGV4O1xufVxuZnVuY3Rpb24gaW5zZXJ0KHNvcnRlZEl0ZW1zLCBpdGVtLCBjb21wYXJpc29uRnVuY3Rpb24pIHtcbiAgY29uc3QgaW5zZXJ0QXRJbmRleCA9IGZpbmRJbnNlcnRJbmRleChzb3J0ZWRJdGVtcywgaXRlbSwgY29tcGFyaXNvbkZ1bmN0aW9uKTtcbiAgc29ydGVkSXRlbXMuc3BsaWNlKGluc2VydEF0SW5kZXgsIDAsIGl0ZW0pO1xuICByZXR1cm4gc29ydGVkSXRlbXM7XG59XG5mdW5jdGlvbiBjcmVhdGVTb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQsIGNvbXBhcmVyKSB7XG4gIGNvbnN0IHtcbiAgICByZW1vdmVPbmUsXG4gICAgcmVtb3ZlTWFueSxcbiAgICByZW1vdmVBbGxcbiAgfSA9IGNyZWF0ZVVuc29ydGVkU3RhdGVBZGFwdGVyKHNlbGVjdElkKTtcbiAgZnVuY3Rpb24gYWRkT25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIGFkZE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gYWRkTWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlLCBleGlzdGluZ0lkcykge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChleGlzdGluZ0lkcyA/PyBnZXRDdXJyZW50KHN0YXRlLmlkcykpO1xuICAgIGNvbnN0IG1vZGVscyA9IG5ld0VudGl0aWVzLmZpbHRlcigobW9kZWwpID0+ICFleGlzdGluZ0tleXMuaGFzKHNlbGVjdElkVmFsdWUobW9kZWwsIHNlbGVjdElkKSkpO1xuICAgIGlmIChtb2RlbHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICBtZXJnZUZ1bmN0aW9uKHN0YXRlLCBtb2RlbHMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRPbmVNdXRhYmx5KGVudGl0eSwgc3RhdGUpIHtcbiAgICByZXR1cm4gc2V0TWFueU11dGFibHkoW2VudGl0eV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiBzZXRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUpIHtcbiAgICBuZXdFbnRpdGllcyA9IGVuc3VyZUVudGl0aWVzQXJyYXkobmV3RW50aXRpZXMpO1xuICAgIGlmIChuZXdFbnRpdGllcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBuZXdFbnRpdGllcykge1xuICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNbc2VsZWN0SWQoaXRlbSldO1xuICAgICAgfVxuICAgICAgbWVyZ2VGdW5jdGlvbihzdGF0ZSwgbmV3RW50aXRpZXMpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzZXRBbGxNdXRhYmx5KG5ld0VudGl0aWVzLCBzdGF0ZSkge1xuICAgIG5ld0VudGl0aWVzID0gZW5zdXJlRW50aXRpZXNBcnJheShuZXdFbnRpdGllcyk7XG4gICAgc3RhdGUuZW50aXRpZXMgPSB7fTtcbiAgICBzdGF0ZS5pZHMgPSBbXTtcbiAgICBhZGRNYW55TXV0YWJseShuZXdFbnRpdGllcywgc3RhdGUsIFtdKTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVPbmVNdXRhYmx5KHVwZGF0ZSwgc3RhdGUpIHtcbiAgICByZXR1cm4gdXBkYXRlTWFueU11dGFibHkoW3VwZGF0ZV0sIHN0YXRlKTtcbiAgfVxuICBmdW5jdGlvbiB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVzLCBzdGF0ZSkge1xuICAgIGxldCBhcHBsaWVkVXBkYXRlcyA9IGZhbHNlO1xuICAgIGxldCByZXBsYWNlZElkcyA9IGZhbHNlO1xuICAgIGZvciAobGV0IHVwZGF0ZSBvZiB1cGRhdGVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBzdGF0ZS5lbnRpdGllc1t1cGRhdGUuaWRdO1xuICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhcHBsaWVkVXBkYXRlcyA9IHRydWU7XG4gICAgICBPYmplY3QuYXNzaWduKGVudGl0eSwgdXBkYXRlLmNoYW5nZXMpO1xuICAgICAgY29uc3QgbmV3SWQgPSBzZWxlY3RJZChlbnRpdHkpO1xuICAgICAgaWYgKHVwZGF0ZS5pZCAhPT0gbmV3SWQpIHtcbiAgICAgICAgcmVwbGFjZWRJZHMgPSB0cnVlO1xuICAgICAgICBkZWxldGUgc3RhdGUuZW50aXRpZXNbdXBkYXRlLmlkXTtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSBzdGF0ZS5pZHMuaW5kZXhPZih1cGRhdGUuaWQpO1xuICAgICAgICBzdGF0ZS5pZHNbb2xkSW5kZXhdID0gbmV3SWQ7XG4gICAgICAgIHN0YXRlLmVudGl0aWVzW25ld0lkXSA9IGVudGl0eTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFwcGxpZWRVcGRhdGVzKSB7XG4gICAgICBtZXJnZUZ1bmN0aW9uKHN0YXRlLCBbXSwgYXBwbGllZFVwZGF0ZXMsIHJlcGxhY2VkSWRzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0T25lTXV0YWJseShlbnRpdHksIHN0YXRlKSB7XG4gICAgcmV0dXJuIHVwc2VydE1hbnlNdXRhYmx5KFtlbnRpdHldLCBzdGF0ZSk7XG4gIH1cbiAgZnVuY3Rpb24gdXBzZXJ0TWFueU11dGFibHkobmV3RW50aXRpZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgW2FkZGVkLCB1cGRhdGVkLCBleGlzdGluZ0lkc0FycmF5XSA9IHNwbGl0QWRkZWRVcGRhdGVkRW50aXRpZXMobmV3RW50aXRpZXMsIHNlbGVjdElkLCBzdGF0ZSk7XG4gICAgaWYgKHVwZGF0ZWQubGVuZ3RoKSB7XG4gICAgICB1cGRhdGVNYW55TXV0YWJseSh1cGRhdGVkLCBzdGF0ZSk7XG4gICAgfVxuICAgIGlmIChhZGRlZC5sZW5ndGgpIHtcbiAgICAgIGFkZE1hbnlNdXRhYmx5KGFkZGVkLCBzdGF0ZSwgZXhpc3RpbmdJZHNBcnJheSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGFyZUFycmF5c0VxdWFsKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gPT09IGJbaV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IG1lcmdlRnVuY3Rpb24gPSAoc3RhdGUsIGFkZGVkSXRlbXMsIGFwcGxpZWRVcGRhdGVzLCByZXBsYWNlZElkcykgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRFbnRpdGllcyA9IGdldEN1cnJlbnQoc3RhdGUuZW50aXRpZXMpO1xuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBnZXRDdXJyZW50KHN0YXRlLmlkcyk7XG4gICAgY29uc3Qgc3RhdGVFbnRpdGllcyA9IHN0YXRlLmVudGl0aWVzO1xuICAgIGxldCBpZHMgPSBjdXJyZW50SWRzO1xuICAgIGlmIChyZXBsYWNlZElkcykge1xuICAgICAgaWRzID0gbmV3IFNldChjdXJyZW50SWRzKTtcbiAgICB9XG4gICAgbGV0IHNvcnRlZEVudGl0aWVzID0gW107XG4gICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IGN1cnJlbnRFbnRpdGllc1tpZF07XG4gICAgICBpZiAoZW50aXR5KSB7XG4gICAgICAgIHNvcnRlZEVudGl0aWVzLnB1c2goZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgd2FzUHJldmlvdXNseUVtcHR5ID0gc29ydGVkRW50aXRpZXMubGVuZ3RoID09PSAwO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBhZGRlZEl0ZW1zKSB7XG4gICAgICBzdGF0ZUVudGl0aWVzW3NlbGVjdElkKGl0ZW0pXSA9IGl0ZW07XG4gICAgICBpZiAoIXdhc1ByZXZpb3VzbHlFbXB0eSkge1xuICAgICAgICBpbnNlcnQoc29ydGVkRW50aXRpZXMsIGl0ZW0sIGNvbXBhcmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHdhc1ByZXZpb3VzbHlFbXB0eSkge1xuICAgICAgc29ydGVkRW50aXRpZXMgPSBhZGRlZEl0ZW1zLnNsaWNlKCkuc29ydChjb21wYXJlcik7XG4gICAgfSBlbHNlIGlmIChhcHBsaWVkVXBkYXRlcykge1xuICAgICAgc29ydGVkRW50aXRpZXMuc29ydChjb21wYXJlcik7XG4gICAgfVxuICAgIGNvbnN0IG5ld1NvcnRlZElkcyA9IHNvcnRlZEVudGl0aWVzLm1hcChzZWxlY3RJZCk7XG4gICAgaWYgKCFhcmVBcnJheXNFcXVhbChjdXJyZW50SWRzLCBuZXdTb3J0ZWRJZHMpKSB7XG4gICAgICBzdGF0ZS5pZHMgPSBuZXdTb3J0ZWRJZHM7XG4gICAgfVxuICB9O1xuICByZXR1cm4ge1xuICAgIHJlbW92ZU9uZSxcbiAgICByZW1vdmVNYW55LFxuICAgIHJlbW92ZUFsbCxcbiAgICBhZGRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkT25lTXV0YWJseSksXG4gICAgdXBkYXRlT25lOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHVwZGF0ZU9uZU11dGFibHkpLFxuICAgIHVwc2VydE9uZTogY3JlYXRlU3RhdGVPcGVyYXRvcih1cHNlcnRPbmVNdXRhYmx5KSxcbiAgICBzZXRPbmU6IGNyZWF0ZVN0YXRlT3BlcmF0b3Ioc2V0T25lTXV0YWJseSksXG4gICAgc2V0TWFueTogY3JlYXRlU3RhdGVPcGVyYXRvcihzZXRNYW55TXV0YWJseSksXG4gICAgc2V0QWxsOiBjcmVhdGVTdGF0ZU9wZXJhdG9yKHNldEFsbE11dGFibHkpLFxuICAgIGFkZE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IoYWRkTWFueU11dGFibHkpLFxuICAgIHVwZGF0ZU1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBkYXRlTWFueU11dGFibHkpLFxuICAgIHVwc2VydE1hbnk6IGNyZWF0ZVN0YXRlT3BlcmF0b3IodXBzZXJ0TWFueU11dGFibHkpXG4gIH07XG59XG5cbi8vIHNyYy9lbnRpdGllcy9jcmVhdGVfYWRhcHRlci50c1xuZnVuY3Rpb24gY3JlYXRlRW50aXR5QWRhcHRlcihvcHRpb25zID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHNlbGVjdElkLFxuICAgIHNvcnRDb21wYXJlclxuICB9ID0ge1xuICAgIHNvcnRDb21wYXJlcjogZmFsc2UsXG4gICAgc2VsZWN0SWQ6IChpbnN0YW5jZSkgPT4gaW5zdGFuY2UuaWQsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICBjb25zdCBzdGF0ZUFkYXB0ZXIgPSBzb3J0Q29tcGFyZXIgPyBjcmVhdGVTb3J0ZWRTdGF0ZUFkYXB0ZXIoc2VsZWN0SWQsIHNvcnRDb21wYXJlcikgOiBjcmVhdGVVbnNvcnRlZFN0YXRlQWRhcHRlcihzZWxlY3RJZCk7XG4gIGNvbnN0IHN0YXRlRmFjdG9yeSA9IGNyZWF0ZUluaXRpYWxTdGF0ZUZhY3Rvcnkoc3RhdGVBZGFwdGVyKTtcbiAgY29uc3Qgc2VsZWN0b3JzRmFjdG9yeSA9IGNyZWF0ZVNlbGVjdG9yc0ZhY3RvcnkoKTtcbiAgcmV0dXJuIHtcbiAgICBzZWxlY3RJZCxcbiAgICBzb3J0Q29tcGFyZXIsXG4gICAgLi4uc3RhdGVGYWN0b3J5LFxuICAgIC4uLnNlbGVjdG9yc0ZhY3RvcnksXG4gICAgLi4uc3RhdGVBZGFwdGVyXG4gIH07XG59XG5cbi8vIHNyYy9saXN0ZW5lck1pZGRsZXdhcmUvaW5kZXgudHNcbmltcG9ydCB7IGlzQWN0aW9uIGFzIGlzQWN0aW9uMyB9IGZyb20gXCJyZWR1eFwiO1xuXG4vLyBzcmMvbGlzdGVuZXJNaWRkbGV3YXJlL2V4Y2VwdGlvbnMudHNcbnZhciB0YXNrID0gXCJ0YXNrXCI7XG52YXIgbGlzdGVuZXIgPSBcImxpc3RlbmVyXCI7XG52YXIgY29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcbnZhciBjYW5jZWxsZWQgPSBcImNhbmNlbGxlZFwiO1xudmFyIHRhc2tDYW5jZWxsZWQgPSBgdGFzay0ke2NhbmNlbGxlZH1gO1xudmFyIHRhc2tDb21wbGV0ZWQgPSBgdGFzay0ke2NvbXBsZXRlZH1gO1xudmFyIGxpc3RlbmVyQ2FuY2VsbGVkID0gYCR7bGlzdGVuZXJ9LSR7Y2FuY2VsbGVkfWA7XG52YXIgbGlzdGVuZXJDb21wbGV0ZWQgPSBgJHtsaXN0ZW5lcn0tJHtjb21wbGV0ZWR9YDtcbnZhciBUYXNrQWJvcnRFcnJvciA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY29kZSkge1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5tZXNzYWdlID0gYCR7dGFza30gJHtjYW5jZWxsZWR9IChyZWFzb246ICR7Y29kZX0pYDtcbiAgfVxuICBuYW1lID0gXCJUYXNrQWJvcnRFcnJvclwiO1xuICBtZXNzYWdlO1xufTtcblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS91dGlscy50c1xudmFyIGFzc2VydEZ1bmN0aW9uID0gKGZ1bmMsIGV4cGVjdGVkKSA9PiB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMzIpIDogYCR7ZXhwZWN0ZWR9IGlzIG5vdCBhIGZ1bmN0aW9uYCk7XG4gIH1cbn07XG52YXIgbm9vcDIgPSAoKSA9PiB7XG59O1xudmFyIGNhdGNoUmVqZWN0aW9uID0gKHByb21pc2UsIG9uRXJyb3IgPSBub29wMikgPT4ge1xuICBwcm9taXNlLmNhdGNoKG9uRXJyb3IpO1xuICByZXR1cm4gcHJvbWlzZTtcbn07XG52YXIgYWRkQWJvcnRTaWduYWxMaXN0ZW5lciA9IChhYm9ydFNpZ25hbCwgY2FsbGJhY2spID0+IHtcbiAgYWJvcnRTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGNhbGxiYWNrLCB7XG4gICAgb25jZTogdHJ1ZVxuICB9KTtcbiAgcmV0dXJuICgpID0+IGFib3J0U2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBjYWxsYmFjayk7XG59O1xudmFyIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24gPSAoYWJvcnRDb250cm9sbGVyLCByZWFzb24pID0+IHtcbiAgY29uc3Qgc2lnbmFsID0gYWJvcnRDb250cm9sbGVyLnNpZ25hbDtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghKFwicmVhc29uXCIgaW4gc2lnbmFsKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzaWduYWwsIFwicmVhc29uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogcmVhc29uLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxuICA7XG4gIGFib3J0Q29udHJvbGxlci5hYm9ydChyZWFzb24pO1xufTtcblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS90YXNrLnRzXG52YXIgdmFsaWRhdGVBY3RpdmUgPSAoc2lnbmFsKSA9PiB7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlYXNvblxuICAgIH0gPSBzaWduYWw7XG4gICAgdGhyb3cgbmV3IFRhc2tBYm9ydEVycm9yKHJlYXNvbik7XG4gIH1cbn07XG5mdW5jdGlvbiByYWNlV2l0aFNpZ25hbChzaWduYWwsIHByb21pc2UpIHtcbiAgbGV0IGNsZWFudXAgPSBub29wMjtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBub3RpZnlSZWplY3Rpb24gPSAoKSA9PiByZWplY3QobmV3IFRhc2tBYm9ydEVycm9yKHNpZ25hbC5yZWFzb24pKTtcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIG5vdGlmeVJlamVjdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjbGVhbnVwID0gYWRkQWJvcnRTaWduYWxMaXN0ZW5lcihzaWduYWwsIG5vdGlmeVJlamVjdGlvbik7XG4gICAgcHJvbWlzZS5maW5hbGx5KCgpID0+IGNsZWFudXAoKSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBjbGVhbnVwID0gbm9vcDI7XG4gIH0pO1xufVxudmFyIHJ1blRhc2sgPSBhc3luYyAodGFzazIsIGNsZWFuVXApID0+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRhc2syKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogXCJva1wiLFxuICAgICAgdmFsdWVcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IGVycm9yIGluc3RhbmNlb2YgVGFza0Fib3J0RXJyb3IgPyBcImNhbmNlbGxlZFwiIDogXCJyZWplY3RlZFwiLFxuICAgICAgZXJyb3JcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFuVXA/LigpO1xuICB9XG59O1xudmFyIGNyZWF0ZVBhdXNlID0gKHNpZ25hbCkgPT4ge1xuICByZXR1cm4gKHByb21pc2UpID0+IHtcbiAgICByZXR1cm4gY2F0Y2hSZWplY3Rpb24ocmFjZVdpdGhTaWduYWwoc2lnbmFsLCBwcm9taXNlKS50aGVuKChvdXRwdXQpID0+IHtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKHNpZ25hbCk7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pKTtcbiAgfTtcbn07XG52YXIgY3JlYXRlRGVsYXkgPSAoc2lnbmFsKSA9PiB7XG4gIGNvbnN0IHBhdXNlID0gY3JlYXRlUGF1c2Uoc2lnbmFsKTtcbiAgcmV0dXJuICh0aW1lb3V0TXMpID0+IHtcbiAgICByZXR1cm4gcGF1c2UobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dE1zKSkpO1xuICB9O1xufTtcblxuLy8gc3JjL2xpc3RlbmVyTWlkZGxld2FyZS9pbmRleC50c1xudmFyIHtcbiAgYXNzaWduXG59ID0gT2JqZWN0O1xudmFyIElOVEVSTkFMX05JTF9UT0tFTiA9IHt9O1xudmFyIGFsbSA9IFwibGlzdGVuZXJNaWRkbGV3YXJlXCI7XG52YXIgY3JlYXRlRm9yayA9IChwYXJlbnRBYm9ydFNpZ25hbCwgcGFyZW50QmxvY2tpbmdQcm9taXNlcykgPT4ge1xuICBjb25zdCBsaW5rQ29udHJvbGxlcnMgPSAoY29udHJvbGxlcikgPT4gYWRkQWJvcnRTaWduYWxMaXN0ZW5lcihwYXJlbnRBYm9ydFNpZ25hbCwgKCkgPT4gYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjb250cm9sbGVyLCBwYXJlbnRBYm9ydFNpZ25hbC5yZWFzb24pKTtcbiAgcmV0dXJuICh0YXNrRXhlY3V0b3IsIG9wdHMpID0+IHtcbiAgICBhc3NlcnRGdW5jdGlvbih0YXNrRXhlY3V0b3IsIFwidGFza0V4ZWN1dG9yXCIpO1xuICAgIGNvbnN0IGNoaWxkQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGxpbmtDb250cm9sbGVycyhjaGlsZEFib3J0Q29udHJvbGxlcik7XG4gICAgY29uc3QgcmVzdWx0ID0gcnVuVGFzayhhc3luYyAoKSA9PiB7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShwYXJlbnRBYm9ydFNpZ25hbCk7XG4gICAgICB2YWxpZGF0ZUFjdGl2ZShjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgY29uc3QgcmVzdWx0MiA9IGF3YWl0IHRhc2tFeGVjdXRvcih7XG4gICAgICAgIHBhdXNlOiBjcmVhdGVQYXVzZShjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWwpLFxuICAgICAgICBkZWxheTogY3JlYXRlRGVsYXkoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgc2lnbmFsOiBjaGlsZEFib3J0Q29udHJvbGxlci5zaWduYWxcbiAgICAgIH0pO1xuICAgICAgdmFsaWRhdGVBY3RpdmUoY2hpbGRBYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIHJldHVybiByZXN1bHQyO1xuICAgIH0sICgpID0+IGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY2hpbGRBYm9ydENvbnRyb2xsZXIsIHRhc2tDb21wbGV0ZWQpKTtcbiAgICBpZiAob3B0cz8uYXV0b0pvaW4pIHtcbiAgICAgIHBhcmVudEJsb2NraW5nUHJvbWlzZXMucHVzaChyZXN1bHQuY2F0Y2gobm9vcDIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdDogY3JlYXRlUGF1c2UocGFyZW50QWJvcnRTaWduYWwpKHJlc3VsdCksXG4gICAgICBjYW5jZWwoKSB7XG4gICAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY2hpbGRBYm9ydENvbnRyb2xsZXIsIHRhc2tDYW5jZWxsZWQpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59O1xudmFyIGNyZWF0ZVRha2VQYXR0ZXJuID0gKHN0YXJ0TGlzdGVuaW5nLCBzaWduYWwpID0+IHtcbiAgY29uc3QgdGFrZSA9IGFzeW5jIChwcmVkaWNhdGUsIHRpbWVvdXQpID0+IHtcbiAgICB2YWxpZGF0ZUFjdGl2ZShzaWduYWwpO1xuICAgIGxldCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICB9O1xuICAgIGNvbnN0IHR1cGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzdG9wTGlzdGVuaW5nID0gc3RhcnRMaXN0ZW5pbmcoe1xuICAgICAgICBwcmVkaWNhdGUsXG4gICAgICAgIGVmZmVjdDogKGFjdGlvbiwgbGlzdGVuZXJBcGkpID0+IHtcbiAgICAgICAgICBsaXN0ZW5lckFwaS51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHJlc29sdmUoW2FjdGlvbiwgbGlzdGVuZXJBcGkuZ2V0U3RhdGUoKSwgbGlzdGVuZXJBcGkuZ2V0T3JpZ2luYWxTdGF0ZSgpXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICAgIHN0b3BMaXN0ZW5pbmcoKTtcbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHByb21pc2VzID0gW3R1cGxlUHJvbWlzZV07XG4gICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgcHJvbWlzZXMucHVzaChuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aW1lb3V0LCBudWxsKSkpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcmFjZVdpdGhTaWduYWwoc2lnbmFsLCBQcm9taXNlLnJhY2UocHJvbWlzZXMpKTtcbiAgICAgIHZhbGlkYXRlQWN0aXZlKHNpZ25hbCk7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIChwcmVkaWNhdGUsIHRpbWVvdXQpID0+IGNhdGNoUmVqZWN0aW9uKHRha2UocHJlZGljYXRlLCB0aW1lb3V0KSk7XG59O1xudmFyIGdldExpc3RlbmVyRW50cnlQcm9wc0Zyb20gPSAob3B0aW9ucykgPT4ge1xuICBsZXQge1xuICAgIHR5cGUsXG4gICAgYWN0aW9uQ3JlYXRvcixcbiAgICBtYXRjaGVyLFxuICAgIHByZWRpY2F0ZSxcbiAgICBlZmZlY3RcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICh0eXBlKSB7XG4gICAgcHJlZGljYXRlID0gY3JlYXRlQWN0aW9uKHR5cGUpLm1hdGNoO1xuICB9IGVsc2UgaWYgKGFjdGlvbkNyZWF0b3IpIHtcbiAgICB0eXBlID0gYWN0aW9uQ3JlYXRvci50eXBlO1xuICAgIHByZWRpY2F0ZSA9IGFjdGlvbkNyZWF0b3IubWF0Y2g7XG4gIH0gZWxzZSBpZiAobWF0Y2hlcikge1xuICAgIHByZWRpY2F0ZSA9IG1hdGNoZXI7XG4gIH0gZWxzZSBpZiAocHJlZGljYXRlKSB7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjEpIDogXCJDcmVhdGluZyBvciByZW1vdmluZyBhIGxpc3RlbmVyIHJlcXVpcmVzIG9uZSBvZiB0aGUga25vd24gZmllbGRzIGZvciBtYXRjaGluZyBhbiBhY3Rpb25cIik7XG4gIH1cbiAgYXNzZXJ0RnVuY3Rpb24oZWZmZWN0LCBcIm9wdGlvbnMubGlzdGVuZXJcIik7XG4gIHJldHVybiB7XG4gICAgcHJlZGljYXRlLFxuICAgIHR5cGUsXG4gICAgZWZmZWN0XG4gIH07XG59O1xudmFyIGNyZWF0ZUxpc3RlbmVyRW50cnkgPSAvKiBAX19QVVJFX18gKi8gYXNzaWduKChvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHByZWRpY2F0ZSxcbiAgICBlZmZlY3RcbiAgfSA9IGdldExpc3RlbmVyRW50cnlQcm9wc0Zyb20ob3B0aW9ucyk7XG4gIGNvbnN0IGlkID0gbmFub2lkKCk7XG4gIGNvbnN0IGVudHJ5ID0ge1xuICAgIGlkLFxuICAgIGVmZmVjdCxcbiAgICB0eXBlLFxuICAgIHByZWRpY2F0ZSxcbiAgICBwZW5kaW5nOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLFxuICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyMikgOiBcIlVuc3Vic2NyaWJlIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBlbnRyeTtcbn0sIHtcbiAgd2l0aFR5cGVzOiAoKSA9PiBjcmVhdGVMaXN0ZW5lckVudHJ5XG59KTtcbnZhciBjYW5jZWxBY3RpdmVMaXN0ZW5lcnMgPSAoZW50cnkpID0+IHtcbiAgZW50cnkucGVuZGluZy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgYWJvcnRDb250cm9sbGVyV2l0aFJlYXNvbihjb250cm9sbGVyLCBsaXN0ZW5lckNhbmNlbGxlZCk7XG4gIH0pO1xufTtcbnZhciBjcmVhdGVDbGVhckxpc3RlbmVyTWlkZGxld2FyZSA9IChsaXN0ZW5lck1hcCkgPT4ge1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGxpc3RlbmVyTWFwLmZvckVhY2goY2FuY2VsQWN0aXZlTGlzdGVuZXJzKTtcbiAgICBsaXN0ZW5lck1hcC5jbGVhcigpO1xuICB9O1xufTtcbnZhciBzYWZlbHlOb3RpZnlFcnJvciA9IChlcnJvckhhbmRsZXIsIGVycm9yVG9Ob3RpZnksIGVycm9ySW5mbykgPT4ge1xuICB0cnkge1xuICAgIGVycm9ySGFuZGxlcihlcnJvclRvTm90aWZ5LCBlcnJvckluZm8pO1xuICB9IGNhdGNoIChlcnJvckhhbmRsZXJFcnJvcikge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhyb3cgZXJyb3JIYW5kbGVyRXJyb3I7XG4gICAgfSwgMCk7XG4gIH1cbn07XG52YXIgYWRkTGlzdGVuZXIgPSAvKiBAX19QVVJFX18gKi8gYXNzaWduKC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBY3Rpb24oYCR7YWxtfS9hZGRgKSwge1xuICB3aXRoVHlwZXM6ICgpID0+IGFkZExpc3RlbmVyXG59KTtcbnZhciBjbGVhckFsbExpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBY3Rpb24oYCR7YWxtfS9yZW1vdmVBbGxgKTtcbnZhciByZW1vdmVMaXN0ZW5lciA9IC8qIEBfX1BVUkVfXyAqLyBhc3NpZ24oLyogQF9fUFVSRV9fICovIGNyZWF0ZUFjdGlvbihgJHthbG19L3JlbW92ZWApLCB7XG4gIHdpdGhUeXBlczogKCkgPT4gcmVtb3ZlTGlzdGVuZXJcbn0pO1xudmFyIGRlZmF1bHRFcnJvckhhbmRsZXIgPSAoLi4uYXJncykgPT4ge1xuICBjb25zb2xlLmVycm9yKGAke2FsbX0vZXJyb3JgLCAuLi5hcmdzKTtcbn07XG52YXIgY3JlYXRlTGlzdGVuZXJNaWRkbGV3YXJlID0gKG1pZGRsZXdhcmVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgbGlzdGVuZXJNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBjb25zdCB7XG4gICAgZXh0cmEsXG4gICAgb25FcnJvciA9IGRlZmF1bHRFcnJvckhhbmRsZXJcbiAgfSA9IG1pZGRsZXdhcmVPcHRpb25zO1xuICBhc3NlcnRGdW5jdGlvbihvbkVycm9yLCBcIm9uRXJyb3JcIik7XG4gIGNvbnN0IGluc2VydEVudHJ5ID0gKGVudHJ5KSA9PiB7XG4gICAgZW50cnkudW5zdWJzY3JpYmUgPSAoKSA9PiBsaXN0ZW5lck1hcC5kZWxldGUoZW50cnkuaWQpO1xuICAgIGxpc3RlbmVyTWFwLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgIHJldHVybiAoY2FuY2VsT3B0aW9ucykgPT4ge1xuICAgICAgZW50cnkudW5zdWJzY3JpYmUoKTtcbiAgICAgIGlmIChjYW5jZWxPcHRpb25zPy5jYW5jZWxBY3RpdmUpIHtcbiAgICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzKGVudHJ5KTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICBjb25zdCBzdGFydExpc3RlbmluZyA9IChvcHRpb25zKSA9PiB7XG4gICAgbGV0IGVudHJ5ID0gZmluZChBcnJheS5mcm9tKGxpc3RlbmVyTWFwLnZhbHVlcygpKSwgKGV4aXN0aW5nRW50cnkpID0+IGV4aXN0aW5nRW50cnkuZWZmZWN0ID09PSBvcHRpb25zLmVmZmVjdCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgZW50cnkgPSBjcmVhdGVMaXN0ZW5lckVudHJ5KG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gaW5zZXJ0RW50cnkoZW50cnkpO1xuICB9O1xuICBhc3NpZ24oc3RhcnRMaXN0ZW5pbmcsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHN0YXJ0TGlzdGVuaW5nXG4gIH0pO1xuICBjb25zdCBzdG9wTGlzdGVuaW5nID0gKG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB0eXBlLFxuICAgICAgZWZmZWN0LFxuICAgICAgcHJlZGljYXRlXG4gICAgfSA9IGdldExpc3RlbmVyRW50cnlQcm9wc0Zyb20ob3B0aW9ucyk7XG4gICAgY29uc3QgZW50cnkgPSBmaW5kKEFycmF5LmZyb20obGlzdGVuZXJNYXAudmFsdWVzKCkpLCAoZW50cnkyKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaFByZWRpY2F0ZU9yVHlwZSA9IHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiID8gZW50cnkyLnR5cGUgPT09IHR5cGUgOiBlbnRyeTIucHJlZGljYXRlID09PSBwcmVkaWNhdGU7XG4gICAgICByZXR1cm4gbWF0Y2hQcmVkaWNhdGVPclR5cGUgJiYgZW50cnkyLmVmZmVjdCA9PT0gZWZmZWN0O1xuICAgIH0pO1xuICAgIGlmIChlbnRyeSkge1xuICAgICAgZW50cnkudW5zdWJzY3JpYmUoKTtcbiAgICAgIGlmIChvcHRpb25zLmNhbmNlbEFjdGl2ZSkge1xuICAgICAgICBjYW5jZWxBY3RpdmVMaXN0ZW5lcnMoZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gISFlbnRyeTtcbiAgfTtcbiAgYXNzaWduKHN0b3BMaXN0ZW5pbmcsIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHN0b3BMaXN0ZW5pbmdcbiAgfSk7XG4gIGNvbnN0IG5vdGlmeUxpc3RlbmVyID0gYXN5bmMgKGVudHJ5LCBhY3Rpb24sIGFwaSwgZ2V0T3JpZ2luYWxTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IGludGVybmFsVGFza0NvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdGFrZSA9IGNyZWF0ZVRha2VQYXR0ZXJuKHN0YXJ0TGlzdGVuaW5nLCBpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgY29uc3QgYXV0b0pvaW5Qcm9taXNlcyA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBlbnRyeS5wZW5kaW5nLmFkZChpbnRlcm5hbFRhc2tDb250cm9sbGVyKTtcbiAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZShlbnRyeS5lZmZlY3QoXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgLy8gVXNlIGFzc2lnbigpIHJhdGhlciB0aGFuIC4uLiB0byBhdm9pZCBleHRyYSBoZWxwZXIgZnVuY3Rpb25zIGFkZGVkIHRvIGJ1bmRsZVxuICAgICAgICBhc3NpZ24oe30sIGFwaSwge1xuICAgICAgICAgIGdldE9yaWdpbmFsU3RhdGUsXG4gICAgICAgICAgY29uZGl0aW9uOiAocHJlZGljYXRlLCB0aW1lb3V0KSA9PiB0YWtlKHByZWRpY2F0ZSwgdGltZW91dCkudGhlbihCb29sZWFuKSxcbiAgICAgICAgICB0YWtlLFxuICAgICAgICAgIGRlbGF5OiBjcmVhdGVEZWxheShpbnRlcm5hbFRhc2tDb250cm9sbGVyLnNpZ25hbCksXG4gICAgICAgICAgcGF1c2U6IGNyZWF0ZVBhdXNlKGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsKSxcbiAgICAgICAgICBleHRyYSxcbiAgICAgICAgICBzaWduYWw6IGludGVybmFsVGFza0NvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIGZvcms6IGNyZWF0ZUZvcmsoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwsIGF1dG9Kb2luUHJvbWlzZXMpLFxuICAgICAgICAgIHVuc3Vic2NyaWJlOiBlbnRyeS51bnN1YnNjcmliZSxcbiAgICAgICAgICBzdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgICAgICAgIGxpc3RlbmVyTWFwLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FuY2VsQWN0aXZlTGlzdGVuZXJzOiAoKSA9PiB7XG4gICAgICAgICAgICBlbnRyeS5wZW5kaW5nLmZvckVhY2goKGNvbnRyb2xsZXIsIF8sIHNldCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPT0gaW50ZXJuYWxUYXNrQ29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oY29udHJvbGxlciwgbGlzdGVuZXJDYW5jZWxsZWQpO1xuICAgICAgICAgICAgICAgIHNldC5kZWxldGUoY29udHJvbGxlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICBhYm9ydENvbnRyb2xsZXJXaXRoUmVhc29uKGludGVybmFsVGFza0NvbnRyb2xsZXIsIGxpc3RlbmVyQ2FuY2VsbGVkKTtcbiAgICAgICAgICAgIGVudHJ5LnBlbmRpbmcuZGVsZXRlKGludGVybmFsVGFza0NvbnRyb2xsZXIpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhyb3dJZkNhbmNlbGxlZDogKCkgPT4ge1xuICAgICAgICAgICAgdmFsaWRhdGVBY3RpdmUoaW50ZXJuYWxUYXNrQ29udHJvbGxlci5zaWduYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICkpO1xuICAgIH0gY2F0Y2ggKGxpc3RlbmVyRXJyb3IpIHtcbiAgICAgIGlmICghKGxpc3RlbmVyRXJyb3IgaW5zdGFuY2VvZiBUYXNrQWJvcnRFcnJvcikpIHtcbiAgICAgICAgc2FmZWx5Tm90aWZ5RXJyb3Iob25FcnJvciwgbGlzdGVuZXJFcnJvciwge1xuICAgICAgICAgIHJhaXNlZEJ5OiBcImVmZmVjdFwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChhdXRvSm9pblByb21pc2VzKTtcbiAgICAgIGFib3J0Q29udHJvbGxlcldpdGhSZWFzb24oaW50ZXJuYWxUYXNrQ29udHJvbGxlciwgbGlzdGVuZXJDb21wbGV0ZWQpO1xuICAgICAgZW50cnkucGVuZGluZy5kZWxldGUoaW50ZXJuYWxUYXNrQ29udHJvbGxlcik7XG4gICAgfVxuICB9O1xuICBjb25zdCBjbGVhckxpc3RlbmVyTWlkZGxld2FyZSA9IGNyZWF0ZUNsZWFyTGlzdGVuZXJNaWRkbGV3YXJlKGxpc3RlbmVyTWFwKTtcbiAgY29uc3QgbWlkZGxld2FyZSA9IChhcGkpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgaWYgKCFpc0FjdGlvbjMoYWN0aW9uKSkge1xuICAgICAgcmV0dXJuIG5leHQoYWN0aW9uKTtcbiAgICB9XG4gICAgaWYgKGFkZExpc3RlbmVyLm1hdGNoKGFjdGlvbikpIHtcbiAgICAgIHJldHVybiBzdGFydExpc3RlbmluZyhhY3Rpb24ucGF5bG9hZCk7XG4gICAgfVxuICAgIGlmIChjbGVhckFsbExpc3RlbmVycy5tYXRjaChhY3Rpb24pKSB7XG4gICAgICBjbGVhckxpc3RlbmVyTWlkZGxld2FyZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVtb3ZlTGlzdGVuZXIubWF0Y2goYWN0aW9uKSkge1xuICAgICAgcmV0dXJuIHN0b3BMaXN0ZW5pbmcoYWN0aW9uLnBheWxvYWQpO1xuICAgIH1cbiAgICBsZXQgb3JpZ2luYWxTdGF0ZSA9IGFwaS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGdldE9yaWdpbmFsU3RhdGUgPSAoKSA9PiB7XG4gICAgICBpZiAob3JpZ2luYWxTdGF0ZSA9PT0gSU5URVJOQUxfTklMX1RPS0VOKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDIzKSA6IGAke2FsbX06IGdldE9yaWdpbmFsU3RhdGUgY2FuIG9ubHkgYmUgY2FsbGVkIHN5bmNocm9ub3VzbHlgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcmlnaW5hbFN0YXRlO1xuICAgIH07XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gbmV4dChhY3Rpb24pO1xuICAgICAgaWYgKGxpc3RlbmVyTWFwLnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGFwaS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBsaXN0ZW5lckVudHJpZXMgPSBBcnJheS5mcm9tKGxpc3RlbmVyTWFwLnZhbHVlcygpKTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBsaXN0ZW5lckVudHJpZXMpIHtcbiAgICAgICAgICBsZXQgcnVuTGlzdGVuZXIgPSBmYWxzZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcnVuTGlzdGVuZXIgPSBlbnRyeS5wcmVkaWNhdGUoYWN0aW9uLCBjdXJyZW50U3RhdGUsIG9yaWdpbmFsU3RhdGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKHByZWRpY2F0ZUVycm9yKSB7XG4gICAgICAgICAgICBydW5MaXN0ZW5lciA9IGZhbHNlO1xuICAgICAgICAgICAgc2FmZWx5Tm90aWZ5RXJyb3Iob25FcnJvciwgcHJlZGljYXRlRXJyb3IsIHtcbiAgICAgICAgICAgICAgcmFpc2VkQnk6IFwicHJlZGljYXRlXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXJ1bkxpc3RlbmVyKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm90aWZ5TGlzdGVuZXIoZW50cnksIGFjdGlvbiwgYXBpLCBnZXRPcmlnaW5hbFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBvcmlnaW5hbFN0YXRlID0gSU5URVJOQUxfTklMX1RPS0VOO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4ge1xuICAgIG1pZGRsZXdhcmUsXG4gICAgc3RhcnRMaXN0ZW5pbmcsXG4gICAgc3RvcExpc3RlbmluZyxcbiAgICBjbGVhckxpc3RlbmVyczogY2xlYXJMaXN0ZW5lck1pZGRsZXdhcmVcbiAgfTtcbn07XG5cbi8vIHNyYy9keW5hbWljTWlkZGxld2FyZS9pbmRleC50c1xuaW1wb3J0IHsgY29tcG9zZSBhcyBjb21wb3NlMyB9IGZyb20gXCJyZWR1eFwiO1xudmFyIGNyZWF0ZU1pZGRsZXdhcmVFbnRyeSA9IChtaWRkbGV3YXJlKSA9PiAoe1xuICBpZDogbmFub2lkKCksXG4gIG1pZGRsZXdhcmUsXG4gIGFwcGxpZWQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKClcbn0pO1xudmFyIG1hdGNoSW5zdGFuY2UgPSAoaW5zdGFuY2VJZCkgPT4gKGFjdGlvbikgPT4gYWN0aW9uPy5tZXRhPy5pbnN0YW5jZUlkID09PSBpbnN0YW5jZUlkO1xudmFyIGNyZWF0ZUR5bmFtaWNNaWRkbGV3YXJlID0gKCkgPT4ge1xuICBjb25zdCBpbnN0YW5jZUlkID0gbmFub2lkKCk7XG4gIGNvbnN0IG1pZGRsZXdhcmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBjb25zdCB3aXRoTWlkZGxld2FyZSA9IE9iamVjdC5hc3NpZ24oY3JlYXRlQWN0aW9uKFwiZHluYW1pY01pZGRsZXdhcmUvYWRkXCIsICguLi5taWRkbGV3YXJlcykgPT4gKHtcbiAgICBwYXlsb2FkOiBtaWRkbGV3YXJlcyxcbiAgICBtZXRhOiB7XG4gICAgICBpbnN0YW5jZUlkXG4gICAgfVxuICB9KSksIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IHdpdGhNaWRkbGV3YXJlXG4gIH0pO1xuICBjb25zdCBhZGRNaWRkbGV3YXJlID0gT2JqZWN0LmFzc2lnbihmdW5jdGlvbiBhZGRNaWRkbGV3YXJlMiguLi5taWRkbGV3YXJlcykge1xuICAgIG1pZGRsZXdhcmVzLmZvckVhY2goKG1pZGRsZXdhcmUyKSA9PiB7XG4gICAgICBsZXQgZW50cnkgPSBmaW5kKEFycmF5LmZyb20obWlkZGxld2FyZU1hcC52YWx1ZXMoKSksIChlbnRyeTIpID0+IGVudHJ5Mi5taWRkbGV3YXJlID09PSBtaWRkbGV3YXJlMik7XG4gICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIGVudHJ5ID0gY3JlYXRlTWlkZGxld2FyZUVudHJ5KG1pZGRsZXdhcmUyKTtcbiAgICAgIH1cbiAgICAgIG1pZGRsZXdhcmVNYXAuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgfSk7XG4gIH0sIHtcbiAgICB3aXRoVHlwZXM6ICgpID0+IGFkZE1pZGRsZXdhcmVcbiAgfSk7XG4gIGNvbnN0IGdldEZpbmFsTWlkZGxld2FyZSA9IChhcGkpID0+IHtcbiAgICBjb25zdCBhcHBsaWVkTWlkZGxld2FyZSA9IEFycmF5LmZyb20obWlkZGxld2FyZU1hcC52YWx1ZXMoKSkubWFwKChlbnRyeSkgPT4gZW1wbGFjZShlbnRyeS5hcHBsaWVkLCBhcGksIHtcbiAgICAgIGluc2VydDogKCkgPT4gZW50cnkubWlkZGxld2FyZShhcGkpXG4gICAgfSkpO1xuICAgIHJldHVybiBjb21wb3NlMyguLi5hcHBsaWVkTWlkZGxld2FyZSk7XG4gIH07XG4gIGNvbnN0IGlzV2l0aE1pZGRsZXdhcmUgPSBpc0FsbE9mKHdpdGhNaWRkbGV3YXJlLCBtYXRjaEluc3RhbmNlKGluc3RhbmNlSWQpKTtcbiAgY29uc3QgbWlkZGxld2FyZSA9IChhcGkpID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgaWYgKGlzV2l0aE1pZGRsZXdhcmUoYWN0aW9uKSkge1xuICAgICAgYWRkTWlkZGxld2FyZSguLi5hY3Rpb24ucGF5bG9hZCk7XG4gICAgICByZXR1cm4gYXBpLmRpc3BhdGNoO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0RmluYWxNaWRkbGV3YXJlKGFwaSkobmV4dCkoYWN0aW9uKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtaWRkbGV3YXJlLFxuICAgIGFkZE1pZGRsZXdhcmUsXG4gICAgd2l0aE1pZGRsZXdhcmUsXG4gICAgaW5zdGFuY2VJZFxuICB9O1xufTtcblxuLy8gc3JjL2NvbWJpbmVTbGljZXMudHNcbmltcG9ydCB7IGNvbWJpbmVSZWR1Y2VycyBhcyBjb21iaW5lUmVkdWNlcnMyIH0gZnJvbSBcInJlZHV4XCI7XG52YXIgaXNTbGljZUxpa2UgPSAobWF5YmVTbGljZUxpa2UpID0+IFwicmVkdWNlclBhdGhcIiBpbiBtYXliZVNsaWNlTGlrZSAmJiB0eXBlb2YgbWF5YmVTbGljZUxpa2UucmVkdWNlclBhdGggPT09IFwic3RyaW5nXCI7XG52YXIgZ2V0UmVkdWNlcnMgPSAoc2xpY2VzKSA9PiBzbGljZXMuZmxhdE1hcCgoc2xpY2VPck1hcCkgPT4gaXNTbGljZUxpa2Uoc2xpY2VPck1hcCkgPyBbW3NsaWNlT3JNYXAucmVkdWNlclBhdGgsIHNsaWNlT3JNYXAucmVkdWNlcl1dIDogT2JqZWN0LmVudHJpZXMoc2xpY2VPck1hcCkpO1xudmFyIE9SSUdJTkFMX1NUQVRFID0gU3ltYm9sLmZvcihcInJ0ay1zdGF0ZS1wcm94eS1vcmlnaW5hbFwiKTtcbnZhciBpc1N0YXRlUHJveHkgPSAodmFsdWUpID0+ICEhdmFsdWUgJiYgISF2YWx1ZVtPUklHSU5BTF9TVEFURV07XG52YXIgc3RhdGVQcm94eU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xudmFyIGNyZWF0ZVN0YXRlUHJveHkgPSAoc3RhdGUsIHJlZHVjZXJNYXApID0+IGVtcGxhY2Uoc3RhdGVQcm94eU1hcCwgc3RhdGUsIHtcbiAgaW5zZXJ0OiAoKSA9PiBuZXcgUHJveHkoc3RhdGUsIHtcbiAgICBnZXQ6ICh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSA9PiB7XG4gICAgICBpZiAocHJvcCA9PT0gT1JJR0lOQUxfU1RBVEUpIHJldHVybiB0YXJnZXQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGNvbnN0IHJlZHVjZXIgPSByZWR1Y2VyTWFwW3Byb3AudG9TdHJpbmcoKV07XG4gICAgICAgIGlmIChyZWR1Y2VyKSB7XG4gICAgICAgICAgY29uc3QgcmVkdWNlclJlc3VsdCA9IHJlZHVjZXIodm9pZCAwLCB7XG4gICAgICAgICAgICB0eXBlOiBuYW5vaWQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVkdWNlclJlc3VsdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMjQpIDogYFRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke3Byb3AudG9TdHJpbmcoKX1cIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBjYWxsZWQgZm9yIHNlbGVjdG9yKCkuIElmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQuIElmIHlvdSBkb24ndCB3YW50IHRvIHNldCBhIHZhbHVlIGZvciB0aGlzIHJlZHVjZXIsIHlvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZWR1Y2VyUmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSlcbn0pO1xudmFyIG9yaWdpbmFsID0gKHN0YXRlKSA9PiB7XG4gIGlmICghaXNTdGF0ZVByb3h5KHN0YXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDI1KSA6IFwib3JpZ2luYWwgbXVzdCBiZSB1c2VkIG9uIHN0YXRlIFByb3h5XCIpO1xuICB9XG4gIHJldHVybiBzdGF0ZVtPUklHSU5BTF9TVEFURV07XG59O1xudmFyIG5vb3BSZWR1Y2VyID0gKHN0YXRlID0ge30pID0+IHN0YXRlO1xuZnVuY3Rpb24gY29tYmluZVNsaWNlcyguLi5zbGljZXMpIHtcbiAgY29uc3QgcmVkdWNlck1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhnZXRSZWR1Y2VycyhzbGljZXMpKTtcbiAgY29uc3QgZ2V0UmVkdWNlciA9ICgpID0+IE9iamVjdC5rZXlzKHJlZHVjZXJNYXApLmxlbmd0aCA/IGNvbWJpbmVSZWR1Y2VyczIocmVkdWNlck1hcCkgOiBub29wUmVkdWNlcjtcbiAgbGV0IHJlZHVjZXIgPSBnZXRSZWR1Y2VyKCk7XG4gIGZ1bmN0aW9uIGNvbWJpbmVkUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gICAgcmV0dXJuIHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gIH1cbiAgY29tYmluZWRSZWR1Y2VyLndpdGhMYXp5TG9hZGVkU2xpY2VzID0gKCkgPT4gY29tYmluZWRSZWR1Y2VyO1xuICBjb25zdCBpbmplY3QgPSAoc2xpY2UsIGNvbmZpZyA9IHt9KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgcmVkdWNlclBhdGgsXG4gICAgICByZWR1Y2VyOiByZWR1Y2VyVG9JbmplY3RcbiAgICB9ID0gc2xpY2U7XG4gICAgY29uc3QgY3VycmVudFJlZHVjZXIgPSByZWR1Y2VyTWFwW3JlZHVjZXJQYXRoXTtcbiAgICBpZiAoIWNvbmZpZy5vdmVycmlkZUV4aXN0aW5nICYmIGN1cnJlbnRSZWR1Y2VyICYmIGN1cnJlbnRSZWR1Y2VyICE9PSByZWR1Y2VyVG9JbmplY3QpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYGNhbGxlZCBcXGBpbmplY3RcXGAgdG8gb3ZlcnJpZGUgYWxyZWFkeS1leGlzdGluZyByZWR1Y2VyICR7cmVkdWNlclBhdGh9IHdpdGhvdXQgc3BlY2lmeWluZyBcXGBvdmVycmlkZUV4aXN0aW5nOiB0cnVlXFxgYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29tYmluZWRSZWR1Y2VyO1xuICAgIH1cbiAgICByZWR1Y2VyTWFwW3JlZHVjZXJQYXRoXSA9IHJlZHVjZXJUb0luamVjdDtcbiAgICByZWR1Y2VyID0gZ2V0UmVkdWNlcigpO1xuICAgIHJldHVybiBjb21iaW5lZFJlZHVjZXI7XG4gIH07XG4gIGNvbnN0IHNlbGVjdG9yID0gT2JqZWN0LmFzc2lnbihmdW5jdGlvbiBtYWtlU2VsZWN0b3Ioc2VsZWN0b3JGbiwgc2VsZWN0U3RhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gc2VsZWN0b3IyKHN0YXRlLCAuLi5hcmdzKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3JGbihjcmVhdGVTdGF0ZVByb3h5KHNlbGVjdFN0YXRlID8gc2VsZWN0U3RhdGUoc3RhdGUsIC4uLmFyZ3MpIDogc3RhdGUsIHJlZHVjZXJNYXApLCAuLi5hcmdzKTtcbiAgICB9O1xuICB9LCB7XG4gICAgb3JpZ2luYWxcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKGNvbWJpbmVkUmVkdWNlciwge1xuICAgIGluamVjdCxcbiAgICBzZWxlY3RvclxuICB9KTtcbn1cblxuLy8gc3JjL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UudHNcbmZ1bmN0aW9uIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoY29kZSkge1xuICByZXR1cm4gYE1pbmlmaWVkIFJlZHV4IFRvb2xraXQgZXJyb3IgIyR7Y29kZX07IHZpc2l0IGh0dHBzOi8vcmVkdXgtdG9vbGtpdC5qcy5vcmcvRXJyb3JzP2NvZGU9JHtjb2RlfSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzLiBgO1xufVxuZXhwb3J0IHtcbiAgUmVkdWNlclR5cGUsXG4gIFNIT1VMRF9BVVRPQkFUQ0gsXG4gIFRhc2tBYm9ydEVycm9yLFxuICBUdXBsZSxcbiAgYWRkTGlzdGVuZXIsXG4gIGFzeW5jVGh1bmtDcmVhdG9yLFxuICBhdXRvQmF0Y2hFbmhhbmNlcixcbiAgYnVpbGRDcmVhdGVTbGljZSxcbiAgY2xlYXJBbGxMaXN0ZW5lcnMsXG4gIGNvbWJpbmVTbGljZXMsXG4gIGNvbmZpZ3VyZVN0b3JlLFxuICBjcmVhdGVBY3Rpb24sXG4gIGNyZWF0ZUFjdGlvbkNyZWF0b3JJbnZhcmlhbnRNaWRkbGV3YXJlLFxuICBjcmVhdGVBc3luY1RodW5rLFxuICBjcmVhdGVEcmFmdFNhZmVTZWxlY3RvcixcbiAgY3JlYXRlRHJhZnRTYWZlU2VsZWN0b3JDcmVhdG9yLFxuICBjcmVhdGVEeW5hbWljTWlkZGxld2FyZSxcbiAgY3JlYXRlRW50aXR5QWRhcHRlcixcbiAgY3JlYXRlSW1tdXRhYmxlU3RhdGVJbnZhcmlhbnRNaWRkbGV3YXJlLFxuICBjcmVhdGVMaXN0ZW5lck1pZGRsZXdhcmUsXG4gIHByb2R1Y2UgYXMgY3JlYXRlTmV4dFN0YXRlLFxuICBjcmVhdGVSZWR1Y2VyLFxuICBjcmVhdGVTZWxlY3RvcixcbiAgY3JlYXRlU2VsZWN0b3JDcmVhdG9yMiBhcyBjcmVhdGVTZWxlY3RvckNyZWF0b3IsXG4gIGNyZWF0ZVNlcmlhbGl6YWJsZVN0YXRlSW52YXJpYW50TWlkZGxld2FyZSxcbiAgY3JlYXRlU2xpY2UsXG4gIGN1cnJlbnQzIGFzIGN1cnJlbnQsXG4gIGZpbmROb25TZXJpYWxpemFibGVWYWx1ZSxcbiAgZm9ybWF0UHJvZEVycm9yTWVzc2FnZSxcbiAgZnJlZXplLFxuICBpc0FjdGlvbkNyZWF0b3IsXG4gIGlzQWxsT2YsXG4gIGlzQW55T2YsXG4gIGlzQXN5bmNUaHVua0FjdGlvbixcbiAgaXNEcmFmdDUgYXMgaXNEcmFmdCxcbiAgaXNGU0EgYXMgaXNGbHV4U3RhbmRhcmRBY3Rpb24sXG4gIGlzRnVsZmlsbGVkLFxuICBpc0ltbXV0YWJsZURlZmF1bHQsXG4gIGlzUGVuZGluZyxcbiAgaXNQbGFpbixcbiAgaXNSZWplY3RlZCxcbiAgaXNSZWplY3RlZFdpdGhWYWx1ZSxcbiAgbHJ1TWVtb2l6ZSxcbiAgbWluaVNlcmlhbGl6ZUVycm9yLFxuICBuYW5vaWQsXG4gIG9yaWdpbmFsMiBhcyBvcmlnaW5hbCxcbiAgcHJlcGFyZUF1dG9CYXRjaGVkLFxuICByZW1vdmVMaXN0ZW5lcixcbiAgdW53cmFwUmVzdWx0LFxuICB3ZWFrTWFwTWVtb2l6ZTIgYXMgd2Vha01hcE1lbW9pemVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWR1eC10b29sa2l0Lm1vZGVybi5tanMubWFwIiwiaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBodHRwQWRhcHRlciBmcm9tICcuL2h0dHAuanMnO1xuaW1wb3J0IHhockFkYXB0ZXIgZnJvbSAnLi94aHIuanMnO1xuaW1wb3J0IGZldGNoQWRhcHRlciBmcm9tICcuL2ZldGNoLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gXCIuLi9jb3JlL0F4aW9zRXJyb3IuanNcIjtcblxuY29uc3Qga25vd25BZGFwdGVycyA9IHtcbiAgaHR0cDogaHR0cEFkYXB0ZXIsXG4gIHhocjogeGhyQWRhcHRlcixcbiAgZmV0Y2g6IGZldGNoQWRhcHRlclxufVxuXG51dGlscy5mb3JFYWNoKGtub3duQWRhcHRlcnMsIChmbiwgdmFsdWUpID0+IHtcbiAgaWYgKGZuKSB7XG4gICAgdHJ5IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ25hbWUnLCB7dmFsdWV9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnYWRhcHRlck5hbWUnLCB7dmFsdWV9KTtcbiAgfVxufSk7XG5cbmNvbnN0IHJlbmRlclJlYXNvbiA9IChyZWFzb24pID0+IGAtICR7cmVhc29ufWA7XG5cbmNvbnN0IGlzUmVzb2x2ZWRIYW5kbGUgPSAoYWRhcHRlcikgPT4gdXRpbHMuaXNGdW5jdGlvbihhZGFwdGVyKSB8fCBhZGFwdGVyID09PSBudWxsIHx8IGFkYXB0ZXIgPT09IGZhbHNlO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldEFkYXB0ZXI6IChhZGFwdGVycykgPT4ge1xuICAgIGFkYXB0ZXJzID0gdXRpbHMuaXNBcnJheShhZGFwdGVycykgPyBhZGFwdGVycyA6IFthZGFwdGVyc107XG5cbiAgICBjb25zdCB7bGVuZ3RofSA9IGFkYXB0ZXJzO1xuICAgIGxldCBuYW1lT3JBZGFwdGVyO1xuICAgIGxldCBhZGFwdGVyO1xuXG4gICAgY29uc3QgcmVqZWN0ZWRSZWFzb25zID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBuYW1lT3JBZGFwdGVyID0gYWRhcHRlcnNbaV07XG4gICAgICBsZXQgaWQ7XG5cbiAgICAgIGFkYXB0ZXIgPSBuYW1lT3JBZGFwdGVyO1xuXG4gICAgICBpZiAoIWlzUmVzb2x2ZWRIYW5kbGUobmFtZU9yQWRhcHRlcikpIHtcbiAgICAgICAgYWRhcHRlciA9IGtub3duQWRhcHRlcnNbKGlkID0gU3RyaW5nKG5hbWVPckFkYXB0ZXIpKS50b0xvd2VyQ2FzZSgpXTtcblxuICAgICAgICBpZiAoYWRhcHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoYFVua25vd24gYWRhcHRlciAnJHtpZH0nYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFkYXB0ZXIpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJlamVjdGVkUmVhc29uc1tpZCB8fCAnIycgKyBpXSA9IGFkYXB0ZXI7XG4gICAgfVxuXG4gICAgaWYgKCFhZGFwdGVyKSB7XG5cbiAgICAgIGNvbnN0IHJlYXNvbnMgPSBPYmplY3QuZW50cmllcyhyZWplY3RlZFJlYXNvbnMpXG4gICAgICAgIC5tYXAoKFtpZCwgc3RhdGVdKSA9PiBgYWRhcHRlciAke2lkfSBgICtcbiAgICAgICAgICAoc3RhdGUgPT09IGZhbHNlID8gJ2lzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGVudmlyb25tZW50JyA6ICdpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBidWlsZCcpXG4gICAgICAgICk7XG5cbiAgICAgIGxldCBzID0gbGVuZ3RoID9cbiAgICAgICAgKHJlYXNvbnMubGVuZ3RoID4gMSA/ICdzaW5jZSA6XFxuJyArIHJlYXNvbnMubWFwKHJlbmRlclJlYXNvbikuam9pbignXFxuJykgOiAnICcgKyByZW5kZXJSZWFzb24ocmVhc29uc1swXSkpIDpcbiAgICAgICAgJ2FzIG5vIGFkYXB0ZXIgc3BlY2lmaWVkJztcblxuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgIGBUaGVyZSBpcyBubyBzdWl0YWJsZSBhZGFwdGVyIHRvIGRpc3BhdGNoIHRoZSByZXF1ZXN0IGAgKyBzLFxuICAgICAgICAnRVJSX05PVF9TVVBQT1JUJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRhcHRlcjtcbiAgfSxcbiAgYWRhcHRlcnM6IGtub3duQWRhcHRlcnNcbn1cbiIsImltcG9ydCBwbGF0Zm9ybSBmcm9tIFwiLi4vcGxhdGZvcm0vaW5kZXguanNcIjtcbmltcG9ydCB1dGlscyBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gXCIuLi9jb3JlL0F4aW9zRXJyb3IuanNcIjtcbmltcG9ydCBjb21wb3NlU2lnbmFscyBmcm9tIFwiLi4vaGVscGVycy9jb21wb3NlU2lnbmFscy5qc1wiO1xuaW1wb3J0IHt0cmFja1N0cmVhbX0gZnJvbSBcIi4uL2hlbHBlcnMvdHJhY2tTdHJlYW0uanNcIjtcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSBcIi4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzXCI7XG5pbXBvcnQge3Byb2dyZXNzRXZlbnRSZWR1Y2VyLCBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yLCBhc3luY0RlY29yYXRvcn0gZnJvbSBcIi4uL2hlbHBlcnMvcHJvZ3Jlc3NFdmVudFJlZHVjZXIuanNcIjtcbmltcG9ydCByZXNvbHZlQ29uZmlnIGZyb20gXCIuLi9oZWxwZXJzL3Jlc29sdmVDb25maWcuanNcIjtcbmltcG9ydCBzZXR0bGUgZnJvbSBcIi4uL2NvcmUvc2V0dGxlLmpzXCI7XG5cbmNvbnN0IGlzRmV0Y2hTdXBwb3J0ZWQgPSB0eXBlb2YgZmV0Y2ggPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFJlcXVlc3QgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFJlc3BvbnNlID09PSAnZnVuY3Rpb24nO1xuY29uc3QgaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCA9IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgdHlwZW9mIFJlYWRhYmxlU3RyZWFtID09PSAnZnVuY3Rpb24nO1xuXG4vLyB1c2VkIG9ubHkgaW5zaWRlIHRoZSBmZXRjaCBhZGFwdGVyXG5jb25zdCBlbmNvZGVUZXh0ID0gaXNGZXRjaFN1cHBvcnRlZCAmJiAodHlwZW9mIFRleHRFbmNvZGVyID09PSAnZnVuY3Rpb24nID9cbiAgICAoKGVuY29kZXIpID0+IChzdHIpID0+IGVuY29kZXIuZW5jb2RlKHN0cikpKG5ldyBUZXh0RW5jb2RlcigpKSA6XG4gICAgYXN5bmMgKHN0cikgPT4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IFJlc3BvbnNlKHN0cikuYXJyYXlCdWZmZXIoKSlcbik7XG5cbmNvbnN0IHRlc3QgPSAoZm4sIC4uLmFyZ3MpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFmbiguLi5hcmdzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmNvbnN0IHN1cHBvcnRzUmVxdWVzdFN0cmVhbSA9IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgJiYgdGVzdCgoKSA9PiB7XG4gIGxldCBkdXBsZXhBY2Nlc3NlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgYm9keTogbmV3IFJlYWRhYmxlU3RyZWFtKCksXG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgZ2V0IGR1cGxleCgpIHtcbiAgICAgIGR1cGxleEFjY2Vzc2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiAnaGFsZic7XG4gICAgfSxcbiAgfSkuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpO1xuXG4gIHJldHVybiBkdXBsZXhBY2Nlc3NlZCAmJiAhaGFzQ29udGVudFR5cGU7XG59KTtcblxuY29uc3QgREVGQVVMVF9DSFVOS19TSVpFID0gNjQgKiAxMDI0O1xuXG5jb25zdCBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtID0gaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJlxuICB0ZXN0KCgpID0+IHV0aWxzLmlzUmVhZGFibGVTdHJlYW0obmV3IFJlc3BvbnNlKCcnKS5ib2R5KSk7XG5cblxuY29uc3QgcmVzb2x2ZXJzID0ge1xuICBzdHJlYW06IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gJiYgKChyZXMpID0+IHJlcy5ib2R5KVxufTtcblxuaXNGZXRjaFN1cHBvcnRlZCAmJiAoKChyZXMpID0+IHtcbiAgWyd0ZXh0JywgJ2FycmF5QnVmZmVyJywgJ2Jsb2InLCAnZm9ybURhdGEnLCAnc3RyZWFtJ10uZm9yRWFjaCh0eXBlID0+IHtcbiAgICAhcmVzb2x2ZXJzW3R5cGVdICYmIChyZXNvbHZlcnNbdHlwZV0gPSB1dGlscy5pc0Z1bmN0aW9uKHJlc1t0eXBlXSkgPyAocmVzKSA9PiByZXNbdHlwZV0oKSA6XG4gICAgICAoXywgY29uZmlnKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKGBSZXNwb25zZSB0eXBlICcke3R5cGV9JyBpcyBub3Qgc3VwcG9ydGVkYCwgQXhpb3NFcnJvci5FUlJfTk9UX1NVUFBPUlQsIGNvbmZpZyk7XG4gICAgICB9KVxuICB9KTtcbn0pKG5ldyBSZXNwb25zZSkpO1xuXG5jb25zdCBnZXRCb2R5TGVuZ3RoID0gYXN5bmMgKGJvZHkpID0+IHtcbiAgaWYgKGJvZHkgPT0gbnVsbCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYodXRpbHMuaXNCbG9iKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHkuc2l6ZTtcbiAgfVxuXG4gIGlmKHV0aWxzLmlzU3BlY0NvbXBsaWFudEZvcm0oYm9keSkpIHtcbiAgICByZXR1cm4gKGF3YWl0IG5ldyBSZXF1ZXN0KGJvZHkpLmFycmF5QnVmZmVyKCkpLmJ5dGVMZW5ndGg7XG4gIH1cblxuICBpZih1dGlscy5pc0FycmF5QnVmZmVyVmlldyhib2R5KSB8fCB1dGlscy5pc0FycmF5QnVmZmVyKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGJvZHkpKSB7XG4gICAgYm9keSA9IGJvZHkgKyAnJztcbiAgfVxuXG4gIGlmKHV0aWxzLmlzU3RyaW5nKGJvZHkpKSB7XG4gICAgcmV0dXJuIChhd2FpdCBlbmNvZGVUZXh0KGJvZHkpKS5ieXRlTGVuZ3RoO1xuICB9XG59XG5cbmNvbnN0IHJlc29sdmVCb2R5TGVuZ3RoID0gYXN5bmMgKGhlYWRlcnMsIGJvZHkpID0+IHtcbiAgY29uc3QgbGVuZ3RoID0gdXRpbHMudG9GaW5pdGVOdW1iZXIoaGVhZGVycy5nZXRDb250ZW50TGVuZ3RoKCkpO1xuXG4gIHJldHVybiBsZW5ndGggPT0gbnVsbCA/IGdldEJvZHlMZW5ndGgoYm9keSkgOiBsZW5ndGg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgKGFzeW5jIChjb25maWcpID0+IHtcbiAgbGV0IHtcbiAgICB1cmwsXG4gICAgbWV0aG9kLFxuICAgIGRhdGEsXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbFRva2VuLFxuICAgIHRpbWVvdXQsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgcmVzcG9uc2VUeXBlLFxuICAgIGhlYWRlcnMsXG4gICAgd2l0aENyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJyxcbiAgICBmZXRjaE9wdGlvbnNcbiAgfSA9IHJlc29sdmVDb25maWcoY29uZmlnKTtcblxuICByZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUgPyAocmVzcG9uc2VUeXBlICsgJycpLnRvTG93ZXJDYXNlKCkgOiAndGV4dCc7XG5cbiAgbGV0IFtjb21wb3NlZFNpZ25hbCwgc3RvcFRpbWVvdXRdID0gKHNpZ25hbCB8fCBjYW5jZWxUb2tlbiB8fCB0aW1lb3V0KSA/XG4gICAgY29tcG9zZVNpZ25hbHMoW3NpZ25hbCwgY2FuY2VsVG9rZW5dLCB0aW1lb3V0KSA6IFtdO1xuXG4gIGxldCBmaW5pc2hlZCwgcmVxdWVzdDtcblxuICBjb25zdCBvbkZpbmlzaCA9ICgpID0+IHtcbiAgICAhZmluaXNoZWQgJiYgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb21wb3NlZFNpZ25hbCAmJiBjb21wb3NlZFNpZ25hbC51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuXG4gICAgZmluaXNoZWQgPSB0cnVlO1xuICB9XG5cbiAgbGV0IHJlcXVlc3RDb250ZW50TGVuZ3RoO1xuXG4gIHRyeSB7XG4gICAgaWYgKFxuICAgICAgb25VcGxvYWRQcm9ncmVzcyAmJiBzdXBwb3J0c1JlcXVlc3RTdHJlYW0gJiYgbWV0aG9kICE9PSAnZ2V0JyAmJiBtZXRob2QgIT09ICdoZWFkJyAmJlxuICAgICAgKHJlcXVlc3RDb250ZW50TGVuZ3RoID0gYXdhaXQgcmVzb2x2ZUJvZHlMZW5ndGgoaGVhZGVycywgZGF0YSkpICE9PSAwXG4gICAgKSB7XG4gICAgICBsZXQgX3JlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IGRhdGEsXG4gICAgICAgIGR1cGxleDogXCJoYWxmXCJcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgY29udGVudFR5cGVIZWFkZXI7XG5cbiAgICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpICYmIChjb250ZW50VHlwZUhlYWRlciA9IF9yZXF1ZXN0LmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSkpIHtcbiAgICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZUhlYWRlcilcbiAgICAgIH1cblxuICAgICAgaWYgKF9yZXF1ZXN0LmJvZHkpIHtcbiAgICAgICAgY29uc3QgW29uUHJvZ3Jlc3MsIGZsdXNoXSA9IHByb2dyZXNzRXZlbnREZWNvcmF0b3IoXG4gICAgICAgICAgcmVxdWVzdENvbnRlbnRMZW5ndGgsXG4gICAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25VcGxvYWRQcm9ncmVzcykpXG4gICAgICAgICk7XG5cbiAgICAgICAgZGF0YSA9IHRyYWNrU3RyZWFtKF9yZXF1ZXN0LmJvZHksIERFRkFVTFRfQ0hVTktfU0laRSwgb25Qcm9ncmVzcywgZmx1c2gsIGVuY29kZVRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXRpbHMuaXNTdHJpbmcod2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgd2l0aENyZWRlbnRpYWxzID0gd2l0aENyZWRlbnRpYWxzID8gJ2luY2x1ZGUnIDogJ29taXQnO1xuICAgIH1cblxuICAgIC8vIENsb3VkZmxhcmUgV29ya2VycyB0aHJvd3Mgd2hlbiBjcmVkZW50aWFscyBhcmUgZGVmaW5lZFxuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2xvdWRmbGFyZS93b3JrZXJkL2lzc3Vlcy85MDJcbiAgICBjb25zdCBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID0gXCJjcmVkZW50aWFsc1wiIGluIFJlcXVlc3QucHJvdG90eXBlOyBcbiAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICBzaWduYWw6IGNvbXBvc2VkU2lnbmFsLFxuICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMubm9ybWFsaXplKCkudG9KU09OKCksXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgZHVwbGV4OiBcImhhbGZcIixcbiAgICAgIGNyZWRlbnRpYWxzOiBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID8gd2l0aENyZWRlbnRpYWxzIDogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcblxuICAgIGNvbnN0IGlzU3RyZWFtUmVzcG9uc2UgPSBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChyZXNwb25zZVR5cGUgPT09ICdzdHJlYW0nIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3Jlc3BvbnNlJyk7XG5cbiAgICBpZiAoc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAob25Eb3dubG9hZFByb2dyZXNzIHx8IGlzU3RyZWFtUmVzcG9uc2UpKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0ge307XG5cbiAgICAgIFsnc3RhdHVzJywgJ3N0YXR1c1RleHQnLCAnaGVhZGVycyddLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgIG9wdGlvbnNbcHJvcF0gPSByZXNwb25zZVtwcm9wXTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXNwb25zZUNvbnRlbnRMZW5ndGggPSB1dGlscy50b0Zpbml0ZU51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSk7XG5cbiAgICAgIGNvbnN0IFtvblByb2dyZXNzLCBmbHVzaF0gPSBvbkRvd25sb2FkUHJvZ3Jlc3MgJiYgcHJvZ3Jlc3NFdmVudERlY29yYXRvcihcbiAgICAgICAgcmVzcG9uc2VDb250ZW50TGVuZ3RoLFxuICAgICAgICBwcm9ncmVzc0V2ZW50UmVkdWNlcihhc3luY0RlY29yYXRvcihvbkRvd25sb2FkUHJvZ3Jlc3MpLCB0cnVlKVxuICAgICAgKSB8fCBbXTtcblxuICAgICAgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoXG4gICAgICAgIHRyYWNrU3RyZWFtKHJlc3BvbnNlLmJvZHksIERFRkFVTFRfQ0hVTktfU0laRSwgb25Qcm9ncmVzcywgKCkgPT4ge1xuICAgICAgICAgIGZsdXNoICYmIGZsdXNoKCk7XG4gICAgICAgICAgaXNTdHJlYW1SZXNwb25zZSAmJiBvbkZpbmlzaCgpO1xuICAgICAgICB9LCBlbmNvZGVUZXh0KSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUgfHwgJ3RleHQnO1xuXG4gICAgbGV0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc29sdmVyc1t1dGlscy5maW5kS2V5KHJlc29sdmVycywgcmVzcG9uc2VUeXBlKSB8fCAndGV4dCddKHJlc3BvbnNlLCBjb25maWcpO1xuXG4gICAgIWlzU3RyZWFtUmVzcG9uc2UgJiYgb25GaW5pc2goKTtcblxuICAgIHN0b3BUaW1lb3V0ICYmIHN0b3BUaW1lb3V0KCk7XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIGhlYWRlcnM6IEF4aW9zSGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpLFxuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICByZXF1ZXN0XG4gICAgICB9KVxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG9uRmluaXNoKCk7XG5cbiAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnVHlwZUVycm9yJyAmJiAvZmV0Y2gvaS50ZXN0KGVyci5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgbmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpLFxuICAgICAgICB7XG4gICAgICAgICAgY2F1c2U6IGVyci5jYXVzZSB8fCBlcnJcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlcnIsIGVyciAmJiBlcnIuY29kZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgfVxufSk7XG5cblxuIiwiaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IHNldHRsZSBmcm9tICcuLy4uL2NvcmUvc2V0dGxlLmpzJztcbmltcG9ydCB0cmFuc2l0aW9uYWxEZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4uL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzJztcbmltcG9ydCBwYXJzZVByb3RvY29sIGZyb20gJy4uL2hlbHBlcnMvcGFyc2VQcm90b2NvbC5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5pbXBvcnQge3Byb2dyZXNzRXZlbnRSZWR1Y2VyfSBmcm9tICcuLi9oZWxwZXJzL3Byb2dyZXNzRXZlbnRSZWR1Y2VyLmpzJztcbmltcG9ydCByZXNvbHZlQ29uZmlnIGZyb20gXCIuLi9oZWxwZXJzL3Jlc29sdmVDb25maWcuanNcIjtcblxuY29uc3QgaXNYSFJBZGFwdGVyU3VwcG9ydGVkID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJztcblxuZXhwb3J0IGRlZmF1bHQgaXNYSFJBZGFwdGVyU3VwcG9ydGVkICYmIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGRpc3BhdGNoWGhyUmVxdWVzdChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBjb25zdCBfY29uZmlnID0gcmVzb2x2ZUNvbmZpZyhjb25maWcpO1xuICAgIGxldCByZXF1ZXN0RGF0YSA9IF9jb25maWcuZGF0YTtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKF9jb25maWcuaGVhZGVycykubm9ybWFsaXplKCk7XG4gICAgbGV0IHtyZXNwb25zZVR5cGUsIG9uVXBsb2FkUHJvZ3Jlc3MsIG9uRG93bmxvYWRQcm9ncmVzc30gPSBfY29uZmlnO1xuICAgIGxldCBvbkNhbmNlbGVkO1xuICAgIGxldCB1cGxvYWRUaHJvdHRsZWQsIGRvd25sb2FkVGhyb3R0bGVkO1xuICAgIGxldCBmbHVzaFVwbG9hZCwgZmx1c2hEb3dubG9hZDtcblxuICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICBmbHVzaFVwbG9hZCAmJiBmbHVzaFVwbG9hZCgpOyAvLyBmbHVzaCBldmVudHNcbiAgICAgIGZsdXNoRG93bmxvYWQgJiYgZmx1c2hEb3dubG9hZCgpOyAvLyBmbHVzaCBldmVudHNcblxuICAgICAgX2NvbmZpZy5jYW5jZWxUb2tlbiAmJiBfY29uZmlnLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuXG4gICAgICBfY29uZmlnLnNpZ25hbCAmJiBfY29uZmlnLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgIH1cblxuICAgIGxldCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICByZXF1ZXN0Lm9wZW4oX2NvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSwgX2NvbmZpZy51cmwsIHRydWUpO1xuXG4gICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgaW4gTVNcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBfY29uZmlnLnRpbWVvdXQ7XG5cbiAgICBmdW5jdGlvbiBvbmxvYWRlbmQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2VcbiAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKFxuICAgICAgICAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSAhcmVzcG9uc2VUeXBlIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nID9cbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKGZ1bmN0aW9uIF9yZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCBmdW5jdGlvbiBfcmVqZWN0KGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoJ29ubG9hZGVuZCcgaW4gcmVxdWVzdCkge1xuICAgICAgLy8gVXNlIG9ubG9hZGVuZCBpZiBhdmFpbGFibGVcbiAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gb25sb2FkZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlIHRvIGVtdWxhdGUgb25sb2FkZW5kXG4gICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZHlzdGF0ZSBoYW5kbGVyIGlzIGNhbGxpbmcgYmVmb3JlIG9uZXJyb3Igb3Igb250aW1lb3V0IGhhbmRsZXJzLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgY2FsbCBvbmxvYWRlbmQgb24gdGhlIG5leHQgJ3RpY2snXG4gICAgICAgIHNldFRpbWVvdXQob25sb2FkZW5kKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCwgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICAvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdOZXR3b3JrIEVycm9yJywgQXhpb3NFcnJvci5FUlJfTkVUV09SSywgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIGxldCB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0ID8gJ3RpbWVvdXQgb2YgJyArIF9jb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcgOiAndGltZW91dCBleGNlZWRlZCc7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBfY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgIGlmIChfY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdHJhbnNpdGlvbmFsLmNsYXJpZnlUaW1lb3V0RXJyb3IgPyBBeGlvc0Vycm9yLkVUSU1FRE9VVCA6IEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICByZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkICYmIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKG51bGwpO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzLmZvckVhY2gocmVxdWVzdEhlYWRlcnMudG9KU09OKCksIGZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXIodmFsLCBrZXkpIHtcbiAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRoQ3JlZGVudGlhbHMgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKF9jb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSAhIV9jb25maWcud2l0aENyZWRlbnRpYWxzO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAocmVzcG9uc2VUeXBlICYmIHJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSB7XG4gICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IF9jb25maWcucmVzcG9uc2VUeXBlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwcm9ncmVzcyBpZiBuZWVkZWRcbiAgICBpZiAob25Eb3dubG9hZFByb2dyZXNzKSB7XG4gICAgICAoW2Rvd25sb2FkVGhyb3R0bGVkLCBmbHVzaERvd25sb2FkXSA9IHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uRG93bmxvYWRQcm9ncmVzcywgdHJ1ZSkpO1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGRvd25sb2FkVGhyb3R0bGVkKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdXBsb2FkIGV2ZW50c1xuICAgIGlmIChvblVwbG9hZFByb2dyZXNzICYmIHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICAoW3VwbG9hZFRocm90dGxlZCwgZmx1c2hVcGxvYWRdID0gcHJvZ3Jlc3NFdmVudFJlZHVjZXIob25VcGxvYWRQcm9ncmVzcykpO1xuXG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHVwbG9hZFRocm90dGxlZCk7XG5cbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlbmQnLCBmbHVzaFVwbG9hZCk7XG4gICAgfVxuXG4gICAgaWYgKF9jb25maWcuY2FuY2VsVG9rZW4gfHwgX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICBvbkNhbmNlbGVkID0gY2FuY2VsID0+IHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCghY2FuY2VsIHx8IGNhbmNlbC50eXBlID8gbmV3IENhbmNlbGVkRXJyb3IobnVsbCwgY29uZmlnLCByZXF1ZXN0KSA6IGNhbmNlbCk7XG4gICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICB9O1xuXG4gICAgICBfY29uZmlnLmNhbmNlbFRva2VuICYmIF9jb25maWcuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuICAgICAgaWYgKF9jb25maWcuc2lnbmFsKSB7XG4gICAgICAgIF9jb25maWcuc2lnbmFsLmFib3J0ZWQgPyBvbkNhbmNlbGVkKCkgOiBfY29uZmlnLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb3RvY29sID0gcGFyc2VQcm90b2NvbChfY29uZmlnLnVybCk7XG5cbiAgICBpZiAocHJvdG9jb2wgJiYgcGxhdGZvcm0ucHJvdG9jb2xzLmluZGV4T2YocHJvdG9jb2wpID09PSAtMSkge1xuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdVbnN1cHBvcnRlZCBwcm90b2NvbCAnICsgcHJvdG9jb2wgKyAnOicsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBjb25maWcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICByZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEgfHwgbnVsbCk7XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgYmluZCBmcm9tICcuL2hlbHBlcnMvYmluZC5qcyc7XG5pbXBvcnQgQXhpb3MgZnJvbSAnLi9jb3JlL0F4aW9zLmpzJztcbmltcG9ydCBtZXJnZUNvbmZpZyBmcm9tICcuL2NvcmUvbWVyZ2VDb25maWcuanMnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IGZvcm1EYXRhVG9KU09OIGZyb20gJy4vaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyc7XG5pbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tICcuL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzJztcbmltcG9ydCBDYW5jZWxUb2tlbiBmcm9tICcuL2NhbmNlbC9DYW5jZWxUb2tlbi5qcyc7XG5pbXBvcnQgaXNDYW5jZWwgZnJvbSAnLi9jYW5jZWwvaXNDYW5jZWwuanMnO1xuaW1wb3J0IHtWRVJTSU9OfSBmcm9tICcuL2Vudi9kYXRhLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vaGVscGVycy90b0Zvcm1EYXRhLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCBzcHJlYWQgZnJvbSAnLi9oZWxwZXJzL3NwcmVhZC5qcyc7XG5pbXBvcnQgaXNBeGlvc0Vycm9yIGZyb20gJy4vaGVscGVycy9pc0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi9jb3JlL0F4aW9zSGVhZGVycy5qc1wiO1xuaW1wb3J0IGFkYXB0ZXJzIGZyb20gJy4vYWRhcHRlcnMvYWRhcHRlcnMuanMnO1xuaW1wb3J0IEh0dHBTdGF0dXNDb2RlIGZyb20gJy4vaGVscGVycy9IdHRwU3RhdHVzQ29kZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJucyB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcbiAgY29uc3QgY29udGV4dCA9IG5ldyBBeGlvcyhkZWZhdWx0Q29uZmlnKTtcbiAgY29uc3QgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGF4aW9zLnByb3RvdHlwZSB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCwge2FsbE93bktleXM6IHRydWV9KTtcblxuICAvLyBDb3B5IGNvbnRleHQgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0LCBudWxsLCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbiAgaW5zdGFuY2UuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUluc3RhbmNlKG1lcmdlQ29uZmlnKGRlZmF1bHRDb25maWcsIGluc3RhbmNlQ29uZmlnKSk7XG4gIH07XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG4vLyBDcmVhdGUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgdG8gYmUgZXhwb3J0ZWRcbmNvbnN0IGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEV4cG9zZSBDYW5jZWwgJiBDYW5jZWxUb2tlblxuYXhpb3MuQ2FuY2VsZWRFcnJvciA9IENhbmNlbGVkRXJyb3I7XG5heGlvcy5DYW5jZWxUb2tlbiA9IENhbmNlbFRva2VuO1xuYXhpb3MuaXNDYW5jZWwgPSBpc0NhbmNlbDtcbmF4aW9zLlZFUlNJT04gPSBWRVJTSU9OO1xuYXhpb3MudG9Gb3JtRGF0YSA9IHRvRm9ybURhdGE7XG5cbi8vIEV4cG9zZSBBeGlvc0Vycm9yIGNsYXNzXG5heGlvcy5BeGlvc0Vycm9yID0gQXhpb3NFcnJvcjtcblxuLy8gYWxpYXMgZm9yIENhbmNlbGVkRXJyb3IgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmF4aW9zLkNhbmNlbCA9IGF4aW9zLkNhbmNlbGVkRXJyb3I7XG5cbi8vIEV4cG9zZSBhbGwvc3ByZWFkXG5heGlvcy5hbGwgPSBmdW5jdGlvbiBhbGwocHJvbWlzZXMpIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbn07XG5cbmF4aW9zLnNwcmVhZCA9IHNwcmVhZDtcblxuLy8gRXhwb3NlIGlzQXhpb3NFcnJvclxuYXhpb3MuaXNBeGlvc0Vycm9yID0gaXNBeGlvc0Vycm9yO1xuXG4vLyBFeHBvc2UgbWVyZ2VDb25maWdcbmF4aW9zLm1lcmdlQ29uZmlnID0gbWVyZ2VDb25maWc7XG5cbmF4aW9zLkF4aW9zSGVhZGVycyA9IEF4aW9zSGVhZGVycztcblxuYXhpb3MuZm9ybVRvSlNPTiA9IHRoaW5nID0+IGZvcm1EYXRhVG9KU09OKHV0aWxzLmlzSFRNTEZvcm0odGhpbmcpID8gbmV3IEZvcm1EYXRhKHRoaW5nKSA6IHRoaW5nKTtcblxuYXhpb3MuZ2V0QWRhcHRlciA9IGFkYXB0ZXJzLmdldEFkYXB0ZXI7XG5cbmF4aW9zLkh0dHBTdGF0dXNDb2RlID0gSHR0cFN0YXR1c0NvZGU7XG5cbmF4aW9zLmRlZmF1bHQgPSBheGlvcztcblxuLy8gdGhpcyBtb2R1bGUgc2hvdWxkIG9ubHkgaGF2ZSBhIGRlZmF1bHQgZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBheGlvc1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQ2FuY2VsZWRFcnJvciBmcm9tICcuL0NhbmNlbGVkRXJyb3IuanMnO1xuXG4vKipcbiAqIEEgYENhbmNlbFRva2VuYCBpcyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiBhbiBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtDYW5jZWxUb2tlbn1cbiAqL1xuY2xhc3MgQ2FuY2VsVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihleGVjdXRvcikge1xuICAgIGlmICh0eXBlb2YgZXhlY3V0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzb2x2ZVByb21pc2U7XG5cbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlRXhlY3V0b3IocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdG9rZW4gPSB0aGlzO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICB0aGlzLnByb21pc2UudGhlbihjYW5jZWwgPT4ge1xuICAgICAgaWYgKCF0b2tlbi5fbGlzdGVuZXJzKSByZXR1cm47XG5cbiAgICAgIGxldCBpID0gdG9rZW4uX2xpc3RlbmVycy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgIHRva2VuLl9saXN0ZW5lcnNbaV0oY2FuY2VsKTtcbiAgICAgIH1cbiAgICAgIHRva2VuLl9saXN0ZW5lcnMgPSBudWxsO1xuICAgIH0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICB0aGlzLnByb21pc2UudGhlbiA9IG9uZnVsZmlsbGVkID0+IHtcbiAgICAgIGxldCBfcmVzb2x2ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHRva2VuLnN1YnNjcmliZShyZXNvbHZlKTtcbiAgICAgICAgX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgfSkudGhlbihvbmZ1bGZpbGxlZCk7XG5cbiAgICAgIHByb21pc2UuY2FuY2VsID0gZnVuY3Rpb24gcmVqZWN0KCkge1xuICAgICAgICB0b2tlbi51bnN1YnNjcmliZShfcmVzb2x2ZSk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgZXhlY3V0b3IoZnVuY3Rpb24gY2FuY2VsKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCkge1xuICAgICAgaWYgKHRva2VuLnJlYXNvbikge1xuICAgICAgICAvLyBDYW5jZWxsYXRpb24gaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0b2tlbi5yZWFzb24gPSBuZXcgQ2FuY2VsZWRFcnJvcihtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpO1xuICAgICAgcmVzb2x2ZVByb21pc2UodG9rZW4ucmVhc29uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYSBgQ2FuY2VsZWRFcnJvcmAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAgICovXG4gIHRocm93SWZSZXF1ZXN0ZWQoKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICB0aHJvdyB0aGlzLnJlYXNvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0aGlzLnJlYXNvbikge1xuICAgICAgbGlzdGVuZXIodGhpcy5yZWFzb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW2xpc3RlbmVyXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmUgZnJvbSB0aGUgY2FuY2VsIHNpZ25hbFxuICAgKi9cblxuICB1bnN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2xpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXG4gICAqIGNhbmNlbHMgdGhlIGBDYW5jZWxUb2tlbmAuXG4gICAqL1xuICBzdGF0aWMgc291cmNlKCkge1xuICAgIGxldCBjYW5jZWw7XG4gICAgY29uc3QgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oZnVuY3Rpb24gZXhlY3V0b3IoYykge1xuICAgICAgY2FuY2VsID0gYztcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW4sXG4gICAgICBjYW5jZWxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENhbmNlbFRva2VuO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBBIGBDYW5jZWxlZEVycm9yYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gcmVxdWVzdCBUaGUgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsZWRFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBBeGlvc0Vycm9yLmNhbGwodGhpcywgbWVzc2FnZSA9PSBudWxsID8gJ2NhbmNlbGVkJyA6IG1lc3NhZ2UsIEF4aW9zRXJyb3IuRVJSX0NBTkNFTEVELCBjb25maWcsIHJlcXVlc3QpO1xuICB0aGlzLm5hbWUgPSAnQ2FuY2VsZWRFcnJvcic7XG59XG5cbnV0aWxzLmluaGVyaXRzKENhbmNlbGVkRXJyb3IsIEF4aW9zRXJyb3IsIHtcbiAgX19DQU5DRUxfXzogdHJ1ZVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IENhbmNlbGVkRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQ2FuY2VsKHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5fX0NBTkNFTF9fKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IGJ1aWxkVVJMIGZyb20gJy4uL2hlbHBlcnMvYnVpbGRVUkwuanMnO1xuaW1wb3J0IEludGVyY2VwdG9yTWFuYWdlciBmcm9tICcuL0ludGVyY2VwdG9yTWFuYWdlci5qcyc7XG5pbXBvcnQgZGlzcGF0Y2hSZXF1ZXN0IGZyb20gJy4vZGlzcGF0Y2hSZXF1ZXN0LmpzJztcbmltcG9ydCBtZXJnZUNvbmZpZyBmcm9tICcuL21lcmdlQ29uZmlnLmpzJztcbmltcG9ydCBidWlsZEZ1bGxQYXRoIGZyb20gJy4vYnVpbGRGdWxsUGF0aC5qcyc7XG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJy4uL2hlbHBlcnMvdmFsaWRhdG9yLmpzJztcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSAnLi9BeGlvc0hlYWRlcnMuanMnO1xuXG5jb25zdCB2YWxpZGF0b3JzID0gdmFsaWRhdG9yLnZhbGlkYXRvcnM7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlQ29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmNsYXNzIEF4aW9zIHtcbiAgY29uc3RydWN0b3IoaW5zdGFuY2VDb25maWcpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMgPSB7XG4gICAgICByZXF1ZXN0OiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKCksXG4gICAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIHJlcXVlc3RcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBjb25maWdPclVybCBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gICAqIEBwYXJhbSB7P09iamVjdH0gY29uZmlnXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAgICovXG4gIGFzeW5jIHJlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBsZXQgZHVtbXk7XG5cbiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShkdW1teSA9IHt9KSA6IChkdW1teSA9IG5ldyBFcnJvcigpKTtcblxuICAgICAgICAvLyBzbGljZSBvZmYgdGhlIEVycm9yOiAuLi4gbGluZVxuICAgICAgICBjb25zdCBzdGFjayA9IGR1bW15LnN0YWNrID8gZHVtbXkuc3RhY2sucmVwbGFjZSgvXi4rXFxuLywgJycpIDogJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFlcnIuc3RhY2spIHtcbiAgICAgICAgICAgIGVyci5zdGFjayA9IHN0YWNrO1xuICAgICAgICAgICAgLy8gbWF0Y2ggd2l0aG91dCB0aGUgMiB0b3Agc3RhY2sgbGluZXNcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrICYmICFTdHJpbmcoZXJyLnN0YWNrKS5lbmRzV2l0aChzdGFjay5yZXBsYWNlKC9eLitcXG4uK1xcbi8sICcnKSkpIHtcbiAgICAgICAgICAgIGVyci5zdGFjayArPSAnXFxuJyArIHN0YWNrXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gaWdub3JlIHRoZSBjYXNlIHdoZXJlIFwic3RhY2tcIiBpcyBhbiB1bi13cml0YWJsZSBwcm9wZXJ0eVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBfcmVxdWVzdChjb25maWdPclVybCwgY29uZmlnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgLy8gQWxsb3cgZm9yIGF4aW9zKCdleGFtcGxlL3VybCdbLCBjb25maWddKSBhIGxhIGZldGNoIEFQSVxuICAgIGlmICh0eXBlb2YgY29uZmlnT3JVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25maWcgPSBjb25maWcgfHwge307XG4gICAgICBjb25maWcudXJsID0gY29uZmlnT3JVcmw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZ09yVXJsIHx8IHt9O1xuICAgIH1cblxuICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XG5cbiAgICBjb25zdCB7dHJhbnNpdGlvbmFsLCBwYXJhbXNTZXJpYWxpemVyLCBoZWFkZXJzfSA9IGNvbmZpZztcblxuICAgIGlmICh0cmFuc2l0aW9uYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnModHJhbnNpdGlvbmFsLCB7XG4gICAgICAgIHNpbGVudEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICBmb3JjZWRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgY2xhcmlmeVRpbWVvdXRFcnJvcjogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKVxuICAgICAgfSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXNTZXJpYWxpemVyICE9IG51bGwpIHtcbiAgICAgIGlmICh1dGlscy5pc0Z1bmN0aW9uKHBhcmFtc1NlcmlhbGl6ZXIpKSB7XG4gICAgICAgIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyID0ge1xuICAgICAgICAgIHNlcmlhbGl6ZTogcGFyYW1zU2VyaWFsaXplclxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyhwYXJhbXNTZXJpYWxpemVyLCB7XG4gICAgICAgICAgZW5jb2RlOiB2YWxpZGF0b3JzLmZ1bmN0aW9uLFxuICAgICAgICAgIHNlcmlhbGl6ZTogdmFsaWRhdG9ycy5mdW5jdGlvblxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICAgIGNvbmZpZy5tZXRob2QgPSAoY29uZmlnLm1ldGhvZCB8fCB0aGlzLmRlZmF1bHRzLm1ldGhvZCB8fCAnZ2V0JykudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICAgIGxldCBjb250ZXh0SGVhZGVycyA9IGhlYWRlcnMgJiYgdXRpbHMubWVyZ2UoXG4gICAgICBoZWFkZXJzLmNvbW1vbixcbiAgICAgIGhlYWRlcnNbY29uZmlnLm1ldGhvZF1cbiAgICApO1xuXG4gICAgaGVhZGVycyAmJiB1dGlscy5mb3JFYWNoKFxuICAgICAgWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnY29tbW9uJ10sXG4gICAgICAobWV0aG9kKSA9PiB7XG4gICAgICAgIGRlbGV0ZSBoZWFkZXJzW21ldGhvZF07XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbmZpZy5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmNvbmNhdChjb250ZXh0SGVhZGVycywgaGVhZGVycyk7XG5cbiAgICAvLyBmaWx0ZXIgb3V0IHNraXBwZWQgaW50ZXJjZXB0b3JzXG4gICAgY29uc3QgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgICBsZXQgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gdHJ1ZTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24gdW5zaGlmdFJlcXVlc3RJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IucnVuV2hlbiA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnRlcmNlcHRvci5ydW5XaGVuKGNvbmZpZykgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9yLnN5bmNocm9ub3VzO1xuXG4gICAgICByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgbGV0IHByb21pc2U7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW47XG5cbiAgICBpZiAoIXN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycykge1xuICAgICAgY29uc3QgY2hhaW4gPSBbZGlzcGF0Y2hSZXF1ZXN0LmJpbmQodGhpcyksIHVuZGVmaW5lZF07XG4gICAgICBjaGFpbi51bnNoaWZ0LmFwcGx5KGNoYWluLCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBjaGFpbi5wdXNoLmFwcGx5KGNoYWluLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4pO1xuICAgICAgbGVuID0gY2hhaW4ubGVuZ3RoO1xuXG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oY2hhaW5baSsrXSwgY2hhaW5baSsrXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIGxlbiA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIGxldCBuZXdDb25maWcgPSBjb25maWc7XG5cbiAgICBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBjb25zdCBvbkZ1bGZpbGxlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICBjb25zdCBvblJlamVjdGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ld0NvbmZpZyA9IG9uRnVsZmlsbGVkKG5ld0NvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvblJlamVjdGVkLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcHJvbWlzZSA9IGRpc3BhdGNoUmVxdWVzdC5jYWxsKHRoaXMsIG5ld0NvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuXG4gICAgaSA9IDA7XG4gICAgbGVuID0gcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBnZXRVcmkoY29uZmlnKSB7XG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwpO1xuICAgIHJldHVybiBidWlsZFVSTChmdWxsUGF0aCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpO1xuICB9XG59XG5cbi8vIFByb3ZpZGUgYWxpYXNlcyBmb3Igc3VwcG9ydGVkIHJlcXVlc3QgbWV0aG9kc1xudXRpbHMuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdvcHRpb25zJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgZGF0YTogKGNvbmZpZyB8fCB7fSkuZGF0YVxuICAgIH0pKTtcbiAgfTtcbn0pO1xuXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlSFRUUE1ldGhvZChpc0Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaHR0cE1ldGhvZCh1cmwsIGRhdGEsIGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBpc0Zvcm0gPyB7XG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJ1xuICAgICAgICB9IDoge30sXG4gICAgICAgIHVybCxcbiAgICAgICAgZGF0YVxuICAgICAgfSkpO1xuICAgIH07XG4gIH1cblxuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGdlbmVyYXRlSFRUUE1ldGhvZCgpO1xuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2QgKyAnRm9ybSddID0gZ2VuZXJhdGVIVFRQTWV0aG9kKHRydWUpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEF4aW9zO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBFcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSwgY29uZmlnLCBlcnJvciBjb2RlLCByZXF1ZXN0IGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV0gVGhlIGVycm9yIGNvZGUgKGZvciBleGFtcGxlLCAnRUNPTk5BQk9SVEVEJykuXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbmZpZ10gVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge0Vycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gQXhpb3NFcnJvcihtZXNzYWdlLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gIEVycm9yLmNhbGwodGhpcyk7XG5cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gIH1cblxuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLm5hbWUgPSAnQXhpb3NFcnJvcic7XG4gIGNvZGUgJiYgKHRoaXMuY29kZSA9IGNvZGUpO1xuICBjb25maWcgJiYgKHRoaXMuY29uZmlnID0gY29uZmlnKTtcbiAgcmVxdWVzdCAmJiAodGhpcy5yZXF1ZXN0ID0gcmVxdWVzdCk7XG4gIGlmIChyZXNwb25zZSkge1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0aGlzLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cyA/IHJlc3BvbnNlLnN0YXR1cyA6IG51bGw7XG4gIH1cbn1cblxudXRpbHMuaW5oZXJpdHMoQXhpb3NFcnJvciwgRXJyb3IsIHtcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdXRpbHMudG9KU09OT2JqZWN0KHRoaXMuY29uZmlnKSxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXNcbiAgICB9O1xuICB9XG59KTtcblxuY29uc3QgcHJvdG90eXBlID0gQXhpb3NFcnJvci5wcm90b3R5cGU7XG5jb25zdCBkZXNjcmlwdG9ycyA9IHt9O1xuXG5bXG4gICdFUlJfQkFEX09QVElPTl9WQUxVRScsXG4gICdFUlJfQkFEX09QVElPTicsXG4gICdFQ09OTkFCT1JURUQnLFxuICAnRVRJTUVET1VUJyxcbiAgJ0VSUl9ORVRXT1JLJyxcbiAgJ0VSUl9GUl9UT09fTUFOWV9SRURJUkVDVFMnLFxuICAnRVJSX0RFUFJFQ0FURUQnLFxuICAnRVJSX0JBRF9SRVNQT05TRScsXG4gICdFUlJfQkFEX1JFUVVFU1QnLFxuICAnRVJSX0NBTkNFTEVEJyxcbiAgJ0VSUl9OT1RfU1VQUE9SVCcsXG4gICdFUlJfSU5WQUxJRF9VUkwnXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuXS5mb3JFYWNoKGNvZGUgPT4ge1xuICBkZXNjcmlwdG9yc1tjb2RlXSA9IHt2YWx1ZTogY29kZX07XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXhpb3NFcnJvciwgZGVzY3JpcHRvcnMpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgJ2lzQXhpb3NFcnJvcicsIHt2YWx1ZTogdHJ1ZX0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuQXhpb3NFcnJvci5mcm9tID0gKGVycm9yLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlLCBjdXN0b21Qcm9wcykgPT4ge1xuICBjb25zdCBheGlvc0Vycm9yID0gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpO1xuXG4gIHV0aWxzLnRvRmxhdE9iamVjdChlcnJvciwgYXhpb3NFcnJvciwgZnVuY3Rpb24gZmlsdGVyKG9iaikge1xuICAgIHJldHVybiBvYmogIT09IEVycm9yLnByb3RvdHlwZTtcbiAgfSwgcHJvcCA9PiB7XG4gICAgcmV0dXJuIHByb3AgIT09ICdpc0F4aW9zRXJyb3InO1xuICB9KTtcblxuICBBeGlvc0Vycm9yLmNhbGwoYXhpb3NFcnJvciwgZXJyb3IubWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSk7XG5cbiAgYXhpb3NFcnJvci5jYXVzZSA9IGVycm9yO1xuXG4gIGF4aW9zRXJyb3IubmFtZSA9IGVycm9yLm5hbWU7XG5cbiAgY3VzdG9tUHJvcHMgJiYgT2JqZWN0LmFzc2lnbihheGlvc0Vycm9yLCBjdXN0b21Qcm9wcyk7XG5cbiAgcmV0dXJuIGF4aW9zRXJyb3I7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc0Vycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IHBhcnNlSGVhZGVycyBmcm9tICcuLi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyc7XG5cbmNvbnN0ICRpbnRlcm5hbHMgPSBTeW1ib2woJ2ludGVybmFscycpO1xuXG5mdW5jdGlvbiBub3JtYWxpemVIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIgJiYgU3RyaW5nKGhlYWRlcikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1dGlscy5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWYWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRva2VucyhzdHIpIHtcbiAgY29uc3QgdG9rZW5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3QgdG9rZW5zUkUgPSAvKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nO1xuICBsZXQgbWF0Y2g7XG5cbiAgd2hpbGUgKChtYXRjaCA9IHRva2Vuc1JFLmV4ZWMoc3RyKSkpIHtcbiAgICB0b2tlbnNbbWF0Y2hbMV1dID0gbWF0Y2hbMl07XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5jb25zdCBpc1ZhbGlkSGVhZGVyTmFtZSA9IChzdHIpID0+IC9eWy1fYS16QS1aMC05XmB8fiwhIyQlJicqKy5dKyQvLnRlc3Qoc3RyLnRyaW0oKSk7XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVyVmFsdWUoY29udGV4dCwgdmFsdWUsIGhlYWRlciwgZmlsdGVyLCBpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgaWYgKHV0aWxzLmlzRnVuY3Rpb24oZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLCB2YWx1ZSwgaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgICB2YWx1ZSA9IGhlYWRlcjtcbiAgfVxuXG4gIGlmICghdXRpbHMuaXNTdHJpbmcodmFsdWUpKSByZXR1cm47XG5cbiAgaWYgKHV0aWxzLmlzU3RyaW5nKGZpbHRlcikpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihmaWx0ZXIpICE9PSAtMTtcbiAgfVxuXG4gIGlmICh1dGlscy5pc1JlZ0V4cChmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci50ZXN0KHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCAodywgY2hhciwgc3RyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhci50b1VwcGVyQ2FzZSgpICsgc3RyO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEFjY2Vzc29ycyhvYmosIGhlYWRlcikge1xuICBjb25zdCBhY2Nlc3Nvck5hbWUgPSB1dGlscy50b0NhbWVsQ2FzZSgnICcgKyBoZWFkZXIpO1xuXG4gIFsnZ2V0JywgJ3NldCcsICdoYXMnXS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZE5hbWUgKyBhY2Nlc3Nvck5hbWUsIHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICAgIHJldHVybiB0aGlzW21ldGhvZE5hbWVdLmNhbGwodGhpcywgaGVhZGVyLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNsYXNzIEF4aW9zSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yKGhlYWRlcnMpIHtcbiAgICBoZWFkZXJzICYmIHRoaXMuc2V0KGhlYWRlcnMpO1xuICB9XG5cbiAgc2V0KGhlYWRlciwgdmFsdWVPclJld3JpdGUsIHJld3JpdGUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWxIZWFkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZWFkZXIgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHNlbGYsIGxIZWFkZXIpO1xuXG4gICAgICBpZigha2V5IHx8IHNlbGZba2V5XSA9PT0gdW5kZWZpbmVkIHx8IF9yZXdyaXRlID09PSB0cnVlIHx8IChfcmV3cml0ZSA9PT0gdW5kZWZpbmVkICYmIHNlbGZba2V5XSAhPT0gZmFsc2UpKSB7XG4gICAgICAgIHNlbGZba2V5IHx8IF9oZWFkZXJdID0gbm9ybWFsaXplVmFsdWUoX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZXRIZWFkZXJzID0gKGhlYWRlcnMsIF9yZXdyaXRlKSA9PlxuICAgICAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCAoX3ZhbHVlLCBfaGVhZGVyKSA9PiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkpO1xuXG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QoaGVhZGVyKSB8fCBoZWFkZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzZXRIZWFkZXJzKGhlYWRlciwgdmFsdWVPclJld3JpdGUpXG4gICAgfSBlbHNlIGlmKHV0aWxzLmlzU3RyaW5nKGhlYWRlcikgJiYgKGhlYWRlciA9IGhlYWRlci50cmltKCkpICYmICFpc1ZhbGlkSGVhZGVyTmFtZShoZWFkZXIpKSB7XG4gICAgICBzZXRIZWFkZXJzKHBhcnNlSGVhZGVycyhoZWFkZXIpLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0hlYWRlcnMoaGVhZGVyKSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaGVhZGVyLmVudHJpZXMoKSkge1xuICAgICAgICBzZXRIZWFkZXIodmFsdWUsIGtleSwgcmV3cml0ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlciAhPSBudWxsICYmIHNldEhlYWRlcih2YWx1ZU9yUmV3cml0ZSwgaGVhZGVyLCByZXdyaXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldChoZWFkZXIsIHBhcnNlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgIGlmICghcGFyc2VyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZVRva2Vucyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5jYWxsKHRoaXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzUmVnRXhwKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmV4ZWModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYXMoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIHJldHVybiAhIShrZXkgJiYgdGhpc1trZXldICE9PSB1bmRlZmluZWQgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGVsZXRlKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBkZWxldGVIZWFkZXIoX2hlYWRlcikge1xuICAgICAgX2hlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKF9oZWFkZXIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleShzZWxmLCBfaGVhZGVyKTtcblxuICAgICAgICBpZiAoa2V5ICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHNlbGYsIHNlbGZba2V5XSwga2V5LCBtYXRjaGVyKSkpIHtcbiAgICAgICAgICBkZWxldGUgc2VsZltrZXldO1xuXG4gICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheShoZWFkZXIpKSB7XG4gICAgICBoZWFkZXIuZm9yRWFjaChkZWxldGVIZWFkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGVIZWFkZXIoaGVhZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGNsZWFyKG1hdGNoZXIpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gICAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIsIHRydWUpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgbm9ybWFsaXplKGZvcm1hdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcblxuICAgIHV0aWxzLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkoaGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBzZWxmW2tleV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZvcm1hdCA/IGZvcm1hdEhlYWRlcihoZWFkZXIpIDogU3RyaW5nKGhlYWRlcikudHJpbSgpO1xuXG4gICAgICBpZiAobm9ybWFsaXplZCAhPT0gaGVhZGVyKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICB9XG5cbiAgICAgIHNlbGZbbm9ybWFsaXplZF0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZF0gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb25jYXQoLi4udGFyZ2V0cykge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLCAuLi50YXJnZXRzKTtcbiAgfVxuXG4gIHRvSlNPTihhc1N0cmluZ3MpIHtcbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgKG9ialtoZWFkZXJdID0gYXNTdHJpbmdzICYmIHV0aWxzLmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbignLCAnKSA6IHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpLm1hcCgoW2hlYWRlciwgdmFsdWVdKSA9PiBoZWFkZXIgKyAnOiAnICsgdmFsdWUpLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQXhpb3NIZWFkZXJzJztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nIGluc3RhbmNlb2YgdGhpcyA/IHRoaW5nIDogbmV3IHRoaXModGhpbmcpO1xuICB9XG5cbiAgc3RhdGljIGNvbmNhdChmaXJzdCwgLi4udGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbXB1dGVkID0gbmV3IHRoaXMoZmlyc3QpO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IGNvbXB1dGVkLnNldCh0YXJnZXQpKTtcblxuICAgIHJldHVybiBjb21wdXRlZDtcbiAgfVxuXG4gIHN0YXRpYyBhY2Nlc3NvcihoZWFkZXIpIHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSB0aGlzWyRpbnRlcm5hbHNdID0gKHRoaXNbJGludGVybmFsc10gPSB7XG4gICAgICBhY2Nlc3NvcnM6IHt9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2Nlc3NvcnMgPSBpbnRlcm5hbHMuYWNjZXNzb3JzO1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuXG4gICAgZnVuY3Rpb24gZGVmaW5lQWNjZXNzb3IoX2hlYWRlcikge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFhY2Nlc3NvcnNbbEhlYWRlcl0pIHtcbiAgICAgICAgYnVpbGRBY2Nlc3NvcnMocHJvdG90eXBlLCBfaGVhZGVyKTtcbiAgICAgICAgYWNjZXNzb3JzW2xIZWFkZXJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1dGlscy5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXIuZm9yRWFjaChkZWZpbmVBY2Nlc3NvcikgOiBkZWZpbmVBY2Nlc3NvcihoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuQXhpb3NIZWFkZXJzLmFjY2Vzc29yKFsnQ29udGVudC1UeXBlJywgJ0NvbnRlbnQtTGVuZ3RoJywgJ0FjY2VwdCcsICdBY2NlcHQtRW5jb2RpbmcnLCAnVXNlci1BZ2VudCcsICdBdXRob3JpemF0aW9uJ10pO1xuXG4vLyByZXNlcnZlZCBuYW1lcyBob3RmaXhcbnV0aWxzLnJlZHVjZURlc2NyaXB0b3JzKEF4aW9zSGVhZGVycy5wcm90b3R5cGUsICh7dmFsdWV9LCBrZXkpID0+IHtcbiAgbGV0IG1hcHBlZCA9IGtleVswXS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpOyAvLyBtYXAgYHNldGAgPT4gYFNldGBcbiAgcmV0dXJuIHtcbiAgICBnZXQ6ICgpID0+IHZhbHVlLFxuICAgIHNldChoZWFkZXJWYWx1ZSkge1xuICAgICAgdGhpc1ttYXBwZWRdID0gaGVhZGVyVmFsdWU7XG4gICAgfVxuICB9XG59KTtcblxudXRpbHMuZnJlZXplTWV0aG9kcyhBeGlvc0hlYWRlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc0hlYWRlcnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuY2xhc3MgSW50ZXJjZXB0b3JNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBpbnRlcmNlcHRvciB0byB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGByZWplY3RgIGZvciBhIGBQcm9taXNlYFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gICAqL1xuICB1c2UoZnVsZmlsbGVkLCByZWplY3RlZCwgb3B0aW9ucykge1xuICAgIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgICBmdWxmaWxsZWQsXG4gICAgICByZWplY3RlZCxcbiAgICAgIHN5bmNocm9ub3VzOiBvcHRpb25zID8gb3B0aW9ucy5zeW5jaHJvbm91cyA6IGZhbHNlLFxuICAgICAgcnVuV2hlbjogb3B0aW9ucyA/IG9wdGlvbnMucnVuV2hlbiA6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gICAqXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGludGVyY2VwdG9yIHdhcyByZW1vdmVkLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgZWplY3QoaWQpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGludGVyY2VwdG9ycyBmcm9tIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gICAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZvckVhY2goZm4pIHtcbiAgICB1dGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIGZvckVhY2hIYW5kbGVyKGgpIHtcbiAgICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICAgIGZuKGgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEludGVyY2VwdG9yTWFuYWdlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGlzQWJzb2x1dGVVUkwgZnJvbSAnLi4vaGVscGVycy9pc0Fic29sdXRlVVJMLmpzJztcbmltcG9ydCBjb21iaW5lVVJMcyBmcm9tICcuLi9oZWxwZXJzL2NvbWJpbmVVUkxzLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIGJhc2VVUkwgd2l0aCB0aGUgcmVxdWVzdGVkVVJMLFxuICogb25seSB3aGVuIHRoZSByZXF1ZXN0ZWRVUkwgaXMgbm90IGFscmVhZHkgYW4gYWJzb2x1dGUgVVJMLlxuICogSWYgdGhlIHJlcXVlc3RVUkwgaXMgYWJzb2x1dGUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWVzdGVkVVJMIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXF1ZXN0ZWRVUkwgQWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGNvbWJpbmVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgZnVsbCBwYXRoXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkRnVsbFBhdGgoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKSB7XG4gIGlmIChiYXNlVVJMICYmICFpc0Fic29sdXRlVVJMKHJlcXVlc3RlZFVSTCkpIHtcbiAgICByZXR1cm4gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdHJhbnNmb3JtRGF0YSBmcm9tICcuL3RyYW5zZm9ybURhdGEuanMnO1xuaW1wb3J0IGlzQ2FuY2VsIGZyb20gJy4uL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5pbXBvcnQgYWRhcHRlcnMgZnJvbSBcIi4uL2FkYXB0ZXJzL2FkYXB0ZXJzLmpzXCI7XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpIHtcbiAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgIGNvbmZpZy5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCk7XG4gIH1cblxuICBpZiAoY29uZmlnLnNpZ25hbCAmJiBjb25maWcuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWRhcHRlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShjb25maWcuaGVhZGVycyk7XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICBjb25maWcsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICBpZiAoWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLmluZGV4T2YoY29uZmlnLm1ldGhvZCkgIT09IC0xKSB7XG4gICAgY29uZmlnLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyKGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXIpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZVxuICAgICAgICApO1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuL0F4aW9zSGVhZGVycy5qc1wiO1xuXG5jb25zdCBoZWFkZXJzVG9PYmplY3QgPSAodGhpbmcpID0+IHRoaW5nIGluc3RhbmNlb2YgQXhpb3NIZWFkZXJzID8geyAuLi50aGluZyB9IDogdGhpbmc7XG5cbi8qKlxuICogQ29uZmlnLXNwZWNpZmljIG1lcmdlLWZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYSBuZXcgY29uZmlnLW9iamVjdFxuICogYnkgbWVyZ2luZyB0d28gY29uZmlndXJhdGlvbiBvYmplY3RzIHRvZ2V0aGVyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcxXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBvYmplY3QgcmVzdWx0aW5nIGZyb20gbWVyZ2luZyBjb25maWcyIHRvIGNvbmZpZzFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VDb25maWcoY29uZmlnMSwgY29uZmlnMikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgY29uZmlnMiA9IGNvbmZpZzIgfHwge307XG4gIGNvbnN0IGNvbmZpZyA9IHt9O1xuXG4gIGZ1bmN0aW9uIGdldE1lcmdlZFZhbHVlKHRhcmdldCwgc291cmNlLCBjYXNlbGVzcykge1xuICAgIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgdXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2UuY2FsbCh7Y2FzZWxlc3N9LCB0YXJnZXQsIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZSh7fSwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZS5zbGljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGVlcFByb3BlcnRpZXMoYSwgYiwgY2FzZWxlc3MpIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoYSwgYiwgY2FzZWxlc3MpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhLCBjYXNlbGVzcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBkZWZhdWx0VG9Db25maWcyKGEsIGIpIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9IGVsc2UgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChhKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGlyZWN0S2V5cyhhLCBiLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgaW4gY29uZmlnMikge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIpO1xuICAgIH0gZWxzZSBpZiAocHJvcCBpbiBjb25maWcxKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXJnZU1hcCA9IHtcbiAgICB1cmw6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgbWV0aG9kOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGRhdGE6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgYmFzZVVSTDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHBhcmFtc1NlcmlhbGl6ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0TWVzc2FnZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoQ3JlZGVudGlhbHM6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aFhTUkZUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBhZGFwdGVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlVHlwZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmQ29va2llTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmSGVhZGVyTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvblVwbG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBkZWNvbXByZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heENvbnRlbnRMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Qm9keUxlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBiZWZvcmVSZWRpcmVjdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc3BvcnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cEFnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBzQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgY2FuY2VsVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgc29ja2V0UGF0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZUVuY29kaW5nOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHZhbGlkYXRlU3RhdHVzOiBtZXJnZURpcmVjdEtleXMsXG4gICAgaGVhZGVyczogKGEsIGIpID0+IG1lcmdlRGVlcFByb3BlcnRpZXMoaGVhZGVyc1RvT2JqZWN0KGEpLCBoZWFkZXJzVG9PYmplY3QoYiksIHRydWUpXG4gIH07XG5cbiAgdXRpbHMuZm9yRWFjaChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCBjb25maWcxLCBjb25maWcyKSksIGZ1bmN0aW9uIGNvbXB1dGVDb25maWdWYWx1ZShwcm9wKSB7XG4gICAgY29uc3QgbWVyZ2UgPSBtZXJnZU1hcFtwcm9wXSB8fCBtZXJnZURlZXBQcm9wZXJ0aWVzO1xuICAgIGNvbnN0IGNvbmZpZ1ZhbHVlID0gbWVyZ2UoY29uZmlnMVtwcm9wXSwgY29uZmlnMltwcm9wXSwgcHJvcCk7XG4gICAgKHV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZ1ZhbHVlKSAmJiBtZXJnZSAhPT0gbWVyZ2VEaXJlY3RLZXlzKSB8fCAoY29uZmlnW3Byb3BdID0gY29uZmlnVmFsdWUpO1xuICB9KTtcblxuICByZXR1cm4gY29uZmlnO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuL0F4aW9zRXJyb3IuanMnO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpIHtcbiAgY29uc3QgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghcmVzcG9uc2Uuc3RhdHVzIHx8ICF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIFtBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFXVtNYXRoLmZsb29yKHJlc3BvbnNlLnN0YXR1cyAvIDEwMCkgLSA0XSxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIHJlc3BvbnNlLnJlcXVlc3QsXG4gICAgICByZXNwb25zZVxuICAgICkpO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHBhcmFtIHs/T2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0XG4gKlxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGZucywgcmVzcG9uc2UpIHtcbiAgY29uc3QgY29uZmlnID0gdGhpcyB8fCBkZWZhdWx0cztcbiAgY29uc3QgY29udGV4dCA9IHJlc3BvbnNlIHx8IGNvbmZpZztcbiAgY29uc3QgaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbnRleHQuaGVhZGVycyk7XG4gIGxldCBkYXRhID0gY29udGV4dC5kYXRhO1xuXG4gIHV0aWxzLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4uY2FsbChjb25maWcsIGRhdGEsIGhlYWRlcnMubm9ybWFsaXplKCksIHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaGVhZGVycy5ub3JtYWxpemUoKTtcblxuICByZXR1cm4gZGF0YTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgdHJhbnNpdGlvbmFsRGVmYXVsdHMgZnJvbSAnLi90cmFuc2l0aW9uYWwuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi4vaGVscGVycy90b0Zvcm1EYXRhLmpzJztcbmltcG9ydCB0b1VSTEVuY29kZWRGb3JtIGZyb20gJy4uL2hlbHBlcnMvdG9VUkxFbmNvZGVkRm9ybS5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuaW1wb3J0IGZvcm1EYXRhVG9KU09OIGZyb20gJy4uL2hlbHBlcnMvZm9ybURhdGFUb0pTT04uanMnO1xuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nLCB0cmllcyB0byBwYXJzZSBpdCwgYW5kIGlmIGl0IGZhaWxzLCBpdCByZXR1cm5zIHRoZSBzdHJpbmdpZmllZCB2ZXJzaW9uXG4gKiBvZiB0aGUgaW5wdXRcbiAqXG4gKiBAcGFyYW0ge2FueX0gcmF3VmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgc3RyaW5naWZpZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJzZXIgLSBBIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIGEgc3RyaW5nIGludG8gYSBKYXZhU2NyaXB0IG9iamVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVuY29kZXIgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSB2YWx1ZSBhbmQgcmV0dXJucyBhIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHN0cmluZ2lmaWVkIHZlcnNpb24gb2YgdGhlIHJhd1ZhbHVlLlxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlTYWZlbHkocmF3VmFsdWUsIHBhcnNlciwgZW5jb2Rlcikge1xuICBpZiAodXRpbHMuaXNTdHJpbmcocmF3VmFsdWUpKSB7XG4gICAgdHJ5IHtcbiAgICAgIChwYXJzZXIgfHwgSlNPTi5wYXJzZSkocmF3VmFsdWUpO1xuICAgICAgcmV0dXJuIHV0aWxzLnRyaW0ocmF3VmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLm5hbWUgIT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGVuY29kZXIgfHwgSlNPTi5zdHJpbmdpZnkpKHJhd1ZhbHVlKTtcbn1cblxuY29uc3QgZGVmYXVsdHMgPSB7XG5cbiAgdHJhbnNpdGlvbmFsOiB0cmFuc2l0aW9uYWxEZWZhdWx0cyxcblxuICBhZGFwdGVyOiBbJ3hocicsICdodHRwJywgJ2ZldGNoJ10sXG5cbiAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlcXVlc3QoZGF0YSwgaGVhZGVycykge1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpIHx8ICcnO1xuICAgIGNvbnN0IGhhc0pTT05Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSA+IC0xO1xuICAgIGNvbnN0IGlzT2JqZWN0UGF5bG9hZCA9IHV0aWxzLmlzT2JqZWN0KGRhdGEpO1xuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCAmJiB1dGlscy5pc0hUTUxGb3JtKGRhdGEpKSB7XG4gICAgICBkYXRhID0gbmV3IEZvcm1EYXRhKGRhdGEpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRm9ybURhdGEgPSB1dGlscy5pc0Zvcm1EYXRhKGRhdGEpO1xuXG4gICAgaWYgKGlzRm9ybURhdGEpIHtcbiAgICAgIHJldHVybiBoYXNKU09OQ29udGVudFR5cGUgPyBKU09OLnN0cmluZ2lmeShmb3JtRGF0YVRvSlNPTihkYXRhKSkgOiBkYXRhO1xuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0J1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNTdHJlYW0oZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzRmlsZShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCbG9iKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhkYXRhKSkge1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnLCBmYWxzZSk7XG4gICAgICByZXR1cm4gZGF0YS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGxldCBpc0ZpbGVMaXN0O1xuXG4gICAgaWYgKGlzT2JqZWN0UGF5bG9hZCkge1xuICAgICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRvVVJMRW5jb2RlZEZvcm0oZGF0YSwgdGhpcy5mb3JtU2VyaWFsaXplcikudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChpc0ZpbGVMaXN0ID0gdXRpbHMuaXNGaWxlTGlzdChkYXRhKSkgfHwgY29udGVudFR5cGUuaW5kZXhPZignbXVsdGlwYXJ0L2Zvcm0tZGF0YScpID4gLTEpIHtcbiAgICAgICAgY29uc3QgX0Zvcm1EYXRhID0gdGhpcy5lbnYgJiYgdGhpcy5lbnYuRm9ybURhdGE7XG5cbiAgICAgICAgcmV0dXJuIHRvRm9ybURhdGEoXG4gICAgICAgICAgaXNGaWxlTGlzdCA/IHsnZmlsZXNbXSc6IGRhdGF9IDogZGF0YSxcbiAgICAgICAgICBfRm9ybURhdGEgJiYgbmV3IF9Gb3JtRGF0YSgpLFxuICAgICAgICAgIHRoaXMuZm9ybVNlcmlhbGl6ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkIHx8IGhhc0pTT05Db250ZW50VHlwZSApIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nLCBmYWxzZSk7XG4gICAgICByZXR1cm4gc3RyaW5naWZ5U2FmZWx5KGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKGRhdGEpIHtcbiAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSB0aGlzLnRyYW5zaXRpb25hbCB8fCBkZWZhdWx0cy50cmFuc2l0aW9uYWw7XG4gICAgY29uc3QgZm9yY2VkSlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLmZvcmNlZEpTT05QYXJzaW5nO1xuICAgIGNvbnN0IEpTT05SZXF1ZXN0ZWQgPSB0aGlzLnJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nO1xuXG4gICAgaWYgKHV0aWxzLmlzUmVzcG9uc2UoZGF0YSkgfHwgdXRpbHMuaXNSZWFkYWJsZVN0cmVhbShkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgdXRpbHMuaXNTdHJpbmcoZGF0YSkgJiYgKChmb3JjZWRKU09OUGFyc2luZyAmJiAhdGhpcy5yZXNwb25zZVR5cGUpIHx8IEpTT05SZXF1ZXN0ZWQpKSB7XG4gICAgICBjb25zdCBzaWxlbnRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuc2lsZW50SlNPTlBhcnNpbmc7XG4gICAgICBjb25zdCBzdHJpY3RKU09OUGFyc2luZyA9ICFzaWxlbnRKU09OUGFyc2luZyAmJiBKU09OUmVxdWVzdGVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHN0cmljdEpTT05QYXJzaW5nKSB7XG4gICAgICAgICAgaWYgKGUubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGUsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRSwgdGhpcywgbnVsbCwgdGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgLyoqXG4gICAqIEEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYWJvcnQgYSByZXF1ZXN0LiBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYVxuICAgKiB0aW1lb3V0IGlzIG5vdCBjcmVhdGVkLlxuICAgKi9cbiAgdGltZW91dDogMCxcblxuICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTicsXG5cbiAgbWF4Q29udGVudExlbmd0aDogLTEsXG4gIG1heEJvZHlMZW5ndGg6IC0xLFxuXG4gIGVudjoge1xuICAgIEZvcm1EYXRhOiBwbGF0Zm9ybS5jbGFzc2VzLkZvcm1EYXRhLFxuICAgIEJsb2I6IHBsYXRmb3JtLmNsYXNzZXMuQmxvYlxuICB9LFxuXG4gIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gIH0sXG5cbiAgaGVhZGVyczoge1xuICAgIGNvbW1vbjoge1xuICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxufTtcblxudXRpbHMuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCddLCAobWV0aG9kKSA9PiB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNpbGVudEpTT05QYXJzaW5nOiB0cnVlLFxuICBmb3JjZWRKU09OUGFyc2luZzogdHJ1ZSxcbiAgY2xhcmlmeVRpbWVvdXRFcnJvcjogZmFsc2Vcbn07XG4iLCJleHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiMS43LjVcIjsiLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vdG9Gb3JtRGF0YS5qcyc7XG5cbi8qKlxuICogSXQgZW5jb2RlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IGluIHRoZSB1bnJlc2VydmVkIHNldCB3aXRoXG4gKiB0aGVpciBwZXJjZW50LWVuY29kZWQgZXF1aXZhbGVudHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlbmNvZGUoc3RyKSB7XG4gIGNvbnN0IGNoYXJNYXAgPSB7XG4gICAgJyEnOiAnJTIxJyxcbiAgICBcIidcIjogJyUyNycsXG4gICAgJygnOiAnJTI4JyxcbiAgICAnKSc6ICclMjknLFxuICAgICd+JzogJyU3RScsXG4gICAgJyUyMCc6ICcrJyxcbiAgICAnJTAwJzogJ1xceDAwJ1xuICB9O1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvWyEnKCl+XXwlMjB8JTAwL2csIGZ1bmN0aW9uIHJlcGxhY2VyKG1hdGNoKSB7XG4gICAgcmV0dXJuIGNoYXJNYXBbbWF0Y2hdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhcmFtcyBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IHRvIGEgRm9ybURhdGEgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBGb3JtRGF0YSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBBeGlvcyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKSB7XG4gIHRoaXMuX3BhaXJzID0gW107XG5cbiAgcGFyYW1zICYmIHRvRm9ybURhdGEocGFyYW1zLCB0aGlzLCBvcHRpb25zKTtcbn1cblxuY29uc3QgcHJvdG90eXBlID0gQXhpb3NVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlO1xuXG5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMuX3BhaXJzLnB1c2goW25hbWUsIHZhbHVlXSk7XG59O1xuXG5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhlbmNvZGVyKSB7XG4gIGNvbnN0IF9lbmNvZGUgPSBlbmNvZGVyID8gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2Rlci5jYWxsKHRoaXMsIHZhbHVlLCBlbmNvZGUpO1xuICB9IDogZW5jb2RlO1xuXG4gIHJldHVybiB0aGlzLl9wYWlycy5tYXAoZnVuY3Rpb24gZWFjaChwYWlyKSB7XG4gICAgcmV0dXJuIF9lbmNvZGUocGFpclswXSkgKyAnPScgKyBfZW5jb2RlKHBhaXJbMV0pO1xuICB9LCAnJykuam9pbignJicpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3NVUkxTZWFyY2hQYXJhbXM7XG4iLCJjb25zdCBIdHRwU3RhdHVzQ29kZSA9IHtcbiAgQ29udGludWU6IDEwMCxcbiAgU3dpdGNoaW5nUHJvdG9jb2xzOiAxMDEsXG4gIFByb2Nlc3Npbmc6IDEwMixcbiAgRWFybHlIaW50czogMTAzLFxuICBPazogMjAwLFxuICBDcmVhdGVkOiAyMDEsXG4gIEFjY2VwdGVkOiAyMDIsXG4gIE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjogMjAzLFxuICBOb0NvbnRlbnQ6IDIwNCxcbiAgUmVzZXRDb250ZW50OiAyMDUsXG4gIFBhcnRpYWxDb250ZW50OiAyMDYsXG4gIE11bHRpU3RhdHVzOiAyMDcsXG4gIEFscmVhZHlSZXBvcnRlZDogMjA4LFxuICBJbVVzZWQ6IDIyNixcbiAgTXVsdGlwbGVDaG9pY2VzOiAzMDAsXG4gIE1vdmVkUGVybWFuZW50bHk6IDMwMSxcbiAgRm91bmQ6IDMwMixcbiAgU2VlT3RoZXI6IDMwMyxcbiAgTm90TW9kaWZpZWQ6IDMwNCxcbiAgVXNlUHJveHk6IDMwNSxcbiAgVW51c2VkOiAzMDYsXG4gIFRlbXBvcmFyeVJlZGlyZWN0OiAzMDcsXG4gIFBlcm1hbmVudFJlZGlyZWN0OiAzMDgsXG4gIEJhZFJlcXVlc3Q6IDQwMCxcbiAgVW5hdXRob3JpemVkOiA0MDEsXG4gIFBheW1lbnRSZXF1aXJlZDogNDAyLFxuICBGb3JiaWRkZW46IDQwMyxcbiAgTm90Rm91bmQ6IDQwNCxcbiAgTWV0aG9kTm90QWxsb3dlZDogNDA1LFxuICBOb3RBY2NlcHRhYmxlOiA0MDYsXG4gIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDogNDA3LFxuICBSZXF1ZXN0VGltZW91dDogNDA4LFxuICBDb25mbGljdDogNDA5LFxuICBHb25lOiA0MTAsXG4gIExlbmd0aFJlcXVpcmVkOiA0MTEsXG4gIFByZWNvbmRpdGlvbkZhaWxlZDogNDEyLFxuICBQYXlsb2FkVG9vTGFyZ2U6IDQxMyxcbiAgVXJpVG9vTG9uZzogNDE0LFxuICBVbnN1cHBvcnRlZE1lZGlhVHlwZTogNDE1LFxuICBSYW5nZU5vdFNhdGlzZmlhYmxlOiA0MTYsXG4gIEV4cGVjdGF0aW9uRmFpbGVkOiA0MTcsXG4gIEltQVRlYXBvdDogNDE4LFxuICBNaXNkaXJlY3RlZFJlcXVlc3Q6IDQyMSxcbiAgVW5wcm9jZXNzYWJsZUVudGl0eTogNDIyLFxuICBMb2NrZWQ6IDQyMyxcbiAgRmFpbGVkRGVwZW5kZW5jeTogNDI0LFxuICBUb29FYXJseTogNDI1LFxuICBVcGdyYWRlUmVxdWlyZWQ6IDQyNixcbiAgUHJlY29uZGl0aW9uUmVxdWlyZWQ6IDQyOCxcbiAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTogNDMxLFxuICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczogNDUxLFxuICBJbnRlcm5hbFNlcnZlckVycm9yOiA1MDAsXG4gIE5vdEltcGxlbWVudGVkOiA1MDEsXG4gIEJhZEdhdGV3YXk6IDUwMixcbiAgU2VydmljZVVuYXZhaWxhYmxlOiA1MDMsXG4gIEdhdGV3YXlUaW1lb3V0OiA1MDQsXG4gIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOiA1MDUsXG4gIFZhcmlhbnRBbHNvTmVnb3RpYXRlczogNTA2LFxuICBJbnN1ZmZpY2llbnRTdG9yYWdlOiA1MDcsXG4gIExvb3BEZXRlY3RlZDogNTA4LFxuICBOb3RFeHRlbmRlZDogNTEwLFxuICBOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDogNTExLFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgSHR0cFN0YXR1c0NvZGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NVUkxTZWFyY2hQYXJhbXMgZnJvbSAnLi4vaGVscGVycy9BeGlvc1VSTFNlYXJjaFBhcmFtcy5qcyc7XG5cbi8qKlxuICogSXQgcmVwbGFjZXMgYWxsIGluc3RhbmNlcyBvZiB0aGUgY2hhcmFjdGVycyBgOmAsIGAkYCwgYCxgLCBgK2AsIGBbYCwgYW5kIGBdYCB3aXRoIHRoZWlyXG4gKiBVUkkgZW5jb2RlZCBjb3VudGVycGFydHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIFRoZSB2YWx1ZSB0byBiZSBlbmNvZGVkLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlbmNvZGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHBhcmFtIHs/b2JqZWN0fSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBcbiAgY29uc3QgX2VuY29kZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGUgfHwgZW5jb2RlO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZUZuID0gb3B0aW9ucyAmJiBvcHRpb25zLnNlcmlhbGl6ZTtcblxuICBsZXQgc2VyaWFsaXplZFBhcmFtcztcblxuICBpZiAoc2VyaWFsaXplRm4pIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gc2VyaWFsaXplRm4ocGFyYW1zLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gdXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSA/XG4gICAgICBwYXJhbXMudG9TdHJpbmcoKSA6XG4gICAgICBuZXcgQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKS50b1N0cmluZyhfZW5jb2RlKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgY29uc3QgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKFwiI1wiKTtcblxuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgc3BlY2lmaWVkIFVSTHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSTCBUaGUgYmFzZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVVSTCBUaGUgcmVsYXRpdmUgVVJMXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIFVSTFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvP1xcLyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn1cbiIsImltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gXCIuLi9jYW5jZWwvQ2FuY2VsZWRFcnJvci5qc1wiO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuXG5jb25zdCBjb21wb3NlU2lnbmFscyA9IChzaWduYWxzLCB0aW1lb3V0KSA9PiB7XG4gIGxldCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGxldCBhYm9ydGVkO1xuXG4gIGNvbnN0IG9uYWJvcnQgPSBmdW5jdGlvbiAoY2FuY2VsKSB7XG4gICAgaWYgKCFhYm9ydGVkKSB7XG4gICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICBjb25zdCBlcnIgPSBjYW5jZWwgaW5zdGFuY2VvZiBFcnJvciA/IGNhbmNlbCA6IHRoaXMucmVhc29uO1xuICAgICAgY29udHJvbGxlci5hYm9ydChlcnIgaW5zdGFuY2VvZiBBeGlvc0Vycm9yID8gZXJyIDogbmV3IENhbmNlbGVkRXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycikpO1xuICAgIH1cbiAgfVxuXG4gIGxldCB0aW1lciA9IHRpbWVvdXQgJiYgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgb25hYm9ydChuZXcgQXhpb3NFcnJvcihgdGltZW91dCAke3RpbWVvdXR9IG9mIG1zIGV4Y2VlZGVkYCwgQXhpb3NFcnJvci5FVElNRURPVVQpKVxuICB9LCB0aW1lb3V0KVxuXG4gIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgIGlmIChzaWduYWxzKSB7XG4gICAgICB0aW1lciAmJiBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgc2lnbmFscy5mb3JFYWNoKHNpZ25hbCA9PiB7XG4gICAgICAgIHNpZ25hbCAmJlxuICAgICAgICAoc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIgPyBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbmFib3J0KSA6IHNpZ25hbC51bnN1YnNjcmliZShvbmFib3J0KSk7XG4gICAgICB9KTtcbiAgICAgIHNpZ25hbHMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHNpZ25hbHMuZm9yRWFjaCgoc2lnbmFsKSA9PiBzaWduYWwgJiYgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCkpO1xuXG4gIGNvbnN0IHtzaWduYWx9ID0gY29udHJvbGxlcjtcblxuICBzaWduYWwudW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTtcblxuICByZXR1cm4gW3NpZ25hbCwgKCkgPT4ge1xuICAgIHRpbWVyICYmIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgdGltZXIgPSBudWxsO1xuICB9XTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29tcG9zZVNpZ25hbHM7XG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxuICB7XG4gICAgd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgICBjb25zdCBjb29raWUgPSBbbmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSldO1xuXG4gICAgICB1dGlscy5pc051bWJlcihleHBpcmVzKSAmJiBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG5cbiAgICAgIHV0aWxzLmlzU3RyaW5nKHBhdGgpICYmIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcblxuICAgICAgdXRpbHMuaXNTdHJpbmcoZG9tYWluKSAmJiBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuXG4gICAgICBzZWN1cmUgPT09IHRydWUgJiYgY29va2llLnB1c2goJ3NlY3VyZScpO1xuXG4gICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICB9LFxuXG4gICAgcmVhZChuYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgIH0sXG5cbiAgICByZW1vdmUobmFtZSkge1xuICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICB9XG4gIH1cblxuICA6XG5cbiAgLy8gTm9uLXN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICB7XG4gICAgd3JpdGUoKSB7fSxcbiAgICByZWFkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW1vdmUoKSB7fVxuICB9O1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcgbGlrZSBgZm9vW3hdW3ldW3pdYCBhbmQgcmV0dXJucyBhbiBhcnJheSBsaWtlIGBbJ2ZvbycsICd4JywgJ3knLCAneiddXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICpcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUHJvcFBhdGgobmFtZSkge1xuICAvLyBmb29beF1beV1bel1cbiAgLy8gZm9vLngueS56XG4gIC8vIGZvby14LXktelxuICAvLyBmb28geCB5IHpcbiAgcmV0dXJuIHV0aWxzLm1hdGNoQWxsKC9cXHcrfFxcWyhcXHcqKV0vZywgbmFtZSkubWFwKG1hdGNoID0+IHtcbiAgICByZXR1cm4gbWF0Y2hbMF0gPT09ICdbXScgPyAnJyA6IG1hdGNoWzFdIHx8IG1hdGNoWzBdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFycmF5IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjb252ZXJ0IHRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgYXMgdGhlIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheVRvT2JqZWN0KGFycikge1xuICBjb25zdCBvYmogPSB7fTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycik7XG4gIGxldCBpO1xuICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgbGV0IGtleTtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICBvYmpba2V5XSA9IGFycltrZXldO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBGb3JtRGF0YSBvYmplY3QgYW5kIHJldHVybnMgYSBKYXZhU2NyaXB0IG9iamVjdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGNvbnZlcnQgdG8gSlNPTi5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0PHN0cmluZywgYW55PiB8IG51bGx9IFRoZSBjb252ZXJ0ZWQgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBmb3JtRGF0YVRvSlNPTihmb3JtRGF0YSkge1xuICBmdW5jdGlvbiBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldCwgaW5kZXgpIHtcbiAgICBsZXQgbmFtZSA9IHBhdGhbaW5kZXgrK107XG5cbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgaXNOdW1lcmljS2V5ID0gTnVtYmVyLmlzRmluaXRlKCtuYW1lKTtcbiAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA+PSBwYXRoLmxlbmd0aDtcbiAgICBuYW1lID0gIW5hbWUgJiYgdXRpbHMuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0Lmxlbmd0aCA6IG5hbWU7XG5cbiAgICBpZiAoaXNMYXN0KSB7XG4gICAgICBpZiAodXRpbHMuaGFzT3duUHJvcCh0YXJnZXQsIG5hbWUpKSB7XG4gICAgICAgIHRhcmdldFtuYW1lXSA9IFt0YXJnZXRbbmFtZV0sIHZhbHVlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFtuYW1lXSB8fCAhdXRpbHMuaXNPYmplY3QodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXRbbmFtZV0sIGluZGV4KTtcblxuICAgIGlmIChyZXN1bHQgJiYgdXRpbHMuaXNBcnJheSh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBhcnJheVRvT2JqZWN0KHRhcmdldFtuYW1lXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gIH1cblxuICBpZiAodXRpbHMuaXNGb3JtRGF0YShmb3JtRGF0YSkgJiYgdXRpbHMuaXNGdW5jdGlvbihmb3JtRGF0YS5lbnRyaWVzKSkge1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuXG4gICAgdXRpbHMuZm9yRWFjaEVudHJ5KGZvcm1EYXRhLCAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgIGJ1aWxkUGF0aChwYXJzZVByb3BQYXRoKG5hbWUpLCB2YWx1ZSwgb2JqLCAwKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZm9ybURhdGFUb0pTT047XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggXCI8c2NoZW1lPjovL1wiIG9yIFwiLy9cIiAocHJvdG9jb2wtcmVsYXRpdmUgVVJMKS5cbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXG4gIC8vIGJ5IGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBkaWdpdHMsIHBsdXMsIHBlcmlvZCwgb3IgaHlwaGVuLlxuICByZXR1cm4gL14oW2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pLnRlc3QodXJsKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3NcbiAqXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3MsIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0F4aW9zRXJyb3IocGF5bG9hZCkge1xuICByZXR1cm4gdXRpbHMuaXNPYmplY3QocGF5bG9hZCkgJiYgKHBheWxvYWQuaXNBeGlvc0Vycm9yID09PSB0cnVlKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52ID9cblxuLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIGhhdmUgZnVsbCBzdXBwb3J0IG9mIHRoZSBBUElzIG5lZWRlZCB0byB0ZXN0XG4vLyB3aGV0aGVyIHRoZSByZXF1ZXN0IFVSTCBpcyBvZiB0aGUgc2FtZSBvcmlnaW4gYXMgY3VycmVudCBsb2NhdGlvbi5cbiAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICBjb25zdCBtc2llID0gcGxhdGZvcm0ubmF2aWdhdG9yICYmIC8obXNpZXx0cmlkZW50KS9pLnRlc3QocGxhdGZvcm0ubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgY29uc3QgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgbGV0IG9yaWdpblVSTDtcblxuICAgIC8qKlxuICAgICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXRzIGNvbXBvbmVudHNcbiAgICAqXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICovXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICAgIGxldCBocmVmID0gdXJsO1xuXG4gICAgICBpZiAobXNpZSkge1xuICAgICAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgICAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgICAgIH1cblxuICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgICAgIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICAgICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgICAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgICAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxuICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gICAgICB9O1xuICAgIH1cblxuICAgIG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgLyoqXG4gICAgKiBEZXRlcm1pbmUgaWYgYSBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiBhcyB0aGUgY3VycmVudCBsb2NhdGlvblxuICAgICpcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VVJMIFRoZSBVUkwgdG8gdGVzdFxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4sIG90aGVyd2lzZSBmYWxzZVxuICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbihyZXF1ZXN0VVJMKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSAodXRpbHMuaXNTdHJpbmcocmVxdWVzdFVSTCkpID8gcmVzb2x2ZVVSTChyZXF1ZXN0VVJMKSA6IHJlcXVlc3RVUkw7XG4gICAgICByZXR1cm4gKHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVVJMLnByb3RvY29sICYmXG4gICAgICAgICAgcGFyc2VkLmhvc3QgPT09IG9yaWdpblVSTC5ob3N0KTtcbiAgICB9O1xuICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnZzICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4oKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICB9KSgpO1xuIiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0cmljdFxuZXhwb3J0IGRlZmF1bHQgbnVsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuXG4vLyBSYXdBeGlvc0hlYWRlcnMgd2hvc2UgZHVwbGljYXRlcyBhcmUgaWdub3JlZCBieSBub2RlXG4vLyBjLmYuIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfbWVzc2FnZV9oZWFkZXJzXG5jb25zdCBpZ25vcmVEdXBsaWNhdGVPZiA9IHV0aWxzLnRvT2JqZWN0U2V0KFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dKTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHJhd0hlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IEhlYWRlcnMgcGFyc2VkIGludG8gYW4gb2JqZWN0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IHJhd0hlYWRlcnMgPT4ge1xuICBjb25zdCBwYXJzZWQgPSB7fTtcbiAgbGV0IGtleTtcbiAgbGV0IHZhbDtcbiAgbGV0IGk7XG5cbiAgcmF3SGVhZGVycyAmJiByYXdIZWFkZXJzLnNwbGl0KCdcXG4nKS5mb3JFYWNoKGZ1bmN0aW9uIHBhcnNlcihsaW5lKSB7XG4gICAgaSA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgIGtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIGkpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IGxpbmUuc3Vic3RyaW5nKGkgKyAxKS50cmltKCk7XG5cbiAgICBpZiAoIWtleSB8fCAocGFyc2VkW2tleV0gJiYgaWdub3JlRHVwbGljYXRlT2Zba2V5XSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIGlmIChwYXJzZWRba2V5XSkge1xuICAgICAgICBwYXJzZWRba2V5XS5wdXNoKHZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWRba2V5XSA9IFt2YWxdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhcnNlUHJvdG9jb2wodXJsKSB7XG4gIGNvbnN0IG1hdGNoID0gL14oWy0rXFx3XXsxLDI1fSkoOj9cXC9cXC98OikvLmV4ZWModXJsKTtcbiAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xufVxuIiwiaW1wb3J0IHNwZWVkb21ldGVyIGZyb20gXCIuL3NwZWVkb21ldGVyLmpzXCI7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSBcIi4vdGhyb3R0bGUuanNcIjtcbmltcG9ydCB1dGlscyBmcm9tIFwiLi4vdXRpbHMuanNcIjtcblxuZXhwb3J0IGNvbnN0IHByb2dyZXNzRXZlbnRSZWR1Y2VyID0gKGxpc3RlbmVyLCBpc0Rvd25sb2FkU3RyZWFtLCBmcmVxID0gMykgPT4ge1xuICBsZXQgYnl0ZXNOb3RpZmllZCA9IDA7XG4gIGNvbnN0IF9zcGVlZG9tZXRlciA9IHNwZWVkb21ldGVyKDUwLCAyNTApO1xuXG4gIHJldHVybiB0aHJvdHRsZShlID0+IHtcbiAgICBjb25zdCBsb2FkZWQgPSBlLmxvYWRlZDtcbiAgICBjb25zdCB0b3RhbCA9IGUubGVuZ3RoQ29tcHV0YWJsZSA/IGUudG90YWwgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJvZ3Jlc3NCeXRlcyA9IGxvYWRlZCAtIGJ5dGVzTm90aWZpZWQ7XG4gICAgY29uc3QgcmF0ZSA9IF9zcGVlZG9tZXRlcihwcm9ncmVzc0J5dGVzKTtcbiAgICBjb25zdCBpblJhbmdlID0gbG9hZGVkIDw9IHRvdGFsO1xuXG4gICAgYnl0ZXNOb3RpZmllZCA9IGxvYWRlZDtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBsb2FkZWQsXG4gICAgICB0b3RhbCxcbiAgICAgIHByb2dyZXNzOiB0b3RhbCA/IChsb2FkZWQgLyB0b3RhbCkgOiB1bmRlZmluZWQsXG4gICAgICBieXRlczogcHJvZ3Jlc3NCeXRlcyxcbiAgICAgIHJhdGU6IHJhdGUgPyByYXRlIDogdW5kZWZpbmVkLFxuICAgICAgZXN0aW1hdGVkOiByYXRlICYmIHRvdGFsICYmIGluUmFuZ2UgPyAodG90YWwgLSBsb2FkZWQpIC8gcmF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIGV2ZW50OiBlLFxuICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdG90YWwgIT0gbnVsbCxcbiAgICAgIFtpc0Rvd25sb2FkU3RyZWFtID8gJ2Rvd25sb2FkJyA6ICd1cGxvYWQnXTogdHJ1ZVxuICAgIH07XG5cbiAgICBsaXN0ZW5lcihkYXRhKTtcbiAgfSwgZnJlcSk7XG59XG5cbmV4cG9ydCBjb25zdCBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yID0gKHRvdGFsLCB0aHJvdHRsZWQpID0+IHtcbiAgY29uc3QgbGVuZ3RoQ29tcHV0YWJsZSA9IHRvdGFsICE9IG51bGw7XG5cbiAgcmV0dXJuIFsobG9hZGVkKSA9PiB0aHJvdHRsZWRbMF0oe1xuICAgIGxlbmd0aENvbXB1dGFibGUsXG4gICAgdG90YWwsXG4gICAgbG9hZGVkXG4gIH0pLCB0aHJvdHRsZWRbMV1dO1xufVxuXG5leHBvcnQgY29uc3QgYXN5bmNEZWNvcmF0b3IgPSAoZm4pID0+ICguLi5hcmdzKSA9PiB1dGlscy5hc2FwKCgpID0+IGZuKC4uLmFyZ3MpKTtcbiIsImltcG9ydCBwbGF0Zm9ybSBmcm9tIFwiLi4vcGxhdGZvcm0vaW5kZXguanNcIjtcbmltcG9ydCB1dGlscyBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCBpc1VSTFNhbWVPcmlnaW4gZnJvbSBcIi4vaXNVUkxTYW1lT3JpZ2luLmpzXCI7XG5pbXBvcnQgY29va2llcyBmcm9tIFwiLi9jb29raWVzLmpzXCI7XG5pbXBvcnQgYnVpbGRGdWxsUGF0aCBmcm9tIFwiLi4vY29yZS9idWlsZEZ1bGxQYXRoLmpzXCI7XG5pbXBvcnQgbWVyZ2VDb25maWcgZnJvbSBcIi4uL2NvcmUvbWVyZ2VDb25maWcuanNcIjtcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSBcIi4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzXCI7XG5pbXBvcnQgYnVpbGRVUkwgZnJvbSBcIi4vYnVpbGRVUkwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGNvbmZpZykgPT4ge1xuICBjb25zdCBuZXdDb25maWcgPSBtZXJnZUNvbmZpZyh7fSwgY29uZmlnKTtcblxuICBsZXQge2RhdGEsIHdpdGhYU1JGVG9rZW4sIHhzcmZIZWFkZXJOYW1lLCB4c3JmQ29va2llTmFtZSwgaGVhZGVycywgYXV0aH0gPSBuZXdDb25maWc7XG5cbiAgbmV3Q29uZmlnLmhlYWRlcnMgPSBoZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oaGVhZGVycyk7XG5cbiAgbmV3Q29uZmlnLnVybCA9IGJ1aWxkVVJMKGJ1aWxkRnVsbFBhdGgobmV3Q29uZmlnLmJhc2VVUkwsIG5ld0NvbmZpZy51cmwpLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG5cbiAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICBpZiAoYXV0aCkge1xuICAgIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgK1xuICAgICAgYnRvYSgoYXV0aC51c2VybmFtZSB8fCAnJykgKyAnOicgKyAoYXV0aC5wYXNzd29yZCA/IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChhdXRoLnBhc3N3b3JkKSkgOiAnJykpXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb250ZW50VHlwZTtcblxuICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSkge1xuICAgIGlmIChwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgfHwgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52KSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKHVuZGVmaW5lZCk7IC8vIExldCB0aGUgYnJvd3NlciBzZXQgaXRcbiAgICB9IGVsc2UgaWYgKChjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0Q29udGVudFR5cGUoKSkgIT09IGZhbHNlKSB7XG4gICAgICAvLyBmaXggc2VtaWNvbG9uIGR1cGxpY2F0aW9uIGlzc3VlIGZvciBSZWFjdE5hdGl2ZSBGb3JtRGF0YSBpbXBsZW1lbnRhdGlvblxuICAgICAgY29uc3QgW3R5cGUsIC4uLnRva2Vuc10gPSBjb250ZW50VHlwZSA/IGNvbnRlbnRUeXBlLnNwbGl0KCc7JykubWFwKHRva2VuID0+IHRva2VuLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pIDogW107XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKFt0eXBlIHx8ICdtdWx0aXBhcnQvZm9ybS1kYXRhJywgLi4udG9rZW5zXS5qb2luKCc7ICcpKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXG5cbiAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudikge1xuICAgIHdpdGhYU1JGVG9rZW4gJiYgdXRpbHMuaXNGdW5jdGlvbih3aXRoWFNSRlRva2VuKSAmJiAod2l0aFhTUkZUb2tlbiA9IHdpdGhYU1JGVG9rZW4obmV3Q29uZmlnKSk7XG5cbiAgICBpZiAod2l0aFhTUkZUb2tlbiB8fCAod2l0aFhTUkZUb2tlbiAhPT0gZmFsc2UgJiYgaXNVUkxTYW1lT3JpZ2luKG5ld0NvbmZpZy51cmwpKSkge1xuICAgICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgICBjb25zdCB4c3JmVmFsdWUgPSB4c3JmSGVhZGVyTmFtZSAmJiB4c3JmQ29va2llTmFtZSAmJiBjb29raWVzLnJlYWQoeHNyZkNvb2tpZU5hbWUpO1xuXG4gICAgICBpZiAoeHNyZlZhbHVlKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KHhzcmZIZWFkZXJOYW1lLCB4c3JmVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdDb25maWc7XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDYWxjdWxhdGUgZGF0YSBtYXhSYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gW3NhbXBsZXNDb3VudD0gMTBdXG4gKiBAcGFyYW0ge051bWJlcn0gW21pbj0gMTAwMF1cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gc3BlZWRvbWV0ZXIoc2FtcGxlc0NvdW50LCBtaW4pIHtcbiAgc2FtcGxlc0NvdW50ID0gc2FtcGxlc0NvdW50IHx8IDEwO1xuICBjb25zdCBieXRlcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBjb25zdCB0aW1lc3RhbXBzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGxldCBoZWFkID0gMDtcbiAgbGV0IHRhaWwgPSAwO1xuICBsZXQgZmlyc3RTYW1wbGVUUztcblxuICBtaW4gPSBtaW4gIT09IHVuZGVmaW5lZCA/IG1pbiA6IDEwMDA7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1c2goY2h1bmtMZW5ndGgpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gdGltZXN0YW1wc1t0YWlsXTtcblxuICAgIGlmICghZmlyc3RTYW1wbGVUUykge1xuICAgICAgZmlyc3RTYW1wbGVUUyA9IG5vdztcbiAgICB9XG5cbiAgICBieXRlc1toZWFkXSA9IGNodW5rTGVuZ3RoO1xuICAgIHRpbWVzdGFtcHNbaGVhZF0gPSBub3c7XG5cbiAgICBsZXQgaSA9IHRhaWw7XG4gICAgbGV0IGJ5dGVzQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKGkgIT09IGhlYWQpIHtcbiAgICAgIGJ5dGVzQ291bnQgKz0gYnl0ZXNbaSsrXTtcbiAgICAgIGkgPSBpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGhlYWQgPSAoaGVhZCArIDEpICUgc2FtcGxlc0NvdW50O1xuXG4gICAgaWYgKGhlYWQgPT09IHRhaWwpIHtcbiAgICAgIHRhaWwgPSAodGFpbCArIDEpICUgc2FtcGxlc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChub3cgLSBmaXJzdFNhbXBsZVRTIDwgbWluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFzc2VkID0gc3RhcnRlZEF0ICYmIG5vdyAtIHN0YXJ0ZWRBdDtcblxuICAgIHJldHVybiBwYXNzZWQgPyBNYXRoLnJvdW5kKGJ5dGVzQ291bnQgKiAxMDAwIC8gcGFzc2VkKSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3BlZWRvbWV0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3ByZWFkKGNhbGxiYWNrKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xuICAgIHJldHVybiBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufVxuIiwiLyoqXG4gKiBUaHJvdHRsZSBkZWNvcmF0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge051bWJlcn0gZnJlcVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZuLCBmcmVxKSB7XG4gIGxldCB0aW1lc3RhbXAgPSAwO1xuICBsZXQgdGhyZXNob2xkID0gMTAwMCAvIGZyZXE7XG4gIGxldCBsYXN0QXJncztcbiAgbGV0IHRpbWVyO1xuXG4gIGNvbnN0IGludm9rZSA9IChhcmdzLCBub3cgPSBEYXRlLm5vdygpKSA9PiB7XG4gICAgdGltZXN0YW1wID0gbm93O1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9XG5cbiAgY29uc3QgdGhyb3R0bGVkID0gKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHBhc3NlZCA9IG5vdyAtIHRpbWVzdGFtcDtcbiAgICBpZiAoIHBhc3NlZCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGludm9rZShhcmdzLCBub3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGludm9rZShsYXN0QXJncylcbiAgICAgICAgfSwgdGhyZXNob2xkIC0gcGFzc2VkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBmbHVzaCA9ICgpID0+IGxhc3RBcmdzICYmIGludm9rZShsYXN0QXJncyk7XG5cbiAgcmV0dXJuIFt0aHJvdHRsZWQsIGZsdXNoXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGhyb3R0bGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuLy8gdGVtcG9yYXJ5IGhvdGZpeCB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2VzIHVudGlsIEF4aW9zVVJMU2VhcmNoUGFyYW1zIGlzIHJlZmFjdG9yZWRcbmltcG9ydCBQbGF0Zm9ybUZvcm1EYXRhIGZyb20gJy4uL3BsYXRmb3JtL25vZGUvY2xhc3Nlcy9Gb3JtRGF0YS5qcyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdGhpbmcgaXMgYSBhcnJheSBvciBqcyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRoaW5nIC0gVGhlIG9iamVjdCBvciBhcnJheSB0byBiZSB2aXNpdGVkLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1Zpc2l0YWJsZSh0aGluZykge1xuICByZXR1cm4gdXRpbHMuaXNQbGFpbk9iamVjdCh0aGluZykgfHwgdXRpbHMuaXNBcnJheSh0aGluZyk7XG59XG5cbi8qKlxuICogSXQgcmVtb3ZlcyB0aGUgYnJhY2tldHMgZnJvbSB0aGUgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUga2V5IHdpdGhvdXQgdGhlIGJyYWNrZXRzLlxuICovXG5mdW5jdGlvbiByZW1vdmVCcmFja2V0cyhrZXkpIHtcbiAgcmV0dXJuIHV0aWxzLmVuZHNXaXRoKGtleSwgJ1tdJykgPyBrZXkuc2xpY2UoMCwgLTIpIDoga2V5O1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcGF0aCwgYSBrZXksIGFuZCBhIGJvb2xlYW4sIGFuZCByZXR1cm5zIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgY3VycmVudCBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgY3VycmVudCBvYmplY3QgYmVpbmcgaXRlcmF0ZWQgb3Zlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkb3RzIC0gSWYgdHJ1ZSwgdGhlIGtleSB3aWxsIGJlIHJlbmRlcmVkIHdpdGggZG90cyBpbnN0ZWFkIG9mIGJyYWNrZXRzLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyS2V5KHBhdGgsIGtleSwgZG90cykge1xuICBpZiAoIXBhdGgpIHJldHVybiBrZXk7XG4gIHJldHVybiBwYXRoLmNvbmNhdChrZXkpLm1hcChmdW5jdGlvbiBlYWNoKHRva2VuLCBpKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgdG9rZW4gPSByZW1vdmVCcmFja2V0cyh0b2tlbik7XG4gICAgcmV0dXJuICFkb3RzICYmIGkgPyAnWycgKyB0b2tlbiArICddJyA6IHRva2VuO1xuICB9KS5qb2luKGRvdHMgPyAnLicgOiAnJyk7XG59XG5cbi8qKlxuICogSWYgdGhlIGFycmF5IGlzIGFuIGFycmF5IGFuZCBub25lIG9mIGl0cyBlbGVtZW50cyBhcmUgdmlzaXRhYmxlLCB0aGVuIGl0J3MgYSBmbGF0IGFycmF5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYXJyIC0gVGhlIGFycmF5IHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRmxhdEFycmF5KGFycikge1xuICByZXR1cm4gdXRpbHMuaXNBcnJheShhcnIpICYmICFhcnIuc29tZShpc1Zpc2l0YWJsZSk7XG59XG5cbmNvbnN0IHByZWRpY2F0ZXMgPSB1dGlscy50b0ZsYXRPYmplY3QodXRpbHMsIHt9LCBudWxsLCBmdW5jdGlvbiBmaWx0ZXIocHJvcCkge1xuICByZXR1cm4gL15pc1tBLVpdLy50ZXN0KHByb3ApO1xufSk7XG5cbi8qKlxuICogQ29udmVydCBhIGRhdGEgb2JqZWN0IHRvIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHs/T2JqZWN0fSBbZm9ybURhdGFdXG4gKiBAcGFyYW0gez9PYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMudmlzaXRvcl1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWV0YVRva2VucyA9IHRydWVdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRvdHMgPSBmYWxzZV1cbiAqIEBwYXJhbSB7P0Jvb2xlYW59IFtvcHRpb25zLmluZGV4ZXMgPSBmYWxzZV1cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICoqL1xuXG4vKipcbiAqIEl0IGNvbnZlcnRzIGFuIG9iamVjdCBpbnRvIGEgRm9ybURhdGEgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3Q8YW55LCBhbnk+fSBvYmogLSBUaGUgb2JqZWN0IHRvIGNvbnZlcnQgdG8gZm9ybSBkYXRhLlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1EYXRhIC0gVGhlIEZvcm1EYXRhIG9iamVjdCB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiB0b0Zvcm1EYXRhKG9iaiwgZm9ybURhdGEsIG9wdGlvbnMpIHtcbiAgaWYgKCF1dGlscy5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgZm9ybURhdGEgPSBmb3JtRGF0YSB8fCBuZXcgKFBsYXRmb3JtRm9ybURhdGEgfHwgRm9ybURhdGEpKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIG9wdGlvbnMgPSB1dGlscy50b0ZsYXRPYmplY3Qob3B0aW9ucywge1xuICAgIG1ldGFUb2tlbnM6IHRydWUsXG4gICAgZG90czogZmFsc2UsXG4gICAgaW5kZXhlczogZmFsc2VcbiAgfSwgZmFsc2UsIGZ1bmN0aW9uIGRlZmluZWQob3B0aW9uLCBzb3VyY2UpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgICByZXR1cm4gIXV0aWxzLmlzVW5kZWZpbmVkKHNvdXJjZVtvcHRpb25dKTtcbiAgfSk7XG5cbiAgY29uc3QgbWV0YVRva2VucyA9IG9wdGlvbnMubWV0YVRva2VucztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGNvbnN0IHZpc2l0b3IgPSBvcHRpb25zLnZpc2l0b3IgfHwgZGVmYXVsdFZpc2l0b3I7XG4gIGNvbnN0IGRvdHMgPSBvcHRpb25zLmRvdHM7XG4gIGNvbnN0IGluZGV4ZXMgPSBvcHRpb25zLmluZGV4ZXM7XG4gIGNvbnN0IF9CbG9iID0gb3B0aW9ucy5CbG9iIHx8IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBCbG9iO1xuICBjb25zdCB1c2VCbG9iID0gX0Jsb2IgJiYgdXRpbHMuaXNTcGVjQ29tcGxpYW50Rm9ybShmb3JtRGF0YSk7XG5cbiAgaWYgKCF1dGlscy5pc0Z1bmN0aW9uKHZpc2l0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmlzaXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICcnO1xuXG4gICAgaWYgKHV0aWxzLmlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICghdXNlQmxvYiAmJiB1dGlscy5pc0Jsb2IodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignQmxvYiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYSBCdWZmZXIgaW5zdGVhZC4nKTtcbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlcih2YWx1ZSkgfHwgdXRpbHMuaXNUeXBlZEFycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVzZUJsb2IgJiYgdHlwZW9mIEJsb2IgPT09ICdmdW5jdGlvbicgPyBuZXcgQmxvYihbdmFsdWVdKSA6IEJ1ZmZlci5mcm9tKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCB2aXNpdG9yLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0ga2V5XG4gICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nfE51bWJlcj59IHBhdGhcbiAgICogQHRoaXMge0Zvcm1EYXRhfVxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJuIHRydWUgdG8gdmlzaXQgdGhlIGVhY2ggcHJvcCBvZiB0aGUgdmFsdWUgcmVjdXJzaXZlbHlcbiAgICovXG4gIGZ1bmN0aW9uIGRlZmF1bHRWaXNpdG9yKHZhbHVlLCBrZXksIHBhdGgpIHtcbiAgICBsZXQgYXJyID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgJiYgIXBhdGggJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHV0aWxzLmVuZHNXaXRoKGtleSwgJ3t9JykpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGtleSA9IG1ldGFUb2tlbnMgPyBrZXkgOiBrZXkuc2xpY2UoMCwgLTIpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAodXRpbHMuaXNBcnJheSh2YWx1ZSkgJiYgaXNGbGF0QXJyYXkodmFsdWUpKSB8fFxuICAgICAgICAoKHV0aWxzLmlzRmlsZUxpc3QodmFsdWUpIHx8IHV0aWxzLmVuZHNXaXRoKGtleSwgJ1tdJykpICYmIChhcnIgPSB1dGlscy50b0FycmF5KHZhbHVlKSlcbiAgICAgICAgKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gcmVtb3ZlQnJhY2tldHMoa2V5KTtcblxuICAgICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiBlYWNoKGVsLCBpbmRleCkge1xuICAgICAgICAgICEodXRpbHMuaXNVbmRlZmluZWQoZWwpIHx8IGVsID09PSBudWxsKSAmJiBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnlcbiAgICAgICAgICAgIGluZGV4ZXMgPT09IHRydWUgPyByZW5kZXJLZXkoW2tleV0sIGluZGV4LCBkb3RzKSA6IChpbmRleGVzID09PSBudWxsID8ga2V5IDoga2V5ICsgJ1tdJyksXG4gICAgICAgICAgICBjb252ZXJ0VmFsdWUoZWwpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNWaXNpdGFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQocmVuZGVyS2V5KHBhdGgsIGtleSwgZG90cyksIGNvbnZlcnRWYWx1ZSh2YWx1ZSkpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgc3RhY2sgPSBbXTtcblxuICBjb25zdCBleHBvc2VkSGVscGVycyA9IE9iamVjdC5hc3NpZ24ocHJlZGljYXRlcywge1xuICAgIGRlZmF1bHRWaXNpdG9yLFxuICAgIGNvbnZlcnRWYWx1ZSxcbiAgICBpc1Zpc2l0YWJsZVxuICB9KTtcblxuICBmdW5jdGlvbiBidWlsZCh2YWx1ZSwgcGF0aCkge1xuICAgIGlmICh1dGlscy5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybjtcblxuICAgIGlmIChzdGFjay5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgIHRocm93IEVycm9yKCdDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gJyArIHBhdGguam9pbignLicpKTtcbiAgICB9XG5cbiAgICBzdGFjay5wdXNoKHZhbHVlKTtcblxuICAgIHV0aWxzLmZvckVhY2godmFsdWUsIGZ1bmN0aW9uIGVhY2goZWwsIGtleSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gISh1dGlscy5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIHZpc2l0b3IuY2FsbChcbiAgICAgICAgZm9ybURhdGEsIGVsLCB1dGlscy5pc1N0cmluZyhrZXkpID8ga2V5LnRyaW0oKSA6IGtleSwgcGF0aCwgZXhwb3NlZEhlbHBlcnNcbiAgICAgICk7XG5cbiAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgYnVpbGQoZWwsIHBhdGggPyBwYXRoLmNvbmNhdChrZXkpIDogW2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc3RhY2sucG9wKCk7XG4gIH1cblxuICBpZiAoIXV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkYXRhIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBidWlsZChvYmopO1xuXG4gIHJldHVybiBmb3JtRGF0YTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdG9Gb3JtRGF0YTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vdG9Gb3JtRGF0YS5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRvRm9ybURhdGEoZGF0YSwgbmV3IHBsYXRmb3JtLmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zKCksIE9iamVjdC5hc3NpZ24oe1xuICAgIHZpc2l0b3I6IGZ1bmN0aW9uKHZhbHVlLCBrZXksIHBhdGgsIGhlbHBlcnMpIHtcbiAgICAgIGlmIChwbGF0Zm9ybS5pc05vZGUgJiYgdXRpbHMuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGVscGVycy5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfSwgb3B0aW9ucykpO1xufVxuIiwiXG5leHBvcnQgY29uc3Qgc3RyZWFtQ2h1bmsgPSBmdW5jdGlvbiogKGNodW5rLCBjaHVua1NpemUpIHtcbiAgbGV0IGxlbiA9IGNodW5rLmJ5dGVMZW5ndGg7XG5cbiAgaWYgKCFjaHVua1NpemUgfHwgbGVuIDwgY2h1bmtTaXplKSB7XG4gICAgeWllbGQgY2h1bms7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHBvcyA9IDA7XG4gIGxldCBlbmQ7XG5cbiAgd2hpbGUgKHBvcyA8IGxlbikge1xuICAgIGVuZCA9IHBvcyArIGNodW5rU2l6ZTtcbiAgICB5aWVsZCBjaHVuay5zbGljZShwb3MsIGVuZCk7XG4gICAgcG9zID0gZW5kO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZWFkQnl0ZXMgPSBhc3luYyBmdW5jdGlvbiogKGl0ZXJhYmxlLCBjaHVua1NpemUsIGVuY29kZSkge1xuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGl0ZXJhYmxlKSB7XG4gICAgeWllbGQqIHN0cmVhbUNodW5rKEFycmF5QnVmZmVyLmlzVmlldyhjaHVuaykgPyBjaHVuayA6IChhd2FpdCBlbmNvZGUoU3RyaW5nKGNodW5rKSkpLCBjaHVua1NpemUpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0cmFja1N0cmVhbSA9IChzdHJlYW0sIGNodW5rU2l6ZSwgb25Qcm9ncmVzcywgb25GaW5pc2gsIGVuY29kZSkgPT4ge1xuICBjb25zdCBpdGVyYXRvciA9IHJlYWRCeXRlcyhzdHJlYW0sIGNodW5rU2l6ZSwgZW5jb2RlKTtcblxuICBsZXQgYnl0ZXMgPSAwO1xuICBsZXQgZG9uZTtcbiAgbGV0IF9vbkZpbmlzaCA9IChlKSA9PiB7XG4gICAgaWYgKCFkb25lKSB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIG9uRmluaXNoICYmIG9uRmluaXNoKGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgX29uRmluaXNoKCk7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIGxldCBsb2FkZWRCeXRlcyA9IGJ5dGVzICs9IGxlbjtcbiAgICAgICAgICBvblByb2dyZXNzKGxvYWRlZEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfb25GaW5pc2goZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgX29uRmluaXNoKHJlYXNvbik7XG4gICAgICByZXR1cm4gaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgfVxuICB9LCB7XG4gICAgaGlnaFdhdGVyTWFyazogMlxuICB9KVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQge1ZFUlNJT059IGZyb20gJy4uL2Vudi9kYXRhLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG5cbmNvbnN0IHZhbGlkYXRvcnMgPSB7fTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblsnb2JqZWN0JywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ2Z1bmN0aW9uJywgJ3N0cmluZycsICdzeW1ib2wnXS5mb3JFYWNoKCh0eXBlLCBpKSA9PiB7XG4gIHZhbGlkYXRvcnNbdHlwZV0gPSBmdW5jdGlvbiB2YWxpZGF0b3IodGhpbmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSB0eXBlIHx8ICdhJyArIChpIDwgMSA/ICduICcgOiAnICcpICsgdHlwZTtcbiAgfTtcbn0pO1xuXG5jb25zdCBkZXByZWNhdGVkV2FybmluZ3MgPSB7fTtcblxuLyoqXG4gKiBUcmFuc2l0aW9uYWwgb3B0aW9uIHZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb258Ym9vbGVhbj99IHZhbGlkYXRvciAtIHNldCB0byBmYWxzZSBpZiB0aGUgdHJhbnNpdGlvbmFsIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkXG4gKiBAcGFyYW0ge3N0cmluZz99IHZlcnNpb24gLSBkZXByZWNhdGVkIHZlcnNpb24gLyByZW1vdmVkIHNpbmNlIHZlcnNpb25cbiAqIEBwYXJhbSB7c3RyaW5nP30gbWVzc2FnZSAtIHNvbWUgbWVzc2FnZSB3aXRoIGFkZGl0aW9uYWwgaW5mb1xuICpcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn1cbiAqL1xudmFsaWRhdG9ycy50cmFuc2l0aW9uYWwgPSBmdW5jdGlvbiB0cmFuc2l0aW9uYWwodmFsaWRhdG9yLCB2ZXJzaW9uLCBtZXNzYWdlKSB7XG4gIGZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2Uob3B0LCBkZXNjKSB7XG4gICAgcmV0dXJuICdbQXhpb3MgdicgKyBWRVJTSU9OICsgJ10gVHJhbnNpdGlvbmFsIG9wdGlvbiBcXCcnICsgb3B0ICsgJ1xcJycgKyBkZXNjICsgKG1lc3NhZ2UgPyAnLiAnICsgbWVzc2FnZSA6ICcnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiAodmFsdWUsIG9wdCwgb3B0cykgPT4ge1xuICAgIGlmICh2YWxpZGF0b3IgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShvcHQsICcgaGFzIGJlZW4gcmVtb3ZlZCcgKyAodmVyc2lvbiA/ICcgaW4gJyArIHZlcnNpb24gOiAnJykpLFxuICAgICAgICBBeGlvc0Vycm9yLkVSUl9ERVBSRUNBVEVEXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uICYmICFkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSkge1xuICAgICAgZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0gPSB0cnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgZm9ybWF0TWVzc2FnZShcbiAgICAgICAgICBvcHQsXG4gICAgICAgICAgJyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYnICsgdmVyc2lvbiArICcgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUnXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvciA/IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRzKSA6IHRydWU7XG4gIH07XG59O1xuXG4vKipcbiAqIEFzc2VydCBvYmplY3QncyBwcm9wZXJ0aWVzIHR5cGVcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtvYmplY3R9IHNjaGVtYVxuICogQHBhcmFtIHtib29sZWFuP30gYWxsb3dVbmtub3duXG4gKlxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBhc3NlcnRPcHRpb25zKG9wdGlvbnMsIHNjaGVtYSwgYWxsb3dVbmtub3duKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUpO1xuICB9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBjb25zdCBvcHQgPSBrZXlzW2ldO1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHNjaGVtYVtvcHRdO1xuICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc1tvcHRdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0aW9ucyk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB0cnVlKSB7XG4gICAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb24gJyArIG9wdCArICcgbXVzdCBiZSAnICsgcmVzdWx0LCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoYWxsb3dVbmtub3duICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignVW5rbm93biBvcHRpb24gJyArIG9wdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYXNzZXJ0T3B0aW9ucyxcbiAgdmFsaWRhdG9yc1xufTtcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnQgZGVmYXVsdCB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgPyBCbG9iIDogbnVsbFxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgZGVmYXVsdCB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnID8gRm9ybURhdGEgOiBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQXhpb3NVUkxTZWFyY2hQYXJhbXMgZnJvbSAnLi4vLi4vLi4vaGVscGVycy9BeGlvc1VSTFNlYXJjaFBhcmFtcy5qcyc7XG5leHBvcnQgZGVmYXVsdCB0eXBlb2YgVVJMU2VhcmNoUGFyYW1zICE9PSAndW5kZWZpbmVkJyA/IFVSTFNlYXJjaFBhcmFtcyA6IEF4aW9zVVJMU2VhcmNoUGFyYW1zO1xuIiwiaW1wb3J0IFVSTFNlYXJjaFBhcmFtcyBmcm9tICcuL2NsYXNzZXMvVVJMU2VhcmNoUGFyYW1zLmpzJ1xuaW1wb3J0IEZvcm1EYXRhIGZyb20gJy4vY2xhc3Nlcy9Gb3JtRGF0YS5qcydcbmltcG9ydCBCbG9iIGZyb20gJy4vY2xhc3Nlcy9CbG9iLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlzQnJvd3NlcjogdHJ1ZSxcbiAgY2xhc3Nlczoge1xuICAgIFVSTFNlYXJjaFBhcmFtcyxcbiAgICBGb3JtRGF0YSxcbiAgICBCbG9iXG4gIH0sXG4gIHByb3RvY29sczogWydodHRwJywgJ2h0dHBzJywgJ2ZpbGUnLCAnYmxvYicsICd1cmwnLCAnZGF0YSddXG59O1xuIiwiY29uc3QgaGFzQnJvd3NlckVudiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG5cbmNvbnN0IF9uYXZpZ2F0b3IgPSB0eXBlb2YgbmF2aWdhdG9yID09PSAnb2JqZWN0JyAmJiBuYXZpZ2F0b3IgfHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqIG5hdGl2ZXNjcmlwdFxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdOYXRpdmVTY3JpcHQnIG9yICdOUydcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyRW52ID0gaGFzQnJvd3NlckVudiAmJlxuICAoIV9uYXZpZ2F0b3IgfHwgWydSZWFjdE5hdGl2ZScsICdOYXRpdmVTY3JpcHQnLCAnTlMnXS5pbmRleE9mKF9uYXZpZ2F0b3IucHJvZHVjdCkgPCAwKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgd2ViV29ya2VyIGVudmlyb25tZW50XG4gKlxuICogQWx0aG91Z2ggdGhlIGBpc1N0YW5kYXJkQnJvd3NlckVudmAgbWV0aG9kIGluZGljYXRlcyB0aGF0XG4gKiBgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXJgLCB0aGUgV2ViV29ya2VyIHdpbGwgc3RpbGwgYmVcbiAqIGZpbHRlcmVkIG91dCBkdWUgdG8gaXRzIGp1ZGdtZW50IHN0YW5kYXJkXG4gKiBgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ2AuXG4gKiBUaGlzIGxlYWRzIHRvIGEgcHJvYmxlbSB3aGVuIGF4aW9zIHBvc3QgYEZvcm1EYXRhYCBpbiB3ZWJXb3JrZXJcbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52ID0gKCgpID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmXG4gICAgdHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cyA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufSkoKTtcblxuY29uc3Qgb3JpZ2luID0gaGFzQnJvd3NlckVudiAmJiB3aW5kb3cubG9jYXRpb24uaHJlZiB8fCAnaHR0cDovL2xvY2FsaG9zdCc7XG5cbmV4cG9ydCB7XG4gIGhhc0Jyb3dzZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyRW52LFxuICBfbmF2aWdhdG9yIGFzIG5hdmlnYXRvcixcbiAgb3JpZ2luXG59XG4iLCJpbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi9ub2RlL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vY29tbW9uL3V0aWxzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAuLi51dGlscyxcbiAgLi4ucGxhdGZvcm1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IGJpbmQgZnJvbSAnLi9oZWxwZXJzL2JpbmQuanMnO1xuXG4vLyB1dGlscyBpcyBhIGxpYnJhcnkgb2YgZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIG5vbi1zcGVjaWZpYyB0byBheGlvc1xuXG5jb25zdCB7dG9TdHJpbmd9ID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IHtnZXRQcm90b3R5cGVPZn0gPSBPYmplY3Q7XG5cbmNvbnN0IGtpbmRPZiA9IChjYWNoZSA9PiB0aGluZyA9PiB7XG4gICAgY29uc3Qgc3RyID0gdG9TdHJpbmcuY2FsbCh0aGluZyk7XG4gICAgcmV0dXJuIGNhY2hlW3N0cl0gfHwgKGNhY2hlW3N0cl0gPSBzdHIuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCkpO1xufSkoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5cbmNvbnN0IGtpbmRPZlRlc3QgPSAodHlwZSkgPT4ge1xuICB0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKHRoaW5nKSA9PiBraW5kT2YodGhpbmcpID09PSB0eXBlXG59XG5cbmNvbnN0IHR5cGVPZlRlc3QgPSB0eXBlID0+IHRoaW5nID0+IHR5cGVvZiB0aGluZyA9PT0gdHlwZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IHtpc0FycmF5fSA9IEFycmF5O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVW5kZWZpbmVkID0gdHlwZU9mVGVzdCgndW5kZWZpbmVkJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCdWZmZXIodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbCkgJiYgdmFsLmNvbnN0cnVjdG9yICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwuY29uc3RydWN0b3IpXG4gICAgJiYgaXNGdW5jdGlvbih2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIpICYmIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQXJyYXlCdWZmZXIgPSBraW5kT2ZUZXN0KCdBcnJheUJ1ZmZlcicpO1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyh2YWwpIHtcbiAgbGV0IHJlc3VsdDtcbiAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSAmJiAoQXJyYXlCdWZmZXIuaXNWaWV3KSkge1xuICAgIHJlc3VsdCA9IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9ICh2YWwpICYmICh2YWwuYnVmZmVyKSAmJiAoaXNBcnJheUJ1ZmZlcih2YWwuYnVmZmVyKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1N0cmluZyA9IHR5cGVPZlRlc3QoJ3N0cmluZycpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRnVuY3Rpb24gPSB0eXBlT2ZUZXN0KCdmdW5jdGlvbicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgTnVtYmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzTnVtYmVyID0gdHlwZU9mVGVzdCgnbnVtYmVyJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzT2JqZWN0ID0gKHRoaW5nKSA9PiB0aGluZyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQm9vbGVhblxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQm9vbGVhbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQm9vbGVhbiA9IHRoaW5nID0+IHRoaW5nID09PSB0cnVlIHx8IHRoaW5nID09PSBmYWxzZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKHZhbCkgPT4ge1xuICBpZiAoa2luZE9mKHZhbCkgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YodmFsKTtcbiAgcmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWwpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBEYXRlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0RhdGUgPSBraW5kT2ZUZXN0KCdEYXRlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0ZpbGUgPSBraW5kT2ZUZXN0KCdGaWxlJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jsb2IgPSBraW5kT2ZUZXN0KCdCbG9iJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlTGlzdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlTGlzdCA9IGtpbmRPZlRlc3QoJ0ZpbGVMaXN0Jyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJlYW1cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJlYW0gPSAodmFsKSA9PiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Zvcm1EYXRhID0gKHRoaW5nKSA9PiB7XG4gIGxldCBraW5kO1xuICByZXR1cm4gdGhpbmcgJiYgKFxuICAgICh0eXBlb2YgRm9ybURhdGEgPT09ICdmdW5jdGlvbicgJiYgdGhpbmcgaW5zdGFuY2VvZiBGb3JtRGF0YSkgfHwgKFxuICAgICAgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIChcbiAgICAgICAgKGtpbmQgPSBraW5kT2YodGhpbmcpKSA9PT0gJ2Zvcm1kYXRhJyB8fFxuICAgICAgICAvLyBkZXRlY3QgZm9ybS1kYXRhIGluc3RhbmNlXG4gICAgICAgIChraW5kID09PSAnb2JqZWN0JyAmJiBpc0Z1bmN0aW9uKHRoaW5nLnRvU3RyaW5nKSAmJiB0aGluZy50b1N0cmluZygpID09PSAnW29iamVjdCBGb3JtRGF0YV0nKVxuICAgICAgKVxuICAgIClcbiAgKVxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNVUkxTZWFyY2hQYXJhbXMgPSBraW5kT2ZUZXN0KCdVUkxTZWFyY2hQYXJhbXMnKTtcblxuY29uc3QgW2lzUmVhZGFibGVTdHJlYW0sIGlzUmVxdWVzdCwgaXNSZXNwb25zZSwgaXNIZWFkZXJzXSA9IFsnUmVhZGFibGVTdHJlYW0nLCAnUmVxdWVzdCcsICdSZXNwb25zZScsICdIZWFkZXJzJ10ubWFwKGtpbmRPZlRlc3QpO1xuXG4vKipcbiAqIFRyaW0gZXhjZXNzIHdoaXRlc3BhY2Ugb2ZmIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byB0cmltXG4gKlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5jb25zdCB0cmltID0gKHN0cikgPT4gc3RyLnRyaW0gP1xuICBzdHIudHJpbSgpIDogc3RyLnJlcGxhY2UoL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLCAnJyk7XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCBpbnZva2luZyBhIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgYG9iamAgaXMgYW4gQXJyYXkgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBpbmRleCwgYW5kIGNvbXBsZXRlIGFycmF5IGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgJ29iaicgaXMgYW4gT2JqZWN0IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwga2V5LCBhbmQgY29tcGxldGUgb2JqZWN0IGZvciBlYWNoIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBpdGVyYXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGZvciBlYWNoIGl0ZW1cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFthbGxPd25LZXlzID0gZmFsc2VdXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5mdW5jdGlvbiBmb3JFYWNoKG9iaiwgZm4sIHthbGxPd25LZXlzID0gZmFsc2V9ID0ge30pIHtcbiAgLy8gRG9uJ3QgYm90aGVyIGlmIG5vIHZhbHVlIHByb3ZpZGVkXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaTtcbiAgbGV0IGw7XG5cbiAgLy8gRm9yY2UgYW4gYXJyYXkgaWYgbm90IGFscmVhZHkgc29tZXRoaW5nIGl0ZXJhYmxlXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIG9iaiA9IFtvYmpdO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhcnJheSB2YWx1ZXNcbiAgICBmb3IgKGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpbaV0sIGksIG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xuICAgIGNvbnN0IGtleXMgPSBhbGxPd25LZXlzID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKSA6IE9iamVjdC5rZXlzKG9iaik7XG4gICAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGg7XG4gICAgbGV0IGtleTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEtleShvYmosIGtleSkge1xuICBrZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gIGxldCBfa2V5O1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIF9rZXkgPSBrZXlzW2ldO1xuICAgIGlmIChrZXkgPT09IF9rZXkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIF9rZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBfZ2xvYmFsID0gKCgpID0+IHtcbiAgLyplc2xpbnQgbm8tdW5kZWY6MCovXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGdsb2JhbFRoaXM7XG4gIHJldHVybiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiBnbG9iYWwpXG59KSgpO1xuXG5jb25zdCBpc0NvbnRleHREZWZpbmVkID0gKGNvbnRleHQpID0+ICFpc1VuZGVmaW5lZChjb250ZXh0KSAmJiBjb250ZXh0ICE9PSBfZ2xvYmFsO1xuXG4vKipcbiAqIEFjY2VwdHMgdmFyYXJncyBleHBlY3RpbmcgZWFjaCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3QsIHRoZW5cbiAqIGltbXV0YWJseSBtZXJnZXMgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBvYmplY3QgYW5kIHJldHVybnMgcmVzdWx0LlxuICpcbiAqIFdoZW4gbXVsdGlwbGUgb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIGtleSB0aGUgbGF0ZXIgb2JqZWN0IGluXG4gKiB0aGUgYXJndW1lbnRzIGxpc3Qgd2lsbCB0YWtlIHByZWNlZGVuY2UuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlc3VsdCA9IG1lcmdlKHtmb286IDEyM30sIHtmb286IDQ1Nn0pO1xuICogY29uc29sZS5sb2cocmVzdWx0LmZvbyk7IC8vIG91dHB1dHMgNDU2XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMSBPYmplY3QgdG8gbWVyZ2VcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIGNvbnN0IHtjYXNlbGVzc30gPSBpc0NvbnRleHREZWZpbmVkKHRoaXMpICYmIHRoaXMgfHwge307XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBjb25zdCBhc3NpZ25WYWx1ZSA9ICh2YWwsIGtleSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldEtleSA9IGNhc2VsZXNzICYmIGZpbmRLZXkocmVzdWx0LCBrZXkpIHx8IGtleTtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChyZXN1bHRbdGFyZ2V0S2V5XSkgJiYgaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IG1lcmdlKHJlc3VsdFt0YXJnZXRLZXldLCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IG1lcmdlKHt9LCB2YWwpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IHZhbC5zbGljZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRbdGFyZ2V0S2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBhcmd1bWVudHNbaV0gJiYgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGEgYnkgbXV0YWJseSBhZGRpbmcgdG8gaXQgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IGIgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgVGhlIG9iamVjdCB0byBiaW5kIGZ1bmN0aW9uIHRvXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5c11cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgdmFsdWUgb2Ygb2JqZWN0IGFcbiAqL1xuY29uc3QgZXh0ZW5kID0gKGEsIGIsIHRoaXNBcmcsIHthbGxPd25LZXlzfT0ge30pID0+IHtcbiAgZm9yRWFjaChiLCAodmFsLCBrZXkpID0+IHtcbiAgICBpZiAodGhpc0FyZyAmJiBpc0Z1bmN0aW9uKHZhbCkpIHtcbiAgICAgIGFba2V5XSA9IGJpbmQodmFsLCB0aGlzQXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gdmFsO1xuICAgIH1cbiAgfSwge2FsbE93bktleXN9KTtcbiAgcmV0dXJuIGE7XG59XG5cbi8qKlxuICogUmVtb3ZlIGJ5dGUgb3JkZXIgbWFya2VyLiBUaGlzIGNhdGNoZXMgRUYgQkIgQkYgKHRoZSBVVEYtOCBCT00pXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgd2l0aCBCT01cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBjb250ZW50IHZhbHVlIHdpdGhvdXQgQk9NXG4gKi9cbmNvbnN0IHN0cmlwQk9NID0gKGNvbnRlbnQpID0+IHtcbiAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDb25zdHJ1Y3RvclxuICogQHBhcmFtIHtvYmplY3R9IFtwcm9wc11cbiAqIEBwYXJhbSB7b2JqZWN0fSBbZGVzY3JpcHRvcnNdXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGluaGVyaXRzID0gKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yLCBwcm9wcywgZGVzY3JpcHRvcnMpID0+IHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZGVzY3JpcHRvcnMpO1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdG9yLCAnc3VwZXInLCB7XG4gICAgdmFsdWU6IHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlXG4gIH0pO1xuICBwcm9wcyAmJiBPYmplY3QuYXNzaWduKGNvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvcHMpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgb2JqZWN0IHdpdGggZGVlcCBwcm90b3R5cGUgY2hhaW4gdG8gYSBmbGF0IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZU9iaiBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gW2Rlc3RPYmpdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEJvb2xlYW59IFtmaWx0ZXJdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcEZpbHRlcl1cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5jb25zdCB0b0ZsYXRPYmplY3QgPSAoc291cmNlT2JqLCBkZXN0T2JqLCBmaWx0ZXIsIHByb3BGaWx0ZXIpID0+IHtcbiAgbGV0IHByb3BzO1xuICBsZXQgaTtcbiAgbGV0IHByb3A7XG4gIGNvbnN0IG1lcmdlZCA9IHt9O1xuXG4gIGRlc3RPYmogPSBkZXN0T2JqIHx8IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgaWYgKHNvdXJjZU9iaiA9PSBudWxsKSByZXR1cm4gZGVzdE9iajtcblxuICBkbyB7XG4gICAgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VPYmopO1xuICAgIGkgPSBwcm9wcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgIGlmICgoIXByb3BGaWx0ZXIgfHwgcHJvcEZpbHRlcihwcm9wLCBzb3VyY2VPYmosIGRlc3RPYmopKSAmJiAhbWVyZ2VkW3Byb3BdKSB7XG4gICAgICAgIGRlc3RPYmpbcHJvcF0gPSBzb3VyY2VPYmpbcHJvcF07XG4gICAgICAgIG1lcmdlZFtwcm9wXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZU9iaiA9IGZpbHRlciAhPT0gZmFsc2UgJiYgZ2V0UHJvdG90eXBlT2Yoc291cmNlT2JqKTtcbiAgfSB3aGlsZSAoc291cmNlT2JqICYmICghZmlsdGVyIHx8IGZpbHRlcihzb3VyY2VPYmosIGRlc3RPYmopKSAmJiBzb3VyY2VPYmogIT09IE9iamVjdC5wcm90b3R5cGUpO1xuXG4gIHJldHVybiBkZXN0T2JqO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBlbmRzIHdpdGggdGhlIGNoYXJhY3RlcnMgb2YgYSBzcGVjaWZpZWQgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtTdHJpbmd9IHNlYXJjaFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IFtwb3NpdGlvbj0gMF1cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgZW5kc1dpdGggPSAoc3RyLCBzZWFyY2hTdHJpbmcsIHBvc2l0aW9uKSA9PiB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCB8fCBwb3NpdGlvbiA+IHN0ci5sZW5ndGgpIHtcbiAgICBwb3NpdGlvbiA9IHN0ci5sZW5ndGg7XG4gIH1cbiAgcG9zaXRpb24gLT0gc2VhcmNoU3RyaW5nLmxlbmd0aDtcbiAgY29uc3QgbGFzdEluZGV4ID0gc3RyLmluZGV4T2Yoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbik7XG4gIHJldHVybiBsYXN0SW5kZXggIT09IC0xICYmIGxhc3RJbmRleCA9PT0gcG9zaXRpb247XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIG5ldyBhcnJheSBmcm9tIGFycmF5IGxpa2Ugb2JqZWN0IG9yIG51bGwgaWYgZmFpbGVkXG4gKlxuICogQHBhcmFtIHsqfSBbdGhpbmddXG4gKlxuICogQHJldHVybnMgez9BcnJheX1cbiAqL1xuY29uc3QgdG9BcnJheSA9ICh0aGluZykgPT4ge1xuICBpZiAoIXRoaW5nKSByZXR1cm4gbnVsbDtcbiAgaWYgKGlzQXJyYXkodGhpbmcpKSByZXR1cm4gdGhpbmc7XG4gIGxldCBpID0gdGhpbmcubGVuZ3RoO1xuICBpZiAoIWlzTnVtYmVyKGkpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYXJyID0gbmV3IEFycmF5KGkpO1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIGFycltpXSA9IHRoaW5nW2ldO1xuICB9XG4gIHJldHVybiBhcnI7XG59XG5cbi8qKlxuICogQ2hlY2tpbmcgaWYgdGhlIFVpbnQ4QXJyYXkgZXhpc3RzIGFuZCBpZiBpdCBkb2VzLCBpdCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgdGhlXG4gKiB0aGluZyBwYXNzZWQgaW4gaXMgYW4gaW5zdGFuY2Ugb2YgVWludDhBcnJheVxuICpcbiAqIEBwYXJhbSB7VHlwZWRBcnJheX1cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5jb25zdCBpc1R5cGVkQXJyYXkgPSAoVHlwZWRBcnJheSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiB0aGluZyA9PiB7XG4gICAgcmV0dXJuIFR5cGVkQXJyYXkgJiYgdGhpbmcgaW5zdGFuY2VvZiBUeXBlZEFycmF5O1xuICB9O1xufSkodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkpKTtcblxuLyoqXG4gKiBGb3IgZWFjaCBlbnRyeSBpbiB0aGUgb2JqZWN0LCBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBrZXkgYW5kIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBmb3JFYWNoRW50cnkgPSAob2JqLCBmbikgPT4ge1xuICBjb25zdCBnZW5lcmF0b3IgPSBvYmogJiYgb2JqW1N5bWJvbC5pdGVyYXRvcl07XG5cbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3IuY2FsbChvYmopO1xuXG4gIGxldCByZXN1bHQ7XG5cbiAgd2hpbGUgKChyZXN1bHQgPSBpdGVyYXRvci5uZXh0KCkpICYmICFyZXN1bHQuZG9uZSkge1xuICAgIGNvbnN0IHBhaXIgPSByZXN1bHQudmFsdWU7XG4gICAgZm4uY2FsbChvYmosIHBhaXJbMF0sIHBhaXJbMV0pO1xuICB9XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIGEgc3RyaW5nLCBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIG1hdGNoZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnRXhwIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxib29sZWFuPn1cbiAqL1xuY29uc3QgbWF0Y2hBbGwgPSAocmVnRXhwLCBzdHIpID0+IHtcbiAgbGV0IG1hdGNoZXM7XG4gIGNvbnN0IGFyciA9IFtdO1xuXG4gIHdoaWxlICgobWF0Y2hlcyA9IHJlZ0V4cC5leGVjKHN0cikpICE9PSBudWxsKSB7XG4gICAgYXJyLnB1c2gobWF0Y2hlcyk7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufVxuXG4vKiBDaGVja2luZyBpZiB0aGUga2luZE9mVGVzdCBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBwYXNzZWQgYW4gSFRNTEZvcm1FbGVtZW50LiAqL1xuY29uc3QgaXNIVE1MRm9ybSA9IGtpbmRPZlRlc3QoJ0hUTUxGb3JtRWxlbWVudCcpO1xuXG5jb25zdCB0b0NhbWVsQ2FzZSA9IHN0ciA9PiB7XG4gIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9cXHNdKFthLXpcXGRdKShcXHcqKS9nLFxuICAgIGZ1bmN0aW9uIHJlcGxhY2VyKG0sIHAxLCBwMikge1xuICAgICAgcmV0dXJuIHAxLnRvVXBwZXJDYXNlKCkgKyBwMjtcbiAgICB9XG4gICk7XG59O1xuXG4vKiBDcmVhdGluZyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjaGVjayBpZiBhbiBvYmplY3QgaGFzIGEgcHJvcGVydHkuICovXG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9ICgoe2hhc093blByb3BlcnR5fSkgPT4gKG9iaiwgcHJvcCkgPT4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKShPYmplY3QucHJvdG90eXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzUmVnRXhwID0ga2luZE9mVGVzdCgnUmVnRXhwJyk7XG5cbmNvbnN0IHJlZHVjZURlc2NyaXB0b3JzID0gKG9iaiwgcmVkdWNlcikgPT4ge1xuICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iaik7XG4gIGNvbnN0IHJlZHVjZWREZXNjcmlwdG9ycyA9IHt9O1xuXG4gIGZvckVhY2goZGVzY3JpcHRvcnMsIChkZXNjcmlwdG9yLCBuYW1lKSA9PiB7XG4gICAgbGV0IHJldDtcbiAgICBpZiAoKHJldCA9IHJlZHVjZXIoZGVzY3JpcHRvciwgbmFtZSwgb2JqKSkgIT09IGZhbHNlKSB7XG4gICAgICByZWR1Y2VkRGVzY3JpcHRvcnNbbmFtZV0gPSByZXQgfHwgZGVzY3JpcHRvcjtcbiAgICB9XG4gIH0pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG9iaiwgcmVkdWNlZERlc2NyaXB0b3JzKTtcbn1cblxuLyoqXG4gKiBNYWtlcyBhbGwgbWV0aG9kcyByZWFkLW9ubHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqL1xuXG5jb25zdCBmcmVlemVNZXRob2RzID0gKG9iaikgPT4ge1xuICByZWR1Y2VEZXNjcmlwdG9ycyhvYmosIChkZXNjcmlwdG9yLCBuYW1lKSA9PiB7XG4gICAgLy8gc2tpcCByZXN0cmljdGVkIHByb3BzIGluIHN0cmljdCBtb2RlXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSAmJiBbJ2FyZ3VtZW50cycsICdjYWxsZXInLCAnY2FsbGVlJ10uaW5kZXhPZihuYW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtuYW1lXTtcblxuICAgIGlmICghaXNGdW5jdGlvbih2YWx1ZSkpIHJldHVybjtcblxuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGZhbHNlO1xuXG4gICAgaWYgKCd3cml0YWJsZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgZGVzY3JpcHRvci53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGVzY3JpcHRvci5zZXQpIHtcbiAgICAgIGRlc2NyaXB0b3Iuc2V0ID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBFcnJvcignQ2FuIG5vdCByZXdyaXRlIHJlYWQtb25seSBtZXRob2QgXFwnJyArIG5hbWUgKyAnXFwnJyk7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IHRvT2JqZWN0U2V0ID0gKGFycmF5T3JTdHJpbmcsIGRlbGltaXRlcikgPT4ge1xuICBjb25zdCBvYmogPSB7fTtcblxuICBjb25zdCBkZWZpbmUgPSAoYXJyKSA9PiB7XG4gICAgYXJyLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgb2JqW3ZhbHVlXSA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBpc0FycmF5KGFycmF5T3JTdHJpbmcpID8gZGVmaW5lKGFycmF5T3JTdHJpbmcpIDogZGVmaW5lKFN0cmluZyhhcnJheU9yU3RyaW5nKS5zcGxpdChkZWxpbWl0ZXIpKTtcblxuICByZXR1cm4gb2JqO1xufVxuXG5jb25zdCBub29wID0gKCkgPT4ge31cblxuY29uc3QgdG9GaW5pdGVOdW1iZXIgPSAodmFsdWUsIGRlZmF1bHRWYWx1ZSkgPT4ge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUgPSArdmFsdWUpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG59XG5cbmNvbnN0IEFMUEhBID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J1xuXG5jb25zdCBESUdJVCA9ICcwMTIzNDU2Nzg5JztcblxuY29uc3QgQUxQSEFCRVQgPSB7XG4gIERJR0lULFxuICBBTFBIQSxcbiAgQUxQSEFfRElHSVQ6IEFMUEhBICsgQUxQSEEudG9VcHBlckNhc2UoKSArIERJR0lUXG59XG5cbmNvbnN0IGdlbmVyYXRlU3RyaW5nID0gKHNpemUgPSAxNiwgYWxwaGFiZXQgPSBBTFBIQUJFVC5BTFBIQV9ESUdJVCkgPT4ge1xuICBsZXQgc3RyID0gJyc7XG4gIGNvbnN0IHtsZW5ndGh9ID0gYWxwaGFiZXQ7XG4gIHdoaWxlIChzaXplLS0pIHtcbiAgICBzdHIgKz0gYWxwaGFiZXRbTWF0aC5yYW5kb20oKSAqIGxlbmd0aHwwXVxuICB9XG5cbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiBJZiB0aGUgdGhpbmcgaXMgYSBGb3JtRGF0YSBvYmplY3QsIHJldHVybiB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpbmcgLSBUaGUgdGhpbmcgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzU3BlY0NvbXBsaWFudEZvcm0odGhpbmcpIHtcbiAgcmV0dXJuICEhKHRoaW5nICYmIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiB0aGluZ1tTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnICYmIHRoaW5nW1N5bWJvbC5pdGVyYXRvcl0pO1xufVxuXG5jb25zdCB0b0pTT05PYmplY3QgPSAob2JqKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEFycmF5KDEwKTtcblxuICBjb25zdCB2aXNpdCA9IChzb3VyY2UsIGkpID0+IHtcblxuICAgIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICBpZiAoc3RhY2suaW5kZXhPZihzb3VyY2UpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZighKCd0b0pTT04nIGluIHNvdXJjZSkpIHtcbiAgICAgICAgc3RhY2tbaV0gPSBzb3VyY2U7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGlzQXJyYXkoc291cmNlKSA/IFtdIDoge307XG5cbiAgICAgICAgZm9yRWFjaChzb3VyY2UsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVkdWNlZFZhbHVlID0gdmlzaXQodmFsdWUsIGkgKyAxKTtcbiAgICAgICAgICAhaXNVbmRlZmluZWQocmVkdWNlZFZhbHVlKSAmJiAodGFyZ2V0W2tleV0gPSByZWR1Y2VkVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzdGFja1tpXSA9IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICByZXR1cm4gdmlzaXQob2JqLCAwKTtcbn1cblxuY29uc3QgaXNBc3luY0ZuID0ga2luZE9mVGVzdCgnQXN5bmNGdW5jdGlvbicpO1xuXG5jb25zdCBpc1RoZW5hYmxlID0gKHRoaW5nKSA9PlxuICB0aGluZyAmJiAoaXNPYmplY3QodGhpbmcpIHx8IGlzRnVuY3Rpb24odGhpbmcpKSAmJiBpc0Z1bmN0aW9uKHRoaW5nLnRoZW4pICYmIGlzRnVuY3Rpb24odGhpbmcuY2F0Y2gpO1xuXG4vLyBvcmlnaW5hbCBjb2RlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vRGlnaXRhbEJyYWluSlMvQXhpb3NQcm9taXNlL2Jsb2IvMTZkZWFiMTM3MTBlYzA5Nzc5OTIyMTMxZjNmYTU5NTQzMjBmODNhYi9saWIvdXRpbHMuanMjTDExLUwzNFxuXG5jb25zdCBfc2V0SW1tZWRpYXRlID0gKChzZXRJbW1lZGlhdGVTdXBwb3J0ZWQsIHBvc3RNZXNzYWdlU3VwcG9ydGVkKSA9PiB7XG4gIGlmIChzZXRJbW1lZGlhdGVTdXBwb3J0ZWQpIHtcbiAgICByZXR1cm4gc2V0SW1tZWRpYXRlO1xuICB9XG5cbiAgcmV0dXJuIHBvc3RNZXNzYWdlU3VwcG9ydGVkID8gKCh0b2tlbiwgY2FsbGJhY2tzKSA9PiB7XG4gICAgX2dsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoe3NvdXJjZSwgZGF0YX0pID0+IHtcbiAgICAgIGlmIChzb3VyY2UgPT09IF9nbG9iYWwgJiYgZGF0YSA9PT0gdG9rZW4pIHtcbiAgICAgICAgY2FsbGJhY2tzLmxlbmd0aCAmJiBjYWxsYmFja3Muc2hpZnQoKSgpO1xuICAgICAgfVxuICAgIH0sIGZhbHNlKTtcblxuICAgIHJldHVybiAoY2IpID0+IHtcbiAgICAgIGNhbGxiYWNrcy5wdXNoKGNiKTtcbiAgICAgIF9nbG9iYWwucG9zdE1lc3NhZ2UodG9rZW4sIFwiKlwiKTtcbiAgICB9XG4gIH0pKGBheGlvc0Ake01hdGgucmFuZG9tKCl9YCwgW10pIDogKGNiKSA9PiBzZXRUaW1lb3V0KGNiKTtcbn0pKFxuICB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nLFxuICBpc0Z1bmN0aW9uKF9nbG9iYWwucG9zdE1lc3NhZ2UpXG4pO1xuXG5jb25zdCBhc2FwID0gdHlwZW9mIHF1ZXVlTWljcm90YXNrICE9PSAndW5kZWZpbmVkJyA/XG4gIHF1ZXVlTWljcm90YXNrLmJpbmQoX2dsb2JhbCkgOiAoIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLm5leHRUaWNrIHx8IF9zZXRJbW1lZGlhdGUpO1xuXG4vLyAqKioqKioqKioqKioqKioqKioqKipcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyLFxuICBpc0J1ZmZlcixcbiAgaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nLFxuICBpc051bWJlcixcbiAgaXNCb29sZWFuLFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNSZWFkYWJsZVN0cmVhbSxcbiAgaXNSZXF1ZXN0LFxuICBpc1Jlc3BvbnNlLFxuICBpc0hlYWRlcnMsXG4gIGlzVW5kZWZpbmVkLFxuICBpc0RhdGUsXG4gIGlzRmlsZSxcbiAgaXNCbG9iLFxuICBpc1JlZ0V4cCxcbiAgaXNGdW5jdGlvbixcbiAgaXNTdHJlYW0sXG4gIGlzVVJMU2VhcmNoUGFyYW1zLFxuICBpc1R5cGVkQXJyYXksXG4gIGlzRmlsZUxpc3QsXG4gIGZvckVhY2gsXG4gIG1lcmdlLFxuICBleHRlbmQsXG4gIHRyaW0sXG4gIHN0cmlwQk9NLFxuICBpbmhlcml0cyxcbiAgdG9GbGF0T2JqZWN0LFxuICBraW5kT2YsXG4gIGtpbmRPZlRlc3QsXG4gIGVuZHNXaXRoLFxuICB0b0FycmF5LFxuICBmb3JFYWNoRW50cnksXG4gIG1hdGNoQWxsLFxuICBpc0hUTUxGb3JtLFxuICBoYXNPd25Qcm9wZXJ0eSxcbiAgaGFzT3duUHJvcDogaGFzT3duUHJvcGVydHksIC8vIGFuIGFsaWFzIHRvIGF2b2lkIEVTTGludCBuby1wcm90b3R5cGUtYnVpbHRpbnMgZGV0ZWN0aW9uXG4gIHJlZHVjZURlc2NyaXB0b3JzLFxuICBmcmVlemVNZXRob2RzLFxuICB0b09iamVjdFNldCxcbiAgdG9DYW1lbENhc2UsXG4gIG5vb3AsXG4gIHRvRmluaXRlTnVtYmVyLFxuICBmaW5kS2V5LFxuICBnbG9iYWw6IF9nbG9iYWwsXG4gIGlzQ29udGV4dERlZmluZWQsXG4gIEFMUEhBQkVULFxuICBnZW5lcmF0ZVN0cmluZyxcbiAgaXNTcGVjQ29tcGxpYW50Rm9ybSxcbiAgdG9KU09OT2JqZWN0LFxuICBpc0FzeW5jRm4sXG4gIGlzVGhlbmFibGUsXG4gIHNldEltbWVkaWF0ZTogX3NldEltbWVkaWF0ZSxcbiAgYXNhcFxufTtcbiIsImZ1bmN0aW9uIHIoZSl7dmFyIHQsZixuPVwiXCI7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGV8fFwibnVtYmVyXCI9PXR5cGVvZiBlKW4rPWU7ZWxzZSBpZihcIm9iamVjdFwiPT10eXBlb2YgZSlpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgbz1lLmxlbmd0aDtmb3IodD0wO3Q8bzt0KyspZVt0XSYmKGY9cihlW3RdKSkmJihuJiYobis9XCIgXCIpLG4rPWYpfWVsc2UgZm9yKGYgaW4gZSllW2ZdJiYobiYmKG4rPVwiIFwiKSxuKz1mKTtyZXR1cm4gbn1leHBvcnQgZnVuY3Rpb24gY2xzeCgpe2Zvcih2YXIgZSx0LGY9MCxuPVwiXCIsbz1hcmd1bWVudHMubGVuZ3RoO2Y8bztmKyspKGU9YXJndW1lbnRzW2ZdKSYmKHQ9cihlKSkmJihuJiYobis9XCIgXCIpLG4rPXQpO3JldHVybiBufWV4cG9ydCBkZWZhdWx0IGNsc3g7IiwidmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGZpbmQoaXRlciwgdGFyLCBrZXkpIHtcblx0Zm9yIChrZXkgb2YgaXRlci5rZXlzKCkpIHtcblx0XHRpZiAoZGVxdWFsKGtleSwgdGFyKSkgcmV0dXJuIGtleTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVxdWFsKGZvbywgYmFyKSB7XG5cdHZhciBjdG9yLCBsZW4sIHRtcDtcblx0aWYgKGZvbyA9PT0gYmFyKSByZXR1cm4gdHJ1ZTtcblxuXHRpZiAoZm9vICYmIGJhciAmJiAoY3Rvcj1mb28uY29uc3RydWN0b3IpID09PSBiYXIuY29uc3RydWN0b3IpIHtcblx0XHRpZiAoY3RvciA9PT0gRGF0ZSkgcmV0dXJuIGZvby5nZXRUaW1lKCkgPT09IGJhci5nZXRUaW1lKCk7XG5cdFx0aWYgKGN0b3IgPT09IFJlZ0V4cCkgcmV0dXJuIGZvby50b1N0cmluZygpID09PSBiYXIudG9TdHJpbmcoKTtcblxuXHRcdGlmIChjdG9yID09PSBBcnJheSkge1xuXHRcdFx0aWYgKChsZW49Zm9vLmxlbmd0aCkgPT09IGJhci5sZW5ndGgpIHtcblx0XHRcdFx0d2hpbGUgKGxlbi0tICYmIGRlcXVhbChmb29bbGVuXSwgYmFyW2xlbl0pKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBsZW4gPT09IC0xO1xuXHRcdH1cblxuXHRcdGlmIChjdG9yID09PSBTZXQpIHtcblx0XHRcdGlmIChmb28uc2l6ZSAhPT0gYmFyLnNpemUpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChsZW4gb2YgZm9vKSB7XG5cdFx0XHRcdHRtcCA9IGxlbjtcblx0XHRcdFx0aWYgKHRtcCAmJiB0eXBlb2YgdG1wID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRtcCA9IGZpbmQoYmFyLCB0bXApO1xuXHRcdFx0XHRcdGlmICghdG1wKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFiYXIuaGFzKHRtcCkpIHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChjdG9yID09PSBNYXApIHtcblx0XHRcdGlmIChmb28uc2l6ZSAhPT0gYmFyLnNpemUpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChsZW4gb2YgZm9vKSB7XG5cdFx0XHRcdHRtcCA9IGxlblswXTtcblx0XHRcdFx0aWYgKHRtcCAmJiB0eXBlb2YgdG1wID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRtcCA9IGZpbmQoYmFyLCB0bXApO1xuXHRcdFx0XHRcdGlmICghdG1wKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFkZXF1YWwobGVuWzFdLCBiYXIuZ2V0KHRtcCkpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoY3RvciA9PT0gQXJyYXlCdWZmZXIpIHtcblx0XHRcdGZvbyA9IG5ldyBVaW50OEFycmF5KGZvbyk7XG5cdFx0XHRiYXIgPSBuZXcgVWludDhBcnJheShiYXIpO1xuXHRcdH0gZWxzZSBpZiAoY3RvciA9PT0gRGF0YVZpZXcpIHtcblx0XHRcdGlmICgobGVuPWZvby5ieXRlTGVuZ3RoKSA9PT0gYmFyLmJ5dGVMZW5ndGgpIHtcblx0XHRcdFx0d2hpbGUgKGxlbi0tICYmIGZvby5nZXRJbnQ4KGxlbikgPT09IGJhci5nZXRJbnQ4KGxlbikpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGxlbiA9PT0gLTE7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5QnVmZmVyLmlzVmlldyhmb28pKSB7XG5cdFx0XHRpZiAoKGxlbj1mb28uYnl0ZUxlbmd0aCkgPT09IGJhci5ieXRlTGVuZ3RoKSB7XG5cdFx0XHRcdHdoaWxlIChsZW4tLSAmJiBmb29bbGVuXSA9PT0gYmFyW2xlbl0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGxlbiA9PT0gLTE7XG5cdFx0fVxuXG5cdFx0aWYgKCFjdG9yIHx8IHR5cGVvZiBmb28gPT09ICdvYmplY3QnKSB7XG5cdFx0XHRsZW4gPSAwO1xuXHRcdFx0Zm9yIChjdG9yIGluIGZvbykge1xuXHRcdFx0XHRpZiAoaGFzLmNhbGwoZm9vLCBjdG9yKSAmJiArK2xlbiAmJiAhaGFzLmNhbGwoYmFyLCBjdG9yKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRpZiAoIShjdG9yIGluIGJhcikgfHwgIWRlcXVhbChmb29bY3Rvcl0sIGJhcltjdG9yXSkpIHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBPYmplY3Qua2V5cyhiYXIpLmxlbmd0aCA9PT0gbGVuO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmb28gIT09IGZvbyAmJiBiYXIgIT09IGJhcjtcbn1cbiIsImltcG9ydCB7IGludmFyaWFudCB9IGZyb20gJ0ByZWFjdC1kbmQvaW52YXJpYW50JztcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvanNfdXRpbHMuanMnO1xuaW1wb3J0IHsgc2V0Q2xpZW50T2Zmc2V0IH0gZnJvbSAnLi9sb2NhbC9zZXRDbGllbnRPZmZzZXQuanMnO1xuaW1wb3J0IHsgQkVHSU5fRFJBRywgSU5JVF9DT09SRFMgfSBmcm9tICcuL3R5cGVzLmpzJztcbmNvbnN0IFJlc2V0Q29vcmRpbmF0ZXNBY3Rpb24gPSB7XG4gICAgdHlwZTogSU5JVF9DT09SRFMsXG4gICAgcGF5bG9hZDoge1xuICAgICAgICBjbGllbnRPZmZzZXQ6IG51bGwsXG4gICAgICAgIHNvdXJjZUNsaWVudE9mZnNldDogbnVsbFxuICAgIH1cbn07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmVnaW5EcmFnKG1hbmFnZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYmVnaW5EcmFnKHNvdXJjZUlkcyA9IFtdLCBvcHRpb25zID0ge1xuICAgICAgICBwdWJsaXNoU291cmNlOiB0cnVlXG4gICAgfSkge1xuICAgICAgICBjb25zdCB7IHB1Ymxpc2hTb3VyY2UgPXRydWUgLCBjbGllbnRPZmZzZXQgLCBnZXRTb3VyY2VDbGllbnRPZmZzZXQgLCAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3IoKTtcbiAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBtYW5hZ2VyLmdldFJlZ2lzdHJ5KCk7XG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGNvb3JkaW5hdGVzIHVzaW5nIHRoZSBjbGllbnQgb2Zmc2V0XG4gICAgICAgIG1hbmFnZXIuZGlzcGF0Y2goc2V0Q2xpZW50T2Zmc2V0KGNsaWVudE9mZnNldCkpO1xuICAgICAgICB2ZXJpZnlJbnZhcmlhbnRzKHNvdXJjZUlkcywgbW9uaXRvciwgcmVnaXN0cnkpO1xuICAgICAgICAvLyBHZXQgdGhlIGRyYWdnYWJsZSBzb3VyY2VcbiAgICAgICAgY29uc3Qgc291cmNlSWQgPSBnZXREcmFnZ2FibGVTb3VyY2Uoc291cmNlSWRzLCBtb25pdG9yKTtcbiAgICAgICAgaWYgKHNvdXJjZUlkID09IG51bGwpIHtcbiAgICAgICAgICAgIG1hbmFnZXIuZGlzcGF0Y2goUmVzZXRDb29yZGluYXRlc0FjdGlvbik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgY2xpZW50IG9mZnNldFxuICAgICAgICBsZXQgc291cmNlQ2xpZW50T2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgaWYgKGNsaWVudE9mZnNldCkge1xuICAgICAgICAgICAgaWYgKCFnZXRTb3VyY2VDbGllbnRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldFNvdXJjZUNsaWVudE9mZnNldCBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlcmlmeUdldFNvdXJjZUNsaWVudE9mZnNldElzRnVuY3Rpb24oZ2V0U291cmNlQ2xpZW50T2Zmc2V0KTtcbiAgICAgICAgICAgIHNvdXJjZUNsaWVudE9mZnNldCA9IGdldFNvdXJjZUNsaWVudE9mZnNldChzb3VyY2VJZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZnVsbCBjb29yZGluYXRlc1xuICAgICAgICBtYW5hZ2VyLmRpc3BhdGNoKHNldENsaWVudE9mZnNldChjbGllbnRPZmZzZXQsIHNvdXJjZUNsaWVudE9mZnNldCkpO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSByZWdpc3RyeS5nZXRTb3VyY2Uoc291cmNlSWQpO1xuICAgICAgICBjb25zdCBpdGVtID0gc291cmNlLmJlZ2luRHJhZyhtb25pdG9yLCBzb3VyY2VJZCk7XG4gICAgICAgIC8vIElmIHNvdXJjZS5iZWdpbkRyYWcgcmV0dXJucyBudWxsLCB0aGlzIGlzIGFuIGluZGljYXRvciB0byBjYW5jZWwgdGhlIGRyYWdcbiAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB2ZXJpZnlJdGVtSXNPYmplY3QoaXRlbSk7XG4gICAgICAgIHJlZ2lzdHJ5LnBpblNvdXJjZShzb3VyY2VJZCk7XG4gICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gcmVnaXN0cnkuZ2V0U291cmNlVHlwZShzb3VyY2VJZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBCRUdJTl9EUkFHLFxuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgc291cmNlSWQsXG4gICAgICAgICAgICAgICAgY2xpZW50T2Zmc2V0OiBjbGllbnRPZmZzZXQgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBzb3VyY2VDbGllbnRPZmZzZXQ6IHNvdXJjZUNsaWVudE9mZnNldCB8fCBudWxsLFxuICAgICAgICAgICAgICAgIGlzU291cmNlUHVibGljOiAhIXB1Ymxpc2hTb3VyY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdmVyaWZ5SW52YXJpYW50cyhzb3VyY2VJZHMsIG1vbml0b3IsIHJlZ2lzdHJ5KSB7XG4gICAgaW52YXJpYW50KCFtb25pdG9yLmlzRHJhZ2dpbmcoKSwgJ0Nhbm5vdCBjYWxsIGJlZ2luRHJhZyB3aGlsZSBkcmFnZ2luZy4nKTtcbiAgICBzb3VyY2VJZHMuZm9yRWFjaChmdW5jdGlvbihzb3VyY2VJZCkge1xuICAgICAgICBpbnZhcmlhbnQocmVnaXN0cnkuZ2V0U291cmNlKHNvdXJjZUlkKSwgJ0V4cGVjdGVkIHNvdXJjZUlkcyB0byBiZSByZWdpc3RlcmVkLicpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gdmVyaWZ5R2V0U291cmNlQ2xpZW50T2Zmc2V0SXNGdW5jdGlvbihnZXRTb3VyY2VDbGllbnRPZmZzZXQpIHtcbiAgICBpbnZhcmlhbnQodHlwZW9mIGdldFNvdXJjZUNsaWVudE9mZnNldCA9PT0gJ2Z1bmN0aW9uJywgJ1doZW4gY2xpZW50T2Zmc2V0IGlzIHByb3ZpZGVkLCBnZXRTb3VyY2VDbGllbnRPZmZzZXQgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xufVxuZnVuY3Rpb24gdmVyaWZ5SXRlbUlzT2JqZWN0KGl0ZW0pIHtcbiAgICBpbnZhcmlhbnQoaXNPYmplY3QoaXRlbSksICdJdGVtIG11c3QgYmUgYW4gb2JqZWN0LicpO1xufVxuZnVuY3Rpb24gZ2V0RHJhZ2dhYmxlU291cmNlKHNvdXJjZUlkcywgbW9uaXRvcikge1xuICAgIGxldCBzb3VyY2VJZCA9IG51bGw7XG4gICAgZm9yKGxldCBpID0gc291cmNlSWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcbiAgICAgICAgaWYgKG1vbml0b3IuY2FuRHJhZ1NvdXJjZShzb3VyY2VJZHNbaV0pKSB7XG4gICAgICAgICAgICBzb3VyY2VJZCA9IHNvdXJjZUlkc1tpXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VJZDtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmVnaW5EcmFnLmpzLm1hcCIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgICBmb3IodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbihzeW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5pbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAcmVhY3QtZG5kL2ludmFyaWFudCc7XG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJy4uLy4uL3V0aWxzL2pzX3V0aWxzLmpzJztcbmltcG9ydCB7IERST1AgfSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEcm9wKG1hbmFnZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZHJvcChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgbW9uaXRvciA9IG1hbmFnZXIuZ2V0TW9uaXRvcigpO1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IG1hbmFnZXIuZ2V0UmVnaXN0cnkoKTtcbiAgICAgICAgdmVyaWZ5SW52YXJpYW50cyhtb25pdG9yKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0SWRzID0gZ2V0RHJvcHBhYmxlVGFyZ2V0cyhtb25pdG9yKTtcbiAgICAgICAgLy8gTXVsdGlwbGUgYWN0aW9ucyBhcmUgZGlzcGF0Y2hlZCBoZXJlLCB3aGljaCBpcyB3aHkgdGhpcyBkb2Vzbid0IHJldHVybiBhbiBhY3Rpb25cbiAgICAgICAgdGFyZ2V0SWRzLmZvckVhY2goKHRhcmdldElkLCBpbmRleCk9PntcbiAgICAgICAgICAgIGNvbnN0IGRyb3BSZXN1bHQgPSBkZXRlcm1pbmVEcm9wUmVzdWx0KHRhcmdldElkLCBpbmRleCwgcmVnaXN0cnksIG1vbml0b3IpO1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IERST1AsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICBkcm9wUmVzdWx0OiBfb2JqZWN0U3ByZWFkKHt9LCBvcHRpb25zLCBkcm9wUmVzdWx0KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBtYW5hZ2VyLmRpc3BhdGNoKGFjdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5mdW5jdGlvbiB2ZXJpZnlJbnZhcmlhbnRzKG1vbml0b3IpIHtcbiAgICBpbnZhcmlhbnQobW9uaXRvci5pc0RyYWdnaW5nKCksICdDYW5ub3QgY2FsbCBkcm9wIHdoaWxlIG5vdCBkcmFnZ2luZy4nKTtcbiAgICBpbnZhcmlhbnQoIW1vbml0b3IuZGlkRHJvcCgpLCAnQ2Fubm90IGNhbGwgZHJvcCB0d2ljZSBkdXJpbmcgb25lIGRyYWcgb3BlcmF0aW9uLicpO1xufVxuZnVuY3Rpb24gZGV0ZXJtaW5lRHJvcFJlc3VsdCh0YXJnZXRJZCwgaW5kZXgsIHJlZ2lzdHJ5LCBtb25pdG9yKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gcmVnaXN0cnkuZ2V0VGFyZ2V0KHRhcmdldElkKTtcbiAgICBsZXQgZHJvcFJlc3VsdCA9IHRhcmdldCA/IHRhcmdldC5kcm9wKG1vbml0b3IsIHRhcmdldElkKSA6IHVuZGVmaW5lZDtcbiAgICB2ZXJpZnlEcm9wUmVzdWx0VHlwZShkcm9wUmVzdWx0KTtcbiAgICBpZiAodHlwZW9mIGRyb3BSZXN1bHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGRyb3BSZXN1bHQgPSBpbmRleCA9PT0gMCA/IHt9IDogbW9uaXRvci5nZXREcm9wUmVzdWx0KCk7XG4gICAgfVxuICAgIHJldHVybiBkcm9wUmVzdWx0O1xufVxuZnVuY3Rpb24gdmVyaWZ5RHJvcFJlc3VsdFR5cGUoZHJvcFJlc3VsdCkge1xuICAgIGludmFyaWFudCh0eXBlb2YgZHJvcFJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcgfHwgaXNPYmplY3QoZHJvcFJlc3VsdCksICdEcm9wIHJlc3VsdCBtdXN0IGVpdGhlciBiZSBhbiBvYmplY3Qgb3IgdW5kZWZpbmVkLicpO1xufVxuZnVuY3Rpb24gZ2V0RHJvcHBhYmxlVGFyZ2V0cyhtb25pdG9yKSB7XG4gICAgY29uc3QgdGFyZ2V0SWRzID0gbW9uaXRvci5nZXRUYXJnZXRJZHMoKS5maWx0ZXIobW9uaXRvci5jYW5Ecm9wT25UYXJnZXQsIG1vbml0b3IpO1xuICAgIHRhcmdldElkcy5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIHRhcmdldElkcztcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJvcC5qcy5tYXAiLCJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAcmVhY3QtZG5kL2ludmFyaWFudCc7XG5pbXBvcnQgeyBFTkRfRFJBRyB9IGZyb20gJy4vdHlwZXMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVuZERyYWcobWFuYWdlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiBlbmREcmFnKCkge1xuICAgICAgICBjb25zdCBtb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yKCk7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gbWFuYWdlci5nZXRSZWdpc3RyeSgpO1xuICAgICAgICB2ZXJpZnlJc0RyYWdnaW5nKG1vbml0b3IpO1xuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IG1vbml0b3IuZ2V0U291cmNlSWQoKTtcbiAgICAgICAgaWYgKHNvdXJjZUlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHJlZ2lzdHJ5LmdldFNvdXJjZShzb3VyY2VJZCwgdHJ1ZSk7XG4gICAgICAgICAgICBzb3VyY2UuZW5kRHJhZyhtb25pdG9yLCBzb3VyY2VJZCk7XG4gICAgICAgICAgICByZWdpc3RyeS51bnBpblNvdXJjZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBFTkRfRFJBR1xuICAgICAgICB9O1xuICAgIH07XG59XG5mdW5jdGlvbiB2ZXJpZnlJc0RyYWdnaW5nKG1vbml0b3IpIHtcbiAgICBpbnZhcmlhbnQobW9uaXRvci5pc0RyYWdnaW5nKCksICdDYW5ub3QgY2FsbCBlbmREcmFnIHdoaWxlIG5vdCBkcmFnZ2luZy4nKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW5kRHJhZy5qcy5tYXAiLCJpbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAcmVhY3QtZG5kL2ludmFyaWFudCc7XG5pbXBvcnQgeyBtYXRjaGVzVHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL21hdGNoZXNUeXBlLmpzJztcbmltcG9ydCB7IEhPVkVSIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSG92ZXIobWFuYWdlcikge1xuICAgIHJldHVybiBmdW5jdGlvbiBob3Zlcih0YXJnZXRJZHNBcmcsIHsgY2xpZW50T2Zmc2V0ICB9ID0ge30pIHtcbiAgICAgICAgdmVyaWZ5VGFyZ2V0SWRzSXNBcnJheSh0YXJnZXRJZHNBcmcpO1xuICAgICAgICBjb25zdCB0YXJnZXRJZHMgPSB0YXJnZXRJZHNBcmcuc2xpY2UoMCk7XG4gICAgICAgIGNvbnN0IG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3IoKTtcbiAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBtYW5hZ2VyLmdldFJlZ2lzdHJ5KCk7XG4gICAgICAgIGNvbnN0IGRyYWdnZWRJdGVtVHlwZSA9IG1vbml0b3IuZ2V0SXRlbVR5cGUoKTtcbiAgICAgICAgcmVtb3ZlTm9uTWF0Y2hpbmdUYXJnZXRJZHModGFyZ2V0SWRzLCByZWdpc3RyeSwgZHJhZ2dlZEl0ZW1UeXBlKTtcbiAgICAgICAgY2hlY2tJbnZhcmlhbnRzKHRhcmdldElkcywgbW9uaXRvciwgcmVnaXN0cnkpO1xuICAgICAgICBob3ZlckFsbFRhcmdldHModGFyZ2V0SWRzLCBtb25pdG9yLCByZWdpc3RyeSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBIT1ZFUixcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICB0YXJnZXRJZHMsXG4gICAgICAgICAgICAgICAgY2xpZW50T2Zmc2V0OiBjbGllbnRPZmZzZXQgfHwgbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG59XG5mdW5jdGlvbiB2ZXJpZnlUYXJnZXRJZHNJc0FycmF5KHRhcmdldElkc0FyZykge1xuICAgIGludmFyaWFudChBcnJheS5pc0FycmF5KHRhcmdldElkc0FyZyksICdFeHBlY3RlZCB0YXJnZXRJZHMgdG8gYmUgYW4gYXJyYXkuJyk7XG59XG5mdW5jdGlvbiBjaGVja0ludmFyaWFudHModGFyZ2V0SWRzLCBtb25pdG9yLCByZWdpc3RyeSkge1xuICAgIGludmFyaWFudChtb25pdG9yLmlzRHJhZ2dpbmcoKSwgJ0Nhbm5vdCBjYWxsIGhvdmVyIHdoaWxlIG5vdCBkcmFnZ2luZy4nKTtcbiAgICBpbnZhcmlhbnQoIW1vbml0b3IuZGlkRHJvcCgpLCAnQ2Fubm90IGNhbGwgaG92ZXIgYWZ0ZXIgZHJvcC4nKTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGFyZ2V0SWRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY29uc3QgdGFyZ2V0SWQgPSB0YXJnZXRJZHNbaV07XG4gICAgICAgIGludmFyaWFudCh0YXJnZXRJZHMubGFzdEluZGV4T2YodGFyZ2V0SWQpID09PSBpLCAnRXhwZWN0ZWQgdGFyZ2V0SWRzIHRvIGJlIHVuaXF1ZSBpbiB0aGUgcGFzc2VkIGFycmF5LicpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSByZWdpc3RyeS5nZXRUYXJnZXQodGFyZ2V0SWQpO1xuICAgICAgICBpbnZhcmlhbnQodGFyZ2V0LCAnRXhwZWN0ZWQgdGFyZ2V0SWRzIHRvIGJlIHJlZ2lzdGVyZWQuJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVtb3ZlTm9uTWF0Y2hpbmdUYXJnZXRJZHModGFyZ2V0SWRzLCByZWdpc3RyeSwgZHJhZ2dlZEl0ZW1UeXBlKSB7XG4gICAgLy8gUmVtb3ZlIHRob3NlIHRhcmdldElkcyB0aGF0IGRvbid0IG1hdGNoIHRoZSB0YXJnZXRUeXBlLiAgVGhpc1xuICAgIC8vIGZpeGVzIHNoYWxsb3cgaXNPdmVyIHdoaWNoIHdvdWxkIG9ubHkgYmUgbm9uLXNoYWxsb3cgYmVjYXVzZSBvZlxuICAgIC8vIG5vbi1tYXRjaGluZyB0YXJnZXRzLlxuICAgIGZvcihsZXQgaSA9IHRhcmdldElkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG4gICAgICAgIGNvbnN0IHRhcmdldElkID0gdGFyZ2V0SWRzW2ldO1xuICAgICAgICBjb25zdCB0YXJnZXRUeXBlID0gcmVnaXN0cnkuZ2V0VGFyZ2V0VHlwZSh0YXJnZXRJZCk7XG4gICAgICAgIGlmICghbWF0Y2hlc1R5cGUodGFyZ2V0VHlwZSwgZHJhZ2dlZEl0ZW1UeXBlKSkge1xuICAgICAgICAgICAgdGFyZ2V0SWRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGhvdmVyQWxsVGFyZ2V0cyh0YXJnZXRJZHMsIG1vbml0b3IsIHJlZ2lzdHJ5KSB7XG4gICAgLy8gRmluYWxseSBjYWxsIGhvdmVyIG9uIGFsbCBtYXRjaGluZyB0YXJnZXRzLlxuICAgIHRhcmdldElkcy5mb3JFYWNoKGZ1bmN0aW9uKHRhcmdldElkKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHJlZ2lzdHJ5LmdldFRhcmdldCh0YXJnZXRJZCk7XG4gICAgICAgIHRhcmdldC5ob3Zlcihtb25pdG9yLCB0YXJnZXRJZCk7XG4gICAgfSk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhvdmVyLmpzLm1hcCIsImltcG9ydCB7IGNyZWF0ZUJlZ2luRHJhZyB9IGZyb20gJy4vYmVnaW5EcmFnLmpzJztcbmltcG9ydCB7IGNyZWF0ZURyb3AgfSBmcm9tICcuL2Ryb3AuanMnO1xuaW1wb3J0IHsgY3JlYXRlRW5kRHJhZyB9IGZyb20gJy4vZW5kRHJhZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVIb3ZlciB9IGZyb20gJy4vaG92ZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlUHVibGlzaERyYWdTb3VyY2UgfSBmcm9tICcuL3B1Ymxpc2hEcmFnU291cmNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURyYWdEcm9wQWN0aW9ucyhtYW5hZ2VyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmVnaW5EcmFnOiBjcmVhdGVCZWdpbkRyYWcobWFuYWdlciksXG4gICAgICAgIHB1Ymxpc2hEcmFnU291cmNlOiBjcmVhdGVQdWJsaXNoRHJhZ1NvdXJjZShtYW5hZ2VyKSxcbiAgICAgICAgaG92ZXI6IGNyZWF0ZUhvdmVyKG1hbmFnZXIpLFxuICAgICAgICBkcm9wOiBjcmVhdGVEcm9wKG1hbmFnZXIpLFxuICAgICAgICBlbmREcmFnOiBjcmVhdGVFbmREcmFnKG1hbmFnZXIpXG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgSU5JVF9DT09SRFMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gc2V0Q2xpZW50T2Zmc2V0KGNsaWVudE9mZnNldCwgc291cmNlQ2xpZW50T2Zmc2V0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogSU5JVF9DT09SRFMsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIHNvdXJjZUNsaWVudE9mZnNldDogc291cmNlQ2xpZW50T2Zmc2V0IHx8IG51bGwsXG4gICAgICAgICAgICBjbGllbnRPZmZzZXQ6IGNsaWVudE9mZnNldCB8fCBudWxsXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXRDbGllbnRPZmZzZXQuanMubWFwIiwiaW1wb3J0IHsgUFVCTElTSF9EUkFHX1NPVVJDRSB9IGZyb20gJy4vdHlwZXMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVB1Ymxpc2hEcmFnU291cmNlKG1hbmFnZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcHVibGlzaERyYWdTb3VyY2UoKSB7XG4gICAgICAgIGNvbnN0IG1vbml0b3IgPSBtYW5hZ2VyLmdldE1vbml0b3IoKTtcbiAgICAgICAgaWYgKG1vbml0b3IuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFBVQkxJU0hfRFJBR19TT1VSQ0VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1Ymxpc2hEcmFnU291cmNlLmpzLm1hcCIsImV4cG9ydCBjb25zdCBJTklUX0NPT1JEUyA9ICdkbmQtY29yZS9JTklUX0NPT1JEUyc7XG5leHBvcnQgY29uc3QgQkVHSU5fRFJBRyA9ICdkbmQtY29yZS9CRUdJTl9EUkFHJztcbmV4cG9ydCBjb25zdCBQVUJMSVNIX0RSQUdfU09VUkNFID0gJ2RuZC1jb3JlL1BVQkxJU0hfRFJBR19TT1VSQ0UnO1xuZXhwb3J0IGNvbnN0IEhPVkVSID0gJ2RuZC1jb3JlL0hPVkVSJztcbmV4cG9ydCBjb25zdCBEUk9QID0gJ2RuZC1jb3JlL0RST1AnO1xuZXhwb3J0IGNvbnN0IEVORF9EUkFHID0gJ2RuZC1jb3JlL0VORF9EUkFHJztcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiZXhwb3J0IGNvbnN0IEFERF9TT1VSQ0UgPSAnZG5kLWNvcmUvQUREX1NPVVJDRSc7XG5leHBvcnQgY29uc3QgQUREX1RBUkdFVCA9ICdkbmQtY29yZS9BRERfVEFSR0VUJztcbmV4cG9ydCBjb25zdCBSRU1PVkVfU09VUkNFID0gJ2RuZC1jb3JlL1JFTU9WRV9TT1VSQ0UnO1xuZXhwb3J0IGNvbnN0IFJFTU9WRV9UQVJHRVQgPSAnZG5kLWNvcmUvUkVNT1ZFX1RBUkdFVCc7XG5leHBvcnQgZnVuY3Rpb24gYWRkU291cmNlKHNvdXJjZUlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogQUREX1NPVVJDRSxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgc291cmNlSWRcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gYWRkVGFyZ2V0KHRhcmdldElkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogQUREX1RBUkdFVCxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgdGFyZ2V0SWRcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlU291cmNlKHNvdXJjZUlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogUkVNT1ZFX1NPVVJDRSxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgc291cmNlSWRcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVGFyZ2V0KHRhcmdldElkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogUkVNT1ZFX1RBUkdFVCxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgdGFyZ2V0SWRcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZ2lzdHJ5LmpzLm1hcCIsImltcG9ydCB7IGNyZWF0ZURyYWdEcm9wQWN0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvZHJhZ0Ryb3AvaW5kZXguanMnO1xuZXhwb3J0IGNsYXNzIERyYWdEcm9wTWFuYWdlckltcGwge1xuICAgIHJlY2VpdmVCYWNrZW5kKGJhY2tlbmQpIHtcbiAgICAgICAgdGhpcy5iYWNrZW5kID0gYmFja2VuZDtcbiAgICB9XG4gICAgZ2V0TW9uaXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9uaXRvcjtcbiAgICB9XG4gICAgZ2V0QmFja2VuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFja2VuZDtcbiAgICB9XG4gICAgZ2V0UmVnaXN0cnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbml0b3IucmVnaXN0cnk7XG4gICAgfVxuICAgIGdldEFjdGlvbnMoKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhcyAqLyBjb25zdCBtYW5hZ2VyID0gdGhpcztcbiAgICAgICAgY29uc3QgeyBkaXNwYXRjaCAgfSA9IHRoaXMuc3RvcmU7XG4gICAgICAgIGZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiAoLi4uYXJncyk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb24gPSBhY3Rpb25DcmVhdG9yLmFwcGx5KG1hbmFnZXIsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChhY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IGNyZWF0ZURyYWdEcm9wQWN0aW9ucyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGFjdGlvbnMpLnJlZHVjZSgoYm91bmRBY3Rpb25zLCBrZXkpPT57XG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSBhY3Rpb25zW2tleV07XG4gICAgICAgICAgICBib3VuZEFjdGlvbnNba2V5XSA9IGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYm91bmRBY3Rpb25zO1xuICAgICAgICB9LCB7fSk7XG4gICAgfVxuICAgIGRpc3BhdGNoKGFjdGlvbikge1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGFjdGlvbik7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHN0b3JlLCBtb25pdG9yKXtcbiAgICAgICAgdGhpcy5pc1NldFVwID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFuZGxlUmVmQ291bnRDaGFuZ2UgPSAoKT0+e1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2V0VXAgPSB0aGlzLnN0b3JlLmdldFN0YXRlKCkucmVmQ291bnQgPiAwO1xuICAgICAgICAgICAgaWYgKHRoaXMuYmFja2VuZCkge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTZXRVcCAmJiAhdGhpcy5pc1NldFVwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja2VuZC5zZXR1cCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2V0VXAgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXNob3VsZFNldFVwICYmIHRoaXMuaXNTZXRVcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2tlbmQudGVhcmRvd24oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NldFVwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7XG4gICAgICAgIHRoaXMubW9uaXRvciA9IG1vbml0b3I7XG4gICAgICAgIHN0b3JlLnN1YnNjcmliZSh0aGlzLmhhbmRsZVJlZkNvdW50Q2hhbmdlKTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURyYWdEcm9wTWFuYWdlckltcGwuanMubWFwIiwiaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnQHJlYWN0LWRuZC9pbnZhcmlhbnQnO1xuaW1wb3J0IHsgZ2V0RGlmZmVyZW5jZUZyb21Jbml0aWFsT2Zmc2V0LCBnZXRTb3VyY2VDbGllbnRPZmZzZXQgfSBmcm9tICcuLi91dGlscy9jb29yZHMuanMnO1xuaW1wb3J0IHsgYXJlRGlydHkgfSBmcm9tICcuLi91dGlscy9kaXJ0aW5lc3MuanMnO1xuaW1wb3J0IHsgbWF0Y2hlc1R5cGUgfSBmcm9tICcuLi91dGlscy9tYXRjaGVzVHlwZS5qcyc7XG5leHBvcnQgY2xhc3MgRHJhZ0Ryb3BNb25pdG9ySW1wbCB7XG4gICAgc3Vic2NyaWJlVG9TdGF0ZUNoYW5nZShsaXN0ZW5lciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgaGFuZGxlcklkcyAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGludmFyaWFudCh0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicsICdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgICAgIGludmFyaWFudCh0eXBlb2YgaGFuZGxlcklkcyA9PT0gJ3VuZGVmaW5lZCcgfHwgQXJyYXkuaXNBcnJheShoYW5kbGVySWRzKSwgJ2hhbmRsZXJJZHMsIHdoZW4gc3BlY2lmaWVkLCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MuJyk7XG4gICAgICAgIGxldCBwcmV2U3RhdGVJZCA9IHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5zdGF0ZUlkO1xuICAgICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKT0+e1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdGVJZCA9IHN0YXRlLnN0YXRlSWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhblNraXBMaXN0ZW5lciA9IGN1cnJlbnRTdGF0ZUlkID09PSBwcmV2U3RhdGVJZCB8fCBjdXJyZW50U3RhdGVJZCA9PT0gcHJldlN0YXRlSWQgKyAxICYmICFhcmVEaXJ0eShzdGF0ZS5kaXJ0eUhhbmRsZXJJZHMsIGhhbmRsZXJJZHMpO1xuICAgICAgICAgICAgICAgIGlmICghY2FuU2tpcExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBmaW5hbGx5e1xuICAgICAgICAgICAgICAgIHByZXZTdGF0ZUlkID0gY3VycmVudFN0YXRlSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnN1YnNjcmliZShoYW5kbGVDaGFuZ2UpO1xuICAgIH1cbiAgICBzdWJzY3JpYmVUb09mZnNldENoYW5nZShsaXN0ZW5lcikge1xuICAgICAgICBpbnZhcmlhbnQodHlwZW9mIGxpc3RlbmVyID09PSAnZnVuY3Rpb24nLCAnbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgICAgICBsZXQgcHJldmlvdXNTdGF0ZSA9IHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT2Zmc2V0O1xuICAgICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKT0+e1xuICAgICAgICAgICAgY29uc3QgbmV4dFN0YXRlID0gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPZmZzZXQ7XG4gICAgICAgICAgICBpZiAobmV4dFN0YXRlID09PSBwcmV2aW91c1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldmlvdXNTdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICAgICAgICAgIGxpc3RlbmVyKCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnN1YnNjcmliZShoYW5kbGVDaGFuZ2UpO1xuICAgIH1cbiAgICBjYW5EcmFnU291cmNlKHNvdXJjZUlkKSB7XG4gICAgICAgIGlmICghc291cmNlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlZ2lzdHJ5LmdldFNvdXJjZShzb3VyY2VJZCk7XG4gICAgICAgIGludmFyaWFudChzb3VyY2UsIGBFeHBlY3RlZCB0byBmaW5kIGEgdmFsaWQgc291cmNlLiBzb3VyY2VJZD0ke3NvdXJjZUlkfWApO1xuICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlLmNhbkRyYWcodGhpcywgc291cmNlSWQpO1xuICAgIH1cbiAgICBjYW5Ecm9wT25UYXJnZXQodGFyZ2V0SWQpIHtcbiAgICAgICAgLy8gdW5kZWZpbmVkIG9uIGluaXRpYWwgcmVuZGVyXG4gICAgICAgIGlmICghdGFyZ2V0SWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlZ2lzdHJ5LmdldFRhcmdldCh0YXJnZXRJZCk7XG4gICAgICAgIGludmFyaWFudCh0YXJnZXQsIGBFeHBlY3RlZCB0byBmaW5kIGEgdmFsaWQgdGFyZ2V0LiB0YXJnZXRJZD0ke3RhcmdldElkfWApO1xuICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZygpIHx8IHRoaXMuZGlkRHJvcCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFyZ2V0VHlwZSA9IHRoaXMucmVnaXN0cnkuZ2V0VGFyZ2V0VHlwZSh0YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IGRyYWdnZWRJdGVtVHlwZSA9IHRoaXMuZ2V0SXRlbVR5cGUoKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNUeXBlKHRhcmdldFR5cGUsIGRyYWdnZWRJdGVtVHlwZSkgJiYgdGFyZ2V0LmNhbkRyb3AodGhpcywgdGFyZ2V0SWQpO1xuICAgIH1cbiAgICBpc0RyYWdnaW5nKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLmdldEl0ZW1UeXBlKCkpO1xuICAgIH1cbiAgICBpc0RyYWdnaW5nU291cmNlKHNvdXJjZUlkKSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCBvbiBpbml0aWFsIHJlbmRlclxuICAgICAgICBpZiAoIXNvdXJjZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5yZWdpc3RyeS5nZXRTb3VyY2Uoc291cmNlSWQsIHRydWUpO1xuICAgICAgICBpbnZhcmlhbnQoc291cmNlLCBgRXhwZWN0ZWQgdG8gZmluZCBhIHZhbGlkIHNvdXJjZS4gc291cmNlSWQ9JHtzb3VyY2VJZH1gKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcoKSB8fCAhdGhpcy5pc1NvdXJjZVB1YmxpYygpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlVHlwZSA9IHRoaXMucmVnaXN0cnkuZ2V0U291cmNlVHlwZShzb3VyY2VJZCk7XG4gICAgICAgIGNvbnN0IGRyYWdnZWRJdGVtVHlwZSA9IHRoaXMuZ2V0SXRlbVR5cGUoKTtcbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgIT09IGRyYWdnZWRJdGVtVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2UuaXNEcmFnZ2luZyh0aGlzLCBzb3VyY2VJZCk7XG4gICAgfVxuICAgIGlzT3ZlclRhcmdldCh0YXJnZXRJZCwgb3B0aW9ucyA9IHtcbiAgICAgICAgc2hhbGxvdzogZmFsc2VcbiAgICB9KSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCBvbiBpbml0aWFsIHJlbmRlclxuICAgICAgICBpZiAoIXRhcmdldElkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzaGFsbG93ICB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldFR5cGUgPSB0aGlzLnJlZ2lzdHJ5LmdldFRhcmdldFR5cGUodGFyZ2V0SWQpO1xuICAgICAgICBjb25zdCBkcmFnZ2VkSXRlbVR5cGUgPSB0aGlzLmdldEl0ZW1UeXBlKCk7XG4gICAgICAgIGlmIChkcmFnZ2VkSXRlbVR5cGUgJiYgIW1hdGNoZXNUeXBlKHRhcmdldFR5cGUsIGRyYWdnZWRJdGVtVHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXRJZHMgPSB0aGlzLmdldFRhcmdldElkcygpO1xuICAgICAgICBpZiAoIXRhcmdldElkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IHRhcmdldElkcy5pbmRleE9mKHRhcmdldElkKTtcbiAgICAgICAgaWYgKHNoYWxsb3cpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRleCA9PT0gdGFyZ2V0SWRzLmxlbmd0aCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXggPiAtMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRJdGVtVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT3BlcmF0aW9uLml0ZW1UeXBlO1xuICAgIH1cbiAgICBnZXRJdGVtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPcGVyYXRpb24uaXRlbTtcbiAgICB9XG4gICAgZ2V0U291cmNlSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09wZXJhdGlvbi5zb3VyY2VJZDtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0SWRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPcGVyYXRpb24udGFyZ2V0SWRzO1xuICAgIH1cbiAgICBnZXREcm9wUmVzdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPcGVyYXRpb24uZHJvcFJlc3VsdDtcbiAgICB9XG4gICAgZGlkRHJvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKS5kcmFnT3BlcmF0aW9uLmRpZERyb3A7XG4gICAgfVxuICAgIGlzU291cmNlUHVibGljKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09wZXJhdGlvbi5pc1NvdXJjZVB1YmxpYyk7XG4gICAgfVxuICAgIGdldEluaXRpYWxDbGllbnRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKCkuZHJhZ09mZnNldC5pbml0aWFsQ2xpZW50T2Zmc2V0O1xuICAgIH1cbiAgICBnZXRJbml0aWFsU291cmNlQ2xpZW50T2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPZmZzZXQuaW5pdGlhbFNvdXJjZUNsaWVudE9mZnNldDtcbiAgICB9XG4gICAgZ2V0Q2xpZW50T2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPZmZzZXQuY2xpZW50T2Zmc2V0O1xuICAgIH1cbiAgICBnZXRTb3VyY2VDbGllbnRPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiBnZXRTb3VyY2VDbGllbnRPZmZzZXQodGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPZmZzZXQpO1xuICAgIH1cbiAgICBnZXREaWZmZXJlbmNlRnJvbUluaXRpYWxPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiBnZXREaWZmZXJlbmNlRnJvbUluaXRpYWxPZmZzZXQodGhpcy5zdG9yZS5nZXRTdGF0ZSgpLmRyYWdPZmZzZXQpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihzdG9yZSwgcmVnaXN0cnkpe1xuICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURyYWdEcm9wTW9uaXRvckltcGwuanMubWFwIiwiaW1wb3J0IHsgYXNhcCB9IGZyb20gJ0ByZWFjdC1kbmQvYXNhcCc7XG5pbXBvcnQgeyBpbnZhcmlhbnQgfSBmcm9tICdAcmVhY3QtZG5kL2ludmFyaWFudCc7XG5pbXBvcnQgeyBhZGRTb3VyY2UsIGFkZFRhcmdldCwgcmVtb3ZlU291cmNlLCByZW1vdmVUYXJnZXQgfSBmcm9tICcuLi9hY3Rpb25zL3JlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IHZhbGlkYXRlU291cmNlQ29udHJhY3QsIHZhbGlkYXRlVGFyZ2V0Q29udHJhY3QsIHZhbGlkYXRlVHlwZSB9IGZyb20gJy4uL2NvbnRyYWN0cy5qcyc7XG5pbXBvcnQgeyBIYW5kbGVyUm9sZSB9IGZyb20gJy4uL2ludGVyZmFjZXMuanMnO1xuaW1wb3J0IHsgZ2V0TmV4dFVuaXF1ZUlkIH0gZnJvbSAnLi4vdXRpbHMvZ2V0TmV4dFVuaXF1ZUlkLmpzJztcbmZ1bmN0aW9uIGdldE5leHRIYW5kbGVySWQocm9sZSkge1xuICAgIGNvbnN0IGlkID0gZ2V0TmV4dFVuaXF1ZUlkKCkudG9TdHJpbmcoKTtcbiAgICBzd2l0Y2gocm9sZSl7XG4gICAgICAgIGNhc2UgSGFuZGxlclJvbGUuU09VUkNFOlxuICAgICAgICAgICAgcmV0dXJuIGBTJHtpZH1gO1xuICAgICAgICBjYXNlIEhhbmRsZXJSb2xlLlRBUkdFVDpcbiAgICAgICAgICAgIHJldHVybiBgVCR7aWR9YDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBIYW5kbGVyIFJvbGU6ICR7cm9sZX1gKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZVJvbGVGcm9tSGFuZGxlcklkKGhhbmRsZXJJZCkge1xuICAgIHN3aXRjaChoYW5kbGVySWRbMF0pe1xuICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICAgIHJldHVybiBIYW5kbGVyUm9sZS5TT1VSQ0U7XG4gICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZXJSb2xlLlRBUkdFVDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIGhhbmRsZXIgSUQ6ICR7aGFuZGxlcklkfWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1hcENvbnRhaW5zVmFsdWUobWFwLCBzZWFyY2hWYWx1ZSkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBtYXAuZW50cmllcygpO1xuICAgIGxldCBpc0RvbmUgPSBmYWxzZTtcbiAgICBkbyB7XG4gICAgICAgIGNvbnN0IHsgZG9uZSAsIHZhbHVlOiBbLCB2YWx1ZV0gLCAgfSA9IGVudHJpZXMubmV4dCgpO1xuICAgICAgICBpZiAodmFsdWUgPT09IHNlYXJjaFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpc0RvbmUgPSAhIWRvbmU7XG4gICAgfXdoaWxlICghaXNEb25lKVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBjbGFzcyBIYW5kbGVyUmVnaXN0cnlJbXBsIHtcbiAgICBhZGRTb3VyY2UodHlwZSwgc291cmNlKSB7XG4gICAgICAgIHZhbGlkYXRlVHlwZSh0eXBlKTtcbiAgICAgICAgdmFsaWRhdGVTb3VyY2VDb250cmFjdChzb3VyY2UpO1xuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IHRoaXMuYWRkSGFuZGxlcihIYW5kbGVyUm9sZS5TT1VSQ0UsIHR5cGUsIHNvdXJjZSk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goYWRkU291cmNlKHNvdXJjZUlkKSk7XG4gICAgICAgIHJldHVybiBzb3VyY2VJZDtcbiAgICB9XG4gICAgYWRkVGFyZ2V0KHR5cGUsIHRhcmdldCkge1xuICAgICAgICB2YWxpZGF0ZVR5cGUodHlwZSwgdHJ1ZSk7XG4gICAgICAgIHZhbGlkYXRlVGFyZ2V0Q29udHJhY3QodGFyZ2V0KTtcbiAgICAgICAgY29uc3QgdGFyZ2V0SWQgPSB0aGlzLmFkZEhhbmRsZXIoSGFuZGxlclJvbGUuVEFSR0VULCB0eXBlLCB0YXJnZXQpO1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGFkZFRhcmdldCh0YXJnZXRJZCkpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0SWQ7XG4gICAgfVxuICAgIGNvbnRhaW5zSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiBtYXBDb250YWluc1ZhbHVlKHRoaXMuZHJhZ1NvdXJjZXMsIGhhbmRsZXIpIHx8IG1hcENvbnRhaW5zVmFsdWUodGhpcy5kcm9wVGFyZ2V0cywgaGFuZGxlcik7XG4gICAgfVxuICAgIGdldFNvdXJjZShzb3VyY2VJZCwgaW5jbHVkZVBpbm5lZCA9IGZhbHNlKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzU291cmNlSWQoc291cmNlSWQpLCAnRXhwZWN0ZWQgYSB2YWxpZCBzb3VyY2UgSUQuJyk7XG4gICAgICAgIGNvbnN0IGlzUGlubmVkID0gaW5jbHVkZVBpbm5lZCAmJiBzb3VyY2VJZCA9PT0gdGhpcy5waW5uZWRTb3VyY2VJZDtcbiAgICAgICAgY29uc3Qgc291cmNlID0gaXNQaW5uZWQgPyB0aGlzLnBpbm5lZFNvdXJjZSA6IHRoaXMuZHJhZ1NvdXJjZXMuZ2V0KHNvdXJjZUlkKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0KHRhcmdldElkKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmlzVGFyZ2V0SWQodGFyZ2V0SWQpLCAnRXhwZWN0ZWQgYSB2YWxpZCB0YXJnZXQgSUQuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLmRyb3BUYXJnZXRzLmdldCh0YXJnZXRJZCk7XG4gICAgfVxuICAgIGdldFNvdXJjZVR5cGUoc291cmNlSWQpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuaXNTb3VyY2VJZChzb3VyY2VJZCksICdFeHBlY3RlZCBhIHZhbGlkIHNvdXJjZSBJRC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZXMuZ2V0KHNvdXJjZUlkKTtcbiAgICB9XG4gICAgZ2V0VGFyZ2V0VHlwZSh0YXJnZXRJZCkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5pc1RhcmdldElkKHRhcmdldElkKSwgJ0V4cGVjdGVkIGEgdmFsaWQgdGFyZ2V0IElELicpO1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlcy5nZXQodGFyZ2V0SWQpO1xuICAgIH1cbiAgICBpc1NvdXJjZUlkKGhhbmRsZXJJZCkge1xuICAgICAgICBjb25zdCByb2xlID0gcGFyc2VSb2xlRnJvbUhhbmRsZXJJZChoYW5kbGVySWQpO1xuICAgICAgICByZXR1cm4gcm9sZSA9PT0gSGFuZGxlclJvbGUuU09VUkNFO1xuICAgIH1cbiAgICBpc1RhcmdldElkKGhhbmRsZXJJZCkge1xuICAgICAgICBjb25zdCByb2xlID0gcGFyc2VSb2xlRnJvbUhhbmRsZXJJZChoYW5kbGVySWQpO1xuICAgICAgICByZXR1cm4gcm9sZSA9PT0gSGFuZGxlclJvbGUuVEFSR0VUO1xuICAgIH1cbiAgICByZW1vdmVTb3VyY2Uoc291cmNlSWQpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuZ2V0U291cmNlKHNvdXJjZUlkKSwgJ0V4cGVjdGVkIGFuIGV4aXN0aW5nIHNvdXJjZS4nKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChyZW1vdmVTb3VyY2Uoc291cmNlSWQpKTtcbiAgICAgICAgYXNhcCgoKT0+e1xuICAgICAgICAgICAgdGhpcy5kcmFnU291cmNlcy5kZWxldGUoc291cmNlSWQpO1xuICAgICAgICAgICAgdGhpcy50eXBlcy5kZWxldGUoc291cmNlSWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVtb3ZlVGFyZ2V0KHRhcmdldElkKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLmdldFRhcmdldCh0YXJnZXRJZCksICdFeHBlY3RlZCBhbiBleGlzdGluZyB0YXJnZXQuJyk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gocmVtb3ZlVGFyZ2V0KHRhcmdldElkKSk7XG4gICAgICAgIHRoaXMuZHJvcFRhcmdldHMuZGVsZXRlKHRhcmdldElkKTtcbiAgICAgICAgdGhpcy50eXBlcy5kZWxldGUodGFyZ2V0SWQpO1xuICAgIH1cbiAgICBwaW5Tb3VyY2Uoc291cmNlSWQpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5nZXRTb3VyY2Uoc291cmNlSWQpO1xuICAgICAgICBpbnZhcmlhbnQoc291cmNlLCAnRXhwZWN0ZWQgYW4gZXhpc3Rpbmcgc291cmNlLicpO1xuICAgICAgICB0aGlzLnBpbm5lZFNvdXJjZUlkID0gc291cmNlSWQ7XG4gICAgICAgIHRoaXMucGlubmVkU291cmNlID0gc291cmNlO1xuICAgIH1cbiAgICB1bnBpblNvdXJjZSgpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMucGlubmVkU291cmNlLCAnTm8gc291cmNlIGlzIHBpbm5lZCBhdCB0aGUgdGltZS4nKTtcbiAgICAgICAgdGhpcy5waW5uZWRTb3VyY2VJZCA9IG51bGw7XG4gICAgICAgIHRoaXMucGlubmVkU291cmNlID0gbnVsbDtcbiAgICB9XG4gICAgYWRkSGFuZGxlcihyb2xlLCB0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgIGNvbnN0IGlkID0gZ2V0TmV4dEhhbmRsZXJJZChyb2xlKTtcbiAgICAgICAgdGhpcy50eXBlcy5zZXQoaWQsIHR5cGUpO1xuICAgICAgICBpZiAocm9sZSA9PT0gSGFuZGxlclJvbGUuU09VUkNFKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdTb3VyY2VzLnNldChpZCwgaGFuZGxlcik7XG4gICAgICAgIH0gZWxzZSBpZiAocm9sZSA9PT0gSGFuZGxlclJvbGUuVEFSR0VUKSB7XG4gICAgICAgICAgICB0aGlzLmRyb3BUYXJnZXRzLnNldChpZCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihzdG9yZSl7XG4gICAgICAgIHRoaXMudHlwZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZHJvcFRhcmdldHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMucGlubmVkU291cmNlSWQgPSBudWxsO1xuICAgICAgICB0aGlzLnBpbm5lZFNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhhbmRsZXJSZWdpc3RyeUltcGwuanMubWFwIiwiaW1wb3J0IHsgaW52YXJpYW50IH0gZnJvbSAnQHJlYWN0LWRuZC9pbnZhcmlhbnQnO1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU291cmNlQ29udHJhY3Qoc291cmNlKSB7XG4gICAgaW52YXJpYW50KHR5cGVvZiBzb3VyY2UuY2FuRHJhZyA9PT0gJ2Z1bmN0aW9uJywgJ0V4cGVjdGVkIGNhbkRyYWcgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHNvdXJjZS5iZWdpbkRyYWcgPT09ICdmdW5jdGlvbicsICdFeHBlY3RlZCBiZWdpbkRyYWcgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHNvdXJjZS5lbmREcmFnID09PSAnZnVuY3Rpb24nLCAnRXhwZWN0ZWQgZW5kRHJhZyB0byBiZSBhIGZ1bmN0aW9uLicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVGFyZ2V0Q29udHJhY3QodGFyZ2V0KSB7XG4gICAgaW52YXJpYW50KHR5cGVvZiB0YXJnZXQuY2FuRHJvcCA9PT0gJ2Z1bmN0aW9uJywgJ0V4cGVjdGVkIGNhbkRyb3AgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICBpbnZhcmlhbnQodHlwZW9mIHRhcmdldC5ob3ZlciA9PT0gJ2Z1bmN0aW9uJywgJ0V4cGVjdGVkIGhvdmVyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgaW52YXJpYW50KHR5cGVvZiB0YXJnZXQuZHJvcCA9PT0gJ2Z1bmN0aW9uJywgJ0V4cGVjdGVkIGJlZ2luRHJhZyB0byBiZSBhIGZ1bmN0aW9uLicpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVHlwZSh0eXBlLCBhbGxvd0FycmF5KSB7XG4gICAgaWYgKGFsbG93QXJyYXkgJiYgQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgICB0eXBlLmZvckVhY2goKHQpPT52YWxpZGF0ZVR5cGUodCwgZmFsc2UpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW52YXJpYW50KHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ3N5bWJvbCcsIGFsbG93QXJyYXkgPyAnVHlwZSBjYW4gb25seSBiZSBhIHN0cmluZywgYSBzeW1ib2wsIG9yIGFuIGFycmF5IG9mIGVpdGhlci4nIDogJ1R5cGUgY2FuIG9ubHkgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wuJyk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRyYWN0cy5qcy5tYXAiLCJpbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3JlZHV4JztcbmltcG9ydCB7IERyYWdEcm9wTWFuYWdlckltcGwgfSBmcm9tICcuL2NsYXNzZXMvRHJhZ0Ryb3BNYW5hZ2VySW1wbC5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcE1vbml0b3JJbXBsIH0gZnJvbSAnLi9jbGFzc2VzL0RyYWdEcm9wTW9uaXRvckltcGwuanMnO1xuaW1wb3J0IHsgSGFuZGxlclJlZ2lzdHJ5SW1wbCB9IGZyb20gJy4vY2xhc3Nlcy9IYW5kbGVyUmVnaXN0cnlJbXBsLmpzJztcbmltcG9ydCB7IHJlZHVjZSB9IGZyb20gJy4vcmVkdWNlcnMvaW5kZXguanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURyYWdEcm9wTWFuYWdlcihiYWNrZW5kRmFjdG9yeSwgZ2xvYmFsQ29udGV4dCA9IHVuZGVmaW5lZCwgYmFja2VuZE9wdGlvbnMgPSB7fSwgZGVidWdNb2RlID0gZmFsc2UpIHtcbiAgICBjb25zdCBzdG9yZSA9IG1ha2VTdG9yZUluc3RhbmNlKGRlYnVnTW9kZSk7XG4gICAgY29uc3QgbW9uaXRvciA9IG5ldyBEcmFnRHJvcE1vbml0b3JJbXBsKHN0b3JlLCBuZXcgSGFuZGxlclJlZ2lzdHJ5SW1wbChzdG9yZSkpO1xuICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgRHJhZ0Ryb3BNYW5hZ2VySW1wbChzdG9yZSwgbW9uaXRvcik7XG4gICAgY29uc3QgYmFja2VuZCA9IGJhY2tlbmRGYWN0b3J5KG1hbmFnZXIsIGdsb2JhbENvbnRleHQsIGJhY2tlbmRPcHRpb25zKTtcbiAgICBtYW5hZ2VyLnJlY2VpdmVCYWNrZW5kKGJhY2tlbmQpO1xuICAgIHJldHVybiBtYW5hZ2VyO1xufVxuZnVuY3Rpb24gbWFrZVN0b3JlSW5zdGFuY2UoZGVidWdNb2RlKSB7XG4gICAgLy8gVE9ETzogaWYgd2UgZXZlciBtYWtlIGEgcmVhY3QtbmF0aXZlIHZlcnNpb24gb2YgdGhpcyxcbiAgICAvLyB3ZSdsbCBuZWVkIHRvIGNvbnNpZGVyIGhvdyB0byBwdWxsIG9mZiBkZXYtdG9vbGluZ1xuICAgIGNvbnN0IHJlZHV4RGV2VG9vbHMgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXztcbiAgICByZXR1cm4gY3JlYXRlU3RvcmUocmVkdWNlLCBkZWJ1Z01vZGUgJiYgcmVkdXhEZXZUb29scyAmJiByZWR1eERldlRvb2xzKHtcbiAgICAgICAgbmFtZTogJ2RuZC1jb3JlJyxcbiAgICAgICAgaW5zdGFuY2VJZDogJ2RuZC1jb3JlJ1xuICAgIH0pKTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3JlYXRlRHJhZ0Ryb3BNYW5hZ2VyLmpzLm1hcCIsImV4cG9ydCB2YXIgSGFuZGxlclJvbGU7XG4oZnVuY3Rpb24oSGFuZGxlclJvbGUpIHtcbiAgICBIYW5kbGVyUm9sZVtcIlNPVVJDRVwiXSA9IFwiU09VUkNFXCI7XG4gICAgSGFuZGxlclJvbGVbXCJUQVJHRVRcIl0gPSBcIlRBUkdFVFwiO1xufSkoSGFuZGxlclJvbGUgfHwgKEhhbmRsZXJSb2xlID0ge30pKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJmYWNlcy5qcy5tYXAiLCJpbXBvcnQgeyBCRUdJTl9EUkFHLCBEUk9QLCBFTkRfRFJBRywgSE9WRVIsIFBVQkxJU0hfRFJBR19TT1VSQ0UgfSBmcm9tICcuLi9hY3Rpb25zL2RyYWdEcm9wL2luZGV4LmpzJztcbmltcG9ydCB7IEFERF9TT1VSQ0UsIEFERF9UQVJHRVQsIFJFTU9WRV9TT1VSQ0UsIFJFTU9WRV9UQVJHRVQgfSBmcm9tICcuLi9hY3Rpb25zL3JlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IEFMTCwgTk9ORSB9IGZyb20gJy4uL3V0aWxzL2RpcnRpbmVzcy5qcyc7XG5pbXBvcnQgeyBhcmVBcnJheXNFcXVhbCB9IGZyb20gJy4uL3V0aWxzL2VxdWFsaXR5LmpzJztcbmltcG9ydCB7IHhvciB9IGZyb20gJy4uL3V0aWxzL2pzX3V0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2UoLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuX3N0YXRlID0gTk9ORSwgYWN0aW9uKSB7XG4gICAgc3dpdGNoKGFjdGlvbi50eXBlKXtcbiAgICAgICAgY2FzZSBIT1ZFUjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEFERF9TT1VSQ0U6XG4gICAgICAgIGNhc2UgQUREX1RBUkdFVDpcbiAgICAgICAgY2FzZSBSRU1PVkVfVEFSR0VUOlxuICAgICAgICBjYXNlIFJFTU9WRV9TT1VSQ0U6XG4gICAgICAgICAgICByZXR1cm4gTk9ORTtcbiAgICAgICAgY2FzZSBCRUdJTl9EUkFHOlxuICAgICAgICBjYXNlIFBVQkxJU0hfRFJBR19TT1VSQ0U6XG4gICAgICAgIGNhc2UgRU5EX0RSQUc6XG4gICAgICAgIGNhc2UgRFJPUDpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBBTEw7XG4gICAgfVxuICAgIGNvbnN0IHsgdGFyZ2V0SWRzID1bXSAsIHByZXZUYXJnZXRJZHMgPVtdICB9ID0gYWN0aW9uLnBheWxvYWQ7XG4gICAgY29uc3QgcmVzdWx0ID0geG9yKHRhcmdldElkcywgcHJldlRhcmdldElkcyk7XG4gICAgY29uc3QgZGlkQ2hhbmdlID0gcmVzdWx0Lmxlbmd0aCA+IDAgfHwgIWFyZUFycmF5c0VxdWFsKHRhcmdldElkcywgcHJldlRhcmdldElkcyk7XG4gICAgaWYgKCFkaWRDaGFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIE5PTkU7XG4gICAgfVxuICAgIC8vIENoZWNrIHRoZSB0YXJnZXQgaWRzIGF0IHRoZSBpbm5lcm1vc3QgcG9zaXRpb24uIElmIHRoZXkgYXJlIHZhbGlkLCBhZGQgdGhlbVxuICAgIC8vIHRvIHRoZSByZXN1bHRcbiAgICBjb25zdCBwcmV2SW5uZXJtb3N0VGFyZ2V0SWQgPSBwcmV2VGFyZ2V0SWRzW3ByZXZUYXJnZXRJZHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgaW5uZXJtb3N0VGFyZ2V0SWQgPSB0YXJnZXRJZHNbdGFyZ2V0SWRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChwcmV2SW5uZXJtb3N0VGFyZ2V0SWQgIT09IGlubmVybW9zdFRhcmdldElkKSB7XG4gICAgICAgIGlmIChwcmV2SW5uZXJtb3N0VGFyZ2V0SWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHByZXZJbm5lcm1vc3RUYXJnZXRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlubmVybW9zdFRhcmdldElkKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChpbm5lcm1vc3RUYXJnZXRJZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlydHlIYW5kbGVySWRzLmpzLm1hcCIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgICBmb3IodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbihzeW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5pbXBvcnQgeyBCRUdJTl9EUkFHLCBEUk9QLCBFTkRfRFJBRywgSE9WRVIsIElOSVRfQ09PUkRTIH0gZnJvbSAnLi4vYWN0aW9ucy9kcmFnRHJvcC9pbmRleC5qcyc7XG5pbXBvcnQgeyBhcmVDb29yZHNFcXVhbCB9IGZyb20gJy4uL3V0aWxzL2VxdWFsaXR5LmpzJztcbmNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICBpbml0aWFsU291cmNlQ2xpZW50T2Zmc2V0OiBudWxsLFxuICAgIGluaXRpYWxDbGllbnRPZmZzZXQ6IG51bGwsXG4gICAgY2xpZW50T2Zmc2V0OiBudWxsXG59O1xuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZShzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSB7XG4gICAgY29uc3QgeyBwYXlsb2FkICB9ID0gYWN0aW9uO1xuICAgIHN3aXRjaChhY3Rpb24udHlwZSl7XG4gICAgICAgIGNhc2UgSU5JVF9DT09SRFM6XG4gICAgICAgIGNhc2UgQkVHSU5fRFJBRzpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbFNvdXJjZUNsaWVudE9mZnNldDogcGF5bG9hZC5zb3VyY2VDbGllbnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgaW5pdGlhbENsaWVudE9mZnNldDogcGF5bG9hZC5jbGllbnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgY2xpZW50T2Zmc2V0OiBwYXlsb2FkLmNsaWVudE9mZnNldFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBIT1ZFUjpcbiAgICAgICAgICAgIGlmIChhcmVDb29yZHNFcXVhbChzdGF0ZS5jbGllbnRPZmZzZXQsIHBheWxvYWQuY2xpZW50T2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICAgICAgICAgIGNsaWVudE9mZnNldDogcGF5bG9hZC5jbGllbnRPZmZzZXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIEVORF9EUkFHOlxuICAgICAgICBjYXNlIERST1A6XG4gICAgICAgICAgICByZXR1cm4gaW5pdGlhbFN0YXRlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJhZ09mZnNldC5qcy5tYXAiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gICAgZm9yKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgICAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuaW1wb3J0IHsgQkVHSU5fRFJBRywgRFJPUCwgRU5EX0RSQUcsIEhPVkVSLCBQVUJMSVNIX0RSQUdfU09VUkNFIH0gZnJvbSAnLi4vYWN0aW9ucy9kcmFnRHJvcC9pbmRleC5qcyc7XG5pbXBvcnQgeyBSRU1PVkVfVEFSR0VUIH0gZnJvbSAnLi4vYWN0aW9ucy9yZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyB3aXRob3V0IH0gZnJvbSAnLi4vdXRpbHMvanNfdXRpbHMuanMnO1xuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICAgIGl0ZW1UeXBlOiBudWxsLFxuICAgIGl0ZW06IG51bGwsXG4gICAgc291cmNlSWQ6IG51bGwsXG4gICAgdGFyZ2V0SWRzOiBbXSxcbiAgICBkcm9wUmVzdWx0OiBudWxsLFxuICAgIGRpZERyb3A6IGZhbHNlLFxuICAgIGlzU291cmNlUHVibGljOiBudWxsXG59O1xuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZShzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSB7XG4gICAgY29uc3QgeyBwYXlsb2FkICB9ID0gYWN0aW9uO1xuICAgIHN3aXRjaChhY3Rpb24udHlwZSl7XG4gICAgICAgIGNhc2UgQkVHSU5fRFJBRzpcbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlOiBwYXlsb2FkLml0ZW1UeXBlLFxuICAgICAgICAgICAgICAgIGl0ZW06IHBheWxvYWQuaXRlbSxcbiAgICAgICAgICAgICAgICBzb3VyY2VJZDogcGF5bG9hZC5zb3VyY2VJZCxcbiAgICAgICAgICAgICAgICBpc1NvdXJjZVB1YmxpYzogcGF5bG9hZC5pc1NvdXJjZVB1YmxpYyxcbiAgICAgICAgICAgICAgICBkcm9wUmVzdWx0OiBudWxsLFxuICAgICAgICAgICAgICAgIGRpZERyb3A6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBQVUJMSVNIX0RSQUdfU09VUkNFOlxuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7XG4gICAgICAgICAgICAgICAgaXNTb3VyY2VQdWJsaWM6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIEhPVkVSOlxuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0SWRzOiBwYXlsb2FkLnRhcmdldElkc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgUkVNT1ZFX1RBUkdFVDpcbiAgICAgICAgICAgIGlmIChzdGF0ZS50YXJnZXRJZHMuaW5kZXhPZihwYXlsb2FkLnRhcmdldElkKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZCh7fSwgc3RhdGUsIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRJZHM6IHdpdGhvdXQoc3RhdGUudGFyZ2V0SWRzLCBwYXlsb2FkLnRhcmdldElkKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgRFJPUDpcbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzdGF0ZSwge1xuICAgICAgICAgICAgICAgIGRyb3BSZXN1bHQ6IHBheWxvYWQuZHJvcFJlc3VsdCxcbiAgICAgICAgICAgICAgICBkaWREcm9wOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRhcmdldElkczogW11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIEVORF9EUkFHOlxuICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe30sIHN0YXRlLCB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGU6IG51bGwsXG4gICAgICAgICAgICAgICAgaXRlbTogbnVsbCxcbiAgICAgICAgICAgICAgICBzb3VyY2VJZDogbnVsbCxcbiAgICAgICAgICAgICAgICBkcm9wUmVzdWx0OiBudWxsLFxuICAgICAgICAgICAgICAgIGRpZERyb3A6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzU291cmNlUHVibGljOiBudWxsLFxuICAgICAgICAgICAgICAgIHRhcmdldElkczogW11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJhZ09wZXJhdGlvbi5qcy5tYXAiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKGtleSBpbiBvYmopIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gICAgZm9yKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgICAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnLi4vdXRpbHMvanNfdXRpbHMuanMnO1xuaW1wb3J0IHsgcmVkdWNlIGFzIGRpcnR5SGFuZGxlcklkcyB9IGZyb20gJy4vZGlydHlIYW5kbGVySWRzLmpzJztcbmltcG9ydCB7IHJlZHVjZSBhcyBkcmFnT2Zmc2V0IH0gZnJvbSAnLi9kcmFnT2Zmc2V0LmpzJztcbmltcG9ydCB7IHJlZHVjZSBhcyBkcmFnT3BlcmF0aW9uIH0gZnJvbSAnLi9kcmFnT3BlcmF0aW9uLmpzJztcbmltcG9ydCB7IHJlZHVjZSBhcyByZWZDb3VudCB9IGZyb20gJy4vcmVmQ291bnQuanMnO1xuaW1wb3J0IHsgcmVkdWNlIGFzIHN0YXRlSWQgfSBmcm9tICcuL3N0YXRlSWQuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZShzdGF0ZSA9IHt9LCBhY3Rpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkaXJ0eUhhbmRsZXJJZHM6IGRpcnR5SGFuZGxlcklkcyhzdGF0ZS5kaXJ0eUhhbmRsZXJJZHMsIHtcbiAgICAgICAgICAgIHR5cGU6IGFjdGlvbi50eXBlLFxuICAgICAgICAgICAgcGF5bG9hZDogX29iamVjdFNwcmVhZCh7fSwgYWN0aW9uLnBheWxvYWQsIHtcbiAgICAgICAgICAgICAgICBwcmV2VGFyZ2V0SWRzOiBnZXQoc3RhdGUsICdkcmFnT3BlcmF0aW9uLnRhcmdldElkcycsIFtdKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSksXG4gICAgICAgIGRyYWdPZmZzZXQ6IGRyYWdPZmZzZXQoc3RhdGUuZHJhZ09mZnNldCwgYWN0aW9uKSxcbiAgICAgICAgcmVmQ291bnQ6IHJlZkNvdW50KHN0YXRlLnJlZkNvdW50LCBhY3Rpb24pLFxuICAgICAgICBkcmFnT3BlcmF0aW9uOiBkcmFnT3BlcmF0aW9uKHN0YXRlLmRyYWdPcGVyYXRpb24sIGFjdGlvbiksXG4gICAgICAgIHN0YXRlSWQ6IHN0YXRlSWQoc3RhdGUuc3RhdGVJZClcbiAgICB9O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBBRERfU09VUkNFLCBBRERfVEFSR0VULCBSRU1PVkVfU09VUkNFLCBSRU1PVkVfVEFSR0VUIH0gZnJvbSAnLi4vYWN0aW9ucy9yZWdpc3RyeS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKHN0YXRlID0gMCwgYWN0aW9uKSB7XG4gICAgc3dpdGNoKGFjdGlvbi50eXBlKXtcbiAgICAgICAgY2FzZSBBRERfU09VUkNFOlxuICAgICAgICBjYXNlIEFERF9UQVJHRVQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUgKyAxO1xuICAgICAgICBjYXNlIFJFTU9WRV9TT1VSQ0U6XG4gICAgICAgIGNhc2UgUkVNT1ZFX1RBUkdFVDpcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZSAtIDE7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWZDb3VudC5qcy5tYXAiLCJleHBvcnQgZnVuY3Rpb24gcmVkdWNlKHN0YXRlID0gMCkge1xuICAgIHJldHVybiBzdGF0ZSArIDE7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0YXRlSWQuanMubWFwIiwiLyoqXG4gKiBDb29yZGluYXRlIGFkZGl0aW9uXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgY29vcmRpbmF0ZVxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBjb29yZGluYXRlXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGFkZChhLCBiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogYS54ICsgYi54LFxuICAgICAgICB5OiBhLnkgKyBiLnlcbiAgICB9O1xufVxuLyoqXG4gKiBDb29yZGluYXRlIHN1YnRyYWN0aW9uXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgY29vcmRpbmF0ZVxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBjb29yZGluYXRlXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KGEsIGIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBhLnggLSBiLngsXG4gICAgICAgIHk6IGEueSAtIGIueVxuICAgIH07XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGNhcnRlc2lhbiBkaXN0YW5jZSBvZiB0aGUgZHJhZyBzb3VyY2UgY29tcG9uZW50J3MgcG9zaXRpb24sIGJhc2VkIG9uIGl0cyBwb3NpdGlvblxuICogYXQgdGhlIHRpbWUgd2hlbiB0aGUgY3VycmVudCBkcmFnIG9wZXJhdGlvbiBoYXMgc3RhcnRlZCwgYW5kIHRoZSBtb3ZlbWVudCBkaWZmZXJlbmNlLlxuICpcbiAqIFJldHVybnMgbnVsbCBpZiBubyBpdGVtIGlzIGJlaW5nIGRyYWdnZWQuXG4gKlxuICogQHBhcmFtIHN0YXRlIFRoZSBvZmZzZXQgc3RhdGUgdG8gY29tcHV0ZSBmcm9tXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldFNvdXJjZUNsaWVudE9mZnNldChzdGF0ZSkge1xuICAgIGNvbnN0IHsgY2xpZW50T2Zmc2V0ICwgaW5pdGlhbENsaWVudE9mZnNldCAsIGluaXRpYWxTb3VyY2VDbGllbnRPZmZzZXQgIH0gPSBzdGF0ZTtcbiAgICBpZiAoIWNsaWVudE9mZnNldCB8fCAhaW5pdGlhbENsaWVudE9mZnNldCB8fCAhaW5pdGlhbFNvdXJjZUNsaWVudE9mZnNldCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHN1YnRyYWN0KGFkZChjbGllbnRPZmZzZXQsIGluaXRpYWxTb3VyY2VDbGllbnRPZmZzZXQpLCBpbml0aWFsQ2xpZW50T2Zmc2V0KTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgeCx5IG9mZnNldCBiZXR3ZWVuIHRoZSBjbGllbnQgb2Zmc2V0IGFuZCB0aGUgaW5pdGlhbCBjbGllbnQgb2Zmc2V0XG4gKlxuICogQHBhcmFtIHN0YXRlIFRoZSBvZmZzZXQgc3RhdGUgdG8gY29tcHV0ZSBmcm9tXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGdldERpZmZlcmVuY2VGcm9tSW5pdGlhbE9mZnNldChzdGF0ZSkge1xuICAgIGNvbnN0IHsgY2xpZW50T2Zmc2V0ICwgaW5pdGlhbENsaWVudE9mZnNldCAgfSA9IHN0YXRlO1xuICAgIGlmICghY2xpZW50T2Zmc2V0IHx8ICFpbml0aWFsQ2xpZW50T2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gc3VidHJhY3QoY2xpZW50T2Zmc2V0LCBpbml0aWFsQ2xpZW50T2Zmc2V0KTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29vcmRzLmpzLm1hcCIsImltcG9ydCB7IGludGVyc2VjdGlvbiB9IGZyb20gJy4vanNfdXRpbHMuanMnO1xuZXhwb3J0IGNvbnN0IE5PTkUgPSBbXTtcbmV4cG9ydCBjb25zdCBBTEwgPSBbXTtcbk5PTkUuX19JU19OT05FX18gPSB0cnVlO1xuQUxMLl9fSVNfQUxMX18gPSB0cnVlO1xuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBoYW5kbGVyIElEcyBhcmUgZGlydHkgb3Igbm90LlxuICpcbiAqIEBwYXJhbSBkaXJ0eUlkcyBUaGUgc2V0IG9mIGRpcnR5IGhhbmRsZXIgaWRzXG4gKiBAcGFyYW0gaGFuZGxlcklkcyBUaGUgc2V0IG9mIGhhbmRsZXIgaWRzIHRvIGNoZWNrXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGFyZURpcnR5KGRpcnR5SWRzLCBoYW5kbGVySWRzKSB7XG4gICAgaWYgKGRpcnR5SWRzID09PSBOT05FKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRpcnR5SWRzID09PSBBTEwgfHwgdHlwZW9mIGhhbmRsZXJJZHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBjb21tb25JZHMgPSBpbnRlcnNlY3Rpb24oaGFuZGxlcklkcywgZGlydHlJZHMpO1xuICAgIHJldHVybiBjb21tb25JZHMubGVuZ3RoID4gMDtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlydGluZXNzLmpzLm1hcCIsImV4cG9ydCBjb25zdCBzdHJpY3RFcXVhbGl0eSA9IChhLCBiKT0+YSA9PT0gYlxuO1xuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdHdvIGNhcnRlc2lhbiBjb29yZGluYXRlIG9mZnNldHMgYXJlIGVxdWFsXG4gKiBAcGFyYW0gb2Zmc2V0QVxuICogQHBhcmFtIG9mZnNldEJcbiAqLyBleHBvcnQgZnVuY3Rpb24gYXJlQ29vcmRzRXF1YWwob2Zmc2V0QSwgb2Zmc2V0Qikge1xuICAgIGlmICghb2Zmc2V0QSAmJiAhb2Zmc2V0Qikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFvZmZzZXRBIHx8ICFvZmZzZXRCKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gb2Zmc2V0QS54ID09PSBvZmZzZXRCLnggJiYgb2Zmc2V0QS55ID09PSBvZmZzZXRCLnk7XG4gICAgfVxufVxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHR3byBhcnJheXMgb2YgaXRlbXMgYXJlIGVxdWFsXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgYXJyYXkgb2YgaXRlbXNcbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgYXJyYXkgb2YgaXRlbXNcbiAqLyBleHBvcnQgZnVuY3Rpb24gYXJlQXJyYXlzRXF1YWwoYSwgYiwgaXNFcXVhbCA9IHN0cmljdEVxdWFsaXR5KSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgKytpKXtcbiAgICAgICAgaWYgKCFpc0VxdWFsKGFbaV0sIGJbaV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVxdWFsaXR5LmpzLm1hcCIsImxldCBuZXh0VW5pcXVlSWQgPSAwO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5leHRVbmlxdWVJZCgpIHtcbiAgICByZXR1cm4gbmV4dFVuaXF1ZUlkKys7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldE5leHRVbmlxdWVJZC5qcy5tYXAiLCIvLyBjaGVhcCBsb2Rhc2ggcmVwbGFjZW1lbnRzXG4vKipcbiAqIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIF8uZ2V0XG4gKiBAcGFyYW0gb2JqXG4gKiBAcGFyYW0gcGF0aFxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZVxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXQob2JqLCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgoYSwgYyk9PmEgJiYgYVtjXSA/IGFbY10gOiBkZWZhdWx0VmFsdWUgfHwgbnVsbFxuICAgICwgb2JqKTtcbn1cbi8qKlxuICogZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgXy53aXRob3V0XG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXQoaXRlbXMsIGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpKT0+aSAhPT0gaXRlbVxuICAgICk7XG59XG4vKipcbiAqIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIF8uaXNTdHJpbmdcbiAqIEBwYXJhbSBpbnB1dFxuICovIGV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyhpbnB1dCkge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnO1xufVxuLyoqXG4gKiBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBfLmlzU3RyaW5nXG4gKiBAcGFyYW0gaW5wdXRcbiAqLyBleHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoaW5wdXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0Jztcbn1cbi8qKlxuICogcmVwbGFjZW1lbnQgZm9yIF8ueG9yXG4gKiBAcGFyYW0gaXRlbXNBXG4gKiBAcGFyYW0gaXRlbXNCXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHhvcihpdGVtc0EsIGl0ZW1zQikge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBpbnNlcnRJdGVtID0gKGl0ZW0pPT57XG4gICAgICAgIG1hcC5zZXQoaXRlbSwgbWFwLmhhcyhpdGVtKSA/IG1hcC5nZXQoaXRlbSkgKyAxIDogMSk7XG4gICAgfTtcbiAgICBpdGVtc0EuZm9yRWFjaChpbnNlcnRJdGVtKTtcbiAgICBpdGVtc0IuZm9yRWFjaChpbnNlcnRJdGVtKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBtYXAuZm9yRWFjaCgoY291bnQsIGtleSk9PntcbiAgICAgICAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogcmVwbGFjZW1lbnQgZm9yIF8uaW50ZXJzZWN0aW9uXG4gKiBAcGFyYW0gaXRlbXNBXG4gKiBAcGFyYW0gaXRlbXNCXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdGlvbihpdGVtc0EsIGl0ZW1zQikge1xuICAgIHJldHVybiBpdGVtc0EuZmlsdGVyKCh0KT0+aXRlbXNCLmluZGV4T2YodCkgPiAtMVxuICAgICk7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWpzX3V0aWxzLmpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzVHlwZSh0YXJnZXRUeXBlLCBkcmFnZ2VkSXRlbVR5cGUpIHtcbiAgICBpZiAoZHJhZ2dlZEl0ZW1UeXBlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXRUeXBlID09PSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXRUeXBlKSA/IHRhcmdldFR5cGUuc29tZSgodCk9PnQgPT09IGRyYWdnZWRJdGVtVHlwZVxuICAgICkgOiB0YXJnZXRUeXBlID09PSBkcmFnZ2VkSXRlbVR5cGU7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hdGNoZXNUeXBlLmpzLm1hcCIsImNvbnN0IHtcbiAgc2xpY2UsXG4gIGZvckVhY2hcbn0gPSBbXTtcbmZ1bmN0aW9uIGRlZmF1bHRzKG9iaikge1xuICBmb3JFYWNoLmNhbGwoc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCBzb3VyY2UgPT4ge1xuICAgIGlmIChzb3VyY2UpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKG9ialtwcm9wXSA9PT0gdW5kZWZpbmVkKSBvYmpbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbmNvbnN0IGZpZWxkQ29udGVudFJlZ0V4cCA9IC9eW1xcdTAwMDlcXHUwMDIwLVxcdTAwN2VcXHUwMDgwLVxcdTAwZmZdKyQvO1xuY29uc3Qgc2VyaWFsaXplQ29va2llID0gKG5hbWUsIHZhbCwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBvcHQgPSBvcHRpb25zIHx8IHt9O1xuICBvcHQucGF0aCA9IG9wdC5wYXRoIHx8ICcvJztcbiAgY29uc3QgdmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQodmFsKTtcbiAgbGV0IHN0ciA9IGAke25hbWV9PSR7dmFsdWV9YDtcbiAgaWYgKG9wdC5tYXhBZ2UgPiAwKSB7XG4gICAgY29uc3QgbWF4QWdlID0gb3B0Lm1heEFnZSAtIDA7XG4gICAgaWYgKE51bWJlci5pc05hTihtYXhBZ2UpKSB0aHJvdyBuZXcgRXJyb3IoJ21heEFnZSBzaG91bGQgYmUgYSBOdW1iZXInKTtcbiAgICBzdHIgKz0gYDsgTWF4LUFnZT0ke01hdGguZmxvb3IobWF4QWdlKX1gO1xuICB9XG4gIGlmIChvcHQuZG9tYWluKSB7XG4gICAgaWYgKCFmaWVsZENvbnRlbnRSZWdFeHAudGVzdChvcHQuZG9tYWluKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIGRvbWFpbiBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICAgIHN0ciArPSBgOyBEb21haW49JHtvcHQuZG9tYWlufWA7XG4gIH1cbiAgaWYgKG9wdC5wYXRoKSB7XG4gICAgaWYgKCFmaWVsZENvbnRlbnRSZWdFeHAudGVzdChvcHQucGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBwYXRoIGlzIGludmFsaWQnKTtcbiAgICB9XG4gICAgc3RyICs9IGA7IFBhdGg9JHtvcHQucGF0aH1gO1xuICB9XG4gIGlmIChvcHQuZXhwaXJlcykge1xuICAgIGlmICh0eXBlb2Ygb3B0LmV4cGlyZXMudG9VVENTdHJpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBleHBpcmVzIGlzIGludmFsaWQnKTtcbiAgICB9XG4gICAgc3RyICs9IGA7IEV4cGlyZXM9JHtvcHQuZXhwaXJlcy50b1VUQ1N0cmluZygpfWA7XG4gIH1cbiAgaWYgKG9wdC5odHRwT25seSkgc3RyICs9ICc7IEh0dHBPbmx5JztcbiAgaWYgKG9wdC5zZWN1cmUpIHN0ciArPSAnOyBTZWN1cmUnO1xuICBpZiAob3B0LnNhbWVTaXRlKSB7XG4gICAgY29uc3Qgc2FtZVNpdGUgPSB0eXBlb2Ygb3B0LnNhbWVTaXRlID09PSAnc3RyaW5nJyA/IG9wdC5zYW1lU2l0ZS50b0xvd2VyQ2FzZSgpIDogb3B0LnNhbWVTaXRlO1xuICAgIHN3aXRjaCAoc2FtZVNpdGUpIHtcbiAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGF4JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPUxheCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RyaWN0JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1Ob25lJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gc2FtZVNpdGUgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcbmNvbnN0IGNvb2tpZSA9IHtcbiAgY3JlYXRlKG5hbWUsIHZhbHVlLCBtaW51dGVzLCBkb21haW4pIHtcbiAgICBsZXQgY29va2llT3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDoge1xuICAgICAgcGF0aDogJy8nLFxuICAgICAgc2FtZVNpdGU6ICdzdHJpY3QnXG4gICAgfTtcbiAgICBpZiAobWludXRlcykge1xuICAgICAgY29va2llT3B0aW9ucy5leHBpcmVzID0gbmV3IERhdGUoKTtcbiAgICAgIGNvb2tpZU9wdGlvbnMuZXhwaXJlcy5zZXRUaW1lKGNvb2tpZU9wdGlvbnMuZXhwaXJlcy5nZXRUaW1lKCkgKyBtaW51dGVzICogNjAgKiAxMDAwKTtcbiAgICB9XG4gICAgaWYgKGRvbWFpbikgY29va2llT3B0aW9ucy5kb21haW4gPSBkb21haW47XG4gICAgZG9jdW1lbnQuY29va2llID0gc2VyaWFsaXplQ29va2llKG5hbWUsIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSksIGNvb2tpZU9wdGlvbnMpO1xuICB9LFxuICByZWFkKG5hbWUpIHtcbiAgICBjb25zdCBuYW1lRVEgPSBgJHtuYW1lfT1gO1xuICAgIGNvbnN0IGNhID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYS5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGMgPSBjYVtpXTtcbiAgICAgIHdoaWxlIChjLmNoYXJBdCgwKSA9PT0gJyAnKSBjID0gYy5zdWJzdHJpbmcoMSwgYy5sZW5ndGgpO1xuICAgICAgaWYgKGMuaW5kZXhPZihuYW1lRVEpID09PSAwKSByZXR1cm4gYy5zdWJzdHJpbmcobmFtZUVRLmxlbmd0aCwgYy5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgcmVtb3ZlKG5hbWUpIHtcbiAgICB0aGlzLmNyZWF0ZShuYW1lLCAnJywgLTEpO1xuICB9XG59O1xudmFyIGNvb2tpZSQxID0ge1xuICBuYW1lOiAnY29va2llJyxcbiAgLy8gRGVjb25zdHJ1Y3QgdGhlIG9wdGlvbnMgb2JqZWN0IGFuZCBleHRyYWN0IHRoZSBsb29rdXBDb29raWUgcHJvcGVydHlcbiAgbG9va3VwKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgbG9va3VwQ29va2llXG4gICAgfSA9IF9yZWY7XG4gICAgaWYgKGxvb2t1cENvb2tpZSAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gY29va2llLnJlYWQobG9va3VwQ29va2llKSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sXG4gIC8vIERlY29uc3RydWN0IHRoZSBvcHRpb25zIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgbG9va3VwQ29va2llLCBjb29raWVNaW51dGVzLCBjb29raWVEb21haW4sIGFuZCBjb29raWVPcHRpb25zIHByb3BlcnRpZXNcbiAgY2FjaGVVc2VyTGFuZ3VhZ2UobG5nLCBfcmVmMikge1xuICAgIGxldCB7XG4gICAgICBsb29rdXBDb29raWUsXG4gICAgICBjb29raWVNaW51dGVzLFxuICAgICAgY29va2llRG9tYWluLFxuICAgICAgY29va2llT3B0aW9uc1xuICAgIH0gPSBfcmVmMjtcbiAgICBpZiAobG9va3VwQ29va2llICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvb2tpZS5jcmVhdGUobG9va3VwQ29va2llLCBsbmcsIGNvb2tpZU1pbnV0ZXMsIGNvb2tpZURvbWFpbiwgY29va2llT3B0aW9ucyk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgcXVlcnlzdHJpbmcgPSB7XG4gIG5hbWU6ICdxdWVyeXN0cmluZycsXG4gIC8vIERlY29uc3RydWN0IHRoZSBvcHRpb25zIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgbG9va3VwUXVlcnlzdHJpbmcgcHJvcGVydHlcbiAgbG9va3VwKF9yZWYpIHtcbiAgICBsZXQge1xuICAgICAgbG9va3VwUXVlcnlzdHJpbmdcbiAgICB9ID0gX3JlZjtcbiAgICBsZXQgZm91bmQ7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQge1xuICAgICAgICBzZWFyY2hcbiAgICAgIH0gPSB3aW5kb3cubG9jYXRpb247XG4gICAgICBpZiAoIXdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggJiYgd2luZG93LmxvY2F0aW9uLmhhc2g/LmluZGV4T2YoJz8nKSA+IC0xKSB7XG4gICAgICAgIHNlYXJjaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cmluZyh3aW5kb3cubG9jYXRpb24uaGFzaC5pbmRleE9mKCc/JykpO1xuICAgICAgfVxuICAgICAgY29uc3QgcXVlcnkgPSBzZWFyY2guc3Vic3RyaW5nKDEpO1xuICAgICAgY29uc3QgcGFyYW1zID0gcXVlcnkuc3BsaXQoJyYnKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHBhcmFtc1tpXS5pbmRleE9mKCc9Jyk7XG4gICAgICAgIGlmIChwb3MgPiAwKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gcGFyYW1zW2ldLnN1YnN0cmluZygwLCBwb3MpO1xuICAgICAgICAgIGlmIChrZXkgPT09IGxvb2t1cFF1ZXJ5c3RyaW5nKSB7XG4gICAgICAgICAgICBmb3VuZCA9IHBhcmFtc1tpXS5zdWJzdHJpbmcocG9zICsgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbiAgfVxufTtcblxubGV0IGhhc0xvY2FsU3RvcmFnZVN1cHBvcnQgPSBudWxsO1xuY29uc3QgbG9jYWxTdG9yYWdlQXZhaWxhYmxlID0gKCkgPT4ge1xuICBpZiAoaGFzTG9jYWxTdG9yYWdlU3VwcG9ydCAhPT0gbnVsbCkgcmV0dXJuIGhhc0xvY2FsU3RvcmFnZVN1cHBvcnQ7XG4gIHRyeSB7XG4gICAgaGFzTG9jYWxTdG9yYWdlU3VwcG9ydCA9IHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmxvY2FsU3RvcmFnZSAhPT0gbnVsbDtcbiAgICBjb25zdCB0ZXN0S2V5ID0gJ2kxOG5leHQudHJhbnNsYXRlLmJvbyc7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3RLZXksICdmb28nKTtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdEtleSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYXNMb2NhbFN0b3JhZ2VTdXBwb3J0ID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGhhc0xvY2FsU3RvcmFnZVN1cHBvcnQ7XG59O1xudmFyIGxvY2FsU3RvcmFnZSA9IHtcbiAgbmFtZTogJ2xvY2FsU3RvcmFnZScsXG4gIC8vIERlY29uc3RydWN0IHRoZSBvcHRpb25zIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgbG9va3VwTG9jYWxTdG9yYWdlIHByb3BlcnR5XG4gIGxvb2t1cChfcmVmKSB7XG4gICAgbGV0IHtcbiAgICAgIGxvb2t1cExvY2FsU3RvcmFnZVxuICAgIH0gPSBfcmVmO1xuICAgIGlmIChsb29rdXBMb2NhbFN0b3JhZ2UgJiYgbG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkpIHtcbiAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0obG9va3VwTG9jYWxTdG9yYWdlKSB8fCB1bmRlZmluZWQ7IC8vIFVuZGVmaW5lZCBlbnN1cmVzIHR5cGUgY29uc2lzdGVuY3kgd2l0aCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSxcbiAgLy8gRGVjb25zdHJ1Y3QgdGhlIG9wdGlvbnMgb2JqZWN0IGFuZCBleHRyYWN0IHRoZSBsb29rdXBMb2NhbFN0b3JhZ2UgcHJvcGVydHlcbiAgY2FjaGVVc2VyTGFuZ3VhZ2UobG5nLCBfcmVmMikge1xuICAgIGxldCB7XG4gICAgICBsb29rdXBMb2NhbFN0b3JhZ2VcbiAgICB9ID0gX3JlZjI7XG4gICAgaWYgKGxvb2t1cExvY2FsU3RvcmFnZSAmJiBsb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSkge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGxvb2t1cExvY2FsU3RvcmFnZSwgbG5nKTtcbiAgICB9XG4gIH1cbn07XG5cbmxldCBoYXNTZXNzaW9uU3RvcmFnZVN1cHBvcnQgPSBudWxsO1xuY29uc3Qgc2Vzc2lvblN0b3JhZ2VBdmFpbGFibGUgPSAoKSA9PiB7XG4gIGlmIChoYXNTZXNzaW9uU3RvcmFnZVN1cHBvcnQgIT09IG51bGwpIHJldHVybiBoYXNTZXNzaW9uU3RvcmFnZVN1cHBvcnQ7XG4gIHRyeSB7XG4gICAgaGFzU2Vzc2lvblN0b3JhZ2VTdXBwb3J0ID0gd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UgIT09IG51bGw7XG4gICAgY29uc3QgdGVzdEtleSA9ICdpMThuZXh0LnRyYW5zbGF0ZS5ib28nO1xuICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRlc3RLZXksICdmb28nKTtcbiAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0S2V5KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhc1Nlc3Npb25TdG9yYWdlU3VwcG9ydCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiBoYXNTZXNzaW9uU3RvcmFnZVN1cHBvcnQ7XG59O1xudmFyIHNlc3Npb25TdG9yYWdlID0ge1xuICBuYW1lOiAnc2Vzc2lvblN0b3JhZ2UnLFxuICBsb29rdXAoX3JlZikge1xuICAgIGxldCB7XG4gICAgICBsb29rdXBTZXNzaW9uU3RvcmFnZVxuICAgIH0gPSBfcmVmO1xuICAgIGlmIChsb29rdXBTZXNzaW9uU3RvcmFnZSAmJiBzZXNzaW9uU3RvcmFnZUF2YWlsYWJsZSgpKSB7XG4gICAgICByZXR1cm4gd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0obG9va3VwU2Vzc2lvblN0b3JhZ2UpIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSxcbiAgY2FjaGVVc2VyTGFuZ3VhZ2UobG5nLCBfcmVmMikge1xuICAgIGxldCB7XG4gICAgICBsb29rdXBTZXNzaW9uU3RvcmFnZVxuICAgIH0gPSBfcmVmMjtcbiAgICBpZiAobG9va3VwU2Vzc2lvblN0b3JhZ2UgJiYgc2Vzc2lvblN0b3JhZ2VBdmFpbGFibGUoKSkge1xuICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0obG9va3VwU2Vzc2lvblN0b3JhZ2UsIGxuZyk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgbmF2aWdhdG9yJDEgPSB7XG4gIG5hbWU6ICduYXZpZ2F0b3InLFxuICBsb29rdXAob3B0aW9ucykge1xuICAgIGNvbnN0IGZvdW5kID0gW107XG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxhbmd1YWdlcyxcbiAgICAgICAgdXNlckxhbmd1YWdlLFxuICAgICAgICBsYW5ndWFnZVxuICAgICAgfSA9IG5hdmlnYXRvcjtcbiAgICAgIGlmIChsYW5ndWFnZXMpIHtcbiAgICAgICAgLy8gY2hyb21lIG9ubHk7IG5vdCBhbiBhcnJheSwgc28gY2FuJ3QgdXNlIC5wdXNoLmFwcGx5IGluc3RlYWQgb2YgaXRlcmF0aW5nXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZm91bmQucHVzaChsYW5ndWFnZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodXNlckxhbmd1YWdlKSB7XG4gICAgICAgIGZvdW5kLnB1c2godXNlckxhbmd1YWdlKTtcbiAgICAgIH1cbiAgICAgIGlmIChsYW5ndWFnZSkge1xuICAgICAgICBmb3VuZC5wdXNoKGxhbmd1YWdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kLmxlbmd0aCA+IDAgPyBmb3VuZCA6IHVuZGVmaW5lZDtcbiAgfVxufTtcblxudmFyIGh0bWxUYWcgPSB7XG4gIG5hbWU6ICdodG1sVGFnJyxcbiAgLy8gRGVjb25zdHJ1Y3QgdGhlIG9wdGlvbnMgb2JqZWN0IGFuZCBleHRyYWN0IHRoZSBodG1sVGFnIHByb3BlcnR5XG4gIGxvb2t1cChfcmVmKSB7XG4gICAgbGV0IHtcbiAgICAgIGh0bWxUYWdcbiAgICB9ID0gX3JlZjtcbiAgICBsZXQgZm91bmQ7XG4gICAgY29uc3QgaW50ZXJuYWxIdG1sVGFnID0gaHRtbFRhZyB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA6IG51bGwpO1xuICAgIGlmIChpbnRlcm5hbEh0bWxUYWcgJiYgdHlwZW9mIGludGVybmFsSHRtbFRhZy5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZvdW5kID0gaW50ZXJuYWxIdG1sVGFnLmdldEF0dHJpYnV0ZSgnbGFuZycpO1xuICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cbn07XG5cbnZhciBwYXRoID0ge1xuICBuYW1lOiAncGF0aCcsXG4gIC8vIERlY29uc3RydWN0IHRoZSBvcHRpb25zIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgbG9va3VwRnJvbVBhdGhJbmRleCBwcm9wZXJ0eVxuICBsb29rdXAoX3JlZikge1xuICAgIGxldCB7XG4gICAgICBsb29rdXBGcm9tUGF0aEluZGV4XG4gICAgfSA9IF9yZWY7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9cXC8oW2EtekEtWi1dKikvZyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGxhbmd1YWdlKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbmRleCA9IHR5cGVvZiBsb29rdXBGcm9tUGF0aEluZGV4ID09PSAnbnVtYmVyJyA/IGxvb2t1cEZyb21QYXRoSW5kZXggOiAwO1xuICAgIHJldHVybiBsYW5ndWFnZVtpbmRleF0/LnJlcGxhY2UoJy8nLCAnJyk7XG4gIH1cbn07XG5cbnZhciBzdWJkb21haW4gPSB7XG4gIG5hbWU6ICdzdWJkb21haW4nLFxuICBsb29rdXAoX3JlZikge1xuICAgIGxldCB7XG4gICAgICBsb29rdXBGcm9tU3ViZG9tYWluSW5kZXhcbiAgICB9ID0gX3JlZjtcbiAgICAvLyBJZiBnaXZlbiBnZXQgdGhlIHN1YmRvbWFpbiBpbmRleCBlbHNlIDFcbiAgICBjb25zdCBpbnRlcm5hbExvb2t1cEZyb21TdWJkb21haW5JbmRleCA9IHR5cGVvZiBsb29rdXBGcm9tU3ViZG9tYWluSW5kZXggPT09ICdudW1iZXInID8gbG9va3VwRnJvbVN1YmRvbWFpbkluZGV4ICsgMSA6IDE7XG4gICAgLy8gZ2V0IGFsbCBtYXRjaGVzIGlmIHdpbmRvdy5sb2NhdGlvbi4gaXMgZXhpc3RpbmdcbiAgICAvLyBmaXJzdCBpdGVtIG9mIG1hdGNoIGlzIHRoZSBtYXRjaCBpdHNlbGYgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIGZpcnN0IGdyb3VwIG1hdGNoIHdoaWNoIHNob3VsZCBiZSB0aGUgZmlyc3Qgc3ViZG9tYWluIG1hdGNoXG4gICAgLy8gaXMgdGhlIGhvc3RuYW1lIG5vIHB1YmxpYyBkb21haW4gZ2V0IHRoZSBvciBvcHRpb24gb2YgbG9jYWxob3N0XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubG9jYXRpb24/Lmhvc3RuYW1lPy5tYXRjaCgvXihcXHd7Miw1fSlcXC4oKFthLXowLTktXXsxLDYzfVxcLlthLXpdezIsNn0pfGxvY2FsaG9zdCkvaSk7XG5cbiAgICAvLyBpZiB0aGVyZSBpcyBubyBtYXRjaCAobnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmICghbGFuZ3VhZ2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgLy8gcmV0dXJuIHRoZSBnaXZlbiBncm91cCBtYXRjaFxuICAgIHJldHVybiBsYW5ndWFnZVtpbnRlcm5hbExvb2t1cEZyb21TdWJkb21haW5JbmRleF07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRzKCkge1xuICByZXR1cm4ge1xuICAgIG9yZGVyOiBbJ3F1ZXJ5c3RyaW5nJywgJ2Nvb2tpZScsICdsb2NhbFN0b3JhZ2UnLCAnc2Vzc2lvblN0b3JhZ2UnLCAnbmF2aWdhdG9yJywgJ2h0bWxUYWcnXSxcbiAgICBsb29rdXBRdWVyeXN0cmluZzogJ2xuZycsXG4gICAgbG9va3VwQ29va2llOiAnaTE4bmV4dCcsXG4gICAgbG9va3VwTG9jYWxTdG9yYWdlOiAnaTE4bmV4dExuZycsXG4gICAgbG9va3VwU2Vzc2lvblN0b3JhZ2U6ICdpMThuZXh0TG5nJyxcbiAgICAvLyBjYWNoZSB1c2VyIGxhbmd1YWdlXG4gICAgY2FjaGVzOiBbJ2xvY2FsU3RvcmFnZSddLFxuICAgIGV4Y2x1ZGVDYWNoZUZvcjogWydjaW1vZGUnXSxcbiAgICAvLyBjb29raWVNaW51dGVzOiAxMCxcbiAgICAvLyBjb29raWVEb21haW46ICdteURvbWFpbidcblxuICAgIGNvbnZlcnREZXRlY3RlZExhbmd1YWdlOiBsID0+IGxcbiAgfTtcbn1cbmNsYXNzIEJyb3dzZXIge1xuICBjb25zdHJ1Y3RvcihzZXJ2aWNlcykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB0aGlzLnR5cGUgPSAnbGFuZ3VhZ2VEZXRlY3Rvcic7XG4gICAgdGhpcy5kZXRlY3RvcnMgPSB7fTtcbiAgICB0aGlzLmluaXQoc2VydmljZXMsIG9wdGlvbnMpO1xuICB9XG4gIGluaXQoc2VydmljZXMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgbGV0IGkxOG5PcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICB0aGlzLnNlcnZpY2VzID0gc2VydmljZXMgfHwge1xuICAgICAgbGFuZ3VhZ2VVdGlsczoge31cbiAgICB9OyAvLyB0aGlzIHdheSB0aGUgbGFuZ3VhZ2UgZGV0ZWN0b3IgY2FuIGJlIHVzZWQgd2l0aG91dCBpMThuZXh0XG4gICAgdGhpcy5vcHRpb25zID0gZGVmYXVsdHMob3B0aW9ucywgdGhpcy5vcHRpb25zIHx8IHt9LCBnZXREZWZhdWx0cygpKTtcbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5jb252ZXJ0RGV0ZWN0ZWRMYW5ndWFnZSA9PT0gJ3N0cmluZycgJiYgdGhpcy5vcHRpb25zLmNvbnZlcnREZXRlY3RlZExhbmd1YWdlLmluZGV4T2YoJzE1ODk3JykgPiAtMSkge1xuICAgICAgdGhpcy5vcHRpb25zLmNvbnZlcnREZXRlY3RlZExhbmd1YWdlID0gbCA9PiBsLnJlcGxhY2UoJy0nLCAnXycpO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb29rdXBGcm9tVXJsSW5kZXgpIHRoaXMub3B0aW9ucy5sb29rdXBGcm9tUGF0aEluZGV4ID0gdGhpcy5vcHRpb25zLmxvb2t1cEZyb21VcmxJbmRleDtcbiAgICB0aGlzLmkxOG5PcHRpb25zID0gaTE4bk9wdGlvbnM7XG4gICAgdGhpcy5hZGREZXRlY3Rvcihjb29raWUkMSk7XG4gICAgdGhpcy5hZGREZXRlY3RvcihxdWVyeXN0cmluZyk7XG4gICAgdGhpcy5hZGREZXRlY3Rvcihsb2NhbFN0b3JhZ2UpO1xuICAgIHRoaXMuYWRkRGV0ZWN0b3Ioc2Vzc2lvblN0b3JhZ2UpO1xuICAgIHRoaXMuYWRkRGV0ZWN0b3IobmF2aWdhdG9yJDEpO1xuICAgIHRoaXMuYWRkRGV0ZWN0b3IoaHRtbFRhZyk7XG4gICAgdGhpcy5hZGREZXRlY3RvcihwYXRoKTtcbiAgICB0aGlzLmFkZERldGVjdG9yKHN1YmRvbWFpbik7XG4gIH1cbiAgYWRkRGV0ZWN0b3IoZGV0ZWN0b3IpIHtcbiAgICB0aGlzLmRldGVjdG9yc1tkZXRlY3Rvci5uYW1lXSA9IGRldGVjdG9yO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGRldGVjdChkZXRlY3Rpb25PcmRlcikge1xuICAgIGlmICghZGV0ZWN0aW9uT3JkZXIpIGRldGVjdGlvbk9yZGVyID0gdGhpcy5vcHRpb25zLm9yZGVyO1xuICAgIGxldCBkZXRlY3RlZCA9IFtdO1xuICAgIGRldGVjdGlvbk9yZGVyLmZvckVhY2goZGV0ZWN0b3JOYW1lID0+IHtcbiAgICAgIGlmICh0aGlzLmRldGVjdG9yc1tkZXRlY3Rvck5hbWVdKSB7XG4gICAgICAgIGxldCBsb29rdXAgPSB0aGlzLmRldGVjdG9yc1tkZXRlY3Rvck5hbWVdLmxvb2t1cCh0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAobG9va3VwICYmIHR5cGVvZiBsb29rdXAgPT09ICdzdHJpbmcnKSBsb29rdXAgPSBbbG9va3VwXTtcbiAgICAgICAgaWYgKGxvb2t1cCkgZGV0ZWN0ZWQgPSBkZXRlY3RlZC5jb25jYXQobG9va3VwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkZXRlY3RlZCA9IGRldGVjdGVkLm1hcChkID0+IHRoaXMub3B0aW9ucy5jb252ZXJ0RGV0ZWN0ZWRMYW5ndWFnZShkKSk7XG4gICAgaWYgKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRCZXN0TWF0Y2hGcm9tQ29kZXMpIHJldHVybiBkZXRlY3RlZDsgLy8gbmV3IGkxOG5leHQgdjE5LjUuMFxuICAgIHJldHVybiBkZXRlY3RlZC5sZW5ndGggPiAwID8gZGV0ZWN0ZWRbMF0gOiBudWxsOyAvLyBhIGxpdHRsZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIH1cblxuICBjYWNoZVVzZXJMYW5ndWFnZShsbmcsIGNhY2hlcykge1xuICAgIGlmICghY2FjaGVzKSBjYWNoZXMgPSB0aGlzLm9wdGlvbnMuY2FjaGVzO1xuICAgIGlmICghY2FjaGVzKSByZXR1cm47XG4gICAgaWYgKHRoaXMub3B0aW9ucy5leGNsdWRlQ2FjaGVGb3IgJiYgdGhpcy5vcHRpb25zLmV4Y2x1ZGVDYWNoZUZvci5pbmRleE9mKGxuZykgPiAtMSkgcmV0dXJuO1xuICAgIGNhY2hlcy5mb3JFYWNoKGNhY2hlTmFtZSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXRlY3RvcnNbY2FjaGVOYW1lXSkgdGhpcy5kZXRlY3RvcnNbY2FjaGVOYW1lXS5jYWNoZVVzZXJMYW5ndWFnZShsbmcsIHRoaXMub3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cbn1cbkJyb3dzZXIudHlwZSA9ICdsYW5ndWFnZURldGVjdG9yJztcblxuZXhwb3J0IHsgQnJvd3NlciBhcyBkZWZhdWx0IH07XG4iLCJjb25zdCBjb25zb2xlTG9nZ2VyID0ge1xuICB0eXBlOiAnbG9nZ2VyJyxcbiAgbG9nKGFyZ3MpIHtcbiAgICB0aGlzLm91dHB1dCgnbG9nJywgYXJncyk7XG4gIH0sXG4gIHdhcm4oYXJncykge1xuICAgIHRoaXMub3V0cHV0KCd3YXJuJywgYXJncyk7XG4gIH0sXG4gIGVycm9yKGFyZ3MpIHtcbiAgICB0aGlzLm91dHB1dCgnZXJyb3InLCBhcmdzKTtcbiAgfSxcbiAgb3V0cHV0KHR5cGUsIGFyZ3MpIHtcbiAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlW3R5cGVdKSBjb25zb2xlW3R5cGVdLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICB9XG59O1xuY2xhc3MgTG9nZ2VyIHtcbiAgY29uc3RydWN0b3IoY29uY3JldGVMb2dnZXIpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgdGhpcy5pbml0KGNvbmNyZXRlTG9nZ2VyLCBvcHRpb25zKTtcbiAgfVxuICBpbml0KGNvbmNyZXRlTG9nZ2VyKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHRoaXMucHJlZml4ID0gb3B0aW9ucy5wcmVmaXggfHwgJ2kxOG5leHQ6JztcbiAgICB0aGlzLmxvZ2dlciA9IGNvbmNyZXRlTG9nZ2VyIHx8IGNvbnNvbGVMb2dnZXI7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcbiAgfVxuICBsb2coKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mb3J3YXJkKGFyZ3MsICdsb2cnLCAnJywgdHJ1ZSk7XG4gIH1cbiAgd2FybigpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9yd2FyZChhcmdzLCAnd2FybicsICcnLCB0cnVlKTtcbiAgfVxuICBlcnJvcigpIHtcbiAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9yd2FyZChhcmdzLCAnZXJyb3InLCAnJyk7XG4gIH1cbiAgZGVwcmVjYXRlKCkge1xuICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgICAgYXJnc1tfa2V5NF0gPSBhcmd1bWVudHNbX2tleTRdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mb3J3YXJkKGFyZ3MsICd3YXJuJywgJ1dBUk5JTkcgREVQUkVDQVRFRDogJywgdHJ1ZSk7XG4gIH1cbiAgZm9yd2FyZChhcmdzLCBsdmwsIHByZWZpeCwgZGVidWdPbmx5KSB7XG4gICAgaWYgKGRlYnVnT25seSAmJiAhdGhpcy5kZWJ1ZykgcmV0dXJuIG51bGw7XG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykgYXJnc1swXSA9IGAke3ByZWZpeH0ke3RoaXMucHJlZml4fSAke2FyZ3NbMF19YDtcbiAgICByZXR1cm4gdGhpcy5sb2dnZXJbbHZsXShhcmdzKTtcbiAgfVxuICBjcmVhdGUobW9kdWxlTmFtZSkge1xuICAgIHJldHVybiBuZXcgTG9nZ2VyKHRoaXMubG9nZ2VyLCB7XG4gICAgICAuLi57XG4gICAgICAgIHByZWZpeDogYCR7dGhpcy5wcmVmaXh9OiR7bW9kdWxlTmFtZX06YFxuICAgICAgfSxcbiAgICAgIC4uLnRoaXMub3B0aW9uc1xuICAgIH0pO1xuICB9XG4gIGNsb25lKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB0aGlzLm9wdGlvbnM7XG4gICAgb3B0aW9ucy5wcmVmaXggPSBvcHRpb25zLnByZWZpeCB8fCB0aGlzLnByZWZpeDtcbiAgICByZXR1cm4gbmV3IExvZ2dlcih0aGlzLmxvZ2dlciwgb3B0aW9ucyk7XG4gIH1cbn1cbnZhciBiYXNlTG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuXG5jbGFzcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm9ic2VydmVycyA9IHt9O1xuICB9XG4gIG9uKGV2ZW50cywgbGlzdGVuZXIpIHtcbiAgICBldmVudHMuc3BsaXQoJyAnKS5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgIGlmICghdGhpcy5vYnNlcnZlcnNbZXZlbnRdKSB0aGlzLm9ic2VydmVyc1tldmVudF0gPSBuZXcgTWFwKCk7XG4gICAgICBjb25zdCBudW1MaXN0ZW5lcnMgPSB0aGlzLm9ic2VydmVyc1tldmVudF0uZ2V0KGxpc3RlbmVyKSB8fCAwO1xuICAgICAgdGhpcy5vYnNlcnZlcnNbZXZlbnRdLnNldChsaXN0ZW5lciwgbnVtTGlzdGVuZXJzICsgMSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgb2ZmKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgIGlmICghdGhpcy5vYnNlcnZlcnNbZXZlbnRdKSByZXR1cm47XG4gICAgaWYgKCFsaXN0ZW5lcikge1xuICAgICAgZGVsZXRlIHRoaXMub2JzZXJ2ZXJzW2V2ZW50XTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vYnNlcnZlcnNbZXZlbnRdLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH1cbiAgZW1pdChldmVudCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cbiAgICBpZiAodGhpcy5vYnNlcnZlcnNbZXZlbnRdKSB7XG4gICAgICBjb25zdCBjbG9uZWQgPSBBcnJheS5mcm9tKHRoaXMub2JzZXJ2ZXJzW2V2ZW50XS5lbnRyaWVzKCkpO1xuICAgICAgY2xvbmVkLmZvckVhY2goX3JlZiA9PiB7XG4gICAgICAgIGxldCBbb2JzZXJ2ZXIsIG51bVRpbWVzQWRkZWRdID0gX3JlZjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1UaW1lc0FkZGVkOyBpKyspIHtcbiAgICAgICAgICBvYnNlcnZlciguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9ic2VydmVyc1snKiddKSB7XG4gICAgICBjb25zdCBjbG9uZWQgPSBBcnJheS5mcm9tKHRoaXMub2JzZXJ2ZXJzWycqJ10uZW50cmllcygpKTtcbiAgICAgIGNsb25lZC5mb3JFYWNoKF9yZWYyID0+IHtcbiAgICAgICAgbGV0IFtvYnNlcnZlciwgbnVtVGltZXNBZGRlZF0gPSBfcmVmMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1UaW1lc0FkZGVkOyBpKyspIHtcbiAgICAgICAgICBvYnNlcnZlci5hcHBseShvYnNlcnZlciwgW2V2ZW50LCAuLi5hcmdzXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBkZWZlciA9ICgpID0+IHtcbiAgbGV0IHJlcztcbiAgbGV0IHJlajtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXMgPSByZXNvbHZlO1xuICAgIHJlaiA9IHJlamVjdDtcbiAgfSk7XG4gIHByb21pc2UucmVzb2x2ZSA9IHJlcztcbiAgcHJvbWlzZS5yZWplY3QgPSByZWo7XG4gIHJldHVybiBwcm9taXNlO1xufTtcbmNvbnN0IG1ha2VTdHJpbmcgPSBvYmplY3QgPT4ge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiAnJztcbiAgcmV0dXJuICcnICsgb2JqZWN0O1xufTtcbmNvbnN0IGNvcHkgPSAoYSwgcywgdCkgPT4ge1xuICBhLmZvckVhY2gobSA9PiB7XG4gICAgaWYgKHNbbV0pIHRbbV0gPSBzW21dO1xuICB9KTtcbn07XG5jb25zdCBsYXN0T2ZQYXRoU2VwYXJhdG9yUmVnRXhwID0gLyMjIy9nO1xuY29uc3QgY2xlYW5LZXkgPSBrZXkgPT4ga2V5ICYmIGtleS5pbmRleE9mKCcjIyMnKSA+IC0xID8ga2V5LnJlcGxhY2UobGFzdE9mUGF0aFNlcGFyYXRvclJlZ0V4cCwgJy4nKSA6IGtleTtcbmNvbnN0IGNhbk5vdFRyYXZlcnNlRGVlcGVyID0gb2JqZWN0ID0+ICFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZyc7XG5jb25zdCBnZXRMYXN0T2ZQYXRoID0gKG9iamVjdCwgcGF0aCwgRW1wdHkpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSB0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycgPyBwYXRoIDogcGF0aC5zcGxpdCgnLicpO1xuICBsZXQgc3RhY2tJbmRleCA9IDA7XG4gIHdoaWxlIChzdGFja0luZGV4IDwgc3RhY2subGVuZ3RoIC0gMSkge1xuICAgIGlmIChjYW5Ob3RUcmF2ZXJzZURlZXBlcihvYmplY3QpKSByZXR1cm4ge307XG4gICAgY29uc3Qga2V5ID0gY2xlYW5LZXkoc3RhY2tbc3RhY2tJbmRleF0pO1xuICAgIGlmICghb2JqZWN0W2tleV0gJiYgRW1wdHkpIG9iamVjdFtrZXldID0gbmV3IEVtcHR5KCk7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmplY3QgPSB7fTtcbiAgICB9XG4gICAgKytzdGFja0luZGV4O1xuICB9XG4gIGlmIChjYW5Ob3RUcmF2ZXJzZURlZXBlcihvYmplY3QpKSByZXR1cm4ge307XG4gIHJldHVybiB7XG4gICAgb2JqOiBvYmplY3QsXG4gICAgazogY2xlYW5LZXkoc3RhY2tbc3RhY2tJbmRleF0pXG4gIH07XG59O1xuY29uc3Qgc2V0UGF0aCA9IChvYmplY3QsIHBhdGgsIG5ld1ZhbHVlKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBvYmosXG4gICAga1xuICB9ID0gZ2V0TGFzdE9mUGF0aChvYmplY3QsIHBhdGgsIE9iamVjdCk7XG4gIGlmIChvYmogIT09IHVuZGVmaW5lZCB8fCBwYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgIG9ialtrXSA9IG5ld1ZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgZSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgbGV0IHAgPSBwYXRoLnNsaWNlKDAsIHBhdGgubGVuZ3RoIC0gMSk7XG4gIGxldCBsYXN0ID0gZ2V0TGFzdE9mUGF0aChvYmplY3QsIHAsIE9iamVjdCk7XG4gIHdoaWxlIChsYXN0Lm9iaiA9PT0gdW5kZWZpbmVkICYmIHAubGVuZ3RoKSB7XG4gICAgZSA9IGAke3BbcC5sZW5ndGggLSAxXX0uJHtlfWA7XG4gICAgcCA9IHAuc2xpY2UoMCwgcC5sZW5ndGggLSAxKTtcbiAgICBsYXN0ID0gZ2V0TGFzdE9mUGF0aChvYmplY3QsIHAsIE9iamVjdCk7XG4gICAgaWYgKGxhc3QgJiYgbGFzdC5vYmogJiYgdHlwZW9mIGxhc3Qub2JqW2Ake2xhc3Qua30uJHtlfWBdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGFzdC5vYmogPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIGxhc3Qub2JqW2Ake2xhc3Qua30uJHtlfWBdID0gbmV3VmFsdWU7XG59O1xuY29uc3QgcHVzaFBhdGggPSAob2JqZWN0LCBwYXRoLCBuZXdWYWx1ZSwgY29uY2F0KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBvYmosXG4gICAga1xuICB9ID0gZ2V0TGFzdE9mUGF0aChvYmplY3QsIHBhdGgsIE9iamVjdCk7XG4gIG9ialtrXSA9IG9ialtrXSB8fCBbXTtcbiAgb2JqW2tdLnB1c2gobmV3VmFsdWUpO1xufTtcbmNvbnN0IGdldFBhdGggPSAob2JqZWN0LCBwYXRoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBvYmosXG4gICAga1xuICB9ID0gZ2V0TGFzdE9mUGF0aChvYmplY3QsIHBhdGgpO1xuICBpZiAoIW9iaikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG9ialtrXTtcbn07XG5jb25zdCBnZXRQYXRoV2l0aERlZmF1bHRzID0gKGRhdGEsIGRlZmF1bHREYXRhLCBrZXkpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBnZXRQYXRoKGRhdGEsIGtleSk7XG4gIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBnZXRQYXRoKGRlZmF1bHREYXRhLCBrZXkpO1xufTtcbmNvbnN0IGRlZXBFeHRlbmQgPSAodGFyZ2V0LCBzb3VyY2UsIG92ZXJ3cml0ZSkgPT4ge1xuICBmb3IgKGNvbnN0IHByb3AgaW4gc291cmNlKSB7XG4gICAgaWYgKHByb3AgIT09ICdfX3Byb3RvX18nICYmIHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIGlmIChwcm9wIGluIHRhcmdldCkge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtwcm9wXSA9PT0gJ3N0cmluZycgfHwgdGFyZ2V0W3Byb3BdIGluc3RhbmNlb2YgU3RyaW5nIHx8IHR5cGVvZiBzb3VyY2VbcHJvcF0gPT09ICdzdHJpbmcnIHx8IHNvdXJjZVtwcm9wXSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICAgIGlmIChvdmVyd3JpdGUpIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWVwRXh0ZW5kKHRhcmdldFtwcm9wXSwgc291cmNlW3Byb3BdLCBvdmVyd3JpdGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuY29uc3QgcmVnZXhFc2NhcGUgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL1tcXC1cXFtcXF1cXC9cXHtcXH1cXChcXClcXCpcXCtcXD9cXC5cXFxcXFxeXFwkXFx8XS9nLCAnXFxcXCQmJyk7XG52YXIgX2VudGl0eU1hcCA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gICdcIic6ICcmcXVvdDsnLFxuICBcIidcIjogJyYjMzk7JyxcbiAgJy8nOiAnJiN4MkY7J1xufTtcbmNvbnN0IGVzY2FwZSA9IGRhdGEgPT4ge1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRhdGEucmVwbGFjZSgvWyY8PlwiJ1xcL10vZywgcyA9PiBfZW50aXR5TWFwW3NdKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn07XG5jbGFzcyBSZWdFeHBDYWNoZSB7XG4gIGNvbnN0cnVjdG9yKGNhcGFjaXR5KSB7XG4gICAgdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5O1xuICAgIHRoaXMucmVnRXhwTWFwID0gbmV3IE1hcCgpO1xuICAgIHRoaXMucmVnRXhwUXVldWUgPSBbXTtcbiAgfVxuICBnZXRSZWdFeHAocGF0dGVybikge1xuICAgIGNvbnN0IHJlZ0V4cEZyb21DYWNoZSA9IHRoaXMucmVnRXhwTWFwLmdldChwYXR0ZXJuKTtcbiAgICBpZiAocmVnRXhwRnJvbUNhY2hlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByZWdFeHBGcm9tQ2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IHJlZ0V4cE5ldyA9IG5ldyBSZWdFeHAocGF0dGVybik7XG4gICAgaWYgKHRoaXMucmVnRXhwUXVldWUubGVuZ3RoID09PSB0aGlzLmNhcGFjaXR5KSB7XG4gICAgICB0aGlzLnJlZ0V4cE1hcC5kZWxldGUodGhpcy5yZWdFeHBRdWV1ZS5zaGlmdCgpKTtcbiAgICB9XG4gICAgdGhpcy5yZWdFeHBNYXAuc2V0KHBhdHRlcm4sIHJlZ0V4cE5ldyk7XG4gICAgdGhpcy5yZWdFeHBRdWV1ZS5wdXNoKHBhdHRlcm4pO1xuICAgIHJldHVybiByZWdFeHBOZXc7XG4gIH1cbn1cbmNvbnN0IGNoYXJzID0gWycgJywgJywnLCAnPycsICchJywgJzsnXTtcbmNvbnN0IGxvb2tzTGlrZU9iamVjdFBhdGhSZWdFeHBDYWNoZSA9IG5ldyBSZWdFeHBDYWNoZSgyMCk7XG5jb25zdCBsb29rc0xpa2VPYmplY3RQYXRoID0gKGtleSwgbnNTZXBhcmF0b3IsIGtleVNlcGFyYXRvcikgPT4ge1xuICBuc1NlcGFyYXRvciA9IG5zU2VwYXJhdG9yIHx8ICcnO1xuICBrZXlTZXBhcmF0b3IgPSBrZXlTZXBhcmF0b3IgfHwgJyc7XG4gIGNvbnN0IHBvc3NpYmxlQ2hhcnMgPSBjaGFycy5maWx0ZXIoYyA9PiBuc1NlcGFyYXRvci5pbmRleE9mKGMpIDwgMCAmJiBrZXlTZXBhcmF0b3IuaW5kZXhPZihjKSA8IDApO1xuICBpZiAocG9zc2libGVDaGFycy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICBjb25zdCByID0gbG9va3NMaWtlT2JqZWN0UGF0aFJlZ0V4cENhY2hlLmdldFJlZ0V4cChgKCR7cG9zc2libGVDaGFycy5tYXAoYyA9PiBjID09PSAnPycgPyAnXFxcXD8nIDogYykuam9pbignfCcpfSlgKTtcbiAgbGV0IG1hdGNoZWQgPSAhci50ZXN0KGtleSk7XG4gIGlmICghbWF0Y2hlZCkge1xuICAgIGNvbnN0IGtpID0ga2V5LmluZGV4T2Yoa2V5U2VwYXJhdG9yKTtcbiAgICBpZiAoa2kgPiAwICYmICFyLnRlc3Qoa2V5LnN1YnN0cmluZygwLCBraSkpKSB7XG4gICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdGNoZWQ7XG59O1xuY29uc3QgZGVlcEZpbmQgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gIGxldCBrZXlTZXBhcmF0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICcuJztcbiAgaWYgKCFvYmopIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChvYmpbcGF0aF0pIHJldHVybiBvYmpbcGF0aF07XG4gIGNvbnN0IHRva2VucyA9IHBhdGguc3BsaXQoa2V5U2VwYXJhdG9yKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDspIHtcbiAgICBpZiAoIWN1cnJlbnQgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgbmV4dDtcbiAgICBsZXQgbmV4dFBhdGggPSAnJztcbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IHRva2Vucy5sZW5ndGg7ICsraikge1xuICAgICAgaWYgKGogIT09IGkpIHtcbiAgICAgICAgbmV4dFBhdGggKz0ga2V5U2VwYXJhdG9yO1xuICAgICAgfVxuICAgICAgbmV4dFBhdGggKz0gdG9rZW5zW2pdO1xuICAgICAgbmV4dCA9IGN1cnJlbnRbbmV4dFBhdGhdO1xuICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXS5pbmRleE9mKHR5cGVvZiBuZXh0KSA+IC0xICYmIGogPCB0b2tlbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGkgKz0gaiAtIGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY3VycmVudCA9IG5leHQ7XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59O1xuY29uc3QgZ2V0Q2xlYW5lZENvZGUgPSBjb2RlID0+IHtcbiAgaWYgKGNvZGUgJiYgY29kZS5pbmRleE9mKCdfJykgPiAwKSByZXR1cm4gY29kZS5yZXBsYWNlKCdfJywgJy0nKTtcbiAgcmV0dXJuIGNvZGU7XG59O1xuXG5jbGFzcyBSZXNvdXJjZVN0b3JlIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgICBuczogWyd0cmFuc2xhdGlvbiddLFxuICAgICAgZGVmYXVsdE5TOiAndHJhbnNsYXRpb24nXG4gICAgfTtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZGF0YSA9IGRhdGEgfHwge307XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICBpZiAodGhpcy5vcHRpb25zLmtleVNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yID0gJy4nO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBhZGROYW1lc3BhY2VzKG5zKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5ucy5pbmRleE9mKG5zKSA8IDApIHtcbiAgICAgIHRoaXMub3B0aW9ucy5ucy5wdXNoKG5zKTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlTmFtZXNwYWNlcyhucykge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcHRpb25zLm5zLmluZGV4T2YobnMpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLm9wdGlvbnMubnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbiAgZ2V0UmVzb3VyY2UobG5nLCBucywga2V5KSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIGNvbnN0IGtleVNlcGFyYXRvciA9IG9wdGlvbnMua2V5U2VwYXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmtleVNlcGFyYXRvciA6IHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7XG4gICAgY29uc3QgaWdub3JlSlNPTlN0cnVjdHVyZSA9IG9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlIDogdGhpcy5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmU7XG4gICAgbGV0IHBhdGg7XG4gICAgaWYgKGxuZy5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgcGF0aCA9IGxuZy5zcGxpdCgnLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gW2xuZywgbnNdO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgcGF0aC5wdXNoKC4uLmtleSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5U2VwYXJhdG9yKSB7XG4gICAgICAgICAgcGF0aC5wdXNoKC4uLmtleS5zcGxpdChrZXlTZXBhcmF0b3IpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRoLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBnZXRQYXRoKHRoaXMuZGF0YSwgcGF0aCk7XG4gICAgaWYgKCFyZXN1bHQgJiYgIW5zICYmICFrZXkgJiYgbG5nLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICBsbmcgPSBwYXRoWzBdO1xuICAgICAgbnMgPSBwYXRoWzFdO1xuICAgICAga2V5ID0gcGF0aC5zbGljZSgyKS5qb2luKCcuJyk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgfHwgIWlnbm9yZUpTT05TdHJ1Y3R1cmUgfHwgdHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQ7XG4gICAgcmV0dXJuIGRlZXBGaW5kKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGFbbG5nXSAmJiB0aGlzLmRhdGFbbG5nXVtuc10sIGtleSwga2V5U2VwYXJhdG9yKTtcbiAgfVxuICBhZGRSZXNvdXJjZShsbmcsIG5zLCBrZXksIHZhbHVlKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHtcbiAgICAgIHNpbGVudDogZmFsc2VcbiAgICB9O1xuICAgIGNvbnN0IGtleVNlcGFyYXRvciA9IG9wdGlvbnMua2V5U2VwYXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmtleVNlcGFyYXRvciA6IHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7XG4gICAgbGV0IHBhdGggPSBbbG5nLCBuc107XG4gICAgaWYgKGtleSkgcGF0aCA9IHBhdGguY29uY2F0KGtleVNlcGFyYXRvciA/IGtleS5zcGxpdChrZXlTZXBhcmF0b3IpIDoga2V5KTtcbiAgICBpZiAobG5nLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICBwYXRoID0gbG5nLnNwbGl0KCcuJyk7XG4gICAgICB2YWx1ZSA9IG5zO1xuICAgICAgbnMgPSBwYXRoWzFdO1xuICAgIH1cbiAgICB0aGlzLmFkZE5hbWVzcGFjZXMobnMpO1xuICAgIHNldFBhdGgodGhpcy5kYXRhLCBwYXRoLCB2YWx1ZSk7XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkgdGhpcy5lbWl0KCdhZGRlZCcsIGxuZywgbnMsIGtleSwgdmFsdWUpO1xuICB9XG4gIGFkZFJlc291cmNlcyhsbmcsIG5zLCByZXNvdXJjZXMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge1xuICAgICAgc2lsZW50OiBmYWxzZVxuICAgIH07XG4gICAgZm9yIChjb25zdCBtIGluIHJlc291cmNlcykge1xuICAgICAgaWYgKHR5cGVvZiByZXNvdXJjZXNbbV0gPT09ICdzdHJpbmcnIHx8IEFycmF5LmlzQXJyYXkocmVzb3VyY2VzW21dKSkgdGhpcy5hZGRSZXNvdXJjZShsbmcsIG5zLCBtLCByZXNvdXJjZXNbbV0sIHtcbiAgICAgICAgc2lsZW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkgdGhpcy5lbWl0KCdhZGRlZCcsIGxuZywgbnMsIHJlc291cmNlcyk7XG4gIH1cbiAgYWRkUmVzb3VyY2VCdW5kbGUobG5nLCBucywgcmVzb3VyY2VzLCBkZWVwLCBvdmVyd3JpdGUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ICYmIGFyZ3VtZW50c1s1XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzVdIDoge1xuICAgICAgc2lsZW50OiBmYWxzZSxcbiAgICAgIHNraXBDb3B5OiBmYWxzZVxuICAgIH07XG4gICAgbGV0IHBhdGggPSBbbG5nLCBuc107XG4gICAgaWYgKGxuZy5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgcGF0aCA9IGxuZy5zcGxpdCgnLicpO1xuICAgICAgZGVlcCA9IHJlc291cmNlcztcbiAgICAgIHJlc291cmNlcyA9IG5zO1xuICAgICAgbnMgPSBwYXRoWzFdO1xuICAgIH1cbiAgICB0aGlzLmFkZE5hbWVzcGFjZXMobnMpO1xuICAgIGxldCBwYWNrID0gZ2V0UGF0aCh0aGlzLmRhdGEsIHBhdGgpIHx8IHt9O1xuICAgIGlmICghb3B0aW9ucy5za2lwQ29weSkgcmVzb3VyY2VzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNvdXJjZXMpKTtcbiAgICBpZiAoZGVlcCkge1xuICAgICAgZGVlcEV4dGVuZChwYWNrLCByZXNvdXJjZXMsIG92ZXJ3cml0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhY2sgPSB7XG4gICAgICAgIC4uLnBhY2ssXG4gICAgICAgIC4uLnJlc291cmNlc1xuICAgICAgfTtcbiAgICB9XG4gICAgc2V0UGF0aCh0aGlzLmRhdGEsIHBhdGgsIHBhY2spO1xuICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHRoaXMuZW1pdCgnYWRkZWQnLCBsbmcsIG5zLCByZXNvdXJjZXMpO1xuICB9XG4gIHJlbW92ZVJlc291cmNlQnVuZGxlKGxuZywgbnMpIHtcbiAgICBpZiAodGhpcy5oYXNSZXNvdXJjZUJ1bmRsZShsbmcsIG5zKSkge1xuICAgICAgZGVsZXRlIHRoaXMuZGF0YVtsbmddW25zXTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVOYW1lc3BhY2VzKG5zKTtcbiAgICB0aGlzLmVtaXQoJ3JlbW92ZWQnLCBsbmcsIG5zKTtcbiAgfVxuICBoYXNSZXNvdXJjZUJ1bmRsZShsbmcsIG5zKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2UobG5nLCBucykgIT09IHVuZGVmaW5lZDtcbiAgfVxuICBnZXRSZXNvdXJjZUJ1bmRsZShsbmcsIG5zKSB7XG4gICAgaWYgKCFucykgbnMgPSB0aGlzLm9wdGlvbnMuZGVmYXVsdE5TO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSA9PT0gJ3YxJykgcmV0dXJuIHtcbiAgICAgIC4uLnt9LFxuICAgICAgLi4udGhpcy5nZXRSZXNvdXJjZShsbmcsIG5zKVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2UobG5nLCBucyk7XG4gIH1cbiAgZ2V0RGF0YUJ5TGFuZ3VhZ2UobG5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVtsbmddO1xuICB9XG4gIGhhc0xhbmd1YWdlU29tZVRyYW5zbGF0aW9ucyhsbmcpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREYXRhQnlMYW5ndWFnZShsbmcpO1xuICAgIGNvbnN0IG4gPSBkYXRhICYmIE9iamVjdC5rZXlzKGRhdGEpIHx8IFtdO1xuICAgIHJldHVybiAhIW4uZmluZCh2ID0+IGRhdGFbdl0gJiYgT2JqZWN0LmtleXMoZGF0YVt2XSkubGVuZ3RoID4gMCk7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cbn1cblxudmFyIHBvc3RQcm9jZXNzb3IgPSB7XG4gIHByb2Nlc3NvcnM6IHt9LFxuICBhZGRQb3N0UHJvY2Vzc29yKG1vZHVsZSkge1xuICAgIHRoaXMucHJvY2Vzc29yc1ttb2R1bGUubmFtZV0gPSBtb2R1bGU7XG4gIH0sXG4gIGhhbmRsZShwcm9jZXNzb3JzLCB2YWx1ZSwga2V5LCBvcHRpb25zLCB0cmFuc2xhdG9yKSB7XG4gICAgcHJvY2Vzc29ycy5mb3JFYWNoKHByb2Nlc3NvciA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9jZXNzb3JzW3Byb2Nlc3Nvcl0pIHZhbHVlID0gdGhpcy5wcm9jZXNzb3JzW3Byb2Nlc3Nvcl0ucHJvY2Vzcyh2YWx1ZSwga2V5LCBvcHRpb25zLCB0cmFuc2xhdG9yKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn07XG5cbmNvbnN0IGNoZWNrZWRMb2FkZWRGb3IgPSB7fTtcbmNsYXNzIFRyYW5zbGF0b3IgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvcihzZXJ2aWNlcykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBzdXBlcigpO1xuICAgIGNvcHkoWydyZXNvdXJjZVN0b3JlJywgJ2xhbmd1YWdlVXRpbHMnLCAncGx1cmFsUmVzb2x2ZXInLCAnaW50ZXJwb2xhdG9yJywgJ2JhY2tlbmRDb25uZWN0b3InLCAnaTE4bkZvcm1hdCcsICd1dGlscyddLCBzZXJ2aWNlcywgdGhpcyk7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICBpZiAodGhpcy5vcHRpb25zLmtleVNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yID0gJy4nO1xuICAgIH1cbiAgICB0aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXIuY3JlYXRlKCd0cmFuc2xhdG9yJyk7XG4gIH1cbiAgY2hhbmdlTGFuZ3VhZ2UobG5nKSB7XG4gICAgaWYgKGxuZykgdGhpcy5sYW5ndWFnZSA9IGxuZztcbiAgfVxuICBleGlzdHMoa2V5KSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHtcbiAgICAgIGludGVycG9sYXRpb246IHt9XG4gICAgfTtcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkID0gdGhpcy5yZXNvbHZlKGtleSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJlc29sdmVkICYmIHJlc29sdmVkLnJlcyAhPT0gdW5kZWZpbmVkO1xuICB9XG4gIGV4dHJhY3RGcm9tS2V5KGtleSwgb3B0aW9ucykge1xuICAgIGxldCBuc1NlcGFyYXRvciA9IG9wdGlvbnMubnNTZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubnNTZXBhcmF0b3IgOiB0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7XG4gICAgaWYgKG5zU2VwYXJhdG9yID09PSB1bmRlZmluZWQpIG5zU2VwYXJhdG9yID0gJzonO1xuICAgIGNvbnN0IGtleVNlcGFyYXRvciA9IG9wdGlvbnMua2V5U2VwYXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmtleVNlcGFyYXRvciA6IHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7XG4gICAgbGV0IG5hbWVzcGFjZXMgPSBvcHRpb25zLm5zIHx8IHRoaXMub3B0aW9ucy5kZWZhdWx0TlMgfHwgW107XG4gICAgY29uc3Qgd291bGRDaGVja0Zvck5zSW5LZXkgPSBuc1NlcGFyYXRvciAmJiBrZXkuaW5kZXhPZihuc1NlcGFyYXRvcikgPiAtMTtcbiAgICBjb25zdCBzZWVtc05hdHVyYWxMYW5ndWFnZSA9ICF0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3IgJiYgIW9wdGlvbnMua2V5U2VwYXJhdG9yICYmICF0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvciAmJiAhb3B0aW9ucy5uc1NlcGFyYXRvciAmJiAhbG9va3NMaWtlT2JqZWN0UGF0aChrZXksIG5zU2VwYXJhdG9yLCBrZXlTZXBhcmF0b3IpO1xuICAgIGlmICh3b3VsZENoZWNrRm9yTnNJbktleSAmJiAhc2VlbXNOYXR1cmFsTGFuZ3VhZ2UpIHtcbiAgICAgIGNvbnN0IG0gPSBrZXkubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7XG4gICAgICBpZiAobSAmJiBtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmFtZXNwYWNlc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcGFydHMgPSBrZXkuc3BsaXQobnNTZXBhcmF0b3IpO1xuICAgICAgaWYgKG5zU2VwYXJhdG9yICE9PSBrZXlTZXBhcmF0b3IgfHwgbnNTZXBhcmF0b3IgPT09IGtleVNlcGFyYXRvciAmJiB0aGlzLm9wdGlvbnMubnMuaW5kZXhPZihwYXJ0c1swXSkgPiAtMSkgbmFtZXNwYWNlcyA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgICBrZXkgPSBwYXJ0cy5qb2luKGtleVNlcGFyYXRvcik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycpIG5hbWVzcGFjZXMgPSBbbmFtZXNwYWNlc107XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleSxcbiAgICAgIG5hbWVzcGFjZXNcbiAgICB9O1xuICB9XG4gIHRyYW5zbGF0ZShrZXlzLCBvcHRpb25zLCBsYXN0S2V5KSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0JyAmJiB0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXIpIHtcbiAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXIoYXJndW1lbnRzKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0Jykgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGlmIChrZXlzID09PSB1bmRlZmluZWQgfHwga2V5cyA9PT0gbnVsbCkgcmV0dXJuICcnO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXlzKSkga2V5cyA9IFtTdHJpbmcoa2V5cyldO1xuICAgIGNvbnN0IHJldHVybkRldGFpbHMgPSBvcHRpb25zLnJldHVybkRldGFpbHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucmV0dXJuRGV0YWlscyA6IHRoaXMub3B0aW9ucy5yZXR1cm5EZXRhaWxzO1xuICAgIGNvbnN0IGtleVNlcGFyYXRvciA9IG9wdGlvbnMua2V5U2VwYXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmtleVNlcGFyYXRvciA6IHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7XG4gICAgY29uc3Qge1xuICAgICAga2V5LFxuICAgICAgbmFtZXNwYWNlc1xuICAgIH0gPSB0aGlzLmV4dHJhY3RGcm9tS2V5KGtleXNba2V5cy5sZW5ndGggLSAxXSwgb3B0aW9ucyk7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gbmFtZXNwYWNlc1tuYW1lc3BhY2VzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGxuZyA9IG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2U7XG4gICAgY29uc3QgYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGUgPSBvcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlIHx8IHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZTtcbiAgICBpZiAobG5nICYmIGxuZy50b0xvd2VyQ2FzZSgpID09PSAnY2ltb2RlJykge1xuICAgICAgaWYgKGFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlKSB7XG4gICAgICAgIGNvbnN0IG5zU2VwYXJhdG9yID0gb3B0aW9ucy5uc1NlcGFyYXRvciB8fCB0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7XG4gICAgICAgIGlmIChyZXR1cm5EZXRhaWxzKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlczogYCR7bmFtZXNwYWNlfSR7bnNTZXBhcmF0b3J9JHtrZXl9YCxcbiAgICAgICAgICAgIHVzZWRLZXk6IGtleSxcbiAgICAgICAgICAgIGV4YWN0VXNlZEtleToga2V5LFxuICAgICAgICAgICAgdXNlZExuZzogbG5nLFxuICAgICAgICAgICAgdXNlZE5TOiBuYW1lc3BhY2UsXG4gICAgICAgICAgICB1c2VkUGFyYW1zOiB0aGlzLmdldFVzZWRQYXJhbXNEZXRhaWxzKG9wdGlvbnMpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7bmFtZXNwYWNlfSR7bnNTZXBhcmF0b3J9JHtrZXl9YDtcbiAgICAgIH1cbiAgICAgIGlmIChyZXR1cm5EZXRhaWxzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzOiBrZXksXG4gICAgICAgICAgdXNlZEtleToga2V5LFxuICAgICAgICAgIGV4YWN0VXNlZEtleToga2V5LFxuICAgICAgICAgIHVzZWRMbmc6IGxuZyxcbiAgICAgICAgICB1c2VkTlM6IG5hbWVzcGFjZSxcbiAgICAgICAgICB1c2VkUGFyYW1zOiB0aGlzLmdldFVzZWRQYXJhbXNEZXRhaWxzKG9wdGlvbnMpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMucmVzb2x2ZShrZXlzLCBvcHRpb25zKTtcbiAgICBsZXQgcmVzID0gcmVzb2x2ZWQgJiYgcmVzb2x2ZWQucmVzO1xuICAgIGNvbnN0IHJlc1VzZWRLZXkgPSByZXNvbHZlZCAmJiByZXNvbHZlZC51c2VkS2V5IHx8IGtleTtcbiAgICBjb25zdCByZXNFeGFjdFVzZWRLZXkgPSByZXNvbHZlZCAmJiByZXNvbHZlZC5leGFjdFVzZWRLZXkgfHwga2V5O1xuICAgIGNvbnN0IHJlc1R5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHJlcyk7XG4gICAgY29uc3Qgbm9PYmplY3QgPSBbJ1tvYmplY3QgTnVtYmVyXScsICdbb2JqZWN0IEZ1bmN0aW9uXScsICdbb2JqZWN0IFJlZ0V4cF0nXTtcbiAgICBjb25zdCBqb2luQXJyYXlzID0gb3B0aW9ucy5qb2luQXJyYXlzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmpvaW5BcnJheXMgOiB0aGlzLm9wdGlvbnMuam9pbkFycmF5cztcbiAgICBjb25zdCBoYW5kbGVBc09iamVjdEluSTE4bkZvcm1hdCA9ICF0aGlzLmkxOG5Gb3JtYXQgfHwgdGhpcy5pMThuRm9ybWF0LmhhbmRsZUFzT2JqZWN0O1xuICAgIGNvbnN0IGhhbmRsZUFzT2JqZWN0ID0gdHlwZW9mIHJlcyAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHJlcyAhPT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiByZXMgIT09ICdudW1iZXInO1xuICAgIGlmIChoYW5kbGVBc09iamVjdEluSTE4bkZvcm1hdCAmJiByZXMgJiYgaGFuZGxlQXNPYmplY3QgJiYgbm9PYmplY3QuaW5kZXhPZihyZXNUeXBlKSA8IDAgJiYgISh0eXBlb2Ygam9pbkFycmF5cyA9PT0gJ3N0cmluZycgJiYgQXJyYXkuaXNBcnJheShyZXMpKSkge1xuICAgICAgaWYgKCFvcHRpb25zLnJldHVybk9iamVjdHMgJiYgIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ2FjY2Vzc2luZyBhbiBvYmplY3QgLSBidXQgcmV0dXJuT2JqZWN0cyBvcHRpb25zIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyID8gdGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcihyZXNVc2VkS2V5LCByZXMsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIG5zOiBuYW1lc3BhY2VzXG4gICAgICAgIH0pIDogYGtleSAnJHtrZXl9ICgke3RoaXMubGFuZ3VhZ2V9KScgcmV0dXJuZWQgYW4gb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nLmA7XG4gICAgICAgIGlmIChyZXR1cm5EZXRhaWxzKSB7XG4gICAgICAgICAgcmVzb2x2ZWQucmVzID0gcjtcbiAgICAgICAgICByZXNvbHZlZC51c2VkUGFyYW1zID0gdGhpcy5nZXRVc2VkUGFyYW1zRGV0YWlscyhvcHRpb25zKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG4gICAgICBpZiAoa2V5U2VwYXJhdG9yKSB7XG4gICAgICAgIGNvbnN0IHJlc1R5cGVJc0FycmF5ID0gQXJyYXkuaXNBcnJheShyZXMpO1xuICAgICAgICBjb25zdCBjb3B5ID0gcmVzVHlwZUlzQXJyYXkgPyBbXSA6IHt9O1xuICAgICAgICBjb25zdCBuZXdLZXlUb1VzZSA9IHJlc1R5cGVJc0FycmF5ID8gcmVzRXhhY3RVc2VkS2V5IDogcmVzVXNlZEtleTtcbiAgICAgICAgZm9yIChjb25zdCBtIGluIHJlcykge1xuICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVzLCBtKSkge1xuICAgICAgICAgICAgY29uc3QgZGVlcEtleSA9IGAke25ld0tleVRvVXNlfSR7a2V5U2VwYXJhdG9yfSR7bX1gO1xuICAgICAgICAgICAgY29weVttXSA9IHRoaXMudHJhbnNsYXRlKGRlZXBLZXksIHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgLi4ue1xuICAgICAgICAgICAgICAgIGpvaW5BcnJheXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG5zOiBuYW1lc3BhY2VzXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNvcHlbbV0gPT09IGRlZXBLZXkpIGNvcHlbbV0gPSByZXNbbV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcyA9IGNvcHk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoYW5kbGVBc09iamVjdEluSTE4bkZvcm1hdCAmJiB0eXBlb2Ygam9pbkFycmF5cyA9PT0gJ3N0cmluZycgJiYgQXJyYXkuaXNBcnJheShyZXMpKSB7XG4gICAgICByZXMgPSByZXMuam9pbihqb2luQXJyYXlzKTtcbiAgICAgIGlmIChyZXMpIHJlcyA9IHRoaXMuZXh0ZW5kVHJhbnNsYXRpb24ocmVzLCBrZXlzLCBvcHRpb25zLCBsYXN0S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHVzZWREZWZhdWx0ID0gZmFsc2U7XG4gICAgICBsZXQgdXNlZEtleSA9IGZhbHNlO1xuICAgICAgY29uc3QgbmVlZHNQbHVyYWxIYW5kbGluZyA9IG9wdGlvbnMuY291bnQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5jb3VudCAhPT0gJ3N0cmluZyc7XG4gICAgICBjb25zdCBoYXNEZWZhdWx0VmFsdWUgPSBUcmFuc2xhdG9yLmhhc0RlZmF1bHRWYWx1ZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZVN1ZmZpeCA9IG5lZWRzUGx1cmFsSGFuZGxpbmcgPyB0aGlzLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChsbmcsIG9wdGlvbnMuY291bnQsIG9wdGlvbnMpIDogJyc7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWVTdWZmaXhPcmRpbmFsRmFsbGJhY2sgPSBvcHRpb25zLm9yZGluYWwgJiYgbmVlZHNQbHVyYWxIYW5kbGluZyA/IHRoaXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KGxuZywgb3B0aW9ucy5jb3VudCwge1xuICAgICAgICBvcmRpbmFsOiBmYWxzZVxuICAgICAgfSkgOiAnJztcbiAgICAgIGNvbnN0IG5lZWRzWmVyb1N1ZmZpeExvb2t1cCA9IG5lZWRzUGx1cmFsSGFuZGxpbmcgJiYgIW9wdGlvbnMub3JkaW5hbCAmJiBvcHRpb25zLmNvdW50ID09PSAwICYmIHRoaXMucGx1cmFsUmVzb2x2ZXIuc2hvdWxkVXNlSW50bEFwaSgpO1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gbmVlZHNaZXJvU3VmZml4TG9va3VwICYmIG9wdGlvbnNbYGRlZmF1bHRWYWx1ZSR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn16ZXJvYF0gfHwgb3B0aW9uc1tgZGVmYXVsdFZhbHVlJHtkZWZhdWx0VmFsdWVTdWZmaXh9YF0gfHwgb3B0aW9uc1tgZGVmYXVsdFZhbHVlJHtkZWZhdWx0VmFsdWVTdWZmaXhPcmRpbmFsRmFsbGJhY2t9YF0gfHwgb3B0aW9ucy5kZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZExvb2t1cChyZXMpICYmIGhhc0RlZmF1bHRWYWx1ZSkge1xuICAgICAgICB1c2VkRGVmYXVsdCA9IHRydWU7XG4gICAgICAgIHJlcyA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5pc1ZhbGlkTG9va3VwKHJlcykpIHtcbiAgICAgICAgdXNlZEtleSA9IHRydWU7XG4gICAgICAgIHJlcyA9IGtleTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1pc3NpbmdLZXlOb1ZhbHVlRmFsbGJhY2tUb0tleSA9IG9wdGlvbnMubWlzc2luZ0tleU5vVmFsdWVGYWxsYmFja1RvS2V5IHx8IHRoaXMub3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXk7XG4gICAgICBjb25zdCByZXNGb3JNaXNzaW5nID0gbWlzc2luZ0tleU5vVmFsdWVGYWxsYmFja1RvS2V5ICYmIHVzZWRLZXkgPyB1bmRlZmluZWQgOiByZXM7XG4gICAgICBjb25zdCB1cGRhdGVNaXNzaW5nID0gaGFzRGVmYXVsdFZhbHVlICYmIGRlZmF1bHRWYWx1ZSAhPT0gcmVzICYmIHRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO1xuICAgICAgaWYgKHVzZWRLZXkgfHwgdXNlZERlZmF1bHQgfHwgdXBkYXRlTWlzc2luZykge1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2codXBkYXRlTWlzc2luZyA/ICd1cGRhdGVLZXknIDogJ21pc3NpbmdLZXknLCBsbmcsIG5hbWVzcGFjZSwga2V5LCB1cGRhdGVNaXNzaW5nID8gZGVmYXVsdFZhbHVlIDogcmVzKTtcbiAgICAgICAgaWYgKGtleVNlcGFyYXRvcikge1xuICAgICAgICAgIGNvbnN0IGZrID0gdGhpcy5yZXNvbHZlKGtleSwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIGtleVNlcGFyYXRvcjogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZmsgJiYgZmsucmVzKSB0aGlzLmxvZ2dlci53YXJuKCdTZWVtcyB0aGUgbG9hZGVkIHRyYW5zbGF0aW9ucyB3ZXJlIGluIGZsYXQgSlNPTiBmb3JtYXQgaW5zdGVhZCBvZiBuZXN0ZWQuIEVpdGhlciBzZXQga2V5U2VwYXJhdG9yOiBmYWxzZSBvbiBpbml0IG9yIG1ha2Ugc3VyZSB5b3VyIHRyYW5zbGF0aW9ucyBhcmUgcHVibGlzaGVkIGluIG5lc3RlZCBmb3JtYXQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxuZ3MgPSBbXTtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tMbmdzID0gdGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLCBvcHRpb25zLmxuZyB8fCB0aGlzLmxhbmd1YWdlKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvID09PSAnZmFsbGJhY2snICYmIGZhbGxiYWNrTG5ncyAmJiBmYWxsYmFja0xuZ3NbMF0pIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZhbGxiYWNrTG5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbG5ncy5wdXNoKGZhbGxiYWNrTG5nc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvID09PSAnYWxsJykge1xuICAgICAgICAgIGxuZ3MgPSB0aGlzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxuZ3MucHVzaChvcHRpb25zLmxuZyB8fCB0aGlzLmxhbmd1YWdlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZW5kID0gKGwsIGssIHNwZWNpZmljRGVmYXVsdFZhbHVlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdEZvck1pc3NpbmcgPSBoYXNEZWZhdWx0VmFsdWUgJiYgc3BlY2lmaWNEZWZhdWx0VmFsdWUgIT09IHJlcyA/IHNwZWNpZmljRGVmYXVsdFZhbHVlIDogcmVzRm9yTWlzc2luZztcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXIobCwgbmFtZXNwYWNlLCBrLCBkZWZhdWx0Rm9yTWlzc2luZywgdXBkYXRlTWlzc2luZywgb3B0aW9ucyk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmJhY2tlbmRDb25uZWN0b3IgJiYgdGhpcy5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcobCwgbmFtZXNwYWNlLCBrLCBkZWZhdWx0Rm9yTWlzc2luZywgdXBkYXRlTWlzc2luZywgb3B0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZW1pdCgnbWlzc2luZ0tleScsIGwsIG5hbWVzcGFjZSwgaywgcmVzKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zYXZlTWlzc2luZykge1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzICYmIG5lZWRzUGx1cmFsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgIGxuZ3MuZm9yRWFjaChsYW5ndWFnZSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHN1ZmZpeGVzID0gdGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXhlcyhsYW5ndWFnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgIGlmIChuZWVkc1plcm9TdWZmaXhMb29rdXAgJiYgb3B0aW9uc1tgZGVmYXVsdFZhbHVlJHt0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yfXplcm9gXSAmJiBzdWZmaXhlcy5pbmRleE9mKGAke3RoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3J9emVyb2ApIDwgMCkge1xuICAgICAgICAgICAgICAgIHN1ZmZpeGVzLnB1c2goYCR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn16ZXJvYCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3VmZml4ZXMuZm9yRWFjaChzdWZmaXggPT4ge1xuICAgICAgICAgICAgICAgIHNlbmQoW2xhbmd1YWdlXSwga2V5ICsgc3VmZml4LCBvcHRpb25zW2BkZWZhdWx0VmFsdWUke3N1ZmZpeH1gXSB8fCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZW5kKGxuZ3MsIGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlcyA9IHRoaXMuZXh0ZW5kVHJhbnNsYXRpb24ocmVzLCBrZXlzLCBvcHRpb25zLCByZXNvbHZlZCwgbGFzdEtleSk7XG4gICAgICBpZiAodXNlZEtleSAmJiByZXMgPT09IGtleSAmJiB0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5KSByZXMgPSBgJHtuYW1lc3BhY2V9OiR7a2V5fWA7XG4gICAgICBpZiAoKHVzZWRLZXkgfHwgdXNlZERlZmF1bHQpICYmIHRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSAhPT0gJ3YxJykge1xuICAgICAgICAgIHJlcyA9IHRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyKHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXkgPyBgJHtuYW1lc3BhY2V9OiR7a2V5fWAgOiBrZXksIHVzZWREZWZhdWx0ID8gcmVzIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXMgPSB0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihyZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXR1cm5EZXRhaWxzKSB7XG4gICAgICByZXNvbHZlZC5yZXMgPSByZXM7XG4gICAgICByZXNvbHZlZC51c2VkUGFyYW1zID0gdGhpcy5nZXRVc2VkUGFyYW1zRGV0YWlscyhvcHRpb25zKTtcbiAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBleHRlbmRUcmFuc2xhdGlvbihyZXMsIGtleSwgb3B0aW9ucywgcmVzb2x2ZWQsIGxhc3RLZXkpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIGlmICh0aGlzLmkxOG5Gb3JtYXQgJiYgdGhpcy5pMThuRm9ybWF0LnBhcnNlKSB7XG4gICAgICByZXMgPSB0aGlzLmkxOG5Gb3JtYXQucGFyc2UocmVzLCB7XG4gICAgICAgIC4uLnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICAgIH0sIG9wdGlvbnMubG5nIHx8IHRoaXMubGFuZ3VhZ2UgfHwgcmVzb2x2ZWQudXNlZExuZywgcmVzb2x2ZWQudXNlZE5TLCByZXNvbHZlZC51c2VkS2V5LCB7XG4gICAgICAgIHJlc29sdmVkXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNraXBJbnRlcnBvbGF0aW9uKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbnRlcnBvbGF0aW9uKSB0aGlzLmludGVycG9sYXRvci5pbml0KHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgLi4ue1xuICAgICAgICAgIGludGVycG9sYXRpb246IHtcbiAgICAgICAgICAgIC4uLnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICAgLi4ub3B0aW9ucy5pbnRlcnBvbGF0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNraXBPblZhcmlhYmxlcyA9IHR5cGVvZiByZXMgPT09ICdzdHJpbmcnICYmIChvcHRpb25zICYmIG9wdGlvbnMuaW50ZXJwb2xhdGlvbiAmJiBvcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzIDogdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzKTtcbiAgICAgIGxldCBuZXN0QmVmO1xuICAgICAgaWYgKHNraXBPblZhcmlhYmxlcykge1xuICAgICAgICBjb25zdCBuYiA9IHJlcy5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtcbiAgICAgICAgbmVzdEJlZiA9IG5iICYmIG5iLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGxldCBkYXRhID0gb3B0aW9ucy5yZXBsYWNlICYmIHR5cGVvZiBvcHRpb25zLnJlcGxhY2UgIT09ICdzdHJpbmcnID8gb3B0aW9ucy5yZXBsYWNlIDogb3B0aW9ucztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzKSBkYXRhID0ge1xuICAgICAgICAuLi50aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzLFxuICAgICAgICAuLi5kYXRhXG4gICAgICB9O1xuICAgICAgcmVzID0gdGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUocmVzLCBkYXRhLCBvcHRpb25zLmxuZyB8fCB0aGlzLmxhbmd1YWdlIHx8IHJlc29sdmVkLnVzZWRMbmcsIG9wdGlvbnMpO1xuICAgICAgaWYgKHNraXBPblZhcmlhYmxlcykge1xuICAgICAgICBjb25zdCBuYSA9IHJlcy5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtcbiAgICAgICAgY29uc3QgbmVzdEFmdCA9IG5hICYmIG5hLmxlbmd0aDtcbiAgICAgICAgaWYgKG5lc3RCZWYgPCBuZXN0QWZ0KSBvcHRpb25zLm5lc3QgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghb3B0aW9ucy5sbmcgJiYgdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkgIT09ICd2MScgJiYgcmVzb2x2ZWQgJiYgcmVzb2x2ZWQucmVzKSBvcHRpb25zLmxuZyA9IHRoaXMubGFuZ3VhZ2UgfHwgcmVzb2x2ZWQudXNlZExuZztcbiAgICAgIGlmIChvcHRpb25zLm5lc3QgIT09IGZhbHNlKSByZXMgPSB0aGlzLmludGVycG9sYXRvci5uZXN0KHJlcywgZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0S2V5ICYmIGxhc3RLZXlbMF0gPT09IGFyZ3NbMF0gJiYgIW9wdGlvbnMuY29udGV4dCkge1xuICAgICAgICAgIF90aGlzLmxvZ2dlci53YXJuKGBJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAke2FyZ3NbMF19IGluIGtleTogJHtrZXlbMF19YCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzLnRyYW5zbGF0ZSguLi5hcmdzLCBrZXkpO1xuICAgICAgfSwgb3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5pbnRlcnBvbGF0aW9uKSB0aGlzLmludGVycG9sYXRvci5yZXNldCgpO1xuICAgIH1cbiAgICBjb25zdCBwb3N0UHJvY2VzcyA9IG9wdGlvbnMucG9zdFByb2Nlc3MgfHwgdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzO1xuICAgIGNvbnN0IHBvc3RQcm9jZXNzb3JOYW1lcyA9IHR5cGVvZiBwb3N0UHJvY2VzcyA9PT0gJ3N0cmluZycgPyBbcG9zdFByb2Nlc3NdIDogcG9zdFByb2Nlc3M7XG4gICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkICYmIHJlcyAhPT0gbnVsbCAmJiBwb3N0UHJvY2Vzc29yTmFtZXMgJiYgcG9zdFByb2Nlc3Nvck5hbWVzLmxlbmd0aCAmJiBvcHRpb25zLmFwcGx5UG9zdFByb2Nlc3NvciAhPT0gZmFsc2UpIHtcbiAgICAgIHJlcyA9IHBvc3RQcm9jZXNzb3IuaGFuZGxlKHBvc3RQcm9jZXNzb3JOYW1lcywgcmVzLCBrZXksIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQgPyB7XG4gICAgICAgIGkxOG5SZXNvbHZlZDoge1xuICAgICAgICAgIC4uLnJlc29sdmVkLFxuICAgICAgICAgIHVzZWRQYXJhbXM6IHRoaXMuZ2V0VXNlZFBhcmFtc0RldGFpbHMob3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgfSA6IG9wdGlvbnMsIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHJlc29sdmUoa2V5cykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBsZXQgZm91bmQ7XG4gICAgbGV0IHVzZWRLZXk7XG4gICAgbGV0IGV4YWN0VXNlZEtleTtcbiAgICBsZXQgdXNlZExuZztcbiAgICBsZXQgdXNlZE5TO1xuICAgIGlmICh0eXBlb2Yga2V5cyA9PT0gJ3N0cmluZycpIGtleXMgPSBba2V5c107XG4gICAga2V5cy5mb3JFYWNoKGsgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZExvb2t1cChmb3VuZCkpIHJldHVybjtcbiAgICAgIGNvbnN0IGV4dHJhY3RlZCA9IHRoaXMuZXh0cmFjdEZyb21LZXkoaywgb3B0aW9ucyk7XG4gICAgICBjb25zdCBrZXkgPSBleHRyYWN0ZWQua2V5O1xuICAgICAgdXNlZEtleSA9IGtleTtcbiAgICAgIGxldCBuYW1lc3BhY2VzID0gZXh0cmFjdGVkLm5hbWVzcGFjZXM7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrTlMpIG5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzLmNvbmNhdCh0aGlzLm9wdGlvbnMuZmFsbGJhY2tOUyk7XG4gICAgICBjb25zdCBuZWVkc1BsdXJhbEhhbmRsaW5nID0gb3B0aW9ucy5jb3VudCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNvdW50ICE9PSAnc3RyaW5nJztcbiAgICAgIGNvbnN0IG5lZWRzWmVyb1N1ZmZpeExvb2t1cCA9IG5lZWRzUGx1cmFsSGFuZGxpbmcgJiYgIW9wdGlvbnMub3JkaW5hbCAmJiBvcHRpb25zLmNvdW50ID09PSAwICYmIHRoaXMucGx1cmFsUmVzb2x2ZXIuc2hvdWxkVXNlSW50bEFwaSgpO1xuICAgICAgY29uc3QgbmVlZHNDb250ZXh0SGFuZGxpbmcgPSBvcHRpb25zLmNvbnRleHQgIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ251bWJlcicpICYmIG9wdGlvbnMuY29udGV4dCAhPT0gJyc7XG4gICAgICBjb25zdCBjb2RlcyA9IG9wdGlvbnMubG5ncyA/IG9wdGlvbnMubG5ncyA6IHRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkob3B0aW9ucy5sbmcgfHwgdGhpcy5sYW5ndWFnZSwgb3B0aW9ucy5mYWxsYmFja0xuZyk7XG4gICAgICBuYW1lc3BhY2VzLmZvckVhY2gobnMgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkTG9va3VwKGZvdW5kKSkgcmV0dXJuO1xuICAgICAgICB1c2VkTlMgPSBucztcbiAgICAgICAgaWYgKCFjaGVja2VkTG9hZGVkRm9yW2Ake2NvZGVzWzBdfS0ke25zfWBdICYmIHRoaXMudXRpbHMgJiYgdGhpcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UgJiYgIXRoaXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKHVzZWROUykpIHtcbiAgICAgICAgICBjaGVja2VkTG9hZGVkRm9yW2Ake2NvZGVzWzBdfS0ke25zfWBdID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBrZXkgXCIke3VzZWRLZXl9XCIgZm9yIGxhbmd1YWdlcyBcIiR7Y29kZXMuam9pbignLCAnKX1cIiB3b24ndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlIFwiJHt1c2VkTlN9XCIgd2FzIG5vdCB5ZXQgbG9hZGVkYCwgJ1RoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhIScpO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVzLmZvckVhY2goY29kZSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZExvb2t1cChmb3VuZCkpIHJldHVybjtcbiAgICAgICAgICB1c2VkTG5nID0gY29kZTtcbiAgICAgICAgICBjb25zdCBmaW5hbEtleXMgPSBba2V5XTtcbiAgICAgICAgICBpZiAodGhpcy5pMThuRm9ybWF0ICYmIHRoaXMuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKSB7XG4gICAgICAgICAgICB0aGlzLmkxOG5Gb3JtYXQuYWRkTG9va3VwS2V5cyhmaW5hbEtleXMsIGtleSwgY29kZSwgbnMsIG9wdGlvbnMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcGx1cmFsU3VmZml4O1xuICAgICAgICAgICAgaWYgKG5lZWRzUGx1cmFsSGFuZGxpbmcpIHBsdXJhbFN1ZmZpeCA9IHRoaXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KGNvZGUsIG9wdGlvbnMuY291bnQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgemVyb1N1ZmZpeCA9IGAke3RoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3J9emVyb2A7XG4gICAgICAgICAgICBjb25zdCBvcmRpbmFsUHJlZml4ID0gYCR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn1vcmRpbmFsJHt0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yfWA7XG4gICAgICAgICAgICBpZiAobmVlZHNQbHVyYWxIYW5kbGluZykge1xuICAgICAgICAgICAgICBmaW5hbEtleXMucHVzaChrZXkgKyBwbHVyYWxTdWZmaXgpO1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vcmRpbmFsICYmIHBsdXJhbFN1ZmZpeC5pbmRleE9mKG9yZGluYWxQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZmluYWxLZXlzLnB1c2goa2V5ICsgcGx1cmFsU3VmZml4LnJlcGxhY2Uob3JkaW5hbFByZWZpeCwgdGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChuZWVkc1plcm9TdWZmaXhMb29rdXApIHtcbiAgICAgICAgICAgICAgICBmaW5hbEtleXMucHVzaChrZXkgKyB6ZXJvU3VmZml4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5lZWRzQ29udGV4dEhhbmRsaW5nKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbnRleHRLZXkgPSBgJHtrZXl9JHt0aGlzLm9wdGlvbnMuY29udGV4dFNlcGFyYXRvcn0ke29wdGlvbnMuY29udGV4dH1gO1xuICAgICAgICAgICAgICBmaW5hbEtleXMucHVzaChjb250ZXh0S2V5KTtcbiAgICAgICAgICAgICAgaWYgKG5lZWRzUGx1cmFsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgICAgICBmaW5hbEtleXMucHVzaChjb250ZXh0S2V5ICsgcGx1cmFsU3VmZml4KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vcmRpbmFsICYmIHBsdXJhbFN1ZmZpeC5pbmRleE9mKG9yZGluYWxQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEtleXMucHVzaChjb250ZXh0S2V5ICsgcGx1cmFsU3VmZml4LnJlcGxhY2Uob3JkaW5hbFByZWZpeCwgdGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmVlZHNaZXJvU3VmZml4TG9va3VwKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEtleXMucHVzaChjb250ZXh0S2V5ICsgemVyb1N1ZmZpeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBwb3NzaWJsZUtleTtcbiAgICAgICAgICB3aGlsZSAocG9zc2libGVLZXkgPSBmaW5hbEtleXMucG9wKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1ZhbGlkTG9va3VwKGZvdW5kKSkge1xuICAgICAgICAgICAgICBleGFjdFVzZWRLZXkgPSBwb3NzaWJsZUtleTtcbiAgICAgICAgICAgICAgZm91bmQgPSB0aGlzLmdldFJlc291cmNlKGNvZGUsIG5zLCBwb3NzaWJsZUtleSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICByZXM6IGZvdW5kLFxuICAgICAgdXNlZEtleSxcbiAgICAgIGV4YWN0VXNlZEtleSxcbiAgICAgIHVzZWRMbmcsXG4gICAgICB1c2VkTlNcbiAgICB9O1xuICB9XG4gIGlzVmFsaWRMb29rdXAocmVzKSB7XG4gICAgcmV0dXJuIHJlcyAhPT0gdW5kZWZpbmVkICYmICEoIXRoaXMub3B0aW9ucy5yZXR1cm5OdWxsICYmIHJlcyA9PT0gbnVsbCkgJiYgISghdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nICYmIHJlcyA9PT0gJycpO1xuICB9XG4gIGdldFJlc291cmNlKGNvZGUsIG5zLCBrZXkpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgaWYgKHRoaXMuaTE4bkZvcm1hdCAmJiB0aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2UpIHJldHVybiB0aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2UoY29kZSwgbnMsIGtleSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VTdG9yZS5nZXRSZXNvdXJjZShjb2RlLCBucywga2V5LCBvcHRpb25zKTtcbiAgfVxuICBnZXRVc2VkUGFyYW1zRGV0YWlscygpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgY29uc3Qgb3B0aW9uc0tleXMgPSBbJ2RlZmF1bHRWYWx1ZScsICdvcmRpbmFsJywgJ2NvbnRleHQnLCAncmVwbGFjZScsICdsbmcnLCAnbG5ncycsICdmYWxsYmFja0xuZycsICducycsICdrZXlTZXBhcmF0b3InLCAnbnNTZXBhcmF0b3InLCAncmV0dXJuT2JqZWN0cycsICdyZXR1cm5EZXRhaWxzJywgJ2pvaW5BcnJheXMnLCAncG9zdFByb2Nlc3MnLCAnaW50ZXJwb2xhdGlvbiddO1xuICAgIGNvbnN0IHVzZU9wdGlvbnNSZXBsYWNlRm9yRGF0YSA9IG9wdGlvbnMucmVwbGFjZSAmJiB0eXBlb2Ygb3B0aW9ucy5yZXBsYWNlICE9PSAnc3RyaW5nJztcbiAgICBsZXQgZGF0YSA9IHVzZU9wdGlvbnNSZXBsYWNlRm9yRGF0YSA/IG9wdGlvbnMucmVwbGFjZSA6IG9wdGlvbnM7XG4gICAgaWYgKHVzZU9wdGlvbnNSZXBsYWNlRm9yRGF0YSAmJiB0eXBlb2Ygb3B0aW9ucy5jb3VudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGRhdGEuY291bnQgPSBvcHRpb25zLmNvdW50O1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcykge1xuICAgICAgZGF0YSA9IHtcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyxcbiAgICAgICAgLi4uZGF0YVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCF1c2VPcHRpb25zUmVwbGFjZUZvckRhdGEpIHtcbiAgICAgIGRhdGEgPSB7XG4gICAgICAgIC4uLmRhdGFcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBvcHRpb25zS2V5cykge1xuICAgICAgICBkZWxldGUgZGF0YVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICBzdGF0aWMgaGFzRGVmYXVsdFZhbHVlKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwcmVmaXggPSAnZGVmYXVsdFZhbHVlJztcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsIG9wdGlvbikgJiYgcHJlZml4ID09PSBvcHRpb24uc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpICYmIHVuZGVmaW5lZCAhPT0gb3B0aW9uc1tvcHRpb25dKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuY29uc3QgY2FwaXRhbGl6ZSA9IHN0cmluZyA9PiBzdHJpbmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSk7XG5jbGFzcyBMYW5ndWFnZVV0aWwge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnN1cHBvcnRlZExuZ3MgPSB0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyB8fCBmYWxzZTtcbiAgICB0aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXIuY3JlYXRlKCdsYW5ndWFnZVV0aWxzJyk7XG4gIH1cbiAgZ2V0U2NyaXB0UGFydEZyb21Db2RlKGNvZGUpIHtcbiAgICBjb2RlID0gZ2V0Q2xlYW5lZENvZGUoY29kZSk7XG4gICAgaWYgKCFjb2RlIHx8IGNvZGUuaW5kZXhPZignLScpIDwgMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcCA9IGNvZGUuc3BsaXQoJy0nKTtcbiAgICBpZiAocC5sZW5ndGggPT09IDIpIHJldHVybiBudWxsO1xuICAgIHAucG9wKCk7XG4gICAgaWYgKHBbcC5sZW5ndGggLSAxXS50b0xvd2VyQ2FzZSgpID09PSAneCcpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShwLmpvaW4oJy0nKSk7XG4gIH1cbiAgZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoY29kZSkge1xuICAgIGNvZGUgPSBnZXRDbGVhbmVkQ29kZShjb2RlKTtcbiAgICBpZiAoIWNvZGUgfHwgY29kZS5pbmRleE9mKCctJykgPCAwKSByZXR1cm4gY29kZTtcbiAgICBjb25zdCBwID0gY29kZS5zcGxpdCgnLScpO1xuICAgIHJldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShwWzBdKTtcbiAgfVxuICBmb3JtYXRMYW5ndWFnZUNvZGUoY29kZSkge1xuICAgIGlmICh0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycgJiYgY29kZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgY29uc3Qgc3BlY2lhbENhc2VzID0gWydoYW5zJywgJ2hhbnQnLCAnbGF0bicsICdjeXJsJywgJ2NhbnMnLCAnbW9uZycsICdhcmFiJ107XG4gICAgICBsZXQgcCA9IGNvZGUuc3BsaXQoJy0nKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nKSB7XG4gICAgICAgIHAgPSBwLm1hcChwYXJ0ID0+IHBhcnQudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9IGVsc2UgaWYgKHAubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHBbMF0gPSBwWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHBbMV0gPSBwWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGlmIChzcGVjaWFsQ2FzZXMuaW5kZXhPZihwWzFdLnRvTG93ZXJDYXNlKCkpID4gLTEpIHBbMV0gPSBjYXBpdGFsaXplKHBbMV0udG9Mb3dlckNhc2UoKSk7XG4gICAgICB9IGVsc2UgaWYgKHAubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHBbMF0gPSBwWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChwWzFdLmxlbmd0aCA9PT0gMikgcFsxXSA9IHBbMV0udG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKHBbMF0gIT09ICdzZ24nICYmIHBbMl0ubGVuZ3RoID09PSAyKSBwWzJdID0gcFsyXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoc3BlY2lhbENhc2VzLmluZGV4T2YocFsxXS50b0xvd2VyQ2FzZSgpKSA+IC0xKSBwWzFdID0gY2FwaXRhbGl6ZShwWzFdLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoc3BlY2lhbENhc2VzLmluZGV4T2YocFsyXS50b0xvd2VyQ2FzZSgpKSA+IC0xKSBwWzJdID0gY2FwaXRhbGl6ZShwWzJdLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHAuam9pbignLScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZSB8fCB0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nID8gY29kZS50b0xvd2VyQ2FzZSgpIDogY29kZTtcbiAgfVxuICBpc1N1cHBvcnRlZENvZGUoY29kZSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubG9hZCA9PT0gJ2xhbmd1YWdlT25seScgfHwgdGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykge1xuICAgICAgY29kZSA9IHRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoY29kZSk7XG4gICAgfVxuICAgIHJldHVybiAhdGhpcy5zdXBwb3J0ZWRMbmdzIHx8ICF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RoIHx8IHRoaXMuc3VwcG9ydGVkTG5ncy5pbmRleE9mKGNvZGUpID4gLTE7XG4gIH1cbiAgZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKGNvZGVzKSB7XG4gICAgaWYgKCFjb2RlcykgcmV0dXJuIG51bGw7XG4gICAgbGV0IGZvdW5kO1xuICAgIGNvZGVzLmZvckVhY2goY29kZSA9PiB7XG4gICAgICBpZiAoZm91bmQpIHJldHVybjtcbiAgICAgIGNvbnN0IGNsZWFuZWRMbmcgPSB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShjb2RlKTtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MgfHwgdGhpcy5pc1N1cHBvcnRlZENvZGUoY2xlYW5lZExuZykpIGZvdW5kID0gY2xlYW5lZExuZztcbiAgICB9KTtcbiAgICBpZiAoIWZvdW5kICYmIHRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzKSB7XG4gICAgICBjb2Rlcy5mb3JFYWNoKGNvZGUgPT4ge1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybjtcbiAgICAgICAgY29uc3QgbG5nT25seSA9IHRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoY29kZSk7XG4gICAgICAgIGlmICh0aGlzLmlzU3VwcG9ydGVkQ29kZShsbmdPbmx5KSkgcmV0dXJuIGZvdW5kID0gbG5nT25seTtcbiAgICAgICAgZm91bmQgPSB0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKHN1cHBvcnRlZExuZyA9PiB7XG4gICAgICAgICAgaWYgKHN1cHBvcnRlZExuZyA9PT0gbG5nT25seSkgcmV0dXJuIHN1cHBvcnRlZExuZztcbiAgICAgICAgICBpZiAoc3VwcG9ydGVkTG5nLmluZGV4T2YoJy0nKSA8IDAgJiYgbG5nT25seS5pbmRleE9mKCctJykgPCAwKSByZXR1cm47XG4gICAgICAgICAgaWYgKHN1cHBvcnRlZExuZy5pbmRleE9mKCctJykgPiAwICYmIGxuZ09ubHkuaW5kZXhPZignLScpIDwgMCAmJiBzdXBwb3J0ZWRMbmcuc3Vic3RyaW5nKDAsIHN1cHBvcnRlZExuZy5pbmRleE9mKCctJykpID09PSBsbmdPbmx5KSByZXR1cm4gc3VwcG9ydGVkTG5nO1xuICAgICAgICAgIGlmIChzdXBwb3J0ZWRMbmcuaW5kZXhPZihsbmdPbmx5KSA9PT0gMCAmJiBsbmdPbmx5Lmxlbmd0aCA+IDEpIHJldHVybiBzdXBwb3J0ZWRMbmc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghZm91bmQpIGZvdW5kID0gdGhpcy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZylbMF07XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG4gIGdldEZhbGxiYWNrQ29kZXMoZmFsbGJhY2tzLCBjb2RlKSB7XG4gICAgaWYgKCFmYWxsYmFja3MpIHJldHVybiBbXTtcbiAgICBpZiAodHlwZW9mIGZhbGxiYWNrcyA9PT0gJ2Z1bmN0aW9uJykgZmFsbGJhY2tzID0gZmFsbGJhY2tzKGNvZGUpO1xuICAgIGlmICh0eXBlb2YgZmFsbGJhY2tzID09PSAnc3RyaW5nJykgZmFsbGJhY2tzID0gW2ZhbGxiYWNrc107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFsbGJhY2tzKSkgcmV0dXJuIGZhbGxiYWNrcztcbiAgICBpZiAoIWNvZGUpIHJldHVybiBmYWxsYmFja3MuZGVmYXVsdCB8fCBbXTtcbiAgICBsZXQgZm91bmQgPSBmYWxsYmFja3NbY29kZV07XG4gICAgaWYgKCFmb3VuZCkgZm91bmQgPSBmYWxsYmFja3NbdGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUoY29kZSldO1xuICAgIGlmICghZm91bmQpIGZvdW5kID0gZmFsbGJhY2tzW3RoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGNvZGUpXTtcbiAgICBpZiAoIWZvdW5kKSBmb3VuZCA9IGZhbGxiYWNrc1t0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGNvZGUpXTtcbiAgICBpZiAoIWZvdW5kKSBmb3VuZCA9IGZhbGxiYWNrcy5kZWZhdWx0O1xuICAgIHJldHVybiBmb3VuZCB8fCBbXTtcbiAgfVxuICB0b1Jlc29sdmVIaWVyYXJjaHkoY29kZSwgZmFsbGJhY2tDb2RlKSB7XG4gICAgY29uc3QgZmFsbGJhY2tDb2RlcyA9IHRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhmYWxsYmFja0NvZGUgfHwgdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nIHx8IFtdLCBjb2RlKTtcbiAgICBjb25zdCBjb2RlcyA9IFtdO1xuICAgIGNvbnN0IGFkZENvZGUgPSBjID0+IHtcbiAgICAgIGlmICghYykgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMuaXNTdXBwb3J0ZWRDb2RlKGMpKSB7XG4gICAgICAgIGNvZGVzLnB1c2goYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGByZWplY3RpbmcgbGFuZ3VhZ2UgY29kZSBub3QgZm91bmQgaW4gc3VwcG9ydGVkTG5nczogJHtjfWApO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJyAmJiAoY29kZS5pbmRleE9mKCctJykgPiAtMSB8fCBjb2RlLmluZGV4T2YoJ18nKSA+IC0xKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkICE9PSAnbGFuZ3VhZ2VPbmx5JykgYWRkQ29kZSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShjb2RlKSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmxvYWQgIT09ICdsYW5ndWFnZU9ubHknICYmIHRoaXMub3B0aW9ucy5sb2FkICE9PSAnY3VycmVudE9ubHknKSBhZGRDb2RlKHRoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKGNvZGUpKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9hZCAhPT0gJ2N1cnJlbnRPbmx5JykgYWRkQ29kZSh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGNvZGUpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgYWRkQ29kZSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShjb2RlKSk7XG4gICAgfVxuICAgIGZhbGxiYWNrQ29kZXMuZm9yRWFjaChmYyA9PiB7XG4gICAgICBpZiAoY29kZXMuaW5kZXhPZihmYykgPCAwKSBhZGRDb2RlKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGZjKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvZGVzO1xuICB9XG59XG5cbmxldCBzZXRzID0gW3tcbiAgbG5nczogWydhY2gnLCAnYWsnLCAnYW0nLCAnYXJuJywgJ2JyJywgJ2ZpbCcsICdndW4nLCAnbG4nLCAnbWZlJywgJ21nJywgJ21pJywgJ29jJywgJ3B0JywgJ3B0LUJSJywgJ3RnJywgJ3RsJywgJ3RpJywgJ3RyJywgJ3V6JywgJ3dhJ10sXG4gIG5yOiBbMSwgMl0sXG4gIGZjOiAxXG59LCB7XG4gIGxuZ3M6IFsnYWYnLCAnYW4nLCAnYXN0JywgJ2F6JywgJ2JnJywgJ2JuJywgJ2NhJywgJ2RhJywgJ2RlJywgJ2RldicsICdlbCcsICdlbicsICdlbycsICdlcycsICdldCcsICdldScsICdmaScsICdmbycsICdmdXInLCAnZnknLCAnZ2wnLCAnZ3UnLCAnaGEnLCAnaGknLCAnaHUnLCAnaHknLCAnaWEnLCAnaXQnLCAna2snLCAna24nLCAna3UnLCAnbGInLCAnbWFpJywgJ21sJywgJ21uJywgJ21yJywgJ25haCcsICduYXAnLCAnbmInLCAnbmUnLCAnbmwnLCAnbm4nLCAnbm8nLCAnbnNvJywgJ3BhJywgJ3BhcCcsICdwbXMnLCAncHMnLCAncHQtUFQnLCAncm0nLCAnc2NvJywgJ3NlJywgJ3NpJywgJ3NvJywgJ3NvbicsICdzcScsICdzdicsICdzdycsICd0YScsICd0ZScsICd0aycsICd1cicsICd5byddLFxuICBucjogWzEsIDJdLFxuICBmYzogMlxufSwge1xuICBsbmdzOiBbJ2F5JywgJ2JvJywgJ2NnZycsICdmYScsICdodCcsICdpZCcsICdqYScsICdqYm8nLCAna2EnLCAna20nLCAna28nLCAna3knLCAnbG8nLCAnbXMnLCAnc2FoJywgJ3N1JywgJ3RoJywgJ3R0JywgJ3VnJywgJ3ZpJywgJ3dvJywgJ3poJ10sXG4gIG5yOiBbMV0sXG4gIGZjOiAzXG59LCB7XG4gIGxuZ3M6IFsnYmUnLCAnYnMnLCAnY25yJywgJ2R6JywgJ2hyJywgJ3J1JywgJ3NyJywgJ3VrJ10sXG4gIG5yOiBbMSwgMiwgNV0sXG4gIGZjOiA0XG59LCB7XG4gIGxuZ3M6IFsnYXInXSxcbiAgbnI6IFswLCAxLCAyLCAzLCAxMSwgMTAwXSxcbiAgZmM6IDVcbn0sIHtcbiAgbG5nczogWydjcycsICdzayddLFxuICBucjogWzEsIDIsIDVdLFxuICBmYzogNlxufSwge1xuICBsbmdzOiBbJ2NzYicsICdwbCddLFxuICBucjogWzEsIDIsIDVdLFxuICBmYzogN1xufSwge1xuICBsbmdzOiBbJ2N5J10sXG4gIG5yOiBbMSwgMiwgMywgOF0sXG4gIGZjOiA4XG59LCB7XG4gIGxuZ3M6IFsnZnInXSxcbiAgbnI6IFsxLCAyXSxcbiAgZmM6IDlcbn0sIHtcbiAgbG5nczogWydnYSddLFxuICBucjogWzEsIDIsIDMsIDcsIDExXSxcbiAgZmM6IDEwXG59LCB7XG4gIGxuZ3M6IFsnZ2QnXSxcbiAgbnI6IFsxLCAyLCAzLCAyMF0sXG4gIGZjOiAxMVxufSwge1xuICBsbmdzOiBbJ2lzJ10sXG4gIG5yOiBbMSwgMl0sXG4gIGZjOiAxMlxufSwge1xuICBsbmdzOiBbJ2p2J10sXG4gIG5yOiBbMCwgMV0sXG4gIGZjOiAxM1xufSwge1xuICBsbmdzOiBbJ2t3J10sXG4gIG5yOiBbMSwgMiwgMywgNF0sXG4gIGZjOiAxNFxufSwge1xuICBsbmdzOiBbJ2x0J10sXG4gIG5yOiBbMSwgMiwgMTBdLFxuICBmYzogMTVcbn0sIHtcbiAgbG5nczogWydsdiddLFxuICBucjogWzEsIDIsIDBdLFxuICBmYzogMTZcbn0sIHtcbiAgbG5nczogWydtayddLFxuICBucjogWzEsIDJdLFxuICBmYzogMTdcbn0sIHtcbiAgbG5nczogWydtbmsnXSxcbiAgbnI6IFswLCAxLCAyXSxcbiAgZmM6IDE4XG59LCB7XG4gIGxuZ3M6IFsnbXQnXSxcbiAgbnI6IFsxLCAyLCAxMSwgMjBdLFxuICBmYzogMTlcbn0sIHtcbiAgbG5nczogWydvciddLFxuICBucjogWzIsIDFdLFxuICBmYzogMlxufSwge1xuICBsbmdzOiBbJ3JvJ10sXG4gIG5yOiBbMSwgMiwgMjBdLFxuICBmYzogMjBcbn0sIHtcbiAgbG5nczogWydzbCddLFxuICBucjogWzUsIDEsIDIsIDNdLFxuICBmYzogMjFcbn0sIHtcbiAgbG5nczogWydoZScsICdpdyddLFxuICBucjogWzEsIDIsIDIwLCAyMV0sXG4gIGZjOiAyMlxufV07XG5sZXQgX3J1bGVzUGx1cmFsc1R5cGVzID0ge1xuICAxOiBuID0+IE51bWJlcihuID4gMSksXG4gIDI6IG4gPT4gTnVtYmVyKG4gIT0gMSksXG4gIDM6IG4gPT4gMCxcbiAgNDogbiA9PiBOdW1iZXIobiAlIDEwID09IDEgJiYgbiAlIDEwMCAhPSAxMSA/IDAgOiBuICUgMTAgPj0gMiAmJiBuICUgMTAgPD0gNCAmJiAobiAlIDEwMCA8IDEwIHx8IG4gJSAxMDAgPj0gMjApID8gMSA6IDIpLFxuICA1OiBuID0+IE51bWJlcihuID09IDAgPyAwIDogbiA9PSAxID8gMSA6IG4gPT0gMiA/IDIgOiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMCA/IDMgOiBuICUgMTAwID49IDExID8gNCA6IDUpLFxuICA2OiBuID0+IE51bWJlcihuID09IDEgPyAwIDogbiA+PSAyICYmIG4gPD0gNCA/IDEgOiAyKSxcbiAgNzogbiA9PiBOdW1iZXIobiA9PSAxID8gMCA6IG4gJSAxMCA+PSAyICYmIG4gJSAxMCA8PSA0ICYmIChuICUgMTAwIDwgMTAgfHwgbiAlIDEwMCA+PSAyMCkgPyAxIDogMiksXG4gIDg6IG4gPT4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuID09IDIgPyAxIDogbiAhPSA4ICYmIG4gIT0gMTEgPyAyIDogMyksXG4gIDk6IG4gPT4gTnVtYmVyKG4gPj0gMiksXG4gIDEwOiBuID0+IE51bWJlcihuID09IDEgPyAwIDogbiA9PSAyID8gMSA6IG4gPCA3ID8gMiA6IG4gPCAxMSA/IDMgOiA0KSxcbiAgMTE6IG4gPT4gTnVtYmVyKG4gPT0gMSB8fCBuID09IDExID8gMCA6IG4gPT0gMiB8fCBuID09IDEyID8gMSA6IG4gPiAyICYmIG4gPCAyMCA/IDIgOiAzKSxcbiAgMTI6IG4gPT4gTnVtYmVyKG4gJSAxMCAhPSAxIHx8IG4gJSAxMDAgPT0gMTEpLFxuICAxMzogbiA9PiBOdW1iZXIobiAhPT0gMCksXG4gIDE0OiBuID0+IE51bWJlcihuID09IDEgPyAwIDogbiA9PSAyID8gMSA6IG4gPT0gMyA/IDIgOiAzKSxcbiAgMTU6IG4gPT4gTnVtYmVyKG4gJSAxMCA9PSAxICYmIG4gJSAxMDAgIT0gMTEgPyAwIDogbiAlIDEwID49IDIgJiYgKG4gJSAxMDAgPCAxMCB8fCBuICUgMTAwID49IDIwKSA/IDEgOiAyKSxcbiAgMTY6IG4gPT4gTnVtYmVyKG4gJSAxMCA9PSAxICYmIG4gJSAxMDAgIT0gMTEgPyAwIDogbiAhPT0gMCA/IDEgOiAyKSxcbiAgMTc6IG4gPT4gTnVtYmVyKG4gPT0gMSB8fCBuICUgMTAgPT0gMSAmJiBuICUgMTAwICE9IDExID8gMCA6IDEpLFxuICAxODogbiA9PiBOdW1iZXIobiA9PSAwID8gMCA6IG4gPT0gMSA/IDEgOiAyKSxcbiAgMTk6IG4gPT4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuID09IDAgfHwgbiAlIDEwMCA+IDEgJiYgbiAlIDEwMCA8IDExID8gMSA6IG4gJSAxMDAgPiAxMCAmJiBuICUgMTAwIDwgMjAgPyAyIDogMyksXG4gIDIwOiBuID0+IE51bWJlcihuID09IDEgPyAwIDogbiA9PSAwIHx8IG4gJSAxMDAgPiAwICYmIG4gJSAxMDAgPCAyMCA/IDEgOiAyKSxcbiAgMjE6IG4gPT4gTnVtYmVyKG4gJSAxMDAgPT0gMSA/IDEgOiBuICUgMTAwID09IDIgPyAyIDogbiAlIDEwMCA9PSAzIHx8IG4gJSAxMDAgPT0gNCA/IDMgOiAwKSxcbiAgMjI6IG4gPT4gTnVtYmVyKG4gPT0gMSA/IDAgOiBuID09IDIgPyAxIDogKG4gPCAwIHx8IG4gPiAxMCkgJiYgbiAlIDEwID09IDAgPyAyIDogMylcbn07XG5jb25zdCBub25JbnRsVmVyc2lvbnMgPSBbJ3YxJywgJ3YyJywgJ3YzJ107XG5jb25zdCBpbnRsVmVyc2lvbnMgPSBbJ3Y0J107XG5jb25zdCBzdWZmaXhlc09yZGVyID0ge1xuICB6ZXJvOiAwLFxuICBvbmU6IDEsXG4gIHR3bzogMixcbiAgZmV3OiAzLFxuICBtYW55OiA0LFxuICBvdGhlcjogNVxufTtcbmNvbnN0IGNyZWF0ZVJ1bGVzID0gKCkgPT4ge1xuICBjb25zdCBydWxlcyA9IHt9O1xuICBzZXRzLmZvckVhY2goc2V0ID0+IHtcbiAgICBzZXQubG5ncy5mb3JFYWNoKGwgPT4ge1xuICAgICAgcnVsZXNbbF0gPSB7XG4gICAgICAgIG51bWJlcnM6IHNldC5ucixcbiAgICAgICAgcGx1cmFsczogX3J1bGVzUGx1cmFsc1R5cGVzW3NldC5mY11cbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gcnVsZXM7XG59O1xuY2xhc3MgUGx1cmFsUmVzb2x2ZXIge1xuICBjb25zdHJ1Y3RvcihsYW5ndWFnZVV0aWxzKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHRoaXMubGFuZ3VhZ2VVdGlscyA9IGxhbmd1YWdlVXRpbHM7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXIuY3JlYXRlKCdwbHVyYWxSZXNvbHZlcicpO1xuICAgIGlmICgoIXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTiB8fCBpbnRsVmVyc2lvbnMuaW5jbHVkZXModGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKSkgJiYgKHR5cGVvZiBJbnRsID09PSAndW5kZWZpbmVkJyB8fCAhSW50bC5QbHVyYWxSdWxlcykpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTiA9ICd2Myc7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignWW91ciBlbnZpcm9ubWVudCBzZWVtcyBub3QgdG8gYmUgSW50bCBBUEkgY29tcGF0aWJsZSwgdXNlIGFuIEludGwuUGx1cmFsUnVsZXMgcG9seWZpbGwuIFdpbGwgZmFsbGJhY2sgdG8gdGhlIGNvbXBhdGliaWxpdHlKU09OIHYzIGZvcm1hdCBoYW5kbGluZy4nKTtcbiAgICB9XG4gICAgdGhpcy5ydWxlcyA9IGNyZWF0ZVJ1bGVzKCk7XG4gICAgdGhpcy5wbHVyYWxSdWxlc0NhY2hlID0ge307XG4gIH1cbiAgYWRkUnVsZShsbmcsIG9iaikge1xuICAgIHRoaXMucnVsZXNbbG5nXSA9IG9iajtcbiAgfVxuICBjbGVhckNhY2hlKCkge1xuICAgIHRoaXMucGx1cmFsUnVsZXNDYWNoZSA9IHt9O1xuICB9XG4gIGdldFJ1bGUoY29kZSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBpZiAodGhpcy5zaG91bGRVc2VJbnRsQXBpKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsZWFuZWRDb2RlID0gZ2V0Q2xlYW5lZENvZGUoY29kZSA9PT0gJ2RldicgPyAnZW4nIDogY29kZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBvcHRpb25zLm9yZGluYWwgPyAnb3JkaW5hbCcgOiAnY2FyZGluYWwnO1xuICAgICAgICBjb25zdCBjYWNoZUtleSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBjbGVhbmVkQ29kZSxcbiAgICAgICAgICB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY2FjaGVLZXkgaW4gdGhpcy5wbHVyYWxSdWxlc0NhY2hlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGx1cmFsUnVsZXNDYWNoZVtjYWNoZUtleV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZSA9IG5ldyBJbnRsLlBsdXJhbFJ1bGVzKGNsZWFuZWRDb2RlLCB7XG4gICAgICAgICAgdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wbHVyYWxSdWxlc0NhY2hlW2NhY2hlS2V5XSA9IHJ1bGU7XG4gICAgICAgIHJldHVybiBydWxlO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucnVsZXNbY29kZV0gfHwgdGhpcy5ydWxlc1t0aGlzLmxhbmd1YWdlVXRpbHMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoY29kZSldO1xuICB9XG4gIG5lZWRzUGx1cmFsKGNvZGUpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuZ2V0UnVsZShjb2RlLCBvcHRpb25zKTtcbiAgICBpZiAodGhpcy5zaG91bGRVc2VJbnRsQXBpKCkpIHtcbiAgICAgIHJldHVybiBydWxlICYmIHJ1bGUucmVzb2x2ZWRPcHRpb25zKCkucGx1cmFsQ2F0ZWdvcmllcy5sZW5ndGggPiAxO1xuICAgIH1cbiAgICByZXR1cm4gcnVsZSAmJiBydWxlLm51bWJlcnMubGVuZ3RoID4gMTtcbiAgfVxuICBnZXRQbHVyYWxGb3Jtc09mS2V5KGNvZGUsIGtleSkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICByZXR1cm4gdGhpcy5nZXRTdWZmaXhlcyhjb2RlLCBvcHRpb25zKS5tYXAoc3VmZml4ID0+IGAke2tleX0ke3N1ZmZpeH1gKTtcbiAgfVxuICBnZXRTdWZmaXhlcyhjb2RlKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmdldFJ1bGUoY29kZSwgb3B0aW9ucyk7XG4gICAgaWYgKCFydWxlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3VsZFVzZUludGxBcGkoKSkge1xuICAgICAgcmV0dXJuIHJ1bGUucmVzb2x2ZWRPcHRpb25zKCkucGx1cmFsQ2F0ZWdvcmllcy5zb3J0KChwbHVyYWxDYXRlZ29yeTEsIHBsdXJhbENhdGVnb3J5MikgPT4gc3VmZml4ZXNPcmRlcltwbHVyYWxDYXRlZ29yeTFdIC0gc3VmZml4ZXNPcmRlcltwbHVyYWxDYXRlZ29yeTJdKS5tYXAocGx1cmFsQ2F0ZWdvcnkgPT4gYCR7dGhpcy5vcHRpb25zLnByZXBlbmR9JHtvcHRpb25zLm9yZGluYWwgPyBgb3JkaW5hbCR7dGhpcy5vcHRpb25zLnByZXBlbmR9YCA6ICcnfSR7cGx1cmFsQ2F0ZWdvcnl9YCk7XG4gICAgfVxuICAgIHJldHVybiBydWxlLm51bWJlcnMubWFwKG51bWJlciA9PiB0aGlzLmdldFN1ZmZpeChjb2RlLCBudW1iZXIsIG9wdGlvbnMpKTtcbiAgfVxuICBnZXRTdWZmaXgoY29kZSwgY291bnQpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuZ2V0UnVsZShjb2RlLCBvcHRpb25zKTtcbiAgICBpZiAocnVsZSkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMucHJlcGVuZH0ke29wdGlvbnMub3JkaW5hbCA/IGBvcmRpbmFsJHt0aGlzLm9wdGlvbnMucHJlcGVuZH1gIDogJyd9JHtydWxlLnNlbGVjdChjb3VudCl9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmdldFN1ZmZpeFJldHJvQ29tcGF0aWJsZShydWxlLCBjb3VudCk7XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyLndhcm4oYG5vIHBsdXJhbCBydWxlIGZvdW5kIGZvcjogJHtjb2RlfWApO1xuICAgIHJldHVybiAnJztcbiAgfVxuICBnZXRTdWZmaXhSZXRyb0NvbXBhdGlibGUocnVsZSwgY291bnQpIHtcbiAgICBjb25zdCBpZHggPSBydWxlLm5vQWJzID8gcnVsZS5wbHVyYWxzKGNvdW50KSA6IHJ1bGUucGx1cmFscyhNYXRoLmFicyhjb3VudCkpO1xuICAgIGxldCBzdWZmaXggPSBydWxlLm51bWJlcnNbaWR4XTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4ICYmIHJ1bGUubnVtYmVycy5sZW5ndGggPT09IDIgJiYgcnVsZS5udW1iZXJzWzBdID09PSAxKSB7XG4gICAgICBpZiAoc3VmZml4ID09PSAyKSB7XG4gICAgICAgIHN1ZmZpeCA9ICdwbHVyYWwnO1xuICAgICAgfSBlbHNlIGlmIChzdWZmaXggPT09IDEpIHtcbiAgICAgICAgc3VmZml4ID0gJyc7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJldHVyblN1ZmZpeCA9ICgpID0+IHRoaXMub3B0aW9ucy5wcmVwZW5kICYmIHN1ZmZpeC50b1N0cmluZygpID8gdGhpcy5vcHRpb25zLnByZXBlbmQgKyBzdWZmaXgudG9TdHJpbmcoKSA6IHN1ZmZpeC50b1N0cmluZygpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04gPT09ICd2MScpIHtcbiAgICAgIGlmIChzdWZmaXggPT09IDEpIHJldHVybiAnJztcbiAgICAgIGlmICh0eXBlb2Ygc3VmZml4ID09PSAnbnVtYmVyJykgcmV0dXJuIGBfcGx1cmFsXyR7c3VmZml4LnRvU3RyaW5nKCl9YDtcbiAgICAgIHJldHVybiByZXR1cm5TdWZmaXgoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTiA9PT0gJ3YyJykge1xuICAgICAgcmV0dXJuIHJldHVyblN1ZmZpeCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4ICYmIHJ1bGUubnVtYmVycy5sZW5ndGggPT09IDIgJiYgcnVsZS5udW1iZXJzWzBdID09PSAxKSB7XG4gICAgICByZXR1cm4gcmV0dXJuU3VmZml4KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucHJlcGVuZCAmJiBpZHgudG9TdHJpbmcoKSA/IHRoaXMub3B0aW9ucy5wcmVwZW5kICsgaWR4LnRvU3RyaW5nKCkgOiBpZHgudG9TdHJpbmcoKTtcbiAgfVxuICBzaG91bGRVc2VJbnRsQXBpKCkge1xuICAgIHJldHVybiAhbm9uSW50bFZlcnNpb25zLmluY2x1ZGVzKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTik7XG4gIH1cbn1cblxuY29uc3QgZGVlcEZpbmRXaXRoRGVmYXVsdHMgPSBmdW5jdGlvbiAoZGF0YSwgZGVmYXVsdERhdGEsIGtleSkge1xuICBsZXQga2V5U2VwYXJhdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiAnLic7XG4gIGxldCBpZ25vcmVKU09OU3RydWN0dXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0cnVlO1xuICBsZXQgcGF0aCA9IGdldFBhdGhXaXRoRGVmYXVsdHMoZGF0YSwgZGVmYXVsdERhdGEsIGtleSk7XG4gIGlmICghcGF0aCAmJiBpZ25vcmVKU09OU3RydWN0dXJlICYmIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcGF0aCA9IGRlZXBGaW5kKGRhdGEsIGtleSwga2V5U2VwYXJhdG9yKTtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSBwYXRoID0gZGVlcEZpbmQoZGVmYXVsdERhdGEsIGtleSwga2V5U2VwYXJhdG9yKTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn07XG5jb25zdCByZWdleFNhZmUgPSB2YWwgPT4gdmFsLnJlcGxhY2UoL1xcJC9nLCAnJCQkJCcpO1xuY2xhc3MgSW50ZXJwb2xhdG9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHRoaXMubG9nZ2VyID0gYmFzZUxvZ2dlci5jcmVhdGUoJ2ludGVycG9sYXRvcicpO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5mb3JtYXQgPSBvcHRpb25zLmludGVycG9sYXRpb24gJiYgb3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCB8fCAodmFsdWUgPT4gdmFsdWUpO1xuICAgIHRoaXMuaW5pdChvcHRpb25zKTtcbiAgfVxuICBpbml0KCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBpZiAoIW9wdGlvbnMuaW50ZXJwb2xhdGlvbikgb3B0aW9ucy5pbnRlcnBvbGF0aW9uID0ge1xuICAgICAgZXNjYXBlVmFsdWU6IHRydWVcbiAgICB9O1xuICAgIGNvbnN0IHtcbiAgICAgIGVzY2FwZTogZXNjYXBlJDEsXG4gICAgICBlc2NhcGVWYWx1ZSxcbiAgICAgIHVzZVJhd1ZhbHVlVG9Fc2NhcGUsXG4gICAgICBwcmVmaXgsXG4gICAgICBwcmVmaXhFc2NhcGVkLFxuICAgICAgc3VmZml4LFxuICAgICAgc3VmZml4RXNjYXBlZCxcbiAgICAgIGZvcm1hdFNlcGFyYXRvcixcbiAgICAgIHVuZXNjYXBlU3VmZml4LFxuICAgICAgdW5lc2NhcGVQcmVmaXgsXG4gICAgICBuZXN0aW5nUHJlZml4LFxuICAgICAgbmVzdGluZ1ByZWZpeEVzY2FwZWQsXG4gICAgICBuZXN0aW5nU3VmZml4LFxuICAgICAgbmVzdGluZ1N1ZmZpeEVzY2FwZWQsXG4gICAgICBuZXN0aW5nT3B0aW9uc1NlcGFyYXRvcixcbiAgICAgIG1heFJlcGxhY2VzLFxuICAgICAgYWx3YXlzRm9ybWF0XG4gICAgfSA9IG9wdGlvbnMuaW50ZXJwb2xhdGlvbjtcbiAgICB0aGlzLmVzY2FwZSA9IGVzY2FwZSQxICE9PSB1bmRlZmluZWQgPyBlc2NhcGUkMSA6IGVzY2FwZTtcbiAgICB0aGlzLmVzY2FwZVZhbHVlID0gZXNjYXBlVmFsdWUgIT09IHVuZGVmaW5lZCA/IGVzY2FwZVZhbHVlIDogdHJ1ZTtcbiAgICB0aGlzLnVzZVJhd1ZhbHVlVG9Fc2NhcGUgPSB1c2VSYXdWYWx1ZVRvRXNjYXBlICE9PSB1bmRlZmluZWQgPyB1c2VSYXdWYWx1ZVRvRXNjYXBlIDogZmFsc2U7XG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXggPyByZWdleEVzY2FwZShwcmVmaXgpIDogcHJlZml4RXNjYXBlZCB8fCAne3snO1xuICAgIHRoaXMuc3VmZml4ID0gc3VmZml4ID8gcmVnZXhFc2NhcGUoc3VmZml4KSA6IHN1ZmZpeEVzY2FwZWQgfHwgJ319JztcbiAgICB0aGlzLmZvcm1hdFNlcGFyYXRvciA9IGZvcm1hdFNlcGFyYXRvciB8fCAnLCc7XG4gICAgdGhpcy51bmVzY2FwZVByZWZpeCA9IHVuZXNjYXBlU3VmZml4ID8gJycgOiB1bmVzY2FwZVByZWZpeCB8fCAnLSc7XG4gICAgdGhpcy51bmVzY2FwZVN1ZmZpeCA9IHRoaXMudW5lc2NhcGVQcmVmaXggPyAnJyA6IHVuZXNjYXBlU3VmZml4IHx8ICcnO1xuICAgIHRoaXMubmVzdGluZ1ByZWZpeCA9IG5lc3RpbmdQcmVmaXggPyByZWdleEVzY2FwZShuZXN0aW5nUHJlZml4KSA6IG5lc3RpbmdQcmVmaXhFc2NhcGVkIHx8IHJlZ2V4RXNjYXBlKCckdCgnKTtcbiAgICB0aGlzLm5lc3RpbmdTdWZmaXggPSBuZXN0aW5nU3VmZml4ID8gcmVnZXhFc2NhcGUobmVzdGluZ1N1ZmZpeCkgOiBuZXN0aW5nU3VmZml4RXNjYXBlZCB8fCByZWdleEVzY2FwZSgnKScpO1xuICAgIHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3IgPSBuZXN0aW5nT3B0aW9uc1NlcGFyYXRvciB8fCAnLCc7XG4gICAgdGhpcy5tYXhSZXBsYWNlcyA9IG1heFJlcGxhY2VzIHx8IDEwMDA7XG4gICAgdGhpcy5hbHdheXNGb3JtYXQgPSBhbHdheXNGb3JtYXQgIT09IHVuZGVmaW5lZCA/IGFsd2F5c0Zvcm1hdCA6IGZhbHNlO1xuICAgIHRoaXMucmVzZXRSZWdFeHAoKTtcbiAgfVxuICByZXNldCgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zKSB0aGlzLmluaXQodGhpcy5vcHRpb25zKTtcbiAgfVxuICByZXNldFJlZ0V4cCgpIHtcbiAgICBjb25zdCBnZXRPclJlc2V0UmVnRXhwID0gKGV4aXN0aW5nUmVnRXhwLCBwYXR0ZXJuKSA9PiB7XG4gICAgICBpZiAoZXhpc3RpbmdSZWdFeHAgJiYgZXhpc3RpbmdSZWdFeHAuc291cmNlID09PSBwYXR0ZXJuKSB7XG4gICAgICAgIGV4aXN0aW5nUmVnRXhwLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIHJldHVybiBleGlzdGluZ1JlZ0V4cDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4sICdnJyk7XG4gICAgfTtcbiAgICB0aGlzLnJlZ2V4cCA9IGdldE9yUmVzZXRSZWdFeHAodGhpcy5yZWdleHAsIGAke3RoaXMucHJlZml4fSguKz8pJHt0aGlzLnN1ZmZpeH1gKTtcbiAgICB0aGlzLnJlZ2V4cFVuZXNjYXBlID0gZ2V0T3JSZXNldFJlZ0V4cCh0aGlzLnJlZ2V4cFVuZXNjYXBlLCBgJHt0aGlzLnByZWZpeH0ke3RoaXMudW5lc2NhcGVQcmVmaXh9KC4rPykke3RoaXMudW5lc2NhcGVTdWZmaXh9JHt0aGlzLnN1ZmZpeH1gKTtcbiAgICB0aGlzLm5lc3RpbmdSZWdleHAgPSBnZXRPclJlc2V0UmVnRXhwKHRoaXMubmVzdGluZ1JlZ2V4cCwgYCR7dGhpcy5uZXN0aW5nUHJlZml4fSguKz8pJHt0aGlzLm5lc3RpbmdTdWZmaXh9YCk7XG4gIH1cbiAgaW50ZXJwb2xhdGUoc3RyLCBkYXRhLCBsbmcsIG9wdGlvbnMpIHtcbiAgICBsZXQgbWF0Y2g7XG4gICAgbGV0IHZhbHVlO1xuICAgIGxldCByZXBsYWNlcztcbiAgICBjb25zdCBkZWZhdWx0RGF0YSA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiAmJiB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzIHx8IHt9O1xuICAgIGNvbnN0IGhhbmRsZUZvcm1hdCA9IGtleSA9PiB7XG4gICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpIDwgMCkge1xuICAgICAgICBjb25zdCBwYXRoID0gZGVlcEZpbmRXaXRoRGVmYXVsdHMoZGF0YSwgZGVmYXVsdERhdGEsIGtleSwgdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvciwgdGhpcy5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5hbHdheXNGb3JtYXQgPyB0aGlzLmZvcm1hdChwYXRoLCB1bmRlZmluZWQsIGxuZywge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICBpbnRlcnBvbGF0aW9ua2V5OiBrZXlcbiAgICAgICAgfSkgOiBwYXRoO1xuICAgICAgfVxuICAgICAgY29uc3QgcCA9IGtleS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcik7XG4gICAgICBjb25zdCBrID0gcC5zaGlmdCgpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGYgPSBwLmpvaW4odGhpcy5mb3JtYXRTZXBhcmF0b3IpLnRyaW0oKTtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdChkZWVwRmluZFdpdGhEZWZhdWx0cyhkYXRhLCBkZWZhdWx0RGF0YSwgaywgdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvciwgdGhpcy5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUpLCBmLCBsbmcsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgaW50ZXJwb2xhdGlvbmtleToga1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLnJlc2V0UmVnRXhwKCk7XG4gICAgY29uc3QgbWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyID0gb3B0aW9ucyAmJiBvcHRpb25zLm1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlciB8fCB0aGlzLm9wdGlvbnMubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyO1xuICAgIGNvbnN0IHNraXBPblZhcmlhYmxlcyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5pbnRlcnBvbGF0aW9uICYmIG9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXMgOiB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM7XG4gICAgY29uc3QgdG9kb3MgPSBbe1xuICAgICAgcmVnZXg6IHRoaXMucmVnZXhwVW5lc2NhcGUsXG4gICAgICBzYWZlVmFsdWU6IHZhbCA9PiByZWdleFNhZmUodmFsKVxuICAgIH0sIHtcbiAgICAgIHJlZ2V4OiB0aGlzLnJlZ2V4cCxcbiAgICAgIHNhZmVWYWx1ZTogdmFsID0+IHRoaXMuZXNjYXBlVmFsdWUgPyByZWdleFNhZmUodGhpcy5lc2NhcGUodmFsKSkgOiByZWdleFNhZmUodmFsKVxuICAgIH1dO1xuICAgIHRvZG9zLmZvckVhY2godG9kbyA9PiB7XG4gICAgICByZXBsYWNlcyA9IDA7XG4gICAgICB3aGlsZSAobWF0Y2ggPSB0b2RvLnJlZ2V4LmV4ZWMoc3RyKSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkVmFyID0gbWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICB2YWx1ZSA9IGhhbmRsZUZvcm1hdChtYXRjaGVkVmFyKTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgdGVtcCA9IG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcihzdHIsIG1hdGNoLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHZhbHVlID0gdHlwZW9mIHRlbXAgPT09ICdzdHJpbmcnID8gdGVtcCA6ICcnO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgbWF0Y2hlZFZhcikpIHtcbiAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgfSBlbHNlIGlmIChza2lwT25WYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbWF0Y2hbMF07XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgbWlzc2VkIHRvIHBhc3MgaW4gdmFyaWFibGUgJHttYXRjaGVkVmFyfSBmb3IgaW50ZXJwb2xhdGluZyAke3N0cn1gKTtcbiAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgJiYgIXRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZSkge1xuICAgICAgICAgIHZhbHVlID0gbWFrZVN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2FmZVZhbHVlID0gdG9kby5zYWZlVmFsdWUodmFsdWUpO1xuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShtYXRjaFswXSwgc2FmZVZhbHVlKTtcbiAgICAgICAgaWYgKHNraXBPblZhcmlhYmxlcykge1xuICAgICAgICAgIHRvZG8ucmVnZXgubGFzdEluZGV4ICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICB0b2RvLnJlZ2V4Lmxhc3RJbmRleCAtPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9kby5yZWdleC5sYXN0SW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJlcGxhY2VzKys7XG4gICAgICAgIGlmIChyZXBsYWNlcyA+PSB0aGlzLm1heFJlcGxhY2VzKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIG5lc3Qoc3RyLCBmYykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICBsZXQgbWF0Y2g7XG4gICAgbGV0IHZhbHVlO1xuICAgIGxldCBjbG9uZWRPcHRpb25zO1xuICAgIGNvbnN0IGhhbmRsZUhhc09wdGlvbnMgPSAoa2V5LCBpbmhlcml0ZWRPcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBzZXAgPSB0aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO1xuICAgICAgaWYgKGtleS5pbmRleE9mKHNlcCkgPCAwKSByZXR1cm4ga2V5O1xuICAgICAgY29uc3QgYyA9IGtleS5zcGxpdChuZXcgUmVnRXhwKGAke3NlcH1bIF0qe2ApKTtcbiAgICAgIGxldCBvcHRpb25zU3RyaW5nID0gYHske2NbMV19YDtcbiAgICAgIGtleSA9IGNbMF07XG4gICAgICBvcHRpb25zU3RyaW5nID0gdGhpcy5pbnRlcnBvbGF0ZShvcHRpb25zU3RyaW5nLCBjbG9uZWRPcHRpb25zKTtcbiAgICAgIGNvbnN0IG1hdGNoZWRTaW5nbGVRdW90ZXMgPSBvcHRpb25zU3RyaW5nLm1hdGNoKC8nL2cpO1xuICAgICAgY29uc3QgbWF0Y2hlZERvdWJsZVF1b3RlcyA9IG9wdGlvbnNTdHJpbmcubWF0Y2goL1wiL2cpO1xuICAgICAgaWYgKG1hdGNoZWRTaW5nbGVRdW90ZXMgJiYgbWF0Y2hlZFNpbmdsZVF1b3Rlcy5sZW5ndGggJSAyID09PSAwICYmICFtYXRjaGVkRG91YmxlUXVvdGVzIHx8IG1hdGNoZWREb3VibGVRdW90ZXMubGVuZ3RoICUgMiAhPT0gMCkge1xuICAgICAgICBvcHRpb25zU3RyaW5nID0gb3B0aW9uc1N0cmluZy5yZXBsYWNlKC8nL2csICdcIicpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY2xvbmVkT3B0aW9ucyA9IEpTT04ucGFyc2Uob3B0aW9uc1N0cmluZyk7XG4gICAgICAgIGlmIChpbmhlcml0ZWRPcHRpb25zKSBjbG9uZWRPcHRpb25zID0ge1xuICAgICAgICAgIC4uLmluaGVyaXRlZE9wdGlvbnMsXG4gICAgICAgICAgLi4uY2xvbmVkT3B0aW9uc1xuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBmYWlsZWQgcGFyc2luZyBvcHRpb25zIHN0cmluZyBpbiBuZXN0aW5nIGZvciBrZXkgJHtrZXl9YCwgZSk7XG4gICAgICAgIHJldHVybiBgJHtrZXl9JHtzZXB9JHtvcHRpb25zU3RyaW5nfWA7XG4gICAgICB9XG4gICAgICBpZiAoY2xvbmVkT3B0aW9ucy5kZWZhdWx0VmFsdWUgJiYgY2xvbmVkT3B0aW9ucy5kZWZhdWx0VmFsdWUuaW5kZXhPZih0aGlzLnByZWZpeCkgPiAtMSkgZGVsZXRlIGNsb25lZE9wdGlvbnMuZGVmYXVsdFZhbHVlO1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9O1xuICAgIHdoaWxlIChtYXRjaCA9IHRoaXMubmVzdGluZ1JlZ2V4cC5leGVjKHN0cikpIHtcbiAgICAgIGxldCBmb3JtYXR0ZXJzID0gW107XG4gICAgICBjbG9uZWRPcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9O1xuICAgICAgY2xvbmVkT3B0aW9ucyA9IGNsb25lZE9wdGlvbnMucmVwbGFjZSAmJiB0eXBlb2YgY2xvbmVkT3B0aW9ucy5yZXBsYWNlICE9PSAnc3RyaW5nJyA/IGNsb25lZE9wdGlvbnMucmVwbGFjZSA6IGNsb25lZE9wdGlvbnM7XG4gICAgICBjbG9uZWRPcHRpb25zLmFwcGx5UG9zdFByb2Nlc3NvciA9IGZhbHNlO1xuICAgICAgZGVsZXRlIGNsb25lZE9wdGlvbnMuZGVmYXVsdFZhbHVlO1xuICAgICAgbGV0IGRvUmVkdWNlID0gZmFsc2U7XG4gICAgICBpZiAobWF0Y2hbMF0uaW5kZXhPZih0aGlzLmZvcm1hdFNlcGFyYXRvcikgIT09IC0xICYmICEvey4qfS8udGVzdChtYXRjaFsxXSkpIHtcbiAgICAgICAgY29uc3QgciA9IG1hdGNoWzFdLnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKS5tYXAoZWxlbSA9PiBlbGVtLnRyaW0oKSk7XG4gICAgICAgIG1hdGNoWzFdID0gci5zaGlmdCgpO1xuICAgICAgICBmb3JtYXR0ZXJzID0gcjtcbiAgICAgICAgZG9SZWR1Y2UgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBmYyhoYW5kbGVIYXNPcHRpb25zLmNhbGwodGhpcywgbWF0Y2hbMV0udHJpbSgpLCBjbG9uZWRPcHRpb25zKSwgY2xvbmVkT3B0aW9ucyk7XG4gICAgICBpZiAodmFsdWUgJiYgbWF0Y2hbMF0gPT09IHN0ciAmJiB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgdmFsdWUgPSBtYWtlU3RyaW5nKHZhbHVlKTtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgbWlzc2VkIHRvIHJlc29sdmUgJHttYXRjaFsxXX0gZm9yIG5lc3RpbmcgJHtzdHJ9YCk7XG4gICAgICAgIHZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgICBpZiAoZG9SZWR1Y2UpIHtcbiAgICAgICAgdmFsdWUgPSBmb3JtYXR0ZXJzLnJlZHVjZSgodiwgZikgPT4gdGhpcy5mb3JtYXQodiwgZiwgb3B0aW9ucy5sbmcsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIGludGVycG9sYXRpb25rZXk6IG1hdGNoWzFdLnRyaW0oKVxuICAgICAgICB9KSwgdmFsdWUudHJpbSgpKTtcbiAgICAgIH1cbiAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKG1hdGNoWzBdLCB2YWx1ZSk7XG4gICAgICB0aGlzLnJlZ2V4cC5sYXN0SW5kZXggPSAwO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cbmNvbnN0IHBhcnNlRm9ybWF0U3RyID0gZm9ybWF0U3RyID0+IHtcbiAgbGV0IGZvcm1hdE5hbWUgPSBmb3JtYXRTdHIudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGNvbnN0IGZvcm1hdE9wdGlvbnMgPSB7fTtcbiAgaWYgKGZvcm1hdFN0ci5pbmRleE9mKCcoJykgPiAtMSkge1xuICAgIGNvbnN0IHAgPSBmb3JtYXRTdHIuc3BsaXQoJygnKTtcbiAgICBmb3JtYXROYW1lID0gcFswXS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBjb25zdCBvcHRTdHIgPSBwWzFdLnN1YnN0cmluZygwLCBwWzFdLmxlbmd0aCAtIDEpO1xuICAgIGlmIChmb3JtYXROYW1lID09PSAnY3VycmVuY3knICYmIG9wdFN0ci5pbmRleE9mKCc6JykgPCAwKSB7XG4gICAgICBpZiAoIWZvcm1hdE9wdGlvbnMuY3VycmVuY3kpIGZvcm1hdE9wdGlvbnMuY3VycmVuY3kgPSBvcHRTdHIudHJpbSgpO1xuICAgIH0gZWxzZSBpZiAoZm9ybWF0TmFtZSA9PT0gJ3JlbGF0aXZldGltZScgJiYgb3B0U3RyLmluZGV4T2YoJzonKSA8IDApIHtcbiAgICAgIGlmICghZm9ybWF0T3B0aW9ucy5yYW5nZSkgZm9ybWF0T3B0aW9ucy5yYW5nZSA9IG9wdFN0ci50cmltKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wdHMgPSBvcHRTdHIuc3BsaXQoJzsnKTtcbiAgICAgIG9wdHMuZm9yRWFjaChvcHQgPT4ge1xuICAgICAgICBpZiAob3B0KSB7XG4gICAgICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBvcHQuc3BsaXQoJzonKTtcbiAgICAgICAgICBjb25zdCB2YWwgPSByZXN0LmpvaW4oJzonKS50cmltKCkucmVwbGFjZSgvXicrfCcrJC9nLCAnJyk7XG4gICAgICAgICAgY29uc3QgdHJpbW1lZEtleSA9IGtleS50cmltKCk7XG4gICAgICAgICAgaWYgKCFmb3JtYXRPcHRpb25zW3RyaW1tZWRLZXldKSBmb3JtYXRPcHRpb25zW3RyaW1tZWRLZXldID0gdmFsO1xuICAgICAgICAgIGlmICh2YWwgPT09ICdmYWxzZScpIGZvcm1hdE9wdGlvbnNbdHJpbW1lZEtleV0gPSBmYWxzZTtcbiAgICAgICAgICBpZiAodmFsID09PSAndHJ1ZScpIGZvcm1hdE9wdGlvbnNbdHJpbW1lZEtleV0gPSB0cnVlO1xuICAgICAgICAgIGlmICghaXNOYU4odmFsKSkgZm9ybWF0T3B0aW9uc1t0cmltbWVkS2V5XSA9IHBhcnNlSW50KHZhbCwgMTApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBmb3JtYXROYW1lLFxuICAgIGZvcm1hdE9wdGlvbnNcbiAgfTtcbn07XG5jb25zdCBjcmVhdGVDYWNoZWRGb3JtYXR0ZXIgPSBmbiA9PiB7XG4gIGNvbnN0IGNhY2hlID0ge307XG4gIHJldHVybiAodmFsLCBsbmcsIG9wdGlvbnMpID0+IHtcbiAgICBsZXQgb3B0Rm9yQ2FjaGUgPSBvcHRpb25zO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuaW50ZXJwb2xhdGlvbmtleSAmJiBvcHRpb25zLmZvcm1hdFBhcmFtcyAmJiBvcHRpb25zLmZvcm1hdFBhcmFtc1tvcHRpb25zLmludGVycG9sYXRpb25rZXldICYmIG9wdGlvbnNbb3B0aW9ucy5pbnRlcnBvbGF0aW9ua2V5XSkge1xuICAgICAgb3B0Rm9yQ2FjaGUgPSB7XG4gICAgICAgIC4uLm9wdEZvckNhY2hlLFxuICAgICAgICBbb3B0aW9ucy5pbnRlcnBvbGF0aW9ua2V5XTogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBsbmcgKyBKU09OLnN0cmluZ2lmeShvcHRGb3JDYWNoZSk7XG4gICAgbGV0IGZvcm1hdHRlciA9IGNhY2hlW2tleV07XG4gICAgaWYgKCFmb3JtYXR0ZXIpIHtcbiAgICAgIGZvcm1hdHRlciA9IGZuKGdldENsZWFuZWRDb2RlKGxuZyksIG9wdGlvbnMpO1xuICAgICAgY2FjaGVba2V5XSA9IGZvcm1hdHRlcjtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1hdHRlcih2YWwpO1xuICB9O1xufTtcbmNsYXNzIEZvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICB0aGlzLmxvZ2dlciA9IGJhc2VMb2dnZXIuY3JlYXRlKCdmb3JtYXR0ZXInKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuZm9ybWF0cyA9IHtcbiAgICAgIG51bWJlcjogY3JlYXRlQ2FjaGVkRm9ybWF0dGVyKChsbmcsIG9wdCkgPT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG5nLCB7XG4gICAgICAgICAgLi4ub3B0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmFsID0+IGZvcm1hdHRlci5mb3JtYXQodmFsKTtcbiAgICAgIH0pLFxuICAgICAgY3VycmVuY3k6IGNyZWF0ZUNhY2hlZEZvcm1hdHRlcigobG5nLCBvcHQpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxuZywge1xuICAgICAgICAgIC4uLm9wdCxcbiAgICAgICAgICBzdHlsZTogJ2N1cnJlbmN5J1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZhbCA9PiBmb3JtYXR0ZXIuZm9ybWF0KHZhbCk7XG4gICAgICB9KSxcbiAgICAgIGRhdGV0aW1lOiBjcmVhdGVDYWNoZWRGb3JtYXR0ZXIoKGxuZywgb3B0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxuZywge1xuICAgICAgICAgIC4uLm9wdFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZhbCA9PiBmb3JtYXR0ZXIuZm9ybWF0KHZhbCk7XG4gICAgICB9KSxcbiAgICAgIHJlbGF0aXZldGltZTogY3JlYXRlQ2FjaGVkRm9ybWF0dGVyKChsbmcsIG9wdCkgPT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQobG5nLCB7XG4gICAgICAgICAgLi4ub3B0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmFsID0+IGZvcm1hdHRlci5mb3JtYXQodmFsLCBvcHQucmFuZ2UgfHwgJ2RheScpO1xuICAgICAgfSksXG4gICAgICBsaXN0OiBjcmVhdGVDYWNoZWRGb3JtYXR0ZXIoKGxuZywgb3B0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBJbnRsLkxpc3RGb3JtYXQobG5nLCB7XG4gICAgICAgICAgLi4ub3B0XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdmFsID0+IGZvcm1hdHRlci5mb3JtYXQodmFsKTtcbiAgICAgIH0pXG4gICAgfTtcbiAgICB0aGlzLmluaXQob3B0aW9ucyk7XG4gIH1cbiAgaW5pdChzZXJ2aWNlcykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7XG4gICAgICBpbnRlcnBvbGF0aW9uOiB7fVxuICAgIH07XG4gICAgY29uc3QgaU9wdHMgPSBvcHRpb25zLmludGVycG9sYXRpb247XG4gICAgdGhpcy5mb3JtYXRTZXBhcmF0b3IgPSBpT3B0cy5mb3JtYXRTZXBhcmF0b3IgPyBpT3B0cy5mb3JtYXRTZXBhcmF0b3IgOiBpT3B0cy5mb3JtYXRTZXBhcmF0b3IgfHwgJywnO1xuICB9XG4gIGFkZChuYW1lLCBmYykge1xuICAgIHRoaXMuZm9ybWF0c1tuYW1lLnRvTG93ZXJDYXNlKCkudHJpbSgpXSA9IGZjO1xuICB9XG4gIGFkZENhY2hlZChuYW1lLCBmYykge1xuICAgIHRoaXMuZm9ybWF0c1tuYW1lLnRvTG93ZXJDYXNlKCkudHJpbSgpXSA9IGNyZWF0ZUNhY2hlZEZvcm1hdHRlcihmYyk7XG4gIH1cbiAgZm9ybWF0KHZhbHVlLCBmb3JtYXQsIGxuZykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICBjb25zdCBmb3JtYXRzID0gZm9ybWF0LnNwbGl0KHRoaXMuZm9ybWF0U2VwYXJhdG9yKTtcbiAgICBpZiAoZm9ybWF0cy5sZW5ndGggPiAxICYmIGZvcm1hdHNbMF0uaW5kZXhPZignKCcpID4gMSAmJiBmb3JtYXRzWzBdLmluZGV4T2YoJyknKSA8IDAgJiYgZm9ybWF0cy5maW5kKGYgPT4gZi5pbmRleE9mKCcpJykgPiAtMSkpIHtcbiAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGZvcm1hdHMuZmluZEluZGV4KGYgPT4gZi5pbmRleE9mKCcpJykgPiAtMSk7XG4gICAgICBmb3JtYXRzWzBdID0gW2Zvcm1hdHNbMF0sIC4uLmZvcm1hdHMuc3BsaWNlKDEsIGxhc3RJbmRleCldLmpvaW4odGhpcy5mb3JtYXRTZXBhcmF0b3IpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmb3JtYXRzLnJlZHVjZSgobWVtLCBmKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZvcm1hdE5hbWUsXG4gICAgICAgIGZvcm1hdE9wdGlvbnNcbiAgICAgIH0gPSBwYXJzZUZvcm1hdFN0cihmKTtcbiAgICAgIGlmICh0aGlzLmZvcm1hdHNbZm9ybWF0TmFtZV0pIHtcbiAgICAgICAgbGV0IGZvcm1hdHRlZCA9IG1lbTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB2YWxPcHRpb25zID0gb3B0aW9ucyAmJiBvcHRpb25zLmZvcm1hdFBhcmFtcyAmJiBvcHRpb25zLmZvcm1hdFBhcmFtc1tvcHRpb25zLmludGVycG9sYXRpb25rZXldIHx8IHt9O1xuICAgICAgICAgIGNvbnN0IGwgPSB2YWxPcHRpb25zLmxvY2FsZSB8fCB2YWxPcHRpb25zLmxuZyB8fCBvcHRpb25zLmxvY2FsZSB8fCBvcHRpb25zLmxuZyB8fCBsbmc7XG4gICAgICAgICAgZm9ybWF0dGVkID0gdGhpcy5mb3JtYXRzW2Zvcm1hdE5hbWVdKG1lbSwgbCwge1xuICAgICAgICAgICAgLi4uZm9ybWF0T3B0aW9ucyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAuLi52YWxPcHRpb25zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYHRoZXJlIHdhcyBubyBmb3JtYXQgZnVuY3Rpb24gZm9yICR7Zm9ybWF0TmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZW07XG4gICAgfSwgdmFsdWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY29uc3QgcmVtb3ZlUGVuZGluZyA9IChxLCBuYW1lKSA9PiB7XG4gIGlmIChxLnBlbmRpbmdbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgIGRlbGV0ZSBxLnBlbmRpbmdbbmFtZV07XG4gICAgcS5wZW5kaW5nQ291bnQtLTtcbiAgfVxufTtcbmNsYXNzIENvbm5lY3RvciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yKGJhY2tlbmQsIHN0b3JlLCBzZXJ2aWNlcykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgIHRoaXMuc2VydmljZXMgPSBzZXJ2aWNlcztcbiAgICB0aGlzLmxhbmd1YWdlVXRpbHMgPSBzZXJ2aWNlcy5sYW5ndWFnZVV0aWxzO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2dnZXIgPSBiYXNlTG9nZ2VyLmNyZWF0ZSgnYmFja2VuZENvbm5lY3RvcicpO1xuICAgIHRoaXMud2FpdGluZ1JlYWRzID0gW107XG4gICAgdGhpcy5tYXhQYXJhbGxlbFJlYWRzID0gb3B0aW9ucy5tYXhQYXJhbGxlbFJlYWRzIHx8IDEwO1xuICAgIHRoaXMucmVhZGluZ0NhbGxzID0gMDtcbiAgICB0aGlzLm1heFJldHJpZXMgPSBvcHRpb25zLm1heFJldHJpZXMgPj0gMCA/IG9wdGlvbnMubWF4UmV0cmllcyA6IDU7XG4gICAgdGhpcy5yZXRyeVRpbWVvdXQgPSBvcHRpb25zLnJldHJ5VGltZW91dCA+PSAxID8gb3B0aW9ucy5yZXRyeVRpbWVvdXQgOiAzNTA7XG4gICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICBpZiAodGhpcy5iYWNrZW5kICYmIHRoaXMuYmFja2VuZC5pbml0KSB7XG4gICAgICB0aGlzLmJhY2tlbmQuaW5pdChzZXJ2aWNlcywgb3B0aW9ucy5iYWNrZW5kLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgcXVldWVMb2FkKGxhbmd1YWdlcywgbmFtZXNwYWNlcywgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBjb25zdCB0b0xvYWQgPSB7fTtcbiAgICBjb25zdCBwZW5kaW5nID0ge307XG4gICAgY29uc3QgdG9Mb2FkTGFuZ3VhZ2VzID0ge307XG4gICAgY29uc3QgdG9Mb2FkTmFtZXNwYWNlcyA9IHt9O1xuICAgIGxhbmd1YWdlcy5mb3JFYWNoKGxuZyA9PiB7XG4gICAgICBsZXQgaGFzQWxsTmFtZXNwYWNlcyA9IHRydWU7XG4gICAgICBuYW1lc3BhY2VzLmZvckVhY2gobnMgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gYCR7bG5nfXwke25zfWA7XG4gICAgICAgIGlmICghb3B0aW9ucy5yZWxvYWQgJiYgdGhpcy5zdG9yZS5oYXNSZXNvdXJjZUJ1bmRsZShsbmcsIG5zKSkge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSAyO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGVbbmFtZV0gPCAwKSA7IGVsc2UgaWYgKHRoaXMuc3RhdGVbbmFtZV0gPT09IDEpIHtcbiAgICAgICAgICBpZiAocGVuZGluZ1tuYW1lXSA9PT0gdW5kZWZpbmVkKSBwZW5kaW5nW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlW25hbWVdID0gMTtcbiAgICAgICAgICBoYXNBbGxOYW1lc3BhY2VzID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHBlbmRpbmdbbmFtZV0gPT09IHVuZGVmaW5lZCkgcGVuZGluZ1tuYW1lXSA9IHRydWU7XG4gICAgICAgICAgaWYgKHRvTG9hZFtuYW1lXSA9PT0gdW5kZWZpbmVkKSB0b0xvYWRbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgIGlmICh0b0xvYWROYW1lc3BhY2VzW25zXSA9PT0gdW5kZWZpbmVkKSB0b0xvYWROYW1lc3BhY2VzW25zXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFoYXNBbGxOYW1lc3BhY2VzKSB0b0xvYWRMYW5ndWFnZXNbbG5nXSA9IHRydWU7XG4gICAgfSk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRvTG9hZCkubGVuZ3RoIHx8IE9iamVjdC5rZXlzKHBlbmRpbmcpLmxlbmd0aCkge1xuICAgICAgdGhpcy5xdWV1ZS5wdXNoKHtcbiAgICAgICAgcGVuZGluZyxcbiAgICAgICAgcGVuZGluZ0NvdW50OiBPYmplY3Qua2V5cyhwZW5kaW5nKS5sZW5ndGgsXG4gICAgICAgIGxvYWRlZDoge30sXG4gICAgICAgIGVycm9yczogW10sXG4gICAgICAgIGNhbGxiYWNrXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvTG9hZDogT2JqZWN0LmtleXModG9Mb2FkKSxcbiAgICAgIHBlbmRpbmc6IE9iamVjdC5rZXlzKHBlbmRpbmcpLFxuICAgICAgdG9Mb2FkTGFuZ3VhZ2VzOiBPYmplY3Qua2V5cyh0b0xvYWRMYW5ndWFnZXMpLFxuICAgICAgdG9Mb2FkTmFtZXNwYWNlczogT2JqZWN0LmtleXModG9Mb2FkTmFtZXNwYWNlcylcbiAgICB9O1xuICB9XG4gIGxvYWRlZChuYW1lLCBlcnIsIGRhdGEpIHtcbiAgICBjb25zdCBzID0gbmFtZS5zcGxpdCgnfCcpO1xuICAgIGNvbnN0IGxuZyA9IHNbMF07XG4gICAgY29uc3QgbnMgPSBzWzFdO1xuICAgIGlmIChlcnIpIHRoaXMuZW1pdCgnZmFpbGVkTG9hZGluZycsIGxuZywgbnMsIGVycik7XG4gICAgaWYgKCFlcnIgJiYgZGF0YSkge1xuICAgICAgdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShsbmcsIG5zLCBkYXRhLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuICAgICAgICBza2lwQ29weTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc3RhdGVbbmFtZV0gPSBlcnIgPyAtMSA6IDI7XG4gICAgaWYgKGVyciAmJiBkYXRhKSB0aGlzLnN0YXRlW25hbWVdID0gMDtcbiAgICBjb25zdCBsb2FkZWQgPSB7fTtcbiAgICB0aGlzLnF1ZXVlLmZvckVhY2gocSA9PiB7XG4gICAgICBwdXNoUGF0aChxLmxvYWRlZCwgW2xuZ10sIG5zKTtcbiAgICAgIHJlbW92ZVBlbmRpbmcocSwgbmFtZSk7XG4gICAgICBpZiAoZXJyKSBxLmVycm9ycy5wdXNoKGVycik7XG4gICAgICBpZiAocS5wZW5kaW5nQ291bnQgPT09IDAgJiYgIXEuZG9uZSkge1xuICAgICAgICBPYmplY3Qua2V5cyhxLmxvYWRlZCkuZm9yRWFjaChsID0+IHtcbiAgICAgICAgICBpZiAoIWxvYWRlZFtsXSkgbG9hZGVkW2xdID0ge307XG4gICAgICAgICAgY29uc3QgbG9hZGVkS2V5cyA9IHEubG9hZGVkW2xdO1xuICAgICAgICAgIGlmIChsb2FkZWRLZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9hZGVkS2V5cy5mb3JFYWNoKG4gPT4ge1xuICAgICAgICAgICAgICBpZiAobG9hZGVkW2xdW25dID09PSB1bmRlZmluZWQpIGxvYWRlZFtsXVtuXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBxLmRvbmUgPSB0cnVlO1xuICAgICAgICBpZiAocS5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgcS5jYWxsYmFjayhxLmVycm9ycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcS5jYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5lbWl0KCdsb2FkZWQnLCBsb2FkZWQpO1xuICAgIHRoaXMucXVldWUgPSB0aGlzLnF1ZXVlLmZpbHRlcihxID0+ICFxLmRvbmUpO1xuICB9XG4gIHJlYWQobG5nLCBucywgZmNOYW1lKSB7XG4gICAgbGV0IHRyaWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiAwO1xuICAgIGxldCB3YWl0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiB0aGlzLnJldHJ5VGltZW91dDtcbiAgICBsZXQgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gNSA/IGFyZ3VtZW50c1s1XSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIWxuZy5sZW5ndGgpIHJldHVybiBjYWxsYmFjayhudWxsLCB7fSk7XG4gICAgaWYgKHRoaXMucmVhZGluZ0NhbGxzID49IHRoaXMubWF4UGFyYWxsZWxSZWFkcykge1xuICAgICAgdGhpcy53YWl0aW5nUmVhZHMucHVzaCh7XG4gICAgICAgIGxuZyxcbiAgICAgICAgbnMsXG4gICAgICAgIGZjTmFtZSxcbiAgICAgICAgdHJpZWQsXG4gICAgICAgIHdhaXQsXG4gICAgICAgIGNhbGxiYWNrXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZWFkaW5nQ2FsbHMrKztcbiAgICBjb25zdCByZXNvbHZlciA9IChlcnIsIGRhdGEpID0+IHtcbiAgICAgIHRoaXMucmVhZGluZ0NhbGxzLS07XG4gICAgICBpZiAodGhpcy53YWl0aW5nUmVhZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy53YWl0aW5nUmVhZHMuc2hpZnQoKTtcbiAgICAgICAgdGhpcy5yZWFkKG5leHQubG5nLCBuZXh0Lm5zLCBuZXh0LmZjTmFtZSwgbmV4dC50cmllZCwgbmV4dC53YWl0LCBuZXh0LmNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgJiYgZGF0YSAmJiB0cmllZCA8IHRoaXMubWF4UmV0cmllcykge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlYWQuY2FsbCh0aGlzLCBsbmcsIG5zLCBmY05hbWUsIHRyaWVkICsgMSwgd2FpdCAqIDIsIGNhbGxiYWNrKTtcbiAgICAgICAgfSwgd2FpdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKGVyciwgZGF0YSk7XG4gICAgfTtcbiAgICBjb25zdCBmYyA9IHRoaXMuYmFja2VuZFtmY05hbWVdLmJpbmQodGhpcy5iYWNrZW5kKTtcbiAgICBpZiAoZmMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByID0gZmMobG5nLCBucyk7XG4gICAgICAgIGlmIChyICYmIHR5cGVvZiByLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByLnRoZW4oZGF0YSA9PiByZXNvbHZlcihudWxsLCBkYXRhKSkuY2F0Y2gocmVzb2x2ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmVyKG51bGwsIHIpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVzb2x2ZXIoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGZjKGxuZywgbnMsIHJlc29sdmVyKTtcbiAgfVxuICBwcmVwYXJlTG9hZGluZyhsYW5ndWFnZXMsIG5hbWVzcGFjZXMpIHtcbiAgICBsZXQgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgbGV0IGNhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiB1bmRlZmluZWQ7XG4gICAgaWYgKCF0aGlzLmJhY2tlbmQpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ05vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuJyk7XG4gICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBsYW5ndWFnZXMgPT09ICdzdHJpbmcnKSBsYW5ndWFnZXMgPSB0aGlzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGxhbmd1YWdlcyk7XG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJykgbmFtZXNwYWNlcyA9IFtuYW1lc3BhY2VzXTtcbiAgICBjb25zdCB0b0xvYWQgPSB0aGlzLnF1ZXVlTG9hZChsYW5ndWFnZXMsIG5hbWVzcGFjZXMsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICBpZiAoIXRvTG9hZC50b0xvYWQubGVuZ3RoKSB7XG4gICAgICBpZiAoIXRvTG9hZC5wZW5kaW5nLmxlbmd0aCkgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0b0xvYWQudG9Mb2FkLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICB0aGlzLmxvYWRPbmUobmFtZSk7XG4gICAgfSk7XG4gIH1cbiAgbG9hZChsYW5ndWFnZXMsIG5hbWVzcGFjZXMsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5wcmVwYXJlTG9hZGluZyhsYW5ndWFnZXMsIG5hbWVzcGFjZXMsIHt9LCBjYWxsYmFjayk7XG4gIH1cbiAgcmVsb2FkKGxhbmd1YWdlcywgbmFtZXNwYWNlcywgY2FsbGJhY2spIHtcbiAgICB0aGlzLnByZXBhcmVMb2FkaW5nKGxhbmd1YWdlcywgbmFtZXNwYWNlcywge1xuICAgICAgcmVsb2FkOiB0cnVlXG4gICAgfSwgY2FsbGJhY2spO1xuICB9XG4gIGxvYWRPbmUobmFtZSkge1xuICAgIGxldCBwcmVmaXggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICcnO1xuICAgIGNvbnN0IHMgPSBuYW1lLnNwbGl0KCd8Jyk7XG4gICAgY29uc3QgbG5nID0gc1swXTtcbiAgICBjb25zdCBucyA9IHNbMV07XG4gICAgdGhpcy5yZWFkKGxuZywgbnMsICdyZWFkJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgIGlmIChlcnIpIHRoaXMubG9nZ2VyLndhcm4oYCR7cHJlZml4fWxvYWRpbmcgbmFtZXNwYWNlICR7bnN9IGZvciBsYW5ndWFnZSAke2xuZ30gZmFpbGVkYCwgZXJyKTtcbiAgICAgIGlmICghZXJyICYmIGRhdGEpIHRoaXMubG9nZ2VyLmxvZyhgJHtwcmVmaXh9bG9hZGVkIG5hbWVzcGFjZSAke25zfSBmb3IgbGFuZ3VhZ2UgJHtsbmd9YCwgZGF0YSk7XG4gICAgICB0aGlzLmxvYWRlZChuYW1lLCBlcnIsIGRhdGEpO1xuICAgIH0pO1xuICB9XG4gIHNhdmVNaXNzaW5nKGxhbmd1YWdlcywgbmFtZXNwYWNlLCBrZXksIGZhbGxiYWNrVmFsdWUsIGlzVXBkYXRlKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gNSAmJiBhcmd1bWVudHNbNV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s1XSA6IHt9O1xuICAgIGxldCBjbGIgPSBhcmd1bWVudHMubGVuZ3RoID4gNiAmJiBhcmd1bWVudHNbNl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s2XSA6ICgpID0+IHt9O1xuICAgIGlmICh0aGlzLnNlcnZpY2VzLnV0aWxzICYmIHRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlICYmICF0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShuYW1lc3BhY2UpKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKGBkaWQgbm90IHNhdmUga2V5IFwiJHtrZXl9XCIgYXMgdGhlIG5hbWVzcGFjZSBcIiR7bmFtZXNwYWNlfVwiIHdhcyBub3QgeWV0IGxvYWRlZGAsICdUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gbnVsbCB8fCBrZXkgPT09ICcnKSByZXR1cm47XG4gICAgaWYgKHRoaXMuYmFja2VuZCAmJiB0aGlzLmJhY2tlbmQuY3JlYXRlKSB7XG4gICAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBpc1VwZGF0ZVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGZjID0gdGhpcy5iYWNrZW5kLmNyZWF0ZS5iaW5kKHRoaXMuYmFja2VuZCk7XG4gICAgICBpZiAoZmMubGVuZ3RoIDwgNikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCByO1xuICAgICAgICAgIGlmIChmYy5sZW5ndGggPT09IDUpIHtcbiAgICAgICAgICAgIHIgPSBmYyhsYW5ndWFnZXMsIG5hbWVzcGFjZSwga2V5LCBmYWxsYmFja1ZhbHVlLCBvcHRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgciA9IGZjKGxhbmd1YWdlcywgbmFtZXNwYWNlLCBrZXksIGZhbGxiYWNrVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAociAmJiB0eXBlb2Ygci50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByLnRoZW4oZGF0YSA9PiBjbGIobnVsbCwgZGF0YSkpLmNhdGNoKGNsYik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsYihudWxsLCByKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNsYihlcnIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmYyhsYW5ndWFnZXMsIG5hbWVzcGFjZSwga2V5LCBmYWxsYmFja1ZhbHVlLCBjbGIsIG9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWxhbmd1YWdlcyB8fCAhbGFuZ3VhZ2VzWzBdKSByZXR1cm47XG4gICAgdGhpcy5zdG9yZS5hZGRSZXNvdXJjZShsYW5ndWFnZXNbMF0sIG5hbWVzcGFjZSwga2V5LCBmYWxsYmFja1ZhbHVlKTtcbiAgfVxufVxuXG5jb25zdCBnZXQgPSAoKSA9PiAoe1xuICBkZWJ1ZzogZmFsc2UsXG4gIGluaXRJbW1lZGlhdGU6IHRydWUsXG4gIG5zOiBbJ3RyYW5zbGF0aW9uJ10sXG4gIGRlZmF1bHROUzogWyd0cmFuc2xhdGlvbiddLFxuICBmYWxsYmFja0xuZzogWydkZXYnXSxcbiAgZmFsbGJhY2tOUzogZmFsc2UsXG4gIHN1cHBvcnRlZExuZ3M6IGZhbHNlLFxuICBub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6IGZhbHNlLFxuICBsb2FkOiAnYWxsJyxcbiAgcHJlbG9hZDogZmFsc2UsXG4gIHNpbXBsaWZ5UGx1cmFsU3VmZml4OiB0cnVlLFxuICBrZXlTZXBhcmF0b3I6ICcuJyxcbiAgbnNTZXBhcmF0b3I6ICc6JyxcbiAgcGx1cmFsU2VwYXJhdG9yOiAnXycsXG4gIGNvbnRleHRTZXBhcmF0b3I6ICdfJyxcbiAgcGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6IGZhbHNlLFxuICBzYXZlTWlzc2luZzogZmFsc2UsXG4gIHVwZGF0ZU1pc3Npbmc6IGZhbHNlLFxuICBzYXZlTWlzc2luZ1RvOiAnZmFsbGJhY2snLFxuICBzYXZlTWlzc2luZ1BsdXJhbHM6IHRydWUsXG4gIG1pc3NpbmdLZXlIYW5kbGVyOiBmYWxzZSxcbiAgbWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyOiBmYWxzZSxcbiAgcG9zdFByb2Nlc3M6IGZhbHNlLFxuICBwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDogZmFsc2UsXG4gIHJldHVybk51bGw6IGZhbHNlLFxuICByZXR1cm5FbXB0eVN0cmluZzogdHJ1ZSxcbiAgcmV0dXJuT2JqZWN0czogZmFsc2UsXG4gIGpvaW5BcnJheXM6IGZhbHNlLFxuICByZXR1cm5lZE9iamVjdEhhbmRsZXI6IGZhbHNlLFxuICBwYXJzZU1pc3NpbmdLZXlIYW5kbGVyOiBmYWxzZSxcbiAgYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5OiBmYWxzZSxcbiAgYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6IGZhbHNlLFxuICBvdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcjogYXJncyA9PiB7XG4gICAgbGV0IHJldCA9IHt9O1xuICAgIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gJ29iamVjdCcpIHJldCA9IGFyZ3NbMV07XG4gICAgaWYgKHR5cGVvZiBhcmdzWzFdID09PSAnc3RyaW5nJykgcmV0LmRlZmF1bHRWYWx1ZSA9IGFyZ3NbMV07XG4gICAgaWYgKHR5cGVvZiBhcmdzWzJdID09PSAnc3RyaW5nJykgcmV0LnREZXNjcmlwdGlvbiA9IGFyZ3NbMl07XG4gICAgaWYgKHR5cGVvZiBhcmdzWzJdID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgYXJnc1szXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBhcmdzWzNdIHx8IGFyZ3NbMl07XG4gICAgICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHJldFtrZXldID0gb3B0aW9uc1trZXldO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sXG4gIGludGVycG9sYXRpb246IHtcbiAgICBlc2NhcGVWYWx1ZTogdHJ1ZSxcbiAgICBmb3JtYXQ6IHZhbHVlID0+IHZhbHVlLFxuICAgIHByZWZpeDogJ3t7JyxcbiAgICBzdWZmaXg6ICd9fScsXG4gICAgZm9ybWF0U2VwYXJhdG9yOiAnLCcsXG4gICAgdW5lc2NhcGVQcmVmaXg6ICctJyxcbiAgICBuZXN0aW5nUHJlZml4OiAnJHQoJyxcbiAgICBuZXN0aW5nU3VmZml4OiAnKScsXG4gICAgbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6ICcsJyxcbiAgICBtYXhSZXBsYWNlczogMTAwMCxcbiAgICBza2lwT25WYXJpYWJsZXM6IHRydWVcbiAgfVxufSk7XG5jb25zdCB0cmFuc2Zvcm1PcHRpb25zID0gb3B0aW9ucyA9PiB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5ucyA9PT0gJ3N0cmluZycpIG9wdGlvbnMubnMgPSBbb3B0aW9ucy5uc107XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5mYWxsYmFja0xuZyA9PT0gJ3N0cmluZycpIG9wdGlvbnMuZmFsbGJhY2tMbmcgPSBbb3B0aW9ucy5mYWxsYmFja0xuZ107XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5mYWxsYmFja05TID09PSAnc3RyaW5nJykgb3B0aW9ucy5mYWxsYmFja05TID0gW29wdGlvbnMuZmFsbGJhY2tOU107XG4gIGlmIChvcHRpb25zLnN1cHBvcnRlZExuZ3MgJiYgb3B0aW9ucy5zdXBwb3J0ZWRMbmdzLmluZGV4T2YoJ2NpbW9kZScpIDwgMCkge1xuICAgIG9wdGlvbnMuc3VwcG9ydGVkTG5ncyA9IG9wdGlvbnMuc3VwcG9ydGVkTG5ncy5jb25jYXQoWydjaW1vZGUnXSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5jb25zdCBiaW5kTWVtYmVyRnVuY3Rpb25zID0gaW5zdCA9PiB7XG4gIGNvbnN0IG1lbXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoaW5zdCkpO1xuICBtZW1zLmZvckVhY2gobWVtID0+IHtcbiAgICBpZiAodHlwZW9mIGluc3RbbWVtXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5zdFttZW1dID0gaW5zdFttZW1dLmJpbmQoaW5zdCk7XG4gICAgfVxuICB9KTtcbn07XG5jbGFzcyBJMThuIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGxldCBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5vcHRpb25zID0gdHJhbnNmb3JtT3B0aW9ucyhvcHRpb25zKTtcbiAgICB0aGlzLnNlcnZpY2VzID0ge307XG4gICAgdGhpcy5sb2dnZXIgPSBiYXNlTG9nZ2VyO1xuICAgIHRoaXMubW9kdWxlcyA9IHtcbiAgICAgIGV4dGVybmFsOiBbXVxuICAgIH07XG4gICAgYmluZE1lbWJlckZ1bmN0aW9ucyh0aGlzKTtcbiAgICBpZiAoY2FsbGJhY2sgJiYgIXRoaXMuaXNJbml0aWFsaXplZCAmJiAhb3B0aW9ucy5pc0Nsb25lKSB7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlKSB7XG4gICAgICAgIHRoaXMuaW5pdChvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdChvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cbiAgaW5pdCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBsZXQgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzSW5pdGlhbGl6aW5nID0gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmRlZmF1bHROUyAmJiBvcHRpb25zLmRlZmF1bHROUyAhPT0gZmFsc2UgJiYgb3B0aW9ucy5ucykge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm5zID09PSAnc3RyaW5nJykge1xuICAgICAgICBvcHRpb25zLmRlZmF1bHROUyA9IG9wdGlvbnMubnM7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMubnMuaW5kZXhPZigndHJhbnNsYXRpb24nKSA8IDApIHtcbiAgICAgICAgb3B0aW9ucy5kZWZhdWx0TlMgPSBvcHRpb25zLm5zWzBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkZWZPcHRzID0gZ2V0KCk7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4uZGVmT3B0cyxcbiAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgIC4uLnRyYW5zZm9ybU9wdGlvbnMob3B0aW9ucylcbiAgICB9O1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSAhPT0gJ3YxJykge1xuICAgICAgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24gPSB7XG4gICAgICAgIC4uLmRlZk9wdHMuaW50ZXJwb2xhdGlvbixcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLmludGVycG9sYXRpb25cbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmtleVNlcGFyYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3IgPSBvcHRpb25zLmtleVNlcGFyYXRvcjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubnNTZXBhcmF0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkTnNTZXBhcmF0b3IgPSBvcHRpb25zLm5zU2VwYXJhdG9yO1xuICAgIH1cbiAgICBjb25zdCBjcmVhdGVDbGFzc09uRGVtYW5kID0gQ2xhc3NPck9iamVjdCA9PiB7XG4gICAgICBpZiAoIUNsYXNzT3JPYmplY3QpIHJldHVybiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBDbGFzc09yT2JqZWN0ID09PSAnZnVuY3Rpb24nKSByZXR1cm4gbmV3IENsYXNzT3JPYmplY3QoKTtcbiAgICAgIHJldHVybiBDbGFzc09yT2JqZWN0O1xuICAgIH07XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuaXNDbG9uZSkge1xuICAgICAgaWYgKHRoaXMubW9kdWxlcy5sb2dnZXIpIHtcbiAgICAgICAgYmFzZUxvZ2dlci5pbml0KGNyZWF0ZUNsYXNzT25EZW1hbmQodGhpcy5tb2R1bGVzLmxvZ2dlciksIHRoaXMub3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlTG9nZ2VyLmluaXQobnVsbCwgdGhpcy5vcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGxldCBmb3JtYXR0ZXI7XG4gICAgICBpZiAodGhpcy5tb2R1bGVzLmZvcm1hdHRlcikge1xuICAgICAgICBmb3JtYXR0ZXIgPSB0aGlzLm1vZHVsZXMuZm9ybWF0dGVyO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgSW50bCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZm9ybWF0dGVyID0gRm9ybWF0dGVyO1xuICAgICAgfVxuICAgICAgY29uc3QgbHUgPSBuZXcgTGFuZ3VhZ2VVdGlsKHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnN0b3JlID0gbmV3IFJlc291cmNlU3RvcmUodGhpcy5vcHRpb25zLnJlc291cmNlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgIGNvbnN0IHMgPSB0aGlzLnNlcnZpY2VzO1xuICAgICAgcy5sb2dnZXIgPSBiYXNlTG9nZ2VyO1xuICAgICAgcy5yZXNvdXJjZVN0b3JlID0gdGhpcy5zdG9yZTtcbiAgICAgIHMubGFuZ3VhZ2VVdGlscyA9IGx1O1xuICAgICAgcy5wbHVyYWxSZXNvbHZlciA9IG5ldyBQbHVyYWxSZXNvbHZlcihsdSwge1xuICAgICAgICBwcmVwZW5kOiB0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLFxuICAgICAgICBjb21wYXRpYmlsaXR5SlNPTjogdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OLFxuICAgICAgICBzaW1wbGlmeVBsdXJhbFN1ZmZpeDogdGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4XG4gICAgICB9KTtcbiAgICAgIGlmIChmb3JtYXR0ZXIgJiYgKCF0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQgfHwgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0ID09PSBkZWZPcHRzLmludGVycG9sYXRpb24uZm9ybWF0KSkge1xuICAgICAgICBzLmZvcm1hdHRlciA9IGNyZWF0ZUNsYXNzT25EZW1hbmQoZm9ybWF0dGVyKTtcbiAgICAgICAgcy5mb3JtYXR0ZXIuaW5pdChzLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQgPSBzLmZvcm1hdHRlci5mb3JtYXQuYmluZChzLmZvcm1hdHRlcik7XG4gICAgICB9XG4gICAgICBzLmludGVycG9sYXRvciA9IG5ldyBJbnRlcnBvbGF0b3IodGhpcy5vcHRpb25zKTtcbiAgICAgIHMudXRpbHMgPSB7XG4gICAgICAgIGhhc0xvYWRlZE5hbWVzcGFjZTogdGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKVxuICAgICAgfTtcbiAgICAgIHMuYmFja2VuZENvbm5lY3RvciA9IG5ldyBDb25uZWN0b3IoY3JlYXRlQ2xhc3NPbkRlbWFuZCh0aGlzLm1vZHVsZXMuYmFja2VuZCksIHMucmVzb3VyY2VTdG9yZSwgcywgdGhpcy5vcHRpb25zKTtcbiAgICAgIHMuYmFja2VuZENvbm5lY3Rvci5vbignKicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcikge1xuICAgICAgICBzLmxhbmd1YWdlRGV0ZWN0b3IgPSBjcmVhdGVDbGFzc09uRGVtYW5kKHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yKTtcbiAgICAgICAgaWYgKHMubGFuZ3VhZ2VEZXRlY3Rvci5pbml0KSBzLmxhbmd1YWdlRGV0ZWN0b3IuaW5pdChzLCB0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0KSB7XG4gICAgICAgIHMuaTE4bkZvcm1hdCA9IGNyZWF0ZUNsYXNzT25EZW1hbmQodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpO1xuICAgICAgICBpZiAocy5pMThuRm9ybWF0LmluaXQpIHMuaTE4bkZvcm1hdC5pbml0KHRoaXMpO1xuICAgICAgfVxuICAgICAgdGhpcy50cmFuc2xhdG9yID0gbmV3IFRyYW5zbGF0b3IodGhpcy5zZXJ2aWNlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMudHJhbnNsYXRvci5vbignKicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubW9kdWxlcy5leHRlcm5hbC5mb3JFYWNoKG0gPT4ge1xuICAgICAgICBpZiAobS5pbml0KSBtLmluaXQodGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5mb3JtYXQgPSB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQ7XG4gICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBub29wO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcgJiYgIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciAmJiAhdGhpcy5vcHRpb25zLmxuZykge1xuICAgICAgY29uc3QgY29kZXMgPSB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpO1xuICAgICAgaWYgKGNvZGVzLmxlbmd0aCA+IDAgJiYgY29kZXNbMF0gIT09ICdkZXYnKSB0aGlzLm9wdGlvbnMubG5nID0gY29kZXNbMF07XG4gICAgfVxuICAgIGlmICghdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yICYmICF0aGlzLm9wdGlvbnMubG5nKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdpbml0OiBubyBsYW5ndWFnZURldGVjdG9yIGlzIHVzZWQgYW5kIG5vIGxuZyBpcyBkZWZpbmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHN0b3JlQXBpID0gWydnZXRSZXNvdXJjZScsICdoYXNSZXNvdXJjZUJ1bmRsZScsICdnZXRSZXNvdXJjZUJ1bmRsZScsICdnZXREYXRhQnlMYW5ndWFnZSddO1xuICAgIHN0b3JlQXBpLmZvckVhY2goZmNOYW1lID0+IHtcbiAgICAgIHRoaXNbZmNOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnN0b3JlW2ZjTmFtZV0oLi4uYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3Qgc3RvcmVBcGlDaGFpbmVkID0gWydhZGRSZXNvdXJjZScsICdhZGRSZXNvdXJjZXMnLCAnYWRkUmVzb3VyY2VCdW5kbGUnLCAncmVtb3ZlUmVzb3VyY2VCdW5kbGUnXTtcbiAgICBzdG9yZUFwaUNoYWluZWQuZm9yRWFjaChmY05hbWUgPT4ge1xuICAgICAgdGhpc1tmY05hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5zdG9yZVtmY05hbWVdKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIGNvbnN0IGxvYWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBmaW5pc2ggPSAoZXJyLCB0KSA9PiB7XG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXppbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCAmJiAhdGhpcy5pbml0aWFsaXplZFN0b3JlT25jZSkgdGhpcy5sb2dnZXIud2FybignaW5pdDogaTE4bmV4dCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiBZb3Ugc2hvdWxkIGNhbGwgaW5pdCBqdXN0IG9uY2UhJyk7XG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmlzQ2xvbmUpIHRoaXMubG9nZ2VyLmxvZygnaW5pdGlhbGl6ZWQnLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVtaXQoJ2luaXRpYWxpemVkJywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0KTtcbiAgICAgICAgY2FsbGJhY2soZXJyLCB0KTtcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5sYW5ndWFnZXMgJiYgdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkgIT09ICd2MScgJiYgIXRoaXMuaXNJbml0aWFsaXplZCkgcmV0dXJuIGZpbmlzaChudWxsLCB0aGlzLnQuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLmNoYW5nZUxhbmd1YWdlKHRoaXMub3B0aW9ucy5sbmcsIGZpbmlzaCk7XG4gICAgfTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnJlc291cmNlcyB8fCAhdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGUpIHtcbiAgICAgIGxvYWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dChsb2FkLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmVycmVkO1xuICB9XG4gIGxvYWRSZXNvdXJjZXMobGFuZ3VhZ2UpIHtcbiAgICBsZXQgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG5vb3A7XG4gICAgbGV0IHVzZWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIGNvbnN0IHVzZWRMbmcgPSB0eXBlb2YgbGFuZ3VhZ2UgPT09ICdzdHJpbmcnID8gbGFuZ3VhZ2UgOiB0aGlzLmxhbmd1YWdlO1xuICAgIGlmICh0eXBlb2YgbGFuZ3VhZ2UgPT09ICdmdW5jdGlvbicpIHVzZWRDYWxsYmFjayA9IGxhbmd1YWdlO1xuICAgIGlmICghdGhpcy5vcHRpb25zLnJlc291cmNlcyB8fCB0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXMpIHtcbiAgICAgIGlmICh1c2VkTG5nICYmIHVzZWRMbmcudG9Mb3dlckNhc2UoKSA9PT0gJ2NpbW9kZScgJiYgKCF0aGlzLm9wdGlvbnMucHJlbG9hZCB8fCB0aGlzLm9wdGlvbnMucHJlbG9hZC5sZW5ndGggPT09IDApKSByZXR1cm4gdXNlZENhbGxiYWNrKCk7XG4gICAgICBjb25zdCB0b0xvYWQgPSBbXTtcbiAgICAgIGNvbnN0IGFwcGVuZCA9IGxuZyA9PiB7XG4gICAgICAgIGlmICghbG5nKSByZXR1cm47XG4gICAgICAgIGlmIChsbmcgPT09ICdjaW1vZGUnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGxuZ3MgPSB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGxuZyk7XG4gICAgICAgIGxuZ3MuZm9yRWFjaChsID0+IHtcbiAgICAgICAgICBpZiAobCA9PT0gJ2NpbW9kZScpIHJldHVybjtcbiAgICAgICAgICBpZiAodG9Mb2FkLmluZGV4T2YobCkgPCAwKSB0b0xvYWQucHVzaChsKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgaWYgKCF1c2VkTG5nKSB7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrcyA9IHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7XG4gICAgICAgIGZhbGxiYWNrcy5mb3JFYWNoKGwgPT4gYXBwZW5kKGwpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwcGVuZCh1c2VkTG5nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJlbG9hZCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMucHJlbG9hZC5mb3JFYWNoKGwgPT4gYXBwZW5kKGwpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5sb2FkKHRvTG9hZCwgdGhpcy5vcHRpb25zLm5zLCBlID0+IHtcbiAgICAgICAgaWYgKCFlICYmICF0aGlzLnJlc29sdmVkTGFuZ3VhZ2UgJiYgdGhpcy5sYW5ndWFnZSkgdGhpcy5zZXRSZXNvbHZlZExhbmd1YWdlKHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgICB1c2VkQ2FsbGJhY2soZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXNlZENhbGxiYWNrKG51bGwpO1xuICAgIH1cbiAgfVxuICByZWxvYWRSZXNvdXJjZXMobG5ncywgbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIGlmICh0eXBlb2YgbG5ncyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBsbmdzO1xuICAgICAgbG5ncyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBucztcbiAgICAgIG5zID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIWxuZ3MpIGxuZ3MgPSB0aGlzLmxhbmd1YWdlcztcbiAgICBpZiAoIW5zKSBucyA9IHRoaXMub3B0aW9ucy5ucztcbiAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IG5vb3A7XG4gICAgdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZChsbmdzLCBucywgZXJyID0+IHtcbiAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlZmVycmVkO1xuICB9XG4gIHVzZShtb2R1bGUpIHtcbiAgICBpZiAoIW1vZHVsZSkgdGhyb3cgbmV3IEVycm9yKCdZb3UgYXJlIHBhc3NpbmcgYW4gdW5kZWZpbmVkIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCknKTtcbiAgICBpZiAoIW1vZHVsZS50eXBlKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBhcmUgcGFzc2luZyBhIHdyb25nIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCknKTtcbiAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdiYWNrZW5kJykge1xuICAgICAgdGhpcy5tb2R1bGVzLmJhY2tlbmQgPSBtb2R1bGU7XG4gICAgfVxuICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJ2xvZ2dlcicgfHwgbW9kdWxlLmxvZyAmJiBtb2R1bGUud2FybiAmJiBtb2R1bGUuZXJyb3IpIHtcbiAgICAgIHRoaXMubW9kdWxlcy5sb2dnZXIgPSBtb2R1bGU7XG4gICAgfVxuICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJ2xhbmd1YWdlRGV0ZWN0b3InKSB7XG4gICAgICB0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciA9IG1vZHVsZTtcbiAgICB9XG4gICAgaWYgKG1vZHVsZS50eXBlID09PSAnaTE4bkZvcm1hdCcpIHtcbiAgICAgIHRoaXMubW9kdWxlcy5pMThuRm9ybWF0ID0gbW9kdWxlO1xuICAgIH1cbiAgICBpZiAobW9kdWxlLnR5cGUgPT09ICdwb3N0UHJvY2Vzc29yJykge1xuICAgICAgcG9zdFByb2Nlc3Nvci5hZGRQb3N0UHJvY2Vzc29yKG1vZHVsZSk7XG4gICAgfVxuICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJ2Zvcm1hdHRlcicpIHtcbiAgICAgIHRoaXMubW9kdWxlcy5mb3JtYXR0ZXIgPSBtb2R1bGU7XG4gICAgfVxuICAgIGlmIChtb2R1bGUudHlwZSA9PT0gJzNyZFBhcnR5Jykge1xuICAgICAgdGhpcy5tb2R1bGVzLmV4dGVybmFsLnB1c2gobW9kdWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgc2V0UmVzb2x2ZWRMYW5ndWFnZShsKSB7XG4gICAgaWYgKCFsIHx8ICF0aGlzLmxhbmd1YWdlcykgcmV0dXJuO1xuICAgIGlmIChbJ2NpbW9kZScsICdkZXYnXS5pbmRleE9mKGwpID4gLTEpIHJldHVybjtcbiAgICBmb3IgKGxldCBsaSA9IDA7IGxpIDwgdGhpcy5sYW5ndWFnZXMubGVuZ3RoOyBsaSsrKSB7XG4gICAgICBjb25zdCBsbmdJbkxuZ3MgPSB0aGlzLmxhbmd1YWdlc1tsaV07XG4gICAgICBpZiAoWydjaW1vZGUnLCAnZGV2J10uaW5kZXhPZihsbmdJbkxuZ3MpID4gLTEpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMuc3RvcmUuaGFzTGFuZ3VhZ2VTb21lVHJhbnNsYXRpb25zKGxuZ0luTG5ncykpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZExhbmd1YWdlID0gbG5nSW5MbmdzO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY2hhbmdlTGFuZ3VhZ2UobG5nLCBjYWxsYmFjaykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgIHRoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG8gPSBsbmc7XG4gICAgY29uc3QgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIHRoaXMuZW1pdCgnbGFuZ3VhZ2VDaGFuZ2luZycsIGxuZyk7XG4gICAgY29uc3Qgc2V0TG5nUHJvcHMgPSBsID0+IHtcbiAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsO1xuICAgICAgdGhpcy5sYW5ndWFnZXMgPSB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGwpO1xuICAgICAgdGhpcy5yZXNvbHZlZExhbmd1YWdlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zZXRSZXNvbHZlZExhbmd1YWdlKGwpO1xuICAgIH07XG4gICAgY29uc3QgZG9uZSA9IChlcnIsIGwpID0+IHtcbiAgICAgIGlmIChsKSB7XG4gICAgICAgIHNldExuZ1Byb3BzKGwpO1xuICAgICAgICB0aGlzLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2UobCk7XG4gICAgICAgIHRoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG8gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZW1pdCgnbGFuZ3VhZ2VDaGFuZ2VkJywgbCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZygnbGFuZ3VhZ2VDaGFuZ2VkJywgbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgZGVmZXJyZWQucmVzb2x2ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIudCguLi5hcmd1bWVudHMpO1xuICAgICAgfSk7XG4gICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVyciwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMyLnQoLi4uYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgc2V0TG5nID0gbG5ncyA9PiB7XG4gICAgICBpZiAoIWxuZyAmJiAhbG5ncyAmJiB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IpIGxuZ3MgPSBbXTtcbiAgICAgIGNvbnN0IGwgPSB0eXBlb2YgbG5ncyA9PT0gJ3N0cmluZycgPyBsbmdzIDogdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEJlc3RNYXRjaEZyb21Db2RlcyhsbmdzKTtcbiAgICAgIGlmIChsKSB7XG4gICAgICAgIGlmICghdGhpcy5sYW5ndWFnZSkge1xuICAgICAgICAgIHNldExuZ1Byb3BzKGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy50cmFuc2xhdG9yLmxhbmd1YWdlKSB0aGlzLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2UobCk7XG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IgJiYgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKSB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuY2FjaGVVc2VyTGFuZ3VhZ2UobCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRSZXNvdXJjZXMobCwgZXJyID0+IHtcbiAgICAgICAgZG9uZShlcnIsIGwpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBpZiAoIWxuZyAmJiB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IgJiYgIXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYykge1xuICAgICAgc2V0TG5nKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSk7XG4gICAgfSBlbHNlIGlmICghbG5nICYmIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciAmJiB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmMpIHtcbiAgICAgIGlmICh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KCkudGhlbihzZXRMbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdChzZXRMbmcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRMbmcobG5nKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmVycmVkO1xuICB9XG4gIGdldEZpeGVkVChsbmcsIG5zLCBrZXlQcmVmaXgpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcbiAgICBjb25zdCBmaXhlZFQgPSBmdW5jdGlvbiAoa2V5LCBvcHRzKSB7XG4gICAgICBsZXQgb3B0aW9ucztcbiAgICAgIGlmICh0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4zID4gMiA/IF9sZW4zIC0gMiA6IDApLCBfa2V5MyA9IDI7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgICAgICByZXN0W19rZXkzIC0gMl0gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMgPSBfdGhpczMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihba2V5LCBvcHRzXS5jb25jYXQocmVzdCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAuLi5vcHRzXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBvcHRpb25zLmxuZyA9IG9wdGlvbnMubG5nIHx8IGZpeGVkVC5sbmc7XG4gICAgICBvcHRpb25zLmxuZ3MgPSBvcHRpb25zLmxuZ3MgfHwgZml4ZWRULmxuZ3M7XG4gICAgICBvcHRpb25zLm5zID0gb3B0aW9ucy5ucyB8fCBmaXhlZFQubnM7XG4gICAgICBpZiAob3B0aW9ucy5rZXlQcmVmaXggIT09ICcnKSBvcHRpb25zLmtleVByZWZpeCA9IG9wdGlvbnMua2V5UHJlZml4IHx8IGtleVByZWZpeCB8fCBmaXhlZFQua2V5UHJlZml4O1xuICAgICAgY29uc3Qga2V5U2VwYXJhdG9yID0gX3RoaXMzLm9wdGlvbnMua2V5U2VwYXJhdG9yIHx8ICcuJztcbiAgICAgIGxldCByZXN1bHRLZXk7XG4gICAgICBpZiAob3B0aW9ucy5rZXlQcmVmaXggJiYgQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICAgIHJlc3VsdEtleSA9IGtleS5tYXAoayA9PiBgJHtvcHRpb25zLmtleVByZWZpeH0ke2tleVNlcGFyYXRvcn0ke2t9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRLZXkgPSBvcHRpb25zLmtleVByZWZpeCA/IGAke29wdGlvbnMua2V5UHJlZml4fSR7a2V5U2VwYXJhdG9yfSR7a2V5fWAgOiBrZXk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX3RoaXMzLnQocmVzdWx0S2V5LCBvcHRpb25zKTtcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgbG5nID09PSAnc3RyaW5nJykge1xuICAgICAgZml4ZWRULmxuZyA9IGxuZztcbiAgICB9IGVsc2Uge1xuICAgICAgZml4ZWRULmxuZ3MgPSBsbmc7XG4gICAgfVxuICAgIGZpeGVkVC5ucyA9IG5zO1xuICAgIGZpeGVkVC5rZXlQcmVmaXggPSBrZXlQcmVmaXg7XG4gICAgcmV0dXJuIGZpeGVkVDtcbiAgfVxuICB0KCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0b3IgJiYgdGhpcy50cmFuc2xhdG9yLnRyYW5zbGF0ZSguLi5hcmd1bWVudHMpO1xuICB9XG4gIGV4aXN0cygpIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdG9yICYmIHRoaXMudHJhbnNsYXRvci5leGlzdHMoLi4uYXJndW1lbnRzKTtcbiAgfVxuICBzZXREZWZhdWx0TmFtZXNwYWNlKG5zKSB7XG4gICAgdGhpcy5vcHRpb25zLmRlZmF1bHROUyA9IG5zO1xuICB9XG4gIGhhc0xvYWRlZE5hbWVzcGFjZShucykge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybignaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuZXh0IHdhcyBub3QgaW5pdGlhbGl6ZWQnLCB0aGlzLmxhbmd1YWdlcyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5sYW5ndWFnZXMgfHwgIXRoaXMubGFuZ3VhZ2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybignaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuLmxhbmd1YWdlcyB3ZXJlIHVuZGVmaW5lZCBvciBlbXB0eScsIHRoaXMubGFuZ3VhZ2VzKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbG5nID0gb3B0aW9ucy5sbmcgfHwgdGhpcy5yZXNvbHZlZExhbmd1YWdlIHx8IHRoaXMubGFuZ3VhZ2VzWzBdO1xuICAgIGNvbnN0IGZhbGxiYWNrTG5nID0gdGhpcy5vcHRpb25zID8gdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nIDogZmFsc2U7XG4gICAgY29uc3QgbGFzdExuZyA9IHRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsbmcudG9Mb3dlckNhc2UoKSA9PT0gJ2NpbW9kZScpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGxvYWROb3RQZW5kaW5nID0gKGwsIG4pID0+IHtcbiAgICAgIGNvbnN0IGxvYWRTdGF0ZSA9IHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVtgJHtsfXwke259YF07XG4gICAgICByZXR1cm4gbG9hZFN0YXRlID09PSAtMSB8fCBsb2FkU3RhdGUgPT09IDAgfHwgbG9hZFN0YXRlID09PSAyO1xuICAgIH07XG4gICAgaWYgKG9wdGlvbnMucHJlY2hlY2spIHtcbiAgICAgIGNvbnN0IHByZVJlc3VsdCA9IG9wdGlvbnMucHJlY2hlY2sodGhpcywgbG9hZE5vdFBlbmRpbmcpO1xuICAgICAgaWYgKHByZVJlc3VsdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcHJlUmVzdWx0O1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNSZXNvdXJjZUJ1bmRsZShsbmcsIG5zKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZCB8fCB0aGlzLm9wdGlvbnMucmVzb3VyY2VzICYmICF0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXMpIHJldHVybiB0cnVlO1xuICAgIGlmIChsb2FkTm90UGVuZGluZyhsbmcsIG5zKSAmJiAoIWZhbGxiYWNrTG5nIHx8IGxvYWROb3RQZW5kaW5nKGxhc3RMbmcsIG5zKSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBsb2FkTmFtZXNwYWNlcyhucywgY2FsbGJhY2spIHtcbiAgICBjb25zdCBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubnMpIHtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBucyA9PT0gJ3N0cmluZycpIG5zID0gW25zXTtcbiAgICBucy5mb3JFYWNoKG4gPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ucy5pbmRleE9mKG4pIDwgMCkgdGhpcy5vcHRpb25zLm5zLnB1c2gobik7XG4gICAgfSk7XG4gICAgdGhpcy5sb2FkUmVzb3VyY2VzKGVyciA9PiB7XG4gICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVycik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlZmVycmVkO1xuICB9XG4gIGxvYWRMYW5ndWFnZXMobG5ncywgY2FsbGJhY2spIHtcbiAgICBjb25zdCBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgaWYgKHR5cGVvZiBsbmdzID09PSAnc3RyaW5nJykgbG5ncyA9IFtsbmdzXTtcbiAgICBjb25zdCBwcmVsb2FkZWQgPSB0aGlzLm9wdGlvbnMucHJlbG9hZCB8fCBbXTtcbiAgICBjb25zdCBuZXdMbmdzID0gbG5ncy5maWx0ZXIobG5nID0+IHByZWxvYWRlZC5pbmRleE9mKGxuZykgPCAwICYmIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5pc1N1cHBvcnRlZENvZGUobG5nKSk7XG4gICAgaWYgKCFuZXdMbmdzLmxlbmd0aCkge1xuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnMucHJlbG9hZCA9IHByZWxvYWRlZC5jb25jYXQobmV3TG5ncyk7XG4gICAgdGhpcy5sb2FkUmVzb3VyY2VzKGVyciA9PiB7XG4gICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVycik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlZmVycmVkO1xuICB9XG4gIGRpcihsbmcpIHtcbiAgICBpZiAoIWxuZykgbG5nID0gdGhpcy5yZXNvbHZlZExhbmd1YWdlIHx8ICh0aGlzLmxhbmd1YWdlcyAmJiB0aGlzLmxhbmd1YWdlcy5sZW5ndGggPiAwID8gdGhpcy5sYW5ndWFnZXNbMF0gOiB0aGlzLmxhbmd1YWdlKTtcbiAgICBpZiAoIWxuZykgcmV0dXJuICdydGwnO1xuICAgIGNvbnN0IHJ0bExuZ3MgPSBbJ2FyJywgJ3NodScsICdzcXInLCAnc3NoJywgJ3hhYScsICd5aGQnLCAneXVkJywgJ2FhbycsICdhYmgnLCAnYWJ2JywgJ2FjbScsICdhY3EnLCAnYWN3JywgJ2FjeCcsICdhY3knLCAnYWRmJywgJ2FkcycsICdhZWInLCAnYWVjJywgJ2FmYicsICdhanAnLCAnYXBjJywgJ2FwZCcsICdhcmInLCAnYXJxJywgJ2FycycsICdhcnknLCAnYXJ6JywgJ2F1eicsICdhdmwnLCAnYXloJywgJ2F5bCcsICdheW4nLCAnYXlwJywgJ2JieicsICdwZ2EnLCAnaGUnLCAnaXcnLCAncHMnLCAncGJ0JywgJ3BidScsICdwc3QnLCAncHJwJywgJ3ByZCcsICd1ZycsICd1cicsICd5ZGQnLCAneWRzJywgJ3lpaCcsICdqaScsICd5aScsICdoYm8nLCAnbWVuJywgJ3htbicsICdmYScsICdqcHInLCAncGVvJywgJ3BlcycsICdwcnMnLCAnZHYnLCAnc2FtJywgJ2NrYiddO1xuICAgIGNvbnN0IGxhbmd1YWdlVXRpbHMgPSB0aGlzLnNlcnZpY2VzICYmIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscyB8fCBuZXcgTGFuZ3VhZ2VVdGlsKGdldCgpKTtcbiAgICByZXR1cm4gcnRsTG5ncy5pbmRleE9mKGxhbmd1YWdlVXRpbHMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUobG5nKSkgPiAtMSB8fCBsbmcudG9Mb3dlckNhc2UoKS5pbmRleE9mKCctYXJhYicpID4gMSA/ICdydGwnIDogJ2x0cic7XG4gIH1cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKCkge1xuICAgIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICBsZXQgY2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbmV3IEkxOG4ob3B0aW9ucywgY2FsbGJhY2spO1xuICB9XG4gIGNsb25lSW5zdGFuY2UoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIGxldCBjYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbm9vcDtcbiAgICBjb25zdCBmb3JrUmVzb3VyY2VTdG9yZSA9IG9wdGlvbnMuZm9ya1Jlc291cmNlU3RvcmU7XG4gICAgaWYgKGZvcmtSZXNvdXJjZVN0b3JlKSBkZWxldGUgb3B0aW9ucy5mb3JrUmVzb3VyY2VTdG9yZTtcbiAgICBjb25zdCBtZXJnZWRPcHRpb25zID0ge1xuICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC4uLntcbiAgICAgICAgaXNDbG9uZTogdHJ1ZVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgY2xvbmUgPSBuZXcgSTE4bihtZXJnZWRPcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5kZWJ1ZyAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMucHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsb25lLmxvZ2dlciA9IGNsb25lLmxvZ2dlci5jbG9uZShvcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgbWVtYmVyc1RvQ29weSA9IFsnc3RvcmUnLCAnc2VydmljZXMnLCAnbGFuZ3VhZ2UnXTtcbiAgICBtZW1iZXJzVG9Db3B5LmZvckVhY2gobSA9PiB7XG4gICAgICBjbG9uZVttXSA9IHRoaXNbbV07XG4gICAgfSk7XG4gICAgY2xvbmUuc2VydmljZXMgPSB7XG4gICAgICAuLi50aGlzLnNlcnZpY2VzXG4gICAgfTtcbiAgICBjbG9uZS5zZXJ2aWNlcy51dGlscyA9IHtcbiAgICAgIGhhc0xvYWRlZE5hbWVzcGFjZTogY2xvbmUuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoY2xvbmUpXG4gICAgfTtcbiAgICBpZiAoZm9ya1Jlc291cmNlU3RvcmUpIHtcbiAgICAgIGNsb25lLnN0b3JlID0gbmV3IFJlc291cmNlU3RvcmUodGhpcy5zdG9yZS5kYXRhLCBtZXJnZWRPcHRpb25zKTtcbiAgICAgIGNsb25lLnNlcnZpY2VzLnJlc291cmNlU3RvcmUgPSBjbG9uZS5zdG9yZTtcbiAgICB9XG4gICAgY2xvbmUudHJhbnNsYXRvciA9IG5ldyBUcmFuc2xhdG9yKGNsb25lLnNlcnZpY2VzLCBtZXJnZWRPcHRpb25zKTtcbiAgICBjbG9uZS50cmFuc2xhdG9yLm9uKCcqJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjQgPiAxID8gX2xlbjQgLSAxIDogMCksIF9rZXk0ID0gMTsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuICAgICAgICBhcmdzW19rZXk0IC0gMV0gPSBhcmd1bWVudHNbX2tleTRdO1xuICAgICAgfVxuICAgICAgY2xvbmUuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgfSk7XG4gICAgY2xvbmUuaW5pdChtZXJnZWRPcHRpb25zLCBjYWxsYmFjayk7XG4gICAgY2xvbmUudHJhbnNsYXRvci5vcHRpb25zID0gbWVyZ2VkT3B0aW9ucztcbiAgICBjbG9uZS50cmFuc2xhdG9yLmJhY2tlbmRDb25uZWN0b3Iuc2VydmljZXMudXRpbHMgPSB7XG4gICAgICBoYXNMb2FkZWROYW1lc3BhY2U6IGNsb25lLmhhc0xvYWRlZE5hbWVzcGFjZS5iaW5kKGNsb25lKVxuICAgIH07XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgc3RvcmU6IHRoaXMuc3RvcmUsXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgIGxhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMsXG4gICAgICByZXNvbHZlZExhbmd1YWdlOiB0aGlzLnJlc29sdmVkTGFuZ3VhZ2VcbiAgICB9O1xuICB9XG59XG5jb25zdCBpbnN0YW5jZSA9IEkxOG4uY3JlYXRlSW5zdGFuY2UoKTtcbmluc3RhbmNlLmNyZWF0ZUluc3RhbmNlID0gSTE4bi5jcmVhdGVJbnN0YW5jZTtcblxuY29uc3QgY3JlYXRlSW5zdGFuY2UgPSBpbnN0YW5jZS5jcmVhdGVJbnN0YW5jZTtcbmNvbnN0IGRpciA9IGluc3RhbmNlLmRpcjtcbmNvbnN0IGluaXQgPSBpbnN0YW5jZS5pbml0O1xuY29uc3QgbG9hZFJlc291cmNlcyA9IGluc3RhbmNlLmxvYWRSZXNvdXJjZXM7XG5jb25zdCByZWxvYWRSZXNvdXJjZXMgPSBpbnN0YW5jZS5yZWxvYWRSZXNvdXJjZXM7XG5jb25zdCB1c2UgPSBpbnN0YW5jZS51c2U7XG5jb25zdCBjaGFuZ2VMYW5ndWFnZSA9IGluc3RhbmNlLmNoYW5nZUxhbmd1YWdlO1xuY29uc3QgZ2V0Rml4ZWRUID0gaW5zdGFuY2UuZ2V0Rml4ZWRUO1xuY29uc3QgdCA9IGluc3RhbmNlLnQ7XG5jb25zdCBleGlzdHMgPSBpbnN0YW5jZS5leGlzdHM7XG5jb25zdCBzZXREZWZhdWx0TmFtZXNwYWNlID0gaW5zdGFuY2Uuc2V0RGVmYXVsdE5hbWVzcGFjZTtcbmNvbnN0IGhhc0xvYWRlZE5hbWVzcGFjZSA9IGluc3RhbmNlLmhhc0xvYWRlZE5hbWVzcGFjZTtcbmNvbnN0IGxvYWROYW1lc3BhY2VzID0gaW5zdGFuY2UubG9hZE5hbWVzcGFjZXM7XG5jb25zdCBsb2FkTGFuZ3VhZ2VzID0gaW5zdGFuY2UubG9hZExhbmd1YWdlcztcblxuZXhwb3J0IHsgY2hhbmdlTGFuZ3VhZ2UsIGNyZWF0ZUluc3RhbmNlLCBpbnN0YW5jZSBhcyBkZWZhdWx0LCBkaXIsIGV4aXN0cywgZ2V0Rml4ZWRULCBoYXNMb2FkZWROYW1lc3BhY2UsIGluaXQsIGxvYWRMYW5ndWFnZXMsIGxvYWROYW1lc3BhY2VzLCBsb2FkUmVzb3VyY2VzLCByZWxvYWRSZXNvdXJjZXMsIHNldERlZmF1bHROYW1lc3BhY2UsIHQsIHVzZSB9O1xuIiwiZnVuY3Rpb24gcHJvbWlzaWZ5UmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSAtIGZpbGUgc2l6ZSBoYWNrc1xuICAgICAgICByZXF1ZXN0Lm9uY29tcGxldGUgPSByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxdWVzdC5yZXN1bHQpO1xuICAgICAgICAvLyBAdHMtaWdub3JlIC0gZmlsZSBzaXplIGhhY2tzXG4gICAgICAgIHJlcXVlc3Qub25hYm9ydCA9IHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKGRiTmFtZSwgc3RvcmVOYW1lKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKGRiTmFtZSk7XG4gICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiByZXF1ZXN0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgIGNvbnN0IGRicCA9IHByb21pc2lmeVJlcXVlc3QocmVxdWVzdCk7XG4gICAgcmV0dXJuICh0eE1vZGUsIGNhbGxiYWNrKSA9PiBkYnAudGhlbigoZGIpID0+IGNhbGxiYWNrKGRiLnRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgdHhNb2RlKS5vYmplY3RTdG9yZShzdG9yZU5hbWUpKSk7XG59XG5sZXQgZGVmYXVsdEdldFN0b3JlRnVuYztcbmZ1bmN0aW9uIGRlZmF1bHRHZXRTdG9yZSgpIHtcbiAgICBpZiAoIWRlZmF1bHRHZXRTdG9yZUZ1bmMpIHtcbiAgICAgICAgZGVmYXVsdEdldFN0b3JlRnVuYyA9IGNyZWF0ZVN0b3JlKCdrZXl2YWwtc3RvcmUnLCAna2V5dmFsJyk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0R2V0U3RvcmVGdW5jO1xufVxuLyoqXG4gKiBHZXQgYSB2YWx1ZSBieSBpdHMga2V5LlxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBnZXQoa2V5LCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkb25seScsIChzdG9yZSkgPT4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS5nZXQoa2V5KSkpO1xufVxuLyoqXG4gKiBTZXQgYSB2YWx1ZSB3aXRoIGEga2V5LlxuICpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlLCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgICAgc3RvcmUucHV0KHZhbHVlLCBrZXkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS50cmFuc2FjdGlvbik7XG4gICAgfSk7XG59XG4vKipcbiAqIFNldCBtdWx0aXBsZSB2YWx1ZXMgYXQgb25jZS4gVGhpcyBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIHNldCgpIG11bHRpcGxlIHRpbWVzLlxuICogSXQncyBhbHNvIGF0b21pYyDigJMgaWYgb25lIG9mIHRoZSBwYWlycyBjYW4ndCBiZSBhZGRlZCwgbm9uZSB3aWxsIGJlIGFkZGVkLlxuICpcbiAqIEBwYXJhbSBlbnRyaWVzIEFycmF5IG9mIGVudHJpZXMsIHdoZXJlIGVhY2ggZW50cnkgaXMgYW4gYXJyYXkgb2YgYFtrZXksIHZhbHVlXWAuXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gc2V0TWFueShlbnRyaWVzLCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gc3RvcmUucHV0KGVudHJ5WzFdLCBlbnRyeVswXSkpO1xuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS50cmFuc2FjdGlvbik7XG4gICAgfSk7XG59XG4vKipcbiAqIEdldCBtdWx0aXBsZSB2YWx1ZXMgYnkgdGhlaXIga2V5c1xuICpcbiAqIEBwYXJhbSBrZXlzXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWFueShrZXlzLCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkb25seScsIChzdG9yZSkgPT4gUHJvbWlzZS5hbGwoa2V5cy5tYXAoKGtleSkgPT4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS5nZXQoa2V5KSkpKSk7XG59XG4vKipcbiAqIFVwZGF0ZSBhIHZhbHVlLiBUaGlzIGxldHMgeW91IHNlZSB0aGUgb2xkIHZhbHVlIGFuZCB1cGRhdGUgaXQgYXMgYW4gYXRvbWljIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gdXBkYXRlciBBIGNhbGxiYWNrIHRoYXQgdGFrZXMgdGhlIG9sZCB2YWx1ZSBhbmQgcmV0dXJucyBhIG5ldyB2YWx1ZS5cbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiB1cGRhdGUoa2V5LCB1cGRhdGVyLCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IFxuICAgIC8vIE5lZWQgdG8gY3JlYXRlIHRoZSBwcm9taXNlIG1hbnVhbGx5LlxuICAgIC8vIElmIEkgdHJ5IHRvIGNoYWluIHByb21pc2VzLCB0aGUgdHJhbnNhY3Rpb24gY2xvc2VzIGluIGJyb3dzZXJzXG4gICAgLy8gdGhhdCB1c2UgYSBwcm9taXNlIHBvbHlmaWxsIChJRTEwLzExKS5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHN0b3JlLmdldChrZXkpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHV0KHVwZGF0ZXIodGhpcy5yZXN1bHQpLCBrZXkpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocHJvbWlzaWZ5UmVxdWVzdChzdG9yZS50cmFuc2FjdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pKTtcbn1cbi8qKlxuICogRGVsZXRlIGEgcGFydGljdWxhciBrZXkgZnJvbSB0aGUgc3RvcmUuXG4gKlxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIGN1c3RvbVN0b3JlIE1ldGhvZCB0byBnZXQgYSBjdXN0b20gc3RvcmUuIFVzZSB3aXRoIGNhdXRpb24gKHNlZSB0aGUgZG9jcykuXG4gKi9cbmZ1bmN0aW9uIGRlbChrZXksIGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWR3cml0ZScsIChzdG9yZSkgPT4ge1xuICAgICAgICBzdG9yZS5kZWxldGUoa2V5KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUudHJhbnNhY3Rpb24pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBEZWxldGUgbXVsdGlwbGUga2V5cyBhdCBvbmNlLlxuICpcbiAqIEBwYXJhbSBrZXlzIExpc3Qgb2Yga2V5cyB0byBkZWxldGUuXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gZGVsTWFueShrZXlzLCBjdXN0b21TdG9yZSA9IGRlZmF1bHRHZXRTdG9yZSgpKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHN0b3JlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUudHJhbnNhY3Rpb24pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDbGVhciBhbGwgdmFsdWVzIGluIHRoZSBzdG9yZS5cbiAqXG4gKiBAcGFyYW0gY3VzdG9tU3RvcmUgTWV0aG9kIHRvIGdldCBhIGN1c3RvbSBzdG9yZS4gVXNlIHdpdGggY2F1dGlvbiAoc2VlIHRoZSBkb2NzKS5cbiAqL1xuZnVuY3Rpb24gY2xlYXIoY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICAgIHN0b3JlLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLnRyYW5zYWN0aW9uKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGVhY2hDdXJzb3Ioc3RvcmUsIGNhbGxiYWNrKSB7XG4gICAgc3RvcmUub3BlbkN1cnNvcigpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlc3VsdClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FsbGJhY2sodGhpcy5yZXN1bHQpO1xuICAgICAgICB0aGlzLnJlc3VsdC5jb250aW51ZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUudHJhbnNhY3Rpb24pO1xufVxuLyoqXG4gKiBHZXQgYWxsIGtleXMgaW4gdGhlIHN0b3JlLlxuICpcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBrZXlzKGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWRvbmx5JywgKHN0b3JlKSA9PiB7XG4gICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGlmIChzdG9yZS5nZXRBbGxLZXlzKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdChzdG9yZS5nZXRBbGxLZXlzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICAgIHJldHVybiBlYWNoQ3Vyc29yKHN0b3JlLCAoY3Vyc29yKSA9PiBpdGVtcy5wdXNoKGN1cnNvci5rZXkpKS50aGVuKCgpID0+IGl0ZW1zKTtcbiAgICB9KTtcbn1cbi8qKlxuICogR2V0IGFsbCB2YWx1ZXMgaW4gdGhlIHN0b3JlLlxuICpcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiB2YWx1ZXMoY3VzdG9tU3RvcmUgPSBkZWZhdWx0R2V0U3RvcmUoKSkge1xuICAgIHJldHVybiBjdXN0b21TdG9yZSgncmVhZG9ubHknLCAoc3RvcmUpID0+IHtcbiAgICAgICAgLy8gRmFzdCBwYXRoIGZvciBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgaWYgKHN0b3JlLmdldEFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUuZ2V0QWxsKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICAgIHJldHVybiBlYWNoQ3Vyc29yKHN0b3JlLCAoY3Vyc29yKSA9PiBpdGVtcy5wdXNoKGN1cnNvci52YWx1ZSkpLnRoZW4oKCkgPT4gaXRlbXMpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBHZXQgYWxsIGVudHJpZXMgaW4gdGhlIHN0b3JlLiBFYWNoIGVudHJ5IGlzIGFuIGFycmF5IG9mIGBba2V5LCB2YWx1ZV1gLlxuICpcbiAqIEBwYXJhbSBjdXN0b21TdG9yZSBNZXRob2QgdG8gZ2V0IGEgY3VzdG9tIHN0b3JlLiBVc2Ugd2l0aCBjYXV0aW9uIChzZWUgdGhlIGRvY3MpLlxuICovXG5mdW5jdGlvbiBlbnRyaWVzKGN1c3RvbVN0b3JlID0gZGVmYXVsdEdldFN0b3JlKCkpIHtcbiAgICByZXR1cm4gY3VzdG9tU3RvcmUoJ3JlYWRvbmx5JywgKHN0b3JlKSA9PiB7XG4gICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIC8vIChhbHRob3VnaCwgaG9wZWZ1bGx5IHdlJ2xsIGdldCBhIHNpbXBsZXIgcGF0aCBzb21lIGRheSlcbiAgICAgICAgaWYgKHN0b3JlLmdldEFsbCAmJiBzdG9yZS5nZXRBbGxLZXlzKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHByb21pc2lmeVJlcXVlc3Qoc3RvcmUuZ2V0QWxsS2V5cygpKSxcbiAgICAgICAgICAgICAgICBwcm9taXNpZnlSZXF1ZXN0KHN0b3JlLmdldEFsbCgpKSxcbiAgICAgICAgICAgIF0pLnRoZW4oKFtrZXlzLCB2YWx1ZXNdKSA9PiBrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCB2YWx1ZXNbaV1dKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgICAgcmV0dXJuIGN1c3RvbVN0b3JlKCdyZWFkb25seScsIChzdG9yZSkgPT4gZWFjaEN1cnNvcihzdG9yZSwgKGN1cnNvcikgPT4gaXRlbXMucHVzaChbY3Vyc29yLmtleSwgY3Vyc29yLnZhbHVlXSkpLnRoZW4oKCkgPT4gaXRlbXMpKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IHsgY2xlYXIsIGNyZWF0ZVN0b3JlLCBkZWwsIGRlbE1hbnksIGVudHJpZXMsIGdldCwgZ2V0TWFueSwga2V5cywgcHJvbWlzaWZ5UmVxdWVzdCwgc2V0LCBzZXRNYW55LCB1cGRhdGUsIHZhbHVlcyB9O1xuIiwiLy8gc3JjL3V0aWxzL2Vudi50c1xudmFyIE5PVEhJTkcgPSBTeW1ib2wuZm9yKFwiaW1tZXItbm90aGluZ1wiKTtcbnZhciBEUkFGVEFCTEUgPSBTeW1ib2wuZm9yKFwiaW1tZXItZHJhZnRhYmxlXCIpO1xudmFyIERSQUZUX1NUQVRFID0gU3ltYm9sLmZvcihcImltbWVyLXN0YXRlXCIpO1xuXG4vLyBzcmMvdXRpbHMvZXJyb3JzLnRzXG52YXIgZXJyb3JzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gW1xuICAvLyBBbGwgZXJyb3IgY29kZXMsIHN0YXJ0aW5nIGJ5IDA6XG4gIGZ1bmN0aW9uKHBsdWdpbikge1xuICAgIHJldHVybiBgVGhlIHBsdWdpbiBmb3IgJyR7cGx1Z2lufScgaGFzIG5vdCBiZWVuIGxvYWRlZCBpbnRvIEltbWVyLiBUbyBlbmFibGUgdGhlIHBsdWdpbiwgaW1wb3J0IGFuZCBjYWxsIFxcYGVuYWJsZSR7cGx1Z2lufSgpXFxgIHdoZW4gaW5pdGlhbGl6aW5nIHlvdXIgYXBwbGljYXRpb24uYDtcbiAgfSxcbiAgZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gYHByb2R1Y2UgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHRoaW5ncyB0aGF0IGFyZSBkcmFmdGFibGU6IHBsYWluIG9iamVjdHMsIGFycmF5cywgTWFwLCBTZXQgb3IgY2xhc3NlcyB0aGF0IGFyZSBtYXJrZWQgd2l0aCAnW2ltbWVyYWJsZV06IHRydWUnLiBHb3QgJyR7dGhpbmd9J2A7XG4gIH0sXG4gIFwiVGhpcyBvYmplY3QgaGFzIGJlZW4gZnJvemVuIGFuZCBzaG91bGQgbm90IGJlIG11dGF0ZWRcIixcbiAgZnVuY3Rpb24oZGF0YSkge1xuICAgIHJldHVybiBcIkNhbm5vdCB1c2UgYSBwcm94eSB0aGF0IGhhcyBiZWVuIHJldm9rZWQuIERpZCB5b3UgcGFzcyBhbiBvYmplY3QgZnJvbSBpbnNpZGUgYW4gaW1tZXIgZnVuY3Rpb24gdG8gYW4gYXN5bmMgcHJvY2Vzcz8gXCIgKyBkYXRhO1xuICB9LFxuICBcIkFuIGltbWVyIHByb2R1Y2VyIHJldHVybmVkIGEgbmV3IHZhbHVlICphbmQqIG1vZGlmaWVkIGl0cyBkcmFmdC4gRWl0aGVyIHJldHVybiBhIG5ldyB2YWx1ZSAqb3IqIG1vZGlmeSB0aGUgZHJhZnQuXCIsXG4gIFwiSW1tZXIgZm9yYmlkcyBjaXJjdWxhciByZWZlcmVuY2VzXCIsXG4gIFwiVGhlIGZpcnN0IG9yIHNlY29uZCBhcmd1bWVudCB0byBgcHJvZHVjZWAgbXVzdCBiZSBhIGZ1bmN0aW9uXCIsXG4gIFwiVGhlIHRoaXJkIGFyZ3VtZW50IHRvIGBwcm9kdWNlYCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgdW5kZWZpbmVkXCIsXG4gIFwiRmlyc3QgYXJndW1lbnQgdG8gYGNyZWF0ZURyYWZ0YCBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LCBhbiBhcnJheSwgb3IgYW4gaW1tZXJhYmxlIG9iamVjdFwiLFxuICBcIkZpcnN0IGFyZ3VtZW50IHRvIGBmaW5pc2hEcmFmdGAgbXVzdCBiZSBhIGRyYWZ0IHJldHVybmVkIGJ5IGBjcmVhdGVEcmFmdGBcIixcbiAgZnVuY3Rpb24odGhpbmcpIHtcbiAgICByZXR1cm4gYCdjdXJyZW50JyBleHBlY3RzIGEgZHJhZnQsIGdvdDogJHt0aGluZ31gO1xuICB9LFxuICBcIk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpIGNhbm5vdCBiZSB1c2VkIG9uIGFuIEltbWVyIGRyYWZ0XCIsXG4gIFwiT2JqZWN0LnNldFByb3RvdHlwZU9mKCkgY2Fubm90IGJlIHVzZWQgb24gYW4gSW1tZXIgZHJhZnRcIixcbiAgXCJJbW1lciBvbmx5IHN1cHBvcnRzIGRlbGV0aW5nIGFycmF5IGluZGljZXNcIixcbiAgXCJJbW1lciBvbmx5IHN1cHBvcnRzIHNldHRpbmcgYXJyYXkgaW5kaWNlcyBhbmQgdGhlICdsZW5ndGgnIHByb3BlcnR5XCIsXG4gIGZ1bmN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIGAnb3JpZ2luYWwnIGV4cGVjdHMgYSBkcmFmdCwgZ290OiAke3RoaW5nfWA7XG4gIH1cbiAgLy8gTm90ZTogaWYgbW9yZSBlcnJvcnMgYXJlIGFkZGVkLCB0aGUgZXJyb3JPZmZzZXQgaW4gUGF0Y2hlcy50cyBzaG91bGQgYmUgaW5jcmVhc2VkXG4gIC8vIFNlZSBQYXRjaGVzLnRzIGZvciBhZGRpdGlvbmFsIGVycm9yc1xuXSA6IFtdO1xuZnVuY3Rpb24gZGllKGVycm9yLCAuLi5hcmdzKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBjb25zdCBlID0gZXJyb3JzW2Vycm9yXTtcbiAgICBjb25zdCBtc2cgPSB0eXBlb2YgZSA9PT0gXCJmdW5jdGlvblwiID8gZS5hcHBseShudWxsLCBhcmdzKSA6IGU7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbSW1tZXJdICR7bXNnfWApO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgW0ltbWVyXSBtaW5pZmllZCBlcnJvciBucjogJHtlcnJvcn0uIEZ1bGwgZXJyb3IgYXQ6IGh0dHBzOi8vYml0Lmx5LzNjWEVLV2ZgXG4gICk7XG59XG5cbi8vIHNyYy91dGlscy9jb21tb24udHNcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbmZ1bmN0aW9uIGlzRHJhZnQodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgISF2YWx1ZVtEUkFGVF9TVEFURV07XG59XG5mdW5jdGlvbiBpc0RyYWZ0YWJsZSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKVxuICAgIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpIHx8ICEhdmFsdWVbRFJBRlRBQkxFXSB8fCAhIXZhbHVlLmNvbnN0cnVjdG9yPy5bRFJBRlRBQkxFXSB8fCBpc01hcCh2YWx1ZSkgfHwgaXNTZXQodmFsdWUpO1xufVxudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCk7XG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IEN0b3IgPSBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgXCJjb25zdHJ1Y3RvclwiKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgaWYgKEN0b3IgPT09IE9iamVjdClcbiAgICByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09IFwiZnVuY3Rpb25cIiAmJiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKEN0b3IpID09PSBvYmplY3RDdG9yU3RyaW5nO1xufVxuZnVuY3Rpb24gb3JpZ2luYWwodmFsdWUpIHtcbiAgaWYgKCFpc0RyYWZ0KHZhbHVlKSlcbiAgICBkaWUoMTUsIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlW0RSQUZUX1NUQVRFXS5iYXNlXztcbn1cbmZ1bmN0aW9uIGVhY2gob2JqLCBpdGVyKSB7XG4gIGlmIChnZXRBcmNodHlwZShvYmopID09PSAwIC8qIE9iamVjdCAqLykge1xuICAgIFJlZmxlY3Qub3duS2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaXRlcihrZXksIG9ialtrZXldLCBvYmopO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iai5mb3JFYWNoKChlbnRyeSwgaW5kZXgpID0+IGl0ZXIoaW5kZXgsIGVudHJ5LCBvYmopKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0QXJjaHR5cGUodGhpbmcpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGluZ1tEUkFGVF9TVEFURV07XG4gIHJldHVybiBzdGF0ZSA/IHN0YXRlLnR5cGVfIDogQXJyYXkuaXNBcnJheSh0aGluZykgPyAxIC8qIEFycmF5ICovIDogaXNNYXAodGhpbmcpID8gMiAvKiBNYXAgKi8gOiBpc1NldCh0aGluZykgPyAzIC8qIFNldCAqLyA6IDAgLyogT2JqZWN0ICovO1xufVxuZnVuY3Rpb24gaGFzKHRoaW5nLCBwcm9wKSB7XG4gIHJldHVybiBnZXRBcmNodHlwZSh0aGluZykgPT09IDIgLyogTWFwICovID8gdGhpbmcuaGFzKHByb3ApIDogT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaW5nLCBwcm9wKTtcbn1cbmZ1bmN0aW9uIGdldCh0aGluZywgcHJvcCkge1xuICByZXR1cm4gZ2V0QXJjaHR5cGUodGhpbmcpID09PSAyIC8qIE1hcCAqLyA/IHRoaW5nLmdldChwcm9wKSA6IHRoaW5nW3Byb3BdO1xufVxuZnVuY3Rpb24gc2V0KHRoaW5nLCBwcm9wT3JPbGRWYWx1ZSwgdmFsdWUpIHtcbiAgY29uc3QgdCA9IGdldEFyY2h0eXBlKHRoaW5nKTtcbiAgaWYgKHQgPT09IDIgLyogTWFwICovKVxuICAgIHRoaW5nLnNldChwcm9wT3JPbGRWYWx1ZSwgdmFsdWUpO1xuICBlbHNlIGlmICh0ID09PSAzIC8qIFNldCAqLykge1xuICAgIHRoaW5nLmFkZCh2YWx1ZSk7XG4gIH0gZWxzZVxuICAgIHRoaW5nW3Byb3BPck9sZFZhbHVlXSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gaXMoeCwgeSkge1xuICBpZiAoeCA9PT0geSkge1xuICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG5mdW5jdGlvbiBpc01hcCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIE1hcDtcbn1cbmZ1bmN0aW9uIGlzU2V0KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgU2V0O1xufVxuZnVuY3Rpb24gbGF0ZXN0KHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5jb3B5XyB8fCBzdGF0ZS5iYXNlXztcbn1cbmZ1bmN0aW9uIHNoYWxsb3dDb3B5KGJhc2UsIHN0cmljdCkge1xuICBpZiAoaXNNYXAoYmFzZSkpIHtcbiAgICByZXR1cm4gbmV3IE1hcChiYXNlKTtcbiAgfVxuICBpZiAoaXNTZXQoYmFzZSkpIHtcbiAgICByZXR1cm4gbmV3IFNldChiYXNlKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShiYXNlKSlcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYmFzZSk7XG4gIGNvbnN0IGlzUGxhaW4gPSBpc1BsYWluT2JqZWN0KGJhc2UpO1xuICBpZiAoc3RyaWN0ID09PSB0cnVlIHx8IHN0cmljdCA9PT0gXCJjbGFzc19vbmx5XCIgJiYgIWlzUGxhaW4pIHtcbiAgICBjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGJhc2UpO1xuICAgIGRlbGV0ZSBkZXNjcmlwdG9yc1tEUkFGVF9TVEFURV07XG4gICAgbGV0IGtleXMgPSBSZWZsZWN0Lm93bktleXMoZGVzY3JpcHRvcnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGNvbnN0IGRlc2MgPSBkZXNjcmlwdG9yc1trZXldO1xuICAgICAgaWYgKGRlc2Mud3JpdGFibGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGRlc2Mud3JpdGFibGUgPSB0cnVlO1xuICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpXG4gICAgICAgIGRlc2NyaXB0b3JzW2tleV0gPSB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIC8vIGNvdWxkIGxpdmUgd2l0aCAhIWRlc2Muc2V0IGFzIHdlbGwgaGVyZS4uLlxuICAgICAgICAgIGVudW1lcmFibGU6IGRlc2MuZW51bWVyYWJsZSxcbiAgICAgICAgICB2YWx1ZTogYmFzZVtrZXldXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKGdldFByb3RvdHlwZU9mKGJhc2UpLCBkZXNjcmlwdG9ycyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihiYXNlKTtcbiAgICBpZiAocHJvdG8gIT09IG51bGwgJiYgaXNQbGFpbikge1xuICAgICAgcmV0dXJuIHsgLi4uYmFzZSB9O1xuICAgIH1cbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihvYmosIGJhc2UpO1xuICB9XG59XG5mdW5jdGlvbiBmcmVlemUob2JqLCBkZWVwID0gZmFsc2UpIHtcbiAgaWYgKGlzRnJvemVuKG9iaikgfHwgaXNEcmFmdChvYmopIHx8ICFpc0RyYWZ0YWJsZShvYmopKVxuICAgIHJldHVybiBvYmo7XG4gIGlmIChnZXRBcmNodHlwZShvYmopID4gMSkge1xuICAgIG9iai5zZXQgPSBvYmouYWRkID0gb2JqLmNsZWFyID0gb2JqLmRlbGV0ZSA9IGRvbnRNdXRhdGVGcm96ZW5Db2xsZWN0aW9ucztcbiAgfVxuICBPYmplY3QuZnJlZXplKG9iaik7XG4gIGlmIChkZWVwKVxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiBmcmVlemUodmFsdWUsIHRydWUpKTtcbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIGRvbnRNdXRhdGVGcm96ZW5Db2xsZWN0aW9ucygpIHtcbiAgZGllKDIpO1xufVxuZnVuY3Rpb24gaXNGcm96ZW4ob2JqKSB7XG4gIHJldHVybiBPYmplY3QuaXNGcm96ZW4ob2JqKTtcbn1cblxuLy8gc3JjL3V0aWxzL3BsdWdpbnMudHNcbnZhciBwbHVnaW5zID0ge307XG5mdW5jdGlvbiBnZXRQbHVnaW4ocGx1Z2luS2V5KSB7XG4gIGNvbnN0IHBsdWdpbiA9IHBsdWdpbnNbcGx1Z2luS2V5XTtcbiAgaWYgKCFwbHVnaW4pIHtcbiAgICBkaWUoMCwgcGx1Z2luS2V5KTtcbiAgfVxuICByZXR1cm4gcGx1Z2luO1xufVxuZnVuY3Rpb24gbG9hZFBsdWdpbihwbHVnaW5LZXksIGltcGxlbWVudGF0aW9uKSB7XG4gIGlmICghcGx1Z2luc1twbHVnaW5LZXldKVxuICAgIHBsdWdpbnNbcGx1Z2luS2V5XSA9IGltcGxlbWVudGF0aW9uO1xufVxuXG4vLyBzcmMvY29yZS9zY29wZS50c1xudmFyIGN1cnJlbnRTY29wZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRTY29wZSgpIHtcbiAgcmV0dXJuIGN1cnJlbnRTY29wZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNjb3BlKHBhcmVudF8sIGltbWVyXykge1xuICByZXR1cm4ge1xuICAgIGRyYWZ0c186IFtdLFxuICAgIHBhcmVudF8sXG4gICAgaW1tZXJfLFxuICAgIC8vIFdoZW5ldmVyIHRoZSBtb2RpZmllZCBkcmFmdCBjb250YWlucyBhIGRyYWZ0IGZyb20gYW5vdGhlciBzY29wZSwgd2VcbiAgICAvLyBuZWVkIHRvIHByZXZlbnQgYXV0by1mcmVlemluZyBzbyB0aGUgdW5vd25lZCBkcmFmdCBjYW4gYmUgZmluYWxpemVkLlxuICAgIGNhbkF1dG9GcmVlemVfOiB0cnVlLFxuICAgIHVuZmluYWxpemVkRHJhZnRzXzogMFxuICB9O1xufVxuZnVuY3Rpb24gdXNlUGF0Y2hlc0luU2NvcGUoc2NvcGUsIHBhdGNoTGlzdGVuZXIpIHtcbiAgaWYgKHBhdGNoTGlzdGVuZXIpIHtcbiAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpO1xuICAgIHNjb3BlLnBhdGNoZXNfID0gW107XG4gICAgc2NvcGUuaW52ZXJzZVBhdGNoZXNfID0gW107XG4gICAgc2NvcGUucGF0Y2hMaXN0ZW5lcl8gPSBwYXRjaExpc3RlbmVyO1xuICB9XG59XG5mdW5jdGlvbiByZXZva2VTY29wZShzY29wZSkge1xuICBsZWF2ZVNjb3BlKHNjb3BlKTtcbiAgc2NvcGUuZHJhZnRzXy5mb3JFYWNoKHJldm9rZURyYWZ0KTtcbiAgc2NvcGUuZHJhZnRzXyA9IG51bGw7XG59XG5mdW5jdGlvbiBsZWF2ZVNjb3BlKHNjb3BlKSB7XG4gIGlmIChzY29wZSA9PT0gY3VycmVudFNjb3BlKSB7XG4gICAgY3VycmVudFNjb3BlID0gc2NvcGUucGFyZW50XztcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJTY29wZShpbW1lcjIpIHtcbiAgcmV0dXJuIGN1cnJlbnRTY29wZSA9IGNyZWF0ZVNjb3BlKGN1cnJlbnRTY29wZSwgaW1tZXIyKTtcbn1cbmZ1bmN0aW9uIHJldm9rZURyYWZ0KGRyYWZ0KSB7XG4gIGNvbnN0IHN0YXRlID0gZHJhZnRbRFJBRlRfU1RBVEVdO1xuICBpZiAoc3RhdGUudHlwZV8gPT09IDAgLyogT2JqZWN0ICovIHx8IHN0YXRlLnR5cGVfID09PSAxIC8qIEFycmF5ICovKVxuICAgIHN0YXRlLnJldm9rZV8oKTtcbiAgZWxzZVxuICAgIHN0YXRlLnJldm9rZWRfID0gdHJ1ZTtcbn1cblxuLy8gc3JjL2NvcmUvZmluYWxpemUudHNcbmZ1bmN0aW9uIHByb2Nlc3NSZXN1bHQocmVzdWx0LCBzY29wZSkge1xuICBzY29wZS51bmZpbmFsaXplZERyYWZ0c18gPSBzY29wZS5kcmFmdHNfLmxlbmd0aDtcbiAgY29uc3QgYmFzZURyYWZ0ID0gc2NvcGUuZHJhZnRzX1swXTtcbiAgY29uc3QgaXNSZXBsYWNlZCA9IHJlc3VsdCAhPT0gdm9pZCAwICYmIHJlc3VsdCAhPT0gYmFzZURyYWZ0O1xuICBpZiAoaXNSZXBsYWNlZCkge1xuICAgIGlmIChiYXNlRHJhZnRbRFJBRlRfU1RBVEVdLm1vZGlmaWVkXykge1xuICAgICAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICAgICAgZGllKDQpO1xuICAgIH1cbiAgICBpZiAoaXNEcmFmdGFibGUocmVzdWx0KSkge1xuICAgICAgcmVzdWx0ID0gZmluYWxpemUoc2NvcGUsIHJlc3VsdCk7XG4gICAgICBpZiAoIXNjb3BlLnBhcmVudF8pXG4gICAgICAgIG1heWJlRnJlZXplKHNjb3BlLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAoc2NvcGUucGF0Y2hlc18pIHtcbiAgICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKFxuICAgICAgICBiYXNlRHJhZnRbRFJBRlRfU1RBVEVdLmJhc2VfLFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHNjb3BlLnBhdGNoZXNfLFxuICAgICAgICBzY29wZS5pbnZlcnNlUGF0Y2hlc19cbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IGZpbmFsaXplKHNjb3BlLCBiYXNlRHJhZnQsIFtdKTtcbiAgfVxuICByZXZva2VTY29wZShzY29wZSk7XG4gIGlmIChzY29wZS5wYXRjaGVzXykge1xuICAgIHNjb3BlLnBhdGNoTGlzdGVuZXJfKHNjb3BlLnBhdGNoZXNfLCBzY29wZS5pbnZlcnNlUGF0Y2hlc18pO1xuICB9XG4gIHJldHVybiByZXN1bHQgIT09IE5PVEhJTkcgPyByZXN1bHQgOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBmaW5hbGl6ZShyb290U2NvcGUsIHZhbHVlLCBwYXRoKSB7XG4gIGlmIChpc0Zyb3plbih2YWx1ZSkpXG4gICAgcmV0dXJuIHZhbHVlO1xuICBjb25zdCBzdGF0ZSA9IHZhbHVlW0RSQUZUX1NUQVRFXTtcbiAgaWYgKCFzdGF0ZSkge1xuICAgIGVhY2goXG4gICAgICB2YWx1ZSxcbiAgICAgIChrZXksIGNoaWxkVmFsdWUpID0+IGZpbmFsaXplUHJvcGVydHkocm9vdFNjb3BlLCBzdGF0ZSwgdmFsdWUsIGtleSwgY2hpbGRWYWx1ZSwgcGF0aClcbiAgICApO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoc3RhdGUuc2NvcGVfICE9PSByb290U2NvcGUpXG4gICAgcmV0dXJuIHZhbHVlO1xuICBpZiAoIXN0YXRlLm1vZGlmaWVkXykge1xuICAgIG1heWJlRnJlZXplKHJvb3RTY29wZSwgc3RhdGUuYmFzZV8sIHRydWUpO1xuICAgIHJldHVybiBzdGF0ZS5iYXNlXztcbiAgfVxuICBpZiAoIXN0YXRlLmZpbmFsaXplZF8pIHtcbiAgICBzdGF0ZS5maW5hbGl6ZWRfID0gdHJ1ZTtcbiAgICBzdGF0ZS5zY29wZV8udW5maW5hbGl6ZWREcmFmdHNfLS07XG4gICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuY29weV87XG4gICAgbGV0IHJlc3VsdEVhY2ggPSByZXN1bHQ7XG4gICAgbGV0IGlzU2V0MiA9IGZhbHNlO1xuICAgIGlmIChzdGF0ZS50eXBlXyA9PT0gMyAvKiBTZXQgKi8pIHtcbiAgICAgIHJlc3VsdEVhY2ggPSBuZXcgU2V0KHJlc3VsdCk7XG4gICAgICByZXN1bHQuY2xlYXIoKTtcbiAgICAgIGlzU2V0MiA9IHRydWU7XG4gICAgfVxuICAgIGVhY2goXG4gICAgICByZXN1bHRFYWNoLFxuICAgICAgKGtleSwgY2hpbGRWYWx1ZSkgPT4gZmluYWxpemVQcm9wZXJ0eShyb290U2NvcGUsIHN0YXRlLCByZXN1bHQsIGtleSwgY2hpbGRWYWx1ZSwgcGF0aCwgaXNTZXQyKVxuICAgICk7XG4gICAgbWF5YmVGcmVlemUocm9vdFNjb3BlLCByZXN1bHQsIGZhbHNlKTtcbiAgICBpZiAocGF0aCAmJiByb290U2NvcGUucGF0Y2hlc18pIHtcbiAgICAgIGdldFBsdWdpbihcIlBhdGNoZXNcIikuZ2VuZXJhdGVQYXRjaGVzXyhcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHJvb3RTY29wZS5wYXRjaGVzXyxcbiAgICAgICAgcm9vdFNjb3BlLmludmVyc2VQYXRjaGVzX1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmNvcHlfO1xufVxuZnVuY3Rpb24gZmluYWxpemVQcm9wZXJ0eShyb290U2NvcGUsIHBhcmVudFN0YXRlLCB0YXJnZXRPYmplY3QsIHByb3AsIGNoaWxkVmFsdWUsIHJvb3RQYXRoLCB0YXJnZXRJc1NldCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmIGNoaWxkVmFsdWUgPT09IHRhcmdldE9iamVjdClcbiAgICBkaWUoNSk7XG4gIGlmIChpc0RyYWZ0KGNoaWxkVmFsdWUpKSB7XG4gICAgY29uc3QgcGF0aCA9IHJvb3RQYXRoICYmIHBhcmVudFN0YXRlICYmIHBhcmVudFN0YXRlLnR5cGVfICE9PSAzIC8qIFNldCAqLyAmJiAvLyBTZXQgb2JqZWN0cyBhcmUgYXRvbWljIHNpbmNlIHRoZXkgaGF2ZSBubyBrZXlzLlxuICAgICFoYXMocGFyZW50U3RhdGUuYXNzaWduZWRfLCBwcm9wKSA/IHJvb3RQYXRoLmNvbmNhdChwcm9wKSA6IHZvaWQgMDtcbiAgICBjb25zdCByZXMgPSBmaW5hbGl6ZShyb290U2NvcGUsIGNoaWxkVmFsdWUsIHBhdGgpO1xuICAgIHNldCh0YXJnZXRPYmplY3QsIHByb3AsIHJlcyk7XG4gICAgaWYgKGlzRHJhZnQocmVzKSkge1xuICAgICAgcm9vdFNjb3BlLmNhbkF1dG9GcmVlemVfID0gZmFsc2U7XG4gICAgfSBlbHNlXG4gICAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAodGFyZ2V0SXNTZXQpIHtcbiAgICB0YXJnZXRPYmplY3QuYWRkKGNoaWxkVmFsdWUpO1xuICB9XG4gIGlmIChpc0RyYWZ0YWJsZShjaGlsZFZhbHVlKSAmJiAhaXNGcm96ZW4oY2hpbGRWYWx1ZSkpIHtcbiAgICBpZiAoIXJvb3RTY29wZS5pbW1lcl8uYXV0b0ZyZWV6ZV8gJiYgcm9vdFNjb3BlLnVuZmluYWxpemVkRHJhZnRzXyA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZmluYWxpemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlKTtcbiAgICBpZiAoKCFwYXJlbnRTdGF0ZSB8fCAhcGFyZW50U3RhdGUuc2NvcGVfLnBhcmVudF8pICYmIHR5cGVvZiBwcm9wICE9PSBcInN5bWJvbFwiICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0YXJnZXRPYmplY3QsIHByb3ApKVxuICAgICAgbWF5YmVGcmVlemUocm9vdFNjb3BlLCBjaGlsZFZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gbWF5YmVGcmVlemUoc2NvcGUsIHZhbHVlLCBkZWVwID0gZmFsc2UpIHtcbiAgaWYgKCFzY29wZS5wYXJlbnRfICYmIHNjb3BlLmltbWVyXy5hdXRvRnJlZXplXyAmJiBzY29wZS5jYW5BdXRvRnJlZXplXykge1xuICAgIGZyZWV6ZSh2YWx1ZSwgZGVlcCk7XG4gIH1cbn1cblxuLy8gc3JjL2NvcmUvcHJveHkudHNcbmZ1bmN0aW9uIGNyZWF0ZVByb3h5UHJveHkoYmFzZSwgcGFyZW50KSB7XG4gIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGJhc2UpO1xuICBjb25zdCBzdGF0ZSA9IHtcbiAgICB0eXBlXzogaXNBcnJheSA/IDEgLyogQXJyYXkgKi8gOiAwIC8qIE9iamVjdCAqLyxcbiAgICAvLyBUcmFjayB3aGljaCBwcm9kdWNlIGNhbGwgdGhpcyBpcyBhc3NvY2lhdGVkIHdpdGguXG4gICAgc2NvcGVfOiBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCksXG4gICAgLy8gVHJ1ZSBmb3IgYm90aCBzaGFsbG93IGFuZCBkZWVwIGNoYW5nZXMuXG4gICAgbW9kaWZpZWRfOiBmYWxzZSxcbiAgICAvLyBVc2VkIGR1cmluZyBmaW5hbGl6YXRpb24uXG4gICAgZmluYWxpemVkXzogZmFsc2UsXG4gICAgLy8gVHJhY2sgd2hpY2ggcHJvcGVydGllcyBoYXZlIGJlZW4gYXNzaWduZWQgKHRydWUpIG9yIGRlbGV0ZWQgKGZhbHNlKS5cbiAgICBhc3NpZ25lZF86IHt9LFxuICAgIC8vIFRoZSBwYXJlbnQgZHJhZnQgc3RhdGUuXG4gICAgcGFyZW50XzogcGFyZW50LFxuICAgIC8vIFRoZSBiYXNlIHN0YXRlLlxuICAgIGJhc2VfOiBiYXNlLFxuICAgIC8vIFRoZSBiYXNlIHByb3h5LlxuICAgIGRyYWZ0XzogbnVsbCxcbiAgICAvLyBzZXQgYmVsb3dcbiAgICAvLyBUaGUgYmFzZSBjb3B5IHdpdGggYW55IHVwZGF0ZWQgdmFsdWVzLlxuICAgIGNvcHlfOiBudWxsLFxuICAgIC8vIENhbGxlZCBieSB0aGUgYHByb2R1Y2VgIGZ1bmN0aW9uLlxuICAgIHJldm9rZV86IG51bGwsXG4gICAgaXNNYW51YWxfOiBmYWxzZVxuICB9O1xuICBsZXQgdGFyZ2V0ID0gc3RhdGU7XG4gIGxldCB0cmFwcyA9IG9iamVjdFRyYXBzO1xuICBpZiAoaXNBcnJheSkge1xuICAgIHRhcmdldCA9IFtzdGF0ZV07XG4gICAgdHJhcHMgPSBhcnJheVRyYXBzO1xuICB9XG4gIGNvbnN0IHsgcmV2b2tlLCBwcm94eSB9ID0gUHJveHkucmV2b2NhYmxlKHRhcmdldCwgdHJhcHMpO1xuICBzdGF0ZS5kcmFmdF8gPSBwcm94eTtcbiAgc3RhdGUucmV2b2tlXyA9IHJldm9rZTtcbiAgcmV0dXJuIHByb3h5O1xufVxudmFyIG9iamVjdFRyYXBzID0ge1xuICBnZXQoc3RhdGUsIHByb3ApIHtcbiAgICBpZiAocHJvcCA9PT0gRFJBRlRfU1RBVEUpXG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgY29uc3Qgc291cmNlID0gbGF0ZXN0KHN0YXRlKTtcbiAgICBpZiAoIWhhcyhzb3VyY2UsIHByb3ApKSB7XG4gICAgICByZXR1cm4gcmVhZFByb3BGcm9tUHJvdG8oc3RhdGUsIHNvdXJjZSwgcHJvcCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gc291cmNlW3Byb3BdO1xuICAgIGlmIChzdGF0ZS5maW5hbGl6ZWRfIHx8ICFpc0RyYWZ0YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBwZWVrKHN0YXRlLmJhc2VfLCBwcm9wKSkge1xuICAgICAgcHJlcGFyZUNvcHkoc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlLmNvcHlfW3Byb3BdID0gY3JlYXRlUHJveHkodmFsdWUsIHN0YXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICBoYXMoc3RhdGUsIHByb3ApIHtcbiAgICByZXR1cm4gcHJvcCBpbiBsYXRlc3Qoc3RhdGUpO1xuICB9LFxuICBvd25LZXlzKHN0YXRlKSB7XG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhsYXRlc3Qoc3RhdGUpKTtcbiAgfSxcbiAgc2V0KHN0YXRlLCBwcm9wLCB2YWx1ZSkge1xuICAgIGNvbnN0IGRlc2MgPSBnZXREZXNjcmlwdG9yRnJvbVByb3RvKGxhdGVzdChzdGF0ZSksIHByb3ApO1xuICAgIGlmIChkZXNjPy5zZXQpIHtcbiAgICAgIGRlc2Muc2V0LmNhbGwoc3RhdGUuZHJhZnRfLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQyID0gcGVlayhsYXRlc3Qoc3RhdGUpLCBwcm9wKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnQyPy5bRFJBRlRfU1RBVEVdO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAmJiBjdXJyZW50U3RhdGUuYmFzZV8gPT09IHZhbHVlKSB7XG4gICAgICAgIHN0YXRlLmNvcHlfW3Byb3BdID0gdmFsdWU7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkX1twcm9wXSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpcyh2YWx1ZSwgY3VycmVudDIpICYmICh2YWx1ZSAhPT0gdm9pZCAwIHx8IGhhcyhzdGF0ZS5iYXNlXywgcHJvcCkpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIHByZXBhcmVDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcHlfW3Byb3BdID09PSB2YWx1ZSAmJiAvLyBzcGVjaWFsIGNhc2U6IGhhbmRsZSBuZXcgcHJvcHMgd2l0aCB2YWx1ZSAndW5kZWZpbmVkJ1xuICAgICh2YWx1ZSAhPT0gdm9pZCAwIHx8IHByb3AgaW4gc3RhdGUuY29weV8pIHx8IC8vIHNwZWNpYWwgY2FzZTogTmFOXG4gICAgTnVtYmVyLmlzTmFOKHZhbHVlKSAmJiBOdW1iZXIuaXNOYU4oc3RhdGUuY29weV9bcHJvcF0pKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgc3RhdGUuY29weV9bcHJvcF0gPSB2YWx1ZTtcbiAgICBzdGF0ZS5hc3NpZ25lZF9bcHJvcF0gPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eShzdGF0ZSwgcHJvcCkge1xuICAgIGlmIChwZWVrKHN0YXRlLmJhc2VfLCBwcm9wKSAhPT0gdm9pZCAwIHx8IHByb3AgaW4gc3RhdGUuYmFzZV8pIHtcbiAgICAgIHN0YXRlLmFzc2lnbmVkX1twcm9wXSA9IGZhbHNlO1xuICAgICAgcHJlcGFyZUNvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgc3RhdGUuYXNzaWduZWRfW3Byb3BdO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY29weV8pIHtcbiAgICAgIGRlbGV0ZSBzdGF0ZS5jb3B5X1twcm9wXTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIC8vIE5vdGU6IFdlIG5ldmVyIGNvZXJjZSBgZGVzYy52YWx1ZWAgaW50byBhbiBJbW1lciBkcmFmdCwgYmVjYXVzZSB3ZSBjYW4ndCBtYWtlXG4gIC8vIHRoZSBzYW1lIGd1YXJhbnRlZSBpbiBFUzUgbW9kZS5cbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHN0YXRlLCBwcm9wKSB7XG4gICAgY29uc3Qgb3duZXIgPSBsYXRlc3Qoc3RhdGUpO1xuICAgIGNvbnN0IGRlc2MgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvd25lciwgcHJvcCk7XG4gICAgaWYgKCFkZXNjKVxuICAgICAgcmV0dXJuIGRlc2M7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBzdGF0ZS50eXBlXyAhPT0gMSAvKiBBcnJheSAqLyB8fCBwcm9wICE9PSBcImxlbmd0aFwiLFxuICAgICAgZW51bWVyYWJsZTogZGVzYy5lbnVtZXJhYmxlLFxuICAgICAgdmFsdWU6IG93bmVyW3Byb3BdXG4gICAgfTtcbiAgfSxcbiAgZGVmaW5lUHJvcGVydHkoKSB7XG4gICAgZGllKDExKTtcbiAgfSxcbiAgZ2V0UHJvdG90eXBlT2Yoc3RhdGUpIHtcbiAgICByZXR1cm4gZ2V0UHJvdG90eXBlT2Yoc3RhdGUuYmFzZV8pO1xuICB9LFxuICBzZXRQcm90b3R5cGVPZigpIHtcbiAgICBkaWUoMTIpO1xuICB9XG59O1xudmFyIGFycmF5VHJhcHMgPSB7fTtcbmVhY2gob2JqZWN0VHJhcHMsIChrZXksIGZuKSA9PiB7XG4gIGFycmF5VHJhcHNba2V5XSA9IGZ1bmN0aW9uKCkge1xuICAgIGFyZ3VtZW50c1swXSA9IGFyZ3VtZW50c1swXVswXTtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn0pO1xuYXJyYXlUcmFwcy5kZWxldGVQcm9wZXJ0eSA9IGZ1bmN0aW9uKHN0YXRlLCBwcm9wKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgaXNOYU4ocGFyc2VJbnQocHJvcCkpKVxuICAgIGRpZSgxMyk7XG4gIHJldHVybiBhcnJheVRyYXBzLnNldC5jYWxsKHRoaXMsIHN0YXRlLCBwcm9wLCB2b2lkIDApO1xufTtcbmFycmF5VHJhcHMuc2V0ID0gZnVuY3Rpb24oc3RhdGUsIHByb3AsIHZhbHVlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgcHJvcCAhPT0gXCJsZW5ndGhcIiAmJiBpc05hTihwYXJzZUludChwcm9wKSkpXG4gICAgZGllKDE0KTtcbiAgcmV0dXJuIG9iamVjdFRyYXBzLnNldC5jYWxsKHRoaXMsIHN0YXRlWzBdLCBwcm9wLCB2YWx1ZSwgc3RhdGVbMF0pO1xufTtcbmZ1bmN0aW9uIHBlZWsoZHJhZnQsIHByb3ApIHtcbiAgY29uc3Qgc3RhdGUgPSBkcmFmdFtEUkFGVF9TVEFURV07XG4gIGNvbnN0IHNvdXJjZSA9IHN0YXRlID8gbGF0ZXN0KHN0YXRlKSA6IGRyYWZ0O1xuICByZXR1cm4gc291cmNlW3Byb3BdO1xufVxuZnVuY3Rpb24gcmVhZFByb3BGcm9tUHJvdG8oc3RhdGUsIHNvdXJjZSwgcHJvcCkge1xuICBjb25zdCBkZXNjID0gZ2V0RGVzY3JpcHRvckZyb21Qcm90byhzb3VyY2UsIHByb3ApO1xuICByZXR1cm4gZGVzYyA/IGB2YWx1ZWAgaW4gZGVzYyA/IGRlc2MudmFsdWUgOiAoXG4gICAgLy8gVGhpcyBpcyBhIHZlcnkgc3BlY2lhbCBjYXNlLCBpZiB0aGUgcHJvcCBpcyBhIGdldHRlciBkZWZpbmVkIGJ5IHRoZVxuICAgIC8vIHByb3RvdHlwZSwgd2Ugc2hvdWxkIGludm9rZSBpdCB3aXRoIHRoZSBkcmFmdCBhcyBjb250ZXh0IVxuICAgIGRlc2MuZ2V0Py5jYWxsKHN0YXRlLmRyYWZ0XylcbiAgKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGdldERlc2NyaXB0b3JGcm9tUHJvdG8oc291cmNlLCBwcm9wKSB7XG4gIGlmICghKHByb3AgaW4gc291cmNlKSlcbiAgICByZXR1cm4gdm9pZCAwO1xuICBsZXQgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihzb3VyY2UpO1xuICB3aGlsZSAocHJvdG8pIHtcbiAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgcHJvcCk7XG4gICAgaWYgKGRlc2MpXG4gICAgICByZXR1cm4gZGVzYztcbiAgICBwcm90byA9IGdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuZnVuY3Rpb24gbWFya0NoYW5nZWQoc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pIHtcbiAgICBzdGF0ZS5tb2RpZmllZF8gPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5wYXJlbnRfKSB7XG4gICAgICBtYXJrQ2hhbmdlZChzdGF0ZS5wYXJlbnRfKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVDb3B5KHN0YXRlKSB7XG4gIGlmICghc3RhdGUuY29weV8pIHtcbiAgICBzdGF0ZS5jb3B5XyA9IHNoYWxsb3dDb3B5KFxuICAgICAgc3RhdGUuYmFzZV8sXG4gICAgICBzdGF0ZS5zY29wZV8uaW1tZXJfLnVzZVN0cmljdFNoYWxsb3dDb3B5X1xuICAgICk7XG4gIH1cbn1cblxuLy8gc3JjL2NvcmUvaW1tZXJDbGFzcy50c1xudmFyIEltbWVyMiA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5hdXRvRnJlZXplXyA9IHRydWU7XG4gICAgdGhpcy51c2VTdHJpY3RTaGFsbG93Q29weV8gPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYHByb2R1Y2VgIGZ1bmN0aW9uIHRha2VzIGEgdmFsdWUgYW5kIGEgXCJyZWNpcGUgZnVuY3Rpb25cIiAod2hvc2VcbiAgICAgKiByZXR1cm4gdmFsdWUgb2Z0ZW4gZGVwZW5kcyBvbiB0aGUgYmFzZSBzdGF0ZSkuIFRoZSByZWNpcGUgZnVuY3Rpb24gaXNcbiAgICAgKiBmcmVlIHRvIG11dGF0ZSBpdHMgZmlyc3QgYXJndW1lbnQgaG93ZXZlciBpdCB3YW50cy4gQWxsIG11dGF0aW9ucyBhcmVcbiAgICAgKiBvbmx5IGV2ZXIgYXBwbGllZCB0byBhIF9fY29weV9fIG9mIHRoZSBiYXNlIHN0YXRlLlxuICAgICAqXG4gICAgICogUGFzcyBvbmx5IGEgZnVuY3Rpb24gdG8gY3JlYXRlIGEgXCJjdXJyaWVkIHByb2R1Y2VyXCIgd2hpY2ggcmVsaWV2ZXMgeW91XG4gICAgICogZnJvbSBwYXNzaW5nIHRoZSByZWNpcGUgZnVuY3Rpb24gZXZlcnkgdGltZS5cbiAgICAgKlxuICAgICAqIE9ubHkgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzIGFyZSBtYWRlIG11dGFibGUuIEFsbCBvdGhlciBvYmplY3RzIGFyZVxuICAgICAqIGNvbnNpZGVyZWQgdW5jb3B5YWJsZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgX19ib3VuZF9fIHRvIGl0cyBgSW1tZXJgIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHthbnl9IGJhc2UgLSB0aGUgaW5pdGlhbCBzdGF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlY2lwZSAtIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgYSBwcm94eSBvZiB0aGUgYmFzZSBzdGF0ZSBhcyBmaXJzdCBhcmd1bWVudCBhbmQgd2hpY2ggY2FuIGJlIGZyZWVseSBtb2RpZmllZFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhdGNoTGlzdGVuZXIgLSBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHRoZSBwYXRjaGVzIHByb2R1Y2VkIGhlcmVcbiAgICAgKiBAcmV0dXJucyB7YW55fSBhIG5ldyBzdGF0ZSwgb3IgdGhlIGluaXRpYWwgc3RhdGUgaWYgbm90aGluZyB3YXMgbW9kaWZpZWRcbiAgICAgKi9cbiAgICB0aGlzLnByb2R1Y2UgPSAoYmFzZSwgcmVjaXBlLCBwYXRjaExpc3RlbmVyKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGJhc2UgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgcmVjaXBlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdEJhc2UgPSByZWNpcGU7XG4gICAgICAgIHJlY2lwZSA9IGJhc2U7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gY3VycmllZFByb2R1Y2UoYmFzZTIgPSBkZWZhdWx0QmFzZSwgLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiBzZWxmLnByb2R1Y2UoYmFzZTIsIChkcmFmdCkgPT4gcmVjaXBlLmNhbGwodGhpcywgZHJhZnQsIC4uLmFyZ3MpKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcmVjaXBlICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGRpZSg2KTtcbiAgICAgIGlmIChwYXRjaExpc3RlbmVyICE9PSB2b2lkIDAgJiYgdHlwZW9mIHBhdGNoTGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZGllKDcpO1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIGlmIChpc0RyYWZ0YWJsZShiYXNlKSkge1xuICAgICAgICBjb25zdCBzY29wZSA9IGVudGVyU2NvcGUodGhpcyk7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gY3JlYXRlUHJveHkoYmFzZSwgdm9pZCAwKTtcbiAgICAgICAgbGV0IGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSByZWNpcGUocHJveHkpO1xuICAgICAgICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKGhhc0Vycm9yKVxuICAgICAgICAgICAgcmV2b2tlU2NvcGUoc2NvcGUpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxlYXZlU2NvcGUoc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHVzZVBhdGNoZXNJblNjb3BlKHNjb3BlLCBwYXRjaExpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXN1bHQocmVzdWx0LCBzY29wZSk7XG4gICAgICB9IGVsc2UgaWYgKCFiYXNlIHx8IHR5cGVvZiBiYXNlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlY2lwZShiYXNlKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKVxuICAgICAgICAgIHJlc3VsdCA9IGJhc2U7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IE5PVEhJTkcpXG4gICAgICAgICAgcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICBpZiAodGhpcy5hdXRvRnJlZXplXylcbiAgICAgICAgICBmcmVlemUocmVzdWx0LCB0cnVlKTtcbiAgICAgICAgaWYgKHBhdGNoTGlzdGVuZXIpIHtcbiAgICAgICAgICBjb25zdCBwID0gW107XG4gICAgICAgICAgY29uc3QgaXAgPSBbXTtcbiAgICAgICAgICBnZXRQbHVnaW4oXCJQYXRjaGVzXCIpLmdlbmVyYXRlUmVwbGFjZW1lbnRQYXRjaGVzXyhiYXNlLCByZXN1bHQsIHAsIGlwKTtcbiAgICAgICAgICBwYXRjaExpc3RlbmVyKHAsIGlwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlXG4gICAgICAgIGRpZSgxLCBiYXNlKTtcbiAgICB9O1xuICAgIHRoaXMucHJvZHVjZVdpdGhQYXRjaGVzID0gKGJhc2UsIHJlY2lwZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBiYXNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIChzdGF0ZSwgLi4uYXJncykgPT4gdGhpcy5wcm9kdWNlV2l0aFBhdGNoZXMoc3RhdGUsIChkcmFmdCkgPT4gYmFzZShkcmFmdCwgLi4uYXJncykpO1xuICAgICAgfVxuICAgICAgbGV0IHBhdGNoZXMsIGludmVyc2VQYXRjaGVzO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9kdWNlKGJhc2UsIHJlY2lwZSwgKHAsIGlwKSA9PiB7XG4gICAgICAgIHBhdGNoZXMgPSBwO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcyA9IGlwO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gW3Jlc3VsdCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXNdO1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiBjb25maWc/LmF1dG9GcmVlemUgPT09IFwiYm9vbGVhblwiKVxuICAgICAgdGhpcy5zZXRBdXRvRnJlZXplKGNvbmZpZy5hdXRvRnJlZXplKTtcbiAgICBpZiAodHlwZW9mIGNvbmZpZz8udXNlU3RyaWN0U2hhbGxvd0NvcHkgPT09IFwiYm9vbGVhblwiKVxuICAgICAgdGhpcy5zZXRVc2VTdHJpY3RTaGFsbG93Q29weShjb25maWcudXNlU3RyaWN0U2hhbGxvd0NvcHkpO1xuICB9XG4gIGNyZWF0ZURyYWZ0KGJhc2UpIHtcbiAgICBpZiAoIWlzRHJhZnRhYmxlKGJhc2UpKVxuICAgICAgZGllKDgpO1xuICAgIGlmIChpc0RyYWZ0KGJhc2UpKVxuICAgICAgYmFzZSA9IGN1cnJlbnQoYmFzZSk7XG4gICAgY29uc3Qgc2NvcGUgPSBlbnRlclNjb3BlKHRoaXMpO1xuICAgIGNvbnN0IHByb3h5ID0gY3JlYXRlUHJveHkoYmFzZSwgdm9pZCAwKTtcbiAgICBwcm94eVtEUkFGVF9TVEFURV0uaXNNYW51YWxfID0gdHJ1ZTtcbiAgICBsZWF2ZVNjb3BlKHNjb3BlKTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cbiAgZmluaXNoRHJhZnQoZHJhZnQsIHBhdGNoTGlzdGVuZXIpIHtcbiAgICBjb25zdCBzdGF0ZSA9IGRyYWZ0ICYmIGRyYWZ0W0RSQUZUX1NUQVRFXTtcbiAgICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5pc01hbnVhbF8pXG4gICAgICBkaWUoOSk7XG4gICAgY29uc3QgeyBzY29wZV86IHNjb3BlIH0gPSBzdGF0ZTtcbiAgICB1c2VQYXRjaGVzSW5TY29wZShzY29wZSwgcGF0Y2hMaXN0ZW5lcik7XG4gICAgcmV0dXJuIHByb2Nlc3NSZXN1bHQodm9pZCAwLCBzY29wZSk7XG4gIH1cbiAgLyoqXG4gICAqIFBhc3MgdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IGZyZWV6ZSBhbGwgY29waWVzIGNyZWF0ZWQgYnkgSW1tZXIuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGF1dG8tZnJlZXppbmcgaXMgZW5hYmxlZC5cbiAgICovXG4gIHNldEF1dG9GcmVlemUodmFsdWUpIHtcbiAgICB0aGlzLmF1dG9GcmVlemVfID0gdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFBhc3MgdHJ1ZSB0byBlbmFibGUgc3RyaWN0IHNoYWxsb3cgY29weS5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgaW1tZXIgZG9lcyBub3QgY29weSB0aGUgb2JqZWN0IGRlc2NyaXB0b3JzIHN1Y2ggYXMgZ2V0dGVyLCBzZXR0ZXIgYW5kIG5vbi1lbnVtcmFibGUgcHJvcGVydGllcy5cbiAgICovXG4gIHNldFVzZVN0cmljdFNoYWxsb3dDb3B5KHZhbHVlKSB7XG4gICAgdGhpcy51c2VTdHJpY3RTaGFsbG93Q29weV8gPSB2YWx1ZTtcbiAgfVxuICBhcHBseVBhdGNoZXMoYmFzZSwgcGF0Y2hlcykge1xuICAgIGxldCBpO1xuICAgIGZvciAoaSA9IHBhdGNoZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHBhdGNoID0gcGF0Y2hlc1tpXTtcbiAgICAgIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA9PT0gMCAmJiBwYXRjaC5vcCA9PT0gXCJyZXBsYWNlXCIpIHtcbiAgICAgICAgYmFzZSA9IHBhdGNoLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPiAtMSkge1xuICAgICAgcGF0Y2hlcyA9IHBhdGNoZXMuc2xpY2UoaSArIDEpO1xuICAgIH1cbiAgICBjb25zdCBhcHBseVBhdGNoZXNJbXBsID0gZ2V0UGx1Z2luKFwiUGF0Y2hlc1wiKS5hcHBseVBhdGNoZXNfO1xuICAgIGlmIChpc0RyYWZ0KGJhc2UpKSB7XG4gICAgICByZXR1cm4gYXBwbHlQYXRjaGVzSW1wbChiYXNlLCBwYXRjaGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJvZHVjZShcbiAgICAgIGJhc2UsXG4gICAgICAoZHJhZnQpID0+IGFwcGx5UGF0Y2hlc0ltcGwoZHJhZnQsIHBhdGNoZXMpXG4gICAgKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZVByb3h5KHZhbHVlLCBwYXJlbnQpIHtcbiAgY29uc3QgZHJhZnQgPSBpc01hcCh2YWx1ZSkgPyBnZXRQbHVnaW4oXCJNYXBTZXRcIikucHJveHlNYXBfKHZhbHVlLCBwYXJlbnQpIDogaXNTZXQodmFsdWUpID8gZ2V0UGx1Z2luKFwiTWFwU2V0XCIpLnByb3h5U2V0Xyh2YWx1ZSwgcGFyZW50KSA6IGNyZWF0ZVByb3h5UHJveHkodmFsdWUsIHBhcmVudCk7XG4gIGNvbnN0IHNjb3BlID0gcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpO1xuICBzY29wZS5kcmFmdHNfLnB1c2goZHJhZnQpO1xuICByZXR1cm4gZHJhZnQ7XG59XG5cbi8vIHNyYy9jb3JlL2N1cnJlbnQudHNcbmZ1bmN0aW9uIGN1cnJlbnQodmFsdWUpIHtcbiAgaWYgKCFpc0RyYWZ0KHZhbHVlKSlcbiAgICBkaWUoMTAsIHZhbHVlKTtcbiAgcmV0dXJuIGN1cnJlbnRJbXBsKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGN1cnJlbnRJbXBsKHZhbHVlKSB7XG4gIGlmICghaXNEcmFmdGFibGUodmFsdWUpIHx8IGlzRnJvemVuKHZhbHVlKSlcbiAgICByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IHN0YXRlID0gdmFsdWVbRFJBRlRfU1RBVEVdO1xuICBsZXQgY29weTtcbiAgaWYgKHN0YXRlKSB7XG4gICAgaWYgKCFzdGF0ZS5tb2RpZmllZF8pXG4gICAgICByZXR1cm4gc3RhdGUuYmFzZV87XG4gICAgc3RhdGUuZmluYWxpemVkXyA9IHRydWU7XG4gICAgY29weSA9IHNoYWxsb3dDb3B5KHZhbHVlLCBzdGF0ZS5zY29wZV8uaW1tZXJfLnVzZVN0cmljdFNoYWxsb3dDb3B5Xyk7XG4gIH0gZWxzZSB7XG4gICAgY29weSA9IHNoYWxsb3dDb3B5KHZhbHVlLCB0cnVlKTtcbiAgfVxuICBlYWNoKGNvcHksIChrZXksIGNoaWxkVmFsdWUpID0+IHtcbiAgICBzZXQoY29weSwga2V5LCBjdXJyZW50SW1wbChjaGlsZFZhbHVlKSk7XG4gIH0pO1xuICBpZiAoc3RhdGUpIHtcbiAgICBzdGF0ZS5maW5hbGl6ZWRfID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG5cbi8vIHNyYy9wbHVnaW5zL3BhdGNoZXMudHNcbmZ1bmN0aW9uIGVuYWJsZVBhdGNoZXMoKSB7XG4gIGNvbnN0IGVycm9yT2Zmc2V0ID0gMTY7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBlcnJvcnMucHVzaChcbiAgICAgICdTZXRzIGNhbm5vdCBoYXZlIFwicmVwbGFjZVwiIHBhdGNoZXMuJyxcbiAgICAgIGZ1bmN0aW9uKG9wKSB7XG4gICAgICAgIHJldHVybiBcIlVuc3VwcG9ydGVkIHBhdGNoIG9wZXJhdGlvbjogXCIgKyBvcDtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBcIkNhbm5vdCBhcHBseSBwYXRjaCwgcGF0aCBkb2Vzbid0IHJlc29sdmU6IFwiICsgcGF0aDtcbiAgICAgIH0sXG4gICAgICBcIlBhdGNoaW5nIHJlc2VydmVkIGF0dHJpYnV0ZXMgbGlrZSBfX3Byb3RvX18sIHByb3RvdHlwZSBhbmQgY29uc3RydWN0b3IgaXMgbm90IGFsbG93ZWRcIlxuICAgICk7XG4gIH1cbiAgY29uc3QgUkVQTEFDRSA9IFwicmVwbGFjZVwiO1xuICBjb25zdCBBREQgPSBcImFkZFwiO1xuICBjb25zdCBSRU1PVkUgPSBcInJlbW92ZVwiO1xuICBmdW5jdGlvbiBnZW5lcmF0ZVBhdGNoZXNfKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBzd2l0Y2ggKHN0YXRlLnR5cGVfKSB7XG4gICAgICBjYXNlIDAgLyogT2JqZWN0ICovOlxuICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlUGF0Y2hlc0Zyb21Bc3NpZ25lZChcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBiYXNlUGF0aCxcbiAgICAgICAgICBwYXRjaGVzLFxuICAgICAgICAgIGludmVyc2VQYXRjaGVzXG4gICAgICAgICk7XG4gICAgICBjYXNlIDEgLyogQXJyYXkgKi86XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZUFycmF5UGF0Y2hlcyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKTtcbiAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZVNldFBhdGNoZXMoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgYmFzZVBhdGgsXG4gICAgICAgICAgcGF0Y2hlcyxcbiAgICAgICAgICBpbnZlcnNlUGF0Y2hlc1xuICAgICAgICApO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZW5lcmF0ZUFycmF5UGF0Y2hlcyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgbGV0IHsgYmFzZV8sIGFzc2lnbmVkXyB9ID0gc3RhdGU7XG4gICAgbGV0IGNvcHlfID0gc3RhdGUuY29weV87XG4gICAgaWYgKGNvcHlfLmxlbmd0aCA8IGJhc2VfLmxlbmd0aCkge1xuICAgICAgO1xuICAgICAgW2Jhc2VfLCBjb3B5X10gPSBbY29weV8sIGJhc2VfXTtcbiAgICAgIFtwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlc10gPSBbaW52ZXJzZVBhdGNoZXMsIHBhdGNoZXNdO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhc2VfLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXNzaWduZWRfW2ldICYmIGNvcHlfW2ldICE9PSBiYXNlX1tpXSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICAvLyBOZWVkIHRvIG1heWJlIGNsb25lIGl0LCBhcyBpdCBjYW4gaW4gZmFjdCBiZSB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICAgICAgICAvLyBkdWUgdG8gdGhlIGJhc2UvY29weSBpbnZlcnNpb24gYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgICB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoY29weV9baV0pXG4gICAgICAgIH0pO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICBvcDogUkVQTEFDRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChiYXNlX1tpXSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBiYXNlXy5sZW5ndGg7IGkgPCBjb3B5Xy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChbaV0pO1xuICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgb3A6IEFERCxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgLy8gTmVlZCB0byBtYXliZSBjbG9uZSBpdCwgYXMgaXQgY2FuIGluIGZhY3QgYmUgdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgICAgIC8vIGR1ZSB0byB0aGUgYmFzZS9jb3B5IGludmVyc2lvbiBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvblxuICAgICAgICB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQoY29weV9baV0pXG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IGNvcHlfLmxlbmd0aCAtIDE7IGJhc2VfLmxlbmd0aCA8PSBpOyAtLWkpIHtcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aC5jb25jYXQoW2ldKTtcbiAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goe1xuICAgICAgICBvcDogUkVNT1ZFLFxuICAgICAgICBwYXRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVQYXRjaGVzRnJvbUFzc2lnbmVkKHN0YXRlLCBiYXNlUGF0aCwgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXMpIHtcbiAgICBjb25zdCB7IGJhc2VfLCBjb3B5XyB9ID0gc3RhdGU7XG4gICAgZWFjaChzdGF0ZS5hc3NpZ25lZF8sIChrZXksIGFzc2lnbmVkVmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdWYWx1ZSA9IGdldChiYXNlXywga2V5KTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0KGNvcHlfLCBrZXkpO1xuICAgICAgY29uc3Qgb3AgPSAhYXNzaWduZWRWYWx1ZSA/IFJFTU9WRSA6IGhhcyhiYXNlXywga2V5KSA/IFJFUExBQ0UgOiBBREQ7XG4gICAgICBpZiAob3JpZ1ZhbHVlID09PSB2YWx1ZSAmJiBvcCA9PT0gUkVQTEFDRSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoLmNvbmNhdChrZXkpO1xuICAgICAgcGF0Y2hlcy5wdXNoKG9wID09PSBSRU1PVkUgPyB7IG9wLCBwYXRoIH0gOiB7IG9wLCBwYXRoLCB2YWx1ZSB9KTtcbiAgICAgIGludmVyc2VQYXRjaGVzLnB1c2goXG4gICAgICAgIG9wID09PSBBREQgPyB7IG9wOiBSRU1PVkUsIHBhdGggfSA6IG9wID09PSBSRU1PVkUgPyB7IG9wOiBBREQsIHBhdGgsIHZhbHVlOiBjbG9uZVBhdGNoVmFsdWVJZk5lZWRlZChvcmlnVmFsdWUpIH0gOiB7IG9wOiBSRVBMQUNFLCBwYXRoLCB2YWx1ZTogY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob3JpZ1ZhbHVlKSB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGdlbmVyYXRlU2V0UGF0Y2hlcyhzdGF0ZSwgYmFzZVBhdGgsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgbGV0IHsgYmFzZV8sIGNvcHlfIH0gPSBzdGF0ZTtcbiAgICBsZXQgaSA9IDA7XG4gICAgYmFzZV8uZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgIGlmICghY29weV8uaGFzKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IFJFTU9WRSxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcy51bnNoaWZ0KHtcbiAgICAgICAgICBvcDogQURELFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfSk7XG4gICAgaSA9IDA7XG4gICAgY29weV8uZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgIGlmICghYmFzZV8uaGFzKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGguY29uY2F0KFtpXSk7XG4gICAgICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICAgICAgb3A6IEFERCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBpbnZlcnNlUGF0Y2hlcy51bnNoaWZ0KHtcbiAgICAgICAgICBvcDogUkVNT1ZFLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2VuZXJhdGVSZXBsYWNlbWVudFBhdGNoZXNfKGJhc2VWYWx1ZSwgcmVwbGFjZW1lbnQsIHBhdGNoZXMsIGludmVyc2VQYXRjaGVzKSB7XG4gICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgIG9wOiBSRVBMQUNFLFxuICAgICAgcGF0aDogW10sXG4gICAgICB2YWx1ZTogcmVwbGFjZW1lbnQgPT09IE5PVEhJTkcgPyB2b2lkIDAgOiByZXBsYWNlbWVudFxuICAgIH0pO1xuICAgIGludmVyc2VQYXRjaGVzLnB1c2goe1xuICAgICAgb3A6IFJFUExBQ0UsXG4gICAgICBwYXRoOiBbXSxcbiAgICAgIHZhbHVlOiBiYXNlVmFsdWVcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBhcHBseVBhdGNoZXNfKGRyYWZ0LCBwYXRjaGVzKSB7XG4gICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgY29uc3QgeyBwYXRoLCBvcCB9ID0gcGF0Y2g7XG4gICAgICBsZXQgYmFzZSA9IGRyYWZ0O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJlbnRUeXBlID0gZ2V0QXJjaHR5cGUoYmFzZSk7XG4gICAgICAgIGxldCBwID0gcGF0aFtpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBwICE9PSBcInN0cmluZ1wiICYmIHR5cGVvZiBwICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcCA9IFwiXCIgKyBwO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocGFyZW50VHlwZSA9PT0gMCAvKiBPYmplY3QgKi8gfHwgcGFyZW50VHlwZSA9PT0gMSAvKiBBcnJheSAqLykgJiYgKHAgPT09IFwiX19wcm90b19fXCIgfHwgcCA9PT0gXCJjb25zdHJ1Y3RvclwiKSlcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlID09PSBcImZ1bmN0aW9uXCIgJiYgcCA9PT0gXCJwcm90b3R5cGVcIilcbiAgICAgICAgICBkaWUoZXJyb3JPZmZzZXQgKyAzKTtcbiAgICAgICAgYmFzZSA9IGdldChiYXNlLCBwKTtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlICE9PSBcIm9iamVjdFwiKVxuICAgICAgICAgIGRpZShlcnJvck9mZnNldCArIDIsIHBhdGguam9pbihcIi9cIikpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHlwZSA9IGdldEFyY2h0eXBlKGJhc2UpO1xuICAgICAgY29uc3QgdmFsdWUgPSBkZWVwQ2xvbmVQYXRjaFZhbHVlKHBhdGNoLnZhbHVlKTtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgY2FzZSBSRVBMQUNFOlxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Uuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFNldCAqLzpcbiAgICAgICAgICAgICAgZGllKGVycm9yT2Zmc2V0KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQUREOlxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAxIC8qIEFycmF5ICovOlxuICAgICAgICAgICAgICByZXR1cm4ga2V5ID09PSBcIi1cIiA/IGJhc2UucHVzaCh2YWx1ZSkgOiBiYXNlLnNwbGljZShrZXksIDAsIHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBNYXAgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlIFJFTU9WRTpcbiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMSAvKiBBcnJheSAqLzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2Uuc3BsaWNlKGtleSwgMSk7XG4gICAgICAgICAgICBjYXNlIDIgLyogTWFwICovOlxuICAgICAgICAgICAgICByZXR1cm4gYmFzZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTZXQgKi86XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlLmRlbGV0ZShwYXRjaC52YWx1ZSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gZGVsZXRlIGJhc2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgZGllKGVycm9yT2Zmc2V0ICsgMSwgb3ApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkcmFmdDtcbiAgfVxuICBmdW5jdGlvbiBkZWVwQ2xvbmVQYXRjaFZhbHVlKG9iaikge1xuICAgIGlmICghaXNEcmFmdGFibGUob2JqKSlcbiAgICAgIHJldHVybiBvYmo7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSlcbiAgICAgIHJldHVybiBvYmoubWFwKGRlZXBDbG9uZVBhdGNoVmFsdWUpO1xuICAgIGlmIChpc01hcChvYmopKVxuICAgICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICAgIEFycmF5LmZyb20ob2JqLmVudHJpZXMoKSkubWFwKChbaywgdl0pID0+IFtrLCBkZWVwQ2xvbmVQYXRjaFZhbHVlKHYpXSlcbiAgICAgICk7XG4gICAgaWYgKGlzU2V0KG9iaikpXG4gICAgICByZXR1cm4gbmV3IFNldChBcnJheS5mcm9tKG9iaikubWFwKGRlZXBDbG9uZVBhdGNoVmFsdWUpKTtcbiAgICBjb25zdCBjbG9uZWQgPSBPYmplY3QuY3JlYXRlKGdldFByb3RvdHlwZU9mKG9iaikpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iailcbiAgICAgIGNsb25lZFtrZXldID0gZGVlcENsb25lUGF0Y2hWYWx1ZShvYmpba2V5XSk7XG4gICAgaWYgKGhhcyhvYmosIERSQUZUQUJMRSkpXG4gICAgICBjbG9uZWRbRFJBRlRBQkxFXSA9IG9ialtEUkFGVEFCTEVdO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbiAgZnVuY3Rpb24gY2xvbmVQYXRjaFZhbHVlSWZOZWVkZWQob2JqKSB7XG4gICAgaWYgKGlzRHJhZnQob2JqKSkge1xuICAgICAgcmV0dXJuIGRlZXBDbG9uZVBhdGNoVmFsdWUob2JqKTtcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybiBvYmo7XG4gIH1cbiAgbG9hZFBsdWdpbihcIlBhdGNoZXNcIiwge1xuICAgIGFwcGx5UGF0Y2hlc18sXG4gICAgZ2VuZXJhdGVQYXRjaGVzXyxcbiAgICBnZW5lcmF0ZVJlcGxhY2VtZW50UGF0Y2hlc19cbiAgfSk7XG59XG5cbi8vIHNyYy9wbHVnaW5zL21hcHNldC50c1xuZnVuY3Rpb24gZW5hYmxlTWFwU2V0KCkge1xuICBjbGFzcyBEcmFmdE1hcCBleHRlbmRzIE1hcCB7XG4gICAgY29uc3RydWN0b3IodGFyZ2V0LCBwYXJlbnQpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzW0RSQUZUX1NUQVRFXSA9IHtcbiAgICAgICAgdHlwZV86IDIgLyogTWFwICovLFxuICAgICAgICBwYXJlbnRfOiBwYXJlbnQsXG4gICAgICAgIHNjb3BlXzogcGFyZW50ID8gcGFyZW50LnNjb3BlXyA6IGdldEN1cnJlbnRTY29wZSgpLFxuICAgICAgICBtb2RpZmllZF86IGZhbHNlLFxuICAgICAgICBmaW5hbGl6ZWRfOiBmYWxzZSxcbiAgICAgICAgY29weV86IHZvaWQgMCxcbiAgICAgICAgYXNzaWduZWRfOiB2b2lkIDAsXG4gICAgICAgIGJhc2VfOiB0YXJnZXQsXG4gICAgICAgIGRyYWZ0XzogdGhpcyxcbiAgICAgICAgaXNNYW51YWxfOiBmYWxzZSxcbiAgICAgICAgcmV2b2tlZF86IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLnNpemU7XG4gICAgfVxuICAgIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBsYXRlc3QodGhpc1tEUkFGVF9TVEFURV0pLmhhcyhrZXkpO1xuICAgIH1cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBpZiAoIWxhdGVzdChzdGF0ZSkuaGFzKGtleSkgfHwgbGF0ZXN0KHN0YXRlKS5nZXQoa2V5KSAhPT0gdmFsdWUpIHtcbiAgICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgc3RhdGUuY29weV8uc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uc2V0KGtleSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgaWYgKCF0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgbWFya0NoYW5nZWQoc3RhdGUpO1xuICAgICAgaWYgKHN0YXRlLmJhc2VfLmhhcyhrZXkpKSB7XG4gICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5hc3NpZ25lZF8uZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICBzdGF0ZS5jb3B5Xy5kZWxldGUoa2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKGxhdGVzdChzdGF0ZSkuc2l6ZSkge1xuICAgICAgICBwcmVwYXJlTWFwQ29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuYXNzaWduZWRfID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgICAgZWFjaChzdGF0ZS5iYXNlXywgKGtleSkgPT4ge1xuICAgICAgICAgIHN0YXRlLmFzc2lnbmVkXy5zZXQoa2V5LCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdGF0ZS5jb3B5Xy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3JFYWNoKGNiLCB0aGlzQXJnKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgbGF0ZXN0KHN0YXRlKS5mb3JFYWNoKChfdmFsdWUsIGtleSwgX21hcCkgPT4ge1xuICAgICAgICBjYi5jYWxsKHRoaXNBcmcsIHRoaXMuZ2V0KGtleSksIGtleSwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZ2V0KGtleSkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGxhdGVzdChzdGF0ZSkuZ2V0KGtleSk7XG4gICAgICBpZiAoc3RhdGUuZmluYWxpemVkXyB8fCAhaXNEcmFmdGFibGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSAhPT0gc3RhdGUuYmFzZV8uZ2V0KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZHJhZnQgPSBjcmVhdGVQcm94eSh2YWx1ZSwgc3RhdGUpO1xuICAgICAgcHJlcGFyZU1hcENvcHkoc3RhdGUpO1xuICAgICAgc3RhdGUuY29weV8uc2V0KGtleSwgZHJhZnQpO1xuICAgICAgcmV0dXJuIGRyYWZ0O1xuICAgIH1cbiAgICBrZXlzKCkge1xuICAgICAgcmV0dXJuIGxhdGVzdCh0aGlzW0RSQUZUX1NUQVRFXSkua2V5cygpO1xuICAgIH1cbiAgICB2YWx1ZXMoKSB7XG4gICAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMua2V5cygpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHRoaXMudmFsdWVzKCksXG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCByID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChyLmRvbmUpXG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KHIudmFsdWUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgZW50cmllcygpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5rZXlzKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gdGhpcy5lbnRyaWVzKCksXG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCByID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChyLmRvbmUpXG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KHIudmFsdWUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBbci52YWx1ZSwgdmFsdWVdXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgWyhEUkFGVF9TVEFURSwgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHByb3h5TWFwXyh0YXJnZXQsIHBhcmVudCkge1xuICAgIHJldHVybiBuZXcgRHJhZnRNYXAodGFyZ2V0LCBwYXJlbnQpO1xuICB9XG4gIGZ1bmN0aW9uIHByZXBhcmVNYXBDb3B5KHN0YXRlKSB7XG4gICAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgICAgc3RhdGUuYXNzaWduZWRfID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIHN0YXRlLmNvcHlfID0gbmV3IE1hcChzdGF0ZS5iYXNlXyk7XG4gICAgfVxuICB9XG4gIGNsYXNzIERyYWZ0U2V0IGV4dGVuZHMgU2V0IHtcbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIHBhcmVudCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXNbRFJBRlRfU1RBVEVdID0ge1xuICAgICAgICB0eXBlXzogMyAvKiBTZXQgKi8sXG4gICAgICAgIHBhcmVudF86IHBhcmVudCxcbiAgICAgICAgc2NvcGVfOiBwYXJlbnQgPyBwYXJlbnQuc2NvcGVfIDogZ2V0Q3VycmVudFNjb3BlKCksXG4gICAgICAgIG1vZGlmaWVkXzogZmFsc2UsXG4gICAgICAgIGZpbmFsaXplZF86IGZhbHNlLFxuICAgICAgICBjb3B5Xzogdm9pZCAwLFxuICAgICAgICBiYXNlXzogdGFyZ2V0LFxuICAgICAgICBkcmFmdF86IHRoaXMsXG4gICAgICAgIGRyYWZ0c186IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgICAgIHJldm9rZWRfOiBmYWxzZSxcbiAgICAgICAgaXNNYW51YWxfOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gbGF0ZXN0KHRoaXNbRFJBRlRfU1RBVEVdKS5zaXplO1xuICAgIH1cbiAgICBoYXModmFsdWUpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKCFzdGF0ZS5jb3B5Xykge1xuICAgICAgICByZXR1cm4gc3RhdGUuYmFzZV8uaGFzKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5jb3B5Xy5oYXModmFsdWUpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChzdGF0ZS5kcmFmdHNfLmhhcyh2YWx1ZSkgJiYgc3RhdGUuY29weV8uaGFzKHN0YXRlLmRyYWZ0c18uZ2V0KHZhbHVlKSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhZGQodmFsdWUpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKCF0aGlzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgcHJlcGFyZVNldENvcHkoc3RhdGUpO1xuICAgICAgICBtYXJrQ2hhbmdlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLmNvcHlfLmFkZCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5Xy5kZWxldGUodmFsdWUpIHx8IChzdGF0ZS5kcmFmdHNfLmhhcyh2YWx1ZSkgPyBzdGF0ZS5jb3B5Xy5kZWxldGUoc3RhdGUuZHJhZnRzXy5nZXQodmFsdWUpKSA6IChcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZmFsc2VcbiAgICAgICkpO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdGhpc1tEUkFGVF9TVEFURV07XG4gICAgICBhc3NlcnRVbnJldm9rZWQoc3RhdGUpO1xuICAgICAgaWYgKGxhdGVzdChzdGF0ZSkuc2l6ZSkge1xuICAgICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICAgIG1hcmtDaGFuZ2VkKHN0YXRlKTtcbiAgICAgICAgc3RhdGUuY29weV8uY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzW0RSQUZUX1NUQVRFXTtcbiAgICAgIGFzc2VydFVucmV2b2tlZChzdGF0ZSk7XG4gICAgICBwcmVwYXJlU2V0Q29weShzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGUuY29weV8udmFsdWVzKCk7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXNbRFJBRlRfU1RBVEVdO1xuICAgICAgYXNzZXJ0VW5yZXZva2VkKHN0YXRlKTtcbiAgICAgIHByZXBhcmVTZXRDb3B5KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZS5jb3B5Xy5lbnRyaWVzKCk7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXMoKTtcbiAgICB9XG4gICAgWyhEUkFGVF9TVEFURSwgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXMoKTtcbiAgICB9XG4gICAgZm9yRWFjaChjYiwgdGhpc0FyZykge1xuICAgICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLnZhbHVlcygpO1xuICAgICAgbGV0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgY2IuY2FsbCh0aGlzQXJnLCByZXN1bHQudmFsdWUsIHJlc3VsdC52YWx1ZSwgdGhpcyk7XG4gICAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gcHJveHlTZXRfKHRhcmdldCwgcGFyZW50KSB7XG4gICAgcmV0dXJuIG5ldyBEcmFmdFNldCh0YXJnZXQsIHBhcmVudCk7XG4gIH1cbiAgZnVuY3Rpb24gcHJlcGFyZVNldENvcHkoc3RhdGUpIHtcbiAgICBpZiAoIXN0YXRlLmNvcHlfKSB7XG4gICAgICBzdGF0ZS5jb3B5XyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgICBzdGF0ZS5iYXNlXy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoaXNEcmFmdGFibGUodmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgZHJhZnQgPSBjcmVhdGVQcm94eSh2YWx1ZSwgc3RhdGUpO1xuICAgICAgICAgIHN0YXRlLmRyYWZ0c18uc2V0KHZhbHVlLCBkcmFmdCk7XG4gICAgICAgICAgc3RhdGUuY29weV8uYWRkKGRyYWZ0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS5jb3B5Xy5hZGQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYXNzZXJ0VW5yZXZva2VkKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLnJldm9rZWRfKVxuICAgICAgZGllKDMsIEpTT04uc3RyaW5naWZ5KGxhdGVzdChzdGF0ZSkpKTtcbiAgfVxuICBsb2FkUGx1Z2luKFwiTWFwU2V0XCIsIHsgcHJveHlNYXBfLCBwcm94eVNldF8gfSk7XG59XG5cbi8vIHNyYy9pbW1lci50c1xudmFyIGltbWVyID0gbmV3IEltbWVyMigpO1xudmFyIHByb2R1Y2UgPSBpbW1lci5wcm9kdWNlO1xudmFyIHByb2R1Y2VXaXRoUGF0Y2hlcyA9IGltbWVyLnByb2R1Y2VXaXRoUGF0Y2hlcy5iaW5kKFxuICBpbW1lclxuKTtcbnZhciBzZXRBdXRvRnJlZXplID0gaW1tZXIuc2V0QXV0b0ZyZWV6ZS5iaW5kKGltbWVyKTtcbnZhciBzZXRVc2VTdHJpY3RTaGFsbG93Q29weSA9IGltbWVyLnNldFVzZVN0cmljdFNoYWxsb3dDb3B5LmJpbmQoaW1tZXIpO1xudmFyIGFwcGx5UGF0Y2hlcyA9IGltbWVyLmFwcGx5UGF0Y2hlcy5iaW5kKGltbWVyKTtcbnZhciBjcmVhdGVEcmFmdCA9IGltbWVyLmNyZWF0ZURyYWZ0LmJpbmQoaW1tZXIpO1xudmFyIGZpbmlzaERyYWZ0ID0gaW1tZXIuZmluaXNoRHJhZnQuYmluZChpbW1lcik7XG5mdW5jdGlvbiBjYXN0RHJhZnQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gY2FzdEltbXV0YWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQge1xuICBJbW1lcjIgYXMgSW1tZXIsXG4gIGFwcGx5UGF0Y2hlcyxcbiAgY2FzdERyYWZ0LFxuICBjYXN0SW1tdXRhYmxlLFxuICBjcmVhdGVEcmFmdCxcbiAgY3VycmVudCxcbiAgZW5hYmxlTWFwU2V0LFxuICBlbmFibGVQYXRjaGVzLFxuICBmaW5pc2hEcmFmdCxcbiAgZnJlZXplLFxuICBEUkFGVEFCTEUgYXMgaW1tZXJhYmxlLFxuICBpc0RyYWZ0LFxuICBpc0RyYWZ0YWJsZSxcbiAgTk9USElORyBhcyBub3RoaW5nLFxuICBvcmlnaW5hbCxcbiAgcHJvZHVjZSxcbiAgcHJvZHVjZVdpdGhQYXRjaGVzLFxuICBzZXRBdXRvRnJlZXplLFxuICBzZXRVc2VTdHJpY3RTaGFsbG93Q29weVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWltbWVyLm1qcy5tYXAiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlQ2FuY2VsbGFibGVQcm9taXNlKHByb21pc2UpIHtcbiAgICB2YXIgaXNDYW5jZWxsZWQgPSBmYWxzZTtcbiAgICB2YXIgd3JhcHBlZFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHByb21pc2VcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gIWlzQ2FuY2VsbGVkICYmIHJlc29sdmUodmFsdWUpOyB9KVxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikgeyByZXR1cm4gIWlzQ2FuY2VsbGVkICYmIHJlamVjdChlcnJvcik7IH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb21pc2U6IHdyYXBwZWRQcm9taXNlLFxuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlzQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIiwidmFyIF9fc3ByZWFkQXJyYXkgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuLy8gQXMgZGVmaW5lZCBvbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZXZlbnRzOiBodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXZlbnRzLmh0bWxcbmV4cG9ydCB2YXIgY2xpcGJvYXJkRXZlbnRzID0gWydvbkNvcHknLCAnb25DdXQnLCAnb25QYXN0ZSddO1xuZXhwb3J0IHZhciBjb21wb3NpdGlvbkV2ZW50cyA9IFtcbiAgICAnb25Db21wb3NpdGlvbkVuZCcsXG4gICAgJ29uQ29tcG9zaXRpb25TdGFydCcsXG4gICAgJ29uQ29tcG9zaXRpb25VcGRhdGUnLFxuXTtcbmV4cG9ydCB2YXIgZm9jdXNFdmVudHMgPSBbJ29uRm9jdXMnLCAnb25CbHVyJ107XG5leHBvcnQgdmFyIGZvcm1FdmVudHMgPSBbJ29uSW5wdXQnLCAnb25JbnZhbGlkJywgJ29uUmVzZXQnLCAnb25TdWJtaXQnXTtcbmV4cG9ydCB2YXIgaW1hZ2VFdmVudHMgPSBbJ29uTG9hZCcsICdvbkVycm9yJ107XG5leHBvcnQgdmFyIGtleWJvYXJkRXZlbnRzID0gWydvbktleURvd24nLCAnb25LZXlQcmVzcycsICdvbktleVVwJ107XG5leHBvcnQgdmFyIG1lZGlhRXZlbnRzID0gW1xuICAgICdvbkFib3J0JyxcbiAgICAnb25DYW5QbGF5JyxcbiAgICAnb25DYW5QbGF5VGhyb3VnaCcsXG4gICAgJ29uRHVyYXRpb25DaGFuZ2UnLFxuICAgICdvbkVtcHRpZWQnLFxuICAgICdvbkVuY3J5cHRlZCcsXG4gICAgJ29uRW5kZWQnLFxuICAgICdvbkVycm9yJyxcbiAgICAnb25Mb2FkZWREYXRhJyxcbiAgICAnb25Mb2FkZWRNZXRhZGF0YScsXG4gICAgJ29uTG9hZFN0YXJ0JyxcbiAgICAnb25QYXVzZScsXG4gICAgJ29uUGxheScsXG4gICAgJ29uUGxheWluZycsXG4gICAgJ29uUHJvZ3Jlc3MnLFxuICAgICdvblJhdGVDaGFuZ2UnLFxuICAgICdvblNlZWtlZCcsXG4gICAgJ29uU2Vla2luZycsXG4gICAgJ29uU3RhbGxlZCcsXG4gICAgJ29uU3VzcGVuZCcsXG4gICAgJ29uVGltZVVwZGF0ZScsXG4gICAgJ29uVm9sdW1lQ2hhbmdlJyxcbiAgICAnb25XYWl0aW5nJyxcbl07XG5leHBvcnQgdmFyIG1vdXNlRXZlbnRzID0gW1xuICAgICdvbkNsaWNrJyxcbiAgICAnb25Db250ZXh0TWVudScsXG4gICAgJ29uRG91YmxlQ2xpY2snLFxuICAgICdvbk1vdXNlRG93bicsXG4gICAgJ29uTW91c2VFbnRlcicsXG4gICAgJ29uTW91c2VMZWF2ZScsXG4gICAgJ29uTW91c2VNb3ZlJyxcbiAgICAnb25Nb3VzZU91dCcsXG4gICAgJ29uTW91c2VPdmVyJyxcbiAgICAnb25Nb3VzZVVwJyxcbl07XG5leHBvcnQgdmFyIGRyYWdFdmVudHMgPSBbXG4gICAgJ29uRHJhZycsXG4gICAgJ29uRHJhZ0VuZCcsXG4gICAgJ29uRHJhZ0VudGVyJyxcbiAgICAnb25EcmFnRXhpdCcsXG4gICAgJ29uRHJhZ0xlYXZlJyxcbiAgICAnb25EcmFnT3ZlcicsXG4gICAgJ29uRHJhZ1N0YXJ0JyxcbiAgICAnb25Ecm9wJyxcbl07XG5leHBvcnQgdmFyIHNlbGVjdGlvbkV2ZW50cyA9IFsnb25TZWxlY3QnXTtcbmV4cG9ydCB2YXIgdG91Y2hFdmVudHMgPSBbJ29uVG91Y2hDYW5jZWwnLCAnb25Ub3VjaEVuZCcsICdvblRvdWNoTW92ZScsICdvblRvdWNoU3RhcnQnXTtcbmV4cG9ydCB2YXIgcG9pbnRlckV2ZW50cyA9IFtcbiAgICAnb25Qb2ludGVyRG93bicsXG4gICAgJ29uUG9pbnRlck1vdmUnLFxuICAgICdvblBvaW50ZXJVcCcsXG4gICAgJ29uUG9pbnRlckNhbmNlbCcsXG4gICAgJ29uR290UG9pbnRlckNhcHR1cmUnLFxuICAgICdvbkxvc3RQb2ludGVyQ2FwdHVyZScsXG4gICAgJ29uUG9pbnRlckVudGVyJyxcbiAgICAnb25Qb2ludGVyTGVhdmUnLFxuICAgICdvblBvaW50ZXJPdmVyJyxcbiAgICAnb25Qb2ludGVyT3V0Jyxcbl07XG5leHBvcnQgdmFyIHVpRXZlbnRzID0gWydvblNjcm9sbCddO1xuZXhwb3J0IHZhciB3aGVlbEV2ZW50cyA9IFsnb25XaGVlbCddO1xuZXhwb3J0IHZhciBhbmltYXRpb25FdmVudHMgPSBbXG4gICAgJ29uQW5pbWF0aW9uU3RhcnQnLFxuICAgICdvbkFuaW1hdGlvbkVuZCcsXG4gICAgJ29uQW5pbWF0aW9uSXRlcmF0aW9uJyxcbl07XG5leHBvcnQgdmFyIHRyYW5zaXRpb25FdmVudHMgPSBbJ29uVHJhbnNpdGlvbkVuZCddO1xuZXhwb3J0IHZhciBvdGhlckV2ZW50cyA9IFsnb25Ub2dnbGUnXTtcbmV4cG9ydCB2YXIgY2hhbmdlRXZlbnRzID0gWydvbkNoYW5nZSddO1xuZXhwb3J0IHZhciBhbGxFdmVudHMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgY2xpcGJvYXJkRXZlbnRzLCB0cnVlKSwgY29tcG9zaXRpb25FdmVudHMsIHRydWUpLCBmb2N1c0V2ZW50cywgdHJ1ZSksIGZvcm1FdmVudHMsIHRydWUpLCBpbWFnZUV2ZW50cywgdHJ1ZSksIGtleWJvYXJkRXZlbnRzLCB0cnVlKSwgbWVkaWFFdmVudHMsIHRydWUpLCBtb3VzZUV2ZW50cywgdHJ1ZSksIGRyYWdFdmVudHMsIHRydWUpLCBzZWxlY3Rpb25FdmVudHMsIHRydWUpLCB0b3VjaEV2ZW50cywgdHJ1ZSksIHBvaW50ZXJFdmVudHMsIHRydWUpLCB1aUV2ZW50cywgdHJ1ZSksIHdoZWVsRXZlbnRzLCB0cnVlKSwgYW5pbWF0aW9uRXZlbnRzLCB0cnVlKSwgdHJhbnNpdGlvbkV2ZW50cywgdHJ1ZSksIGNoYW5nZUV2ZW50cywgdHJ1ZSksIG90aGVyRXZlbnRzLCB0cnVlKTtcbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBvbi1ldmVudCBjYWxsYmFjayBwcm9wcyBjdXJyaWVkIHdpdGggcHJvdmlkZWQgYXJncy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wcyBwYXNzZWQgdG8gYSBjb21wb25lbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gZ2V0QXJncyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhcmd1bWVudChzKSBvbi1ldmVudCBjYWxsYmFja3NcbiAqICAgc2hhbGwgYmUgY3VycmllZCB3aXRoLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlRXZlbnRQcm9wcyhwcm9wcywgZ2V0QXJncykge1xuICAgIHZhciBldmVudFByb3BzID0ge307XG4gICAgYWxsRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICB2YXIgZXZlbnRIYW5kbGVyID0gcHJvcHNbZXZlbnROYW1lXTtcbiAgICAgICAgaWYgKCFldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0QXJncykge1xuICAgICAgICAgICAgZXZlbnRQcm9wc1tldmVudE5hbWVdID0gKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmVudEhhbmRsZXIoZXZlbnQsIGdldEFyZ3MoZXZlbnROYW1lKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGV2ZW50UHJvcHNbZXZlbnROYW1lXSA9IGV2ZW50SGFuZGxlcjtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBldmVudFByb3BzO1xufVxuIiwiLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgbWVyZ2VzIFJlYWN0IHJlZnMgaW50byBvbmUuXG4gKiBTdXBwb3J0cyBib3RoIGZ1bmN0aW9ucyBhbmQgcmVmIG9iamVjdHMgY3JlYXRlZCB1c2luZyBjcmVhdGVSZWYoKSBhbmQgdXNlUmVmKCkuXG4gKlxuICogVXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxkaXYgcmVmPXttZXJnZVJlZnMocmVmMSwgcmVmMiwgcmVmMyl9IC8+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geyhSZWFjdC5SZWY8VD4gfCB1bmRlZmluZWQpW119IGlucHV0UmVmcyBBcnJheSBvZiByZWZzXG4gKiBAcmV0dXJucyB7UmVhY3QuUmVmPFQ+IHwgUmVhY3QuUmVmQ2FsbGJhY2s8VD59IE1lcmdlZCByZWZzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlUmVmcygpIHtcbiAgICB2YXIgaW5wdXRSZWZzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgaW5wdXRSZWZzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBmaWx0ZXJlZElucHV0UmVmcyA9IGlucHV0UmVmcy5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKGZpbHRlcmVkSW5wdXRSZWZzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIHZhciBmaXJzdFJlZiA9IGZpbHRlcmVkSW5wdXRSZWZzWzBdO1xuICAgICAgICByZXR1cm4gZmlyc3RSZWYgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZFJlZnMocmVmKSB7XG4gICAgICAgIGZpbHRlcmVkSW5wdXRSZWZzLmZvckVhY2goZnVuY3Rpb24gKGlucHV0UmVmKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0UmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRSZWYocmVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlucHV0UmVmKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRSZWYuY3VycmVudCA9IHJlZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbiIsIi8qKlxuICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlXG4gKiBKYXZhU2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlXG4gKlxuICogQ29weXJpZ2h0IDIwMjMgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZVxuICogSmF2YVNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZVxuICovXG5cbi8qKioqKiovIC8vIFRoZSByZXF1aXJlIHNjb3BlXG4vKioqKioqLyB2YXIgX193ZWJwYWNrX3JlcXVpcmVfXyA9IHt9O1xuLyoqKioqKi8gXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzICovXG4vKioqKioqLyAoKCkgPT4ge1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG4vKioqKioqLyBcdFx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuLyoqKioqKi8gXHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG4vKioqKioqLyBcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi8gfSkoKTtcbi8qKioqKiovIFxuLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCAqL1xuLyoqKioqKi8gKCgpID0+IHtcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKVxuLyoqKioqKi8gfSkoKTtcbi8qKioqKiovIFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gZ2xvYmFsVGhpcy5wZGZqc0xpYiA9IHt9O1xuXG4vLyBFWFBPUlRTXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywge1xuICBBYm9ydEV4Y2VwdGlvbjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIEFib3J0RXhjZXB0aW9uKSxcbiAgQW5ub3RhdGlvbkVkaXRvckxheWVyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQW5ub3RhdGlvbkVkaXRvckxheWVyKSxcbiAgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGU6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSksXG4gIEFubm90YXRpb25FZGl0b3JUeXBlOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQW5ub3RhdGlvbkVkaXRvclR5cGUpLFxuICBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciksXG4gIEFubm90YXRpb25MYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIEFubm90YXRpb25MYXllciksXG4gIEFubm90YXRpb25Nb2RlOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQW5ub3RhdGlvbk1vZGUpLFxuICBDTWFwQ29tcHJlc3Npb25UeXBlOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQ01hcENvbXByZXNzaW9uVHlwZSksXG4gIENvbG9yUGlja2VyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gQ29sb3JQaWNrZXIpLFxuICBET01TVkdGYWN0b3J5OiAoKSA9PiAoLyogcmVleHBvcnQgKi8gRE9NU1ZHRmFjdG9yeSksXG4gIERyYXdMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIERyYXdMYXllciksXG4gIEZlYXR1cmVUZXN0OiAoKSA9PiAoLyogcmVleHBvcnQgKi8gdXRpbF9GZWF0dXJlVGVzdCksXG4gIEdsb2JhbFdvcmtlck9wdGlvbnM6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBHbG9iYWxXb3JrZXJPcHRpb25zKSxcbiAgSW1hZ2VLaW5kOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gdXRpbF9JbWFnZUtpbmQpLFxuICBJbnZhbGlkUERGRXhjZXB0aW9uOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gSW52YWxpZFBERkV4Y2VwdGlvbiksXG4gIE1pc3NpbmdQREZFeGNlcHRpb246ICgpID0+ICgvKiByZWV4cG9ydCAqLyBNaXNzaW5nUERGRXhjZXB0aW9uKSxcbiAgT1BTOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gT1BTKSxcbiAgT3V0bGluZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBPdXRsaW5lciksXG4gIFBERkRhdGFSYW5nZVRyYW5zcG9ydDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFBERkRhdGFSYW5nZVRyYW5zcG9ydCksXG4gIFBERkRhdGVTdHJpbmc6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBQREZEYXRlU3RyaW5nKSxcbiAgUERGV29ya2VyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gUERGV29ya2VyKSxcbiAgUGFzc3dvcmRSZXNwb25zZXM6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBQYXNzd29yZFJlc3BvbnNlcyksXG4gIFBlcm1pc3Npb25GbGFnOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gUGVybWlzc2lvbkZsYWcpLFxuICBQaXhlbHNQZXJJbmNoOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gUGl4ZWxzUGVySW5jaCksXG4gIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiksXG4gIFRleHRMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFRleHRMYXllciksXG4gIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiksXG4gIFV0aWw6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBVdGlsKSxcbiAgVmVyYm9zaXR5TGV2ZWw6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBWZXJib3NpdHlMZXZlbCksXG4gIFhmYUxheWVyOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gWGZhTGF5ZXIpLFxuICBidWlsZDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGJ1aWxkKSxcbiAgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpLFxuICBmZXRjaERhdGE6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBmZXRjaERhdGEpLFxuICBnZXREb2N1bWVudDogKCkgPT4gKC8qIHJlZXhwb3J0ICovIGdldERvY3VtZW50KSxcbiAgZ2V0RmlsZW5hbWVGcm9tVXJsOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gZ2V0RmlsZW5hbWVGcm9tVXJsKSxcbiAgZ2V0UGRmRmlsZW5hbWVGcm9tVXJsOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gZ2V0UGRmRmlsZW5hbWVGcm9tVXJsKSxcbiAgZ2V0WGZhUGFnZVZpZXdwb3J0OiAoKSA9PiAoLyogcmVleHBvcnQgKi8gZ2V0WGZhUGFnZVZpZXdwb3J0KSxcbiAgaXNEYXRhU2NoZW1lOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gaXNEYXRhU2NoZW1lKSxcbiAgaXNQZGZGaWxlOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gaXNQZGZGaWxlKSxcbiAgbm9Db250ZXh0TWVudTogKCkgPT4gKC8qIHJlZXhwb3J0ICovIG5vQ29udGV4dE1lbnUpLFxuICBub3JtYWxpemVVbmljb2RlOiAoKSA9PiAoLyogcmVleHBvcnQgKi8gbm9ybWFsaXplVW5pY29kZSksXG4gIHJlbmRlclRleHRMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIHJlbmRlclRleHRMYXllciksXG4gIHNldExheWVyRGltZW5zaW9uczogKCkgPT4gKC8qIHJlZXhwb3J0ICovIHNldExheWVyRGltZW5zaW9ucyksXG4gIHNoYWRvdzogKCkgPT4gKC8qIHJlZXhwb3J0ICovIHNoYWRvdyksXG4gIHVwZGF0ZVRleHRMYXllcjogKCkgPT4gKC8qIHJlZXhwb3J0ICovIHVwZGF0ZVRleHRMYXllciksXG4gIHZlcnNpb246ICgpID0+ICgvKiByZWV4cG9ydCAqLyB2ZXJzaW9uKVxufSk7XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9zaGFyZWQvdXRpbC5qc1xuY29uc3QgaXNOb2RlSlMgPSB0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiBwcm9jZXNzICsgXCJcIiA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIgJiYgIXByb2Nlc3MudmVyc2lvbnMubncgJiYgIShwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uICYmIHByb2Nlc3MudHlwZSAmJiBwcm9jZXNzLnR5cGUgIT09IFwiYnJvd3NlclwiKTtcbmNvbnN0IElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTtcbmNvbnN0IEZPTlRfSURFTlRJVFlfTUFUUklYID0gWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF07XG5jb25zdCBNQVhfSU1BR0VfU0laRV9UT19DQUNIRSA9IDEwZTY7XG5jb25zdCBMSU5FX0ZBQ1RPUiA9IDEuMzU7XG5jb25zdCBMSU5FX0RFU0NFTlRfRkFDVE9SID0gMC4zNTtcbmNvbnN0IEJBU0VMSU5FX0ZBQ1RPUiA9IExJTkVfREVTQ0VOVF9GQUNUT1IgLyBMSU5FX0ZBQ1RPUjtcbmNvbnN0IFJlbmRlcmluZ0ludGVudEZsYWcgPSB7XG4gIEFOWTogMHgwMSxcbiAgRElTUExBWTogMHgwMixcbiAgUFJJTlQ6IDB4MDQsXG4gIFNBVkU6IDB4MDgsXG4gIEFOTk9UQVRJT05TX0ZPUk1TOiAweDEwLFxuICBBTk5PVEFUSU9OU19TVE9SQUdFOiAweDIwLFxuICBBTk5PVEFUSU9OU19ESVNBQkxFOiAweDQwLFxuICBPUExJU1Q6IDB4MTAwXG59O1xuY29uc3QgQW5ub3RhdGlvbk1vZGUgPSB7XG4gIERJU0FCTEU6IDAsXG4gIEVOQUJMRTogMSxcbiAgRU5BQkxFX0ZPUk1TOiAyLFxuICBFTkFCTEVfU1RPUkFHRTogM1xufTtcbmNvbnN0IEFubm90YXRpb25FZGl0b3JQcmVmaXggPSBcInBkZmpzX2ludGVybmFsX2VkaXRvcl9cIjtcbmNvbnN0IEFubm90YXRpb25FZGl0b3JUeXBlID0ge1xuICBESVNBQkxFOiAtMSxcbiAgTk9ORTogMCxcbiAgRlJFRVRFWFQ6IDMsXG4gIEhJR0hMSUdIVDogOSxcbiAgU1RBTVA6IDEzLFxuICBJTks6IDE1XG59O1xuY29uc3QgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSB7XG4gIFJFU0laRTogMSxcbiAgQ1JFQVRFOiAyLFxuICBGUkVFVEVYVF9TSVpFOiAxMSxcbiAgRlJFRVRFWFRfQ09MT1I6IDEyLFxuICBGUkVFVEVYVF9PUEFDSVRZOiAxMyxcbiAgSU5LX0NPTE9SOiAyMSxcbiAgSU5LX1RISUNLTkVTUzogMjIsXG4gIElOS19PUEFDSVRZOiAyMyxcbiAgSElHSExJR0hUX0NPTE9SOiAzMSxcbiAgSElHSExJR0hUX0RFRkFVTFRfQ09MT1I6IDMyLFxuICBISUdITElHSFRfVEhJQ0tORVNTOiAzMyxcbiAgSElHSExJR0hUX0ZSRUU6IDM0LFxuICBISUdITElHSFRfU0hPV19BTEw6IDM1XG59O1xuY29uc3QgUGVybWlzc2lvbkZsYWcgPSB7XG4gIFBSSU5UOiAweDA0LFxuICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsXG4gIENPUFk6IDB4MTAsXG4gIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCxcbiAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsXG4gIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLFxuICBBU1NFTUJMRTogMHg0MDAsXG4gIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDBcbn07XG5jb25zdCBUZXh0UmVuZGVyaW5nTW9kZSA9IHtcbiAgRklMTDogMCxcbiAgU1RST0tFOiAxLFxuICBGSUxMX1NUUk9LRTogMixcbiAgSU5WSVNJQkxFOiAzLFxuICBGSUxMX0FERF9UT19QQVRIOiA0LFxuICBTVFJPS0VfQUREX1RPX1BBVEg6IDUsXG4gIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LFxuICBBRERfVE9fUEFUSDogNyxcbiAgRklMTF9TVFJPS0VfTUFTSzogMyxcbiAgQUREX1RPX1BBVEhfRkxBRzogNFxufTtcbmNvbnN0IHV0aWxfSW1hZ2VLaW5kID0ge1xuICBHUkFZU0NBTEVfMUJQUDogMSxcbiAgUkdCXzI0QlBQOiAyLFxuICBSR0JBXzMyQlBQOiAzXG59O1xuY29uc3QgQW5ub3RhdGlvblR5cGUgPSB7XG4gIFRFWFQ6IDEsXG4gIExJTks6IDIsXG4gIEZSRUVURVhUOiAzLFxuICBMSU5FOiA0LFxuICBTUVVBUkU6IDUsXG4gIENJUkNMRTogNixcbiAgUE9MWUdPTjogNyxcbiAgUE9MWUxJTkU6IDgsXG4gIEhJR0hMSUdIVDogOSxcbiAgVU5ERVJMSU5FOiAxMCxcbiAgU1FVSUdHTFk6IDExLFxuICBTVFJJS0VPVVQ6IDEyLFxuICBTVEFNUDogMTMsXG4gIENBUkVUOiAxNCxcbiAgSU5LOiAxNSxcbiAgUE9QVVA6IDE2LFxuICBGSUxFQVRUQUNITUVOVDogMTcsXG4gIFNPVU5EOiAxOCxcbiAgTU9WSUU6IDE5LFxuICBXSURHRVQ6IDIwLFxuICBTQ1JFRU46IDIxLFxuICBQUklOVEVSTUFSSzogMjIsXG4gIFRSQVBORVQ6IDIzLFxuICBXQVRFUk1BUks6IDI0LFxuICBUSFJFRUQ6IDI1LFxuICBSRURBQ1Q6IDI2XG59O1xuY29uc3QgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHtcbiAgR1JPVVA6IFwiR3JvdXBcIixcbiAgUkVQTFk6IFwiUlwiXG59O1xuY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7XG4gIElOVklTSUJMRTogMHgwMSxcbiAgSElEREVOOiAweDAyLFxuICBQUklOVDogMHgwNCxcbiAgTk9aT09NOiAweDA4LFxuICBOT1JPVEFURTogMHgxMCxcbiAgTk9WSUVXOiAweDIwLFxuICBSRUFET05MWTogMHg0MCxcbiAgTE9DS0VEOiAweDgwLFxuICBUT0dHTEVOT1ZJRVc6IDB4MTAwLFxuICBMT0NLRURDT05URU5UUzogMHgyMDBcbn07XG5jb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0ge1xuICBSRUFET05MWTogMHgwMDAwMDAxLFxuICBSRVFVSVJFRDogMHgwMDAwMDAyLFxuICBOT0VYUE9SVDogMHgwMDAwMDA0LFxuICBNVUxUSUxJTkU6IDB4MDAwMTAwMCxcbiAgUEFTU1dPUkQ6IDB4MDAwMjAwMCxcbiAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLFxuICBSQURJTzogMHgwMDA4MDAwLFxuICBQVVNIQlVUVE9OOiAweDAwMTAwMDAsXG4gIENPTUJPOiAweDAwMjAwMDAsXG4gIEVESVQ6IDB4MDA0MDAwMCxcbiAgU09SVDogMHgwMDgwMDAwLFxuICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsXG4gIE1VTFRJU0VMRUNUOiAweDAyMDAwMDAsXG4gIERPTk9UU1BFTExDSEVDSzogMHgwNDAwMDAwLFxuICBET05PVFNDUk9MTDogMHgwODAwMDAwLFxuICBDT01COiAweDEwMDAwMDAsXG4gIFJJQ0hURVhUOiAweDIwMDAwMDAsXG4gIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsXG4gIENPTU1JVE9OU0VMQ0hBTkdFOiAweDQwMDAwMDBcbn07XG5jb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0ge1xuICBTT0xJRDogMSxcbiAgREFTSEVEOiAyLFxuICBCRVZFTEVEOiAzLFxuICBJTlNFVDogNCxcbiAgVU5ERVJMSU5FOiA1XG59O1xuY29uc3QgQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZSA9IHtcbiAgRTogXCJNb3VzZSBFbnRlclwiLFxuICBYOiBcIk1vdXNlIEV4aXRcIixcbiAgRDogXCJNb3VzZSBEb3duXCIsXG4gIFU6IFwiTW91c2UgVXBcIixcbiAgRm86IFwiRm9jdXNcIixcbiAgQmw6IFwiQmx1clwiLFxuICBQTzogXCJQYWdlT3BlblwiLFxuICBQQzogXCJQYWdlQ2xvc2VcIixcbiAgUFY6IFwiUGFnZVZpc2libGVcIixcbiAgUEk6IFwiUGFnZUludmlzaWJsZVwiLFxuICBLOiBcIktleXN0cm9rZVwiLFxuICBGOiBcIkZvcm1hdFwiLFxuICBWOiBcIlZhbGlkYXRlXCIsXG4gIEM6IFwiQ2FsY3VsYXRlXCJcbn07XG5jb25zdCBEb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IHtcbiAgV0M6IFwiV2lsbENsb3NlXCIsXG4gIFdTOiBcIldpbGxTYXZlXCIsXG4gIERTOiBcIkRpZFNhdmVcIixcbiAgV1A6IFwiV2lsbFByaW50XCIsXG4gIERQOiBcIkRpZFByaW50XCJcbn07XG5jb25zdCBQYWdlQWN0aW9uRXZlbnRUeXBlID0ge1xuICBPOiBcIlBhZ2VPcGVuXCIsXG4gIEM6IFwiUGFnZUNsb3NlXCJcbn07XG5jb25zdCBWZXJib3NpdHlMZXZlbCA9IHtcbiAgRVJST1JTOiAwLFxuICBXQVJOSU5HUzogMSxcbiAgSU5GT1M6IDVcbn07XG5jb25zdCBDTWFwQ29tcHJlc3Npb25UeXBlID0ge1xuICBOT05FOiAwLFxuICBCSU5BUlk6IDFcbn07XG5jb25zdCBPUFMgPSB7XG4gIGRlcGVuZGVuY3k6IDEsXG4gIHNldExpbmVXaWR0aDogMixcbiAgc2V0TGluZUNhcDogMyxcbiAgc2V0TGluZUpvaW46IDQsXG4gIHNldE1pdGVyTGltaXQ6IDUsXG4gIHNldERhc2g6IDYsXG4gIHNldFJlbmRlcmluZ0ludGVudDogNyxcbiAgc2V0RmxhdG5lc3M6IDgsXG4gIHNldEdTdGF0ZTogOSxcbiAgc2F2ZTogMTAsXG4gIHJlc3RvcmU6IDExLFxuICB0cmFuc2Zvcm06IDEyLFxuICBtb3ZlVG86IDEzLFxuICBsaW5lVG86IDE0LFxuICBjdXJ2ZVRvOiAxNSxcbiAgY3VydmVUbzI6IDE2LFxuICBjdXJ2ZVRvMzogMTcsXG4gIGNsb3NlUGF0aDogMTgsXG4gIHJlY3RhbmdsZTogMTksXG4gIHN0cm9rZTogMjAsXG4gIGNsb3NlU3Ryb2tlOiAyMSxcbiAgZmlsbDogMjIsXG4gIGVvRmlsbDogMjMsXG4gIGZpbGxTdHJva2U6IDI0LFxuICBlb0ZpbGxTdHJva2U6IDI1LFxuICBjbG9zZUZpbGxTdHJva2U6IDI2LFxuICBjbG9zZUVPRmlsbFN0cm9rZTogMjcsXG4gIGVuZFBhdGg6IDI4LFxuICBjbGlwOiAyOSxcbiAgZW9DbGlwOiAzMCxcbiAgYmVnaW5UZXh0OiAzMSxcbiAgZW5kVGV4dDogMzIsXG4gIHNldENoYXJTcGFjaW5nOiAzMyxcbiAgc2V0V29yZFNwYWNpbmc6IDM0LFxuICBzZXRIU2NhbGU6IDM1LFxuICBzZXRMZWFkaW5nOiAzNixcbiAgc2V0Rm9udDogMzcsXG4gIHNldFRleHRSZW5kZXJpbmdNb2RlOiAzOCxcbiAgc2V0VGV4dFJpc2U6IDM5LFxuICBtb3ZlVGV4dDogNDAsXG4gIHNldExlYWRpbmdNb3ZlVGV4dDogNDEsXG4gIHNldFRleHRNYXRyaXg6IDQyLFxuICBuZXh0TGluZTogNDMsXG4gIHNob3dUZXh0OiA0NCxcbiAgc2hvd1NwYWNlZFRleHQ6IDQ1LFxuICBuZXh0TGluZVNob3dUZXh0OiA0NixcbiAgbmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6IDQ3LFxuICBzZXRDaGFyV2lkdGg6IDQ4LFxuICBzZXRDaGFyV2lkdGhBbmRCb3VuZHM6IDQ5LFxuICBzZXRTdHJva2VDb2xvclNwYWNlOiA1MCxcbiAgc2V0RmlsbENvbG9yU3BhY2U6IDUxLFxuICBzZXRTdHJva2VDb2xvcjogNTIsXG4gIHNldFN0cm9rZUNvbG9yTjogNTMsXG4gIHNldEZpbGxDb2xvcjogNTQsXG4gIHNldEZpbGxDb2xvck46IDU1LFxuICBzZXRTdHJva2VHcmF5OiA1NixcbiAgc2V0RmlsbEdyYXk6IDU3LFxuICBzZXRTdHJva2VSR0JDb2xvcjogNTgsXG4gIHNldEZpbGxSR0JDb2xvcjogNTksXG4gIHNldFN0cm9rZUNNWUtDb2xvcjogNjAsXG4gIHNldEZpbGxDTVlLQ29sb3I6IDYxLFxuICBzaGFkaW5nRmlsbDogNjIsXG4gIGJlZ2luSW5saW5lSW1hZ2U6IDYzLFxuICBiZWdpbkltYWdlRGF0YTogNjQsXG4gIGVuZElubGluZUltYWdlOiA2NSxcbiAgcGFpbnRYT2JqZWN0OiA2NixcbiAgbWFya1BvaW50OiA2NyxcbiAgbWFya1BvaW50UHJvcHM6IDY4LFxuICBiZWdpbk1hcmtlZENvbnRlbnQ6IDY5LFxuICBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogNzAsXG4gIGVuZE1hcmtlZENvbnRlbnQ6IDcxLFxuICBiZWdpbkNvbXBhdDogNzIsXG4gIGVuZENvbXBhdDogNzMsXG4gIHBhaW50Rm9ybVhPYmplY3RCZWdpbjogNzQsXG4gIHBhaW50Rm9ybVhPYmplY3RFbmQ6IDc1LFxuICBiZWdpbkdyb3VwOiA3NixcbiAgZW5kR3JvdXA6IDc3LFxuICBiZWdpbkFubm90YXRpb246IDgwLFxuICBlbmRBbm5vdGF0aW9uOiA4MSxcbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0OiA4MyxcbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IDg0LFxuICBwYWludEltYWdlWE9iamVjdDogODUsXG4gIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OiA4NixcbiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogODcsXG4gIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0OiA4OCxcbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0OiA4OSxcbiAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiA5MCxcbiAgY29uc3RydWN0UGF0aDogOTFcbn07XG5jb25zdCBQYXNzd29yZFJlc3BvbnNlcyA9IHtcbiAgTkVFRF9QQVNTV09SRDogMSxcbiAgSU5DT1JSRUNUX1BBU1NXT1JEOiAyXG59O1xubGV0IHZlcmJvc2l0eSA9IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTO1xuZnVuY3Rpb24gc2V0VmVyYm9zaXR5TGV2ZWwobGV2ZWwpIHtcbiAgaWYgKE51bWJlci5pc0ludGVnZXIobGV2ZWwpKSB7XG4gICAgdmVyYm9zaXR5ID0gbGV2ZWw7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkge1xuICByZXR1cm4gdmVyYm9zaXR5O1xufVxuZnVuY3Rpb24gaW5mbyhtc2cpIHtcbiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUykge1xuICAgIGNvbnNvbGUubG9nKGBJbmZvOiAke21zZ31gKTtcbiAgfVxufVxuZnVuY3Rpb24gd2Fybihtc2cpIHtcbiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUykge1xuICAgIGNvbnNvbGUubG9nKGBXYXJuaW5nOiAke21zZ31gKTtcbiAgfVxufVxuZnVuY3Rpb24gdW5yZWFjaGFibGUobXNnKSB7XG4gIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuZnVuY3Rpb24gYXNzZXJ0KGNvbmQsIG1zZykge1xuICBpZiAoIWNvbmQpIHtcbiAgICB1bnJlYWNoYWJsZShtc2cpO1xuICB9XG59XG5mdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKHVybCkge1xuICBzd2l0Y2ggKHVybD8ucHJvdG9jb2wpIHtcbiAgICBjYXNlIFwiaHR0cDpcIjpcbiAgICBjYXNlIFwiaHR0cHM6XCI6XG4gICAgY2FzZSBcImZ0cDpcIjpcbiAgICBjYXNlIFwibWFpbHRvOlwiOlxuICAgIGNhc2UgXCJ0ZWw6XCI6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgYmFzZVVybCA9IG51bGwsIG9wdGlvbnMgPSBudWxsKSB7XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2YgdXJsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAob3B0aW9ucy5hZGREZWZhdWx0UHJvdG9jb2wgJiYgdXJsLnN0YXJ0c1dpdGgoXCJ3d3cuXCIpKSB7XG4gICAgICAgIGNvbnN0IGRvdHMgPSB1cmwubWF0Y2goL1xcLi9nKTtcbiAgICAgICAgaWYgKGRvdHM/Lmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgdXJsID0gYGh0dHA6Ly8ke3VybH1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy50cnlDb252ZXJ0RW5jb2RpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB1cmwgPSBzdHJpbmdUb1VURjhTdHJpbmcodXJsKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBhYnNvbHV0ZVVybCA9IGJhc2VVcmwgPyBuZXcgVVJMKHVybCwgYmFzZVVybCkgOiBuZXcgVVJMKHVybCk7XG4gICAgaWYgKF9pc1ZhbGlkUHJvdG9jb2woYWJzb2x1dGVVcmwpKSB7XG4gICAgICByZXR1cm4gYWJzb2x1dGVVcmw7XG4gICAgfVxuICB9IGNhdGNoIHt9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gc2hhZG93KG9iaiwgcHJvcCwgdmFsdWUsIG5vblNlcmlhbGl6YWJsZSA9IGZhbHNlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHtcbiAgICB2YWx1ZSxcbiAgICBlbnVtZXJhYmxlOiAhbm9uU2VyaWFsaXphYmxlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmNvbnN0IEJhc2VFeGNlcHRpb24gPSBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpIHtcbiAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VFeGNlcHRpb24pIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUV4Y2VwdGlvbi5cIik7XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuICBCYXNlRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjtcbiAgcmV0dXJuIEJhc2VFeGNlcHRpb247XG59KCk7XG5jbGFzcyBQYXNzd29yZEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2csIGNvZGUpIHtcbiAgICBzdXBlcihtc2csIFwiUGFzc3dvcmRFeGNlcHRpb25cIik7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuY2xhc3MgVW5rbm93bkVycm9yRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgZGV0YWlscykge1xuICAgIHN1cGVyKG1zZywgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIik7XG4gICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgfVxufVxuY2xhc3MgSW52YWxpZFBERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICBzdXBlcihtc2csIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiKTtcbiAgfVxufVxuY2xhc3MgTWlzc2luZ1BERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICBzdXBlcihtc2csIFwiTWlzc2luZ1BERkV4Y2VwdGlvblwiKTtcbiAgfVxufVxuY2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgc3RhdHVzKSB7XG4gICAgc3VwZXIobXNnLCBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiKTtcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgfVxufVxuY2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IobXNnKSB7XG4gICAgc3VwZXIobXNnLCBcIkZvcm1hdEVycm9yXCIpO1xuICB9XG59XG5jbGFzcyBBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICBzdXBlcihtc2csIFwiQWJvcnRFeGNlcHRpb25cIik7XG4gIH1cbn1cbmZ1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoYnl0ZXMpIHtcbiAgaWYgKHR5cGVvZiBieXRlcyAhPT0gXCJvYmplY3RcIiB8fCBieXRlcz8ubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICB1bnJlYWNoYWJsZShcIkludmFsaWQgYXJndW1lbnQgZm9yIGJ5dGVzVG9TdHJpbmdcIik7XG4gIH1cbiAgY29uc3QgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuICBjb25zdCBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyO1xuICBpZiAobGVuZ3RoIDwgTUFYX0FSR1VNRU5UX0NPVU5UKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpO1xuICB9XG4gIGNvbnN0IHN0ckJ1ZiA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSBNQVhfQVJHVU1FTlRfQ09VTlQpIHtcbiAgICBjb25zdCBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7XG4gICAgY29uc3QgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7XG4gICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpO1xuICB9XG4gIHJldHVybiBzdHJCdWYuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdW5yZWFjaGFibGUoXCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmdUb0J5dGVzXCIpO1xuICB9XG4gIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGg7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzW2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICB9XG4gIHJldHVybiBieXRlcztcbn1cbmZ1bmN0aW9uIHN0cmluZzMyKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDI0ICYgMHhmZiwgdmFsdWUgPj4gMTYgJiAweGZmLCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTtcbn1cbmZ1bmN0aW9uIG9iamVjdFNpemUob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIG9iamVjdEZyb21NYXAobWFwKSB7XG4gIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG1hcCkge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCkge1xuICBjb25zdCBidWZmZXI4ID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gIGJ1ZmZlcjhbMF0gPSAxO1xuICBjb25zdCB2aWV3MzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyOC5idWZmZXIsIDAsIDEpO1xuICByZXR1cm4gdmlldzMyWzBdID09PSAxO1xufVxuZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCkge1xuICB0cnkge1xuICAgIG5ldyBGdW5jdGlvbihcIlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5jbGFzcyB1dGlsX0ZlYXR1cmVUZXN0IHtcbiAgc3RhdGljIGdldCBpc0xpdHRsZUVuZGlhbigpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNMaXR0bGVFbmRpYW5cIiwgaXNMaXR0bGVFbmRpYW4oKSk7XG4gIH1cbiAgc3RhdGljIGdldCBpc0V2YWxTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzRXZhbFN1cHBvcnRlZFwiLCBpc0V2YWxTdXBwb3J0ZWQoKSk7XG4gIH1cbiAgc3RhdGljIGdldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWRcIiwgdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gXCJ1bmRlZmluZWRcIik7XG4gIH1cbiAgc3RhdGljIGdldCBwbGF0Zm9ybSgpIHtcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgbmF2aWdhdG9yPy5wbGF0Zm9ybSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcInBsYXRmb3JtXCIsIHtcbiAgICAgICAgaXNNYWM6IG5hdmlnYXRvci5wbGF0Zm9ybS5pbmNsdWRlcyhcIk1hY1wiKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJwbGF0Zm9ybVwiLCB7XG4gICAgICBpc01hYzogZmFsc2VcbiAgICB9KTtcbiAgfVxuICBzdGF0aWMgZ2V0IGlzQ1NTUm91bmRTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzQ1NTUm91bmRTdXBwb3J0ZWRcIiwgZ2xvYmFsVGhpcy5DU1M/LnN1cHBvcnRzPy4oXCJ3aWR0aDogcm91bmQoMS41cHgsIDFweClcIikpO1xuICB9XG59XG5jb25zdCBoZXhOdW1iZXJzID0gQXJyYXkuZnJvbShBcnJheSgyNTYpLmtleXMoKSwgbiA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpO1xuY2xhc3MgVXRpbCB7XG4gIHN0YXRpYyBtYWtlSGV4Q29sb3IociwgZywgYikge1xuICAgIHJldHVybiBgIyR7aGV4TnVtYmVyc1tyXX0ke2hleE51bWJlcnNbZ119JHtoZXhOdW1iZXJzW2JdfWA7XG4gIH1cbiAgc3RhdGljIHNjYWxlTWluTWF4KHRyYW5zZm9ybSwgbWluTWF4KSB7XG4gICAgbGV0IHRlbXA7XG4gICAgaWYgKHRyYW5zZm9ybVswXSkge1xuICAgICAgaWYgKHRyYW5zZm9ybVswXSA8IDApIHtcbiAgICAgICAgdGVtcCA9IG1pbk1heFswXTtcbiAgICAgICAgbWluTWF4WzBdID0gbWluTWF4WzJdO1xuICAgICAgICBtaW5NYXhbMl0gPSB0ZW1wO1xuICAgICAgfVxuICAgICAgbWluTWF4WzBdICo9IHRyYW5zZm9ybVswXTtcbiAgICAgIG1pbk1heFsyXSAqPSB0cmFuc2Zvcm1bMF07XG4gICAgICBpZiAodHJhbnNmb3JtWzNdIDwgMCkge1xuICAgICAgICB0ZW1wID0gbWluTWF4WzFdO1xuICAgICAgICBtaW5NYXhbMV0gPSBtaW5NYXhbM107XG4gICAgICAgIG1pbk1heFszXSA9IHRlbXA7XG4gICAgICB9XG4gICAgICBtaW5NYXhbMV0gKj0gdHJhbnNmb3JtWzNdO1xuICAgICAgbWluTWF4WzNdICo9IHRyYW5zZm9ybVszXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVtcCA9IG1pbk1heFswXTtcbiAgICAgIG1pbk1heFswXSA9IG1pbk1heFsxXTtcbiAgICAgIG1pbk1heFsxXSA9IHRlbXA7XG4gICAgICB0ZW1wID0gbWluTWF4WzJdO1xuICAgICAgbWluTWF4WzJdID0gbWluTWF4WzNdO1xuICAgICAgbWluTWF4WzNdID0gdGVtcDtcbiAgICAgIGlmICh0cmFuc2Zvcm1bMV0gPCAwKSB7XG4gICAgICAgIHRlbXAgPSBtaW5NYXhbMV07XG4gICAgICAgIG1pbk1heFsxXSA9IG1pbk1heFszXTtcbiAgICAgICAgbWluTWF4WzNdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIG1pbk1heFsxXSAqPSB0cmFuc2Zvcm1bMV07XG4gICAgICBtaW5NYXhbM10gKj0gdHJhbnNmb3JtWzFdO1xuICAgICAgaWYgKHRyYW5zZm9ybVsyXSA8IDApIHtcbiAgICAgICAgdGVtcCA9IG1pbk1heFswXTtcbiAgICAgICAgbWluTWF4WzBdID0gbWluTWF4WzJdO1xuICAgICAgICBtaW5NYXhbMl0gPSB0ZW1wO1xuICAgICAgfVxuICAgICAgbWluTWF4WzBdICo9IHRyYW5zZm9ybVsyXTtcbiAgICAgIG1pbk1heFsyXSAqPSB0cmFuc2Zvcm1bMl07XG4gICAgfVxuICAgIG1pbk1heFswXSArPSB0cmFuc2Zvcm1bNF07XG4gICAgbWluTWF4WzFdICs9IHRyYW5zZm9ybVs1XTtcbiAgICBtaW5NYXhbMl0gKz0gdHJhbnNmb3JtWzRdO1xuICAgIG1pbk1heFszXSArPSB0cmFuc2Zvcm1bNV07XG4gIH1cbiAgc3RhdGljIHRyYW5zZm9ybShtMSwgbTIpIHtcbiAgICByZXR1cm4gW20xWzBdICogbTJbMF0gKyBtMVsyXSAqIG0yWzFdLCBtMVsxXSAqIG0yWzBdICsgbTFbM10gKiBtMlsxXSwgbTFbMF0gKiBtMlsyXSArIG0xWzJdICogbTJbM10sIG0xWzFdICogbTJbMl0gKyBtMVszXSAqIG0yWzNdLCBtMVswXSAqIG0yWzRdICsgbTFbMl0gKiBtMls1XSArIG0xWzRdLCBtMVsxXSAqIG0yWzRdICsgbTFbM10gKiBtMls1XSArIG0xWzVdXTtcbiAgfVxuICBzdGF0aWMgYXBwbHlUcmFuc2Zvcm0ocCwgbSkge1xuICAgIGNvbnN0IHh0ID0gcFswXSAqIG1bMF0gKyBwWzFdICogbVsyXSArIG1bNF07XG4gICAgY29uc3QgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTtcbiAgICByZXR1cm4gW3h0LCB5dF07XG4gIH1cbiAgc3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShwLCBtKSB7XG4gICAgY29uc3QgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07XG4gICAgY29uc3QgeHQgPSAocFswXSAqIG1bM10gLSBwWzFdICogbVsyXSArIG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZDtcbiAgICBjb25zdCB5dCA9ICgtcFswXSAqIG1bMV0gKyBwWzFdICogbVswXSArIG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZDtcbiAgICByZXR1cm4gW3h0LCB5dF07XG4gIH1cbiAgc3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHIsIG0pIHtcbiAgICBjb25zdCBwMSA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0ociwgbSk7XG4gICAgY29uc3QgcDIgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKHIuc2xpY2UoMiwgNCksIG0pO1xuICAgIGNvbnN0IHAzID0gdGhpcy5hcHBseVRyYW5zZm9ybShbclswXSwgclszXV0sIG0pO1xuICAgIGNvbnN0IHA0ID0gdGhpcy5hcHBseVRyYW5zZm9ybShbclsyXSwgclsxXV0sIG0pO1xuICAgIHJldHVybiBbTWF0aC5taW4ocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1pbihwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSksIE1hdGgubWF4KHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5tYXgocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pXTtcbiAgfVxuICBzdGF0aWMgaW52ZXJzZVRyYW5zZm9ybShtKSB7XG4gICAgY29uc3QgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07XG4gICAgcmV0dXJuIFttWzNdIC8gZCwgLW1bMV0gLyBkLCAtbVsyXSAvIGQsIG1bMF0gLyBkLCAobVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkLCAobVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkXTtcbiAgfVxuICBzdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobSkge1xuICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTtcbiAgICBjb25zdCBhID0gbVswXSAqIHRyYW5zcG9zZVswXSArIG1bMV0gKiB0cmFuc3Bvc2VbMl07XG4gICAgY29uc3QgYiA9IG1bMF0gKiB0cmFuc3Bvc2VbMV0gKyBtWzFdICogdHJhbnNwb3NlWzNdO1xuICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTtcbiAgICBjb25zdCBkID0gbVsyXSAqIHRyYW5zcG9zZVsxXSArIG1bM10gKiB0cmFuc3Bvc2VbM107XG4gICAgY29uc3QgZmlyc3QgPSAoYSArIGQpIC8gMjtcbiAgICBjb25zdCBzZWNvbmQgPSBNYXRoLnNxcnQoKGEgKyBkKSAqKiAyIC0gNCAqIChhICogZCAtIGMgKiBiKSkgLyAyO1xuICAgIGNvbnN0IHN4ID0gZmlyc3QgKyBzZWNvbmQgfHwgMTtcbiAgICBjb25zdCBzeSA9IGZpcnN0IC0gc2Vjb25kIHx8IDE7XG4gICAgcmV0dXJuIFtNYXRoLnNxcnQoc3gpLCBNYXRoLnNxcnQoc3kpXTtcbiAgfVxuICBzdGF0aWMgbm9ybWFsaXplUmVjdChyZWN0KSB7XG4gICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7XG4gICAgaWYgKHJlY3RbMF0gPiByZWN0WzJdKSB7XG4gICAgICByWzBdID0gcmVjdFsyXTtcbiAgICAgIHJbMl0gPSByZWN0WzBdO1xuICAgIH1cbiAgICBpZiAocmVjdFsxXSA+IHJlY3RbM10pIHtcbiAgICAgIHJbMV0gPSByZWN0WzNdO1xuICAgICAgclszXSA9IHJlY3RbMV07XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIHN0YXRpYyBpbnRlcnNlY3QocmVjdDEsIHJlY3QyKSB7XG4gICAgY29uc3QgeExvdyA9IE1hdGgubWF4KE1hdGgubWluKHJlY3QxWzBdLCByZWN0MVsyXSksIE1hdGgubWluKHJlY3QyWzBdLCByZWN0MlsyXSkpO1xuICAgIGNvbnN0IHhIaWdoID0gTWF0aC5taW4oTWF0aC5tYXgocmVjdDFbMF0sIHJlY3QxWzJdKSwgTWF0aC5tYXgocmVjdDJbMF0sIHJlY3QyWzJdKSk7XG4gICAgaWYgKHhMb3cgPiB4SGlnaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHlMb3cgPSBNYXRoLm1heChNYXRoLm1pbihyZWN0MVsxXSwgcmVjdDFbM10pLCBNYXRoLm1pbihyZWN0MlsxXSwgcmVjdDJbM10pKTtcbiAgICBjb25zdCB5SGlnaCA9IE1hdGgubWluKE1hdGgubWF4KHJlY3QxWzFdLCByZWN0MVszXSksIE1hdGgubWF4KHJlY3QyWzFdLCByZWN0MlszXSkpO1xuICAgIGlmICh5TG93ID4geUhpZ2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gW3hMb3csIHlMb3csIHhIaWdoLCB5SGlnaF07XG4gIH1cbiAgc3RhdGljICNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCB0LCBtaW5NYXgpIHtcbiAgICBpZiAodCA8PSAwIHx8IHQgPj0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtdCA9IDEgLSB0O1xuICAgIGNvbnN0IHR0ID0gdCAqIHQ7XG4gICAgY29uc3QgdHR0ID0gdHQgKiB0O1xuICAgIGNvbnN0IHggPSBtdCAqIChtdCAqIChtdCAqIHgwICsgMyAqIHQgKiB4MSkgKyAzICogdHQgKiB4MikgKyB0dHQgKiB4MztcbiAgICBjb25zdCB5ID0gbXQgKiAobXQgKiAobXQgKiB5MCArIDMgKiB0ICogeTEpICsgMyAqIHR0ICogeTIpICsgdHR0ICogeTM7XG4gICAgbWluTWF4WzBdID0gTWF0aC5taW4obWluTWF4WzBdLCB4KTtcbiAgICBtaW5NYXhbMV0gPSBNYXRoLm1pbihtaW5NYXhbMV0sIHkpO1xuICAgIG1pbk1heFsyXSA9IE1hdGgubWF4KG1pbk1heFsyXSwgeCk7XG4gICAgbWluTWF4WzNdID0gTWF0aC5tYXgobWluTWF4WzNdLCB5KTtcbiAgfVxuICBzdGF0aWMgI2dldEV4dHJlbXVtKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgYSwgYiwgYywgbWluTWF4KSB7XG4gICAgaWYgKE1hdGguYWJzKGEpIDwgMWUtMTIpIHtcbiAgICAgIGlmIChNYXRoLmFicyhiKSA+PSAxZS0xMikge1xuICAgICAgICB0aGlzLiNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCAtYyAvIGIsIG1pbk1heCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRlbHRhID0gYiAqKiAyIC0gNCAqIGMgKiBhO1xuICAgIGlmIChkZWx0YSA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3FydERlbHRhID0gTWF0aC5zcXJ0KGRlbHRhKTtcbiAgICBjb25zdCBhMiA9IDIgKiBhO1xuICAgIHRoaXMuI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsICgtYiArIHNxcnREZWx0YSkgLyBhMiwgbWluTWF4KTtcbiAgICB0aGlzLiNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCAoLWIgLSBzcXJ0RGVsdGEpIC8gYTIsIG1pbk1heCk7XG4gIH1cbiAgc3RhdGljIGJlemllckJvdW5kaW5nQm94KHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgbWluTWF4KSB7XG4gICAgaWYgKG1pbk1heCkge1xuICAgICAgbWluTWF4WzBdID0gTWF0aC5taW4obWluTWF4WzBdLCB4MCwgeDMpO1xuICAgICAgbWluTWF4WzFdID0gTWF0aC5taW4obWluTWF4WzFdLCB5MCwgeTMpO1xuICAgICAgbWluTWF4WzJdID0gTWF0aC5tYXgobWluTWF4WzJdLCB4MCwgeDMpO1xuICAgICAgbWluTWF4WzNdID0gTWF0aC5tYXgobWluTWF4WzNdLCB5MCwgeTMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaW5NYXggPSBbTWF0aC5taW4oeDAsIHgzKSwgTWF0aC5taW4oeTAsIHkzKSwgTWF0aC5tYXgoeDAsIHgzKSwgTWF0aC5tYXgoeTAsIHkzKV07XG4gICAgfVxuICAgIHRoaXMuI2dldEV4dHJlbXVtKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgMyAqICgteDAgKyAzICogKHgxIC0geDIpICsgeDMpLCA2ICogKHgwIC0gMiAqIHgxICsgeDIpLCAzICogKHgxIC0geDApLCBtaW5NYXgpO1xuICAgIHRoaXMuI2dldEV4dHJlbXVtKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgMyAqICgteTAgKyAzICogKHkxIC0geTIpICsgeTMpLCA2ICogKHkwIC0gMiAqIHkxICsgeTIpLCAzICogKHkxIC0geTApLCBtaW5NYXgpO1xuICAgIHJldHVybiBtaW5NYXg7XG4gIH1cbn1cbmNvbnN0IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlID0gKC8qIHVudXNlZCBwdXJlIGV4cHJlc3Npb24gb3Igc3VwZXIgKi8gbnVsbCAmJiAoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MmQ4LCAweDJjNywgMHgyYzYsIDB4MmQ5LCAweDJkZCwgMHgyZGIsIDB4MmRhLCAweDJkYywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgyMDIyLCAweDIwMjAsIDB4MjAyMSwgMHgyMDI2LCAweDIwMTQsIDB4MjAxMywgMHgxOTIsIDB4MjA0NCwgMHgyMDM5LCAweDIwM2EsIDB4MjIxMiwgMHgyMDMwLCAweDIwMWUsIDB4MjAxYywgMHgyMDFkLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFhLCAweDIxMjIsIDB4ZmIwMSwgMHhmYjAyLCAweDE0MSwgMHgxNTIsIDB4MTYwLCAweDE3OCwgMHgxN2QsIDB4MTMxLCAweDE0MiwgMHgxNTMsIDB4MTYxLCAweDE3ZSwgMCwgMHgyMGFjXSkpO1xuZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcoc3RyKSB7XG4gIGlmIChzdHJbMF0gPj0gXCJcXHhFRlwiKSB7XG4gICAgbGV0IGVuY29kaW5nO1xuICAgIGlmIChzdHJbMF0gPT09IFwiXFx4RkVcIiAmJiBzdHJbMV0gPT09IFwiXFx4RkZcIikge1xuICAgICAgZW5jb2RpbmcgPSBcInV0Zi0xNmJlXCI7XG4gICAgICBpZiAoc3RyLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0clswXSA9PT0gXCJcXHhGRlwiICYmIHN0clsxXSA9PT0gXCJcXHhGRVwiKSB7XG4gICAgICBlbmNvZGluZyA9IFwidXRmLTE2bGVcIjtcbiAgICAgIGlmIChzdHIubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3RyWzBdID09PSBcIlxceEVGXCIgJiYgc3RyWzFdID09PSBcIlxceEJCXCIgJiYgc3RyWzJdID09PSBcIlxceEJGXCIpIHtcbiAgICAgIGVuY29kaW5nID0gXCJ1dGYtOFwiO1xuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcsIHtcbiAgICAgICAgICBmYXRhbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyaW5nVG9CeXRlcyhzdHIpO1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKTtcbiAgICAgICAgaWYgKCFkZWNvZGVkLmluY2x1ZGVzKFwiXFx4MWJcIikpIHtcbiAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVjb2RlZC5yZXBsYWNlQWxsKC9cXHgxYlteXFx4MWJdKig/OlxceDFifCQpL2csIFwiXCIpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgd2Fybihgc3RyaW5nVG9QREZTdHJpbmc6IFwiJHtleH1cIi5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3Qgc3RyQnVmID0gW107XG4gIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgY29uc3QgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoY2hhckNvZGUgPT09IDB4MWIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBpaSAmJiBzdHIuY2hhckNvZGVBdChpKSAhPT0gMHgxYikge31cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjb2RlID0gUERGU3RyaW5nVHJhbnNsYXRlVGFibGVbY2hhckNvZGVdO1xuICAgIHN0ckJ1Zi5wdXNoKGNvZGUgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpIDogc3RyLmNoYXJBdChpKSk7XG4gIH1cbiAgcmV0dXJuIHN0ckJ1Zi5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cikge1xuICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzdHIpKTtcbn1cbmZ1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyhzdHIpIHtcbiAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcbn1cbmZ1bmN0aW9uIGlzQXJyYXlFcXVhbChhcnIxLCBhcnIyKSB7XG4gIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDAsIGlpID0gYXJyMS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgaWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGRhdGUgPSBuZXcgRGF0ZSgpKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IFtkYXRlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwgKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIildO1xuICByZXR1cm4gYnVmZmVyLmpvaW4oXCJcIik7XG59XG5sZXQgTm9ybWFsaXplUmVnZXggPSBudWxsO1xubGV0IE5vcm1hbGl6YXRpb25NYXAgPSBudWxsO1xuZnVuY3Rpb24gbm9ybWFsaXplVW5pY29kZShzdHIpIHtcbiAgaWYgKCFOb3JtYWxpemVSZWdleCkge1xuICAgIE5vcm1hbGl6ZVJlZ2V4ID0gLyhbXFx1MDBhMFxcdTAwYjVcXHUwMzdlXFx1MGViM1xcdTIwMDAtXFx1MjAwYVxcdTIwMmZcXHUyMTI2XFx1ZmIwMC1cXHVmYjA0XFx1ZmIwNlxcdWZiMjAtXFx1ZmIzNlxcdWZiMzgtXFx1ZmIzY1xcdWZiM2VcXHVmYjQwLVxcdWZiNDFcXHVmYjQzLVxcdWZiNDRcXHVmYjQ2LVxcdWZiYTFcXHVmYmE0LVxcdWZiYTlcXHVmYmFlLVxcdWZiYjFcXHVmYmQzLVxcdWZiZGNcXHVmYmRlLVxcdWZiZTdcXHVmYmVhLVxcdWZiZjhcXHVmYmZjLVxcdWZiZmRcXHVmYzAwLVxcdWZjNWRcXHVmYzY0LVxcdWZjZjFcXHVmY2Y1LVxcdWZkM2RcXHVmZDg4XFx1ZmRmNFxcdWZkZmEtXFx1ZmRmYlxcdWZlNzFcXHVmZTc3XFx1ZmU3OVxcdWZlN2JcXHVmZTdkXSspfChcXHVmYjA1KykvZ3U7XG4gICAgTm9ybWFsaXphdGlvbk1hcCA9IG5ldyBNYXAoW1tcIu+shVwiLCBcIsW/dFwiXV0pO1xuICB9XG4gIHJldHVybiBzdHIucmVwbGFjZUFsbChOb3JtYWxpemVSZWdleCwgKF8sIHAxLCBwMikgPT4gcDEgPyBwMS5ub3JtYWxpemUoXCJORktDXCIpIDogTm9ybWFsaXphdGlvbk1hcC5nZXQocDIpKTtcbn1cbmZ1bmN0aW9uIGdldFV1aWQoKSB7XG4gIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjcnlwdG8/LnJhbmRvbVVVSUQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICB9XG4gIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgaWYgKHR5cGVvZiBjcnlwdG8gIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGNyeXB0bz8uZ2V0UmFuZG9tVmFsdWVzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ1Zik7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7XG4gICAgICBidWZbaV0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYnl0ZXNUb1N0cmluZyhidWYpO1xufVxuY29uc3QgQW5ub3RhdGlvblByZWZpeCA9IFwicGRmanNfaW50ZXJuYWxfaWRfXCI7XG5jb25zdCBGb250UmVuZGVyT3BzID0ge1xuICBCRVpJRVJfQ1VSVkVfVE86IDAsXG4gIE1PVkVfVE86IDEsXG4gIExJTkVfVE86IDIsXG4gIFFVQURSQVRJQ19DVVJWRV9UTzogMyxcbiAgUkVTVE9SRTogNCxcbiAgU0FWRTogNSxcbiAgU0NBTEU6IDYsXG4gIFRSQU5TRk9STTogNyxcbiAgVFJBTlNMQVRFOiA4XG59O1xuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9iYXNlX2ZhY3RvcnkuanNcblxuY2xhc3MgQmFzZUZpbHRlckZhY3Rvcnkge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUZpbHRlckZhY3RvcnkpIHtcbiAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUZpbHRlckZhY3RvcnkuXCIpO1xuICAgIH1cbiAgfVxuICBhZGRGaWx0ZXIobWFwcykge1xuICAgIHJldHVybiBcIm5vbmVcIjtcbiAgfVxuICBhZGRIQ01GaWx0ZXIoZmdDb2xvciwgYmdDb2xvcikge1xuICAgIHJldHVybiBcIm5vbmVcIjtcbiAgfVxuICBhZGRBbHBoYUZpbHRlcihtYXApIHtcbiAgICByZXR1cm4gXCJub25lXCI7XG4gIH1cbiAgYWRkTHVtaW5vc2l0eUZpbHRlcihtYXApIHtcbiAgICByZXR1cm4gXCJub25lXCI7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0SENNRmlsdGVyKGZpbHRlck5hbWUsIGZnQ29sb3IsIGJnQ29sb3IsIG5ld0ZnQ29sb3IsIG5ld0JnQ29sb3IpIHtcbiAgICByZXR1cm4gXCJub25lXCI7XG4gIH1cbiAgZGVzdHJveShrZWVwSENNID0gZmFsc2UpIHt9XG59XG5jbGFzcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gICNlbmFibGVIV0EgPSBmYWxzZTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGVuYWJsZUhXQSA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ2FudmFzRmFjdG9yeSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlQ2FudmFzRmFjdG9yeS5cIik7XG4gICAgfVxuICAgIHRoaXMuI2VuYWJsZUhXQSA9IGVuYWJsZUhXQTtcbiAgfVxuICBjcmVhdGUod2lkdGgsIGhlaWdodCkge1xuICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNhbnZhcyBzaXplXCIpO1xuICAgIH1cbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbnZhcyxcbiAgICAgIGNvbnRleHQ6IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiwge1xuICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6ICF0aGlzLiNlbmFibGVIV0FcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuICByZXNldChjYW52YXNBbmRDb250ZXh0LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgaWYgKCFjYW52YXNBbmRDb250ZXh0LmNhbnZhcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWRcIik7XG4gICAgfVxuICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNhbnZhcyBzaXplXCIpO1xuICAgIH1cbiAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgfVxuICBkZXN0cm95KGNhbnZhc0FuZENvbnRleHQpIHtcbiAgICBpZiAoIWNhbnZhc0FuZENvbnRleHQuY2FudmFzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW52YXMgaXMgbm90IHNwZWNpZmllZFwiKTtcbiAgICB9XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMud2lkdGggPSAwO1xuICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMgPSBudWxsO1xuICAgIGNhbnZhc0FuZENvbnRleHQuY29udGV4dCA9IG51bGw7XG4gIH1cbiAgX2NyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYF9jcmVhdGVDYW52YXNgIGNhbGxlZC5cIik7XG4gIH1cbn1cbmNsYXNzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBiYXNlVXJsID0gbnVsbCxcbiAgICBpc0NvbXByZXNzZWQgPSB0cnVlXG4gIH0pIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUNNYXBSZWFkZXJGYWN0b3J5KSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDTWFwUmVhZGVyRmFjdG9yeS5cIik7XG4gICAgfVxuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gICAgdGhpcy5pc0NvbXByZXNzZWQgPSBpc0NvbXByZXNzZWQ7XG4gIH1cbiAgYXN5bmMgZmV0Y2goe1xuICAgIG5hbWVcbiAgfSkge1xuICAgIGlmICghdGhpcy5iYXNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBDTWFwIFwiYmFzZVVybFwiIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCwgZW5zdXJlIHRoYXQgJyArICd0aGUgXCJjTWFwVXJsXCIgYW5kIFwiY01hcFBhY2tlZFwiIEFQSSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4nKTtcbiAgICB9XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDTWFwIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLmJhc2VVcmwgKyBuYW1lICsgKHRoaXMuaXNDb21wcmVzc2VkID8gXCIuYmNtYXBcIiA6IFwiXCIpO1xuICAgIGNvbnN0IGNvbXByZXNzaW9uVHlwZSA9IHRoaXMuaXNDb21wcmVzc2VkID8gQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkgOiBDTWFwQ29tcHJlc3Npb25UeXBlLk5PTkU7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgJHt0aGlzLmlzQ29tcHJlc3NlZCA/IFwiYmluYXJ5IFwiIDogXCJcIn1DTWFwIGF0OiAke3VybH1gKTtcbiAgICB9KTtcbiAgfVxuICBfZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYF9mZXRjaERhdGFgIGNhbGxlZC5cIik7XG4gIH1cbn1cbmNsYXNzIEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBiYXNlVXJsID0gbnVsbFxuICB9KSB7XG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkuXCIpO1xuICAgIH1cbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuICB9XG4gIGFzeW5jIGZldGNoKHtcbiAgICBmaWxlbmFtZVxuICB9KSB7XG4gICAgaWYgKCF0aGlzLmJhc2VVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHN0YW5kYXJkIGZvbnQgXCJiYXNlVXJsXCIgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkLCBlbnN1cmUgdGhhdCAnICsgJ3RoZSBcInN0YW5kYXJkRm9udERhdGFVcmxcIiBBUEkgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLicpO1xuICAgIH1cbiAgICBpZiAoIWZpbGVuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGb250IGZpbGVuYW1lIG11c3QgYmUgc3BlY2lmaWVkLlwiKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfSR7ZmlsZW5hbWV9YDtcbiAgICByZXR1cm4gdGhpcy5fZmV0Y2hEYXRhKHVybCkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZm9udCBkYXRhIGF0OiAke3VybH1gKTtcbiAgICB9KTtcbiAgfVxuICBfZmV0Y2hEYXRhKHVybCkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBfZmV0Y2hEYXRhYCBjYWxsZWQuXCIpO1xuICB9XG59XG5jbGFzcyBCYXNlU1ZHRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlU1ZHRmFjdG9yeSkge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU1ZHRmFjdG9yeS5cIik7XG4gICAgfVxuICB9XG4gIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBza2lwRGltZW5zaW9ucyA9IGZhbHNlKSB7XG4gICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgU1ZHIGRpbWVuc2lvbnNcIik7XG4gICAgfVxuICAgIGNvbnN0IHN2ZyA9IHRoaXMuX2NyZWF0ZVNWRyhcInN2ZzpzdmdcIik7XG4gICAgc3ZnLnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gICAgaWYgKCFza2lwRGltZW5zaW9ucykge1xuICAgICAgc3ZnLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofXB4YCk7XG4gICAgICBzdmcuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1weGApO1xuICAgIH1cbiAgICBzdmcuc2V0QXR0cmlidXRlKFwicHJlc2VydmVBc3BlY3RSYXRpb1wiLCBcIm5vbmVcIik7XG4gICAgc3ZnLnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgYDAgMCAke3dpZHRofSAke2hlaWdodH1gKTtcbiAgICByZXR1cm4gc3ZnO1xuICB9XG4gIGNyZWF0ZUVsZW1lbnQodHlwZSkge1xuICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBTVkcgZWxlbWVudCB0eXBlXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlU1ZHKHR5cGUpO1xuICB9XG4gIF9jcmVhdGVTVkcodHlwZSkge1xuICAgIHVucmVhY2hhYmxlKFwiQWJzdHJhY3QgbWV0aG9kIGBfY3JlYXRlU1ZHYCBjYWxsZWQuXCIpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2Rpc3BsYXlfdXRpbHMuanNcblxuXG5jb25zdCBTVkdfTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG5jbGFzcyBQaXhlbHNQZXJJbmNoIHtcbiAgc3RhdGljIENTUyA9IDk2LjA7XG4gIHN0YXRpYyBQREYgPSA3Mi4wO1xuICBzdGF0aWMgUERGX1RPX0NTU19VTklUUyA9IHRoaXMuQ1NTIC8gdGhpcy5QREY7XG59XG5jbGFzcyBET01GaWx0ZXJGYWN0b3J5IGV4dGVuZHMgQmFzZUZpbHRlckZhY3Rvcnkge1xuICAjX2NhY2hlO1xuICAjX2RlZnM7XG4gICNkb2NJZDtcbiAgI2RvY3VtZW50O1xuICAjX2hjbUNhY2hlO1xuICAjaWQgPSAwO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgZG9jSWQsXG4gICAgb3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnRcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLiNkb2NJZCA9IGRvY0lkO1xuICAgIHRoaXMuI2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDtcbiAgfVxuICBnZXQgI2NhY2hlKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2FjaGUgfHw9IG5ldyBNYXAoKTtcbiAgfVxuICBnZXQgI2hjbUNhY2hlKCkge1xuICAgIHJldHVybiB0aGlzLiNfaGNtQ2FjaGUgfHw9IG5ldyBNYXAoKTtcbiAgfVxuICBnZXQgI2RlZnMoKSB7XG4gICAgaWYgKCF0aGlzLiNfZGVmcykge1xuICAgICAgY29uc3QgZGl2ID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3R5bGVcbiAgICAgIH0gPSBkaXY7XG4gICAgICBzdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgIHN0eWxlLmNvbnRhaW4gPSBcInN0cmljdFwiO1xuICAgICAgc3R5bGUud2lkdGggPSBzdHlsZS5oZWlnaHQgPSAwO1xuICAgICAgc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICBzdHlsZS50b3AgPSBzdHlsZS5sZWZ0ID0gMDtcbiAgICAgIHN0eWxlLnpJbmRleCA9IC0xO1xuICAgICAgY29uc3Qgc3ZnID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJzdmdcIik7XG4gICAgICBzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgMCk7XG4gICAgICBzdmcuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIDApO1xuICAgICAgdGhpcy4jX2RlZnMgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImRlZnNcIik7XG4gICAgICBkaXYuYXBwZW5kKHN2Zyk7XG4gICAgICBzdmcuYXBwZW5kKHRoaXMuI19kZWZzKTtcbiAgICAgIHRoaXMuI2RvY3VtZW50LmJvZHkuYXBwZW5kKGRpdik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNfZGVmcztcbiAgfVxuICAjY3JlYXRlVGFibGVzKG1hcHMpIHtcbiAgICBpZiAobWFwcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG1hcFIgPSBtYXBzWzBdO1xuICAgICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlcltpXSA9IG1hcFJbaV0gLyAyNTU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YWJsZSA9IGJ1ZmZlci5qb2luKFwiLFwiKTtcbiAgICAgIHJldHVybiBbdGFibGUsIHRhYmxlLCB0YWJsZV07XG4gICAgfVxuICAgIGNvbnN0IFttYXBSLCBtYXBHLCBtYXBCXSA9IG1hcHM7XG4gICAgY29uc3QgYnVmZmVyUiA9IG5ldyBBcnJheSgyNTYpO1xuICAgIGNvbnN0IGJ1ZmZlckcgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICBjb25zdCBidWZmZXJCID0gbmV3IEFycmF5KDI1Nik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICAgICAgYnVmZmVyUltpXSA9IG1hcFJbaV0gLyAyNTU7XG4gICAgICBidWZmZXJHW2ldID0gbWFwR1tpXSAvIDI1NTtcbiAgICAgIGJ1ZmZlckJbaV0gPSBtYXBCW2ldIC8gMjU1O1xuICAgIH1cbiAgICByZXR1cm4gW2J1ZmZlclIuam9pbihcIixcIiksIGJ1ZmZlckcuam9pbihcIixcIiksIGJ1ZmZlckIuam9pbihcIixcIildO1xuICB9XG4gIGFkZEZpbHRlcihtYXBzKSB7XG4gICAgaWYgKCFtYXBzKSB7XG4gICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgfVxuICAgIGxldCB2YWx1ZSA9IHRoaXMuI2NhY2hlLmdldChtYXBzKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgW3RhYmxlUiwgdGFibGVHLCB0YWJsZUJdID0gdGhpcy4jY3JlYXRlVGFibGVzKG1hcHMpO1xuICAgIGNvbnN0IGtleSA9IG1hcHMubGVuZ3RoID09PSAxID8gdGFibGVSIDogYCR7dGFibGVSfSR7dGFibGVHfSR7dGFibGVCfWA7XG4gICAgdmFsdWUgPSB0aGlzLiNjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuI2NhY2hlLnNldChtYXBzLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1fdHJhbnNmZXJfbWFwXyR7dGhpcy4jaWQrK31gO1xuICAgIGNvbnN0IHVybCA9IGB1cmwoIyR7aWR9KWA7XG4gICAgdGhpcy4jY2FjaGUuc2V0KG1hcHMsIHVybCk7XG4gICAgdGhpcy4jY2FjaGUuc2V0KGtleSwgdXJsKTtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLiNjcmVhdGVGaWx0ZXIoaWQpO1xuICAgIHRoaXMuI2FkZFRyYW5zZmVyTWFwQ29udmVyc2lvbih0YWJsZVIsIHRhYmxlRywgdGFibGVCLCBmaWx0ZXIpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgYWRkSENNRmlsdGVyKGZnQ29sb3IsIGJnQ29sb3IpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtmZ0NvbG9yfS0ke2JnQ29sb3J9YDtcbiAgICBjb25zdCBmaWx0ZXJOYW1lID0gXCJiYXNlXCI7XG4gICAgbGV0IGluZm8gPSB0aGlzLiNoY21DYWNoZS5nZXQoZmlsdGVyTmFtZSk7XG4gICAgaWYgKGluZm8/LmtleSA9PT0ga2V5KSB7XG4gICAgICByZXR1cm4gaW5mby51cmw7XG4gICAgfVxuICAgIGlmIChpbmZvKSB7XG4gICAgICBpbmZvLmZpbHRlcj8ucmVtb3ZlKCk7XG4gICAgICBpbmZvLmtleSA9IGtleTtcbiAgICAgIGluZm8udXJsID0gXCJub25lXCI7XG4gICAgICBpbmZvLmZpbHRlciA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZm8gPSB7XG4gICAgICAgIGtleSxcbiAgICAgICAgdXJsOiBcIm5vbmVcIixcbiAgICAgICAgZmlsdGVyOiBudWxsXG4gICAgICB9O1xuICAgICAgdGhpcy4jaGNtQ2FjaGUuc2V0KGZpbHRlck5hbWUsIGluZm8pO1xuICAgIH1cbiAgICBpZiAoIWZnQ29sb3IgfHwgIWJnQ29sb3IpIHtcbiAgICAgIHJldHVybiBpbmZvLnVybDtcbiAgICB9XG4gICAgY29uc3QgZmdSR0IgPSB0aGlzLiNnZXRSR0IoZmdDb2xvcik7XG4gICAgZmdDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKC4uLmZnUkdCKTtcbiAgICBjb25zdCBiZ1JHQiA9IHRoaXMuI2dldFJHQihiZ0NvbG9yKTtcbiAgICBiZ0NvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoLi4uYmdSR0IpO1xuICAgIHRoaXMuI2RlZnMuc3R5bGUuY29sb3IgPSBcIlwiO1xuICAgIGlmIChmZ0NvbG9yID09PSBcIiMwMDAwMDBcIiAmJiBiZ0NvbG9yID09PSBcIiNmZmZmZmZcIiB8fCBmZ0NvbG9yID09PSBiZ0NvbG9yKSB7XG4gICAgICByZXR1cm4gaW5mby51cmw7XG4gICAgfVxuICAgIGNvbnN0IG1hcCA9IG5ldyBBcnJheSgyNTYpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDI1NTsgaSsrKSB7XG4gICAgICBjb25zdCB4ID0gaSAvIDI1NTtcbiAgICAgIG1hcFtpXSA9IHggPD0gMC4wMzkyOCA/IHggLyAxMi45MiA6ICgoeCArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQ7XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gbWFwLmpvaW4oXCIsXCIpO1xuICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1faGNtX2ZpbHRlcmA7XG4gICAgY29uc3QgZmlsdGVyID0gaW5mby5maWx0ZXIgPSB0aGlzLiNjcmVhdGVGaWx0ZXIoaWQpO1xuICAgIHRoaXMuI2FkZFRyYW5zZmVyTWFwQ29udmVyc2lvbih0YWJsZSwgdGFibGUsIHRhYmxlLCBmaWx0ZXIpO1xuICAgIHRoaXMuI2FkZEdyYXlDb252ZXJzaW9uKGZpbHRlcik7XG4gICAgY29uc3QgZ2V0U3RlcHMgPSAoYywgbikgPT4ge1xuICAgICAgY29uc3Qgc3RhcnQgPSBmZ1JHQltjXSAvIDI1NTtcbiAgICAgIGNvbnN0IGVuZCA9IGJnUkdCW2NdIC8gMjU1O1xuICAgICAgY29uc3QgYXJyID0gbmV3IEFycmF5KG4gKyAxKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG47IGkrKykge1xuICAgICAgICBhcnJbaV0gPSBzdGFydCArIGkgLyBuICogKGVuZCAtIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnIuam9pbihcIixcIik7XG4gICAgfTtcbiAgICB0aGlzLiNhZGRUcmFuc2Zlck1hcENvbnZlcnNpb24oZ2V0U3RlcHMoMCwgNSksIGdldFN0ZXBzKDEsIDUpLCBnZXRTdGVwcygyLCA1KSwgZmlsdGVyKTtcbiAgICBpbmZvLnVybCA9IGB1cmwoIyR7aWR9KWA7XG4gICAgcmV0dXJuIGluZm8udXJsO1xuICB9XG4gIGFkZEFscGhhRmlsdGVyKG1hcCkge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuI2NhY2hlLmdldChtYXApO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBbdGFibGVBXSA9IHRoaXMuI2NyZWF0ZVRhYmxlcyhbbWFwXSk7XG4gICAgY29uc3Qga2V5ID0gYGFscGhhXyR7dGFibGVBfWA7XG4gICAgdmFsdWUgPSB0aGlzLiNjYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuI2NhY2hlLnNldChtYXAsIHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBgZ18ke3RoaXMuI2RvY0lkfV9hbHBoYV9tYXBfJHt0aGlzLiNpZCsrfWA7XG4gICAgY29uc3QgdXJsID0gYHVybCgjJHtpZH0pYDtcbiAgICB0aGlzLiNjYWNoZS5zZXQobWFwLCB1cmwpO1xuICAgIHRoaXMuI2NhY2hlLnNldChrZXksIHVybCk7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy4jY3JlYXRlRmlsdGVyKGlkKTtcbiAgICB0aGlzLiNhZGRUcmFuc2Zlck1hcEFscGhhQ29udmVyc2lvbih0YWJsZUEsIGZpbHRlcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBhZGRMdW1pbm9zaXR5RmlsdGVyKG1hcCkge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuI2NhY2hlLmdldChtYXAgfHwgXCJsdW1pbm9zaXR5XCIpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBsZXQgdGFibGVBLCBrZXk7XG4gICAgaWYgKG1hcCkge1xuICAgICAgW3RhYmxlQV0gPSB0aGlzLiNjcmVhdGVUYWJsZXMoW21hcF0pO1xuICAgICAga2V5ID0gYGx1bWlub3NpdHlfJHt0YWJsZUF9YDtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gXCJsdW1pbm9zaXR5XCI7XG4gICAgfVxuICAgIHZhbHVlID0gdGhpcy4jY2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLiNjYWNoZS5zZXQobWFwLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1fbHVtaW5vc2l0eV9tYXBfJHt0aGlzLiNpZCsrfWA7XG4gICAgY29uc3QgdXJsID0gYHVybCgjJHtpZH0pYDtcbiAgICB0aGlzLiNjYWNoZS5zZXQobWFwLCB1cmwpO1xuICAgIHRoaXMuI2NhY2hlLnNldChrZXksIHVybCk7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy4jY3JlYXRlRmlsdGVyKGlkKTtcbiAgICB0aGlzLiNhZGRMdW1pbm9zaXR5Q29udmVyc2lvbihmaWx0ZXIpO1xuICAgIGlmIChtYXApIHtcbiAgICAgIHRoaXMuI2FkZFRyYW5zZmVyTWFwQWxwaGFDb252ZXJzaW9uKHRhYmxlQSwgZmlsdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBhZGRIaWdobGlnaHRIQ01GaWx0ZXIoZmlsdGVyTmFtZSwgZmdDb2xvciwgYmdDb2xvciwgbmV3RmdDb2xvciwgbmV3QmdDb2xvcikge1xuICAgIGNvbnN0IGtleSA9IGAke2ZnQ29sb3J9LSR7YmdDb2xvcn0tJHtuZXdGZ0NvbG9yfS0ke25ld0JnQ29sb3J9YDtcbiAgICBsZXQgaW5mbyA9IHRoaXMuI2hjbUNhY2hlLmdldChmaWx0ZXJOYW1lKTtcbiAgICBpZiAoaW5mbz8ua2V5ID09PSBrZXkpIHtcbiAgICAgIHJldHVybiBpbmZvLnVybDtcbiAgICB9XG4gICAgaWYgKGluZm8pIHtcbiAgICAgIGluZm8uZmlsdGVyPy5yZW1vdmUoKTtcbiAgICAgIGluZm8ua2V5ID0ga2V5O1xuICAgICAgaW5mby51cmwgPSBcIm5vbmVcIjtcbiAgICAgIGluZm8uZmlsdGVyID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyA9IHtcbiAgICAgICAga2V5LFxuICAgICAgICB1cmw6IFwibm9uZVwiLFxuICAgICAgICBmaWx0ZXI6IG51bGxcbiAgICAgIH07XG4gICAgICB0aGlzLiNoY21DYWNoZS5zZXQoZmlsdGVyTmFtZSwgaW5mbyk7XG4gICAgfVxuICAgIGlmICghZmdDb2xvciB8fCAhYmdDb2xvcikge1xuICAgICAgcmV0dXJuIGluZm8udXJsO1xuICAgIH1cbiAgICBjb25zdCBbZmdSR0IsIGJnUkdCXSA9IFtmZ0NvbG9yLCBiZ0NvbG9yXS5tYXAodGhpcy4jZ2V0UkdCLmJpbmQodGhpcykpO1xuICAgIGxldCBmZ0dyYXkgPSBNYXRoLnJvdW5kKDAuMjEyNiAqIGZnUkdCWzBdICsgMC43MTUyICogZmdSR0JbMV0gKyAwLjA3MjIgKiBmZ1JHQlsyXSk7XG4gICAgbGV0IGJnR3JheSA9IE1hdGgucm91bmQoMC4yMTI2ICogYmdSR0JbMF0gKyAwLjcxNTIgKiBiZ1JHQlsxXSArIDAuMDcyMiAqIGJnUkdCWzJdKTtcbiAgICBsZXQgW25ld0ZnUkdCLCBuZXdCZ1JHQl0gPSBbbmV3RmdDb2xvciwgbmV3QmdDb2xvcl0ubWFwKHRoaXMuI2dldFJHQi5iaW5kKHRoaXMpKTtcbiAgICBpZiAoYmdHcmF5IDwgZmdHcmF5KSB7XG4gICAgICBbZmdHcmF5LCBiZ0dyYXksIG5ld0ZnUkdCLCBuZXdCZ1JHQl0gPSBbYmdHcmF5LCBmZ0dyYXksIG5ld0JnUkdCLCBuZXdGZ1JHQl07XG4gICAgfVxuICAgIHRoaXMuI2RlZnMuc3R5bGUuY29sb3IgPSBcIlwiO1xuICAgIGNvbnN0IGdldFN0ZXBzID0gKGZnLCBiZywgbikgPT4ge1xuICAgICAgY29uc3QgYXJyID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICBjb25zdCBzdGVwID0gKGJnR3JheSAtIGZnR3JheSkgLyBuO1xuICAgICAgY29uc3QgbmV3U3RhcnQgPSBmZyAvIDI1NTtcbiAgICAgIGNvbnN0IG5ld1N0ZXAgPSAoYmcgLSBmZykgLyAoMjU1ICogbik7XG4gICAgICBsZXQgcHJldiA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBuOyBpKyspIHtcbiAgICAgICAgY29uc3QgayA9IE1hdGgucm91bmQoZmdHcmF5ICsgaSAqIHN0ZXApO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG5ld1N0YXJ0ICsgaSAqIG5ld1N0ZXA7XG4gICAgICAgIGZvciAobGV0IGogPSBwcmV2OyBqIDw9IGs7IGorKykge1xuICAgICAgICAgIGFycltqXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHByZXYgPSBrICsgMTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSBwcmV2OyBpIDwgMjU2OyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gYXJyW3ByZXYgLSAxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnIuam9pbihcIixcIik7XG4gICAgfTtcbiAgICBjb25zdCBpZCA9IGBnXyR7dGhpcy4jZG9jSWR9X2hjbV8ke2ZpbHRlck5hbWV9X2ZpbHRlcmA7XG4gICAgY29uc3QgZmlsdGVyID0gaW5mby5maWx0ZXIgPSB0aGlzLiNjcmVhdGVGaWx0ZXIoaWQpO1xuICAgIHRoaXMuI2FkZEdyYXlDb252ZXJzaW9uKGZpbHRlcik7XG4gICAgdGhpcy4jYWRkVHJhbnNmZXJNYXBDb252ZXJzaW9uKGdldFN0ZXBzKG5ld0ZnUkdCWzBdLCBuZXdCZ1JHQlswXSwgNSksIGdldFN0ZXBzKG5ld0ZnUkdCWzFdLCBuZXdCZ1JHQlsxXSwgNSksIGdldFN0ZXBzKG5ld0ZnUkdCWzJdLCBuZXdCZ1JHQlsyXSwgNSksIGZpbHRlcik7XG4gICAgaW5mby51cmwgPSBgdXJsKCMke2lkfSlgO1xuICAgIHJldHVybiBpbmZvLnVybDtcbiAgfVxuICBkZXN0cm95KGtlZXBIQ00gPSBmYWxzZSkge1xuICAgIGlmIChrZWVwSENNICYmIHRoaXMuI2hjbUNhY2hlLnNpemUgIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI19kZWZzKSB7XG4gICAgICB0aGlzLiNfZGVmcy5wYXJlbnROb2RlLnBhcmVudE5vZGUucmVtb3ZlKCk7XG4gICAgICB0aGlzLiNfZGVmcyA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLiNfY2FjaGUpIHtcbiAgICAgIHRoaXMuI19jYWNoZS5jbGVhcigpO1xuICAgICAgdGhpcy4jX2NhY2hlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy4jaWQgPSAwO1xuICB9XG4gICNhZGRMdW1pbm9zaXR5Q29udmVyc2lvbihmaWx0ZXIpIHtcbiAgICBjb25zdCBmZUNvbG9yTWF0cml4ID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJmZUNvbG9yTWF0cml4XCIpO1xuICAgIGZlQ29sb3JNYXRyaXguc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcIm1hdHJpeFwiKTtcbiAgICBmZUNvbG9yTWF0cml4LnNldEF0dHJpYnV0ZShcInZhbHVlc1wiLCBcIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMyAwLjU5IDAuMTEgMCAwXCIpO1xuICAgIGZpbHRlci5hcHBlbmQoZmVDb2xvck1hdHJpeCk7XG4gIH1cbiAgI2FkZEdyYXlDb252ZXJzaW9uKGZpbHRlcikge1xuICAgIGNvbnN0IGZlQ29sb3JNYXRyaXggPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZlQ29sb3JNYXRyaXhcIik7XG4gICAgZmVDb2xvck1hdHJpeC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwibWF0cml4XCIpO1xuICAgIGZlQ29sb3JNYXRyaXguc2V0QXR0cmlidXRlKFwidmFsdWVzXCIsIFwiMC4yMTI2IDAuNzE1MiAwLjA3MjIgMCAwIDAuMjEyNiAwLjcxNTIgMC4wNzIyIDAgMCAwLjIxMjYgMC43MTUyIDAuMDcyMiAwIDAgMCAwIDAgMSAwXCIpO1xuICAgIGZpbHRlci5hcHBlbmQoZmVDb2xvck1hdHJpeCk7XG4gIH1cbiAgI2NyZWF0ZUZpbHRlcihpZCkge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmlsdGVyXCIpO1xuICAgIGZpbHRlci5zZXRBdHRyaWJ1dGUoXCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnNcIiwgXCJzUkdCXCIpO1xuICAgIGZpbHRlci5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBpZCk7XG4gICAgdGhpcy4jZGVmcy5hcHBlbmQoZmlsdGVyKTtcbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG4gICNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgZnVuYywgdGFibGUpIHtcbiAgICBjb25zdCBmZUZ1bmMgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBmdW5jKTtcbiAgICBmZUZ1bmMuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcImRpc2NyZXRlXCIpO1xuICAgIGZlRnVuYy5zZXRBdHRyaWJ1dGUoXCJ0YWJsZVZhbHVlc1wiLCB0YWJsZSk7XG4gICAgZmVDb21wb25lbnRUcmFuc2Zlci5hcHBlbmQoZmVGdW5jKTtcbiAgfVxuICAjYWRkVHJhbnNmZXJNYXBDb252ZXJzaW9uKHJUYWJsZSwgZ1RhYmxlLCBiVGFibGUsIGZpbHRlcikge1xuICAgIGNvbnN0IGZlQ29tcG9uZW50VHJhbnNmZXIgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZlQ29tcG9uZW50VHJhbnNmZXJcIik7XG4gICAgZmlsdGVyLmFwcGVuZChmZUNvbXBvbmVudFRyYW5zZmVyKTtcbiAgICB0aGlzLiNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgXCJmZUZ1bmNSXCIsIHJUYWJsZSk7XG4gICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jR1wiLCBnVGFibGUpO1xuICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY0JcIiwgYlRhYmxlKTtcbiAgfVxuICAjYWRkVHJhbnNmZXJNYXBBbHBoYUNvbnZlcnNpb24oYVRhYmxlLCBmaWx0ZXIpIHtcbiAgICBjb25zdCBmZUNvbXBvbmVudFRyYW5zZmVyID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJmZUNvbXBvbmVudFRyYW5zZmVyXCIpO1xuICAgIGZpbHRlci5hcHBlbmQoZmVDb21wb25lbnRUcmFuc2Zlcik7XG4gICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jQVwiLCBhVGFibGUpO1xuICB9XG4gICNnZXRSR0IoY29sb3IpIHtcbiAgICB0aGlzLiNkZWZzLnN0eWxlLmNvbG9yID0gY29sb3I7XG4gICAgcmV0dXJuIGdldFJHQihnZXRDb21wdXRlZFN0eWxlKHRoaXMuI2RlZnMpLmdldFByb3BlcnR5VmFsdWUoXCJjb2xvclwiKSk7XG4gIH1cbn1cbmNsYXNzIERPTUNhbnZhc0ZhY3RvcnkgZXh0ZW5kcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudCxcbiAgICBlbmFibGVIV0EgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICBlbmFibGVIV0FcbiAgICB9KTtcbiAgICB0aGlzLl9kb2N1bWVudCA9IG93bmVyRG9jdW1lbnQ7XG4gIH1cbiAgX2NyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHJldHVybiBjYW52YXM7XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSh1cmwsIHR5cGUgPSBcInRleHRcIikge1xuICBpZiAoaXNWYWxpZEZldGNoVXJsKHVybCwgZG9jdW1lbnQuYmFzZVVSSSkpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJhcnJheWJ1ZmZlclwiOlxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICAgIGNhc2UgXCJibG9iXCI6XG4gICAgICAgIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCB1cmwsIHRydWUpO1xuICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gdHlwZTtcbiAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgIT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDAgfHwgcmVxdWVzdC5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFycmF5YnVmZmVyXCI6XG4gICAgICAgICAgY2FzZSBcImJsb2JcIjpcbiAgICAgICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXF1ZXN0LnN0YXR1c1RleHQpKTtcbiAgICB9O1xuICAgIHJlcXVlc3Quc2VuZChudWxsKTtcbiAgfSk7XG59XG5jbGFzcyBET01DTWFwUmVhZGVyRmFjdG9yeSBleHRlbmRzIEJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHtcbiAgICByZXR1cm4gZmV0Y2hEYXRhKHVybCwgdGhpcy5pc0NvbXByZXNzZWQgPyBcImFycmF5YnVmZmVyXCIgOiBcInRleHRcIikudGhlbihkYXRhID0+ICh7XG4gICAgICBjTWFwRGF0YTogZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gbmV3IFVpbnQ4QXJyYXkoZGF0YSkgOiBzdHJpbmdUb0J5dGVzKGRhdGEpLFxuICAgICAgY29tcHJlc3Npb25UeXBlXG4gICAgfSkpO1xuICB9XG59XG5jbGFzcyBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBleHRlbmRzIEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG4gIF9mZXRjaERhdGEodXJsKSB7XG4gICAgcmV0dXJuIGZldGNoRGF0YSh1cmwsIFwiYXJyYXlidWZmZXJcIikudGhlbihkYXRhID0+IG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbiAgfVxufVxuY2xhc3MgRE9NU1ZHRmFjdG9yeSBleHRlbmRzIEJhc2VTVkdGYWN0b3J5IHtcbiAgX2NyZWF0ZVNWRyh0eXBlKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIHR5cGUpO1xuICB9XG59XG5jbGFzcyBQYWdlVmlld3BvcnQge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgdmlld0JveCxcbiAgICBzY2FsZSxcbiAgICByb3RhdGlvbixcbiAgICBvZmZzZXRYID0gMCxcbiAgICBvZmZzZXRZID0gMCxcbiAgICBkb250RmxpcCA9IGZhbHNlXG4gIH0pIHtcbiAgICB0aGlzLnZpZXdCb3ggPSB2aWV3Qm94O1xuICAgIHRoaXMuc2NhbGUgPSBzY2FsZTtcbiAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG4gICAgdGhpcy5vZmZzZXRYID0gb2Zmc2V0WDtcbiAgICB0aGlzLm9mZnNldFkgPSBvZmZzZXRZO1xuICAgIGNvbnN0IGNlbnRlclggPSAodmlld0JveFsyXSArIHZpZXdCb3hbMF0pIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0gKHZpZXdCb3hbM10gKyB2aWV3Qm94WzFdKSAvIDI7XG4gICAgbGV0IHJvdGF0ZUEsIHJvdGF0ZUIsIHJvdGF0ZUMsIHJvdGF0ZUQ7XG4gICAgcm90YXRpb24gJT0gMzYwO1xuICAgIGlmIChyb3RhdGlvbiA8IDApIHtcbiAgICAgIHJvdGF0aW9uICs9IDM2MDtcbiAgICB9XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJvdGF0ZUEgPSAtMTtcbiAgICAgICAgcm90YXRlQiA9IDA7XG4gICAgICAgIHJvdGF0ZUMgPSAwO1xuICAgICAgICByb3RhdGVEID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICByb3RhdGVBID0gMDtcbiAgICAgICAgcm90YXRlQiA9IDE7XG4gICAgICAgIHJvdGF0ZUMgPSAxO1xuICAgICAgICByb3RhdGVEID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgcm90YXRlQSA9IDA7XG4gICAgICAgIHJvdGF0ZUIgPSAtMTtcbiAgICAgICAgcm90YXRlQyA9IC0xO1xuICAgICAgICByb3RhdGVEID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJvdGF0ZUEgPSAxO1xuICAgICAgICByb3RhdGVCID0gMDtcbiAgICAgICAgcm90YXRlQyA9IDA7XG4gICAgICAgIHJvdGF0ZUQgPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYWdlVmlld3BvcnQ6IEludmFsaWQgcm90YXRpb24sIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA5MCBkZWdyZWVzLlwiKTtcbiAgICB9XG4gICAgaWYgKGRvbnRGbGlwKSB7XG4gICAgICByb3RhdGVDID0gLXJvdGF0ZUM7XG4gICAgICByb3RhdGVEID0gLXJvdGF0ZUQ7XG4gICAgfVxuICAgIGxldCBvZmZzZXRDYW52YXNYLCBvZmZzZXRDYW52YXNZO1xuICAgIGxldCB3aWR0aCwgaGVpZ2h0O1xuICAgIGlmIChyb3RhdGVBID09PSAwKSB7XG4gICAgICBvZmZzZXRDYW52YXNYID0gTWF0aC5hYnMoY2VudGVyWSAtIHZpZXdCb3hbMV0pICogc2NhbGUgKyBvZmZzZXRYO1xuICAgICAgb2Zmc2V0Q2FudmFzWSA9IE1hdGguYWJzKGNlbnRlclggLSB2aWV3Qm94WzBdKSAqIHNjYWxlICsgb2Zmc2V0WTtcbiAgICAgIHdpZHRoID0gKHZpZXdCb3hbM10gLSB2aWV3Qm94WzFdKSAqIHNjYWxlO1xuICAgICAgaGVpZ2h0ID0gKHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdKSAqIHNjYWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmZzZXRDYW52YXNYID0gTWF0aC5hYnMoY2VudGVyWCAtIHZpZXdCb3hbMF0pICogc2NhbGUgKyBvZmZzZXRYO1xuICAgICAgb2Zmc2V0Q2FudmFzWSA9IE1hdGguYWJzKGNlbnRlclkgLSB2aWV3Qm94WzFdKSAqIHNjYWxlICsgb2Zmc2V0WTtcbiAgICAgIHdpZHRoID0gKHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdKSAqIHNjYWxlO1xuICAgICAgaGVpZ2h0ID0gKHZpZXdCb3hbM10gLSB2aWV3Qm94WzFdKSAqIHNjYWxlO1xuICAgIH1cbiAgICB0aGlzLnRyYW5zZm9ybSA9IFtyb3RhdGVBICogc2NhbGUsIHJvdGF0ZUIgKiBzY2FsZSwgcm90YXRlQyAqIHNjYWxlLCByb3RhdGVEICogc2NhbGUsIG9mZnNldENhbnZhc1ggLSByb3RhdGVBICogc2NhbGUgKiBjZW50ZXJYIC0gcm90YXRlQyAqIHNjYWxlICogY2VudGVyWSwgb2Zmc2V0Q2FudmFzWSAtIHJvdGF0ZUIgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVEICogc2NhbGUgKiBjZW50ZXJZXTtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gIH1cbiAgZ2V0IHJhd0RpbXMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgdmlld0JveFxuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJyYXdEaW1zXCIsIHtcbiAgICAgIHBhZ2VXaWR0aDogdmlld0JveFsyXSAtIHZpZXdCb3hbMF0sXG4gICAgICBwYWdlSGVpZ2h0OiB2aWV3Qm94WzNdIC0gdmlld0JveFsxXSxcbiAgICAgIHBhZ2VYOiB2aWV3Qm94WzBdLFxuICAgICAgcGFnZVk6IHZpZXdCb3hbMV1cbiAgICB9KTtcbiAgfVxuICBjbG9uZSh7XG4gICAgc2NhbGUgPSB0aGlzLnNjYWxlLFxuICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbixcbiAgICBvZmZzZXRYID0gdGhpcy5vZmZzZXRYLFxuICAgIG9mZnNldFkgPSB0aGlzLm9mZnNldFksXG4gICAgZG9udEZsaXAgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgICB2aWV3Qm94OiB0aGlzLnZpZXdCb3guc2xpY2UoKSxcbiAgICAgIHNjYWxlLFxuICAgICAgcm90YXRpb24sXG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WSxcbiAgICAgIGRvbnRGbGlwXG4gICAgfSk7XG4gIH1cbiAgY29udmVydFRvVmlld3BvcnRQb2ludCh4LCB5KSB7XG4gICAgcmV0dXJuIFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3gsIHldLCB0aGlzLnRyYW5zZm9ybSk7XG4gIH1cbiAgY29udmVydFRvVmlld3BvcnRSZWN0YW5nbGUocmVjdCkge1xuICAgIGNvbnN0IHRvcExlZnQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyZWN0WzBdLCByZWN0WzFdXSwgdGhpcy50cmFuc2Zvcm0pO1xuICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0gVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFsyXSwgcmVjdFszXV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgICByZXR1cm4gW3RvcExlZnRbMF0sIHRvcExlZnRbMV0sIGJvdHRvbVJpZ2h0WzBdLCBib3R0b21SaWdodFsxXV07XG4gIH1cbiAgY29udmVydFRvUGRmUG9pbnQoeCwgeSkge1xuICAgIHJldHVybiBVdGlsLmFwcGx5SW52ZXJzZVRyYW5zZm9ybShbeCwgeV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgfVxufVxuY2xhc3MgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG1zZywgZXh0cmFEZWxheSA9IDApIHtcbiAgICBzdXBlcihtc2csIFwiUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uXCIpO1xuICAgIHRoaXMuZXh0cmFEZWxheSA9IGV4dHJhRGVsYXk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRGF0YVNjaGVtZSh1cmwpIHtcbiAgY29uc3QgaWkgPSB1cmwubGVuZ3RoO1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlIChpIDwgaWkgJiYgdXJsW2ldLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIGkrKztcbiAgfVxuICByZXR1cm4gdXJsLnN1YnN0cmluZyhpLCBpICsgNSkudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhOlwiO1xufVxuZnVuY3Rpb24gaXNQZGZGaWxlKGZpbGVuYW1lKSB7XG4gIHJldHVybiB0eXBlb2YgZmlsZW5hbWUgPT09IFwic3RyaW5nXCIgJiYgL1xcLnBkZiQvaS50ZXN0KGZpbGVuYW1lKTtcbn1cbmZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbVVybCh1cmwpIHtcbiAgW3VybF0gPSB1cmwuc3BsaXQoL1sjP10vLCAxKTtcbiAgcmV0dXJuIHVybC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xufVxuZnVuY3Rpb24gZ2V0UGRmRmlsZW5hbWVGcm9tVXJsKHVybCwgZGVmYXVsdEZpbGVuYW1lID0gXCJkb2N1bWVudC5wZGZcIikge1xuICBpZiAodHlwZW9mIHVybCAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBkZWZhdWx0RmlsZW5hbWU7XG4gIH1cbiAgaWYgKGlzRGF0YVNjaGVtZSh1cmwpKSB7XG4gICAgd2FybignZ2V0UGRmRmlsZW5hbWVGcm9tVXJsOiBpZ25vcmUgXCJkYXRhOlwiLVVSTCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4nKTtcbiAgICByZXR1cm4gZGVmYXVsdEZpbGVuYW1lO1xuICB9XG4gIGNvbnN0IHJlVVJJID0gL14oPzooPzpbXjpdKzopP1xcL1xcL1teL10rKT8oW14/I10qKShcXD9bXiNdKik/KCMuKik/JC87XG4gIGNvbnN0IHJlRmlsZW5hbWUgPSAvW14vPyM9XStcXC5wZGZcXGIoPyEuKlxcLnBkZlxcYikvaTtcbiAgY29uc3Qgc3BsaXRVUkkgPSByZVVSSS5leGVjKHVybCk7XG4gIGxldCBzdWdnZXN0ZWRGaWxlbmFtZSA9IHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVsxXSkgfHwgcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzJdKSB8fCByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbM10pO1xuICBpZiAoc3VnZ2VzdGVkRmlsZW5hbWUpIHtcbiAgICBzdWdnZXN0ZWRGaWxlbmFtZSA9IHN1Z2dlc3RlZEZpbGVuYW1lWzBdO1xuICAgIGlmIChzdWdnZXN0ZWRGaWxlbmFtZS5pbmNsdWRlcyhcIiVcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gcmVGaWxlbmFtZS5leGVjKGRlY29kZVVSSUNvbXBvbmVudChzdWdnZXN0ZWRGaWxlbmFtZSkpWzBdO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3VnZ2VzdGVkRmlsZW5hbWUgfHwgZGVmYXVsdEZpbGVuYW1lO1xufVxuY2xhc3MgU3RhdFRpbWVyIHtcbiAgc3RhcnRlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHRpbWVzID0gW107XG4gIHRpbWUobmFtZSkge1xuICAgIGlmIChuYW1lIGluIHRoaXMuc3RhcnRlZCkge1xuICAgICAgd2FybihgVGltZXIgaXMgYWxyZWFkeSBydW5uaW5nIGZvciAke25hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMuc3RhcnRlZFtuYW1lXSA9IERhdGUubm93KCk7XG4gIH1cbiAgdGltZUVuZChuYW1lKSB7XG4gICAgaWYgKCEobmFtZSBpbiB0aGlzLnN0YXJ0ZWQpKSB7XG4gICAgICB3YXJuKGBUaW1lciBoYXMgbm90IGJlZW4gc3RhcnRlZCBmb3IgJHtuYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnRpbWVzLnB1c2goe1xuICAgICAgbmFtZSxcbiAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0ZWRbbmFtZV0sXG4gICAgICBlbmQ6IERhdGUubm93KClcbiAgICB9KTtcbiAgICBkZWxldGUgdGhpcy5zdGFydGVkW25hbWVdO1xuICB9XG4gIHRvU3RyaW5nKCkge1xuICAgIGNvbnN0IG91dEJ1ZiA9IFtdO1xuICAgIGxldCBsb25nZXN0ID0gMDtcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIG5hbWVcbiAgICB9IG9mIHRoaXMudGltZXMpIHtcbiAgICAgIGxvbmdlc3QgPSBNYXRoLm1heChuYW1lLmxlbmd0aCwgbG9uZ2VzdCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kXG4gICAgfSBvZiB0aGlzLnRpbWVzKSB7XG4gICAgICBvdXRCdWYucHVzaChgJHtuYW1lLnBhZEVuZChsb25nZXN0KX0gJHtlbmQgLSBzdGFydH1tc1xcbmApO1xuICAgIH1cbiAgICByZXR1cm4gb3V0QnVmLmpvaW4oXCJcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzVmFsaWRGZXRjaFVybCh1cmwsIGJhc2VVcmwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7XG4gICAgICBwcm90b2NvbFxuICAgIH0gPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpO1xuICAgIHJldHVybiBwcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHByb3RvY29sID09PSBcImh0dHBzOlwiO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG5vQ29udGV4dE1lbnUoZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG59XG5mdW5jdGlvbiBkZXByZWNhdGVkKGRldGFpbHMpIHtcbiAgY29uc29sZS5sb2coXCJEZXByZWNhdGVkIEFQSSB1c2FnZTogXCIgKyBkZXRhaWxzKTtcbn1cbmxldCBwZGZEYXRlU3RyaW5nUmVnZXg7XG5jbGFzcyBQREZEYXRlU3RyaW5nIHtcbiAgc3RhdGljIHRvRGF0ZU9iamVjdChpbnB1dCkge1xuICAgIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcGRmRGF0ZVN0cmluZ1JlZ2V4IHx8PSBuZXcgUmVnRXhwKFwiXkQ6XCIgKyBcIihcXFxcZHs0fSlcIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFtafCt8LV0pP1wiICsgXCIoXFxcXGR7Mn0pP1wiICsgXCInP1wiICsgXCIoXFxcXGR7Mn0pP1wiICsgXCInP1wiKTtcbiAgICBjb25zdCBtYXRjaGVzID0gcGRmRGF0ZVN0cmluZ1JlZ2V4LmV4ZWMoaW5wdXQpO1xuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxMCk7XG4gICAgbGV0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hlc1syXSwgMTApO1xuICAgIG1vbnRoID0gbW9udGggPj0gMSAmJiBtb250aCA8PSAxMiA/IG1vbnRoIC0gMSA6IDA7XG4gICAgbGV0IGRheSA9IHBhcnNlSW50KG1hdGNoZXNbM10sIDEwKTtcbiAgICBkYXkgPSBkYXkgPj0gMSAmJiBkYXkgPD0gMzEgPyBkYXkgOiAxO1xuICAgIGxldCBob3VyID0gcGFyc2VJbnQobWF0Y2hlc1s0XSwgMTApO1xuICAgIGhvdXIgPSBob3VyID49IDAgJiYgaG91ciA8PSAyMyA/IGhvdXIgOiAwO1xuICAgIGxldCBtaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzVdLCAxMCk7XG4gICAgbWludXRlID0gbWludXRlID49IDAgJiYgbWludXRlIDw9IDU5ID8gbWludXRlIDogMDtcbiAgICBsZXQgc2Vjb25kID0gcGFyc2VJbnQobWF0Y2hlc1s2XSwgMTApO1xuICAgIHNlY29uZCA9IHNlY29uZCA+PSAwICYmIHNlY29uZCA8PSA1OSA/IHNlY29uZCA6IDA7XG4gICAgY29uc3QgdW5pdmVyc2FsVGltZVJlbGF0aW9uID0gbWF0Y2hlc1s3XSB8fCBcIlpcIjtcbiAgICBsZXQgb2Zmc2V0SG91ciA9IHBhcnNlSW50KG1hdGNoZXNbOF0sIDEwKTtcbiAgICBvZmZzZXRIb3VyID0gb2Zmc2V0SG91ciA+PSAwICYmIG9mZnNldEhvdXIgPD0gMjMgPyBvZmZzZXRIb3VyIDogMDtcbiAgICBsZXQgb2Zmc2V0TWludXRlID0gcGFyc2VJbnQobWF0Y2hlc1s5XSwgMTApIHx8IDA7XG4gICAgb2Zmc2V0TWludXRlID0gb2Zmc2V0TWludXRlID49IDAgJiYgb2Zmc2V0TWludXRlIDw9IDU5ID8gb2Zmc2V0TWludXRlIDogMDtcbiAgICBpZiAodW5pdmVyc2FsVGltZVJlbGF0aW9uID09PSBcIi1cIikge1xuICAgICAgaG91ciArPSBvZmZzZXRIb3VyO1xuICAgICAgbWludXRlICs9IG9mZnNldE1pbnV0ZTtcbiAgICB9IGVsc2UgaWYgKHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9PT0gXCIrXCIpIHtcbiAgICAgIGhvdXIgLT0gb2Zmc2V0SG91cjtcbiAgICAgIG1pbnV0ZSAtPSBvZmZzZXRNaW51dGU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCkpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRYZmFQYWdlVmlld3BvcnQoeGZhUGFnZSwge1xuICBzY2FsZSA9IDEsXG4gIHJvdGF0aW9uID0gMFxufSkge1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0gPSB4ZmFQYWdlLmF0dHJpYnV0ZXMuc3R5bGU7XG4gIGNvbnN0IHZpZXdCb3ggPSBbMCwgMCwgcGFyc2VJbnQod2lkdGgpLCBwYXJzZUludChoZWlnaHQpXTtcbiAgcmV0dXJuIG5ldyBQYWdlVmlld3BvcnQoe1xuICAgIHZpZXdCb3gsXG4gICAgc2NhbGUsXG4gICAgcm90YXRpb25cbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRSR0IoY29sb3IpIHtcbiAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgY29uc3QgY29sb3JSR0IgPSBwYXJzZUludChjb2xvci5zbGljZSgxKSwgMTYpO1xuICAgIHJldHVybiBbKGNvbG9yUkdCICYgMHhmZjAwMDApID4+IDE2LCAoY29sb3JSR0IgJiAweDAwZmYwMCkgPj4gOCwgY29sb3JSR0IgJiAweDAwMDBmZl07XG4gIH1cbiAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2IoXCIpKSB7XG4gICAgcmV0dXJuIGNvbG9yLnNsaWNlKDQsIC0xKS5zcGxpdChcIixcIikubWFwKHggPT4gcGFyc2VJbnQoeCkpO1xuICB9XG4gIGlmIChjb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcbiAgICByZXR1cm4gY29sb3Iuc2xpY2UoNSwgLTEpLnNwbGl0KFwiLFwiKS5tYXAoeCA9PiBwYXJzZUludCh4KSkuc2xpY2UoMCwgMyk7XG4gIH1cbiAgd2FybihgTm90IGEgdmFsaWQgY29sb3IgZm9ybWF0OiBcIiR7Y29sb3J9XCJgKTtcbiAgcmV0dXJuIFswLCAwLCAwXTtcbn1cbmZ1bmN0aW9uIGdldENvbG9yVmFsdWVzKGNvbG9ycykge1xuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kKHNwYW4pO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgY29sb3JzLmtleXMoKSkge1xuICAgIHNwYW4uc3R5bGUuY29sb3IgPSBuYW1lO1xuICAgIGNvbnN0IGNvbXB1dGVkQ29sb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzcGFuKS5jb2xvcjtcbiAgICBjb2xvcnMuc2V0KG5hbWUsIGdldFJHQihjb21wdXRlZENvbG9yKSk7XG4gIH1cbiAgc3Bhbi5yZW1vdmUoKTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KSB7XG4gIGNvbnN0IHtcbiAgICBhLFxuICAgIGIsXG4gICAgYyxcbiAgICBkLFxuICAgIGUsXG4gICAgZlxuICB9ID0gY3R4LmdldFRyYW5zZm9ybSgpO1xuICByZXR1cm4gW2EsIGIsIGMsIGQsIGUsIGZdO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoY3R4KSB7XG4gIGNvbnN0IHtcbiAgICBhLFxuICAgIGIsXG4gICAgYyxcbiAgICBkLFxuICAgIGUsXG4gICAgZlxuICB9ID0gY3R4LmdldFRyYW5zZm9ybSgpLmludmVydFNlbGYoKTtcbiAgcmV0dXJuIFthLCBiLCBjLCBkLCBlLCBmXTtcbn1cbmZ1bmN0aW9uIHNldExheWVyRGltZW5zaW9ucyhkaXYsIHZpZXdwb3J0LCBtdXN0RmxpcCA9IGZhbHNlLCBtdXN0Um90YXRlID0gdHJ1ZSkge1xuICBpZiAodmlld3BvcnQgaW5zdGFuY2VvZiBQYWdlVmlld3BvcnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0XG4gICAgfSA9IHZpZXdwb3J0LnJhd0RpbXM7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gZGl2O1xuICAgIGNvbnN0IHVzZVJvdW5kID0gdXRpbF9GZWF0dXJlVGVzdC5pc0NTU1JvdW5kU3VwcG9ydGVkO1xuICAgIGNvbnN0IHcgPSBgdmFyKC0tc2NhbGUtZmFjdG9yKSAqICR7cGFnZVdpZHRofXB4YCxcbiAgICAgIGggPSBgdmFyKC0tc2NhbGUtZmFjdG9yKSAqICR7cGFnZUhlaWdodH1weGA7XG4gICAgY29uc3Qgd2lkdGhTdHIgPSB1c2VSb3VuZCA/IGByb3VuZCgke3d9LCAxcHgpYCA6IGBjYWxjKCR7d30pYCxcbiAgICAgIGhlaWdodFN0ciA9IHVzZVJvdW5kID8gYHJvdW5kKCR7aH0sIDFweClgIDogYGNhbGMoJHtofSlgO1xuICAgIGlmICghbXVzdEZsaXAgfHwgdmlld3BvcnQucm90YXRpb24gJSAxODAgPT09IDApIHtcbiAgICAgIHN0eWxlLndpZHRoID0gd2lkdGhTdHI7XG4gICAgICBzdHlsZS5oZWlnaHQgPSBoZWlnaHRTdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlLndpZHRoID0gaGVpZ2h0U3RyO1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gd2lkdGhTdHI7XG4gICAgfVxuICB9XG4gIGlmIChtdXN0Um90YXRlKSB7XG4gICAgZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtbWFpbi1yb3RhdGlvblwiLCB2aWV3cG9ydC5yb3RhdGlvbik7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL3Rvb2xiYXIuanNcblxuY2xhc3MgRWRpdG9yVG9vbGJhciB7XG4gICN0b29sYmFyID0gbnVsbDtcbiAgI2NvbG9yUGlja2VyID0gbnVsbDtcbiAgI2VkaXRvcjtcbiAgI2J1dHRvbnMgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3IgPSBlZGl0b3I7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGVkaXRUb29sYmFyID0gdGhpcy4jdG9vbGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZWRpdFRvb2xiYXIuY2xhc3NOYW1lID0gXCJlZGl0VG9vbGJhclwiO1xuICAgIGVkaXRUb29sYmFyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0b29sYmFyXCIpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgZWRpdFRvb2xiYXIuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGVkaXRUb29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBFZGl0b3JUb29sYmFyLiNwb2ludGVyRG93biwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuI2J1dHRvbnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGJ1dHRvbnMuY2xhc3NOYW1lID0gXCJidXR0b25zXCI7XG4gICAgZWRpdFRvb2xiYXIuYXBwZW5kKGJ1dHRvbnMpO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy4jZWRpdG9yLnRvb2xiYXJQb3NpdGlvbjtcbiAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3R5bGVcbiAgICAgIH0gPSBlZGl0VG9vbGJhcjtcbiAgICAgIGNvbnN0IHggPSB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5kaXJlY3Rpb24gPT09IFwibHRyXCIgPyAxIC0gcG9zaXRpb25bMF0gOiBwb3NpdGlvblswXTtcbiAgICAgIHN0eWxlLmluc2V0SW5saW5lRW5kID0gYCR7MTAwICogeH0lYDtcbiAgICAgIHN0eWxlLnRvcCA9IGBjYWxjKCR7MTAwICogcG9zaXRpb25bMV19JSArIHZhcigtLWVkaXRvci10b29sYmFyLXZlcnQtb2Zmc2V0KSlgO1xuICAgIH1cbiAgICB0aGlzLiNhZGREZWxldGVCdXR0b24oKTtcbiAgICByZXR1cm4gZWRpdFRvb2xiYXI7XG4gIH1cbiAgc3RhdGljICNwb2ludGVyRG93bihlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICAjZm9jdXNJbihlKSB7XG4gICAgdGhpcy4jZWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSBmYWxzZTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICAjZm9jdXNPdXQoZSkge1xuICAgIHRoaXMuI2VkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gdHJ1ZTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICAjYWRkTGlzdGVuZXJzVG9FbGVtZW50KGVsZW1lbnQpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgdGhpcy4jZm9jdXNJbi5iaW5kKHRoaXMpLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgdGhpcy4jZm9jdXNPdXQuYmluZCh0aGlzKSwge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgdGhpcy4jdG9vbGJhci5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIHRoaXMuI2NvbG9yUGlja2VyPy5oaWRlRHJvcGRvd24oKTtcbiAgfVxuICBzaG93KCkge1xuICAgIHRoaXMuI3Rvb2xiYXIuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgfVxuICAjYWRkRGVsZXRlQnV0dG9uKCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uLmNsYXNzTmFtZSA9IFwiZGVsZXRlXCI7XG4gICAgYnV0dG9uLnRhYkluZGV4ID0gMDtcbiAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIGBwZGZqcy1lZGl0b3ItcmVtb3ZlLSR7dGhpcy4jZWRpdG9yLmVkaXRvclR5cGV9LWJ1dHRvbmApO1xuICAgIHRoaXMuI2FkZExpc3RlbmVyc1RvRWxlbWVudChidXR0b24pO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZSA9PiB7XG4gICAgICB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5kZWxldGUoKTtcbiAgICB9LCB7XG4gICAgICBzaWduYWw6IHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLl9zaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLiNidXR0b25zLmFwcGVuZChidXR0b24pO1xuICB9XG4gIGdldCAjZGl2aWRlcigpIHtcbiAgICBjb25zdCBkaXZpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXZpZGVyLmNsYXNzTmFtZSA9IFwiZGl2aWRlclwiO1xuICAgIHJldHVybiBkaXZpZGVyO1xuICB9XG4gIGFkZEFsdFRleHRCdXR0b24oYnV0dG9uKSB7XG4gICAgdGhpcy4jYWRkTGlzdGVuZXJzVG9FbGVtZW50KGJ1dHRvbik7XG4gICAgdGhpcy4jYnV0dG9ucy5wcmVwZW5kKGJ1dHRvbiwgdGhpcy4jZGl2aWRlcik7XG4gIH1cbiAgYWRkQ29sb3JQaWNrZXIoY29sb3JQaWNrZXIpIHtcbiAgICB0aGlzLiNjb2xvclBpY2tlciA9IGNvbG9yUGlja2VyO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGNvbG9yUGlja2VyLnJlbmRlckJ1dHRvbigpO1xuICAgIHRoaXMuI2FkZExpc3RlbmVyc1RvRWxlbWVudChidXR0b24pO1xuICAgIHRoaXMuI2J1dHRvbnMucHJlcGVuZChidXR0b24sIHRoaXMuI2RpdmlkZXIpO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLiN0b29sYmFyLnJlbW92ZSgpO1xuICAgIHRoaXMuI2NvbG9yUGlja2VyPy5kZXN0cm95KCk7XG4gICAgdGhpcy4jY29sb3JQaWNrZXIgPSBudWxsO1xuICB9XG59XG5jbGFzcyBIaWdobGlnaHRUb29sYmFyIHtcbiAgI2J1dHRvbnMgPSBudWxsO1xuICAjdG9vbGJhciA9IG51bGw7XG4gICN1aU1hbmFnZXI7XG4gIGNvbnN0cnVjdG9yKHVpTWFuYWdlcikge1xuICAgIHRoaXMuI3VpTWFuYWdlciA9IHVpTWFuYWdlcjtcbiAgfVxuICAjcmVuZGVyKCkge1xuICAgIGNvbnN0IGVkaXRUb29sYmFyID0gdGhpcy4jdG9vbGJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZWRpdFRvb2xiYXIuY2xhc3NOYW1lID0gXCJlZGl0VG9vbGJhclwiO1xuICAgIGVkaXRUb29sYmFyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0b29sYmFyXCIpO1xuICAgIGVkaXRUb29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICBzaWduYWw6IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsXG4gICAgfSk7XG4gICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuI2J1dHRvbnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGJ1dHRvbnMuY2xhc3NOYW1lID0gXCJidXR0b25zXCI7XG4gICAgZWRpdFRvb2xiYXIuYXBwZW5kKGJ1dHRvbnMpO1xuICAgIHRoaXMuI2FkZEhpZ2hsaWdodEJ1dHRvbigpO1xuICAgIHJldHVybiBlZGl0VG9vbGJhcjtcbiAgfVxuICAjZ2V0TGFzdFBvaW50KGJveGVzLCBpc0xUUikge1xuICAgIGxldCBsYXN0WSA9IDA7XG4gICAgbGV0IGxhc3RYID0gMDtcbiAgICBmb3IgKGNvbnN0IGJveCBvZiBib3hlcykge1xuICAgICAgY29uc3QgeSA9IGJveC55ICsgYm94LmhlaWdodDtcbiAgICAgIGlmICh5IDwgbGFzdFkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB4ID0gYm94LnggKyAoaXNMVFIgPyBib3gud2lkdGggOiAwKTtcbiAgICAgIGlmICh5ID4gbGFzdFkpIHtcbiAgICAgICAgbGFzdFggPSB4O1xuICAgICAgICBsYXN0WSA9IHk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzTFRSKSB7XG4gICAgICAgIGlmICh4ID4gbGFzdFgpIHtcbiAgICAgICAgICBsYXN0WCA9IHg7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoeCA8IGxhc3RYKSB7XG4gICAgICAgIGxhc3RYID0geDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtpc0xUUiA/IDEgLSBsYXN0WCA6IGxhc3RYLCBsYXN0WV07XG4gIH1cbiAgc2hvdyhwYXJlbnQsIGJveGVzLCBpc0xUUikge1xuICAgIGNvbnN0IFt4LCB5XSA9IHRoaXMuI2dldExhc3RQb2ludChib3hlcywgaXNMVFIpO1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuI3Rvb2xiYXIgfHw9IHRoaXMuI3JlbmRlcigpO1xuICAgIHBhcmVudC5hcHBlbmQodGhpcy4jdG9vbGJhcik7XG4gICAgc3R5bGUuaW5zZXRJbmxpbmVFbmQgPSBgJHsxMDAgKiB4fSVgO1xuICAgIHN0eWxlLnRvcCA9IGBjYWxjKCR7MTAwICogeX0lICsgdmFyKC0tZWRpdG9yLXRvb2xiYXItdmVydC1vZmZzZXQpKWA7XG4gIH1cbiAgaGlkZSgpIHtcbiAgICB0aGlzLiN0b29sYmFyLnJlbW92ZSgpO1xuICB9XG4gICNhZGRIaWdobGlnaHRCdXR0b24oKSB7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICBidXR0b24uY2xhc3NOYW1lID0gXCJoaWdobGlnaHRCdXR0b25cIjtcbiAgICBidXR0b24udGFiSW5kZXggPSAwO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgYHBkZmpzLWhpZ2hsaWdodC1mbG9hdGluZy1idXR0b24xYCk7XG4gICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIGJ1dHRvbi5hcHBlbmQoc3Bhbik7XG4gICAgc3Bhbi5jbGFzc05hbWUgPSBcInZpc3VhbGx5SGlkZGVuXCI7XG4gICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1oaWdobGlnaHQtZmxvYXRpbmctYnV0dG9uLWxhYmVsXCIpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLiN1aU1hbmFnZXIuaGlnaGxpZ2h0U2VsZWN0aW9uKFwiZmxvYXRpbmdfYnV0dG9uXCIpO1xuICAgIH0sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuI2J1dHRvbnMuYXBwZW5kKGJ1dHRvbik7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL3Rvb2xzLmpzXG5cblxuXG5mdW5jdGlvbiBiaW5kRXZlbnRzKG9iaiwgZWxlbWVudCwgbmFtZXMpIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIG9ialtuYW1lXS5iaW5kKG9iaikpO1xuICB9XG59XG5mdW5jdGlvbiBvcGFjaXR5VG9IZXgob3BhY2l0eSkge1xuICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1pbigyNTUsIE1hdGgubWF4KDEsIDI1NSAqIG9wYWNpdHkpKSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbn1cbmNsYXNzIElkTWFuYWdlciB7XG4gICNpZCA9IDA7XG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gYCR7QW5ub3RhdGlvbkVkaXRvclByZWZpeH0ke3RoaXMuI2lkKyt9YDtcbiAgfVxufVxuY2xhc3MgSW1hZ2VNYW5hZ2VyIHtcbiAgI2Jhc2VJZCA9IGdldFV1aWQoKTtcbiAgI2lkID0gMDtcbiAgI2NhY2hlID0gbnVsbDtcbiAgc3RhdGljIGdldCBfaXNTVkdGaXR0aW5nQ2FudmFzKCkge1xuICAgIGNvbnN0IHN2ZyA9IGBkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD1VVEYtOCw8c3ZnIHZpZXdCb3g9XCIwIDAgMSAxXCIgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cmVjdCB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIxXCIgc3R5bGU9XCJmaWxsOnJlZDtcIi8+PC9zdmc+YDtcbiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDMpO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiwge1xuICAgICAgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWFnZS5zcmMgPSBzdmc7XG4gICAgY29uc3QgcHJvbWlzZSA9IGltYWdlLmRlY29kZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgY3R4LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMyk7XG4gICAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSkuZGF0YS5idWZmZXIpWzBdID09PSAwO1xuICAgIH0pO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfaXNTVkdGaXR0aW5nQ2FudmFzXCIsIHByb21pc2UpO1xuICB9XG4gIGFzeW5jICNnZXQoa2V5LCByYXdEYXRhKSB7XG4gICAgdGhpcy4jY2FjaGUgfHw9IG5ldyBNYXAoKTtcbiAgICBsZXQgZGF0YSA9IHRoaXMuI2NhY2hlLmdldChrZXkpO1xuICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGRhdGE/LmJpdG1hcCkge1xuICAgICAgZGF0YS5yZWZDb3VudGVyICs9IDE7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgfHw9IHtcbiAgICAgICAgYml0bWFwOiBudWxsLFxuICAgICAgICBpZDogYGltYWdlXyR7dGhpcy4jYmFzZUlkfV8ke3RoaXMuI2lkKyt9YCxcbiAgICAgICAgcmVmQ291bnRlcjogMCxcbiAgICAgICAgaXNTdmc6IGZhbHNlXG4gICAgICB9O1xuICAgICAgbGV0IGltYWdlO1xuICAgICAgaWYgKHR5cGVvZiByYXdEYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGRhdGEudXJsID0gcmF3RGF0YTtcbiAgICAgICAgaW1hZ2UgPSBhd2FpdCBmZXRjaERhdGEocmF3RGF0YSwgXCJibG9iXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW1hZ2UgPSBkYXRhLmZpbGUgPSByYXdEYXRhO1xuICAgICAgfVxuICAgICAgaWYgKGltYWdlLnR5cGUgPT09IFwiaW1hZ2Uvc3ZnK3htbFwiKSB7XG4gICAgICAgIGNvbnN0IG11c3RSZW1vdmVBc3BlY3RSYXRpb1Byb21pc2UgPSBJbWFnZU1hbmFnZXIuX2lzU1ZHRml0dGluZ0NhbnZhcztcbiAgICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBjb25zdCBpbWFnZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgaW1hZ2VFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGRhdGEuYml0bWFwID0gaW1hZ2VFbGVtZW50O1xuICAgICAgICAgICAgZGF0YS5pc1N2ZyA9IHRydWU7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGRhdGEuc3ZnVXJsID0gZmlsZVJlYWRlci5yZXN1bHQ7XG4gICAgICAgICAgICBpbWFnZUVsZW1lbnQuc3JjID0gKGF3YWl0IG11c3RSZW1vdmVBc3BlY3RSYXRpb1Byb21pc2UpID8gYCR7dXJsfSNzdmdWaWV3KHByZXNlcnZlQXNwZWN0UmF0aW8obm9uZSkpYCA6IHVybDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGltYWdlRWxlbWVudC5vbmVycm9yID0gZmlsZVJlYWRlci5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGltYWdlKTtcbiAgICAgICAgYXdhaXQgaW1hZ2VQcm9taXNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5iaXRtYXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChpbWFnZSk7XG4gICAgICB9XG4gICAgICBkYXRhLnJlZkNvdW50ZXIgPSAxO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICBkYXRhID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy4jY2FjaGUuc2V0KGtleSwgZGF0YSk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMuI2NhY2hlLnNldChkYXRhLmlkLCBkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgYXN5bmMgZ2V0RnJvbUZpbGUoZmlsZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxhc3RNb2RpZmllZCxcbiAgICAgIG5hbWUsXG4gICAgICBzaXplLFxuICAgICAgdHlwZVxuICAgIH0gPSBmaWxlO1xuICAgIHJldHVybiB0aGlzLiNnZXQoYCR7bGFzdE1vZGlmaWVkfV8ke25hbWV9XyR7c2l6ZX1fJHt0eXBlfWAsIGZpbGUpO1xuICB9XG4gIGFzeW5jIGdldEZyb21VcmwodXJsKSB7XG4gICAgcmV0dXJuIHRoaXMuI2dldCh1cmwsIHVybCk7XG4gIH1cbiAgYXN5bmMgZ2V0RnJvbUlkKGlkKSB7XG4gICAgdGhpcy4jY2FjaGUgfHw9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy4jY2FjaGUuZ2V0KGlkKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZGF0YS5iaXRtYXApIHtcbiAgICAgIGRhdGEucmVmQ291bnRlciArPSAxO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmIChkYXRhLmZpbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEZyb21GaWxlKGRhdGEuZmlsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldEZyb21VcmwoZGF0YS51cmwpO1xuICB9XG4gIGdldFN2Z1VybChpZCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLiNjYWNoZS5nZXQoaWQpO1xuICAgIGlmICghZGF0YT8uaXNTdmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YS5zdmdVcmw7XG4gIH1cbiAgZGVsZXRlSWQoaWQpIHtcbiAgICB0aGlzLiNjYWNoZSB8fD0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLiNjYWNoZS5nZXQoaWQpO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYXRhLnJlZkNvdW50ZXIgLT0gMTtcbiAgICBpZiAoZGF0YS5yZWZDb3VudGVyICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRhdGEuYml0bWFwID0gbnVsbDtcbiAgfVxuICBpc1ZhbGlkSWQoaWQpIHtcbiAgICByZXR1cm4gaWQuc3RhcnRzV2l0aChgaW1hZ2VfJHt0aGlzLiNiYXNlSWR9X2ApO1xuICB9XG59XG5jbGFzcyBDb21tYW5kTWFuYWdlciB7XG4gICNjb21tYW5kcyA9IFtdO1xuICAjbG9ja2VkID0gZmFsc2U7XG4gICNtYXhTaXplO1xuICAjcG9zaXRpb24gPSAtMTtcbiAgY29uc3RydWN0b3IobWF4U2l6ZSA9IDEyOCkge1xuICAgIHRoaXMuI21heFNpemUgPSBtYXhTaXplO1xuICB9XG4gIGFkZCh7XG4gICAgY21kLFxuICAgIHVuZG8sXG4gICAgcG9zdCxcbiAgICBtdXN0RXhlYyxcbiAgICB0eXBlID0gTmFOLFxuICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGUgPSBmYWxzZSxcbiAgICBrZWVwVW5kbyA9IGZhbHNlXG4gIH0pIHtcbiAgICBpZiAobXVzdEV4ZWMpIHtcbiAgICAgIGNtZCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNhdmUgPSB7XG4gICAgICBjbWQsXG4gICAgICB1bmRvLFxuICAgICAgcG9zdCxcbiAgICAgIHR5cGVcbiAgICB9O1xuICAgIGlmICh0aGlzLiNwb3NpdGlvbiA9PT0gLTEpIHtcbiAgICAgIGlmICh0aGlzLiNjb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuI2NvbW1hbmRzLmxlbmd0aCA9IDA7XG4gICAgICB9XG4gICAgICB0aGlzLiNwb3NpdGlvbiA9IDA7XG4gICAgICB0aGlzLiNjb21tYW5kcy5wdXNoKHNhdmUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAob3ZlcndyaXRlSWZTYW1lVHlwZSAmJiB0aGlzLiNjb21tYW5kc1t0aGlzLiNwb3NpdGlvbl0udHlwZSA9PT0gdHlwZSkge1xuICAgICAgaWYgKGtlZXBVbmRvKSB7XG4gICAgICAgIHNhdmUudW5kbyA9IHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXS51bmRvO1xuICAgICAgfVxuICAgICAgdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dID0gc2F2ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IHRoaXMuI3Bvc2l0aW9uICsgMTtcbiAgICBpZiAobmV4dCA9PT0gdGhpcy4jbWF4U2l6ZSkge1xuICAgICAgdGhpcy4jY29tbWFuZHMuc3BsaWNlKDAsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNwb3NpdGlvbiA9IG5leHQ7XG4gICAgICBpZiAobmV4dCA8IHRoaXMuI2NvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLiNjb21tYW5kcy5zcGxpY2UobmV4dCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI2NvbW1hbmRzLnB1c2goc2F2ZSk7XG4gIH1cbiAgdW5kbygpIHtcbiAgICBpZiAodGhpcy4jcG9zaXRpb24gPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2xvY2tlZCA9IHRydWU7XG4gICAgY29uc3Qge1xuICAgICAgdW5kbyxcbiAgICAgIHBvc3RcbiAgICB9ID0gdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dO1xuICAgIHVuZG8oKTtcbiAgICBwb3N0Py4oKTtcbiAgICB0aGlzLiNsb2NrZWQgPSBmYWxzZTtcbiAgICB0aGlzLiNwb3NpdGlvbiAtPSAxO1xuICB9XG4gIHJlZG8oKSB7XG4gICAgaWYgKHRoaXMuI3Bvc2l0aW9uIDwgdGhpcy4jY29tbWFuZHMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy4jcG9zaXRpb24gKz0gMTtcbiAgICAgIHRoaXMuI2xvY2tlZCA9IHRydWU7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNtZCxcbiAgICAgICAgcG9zdFxuICAgICAgfSA9IHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXTtcbiAgICAgIGNtZCgpO1xuICAgICAgcG9zdD8uKCk7XG4gICAgICB0aGlzLiNsb2NrZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaGFzU29tZXRoaW5nVG9VbmRvKCkge1xuICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbiAhPT0gLTE7XG4gIH1cbiAgaGFzU29tZXRoaW5nVG9SZWRvKCkge1xuICAgIHJldHVybiB0aGlzLiNwb3NpdGlvbiA8IHRoaXMuI2NvbW1hbmRzLmxlbmd0aCAtIDE7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLiNjb21tYW5kcyA9IG51bGw7XG4gIH1cbn1cbmNsYXNzIEtleWJvYXJkTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKGNhbGxiYWNrcykge1xuICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5hbGxLZXlzID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTWFjXG4gICAgfSA9IHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgZm9yIChjb25zdCBba2V5cywgY2FsbGJhY2ssIG9wdGlvbnMgPSB7fV0gb2YgY2FsbGJhY2tzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGNvbnN0IGlzTWFjS2V5ID0ga2V5LnN0YXJ0c1dpdGgoXCJtYWMrXCIpO1xuICAgICAgICBpZiAoaXNNYWMgJiYgaXNNYWNLZXkpIHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5zZXQoa2V5LnNsaWNlKDQpLCB7XG4gICAgICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmFsbEtleXMuYWRkKGtleS5zcGxpdChcIitcIikuYXQoLTEpKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNNYWMgJiYgIWlzTWFjS2V5KSB7XG4gICAgICAgICAgdGhpcy5jYWxsYmFja3Muc2V0KGtleSwge1xuICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5hbGxLZXlzLmFkZChrZXkuc3BsaXQoXCIrXCIpLmF0KC0xKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI3NlcmlhbGl6ZShldmVudCkge1xuICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2goXCJhbHRcIik7XG4gICAgfVxuICAgIGlmIChldmVudC5jdHJsS2V5KSB7XG4gICAgICB0aGlzLmJ1ZmZlci5wdXNoKFwiY3RybFwiKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2goXCJtZXRhXCIpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2goXCJzaGlmdFwiKTtcbiAgICB9XG4gICAgdGhpcy5idWZmZXIucHVzaChldmVudC5rZXkpO1xuICAgIGNvbnN0IHN0ciA9IHRoaXMuYnVmZmVyLmpvaW4oXCIrXCIpO1xuICAgIHRoaXMuYnVmZmVyLmxlbmd0aCA9IDA7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBleGVjKHNlbGYsIGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmFsbEtleXMuaGFzKGV2ZW50LmtleSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuY2FsbGJhY2tzLmdldCh0aGlzLiNzZXJpYWxpemUoZXZlbnQpKTtcbiAgICBpZiAoIWluZm8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgY2FsbGJhY2ssXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGJ1YmJsZXMgPSBmYWxzZSxcbiAgICAgICAgYXJncyA9IFtdLFxuICAgICAgICBjaGVja2VyID0gbnVsbFxuICAgICAgfVxuICAgIH0gPSBpbmZvO1xuICAgIGlmIChjaGVja2VyICYmICFjaGVja2VyKHNlbGYsIGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsYmFjay5iaW5kKHNlbGYsIC4uLmFyZ3MsIGV2ZW50KSgpO1xuICAgIGlmICghYnViYmxlcykge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgQ29sb3JNYW5hZ2VyIHtcbiAgc3RhdGljIF9jb2xvcnNNYXBwaW5nID0gbmV3IE1hcChbW1wiQ2FudmFzVGV4dFwiLCBbMCwgMCwgMF1dLCBbXCJDYW52YXNcIiwgWzI1NSwgMjU1LCAyNTVdXV0pO1xuICBnZXQgX2NvbG9ycygpIHtcbiAgICBjb25zdCBjb2xvcnMgPSBuZXcgTWFwKFtbXCJDYW52YXNUZXh0XCIsIG51bGxdLCBbXCJDYW52YXNcIiwgbnVsbF1dKTtcbiAgICBnZXRDb2xvclZhbHVlcyhjb2xvcnMpO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfY29sb3JzXCIsIGNvbG9ycyk7XG4gIH1cbiAgY29udmVydChjb2xvcikge1xuICAgIGNvbnN0IHJnYiA9IGdldFJHQihjb2xvcik7XG4gICAgaWYgKCF3aW5kb3cubWF0Y2hNZWRpYShcIihmb3JjZWQtY29sb3JzOiBhY3RpdmUpXCIpLm1hdGNoZXMpIHtcbiAgICAgIHJldHVybiByZ2I7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW25hbWUsIFJHQl0gb2YgdGhpcy5fY29sb3JzKSB7XG4gICAgICBpZiAoUkdCLmV2ZXJ5KCh4LCBpKSA9PiB4ID09PSByZ2JbaV0pKSB7XG4gICAgICAgIHJldHVybiBDb2xvck1hbmFnZXIuX2NvbG9yc01hcHBpbmcuZ2V0KG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmdiO1xuICB9XG4gIGdldEhleENvZGUobmFtZSkge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuX2NvbG9ycy5nZXQobmFtZSk7XG4gICAgaWYgKCFyZ2IpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gVXRpbC5tYWtlSGV4Q29sb3IoLi4ucmdiKTtcbiAgfVxufVxuY2xhc3MgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciB7XG4gICNhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICNhY3RpdmVFZGl0b3IgPSBudWxsO1xuICAjYWxsRWRpdG9ycyA9IG5ldyBNYXAoKTtcbiAgI2FsbExheWVycyA9IG5ldyBNYXAoKTtcbiAgI2FsdFRleHRNYW5hZ2VyID0gbnVsbDtcbiAgI2Fubm90YXRpb25TdG9yYWdlID0gbnVsbDtcbiAgI2NoYW5nZWRFeGlzdGluZ0Fubm90YXRpb25zID0gbnVsbDtcbiAgI2NvbW1hbmRNYW5hZ2VyID0gbmV3IENvbW1hbmRNYW5hZ2VyKCk7XG4gICNjdXJyZW50UGFnZUluZGV4ID0gMDtcbiAgI2RlbGV0ZWRBbm5vdGF0aW9uc0VsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gICNkcmFnZ2luZ0VkaXRvcnMgPSBudWxsO1xuICAjZWRpdG9yVHlwZXMgPSBudWxsO1xuICAjZWRpdG9yc1RvUmVzY2FsZSA9IG5ldyBTZXQoKTtcbiAgI2VuYWJsZUhpZ2hsaWdodEZsb2F0aW5nQnV0dG9uID0gZmFsc2U7XG4gICNmaWx0ZXJGYWN0b3J5ID0gbnVsbDtcbiAgI2ZvY3VzTWFpbkNvbnRhaW5lclRpbWVvdXRJZCA9IG51bGw7XG4gICNoaWdobGlnaHRDb2xvcnMgPSBudWxsO1xuICAjaGlnaGxpZ2h0V2hlblNoaWZ0VXAgPSBmYWxzZTtcbiAgI2hpZ2hsaWdodFRvb2xiYXIgPSBudWxsO1xuICAjaWRNYW5hZ2VyID0gbmV3IElkTWFuYWdlcigpO1xuICAjaXNFbmFibGVkID0gZmFsc2U7XG4gICNpc1dhaXRpbmcgPSBmYWxzZTtcbiAgI2xhc3RBY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgI21haW5IaWdobGlnaHRDb2xvclBpY2tlciA9IG51bGw7XG4gICNtbE1hbmFnZXIgPSBudWxsO1xuICAjbW9kZSA9IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkU7XG4gICNzZWxlY3RlZEVkaXRvcnMgPSBuZXcgU2V0KCk7XG4gICNzZWxlY3RlZFRleHROb2RlID0gbnVsbDtcbiAgI3BhZ2VDb2xvcnMgPSBudWxsO1xuICAjc2hvd0FsbFN0YXRlcyA9IG51bGw7XG4gICNib3VuZEJsdXIgPSB0aGlzLmJsdXIuYmluZCh0aGlzKTtcbiAgI2JvdW5kRm9jdXMgPSB0aGlzLmZvY3VzLmJpbmQodGhpcyk7XG4gICNib3VuZENvcHkgPSB0aGlzLmNvcHkuYmluZCh0aGlzKTtcbiAgI2JvdW5kQ3V0ID0gdGhpcy5jdXQuYmluZCh0aGlzKTtcbiAgI2JvdW5kUGFzdGUgPSB0aGlzLnBhc3RlLmJpbmQodGhpcyk7XG4gICNib3VuZEtleWRvd24gPSB0aGlzLmtleWRvd24uYmluZCh0aGlzKTtcbiAgI2JvdW5kS2V5dXAgPSB0aGlzLmtleXVwLmJpbmQodGhpcyk7XG4gICNib3VuZE9uRWRpdGluZ0FjdGlvbiA9IHRoaXMub25FZGl0aW5nQWN0aW9uLmJpbmQodGhpcyk7XG4gICNib3VuZE9uUGFnZUNoYW5naW5nID0gdGhpcy5vblBhZ2VDaGFuZ2luZy5iaW5kKHRoaXMpO1xuICAjYm91bmRPblNjYWxlQ2hhbmdpbmcgPSB0aGlzLm9uU2NhbGVDaGFuZ2luZy5iaW5kKHRoaXMpO1xuICAjYm91bmRPblJvdGF0aW9uQ2hhbmdpbmcgPSB0aGlzLm9uUm90YXRpb25DaGFuZ2luZy5iaW5kKHRoaXMpO1xuICAjcHJldmlvdXNTdGF0ZXMgPSB7XG4gICAgaXNFZGl0aW5nOiBmYWxzZSxcbiAgICBpc0VtcHR5OiB0cnVlLFxuICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogZmFsc2UsXG4gICAgaGFzU29tZXRoaW5nVG9SZWRvOiBmYWxzZSxcbiAgICBoYXNTZWxlY3RlZEVkaXRvcjogZmFsc2UsXG4gICAgaGFzU2VsZWN0ZWRUZXh0OiBmYWxzZVxuICB9O1xuICAjdHJhbnNsYXRpb24gPSBbMCwgMF07XG4gICN0cmFuc2xhdGlvblRpbWVvdXRJZCA9IG51bGw7XG4gICNjb250YWluZXIgPSBudWxsO1xuICAjdmlld2VyID0gbnVsbDtcbiAgc3RhdGljIFRSQU5TTEFURV9TTUFMTCA9IDE7XG4gIHN0YXRpYyBUUkFOU0xBVEVfQklHID0gMTA7XG4gIHN0YXRpYyBnZXQgX2tleWJvYXJkTWFuYWdlcigpIHtcbiAgICBjb25zdCBwcm90byA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIucHJvdG90eXBlO1xuICAgIGNvbnN0IGFycm93Q2hlY2tlciA9IHNlbGYgPT4gc2VsZi4jY29udGFpbmVyLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQudGFnTmFtZSAhPT0gXCJCVVRUT05cIiAmJiBzZWxmLmhhc1NvbWV0aGluZ1RvQ29udHJvbCgpO1xuICAgIGNvbnN0IHRleHRJbnB1dENoZWNrZXIgPSAoX3NlbGYsIHtcbiAgICAgIHRhcmdldDogZWxcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoZWwgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB0eXBlXG4gICAgICAgIH0gPSBlbDtcbiAgICAgICAgcmV0dXJuIHR5cGUgIT09IFwidGV4dFwiICYmIHR5cGUgIT09IFwibnVtYmVyXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIGNvbnN0IHNtYWxsID0gdGhpcy5UUkFOU0xBVEVfU01BTEw7XG4gICAgY29uc3QgYmlnID0gdGhpcy5UUkFOU0xBVEVfQklHO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfa2V5Ym9hcmRNYW5hZ2VyXCIsIG5ldyBLZXlib2FyZE1hbmFnZXIoW1tbXCJjdHJsK2FcIiwgXCJtYWMrbWV0YSthXCJdLCBwcm90by5zZWxlY3RBbGwsIHtcbiAgICAgIGNoZWNrZXI6IHRleHRJbnB1dENoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrelwiLCBcIm1hYyttZXRhK3pcIl0sIHByb3RvLnVuZG8sIHtcbiAgICAgIGNoZWNrZXI6IHRleHRJbnB1dENoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwreVwiLCBcImN0cmwrc2hpZnQrelwiLCBcIm1hYyttZXRhK3NoaWZ0K3pcIiwgXCJjdHJsK3NoaWZ0K1pcIiwgXCJtYWMrbWV0YStzaGlmdCtaXCJdLCBwcm90by5yZWRvLCB7XG4gICAgICBjaGVja2VyOiB0ZXh0SW5wdXRDaGVja2VyXG4gICAgfV0sIFtbXCJCYWNrc3BhY2VcIiwgXCJhbHQrQmFja3NwYWNlXCIsIFwiY3RybCtCYWNrc3BhY2VcIiwgXCJzaGlmdCtCYWNrc3BhY2VcIiwgXCJtYWMrQmFja3NwYWNlXCIsIFwibWFjK2FsdCtCYWNrc3BhY2VcIiwgXCJtYWMrY3RybCtCYWNrc3BhY2VcIiwgXCJEZWxldGVcIiwgXCJjdHJsK0RlbGV0ZVwiLCBcInNoaWZ0K0RlbGV0ZVwiLCBcIm1hYytEZWxldGVcIl0sIHByb3RvLmRlbGV0ZSwge1xuICAgICAgY2hlY2tlcjogdGV4dElucHV0Q2hlY2tlclxuICAgIH1dLCBbW1wiRW50ZXJcIiwgXCJtYWMrRW50ZXJcIl0sIHByb3RvLmFkZE5ld0VkaXRvckZyb21LZXlib2FyZCwge1xuICAgICAgY2hlY2tlcjogKHNlbGYsIHtcbiAgICAgICAgdGFyZ2V0OiBlbFxuICAgICAgfSkgPT4gIShlbCBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50KSAmJiBzZWxmLiNjb250YWluZXIuY29udGFpbnMoZWwpICYmICFzZWxmLmlzRW50ZXJIYW5kbGVkXG4gICAgfV0sIFtbXCIgXCIsIFwibWFjKyBcIl0sIHByb3RvLmFkZE5ld0VkaXRvckZyb21LZXlib2FyZCwge1xuICAgICAgY2hlY2tlcjogKHNlbGYsIHtcbiAgICAgICAgdGFyZ2V0OiBlbFxuICAgICAgfSkgPT4gIShlbCBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50KSAmJiBzZWxmLiNjb250YWluZXIuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcbiAgICB9XSwgW1tcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIHByb3RvLnVuc2VsZWN0QWxsXSwgW1tcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogWy1zbWFsbCwgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dMZWZ0XCIsIFwibWFjK3NoaWZ0K0Fycm93TGVmdFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbLWJpZywgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbc21hbGwsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93UmlnaHRcIiwgXCJtYWMrc2hpZnQrQXJyb3dSaWdodFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbYmlnLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiQXJyb3dVcFwiLCBcIm1hYytBcnJvd1VwXCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFswLCAtc21hbGxdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93VXBcIiwgXCJtYWMrc2hpZnQrQXJyb3dVcFwiXSwgcHJvdG8udHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICBhcmdzOiBbMCwgLWJpZ10sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHByb3RvLnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgYXJnczogWzAsIHNtYWxsXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd0Rvd25cIiwgXCJtYWMrc2hpZnQrQXJyb3dEb3duXCJdLCBwcm90by50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgIGFyZ3M6IFswLCBiaWddLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV1dKSk7XG4gIH1cbiAgY29uc3RydWN0b3IoY29udGFpbmVyLCB2aWV3ZXIsIGFsdFRleHRNYW5hZ2VyLCBldmVudEJ1cywgcGRmRG9jdW1lbnQsIHBhZ2VDb2xvcnMsIGhpZ2hsaWdodENvbG9ycywgZW5hYmxlSGlnaGxpZ2h0RmxvYXRpbmdCdXR0b24sIG1sTWFuYWdlcikge1xuICAgIHRoaXMuX3NpZ25hbCA9IHRoaXMuI2Fib3J0Q29udHJvbGxlci5zaWduYWw7XG4gICAgdGhpcy4jY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuI3ZpZXdlciA9IHZpZXdlcjtcbiAgICB0aGlzLiNhbHRUZXh0TWFuYWdlciA9IGFsdFRleHRNYW5hZ2VyO1xuICAgIHRoaXMuX2V2ZW50QnVzID0gZXZlbnRCdXM7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29uKFwiZWRpdGluZ2FjdGlvblwiLCB0aGlzLiNib3VuZE9uRWRpdGluZ0FjdGlvbik7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29uKFwicGFnZWNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25QYWdlQ2hhbmdpbmcpO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vbihcInNjYWxlY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblNjYWxlQ2hhbmdpbmcpO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vbihcInJvdGF0aW9uY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblJvdGF0aW9uQ2hhbmdpbmcpO1xuICAgIHRoaXMuI2FkZFNlbGVjdGlvbkxpc3RlbmVyKCk7XG4gICAgdGhpcy4jYWRkRHJhZ0FuZERyb3BMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLiNhZGRLZXlib2FyZE1hbmFnZXIoKTtcbiAgICB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZSA9IHBkZkRvY3VtZW50LmFubm90YXRpb25TdG9yYWdlO1xuICAgIHRoaXMuI2ZpbHRlckZhY3RvcnkgPSBwZGZEb2N1bWVudC5maWx0ZXJGYWN0b3J5O1xuICAgIHRoaXMuI3BhZ2VDb2xvcnMgPSBwYWdlQ29sb3JzO1xuICAgIHRoaXMuI2hpZ2hsaWdodENvbG9ycyA9IGhpZ2hsaWdodENvbG9ycyB8fCBudWxsO1xuICAgIHRoaXMuI2VuYWJsZUhpZ2hsaWdodEZsb2F0aW5nQnV0dG9uID0gZW5hYmxlSGlnaGxpZ2h0RmxvYXRpbmdCdXR0b247XG4gICAgdGhpcy4jbWxNYW5hZ2VyID0gbWxNYW5hZ2VyIHx8IG51bGw7XG4gICAgdGhpcy52aWV3UGFyYW1ldGVycyA9IHtcbiAgICAgIHJlYWxTY2FsZTogUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTLFxuICAgICAgcm90YXRpb246IDBcbiAgICB9O1xuICAgIHRoaXMuaXNTaGlmdEtleURvd24gPSBmYWxzZTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuI2Fib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB0aGlzLiNhYm9ydENvbnRyb2xsZXIgPSBudWxsO1xuICAgIHRoaXMuX3NpZ25hbCA9IG51bGw7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29mZihcImVkaXRpbmdhY3Rpb25cIiwgdGhpcy4jYm91bmRPbkVkaXRpbmdBY3Rpb24pO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vZmYoXCJwYWdlY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblBhZ2VDaGFuZ2luZyk7XG4gICAgdGhpcy5fZXZlbnRCdXMuX29mZihcInNjYWxlY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblNjYWxlQ2hhbmdpbmcpO1xuICAgIHRoaXMuX2V2ZW50QnVzLl9vZmYoXCJyb3RhdGlvbmNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25Sb3RhdGlvbkNoYW5naW5nKTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuICAgICAgbGF5ZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLiNhbGxMYXllcnMuY2xlYXIoKTtcbiAgICB0aGlzLiNhbGxFZGl0b3JzLmNsZWFyKCk7XG4gICAgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZS5jbGVhcigpO1xuICAgIHRoaXMuI2FjdGl2ZUVkaXRvciA9IG51bGw7XG4gICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmNsZWFyKCk7XG4gICAgdGhpcy4jY29tbWFuZE1hbmFnZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuI2FsdFRleHRNYW5hZ2VyPy5kZXN0cm95KCk7XG4gICAgdGhpcy4jaGlnaGxpZ2h0VG9vbGJhcj8uaGlkZSgpO1xuICAgIHRoaXMuI2hpZ2hsaWdodFRvb2xiYXIgPSBudWxsO1xuICAgIGlmICh0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQpO1xuICAgICAgdGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQpO1xuICAgICAgdGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBhc3luYyBtbEd1ZXNzKGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy4jbWxNYW5hZ2VyPy5ndWVzcyhkYXRhKSB8fCBudWxsO1xuICB9XG4gIGdldCBoYXNNTE1hbmFnZXIoKSB7XG4gICAgcmV0dXJuICEhdGhpcy4jbWxNYW5hZ2VyO1xuICB9XG4gIGdldCBoY21GaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImhjbUZpbHRlclwiLCB0aGlzLiNwYWdlQ29sb3JzID8gdGhpcy4jZmlsdGVyRmFjdG9yeS5hZGRIQ01GaWx0ZXIodGhpcy4jcGFnZUNvbG9ycy5mb3JlZ3JvdW5kLCB0aGlzLiNwYWdlQ29sb3JzLmJhY2tncm91bmQpIDogXCJub25lXCIpO1xuICB9XG4gIGdldCBkaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImRpcmVjdGlvblwiLCBnZXRDb21wdXRlZFN0eWxlKHRoaXMuI2NvbnRhaW5lcikuZGlyZWN0aW9uKTtcbiAgfVxuICBnZXQgaGlnaGxpZ2h0Q29sb3JzKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJoaWdobGlnaHRDb2xvcnNcIiwgdGhpcy4jaGlnaGxpZ2h0Q29sb3JzID8gbmV3IE1hcCh0aGlzLiNoaWdobGlnaHRDb2xvcnMuc3BsaXQoXCIsXCIpLm1hcChwYWlyID0+IHBhaXIuc3BsaXQoXCI9XCIpLm1hcCh4ID0+IHgudHJpbSgpKSkpIDogbnVsbCk7XG4gIH1cbiAgZ2V0IGhpZ2hsaWdodENvbG9yTmFtZXMoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImhpZ2hsaWdodENvbG9yTmFtZXNcIiwgdGhpcy5oaWdobGlnaHRDb2xvcnMgPyBuZXcgTWFwKEFycmF5LmZyb20odGhpcy5oaWdobGlnaHRDb2xvcnMsIGUgPT4gZS5yZXZlcnNlKCkpKSA6IG51bGwpO1xuICB9XG4gIHNldE1haW5IaWdobGlnaHRDb2xvclBpY2tlcihjb2xvclBpY2tlcikge1xuICAgIHRoaXMuI21haW5IaWdobGlnaHRDb2xvclBpY2tlciA9IGNvbG9yUGlja2VyO1xuICB9XG4gIGVkaXRBbHRUZXh0KGVkaXRvcikge1xuICAgIHRoaXMuI2FsdFRleHRNYW5hZ2VyPy5lZGl0QWx0VGV4dCh0aGlzLCBlZGl0b3IpO1xuICB9XG4gIG9uUGFnZUNoYW5naW5nKHtcbiAgICBwYWdlTnVtYmVyXG4gIH0pIHtcbiAgICB0aGlzLiNjdXJyZW50UGFnZUluZGV4ID0gcGFnZU51bWJlciAtIDE7XG4gIH1cbiAgZm9jdXNNYWluQ29udGFpbmVyKCkge1xuICAgIHRoaXMuI2NvbnRhaW5lci5mb2N1cygpO1xuICB9XG4gIGZpbmRQYXJlbnQoeCwgeSkge1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IGxheWVyWCxcbiAgICAgICAgeTogbGF5ZXJZLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9ID0gbGF5ZXIuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHggPj0gbGF5ZXJYICYmIHggPD0gbGF5ZXJYICsgd2lkdGggJiYgeSA+PSBsYXllclkgJiYgeSA8PSBsYXllclkgKyBoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIGxheWVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBkaXNhYmxlVXNlclNlbGVjdCh2YWx1ZSA9IGZhbHNlKSB7XG4gICAgdGhpcy4jdmlld2VyLmNsYXNzTGlzdC50b2dnbGUoXCJub1VzZXJTZWxlY3RcIiwgdmFsdWUpO1xuICB9XG4gIGFkZFNob3VsZFJlc2NhbGUoZWRpdG9yKSB7XG4gICAgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZS5hZGQoZWRpdG9yKTtcbiAgfVxuICByZW1vdmVTaG91bGRSZXNjYWxlKGVkaXRvcikge1xuICAgIHRoaXMuI2VkaXRvcnNUb1Jlc2NhbGUuZGVsZXRlKGVkaXRvcik7XG4gIH1cbiAgb25TY2FsZUNoYW5naW5nKHtcbiAgICBzY2FsZVxuICB9KSB7XG4gICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuICAgIHRoaXMudmlld1BhcmFtZXRlcnMucmVhbFNjYWxlID0gc2NhbGUgKiBQaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFM7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZSkge1xuICAgICAgZWRpdG9yLm9uU2NhbGVDaGFuZ2luZygpO1xuICAgIH1cbiAgfVxuICBvblJvdGF0aW9uQ2hhbmdpbmcoe1xuICAgIHBhZ2VzUm90YXRpb25cbiAgfSkge1xuICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICB0aGlzLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uID0gcGFnZXNSb3RhdGlvbjtcbiAgfVxuICAjZ2V0QW5jaG9yRWxlbWVudEZvclNlbGVjdGlvbih7XG4gICAgYW5jaG9yTm9kZVxuICB9KSB7XG4gICAgcmV0dXJuIGFuY2hvck5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFID8gYW5jaG9yTm9kZS5wYXJlbnRFbGVtZW50IDogYW5jaG9yTm9kZTtcbiAgfVxuICBoaWdobGlnaHRTZWxlY3Rpb24obWV0aG9kT2ZDcmVhdGlvbiA9IFwiXCIpIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24uaXNDb2xsYXBzZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYW5jaG9yTm9kZSxcbiAgICAgIGFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0XG4gICAgfSA9IHNlbGVjdGlvbjtcbiAgICBjb25zdCB0ZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgYW5jaG9yRWxlbWVudCA9IHRoaXMuI2dldEFuY2hvckVsZW1lbnRGb3JTZWxlY3Rpb24oc2VsZWN0aW9uKTtcbiAgICBjb25zdCB0ZXh0TGF5ZXIgPSBhbmNob3JFbGVtZW50LmNsb3Nlc3QoXCIudGV4dExheWVyXCIpO1xuICAgIGNvbnN0IGJveGVzID0gdGhpcy5nZXRTZWxlY3Rpb25Cb3hlcyh0ZXh0TGF5ZXIpO1xuICAgIGlmICghYm94ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2VsZWN0aW9uLmVtcHR5KCk7XG4gICAgaWYgKHRoaXMuI21vZGUgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUpIHtcbiAgICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKFwic2hvd2Fubm90YXRpb25lZGl0b3J1aVwiLCB7XG4gICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgbW9kZTogQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2hvd0FsbEVkaXRvcnMoXCJoaWdobGlnaHRcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG4gICAgICBpZiAobGF5ZXIuaGFzVGV4dExheWVyKHRleHRMYXllcikpIHtcbiAgICAgICAgbGF5ZXIuY3JlYXRlQW5kQWRkTmV3RWRpdG9yKHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDBcbiAgICAgICAgfSwgZmFsc2UsIHtcbiAgICAgICAgICBtZXRob2RPZkNyZWF0aW9uLFxuICAgICAgICAgIGJveGVzLFxuICAgICAgICAgIGFuY2hvck5vZGUsXG4gICAgICAgICAgYW5jaG9yT2Zmc2V0LFxuICAgICAgICAgIGZvY3VzTm9kZSxcbiAgICAgICAgICBmb2N1c09mZnNldCxcbiAgICAgICAgICB0ZXh0XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI2Rpc3BsYXlIaWdobGlnaHRUb29sYmFyKCkge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbmNob3JFbGVtZW50ID0gdGhpcy4jZ2V0QW5jaG9yRWxlbWVudEZvclNlbGVjdGlvbihzZWxlY3Rpb24pO1xuICAgIGNvbnN0IHRleHRMYXllciA9IGFuY2hvckVsZW1lbnQuY2xvc2VzdChcIi50ZXh0TGF5ZXJcIik7XG4gICAgY29uc3QgYm94ZXMgPSB0aGlzLmdldFNlbGVjdGlvbkJveGVzKHRleHRMYXllcik7XG4gICAgaWYgKCFib3hlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNoaWdobGlnaHRUb29sYmFyIHx8PSBuZXcgSGlnaGxpZ2h0VG9vbGJhcih0aGlzKTtcbiAgICB0aGlzLiNoaWdobGlnaHRUb29sYmFyLnNob3codGV4dExheWVyLCBib3hlcywgdGhpcy5kaXJlY3Rpb24gPT09IFwibHRyXCIpO1xuICB9XG4gIGFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoZWRpdG9yKSB7XG4gICAgaWYgKCFlZGl0b3IuaXNFbXB0eSgpICYmIHRoaXMuI2Fubm90YXRpb25TdG9yYWdlICYmICF0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZS5oYXMoZWRpdG9yLmlkKSkge1xuICAgICAgdGhpcy4jYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUoZWRpdG9yLmlkLCBlZGl0b3IpO1xuICAgIH1cbiAgfVxuICAjc2VsZWN0aW9uQ2hhbmdlKCkge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkge1xuICAgICAgaWYgKHRoaXMuI3NlbGVjdGVkVGV4dE5vZGUpIHtcbiAgICAgICAgdGhpcy4jaGlnaGxpZ2h0VG9vbGJhcj8uaGlkZSgpO1xuICAgICAgICB0aGlzLiNzZWxlY3RlZFRleHROb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgICAgIGhhc1NlbGVjdGVkVGV4dDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFuY2hvck5vZGVcbiAgICB9ID0gc2VsZWN0aW9uO1xuICAgIGlmIChhbmNob3JOb2RlID09PSB0aGlzLiNzZWxlY3RlZFRleHROb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFuY2hvckVsZW1lbnQgPSB0aGlzLiNnZXRBbmNob3JFbGVtZW50Rm9yU2VsZWN0aW9uKHNlbGVjdGlvbik7XG4gICAgY29uc3QgdGV4dExheWVyID0gYW5jaG9yRWxlbWVudC5jbG9zZXN0KFwiLnRleHRMYXllclwiKTtcbiAgICBpZiAoIXRleHRMYXllcikge1xuICAgICAgaWYgKHRoaXMuI3NlbGVjdGVkVGV4dE5vZGUpIHtcbiAgICAgICAgdGhpcy4jaGlnaGxpZ2h0VG9vbGJhcj8uaGlkZSgpO1xuICAgICAgICB0aGlzLiNzZWxlY3RlZFRleHROb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgICAgIGhhc1NlbGVjdGVkVGV4dDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2hpZ2hsaWdodFRvb2xiYXI/LmhpZGUoKTtcbiAgICB0aGlzLiNzZWxlY3RlZFRleHROb2RlID0gYW5jaG9yTm9kZTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTZWxlY3RlZFRleHQ6IHRydWVcbiAgICB9KTtcbiAgICBpZiAodGhpcy4jbW9kZSAhPT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUICYmIHRoaXMuI21vZGUgIT09IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI21vZGUgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVCkge1xuICAgICAgdGhpcy5zaG93QWxsRWRpdG9ycyhcImhpZ2hsaWdodFwiLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gICAgdGhpcy4jaGlnaGxpZ2h0V2hlblNoaWZ0VXAgPSB0aGlzLmlzU2hpZnRLZXlEb3duO1xuICAgIGlmICghdGhpcy5pc1NoaWZ0S2V5RG93bikge1xuICAgICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fc2lnbmFsO1xuICAgICAgY29uc3QgcG9pbnRlcnVwID0gZSA9PiB7XG4gICAgICAgIGlmIChlLnR5cGUgPT09IFwicG9pbnRlcnVwXCIgJiYgZS5idXR0b24gIT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlcnVwKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJ1cCk7XG4gICAgICAgIGlmIChlLnR5cGUgPT09IFwicG9pbnRlcnVwXCIpIHtcbiAgICAgICAgICB0aGlzLiNvblNlbGVjdEVuZChcIm1haW5fdG9vbGJhclwiKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJ1cCwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJ1cCwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAjb25TZWxlY3RFbmQobWV0aG9kT2ZDcmVhdGlvbiA9IFwiXCIpIHtcbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodFNlbGVjdGlvbihtZXRob2RPZkNyZWF0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2VuYWJsZUhpZ2hsaWdodEZsb2F0aW5nQnV0dG9uKSB7XG4gICAgICB0aGlzLiNkaXNwbGF5SGlnaGxpZ2h0VG9vbGJhcigpO1xuICAgIH1cbiAgfVxuICAjYWRkU2VsZWN0aW9uTGlzdGVuZXIoKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLiNzZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKSwge1xuICAgICAgc2lnbmFsOiB0aGlzLl9zaWduYWxcbiAgICB9KTtcbiAgfVxuICAjYWRkRm9jdXNNYW5hZ2VyKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3NpZ25hbDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI2JvdW5kRm9jdXMsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNib3VuZEJsdXIsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gICNyZW1vdmVGb2N1c01hbmFnZXIoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNib3VuZEZvY3VzKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy4jYm91bmRCbHVyKTtcbiAgfVxuICBibHVyKCkge1xuICAgIHRoaXMuaXNTaGlmdEtleURvd24gPSBmYWxzZTtcbiAgICBpZiAodGhpcy4jaGlnaGxpZ2h0V2hlblNoaWZ0VXApIHtcbiAgICAgIHRoaXMuI2hpZ2hsaWdodFdoZW5TaGlmdFVwID0gZmFsc2U7XG4gICAgICB0aGlzLiNvblNlbGVjdEVuZChcIm1haW5fdG9vbGJhclwiKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBhY3RpdmVFbGVtZW50XG4gICAgfSA9IGRvY3VtZW50O1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgaWYgKGVkaXRvci5kaXYuY29udGFpbnMoYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy4jbGFzdEFjdGl2ZUVsZW1lbnQgPSBbZWRpdG9yLCBhY3RpdmVFbGVtZW50XTtcbiAgICAgICAgZWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvY3VzKCkge1xuICAgIGlmICghdGhpcy4jbGFzdEFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW2xhc3RFZGl0b3IsIGxhc3RBY3RpdmVFbGVtZW50XSA9IHRoaXMuI2xhc3RBY3RpdmVFbGVtZW50O1xuICAgIHRoaXMuI2xhc3RBY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICBsYXN0QWN0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCAoKSA9PiB7XG4gICAgICBsYXN0RWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSB0cnVlO1xuICAgIH0sIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBzaWduYWw6IHRoaXMuX3NpZ25hbFxuICAgIH0pO1xuICAgIGxhc3RBY3RpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cbiAgI2FkZEtleWJvYXJkTWFuYWdlcigpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl9zaWduYWw7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5ZG93biwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCB0aGlzLiNib3VuZEtleXVwLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICAjcmVtb3ZlS2V5Ym9hcmRNYW5hZ2VyKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleWRvd24pO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgdGhpcy4jYm91bmRLZXl1cCk7XG4gIH1cbiAgI2FkZENvcHlQYXN0ZUxpc3RlbmVycygpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl9zaWduYWw7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgdGhpcy4jYm91bmRDb3B5LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY3V0XCIsIHRoaXMuI2JvdW5kQ3V0LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgdGhpcy4jYm91bmRQYXN0ZSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgI3JlbW92ZUNvcHlQYXN0ZUxpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29weVwiLCB0aGlzLiNib3VuZENvcHkpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjdXRcIiwgdGhpcy4jYm91bmRDdXQpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCB0aGlzLiNib3VuZFBhc3RlKTtcbiAgfVxuICAjYWRkRHJhZ0FuZERyb3BMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fc2lnbmFsO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnb3ZlclwiLCB0aGlzLmRyYWdPdmVyLmJpbmQodGhpcyksIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJkcm9wXCIsIHRoaXMuZHJvcC5iaW5kKHRoaXMpLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgfVxuICBhZGRFZGl0TGlzdGVuZXJzKCkge1xuICAgIHRoaXMuI2FkZEtleWJvYXJkTWFuYWdlcigpO1xuICAgIHRoaXMuI2FkZENvcHlQYXN0ZUxpc3RlbmVycygpO1xuICB9XG4gIHJlbW92ZUVkaXRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy4jcmVtb3ZlS2V5Ym9hcmRNYW5hZ2VyKCk7XG4gICAgdGhpcy4jcmVtb3ZlQ29weVBhc3RlTGlzdGVuZXJzKCk7XG4gIH1cbiAgZHJhZ092ZXIoZXZlbnQpIHtcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIHR5cGVcbiAgICB9IG9mIGV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIHRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICAgIGlmIChlZGl0b3JUeXBlLmlzSGFuZGxpbmdNaW1lRm9yUGFzdGluZyh0eXBlKSkge1xuICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJjb3B5XCI7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZHJvcChldmVudCkge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXMpIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yVHlwZSBvZiB0aGlzLiNlZGl0b3JUeXBlcykge1xuICAgICAgICBpZiAoZWRpdG9yVHlwZS5pc0hhbmRsaW5nTWltZUZvclBhc3RpbmcoaXRlbS50eXBlKSkge1xuICAgICAgICAgIGVkaXRvclR5cGUucGFzdGUoaXRlbSwgdGhpcy5jdXJyZW50TGF5ZXIpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvcHkoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuI2FjdGl2ZUVkaXRvcj8uY29tbWl0T3JSZW1vdmUoKTtcbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBlZGl0b3Iuc2VyaWFsaXplKHRydWUpO1xuICAgICAgaWYgKHNlcmlhbGl6ZWQpIHtcbiAgICAgICAgZWRpdG9ycy5wdXNoKHNlcmlhbGl6ZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWRpdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQuY2xpcGJvYXJkRGF0YS5zZXREYXRhKFwiYXBwbGljYXRpb24vcGRmanNcIiwgSlNPTi5zdHJpbmdpZnkoZWRpdG9ycykpO1xuICB9XG4gIGN1dChldmVudCkge1xuICAgIHRoaXMuY29weShldmVudCk7XG4gICAgdGhpcy5kZWxldGUoKTtcbiAgfVxuICBwYXN0ZShldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3Qge1xuICAgICAgY2xpcGJvYXJkRGF0YVxuICAgIH0gPSBldmVudDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY2xpcGJvYXJkRGF0YS5pdGVtcykge1xuICAgICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIHRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICAgIGlmIChlZGl0b3JUeXBlLmlzSGFuZGxpbmdNaW1lRm9yUGFzdGluZyhpdGVtLnR5cGUpKSB7XG4gICAgICAgICAgZWRpdG9yVHlwZS5wYXN0ZShpdGVtLCB0aGlzLmN1cnJlbnRMYXllcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBkYXRhID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiYXBwbGljYXRpb24vcGRmanNcIik7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgd2FybihgcGFzdGU6IFwiJHtleC5tZXNzYWdlfVwiLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5jdXJyZW50TGF5ZXI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5ld0VkaXRvcnMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGRhdGEpIHtcbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkRWRpdG9yID0gbGF5ZXIuZGVzZXJpYWxpemUoZWRpdG9yKTtcbiAgICAgICAgaWYgKCFkZXNlcmlhbGl6ZWRFZGl0b3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbmV3RWRpdG9ycy5wdXNoKGRlc2VyaWFsaXplZEVkaXRvcik7XG4gICAgICB9XG4gICAgICBjb25zdCBjbWQgPSAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIG5ld0VkaXRvcnMpIHtcbiAgICAgICAgICB0aGlzLiNhZGRFZGl0b3JUb0xheWVyKGVkaXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc2VsZWN0RWRpdG9ycyhuZXdFZGl0b3JzKTtcbiAgICAgIH07XG4gICAgICBjb25zdCB1bmRvID0gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBuZXdFZGl0b3JzKSB7XG4gICAgICAgICAgZWRpdG9yLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgIGNtZCxcbiAgICAgICAgdW5kbyxcbiAgICAgICAgbXVzdEV4ZWM6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB3YXJuKGBwYXN0ZTogXCIke2V4Lm1lc3NhZ2V9XCIuYCk7XG4gICAgfVxuICB9XG4gIGtleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNTaGlmdEtleURvd24gJiYgZXZlbnQua2V5ID09PSBcIlNoaWZ0XCIpIHtcbiAgICAgIHRoaXMuaXNTaGlmdEtleURvd24gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbW9kZSAhPT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSAmJiAhdGhpcy5pc0VkaXRvckhhbmRsaW5nS2V5Ym9hcmQpIHtcbiAgICAgIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuX2tleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIGV2ZW50KTtcbiAgICB9XG4gIH1cbiAga2V5dXAoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5pc1NoaWZ0S2V5RG93biAmJiBldmVudC5rZXkgPT09IFwiU2hpZnRcIikge1xuICAgICAgdGhpcy5pc1NoaWZ0S2V5RG93biA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuI2hpZ2hsaWdodFdoZW5TaGlmdFVwKSB7XG4gICAgICAgIHRoaXMuI2hpZ2hsaWdodFdoZW5TaGlmdFVwID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI29uU2VsZWN0RW5kKFwibWFpbl90b29sYmFyXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBvbkVkaXRpbmdBY3Rpb24oe1xuICAgIG5hbWVcbiAgfSkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSBcInVuZG9cIjpcbiAgICAgIGNhc2UgXCJyZWRvXCI6XG4gICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICBjYXNlIFwic2VsZWN0QWxsXCI6XG4gICAgICAgIHRoaXNbbmFtZV0oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiaGlnaGxpZ2h0U2VsZWN0aW9uXCI6XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0U2VsZWN0aW9uKFwiY29udGV4dF9tZW51XCIpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKGRldGFpbHMpIHtcbiAgICBjb25zdCBoYXNDaGFuZ2VkID0gT2JqZWN0LmVudHJpZXMoZGV0YWlscykuc29tZSgoW2tleSwgdmFsdWVdKSA9PiB0aGlzLiNwcmV2aW91c1N0YXRlc1trZXldICE9PSB2YWx1ZSk7XG4gICAgaWYgKGhhc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKFwiYW5ub3RhdGlvbmVkaXRvcnN0YXRlc2NoYW5nZWRcIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIGRldGFpbHM6IE9iamVjdC5hc3NpZ24odGhpcy4jcHJldmlvdXNTdGF0ZXMsIGRldGFpbHMpXG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLiNtb2RlID09PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5ISUdITElHSFQgJiYgZGV0YWlscy5oYXNTZWxlY3RlZEVkaXRvciA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9GUkVFLCB0cnVlXV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAjZGlzcGF0Y2hVcGRhdGVVSShkZXRhaWxzKSB7XG4gICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9ycGFyYW1zY2hhbmdlZFwiLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICBkZXRhaWxzXG4gICAgfSk7XG4gIH1cbiAgc2V0RWRpdGluZ1N0YXRlKGlzRWRpdGluZykge1xuICAgIGlmIChpc0VkaXRpbmcpIHtcbiAgICAgIHRoaXMuI2FkZEZvY3VzTWFuYWdlcigpO1xuICAgICAgdGhpcy4jYWRkQ29weVBhc3RlTGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICAgIGlzRWRpdGluZzogdGhpcy4jbW9kZSAhPT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSxcbiAgICAgICAgaXNFbXB0eTogdGhpcy4jaXNFbXB0eSgpLFxuICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvVW5kbygpLFxuICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvUmVkbygpLFxuICAgICAgICBoYXNTZWxlY3RlZEVkaXRvcjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNyZW1vdmVGb2N1c01hbmFnZXIoKTtcbiAgICAgIHRoaXMuI3JlbW92ZUNvcHlQYXN0ZUxpc3RlbmVycygpO1xuICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgICBpc0VkaXRpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGlzYWJsZVVzZXJTZWxlY3QoZmFsc2UpO1xuICAgIH1cbiAgfVxuICByZWdpc3RlckVkaXRvclR5cGVzKHR5cGVzKSB7XG4gICAgaWYgKHRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2VkaXRvclR5cGVzID0gdHlwZXM7XG4gICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIHRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKGVkaXRvclR5cGUuZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgfVxuICB9XG4gIGdldElkKCkge1xuICAgIHJldHVybiB0aGlzLiNpZE1hbmFnZXIuaWQ7XG4gIH1cbiAgZ2V0IGN1cnJlbnRMYXllcigpIHtcbiAgICByZXR1cm4gdGhpcy4jYWxsTGF5ZXJzLmdldCh0aGlzLiNjdXJyZW50UGFnZUluZGV4KTtcbiAgfVxuICBnZXRMYXllcihwYWdlSW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy4jYWxsTGF5ZXJzLmdldChwYWdlSW5kZXgpO1xuICB9XG4gIGdldCBjdXJyZW50UGFnZUluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLiNjdXJyZW50UGFnZUluZGV4O1xuICB9XG4gIGFkZExheWVyKGxheWVyKSB7XG4gICAgdGhpcy4jYWxsTGF5ZXJzLnNldChsYXllci5wYWdlSW5kZXgsIGxheWVyKTtcbiAgICBpZiAodGhpcy4jaXNFbmFibGVkKSB7XG4gICAgICBsYXllci5lbmFibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5ZXIuZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuICByZW1vdmVMYXllcihsYXllcikge1xuICAgIHRoaXMuI2FsbExheWVycy5kZWxldGUobGF5ZXIucGFnZUluZGV4KTtcbiAgfVxuICB1cGRhdGVNb2RlKG1vZGUsIGVkaXRJZCA9IG51bGwsIGlzRnJvbUtleWJvYXJkID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gbW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNtb2RlID0gbW9kZTtcbiAgICBpZiAobW9kZSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgdGhpcy5zZXRFZGl0aW5nU3RhdGUoZmFsc2UpO1xuICAgICAgdGhpcy4jZGlzYWJsZUFsbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEVkaXRpbmdTdGF0ZSh0cnVlKTtcbiAgICB0aGlzLiNlbmFibGVBbGwoKTtcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgIGxheWVyLnVwZGF0ZU1vZGUobW9kZSk7XG4gICAgfVxuICAgIGlmICghZWRpdElkICYmIGlzRnJvbUtleWJvYXJkKSB7XG4gICAgICB0aGlzLmFkZE5ld0VkaXRvckZyb21LZXlib2FyZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWVkaXRJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQgPT09IGVkaXRJZCkge1xuICAgICAgICB0aGlzLnNldFNlbGVjdGVkKGVkaXRvcik7XG4gICAgICAgIGVkaXRvci5lbnRlckluRWRpdE1vZGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFkZE5ld0VkaXRvckZyb21LZXlib2FyZCgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50TGF5ZXIuY2FuQ3JlYXRlTmV3RW1wdHlFZGl0b3IoKSkge1xuICAgICAgdGhpcy5jdXJyZW50TGF5ZXIuYWRkTmV3RWRpdG9yKCk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZVRvb2xiYXIobW9kZSkge1xuICAgIGlmIChtb2RlID09PSB0aGlzLiNtb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2V2ZW50QnVzLmRpc3BhdGNoKFwic3dpdGNoYW5ub3RhdGlvbmVkaXRvcm1vZGVcIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgbW9kZVxuICAgIH0pO1xuICB9XG4gIHVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy4jZWRpdG9yVHlwZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkNSRUFURTpcbiAgICAgICAgdGhpcy5jdXJyZW50TGF5ZXIuYWRkTmV3RWRpdG9yKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0RFRkFVTFRfQ09MT1I6XG4gICAgICAgIHRoaXMuI21haW5IaWdobGlnaHRDb2xvclBpY2tlcj8udXBkYXRlQ29sb3IodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX1NIT1dfQUxMOlxuICAgICAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaChcInJlcG9ydHRlbGVtZXRyeVwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZWRpdGluZ1wiLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICB0eXBlOiBcImhpZ2hsaWdodFwiLFxuICAgICAgICAgICAgICBhY3Rpb246IFwidG9nZ2xlX3Zpc2liaWxpdHlcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICh0aGlzLiNzaG93QWxsU3RhdGVzIHx8PSBuZXcgTWFwKCkpLnNldCh0eXBlLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuc2hvd0FsbEVkaXRvcnMoXCJoaWdobGlnaHRcIiwgdmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICBlZGl0b3IudXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIHRoaXMuI2VkaXRvclR5cGVzKSB7XG4gICAgICBlZGl0b3JUeXBlLnVwZGF0ZURlZmF1bHRQYXJhbXModHlwZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBzaG93QWxsRWRpdG9ycyh0eXBlLCB2aXNpYmxlLCB1cGRhdGVCdXR0b24gPSBmYWxzZSkge1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChlZGl0b3IuZWRpdG9yVHlwZSA9PT0gdHlwZSkge1xuICAgICAgICBlZGl0b3Iuc2hvdyh2aXNpYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLiNzaG93QWxsU3RhdGVzPy5nZXQoQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX1NIT1dfQUxMKSA/PyB0cnVlO1xuICAgIGlmIChzdGF0ZSAhPT0gdmlzaWJsZSkge1xuICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9TSE9XX0FMTCwgdmlzaWJsZV1dKTtcbiAgICB9XG4gIH1cbiAgZW5hYmxlV2FpdGluZyhtdXN0V2FpdCA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuI2lzV2FpdGluZyA9PT0gbXVzdFdhaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaXNXYWl0aW5nID0gbXVzdFdhaXQ7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChtdXN0V2FpdCkge1xuICAgICAgICBsYXllci5kaXNhYmxlQ2xpY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxheWVyLmVuYWJsZUNsaWNrKCk7XG4gICAgICB9XG4gICAgICBsYXllci5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcIndhaXRpbmdcIiwgbXVzdFdhaXQpO1xuICAgIH1cbiAgfVxuICAjZW5hYmxlQWxsKCkge1xuICAgIGlmICghdGhpcy4jaXNFbmFibGVkKSB7XG4gICAgICB0aGlzLiNpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgICAgbGF5ZXIuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICAgIGVkaXRvci5lbmFibGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI2Rpc2FibGVBbGwoKSB7XG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xuICAgIGlmICh0aGlzLiNpc0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuI2lzRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcbiAgICAgICAgbGF5ZXIuZGlzYWJsZSgpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jYWxsRWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgICBlZGl0b3IuZGlzYWJsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXRFZGl0b3JzKHBhZ2VJbmRleCkge1xuICAgIGNvbnN0IGVkaXRvcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZWRpdG9yLnBhZ2VJbmRleCA9PT0gcGFnZUluZGV4KSB7XG4gICAgICAgIGVkaXRvcnMucHVzaChlZGl0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWRpdG9ycztcbiAgfVxuICBnZXRFZGl0b3IoaWQpIHtcbiAgICByZXR1cm4gdGhpcy4jYWxsRWRpdG9ycy5nZXQoaWQpO1xuICB9XG4gIGFkZEVkaXRvcihlZGl0b3IpIHtcbiAgICB0aGlzLiNhbGxFZGl0b3JzLnNldChlZGl0b3IuaWQsIGVkaXRvcik7XG4gIH1cbiAgcmVtb3ZlRWRpdG9yKGVkaXRvcikge1xuICAgIGlmIChlZGl0b3IuZGl2LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICBpZiAodGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNmb2N1c01haW5Db250YWluZXJUaW1lb3V0SWQpO1xuICAgICAgfVxuICAgICAgdGhpcy4jZm9jdXNNYWluQ29udGFpbmVyVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZm9jdXNNYWluQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuI2ZvY3VzTWFpbkNvbnRhaW5lclRpbWVvdXRJZCA9IG51bGw7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gICAgdGhpcy4jYWxsRWRpdG9ycy5kZWxldGUoZWRpdG9yLmlkKTtcbiAgICB0aGlzLnVuc2VsZWN0KGVkaXRvcik7XG4gICAgaWYgKCFlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCB8fCAhdGhpcy4jZGVsZXRlZEFubm90YXRpb25zRWxlbWVudElkcy5oYXMoZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpKSB7XG4gICAgICB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZT8ucmVtb3ZlKGVkaXRvci5pZCk7XG4gICAgfVxuICB9XG4gIGFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChlZGl0b3IpIHtcbiAgICB0aGlzLiNkZWxldGVkQW5ub3RhdGlvbnNFbGVtZW50SWRzLmFkZChlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCk7XG4gICAgdGhpcy5hZGRDaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9uKGVkaXRvcik7XG4gICAgZWRpdG9yLmRlbGV0ZWQgPSB0cnVlO1xuICB9XG4gIGlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlZEFubm90YXRpb25zRWxlbWVudElkcy5oYXMoYW5ub3RhdGlvbkVsZW1lbnRJZCk7XG4gIH1cbiAgcmVtb3ZlRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRvcikge1xuICAgIHRoaXMuI2RlbGV0ZWRBbm5vdGF0aW9uc0VsZW1lbnRJZHMuZGVsZXRlKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICB0aGlzLnJlbW92ZUNoYW5nZWRFeGlzdGluZ0Fubm90YXRpb24oZWRpdG9yKTtcbiAgICBlZGl0b3IuZGVsZXRlZCA9IGZhbHNlO1xuICB9XG4gICNhZGRFZGl0b3JUb0xheWVyKGVkaXRvcikge1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy4jYWxsTGF5ZXJzLmdldChlZGl0b3IucGFnZUluZGV4KTtcbiAgICBpZiAobGF5ZXIpIHtcbiAgICAgIGxheWVyLmFkZE9yUmVidWlsZChlZGl0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZEVkaXRvcihlZGl0b3IpO1xuICAgICAgdGhpcy5hZGRUb0Fubm90YXRpb25TdG9yYWdlKGVkaXRvcik7XG4gICAgfVxuICB9XG4gIHNldEFjdGl2ZUVkaXRvcihlZGl0b3IpIHtcbiAgICBpZiAodGhpcy4jYWN0aXZlRWRpdG9yID09PSBlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYWN0aXZlRWRpdG9yID0gZWRpdG9yO1xuICAgIGlmIChlZGl0b3IpIHtcbiAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoZWRpdG9yLnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgfVxuICB9XG4gIGdldCAjbGFzdFNlbGVjdGVkRWRpdG9yKCkge1xuICAgIGxldCBlZCA9IG51bGw7XG4gICAgZm9yIChlZCBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHt9XG4gICAgcmV0dXJuIGVkO1xuICB9XG4gIHVwZGF0ZVVJKGVkaXRvcikge1xuICAgIGlmICh0aGlzLiNsYXN0U2VsZWN0ZWRFZGl0b3IgPT09IGVkaXRvcikge1xuICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3IucHJvcGVydGllc1RvVXBkYXRlKTtcbiAgICB9XG4gIH1cbiAgdG9nZ2xlU2VsZWN0ZWQoZWRpdG9yKSB7XG4gICAgaWYgKHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5oYXMoZWRpdG9yKSkge1xuICAgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmRlbGV0ZShlZGl0b3IpO1xuICAgICAgZWRpdG9yLnVuc2VsZWN0KCk7XG4gICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0aGlzLmhhc1NlbGVjdGlvblxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5hZGQoZWRpdG9yKTtcbiAgICBlZGl0b3Iuc2VsZWN0KCk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3IucHJvcGVydGllc1RvVXBkYXRlKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTZWxlY3RlZEVkaXRvcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHNldFNlbGVjdGVkKGVkaXRvcikge1xuICAgIGZvciAoY29uc3QgZWQgb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICBpZiAoZWQgIT09IGVkaXRvcikge1xuICAgICAgICBlZC51bnNlbGVjdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuY2xlYXIoKTtcbiAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuYWRkKGVkaXRvcik7XG4gICAgZWRpdG9yLnNlbGVjdCgpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoZWRpdG9yLnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRydWVcbiAgICB9KTtcbiAgfVxuICBpc1NlbGVjdGVkKGVkaXRvcikge1xuICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuaGFzKGVkaXRvcik7XG4gIH1cbiAgZ2V0IGZpcnN0U2VsZWN0ZWRFZGl0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gIH1cbiAgdW5zZWxlY3QoZWRpdG9yKSB7XG4gICAgZWRpdG9yLnVuc2VsZWN0KCk7XG4gICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmRlbGV0ZShlZGl0b3IpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0aGlzLmhhc1NlbGVjdGlvblxuICAgIH0pO1xuICB9XG4gIGdldCBoYXNTZWxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5zaXplICE9PSAwO1xuICB9XG4gIGdldCBpc0VudGVySGFuZGxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLnNpemUgPT09IDEgJiYgdGhpcy5maXJzdFNlbGVjdGVkRWRpdG9yLmlzRW50ZXJIYW5kbGVkO1xuICB9XG4gIHVuZG8oKSB7XG4gICAgdGhpcy4jY29tbWFuZE1hbmFnZXIudW5kbygpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogdGhpcy4jY29tbWFuZE1hbmFnZXIuaGFzU29tZXRoaW5nVG9VbmRvKCksXG4gICAgICBoYXNTb21ldGhpbmdUb1JlZG86IHRydWUsXG4gICAgICBpc0VtcHR5OiB0aGlzLiNpc0VtcHR5KClcbiAgICB9KTtcbiAgfVxuICByZWRvKCkge1xuICAgIHRoaXMuI2NvbW1hbmRNYW5hZ2VyLnJlZG8oKTtcbiAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG4gICAgICBoYXNTb21ldGhpbmdUb1VuZG86IHRydWUsXG4gICAgICBoYXNTb21ldGhpbmdUb1JlZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvUmVkbygpLFxuICAgICAgaXNFbXB0eTogdGhpcy4jaXNFbXB0eSgpXG4gICAgfSk7XG4gIH1cbiAgYWRkQ29tbWFuZHMocGFyYW1zKSB7XG4gICAgdGhpcy4jY29tbWFuZE1hbmFnZXIuYWRkKHBhcmFtcyk7XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiB0cnVlLFxuICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiBmYWxzZSxcbiAgICAgIGlzRW1wdHk6IHRoaXMuI2lzRW1wdHkoKVxuICAgIH0pO1xuICB9XG4gICNpc0VtcHR5KCkge1xuICAgIGlmICh0aGlzLiNhbGxFZGl0b3JzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy4jYWxsRWRpdG9ycy5zaXplID09PSAxKSB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICAgIHJldHVybiBlZGl0b3IuaXNFbXB0eSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZGVsZXRlKCkge1xuICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvcnMgPSBbLi4udGhpcy4jc2VsZWN0ZWRFZGl0b3JzXTtcbiAgICBjb25zdCBjbWQgPSAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG4gICAgICAgIGVkaXRvci5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHVuZG8gPSAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG4gICAgICAgIHRoaXMuI2FkZEVkaXRvclRvTGF5ZXIoZWRpdG9yKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kLFxuICAgICAgdW5kbyxcbiAgICAgIG11c3RFeGVjOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgY29tbWl0T3JSZW1vdmUoKSB7XG4gICAgdGhpcy4jYWN0aXZlRWRpdG9yPy5jb21taXRPclJlbW92ZSgpO1xuICB9XG4gIGhhc1NvbWV0aGluZ1RvQ29udHJvbCgpIHtcbiAgICByZXR1cm4gdGhpcy4jYWN0aXZlRWRpdG9yIHx8IHRoaXMuaGFzU2VsZWN0aW9uO1xuICB9XG4gICNzZWxlY3RFZGl0b3JzKGVkaXRvcnMpIHtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcbiAgICAgIGVkaXRvci51bnNlbGVjdCgpO1xuICAgIH1cbiAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG4gICAgICBpZiAoZWRpdG9yLmlzRW1wdHkoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5hZGQoZWRpdG9yKTtcbiAgICAgIGVkaXRvci5zZWxlY3QoKTtcbiAgICB9XG4gICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRoaXMuaGFzU2VsZWN0aW9uXG4gICAgfSk7XG4gIH1cbiAgc2VsZWN0QWxsKCkge1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgZWRpdG9yLmNvbW1pdCgpO1xuICAgIH1cbiAgICB0aGlzLiNzZWxlY3RFZGl0b3JzKHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpO1xuICB9XG4gIHVuc2VsZWN0QWxsKCkge1xuICAgIGlmICh0aGlzLiNhY3RpdmVFZGl0b3IpIHtcbiAgICAgIHRoaXMuI2FjdGl2ZUVkaXRvci5jb21taXRPclJlbW92ZSgpO1xuICAgICAgaWYgKHRoaXMuI21vZGUgIT09IEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuICAgICAgZWRpdG9yLnVuc2VsZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5jbGVhcigpO1xuICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcbiAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiBmYWxzZVxuICAgIH0pO1xuICB9XG4gIHRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycyh4LCB5LCBub0NvbW1pdCA9IGZhbHNlKSB7XG4gICAgaWYgKCFub0NvbW1pdCkge1xuICAgICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3RyYW5zbGF0aW9uWzBdICs9IHg7XG4gICAgdGhpcy4jdHJhbnNsYXRpb25bMV0gKz0geTtcbiAgICBjb25zdCBbdG90YWxYLCB0b3RhbFldID0gdGhpcy4jdHJhbnNsYXRpb247XG4gICAgY29uc3QgZWRpdG9ycyA9IFsuLi50aGlzLiNzZWxlY3RlZEVkaXRvcnNdO1xuICAgIGNvbnN0IFRJTUVfVE9fV0FJVCA9IDEwMDA7XG4gICAgaWYgKHRoaXMuI3RyYW5zbGF0aW9uVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQpO1xuICAgIH1cbiAgICB0aGlzLiN0cmFuc2xhdGlvblRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy4jdHJhbnNsYXRpb25UaW1lb3V0SWQgPSBudWxsO1xuICAgICAgdGhpcy4jdHJhbnNsYXRpb25bMF0gPSB0aGlzLiN0cmFuc2xhdGlvblsxXSA9IDA7XG4gICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgY21kOiAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZWRpdG9ycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2FsbEVkaXRvcnMuaGFzKGVkaXRvci5pZCkpIHtcbiAgICAgICAgICAgICAgZWRpdG9yLnRyYW5zbGF0ZUluUGFnZSh0b3RhbFgsIHRvdGFsWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZWRpdG9ycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2FsbEVkaXRvcnMuaGFzKGVkaXRvci5pZCkpIHtcbiAgICAgICAgICAgICAgZWRpdG9yLnRyYW5zbGF0ZUluUGFnZSgtdG90YWxYLCAtdG90YWxZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG11c3RFeGVjOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSwgVElNRV9UT19XQUlUKTtcbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG4gICAgICBlZGl0b3IudHJhbnNsYXRlSW5QYWdlKHgsIHkpO1xuICAgIH1cbiAgfVxuICBzZXRVcERyYWdTZXNzaW9uKCkge1xuICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxlVXNlclNlbGVjdCh0cnVlKTtcbiAgICB0aGlzLiNkcmFnZ2luZ0VkaXRvcnMgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG4gICAgICB0aGlzLiNkcmFnZ2luZ0VkaXRvcnMuc2V0KGVkaXRvciwge1xuICAgICAgICBzYXZlZFg6IGVkaXRvci54LFxuICAgICAgICBzYXZlZFk6IGVkaXRvci55LFxuICAgICAgICBzYXZlZFBhZ2VJbmRleDogZWRpdG9yLnBhZ2VJbmRleCxcbiAgICAgICAgbmV3WDogMCxcbiAgICAgICAgbmV3WTogMCxcbiAgICAgICAgbmV3UGFnZUluZGV4OiAtMVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGVuZERyYWdTZXNzaW9uKCkge1xuICAgIGlmICghdGhpcy4jZHJhZ2dpbmdFZGl0b3JzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZVVzZXJTZWxlY3QoZmFsc2UpO1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuI2RyYWdnaW5nRWRpdG9ycztcbiAgICB0aGlzLiNkcmFnZ2luZ0VkaXRvcnMgPSBudWxsO1xuICAgIGxldCBtdXN0QmVBZGRlZEluVW5kb1N0YWNrID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBbe1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBwYWdlSW5kZXhcbiAgICB9LCB2YWx1ZV0gb2YgbWFwKSB7XG4gICAgICB2YWx1ZS5uZXdYID0geDtcbiAgICAgIHZhbHVlLm5ld1kgPSB5O1xuICAgICAgdmFsdWUubmV3UGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgICAgbXVzdEJlQWRkZWRJblVuZG9TdGFjayB8fD0geCAhPT0gdmFsdWUuc2F2ZWRYIHx8IHkgIT09IHZhbHVlLnNhdmVkWSB8fCBwYWdlSW5kZXggIT09IHZhbHVlLnNhdmVkUGFnZUluZGV4O1xuICAgIH1cbiAgICBpZiAoIW11c3RCZUFkZGVkSW5VbmRvU3RhY2spIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbW92ZSA9IChlZGl0b3IsIHgsIHksIHBhZ2VJbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI2FsbEVkaXRvcnMuaGFzKGVkaXRvci5pZCkpIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy4jYWxsTGF5ZXJzLmdldChwYWdlSW5kZXgpO1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgZWRpdG9yLl9zZXRQYXJlbnRBbmRQb3NpdGlvbihwYXJlbnQsIHgsIHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkaXRvci5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgICAgICAgZWRpdG9yLnggPSB4O1xuICAgICAgICAgIGVkaXRvci55ID0geTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBbZWRpdG9yLCB7XG4gICAgICAgICAgbmV3WCxcbiAgICAgICAgICBuZXdZLFxuICAgICAgICAgIG5ld1BhZ2VJbmRleFxuICAgICAgICB9XSBvZiBtYXApIHtcbiAgICAgICAgICBtb3ZlKGVkaXRvciwgbmV3WCwgbmV3WSwgbmV3UGFnZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBbZWRpdG9yLCB7XG4gICAgICAgICAgc2F2ZWRYLFxuICAgICAgICAgIHNhdmVkWSxcbiAgICAgICAgICBzYXZlZFBhZ2VJbmRleFxuICAgICAgICB9XSBvZiBtYXApIHtcbiAgICAgICAgICBtb3ZlKGVkaXRvciwgc2F2ZWRYLCBzYXZlZFksIHNhdmVkUGFnZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG11c3RFeGVjOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZHJhZ1NlbGVjdGVkRWRpdG9ycyh0eCwgdHkpIHtcbiAgICBpZiAoIXRoaXMuI2RyYWdnaW5nRWRpdG9ycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNkcmFnZ2luZ0VkaXRvcnMua2V5cygpKSB7XG4gICAgICBlZGl0b3IuZHJhZyh0eCwgdHkpO1xuICAgIH1cbiAgfVxuICByZWJ1aWxkKGVkaXRvcikge1xuICAgIGlmIChlZGl0b3IucGFyZW50ID09PSBudWxsKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmdldExheWVyKGVkaXRvci5wYWdlSW5kZXgpO1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwYXJlbnQuY2hhbmdlUGFyZW50KGVkaXRvcik7XG4gICAgICAgIHBhcmVudC5hZGRPclJlYnVpbGQoZWRpdG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRkRWRpdG9yKGVkaXRvcik7XG4gICAgICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZShlZGl0b3IpO1xuICAgICAgICBlZGl0b3IucmVidWlsZCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlZGl0b3IucGFyZW50LmFkZE9yUmVidWlsZChlZGl0b3IpO1xuICAgIH1cbiAgfVxuICBnZXQgaXNFZGl0b3JIYW5kbGluZ0tleWJvYXJkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZSgpPy5zaG91bGRHZXRLZXlib2FyZEV2ZW50cygpIHx8IHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5zaXplID09PSAxICYmIHRoaXMuZmlyc3RTZWxlY3RlZEVkaXRvci5zaG91bGRHZXRLZXlib2FyZEV2ZW50cygpO1xuICB9XG4gIGlzQWN0aXZlKGVkaXRvcikge1xuICAgIHJldHVybiB0aGlzLiNhY3RpdmVFZGl0b3IgPT09IGVkaXRvcjtcbiAgfVxuICBnZXRBY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2FjdGl2ZUVkaXRvcjtcbiAgfVxuICBnZXRNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLiNtb2RlO1xuICB9XG4gIGdldCBpbWFnZU1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImltYWdlTWFuYWdlclwiLCBuZXcgSW1hZ2VNYW5hZ2VyKCkpO1xuICB9XG4gIGdldFNlbGVjdGlvbkJveGVzKHRleHRMYXllcikge1xuICAgIGlmICghdGV4dExheWVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc2VsZWN0aW9uLnJhbmdlQ291bnQ7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBpZiAoIXRleHRMYXllci5jb250YWlucyhzZWxlY3Rpb24uZ2V0UmFuZ2VBdChpKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHg6IGxheWVyWCxcbiAgICAgIHk6IGxheWVyWSxcbiAgICAgIHdpZHRoOiBwYXJlbnRXaWR0aCxcbiAgICAgIGhlaWdodDogcGFyZW50SGVpZ2h0XG4gICAgfSA9IHRleHRMYXllci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgcm90YXRvcjtcbiAgICBzd2l0Y2ggKHRleHRMYXllci5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1haW4tcm90YXRpb25cIikpIHtcbiAgICAgIGNhc2UgXCI5MFwiOlxuICAgICAgICByb3RhdG9yID0gKHgsIHksIHcsIGgpID0+ICh7XG4gICAgICAgICAgeDogKHkgLSBsYXllclkpIC8gcGFyZW50SGVpZ2h0LFxuICAgICAgICAgIHk6IDEgLSAoeCArIHcgLSBsYXllclgpIC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgd2lkdGg6IGggLyBwYXJlbnRIZWlnaHQsXG4gICAgICAgICAgaGVpZ2h0OiB3IC8gcGFyZW50V2lkdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIjE4MFwiOlxuICAgICAgICByb3RhdG9yID0gKHgsIHksIHcsIGgpID0+ICh7XG4gICAgICAgICAgeDogMSAtICh4ICsgdyAtIGxheWVyWCkgLyBwYXJlbnRXaWR0aCxcbiAgICAgICAgICB5OiAxIC0gKHkgKyBoIC0gbGF5ZXJZKSAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICB3aWR0aDogdyAvIHBhcmVudFdpZHRoLFxuICAgICAgICAgIGhlaWdodDogaCAvIHBhcmVudEhlaWdodFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiMjcwXCI6XG4gICAgICAgIHJvdGF0b3IgPSAoeCwgeSwgdywgaCkgPT4gKHtcbiAgICAgICAgICB4OiAxIC0gKHkgKyBoIC0gbGF5ZXJZKSAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICB5OiAoeCAtIGxheWVyWCkgLyBwYXJlbnRXaWR0aCxcbiAgICAgICAgICB3aWR0aDogaCAvIHBhcmVudEhlaWdodCxcbiAgICAgICAgICBoZWlnaHQ6IHcgLyBwYXJlbnRXaWR0aFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByb3RhdG9yID0gKHgsIHksIHcsIGgpID0+ICh7XG4gICAgICAgICAgeDogKHggLSBsYXllclgpIC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgeTogKHkgLSBsYXllclkpIC8gcGFyZW50SGVpZ2h0LFxuICAgICAgICAgIHdpZHRoOiB3IC8gcGFyZW50V2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBoIC8gcGFyZW50SGVpZ2h0XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgY29uc3QgYm94ZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoaSk7XG4gICAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0gb2YgcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKSkge1xuICAgICAgICBpZiAod2lkdGggPT09IDAgfHwgaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYm94ZXMucHVzaChyb3RhdG9yKHgsIHksIHdpZHRoLCBoZWlnaHQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJveGVzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBib3hlcztcbiAgfVxuICBhZGRDaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9uKHtcbiAgICBhbm5vdGF0aW9uRWxlbWVudElkLFxuICAgIGlkXG4gIH0pIHtcbiAgICAodGhpcy4jY2hhbmdlZEV4aXN0aW5nQW5ub3RhdGlvbnMgfHw9IG5ldyBNYXAoKSkuc2V0KGFubm90YXRpb25FbGVtZW50SWQsIGlkKTtcbiAgfVxuICByZW1vdmVDaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9uKHtcbiAgICBhbm5vdGF0aW9uRWxlbWVudElkXG4gIH0pIHtcbiAgICB0aGlzLiNjaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9ucz8uZGVsZXRlKGFubm90YXRpb25FbGVtZW50SWQpO1xuICB9XG4gIHJlbmRlckFubm90YXRpb25FbGVtZW50KGFubm90YXRpb24pIHtcbiAgICBjb25zdCBlZGl0b3JJZCA9IHRoaXMuI2NoYW5nZWRFeGlzdGluZ0Fubm90YXRpb25zPy5nZXQoYW5ub3RhdGlvbi5kYXRhLmlkKTtcbiAgICBpZiAoIWVkaXRvcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuI2Fubm90YXRpb25TdG9yYWdlLmdldFJhd1ZhbHVlKGVkaXRvcklkKTtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbW9kZSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSAmJiAhZWRpdG9yLmhhc0JlZW5Nb2RpZmllZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlZGl0b3IucmVuZGVyQW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbik7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2FsdF90ZXh0LmpzXG5cbmNsYXNzIEFsdFRleHQge1xuICAjYWx0VGV4dCA9IFwiXCI7XG4gICNhbHRUZXh0RGVjb3JhdGl2ZSA9IGZhbHNlO1xuICAjYWx0VGV4dEJ1dHRvbiA9IG51bGw7XG4gICNhbHRUZXh0VG9vbHRpcCA9IG51bGw7XG4gICNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAjYWx0VGV4dFdhc0Zyb21LZXlCb2FyZCA9IGZhbHNlO1xuICAjZWRpdG9yID0gbnVsbDtcbiAgc3RhdGljIF9sMTBuUHJvbWlzZSA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKGVkaXRvcikge1xuICAgIHRoaXMuI2VkaXRvciA9IGVkaXRvcjtcbiAgfVxuICBzdGF0aWMgaW5pdGlhbGl6ZShsMTBuUHJvbWlzZSkge1xuICAgIEFsdFRleHQuX2wxMG5Qcm9taXNlIHx8PSBsMTBuUHJvbWlzZTtcbiAgfVxuICBhc3luYyByZW5kZXIoKSB7XG4gICAgY29uc3QgYWx0VGV4dCA9IHRoaXMuI2FsdFRleHRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgIGFsdFRleHQuY2xhc3NOYW1lID0gXCJhbHRUZXh0XCI7XG4gICAgY29uc3QgbXNnID0gYXdhaXQgQWx0VGV4dC5fbDEwblByb21pc2UuZ2V0KFwicGRmanMtZWRpdG9yLWFsdC10ZXh0LWJ1dHRvbi1sYWJlbFwiKTtcbiAgICBhbHRUZXh0LnRleHRDb250ZW50ID0gbXNnO1xuICAgIGFsdFRleHQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBtc2cpO1xuICAgIGFsdFRleHQudGFiSW5kZXggPSBcIjBcIjtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLiNlZGl0b3IuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGFsdFRleHQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGFsdFRleHQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGV2ZW50ID0+IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBjb25zdCBvbkNsaWNrID0gZXZlbnQgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuI2VkaXRvci5fdWlNYW5hZ2VyLmVkaXRBbHRUZXh0KHRoaXMuI2VkaXRvcik7XG4gICAgfTtcbiAgICBhbHRUZXh0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBvbkNsaWNrLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgYWx0VGV4dC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBhbHRUZXh0ICYmIGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgIHRoaXMuI2FsdFRleHRXYXNGcm9tS2V5Qm9hcmQgPSB0cnVlO1xuICAgICAgICBvbkNsaWNrKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLiNzZXRTdGF0ZSgpO1xuICAgIHJldHVybiBhbHRUZXh0O1xuICB9XG4gIGZpbmlzaCgpIHtcbiAgICBpZiAoIXRoaXMuI2FsdFRleHRCdXR0b24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYWx0VGV4dEJ1dHRvbi5mb2N1cyh7XG4gICAgICBmb2N1c1Zpc2libGU6IHRoaXMuI2FsdFRleHRXYXNGcm9tS2V5Qm9hcmRcbiAgICB9KTtcbiAgICB0aGlzLiNhbHRUZXh0V2FzRnJvbUtleUJvYXJkID0gZmFsc2U7XG4gIH1cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gIXRoaXMuI2FsdFRleHQgJiYgIXRoaXMuI2FsdFRleHREZWNvcmF0aXZlO1xuICB9XG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhbHRUZXh0OiB0aGlzLiNhbHRUZXh0LFxuICAgICAgZGVjb3JhdGl2ZTogdGhpcy4jYWx0VGV4dERlY29yYXRpdmVcbiAgICB9O1xuICB9XG4gIHNldCBkYXRhKHtcbiAgICBhbHRUZXh0LFxuICAgIGRlY29yYXRpdmVcbiAgfSkge1xuICAgIGlmICh0aGlzLiNhbHRUZXh0ID09PSBhbHRUZXh0ICYmIHRoaXMuI2FsdFRleHREZWNvcmF0aXZlID09PSBkZWNvcmF0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2FsdFRleHQgPSBhbHRUZXh0O1xuICAgIHRoaXMuI2FsdFRleHREZWNvcmF0aXZlID0gZGVjb3JhdGl2ZTtcbiAgICB0aGlzLiNzZXRTdGF0ZSgpO1xuICB9XG4gIHRvZ2dsZShlbmFibGVkID0gZmFsc2UpIHtcbiAgICBpZiAoIXRoaXMuI2FsdFRleHRCdXR0b24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFlbmFibGVkICYmIHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2FsdFRleHRUb29sdGlwVGltZW91dCk7XG4gICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLiNhbHRUZXh0QnV0dG9uLmRpc2FibGVkID0gIWVuYWJsZWQ7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLiNhbHRUZXh0QnV0dG9uPy5yZW1vdmUoKTtcbiAgICB0aGlzLiNhbHRUZXh0QnV0dG9uID0gbnVsbDtcbiAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcCA9IG51bGw7XG4gIH1cbiAgYXN5bmMgI3NldFN0YXRlKCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuI2FsdFRleHRCdXR0b247XG4gICAgaWYgKCFidXR0b24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNhbHRUZXh0ICYmICF0aGlzLiNhbHRUZXh0RGVjb3JhdGl2ZSkge1xuICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoXCJkb25lXCIpO1xuICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXA/LnJlbW92ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBidXR0b24uY2xhc3NMaXN0LmFkZChcImRvbmVcIik7XG4gICAgQWx0VGV4dC5fbDEwblByb21pc2UuZ2V0KFwicGRmanMtZWRpdG9yLWFsdC10ZXh0LWVkaXQtYnV0dG9uLWxhYmVsXCIpLnRoZW4obXNnID0+IHtcbiAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG1zZyk7XG4gICAgfSk7XG4gICAgbGV0IHRvb2x0aXAgPSB0aGlzLiNhbHRUZXh0VG9vbHRpcDtcbiAgICBpZiAoIXRvb2x0aXApIHtcbiAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwID0gdG9vbHRpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgdG9vbHRpcC5jbGFzc05hbWUgPSBcInRvb2x0aXBcIjtcbiAgICAgIHRvb2x0aXAuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInRvb2x0aXBcIik7XG4gICAgICBjb25zdCBpZCA9IHRvb2x0aXAuaWQgPSBgYWx0LXRleHQtdG9vbHRpcC0ke3RoaXMuI2VkaXRvci5pZH1gO1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIiwgaWQpO1xuICAgICAgY29uc3QgREVMQVlfVE9fU0hPV19UT09MVElQID0gMTAwO1xuICAgICAgY29uc3Qgc2lnbmFsID0gdGhpcy4jZWRpdG9yLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0KTtcbiAgICAgICAgdGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH0sIHtcbiAgICAgICAgb25jZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwLmNsYXNzTGlzdC5hZGQoXCJzaG93XCIpO1xuICAgICAgICAgIHRoaXMuI2VkaXRvci5fcmVwb3J0VGVsZW1ldHJ5KHtcbiAgICAgICAgICAgIGFjdGlvbjogXCJhbHRfdGV4dF90b29sdGlwXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgREVMQVlfVE9fU0hPV19UT09MVElQKTtcbiAgICAgIH0sIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jYWx0VGV4dFRvb2x0aXBUaW1lb3V0KTtcbiAgICAgICAgICB0aGlzLiNhbHRUZXh0VG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2FsdFRleHRUb29sdGlwPy5jbGFzc0xpc3QucmVtb3ZlKFwic2hvd1wiKTtcbiAgICAgIH0sIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdG9vbHRpcC5pbm5lclRleHQgPSB0aGlzLiNhbHRUZXh0RGVjb3JhdGl2ZSA/IGF3YWl0IEFsdFRleHQuX2wxMG5Qcm9taXNlLmdldChcInBkZmpzLWVkaXRvci1hbHQtdGV4dC1kZWNvcmF0aXZlLXRvb2x0aXBcIikgOiB0aGlzLiNhbHRUZXh0O1xuICAgIGlmICghdG9vbHRpcC5wYXJlbnROb2RlKSB7XG4gICAgICBidXR0b24uYXBwZW5kKHRvb2x0aXApO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy4jZWRpdG9yLmdldEltYWdlRm9yQWx0VGV4dCgpO1xuICAgIGVsZW1lbnQ/LnNldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIiwgdG9vbHRpcC5pZCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2VkaXRvci5qc1xuXG5cblxuXG5cbmNsYXNzIEFubm90YXRpb25FZGl0b3Ige1xuICAjYWNjZXNzaWJpbGl0eURhdGEgPSBudWxsO1xuICAjYWxsUmVzaXplckRpdnMgPSBudWxsO1xuICAjYWx0VGV4dCA9IG51bGw7XG4gICNkaXNhYmxlZCA9IGZhbHNlO1xuICAja2VlcEFzcGVjdFJhdGlvID0gZmFsc2U7XG4gICNyZXNpemVyc0RpdiA9IG51bGw7XG4gICNzYXZlZERpbWVuc2lvbnMgPSBudWxsO1xuICAjYm91bmRGb2N1c2luID0gdGhpcy5mb2N1c2luLmJpbmQodGhpcyk7XG4gICNib3VuZEZvY3Vzb3V0ID0gdGhpcy5mb2N1c291dC5iaW5kKHRoaXMpO1xuICAjZWRpdFRvb2xiYXIgPSBudWxsO1xuICAjZm9jdXNlZFJlc2l6ZXJOYW1lID0gXCJcIjtcbiAgI2hhc0JlZW5DbGlja2VkID0gZmFsc2U7XG4gICNpbml0aWFsUG9zaXRpb24gPSBudWxsO1xuICAjaXNFZGl0aW5nID0gZmFsc2U7XG4gICNpc0luRWRpdE1vZGUgPSBmYWxzZTtcbiAgI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZCA9IGZhbHNlO1xuICAjbW92ZUluRE9NVGltZW91dCA9IG51bGw7XG4gICNwcmV2RHJhZ1ggPSAwO1xuICAjcHJldkRyYWdZID0gMDtcbiAgI3RlbGVtZXRyeVRpbWVvdXRzID0gbnVsbDtcbiAgX2luaXRpYWxPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgX2lzVmlzaWJsZSA9IHRydWU7XG4gIF91aU1hbmFnZXIgPSBudWxsO1xuICBfZm9jdXNFdmVudHNBbGxvd2VkID0gdHJ1ZTtcbiAgX2wxMG5Qcm9taXNlID0gbnVsbDtcbiAgI2lzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICN6SW5kZXggPSBBbm5vdGF0aW9uRWRpdG9yLl96SW5kZXgrKztcbiAgc3RhdGljIF9ib3JkZXJMaW5lV2lkdGggPSAtMTtcbiAgc3RhdGljIF9jb2xvck1hbmFnZXIgPSBuZXcgQ29sb3JNYW5hZ2VyKCk7XG4gIHN0YXRpYyBfekluZGV4ID0gMTtcbiAgc3RhdGljIF90ZWxlbWV0cnlUaW1lb3V0ID0gMTAwMDtcbiAgc3RhdGljIGdldCBfcmVzaXplcktleWJvYXJkTWFuYWdlcigpIHtcbiAgICBjb25zdCByZXNpemUgPSBBbm5vdGF0aW9uRWRpdG9yLnByb3RvdHlwZS5fcmVzaXplV2l0aEtleWJvYXJkO1xuICAgIGNvbnN0IHNtYWxsID0gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfU01BTEw7XG4gICAgY29uc3QgYmlnID0gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfQklHO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJfcmVzaXplcktleWJvYXJkTWFuYWdlclwiLCBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiQXJyb3dMZWZ0XCIsIFwibWFjK0Fycm93TGVmdFwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbLXNtYWxsLCAwXVxuICAgIH1dLCBbW1wiY3RybCtBcnJvd0xlZnRcIiwgXCJtYWMrc2hpZnQrQXJyb3dMZWZ0XCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFstYmlnLCAwXVxuICAgIH1dLCBbW1wiQXJyb3dSaWdodFwiLCBcIm1hYytBcnJvd1JpZ2h0XCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFtzbWFsbCwgMF1cbiAgICB9XSwgW1tcImN0cmwrQXJyb3dSaWdodFwiLCBcIm1hYytzaGlmdCtBcnJvd1JpZ2h0XCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFtiaWcsIDBdXG4gICAgfV0sIFtbXCJBcnJvd1VwXCIsIFwibWFjK0Fycm93VXBcIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogWzAsIC1zbWFsbF1cbiAgICB9XSwgW1tcImN0cmwrQXJyb3dVcFwiLCBcIm1hYytzaGlmdCtBcnJvd1VwXCJdLCByZXNpemUsIHtcbiAgICAgIGFyZ3M6IFswLCAtYmlnXVxuICAgIH1dLCBbW1wiQXJyb3dEb3duXCIsIFwibWFjK0Fycm93RG93blwiXSwgcmVzaXplLCB7XG4gICAgICBhcmdzOiBbMCwgc21hbGxdXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93RG93blwiLCBcIm1hYytzaGlmdCtBcnJvd0Rvd25cIl0sIHJlc2l6ZSwge1xuICAgICAgYXJnczogWzAsIGJpZ11cbiAgICB9XSwgW1tcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIEFubm90YXRpb25FZGl0b3IucHJvdG90eXBlLl9zdG9wUmVzaXppbmdXaXRoS2V5Ym9hcmRdXSkpO1xuICB9XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQW5ub3RhdGlvbkVkaXRvcikge1xuICAgICAgdW5yZWFjaGFibGUoXCJDYW5ub3QgaW5pdGlhbGl6ZSBBbm5vdGF0aW9uRWRpdG9yLlwiKTtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJhbWV0ZXJzLnBhcmVudDtcbiAgICB0aGlzLmlkID0gcGFyYW1ldGVycy5pZDtcbiAgICB0aGlzLndpZHRoID0gdGhpcy5oZWlnaHQgPSBudWxsO1xuICAgIHRoaXMucGFnZUluZGV4ID0gcGFyYW1ldGVycy5wYXJlbnQucGFnZUluZGV4O1xuICAgIHRoaXMubmFtZSA9IHBhcmFtZXRlcnMubmFtZTtcbiAgICB0aGlzLmRpdiA9IG51bGw7XG4gICAgdGhpcy5fdWlNYW5hZ2VyID0gcGFyYW1ldGVycy51aU1hbmFnZXI7XG4gICAgdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkID0gbnVsbDtcbiAgICB0aGlzLl93aWxsS2VlcEFzcGVjdFJhdGlvID0gZmFsc2U7XG4gICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNDZW50ZXJlZCA9IHBhcmFtZXRlcnMuaXNDZW50ZXJlZDtcbiAgICB0aGlzLl9zdHJ1Y3RUcmVlUGFyZW50SWQgPSBudWxsO1xuICAgIGNvbnN0IHtcbiAgICAgIHJvdGF0aW9uLFxuICAgICAgcmF3RGltczoge1xuICAgICAgICBwYWdlV2lkdGgsXG4gICAgICAgIHBhZ2VIZWlnaHQsXG4gICAgICAgIHBhZ2VYLFxuICAgICAgICBwYWdlWVxuICAgICAgfVxuICAgIH0gPSB0aGlzLnBhcmVudC52aWV3cG9ydDtcbiAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG4gICAgdGhpcy5wYWdlUm90YXRpb24gPSAoMzYwICsgcm90YXRpb24gLSB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucm90YXRpb24pICUgMzYwO1xuICAgIHRoaXMucGFnZURpbWVuc2lvbnMgPSBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XTtcbiAgICB0aGlzLnBhZ2VUcmFuc2xhdGlvbiA9IFtwYWdlWCwgcGFnZVldO1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLnggPSBwYXJhbWV0ZXJzLnggLyB3aWR0aDtcbiAgICB0aGlzLnkgPSBwYXJhbWV0ZXJzLnkgLyBoZWlnaHQ7XG4gICAgdGhpcy5pc0F0dGFjaGVkVG9ET00gPSBmYWxzZTtcbiAgICB0aGlzLmRlbGV0ZWQgPSBmYWxzZTtcbiAgfVxuICBnZXQgZWRpdG9yVHlwZSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yLl90eXBlO1xuICB9XG4gIHN0YXRpYyBnZXQgX2RlZmF1bHRMaW5lQ29sb3IoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9kZWZhdWx0TGluZUNvbG9yXCIsIHRoaXMuX2NvbG9yTWFuYWdlci5nZXRIZXhDb2RlKFwiQ2FudmFzVGV4dFwiKSk7XG4gIH1cbiAgc3RhdGljIGRlbGV0ZUFubm90YXRpb25FbGVtZW50KGVkaXRvcikge1xuICAgIGNvbnN0IGZha2VFZGl0b3IgPSBuZXcgRmFrZUVkaXRvcih7XG4gICAgICBpZDogZWRpdG9yLnBhcmVudC5nZXROZXh0SWQoKSxcbiAgICAgIHBhcmVudDogZWRpdG9yLnBhcmVudCxcbiAgICAgIHVpTWFuYWdlcjogZWRpdG9yLl91aU1hbmFnZXJcbiAgICB9KTtcbiAgICBmYWtlRWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQgPSBlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZDtcbiAgICBmYWtlRWRpdG9yLmRlbGV0ZWQgPSB0cnVlO1xuICAgIGZha2VFZGl0b3IuX3VpTWFuYWdlci5hZGRUb0Fubm90YXRpb25TdG9yYWdlKGZha2VFZGl0b3IpO1xuICB9XG4gIHN0YXRpYyBpbml0aWFsaXplKGwxMG4sIF91aU1hbmFnZXIsIG9wdGlvbnMpIHtcbiAgICBBbm5vdGF0aW9uRWRpdG9yLl9sMTBuUHJvbWlzZSB8fD0gbmV3IE1hcChbXCJwZGZqcy1lZGl0b3ItYWx0LXRleHQtYnV0dG9uLWxhYmVsXCIsIFwicGRmanMtZWRpdG9yLWFsdC10ZXh0LWVkaXQtYnV0dG9uLWxhYmVsXCIsIFwicGRmanMtZWRpdG9yLWFsdC10ZXh0LWRlY29yYXRpdmUtdG9vbHRpcFwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLXRvcExlZnRcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC10b3BNaWRkbGVcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC10b3BSaWdodFwiLCBcInBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLW1pZGRsZVJpZ2h0XCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtYm90dG9tUmlnaHRcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC1ib3R0b21NaWRkbGVcIiwgXCJwZGZqcy1lZGl0b3ItcmVzaXplci1sYWJlbC1ib3R0b21MZWZ0XCIsIFwicGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtbWlkZGxlTGVmdFwiXS5tYXAoc3RyID0+IFtzdHIsIGwxMG4uZ2V0KHN0ci5yZXBsYWNlQWxsKC8oW0EtWl0pL2csIGMgPT4gYC0ke2MudG9Mb3dlckNhc2UoKX1gKSldKSk7XG4gICAgaWYgKG9wdGlvbnM/LnN0cmluZ3MpIHtcbiAgICAgIGZvciAoY29uc3Qgc3RyIG9mIG9wdGlvbnMuc3RyaW5ncykge1xuICAgICAgICBBbm5vdGF0aW9uRWRpdG9yLl9sMTBuUHJvbWlzZS5zZXQoc3RyLCBsMTBuLmdldChzdHIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFubm90YXRpb25FZGl0b3IuX2JvcmRlckxpbmVXaWR0aCAhPT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5fYm9yZGVyTGluZVdpZHRoID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1vdXRsaW5lLXdpZHRoXCIpKSB8fCAwO1xuICB9XG4gIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKF90eXBlLCBfdmFsdWUpIHt9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgc3RhdGljIGlzSGFuZGxpbmdNaW1lRm9yUGFzdGluZyhtaW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0YXRpYyBwYXN0ZShpdGVtLCBwYXJlbnQpIHtcbiAgICB1bnJlYWNoYWJsZShcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBnZXQgX2lzRHJhZ2dhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLiNpc0RyYWdnYWJsZTtcbiAgfVxuICBzZXQgX2lzRHJhZ2dhYmxlKHZhbHVlKSB7XG4gICAgdGhpcy4jaXNEcmFnZ2FibGUgPSB2YWx1ZTtcbiAgICB0aGlzLmRpdj8uY2xhc3NMaXN0LnRvZ2dsZShcImRyYWdnYWJsZVwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGlzRW50ZXJIYW5kbGVkKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNlbnRlcigpIHtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgc3dpdGNoICh0aGlzLnBhcmVudFJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB0aGlzLnggLT0gdGhpcy5oZWlnaHQgKiBwYWdlSGVpZ2h0IC8gKHBhZ2VXaWR0aCAqIDIpO1xuICAgICAgICB0aGlzLnkgKz0gdGhpcy53aWR0aCAqIHBhZ2VXaWR0aCAvIChwYWdlSGVpZ2h0ICogMik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHRoaXMueCArPSB0aGlzLndpZHRoIC8gMjtcbiAgICAgICAgdGhpcy55ICs9IHRoaXMuaGVpZ2h0IC8gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgdGhpcy54ICs9IHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodCAvIChwYWdlV2lkdGggKiAyKTtcbiAgICAgICAgdGhpcy55IC09IHRoaXMud2lkdGggKiBwYWdlV2lkdGggLyAocGFnZUhlaWdodCAqIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMueCAtPSB0aGlzLndpZHRoIC8gMjtcbiAgICAgICAgdGhpcy55IC09IHRoaXMuaGVpZ2h0IC8gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICBhZGRDb21tYW5kcyhwYXJhbXMpIHtcbiAgICB0aGlzLl91aU1hbmFnZXIuYWRkQ29tbWFuZHMocGFyYW1zKTtcbiAgfVxuICBnZXQgY3VycmVudExheWVyKCkge1xuICAgIHJldHVybiB0aGlzLl91aU1hbmFnZXIuY3VycmVudExheWVyO1xuICB9XG4gIHNldEluQmFja2dyb3VuZCgpIHtcbiAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSAwO1xuICB9XG4gIHNldEluRm9yZWdyb3VuZCgpIHtcbiAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSB0aGlzLiN6SW5kZXg7XG4gIH1cbiAgc2V0UGFyZW50KHBhcmVudCkge1xuICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gcGFyZW50LnBhZ2VJbmRleDtcbiAgICAgIHRoaXMucGFnZURpbWVuc2lvbnMgPSBwYXJlbnQucGFnZURpbWVuc2lvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI3N0b3BSZXNpemluZygpO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgfVxuICBmb2N1c2luKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9mb2N1c0V2ZW50c0FsbG93ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNoYXNCZWVuQ2xpY2tlZCkge1xuICAgICAgdGhpcy5wYXJlbnQuc2V0U2VsZWN0ZWQodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2hhc0JlZW5DbGlja2VkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGZvY3Vzb3V0KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9mb2N1c0V2ZW50c0FsbG93ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICAgIGlmICh0YXJnZXQ/LmNsb3Nlc3QoYCMke3RoaXMuaWR9YCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMucGFyZW50Py5pc011bHRpcGxlU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgfVxuICB9XG4gIGNvbW1pdE9yUmVtb3ZlKCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21taXQoKTtcbiAgICB9XG4gIH1cbiAgY29tbWl0KCkge1xuICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuICB9XG4gIGFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoKSB7XG4gICAgdGhpcy5fdWlNYW5hZ2VyLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UodGhpcyk7XG4gIH1cbiAgc2V0QXQoeCwgeSwgdHgsIHR5KSB7XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIFt0eCwgdHldID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih0eCwgdHkpO1xuICAgIHRoaXMueCA9ICh4ICsgdHgpIC8gd2lkdGg7XG4gICAgdGhpcy55ID0gKHkgKyB0eSkgLyBoZWlnaHQ7XG4gICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICB9XG4gICN0cmFuc2xhdGUoW3dpZHRoLCBoZWlnaHRdLCB4LCB5KSB7XG4gICAgW3gsIHldID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih4LCB5KTtcbiAgICB0aGlzLnggKz0geCAvIHdpZHRoO1xuICAgIHRoaXMueSArPSB5IC8gaGVpZ2h0O1xuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICB0cmFuc2xhdGUoeCwgeSkge1xuICAgIHRoaXMuI3RyYW5zbGF0ZSh0aGlzLnBhcmVudERpbWVuc2lvbnMsIHgsIHkpO1xuICB9XG4gIHRyYW5zbGF0ZUluUGFnZSh4LCB5KSB7XG4gICAgdGhpcy4jaW5pdGlhbFBvc2l0aW9uIHx8PSBbdGhpcy54LCB0aGlzLnldO1xuICAgIHRoaXMuI3RyYW5zbGF0ZSh0aGlzLnBhZ2VEaW1lbnNpb25zLCB4LCB5KTtcbiAgICB0aGlzLmRpdi5zY3JvbGxJbnRvVmlldyh7XG4gICAgICBibG9jazogXCJuZWFyZXN0XCJcbiAgICB9KTtcbiAgfVxuICBkcmFnKHR4LCB0eSkge1xuICAgIHRoaXMuI2luaXRpYWxQb3NpdGlvbiB8fD0gW3RoaXMueCwgdGhpcy55XTtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy54ICs9IHR4IC8gcGFyZW50V2lkdGg7XG4gICAgdGhpcy55ICs9IHR5IC8gcGFyZW50SGVpZ2h0O1xuICAgIGlmICh0aGlzLnBhcmVudCAmJiAodGhpcy54IDwgMCB8fCB0aGlzLnggPiAxIHx8IHRoaXMueSA8IDAgfHwgdGhpcy55ID4gMSkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHRoaXMuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHRoaXMucGFyZW50LmZpbmROZXdQYXJlbnQodGhpcywgeCwgeSkpIHtcbiAgICAgICAgdGhpcy54IC09IE1hdGguZmxvb3IodGhpcy54KTtcbiAgICAgICAgdGhpcy55IC09IE1hdGguZmxvb3IodGhpcy55KTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3QgW2J4LCBieV0gPSB0aGlzLmdldEJhc2VUcmFuc2xhdGlvbigpO1xuICAgIHggKz0gYng7XG4gICAgeSArPSBieTtcbiAgICB0aGlzLmRpdi5zdHlsZS5sZWZ0ID0gYCR7KDEwMCAqIHgpLnRvRml4ZWQoMil9JWA7XG4gICAgdGhpcy5kaXYuc3R5bGUudG9wID0gYCR7KDEwMCAqIHkpLnRvRml4ZWQoMil9JWA7XG4gICAgdGhpcy5kaXYuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgYmxvY2s6IFwibmVhcmVzdFwiXG4gICAgfSk7XG4gIH1cbiAgZ2V0IF9oYXNCZWVuTW92ZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy4jaW5pdGlhbFBvc2l0aW9uICYmICh0aGlzLiNpbml0aWFsUG9zaXRpb25bMF0gIT09IHRoaXMueCB8fCB0aGlzLiNpbml0aWFsUG9zaXRpb25bMV0gIT09IHRoaXMueSk7XG4gIH1cbiAgZ2V0QmFzZVRyYW5zbGF0aW9uKCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBjb25zdCB7XG4gICAgICBfYm9yZGVyTGluZVdpZHRoXG4gICAgfSA9IEFubm90YXRpb25FZGl0b3I7XG4gICAgY29uc3QgeCA9IF9ib3JkZXJMaW5lV2lkdGggLyBwYXJlbnRXaWR0aDtcbiAgICBjb25zdCB5ID0gX2JvcmRlckxpbmVXaWR0aCAvIHBhcmVudEhlaWdodDtcbiAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJldHVybiBbLXgsIHldO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiBbeCwgeV07XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgcmV0dXJuIFt4LCAteV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gWy14LCAteV07XG4gICAgfVxuICB9XG4gIGdldCBfbXVzdEZpeFBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZpeEFuZFNldFBvc2l0aW9uKHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbikge1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICBsZXQge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSB0aGlzO1xuICAgIHdpZHRoICo9IHBhZ2VXaWR0aDtcbiAgICBoZWlnaHQgKj0gcGFnZUhlaWdodDtcbiAgICB4ICo9IHBhZ2VXaWR0aDtcbiAgICB5ICo9IHBhZ2VIZWlnaHQ7XG4gICAgaWYgKHRoaXMuX211c3RGaXhQb3NpdGlvbikge1xuICAgICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgeCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VXaWR0aCAtIHdpZHRoLCB4KSk7XG4gICAgICAgICAgeSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VIZWlnaHQgLSBoZWlnaHQsIHkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZVdpZHRoIC0gaGVpZ2h0LCB4KSk7XG4gICAgICAgICAgeSA9IE1hdGgubWluKHBhZ2VIZWlnaHQsIE1hdGgubWF4KHdpZHRoLCB5KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTgwOlxuICAgICAgICAgIHggPSBNYXRoLm1pbihwYWdlV2lkdGgsIE1hdGgubWF4KHdpZHRoLCB4KSk7XG4gICAgICAgICAgeSA9IE1hdGgubWluKHBhZ2VIZWlnaHQsIE1hdGgubWF4KGhlaWdodCwgeSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICB4ID0gTWF0aC5taW4ocGFnZVdpZHRoLCBNYXRoLm1heChoZWlnaHQsIHgpKTtcbiAgICAgICAgICB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFnZUhlaWdodCAtIHdpZHRoLCB5KSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMueCA9IHggLz0gcGFnZVdpZHRoO1xuICAgIHRoaXMueSA9IHkgLz0gcGFnZUhlaWdodDtcbiAgICBjb25zdCBbYngsIGJ5XSA9IHRoaXMuZ2V0QmFzZVRyYW5zbGF0aW9uKCk7XG4gICAgeCArPSBieDtcbiAgICB5ICs9IGJ5O1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IHRoaXMuZGl2O1xuICAgIHN0eWxlLmxlZnQgPSBgJHsoMTAwICogeCkudG9GaXhlZCgyKX0lYDtcbiAgICBzdHlsZS50b3AgPSBgJHsoMTAwICogeSkudG9GaXhlZCgyKX0lYDtcbiAgICB0aGlzLm1vdmVJbkRPTSgpO1xuICB9XG4gIHN0YXRpYyAjcm90YXRlUG9pbnQoeCwgeSwgYW5nbGUpIHtcbiAgICBzd2l0Y2ggKGFuZ2xlKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICByZXR1cm4gW3ksIC14XTtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByZXR1cm4gWy14LCAteV07XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgcmV0dXJuIFsteSwgeF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW3gsIHldO1xuICAgIH1cbiAgfVxuICBzY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIEFubm90YXRpb25FZGl0b3IuI3JvdGF0ZVBvaW50KHgsIHksIHRoaXMucGFyZW50Um90YXRpb24pO1xuICB9XG4gIHBhZ2VUcmFuc2xhdGlvblRvU2NyZWVuKHgsIHkpIHtcbiAgICByZXR1cm4gQW5ub3RhdGlvbkVkaXRvci4jcm90YXRlUG9pbnQoeCwgeSwgMzYwIC0gdGhpcy5wYXJlbnRSb3RhdGlvbik7XG4gIH1cbiAgI2dldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uKSB7XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICByZXR1cm4gWzAsIC1wYWdlV2lkdGggLyBwYWdlSGVpZ2h0LCBwYWdlSGVpZ2h0IC8gcGFnZVdpZHRoLCAwXTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiBbLTEsIDAsIDAsIC0xXTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgICAgICAgIHJldHVybiBbMCwgcGFnZVdpZHRoIC8gcGFnZUhlaWdodCwgLXBhZ2VIZWlnaHQgLyBwYWdlV2lkdGgsIDBdO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gWzEsIDAsIDAsIDFdO1xuICAgIH1cbiAgfVxuICBnZXQgcGFyZW50U2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycy5yZWFsU2NhbGU7XG4gIH1cbiAgZ2V0IHBhcmVudFJvdGF0aW9uKCkge1xuICAgIHJldHVybiAodGhpcy5fdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uICsgdGhpcy5wYWdlUm90YXRpb24pICUgMzYwO1xuICB9XG4gIGdldCBwYXJlbnREaW1lbnNpb25zKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHBhcmVudFNjYWxlLFxuICAgICAgcGFnZURpbWVuc2lvbnM6IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdXG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qgc2NhbGVkV2lkdGggPSBwYWdlV2lkdGggKiBwYXJlbnRTY2FsZTtcbiAgICBjb25zdCBzY2FsZWRIZWlnaHQgPSBwYWdlSGVpZ2h0ICogcGFyZW50U2NhbGU7XG4gICAgcmV0dXJuIHV0aWxfRmVhdHVyZVRlc3QuaXNDU1NSb3VuZFN1cHBvcnRlZCA/IFtNYXRoLnJvdW5kKHNjYWxlZFdpZHRoKSwgTWF0aC5yb3VuZChzY2FsZWRIZWlnaHQpXSA6IFtzY2FsZWRXaWR0aCwgc2NhbGVkSGVpZ2h0XTtcbiAgfVxuICBzZXREaW1zKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy5kaXYuc3R5bGUud2lkdGggPSBgJHsoMTAwICogd2lkdGggLyBwYXJlbnRXaWR0aCkudG9GaXhlZCgyKX0lYDtcbiAgICBpZiAoIXRoaXMuI2tlZXBBc3BlY3RSYXRpbykge1xuICAgICAgdGhpcy5kaXYuc3R5bGUuaGVpZ2h0ID0gYCR7KDEwMCAqIGhlaWdodCAvIHBhcmVudEhlaWdodCkudG9GaXhlZCgyKX0lYDtcbiAgICB9XG4gIH1cbiAgZml4RGltcygpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLmRpdjtcbiAgICBjb25zdCB7XG4gICAgICBoZWlnaHQsXG4gICAgICB3aWR0aFxuICAgIH0gPSBzdHlsZTtcbiAgICBjb25zdCB3aWR0aFBlcmNlbnQgPSB3aWR0aC5lbmRzV2l0aChcIiVcIik7XG4gICAgY29uc3QgaGVpZ2h0UGVyY2VudCA9ICF0aGlzLiNrZWVwQXNwZWN0UmF0aW8gJiYgaGVpZ2h0LmVuZHNXaXRoKFwiJVwiKTtcbiAgICBpZiAod2lkdGhQZXJjZW50ICYmIGhlaWdodFBlcmNlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgIGlmICghd2lkdGhQZXJjZW50KSB7XG4gICAgICBzdHlsZS53aWR0aCA9IGAkeygxMDAgKiBwYXJzZUZsb2F0KHdpZHRoKSAvIHBhcmVudFdpZHRoKS50b0ZpeGVkKDIpfSVgO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2tlZXBBc3BlY3RSYXRpbyAmJiAhaGVpZ2h0UGVyY2VudCkge1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gYCR7KDEwMCAqIHBhcnNlRmxvYXQoaGVpZ2h0KSAvIHBhcmVudEhlaWdodCkudG9GaXhlZCgyKX0lYDtcbiAgICB9XG4gIH1cbiAgZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCkge1xuICAgIHJldHVybiBbMCwgMF07XG4gIH1cbiAgI2NyZWF0ZVJlc2l6ZXJzKCkge1xuICAgIGlmICh0aGlzLiNyZXNpemVyc0Rpdikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNyZXNpemVyc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy4jcmVzaXplcnNEaXYuY2xhc3NMaXN0LmFkZChcInJlc2l6ZXJzXCIpO1xuICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLl93aWxsS2VlcEFzcGVjdFJhdGlvID8gW1widG9wTGVmdFwiLCBcInRvcFJpZ2h0XCIsIFwiYm90dG9tUmlnaHRcIiwgXCJib3R0b21MZWZ0XCJdIDogW1widG9wTGVmdFwiLCBcInRvcE1pZGRsZVwiLCBcInRvcFJpZ2h0XCIsIFwibWlkZGxlUmlnaHRcIiwgXCJib3R0b21SaWdodFwiLCBcImJvdHRvbU1pZGRsZVwiLCBcImJvdHRvbUxlZnRcIiwgXCJtaWRkbGVMZWZ0XCJdO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBjbGFzc2VzKSB7XG4gICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdGhpcy4jcmVzaXplcnNEaXYuYXBwZW5kKGRpdik7XG4gICAgICBkaXYuY2xhc3NMaXN0LmFkZChcInJlc2l6ZXJcIiwgbmFtZSk7XG4gICAgICBkaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1yZXNpemVyLW5hbWVcIiwgbmFtZSk7XG4gICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI3Jlc2l6ZXJQb2ludGVyZG93bi5iaW5kKHRoaXMsIG5hbWUpLCB7XG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG4gICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIGRpdi50YWJJbmRleCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLmRpdi5wcmVwZW5kKHRoaXMuI3Jlc2l6ZXJzRGl2KTtcbiAgfVxuICAjcmVzaXplclBvaW50ZXJkb3duKG5hbWUsIGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgZXZlbnQuY3RybEtleSAmJiBpc01hYykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhbHRUZXh0Py50b2dnbGUoZmFsc2UpO1xuICAgIGNvbnN0IGJvdW5kUmVzaXplclBvaW50ZXJtb3ZlID0gdGhpcy4jcmVzaXplclBvaW50ZXJtb3ZlLmJpbmQodGhpcywgbmFtZSk7XG4gICAgY29uc3Qgc2F2ZWREcmFnZ2FibGUgPSB0aGlzLl9pc0RyYWdnYWJsZTtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGNvbnN0IHBvaW50ZXJNb3ZlT3B0aW9ucyA9IHtcbiAgICAgIHBhc3NpdmU6IHRydWUsXG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgc2lnbmFsXG4gICAgfTtcbiAgICB0aGlzLnBhcmVudC50b2dnbGVQb2ludGVyRXZlbnRzKGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIGJvdW5kUmVzaXplclBvaW50ZXJtb3ZlLCBwb2ludGVyTW92ZU9wdGlvbnMpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgY29uc3Qgc2F2ZWRYID0gdGhpcy54O1xuICAgIGNvbnN0IHNhdmVkWSA9IHRoaXMueTtcbiAgICBjb25zdCBzYXZlZFdpZHRoID0gdGhpcy53aWR0aDtcbiAgICBjb25zdCBzYXZlZEhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgIGNvbnN0IHNhdmVkUGFyZW50Q3Vyc29yID0gdGhpcy5wYXJlbnQuZGl2LnN0eWxlLmN1cnNvcjtcbiAgICBjb25zdCBzYXZlZEN1cnNvciA9IHRoaXMuZGl2LnN0eWxlLmN1cnNvcjtcbiAgICB0aGlzLmRpdi5zdHlsZS5jdXJzb3IgPSB0aGlzLnBhcmVudC5kaXYuc3R5bGUuY3Vyc29yID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZXZlbnQudGFyZ2V0KS5jdXJzb3I7XG4gICAgY29uc3QgcG9pbnRlclVwQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLnBhcmVudC50b2dnbGVQb2ludGVyRXZlbnRzKHRydWUpO1xuICAgICAgdGhpcy4jYWx0VGV4dD8udG9nZ2xlKHRydWUpO1xuICAgICAgdGhpcy5faXNEcmFnZ2FibGUgPSBzYXZlZERyYWdnYWJsZTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJVcENhbGxiYWNrKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVyVXBDYWxsYmFjayk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIGJvdW5kUmVzaXplclBvaW50ZXJtb3ZlLCBwb2ludGVyTW92ZU9wdGlvbnMpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51KTtcbiAgICAgIHRoaXMucGFyZW50LmRpdi5zdHlsZS5jdXJzb3IgPSBzYXZlZFBhcmVudEN1cnNvcjtcbiAgICAgIHRoaXMuZGl2LnN0eWxlLmN1cnNvciA9IHNhdmVkQ3Vyc29yO1xuICAgICAgdGhpcy4jYWRkUmVzaXplVG9VbmRvU3RhY2soc2F2ZWRYLCBzYXZlZFksIHNhdmVkV2lkdGgsIHNhdmVkSGVpZ2h0KTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJVcENhbGxiYWNrLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgcG9pbnRlclVwQ2FsbGJhY2ssIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gICNhZGRSZXNpemVUb1VuZG9TdGFjayhzYXZlZFgsIHNhdmVkWSwgc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpIHtcbiAgICBjb25zdCBuZXdYID0gdGhpcy54O1xuICAgIGNvbnN0IG5ld1kgPSB0aGlzLnk7XG4gICAgY29uc3QgbmV3V2lkdGggPSB0aGlzLndpZHRoO1xuICAgIGNvbnN0IG5ld0hlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgIGlmIChuZXdYID09PSBzYXZlZFggJiYgbmV3WSA9PT0gc2F2ZWRZICYmIG5ld1dpZHRoID09PSBzYXZlZFdpZHRoICYmIG5ld0hlaWdodCA9PT0gc2F2ZWRIZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy53aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgICAgdGhpcy54ID0gbmV3WDtcbiAgICAgICAgdGhpcy55ID0gbmV3WTtcbiAgICAgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICB0aGlzLnNldERpbXMocGFyZW50V2lkdGggKiBuZXdXaWR0aCwgcGFyZW50SGVpZ2h0ICogbmV3SGVpZ2h0KTtcbiAgICAgICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgdGhpcy53aWR0aCA9IHNhdmVkV2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gc2F2ZWRIZWlnaHQ7XG4gICAgICAgIHRoaXMueCA9IHNhdmVkWDtcbiAgICAgICAgdGhpcy55ID0gc2F2ZWRZO1xuICAgICAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgIHRoaXMuc2V0RGltcyhwYXJlbnRXaWR0aCAqIHNhdmVkV2lkdGgsIHBhcmVudEhlaWdodCAqIHNhdmVkSGVpZ2h0KTtcbiAgICAgICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIG11c3RFeGVjOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgI3Jlc2l6ZXJQb2ludGVybW92ZShuYW1lLCBldmVudCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBjb25zdCBzYXZlZFggPSB0aGlzLng7XG4gICAgY29uc3Qgc2F2ZWRZID0gdGhpcy55O1xuICAgIGNvbnN0IHNhdmVkV2lkdGggPSB0aGlzLndpZHRoO1xuICAgIGNvbnN0IHNhdmVkSGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgY29uc3QgbWluV2lkdGggPSBBbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFIC8gcGFyZW50V2lkdGg7XG4gICAgY29uc3QgbWluSGVpZ2h0ID0gQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSAvIHBhcmVudEhlaWdodDtcbiAgICBjb25zdCByb3VuZCA9IHggPT4gTWF0aC5yb3VuZCh4ICogMTAwMDApIC8gMTAwMDA7XG4gICAgY29uc3Qgcm90YXRpb25NYXRyaXggPSB0aGlzLiNnZXRSb3RhdGlvbk1hdHJpeCh0aGlzLnJvdGF0aW9uKTtcbiAgICBjb25zdCB0cmFuc2YgPSAoeCwgeSkgPT4gW3JvdGF0aW9uTWF0cml4WzBdICogeCArIHJvdGF0aW9uTWF0cml4WzJdICogeSwgcm90YXRpb25NYXRyaXhbMV0gKiB4ICsgcm90YXRpb25NYXRyaXhbM10gKiB5XTtcbiAgICBjb25zdCBpbnZSb3RhdGlvbk1hdHJpeCA9IHRoaXMuI2dldFJvdGF0aW9uTWF0cml4KDM2MCAtIHRoaXMucm90YXRpb24pO1xuICAgIGNvbnN0IGludlRyYW5zZiA9ICh4LCB5KSA9PiBbaW52Um90YXRpb25NYXRyaXhbMF0gKiB4ICsgaW52Um90YXRpb25NYXRyaXhbMl0gKiB5LCBpbnZSb3RhdGlvbk1hdHJpeFsxXSAqIHggKyBpbnZSb3RhdGlvbk1hdHJpeFszXSAqIHldO1xuICAgIGxldCBnZXRQb2ludDtcbiAgICBsZXQgZ2V0T3Bwb3NpdGU7XG4gICAgbGV0IGlzRGlhZ29uYWwgPSBmYWxzZTtcbiAgICBsZXQgaXNIb3Jpem9udGFsID0gZmFsc2U7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlIFwidG9wTGVmdFwiOlxuICAgICAgICBpc0RpYWdvbmFsID0gdHJ1ZTtcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gWzAsIDBdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbdywgaF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRvcE1pZGRsZVwiOlxuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbdyAvIDIsIDBdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbdyAvIDIsIGhdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0b3BSaWdodFwiOlxuICAgICAgICBpc0RpYWdvbmFsID0gdHJ1ZTtcbiAgICAgICAgZ2V0UG9pbnQgPSAodywgaCkgPT4gW3csIDBdO1xuICAgICAgICBnZXRPcHBvc2l0ZSA9ICh3LCBoKSA9PiBbMCwgaF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1pZGRsZVJpZ2h0XCI6XG4gICAgICAgIGlzSG9yaXpvbnRhbCA9IHRydWU7XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFt3LCBoIC8gMl07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFswLCBoIC8gMl07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJvdHRvbVJpZ2h0XCI6XG4gICAgICAgIGlzRGlhZ29uYWwgPSB0cnVlO1xuICAgICAgICBnZXRQb2ludCA9ICh3LCBoKSA9PiBbdywgaF07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFswLCAwXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYm90dG9tTWlkZGxlXCI6XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFt3IC8gMiwgaF07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFt3IC8gMiwgMF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJvdHRvbUxlZnRcIjpcbiAgICAgICAgaXNEaWFnb25hbCA9IHRydWU7XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFswLCBoXTtcbiAgICAgICAgZ2V0T3Bwb3NpdGUgPSAodywgaCkgPT4gW3csIDBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJtaWRkbGVMZWZ0XCI6XG4gICAgICAgIGlzSG9yaXpvbnRhbCA9IHRydWU7XG4gICAgICAgIGdldFBvaW50ID0gKHcsIGgpID0+IFswLCBoIC8gMl07XG4gICAgICAgIGdldE9wcG9zaXRlID0gKHcsIGgpID0+IFt3LCBoIC8gMl07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBwb2ludCA9IGdldFBvaW50KHNhdmVkV2lkdGgsIHNhdmVkSGVpZ2h0KTtcbiAgICBjb25zdCBvcHBvc2l0ZVBvaW50ID0gZ2V0T3Bwb3NpdGUoc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpO1xuICAgIGxldCB0cmFuc2ZPcHBvc2l0ZVBvaW50ID0gdHJhbnNmKC4uLm9wcG9zaXRlUG9pbnQpO1xuICAgIGNvbnN0IG9wcG9zaXRlWCA9IHJvdW5kKHNhdmVkWCArIHRyYW5zZk9wcG9zaXRlUG9pbnRbMF0pO1xuICAgIGNvbnN0IG9wcG9zaXRlWSA9IHJvdW5kKHNhdmVkWSArIHRyYW5zZk9wcG9zaXRlUG9pbnRbMV0pO1xuICAgIGxldCByYXRpb1ggPSAxO1xuICAgIGxldCByYXRpb1kgPSAxO1xuICAgIGxldCBbZGVsdGFYLCBkZWx0YVldID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbihldmVudC5tb3ZlbWVudFgsIGV2ZW50Lm1vdmVtZW50WSk7XG4gICAgW2RlbHRhWCwgZGVsdGFZXSA9IGludlRyYW5zZihkZWx0YVggLyBwYXJlbnRXaWR0aCwgZGVsdGFZIC8gcGFyZW50SGVpZ2h0KTtcbiAgICBpZiAoaXNEaWFnb25hbCkge1xuICAgICAgY29uc3Qgb2xkRGlhZyA9IE1hdGguaHlwb3Qoc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpO1xuICAgICAgcmF0aW9YID0gcmF0aW9ZID0gTWF0aC5tYXgoTWF0aC5taW4oTWF0aC5oeXBvdChvcHBvc2l0ZVBvaW50WzBdIC0gcG9pbnRbMF0gLSBkZWx0YVgsIG9wcG9zaXRlUG9pbnRbMV0gLSBwb2ludFsxXSAtIGRlbHRhWSkgLyBvbGREaWFnLCAxIC8gc2F2ZWRXaWR0aCwgMSAvIHNhdmVkSGVpZ2h0KSwgbWluV2lkdGggLyBzYXZlZFdpZHRoLCBtaW5IZWlnaHQgLyBzYXZlZEhlaWdodCk7XG4gICAgfSBlbHNlIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgIHJhdGlvWCA9IE1hdGgubWF4KG1pbldpZHRoLCBNYXRoLm1pbigxLCBNYXRoLmFicyhvcHBvc2l0ZVBvaW50WzBdIC0gcG9pbnRbMF0gLSBkZWx0YVgpKSkgLyBzYXZlZFdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICByYXRpb1kgPSBNYXRoLm1heChtaW5IZWlnaHQsIE1hdGgubWluKDEsIE1hdGguYWJzKG9wcG9zaXRlUG9pbnRbMV0gLSBwb2ludFsxXSAtIGRlbHRhWSkpKSAvIHNhdmVkSGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBuZXdXaWR0aCA9IHJvdW5kKHNhdmVkV2lkdGggKiByYXRpb1gpO1xuICAgIGNvbnN0IG5ld0hlaWdodCA9IHJvdW5kKHNhdmVkSGVpZ2h0ICogcmF0aW9ZKTtcbiAgICB0cmFuc2ZPcHBvc2l0ZVBvaW50ID0gdHJhbnNmKC4uLmdldE9wcG9zaXRlKG5ld1dpZHRoLCBuZXdIZWlnaHQpKTtcbiAgICBjb25zdCBuZXdYID0gb3Bwb3NpdGVYIC0gdHJhbnNmT3Bwb3NpdGVQb2ludFswXTtcbiAgICBjb25zdCBuZXdZID0gb3Bwb3NpdGVZIC0gdHJhbnNmT3Bwb3NpdGVQb2ludFsxXTtcbiAgICB0aGlzLndpZHRoID0gbmV3V2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgdGhpcy54ID0gbmV3WDtcbiAgICB0aGlzLnkgPSBuZXdZO1xuICAgIHRoaXMuc2V0RGltcyhwYXJlbnRXaWR0aCAqIG5ld1dpZHRoLCBwYXJlbnRIZWlnaHQgKiBuZXdIZWlnaHQpO1xuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICBhbHRUZXh0RmluaXNoKCkge1xuICAgIHRoaXMuI2FsdFRleHQ/LmZpbmlzaCgpO1xuICB9XG4gIGFzeW5jIGFkZEVkaXRUb29sYmFyKCkge1xuICAgIGlmICh0aGlzLiNlZGl0VG9vbGJhciB8fCB0aGlzLiNpc0luRWRpdE1vZGUpIHtcbiAgICAgIHJldHVybiB0aGlzLiNlZGl0VG9vbGJhcjtcbiAgICB9XG4gICAgdGhpcy4jZWRpdFRvb2xiYXIgPSBuZXcgRWRpdG9yVG9vbGJhcih0aGlzKTtcbiAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy4jZWRpdFRvb2xiYXIucmVuZGVyKCkpO1xuICAgIGlmICh0aGlzLiNhbHRUZXh0KSB7XG4gICAgICB0aGlzLiNlZGl0VG9vbGJhci5hZGRBbHRUZXh0QnV0dG9uKGF3YWl0IHRoaXMuI2FsdFRleHQucmVuZGVyKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jZWRpdFRvb2xiYXI7XG4gIH1cbiAgcmVtb3ZlRWRpdFRvb2xiYXIoKSB7XG4gICAgaWYgKCF0aGlzLiNlZGl0VG9vbGJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNlZGl0VG9vbGJhci5yZW1vdmUoKTtcbiAgICB0aGlzLiNlZGl0VG9vbGJhciA9IG51bGw7XG4gICAgdGhpcy4jYWx0VGV4dD8uZGVzdHJveSgpO1xuICB9XG4gIGdldENsaWVudERpbWVuc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB9XG4gIGFzeW5jIGFkZEFsdFRleHRCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMuI2FsdFRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgQWx0VGV4dC5pbml0aWFsaXplKEFubm90YXRpb25FZGl0b3IuX2wxMG5Qcm9taXNlKTtcbiAgICB0aGlzLiNhbHRUZXh0ID0gbmV3IEFsdFRleHQodGhpcyk7XG4gICAgaWYgKHRoaXMuI2FjY2Vzc2liaWxpdHlEYXRhKSB7XG4gICAgICB0aGlzLiNhbHRUZXh0LmRhdGEgPSB0aGlzLiNhY2Nlc3NpYmlsaXR5RGF0YTtcbiAgICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlEYXRhID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5hZGRFZGl0VG9vbGJhcigpO1xuICB9XG4gIGdldCBhbHRUZXh0RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy4jYWx0VGV4dD8uZGF0YTtcbiAgfVxuICBzZXQgYWx0VGV4dERhdGEoZGF0YSkge1xuICAgIGlmICghdGhpcy4jYWx0VGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhbHRUZXh0LmRhdGEgPSBkYXRhO1xuICB9XG4gIGhhc0FsdFRleHQoKSB7XG4gICAgcmV0dXJuICF0aGlzLiNhbHRUZXh0Py5pc0VtcHR5KCk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXRvci1yb3RhdGlvblwiLCAoMzYwIC0gdGhpcy5yb3RhdGlvbikgJSAzNjApO1xuICAgIHRoaXMuZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZTtcbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLmlkKTtcbiAgICB0aGlzLmRpdi50YWJJbmRleCA9IHRoaXMuI2Rpc2FibGVkID8gLTEgOiAwO1xuICAgIGlmICghdGhpcy5faXNWaXNpYmxlKSB7XG4gICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIH1cbiAgICB0aGlzLnNldEluRm9yZWdyb3VuZCgpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIHRoaXMuI2JvdW5kRm9jdXNpbiwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2JvdW5kRm9jdXNvdXQsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBpZiAodGhpcy5wYXJlbnRSb3RhdGlvbiAlIDE4MCAhPT0gMCkge1xuICAgICAgdGhpcy5kaXYuc3R5bGUubWF4V2lkdGggPSBgJHsoMTAwICogcGFyZW50SGVpZ2h0IC8gcGFyZW50V2lkdGgpLnRvRml4ZWQoMil9JWA7XG4gICAgICB0aGlzLmRpdi5zdHlsZS5tYXhIZWlnaHQgPSBgJHsoMTAwICogcGFyZW50V2lkdGggLyBwYXJlbnRIZWlnaHQpLnRvRml4ZWQoMil9JWA7XG4gICAgfVxuICAgIGNvbnN0IFt0eCwgdHldID0gdGhpcy5nZXRJbml0aWFsVHJhbnNsYXRpb24oKTtcbiAgICB0aGlzLnRyYW5zbGF0ZSh0eCwgdHkpO1xuICAgIGJpbmRFdmVudHModGhpcywgdGhpcy5kaXYsIFtcInBvaW50ZXJkb3duXCJdKTtcbiAgICByZXR1cm4gdGhpcy5kaXY7XG4gIH1cbiAgcG9pbnRlcmRvd24oZXZlbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgZXZlbnQuY3RybEtleSAmJiBpc01hYykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaGFzQmVlbkNsaWNrZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9pc0RyYWdnYWJsZSkge1xuICAgICAgdGhpcy4jc2V0VXBEcmFnU2Vzc2lvbihldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3NlbGVjdE9uUG9pbnRlckV2ZW50KGV2ZW50KTtcbiAgfVxuICAjc2VsZWN0T25Qb2ludGVyRXZlbnQoZXZlbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpc01hY1xuICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgIGlmIChldmVudC5jdHJsS2V5ICYmICFpc01hYyB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5tZXRhS2V5ICYmIGlzTWFjKSB7XG4gICAgICB0aGlzLnBhcmVudC50b2dnbGVTZWxlY3RlZCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJlbnQuc2V0U2VsZWN0ZWQodGhpcyk7XG4gICAgfVxuICB9XG4gICNzZXRVcERyYWdTZXNzaW9uKGV2ZW50KSB7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IHRoaXMuX3VpTWFuYWdlci5pc1NlbGVjdGVkKHRoaXMpO1xuICAgIHRoaXMuX3VpTWFuYWdlci5zZXRVcERyYWdTZXNzaW9uKCk7XG4gICAgbGV0IHBvaW50ZXJNb3ZlT3B0aW9ucywgcG9pbnRlck1vdmVDYWxsYmFjaztcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcIm1vdmluZ1wiKTtcbiAgICAgIHBvaW50ZXJNb3ZlT3B0aW9ucyA9IHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgc2lnbmFsXG4gICAgICB9O1xuICAgICAgdGhpcy4jcHJldkRyYWdYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIHRoaXMuI3ByZXZEcmFnWSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBwb2ludGVyTW92ZUNhbGxiYWNrID0gZSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBjbGllbnRYOiB4LFxuICAgICAgICAgIGNsaWVudFk6IHlcbiAgICAgICAgfSA9IGU7XG4gICAgICAgIGNvbnN0IFt0eCwgdHldID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih4IC0gdGhpcy4jcHJldkRyYWdYLCB5IC0gdGhpcy4jcHJldkRyYWdZKTtcbiAgICAgICAgdGhpcy4jcHJldkRyYWdYID0geDtcbiAgICAgICAgdGhpcy4jcHJldkRyYWdZID0geTtcbiAgICAgICAgdGhpcy5fdWlNYW5hZ2VyLmRyYWdTZWxlY3RlZEVkaXRvcnModHgsIHR5KTtcbiAgICAgIH07XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHBvaW50ZXJNb3ZlQ2FsbGJhY2ssIHBvaW50ZXJNb3ZlT3B0aW9ucyk7XG4gICAgfVxuICAgIGNvbnN0IHBvaW50ZXJVcENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlclVwQ2FsbGJhY2spO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHBvaW50ZXJVcENhbGxiYWNrKTtcbiAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJtb3ZpbmdcIik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgcG9pbnRlck1vdmVDYWxsYmFjaywgcG9pbnRlck1vdmVPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI2hhc0JlZW5DbGlja2VkID0gZmFsc2U7XG4gICAgICBpZiAoIXRoaXMuX3VpTWFuYWdlci5lbmREcmFnU2Vzc2lvbigpKSB7XG4gICAgICAgIHRoaXMuI3NlbGVjdE9uUG9pbnRlckV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHBvaW50ZXJVcENhbGxiYWNrLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgcG9pbnRlclVwQ2FsbGJhY2ssIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gIG1vdmVJbkRPTSgpIHtcbiAgICBpZiAodGhpcy4jbW92ZUluRE9NVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI21vdmVJbkRPTVRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLiNtb3ZlSW5ET01UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiNtb3ZlSW5ET01UaW1lb3V0ID0gbnVsbDtcbiAgICAgIHRoaXMucGFyZW50Py5tb3ZlRWRpdG9ySW5ET00odGhpcyk7XG4gICAgfSwgMCk7XG4gIH1cbiAgX3NldFBhcmVudEFuZFBvc2l0aW9uKHBhcmVudCwgeCwgeSkge1xuICAgIHBhcmVudC5jaGFuZ2VQYXJlbnQodGhpcyk7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICBnZXRSZWN0KHR4LCB0eSwgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uKSB7XG4gICAgY29uc3Qgc2NhbGUgPSB0aGlzLnBhcmVudFNjYWxlO1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICBjb25zdCBbcGFnZVgsIHBhZ2VZXSA9IHRoaXMucGFnZVRyYW5zbGF0aW9uO1xuICAgIGNvbnN0IHNoaWZ0WCA9IHR4IC8gc2NhbGU7XG4gICAgY29uc3Qgc2hpZnRZID0gdHkgLyBzY2FsZTtcbiAgICBjb25zdCB4ID0gdGhpcy54ICogcGFnZVdpZHRoO1xuICAgIGNvbnN0IHkgPSB0aGlzLnkgKiBwYWdlSGVpZ2h0O1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aCAqIHBhZ2VXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodCAqIHBhZ2VIZWlnaHQ7XG4gICAgc3dpdGNoIChyb3RhdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gW3ggKyBzaGlmdFggKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgLSBzaGlmdFkgLSBoZWlnaHQgKyBwYWdlWSwgeCArIHNoaWZ0WCArIHdpZHRoICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5IC0gc2hpZnRZICsgcGFnZVldO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIFt4ICsgc2hpZnRZICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5ICsgc2hpZnRYICsgcGFnZVksIHggKyBzaGlmdFkgKyBoZWlnaHQgKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgKyBzaGlmdFggKyB3aWR0aCArIHBhZ2VZXTtcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICByZXR1cm4gW3ggLSBzaGlmdFggLSB3aWR0aCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSArIHNoaWZ0WSArIHBhZ2VZLCB4IC0gc2hpZnRYICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5ICsgc2hpZnRZICsgaGVpZ2h0ICsgcGFnZVldO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHJldHVybiBbeCAtIHNoaWZ0WSAtIGhlaWdodCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSAtIHNoaWZ0WCAtIHdpZHRoICsgcGFnZVksIHggLSBzaGlmdFkgKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgLSBzaGlmdFggKyBwYWdlWV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uXCIpO1xuICAgIH1cbiAgfVxuICBnZXRSZWN0SW5DdXJyZW50Q29vcmRzKHJlY3QsIHBhZ2VIZWlnaHQpIHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gcmVjdDtcbiAgICBjb25zdCB3aWR0aCA9IHgyIC0geDE7XG4gICAgY29uc3QgaGVpZ2h0ID0geTIgLSB5MTtcbiAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgcmV0dXJuIFt4MSwgcGFnZUhlaWdodCAtIHkyLCB3aWR0aCwgaGVpZ2h0XTtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIHJldHVybiBbeDEsIHBhZ2VIZWlnaHQgLSB5MSwgaGVpZ2h0LCB3aWR0aF07XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIFt4MiwgcGFnZUhlaWdodCAtIHkxLCB3aWR0aCwgaGVpZ2h0XTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4gW3gyLCBwYWdlSGVpZ2h0IC0geTIsIGhlaWdodCwgd2lkdGhdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcbiAgICB9XG4gIH1cbiAgb25jZUFkZGVkKCkge31cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZW5hYmxlRWRpdE1vZGUoKSB7XG4gICAgdGhpcy4jaXNJbkVkaXRNb2RlID0gdHJ1ZTtcbiAgfVxuICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgdGhpcy4jaXNJbkVkaXRNb2RlID0gZmFsc2U7XG4gIH1cbiAgaXNJbkVkaXRNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLiNpc0luRWRpdE1vZGU7XG4gIH1cbiAgc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZDtcbiAgfVxuICBuZWVkc1RvQmVSZWJ1aWx0KCkge1xuICAgIHJldHVybiB0aGlzLmRpdiAmJiAhdGhpcy5pc0F0dGFjaGVkVG9ET007XG4gIH1cbiAgcmVidWlsZCgpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICB0aGlzLmRpdj8uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgdGhpcy4jYm91bmRGb2N1c2luLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmRpdj8uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2JvdW5kRm9jdXNvdXQsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICB9XG4gIHJvdGF0ZShfYW5nbGUpIHt9XG4gIHNlcmlhbGl6ZShpc0ZvckNvcHlpbmcgPSBmYWxzZSwgY29udGV4dCA9IG51bGwpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFuIGVkaXRvciBtdXN0IGJlIHNlcmlhbGl6YWJsZVwiKTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBjb25zdCBlZGl0b3IgPSBuZXcgdGhpcy5wcm90b3R5cGUuY29uc3RydWN0b3Ioe1xuICAgICAgcGFyZW50LFxuICAgICAgaWQ6IHBhcmVudC5nZXROZXh0SWQoKSxcbiAgICAgIHVpTWFuYWdlclxuICAgIH0pO1xuICAgIGVkaXRvci5yb3RhdGlvbiA9IGRhdGEucm90YXRpb247XG4gICAgZWRpdG9yLiNhY2Nlc3NpYmlsaXR5RGF0YSA9IGRhdGEuYWNjZXNzaWJpbGl0eURhdGE7XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSBlZGl0b3IucGFnZURpbWVuc2lvbnM7XG4gICAgY29uc3QgW3gsIHksIHdpZHRoLCBoZWlnaHRdID0gZWRpdG9yLmdldFJlY3RJbkN1cnJlbnRDb29yZHMoZGF0YS5yZWN0LCBwYWdlSGVpZ2h0KTtcbiAgICBlZGl0b3IueCA9IHggLyBwYWdlV2lkdGg7XG4gICAgZWRpdG9yLnkgPSB5IC8gcGFnZUhlaWdodDtcbiAgICBlZGl0b3Iud2lkdGggPSB3aWR0aCAvIHBhZ2VXaWR0aDtcbiAgICBlZGl0b3IuaGVpZ2h0ID0gaGVpZ2h0IC8gcGFnZUhlaWdodDtcbiAgICByZXR1cm4gZWRpdG9yO1xuICB9XG4gIGdldCBoYXNCZWVuTW9kaWZpZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkICYmICh0aGlzLmRlbGV0ZWQgfHwgdGhpcy5zZXJpYWxpemUoKSAhPT0gbnVsbCk7XG4gIH1cbiAgcmVtb3ZlKCkge1xuICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIHRoaXMuI2JvdW5kRm9jdXNpbik7XG4gICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2JvdW5kRm9jdXNvdXQpO1xuICAgIGlmICghdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMuY29tbWl0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91aU1hbmFnZXIucmVtb3ZlRWRpdG9yKHRoaXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jbW92ZUluRE9NVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI21vdmVJbkRPTVRpbWVvdXQpO1xuICAgICAgdGhpcy4jbW92ZUluRE9NVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuI3N0b3BSZXNpemluZygpO1xuICAgIHRoaXMucmVtb3ZlRWRpdFRvb2xiYXIoKTtcbiAgICBpZiAodGhpcy4jdGVsZW1ldHJ5VGltZW91dHMpIHtcbiAgICAgIGZvciAoY29uc3QgdGltZW91dCBvZiB0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cy52YWx1ZXMoKSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB9XG4gICAgICB0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgfVxuICBnZXQgaXNSZXNpemFibGUoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1ha2VSZXNpemFibGUoKSB7XG4gICAgaWYgKHRoaXMuaXNSZXNpemFibGUpIHtcbiAgICAgIHRoaXMuI2NyZWF0ZVJlc2l6ZXJzKCk7XG4gICAgICB0aGlzLiNyZXNpemVyc0Rpdi5jbGFzc0xpc3QucmVtb3ZlKFwiaGlkZGVuXCIpO1xuICAgICAgYmluZEV2ZW50cyh0aGlzLCB0aGlzLmRpdiwgW1wia2V5ZG93blwiXSk7XG4gICAgfVxuICB9XG4gIGdldCB0b29sYmFyUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAga2V5ZG93bihldmVudCkge1xuICAgIGlmICghdGhpcy5pc1Jlc2l6YWJsZSB8fCBldmVudC50YXJnZXQgIT09IHRoaXMuZGl2IHx8IGV2ZW50LmtleSAhPT0gXCJFbnRlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3VpTWFuYWdlci5zZXRTZWxlY3RlZCh0aGlzKTtcbiAgICB0aGlzLiNzYXZlZERpbWVuc2lvbnMgPSB7XG4gICAgICBzYXZlZFg6IHRoaXMueCxcbiAgICAgIHNhdmVkWTogdGhpcy55LFxuICAgICAgc2F2ZWRXaWR0aDogdGhpcy53aWR0aCxcbiAgICAgIHNhdmVkSGVpZ2h0OiB0aGlzLmhlaWdodFxuICAgIH07XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLiNyZXNpemVyc0Rpdi5jaGlsZHJlbjtcbiAgICBpZiAoIXRoaXMuI2FsbFJlc2l6ZXJEaXZzKSB7XG4gICAgICB0aGlzLiNhbGxSZXNpemVyRGl2cyA9IEFycmF5LmZyb20oY2hpbGRyZW4pO1xuICAgICAgY29uc3QgYm91bmRSZXNpemVyS2V5ZG93biA9IHRoaXMuI3Jlc2l6ZXJLZXlkb3duLmJpbmQodGhpcyk7XG4gICAgICBjb25zdCBib3VuZFJlc2l6ZXJCbHVyID0gdGhpcy4jcmVzaXplckJsdXIuYmluZCh0aGlzKTtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsO1xuICAgICAgZm9yIChjb25zdCBkaXYgb2YgdGhpcy4jYWxsUmVzaXplckRpdnMpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGRpdi5nZXRBdHRyaWJ1dGUoXCJkYXRhLXJlc2l6ZXItbmFtZVwiKTtcbiAgICAgICAgZGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJzcGluYnV0dG9uXCIpO1xuICAgICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgYm91bmRSZXNpemVyS2V5ZG93biwge1xuICAgICAgICAgIHNpZ25hbFxuICAgICAgICB9KTtcbiAgICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGJvdW5kUmVzaXplckJsdXIsIHtcbiAgICAgICAgICBzaWduYWxcbiAgICAgICAgfSk7XG4gICAgICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy4jcmVzaXplckZvY3VzLmJpbmQodGhpcywgbmFtZSksIHtcbiAgICAgICAgICBzaWduYWxcbiAgICAgICAgfSk7XG4gICAgICAgIEFubm90YXRpb25FZGl0b3IuX2wxMG5Qcm9taXNlLmdldChgcGRmanMtZWRpdG9yLXJlc2l6ZXItbGFiZWwtJHtuYW1lfWApLnRoZW4obXNnID0+IGRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG1zZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuI2FsbFJlc2l6ZXJEaXZzWzBdO1xuICAgIGxldCBmaXJzdFBvc2l0aW9uID0gMDtcbiAgICBmb3IgKGNvbnN0IGRpdiBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKGRpdiA9PT0gZmlyc3QpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBmaXJzdFBvc2l0aW9uKys7XG4gICAgfVxuICAgIGNvbnN0IG5leHRGaXJzdFBvc2l0aW9uID0gKDM2MCAtIHRoaXMucm90YXRpb24gKyB0aGlzLnBhcmVudFJvdGF0aW9uKSAlIDM2MCAvIDkwICogKHRoaXMuI2FsbFJlc2l6ZXJEaXZzLmxlbmd0aCAvIDQpO1xuICAgIGlmIChuZXh0Rmlyc3RQb3NpdGlvbiAhPT0gZmlyc3RQb3NpdGlvbikge1xuICAgICAgaWYgKG5leHRGaXJzdFBvc2l0aW9uIDwgZmlyc3RQb3NpdGlvbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpcnN0UG9zaXRpb24gLSBuZXh0Rmlyc3RQb3NpdGlvbjsgaSsrKSB7XG4gICAgICAgICAgdGhpcy4jcmVzaXplcnNEaXYuYXBwZW5kKHRoaXMuI3Jlc2l6ZXJzRGl2LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5leHRGaXJzdFBvc2l0aW9uID4gZmlyc3RQb3NpdGlvbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5leHRGaXJzdFBvc2l0aW9uIC0gZmlyc3RQb3NpdGlvbjsgaSsrKSB7XG4gICAgICAgICAgdGhpcy4jcmVzaXplcnNEaXYuZmlyc3RDaGlsZC5iZWZvcmUodGhpcy4jcmVzaXplcnNEaXYubGFzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICBjb25zdCBkaXYgPSB0aGlzLiNhbGxSZXNpemVyRGl2c1tpKytdO1xuICAgICAgICBjb25zdCBuYW1lID0gZGl2LmdldEF0dHJpYnV0ZShcImRhdGEtcmVzaXplci1uYW1lXCIpO1xuICAgICAgICBBbm5vdGF0aW9uRWRpdG9yLl9sMTBuUHJvbWlzZS5nZXQoYHBkZmpzLWVkaXRvci1yZXNpemVyLWxhYmVsLSR7bmFtZX1gKS50aGVuKG1zZyA9PiBjaGlsZC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG1zZykpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNzZXRSZXNpemVyVGFiSW5kZXgoMCk7XG4gICAgdGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkID0gdHJ1ZTtcbiAgICB0aGlzLiNyZXNpemVyc0Rpdi5maXJzdENoaWxkLmZvY3VzKHtcbiAgICAgIGZvY3VzVmlzaWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cbiAgI3Jlc2l6ZXJLZXlkb3duKGV2ZW50KSB7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5fcmVzaXplcktleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIGV2ZW50KTtcbiAgfVxuICAjcmVzaXplckJsdXIoZXZlbnQpIHtcbiAgICBpZiAodGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXQ/LnBhcmVudE5vZGUgIT09IHRoaXMuI3Jlc2l6ZXJzRGl2KSB7XG4gICAgICB0aGlzLiNzdG9wUmVzaXppbmcoKTtcbiAgICB9XG4gIH1cbiAgI3Jlc2l6ZXJGb2N1cyhuYW1lKSB7XG4gICAgdGhpcy4jZm9jdXNlZFJlc2l6ZXJOYW1lID0gdGhpcy4jaXNSZXNpemVyRW5hYmxlZEZvcktleWJvYXJkID8gbmFtZSA6IFwiXCI7XG4gIH1cbiAgI3NldFJlc2l6ZXJUYWJJbmRleCh2YWx1ZSkge1xuICAgIGlmICghdGhpcy4jYWxsUmVzaXplckRpdnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXYgb2YgdGhpcy4jYWxsUmVzaXplckRpdnMpIHtcbiAgICAgIGRpdi50YWJJbmRleCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBfcmVzaXplV2l0aEtleWJvYXJkKHgsIHkpIHtcbiAgICBpZiAoIXRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNyZXNpemVyUG9pbnRlcm1vdmUodGhpcy4jZm9jdXNlZFJlc2l6ZXJOYW1lLCB7XG4gICAgICBtb3ZlbWVudFg6IHgsXG4gICAgICBtb3ZlbWVudFk6IHlcbiAgICB9KTtcbiAgfVxuICAjc3RvcFJlc2l6aW5nKCkge1xuICAgIHRoaXMuI2lzUmVzaXplckVuYWJsZWRGb3JLZXlib2FyZCA9IGZhbHNlO1xuICAgIHRoaXMuI3NldFJlc2l6ZXJUYWJJbmRleCgtMSk7XG4gICAgaWYgKHRoaXMuI3NhdmVkRGltZW5zaW9ucykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzYXZlZFgsXG4gICAgICAgIHNhdmVkWSxcbiAgICAgICAgc2F2ZWRXaWR0aCxcbiAgICAgICAgc2F2ZWRIZWlnaHRcbiAgICAgIH0gPSB0aGlzLiNzYXZlZERpbWVuc2lvbnM7XG4gICAgICB0aGlzLiNhZGRSZXNpemVUb1VuZG9TdGFjayhzYXZlZFgsIHNhdmVkWSwgc2F2ZWRXaWR0aCwgc2F2ZWRIZWlnaHQpO1xuICAgICAgdGhpcy4jc2F2ZWREaW1lbnNpb25zID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgX3N0b3BSZXNpemluZ1dpdGhLZXlib2FyZCgpIHtcbiAgICB0aGlzLiNzdG9wUmVzaXppbmcoKTtcbiAgICB0aGlzLmRpdi5mb2N1cygpO1xuICB9XG4gIHNlbGVjdCgpIHtcbiAgICB0aGlzLm1ha2VSZXNpemFibGUoKTtcbiAgICB0aGlzLmRpdj8uY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgIGlmICghdGhpcy4jZWRpdFRvb2xiYXIpIHtcbiAgICAgIHRoaXMuYWRkRWRpdFRvb2xiYXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGl2Py5jbGFzc0xpc3QuY29udGFpbnMoXCJzZWxlY3RlZEVkaXRvclwiKSkge1xuICAgICAgICAgIHRoaXMuI2VkaXRUb29sYmFyPy5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNlZGl0VG9vbGJhcj8uc2hvdygpO1xuICB9XG4gIHVuc2VsZWN0KCkge1xuICAgIHRoaXMuI3Jlc2l6ZXJzRGl2Py5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIHRoaXMuZGl2Py5jbGFzc0xpc3QucmVtb3ZlKFwic2VsZWN0ZWRFZGl0b3JcIik7XG4gICAgaWYgKHRoaXMuZGl2Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmN1cnJlbnRMYXllci5kaXYuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy4jZWRpdFRvb2xiYXI/LmhpZGUoKTtcbiAgfVxuICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHt9XG4gIGRpc2FibGVFZGl0aW5nKCkge31cbiAgZW5hYmxlRWRpdGluZygpIHt9XG4gIGVudGVySW5FZGl0TW9kZSgpIHt9XG4gIGdldEltYWdlRm9yQWx0VGV4dCgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgY29udGVudERpdigpIHtcbiAgICByZXR1cm4gdGhpcy5kaXY7XG4gIH1cbiAgZ2V0IGlzRWRpdGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jaXNFZGl0aW5nO1xuICB9XG4gIHNldCBpc0VkaXRpbmcodmFsdWUpIHtcbiAgICB0aGlzLiNpc0VkaXRpbmcgPSB2YWx1ZTtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5wYXJlbnQuc2V0U2VsZWN0ZWQodGhpcyk7XG4gICAgICB0aGlzLnBhcmVudC5zZXRBY3RpdmVFZGl0b3IodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyZW50LnNldEFjdGl2ZUVkaXRvcihudWxsKTtcbiAgICB9XG4gIH1cbiAgc2V0QXNwZWN0UmF0aW8od2lkdGgsIGhlaWdodCkge1xuICAgIHRoaXMuI2tlZXBBc3BlY3RSYXRpbyA9IHRydWU7XG4gICAgY29uc3QgYXNwZWN0UmF0aW8gPSB3aWR0aCAvIGhlaWdodDtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLmRpdjtcbiAgICBzdHlsZS5hc3BlY3RSYXRpbyA9IGFzcGVjdFJhdGlvO1xuICAgIHN0eWxlLmhlaWdodCA9IFwiYXV0b1wiO1xuICB9XG4gIHN0YXRpYyBnZXQgTUlOX1NJWkUoKSB7XG4gICAgcmV0dXJuIDE2O1xuICB9XG4gIHN0YXRpYyBjYW5DcmVhdGVOZXdFbXB0eUVkaXRvcigpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBnZXQgdGVsZW1ldHJ5SW5pdGlhbERhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJhZGRlZFwiXG4gICAgfTtcbiAgfVxuICBnZXQgdGVsZW1ldHJ5RmluYWxEYXRhKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIF9yZXBvcnRUZWxlbWV0cnkoZGF0YSwgbXVzdFdhaXQgPSBmYWxzZSkge1xuICAgIGlmIChtdXN0V2FpdCkge1xuICAgICAgdGhpcy4jdGVsZW1ldHJ5VGltZW91dHMgfHw9IG5ldyBNYXAoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWN0aW9uXG4gICAgICB9ID0gZGF0YTtcbiAgICAgIGxldCB0aW1lb3V0ID0gdGhpcy4jdGVsZW1ldHJ5VGltZW91dHMuZ2V0KGFjdGlvbik7XG4gICAgICBpZiAodGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB9XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlcG9ydFRlbGVtZXRyeShkYXRhKTtcbiAgICAgICAgdGhpcy4jdGVsZW1ldHJ5VGltZW91dHMuZGVsZXRlKGFjdGlvbik7XG4gICAgICAgIGlmICh0aGlzLiN0ZWxlbWV0cnlUaW1lb3V0cy5zaXplID09PSAwKSB7XG4gICAgICAgICAgdGhpcy4jdGVsZW1ldHJ5VGltZW91dHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9LCBBbm5vdGF0aW9uRWRpdG9yLl90ZWxlbWV0cnlUaW1lb3V0KTtcbiAgICAgIHRoaXMuI3RlbGVtZXRyeVRpbWVvdXRzLnNldChhY3Rpb24sIHRpbWVvdXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkYXRhLnR5cGUgfHw9IHRoaXMuZWRpdG9yVHlwZTtcbiAgICB0aGlzLl91aU1hbmFnZXIuX2V2ZW50QnVzLmRpc3BhdGNoKFwicmVwb3J0dGVsZW1ldHJ5XCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgdHlwZTogXCJlZGl0aW5nXCIsXG4gICAgICAgIGRhdGFcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBzaG93KHZpc2libGUgPSB0aGlzLl9pc1Zpc2libGUpIHtcbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiaGlkZGVuXCIsICF2aXNpYmxlKTtcbiAgICB0aGlzLl9pc1Zpc2libGUgPSB2aXNpYmxlO1xuICB9XG4gIGVuYWJsZSgpIHtcbiAgICBpZiAodGhpcy5kaXYpIHtcbiAgICAgIHRoaXMuZGl2LnRhYkluZGV4ID0gMDtcbiAgICB9XG4gICAgdGhpcy4jZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxuICBkaXNhYmxlKCkge1xuICAgIGlmICh0aGlzLmRpdikge1xuICAgICAgdGhpcy5kaXYudGFiSW5kZXggPSAtMTtcbiAgICB9XG4gICAgdGhpcy4jZGlzYWJsZWQgPSB0cnVlO1xuICB9XG4gIHJlbmRlckFubm90YXRpb25FbGVtZW50KGFubm90YXRpb24pIHtcbiAgICBsZXQgY29udGVudCA9IGFubm90YXRpb24uY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCIuYW5ub3RhdGlvbkNvbnRlbnRcIik7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcImFubm90YXRpb25Db250ZW50XCIsIHRoaXMuZWRpdG9yVHlwZSk7XG4gICAgICBhbm5vdGF0aW9uLmNvbnRhaW5lci5wcmVwZW5kKGNvbnRlbnQpO1xuICAgIH0gZWxzZSBpZiAoY29udGVudC5ub2RlTmFtZSA9PT0gXCJDQU5WQVNcIikge1xuICAgICAgY29uc3QgY2FudmFzID0gY29udGVudDtcbiAgICAgIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKFwiYW5ub3RhdGlvbkNvbnRlbnRcIiwgdGhpcy5lZGl0b3JUeXBlKTtcbiAgICAgIGNhbnZhcy5iZWZvcmUoY29udGVudCk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIHJlc2V0QW5ub3RhdGlvbkVsZW1lbnQoYW5ub3RhdGlvbikge1xuICAgIGNvbnN0IHtcbiAgICAgIGZpcnN0Q2hpbGRcbiAgICB9ID0gYW5ub3RhdGlvbi5jb250YWluZXI7XG4gICAgaWYgKGZpcnN0Q2hpbGQubm9kZU5hbWUgPT09IFwiRElWXCIgJiYgZmlyc3RDaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoXCJhbm5vdGF0aW9uQ29udGVudFwiKSkge1xuICAgICAgZmlyc3RDaGlsZC5yZW1vdmUoKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIEZha2VFZGl0b3IgZXh0ZW5kcyBBbm5vdGF0aW9uRWRpdG9yIHtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcbiAgICB0aGlzLmFubm90YXRpb25FbGVtZW50SWQgPSBwYXJhbXMuYW5ub3RhdGlvbkVsZW1lbnRJZDtcbiAgICB0aGlzLmRlbGV0ZWQgPSB0cnVlO1xuICB9XG4gIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCxcbiAgICAgIGRlbGV0ZWQ6IHRydWUsXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4XG4gICAgfTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvc2hhcmVkL211cm11cmhhc2gzLmpzXG5jb25zdCBTRUVEID0gMHhjM2QyZTFmMDtcbmNvbnN0IE1BU0tfSElHSCA9IDB4ZmZmZjAwMDA7XG5jb25zdCBNQVNLX0xPVyA9IDB4ZmZmZjtcbmNsYXNzIE11cm11ckhhc2gzXzY0IHtcbiAgY29uc3RydWN0b3Ioc2VlZCkge1xuICAgIHRoaXMuaDEgPSBzZWVkID8gc2VlZCAmIDB4ZmZmZmZmZmYgOiBTRUVEO1xuICAgIHRoaXMuaDIgPSBzZWVkID8gc2VlZCAmIDB4ZmZmZmZmZmYgOiBTRUVEO1xuICB9XG4gIHVwZGF0ZShpbnB1dCkge1xuICAgIGxldCBkYXRhLCBsZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGlucHV0Lmxlbmd0aCAqIDIpO1xuICAgICAgbGVuZ3RoID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGlucHV0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjb2RlIDw9IDB4ZmYpIHtcbiAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlID4+PiA4O1xuICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSAmIDB4ZmY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhpbnB1dCkpIHtcbiAgICAgIGRhdGEgPSBpbnB1dC5zbGljZSgpO1xuICAgICAgbGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRhdGEgZm9ybWF0LCBtdXN0IGJlIGEgc3RyaW5nIG9yIFR5cGVkQXJyYXkuXCIpO1xuICAgIH1cbiAgICBjb25zdCBibG9ja0NvdW50cyA9IGxlbmd0aCA+PiAyO1xuICAgIGNvbnN0IHRhaWxMZW5ndGggPSBsZW5ndGggLSBibG9ja0NvdW50cyAqIDQ7XG4gICAgY29uc3QgZGF0YVVpbnQzMiA9IG5ldyBVaW50MzJBcnJheShkYXRhLmJ1ZmZlciwgMCwgYmxvY2tDb3VudHMpO1xuICAgIGxldCBrMSA9IDAsXG4gICAgICBrMiA9IDA7XG4gICAgbGV0IGgxID0gdGhpcy5oMSxcbiAgICAgIGgyID0gdGhpcy5oMjtcbiAgICBjb25zdCBDMSA9IDB4Y2M5ZTJkNTEsXG4gICAgICBDMiA9IDB4MWI4NzM1OTM7XG4gICAgY29uc3QgQzFfTE9XID0gQzEgJiBNQVNLX0xPVyxcbiAgICAgIEMyX0xPVyA9IEMyICYgTUFTS19MT1c7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja0NvdW50czsgaSsrKSB7XG4gICAgICBpZiAoaSAmIDEpIHtcbiAgICAgICAgazEgPSBkYXRhVWludDMyW2ldO1xuICAgICAgICBrMSA9IGsxICogQzEgJiBNQVNLX0hJR0ggfCBrMSAqIEMxX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3O1xuICAgICAgICBrMSA9IGsxICogQzIgJiBNQVNLX0hJR0ggfCBrMSAqIEMyX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBoMSBePSBrMTtcbiAgICAgICAgaDEgPSBoMSA8PCAxMyB8IGgxID4+PiAxOTtcbiAgICAgICAgaDEgPSBoMSAqIDUgKyAweGU2NTQ2YjY0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgazIgPSBkYXRhVWludDMyW2ldO1xuICAgICAgICBrMiA9IGsyICogQzEgJiBNQVNLX0hJR0ggfCBrMiAqIEMxX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBrMiA9IGsyIDw8IDE1IHwgazIgPj4+IDE3O1xuICAgICAgICBrMiA9IGsyICogQzIgJiBNQVNLX0hJR0ggfCBrMiAqIEMyX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBoMiBePSBrMjtcbiAgICAgICAgaDIgPSBoMiA8PCAxMyB8IGgyID4+PiAxOTtcbiAgICAgICAgaDIgPSBoMiAqIDUgKyAweGU2NTQ2YjY0O1xuICAgICAgfVxuICAgIH1cbiAgICBrMSA9IDA7XG4gICAgc3dpdGNoICh0YWlsTGVuZ3RoKSB7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0ICsgMl0gPDwgMTY7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0ICsgMV0gPDwgODtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDRdO1xuICAgICAgICBrMSA9IGsxICogQzEgJiBNQVNLX0hJR0ggfCBrMSAqIEMxX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3O1xuICAgICAgICBrMSA9IGsxICogQzIgJiBNQVNLX0hJR0ggfCBrMSAqIEMyX0xPVyAmIE1BU0tfTE9XO1xuICAgICAgICBpZiAoYmxvY2tDb3VudHMgJiAxKSB7XG4gICAgICAgICAgaDEgXj0gazE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaDIgXj0gazE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5oMSA9IGgxO1xuICAgIHRoaXMuaDIgPSBoMjtcbiAgfVxuICBoZXhkaWdlc3QoKSB7XG4gICAgbGV0IGgxID0gdGhpcy5oMSxcbiAgICAgIGgyID0gdGhpcy5oMjtcbiAgICBoMSBePSBoMiA+Pj4gMTtcbiAgICBoMSA9IGgxICogMHhlZDU1OGNjZCAmIE1BU0tfSElHSCB8IGgxICogMHg4Y2NkICYgTUFTS19MT1c7XG4gICAgaDIgPSBoMiAqIDB4ZmY1MWFmZDcgJiBNQVNLX0hJR0ggfCAoKGgyIDw8IDE2IHwgaDEgPj4+IDE2KSAqIDB4YWZkN2VkNTUgJiBNQVNLX0hJR0gpID4+PiAxNjtcbiAgICBoMSBePSBoMiA+Pj4gMTtcbiAgICBoMSA9IGgxICogMHgxYTg1ZWM1MyAmIE1BU0tfSElHSCB8IGgxICogMHhlYzUzICYgTUFTS19MT1c7XG4gICAgaDIgPSBoMiAqIDB4YzRjZWI5ZmUgJiBNQVNLX0hJR0ggfCAoKGgyIDw8IDE2IHwgaDEgPj4+IDE2KSAqIDB4YjlmZTFhODUgJiBNQVNLX0hJR0gpID4+PiAxNjtcbiAgICBoMSBePSBoMiA+Pj4gMTtcbiAgICByZXR1cm4gKGgxID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgXCIwXCIpICsgKGgyID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgXCIwXCIpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2Fubm90YXRpb25fc3RvcmFnZS5qc1xuXG5cblxuY29uc3QgU2VyaWFsaXphYmxlRW1wdHkgPSBPYmplY3QuZnJlZXplKHtcbiAgbWFwOiBudWxsLFxuICBoYXNoOiBcIlwiLFxuICB0cmFuc2ZlcjogdW5kZWZpbmVkXG59KTtcbmNsYXNzIEFubm90YXRpb25TdG9yYWdlIHtcbiAgI21vZGlmaWVkID0gZmFsc2U7XG4gICNzdG9yYWdlID0gbmV3IE1hcCgpO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm9uU2V0TW9kaWZpZWQgPSBudWxsO1xuICAgIHRoaXMub25SZXNldE1vZGlmaWVkID0gbnVsbDtcbiAgICB0aGlzLm9uQW5ub3RhdGlvbkVkaXRvciA9IG51bGw7XG4gIH1cbiAgZ2V0VmFsdWUoa2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI3N0b3JhZ2UuZ2V0KGtleSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGRlZmF1bHRWYWx1ZSwgdmFsdWUpO1xuICB9XG4gIGdldFJhd1ZhbHVlKGtleSkge1xuICAgIHJldHVybiB0aGlzLiNzdG9yYWdlLmdldChrZXkpO1xuICB9XG4gIHJlbW92ZShrZXkpIHtcbiAgICB0aGlzLiNzdG9yYWdlLmRlbGV0ZShrZXkpO1xuICAgIGlmICh0aGlzLiNzdG9yYWdlLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMucmVzZXRNb2RpZmllZCgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy4jc3RvcmFnZS52YWx1ZXMoKSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uRWRpdG9yKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm9uQW5ub3RhdGlvbkVkaXRvcihudWxsKTtcbiAgICB9XG4gIH1cbiAgc2V0VmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuI3N0b3JhZ2UuZ2V0KGtleSk7XG4gICAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XG4gICAgaWYgKG9iaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IFtlbnRyeSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKG9ialtlbnRyeV0gIT09IHZhbCkge1xuICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICBvYmpbZW50cnldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuI3N0b3JhZ2Uuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgIHRoaXMuI3NldE1vZGlmaWVkKCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFubm90YXRpb25FZGl0b3IgJiYgdHlwZW9mIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKHZhbHVlLmNvbnN0cnVjdG9yLl90eXBlKTtcbiAgICB9XG4gIH1cbiAgaGFzKGtleSkge1xuICAgIHJldHVybiB0aGlzLiNzdG9yYWdlLmhhcyhrZXkpO1xuICB9XG4gIGdldEFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RvcmFnZS5zaXplID4gMCA/IG9iamVjdEZyb21NYXAodGhpcy4jc3RvcmFnZSkgOiBudWxsO1xuICB9XG4gIHNldEFsbChvYmopIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgdGhpcy5zZXRWYWx1ZShrZXksIHZhbCk7XG4gICAgfVxuICB9XG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLiNzdG9yYWdlLnNpemU7XG4gIH1cbiAgI3NldE1vZGlmaWVkKCkge1xuICAgIGlmICghdGhpcy4jbW9kaWZpZWQpIHtcbiAgICAgIHRoaXMuI21vZGlmaWVkID0gdHJ1ZTtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vblNldE1vZGlmaWVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhpcy5vblNldE1vZGlmaWVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlc2V0TW9kaWZpZWQoKSB7XG4gICAgaWYgKHRoaXMuI21vZGlmaWVkKSB7XG4gICAgICB0aGlzLiNtb2RpZmllZCA9IGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uUmVzZXRNb2RpZmllZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRoaXMub25SZXNldE1vZGlmaWVkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBwcmludCgpIHtcbiAgICByZXR1cm4gbmV3IFByaW50QW5ub3RhdGlvblN0b3JhZ2UodGhpcyk7XG4gIH1cbiAgZ2V0IHNlcmlhbGl6YWJsZSgpIHtcbiAgICBpZiAodGhpcy4jc3RvcmFnZS5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gU2VyaWFsaXphYmxlRW1wdHk7XG4gICAgfVxuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKSxcbiAgICAgIGhhc2ggPSBuZXcgTXVybXVySGFzaDNfNjQoKSxcbiAgICAgIHRyYW5zZmVyID0gW107XG4gICAgY29uc3QgY29udGV4dCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGhhc0JpdG1hcCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzLiNzdG9yYWdlKSB7XG4gICAgICBjb25zdCBzZXJpYWxpemVkID0gdmFsIGluc3RhbmNlb2YgQW5ub3RhdGlvbkVkaXRvciA/IHZhbC5zZXJpYWxpemUoZmFsc2UsIGNvbnRleHQpIDogdmFsO1xuICAgICAgaWYgKHNlcmlhbGl6ZWQpIHtcbiAgICAgICAgbWFwLnNldChrZXksIHNlcmlhbGl6ZWQpO1xuICAgICAgICBoYXNoLnVwZGF0ZShgJHtrZXl9OiR7SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCl9YCk7XG4gICAgICAgIGhhc0JpdG1hcCB8fD0gISFzZXJpYWxpemVkLmJpdG1hcDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0JpdG1hcCkge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBtYXAudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKHZhbHVlLmJpdG1hcCkge1xuICAgICAgICAgIHRyYW5zZmVyLnB1c2godmFsdWUuYml0bWFwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwLnNpemUgPiAwID8ge1xuICAgICAgbWFwLFxuICAgICAgaGFzaDogaGFzaC5oZXhkaWdlc3QoKSxcbiAgICAgIHRyYW5zZmVyXG4gICAgfSA6IFNlcmlhbGl6YWJsZUVtcHR5O1xuICB9XG4gIGdldCBlZGl0b3JTdGF0cygpIHtcbiAgICBsZXQgc3RhdHMgPSBudWxsO1xuICAgIGNvbnN0IHR5cGVUb0VkaXRvciA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMuI3N0b3JhZ2UudmFsdWVzKCkpIHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgQW5ub3RhdGlvbkVkaXRvcikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBlZGl0b3JTdGF0cyA9IHZhbHVlLnRlbGVtZXRyeUZpbmFsRGF0YTtcbiAgICAgIGlmICghZWRpdG9yU3RhdHMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIHR5cGVcbiAgICAgIH0gPSBlZGl0b3JTdGF0cztcbiAgICAgIGlmICghdHlwZVRvRWRpdG9yLmhhcyh0eXBlKSkge1xuICAgICAgICB0eXBlVG9FZGl0b3Iuc2V0KHR5cGUsIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkuY29uc3RydWN0b3IpO1xuICAgICAgfVxuICAgICAgc3RhdHMgfHw9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBjb25zdCBtYXAgPSBzdGF0c1t0eXBlXSB8fD0gbmV3IE1hcCgpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKGVkaXRvclN0YXRzKSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcInR5cGVcIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb3VudGVycyA9IG1hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFjb3VudGVycykge1xuICAgICAgICAgIGNvdW50ZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIG1hcC5zZXQoa2V5LCBjb3VudGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY291bnQgPSBjb3VudGVycy5nZXQodmFsKSA/PyAwO1xuICAgICAgICBjb3VudGVycy5zZXQodmFsLCBjb3VudCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBlZGl0b3JdIG9mIHR5cGVUb0VkaXRvcikge1xuICAgICAgc3RhdHNbdHlwZV0gPSBlZGl0b3IuY29tcHV0ZVRlbGVtZXRyeUZpbmFsRGF0YShzdGF0c1t0eXBlXSk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0cztcbiAgfVxufVxuY2xhc3MgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSBleHRlbmRzIEFubm90YXRpb25TdG9yYWdlIHtcbiAgI3NlcmlhbGl6YWJsZTtcbiAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgc3VwZXIoKTtcbiAgICBjb25zdCB7XG4gICAgICBtYXAsXG4gICAgICBoYXNoLFxuICAgICAgdHJhbnNmZXJcbiAgICB9ID0gcGFyZW50LnNlcmlhbGl6YWJsZTtcbiAgICBjb25zdCBjbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShtYXAsIHRyYW5zZmVyID8ge1xuICAgICAgdHJhbnNmZXJcbiAgICB9IDogbnVsbCk7XG4gICAgdGhpcy4jc2VyaWFsaXphYmxlID0ge1xuICAgICAgbWFwOiBjbG9uZSxcbiAgICAgIGhhc2gsXG4gICAgICB0cmFuc2ZlclxuICAgIH07XG4gIH1cbiAgZ2V0IHByaW50KCkge1xuICAgIHVucmVhY2hhYmxlKFwiU2hvdWxkIG5vdCBjYWxsIFByaW50QW5ub3RhdGlvblN0b3JhZ2UucHJpbnRcIik7XG4gIH1cbiAgZ2V0IHNlcmlhbGl6YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc2VyaWFsaXphYmxlO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2ZvbnRfbG9hZGVyLmpzXG5cbmNsYXNzIEZvbnRMb2FkZXIge1xuICAjc3lzdGVtRm9udHMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudCxcbiAgICBzdHlsZUVsZW1lbnQgPSBudWxsXG4gIH0pIHtcbiAgICB0aGlzLl9kb2N1bWVudCA9IG93bmVyRG9jdW1lbnQ7XG4gICAgdGhpcy5uYXRpdmVGb250RmFjZXMgPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5zdHlsZUVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMubG9hZGluZ1JlcXVlc3RzID0gW107XG4gICAgdGhpcy5sb2FkVGVzdEZvbnRJZCA9IDA7XG4gIH1cbiAgYWRkTmF0aXZlRm9udEZhY2UobmF0aXZlRm9udEZhY2UpIHtcbiAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5hZGQobmF0aXZlRm9udEZhY2UpO1xuICAgIHRoaXMuX2RvY3VtZW50LmZvbnRzLmFkZChuYXRpdmVGb250RmFjZSk7XG4gIH1cbiAgcmVtb3ZlTmF0aXZlRm9udEZhY2UobmF0aXZlRm9udEZhY2UpIHtcbiAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5kZWxldGUobmF0aXZlRm9udEZhY2UpO1xuICAgIHRoaXMuX2RvY3VtZW50LmZvbnRzLmRlbGV0ZShuYXRpdmVGb250RmFjZSk7XG4gIH1cbiAgaW5zZXJ0UnVsZShydWxlKSB7XG4gICAgaWYgKCF0aGlzLnN0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgICB0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdLmFwcGVuZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlU2hlZXQgPSB0aGlzLnN0eWxlRWxlbWVudC5zaGVldDtcbiAgICBzdHlsZVNoZWV0Lmluc2VydFJ1bGUocnVsZSwgc3R5bGVTaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIGZvciAoY29uc3QgbmF0aXZlRm9udEZhY2Ugb2YgdGhpcy5uYXRpdmVGb250RmFjZXMpIHtcbiAgICAgIHRoaXMuX2RvY3VtZW50LmZvbnRzLmRlbGV0ZShuYXRpdmVGb250RmFjZSk7XG4gICAgfVxuICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLmNsZWFyKCk7XG4gICAgdGhpcy4jc3lzdGVtRm9udHMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5zdHlsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBhc3luYyBsb2FkU3lzdGVtRm9udCh7XG4gICAgc3lzdGVtRm9udEluZm86IGluZm8sXG4gICAgX2luc3BlY3RGb250XG4gIH0pIHtcbiAgICBpZiAoIWluZm8gfHwgdGhpcy4jc3lzdGVtRm9udHMuaGFzKGluZm8ubG9hZGVkTmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXNzZXJ0KCF0aGlzLmRpc2FibGVGb250RmFjZSwgXCJsb2FkU3lzdGVtRm9udCBzaG91bGRuJ3QgYmUgY2FsbGVkIHdoZW4gYGRpc2FibGVGb250RmFjZWAgaXMgc2V0LlwiKTtcbiAgICBpZiAodGhpcy5pc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGxvYWRlZE5hbWUsXG4gICAgICAgIHNyYyxcbiAgICAgICAgc3R5bGVcbiAgICAgIH0gPSBpbmZvO1xuICAgICAgY29uc3QgZm9udEZhY2UgPSBuZXcgRm9udEZhY2UobG9hZGVkTmFtZSwgc3JjLCBzdHlsZSk7XG4gICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKGZvbnRGYWNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZvbnRGYWNlLmxvYWQoKTtcbiAgICAgICAgdGhpcy4jc3lzdGVtRm9udHMuYWRkKGxvYWRlZE5hbWUpO1xuICAgICAgICBfaW5zcGVjdEZvbnQ/LihpbmZvKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB3YXJuKGBDYW5ub3QgbG9hZCBzeXN0ZW0gZm9udDogJHtpbmZvLmJhc2VGb250TmFtZX0sIGluc3RhbGxpbmcgaXQgY291bGQgaGVscCB0byBpbXByb3ZlIFBERiByZW5kZXJpbmcuYCk7XG4gICAgICAgIHRoaXMucmVtb3ZlTmF0aXZlRm9udEZhY2UoZm9udEZhY2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1bnJlYWNoYWJsZShcIk5vdCBpbXBsZW1lbnRlZDogbG9hZFN5c3RlbUZvbnQgd2l0aG91dCB0aGUgRm9udCBMb2FkaW5nIEFQSS5cIik7XG4gIH1cbiAgYXN5bmMgYmluZChmb250KSB7XG4gICAgaWYgKGZvbnQuYXR0YWNoZWQgfHwgZm9udC5taXNzaW5nRmlsZSAmJiAhZm9udC5zeXN0ZW1Gb250SW5mbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb250LmF0dGFjaGVkID0gdHJ1ZTtcbiAgICBpZiAoZm9udC5zeXN0ZW1Gb250SW5mbykge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkU3lzdGVtRm9udChmb250KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCkge1xuICAgICAgY29uc3QgbmF0aXZlRm9udEZhY2UgPSBmb250LmNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCk7XG4gICAgICBpZiAobmF0aXZlRm9udEZhY2UpIHtcbiAgICAgICAgdGhpcy5hZGROYXRpdmVGb250RmFjZShuYXRpdmVGb250RmFjZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgbmF0aXZlRm9udEZhY2UubG9hZGVkO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIHdhcm4oYEZhaWxlZCB0byBsb2FkIGZvbnQgJyR7bmF0aXZlRm9udEZhY2UuZmFtaWx5fSc6ICcke2V4fScuYCk7XG4gICAgICAgICAgZm9udC5kaXNhYmxlRm9udEZhY2UgPSB0cnVlO1xuICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJ1bGUgPSBmb250LmNyZWF0ZUZvbnRGYWNlUnVsZSgpO1xuICAgIGlmIChydWxlKSB7XG4gICAgICB0aGlzLmluc2VydFJ1bGUocnVsZSk7XG4gICAgICBpZiAodGhpcy5pc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKHJlc29sdmUpO1xuICAgICAgICB0aGlzLl9wcmVwYXJlRm9udExvYWRFdmVudChmb250LCByZXF1ZXN0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBnZXQgaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCgpIHtcbiAgICBjb25zdCBoYXNGb250cyA9ICEhdGhpcy5fZG9jdW1lbnQ/LmZvbnRzO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkXCIsIGhhc0ZvbnRzKTtcbiAgfVxuICBnZXQgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQoKSB7XG4gICAgbGV0IHN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIGlmIChpc05vZGVKUykge1xuICAgICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIG5hdmlnYXRvcj8udXNlckFnZW50ID09PSBcInN0cmluZ1wiICYmIC9Nb3ppbGxhXFwvNS4wLio/cnY6XFxkKy4qPyBHZWNrby8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkXCIsIHN1cHBvcnRlZCk7XG4gIH1cbiAgX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgZnVuY3Rpb24gY29tcGxldGVSZXF1ZXN0KCkge1xuICAgICAgYXNzZXJ0KCFyZXF1ZXN0LmRvbmUsIFwiY29tcGxldGVSZXF1ZXN0KCkgY2Fubm90IGJlIGNhbGxlZCB0d2ljZS5cIik7XG4gICAgICByZXF1ZXN0LmRvbmUgPSB0cnVlO1xuICAgICAgd2hpbGUgKGxvYWRpbmdSZXF1ZXN0cy5sZW5ndGggPiAwICYmIGxvYWRpbmdSZXF1ZXN0c1swXS5kb25lKSB7XG4gICAgICAgIGNvbnN0IG90aGVyUmVxdWVzdCA9IGxvYWRpbmdSZXF1ZXN0cy5zaGlmdCgpO1xuICAgICAgICBzZXRUaW1lb3V0KG90aGVyUmVxdWVzdC5jYWxsYmFjaywgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGxvYWRpbmdSZXF1ZXN0c1xuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZVJlcXVlc3QsXG4gICAgICBjYWxsYmFja1xuICAgIH07XG4gICAgbG9hZGluZ1JlcXVlc3RzLnB1c2gocmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH1cbiAgZ2V0IF9sb2FkVGVzdEZvbnQoKSB7XG4gICAgY29uc3QgdGVzdEZvbnQgPSBhdG9iKFwiVDFSVVR3QUxBSUFBQXdBd1EwWkdJREh0Wmc0QUFBT1lBQUFBZ1VaR1ZFMWxrelp3QUFBRUhBQUFBQnhIUkVWR0FCUUFcIiArIFwiRlFBQUJEZ0FBQUFlVDFNdk1sWU5Zd2tBQUFFZ0FBQUFZR050WVhBQkRRTFVBQUFDTkFBQUFVSm9aV0ZrL3hWRkRRQUFcIiArIFwiQUx3QUFBQTJhR2hsWVFka0Erb0FBQUQwQUFBQUpHaHRkSGdENkFBQUFBQUVXQUFBQUFadFlYaHdBQUpRQUFBQUFSZ0FcIiArIFwiQUFBR2JtRnRaVmptZEg0QUFBR0FBQUFBc1hCdmMzVC9oZ0F6QUFBRGVBQUFBQ0FBQVFBQUFBRUFBTFpSRnNSZkR6ejFcIiArIFwiQUFzRDZBQUFBQURPQk9UTEFBQUFBTTRLSER3QUFBQUFBK2dESVFBQUFBZ0FBZ0FBQUFBQUFBQUJBQUFESVFBQUFGb0RcIiArIFwiNkFBQUFBQUQ2QUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBVUFBQUFnQUFBQVFENkFIMEFBVUFBQUtLQXJ3QUFBQ01cIiArIFwiQW9vQ3ZBQUFBZUFBTVFFQ0FBQUNBQVlKQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFGQm1SV1FBd0FBdUFDNERcIiArIFwiSVA4NEFGb0RJUUFBQUFBQUFRQUFBQUFBQUFBQUFDQUFJQUFCQUFBQURnQ3VBQUVBQUFBQUFBQUFBUUFBQUFFQUFBQUFcIiArIFwiQUFFQUFRQUFBQUVBQUFBQUFBSUFBUUFBQUFFQUFBQUFBQU1BQVFBQUFBRUFBQUFBQUFRQUFRQUFBQUVBQUFBQUFBVUFcIiArIFwiQVFBQUFBRUFBQUFBQUFZQUFRQUFBQU1BQVFRSkFBQUFBZ0FCQUFNQUFRUUpBQUVBQWdBQkFBTUFBUVFKQUFJQUFnQUJcIiArIFwiQUFNQUFRUUpBQU1BQWdBQkFBTUFBUVFKQUFRQUFnQUJBQU1BQVFRSkFBVUFBZ0FCQUFNQUFRUUpBQVlBQWdBQldBQllcIiArIFwiQUFBQUFBQUFBd0FBQUFNQUFBQWNBQUVBQUFBQUFEd0FBd0FCQUFBQUhBQUVBQ0FBQUFBRUFBUUFBUUFBQUM3Ly93QUFcIiArIFwiQUM3Ly8vL1RBQUVBQUFBQUFBQUJCZ0FBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUFBQUFBQUFEL2d3QXlBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFcIiArIFwiQUFBQkFBUUVBQUVCQVFKWUFBRUJBU0g0RHdENEd3SEVBdmdjQS9nWEJJd01BWXVMK256NXRRWGtENWozQ0JMbkVRQUNcIiArIFwiQVFFQklWaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZQUFBQkFRQUFEd0FDQVFFRUUvdDNcIiArIFwiRG92NmZBSDZmQVQrZlBwOCtud0hEb3NNQ3ZtMUN2bTFEQXo2ZkJRQUFBQUFBQUFCQUFBQUFNbUpiekVBQUFBQXpnVGpcIiArIFwiRlFBQUFBRE9CT1FwQUFFQUFBQUFBQUFBREFBVUFBUUFBQUFCQUFBQUFnQUJBQUFBQUFBQUFBQUQ2QUFBQUFBQUFBPT1cIik7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9sb2FkVGVzdEZvbnRcIiwgdGVzdEZvbnQpO1xuICB9XG4gIF9wcmVwYXJlRm9udExvYWRFdmVudChmb250LCByZXF1ZXN0KSB7XG4gICAgZnVuY3Rpb24gaW50MzIoZGF0YSwgb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZGF0YS5jaGFyQ29kZUF0KG9mZnNldCkgPDwgMjQgfCBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSkgPDwgMTYgfCBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0ICsgMikgPDwgOCB8IGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAzKSAmIDB4ZmY7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNwbGljZVN0cmluZyhzLCBvZmZzZXQsIHJlbW92ZSwgaW5zZXJ0KSB7XG4gICAgICBjb25zdCBjaHVuazEgPSBzLnN1YnN0cmluZygwLCBvZmZzZXQpO1xuICAgICAgY29uc3QgY2h1bmsyID0gcy5zdWJzdHJpbmcob2Zmc2V0ICsgcmVtb3ZlKTtcbiAgICAgIHJldHVybiBjaHVuazEgKyBpbnNlcnQgKyBjaHVuazI7XG4gICAgfVxuICAgIGxldCBpLCBpaTtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgY2FudmFzLmhlaWdodCA9IDE7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICBsZXQgY2FsbGVkID0gMDtcbiAgICBmdW5jdGlvbiBpc0ZvbnRSZWFkeShuYW1lLCBjYWxsYmFjaykge1xuICAgICAgaWYgKCsrY2FsbGVkID4gMzApIHtcbiAgICAgICAgd2FybihcIkxvYWQgdGVzdCBmb250IG5ldmVyIGxvYWRlZC5cIik7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGN0eC5mb250ID0gXCIzMHB4IFwiICsgbmFtZTtcbiAgICAgIGN0eC5maWxsVGV4dChcIi5cIiwgMCwgMjApO1xuICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKTtcbiAgICAgIGlmIChpbWFnZURhdGEuZGF0YVszXSA+IDApIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2V0VGltZW91dChpc0ZvbnRSZWFkeS5iaW5kKG51bGwsIG5hbWUsIGNhbGxiYWNrKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvYWRUZXN0Rm9udElkID0gYGx0JHtEYXRlLm5vdygpfSR7dGhpcy5sb2FkVGVzdEZvbnRJZCsrfWA7XG4gICAgbGV0IGRhdGEgPSB0aGlzLl9sb2FkVGVzdEZvbnQ7XG4gICAgY29uc3QgQ09NTUVOVF9PRkZTRVQgPSA5NzY7XG4gICAgZGF0YSA9IHNwbGljZVN0cmluZyhkYXRhLCBDT01NRU5UX09GRlNFVCwgbG9hZFRlc3RGb250SWQubGVuZ3RoLCBsb2FkVGVzdEZvbnRJZCk7XG4gICAgY29uc3QgQ0ZGX0NIRUNLU1VNX09GRlNFVCA9IDE2O1xuICAgIGNvbnN0IFhYWFhfVkFMVUUgPSAweDU4NTg1ODU4O1xuICAgIGxldCBjaGVja3N1bSA9IGludDMyKGRhdGEsIENGRl9DSEVDS1NVTV9PRkZTRVQpO1xuICAgIGZvciAoaSA9IDAsIGlpID0gbG9hZFRlc3RGb250SWQubGVuZ3RoIC0gMzsgaSA8IGlpOyBpICs9IDQpIHtcbiAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gLSBYWFhYX1ZBTFVFICsgaW50MzIobG9hZFRlc3RGb250SWQsIGkpIHwgMDtcbiAgICB9XG4gICAgaWYgKGkgPCBsb2FkVGVzdEZvbnRJZC5sZW5ndGgpIHtcbiAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gLSBYWFhYX1ZBTFVFICsgaW50MzIobG9hZFRlc3RGb250SWQgKyBcIlhYWFwiLCBpKSB8IDA7XG4gICAgfVxuICAgIGRhdGEgPSBzcGxpY2VTdHJpbmcoZGF0YSwgQ0ZGX0NIRUNLU1VNX09GRlNFVCwgNCwgc3RyaW5nMzIoY2hlY2tzdW0pKTtcbiAgICBjb25zdCB1cmwgPSBgdXJsKGRhdGE6Zm9udC9vcGVudHlwZTtiYXNlNjQsJHtidG9hKGRhdGEpfSk7YDtcbiAgICBjb25zdCBydWxlID0gYEBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OlwiJHtsb2FkVGVzdEZvbnRJZH1cIjtzcmM6JHt1cmx9fWA7XG4gICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpO1xuICAgIGNvbnN0IGRpdiA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgIGRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5oZWlnaHQgPSBcIjEwcHhcIjtcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgZGl2LnN0eWxlLnRvcCA9IGRpdi5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgW2ZvbnQubG9hZGVkTmFtZSwgbG9hZFRlc3RGb250SWRdKSB7XG4gICAgICBjb25zdCBzcGFuID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICBzcGFuLnRleHRDb250ZW50ID0gXCJIaVwiO1xuICAgICAgc3Bhbi5zdHlsZS5mb250RmFtaWx5ID0gbmFtZTtcbiAgICAgIGRpdi5hcHBlbmQoc3Bhbik7XG4gICAgfVxuICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kKGRpdik7XG4gICAgaXNGb250UmVhZHkobG9hZFRlc3RGb250SWQsICgpID0+IHtcbiAgICAgIGRpdi5yZW1vdmUoKTtcbiAgICAgIHJlcXVlc3QuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgRm9udEZhY2VPYmplY3Qge1xuICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVkRGF0YSwge1xuICAgIGRpc2FibGVGb250RmFjZSA9IGZhbHNlLFxuICAgIGluc3BlY3RGb250ID0gbnVsbFxuICB9KSB7XG4gICAgdGhpcy5jb21waWxlZEdseXBocyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBpIGluIHRyYW5zbGF0ZWREYXRhKSB7XG4gICAgICB0aGlzW2ldID0gdHJhbnNsYXRlZERhdGFbaV07XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZUZvbnRGYWNlID0gZGlzYWJsZUZvbnRGYWNlID09PSB0cnVlO1xuICAgIHRoaXMuX2luc3BlY3RGb250ID0gaW5zcGVjdEZvbnQ7XG4gIH1cbiAgY3JlYXRlTmF0aXZlRm9udEZhY2UoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kaXNhYmxlRm9udEZhY2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgbmF0aXZlRm9udEZhY2U7XG4gICAgaWYgKCF0aGlzLmNzc0ZvbnRJbmZvKSB7XG4gICAgICBuYXRpdmVGb250RmFjZSA9IG5ldyBGb250RmFjZSh0aGlzLmxvYWRlZE5hbWUsIHRoaXMuZGF0YSwge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjc3MgPSB7XG4gICAgICAgIHdlaWdodDogdGhpcy5jc3NGb250SW5mby5mb250V2VpZ2h0XG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGUpIHtcbiAgICAgICAgY3NzLnN0eWxlID0gYG9ibGlxdWUgJHt0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlfWRlZ2A7XG4gICAgICB9XG4gICAgICBuYXRpdmVGb250RmFjZSA9IG5ldyBGb250RmFjZSh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHksIHRoaXMuZGF0YSwgY3NzKTtcbiAgICB9XG4gICAgdGhpcy5faW5zcGVjdEZvbnQ/Lih0aGlzKTtcbiAgICByZXR1cm4gbmF0aXZlRm9udEZhY2U7XG4gIH1cbiAgY3JlYXRlRm9udEZhY2VSdWxlKCkge1xuICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGlzYWJsZUZvbnRGYWNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGJ5dGVzVG9TdHJpbmcodGhpcy5kYXRhKTtcbiAgICBjb25zdCB1cmwgPSBgdXJsKGRhdGE6JHt0aGlzLm1pbWV0eXBlfTtiYXNlNjQsJHtidG9hKGRhdGEpfSk7YDtcbiAgICBsZXQgcnVsZTtcbiAgICBpZiAoIXRoaXMuY3NzRm9udEluZm8pIHtcbiAgICAgIHJ1bGUgPSBgQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XCIke3RoaXMubG9hZGVkTmFtZX1cIjtzcmM6JHt1cmx9fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBjc3MgPSBgZm9udC13ZWlnaHQ6ICR7dGhpcy5jc3NGb250SW5mby5mb250V2VpZ2h0fTtgO1xuICAgICAgaWYgKHRoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGUpIHtcbiAgICAgICAgY3NzICs9IGBmb250LXN0eWxlOiBvYmxpcXVlICR7dGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZX1kZWc7YDtcbiAgICAgIH1cbiAgICAgIHJ1bGUgPSBgQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XCIke3RoaXMuY3NzRm9udEluZm8uZm9udEZhbWlseX1cIjske2Nzc31zcmM6JHt1cmx9fWA7XG4gICAgfVxuICAgIHRoaXMuX2luc3BlY3RGb250Py4odGhpcywgdXJsKTtcbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuICBnZXRQYXRoR2VuZXJhdG9yKG9ianMsIGNoYXJhY3Rlcikge1xuICAgIGlmICh0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXTtcbiAgICB9XG4gICAgbGV0IGNtZHM7XG4gICAgdHJ5IHtcbiAgICAgIGNtZHMgPSBvYmpzLmdldCh0aGlzLmxvYWRlZE5hbWUgKyBcIl9wYXRoX1wiICsgY2hhcmFjdGVyKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgd2FybihgZ2V0UGF0aEdlbmVyYXRvciAtIGlnbm9yaW5nIGNoYXJhY3RlcjogXCIke2V4fVwiLmApO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY21kcykgfHwgY21kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBmdW5jdGlvbiAoYywgc2l6ZSkge307XG4gICAgfVxuICAgIGNvbnN0IGNvbW1hbmRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY21kcy5sZW5ndGg7IGkgPCBpaTspIHtcbiAgICAgIHN3aXRjaCAoY21kc1tpKytdKSB7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5CRVpJRVJfQ1VSVkVfVE86XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgW2EsIGIsIGMsIGQsIGUsIGZdID0gY21kcy5zbGljZShpLCBpICsgNik7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHguYmV6aWVyQ3VydmVUbyhhLCBiLCBjLCBkLCBlLCBmKSk7XG4gICAgICAgICAgICBpICs9IDY7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuTU9WRV9UTzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBbYSwgYl0gPSBjbWRzLnNsaWNlKGksIGkgKyAyKTtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goY3R4ID0+IGN0eC5tb3ZlVG8oYSwgYikpO1xuICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGb250UmVuZGVyT3BzLkxJTkVfVE86XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgW2EsIGJdID0gY21kcy5zbGljZShpLCBpICsgMik7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHgubGluZVRvKGEsIGIpKTtcbiAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5RVUFEUkFUSUNfQ1VSVkVfVE86XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgW2EsIGIsIGMsIGRdID0gY21kcy5zbGljZShpLCBpICsgNCk7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHgucXVhZHJhdGljQ3VydmVUbyhhLCBiLCBjLCBkKSk7XG4gICAgICAgICAgICBpICs9IDQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuUkVTVE9SRTpcbiAgICAgICAgICBjb21tYW5kcy5wdXNoKGN0eCA9PiBjdHgucmVzdG9yZSgpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGb250UmVuZGVyT3BzLlNBVkU6XG4gICAgICAgICAgY29tbWFuZHMucHVzaChjdHggPT4gY3R4LnNhdmUoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRm9udFJlbmRlck9wcy5TQ0FMRTpcbiAgICAgICAgICBhc3NlcnQoY29tbWFuZHMubGVuZ3RoID09PSAyLCBcIlNjYWxlIGNvbW1hbmQgaXMgb25seSB2YWxpZCBhdCB0aGUgdGhpcmQgcG9zaXRpb24uXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuVFJBTlNGT1JNOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IFthLCBiLCBjLCBkLCBlLCBmXSA9IGNtZHMuc2xpY2UoaSwgaSArIDYpO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChjdHggPT4gY3R4LnRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSk7XG4gICAgICAgICAgICBpICs9IDY7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZvbnRSZW5kZXJPcHMuVFJBTlNMQVRFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IFthLCBiXSA9IGNtZHMuc2xpY2UoaSwgaSArIDIpO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaChjdHggPT4gY3R4LnRyYW5zbGF0ZShhLCBiKSk7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdID0gZnVuY3Rpb24gZ2x5cGhEcmF3ZXIoY3R4LCBzaXplKSB7XG4gICAgICBjb21tYW5kc1swXShjdHgpO1xuICAgICAgY29tbWFuZHNbMV0oY3R4KTtcbiAgICAgIGN0eC5zY2FsZShzaXplLCAtc2l6ZSk7XG4gICAgICBmb3IgKGxldCBpID0gMiwgaWkgPSBjb21tYW5kcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIGNvbW1hbmRzW2ldKGN0eCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9ub2RlX3V0aWxzLmpzXG5cblxuaWYgKGlzTm9kZUpTKSB7XG4gIHZhciBwYWNrYWdlQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICB2YXIgcGFja2FnZU1hcCA9IG51bGw7XG4gIGNvbnN0IGxvYWRQYWNrYWdlcyA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydCggLyp3ZWJwYWNrSWdub3JlOiB0cnVlKi9cImZzXCIpLFxuICAgICAgaHR0cCA9IGF3YWl0IGltcG9ydCggLyp3ZWJwYWNrSWdub3JlOiB0cnVlKi9cImh0dHBcIiksXG4gICAgICBodHRwcyA9IGF3YWl0IGltcG9ydCggLyp3ZWJwYWNrSWdub3JlOiB0cnVlKi9cImh0dHBzXCIpLFxuICAgICAgdXJsID0gYXdhaXQgaW1wb3J0KCAvKndlYnBhY2tJZ25vcmU6IHRydWUqL1widXJsXCIpO1xuICAgIGxldCBjYW52YXMsIHBhdGgyZDtcbiAgICByZXR1cm4gbmV3IE1hcChPYmplY3QuZW50cmllcyh7XG4gICAgICBmcyxcbiAgICAgIGh0dHAsXG4gICAgICBodHRwcyxcbiAgICAgIHVybCxcbiAgICAgIGNhbnZhcyxcbiAgICAgIHBhdGgyZFxuICAgIH0pKTtcbiAgfTtcbiAgbG9hZFBhY2thZ2VzKCkudGhlbihtYXAgPT4ge1xuICAgIHBhY2thZ2VNYXAgPSBtYXA7XG4gICAgcGFja2FnZUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICB9LCByZWFzb24gPT4ge1xuICAgIHdhcm4oYGxvYWRQYWNrYWdlczogJHtyZWFzb259YCk7XG4gICAgcGFja2FnZU1hcCA9IG5ldyBNYXAoKTtcbiAgICBwYWNrYWdlQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH0pO1xufVxuY2xhc3MgTm9kZVBhY2thZ2VzIHtcbiAgc3RhdGljIGdldCBwcm9taXNlKCkge1xuICAgIHJldHVybiBwYWNrYWdlQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIHN0YXRpYyBnZXQobmFtZSkge1xuICAgIHJldHVybiBwYWNrYWdlTWFwPy5nZXQobmFtZSk7XG4gIH1cbn1cbmNvbnN0IG5vZGVfdXRpbHNfZmV0Y2hEYXRhID0gZnVuY3Rpb24gKHVybCkge1xuICBjb25zdCBmcyA9IE5vZGVQYWNrYWdlcy5nZXQoXCJmc1wiKTtcbiAgcmV0dXJuIGZzLnByb21pc2VzLnJlYWRGaWxlKHVybCkudGhlbihkYXRhID0+IG5ldyBVaW50OEFycmF5KGRhdGEpKTtcbn07XG5jbGFzcyBOb2RlRmlsdGVyRmFjdG9yeSBleHRlbmRzIEJhc2VGaWx0ZXJGYWN0b3J5IHt9XG5jbGFzcyBOb2RlQ2FudmFzRmFjdG9yeSBleHRlbmRzIEJhc2VDYW52YXNGYWN0b3J5IHtcbiAgX2NyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY29uc3QgY2FudmFzID0gTm9kZVBhY2thZ2VzLmdldChcImNhbnZhc1wiKTtcbiAgICByZXR1cm4gY2FudmFzLmNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgfVxufVxuY2xhc3MgTm9kZUNNYXBSZWFkZXJGYWN0b3J5IGV4dGVuZHMgQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHtcbiAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuICAgIHJldHVybiBub2RlX3V0aWxzX2ZldGNoRGF0YSh1cmwpLnRoZW4oZGF0YSA9PiAoe1xuICAgICAgY01hcERhdGE6IGRhdGEsXG4gICAgICBjb21wcmVzc2lvblR5cGVcbiAgICB9KSk7XG4gIH1cbn1cbmNsYXNzIE5vZGVTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBleHRlbmRzIEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG4gIF9mZXRjaERhdGEodXJsKSB7XG4gICAgcmV0dXJuIG5vZGVfdXRpbHNfZmV0Y2hEYXRhKHVybCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvcGF0dGVybl9oZWxwZXIuanNcblxuXG5jb25zdCBQYXRoVHlwZSA9IHtcbiAgRklMTDogXCJGaWxsXCIsXG4gIFNUUk9LRTogXCJTdHJva2VcIixcbiAgU0hBRElORzogXCJTaGFkaW5nXCJcbn07XG5mdW5jdGlvbiBhcHBseUJvdW5kaW5nQm94KGN0eCwgYmJveCkge1xuICBpZiAoIWJib3gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgd2lkdGggPSBiYm94WzJdIC0gYmJveFswXTtcbiAgY29uc3QgaGVpZ2h0ID0gYmJveFszXSAtIGJib3hbMV07XG4gIGNvbnN0IHJlZ2lvbiA9IG5ldyBQYXRoMkQoKTtcbiAgcmVnaW9uLnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7XG4gIGN0eC5jbGlwKHJlZ2lvbik7XG59XG5jbGFzcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVNoYWRpbmdQYXR0ZXJuKSB7XG4gICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTaGFkaW5nUGF0dGVybi5cIik7XG4gICAgfVxuICB9XG4gIGdldFBhdHRlcm4oKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgYGdldFBhdHRlcm5gIGNhbGxlZC5cIik7XG4gIH1cbn1cbmNsYXNzIFJhZGlhbEF4aWFsU2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICBjb25zdHJ1Y3RvcihJUikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fdHlwZSA9IElSWzFdO1xuICAgIHRoaXMuX2Jib3ggPSBJUlsyXTtcbiAgICB0aGlzLl9jb2xvclN0b3BzID0gSVJbM107XG4gICAgdGhpcy5fcDAgPSBJUls0XTtcbiAgICB0aGlzLl9wMSA9IElSWzVdO1xuICAgIHRoaXMuX3IwID0gSVJbNl07XG4gICAgdGhpcy5fcjEgPSBJUls3XTtcbiAgICB0aGlzLm1hdHJpeCA9IG51bGw7XG4gIH1cbiAgX2NyZWF0ZUdyYWRpZW50KGN0eCkge1xuICAgIGxldCBncmFkO1xuICAgIGlmICh0aGlzLl90eXBlID09PSBcImF4aWFsXCIpIHtcbiAgICAgIGdyYWQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQodGhpcy5fcDBbMF0sIHRoaXMuX3AwWzFdLCB0aGlzLl9wMVswXSwgdGhpcy5fcDFbMV0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gXCJyYWRpYWxcIikge1xuICAgICAgZ3JhZCA9IGN0eC5jcmVhdGVSYWRpYWxHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3IwLCB0aGlzLl9wMVswXSwgdGhpcy5fcDFbMV0sIHRoaXMuX3IxKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjb2xvclN0b3Agb2YgdGhpcy5fY29sb3JTdG9wcykge1xuICAgICAgZ3JhZC5hZGRDb2xvclN0b3AoY29sb3JTdG9wWzBdLCBjb2xvclN0b3BbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZ3JhZDtcbiAgfVxuICBnZXRQYXR0ZXJuKGN0eCwgb3duZXIsIGludmVyc2UsIHBhdGhUeXBlKSB7XG4gICAgbGV0IHBhdHRlcm47XG4gICAgaWYgKHBhdGhUeXBlID09PSBQYXRoVHlwZS5TVFJPS0UgfHwgcGF0aFR5cGUgPT09IFBhdGhUeXBlLkZJTEwpIHtcbiAgICAgIGNvbnN0IG93bmVyQkJveCA9IG93bmVyLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveChwYXRoVHlwZSwgZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpKSB8fCBbMCwgMCwgMCwgMF07XG4gICAgICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChvd25lckJCb3hbMl0gLSBvd25lckJCb3hbMF0pIHx8IDE7XG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmNlaWwob3duZXJCQm94WzNdIC0gb3duZXJCQm94WzFdKSB8fCAxO1xuICAgICAgY29uc3QgdG1wQ2FudmFzID0gb3duZXIuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwicGF0dGVyblwiLCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcbiAgICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgdG1wQ3R4LmNsZWFyUmVjdCgwLCAwLCB0bXBDdHguY2FudmFzLndpZHRoLCB0bXBDdHguY2FudmFzLmhlaWdodCk7XG4gICAgICB0bXBDdHguYmVnaW5QYXRoKCk7XG4gICAgICB0bXBDdHgucmVjdCgwLCAwLCB0bXBDdHguY2FudmFzLndpZHRoLCB0bXBDdHguY2FudmFzLmhlaWdodCk7XG4gICAgICB0bXBDdHgudHJhbnNsYXRlKC1vd25lckJCb3hbMF0sIC1vd25lckJCb3hbMV0pO1xuICAgICAgaW52ZXJzZSA9IFV0aWwudHJhbnNmb3JtKGludmVyc2UsIFsxLCAwLCAwLCAxLCBvd25lckJCb3hbMF0sIG93bmVyQkJveFsxXV0pO1xuICAgICAgdG1wQ3R4LnRyYW5zZm9ybSguLi5vd25lci5iYXNlVHJhbnNmb3JtKTtcbiAgICAgIGlmICh0aGlzLm1hdHJpeCkge1xuICAgICAgICB0bXBDdHgudHJhbnNmb3JtKC4uLnRoaXMubWF0cml4KTtcbiAgICAgIH1cbiAgICAgIGFwcGx5Qm91bmRpbmdCb3godG1wQ3R4LCB0aGlzLl9iYm94KTtcbiAgICAgIHRtcEN0eC5maWxsU3R5bGUgPSB0aGlzLl9jcmVhdGVHcmFkaWVudCh0bXBDdHgpO1xuICAgICAgdG1wQ3R4LmZpbGwoKTtcbiAgICAgIHBhdHRlcm4gPSBjdHguY3JlYXRlUGF0dGVybih0bXBDYW52YXMuY2FudmFzLCBcIm5vLXJlcGVhdFwiKTtcbiAgICAgIGNvbnN0IGRvbU1hdHJpeCA9IG5ldyBET01NYXRyaXgoaW52ZXJzZSk7XG4gICAgICBwYXR0ZXJuLnNldFRyYW5zZm9ybShkb21NYXRyaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBseUJvdW5kaW5nQm94KGN0eCwgdGhpcy5fYmJveCk7XG4gICAgICBwYXR0ZXJuID0gdGhpcy5fY3JlYXRlR3JhZGllbnQoY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm47XG4gIH1cbn1cbmZ1bmN0aW9uIGRyYXdUcmlhbmdsZShkYXRhLCBjb250ZXh0LCBwMSwgcDIsIHAzLCBjMSwgYzIsIGMzKSB7XG4gIGNvbnN0IGNvb3JkcyA9IGNvbnRleHQuY29vcmRzLFxuICAgIGNvbG9ycyA9IGNvbnRleHQuY29sb3JzO1xuICBjb25zdCBieXRlcyA9IGRhdGEuZGF0YSxcbiAgICByb3dTaXplID0gZGF0YS53aWR0aCAqIDQ7XG4gIGxldCB0bXA7XG4gIGlmIChjb29yZHNbcDEgKyAxXSA+IGNvb3Jkc1twMiArIDFdKSB7XG4gICAgdG1wID0gcDE7XG4gICAgcDEgPSBwMjtcbiAgICBwMiA9IHRtcDtcbiAgICB0bXAgPSBjMTtcbiAgICBjMSA9IGMyO1xuICAgIGMyID0gdG1wO1xuICB9XG4gIGlmIChjb29yZHNbcDIgKyAxXSA+IGNvb3Jkc1twMyArIDFdKSB7XG4gICAgdG1wID0gcDI7XG4gICAgcDIgPSBwMztcbiAgICBwMyA9IHRtcDtcbiAgICB0bXAgPSBjMjtcbiAgICBjMiA9IGMzO1xuICAgIGMzID0gdG1wO1xuICB9XG4gIGlmIChjb29yZHNbcDEgKyAxXSA+IGNvb3Jkc1twMiArIDFdKSB7XG4gICAgdG1wID0gcDE7XG4gICAgcDEgPSBwMjtcbiAgICBwMiA9IHRtcDtcbiAgICB0bXAgPSBjMTtcbiAgICBjMSA9IGMyO1xuICAgIGMyID0gdG1wO1xuICB9XG4gIGNvbnN0IHgxID0gKGNvb3Jkc1twMV0gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7XG4gIGNvbnN0IHkxID0gKGNvb3Jkc1twMSArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZO1xuICBjb25zdCB4MiA9IChjb29yZHNbcDJdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYO1xuICBjb25zdCB5MiA9IChjb29yZHNbcDIgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTtcbiAgY29uc3QgeDMgPSAoY29vcmRzW3AzXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDtcbiAgY29uc3QgeTMgPSAoY29vcmRzW3AzICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7XG4gIGlmICh5MSA+PSB5Mykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjMXIgPSBjb2xvcnNbYzFdLFxuICAgIGMxZyA9IGNvbG9yc1tjMSArIDFdLFxuICAgIGMxYiA9IGNvbG9yc1tjMSArIDJdO1xuICBjb25zdCBjMnIgPSBjb2xvcnNbYzJdLFxuICAgIGMyZyA9IGNvbG9yc1tjMiArIDFdLFxuICAgIGMyYiA9IGNvbG9yc1tjMiArIDJdO1xuICBjb25zdCBjM3IgPSBjb2xvcnNbYzNdLFxuICAgIGMzZyA9IGNvbG9yc1tjMyArIDFdLFxuICAgIGMzYiA9IGNvbG9yc1tjMyArIDJdO1xuICBjb25zdCBtaW5ZID0gTWF0aC5yb3VuZCh5MSksXG4gICAgbWF4WSA9IE1hdGgucm91bmQoeTMpO1xuICBsZXQgeGEsIGNhciwgY2FnLCBjYWI7XG4gIGxldCB4YiwgY2JyLCBjYmcsIGNiYjtcbiAgZm9yIChsZXQgeSA9IG1pblk7IHkgPD0gbWF4WTsgeSsrKSB7XG4gICAgaWYgKHkgPCB5Mikge1xuICAgICAgY29uc3QgayA9IHkgPCB5MSA/IDAgOiAoeTEgLSB5KSAvICh5MSAtIHkyKTtcbiAgICAgIHhhID0geDEgLSAoeDEgLSB4MikgKiBrO1xuICAgICAgY2FyID0gYzFyIC0gKGMxciAtIGMycikgKiBrO1xuICAgICAgY2FnID0gYzFnIC0gKGMxZyAtIGMyZykgKiBrO1xuICAgICAgY2FiID0gYzFiIC0gKGMxYiAtIGMyYikgKiBrO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaztcbiAgICAgIGlmICh5ID4geTMpIHtcbiAgICAgICAgayA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHkyID09PSB5Mykge1xuICAgICAgICBrID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGsgPSAoeTIgLSB5KSAvICh5MiAtIHkzKTtcbiAgICAgIH1cbiAgICAgIHhhID0geDIgLSAoeDIgLSB4MykgKiBrO1xuICAgICAgY2FyID0gYzJyIC0gKGMyciAtIGMzcikgKiBrO1xuICAgICAgY2FnID0gYzJnIC0gKGMyZyAtIGMzZykgKiBrO1xuICAgICAgY2FiID0gYzJiIC0gKGMyYiAtIGMzYikgKiBrO1xuICAgIH1cbiAgICBsZXQgaztcbiAgICBpZiAoeSA8IHkxKSB7XG4gICAgICBrID0gMDtcbiAgICB9IGVsc2UgaWYgKHkgPiB5Mykge1xuICAgICAgayA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGsgPSAoeTEgLSB5KSAvICh5MSAtIHkzKTtcbiAgICB9XG4gICAgeGIgPSB4MSAtICh4MSAtIHgzKSAqIGs7XG4gICAgY2JyID0gYzFyIC0gKGMxciAtIGMzcikgKiBrO1xuICAgIGNiZyA9IGMxZyAtIChjMWcgLSBjM2cpICogaztcbiAgICBjYmIgPSBjMWIgLSAoYzFiIC0gYzNiKSAqIGs7XG4gICAgY29uc3QgeDFfID0gTWF0aC5yb3VuZChNYXRoLm1pbih4YSwgeGIpKTtcbiAgICBjb25zdCB4Ml8gPSBNYXRoLnJvdW5kKE1hdGgubWF4KHhhLCB4YikpO1xuICAgIGxldCBqID0gcm93U2l6ZSAqIHkgKyB4MV8gKiA0O1xuICAgIGZvciAobGV0IHggPSB4MV87IHggPD0geDJfOyB4KyspIHtcbiAgICAgIGsgPSAoeGEgLSB4KSAvICh4YSAtIHhiKTtcbiAgICAgIGlmIChrIDwgMCkge1xuICAgICAgICBrID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoayA+IDEpIHtcbiAgICAgICAgayA9IDE7XG4gICAgICB9XG4gICAgICBieXRlc1tqKytdID0gY2FyIC0gKGNhciAtIGNicikgKiBrIHwgMDtcbiAgICAgIGJ5dGVzW2orK10gPSBjYWcgLSAoY2FnIC0gY2JnKSAqIGsgfCAwO1xuICAgICAgYnl0ZXNbaisrXSA9IGNhYiAtIChjYWIgLSBjYmIpICogayB8IDA7XG4gICAgICBieXRlc1tqKytdID0gMjU1O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZHJhd0ZpZ3VyZShkYXRhLCBmaWd1cmUsIGNvbnRleHQpIHtcbiAgY29uc3QgcHMgPSBmaWd1cmUuY29vcmRzO1xuICBjb25zdCBjcyA9IGZpZ3VyZS5jb2xvcnM7XG4gIGxldCBpLCBpaTtcbiAgc3dpdGNoIChmaWd1cmUudHlwZSkge1xuICAgIGNhc2UgXCJsYXR0aWNlXCI6XG4gICAgICBjb25zdCB2ZXJ0aWNlc1BlclJvdyA9IGZpZ3VyZS52ZXJ0aWNlc1BlclJvdztcbiAgICAgIGNvbnN0IHJvd3MgPSBNYXRoLmZsb29yKHBzLmxlbmd0aCAvIHZlcnRpY2VzUGVyUm93KSAtIDE7XG4gICAgICBjb25zdCBjb2xzID0gdmVydGljZXNQZXJSb3cgLSAxO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgICBsZXQgcSA9IGkgKiB2ZXJ0aWNlc1BlclJvdztcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzOyBqKyssIHErKykge1xuICAgICAgICAgIGRyYXdUcmlhbmdsZShkYXRhLCBjb250ZXh0LCBwc1txXSwgcHNbcSArIDFdLCBwc1txICsgdmVydGljZXNQZXJSb3ddLCBjc1txXSwgY3NbcSArIDFdLCBjc1txICsgdmVydGljZXNQZXJSb3ddKTtcbiAgICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbcSArIHZlcnRpY2VzUGVyUm93ICsgMV0sIHBzW3EgKyAxXSwgcHNbcSArIHZlcnRpY2VzUGVyUm93XSwgY3NbcSArIHZlcnRpY2VzUGVyUm93ICsgMV0sIGNzW3EgKyAxXSwgY3NbcSArIHZlcnRpY2VzUGVyUm93XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ0cmlhbmdsZXNcIjpcbiAgICAgIGZvciAoaSA9IDAsIGlpID0gcHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMykge1xuICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbaV0sIHBzW2kgKyAxXSwgcHNbaSArIDJdLCBjc1tpXSwgY3NbaSArIDFdLCBjc1tpICsgMl0pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgZmlndXJlXCIpO1xuICB9XG59XG5jbGFzcyBNZXNoU2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICBjb25zdHJ1Y3RvcihJUikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fY29vcmRzID0gSVJbMl07XG4gICAgdGhpcy5fY29sb3JzID0gSVJbM107XG4gICAgdGhpcy5fZmlndXJlcyA9IElSWzRdO1xuICAgIHRoaXMuX2JvdW5kcyA9IElSWzVdO1xuICAgIHRoaXMuX2Jib3ggPSBJUls3XTtcbiAgICB0aGlzLl9iYWNrZ3JvdW5kID0gSVJbOF07XG4gICAgdGhpcy5tYXRyaXggPSBudWxsO1xuICB9XG4gIF9jcmVhdGVNZXNoQ2FudmFzKGNvbWJpbmVkU2NhbGUsIGJhY2tncm91bmRDb2xvciwgY2FjaGVkQ2FudmFzZXMpIHtcbiAgICBjb25zdCBFWFBFQ1RFRF9TQ0FMRSA9IDEuMTtcbiAgICBjb25zdCBNQVhfUEFUVEVSTl9TSVpFID0gMzAwMDtcbiAgICBjb25zdCBCT1JERVJfU0laRSA9IDI7XG4gICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGguZmxvb3IodGhpcy5fYm91bmRzWzBdKTtcbiAgICBjb25zdCBvZmZzZXRZID0gTWF0aC5mbG9vcih0aGlzLl9ib3VuZHNbMV0pO1xuICAgIGNvbnN0IGJvdW5kc1dpZHRoID0gTWF0aC5jZWlsKHRoaXMuX2JvdW5kc1syXSkgLSBvZmZzZXRYO1xuICAgIGNvbnN0IGJvdW5kc0hlaWdodCA9IE1hdGguY2VpbCh0aGlzLl9ib3VuZHNbM10pIC0gb2Zmc2V0WTtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWluKE1hdGguY2VpbChNYXRoLmFicyhib3VuZHNXaWR0aCAqIGNvbWJpbmVkU2NhbGVbMF0gKiBFWFBFQ1RFRF9TQ0FMRSkpLCBNQVhfUEFUVEVSTl9TSVpFKTtcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihNYXRoLmNlaWwoTWF0aC5hYnMoYm91bmRzSGVpZ2h0ICogY29tYmluZWRTY2FsZVsxXSAqIEVYUEVDVEVEX1NDQUxFKSksIE1BWF9QQVRURVJOX1NJWkUpO1xuICAgIGNvbnN0IHNjYWxlWCA9IGJvdW5kc1dpZHRoIC8gd2lkdGg7XG4gICAgY29uc3Qgc2NhbGVZID0gYm91bmRzSGVpZ2h0IC8gaGVpZ2h0O1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBjb29yZHM6IHRoaXMuX2Nvb3JkcyxcbiAgICAgIGNvbG9yczogdGhpcy5fY29sb3JzLFxuICAgICAgb2Zmc2V0WDogLW9mZnNldFgsXG4gICAgICBvZmZzZXRZOiAtb2Zmc2V0WSxcbiAgICAgIHNjYWxlWDogMSAvIHNjYWxlWCxcbiAgICAgIHNjYWxlWTogMSAvIHNjYWxlWVxuICAgIH07XG4gICAgY29uc3QgcGFkZGVkV2lkdGggPSB3aWR0aCArIEJPUkRFUl9TSVpFICogMjtcbiAgICBjb25zdCBwYWRkZWRIZWlnaHQgPSBoZWlnaHQgKyBCT1JERVJfU0laRSAqIDI7XG4gICAgY29uc3QgdG1wQ2FudmFzID0gY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwibWVzaFwiLCBwYWRkZWRXaWR0aCwgcGFkZGVkSGVpZ2h0LCBmYWxzZSk7XG4gICAgY29uc3QgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgY29uc3QgZGF0YSA9IHRtcEN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG4gICAgaWYgKGJhY2tncm91bmRDb2xvcikge1xuICAgICAgY29uc3QgYnl0ZXMgPSBkYXRhLmRhdGE7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSA0KSB7XG4gICAgICAgIGJ5dGVzW2ldID0gYmFja2dyb3VuZENvbG9yWzBdO1xuICAgICAgICBieXRlc1tpICsgMV0gPSBiYWNrZ3JvdW5kQ29sb3JbMV07XG4gICAgICAgIGJ5dGVzW2kgKyAyXSA9IGJhY2tncm91bmRDb2xvclsyXTtcbiAgICAgICAgYnl0ZXNbaSArIDNdID0gMjU1O1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpZ3VyZSBvZiB0aGlzLl9maWd1cmVzKSB7XG4gICAgICBkcmF3RmlndXJlKGRhdGEsIGZpZ3VyZSwgY29udGV4dCk7XG4gICAgfVxuICAgIHRtcEN0eC5wdXRJbWFnZURhdGEoZGF0YSwgQk9SREVSX1NJWkUsIEJPUkRFUl9TSVpFKTtcbiAgICBjb25zdCBjYW52YXMgPSB0bXBDYW52YXMuY2FudmFzO1xuICAgIHJldHVybiB7XG4gICAgICBjYW52YXMsXG4gICAgICBvZmZzZXRYOiBvZmZzZXRYIC0gQk9SREVSX1NJWkUgKiBzY2FsZVgsXG4gICAgICBvZmZzZXRZOiBvZmZzZXRZIC0gQk9SREVSX1NJWkUgKiBzY2FsZVksXG4gICAgICBzY2FsZVgsXG4gICAgICBzY2FsZVlcbiAgICB9O1xuICB9XG4gIGdldFBhdHRlcm4oY3R4LCBvd25lciwgaW52ZXJzZSwgcGF0aFR5cGUpIHtcbiAgICBhcHBseUJvdW5kaW5nQm94KGN0eCwgdGhpcy5fYmJveCk7XG4gICAgbGV0IHNjYWxlO1xuICAgIGlmIChwYXRoVHlwZSA9PT0gUGF0aFR5cGUuU0hBRElORykge1xuICAgICAgc2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShvd25lci5iYXNlVHJhbnNmb3JtKTtcbiAgICAgIGlmICh0aGlzLm1hdHJpeCkge1xuICAgICAgICBjb25zdCBtYXRyaXhTY2FsZSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5tYXRyaXgpO1xuICAgICAgICBzY2FsZSA9IFtzY2FsZVswXSAqIG1hdHJpeFNjYWxlWzBdLCBzY2FsZVsxXSAqIG1hdHJpeFNjYWxlWzFdXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcyA9IHRoaXMuX2NyZWF0ZU1lc2hDYW52YXMoc2NhbGUsIHBhdGhUeXBlID09PSBQYXRoVHlwZS5TSEFESU5HID8gbnVsbCA6IHRoaXMuX2JhY2tncm91bmQsIG93bmVyLmNhY2hlZENhbnZhc2VzKTtcbiAgICBpZiAocGF0aFR5cGUgIT09IFBhdGhUeXBlLlNIQURJTkcpIHtcbiAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oLi4ub3duZXIuYmFzZVRyYW5zZm9ybSk7XG4gICAgICBpZiAodGhpcy5tYXRyaXgpIHtcbiAgICAgICAgY3R4LnRyYW5zZm9ybSguLi50aGlzLm1hdHJpeCk7XG4gICAgICB9XG4gICAgfVxuICAgIGN0eC50cmFuc2xhdGUodGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLm9mZnNldFkpO1xuICAgIGN0eC5zY2FsZSh0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWCwgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5zY2FsZVkpO1xuICAgIHJldHVybiBjdHguY3JlYXRlUGF0dGVybih0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLmNhbnZhcywgXCJuby1yZXBlYXRcIik7XG4gIH1cbn1cbmNsYXNzIER1bW15U2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICBnZXRQYXR0ZXJuKCkge1xuICAgIHJldHVybiBcImhvdHBpbmtcIjtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm4oSVIpIHtcbiAgc3dpdGNoIChJUlswXSkge1xuICAgIGNhc2UgXCJSYWRpYWxBeGlhbFwiOlxuICAgICAgcmV0dXJuIG5ldyBSYWRpYWxBeGlhbFNoYWRpbmdQYXR0ZXJuKElSKTtcbiAgICBjYXNlIFwiTWVzaFwiOlxuICAgICAgcmV0dXJuIG5ldyBNZXNoU2hhZGluZ1BhdHRlcm4oSVIpO1xuICAgIGNhc2UgXCJEdW1teVwiOlxuICAgICAgcmV0dXJuIG5ldyBEdW1teVNoYWRpbmdQYXR0ZXJuKCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIElSIHR5cGU6ICR7SVJbMF19YCk7XG59XG5jb25zdCBQYWludFR5cGUgPSB7XG4gIENPTE9SRUQ6IDEsXG4gIFVOQ09MT1JFRDogMlxufTtcbmNsYXNzIFRpbGluZ1BhdHRlcm4ge1xuICBzdGF0aWMgTUFYX1BBVFRFUk5fU0laRSA9IDMwMDA7XG4gIGNvbnN0cnVjdG9yKElSLCBjb2xvciwgY3R4LCBjYW52YXNHcmFwaGljc0ZhY3RvcnksIGJhc2VUcmFuc2Zvcm0pIHtcbiAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IElSWzJdO1xuICAgIHRoaXMubWF0cml4ID0gSVJbM107XG4gICAgdGhpcy5iYm94ID0gSVJbNF07XG4gICAgdGhpcy54c3RlcCA9IElSWzVdO1xuICAgIHRoaXMueXN0ZXAgPSBJUls2XTtcbiAgICB0aGlzLnBhaW50VHlwZSA9IElSWzddO1xuICAgIHRoaXMudGlsaW5nVHlwZSA9IElSWzhdO1xuICAgIHRoaXMuY29sb3IgPSBjb2xvcjtcbiAgICB0aGlzLmN0eCA9IGN0eDtcbiAgICB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IGNhbnZhc0dyYXBoaWNzRmFjdG9yeTtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSBiYXNlVHJhbnNmb3JtO1xuICB9XG4gIGNyZWF0ZVBhdHRlcm5DYW52YXMob3duZXIpIHtcbiAgICBjb25zdCBvcGVyYXRvckxpc3QgPSB0aGlzLm9wZXJhdG9yTGlzdDtcbiAgICBjb25zdCBiYm94ID0gdGhpcy5iYm94O1xuICAgIGNvbnN0IHhzdGVwID0gdGhpcy54c3RlcDtcbiAgICBjb25zdCB5c3RlcCA9IHRoaXMueXN0ZXA7XG4gICAgY29uc3QgcGFpbnRUeXBlID0gdGhpcy5wYWludFR5cGU7XG4gICAgY29uc3QgdGlsaW5nVHlwZSA9IHRoaXMudGlsaW5nVHlwZTtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3I7XG4gICAgY29uc3QgY2FudmFzR3JhcGhpY3NGYWN0b3J5ID0gdGhpcy5jYW52YXNHcmFwaGljc0ZhY3Rvcnk7XG4gICAgaW5mbyhcIlRpbGluZ1R5cGU6IFwiICsgdGlsaW5nVHlwZSk7XG4gICAgY29uc3QgeDAgPSBiYm94WzBdLFxuICAgICAgeTAgPSBiYm94WzFdLFxuICAgICAgeDEgPSBiYm94WzJdLFxuICAgICAgeTEgPSBiYm94WzNdO1xuICAgIGNvbnN0IG1hdHJpeFNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7XG4gICAgY29uc3QgY3VyTWF0cml4U2NhbGUgPSBVdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMuYmFzZVRyYW5zZm9ybSk7XG4gICAgY29uc3QgY29tYmluZWRTY2FsZSA9IFttYXRyaXhTY2FsZVswXSAqIGN1ck1hdHJpeFNjYWxlWzBdLCBtYXRyaXhTY2FsZVsxXSAqIGN1ck1hdHJpeFNjYWxlWzFdXTtcbiAgICBjb25zdCBkaW14ID0gdGhpcy5nZXRTaXplQW5kU2NhbGUoeHN0ZXAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgY29tYmluZWRTY2FsZVswXSk7XG4gICAgY29uc3QgZGlteSA9IHRoaXMuZ2V0U2l6ZUFuZFNjYWxlKHlzdGVwLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0LCBjb21iaW5lZFNjYWxlWzFdKTtcbiAgICBjb25zdCB0bXBDYW52YXMgPSBvd25lci5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJwYXR0ZXJuXCIsIGRpbXguc2l6ZSwgZGlteS5zaXplLCB0cnVlKTtcbiAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICBjb25zdCBncmFwaGljcyA9IGNhbnZhc0dyYXBoaWNzRmFjdG9yeS5jcmVhdGVDYW52YXNHcmFwaGljcyh0bXBDdHgpO1xuICAgIGdyYXBoaWNzLmdyb3VwTGV2ZWwgPSBvd25lci5ncm91cExldmVsO1xuICAgIHRoaXMuc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0KGdyYXBoaWNzLCBwYWludFR5cGUsIGNvbG9yKTtcbiAgICBsZXQgYWRqdXN0ZWRYMCA9IHgwO1xuICAgIGxldCBhZGp1c3RlZFkwID0geTA7XG4gICAgbGV0IGFkanVzdGVkWDEgPSB4MTtcbiAgICBsZXQgYWRqdXN0ZWRZMSA9IHkxO1xuICAgIGlmICh4MCA8IDApIHtcbiAgICAgIGFkanVzdGVkWDAgPSAwO1xuICAgICAgYWRqdXN0ZWRYMSArPSBNYXRoLmFicyh4MCk7XG4gICAgfVxuICAgIGlmICh5MCA8IDApIHtcbiAgICAgIGFkanVzdGVkWTAgPSAwO1xuICAgICAgYWRqdXN0ZWRZMSArPSBNYXRoLmFicyh5MCk7XG4gICAgfVxuICAgIHRtcEN0eC50cmFuc2xhdGUoLShkaW14LnNjYWxlICogYWRqdXN0ZWRYMCksIC0oZGlteS5zY2FsZSAqIGFkanVzdGVkWTApKTtcbiAgICBncmFwaGljcy50cmFuc2Zvcm0oZGlteC5zY2FsZSwgMCwgMCwgZGlteS5zY2FsZSwgMCwgMCk7XG4gICAgdG1wQ3R4LnNhdmUoKTtcbiAgICB0aGlzLmNsaXBCYm94KGdyYXBoaWNzLCBhZGp1c3RlZFgwLCBhZGp1c3RlZFkwLCBhZGp1c3RlZFgxLCBhZGp1c3RlZFkxKTtcbiAgICBncmFwaGljcy5iYXNlVHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybShncmFwaGljcy5jdHgpO1xuICAgIGdyYXBoaWNzLmV4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0KTtcbiAgICBncmFwaGljcy5lbmREcmF3aW5nKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhbnZhczogdG1wQ2FudmFzLmNhbnZhcyxcbiAgICAgIHNjYWxlWDogZGlteC5zY2FsZSxcbiAgICAgIHNjYWxlWTogZGlteS5zY2FsZSxcbiAgICAgIG9mZnNldFg6IGFkanVzdGVkWDAsXG4gICAgICBvZmZzZXRZOiBhZGp1c3RlZFkwXG4gICAgfTtcbiAgfVxuICBnZXRTaXplQW5kU2NhbGUoc3RlcCwgcmVhbE91dHB1dFNpemUsIHNjYWxlKSB7XG4gICAgc3RlcCA9IE1hdGguYWJzKHN0ZXApO1xuICAgIGNvbnN0IG1heFNpemUgPSBNYXRoLm1heChUaWxpbmdQYXR0ZXJuLk1BWF9QQVRURVJOX1NJWkUsIHJlYWxPdXRwdXRTaXplKTtcbiAgICBsZXQgc2l6ZSA9IE1hdGguY2VpbChzdGVwICogc2NhbGUpO1xuICAgIGlmIChzaXplID49IG1heFNpemUpIHtcbiAgICAgIHNpemUgPSBtYXhTaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2FsZSA9IHNpemUgLyBzdGVwO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGUsXG4gICAgICBzaXplXG4gICAgfTtcbiAgfVxuICBjbGlwQmJveChncmFwaGljcywgeDAsIHkwLCB4MSwgeTEpIHtcbiAgICBjb25zdCBiYm94V2lkdGggPSB4MSAtIHgwO1xuICAgIGNvbnN0IGJib3hIZWlnaHQgPSB5MSAtIHkwO1xuICAgIGdyYXBoaWNzLmN0eC5yZWN0KHgwLCB5MCwgYmJveFdpZHRoLCBiYm94SGVpZ2h0KTtcbiAgICBncmFwaGljcy5jdXJyZW50LnVwZGF0ZVJlY3RNaW5NYXgoZ2V0Q3VycmVudFRyYW5zZm9ybShncmFwaGljcy5jdHgpLCBbeDAsIHkwLCB4MSwgeTFdKTtcbiAgICBncmFwaGljcy5jbGlwKCk7XG4gICAgZ3JhcGhpY3MuZW5kUGF0aCgpO1xuICB9XG4gIHNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChncmFwaGljcywgcGFpbnRUeXBlLCBjb2xvcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBncmFwaGljcy5jdHgsXG4gICAgICBjdXJyZW50ID0gZ3JhcGhpY3MuY3VycmVudDtcbiAgICBzd2l0Y2ggKHBhaW50VHlwZSkge1xuICAgICAgY2FzZSBQYWludFR5cGUuQ09MT1JFRDpcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY3R4LmZpbGxTdHlsZTtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGN0eC5zdHJva2VTdHlsZTtcbiAgICAgICAgY3VycmVudC5maWxsQ29sb3IgPSBjdHguZmlsbFN0eWxlO1xuICAgICAgICBjdXJyZW50LnN0cm9rZUNvbG9yID0gY3R4LnN0cm9rZVN0eWxlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUGFpbnRUeXBlLlVOQ09MT1JFRDpcbiAgICAgICAgY29uc3QgY3NzQ29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvcihjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdKTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBjc3NDb2xvcjtcbiAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGNzc0NvbG9yO1xuICAgICAgICBjdXJyZW50LmZpbGxDb2xvciA9IGNzc0NvbG9yO1xuICAgICAgICBjdXJyZW50LnN0cm9rZUNvbG9yID0gY3NzQ29sb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbnN1cHBvcnRlZCBwYWludCB0eXBlOiAke3BhaW50VHlwZX1gKTtcbiAgICB9XG4gIH1cbiAgZ2V0UGF0dGVybihjdHgsIG93bmVyLCBpbnZlcnNlLCBwYXRoVHlwZSkge1xuICAgIGxldCBtYXRyaXggPSBpbnZlcnNlO1xuICAgIGlmIChwYXRoVHlwZSAhPT0gUGF0aFR5cGUuU0hBRElORykge1xuICAgICAgbWF0cml4ID0gVXRpbC50cmFuc2Zvcm0obWF0cml4LCBvd25lci5iYXNlVHJhbnNmb3JtKTtcbiAgICAgIGlmICh0aGlzLm1hdHJpeCkge1xuICAgICAgICBtYXRyaXggPSBVdGlsLnRyYW5zZm9ybShtYXRyaXgsIHRoaXMubWF0cml4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcyA9IHRoaXMuY3JlYXRlUGF0dGVybkNhbnZhcyhvd25lcik7XG4gICAgbGV0IGRvbU1hdHJpeCA9IG5ldyBET01NYXRyaXgobWF0cml4KTtcbiAgICBkb21NYXRyaXggPSBkb21NYXRyaXgudHJhbnNsYXRlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WCwgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRZKTtcbiAgICBkb21NYXRyaXggPSBkb21NYXRyaXguc2NhbGUoMSAvIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVYLCAxIC8gdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5zY2FsZVkpO1xuICAgIGNvbnN0IHBhdHRlcm4gPSBjdHguY3JlYXRlUGF0dGVybih0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLmNhbnZhcywgXCJyZXBlYXRcIik7XG4gICAgcGF0dGVybi5zZXRUcmFuc2Zvcm0oZG9tTWF0cml4KTtcbiAgICByZXR1cm4gcGF0dGVybjtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvc2hhcmVkL2ltYWdlX3V0aWxzLmpzXG5cbmZ1bmN0aW9uIGNvbnZlcnRUb1JHQkEocGFyYW1zKSB7XG4gIHN3aXRjaCAocGFyYW1zLmtpbmQpIHtcbiAgICBjYXNlIEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDpcbiAgICAgIHJldHVybiBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQShwYXJhbXMpO1xuICAgIGNhc2UgSW1hZ2VLaW5kLlJHQl8yNEJQUDpcbiAgICAgIHJldHVybiBjb252ZXJ0UkdCVG9SR0JBKHBhcmFtcyk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQSh7XG4gIHNyYyxcbiAgc3JjUG9zID0gMCxcbiAgZGVzdCxcbiAgd2lkdGgsXG4gIGhlaWdodCxcbiAgbm9uQmxhY2tDb2xvciA9IDB4ZmZmZmZmZmYsXG4gIGludmVyc2VEZWNvZGUgPSBmYWxzZVxufSkge1xuICBjb25zdCBibGFjayA9IHV0aWxfRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweGZmMDAwMDAwIDogMHgwMDAwMDBmZjtcbiAgY29uc3QgW3plcm9NYXBwaW5nLCBvbmVNYXBwaW5nXSA9IGludmVyc2VEZWNvZGUgPyBbbm9uQmxhY2tDb2xvciwgYmxhY2tdIDogW2JsYWNrLCBub25CbGFja0NvbG9yXTtcbiAgY29uc3Qgd2lkdGhJblNvdXJjZSA9IHdpZHRoID4+IDM7XG4gIGNvbnN0IHdpZHRoUmVtYWluZGVyID0gd2lkdGggJiA3O1xuICBjb25zdCBzcmNMZW5ndGggPSBzcmMubGVuZ3RoO1xuICBkZXN0ID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyKTtcbiAgbGV0IGRlc3RQb3MgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgZm9yIChjb25zdCBtYXggPSBzcmNQb3MgKyB3aWR0aEluU291cmNlOyBzcmNQb3MgPCBtYXg7IHNyY1BvcysrKSB7XG4gICAgICBjb25zdCBlbGVtID0gc3JjUG9zIDwgc3JjTGVuZ3RoID8gc3JjW3NyY1Bvc10gOiAyNTU7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgfVxuICAgIGlmICh3aWR0aFJlbWFpbmRlciA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGVsZW0gPSBzcmNQb3MgPCBzcmNMZW5ndGggPyBzcmNbc3JjUG9zKytdIDogMjU1O1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgd2lkdGhSZW1haW5kZXI7IGorKykge1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDEgPDwgNyAtIGogPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgc3JjUG9zLFxuICAgIGRlc3RQb3NcbiAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRSR0JUb1JHQkEoe1xuICBzcmMsXG4gIHNyY1BvcyA9IDAsXG4gIGRlc3QsXG4gIGRlc3RQb3MgPSAwLFxuICB3aWR0aCxcbiAgaGVpZ2h0XG59KSB7XG4gIGxldCBpID0gMDtcbiAgY29uc3QgbGVuMzIgPSBzcmMubGVuZ3RoID4+IDI7XG4gIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIsIHNyY1BvcywgbGVuMzIpO1xuICBpZiAoRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pIHtcbiAgICBmb3IgKDsgaSA8IGxlbjMyIC0gMjsgaSArPSAzLCBkZXN0UG9zICs9IDQpIHtcbiAgICAgIGNvbnN0IHMxID0gc3JjMzJbaV07XG4gICAgICBjb25zdCBzMiA9IHNyYzMyW2kgKyAxXTtcbiAgICAgIGNvbnN0IHMzID0gc3JjMzJbaSArIDJdO1xuICAgICAgZGVzdFtkZXN0UG9zXSA9IHMxIHwgMHhmZjAwMDAwMDtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDFdID0gczEgPj4+IDI0IHwgczIgPDwgOCB8IDB4ZmYwMDAwMDA7XG4gICAgICBkZXN0W2Rlc3RQb3MgKyAyXSA9IHMyID4+PiAxNiB8IHMzIDw8IDE2IHwgMHhmZjAwMDAwMDtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDNdID0gczMgPj4+IDggfCAweGZmMDAwMDAwO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gaSAqIDQsIGpqID0gc3JjLmxlbmd0aDsgaiA8IGpqOyBqICs9IDMpIHtcbiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tqXSB8IHNyY1tqICsgMV0gPDwgOCB8IHNyY1tqICsgMl0gPDwgMTYgfCAweGZmMDAwMDAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKDsgaSA8IGxlbjMyIC0gMjsgaSArPSAzLCBkZXN0UG9zICs9IDQpIHtcbiAgICAgIGNvbnN0IHMxID0gc3JjMzJbaV07XG4gICAgICBjb25zdCBzMiA9IHNyYzMyW2kgKyAxXTtcbiAgICAgIGNvbnN0IHMzID0gc3JjMzJbaSArIDJdO1xuICAgICAgZGVzdFtkZXN0UG9zXSA9IHMxIHwgMHhmZjtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDFdID0gczEgPDwgMjQgfCBzMiA+Pj4gOCB8IDB4ZmY7XG4gICAgICBkZXN0W2Rlc3RQb3MgKyAyXSA9IHMyIDw8IDE2IHwgczMgPj4+IDE2IHwgMHhmZjtcbiAgICAgIGRlc3RbZGVzdFBvcyArIDNdID0gczMgPDwgOCB8IDB4ZmY7XG4gICAgfVxuICAgIGZvciAobGV0IGogPSBpICogNCwgamogPSBzcmMubGVuZ3RoOyBqIDwgamo7IGogKz0gMykge1xuICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW2pdIDw8IDI0IHwgc3JjW2ogKyAxXSA8PCAxNiB8IHNyY1tqICsgMl0gPDwgOCB8IDB4ZmY7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgc3JjUG9zLFxuICAgIGRlc3RQb3NcbiAgfTtcbn1cbmZ1bmN0aW9uIGdyYXlUb1JHQkEoc3JjLCBkZXN0KSB7XG4gIGlmIChGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikge1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBkZXN0W2ldID0gc3JjW2ldICogMHgxMDEwMSB8IDB4ZmYwMDAwMDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBkZXN0W2ldID0gc3JjW2ldICogMHgxMDEwMTAwIHwgMHgwMDAwMDBmZjtcbiAgICB9XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvY2FudmFzLmpzXG5cblxuXG5cbmNvbnN0IE1JTl9GT05UX1NJWkUgPSAxNjtcbmNvbnN0IE1BWF9GT05UX1NJWkUgPSAxMDA7XG5jb25zdCBFWEVDVVRJT05fVElNRSA9IDE1O1xuY29uc3QgRVhFQ1VUSU9OX1NURVBTID0gMTA7XG5jb25zdCBNQVhfU0laRV9UT19DT01QSUxFID0gMTAwMDtcbmNvbnN0IEZVTExfQ0hVTktfSEVJR0hUID0gMTY7XG5mdW5jdGlvbiBtaXJyb3JDb250ZXh0T3BlcmF0aW9ucyhjdHgsIGRlc3RDdHgpIHtcbiAgaWYgKGN0eC5fcmVtb3ZlTWlycm9yaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBpcyBhbHJlYWR5IGZvcndhcmRpbmcgb3BlcmF0aW9ucy5cIik7XG4gIH1cbiAgY3R4Ll9fb3JpZ2luYWxTYXZlID0gY3R4LnNhdmU7XG4gIGN0eC5fX29yaWdpbmFsUmVzdG9yZSA9IGN0eC5yZXN0b3JlO1xuICBjdHguX19vcmlnaW5hbFJvdGF0ZSA9IGN0eC5yb3RhdGU7XG4gIGN0eC5fX29yaWdpbmFsU2NhbGUgPSBjdHguc2NhbGU7XG4gIGN0eC5fX29yaWdpbmFsVHJhbnNsYXRlID0gY3R4LnRyYW5zbGF0ZTtcbiAgY3R4Ll9fb3JpZ2luYWxUcmFuc2Zvcm0gPSBjdHgudHJhbnNmb3JtO1xuICBjdHguX19vcmlnaW5hbFNldFRyYW5zZm9ybSA9IGN0eC5zZXRUcmFuc2Zvcm07XG4gIGN0eC5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm0gPSBjdHgucmVzZXRUcmFuc2Zvcm07XG4gIGN0eC5fX29yaWdpbmFsQ2xpcCA9IGN0eC5jbGlwO1xuICBjdHguX19vcmlnaW5hbE1vdmVUbyA9IGN0eC5tb3ZlVG87XG4gIGN0eC5fX29yaWdpbmFsTGluZVRvID0gY3R4LmxpbmVUbztcbiAgY3R4Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvID0gY3R4LmJlemllckN1cnZlVG87XG4gIGN0eC5fX29yaWdpbmFsUmVjdCA9IGN0eC5yZWN0O1xuICBjdHguX19vcmlnaW5hbENsb3NlUGF0aCA9IGN0eC5jbG9zZVBhdGg7XG4gIGN0eC5fX29yaWdpbmFsQmVnaW5QYXRoID0gY3R4LmJlZ2luUGF0aDtcbiAgY3R4Ll9yZW1vdmVNaXJyb3JpbmcgPSAoKSA9PiB7XG4gICAgY3R4LnNhdmUgPSBjdHguX19vcmlnaW5hbFNhdmU7XG4gICAgY3R4LnJlc3RvcmUgPSBjdHguX19vcmlnaW5hbFJlc3RvcmU7XG4gICAgY3R4LnJvdGF0ZSA9IGN0eC5fX29yaWdpbmFsUm90YXRlO1xuICAgIGN0eC5zY2FsZSA9IGN0eC5fX29yaWdpbmFsU2NhbGU7XG4gICAgY3R4LnRyYW5zbGF0ZSA9IGN0eC5fX29yaWdpbmFsVHJhbnNsYXRlO1xuICAgIGN0eC50cmFuc2Zvcm0gPSBjdHguX19vcmlnaW5hbFRyYW5zZm9ybTtcbiAgICBjdHguc2V0VHJhbnNmb3JtID0gY3R4Ll9fb3JpZ2luYWxTZXRUcmFuc2Zvcm07XG4gICAgY3R4LnJlc2V0VHJhbnNmb3JtID0gY3R4Ll9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybTtcbiAgICBjdHguY2xpcCA9IGN0eC5fX29yaWdpbmFsQ2xpcDtcbiAgICBjdHgubW92ZVRvID0gY3R4Ll9fb3JpZ2luYWxNb3ZlVG87XG4gICAgY3R4LmxpbmVUbyA9IGN0eC5fX29yaWdpbmFsTGluZVRvO1xuICAgIGN0eC5iZXppZXJDdXJ2ZVRvID0gY3R4Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvO1xuICAgIGN0eC5yZWN0ID0gY3R4Ll9fb3JpZ2luYWxSZWN0O1xuICAgIGN0eC5jbG9zZVBhdGggPSBjdHguX19vcmlnaW5hbENsb3NlUGF0aDtcbiAgICBjdHguYmVnaW5QYXRoID0gY3R4Ll9fb3JpZ2luYWxCZWdpblBhdGg7XG4gICAgZGVsZXRlIGN0eC5fcmVtb3ZlTWlycm9yaW5nO1xuICB9O1xuICBjdHguc2F2ZSA9IGZ1bmN0aW9uIGN0eFNhdmUoKSB7XG4gICAgZGVzdEN0eC5zYXZlKCk7XG4gICAgdGhpcy5fX29yaWdpbmFsU2F2ZSgpO1xuICB9O1xuICBjdHgucmVzdG9yZSA9IGZ1bmN0aW9uIGN0eFJlc3RvcmUoKSB7XG4gICAgZGVzdEN0eC5yZXN0b3JlKCk7XG4gICAgdGhpcy5fX29yaWdpbmFsUmVzdG9yZSgpO1xuICB9O1xuICBjdHgudHJhbnNsYXRlID0gZnVuY3Rpb24gY3R4VHJhbnNsYXRlKHgsIHkpIHtcbiAgICBkZXN0Q3R4LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxUcmFuc2xhdGUoeCwgeSk7XG4gIH07XG4gIGN0eC5zY2FsZSA9IGZ1bmN0aW9uIGN0eFNjYWxlKHgsIHkpIHtcbiAgICBkZXN0Q3R4LnNjYWxlKHgsIHkpO1xuICAgIHRoaXMuX19vcmlnaW5hbFNjYWxlKHgsIHkpO1xuICB9O1xuICBjdHgudHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICBkZXN0Q3R4LnRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG4gIH07XG4gIGN0eC5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhTZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikge1xuICAgIGRlc3RDdHguc2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuICAgIHRoaXMuX19vcmlnaW5hbFNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcbiAgfTtcbiAgY3R4LnJlc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4UmVzZXRUcmFuc2Zvcm0oKSB7XG4gICAgZGVzdEN0eC5yZXNldFRyYW5zZm9ybSgpO1xuICAgIHRoaXMuX19vcmlnaW5hbFJlc2V0VHJhbnNmb3JtKCk7XG4gIH07XG4gIGN0eC5yb3RhdGUgPSBmdW5jdGlvbiBjdHhSb3RhdGUoYW5nbGUpIHtcbiAgICBkZXN0Q3R4LnJvdGF0ZShhbmdsZSk7XG4gICAgdGhpcy5fX29yaWdpbmFsUm90YXRlKGFuZ2xlKTtcbiAgfTtcbiAgY3R4LmNsaXAgPSBmdW5jdGlvbiBjdHhSb3RhdGUocnVsZSkge1xuICAgIGRlc3RDdHguY2xpcChydWxlKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxDbGlwKHJ1bGUpO1xuICB9O1xuICBjdHgubW92ZVRvID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICBkZXN0Q3R4Lm1vdmVUbyh4LCB5KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNb3ZlVG8oeCwgeSk7XG4gIH07XG4gIGN0eC5saW5lVG8gPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIGRlc3RDdHgubGluZVRvKHgsIHkpO1xuICAgIHRoaXMuX19vcmlnaW5hbExpbmVUbyh4LCB5KTtcbiAgfTtcbiAgY3R4LmJlemllckN1cnZlVG8gPSBmdW5jdGlvbiAoY3AxeCwgY3AxeSwgY3AyeCwgY3AyeSwgeCwgeSkge1xuICAgIGRlc3RDdHguYmV6aWVyQ3VydmVUbyhjcDF4LCBjcDF5LCBjcDJ4LCBjcDJ5LCB4LCB5KTtcbiAgICB0aGlzLl9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvKGNwMXgsIGNwMXksIGNwMngsIGNwMnksIHgsIHkpO1xuICB9O1xuICBjdHgucmVjdCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgZGVzdEN0eC5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIHRoaXMuX19vcmlnaW5hbFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gIH07XG4gIGN0eC5jbG9zZVBhdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgZGVzdEN0eC5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxDbG9zZVBhdGgoKTtcbiAgfTtcbiAgY3R4LmJlZ2luUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICBkZXN0Q3R4LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuX19vcmlnaW5hbEJlZ2luUGF0aCgpO1xuICB9O1xufVxuY2xhc3MgQ2FjaGVkQ2FudmFzZXMge1xuICBjb25zdHJ1Y3RvcihjYW52YXNGYWN0b3J5KSB7XG4gICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTtcbiAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICBnZXRDYW52YXMoaWQsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBsZXQgY2FudmFzRW50cnk7XG4gICAgaWYgKHRoaXMuY2FjaGVbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhbnZhc0VudHJ5ID0gdGhpcy5jYWNoZVtpZF07XG4gICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkucmVzZXQoY2FudmFzRW50cnksIHdpZHRoLCBoZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXNFbnRyeSA9IHRoaXMuY2FudmFzRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmNhY2hlW2lkXSA9IGNhbnZhc0VudHJ5O1xuICAgIH1cbiAgICByZXR1cm4gY2FudmFzRW50cnk7XG4gIH1cbiAgZGVsZXRlKGlkKSB7XG4gICAgZGVsZXRlIHRoaXMuY2FjaGVbaWRdO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5jYWNoZSkge1xuICAgICAgY29uc3QgY2FudmFzRW50cnkgPSB0aGlzLmNhY2hlW2lkXTtcbiAgICAgIHRoaXMuY2FudmFzRmFjdG9yeS5kZXN0cm95KGNhbnZhc0VudHJ5KTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhjdHgsIHNyY0ltZywgc3JjWCwgc3JjWSwgc3JjVywgc3JjSCwgZGVzdFgsIGRlc3RZLCBkZXN0VywgZGVzdEgpIHtcbiAgY29uc3QgW2EsIGIsIGMsIGQsIHR4LCB0eV0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCk7XG4gIGlmIChiID09PSAwICYmIGMgPT09IDApIHtcbiAgICBjb25zdCB0bFggPSBkZXN0WCAqIGEgKyB0eDtcbiAgICBjb25zdCByVGxYID0gTWF0aC5yb3VuZCh0bFgpO1xuICAgIGNvbnN0IHRsWSA9IGRlc3RZICogZCArIHR5O1xuICAgIGNvbnN0IHJUbFkgPSBNYXRoLnJvdW5kKHRsWSk7XG4gICAgY29uc3QgYnJYID0gKGRlc3RYICsgZGVzdFcpICogYSArIHR4O1xuICAgIGNvbnN0IHJXaWR0aCA9IE1hdGguYWJzKE1hdGgucm91bmQoYnJYKSAtIHJUbFgpIHx8IDE7XG4gICAgY29uc3QgYnJZID0gKGRlc3RZICsgZGVzdEgpICogZCArIHR5O1xuICAgIGNvbnN0IHJIZWlnaHQgPSBNYXRoLmFicyhNYXRoLnJvdW5kKGJyWSkgLSByVGxZKSB8fCAxO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oTWF0aC5zaWduKGEpLCAwLCAwLCBNYXRoLnNpZ24oZCksIHJUbFgsIHJUbFkpO1xuICAgIGN0eC5kcmF3SW1hZ2Uoc3JjSW1nLCBzcmNYLCBzcmNZLCBzcmNXLCBzcmNILCAwLCAwLCByV2lkdGgsIHJIZWlnaHQpO1xuICAgIGN0eC5zZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgdHgsIHR5KTtcbiAgICByZXR1cm4gW3JXaWR0aCwgckhlaWdodF07XG4gIH1cbiAgaWYgKGEgPT09IDAgJiYgZCA9PT0gMCkge1xuICAgIGNvbnN0IHRsWCA9IGRlc3RZICogYyArIHR4O1xuICAgIGNvbnN0IHJUbFggPSBNYXRoLnJvdW5kKHRsWCk7XG4gICAgY29uc3QgdGxZID0gZGVzdFggKiBiICsgdHk7XG4gICAgY29uc3QgclRsWSA9IE1hdGgucm91bmQodGxZKTtcbiAgICBjb25zdCBiclggPSAoZGVzdFkgKyBkZXN0SCkgKiBjICsgdHg7XG4gICAgY29uc3QgcldpZHRoID0gTWF0aC5hYnMoTWF0aC5yb3VuZChiclgpIC0gclRsWCkgfHwgMTtcbiAgICBjb25zdCBiclkgPSAoZGVzdFggKyBkZXN0VykgKiBiICsgdHk7XG4gICAgY29uc3QgckhlaWdodCA9IE1hdGguYWJzKE1hdGgucm91bmQoYnJZKSAtIHJUbFkpIHx8IDE7XG4gICAgY3R4LnNldFRyYW5zZm9ybSgwLCBNYXRoLnNpZ24oYiksIE1hdGguc2lnbihjKSwgMCwgclRsWCwgclRsWSk7XG4gICAgY3R4LmRyYXdJbWFnZShzcmNJbWcsIHNyY1gsIHNyY1ksIHNyY1csIHNyY0gsIDAsIDAsIHJIZWlnaHQsIHJXaWR0aCk7XG4gICAgY3R4LnNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCB0eCwgdHkpO1xuICAgIHJldHVybiBbckhlaWdodCwgcldpZHRoXTtcbiAgfVxuICBjdHguZHJhd0ltYWdlKHNyY0ltZywgc3JjWCwgc3JjWSwgc3JjVywgc3JjSCwgZGVzdFgsIGRlc3RZLCBkZXN0VywgZGVzdEgpO1xuICBjb25zdCBzY2FsZVggPSBNYXRoLmh5cG90KGEsIGIpO1xuICBjb25zdCBzY2FsZVkgPSBNYXRoLmh5cG90KGMsIGQpO1xuICByZXR1cm4gW3NjYWxlWCAqIGRlc3RXLCBzY2FsZVkgKiBkZXN0SF07XG59XG5mdW5jdGlvbiBjb21waWxlVHlwZTNHbHlwaChpbWdEYXRhKSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfSA9IGltZ0RhdGE7XG4gIGlmICh3aWR0aCA+IE1BWF9TSVpFX1RPX0NPTVBJTEUgfHwgaGVpZ2h0ID4gTUFYX1NJWkVfVE9fQ09NUElMRSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IFBPSU5UX1RPX1BST0NFU1NfTElNSVQgPSAxMDAwO1xuICBjb25zdCBQT0lOVF9UWVBFUyA9IG5ldyBVaW50OEFycmF5KFswLCAyLCA0LCAwLCAxLCAwLCA1LCA0LCA4LCAxMCwgMCwgOCwgMCwgMiwgMSwgMF0pO1xuICBjb25zdCB3aWR0aDEgPSB3aWR0aCArIDE7XG4gIGxldCBwb2ludHMgPSBuZXcgVWludDhBcnJheSh3aWR0aDEgKiAoaGVpZ2h0ICsgMSkpO1xuICBsZXQgaSwgaiwgajA7XG4gIGNvbnN0IGxpbmVTaXplID0gd2lkdGggKyA3ICYgfjc7XG4gIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkobGluZVNpemUgKiBoZWlnaHQpLFxuICAgIHBvcyA9IDA7XG4gIGZvciAoY29uc3QgZWxlbSBvZiBpbWdEYXRhLmRhdGEpIHtcbiAgICBsZXQgbWFzayA9IDEyODtcbiAgICB3aGlsZSAobWFzayA+IDApIHtcbiAgICAgIGRhdGFbcG9zKytdID0gZWxlbSAmIG1hc2sgPyAwIDogMjU1O1xuICAgICAgbWFzayA+Pj0gMTtcbiAgICB9XG4gIH1cbiAgbGV0IGNvdW50ID0gMDtcbiAgcG9zID0gMDtcbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1swXSA9IDE7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgIGlmIChkYXRhW3Bvc10gIT09IGRhdGFbcG9zICsgMV0pIHtcbiAgICAgIHBvaW50c1tqXSA9IGRhdGFbcG9zXSA/IDIgOiAxO1xuICAgICAgKytjb3VudDtcbiAgICB9XG4gICAgcG9zKys7XG4gIH1cbiAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuICAgIHBvaW50c1tqXSA9IDI7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGkgPSAxOyBpIDwgaGVpZ2h0OyBpKyspIHtcbiAgICBwb3MgPSBpICogbGluZVNpemU7XG4gICAgajAgPSBpICogd2lkdGgxO1xuICAgIGlmIChkYXRhW3BvcyAtIGxpbmVTaXplXSAhPT0gZGF0YVtwb3NdKSB7XG4gICAgICBwb2ludHNbajBdID0gZGF0YVtwb3NdID8gMSA6IDg7XG4gICAgICArK2NvdW50O1xuICAgIH1cbiAgICBsZXQgc3VtID0gKGRhdGFbcG9zXSA/IDQgOiAwKSArIChkYXRhW3BvcyAtIGxpbmVTaXplXSA/IDggOiAwKTtcbiAgICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgICAgc3VtID0gKHN1bSA+PiAyKSArIChkYXRhW3BvcyArIDFdID8gNCA6IDApICsgKGRhdGFbcG9zIC0gbGluZVNpemUgKyAxXSA/IDggOiAwKTtcbiAgICAgIGlmIChQT0lOVF9UWVBFU1tzdW1dKSB7XG4gICAgICAgIHBvaW50c1tqMCArIGpdID0gUE9JTlRfVFlQRVNbc3VtXTtcbiAgICAgICAgKytjb3VudDtcbiAgICAgIH1cbiAgICAgIHBvcysrO1xuICAgIH1cbiAgICBpZiAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gIT09IGRhdGFbcG9zXSkge1xuICAgICAgcG9pbnRzW2owICsgal0gPSBkYXRhW3Bvc10gPyAyIDogNDtcbiAgICAgICsrY291bnQ7XG4gICAgfVxuICAgIGlmIChjb3VudCA+IFBPSU5UX1RPX1BST0NFU1NfTElNSVQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBwb3MgPSBsaW5lU2l6ZSAqIChoZWlnaHQgLSAxKTtcbiAgajAgPSBpICogd2lkdGgxO1xuICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG4gICAgcG9pbnRzW2owXSA9IDg7XG4gICAgKytjb3VudDtcbiAgfVxuICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuICAgIGlmIChkYXRhW3Bvc10gIT09IGRhdGFbcG9zICsgMV0pIHtcbiAgICAgIHBvaW50c1tqMCArIGpdID0gZGF0YVtwb3NdID8gNCA6IDg7XG4gICAgICArK2NvdW50O1xuICAgIH1cbiAgICBwb3MrKztcbiAgfVxuICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG4gICAgcG9pbnRzW2owICsgal0gPSA0O1xuICAgICsrY291bnQ7XG4gIH1cbiAgaWYgKGNvdW50ID4gUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHN0ZXBzID0gbmV3IEludDMyQXJyYXkoWzAsIHdpZHRoMSwgLTEsIDAsIC13aWR0aDEsIDAsIDAsIDAsIDFdKTtcbiAgY29uc3QgcGF0aCA9IG5ldyBQYXRoMkQoKTtcbiAgZm9yIChpID0gMDsgY291bnQgJiYgaSA8PSBoZWlnaHQ7IGkrKykge1xuICAgIGxldCBwID0gaSAqIHdpZHRoMTtcbiAgICBjb25zdCBlbmQgPSBwICsgd2lkdGg7XG4gICAgd2hpbGUgKHAgPCBlbmQgJiYgIXBvaW50c1twXSkge1xuICAgICAgcCsrO1xuICAgIH1cbiAgICBpZiAocCA9PT0gZW5kKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcGF0aC5tb3ZlVG8ocCAlIHdpZHRoMSwgaSk7XG4gICAgY29uc3QgcDAgPSBwO1xuICAgIGxldCB0eXBlID0gcG9pbnRzW3BdO1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwc1t0eXBlXTtcbiAgICAgIGRvIHtcbiAgICAgICAgcCArPSBzdGVwO1xuICAgICAgfSB3aGlsZSAoIXBvaW50c1twXSk7XG4gICAgICBjb25zdCBwcCA9IHBvaW50c1twXTtcbiAgICAgIGlmIChwcCAhPT0gNSAmJiBwcCAhPT0gMTApIHtcbiAgICAgICAgdHlwZSA9IHBwO1xuICAgICAgICBwb2ludHNbcF0gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZSA9IHBwICYgMHgzMyAqIHR5cGUgPj4gNDtcbiAgICAgICAgcG9pbnRzW3BdICY9IHR5cGUgPj4gMiB8IHR5cGUgPDwgMjtcbiAgICAgIH1cbiAgICAgIHBhdGgubGluZVRvKHAgJSB3aWR0aDEsIHAgLyB3aWR0aDEgfCAwKTtcbiAgICAgIGlmICghcG9pbnRzW3BdKSB7XG4gICAgICAgIC0tY291bnQ7XG4gICAgICB9XG4gICAgfSB3aGlsZSAocDAgIT09IHApO1xuICAgIC0taTtcbiAgfVxuICBkYXRhID0gbnVsbDtcbiAgcG9pbnRzID0gbnVsbDtcbiAgY29uc3QgZHJhd091dGxpbmUgPSBmdW5jdGlvbiAoYykge1xuICAgIGMuc2F2ZSgpO1xuICAgIGMuc2NhbGUoMSAvIHdpZHRoLCAtMSAvIGhlaWdodCk7XG4gICAgYy50cmFuc2xhdGUoMCwgLWhlaWdodCk7XG4gICAgYy5maWxsKHBhdGgpO1xuICAgIGMuYmVnaW5QYXRoKCk7XG4gICAgYy5yZXN0b3JlKCk7XG4gIH07XG4gIHJldHVybiBkcmF3T3V0bGluZTtcbn1cbmNsYXNzIENhbnZhc0V4dHJhU3RhdGUge1xuICBjb25zdHJ1Y3Rvcih3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdGhpcy5hbHBoYUlzU2hhcGUgPSBmYWxzZTtcbiAgICB0aGlzLmZvbnRTaXplID0gMDtcbiAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxO1xuICAgIHRoaXMudGV4dE1hdHJpeCA9IElERU5USVRZX01BVFJJWDtcbiAgICB0aGlzLnRleHRNYXRyaXhTY2FsZSA9IDE7XG4gICAgdGhpcy5mb250TWF0cml4ID0gRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgdGhpcy5sZWFkaW5nID0gMDtcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gICAgdGhpcy5saW5lWCA9IDA7XG4gICAgdGhpcy5saW5lWSA9IDA7XG4gICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7XG4gICAgdGhpcy53b3JkU3BhY2luZyA9IDA7XG4gICAgdGhpcy50ZXh0SFNjYWxlID0gMTtcbiAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGUuRklMTDtcbiAgICB0aGlzLnRleHRSaXNlID0gMDtcbiAgICB0aGlzLmZpbGxDb2xvciA9IFwiIzAwMDAwMFwiO1xuICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBcIiMwMDAwMDBcIjtcbiAgICB0aGlzLnBhdHRlcm5GaWxsID0gZmFsc2U7XG4gICAgdGhpcy5maWxsQWxwaGEgPSAxO1xuICAgIHRoaXMuc3Ryb2tlQWxwaGEgPSAxO1xuICAgIHRoaXMubGluZVdpZHRoID0gMTtcbiAgICB0aGlzLmFjdGl2ZVNNYXNrID0gbnVsbDtcbiAgICB0aGlzLnRyYW5zZmVyTWFwcyA9IFwibm9uZVwiO1xuICAgIHRoaXMuc3RhcnROZXdQYXRoQW5kQ2xpcEJveChbMCwgMCwgd2lkdGgsIGhlaWdodF0pO1xuICB9XG4gIGNsb25lKCkge1xuICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICBjbG9uZS5jbGlwQm94ID0gdGhpcy5jbGlwQm94LnNsaWNlKCk7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG4gIHNldEN1cnJlbnRQb2ludCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9XG4gIHVwZGF0ZVBhdGhNaW5NYXgodHJhbnNmb3JtLCB4LCB5KSB7XG4gICAgW3gsIHldID0gVXRpbC5hcHBseVRyYW5zZm9ybShbeCwgeV0sIHRyYW5zZm9ybSk7XG4gICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCB4KTtcbiAgICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLm1pblksIHkpO1xuICAgIHRoaXMubWF4WCA9IE1hdGgubWF4KHRoaXMubWF4WCwgeCk7XG4gICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCB5KTtcbiAgfVxuICB1cGRhdGVSZWN0TWluTWF4KHRyYW5zZm9ybSwgcmVjdCkge1xuICAgIGNvbnN0IHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShyZWN0LCB0cmFuc2Zvcm0pO1xuICAgIGNvbnN0IHAyID0gVXRpbC5hcHBseVRyYW5zZm9ybShyZWN0LnNsaWNlKDIpLCB0cmFuc2Zvcm0pO1xuICAgIGNvbnN0IHAzID0gVXRpbC5hcHBseVRyYW5zZm9ybShbcmVjdFswXSwgcmVjdFszXV0sIHRyYW5zZm9ybSk7XG4gICAgY29uc3QgcDQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyZWN0WzJdLCByZWN0WzFdXSwgdHJhbnNmb3JtKTtcbiAgICB0aGlzLm1pblggPSBNYXRoLm1pbih0aGlzLm1pblgsIHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKTtcbiAgICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLm1pblksIHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKTtcbiAgICB0aGlzLm1heFggPSBNYXRoLm1heCh0aGlzLm1heFgsIHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKTtcbiAgICB0aGlzLm1heFkgPSBNYXRoLm1heCh0aGlzLm1heFksIHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKTtcbiAgfVxuICB1cGRhdGVTY2FsaW5nUGF0aE1pbk1heCh0cmFuc2Zvcm0sIG1pbk1heCkge1xuICAgIFV0aWwuc2NhbGVNaW5NYXgodHJhbnNmb3JtLCBtaW5NYXgpO1xuICAgIHRoaXMubWluWCA9IE1hdGgubWluKHRoaXMubWluWCwgbWluTWF4WzBdKTtcbiAgICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLm1pblksIG1pbk1heFsxXSk7XG4gICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCBtaW5NYXhbMl0pO1xuICAgIHRoaXMubWF4WSA9IE1hdGgubWF4KHRoaXMubWF4WSwgbWluTWF4WzNdKTtcbiAgfVxuICB1cGRhdGVDdXJ2ZVBhdGhNaW5NYXgodHJhbnNmb3JtLCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIG1pbk1heCkge1xuICAgIGNvbnN0IGJveCA9IFV0aWwuYmV6aWVyQm91bmRpbmdCb3goeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCBtaW5NYXgpO1xuICAgIGlmIChtaW5NYXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVSZWN0TWluTWF4KHRyYW5zZm9ybSwgYm94KTtcbiAgfVxuICBnZXRQYXRoQm91bmRpbmdCb3gocGF0aFR5cGUgPSBQYXRoVHlwZS5GSUxMLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgY29uc3QgYm94ID0gW3RoaXMubWluWCwgdGhpcy5taW5ZLCB0aGlzLm1heFgsIHRoaXMubWF4WV07XG4gICAgaWYgKHBhdGhUeXBlID09PSBQYXRoVHlwZS5TVFJPS0UpIHtcbiAgICAgIGlmICghdHJhbnNmb3JtKSB7XG4gICAgICAgIHVucmVhY2hhYmxlKFwiU3Ryb2tlIGJvdW5kaW5nIGJveCBtdXN0IGluY2x1ZGUgdHJhbnNmb3JtLlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0cmFuc2Zvcm0pO1xuICAgICAgY29uc3QgeFN0cm9rZVBhZCA9IHNjYWxlWzBdICogdGhpcy5saW5lV2lkdGggLyAyO1xuICAgICAgY29uc3QgeVN0cm9rZVBhZCA9IHNjYWxlWzFdICogdGhpcy5saW5lV2lkdGggLyAyO1xuICAgICAgYm94WzBdIC09IHhTdHJva2VQYWQ7XG4gICAgICBib3hbMV0gLT0geVN0cm9rZVBhZDtcbiAgICAgIGJveFsyXSArPSB4U3Ryb2tlUGFkO1xuICAgICAgYm94WzNdICs9IHlTdHJva2VQYWQ7XG4gICAgfVxuICAgIHJldHVybiBib3g7XG4gIH1cbiAgdXBkYXRlQ2xpcEZyb21QYXRoKCkge1xuICAgIGNvbnN0IGludGVyc2VjdCA9IFV0aWwuaW50ZXJzZWN0KHRoaXMuY2xpcEJveCwgdGhpcy5nZXRQYXRoQm91bmRpbmdCb3goKSk7XG4gICAgdGhpcy5zdGFydE5ld1BhdGhBbmRDbGlwQm94KGludGVyc2VjdCB8fCBbMCwgMCwgMCwgMF0pO1xuICB9XG4gIGlzRW1wdHlDbGlwKCkge1xuICAgIHJldHVybiB0aGlzLm1pblggPT09IEluZmluaXR5O1xuICB9XG4gIHN0YXJ0TmV3UGF0aEFuZENsaXBCb3goYm94KSB7XG4gICAgdGhpcy5jbGlwQm94ID0gYm94O1xuICAgIHRoaXMubWluWCA9IEluZmluaXR5O1xuICAgIHRoaXMubWluWSA9IEluZmluaXR5O1xuICAgIHRoaXMubWF4WCA9IDA7XG4gICAgdGhpcy5tYXhZID0gMDtcbiAgfVxuICBnZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KHBhdGhUeXBlID0gUGF0aFR5cGUuRklMTCwgdHJhbnNmb3JtID0gbnVsbCkge1xuICAgIHJldHVybiBVdGlsLmludGVyc2VjdCh0aGlzLmNsaXBCb3gsIHRoaXMuZ2V0UGF0aEJvdW5kaW5nQm94KHBhdGhUeXBlLCB0cmFuc2Zvcm0pKTtcbiAgfVxufVxuZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VEYXRhKGN0eCwgaW1nRGF0YSkge1xuICBpZiAodHlwZW9mIEltYWdlRGF0YSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpbWdEYXRhIGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7XG4gICAgY3R4LnB1dEltYWdlRGF0YShpbWdEYXRhLCAwLCAwKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQsXG4gICAgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICBjb25zdCBwYXJ0aWFsQ2h1bmtIZWlnaHQgPSBoZWlnaHQgJSBGVUxMX0NIVU5LX0hFSUdIVDtcbiAgY29uc3QgZnVsbENodW5rcyA9IChoZWlnaHQgLSBwYXJ0aWFsQ2h1bmtIZWlnaHQpIC8gRlVMTF9DSFVOS19IRUlHSFQ7XG4gIGNvbnN0IHRvdGFsQ2h1bmtzID0gcGFydGlhbENodW5rSGVpZ2h0ID09PSAwID8gZnVsbENodW5rcyA6IGZ1bGxDaHVua3MgKyAxO1xuICBjb25zdCBjaHVua0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBGVUxMX0NIVU5LX0hFSUdIVCk7XG4gIGxldCBzcmNQb3MgPSAwLFxuICAgIGRlc3RQb3M7XG4gIGNvbnN0IHNyYyA9IGltZ0RhdGEuZGF0YTtcbiAgY29uc3QgZGVzdCA9IGNodW5rSW1nRGF0YS5kYXRhO1xuICBsZXQgaSwgaiwgdGhpc0NodW5rSGVpZ2h0LCBlbGVtc0luVGhpc0NodW5rO1xuICBpZiAoaW1nRGF0YS5raW5kID09PSB1dGlsX0ltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCkge1xuICAgIGNvbnN0IHNyY0xlbmd0aCA9IHNyYy5ieXRlTGVuZ3RoO1xuICAgIGNvbnN0IGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlciwgMCwgZGVzdC5ieXRlTGVuZ3RoID4+IDIpO1xuICAgIGNvbnN0IGRlc3QzMkRhdGFMZW5ndGggPSBkZXN0MzIubGVuZ3RoO1xuICAgIGNvbnN0IGZ1bGxTcmNEaWZmID0gd2lkdGggKyA3ID4+IDM7XG4gICAgY29uc3Qgd2hpdGUgPSAweGZmZmZmZmZmO1xuICAgIGNvbnN0IGJsYWNrID0gdXRpbF9GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4ZmYwMDAwMDAgOiAweDAwMDAwMGZmO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7XG4gICAgICB0aGlzQ2h1bmtIZWlnaHQgPSBpIDwgZnVsbENodW5rcyA/IEZVTExfQ0hVTktfSEVJR0hUIDogcGFydGlhbENodW5rSGVpZ2h0O1xuICAgICAgZGVzdFBvcyA9IDA7XG4gICAgICBmb3IgKGogPSAwOyBqIDwgdGhpc0NodW5rSGVpZ2h0OyBqKyspIHtcbiAgICAgICAgY29uc3Qgc3JjRGlmZiA9IHNyY0xlbmd0aCAtIHNyY1BvcztcbiAgICAgICAgbGV0IGsgPSAwO1xuICAgICAgICBjb25zdCBrRW5kID0gc3JjRGlmZiA+IGZ1bGxTcmNEaWZmID8gd2lkdGggOiBzcmNEaWZmICogOCAtIDc7XG4gICAgICAgIGNvbnN0IGtFbmRVbnJvbGxlZCA9IGtFbmQgJiB+NztcbiAgICAgICAgbGV0IG1hc2sgPSAwO1xuICAgICAgICBsZXQgc3JjQnl0ZSA9IDA7XG4gICAgICAgIGZvciAoOyBrIDwga0VuZFVucm9sbGVkOyBrICs9IDgpIHtcbiAgICAgICAgICBzcmNCeXRlID0gc3JjW3NyY1BvcysrXTtcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxMjggPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDY0ID8gd2hpdGUgOiBibGFjaztcbiAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAzMiA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMTYgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDggPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDQgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDIgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDEgPyB3aGl0ZSA6IGJsYWNrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBrIDwga0VuZDsgaysrKSB7XG4gICAgICAgICAgaWYgKG1hc2sgPT09IDApIHtcbiAgICAgICAgICAgIHNyY0J5dGUgPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICAgICAgbWFzayA9IDEyODtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgbWFzayA/IHdoaXRlIDogYmxhY2s7XG4gICAgICAgICAgbWFzayA+Pj0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGRlc3RQb3MgPCBkZXN0MzJEYXRhTGVuZ3RoKSB7XG4gICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gMDtcbiAgICAgIH1cbiAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpbWdEYXRhLmtpbmQgPT09IHV0aWxfSW1hZ2VLaW5kLlJHQkFfMzJCUFApIHtcbiAgICBqID0gMDtcbiAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiBGVUxMX0NIVU5LX0hFSUdIVCAqIDQ7XG4gICAgZm9yIChpID0gMDsgaSA8IGZ1bGxDaHVua3M7IGkrKykge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY1Bvcywgc3JjUG9zICsgZWxlbXNJblRoaXNDaHVuaykpO1xuICAgICAgc3JjUG9zICs9IGVsZW1zSW5UaGlzQ2h1bms7XG4gICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaik7XG4gICAgICBqICs9IEZVTExfQ0hVTktfSEVJR0hUO1xuICAgIH1cbiAgICBpZiAoaSA8IHRvdGFsQ2h1bmtzKSB7XG4gICAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiBwYXJ0aWFsQ2h1bmtIZWlnaHQgKiA0O1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY1Bvcywgc3JjUG9zICsgZWxlbXNJblRoaXNDaHVuaykpO1xuICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGopO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpbWdEYXRhLmtpbmQgPT09IHV0aWxfSW1hZ2VLaW5kLlJHQl8yNEJQUCkge1xuICAgIHRoaXNDaHVua0hlaWdodCA9IEZVTExfQ0hVTktfSEVJR0hUO1xuICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHRoaXNDaHVua0hlaWdodDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykge1xuICAgICAgaWYgKGkgPj0gZnVsbENodW5rcykge1xuICAgICAgICB0aGlzQ2h1bmtIZWlnaHQgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQ7XG4gICAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHRoaXNDaHVua0hlaWdodDtcbiAgICAgIH1cbiAgICAgIGRlc3RQb3MgPSAwO1xuICAgICAgZm9yIChqID0gZWxlbXNJblRoaXNDaHVuazsgai0tOykge1xuICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSAyNTU7XG4gICAgICB9XG4gICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBiYWQgaW1hZ2Uga2luZDogJHtpbWdEYXRhLmtpbmR9YCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1dEJpbmFyeUltYWdlTWFzayhjdHgsIGltZ0RhdGEpIHtcbiAgaWYgKGltZ0RhdGEuYml0bWFwKSB7XG4gICAgY3R4LmRyYXdJbWFnZShpbWdEYXRhLmJpdG1hcCwgMCwgMCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0LFxuICAgIHdpZHRoID0gaW1nRGF0YS53aWR0aDtcbiAgY29uc3QgcGFydGlhbENodW5rSGVpZ2h0ID0gaGVpZ2h0ICUgRlVMTF9DSFVOS19IRUlHSFQ7XG4gIGNvbnN0IGZ1bGxDaHVua3MgPSAoaGVpZ2h0IC0gcGFydGlhbENodW5rSGVpZ2h0KSAvIEZVTExfQ0hVTktfSEVJR0hUO1xuICBjb25zdCB0b3RhbENodW5rcyA9IHBhcnRpYWxDaHVua0hlaWdodCA9PT0gMCA/IGZ1bGxDaHVua3MgOiBmdWxsQ2h1bmtzICsgMTtcbiAgY29uc3QgY2h1bmtJbWdEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgRlVMTF9DSFVOS19IRUlHSFQpO1xuICBsZXQgc3JjUG9zID0gMDtcbiAgY29uc3Qgc3JjID0gaW1nRGF0YS5kYXRhO1xuICBjb25zdCBkZXN0ID0gY2h1bmtJbWdEYXRhLmRhdGE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykge1xuICAgIGNvbnN0IHRoaXNDaHVua0hlaWdodCA9IGkgPCBmdWxsQ2h1bmtzID8gRlVMTF9DSFVOS19IRUlHSFQgOiBwYXJ0aWFsQ2h1bmtIZWlnaHQ7XG4gICAgKHtcbiAgICAgIHNyY1Bvc1xuICAgIH0gPSBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQSh7XG4gICAgICBzcmMsXG4gICAgICBzcmNQb3MsXG4gICAgICBkZXN0LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXNDaHVua0hlaWdodCxcbiAgICAgIG5vbkJsYWNrQ29sb3I6IDBcbiAgICB9KSk7XG4gICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGkgKiBGVUxMX0NIVU5LX0hFSUdIVCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNvcHlDdHhTdGF0ZShzb3VyY2VDdHgsIGRlc3RDdHgpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IFtcInN0cm9rZVN0eWxlXCIsIFwiZmlsbFN0eWxlXCIsIFwiZmlsbFJ1bGVcIiwgXCJnbG9iYWxBbHBoYVwiLCBcImxpbmVXaWR0aFwiLCBcImxpbmVDYXBcIiwgXCJsaW5lSm9pblwiLCBcIm1pdGVyTGltaXRcIiwgXCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb25cIiwgXCJmb250XCIsIFwiZmlsdGVyXCJdO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBpZiAoc291cmNlQ3R4W3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0Q3R4W3Byb3BlcnR5XSA9IHNvdXJjZUN0eFtwcm9wZXJ0eV07XG4gICAgfVxuICB9XG4gIGlmIChzb3VyY2VDdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgIGRlc3RDdHguc2V0TGluZURhc2goc291cmNlQ3R4LmdldExpbmVEYXNoKCkpO1xuICAgIGRlc3RDdHgubGluZURhc2hPZmZzZXQgPSBzb3VyY2VDdHgubGluZURhc2hPZmZzZXQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc2V0Q3R4VG9EZWZhdWx0KGN0eCkge1xuICBjdHguc3Ryb2tlU3R5bGUgPSBjdHguZmlsbFN0eWxlID0gXCIjMDAwMDAwXCI7XG4gIGN0eC5maWxsUnVsZSA9IFwibm9uemVyb1wiO1xuICBjdHguZ2xvYmFsQWxwaGEgPSAxO1xuICBjdHgubGluZVdpZHRoID0gMTtcbiAgY3R4LmxpbmVDYXAgPSBcImJ1dHRcIjtcbiAgY3R4LmxpbmVKb2luID0gXCJtaXRlclwiO1xuICBjdHgubWl0ZXJMaW1pdCA9IDEwO1xuICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2Utb3ZlclwiO1xuICBjdHguZm9udCA9IFwiMTBweCBzYW5zLXNlcmlmXCI7XG4gIGlmIChjdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgIGN0eC5zZXRMaW5lRGFzaChbXSk7XG4gICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gMDtcbiAgfVxuICBpZiAoIWlzTm9kZUpTKSB7XG4gICAgY29uc3Qge1xuICAgICAgZmlsdGVyXG4gICAgfSA9IGN0eDtcbiAgICBpZiAoZmlsdGVyICE9PSBcIm5vbmVcIiAmJiBmaWx0ZXIgIT09IFwiXCIpIHtcbiAgICAgIGN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEltYWdlU21vb3RoaW5nRW5hYmxlZCh0cmFuc2Zvcm0sIGludGVycG9sYXRlKSB7XG4gIGlmIChpbnRlcnBvbGF0ZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHNjYWxlID0gVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0cmFuc2Zvcm0pO1xuICBzY2FsZVswXSA9IE1hdGguZnJvdW5kKHNjYWxlWzBdKTtcbiAgc2NhbGVbMV0gPSBNYXRoLmZyb3VuZChzY2FsZVsxXSk7XG4gIGNvbnN0IGFjdHVhbFNjYWxlID0gTWF0aC5mcm91bmQoKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAqIFBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyk7XG4gIHJldHVybiBzY2FsZVswXSA8PSBhY3R1YWxTY2FsZSAmJiBzY2FsZVsxXSA8PSBhY3R1YWxTY2FsZTtcbn1cbmNvbnN0IExJTkVfQ0FQX1NUWUxFUyA9IFtcImJ1dHRcIiwgXCJyb3VuZFwiLCBcInNxdWFyZVwiXTtcbmNvbnN0IExJTkVfSk9JTl9TVFlMRVMgPSBbXCJtaXRlclwiLCBcInJvdW5kXCIsIFwiYmV2ZWxcIl07XG5jb25zdCBOT1JNQUxfQ0xJUCA9IHt9O1xuY29uc3QgRU9fQ0xJUCA9IHt9O1xuY2xhc3MgQ2FudmFzR3JhcGhpY3Mge1xuICBjb25zdHJ1Y3RvcihjYW52YXNDdHgsIGNvbW1vbk9ianMsIG9ianMsIGNhbnZhc0ZhY3RvcnksIGZpbHRlckZhY3RvcnksIHtcbiAgICBvcHRpb25hbENvbnRlbnRDb25maWcsXG4gICAgbWFya2VkQ29udGVudFN0YWNrID0gbnVsbFxuICB9LCBhbm5vdGF0aW9uQ2FudmFzTWFwLCBwYWdlQ29sb3JzKSB7XG4gICAgdGhpcy5jdHggPSBjYW52YXNDdHg7XG4gICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSBmYWxzZTtcbiAgICB0aGlzLnJlcyA9IG51bGw7XG4gICAgdGhpcy54b2JqcyA9IG51bGw7XG4gICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2JqcztcbiAgICB0aGlzLm9ianMgPSBvYmpzO1xuICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7XG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gZmlsdGVyRmFjdG9yeTtcbiAgICB0aGlzLmdyb3VwU3RhY2sgPSBbXTtcbiAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gbnVsbDtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjayA9IFtdO1xuICAgIHRoaXMuZ3JvdXBMZXZlbCA9IDA7XG4gICAgdGhpcy5zbWFza1N0YWNrID0gW107XG4gICAgdGhpcy5zbWFza0NvdW50ZXIgPSAwO1xuICAgIHRoaXMudGVtcFNNYXNrID0gbnVsbDtcbiAgICB0aGlzLnN1c3BlbmRlZEN0eCA9IG51bGw7XG4gICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sgPSBtYXJrZWRDb250ZW50U3RhY2sgfHwgW107XG4gICAgdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcgPSBvcHRpb25hbENvbnRlbnRDb25maWc7XG4gICAgdGhpcy5jYWNoZWRDYW52YXNlcyA9IG5ldyBDYWNoZWRDYW52YXNlcyh0aGlzLmNhbnZhc0ZhY3RvcnkpO1xuICAgIHRoaXMuY2FjaGVkUGF0dGVybnMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzTWFwID0gYW5ub3RhdGlvbkNhbnZhc01hcDtcbiAgICB0aGlzLnZpZXdwb3J0U2NhbGUgPSAxO1xuICAgIHRoaXMub3V0cHV0U2NhbGVYID0gMTtcbiAgICB0aGlzLm91dHB1dFNjYWxlWSA9IDE7XG4gICAgdGhpcy5wYWdlQ29sb3JzID0gcGFnZUNvbG9ycztcbiAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nID0gWy0xLCAwXTtcbiAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgICB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwID0gbmV3IE1hcCgpO1xuICB9XG4gIGdldE9iamVjdChkYXRhLCBmYWxsYmFjayA9IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBkYXRhLnN0YXJ0c1dpdGgoXCJnX1wiKSA/IHRoaXMuY29tbW9uT2Jqcy5nZXQoZGF0YSkgOiB0aGlzLm9ianMuZ2V0KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH1cbiAgYmVnaW5EcmF3aW5nKHtcbiAgICB0cmFuc2Zvcm0sXG4gICAgdmlld3BvcnQsXG4gICAgdHJhbnNwYXJlbmN5ID0gZmFsc2UsXG4gICAgYmFja2dyb3VuZCA9IG51bGxcbiAgfSkge1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jdHguY2FudmFzLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQ7XG4gICAgY29uc3Qgc2F2ZWRGaWxsU3R5bGUgPSB0aGlzLmN0eC5maWxsU3R5bGU7XG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gYmFja2dyb3VuZCB8fCBcIiNmZmZmZmZcIjtcbiAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBzYXZlZEZpbGxTdHlsZTtcbiAgICBpZiAodHJhbnNwYXJlbmN5KSB7XG4gICAgICBjb25zdCB0cmFuc3BhcmVudENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwidHJhbnNwYXJlbnRcIiwgd2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmNvbXBvc2l0ZUN0eCA9IHRoaXMuY3R4O1xuICAgICAgdGhpcy50cmFuc3BhcmVudENhbnZhcyA9IHRyYW5zcGFyZW50Q2FudmFzLmNhbnZhcztcbiAgICAgIHRoaXMuY3R4ID0gdHJhbnNwYXJlbnRDYW52YXMuY29udGV4dDtcbiAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi5nZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY29tcG9zaXRlQ3R4KSk7XG4gICAgfVxuICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG4gICAgaWYgKHRyYW5zZm9ybSkge1xuICAgICAgdGhpcy5jdHgudHJhbnNmb3JtKC4uLnRyYW5zZm9ybSk7XG4gICAgICB0aGlzLm91dHB1dFNjYWxlWCA9IHRyYW5zZm9ybVswXTtcbiAgICAgIHRoaXMub3V0cHV0U2NhbGVZID0gdHJhbnNmb3JtWzBdO1xuICAgIH1cbiAgICB0aGlzLmN0eC50cmFuc2Zvcm0oLi4udmlld3BvcnQudHJhbnNmb3JtKTtcbiAgICB0aGlzLnZpZXdwb3J0U2NhbGUgPSB2aWV3cG9ydC5zY2FsZTtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY3R4KTtcbiAgfVxuICBleGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCwgZXhlY3V0aW9uU3RhcnRJZHgsIGNvbnRpbnVlQ2FsbGJhY2ssIHN0ZXBwZXIpIHtcbiAgICBjb25zdCBhcmdzQXJyYXkgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5O1xuICAgIGNvbnN0IGZuQXJyYXkgPSBvcGVyYXRvckxpc3QuZm5BcnJheTtcbiAgICBsZXQgaSA9IGV4ZWN1dGlvblN0YXJ0SWR4IHx8IDA7XG4gICAgY29uc3QgYXJnc0FycmF5TGVuID0gYXJnc0FycmF5Lmxlbmd0aDtcbiAgICBpZiAoYXJnc0FycmF5TGVuID09PSBpKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtPcGVyYXRpb25zID0gYXJnc0FycmF5TGVuIC0gaSA+IEVYRUNVVElPTl9TVEVQUyAmJiB0eXBlb2YgY29udGludWVDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiO1xuICAgIGNvbnN0IGVuZFRpbWUgPSBjaHVua09wZXJhdGlvbnMgPyBEYXRlLm5vdygpICsgRVhFQ1VUSU9OX1RJTUUgOiAwO1xuICAgIGxldCBzdGVwcyA9IDA7XG4gICAgY29uc3QgY29tbW9uT2JqcyA9IHRoaXMuY29tbW9uT2JqcztcbiAgICBjb25zdCBvYmpzID0gdGhpcy5vYmpzO1xuICAgIGxldCBmbklkO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoc3RlcHBlciAhPT0gdW5kZWZpbmVkICYmIGkgPT09IHN0ZXBwZXIubmV4dEJyZWFrUG9pbnQpIHtcbiAgICAgICAgc3RlcHBlci5icmVha0l0KGksIGNvbnRpbnVlQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICAgIGZuSWQgPSBmbkFycmF5W2ldO1xuICAgICAgaWYgKGZuSWQgIT09IE9QUy5kZXBlbmRlbmN5KSB7XG4gICAgICAgIHRoaXNbZm5JZF0uYXBwbHkodGhpcywgYXJnc0FycmF5W2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwT2JqSWQgb2YgYXJnc0FycmF5W2ldKSB7XG4gICAgICAgICAgY29uc3Qgb2Jqc1Bvb2wgPSBkZXBPYmpJZC5zdGFydHNXaXRoKFwiZ19cIikgPyBjb21tb25PYmpzIDogb2JqcztcbiAgICAgICAgICBpZiAoIW9ianNQb29sLmhhcyhkZXBPYmpJZCkpIHtcbiAgICAgICAgICAgIG9ianNQb29sLmdldChkZXBPYmpJZCwgY29udGludWVDYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICAgIGlmIChpID09PSBhcmdzQXJyYXlMZW4pIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgICBpZiAoY2h1bmtPcGVyYXRpb25zICYmICsrc3RlcHMgPiBFWEVDVVRJT05fU1RFUFMpIHtcbiAgICAgICAgaWYgKERhdGUubm93KCkgPiBlbmRUaW1lKSB7XG4gICAgICAgICAgY29udGludWVDYWxsYmFjaygpO1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIHN0ZXBzID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgI3Jlc3RvcmVJbml0aWFsU3RhdGUoKSB7XG4gICAgd2hpbGUgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggfHwgdGhpcy5pblNNYXNrTW9kZSkge1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfVxuICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICBpZiAodGhpcy50cmFuc3BhcmVudENhbnZhcykge1xuICAgICAgdGhpcy5jdHggPSB0aGlzLmNvbXBvc2l0ZUN0eDtcbiAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLnRyYW5zcGFyZW50Q2FudmFzLCAwLCAwKTtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIHRoaXMudHJhbnNwYXJlbnRDYW52YXMgPSBudWxsO1xuICAgIH1cbiAgfVxuICBlbmREcmF3aW5nKCkge1xuICAgIHRoaXMuI3Jlc3RvcmVJbml0aWFsU3RhdGUoKTtcbiAgICB0aGlzLmNhY2hlZENhbnZhc2VzLmNsZWFyKCk7XG4gICAgdGhpcy5jYWNoZWRQYXR0ZXJucy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgY2FjaGUgb2YgdGhpcy5fY2FjaGVkQml0bWFwc01hcC52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCBjYW52YXMgb2YgY2FjaGUudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjYW52YXMgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkge1xuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy5oZWlnaHQgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLmNsZWFyKCk7XG4gICAgdGhpcy4jZHJhd0ZpbHRlcigpO1xuICB9XG4gICNkcmF3RmlsdGVyKCkge1xuICAgIGlmICh0aGlzLnBhZ2VDb2xvcnMpIHtcbiAgICAgIGNvbnN0IGhjbUZpbHRlcklkID0gdGhpcy5maWx0ZXJGYWN0b3J5LmFkZEhDTUZpbHRlcih0aGlzLnBhZ2VDb2xvcnMuZm9yZWdyb3VuZCwgdGhpcy5wYWdlQ29sb3JzLmJhY2tncm91bmQpO1xuICAgICAgaWYgKGhjbUZpbHRlcklkICE9PSBcIm5vbmVcIikge1xuICAgICAgICBjb25zdCBzYXZlZEZpbHRlciA9IHRoaXMuY3R4LmZpbHRlcjtcbiAgICAgICAgdGhpcy5jdHguZmlsdGVyID0gaGNtRmlsdGVySWQ7XG4gICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLmN0eC5jYW52YXMsIDAsIDApO1xuICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSBzYXZlZEZpbHRlcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX3NjYWxlSW1hZ2UoaW1nLCBpbnZlcnNlVHJhbnNmb3JtKSB7XG4gICAgY29uc3Qgd2lkdGggPSBpbWcud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW1nLmhlaWdodDtcbiAgICBsZXQgd2lkdGhTY2FsZSA9IE1hdGgubWF4KE1hdGguaHlwb3QoaW52ZXJzZVRyYW5zZm9ybVswXSwgaW52ZXJzZVRyYW5zZm9ybVsxXSksIDEpO1xuICAgIGxldCBoZWlnaHRTY2FsZSA9IE1hdGgubWF4KE1hdGguaHlwb3QoaW52ZXJzZVRyYW5zZm9ybVsyXSwgaW52ZXJzZVRyYW5zZm9ybVszXSksIDEpO1xuICAgIGxldCBwYWludFdpZHRoID0gd2lkdGgsXG4gICAgICBwYWludEhlaWdodCA9IGhlaWdodDtcbiAgICBsZXQgdG1wQ2FudmFzSWQgPSBcInByZXNjYWxlMVwiO1xuICAgIGxldCB0bXBDYW52YXMsIHRtcEN0eDtcbiAgICB3aGlsZSAod2lkdGhTY2FsZSA+IDIgJiYgcGFpbnRXaWR0aCA+IDEgfHwgaGVpZ2h0U2NhbGUgPiAyICYmIHBhaW50SGVpZ2h0ID4gMSkge1xuICAgICAgbGV0IG5ld1dpZHRoID0gcGFpbnRXaWR0aCxcbiAgICAgICAgbmV3SGVpZ2h0ID0gcGFpbnRIZWlnaHQ7XG4gICAgICBpZiAod2lkdGhTY2FsZSA+IDIgJiYgcGFpbnRXaWR0aCA+IDEpIHtcbiAgICAgICAgbmV3V2lkdGggPSBwYWludFdpZHRoID49IDE2Mzg0ID8gTWF0aC5mbG9vcihwYWludFdpZHRoIC8gMikgLSAxIHx8IDEgOiBNYXRoLmNlaWwocGFpbnRXaWR0aCAvIDIpO1xuICAgICAgICB3aWR0aFNjYWxlIC89IHBhaW50V2lkdGggLyBuZXdXaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChoZWlnaHRTY2FsZSA+IDIgJiYgcGFpbnRIZWlnaHQgPiAxKSB7XG4gICAgICAgIG5ld0hlaWdodCA9IHBhaW50SGVpZ2h0ID49IDE2Mzg0ID8gTWF0aC5mbG9vcihwYWludEhlaWdodCAvIDIpIC0gMSB8fCAxIDogTWF0aC5jZWlsKHBhaW50SGVpZ2h0KSAvIDI7XG4gICAgICAgIGhlaWdodFNjYWxlIC89IHBhaW50SGVpZ2h0IC8gbmV3SGVpZ2h0O1xuICAgICAgfVxuICAgICAgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXModG1wQ2FudmFzSWQsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG4gICAgICB0bXBDdHguY2xlYXJSZWN0KDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgdG1wQ3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIHBhaW50V2lkdGgsIHBhaW50SGVpZ2h0LCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgICAgIGltZyA9IHRtcENhbnZhcy5jYW52YXM7XG4gICAgICBwYWludFdpZHRoID0gbmV3V2lkdGg7XG4gICAgICBwYWludEhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgIHRtcENhbnZhc0lkID0gdG1wQ2FudmFzSWQgPT09IFwicHJlc2NhbGUxXCIgPyBcInByZXNjYWxlMlwiIDogXCJwcmVzY2FsZTFcIjtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGltZyxcbiAgICAgIHBhaW50V2lkdGgsXG4gICAgICBwYWludEhlaWdodFxuICAgIH07XG4gIH1cbiAgX2NyZWF0ZU1hc2tDYW52YXMoaW1nKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gaW1nO1xuICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG4gICAgY29uc3QgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDtcbiAgICBjb25zdCBjdXJyZW50VHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybShjdHgpO1xuICAgIGxldCBjYWNoZSwgY2FjaGVLZXksIHNjYWxlZCwgbWFza0NhbnZhcztcbiAgICBpZiAoKGltZy5iaXRtYXAgfHwgaW1nLmRhdGEpICYmIGltZy5jb3VudCA+IDEpIHtcbiAgICAgIGNvbnN0IG1haW5LZXkgPSBpbWcuYml0bWFwIHx8IGltZy5kYXRhLmJ1ZmZlcjtcbiAgICAgIGNhY2hlS2V5ID0gSlNPTi5zdHJpbmdpZnkoaXNQYXR0ZXJuRmlsbCA/IGN1cnJlbnRUcmFuc2Zvcm0gOiBbY3VycmVudFRyYW5zZm9ybS5zbGljZSgwLCA0KSwgZmlsbENvbG9yXSk7XG4gICAgICBjYWNoZSA9IHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAuZ2V0KG1haW5LZXkpO1xuICAgICAgaWYgKCFjYWNoZSkge1xuICAgICAgICBjYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fY2FjaGVkQml0bWFwc01hcC5zZXQobWFpbktleSwgY2FjaGUpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2FjaGVkSW1hZ2UgPSBjYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgaWYgKGNhY2hlZEltYWdlICYmICFpc1BhdHRlcm5GaWxsKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFggPSBNYXRoLnJvdW5kKE1hdGgubWluKGN1cnJlbnRUcmFuc2Zvcm1bMF0sIGN1cnJlbnRUcmFuc2Zvcm1bMl0pICsgY3VycmVudFRyYW5zZm9ybVs0XSk7XG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBNYXRoLnJvdW5kKE1hdGgubWluKGN1cnJlbnRUcmFuc2Zvcm1bMV0sIGN1cnJlbnRUcmFuc2Zvcm1bM10pICsgY3VycmVudFRyYW5zZm9ybVs1XSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2FudmFzOiBjYWNoZWRJbWFnZSxcbiAgICAgICAgICBvZmZzZXRYLFxuICAgICAgICAgIG9mZnNldFlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHNjYWxlZCA9IGNhY2hlZEltYWdlO1xuICAgIH1cbiAgICBpZiAoIXNjYWxlZCkge1xuICAgICAgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwibWFza0NhbnZhc1wiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHB1dEJpbmFyeUltYWdlTWFzayhtYXNrQ2FudmFzLmNvbnRleHQsIGltZyk7XG4gICAgfVxuICAgIGxldCBtYXNrVG9DYW52YXMgPSBVdGlsLnRyYW5zZm9ybShjdXJyZW50VHJhbnNmb3JtLCBbMSAvIHdpZHRoLCAwLCAwLCAtMSAvIGhlaWdodCwgMCwgMF0pO1xuICAgIG1hc2tUb0NhbnZhcyA9IFV0aWwudHJhbnNmb3JtKG1hc2tUb0NhbnZhcywgWzEsIDAsIDAsIDEsIDAsIC1oZWlnaHRdKTtcbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBVdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCB3aWR0aCwgaGVpZ2h0XSwgbWFza1RvQ2FudmFzKTtcbiAgICBjb25zdCBkcmF3bldpZHRoID0gTWF0aC5yb3VuZChtYXhYIC0gbWluWCkgfHwgMTtcbiAgICBjb25zdCBkcmF3bkhlaWdodCA9IE1hdGgucm91bmQobWF4WSAtIG1pblkpIHx8IDE7XG4gICAgY29uc3QgZmlsbENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiZmlsbENhbnZhc1wiLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodCk7XG4gICAgY29uc3QgZmlsbEN0eCA9IGZpbGxDYW52YXMuY29udGV4dDtcbiAgICBjb25zdCBvZmZzZXRYID0gbWluWDtcbiAgICBjb25zdCBvZmZzZXRZID0gbWluWTtcbiAgICBmaWxsQ3R4LnRyYW5zbGF0ZSgtb2Zmc2V0WCwgLW9mZnNldFkpO1xuICAgIGZpbGxDdHgudHJhbnNmb3JtKC4uLm1hc2tUb0NhbnZhcyk7XG4gICAgaWYgKCFzY2FsZWQpIHtcbiAgICAgIHNjYWxlZCA9IHRoaXMuX3NjYWxlSW1hZ2UobWFza0NhbnZhcy5jYW52YXMsIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGZpbGxDdHgpKTtcbiAgICAgIHNjYWxlZCA9IHNjYWxlZC5pbWc7XG4gICAgICBpZiAoY2FjaGUgJiYgaXNQYXR0ZXJuRmlsbCkge1xuICAgICAgICBjYWNoZS5zZXQoY2FjaGVLZXksIHNjYWxlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZpbGxDdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZ2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGdldEN1cnJlbnRUcmFuc2Zvcm0oZmlsbEN0eCksIGltZy5pbnRlcnBvbGF0ZSk7XG4gICAgZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKGZpbGxDdHgsIHNjYWxlZCwgMCwgMCwgc2NhbGVkLndpZHRoLCBzY2FsZWQuaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBmaWxsQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLWluXCI7XG4gICAgY29uc3QgaW52ZXJzZSA9IFV0aWwudHJhbnNmb3JtKGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGZpbGxDdHgpLCBbMSwgMCwgMCwgMSwgLW9mZnNldFgsIC1vZmZzZXRZXSk7XG4gICAgZmlsbEN0eC5maWxsU3R5bGUgPSBpc1BhdHRlcm5GaWxsID8gZmlsbENvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzLCBpbnZlcnNlLCBQYXRoVHlwZS5GSUxMKSA6IGZpbGxDb2xvcjtcbiAgICBmaWxsQ3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmIChjYWNoZSAmJiAhaXNQYXR0ZXJuRmlsbCkge1xuICAgICAgdGhpcy5jYWNoZWRDYW52YXNlcy5kZWxldGUoXCJmaWxsQ2FudmFzXCIpO1xuICAgICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBmaWxsQ2FudmFzLmNhbnZhcyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjYW52YXM6IGZpbGxDYW52YXMuY2FudmFzLFxuICAgICAgb2Zmc2V0WDogTWF0aC5yb3VuZChvZmZzZXRYKSxcbiAgICAgIG9mZnNldFk6IE1hdGgucm91bmQob2Zmc2V0WSlcbiAgICB9O1xuICB9XG4gIHNldExpbmVXaWR0aCh3aWR0aCkge1xuICAgIGlmICh3aWR0aCAhPT0gdGhpcy5jdXJyZW50LmxpbmVXaWR0aCkge1xuICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5jdHgubGluZVdpZHRoID0gd2lkdGg7XG4gIH1cbiAgc2V0TGluZUNhcChzdHlsZSkge1xuICAgIHRoaXMuY3R4LmxpbmVDYXAgPSBMSU5FX0NBUF9TVFlMRVNbc3R5bGVdO1xuICB9XG4gIHNldExpbmVKb2luKHN0eWxlKSB7XG4gICAgdGhpcy5jdHgubGluZUpvaW4gPSBMSU5FX0pPSU5fU1RZTEVTW3N0eWxlXTtcbiAgfVxuICBzZXRNaXRlckxpbWl0KGxpbWl0KSB7XG4gICAgdGhpcy5jdHgubWl0ZXJMaW1pdCA9IGxpbWl0O1xuICB9XG4gIHNldERhc2goZGFzaEFycmF5LCBkYXNoUGhhc2UpIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBpZiAoY3R4LnNldExpbmVEYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGN0eC5zZXRMaW5lRGFzaChkYXNoQXJyYXkpO1xuICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gZGFzaFBoYXNlO1xuICAgIH1cbiAgfVxuICBzZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KSB7fVxuICBzZXRGbGF0bmVzcyhmbGF0bmVzcykge31cbiAgc2V0R1N0YXRlKHN0YXRlcykge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHN0YXRlcykge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcIkxXXCI6XG4gICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgodmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTENcIjpcbiAgICAgICAgICB0aGlzLnNldExpbmVDYXAodmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgICB0aGlzLnNldExpbmVKb2luKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk1MXCI6XG4gICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkRcIjpcbiAgICAgICAgICB0aGlzLnNldERhc2godmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlJJXCI6XG4gICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQodmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRkxcIjpcbiAgICAgICAgICB0aGlzLnNldEZsYXRuZXNzKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICB0aGlzLnNldEZvbnQodmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkNBXCI6XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhID0gdmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQWxwaGEgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxBbHBoYSA9IHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQk1cIjpcbiAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSB2YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlNNYXNrXCI6XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gdmFsdWUgPyB0aGlzLnRlbXBTTWFzayA6IG51bGw7XG4gICAgICAgICAgdGhpcy50ZW1wU01hc2sgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY2hlY2tTTWFza1N0YXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJUUlwiOlxuICAgICAgICAgIHRoaXMuY3R4LmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPSB0aGlzLmZpbHRlckZhY3RvcnkuYWRkRmlsdGVyKHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0IGluU01hc2tNb2RlKCkge1xuICAgIHJldHVybiAhIXRoaXMuc3VzcGVuZGVkQ3R4O1xuICB9XG4gIGNoZWNrU01hc2tTdGF0ZSgpIHtcbiAgICBjb25zdCBpblNNYXNrTW9kZSA9IHRoaXMuaW5TTWFza01vZGU7XG4gICAgaWYgKHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayAmJiAhaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMuYmVnaW5TTWFza01vZGUoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgJiYgaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMuZW5kU01hc2tNb2RlKCk7XG4gICAgfVxuICB9XG4gIGJlZ2luU01hc2tNb2RlKCkge1xuICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiZWdpblNNYXNrTW9kZSBjYWxsZWQgd2hpbGUgYWxyZWFkeSBpbiBzbWFzayBtb2RlXCIpO1xuICAgIH1cbiAgICBjb25zdCBkcmF3bldpZHRoID0gdGhpcy5jdHguY2FudmFzLndpZHRoO1xuICAgIGNvbnN0IGRyYXduSGVpZ2h0ID0gdGhpcy5jdHguY2FudmFzLmhlaWdodDtcbiAgICBjb25zdCBjYWNoZUlkID0gXCJzbWFza0dyb3VwQXRcIiArIHRoaXMuZ3JvdXBMZXZlbDtcbiAgICBjb25zdCBzY3JhdGNoQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoY2FjaGVJZCwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHQpO1xuICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gdGhpcy5jdHg7XG4gICAgdGhpcy5jdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY3R4LnNldFRyYW5zZm9ybSguLi5nZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuc3VzcGVuZGVkQ3R4KSk7XG4gICAgY29weUN0eFN0YXRlKHRoaXMuc3VzcGVuZGVkQ3R4LCBjdHgpO1xuICAgIG1pcnJvckNvbnRleHRPcGVyYXRpb25zKGN0eCwgdGhpcy5zdXNwZW5kZWRDdHgpO1xuICAgIHRoaXMuc2V0R1N0YXRlKFtbXCJCTVwiLCBcInNvdXJjZS1vdmVyXCJdLCBbXCJjYVwiLCAxXSwgW1wiQ0FcIiwgMV1dKTtcbiAgfVxuICBlbmRTTWFza01vZGUoKSB7XG4gICAgaWYgKCF0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbmRTTWFza01vZGUgY2FsbGVkIHdoaWxlIG5vdCBpbiBzbWFzayBtb2RlXCIpO1xuICAgIH1cbiAgICB0aGlzLmN0eC5fcmVtb3ZlTWlycm9yaW5nKCk7XG4gICAgY29weUN0eFN0YXRlKHRoaXMuY3R4LCB0aGlzLnN1c3BlbmRlZEN0eCk7XG4gICAgdGhpcy5jdHggPSB0aGlzLnN1c3BlbmRlZEN0eDtcbiAgICB0aGlzLnN1c3BlbmRlZEN0eCA9IG51bGw7XG4gIH1cbiAgY29tcG9zZShkaXJ0eUJveCkge1xuICAgIGlmICghdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZGlydHlCb3gpIHtcbiAgICAgIGRpcnR5Qm94ID0gWzAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcnR5Qm94WzBdID0gTWF0aC5mbG9vcihkaXJ0eUJveFswXSk7XG4gICAgICBkaXJ0eUJveFsxXSA9IE1hdGguZmxvb3IoZGlydHlCb3hbMV0pO1xuICAgICAgZGlydHlCb3hbMl0gPSBNYXRoLmNlaWwoZGlydHlCb3hbMl0pO1xuICAgICAgZGlydHlCb3hbM10gPSBNYXRoLmNlaWwoZGlydHlCb3hbM10pO1xuICAgIH1cbiAgICBjb25zdCBzbWFzayA9IHRoaXMuY3VycmVudC5hY3RpdmVTTWFzaztcbiAgICBjb25zdCBzdXNwZW5kZWRDdHggPSB0aGlzLnN1c3BlbmRlZEN0eDtcbiAgICB0aGlzLmNvbXBvc2VTTWFzayhzdXNwZW5kZWRDdHgsIHNtYXNrLCB0aGlzLmN0eCwgZGlydHlCb3gpO1xuICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG4gICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICB9XG4gIGNvbXBvc2VTTWFzayhjdHgsIHNtYXNrLCBsYXllckN0eCwgbGF5ZXJCb3gpIHtcbiAgICBjb25zdCBsYXllck9mZnNldFggPSBsYXllckJveFswXTtcbiAgICBjb25zdCBsYXllck9mZnNldFkgPSBsYXllckJveFsxXTtcbiAgICBjb25zdCBsYXllcldpZHRoID0gbGF5ZXJCb3hbMl0gLSBsYXllck9mZnNldFg7XG4gICAgY29uc3QgbGF5ZXJIZWlnaHQgPSBsYXllckJveFszXSAtIGxheWVyT2Zmc2V0WTtcbiAgICBpZiAobGF5ZXJXaWR0aCA9PT0gMCB8fCBsYXllckhlaWdodCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmdlbmVyaWNDb21wb3NlU01hc2soc21hc2suY29udGV4dCwgbGF5ZXJDdHgsIGxheWVyV2lkdGgsIGxheWVySGVpZ2h0LCBzbWFzay5zdWJ0eXBlLCBzbWFzay5iYWNrZHJvcCwgc21hc2sudHJhbnNmZXJNYXAsIGxheWVyT2Zmc2V0WCwgbGF5ZXJPZmZzZXRZLCBzbWFzay5vZmZzZXRYLCBzbWFzay5vZmZzZXRZKTtcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcbiAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIGN0eC5kcmF3SW1hZ2UobGF5ZXJDdHguY2FudmFzLCAwLCAwKTtcbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG4gIGdlbmVyaWNDb21wb3NlU01hc2sobWFza0N0eCwgbGF5ZXJDdHgsIHdpZHRoLCBoZWlnaHQsIHN1YnR5cGUsIGJhY2tkcm9wLCB0cmFuc2Zlck1hcCwgbGF5ZXJPZmZzZXRYLCBsYXllck9mZnNldFksIG1hc2tPZmZzZXRYLCBtYXNrT2Zmc2V0WSkge1xuICAgIGxldCBtYXNrQ2FudmFzID0gbWFza0N0eC5jYW52YXM7XG4gICAgbGV0IG1hc2tYID0gbGF5ZXJPZmZzZXRYIC0gbWFza09mZnNldFg7XG4gICAgbGV0IG1hc2tZID0gbGF5ZXJPZmZzZXRZIC0gbWFza09mZnNldFk7XG4gICAgaWYgKGJhY2tkcm9wKSB7XG4gICAgICBpZiAobWFza1ggPCAwIHx8IG1hc2tZIDwgMCB8fCBtYXNrWCArIHdpZHRoID4gbWFza0NhbnZhcy53aWR0aCB8fCBtYXNrWSArIGhlaWdodCA+IG1hc2tDYW52YXMuaGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwibWFza0V4dGVuc2lvblwiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmNvbnRleHQ7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UobWFza0NhbnZhcywgLW1hc2tYLCAtbWFza1kpO1xuICAgICAgICBpZiAoYmFja2Ryb3Auc29tZShjID0+IGMgIT09IDApKSB7XG4gICAgICAgICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwiZGVzdGluYXRpb24tYXRvcFwiO1xuICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5iYWNrZHJvcCk7XG4gICAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1vdmVyXCI7XG4gICAgICAgIH1cbiAgICAgICAgbWFza0NhbnZhcyA9IGNhbnZhcy5jYW52YXM7XG4gICAgICAgIG1hc2tYID0gbWFza1kgPSAwO1xuICAgICAgfSBlbHNlIGlmIChiYWNrZHJvcC5zb21lKGMgPT4gYyAhPT0gMCkpIHtcbiAgICAgICAgbWFza0N0eC5zYXZlKCk7XG4gICAgICAgIG1hc2tDdHguZ2xvYmFsQWxwaGEgPSAxO1xuICAgICAgICBtYXNrQ3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgICAgY29uc3QgY2xpcCA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgY2xpcC5yZWN0KG1hc2tYLCBtYXNrWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIG1hc2tDdHguY2xpcChjbGlwKTtcbiAgICAgICAgbWFza0N0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcImRlc3RpbmF0aW9uLWF0b3BcIjtcbiAgICAgICAgbWFza0N0eC5maWxsU3R5bGUgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5iYWNrZHJvcCk7XG4gICAgICAgIG1hc2tDdHguZmlsbFJlY3QobWFza1gsIG1hc2tZLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgbWFza0N0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxheWVyQ3R4LnNhdmUoKTtcbiAgICBsYXllckN0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgbGF5ZXJDdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIGlmIChzdWJ0eXBlID09PSBcIkFscGhhXCIgJiYgdHJhbnNmZXJNYXApIHtcbiAgICAgIGxheWVyQ3R4LmZpbHRlciA9IHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRBbHBoYUZpbHRlcih0cmFuc2Zlck1hcCk7XG4gICAgfSBlbHNlIGlmIChzdWJ0eXBlID09PSBcIkx1bWlub3NpdHlcIikge1xuICAgICAgbGF5ZXJDdHguZmlsdGVyID0gdGhpcy5maWx0ZXJGYWN0b3J5LmFkZEx1bWlub3NpdHlGaWx0ZXIodHJhbnNmZXJNYXApO1xuICAgIH1cbiAgICBjb25zdCBjbGlwID0gbmV3IFBhdGgyRCgpO1xuICAgIGNsaXAucmVjdChsYXllck9mZnNldFgsIGxheWVyT2Zmc2V0WSwgd2lkdGgsIGhlaWdodCk7XG4gICAgbGF5ZXJDdHguY2xpcChjbGlwKTtcbiAgICBsYXllckN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcImRlc3RpbmF0aW9uLWluXCI7XG4gICAgbGF5ZXJDdHguZHJhd0ltYWdlKG1hc2tDYW52YXMsIG1hc2tYLCBtYXNrWSwgd2lkdGgsIGhlaWdodCwgbGF5ZXJPZmZzZXRYLCBsYXllck9mZnNldFksIHdpZHRoLCBoZWlnaHQpO1xuICAgIGxheWVyQ3R4LnJlc3RvcmUoKTtcbiAgfVxuICBzYXZlKCkge1xuICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICBjb3B5Q3R4U3RhdGUodGhpcy5jdHgsIHRoaXMuc3VzcGVuZGVkQ3R4KTtcbiAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4LnNhdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgIH1cbiAgICBjb25zdCBvbGQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgdGhpcy5zdGF0ZVN0YWNrLnB1c2gob2xkKTtcbiAgICB0aGlzLmN1cnJlbnQgPSBvbGQuY2xvbmUoKTtcbiAgfVxuICByZXN0b3JlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoID09PSAwICYmIHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgIHRoaXMuZW5kU01hc2tNb2RlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnN0YXRlU3RhY2sucG9wKCk7XG4gICAgICBpZiAodGhpcy5pblNNYXNrTW9kZSkge1xuICAgICAgICB0aGlzLnN1c3BlbmRlZEN0eC5yZXN0b3JlKCk7XG4gICAgICAgIGNvcHlDdHhTdGF0ZSh0aGlzLnN1c3BlbmRlZEN0eCwgdGhpcy5jdHgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGVja1NNYXNrU3RhdGUoKTtcbiAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7XG4gICAgfVxuICB9XG4gIHRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgdGhpcy5jdHgudHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPSAtMTtcbiAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgfVxuICBjb25zdHJ1Y3RQYXRoKG9wcywgYXJncywgbWluTWF4KSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICBsZXQgeCA9IGN1cnJlbnQueCxcbiAgICAgIHkgPSBjdXJyZW50Lnk7XG4gICAgbGV0IHN0YXJ0WCwgc3RhcnRZO1xuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCk7XG4gICAgY29uc3QgaXNTY2FsaW5nTWF0cml4ID0gY3VycmVudFRyYW5zZm9ybVswXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzNdID09PSAwIHx8IGN1cnJlbnRUcmFuc2Zvcm1bMV0gPT09IDAgJiYgY3VycmVudFRyYW5zZm9ybVsyXSA9PT0gMDtcbiAgICBjb25zdCBtaW5NYXhGb3JCZXppZXIgPSBpc1NjYWxpbmdNYXRyaXggPyBtaW5NYXguc2xpY2UoMCkgOiBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSBvcHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgc3dpdGNoIChvcHNbaV0gfCAwKSB7XG4gICAgICAgIGNhc2UgT1BTLnJlY3RhbmdsZTpcbiAgICAgICAgICB4ID0gYXJnc1tqKytdO1xuICAgICAgICAgIHkgPSBhcmdzW2orK107XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSBhcmdzW2orK107XG4gICAgICAgICAgY29uc3QgaGVpZ2h0ID0gYXJnc1tqKytdO1xuICAgICAgICAgIGNvbnN0IHh3ID0geCArIHdpZHRoO1xuICAgICAgICAgIGNvbnN0IHloID0geSArIGhlaWdodDtcbiAgICAgICAgICBjdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcbiAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHloKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4dywgeSk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHh3LCB5aCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHgsIHloKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFpc1NjYWxpbmdNYXRyaXgpIHtcbiAgICAgICAgICAgIGN1cnJlbnQudXBkYXRlUmVjdE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBbeCwgeSwgeHcsIHloXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBPUFMubW92ZVRvOlxuICAgICAgICAgIHggPSBhcmdzW2orK107XG4gICAgICAgICAgeSA9IGFyZ3NbaisrXTtcbiAgICAgICAgICBjdHgubW92ZVRvKHgsIHkpO1xuICAgICAgICAgIGlmICghaXNTY2FsaW5nTWF0cml4KSB7XG4gICAgICAgICAgICBjdXJyZW50LnVwZGF0ZVBhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9QUy5saW5lVG86XG4gICAgICAgICAgeCA9IGFyZ3NbaisrXTtcbiAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuICAgICAgICAgIGN0eC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgaWYgKCFpc1NjYWxpbmdNYXRyaXgpIHtcbiAgICAgICAgICAgIGN1cnJlbnQudXBkYXRlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCB4LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT1BTLmN1cnZlVG86XG4gICAgICAgICAgc3RhcnRYID0geDtcbiAgICAgICAgICBzdGFydFkgPSB5O1xuICAgICAgICAgIHggPSBhcmdzW2ogKyA0XTtcbiAgICAgICAgICB5ID0gYXJnc1tqICsgNV07XG4gICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSwgeCwgeSk7XG4gICAgICAgICAgY3VycmVudC51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgc3RhcnRYLCBzdGFydFksIGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCBhcmdzW2ogKyAyXSwgYXJnc1tqICsgM10sIHgsIHksIG1pbk1heEZvckJlemllcik7XG4gICAgICAgICAgaiArPSA2O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9QUy5jdXJ2ZVRvMjpcbiAgICAgICAgICBzdGFydFggPSB4O1xuICAgICAgICAgIHN0YXJ0WSA9IHk7XG4gICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oeCwgeSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSk7XG4gICAgICAgICAgY3VycmVudC51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgc3RhcnRYLCBzdGFydFksIHgsIHksIGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCBhcmdzW2ogKyAyXSwgYXJnc1tqICsgM10sIG1pbk1heEZvckJlemllcik7XG4gICAgICAgICAgeCA9IGFyZ3NbaiArIDJdO1xuICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTtcbiAgICAgICAgICBqICs9IDQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgT1BTLmN1cnZlVG8zOlxuICAgICAgICAgIHN0YXJ0WCA9IHg7XG4gICAgICAgICAgc3RhcnRZID0geTtcbiAgICAgICAgICB4ID0gYXJnc1tqICsgMl07XG4gICAgICAgICAgeSA9IGFyZ3NbaiArIDNdO1xuICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCB4LCB5LCB4LCB5KTtcbiAgICAgICAgICBjdXJyZW50LnVwZGF0ZUN1cnZlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBzdGFydFgsIHN0YXJ0WSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIHgsIHksIHgsIHksIG1pbk1heEZvckJlemllcik7XG4gICAgICAgICAgaiArPSA0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE9QUy5jbG9zZVBhdGg6XG4gICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNTY2FsaW5nTWF0cml4KSB7XG4gICAgICBjdXJyZW50LnVwZGF0ZVNjYWxpbmdQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIG1pbk1heEZvckJlemllcik7XG4gICAgfVxuICAgIGN1cnJlbnQuc2V0Q3VycmVudFBvaW50KHgsIHkpO1xuICB9XG4gIGNsb3NlUGF0aCgpIHtcbiAgICB0aGlzLmN0eC5jbG9zZVBhdGgoKTtcbiAgfVxuICBzdHJva2UoY29uc3VtZVBhdGggPSB0cnVlKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7XG4gICAgY3R4Lmdsb2JhbEFscGhhID0gdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhO1xuICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICBpZiAodHlwZW9mIHN0cm9rZUNvbG9yID09PSBcIm9iamVjdFwiICYmIHN0cm9rZUNvbG9yPy5nZXRQYXR0ZXJuKSB7XG4gICAgICAgIGN0eC5zYXZlKCk7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZUNvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzLCBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShjdHgpLCBQYXRoVHlwZS5TVFJPS0UpO1xuICAgICAgICB0aGlzLnJlc2NhbGVBbmRTdHJva2UoZmFsc2UpO1xuICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXNjYWxlQW5kU3Ryb2tlKHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uc3VtZVBhdGgpIHtcbiAgICAgIHRoaXMuY29uc3VtZVBhdGgodGhpcy5jdXJyZW50LmdldENsaXBwZWRQYXRoQm91bmRpbmdCb3goKSk7XG4gICAgfVxuICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5maWxsQWxwaGE7XG4gIH1cbiAgY2xvc2VTdHJva2UoKSB7XG4gICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLnN0cm9rZSgpO1xuICB9XG4gIGZpbGwoY29uc3VtZVBhdGggPSB0cnVlKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjtcbiAgICBjb25zdCBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsO1xuICAgIGxldCBuZWVkUmVzdG9yZSA9IGZhbHNlO1xuICAgIGlmIChpc1BhdHRlcm5GaWxsKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IGZpbGxDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoY3R4KSwgUGF0aFR5cGUuRklMTCk7XG4gICAgICBuZWVkUmVzdG9yZSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGludGVyc2VjdCA9IHRoaXMuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KCk7XG4gICAgaWYgKHRoaXMuY29udGVudFZpc2libGUgJiYgaW50ZXJzZWN0ICE9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nRU9GaWxsKSB7XG4gICAgICAgIGN0eC5maWxsKFwiZXZlbm9kZFwiKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobmVlZFJlc3RvcmUpIHtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICAgIGlmIChjb25zdW1lUGF0aCkge1xuICAgICAgdGhpcy5jb25zdW1lUGF0aChpbnRlcnNlY3QpO1xuICAgIH1cbiAgfVxuICBlb0ZpbGwoKSB7XG4gICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcbiAgICB0aGlzLmZpbGwoKTtcbiAgfVxuICBmaWxsU3Ryb2tlKCkge1xuICAgIHRoaXMuZmlsbChmYWxzZSk7XG4gICAgdGhpcy5zdHJva2UoZmFsc2UpO1xuICAgIHRoaXMuY29uc3VtZVBhdGgoKTtcbiAgfVxuICBlb0ZpbGxTdHJva2UoKSB7XG4gICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcbiAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgfVxuICBjbG9zZUZpbGxTdHJva2UoKSB7XG4gICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgfVxuICBjbG9zZUVPRmlsbFN0cm9rZSgpIHtcbiAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSB0cnVlO1xuICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gIH1cbiAgZW5kUGF0aCgpIHtcbiAgICB0aGlzLmNvbnN1bWVQYXRoKCk7XG4gIH1cbiAgY2xpcCgpIHtcbiAgICB0aGlzLnBlbmRpbmdDbGlwID0gTk9STUFMX0NMSVA7XG4gIH1cbiAgZW9DbGlwKCkge1xuICAgIHRoaXMucGVuZGluZ0NsaXAgPSBFT19DTElQO1xuICB9XG4gIGJlZ2luVGV4dCgpIHtcbiAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeCA9IElERU5USVRZX01BVFJJWDtcbiAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gMTtcbiAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCA9IDA7XG4gICAgdGhpcy5jdXJyZW50LnkgPSB0aGlzLmN1cnJlbnQubGluZVkgPSAwO1xuICB9XG4gIGVuZFRleHQoKSB7XG4gICAgY29uc3QgcGF0aHMgPSB0aGlzLnBlbmRpbmdUZXh0UGF0aHM7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgaWYgKHBhdGhzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBjdHguc2V0VHJhbnNmb3JtKC4uLnBhdGgudHJhbnNmb3JtKTtcbiAgICAgIGN0eC50cmFuc2xhdGUocGF0aC54LCBwYXRoLnkpO1xuICAgICAgcGF0aC5hZGRUb1BhdGgoY3R4LCBwYXRoLmZvbnRTaXplKTtcbiAgICB9XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgICBjdHguY2xpcCgpO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBkZWxldGUgdGhpcy5wZW5kaW5nVGV4dFBhdGhzO1xuICB9XG4gIHNldENoYXJTcGFjaW5nKHNwYWNpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQuY2hhclNwYWNpbmcgPSBzcGFjaW5nO1xuICB9XG4gIHNldFdvcmRTcGFjaW5nKHNwYWNpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnQud29yZFNwYWNpbmcgPSBzcGFjaW5nO1xuICB9XG4gIHNldEhTY2FsZShzY2FsZSkge1xuICAgIHRoaXMuY3VycmVudC50ZXh0SFNjYWxlID0gc2NhbGUgLyAxMDA7XG4gIH1cbiAgc2V0TGVhZGluZyhsZWFkaW5nKSB7XG4gICAgdGhpcy5jdXJyZW50LmxlYWRpbmcgPSAtbGVhZGluZztcbiAgfVxuICBzZXRGb250KGZvbnRSZWZOYW1lLCBzaXplKSB7XG4gICAgY29uc3QgZm9udE9iaiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQoZm9udFJlZk5hbWUpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgaWYgKCFmb250T2JqKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGZpbmQgZm9udCBmb3IgJHtmb250UmVmTmFtZX1gKTtcbiAgICB9XG4gICAgY3VycmVudC5mb250TWF0cml4ID0gZm9udE9iai5mb250TWF0cml4IHx8IEZPTlRfSURFTlRJVFlfTUFUUklYO1xuICAgIGlmIChjdXJyZW50LmZvbnRNYXRyaXhbMF0gPT09IDAgfHwgY3VycmVudC5mb250TWF0cml4WzNdID09PSAwKSB7XG4gICAgICB3YXJuKFwiSW52YWxpZCBmb250IG1hdHJpeCBmb3IgZm9udCBcIiArIGZvbnRSZWZOYW1lKTtcbiAgICB9XG4gICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICBzaXplID0gLXNpemU7XG4gICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudC5mb250RGlyZWN0aW9uID0gMTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50LmZvbnQgPSBmb250T2JqO1xuICAgIHRoaXMuY3VycmVudC5mb250U2l6ZSA9IHNpemU7XG4gICAgaWYgKGZvbnRPYmouaXNUeXBlM0ZvbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGZvbnRPYmoubG9hZGVkTmFtZSB8fCBcInNhbnMtc2VyaWZcIjtcbiAgICBjb25zdCB0eXBlZmFjZSA9IGZvbnRPYmouc3lzdGVtRm9udEluZm8/LmNzcyB8fCBgXCIke25hbWV9XCIsICR7Zm9udE9iai5mYWxsYmFja05hbWV9YDtcbiAgICBsZXQgYm9sZCA9IFwibm9ybWFsXCI7XG4gICAgaWYgKGZvbnRPYmouYmxhY2spIHtcbiAgICAgIGJvbGQgPSBcIjkwMFwiO1xuICAgIH0gZWxzZSBpZiAoZm9udE9iai5ib2xkKSB7XG4gICAgICBib2xkID0gXCJib2xkXCI7XG4gICAgfVxuICAgIGNvbnN0IGl0YWxpYyA9IGZvbnRPYmouaXRhbGljID8gXCJpdGFsaWNcIiA6IFwibm9ybWFsXCI7XG4gICAgbGV0IGJyb3dzZXJGb250U2l6ZSA9IHNpemU7XG4gICAgaWYgKHNpemUgPCBNSU5fRk9OVF9TSVpFKSB7XG4gICAgICBicm93c2VyRm9udFNpemUgPSBNSU5fRk9OVF9TSVpFO1xuICAgIH0gZWxzZSBpZiAoc2l6ZSA+IE1BWF9GT05UX1NJWkUpIHtcbiAgICAgIGJyb3dzZXJGb250U2l6ZSA9IE1BWF9GT05UX1NJWkU7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudC5mb250U2l6ZVNjYWxlID0gc2l6ZSAvIGJyb3dzZXJGb250U2l6ZTtcbiAgICB0aGlzLmN0eC5mb250ID0gYCR7aXRhbGljfSAke2JvbGR9ICR7YnJvd3NlckZvbnRTaXplfXB4ICR7dHlwZWZhY2V9YDtcbiAgfVxuICBzZXRUZXh0UmVuZGVyaW5nTW9kZShtb2RlKSB7XG4gICAgdGhpcy5jdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID0gbW9kZTtcbiAgfVxuICBzZXRUZXh0UmlzZShyaXNlKSB7XG4gICAgdGhpcy5jdXJyZW50LnRleHRSaXNlID0gcmlzZTtcbiAgfVxuICBtb3ZlVGV4dCh4LCB5KSB7XG4gICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggKz0geDtcbiAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSArPSB5O1xuICB9XG4gIHNldExlYWRpbmdNb3ZlVGV4dCh4LCB5KSB7XG4gICAgdGhpcy5zZXRMZWFkaW5nKC15KTtcbiAgICB0aGlzLm1vdmVUZXh0KHgsIHkpO1xuICB9XG4gIHNldFRleHRNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikge1xuICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLmh5cG90KGEsIGIpO1xuICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcbiAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG4gIH1cbiAgbmV4dExpbmUoKSB7XG4gICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG4gIH1cbiAgcGFpbnRDaGFyKGNoYXJhY3RlciwgeCwgeSwgcGF0dGVyblRyYW5zZm9ybSkge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgY29uc3QgZm9udCA9IGN1cnJlbnQuZm9udDtcbiAgICBjb25zdCB0ZXh0UmVuZGVyaW5nTW9kZSA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGU7XG4gICAgY29uc3QgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplIC8gY3VycmVudC5mb250U2l6ZVNjYWxlO1xuICAgIGNvbnN0IGZpbGxTdHJva2VNb2RlID0gdGV4dFJlbmRlcmluZ01vZGUgJiBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLO1xuICAgIGNvbnN0IGlzQWRkVG9QYXRoU2V0ID0gISEodGV4dFJlbmRlcmluZ01vZGUgJiBUZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKTtcbiAgICBjb25zdCBwYXR0ZXJuRmlsbCA9IGN1cnJlbnQucGF0dGVybkZpbGwgJiYgIWZvbnQubWlzc2luZ0ZpbGU7XG4gICAgbGV0IGFkZFRvUGF0aDtcbiAgICBpZiAoZm9udC5kaXNhYmxlRm9udEZhY2UgfHwgaXNBZGRUb1BhdGhTZXQgfHwgcGF0dGVybkZpbGwpIHtcbiAgICAgIGFkZFRvUGF0aCA9IGZvbnQuZ2V0UGF0aEdlbmVyYXRvcih0aGlzLmNvbW1vbk9ianMsIGNoYXJhY3Rlcik7XG4gICAgfVxuICAgIGlmIChmb250LmRpc2FibGVGb250RmFjZSB8fCBwYXR0ZXJuRmlsbCkge1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC50cmFuc2xhdGUoeCwgeSk7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBhZGRUb1BhdGgoY3R4LCBmb250U2l6ZSk7XG4gICAgICBpZiAocGF0dGVyblRyYW5zZm9ybSkge1xuICAgICAgICBjdHguc2V0VHJhbnNmb3JtKC4uLnBhdHRlcm5UcmFuc2Zvcm0pO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8IGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgIH1cbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgY3R4LmZpbGxUZXh0KGNoYXJhY3RlciwgeCwgeSk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgY3R4LnN0cm9rZVRleHQoY2hhcmFjdGVyLCB4LCB5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQWRkVG9QYXRoU2V0KSB7XG4gICAgICBjb25zdCBwYXRocyA9IHRoaXMucGVuZGluZ1RleHRQYXRocyB8fD0gW107XG4gICAgICBwYXRocy5wdXNoKHtcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCksXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIGZvbnRTaXplLFxuICAgICAgICBhZGRUb1BhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBnZXQgaXNGb250U3VicGl4ZWxBQUVuYWJsZWQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGV4dDogY3R4XG4gICAgfSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaXNGb250U3VicGl4ZWxBQUVuYWJsZWRcIiwgMTAsIDEwKTtcbiAgICBjdHguc2NhbGUoMS41LCAxKTtcbiAgICBjdHguZmlsbFRleHQoXCJJXCIsIDAsIDEwKTtcbiAgICBjb25zdCBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxMCwgMTApLmRhdGE7XG4gICAgbGV0IGVuYWJsZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMzsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIGlmIChkYXRhW2ldID4gMCAmJiBkYXRhW2ldIDwgMjU1KSB7XG4gICAgICAgIGVuYWJsZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzRm9udFN1YnBpeGVsQUFFbmFibGVkXCIsIGVuYWJsZWQpO1xuICB9XG4gIHNob3dUZXh0KGdseXBocykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgY29uc3QgZm9udCA9IGN1cnJlbnQuZm9udDtcbiAgICBpZiAoZm9udC5pc1R5cGUzRm9udCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvd1R5cGUzVGV4dChnbHlwaHMpO1xuICAgIH1cbiAgICBjb25zdCBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemU7XG4gICAgaWYgKGZvbnRTaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBmb250U2l6ZVNjYWxlID0gY3VycmVudC5mb250U2l6ZVNjYWxlO1xuICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZztcbiAgICBjb25zdCB3b3JkU3BhY2luZyA9IGN1cnJlbnQud29yZFNwYWNpbmc7XG4gICAgY29uc3QgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjtcbiAgICBjb25zdCB0ZXh0SFNjYWxlID0gY3VycmVudC50ZXh0SFNjYWxlICogZm9udERpcmVjdGlvbjtcbiAgICBjb25zdCBnbHlwaHNMZW5ndGggPSBnbHlwaHMubGVuZ3RoO1xuICAgIGNvbnN0IHZlcnRpY2FsID0gZm9udC52ZXJ0aWNhbDtcbiAgICBjb25zdCBzcGFjaW5nRGlyID0gdmVydGljYWwgPyAxIDogLTE7XG4gICAgY29uc3QgZGVmYXVsdFZNZXRyaWNzID0gZm9udC5kZWZhdWx0Vk1ldHJpY3M7XG4gICAgY29uc3Qgd2lkdGhBZHZhbmNlU2NhbGUgPSBmb250U2l6ZSAqIGN1cnJlbnQuZm9udE1hdHJpeFswXTtcbiAgICBjb25zdCBzaW1wbGVGaWxsVGV4dCA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLkZJTEwgJiYgIWZvbnQuZGlzYWJsZUZvbnRGYWNlICYmICFjdXJyZW50LnBhdHRlcm5GaWxsO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnRyYW5zZm9ybSguLi5jdXJyZW50LnRleHRNYXRyaXgpO1xuICAgIGN0eC50cmFuc2xhdGUoY3VycmVudC54LCBjdXJyZW50LnkgKyBjdXJyZW50LnRleHRSaXNlKTtcbiAgICBpZiAoZm9udERpcmVjdGlvbiA+IDApIHtcbiAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCAtMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCAxKTtcbiAgICB9XG4gICAgbGV0IHBhdHRlcm5UcmFuc2Zvcm07XG4gICAgaWYgKGN1cnJlbnQucGF0dGVybkZpbGwpIHtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjb25zdCBwYXR0ZXJuID0gY3VycmVudC5maWxsQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMsIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCksIFBhdGhUeXBlLkZJTEwpO1xuICAgICAgcGF0dGVyblRyYW5zZm9ybSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICBjdHguZmlsbFN0eWxlID0gcGF0dGVybjtcbiAgICB9XG4gICAgbGV0IGxpbmVXaWR0aCA9IGN1cnJlbnQubGluZVdpZHRoO1xuICAgIGNvbnN0IHNjYWxlID0gY3VycmVudC50ZXh0TWF0cml4U2NhbGU7XG4gICAgaWYgKHNjYWxlID09PSAwIHx8IGxpbmVXaWR0aCA9PT0gMCkge1xuICAgICAgY29uc3QgZmlsbFN0cm9rZU1vZGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlICYgVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcbiAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuICAgICAgICBsaW5lV2lkdGggPSB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGluZVdpZHRoIC89IHNjYWxlO1xuICAgIH1cbiAgICBpZiAoZm9udFNpemVTY2FsZSAhPT0gMS4wKSB7XG4gICAgICBjdHguc2NhbGUoZm9udFNpemVTY2FsZSwgZm9udFNpemVTY2FsZSk7XG4gICAgICBsaW5lV2lkdGggLz0gZm9udFNpemVTY2FsZTtcbiAgICB9XG4gICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICBpZiAoZm9udC5pc0ludmFsaWRQREZqc0ZvbnQpIHtcbiAgICAgIGNvbnN0IGNoYXJzID0gW107XG4gICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHtcbiAgICAgICAgY2hhcnMucHVzaChnbHlwaC51bmljb2RlKTtcbiAgICAgICAgd2lkdGggKz0gZ2x5cGgud2lkdGg7XG4gICAgICB9XG4gICAgICBjdHguZmlsbFRleHQoY2hhcnMuam9pbihcIlwiKSwgMCwgMCk7XG4gICAgICBjdXJyZW50LnggKz0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSAqIHRleHRIU2NhbGU7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgdGhpcy5jb21wb3NlKCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgeCA9IDAsXG4gICAgICBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBnbHlwaHNMZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgZ2x5cGggPSBnbHlwaHNbaV07XG4gICAgICBpZiAodHlwZW9mIGdseXBoID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHggKz0gc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUgLyAxMDAwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCByZXN0b3JlTmVlZGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzcGFjaW5nID0gKGdseXBoLmlzU3BhY2UgPyB3b3JkU3BhY2luZyA6IDApICsgY2hhclNwYWNpbmc7XG4gICAgICBjb25zdCBjaGFyYWN0ZXIgPSBnbHlwaC5mb250Q2hhcjtcbiAgICAgIGNvbnN0IGFjY2VudCA9IGdseXBoLmFjY2VudDtcbiAgICAgIGxldCBzY2FsZWRYLCBzY2FsZWRZO1xuICAgICAgbGV0IHdpZHRoID0gZ2x5cGgud2lkdGg7XG4gICAgICBpZiAodmVydGljYWwpIHtcbiAgICAgICAgY29uc3Qgdm1ldHJpYyA9IGdseXBoLnZtZXRyaWMgfHwgZGVmYXVsdFZNZXRyaWNzO1xuICAgICAgICBjb25zdCB2eCA9IC0oZ2x5cGgudm1ldHJpYyA/IHZtZXRyaWNbMV0gOiB3aWR0aCAqIDAuNSkgKiB3aWR0aEFkdmFuY2VTY2FsZTtcbiAgICAgICAgY29uc3QgdnkgPSB2bWV0cmljWzJdICogd2lkdGhBZHZhbmNlU2NhbGU7XG4gICAgICAgIHdpZHRoID0gdm1ldHJpYyA/IC12bWV0cmljWzBdIDogd2lkdGg7XG4gICAgICAgIHNjYWxlZFggPSB2eCAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIHNjYWxlZFkgPSAoeCArIHZ5KSAvIGZvbnRTaXplU2NhbGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2FsZWRYID0geCAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIHNjYWxlZFkgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKGZvbnQucmVtZWFzdXJlICYmIHdpZHRoID4gMCkge1xuICAgICAgICBjb25zdCBtZWFzdXJlZFdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGNoYXJhY3Rlcikud2lkdGggKiAxMDAwIC8gZm9udFNpemUgKiBmb250U2l6ZVNjYWxlO1xuICAgICAgICBpZiAod2lkdGggPCBtZWFzdXJlZFdpZHRoICYmIHRoaXMuaXNGb250U3VicGl4ZWxBQUVuYWJsZWQpIHtcbiAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJTY2FsZVggPSB3aWR0aCAvIG1lYXN1cmVkV2lkdGg7XG4gICAgICAgICAgcmVzdG9yZU5lZWRlZCA9IHRydWU7XG4gICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICBjdHguc2NhbGUoY2hhcmFjdGVyU2NhbGVYLCAxKTtcbiAgICAgICAgICBzY2FsZWRYIC89IGNoYXJhY3RlclNjYWxlWDtcbiAgICAgICAgfSBlbHNlIGlmICh3aWR0aCAhPT0gbWVhc3VyZWRXaWR0aCkge1xuICAgICAgICAgIHNjYWxlZFggKz0gKHdpZHRoIC0gbWVhc3VyZWRXaWR0aCkgLyAyMDAwICogZm9udFNpemUgLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSAmJiAoZ2x5cGguaXNJbkZvbnQgfHwgZm9udC5taXNzaW5nRmlsZSkpIHtcbiAgICAgICAgaWYgKHNpbXBsZUZpbGxUZXh0ICYmICFhY2NlbnQpIHtcbiAgICAgICAgICBjdHguZmlsbFRleHQoY2hhcmFjdGVyLCBzY2FsZWRYLCBzY2FsZWRZKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBhaW50Q2hhcihjaGFyYWN0ZXIsIHNjYWxlZFgsIHNjYWxlZFksIHBhdHRlcm5UcmFuc2Zvcm0pO1xuICAgICAgICAgIGlmIChhY2NlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlZEFjY2VudFggPSBzY2FsZWRYICsgZm9udFNpemUgKiBhY2NlbnQub2Zmc2V0LnggLyBmb250U2l6ZVNjYWxlO1xuICAgICAgICAgICAgY29uc3Qgc2NhbGVkQWNjZW50WSA9IHNjYWxlZFkgLSBmb250U2l6ZSAqIGFjY2VudC5vZmZzZXQueSAvIGZvbnRTaXplU2NhbGU7XG4gICAgICAgICAgICB0aGlzLnBhaW50Q2hhcihhY2NlbnQuZm9udENoYXIsIHNjYWxlZEFjY2VudFgsIHNjYWxlZEFjY2VudFksIHBhdHRlcm5UcmFuc2Zvcm0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgY2hhcldpZHRoID0gdmVydGljYWwgPyB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlIC0gc3BhY2luZyAqIGZvbnREaXJlY3Rpb24gOiB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlICsgc3BhY2luZyAqIGZvbnREaXJlY3Rpb247XG4gICAgICB4ICs9IGNoYXJXaWR0aDtcbiAgICAgIGlmIChyZXN0b3JlTmVlZGVkKSB7XG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgY3VycmVudC55IC09IHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnQueCArPSB4ICogdGV4dEhTY2FsZTtcbiAgICB9XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHNob3dUeXBlM1RleHQoZ2x5cGhzKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcbiAgICBjb25zdCBmb250ID0gY3VycmVudC5mb250O1xuICAgIGNvbnN0IGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZTtcbiAgICBjb25zdCBmb250RGlyZWN0aW9uID0gY3VycmVudC5mb250RGlyZWN0aW9uO1xuICAgIGNvbnN0IHNwYWNpbmdEaXIgPSBmb250LnZlcnRpY2FsID8gMSA6IC0xO1xuICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZztcbiAgICBjb25zdCB3b3JkU3BhY2luZyA9IGN1cnJlbnQud29yZFNwYWNpbmc7XG4gICAgY29uc3QgdGV4dEhTY2FsZSA9IGN1cnJlbnQudGV4dEhTY2FsZSAqIGZvbnREaXJlY3Rpb247XG4gICAgY29uc3QgZm9udE1hdHJpeCA9IGN1cnJlbnQuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDtcbiAgICBjb25zdCBnbHlwaHNMZW5ndGggPSBnbHlwaHMubGVuZ3RoO1xuICAgIGNvbnN0IGlzVGV4dEludmlzaWJsZSA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPT09IFRleHRSZW5kZXJpbmdNb2RlLklOVklTSUJMRTtcbiAgICBsZXQgaSwgZ2x5cGgsIHdpZHRoLCBzcGFjaW5nTGVuZ3RoO1xuICAgIGlmIChpc1RleHRJbnZpc2libGUgfHwgZm9udFNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnRyYW5zZm9ybSguLi5jdXJyZW50LnRleHRNYXRyaXgpO1xuICAgIGN0eC50cmFuc2xhdGUoY3VycmVudC54LCBjdXJyZW50LnkpO1xuICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCBmb250RGlyZWN0aW9uKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZ2x5cGhzTGVuZ3RoOyArK2kpIHtcbiAgICAgIGdseXBoID0gZ2x5cGhzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBnbHlwaCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBzcGFjaW5nTGVuZ3RoID0gc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUgLyAxMDAwO1xuICAgICAgICB0aGlzLmN0eC50cmFuc2xhdGUoc3BhY2luZ0xlbmd0aCwgMCk7XG4gICAgICAgIGN1cnJlbnQueCArPSBzcGFjaW5nTGVuZ3RoICogdGV4dEhTY2FsZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBzcGFjaW5nID0gKGdseXBoLmlzU3BhY2UgPyB3b3JkU3BhY2luZyA6IDApICsgY2hhclNwYWNpbmc7XG4gICAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBmb250LmNoYXJQcm9jT3BlcmF0b3JMaXN0W2dseXBoLm9wZXJhdG9yTGlzdElkXTtcbiAgICAgIGlmICghb3BlcmF0b3JMaXN0KSB7XG4gICAgICAgIHdhcm4oYFR5cGUzIGNoYXJhY3RlciBcIiR7Z2x5cGgub3BlcmF0b3JMaXN0SWR9XCIgaXMgbm90IGF2YWlsYWJsZS5gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IGdseXBoO1xuICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgY3R4LnNjYWxlKGZvbnRTaXplLCBmb250U2l6ZSk7XG4gICAgICAgIGN0eC50cmFuc2Zvcm0oLi4uZm9udE1hdHJpeCk7XG4gICAgICAgIHRoaXMuZXhlY3V0ZU9wZXJhdG9yTGlzdChvcGVyYXRvckxpc3QpO1xuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gVXRpbC5hcHBseVRyYW5zZm9ybShbZ2x5cGgud2lkdGgsIDBdLCBmb250TWF0cml4KTtcbiAgICAgIHdpZHRoID0gdHJhbnNmb3JtZWRbMF0gKiBmb250U2l6ZSArIHNwYWNpbmc7XG4gICAgICBjdHgudHJhbnNsYXRlKHdpZHRoLCAwKTtcbiAgICAgIGN1cnJlbnQueCArPSB3aWR0aCAqIHRleHRIU2NhbGU7XG4gICAgfVxuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBudWxsO1xuICB9XG4gIHNldENoYXJXaWR0aCh4V2lkdGgsIHlXaWR0aCkge31cbiAgc2V0Q2hhcldpZHRoQW5kQm91bmRzKHhXaWR0aCwgeVdpZHRoLCBsbHgsIGxseSwgdXJ4LCB1cnkpIHtcbiAgICB0aGlzLmN0eC5yZWN0KGxseCwgbGx5LCB1cnggLSBsbHgsIHVyeSAtIGxseSk7XG4gICAgdGhpcy5jdHguY2xpcCgpO1xuICAgIHRoaXMuZW5kUGF0aCgpO1xuICB9XG4gIGdldENvbG9yTl9QYXR0ZXJuKElSKSB7XG4gICAgbGV0IHBhdHRlcm47XG4gICAgaWYgKElSWzBdID09PSBcIlRpbGluZ1BhdHRlcm5cIikge1xuICAgICAgY29uc3QgY29sb3IgPSBJUlsxXTtcbiAgICAgIGNvbnN0IGJhc2VUcmFuc2Zvcm0gPSB0aGlzLmJhc2VUcmFuc2Zvcm0gfHwgZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLmN0eCk7XG4gICAgICBjb25zdCBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB7XG4gICAgICAgIGNyZWF0ZUNhbnZhc0dyYXBoaWNzOiBjdHggPT4gbmV3IENhbnZhc0dyYXBoaWNzKGN0eCwgdGhpcy5jb21tb25PYmpzLCB0aGlzLm9ianMsIHRoaXMuY2FudmFzRmFjdG9yeSwgdGhpcy5maWx0ZXJGYWN0b3J5LCB7XG4gICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnOiB0aGlzLm9wdGlvbmFsQ29udGVudENvbmZpZyxcbiAgICAgICAgICBtYXJrZWRDb250ZW50U3RhY2s6IHRoaXMubWFya2VkQ29udGVudFN0YWNrXG4gICAgICAgIH0pXG4gICAgICB9O1xuICAgICAgcGF0dGVybiA9IG5ldyBUaWxpbmdQYXR0ZXJuKElSLCBjb2xvciwgdGhpcy5jdHgsIGNhbnZhc0dyYXBoaWNzRmFjdG9yeSwgYmFzZVRyYW5zZm9ybSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdHRlcm4gPSB0aGlzLl9nZXRQYXR0ZXJuKElSWzFdLCBJUlsyXSk7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG4gIHNldFN0cm9rZUNvbG9yTigpIHtcbiAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7XG4gIH1cbiAgc2V0RmlsbENvbG9yTigpIHtcbiAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdGhpcy5nZXRDb2xvck5fUGF0dGVybihhcmd1bWVudHMpO1xuICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IHRydWU7XG4gIH1cbiAgc2V0U3Ryb2tlUkdCQ29sb3IociwgZywgYikge1xuICAgIGNvbnN0IGNvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IociwgZywgYik7XG4gICAgdGhpcy5jdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcbiAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBjb2xvcjtcbiAgfVxuICBzZXRGaWxsUkdCQ29sb3IociwgZywgYikge1xuICAgIGNvbnN0IGNvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IociwgZywgYik7XG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gY29sb3I7XG4gICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IGNvbG9yO1xuICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IGZhbHNlO1xuICB9XG4gIF9nZXRQYXR0ZXJuKG9iaklkLCBtYXRyaXggPSBudWxsKSB7XG4gICAgbGV0IHBhdHRlcm47XG4gICAgaWYgKHRoaXMuY2FjaGVkUGF0dGVybnMuaGFzKG9iaklkKSkge1xuICAgICAgcGF0dGVybiA9IHRoaXMuY2FjaGVkUGF0dGVybnMuZ2V0KG9iaklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0dGVybiA9IGdldFNoYWRpbmdQYXR0ZXJuKHRoaXMuZ2V0T2JqZWN0KG9iaklkKSk7XG4gICAgICB0aGlzLmNhY2hlZFBhdHRlcm5zLnNldChvYmpJZCwgcGF0dGVybik7XG4gICAgfVxuICAgIGlmIChtYXRyaXgpIHtcbiAgICAgIHBhdHRlcm4ubWF0cml4ID0gbWF0cml4O1xuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybjtcbiAgfVxuICBzaGFkaW5nRmlsbChvYmpJZCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICB0aGlzLnNhdmUoKTtcbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5fZ2V0UGF0dGVybihvYmpJZCk7XG4gICAgY3R4LmZpbGxTdHlsZSA9IHBhdHRlcm4uZ2V0UGF0dGVybihjdHgsIHRoaXMsIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCksIFBhdGhUeXBlLlNIQURJTkcpO1xuICAgIGNvbnN0IGludiA9IGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCk7XG4gICAgaWYgKGludikge1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9ID0gY3R4LmNhbnZhcztcbiAgICAgIGNvbnN0IFt4MCwgeTAsIHgxLCB5MV0gPSBVdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCB3aWR0aCwgaGVpZ2h0XSwgaW52KTtcbiAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KC0xZTEwLCAtMWUxMCwgMmUxMCwgMmUxMCk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9zZSh0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpKTtcbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgfVxuICBiZWdpbklubGluZUltYWdlKCkge1xuICAgIHVucmVhY2hhYmxlKFwiU2hvdWxkIG5vdCBjYWxsIGJlZ2luSW5saW5lSW1hZ2VcIik7XG4gIH1cbiAgYmVnaW5JbWFnZURhdGEoKSB7XG4gICAgdW5yZWFjaGFibGUoXCJTaG91bGQgbm90IGNhbGwgYmVnaW5JbWFnZURhdGFcIik7XG4gIH1cbiAgcGFpbnRGb3JtWE9iamVjdEJlZ2luKG1hdHJpeCwgYmJveCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNhdmUoKTtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wdXNoKHRoaXMuYmFzZVRyYW5zZm9ybSk7XG4gICAgaWYgKG1hdHJpeCkge1xuICAgICAgdGhpcy50cmFuc2Zvcm0oLi4ubWF0cml4KTtcbiAgICB9XG4gICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLmN0eCk7XG4gICAgaWYgKGJib3gpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gYmJveFsyXSAtIGJib3hbMF07XG4gICAgICBjb25zdCBoZWlnaHQgPSBiYm94WzNdIC0gYmJveFsxXTtcbiAgICAgIHRoaXMuY3R4LnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmN1cnJlbnQudXBkYXRlUmVjdE1pbk1heChnZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY3R4KSwgYmJveCk7XG4gICAgICB0aGlzLmNsaXAoKTtcbiAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgIH1cbiAgfVxuICBwYWludEZvcm1YT2JqZWN0RW5kKCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wb3AoKTtcbiAgfVxuICBiZWdpbkdyb3VwKGdyb3VwKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudEN0eCA9IHRoaXMuY3R4O1xuICAgIGlmICghZ3JvdXAuaXNvbGF0ZWQpIHtcbiAgICAgIGluZm8oXCJUT0RPOiBTdXBwb3J0IG5vbi1pc29sYXRlZCBncm91cHMuXCIpO1xuICAgIH1cbiAgICBpZiAoZ3JvdXAua25vY2tvdXQpIHtcbiAgICAgIHdhcm4oXCJLbm9ja291dCBncm91cHMgbm90IHN1cHBvcnRlZC5cIik7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtKGN1cnJlbnRDdHgpO1xuICAgIGlmIChncm91cC5tYXRyaXgpIHtcbiAgICAgIGN1cnJlbnRDdHgudHJhbnNmb3JtKC4uLmdyb3VwLm1hdHJpeCk7XG4gICAgfVxuICAgIGlmICghZ3JvdXAuYmJveCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQm91bmRpbmcgYm94IGlzIHJlcXVpcmVkLlwiKTtcbiAgICB9XG4gICAgbGV0IGJvdW5kcyA9IFV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goZ3JvdXAuYmJveCwgZ2V0Q3VycmVudFRyYW5zZm9ybShjdXJyZW50Q3R4KSk7XG4gICAgY29uc3QgY2FudmFzQm91bmRzID0gWzAsIDAsIGN1cnJlbnRDdHguY2FudmFzLndpZHRoLCBjdXJyZW50Q3R4LmNhbnZhcy5oZWlnaHRdO1xuICAgIGJvdW5kcyA9IFV0aWwuaW50ZXJzZWN0KGJvdW5kcywgY2FudmFzQm91bmRzKSB8fCBbMCwgMCwgMCwgMF07XG4gICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGguZmxvb3IoYm91bmRzWzBdKTtcbiAgICBjb25zdCBvZmZzZXRZID0gTWF0aC5mbG9vcihib3VuZHNbMV0pO1xuICAgIGNvbnN0IGRyYXduV2lkdGggPSBNYXRoLm1heChNYXRoLmNlaWwoYm91bmRzWzJdKSAtIG9mZnNldFgsIDEpO1xuICAgIGNvbnN0IGRyYXduSGVpZ2h0ID0gTWF0aC5tYXgoTWF0aC5jZWlsKGJvdW5kc1szXSkgLSBvZmZzZXRZLCAxKTtcbiAgICB0aGlzLmN1cnJlbnQuc3RhcnROZXdQYXRoQW5kQ2xpcEJveChbMCwgMCwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHRdKTtcbiAgICBsZXQgY2FjaGVJZCA9IFwiZ3JvdXBBdFwiICsgdGhpcy5ncm91cExldmVsO1xuICAgIGlmIChncm91cC5zbWFzaykge1xuICAgICAgY2FjaGVJZCArPSBcIl9zbWFza19cIiArIHRoaXMuc21hc2tDb3VudGVyKysgJSAyO1xuICAgIH1cbiAgICBjb25zdCBzY3JhdGNoQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoY2FjaGVJZCwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHQpO1xuICAgIGNvbnN0IGdyb3VwQ3R4ID0gc2NyYXRjaENhbnZhcy5jb250ZXh0O1xuICAgIGdyb3VwQ3R4LnRyYW5zbGF0ZSgtb2Zmc2V0WCwgLW9mZnNldFkpO1xuICAgIGdyb3VwQ3R4LnRyYW5zZm9ybSguLi5jdXJyZW50VHJhbnNmb3JtKTtcbiAgICBpZiAoZ3JvdXAuc21hc2spIHtcbiAgICAgIHRoaXMuc21hc2tTdGFjay5wdXNoKHtcbiAgICAgICAgY2FudmFzOiBzY3JhdGNoQ2FudmFzLmNhbnZhcyxcbiAgICAgICAgY29udGV4dDogZ3JvdXBDdHgsXG4gICAgICAgIG9mZnNldFgsXG4gICAgICAgIG9mZnNldFksXG4gICAgICAgIHN1YnR5cGU6IGdyb3VwLnNtYXNrLnN1YnR5cGUsXG4gICAgICAgIGJhY2tkcm9wOiBncm91cC5zbWFzay5iYWNrZHJvcCxcbiAgICAgICAgdHJhbnNmZXJNYXA6IGdyb3VwLnNtYXNrLnRyYW5zZmVyTWFwIHx8IG51bGwsXG4gICAgICAgIHN0YXJ0VHJhbnNmb3JtSW52ZXJzZTogbnVsbFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRDdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgY3VycmVudEN0eC50cmFuc2xhdGUob2Zmc2V0WCwgb2Zmc2V0WSk7XG4gICAgICBjdXJyZW50Q3R4LnNhdmUoKTtcbiAgICB9XG4gICAgY29weUN0eFN0YXRlKGN1cnJlbnRDdHgsIGdyb3VwQ3R4KTtcbiAgICB0aGlzLmN0eCA9IGdyb3VwQ3R4O1xuICAgIHRoaXMuc2V0R1N0YXRlKFtbXCJCTVwiLCBcInNvdXJjZS1vdmVyXCJdLCBbXCJjYVwiLCAxXSwgW1wiQ0FcIiwgMV1dKTtcbiAgICB0aGlzLmdyb3VwU3RhY2sucHVzaChjdXJyZW50Q3R4KTtcbiAgICB0aGlzLmdyb3VwTGV2ZWwrKztcbiAgfVxuICBlbmRHcm91cChncm91cCkge1xuICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmdyb3VwTGV2ZWwtLTtcbiAgICBjb25zdCBncm91cEN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuZ3JvdXBTdGFjay5wb3AoKTtcbiAgICB0aGlzLmN0eCA9IGN0eDtcbiAgICB0aGlzLmN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoZ3JvdXAuc21hc2spIHtcbiAgICAgIHRoaXMudGVtcFNNYXNrID0gdGhpcy5zbWFza1N0YWNrLnBvcCgpO1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNdHggPSBnZXRDdXJyZW50VHJhbnNmb3JtKHRoaXMuY3R4KTtcbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKC4uLmN1cnJlbnRNdHgpO1xuICAgICAgY29uc3QgZGlydHlCb3ggPSBVdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCBncm91cEN0eC5jYW52YXMud2lkdGgsIGdyb3VwQ3R4LmNhbnZhcy5oZWlnaHRdLCBjdXJyZW50TXR4KTtcbiAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZShncm91cEN0eC5jYW52YXMsIDAsIDApO1xuICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgdGhpcy5jb21wb3NlKGRpcnR5Qm94KTtcbiAgICB9XG4gIH1cbiAgYmVnaW5Bbm5vdGF0aW9uKGlkLCByZWN0LCB0cmFuc2Zvcm0sIG1hdHJpeCwgaGFzT3duQ2FudmFzKSB7XG4gICAgdGhpcy4jcmVzdG9yZUluaXRpYWxTdGF0ZSgpO1xuICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgdGhpcy5zYXZlKCk7XG4gICAgaWYgKHRoaXMuYmFzZVRyYW5zZm9ybSkge1xuICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKC4uLnRoaXMuYmFzZVRyYW5zZm9ybSk7XG4gICAgfVxuICAgIGlmIChyZWN0KSB7XG4gICAgICBjb25zdCB3aWR0aCA9IHJlY3RbMl0gLSByZWN0WzBdO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gcmVjdFszXSAtIHJlY3RbMV07XG4gICAgICBpZiAoaGFzT3duQ2FudmFzICYmIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCkge1xuICAgICAgICB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm0uc2xpY2UoKTtcbiAgICAgICAgdHJhbnNmb3JtWzRdIC09IHJlY3RbMF07XG4gICAgICAgIHRyYW5zZm9ybVs1XSAtPSByZWN0WzFdO1xuICAgICAgICByZWN0ID0gcmVjdC5zbGljZSgpO1xuICAgICAgICByZWN0WzBdID0gcmVjdFsxXSA9IDA7XG4gICAgICAgIHJlY3RbMl0gPSB3aWR0aDtcbiAgICAgICAgcmVjdFszXSA9IGhlaWdodDtcbiAgICAgICAgY29uc3QgW3NjYWxlWCwgc2NhbGVZXSA9IFV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoZ2V0Q3VycmVudFRyYW5zZm9ybSh0aGlzLmN0eCkpO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdmlld3BvcnRTY2FsZVxuICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgY2FudmFzV2lkdGggPSBNYXRoLmNlaWwod2lkdGggKiB0aGlzLm91dHB1dFNjYWxlWCAqIHZpZXdwb3J0U2NhbGUpO1xuICAgICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0ICogdGhpcy5vdXRwdXRTY2FsZVkgKiB2aWV3cG9ydFNjYWxlKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZShjYW52YXNXaWR0aCwgY2FudmFzSGVpZ2h0KTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGNhbnZhcyxcbiAgICAgICAgICBjb250ZXh0XG4gICAgICAgIH0gPSB0aGlzLmFubm90YXRpb25DYW52YXM7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcC5zZXQoaWQsIGNhbnZhcyk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eCA9IHRoaXMuY3R4O1xuICAgICAgICB0aGlzLmN0eCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKHNjYWxlWCwgMCwgMCwgLXNjYWxlWSwgMCwgaGVpZ2h0ICogc2NhbGVZKTtcbiAgICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuICAgICAgICB0aGlzLmN0eC5yZWN0KHJlY3RbMF0sIHJlY3RbMV0sIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmN0eC5jbGlwKCk7XG4gICAgICAgIHRoaXMuZW5kUGF0aCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQgPSBuZXcgQ2FudmFzRXh0cmFTdGF0ZSh0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMudHJhbnNmb3JtKC4uLnRyYW5zZm9ybSk7XG4gICAgdGhpcy50cmFuc2Zvcm0oLi4ubWF0cml4KTtcbiAgfVxuICBlbmRBbm5vdGF0aW9uKCkge1xuICAgIGlmICh0aGlzLmFubm90YXRpb25DYW52YXMpIHtcbiAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgIHRoaXMuI2RyYXdGaWx0ZXIoKTtcbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5hbm5vdGF0aW9uQ2FudmFzLnNhdmVkQ3R4O1xuICAgICAgZGVsZXRlIHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eDtcbiAgICAgIGRlbGV0ZSB0aGlzLmFubm90YXRpb25DYW52YXM7XG4gICAgfVxuICB9XG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdChpbWcpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY291bnQgPSBpbWcuY291bnQ7XG4gICAgaW1nID0gdGhpcy5nZXRPYmplY3QoaW1nLmRhdGEsIGltZyk7XG4gICAgaW1nLmNvdW50ID0gY291bnQ7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgZ2x5cGggPSB0aGlzLnByb2Nlc3NpbmdUeXBlMztcbiAgICBpZiAoZ2x5cGgpIHtcbiAgICAgIGlmIChnbHlwaC5jb21waWxlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGdseXBoLmNvbXBpbGVkID0gY29tcGlsZVR5cGUzR2x5cGgoaW1nKTtcbiAgICAgIH1cbiAgICAgIGlmIChnbHlwaC5jb21waWxlZCkge1xuICAgICAgICBnbHlwaC5jb21waWxlZChjdHgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1hc2sgPSB0aGlzLl9jcmVhdGVNYXNrQ2FudmFzKGltZyk7XG4gICAgY29uc3QgbWFza0NhbnZhcyA9IG1hc2suY2FudmFzO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBjdHguZHJhd0ltYWdlKG1hc2tDYW52YXMsIG1hc2sub2Zmc2V0WCwgbWFzay5vZmZzZXRZKTtcbiAgICBjdHgucmVzdG9yZSgpO1xuICAgIHRoaXMuY29tcG9zZSgpO1xuICB9XG4gIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdChpbWcsIHNjYWxlWCwgc2tld1ggPSAwLCBza2V3WSA9IDAsIHNjYWxlWSwgcG9zaXRpb25zKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGltZyA9IHRoaXMuZ2V0T2JqZWN0KGltZy5kYXRhLCBpbWcpO1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGN0eC5zYXZlKCk7XG4gICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KTtcbiAgICBjdHgudHJhbnNmb3JtKHNjYWxlWCwgc2tld1gsIHNrZXdZLCBzY2FsZVksIDAsIDApO1xuICAgIGNvbnN0IG1hc2sgPSB0aGlzLl9jcmVhdGVNYXNrQ2FudmFzKGltZyk7XG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCBtYXNrLm9mZnNldFggLSBjdXJyZW50VHJhbnNmb3JtWzRdLCBtYXNrLm9mZnNldFkgLSBjdXJyZW50VHJhbnNmb3JtWzVdKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgY29uc3QgdHJhbnMgPSBVdGlsLnRyYW5zZm9ybShjdXJyZW50VHJhbnNmb3JtLCBbc2NhbGVYLCBza2V3WCwgc2tld1ksIHNjYWxlWSwgcG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdXSk7XG4gICAgICBjb25zdCBbeCwgeV0gPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFswLCAwXSwgdHJhbnMpO1xuICAgICAgY3R4LmRyYXdJbWFnZShtYXNrLmNhbnZhcywgeCwgeSk7XG4gICAgfVxuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gIH1cbiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXAoaW1hZ2VzKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG4gICAgY29uc3QgaXNQYXR0ZXJuRmlsbCA9IHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDtcbiAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGltYWdlcykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB0cmFuc2Zvcm1cbiAgICAgIH0gPSBpbWFnZTtcbiAgICAgIGNvbnN0IG1hc2tDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcIm1hc2tDYW52YXNcIiwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBtYXNrQ3R4ID0gbWFza0NhbnZhcy5jb250ZXh0O1xuICAgICAgbWFza0N0eC5zYXZlKCk7XG4gICAgICBjb25zdCBpbWcgPSB0aGlzLmdldE9iamVjdChkYXRhLCBpbWFnZSk7XG4gICAgICBwdXRCaW5hcnlJbWFnZU1hc2sobWFza0N0eCwgaW1nKTtcbiAgICAgIG1hc2tDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2UtaW5cIjtcbiAgICAgIG1hc2tDdHguZmlsbFN0eWxlID0gaXNQYXR0ZXJuRmlsbCA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKG1hc2tDdHgsIHRoaXMsIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCksIFBhdGhUeXBlLkZJTEwpIDogZmlsbENvbG9yO1xuICAgICAgbWFza0N0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIG1hc2tDdHgucmVzdG9yZSgpO1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC50cmFuc2Zvcm0oLi4udHJhbnNmb3JtKTtcbiAgICAgIGN0eC5zY2FsZSgxLCAtMSk7XG4gICAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoY3R4LCBtYXNrQ2FudmFzLmNhbnZhcywgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEsIDEpO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gICAgdGhpcy5jb21wb3NlKCk7XG4gIH1cbiAgcGFpbnRJbWFnZVhPYmplY3Qob2JqSWQpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW1nRGF0YSA9IHRoaXMuZ2V0T2JqZWN0KG9iaklkKTtcbiAgICBpZiAoIWltZ0RhdGEpIHtcbiAgICAgIHdhcm4oXCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0XCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpO1xuICB9XG4gIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KG9iaklkLCBzY2FsZVgsIHNjYWxlWSwgcG9zaXRpb25zKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGltZ0RhdGEgPSB0aGlzLmdldE9iamVjdChvYmpJZCk7XG4gICAgaWYgKCFpbWdEYXRhKSB7XG4gICAgICB3YXJuKFwiRGVwZW5kZW50IGltYWdlIGlzbid0IHJlYWR5IHlldFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuICAgIGNvbnN0IG1hcCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBtYXAucHVzaCh7XG4gICAgICAgIHRyYW5zZm9ybTogW3NjYWxlWCwgMCwgMCwgc2NhbGVZLCBwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV1dLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICB3OiB3aWR0aCxcbiAgICAgICAgaDogaGVpZ2h0XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKGltZ0RhdGEsIG1hcCk7XG4gIH1cbiAgYXBwbHlUcmFuc2Zlck1hcHNUb0NhbnZhcyhjdHgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcyAhPT0gXCJub25lXCIpIHtcbiAgICAgIGN0eC5maWx0ZXIgPSB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzO1xuICAgICAgY3R4LmRyYXdJbWFnZShjdHguY2FudmFzLCAwLCAwKTtcbiAgICAgIGN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICB9XG4gICAgcmV0dXJuIGN0eC5jYW52YXM7XG4gIH1cbiAgYXBwbHlUcmFuc2Zlck1hcHNUb0JpdG1hcChpbWdEYXRhKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPT09IFwibm9uZVwiKSB7XG4gICAgICByZXR1cm4gaW1nRGF0YS5iaXRtYXA7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGJpdG1hcCxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGltZ0RhdGE7XG4gICAgY29uc3QgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJpbmxpbmVJbWFnZVwiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICB0bXBDdHguZmlsdGVyID0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcztcbiAgICB0bXBDdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCk7XG4gICAgdG1wQ3R4LmZpbHRlciA9IFwibm9uZVwiO1xuICAgIHJldHVybiB0bXBDYW52YXMuY2FudmFzO1xuICB9XG4gIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIHRoaXMuc2F2ZSgpO1xuICAgIGlmICghaXNOb2RlSlMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZmlsdGVyXG4gICAgICB9ID0gY3R4O1xuICAgICAgaWYgKGZpbHRlciAhPT0gXCJub25lXCIgJiYgZmlsdGVyICE9PSBcIlwiKSB7XG4gICAgICAgIGN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgY3R4LnNjYWxlKDEgLyB3aWR0aCwgLTEgLyBoZWlnaHQpO1xuICAgIGxldCBpbWdUb1BhaW50O1xuICAgIGlmIChpbWdEYXRhLmJpdG1hcCkge1xuICAgICAgaW1nVG9QYWludCA9IHRoaXMuYXBwbHlUcmFuc2Zlck1hcHNUb0JpdG1hcChpbWdEYXRhKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIGltZ0RhdGEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAhaW1nRGF0YS5kYXRhKSB7XG4gICAgICBpbWdUb1BhaW50ID0gaW1nRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJpbmxpbmVJbWFnZVwiLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuICAgICAgcHV0QmluYXJ5SW1hZ2VEYXRhKHRtcEN0eCwgaW1nRGF0YSk7XG4gICAgICBpbWdUb1BhaW50ID0gdGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQ2FudmFzKHRtcEN0eCk7XG4gICAgfVxuICAgIGNvbnN0IHNjYWxlZCA9IHRoaXMuX3NjYWxlSW1hZ2UoaW1nVG9QYWludCwgZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UoY3R4KSk7XG4gICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGdldEltYWdlU21vb3RoaW5nRW5hYmxlZChnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCksIGltZ0RhdGEuaW50ZXJwb2xhdGUpO1xuICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhjdHgsIHNjYWxlZC5pbWcsIDAsIDAsIHNjYWxlZC5wYWludFdpZHRoLCBzY2FsZWQucGFpbnRIZWlnaHQsIDAsIC1oZWlnaHQsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHRoaXMuY29tcG9zZSgpO1xuICAgIHRoaXMucmVzdG9yZSgpO1xuICB9XG4gIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAoaW1nRGF0YSwgbWFwKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGxldCBpbWdUb1BhaW50O1xuICAgIGlmIChpbWdEYXRhLmJpdG1hcCkge1xuICAgICAgaW1nVG9QYWludCA9IGltZ0RhdGEuYml0bWFwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB3ID0gaW1nRGF0YS53aWR0aDtcbiAgICAgIGNvbnN0IGggPSBpbWdEYXRhLmhlaWdodDtcbiAgICAgIGNvbnN0IHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgdywgaCk7XG4gICAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcbiAgICAgIHB1dEJpbmFyeUltYWdlRGF0YSh0bXBDdHgsIGltZ0RhdGEpO1xuICAgICAgaW1nVG9QYWludCA9IHRoaXMuYXBwbHlUcmFuc2Zlck1hcHNUb0NhbnZhcyh0bXBDdHgpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG1hcCkge1xuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIGN0eC50cmFuc2Zvcm0oLi4uZW50cnkudHJhbnNmb3JtKTtcbiAgICAgIGN0eC5zY2FsZSgxLCAtMSk7XG4gICAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoY3R4LCBpbWdUb1BhaW50LCBlbnRyeS54LCBlbnRyeS55LCBlbnRyeS53LCBlbnRyeS5oLCAwLCAtMSwgMSwgMSk7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvc2UoKTtcbiAgfVxuICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuICAgIHRoaXMuY29tcG9zZSgpO1xuICB9XG4gIG1hcmtQb2ludCh0YWcpIHt9XG4gIG1hcmtQb2ludFByb3BzKHRhZywgcHJvcGVydGllcykge31cbiAgYmVnaW5NYXJrZWRDb250ZW50KHRhZykge1xuICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe1xuICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIGJlZ2luTWFya2VkQ29udGVudFByb3BzKHRhZywgcHJvcGVydGllcykge1xuICAgIGlmICh0YWcgPT09IFwiT0NcIikge1xuICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICAgIHZpc2libGU6IHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLmlzVmlzaWJsZShwcm9wZXJ0aWVzKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe1xuICAgICAgICB2aXNpYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRoaXMuaXNDb250ZW50VmlzaWJsZSgpO1xuICB9XG4gIGVuZE1hcmtlZENvbnRlbnQoKSB7XG4gICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucG9wKCk7XG4gICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRoaXMuaXNDb250ZW50VmlzaWJsZSgpO1xuICB9XG4gIGJlZ2luQ29tcGF0KCkge31cbiAgZW5kQ29tcGF0KCkge31cbiAgY29uc3VtZVBhdGgoY2xpcEJveCkge1xuICAgIGNvbnN0IGlzRW1wdHkgPSB0aGlzLmN1cnJlbnQuaXNFbXB0eUNsaXAoKTtcbiAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgdGhpcy5jdXJyZW50LnVwZGF0ZUNsaXBGcm9tUGF0aCgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgIHRoaXMuY29tcG9zZShjbGlwQm94KTtcbiAgICB9XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgIGlmICghaXNFbXB0eSkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCA9PT0gRU9fQ0xJUCkge1xuICAgICAgICAgIGN0eC5jbGlwKFwiZXZlbm9kZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdHguY2xpcCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50LnN0YXJ0TmV3UGF0aEFuZENsaXBCb3godGhpcy5jdXJyZW50LmNsaXBCb3gpO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgfVxuICBnZXRTaW5nbGVQaXhlbFdpZHRoKCkge1xuICAgIGlmICghdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCkge1xuICAgICAgY29uc3QgbSA9IGdldEN1cnJlbnRUcmFuc2Zvcm0odGhpcy5jdHgpO1xuICAgICAgaWYgKG1bMV0gPT09IDAgJiYgbVsyXSA9PT0gMCkge1xuICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gMSAvIE1hdGgubWluKE1hdGguYWJzKG1bMF0pLCBNYXRoLmFicyhtWzNdKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhYnNEZXQgPSBNYXRoLmFicyhtWzBdICogbVszXSAtIG1bMl0gKiBtWzFdKTtcbiAgICAgICAgY29uc3Qgbm9ybVggPSBNYXRoLmh5cG90KG1bMF0sIG1bMl0pO1xuICAgICAgICBjb25zdCBub3JtWSA9IE1hdGguaHlwb3QobVsxXSwgbVszXSk7XG4gICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBNYXRoLm1heChub3JtWCwgbm9ybVkpIC8gYWJzRGV0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aDtcbiAgfVxuICBnZXRTY2FsZUZvclN0cm9raW5nKCkge1xuICAgIGlmICh0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdID09PSAtMSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBsaW5lV2lkdGhcbiAgICAgIH0gPSB0aGlzLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGEsXG4gICAgICAgIGIsXG4gICAgICAgIGMsXG4gICAgICAgIGRcbiAgICAgIH0gPSB0aGlzLmN0eC5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgIGxldCBzY2FsZVgsIHNjYWxlWTtcbiAgICAgIGlmIChiID09PSAwICYmIGMgPT09IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybVggPSBNYXRoLmFicyhhKTtcbiAgICAgICAgY29uc3Qgbm9ybVkgPSBNYXRoLmFicyhkKTtcbiAgICAgICAgaWYgKG5vcm1YID09PSBub3JtWSkge1xuICAgICAgICAgIGlmIChsaW5lV2lkdGggPT09IDApIHtcbiAgICAgICAgICAgIHNjYWxlWCA9IHNjYWxlWSA9IDEgLyBub3JtWDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2NhbGVkTGluZVdpZHRoID0gbm9ybVggKiBsaW5lV2lkdGg7XG4gICAgICAgICAgICBzY2FsZVggPSBzY2FsZVkgPSBzY2FsZWRMaW5lV2lkdGggPCAxID8gMSAvIHNjYWxlZExpbmVXaWR0aCA6IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGxpbmVXaWR0aCA9PT0gMCkge1xuICAgICAgICAgIHNjYWxlWCA9IDEgLyBub3JtWDtcbiAgICAgICAgICBzY2FsZVkgPSAxIC8gbm9ybVk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2NhbGVkWExpbmVXaWR0aCA9IG5vcm1YICogbGluZVdpZHRoO1xuICAgICAgICAgIGNvbnN0IHNjYWxlZFlMaW5lV2lkdGggPSBub3JtWSAqIGxpbmVXaWR0aDtcbiAgICAgICAgICBzY2FsZVggPSBzY2FsZWRYTGluZVdpZHRoIDwgMSA/IDEgLyBzY2FsZWRYTGluZVdpZHRoIDogMTtcbiAgICAgICAgICBzY2FsZVkgPSBzY2FsZWRZTGluZVdpZHRoIDwgMSA/IDEgLyBzY2FsZWRZTGluZVdpZHRoIDogMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYWJzRGV0ID0gTWF0aC5hYnMoYSAqIGQgLSBiICogYyk7XG4gICAgICAgIGNvbnN0IG5vcm1YID0gTWF0aC5oeXBvdChhLCBiKTtcbiAgICAgICAgY29uc3Qgbm9ybVkgPSBNYXRoLmh5cG90KGMsIGQpO1xuICAgICAgICBpZiAobGluZVdpZHRoID09PSAwKSB7XG4gICAgICAgICAgc2NhbGVYID0gbm9ybVkgLyBhYnNEZXQ7XG4gICAgICAgICAgc2NhbGVZID0gbm9ybVggLyBhYnNEZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYmFzZUFyZWEgPSBsaW5lV2lkdGggKiBhYnNEZXQ7XG4gICAgICAgICAgc2NhbGVYID0gbm9ybVkgPiBiYXNlQXJlYSA/IG5vcm1ZIC8gYmFzZUFyZWEgOiAxO1xuICAgICAgICAgIHNjYWxlWSA9IG5vcm1YID4gYmFzZUFyZWEgPyBub3JtWCAvIGJhc2VBcmVhIDogMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IHNjYWxlWDtcbiAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMV0gPSBzY2FsZVk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nO1xuICB9XG4gIHJlc2NhbGVBbmRTdHJva2Uoc2F2ZVJlc3RvcmUpIHtcbiAgICBjb25zdCB7XG4gICAgICBjdHhcbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCB7XG4gICAgICBsaW5lV2lkdGhcbiAgICB9ID0gdGhpcy5jdXJyZW50O1xuICAgIGNvbnN0IFtzY2FsZVgsIHNjYWxlWV0gPSB0aGlzLmdldFNjYWxlRm9yU3Ryb2tpbmcoKTtcbiAgICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoIHx8IDE7XG4gICAgaWYgKHNjYWxlWCA9PT0gMSAmJiBzY2FsZVkgPT09IDEpIHtcbiAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGFzaGVzID0gY3R4LmdldExpbmVEYXNoKCk7XG4gICAgaWYgKHNhdmVSZXN0b3JlKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgIH1cbiAgICBjdHguc2NhbGUoc2NhbGVYLCBzY2FsZVkpO1xuICAgIGlmIChkYXNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1heChzY2FsZVgsIHNjYWxlWSk7XG4gICAgICBjdHguc2V0TGluZURhc2goZGFzaGVzLm1hcCh4ID0+IHggLyBzY2FsZSkpO1xuICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0IC89IHNjYWxlO1xuICAgIH1cbiAgICBjdHguc3Ryb2tlKCk7XG4gICAgaWYgKHNhdmVSZXN0b3JlKSB7XG4gICAgICBjdHgucmVzdG9yZSgpO1xuICAgIH1cbiAgfVxuICBpc0NvbnRlbnRWaXNpYmxlKCkge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKCF0aGlzLm1hcmtlZENvbnRlbnRTdGFja1tpXS52aXNpYmxlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbmZvciAoY29uc3Qgb3AgaW4gT1BTKSB7XG4gIGlmIChDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbb3BdICE9PSB1bmRlZmluZWQpIHtcbiAgICBDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbT1BTW29wXV0gPSBDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbb3BdO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L3dvcmtlcl9vcHRpb25zLmpzXG5jbGFzcyBHbG9iYWxXb3JrZXJPcHRpb25zIHtcbiAgc3RhdGljICNwb3J0ID0gbnVsbDtcbiAgc3RhdGljICNzcmMgPSBcIlwiO1xuICBzdGF0aWMgZ2V0IHdvcmtlclBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3BvcnQ7XG4gIH1cbiAgc3RhdGljIHNldCB3b3JrZXJQb3J0KHZhbCkge1xuICAgIGlmICghKHR5cGVvZiBXb3JrZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsIGluc3RhbmNlb2YgV29ya2VyKSAmJiB2YWwgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYHdvcmtlclBvcnRgIHR5cGUuXCIpO1xuICAgIH1cbiAgICB0aGlzLiNwb3J0ID0gdmFsO1xuICB9XG4gIHN0YXRpYyBnZXQgd29ya2VyU3JjKCkge1xuICAgIHJldHVybiB0aGlzLiNzcmM7XG4gIH1cbiAgc3RhdGljIHNldCB3b3JrZXJTcmModmFsKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYHdvcmtlclNyY2AgdHlwZS5cIik7XG4gICAgfVxuICAgIHRoaXMuI3NyYyA9IHZhbDtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5qc1xuXG5jb25zdCBDYWxsYmFja0tpbmQgPSB7XG4gIFVOS05PV046IDAsXG4gIERBVEE6IDEsXG4gIEVSUk9SOiAyXG59O1xuY29uc3QgU3RyZWFtS2luZCA9IHtcbiAgVU5LTk9XTjogMCxcbiAgQ0FOQ0VMOiAxLFxuICBDQU5DRUxfQ09NUExFVEU6IDIsXG4gIENMT1NFOiAzLFxuICBFTlFVRVVFOiA0LFxuICBFUlJPUjogNSxcbiAgUFVMTDogNixcbiAgUFVMTF9DT01QTEVURTogNyxcbiAgU1RBUlRfQ09NUExFVEU6IDhcbn07XG5mdW5jdGlvbiB3cmFwUmVhc29uKHJlYXNvbikge1xuICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgcmVhc29uID09PSBcIm9iamVjdFwiICYmIHJlYXNvbiAhPT0gbnVsbCkpIHtcbiAgICB1bnJlYWNoYWJsZSgnd3JhcFJlYXNvbjogRXhwZWN0ZWQgXCJyZWFzb25cIiB0byBiZSBhIChwb3NzaWJseSBjbG9uZWQpIEVycm9yLicpO1xuICB9XG4gIHN3aXRjaCAocmVhc29uLm5hbWUpIHtcbiAgICBjYXNlIFwiQWJvcnRFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgQWJvcnRFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpO1xuICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpO1xuICAgIGNhc2UgXCJQYXNzd29yZEV4Y2VwdGlvblwiOlxuICAgICAgcmV0dXJuIG5ldyBQYXNzd29yZEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmNvZGUpO1xuICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uc3RhdHVzKTtcbiAgICBjYXNlIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCI6XG4gICAgICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmRldGFpbHMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLnRvU3RyaW5nKCkpO1xuICB9XG59XG5jbGFzcyBNZXNzYWdlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZU5hbWUsIHRhcmdldE5hbWUsIGNvbU9iaikge1xuICAgIHRoaXMuc291cmNlTmFtZSA9IHNvdXJjZU5hbWU7XG4gICAgdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTtcbiAgICB0aGlzLmNvbU9iaiA9IGNvbU9iajtcbiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxO1xuICAgIHRoaXMuc3RyZWFtSWQgPSAxO1xuICAgIHRoaXMuc3RyZWFtU2lua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuYWN0aW9uSGFuZGxlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSBldmVudCA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgIGlmIChkYXRhLnRhcmdldE5hbWUgIT09IHRoaXMuc291cmNlTmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5zdHJlYW0pIHtcbiAgICAgICAgdGhpcy4jcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrSWQgPSBkYXRhLmNhbGxiYWNrSWQ7XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdO1xuICAgICAgICBpZiAoIWNhcGFiaWxpdHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGNhbGxiYWNrICR7Y2FsbGJhY2tJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTtcbiAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5EQVRBKSB7XG4gICAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEuZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkVSUk9SKSB7XG4gICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgY2FsbGJhY2sgY2FzZVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dO1xuICAgICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogJHtkYXRhLmFjdGlvbn1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmNhbGxiYWNrSWQpIHtcbiAgICAgICAgY29uc3QgY2JTb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lO1xuICAgICAgICBjb25zdCBjYlRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7XG4gICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhKSk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiBjYlNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsXG4gICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkRBVEEsXG4gICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsXG4gICAgICAgICAgICBkYXRhOiByZXN1bHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiBjYlNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsXG4gICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkVSUk9SLFxuICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLFxuICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLnN0cmVhbUlkKSB7XG4gICAgICAgIHRoaXMuI2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFjdGlvbihkYXRhLmRhdGEpO1xuICAgIH07XG4gICAgY29tT2JqLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTtcbiAgfVxuICBvbihhY3Rpb25OYW1lLCBoYW5kbGVyKSB7XG4gICAgY29uc3QgYWggPSB0aGlzLmFjdGlvbkhhbmRsZXI7XG4gICAgaWYgKGFoW2FjdGlvbk5hbWVdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgXCIke2FjdGlvbk5hbWV9XCJgKTtcbiAgICB9XG4gICAgYWhbYWN0aW9uTmFtZV0gPSBoYW5kbGVyO1xuICB9XG4gIHNlbmQoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7XG4gICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLFxuICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuICAgICAgZGF0YVxuICAgIH0sIHRyYW5zZmVycyk7XG4gIH1cbiAgc2VuZFdpdGhQcm9taXNlKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykge1xuICAgIGNvbnN0IGNhbGxiYWNrSWQgPSB0aGlzLmNhbGxiYWNrSWQrKztcbiAgICBjb25zdCBjYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXSA9IGNhcGFiaWxpdHk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG4gICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSxcbiAgICAgICAgY2FsbGJhY2tJZCxcbiAgICAgICAgZGF0YVxuICAgICAgfSwgdHJhbnNmZXJzKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY2FwYWJpbGl0eS5yZWplY3QoZXgpO1xuICAgIH1cbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIHNlbmRXaXRoU3RyZWFtKGFjdGlvbk5hbWUsIGRhdGEsIHF1ZXVlaW5nU3RyYXRlZ3ksIHRyYW5zZmVycykge1xuICAgIGNvbnN0IHN0cmVhbUlkID0gdGhpcy5zdHJlYW1JZCsrLFxuICAgICAgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSxcbiAgICAgIHRhcmdldE5hbWUgPSB0aGlzLnRhcmdldE5hbWUsXG4gICAgICBjb21PYmogPSB0aGlzLmNvbU9iajtcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgIHN0YXJ0OiBjb250cm9sbGVyID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdID0ge1xuICAgICAgICAgIGNvbnRyb2xsZXIsXG4gICAgICAgICAgc3RhcnRDYWxsOiBzdGFydENhcGFiaWxpdHksXG4gICAgICAgICAgcHVsbENhbGw6IG51bGwsXG4gICAgICAgICAgY2FuY2VsQ2FsbDogbnVsbCxcbiAgICAgICAgICBpc0Nsb3NlZDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemVcbiAgICAgICAgfSwgdHJhbnNmZXJzKTtcbiAgICAgICAgcmV0dXJuIHN0YXJ0Q2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgfSxcbiAgICAgIHB1bGw6IGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICBjb25zdCBwdWxsQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCA9IHB1bGxDYXBhYmlsaXR5O1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTCxcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHB1bGxDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICB9LFxuICAgICAgY2FuY2VsOiByZWFzb24gPT4ge1xuICAgICAgICBhc3NlcnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsIFwiY2FuY2VsIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvblwiKTtcbiAgICAgICAgY29uc3QgY2FuY2VsQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5jYW5jZWxDYWxsID0gY2FuY2VsQ2FwYWJpbGl0eTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2FuY2VsQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgfVxuICAgIH0sIHF1ZXVlaW5nU3RyYXRlZ3kpO1xuICB9XG4gICNjcmVhdGVTdHJlYW1TaW5rKGRhdGEpIHtcbiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsXG4gICAgICBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lLFxuICAgICAgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZSxcbiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzLFxuICAgICAgYWN0aW9uID0gdGhpcy5hY3Rpb25IYW5kbGVyW2RhdGEuYWN0aW9uXTtcbiAgICBjb25zdCBzdHJlYW1TaW5rID0ge1xuICAgICAgZW5xdWV1ZShjaHVuaywgc2l6ZSA9IDEsIHRyYW5zZmVycykge1xuICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXN0RGVzaXJlZFNpemUgPSB0aGlzLmRlc2lyZWRTaXplO1xuICAgICAgICB0aGlzLmRlc2lyZWRTaXplIC09IHNpemU7XG4gICAgICAgIGlmIChsYXN0RGVzaXJlZFNpemUgPiAwICYmIHRoaXMuZGVzaXJlZFNpemUgPD0gMCkge1xuICAgICAgICAgIHRoaXMuc2lua0NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5FTlFVRVVFLFxuICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgIGNodW5rXG4gICAgICAgIH0sIHRyYW5zZmVycyk7XG4gICAgICB9LFxuICAgICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0xPU0UsXG4gICAgICAgICAgc3RyZWFtSWRcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTtcbiAgICAgIH0sXG4gICAgICBlcnJvcihyZWFzb24pIHtcbiAgICAgICAgYXNzZXJ0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCBcImVycm9yIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvblwiKTtcbiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5FUlJPUixcbiAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBzaW5rQ2FwYWJpbGl0eTogUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCksXG4gICAgICBvblB1bGw6IG51bGwsXG4gICAgICBvbkNhbmNlbDogbnVsbCxcbiAgICAgIGlzQ2FuY2VsbGVkOiBmYWxzZSxcbiAgICAgIGRlc2lyZWRTaXplOiBkYXRhLmRlc2lyZWRTaXplLFxuICAgICAgcmVhZHk6IG51bGxcbiAgICB9O1xuICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgIHN0cmVhbVNpbmsucmVhZHkgPSBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0gPSBzdHJlYW1TaW5rO1xuICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKGFjdGlvbihkYXRhLmRhdGEsIHN0cmVhbVNpbmspKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSxcbiAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgIH0pO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSxcbiAgICAgICAgc3RyZWFtSWQsXG4gICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAjcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSkge1xuICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZCxcbiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lLFxuICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7XG4gICAgY29uc3Qgc3RyZWFtQ29udHJvbGxlciA9IHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLFxuICAgICAgc3RyZWFtU2luayA9IHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdO1xuICAgIHN3aXRjaCAoZGF0YS5zdHJlYW0pIHtcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURTpcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnN0YXJ0Q2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEU6XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTDpcbiAgICAgICAgaWYgKCFzdHJlYW1TaW5rKSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RyZWFtU2luay5kZXNpcmVkU2l6ZSA8PSAwICYmIGRhdGEuZGVzaXJlZFNpemUgPiAwKSB7XG4gICAgICAgICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtU2luay5kZXNpcmVkU2l6ZSA9IGRhdGEuZGVzaXJlZFNpemU7XG4gICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShzdHJlYW1TaW5rLm9uUHVsbD8uKCkpO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgc291cmNlTmFtZSxcbiAgICAgICAgICAgIHRhcmdldE5hbWUsXG4gICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSxcbiAgICAgICAgICAgIHN0cmVhbUlkLFxuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lLFxuICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5FTlFVRVVFOlxuICAgICAgICBhc3NlcnQoc3RyZWFtQ29udHJvbGxlciwgXCJlbnF1ZXVlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyXCIpO1xuICAgICAgICBpZiAoc3RyZWFtQ29udHJvbGxlci5pc0Nsb3NlZCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5lbnF1ZXVlKGRhdGEuY2h1bmspO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RyZWFtS2luZC5DTE9TRTpcbiAgICAgICAgYXNzZXJ0KHN0cmVhbUNvbnRyb2xsZXIsIFwiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG4gICAgICAgIGlmIChzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtQ29udHJvbGxlci5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuRVJST1I6XG4gICAgICAgIGFzc2VydChzdHJlYW1Db250cm9sbGVyLCBcImVycm9yIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyXCIpO1xuICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFOlxuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jYW5jZWxDYWxsLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNhbmNlbENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMOlxuICAgICAgICBpZiAoIXN0cmVhbVNpbmspIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlc29sdmUoc3RyZWFtU2luay5vbkNhbmNlbD8uKHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKSk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZSxcbiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsXG4gICAgICAgICAgICBzdHJlYW1JZCxcbiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG4gICAgICAgIHN0cmVhbVNpbmsuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICBkZWxldGUgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBzdHJlYW0gY2FzZVwiKTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3N0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsPy5wcm9taXNlLCBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsPy5wcm9taXNlLCBzdHJlYW1Db250cm9sbGVyLmNhbmNlbENhbGw/LnByb21pc2VdKTtcbiAgICBkZWxldGUgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF07XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbU9iai5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvbWV0YWRhdGEuanNcblxuY2xhc3MgTWV0YWRhdGEge1xuICAjbWV0YWRhdGFNYXA7XG4gICNkYXRhO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgcGFyc2VkRGF0YSxcbiAgICByYXdEYXRhXG4gIH0pIHtcbiAgICB0aGlzLiNtZXRhZGF0YU1hcCA9IHBhcnNlZERhdGE7XG4gICAgdGhpcy4jZGF0YSA9IHJhd0RhdGE7XG4gIH1cbiAgZ2V0UmF3KCkge1xuICAgIHJldHVybiB0aGlzLiNkYXRhO1xuICB9XG4gIGdldChuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuI21ldGFkYXRhTWFwLmdldChuYW1lKSA/PyBudWxsO1xuICB9XG4gIGdldEFsbCgpIHtcbiAgICByZXR1cm4gb2JqZWN0RnJvbU1hcCh0aGlzLiNtZXRhZGF0YU1hcCk7XG4gIH1cbiAgaGFzKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy4jbWV0YWRhdGFNYXAuaGFzKG5hbWUpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L29wdGlvbmFsX2NvbnRlbnRfY29uZmlnLmpzXG5cblxuY29uc3QgSU5URVJOQUwgPSBTeW1ib2woXCJJTlRFUk5BTFwiKTtcbmNsYXNzIE9wdGlvbmFsQ29udGVudEdyb3VwIHtcbiAgI2lzRGlzcGxheSA9IGZhbHNlO1xuICAjaXNQcmludCA9IGZhbHNlO1xuICAjdXNlclNldCA9IGZhbHNlO1xuICAjdmlzaWJsZSA9IHRydWU7XG4gIGNvbnN0cnVjdG9yKHJlbmRlcmluZ0ludGVudCwge1xuICAgIG5hbWUsXG4gICAgaW50ZW50LFxuICAgIHVzYWdlXG4gIH0pIHtcbiAgICB0aGlzLiNpc0Rpc3BsYXkgPSAhIShyZW5kZXJpbmdJbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVkpO1xuICAgIHRoaXMuI2lzUHJpbnQgPSAhIShyZW5kZXJpbmdJbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuaW50ZW50ID0gaW50ZW50O1xuICAgIHRoaXMudXNhZ2UgPSB1c2FnZTtcbiAgfVxuICBnZXQgdmlzaWJsZSgpIHtcbiAgICBpZiAodGhpcy4jdXNlclNldCkge1xuICAgICAgcmV0dXJuIHRoaXMuI3Zpc2libGU7XG4gICAgfVxuICAgIGlmICghdGhpcy4jdmlzaWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBwcmludCxcbiAgICAgIHZpZXdcbiAgICB9ID0gdGhpcy51c2FnZTtcbiAgICBpZiAodGhpcy4jaXNEaXNwbGF5KSB7XG4gICAgICByZXR1cm4gdmlldz8udmlld1N0YXRlICE9PSBcIk9GRlwiO1xuICAgIH0gZWxzZSBpZiAodGhpcy4jaXNQcmludCkge1xuICAgICAgcmV0dXJuIHByaW50Py5wcmludFN0YXRlICE9PSBcIk9GRlwiO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBfc2V0VmlzaWJsZShpbnRlcm5hbCwgdmlzaWJsZSwgdXNlclNldCA9IGZhbHNlKSB7XG4gICAgaWYgKGludGVybmFsICE9PSBJTlRFUk5BTCkge1xuICAgICAgdW5yZWFjaGFibGUoXCJJbnRlcm5hbCBtZXRob2QgYF9zZXRWaXNpYmxlYCBjYWxsZWQuXCIpO1xuICAgIH1cbiAgICB0aGlzLiN1c2VyU2V0ID0gdXNlclNldDtcbiAgICB0aGlzLiN2aXNpYmxlID0gdmlzaWJsZTtcbiAgfVxufVxuY2xhc3MgT3B0aW9uYWxDb250ZW50Q29uZmlnIHtcbiAgI2NhY2hlZEdldEhhc2ggPSBudWxsO1xuICAjZ3JvdXBzID0gbmV3IE1hcCgpO1xuICAjaW5pdGlhbEhhc2ggPSBudWxsO1xuICAjb3JkZXIgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihkYXRhLCByZW5kZXJpbmdJbnRlbnQgPSBSZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVkpIHtcbiAgICB0aGlzLnJlbmRlcmluZ0ludGVudCA9IHJlbmRlcmluZ0ludGVudDtcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgIHRoaXMuY3JlYXRvciA9IG51bGw7XG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMuY3JlYXRvciA9IGRhdGEuY3JlYXRvcjtcbiAgICB0aGlzLiNvcmRlciA9IGRhdGEub3JkZXI7XG4gICAgZm9yIChjb25zdCBncm91cCBvZiBkYXRhLmdyb3Vwcykge1xuICAgICAgdGhpcy4jZ3JvdXBzLnNldChncm91cC5pZCwgbmV3IE9wdGlvbmFsQ29udGVudEdyb3VwKHJlbmRlcmluZ0ludGVudCwgZ3JvdXApKTtcbiAgICB9XG4gICAgaWYgKGRhdGEuYmFzZVN0YXRlID09PSBcIk9GRlwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuI2dyb3Vwcy52YWx1ZXMoKSkge1xuICAgICAgICBncm91cC5fc2V0VmlzaWJsZShJTlRFUk5BTCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9uIG9mIGRhdGEub24pIHtcbiAgICAgIHRoaXMuI2dyb3Vwcy5nZXQob24pLl9zZXRWaXNpYmxlKElOVEVSTkFMLCB0cnVlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvZmYgb2YgZGF0YS5vZmYpIHtcbiAgICAgIHRoaXMuI2dyb3Vwcy5nZXQob2ZmKS5fc2V0VmlzaWJsZShJTlRFUk5BTCwgZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLiNpbml0aWFsSGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuICB9XG4gICNldmFsdWF0ZVZpc2liaWxpdHlFeHByZXNzaW9uKGFycmF5KSB7XG4gICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBhcnJheVswXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaV07XG4gICAgICBsZXQgc3RhdGU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50KSkge1xuICAgICAgICBzdGF0ZSA9IHRoaXMuI2V2YWx1YXRlVmlzaWJpbGl0eUV4cHJlc3Npb24oZWxlbWVudCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI2dyb3Vwcy5oYXMoZWxlbWVudCkpIHtcbiAgICAgICAgc3RhdGUgPSB0aGlzLiNncm91cHMuZ2V0KGVsZW1lbnQpLnZpc2libGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtlbGVtZW50fWApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSBcIkFuZFwiOlxuICAgICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJPclwiOlxuICAgICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTm90XCI6XG4gICAgICAgICAgcmV0dXJuICFzdGF0ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9wZXJhdG9yID09PSBcIkFuZFwiO1xuICB9XG4gIGlzVmlzaWJsZShncm91cCkge1xuICAgIGlmICh0aGlzLiNncm91cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghZ3JvdXApIHtcbiAgICAgIGluZm8oXCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZ3JvdXAudHlwZSA9PT0gXCJPQ0dcIikge1xuICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtncm91cC5pZH1gKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy4jZ3JvdXBzLmdldChncm91cC5pZCkudmlzaWJsZTtcbiAgICB9IGVsc2UgaWYgKGdyb3VwLnR5cGUgPT09IFwiT0NNRFwiKSB7XG4gICAgICBpZiAoZ3JvdXAuZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXZhbHVhdGVWaXNpYmlsaXR5RXhwcmVzc2lvbihncm91cC5leHByZXNzaW9uKTtcbiAgICAgIH1cbiAgICAgIGlmICghZ3JvdXAucG9saWN5IHx8IGdyb3VwLnBvbGljeSA9PT0gXCJBbnlPblwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuI2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGdyb3VwLnBvbGljeSA9PT0gXCJBbGxPblwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgd2FybihgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09IFwiQW55T2ZmXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB3YXJuKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGdyb3VwLnBvbGljeSA9PT0gXCJBbGxPZmZcIikge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdyb3VwLmlkcykge1xuICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLiNncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgd2FybihgVW5rbm93biBvcHRpb25hbCBjb250ZW50IHBvbGljeSAke2dyb3VwLnBvbGljeX0uYCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgd2FybihgVW5rbm93biBncm91cCB0eXBlICR7Z3JvdXAudHlwZX0uYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc2V0VmlzaWJpbGl0eShpZCwgdmlzaWJsZSA9IHRydWUpIHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuI2dyb3Vwcy5nZXQoaWQpO1xuICAgIGlmICghZ3JvdXApIHtcbiAgICAgIHdhcm4oYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBncm91cC5fc2V0VmlzaWJsZShJTlRFUk5BTCwgISF2aXNpYmxlLCB0cnVlKTtcbiAgICB0aGlzLiNjYWNoZWRHZXRIYXNoID0gbnVsbDtcbiAgfVxuICBzZXRPQ0dTdGF0ZSh7XG4gICAgc3RhdGUsXG4gICAgcHJlc2VydmVSQlxuICB9KSB7XG4gICAgbGV0IG9wZXJhdG9yO1xuICAgIGZvciAoY29uc3QgZWxlbSBvZiBzdGF0ZSkge1xuICAgICAgc3dpdGNoIChlbGVtKSB7XG4gICAgICAgIGNhc2UgXCJPTlwiOlxuICAgICAgICBjYXNlIFwiT0ZGXCI6XG4gICAgICAgIGNhc2UgXCJUb2dnbGVcIjpcbiAgICAgICAgICBvcGVyYXRvciA9IGVsZW07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuI2dyb3Vwcy5nZXQoZWxlbSk7XG4gICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICBjYXNlIFwiT05cIjpcbiAgICAgICAgICBncm91cC5fc2V0VmlzaWJsZShJTlRFUk5BTCwgdHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJPRkZcIjpcbiAgICAgICAgICBncm91cC5fc2V0VmlzaWJsZShJTlRFUk5BTCwgZmFsc2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiVG9nZ2xlXCI6XG4gICAgICAgICAgZ3JvdXAuX3NldFZpc2libGUoSU5URVJOQUwsICFncm91cC52aXNpYmxlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jY2FjaGVkR2V0SGFzaCA9IG51bGw7XG4gIH1cbiAgZ2V0IGhhc0luaXRpYWxWaXNpYmlsaXR5KCkge1xuICAgIHJldHVybiB0aGlzLiNpbml0aWFsSGFzaCA9PT0gbnVsbCB8fCB0aGlzLmdldEhhc2goKSA9PT0gdGhpcy4jaW5pdGlhbEhhc2g7XG4gIH1cbiAgZ2V0T3JkZXIoKSB7XG4gICAgaWYgKCF0aGlzLiNncm91cHMuc2l6ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLiNvcmRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuI29yZGVyLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBbLi4udGhpcy4jZ3JvdXBzLmtleXMoKV07XG4gIH1cbiAgZ2V0R3JvdXBzKCkge1xuICAgIHJldHVybiB0aGlzLiNncm91cHMuc2l6ZSA+IDAgPyBvYmplY3RGcm9tTWFwKHRoaXMuI2dyb3VwcykgOiBudWxsO1xuICB9XG4gIGdldEdyb3VwKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuI2dyb3Vwcy5nZXQoaWQpIHx8IG51bGw7XG4gIH1cbiAgZ2V0SGFzaCgpIHtcbiAgICBpZiAodGhpcy4jY2FjaGVkR2V0SGFzaCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuI2NhY2hlZEdldEhhc2g7XG4gICAgfVxuICAgIGNvbnN0IGhhc2ggPSBuZXcgTXVybXVySGFzaDNfNjQoKTtcbiAgICBmb3IgKGNvbnN0IFtpZCwgZ3JvdXBdIG9mIHRoaXMuI2dyb3Vwcykge1xuICAgICAgaGFzaC51cGRhdGUoYCR7aWR9OiR7Z3JvdXAudmlzaWJsZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlZEdldEhhc2ggPSBoYXNoLmhleGRpZ2VzdCgpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L3RyYW5zcG9ydF9zdHJlYW0uanNcblxuXG5jbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtIHtcbiAgY29uc3RydWN0b3IocGRmRGF0YVJhbmdlVHJhbnNwb3J0LCB7XG4gICAgZGlzYWJsZVJhbmdlID0gZmFsc2UsXG4gICAgZGlzYWJsZVN0cmVhbSA9IGZhbHNlXG4gIH0pIHtcbiAgICBhc3NlcnQocGRmRGF0YVJhbmdlVHJhbnNwb3J0LCAnUERGRGF0YVRyYW5zcG9ydFN0cmVhbSAtIG1pc3NpbmcgcmVxdWlyZWQgXCJwZGZEYXRhUmFuZ2VUcmFuc3BvcnRcIiBhcmd1bWVudC4nKTtcbiAgICBjb25zdCB7XG4gICAgICBsZW5ndGgsXG4gICAgICBpbml0aWFsRGF0YSxcbiAgICAgIHByb2dyZXNzaXZlRG9uZSxcbiAgICAgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lXG4gICAgfSA9IHBkZkRhdGFSYW5nZVRyYW5zcG9ydDtcbiAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBbXTtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmUgPSBwcm9ncmVzc2l2ZURvbmU7XG4gICAgdGhpcy5fY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTtcbiAgICBpZiAoaW5pdGlhbERhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGluaXRpYWxEYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBpbml0aWFsRGF0YS5ieXRlTGVuZ3RoID09PSBpbml0aWFsRGF0YS5idWZmZXIuYnl0ZUxlbmd0aCA/IGluaXRpYWxEYXRhLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KGluaXRpYWxEYXRhKS5idWZmZXI7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChidWZmZXIpO1xuICAgIH1cbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQ7XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhZGlzYWJsZVN0cmVhbTtcbiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIWRpc2FibGVSYW5nZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gbGVuZ3RoO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9yYW5nZVJlYWRlcnMgPSBbXTtcbiAgICBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUmFuZ2VMaXN0ZW5lcigoYmVnaW4sIGNodW5rKSA9PiB7XG4gICAgICB0aGlzLl9vblJlY2VpdmVEYXRhKHtcbiAgICAgICAgYmVnaW4sXG4gICAgICAgIGNodW5rXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NMaXN0ZW5lcigobG9hZGVkLCB0b3RhbCkgPT4ge1xuICAgICAgdGhpcy5fb25Qcm9ncmVzcyh7XG4gICAgICAgIGxvYWRlZCxcbiAgICAgICAgdG90YWxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcihjaHVuayA9PiB7XG4gICAgICB0aGlzLl9vblJlY2VpdmVEYXRhKHtcbiAgICAgICAgY2h1bmtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHBkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcigoKSA9PiB7XG4gICAgICB0aGlzLl9vblByb2dyZXNzaXZlRG9uZSgpO1xuICAgIH0pO1xuICAgIHBkZkRhdGFSYW5nZVRyYW5zcG9ydC50cmFuc3BvcnRSZWFkeSgpO1xuICB9XG4gIF9vblJlY2VpdmVEYXRhKHtcbiAgICBiZWdpbixcbiAgICBjaHVua1xuICB9KSB7XG4gICAgY29uc3QgYnVmZmVyID0gY2h1bmsgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGNodW5rLmJ5dGVMZW5ndGggPT09IGNodW5rLmJ1ZmZlci5ieXRlTGVuZ3RoID8gY2h1bmsuYnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjtcbiAgICBpZiAoYmVnaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSB7XG4gICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9lbnF1ZXVlKGJ1ZmZlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChidWZmZXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmb3VuZCA9IHRoaXMuX3JhbmdlUmVhZGVycy5zb21lKGZ1bmN0aW9uIChyYW5nZVJlYWRlcikge1xuICAgICAgICBpZiAocmFuZ2VSZWFkZXIuX2JlZ2luICE9PSBiZWdpbikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByYW5nZVJlYWRlci5fZW5xdWV1ZShidWZmZXIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0KGZvdW5kLCBcIl9vblJlY2VpdmVEYXRhIC0gbm8gYFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcmAgaW5zdGFuY2UgZm91bmQuXCIpO1xuICAgIH1cbiAgfVxuICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/Ll9sb2FkZWQgPz8gMDtcbiAgfVxuICBfb25Qcm9ncmVzcyhldnQpIHtcbiAgICBpZiAoZXZ0LnRvdGFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3JhbmdlUmVhZGVyc1swXT8ub25Qcm9ncmVzcz8uKHtcbiAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/Lm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcbiAgICAgICAgdG90YWw6IGV2dC50b3RhbFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIF9vblByb2dyZXNzaXZlRG9uZSgpIHtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8ucHJvZ3Jlc3NpdmVEb25lKCk7XG4gICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gdHJ1ZTtcbiAgfVxuICBfcmVtb3ZlUmFuZ2VSZWFkZXIocmVhZGVyKSB7XG4gICAgY29uc3QgaSA9IHRoaXMuX3JhbmdlUmVhZGVycy5pbmRleE9mKHJlYWRlcik7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fcmFuZ2VSZWFkZXJzLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cbiAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICBhc3NlcnQoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERkRhdGFUcmFuc3BvcnRTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG4gICAgY29uc3QgcXVldWVkQ2h1bmtzID0gdGhpcy5fcXVldWVkQ2h1bmtzO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IG51bGw7XG4gICAgcmV0dXJuIG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyKHRoaXMsIHF1ZXVlZENodW5rcywgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lLCB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSk7XG4gIH1cbiAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkge1xuICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZShiZWdpbiwgZW5kKTtcbiAgICB0aGlzLl9yYW5nZVJlYWRlcnMucHVzaChyZWFkZXIpO1xuICAgIHJldHVybiByZWFkZXI7XG4gIH1cbiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMuX3JhbmdlUmVhZGVycy5zbGljZSgwKSkge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWJvcnQoKTtcbiAgfVxufVxuY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgcXVldWVkQ2h1bmtzLCBwcm9ncmVzc2l2ZURvbmUgPSBmYWxzZSwgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBudWxsKSB7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuX2RvbmUgPSBwcm9ncmVzc2l2ZURvbmUgfHwgZmFsc2U7XG4gICAgdGhpcy5fZmlsZW5hbWUgPSBpc1BkZkZpbGUoY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUpID8gY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgOiBudWxsO1xuICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IHF1ZXVlZENodW5rcyB8fCBbXTtcbiAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgdGhpcy5fcXVldWVkQ2h1bmtzKSB7XG4gICAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9oZWFkZXJzUmVhZHkgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBzdHJlYW0uX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcztcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIF9lbnF1ZXVlKGNodW5rKSB7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2goY2h1bmspO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgfVxuICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVhZHk7XG4gIH1cbiAgZ2V0IGZpbGVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgfVxuICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1JhbmdlU3VwcG9ydGVkO1xuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9jb250ZW50TGVuZ3RoO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3F1ZXVlZENodW5rcy5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG4gICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgfVxuICBwcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gIH1cbn1cbmNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgYmVnaW4sIGVuZCkge1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9iZWdpbiA9IGJlZ2luO1xuICAgIHRoaXMuX2VuZCA9IGVuZDtcbiAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgfVxuICBfZW5xdWV1ZShjaHVuaykge1xuICAgIGlmICh0aGlzLl9kb25lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gY2h1bms7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlcXVlc3RzQ2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICByZXF1ZXN0c0NhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIGRvbmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmspIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcbiAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX3N0cmVhbS5fcmVtb3ZlUmFuZ2VSZWFkZXIodGhpcyk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvY29udGVudF9kaXNwb3NpdGlvbi5qc1xuXG5mdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIoY29udGVudERpc3Bvc2l0aW9uKSB7XG4gIGxldCBuZWVkc0VuY29kaW5nRml4dXAgPSB0cnVlO1xuICBsZXQgdG1wID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXFxcXCpcIiwgXCJpXCIpLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTtcbiAgaWYgKHRtcCkge1xuICAgIHRtcCA9IHRtcFsxXTtcbiAgICBsZXQgZmlsZW5hbWUgPSByZmMyNjE2dW5xdW90ZSh0bXApO1xuICAgIGZpbGVuYW1lID0gdW5lc2NhcGUoZmlsZW5hbWUpO1xuICAgIGZpbGVuYW1lID0gcmZjNTk4N2RlY29kZShmaWxlbmFtZSk7XG4gICAgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKGZpbGVuYW1lKTtcbiAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7XG4gIH1cbiAgdG1wID0gcmZjMjIzMWdldHBhcmFtKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gIGlmICh0bXApIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUodG1wKTtcbiAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7XG4gIH1cbiAgdG1wID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXCIsIFwiaVwiKS5leGVjKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gIGlmICh0bXApIHtcbiAgICB0bXAgPSB0bXBbMV07XG4gICAgbGV0IGZpbGVuYW1lID0gcmZjMjYxNnVucXVvdGUodG1wKTtcbiAgICBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUoZmlsZW5hbWUpO1xuICAgIHJldHVybiBmaXh1cEVuY29kaW5nKGZpbGVuYW1lKTtcbiAgfVxuICBmdW5jdGlvbiB0b1BhcmFtUmVnRXhwKGF0dHJpYnV0ZVBhdHRlcm4sIGZsYWdzKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXCIoPzpefDspXFxcXHMqXCIgKyBhdHRyaWJ1dGVQYXR0ZXJuICsgXCJcXFxccyo9XFxcXHMqXCIgKyBcIihcIiArICdbXlwiO1xcXFxzXVteO1xcXFxzXSonICsgXCJ8XCIgKyAnXCIoPzpbXlwiXFxcXFxcXFxdfFxcXFxcXFxcXCI/KStcIj8nICsgXCIpXCIsIGZsYWdzKTtcbiAgfVxuICBmdW5jdGlvbiB0ZXh0ZGVjb2RlKGVuY29kaW5nLCB2YWx1ZSkge1xuICAgIGlmIChlbmNvZGluZykge1xuICAgICAgaWYgKCEvXltcXHgwMC1cXHhGRl0rJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZywge1xuICAgICAgICAgIGZhdGFsOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICAgICAgdmFsdWUgPSBkZWNvZGVyLmRlY29kZShidWZmZXIpO1xuICAgICAgICBuZWVkc0VuY29kaW5nRml4dXAgPSBmYWxzZTtcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIGZpeHVwRW5jb2RpbmcodmFsdWUpIHtcbiAgICBpZiAobmVlZHNFbmNvZGluZ0ZpeHVwICYmIC9bXFx4ODAtXFx4ZmZdLy50ZXN0KHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSB0ZXh0ZGVjb2RlKFwidXRmLThcIiwgdmFsdWUpO1xuICAgICAgaWYgKG5lZWRzRW5jb2RpbmdGaXh1cCkge1xuICAgICAgICB2YWx1ZSA9IHRleHRkZWNvZGUoXCJpc28tODg1OS0xXCIsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzIyMzFnZXRwYXJhbShjb250ZW50RGlzcG9zaXRpb25TdHIpIHtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgbGV0IG1hdGNoO1xuICAgIGNvbnN0IGl0ZXIgPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcXFxcKigoPyEwXFxcXGQpXFxcXGQrKShcXFxcKj8pXCIsIFwiaWdcIik7XG4gICAgd2hpbGUgKChtYXRjaCA9IGl0ZXIuZXhlYyhjb250ZW50RGlzcG9zaXRpb25TdHIpKSAhPT0gbnVsbCkge1xuICAgICAgbGV0IFssIG4sIHF1b3QsIHBhcnRdID0gbWF0Y2g7XG4gICAgICBuID0gcGFyc2VJbnQobiwgMTApO1xuICAgICAgaWYgKG4gaW4gbWF0Y2hlcykge1xuICAgICAgICBpZiAobiA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbWF0Y2hlc1tuXSA9IFtxdW90LCBwYXJ0XTtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IG1hdGNoZXMubGVuZ3RoOyArK24pIHtcbiAgICAgIGlmICghKG4gaW4gbWF0Y2hlcykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsZXQgW3F1b3QsIHBhcnRdID0gbWF0Y2hlc1tuXTtcbiAgICAgIHBhcnQgPSByZmMyNjE2dW5xdW90ZShwYXJ0KTtcbiAgICAgIGlmIChxdW90KSB7XG4gICAgICAgIHBhcnQgPSB1bmVzY2FwZShwYXJ0KTtcbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICBwYXJ0ID0gcmZjNTk4N2RlY29kZShwYXJ0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFydHMucHVzaChwYXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcIik7XG4gIH1cbiAgZnVuY3Rpb24gcmZjMjYxNnVucXVvdGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgY29uc3QgcGFydHMgPSB2YWx1ZS5zbGljZSgxKS5zcGxpdCgnXFxcXFwiJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHF1b3RpbmRleCA9IHBhcnRzW2ldLmluZGV4T2YoJ1wiJyk7XG4gICAgICAgIGlmIChxdW90aW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5zbGljZSgwLCBxdW90aW5kZXgpO1xuICAgICAgICAgIHBhcnRzLmxlbmd0aCA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzW2ldID0gcGFydHNbaV0ucmVwbGFjZUFsbCgvXFxcXCguKS9nLCBcIiQxXCIpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBwYXJ0cy5qb2luKCdcIicpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgZnVuY3Rpb24gcmZjNTk4N2RlY29kZShleHR2YWx1ZSkge1xuICAgIGNvbnN0IGVuY29kaW5nZW5kID0gZXh0dmFsdWUuaW5kZXhPZihcIidcIik7XG4gICAgaWYgKGVuY29kaW5nZW5kID09PSAtMSkge1xuICAgICAgcmV0dXJuIGV4dHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBlbmNvZGluZyA9IGV4dHZhbHVlLnNsaWNlKDAsIGVuY29kaW5nZW5kKTtcbiAgICBjb25zdCBsYW5ndmFsdWUgPSBleHR2YWx1ZS5zbGljZShlbmNvZGluZ2VuZCArIDEpO1xuICAgIGNvbnN0IHZhbHVlID0gbGFuZ3ZhbHVlLnJlcGxhY2UoL15bXiddKicvLCBcIlwiKTtcbiAgICByZXR1cm4gdGV4dGRlY29kZShlbmNvZGluZywgdmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIHJmYzIwNDdkZWNvZGUodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoXCI9P1wiKSB8fCAvW1xceDAwLVxceDE5XFx4ODAtXFx4ZmZdLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvPVxcPyhbXFx3LV0qKVxcPyhbUXFCYl0pXFw/KCg/OlteP118XFw/KD8hPSkpKilcXD89L2csIGZ1bmN0aW9uIChtYXRjaGVzLCBjaGFyc2V0LCBlbmNvZGluZywgdGV4dCkge1xuICAgICAgaWYgKGVuY29kaW5nID09PSBcInFcIiB8fCBlbmNvZGluZyA9PT0gXCJRXCIpIHtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZUFsbChcIl9cIiwgXCIgXCIpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKC89KFswLTlhLWZBLUZdezJ9KS9nLCBmdW5jdGlvbiAobWF0Y2gsIGhleCkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleCwgMTYpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0ZXh0ZGVjb2RlKGNoYXJzZXQsIHRleHQpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGV4dCA9IGF0b2IodGV4dCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgICByZXR1cm4gdGV4dGRlY29kZShjaGFyc2V0LCB0ZXh0KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvbmV0d29ya191dGlscy5qc1xuXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoe1xuICBnZXRSZXNwb25zZUhlYWRlcixcbiAgaXNIdHRwLFxuICByYW5nZUNodW5rU2l6ZSxcbiAgZGlzYWJsZVJhbmdlXG59KSB7XG4gIGNvbnN0IHJldHVyblZhbHVlcyA9IHtcbiAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IGZhbHNlLFxuICAgIHN1Z2dlc3RlZExlbmd0aDogdW5kZWZpbmVkXG4gIH07XG4gIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KGdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1MZW5ndGhcIiksIDEwKTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGxlbmd0aCkpIHtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuICB9XG4gIHJldHVyblZhbHVlcy5zdWdnZXN0ZWRMZW5ndGggPSBsZW5ndGg7XG4gIGlmIChsZW5ndGggPD0gMiAqIHJhbmdlQ2h1bmtTaXplKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuICBpZiAoZGlzYWJsZVJhbmdlIHx8ICFpc0h0dHApIHtcbiAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuICB9XG4gIGlmIChnZXRSZXNwb25zZUhlYWRlcihcIkFjY2VwdC1SYW5nZXNcIikgIT09IFwiYnl0ZXNcIikge1xuICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG4gIH1cbiAgY29uc3QgY29udGVudEVuY29kaW5nID0gZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LUVuY29kaW5nXCIpIHx8IFwiaWRlbnRpdHlcIjtcbiAgaWYgKGNvbnRlbnRFbmNvZGluZyAhPT0gXCJpZGVudGl0eVwiKSB7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlcztcbiAgfVxuICByZXR1cm5WYWx1ZXMuYWxsb3dSYW5nZVJlcXVlc3RzID0gdHJ1ZTtcbiAgcmV0dXJuIHJldHVyblZhbHVlcztcbn1cbmZ1bmN0aW9uIGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIoZ2V0UmVzcG9uc2VIZWFkZXIpIHtcbiAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIpO1xuICBpZiAoY29udGVudERpc3Bvc2l0aW9uKSB7XG4gICAgbGV0IGZpbGVuYW1lID0gZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyKGNvbnRlbnREaXNwb3NpdGlvbik7XG4gICAgaWYgKGZpbGVuYW1lLmluY2x1ZGVzKFwiJVwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmlsZW5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICBpZiAoaXNQZGZGaWxlKGZpbGVuYW1lKSkge1xuICAgICAgcmV0dXJuIGZpbGVuYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3Ioc3RhdHVzLCB1cmwpIHtcbiAgaWYgKHN0YXR1cyA9PT0gNDA0IHx8IHN0YXR1cyA9PT0gMCAmJiB1cmwuc3RhcnRzV2l0aChcImZpbGU6XCIpKSB7XG4gICAgcmV0dXJuIG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKCdNaXNzaW5nIFBERiBcIicgKyB1cmwgKyAnXCIuJyk7XG4gIH1cbiAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oYFVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlICgke3N0YXR1c30pIHdoaWxlIHJldHJpZXZpbmcgUERGIFwiJHt1cmx9XCIuYCwgc3RhdHVzKTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUmVzcG9uc2VTdGF0dXMoc3RhdHVzKSB7XG4gIHJldHVybiBzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNjtcbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZmV0Y2hfc3RyZWFtLmpzXG5cblxuZnVuY3Rpb24gY3JlYXRlRmV0Y2hPcHRpb25zKGhlYWRlcnMsIHdpdGhDcmVkZW50aWFscywgYWJvcnRDb250cm9sbGVyKSB7XG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIGhlYWRlcnMsXG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIG1vZGU6IFwiY29yc1wiLFxuICAgIGNyZWRlbnRpYWxzOiB3aXRoQ3JlZGVudGlhbHMgPyBcImluY2x1ZGVcIiA6IFwic2FtZS1vcmlnaW5cIixcbiAgICByZWRpcmVjdDogXCJmb2xsb3dcIlxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSGVhZGVycyhodHRwSGVhZGVycykge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBodHRwSGVhZGVycykge1xuICAgIGNvbnN0IHZhbHVlID0gaHR0cEhlYWRlcnNbcHJvcGVydHldO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaGVhZGVycy5hcHBlbmQocHJvcGVydHksIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cbmZ1bmN0aW9uIGdldEFycmF5QnVmZmVyKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiB2YWwuYnVmZmVyO1xuICB9XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgd2FybihgZ2V0QXJyYXlCdWZmZXIgLSB1bmV4cGVjdGVkIGRhdGEgZm9ybWF0OiAke3ZhbH1gKTtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbCkuYnVmZmVyO1xufVxuY2xhc3MgUERGRmV0Y2hTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3Qoc291cmNlLnVybCk7XG4gICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHNvdXJjZS5odHRwSGVhZGVycyB8fCB7fTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdO1xuICB9XG4gIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uX2xvYWRlZCA/PyAwO1xuICB9XG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZGZXRjaFN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZGZXRjaFN0cmVhbVJlYWRlcih0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG4gIH1cbiAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkge1xuICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFBERkZldGNoU3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgYmVnaW4sIGVuZCk7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfVxuICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG4gICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgUERGRmV0Y2hTdHJlYW1SZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG4gICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlO1xuICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtO1xuICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVSYW5nZTtcbiAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpO1xuICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7XG4gICAgZmV0Y2godXJsLCBjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycywgdGhpcy5fd2l0aENyZWRlbnRpYWxzLCB0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmICghdmFsaWRhdGVSZXNwb25zZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgIHRocm93IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCB1cmwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gbmFtZSA9PiByZXNwb25zZS5oZWFkZXJzLmdldChuYW1lKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLFxuICAgICAgICBzdWdnZXN0ZWRMZW5ndGhcbiAgICAgIH0gPSB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyh7XG4gICAgICAgIGdldFJlc3BvbnNlSGVhZGVyLFxuICAgICAgICBpc0h0dHA6IHRoaXMuX3N0cmVhbS5pc0h0dHAsXG4gICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcbiAgICAgICAgZGlzYWJsZVJhbmdlOiB0aGlzLl9kaXNhYmxlUmFuZ2VcbiAgICAgIH0pO1xuICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGFsbG93UmFuZ2VSZXF1ZXN0cztcbiAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzdWdnZXN0ZWRMZW5ndGggfHwgdGhpcy5fY29udGVudExlbmd0aDtcbiAgICAgIHRoaXMuX2ZpbGVuYW1lID0gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcihnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgICBpZiAoIXRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkICYmIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhpcy5jYW5jZWwobmV3IEFib3J0RXhjZXB0aW9uKFwiU3RyZWFtaW5nIGlzIGRpc2FibGVkLlwiKSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2godGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIGdldCBoZWFkZXJzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgZ2V0IGZpbGVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgfVxuICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDtcbiAgfVxuICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTtcbiAgICBjb25zdCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGRvbmVcbiAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGRvbmVcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuX2xvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcbiAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkLFxuICAgICAgdG90YWw6IHRoaXMuX2NvbnRlbnRMZW5ndGhcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGdldEFycmF5QnVmZmVyKHZhbHVlKSxcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fcmVhZGVyPy5jYW5jZWwocmVhc29uKTtcbiAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxufVxuY2xhc3MgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSwgYmVnaW4sIGVuZCkge1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcbiAgICB0aGlzLl93aXRoQ3JlZGVudGlhbHMgPSBzb3VyY2Uud2l0aENyZWRlbnRpYWxzIHx8IGZhbHNlO1xuICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG4gICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMuX2hlYWRlcnMgPSBjcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7XG4gICAgdGhpcy5faGVhZGVycy5hcHBlbmQoXCJSYW5nZVwiLCBgYnl0ZXM9JHtiZWdpbn0tJHtlbmQgLSAxfWApO1xuICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7XG4gICAgZmV0Y2godXJsLCBjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycywgdGhpcy5fd2l0aENyZWRlbnRpYWxzLCB0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGlmICghdmFsaWRhdGVSZXNwb25zZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgIHRocm93IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCB1cmwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgdGhpcy5fcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICB9KS5jYXRjaCh0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZWplY3QpO1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgY29uc3Qge1xuICAgICAgdmFsdWUsXG4gICAgICBkb25lXG4gICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBkb25lXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogZ2V0QXJyYXlCdWZmZXIodmFsdWUpLFxuICAgICAgZG9uZTogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNhbmNlbChyZWFzb24pIHtcbiAgICB0aGlzLl9yZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L25ldHdvcmsuanNcblxuXG5jb25zdCBPS19SRVNQT05TRSA9IDIwMDtcbmNvbnN0IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRSA9IDIwNjtcbmZ1bmN0aW9uIG5ldHdvcmtfZ2V0QXJyYXlCdWZmZXIoeGhyKSB7XG4gIGNvbnN0IGRhdGEgPSB4aHIucmVzcG9uc2U7XG4gIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIHJldHVybiBzdHJpbmdUb0J5dGVzKGRhdGEpLmJ1ZmZlcjtcbn1cbmNsYXNzIE5ldHdvcmtNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IodXJsLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3QodXJsKTtcbiAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgYXJncy5odHRwSGVhZGVycyB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gYXJncy53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG4gICAgdGhpcy5jdXJyWGhySWQgPSAwO1xuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCwgbGlzdGVuZXJzKSB7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIGJlZ2luLFxuICAgICAgZW5kXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gbGlzdGVuZXJzKSB7XG4gICAgICBhcmdzW3Byb3BdID0gbGlzdGVuZXJzW3Byb3BdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGFyZ3MpO1xuICB9XG4gIHJlcXVlc3RGdWxsKGxpc3RlbmVycykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobGlzdGVuZXJzKTtcbiAgfVxuICByZXF1ZXN0KGFyZ3MpIHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBjb25zdCB4aHJJZCA9IHRoaXMuY3VyclhocklkKys7XG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF0gPSB7XG4gICAgICB4aHJcbiAgICB9O1xuICAgIHhoci5vcGVuKFwiR0VUXCIsIHRoaXMudXJsKTtcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmh0dHBIZWFkZXJzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaHR0cEhlYWRlcnNbcHJvcGVydHldO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihwcm9wZXJ0eSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0h0dHAgJiYgXCJiZWdpblwiIGluIGFyZ3MgJiYgXCJlbmRcIiBpbiBhcmdzKSB7XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlJhbmdlXCIsIGBieXRlcz0ke2FyZ3MuYmVnaW59LSR7YXJncy5lbmQgLSAxfWApO1xuICAgICAgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzID0gT0tfUkVTUE9OU0U7XG4gICAgfVxuICAgIHhoci5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XG4gICAgaWYgKGFyZ3Mub25FcnJvcikge1xuICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIGFyZ3Mub25FcnJvcih4aHIuc3RhdHVzKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzLCB4aHJJZCk7XG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3MuYmluZCh0aGlzLCB4aHJJZCk7XG4gICAgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQgPSBhcmdzLm9uSGVhZGVyc1JlY2VpdmVkO1xuICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRG9uZSA9IGFyZ3Mub25Eb25lO1xuICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IgPSBhcmdzLm9uRXJyb3I7XG4gICAgcGVuZGluZ1JlcXVlc3Qub25Qcm9ncmVzcyA9IGFyZ3Mub25Qcm9ncmVzcztcbiAgICB4aHIuc2VuZChudWxsKTtcbiAgICByZXR1cm4geGhySWQ7XG4gIH1cbiAgb25Qcm9ncmVzcyh4aHJJZCwgZXZ0KSB7XG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG4gICAgaWYgKCFwZW5kaW5nUmVxdWVzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzPy4oZXZ0KTtcbiAgfVxuICBvblN0YXRlQ2hhbmdlKHhocklkLCBldnQpIHtcbiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTtcbiAgICBpZiAoIXBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHhociA9IHBlbmRpbmdSZXF1ZXN0LnhocjtcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPj0gMiAmJiBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCkge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQoKTtcbiAgICAgIGRlbGV0ZSBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZDtcbiAgICB9XG4gICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghKHhocklkIGluIHRoaXMucGVuZGluZ1JlcXVlc3RzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuICAgIGlmICh4aHIuc3RhdHVzID09PSAwICYmIHRoaXMuaXNIdHRwKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yPy4oeGhyLnN0YXR1cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHhoclN0YXR1cyA9IHhoci5zdGF0dXMgfHwgT0tfUkVTUE9OU0U7XG4gICAgY29uc3Qgb2tfcmVzcG9uc2Vfb25fcmFuZ2VfcmVxdWVzdCA9IHhoclN0YXR1cyA9PT0gT0tfUkVTUE9OU0UgJiYgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPT09IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRTtcbiAgICBpZiAoIW9rX3Jlc3BvbnNlX29uX3JhbmdlX3JlcXVlc3QgJiYgeGhyU3RhdHVzICE9PSBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cykge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcj8uKHhoci5zdGF0dXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjaHVuayA9IG5ldHdvcmtfZ2V0QXJyYXlCdWZmZXIoeGhyKTtcbiAgICBpZiAoeGhyU3RhdHVzID09PSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0UpIHtcbiAgICAgIGNvbnN0IHJhbmdlSGVhZGVyID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1SYW5nZVwiKTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSAvYnl0ZXMgKFxcZCspLShcXGQrKVxcLyhcXGQrKS8uZXhlYyhyYW5nZUhlYWRlcik7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUoe1xuICAgICAgICBiZWdpbjogcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApLFxuICAgICAgICBjaHVua1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjaHVuaykge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lKHtcbiAgICAgICAgYmVnaW46IDAsXG4gICAgICAgIGNodW5rXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcj8uKHhoci5zdGF0dXMpO1xuICAgIH1cbiAgfVxuICBnZXRSZXF1ZXN0WGhyKHhocklkKSB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXS54aHI7XG4gIH1cbiAgaXNQZW5kaW5nUmVxdWVzdCh4aHJJZCkge1xuICAgIHJldHVybiB4aHJJZCBpbiB0aGlzLnBlbmRpbmdSZXF1ZXN0cztcbiAgfVxuICBhYm9ydFJlcXVlc3QoeGhySWQpIHtcbiAgICBjb25zdCB4aHIgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF0ueGhyO1xuICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG4gICAgeGhyLmFib3J0KCk7XG4gIH1cbn1cbmNsYXNzIFBERk5ldHdvcmtTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5fbWFuYWdlciA9IG5ldyBOZXR3b3JrTWFuYWdlcihzb3VyY2UudXJsLCB7XG4gICAgICBodHRwSGVhZGVyczogc291cmNlLmh0dHBIZWFkZXJzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBzb3VyY2Uud2l0aENyZWRlbnRpYWxzXG4gICAgfSk7XG4gICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG4gICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgfVxuICBfb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQocmVhZGVyKSB7XG4gICAgY29uc3QgaSA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuaW5kZXhPZihyZWFkZXIpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxuICBnZXRGdWxsUmVhZGVyKCkge1xuICAgIGFzc2VydCghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGTmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlciwgdGhpcy5fc291cmNlKTtcbiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG4gIH1cbiAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyKHRoaXMuX21hbmFnZXIsIGJlZ2luLCBlbmQpO1xuICAgIHJlYWRlci5vbkNsb3NlZCA9IHRoaXMuX29uUmFuZ2VSZXF1ZXN0UmVhZGVyQ2xvc2VkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfVxuICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG4gICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVyIHtcbiAgY29uc3RydWN0b3IobWFuYWdlciwgc291cmNlKSB7XG4gICAgdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIG9uSGVhZGVyc1JlY2VpdmVkOiB0aGlzLl9vbkhlYWRlcnNSZWNlaXZlZC5iaW5kKHRoaXMpLFxuICAgICAgb25Eb25lOiB0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxcbiAgICAgIG9uRXJyb3I6IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIG9uUHJvZ3Jlc3M6IHRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKVxuICAgIH07XG4gICAgdGhpcy5fdXJsID0gc291cmNlLnVybDtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdElkID0gbWFuYWdlci5yZXF1ZXN0RnVsbChhcmdzKTtcbiAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTtcbiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTtcbiAgICBpZiAoIXRoaXMuX3JhbmdlQ2h1bmtTaXplICYmICF0aGlzLl9kaXNhYmxlUmFuZ2UpIHtcbiAgICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NhY2hlZENodW5rcyA9IFtdO1xuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIF9vbkhlYWRlcnNSZWNlaXZlZCgpIHtcbiAgICBjb25zdCBmdWxsUmVxdWVzdFhocklkID0gdGhpcy5fZnVsbFJlcXVlc3RJZDtcbiAgICBjb25zdCBmdWxsUmVxdWVzdFhociA9IHRoaXMuX21hbmFnZXIuZ2V0UmVxdWVzdFhocihmdWxsUmVxdWVzdFhocklkKTtcbiAgICBjb25zdCBnZXRSZXNwb25zZUhlYWRlciA9IG5hbWUgPT4gZnVsbFJlcXVlc3RYaHIuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7XG4gICAgY29uc3Qge1xuICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLFxuICAgICAgc3VnZ2VzdGVkTGVuZ3RoXG4gICAgfSA9IHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHtcbiAgICAgIGdldFJlc3BvbnNlSGVhZGVyLFxuICAgICAgaXNIdHRwOiB0aGlzLl9tYW5hZ2VyLmlzSHR0cCxcbiAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcbiAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgfSk7XG4gICAgaWYgKGFsbG93UmFuZ2VSZXF1ZXN0cykge1xuICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzdWdnZXN0ZWRMZW5ndGggfHwgdGhpcy5fY29udGVudExlbmd0aDtcbiAgICB0aGlzLl9maWxlbmFtZSA9IGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIoZ2V0UmVzcG9uc2VIZWFkZXIpO1xuICAgIGlmICh0aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdChmdWxsUmVxdWVzdFhocklkKTtcbiAgICB9XG4gICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cbiAgX29uRG9uZShkYXRhKSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTtcbiAgICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgICAgdmFsdWU6IGRhdGEuY2h1bmssXG4gICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jYWNoZWRDaHVua3MucHVzaChkYXRhLmNodW5rKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgfVxuICBfb25FcnJvcihzdGF0dXMpIHtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3Ioc3RhdHVzLCB0aGlzLl91cmwpO1xuICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KHRoaXMuX3N0b3JlZEVycm9yKTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZWplY3QodGhpcy5fc3RvcmVkRXJyb3IpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGggPSAwO1xuICB9XG4gIF9vblByb2dyZXNzKGV2dCkge1xuICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcbiAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcbiAgICAgIHRvdGFsOiBldnQubGVuZ3RoQ29tcHV0YWJsZSA/IGV2dC50b3RhbCA6IHRoaXMuX2NvbnRlbnRMZW5ndGhcbiAgICB9KTtcbiAgfVxuICBnZXQgZmlsZW5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuICB9XG4gIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkO1xuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gIH1cbiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gIH1cbiAgZ2V0IGhlYWRlcnNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NhY2hlZENodW5rcy5zaGlmdCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG4gICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbikge1xuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIGlmICh0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fZnVsbFJlcXVlc3RJZCkpIHtcbiAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX2Z1bGxSZXF1ZXN0SWQpO1xuICAgIH1cbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gIH1cbn1cbmNsYXNzIFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihtYW5hZ2VyLCBiZWdpbiwgZW5kKSB7XG4gICAgdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksXG4gICAgICBvbkVycm9yOiB0aGlzLl9vbkVycm9yLmJpbmQodGhpcyksXG4gICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcylcbiAgICB9O1xuICAgIHRoaXMuX3VybCA9IG1hbmFnZXIudXJsO1xuICAgIHRoaXMuX3JlcXVlc3RJZCA9IG1hbmFnZXIucmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQsIGFyZ3MpO1xuICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHRoaXMub25DbG9zZWQgPSBudWxsO1xuICB9XG4gIF9jbG9zZSgpIHtcbiAgICB0aGlzLm9uQ2xvc2VkPy4odGhpcyk7XG4gIH1cbiAgX29uRG9uZShkYXRhKSB7XG4gICAgY29uc3QgY2h1bmsgPSBkYXRhLmNodW5rO1xuICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG4gICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgdmFsdWU6IGNodW5rLFxuICAgICAgICBkb25lOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gY2h1bms7XG4gICAgfVxuICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcbiAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBkb25lOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9jbG9zZSgpO1xuICB9XG4gIF9vbkVycm9yKHN0YXR1cykge1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcihzdGF0dXMsIHRoaXMuX3VybCk7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVqZWN0KHRoaXMuX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gIH1cbiAgX29uUHJvZ3Jlc3MoZXZ0KSB7XG4gICAgaWYgKCF0aGlzLmlzU3RyZWFtaW5nU3VwcG9ydGVkKSB7XG4gICAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXN5bmMgcmVhZCgpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcbiAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmsgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogY2h1bmssXG4gICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcbiAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgdGhpcy5fZG9uZSA9IHRydWU7XG4gICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgIGlmICh0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fcmVxdWVzdElkKSkge1xuICAgICAgdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QodGhpcy5fcmVxdWVzdElkKTtcbiAgICB9XG4gICAgdGhpcy5fY2xvc2UoKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9ub2RlX3N0cmVhbS5qc1xuXG5cblxuY29uc3QgZmlsZVVyaVJlZ2V4ID0gL15maWxlOlxcL1xcL1xcL1thLXpBLVpdOlxcLy87XG5mdW5jdGlvbiBwYXJzZVVybChzb3VyY2VVcmwpIHtcbiAgY29uc3QgdXJsID0gTm9kZVBhY2thZ2VzLmdldChcInVybFwiKTtcbiAgY29uc3QgcGFyc2VkVXJsID0gdXJsLnBhcnNlKHNvdXJjZVVybCk7XG4gIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09IFwiZmlsZTpcIiB8fCBwYXJzZWRVcmwuaG9zdCkge1xuICAgIHJldHVybiBwYXJzZWRVcmw7XG4gIH1cbiAgaWYgKC9eW2Etel06Wy9cXFxcXS9pLnRlc3Qoc291cmNlVXJsKSkge1xuICAgIHJldHVybiB1cmwucGFyc2UoYGZpbGU6Ly8vJHtzb3VyY2VVcmx9YCk7XG4gIH1cbiAgaWYgKCFwYXJzZWRVcmwuaG9zdCkge1xuICAgIHBhcnNlZFVybC5wcm90b2NvbCA9IFwiZmlsZTpcIjtcbiAgfVxuICByZXR1cm4gcGFyc2VkVXJsO1xufVxuY2xhc3MgUERGTm9kZVN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMudXJsID0gcGFyc2VVcmwoc291cmNlLnVybCk7XG4gICAgdGhpcy5pc0h0dHAgPSB0aGlzLnVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHRoaXMudXJsLnByb3RvY29sID09PSBcImh0dHBzOlwiO1xuICAgIHRoaXMuaXNGc1VybCA9IHRoaXMudXJsLnByb3RvY29sID09PSBcImZpbGU6XCI7XG4gICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHNvdXJjZS5odHRwSGVhZGVycyB8fCB7fTtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdO1xuICB9XG4gIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uX2xvYWRlZCA/PyAwO1xuICB9XG4gIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgYXNzZXJ0KCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZOb2RlU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcy5pc0ZzVXJsID8gbmV3IFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIodGhpcykgOiBuZXcgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICB9XG4gIGdldFJhbmdlUmVhZGVyKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoZW5kIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJhbmdlUmVhZGVyID0gdGhpcy5pc0ZzVXJsID8gbmV3IFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyKHRoaXMsIHN0YXJ0LCBlbmQpIDogbmV3IFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBzdGFydCwgZW5kKTtcbiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmFuZ2VSZWFkZXIpO1xuICAgIHJldHVybiByYW5nZVJlYWRlcjtcbiAgfVxuICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcbiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG4gICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkge1xuICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgQmFzZUZ1bGxSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICB0aGlzLl91cmwgPSBzdHJlYW0udXJsO1xuICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IG51bGw7XG4gICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHNvdXJjZS5kaXNhYmxlUmFuZ2UgfHwgZmFsc2U7XG4gICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG4gICAgaWYgKCF0aGlzLl9yYW5nZUNodW5rU2l6ZSAmJiAhdGhpcy5fZGlzYWJsZVJhbmdlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcbiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlUmFuZ2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSBudWxsO1xuICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgfVxuICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGdldCBmaWxlbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gIH1cbiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gIH1cbiAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gIH1cbiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgfVxuICBhc3luYyByZWFkKCkge1xuICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgaWYgKHRoaXMuX2RvbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIGRvbmU6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcmVhZGFibGVTdHJlYW0ucmVhZCgpO1xuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgIHJldHVybiB0aGlzLnJlYWQoKTtcbiAgICB9XG4gICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmxlbmd0aDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCxcbiAgICAgIHRvdGFsOiB0aGlzLl9jb250ZW50TGVuZ3RoXG4gICAgfSk7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGJ1ZmZlcixcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0cmVhbSkge1xuICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveShyZWFzb24pO1xuICB9XG4gIF9lcnJvcihyZWFzb24pIHtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cbiAgX3NldFJlYWRhYmxlU3RyZWFtKHJlYWRhYmxlU3RyZWFtKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSByZWFkYWJsZVN0cmVhbTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcInJlYWRhYmxlXCIsICgpID0+IHtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICByZWFkYWJsZVN0cmVhbS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9lcnJvcihyZWFzb24pO1xuICAgIH0pO1xuICAgIGlmICghdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCkge1xuICAgICAgdGhpcy5fZXJyb3IobmV3IEFib3J0RXhjZXB0aW9uKFwic3RyZWFtaW5nIGlzIGRpc2FibGVkXCIpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHRoaXMuX3N0b3JlZEVycm9yKTtcbiAgICB9XG4gIH1cbn1cbmNsYXNzIEJhc2VSYW5nZVJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHRoaXMuX3VybCA9IHN0cmVhbS51cmw7XG4gICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuICAgIHRoaXMuX3N0b3JlZEVycm9yID0gbnVsbDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSBudWxsO1xuICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcbiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcbiAgfVxuICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuICB9XG4gIGFzeW5jIHJlYWQoKSB7XG4gICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICBpZiAodGhpcy5fZG9uZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtcbiAgICB9XG4gICAgY29uc3QgY2h1bmsgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG4gICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZCgpO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsubGVuZ3RoO1xuICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcbiAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkXG4gICAgfSk7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IGJ1ZmZlcixcbiAgICAgIGRvbmU6IGZhbHNlXG4gICAgfTtcbiAgfVxuICBjYW5jZWwocmVhc29uKSB7XG4gICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0cmVhbSkge1xuICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveShyZWFzb24pO1xuICB9XG4gIF9lcnJvcihyZWFzb24pIHtcbiAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cbiAgX3NldFJlYWRhYmxlU3RyZWFtKHJlYWRhYmxlU3RyZWFtKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSByZWFkYWJsZVN0cmVhbTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcInJlYWRhYmxlXCIsICgpID0+IHtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICByZWFkYWJsZVN0cmVhbS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9lcnJvcihyZWFzb24pO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVSZXF1ZXN0T3B0aW9ucyhwYXJzZWRVcmwsIGhlYWRlcnMpIHtcbiAgcmV0dXJuIHtcbiAgICBwcm90b2NvbDogcGFyc2VkVXJsLnByb3RvY29sLFxuICAgIGF1dGg6IHBhcnNlZFVybC5hdXRoLFxuICAgIGhvc3Q6IHBhcnNlZFVybC5ob3N0bmFtZSxcbiAgICBwb3J0OiBwYXJzZWRVcmwucG9ydCxcbiAgICBwYXRoOiBwYXJzZWRVcmwucGF0aCxcbiAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgaGVhZGVyc1xuICB9O1xufVxuY2xhc3MgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIHN1cGVyKHN0cmVhbSk7XG4gICAgY29uc3QgaGFuZGxlUmVzcG9uc2UgPSByZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IE1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGIFwiJHt0aGlzLl91cmx9XCIuYCk7XG4gICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7XG4gICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gbmFtZSA9PiB0aGlzLl9yZWFkYWJsZVN0cmVhbS5oZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cyxcbiAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoXG4gICAgICB9ID0gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMoe1xuICAgICAgICBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgaXNIdHRwOiBzdHJlYW0uaXNIdHRwLFxuICAgICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsXG4gICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBhbGxvd1JhbmdlUmVxdWVzdHM7XG4gICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICB0aGlzLl9maWxlbmFtZSA9IGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIoZ2V0UmVzcG9uc2VIZWFkZXIpO1xuICAgIH07XG4gICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKHRoaXMuX3VybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiKSB7XG4gICAgICBjb25zdCBodHRwID0gTm9kZVBhY2thZ2VzLmdldChcImh0dHBcIik7XG4gICAgICB0aGlzLl9yZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgc3RyZWFtLmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBodHRwcyA9IE5vZGVQYWNrYWdlcy5nZXQoXCJodHRwc1wiKTtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgc3RyZWFtLmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgIH1cbiAgICB0aGlzLl9yZXF1ZXN0Lm9uKFwiZXJyb3JcIiwgcmVhc29uID0+IHtcbiAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uO1xuICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgfSk7XG4gICAgdGhpcy5fcmVxdWVzdC5lbmQoKTtcbiAgfVxufVxuY2xhc3MgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyIGV4dGVuZHMgQmFzZVJhbmdlUmVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc3RyZWFtLCBzdGFydCwgZW5kKSB7XG4gICAgc3VwZXIoc3RyZWFtKTtcbiAgICB0aGlzLl9odHRwSGVhZGVycyA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gc3RyZWFtLmh0dHBIZWFkZXJzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHN0cmVhbS5odHRwSGVhZGVyc1twcm9wZXJ0eV07XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2h0dHBIZWFkZXJzW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9odHRwSGVhZGVycy5SYW5nZSA9IGBieXRlcz0ke3N0YXJ0fS0ke2VuZCAtIDF9YDtcbiAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9IHJlc3BvbnNlID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgXCIke3RoaXMuX3VybH1cIi5gKTtcbiAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0ocmVzcG9uc2UpO1xuICAgIH07XG4gICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKHRoaXMuX3VybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiKSB7XG4gICAgICBjb25zdCBodHRwID0gTm9kZVBhY2thZ2VzLmdldChcImh0dHBcIik7XG4gICAgICB0aGlzLl9yZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgdGhpcy5faHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGh0dHBzID0gTm9kZVBhY2thZ2VzLmdldChcImh0dHBzXCIpO1xuICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHBzLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcbiAgICB9XG4gICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG4gICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcbiAgICB9KTtcbiAgICB0aGlzLl9yZXF1ZXN0LmVuZCgpO1xuICB9XG59XG5jbGFzcyBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcbiAgICBzdXBlcihzdHJlYW0pO1xuICAgIGxldCBwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMuX3VybC5wYXRoKTtcbiAgICBpZiAoZmlsZVVyaVJlZ2V4LnRlc3QodGhpcy5fdXJsLmhyZWYpKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIik7XG4gICAgfVxuICAgIGNvbnN0IGZzID0gTm9kZVBhY2thZ2VzLmdldChcImZzXCIpO1xuICAgIGZzLnByb21pc2VzLmxzdGF0KHBhdGgpLnRoZW4oc3RhdCA9PiB7XG4gICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3RhdC5zaXplO1xuICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0oZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoKSk7XG4gICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgXCIke3BhdGh9XCIuYCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yO1xuICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KGVycm9yKTtcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIge1xuICBjb25zdHJ1Y3RvcihzdHJlYW0sIHN0YXJ0LCBlbmQpIHtcbiAgICBzdXBlcihzdHJlYW0pO1xuICAgIGxldCBwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMuX3VybC5wYXRoKTtcbiAgICBpZiAoZmlsZVVyaVJlZ2V4LnRlc3QodGhpcy5fdXJsLmhyZWYpKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIik7XG4gICAgfVxuICAgIGNvbnN0IGZzID0gTm9kZVBhY2thZ2VzLmdldChcImZzXCIpO1xuICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKGZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aCwge1xuICAgICAgc3RhcnQsXG4gICAgICBlbmQ6IGVuZCAtIDFcbiAgICB9KSk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvdGV4dF9sYXllci5qc1xuXG5cbmNvbnN0IE1BWF9URVhUX0RJVlNfVE9fUkVOREVSID0gMTAwMDAwO1xuY29uc3QgREVGQVVMVF9GT05UX1NJWkUgPSAzMDtcbmNvbnN0IERFRkFVTFRfRk9OVF9BU0NFTlQgPSAwLjg7XG5jbGFzcyBUZXh0TGF5ZXIge1xuICAjY2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAjY29udGFpbmVyID0gbnVsbDtcbiAgI2Rpc2FibGVQcm9jZXNzSXRlbXMgPSBmYWxzZTtcbiAgI2ZvbnRJbnNwZWN0b3JFbmFibGVkID0gISFnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3I/LmVuYWJsZWQ7XG4gICNsYW5nID0gbnVsbDtcbiAgI2xheW91dFRleHRQYXJhbXMgPSBudWxsO1xuICAjcGFnZUhlaWdodCA9IDA7XG4gICNwYWdlV2lkdGggPSAwO1xuICAjcmVhZGVyID0gbnVsbDtcbiAgI3Jvb3RDb250YWluZXIgPSBudWxsO1xuICAjcm90YXRpb24gPSAwO1xuICAjc2NhbGUgPSAwO1xuICAjc3R5bGVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICN0ZXh0Q29udGVudEl0ZW1zU3RyID0gW107XG4gICN0ZXh0Q29udGVudFNvdXJjZSA9IG51bGw7XG4gICN0ZXh0RGl2cyA9IFtdO1xuICAjdGV4dERpdlByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpO1xuICAjdHJhbnNmb3JtID0gbnVsbDtcbiAgc3RhdGljICNhc2NlbnRDYWNoZSA9IG5ldyBNYXAoKTtcbiAgc3RhdGljICNjYW52YXNDb250ZXh0cyA9IG5ldyBNYXAoKTtcbiAgc3RhdGljICNtaW5Gb250U2l6ZSA9IG51bGw7XG4gIHN0YXRpYyAjcGVuZGluZ1RleHRMYXllcnMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICB0ZXh0Q29udGVudFNvdXJjZSxcbiAgICBjb250YWluZXIsXG4gICAgdmlld3BvcnRcbiAgfSkge1xuICAgIGlmICh0ZXh0Q29udGVudFNvdXJjZSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtKSB7XG4gICAgICB0aGlzLiN0ZXh0Q29udGVudFNvdXJjZSA9IHRleHRDb250ZW50U291cmNlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRleHRDb250ZW50U291cmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLiN0ZXh0Q29udGVudFNvdXJjZSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUodGV4dENvbnRlbnRTb3VyY2UpO1xuICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gXCJ0ZXh0Q29udGVudFNvdXJjZVwiIHBhcmFtZXRlciBzcGVjaWZpZWQuJyk7XG4gICAgfVxuICAgIHRoaXMuI2NvbnRhaW5lciA9IHRoaXMuI3Jvb3RDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy4jc2NhbGUgPSB2aWV3cG9ydC5zY2FsZSAqIChnbG9iYWxUaGlzLmRldmljZVBpeGVsUmF0aW8gfHwgMSk7XG4gICAgdGhpcy4jcm90YXRpb24gPSB2aWV3cG9ydC5yb3RhdGlvbjtcbiAgICB0aGlzLiNsYXlvdXRUZXh0UGFyYW1zID0ge1xuICAgICAgcHJldkZvbnRTaXplOiBudWxsLFxuICAgICAgcHJldkZvbnRGYW1pbHk6IG51bGwsXG4gICAgICBkaXY6IG51bGwsXG4gICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgY3R4OiBudWxsXG4gICAgfTtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0LFxuICAgICAgcGFnZVgsXG4gICAgICBwYWdlWVxuICAgIH0gPSB2aWV3cG9ydC5yYXdEaW1zO1xuICAgIHRoaXMuI3RyYW5zZm9ybSA9IFsxLCAwLCAwLCAtMSwgLXBhZ2VYLCBwYWdlWSArIHBhZ2VIZWlnaHRdO1xuICAgIHRoaXMuI3BhZ2VXaWR0aCA9IHBhZ2VXaWR0aDtcbiAgICB0aGlzLiNwYWdlSGVpZ2h0ID0gcGFnZUhlaWdodDtcbiAgICBUZXh0TGF5ZXIuI2Vuc3VyZU1pbkZvbnRTaXplQ29tcHV0ZWQoKTtcbiAgICBzZXRMYXllckRpbWVuc2lvbnMoY29udGFpbmVyLCB2aWV3cG9ydCk7XG4gICAgdGhpcy4jY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKCgpID0+IHt9KS50aGVuKCgpID0+IHtcbiAgICAgIFRleHRMYXllci4jcGVuZGluZ1RleHRMYXllcnMuZGVsZXRlKHRoaXMpO1xuICAgICAgdGhpcy4jbGF5b3V0VGV4dFBhcmFtcyA9IG51bGw7XG4gICAgICB0aGlzLiNzdHlsZUNhY2hlID0gbnVsbDtcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgcHVtcCA9ICgpID0+IHtcbiAgICAgIHRoaXMuI3JlYWRlci5yZWFkKCkudGhlbigoe1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZG9uZVxuICAgICAgfSkgPT4ge1xuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIHRoaXMuI2NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNsYW5nID8/PSB2YWx1ZS5sYW5nO1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuI3N0eWxlQ2FjaGUsIHZhbHVlLnN0eWxlcyk7XG4gICAgICAgIHRoaXMuI3Byb2Nlc3NJdGVtcyh2YWx1ZS5pdGVtcyk7XG4gICAgICAgIHB1bXAoKTtcbiAgICAgIH0sIHRoaXMuI2NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICB9O1xuICAgIHRoaXMuI3JlYWRlciA9IHRoaXMuI3RleHRDb250ZW50U291cmNlLmdldFJlYWRlcigpO1xuICAgIFRleHRMYXllci4jcGVuZGluZ1RleHRMYXllcnMuYWRkKHRoaXMpO1xuICAgIHB1bXAoKTtcbiAgICByZXR1cm4gdGhpcy4jY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIHVwZGF0ZSh7XG4gICAgdmlld3BvcnQsXG4gICAgb25CZWZvcmUgPSBudWxsXG4gIH0pIHtcbiAgICBjb25zdCBzY2FsZSA9IHZpZXdwb3J0LnNjYWxlICogKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKTtcbiAgICBjb25zdCByb3RhdGlvbiA9IHZpZXdwb3J0LnJvdGF0aW9uO1xuICAgIGlmIChyb3RhdGlvbiAhPT0gdGhpcy4jcm90YXRpb24pIHtcbiAgICAgIG9uQmVmb3JlPy4oKTtcbiAgICAgIHRoaXMuI3JvdGF0aW9uID0gcm90YXRpb247XG4gICAgICBzZXRMYXllckRpbWVuc2lvbnModGhpcy4jcm9vdENvbnRhaW5lciwge1xuICAgICAgICByb3RhdGlvblxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzY2FsZSAhPT0gdGhpcy4jc2NhbGUpIHtcbiAgICAgIG9uQmVmb3JlPy4oKTtcbiAgICAgIHRoaXMuI3NjYWxlID0gc2NhbGU7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIHByZXZGb250U2l6ZTogbnVsbCxcbiAgICAgICAgcHJldkZvbnRGYW1pbHk6IG51bGwsXG4gICAgICAgIGRpdjogbnVsbCxcbiAgICAgICAgcHJvcGVydGllczogbnVsbCxcbiAgICAgICAgY3R4OiBUZXh0TGF5ZXIuI2dldEN0eCh0aGlzLiNsYW5nKVxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgZGl2IG9mIHRoaXMuI3RleHREaXZzKSB7XG4gICAgICAgIHBhcmFtcy5wcm9wZXJ0aWVzID0gdGhpcy4jdGV4dERpdlByb3BlcnRpZXMuZ2V0KGRpdik7XG4gICAgICAgIHBhcmFtcy5kaXYgPSBkaXY7XG4gICAgICAgIHRoaXMuI2xheW91dChwYXJhbXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYW5jZWwoKSB7XG4gICAgY29uc3QgYWJvcnRFeCA9IG5ldyBBYm9ydEV4Y2VwdGlvbihcIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC5cIik7XG4gICAgdGhpcy4jcmVhZGVyPy5jYW5jZWwoYWJvcnRFeCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIHRoaXMuI3JlYWRlciA9IG51bGw7XG4gICAgdGhpcy4jY2FwYWJpbGl0eS5yZWplY3QoYWJvcnRFeCk7XG4gIH1cbiAgZ2V0IHRleHREaXZzKCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0RGl2cztcbiAgfVxuICBnZXQgdGV4dENvbnRlbnRJdGVtc1N0cigpIHtcbiAgICByZXR1cm4gdGhpcy4jdGV4dENvbnRlbnRJdGVtc1N0cjtcbiAgfVxuICAjcHJvY2Vzc0l0ZW1zKGl0ZW1zKSB7XG4gICAgaWYgKHRoaXMuI2Rpc2FibGVQcm9jZXNzSXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jbGF5b3V0VGV4dFBhcmFtcy5jdHggPz89IFRleHRMYXllci4jZ2V0Q3R4KHRoaXMuI2xhbmcpO1xuICAgIGNvbnN0IHRleHREaXZzID0gdGhpcy4jdGV4dERpdnMsXG4gICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyID0gdGhpcy4jdGV4dENvbnRlbnRJdGVtc1N0cjtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGlmICh0ZXh0RGl2cy5sZW5ndGggPiBNQVhfVEVYVF9ESVZTX1RPX1JFTkRFUikge1xuICAgICAgICB3YXJuKFwiSWdub3JpbmcgYWRkaXRpb25hbCB0ZXh0RGl2cyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy5cIik7XG4gICAgICAgIHRoaXMuI2Rpc2FibGVQcm9jZXNzSXRlbXMgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5zdHIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaXRlbS50eXBlID09PSBcImJlZ2luTWFya2VkQ29udGVudFByb3BzXCIgfHwgaXRlbS50eXBlID09PSBcImJlZ2luTWFya2VkQ29udGVudFwiKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy4jY29udGFpbmVyO1xuICAgICAgICAgIHRoaXMuI2NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgIHRoaXMuI2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFya2VkQ29udGVudFwiKTtcbiAgICAgICAgICBpZiAoaXRlbS5pZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy4jY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImlkXCIsIGAke2l0ZW0uaWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcmVudC5hcHBlbmQodGhpcy4jY29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwiZW5kTWFya2VkQ29udGVudFwiKSB7XG4gICAgICAgICAgdGhpcy4jY29udGFpbmVyID0gdGhpcy4jY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyLnB1c2goaXRlbS5zdHIpO1xuICAgICAgdGhpcy4jYXBwZW5kVGV4dChpdGVtKTtcbiAgICB9XG4gIH1cbiAgI2FwcGVuZFRleHQoZ2VvbSkge1xuICAgIGNvbnN0IHRleHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBjb25zdCB0ZXh0RGl2UHJvcGVydGllcyA9IHtcbiAgICAgIGFuZ2xlOiAwLFxuICAgICAgY2FudmFzV2lkdGg6IDAsXG4gICAgICBoYXNUZXh0OiBnZW9tLnN0ciAhPT0gXCJcIixcbiAgICAgIGhhc0VPTDogZ2VvbS5oYXNFT0wsXG4gICAgICBmb250U2l6ZTogMFxuICAgIH07XG4gICAgdGhpcy4jdGV4dERpdnMucHVzaCh0ZXh0RGl2KTtcbiAgICBjb25zdCB0eCA9IFV0aWwudHJhbnNmb3JtKHRoaXMuI3RyYW5zZm9ybSwgZ2VvbS50cmFuc2Zvcm0pO1xuICAgIGxldCBhbmdsZSA9IE1hdGguYXRhbjIodHhbMV0sIHR4WzBdKTtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuI3N0eWxlQ2FjaGVbZ2VvbS5mb250TmFtZV07XG4gICAgaWYgKHN0eWxlLnZlcnRpY2FsKSB7XG4gICAgICBhbmdsZSArPSBNYXRoLlBJIC8gMjtcbiAgICB9XG4gICAgY29uc3QgZm9udEZhbWlseSA9IHRoaXMuI2ZvbnRJbnNwZWN0b3JFbmFibGVkICYmIHN0eWxlLmZvbnRTdWJzdGl0dXRpb24gfHwgc3R5bGUuZm9udEZhbWlseTtcbiAgICBjb25zdCBmb250SGVpZ2h0ID0gTWF0aC5oeXBvdCh0eFsyXSwgdHhbM10pO1xuICAgIGNvbnN0IGZvbnRBc2NlbnQgPSBmb250SGVpZ2h0ICogVGV4dExheWVyLiNnZXRBc2NlbnQoZm9udEZhbWlseSwgdGhpcy4jbGFuZyk7XG4gICAgbGV0IGxlZnQsIHRvcDtcbiAgICBpZiAoYW5nbGUgPT09IDApIHtcbiAgICAgIGxlZnQgPSB0eFs0XTtcbiAgICAgIHRvcCA9IHR4WzVdIC0gZm9udEFzY2VudDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVmdCA9IHR4WzRdICsgZm9udEFzY2VudCAqIE1hdGguc2luKGFuZ2xlKTtcbiAgICAgIHRvcCA9IHR4WzVdIC0gZm9udEFzY2VudCAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGVGYWN0b3JTdHIgPSBcImNhbGModmFyKC0tc2NhbGUtZmFjdG9yKSpcIjtcbiAgICBjb25zdCBkaXZTdHlsZSA9IHRleHREaXYuc3R5bGU7XG4gICAgaWYgKHRoaXMuI2NvbnRhaW5lciA9PT0gdGhpcy4jcm9vdENvbnRhaW5lcikge1xuICAgICAgZGl2U3R5bGUubGVmdCA9IGAkeygxMDAgKiBsZWZ0IC8gdGhpcy4jcGFnZVdpZHRoKS50b0ZpeGVkKDIpfSVgO1xuICAgICAgZGl2U3R5bGUudG9wID0gYCR7KDEwMCAqIHRvcCAvIHRoaXMuI3BhZ2VIZWlnaHQpLnRvRml4ZWQoMil9JWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpdlN0eWxlLmxlZnQgPSBgJHtzY2FsZUZhY3RvclN0cn0ke2xlZnQudG9GaXhlZCgyKX1weClgO1xuICAgICAgZGl2U3R5bGUudG9wID0gYCR7c2NhbGVGYWN0b3JTdHJ9JHt0b3AudG9GaXhlZCgyKX1weClgO1xuICAgIH1cbiAgICBkaXZTdHlsZS5mb250U2l6ZSA9IGAke3NjYWxlRmFjdG9yU3RyfSR7KFRleHRMYXllci4jbWluRm9udFNpemUgKiBmb250SGVpZ2h0KS50b0ZpeGVkKDIpfXB4KWA7XG4gICAgZGl2U3R5bGUuZm9udEZhbWlseSA9IGZvbnRGYW1pbHk7XG4gICAgdGV4dERpdlByb3BlcnRpZXMuZm9udFNpemUgPSBmb250SGVpZ2h0O1xuICAgIHRleHREaXYuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInByZXNlbnRhdGlvblwiKTtcbiAgICB0ZXh0RGl2LnRleHRDb250ZW50ID0gZ2VvbS5zdHI7XG4gICAgdGV4dERpdi5kaXIgPSBnZW9tLmRpcjtcbiAgICBpZiAodGhpcy4jZm9udEluc3BlY3RvckVuYWJsZWQpIHtcbiAgICAgIHRleHREaXYuZGF0YXNldC5mb250TmFtZSA9IHN0eWxlLmZvbnRTdWJzdGl0dXRpb25Mb2FkZWROYW1lIHx8IGdlb20uZm9udE5hbWU7XG4gICAgfVxuICAgIGlmIChhbmdsZSAhPT0gMCkge1xuICAgICAgdGV4dERpdlByb3BlcnRpZXMuYW5nbGUgPSBhbmdsZSAqICgxODAgLyBNYXRoLlBJKTtcbiAgICB9XG4gICAgbGV0IHNob3VsZFNjYWxlVGV4dCA9IGZhbHNlO1xuICAgIGlmIChnZW9tLnN0ci5sZW5ndGggPiAxKSB7XG4gICAgICBzaG91bGRTY2FsZVRleHQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZ2VvbS5zdHIgIT09IFwiIFwiICYmIGdlb20udHJhbnNmb3JtWzBdICE9PSBnZW9tLnRyYW5zZm9ybVszXSkge1xuICAgICAgY29uc3QgYWJzU2NhbGVYID0gTWF0aC5hYnMoZ2VvbS50cmFuc2Zvcm1bMF0pLFxuICAgICAgICBhYnNTY2FsZVkgPSBNYXRoLmFicyhnZW9tLnRyYW5zZm9ybVszXSk7XG4gICAgICBpZiAoYWJzU2NhbGVYICE9PSBhYnNTY2FsZVkgJiYgTWF0aC5tYXgoYWJzU2NhbGVYLCBhYnNTY2FsZVkpIC8gTWF0aC5taW4oYWJzU2NhbGVYLCBhYnNTY2FsZVkpID4gMS41KSB7XG4gICAgICAgIHNob3VsZFNjYWxlVGV4dCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRTY2FsZVRleHQpIHtcbiAgICAgIHRleHREaXZQcm9wZXJ0aWVzLmNhbnZhc1dpZHRoID0gc3R5bGUudmVydGljYWwgPyBnZW9tLmhlaWdodCA6IGdlb20ud2lkdGg7XG4gICAgfVxuICAgIHRoaXMuI3RleHREaXZQcm9wZXJ0aWVzLnNldCh0ZXh0RGl2LCB0ZXh0RGl2UHJvcGVydGllcyk7XG4gICAgdGhpcy4jbGF5b3V0VGV4dFBhcmFtcy5kaXYgPSB0ZXh0RGl2O1xuICAgIHRoaXMuI2xheW91dFRleHRQYXJhbXMucHJvcGVydGllcyA9IHRleHREaXZQcm9wZXJ0aWVzO1xuICAgIHRoaXMuI2xheW91dCh0aGlzLiNsYXlvdXRUZXh0UGFyYW1zKTtcbiAgICBpZiAodGV4dERpdlByb3BlcnRpZXMuaGFzVGV4dCkge1xuICAgICAgdGhpcy4jY29udGFpbmVyLmFwcGVuZCh0ZXh0RGl2KTtcbiAgICB9XG4gICAgaWYgKHRleHREaXZQcm9wZXJ0aWVzLmhhc0VPTCkge1xuICAgICAgY29uc3QgYnIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIik7XG4gICAgICBici5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwicHJlc2VudGF0aW9uXCIpO1xuICAgICAgdGhpcy4jY29udGFpbmVyLmFwcGVuZChicik7XG4gICAgfVxuICB9XG4gICNsYXlvdXQocGFyYW1zKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGl2LFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIGN0eCxcbiAgICAgIHByZXZGb250U2l6ZSxcbiAgICAgIHByZXZGb250RmFtaWx5XG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSBkaXY7XG4gICAgbGV0IHRyYW5zZm9ybSA9IFwiXCI7XG4gICAgaWYgKFRleHRMYXllci4jbWluRm9udFNpemUgPiAxKSB7XG4gICAgICB0cmFuc2Zvcm0gPSBgc2NhbGUoJHsxIC8gVGV4dExheWVyLiNtaW5Gb250U2l6ZX0pYDtcbiAgICB9XG4gICAgaWYgKHByb3BlcnRpZXMuY2FudmFzV2lkdGggIT09IDAgJiYgcHJvcGVydGllcy5oYXNUZXh0KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZvbnRGYW1pbHlcbiAgICAgIH0gPSBzdHlsZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2FudmFzV2lkdGgsXG4gICAgICAgIGZvbnRTaXplXG4gICAgICB9ID0gcHJvcGVydGllcztcbiAgICAgIGlmIChwcmV2Rm9udFNpemUgIT09IGZvbnRTaXplIHx8IHByZXZGb250RmFtaWx5ICE9PSBmb250RmFtaWx5KSB7XG4gICAgICAgIGN0eC5mb250ID0gYCR7Zm9udFNpemUgKiB0aGlzLiNzY2FsZX1weCAke2ZvbnRGYW1pbHl9YDtcbiAgICAgICAgcGFyYW1zLnByZXZGb250U2l6ZSA9IGZvbnRTaXplO1xuICAgICAgICBwYXJhbXMucHJldkZvbnRGYW1pbHkgPSBmb250RmFtaWx5O1xuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aFxuICAgICAgfSA9IGN0eC5tZWFzdXJlVGV4dChkaXYudGV4dENvbnRlbnQpO1xuICAgICAgaWYgKHdpZHRoID4gMCkge1xuICAgICAgICB0cmFuc2Zvcm0gPSBgc2NhbGVYKCR7Y2FudmFzV2lkdGggKiB0aGlzLiNzY2FsZSAvIHdpZHRofSkgJHt0cmFuc2Zvcm19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BlcnRpZXMuYW5nbGUgIT09IDApIHtcbiAgICAgIHRyYW5zZm9ybSA9IGByb3RhdGUoJHtwcm9wZXJ0aWVzLmFuZ2xlfWRlZykgJHt0cmFuc2Zvcm19YDtcbiAgICB9XG4gICAgaWYgKHRyYW5zZm9ybS5sZW5ndGggPiAwKSB7XG4gICAgICBzdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgfVxuICB9XG4gIHN0YXRpYyBjbGVhbnVwKCkge1xuICAgIGlmICh0aGlzLiNwZW5kaW5nVGV4dExheWVycy5zaXplID4gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNhc2NlbnRDYWNoZS5jbGVhcigpO1xuICAgIGZvciAoY29uc3Qge1xuICAgICAgY2FudmFzXG4gICAgfSBvZiB0aGlzLiNjYW52YXNDb250ZXh0cy52YWx1ZXMoKSkge1xuICAgICAgY2FudmFzLnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLiNjYW52YXNDb250ZXh0cy5jbGVhcigpO1xuICB9XG4gIHN0YXRpYyAjZ2V0Q3R4KGxhbmcgPSBudWxsKSB7XG4gICAgbGV0IGNhbnZhc0NvbnRleHQgPSB0aGlzLiNjYW52YXNDb250ZXh0cy5nZXQobGFuZyB8fD0gXCJcIik7XG4gICAgaWYgKCFjYW52YXNDb250ZXh0KSB7XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgY2FudmFzLmNsYXNzTmFtZSA9IFwiaGlkZGVuQ2FudmFzRWxlbWVudFwiO1xuICAgICAgY2FudmFzLmxhbmcgPSBsYW5nO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoY2FudmFzKTtcbiAgICAgIGNhbnZhc0NvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIsIHtcbiAgICAgICAgYWxwaGE6IGZhbHNlLFxuICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWVcbiAgICAgIH0pO1xuICAgICAgdGhpcy4jY2FudmFzQ29udGV4dHMuc2V0KGxhbmcsIGNhbnZhc0NvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gY2FudmFzQ29udGV4dDtcbiAgfVxuICBzdGF0aWMgI2Vuc3VyZU1pbkZvbnRTaXplQ29tcHV0ZWQoKSB7XG4gICAgaWYgKHRoaXMuI21pbkZvbnRTaXplICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgIGRpdi5zdHlsZS5saW5lSGVpZ2h0ID0gMTtcbiAgICBkaXYuc3R5bGUuZm9udFNpemUgPSBcIjFweFwiO1xuICAgIGRpdi50ZXh0Q29udGVudCA9IFwiWFwiO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGRpdik7XG4gICAgdGhpcy4jbWluRm9udFNpemUgPSBkaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIGRpdi5yZW1vdmUoKTtcbiAgfVxuICBzdGF0aWMgI2dldEFzY2VudChmb250RmFtaWx5LCBsYW5nKSB7XG4gICAgY29uc3QgY2FjaGVkQXNjZW50ID0gdGhpcy4jYXNjZW50Q2FjaGUuZ2V0KGZvbnRGYW1pbHkpO1xuICAgIGlmIChjYWNoZWRBc2NlbnQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRBc2NlbnQ7XG4gICAgfVxuICAgIGNvbnN0IGN0eCA9IHRoaXMuI2dldEN0eChsYW5nKTtcbiAgICBjb25zdCBzYXZlZEZvbnQgPSBjdHguZm9udDtcbiAgICBjdHguY2FudmFzLndpZHRoID0gY3R4LmNhbnZhcy5oZWlnaHQgPSBERUZBVUxUX0ZPTlRfU0laRTtcbiAgICBjdHguZm9udCA9IGAke0RFRkFVTFRfRk9OVF9TSVpFfXB4ICR7Zm9udEZhbWlseX1gO1xuICAgIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQoXCJcIik7XG4gICAgbGV0IGFzY2VudCA9IG1ldHJpY3MuZm9udEJvdW5kaW5nQm94QXNjZW50O1xuICAgIGxldCBkZXNjZW50ID0gTWF0aC5hYnMobWV0cmljcy5mb250Qm91bmRpbmdCb3hEZXNjZW50KTtcbiAgICBpZiAoYXNjZW50KSB7XG4gICAgICBjb25zdCByYXRpbyA9IGFzY2VudCAvIChhc2NlbnQgKyBkZXNjZW50KTtcbiAgICAgIHRoaXMuI2FzY2VudENhY2hlLnNldChmb250RmFtaWx5LCByYXRpbyk7XG4gICAgICBjdHguY2FudmFzLndpZHRoID0gY3R4LmNhbnZhcy5oZWlnaHQgPSAwO1xuICAgICAgY3R4LmZvbnQgPSBzYXZlZEZvbnQ7XG4gICAgICByZXR1cm4gcmF0aW87XG4gICAgfVxuICAgIGN0eC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9GT05UX1NJWkUpO1xuICAgIGN0eC5zdHJva2VUZXh0KFwiZ1wiLCAwLCAwKTtcbiAgICBsZXQgcGl4ZWxzID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9GT05UX1NJWkUpLmRhdGE7XG4gICAgZGVzY2VudCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IHBpeGVscy5sZW5ndGggLSAxIC0gMzsgaSA+PSAwOyBpIC09IDQpIHtcbiAgICAgIGlmIChwaXhlbHNbaV0gPiAwKSB7XG4gICAgICAgIGRlc2NlbnQgPSBNYXRoLmNlaWwoaSAvIDQgLyBERUZBVUxUX0ZPTlRfU0laRSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIERFRkFVTFRfRk9OVF9TSVpFLCBERUZBVUxUX0ZPTlRfU0laRSk7XG4gICAgY3R4LnN0cm9rZVRleHQoXCJBXCIsIDAsIERFRkFVTFRfRk9OVF9TSVpFKTtcbiAgICBwaXhlbHMgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIERFRkFVTFRfRk9OVF9TSVpFLCBERUZBVUxUX0ZPTlRfU0laRSkuZGF0YTtcbiAgICBhc2NlbnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBpeGVscy5sZW5ndGg7IGkgPCBpaTsgaSArPSA0KSB7XG4gICAgICBpZiAocGl4ZWxzW2ldID4gMCkge1xuICAgICAgICBhc2NlbnQgPSBERUZBVUxUX0ZPTlRfU0laRSAtIE1hdGguZmxvb3IoaSAvIDQgLyBERUZBVUxUX0ZPTlRfU0laRSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjdHguY2FudmFzLndpZHRoID0gY3R4LmNhbnZhcy5oZWlnaHQgPSAwO1xuICAgIGN0eC5mb250ID0gc2F2ZWRGb250O1xuICAgIGNvbnN0IHJhdGlvID0gYXNjZW50ID8gYXNjZW50IC8gKGFzY2VudCArIGRlc2NlbnQpIDogREVGQVVMVF9GT05UX0FTQ0VOVDtcbiAgICB0aGlzLiNhc2NlbnRDYWNoZS5zZXQoZm9udEZhbWlseSwgcmF0aW8pO1xuICAgIHJldHVybiByYXRpbztcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyKCkge1xuICBkZXByZWNhdGVkKFwiYHJlbmRlclRleHRMYXllcmAsIHBsZWFzZSB1c2UgYFRleHRMYXllcmAgaW5zdGVhZC5cIik7XG4gIGNvbnN0IHtcbiAgICB0ZXh0Q29udGVudFNvdXJjZSxcbiAgICBjb250YWluZXIsXG4gICAgdmlld3BvcnQsXG4gICAgLi4ucmVzdFxuICB9ID0gYXJndW1lbnRzWzBdO1xuICBjb25zdCByZXN0S2V5cyA9IE9iamVjdC5rZXlzKHJlc3QpO1xuICBpZiAocmVzdEtleXMubGVuZ3RoID4gMCkge1xuICAgIHdhcm4oXCJJZ25vcmluZyBgcmVuZGVyVGV4dExheWVyYCBwYXJhbWV0ZXJzOiBcIiArIHJlc3RLZXlzLmpvaW4oXCIsIFwiKSk7XG4gIH1cbiAgY29uc3QgdGV4dExheWVyID0gbmV3IFRleHRMYXllcih7XG4gICAgdGV4dENvbnRlbnRTb3VyY2UsXG4gICAgY29udGFpbmVyLFxuICAgIHZpZXdwb3J0XG4gIH0pO1xuICBjb25zdCB7XG4gICAgdGV4dERpdnMsXG4gICAgdGV4dENvbnRlbnRJdGVtc1N0clxuICB9ID0gdGV4dExheWVyO1xuICBjb25zdCBwcm9taXNlID0gdGV4dExheWVyLnJlbmRlcigpO1xuICByZXR1cm4ge1xuICAgIHByb21pc2UsXG4gICAgdGV4dERpdnMsXG4gICAgdGV4dENvbnRlbnRJdGVtc1N0clxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlVGV4dExheWVyKCkge1xuICBkZXByZWNhdGVkKFwiYHVwZGF0ZVRleHRMYXllcmAsIHBsZWFzZSB1c2UgYFRleHRMYXllcmAgaW5zdGVhZC5cIik7XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L3hmYV90ZXh0LmpzXG5jbGFzcyBYZmFUZXh0IHtcbiAgc3RhdGljIHRleHRDb250ZW50KHhmYSkge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgaXRlbXMsXG4gICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHdhbGsobm9kZSkge1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBzdHIgPSBudWxsO1xuICAgICAgY29uc3QgbmFtZSA9IG5vZGUubmFtZTtcbiAgICAgIGlmIChuYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgc3RyID0gbm9kZS52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIVhmYVRleHQuc2hvdWxkQnVpbGRUZXh0KG5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAobm9kZT8uYXR0cmlidXRlcz8udGV4dENvbnRlbnQpIHtcbiAgICAgICAgc3RyID0gbm9kZS5hdHRyaWJ1dGVzLnRleHRDb250ZW50O1xuICAgICAgfSBlbHNlIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgIHN0ciA9IG5vZGUudmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoc3RyICE9PSBudWxsKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgIHN0clxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghbm9kZS5jaGlsZHJlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgd2FsayhjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHdhbGsoeGZhKTtcbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG4gIHN0YXRpYyBzaG91bGRCdWlsZFRleHQobmFtZSkge1xuICAgIHJldHVybiAhKG5hbWUgPT09IFwidGV4dGFyZWFcIiB8fCBuYW1lID09PSBcImlucHV0XCIgfHwgbmFtZSA9PT0gXCJvcHRpb25cIiB8fCBuYW1lID09PSBcInNlbGVjdFwiKTtcbiAgfVxufVxuXG47Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvZGlzcGxheS9hcGkuanNcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFID0gNjU1MzY7XG5jb25zdCBSRU5ERVJJTkdfQ0FOQ0VMTEVEX1RJTUVPVVQgPSAxMDA7XG5jb25zdCBERUxBWUVEX0NMRUFOVVBfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBEZWZhdWx0Q2FudmFzRmFjdG9yeSA9IGlzTm9kZUpTID8gTm9kZUNhbnZhc0ZhY3RvcnkgOiBET01DYW52YXNGYWN0b3J5O1xuY29uc3QgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gaXNOb2RlSlMgPyBOb2RlQ01hcFJlYWRlckZhY3RvcnkgOiBET01DTWFwUmVhZGVyRmFjdG9yeTtcbmNvbnN0IERlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gaXNOb2RlSlMgPyBOb2RlRmlsdGVyRmFjdG9yeSA6IERPTUZpbHRlckZhY3Rvcnk7XG5jb25zdCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBpc05vZGVKUyA/IE5vZGVTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA6IERPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnQoc3JjID0ge30pIHtcbiAgaWYgKHR5cGVvZiBzcmMgPT09IFwic3RyaW5nXCIgfHwgc3JjIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgc3JjID0ge1xuICAgICAgdXJsOiBzcmNcbiAgICB9O1xuICB9IGVsc2UgaWYgKHNyYyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyhzcmMpKSB7XG4gICAgc3JjID0ge1xuICAgICAgZGF0YTogc3JjXG4gICAgfTtcbiAgfVxuICBjb25zdCB0YXNrID0gbmV3IFBERkRvY3VtZW50TG9hZGluZ1Rhc2soKTtcbiAgY29uc3Qge1xuICAgIGRvY0lkXG4gIH0gPSB0YXNrO1xuICBjb25zdCB1cmwgPSBzcmMudXJsID8gZ2V0VXJsUHJvcChzcmMudXJsKSA6IG51bGw7XG4gIGNvbnN0IGRhdGEgPSBzcmMuZGF0YSA/IGdldERhdGFQcm9wKHNyYy5kYXRhKSA6IG51bGw7XG4gIGNvbnN0IGh0dHBIZWFkZXJzID0gc3JjLmh0dHBIZWFkZXJzIHx8IG51bGw7XG4gIGNvbnN0IHdpdGhDcmVkZW50aWFscyA9IHNyYy53aXRoQ3JlZGVudGlhbHMgPT09IHRydWU7XG4gIGNvbnN0IHBhc3N3b3JkID0gc3JjLnBhc3N3b3JkID8/IG51bGw7XG4gIGNvbnN0IHJhbmdlVHJhbnNwb3J0ID0gc3JjLnJhbmdlIGluc3RhbmNlb2YgUERGRGF0YVJhbmdlVHJhbnNwb3J0ID8gc3JjLnJhbmdlIDogbnVsbDtcbiAgY29uc3QgcmFuZ2VDaHVua1NpemUgPSBOdW1iZXIuaXNJbnRlZ2VyKHNyYy5yYW5nZUNodW5rU2l6ZSkgJiYgc3JjLnJhbmdlQ2h1bmtTaXplID4gMCA/IHNyYy5yYW5nZUNodW5rU2l6ZSA6IERFRkFVTFRfUkFOR0VfQ0hVTktfU0laRTtcbiAgbGV0IHdvcmtlciA9IHNyYy53b3JrZXIgaW5zdGFuY2VvZiBQREZXb3JrZXIgPyBzcmMud29ya2VyIDogbnVsbDtcbiAgY29uc3QgdmVyYm9zaXR5ID0gc3JjLnZlcmJvc2l0eTtcbiAgY29uc3QgZG9jQmFzZVVybCA9IHR5cGVvZiBzcmMuZG9jQmFzZVVybCA9PT0gXCJzdHJpbmdcIiAmJiAhaXNEYXRhU2NoZW1lKHNyYy5kb2NCYXNlVXJsKSA/IHNyYy5kb2NCYXNlVXJsIDogbnVsbDtcbiAgY29uc3QgY01hcFVybCA9IHR5cGVvZiBzcmMuY01hcFVybCA9PT0gXCJzdHJpbmdcIiA/IHNyYy5jTWFwVXJsIDogbnVsbDtcbiAgY29uc3QgY01hcFBhY2tlZCA9IHNyYy5jTWFwUGFja2VkICE9PSBmYWxzZTtcbiAgY29uc3QgQ01hcFJlYWRlckZhY3RvcnkgPSBzcmMuQ01hcFJlYWRlckZhY3RvcnkgfHwgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5O1xuICBjb25zdCBzdGFuZGFyZEZvbnREYXRhVXJsID0gdHlwZW9mIHNyYy5zdGFuZGFyZEZvbnREYXRhVXJsID09PSBcInN0cmluZ1wiID8gc3JjLnN0YW5kYXJkRm9udERhdGFVcmwgOiBudWxsO1xuICBjb25zdCBTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IHNyYy5TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB8fCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG4gIGNvbnN0IGlnbm9yZUVycm9ycyA9IHNyYy5zdG9wQXRFcnJvcnMgIT09IHRydWU7XG4gIGNvbnN0IG1heEltYWdlU2l6ZSA9IE51bWJlci5pc0ludGVnZXIoc3JjLm1heEltYWdlU2l6ZSkgJiYgc3JjLm1heEltYWdlU2l6ZSA+IC0xID8gc3JjLm1heEltYWdlU2l6ZSA6IC0xO1xuICBjb25zdCBpc0V2YWxTdXBwb3J0ZWQgPSBzcmMuaXNFdmFsU3VwcG9ydGVkICE9PSBmYWxzZTtcbiAgY29uc3QgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSB0eXBlb2Ygc3JjLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID09PSBcImJvb2xlYW5cIiA/IHNyYy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA6ICFpc05vZGVKUztcbiAgY29uc3QgY2FudmFzTWF4QXJlYUluQnl0ZXMgPSBOdW1iZXIuaXNJbnRlZ2VyKHNyYy5jYW52YXNNYXhBcmVhSW5CeXRlcykgPyBzcmMuY2FudmFzTWF4QXJlYUluQnl0ZXMgOiAtMTtcbiAgY29uc3QgZGlzYWJsZUZvbnRGYWNlID0gdHlwZW9mIHNyYy5kaXNhYmxlRm9udEZhY2UgPT09IFwiYm9vbGVhblwiID8gc3JjLmRpc2FibGVGb250RmFjZSA6IGlzTm9kZUpTO1xuICBjb25zdCBmb250RXh0cmFQcm9wZXJ0aWVzID0gc3JjLmZvbnRFeHRyYVByb3BlcnRpZXMgPT09IHRydWU7XG4gIGNvbnN0IGVuYWJsZVhmYSA9IHNyYy5lbmFibGVYZmEgPT09IHRydWU7XG4gIGNvbnN0IG93bmVyRG9jdW1lbnQgPSBzcmMub3duZXJEb2N1bWVudCB8fCBnbG9iYWxUaGlzLmRvY3VtZW50O1xuICBjb25zdCBkaXNhYmxlUmFuZ2UgPSBzcmMuZGlzYWJsZVJhbmdlID09PSB0cnVlO1xuICBjb25zdCBkaXNhYmxlU3RyZWFtID0gc3JjLmRpc2FibGVTdHJlYW0gPT09IHRydWU7XG4gIGNvbnN0IGRpc2FibGVBdXRvRmV0Y2ggPSBzcmMuZGlzYWJsZUF1dG9GZXRjaCA9PT0gdHJ1ZTtcbiAgY29uc3QgcGRmQnVnID0gc3JjLnBkZkJ1ZyA9PT0gdHJ1ZTtcbiAgY29uc3QgZW5hYmxlSFdBID0gc3JjLmVuYWJsZUhXQSA9PT0gdHJ1ZTtcbiAgY29uc3QgbGVuZ3RoID0gcmFuZ2VUcmFuc3BvcnQgPyByYW5nZVRyYW5zcG9ydC5sZW5ndGggOiBzcmMubGVuZ3RoID8/IE5hTjtcbiAgY29uc3QgdXNlU3lzdGVtRm9udHMgPSB0eXBlb2Ygc3JjLnVzZVN5c3RlbUZvbnRzID09PSBcImJvb2xlYW5cIiA/IHNyYy51c2VTeXN0ZW1Gb250cyA6ICFpc05vZGVKUyAmJiAhZGlzYWJsZUZvbnRGYWNlO1xuICBjb25zdCB1c2VXb3JrZXJGZXRjaCA9IHR5cGVvZiBzcmMudXNlV29ya2VyRmV0Y2ggPT09IFwiYm9vbGVhblwiID8gc3JjLnVzZVdvcmtlckZldGNoIDogQ01hcFJlYWRlckZhY3RvcnkgPT09IERPTUNNYXBSZWFkZXJGYWN0b3J5ICYmIFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID09PSBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSAmJiBjTWFwVXJsICYmIHN0YW5kYXJkRm9udERhdGFVcmwgJiYgaXNWYWxpZEZldGNoVXJsKGNNYXBVcmwsIGRvY3VtZW50LmJhc2VVUkkpICYmIGlzVmFsaWRGZXRjaFVybChzdGFuZGFyZEZvbnREYXRhVXJsLCBkb2N1bWVudC5iYXNlVVJJKTtcbiAgY29uc3QgY2FudmFzRmFjdG9yeSA9IHNyYy5jYW52YXNGYWN0b3J5IHx8IG5ldyBEZWZhdWx0Q2FudmFzRmFjdG9yeSh7XG4gICAgb3duZXJEb2N1bWVudCxcbiAgICBlbmFibGVIV0FcbiAgfSk7XG4gIGNvbnN0IGZpbHRlckZhY3RvcnkgPSBzcmMuZmlsdGVyRmFjdG9yeSB8fCBuZXcgRGVmYXVsdEZpbHRlckZhY3Rvcnkoe1xuICAgIGRvY0lkLFxuICAgIG93bmVyRG9jdW1lbnRcbiAgfSk7XG4gIGNvbnN0IHN0eWxlRWxlbWVudCA9IG51bGw7XG4gIHNldFZlcmJvc2l0eUxldmVsKHZlcmJvc2l0eSk7XG4gIGNvbnN0IHRyYW5zcG9ydEZhY3RvcnkgPSB7XG4gICAgY2FudmFzRmFjdG9yeSxcbiAgICBmaWx0ZXJGYWN0b3J5XG4gIH07XG4gIGlmICghdXNlV29ya2VyRmV0Y2gpIHtcbiAgICB0cmFuc3BvcnRGYWN0b3J5LmNNYXBSZWFkZXJGYWN0b3J5ID0gbmV3IENNYXBSZWFkZXJGYWN0b3J5KHtcbiAgICAgIGJhc2VVcmw6IGNNYXBVcmwsXG4gICAgICBpc0NvbXByZXNzZWQ6IGNNYXBQYWNrZWRcbiAgICB9KTtcbiAgICB0cmFuc3BvcnRGYWN0b3J5LnN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gbmV3IFN0YW5kYXJkRm9udERhdGFGYWN0b3J5KHtcbiAgICAgIGJhc2VVcmw6IHN0YW5kYXJkRm9udERhdGFVcmxcbiAgICB9KTtcbiAgfVxuICBpZiAoIXdvcmtlcikge1xuICAgIGNvbnN0IHdvcmtlclBhcmFtcyA9IHtcbiAgICAgIHZlcmJvc2l0eSxcbiAgICAgIHBvcnQ6IEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyUG9ydFxuICAgIH07XG4gICAgd29ya2VyID0gd29ya2VyUGFyYW1zLnBvcnQgPyBQREZXb3JrZXIuZnJvbVBvcnQod29ya2VyUGFyYW1zKSA6IG5ldyBQREZXb3JrZXIod29ya2VyUGFyYW1zKTtcbiAgICB0YXNrLl93b3JrZXIgPSB3b3JrZXI7XG4gIH1cbiAgY29uc3QgZG9jUGFyYW1zID0ge1xuICAgIGRvY0lkLFxuICAgIGFwaVZlcnNpb246IFwiNC40LjE2OFwiLFxuICAgIGRhdGEsXG4gICAgcGFzc3dvcmQsXG4gICAgZGlzYWJsZUF1dG9GZXRjaCxcbiAgICByYW5nZUNodW5rU2l6ZSxcbiAgICBsZW5ndGgsXG4gICAgZG9jQmFzZVVybCxcbiAgICBlbmFibGVYZmEsXG4gICAgZXZhbHVhdG9yT3B0aW9uczoge1xuICAgICAgbWF4SW1hZ2VTaXplLFxuICAgICAgZGlzYWJsZUZvbnRGYWNlLFxuICAgICAgaWdub3JlRXJyb3JzLFxuICAgICAgaXNFdmFsU3VwcG9ydGVkLFxuICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQsXG4gICAgICBjYW52YXNNYXhBcmVhSW5CeXRlcyxcbiAgICAgIGZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgICB1c2VTeXN0ZW1Gb250cyxcbiAgICAgIGNNYXBVcmw6IHVzZVdvcmtlckZldGNoID8gY01hcFVybCA6IG51bGwsXG4gICAgICBzdGFuZGFyZEZvbnREYXRhVXJsOiB1c2VXb3JrZXJGZXRjaCA/IHN0YW5kYXJkRm9udERhdGFVcmwgOiBudWxsXG4gICAgfVxuICB9O1xuICBjb25zdCB0cmFuc3BvcnRQYXJhbXMgPSB7XG4gICAgZGlzYWJsZUZvbnRGYWNlLFxuICAgIGZvbnRFeHRyYVByb3BlcnRpZXMsXG4gICAgb3duZXJEb2N1bWVudCxcbiAgICBwZGZCdWcsXG4gICAgc3R5bGVFbGVtZW50LFxuICAgIGxvYWRpbmdQYXJhbXM6IHtcbiAgICAgIGRpc2FibGVBdXRvRmV0Y2gsXG4gICAgICBlbmFibGVYZmFcbiAgICB9XG4gIH07XG4gIHdvcmtlci5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIGlmICh0YXNrLmRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgIH1cbiAgICBpZiAod29ya2VyLmRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IHdvcmtlcklkUHJvbWlzZSA9IHdvcmtlci5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREb2NSZXF1ZXN0XCIsIGRvY1BhcmFtcywgZGF0YSA/IFtkYXRhLmJ1ZmZlcl0gOiBudWxsKTtcbiAgICBsZXQgbmV0d29ya1N0cmVhbTtcbiAgICBpZiAocmFuZ2VUcmFuc3BvcnQpIHtcbiAgICAgIG5ldHdvcmtTdHJlYW0gPSBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbShyYW5nZVRyYW5zcG9ydCwge1xuICAgICAgICBkaXNhYmxlUmFuZ2UsXG4gICAgICAgIGRpc2FibGVTdHJlYW1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIWRhdGEpIHtcbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImdldERvY3VtZW50IC0gbm8gYHVybGAgcGFyYW1ldGVyIHByb3ZpZGVkLlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNyZWF0ZVBERk5ldHdvcmtTdHJlYW0gPSBwYXJhbXMgPT4ge1xuICAgICAgICBpZiAoaXNOb2RlSlMpIHtcbiAgICAgICAgICBjb25zdCBpc0ZldGNoU3VwcG9ydGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBmZXRjaCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgUmVzcG9uc2UgIT09IFwidW5kZWZpbmVkXCIgJiYgXCJib2R5XCIgaW4gUmVzcG9uc2UucHJvdG90eXBlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGlzRmV0Y2hTdXBwb3J0ZWQoKSAmJiBpc1ZhbGlkRmV0Y2hVcmwocGFyYW1zLnVybCkgPyBuZXcgUERGRmV0Y2hTdHJlYW0ocGFyYW1zKSA6IG5ldyBQREZOb2RlU3RyZWFtKHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmFsaWRGZXRjaFVybChwYXJhbXMudXJsKSA/IG5ldyBQREZGZXRjaFN0cmVhbShwYXJhbXMpIDogbmV3IFBERk5ldHdvcmtTdHJlYW0ocGFyYW1zKTtcbiAgICAgIH07XG4gICAgICBuZXR3b3JrU3RyZWFtID0gY3JlYXRlUERGTmV0d29ya1N0cmVhbSh7XG4gICAgICAgIHVybCxcbiAgICAgICAgbGVuZ3RoLFxuICAgICAgICBodHRwSGVhZGVycyxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzLFxuICAgICAgICByYW5nZUNodW5rU2l6ZSxcbiAgICAgICAgZGlzYWJsZVJhbmdlLFxuICAgICAgICBkaXNhYmxlU3RyZWFtXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtlcklkUHJvbWlzZS50aGVuKHdvcmtlcklkID0+IHtcbiAgICAgIGlmICh0YXNrLmRlc3Ryb3llZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkaW5nIGFib3J0ZWRcIik7XG4gICAgICB9XG4gICAgICBpZiAod29ya2VyLmRlc3Ryb3llZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKGRvY0lkLCB3b3JrZXJJZCwgd29ya2VyLnBvcnQpO1xuICAgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFdvcmtlclRyYW5zcG9ydChtZXNzYWdlSGFuZGxlciwgdGFzaywgbmV0d29ya1N0cmVhbSwgdHJhbnNwb3J0UGFyYW1zLCB0cmFuc3BvcnRGYWN0b3J5KTtcbiAgICAgIHRhc2suX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgICAgIG1lc3NhZ2VIYW5kbGVyLnNlbmQoXCJSZWFkeVwiLCBudWxsKTtcbiAgICB9KTtcbiAgfSkuY2F0Y2godGFzay5fY2FwYWJpbGl0eS5yZWplY3QpO1xuICByZXR1cm4gdGFzaztcbn1cbmZ1bmN0aW9uIGdldFVybFByb3AodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBVUkwpIHtcbiAgICByZXR1cm4gdmFsLmhyZWY7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh2YWwsIHdpbmRvdy5sb2NhdGlvbikuaHJlZjtcbiAgfSBjYXRjaCB7XG4gICAgaWYgKGlzTm9kZUpTICYmIHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgUERGIHVybCBkYXRhOiBcIiArIFwiZWl0aGVyIHN0cmluZyBvciBVUkwtb2JqZWN0IGlzIGV4cGVjdGVkIGluIHRoZSB1cmwgcHJvcGVydHkuXCIpO1xufVxuZnVuY3Rpb24gZ2V0RGF0YVByb3AodmFsKSB7XG4gIGlmIChpc05vZGVKUyAmJiB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbCBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlBsZWFzZSBwcm92aWRlIGJpbmFyeSBkYXRhIGFzIGBVaW50OEFycmF5YCwgcmF0aGVyIHRoYW4gYEJ1ZmZlcmAuXCIpO1xuICB9XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIHZhbC5ieXRlTGVuZ3RoID09PSB2YWwuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RvQnl0ZXModmFsKTtcbiAgfVxuICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCkgfHwgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJiAhaXNOYU4odmFsPy5sZW5ndGgpKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBQREYgYmluYXJ5IGRhdGE6IGVpdGhlciBUeXBlZEFycmF5LCBcIiArIFwic3RyaW5nLCBvciBhcnJheS1saWtlIG9iamVjdCBpcyBleHBlY3RlZCBpbiB0aGUgZGF0YSBwcm9wZXJ0eS5cIik7XG59XG5mdW5jdGlvbiBpc1JlZlByb3h5KHJlZikge1xuICByZXR1cm4gdHlwZW9mIHJlZiA9PT0gXCJvYmplY3RcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKHJlZj8ubnVtKSAmJiByZWYubnVtID49IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihyZWY/LmdlbikgJiYgcmVmLmdlbiA+PSAwO1xufVxuY2xhc3MgUERGRG9jdW1lbnRMb2FkaW5nVGFzayB7XG4gIHN0YXRpYyAjZG9jSWQgPSAwO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9jYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgdGhpcy5fdHJhbnNwb3J0ID0gbnVsbDtcbiAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgIHRoaXMuZG9jSWQgPSBgZCR7UERGRG9jdW1lbnRMb2FkaW5nVGFzay4jZG9jSWQrK31gO1xuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5vblBhc3N3b3JkID0gbnVsbDtcbiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICB9XG4gIGdldCBwcm9taXNlKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLl93b3JrZXI/LnBvcnQpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyLl9wZW5kaW5nRGVzdHJveSA9IHRydWU7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLl90cmFuc3BvcnQ/LmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKHRoaXMuX3dvcmtlcj8ucG9ydCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fd29ya2VyLl9wZW5kaW5nRGVzdHJveTtcbiAgICAgIH1cbiAgICAgIHRocm93IGV4O1xuICAgIH1cbiAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuICAgIGlmICh0aGlzLl93b3JrZXIpIHtcbiAgICAgIHRoaXMuX3dvcmtlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgUERGRGF0YVJhbmdlVHJhbnNwb3J0IHtcbiAgY29uc3RydWN0b3IobGVuZ3RoLCBpbml0aWFsRGF0YSwgcHJvZ3Jlc3NpdmVEb25lID0gZmFsc2UsIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gbnVsbCkge1xuICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIHRoaXMuaW5pdGlhbERhdGEgPSBpbml0aWFsRGF0YTtcbiAgICB0aGlzLnByb2dyZXNzaXZlRG9uZSA9IHByb2dyZXNzaXZlRG9uZTtcbiAgICB0aGlzLmNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU7XG4gICAgdGhpcy5fcmFuZ2VMaXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycyA9IFtdO1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycyA9IFtdO1xuICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycyA9IFtdO1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICB9XG4gIGFkZFJhbmdlTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICB0aGlzLl9yYW5nZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgfVxuICBhZGRQcm9ncmVzc0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cbiAgYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cbiAgYWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cbiAgb25EYXRhUmFuZ2UoYmVnaW4sIGNodW5rKSB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9yYW5nZUxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoYmVnaW4sIGNodW5rKTtcbiAgICB9XG4gIH1cbiAgb25EYXRhUHJvZ3Jlc3MobG9hZGVkLCB0b3RhbCkge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycykge1xuICAgICAgICBsaXN0ZW5lcihsb2FkZWQsIHRvdGFsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBvbkRhdGFQcm9ncmVzc2l2ZVJlYWQoY2h1bmspIHtcbiAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyKGNodW5rKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBvbkRhdGFQcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycykge1xuICAgICAgICBsaXN0ZW5lcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHRyYW5zcG9ydFJlYWR5KCkge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gIH1cbiAgcmVxdWVzdERhdGFSYW5nZShiZWdpbiwgZW5kKSB7XG4gICAgdW5yZWFjaGFibGUoXCJBYnN0cmFjdCBtZXRob2QgUERGRGF0YVJhbmdlVHJhbnNwb3J0LnJlcXVlc3REYXRhUmFuZ2VcIik7XG4gIH1cbiAgYWJvcnQoKSB7fVxufVxuY2xhc3MgUERGRG9jdW1lbnRQcm94eSB7XG4gIGNvbnN0cnVjdG9yKHBkZkluZm8sIHRyYW5zcG9ydCkge1xuICAgIHRoaXMuX3BkZkluZm8gPSBwZGZJbmZvO1xuICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgfVxuICBnZXQgYW5ub3RhdGlvblN0b3JhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgfVxuICBnZXQgZmlsdGVyRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmZpbHRlckZhY3Rvcnk7XG4gIH1cbiAgZ2V0IG51bVBhZ2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9wZGZJbmZvLm51bVBhZ2VzO1xuICB9XG4gIGdldCBmaW5nZXJwcmludHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BkZkluZm8uZmluZ2VycHJpbnRzO1xuICB9XG4gIGdldCBpc1B1cmVYZmEoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzUHVyZVhmYVwiLCAhIXRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSk7XG4gIH1cbiAgZ2V0IGFsbFhmYUh0bWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYTtcbiAgfVxuICBnZXRQYWdlKHBhZ2VOdW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2UocGFnZU51bWJlcik7XG4gIH1cbiAgZ2V0UGFnZUluZGV4KHJlZikge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUluZGV4KHJlZik7XG4gIH1cbiAgZ2V0RGVzdGluYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb25zKCk7XG4gIH1cbiAgZ2V0RGVzdGluYXRpb24oaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERlc3RpbmF0aW9uKGlkKTtcbiAgfVxuICBnZXRQYWdlTGFiZWxzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxhYmVscygpO1xuICB9XG4gIGdldFBhZ2VMYXlvdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTGF5b3V0KCk7XG4gIH1cbiAgZ2V0UGFnZU1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTW9kZSgpO1xuICB9XG4gIGdldFZpZXdlclByZWZlcmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKTtcbiAgfVxuICBnZXRPcGVuQWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3BlbkFjdGlvbigpO1xuICB9XG4gIGdldEF0dGFjaG1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0QXR0YWNobWVudHMoKTtcbiAgfVxuICBnZXRKU0FjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREb2NKU0FjdGlvbnMoKTtcbiAgfVxuICBnZXRPdXRsaW5lKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3V0bGluZSgpO1xuICB9XG4gIGdldE9wdGlvbmFsQ29udGVudENvbmZpZyh7XG4gICAgaW50ZW50ID0gXCJkaXNwbGF5XCJcbiAgfSA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgcmVuZGVyaW5nSW50ZW50XG4gICAgfSA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KTtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZyhyZW5kZXJpbmdJbnRlbnQpO1xuICB9XG4gIGdldFBlcm1pc3Npb25zKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGVybWlzc2lvbnMoKTtcbiAgfVxuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE1ldGFkYXRhKCk7XG4gIH1cbiAgZ2V0TWFya0luZm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNYXJrSW5mbygpO1xuICB9XG4gIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREYXRhKCk7XG4gIH1cbiAgc2F2ZURvY3VtZW50KCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc2F2ZURvY3VtZW50KCk7XG4gIH1cbiAgZ2V0RG93bmxvYWRJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gIGNsZWFudXAoa2VlcExvYWRlZEZvbnRzID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LnN0YXJ0Q2xlYW51cChrZWVwTG9hZGVkRm9udHMgfHwgdGhpcy5pc1B1cmVYZmEpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1Rhc2suZGVzdHJveSgpO1xuICB9XG4gIGNhY2hlZFBhZ2VOdW1iZXIocmVmKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5jYWNoZWRQYWdlTnVtYmVyKHJlZik7XG4gIH1cbiAgZ2V0IGxvYWRpbmdQYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nUGFyYW1zO1xuICB9XG4gIGdldCBsb2FkaW5nVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdUYXNrO1xuICB9XG4gIGdldEZpZWxkT2JqZWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEZpZWxkT2JqZWN0cygpO1xuICB9XG4gIGhhc0pTQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Lmhhc0pTQWN0aW9ucygpO1xuICB9XG4gIGdldENhbGN1bGF0aW9uT3JkZXJJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRDYWxjdWxhdGlvbk9yZGVySWRzKCk7XG4gIH1cbn1cbmNsYXNzIFBERlBhZ2VQcm94eSB7XG4gICNkZWxheWVkQ2xlYW51cFRpbWVvdXQgPSBudWxsO1xuICAjcGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocGFnZUluZGV4LCBwYWdlSW5mbywgdHJhbnNwb3J0LCBwZGZCdWcgPSBmYWxzZSkge1xuICAgIHRoaXMuX3BhZ2VJbmRleCA9IHBhZ2VJbmRleDtcbiAgICB0aGlzLl9wYWdlSW5mbyA9IHBhZ2VJbmZvO1xuICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgICB0aGlzLl9zdGF0cyA9IHBkZkJ1ZyA/IG5ldyBTdGF0VGltZXIoKSA6IG51bGw7XG4gICAgdGhpcy5fcGRmQnVnID0gcGRmQnVnO1xuICAgIHRoaXMuY29tbW9uT2JqcyA9IHRyYW5zcG9ydC5jb21tb25PYmpzO1xuICAgIHRoaXMub2JqcyA9IG5ldyBQREZPYmplY3RzKCk7XG4gICAgdGhpcy5fbWF5YmVDbGVhbnVwQWZ0ZXJSZW5kZXIgPSBmYWxzZTtcbiAgICB0aGlzLl9pbnRlbnRTdGF0ZXMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgfVxuICBnZXQgcGFnZU51bWJlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUluZGV4ICsgMTtcbiAgfVxuICBnZXQgcm90YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby5yb3RhdGU7XG4gIH1cbiAgZ2V0IHJlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucmVmO1xuICB9XG4gIGdldCB1c2VyVW5pdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8udXNlclVuaXQ7XG4gIH1cbiAgZ2V0IHZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnZpZXc7XG4gIH1cbiAgZ2V0Vmlld3BvcnQoe1xuICAgIHNjYWxlLFxuICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGUsXG4gICAgb2Zmc2V0WCA9IDAsXG4gICAgb2Zmc2V0WSA9IDAsXG4gICAgZG9udEZsaXAgPSBmYWxzZVxuICB9ID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgICB2aWV3Qm94OiB0aGlzLnZpZXcsXG4gICAgICBzY2FsZSxcbiAgICAgIHJvdGF0aW9uLFxuICAgICAgb2Zmc2V0WCxcbiAgICAgIG9mZnNldFksXG4gICAgICBkb250RmxpcFxuICAgIH0pO1xuICB9XG4gIGdldEFubm90YXRpb25zKHtcbiAgICBpbnRlbnQgPSBcImRpc3BsYXlcIlxuICB9ID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICByZW5kZXJpbmdJbnRlbnRcbiAgICB9ID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudChpbnRlbnQpO1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0QW5ub3RhdGlvbnModGhpcy5fcGFnZUluZGV4LCByZW5kZXJpbmdJbnRlbnQpO1xuICB9XG4gIGdldEpTQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VKU0FjdGlvbnModGhpcy5fcGFnZUluZGV4KTtcbiAgfVxuICBnZXQgZmlsdGVyRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmZpbHRlckZhY3Rvcnk7XG4gIH1cbiAgZ2V0IGlzUHVyZVhmYSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNQdXJlWGZhXCIsICEhdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhKTtcbiAgfVxuICBhc3luYyBnZXRYZmEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYT8uY2hpbGRyZW5bdGhpcy5fcGFnZUluZGV4XSB8fCBudWxsO1xuICB9XG4gIHJlbmRlcih7XG4gICAgY2FudmFzQ29udGV4dCxcbiAgICB2aWV3cG9ydCxcbiAgICBpbnRlbnQgPSBcImRpc3BsYXlcIixcbiAgICBhbm5vdGF0aW9uTW9kZSA9IEFubm90YXRpb25Nb2RlLkVOQUJMRSxcbiAgICB0cmFuc2Zvcm0gPSBudWxsLFxuICAgIGJhY2tncm91bmQgPSBudWxsLFxuICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBudWxsLFxuICAgIGFubm90YXRpb25DYW52YXNNYXAgPSBudWxsLFxuICAgIHBhZ2VDb2xvcnMgPSBudWxsLFxuICAgIHByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsXG4gIH0pIHtcbiAgICB0aGlzLl9zdGF0cz8udGltZShcIk92ZXJhbGxcIik7XG4gICAgY29uc3QgaW50ZW50QXJncyA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50LCBhbm5vdGF0aW9uTW9kZSwgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSk7XG4gICAgY29uc3Qge1xuICAgICAgcmVuZGVyaW5nSW50ZW50LFxuICAgICAgY2FjaGVLZXlcbiAgICB9ID0gaW50ZW50QXJncztcbiAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuICAgIHRoaXMuI2Fib3J0RGVsYXllZENsZWFudXAoKTtcbiAgICBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlIHx8PSB0aGlzLl90cmFuc3BvcnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKHJlbmRlcmluZ0ludGVudCk7XG4gICAgbGV0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChjYWNoZUtleSk7XG4gICAgaWYgKCFpbnRlbnRTdGF0ZSkge1xuICAgICAgaW50ZW50U3RhdGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdGhpcy5faW50ZW50U3RhdGVzLnNldChjYWNoZUtleSwgaW50ZW50U3RhdGUpO1xuICAgIH1cbiAgICBpZiAoaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpO1xuICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGludGVudFByaW50ID0gISEocmVuZGVyaW5nSW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCk7XG4gICAgaWYgKCFpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7XG4gICAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7XG4gICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QgPSB7XG4gICAgICAgIGZuQXJyYXk6IFtdLFxuICAgICAgICBhcmdzQXJyYXk6IFtdLFxuICAgICAgICBsYXN0Q2h1bms6IGZhbHNlLFxuICAgICAgICBzZXBhcmF0ZUFubm90czogbnVsbFxuICAgICAgfTtcbiAgICAgIHRoaXMuX3N0YXRzPy50aW1lKFwiUGFnZSBSZXF1ZXN0XCIpO1xuICAgICAgdGhpcy5fcHVtcE9wZXJhdG9yTGlzdChpbnRlbnRBcmdzKTtcbiAgICB9XG4gICAgY29uc3QgY29tcGxldGUgPSBlcnJvciA9PiB7XG4gICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5kZWxldGUoaW50ZXJuYWxSZW5kZXJUYXNrKTtcbiAgICAgIGlmICh0aGlzLl9tYXliZUNsZWFudXBBZnRlclJlbmRlciB8fCBpbnRlbnRQcmludCkge1xuICAgICAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLiN0cnlDbGVhbnVwKCFpbnRlbnRQcmludCk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucmVqZWN0KGVycm9yKTtcbiAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgIGludGVudFN0YXRlLFxuICAgICAgICAgIHJlYXNvbjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKGVycm9yKVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9zdGF0cykge1xuICAgICAgICB0aGlzLl9zdGF0cy50aW1lRW5kKFwiUmVuZGVyaW5nXCIpO1xuICAgICAgICB0aGlzLl9zdGF0cy50aW1lRW5kKFwiT3ZlcmFsbFwiKTtcbiAgICAgICAgaWYgKGdsb2JhbFRoaXMuU3RhdHM/LmVuYWJsZWQpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLlN0YXRzLmFkZCh0aGlzLnBhZ2VOdW1iZXIsIHRoaXMuX3N0YXRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrID0gbmV3IEludGVybmFsUmVuZGVyVGFzayh7XG4gICAgICBjYWxsYmFjazogY29tcGxldGUsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgY2FudmFzQ29udGV4dCxcbiAgICAgICAgdmlld3BvcnQsXG4gICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgYmFja2dyb3VuZFxuICAgICAgfSxcbiAgICAgIG9ianM6IHRoaXMub2JqcyxcbiAgICAgIGNvbW1vbk9ianM6IHRoaXMuY29tbW9uT2JqcyxcbiAgICAgIGFubm90YXRpb25DYW52YXNNYXAsXG4gICAgICBvcGVyYXRvckxpc3Q6IGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCxcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuICAgICAgY2FudmFzRmFjdG9yeTogdGhpcy5fdHJhbnNwb3J0LmNhbnZhc0ZhY3RvcnksXG4gICAgICBmaWx0ZXJGYWN0b3J5OiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeSxcbiAgICAgIHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZTogIWludGVudFByaW50LFxuICAgICAgcGRmQnVnOiB0aGlzLl9wZGZCdWcsXG4gICAgICBwYWdlQ29sb3JzXG4gICAgfSk7XG4gICAgKGludGVudFN0YXRlLnJlbmRlclRhc2tzIHx8PSBuZXcgU2V0KCkpLmFkZChpbnRlcm5hbFJlbmRlclRhc2spO1xuICAgIGNvbnN0IHJlbmRlclRhc2sgPSBpbnRlcm5hbFJlbmRlclRhc2sudGFzaztcbiAgICBQcm9taXNlLmFsbChbaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlXSkudGhlbigoW3RyYW5zcGFyZW5jeSwgb3B0aW9uYWxDb250ZW50Q29uZmlnXSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YXRzPy50aW1lKFwiUmVuZGVyaW5nXCIpO1xuICAgICAgaWYgKCEob3B0aW9uYWxDb250ZW50Q29uZmlnLnJlbmRlcmluZ0ludGVudCAmIHJlbmRlcmluZ0ludGVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCB1c2UgdGhlIHNhbWUgYGludGVudGAtYXJndW1lbnQgd2hlbiBjYWxsaW5nIHRoZSBgUERGUGFnZVByb3h5LnJlbmRlcmAgXCIgKyBcImFuZCBgUERGRG9jdW1lbnRQcm94eS5nZXRPcHRpb25hbENvbnRlbnRDb25maWdgIG1ldGhvZHMuXCIpO1xuICAgICAgfVxuICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmluaXRpYWxpemVHcmFwaGljcyh7XG4gICAgICAgIHRyYW5zcGFyZW5jeSxcbiAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnXG4gICAgICB9KTtcbiAgICAgIGludGVybmFsUmVuZGVyVGFzay5vcGVyYXRvckxpc3RDaGFuZ2VkKCk7XG4gICAgfSkuY2F0Y2goY29tcGxldGUpO1xuICAgIHJldHVybiByZW5kZXJUYXNrO1xuICB9XG4gIGdldE9wZXJhdG9yTGlzdCh7XG4gICAgaW50ZW50ID0gXCJkaXNwbGF5XCIsXG4gICAgYW5ub3RhdGlvbk1vZGUgPSBBbm5vdGF0aW9uTW9kZS5FTkFCTEUsXG4gICAgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IG51bGxcbiAgfSA9IHt9KSB7XG4gICAgZnVuY3Rpb24gb3BlcmF0b3JMaXN0Q2hhbmdlZCgpIHtcbiAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG4gICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlc29sdmUoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0KTtcbiAgICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MuZGVsZXRlKG9wTGlzdFRhc2spO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpbnRlbnRBcmdzID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudChpbnRlbnQsIGFubm90YXRpb25Nb2RlLCBwcmludEFubm90YXRpb25TdG9yYWdlLCB0cnVlKTtcbiAgICBsZXQgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGludGVudEFyZ3MuY2FjaGVLZXkpO1xuICAgIGlmICghaW50ZW50U3RhdGUpIHtcbiAgICAgIGludGVudFN0YXRlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5zZXQoaW50ZW50QXJncy5jYWNoZUtleSwgaW50ZW50U3RhdGUpO1xuICAgIH1cbiAgICBsZXQgb3BMaXN0VGFzaztcbiAgICBpZiAoIWludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG4gICAgICBvcExpc3RUYXNrID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIG9wTGlzdFRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCA9IG9wZXJhdG9yTGlzdENoYW5nZWQ7XG4gICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgKGludGVudFN0YXRlLnJlbmRlclRhc2tzIHx8PSBuZXcgU2V0KCkpLmFkZChvcExpc3RUYXNrKTtcbiAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCA9IHtcbiAgICAgICAgZm5BcnJheTogW10sXG4gICAgICAgIGFyZ3NBcnJheTogW10sXG4gICAgICAgIGxhc3RDaHVuazogZmFsc2UsXG4gICAgICAgIHNlcGFyYXRlQW5ub3RzOiBudWxsXG4gICAgICB9O1xuICAgICAgdGhpcy5fc3RhdHM/LnRpbWUoXCJQYWdlIFJlcXVlc3RcIik7XG4gICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KGludGVudEFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBzdHJlYW1UZXh0Q29udGVudCh7XG4gICAgaW5jbHVkZU1hcmtlZENvbnRlbnQgPSBmYWxzZSxcbiAgICBkaXNhYmxlTm9ybWFsaXphdGlvbiA9IGZhbHNlXG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IFRFWFRfQ09OVEVOVF9DSFVOS19TSVpFID0gMTAwO1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXCJHZXRUZXh0Q29udGVudFwiLCB7XG4gICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCxcbiAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50OiBpbmNsdWRlTWFya2VkQ29udGVudCA9PT0gdHJ1ZSxcbiAgICAgIGRpc2FibGVOb3JtYWxpemF0aW9uOiBkaXNhYmxlTm9ybWFsaXphdGlvbiA9PT0gdHJ1ZVxuICAgIH0sIHtcbiAgICAgIGhpZ2hXYXRlck1hcms6IFRFWFRfQ09OVEVOVF9DSFVOS19TSVpFLFxuICAgICAgc2l6ZSh0ZXh0Q29udGVudCkge1xuICAgICAgICByZXR1cm4gdGV4dENvbnRlbnQuaXRlbXMubGVuZ3RoO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGdldFRleHRDb250ZW50KHBhcmFtcyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0WGZhKCkudGhlbih4ZmEgPT4gWGZhVGV4dC50ZXh0Q29udGVudCh4ZmEpKTtcbiAgICB9XG4gICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLnN0cmVhbVRleHRDb250ZW50KHBhcmFtcyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIHB1bXAoKSB7XG4gICAgICAgIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoe1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGRvbmVcbiAgICAgICAgfSkge1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICByZXNvbHZlKHRleHRDb250ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGV4dENvbnRlbnQubGFuZyA/Pz0gdmFsdWUubGFuZztcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRleHRDb250ZW50LnN0eWxlcywgdmFsdWUuc3R5bGVzKTtcbiAgICAgICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKC4uLnZhbHVlLml0ZW1zKTtcbiAgICAgICAgICBwdW1wKCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICAgIGNvbnN0IHRleHRDb250ZW50ID0ge1xuICAgICAgICBpdGVtczogW10sXG4gICAgICAgIHN0eWxlczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgbGFuZzogbnVsbFxuICAgICAgfTtcbiAgICAgIHB1bXAoKTtcbiAgICB9KTtcbiAgfVxuICBnZXRTdHJ1Y3RUcmVlKCkge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0U3RydWN0VHJlZSh0aGlzLl9wYWdlSW5kZXgpO1xuICB9XG4gIF9kZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICBjb25zdCB3YWl0T24gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGludGVudFN0YXRlIG9mIHRoaXMuX2ludGVudFN0YXRlcy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICBpbnRlbnRTdGF0ZSxcbiAgICAgICAgcmVhc29uOiBuZXcgRXJyb3IoXCJQYWdlIHdhcyBkZXN0cm95ZWQuXCIpLFxuICAgICAgICBmb3JjZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBpZiAoaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGludGVybmFsUmVuZGVyVGFzayBvZiBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykge1xuICAgICAgICB3YWl0T24ucHVzaChpbnRlcm5hbFJlbmRlclRhc2suY29tcGxldGVkKTtcbiAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhbmNlbCgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9ianMuY2xlYXIoKTtcbiAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuICAgIHRoaXMuI2Fib3J0RGVsYXllZENsZWFudXAoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdE9uKTtcbiAgfVxuICBjbGVhbnVwKHJlc2V0U3RhdHMgPSBmYWxzZSkge1xuICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gdHJ1ZTtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy4jdHJ5Q2xlYW51cChmYWxzZSk7XG4gICAgaWYgKHJlc2V0U3RhdHMgJiYgc3VjY2Vzcykge1xuICAgICAgdGhpcy5fc3RhdHMgJiY9IG5ldyBTdGF0VGltZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cbiAgI3RyeUNsZWFudXAoZGVsYXllZCA9IGZhbHNlKSB7XG4gICAgdGhpcy4jYWJvcnREZWxheWVkQ2xlYW51cCgpO1xuICAgIGlmICghdGhpcy4jcGVuZGluZ0NsZWFudXAgfHwgdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRlbGF5ZWQpIHtcbiAgICAgIHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQgPSBudWxsO1xuICAgICAgICB0aGlzLiN0cnlDbGVhbnVwKGZhbHNlKTtcbiAgICAgIH0sIERFTEFZRURfQ0xFQU5VUF9USU1FT1VUKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7XG4gICAgICByZW5kZXJUYXNrcyxcbiAgICAgIG9wZXJhdG9yTGlzdFxuICAgIH0gb2YgdGhpcy5faW50ZW50U3RhdGVzLnZhbHVlcygpKSB7XG4gICAgICBpZiAocmVuZGVyVGFza3Muc2l6ZSA+IDAgfHwgIW9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuY2xlYXIoKTtcbiAgICB0aGlzLm9ianMuY2xlYXIoKTtcbiAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gICNhYm9ydERlbGF5ZWRDbGVhbnVwKCkge1xuICAgIGlmICh0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQpO1xuICAgICAgdGhpcy4jZGVsYXllZENsZWFudXBUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgX3N0YXJ0UmVuZGVyUGFnZSh0cmFuc3BhcmVuY3ksIGNhY2hlS2V5KSB7XG4gICAgY29uc3QgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoIWludGVudFN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3N0YXRzPy50aW1lRW5kKFwiUGFnZSBSZXF1ZXN0XCIpO1xuICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHk/LnJlc29sdmUodHJhbnNwYXJlbmN5KTtcbiAgfVxuICBfcmVuZGVyUGFnZUNodW5rKG9wZXJhdG9yTGlzdENodW5rLCBpbnRlbnRTdGF0ZSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wZXJhdG9yTGlzdENodW5rLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5mbkFycmF5LnB1c2gob3BlcmF0b3JMaXN0Q2h1bmsuZm5BcnJheVtpXSk7XG4gICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QuYXJnc0FycmF5LnB1c2gob3BlcmF0b3JMaXN0Q2h1bmsuYXJnc0FycmF5W2ldKTtcbiAgICB9XG4gICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuayA9IG9wZXJhdG9yTGlzdENodW5rLmxhc3RDaHVuaztcbiAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3Quc2VwYXJhdGVBbm5vdHMgPSBvcGVyYXRvckxpc3RDaHVuay5zZXBhcmF0ZUFubm90cztcbiAgICBmb3IgKGNvbnN0IGludGVybmFsUmVuZGVyVGFzayBvZiBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykge1xuICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICB9XG4gICAgaWYgKG9wZXJhdG9yTGlzdENodW5rLmxhc3RDaHVuaykge1xuICAgICAgdGhpcy4jdHJ5Q2xlYW51cCh0cnVlKTtcbiAgICB9XG4gIH1cbiAgX3B1bXBPcGVyYXRvckxpc3Qoe1xuICAgIHJlbmRlcmluZ0ludGVudCxcbiAgICBjYWNoZUtleSxcbiAgICBhbm5vdGF0aW9uU3RvcmFnZVNlcmlhbGl6YWJsZVxuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbWFwLFxuICAgICAgdHJhbnNmZXJcbiAgICB9ID0gYW5ub3RhdGlvblN0b3JhZ2VTZXJpYWxpemFibGU7XG4gICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXCJHZXRPcGVyYXRvckxpc3RcIiwge1xuICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICBpbnRlbnQ6IHJlbmRlcmluZ0ludGVudCxcbiAgICAgIGNhY2hlS2V5LFxuICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IG1hcFxuICAgIH0sIHRyYW5zZmVyKTtcbiAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICBjb25zdCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoY2FjaGVLZXkpO1xuICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IHJlYWRlcjtcbiAgICBjb25zdCBwdW1wID0gKCkgPT4ge1xuICAgICAgcmVhZGVyLnJlYWQoKS50aGVuKCh7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBkb25lXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVuZGVyUGFnZUNodW5rKHZhbHVlLCBpbnRlbnRTdGF0ZSk7XG4gICAgICAgIHB1bXAoKTtcbiAgICAgIH0sIHJlYXNvbiA9PiB7XG4gICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QpIHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rID0gdHJ1ZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGludGVybmFsUmVuZGVyVGFzayBvZiBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykge1xuICAgICAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy4jdHJ5Q2xlYW51cCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSkge1xuICAgICAgICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgcHVtcCgpO1xuICB9XG4gIF9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgaW50ZW50U3RhdGUsXG4gICAgcmVhc29uLFxuICAgIGZvcmNlID0gZmFsc2VcbiAgfSkge1xuICAgIGlmICghaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCk7XG4gICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFmb3JjZSkge1xuICAgICAgaWYgKGludGVudFN0YXRlLnJlbmRlclRhc2tzLnNpemUgPiAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pIHtcbiAgICAgICAgbGV0IGRlbGF5ID0gUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUO1xuICAgICAgICBpZiAocmVhc29uLmV4dHJhRGVsYXkgPiAwICYmIHJlYXNvbi5leHRyYURlbGF5IDwgMTAwMCkge1xuICAgICAgICAgIGRlbGF5ICs9IHJlYXNvbi5leHRyYURlbGF5O1xuICAgICAgICB9XG4gICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgICBpbnRlbnRTdGF0ZSxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgIGZvcmNlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIuY2FuY2VsKG5ldyBBYm9ydEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSkpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsO1xuICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2N1ckNhY2hlS2V5LCBjdXJJbnRlbnRTdGF0ZV0gb2YgdGhpcy5faW50ZW50U3RhdGVzKSB7XG4gICAgICBpZiAoY3VySW50ZW50U3RhdGUgPT09IGludGVudFN0YXRlKSB7XG4gICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5kZWxldGUoY3VyQ2FjaGVLZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cbiAgZ2V0IHN0YXRzKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0cztcbiAgfVxufVxuY2xhc3MgTG9vcGJhY2tQb3J0IHtcbiAgI2xpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgI2RlZmVycmVkID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHBvc3RNZXNzYWdlKG9iaiwgdHJhbnNmZXIpIHtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGRhdGE6IHN0cnVjdHVyZWRDbG9uZShvYmosIHRyYW5zZmVyID8ge1xuICAgICAgICB0cmFuc2ZlclxuICAgICAgfSA6IG51bGwpXG4gICAgfTtcbiAgICB0aGlzLiNkZWZlcnJlZC50aGVuKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy4jbGlzdGVuZXJzKSB7XG4gICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpIHtcbiAgICB0aGlzLiNsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgfVxuICByZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy4jbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH1cbiAgdGVybWluYXRlKCkge1xuICAgIHRoaXMuI2xpc3RlbmVycy5jbGVhcigpO1xuICB9XG59XG5jb25zdCBQREZXb3JrZXJVdGlsID0ge1xuICBpc1dvcmtlckRpc2FibGVkOiBmYWxzZSxcbiAgZmFrZVdvcmtlcklkOiAwXG59O1xue1xuICBpZiAoaXNOb2RlSlMpIHtcbiAgICBQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgPSB0cnVlO1xuICAgIEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjIHx8PSBcIi4vcGRmLndvcmtlci5tanNcIjtcbiAgfVxuICBQREZXb3JrZXJVdGlsLmlzU2FtZU9yaWdpbiA9IGZ1bmN0aW9uIChiYXNlVXJsLCBvdGhlclVybCkge1xuICAgIGxldCBiYXNlO1xuICAgIHRyeSB7XG4gICAgICBiYXNlID0gbmV3IFVSTChiYXNlVXJsKTtcbiAgICAgIGlmICghYmFzZS5vcmlnaW4gfHwgYmFzZS5vcmlnaW4gPT09IFwibnVsbFwiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgb3RoZXIgPSBuZXcgVVJMKG90aGVyVXJsLCBiYXNlKTtcbiAgICByZXR1cm4gYmFzZS5vcmlnaW4gPT09IG90aGVyLm9yaWdpbjtcbiAgfTtcbiAgUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyID0gZnVuY3Rpb24gKHVybCkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBgYXdhaXQgaW1wb3J0KFwiJHt1cmx9XCIpO2A7XG4gICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3dyYXBwZXJdLCB7XG4gICAgICB0eXBlOiBcInRleHQvamF2YXNjcmlwdFwiXG4gICAgfSkpO1xuICB9O1xufVxuY2xhc3MgUERGV29ya2VyIHtcbiAgc3RhdGljICN3b3JrZXJQb3J0cztcbiAgY29uc3RydWN0b3Ioe1xuICAgIG5hbWUgPSBudWxsLFxuICAgIHBvcnQgPSBudWxsLFxuICAgIHZlcmJvc2l0eSA9IGdldFZlcmJvc2l0eUxldmVsKClcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMudmVyYm9zaXR5ID0gdmVyYm9zaXR5O1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuX3BvcnQgPSBudWxsO1xuICAgIHRoaXMuX3dlYldvcmtlciA9IG51bGw7XG4gICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuICAgIGlmIChwb3J0KSB7XG4gICAgICBpZiAoUERGV29ya2VyLiN3b3JrZXJQb3J0cz8uaGFzKHBvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgbW9yZSB0aGFuIG9uZSBQREZXb3JrZXIgcGVyIHBvcnQuXCIpO1xuICAgICAgfVxuICAgICAgKFBERldvcmtlci4jd29ya2VyUG9ydHMgfHw9IG5ldyBXZWFrTWFwKCkpLnNldChwb3J0LCB0aGlzKTtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVGcm9tUG9ydChwb3J0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faW5pdGlhbGl6ZSgpO1xuICB9XG4gIGdldCBwcm9taXNlKCkge1xuICAgIGlmIChpc05vZGVKUykge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtOb2RlUGFja2FnZXMucHJvbWlzZSwgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2VdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG4gICNyZXNvbHZlKCkge1xuICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIuc2VuZChcImNvbmZpZ3VyZVwiLCB7XG4gICAgICB2ZXJib3NpdHk6IHRoaXMudmVyYm9zaXR5XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcnQ7XG4gIH1cbiAgZ2V0IG1lc3NhZ2VIYW5kbGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlSGFuZGxlcjtcbiAgfVxuICBfaW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpIHtcbiAgICB0aGlzLl9wb3J0ID0gcG9ydDtcbiAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihcIm1haW5cIiwgXCJ3b3JrZXJcIiwgcG9ydCk7XG4gICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIub24oXCJyZWFkeVwiLCBmdW5jdGlvbiAoKSB7fSk7XG4gICAgdGhpcy4jcmVzb2x2ZSgpO1xuICB9XG4gIF9pbml0aWFsaXplKCkge1xuICAgIGlmIChQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgfHwgUERGV29ya2VyLiNtYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQge1xuICAgICAgd29ya2VyU3JjXG4gICAgfSA9IFBERldvcmtlcjtcbiAgICB0cnkge1xuICAgICAgaWYgKCFQREZXb3JrZXJVdGlsLmlzU2FtZU9yaWdpbih3aW5kb3cubG9jYXRpb24uaHJlZiwgd29ya2VyU3JjKSkge1xuICAgICAgICB3b3JrZXJTcmMgPSBQREZXb3JrZXJVdGlsLmNyZWF0ZUNETldyYXBwZXIobmV3IFVSTCh3b3JrZXJTcmMsIHdpbmRvdy5sb2NhdGlvbikuaHJlZik7XG4gICAgICB9XG4gICAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclNyYywge1xuICAgICAgICB0eXBlOiBcIm1vZHVsZVwiXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKFwibWFpblwiLCBcIndvcmtlclwiLCB3b3JrZXIpO1xuICAgICAgY29uc3QgdGVybWluYXRlRWFybHkgPSAoKSA9PiB7XG4gICAgICAgIGFjLmFib3J0KCk7XG4gICAgICAgIG1lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGFjID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fd2ViV29ya2VyKSB7XG4gICAgICAgICAgdGVybWluYXRlRWFybHkoKTtcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBzaWduYWw6IGFjLnNpZ25hbFxuICAgICAgfSk7XG4gICAgICBtZXNzYWdlSGFuZGxlci5vbihcInRlc3RcIiwgZGF0YSA9PiB7XG4gICAgICAgIGFjLmFib3J0KCk7XG4gICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCB8fCAhZGF0YSkge1xuICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7XG4gICAgICAgIHRoaXMuX3BvcnQgPSB3b3JrZXI7XG4gICAgICAgIHRoaXMuX3dlYldvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICBtZXNzYWdlSGFuZGxlci5vbihcInJlYWR5XCIsIGRhdGEgPT4ge1xuICAgICAgICBhYy5hYm9ydCgpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHNlbmRUZXN0KCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNlbmRUZXN0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXN0T2JqID0gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcInRlc3RcIiwgdGVzdE9iaiwgW3Rlc3RPYmouYnVmZmVyXSk7XG4gICAgICB9O1xuICAgICAgc2VuZFRlc3QoKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGluZm8oXCJUaGUgd29ya2VyIGhhcyBiZWVuIGRpc2FibGVkLlwiKTtcbiAgICB9XG4gICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gIH1cbiAgX3NldHVwRmFrZVdvcmtlcigpIHtcbiAgICBpZiAoIVBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCkge1xuICAgICAgd2FybihcIlNldHRpbmcgdXAgZmFrZSB3b3JrZXIuXCIpO1xuICAgICAgUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgUERGV29ya2VyLl9zZXR1cEZha2VXb3JrZXJHbG9iYWwudGhlbihXb3JrZXJNZXNzYWdlSGFuZGxlciA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBvcnQgPSBuZXcgTG9vcGJhY2tQb3J0KCk7XG4gICAgICB0aGlzLl9wb3J0ID0gcG9ydDtcbiAgICAgIGNvbnN0IGlkID0gYGZha2Uke1BERldvcmtlclV0aWwuZmFrZVdvcmtlcklkKyt9YDtcbiAgICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoaWQgKyBcIl93b3JrZXJcIiwgaWQsIHBvcnQpO1xuICAgICAgV29ya2VyTWVzc2FnZUhhbmRsZXIuc2V0dXAod29ya2VySGFuZGxlciwgcG9ydCk7XG4gICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcihpZCwgaWQgKyBcIl93b3JrZXJcIiwgcG9ydCk7XG4gICAgICB0aGlzLiNyZXNvbHZlKCk7XG4gICAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKGBTZXR0aW5nIHVwIGZha2Ugd29ya2VyIGZhaWxlZDogXCIke3JlYXNvbi5tZXNzYWdlfVwiLmApKTtcbiAgICB9KTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fd2ViV29ya2VyKSB7XG4gICAgICB0aGlzLl93ZWJXb3JrZXIudGVybWluYXRlKCk7XG4gICAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsO1xuICAgIH1cbiAgICBQREZXb3JrZXIuI3dvcmtlclBvcnRzPy5kZWxldGUodGhpcy5fcG9ydCk7XG4gICAgdGhpcy5fcG9ydCA9IG51bGw7XG4gICAgaWYgKHRoaXMuX21lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBmcm9tUG9ydChwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcz8ucG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUERGV29ya2VyLmZyb21Qb3J0IC0gaW52YWxpZCBtZXRob2Qgc2lnbmF0dXJlLlwiKTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGVkUG9ydCA9IHRoaXMuI3dvcmtlclBvcnRzPy5nZXQocGFyYW1zLnBvcnQpO1xuICAgIGlmIChjYWNoZWRQb3J0KSB7XG4gICAgICBpZiAoY2FjaGVkUG9ydC5fcGVuZGluZ0Rlc3Ryb3kpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUERGV29ya2VyLmZyb21Qb3J0IC0gdGhlIHdvcmtlciBpcyBiZWluZyBkZXN0cm95ZWQuXFxuXCIgKyBcIlBsZWFzZSByZW1lbWJlciB0byBhd2FpdCBgUERGRG9jdW1lbnRMb2FkaW5nVGFzay5kZXN0cm95KClgLWNhbGxzLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYWNoZWRQb3J0O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFBERldvcmtlcihwYXJhbXMpO1xuICB9XG4gIHN0YXRpYyBnZXQgd29ya2VyU3JjKCkge1xuICAgIGlmIChHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYykge1xuICAgICAgcmV0dXJuIEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFwiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmNcIiBzcGVjaWZpZWQuJyk7XG4gIH1cbiAgc3RhdGljIGdldCAjbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZ2xvYmFsVGhpcy5wZGZqc1dvcmtlcj8uV29ya2VyTWVzc2FnZUhhbmRsZXIgfHwgbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IF9zZXR1cEZha2VXb3JrZXJHbG9iYWwoKSB7XG4gICAgY29uc3QgbG9hZGVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyO1xuICAgICAgfVxuICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgaW1wb3J0KCAvKndlYnBhY2tJZ25vcmU6IHRydWUqL3RoaXMud29ya2VyU3JjKTtcbiAgICAgIHJldHVybiB3b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgfTtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX3NldHVwRmFrZVdvcmtlckdsb2JhbFwiLCBsb2FkZXIoKSk7XG4gIH1cbn1cbmNsYXNzIFdvcmtlclRyYW5zcG9ydCB7XG4gICNtZXRob2RQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgI3BhZ2VDYWNoZSA9IG5ldyBNYXAoKTtcbiAgI3BhZ2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgI3BhZ2VSZWZDYWNoZSA9IG5ldyBNYXAoKTtcbiAgI3Bhc3N3b3JkQ2FwYWJpbGl0eSA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2VIYW5kbGVyLCBsb2FkaW5nVGFzaywgbmV0d29ya1N0cmVhbSwgcGFyYW1zLCBmYWN0b3J5KSB7XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyO1xuICAgIHRoaXMubG9hZGluZ1Rhc2sgPSBsb2FkaW5nVGFzaztcbiAgICB0aGlzLmNvbW1vbk9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuICAgIHRoaXMuZm9udExvYWRlciA9IG5ldyBGb250TG9hZGVyKHtcbiAgICAgIG93bmVyRG9jdW1lbnQ6IHBhcmFtcy5vd25lckRvY3VtZW50LFxuICAgICAgc3R5bGVFbGVtZW50OiBwYXJhbXMuc3R5bGVFbGVtZW50XG4gICAgfSk7XG4gICAgdGhpcy5sb2FkaW5nUGFyYW1zID0gcGFyYW1zLmxvYWRpbmdQYXJhbXM7XG4gICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGZhY3RvcnkuY2FudmFzRmFjdG9yeTtcbiAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSBmYWN0b3J5LmZpbHRlckZhY3Rvcnk7XG4gICAgdGhpcy5jTWFwUmVhZGVyRmFjdG9yeSA9IGZhY3RvcnkuY01hcFJlYWRlckZhY3Rvcnk7XG4gICAgdGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IGZhY3Rvcnkuc3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5ID0gbnVsbDtcbiAgICB0aGlzLl9uZXR3b3JrU3RyZWFtID0gbmV0d29ya1N0cmVhbTtcbiAgICB0aGlzLl9mdWxsUmVhZGVyID0gbnVsbDtcbiAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSBudWxsO1xuICAgIHRoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgIHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcigpO1xuICB9XG4gICNjYWNoZVNpbXBsZU1ldGhvZChuYW1lLCBkYXRhID0gbnVsbCkge1xuICAgIGNvbnN0IGNhY2hlZFByb21pc2UgPSB0aGlzLiNtZXRob2RQcm9taXNlcy5nZXQobmFtZSk7XG4gICAgaWYgKGNhY2hlZFByb21pc2UpIHtcbiAgICAgIHJldHVybiBjYWNoZWRQcm9taXNlO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UobmFtZSwgZGF0YSk7XG4gICAgdGhpcy4jbWV0aG9kUHJvbWlzZXMuc2V0KG5hbWUsIHByb21pc2UpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG4gIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiYW5ub3RhdGlvblN0b3JhZ2VcIiwgbmV3IEFubm90YXRpb25TdG9yYWdlKCkpO1xuICB9XG4gIGdldFJlbmRlcmluZ0ludGVudChpbnRlbnQsIGFubm90YXRpb25Nb2RlID0gQW5ub3RhdGlvbk1vZGUuRU5BQkxFLCBwcmludEFubm90YXRpb25TdG9yYWdlID0gbnVsbCwgaXNPcExpc3QgPSBmYWxzZSkge1xuICAgIGxldCByZW5kZXJpbmdJbnRlbnQgPSBSZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVk7XG4gICAgbGV0IGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlID0gU2VyaWFsaXphYmxlRW1wdHk7XG4gICAgc3dpdGNoIChpbnRlbnQpIHtcbiAgICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ID0gUmVuZGVyaW5nSW50ZW50RmxhZy5BTlk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRpc3BsYXlcIjpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicHJpbnRcIjpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ID0gUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB3YXJuKGBnZXRSZW5kZXJpbmdJbnRlbnQgLSBpbnZhbGlkIGludGVudDogJHtpbnRlbnR9YCk7XG4gICAgfVxuICAgIHN3aXRjaCAoYW5ub3RhdGlvbk1vZGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbk1vZGUuRElTQUJMRTpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRElTQUJMRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25Nb2RlLkVOQUJMRTpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25Nb2RlLkVOQUJMRV9GT1JNUzpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRk9STVM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uTW9kZS5FTkFCTEVfU1RPUkFHRTpcbiAgICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfU1RPUkFHRTtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSByZW5kZXJpbmdJbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UICYmIHByaW50QW5ub3RhdGlvblN0b3JhZ2UgaW5zdGFuY2VvZiBQcmludEFubm90YXRpb25TdG9yYWdlID8gcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA6IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlID0gYW5ub3RhdGlvblN0b3JhZ2Uuc2VyaWFsaXphYmxlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHdhcm4oYGdldFJlbmRlcmluZ0ludGVudCAtIGludmFsaWQgYW5ub3RhdGlvbk1vZGU6ICR7YW5ub3RhdGlvbk1vZGV9YCk7XG4gICAgfVxuICAgIGlmIChpc09wTGlzdCkge1xuICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IFJlbmRlcmluZ0ludGVudEZsYWcuT1BMSVNUO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVuZGVyaW5nSW50ZW50LFxuICAgICAgY2FjaGVLZXk6IGAke3JlbmRlcmluZ0ludGVudH1fJHthbm5vdGF0aW9uU3RvcmFnZVNlcmlhbGl6YWJsZS5oYXNofWAsXG4gICAgICBhbm5vdGF0aW9uU3RvcmFnZVNlcmlhbGl6YWJsZVxuICAgIH07XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5kZXN0cm95Q2FwYWJpbGl0eSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHk/LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZCBkdXJpbmcgb25QYXNzd29yZCBjYWxsYmFja1wiKSk7XG4gICAgY29uc3Qgd2FpdE9uID0gW107XG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMuI3BhZ2VDYWNoZS52YWx1ZXMoKSkge1xuICAgICAgd2FpdE9uLnB1c2gocGFnZS5fZGVzdHJveSgpKTtcbiAgICB9XG4gICAgdGhpcy4jcGFnZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy4jcGFnZVByb21pc2VzLmNsZWFyKCk7XG4gICAgdGhpcy4jcGFnZVJlZkNhY2hlLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoXCJhbm5vdGF0aW9uU3RvcmFnZVwiKSkge1xuICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5yZXNldE1vZGlmaWVkKCk7XG4gICAgfVxuICAgIGNvbnN0IHRlcm1pbmF0ZWQgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIlRlcm1pbmF0ZVwiLCBudWxsKTtcbiAgICB3YWl0T24ucHVzaCh0ZXJtaW5hdGVkKTtcbiAgICBQcm9taXNlLmFsbCh3YWl0T24pLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5jb21tb25PYmpzLmNsZWFyKCk7XG4gICAgICB0aGlzLmZvbnRMb2FkZXIuY2xlYXIoKTtcbiAgICAgIHRoaXMuI21ldGhvZFByb21pc2VzLmNsZWFyKCk7XG4gICAgICB0aGlzLmZpbHRlckZhY3RvcnkuZGVzdHJveSgpO1xuICAgICAgVGV4dExheWVyLmNsZWFudXAoKTtcbiAgICAgIHRoaXMuX25ldHdvcmtTdHJlYW0/LmNhbmNlbEFsbFJlcXVlc3RzKG5ldyBBYm9ydEV4Y2VwdGlvbihcIldvcmtlciB3YXMgdGVybWluYXRlZC5cIikpO1xuICAgICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfSwgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5yZWplY3QpO1xuICAgIHJldHVybiB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbiAgc2V0dXBNZXNzYWdlSGFuZGxlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBtZXNzYWdlSGFuZGxlcixcbiAgICAgIGxvYWRpbmdUYXNrXG4gICAgfSA9IHRoaXM7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJHZXRSZWFkZXJcIiwgKGRhdGEsIHNpbmspID0+IHtcbiAgICAgIGFzc2VydCh0aGlzLl9uZXR3b3JrU3RyZWFtLCBcIkdldFJlYWRlciAtIG5vIGBJUERGU3RyZWFtYCBpbnN0YW5jZSBhdmFpbGFibGUuXCIpO1xuICAgICAgdGhpcy5fZnVsbFJlYWRlciA9IHRoaXMuX25ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlcigpO1xuICAgICAgdGhpcy5fZnVsbFJlYWRlci5vblByb2dyZXNzID0gZXZ0ID0+IHtcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzID0ge1xuICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcbiAgICAgICAgICB0b3RhbDogZXZ0LnRvdGFsXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgc2luay5vblB1bGwgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Z1bGxSZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBkb25lXG4gICAgICAgIH0pIHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgc2luay5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NlcnQodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciwgXCJHZXRSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci5cIik7XG4gICAgICAgICAgc2luay5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHZhbHVlKSwgMSwgW3ZhbHVlXSk7XG4gICAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgICAgICAgc2luay5lcnJvcihyZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBzaW5rLm9uQ2FuY2VsID0gcmVhc29uID0+IHtcbiAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5jYW5jZWwocmVhc29uKTtcbiAgICAgICAgc2luay5yZWFkeS5jYXRjaChyZWFkeVJlYXNvbiA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHJlYWR5UmVhc29uO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJSZWFkZXJIZWFkZXJzUmVhZHlcIiwgZGF0YSA9PiB7XG4gICAgICBjb25zdCBoZWFkZXJzQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpO1xuICAgICAgY29uc3QgZnVsbFJlYWRlciA9IHRoaXMuX2Z1bGxSZWFkZXI7XG4gICAgICBmdWxsUmVhZGVyLmhlYWRlcnNSZWFkeS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKCFmdWxsUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkIHx8ICFmdWxsUmVhZGVyLmlzUmFuZ2VTdXBwb3J0ZWQpIHtcbiAgICAgICAgICBpZiAodGhpcy5fbGFzdFByb2dyZXNzKSB7XG4gICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzPy4odGhpcy5fbGFzdFByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVsbFJlYWRlci5vblByb2dyZXNzID0gZXZ0ID0+IHtcbiAgICAgICAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcbiAgICAgICAgICAgICAgdG90YWw6IGV2dC50b3RhbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBoZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1N1cHBvcnRlZDogZnVsbFJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCxcbiAgICAgICAgICBpc1JhbmdlU3VwcG9ydGVkOiBmdWxsUmVhZGVyLmlzUmFuZ2VTdXBwb3J0ZWQsXG4gICAgICAgICAgY29udGVudExlbmd0aDogZnVsbFJlYWRlci5jb250ZW50TGVuZ3RoXG4gICAgICAgIH0pO1xuICAgICAgfSwgaGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgIHJldHVybiBoZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiR2V0UmFuZ2VSZWFkZXJcIiwgKGRhdGEsIHNpbmspID0+IHtcbiAgICAgIGFzc2VydCh0aGlzLl9uZXR3b3JrU3RyZWFtLCBcIkdldFJhbmdlUmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIik7XG4gICAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMuX25ldHdvcmtTdHJlYW0uZ2V0UmFuZ2VSZWFkZXIoZGF0YS5iZWdpbiwgZGF0YS5lbmQpO1xuICAgICAgaWYgKCFyYW5nZVJlYWRlcikge1xuICAgICAgICBzaW5rLmNsb3NlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNpbmsub25QdWxsID0gKCkgPT4ge1xuICAgICAgICByYW5nZVJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoe1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGRvbmVcbiAgICAgICAgfSkge1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBzaW5rLmNsb3NlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2VydCh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyLCBcIkdldFJhbmdlUmVhZGVyIC0gZXhwZWN0ZWQgYW4gQXJyYXlCdWZmZXIuXCIpO1xuICAgICAgICAgIHNpbmsuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSksIDEsIFt2YWx1ZV0pO1xuICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4ge1xuICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgc2luay5vbkNhbmNlbCA9IHJlYXNvbiA9PiB7XG4gICAgICAgIHJhbmdlUmVhZGVyLmNhbmNlbChyZWFzb24pO1xuICAgICAgICBzaW5rLnJlYWR5LmNhdGNoKHJlYWR5UmVhc29uID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVhZHlSZWFzb247XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkdldERvY1wiLCAoe1xuICAgICAgcGRmSW5mb1xuICAgIH0pID0+IHtcbiAgICAgIHRoaXMuX251bVBhZ2VzID0gcGRmSW5mby5udW1QYWdlcztcbiAgICAgIHRoaXMuX2h0bWxGb3JYZmEgPSBwZGZJbmZvLmh0bWxGb3JYZmE7XG4gICAgICBkZWxldGUgcGRmSW5mby5odG1sRm9yWGZhO1xuICAgICAgbG9hZGluZ1Rhc2suX2NhcGFiaWxpdHkucmVzb2x2ZShuZXcgUERGRG9jdW1lbnRQcm94eShwZGZJbmZvLCB0aGlzKSk7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJEb2NFeGNlcHRpb25cIiwgZnVuY3Rpb24gKGV4KSB7XG4gICAgICBsZXQgcmVhc29uO1xuICAgICAgc3dpdGNoIChleC5uYW1lKSB7XG4gICAgICAgIGNhc2UgXCJQYXNzd29yZEV4Y2VwdGlvblwiOlxuICAgICAgICAgIHJlYXNvbiA9IG5ldyBQYXNzd29yZEV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5jb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkludmFsaWRQREZFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgSW52YWxpZFBERkV4Y2VwdGlvbihleC5tZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk1pc3NpbmdQREZFeGNlcHRpb25cIjpcbiAgICAgICAgICByZWFzb24gPSBuZXcgTWlzc2luZ1BERkV4Y2VwdGlvbihleC5tZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiOlxuICAgICAgICAgIHJlYXNvbiA9IG5ldyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguc3RhdHVzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlVua25vd25FcnJvckV4Y2VwdGlvblwiOlxuICAgICAgICAgIHJlYXNvbiA9IG5ldyBVbmtub3duRXJyb3JFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguZGV0YWlscyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdW5yZWFjaGFibGUoXCJEb2NFeGNlcHRpb24gLSBleHBlY3RlZCBhIHZhbGlkIEVycm9yLlwiKTtcbiAgICAgIH1cbiAgICAgIGxvYWRpbmdUYXNrLl9jYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiUGFzc3dvcmRSZXF1ZXN0XCIsIGV4Y2VwdGlvbiA9PiB7XG4gICAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICAgIGlmIChsb2FkaW5nVGFzay5vblBhc3N3b3JkKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVBhc3N3b3JkID0gcGFzc3dvcmQgPT4ge1xuICAgICAgICAgIGlmIChwYXNzd29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KHBhc3N3b3JkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5LnJlc29sdmUoe1xuICAgICAgICAgICAgICBwYXNzd29yZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvYWRpbmdUYXNrLm9uUGFzc3dvcmQodXBkYXRlUGFzc3dvcmQsIGV4Y2VwdGlvbi5jb2RlKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICB0aGlzLiNwYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KGV4KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChuZXcgUGFzc3dvcmRFeGNlcHRpb24oZXhjZXB0aW9uLm1lc3NhZ2UsIGV4Y2VwdGlvbi5jb2RlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy4jcGFzc3dvcmRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJEYXRhTG9hZGVkXCIsIGRhdGEgPT4ge1xuICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcz8uKHtcbiAgICAgICAgbG9hZGVkOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgdG90YWw6IGRhdGEubGVuZ3RoXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5yZXNvbHZlKGRhdGEpO1xuICAgIH0pO1xuICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiU3RhcnRSZW5kZXJQYWdlXCIsIGRhdGEgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLiNwYWdlQ2FjaGUuZ2V0KGRhdGEucGFnZUluZGV4KTtcbiAgICAgIHBhZ2UuX3N0YXJ0UmVuZGVyUGFnZShkYXRhLnRyYW5zcGFyZW5jeSwgZGF0YS5jYWNoZUtleSk7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJjb21tb25vYmpcIiwgKFtpZCwgdHlwZSwgZXhwb3J0ZWREYXRhXSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29tbW9uT2Jqcy5oYXMoaWQpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJGb250XCI6XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZGlzYWJsZUZvbnRGYWNlLFxuICAgICAgICAgICAgZm9udEV4dHJhUHJvcGVydGllcyxcbiAgICAgICAgICAgIHBkZkJ1Z1xuICAgICAgICAgIH0gPSB0aGlzLl9wYXJhbXM7XG4gICAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiBleHBvcnRlZERhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cG9ydGVkRXJyb3IgPSBleHBvcnRlZERhdGEuZXJyb3I7XG4gICAgICAgICAgICB3YXJuKGBFcnJvciBkdXJpbmcgZm9udCBsb2FkaW5nOiAke2V4cG9ydGVkRXJyb3J9YCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZXhwb3J0ZWRFcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW5zcGVjdEZvbnQgPSBwZGZCdWcgJiYgZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yPy5lbmFibGVkID8gKGZvbnQsIHVybCkgPT4gZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmZvbnRBZGRlZChmb250LCB1cmwpIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBmb250ID0gbmV3IEZvbnRGYWNlT2JqZWN0KGV4cG9ydGVkRGF0YSwge1xuICAgICAgICAgICAgZGlzYWJsZUZvbnRGYWNlLFxuICAgICAgICAgICAgaW5zcGVjdEZvbnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmZvbnRMb2FkZXIuYmluZChmb250KS5jYXRjaCgoKSA9PiBtZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJGb250RmFsbGJhY2tcIiwge1xuICAgICAgICAgICAgaWRcbiAgICAgICAgICB9KSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZvbnRFeHRyYVByb3BlcnRpZXMgJiYgZm9udC5kYXRhKSB7XG4gICAgICAgICAgICAgIGZvbnQuZGF0YSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZm9udCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJDb3B5TG9jYWxJbWFnZVwiOlxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGltYWdlUmVmXG4gICAgICAgICAgfSA9IGV4cG9ydGVkRGF0YTtcbiAgICAgICAgICBhc3NlcnQoaW1hZ2VSZWYsIFwiVGhlIGltYWdlUmVmIG11c3QgYmUgZGVmaW5lZC5cIik7XG4gICAgICAgICAgZm9yIChjb25zdCBwYWdlUHJveHkgb2YgdGhpcy4jcGFnZUNhY2hlLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFssIGRhdGFdIG9mIHBhZ2VQcm94eS5vYmpzKSB7XG4gICAgICAgICAgICAgIGlmIChkYXRhPy5yZWYgIT09IGltYWdlUmVmKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFkYXRhLmRhdGFMZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgc3RydWN0dXJlZENsb25lKGRhdGEpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YUxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJGb250UGF0aFwiOlxuICAgICAgICBjYXNlIFwiSW1hZ2VcIjpcbiAgICAgICAgY2FzZSBcIlBhdHRlcm5cIjpcbiAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZXhwb3J0ZWREYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCB1bmtub3duIGNvbW1vbiBvYmplY3QgdHlwZSAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIm9ialwiLCAoW2lkLCBwYWdlSW5kZXgsIHR5cGUsIGltYWdlRGF0YV0pID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwYWdlUHJveHkgPSB0aGlzLiNwYWdlQ2FjaGUuZ2V0KHBhZ2VJbmRleCk7XG4gICAgICBpZiAocGFnZVByb3h5Lm9ianMuaGFzKGlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocGFnZVByb3h5Ll9pbnRlbnRTdGF0ZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICBpbWFnZURhdGE/LmJpdG1hcD8uY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJJbWFnZVwiOlxuICAgICAgICAgIHBhZ2VQcm94eS5vYmpzLnJlc29sdmUoaWQsIGltYWdlRGF0YSk7XG4gICAgICAgICAgaWYgKGltYWdlRGF0YT8uZGF0YUxlbiA+IE1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFKSB7XG4gICAgICAgICAgICBwYWdlUHJveHkuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG4gICAgICAgICAgcGFnZVByb3h5Lm9ianMucmVzb2x2ZShpZCwgaW1hZ2VEYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCB1bmtub3duIG9iamVjdCB0eXBlICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkRvY1Byb2dyZXNzXCIsIGRhdGEgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3M/Lih7XG4gICAgICAgIGxvYWRlZDogZGF0YS5sb2FkZWQsXG4gICAgICAgIHRvdGFsOiBkYXRhLnRvdGFsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBtZXNzYWdlSGFuZGxlci5vbihcIkZldGNoQnVpbHRJbkNNYXBcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkLlwiKSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY01hcFJlYWRlckZhY3RvcnkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNNYXBSZWFkZXJGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci5cIikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY01hcFJlYWRlckZhY3RvcnkuZmV0Y2goZGF0YSk7XG4gICAgfSk7XG4gICAgbWVzc2FnZUhhbmRsZXIub24oXCJGZXRjaFN0YW5kYXJkRm9udERhdGFcIiwgZGF0YSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkLlwiKSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlN0YW5kYXJkRm9udERhdGFGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci5cIikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkuZmV0Y2goZGF0YSk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREYXRhXCIsIG51bGwpO1xuICB9XG4gIHNhdmVEb2N1bWVudCgpIHtcbiAgICBpZiAodGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zaXplIDw9IDApIHtcbiAgICAgIHdhcm4oXCJzYXZlRG9jdW1lbnQgY2FsbGVkIHdoaWxlIGBhbm5vdGF0aW9uU3RvcmFnZWAgaXMgZW1wdHksIFwiICsgXCJwbGVhc2UgdXNlIHRoZSBnZXREYXRhLW1ldGhvZCBpbnN0ZWFkLlwiKTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgbWFwLFxuICAgICAgdHJhbnNmZXJcbiAgICB9ID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXJpYWxpemFibGU7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiU2F2ZURvY3VtZW50XCIsIHtcbiAgICAgIGlzUHVyZVhmYTogISF0aGlzLl9odG1sRm9yWGZhLFxuICAgICAgbnVtUGFnZXM6IHRoaXMuX251bVBhZ2VzLFxuICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IG1hcCxcbiAgICAgIGZpbGVuYW1lOiB0aGlzLl9mdWxsUmVhZGVyPy5maWxlbmFtZSA/PyBudWxsXG4gICAgfSwgdHJhbnNmZXIpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5yZXNldE1vZGlmaWVkKCk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0UGFnZShwYWdlTnVtYmVyKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhZ2VOdW1iZXIpIHx8IHBhZ2VOdW1iZXIgPD0gMCB8fCBwYWdlTnVtYmVyID4gdGhpcy5fbnVtUGFnZXMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJJbnZhbGlkIHBhZ2UgcmVxdWVzdC5cIikpO1xuICAgIH1cbiAgICBjb25zdCBwYWdlSW5kZXggPSBwYWdlTnVtYmVyIC0gMSxcbiAgICAgIGNhY2hlZFByb21pc2UgPSB0aGlzLiNwYWdlUHJvbWlzZXMuZ2V0KHBhZ2VJbmRleCk7XG4gICAgaWYgKGNhY2hlZFByb21pc2UpIHtcbiAgICAgIHJldHVybiBjYWNoZWRQcm9taXNlO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlXCIsIHtcbiAgICAgIHBhZ2VJbmRleFxuICAgIH0pLnRoZW4ocGFnZUluZm8gPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyYW5zcG9ydCBkZXN0cm95ZWRcIik7XG4gICAgICB9XG4gICAgICBpZiAocGFnZUluZm8ucmVmU3RyKSB7XG4gICAgICAgIHRoaXMuI3BhZ2VSZWZDYWNoZS5zZXQocGFnZUluZm8ucmVmU3RyLCBwYWdlTnVtYmVyKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhZ2UgPSBuZXcgUERGUGFnZVByb3h5KHBhZ2VJbmRleCwgcGFnZUluZm8sIHRoaXMsIHRoaXMuX3BhcmFtcy5wZGZCdWcpO1xuICAgICAgdGhpcy4jcGFnZUNhY2hlLnNldChwYWdlSW5kZXgsIHBhZ2UpO1xuICAgICAgcmV0dXJuIHBhZ2U7XG4gICAgfSk7XG4gICAgdGhpcy4jcGFnZVByb21pc2VzLnNldChwYWdlSW5kZXgsIHByb21pc2UpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG4gIGdldFBhZ2VJbmRleChyZWYpIHtcbiAgICBpZiAoIWlzUmVmUHJveHkocmVmKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgcGFnZUluZGV4IHJlcXVlc3QuXCIpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUluZGV4XCIsIHtcbiAgICAgIG51bTogcmVmLm51bSxcbiAgICAgIGdlbjogcmVmLmdlblxuICAgIH0pO1xuICB9XG4gIGdldEFubm90YXRpb25zKHBhZ2VJbmRleCwgaW50ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QW5ub3RhdGlvbnNcIiwge1xuICAgICAgcGFnZUluZGV4LFxuICAgICAgaW50ZW50XG4gICAgfSk7XG4gIH1cbiAgZ2V0RmllbGRPYmplY3RzKCkge1xuICAgIHJldHVybiB0aGlzLiNjYWNoZVNpbXBsZU1ldGhvZChcIkdldEZpZWxkT2JqZWN0c1wiKTtcbiAgfVxuICBoYXNKU0FjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlU2ltcGxlTWV0aG9kKFwiSGFzSlNBY3Rpb25zXCIpO1xuICB9XG4gIGdldENhbGN1bGF0aW9uT3JkZXJJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0Q2FsY3VsYXRpb25PcmRlcklkc1wiLCBudWxsKTtcbiAgfVxuICBnZXREZXN0aW5hdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RGVzdGluYXRpb25zXCIsIG51bGwpO1xuICB9XG4gIGdldERlc3RpbmF0aW9uKGlkKSB7XG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgZGVzdGluYXRpb24gcmVxdWVzdC5cIikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREZXN0aW5hdGlvblwiLCB7XG4gICAgICBpZFxuICAgIH0pO1xuICB9XG4gIGdldFBhZ2VMYWJlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUxhYmVsc1wiLCBudWxsKTtcbiAgfVxuICBnZXRQYWdlTGF5b3V0KCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VMYXlvdXRcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0UGFnZU1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZU1vZGVcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0Vmlld2VyUHJlZmVyZW5jZXNcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0T3BlbkFjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRPcGVuQWN0aW9uXCIsIG51bGwpO1xuICB9XG4gIGdldEF0dGFjaG1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldEF0dGFjaG1lbnRzXCIsIG51bGwpO1xuICB9XG4gIGdldERvY0pTQWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy4jY2FjaGVTaW1wbGVNZXRob2QoXCJHZXREb2NKU0FjdGlvbnNcIik7XG4gIH1cbiAgZ2V0UGFnZUpTQWN0aW9ucyhwYWdlSW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlSlNBY3Rpb25zXCIsIHtcbiAgICAgIHBhZ2VJbmRleFxuICAgIH0pO1xuICB9XG4gIGdldFN0cnVjdFRyZWUocGFnZUluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0U3RydWN0VHJlZVwiLCB7XG4gICAgICBwYWdlSW5kZXhcbiAgICB9KTtcbiAgfVxuICBnZXRPdXRsaW5lKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE91dGxpbmVcIiwgbnVsbCk7XG4gIH1cbiAgZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKHJlbmRlcmluZ0ludGVudCkge1xuICAgIHJldHVybiB0aGlzLiNjYWNoZVNpbXBsZU1ldGhvZChcIkdldE9wdGlvbmFsQ29udGVudENvbmZpZ1wiKS50aGVuKGRhdGEgPT4gbmV3IE9wdGlvbmFsQ29udGVudENvbmZpZyhkYXRhLCByZW5kZXJpbmdJbnRlbnQpKTtcbiAgfVxuICBnZXRQZXJtaXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQZXJtaXNzaW9uc1wiLCBudWxsKTtcbiAgfVxuICBnZXRNZXRhZGF0YSgpIHtcbiAgICBjb25zdCBuYW1lID0gXCJHZXRNZXRhZGF0YVwiLFxuICAgICAgY2FjaGVkUHJvbWlzZSA9IHRoaXMuI21ldGhvZFByb21pc2VzLmdldChuYW1lKTtcbiAgICBpZiAoY2FjaGVkUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGNhY2hlZFByb21pc2U7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShuYW1lLCBudWxsKS50aGVuKHJlc3VsdHMgPT4gKHtcbiAgICAgIGluZm86IHJlc3VsdHNbMF0sXG4gICAgICBtZXRhZGF0YTogcmVzdWx0c1sxXSA/IG5ldyBNZXRhZGF0YShyZXN1bHRzWzFdKSA6IG51bGwsXG4gICAgICBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTogdGhpcy5fZnVsbFJlYWRlcj8uZmlsZW5hbWUgPz8gbnVsbCxcbiAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2Z1bGxSZWFkZXI/LmNvbnRlbnRMZW5ndGggPz8gbnVsbFxuICAgIH0pKTtcbiAgICB0aGlzLiNtZXRob2RQcm9taXNlcy5zZXQobmFtZSwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cbiAgZ2V0TWFya0luZm8oKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0TWFya0luZm9cIiwgbnVsbCk7XG4gIH1cbiAgYXN5bmMgc3RhcnRDbGVhbnVwKGtlZXBMb2FkZWRGb250cyA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiQ2xlYW51cFwiLCBudWxsKTtcbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgdGhpcy4jcGFnZUNhY2hlLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBjbGVhbnVwU3VjY2Vzc2Z1bCA9IHBhZ2UuY2xlYW51cCgpO1xuICAgICAgaWYgKCFjbGVhbnVwU3VjY2Vzc2Z1bCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0YXJ0Q2xlYW51cDogUGFnZSAke3BhZ2UucGFnZU51bWJlcn0gaXMgY3VycmVudGx5IHJlbmRlcmluZy5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jb21tb25PYmpzLmNsZWFyKCk7XG4gICAgaWYgKCFrZWVwTG9hZGVkRm9udHMpIHtcbiAgICAgIHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuICAgIH1cbiAgICB0aGlzLiNtZXRob2RQcm9taXNlcy5jbGVhcigpO1xuICAgIHRoaXMuZmlsdGVyRmFjdG9yeS5kZXN0cm95KHRydWUpO1xuICAgIFRleHRMYXllci5jbGVhbnVwKCk7XG4gIH1cbiAgY2FjaGVkUGFnZU51bWJlcihyZWYpIHtcbiAgICBpZiAoIWlzUmVmUHJveHkocmVmKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlZlN0ciA9IHJlZi5nZW4gPT09IDAgPyBgJHtyZWYubnVtfVJgIDogYCR7cmVmLm51bX1SJHtyZWYuZ2VufWA7XG4gICAgcmV0dXJuIHRoaXMuI3BhZ2VSZWZDYWNoZS5nZXQocmVmU3RyKSA/PyBudWxsO1xuICB9XG59XG5jb25zdCBJTklUSUFMX0RBVEEgPSBTeW1ib2woXCJJTklUSUFMX0RBVEFcIik7XG5jbGFzcyBQREZPYmplY3RzIHtcbiAgI29ianMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAjZW5zdXJlT2JqKG9iaklkKSB7XG4gICAgcmV0dXJuIHRoaXMuI29ianNbb2JqSWRdIHx8PSB7XG4gICAgICAuLi5Qcm9taXNlLndpdGhSZXNvbHZlcnMoKSxcbiAgICAgIGRhdGE6IElOSVRJQUxfREFUQVxuICAgIH07XG4gIH1cbiAgZ2V0KG9iaklkLCBjYWxsYmFjayA9IG51bGwpIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuI2Vuc3VyZU9iaihvYmpJZCk7XG4gICAgICBvYmoucHJvbWlzZS50aGVuKCgpID0+IGNhbGxiYWNrKG9iai5kYXRhKSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgb2JqID0gdGhpcy4jb2Jqc1tvYmpJZF07XG4gICAgaWYgKCFvYmogfHwgb2JqLmRhdGEgPT09IElOSVRJQUxfREFUQSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0aW5nIG9iamVjdCB0aGF0IGlzbid0IHJlc29sdmVkIHlldCAke29iaklkfS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iai5kYXRhO1xuICB9XG4gIGhhcyhvYmpJZCkge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuI29ianNbb2JqSWRdO1xuICAgIHJldHVybiAhIW9iaiAmJiBvYmouZGF0YSAhPT0gSU5JVElBTF9EQVRBO1xuICB9XG4gIHJlc29sdmUob2JqSWQsIGRhdGEgPSBudWxsKSB7XG4gICAgY29uc3Qgb2JqID0gdGhpcy4jZW5zdXJlT2JqKG9iaklkKTtcbiAgICBvYmouZGF0YSA9IGRhdGE7XG4gICAgb2JqLnJlc29sdmUoKTtcbiAgfVxuICBjbGVhcigpIHtcbiAgICBmb3IgKGNvbnN0IG9iaklkIGluIHRoaXMuI29ianMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YVxuICAgICAgfSA9IHRoaXMuI29ianNbb2JqSWRdO1xuICAgICAgZGF0YT8uYml0bWFwPy5jbG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLiNvYmpzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgZm9yIChjb25zdCBvYmpJZCBpbiB0aGlzLiNvYmpzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRhdGFcbiAgICAgIH0gPSB0aGlzLiNvYmpzW29iaklkXTtcbiAgICAgIGlmIChkYXRhID09PSBJTklUSUFMX0RBVEEpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB5aWVsZCBbb2JqSWQsIGRhdGFdO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgUmVuZGVyVGFzayB7XG4gICNpbnRlcm5hbFJlbmRlclRhc2sgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihpbnRlcm5hbFJlbmRlclRhc2spIHtcbiAgICB0aGlzLiNpbnRlcm5hbFJlbmRlclRhc2sgPSBpbnRlcm5hbFJlbmRlclRhc2s7XG4gICAgdGhpcy5vbkNvbnRpbnVlID0gbnVsbDtcbiAgfVxuICBnZXQgcHJvbWlzZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxuICBjYW5jZWwoZXh0cmFEZWxheSA9IDApIHtcbiAgICB0aGlzLiNpbnRlcm5hbFJlbmRlclRhc2suY2FuY2VsKG51bGwsIGV4dHJhRGVsYXkpO1xuICB9XG4gIGdldCBzZXBhcmF0ZUFubm90cygpIHtcbiAgICBjb25zdCB7XG4gICAgICBzZXBhcmF0ZUFubm90c1xuICAgIH0gPSB0aGlzLiNpbnRlcm5hbFJlbmRlclRhc2sub3BlcmF0b3JMaXN0O1xuICAgIGlmICghc2VwYXJhdGVBbm5vdHMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcFxuICAgIH0gPSB0aGlzLiNpbnRlcm5hbFJlbmRlclRhc2s7XG4gICAgcmV0dXJuIHNlcGFyYXRlQW5ub3RzLmZvcm0gfHwgc2VwYXJhdGVBbm5vdHMuY2FudmFzICYmIGFubm90YXRpb25DYW52YXNNYXA/LnNpemUgPiAwO1xuICB9XG59XG5jbGFzcyBJbnRlcm5hbFJlbmRlclRhc2sge1xuICAjckFGID0gbnVsbDtcbiAgc3RhdGljICNjYW52YXNJblVzZSA9IG5ldyBXZWFrU2V0KCk7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjYWxsYmFjayxcbiAgICBwYXJhbXMsXG4gICAgb2JqcyxcbiAgICBjb21tb25PYmpzLFxuICAgIGFubm90YXRpb25DYW52YXNNYXAsXG4gICAgb3BlcmF0b3JMaXN0LFxuICAgIHBhZ2VJbmRleCxcbiAgICBjYW52YXNGYWN0b3J5LFxuICAgIGZpbHRlckZhY3RvcnksXG4gICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZmFsc2UsXG4gICAgcGRmQnVnID0gZmFsc2UsXG4gICAgcGFnZUNvbG9ycyA9IG51bGxcbiAgfSkge1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLm9ianMgPSBvYmpzO1xuICAgIHRoaXMuY29tbW9uT2JqcyA9IGNvbW1vbk9ianM7XG4gICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzTWFwID0gYW5ub3RhdGlvbkNhbnZhc01hcDtcbiAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IG51bGw7XG4gICAgdGhpcy5vcGVyYXRvckxpc3QgPSBvcGVyYXRvckxpc3Q7XG4gICAgdGhpcy5fcGFnZUluZGV4ID0gcGFnZUluZGV4O1xuICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7XG4gICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gZmlsdGVyRmFjdG9yeTtcbiAgICB0aGlzLl9wZGZCdWcgPSBwZGZCdWc7XG4gICAgdGhpcy5wYWdlQ29sb3JzID0gcGFnZUNvbG9ycztcbiAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5ncmFwaGljc1JlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSB0cnVlICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCI7XG4gICAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTtcbiAgICB0aGlzLnRhc2sgPSBuZXcgUmVuZGVyVGFzayh0aGlzKTtcbiAgICB0aGlzLl9jYW5jZWxCb3VuZCA9IHRoaXMuY2FuY2VsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fY29udGludWVCb3VuZCA9IHRoaXMuX2NvbnRpbnVlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQgPSB0aGlzLl9zY2hlZHVsZU5leHQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9uZXh0Qm91bmQgPSB0aGlzLl9uZXh0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fY2FudmFzID0gcGFyYW1zLmNhbnZhc0NvbnRleHQuY2FudmFzO1xuICB9XG4gIGdldCBjb21wbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgfVxuICBpbml0aWFsaXplR3JhcGhpY3Moe1xuICAgIHRyYW5zcGFyZW5jeSA9IGZhbHNlLFxuICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1xuICB9KSB7XG4gICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9jYW52YXMpIHtcbiAgICAgIGlmIChJbnRlcm5hbFJlbmRlclRhc2suI2NhbnZhc0luVXNlLmhhcyh0aGlzLl9jYW52YXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgdGhlIHNhbWUgY2FudmFzIGR1cmluZyBtdWx0aXBsZSByZW5kZXIoKSBvcGVyYXRpb25zLiBcIiArIFwiVXNlIGRpZmZlcmVudCBjYW52YXMgb3IgZW5zdXJlIHByZXZpb3VzIG9wZXJhdGlvbnMgd2VyZSBcIiArIFwiY2FuY2VsbGVkIG9yIGNvbXBsZXRlZC5cIik7XG4gICAgICB9XG4gICAgICBJbnRlcm5hbFJlbmRlclRhc2suI2NhbnZhc0luVXNlLmFkZCh0aGlzLl9jYW52YXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcGRmQnVnICYmIGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXI/LmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc3RlcHBlciA9IGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXIuY3JlYXRlKHRoaXMuX3BhZ2VJbmRleCk7XG4gICAgICB0aGlzLnN0ZXBwZXIuaW5pdCh0aGlzLm9wZXJhdG9yTGlzdCk7XG4gICAgICB0aGlzLnN0ZXBwZXIubmV4dEJyZWFrUG9pbnQgPSB0aGlzLnN0ZXBwZXIuZ2V0TmV4dEJyZWFrUG9pbnQoKTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgY2FudmFzQ29udGV4dCxcbiAgICAgIHZpZXdwb3J0LFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgYmFja2dyb3VuZFxuICAgIH0gPSB0aGlzLnBhcmFtcztcbiAgICB0aGlzLmdmeCA9IG5ldyBDYW52YXNHcmFwaGljcyhjYW52YXNDb250ZXh0LCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLmZpbHRlckZhY3RvcnksIHtcbiAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1xuICAgIH0sIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCwgdGhpcy5wYWdlQ29sb3JzKTtcbiAgICB0aGlzLmdmeC5iZWdpbkRyYXdpbmcoe1xuICAgICAgdHJhbnNmb3JtLFxuICAgICAgdmlld3BvcnQsXG4gICAgICB0cmFuc3BhcmVuY3ksXG4gICAgICBiYWNrZ3JvdW5kXG4gICAgfSk7XG4gICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSAwO1xuICAgIHRoaXMuZ3JhcGhpY3NSZWFkeSA9IHRydWU7XG4gICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2s/LigpO1xuICB9XG4gIGNhbmNlbChlcnJvciA9IG51bGwsIGV4dHJhRGVsYXkgPSAwKSB7XG4gICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIHRoaXMuZ2Z4Py5lbmREcmF3aW5nKCk7XG4gICAgaWYgKHRoaXMuI3JBRikge1xuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuI3JBRik7XG4gICAgICB0aGlzLiNyQUYgPSBudWxsO1xuICAgIH1cbiAgICBJbnRlcm5hbFJlbmRlclRhc2suI2NhbnZhc0luVXNlLmRlbGV0ZSh0aGlzLl9jYW52YXMpO1xuICAgIHRoaXMuY2FsbGJhY2soZXJyb3IgfHwgbmV3IFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbihgUmVuZGVyaW5nIGNhbmNlbGxlZCwgcGFnZSAke3RoaXMuX3BhZ2VJbmRleCArIDF9YCwgZXh0cmFEZWxheSkpO1xuICB9XG4gIG9wZXJhdG9yTGlzdENoYW5nZWQoKSB7XG4gICAgaWYgKCF0aGlzLmdyYXBoaWNzUmVhZHkpIHtcbiAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrIHx8PSB0aGlzLl9jb250aW51ZUJvdW5kO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0ZXBwZXI/LnVwZGF0ZU9wZXJhdG9yTGlzdCh0aGlzLm9wZXJhdG9yTGlzdCk7XG4gICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jb250aW51ZSgpO1xuICB9XG4gIF9jb250aW51ZSgpIHtcbiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgIGlmICh0aGlzLmNhbmNlbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50YXNrLm9uQ29udGludWUpIHtcbiAgICAgIHRoaXMudGFzay5vbkNvbnRpbnVlKHRoaXMuX3NjaGVkdWxlTmV4dEJvdW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2NoZWR1bGVOZXh0KCk7XG4gICAgfVxuICB9XG4gIF9zY2hlZHVsZU5leHQoKSB7XG4gICAgaWYgKHRoaXMuX3VzZVJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy4jckFGID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuI3JBRiA9IG51bGw7XG4gICAgICAgIHRoaXMuX25leHRCb3VuZCgpLmNhdGNoKHRoaXMuX2NhbmNlbEJvdW5kKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKHRoaXMuX25leHRCb3VuZCkuY2F0Y2godGhpcy5fY2FuY2VsQm91bmQpO1xuICAgIH1cbiAgfVxuICBhc3luYyBfbmV4dCgpIHtcbiAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSB0aGlzLmdmeC5leGVjdXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0LCB0aGlzLm9wZXJhdG9yTGlzdElkeCwgdGhpcy5fY29udGludWVCb3VuZCwgdGhpcy5zdGVwcGVyKTtcbiAgICBpZiAodGhpcy5vcGVyYXRvckxpc3RJZHggPT09IHRoaXMub3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5sZW5ndGgpIHtcbiAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMub3BlcmF0b3JMaXN0Lmxhc3RDaHVuaykge1xuICAgICAgICB0aGlzLmdmeC5lbmREcmF3aW5nKCk7XG4gICAgICAgIEludGVybmFsUmVuZGVyVGFzay4jY2FudmFzSW5Vc2UuZGVsZXRlKHRoaXMuX2NhbnZhcyk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmNvbnN0IHZlcnNpb24gPSBcIjQuNC4xNjhcIjtcbmNvbnN0IGJ1aWxkID0gXCIxOWZiYzg5OThcIjtcblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL3NoYXJlZC9zY3JpcHRpbmdfdXRpbHMuanNcbmZ1bmN0aW9uIG1ha2VDb2xvckNvbXAobikge1xuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBuKSkgKiAyNTUpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIik7XG59XG5mdW5jdGlvbiBzY2FsZUFuZENsYW1wKHgpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgMjU1ICogeCkpO1xufVxuY2xhc3MgQ29sb3JDb252ZXJ0ZXJzIHtcbiAgc3RhdGljIENNWUtfRyhbYywgeSwgbSwga10pIHtcbiAgICByZXR1cm4gW1wiR1wiLCAxIC0gTWF0aC5taW4oMSwgMC4zICogYyArIDAuNTkgKiBtICsgMC4xMSAqIHkgKyBrKV07XG4gIH1cbiAgc3RhdGljIEdfQ01ZSyhbZ10pIHtcbiAgICByZXR1cm4gW1wiQ01ZS1wiLCAwLCAwLCAwLCAxIC0gZ107XG4gIH1cbiAgc3RhdGljIEdfUkdCKFtnXSkge1xuICAgIHJldHVybiBbXCJSR0JcIiwgZywgZywgZ107XG4gIH1cbiAgc3RhdGljIEdfcmdiKFtnXSkge1xuICAgIGcgPSBzY2FsZUFuZENsYW1wKGcpO1xuICAgIHJldHVybiBbZywgZywgZ107XG4gIH1cbiAgc3RhdGljIEdfSFRNTChbZ10pIHtcbiAgICBjb25zdCBHID0gbWFrZUNvbG9yQ29tcChnKTtcbiAgICByZXR1cm4gYCMke0d9JHtHfSR7R31gO1xuICB9XG4gIHN0YXRpYyBSR0JfRyhbciwgZywgYl0pIHtcbiAgICByZXR1cm4gW1wiR1wiLCAwLjMgKiByICsgMC41OSAqIGcgKyAwLjExICogYl07XG4gIH1cbiAgc3RhdGljIFJHQl9yZ2IoY29sb3IpIHtcbiAgICByZXR1cm4gY29sb3IubWFwKHNjYWxlQW5kQ2xhbXApO1xuICB9XG4gIHN0YXRpYyBSR0JfSFRNTChjb2xvcikge1xuICAgIHJldHVybiBgIyR7Y29sb3IubWFwKG1ha2VDb2xvckNvbXApLmpvaW4oXCJcIil9YDtcbiAgfVxuICBzdGF0aWMgVF9IVE1MKCkge1xuICAgIHJldHVybiBcIiMwMDAwMDAwMFwiO1xuICB9XG4gIHN0YXRpYyBUX3JnYigpIHtcbiAgICByZXR1cm4gW251bGxdO1xuICB9XG4gIHN0YXRpYyBDTVlLX1JHQihbYywgeSwgbSwga10pIHtcbiAgICByZXR1cm4gW1wiUkdCXCIsIDEgLSBNYXRoLm1pbigxLCBjICsgayksIDEgLSBNYXRoLm1pbigxLCBtICsgayksIDEgLSBNYXRoLm1pbigxLCB5ICsgayldO1xuICB9XG4gIHN0YXRpYyBDTVlLX3JnYihbYywgeSwgbSwga10pIHtcbiAgICByZXR1cm4gW3NjYWxlQW5kQ2xhbXAoMSAtIE1hdGgubWluKDEsIGMgKyBrKSksIHNjYWxlQW5kQ2xhbXAoMSAtIE1hdGgubWluKDEsIG0gKyBrKSksIHNjYWxlQW5kQ2xhbXAoMSAtIE1hdGgubWluKDEsIHkgKyBrKSldO1xuICB9XG4gIHN0YXRpYyBDTVlLX0hUTUwoY29tcG9uZW50cykge1xuICAgIGNvbnN0IHJnYiA9IHRoaXMuQ01ZS19SR0IoY29tcG9uZW50cykuc2xpY2UoMSk7XG4gICAgcmV0dXJuIHRoaXMuUkdCX0hUTUwocmdiKTtcbiAgfVxuICBzdGF0aWMgUkdCX0NNWUsoW3IsIGcsIGJdKSB7XG4gICAgY29uc3QgYyA9IDEgLSByO1xuICAgIGNvbnN0IG0gPSAxIC0gZztcbiAgICBjb25zdCB5ID0gMSAtIGI7XG4gICAgY29uc3QgayA9IE1hdGgubWluKGMsIG0sIHkpO1xuICAgIHJldHVybiBbXCJDTVlLXCIsIGMsIG0sIHksIGtdO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L3hmYV9sYXllci5qc1xuXG5jbGFzcyBYZmFMYXllciB7XG4gIHN0YXRpYyBzZXR1cFN0b3JhZ2UoaHRtbCwgaWQsIGVsZW1lbnQsIHN0b3JhZ2UsIGludGVudCkge1xuICAgIGNvbnN0IHN0b3JlZERhdGEgPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG4gICAgICB2YWx1ZTogbnVsbFxuICAgIH0pO1xuICAgIHN3aXRjaCAoZWxlbWVudC5uYW1lKSB7XG4gICAgICBjYXNlIFwidGV4dGFyZWFcIjpcbiAgICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBodG1sLnRleHRDb250ZW50ID0gc3RvcmVkRGF0YS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZW50ID09PSBcInByaW50XCIpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG4gICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgdmFsdWU6IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgaWYgKGVsZW1lbnQuYXR0cmlidXRlcy50eXBlID09PSBcInJhZGlvXCIgfHwgZWxlbWVudC5hdHRyaWJ1dGVzLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgICAgIGlmIChzdG9yZWREYXRhLnZhbHVlID09PSBlbGVtZW50LmF0dHJpYnV0ZXMueGZhT24pIHtcbiAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB0cnVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0b3JlZERhdGEudmFsdWUgPT09IGVsZW1lbnQuYXR0cmlidXRlcy54ZmFPZmYpIHtcbiAgICAgICAgICAgIGh0bWwucmVtb3ZlQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGludGVudCA9PT0gXCJwcmludFwiKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50LnRhcmdldC5jaGVja2VkID8gZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInhmYU9uXCIpIDogZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInhmYU9mZlwiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgc3RvcmVkRGF0YS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbnRlbnQgPT09IFwicHJpbnRcIikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGh0bWwuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgIGlmIChzdG9yZWREYXRhLnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBzdG9yZWREYXRhLnZhbHVlKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBlbGVtZW50LmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmF0dHJpYnV0ZXMudmFsdWUgPT09IHN0b3JlZERhdGEudmFsdWUpIHtcbiAgICAgICAgICAgICAgb3B0aW9uLmF0dHJpYnV0ZXMuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShcInNlbGVjdGVkXCIpKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb24uYXR0cmlidXRlcy5zZWxlY3RlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBldmVudC50YXJnZXQub3B0aW9ucztcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMuc2VsZWN0ZWRJbmRleCA9PT0gLTEgPyBcIlwiIDogb3B0aW9uc1tvcHRpb25zLnNlbGVjdGVkSW5kZXhdLnZhbHVlO1xuICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgc3RhdGljIHNldEF0dHJpYnV0ZXMoe1xuICAgIGh0bWwsXG4gICAgZWxlbWVudCxcbiAgICBzdG9yYWdlID0gbnVsbCxcbiAgICBpbnRlbnQsXG4gICAgbGlua1NlcnZpY2VcbiAgfSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGF0dHJpYnV0ZXNcbiAgICB9ID0gZWxlbWVudDtcbiAgICBjb25zdCBpc0hUTUxBbmNob3JFbGVtZW50ID0gaHRtbCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50O1xuICAgIGlmIChhdHRyaWJ1dGVzLnR5cGUgPT09IFwicmFkaW9cIikge1xuICAgICAgYXR0cmlidXRlcy5uYW1lID0gYCR7YXR0cmlidXRlcy5uYW1lfS0ke2ludGVudH1gO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwiY2xhc3NcIjpcbiAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlLmpvaW4oXCIgXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJkYXRhSWRcIjpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImlkXCI6XG4gICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGh0bWwuc3R5bGUsIHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRleHRDb250ZW50XCI6XG4gICAgICAgICAgaHRtbC50ZXh0Q29udGVudCA9IHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmICghaXNIVE1MQW5jaG9yRWxlbWVudCB8fCBrZXkgIT09IFwiaHJlZlwiICYmIGtleSAhPT0gXCJuZXdXaW5kb3dcIikge1xuICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgICAgbGlua1NlcnZpY2UuYWRkTGlua0F0dHJpYnV0ZXMoaHRtbCwgYXR0cmlidXRlcy5ocmVmLCBhdHRyaWJ1dGVzLm5ld1dpbmRvdyk7XG4gICAgfVxuICAgIGlmIChzdG9yYWdlICYmIGF0dHJpYnV0ZXMuZGF0YUlkKSB7XG4gICAgICB0aGlzLnNldHVwU3RvcmFnZShodG1sLCBhdHRyaWJ1dGVzLmRhdGFJZCwgZWxlbWVudCwgc3RvcmFnZSk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyByZW5kZXIocGFyYW1ldGVycykge1xuICAgIGNvbnN0IHN0b3JhZ2UgPSBwYXJhbWV0ZXJzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGxpbmtTZXJ2aWNlID0gcGFyYW1ldGVycy5saW5rU2VydmljZTtcbiAgICBjb25zdCByb290ID0gcGFyYW1ldGVycy54ZmFIdG1sO1xuICAgIGNvbnN0IGludGVudCA9IHBhcmFtZXRlcnMuaW50ZW50IHx8IFwiZGlzcGxheVwiO1xuICAgIGNvbnN0IHJvb3RIdG1sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyb290Lm5hbWUpO1xuICAgIGlmIChyb290LmF0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIGh0bWw6IHJvb3RIdG1sLFxuICAgICAgICBlbGVtZW50OiByb290LFxuICAgICAgICBpbnRlbnQsXG4gICAgICAgIGxpbmtTZXJ2aWNlXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaXNOb3RGb3JSaWNoVGV4dCA9IGludGVudCAhPT0gXCJyaWNoVGV4dFwiO1xuICAgIGNvbnN0IHJvb3REaXYgPSBwYXJhbWV0ZXJzLmRpdjtcbiAgICByb290RGl2LmFwcGVuZChyb290SHRtbCk7XG4gICAgaWYgKHBhcmFtZXRlcnMudmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGBtYXRyaXgoJHtwYXJhbWV0ZXJzLnZpZXdwb3J0LnRyYW5zZm9ybS5qb2luKFwiLFwiKX0pYDtcbiAgICAgIHJvb3REaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIH1cbiAgICBpZiAoaXNOb3RGb3JSaWNoVGV4dCkge1xuICAgICAgcm9vdERpdi5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcInhmYUxheWVyIHhmYUZvbnRcIik7XG4gICAgfVxuICAgIGNvbnN0IHRleHREaXZzID0gW107XG4gICAgaWYgKHJvb3QuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAocm9vdC52YWx1ZSkge1xuICAgICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocm9vdC52YWx1ZSk7XG4gICAgICAgIHJvb3RIdG1sLmFwcGVuZChub2RlKTtcbiAgICAgICAgaWYgKGlzTm90Rm9yUmljaFRleHQgJiYgWGZhVGV4dC5zaG91bGRCdWlsZFRleHQocm9vdC5uYW1lKSkge1xuICAgICAgICAgIHRleHREaXZzLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHREaXZzXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IFtbcm9vdCwgLTEsIHJvb3RIdG1sXV07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IFtwYXJlbnQsIGksIGh0bWxdID0gc3RhY2suYXQoLTEpO1xuICAgICAgaWYgKGkgKyAxID09PSBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoaWxkID0gcGFyZW50LmNoaWxkcmVuWysrc3RhY2suYXQoLTEpWzFdXTtcbiAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbmFtZVxuICAgICAgfSA9IGNoaWxkO1xuICAgICAgaWYgKG5hbWUgPT09IFwiI3RleHRcIikge1xuICAgICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQudmFsdWUpO1xuICAgICAgICB0ZXh0RGl2cy5wdXNoKG5vZGUpO1xuICAgICAgICBodG1sLmFwcGVuZChub2RlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGlsZEh0bWwgPSBjaGlsZD8uYXR0cmlidXRlcz8ueG1sbnMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoY2hpbGQuYXR0cmlidXRlcy54bWxucywgbmFtZSkgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpO1xuICAgICAgaHRtbC5hcHBlbmQoY2hpbGRIdG1sKTtcbiAgICAgIGlmIChjaGlsZC5hdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgaHRtbDogY2hpbGRIdG1sLFxuICAgICAgICAgIGVsZW1lbnQ6IGNoaWxkLFxuICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgaW50ZW50LFxuICAgICAgICAgIGxpbmtTZXJ2aWNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YWNrLnB1c2goW2NoaWxkLCAtMSwgY2hpbGRIdG1sXSk7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZC52YWx1ZSk7XG4gICAgICAgIGlmIChpc05vdEZvclJpY2hUZXh0ICYmIFhmYVRleHQuc2hvdWxkQnVpbGRUZXh0KG5hbWUpKSB7XG4gICAgICAgICAgdGV4dERpdnMucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZEh0bWwuYXBwZW5kKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVsIG9mIHJvb3REaXYucXVlcnlTZWxlY3RvckFsbChcIi54ZmFOb25JbnRlcmFjdGl2ZSBpbnB1dCwgLnhmYU5vbkludGVyYWN0aXZlIHRleHRhcmVhXCIpKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJyZWFkT25seVwiLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHREaXZzXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgdXBkYXRlKHBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBgbWF0cml4KCR7cGFyYW1ldGVycy52aWV3cG9ydC50cmFuc2Zvcm0uam9pbihcIixcIil9KWA7XG4gICAgcGFyYW1ldGVycy5kaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIHBhcmFtZXRlcnMuZGl2LmhpZGRlbiA9IGZhbHNlO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2Fubm90YXRpb25fbGF5ZXIuanNcblxuXG5cblxuXG5jb25zdCBERUZBVUxUX1RBQl9JTkRFWCA9IDEwMDA7XG5jb25zdCBhbm5vdGF0aW9uX2xheWVyX0RFRkFVTFRfRk9OVF9TSVpFID0gOTtcbmNvbnN0IEdldEVsZW1lbnRzQnlOYW1lU2V0ID0gbmV3IFdlYWtTZXQoKTtcbmZ1bmN0aW9uIGdldFJlY3REaW1zKHJlY3QpIHtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogcmVjdFsyXSAtIHJlY3RbMF0sXG4gICAgaGVpZ2h0OiByZWN0WzNdIC0gcmVjdFsxXVxuICB9O1xufVxuY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5IHtcbiAgc3RhdGljIGNyZWF0ZShwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3Qgc3VidHlwZSA9IHBhcmFtZXRlcnMuZGF0YS5hbm5vdGF0aW9uVHlwZTtcbiAgICBzd2l0Y2ggKHN1YnR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuTElOSzpcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlRFWFQ6XG4gICAgICAgIHJldHVybiBuZXcgVGV4dEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5XSURHRVQ6XG4gICAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHBhcmFtZXRlcnMuZGF0YS5maWVsZFR5cGU7XG4gICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgICAgICAgY2FzZSBcIlR4XCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICBjYXNlIFwiQnRuXCI6XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycy5kYXRhLnJhZGlvQnV0dG9uKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVycy5kYXRhLmNoZWNrQm94KSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICAgIGNhc2UgXCJDaFwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgICAgICBjYXNlIFwiU2lnXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZVdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlBPUFVQOlxuICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkZSRUVURVhUOlxuICAgICAgICByZXR1cm4gbmV3IEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkxJTkU6XG4gICAgICAgIHJldHVybiBuZXcgTGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5TUVVBUkU6XG4gICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLkNJUkNMRTpcbiAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU6XG4gICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuQ0FSRVQ6XG4gICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuSU5LOlxuICAgICAgICByZXR1cm4gbmV3IElua0Fubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5QT0xZR09OOlxuICAgICAgICByZXR1cm4gbmV3IFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuSElHSExJR0hUOlxuICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZS5VTkRFUkxJTkU6XG4gICAgICAgIHJldHVybiBuZXcgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNRVUlHR0xZOlxuICAgICAgICByZXR1cm4gbmV3IFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNUUklLRU9VVDpcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuU1RBTVA6XG4gICAgICAgIHJldHVybiBuZXcgU3RhbXBBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ6XG4gICAgICAgIHJldHVybiBuZXcgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG4gICAgfVxuICB9XG59XG5jbGFzcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICN1cGRhdGVzID0gbnVsbDtcbiAgI2hhc0JvcmRlciA9IGZhbHNlO1xuICAjcG9wdXBFbGVtZW50ID0gbnVsbDtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycywge1xuICAgIGlzUmVuZGVyYWJsZSA9IGZhbHNlLFxuICAgIGlnbm9yZUJvcmRlciA9IGZhbHNlLFxuICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzID0gZmFsc2VcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pc1JlbmRlcmFibGUgPSBpc1JlbmRlcmFibGU7XG4gICAgdGhpcy5kYXRhID0gcGFyYW1ldGVycy5kYXRhO1xuICAgIHRoaXMubGF5ZXIgPSBwYXJhbWV0ZXJzLmxheWVyO1xuICAgIHRoaXMubGlua1NlcnZpY2UgPSBwYXJhbWV0ZXJzLmxpbmtTZXJ2aWNlO1xuICAgIHRoaXMuZG93bmxvYWRNYW5hZ2VyID0gcGFyYW1ldGVycy5kb3dubG9hZE1hbmFnZXI7XG4gICAgdGhpcy5pbWFnZVJlc291cmNlc1BhdGggPSBwYXJhbWV0ZXJzLmltYWdlUmVzb3VyY2VzUGF0aDtcbiAgICB0aGlzLnJlbmRlckZvcm1zID0gcGFyYW1ldGVycy5yZW5kZXJGb3JtcztcbiAgICB0aGlzLnN2Z0ZhY3RvcnkgPSBwYXJhbWV0ZXJzLnN2Z0ZhY3Rvcnk7XG4gICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZSA9IHBhcmFtZXRlcnMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgdGhpcy5lbmFibGVTY3JpcHRpbmcgPSBwYXJhbWV0ZXJzLmVuYWJsZVNjcmlwdGluZztcbiAgICB0aGlzLmhhc0pTQWN0aW9ucyA9IHBhcmFtZXRlcnMuaGFzSlNBY3Rpb25zO1xuICAgIHRoaXMuX2ZpZWxkT2JqZWN0cyA9IHBhcmFtZXRlcnMuZmllbGRPYmplY3RzO1xuICAgIHRoaXMucGFyZW50ID0gcGFyYW1ldGVycy5wYXJlbnQ7XG4gICAgaWYgKGlzUmVuZGVyYWJsZSkge1xuICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLl9jcmVhdGVDb250YWluZXIoaWdub3JlQm9yZGVyKTtcbiAgICB9XG4gICAgaWYgKGNyZWF0ZVF1YWRyaWxhdGVyYWxzKSB7XG4gICAgICB0aGlzLl9jcmVhdGVRdWFkcmlsYXRlcmFscygpO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgX2hhc1BvcHVwRGF0YSh7XG4gICAgdGl0bGVPYmosXG4gICAgY29udGVudHNPYmosXG4gICAgcmljaFRleHRcbiAgfSkge1xuICAgIHJldHVybiAhISh0aXRsZU9iaj8uc3RyIHx8IGNvbnRlbnRzT2JqPy5zdHIgfHwgcmljaFRleHQ/LnN0cik7XG4gIH1cbiAgZ2V0IGhhc1BvcHVwRGF0YSgpIHtcbiAgICByZXR1cm4gQW5ub3RhdGlvbkVsZW1lbnQuX2hhc1BvcHVwRGF0YSh0aGlzLmRhdGEpO1xuICB9XG4gIHVwZGF0ZUVkaXRlZChwYXJhbXMpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI3VwZGF0ZXMgfHw9IHtcbiAgICAgIHJlY3Q6IHRoaXMuZGF0YS5yZWN0LnNsaWNlKDApXG4gICAgfTtcbiAgICBjb25zdCB7XG4gICAgICByZWN0XG4gICAgfSA9IHBhcmFtcztcbiAgICBpZiAocmVjdCkge1xuICAgICAgdGhpcy4jc2V0UmVjdEVkaXRlZChyZWN0KTtcbiAgICB9XG4gICAgdGhpcy4jcG9wdXBFbGVtZW50Py5wb3B1cC51cGRhdGVFZGl0ZWQocGFyYW1zKTtcbiAgfVxuICByZXNldEVkaXRlZCgpIHtcbiAgICBpZiAoIXRoaXMuI3VwZGF0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jc2V0UmVjdEVkaXRlZCh0aGlzLiN1cGRhdGVzLnJlY3QpO1xuICAgIHRoaXMuI3BvcHVwRWxlbWVudD8ucG9wdXAucmVzZXRFZGl0ZWQoKTtcbiAgICB0aGlzLiN1cGRhdGVzID0gbnVsbDtcbiAgfVxuICAjc2V0UmVjdEVkaXRlZChyZWN0KSB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGFpbmVyOiB7XG4gICAgICAgIHN0eWxlXG4gICAgICB9LFxuICAgICAgZGF0YToge1xuICAgICAgICByZWN0OiBjdXJyZW50UmVjdCxcbiAgICAgICAgcm90YXRpb25cbiAgICAgIH0sXG4gICAgICBwYXJlbnQ6IHtcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICByYXdEaW1zOiB7XG4gICAgICAgICAgICBwYWdlV2lkdGgsXG4gICAgICAgICAgICBwYWdlSGVpZ2h0LFxuICAgICAgICAgICAgcGFnZVgsXG4gICAgICAgICAgICBwYWdlWVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIGN1cnJlbnRSZWN0Py5zcGxpY2UoMCwgNCwgLi4ucmVjdCk7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXMocmVjdCk7XG4gICAgc3R5bGUubGVmdCA9IGAkezEwMCAqIChyZWN0WzBdIC0gcGFnZVgpIC8gcGFnZVdpZHRofSVgO1xuICAgIHN0eWxlLnRvcCA9IGAkezEwMCAqIChwYWdlSGVpZ2h0IC0gcmVjdFszXSArIHBhZ2VZKSAvIHBhZ2VIZWlnaHR9JWA7XG4gICAgaWYgKHJvdGF0aW9uID09PSAwKSB7XG4gICAgICBzdHlsZS53aWR0aCA9IGAkezEwMCAqIHdpZHRoIC8gcGFnZVdpZHRofSVgO1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gYCR7MTAwICogaGVpZ2h0IC8gcGFnZUhlaWdodH0lYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRSb3RhdGlvbihyb3RhdGlvbik7XG4gICAgfVxuICB9XG4gIF9jcmVhdGVDb250YWluZXIoaWdub3JlQm9yZGVyKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGF0YSxcbiAgICAgIHBhcmVudDoge1xuICAgICAgICBwYWdlLFxuICAgICAgICB2aWV3cG9ydFxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIpO1xuICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFubm90YXRpb24taWRcIiwgZGF0YS5pZCk7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdpZGdldEFubm90YXRpb25FbGVtZW50KSkge1xuICAgICAgY29udGFpbmVyLnRhYkluZGV4ID0gREVGQVVMVF9UQUJfSU5ERVg7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IGNvbnRhaW5lcjtcbiAgICBzdHlsZS56SW5kZXggPSB0aGlzLnBhcmVudC56SW5kZXgrKztcbiAgICBpZiAoZGF0YS5wb3B1cFJlZikge1xuICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIiwgXCJkaWFsb2dcIik7XG4gICAgfVxuICAgIGlmIChkYXRhLmFsdGVybmF0aXZlVGV4dCkge1xuICAgICAgY29udGFpbmVyLnRpdGxlID0gZGF0YS5hbHRlcm5hdGl2ZVRleHQ7XG4gICAgfVxuICAgIGlmIChkYXRhLm5vUm90YXRlKSB7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm5vcm90YXRlXCIpO1xuICAgIH1cbiAgICBpZiAoIWRhdGEucmVjdCB8fCB0aGlzIGluc3RhbmNlb2YgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICByb3RhdGlvblxuICAgICAgfSA9IGRhdGE7XG4gICAgICBpZiAoIWRhdGEuaGFzT3duQ2FudmFzICYmIHJvdGF0aW9uICE9PSAwKSB7XG4gICAgICAgIHRoaXMuc2V0Um90YXRpb24ocm90YXRpb24sIGNvbnRhaW5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgIGlmICghaWdub3JlQm9yZGVyICYmIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggPiAwKSB7XG4gICAgICBzdHlsZS5ib3JkZXJXaWR0aCA9IGAke2RhdGEuYm9yZGVyU3R5bGUud2lkdGh9cHhgO1xuICAgICAgY29uc3QgaG9yaXpvbnRhbFJhZGl1cyA9IGRhdGEuYm9yZGVyU3R5bGUuaG9yaXpvbnRhbENvcm5lclJhZGl1cztcbiAgICAgIGNvbnN0IHZlcnRpY2FsUmFkaXVzID0gZGF0YS5ib3JkZXJTdHlsZS52ZXJ0aWNhbENvcm5lclJhZGl1cztcbiAgICAgIGlmIChob3Jpem9udGFsUmFkaXVzID4gMCB8fCB2ZXJ0aWNhbFJhZGl1cyA+IDApIHtcbiAgICAgICAgY29uc3QgcmFkaXVzID0gYGNhbGMoJHtob3Jpem9udGFsUmFkaXVzfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSkgLyBjYWxjKCR7dmVydGljYWxSYWRpdXN9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG4gICAgICAgIHN0eWxlLmJvcmRlclJhZGl1cyA9IHJhZGl1cztcbiAgICAgIH0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgcmFkaXVzID0gYGNhbGMoJHt3aWR0aH1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpIC8gY2FsYygke2hlaWdodH1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcbiAgICAgICAgc3R5bGUuYm9yZGVyUmFkaXVzID0gcmFkaXVzO1xuICAgICAgfVxuICAgICAgc3dpdGNoIChkYXRhLmJvcmRlclN0eWxlLnN0eWxlKSB7XG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDpcbiAgICAgICAgICBzdHlsZS5ib3JkZXJTdHlsZSA9IFwic29saWRcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkRBU0hFRDpcbiAgICAgICAgICBzdHlsZS5ib3JkZXJTdHlsZSA9IFwiZGFzaGVkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5CRVZFTEVEOlxuICAgICAgICAgIHdhcm4oXCJVbmltcGxlbWVudGVkIGJvcmRlciBzdHlsZTogYmV2ZWxlZFwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLklOU0VUOlxuICAgICAgICAgIHdhcm4oXCJVbmltcGxlbWVudGVkIGJvcmRlciBzdHlsZTogaW5zZXRcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU6XG4gICAgICAgICAgc3R5bGUuYm9yZGVyQm90dG9tU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBib3JkZXJDb2xvciA9IGRhdGEuYm9yZGVyQ29sb3IgfHwgbnVsbDtcbiAgICAgIGlmIChib3JkZXJDb2xvcikge1xuICAgICAgICB0aGlzLiNoYXNCb3JkZXIgPSB0cnVlO1xuICAgICAgICBzdHlsZS5ib3JkZXJDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKGJvcmRlckNvbG9yWzBdIHwgMCwgYm9yZGVyQ29sb3JbMV0gfCAwLCBib3JkZXJDb2xvclsyXSB8IDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGUuYm9yZGVyV2lkdGggPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZWN0ID0gVXRpbC5ub3JtYWxpemVSZWN0KFtkYXRhLnJlY3RbMF0sIHBhZ2Uudmlld1szXSAtIGRhdGEucmVjdFsxXSArIHBhZ2Uudmlld1sxXSwgZGF0YS5yZWN0WzJdLCBwYWdlLnZpZXdbM10gLSBkYXRhLnJlY3RbM10gKyBwYWdlLnZpZXdbMV1dKTtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0LFxuICAgICAgcGFnZVgsXG4gICAgICBwYWdlWVxuICAgIH0gPSB2aWV3cG9ydC5yYXdEaW1zO1xuICAgIHN0eWxlLmxlZnQgPSBgJHsxMDAgKiAocmVjdFswXSAtIHBhZ2VYKSAvIHBhZ2VXaWR0aH0lYDtcbiAgICBzdHlsZS50b3AgPSBgJHsxMDAgKiAocmVjdFsxXSAtIHBhZ2VZKSAvIHBhZ2VIZWlnaHR9JWA7XG4gICAgY29uc3Qge1xuICAgICAgcm90YXRpb25cbiAgICB9ID0gZGF0YTtcbiAgICBpZiAoZGF0YS5oYXNPd25DYW52YXMgfHwgcm90YXRpb24gPT09IDApIHtcbiAgICAgIHN0eWxlLndpZHRoID0gYCR7MTAwICogd2lkdGggLyBwYWdlV2lkdGh9JWA7XG4gICAgICBzdHlsZS5oZWlnaHQgPSBgJHsxMDAgKiBoZWlnaHQgLyBwYWdlSGVpZ2h0fSVgO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFJvdGF0aW9uKHJvdGF0aW9uLCBjb250YWluZXIpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG4gIHNldFJvdGF0aW9uKGFuZ2xlLCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcikge1xuICAgIGlmICghdGhpcy5kYXRhLnJlY3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgcGFnZVdpZHRoLFxuICAgICAgcGFnZUhlaWdodFxuICAgIH0gPSB0aGlzLnBhcmVudC52aWV3cG9ydC5yYXdEaW1zO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKHRoaXMuZGF0YS5yZWN0KTtcbiAgICBsZXQgZWxlbWVudFdpZHRoLCBlbGVtZW50SGVpZ2h0O1xuICAgIGlmIChhbmdsZSAlIDE4MCA9PT0gMCkge1xuICAgICAgZWxlbWVudFdpZHRoID0gMTAwICogd2lkdGggLyBwYWdlV2lkdGg7XG4gICAgICBlbGVtZW50SGVpZ2h0ID0gMTAwICogaGVpZ2h0IC8gcGFnZUhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudFdpZHRoID0gMTAwICogaGVpZ2h0IC8gcGFnZVdpZHRoO1xuICAgICAgZWxlbWVudEhlaWdodCA9IDEwMCAqIHdpZHRoIC8gcGFnZUhlaWdodDtcbiAgICB9XG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7ZWxlbWVudFdpZHRofSVgO1xuICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHtlbGVtZW50SGVpZ2h0fSVgO1xuICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLW1haW4tcm90YXRpb25cIiwgKDM2MCAtIGFuZ2xlKSAlIDM2MCk7XG4gIH1cbiAgZ2V0IF9jb21tb25BY3Rpb25zKCkge1xuICAgIGNvbnN0IHNldENvbG9yID0gKGpzTmFtZSwgc3R5bGVOYW1lLCBldmVudCkgPT4ge1xuICAgICAgY29uc3QgY29sb3IgPSBldmVudC5kZXRhaWxbanNOYW1lXTtcbiAgICAgIGNvbnN0IGNvbG9yVHlwZSA9IGNvbG9yWzBdO1xuICAgICAgY29uc3QgY29sb3JBcnJheSA9IGNvbG9yLnNsaWNlKDEpO1xuICAgICAgZXZlbnQudGFyZ2V0LnN0eWxlW3N0eWxlTmFtZV0gPSBDb2xvckNvbnZlcnRlcnNbYCR7Y29sb3JUeXBlfV9IVE1MYF0oY29sb3JBcnJheSk7XG4gICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICBbc3R5bGVOYW1lXTogQ29sb3JDb252ZXJ0ZXJzW2Ake2NvbG9yVHlwZX1fcmdiYF0oY29sb3JBcnJheSlcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9jb21tb25BY3Rpb25zXCIsIHtcbiAgICAgIGRpc3BsYXk6IGV2ZW50ID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGRpc3BsYXlcbiAgICAgICAgfSA9IGV2ZW50LmRldGFpbDtcbiAgICAgICAgY29uc3QgaGlkZGVuID0gZGlzcGxheSAlIDIgPT09IDE7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSBoaWRkZW4gPyBcImhpZGRlblwiIDogXCJ2aXNpYmxlXCI7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgICAgbm9WaWV3OiBoaWRkZW4sXG4gICAgICAgICAgbm9QcmludDogZGlzcGxheSA9PT0gMSB8fCBkaXNwbGF5ID09PSAyXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHByaW50OiBldmVudCA9PiB7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgICAgbm9QcmludDogIWV2ZW50LmRldGFpbC5wcmludFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBoaWRkZW46IGV2ZW50ID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGhpZGRlblxuICAgICAgICB9ID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gaGlkZGVuID8gXCJoaWRkZW5cIiA6IFwidmlzaWJsZVwiO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgIG5vUHJpbnQ6IGhpZGRlbixcbiAgICAgICAgICBub1ZpZXc6IGhpZGRlblxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBmb2N1czogZXZlbnQgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGV2ZW50LnRhcmdldC5mb2N1cyh7XG4gICAgICAgICAgcHJldmVudFNjcm9sbDogZmFsc2VcbiAgICAgICAgfSksIDApO1xuICAgICAgfSxcbiAgICAgIHVzZXJOYW1lOiBldmVudCA9PiB7XG4gICAgICAgIGV2ZW50LnRhcmdldC50aXRsZSA9IGV2ZW50LmRldGFpbC51c2VyTmFtZTtcbiAgICAgIH0sXG4gICAgICByZWFkb25seTogZXZlbnQgPT4ge1xuICAgICAgICBldmVudC50YXJnZXQuZGlzYWJsZWQgPSBldmVudC5kZXRhaWwucmVhZG9ubHk7XG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQoZXZlbnQudGFyZ2V0LCBldmVudC5kZXRhaWwucmVxdWlyZWQpO1xuICAgICAgfSxcbiAgICAgIGJnQ29sb3I6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0Q29sb3IoXCJiZ0NvbG9yXCIsIFwiYmFja2dyb3VuZENvbG9yXCIsIGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICBmaWxsQ29sb3I6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0Q29sb3IoXCJmaWxsQ29sb3JcIiwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIGZnQ29sb3I6IGV2ZW50ID0+IHtcbiAgICAgICAgc2V0Q29sb3IoXCJmZ0NvbG9yXCIsIFwiY29sb3JcIiwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIHRleHRDb2xvcjogZXZlbnQgPT4ge1xuICAgICAgICBzZXRDb2xvcihcInRleHRDb2xvclwiLCBcImNvbG9yXCIsIGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICBib3JkZXJDb2xvcjogZXZlbnQgPT4ge1xuICAgICAgICBzZXRDb2xvcihcImJvcmRlckNvbG9yXCIsIFwiYm9yZGVyQ29sb3JcIiwgZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIHN0cm9rZUNvbG9yOiBldmVudCA9PiB7XG4gICAgICAgIHNldENvbG9yKFwic3Ryb2tlQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgcm90YXRpb246IGV2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgYW5nbGUgPSBldmVudC5kZXRhaWwucm90YXRpb247XG4gICAgICAgIHRoaXMuc2V0Um90YXRpb24oYW5nbGUpO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgIHJvdGF0aW9uOiBhbmdsZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBfZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGFjdGlvbnMsIGpzRXZlbnQpIHtcbiAgICBjb25zdCBjb21tb25BY3Rpb25zID0gdGhpcy5fY29tbW9uQWN0aW9ucztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoanNFdmVudC5kZXRhaWwpKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBhY3Rpb25zW25hbWVdIHx8IGNvbW1vbkFjdGlvbnNbbmFtZV07XG4gICAgICBhY3Rpb24/Lihqc0V2ZW50KTtcbiAgICB9XG4gIH1cbiAgX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGVsZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlU2NyaXB0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0b3JlZERhdGEgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLmdldFJhd1ZhbHVlKHRoaXMuZGF0YS5pZCk7XG4gICAgaWYgKCFzdG9yZWREYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbW1vbkFjdGlvbnMgPSB0aGlzLl9jb21tb25BY3Rpb25zO1xuICAgIGZvciAoY29uc3QgW2FjdGlvbk5hbWUsIGRldGFpbF0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVkRGF0YSkpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGNvbW1vbkFjdGlvbnNbYWN0aW9uTmFtZV07XG4gICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50UHJveHkgPSB7XG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBbYWN0aW9uTmFtZV06IGRldGFpbFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGFyZ2V0OiBlbGVtZW50XG4gICAgICAgIH07XG4gICAgICAgIGFjdGlvbihldmVudFByb3h5KTtcbiAgICAgICAgZGVsZXRlIHN0b3JlZERhdGFbYWN0aW9uTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9jcmVhdGVRdWFkcmlsYXRlcmFscygpIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHF1YWRQb2ludHNcbiAgICB9ID0gdGhpcy5kYXRhO1xuICAgIGlmICghcXVhZFBvaW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbcmVjdEJsWCwgcmVjdEJsWSwgcmVjdFRyWCwgcmVjdFRyWV0gPSB0aGlzLmRhdGEucmVjdC5tYXAoeCA9PiBNYXRoLmZyb3VuZCh4KSk7XG4gICAgaWYgKHF1YWRQb2ludHMubGVuZ3RoID09PSA4KSB7XG4gICAgICBjb25zdCBbdHJYLCB0clksIGJsWCwgYmxZXSA9IHF1YWRQb2ludHMuc3ViYXJyYXkoMiwgNik7XG4gICAgICBpZiAocmVjdFRyWCA9PT0gdHJYICYmIHJlY3RUclkgPT09IHRyWSAmJiByZWN0QmxYID09PSBibFggJiYgcmVjdEJsWSA9PT0gYmxZKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy5jb250YWluZXI7XG4gICAgbGV0IHN2Z0J1ZmZlcjtcbiAgICBpZiAodGhpcy4jaGFzQm9yZGVyKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGJvcmRlckNvbG9yLFxuICAgICAgICBib3JkZXJXaWR0aFxuICAgICAgfSA9IHN0eWxlO1xuICAgICAgc3R5bGUuYm9yZGVyV2lkdGggPSAwO1xuICAgICAgc3ZnQnVmZmVyID0gW1widXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCxcIiwgYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiYCwgYCBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMSAxXCI+YCwgYDxnIGZpbGw9XCJ0cmFuc3BhcmVudFwiIHN0cm9rZT1cIiR7Ym9yZGVyQ29sb3J9XCIgc3Ryb2tlLXdpZHRoPVwiJHtib3JkZXJXaWR0aH1cIj5gXTtcbiAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoYXNCb3JkZXJcIik7XG4gICAgfVxuICAgIGNvbnN0IHdpZHRoID0gcmVjdFRyWCAtIHJlY3RCbFg7XG4gICAgY29uc3QgaGVpZ2h0ID0gcmVjdFRyWSAtIHJlY3RCbFk7XG4gICAgY29uc3Qge1xuICAgICAgc3ZnRmFjdG9yeVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IHN2ZyA9IHN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Z1wiKTtcbiAgICBzdmcuY2xhc3NMaXN0LmFkZChcInF1YWRyaWxhdGVyYWxzQ29udGFpbmVyXCIpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCAwKTtcbiAgICBzdmcuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIDApO1xuICAgIGNvbnN0IGRlZnMgPSBzdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIpO1xuICAgIHN2Zy5hcHBlbmQoZGVmcyk7XG4gICAgY29uc3QgY2xpcFBhdGggPSBzdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJjbGlwUGF0aFwiKTtcbiAgICBjb25zdCBpZCA9IGBjbGlwcGF0aF8ke3RoaXMuZGF0YS5pZH1gO1xuICAgIGNsaXBQYXRoLnNldEF0dHJpYnV0ZShcImlkXCIsIGlkKTtcbiAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGUoXCJjbGlwUGF0aFVuaXRzXCIsIFwib2JqZWN0Qm91bmRpbmdCb3hcIik7XG4gICAgZGVmcy5hcHBlbmQoY2xpcFBhdGgpO1xuICAgIGZvciAobGV0IGkgPSAyLCBpaSA9IHF1YWRQb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gOCkge1xuICAgICAgY29uc3QgdHJYID0gcXVhZFBvaW50c1tpXTtcbiAgICAgIGNvbnN0IHRyWSA9IHF1YWRQb2ludHNbaSArIDFdO1xuICAgICAgY29uc3QgYmxYID0gcXVhZFBvaW50c1tpICsgMl07XG4gICAgICBjb25zdCBibFkgPSBxdWFkUG9pbnRzW2kgKyAzXTtcbiAgICAgIGNvbnN0IHJlY3QgPSBzdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIpO1xuICAgICAgY29uc3QgeCA9IChibFggLSByZWN0QmxYKSAvIHdpZHRoO1xuICAgICAgY29uc3QgeSA9IChyZWN0VHJZIC0gdHJZKSAvIGhlaWdodDtcbiAgICAgIGNvbnN0IHJlY3RXaWR0aCA9ICh0clggLSBibFgpIC8gd2lkdGg7XG4gICAgICBjb25zdCByZWN0SGVpZ2h0ID0gKHRyWSAtIGJsWSkgLyBoZWlnaHQ7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgeCk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcInlcIiwgeSk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHJlY3RXaWR0aCk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCByZWN0SGVpZ2h0KTtcbiAgICAgIGNsaXBQYXRoLmFwcGVuZChyZWN0KTtcbiAgICAgIHN2Z0J1ZmZlcj8ucHVzaChgPHJlY3QgdmVjdG9yLWVmZmVjdD1cIm5vbi1zY2FsaW5nLXN0cm9rZVwiIHg9XCIke3h9XCIgeT1cIiR7eX1cIiB3aWR0aD1cIiR7cmVjdFdpZHRofVwiIGhlaWdodD1cIiR7cmVjdEhlaWdodH1cIi8+YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNoYXNCb3JkZXIpIHtcbiAgICAgIHN2Z0J1ZmZlci5wdXNoKGA8L2c+PC9zdmc+JylgKTtcbiAgICAgIHN0eWxlLmJhY2tncm91bmRJbWFnZSA9IHN2Z0J1ZmZlci5qb2luKFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcbiAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5jbGlwUGF0aCA9IGB1cmwoIyR7aWR9KWA7XG4gIH1cbiAgX2NyZWF0ZVBvcHVwKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGRhdGFcbiAgICB9ID0gdGhpcztcbiAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiLCBcImRpYWxvZ1wiKTtcbiAgICBjb25zdCBwb3B1cCA9IHRoaXMuI3BvcHVwRWxlbWVudCA9IG5ldyBQb3B1cEFubm90YXRpb25FbGVtZW50KHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29sb3I6IGRhdGEuY29sb3IsXG4gICAgICAgIHRpdGxlT2JqOiBkYXRhLnRpdGxlT2JqLFxuICAgICAgICBtb2RpZmljYXRpb25EYXRlOiBkYXRhLm1vZGlmaWNhdGlvbkRhdGUsXG4gICAgICAgIGNvbnRlbnRzT2JqOiBkYXRhLmNvbnRlbnRzT2JqLFxuICAgICAgICByaWNoVGV4dDogZGF0YS5yaWNoVGV4dCxcbiAgICAgICAgcGFyZW50UmVjdDogZGF0YS5yZWN0LFxuICAgICAgICBib3JkZXJTdHlsZTogMCxcbiAgICAgICAgaWQ6IGBwb3B1cF8ke2RhdGEuaWR9YCxcbiAgICAgICAgcm90YXRpb246IGRhdGEucm90YXRpb25cbiAgICAgIH0sXG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgZWxlbWVudHM6IFt0aGlzXVxuICAgIH0pO1xuICAgIHRoaXMucGFyZW50LmRpdi5hcHBlbmQocG9wdXAucmVuZGVyKCkpO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB1bnJlYWNoYWJsZShcIkFic3RyYWN0IG1ldGhvZCBgQW5ub3RhdGlvbkVsZW1lbnQucmVuZGVyYCBjYWxsZWRcIik7XG4gIH1cbiAgX2dldEVsZW1lbnRzQnlOYW1lKG5hbWUsIHNraXBJZCA9IG51bGwpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBbXTtcbiAgICBpZiAodGhpcy5fZmllbGRPYmplY3RzKSB7XG4gICAgICBjb25zdCBmaWVsZE9iaiA9IHRoaXMuX2ZpZWxkT2JqZWN0c1tuYW1lXTtcbiAgICAgIGlmIChmaWVsZE9iaikge1xuICAgICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgICBwYWdlLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIGV4cG9ydFZhbHVlc1xuICAgICAgICB9IG9mIGZpZWxkT2JqKSB7XG4gICAgICAgICAgaWYgKHBhZ2UgPT09IC0xKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlkID09PSBza2lwSWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleHBvcnRWYWx1ZSA9IHR5cGVvZiBleHBvcnRWYWx1ZXMgPT09IFwic3RyaW5nXCIgPyBleHBvcnRWYWx1ZXMgOiBudWxsO1xuICAgICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1lbGVtZW50LWlkPVwiJHtpZH1cIl1gKTtcbiAgICAgICAgICBpZiAoZG9tRWxlbWVudCAmJiAhR2V0RWxlbWVudHNCeU5hbWVTZXQuaGFzKGRvbUVsZW1lbnQpKSB7XG4gICAgICAgICAgICB3YXJuKGBfZ2V0RWxlbWVudHNCeU5hbWUgLSBlbGVtZW50IG5vdCBhbGxvd2VkOiAke2lkfWApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXhwb3J0VmFsdWUsXG4gICAgICAgICAgICBkb21FbGVtZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWVsZHM7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZG9tRWxlbWVudCBvZiBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShuYW1lKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBleHBvcnRWYWx1ZVxuICAgICAgfSA9IGRvbUVsZW1lbnQ7XG4gICAgICBjb25zdCBpZCA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIpO1xuICAgICAgaWYgKGlkID09PSBza2lwSWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIUdldEVsZW1lbnRzQnlOYW1lU2V0Lmhhcyhkb21FbGVtZW50KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZpZWxkcy5wdXNoKHtcbiAgICAgICAgaWQsXG4gICAgICAgIGV4cG9ydFZhbHVlLFxuICAgICAgICBkb21FbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkcztcbiAgfVxuICBzaG93KCkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5lcikge1xuICAgICAgdGhpcy5jb250YWluZXIuaGlkZGVuID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucG9wdXA/Lm1heWJlU2hvdygpO1xuICB9XG4gIGhpZGUoKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5oaWRkZW4gPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnBvcHVwPy5mb3JjZUhpZGUoKTtcbiAgfVxuICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gdGhpcy5nZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHJpZ2dlcnMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdHJpZ2dlcnMpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlcnMuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgfVxuICB9XG4gIGdldCBfaXNFZGl0YWJsZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgX2VkaXRPbkRvdWJsZUNsaWNrKCkge1xuICAgIGlmICghdGhpcy5faXNFZGl0YWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBhbm5vdGF0aW9uRWRpdG9yVHlwZTogbW9kZSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgaWQ6IGVkaXRJZFxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcInN3aXRjaGFubm90YXRpb25lZGl0b3Jtb2RlXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBtb2RlLFxuICAgICAgICBlZGl0SWRcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5jbGFzcyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMsIG9wdGlvbnMgPSBudWxsKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiAhIW9wdGlvbnM/Lmlnbm9yZUJvcmRlcixcbiAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5pc1Rvb2x0aXBPbmx5ID0gcGFyYW1ldGVycy5kYXRhLmlzVG9vbHRpcE9ubHk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGEsXG4gICAgICBsaW5rU2VydmljZVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICBsaW5rLnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBkYXRhLmlkKTtcbiAgICBsZXQgaXNCb3VuZCA9IGZhbHNlO1xuICAgIGlmIChkYXRhLnVybCkge1xuICAgICAgbGlua1NlcnZpY2UuYWRkTGlua0F0dHJpYnV0ZXMobGluaywgZGF0YS51cmwsIGRhdGEubmV3V2luZG93KTtcbiAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5hY3Rpb24pIHtcbiAgICAgIHRoaXMuX2JpbmROYW1lZEFjdGlvbihsaW5rLCBkYXRhLmFjdGlvbik7XG4gICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEuYXR0YWNobWVudCkge1xuICAgICAgdGhpcy4jYmluZEF0dGFjaG1lbnQobGluaywgZGF0YS5hdHRhY2htZW50LCBkYXRhLmF0dGFjaG1lbnREZXN0KTtcbiAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5zZXRPQ0dTdGF0ZSkge1xuICAgICAgdGhpcy4jYmluZFNldE9DR1N0YXRlKGxpbmssIGRhdGEuc2V0T0NHU3RhdGUpO1xuICAgICAgaXNCb3VuZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkYXRhLmRlc3QpIHtcbiAgICAgIHRoaXMuX2JpbmRMaW5rKGxpbmssIGRhdGEuZGVzdCk7XG4gICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGEuYWN0aW9ucyAmJiAoZGF0YS5hY3Rpb25zLkFjdGlvbiB8fCBkYXRhLmFjdGlvbnNbXCJNb3VzZSBVcFwiXSB8fCBkYXRhLmFjdGlvbnNbXCJNb3VzZSBEb3duXCJdKSAmJiB0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICB0aGlzLl9iaW5kSlNBY3Rpb24obGluaywgZGF0YSk7XG4gICAgICAgIGlzQm91bmQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEucmVzZXRGb3JtKSB7XG4gICAgICAgIHRoaXMuX2JpbmRSZXNldEZvcm1BY3Rpb24obGluaywgZGF0YS5yZXNldEZvcm0pO1xuICAgICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Rvb2x0aXBPbmx5ICYmICFpc0JvdW5kKSB7XG4gICAgICAgIHRoaXMuX2JpbmRMaW5rKGxpbmssIFwiXCIpO1xuICAgICAgICBpc0JvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImxpbmtBbm5vdGF0aW9uXCIpO1xuICAgIGlmIChpc0JvdW5kKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQobGluayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICAjc2V0SW50ZXJuYWxMaW5rKCkge1xuICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtaW50ZXJuYWwtbGlua1wiLCBcIlwiKTtcbiAgfVxuICBfYmluZExpbmsobGluaywgZGVzdGluYXRpb24pIHtcbiAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldERlc3RpbmF0aW9uSGFzaChkZXN0aW5hdGlvbik7XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKGRlc3RpbmF0aW9uKSB7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UuZ29Ub0Rlc3RpbmF0aW9uKGRlc3RpbmF0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIGlmIChkZXN0aW5hdGlvbiB8fCBkZXN0aW5hdGlvbiA9PT0gXCJcIikge1xuICAgICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG4gICAgfVxuICB9XG4gIF9iaW5kTmFtZWRBY3Rpb24obGluaywgYWN0aW9uKSB7XG4gICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5saW5rU2VydmljZS5leGVjdXRlTmFtZWRBY3Rpb24oYWN0aW9uKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuICB9XG4gICNiaW5kQXR0YWNobWVudChsaW5rLCBhdHRhY2htZW50LCBkZXN0ID0gbnVsbCkge1xuICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgIGlmIChhdHRhY2htZW50LmRlc2NyaXB0aW9uKSB7XG4gICAgICBsaW5rLnRpdGxlID0gYXR0YWNobWVudC5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5kb3dubG9hZE1hbmFnZXI/Lm9wZW5PckRvd25sb2FkRGF0YShhdHRhY2htZW50LmNvbnRlbnQsIGF0dGFjaG1lbnQuZmlsZW5hbWUsIGRlc3QpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG4gIH1cbiAgI2JpbmRTZXRPQ0dTdGF0ZShsaW5rLCBhY3Rpb24pIHtcbiAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcbiAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV4ZWN1dGVTZXRPQ0dTdGF0ZShhY3Rpb24pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG4gIH1cbiAgX2JpbmRKU0FjdGlvbihsaW5rLCBkYXRhKSB7XG4gICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcChbW1wiQWN0aW9uXCIsIFwib25jbGlja1wiXSwgW1wiTW91c2UgVXBcIiwgXCJvbm1vdXNldXBcIl0sIFtcIk1vdXNlIERvd25cIiwgXCJvbm1vdXNlZG93blwiXV0pO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkYXRhLmFjdGlvbnMpKSB7XG4gICAgICBjb25zdCBqc05hbWUgPSBtYXAuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCFqc05hbWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsaW5rW2pzTmFtZV0gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICAgICAgICBuYW1lXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFsaW5rLm9uY2xpY2spIHtcbiAgICAgIGxpbmsub25jbGljayA9ICgpID0+IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcbiAgfVxuICBfYmluZFJlc2V0Rm9ybUFjdGlvbihsaW5rLCByZXNldEZvcm0pIHtcbiAgICBjb25zdCBvdGhlckNsaWNrQWN0aW9uID0gbGluay5vbmNsaWNrO1xuICAgIGlmICghb3RoZXJDbGlja0FjdGlvbikge1xuICAgICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgfVxuICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuICAgIGlmICghdGhpcy5fZmllbGRPYmplY3RzKSB7XG4gICAgICB3YXJuKGBfYmluZFJlc2V0Rm9ybUFjdGlvbiAtIFwicmVzZXRGb3JtXCIgYWN0aW9uIG5vdCBzdXBwb3J0ZWQsIGAgKyBcImVuc3VyZSB0aGF0IHRoZSBgZmllbGRPYmplY3RzYCBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQuXCIpO1xuICAgICAgaWYgKCFvdGhlckNsaWNrQWN0aW9uKSB7XG4gICAgICAgIGxpbmsub25jbGljayA9ICgpID0+IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICBvdGhlckNsaWNrQWN0aW9uPy4oKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZmllbGRzOiByZXNldEZvcm1GaWVsZHMsXG4gICAgICAgIHJlZnM6IHJlc2V0Rm9ybVJlZnMsXG4gICAgICAgIGluY2x1ZGVcbiAgICAgIH0gPSByZXNldEZvcm07XG4gICAgICBjb25zdCBhbGxGaWVsZHMgPSBbXTtcbiAgICAgIGlmIChyZXNldEZvcm1GaWVsZHMubGVuZ3RoICE9PSAwIHx8IHJlc2V0Rm9ybVJlZnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkSWRzID0gbmV3IFNldChyZXNldEZvcm1SZWZzKTtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZE5hbWUgb2YgcmVzZXRGb3JtRmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5fZmllbGRPYmplY3RzW2ZpZWxkTmFtZV0gfHwgW107XG4gICAgICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgICAgICBpZFxuICAgICAgICAgIH0gb2YgZmllbGRzKSB7XG4gICAgICAgICAgICBmaWVsZElkcy5hZGQoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkcyBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2ZpZWxkT2JqZWN0cykpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkSWRzLmhhcyhmaWVsZC5pZCkgPT09IGluY2x1ZGUpIHtcbiAgICAgICAgICAgICAgYWxsRmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZHMgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9maWVsZE9iamVjdHMpKSB7XG4gICAgICAgICAgYWxsRmllbGRzLnB1c2goLi4uZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgICBjb25zdCBhbGxJZHMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgYWxsRmllbGRzKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBpZFxuICAgICAgICB9ID0gZmllbGQ7XG4gICAgICAgIGFsbElkcy5wdXNoKGlkKTtcbiAgICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICBjYXNlIFwicmFkaW9idXR0b25cIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWUgPT09IGZpZWxkLmV4cG9ydFZhbHVlcztcbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiY29tYm9ib3hcIjpcbiAgICAgICAgICBjYXNlIFwibGlzdGJveFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtZWxlbWVudC1pZD1cIiR7aWR9XCJdYCk7XG4gICAgICAgIGlmICghZG9tRWxlbWVudCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCFHZXRFbGVtZW50c0J5TmFtZVNldC5oYXMoZG9tRWxlbWVudCkpIHtcbiAgICAgICAgICB3YXJuKGBfYmluZFJlc2V0Rm9ybUFjdGlvbiAtIGVsZW1lbnQgbm90IGFsbG93ZWQ6ICR7aWR9YCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInJlc2V0Zm9ybVwiKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcpIHtcbiAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBpZDogXCJhcHBcIixcbiAgICAgICAgICAgIGlkczogYWxsSWRzLFxuICAgICAgICAgICAgbmFtZTogXCJSZXNldEZvcm1cIlxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfVxufVxuY2xhc3MgVGV4dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ0ZXh0QW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgaW1hZ2Uuc3JjID0gdGhpcy5pbWFnZVJlc291cmNlc1BhdGggKyBcImFubm90YXRpb24tXCIgKyB0aGlzLmRhdGEubmFtZS50b0xvd2VyQ2FzZSgpICsgXCIuc3ZnXCI7XG4gICAgaW1hZ2Uuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtdGV4dC1hbm5vdGF0aW9uLXR5cGVcIik7XG4gICAgaW1hZ2Uuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWFyZ3NcIiwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgdHlwZTogdGhpcy5kYXRhLm5hbWVcbiAgICB9KSk7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpbWFnZSk7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBzaG93RWxlbWVudEFuZEhpZGVDYW52YXMoZWxlbWVudCkge1xuICAgIGlmICh0aGlzLmRhdGEuaGFzT3duQ2FudmFzKSB7XG4gICAgICBpZiAoZWxlbWVudC5wcmV2aW91c1NpYmxpbmc/Lm5vZGVOYW1lID09PSBcIkNBTlZBU1wiKSB7XG4gICAgICAgIGVsZW1lbnQucHJldmlvdXNTaWJsaW5nLmhpZGRlbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBlbGVtZW50LmhpZGRlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBfZ2V0S2V5TW9kaWZpZXIoZXZlbnQpIHtcbiAgICByZXR1cm4gdXRpbF9GZWF0dXJlVGVzdC5wbGF0Zm9ybS5pc01hYyA/IGV2ZW50Lm1ldGFLZXkgOiBldmVudC5jdHJsS2V5O1xuICB9XG4gIF9zZXRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGVsZW1lbnREYXRhLCBiYXNlTmFtZSwgZXZlbnROYW1lLCB2YWx1ZUdldHRlcikge1xuICAgIGlmIChiYXNlTmFtZS5pbmNsdWRlcyhcIm1vdXNlXCIpKSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYmFzZU5hbWUsIGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICBpZDogdGhpcy5kYXRhLmlkLFxuICAgICAgICAgICAgbmFtZTogZXZlbnROYW1lLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlR2V0dGVyKGV2ZW50KSxcbiAgICAgICAgICAgIHNoaWZ0OiBldmVudC5zaGlmdEtleSxcbiAgICAgICAgICAgIG1vZGlmaWVyOiB0aGlzLl9nZXRLZXlNb2RpZmllcihldmVudClcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihiYXNlTmFtZSwgZXZlbnQgPT4ge1xuICAgICAgICBpZiAoYmFzZU5hbWUgPT09IFwiYmx1clwiKSB7XG4gICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS5mb2N1c2VkIHx8ICFldmVudC5yZWxhdGVkVGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnREYXRhLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChiYXNlTmFtZSA9PT0gXCJmb2N1c1wiKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmZvY3VzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudERhdGEuZm9jdXNlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF2YWx1ZUdldHRlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICBuYW1lOiBldmVudE5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVHZXR0ZXIoZXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBfc2V0RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgZWxlbWVudERhdGEsIG5hbWVzLCBnZXR0ZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtiYXNlTmFtZSwgZXZlbnROYW1lXSBvZiBuYW1lcykge1xuICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gXCJBY3Rpb25cIiB8fCB0aGlzLmRhdGEuYWN0aW9ucz8uW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gXCJGb2N1c1wiIHx8IGV2ZW50TmFtZSA9PT0gXCJCbHVyXCIpIHtcbiAgICAgICAgICBlbGVtZW50RGF0YSB8fD0ge1xuICAgICAgICAgICAgZm9jdXNlZDogZmFsc2VcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZWxlbWVudERhdGEsIGJhc2VOYW1lLCBldmVudE5hbWUsIGdldHRlcik7XG4gICAgICAgIGlmIChldmVudE5hbWUgPT09IFwiRm9jdXNcIiAmJiAhdGhpcy5kYXRhLmFjdGlvbnM/LkJsdXIpIHtcbiAgICAgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGVsZW1lbnREYXRhLCBcImJsdXJcIiwgXCJCbHVyXCIsIG51bGwpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50TmFtZSA9PT0gXCJCbHVyXCIgJiYgIXRoaXMuZGF0YS5hY3Rpb25zPy5Gb2N1cykge1xuICAgICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZWxlbWVudERhdGEsIFwiZm9jdXNcIiwgXCJGb2N1c1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBfc2V0QmFja2dyb3VuZENvbG9yKGVsZW1lbnQpIHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZGF0YS5iYWNrZ3JvdW5kQ29sb3IgfHwgbnVsbDtcbiAgICBlbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yID09PSBudWxsID8gXCJ0cmFuc3BhcmVudFwiIDogVXRpbC5tYWtlSGV4Q29sb3IoY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSk7XG4gIH1cbiAgX3NldFRleHRTdHlsZShlbGVtZW50KSB7XG4gICAgY29uc3QgVEVYVF9BTElHTk1FTlQgPSBbXCJsZWZ0XCIsIFwiY2VudGVyXCIsIFwicmlnaHRcIl07XG4gICAgY29uc3Qge1xuICAgICAgZm9udENvbG9yXG4gICAgfSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE7XG4gICAgY29uc3QgZm9udFNpemUgPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnRTaXplIHx8IGFubm90YXRpb25fbGF5ZXJfREVGQVVMVF9GT05UX1NJWkU7XG4gICAgY29uc3Qgc3R5bGUgPSBlbGVtZW50LnN0eWxlO1xuICAgIGxldCBjb21wdXRlZEZvbnRTaXplO1xuICAgIGNvbnN0IEJPUkRFUl9TSVpFID0gMjtcbiAgICBjb25zdCByb3VuZFRvT25lRGVjaW1hbCA9IHggPT4gTWF0aC5yb3VuZCgxMCAqIHgpIC8gMTA7XG4gICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0gLSBCT1JERVJfU0laRSk7XG4gICAgICBjb25zdCBudW1iZXJPZkxpbmVzID0gTWF0aC5yb3VuZChoZWlnaHQgLyAoTElORV9GQUNUT1IgKiBmb250U2l6ZSkpIHx8IDE7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gaGVpZ2h0IC8gbnVtYmVyT2ZMaW5lcztcbiAgICAgIGNvbXB1dGVkRm9udFNpemUgPSBNYXRoLm1pbihmb250U2l6ZSwgcm91bmRUb09uZURlY2ltYWwobGluZUhlaWdodCAvIExJTkVfRkFDVE9SKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0gLSBCT1JERVJfU0laRSk7XG4gICAgICBjb21wdXRlZEZvbnRTaXplID0gTWF0aC5taW4oZm9udFNpemUsIHJvdW5kVG9PbmVEZWNpbWFsKGhlaWdodCAvIExJTkVfRkFDVE9SKSk7XG4gICAgfVxuICAgIHN0eWxlLmZvbnRTaXplID0gYGNhbGMoJHtjb21wdXRlZEZvbnRTaXplfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO1xuICAgIHN0eWxlLmNvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IoZm9udENvbG9yWzBdLCBmb250Q29sb3JbMV0sIGZvbnRDb2xvclsyXSk7XG4gICAgaWYgKHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50ICE9PSBudWxsKSB7XG4gICAgICBzdHlsZS50ZXh0QWxpZ24gPSBURVhUX0FMSUdOTUVOVFt0aGlzLmRhdGEudGV4dEFsaWdubWVudF07XG4gICAgfVxuICB9XG4gIF9zZXRSZXF1aXJlZChlbGVtZW50LCBpc1JlcXVpcmVkKSB7XG4gICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIiwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwicmVxdWlyZWRcIik7XG4gICAgfVxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1yZXF1aXJlZFwiLCBpc1JlcXVpcmVkKTtcbiAgfVxufVxuY2xhc3MgVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgaXNSZW5kZXJhYmxlID0gcGFyYW1ldGVycy5yZW5kZXJGb3JtcyB8fCBwYXJhbWV0ZXJzLmRhdGEuaGFzT3duQ2FudmFzIHx8ICFwYXJhbWV0ZXJzLmRhdGEuaGFzQXBwZWFyYW5jZSAmJiAhIXBhcmFtZXRlcnMuZGF0YS5maWVsZFZhbHVlO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZVxuICAgIH0pO1xuICB9XG4gIHNldFByb3BlcnR5T25TaWJsaW5ncyhiYXNlLCBrZXksIHZhbHVlLCBrZXlJblN0b3JhZ2UpIHtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoYmFzZS5uYW1lLCBiYXNlLmlkKSkge1xuICAgICAgaWYgKGVsZW1lbnQuZG9tRWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmRvbUVsZW1lbnRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShlbGVtZW50LmlkLCB7XG4gICAgICAgIFtrZXlJblN0b3JhZ2VdOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcbiAgICBjb25zdCBpZCA9IHRoaXMuZGF0YS5pZDtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dFdpZGdldEFubm90YXRpb25cIik7XG4gICAgbGV0IGVsZW1lbnQgPSBudWxsO1xuICAgIGlmICh0aGlzLnJlbmRlckZvcm1zKSB7XG4gICAgICBjb25zdCBzdG9yZWREYXRhID0gc3RvcmFnZS5nZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWVcbiAgICAgIH0pO1xuICAgICAgbGV0IHRleHRDb250ZW50ID0gc3RvcmVkRGF0YS52YWx1ZSB8fCBcIlwiO1xuICAgICAgY29uc3QgbWF4TGVuID0gc3RvcmFnZS5nZXRWYWx1ZShpZCwge1xuICAgICAgICBjaGFyTGltaXQ6IHRoaXMuZGF0YS5tYXhMZW5cbiAgICAgIH0pLmNoYXJMaW1pdDtcbiAgICAgIGlmIChtYXhMZW4gJiYgdGV4dENvbnRlbnQubGVuZ3RoID4gbWF4TGVuKSB7XG4gICAgICAgIHRleHRDb250ZW50ID0gdGV4dENvbnRlbnQuc2xpY2UoMCwgbWF4TGVuKTtcbiAgICAgIH1cbiAgICAgIGxldCBmaWVsZEZvcm1hdHRlZFZhbHVlcyA9IHN0b3JlZERhdGEuZm9ybWF0dGVkVmFsdWUgfHwgdGhpcy5kYXRhLnRleHRDb250ZW50Py5qb2luKFwiXFxuXCIpIHx8IG51bGw7XG4gICAgICBpZiAoZmllbGRGb3JtYXR0ZWRWYWx1ZXMgJiYgdGhpcy5kYXRhLmNvbWIpIHtcbiAgICAgICAgZmllbGRGb3JtYXR0ZWRWYWx1ZXMgPSBmaWVsZEZvcm1hdHRlZFZhbHVlcy5yZXBsYWNlQWxsKC9cXHMrL2csIFwiXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudERhdGEgPSB7XG4gICAgICAgIHVzZXJWYWx1ZTogdGV4dENvbnRlbnQsXG4gICAgICAgIGZvcm1hdHRlZFZhbHVlOiBmaWVsZEZvcm1hdHRlZFZhbHVlcyxcbiAgICAgICAgbGFzdENvbW1pdHRlZFZhbHVlOiBudWxsLFxuICAgICAgICBjb21taXRLZXk6IDEsXG4gICAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHtcbiAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcbiAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IGZpZWxkRm9ybWF0dGVkVmFsdWVzID8/IHRleHRDb250ZW50O1xuICAgICAgICBpZiAodGhpcy5kYXRhLmRvTm90U2Nyb2xsKSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBcImhpZGRlblwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBlbGVtZW50LnR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBmaWVsZEZvcm1hdHRlZFZhbHVlcyA/PyB0ZXh0Q29udGVudCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZG9Ob3RTY3JvbGwpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93WCA9IFwiaGlkZGVuXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRhdGEuaGFzT3duQ2FudmFzKSB7XG4gICAgICAgIGVsZW1lbnQuaGlkZGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIEdldEVsZW1lbnRzQnlOYW1lU2V0LmFkZChlbGVtZW50KTtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGlkKTtcbiAgICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgICBlbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgICAgZWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuICAgICAgdGhpcy5fc2V0UmVxdWlyZWQoZWxlbWVudCwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgIGlmIChtYXhMZW4pIHtcbiAgICAgICAgZWxlbWVudC5tYXhMZW5ndGggPSBtYXhMZW47XG4gICAgICB9XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG4gICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5T25TaWJsaW5ncyhlbGVtZW50LCBcInZhbHVlXCIsIGV2ZW50LnRhcmdldC52YWx1ZSwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgZWxlbWVudERhdGEuZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgfSk7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgPz8gXCJcIjtcbiAgICAgICAgZWxlbWVudC52YWx1ZSA9IGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgZWxlbWVudERhdGEuZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgfSk7XG4gICAgICBsZXQgYmx1ckxpc3RlbmVyID0gZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZm9ybWF0dGVkVmFsdWVcbiAgICAgICAgfSA9IGVsZW1lbnREYXRhO1xuICAgICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgIT09IG51bGwgJiYgZm9ybWF0dGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5mb2N1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHRhcmdldFxuICAgICAgICAgIH0gPSBldmVudDtcbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudXNlclZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSA9IHRhcmdldC52YWx1ZTtcbiAgICAgICAgICBlbGVtZW50RGF0YS5jb21taXRLZXkgPSAxO1xuICAgICAgICAgIGlmICghdGhpcy5kYXRhLmFjdGlvbnM/LkZvY3VzKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dFbGVtZW50QW5kSGlkZUNhbnZhcyhqc0V2ZW50LnRhcmdldCk7XG4gICAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICAgIHZhbHVlKGV2ZW50KSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IGV2ZW50LmRldGFpbC52YWx1ZSA/PyBcIlwiO1xuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnREYXRhLnVzZXJWYWx1ZS50b1N0cmluZygpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUoZXZlbnQpIHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlXG4gICAgICAgICAgICAgIH0gPSBldmVudC5kZXRhaWw7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLmZvcm1hdHRlZFZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICAgICAgICAgIGlmIChmb3JtYXR0ZWRWYWx1ZSAhPT0gbnVsbCAmJiBmb3JtYXR0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LnRhcmdldCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWxSYW5nZShldmVudCkge1xuICAgICAgICAgICAgICBldmVudC50YXJnZXQuc2V0U2VsZWN0aW9uUmFuZ2UoLi4uZXZlbnQuZGV0YWlsLnNlbFJhbmdlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGFyTGltaXQ6IGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGNoYXJMaW1pdFxuICAgICAgICAgICAgICB9ID0gZXZlbnQuZGV0YWlsO1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgICAgIH0gPSBldmVudDtcbiAgICAgICAgICAgICAgaWYgKGNoYXJMaW1pdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIiwgY2hhckxpbWl0KTtcbiAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZWxlbWVudERhdGEudXNlclZhbHVlO1xuICAgICAgICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA8PSBjaGFyTGltaXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBjaGFyTGltaXQpO1xuICAgICAgICAgICAgICB0YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgd2lsbENvbW1pdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGNvbW1pdEtleTogMSxcbiAgICAgICAgICAgICAgICAgIHNlbFN0YXJ0OiB0YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgICBzZWxFbmQ6IHRhcmdldC5zZWxlY3Rpb25FbmRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGFjdGlvbnMsIGpzRXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBldmVudCA9PiB7XG4gICAgICAgICAgZWxlbWVudERhdGEuY29tbWl0S2V5ID0gMTtcbiAgICAgICAgICBsZXQgY29tbWl0S2V5ID0gLTE7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgY29tbWl0S2V5ID0gMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiICYmICF0aGlzLmRhdGEubXVsdGlMaW5lKSB7XG4gICAgICAgICAgICBjb21taXRLZXkgPSAyO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIlRhYlwiKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5jb21taXRLZXkgPSAzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29tbWl0S2V5ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgZWxlbWVudERhdGEudXNlclZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIHdpbGxDb21taXQ6IHRydWUsXG4gICAgICAgICAgICAgIGNvbW1pdEtleSxcbiAgICAgICAgICAgICAgc2VsU3RhcnQ6IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgc2VsRW5kOiBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBfYmx1ckxpc3RlbmVyID0gYmx1ckxpc3RlbmVyO1xuICAgICAgICBibHVyTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLmZvY3VzZWQgfHwgIWV2ZW50LnJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuYWN0aW9ucz8uQmx1cikge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgZWxlbWVudERhdGEudXNlclZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbW1pdEtleTogZWxlbWVudERhdGEuY29tbWl0S2V5LFxuICAgICAgICAgICAgICAgIHNlbFN0YXJ0OiBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgc2VsRW5kOiBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfYmx1ckxpc3RlbmVyKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuYWN0aW9ucz8uS2V5c3Ryb2tlKSB7XG4gICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICAgICAgZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgICB9ID0gZXZlbnQ7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgc2VsZWN0aW9uRW5kXG4gICAgICAgICAgICB9ID0gdGFyZ2V0O1xuICAgICAgICAgICAgbGV0IHNlbFN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgIHNlbEVuZCA9IHNlbGVjdGlvbkVuZDtcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVXb3JkQmFja3dhcmRcIjpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHZhbHVlLnN1YnN0cmluZygwLCBzZWxlY3Rpb25TdGFydCkubWF0Y2goL1xcdypbXlxcd10qJC8pO1xuICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbFN0YXJ0IC09IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5zdWJzdHJpbmcoc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9eW15cXHddKlxcdyovKTtcbiAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxFbmQgKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCI6XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID09PSBzZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgICAgICAgICAgIHNlbFN0YXJ0IC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlQ29udGVudEZvcndhcmRcIjpcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPT09IHNlbGVjdGlvbkVuZCkge1xuICAgICAgICAgICAgICAgICAgc2VsRW5kICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICBjaGFuZ2U6IGRhdGEgfHwgXCJcIixcbiAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWxTdGFydCxcbiAgICAgICAgICAgICAgICBzZWxFbmRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgZWxlbWVudERhdGEsIFtbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChibHVyTGlzdGVuZXIpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBibHVyTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGF0YS5jb21iKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkV2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdO1xuICAgICAgICBjb25zdCBjb21iV2lkdGggPSBmaWVsZFdpZHRoIC8gbWF4TGVuO1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJjb21iXCIpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLmxldHRlclNwYWNpbmcgPSBgY2FsYygke2NvbWJXaWR0aH1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikgLSAxY2gpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5kYXRhLmZpZWxkVmFsdWU7XG4gICAgICBlbGVtZW50LnN0eWxlLnZlcnRpY2FsQWxpZ24gPSBcIm1pZGRsZVwiO1xuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJ0YWJsZS1jZWxsXCI7XG4gICAgICBpZiAodGhpcy5kYXRhLmhhc093bkNhbnZhcykge1xuICAgICAgICBlbGVtZW50LmhpZGRlbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3NldFRleHRTdHlsZShlbGVtZW50KTtcbiAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgU2lnbmF0dXJlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6ICEhcGFyYW1ldGVycy5kYXRhLmhhc093bkNhbnZhc1xuICAgIH0pO1xuICB9XG59XG5jbGFzcyBDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3QgaWQgPSBkYXRhLmlkO1xuICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgIHZhbHVlOiBkYXRhLmV4cG9ydFZhbHVlID09PSBkYXRhLmZpZWxkVmFsdWVcbiAgICB9KS52YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlICE9PSBcIk9mZlwiO1xuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uXCIsIFwiY2hlY2tCb3hcIik7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBHZXRFbGVtZW50c0J5TmFtZVNldC5hZGQoZWxlbWVudCk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgaWQpO1xuICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBkYXRhLnJlYWRPbmx5O1xuICAgIHRoaXMuX3NldFJlcXVpcmVkKGVsZW1lbnQsIHRoaXMuZGF0YS5yZXF1aXJlZCk7XG4gICAgZWxlbWVudC50eXBlID0gXCJjaGVja2JveFwiO1xuICAgIGVsZW1lbnQubmFtZSA9IGRhdGEuZmllbGROYW1lO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHRydWUpO1xuICAgIH1cbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImV4cG9ydFZhbHVlXCIsIGRhdGEuZXhwb3J0VmFsdWUpO1xuICAgIGVsZW1lbnQudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZXZlbnQgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lLFxuICAgICAgICBjaGVja2VkXG4gICAgICB9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgZm9yIChjb25zdCBjaGVja2JveCBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShuYW1lLCBpZCkpIHtcbiAgICAgICAgY29uc3QgY3VyQ2hlY2tlZCA9IGNoZWNrZWQgJiYgY2hlY2tib3guZXhwb3J0VmFsdWUgPT09IGRhdGEuZXhwb3J0VmFsdWU7XG4gICAgICAgIGlmIChjaGVja2JveC5kb21FbGVtZW50KSB7XG4gICAgICAgICAgY2hlY2tib3guZG9tRWxlbWVudC5jaGVja2VkID0gY3VyQ2hlY2tlZDtcbiAgICAgICAgfVxuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGNoZWNrYm94LmlkLCB7XG4gICAgICAgICAgdmFsdWU6IGN1ckNoZWNrZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgIHZhbHVlOiBjaGVja2VkXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSB8fCBcIk9mZlwiO1xuICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWQgPSBkZWZhdWx0VmFsdWUgPT09IGRhdGEuZXhwb3J0VmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICB2YWx1ZShldmVudCkge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWQgPSBldmVudC5kZXRhaWwudmFsdWUgIT09IFwiT2ZmXCI7XG4gICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBldmVudC50YXJnZXQuY2hlY2tlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIG51bGwsIFtbXCJjaGFuZ2VcIiwgXCJWYWxpZGF0ZVwiXSwgW1wiY2hhbmdlXCIsIFwiQWN0aW9uXCJdLCBbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogcGFyYW1ldGVycy5yZW5kZXJGb3Jtc1xuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvblwiLCBcInJhZGlvQnV0dG9uXCIpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3QgaWQgPSBkYXRhLmlkO1xuICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgIHZhbHVlOiBkYXRhLmZpZWxkVmFsdWUgPT09IGRhdGEuYnV0dG9uVmFsdWVcbiAgICB9KS52YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlICE9PSBkYXRhLmJ1dHRvblZhbHVlO1xuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgZm9yIChjb25zdCByYWRpbyBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShkYXRhLmZpZWxkTmFtZSwgaWQpKSB7XG4gICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUocmFkaW8uaWQsIHtcbiAgICAgICAgICB2YWx1ZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgR2V0RWxlbWVudHNCeU5hbWVTZXQuYWRkKGVsZW1lbnQpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGlkKTtcbiAgICBlbGVtZW50LmRpc2FibGVkID0gZGF0YS5yZWFkT25seTtcbiAgICB0aGlzLl9zZXRSZXF1aXJlZChlbGVtZW50LCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuICAgIGVsZW1lbnQudHlwZSA9IFwicmFkaW9cIjtcbiAgICBlbGVtZW50Lm5hbWUgPSBkYXRhLmZpZWxkTmFtZTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB0cnVlKTtcbiAgICB9XG4gICAgZWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBldmVudCA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNoZWNrZWRcbiAgICAgIH0gPSBldmVudC50YXJnZXQ7XG4gICAgICBmb3IgKGNvbnN0IHJhZGlvIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKG5hbWUsIGlkKSkge1xuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKHJhZGlvLmlkLCB7XG4gICAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICB2YWx1ZTogY2hlY2tlZFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwicmVzZXRmb3JtXCIsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRhdGEuZGVmYXVsdEZpZWxkVmFsdWU7XG4gICAgICBldmVudC50YXJnZXQuY2hlY2tlZCA9IGRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0VmFsdWUgPT09IGRhdGEuYnV0dG9uVmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG4gICAgICBjb25zdCBwZGZCdXR0b25WYWx1ZSA9IGRhdGEuYnV0dG9uVmFsdWU7XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICB2YWx1ZTogZXZlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHBkZkJ1dHRvblZhbHVlID09PSBldmVudC5kZXRhaWwudmFsdWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJhZGlvIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKGV2ZW50LnRhcmdldC5uYW1lKSkge1xuICAgICAgICAgICAgICBjb25zdCBjdXJDaGVja2VkID0gY2hlY2tlZCAmJiByYWRpby5pZCA9PT0gaWQ7XG4gICAgICAgICAgICAgIGlmIChyYWRpby5kb21FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmFkaW8uZG9tRWxlbWVudC5jaGVja2VkID0gY3VyQ2hlY2tlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKHJhZGlvLmlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGN1ckNoZWNrZWRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIG51bGwsIFtbXCJjaGFuZ2VcIiwgXCJWYWxpZGF0ZVwiXSwgW1wiY2hhbmdlXCIsIFwiQWN0aW9uXCJdLCBbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgTGlua0Fubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlnbm9yZUJvcmRlcjogcGFyYW1ldGVycy5kYXRhLmhhc0FwcGVhcmFuY2VcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gc3VwZXIucmVuZGVyKCk7XG4gICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uXCIsIFwicHVzaEJ1dHRvblwiKTtcbiAgICBjb25zdCBsaW5rRWxlbWVudCA9IGNvbnRhaW5lci5sYXN0Q2hpbGQ7XG4gICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zICYmIGxpbmtFbGVtZW50KSB7XG4gICAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhsaW5rRWxlbWVudCk7XG4gICAgICBsaW5rRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwganNFdmVudCA9PiB7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveCh7fSwganNFdmVudCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHBhcmFtZXRlcnMucmVuZGVyRm9ybXNcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImNob2ljZVdpZGdldEFubm90YXRpb25cIik7XG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgY29uc3QgaWQgPSB0aGlzLmRhdGEuaWQ7XG4gICAgY29uc3Qgc3RvcmVkRGF0YSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmRhdGEuZmllbGRWYWx1ZVxuICAgIH0pO1xuICAgIGNvbnN0IHNlbGVjdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xuICAgIEdldEVsZW1lbnRzQnlOYW1lU2V0LmFkZChzZWxlY3RFbGVtZW50KTtcbiAgICBzZWxlY3RFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBpZCk7XG4gICAgc2VsZWN0RWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGF0YS5yZWFkT25seTtcbiAgICB0aGlzLl9zZXRSZXF1aXJlZChzZWxlY3RFbGVtZW50LCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuICAgIHNlbGVjdEVsZW1lbnQubmFtZSA9IHRoaXMuZGF0YS5maWVsZE5hbWU7XG4gICAgc2VsZWN0RWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuICAgIGxldCBhZGRBbkVtcHR5RW50cnkgPSB0aGlzLmRhdGEuY29tYm8gJiYgdGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoID4gMDtcbiAgICBpZiAoIXRoaXMuZGF0YS5jb21ibykge1xuICAgICAgc2VsZWN0RWxlbWVudC5zaXplID0gdGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoO1xuICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aVNlbGVjdCkge1xuICAgICAgICBzZWxlY3RFbGVtZW50Lm11bHRpcGxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwicmVzZXRmb3JtXCIsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZTtcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHNlbGVjdEVsZW1lbnQub3B0aW9ucykge1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBvcHRpb24udmFsdWUgPT09IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLmRhdGEub3B0aW9ucykge1xuICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9uLmRpc3BsYXlWYWx1ZTtcbiAgICAgIG9wdGlvbkVsZW1lbnQudmFsdWUgPSBvcHRpb24uZXhwb3J0VmFsdWU7XG4gICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZS5pbmNsdWRlcyhvcHRpb24uZXhwb3J0VmFsdWUpKSB7XG4gICAgICAgIG9wdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgdHJ1ZSk7XG4gICAgICAgIGFkZEFuRW1wdHlFbnRyeSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgc2VsZWN0RWxlbWVudC5hcHBlbmQob3B0aW9uRWxlbWVudCk7XG4gICAgfVxuICAgIGxldCByZW1vdmVFbXB0eUVudHJ5ID0gbnVsbDtcbiAgICBpZiAoYWRkQW5FbXB0eUVudHJ5KSB7XG4gICAgICBjb25zdCBub25lT3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICBub25lT3B0aW9uRWxlbWVudC52YWx1ZSA9IFwiIFwiO1xuICAgICAgbm9uZU9wdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIHRydWUpO1xuICAgICAgbm9uZU9wdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgdHJ1ZSk7XG4gICAgICBzZWxlY3RFbGVtZW50LnByZXBlbmQobm9uZU9wdGlvbkVsZW1lbnQpO1xuICAgICAgcmVtb3ZlRW1wdHlFbnRyeSA9ICgpID0+IHtcbiAgICAgICAgbm9uZU9wdGlvbkVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIHNlbGVjdEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHJlbW92ZUVtcHR5RW50cnkpO1xuICAgICAgICByZW1vdmVFbXB0eUVudHJ5ID0gbnVsbDtcbiAgICAgIH07XG4gICAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCByZW1vdmVFbXB0eUVudHJ5KTtcbiAgICB9XG4gICAgY29uc3QgZ2V0VmFsdWUgPSBpc0V4cG9ydCA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gaXNFeHBvcnQgPyBcInZhbHVlXCIgOiBcInRleHRDb250ZW50XCI7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIG11bHRpcGxlXG4gICAgICB9ID0gc2VsZWN0RWxlbWVudDtcbiAgICAgIGlmICghbXVsdGlwbGUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuc2VsZWN0ZWRJbmRleCA9PT0gLTEgPyBudWxsIDogb3B0aW9uc1tvcHRpb25zLnNlbGVjdGVkSW5kZXhdW25hbWVdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChvcHRpb25zLCBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKS5tYXAob3B0aW9uID0+IG9wdGlvbltuYW1lXSk7XG4gICAgfTtcbiAgICBsZXQgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgY29uc3QgZ2V0SXRlbXMgPSBldmVudCA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZXZlbnQudGFyZ2V0Lm9wdGlvbnM7XG4gICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG9wdGlvbnMsIG9wdGlvbiA9PiAoe1xuICAgICAgICBkaXNwbGF5VmFsdWU6IG9wdGlvbi50ZXh0Q29udGVudCxcbiAgICAgICAgZXhwb3J0VmFsdWU6IG9wdGlvbi52YWx1ZVxuICAgICAgfSkpO1xuICAgIH07XG4gICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG4gICAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICAgICAgICB2YWx1ZShldmVudCkge1xuICAgICAgICAgICAgcmVtb3ZlRW1wdHlFbnRyeT8uKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LmRldGFpbC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygc2VsZWN0RWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHZhbHVlcy5oYXMob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVsdGlwbGVTZWxlY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVtb3ZlKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gc2VsZWN0RWxlbWVudC5vcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBldmVudC5kZXRhaWwucmVtb3ZlO1xuICAgICAgICAgICAgb3B0aW9uc1tpbmRleF0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQucmVtb3ZlKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXguY2FsbChvcHRpb25zLCBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICAgICAgICAgICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1swXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpLFxuICAgICAgICAgICAgICBpdGVtczogZ2V0SXRlbXMoZXZlbnQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xlYXIoZXZlbnQpIHtcbiAgICAgICAgICAgIHdoaWxlIChzZWxlY3RFbGVtZW50Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnJlbW92ZSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGluc2VydChldmVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICBleHBvcnRWYWx1ZVxuICAgICAgICAgICAgfSA9IGV2ZW50LmRldGFpbC5pbnNlcnQ7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RDaGlsZCA9IHNlbGVjdEVsZW1lbnQuY2hpbGRyZW5baW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgICAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gZGlzcGxheVZhbHVlO1xuICAgICAgICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IGV4cG9ydFZhbHVlO1xuICAgICAgICAgICAgaWYgKHNlbGVjdENoaWxkKSB7XG4gICAgICAgICAgICAgIHNlbGVjdENoaWxkLmJlZm9yZShvcHRpb25FbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kKG9wdGlvbkVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSksXG4gICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhldmVudClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpdGVtcyhldmVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBpdGVtc1xuICAgICAgICAgICAgfSA9IGV2ZW50LmRldGFpbDtcbiAgICAgICAgICAgIHdoaWxlIChzZWxlY3RFbGVtZW50Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnJlbW92ZSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgIGV4cG9ydFZhbHVlXG4gICAgICAgICAgICAgIH0gPSBpdGVtO1xuICAgICAgICAgICAgICBjb25zdCBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgICAgICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IGRpc3BsYXlWYWx1ZTtcbiAgICAgICAgICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IGV4cG9ydFZhbHVlO1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LmFwcGVuZChvcHRpb25FbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWxlY3RFbGVtZW50Lm9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50Lm9wdGlvbnNbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSksXG4gICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhldmVudClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbmRpY2VzKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRpY2VzID0gbmV3IFNldChldmVudC5kZXRhaWwuaW5kaWNlcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBldmVudC50YXJnZXQub3B0aW9ucykge1xuICAgICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBpbmRpY2VzLmhhcyhvcHRpb24uaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlZGl0YWJsZShldmVudCkge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmRpc2FibGVkID0gIWV2ZW50LmRldGFpbC5lZGl0YWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChhY3Rpb25zLCBqc0V2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBleHBvcnRWYWx1ZSA9IGdldFZhbHVlKHRydWUpO1xuICAgICAgICBjb25zdCBjaGFuZ2UgPSBnZXRWYWx1ZShmYWxzZSk7XG4gICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcbiAgICAgICAgICB2YWx1ZTogZXhwb3J0VmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkVmFsdWVzLFxuICAgICAgICAgICAgY2hhbmdlLFxuICAgICAgICAgICAgY2hhbmdlRXg6IGV4cG9ydFZhbHVlLFxuICAgICAgICAgICAgd2lsbENvbW1pdDogZmFsc2UsXG4gICAgICAgICAgICBjb21taXRLZXk6IDEsXG4gICAgICAgICAgICBrZXlEb3duOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKHNlbGVjdEVsZW1lbnQsIG51bGwsIFtbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdLCBbXCJpbnB1dFwiLCBcIkFjdGlvblwiXSwgW1wiaW5wdXRcIiwgXCJWYWxpZGF0ZVwiXV0sIGV2ZW50ID0+IGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG4gICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEuY29tYm8pIHtcbiAgICAgIHRoaXMuX3NldFRleHRTdHlsZShzZWxlY3RFbGVtZW50KTtcbiAgICB9IGVsc2Uge31cbiAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3Ioc2VsZWN0RWxlbWVudCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoc2VsZWN0RWxlbWVudCk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHNlbGVjdEVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGEsXG4gICAgICBlbGVtZW50c1xuICAgIH0gPSBwYXJhbWV0ZXJzO1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogQW5ub3RhdGlvbkVsZW1lbnQuX2hhc1BvcHVwRGF0YShkYXRhKVxuICAgIH0pO1xuICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50cztcbiAgICB0aGlzLnBvcHVwID0gbnVsbDtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInBvcHVwQW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCBwb3B1cCA9IHRoaXMucG9wdXAgPSBuZXcgUG9wdXBFbGVtZW50KHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIsXG4gICAgICBjb2xvcjogdGhpcy5kYXRhLmNvbG9yLFxuICAgICAgdGl0bGVPYmo6IHRoaXMuZGF0YS50aXRsZU9iaixcbiAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlLFxuICAgICAgY29udGVudHNPYmo6IHRoaXMuZGF0YS5jb250ZW50c09iaixcbiAgICAgIHJpY2hUZXh0OiB0aGlzLmRhdGEucmljaFRleHQsXG4gICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCxcbiAgICAgIHBhcmVudFJlY3Q6IHRoaXMuZGF0YS5wYXJlbnRSZWN0IHx8IG51bGwsXG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgZWxlbWVudHM6IHRoaXMuZWxlbWVudHMsXG4gICAgICBvcGVuOiB0aGlzLmRhdGEub3BlblxuICAgIH0pO1xuICAgIGNvbnN0IGVsZW1lbnRJZHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5lbGVtZW50cykge1xuICAgICAgZWxlbWVudC5wb3B1cCA9IHBvcHVwO1xuICAgICAgZWxlbWVudElkcy5wdXNoKGVsZW1lbnQuZGF0YS5pZCk7XG4gICAgICBlbGVtZW50LmFkZEhpZ2hsaWdodEFyZWEoKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiLCBlbGVtZW50SWRzLm1hcChpZCA9PiBgJHtBbm5vdGF0aW9uUHJlZml4fSR7aWR9YCkuam9pbihcIixcIikpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgUG9wdXBFbGVtZW50IHtcbiAgI2JvdW5kS2V5RG93biA9IHRoaXMuI2tleURvd24uYmluZCh0aGlzKTtcbiAgI2JvdW5kSGlkZSA9IHRoaXMuI2hpZGUuYmluZCh0aGlzKTtcbiAgI2JvdW5kU2hvdyA9IHRoaXMuI3Nob3cuYmluZCh0aGlzKTtcbiAgI2JvdW5kVG9nZ2xlID0gdGhpcy4jdG9nZ2xlLmJpbmQodGhpcyk7XG4gICNjb2xvciA9IG51bGw7XG4gICNjb250YWluZXIgPSBudWxsO1xuICAjY29udGVudHNPYmogPSBudWxsO1xuICAjZGF0ZU9iaiA9IG51bGw7XG4gICNlbGVtZW50cyA9IG51bGw7XG4gICNwYXJlbnQgPSBudWxsO1xuICAjcGFyZW50UmVjdCA9IG51bGw7XG4gICNwaW5uZWQgPSBmYWxzZTtcbiAgI3BvcHVwID0gbnVsbDtcbiAgI3Bvc2l0aW9uID0gbnVsbDtcbiAgI3JlY3QgPSBudWxsO1xuICAjcmljaFRleHQgPSBudWxsO1xuICAjdGl0bGVPYmogPSBudWxsO1xuICAjdXBkYXRlcyA9IG51bGw7XG4gICN3YXNWaXNpYmxlID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjb250YWluZXIsXG4gICAgY29sb3IsXG4gICAgZWxlbWVudHMsXG4gICAgdGl0bGVPYmosXG4gICAgbW9kaWZpY2F0aW9uRGF0ZSxcbiAgICBjb250ZW50c09iaixcbiAgICByaWNoVGV4dCxcbiAgICBwYXJlbnQsXG4gICAgcmVjdCxcbiAgICBwYXJlbnRSZWN0LFxuICAgIG9wZW5cbiAgfSkge1xuICAgIHRoaXMuI2NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLiN0aXRsZU9iaiA9IHRpdGxlT2JqO1xuICAgIHRoaXMuI2NvbnRlbnRzT2JqID0gY29udGVudHNPYmo7XG4gICAgdGhpcy4jcmljaFRleHQgPSByaWNoVGV4dDtcbiAgICB0aGlzLiNwYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy4jY29sb3IgPSBjb2xvcjtcbiAgICB0aGlzLiNyZWN0ID0gcmVjdDtcbiAgICB0aGlzLiNwYXJlbnRSZWN0ID0gcGFyZW50UmVjdDtcbiAgICB0aGlzLiNlbGVtZW50cyA9IGVsZW1lbnRzO1xuICAgIHRoaXMuI2RhdGVPYmogPSBQREZEYXRlU3RyaW5nLnRvRGF0ZU9iamVjdChtb2RpZmljYXRpb25EYXRlKTtcbiAgICB0aGlzLnRyaWdnZXIgPSBlbGVtZW50cy5mbGF0TWFwKGUgPT4gZS5nZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkpO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLnRyaWdnZXIpIHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuI2JvdW5kVG9nZ2xlKTtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgdGhpcy4jYm91bmRTaG93KTtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgdGhpcy4jYm91bmRIaWRlKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInBvcHVwVHJpZ2dlckFyZWFcIik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgZWxlbWVudC5jb250YWluZXI/LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5RG93bik7XG4gICAgfVxuICAgIHRoaXMuI2NvbnRhaW5lci5oaWRkZW4gPSB0cnVlO1xuICAgIGlmIChvcGVuKSB7XG4gICAgICB0aGlzLiN0b2dnbGUoKTtcbiAgICB9XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLiNwb3B1cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwb3B1cCA9IHRoaXMuI3BvcHVwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBwb3B1cC5jbGFzc05hbWUgPSBcInBvcHVwXCI7XG4gICAgaWYgKHRoaXMuI2NvbG9yKSB7XG4gICAgICBjb25zdCBiYXNlQ29sb3IgPSBwb3B1cC5zdHlsZS5vdXRsaW5lQ29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi50aGlzLiNjb2xvcik7XG4gICAgICBpZiAoQ1NTLnN1cHBvcnRzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBcImNvbG9yLW1peChpbiBzcmdiLCByZWQgMzAlLCB3aGl0ZSlcIikpIHtcbiAgICAgICAgcG9wdXAuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYGNvbG9yLW1peChpbiBzcmdiLCAke2Jhc2VDb2xvcn0gMzAlLCB3aGl0ZSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgQkFDS0dST1VORF9FTkxJR0hUID0gMC43O1xuICAgICAgICBwb3B1cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi50aGlzLiNjb2xvci5tYXAoYyA9PiBNYXRoLmZsb29yKEJBQ0tHUk9VTkRfRU5MSUdIVCAqICgyNTUgLSBjKSArIGMpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIGhlYWRlci5jbGFzc05hbWUgPSBcImhlYWRlclwiO1xuICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImgxXCIpO1xuICAgIGhlYWRlci5hcHBlbmQodGl0bGUpO1xuICAgICh7XG4gICAgICBkaXI6IHRpdGxlLmRpcixcbiAgICAgIHN0cjogdGl0bGUudGV4dENvbnRlbnRcbiAgICB9ID0gdGhpcy4jdGl0bGVPYmopO1xuICAgIHBvcHVwLmFwcGVuZChoZWFkZXIpO1xuICAgIGlmICh0aGlzLiNkYXRlT2JqKSB7XG4gICAgICBjb25zdCBtb2RpZmljYXRpb25EYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICBtb2RpZmljYXRpb25EYXRlLmNsYXNzTGlzdC5hZGQoXCJwb3B1cERhdGVcIik7XG4gICAgICBtb2RpZmljYXRpb25EYXRlLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBcInBkZmpzLWFubm90YXRpb24tZGF0ZS1zdHJpbmdcIik7XG4gICAgICBtb2RpZmljYXRpb25EYXRlLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1hcmdzXCIsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZGF0ZTogdGhpcy4jZGF0ZU9iai50b0xvY2FsZURhdGVTdHJpbmcoKSxcbiAgICAgICAgdGltZTogdGhpcy4jZGF0ZU9iai50b0xvY2FsZVRpbWVTdHJpbmcoKVxuICAgICAgfSkpO1xuICAgICAgaGVhZGVyLmFwcGVuZChtb2RpZmljYXRpb25EYXRlKTtcbiAgICB9XG4gICAgY29uc3QgaHRtbCA9IHRoaXMuI2h0bWw7XG4gICAgaWYgKGh0bWwpIHtcbiAgICAgIFhmYUxheWVyLnJlbmRlcih7XG4gICAgICAgIHhmYUh0bWw6IGh0bWwsXG4gICAgICAgIGludGVudDogXCJyaWNoVGV4dFwiLFxuICAgICAgICBkaXY6IHBvcHVwXG4gICAgICB9KTtcbiAgICAgIHBvcHVwLmxhc3RDaGlsZC5jbGFzc0xpc3QuYWRkKFwicmljaFRleHRcIiwgXCJwb3B1cENvbnRlbnRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnRlbnRzID0gdGhpcy5fZm9ybWF0Q29udGVudHModGhpcy4jY29udGVudHNPYmopO1xuICAgICAgcG9wdXAuYXBwZW5kKGNvbnRlbnRzKTtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLmFwcGVuZChwb3B1cCk7XG4gIH1cbiAgZ2V0ICNodG1sKCkge1xuICAgIGNvbnN0IHJpY2hUZXh0ID0gdGhpcy4jcmljaFRleHQ7XG4gICAgY29uc3QgY29udGVudHNPYmogPSB0aGlzLiNjb250ZW50c09iajtcbiAgICBpZiAocmljaFRleHQ/LnN0ciAmJiAoIWNvbnRlbnRzT2JqPy5zdHIgfHwgY29udGVudHNPYmouc3RyID09PSByaWNoVGV4dC5zdHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy4jcmljaFRleHQuaHRtbCB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgI2ZvbnRTaXplKCkge1xuICAgIHJldHVybiB0aGlzLiNodG1sPy5hdHRyaWJ1dGVzPy5zdHlsZT8uZm9udFNpemUgfHwgMDtcbiAgfVxuICBnZXQgI2ZvbnRDb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy4jaHRtbD8uYXR0cmlidXRlcz8uc3R5bGU/LmNvbG9yIHx8IG51bGw7XG4gIH1cbiAgI21ha2VQb3B1cENvbnRlbnQodGV4dCkge1xuICAgIGNvbnN0IHBvcHVwTGluZXMgPSBbXTtcbiAgICBjb25zdCBwb3B1cENvbnRlbnQgPSB7XG4gICAgICBzdHI6IHRleHQsXG4gICAgICBodG1sOiB7XG4gICAgICAgIG5hbWU6IFwiZGl2XCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBkaXI6IFwiYXV0b1wiXG4gICAgICAgIH0sXG4gICAgICAgIGNoaWxkcmVuOiBbe1xuICAgICAgICAgIG5hbWU6IFwicFwiLFxuICAgICAgICAgIGNoaWxkcmVuOiBwb3B1cExpbmVzXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBsaW5lQXR0cmlidXRlcyA9IHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGNvbG9yOiB0aGlzLiNmb250Q29sb3IsXG4gICAgICAgIGZvbnRTaXplOiB0aGlzLiNmb250U2l6ZSA/IGBjYWxjKCR7dGhpcy4jZm9udFNpemV9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWAgOiBcIlwiXG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGV4dC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgcG9wdXBMaW5lcy5wdXNoKHtcbiAgICAgICAgbmFtZTogXCJzcGFuXCIsXG4gICAgICAgIHZhbHVlOiBsaW5lLFxuICAgICAgICBhdHRyaWJ1dGVzOiBsaW5lQXR0cmlidXRlc1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBwb3B1cENvbnRlbnQ7XG4gIH1cbiAgX2Zvcm1hdENvbnRlbnRzKHtcbiAgICBzdHIsXG4gICAgZGlyXG4gIH0pIHtcbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgcC5jbGFzc0xpc3QuYWRkKFwicG9wdXBDb250ZW50XCIpO1xuICAgIHAuZGlyID0gZGlyO1xuICAgIGNvbnN0IGxpbmVzID0gc3RyLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG4gICAgICBwLmFwcGVuZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lKSk7XG4gICAgICBpZiAoaSA8IGlpIC0gMSkge1xuICAgICAgICBwLmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfVxuICAja2V5RG93bihldmVudCkge1xuICAgIGlmIChldmVudC5hbHRLZXkgfHwgZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09IFwiRW50ZXJcIiB8fCBldmVudC5rZXkgPT09IFwiRXNjYXBlXCIgJiYgdGhpcy4jcGlubmVkKSB7XG4gICAgICB0aGlzLiN0b2dnbGUoKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlRWRpdGVkKHtcbiAgICByZWN0LFxuICAgIHBvcHVwQ29udGVudFxuICB9KSB7XG4gICAgdGhpcy4jdXBkYXRlcyB8fD0ge1xuICAgICAgY29udGVudHNPYmo6IHRoaXMuI2NvbnRlbnRzT2JqLFxuICAgICAgcmljaFRleHQ6IHRoaXMuI3JpY2hUZXh0XG4gICAgfTtcbiAgICBpZiAocmVjdCkge1xuICAgICAgdGhpcy4jcG9zaXRpb24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAocG9wdXBDb250ZW50KSB7XG4gICAgICB0aGlzLiNyaWNoVGV4dCA9IHRoaXMuI21ha2VQb3B1cENvbnRlbnQocG9wdXBDb250ZW50KTtcbiAgICAgIHRoaXMuI2NvbnRlbnRzT2JqID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy4jcG9wdXA/LnJlbW92ZSgpO1xuICAgIHRoaXMuI3BvcHVwID0gbnVsbDtcbiAgfVxuICByZXNldEVkaXRlZCgpIHtcbiAgICBpZiAoIXRoaXMuI3VwZGF0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKHtcbiAgICAgIGNvbnRlbnRzT2JqOiB0aGlzLiNjb250ZW50c09iaixcbiAgICAgIHJpY2hUZXh0OiB0aGlzLiNyaWNoVGV4dFxuICAgIH0gPSB0aGlzLiN1cGRhdGVzKTtcbiAgICB0aGlzLiN1cGRhdGVzID0gbnVsbDtcbiAgICB0aGlzLiNwb3B1cD8ucmVtb3ZlKCk7XG4gICAgdGhpcy4jcG9wdXAgPSBudWxsO1xuICAgIHRoaXMuI3Bvc2l0aW9uID0gbnVsbDtcbiAgfVxuICAjc2V0UG9zaXRpb24oKSB7XG4gICAgaWYgKHRoaXMuI3Bvc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHBhZ2U6IHtcbiAgICAgICAgdmlld1xuICAgICAgfSxcbiAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgIHJhd0RpbXM6IHtcbiAgICAgICAgICBwYWdlV2lkdGgsXG4gICAgICAgICAgcGFnZUhlaWdodCxcbiAgICAgICAgICBwYWdlWCxcbiAgICAgICAgICBwYWdlWVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSA9IHRoaXMuI3BhcmVudDtcbiAgICBsZXQgdXNlUGFyZW50UmVjdCA9ICEhdGhpcy4jcGFyZW50UmVjdDtcbiAgICBsZXQgcmVjdCA9IHVzZVBhcmVudFJlY3QgPyB0aGlzLiNwYXJlbnRSZWN0IDogdGhpcy4jcmVjdDtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy4jZWxlbWVudHMpIHtcbiAgICAgIGlmICghcmVjdCB8fCBVdGlsLmludGVyc2VjdChlbGVtZW50LmRhdGEucmVjdCwgcmVjdCkgIT09IG51bGwpIHtcbiAgICAgICAgcmVjdCA9IGVsZW1lbnQuZGF0YS5yZWN0O1xuICAgICAgICB1c2VQYXJlbnRSZWN0ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWN0ID0gVXRpbC5ub3JtYWxpemVSZWN0KFtyZWN0WzBdLCB2aWV3WzNdIC0gcmVjdFsxXSArIHZpZXdbMV0sIHJlY3RbMl0sIHZpZXdbM10gLSByZWN0WzNdICsgdmlld1sxXV0pO1xuICAgIGNvbnN0IEhPUklaT05UQUxfU1BBQ0VfQUZURVJfQU5OT1RBVElPTiA9IDU7XG4gICAgY29uc3QgcGFyZW50V2lkdGggPSB1c2VQYXJlbnRSZWN0ID8gcmVjdFsyXSAtIHJlY3RbMF0gKyBIT1JJWk9OVEFMX1NQQUNFX0FGVEVSX0FOTk9UQVRJT04gOiAwO1xuICAgIGNvbnN0IHBvcHVwTGVmdCA9IG5vcm1hbGl6ZWRSZWN0WzBdICsgcGFyZW50V2lkdGg7XG4gICAgY29uc3QgcG9wdXBUb3AgPSBub3JtYWxpemVkUmVjdFsxXTtcbiAgICB0aGlzLiNwb3NpdGlvbiA9IFsxMDAgKiAocG9wdXBMZWZ0IC0gcGFnZVgpIC8gcGFnZVdpZHRoLCAxMDAgKiAocG9wdXBUb3AgLSBwYWdlWSkgLyBwYWdlSGVpZ2h0XTtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSB0aGlzLiNjb250YWluZXI7XG4gICAgc3R5bGUubGVmdCA9IGAke3RoaXMuI3Bvc2l0aW9uWzBdfSVgO1xuICAgIHN0eWxlLnRvcCA9IGAke3RoaXMuI3Bvc2l0aW9uWzFdfSVgO1xuICB9XG4gICN0b2dnbGUoKSB7XG4gICAgdGhpcy4jcGlubmVkID0gIXRoaXMuI3Bpbm5lZDtcbiAgICBpZiAodGhpcy4jcGlubmVkKSB7XG4gICAgICB0aGlzLiNzaG93KCk7XG4gICAgICB0aGlzLiNjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuI2JvdW5kVG9nZ2xlKTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleURvd24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNoaWRlKCk7XG4gICAgICB0aGlzLiNjb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuI2JvdW5kVG9nZ2xlKTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleURvd24pO1xuICAgIH1cbiAgfVxuICAjc2hvdygpIHtcbiAgICBpZiAoIXRoaXMuI3BvcHVwKSB7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICB0aGlzLiNzZXRQb3NpdGlvbigpO1xuICAgICAgdGhpcy4jY29udGFpbmVyLmhpZGRlbiA9IGZhbHNlO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IHBhcnNlSW50KHRoaXMuI2NvbnRhaW5lci5zdHlsZS56SW5kZXgpICsgMTAwMDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI3Bpbm5lZCkge1xuICAgICAgdGhpcy4jY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJmb2N1c2VkXCIpO1xuICAgIH1cbiAgfVxuICAjaGlkZSgpIHtcbiAgICB0aGlzLiNjb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcImZvY3VzZWRcIik7XG4gICAgaWYgKHRoaXMuI3Bpbm5lZCB8fCAhdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jY29udGFpbmVyLmhpZGRlbiA9IHRydWU7XG4gICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IHBhcnNlSW50KHRoaXMuI2NvbnRhaW5lci5zdHlsZS56SW5kZXgpIC0gMTAwMDtcbiAgfVxuICBmb3JjZUhpZGUoKSB7XG4gICAgdGhpcy4jd2FzVmlzaWJsZSA9IHRoaXMuaXNWaXNpYmxlO1xuICAgIGlmICghdGhpcy4jd2FzVmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNjb250YWluZXIuaGlkZGVuID0gdHJ1ZTtcbiAgfVxuICBtYXliZVNob3coKSB7XG4gICAgaWYgKCF0aGlzLiN3YXNWaXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jcG9wdXApIHtcbiAgICAgIHRoaXMuI3Nob3coKTtcbiAgICB9XG4gICAgdGhpcy4jd2FzVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuI2NvbnRhaW5lci5oaWRkZW4gPSBmYWxzZTtcbiAgfVxuICBnZXQgaXNWaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLiNjb250YWluZXIuaGlkZGVuID09PSBmYWxzZTtcbiAgfVxufVxuY2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBwYXJhbWV0ZXJzLmRhdGEudGV4dENvbnRlbnQ7XG4gICAgdGhpcy50ZXh0UG9zaXRpb24gPSBwYXJhbWV0ZXJzLmRhdGEudGV4dFBvc2l0aW9uO1xuICAgIHRoaXMuYW5ub3RhdGlvbkVkaXRvclR5cGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImZyZWVUZXh0QW5ub3RhdGlvblwiKTtcbiAgICBpZiAodGhpcy50ZXh0Q29udGVudCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoXCJhbm5vdGF0aW9uVGV4dENvbnRlbnRcIik7XG4gICAgICBjb250ZW50LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJjb21tZW50XCIpO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMudGV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgbGluZVNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgbGluZVNwYW4udGV4dENvbnRlbnQgPSBsaW5lO1xuICAgICAgICBjb250ZW50LmFwcGVuZChsaW5lU3Bhbik7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoY29udGVudCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICB0aGlzLl9lZGl0T25Eb3VibGVDbGljaygpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBnZXQgX2lzRWRpdGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5oYXNPd25DYW52YXM7XG4gIH1cbn1cbmNsYXNzIExpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgI2xpbmUgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJsaW5lQW5ub3RhdGlvblwiKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcbiAgICBjb25zdCBsaW5lID0gdGhpcy4jbGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmxpbmVcIik7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ4MVwiLCBkYXRhLnJlY3RbMl0gLSBkYXRhLmxpbmVDb29yZGluYXRlc1swXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ5MVwiLCBkYXRhLnJlY3RbM10gLSBkYXRhLmxpbmVDb29yZGluYXRlc1sxXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ4MlwiLCBkYXRhLnJlY3RbMl0gLSBkYXRhLmxpbmVDb29yZGluYXRlc1syXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ5MlwiLCBkYXRhLnJlY3RbM10gLSBkYXRhLmxpbmVDb29yZGluYXRlc1szXSk7XG4gICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICBsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIHN2Zy5hcHBlbmQobGluZSk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG4gICAgaWYgKCFkYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGluZTtcbiAgfVxuICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICB9XG59XG5jbGFzcyBTcXVhcmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgI3NxdWFyZSA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInNxdWFyZUFubm90YXRpb25cIik7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG4gICAgY29uc3QgYm9yZGVyV2lkdGggPSBkYXRhLmJvcmRlclN0eWxlLndpZHRoO1xuICAgIGNvbnN0IHNxdWFyZSA9IHRoaXMuI3NxdWFyZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInhcIiwgYm9yZGVyV2lkdGggLyAyKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwieVwiLCBib3JkZXJXaWR0aCAvIDIpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB3aWR0aCAtIGJvcmRlcldpZHRoKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGhlaWdodCAtIGJvcmRlcldpZHRoKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGJvcmRlcldpZHRoIHx8IDEpO1xuICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIHN2Zy5hcHBlbmQoc3F1YXJlKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcbiAgICBpZiAoIWRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgIHJldHVybiB0aGlzLiNzcXVhcmU7XG4gIH1cbiAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgfVxufVxuY2xhc3MgQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICNjaXJjbGUgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjaXJjbGVBbm5vdGF0aW9uXCIpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXMoZGF0YS5yZWN0KTtcbiAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuICAgIGNvbnN0IGJvcmRlcldpZHRoID0gZGF0YS5ib3JkZXJTdHlsZS53aWR0aDtcbiAgICBjb25zdCBjaXJjbGUgPSB0aGlzLiNjaXJjbGUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzplbGxpcHNlXCIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJjeFwiLCB3aWR0aCAvIDIpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJjeVwiLCBoZWlnaHQgLyAyKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwicnhcIiwgd2lkdGggLyAyIC0gYm9yZGVyV2lkdGggLyAyKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwicnlcIiwgaGVpZ2h0IC8gMiAtIGJvcmRlcldpZHRoIC8gMik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBib3JkZXJXaWR0aCB8fCAxKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBzdmcuYXBwZW5kKGNpcmNsZSk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG4gICAgaWYgKCFkYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY2lyY2xlO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbn1cbmNsYXNzIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICNwb2x5bGluZSA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwicG9seWxpbmVBbm5vdGF0aW9uXCI7XG4gICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlsaW5lXCI7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5jb250YWluZXJDbGFzc05hbWUpO1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcmVjdCxcbiAgICAgICAgdmVydGljZXMsXG4gICAgICAgIGJvcmRlclN0eWxlLFxuICAgICAgICBwb3B1cFJlZlxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghdmVydGljZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gZ2V0UmVjdERpbXMocmVjdCk7XG4gICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcbiAgICBsZXQgcG9pbnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgY29uc3QgeCA9IHZlcnRpY2VzW2ldIC0gcmVjdFswXTtcbiAgICAgIGNvbnN0IHkgPSByZWN0WzNdIC0gdmVydGljZXNbaSArIDFdO1xuICAgICAgcG9pbnRzLnB1c2goYCR7eH0sJHt5fWApO1xuICAgIH1cbiAgICBwb2ludHMgPSBwb2ludHMuam9pbihcIiBcIik7XG4gICAgY29uc3QgcG9seWxpbmUgPSB0aGlzLiNwb2x5bGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMuc3ZnRWxlbWVudE5hbWUpO1xuICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInBvaW50c1wiLCBwb2ludHMpO1xuICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgc3ZnLmFwcGVuZChwb2x5bGluZSk7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG4gICAgaWYgKCFwb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG4gIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3BvbHlsaW5lO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbn1cbmNsYXNzIFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycyk7XG4gICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcInBvbHlnb25Bbm5vdGF0aW9uXCI7XG4gICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlnb25cIjtcbiAgfVxufVxuY2xhc3MgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY2FyZXRBbm5vdGF0aW9uXCIpO1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIElua0Fubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjcG9seWxpbmVzID0gW107XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwiaW5rQW5ub3RhdGlvblwiO1xuICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5bGluZVwiO1xuICAgIHRoaXMuYW5ub3RhdGlvbkVkaXRvclR5cGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5jb250YWluZXJDbGFzc05hbWUpO1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcmVjdCxcbiAgICAgICAgaW5rTGlzdHMsXG4gICAgICAgIGJvcmRlclN0eWxlLFxuICAgICAgICBwb3B1cFJlZlxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IGdldFJlY3REaW1zKHJlY3QpO1xuICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG4gICAgZm9yIChjb25zdCBpbmtMaXN0IG9mIGlua0xpc3RzKSB7XG4gICAgICBsZXQgcG9pbnRzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbmtMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgY29uc3QgeCA9IGlua0xpc3RbaV0gLSByZWN0WzBdO1xuICAgICAgICBjb25zdCB5ID0gcmVjdFszXSAtIGlua0xpc3RbaSArIDFdO1xuICAgICAgICBwb2ludHMucHVzaChgJHt4fSwke3l9YCk7XG4gICAgICB9XG4gICAgICBwb2ludHMgPSBwb2ludHMuam9pbihcIiBcIik7XG4gICAgICBjb25zdCBwb2x5bGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMuc3ZnRWxlbWVudE5hbWUpO1xuICAgICAgdGhpcy4jcG9seWxpbmVzLnB1c2gocG9seWxpbmUpO1xuICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwicG9pbnRzXCIsIHBvaW50cyk7XG4gICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7XG4gICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcbiAgICAgIGlmICghcG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgIH1cbiAgICAgIHN2Zy5hcHBlbmQocG9seWxpbmUpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jcG9seWxpbmVzO1xuICB9XG4gIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gIH1cbn1cbmNsYXNzIEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBbm5vdGF0aW9uXCIpO1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxufVxuY2xhc3MgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWUsXG4gICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInVuZGVybGluZUFubm90YXRpb25cIik7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIocGFyYW1ldGVycywge1xuICAgICAgaXNSZW5kZXJhYmxlOiB0cnVlLFxuICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGEucG9wdXBSZWYgJiYgdGhpcy5oYXNQb3B1cERhdGEpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzcXVpZ2dseUFubm90YXRpb25cIik7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcbiAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcbiAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZSxcbiAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5kYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3RyaWtlb3V0QW5ub3RhdGlvblwiKTtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cbn1cbmNsYXNzIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG4gICAgICBpZ25vcmVCb3JkZXI6IHRydWVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInN0YW1wQW5ub3RhdGlvblwiKTtcbiAgICBpZiAoIXRoaXMuZGF0YS5wb3B1cFJlZiAmJiB0aGlzLmhhc1BvcHVwRGF0YSkge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG59XG5jbGFzcyBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAjdHJpZ2dlciA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG4gICAgICBpc1JlbmRlcmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBmaWxlXG4gICAgfSA9IHRoaXMuZGF0YTtcbiAgICB0aGlzLmZpbGVuYW1lID0gZmlsZS5maWxlbmFtZTtcbiAgICB0aGlzLmNvbnRlbnQgPSBmaWxlLmNvbnRlbnQ7XG4gICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJmaWxlYXR0YWNobWVudGFubm90YXRpb25cIiwge1xuICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgLi4uZmlsZVxuICAgIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uXCIpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGRhdGFcbiAgICB9ID0gdGhpcztcbiAgICBsZXQgdHJpZ2dlcjtcbiAgICBpZiAoZGF0YS5oYXNBcHBlYXJhbmNlIHx8IGRhdGEuZmlsbEFscGhhID09PSAwKSB7XG4gICAgICB0cmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICB0cmlnZ2VyLnNyYyA9IGAke3RoaXMuaW1hZ2VSZXNvdXJjZXNQYXRofWFubm90YXRpb24tJHsvcGFwZXJjbGlwL2kudGVzdChkYXRhLm5hbWUpID8gXCJwYXBlcmNsaXBcIiA6IFwicHVzaHBpblwifS5zdmdgO1xuICAgICAgaWYgKGRhdGEuZmlsbEFscGhhICYmIGRhdGEuZmlsbEFscGhhIDwgMSkge1xuICAgICAgICB0cmlnZ2VyLnN0eWxlID0gYGZpbHRlcjogb3BhY2l0eSgke01hdGgucm91bmQoZGF0YS5maWxsQWxwaGEgKiAxMDApfSUpO2A7XG4gICAgICB9XG4gICAgfVxuICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsIHRoaXMuI2Rvd25sb2FkLmJpbmQodGhpcykpO1xuICAgIHRoaXMuI3RyaWdnZXIgPSB0cmlnZ2VyO1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTWFjXG4gICAgfSA9IHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGV2dCA9PiB7XG4gICAgICBpZiAoZXZ0LmtleSA9PT0gXCJFbnRlclwiICYmIChpc01hYyA/IGV2dC5tZXRhS2V5IDogZXZ0LmN0cmxLZXkpKSB7XG4gICAgICAgIHRoaXMuI2Rvd25sb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFkYXRhLnBvcHVwUmVmICYmIHRoaXMuaGFzUG9wdXBEYXRhKSB7XG4gICAgICB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyLmNsYXNzTGlzdC5hZGQoXCJwb3B1cFRyaWdnZXJBcmVhXCIpO1xuICAgIH1cbiAgICBjb250YWluZXIuYXBwZW5kKHRyaWdnZXIpO1xuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cbiAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdHJpZ2dlcjtcbiAgfVxuICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICB9XG4gICNkb3dubG9hZCgpIHtcbiAgICB0aGlzLmRvd25sb2FkTWFuYWdlcj8ub3Blbk9yRG93bmxvYWREYXRhKHRoaXMuY29udGVudCwgdGhpcy5maWxlbmFtZSk7XG4gIH1cbn1cbmNsYXNzIEFubm90YXRpb25MYXllciB7XG4gICNhY2Nlc3NpYmlsaXR5TWFuYWdlciA9IG51bGw7XG4gICNhbm5vdGF0aW9uQ2FudmFzTWFwID0gbnVsbDtcbiAgI2VkaXRhYmxlQW5ub3RhdGlvbnMgPSBuZXcgTWFwKCk7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBkaXYsXG4gICAgYWNjZXNzaWJpbGl0eU1hbmFnZXIsXG4gICAgYW5ub3RhdGlvbkNhbnZhc01hcCxcbiAgICBhbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLFxuICAgIHBhZ2UsXG4gICAgdmlld3BvcnRcbiAgfSkge1xuICAgIHRoaXMuZGl2ID0gZGl2O1xuICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlNYW5hZ2VyID0gYWNjZXNzaWJpbGl0eU1hbmFnZXI7XG4gICAgdGhpcy4jYW5ub3RhdGlvbkNhbnZhc01hcCA9IGFubm90YXRpb25DYW52YXNNYXA7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgdGhpcy56SW5kZXggPSAwO1xuICAgIHRoaXMuX2Fubm90YXRpb25FZGl0b3JVSU1hbmFnZXIgPSBhbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyO1xuICB9XG4gICNhcHBlbmRFbGVtZW50KGVsZW1lbnQsIGlkKSB7XG4gICAgY29uc3QgY29udGVudEVsZW1lbnQgPSBlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudDtcbiAgICBjb250ZW50RWxlbWVudC5pZCA9IGAke0Fubm90YXRpb25QcmVmaXh9JHtpZH1gO1xuICAgIHRoaXMuZGl2LmFwcGVuZChlbGVtZW50KTtcbiAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlcj8ubW92ZUVsZW1lbnRJbkRPTSh0aGlzLmRpdiwgZWxlbWVudCwgY29udGVudEVsZW1lbnQsIGZhbHNlKTtcbiAgfVxuICBhc3luYyByZW5kZXIocGFyYW1zKSB7XG4gICAgY29uc3Qge1xuICAgICAgYW5ub3RhdGlvbnNcbiAgICB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5kaXY7XG4gICAgc2V0TGF5ZXJEaW1lbnNpb25zKGxheWVyLCB0aGlzLnZpZXdwb3J0KTtcbiAgICBjb25zdCBwb3B1cFRvRWxlbWVudHMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZWxlbWVudFBhcmFtcyA9IHtcbiAgICAgIGRhdGE6IG51bGwsXG4gICAgICBsYXllcixcbiAgICAgIGxpbmtTZXJ2aWNlOiBwYXJhbXMubGlua1NlcnZpY2UsXG4gICAgICBkb3dubG9hZE1hbmFnZXI6IHBhcmFtcy5kb3dubG9hZE1hbmFnZXIsXG4gICAgICBpbWFnZVJlc291cmNlc1BhdGg6IHBhcmFtcy5pbWFnZVJlc291cmNlc1BhdGggfHwgXCJcIixcbiAgICAgIHJlbmRlckZvcm1zOiBwYXJhbXMucmVuZGVyRm9ybXMgIT09IGZhbHNlLFxuICAgICAgc3ZnRmFjdG9yeTogbmV3IERPTVNWR0ZhY3RvcnkoKSxcbiAgICAgIGFubm90YXRpb25TdG9yYWdlOiBwYXJhbXMuYW5ub3RhdGlvblN0b3JhZ2UgfHwgbmV3IEFubm90YXRpb25TdG9yYWdlKCksXG4gICAgICBlbmFibGVTY3JpcHRpbmc6IHBhcmFtcy5lbmFibGVTY3JpcHRpbmcgPT09IHRydWUsXG4gICAgICBoYXNKU0FjdGlvbnM6IHBhcmFtcy5oYXNKU0FjdGlvbnMsXG4gICAgICBmaWVsZE9iamVjdHM6IHBhcmFtcy5maWVsZE9iamVjdHMsXG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICBlbGVtZW50czogbnVsbFxuICAgIH07XG4gICAgZm9yIChjb25zdCBkYXRhIG9mIGFubm90YXRpb25zKSB7XG4gICAgICBpZiAoZGF0YS5ub0hUTUwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpc1BvcHVwQW5ub3RhdGlvbiA9IGRhdGEuYW5ub3RhdGlvblR5cGUgPT09IEFubm90YXRpb25UeXBlLlBPUFVQO1xuICAgICAgaWYgKCFpc1BvcHVwQW5ub3RhdGlvbikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0XG4gICAgICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuICAgICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHBvcHVwVG9FbGVtZW50cy5nZXQoZGF0YS5pZCk7XG4gICAgICAgIGlmICghZWxlbWVudHMpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50UGFyYW1zLmVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgICB9XG4gICAgICBlbGVtZW50UGFyYW1zLmRhdGEgPSBkYXRhO1xuICAgICAgY29uc3QgZWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50RmFjdG9yeS5jcmVhdGUoZWxlbWVudFBhcmFtcyk7XG4gICAgICBpZiAoIWVsZW1lbnQuaXNSZW5kZXJhYmxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1BvcHVwQW5ub3RhdGlvbiAmJiBkYXRhLnBvcHVwUmVmKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gcG9wdXBUb0VsZW1lbnRzLmdldChkYXRhLnBvcHVwUmVmKTtcbiAgICAgICAgaWYgKCFlbGVtZW50cykge1xuICAgICAgICAgIHBvcHVwVG9FbGVtZW50cy5zZXQoZGF0YS5wb3B1cFJlZiwgW2VsZW1lbnRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByZW5kZXJlZCA9IGVsZW1lbnQucmVuZGVyKCk7XG4gICAgICBpZiAoZGF0YS5oaWRkZW4pIHtcbiAgICAgICAgcmVuZGVyZWQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICB9XG4gICAgICB0aGlzLiNhcHBlbmRFbGVtZW50KHJlbmRlcmVkLCBkYXRhLmlkKTtcbiAgICAgIGlmIChlbGVtZW50LmFubm90YXRpb25FZGl0b3JUeXBlID4gMCkge1xuICAgICAgICB0aGlzLiNlZGl0YWJsZUFubm90YXRpb25zLnNldChlbGVtZW50LmRhdGEuaWQsIGVsZW1lbnQpO1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyPy5yZW5kZXJBbm5vdGF0aW9uRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jc2V0QW5ub3RhdGlvbkNhbnZhc01hcCgpO1xuICB9XG4gIHVwZGF0ZSh7XG4gICAgdmlld3BvcnRcbiAgfSkge1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5kaXY7XG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIHNldExheWVyRGltZW5zaW9ucyhsYXllciwge1xuICAgICAgcm90YXRpb246IHZpZXdwb3J0LnJvdGF0aW9uXG4gICAgfSk7XG4gICAgdGhpcy4jc2V0QW5ub3RhdGlvbkNhbnZhc01hcCgpO1xuICAgIGxheWVyLmhpZGRlbiA9IGZhbHNlO1xuICB9XG4gICNzZXRBbm5vdGF0aW9uQ2FudmFzTWFwKCkge1xuICAgIGlmICghdGhpcy4jYW5ub3RhdGlvbkNhbnZhc01hcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXllciA9IHRoaXMuZGl2O1xuICAgIGZvciAoY29uc3QgW2lkLCBjYW52YXNdIG9mIHRoaXMuI2Fubm90YXRpb25DYW52YXNNYXApIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBsYXllci5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hbm5vdGF0aW9uLWlkPVwiJHtpZH1cIl1gKTtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhbnZhcy5jbGFzc05hbWUgPSBcImFubm90YXRpb25Db250ZW50XCI7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZpcnN0Q2hpbGRcbiAgICAgIH0gPSBlbGVtZW50O1xuICAgICAgaWYgKCFmaXJzdENoaWxkKSB7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kKGNhbnZhcyk7XG4gICAgICB9IGVsc2UgaWYgKGZpcnN0Q2hpbGQubm9kZU5hbWUgPT09IFwiQ0FOVkFTXCIpIHtcbiAgICAgICAgZmlyc3RDaGlsZC5yZXBsYWNlV2l0aChjYW52YXMpO1xuICAgICAgfSBlbHNlIGlmICghZmlyc3RDaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoXCJhbm5vdGF0aW9uQ29udGVudFwiKSkge1xuICAgICAgICBmaXJzdENoaWxkLmJlZm9yZShjYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlyc3RDaGlsZC5hZnRlcihjYW52YXMpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiNhbm5vdGF0aW9uQ2FudmFzTWFwLmNsZWFyKCk7XG4gIH1cbiAgZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiNlZGl0YWJsZUFubm90YXRpb25zLnZhbHVlcygpKTtcbiAgfVxuICBnZXRFZGl0YWJsZUFubm90YXRpb24oaWQpIHtcbiAgICByZXR1cm4gdGhpcy4jZWRpdGFibGVBbm5vdGF0aW9ucy5nZXQoaWQpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9mcmVldGV4dC5qc1xuXG5cblxuXG5jb25zdCBFT0xfUEFUVEVSTiA9IC9cXHJcXG4/fFxcbi9nO1xuY2xhc3MgRnJlZVRleHRFZGl0b3IgZXh0ZW5kcyBBbm5vdGF0aW9uRWRpdG9yIHtcbiAgI2JvdW5kRWRpdG9yRGl2Qmx1ciA9IHRoaXMuZWRpdG9yRGl2Qmx1ci5iaW5kKHRoaXMpO1xuICAjYm91bmRFZGl0b3JEaXZGb2N1cyA9IHRoaXMuZWRpdG9yRGl2Rm9jdXMuYmluZCh0aGlzKTtcbiAgI2JvdW5kRWRpdG9yRGl2SW5wdXQgPSB0aGlzLmVkaXRvckRpdklucHV0LmJpbmQodGhpcyk7XG4gICNib3VuZEVkaXRvckRpdktleWRvd24gPSB0aGlzLmVkaXRvckRpdktleWRvd24uYmluZCh0aGlzKTtcbiAgI2JvdW5kRWRpdG9yRGl2UGFzdGUgPSB0aGlzLmVkaXRvckRpdlBhc3RlLmJpbmQodGhpcyk7XG4gICNjb2xvcjtcbiAgI2NvbnRlbnQgPSBcIlwiO1xuICAjZWRpdG9yRGl2SWQgPSBgJHt0aGlzLmlkfS1lZGl0b3JgO1xuICAjZm9udFNpemU7XG4gICNpbml0aWFsRGF0YSA9IG51bGw7XG4gIHN0YXRpYyBfZnJlZVRleHREZWZhdWx0Q29udGVudCA9IFwiXCI7XG4gIHN0YXRpYyBfaW50ZXJuYWxQYWRkaW5nID0gMDtcbiAgc3RhdGljIF9kZWZhdWx0Q29sb3IgPSBudWxsO1xuICBzdGF0aWMgX2RlZmF1bHRGb250U2l6ZSA9IDEwO1xuICBzdGF0aWMgZ2V0IF9rZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgY29uc3QgcHJvdG8gPSBGcmVlVGV4dEVkaXRvci5wcm90b3R5cGU7XG4gICAgY29uc3QgYXJyb3dDaGVja2VyID0gc2VsZiA9PiBzZWxmLmlzRW1wdHkoKTtcbiAgICBjb25zdCBzbWFsbCA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuVFJBTlNMQVRFX1NNQUxMO1xuICAgIGNvbnN0IGJpZyA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuVFJBTlNMQVRFX0JJRztcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiY3RybCtzXCIsIFwibWFjK21ldGErc1wiLCBcImN0cmwrcFwiLCBcIm1hYyttZXRhK3BcIl0sIHByb3RvLmNvbW1pdE9yUmVtb3ZlLCB7XG4gICAgICBidWJibGVzOiB0cnVlXG4gICAgfV0sIFtbXCJjdHJsK0VudGVyXCIsIFwibWFjK21ldGErRW50ZXJcIiwgXCJFc2NhcGVcIiwgXCJtYWMrRXNjYXBlXCJdLCBwcm90by5jb21taXRPclJlbW92ZV0sIFtbXCJBcnJvd0xlZnRcIiwgXCJtYWMrQXJyb3dMZWZ0XCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFstc21hbGwsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJjdHJsK0Fycm93TGVmdFwiLCBcIm1hYytzaGlmdCtBcnJvd0xlZnRcIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogWy1iaWcsIDBdLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJBcnJvd1JpZ2h0XCIsIFwibWFjK0Fycm93UmlnaHRcIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogW3NtYWxsLCAwXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd1JpZ2h0XCIsIFwibWFjK3NoaWZ0K0Fycm93UmlnaHRcIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogW2JpZywgMF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcIkFycm93VXBcIiwgXCJtYWMrQXJyb3dVcFwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbMCwgLXNtYWxsXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dLCBbW1wiY3RybCtBcnJvd1VwXCIsIFwibWFjK3NoaWZ0K0Fycm93VXBcIl0sIHByb3RvLl90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgYXJnczogWzAsIC1iaWddLFxuICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgfV0sIFtbXCJBcnJvd0Rvd25cIiwgXCJtYWMrQXJyb3dEb3duXCJdLCBwcm90by5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgIGFyZ3M6IFswLCBzbWFsbF0sXG4gICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICB9XSwgW1tcImN0cmwrQXJyb3dEb3duXCIsIFwibWFjK3NoaWZ0K0Fycm93RG93blwiXSwgcHJvdG8uX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICBhcmdzOiBbMCwgYmlnXSxcbiAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgIH1dXSkpO1xuICB9XG4gIHN0YXRpYyBfdHlwZSA9IFwiZnJlZXRleHRcIjtcbiAgc3RhdGljIF9lZGl0b3JUeXBlID0gQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIG5hbWU6IFwiZnJlZVRleHRFZGl0b3JcIlxuICAgIH0pO1xuICAgIHRoaXMuI2NvbG9yID0gcGFyYW1zLmNvbG9yIHx8IEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcjtcbiAgICB0aGlzLiNmb250U2l6ZSA9IHBhcmFtcy5mb250U2l6ZSB8fCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplO1xuICB9XG4gIHN0YXRpYyBpbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcikge1xuICAgIEFubm90YXRpb25FZGl0b3IuaW5pdGlhbGl6ZShsMTBuLCB1aU1hbmFnZXIsIHtcbiAgICAgIHN0cmluZ3M6IFtcInBkZmpzLWZyZWUtdGV4dC1kZWZhdWx0LWNvbnRlbnRcIl1cbiAgICB9KTtcbiAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICB0aGlzLl9pbnRlcm5hbFBhZGRpbmcgPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLWZyZWV0ZXh0LXBhZGRpbmdcIikpO1xuICB9XG4gIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkU6XG4gICAgICAgIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Rm9udFNpemUgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX0NPTE9SOlxuICAgICAgICBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdENvbG9yID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRTpcbiAgICAgICAgdGhpcy4jdXBkYXRlRm9udFNpemUodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1I6XG4gICAgICAgIHRoaXMuI3VwZGF0ZUNvbG9yKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW1tBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX0NPTE9SLCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdENvbG9yIHx8IEFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdXTtcbiAgfVxuICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsIHRoaXMuI2ZvbnRTaXplXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX0NPTE9SLCB0aGlzLiNjb2xvcl1dO1xuICB9XG4gICN1cGRhdGVGb250U2l6ZShmb250U2l6ZSkge1xuICAgIGNvbnN0IHNldEZvbnRzaXplID0gc2l6ZSA9PiB7XG4gICAgICB0aGlzLmVkaXRvckRpdi5zdHlsZS5mb250U2l6ZSA9IGBjYWxjKCR7c2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcbiAgICAgIHRoaXMudHJhbnNsYXRlKDAsIC0oc2l6ZSAtIHRoaXMuI2ZvbnRTaXplKSAqIHRoaXMucGFyZW50U2NhbGUpO1xuICAgICAgdGhpcy4jZm9udFNpemUgPSBzaXplO1xuICAgICAgdGhpcy4jc2V0RWRpdG9yRGltZW5zaW9ucygpO1xuICAgIH07XG4gICAgY29uc3Qgc2F2ZWRGb250c2l6ZSA9IHRoaXMuI2ZvbnRTaXplO1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiBzZXRGb250c2l6ZS5iaW5kKHRoaXMsIGZvbnRTaXplKSxcbiAgICAgIHVuZG86IHNldEZvbnRzaXplLmJpbmQodGhpcywgc2F2ZWRGb250c2l6ZSksXG4gICAgICBwb3N0OiB0aGlzLl91aU1hbmFnZXIudXBkYXRlVUkuYmluZCh0aGlzLl91aU1hbmFnZXIsIHRoaXMpLFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLFxuICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogdHJ1ZSxcbiAgICAgIGtlZXBVbmRvOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgI3VwZGF0ZUNvbG9yKGNvbG9yKSB7XG4gICAgY29uc3Qgc2V0Q29sb3IgPSBjb2wgPT4ge1xuICAgICAgdGhpcy4jY29sb3IgPSB0aGlzLmVkaXRvckRpdi5zdHlsZS5jb2xvciA9IGNvbDtcbiAgICB9O1xuICAgIGNvbnN0IHNhdmVkQ29sb3IgPSB0aGlzLiNjb2xvcjtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogc2V0Q29sb3IuYmluZCh0aGlzLCBjb2xvciksXG4gICAgICB1bmRvOiBzZXRDb2xvci5iaW5kKHRoaXMsIHNhdmVkQ29sb3IpLFxuICAgICAgcG9zdDogdGhpcy5fdWlNYW5hZ2VyLnVwZGF0ZVVJLmJpbmQodGhpcy5fdWlNYW5hZ2VyLCB0aGlzKSxcbiAgICAgIG11c3RFeGVjOiB0cnVlLFxuICAgICAgdHlwZTogQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1IsXG4gICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuICAgICAga2VlcFVuZG86IHRydWVcbiAgICB9KTtcbiAgfVxuICBfdHJhbnNsYXRlRW1wdHkoeCwgeSkge1xuICAgIHRoaXMuX3VpTWFuYWdlci50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMoeCwgeSwgdHJ1ZSk7XG4gIH1cbiAgZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCkge1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5wYXJlbnRTY2FsZTtcbiAgICByZXR1cm4gWy1GcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogc2NhbGUsIC0oRnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyArIHRoaXMuI2ZvbnRTaXplKSAqIHNjYWxlXTtcbiAgfVxuICByZWJ1aWxkKCkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIucmVidWlsZCgpO1xuICAgIGlmICh0aGlzLmRpdiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG4gICAgfVxuICB9XG4gIGVuYWJsZUVkaXRNb2RlKCkge1xuICAgIGlmICh0aGlzLmlzSW5FZGl0TW9kZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZShmYWxzZSk7XG4gICAgdGhpcy5wYXJlbnQudXBkYXRlVG9vbGJhcihBbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVCk7XG4gICAgc3VwZXIuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LnJlbW92ZShcImVuYWJsZWRcIik7XG4gICAgdGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZGl2LnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbDtcbiAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEVkaXRvckRpdktleWRvd24sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNib3VuZEVkaXRvckRpdkZvY3VzLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNib3VuZEVkaXRvckRpdkJsdXIsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB0aGlzLiNib3VuZEVkaXRvckRpdklucHV0LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZQYXN0ZSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgZGlzYWJsZUVkaXRNb2RlKCkge1xuICAgIGlmICghdGhpcy5pc0luRWRpdE1vZGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUodHJ1ZSk7XG4gICAgc3VwZXIuZGlzYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5hZGQoXCJlbmFibGVkXCIpO1xuICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZGl2LnNldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCB0aGlzLiNlZGl0b3JEaXZJZCk7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2S2V5ZG93bik7XG4gICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2Rm9jdXMpO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2Qmx1cik7XG4gICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2SW5wdXQpO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCB0aGlzLiNib3VuZEVkaXRvckRpdlBhc3RlKTtcbiAgICB0aGlzLmRpdi5mb2N1cyh7XG4gICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBhcmVudC5kaXYuY2xhc3NMaXN0LmFkZChcImZyZWV0ZXh0RWRpdGluZ1wiKTtcbiAgfVxuICBmb2N1c2luKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9mb2N1c0V2ZW50c0FsbG93ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuZm9jdXNpbihldmVudCk7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5lZGl0b3JEaXYpIHtcbiAgICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIG9uY2VBZGRlZCgpIHtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5lZGl0b3JEaXYuZm9jdXMoKTtcbiAgICBpZiAodGhpcy5faW5pdGlhbE9wdGlvbnM/LmlzQ2VudGVyZWQpIHtcbiAgICAgIHRoaXMuY2VudGVyKCk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxPcHRpb25zID0gbnVsbDtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5lZGl0b3JEaXYgfHwgdGhpcy5lZGl0b3JEaXYuaW5uZXJUZXh0LnRyaW0oKSA9PT0gXCJcIjtcbiAgfVxuICByZW1vdmUoKSB7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZSh0cnVlKTtcbiAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKFwiZnJlZXRleHRFZGl0aW5nXCIpO1xuICAgIH1cbiAgICBzdXBlci5yZW1vdmUoKTtcbiAgfVxuICAjZXh0cmFjdFRleHQoKSB7XG4gICAgY29uc3QgYnVmZmVyID0gW107XG4gICAgdGhpcy5lZGl0b3JEaXYubm9ybWFsaXplKCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmVkaXRvckRpdi5jaGlsZE5vZGVzKSB7XG4gICAgICBidWZmZXIucHVzaChGcmVlVGV4dEVkaXRvci4jZ2V0Tm9kZUNvbnRlbnQoY2hpbGQpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlci5qb2luKFwiXFxuXCIpO1xuICB9XG4gICNzZXRFZGl0b3JEaW1lbnNpb25zKCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBsZXQgcmVjdDtcbiAgICBpZiAodGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHJlY3QgPSB0aGlzLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjdXJyZW50TGF5ZXIsXG4gICAgICAgIGRpdlxuICAgICAgfSA9IHRoaXM7XG4gICAgICBjb25zdCBzYXZlZERpc3BsYXkgPSBkaXYuc3R5bGUuZGlzcGxheTtcbiAgICAgIGNvbnN0IHNhdmVkVmlzaWJpbGl0eSA9IGRpdi5jbGFzc0xpc3QuY29udGFpbnMoXCJoaWRkZW5cIik7XG4gICAgICBkaXYuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gXCJoaWRkZW5cIjtcbiAgICAgIGN1cnJlbnRMYXllci5kaXYuYXBwZW5kKHRoaXMuZGl2KTtcbiAgICAgIHJlY3QgPSBkaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBkaXYucmVtb3ZlKCk7XG4gICAgICBkaXYuc3R5bGUuZGlzcGxheSA9IHNhdmVkRGlzcGxheTtcbiAgICAgIGRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiaGlkZGVuXCIsIHNhdmVkVmlzaWJpbGl0eSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJvdGF0aW9uICUgMTgwID09PSB0aGlzLnBhcmVudFJvdGF0aW9uICUgMTgwKSB7XG4gICAgICB0aGlzLndpZHRoID0gcmVjdC53aWR0aCAvIHBhcmVudFdpZHRoO1xuICAgICAgdGhpcy5oZWlnaHQgPSByZWN0LmhlaWdodCAvIHBhcmVudEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53aWR0aCA9IHJlY3QuaGVpZ2h0IC8gcGFyZW50V2lkdGg7XG4gICAgICB0aGlzLmhlaWdodCA9IHJlY3Qud2lkdGggLyBwYXJlbnRIZWlnaHQ7XG4gICAgfVxuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgfVxuICBjb21taXQoKSB7XG4gICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmNvbW1pdCgpO1xuICAgIHRoaXMuZGlzYWJsZUVkaXRNb2RlKCk7XG4gICAgY29uc3Qgc2F2ZWRUZXh0ID0gdGhpcy4jY29udGVudDtcbiAgICBjb25zdCBuZXdUZXh0ID0gdGhpcy4jY29udGVudCA9IHRoaXMuI2V4dHJhY3RUZXh0KCkudHJpbUVuZCgpO1xuICAgIGlmIChzYXZlZFRleHQgPT09IG5ld1RleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2V0VGV4dCA9IHRleHQgPT4ge1xuICAgICAgdGhpcy4jY29udGVudCA9IHRleHQ7XG4gICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy4jc2V0Q29udGVudCgpO1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLnJlYnVpbGQodGhpcyk7XG4gICAgICB0aGlzLiNzZXRFZGl0b3JEaW1lbnNpb25zKCk7XG4gICAgfTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICBzZXRUZXh0KG5ld1RleHQpO1xuICAgICAgfSxcbiAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgc2V0VGV4dChzYXZlZFRleHQpO1xuICAgICAgfSxcbiAgICAgIG11c3RFeGVjOiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuI3NldEVkaXRvckRpbWVuc2lvbnMoKTtcbiAgfVxuICBzaG91bGRHZXRLZXlib2FyZEV2ZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0luRWRpdE1vZGUoKTtcbiAgfVxuICBlbnRlckluRWRpdE1vZGUoKSB7XG4gICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gIH1cbiAgZGJsY2xpY2soZXZlbnQpIHtcbiAgICB0aGlzLmVudGVySW5FZGl0TW9kZSgpO1xuICB9XG4gIGtleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLmRpdiAmJiBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xuICAgICAgdGhpcy5lbnRlckluRWRpdE1vZGUoKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG4gIGVkaXRvckRpdktleWRvd24oZXZlbnQpIHtcbiAgICBGcmVlVGV4dEVkaXRvci5fa2V5Ym9hcmRNYW5hZ2VyLmV4ZWModGhpcywgZXZlbnQpO1xuICB9XG4gIGVkaXRvckRpdkZvY3VzKGV2ZW50KSB7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuICB9XG4gIGVkaXRvckRpdkJsdXIoZXZlbnQpIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICB9XG4gIGVkaXRvckRpdklucHV0KGV2ZW50KSB7XG4gICAgdGhpcy5wYXJlbnQuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJmcmVldGV4dEVkaXRpbmdcIiwgdGhpcy5pc0VtcHR5KCkpO1xuICB9XG4gIGRpc2FibGVFZGl0aW5nKCkge1xuICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJjb21tZW50XCIpO1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtbXVsdGlsaW5lXCIpO1xuICB9XG4gIGVuYWJsZUVkaXRpbmcoKSB7XG4gICAgdGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInRleHRib3hcIik7XG4gICAgdGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1tdWx0aWxpbmVcIiwgdHJ1ZSk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLmRpdikge1xuICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgIH1cbiAgICBsZXQgYmFzZVgsIGJhc2VZO1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICBiYXNlWCA9IHRoaXMueDtcbiAgICAgIGJhc2VZID0gdGhpcy55O1xuICAgIH1cbiAgICBzdXBlci5yZW5kZXIoKTtcbiAgICB0aGlzLmVkaXRvckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5lZGl0b3JEaXYuY2xhc3NOYW1lID0gXCJpbnRlcm5hbFwiO1xuICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImlkXCIsIHRoaXMuI2VkaXRvckRpdklkKTtcbiAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1mcmVlLXRleHRcIik7XG4gICAgdGhpcy5lbmFibGVFZGl0aW5nKCk7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5fbDEwblByb21pc2UuZ2V0KFwicGRmanMtZnJlZS10ZXh0LWRlZmF1bHQtY29udGVudFwiKS50aGVuKG1zZyA9PiB0aGlzLmVkaXRvckRpdj8uc2V0QXR0cmlidXRlKFwiZGVmYXVsdC1jb250ZW50XCIsIG1zZykpO1xuICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG4gICAgY29uc3Qge1xuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy5lZGl0b3JEaXY7XG4gICAgc3R5bGUuZm9udFNpemUgPSBgY2FsYygke3RoaXMuI2ZvbnRTaXplfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO1xuICAgIHN0eWxlLmNvbG9yID0gdGhpcy4jY29sb3I7XG4gICAgdGhpcy5kaXYuYXBwZW5kKHRoaXMuZWRpdG9yRGl2KTtcbiAgICB0aGlzLm92ZXJsYXlEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKFwib3ZlcmxheVwiLCBcImVuYWJsZWRcIik7XG4gICAgdGhpcy5kaXYuYXBwZW5kKHRoaXMub3ZlcmxheURpdik7XG4gICAgYmluZEV2ZW50cyh0aGlzLCB0aGlzLmRpdiwgW1wiZGJsY2xpY2tcIiwgXCJrZXlkb3duXCJdKTtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcG9zaXRpb25cbiAgICAgICAgfSA9IHRoaXMuI2luaXRpYWxEYXRhO1xuICAgICAgICBsZXQgW3R4LCB0eV0gPSB0aGlzLmdldEluaXRpYWxUcmFuc2xhdGlvbigpO1xuICAgICAgICBbdHgsIHR5XSA9IHRoaXMucGFnZVRyYW5zbGF0aW9uVG9TY3JlZW4odHgsIHR5KTtcbiAgICAgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgICAgICBjb25zdCBbcGFnZVgsIHBhZ2VZXSA9IHRoaXMucGFnZVRyYW5zbGF0aW9uO1xuICAgICAgICBsZXQgcG9zWCwgcG9zWTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcG9zWCA9IGJhc2VYICsgKHBvc2l0aW9uWzBdIC0gcGFnZVgpIC8gcGFnZVdpZHRoO1xuICAgICAgICAgICAgcG9zWSA9IGJhc2VZICsgdGhpcy5oZWlnaHQgLSAocG9zaXRpb25bMV0gLSBwYWdlWSkgLyBwYWdlSGVpZ2h0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgIHBvc1ggPSBiYXNlWCArIChwb3NpdGlvblswXSAtIHBhZ2VYKSAvIHBhZ2VXaWR0aDtcbiAgICAgICAgICAgIHBvc1kgPSBiYXNlWSAtIChwb3NpdGlvblsxXSAtIHBhZ2VZKSAvIHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgICBbdHgsIHR5XSA9IFt0eSwgLXR4XTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTgwOlxuICAgICAgICAgICAgcG9zWCA9IGJhc2VYIC0gdGhpcy53aWR0aCArIChwb3NpdGlvblswXSAtIHBhZ2VYKSAvIHBhZ2VXaWR0aDtcbiAgICAgICAgICAgIHBvc1kgPSBiYXNlWSAtIChwb3NpdGlvblsxXSAtIHBhZ2VZKSAvIHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgICBbdHgsIHR5XSA9IFstdHgsIC10eV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgIHBvc1ggPSBiYXNlWCArIChwb3NpdGlvblswXSAtIHBhZ2VYIC0gdGhpcy5oZWlnaHQgKiBwYWdlSGVpZ2h0KSAvIHBhZ2VXaWR0aDtcbiAgICAgICAgICAgIHBvc1kgPSBiYXNlWSArIChwb3NpdGlvblsxXSAtIHBhZ2VZIC0gdGhpcy53aWR0aCAqIHBhZ2VXaWR0aCkgLyBwYWdlSGVpZ2h0O1xuICAgICAgICAgICAgW3R4LCB0eV0gPSBbLXR5LCB0eF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEF0KHBvc1ggKiBwYXJlbnRXaWR0aCwgcG9zWSAqIHBhcmVudEhlaWdodCwgdHgsIHR5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0QXQoYmFzZVggKiBwYXJlbnRXaWR0aCwgYmFzZVkgKiBwYXJlbnRIZWlnaHQsIHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgICAgfVxuICAgICAgdGhpcy4jc2V0Q29udGVudCgpO1xuICAgICAgdGhpcy5faXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgdGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaXY7XG4gIH1cbiAgc3RhdGljICNnZXROb2RlQ29udGVudChub2RlKSB7XG4gICAgcmV0dXJuIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSA/IG5vZGUubm9kZVZhbHVlIDogbm9kZS5pbm5lclRleHQpLnJlcGxhY2VBbGwoRU9MX1BBVFRFUk4sIFwiXCIpO1xuICB9XG4gIGVkaXRvckRpdlBhc3RlKGV2ZW50KSB7XG4gICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGEgfHwgd2luZG93LmNsaXBib2FyZERhdGE7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZXNcbiAgICB9ID0gY2xpcGJvYXJkRGF0YTtcbiAgICBpZiAodHlwZXMubGVuZ3RoID09PSAxICYmIHR5cGVzWzBdID09PSBcInRleHQvcGxhaW5cIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHBhc3RlID0gRnJlZVRleHRFZGl0b3IuI2Rlc2VyaWFsaXplQ29udGVudChjbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0XCIpIHx8IFwiXCIpLnJlcGxhY2VBbGwoRU9MX1BBVFRFUk4sIFwiXFxuXCIpO1xuICAgIGlmICghcGFzdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lZGl0b3JEaXYubm9ybWFsaXplKCk7XG4gICAgc2VsZWN0aW9uLmRlbGV0ZUZyb21Eb2N1bWVudCgpO1xuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgaWYgKCFwYXN0ZS5pbmNsdWRlcyhcIlxcblwiKSkge1xuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXN0ZSkpO1xuICAgICAgdGhpcy5lZGl0b3JEaXYubm9ybWFsaXplKCk7XG4gICAgICBzZWxlY3Rpb24uY29sbGFwc2VUb1N0YXJ0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHN0YXJ0Q29udGFpbmVyLFxuICAgICAgc3RhcnRPZmZzZXRcbiAgICB9ID0gcmFuZ2U7XG4gICAgY29uc3QgYnVmZmVyQmVmb3JlID0gW107XG4gICAgY29uc3QgYnVmZmVyQWZ0ZXIgPSBbXTtcbiAgICBpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBzdGFydENvbnRhaW5lci5wYXJlbnRFbGVtZW50O1xuICAgICAgYnVmZmVyQWZ0ZXIucHVzaChzdGFydENvbnRhaW5lci5ub2RlVmFsdWUuc2xpY2Uoc3RhcnRPZmZzZXQpLnJlcGxhY2VBbGwoRU9MX1BBVFRFUk4sIFwiXCIpKTtcbiAgICAgIGlmIChwYXJlbnQgIT09IHRoaXMuZWRpdG9yRGl2KSB7XG4gICAgICAgIGxldCBidWZmZXIgPSBidWZmZXJCZWZvcmU7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5lZGl0b3JEaXYuY2hpbGROb2Rlcykge1xuICAgICAgICAgIGlmIChjaGlsZCA9PT0gcGFyZW50KSB7XG4gICAgICAgICAgICBidWZmZXIgPSBidWZmZXJBZnRlcjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBidWZmZXIucHVzaChGcmVlVGV4dEVkaXRvci4jZ2V0Tm9kZUNvbnRlbnQoY2hpbGQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnVmZmVyQmVmb3JlLnB1c2goc3RhcnRDb250YWluZXIubm9kZVZhbHVlLnNsaWNlKDAsIHN0YXJ0T2Zmc2V0KS5yZXBsYWNlQWxsKEVPTF9QQVRURVJOLCBcIlwiKSk7XG4gICAgfSBlbHNlIGlmIChzdGFydENvbnRhaW5lciA9PT0gdGhpcy5lZGl0b3JEaXYpIHtcbiAgICAgIGxldCBidWZmZXIgPSBidWZmZXJCZWZvcmU7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuZWRpdG9yRGl2LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgaWYgKGkrKyA9PT0gc3RhcnRPZmZzZXQpIHtcbiAgICAgICAgICBidWZmZXIgPSBidWZmZXJBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIucHVzaChGcmVlVGV4dEVkaXRvci4jZ2V0Tm9kZUNvbnRlbnQoY2hpbGQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jY29udGVudCA9IGAke2J1ZmZlckJlZm9yZS5qb2luKFwiXFxuXCIpfSR7cGFzdGV9JHtidWZmZXJBZnRlci5qb2luKFwiXFxuXCIpfWA7XG4gICAgdGhpcy4jc2V0Q29udGVudCgpO1xuICAgIGNvbnN0IG5ld1JhbmdlID0gbmV3IFJhbmdlKCk7XG4gICAgbGV0IGJlZm9yZUxlbmd0aCA9IGJ1ZmZlckJlZm9yZS5yZWR1Y2UoKGFjYywgbGluZSkgPT4gYWNjICsgbGluZS5sZW5ndGgsIDApO1xuICAgIGZvciAoY29uc3Qge1xuICAgICAgZmlyc3RDaGlsZFxuICAgIH0gb2YgdGhpcy5lZGl0b3JEaXYuY2hpbGROb2Rlcykge1xuICAgICAgaWYgKGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGZpcnN0Q2hpbGQubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgICAgaWYgKGJlZm9yZUxlbmd0aCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICBuZXdSYW5nZS5zZXRTdGFydChmaXJzdENoaWxkLCBiZWZvcmVMZW5ndGgpO1xuICAgICAgICAgIG5ld1JhbmdlLnNldEVuZChmaXJzdENoaWxkLCBiZWZvcmVMZW5ndGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJlZm9yZUxlbmd0aCAtPSBsZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UobmV3UmFuZ2UpO1xuICB9XG4gICNzZXRDb250ZW50KCkge1xuICAgIHRoaXMuZWRpdG9yRGl2LnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIGlmICghdGhpcy4jY29udGVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy4jY29udGVudC5zcGxpdChcIlxcblwiKSkge1xuICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGRpdi5hcHBlbmQobGluZSA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgIHRoaXMuZWRpdG9yRGl2LmFwcGVuZChkaXYpO1xuICAgIH1cbiAgfVxuICAjc2VyaWFsaXplQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY29udGVudC5yZXBsYWNlQWxsKFwiXFx4YTBcIiwgXCIgXCIpO1xuICB9XG4gIHN0YXRpYyAjZGVzZXJpYWxpemVDb250ZW50KGNvbnRlbnQpIHtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKFwiIFwiLCBcIlxceGEwXCIpO1xuICB9XG4gIGdldCBjb250ZW50RGl2KCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvckRpdjtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBsZXQgaW5pdGlhbERhdGEgPSBudWxsO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgZGVmYXVsdEFwcGVhcmFuY2VEYXRhOiB7XG4gICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgIGZvbnRDb2xvclxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVjdCxcbiAgICAgICAgICByb3RhdGlvbixcbiAgICAgICAgICBpZFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0Q29udGVudCxcbiAgICAgICAgdGV4dFBvc2l0aW9uLFxuICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgICBwYWdlTnVtYmVyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9ID0gZGF0YTtcbiAgICAgIGlmICghdGV4dENvbnRlbnQgfHwgdGV4dENvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaW5pdGlhbERhdGEgPSBkYXRhID0ge1xuICAgICAgICBhbm5vdGF0aW9uVHlwZTogQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsXG4gICAgICAgIGNvbG9yOiBBcnJheS5mcm9tKGZvbnRDb2xvciksXG4gICAgICAgIGZvbnRTaXplLFxuICAgICAgICB2YWx1ZTogdGV4dENvbnRlbnQuam9pbihcIlxcblwiKSxcbiAgICAgICAgcG9zaXRpb246IHRleHRQb3NpdGlvbixcbiAgICAgICAgcGFnZUluZGV4OiBwYWdlTnVtYmVyIC0gMSxcbiAgICAgICAgcmVjdDogcmVjdC5zbGljZSgwKSxcbiAgICAgICAgcm90YXRpb24sXG4gICAgICAgIGlkLFxuICAgICAgICBkZWxldGVkOiBmYWxzZVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgZWRpdG9yID0gc3VwZXIuZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpO1xuICAgIGVkaXRvci4jZm9udFNpemUgPSBkYXRhLmZvbnRTaXplO1xuICAgIGVkaXRvci4jY29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5kYXRhLmNvbG9yKTtcbiAgICBlZGl0b3IuI2NvbnRlbnQgPSBGcmVlVGV4dEVkaXRvci4jZGVzZXJpYWxpemVDb250ZW50KGRhdGEudmFsdWUpO1xuICAgIGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkID0gZGF0YS5pZCB8fCBudWxsO1xuICAgIGVkaXRvci4jaW5pdGlhbERhdGEgPSBpbml0aWFsRGF0YTtcbiAgICByZXR1cm4gZWRpdG9yO1xuICB9XG4gIHNlcmlhbGl6ZShpc0ZvckNvcHlpbmcgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlbGV0ZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICAgIGlkOiB0aGlzLmFubm90YXRpb25FbGVtZW50SWQsXG4gICAgICAgIGRlbGV0ZWQ6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHBhZGRpbmcgPSBGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogdGhpcy5wYXJlbnRTY2FsZTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRSZWN0KHBhZGRpbmcsIHBhZGRpbmcpO1xuICAgIGNvbnN0IGNvbG9yID0gQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5pc0F0dGFjaGVkVG9ET00gPyBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWRpdG9yRGl2KS5jb2xvciA6IHRoaXMuI2NvbG9yKTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0ge1xuICAgICAgYW5ub3RhdGlvblR5cGU6IEFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhULFxuICAgICAgY29sb3IsXG4gICAgICBmb250U2l6ZTogdGhpcy4jZm9udFNpemUsXG4gICAgICB2YWx1ZTogdGhpcy4jc2VyaWFsaXplQ29udGVudCgpLFxuICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgIHJlY3QsXG4gICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbixcbiAgICAgIHN0cnVjdFRyZWVQYXJlbnRJZDogdGhpcy5fc3RydWN0VHJlZVBhcmVudElkXG4gICAgfTtcbiAgICBpZiAoaXNGb3JDb3B5aW5nKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCAmJiAhdGhpcy4jaGFzRWxlbWVudENoYW5nZWQoc2VyaWFsaXplZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXJpYWxpemVkLmlkID0gdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkO1xuICAgIHJldHVybiBzZXJpYWxpemVkO1xuICB9XG4gICNoYXNFbGVtZW50Q2hhbmdlZChzZXJpYWxpemVkKSB7XG4gICAgY29uc3Qge1xuICAgICAgdmFsdWUsXG4gICAgICBmb250U2l6ZSxcbiAgICAgIGNvbG9yLFxuICAgICAgcGFnZUluZGV4XG4gICAgfSA9IHRoaXMuI2luaXRpYWxEYXRhO1xuICAgIHJldHVybiB0aGlzLl9oYXNCZWVuTW92ZWQgfHwgc2VyaWFsaXplZC52YWx1ZSAhPT0gdmFsdWUgfHwgc2VyaWFsaXplZC5mb250U2l6ZSAhPT0gZm9udFNpemUgfHwgc2VyaWFsaXplZC5jb2xvci5zb21lKChjLCBpKSA9PiBjICE9PSBjb2xvcltpXSkgfHwgc2VyaWFsaXplZC5wYWdlSW5kZXggIT09IHBhZ2VJbmRleDtcbiAgfVxuICByZW5kZXJBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uKSB7XG4gICAgY29uc3QgY29udGVudCA9IHN1cGVyLnJlbmRlckFubm90YXRpb25FbGVtZW50KGFubm90YXRpb24pO1xuICAgIGlmICh0aGlzLmRlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBzdHlsZVxuICAgIH0gPSBjb250ZW50O1xuICAgIHN0eWxlLmZvbnRTaXplID0gYGNhbGMoJHt0aGlzLiNmb250U2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcbiAgICBzdHlsZS5jb2xvciA9IHRoaXMuI2NvbG9yO1xuICAgIGNvbnRlbnQucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMuI2NvbnRlbnQuc3BsaXQoXCJcXG5cIikpIHtcbiAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBkaXYuYXBwZW5kKGxpbmUgPyBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XG4gICAgICBjb250ZW50LmFwcGVuZChkaXYpO1xuICAgIH1cbiAgICBjb25zdCBwYWRkaW5nID0gRnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyAqIHRoaXMucGFyZW50U2NhbGU7XG4gICAgYW5ub3RhdGlvbi51cGRhdGVFZGl0ZWQoe1xuICAgICAgcmVjdDogdGhpcy5nZXRSZWN0KHBhZGRpbmcsIHBhZGRpbmcpLFxuICAgICAgcG9wdXBDb250ZW50OiB0aGlzLiNjb250ZW50XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgcmVzZXRBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uKSB7XG4gICAgc3VwZXIucmVzZXRBbm5vdGF0aW9uRWxlbWVudChhbm5vdGF0aW9uKTtcbiAgICBhbm5vdGF0aW9uLnJlc2V0RWRpdGVkKCk7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL291dGxpbmVyLmpzXG5cbmNsYXNzIE91dGxpbmVyIHtcbiAgI2JveDtcbiAgI3ZlcnRpY2FsRWRnZXMgPSBbXTtcbiAgI2ludGVydmFscyA9IFtdO1xuICBjb25zdHJ1Y3Rvcihib3hlcywgYm9yZGVyV2lkdGggPSAwLCBpbm5lck1hcmdpbiA9IDAsIGlzTFRSID0gdHJ1ZSkge1xuICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBjb25zdCBOVU1CRVJfT0ZfRElHSVRTID0gNDtcbiAgICBjb25zdCBFUFNJTE9OID0gMTAgKiogLU5VTUJFUl9PRl9ESUdJVFM7XG4gICAgZm9yIChjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSBvZiBib3hlcykge1xuICAgICAgY29uc3QgeDEgPSBNYXRoLmZsb29yKCh4IC0gYm9yZGVyV2lkdGgpIC8gRVBTSUxPTikgKiBFUFNJTE9OO1xuICAgICAgY29uc3QgeDIgPSBNYXRoLmNlaWwoKHggKyB3aWR0aCArIGJvcmRlcldpZHRoKSAvIEVQU0lMT04pICogRVBTSUxPTjtcbiAgICAgIGNvbnN0IHkxID0gTWF0aC5mbG9vcigoeSAtIGJvcmRlcldpZHRoKSAvIEVQU0lMT04pICogRVBTSUxPTjtcbiAgICAgIGNvbnN0IHkyID0gTWF0aC5jZWlsKCh5ICsgaGVpZ2h0ICsgYm9yZGVyV2lkdGgpIC8gRVBTSUxPTikgKiBFUFNJTE9OO1xuICAgICAgY29uc3QgbGVmdCA9IFt4MSwgeTEsIHkyLCB0cnVlXTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gW3gyLCB5MSwgeTIsIGZhbHNlXTtcbiAgICAgIHRoaXMuI3ZlcnRpY2FsRWRnZXMucHVzaChsZWZ0LCByaWdodCk7XG4gICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeDEpO1xuICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgyKTtcbiAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5MSk7XG4gICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeTIpO1xuICAgIH1cbiAgICBjb25zdCBiYm94V2lkdGggPSBtYXhYIC0gbWluWCArIDIgKiBpbm5lck1hcmdpbjtcbiAgICBjb25zdCBiYm94SGVpZ2h0ID0gbWF4WSAtIG1pblkgKyAyICogaW5uZXJNYXJnaW47XG4gICAgY29uc3Qgc2hpZnRlZE1pblggPSBtaW5YIC0gaW5uZXJNYXJnaW47XG4gICAgY29uc3Qgc2hpZnRlZE1pblkgPSBtaW5ZIC0gaW5uZXJNYXJnaW47XG4gICAgY29uc3QgbGFzdEVkZ2UgPSB0aGlzLiN2ZXJ0aWNhbEVkZ2VzLmF0KGlzTFRSID8gLTEgOiAtMik7XG4gICAgY29uc3QgbGFzdFBvaW50ID0gW2xhc3RFZGdlWzBdLCBsYXN0RWRnZVsyXV07XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIHRoaXMuI3ZlcnRpY2FsRWRnZXMpIHtcbiAgICAgIGNvbnN0IFt4LCB5MSwgeTJdID0gZWRnZTtcbiAgICAgIGVkZ2VbMF0gPSAoeCAtIHNoaWZ0ZWRNaW5YKSAvIGJib3hXaWR0aDtcbiAgICAgIGVkZ2VbMV0gPSAoeTEgLSBzaGlmdGVkTWluWSkgLyBiYm94SGVpZ2h0O1xuICAgICAgZWRnZVsyXSA9ICh5MiAtIHNoaWZ0ZWRNaW5ZKSAvIGJib3hIZWlnaHQ7XG4gICAgfVxuICAgIHRoaXMuI2JveCA9IHtcbiAgICAgIHg6IHNoaWZ0ZWRNaW5YLFxuICAgICAgeTogc2hpZnRlZE1pblksXG4gICAgICB3aWR0aDogYmJveFdpZHRoLFxuICAgICAgaGVpZ2h0OiBiYm94SGVpZ2h0LFxuICAgICAgbGFzdFBvaW50XG4gICAgfTtcbiAgfVxuICBnZXRPdXRsaW5lcygpIHtcbiAgICB0aGlzLiN2ZXJ0aWNhbEVkZ2VzLnNvcnQoKGEsIGIpID0+IGFbMF0gLSBiWzBdIHx8IGFbMV0gLSBiWzFdIHx8IGFbMl0gLSBiWzJdKTtcbiAgICBjb25zdCBvdXRsaW5lVmVydGljYWxFZGdlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZWRnZSBvZiB0aGlzLiN2ZXJ0aWNhbEVkZ2VzKSB7XG4gICAgICBpZiAoZWRnZVszXSkge1xuICAgICAgICBvdXRsaW5lVmVydGljYWxFZGdlcy5wdXNoKC4uLnRoaXMuI2JyZWFrRWRnZShlZGdlKSk7XG4gICAgICAgIHRoaXMuI2luc2VydChlZGdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI3JlbW92ZShlZGdlKTtcbiAgICAgICAgb3V0bGluZVZlcnRpY2FsRWRnZXMucHVzaCguLi50aGlzLiNicmVha0VkZ2UoZWRnZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jZ2V0T3V0bGluZXMob3V0bGluZVZlcnRpY2FsRWRnZXMpO1xuICB9XG4gICNnZXRPdXRsaW5lcyhvdXRsaW5lVmVydGljYWxFZGdlcykge1xuICAgIGNvbnN0IGVkZ2VzID0gW107XG4gICAgY29uc3QgYWxsRWRnZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIG91dGxpbmVWZXJ0aWNhbEVkZ2VzKSB7XG4gICAgICBjb25zdCBbeCwgeTEsIHkyXSA9IGVkZ2U7XG4gICAgICBlZGdlcy5wdXNoKFt4LCB5MSwgZWRnZV0sIFt4LCB5MiwgZWRnZV0pO1xuICAgIH1cbiAgICBlZGdlcy5zb3J0KChhLCBiKSA9PiBhWzFdIC0gYlsxXSB8fCBhWzBdIC0gYlswXSk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZWRnZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgY29uc3QgZWRnZTEgPSBlZGdlc1tpXVsyXTtcbiAgICAgIGNvbnN0IGVkZ2UyID0gZWRnZXNbaSArIDFdWzJdO1xuICAgICAgZWRnZTEucHVzaChlZGdlMik7XG4gICAgICBlZGdlMi5wdXNoKGVkZ2UxKTtcbiAgICAgIGFsbEVkZ2VzLmFkZChlZGdlMSk7XG4gICAgICBhbGxFZGdlcy5hZGQoZWRnZTIpO1xuICAgIH1cbiAgICBjb25zdCBvdXRsaW5lcyA9IFtdO1xuICAgIGxldCBvdXRsaW5lO1xuICAgIHdoaWxlIChhbGxFZGdlcy5zaXplID4gMCkge1xuICAgICAgY29uc3QgZWRnZSA9IGFsbEVkZ2VzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGxldCBbeCwgeTEsIHkyLCBlZGdlMSwgZWRnZTJdID0gZWRnZTtcbiAgICAgIGFsbEVkZ2VzLmRlbGV0ZShlZGdlKTtcbiAgICAgIGxldCBsYXN0UG9pbnRYID0geDtcbiAgICAgIGxldCBsYXN0UG9pbnRZID0geTE7XG4gICAgICBvdXRsaW5lID0gW3gsIHkyXTtcbiAgICAgIG91dGxpbmVzLnB1c2gob3V0bGluZSk7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgZTtcbiAgICAgICAgaWYgKGFsbEVkZ2VzLmhhcyhlZGdlMSkpIHtcbiAgICAgICAgICBlID0gZWRnZTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYWxsRWRnZXMuaGFzKGVkZ2UyKSkge1xuICAgICAgICAgIGUgPSBlZGdlMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBhbGxFZGdlcy5kZWxldGUoZSk7XG4gICAgICAgIFt4LCB5MSwgeTIsIGVkZ2UxLCBlZGdlMl0gPSBlO1xuICAgICAgICBpZiAobGFzdFBvaW50WCAhPT0geCkge1xuICAgICAgICAgIG91dGxpbmUucHVzaChsYXN0UG9pbnRYLCBsYXN0UG9pbnRZLCB4LCBsYXN0UG9pbnRZID09PSB5MSA/IHkxIDogeTIpO1xuICAgICAgICAgIGxhc3RQb2ludFggPSB4O1xuICAgICAgICB9XG4gICAgICAgIGxhc3RQb2ludFkgPSBsYXN0UG9pbnRZID09PSB5MSA/IHkyIDogeTE7XG4gICAgICB9XG4gICAgICBvdXRsaW5lLnB1c2gobGFzdFBvaW50WCwgbGFzdFBvaW50WSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0T3V0bGluZShvdXRsaW5lcywgdGhpcy4jYm94KTtcbiAgfVxuICAjYmluYXJ5U2VhcmNoKHkpIHtcbiAgICBjb25zdCBhcnJheSA9IHRoaXMuI2ludGVydmFscztcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBlbmQgPSBhcnJheS5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzdGFydCA8PSBlbmQpIHtcbiAgICAgIGNvbnN0IG1pZGRsZSA9IHN0YXJ0ICsgZW5kID4+IDE7XG4gICAgICBjb25zdCB5MSA9IGFycmF5W21pZGRsZV1bMF07XG4gICAgICBpZiAoeTEgPT09IHkpIHtcbiAgICAgICAgcmV0dXJuIG1pZGRsZTtcbiAgICAgIH1cbiAgICAgIGlmICh5MSA8IHkpIHtcbiAgICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gbWlkZGxlIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVuZCArIDE7XG4gIH1cbiAgI2luc2VydChbLCB5MSwgeTJdKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNiaW5hcnlTZWFyY2goeTEpO1xuICAgIHRoaXMuI2ludGVydmFscy5zcGxpY2UoaW5kZXgsIDAsIFt5MSwgeTJdKTtcbiAgfVxuICAjcmVtb3ZlKFssIHkxLCB5Ml0pIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuI2JpbmFyeVNlYXJjaCh5MSk7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgdGhpcy4jaW50ZXJ2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSB0aGlzLiNpbnRlcnZhbHNbaV07XG4gICAgICBpZiAoc3RhcnQgIT09IHkxKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ID09PSB5MSAmJiBlbmQgPT09IHkyKSB7XG4gICAgICAgIHRoaXMuI2ludGVydmFscy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IGluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuI2ludGVydmFsc1tpXTtcbiAgICAgIGlmIChzdGFydCAhPT0geTEpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhcnQgPT09IHkxICYmIGVuZCA9PT0geTIpIHtcbiAgICAgICAgdGhpcy4jaW50ZXJ2YWxzLnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAjYnJlYWtFZGdlKGVkZ2UpIHtcbiAgICBjb25zdCBbeCwgeTEsIHkyXSA9IGVkZ2U7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtbeCwgeTEsIHkyXV07XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiNiaW5hcnlTZWFyY2goeTIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykge1xuICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy4jaW50ZXJ2YWxzW2ldO1xuICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gcmVzdWx0cy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgIGNvbnN0IFssIHkzLCB5NF0gPSByZXN1bHRzW2pdO1xuICAgICAgICBpZiAoZW5kIDw9IHkzIHx8IHk0IDw9IHN0YXJ0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHkzID49IHN0YXJ0KSB7XG4gICAgICAgICAgaWYgKHk0ID4gZW5kKSB7XG4gICAgICAgICAgICByZXN1bHRzW2pdWzFdID0gZW5kO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoamogPT09IDEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0cy5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgICBqLS07XG4gICAgICAgICAgICBqai0tO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRzW2pdWzJdID0gc3RhcnQ7XG4gICAgICAgIGlmICh5NCA+IGVuZCkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChbeCwgZW5kLCB5NF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG5jbGFzcyBPdXRsaW5lIHtcbiAgdG9TVkdQYXRoKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0IG1ldGhvZCBgdG9TVkdQYXRoYCBtdXN0IGJlIGltcGxlbWVudGVkLlwiKTtcbiAgfVxuICBnZXQgYm94KCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0IGdldHRlciBgYm94YCBtdXN0IGJlIGltcGxlbWVudGVkLlwiKTtcbiAgfVxuICBzZXJpYWxpemUoX2Jib3gsIF9yb3RhdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkFic3RyYWN0IG1ldGhvZCBgc2VyaWFsaXplYCBtdXN0IGJlIGltcGxlbWVudGVkLlwiKTtcbiAgfVxuICBnZXQgZnJlZSgpIHtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIEZyZWVIaWdobGlnaHRPdXRsaW5lO1xuICB9XG59XG5jbGFzcyBIaWdobGlnaHRPdXRsaW5lIGV4dGVuZHMgT3V0bGluZSB7XG4gICNib3g7XG4gICNvdXRsaW5lcztcbiAgY29uc3RydWN0b3Iob3V0bGluZXMsIGJveCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jb3V0bGluZXMgPSBvdXRsaW5lcztcbiAgICB0aGlzLiNib3ggPSBib3g7XG4gIH1cbiAgdG9TVkdQYXRoKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IFtdO1xuICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiB0aGlzLiNvdXRsaW5lcykge1xuICAgICAgbGV0IFtwcmV2WCwgcHJldlldID0gcG9seWdvbjtcbiAgICAgIGJ1ZmZlci5wdXNoKGBNJHtwcmV2WH0gJHtwcmV2WX1gKTtcbiAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBjb25zdCB4ID0gcG9seWdvbltpXTtcbiAgICAgICAgY29uc3QgeSA9IHBvbHlnb25baSArIDFdO1xuICAgICAgICBpZiAoeCA9PT0gcHJldlgpIHtcbiAgICAgICAgICBidWZmZXIucHVzaChgViR7eX1gKTtcbiAgICAgICAgICBwcmV2WSA9IHk7XG4gICAgICAgIH0gZWxzZSBpZiAoeSA9PT0gcHJldlkpIHtcbiAgICAgICAgICBidWZmZXIucHVzaChgSCR7eH1gKTtcbiAgICAgICAgICBwcmV2WCA9IHg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJ1ZmZlci5wdXNoKFwiWlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlci5qb2luKFwiIFwiKTtcbiAgfVxuICBzZXJpYWxpemUoW2JsWCwgYmxZLCB0clgsIHRyWV0sIF9yb3RhdGlvbikge1xuICAgIGNvbnN0IG91dGxpbmVzID0gW107XG4gICAgY29uc3Qgd2lkdGggPSB0clggLSBibFg7XG4gICAgY29uc3QgaGVpZ2h0ID0gdHJZIC0gYmxZO1xuICAgIGZvciAoY29uc3Qgb3V0bGluZSBvZiB0aGlzLiNvdXRsaW5lcykge1xuICAgICAgY29uc3QgcG9pbnRzID0gbmV3IEFycmF5KG91dGxpbmUubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0bGluZS5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBwb2ludHNbaV0gPSBibFggKyBvdXRsaW5lW2ldICogd2lkdGg7XG4gICAgICAgIHBvaW50c1tpICsgMV0gPSB0clkgLSBvdXRsaW5lW2kgKyAxXSAqIGhlaWdodDtcbiAgICAgIH1cbiAgICAgIG91dGxpbmVzLnB1c2gocG9pbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dGxpbmVzO1xuICB9XG4gIGdldCBib3goKSB7XG4gICAgcmV0dXJuIHRoaXMuI2JveDtcbiAgfVxufVxuY2xhc3MgRnJlZU91dGxpbmVyIHtcbiAgI2JveDtcbiAgI2JvdHRvbSA9IFtdO1xuICAjaW5uZXJNYXJnaW47XG4gICNpc0xUUjtcbiAgI3RvcCA9IFtdO1xuICAjbGFzdCA9IG5ldyBGbG9hdDY0QXJyYXkoMTgpO1xuICAjbGFzdFg7XG4gICNsYXN0WTtcbiAgI21pbjtcbiAgI21pbl9kaXN0O1xuICAjc2NhbGVGYWN0b3I7XG4gICN0aGlja25lc3M7XG4gICNwb2ludHMgPSBbXTtcbiAgc3RhdGljICNNSU5fRElTVCA9IDg7XG4gIHN0YXRpYyAjTUlOX0RJRkYgPSAyO1xuICBzdGF0aWMgI01JTiA9IEZyZWVPdXRsaW5lci4jTUlOX0RJU1QgKyBGcmVlT3V0bGluZXIuI01JTl9ESUZGO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgeCxcbiAgICB5XG4gIH0sIGJveCwgc2NhbGVGYWN0b3IsIHRoaWNrbmVzcywgaXNMVFIsIGlubmVyTWFyZ2luID0gMCkge1xuICAgIHRoaXMuI2JveCA9IGJveDtcbiAgICB0aGlzLiN0aGlja25lc3MgPSB0aGlja25lc3MgKiBzY2FsZUZhY3RvcjtcbiAgICB0aGlzLiNpc0xUUiA9IGlzTFRSO1xuICAgIHRoaXMuI2xhc3Quc2V0KFtOYU4sIE5hTiwgTmFOLCBOYU4sIHgsIHldLCA2KTtcbiAgICB0aGlzLiNpbm5lck1hcmdpbiA9IGlubmVyTWFyZ2luO1xuICAgIHRoaXMuI21pbl9kaXN0ID0gRnJlZU91dGxpbmVyLiNNSU5fRElTVCAqIHNjYWxlRmFjdG9yO1xuICAgIHRoaXMuI21pbiA9IEZyZWVPdXRsaW5lci4jTUlOICogc2NhbGVGYWN0b3I7XG4gICAgdGhpcy4jc2NhbGVGYWN0b3IgPSBzY2FsZUZhY3RvcjtcbiAgICB0aGlzLiNwb2ludHMucHVzaCh4LCB5KTtcbiAgfVxuICBnZXQgZnJlZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiBpc05hTih0aGlzLiNsYXN0WzhdKTtcbiAgfVxuICAjZ2V0TGFzdENvb3JkcygpIHtcbiAgICBjb25zdCBsYXN0VG9wID0gdGhpcy4jbGFzdC5zdWJhcnJheSg0LCA2KTtcbiAgICBjb25zdCBsYXN0Qm90dG9tID0gdGhpcy4jbGFzdC5zdWJhcnJheSgxNiwgMTgpO1xuICAgIGNvbnN0IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSA9IHRoaXMuI2JveDtcbiAgICByZXR1cm4gWyh0aGlzLiNsYXN0WCArIChsYXN0VG9wWzBdIC0gbGFzdEJvdHRvbVswXSkgLyAyIC0geCkgLyB3aWR0aCwgKHRoaXMuI2xhc3RZICsgKGxhc3RUb3BbMV0gLSBsYXN0Qm90dG9tWzFdKSAvIDIgLSB5KSAvIGhlaWdodCwgKHRoaXMuI2xhc3RYICsgKGxhc3RCb3R0b21bMF0gLSBsYXN0VG9wWzBdKSAvIDIgLSB4KSAvIHdpZHRoLCAodGhpcy4jbGFzdFkgKyAobGFzdEJvdHRvbVsxXSAtIGxhc3RUb3BbMV0pIC8gMiAtIHkpIC8gaGVpZ2h0XTtcbiAgfVxuICBhZGQoe1xuICAgIHgsXG4gICAgeVxuICB9KSB7XG4gICAgdGhpcy4jbGFzdFggPSB4O1xuICAgIHRoaXMuI2xhc3RZID0geTtcbiAgICBjb25zdCBbbGF5ZXJYLCBsYXllclksIGxheWVyV2lkdGgsIGxheWVySGVpZ2h0XSA9IHRoaXMuI2JveDtcbiAgICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoOCwgMTIpO1xuICAgIGNvbnN0IGRpZmZYID0geCAtIHgyO1xuICAgIGNvbnN0IGRpZmZZID0geSAtIHkyO1xuICAgIGNvbnN0IGQgPSBNYXRoLmh5cG90KGRpZmZYLCBkaWZmWSk7XG4gICAgaWYgKGQgPCB0aGlzLiNtaW4pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZGlmZkQgPSBkIC0gdGhpcy4jbWluX2Rpc3Q7XG4gICAgY29uc3QgSyA9IGRpZmZEIC8gZDtcbiAgICBjb25zdCBzaGlmdFggPSBLICogZGlmZlg7XG4gICAgY29uc3Qgc2hpZnRZID0gSyAqIGRpZmZZO1xuICAgIGxldCB4MCA9IHgxO1xuICAgIGxldCB5MCA9IHkxO1xuICAgIHgxID0geDI7XG4gICAgeTEgPSB5MjtcbiAgICB4MiArPSBzaGlmdFg7XG4gICAgeTIgKz0gc2hpZnRZO1xuICAgIHRoaXMuI3BvaW50cz8ucHVzaCh4LCB5KTtcbiAgICBjb25zdCBuWCA9IC1zaGlmdFkgLyBkaWZmRDtcbiAgICBjb25zdCBuWSA9IHNoaWZ0WCAvIGRpZmZEO1xuICAgIGNvbnN0IHRoWCA9IG5YICogdGhpcy4jdGhpY2tuZXNzO1xuICAgIGNvbnN0IHRoWSA9IG5ZICogdGhpcy4jdGhpY2tuZXNzO1xuICAgIHRoaXMuI2xhc3Quc2V0KHRoaXMuI2xhc3Quc3ViYXJyYXkoMiwgOCksIDApO1xuICAgIHRoaXMuI2xhc3Quc2V0KFt4MiArIHRoWCwgeTIgKyB0aFldLCA0KTtcbiAgICB0aGlzLiNsYXN0LnNldCh0aGlzLiNsYXN0LnN1YmFycmF5KDE0LCAxOCksIDEyKTtcbiAgICB0aGlzLiNsYXN0LnNldChbeDIgLSB0aFgsIHkyIC0gdGhZXSwgMTYpO1xuICAgIGlmIChpc05hTih0aGlzLiNsYXN0WzZdKSkge1xuICAgICAgaWYgKHRoaXMuI3RvcC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy4jbGFzdC5zZXQoW3gxICsgdGhYLCB5MSArIHRoWV0sIDIpO1xuICAgICAgICB0aGlzLiN0b3AucHVzaChOYU4sIE5hTiwgTmFOLCBOYU4sICh4MSArIHRoWCAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoeTEgKyB0aFkgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQpO1xuICAgICAgICB0aGlzLiNsYXN0LnNldChbeDEgLSB0aFgsIHkxIC0gdGhZXSwgMTQpO1xuICAgICAgICB0aGlzLiNib3R0b20ucHVzaChOYU4sIE5hTiwgTmFOLCBOYU4sICh4MSAtIHRoWCAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoeTEgLSB0aFkgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQpO1xuICAgICAgfVxuICAgICAgdGhpcy4jbGFzdC5zZXQoW3gwLCB5MCwgeDEsIHkxLCB4MiwgeTJdLCA2KTtcbiAgICAgIHJldHVybiAhdGhpcy5pc0VtcHR5KCk7XG4gICAgfVxuICAgIHRoaXMuI2xhc3Quc2V0KFt4MCwgeTAsIHgxLCB5MSwgeDIsIHkyXSwgNik7XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLmFicyhNYXRoLmF0YW4yKHkwIC0geTEsIHgwIC0geDEpIC0gTWF0aC5hdGFuMihzaGlmdFksIHNoaWZ0WCkpO1xuICAgIGlmIChhbmdsZSA8IE1hdGguUEkgLyAyKSB7XG4gICAgICBbeDEsIHkxLCB4MiwgeTJdID0gdGhpcy4jbGFzdC5zdWJhcnJheSgyLCA2KTtcbiAgICAgIHRoaXMuI3RvcC5wdXNoKE5hTiwgTmFOLCBOYU4sIE5hTiwgKCh4MSArIHgyKSAvIDIgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCh5MSArIHkyKSAvIDIgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQpO1xuICAgICAgW3gxLCB5MSwgeDAsIHkwXSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoMTQsIDE4KTtcbiAgICAgIHRoaXMuI2JvdHRvbS5wdXNoKE5hTiwgTmFOLCBOYU4sIE5hTiwgKCh4MCArIHgxKSAvIDIgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCh5MCArIHkxKSAvIDIgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFt4MCwgeTAsIHgxLCB5MSwgeDIsIHkyXSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoMCwgNik7XG4gICAgdGhpcy4jdG9wLnB1c2goKCh4MCArIDUgKiB4MSkgLyA2IC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICgoeTAgKyA1ICogeTEpIC8gNiAtIGxheWVyWSkgLyBsYXllckhlaWdodCwgKCg1ICogeDEgKyB4MikgLyA2IC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsICgoNSAqIHkxICsgeTIpIC8gNiAtIGxheWVyWSkgLyBsYXllckhlaWdodCwgKCh4MSArIHgyKSAvIDIgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCh5MSArIHkyKSAvIDIgLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQpO1xuICAgIFt4MiwgeTIsIHgxLCB5MSwgeDAsIHkwXSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoMTIsIDE4KTtcbiAgICB0aGlzLiNib3R0b20ucHVzaCgoKHgwICsgNSAqIHgxKSAvIDYgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCh5MCArIDUgKiB5MSkgLyA2IC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCAoKDUgKiB4MSArIHgyKSAvIDYgLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKCg1ICogeTEgKyB5MikgLyA2IC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCAoKHgxICsgeDIpIC8gMiAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAoKHkxICsgeTIpIC8gMiAtIGxheWVyWSkgLyBsYXllckhlaWdodCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdG9TVkdQYXRoKCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IHRvcCA9IHRoaXMuI3RvcDtcbiAgICBjb25zdCBib3R0b20gPSB0aGlzLiNib3R0b207XG4gICAgY29uc3QgbGFzdFRvcCA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoNCwgNik7XG4gICAgY29uc3QgbGFzdEJvdHRvbSA9IHRoaXMuI2xhc3Quc3ViYXJyYXkoMTYsIDE4KTtcbiAgICBjb25zdCBbeCwgeSwgd2lkdGgsIGhlaWdodF0gPSB0aGlzLiNib3g7XG4gICAgY29uc3QgW2xhc3RUb3BYLCBsYXN0VG9wWSwgbGFzdEJvdHRvbVgsIGxhc3RCb3R0b21ZXSA9IHRoaXMuI2dldExhc3RDb29yZHMoKTtcbiAgICBpZiAoaXNOYU4odGhpcy4jbGFzdFs2XSkgJiYgIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gYE0keyh0aGlzLiNsYXN0WzJdIC0geCkgLyB3aWR0aH0gJHsodGhpcy4jbGFzdFszXSAtIHkpIC8gaGVpZ2h0fSBMJHsodGhpcy4jbGFzdFs0XSAtIHgpIC8gd2lkdGh9ICR7KHRoaXMuI2xhc3RbNV0gLSB5KSAvIGhlaWdodH0gTCR7bGFzdFRvcFh9ICR7bGFzdFRvcFl9IEwke2xhc3RCb3R0b21YfSAke2xhc3RCb3R0b21ZfSBMJHsodGhpcy4jbGFzdFsxNl0gLSB4KSAvIHdpZHRofSAkeyh0aGlzLiNsYXN0WzE3XSAtIHkpIC8gaGVpZ2h0fSBMJHsodGhpcy4jbGFzdFsxNF0gLSB4KSAvIHdpZHRofSAkeyh0aGlzLiNsYXN0WzE1XSAtIHkpIC8gaGVpZ2h0fSBaYDtcbiAgICB9XG4gICAgY29uc3QgYnVmZmVyID0gW107XG4gICAgYnVmZmVyLnB1c2goYE0ke3RvcFs0XX0gJHt0b3BbNV19YCk7XG4gICAgZm9yIChsZXQgaSA9IDY7IGkgPCB0b3AubGVuZ3RoOyBpICs9IDYpIHtcbiAgICAgIGlmIChpc05hTih0b3BbaV0pKSB7XG4gICAgICAgIGJ1ZmZlci5wdXNoKGBMJHt0b3BbaSArIDRdfSAke3RvcFtpICsgNV19YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBidWZmZXIucHVzaChgQyR7dG9wW2ldfSAke3RvcFtpICsgMV19ICR7dG9wW2kgKyAyXX0gJHt0b3BbaSArIDNdfSAke3RvcFtpICsgNF19ICR7dG9wW2kgKyA1XX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYnVmZmVyLnB1c2goYEwkeyhsYXN0VG9wWzBdIC0geCkgLyB3aWR0aH0gJHsobGFzdFRvcFsxXSAtIHkpIC8gaGVpZ2h0fSBMJHtsYXN0VG9wWH0gJHtsYXN0VG9wWX0gTCR7bGFzdEJvdHRvbVh9ICR7bGFzdEJvdHRvbVl9IEwkeyhsYXN0Qm90dG9tWzBdIC0geCkgLyB3aWR0aH0gJHsobGFzdEJvdHRvbVsxXSAtIHkpIC8gaGVpZ2h0fWApO1xuICAgIGZvciAobGV0IGkgPSBib3R0b20ubGVuZ3RoIC0gNjsgaSA+PSA2OyBpIC09IDYpIHtcbiAgICAgIGlmIChpc05hTihib3R0b21baV0pKSB7XG4gICAgICAgIGJ1ZmZlci5wdXNoKGBMJHtib3R0b21baSArIDRdfSAke2JvdHRvbVtpICsgNV19YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBidWZmZXIucHVzaChgQyR7Ym90dG9tW2ldfSAke2JvdHRvbVtpICsgMV19ICR7Ym90dG9tW2kgKyAyXX0gJHtib3R0b21baSArIDNdfSAke2JvdHRvbVtpICsgNF19ICR7Ym90dG9tW2kgKyA1XX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYnVmZmVyLnB1c2goYEwke2JvdHRvbVs0XX0gJHtib3R0b21bNV19IFpgKTtcbiAgICByZXR1cm4gYnVmZmVyLmpvaW4oXCIgXCIpO1xuICB9XG4gIGdldE91dGxpbmVzKCkge1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuI3RvcDtcbiAgICBjb25zdCBib3R0b20gPSB0aGlzLiNib3R0b207XG4gICAgY29uc3QgbGFzdCA9IHRoaXMuI2xhc3Q7XG4gICAgY29uc3QgbGFzdFRvcCA9IGxhc3Quc3ViYXJyYXkoNCwgNik7XG4gICAgY29uc3QgbGFzdEJvdHRvbSA9IGxhc3Quc3ViYXJyYXkoMTYsIDE4KTtcbiAgICBjb25zdCBbbGF5ZXJYLCBsYXllclksIGxheWVyV2lkdGgsIGxheWVySGVpZ2h0XSA9IHRoaXMuI2JveDtcbiAgICBjb25zdCBwb2ludHMgPSBuZXcgRmxvYXQ2NEFycmF5KCh0aGlzLiNwb2ludHM/Lmxlbmd0aCA/PyAwKSArIDIpO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGggLSAyOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgcG9pbnRzW2ldID0gKHRoaXMuI3BvaW50c1tpXSAtIGxheWVyWCkgLyBsYXllcldpZHRoO1xuICAgICAgcG9pbnRzW2kgKyAxXSA9ICh0aGlzLiNwb2ludHNbaSArIDFdIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0O1xuICAgIH1cbiAgICBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDJdID0gKHRoaXMuI2xhc3RYIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGg7XG4gICAgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSA9ICh0aGlzLiNsYXN0WSAtIGxheWVyWSkgLyBsYXllckhlaWdodDtcbiAgICBjb25zdCBbbGFzdFRvcFgsIGxhc3RUb3BZLCBsYXN0Qm90dG9tWCwgbGFzdEJvdHRvbVldID0gdGhpcy4jZ2V0TGFzdENvb3JkcygpO1xuICAgIGlmIChpc05hTihsYXN0WzZdKSAmJiAhdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIGNvbnN0IG91dGxpbmUgPSBuZXcgRmxvYXQ2NEFycmF5KDM2KTtcbiAgICAgIG91dGxpbmUuc2V0KFtOYU4sIE5hTiwgTmFOLCBOYU4sIChsYXN0WzJdIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsIChsYXN0WzNdIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCBOYU4sIE5hTiwgTmFOLCBOYU4sIChsYXN0WzRdIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsIChsYXN0WzVdIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0LCBOYU4sIE5hTiwgTmFOLCBOYU4sIGxhc3RUb3BYLCBsYXN0VG9wWSwgTmFOLCBOYU4sIE5hTiwgTmFOLCBsYXN0Qm90dG9tWCwgbGFzdEJvdHRvbVksIE5hTiwgTmFOLCBOYU4sIE5hTiwgKGxhc3RbMTZdIC0gbGF5ZXJYKSAvIGxheWVyV2lkdGgsIChsYXN0WzE3XSAtIGxheWVyWSkgLyBsYXllckhlaWdodCwgTmFOLCBOYU4sIE5hTiwgTmFOLCAobGFzdFsxNF0gLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKGxhc3RbMTVdIC0gbGF5ZXJZKSAvIGxheWVySGVpZ2h0XSwgMCk7XG4gICAgICByZXR1cm4gbmV3IEZyZWVIaWdobGlnaHRPdXRsaW5lKG91dGxpbmUsIHBvaW50cywgdGhpcy4jYm94LCB0aGlzLiNzY2FsZUZhY3RvciwgdGhpcy4jaW5uZXJNYXJnaW4sIHRoaXMuI2lzTFRSKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0bGluZSA9IG5ldyBGbG9hdDY0QXJyYXkodGhpcy4jdG9wLmxlbmd0aCArIDI0ICsgdGhpcy4jYm90dG9tLmxlbmd0aCk7XG4gICAgbGV0IE4gPSB0b3AubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSArPSAyKSB7XG4gICAgICBpZiAoaXNOYU4odG9wW2ldKSkge1xuICAgICAgICBvdXRsaW5lW2ldID0gb3V0bGluZVtpICsgMV0gPSBOYU47XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgb3V0bGluZVtpXSA9IHRvcFtpXTtcbiAgICAgIG91dGxpbmVbaSArIDFdID0gdG9wW2kgKyAxXTtcbiAgICB9XG4gICAgb3V0bGluZS5zZXQoW05hTiwgTmFOLCBOYU4sIE5hTiwgKGxhc3RUb3BbMF0gLSBsYXllclgpIC8gbGF5ZXJXaWR0aCwgKGxhc3RUb3BbMV0gLSBsYXllclkpIC8gbGF5ZXJIZWlnaHQsIE5hTiwgTmFOLCBOYU4sIE5hTiwgbGFzdFRvcFgsIGxhc3RUb3BZLCBOYU4sIE5hTiwgTmFOLCBOYU4sIGxhc3RCb3R0b21YLCBsYXN0Qm90dG9tWSwgTmFOLCBOYU4sIE5hTiwgTmFOLCAobGFzdEJvdHRvbVswXSAtIGxheWVyWCkgLyBsYXllcldpZHRoLCAobGFzdEJvdHRvbVsxXSAtIGxheWVyWSkgLyBsYXllckhlaWdodF0sIE4pO1xuICAgIE4gKz0gMjQ7XG4gICAgZm9yIChsZXQgaSA9IGJvdHRvbS5sZW5ndGggLSA2OyBpID49IDY7IGkgLT0gNikge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA2OyBqICs9IDIpIHtcbiAgICAgICAgaWYgKGlzTmFOKGJvdHRvbVtpICsgal0pKSB7XG4gICAgICAgICAgb3V0bGluZVtOXSA9IG91dGxpbmVbTiArIDFdID0gTmFOO1xuICAgICAgICAgIE4gKz0gMjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBvdXRsaW5lW05dID0gYm90dG9tW2kgKyBqXTtcbiAgICAgICAgb3V0bGluZVtOICsgMV0gPSBib3R0b21baSArIGogKyAxXTtcbiAgICAgICAgTiArPSAyO1xuICAgICAgfVxuICAgIH1cbiAgICBvdXRsaW5lLnNldChbTmFOLCBOYU4sIE5hTiwgTmFOLCBib3R0b21bNF0sIGJvdHRvbVs1XV0sIE4pO1xuICAgIHJldHVybiBuZXcgRnJlZUhpZ2hsaWdodE91dGxpbmUob3V0bGluZSwgcG9pbnRzLCB0aGlzLiNib3gsIHRoaXMuI3NjYWxlRmFjdG9yLCB0aGlzLiNpbm5lck1hcmdpbiwgdGhpcy4jaXNMVFIpO1xuICB9XG59XG5jbGFzcyBGcmVlSGlnaGxpZ2h0T3V0bGluZSBleHRlbmRzIE91dGxpbmUge1xuICAjYm94O1xuICAjYmJveCA9IG51bGw7XG4gICNpbm5lck1hcmdpbjtcbiAgI2lzTFRSO1xuICAjcG9pbnRzO1xuICAjc2NhbGVGYWN0b3I7XG4gICNvdXRsaW5lO1xuICBjb25zdHJ1Y3RvcihvdXRsaW5lLCBwb2ludHMsIGJveCwgc2NhbGVGYWN0b3IsIGlubmVyTWFyZ2luLCBpc0xUUikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jb3V0bGluZSA9IG91dGxpbmU7XG4gICAgdGhpcy4jcG9pbnRzID0gcG9pbnRzO1xuICAgIHRoaXMuI2JveCA9IGJveDtcbiAgICB0aGlzLiNzY2FsZUZhY3RvciA9IHNjYWxlRmFjdG9yO1xuICAgIHRoaXMuI2lubmVyTWFyZ2luID0gaW5uZXJNYXJnaW47XG4gICAgdGhpcy4jaXNMVFIgPSBpc0xUUjtcbiAgICB0aGlzLiNjb21wdXRlTWluTWF4KGlzTFRSKTtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IHRoaXMuI2Jib3g7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gb3V0bGluZS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICBvdXRsaW5lW2ldID0gKG91dGxpbmVbaV0gLSB4KSAvIHdpZHRoO1xuICAgICAgb3V0bGluZVtpICsgMV0gPSAob3V0bGluZVtpICsgMV0gLSB5KSAvIGhlaWdodDtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIHBvaW50c1tpXSA9IChwb2ludHNbaV0gLSB4KSAvIHdpZHRoO1xuICAgICAgcG9pbnRzW2kgKyAxXSA9IChwb2ludHNbaSArIDFdIC0geSkgLyBoZWlnaHQ7XG4gICAgfVxuICB9XG4gIHRvU1ZHUGF0aCgpIHtcbiAgICBjb25zdCBidWZmZXIgPSBbYE0ke3RoaXMuI291dGxpbmVbNF19ICR7dGhpcy4jb3V0bGluZVs1XX1gXTtcbiAgICBmb3IgKGxldCBpID0gNiwgaWkgPSB0aGlzLiNvdXRsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHtcbiAgICAgIGlmIChpc05hTih0aGlzLiNvdXRsaW5lW2ldKSkge1xuICAgICAgICBidWZmZXIucHVzaChgTCR7dGhpcy4jb3V0bGluZVtpICsgNF19ICR7dGhpcy4jb3V0bGluZVtpICsgNV19YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYnVmZmVyLnB1c2goYEMke3RoaXMuI291dGxpbmVbaV19ICR7dGhpcy4jb3V0bGluZVtpICsgMV19ICR7dGhpcy4jb3V0bGluZVtpICsgMl19ICR7dGhpcy4jb3V0bGluZVtpICsgM119ICR7dGhpcy4jb3V0bGluZVtpICsgNF19ICR7dGhpcy4jb3V0bGluZVtpICsgNV19YCk7XG4gICAgfVxuICAgIGJ1ZmZlci5wdXNoKFwiWlwiKTtcbiAgICByZXR1cm4gYnVmZmVyLmpvaW4oXCIgXCIpO1xuICB9XG4gIHNlcmlhbGl6ZShbYmxYLCBibFksIHRyWCwgdHJZXSwgcm90YXRpb24pIHtcbiAgICBjb25zdCB3aWR0aCA9IHRyWCAtIGJsWDtcbiAgICBjb25zdCBoZWlnaHQgPSB0clkgLSBibFk7XG4gICAgbGV0IG91dGxpbmU7XG4gICAgbGV0IHBvaW50cztcbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIG91dGxpbmUgPSB0aGlzLiNyZXNjYWxlKHRoaXMuI291dGxpbmUsIGJsWCwgdHJZLCB3aWR0aCwgLWhlaWdodCk7XG4gICAgICAgIHBvaW50cyA9IHRoaXMuI3Jlc2NhbGUodGhpcy4jcG9pbnRzLCBibFgsIHRyWSwgd2lkdGgsIC1oZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIG91dGxpbmUgPSB0aGlzLiNyZXNjYWxlQW5kU3dhcCh0aGlzLiNvdXRsaW5lLCBibFgsIGJsWSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHBvaW50cyA9IHRoaXMuI3Jlc2NhbGVBbmRTd2FwKHRoaXMuI3BvaW50cywgYmxYLCBibFksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICBvdXRsaW5lID0gdGhpcy4jcmVzY2FsZSh0aGlzLiNvdXRsaW5lLCB0clgsIGJsWSwgLXdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBwb2ludHMgPSB0aGlzLiNyZXNjYWxlKHRoaXMuI3BvaW50cywgdHJYLCBibFksIC13aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgb3V0bGluZSA9IHRoaXMuI3Jlc2NhbGVBbmRTd2FwKHRoaXMuI291dGxpbmUsIHRyWCwgdHJZLCAtd2lkdGgsIC1oZWlnaHQpO1xuICAgICAgICBwb2ludHMgPSB0aGlzLiNyZXNjYWxlQW5kU3dhcCh0aGlzLiNwb2ludHMsIHRyWCwgdHJZLCAtd2lkdGgsIC1oZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG91dGxpbmU6IEFycmF5LmZyb20ob3V0bGluZSksXG4gICAgICBwb2ludHM6IFtBcnJheS5mcm9tKHBvaW50cyldXG4gICAgfTtcbiAgfVxuICAjcmVzY2FsZShzcmMsIHR4LCB0eSwgc3gsIHN5KSB7XG4gICAgY29uc3QgZGVzdCA9IG5ldyBGbG9hdDY0QXJyYXkoc3JjLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgIGRlc3RbaV0gPSB0eCArIHNyY1tpXSAqIHN4O1xuICAgICAgZGVzdFtpICsgMV0gPSB0eSArIHNyY1tpICsgMV0gKiBzeTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG4gIH1cbiAgI3Jlc2NhbGVBbmRTd2FwKHNyYywgdHgsIHR5LCBzeCwgc3kpIHtcbiAgICBjb25zdCBkZXN0ID0gbmV3IEZsb2F0NjRBcnJheShzcmMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuICAgICAgZGVzdFtpXSA9IHR4ICsgc3JjW2kgKyAxXSAqIHN4O1xuICAgICAgZGVzdFtpICsgMV0gPSB0eSArIHNyY1tpXSAqIHN5O1xuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbiAgfVxuICAjY29tcHV0ZU1pbk1heChpc0xUUikge1xuICAgIGNvbnN0IG91dGxpbmUgPSB0aGlzLiNvdXRsaW5lO1xuICAgIGxldCBsYXN0WCA9IG91dGxpbmVbNF07XG4gICAgbGV0IGxhc3RZID0gb3V0bGluZVs1XTtcbiAgICBsZXQgbWluWCA9IGxhc3RYO1xuICAgIGxldCBtaW5ZID0gbGFzdFk7XG4gICAgbGV0IG1heFggPSBsYXN0WDtcbiAgICBsZXQgbWF4WSA9IGxhc3RZO1xuICAgIGxldCBsYXN0UG9pbnRYID0gbGFzdFg7XG4gICAgbGV0IGxhc3RQb2ludFkgPSBsYXN0WTtcbiAgICBjb25zdCBsdHJDYWxsYmFjayA9IGlzTFRSID8gTWF0aC5tYXggOiBNYXRoLm1pbjtcbiAgICBmb3IgKGxldCBpID0gNiwgaWkgPSBvdXRsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHtcbiAgICAgIGlmIChpc05hTihvdXRsaW5lW2ldKSkge1xuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgb3V0bGluZVtpICsgNF0pO1xuICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgb3V0bGluZVtpICsgNV0pO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgb3V0bGluZVtpICsgNF0pO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgb3V0bGluZVtpICsgNV0pO1xuICAgICAgICBpZiAobGFzdFBvaW50WSA8IG91dGxpbmVbaSArIDVdKSB7XG4gICAgICAgICAgbGFzdFBvaW50WCA9IG91dGxpbmVbaSArIDRdO1xuICAgICAgICAgIGxhc3RQb2ludFkgPSBvdXRsaW5lW2kgKyA1XTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0UG9pbnRZID09PSBvdXRsaW5lW2kgKyA1XSkge1xuICAgICAgICAgIGxhc3RQb2ludFggPSBsdHJDYWxsYmFjayhsYXN0UG9pbnRYLCBvdXRsaW5lW2kgKyA0XSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGJib3ggPSBVdGlsLmJlemllckJvdW5kaW5nQm94KGxhc3RYLCBsYXN0WSwgLi4ub3V0bGluZS5zbGljZShpLCBpICsgNikpO1xuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgYmJveFswXSk7XG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBiYm94WzFdKTtcbiAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGJib3hbMl0pO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgYmJveFszXSk7XG4gICAgICAgIGlmIChsYXN0UG9pbnRZIDwgYmJveFszXSkge1xuICAgICAgICAgIGxhc3RQb2ludFggPSBiYm94WzJdO1xuICAgICAgICAgIGxhc3RQb2ludFkgPSBiYm94WzNdO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3RQb2ludFkgPT09IGJib3hbM10pIHtcbiAgICAgICAgICBsYXN0UG9pbnRYID0gbHRyQ2FsbGJhY2sobGFzdFBvaW50WCwgYmJveFsyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxhc3RYID0gb3V0bGluZVtpICsgNF07XG4gICAgICBsYXN0WSA9IG91dGxpbmVbaSArIDVdO1xuICAgIH1cbiAgICBjb25zdCB4ID0gbWluWCAtIHRoaXMuI2lubmVyTWFyZ2luLFxuICAgICAgeSA9IG1pblkgLSB0aGlzLiNpbm5lck1hcmdpbixcbiAgICAgIHdpZHRoID0gbWF4WCAtIG1pblggKyAyICogdGhpcy4jaW5uZXJNYXJnaW4sXG4gICAgICBoZWlnaHQgPSBtYXhZIC0gbWluWSArIDIgKiB0aGlzLiNpbm5lck1hcmdpbjtcbiAgICB0aGlzLiNiYm94ID0ge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGxhc3RQb2ludDogW2xhc3RQb2ludFgsIGxhc3RQb2ludFldXG4gICAgfTtcbiAgfVxuICBnZXQgYm94KCkge1xuICAgIHJldHVybiB0aGlzLiNiYm94O1xuICB9XG4gIGdldE5ld091dGxpbmUodGhpY2tuZXNzLCBpbm5lck1hcmdpbikge1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gdGhpcy4jYmJveDtcbiAgICBjb25zdCBbbGF5ZXJYLCBsYXllclksIGxheWVyV2lkdGgsIGxheWVySGVpZ2h0XSA9IHRoaXMuI2JveDtcbiAgICBjb25zdCBzeCA9IHdpZHRoICogbGF5ZXJXaWR0aDtcbiAgICBjb25zdCBzeSA9IGhlaWdodCAqIGxheWVySGVpZ2h0O1xuICAgIGNvbnN0IHR4ID0geCAqIGxheWVyV2lkdGggKyBsYXllclg7XG4gICAgY29uc3QgdHkgPSB5ICogbGF5ZXJIZWlnaHQgKyBsYXllclk7XG4gICAgY29uc3Qgb3V0bGluZXIgPSBuZXcgRnJlZU91dGxpbmVyKHtcbiAgICAgIHg6IHRoaXMuI3BvaW50c1swXSAqIHN4ICsgdHgsXG4gICAgICB5OiB0aGlzLiNwb2ludHNbMV0gKiBzeSArIHR5XG4gICAgfSwgdGhpcy4jYm94LCB0aGlzLiNzY2FsZUZhY3RvciwgdGhpY2tuZXNzLCB0aGlzLiNpc0xUUiwgaW5uZXJNYXJnaW4gPz8gdGhpcy4jaW5uZXJNYXJnaW4pO1xuICAgIGZvciAobGV0IGkgPSAyOyBpIDwgdGhpcy4jcG9pbnRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBvdXRsaW5lci5hZGQoe1xuICAgICAgICB4OiB0aGlzLiNwb2ludHNbaV0gKiBzeCArIHR4LFxuICAgICAgICB5OiB0aGlzLiNwb2ludHNbaSArIDFdICogc3kgKyB0eVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRsaW5lci5nZXRPdXRsaW5lcygpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9jb2xvcl9waWNrZXIuanNcblxuXG5cbmNsYXNzIENvbG9yUGlja2VyIHtcbiAgI2JvdW5kS2V5RG93biA9IHRoaXMuI2tleURvd24uYmluZCh0aGlzKTtcbiAgI2JvdW5kUG9pbnRlckRvd24gPSB0aGlzLiNwb2ludGVyRG93bi5iaW5kKHRoaXMpO1xuICAjYnV0dG9uID0gbnVsbDtcbiAgI2J1dHRvblN3YXRjaCA9IG51bGw7XG4gICNkZWZhdWx0Q29sb3I7XG4gICNkcm9wZG93biA9IG51bGw7XG4gICNkcm9wZG93bldhc0Zyb21LZXlib2FyZCA9IGZhbHNlO1xuICAjaXNNYWluQ29sb3JQaWNrZXIgPSBmYWxzZTtcbiAgI2VkaXRvciA9IG51bGw7XG4gICNldmVudEJ1cztcbiAgI3VpTWFuYWdlciA9IG51bGw7XG4gICN0eXBlO1xuICBzdGF0aWMgZ2V0IF9rZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcIl9rZXlib2FyZE1hbmFnZXJcIiwgbmV3IEtleWJvYXJkTWFuYWdlcihbW1tcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIENvbG9yUGlja2VyLnByb3RvdHlwZS5faGlkZURyb3Bkb3duRnJvbUtleWJvYXJkXSwgW1tcIiBcIiwgXCJtYWMrIFwiXSwgQ29sb3JQaWNrZXIucHJvdG90eXBlLl9jb2xvclNlbGVjdEZyb21LZXlib2FyZF0sIFtbXCJBcnJvd0Rvd25cIiwgXCJBcnJvd1JpZ2h0XCIsIFwibWFjK0Fycm93RG93blwiLCBcIm1hYytBcnJvd1JpZ2h0XCJdLCBDb2xvclBpY2tlci5wcm90b3R5cGUuX21vdmVUb05leHRdLCBbW1wiQXJyb3dVcFwiLCBcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd1VwXCIsIFwibWFjK0Fycm93TGVmdFwiXSwgQ29sb3JQaWNrZXIucHJvdG90eXBlLl9tb3ZlVG9QcmV2aW91c10sIFtbXCJIb21lXCIsIFwibWFjK0hvbWVcIl0sIENvbG9yUGlja2VyLnByb3RvdHlwZS5fbW92ZVRvQmVnaW5uaW5nXSwgW1tcIkVuZFwiLCBcIm1hYytFbmRcIl0sIENvbG9yUGlja2VyLnByb3RvdHlwZS5fbW92ZVRvRW5kXV0pKTtcbiAgfVxuICBjb25zdHJ1Y3Rvcih7XG4gICAgZWRpdG9yID0gbnVsbCxcbiAgICB1aU1hbmFnZXIgPSBudWxsXG4gIH0pIHtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICB0aGlzLiNpc01haW5Db2xvclBpY2tlciA9IGZhbHNlO1xuICAgICAgdGhpcy4jdHlwZSA9IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9DT0xPUjtcbiAgICAgIHRoaXMuI2VkaXRvciA9IGVkaXRvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jaXNNYWluQ29sb3JQaWNrZXIgPSB0cnVlO1xuICAgICAgdGhpcy4jdHlwZSA9IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9ERUZBVUxUX0NPTE9SO1xuICAgIH1cbiAgICB0aGlzLiN1aU1hbmFnZXIgPSBlZGl0b3I/Ll91aU1hbmFnZXIgfHwgdWlNYW5hZ2VyO1xuICAgIHRoaXMuI2V2ZW50QnVzID0gdGhpcy4jdWlNYW5hZ2VyLl9ldmVudEJ1cztcbiAgICB0aGlzLiNkZWZhdWx0Q29sb3IgPSBlZGl0b3I/LmNvbG9yIHx8IHRoaXMuI3VpTWFuYWdlcj8uaGlnaGxpZ2h0Q29sb3JzLnZhbHVlcygpLm5leHQoKS52YWx1ZSB8fCBcIiNGRkZGOThcIjtcbiAgfVxuICByZW5kZXJCdXR0b24oKSB7XG4gICAgY29uc3QgYnV0dG9uID0gdGhpcy4jYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICBidXR0b24uY2xhc3NOYW1lID0gXCJjb2xvclBpY2tlclwiO1xuICAgIGJ1dHRvbi50YWJJbmRleCA9IFwiMFwiO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1lZGl0b3ItY29sb3JwaWNrZXItYnV0dG9uXCIpO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIsIHRydWUpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy4jb3BlbkRyb3Bkb3duLmJpbmQodGhpcyksIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleURvd24sIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIGNvbnN0IHN3YXRjaCA9IHRoaXMuI2J1dHRvblN3YXRjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIHN3YXRjaC5jbGFzc05hbWUgPSBcInN3YXRjaFwiO1xuICAgIHN3YXRjaC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCB0cnVlKTtcbiAgICBzd2F0Y2guc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy4jZGVmYXVsdENvbG9yO1xuICAgIGJ1dHRvbi5hcHBlbmQoc3dhdGNoKTtcbiAgICByZXR1cm4gYnV0dG9uO1xuICB9XG4gIHJlbmRlck1haW5Ecm9wZG93bigpIHtcbiAgICBjb25zdCBkcm9wZG93biA9IHRoaXMuI2Ryb3Bkb3duID0gdGhpcy4jZ2V0RHJvcGRvd25Sb290KCk7XG4gICAgZHJvcGRvd24uc2V0QXR0cmlidXRlKFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImhvcml6b250YWxcIik7XG4gICAgZHJvcGRvd24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiaGlnaGxpZ2h0Q29sb3JQaWNrZXJMYWJlbFwiKTtcbiAgICByZXR1cm4gZHJvcGRvd247XG4gIH1cbiAgI2dldERyb3Bkb3duUm9vdCgpIHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsO1xuICAgIGRpdi5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgZGl2LmNsYXNzTmFtZSA9IFwiZHJvcGRvd25cIjtcbiAgICBkaXYucm9sZSA9IFwibGlzdGJveFwiO1xuICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBmYWxzZSk7XG4gICAgZGl2LnNldEF0dHJpYnV0ZShcImFyaWEtb3JpZW50YXRpb25cIiwgXCJ2ZXJ0aWNhbFwiKTtcbiAgICBkaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtZWRpdG9yLWNvbG9ycGlja2VyLWRyb3Bkb3duXCIpO1xuICAgIGZvciAoY29uc3QgW25hbWUsIGNvbG9yXSBvZiB0aGlzLiN1aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JzKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgYnV0dG9uLnRhYkluZGV4ID0gXCIwXCI7XG4gICAgICBidXR0b24ucm9sZSA9IFwib3B0aW9uXCI7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiZGF0YS1jb2xvclwiLCBjb2xvcik7XG4gICAgICBidXR0b24udGl0bGUgPSBuYW1lO1xuICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImRhdGEtbDEwbi1pZFwiLCBgcGRmanMtZWRpdG9yLWNvbG9ycGlja2VyLSR7bmFtZX1gKTtcbiAgICAgIGNvbnN0IHN3YXRjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgYnV0dG9uLmFwcGVuZChzd2F0Y2gpO1xuICAgICAgc3dhdGNoLmNsYXNzTmFtZSA9IFwic3dhdGNoXCI7XG4gICAgICBzd2F0Y2guc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgICBidXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiLCBjb2xvciA9PT0gdGhpcy4jZGVmYXVsdENvbG9yKTtcbiAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy4jY29sb3JTZWxlY3QuYmluZCh0aGlzLCBjb2xvciksIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KTtcbiAgICAgIGRpdi5hcHBlbmQoYnV0dG9uKTtcbiAgICB9XG4gICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5RG93biwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuICAjY29sb3JTZWxlY3QoY29sb3IsIGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy4jZXZlbnRCdXMuZGlzcGF0Y2goXCJzd2l0Y2hhbm5vdGF0aW9uZWRpdG9ycGFyYW1zXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIHR5cGU6IHRoaXMuI3R5cGUsXG4gICAgICB2YWx1ZTogY29sb3JcbiAgICB9KTtcbiAgfVxuICBfY29sb3JTZWxlY3RGcm9tS2V5Ym9hcmQoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLiNidXR0b24pIHtcbiAgICAgIHRoaXMuI29wZW5Ecm9wZG93bihldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbG9yID0gZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtY29sb3JcIik7XG4gICAgaWYgKCFjb2xvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNjb2xvclNlbGVjdChjb2xvciwgZXZlbnQpO1xuICB9XG4gIF9tb3ZlVG9OZXh0KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgdGhpcy4jb3BlbkRyb3Bkb3duKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy4jYnV0dG9uKSB7XG4gICAgICB0aGlzLiNkcm9wZG93bi5maXJzdENoaWxkPy5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC50YXJnZXQubmV4dFNpYmxpbmc/LmZvY3VzKCk7XG4gIH1cbiAgX21vdmVUb1ByZXZpb3VzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy4jZHJvcGRvd24/LmZpcnN0Q2hpbGQgfHwgZXZlbnQudGFyZ2V0ID09PSB0aGlzLiNidXR0b24pIHtcbiAgICAgIGlmICh0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgICB0aGlzLl9oaWRlRHJvcGRvd25Gcm9tS2V5Ym9hcmQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgdGhpcy4jb3BlbkRyb3Bkb3duKGV2ZW50KTtcbiAgICB9XG4gICAgZXZlbnQudGFyZ2V0LnByZXZpb3VzU2libGluZz8uZm9jdXMoKTtcbiAgfVxuICBfbW92ZVRvQmVnaW5uaW5nKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgdGhpcy4jb3BlbkRyb3Bkb3duKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jZHJvcGRvd24uZmlyc3RDaGlsZD8uZm9jdXMoKTtcbiAgfVxuICBfbW92ZVRvRW5kKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgdGhpcy4jb3BlbkRyb3Bkb3duKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jZHJvcGRvd24ubGFzdENoaWxkPy5mb2N1cygpO1xuICB9XG4gICNrZXlEb3duKGV2ZW50KSB7XG4gICAgQ29sb3JQaWNrZXIuX2tleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIGV2ZW50KTtcbiAgfVxuICAjb3BlbkRyb3Bkb3duKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuI2lzRHJvcGRvd25WaXNpYmxlKSB7XG4gICAgICB0aGlzLmhpZGVEcm9wZG93bigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNkcm9wZG93bldhc0Zyb21LZXlib2FyZCA9IGV2ZW50LmRldGFpbCA9PT0gMDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kUG9pbnRlckRvd24sIHtcbiAgICAgIHNpZ25hbDogdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWxcbiAgICB9KTtcbiAgICBpZiAodGhpcy4jZHJvcGRvd24pIHtcbiAgICAgIHRoaXMuI2Ryb3Bkb3duLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLiNkcm9wZG93biA9IHRoaXMuI2dldERyb3Bkb3duUm9vdCgpO1xuICAgIHRoaXMuI2J1dHRvbi5hcHBlbmQocm9vdCk7XG4gIH1cbiAgI3BvaW50ZXJEb3duKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuI2Ryb3Bkb3duPy5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XG4gIH1cbiAgaGlkZURyb3Bkb3duKCkge1xuICAgIHRoaXMuI2Ryb3Bkb3duPy5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRQb2ludGVyRG93bik7XG4gIH1cbiAgZ2V0ICNpc0Ryb3Bkb3duVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZHJvcGRvd24gJiYgIXRoaXMuI2Ryb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhcImhpZGRlblwiKTtcbiAgfVxuICBfaGlkZURyb3Bkb3duRnJvbUtleWJvYXJkKCkge1xuICAgIGlmICh0aGlzLiNpc01haW5Db2xvclBpY2tlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuI2lzRHJvcGRvd25WaXNpYmxlKSB7XG4gICAgICB0aGlzLiNlZGl0b3I/LnVuc2VsZWN0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XG4gICAgdGhpcy4jYnV0dG9uLmZvY3VzKHtcbiAgICAgIHByZXZlbnRTY3JvbGw6IHRydWUsXG4gICAgICBmb2N1c1Zpc2libGU6IHRoaXMuI2Ryb3Bkb3duV2FzRnJvbUtleWJvYXJkXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlQ29sb3IoY29sb3IpIHtcbiAgICBpZiAodGhpcy4jYnV0dG9uU3dhdGNoKSB7XG4gICAgICB0aGlzLiNidXR0b25Td2F0Y2guc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgfVxuICAgIGlmICghdGhpcy4jZHJvcGRvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaSA9IHRoaXMuI3VpTWFuYWdlci5oaWdobGlnaHRDb2xvcnMudmFsdWVzKCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLiNkcm9wZG93bi5jaGlsZHJlbikge1xuICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiLCBpLm5leHQoKS52YWx1ZSA9PT0gY29sb3IpO1xuICAgIH1cbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuI2J1dHRvbj8ucmVtb3ZlKCk7XG4gICAgdGhpcy4jYnV0dG9uID0gbnVsbDtcbiAgICB0aGlzLiNidXR0b25Td2F0Y2ggPSBudWxsO1xuICAgIHRoaXMuI2Ryb3Bkb3duPy5yZW1vdmUoKTtcbiAgICB0aGlzLiNkcm9wZG93biA9IG51bGw7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2hpZ2hsaWdodC5qc1xuXG5cblxuXG5cblxuY2xhc3MgSGlnaGxpZ2h0RWRpdG9yIGV4dGVuZHMgQW5ub3RhdGlvbkVkaXRvciB7XG4gICNhbmNob3JOb2RlID0gbnVsbDtcbiAgI2FuY2hvck9mZnNldCA9IDA7XG4gICNib3hlcztcbiAgI2NsaXBQYXRoSWQgPSBudWxsO1xuICAjY29sb3JQaWNrZXIgPSBudWxsO1xuICAjZm9jdXNPdXRsaW5lcyA9IG51bGw7XG4gICNmb2N1c05vZGUgPSBudWxsO1xuICAjZm9jdXNPZmZzZXQgPSAwO1xuICAjaGlnaGxpZ2h0RGl2ID0gbnVsbDtcbiAgI2hpZ2hsaWdodE91dGxpbmVzID0gbnVsbDtcbiAgI2lkID0gbnVsbDtcbiAgI2lzRnJlZUhpZ2hsaWdodCA9IGZhbHNlO1xuICAjYm91bmRLZXlkb3duID0gdGhpcy4ja2V5ZG93bi5iaW5kKHRoaXMpO1xuICAjbGFzdFBvaW50ID0gbnVsbDtcbiAgI29wYWNpdHk7XG4gICNvdXRsaW5lSWQgPSBudWxsO1xuICAjdGV4dCA9IFwiXCI7XG4gICN0aGlja25lc3M7XG4gICNtZXRob2RPZkNyZWF0aW9uID0gXCJcIjtcbiAgc3RhdGljIF9kZWZhdWx0Q29sb3IgPSBudWxsO1xuICBzdGF0aWMgX2RlZmF1bHRPcGFjaXR5ID0gMTtcbiAgc3RhdGljIF9kZWZhdWx0VGhpY2tuZXNzID0gMTI7XG4gIHN0YXRpYyBfbDEwblByb21pc2U7XG4gIHN0YXRpYyBfdHlwZSA9IFwiaGlnaGxpZ2h0XCI7XG4gIHN0YXRpYyBfZWRpdG9yVHlwZSA9IEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVDtcbiAgc3RhdGljIF9mcmVlSGlnaGxpZ2h0SWQgPSAtMTtcbiAgc3RhdGljIF9mcmVlSGlnaGxpZ2h0ID0gbnVsbDtcbiAgc3RhdGljIF9mcmVlSGlnaGxpZ2h0Q2xpcElkID0gXCJcIjtcbiAgc3RhdGljIGdldCBfa2V5Ym9hcmRNYW5hZ2VyKCkge1xuICAgIGNvbnN0IHByb3RvID0gSGlnaGxpZ2h0RWRpdG9yLnByb3RvdHlwZTtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiQXJyb3dMZWZ0XCIsIFwibWFjK0Fycm93TGVmdFwiXSwgcHJvdG8uX21vdmVDYXJldCwge1xuICAgICAgYXJnczogWzBdXG4gICAgfV0sIFtbXCJBcnJvd1JpZ2h0XCIsIFwibWFjK0Fycm93UmlnaHRcIl0sIHByb3RvLl9tb3ZlQ2FyZXQsIHtcbiAgICAgIGFyZ3M6IFsxXVxuICAgIH1dLCBbW1wiQXJyb3dVcFwiLCBcIm1hYytBcnJvd1VwXCJdLCBwcm90by5fbW92ZUNhcmV0LCB7XG4gICAgICBhcmdzOiBbMl1cbiAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHByb3RvLl9tb3ZlQ2FyZXQsIHtcbiAgICAgIGFyZ3M6IFszXVxuICAgIH1dXSkpO1xuICB9XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIG5hbWU6IFwiaGlnaGxpZ2h0RWRpdG9yXCJcbiAgICB9KTtcbiAgICB0aGlzLmNvbG9yID0gcGFyYW1zLmNvbG9yIHx8IEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdENvbG9yO1xuICAgIHRoaXMuI3RoaWNrbmVzcyA9IHBhcmFtcy50aGlja25lc3MgfHwgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzO1xuICAgIHRoaXMuI29wYWNpdHkgPSBwYXJhbXMub3BhY2l0eSB8fCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRPcGFjaXR5O1xuICAgIHRoaXMuI2JveGVzID0gcGFyYW1zLmJveGVzIHx8IG51bGw7XG4gICAgdGhpcy4jbWV0aG9kT2ZDcmVhdGlvbiA9IHBhcmFtcy5tZXRob2RPZkNyZWF0aW9uIHx8IFwiXCI7XG4gICAgdGhpcy4jdGV4dCA9IHBhcmFtcy50ZXh0IHx8IFwiXCI7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICBpZiAocGFyYW1zLmhpZ2hsaWdodElkID4gLTEpIHtcbiAgICAgIHRoaXMuI2lzRnJlZUhpZ2hsaWdodCA9IHRydWU7XG4gICAgICB0aGlzLiNjcmVhdGVGcmVlT3V0bGluZXMocGFyYW1zKTtcbiAgICAgIHRoaXMuI2FkZFRvRHJhd0xheWVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2FuY2hvck5vZGUgPSBwYXJhbXMuYW5jaG9yTm9kZTtcbiAgICAgIHRoaXMuI2FuY2hvck9mZnNldCA9IHBhcmFtcy5hbmNob3JPZmZzZXQ7XG4gICAgICB0aGlzLiNmb2N1c05vZGUgPSBwYXJhbXMuZm9jdXNOb2RlO1xuICAgICAgdGhpcy4jZm9jdXNPZmZzZXQgPSBwYXJhbXMuZm9jdXNPZmZzZXQ7XG4gICAgICB0aGlzLiNjcmVhdGVPdXRsaW5lcygpO1xuICAgICAgdGhpcy4jYWRkVG9EcmF3TGF5ZXIoKTtcbiAgICAgIHRoaXMucm90YXRlKHRoaXMucm90YXRpb24pO1xuICAgIH1cbiAgfVxuICBnZXQgdGVsZW1ldHJ5SW5pdGlhbERhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJhZGRlZFwiLFxuICAgICAgdHlwZTogdGhpcy4jaXNGcmVlSGlnaGxpZ2h0ID8gXCJmcmVlX2hpZ2hsaWdodFwiIDogXCJoaWdobGlnaHRcIixcbiAgICAgIGNvbG9yOiB0aGlzLl91aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JOYW1lcy5nZXQodGhpcy5jb2xvciksXG4gICAgICB0aGlja25lc3M6IHRoaXMuI3RoaWNrbmVzcyxcbiAgICAgIG1ldGhvZE9mQ3JlYXRpb246IHRoaXMuI21ldGhvZE9mQ3JlYXRpb25cbiAgICB9O1xuICB9XG4gIGdldCB0ZWxlbWV0cnlGaW5hbERhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiaGlnaGxpZ2h0XCIsXG4gICAgICBjb2xvcjogdGhpcy5fdWlNYW5hZ2VyLmhpZ2hsaWdodENvbG9yTmFtZXMuZ2V0KHRoaXMuY29sb3IpXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY29tcHV0ZVRlbGVtZXRyeUZpbmFsRGF0YShkYXRhKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG51bWJlck9mQ29sb3JzOiBkYXRhLmdldChcImNvbG9yXCIpLnNpemVcbiAgICB9O1xuICB9XG4gICNjcmVhdGVPdXRsaW5lcygpIHtcbiAgICBjb25zdCBvdXRsaW5lciA9IG5ldyBPdXRsaW5lcih0aGlzLiNib3hlcywgMC4wMDEpO1xuICAgIHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzID0gb3V0bGluZXIuZ2V0T3V0bGluZXMoKTtcbiAgICAoe1xuICAgICAgeDogdGhpcy54LFxuICAgICAgeTogdGhpcy55LFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgfSA9IHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzLmJveCk7XG4gICAgY29uc3Qgb3V0bGluZXJGb3JPdXRsaW5lID0gbmV3IE91dGxpbmVyKHRoaXMuI2JveGVzLCAwLjAwMjUsIDAuMDAxLCB0aGlzLl91aU1hbmFnZXIuZGlyZWN0aW9uID09PSBcImx0clwiKTtcbiAgICB0aGlzLiNmb2N1c091dGxpbmVzID0gb3V0bGluZXJGb3JPdXRsaW5lLmdldE91dGxpbmVzKCk7XG4gICAgY29uc3Qge1xuICAgICAgbGFzdFBvaW50XG4gICAgfSA9IHRoaXMuI2ZvY3VzT3V0bGluZXMuYm94O1xuICAgIHRoaXMuI2xhc3RQb2ludCA9IFsobGFzdFBvaW50WzBdIC0gdGhpcy54KSAvIHRoaXMud2lkdGgsIChsYXN0UG9pbnRbMV0gLSB0aGlzLnkpIC8gdGhpcy5oZWlnaHRdO1xuICB9XG4gICNjcmVhdGVGcmVlT3V0bGluZXMoe1xuICAgIGhpZ2hsaWdodE91dGxpbmVzLFxuICAgIGhpZ2hsaWdodElkLFxuICAgIGNsaXBQYXRoSWRcbiAgfSkge1xuICAgIHRoaXMuI2hpZ2hsaWdodE91dGxpbmVzID0gaGlnaGxpZ2h0T3V0bGluZXM7XG4gICAgY29uc3QgZXh0cmFUaGlja25lc3MgPSAxLjU7XG4gICAgdGhpcy4jZm9jdXNPdXRsaW5lcyA9IGhpZ2hsaWdodE91dGxpbmVzLmdldE5ld091dGxpbmUodGhpcy4jdGhpY2tuZXNzIC8gMiArIGV4dHJhVGhpY2tuZXNzLCAwLjAwMjUpO1xuICAgIGlmIChoaWdobGlnaHRJZCA+PSAwKSB7XG4gICAgICB0aGlzLiNpZCA9IGhpZ2hsaWdodElkO1xuICAgICAgdGhpcy4jY2xpcFBhdGhJZCA9IGNsaXBQYXRoSWQ7XG4gICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuZmluYWxpemVMaW5lKGhpZ2hsaWdodElkLCBoaWdobGlnaHRPdXRsaW5lcyk7XG4gICAgICB0aGlzLiNvdXRsaW5lSWQgPSB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuaGlnaGxpZ2h0T3V0bGluZSh0aGlzLiNmb2N1c091dGxpbmVzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICBjb25zdCBhbmdsZSA9IHRoaXMucGFyZW50LnZpZXdwb3J0LnJvdGF0aW9uO1xuICAgICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnVwZGF0ZUxpbmUodGhpcy4jaWQsIGhpZ2hsaWdodE91dGxpbmVzKTtcbiAgICAgIHRoaXMucGFyZW50LmRyYXdMYXllci51cGRhdGVCb3godGhpcy4jaWQsIEhpZ2hsaWdodEVkaXRvci4jcm90YXRlQmJveCh0aGlzLiNoaWdobGlnaHRPdXRsaW5lcy5ib3gsIChhbmdsZSAtIHRoaXMucm90YXRpb24gKyAzNjApICUgMzYwKSk7XG4gICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIudXBkYXRlTGluZSh0aGlzLiNvdXRsaW5lSWQsIHRoaXMuI2ZvY3VzT3V0bGluZXMpO1xuICAgICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnVwZGF0ZUJveCh0aGlzLiNvdXRsaW5lSWQsIEhpZ2hsaWdodEVkaXRvci4jcm90YXRlQmJveCh0aGlzLiNmb2N1c091dGxpbmVzLmJveCwgYW5nbGUpKTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gPSBoaWdobGlnaHRPdXRsaW5lcy5ib3g7XG4gICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIHRoaXMueCA9IHk7XG4gICAgICAgICAgdGhpcy55ID0gMSAtIHg7XG4gICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoICogcGFnZUhlaWdodCAvIHBhZ2VXaWR0aDtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAqIHBhZ2VXaWR0aCAvIHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICB0aGlzLnggPSAxIC0geDtcbiAgICAgICAgdGhpcy55ID0gMSAtIHk7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICB0aGlzLnggPSAxIC0geTtcbiAgICAgICAgICB0aGlzLnkgPSB4O1xuICAgICAgICAgIHRoaXMud2lkdGggPSB3aWR0aCAqIHBhZ2VIZWlnaHQgLyBwYWdlV2lkdGg7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgKiBwYWdlV2lkdGggLyBwYWdlSGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGxhc3RQb2ludFxuICAgIH0gPSB0aGlzLiNmb2N1c091dGxpbmVzLmJveDtcbiAgICB0aGlzLiNsYXN0UG9pbnQgPSBbKGxhc3RQb2ludFswXSAtIHgpIC8gd2lkdGgsIChsYXN0UG9pbnRbMV0gLSB5KSAvIGhlaWdodF07XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyKSB7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5pbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcik7XG4gICAgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0Q29sb3IgfHw9IHVpTWFuYWdlci5oaWdobGlnaHRDb2xvcnM/LnZhbHVlcygpLm5leHQoKS52YWx1ZSB8fCBcIiNmZmYwNjZcIjtcbiAgfVxuICBzdGF0aWMgdXBkYXRlRGVmYXVsdFBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfREVGQVVMVF9DT0xPUjpcbiAgICAgICAgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0Q29sb3IgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9USElDS05FU1M6XG4gICAgICAgIEhpZ2hsaWdodEVkaXRvci5fZGVmYXVsdFRoaWNrbmVzcyA9IHZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdHJhbnNsYXRlSW5QYWdlKHgsIHkpIHt9XG4gIGdldCB0b29sYmFyUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xhc3RQb2ludDtcbiAgfVxuICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSElHSExJR0hUX0NPTE9SOlxuICAgICAgICB0aGlzLiN1cGRhdGVDb2xvcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfVEhJQ0tORVNTOlxuICAgICAgICB0aGlzLiN1cGRhdGVUaGlja25lc3ModmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgc3RhdGljIGdldCBkZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9ERUZBVUxUX0NPTE9SLCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRDb2xvcl0sIFtBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfVEhJQ0tORVNTLCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdXTtcbiAgfVxuICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgIHJldHVybiBbW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9DT0xPUiwgdGhpcy5jb2xvciB8fCBIaWdobGlnaHRFZGl0b3IuX2RlZmF1bHRDb2xvcl0sIFtBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5ISUdITElHSFRfVEhJQ0tORVNTLCB0aGlzLiN0aGlja25lc3MgfHwgSGlnaGxpZ2h0RWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9GUkVFLCB0aGlzLiNpc0ZyZWVIaWdobGlnaHRdXTtcbiAgfVxuICAjdXBkYXRlQ29sb3IoY29sb3IpIHtcbiAgICBjb25zdCBzZXRDb2xvciA9IGNvbCA9PiB7XG4gICAgICB0aGlzLmNvbG9yID0gY29sO1xuICAgICAgdGhpcy5wYXJlbnQ/LmRyYXdMYXllci5jaGFuZ2VDb2xvcih0aGlzLiNpZCwgY29sKTtcbiAgICAgIHRoaXMuI2NvbG9yUGlja2VyPy51cGRhdGVDb2xvcihjb2wpO1xuICAgIH07XG4gICAgY29uc3Qgc2F2ZWRDb2xvciA9IHRoaXMuY29sb3I7XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6IHNldENvbG9yLmJpbmQodGhpcywgY29sb3IpLFxuICAgICAgdW5kbzogc2V0Q29sb3IuYmluZCh0aGlzLCBzYXZlZENvbG9yKSxcbiAgICAgIHBvc3Q6IHRoaXMuX3VpTWFuYWdlci51cGRhdGVVSS5iaW5kKHRoaXMuX3VpTWFuYWdlciwgdGhpcyksXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkhJR0hMSUdIVF9DT0xPUixcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuX3JlcG9ydFRlbGVtZXRyeSh7XG4gICAgICBhY3Rpb246IFwiY29sb3JfY2hhbmdlZFwiLFxuICAgICAgY29sb3I6IHRoaXMuX3VpTWFuYWdlci5oaWdobGlnaHRDb2xvck5hbWVzLmdldChjb2xvcilcbiAgICB9LCB0cnVlKTtcbiAgfVxuICAjdXBkYXRlVGhpY2tuZXNzKHRoaWNrbmVzcykge1xuICAgIGNvbnN0IHNhdmVkVGhpY2tuZXNzID0gdGhpcy4jdGhpY2tuZXNzO1xuICAgIGNvbnN0IHNldFRoaWNrbmVzcyA9IHRoID0+IHtcbiAgICAgIHRoaXMuI3RoaWNrbmVzcyA9IHRoO1xuICAgICAgdGhpcy4jY2hhbmdlVGhpY2tuZXNzKHRoKTtcbiAgICB9O1xuICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgY21kOiBzZXRUaGlja25lc3MuYmluZCh0aGlzLCB0aGlja25lc3MpLFxuICAgICAgdW5kbzogc2V0VGhpY2tuZXNzLmJpbmQodGhpcywgc2F2ZWRUaGlja25lc3MpLFxuICAgICAgcG9zdDogdGhpcy5fdWlNYW5hZ2VyLnVwZGF0ZVVJLmJpbmQodGhpcy5fdWlNYW5hZ2VyLCB0aGlzKSxcbiAgICAgIG11c3RFeGVjOiB0cnVlLFxuICAgICAgdHlwZTogQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX1RISUNLTkVTUyxcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuX3JlcG9ydFRlbGVtZXRyeSh7XG4gICAgICBhY3Rpb246IFwidGhpY2tuZXNzX2NoYW5nZWRcIixcbiAgICAgIHRoaWNrbmVzc1xuICAgIH0sIHRydWUpO1xuICB9XG4gIGFzeW5jIGFkZEVkaXRUb29sYmFyKCkge1xuICAgIGNvbnN0IHRvb2xiYXIgPSBhd2FpdCBzdXBlci5hZGRFZGl0VG9vbGJhcigpO1xuICAgIGlmICghdG9vbGJhcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl91aU1hbmFnZXIuaGlnaGxpZ2h0Q29sb3JzKSB7XG4gICAgICB0aGlzLiNjb2xvclBpY2tlciA9IG5ldyBDb2xvclBpY2tlcih7XG4gICAgICAgIGVkaXRvcjogdGhpc1xuICAgICAgfSk7XG4gICAgICB0b29sYmFyLmFkZENvbG9yUGlja2VyKHRoaXMuI2NvbG9yUGlja2VyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRvb2xiYXI7XG4gIH1cbiAgZGlzYWJsZUVkaXRpbmcoKSB7XG4gICAgc3VwZXIuZGlzYWJsZUVkaXRpbmcoKTtcbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG4gIH1cbiAgZW5hYmxlRWRpdGluZygpIHtcbiAgICBzdXBlci5lbmFibGVFZGl0aW5nKCk7XG4gICAgdGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImRpc2FibGVkXCIsIGZhbHNlKTtcbiAgfVxuICBmaXhBbmRTZXRQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gc3VwZXIuZml4QW5kU2V0UG9zaXRpb24odGhpcy4jZ2V0Um90YXRpb24oKSk7XG4gIH1cbiAgZ2V0QmFzZVRyYW5zbGF0aW9uKCkge1xuICAgIHJldHVybiBbMCwgMF07XG4gIH1cbiAgZ2V0UmVjdCh0eCwgdHkpIHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0UmVjdCh0eCwgdHksIHRoaXMuI2dldFJvdGF0aW9uKCkpO1xuICB9XG4gIG9uY2VBZGRlZCgpIHtcbiAgICB0aGlzLnBhcmVudC5hZGRVbmRvYWJsZUVkaXRvcih0aGlzKTtcbiAgICB0aGlzLmRpdi5mb2N1cygpO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICB0aGlzLiNjbGVhbkRyYXdMYXllcigpO1xuICAgIHRoaXMuX3JlcG9ydFRlbGVtZXRyeSh7XG4gICAgICBhY3Rpb246IFwiZGVsZXRlZFwiXG4gICAgfSk7XG4gICAgc3VwZXIucmVtb3ZlKCk7XG4gIH1cbiAgcmVidWlsZCgpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLnJlYnVpbGQoKTtcbiAgICBpZiAodGhpcy5kaXYgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jYWRkVG9EcmF3TGF5ZXIoKTtcbiAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG4gICAgfVxuICB9XG4gIHNldFBhcmVudChwYXJlbnQpIHtcbiAgICBsZXQgbXVzdEJlU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5wYXJlbnQgJiYgIXBhcmVudCkge1xuICAgICAgdGhpcy4jY2xlYW5EcmF3TGF5ZXIoKTtcbiAgICB9IGVsc2UgaWYgKHBhcmVudCkge1xuICAgICAgdGhpcy4jYWRkVG9EcmF3TGF5ZXIocGFyZW50KTtcbiAgICAgIG11c3RCZVNlbGVjdGVkID0gIXRoaXMucGFyZW50ICYmIHRoaXMuZGl2Py5jbGFzc0xpc3QuY29udGFpbnMoXCJzZWxlY3RlZEVkaXRvclwiKTtcbiAgICB9XG4gICAgc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7XG4gICAgdGhpcy5zaG93KHRoaXMuX2lzVmlzaWJsZSk7XG4gICAgaWYgKG11c3RCZVNlbGVjdGVkKSB7XG4gICAgICB0aGlzLnNlbGVjdCgpO1xuICAgIH1cbiAgfVxuICAjY2hhbmdlVGhpY2tuZXNzKHRoaWNrbmVzcykge1xuICAgIGlmICghdGhpcy4jaXNGcmVlSGlnaGxpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2NyZWF0ZUZyZWVPdXRsaW5lcyh7XG4gICAgICBoaWdobGlnaHRPdXRsaW5lczogdGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMuZ2V0TmV3T3V0bGluZSh0aGlja25lc3MgLyAyKVxuICAgIH0pO1xuICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy5zZXREaW1zKHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICB9XG4gICNjbGVhbkRyYXdMYXllcigpIHtcbiAgICBpZiAodGhpcy4jaWQgPT09IG51bGwgfHwgIXRoaXMucGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50LmRyYXdMYXllci5yZW1vdmUodGhpcy4jaWQpO1xuICAgIHRoaXMuI2lkID0gbnVsbDtcbiAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIucmVtb3ZlKHRoaXMuI291dGxpbmVJZCk7XG4gICAgdGhpcy4jb3V0bGluZUlkID0gbnVsbDtcbiAgfVxuICAjYWRkVG9EcmF3TGF5ZXIocGFyZW50ID0gdGhpcy5wYXJlbnQpIHtcbiAgICBpZiAodGhpcy4jaWQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgKHtcbiAgICAgIGlkOiB0aGlzLiNpZCxcbiAgICAgIGNsaXBQYXRoSWQ6IHRoaXMuI2NsaXBQYXRoSWRcbiAgICB9ID0gcGFyZW50LmRyYXdMYXllci5oaWdobGlnaHQodGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMsIHRoaXMuY29sb3IsIHRoaXMuI29wYWNpdHkpKTtcbiAgICB0aGlzLiNvdXRsaW5lSWQgPSBwYXJlbnQuZHJhd0xheWVyLmhpZ2hsaWdodE91dGxpbmUodGhpcy4jZm9jdXNPdXRsaW5lcyk7XG4gICAgaWYgKHRoaXMuI2hpZ2hsaWdodERpdikge1xuICAgICAgdGhpcy4jaGlnaGxpZ2h0RGl2LnN0eWxlLmNsaXBQYXRoID0gdGhpcy4jY2xpcFBhdGhJZDtcbiAgICB9XG4gIH1cbiAgc3RhdGljICNyb3RhdGVCYm94KHtcbiAgICB4LFxuICAgIHksXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0sIGFuZ2xlKSB7XG4gICAgc3dpdGNoIChhbmdsZSkge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiAxIC0geSAtIGhlaWdodCxcbiAgICAgICAgICB5OiB4LFxuICAgICAgICAgIHdpZHRoOiBoZWlnaHQsXG4gICAgICAgICAgaGVpZ2h0OiB3aWR0aFxuICAgICAgICB9O1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogMSAtIHggLSB3aWR0aCxcbiAgICAgICAgICB5OiAxIC0geSAtIGhlaWdodCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHksXG4gICAgICAgICAgeTogMSAtIHggLSB3aWR0aCxcbiAgICAgICAgICB3aWR0aDogaGVpZ2h0LFxuICAgICAgICAgIGhlaWdodDogd2lkdGhcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9O1xuICB9XG4gIHJvdGF0ZShhbmdsZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRyYXdMYXllclxuICAgIH0gPSB0aGlzLnBhcmVudDtcbiAgICBsZXQgYm94O1xuICAgIGlmICh0aGlzLiNpc0ZyZWVIaWdobGlnaHQpIHtcbiAgICAgIGFuZ2xlID0gKGFuZ2xlIC0gdGhpcy5yb3RhdGlvbiArIDM2MCkgJSAzNjA7XG4gICAgICBib3ggPSBIaWdobGlnaHRFZGl0b3IuI3JvdGF0ZUJib3godGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMuYm94LCBhbmdsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJveCA9IEhpZ2hsaWdodEVkaXRvci4jcm90YXRlQmJveCh0aGlzLCBhbmdsZSk7XG4gICAgfVxuICAgIGRyYXdMYXllci5yb3RhdGUodGhpcy4jaWQsIGFuZ2xlKTtcbiAgICBkcmF3TGF5ZXIucm90YXRlKHRoaXMuI291dGxpbmVJZCwgYW5nbGUpO1xuICAgIGRyYXdMYXllci51cGRhdGVCb3godGhpcy4jaWQsIGJveCk7XG4gICAgZHJhd0xheWVyLnVwZGF0ZUJveCh0aGlzLiNvdXRsaW5lSWQsIEhpZ2hsaWdodEVkaXRvci4jcm90YXRlQmJveCh0aGlzLiNmb2N1c091dGxpbmVzLmJveCwgYW5nbGUpKTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuZGl2KSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXY7XG4gICAgfVxuICAgIGNvbnN0IGRpdiA9IHN1cGVyLnJlbmRlcigpO1xuICAgIGlmICh0aGlzLiN0ZXh0KSB7XG4gICAgICBkaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0aGlzLiN0ZXh0KTtcbiAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwibWFya1wiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2lzRnJlZUhpZ2hsaWdodCkge1xuICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoXCJmcmVlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleWRvd24sIHtcbiAgICAgICAgc2lnbmFsOiB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGhpZ2hsaWdodERpdiA9IHRoaXMuI2hpZ2hsaWdodERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LmFwcGVuZChoaWdobGlnaHREaXYpO1xuICAgIGhpZ2hsaWdodERpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgaGlnaGxpZ2h0RGl2LmNsYXNzTmFtZSA9IFwiaW50ZXJuYWxcIjtcbiAgICBoaWdobGlnaHREaXYuc3R5bGUuY2xpcFBhdGggPSB0aGlzLiNjbGlwUGF0aElkO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLnNldERpbXModGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgYmluZEV2ZW50cyh0aGlzLCB0aGlzLiNoaWdobGlnaHREaXYsIFtcInBvaW50ZXJvdmVyXCIsIFwicG9pbnRlcmxlYXZlXCJdKTtcbiAgICB0aGlzLmVuYWJsZUVkaXRpbmcoKTtcbiAgICByZXR1cm4gZGl2O1xuICB9XG4gIHBvaW50ZXJvdmVyKCkge1xuICAgIHRoaXMucGFyZW50LmRyYXdMYXllci5hZGRDbGFzcyh0aGlzLiNvdXRsaW5lSWQsIFwiaG92ZXJlZFwiKTtcbiAgfVxuICBwb2ludGVybGVhdmUoKSB7XG4gICAgdGhpcy5wYXJlbnQuZHJhd0xheWVyLnJlbW92ZUNsYXNzKHRoaXMuI291dGxpbmVJZCwgXCJob3ZlcmVkXCIpO1xuICB9XG4gICNrZXlkb3duKGV2ZW50KSB7XG4gICAgSGlnaGxpZ2h0RWRpdG9yLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCBldmVudCk7XG4gIH1cbiAgX21vdmVDYXJldChkaXJlY3Rpb24pIHtcbiAgICB0aGlzLnBhcmVudC51bnNlbGVjdCh0aGlzKTtcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAyOlxuICAgICAgICB0aGlzLiNzZXRDYXJldCh0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHRoaXMuI3NldENhcmV0KGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gICNzZXRDYXJldChzdGFydCkge1xuICAgIGlmICghdGhpcy4jYW5jaG9yTm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBzZWxlY3Rpb24uc2V0UG9zaXRpb24odGhpcy4jYW5jaG9yTm9kZSwgdGhpcy4jYW5jaG9yT2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0aW9uLnNldFBvc2l0aW9uKHRoaXMuI2ZvY3VzTm9kZSwgdGhpcy4jZm9jdXNPZmZzZXQpO1xuICAgIH1cbiAgfVxuICBzZWxlY3QoKSB7XG4gICAgc3VwZXIuc2VsZWN0KCk7XG4gICAgaWYgKCF0aGlzLiNvdXRsaW5lSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQ/LmRyYXdMYXllci5yZW1vdmVDbGFzcyh0aGlzLiNvdXRsaW5lSWQsIFwiaG92ZXJlZFwiKTtcbiAgICB0aGlzLnBhcmVudD8uZHJhd0xheWVyLmFkZENsYXNzKHRoaXMuI291dGxpbmVJZCwgXCJzZWxlY3RlZFwiKTtcbiAgfVxuICB1bnNlbGVjdCgpIHtcbiAgICBzdXBlci51bnNlbGVjdCgpO1xuICAgIGlmICghdGhpcy4jb3V0bGluZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGFyZW50Py5kcmF3TGF5ZXIucmVtb3ZlQ2xhc3ModGhpcy4jb3V0bGluZUlkLCBcInNlbGVjdGVkXCIpO1xuICAgIGlmICghdGhpcy4jaXNGcmVlSGlnaGxpZ2h0KSB7XG4gICAgICB0aGlzLiNzZXRDYXJldChmYWxzZSk7XG4gICAgfVxuICB9XG4gIGdldCBfbXVzdEZpeFBvc2l0aW9uKCkge1xuICAgIHJldHVybiAhdGhpcy4jaXNGcmVlSGlnaGxpZ2h0O1xuICB9XG4gIHNob3codmlzaWJsZSA9IHRoaXMuX2lzVmlzaWJsZSkge1xuICAgIHN1cGVyLnNob3codmlzaWJsZSk7XG4gICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuc2hvdyh0aGlzLiNpZCwgdmlzaWJsZSk7XG4gICAgICB0aGlzLnBhcmVudC5kcmF3TGF5ZXIuc2hvdyh0aGlzLiNvdXRsaW5lSWQsIHZpc2libGUpO1xuICAgIH1cbiAgfVxuICAjZ2V0Um90YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lzRnJlZUhpZ2hsaWdodCA/IHRoaXMucm90YXRpb24gOiAwO1xuICB9XG4gICNzZXJpYWxpemVCb3hlcygpIHtcbiAgICBpZiAodGhpcy4jaXNGcmVlSGlnaGxpZ2h0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuICAgIGNvbnN0IGJveGVzID0gdGhpcy4jYm94ZXM7XG4gICAgY29uc3QgcXVhZFBvaW50cyA9IG5ldyBGbG9hdDMyQXJyYXkoYm94ZXMubGVuZ3RoICogOCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGZvciAoY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIH0gb2YgYm94ZXMpIHtcbiAgICAgIGNvbnN0IHN4ID0geCAqIHBhZ2VXaWR0aDtcbiAgICAgIGNvbnN0IHN5ID0gKDEgLSB5IC0gaGVpZ2h0KSAqIHBhZ2VIZWlnaHQ7XG4gICAgICBxdWFkUG9pbnRzW2ldID0gcXVhZFBvaW50c1tpICsgNF0gPSBzeDtcbiAgICAgIHF1YWRQb2ludHNbaSArIDFdID0gcXVhZFBvaW50c1tpICsgM10gPSBzeTtcbiAgICAgIHF1YWRQb2ludHNbaSArIDJdID0gcXVhZFBvaW50c1tpICsgNl0gPSBzeCArIHdpZHRoICogcGFnZVdpZHRoO1xuICAgICAgcXVhZFBvaW50c1tpICsgNV0gPSBxdWFkUG9pbnRzW2kgKyA3XSA9IHN5ICsgaGVpZ2h0ICogcGFnZUhlaWdodDtcbiAgICAgIGkgKz0gODtcbiAgICB9XG4gICAgcmV0dXJuIHF1YWRQb2ludHM7XG4gIH1cbiAgI3NlcmlhbGl6ZU91dGxpbmVzKHJlY3QpIHtcbiAgICByZXR1cm4gdGhpcy4jaGlnaGxpZ2h0T3V0bGluZXMuc2VyaWFsaXplKHJlY3QsIHRoaXMuI2dldFJvdGF0aW9uKCkpO1xuICB9XG4gIHN0YXRpYyBzdGFydEhpZ2hsaWdodGluZyhwYXJlbnQsIGlzTFRSLCB7XG4gICAgdGFyZ2V0OiB0ZXh0TGF5ZXIsXG4gICAgeCxcbiAgICB5XG4gIH0pIHtcbiAgICBjb25zdCB7XG4gICAgICB4OiBsYXllclgsXG4gICAgICB5OiBsYXllclksXG4gICAgICB3aWR0aDogcGFyZW50V2lkdGgsXG4gICAgICBoZWlnaHQ6IHBhcmVudEhlaWdodFxuICAgIH0gPSB0ZXh0TGF5ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcG9pbnRlck1vdmUgPSBlID0+IHtcbiAgICAgIHRoaXMuI2hpZ2hsaWdodE1vdmUocGFyZW50LCBlKTtcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25hbCA9IHBhcmVudC5fc2lnbmFsO1xuICAgIGNvbnN0IHBvaW50ZXJEb3duT3B0aW9ucyA9IHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgIHNpZ25hbFxuICAgIH07XG4gICAgY29uc3QgcG9pbnRlckRvd24gPSBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICBjb25zdCBwb2ludGVyVXBDYWxsYmFjayA9IGUgPT4ge1xuICAgICAgdGV4dExheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBwb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgcG9pbnRlclVwQ2FsbGJhY2spO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlclVwQ2FsbGJhY2spO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBwb2ludGVyRG93biwgcG9pbnRlckRvd25PcHRpb25zKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSk7XG4gICAgICB0aGlzLiNlbmRIaWdobGlnaHQocGFyZW50LCBlKTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBwb2ludGVyVXBDYWxsYmFjaywge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgcG9pbnRlclVwQ2FsbGJhY2ssIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgcG9pbnRlckRvd24sIHBvaW50ZXJEb3duT3B0aW9ucyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCBub0NvbnRleHRNZW51LCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0ZXh0TGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHBvaW50ZXJNb3ZlLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLl9mcmVlSGlnaGxpZ2h0ID0gbmV3IEZyZWVPdXRsaW5lcih7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0sIFtsYXllclgsIGxheWVyWSwgcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0sIHBhcmVudC5zY2FsZSwgdGhpcy5fZGVmYXVsdFRoaWNrbmVzcyAvIDIsIGlzTFRSLCAwLjAwMSk7XG4gICAgKHtcbiAgICAgIGlkOiB0aGlzLl9mcmVlSGlnaGxpZ2h0SWQsXG4gICAgICBjbGlwUGF0aElkOiB0aGlzLl9mcmVlSGlnaGxpZ2h0Q2xpcElkXG4gICAgfSA9IHBhcmVudC5kcmF3TGF5ZXIuaGlnaGxpZ2h0KHRoaXMuX2ZyZWVIaWdobGlnaHQsIHRoaXMuX2RlZmF1bHRDb2xvciwgdGhpcy5fZGVmYXVsdE9wYWNpdHksIHRydWUpKTtcbiAgfVxuICBzdGF0aWMgI2hpZ2hsaWdodE1vdmUocGFyZW50LCBldmVudCkge1xuICAgIGlmICh0aGlzLl9mcmVlSGlnaGxpZ2h0LmFkZChldmVudCkpIHtcbiAgICAgIHBhcmVudC5kcmF3TGF5ZXIudXBkYXRlUGF0aCh0aGlzLl9mcmVlSGlnaGxpZ2h0SWQsIHRoaXMuX2ZyZWVIaWdobGlnaHQpO1xuICAgIH1cbiAgfVxuICBzdGF0aWMgI2VuZEhpZ2hsaWdodChwYXJlbnQsIGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9mcmVlSGlnaGxpZ2h0LmlzRW1wdHkoKSkge1xuICAgICAgcGFyZW50LmNyZWF0ZUFuZEFkZE5ld0VkaXRvcihldmVudCwgZmFsc2UsIHtcbiAgICAgICAgaGlnaGxpZ2h0SWQ6IHRoaXMuX2ZyZWVIaWdobGlnaHRJZCxcbiAgICAgICAgaGlnaGxpZ2h0T3V0bGluZXM6IHRoaXMuX2ZyZWVIaWdobGlnaHQuZ2V0T3V0bGluZXMoKSxcbiAgICAgICAgY2xpcFBhdGhJZDogdGhpcy5fZnJlZUhpZ2hsaWdodENsaXBJZCxcbiAgICAgICAgbWV0aG9kT2ZDcmVhdGlvbjogXCJtYWluX3Rvb2xiYXJcIlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudC5kcmF3TGF5ZXIucmVtb3ZlRnJlZUhpZ2hsaWdodCh0aGlzLl9mcmVlSGlnaGxpZ2h0SWQpO1xuICAgIH1cbiAgICB0aGlzLl9mcmVlSGlnaGxpZ2h0SWQgPSAtMTtcbiAgICB0aGlzLl9mcmVlSGlnaGxpZ2h0ID0gbnVsbDtcbiAgICB0aGlzLl9mcmVlSGlnaGxpZ2h0Q2xpcElkID0gXCJcIjtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBjb25zdCBlZGl0b3IgPSBzdXBlci5kZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcik7XG4gICAgY29uc3Qge1xuICAgICAgcmVjdDogW2JsWCwgYmxZLCB0clgsIHRyWV0sXG4gICAgICBjb2xvcixcbiAgICAgIHF1YWRQb2ludHNcbiAgICB9ID0gZGF0YTtcbiAgICBlZGl0b3IuY29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5jb2xvcik7XG4gICAgZWRpdG9yLiNvcGFjaXR5ID0gZGF0YS5vcGFjaXR5O1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gZWRpdG9yLnBhZ2VEaW1lbnNpb25zO1xuICAgIGVkaXRvci53aWR0aCA9ICh0clggLSBibFgpIC8gcGFnZVdpZHRoO1xuICAgIGVkaXRvci5oZWlnaHQgPSAodHJZIC0gYmxZKSAvIHBhZ2VIZWlnaHQ7XG4gICAgY29uc3QgYm94ZXMgPSBlZGl0b3IuI2JveGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFkUG9pbnRzLmxlbmd0aDsgaSArPSA4KSB7XG4gICAgICBib3hlcy5wdXNoKHtcbiAgICAgICAgeDogKHF1YWRQb2ludHNbNF0gLSB0clgpIC8gcGFnZVdpZHRoLFxuICAgICAgICB5OiAodHJZIC0gKDEgLSBxdWFkUG9pbnRzW2kgKyA1XSkpIC8gcGFnZUhlaWdodCxcbiAgICAgICAgd2lkdGg6IChxdWFkUG9pbnRzW2kgKyAyXSAtIHF1YWRQb2ludHNbaV0pIC8gcGFnZVdpZHRoLFxuICAgICAgICBoZWlnaHQ6IChxdWFkUG9pbnRzW2kgKyA1XSAtIHF1YWRQb2ludHNbaSArIDFdKSAvIHBhZ2VIZWlnaHRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlZGl0b3IuI2NyZWF0ZU91dGxpbmVzKCk7XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICBzZXJpYWxpemUoaXNGb3JDb3B5aW5nID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkgfHwgaXNGb3JDb3B5aW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0UmVjdCgwLCAwKTtcbiAgICBjb25zdCBjb2xvciA9IEFubm90YXRpb25FZGl0b3IuX2NvbG9yTWFuYWdlci5jb252ZXJ0KHRoaXMuY29sb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBhbm5vdGF0aW9uVHlwZTogQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hULFxuICAgICAgY29sb3IsXG4gICAgICBvcGFjaXR5OiB0aGlzLiNvcGFjaXR5LFxuICAgICAgdGhpY2tuZXNzOiB0aGlzLiN0aGlja25lc3MsXG4gICAgICBxdWFkUG9pbnRzOiB0aGlzLiNzZXJpYWxpemVCb3hlcygpLFxuICAgICAgb3V0bGluZXM6IHRoaXMuI3NlcmlhbGl6ZU91dGxpbmVzKHJlY3QpLFxuICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgIHJlY3QsXG4gICAgICByb3RhdGlvbjogdGhpcy4jZ2V0Um90YXRpb24oKSxcbiAgICAgIHN0cnVjdFRyZWVQYXJlbnRJZDogdGhpcy5fc3RydWN0VHJlZVBhcmVudElkXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgY2FuQ3JlYXRlTmV3RW1wdHlFZGl0b3IoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9pbmsuanNcblxuXG5cblxuXG5jbGFzcyBJbmtFZGl0b3IgZXh0ZW5kcyBBbm5vdGF0aW9uRWRpdG9yIHtcbiAgI2Jhc2VIZWlnaHQgPSAwO1xuICAjYmFzZVdpZHRoID0gMDtcbiAgI2JvdW5kQ2FudmFzUG9pbnRlcm1vdmUgPSB0aGlzLmNhbnZhc1BvaW50ZXJtb3ZlLmJpbmQodGhpcyk7XG4gICNib3VuZENhbnZhc1BvaW50ZXJsZWF2ZSA9IHRoaXMuY2FudmFzUG9pbnRlcmxlYXZlLmJpbmQodGhpcyk7XG4gICNib3VuZENhbnZhc1BvaW50ZXJ1cCA9IHRoaXMuY2FudmFzUG9pbnRlcnVwLmJpbmQodGhpcyk7XG4gICNib3VuZENhbnZhc1BvaW50ZXJkb3duID0gdGhpcy5jYW52YXNQb2ludGVyZG93bi5iaW5kKHRoaXMpO1xuICAjY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQgPSBudWxsO1xuICAjY3VycmVudFBhdGgyRCA9IG5ldyBQYXRoMkQoKTtcbiAgI2Rpc2FibGVFZGl0aW5nID0gZmFsc2U7XG4gICNoYXNTb21ldGhpbmdUb0RyYXcgPSBmYWxzZTtcbiAgI2lzQ2FudmFzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgI29ic2VydmVyID0gbnVsbDtcbiAgI3JlYWxXaWR0aCA9IDA7XG4gICNyZWFsSGVpZ2h0ID0gMDtcbiAgI3JlcXVlc3RGcmFtZUNhbGxiYWNrID0gbnVsbDtcbiAgc3RhdGljIF9kZWZhdWx0Q29sb3IgPSBudWxsO1xuICBzdGF0aWMgX2RlZmF1bHRPcGFjaXR5ID0gMTtcbiAgc3RhdGljIF9kZWZhdWx0VGhpY2tuZXNzID0gMTtcbiAgc3RhdGljIF90eXBlID0gXCJpbmtcIjtcbiAgc3RhdGljIF9lZGl0b3JUeXBlID0gQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LO1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBuYW1lOiBcImlua0VkaXRvclwiXG4gICAgfSk7XG4gICAgdGhpcy5jb2xvciA9IHBhcmFtcy5jb2xvciB8fCBudWxsO1xuICAgIHRoaXMudGhpY2tuZXNzID0gcGFyYW1zLnRoaWNrbmVzcyB8fCBudWxsO1xuICAgIHRoaXMub3BhY2l0eSA9IHBhcmFtcy5vcGFjaXR5IHx8IG51bGw7XG4gICAgdGhpcy5wYXRocyA9IFtdO1xuICAgIHRoaXMuYmV6aWVyUGF0aDJEID0gW107XG4gICAgdGhpcy5hbGxSYXdQYXRocyA9IFtdO1xuICAgIHRoaXMuY3VycmVudFBhdGggPSBbXTtcbiAgICB0aGlzLnNjYWxlRmFjdG9yID0gMTtcbiAgICB0aGlzLnRyYW5zbGF0aW9uWCA9IHRoaXMudHJhbnNsYXRpb25ZID0gMDtcbiAgICB0aGlzLnggPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gICAgdGhpcy5fd2lsbEtlZXBBc3BlY3RSYXRpbyA9IHRydWU7XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyKSB7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5pbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcik7XG4gIH1cbiAgc3RhdGljIHVwZGF0ZURlZmF1bHRQYXJhbXModHlwZSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX1RISUNLTkVTUzpcbiAgICAgICAgSW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgIElua0VkaXRvci5fZGVmYXVsdENvbG9yID0gdmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWTpcbiAgICAgICAgSW5rRWRpdG9yLl9kZWZhdWx0T3BhY2l0eSA9IHZhbHVlIC8gMTAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1M6XG4gICAgICAgIHRoaXMuI3VwZGF0ZVRoaWNrbmVzcyh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgIHRoaXMuI3VwZGF0ZUNvbG9yKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZOlxuICAgICAgICB0aGlzLiN1cGRhdGVPcGFjaXR5KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW1tBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLCBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SLCBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBBbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yXSwgW0Fubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZLCBNYXRoLnJvdW5kKElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkgKiAxMDApXV07XG4gIH1cbiAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICByZXR1cm4gW1tBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLCB0aGlzLnRoaWNrbmVzcyB8fCBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SLCB0aGlzLmNvbG9yIHx8IElua0VkaXRvci5fZGVmYXVsdENvbG9yIHx8IEFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdLCBbQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFksIE1hdGgucm91bmQoMTAwICogKHRoaXMub3BhY2l0eSA/PyBJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5KSldXTtcbiAgfVxuICAjdXBkYXRlVGhpY2tuZXNzKHRoaWNrbmVzcykge1xuICAgIGNvbnN0IHNldFRoaWNrbmVzcyA9IHRoID0+IHtcbiAgICAgIHRoaXMudGhpY2tuZXNzID0gdGg7XG4gICAgICB0aGlzLiNmaXRUb0NvbnRlbnQoKTtcbiAgICB9O1xuICAgIGNvbnN0IHNhdmVkVGhpY2tuZXNzID0gdGhpcy50aGlja25lc3M7XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6IHNldFRoaWNrbmVzcy5iaW5kKHRoaXMsIHRoaWNrbmVzcyksXG4gICAgICB1bmRvOiBzZXRUaGlja25lc3MuYmluZCh0aGlzLCBzYXZlZFRoaWNrbmVzcyksXG4gICAgICBwb3N0OiB0aGlzLl91aU1hbmFnZXIudXBkYXRlVUkuYmluZCh0aGlzLl91aU1hbmFnZXIsIHRoaXMpLFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLFxuICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogdHJ1ZSxcbiAgICAgIGtlZXBVbmRvOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgI3VwZGF0ZUNvbG9yKGNvbG9yKSB7XG4gICAgY29uc3Qgc2V0Q29sb3IgPSBjb2wgPT4ge1xuICAgICAgdGhpcy5jb2xvciA9IGNvbDtcbiAgICAgIHRoaXMuI3JlZHJhdygpO1xuICAgIH07XG4gICAgY29uc3Qgc2F2ZWRDb2xvciA9IHRoaXMuY29sb3I7XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQ6IHNldENvbG9yLmJpbmQodGhpcywgY29sb3IpLFxuICAgICAgdW5kbzogc2V0Q29sb3IuYmluZCh0aGlzLCBzYXZlZENvbG9yKSxcbiAgICAgIHBvc3Q6IHRoaXMuX3VpTWFuYWdlci51cGRhdGVVSS5iaW5kKHRoaXMuX3VpTWFuYWdlciwgdGhpcyksXG4gICAgICBtdXN0RXhlYzogdHJ1ZSxcbiAgICAgIHR5cGU6IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUixcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gICN1cGRhdGVPcGFjaXR5KG9wYWNpdHkpIHtcbiAgICBjb25zdCBzZXRPcGFjaXR5ID0gb3AgPT4ge1xuICAgICAgdGhpcy5vcGFjaXR5ID0gb3A7XG4gICAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICB9O1xuICAgIG9wYWNpdHkgLz0gMTAwO1xuICAgIGNvbnN0IHNhdmVkT3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZDogc2V0T3BhY2l0eS5iaW5kKHRoaXMsIG9wYWNpdHkpLFxuICAgICAgdW5kbzogc2V0T3BhY2l0eS5iaW5kKHRoaXMsIHNhdmVkT3BhY2l0eSksXG4gICAgICBwb3N0OiB0aGlzLl91aU1hbmFnZXIudXBkYXRlVUkuYmluZCh0aGlzLl91aU1hbmFnZXIsIHRoaXMpLFxuICAgICAgbXVzdEV4ZWM6IHRydWUsXG4gICAgICB0eXBlOiBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWSxcbiAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG4gICAgICBrZWVwVW5kbzogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJlYnVpbGQoKSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgaWYgKHRoaXMuZGl2ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5jYW52YXMpIHtcbiAgICAgIHRoaXMuI2NyZWF0ZUNhbnZhcygpO1xuICAgICAgdGhpcy4jY3JlYXRlT2JzZXJ2ZXIoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgdGhpcy5wYXJlbnQuYWRkKHRoaXMpO1xuICAgICAgdGhpcy4jc2V0Q2FudmFzRGltcygpO1xuICAgIH1cbiAgICB0aGlzLiNmaXRUb0NvbnRlbnQoKTtcbiAgfVxuICByZW1vdmUoKSB7XG4gICAgaWYgKHRoaXMuY2FudmFzID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMuY29tbWl0KCk7XG4gICAgfVxuICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmUoKTtcbiAgICB0aGlzLmNhbnZhcyA9IG51bGw7XG4gICAgaWYgKHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQpO1xuICAgICAgdGhpcy4jY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLiNvYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuI29ic2VydmVyID0gbnVsbDtcbiAgICBzdXBlci5yZW1vdmUoKTtcbiAgfVxuICBzZXRQYXJlbnQocGFyZW50KSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCAmJiBwYXJlbnQpIHtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5yZW1vdmVTaG91bGRSZXNjYWxlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wYXJlbnQgJiYgcGFyZW50ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuYWRkU2hvdWxkUmVzY2FsZSh0aGlzKTtcbiAgICB9XG4gICAgc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7XG4gIH1cbiAgb25TY2FsZUNoYW5naW5nKCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodDtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7XG4gIH1cbiAgZW5hYmxlRWRpdE1vZGUoKSB7XG4gICAgaWYgKHRoaXMuI2Rpc2FibGVFZGl0aW5nIHx8IHRoaXMuY2FudmFzID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN1cGVyLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVyZG93biwge1xuICAgICAgc2lnbmFsOiB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbFxuICAgIH0pO1xuICB9XG4gIGRpc2FibGVFZGl0TW9kZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNJbkVkaXRNb2RlKCkgfHwgdGhpcy5jYW52YXMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuZGlzYWJsZUVkaXRNb2RlKCk7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSAhdGhpcy5pc0VtcHR5KCk7XG4gICAgdGhpcy5kaXYuY2xhc3NMaXN0LnJlbW92ZShcImVkaXRpbmdcIik7XG4gICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmRvd24pO1xuICB9XG4gIG9uY2VBZGRlZCgpIHtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9ICF0aGlzLmlzRW1wdHkoKTtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnBhdGhzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLnBhdGhzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnBhdGhzWzBdLmxlbmd0aCA9PT0gMDtcbiAgfVxuICAjZ2V0SW5pdGlhbEJCb3goKSB7XG4gICAgY29uc3Qge1xuICAgICAgcGFyZW50Um90YXRpb24sXG4gICAgICBwYXJlbnREaW1lbnNpb25zOiBbd2lkdGgsIGhlaWdodF1cbiAgICB9ID0gdGhpcztcbiAgICBzd2l0Y2ggKHBhcmVudFJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICByZXR1cm4gWzAsIGhlaWdodCwgaGVpZ2h0LCB3aWR0aF07XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0XTtcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICByZXR1cm4gW3dpZHRoLCAwLCBoZWlnaHQsIHdpZHRoXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbMCwgMCwgd2lkdGgsIGhlaWdodF07XG4gICAgfVxuICB9XG4gICNzZXRTdHJva2UoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY3R4LFxuICAgICAgY29sb3IsXG4gICAgICBvcGFjaXR5LFxuICAgICAgdGhpY2tuZXNzLFxuICAgICAgcGFyZW50U2NhbGUsXG4gICAgICBzY2FsZUZhY3RvclxuICAgIH0gPSB0aGlzO1xuICAgIGN0eC5saW5lV2lkdGggPSB0aGlja25lc3MgKiBwYXJlbnRTY2FsZSAvIHNjYWxlRmFjdG9yO1xuICAgIGN0eC5saW5lQ2FwID0gXCJyb3VuZFwiO1xuICAgIGN0eC5saW5lSm9pbiA9IFwicm91bmRcIjtcbiAgICBjdHgubWl0ZXJMaW1pdCA9IDEwO1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IGAke2NvbG9yfSR7b3BhY2l0eVRvSGV4KG9wYWNpdHkpfWA7XG4gIH1cbiAgI3N0YXJ0RHJhd2luZyh4LCB5KSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIG5vQ29udGV4dE1lbnUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybGVhdmVcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVybGVhdmUsIHtcbiAgICAgIHNpZ25hbFxuICAgIH0pO1xuICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJtb3ZlLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcnVwLCB7XG4gICAgICBzaWduYWxcbiAgICB9KTtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVyZG93bik7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuICAgIGlmICghdGhpcy4jaXNDYW52YXNJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy4jaXNDYW52YXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB0aGlzLiNzZXRDYW52YXNEaW1zKCk7XG4gICAgICB0aGlzLnRoaWNrbmVzcyB8fD0gSW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzO1xuICAgICAgdGhpcy5jb2xvciB8fD0gSW5rRWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcjtcbiAgICAgIHRoaXMub3BhY2l0eSA/Pz0gSW5rRWRpdG9yLl9kZWZhdWx0T3BhY2l0eTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGF0aC5wdXNoKFt4LCB5XSk7XG4gICAgdGhpcy4jaGFzU29tZXRoaW5nVG9EcmF3ID0gZmFsc2U7XG4gICAgdGhpcy4jc2V0U3Ryb2tlKCk7XG4gICAgdGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLiNkcmF3UG9pbnRzKCk7XG4gICAgICBpZiAodGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2spIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLiNyZXF1ZXN0RnJhbWVDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuI3JlcXVlc3RGcmFtZUNhbGxiYWNrKTtcbiAgfVxuICAjZHJhdyh4LCB5KSB7XG4gICAgY29uc3QgW2xhc3RYLCBsYXN0WV0gPSB0aGlzLmN1cnJlbnRQYXRoLmF0KC0xKTtcbiAgICBpZiAodGhpcy5jdXJyZW50UGF0aC5sZW5ndGggPiAxICYmIHggPT09IGxhc3RYICYmIHkgPT09IGxhc3RZKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gdGhpcy5jdXJyZW50UGF0aDtcbiAgICBsZXQgcGF0aDJEID0gdGhpcy4jY3VycmVudFBhdGgyRDtcbiAgICBjdXJyZW50UGF0aC5wdXNoKFt4LCB5XSk7XG4gICAgdGhpcy4jaGFzU29tZXRoaW5nVG9EcmF3ID0gdHJ1ZTtcbiAgICBpZiAoY3VycmVudFBhdGgubGVuZ3RoIDw9IDIpIHtcbiAgICAgIHBhdGgyRC5tb3ZlVG8oLi4uY3VycmVudFBhdGhbMF0pO1xuICAgICAgcGF0aDJELmxpbmVUbyh4LCB5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRQYXRoLmxlbmd0aCA9PT0gMykge1xuICAgICAgdGhpcy4jY3VycmVudFBhdGgyRCA9IHBhdGgyRCA9IG5ldyBQYXRoMkQoKTtcbiAgICAgIHBhdGgyRC5tb3ZlVG8oLi4uY3VycmVudFBhdGhbMF0pO1xuICAgIH1cbiAgICB0aGlzLiNtYWtlQmV6aWVyQ3VydmUocGF0aDJELCAuLi5jdXJyZW50UGF0aC5hdCgtMyksIC4uLmN1cnJlbnRQYXRoLmF0KC0yKSwgeCwgeSk7XG4gIH1cbiAgI2VuZFBhdGgoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhc3RQb2ludCA9IHRoaXMuY3VycmVudFBhdGguYXQoLTEpO1xuICAgIHRoaXMuI2N1cnJlbnRQYXRoMkQubGluZVRvKC4uLmxhc3RQb2ludCk7XG4gIH1cbiAgI3N0b3BEcmF3aW5nKHgsIHkpIHtcbiAgICB0aGlzLiNyZXF1ZXN0RnJhbWVDYWxsYmFjayA9IG51bGw7XG4gICAgeCA9IE1hdGgubWluKE1hdGgubWF4KHgsIDApLCB0aGlzLmNhbnZhcy53aWR0aCk7XG4gICAgeSA9IE1hdGgubWluKE1hdGgubWF4KHksIDApLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgIHRoaXMuI2RyYXcoeCwgeSk7XG4gICAgdGhpcy4jZW5kUGF0aCgpO1xuICAgIGxldCBiZXppZXI7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhdGgubGVuZ3RoICE9PSAxKSB7XG4gICAgICBiZXppZXIgPSB0aGlzLiNnZW5lcmF0ZUJlemllclBvaW50cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB4eSA9IFt4LCB5XTtcbiAgICAgIGJlemllciA9IFtbeHksIHh5LnNsaWNlKCksIHh5LnNsaWNlKCksIHh5XV07XG4gICAgfVxuICAgIGNvbnN0IHBhdGgyRCA9IHRoaXMuI2N1cnJlbnRQYXRoMkQ7XG4gICAgY29uc3QgY3VycmVudFBhdGggPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgIHRoaXMuY3VycmVudFBhdGggPSBbXTtcbiAgICB0aGlzLiNjdXJyZW50UGF0aDJEID0gbmV3IFBhdGgyRCgpO1xuICAgIGNvbnN0IGNtZCA9ICgpID0+IHtcbiAgICAgIHRoaXMuYWxsUmF3UGF0aHMucHVzaChjdXJyZW50UGF0aCk7XG4gICAgICB0aGlzLnBhdGhzLnB1c2goYmV6aWVyKTtcbiAgICAgIHRoaXMuYmV6aWVyUGF0aDJELnB1c2gocGF0aDJEKTtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5yZWJ1aWxkKHRoaXMpO1xuICAgIH07XG4gICAgY29uc3QgdW5kbyA9ICgpID0+IHtcbiAgICAgIHRoaXMuYWxsUmF3UGF0aHMucG9wKCk7XG4gICAgICB0aGlzLnBhdGhzLnBvcCgpO1xuICAgICAgdGhpcy5iZXppZXJQYXRoMkQucG9wKCk7XG4gICAgICBpZiAodGhpcy5wYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICB0aGlzLiNjcmVhdGVDYW52YXMoKTtcbiAgICAgICAgICB0aGlzLiNjcmVhdGVPYnNlcnZlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2ZpdFRvQ29udGVudCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICBjbWQsXG4gICAgICB1bmRvLFxuICAgICAgbXVzdEV4ZWM6IHRydWVcbiAgICB9KTtcbiAgfVxuICAjZHJhd1BvaW50cygpIHtcbiAgICBpZiAoIXRoaXMuI2hhc1NvbWV0aGluZ1RvRHJhdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNoYXNTb21ldGhpbmdUb0RyYXcgPSBmYWxzZTtcbiAgICBjb25zdCB0aGlja25lc3MgPSBNYXRoLmNlaWwodGhpcy50aGlja25lc3MgKiB0aGlzLnBhcmVudFNjYWxlKTtcbiAgICBjb25zdCBsYXN0UG9pbnRzID0gdGhpcy5jdXJyZW50UGF0aC5zbGljZSgtMyk7XG4gICAgY29uc3QgeCA9IGxhc3RQb2ludHMubWFwKHh5ID0+IHh5WzBdKTtcbiAgICBjb25zdCB5ID0gbGFzdFBvaW50cy5tYXAoeHkgPT4geHlbMV0pO1xuICAgIGNvbnN0IHhNaW4gPSBNYXRoLm1pbiguLi54KSAtIHRoaWNrbmVzcztcbiAgICBjb25zdCB4TWF4ID0gTWF0aC5tYXgoLi4ueCkgKyB0aGlja25lc3M7XG4gICAgY29uc3QgeU1pbiA9IE1hdGgubWluKC4uLnkpIC0gdGhpY2tuZXNzO1xuICAgIGNvbnN0IHlNYXggPSBNYXRoLm1heCguLi55KSArIHRoaWNrbmVzcztcbiAgICBjb25zdCB7XG4gICAgICBjdHhcbiAgICB9ID0gdGhpcztcbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHRoaXMuYmV6aWVyUGF0aDJEKSB7XG4gICAgICBjdHguc3Ryb2tlKHBhdGgpO1xuICAgIH1cbiAgICBjdHguc3Ryb2tlKHRoaXMuI2N1cnJlbnRQYXRoMkQpO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gIH1cbiAgI21ha2VCZXppZXJDdXJ2ZShwYXRoMkQsIHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgICBjb25zdCBwcmV2WCA9ICh4MCArIHgxKSAvIDI7XG4gICAgY29uc3QgcHJldlkgPSAoeTAgKyB5MSkgLyAyO1xuICAgIGNvbnN0IHgzID0gKHgxICsgeDIpIC8gMjtcbiAgICBjb25zdCB5MyA9ICh5MSArIHkyKSAvIDI7XG4gICAgcGF0aDJELmJlemllckN1cnZlVG8ocHJldlggKyAyICogKHgxIC0gcHJldlgpIC8gMywgcHJldlkgKyAyICogKHkxIC0gcHJldlkpIC8gMywgeDMgKyAyICogKHgxIC0geDMpIC8gMywgeTMgKyAyICogKHkxIC0geTMpIC8gMywgeDMsIHkzKTtcbiAgfVxuICAjZ2VuZXJhdGVCZXppZXJQb2ludHMoKSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuY3VycmVudFBhdGg7XG4gICAgaWYgKHBhdGgubGVuZ3RoIDw9IDIpIHtcbiAgICAgIHJldHVybiBbW3BhdGhbMF0sIHBhdGhbMF0sIHBhdGguYXQoLTEpLCBwYXRoLmF0KC0xKV1dO1xuICAgIH1cbiAgICBjb25zdCBiZXppZXJQb2ludHMgPSBbXTtcbiAgICBsZXQgaTtcbiAgICBsZXQgW3gwLCB5MF0gPSBwYXRoWzBdO1xuICAgIGZvciAoaSA9IDE7IGkgPCBwYXRoLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgY29uc3QgW3gxLCB5MV0gPSBwYXRoW2ldO1xuICAgICAgY29uc3QgW3gyLCB5Ml0gPSBwYXRoW2kgKyAxXTtcbiAgICAgIGNvbnN0IHgzID0gKHgxICsgeDIpIC8gMjtcbiAgICAgIGNvbnN0IHkzID0gKHkxICsgeTIpIC8gMjtcbiAgICAgIGNvbnN0IGNvbnRyb2wxID0gW3gwICsgMiAqICh4MSAtIHgwKSAvIDMsIHkwICsgMiAqICh5MSAtIHkwKSAvIDNdO1xuICAgICAgY29uc3QgY29udHJvbDIgPSBbeDMgKyAyICogKHgxIC0geDMpIC8gMywgeTMgKyAyICogKHkxIC0geTMpIC8gM107XG4gICAgICBiZXppZXJQb2ludHMucHVzaChbW3gwLCB5MF0sIGNvbnRyb2wxLCBjb250cm9sMiwgW3gzLCB5M11dKTtcbiAgICAgIFt4MCwgeTBdID0gW3gzLCB5M107XG4gICAgfVxuICAgIGNvbnN0IFt4MSwgeTFdID0gcGF0aFtpXTtcbiAgICBjb25zdCBbeDIsIHkyXSA9IHBhdGhbaSArIDFdO1xuICAgIGNvbnN0IGNvbnRyb2wxID0gW3gwICsgMiAqICh4MSAtIHgwKSAvIDMsIHkwICsgMiAqICh5MSAtIHkwKSAvIDNdO1xuICAgIGNvbnN0IGNvbnRyb2wyID0gW3gyICsgMiAqICh4MSAtIHgyKSAvIDMsIHkyICsgMiAqICh5MSAtIHkyKSAvIDNdO1xuICAgIGJlemllclBvaW50cy5wdXNoKFtbeDAsIHkwXSwgY29udHJvbDEsIGNvbnRyb2wyLCBbeDIsIHkyXV0pO1xuICAgIHJldHVybiBiZXppZXJQb2ludHM7XG4gIH1cbiAgI3JlZHJhdygpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMuI3VwZGF0ZVRyYW5zZm9ybSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNzZXRTdHJva2UoKTtcbiAgICBjb25zdCB7XG4gICAgICBjYW52YXMsXG4gICAgICBjdHhcbiAgICB9ID0gdGhpcztcbiAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLiN1cGRhdGVUcmFuc2Zvcm0oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5iZXppZXJQYXRoMkQpIHtcbiAgICAgIGN0eC5zdHJva2UocGF0aCk7XG4gICAgfVxuICB9XG4gIGNvbW1pdCgpIHtcbiAgICBpZiAodGhpcy4jZGlzYWJsZUVkaXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuY29tbWl0KCk7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgIHRoaXMuc2V0SW5Gb3JlZ3JvdW5kKCk7XG4gICAgdGhpcy4jZGlzYWJsZUVkaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKTtcbiAgICB0aGlzLiNmaXRUb0NvbnRlbnQodHJ1ZSk7XG4gICAgdGhpcy5zZWxlY3QoKTtcbiAgICB0aGlzLnBhcmVudC5hZGRJbmtFZGl0b3JJZk5lZWRlZCh0cnVlKTtcbiAgICB0aGlzLm1vdmVJbkRPTSgpO1xuICAgIHRoaXMuZGl2LmZvY3VzKHtcbiAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICB9KTtcbiAgfVxuICBmb2N1c2luKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9mb2N1c0V2ZW50c0FsbG93ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuZm9jdXNpbihldmVudCk7XG4gICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuICB9XG4gIGNhbnZhc1BvaW50ZXJkb3duKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCAhdGhpcy5pc0luRWRpdE1vZGUoKSB8fCB0aGlzLiNkaXNhYmxlRWRpdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldEluRm9yZWdyb3VuZCgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0aGlzLmRpdi5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgdGhpcy5kaXYuZm9jdXMoe1xuICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy4jc3RhcnREcmF3aW5nKGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuICB9XG4gIGNhbnZhc1BvaW50ZXJtb3ZlKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLiNkcmF3KGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuICB9XG4gIGNhbnZhc1BvaW50ZXJ1cChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy4jZW5kRHJhd2luZyhldmVudCk7XG4gIH1cbiAgY2FudmFzUG9pbnRlcmxlYXZlKGV2ZW50KSB7XG4gICAgdGhpcy4jZW5kRHJhd2luZyhldmVudCk7XG4gIH1cbiAgI2VuZERyYXdpbmcoZXZlbnQpIHtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmxlYXZlXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmxlYXZlKTtcbiAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVybW92ZSk7XG4gICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJ1cCk7XG4gICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmRvd24sIHtcbiAgICAgIHNpZ25hbDogdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWxcbiAgICB9KTtcbiAgICBpZiAodGhpcy4jY2FudmFzQ29udGV4dE1lbnVUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCk7XG4gICAgfVxuICAgIHRoaXMuI2NhbnZhc0NvbnRleHRNZW51VGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiNjYW52YXNDb250ZXh0TWVudVRpbWVvdXRJZCA9IG51bGw7XG4gICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgbm9Db250ZXh0TWVudSk7XG4gICAgfSwgMTApO1xuICAgIHRoaXMuI3N0b3BEcmF3aW5nKGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuICAgIHRoaXMuc2V0SW5CYWNrZ3JvdW5kKCk7XG4gIH1cbiAgI2NyZWF0ZUNhbnZhcygpIHtcbiAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5oZWlnaHQgPSAwO1xuICAgIHRoaXMuY2FudmFzLmNsYXNzTmFtZSA9IFwiaW5rRWRpdG9yQ2FudmFzXCI7XG4gICAgdGhpcy5jYW52YXMuc2V0QXR0cmlidXRlKFwiZGF0YS1sMTBuLWlkXCIsIFwicGRmanMtaW5rLWNhbnZhc1wiKTtcbiAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5jYW52YXMpO1xuICAgIHRoaXMuY3R4ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICB9XG4gICNjcmVhdGVPYnNlcnZlcigpIHtcbiAgICB0aGlzLiNvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBlbnRyaWVzWzBdLmNvbnRlbnRSZWN0O1xuICAgICAgaWYgKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpIHtcbiAgICAgICAgdGhpcy5zZXREaW1lbnNpb25zKHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLiNvYnNlcnZlci5vYnNlcnZlKHRoaXMuZGl2KTtcbiAgICB0aGlzLl91aU1hbmFnZXIuX3NpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4ge1xuICAgICAgdGhpcy4jb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuI29ic2VydmVyID0gbnVsbDtcbiAgICB9LCB7XG4gICAgICBvbmNlOiB0cnVlXG4gICAgfSk7XG4gIH1cbiAgZ2V0IGlzUmVzaXphYmxlKCkge1xuICAgIHJldHVybiAhdGhpcy5pc0VtcHR5KCkgJiYgdGhpcy4jZGlzYWJsZUVkaXRpbmc7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLmRpdikge1xuICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgIH1cbiAgICBsZXQgYmFzZVgsIGJhc2VZO1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICBiYXNlWCA9IHRoaXMueDtcbiAgICAgIGJhc2VZID0gdGhpcy55O1xuICAgIH1cbiAgICBzdXBlci5yZW5kZXIoKTtcbiAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWwxMG4taWRcIiwgXCJwZGZqcy1pbmtcIik7XG4gICAgY29uc3QgW3gsIHksIHcsIGhdID0gdGhpcy4jZ2V0SW5pdGlhbEJCb3goKTtcbiAgICB0aGlzLnNldEF0KHgsIHksIDAsIDApO1xuICAgIHRoaXMuc2V0RGltcyh3LCBoKTtcbiAgICB0aGlzLiNjcmVhdGVDYW52YXMoKTtcbiAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgdGhpcy5zZXRBc3BlY3RSYXRpbyh0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcbiAgICAgIHRoaXMuc2V0QXQoYmFzZVggKiBwYXJlbnRXaWR0aCwgYmFzZVkgKiBwYXJlbnRIZWlnaHQsIHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgICAgdGhpcy4jaXNDYW52YXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB0aGlzLiNzZXRDYW52YXNEaW1zKCk7XG4gICAgICB0aGlzLnNldERpbXModGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG4gICAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImVkaXRpbmdcIik7XG4gICAgICB0aGlzLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgfVxuICAgIHRoaXMuI2NyZWF0ZU9ic2VydmVyKCk7XG4gICAgcmV0dXJuIHRoaXMuZGl2O1xuICB9XG4gICNzZXRDYW52YXNEaW1zKCkge1xuICAgIGlmICghdGhpcy4jaXNDYW52YXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy5jYW52YXMud2lkdGggPSBNYXRoLmNlaWwodGhpcy53aWR0aCAqIHBhcmVudFdpZHRoKTtcbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBNYXRoLmNlaWwodGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgIHRoaXMuI3VwZGF0ZVRyYW5zZm9ybSgpO1xuICB9XG4gIHNldERpbWVuc2lvbnMod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IHJvdW5kZWRXaWR0aCA9IE1hdGgucm91bmQod2lkdGgpO1xuICAgIGNvbnN0IHJvdW5kZWRIZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCk7XG4gICAgaWYgKHRoaXMuI3JlYWxXaWR0aCA9PT0gcm91bmRlZFdpZHRoICYmIHRoaXMuI3JlYWxIZWlnaHQgPT09IHJvdW5kZWRIZWlnaHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jcmVhbFdpZHRoID0gcm91bmRlZFdpZHRoO1xuICAgIHRoaXMuI3JlYWxIZWlnaHQgPSByb3VuZGVkSGVpZ2h0O1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLndpZHRoID0gd2lkdGggLyBwYXJlbnRXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAvIHBhcmVudEhlaWdodDtcbiAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgaWYgKHRoaXMuI2Rpc2FibGVFZGl0aW5nKSB7XG4gICAgICB0aGlzLiNzZXRTY2FsZUZhY3Rvcih3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy4jc2V0Q2FudmFzRGltcygpO1xuICAgIHRoaXMuI3JlZHJhdygpO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcbiAgICB0aGlzLmZpeERpbXMoKTtcbiAgfVxuICAjc2V0U2NhbGVGYWN0b3Iod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLiNnZXRQYWRkaW5nKCk7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3JXID0gKHdpZHRoIC0gcGFkZGluZykgLyB0aGlzLiNiYXNlV2lkdGg7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3JIID0gKGhlaWdodCAtIHBhZGRpbmcpIC8gdGhpcy4jYmFzZUhlaWdodDtcbiAgICB0aGlzLnNjYWxlRmFjdG9yID0gTWF0aC5taW4oc2NhbGVGYWN0b3JXLCBzY2FsZUZhY3RvckgpO1xuICB9XG4gICN1cGRhdGVUcmFuc2Zvcm0oKSB7XG4gICAgY29uc3QgcGFkZGluZyA9IHRoaXMuI2dldFBhZGRpbmcoKSAvIDI7XG4gICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKHRoaXMuc2NhbGVGYWN0b3IsIDAsIDAsIHRoaXMuc2NhbGVGYWN0b3IsIHRoaXMudHJhbnNsYXRpb25YICogdGhpcy5zY2FsZUZhY3RvciArIHBhZGRpbmcsIHRoaXMudHJhbnNsYXRpb25ZICogdGhpcy5zY2FsZUZhY3RvciArIHBhZGRpbmcpO1xuICB9XG4gIHN0YXRpYyAjYnVpbGRQYXRoMkQoYmV6aWVyKSB7XG4gICAgY29uc3QgcGF0aDJEID0gbmV3IFBhdGgyRCgpO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJlemllci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICBjb25zdCBbZmlyc3QsIGNvbnRyb2wxLCBjb250cm9sMiwgc2Vjb25kXSA9IGJlemllcltpXTtcbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIHBhdGgyRC5tb3ZlVG8oLi4uZmlyc3QpO1xuICAgICAgfVxuICAgICAgcGF0aDJELmJlemllckN1cnZlVG8oY29udHJvbDFbMF0sIGNvbnRyb2wxWzFdLCBjb250cm9sMlswXSwgY29udHJvbDJbMV0sIHNlY29uZFswXSwgc2Vjb25kWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGgyRDtcbiAgfVxuICBzdGF0aWMgI3RvUERGQ29vcmRpbmF0ZXMocG9pbnRzLCByZWN0LCByb3RhdGlvbikge1xuICAgIGNvbnN0IFtibFgsIGJsWSwgdHJYLCB0clldID0gcmVjdDtcbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgcG9pbnRzW2ldICs9IGJsWDtcbiAgICAgICAgICBwb2ludHNbaSArIDFdID0gdHJZIC0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgY29uc3QgeCA9IHBvaW50c1tpXTtcbiAgICAgICAgICBwb2ludHNbaV0gPSBwb2ludHNbaSArIDFdICsgYmxYO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gPSB4ICsgYmxZO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgcG9pbnRzW2ldID0gdHJYIC0gcG9pbnRzW2ldO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gKz0gYmxZO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG4gICAgICAgICAgY29uc3QgeCA9IHBvaW50c1tpXTtcbiAgICAgICAgICBwb2ludHNbaV0gPSB0clggLSBwb2ludHNbaSArIDFdO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gPSB0clkgLSB4O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuICBzdGF0aWMgI2Zyb21QREZDb29yZGluYXRlcyhwb2ludHMsIHJlY3QsIHJvdGF0aW9uKSB7XG4gICAgY29uc3QgW2JsWCwgYmxZLCB0clgsIHRyWV0gPSByZWN0O1xuICAgIHN3aXRjaCAocm90YXRpb24pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBwb2ludHNbaV0gLT0gYmxYO1xuICAgICAgICAgIHBvaW50c1tpICsgMV0gPSB0clkgLSBwb2ludHNbaSArIDFdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBjb25zdCB4ID0gcG9pbnRzW2ldO1xuICAgICAgICAgIHBvaW50c1tpXSA9IHBvaW50c1tpICsgMV0gLSBibFk7XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSA9IHggLSBibFg7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBwb2ludHNbaV0gPSB0clggLSBwb2ludHNbaV07XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSAtPSBibFk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcbiAgICAgICAgICBjb25zdCB4ID0gcG9pbnRzW2ldO1xuICAgICAgICAgIHBvaW50c1tpXSA9IHRyWSAtIHBvaW50c1tpICsgMV07XG4gICAgICAgICAgcG9pbnRzW2kgKyAxXSA9IHRyWCAtIHg7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG4gICNzZXJpYWxpemVQYXRocyhzLCB0eCwgdHksIHJlY3QpIHtcbiAgICBjb25zdCBwYXRocyA9IFtdO1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLnRoaWNrbmVzcyAvIDI7XG4gICAgY29uc3Qgc2hpZnRYID0gcyAqIHR4ICsgcGFkZGluZztcbiAgICBjb25zdCBzaGlmdFkgPSBzICogdHkgKyBwYWRkaW5nO1xuICAgIGZvciAoY29uc3QgYmV6aWVyIG9mIHRoaXMucGF0aHMpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IFtdO1xuICAgICAgY29uc3QgcG9pbnRzID0gW107XG4gICAgICBmb3IgKGxldCBqID0gMCwgamogPSBiZXppZXIubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIGNvbnRyb2wxLCBjb250cm9sMiwgc2Vjb25kXSA9IGJlemllcltqXTtcbiAgICAgICAgaWYgKGZpcnN0WzBdID09PSBzZWNvbmRbMF0gJiYgZmlyc3RbMV0gPT09IHNlY29uZFsxXSAmJiBqaiA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IHAwID0gcyAqIGZpcnN0WzBdICsgc2hpZnRYO1xuICAgICAgICAgIGNvbnN0IHAxID0gcyAqIGZpcnN0WzFdICsgc2hpZnRZO1xuICAgICAgICAgIGJ1ZmZlci5wdXNoKHAwLCBwMSk7XG4gICAgICAgICAgcG9pbnRzLnB1c2gocDAsIHAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwMTAgPSBzICogZmlyc3RbMF0gKyBzaGlmdFg7XG4gICAgICAgIGNvbnN0IHAxMSA9IHMgKiBmaXJzdFsxXSArIHNoaWZ0WTtcbiAgICAgICAgY29uc3QgcDIwID0gcyAqIGNvbnRyb2wxWzBdICsgc2hpZnRYO1xuICAgICAgICBjb25zdCBwMjEgPSBzICogY29udHJvbDFbMV0gKyBzaGlmdFk7XG4gICAgICAgIGNvbnN0IHAzMCA9IHMgKiBjb250cm9sMlswXSArIHNoaWZ0WDtcbiAgICAgICAgY29uc3QgcDMxID0gcyAqIGNvbnRyb2wyWzFdICsgc2hpZnRZO1xuICAgICAgICBjb25zdCBwNDAgPSBzICogc2Vjb25kWzBdICsgc2hpZnRYO1xuICAgICAgICBjb25zdCBwNDEgPSBzICogc2Vjb25kWzFdICsgc2hpZnRZO1xuICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgIGJ1ZmZlci5wdXNoKHAxMCwgcDExKTtcbiAgICAgICAgICBwb2ludHMucHVzaChwMTAsIHAxMSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLnB1c2gocDIwLCBwMjEsIHAzMCwgcDMxLCBwNDAsIHA0MSk7XG4gICAgICAgIHBvaW50cy5wdXNoKHAyMCwgcDIxKTtcbiAgICAgICAgaWYgKGogPT09IGpqIC0gMSkge1xuICAgICAgICAgIHBvaW50cy5wdXNoKHA0MCwgcDQxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGF0aHMucHVzaCh7XG4gICAgICAgIGJlemllcjogSW5rRWRpdG9yLiN0b1BERkNvb3JkaW5hdGVzKGJ1ZmZlciwgcmVjdCwgdGhpcy5yb3RhdGlvbiksXG4gICAgICAgIHBvaW50czogSW5rRWRpdG9yLiN0b1BERkNvb3JkaW5hdGVzKHBvaW50cywgcmVjdCwgdGhpcy5yb3RhdGlvbilcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cbiAgI2dldEJib3goKSB7XG4gICAgbGV0IHhNaW4gPSBJbmZpbml0eTtcbiAgICBsZXQgeE1heCA9IC1JbmZpbml0eTtcbiAgICBsZXQgeU1pbiA9IEluZmluaXR5O1xuICAgIGxldCB5TWF4ID0gLUluZmluaXR5O1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLnBhdGhzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtmaXJzdCwgY29udHJvbDEsIGNvbnRyb2wyLCBzZWNvbmRdIG9mIHBhdGgpIHtcbiAgICAgICAgY29uc3QgYmJveCA9IFV0aWwuYmV6aWVyQm91bmRpbmdCb3goLi4uZmlyc3QsIC4uLmNvbnRyb2wxLCAuLi5jb250cm9sMiwgLi4uc2Vjb25kKTtcbiAgICAgICAgeE1pbiA9IE1hdGgubWluKHhNaW4sIGJib3hbMF0pO1xuICAgICAgICB5TWluID0gTWF0aC5taW4oeU1pbiwgYmJveFsxXSk7XG4gICAgICAgIHhNYXggPSBNYXRoLm1heCh4TWF4LCBiYm94WzJdKTtcbiAgICAgICAgeU1heCA9IE1hdGgubWF4KHlNYXgsIGJib3hbM10pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3hNaW4sIHlNaW4sIHhNYXgsIHlNYXhdO1xuICB9XG4gICNnZXRQYWRkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNkaXNhYmxlRWRpdGluZyA/IE1hdGguY2VpbCh0aGlzLnRoaWNrbmVzcyAqIHRoaXMucGFyZW50U2NhbGUpIDogMDtcbiAgfVxuICAjZml0VG9Db250ZW50KGZpcnN0VGltZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jZGlzYWJsZUVkaXRpbmcpIHtcbiAgICAgIHRoaXMuI3JlZHJhdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBiYm94ID0gdGhpcy4jZ2V0QmJveCgpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLiNnZXRQYWRkaW5nKCk7XG4gICAgdGhpcy4jYmFzZVdpZHRoID0gTWF0aC5tYXgoQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgYmJveFsyXSAtIGJib3hbMF0pO1xuICAgIHRoaXMuI2Jhc2VIZWlnaHQgPSBNYXRoLm1heChBbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFLCBiYm94WzNdIC0gYmJveFsxXSk7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLmNlaWwocGFkZGluZyArIHRoaXMuI2Jhc2VXaWR0aCAqIHRoaXMuc2NhbGVGYWN0b3IpO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGguY2VpbChwYWRkaW5nICsgdGhpcy4jYmFzZUhlaWdodCAqIHRoaXMuc2NhbGVGYWN0b3IpO1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLndpZHRoID0gd2lkdGggLyBwYXJlbnRXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAvIHBhcmVudEhlaWdodDtcbiAgICB0aGlzLnNldEFzcGVjdFJhdGlvKHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnN0IHByZXZUcmFuc2xhdGlvblggPSB0aGlzLnRyYW5zbGF0aW9uWDtcbiAgICBjb25zdCBwcmV2VHJhbnNsYXRpb25ZID0gdGhpcy50cmFuc2xhdGlvblk7XG4gICAgdGhpcy50cmFuc2xhdGlvblggPSAtYmJveFswXTtcbiAgICB0aGlzLnRyYW5zbGF0aW9uWSA9IC1iYm94WzFdO1xuICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcbiAgICB0aGlzLiNyZWRyYXcoKTtcbiAgICB0aGlzLiNyZWFsV2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLiNyZWFsSGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMuc2V0RGltcyh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCB1bnNjYWxlZFBhZGRpbmcgPSBmaXJzdFRpbWUgPyBwYWRkaW5nIC8gdGhpcy5zY2FsZUZhY3RvciAvIDIgOiAwO1xuICAgIHRoaXMudHJhbnNsYXRlKHByZXZUcmFuc2xhdGlvblggLSB0aGlzLnRyYW5zbGF0aW9uWCAtIHVuc2NhbGVkUGFkZGluZywgcHJldlRyYW5zbGF0aW9uWSAtIHRoaXMudHJhbnNsYXRpb25ZIC0gdW5zY2FsZWRQYWRkaW5nKTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIElua0Fubm90YXRpb25FbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZWRpdG9yID0gc3VwZXIuZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpO1xuICAgIGVkaXRvci50aGlja25lc3MgPSBkYXRhLnRoaWNrbmVzcztcbiAgICBlZGl0b3IuY29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvciguLi5kYXRhLmNvbG9yKTtcbiAgICBlZGl0b3Iub3BhY2l0eSA9IGRhdGEub3BhY2l0eTtcbiAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IGVkaXRvci5wYWdlRGltZW5zaW9ucztcbiAgICBjb25zdCB3aWR0aCA9IGVkaXRvci53aWR0aCAqIHBhZ2VXaWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBlZGl0b3IuaGVpZ2h0ICogcGFnZUhlaWdodDtcbiAgICBjb25zdCBzY2FsZUZhY3RvciA9IGVkaXRvci5wYXJlbnRTY2FsZTtcbiAgICBjb25zdCBwYWRkaW5nID0gZGF0YS50aGlja25lc3MgLyAyO1xuICAgIGVkaXRvci4jZGlzYWJsZUVkaXRpbmcgPSB0cnVlO1xuICAgIGVkaXRvci4jcmVhbFdpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCk7XG4gICAgZWRpdG9yLiNyZWFsSGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuICAgIGNvbnN0IHtcbiAgICAgIHBhdGhzLFxuICAgICAgcmVjdCxcbiAgICAgIHJvdGF0aW9uXG4gICAgfSA9IGRhdGE7XG4gICAgZm9yIChsZXQge1xuICAgICAgYmV6aWVyXG4gICAgfSBvZiBwYXRocykge1xuICAgICAgYmV6aWVyID0gSW5rRWRpdG9yLiNmcm9tUERGQ29vcmRpbmF0ZXMoYmV6aWVyLCByZWN0LCByb3RhdGlvbik7XG4gICAgICBjb25zdCBwYXRoID0gW107XG4gICAgICBlZGl0b3IucGF0aHMucHVzaChwYXRoKTtcbiAgICAgIGxldCBwMCA9IHNjYWxlRmFjdG9yICogKGJlemllclswXSAtIHBhZGRpbmcpO1xuICAgICAgbGV0IHAxID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyWzFdIC0gcGFkZGluZyk7XG4gICAgICBmb3IgKGxldCBpID0gMiwgaWkgPSBiZXppZXIubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNikge1xuICAgICAgICBjb25zdCBwMTAgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaV0gLSBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgcDExID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2kgKyAxXSAtIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCBwMjAgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaSArIDJdIC0gcGFkZGluZyk7XG4gICAgICAgIGNvbnN0IHAyMSA9IHNjYWxlRmFjdG9yICogKGJlemllcltpICsgM10gLSBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgcDMwID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2kgKyA0XSAtIHBhZGRpbmcpO1xuICAgICAgICBjb25zdCBwMzEgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaSArIDVdIC0gcGFkZGluZyk7XG4gICAgICAgIHBhdGgucHVzaChbW3AwLCBwMV0sIFtwMTAsIHAxMV0sIFtwMjAsIHAyMV0sIFtwMzAsIHAzMV1dKTtcbiAgICAgICAgcDAgPSBwMzA7XG4gICAgICAgIHAxID0gcDMxO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF0aDJEID0gdGhpcy4jYnVpbGRQYXRoMkQocGF0aCk7XG4gICAgICBlZGl0b3IuYmV6aWVyUGF0aDJELnB1c2gocGF0aDJEKTtcbiAgICB9XG4gICAgY29uc3QgYmJveCA9IGVkaXRvci4jZ2V0QmJveCgpO1xuICAgIGVkaXRvci4jYmFzZVdpZHRoID0gTWF0aC5tYXgoQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgYmJveFsyXSAtIGJib3hbMF0pO1xuICAgIGVkaXRvci4jYmFzZUhlaWdodCA9IE1hdGgubWF4KEFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUsIGJib3hbM10gLSBiYm94WzFdKTtcbiAgICBlZGl0b3IuI3NldFNjYWxlRmFjdG9yKHdpZHRoLCBoZWlnaHQpO1xuICAgIHJldHVybiBlZGl0b3I7XG4gIH1cbiAgc2VyaWFsaXplKCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdldFJlY3QoMCwgMCk7XG4gICAgY29uc3QgY29sb3IgPSBBbm5vdGF0aW9uRWRpdG9yLl9jb2xvck1hbmFnZXIuY29udmVydCh0aGlzLmN0eC5zdHJva2VTdHlsZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFubm90YXRpb25UeXBlOiBBbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkssXG4gICAgICBjb2xvcixcbiAgICAgIHRoaWNrbmVzczogdGhpcy50aGlja25lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLm9wYWNpdHksXG4gICAgICBwYXRoczogdGhpcy4jc2VyaWFsaXplUGF0aHModGhpcy5zY2FsZUZhY3RvciAvIHRoaXMucGFyZW50U2NhbGUsIHRoaXMudHJhbnNsYXRpb25YLCB0aGlzLnRyYW5zbGF0aW9uWSwgcmVjdCksXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcmVjdCxcbiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuICAgICAgc3RydWN0VHJlZVBhcmVudElkOiB0aGlzLl9zdHJ1Y3RUcmVlUGFyZW50SWRcbiAgICB9O1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2VkaXRvci9zdGFtcC5qc1xuXG5cblxuXG5jbGFzcyBTdGFtcEVkaXRvciBleHRlbmRzIEFubm90YXRpb25FZGl0b3Ige1xuICAjYml0bWFwID0gbnVsbDtcbiAgI2JpdG1hcElkID0gbnVsbDtcbiAgI2JpdG1hcFByb21pc2UgPSBudWxsO1xuICAjYml0bWFwVXJsID0gbnVsbDtcbiAgI2JpdG1hcEZpbGUgPSBudWxsO1xuICAjYml0bWFwRmlsZU5hbWUgPSBcIlwiO1xuICAjY2FudmFzID0gbnVsbDtcbiAgI29ic2VydmVyID0gbnVsbDtcbiAgI3Jlc2l6ZVRpbWVvdXRJZCA9IG51bGw7XG4gICNpc1N2ZyA9IGZhbHNlO1xuICAjaGFzQmVlbkFkZGVkSW5VbmRvU3RhY2sgPSBmYWxzZTtcbiAgc3RhdGljIF90eXBlID0gXCJzdGFtcFwiO1xuICBzdGF0aWMgX2VkaXRvclR5cGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUDtcbiAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgbmFtZTogXCJzdGFtcEVkaXRvclwiXG4gICAgfSk7XG4gICAgdGhpcy4jYml0bWFwVXJsID0gcGFyYW1zLmJpdG1hcFVybDtcbiAgICB0aGlzLiNiaXRtYXBGaWxlID0gcGFyYW1zLmJpdG1hcEZpbGU7XG4gIH1cbiAgc3RhdGljIGluaXRpYWxpemUobDEwbiwgdWlNYW5hZ2VyKSB7XG4gICAgQW5ub3RhdGlvbkVkaXRvci5pbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcik7XG4gIH1cbiAgc3RhdGljIGdldCBzdXBwb3J0ZWRUeXBlcygpIHtcbiAgICBjb25zdCB0eXBlcyA9IFtcImFwbmdcIiwgXCJhdmlmXCIsIFwiYm1wXCIsIFwiZ2lmXCIsIFwianBlZ1wiLCBcInBuZ1wiLCBcInN2Zyt4bWxcIiwgXCJ3ZWJwXCIsIFwieC1pY29uXCJdO1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJzdXBwb3J0ZWRUeXBlc1wiLCB0eXBlcy5tYXAodHlwZSA9PiBgaW1hZ2UvJHt0eXBlfWApKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHN1cHBvcnRlZFR5cGVzU3RyKCkge1xuICAgIHJldHVybiBzaGFkb3codGhpcywgXCJzdXBwb3J0ZWRUeXBlc1N0clwiLCB0aGlzLnN1cHBvcnRlZFR5cGVzLmpvaW4oXCIsXCIpKTtcbiAgfVxuICBzdGF0aWMgaXNIYW5kbGluZ01pbWVGb3JQYXN0aW5nKG1pbWUpIHtcbiAgICByZXR1cm4gdGhpcy5zdXBwb3J0ZWRUeXBlcy5pbmNsdWRlcyhtaW1lKTtcbiAgfVxuICBzdGF0aWMgcGFzdGUoaXRlbSwgcGFyZW50KSB7XG4gICAgcGFyZW50LnBhc3RlRWRpdG9yKEFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QLCB7XG4gICAgICBiaXRtYXBGaWxlOiBpdGVtLmdldEFzRmlsZSgpXG4gICAgfSk7XG4gIH1cbiAgI2dldEJpdG1hcEZldGNoZWQoZGF0YSwgZnJvbUlkID0gZmFsc2UpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuI2JpdG1hcCA9IGRhdGEuYml0bWFwO1xuICAgIGlmICghZnJvbUlkKSB7XG4gICAgICB0aGlzLiNiaXRtYXBJZCA9IGRhdGEuaWQ7XG4gICAgICB0aGlzLiNpc1N2ZyA9IGRhdGEuaXNTdmc7XG4gICAgfVxuICAgIGlmIChkYXRhLmZpbGUpIHtcbiAgICAgIHRoaXMuI2JpdG1hcEZpbGVOYW1lID0gZGF0YS5maWxlLm5hbWU7XG4gICAgfVxuICAgIHRoaXMuI2NyZWF0ZUNhbnZhcygpO1xuICB9XG4gICNnZXRCaXRtYXBEb25lKCkge1xuICAgIHRoaXMuI2JpdG1hcFByb21pc2UgPSBudWxsO1xuICAgIHRoaXMuX3VpTWFuYWdlci5lbmFibGVXYWl0aW5nKGZhbHNlKTtcbiAgICBpZiAodGhpcy4jY2FudmFzKSB7XG4gICAgICB0aGlzLmRpdi5mb2N1cygpO1xuICAgIH1cbiAgfVxuICAjZ2V0Qml0bWFwKCkge1xuICAgIGlmICh0aGlzLiNiaXRtYXBJZCkge1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmVuYWJsZVdhaXRpbmcodHJ1ZSk7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmdldEZyb21JZCh0aGlzLiNiaXRtYXBJZCkudGhlbihkYXRhID0+IHRoaXMuI2dldEJpdG1hcEZldGNoZWQoZGF0YSwgdHJ1ZSkpLmZpbmFsbHkoKCkgPT4gdGhpcy4jZ2V0Qml0bWFwRG9uZSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2JpdG1hcFVybCkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy4jYml0bWFwVXJsO1xuICAgICAgdGhpcy4jYml0bWFwVXJsID0gbnVsbDtcbiAgICAgIHRoaXMuX3VpTWFuYWdlci5lbmFibGVXYWl0aW5nKHRydWUpO1xuICAgICAgdGhpcy4jYml0bWFwUHJvbWlzZSA9IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0RnJvbVVybCh1cmwpLnRoZW4oZGF0YSA9PiB0aGlzLiNnZXRCaXRtYXBGZXRjaGVkKGRhdGEpKS5maW5hbGx5KCgpID0+IHRoaXMuI2dldEJpdG1hcERvbmUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiNiaXRtYXBGaWxlKSB7XG4gICAgICBjb25zdCBmaWxlID0gdGhpcy4jYml0bWFwRmlsZTtcbiAgICAgIHRoaXMuI2JpdG1hcEZpbGUgPSBudWxsO1xuICAgICAgdGhpcy5fdWlNYW5hZ2VyLmVuYWJsZVdhaXRpbmcodHJ1ZSk7XG4gICAgICB0aGlzLiNiaXRtYXBQcm9taXNlID0gdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tRmlsZShmaWxlKS50aGVuKGRhdGEgPT4gdGhpcy4jZ2V0Qml0bWFwRmV0Y2hlZChkYXRhKSkuZmluYWxseSgoKSA9PiB0aGlzLiNnZXRCaXRtYXBEb25lKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC50eXBlID0gXCJmaWxlXCI7XG4gICAgaW5wdXQuYWNjZXB0ID0gU3RhbXBFZGl0b3Iuc3VwcG9ydGVkVHlwZXNTdHI7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWw7XG4gICAgdGhpcy4jYml0bWFwUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghaW5wdXQuZmlsZXMgfHwgaW5wdXQuZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl91aU1hbmFnZXIuZW5hYmxlV2FpdGluZyh0cnVlKTtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tRmlsZShpbnB1dC5maWxlc1swXSk7XG4gICAgICAgICAgdGhpcy4jZ2V0Qml0bWFwRmV0Y2hlZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCB7XG4gICAgICAgIHNpZ25hbFxuICAgICAgfSk7XG4gICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiY2FuY2VsXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwge1xuICAgICAgICBzaWduYWxcbiAgICAgIH0pO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4gdGhpcy4jZ2V0Qml0bWFwRG9uZSgpKTtcbiAgICBpbnB1dC5jbGljaygpO1xuICB9XG4gIHJlbW92ZSgpIHtcbiAgICBpZiAodGhpcy4jYml0bWFwSWQpIHtcbiAgICAgIHRoaXMuI2JpdG1hcCA9IG51bGw7XG4gICAgICB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmRlbGV0ZUlkKHRoaXMuI2JpdG1hcElkKTtcbiAgICAgIHRoaXMuI2NhbnZhcz8ucmVtb3ZlKCk7XG4gICAgICB0aGlzLiNjYW52YXMgPSBudWxsO1xuICAgICAgdGhpcy4jb2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuI29ic2VydmVyID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLiNyZXNpemVUaW1lb3V0SWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCk7XG4gICAgICAgIHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLnJlbW92ZSgpO1xuICB9XG4gIHJlYnVpbGQoKSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgaWYgKHRoaXMuI2JpdG1hcElkKSB7XG4gICAgICAgIHRoaXMuI2dldEJpdG1hcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgaWYgKHRoaXMuZGl2ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiNiaXRtYXBJZCAmJiB0aGlzLiNjYW52YXMgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuI2dldEJpdG1hcCgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG4gICAgfVxuICB9XG4gIG9uY2VBZGRlZCgpIHtcbiAgICB0aGlzLl9pc0RyYWdnYWJsZSA9IHRydWU7XG4gICAgdGhpcy5kaXYuZm9jdXMoKTtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhKHRoaXMuI2JpdG1hcFByb21pc2UgfHwgdGhpcy4jYml0bWFwIHx8IHRoaXMuI2JpdG1hcFVybCB8fCB0aGlzLiNiaXRtYXBGaWxlIHx8IHRoaXMuI2JpdG1hcElkKTtcbiAgfVxuICBnZXQgaXNSZXNpemFibGUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLmRpdikge1xuICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgIH1cbiAgICBsZXQgYmFzZVgsIGJhc2VZO1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICBiYXNlWCA9IHRoaXMueDtcbiAgICAgIGJhc2VZID0gdGhpcy55O1xuICAgIH1cbiAgICBzdXBlci5yZW5kZXIoKTtcbiAgICB0aGlzLmRpdi5oaWRkZW4gPSB0cnVlO1xuICAgIHRoaXMuYWRkQWx0VGV4dEJ1dHRvbigpO1xuICAgIGlmICh0aGlzLiNiaXRtYXApIHtcbiAgICAgIHRoaXMuI2NyZWF0ZUNhbnZhcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNnZXRCaXRtYXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgIHRoaXMuc2V0QXQoYmFzZVggKiBwYXJlbnRXaWR0aCwgYmFzZVkgKiBwYXJlbnRIZWlnaHQsIHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaXY7XG4gIH1cbiAgI2NyZWF0ZUNhbnZhcygpIHtcbiAgICBjb25zdCB7XG4gICAgICBkaXZcbiAgICB9ID0gdGhpcztcbiAgICBsZXQge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHRcbiAgICB9ID0gdGhpcy4jYml0bWFwO1xuICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICBjb25zdCBNQVhfUkFUSU8gPSAwLjc1O1xuICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICB3aWR0aCA9IHRoaXMud2lkdGggKiBwYWdlV2lkdGg7XG4gICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodCAqIHBhZ2VIZWlnaHQ7XG4gICAgfSBlbHNlIGlmICh3aWR0aCA+IE1BWF9SQVRJTyAqIHBhZ2VXaWR0aCB8fCBoZWlnaHQgPiBNQVhfUkFUSU8gKiBwYWdlSGVpZ2h0KSB7XG4gICAgICBjb25zdCBmYWN0b3IgPSBNYXRoLm1pbihNQVhfUkFUSU8gKiBwYWdlV2lkdGggLyB3aWR0aCwgTUFYX1JBVElPICogcGFnZUhlaWdodCAvIGhlaWdodCk7XG4gICAgICB3aWR0aCAqPSBmYWN0b3I7XG4gICAgICBoZWlnaHQgKj0gZmFjdG9yO1xuICAgIH1cbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgdGhpcy5zZXREaW1zKHdpZHRoICogcGFyZW50V2lkdGggLyBwYWdlV2lkdGgsIGhlaWdodCAqIHBhcmVudEhlaWdodCAvIHBhZ2VIZWlnaHQpO1xuICAgIHRoaXMuX3VpTWFuYWdlci5lbmFibGVXYWl0aW5nKGZhbHNlKTtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLiNjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGRpdi5hcHBlbmQoY2FudmFzKTtcbiAgICBkaXYuaGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy4jZHJhd0JpdG1hcCh3aWR0aCwgaGVpZ2h0KTtcbiAgICB0aGlzLiNjcmVhdGVPYnNlcnZlcigpO1xuICAgIGlmICghdGhpcy4jaGFzQmVlbkFkZGVkSW5VbmRvU3RhY2spIHtcbiAgICAgIHRoaXMucGFyZW50LmFkZFVuZG9hYmxlRWRpdG9yKHRoaXMpO1xuICAgICAgdGhpcy4jaGFzQmVlbkFkZGVkSW5VbmRvU3RhY2sgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9yZXBvcnRUZWxlbWV0cnkoe1xuICAgICAgYWN0aW9uOiBcImluc2VydGVkX2ltYWdlXCJcbiAgICB9KTtcbiAgICBpZiAodGhpcy4jYml0bWFwRmlsZU5hbWUpIHtcbiAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHRoaXMuI2JpdG1hcEZpbGVOYW1lKTtcbiAgICB9XG4gIH1cbiAgI3NldERpbWVuc2lvbnMod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICB0aGlzLndpZHRoID0gd2lkdGggLyBwYXJlbnRXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAvIHBhcmVudEhlaWdodDtcbiAgICB0aGlzLnNldERpbXMod2lkdGgsIGhlaWdodCk7XG4gICAgaWYgKHRoaXMuX2luaXRpYWxPcHRpb25zPy5pc0NlbnRlcmVkKSB7XG4gICAgICB0aGlzLmNlbnRlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRpYWxPcHRpb25zID0gbnVsbDtcbiAgICBpZiAodGhpcy4jcmVzaXplVGltZW91dElkICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jcmVzaXplVGltZW91dElkKTtcbiAgICB9XG4gICAgY29uc3QgVElNRV9UT19XQUlUID0gMjAwO1xuICAgIHRoaXMuI3Jlc2l6ZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy4jcmVzaXplVGltZW91dElkID0gbnVsbDtcbiAgICAgIHRoaXMuI2RyYXdCaXRtYXAod2lkdGgsIGhlaWdodCk7XG4gICAgfSwgVElNRV9UT19XQUlUKTtcbiAgfVxuICAjc2NhbGVCaXRtYXAod2lkdGgsIGhlaWdodCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoOiBiaXRtYXBXaWR0aCxcbiAgICAgIGhlaWdodDogYml0bWFwSGVpZ2h0XG4gICAgfSA9IHRoaXMuI2JpdG1hcDtcbiAgICBsZXQgbmV3V2lkdGggPSBiaXRtYXBXaWR0aDtcbiAgICBsZXQgbmV3SGVpZ2h0ID0gYml0bWFwSGVpZ2h0O1xuICAgIGxldCBiaXRtYXAgPSB0aGlzLiNiaXRtYXA7XG4gICAgd2hpbGUgKG5ld1dpZHRoID4gMiAqIHdpZHRoIHx8IG5ld0hlaWdodCA+IDIgKiBoZWlnaHQpIHtcbiAgICAgIGNvbnN0IHByZXZXaWR0aCA9IG5ld1dpZHRoO1xuICAgICAgY29uc3QgcHJldkhlaWdodCA9IG5ld0hlaWdodDtcbiAgICAgIGlmIChuZXdXaWR0aCA+IDIgKiB3aWR0aCkge1xuICAgICAgICBuZXdXaWR0aCA9IG5ld1dpZHRoID49IDE2Mzg0ID8gTWF0aC5mbG9vcihuZXdXaWR0aCAvIDIpIC0gMSA6IE1hdGguY2VpbChuZXdXaWR0aCAvIDIpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld0hlaWdodCA+IDIgKiBoZWlnaHQpIHtcbiAgICAgICAgbmV3SGVpZ2h0ID0gbmV3SGVpZ2h0ID49IDE2Mzg0ID8gTWF0aC5mbG9vcihuZXdIZWlnaHQgLyAyKSAtIDEgOiBNYXRoLmNlaWwobmV3SGVpZ2h0IC8gMik7XG4gICAgICB9XG4gICAgICBjb25zdCBvZmZzY3JlZW4gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgY29uc3QgY3R4ID0gb2Zmc2NyZWVuLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwLCBwcmV2V2lkdGgsIHByZXZIZWlnaHQsIDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgYml0bWFwID0gb2Zmc2NyZWVuLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO1xuICAgIH1cbiAgICByZXR1cm4gYml0bWFwO1xuICB9XG4gICNkcmF3Qml0bWFwKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB3aWR0aCA9IE1hdGguY2VpbCh3aWR0aCk7XG4gICAgaGVpZ2h0ID0gTWF0aC5jZWlsKGhlaWdodCk7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy4jY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8IGNhbnZhcy53aWR0aCA9PT0gd2lkdGggJiYgY2FudmFzLmhlaWdodCA9PT0gaGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgYml0bWFwID0gdGhpcy4jaXNTdmcgPyB0aGlzLiNiaXRtYXAgOiB0aGlzLiNzY2FsZUJpdG1hcCh3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAodGhpcy5fdWlNYW5hZ2VyLmhhc01MTWFuYWdlciAmJiAhdGhpcy5oYXNBbHRUZXh0KCkpIHtcbiAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBjdHggPSBvZmZzY3JlZW4uZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIGJpdG1hcC53aWR0aCwgYml0bWFwLmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLl91aU1hbmFnZXIubWxHdWVzcyh7XG4gICAgICAgIHNlcnZpY2U6IFwiaW1hZ2UtdG8tdGV4dFwiLFxuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgZGF0YTogY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhLFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBjaGFubmVsczogNFxuICAgICAgICB9XG4gICAgICB9KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgY29uc3QgYWx0VGV4dCA9IHJlc3BvbnNlPy5vdXRwdXQgfHwgXCJcIjtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIGFsdFRleHQgJiYgIXRoaXMuaGFzQWx0VGV4dCgpKSB7XG4gICAgICAgICAgdGhpcy5hbHRUZXh0RGF0YSA9IHtcbiAgICAgICAgICAgIGFsdFRleHQsXG4gICAgICAgICAgICBkZWNvcmF0aXZlOiBmYWxzZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGN0eC5maWx0ZXIgPSB0aGlzLl91aU1hbmFnZXIuaGNtRmlsdGVyO1xuICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwLCBiaXRtYXAud2lkdGgsIGJpdG1hcC5oZWlnaHQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICB9XG4gIGdldEltYWdlRm9yQWx0VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY2FudmFzO1xuICB9XG4gICNzZXJpYWxpemVCaXRtYXAodG9VcmwpIHtcbiAgICBpZiAodG9VcmwpIHtcbiAgICAgIGlmICh0aGlzLiNpc1N2Zykge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmdldFN2Z1VybCh0aGlzLiNiaXRtYXBJZCk7XG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgKHtcbiAgICAgICAgd2lkdGg6IGNhbnZhcy53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjYW52YXMuaGVpZ2h0XG4gICAgICB9ID0gdGhpcy4jYml0bWFwKTtcbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjdHguZHJhd0ltYWdlKHRoaXMuI2JpdG1hcCwgMCwgMCk7XG4gICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy4jaXNTdmcpIHtcbiAgICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5yb3VuZCh0aGlzLndpZHRoICogcGFnZVdpZHRoICogUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgucm91bmQodGhpcy5oZWlnaHQgKiBwYWdlSGVpZ2h0ICogUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTKTtcbiAgICAgIGNvbnN0IG9mZnNjcmVlbiA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgICBjb25zdCBjdHggPSBvZmZzY3JlZW4uZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgY3R4LmRyYXdJbWFnZSh0aGlzLiNiaXRtYXAsIDAsIDAsIHRoaXMuI2JpdG1hcC53aWR0aCwgdGhpcy4jYml0bWFwLmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICByZXR1cm4gb2Zmc2NyZWVuLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHRoaXMuI2JpdG1hcCk7XG4gIH1cbiAgI2NyZWF0ZU9ic2VydmVyKCkge1xuICAgIGlmICghdGhpcy5fdWlNYW5hZ2VyLl9zaWduYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gZW50cmllc1swXS5jb250ZW50UmVjdDtcbiAgICAgIGlmIChyZWN0LndpZHRoICYmIHJlY3QuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuI3NldERpbWVuc2lvbnMocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuI29ic2VydmVyLm9ic2VydmUodGhpcy5kaXYpO1xuICAgIHRoaXMuX3VpTWFuYWdlci5fc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiB7XG4gICAgICB0aGlzLiNvYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy4jb2JzZXJ2ZXIgPSBudWxsO1xuICAgIH0sIHtcbiAgICAgIG9uY2U6IHRydWVcbiAgICB9KTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBlZGl0b3IgPSBzdXBlci5kZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcik7XG4gICAgY29uc3Qge1xuICAgICAgcmVjdCxcbiAgICAgIGJpdG1hcFVybCxcbiAgICAgIGJpdG1hcElkLFxuICAgICAgaXNTdmcsXG4gICAgICBhY2Nlc3NpYmlsaXR5RGF0YVxuICAgIH0gPSBkYXRhO1xuICAgIGlmIChiaXRtYXBJZCAmJiB1aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmlzVmFsaWRJZChiaXRtYXBJZCkpIHtcbiAgICAgIGVkaXRvci4jYml0bWFwSWQgPSBiaXRtYXBJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdG9yLiNiaXRtYXBVcmwgPSBiaXRtYXBVcmw7XG4gICAgfVxuICAgIGVkaXRvci4jaXNTdmcgPSBpc1N2ZztcbiAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSBlZGl0b3IucGFnZURpbWVuc2lvbnM7XG4gICAgZWRpdG9yLndpZHRoID0gKHJlY3RbMl0gLSByZWN0WzBdKSAvIHBhcmVudFdpZHRoO1xuICAgIGVkaXRvci5oZWlnaHQgPSAocmVjdFszXSAtIHJlY3RbMV0pIC8gcGFyZW50SGVpZ2h0O1xuICAgIGlmIChhY2Nlc3NpYmlsaXR5RGF0YSkge1xuICAgICAgZWRpdG9yLmFsdFRleHREYXRhID0gYWNjZXNzaWJpbGl0eURhdGE7XG4gICAgfVxuICAgIHJldHVybiBlZGl0b3I7XG4gIH1cbiAgc2VyaWFsaXplKGlzRm9yQ29weWluZyA9IGZhbHNlLCBjb250ZXh0ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB7XG4gICAgICBhbm5vdGF0aW9uVHlwZTogQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVAsXG4gICAgICBiaXRtYXBJZDogdGhpcy4jYml0bWFwSWQsXG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcmVjdDogdGhpcy5nZXRSZWN0KDAsIDApLFxuICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sXG4gICAgICBpc1N2ZzogdGhpcy4jaXNTdmcsXG4gICAgICBzdHJ1Y3RUcmVlUGFyZW50SWQ6IHRoaXMuX3N0cnVjdFRyZWVQYXJlbnRJZFxuICAgIH07XG4gICAgaWYgKGlzRm9yQ29weWluZykge1xuICAgICAgc2VyaWFsaXplZC5iaXRtYXBVcmwgPSB0aGlzLiNzZXJpYWxpemVCaXRtYXAodHJ1ZSk7XG4gICAgICBzZXJpYWxpemVkLmFjY2Vzc2liaWxpdHlEYXRhID0gdGhpcy5hbHRUZXh0RGF0YTtcbiAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBkZWNvcmF0aXZlLFxuICAgICAgYWx0VGV4dFxuICAgIH0gPSB0aGlzLmFsdFRleHREYXRhO1xuICAgIGlmICghZGVjb3JhdGl2ZSAmJiBhbHRUZXh0KSB7XG4gICAgICBzZXJpYWxpemVkLmFjY2Vzc2liaWxpdHlEYXRhID0ge1xuICAgICAgICB0eXBlOiBcIkZpZ3VyZVwiLFxuICAgICAgICBhbHQ6IGFsdFRleHRcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChjb250ZXh0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG4gICAgY29udGV4dC5zdGFtcHMgfHw9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBhcmVhID0gdGhpcy4jaXNTdmcgPyAoc2VyaWFsaXplZC5yZWN0WzJdIC0gc2VyaWFsaXplZC5yZWN0WzBdKSAqIChzZXJpYWxpemVkLnJlY3RbM10gLSBzZXJpYWxpemVkLnJlY3RbMV0pIDogbnVsbDtcbiAgICBpZiAoIWNvbnRleHQuc3RhbXBzLmhhcyh0aGlzLiNiaXRtYXBJZCkpIHtcbiAgICAgIGNvbnRleHQuc3RhbXBzLnNldCh0aGlzLiNiaXRtYXBJZCwge1xuICAgICAgICBhcmVhLFxuICAgICAgICBzZXJpYWxpemVkXG4gICAgICB9KTtcbiAgICAgIHNlcmlhbGl6ZWQuYml0bWFwID0gdGhpcy4jc2VyaWFsaXplQml0bWFwKGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2lzU3ZnKSB7XG4gICAgICBjb25zdCBwcmV2RGF0YSA9IGNvbnRleHQuc3RhbXBzLmdldCh0aGlzLiNiaXRtYXBJZCk7XG4gICAgICBpZiAoYXJlYSA+IHByZXZEYXRhLmFyZWEpIHtcbiAgICAgICAgcHJldkRhdGEuYXJlYSA9IGFyZWE7XG4gICAgICAgIHByZXZEYXRhLnNlcmlhbGl6ZWQuYml0bWFwLmNsb3NlKCk7XG4gICAgICAgIHByZXZEYXRhLnNlcmlhbGl6ZWQuYml0bWFwID0gdGhpcy4jc2VyaWFsaXplQml0bWFwKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gIH1cbn1cblxuOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2Rpc3BsYXkvZWRpdG9yL2Fubm90YXRpb25fZWRpdG9yX2xheWVyLmpzXG5cblxuXG5cblxuXG5cbmNsYXNzIEFubm90YXRpb25FZGl0b3JMYXllciB7XG4gICNhY2Nlc3NpYmlsaXR5TWFuYWdlcjtcbiAgI2FsbG93Q2xpY2sgPSBmYWxzZTtcbiAgI2Fubm90YXRpb25MYXllciA9IG51bGw7XG4gICNib3VuZFBvaW50ZXJ1cCA9IG51bGw7XG4gICNib3VuZFBvaW50ZXJkb3duID0gbnVsbDtcbiAgI2JvdW5kVGV4dExheWVyUG9pbnRlckRvd24gPSBudWxsO1xuICAjZWRpdG9yRm9jdXNUaW1lb3V0SWQgPSBudWxsO1xuICAjZWRpdG9ycyA9IG5ldyBNYXAoKTtcbiAgI2hhZFBvaW50ZXJEb3duID0gZmFsc2U7XG4gICNpc0NsZWFuaW5nVXAgPSBmYWxzZTtcbiAgI2lzRGlzYWJsaW5nID0gZmFsc2U7XG4gICN0ZXh0TGF5ZXIgPSBudWxsO1xuICAjdWlNYW5hZ2VyO1xuICBzdGF0aWMgX2luaXRpYWxpemVkID0gZmFsc2U7XG4gIHN0YXRpYyAjZWRpdG9yVHlwZXMgPSBuZXcgTWFwKFtGcmVlVGV4dEVkaXRvciwgSW5rRWRpdG9yLCBTdGFtcEVkaXRvciwgSGlnaGxpZ2h0RWRpdG9yXS5tYXAodHlwZSA9PiBbdHlwZS5fZWRpdG9yVHlwZSwgdHlwZV0pKTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHVpTWFuYWdlcixcbiAgICBwYWdlSW5kZXgsXG4gICAgZGl2LFxuICAgIGFjY2Vzc2liaWxpdHlNYW5hZ2VyLFxuICAgIGFubm90YXRpb25MYXllcixcbiAgICBkcmF3TGF5ZXIsXG4gICAgdGV4dExheWVyLFxuICAgIHZpZXdwb3J0LFxuICAgIGwxMG5cbiAgfSkge1xuICAgIGNvbnN0IGVkaXRvclR5cGVzID0gWy4uLkFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMudmFsdWVzKCldO1xuICAgIGlmICghQW5ub3RhdGlvbkVkaXRvckxheWVyLl9pbml0aWFsaXplZCkge1xuICAgICAgQW5ub3RhdGlvbkVkaXRvckxheWVyLl9pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgZWRpdG9yVHlwZXMpIHtcbiAgICAgICAgZWRpdG9yVHlwZS5pbml0aWFsaXplKGwxMG4sIHVpTWFuYWdlcik7XG4gICAgICB9XG4gICAgfVxuICAgIHVpTWFuYWdlci5yZWdpc3RlckVkaXRvclR5cGVzKGVkaXRvclR5cGVzKTtcbiAgICB0aGlzLiN1aU1hbmFnZXIgPSB1aU1hbmFnZXI7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gICAgdGhpcy5kaXYgPSBkaXY7XG4gICAgdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBhY2Nlc3NpYmlsaXR5TWFuYWdlcjtcbiAgICB0aGlzLiNhbm5vdGF0aW9uTGF5ZXIgPSBhbm5vdGF0aW9uTGF5ZXI7XG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIHRoaXMuI3RleHRMYXllciA9IHRleHRMYXllcjtcbiAgICB0aGlzLmRyYXdMYXllciA9IGRyYXdMYXllcjtcbiAgICB0aGlzLiN1aU1hbmFnZXIuYWRkTGF5ZXIodGhpcyk7XG4gIH1cbiAgZ2V0IGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2VkaXRvcnMuc2l6ZSA9PT0gMDtcbiAgfVxuICBnZXQgaXNJbnZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNFbXB0eSAmJiB0aGlzLiN1aU1hbmFnZXIuZ2V0TW9kZSgpID09PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FO1xuICB9XG4gIHVwZGF0ZVRvb2xiYXIobW9kZSkge1xuICAgIHRoaXMuI3VpTWFuYWdlci51cGRhdGVUb29sYmFyKG1vZGUpO1xuICB9XG4gIHVwZGF0ZU1vZGUobW9kZSA9IHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkpIHtcbiAgICB0aGlzLiNjbGVhbnVwKCk7XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLk5PTkU6XG4gICAgICAgIHRoaXMuZGlzYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy50b2dnbGVQb2ludGVyRXZlbnRzKGZhbHNlKTtcbiAgICAgICAgdGhpcy50b2dnbGVBbm5vdGF0aW9uTGF5ZXJQb2ludGVyRXZlbnRzKHRydWUpO1xuICAgICAgICB0aGlzLmRpc2FibGVDbGljaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLklOSzpcbiAgICAgICAgdGhpcy5hZGRJbmtFZGl0b3JJZk5lZWRlZChmYWxzZSk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy50b2dnbGVQb2ludGVyRXZlbnRzKHRydWUpO1xuICAgICAgICB0aGlzLmRpc2FibGVDbGljaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUOlxuICAgICAgICB0aGlzLmVuYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy50b2dnbGVQb2ludGVyRXZlbnRzKGZhbHNlKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlQ2xpY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmRpc2FibGVUZXh0U2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlUG9pbnRlckV2ZW50cyh0cnVlKTtcbiAgICAgICAgdGhpcy5lbmFibGVDbGljaygpO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZUFubm90YXRpb25MYXllclBvaW50ZXJFdmVudHMoZmFsc2UpO1xuICAgIGNvbnN0IHtcbiAgICAgIGNsYXNzTGlzdFxuICAgIH0gPSB0aGlzLmRpdjtcbiAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgQW5ub3RhdGlvbkVkaXRvckxheWVyLiNlZGl0b3JUeXBlcy52YWx1ZXMoKSkge1xuICAgICAgY2xhc3NMaXN0LnRvZ2dsZShgJHtlZGl0b3JUeXBlLl90eXBlfUVkaXRpbmdgLCBtb2RlID09PSBlZGl0b3JUeXBlLl9lZGl0b3JUeXBlKTtcbiAgICB9XG4gICAgdGhpcy5kaXYuaGlkZGVuID0gZmFsc2U7XG4gIH1cbiAgaGFzVGV4dExheWVyKHRleHRMYXllcikge1xuICAgIHJldHVybiB0ZXh0TGF5ZXIgPT09IHRoaXMuI3RleHRMYXllcj8uZGl2O1xuICB9XG4gIGFkZElua0VkaXRvcklmTmVlZGVkKGlzQ29tbWl0dGluZykge1xuICAgIGlmICh0aGlzLiN1aU1hbmFnZXIuZ2V0TW9kZSgpICE9PSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFpc0NvbW1pdHRpbmcpIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKGVkaXRvci5pc0VtcHR5KCkpIHtcbiAgICAgICAgICBlZGl0b3Iuc2V0SW5CYWNrZ3JvdW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuY3JlYXRlQW5kQWRkTmV3RWRpdG9yKHtcbiAgICAgIG9mZnNldFg6IDAsXG4gICAgICBvZmZzZXRZOiAwXG4gICAgfSwgZmFsc2UpO1xuICAgIGVkaXRvci5zZXRJbkJhY2tncm91bmQoKTtcbiAgfVxuICBzZXRFZGl0aW5nU3RhdGUoaXNFZGl0aW5nKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnNldEVkaXRpbmdTdGF0ZShpc0VkaXRpbmcpO1xuICB9XG4gIGFkZENvbW1hbmRzKHBhcmFtcykge1xuICAgIHRoaXMuI3VpTWFuYWdlci5hZGRDb21tYW5kcyhwYXJhbXMpO1xuICB9XG4gIHRvZ2dsZVBvaW50ZXJFdmVudHMoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImRpc2FibGVkXCIsICFlbmFibGVkKTtcbiAgfVxuICB0b2dnbGVBbm5vdGF0aW9uTGF5ZXJQb2ludGVyRXZlbnRzKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHRoaXMuI2Fubm90YXRpb25MYXllcj8uZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJkaXNhYmxlZFwiLCAhZW5hYmxlZCk7XG4gIH1cbiAgZW5hYmxlKCkge1xuICAgIHRoaXMuZGl2LnRhYkluZGV4ID0gMDtcbiAgICB0aGlzLnRvZ2dsZVBvaW50ZXJFdmVudHModHJ1ZSk7XG4gICAgY29uc3QgYW5ub3RhdGlvbkVsZW1lbnRJZHMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgZWRpdG9yLmVuYWJsZUVkaXRpbmcoKTtcbiAgICAgIGVkaXRvci5zaG93KHRydWUpO1xuICAgICAgaWYgKGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgICAgIHRoaXMuI3VpTWFuYWdlci5yZW1vdmVDaGFuZ2VkRXhpc3RpbmdBbm5vdGF0aW9uKGVkaXRvcik7XG4gICAgICAgIGFubm90YXRpb25FbGVtZW50SWRzLmFkZChlZGl0b3IuYW5ub3RhdGlvbkVsZW1lbnRJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy4jYW5ub3RhdGlvbkxheWVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVkaXRhYmxlcyA9IHRoaXMuI2Fubm90YXRpb25MYXllci5nZXRFZGl0YWJsZUFubm90YXRpb25zKCk7XG4gICAgZm9yIChjb25zdCBlZGl0YWJsZSBvZiBlZGl0YWJsZXMpIHtcbiAgICAgIGVkaXRhYmxlLmhpZGUoKTtcbiAgICAgIGlmICh0aGlzLiN1aU1hbmFnZXIuaXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZWRpdGFibGUuZGF0YS5pZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYW5ub3RhdGlvbkVsZW1lbnRJZHMuaGFzKGVkaXRhYmxlLmRhdGEuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5kZXNlcmlhbGl6ZShlZGl0YWJsZSk7XG4gICAgICBpZiAoIWVkaXRvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkT3JSZWJ1aWxkKGVkaXRvcik7XG4gICAgICBlZGl0b3IuZW5hYmxlRWRpdGluZygpO1xuICAgIH1cbiAgfVxuICBkaXNhYmxlKCkge1xuICAgIHRoaXMuI2lzRGlzYWJsaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRpdi50YWJJbmRleCA9IC0xO1xuICAgIHRoaXMudG9nZ2xlUG9pbnRlckV2ZW50cyhmYWxzZSk7XG4gICAgY29uc3QgY2hhbmdlZEFubm90YXRpb25zID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IHJlc2V0QW5ub3RhdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuICAgICAgZWRpdG9yLmRpc2FibGVFZGl0aW5nKCk7XG4gICAgICBpZiAoIWVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVkaXRvci5zZXJpYWxpemUoKSAhPT0gbnVsbCkge1xuICAgICAgICBjaGFuZ2VkQW5ub3RhdGlvbnMuc2V0KGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkLCBlZGl0b3IpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0QW5ub3RhdGlvbnMuc2V0KGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkLCBlZGl0b3IpO1xuICAgICAgfVxuICAgICAgdGhpcy5nZXRFZGl0YWJsZUFubm90YXRpb24oZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpPy5zaG93KCk7XG4gICAgICBlZGl0b3IucmVtb3ZlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNhbm5vdGF0aW9uTGF5ZXIpIHtcbiAgICAgIGNvbnN0IGVkaXRhYmxlcyA9IHRoaXMuI2Fubm90YXRpb25MYXllci5nZXRFZGl0YWJsZUFubm90YXRpb25zKCk7XG4gICAgICBmb3IgKGNvbnN0IGVkaXRhYmxlIG9mIGVkaXRhYmxlcykge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaWRcbiAgICAgICAgfSA9IGVkaXRhYmxlLmRhdGE7XG4gICAgICAgIGlmICh0aGlzLiN1aU1hbmFnZXIuaXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoaWQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVkaXRvciA9IHJlc2V0QW5ub3RhdGlvbnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGVkaXRvcikge1xuICAgICAgICAgIGVkaXRvci5yZXNldEFubm90YXRpb25FbGVtZW50KGVkaXRhYmxlKTtcbiAgICAgICAgICBlZGl0b3Iuc2hvdyhmYWxzZSk7XG4gICAgICAgICAgZWRpdGFibGUuc2hvdygpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvciA9IGNoYW5nZWRBbm5vdGF0aW9ucy5nZXQoaWQpO1xuICAgICAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgICAgdGhpcy4jdWlNYW5hZ2VyLmFkZENoYW5nZWRFeGlzdGluZ0Fubm90YXRpb24oZWRpdG9yKTtcbiAgICAgICAgICBlZGl0b3IucmVuZGVyQW5ub3RhdGlvbkVsZW1lbnQoZWRpdGFibGUpO1xuICAgICAgICAgIGVkaXRvci5zaG93KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlZGl0YWJsZS5zaG93KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuI2NsZWFudXAoKTtcbiAgICBpZiAodGhpcy5pc0VtcHR5KSB7XG4gICAgICB0aGlzLmRpdi5oaWRkZW4gPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjbGFzc0xpc3RcbiAgICB9ID0gdGhpcy5kaXY7XG4gICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIEFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMudmFsdWVzKCkpIHtcbiAgICAgIGNsYXNzTGlzdC5yZW1vdmUoYCR7ZWRpdG9yVHlwZS5fdHlwZX1FZGl0aW5nYCk7XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZVRleHRTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnRvZ2dsZUFubm90YXRpb25MYXllclBvaW50ZXJFdmVudHModHJ1ZSk7XG4gICAgdGhpcy4jaXNEaXNhYmxpbmcgPSBmYWxzZTtcbiAgfVxuICBnZXRFZGl0YWJsZUFubm90YXRpb24oaWQpIHtcbiAgICByZXR1cm4gdGhpcy4jYW5ub3RhdGlvbkxheWVyPy5nZXRFZGl0YWJsZUFubm90YXRpb24oaWQpIHx8IG51bGw7XG4gIH1cbiAgc2V0QWN0aXZlRWRpdG9yKGVkaXRvcikge1xuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmUgPSB0aGlzLiN1aU1hbmFnZXIuZ2V0QWN0aXZlKCk7XG4gICAgaWYgKGN1cnJlbnRBY3RpdmUgPT09IGVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiN1aU1hbmFnZXIuc2V0QWN0aXZlRWRpdG9yKGVkaXRvcik7XG4gIH1cbiAgZW5hYmxlVGV4dFNlbGVjdGlvbigpIHtcbiAgICB0aGlzLmRpdi50YWJJbmRleCA9IC0xO1xuICAgIGlmICh0aGlzLiN0ZXh0TGF5ZXI/LmRpdiAmJiAhdGhpcy4jYm91bmRUZXh0TGF5ZXJQb2ludGVyRG93bikge1xuICAgICAgdGhpcy4jYm91bmRUZXh0TGF5ZXJQb2ludGVyRG93biA9IHRoaXMuI3RleHRMYXllclBvaW50ZXJEb3duLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLiN0ZXh0TGF5ZXIuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZFRleHRMYXllclBvaW50ZXJEb3duLCB7XG4gICAgICAgIHNpZ25hbDogdGhpcy4jdWlNYW5hZ2VyLl9zaWduYWxcbiAgICAgIH0pO1xuICAgICAgdGhpcy4jdGV4dExheWVyLmRpdi5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0aW5nXCIpO1xuICAgIH1cbiAgfVxuICBkaXNhYmxlVGV4dFNlbGVjdGlvbigpIHtcbiAgICB0aGlzLmRpdi50YWJJbmRleCA9IDA7XG4gICAgaWYgKHRoaXMuI3RleHRMYXllcj8uZGl2ICYmIHRoaXMuI2JvdW5kVGV4dExheWVyUG9pbnRlckRvd24pIHtcbiAgICAgIHRoaXMuI3RleHRMYXllci5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kVGV4dExheWVyUG9pbnRlckRvd24pO1xuICAgICAgdGhpcy4jYm91bmRUZXh0TGF5ZXJQb2ludGVyRG93biA9IG51bGw7XG4gICAgICB0aGlzLiN0ZXh0TGF5ZXIuZGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJoaWdobGlnaHRpbmdcIik7XG4gICAgfVxuICB9XG4gICN0ZXh0TGF5ZXJQb2ludGVyRG93bihldmVudCkge1xuICAgIHRoaXMuI3VpTWFuYWdlci51bnNlbGVjdEFsbCgpO1xuICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuI3RleHRMYXllci5kaXYpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaXNNYWNcbiAgICAgIH0gPSB1dGlsX0ZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5jdHJsS2V5ICYmIGlzTWFjKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3VpTWFuYWdlci5zaG93QWxsRWRpdG9ycyhcImhpZ2hsaWdodFwiLCB0cnVlLCB0cnVlKTtcbiAgICAgIHRoaXMuI3RleHRMYXllci5kaXYuY2xhc3NMaXN0LmFkZChcImZyZWVcIik7XG4gICAgICBIaWdobGlnaHRFZGl0b3Iuc3RhcnRIaWdobGlnaHRpbmcodGhpcywgdGhpcy4jdWlNYW5hZ2VyLmRpcmVjdGlvbiA9PT0gXCJsdHJcIiwgZXZlbnQpO1xuICAgICAgdGhpcy4jdGV4dExheWVyLmRpdi5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy4jdGV4dExheWVyLmRpdi5jbGFzc0xpc3QucmVtb3ZlKFwiZnJlZVwiKTtcbiAgICAgIH0sIHtcbiAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgc2lnbmFsOiB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbFxuICAgICAgfSk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuICBlbmFibGVDbGljaygpIHtcbiAgICBpZiAodGhpcy4jYm91bmRQb2ludGVyZG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbDtcbiAgICB0aGlzLiNib3VuZFBvaW50ZXJkb3duID0gdGhpcy5wb2ludGVyZG93bi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuI2JvdW5kUG9pbnRlcnVwID0gdGhpcy5wb2ludGVydXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRQb2ludGVyZG93biwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZFBvaW50ZXJ1cCwge1xuICAgICAgc2lnbmFsXG4gICAgfSk7XG4gIH1cbiAgZGlzYWJsZUNsaWNrKCkge1xuICAgIGlmICghdGhpcy4jYm91bmRQb2ludGVyZG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRQb2ludGVyZG93bik7XG4gICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZFBvaW50ZXJ1cCk7XG4gICAgdGhpcy4jYm91bmRQb2ludGVyZG93biA9IG51bGw7XG4gICAgdGhpcy4jYm91bmRQb2ludGVydXAgPSBudWxsO1xuICB9XG4gIGF0dGFjaChlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3JzLnNldChlZGl0b3IuaWQsIGVkaXRvcik7XG4gICAgY29uc3Qge1xuICAgICAgYW5ub3RhdGlvbkVsZW1lbnRJZFxuICAgIH0gPSBlZGl0b3I7XG4gICAgaWYgKGFubm90YXRpb25FbGVtZW50SWQgJiYgdGhpcy4jdWlNYW5hZ2VyLmlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGFubm90YXRpb25FbGVtZW50SWQpKSB7XG4gICAgICB0aGlzLiN1aU1hbmFnZXIucmVtb3ZlRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRvcik7XG4gICAgfVxuICB9XG4gIGRldGFjaChlZGl0b3IpIHtcbiAgICB0aGlzLiNlZGl0b3JzLmRlbGV0ZShlZGl0b3IuaWQpO1xuICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlNYW5hZ2VyPy5yZW1vdmVQb2ludGVySW5UZXh0TGF5ZXIoZWRpdG9yLmNvbnRlbnREaXYpO1xuICAgIGlmICghdGhpcy4jaXNEaXNhYmxpbmcgJiYgZWRpdG9yLmFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci5hZGREZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlKGVkaXRvcikge1xuICAgIHRoaXMuZGV0YWNoKGVkaXRvcik7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnJlbW92ZUVkaXRvcihlZGl0b3IpO1xuICAgIGVkaXRvci5kaXYucmVtb3ZlKCk7XG4gICAgZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSA9IGZhbHNlO1xuICAgIGlmICghdGhpcy4jaXNDbGVhbmluZ1VwKSB7XG4gICAgICB0aGlzLmFkZElua0VkaXRvcklmTmVlZGVkKGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgY2hhbmdlUGFyZW50KGVkaXRvcikge1xuICAgIGlmIChlZGl0b3IucGFyZW50ID09PSB0aGlzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlZGl0b3IucGFyZW50ICYmIGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKSB7XG4gICAgICB0aGlzLiN1aU1hbmFnZXIuYWRkRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgIEFubm90YXRpb25FZGl0b3IuZGVsZXRlQW5ub3RhdGlvbkVsZW1lbnQoZWRpdG9yKTtcbiAgICAgIGVkaXRvci5hbm5vdGF0aW9uRWxlbWVudElkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5hdHRhY2goZWRpdG9yKTtcbiAgICBlZGl0b3IucGFyZW50Py5kZXRhY2goZWRpdG9yKTtcbiAgICBlZGl0b3Iuc2V0UGFyZW50KHRoaXMpO1xuICAgIGlmIChlZGl0b3IuZGl2ICYmIGVkaXRvci5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIGVkaXRvci5kaXYucmVtb3ZlKCk7XG4gICAgICB0aGlzLmRpdi5hcHBlbmQoZWRpdG9yLmRpdik7XG4gICAgfVxuICB9XG4gIGFkZChlZGl0b3IpIHtcbiAgICBpZiAoZWRpdG9yLnBhcmVudCA9PT0gdGhpcyAmJiBlZGl0b3IuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlUGFyZW50KGVkaXRvcik7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLmFkZEVkaXRvcihlZGl0b3IpO1xuICAgIHRoaXMuYXR0YWNoKGVkaXRvcik7XG4gICAgaWYgKCFlZGl0b3IuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICBjb25zdCBkaXYgPSBlZGl0b3IucmVuZGVyKCk7XG4gICAgICB0aGlzLmRpdi5hcHBlbmQoZGl2KTtcbiAgICAgIGVkaXRvci5pc0F0dGFjaGVkVG9ET00gPSB0cnVlO1xuICAgIH1cbiAgICBlZGl0b3IuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICBlZGl0b3Iub25jZUFkZGVkKCk7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoZWRpdG9yKTtcbiAgICBlZGl0b3IuX3JlcG9ydFRlbGVtZXRyeShlZGl0b3IudGVsZW1ldHJ5SW5pdGlhbERhdGEpO1xuICB9XG4gIG1vdmVFZGl0b3JJbkRPTShlZGl0b3IpIHtcbiAgICBpZiAoIWVkaXRvci5pc0F0dGFjaGVkVG9ET00pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYWN0aXZlRWxlbWVudFxuICAgIH0gPSBkb2N1bWVudDtcbiAgICBpZiAoZWRpdG9yLmRpdi5jb250YWlucyhhY3RpdmVFbGVtZW50KSAmJiAhdGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQpIHtcbiAgICAgIGVkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gZmFsc2U7XG4gICAgICB0aGlzLiNlZGl0b3JGb2N1c1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLiNlZGl0b3JGb2N1c1RpbWVvdXRJZCA9IG51bGw7XG4gICAgICAgIGlmICghZWRpdG9yLmRpdi5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgIGVkaXRvci5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgKCkgPT4ge1xuICAgICAgICAgICAgZWRpdG9yLl9mb2N1c0V2ZW50c0FsbG93ZWQgPSB0cnVlO1xuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgICAgICBzaWduYWw6IHRoaXMuI3VpTWFuYWdlci5fc2lnbmFsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkaXRvci5fZm9jdXNFdmVudHNBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfVxuICAgIGVkaXRvci5fc3RydWN0VHJlZVBhcmVudElkID0gdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXI/Lm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsIGVkaXRvci5kaXYsIGVkaXRvci5jb250ZW50RGl2LCB0cnVlKTtcbiAgfVxuICBhZGRPclJlYnVpbGQoZWRpdG9yKSB7XG4gICAgaWYgKGVkaXRvci5uZWVkc1RvQmVSZWJ1aWx0KCkpIHtcbiAgICAgIGVkaXRvci5wYXJlbnQgfHw9IHRoaXM7XG4gICAgICBlZGl0b3IucmVidWlsZCgpO1xuICAgICAgZWRpdG9yLnNob3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGQoZWRpdG9yKTtcbiAgICB9XG4gIH1cbiAgYWRkVW5kb2FibGVFZGl0b3IoZWRpdG9yKSB7XG4gICAgY29uc3QgY21kID0gKCkgPT4gZWRpdG9yLl91aU1hbmFnZXIucmVidWlsZChlZGl0b3IpO1xuICAgIGNvbnN0IHVuZG8gPSAoKSA9PiB7XG4gICAgICBlZGl0b3IucmVtb3ZlKCk7XG4gICAgfTtcbiAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgIGNtZCxcbiAgICAgIHVuZG8sXG4gICAgICBtdXN0RXhlYzogZmFsc2VcbiAgICB9KTtcbiAgfVxuICBnZXROZXh0SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3VpTWFuYWdlci5nZXRJZCgpO1xuICB9XG4gIGdldCAjY3VycmVudEVkaXRvclR5cGUoKSB7XG4gICAgcmV0dXJuIEFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMuZ2V0KHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkpO1xuICB9XG4gIGdldCBfc2lnbmFsKCkge1xuICAgIHJldHVybiB0aGlzLiN1aU1hbmFnZXIuX3NpZ25hbDtcbiAgfVxuICAjY3JlYXRlTmV3RWRpdG9yKHBhcmFtcykge1xuICAgIGNvbnN0IGVkaXRvclR5cGUgPSB0aGlzLiNjdXJyZW50RWRpdG9yVHlwZTtcbiAgICByZXR1cm4gZWRpdG9yVHlwZSA/IG5ldyBlZGl0b3JUeXBlLnByb3RvdHlwZS5jb25zdHJ1Y3RvcihwYXJhbXMpIDogbnVsbDtcbiAgfVxuICBjYW5DcmVhdGVOZXdFbXB0eUVkaXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudEVkaXRvclR5cGU/LmNhbkNyZWF0ZU5ld0VtcHR5RWRpdG9yKCk7XG4gIH1cbiAgcGFzdGVFZGl0b3IobW9kZSwgcGFyYW1zKSB7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnVwZGF0ZVRvb2xiYXIobW9kZSk7XG4gICAgdGhpcy4jdWlNYW5hZ2VyLnVwZGF0ZU1vZGUobW9kZSk7XG4gICAgY29uc3Qge1xuICAgICAgb2Zmc2V0WCxcbiAgICAgIG9mZnNldFlcbiAgICB9ID0gdGhpcy4jZ2V0Q2VudGVyUG9pbnQoKTtcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0TmV4dElkKCk7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy4jY3JlYXRlTmV3RWRpdG9yKHtcbiAgICAgIHBhcmVudDogdGhpcyxcbiAgICAgIGlkLFxuICAgICAgeDogb2Zmc2V0WCxcbiAgICAgIHk6IG9mZnNldFksXG4gICAgICB1aU1hbmFnZXI6IHRoaXMuI3VpTWFuYWdlcixcbiAgICAgIGlzQ2VudGVyZWQ6IHRydWUsXG4gICAgICAuLi5wYXJhbXNcbiAgICB9KTtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICB0aGlzLmFkZChlZGl0b3IpO1xuICAgIH1cbiAgfVxuICBkZXNlcmlhbGl6ZShkYXRhKSB7XG4gICAgcmV0dXJuIEFubm90YXRpb25FZGl0b3JMYXllci4jZWRpdG9yVHlwZXMuZ2V0KGRhdGEuYW5ub3RhdGlvblR5cGUgPz8gZGF0YS5hbm5vdGF0aW9uRWRpdG9yVHlwZSk/LmRlc2VyaWFsaXplKGRhdGEsIHRoaXMsIHRoaXMuI3VpTWFuYWdlcikgfHwgbnVsbDtcbiAgfVxuICBjcmVhdGVBbmRBZGROZXdFZGl0b3IoZXZlbnQsIGlzQ2VudGVyZWQsIGRhdGEgPSB7fSkge1xuICAgIGNvbnN0IGlkID0gdGhpcy5nZXROZXh0SWQoKTtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLiNjcmVhdGVOZXdFZGl0b3Ioe1xuICAgICAgcGFyZW50OiB0aGlzLFxuICAgICAgaWQsXG4gICAgICB4OiBldmVudC5vZmZzZXRYLFxuICAgICAgeTogZXZlbnQub2Zmc2V0WSxcbiAgICAgIHVpTWFuYWdlcjogdGhpcy4jdWlNYW5hZ2VyLFxuICAgICAgaXNDZW50ZXJlZCxcbiAgICAgIC4uLmRhdGFcbiAgICB9KTtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICB0aGlzLmFkZChlZGl0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gZWRpdG9yO1xuICB9XG4gICNnZXRDZW50ZXJQb2ludCgpIHtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IHRoaXMuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRsWCA9IE1hdGgubWF4KDAsIHgpO1xuICAgIGNvbnN0IHRsWSA9IE1hdGgubWF4KDAsIHkpO1xuICAgIGNvbnN0IGJyWCA9IE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoLCB4ICsgd2lkdGgpO1xuICAgIGNvbnN0IGJyWSA9IE1hdGgubWluKHdpbmRvdy5pbm5lckhlaWdodCwgeSArIGhlaWdodCk7XG4gICAgY29uc3QgY2VudGVyWCA9ICh0bFggKyBiclgpIC8gMiAtIHg7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0bFkgKyBiclkpIC8gMiAtIHk7XG4gICAgY29uc3QgW29mZnNldFgsIG9mZnNldFldID0gdGhpcy52aWV3cG9ydC5yb3RhdGlvbiAlIDE4MCA9PT0gMCA/IFtjZW50ZXJYLCBjZW50ZXJZXSA6IFtjZW50ZXJZLCBjZW50ZXJYXTtcbiAgICByZXR1cm4ge1xuICAgICAgb2Zmc2V0WCxcbiAgICAgIG9mZnNldFlcbiAgICB9O1xuICB9XG4gIGFkZE5ld0VkaXRvcigpIHtcbiAgICB0aGlzLmNyZWF0ZUFuZEFkZE5ld0VkaXRvcih0aGlzLiNnZXRDZW50ZXJQb2ludCgpLCB0cnVlKTtcbiAgfVxuICBzZXRTZWxlY3RlZChlZGl0b3IpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIuc2V0U2VsZWN0ZWQoZWRpdG9yKTtcbiAgfVxuICB0b2dnbGVTZWxlY3RlZChlZGl0b3IpIHtcbiAgICB0aGlzLiN1aU1hbmFnZXIudG9nZ2xlU2VsZWN0ZWQoZWRpdG9yKTtcbiAgfVxuICBpc1NlbGVjdGVkKGVkaXRvcikge1xuICAgIHJldHVybiB0aGlzLiN1aU1hbmFnZXIuaXNTZWxlY3RlZChlZGl0b3IpO1xuICB9XG4gIHVuc2VsZWN0KGVkaXRvcikge1xuICAgIHRoaXMuI3VpTWFuYWdlci51bnNlbGVjdChlZGl0b3IpO1xuICB9XG4gIHBvaW50ZXJ1cChldmVudCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTWFjXG4gICAgfSA9IHV0aWxfRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5jdHJsS2V5ICYmIGlzTWFjKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuZGl2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy4jaGFkUG9pbnRlckRvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaGFkUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuI2FsbG93Q2xpY2spIHtcbiAgICAgIHRoaXMuI2FsbG93Q2xpY2sgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmdldE1vZGUoKSA9PT0gQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVApIHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci51bnNlbGVjdEFsbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZUFuZEFkZE5ld0VkaXRvcihldmVudCwgZmFsc2UpO1xuICB9XG4gIHBvaW50ZXJkb3duKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkgPT09IEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVCkge1xuICAgICAgdGhpcy5lbmFibGVUZXh0U2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLiNoYWRQb2ludGVyRG93bikge1xuICAgICAgdGhpcy4jaGFkUG9pbnRlckRvd24gPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgaXNNYWNcbiAgICB9ID0gdXRpbF9GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8IGV2ZW50LmN0cmxLZXkgJiYgaXNNYWMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kaXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jaGFkUG9pbnRlckRvd24gPSB0cnVlO1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuI3VpTWFuYWdlci5nZXRBY3RpdmUoKTtcbiAgICB0aGlzLiNhbGxvd0NsaWNrID0gIWVkaXRvciB8fCBlZGl0b3IuaXNFbXB0eSgpO1xuICB9XG4gIGZpbmROZXdQYXJlbnQoZWRpdG9yLCB4LCB5KSB7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLiN1aU1hbmFnZXIuZmluZFBhcmVudCh4LCB5KTtcbiAgICBpZiAobGF5ZXIgPT09IG51bGwgfHwgbGF5ZXIgPT09IHRoaXMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGF5ZXIuY2hhbmdlUGFyZW50KGVkaXRvcik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmdldEFjdGl2ZSgpPy5wYXJlbnQgPT09IHRoaXMpIHtcbiAgICAgIHRoaXMuI3VpTWFuYWdlci5jb21taXRPclJlbW92ZSgpO1xuICAgICAgdGhpcy4jdWlNYW5hZ2VyLnNldEFjdGl2ZUVkaXRvcihudWxsKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuI2VkaXRvckZvY3VzVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQpO1xuICAgICAgdGhpcy4jZWRpdG9yRm9jdXNUaW1lb3V0SWQgPSBudWxsO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlcj8ucmVtb3ZlUG9pbnRlckluVGV4dExheWVyKGVkaXRvci5jb250ZW50RGl2KTtcbiAgICAgIGVkaXRvci5zZXRQYXJlbnQobnVsbCk7XG4gICAgICBlZGl0b3IuaXNBdHRhY2hlZFRvRE9NID0gZmFsc2U7XG4gICAgICBlZGl0b3IuZGl2LnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLmRpdiA9IG51bGw7XG4gICAgdGhpcy4jZWRpdG9ycy5jbGVhcigpO1xuICAgIHRoaXMuI3VpTWFuYWdlci5yZW1vdmVMYXllcih0aGlzKTtcbiAgfVxuICAjY2xlYW51cCgpIHtcbiAgICB0aGlzLiNpc0NsZWFuaW5nVXAgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChlZGl0b3IuaXNFbXB0eSgpKSB7XG4gICAgICAgIGVkaXRvci5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jaXNDbGVhbmluZ1VwID0gZmFsc2U7XG4gIH1cbiAgcmVuZGVyKHtcbiAgICB2aWV3cG9ydFxuICB9KSB7XG4gICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIHNldExheWVyRGltZW5zaW9ucyh0aGlzLmRpdiwgdmlld3BvcnQpO1xuICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3VpTWFuYWdlci5nZXRFZGl0b3JzKHRoaXMucGFnZUluZGV4KSkge1xuICAgICAgdGhpcy5hZGQoZWRpdG9yKTtcbiAgICAgIGVkaXRvci5yZWJ1aWxkKCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlTW9kZSgpO1xuICB9XG4gIHVwZGF0ZSh7XG4gICAgdmlld3BvcnRcbiAgfSkge1xuICAgIHRoaXMuI3VpTWFuYWdlci5jb21taXRPclJlbW92ZSgpO1xuICAgIHRoaXMuI2NsZWFudXAoKTtcbiAgICBjb25zdCBvbGRSb3RhdGlvbiA9IHRoaXMudmlld3BvcnQucm90YXRpb247XG4gICAgY29uc3Qgcm90YXRpb24gPSB2aWV3cG9ydC5yb3RhdGlvbjtcbiAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgc2V0TGF5ZXJEaW1lbnNpb25zKHRoaXMuZGl2LCB7XG4gICAgICByb3RhdGlvblxuICAgIH0pO1xuICAgIGlmIChvbGRSb3RhdGlvbiAhPT0gcm90YXRpb24pIHtcbiAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcbiAgICAgICAgZWRpdG9yLnJvdGF0ZShyb3RhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkSW5rRWRpdG9ySWZOZWVkZWQoZmFsc2UpO1xuICB9XG4gIGdldCBwYWdlRGltZW5zaW9ucygpIHtcbiAgICBjb25zdCB7XG4gICAgICBwYWdlV2lkdGgsXG4gICAgICBwYWdlSGVpZ2h0XG4gICAgfSA9IHRoaXMudmlld3BvcnQucmF3RGltcztcbiAgICByZXR1cm4gW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF07XG4gIH1cbiAgZ2V0IHNjYWxlKCkge1xuICAgIHJldHVybiB0aGlzLiN1aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucmVhbFNjYWxlO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9kaXNwbGF5L2RyYXdfbGF5ZXIuanNcblxuXG5jbGFzcyBEcmF3TGF5ZXIge1xuICAjcGFyZW50ID0gbnVsbDtcbiAgI2lkID0gMDtcbiAgI21hcHBpbmcgPSBuZXcgTWFwKCk7XG4gICN0b1VwZGF0ZSA9IG5ldyBNYXAoKTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHBhZ2VJbmRleFxuICB9KSB7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG4gIH1cbiAgc2V0UGFyZW50KHBhcmVudCkge1xuICAgIGlmICghdGhpcy4jcGFyZW50KSB7XG4gICAgICB0aGlzLiNwYXJlbnQgPSBwYXJlbnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLiNwYXJlbnQgIT09IHBhcmVudCkge1xuICAgICAgaWYgKHRoaXMuI21hcHBpbmcuc2l6ZSA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCByb290IG9mIHRoaXMuI21hcHBpbmcudmFsdWVzKCkpIHtcbiAgICAgICAgICByb290LnJlbW92ZSgpO1xuICAgICAgICAgIHBhcmVudC5hcHBlbmQocm9vdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuI3BhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGdldCBfc3ZnRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiX3N2Z0ZhY3RvcnlcIiwgbmV3IERPTVNWR0ZhY3RvcnkoKSk7XG4gIH1cbiAgc3RhdGljICNzZXRCb3goZWxlbWVudCwge1xuICAgIHggPSAwLFxuICAgIHkgPSAwLFxuICAgIHdpZHRoID0gMSxcbiAgICBoZWlnaHQgPSAxXG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0eWxlXG4gICAgfSA9IGVsZW1lbnQ7XG4gICAgc3R5bGUudG9wID0gYCR7MTAwICogeX0lYDtcbiAgICBzdHlsZS5sZWZ0ID0gYCR7MTAwICogeH0lYDtcbiAgICBzdHlsZS53aWR0aCA9IGAkezEwMCAqIHdpZHRofSVgO1xuICAgIHN0eWxlLmhlaWdodCA9IGAkezEwMCAqIGhlaWdodH0lYDtcbiAgfVxuICAjY3JlYXRlU1ZHKGJveCkge1xuICAgIGNvbnN0IHN2ZyA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGUoMSwgMSwgdHJ1ZSk7XG4gICAgdGhpcy4jcGFyZW50LmFwcGVuZChzdmcpO1xuICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLCB0cnVlKTtcbiAgICBEcmF3TGF5ZXIuI3NldEJveChzdmcsIGJveCk7XG4gICAgcmV0dXJuIHN2ZztcbiAgfVxuICAjY3JlYXRlQ2xpcFBhdGgoZGVmcywgcGF0aElkKSB7XG4gICAgY29uc3QgY2xpcFBhdGggPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIpO1xuICAgIGRlZnMuYXBwZW5kKGNsaXBQYXRoKTtcbiAgICBjb25zdCBjbGlwUGF0aElkID0gYGNsaXBfJHtwYXRoSWR9YDtcbiAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBjbGlwUGF0aElkKTtcbiAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGUoXCJjbGlwUGF0aFVuaXRzXCIsIFwib2JqZWN0Qm91bmRpbmdCb3hcIik7XG4gICAgY29uc3QgY2xpcFBhdGhVc2UgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInVzZVwiKTtcbiAgICBjbGlwUGF0aC5hcHBlbmQoY2xpcFBhdGhVc2UpO1xuICAgIGNsaXBQYXRoVXNlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgYCMke3BhdGhJZH1gKTtcbiAgICBjbGlwUGF0aFVzZS5jbGFzc0xpc3QuYWRkKFwiY2xpcFwiKTtcbiAgICByZXR1cm4gY2xpcFBhdGhJZDtcbiAgfVxuICBoaWdobGlnaHQob3V0bGluZXMsIGNvbG9yLCBvcGFjaXR5LCBpc1BhdGhVcGRhdGFibGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGlkID0gdGhpcy4jaWQrKztcbiAgICBjb25zdCByb290ID0gdGhpcy4jY3JlYXRlU1ZHKG91dGxpbmVzLmJveCk7XG4gICAgcm9vdC5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0XCIpO1xuICAgIGlmIChvdXRsaW5lcy5mcmVlKSB7XG4gICAgICByb290LmNsYXNzTGlzdC5hZGQoXCJmcmVlXCIpO1xuICAgIH1cbiAgICBjb25zdCBkZWZzID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIpO1xuICAgIHJvb3QuYXBwZW5kKGRlZnMpO1xuICAgIGNvbnN0IHBhdGggPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInBhdGhcIik7XG4gICAgZGVmcy5hcHBlbmQocGF0aCk7XG4gICAgY29uc3QgcGF0aElkID0gYHBhdGhfcCR7dGhpcy5wYWdlSW5kZXh9XyR7aWR9YDtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcImlkXCIsIHBhdGhJZCk7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIG91dGxpbmVzLnRvU1ZHUGF0aCgpKTtcbiAgICBpZiAoaXNQYXRoVXBkYXRhYmxlKSB7XG4gICAgICB0aGlzLiN0b1VwZGF0ZS5zZXQoaWQsIHBhdGgpO1xuICAgIH1cbiAgICBjb25zdCBjbGlwUGF0aElkID0gdGhpcy4jY3JlYXRlQ2xpcFBhdGgoZGVmcywgcGF0aElkKTtcbiAgICBjb25zdCB1c2UgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInVzZVwiKTtcbiAgICByb290LmFwcGVuZCh1c2UpO1xuICAgIHJvb3Quc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBjb2xvcik7XG4gICAgcm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgb3BhY2l0eSk7XG4gICAgdXNlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgYCMke3BhdGhJZH1gKTtcbiAgICB0aGlzLiNtYXBwaW5nLnNldChpZCwgcm9vdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkLFxuICAgICAgY2xpcFBhdGhJZDogYHVybCgjJHtjbGlwUGF0aElkfSlgXG4gICAgfTtcbiAgfVxuICBoaWdobGlnaHRPdXRsaW5lKG91dGxpbmVzKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLiNpZCsrO1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLiNjcmVhdGVTVkcob3V0bGluZXMuYm94KTtcbiAgICByb290LmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRPdXRsaW5lXCIpO1xuICAgIGNvbnN0IGRlZnMgPSBEcmF3TGF5ZXIuX3N2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcImRlZnNcIik7XG4gICAgcm9vdC5hcHBlbmQoZGVmcyk7XG4gICAgY29uc3QgcGF0aCA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwicGF0aFwiKTtcbiAgICBkZWZzLmFwcGVuZChwYXRoKTtcbiAgICBjb25zdCBwYXRoSWQgPSBgcGF0aF9wJHt0aGlzLnBhZ2VJbmRleH1fJHtpZH1gO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKFwiaWRcIiwgcGF0aElkKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcImRcIiwgb3V0bGluZXMudG9TVkdQYXRoKCkpO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKFwidmVjdG9yLWVmZmVjdFwiLCBcIm5vbi1zY2FsaW5nLXN0cm9rZVwiKTtcbiAgICBsZXQgbWFza0lkO1xuICAgIGlmIChvdXRsaW5lcy5mcmVlKSB7XG4gICAgICByb290LmNsYXNzTGlzdC5hZGQoXCJmcmVlXCIpO1xuICAgICAgY29uc3QgbWFzayA9IERyYXdMYXllci5fc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwibWFza1wiKTtcbiAgICAgIGRlZnMuYXBwZW5kKG1hc2spO1xuICAgICAgbWFza0lkID0gYG1hc2tfcCR7dGhpcy5wYWdlSW5kZXh9XyR7aWR9YDtcbiAgICAgIG1hc2suc2V0QXR0cmlidXRlKFwiaWRcIiwgbWFza0lkKTtcbiAgICAgIG1hc2suc2V0QXR0cmlidXRlKFwibWFza1VuaXRzXCIsIFwib2JqZWN0Qm91bmRpbmdCb3hcIik7XG4gICAgICBjb25zdCByZWN0ID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIpO1xuICAgICAgbWFzay5hcHBlbmQocmVjdCk7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiMVwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIFwiMVwiKTtcbiAgICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIndoaXRlXCIpO1xuICAgICAgY29uc3QgdXNlID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJ1c2VcIik7XG4gICAgICBtYXNrLmFwcGVuZCh1c2UpO1xuICAgICAgdXNlLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgYCMke3BhdGhJZH1gKTtcbiAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJub25lXCIpO1xuICAgICAgdXNlLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJibGFja1wiKTtcbiAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLXJ1bGVcIiwgXCJub256ZXJvXCIpO1xuICAgICAgdXNlLmNsYXNzTGlzdC5hZGQoXCJtYXNrXCIpO1xuICAgIH1cbiAgICBjb25zdCB1c2UxID0gRHJhd0xheWVyLl9zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJ1c2VcIik7XG4gICAgcm9vdC5hcHBlbmQodXNlMSk7XG4gICAgdXNlMS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGAjJHtwYXRoSWR9YCk7XG4gICAgaWYgKG1hc2tJZCkge1xuICAgICAgdXNlMS5zZXRBdHRyaWJ1dGUoXCJtYXNrXCIsIGB1cmwoIyR7bWFza0lkfSlgKTtcbiAgICB9XG4gICAgY29uc3QgdXNlMiA9IHVzZTEuY2xvbmVOb2RlKCk7XG4gICAgcm9vdC5hcHBlbmQodXNlMik7XG4gICAgdXNlMS5jbGFzc0xpc3QuYWRkKFwibWFpbk91dGxpbmVcIik7XG4gICAgdXNlMi5jbGFzc0xpc3QuYWRkKFwic2Vjb25kYXJ5T3V0bGluZVwiKTtcbiAgICB0aGlzLiNtYXBwaW5nLnNldChpZCwgcm9vdCk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG4gIGZpbmFsaXplTGluZShpZCwgbGluZSkge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLiN0b1VwZGF0ZS5nZXQoaWQpO1xuICAgIHRoaXMuI3RvVXBkYXRlLmRlbGV0ZShpZCk7XG4gICAgdGhpcy51cGRhdGVCb3goaWQsIGxpbmUuYm94KTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZShcImRcIiwgbGluZS50b1NWR1BhdGgoKSk7XG4gIH1cbiAgdXBkYXRlTGluZShpZCwgbGluZSkge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLiNtYXBwaW5nLmdldChpZCk7XG4gICAgY29uc3QgZGVmcyA9IHJvb3QuZmlyc3RDaGlsZDtcbiAgICBjb25zdCBwYXRoID0gZGVmcy5maXJzdENoaWxkO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKFwiZFwiLCBsaW5lLnRvU1ZHUGF0aCgpKTtcbiAgfVxuICByZW1vdmVGcmVlSGlnaGxpZ2h0KGlkKSB7XG4gICAgdGhpcy5yZW1vdmUoaWQpO1xuICAgIHRoaXMuI3RvVXBkYXRlLmRlbGV0ZShpZCk7XG4gIH1cbiAgdXBkYXRlUGF0aChpZCwgbGluZSkge1xuICAgIHRoaXMuI3RvVXBkYXRlLmdldChpZCkuc2V0QXR0cmlidXRlKFwiZFwiLCBsaW5lLnRvU1ZHUGF0aCgpKTtcbiAgfVxuICB1cGRhdGVCb3goaWQsIGJveCkge1xuICAgIERyYXdMYXllci4jc2V0Qm94KHRoaXMuI21hcHBpbmcuZ2V0KGlkKSwgYm94KTtcbiAgfVxuICBzaG93KGlkLCB2aXNpYmxlKSB7XG4gICAgdGhpcy4jbWFwcGluZy5nZXQoaWQpLmNsYXNzTGlzdC50b2dnbGUoXCJoaWRkZW5cIiwgIXZpc2libGUpO1xuICB9XG4gIHJvdGF0ZShpZCwgYW5nbGUpIHtcbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsIGFuZ2xlKTtcbiAgfVxuICBjaGFuZ2VDb2xvcihpZCwgY29sb3IpIHtcbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBjb2xvcik7XG4gIH1cbiAgY2hhbmdlT3BhY2l0eShpZCwgb3BhY2l0eSkge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgb3BhY2l0eSk7XG4gIH1cbiAgYWRkQ2xhc3MoaWQsIGNsYXNzTmFtZSkge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH1cbiAgcmVtb3ZlQ2xhc3MoaWQsIGNsYXNzTmFtZSkge1xuICAgIHRoaXMuI21hcHBpbmcuZ2V0KGlkKS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gIH1cbiAgcmVtb3ZlKGlkKSB7XG4gICAgaWYgKHRoaXMuI3BhcmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNtYXBwaW5nLmdldChpZCkucmVtb3ZlKCk7XG4gICAgdGhpcy4jbWFwcGluZy5kZWxldGUoaWQpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy4jcGFyZW50ID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy4jbWFwcGluZy52YWx1ZXMoKSkge1xuICAgICAgcm9vdC5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy4jbWFwcGluZy5jbGVhcigpO1xuICB9XG59XG5cbjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9wZGYuanNcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHBkZmpzVmVyc2lvbiA9IFwiNC40LjE2OFwiO1xuY29uc3QgcGRmanNCdWlsZCA9IFwiMTlmYmM4OTk4XCI7XG5cbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fQWJvcnRFeGNlcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFib3J0RXhjZXB0aW9uO1xudmFyIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25FZGl0b3JMYXllcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlO1xudmFyIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yVHlwZSA9IF9fd2VicGFja19leHBvcnRzX18uQW5ub3RhdGlvbkVkaXRvclR5cGU7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JVSU1hbmFnZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25MYXllciA9IF9fd2VicGFja19leHBvcnRzX18uQW5ub3RhdGlvbkxheWVyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uTW9kZSA9IF9fd2VicGFja19leHBvcnRzX18uQW5ub3RhdGlvbk1vZGU7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0NNYXBDb21wcmVzc2lvblR5cGUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLkNNYXBDb21wcmVzc2lvblR5cGU7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0NvbG9yUGlja2VyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5Db2xvclBpY2tlcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fRE9NU1ZHRmFjdG9yeSA9IF9fd2VicGFja19leHBvcnRzX18uRE9NU1ZHRmFjdG9yeTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fRHJhd0xheWVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5EcmF3TGF5ZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0ZlYXR1cmVUZXN0ID0gX193ZWJwYWNrX2V4cG9ydHNfXy5GZWF0dXJlVGVzdDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fR2xvYmFsV29ya2VyT3B0aW9ucyA9IF9fd2VicGFja19leHBvcnRzX18uR2xvYmFsV29ya2VyT3B0aW9ucztcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fSW1hZ2VLaW5kID0gX193ZWJwYWNrX2V4cG9ydHNfXy5JbWFnZUtpbmQ7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX0ludmFsaWRQREZFeGNlcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fLkludmFsaWRQREZFeGNlcHRpb247XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX01pc3NpbmdQREZFeGNlcHRpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fLk1pc3NpbmdQREZFeGNlcHRpb247XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX09QUyA9IF9fd2VicGFja19leHBvcnRzX18uT1BTO1xudmFyIF9fd2VicGFja19leHBvcnRzX19PdXRsaW5lciA9IF9fd2VicGFja19leHBvcnRzX18uT3V0bGluZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1BERkRhdGFSYW5nZVRyYW5zcG9ydCA9IF9fd2VicGFja19leHBvcnRzX18uUERGRGF0YVJhbmdlVHJhbnNwb3J0O1xudmFyIF9fd2VicGFja19leHBvcnRzX19QREZEYXRlU3RyaW5nID0gX193ZWJwYWNrX2V4cG9ydHNfXy5QREZEYXRlU3RyaW5nO1xudmFyIF9fd2VicGFja19leHBvcnRzX19QREZXb3JrZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlBERldvcmtlcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fUGFzc3dvcmRSZXNwb25zZXMgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlBhc3N3b3JkUmVzcG9uc2VzO1xudmFyIF9fd2VicGFja19leHBvcnRzX19QZXJtaXNzaW9uRmxhZyA9IF9fd2VicGFja19leHBvcnRzX18uUGVybWlzc2lvbkZsYWc7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1BpeGVsc1BlckluY2ggPSBfX3dlYnBhY2tfZXhwb3J0c19fLlBpeGVsc1BlckluY2g7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1JlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiA9IF9fd2VicGFja19leHBvcnRzX18uUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uO1xudmFyIF9fd2VicGFja19leHBvcnRzX19UZXh0TGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlRleHRMYXllcjtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gX193ZWJwYWNrX2V4cG9ydHNfXy5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb247XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1V0aWwgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlV0aWw7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX1ZlcmJvc2l0eUxldmVsID0gX193ZWJwYWNrX2V4cG9ydHNfXy5WZXJib3NpdHlMZXZlbDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fWGZhTGF5ZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLlhmYUxheWVyO1xudmFyIF9fd2VicGFja19leHBvcnRzX19idWlsZCA9IF9fd2VicGFja19leHBvcnRzX18uYnVpbGQ7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2NyZWF0ZVZhbGlkQWJzb2x1dGVVcmwgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmw7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2ZldGNoRGF0YSA9IF9fd2VicGFja19leHBvcnRzX18uZmV0Y2hEYXRhO1xudmFyIF9fd2VicGFja19leHBvcnRzX19nZXREb2N1bWVudCA9IF9fd2VicGFja19leHBvcnRzX18uZ2V0RG9jdW1lbnQ7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2dldEZpbGVuYW1lRnJvbVVybCA9IF9fd2VicGFja19leHBvcnRzX18uZ2V0RmlsZW5hbWVGcm9tVXJsO1xudmFyIF9fd2VicGFja19leHBvcnRzX19nZXRQZGZGaWxlbmFtZUZyb21VcmwgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmdldFBkZkZpbGVuYW1lRnJvbVVybDtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0WGZhUGFnZVZpZXdwb3J0ID0gX193ZWJwYWNrX2V4cG9ydHNfXy5nZXRYZmFQYWdlVmlld3BvcnQ7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX2lzRGF0YVNjaGVtZSA9IF9fd2VicGFja19leHBvcnRzX18uaXNEYXRhU2NoZW1lO1xudmFyIF9fd2VicGFja19leHBvcnRzX19pc1BkZkZpbGUgPSBfX3dlYnBhY2tfZXhwb3J0c19fLmlzUGRmRmlsZTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fbm9Db250ZXh0TWVudSA9IF9fd2VicGFja19leHBvcnRzX18ubm9Db250ZXh0TWVudTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fbm9ybWFsaXplVW5pY29kZSA9IF9fd2VicGFja19leHBvcnRzX18ubm9ybWFsaXplVW5pY29kZTtcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fcmVuZGVyVGV4dExheWVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy5yZW5kZXJUZXh0TGF5ZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX3NldExheWVyRGltZW5zaW9ucyA9IF9fd2VicGFja19leHBvcnRzX18uc2V0TGF5ZXJEaW1lbnNpb25zO1xudmFyIF9fd2VicGFja19leHBvcnRzX19zaGFkb3cgPSBfX3dlYnBhY2tfZXhwb3J0c19fLnNoYWRvdztcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fdXBkYXRlVGV4dExheWVyID0gX193ZWJwYWNrX2V4cG9ydHNfXy51cGRhdGVUZXh0TGF5ZXI7XG52YXIgX193ZWJwYWNrX2V4cG9ydHNfX3ZlcnNpb24gPSBfX3dlYnBhY2tfZXhwb3J0c19fLnZlcnNpb247XG5leHBvcnQgeyBfX3dlYnBhY2tfZXhwb3J0c19fQWJvcnRFeGNlcHRpb24gYXMgQWJvcnRFeGNlcHRpb24sIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIgYXMgQW5ub3RhdGlvbkVkaXRvckxheWVyLCBfX3dlYnBhY2tfZXhwb3J0c19fQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgYXMgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUsIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uRWRpdG9yVHlwZSBhcyBBbm5vdGF0aW9uRWRpdG9yVHlwZSwgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25FZGl0b3JVSU1hbmFnZXIgYXMgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciwgX193ZWJwYWNrX2V4cG9ydHNfX0Fubm90YXRpb25MYXllciBhcyBBbm5vdGF0aW9uTGF5ZXIsIF9fd2VicGFja19leHBvcnRzX19Bbm5vdGF0aW9uTW9kZSBhcyBBbm5vdGF0aW9uTW9kZSwgX193ZWJwYWNrX2V4cG9ydHNfX0NNYXBDb21wcmVzc2lvblR5cGUgYXMgQ01hcENvbXByZXNzaW9uVHlwZSwgX193ZWJwYWNrX2V4cG9ydHNfX0NvbG9yUGlja2VyIGFzIENvbG9yUGlja2VyLCBfX3dlYnBhY2tfZXhwb3J0c19fRE9NU1ZHRmFjdG9yeSBhcyBET01TVkdGYWN0b3J5LCBfX3dlYnBhY2tfZXhwb3J0c19fRHJhd0xheWVyIGFzIERyYXdMYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX0ZlYXR1cmVUZXN0IGFzIEZlYXR1cmVUZXN0LCBfX3dlYnBhY2tfZXhwb3J0c19fR2xvYmFsV29ya2VyT3B0aW9ucyBhcyBHbG9iYWxXb3JrZXJPcHRpb25zLCBfX3dlYnBhY2tfZXhwb3J0c19fSW1hZ2VLaW5kIGFzIEltYWdlS2luZCwgX193ZWJwYWNrX2V4cG9ydHNfX0ludmFsaWRQREZFeGNlcHRpb24gYXMgSW52YWxpZFBERkV4Y2VwdGlvbiwgX193ZWJwYWNrX2V4cG9ydHNfX01pc3NpbmdQREZFeGNlcHRpb24gYXMgTWlzc2luZ1BERkV4Y2VwdGlvbiwgX193ZWJwYWNrX2V4cG9ydHNfX09QUyBhcyBPUFMsIF9fd2VicGFja19leHBvcnRzX19PdXRsaW5lciBhcyBPdXRsaW5lciwgX193ZWJwYWNrX2V4cG9ydHNfX1BERkRhdGFSYW5nZVRyYW5zcG9ydCBhcyBQREZEYXRhUmFuZ2VUcmFuc3BvcnQsIF9fd2VicGFja19leHBvcnRzX19QREZEYXRlU3RyaW5nIGFzIFBERkRhdGVTdHJpbmcsIF9fd2VicGFja19leHBvcnRzX19QREZXb3JrZXIgYXMgUERGV29ya2VyLCBfX3dlYnBhY2tfZXhwb3J0c19fUGFzc3dvcmRSZXNwb25zZXMgYXMgUGFzc3dvcmRSZXNwb25zZXMsIF9fd2VicGFja19leHBvcnRzX19QZXJtaXNzaW9uRmxhZyBhcyBQZXJtaXNzaW9uRmxhZywgX193ZWJwYWNrX2V4cG9ydHNfX1BpeGVsc1BlckluY2ggYXMgUGl4ZWxzUGVySW5jaCwgX193ZWJwYWNrX2V4cG9ydHNfX1JlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiBhcyBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24sIF9fd2VicGFja19leHBvcnRzX19UZXh0TGF5ZXIgYXMgVGV4dExheWVyLCBfX3dlYnBhY2tfZXhwb3J0c19fVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGFzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiwgX193ZWJwYWNrX2V4cG9ydHNfX1V0aWwgYXMgVXRpbCwgX193ZWJwYWNrX2V4cG9ydHNfX1ZlcmJvc2l0eUxldmVsIGFzIFZlcmJvc2l0eUxldmVsLCBfX3dlYnBhY2tfZXhwb3J0c19fWGZhTGF5ZXIgYXMgWGZhTGF5ZXIsIF9fd2VicGFja19leHBvcnRzX19idWlsZCBhcyBidWlsZCwgX193ZWJwYWNrX2V4cG9ydHNfX2NyZWF0ZVZhbGlkQWJzb2x1dGVVcmwgYXMgY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCwgX193ZWJwYWNrX2V4cG9ydHNfX2ZldGNoRGF0YSBhcyBmZXRjaERhdGEsIF9fd2VicGFja19leHBvcnRzX19nZXREb2N1bWVudCBhcyBnZXREb2N1bWVudCwgX193ZWJwYWNrX2V4cG9ydHNfX2dldEZpbGVuYW1lRnJvbVVybCBhcyBnZXRGaWxlbmFtZUZyb21VcmwsIF9fd2VicGFja19leHBvcnRzX19nZXRQZGZGaWxlbmFtZUZyb21VcmwgYXMgZ2V0UGRmRmlsZW5hbWVGcm9tVXJsLCBfX3dlYnBhY2tfZXhwb3J0c19fZ2V0WGZhUGFnZVZpZXdwb3J0IGFzIGdldFhmYVBhZ2VWaWV3cG9ydCwgX193ZWJwYWNrX2V4cG9ydHNfX2lzRGF0YVNjaGVtZSBhcyBpc0RhdGFTY2hlbWUsIF9fd2VicGFja19leHBvcnRzX19pc1BkZkZpbGUgYXMgaXNQZGZGaWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fbm9Db250ZXh0TWVudSBhcyBub0NvbnRleHRNZW51LCBfX3dlYnBhY2tfZXhwb3J0c19fbm9ybWFsaXplVW5pY29kZSBhcyBub3JtYWxpemVVbmljb2RlLCBfX3dlYnBhY2tfZXhwb3J0c19fcmVuZGVyVGV4dExheWVyIGFzIHJlbmRlclRleHRMYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX3NldExheWVyRGltZW5zaW9ucyBhcyBzZXRMYXllckRpbWVuc2lvbnMsIF9fd2VicGFja19leHBvcnRzX19zaGFkb3cgYXMgc2hhZG93LCBfX3dlYnBhY2tfZXhwb3J0c19fdXBkYXRlVGV4dExheWVyIGFzIHVwZGF0ZVRleHRMYXllciwgX193ZWJwYWNrX2V4cG9ydHNfX3ZlcnNpb24gYXMgdmVyc2lvbiB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1wZGYubWpzLm1hcCIsImltcG9ydCB7IG1lbW9pemUgfSBmcm9tICcuL3V0aWxzL2pzX3V0aWxzLmpzJztcbmV4cG9ydCBjb25zdCBpc0ZpcmVmb3ggPSBtZW1vaXplKCgpPT4vZmlyZWZveC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudClcbik7XG5leHBvcnQgY29uc3QgaXNTYWZhcmkgPSBtZW1vaXplKCgpPT5Cb29sZWFuKHdpbmRvdy5zYWZhcmkpXG4pO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyRGV0ZWN0b3IuanMubWFwIiwiaW1wb3J0IHsgdW5pb24sIHdpdGhvdXQgfSBmcm9tICcuL3V0aWxzL2pzX3V0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBFbnRlckxlYXZlQ291bnRlciB7XG4gICAgZW50ZXIoZW50ZXJpbmdOb2RlKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTGVuZ3RoID0gdGhpcy5lbnRlcmVkLmxlbmd0aDtcbiAgICAgICAgY29uc3QgaXNOb2RlRW50ZXJlZCA9IChub2RlKT0+dGhpcy5pc05vZGVJbkRvY3VtZW50KG5vZGUpICYmICghbm9kZS5jb250YWlucyB8fCBub2RlLmNvbnRhaW5zKGVudGVyaW5nTm9kZSkpXG4gICAgICAgIDtcbiAgICAgICAgdGhpcy5lbnRlcmVkID0gdW5pb24odGhpcy5lbnRlcmVkLmZpbHRlcihpc05vZGVFbnRlcmVkKSwgW1xuICAgICAgICAgICAgZW50ZXJpbmdOb2RlXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gcHJldmlvdXNMZW5ndGggPT09IDAgJiYgdGhpcy5lbnRlcmVkLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGxlYXZlKGxlYXZpbmdOb2RlKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTGVuZ3RoID0gdGhpcy5lbnRlcmVkLmxlbmd0aDtcbiAgICAgICAgdGhpcy5lbnRlcmVkID0gd2l0aG91dCh0aGlzLmVudGVyZWQuZmlsdGVyKHRoaXMuaXNOb2RlSW5Eb2N1bWVudCksIGxlYXZpbmdOb2RlKTtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzTGVuZ3RoID4gMCAmJiB0aGlzLmVudGVyZWQubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5lbnRlcmVkID0gW107XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGlzTm9kZUluRG9jdW1lbnQpe1xuICAgICAgICB0aGlzLmVudGVyZWQgPSBbXTtcbiAgICAgICAgdGhpcy5pc05vZGVJbkRvY3VtZW50ID0gaXNOb2RlSW5Eb2N1bWVudDtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudGVyTGVhdmVDb3VudGVyLmpzLm1hcCIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIG9iaikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgICBmb3IodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbihzeW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5pbXBvcnQgeyBFbnRlckxlYXZlQ291bnRlciB9IGZyb20gJy4vRW50ZXJMZWF2ZUNvdW50ZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlTmF0aXZlRHJhZ1NvdXJjZSwgbWF0Y2hOYXRpdmVJdGVtVHlwZSB9IGZyb20gJy4vTmF0aXZlRHJhZ1NvdXJjZXMvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgTmF0aXZlVHlwZXMgZnJvbSAnLi9OYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgeyBnZXREcmFnUHJldmlld09mZnNldCwgZ2V0RXZlbnRDbGllbnRPZmZzZXQsIGdldE5vZGVDbGllbnRPZmZzZXQgfSBmcm9tICcuL09mZnNldFV0aWxzLmpzJztcbmltcG9ydCB7IE9wdGlvbnNSZWFkZXIgfSBmcm9tICcuL09wdGlvbnNSZWFkZXIuanMnO1xuZXhwb3J0IGNsYXNzIEhUTUw1QmFja2VuZEltcGwge1xuICAgIC8qKlxuXHQgKiBHZW5lcmF0ZSBwcm9maWxpbmcgc3RhdGlzdGljcyBmb3IgdGhlIEhUTUw1QmFja2VuZC5cblx0ICovIHByb2ZpbGUoKSB7XG4gICAgICAgIHZhciByZWYsIHJlZjE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzb3VyY2VQcmV2aWV3Tm9kZXM6IHRoaXMuc291cmNlUHJldmlld05vZGVzLnNpemUsXG4gICAgICAgICAgICBzb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnM6IHRoaXMuc291cmNlUHJldmlld05vZGVPcHRpb25zLnNpemUsXG4gICAgICAgICAgICBzb3VyY2VOb2RlT3B0aW9uczogdGhpcy5zb3VyY2VOb2RlT3B0aW9ucy5zaXplLFxuICAgICAgICAgICAgc291cmNlTm9kZXM6IHRoaXMuc291cmNlTm9kZXMuc2l6ZSxcbiAgICAgICAgICAgIGRyYWdTdGFydFNvdXJjZUlkczogKChyZWYgPSB0aGlzLmRyYWdTdGFydFNvdXJjZUlkcykgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYubGVuZ3RoKSB8fCAwLFxuICAgICAgICAgICAgZHJvcFRhcmdldElkczogdGhpcy5kcm9wVGFyZ2V0SWRzLmxlbmd0aCxcbiAgICAgICAgICAgIGRyYWdFbnRlclRhcmdldElkczogdGhpcy5kcmFnRW50ZXJUYXJnZXRJZHMubGVuZ3RoLFxuICAgICAgICAgICAgZHJhZ092ZXJUYXJnZXRJZHM6ICgocmVmMSA9IHRoaXMuZHJhZ092ZXJUYXJnZXRJZHMpID09PSBudWxsIHx8IHJlZjEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZjEubGVuZ3RoKSB8fCAwXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIHB1YmxpYyBmb3IgdGVzdFxuICAgIGdldCB3aW5kb3coKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMud2luZG93O1xuICAgIH1cbiAgICBnZXQgZG9jdW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZG9jdW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuXHQgKiBHZXQgdGhlIHJvb3QgZWxlbWVudCB0byB1c2UgZm9yIGV2ZW50IHN1YnNjcmlwdGlvbnNcblx0ICovIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5yb290RWxlbWVudDtcbiAgICB9XG4gICAgc2V0dXAoKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3RFbGVtZW50O1xuICAgICAgICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvb3QuX19pc1JlYWN0RG5kQmFja2VuZFNldFVwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBoYXZlIHR3byBIVE1MNSBiYWNrZW5kcyBhdCB0aGUgc2FtZSB0aW1lLicpO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QuX19pc1JlYWN0RG5kQmFja2VuZFNldFVwID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycyhyb290KTtcbiAgICB9XG4gICAgdGVhcmRvd24oKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3RFbGVtZW50O1xuICAgICAgICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5fX2lzUmVhY3REbmRCYWNrZW5kU2V0VXAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLnJvb3RFbGVtZW50KTtcbiAgICAgICAgdGhpcy5jbGVhckN1cnJlbnREcmFnU291cmNlTm9kZSgpO1xuICAgICAgICBpZiAodGhpcy5hc3luY0VuZERyYWdGcmFtZUlkKSB7XG4gICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgKHJlZiA9IHRoaXMud2luZG93KSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFzeW5jRW5kRHJhZ0ZyYW1lSWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbm5lY3REcmFnUHJldmlldyhzb3VyY2VJZCwgbm9kZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucy5zZXQoc291cmNlSWQsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNvdXJjZVByZXZpZXdOb2Rlcy5zZXQoc291cmNlSWQsIG5vZGUpO1xuICAgICAgICByZXR1cm4gKCk9PntcbiAgICAgICAgICAgIHRoaXMuc291cmNlUHJldmlld05vZGVzLmRlbGV0ZShzb3VyY2VJZCk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucy5kZWxldGUoc291cmNlSWQpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25uZWN0RHJhZ1NvdXJjZShzb3VyY2VJZCwgbm9kZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnNvdXJjZU5vZGVzLnNldChzb3VyY2VJZCwgbm9kZSk7XG4gICAgICAgIHRoaXMuc291cmNlTm9kZU9wdGlvbnMuc2V0KHNvdXJjZUlkLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaGFuZGxlRHJhZ1N0YXJ0ID0gKGUpPT50aGlzLmhhbmRsZURyYWdTdGFydChlLCBzb3VyY2VJZClcbiAgICAgICAgO1xuICAgICAgICBjb25zdCBoYW5kbGVTZWxlY3RTdGFydCA9IChlKT0+dGhpcy5oYW5kbGVTZWxlY3RTdGFydChlKVxuICAgICAgICA7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAndHJ1ZScpO1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIGhhbmRsZURyYWdTdGFydCk7XG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBoYW5kbGVTZWxlY3RTdGFydCk7XG4gICAgICAgIHJldHVybiAoKT0+e1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VOb2Rlcy5kZWxldGUoc291cmNlSWQpO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VOb2RlT3B0aW9ucy5kZWxldGUoc291cmNlSWQpO1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCBoYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIGhhbmRsZVNlbGVjdFN0YXJ0KTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCAnZmFsc2UnKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29ubmVjdERyb3BUYXJnZXQodGFyZ2V0SWQsIG5vZGUpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlRHJhZ0VudGVyID0gKGUpPT50aGlzLmhhbmRsZURyYWdFbnRlcihlLCB0YXJnZXRJZClcbiAgICAgICAgO1xuICAgICAgICBjb25zdCBoYW5kbGVEcmFnT3ZlciA9IChlKT0+dGhpcy5oYW5kbGVEcmFnT3ZlcihlLCB0YXJnZXRJZClcbiAgICAgICAgO1xuICAgICAgICBjb25zdCBoYW5kbGVEcm9wID0gKGUpPT50aGlzLmhhbmRsZURyb3AoZSwgdGFyZ2V0SWQpXG4gICAgICAgIDtcbiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCBoYW5kbGVEcmFnRW50ZXIpO1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgaGFuZGxlRHJhZ092ZXIpO1xuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBoYW5kbGVEcm9wKTtcbiAgICAgICAgcmV0dXJuICgpPT57XG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIGhhbmRsZURyYWdFbnRlcik7XG4gICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgaGFuZGxlRHJhZ092ZXIpO1xuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgaGFuZGxlRHJvcCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGFkZEV2ZW50TGlzdGVuZXJzKHRhcmdldCkge1xuICAgICAgICAvLyBTU1IgRml4IChodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZG5kL3JlYWN0LWRuZC9wdWxsLzgxM1xuICAgICAgICBpZiAoIXRhcmdldC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlVG9wRHJhZ1N0YXJ0KTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlVG9wRHJhZ1N0YXJ0Q2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVUb3BEcmFnRW5kQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmhhbmRsZVRvcERyYWdFbnRlcik7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmhhbmRsZVRvcERyYWdFbnRlckNhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5oYW5kbGVUb3BEcmFnTGVhdmVDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5oYW5kbGVUb3BEcmFnT3Zlcik7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlVG9wRHJhZ092ZXJDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmhhbmRsZVRvcERyb3ApO1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuaGFuZGxlVG9wRHJvcENhcHR1cmUsIHRydWUpO1xuICAgIH1cbiAgICByZW1vdmVFdmVudExpc3RlbmVycyh0YXJnZXQpIHtcbiAgICAgICAgLy8gU1NSIEZpeCAoaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRuZC9yZWFjdC1kbmQvcHVsbC84MTNcbiAgICAgICAgaWYgKCF0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZVRvcERyYWdTdGFydCk7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZVRvcERyYWdTdGFydENhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlVG9wRHJhZ0VuZENhcHR1cmUsIHRydWUpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5oYW5kbGVUb3BEcmFnRW50ZXIpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5oYW5kbGVUb3BEcmFnRW50ZXJDYXB0dXJlLCB0cnVlKTtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMuaGFuZGxlVG9wRHJhZ0xlYXZlQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlVG9wRHJhZ092ZXIpO1xuICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZVRvcERyYWdPdmVyQ2FwdHVyZSwgdHJ1ZSk7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5oYW5kbGVUb3BEcm9wKTtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmhhbmRsZVRvcERyb3BDYXB0dXJlLCB0cnVlKTtcbiAgICB9XG4gICAgZ2V0Q3VycmVudFNvdXJjZU5vZGVPcHRpb25zKCkge1xuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IHRoaXMubW9uaXRvci5nZXRTb3VyY2VJZCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VOb2RlT3B0aW9ucyA9IHRoaXMuc291cmNlTm9kZU9wdGlvbnMuZ2V0KHNvdXJjZUlkKTtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgZHJvcEVmZmVjdDogdGhpcy5hbHRLZXlQcmVzc2VkID8gJ2NvcHknIDogJ21vdmUnXG4gICAgICAgIH0sIHNvdXJjZU5vZGVPcHRpb25zIHx8IHt9KTtcbiAgICB9XG4gICAgZ2V0Q3VycmVudERyb3BFZmZlY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgIC8vIEl0IG1ha2VzIG1vcmUgc2Vuc2UgdG8gZGVmYXVsdCB0byAnY29weScgZm9yIG5hdGl2ZSByZXNvdXJjZXNcbiAgICAgICAgICAgIHJldHVybiAnY29weSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFNvdXJjZU5vZGVPcHRpb25zKCkuZHJvcEVmZmVjdDtcbiAgICB9XG4gICAgZ2V0Q3VycmVudFNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucygpIHtcbiAgICAgICAgY29uc3Qgc291cmNlSWQgPSB0aGlzLm1vbml0b3IuZ2V0U291cmNlSWQoKTtcbiAgICAgICAgY29uc3Qgc291cmNlUHJldmlld05vZGVPcHRpb25zID0gdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMuZ2V0KHNvdXJjZUlkKTtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgYW5jaG9yWDogMC41LFxuICAgICAgICAgICAgYW5jaG9yWTogMC41LFxuICAgICAgICAgICAgY2FwdHVyZURyYWdnaW5nU3RhdGU6IGZhbHNlXG4gICAgICAgIH0sIHNvdXJjZVByZXZpZXdOb2RlT3B0aW9ucyB8fCB7fSk7XG4gICAgfVxuICAgIGlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkge1xuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHRoaXMubW9uaXRvci5nZXRJdGVtVHlwZSgpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoTmF0aXZlVHlwZXMpLnNvbWUoKGtleSk9Pk5hdGl2ZVR5cGVzW2tleV0gPT09IGl0ZW1UeXBlXG4gICAgICAgICk7XG4gICAgfVxuICAgIGJlZ2luRHJhZ05hdGl2ZUl0ZW0odHlwZSwgZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIHRoaXMuY2xlYXJDdXJyZW50RHJhZ1NvdXJjZU5vZGUoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50TmF0aXZlU291cmNlID0gY3JlYXRlTmF0aXZlRHJhZ1NvdXJjZSh0eXBlLCBkYXRhVHJhbnNmZXIpO1xuICAgICAgICB0aGlzLmN1cnJlbnROYXRpdmVIYW5kbGUgPSB0aGlzLnJlZ2lzdHJ5LmFkZFNvdXJjZSh0eXBlLCB0aGlzLmN1cnJlbnROYXRpdmVTb3VyY2UpO1xuICAgICAgICB0aGlzLmFjdGlvbnMuYmVnaW5EcmFnKFtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE5hdGl2ZUhhbmRsZVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgc2V0Q3VycmVudERyYWdTb3VyY2VOb2RlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jbGVhckN1cnJlbnREcmFnU291cmNlTm9kZSgpO1xuICAgICAgICB0aGlzLmN1cnJlbnREcmFnU291cmNlTm9kZSA9IG5vZGU7XG4gICAgICAgIC8vIEEgdGltZW91dCBvZiA+IDAgaXMgbmVjZXNzYXJ5IHRvIHJlc29sdmUgRmlyZWZveCBpc3N1ZSByZWZlcmVuY2VkXG4gICAgICAgIC8vIFNlZTpcbiAgICAgICAgLy8gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kbmQvcmVhY3QtZG5kL3B1bGwvOTI4XG4gICAgICAgIC8vICAgKiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZG5kL3JlYWN0LWRuZC9pc3N1ZXMvODY5XG4gICAgICAgIGNvbnN0IE1PVVNFX01PVkVfVElNRU9VVCA9IDEwMDA7XG4gICAgICAgIC8vIFJlY2VpdmluZyBhIG1vdXNlIGV2ZW50IGluIHRoZSBtaWRkbGUgb2YgYSBkcmFnZ2luZyBvcGVyYXRpb25cbiAgICAgICAgLy8gbWVhbnMgaXQgaGFzIGVuZGVkIGFuZCB0aGUgZHJhZyBzb3VyY2Ugbm9kZSBkaXNhcHBlYXJlZCBmcm9tIERPTSxcbiAgICAgICAgLy8gc28gdGhlIGJyb3dzZXIgZGlkbid0IGRpc3BhdGNoIHRoZSBkcmFnZW5kIGV2ZW50LlxuICAgICAgICAvL1xuICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgYmVmb3JlIHdlIHN0YXJ0IGxpc3RlbmluZyBmb3IgbW91c2Vtb3ZlIGV2ZW50cy5cbiAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgZHJhZyBwcmV2aWV3IG5lZWRzIHRvIGJlIGRyYXduIG9yIGVsc2UgaXQgZmlyZXMgYW4gJ21vdXNlbW92ZScgZXZlbnRcbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgaW4gc29tZSBicm93c2Vycy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2VlOlxuICAgICAgICAvLyAgICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRuZC9yZWFjdC1kbmQvcHVsbC85MjhcbiAgICAgICAgLy8gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kbmQvcmVhY3QtZG5kL2lzc3Vlcy84NjlcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5tb3VzZU1vdmVUaW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgcmV0dXJuIChyZWYgPSB0aGlzLnJvb3RFbGVtZW50KSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmVuZERyYWdJZlNvdXJjZVdhc1JlbW92ZWRGcm9tRE9NLCB0cnVlKTtcbiAgICAgICAgfSwgTU9VU0VfTU9WRV9USU1FT1VUKTtcbiAgICB9XG4gICAgY2xlYXJDdXJyZW50RHJhZ1NvdXJjZU5vZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnREcmFnU291cmNlTm9kZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50RHJhZ1NvdXJjZU5vZGUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMucm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgICAgIChyZWYgPSB0aGlzLndpbmRvdykgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYuY2xlYXJUaW1lb3V0KHRoaXMubW91c2VNb3ZlVGltZW91dFRpbWVyIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmVuZERyYWdJZlNvdXJjZVdhc1JlbW92ZWRGcm9tRE9NLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubW91c2VNb3ZlVGltZW91dFRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlRHJhZ1N0YXJ0KGUsIHNvdXJjZUlkKSB7XG4gICAgICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZHJhZ1N0YXJ0U291cmNlSWRzKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdTdGFydFNvdXJjZUlkcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHJhZ1N0YXJ0U291cmNlSWRzLnVuc2hpZnQoc291cmNlSWQpO1xuICAgIH1cbiAgICBoYW5kbGVEcmFnRW50ZXIoX2UsIHRhcmdldElkKSB7XG4gICAgICAgIHRoaXMuZHJhZ0VudGVyVGFyZ2V0SWRzLnVuc2hpZnQodGFyZ2V0SWQpO1xuICAgIH1cbiAgICBoYW5kbGVEcmFnT3ZlcihfZSwgdGFyZ2V0SWQpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ092ZXJUYXJnZXRJZHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ092ZXJUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyYWdPdmVyVGFyZ2V0SWRzLnVuc2hpZnQodGFyZ2V0SWQpO1xuICAgIH1cbiAgICBoYW5kbGVEcm9wKF9lLCB0YXJnZXRJZCkge1xuICAgICAgICB0aGlzLmRyb3BUYXJnZXRJZHMudW5zaGlmdCh0YXJnZXRJZCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG1hbmFnZXIsIGdsb2JhbENvbnRleHQsIG9wdGlvbnMpe1xuICAgICAgICB0aGlzLnNvdXJjZVByZXZpZXdOb2RlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5zb3VyY2VQcmV2aWV3Tm9kZU9wdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc291cmNlTm9kZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc291cmNlTm9kZU9wdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZHJhZ1N0YXJ0U291cmNlSWRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5kcm9wVGFyZ2V0SWRzID0gW107XG4gICAgICAgIHRoaXMuZHJhZ0VudGVyVGFyZ2V0SWRzID0gW107XG4gICAgICAgIHRoaXMuY3VycmVudE5hdGl2ZVNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudE5hdGl2ZUhhbmRsZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudERyYWdTb3VyY2VOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbHRLZXlQcmVzc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW91c2VNb3ZlVGltZW91dFRpbWVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5hc3luY0VuZERyYWdGcmFtZUlkID0gbnVsbDtcbiAgICAgICAgdGhpcy5kcmFnT3ZlclRhcmdldElkcyA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdENsaWVudE9mZnNldCA9IG51bGw7XG4gICAgICAgIHRoaXMuaG92ZXJSYWZJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuZ2V0U291cmNlQ2xpZW50T2Zmc2V0ID0gKHNvdXJjZUlkKT0+e1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5zb3VyY2VOb2Rlcy5nZXQoc291cmNlSWQpO1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZSAmJiBnZXROb2RlQ2xpZW50T2Zmc2V0KHNvdXJjZSkgfHwgbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbmREcmFnTmF0aXZlSXRlbSA9ICgpPT57XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ05hdGl2ZUl0ZW0oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5lbmREcmFnKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TmF0aXZlSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RyeS5yZW1vdmVTb3VyY2UodGhpcy5jdXJyZW50TmF0aXZlSGFuZGxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudE5hdGl2ZUhhbmRsZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnROYXRpdmVTb3VyY2UgPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmlzTm9kZUluRG9jdW1lbnQgPSAobm9kZSk9PntcbiAgICAgICAgICAgIC8vIENoZWNrIHRoZSBub2RlIGVpdGhlciBpbiB0aGUgbWFpbiBkb2N1bWVudCBvciBpbiB0aGUgY3VycmVudCBjb250ZXh0XG4gICAgICAgICAgICByZXR1cm4gQm9vbGVhbihub2RlICYmIHRoaXMuZG9jdW1lbnQgJiYgdGhpcy5kb2N1bWVudC5ib2R5ICYmIHRoaXMuZG9jdW1lbnQuYm9keS5jb250YWlucyhub2RlKSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZW5kRHJhZ0lmU291cmNlV2FzUmVtb3ZlZEZyb21ET00gPSAoKT0+e1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY3VycmVudERyYWdTb3VyY2VOb2RlO1xuICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCB8fCB0aGlzLmlzTm9kZUluRG9jdW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhckN1cnJlbnREcmFnU291cmNlTm9kZSgpICYmIHRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuZW5kRHJhZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYW5jZWxIb3ZlcigpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNjaGVkdWxlSG92ZXIgPSAoZHJhZ092ZXJUYXJnZXRJZHMpPT57XG4gICAgICAgICAgICBpZiAodGhpcy5ob3ZlclJhZklkID09PSBudWxsICYmIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3ZlclJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vbml0b3IuaXNEcmFnZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuaG92ZXIoZHJhZ092ZXJUYXJnZXRJZHMgfHwgW10sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRPZmZzZXQ6IHRoaXMubGFzdENsaWVudE9mZnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ob3ZlclJhZklkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jYW5jZWxIb3ZlciA9ICgpPT57XG4gICAgICAgICAgICBpZiAodGhpcy5ob3ZlclJhZklkICE9PSBudWxsICYmIHR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmhvdmVyUmFmSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJSYWZJZCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJhZ1N0YXJ0Q2FwdHVyZSA9ICgpPT57XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ3VycmVudERyYWdTb3VyY2VOb2RlKCk7XG4gICAgICAgICAgICB0aGlzLmRyYWdTdGFydFNvdXJjZUlkcyA9IFtdO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdTdGFydCA9IChlKT0+e1xuICAgICAgICAgICAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZHJhZ1N0YXJ0U291cmNlSWRzICB9ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXJ0U291cmNlSWRzID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudE9mZnNldCA9IGdldEV2ZW50Q2xpZW50T2Zmc2V0KGUpO1xuICAgICAgICAgICAgLy8gQXZvaWQgY3Jhc2hpbmcgaWYgd2UgbWlzc2VkIGEgZHJvcCBldmVudCBvciBvdXIgcHJldmlvdXMgZHJhZyBkaWVkXG4gICAgICAgICAgICBpZiAodGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5lbmREcmFnKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxIb3ZlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRG9uJ3QgcHVibGlzaCB0aGUgc291cmNlIGp1c3QgeWV0IChzZWUgd2h5IGJlbG93KVxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmJlZ2luRHJhZyhkcmFnU3RhcnRTb3VyY2VJZHMgfHwgW10sIHtcbiAgICAgICAgICAgICAgICBwdWJsaXNoU291cmNlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBnZXRTb3VyY2VDbGllbnRPZmZzZXQ6IHRoaXMuZ2V0U291cmNlQ2xpZW50T2Zmc2V0LFxuICAgICAgICAgICAgICAgIGNsaWVudE9mZnNldFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGFUcmFuc2ZlciAgfSA9IGU7XG4gICAgICAgICAgICBjb25zdCBuYXRpdmVUeXBlID0gbWF0Y2hOYXRpdmVJdGVtVHlwZShkYXRhVHJhbnNmZXIpO1xuICAgICAgICAgICAgaWYgKHRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIHR5cGVvZiBkYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBjdXN0b20gZHJhZyBpbWFnZSBpZiB1c2VyIHNwZWNpZmllcyBpdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgY2hpbGQgZHJhZyBzb3VyY2UgcmVmdXNlcyBkcmFnIGJ1dCBwYXJlbnQgYWdyZWVzLFxuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgcGFyZW50J3Mgbm9kZSBhcyBkcmFnIGltYWdlLiBOZWl0aGVyIHdvcmtzIGluIElFIHRob3VnaC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlSWQgPSB0aGlzLm1vbml0b3IuZ2V0U291cmNlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlTm9kZSA9IHRoaXMuc291cmNlTm9kZXMuZ2V0KHNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJhZ1ByZXZpZXcgPSB0aGlzLnNvdXJjZVByZXZpZXdOb2Rlcy5nZXQoc291cmNlSWQpIHx8IHNvdXJjZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkcmFnUHJldmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhbmNob3JYICwgYW5jaG9yWSAsIG9mZnNldFggLCBvZmZzZXRZICB9ID0gdGhpcy5nZXRDdXJyZW50U291cmNlUHJldmlld05vZGVPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNob3JQb2ludCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JYLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcllcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRQb2ludCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRYLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkcmFnUHJldmlld09mZnNldCA9IGdldERyYWdQcmV2aWV3T2Zmc2V0KHNvdXJjZU5vZGUsIGRyYWdQcmV2aWV3LCBjbGllbnRPZmZzZXQsIGFuY2hvclBvaW50LCBvZmZzZXRQb2ludCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKGRyYWdQcmV2aWV3LCBkcmFnUHJldmlld09mZnNldC54LCBkcmFnUHJldmlld09mZnNldC55KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaXJlZm94IHdvbid0IGRyYWcgd2l0aG91dCBzZXR0aW5nIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyID09PSBudWxsIHx8IGRhdGFUcmFuc2ZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGF0YVRyYW5zZmVyLnNldERhdGEoJ2FwcGxpY2F0aW9uL2pzb24nLCB7fSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IE1JTUUgdHlwZXMgaW4gc2V0RGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTdG9yZSBkcmFnIHNvdXJjZSBub2RlIHNvIHdlIGNhbiBjaGVjayB3aGV0aGVyXG4gICAgICAgICAgICAgICAgLy8gaXQgaXMgcmVtb3ZlZCBmcm9tIERPTSBhbmQgdHJpZ2dlciBlbmREcmFnIG1hbnVhbGx5LlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudERyYWdTb3VyY2VOb2RlKGUudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAvLyBOb3cgd2UgYXJlIHJlYWR5IHRvIHB1Ymxpc2ggdGhlIGRyYWcgc291cmNlLi4gb3IgYXJlIHdlIG5vdD9cbiAgICAgICAgICAgICAgICBjb25zdCB7IGNhcHR1cmVEcmFnZ2luZ1N0YXRlICB9ID0gdGhpcy5nZXRDdXJyZW50U291cmNlUHJldmlld05vZGVPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjYXB0dXJlRHJhZ2dpbmdTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBVc3VhbGx5IHdlIHdhbnQgdG8gcHVibGlzaCBpdCBpbiB0aGUgbmV4dCB0aWNrIHNvIHRoYXQgYnJvd3NlclxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBhYmxlIHRvIHNjcmVlbnNob3QgdGhlIGN1cnJlbnQgKG5vdCB5ZXQgZHJhZ2dpbmcpIHN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBJdCBhbHNvIG5lYXRseSBhdm9pZHMgYSBzaXR1YXRpb24gd2hlcmUgcmVuZGVyKCkgcmV0dXJucyBudWxsXG4gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBzYW1lIHRpY2sgZm9yIHRoZSBzb3VyY2UgZWxlbWVudCwgYW5kIGJyb3dzZXIgZnJlYWtzIG91dC5cbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKT0+dGhpcy5hY3Rpb25zLnB1Ymxpc2hEcmFnU291cmNlKClcbiAgICAgICAgICAgICAgICAgICAgLCAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSB1c2VyIG1heSB3YW50IHRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IsIGUuZy5cbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gd29yayBhcm91bmQgSUUgbm90IHN1cHBvcnRpbmcgY3VzdG9tIGRyYWcgcHJldmlld3MuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBjdXN0b20gZHJhZyBsYXllciwgdGhlIG9ubHkgd2F5IHRvIHByZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgZHJhZyBwcmV2aWV3IGZyb20gZHJhd2luZyBpbiBJRSBpcyB0byBzY3JlZW5zaG90XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkcmFnZ2luZyBzdGF0ZSBpbiB3aGljaCB0aGUgbm9kZSBpdHNlbGYgaGFzIHplcm8gb3BhY2l0eVxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaGVpZ2h0LiBJbiB0aGlzIGNhc2UsIHRob3VnaCwgcmV0dXJuaW5nIG51bGwgZnJvbSByZW5kZXIoKVxuICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGFicnVwdGx5IGVuZCB0aGUgZHJhZ2dpbmcsIHdoaWNoIGlzIG5vdCBvYnZpb3VzLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByZWFzb24gc3VjaCBiZWhhdmlvciBpcyBzdHJpY3RseSBvcHQtaW4uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5wdWJsaXNoRHJhZ1NvdXJjZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmF0aXZlVHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIEEgbmF0aXZlIGl0ZW0gKHN1Y2ggYXMgVVJMKSBkcmFnZ2VkIGZyb20gaW5zaWRlIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgICAgIHRoaXMuYmVnaW5EcmFnTmF0aXZlSXRlbShuYXRpdmVUeXBlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVRyYW5zZmVyICYmICFkYXRhVHJhbnNmZXIudHlwZXMgJiYgKGUudGFyZ2V0ICYmICFlLnRhcmdldC5oYXNBdHRyaWJ1dGUgfHwgIWUudGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZHJhZ2dhYmxlJykpKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9va3MgbGlrZSBhIFNhZmFyaSBidWc6IGRhdGFUcmFuc2Zlci50eXBlcyBpcyBudWxsLCBidXQgdGhlcmUgd2FzIG5vIGRyYWdnYWJsZS5cbiAgICAgICAgICAgICAgICAvLyBKdXN0IGxldCBpdCBkcmFnLiBJdCdzIGEgbmF0aXZlIHR5cGUgKFVSTCBvciB0ZXh0KSBhbmQgd2lsbCBiZSBwaWNrZWQgdXAgaW5cbiAgICAgICAgICAgICAgICAvLyBkcmFnZW50ZXIgaGFuZGxlci5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElmIGJ5IHRoaXMgdGltZSBubyBkcmFnIHNvdXJjZSByZWFjdGVkLCB0ZWxsIGJyb3dzZXIgbm90IHRvIGRyYWcuXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdFbmRDYXB0dXJlID0gKCk9PntcbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyQ3VycmVudERyYWdTb3VyY2VOb2RlKCkgJiYgdGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggY2FuIGRpc3BhdGNoIHRoaXMgZXZlbnQgaW4gYW4gaW5maW5pdGUgbG9vcFxuICAgICAgICAgICAgICAgIC8vIGlmIGRyYWdlbmQgaGFuZGxlciBkb2VzIHNvbWV0aGluZyBsaWtlIHNob3dpbmcgYW4gYWxlcnQuXG4gICAgICAgICAgICAgICAgLy8gT25seSBwcm9jZWVkIGlmIHdlIGhhdmUgbm90IGhhbmRsZWQgaXQgYWxyZWFkeS5cbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuZW5kRHJhZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYW5jZWxIb3ZlcigpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdFbnRlckNhcHR1cmUgPSAoZSk9PntcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VudGVyVGFyZ2V0SWRzID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgICAgICAgICAocmVmID0gdGhpcy5jdXJyZW50TmF0aXZlU291cmNlKSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5sb2FkRGF0YVRyYW5zZmVyKGUuZGF0YVRyYW5zZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlzRmlyc3RFbnRlciA9IHRoaXMuZW50ZXJMZWF2ZUNvdW50ZXIuZW50ZXIoZS50YXJnZXQpO1xuICAgICAgICAgICAgaWYgKCFpc0ZpcnN0RW50ZXIgfHwgdGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YVRyYW5zZmVyICB9ID0gZTtcbiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZVR5cGUgPSBtYXRjaE5hdGl2ZUl0ZW1UeXBlKGRhdGFUcmFuc2Zlcik7XG4gICAgICAgICAgICBpZiAobmF0aXZlVHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIEEgbmF0aXZlIGl0ZW0gKHN1Y2ggYXMgZmlsZSBvciBVUkwpIGRyYWdnZWQgZnJvbSBvdXRzaWRlIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgICAgIHRoaXMuYmVnaW5EcmFnTmF0aXZlSXRlbShuYXRpdmVUeXBlLCBkYXRhVHJhbnNmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdFbnRlciA9IChlKT0+e1xuICAgICAgICAgICAgY29uc3QgeyBkcmFnRW50ZXJUYXJnZXRJZHMgIH0gPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5kcmFnRW50ZXJUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5tb25pdG9yLmlzRHJhZ2dpbmcoKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYSBuYXRpdmUgaXRlbSB0eXBlIHdlIGRvbid0IHVuZGVyc3RhbmQuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hbHRLZXlQcmVzc2VkID0gZS5hbHRLZXk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IGNoYW5nZXMgcG9zaXRpb24gYXMgdGhlIHJlc3VsdCBvZiBgZHJhZ2VudGVyYCwgYGRyYWdvdmVyYCBtaWdodCBzdGlsbFxuICAgICAgICAgICAgLy8gZ2V0IGRpc3BhdGNoZWQgZGVzcGl0ZSB0YXJnZXQgYmVpbmcgbm8gbG9uZ2VyIHRoZXJlLiBUaGUgZWFzeSBzb2x1dGlvbiBpcyB0byBjaGVja1xuICAgICAgICAgICAgLy8gd2hldGhlciB0aGVyZSBhY3R1YWxseSBpcyBhIHRhcmdldCBiZWZvcmUgZmlyaW5nIGBob3ZlcmAuXG4gICAgICAgICAgICBpZiAoZHJhZ0VudGVyVGFyZ2V0SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuaG92ZXIoZHJhZ0VudGVyVGFyZ2V0SWRzLCB7XG4gICAgICAgICAgICAgICAgICAgIGNsaWVudE9mZnNldDogZ2V0RXZlbnRDbGllbnRPZmZzZXQoZSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNhbkRyb3AgPSBkcmFnRW50ZXJUYXJnZXRJZHMuc29tZSgodGFyZ2V0SWQpPT50aGlzLm1vbml0b3IuY2FuRHJvcE9uVGFyZ2V0KHRhcmdldElkKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjYW5Ecm9wKSB7XG4gICAgICAgICAgICAgICAgLy8gSUUgcmVxdWlyZXMgdGhpcyB0byBmaXJlIGRyYWdvdmVyIGV2ZW50c1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IHRoaXMuZ2V0Q3VycmVudERyb3BFZmZlY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG9wRHJhZ092ZXJDYXB0dXJlID0gKGUpPT57XG4gICAgICAgICAgICB0aGlzLmRyYWdPdmVyVGFyZ2V0SWRzID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZjtcbiAgICAgICAgICAgICAgICAocmVmID0gdGhpcy5jdXJyZW50TmF0aXZlU291cmNlKSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5sb2FkRGF0YVRyYW5zZmVyKGUuZGF0YVRyYW5zZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3BEcmFnT3ZlciA9IChlKT0+e1xuICAgICAgICAgICAgY29uc3QgeyBkcmFnT3ZlclRhcmdldElkcyAgfSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmRyYWdPdmVyVGFyZ2V0SWRzID0gW107XG4gICAgICAgICAgICBpZiAoIXRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGEgbmF0aXZlIGl0ZW0gdHlwZSB3ZSBkb24ndCB1bmRlcnN0YW5kLlxuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgZGVmYXVsdCBcImRyb3AgYW5kIGJsb3cgYXdheSB0aGUgd2hvbGUgZG9jdW1lbnRcIiBhY3Rpb24uXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlcikge1xuICAgICAgICAgICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFsdEtleVByZXNzZWQgPSBlLmFsdEtleTtcbiAgICAgICAgICAgIHRoaXMubGFzdENsaWVudE9mZnNldCA9IGdldEV2ZW50Q2xpZW50T2Zmc2V0KGUpO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUhvdmVyKGRyYWdPdmVyVGFyZ2V0SWRzKTtcbiAgICAgICAgICAgIGNvbnN0IGNhbkRyb3AgPSAoZHJhZ092ZXJUYXJnZXRJZHMgfHwgW10pLnNvbWUoKHRhcmdldElkKT0+dGhpcy5tb25pdG9yLmNhbkRyb3BPblRhcmdldCh0YXJnZXRJZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY2FuRHJvcCkge1xuICAgICAgICAgICAgICAgIC8vIFNob3cgdXNlci1zcGVjaWZpZWQgZHJvcCBlZmZlY3QuXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlcikge1xuICAgICAgICAgICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gdGhpcy5nZXRDdXJyZW50RHJvcEVmZmVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0RyYWdnaW5nTmF0aXZlSXRlbSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2hvdyBhIG5pY2UgY3Vyc29yIGJ1dCBzdGlsbCBwcmV2ZW50IGRlZmF1bHRcbiAgICAgICAgICAgICAgICAvLyBcImRyb3AgYW5kIGJsb3cgYXdheSB0aGUgd2hvbGUgZG9jdW1lbnRcIiBhY3Rpb24uXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGUuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyYWdMZWF2ZUNhcHR1cmUgPSAoZSk9PntcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc0xhc3RMZWF2ZSA9IHRoaXMuZW50ZXJMZWF2ZUNvdW50ZXIubGVhdmUoZS50YXJnZXQpO1xuICAgICAgICAgICAgaWYgKCFpc0xhc3RMZWF2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT50aGlzLmVuZERyYWdOYXRpdmVJdGVtKClcbiAgICAgICAgICAgICAgICAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYW5jZWxIb3ZlcigpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyb3BDYXB0dXJlID0gKGUpPT57XG4gICAgICAgICAgICB0aGlzLmRyb3BUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVmO1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAocmVmID0gdGhpcy5jdXJyZW50TmF0aXZlU291cmNlKSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5sb2FkRGF0YVRyYW5zZmVyKGUuZGF0YVRyYW5zZmVyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hOYXRpdmVJdGVtVHlwZShlLmRhdGFUcmFuc2ZlcikpIHtcbiAgICAgICAgICAgICAgICAvLyBEcmFnZ2luZyBzb21lIGVsZW1lbnRzLCBsaWtlIDxhPiBhbmQgPGltZz4gbWF5IHN0aWxsIGJlaGF2ZSBsaWtlIGEgbmF0aXZlIGRyYWcgZXZlbnQsXG4gICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGUgY3VycmVudCBkcmFnIGV2ZW50IG1hdGNoZXMgYSB1c2VyLWRlZmluZWQgdHlwZS5cbiAgICAgICAgICAgICAgICAvLyBTdG9wIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gd2UncmUgbm90IGV4cGVjdGluZyBhIG5hdGl2ZSBpdGVtIHRvIGJlIGRyb3BwZWQuXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbnRlckxlYXZlQ291bnRlci5yZXNldCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvcERyb3AgPSAoZSk9PntcbiAgICAgICAgICAgIGNvbnN0IHsgZHJvcFRhcmdldElkcyAgfSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmRyb3BUYXJnZXRJZHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5ob3Zlcihkcm9wVGFyZ2V0SWRzLCB7XG4gICAgICAgICAgICAgICAgY2xpZW50T2Zmc2V0OiBnZXRFdmVudENsaWVudE9mZnNldChlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbnMuZHJvcCh7XG4gICAgICAgICAgICAgICAgZHJvcEVmZmVjdDogdGhpcy5nZXRDdXJyZW50RHJvcEVmZmVjdCgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdOYXRpdmVJdGVtKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZERyYWdOYXRpdmVJdGVtKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9uaXRvci5pc0RyYWdnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnMuZW5kRHJhZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYW5jZWxIb3ZlcigpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdFN0YXJ0ID0gKGUpPT57XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgIC8vIE9ubHkgSUUgcmVxdWlyZXMgdXMgdG8gZXhwbGljaXRseSBzYXlcbiAgICAgICAgICAgIC8vIHdlIHdhbnQgZHJhZyBkcm9wIG9wZXJhdGlvbiB0byBzdGFydFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQuZHJhZ0Ryb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbnB1dHMgYW5kIHRleHRhcmVhcyBzaG91bGQgYmUgc2VsZWN0YWJsZVxuICAgICAgICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnU0VMRUNUJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0YXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb3Igb3RoZXIgdGFyZ2V0cywgYXNrIElFXG4gICAgICAgICAgICAvLyB0byBlbmFibGUgZHJhZyBhbmQgZHJvcFxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGFyZ2V0LmRyYWdEcm9wKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG5ldyBPcHRpb25zUmVhZGVyKGdsb2JhbENvbnRleHQsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSBtYW5hZ2VyLmdldEFjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5tb25pdG9yID0gbWFuYWdlci5nZXRNb25pdG9yKCk7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSBtYW5hZ2VyLmdldFJlZ2lzdHJ5KCk7XG4gICAgICAgIHRoaXMuZW50ZXJMZWF2ZUNvdW50ZXIgPSBuZXcgRW50ZXJMZWF2ZUNvdW50ZXIodGhpcy5pc05vZGVJbkRvY3VtZW50KTtcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhUTUw1QmFja2VuZEltcGwuanMubWFwIiwiZXhwb3J0IGNsYXNzIE1vbm90b25pY0ludGVycG9sYW50IHtcbiAgICBpbnRlcnBvbGF0ZSh4KSB7XG4gICAgICAgIGNvbnN0IHsgeHMgLCB5cyAsIGMxcyAsIGMycyAsIGMzcyAgfSA9IHRoaXM7XG4gICAgICAgIC8vIFRoZSByaWdodG1vc3QgcG9pbnQgaW4gdGhlIGRhdGFzZXQgc2hvdWxkIGdpdmUgYW4gZXhhY3QgcmVzdWx0XG4gICAgICAgIGxldCBpID0geHMubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKHggPT09IHhzW2ldKSB7XG4gICAgICAgICAgICByZXR1cm4geXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgaW50ZXJ2YWwgeCBpcyBpbiwgcmV0dXJuaW5nIHRoZSBjb3JyZXNwb25kaW5nIHkgaWYgeCBpcyBvbmUgb2YgdGhlIG9yaWdpbmFsIHhzXG4gICAgICAgIGxldCBsb3cgPSAwO1xuICAgICAgICBsZXQgaGlnaCA9IGMzcy5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgbWlkO1xuICAgICAgICB3aGlsZShsb3cgPD0gaGlnaCl7XG4gICAgICAgICAgICBtaWQgPSBNYXRoLmZsb29yKDAuNSAqIChsb3cgKyBoaWdoKSk7XG4gICAgICAgICAgICBjb25zdCB4SGVyZSA9IHhzW21pZF07XG4gICAgICAgICAgICBpZiAoeEhlcmUgPCB4KSB7XG4gICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeEhlcmUgPiB4KSB7XG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB5c1ttaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGkgPSBNYXRoLm1heCgwLCBoaWdoKTtcbiAgICAgICAgLy8gSW50ZXJwb2xhdGVcbiAgICAgICAgY29uc3QgZGlmZiA9IHggLSB4c1tpXTtcbiAgICAgICAgY29uc3QgZGlmZlNxID0gZGlmZiAqIGRpZmY7XG4gICAgICAgIHJldHVybiB5c1tpXSArIGMxc1tpXSAqIGRpZmYgKyBjMnNbaV0gKiBkaWZmU3EgKyBjM3NbaV0gKiBkaWZmICogZGlmZlNxO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih4cywgeXMpe1xuICAgICAgICBjb25zdCB7IGxlbmd0aCAgfSA9IHhzO1xuICAgICAgICAvLyBSZWFycmFuZ2UgeHMgYW5kIHlzIHNvIHRoYXQgeHMgaXMgc29ydGVkXG4gICAgICAgIGNvbnN0IGluZGV4ZXMgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleGVzLnNvcnQoKGEsIGIpPT54c1thXSA8IHhzW2JdID8gLTEgOiAxXG4gICAgICAgICk7XG4gICAgICAgIC8vIEdldCBjb25zZWN1dGl2ZSBkaWZmZXJlbmNlcyBhbmQgc2xvcGVzXG4gICAgICAgIGNvbnN0IGR5cyA9IFtdO1xuICAgICAgICBjb25zdCBkeHMgPSBbXTtcbiAgICAgICAgY29uc3QgbXMgPSBbXTtcbiAgICAgICAgbGV0IGR4O1xuICAgICAgICBsZXQgZHk7XG4gICAgICAgIGZvcihsZXQgaTEgPSAwOyBpMSA8IGxlbmd0aCAtIDE7IGkxKyspe1xuICAgICAgICAgICAgZHggPSB4c1tpMSArIDFdIC0geHNbaTFdO1xuICAgICAgICAgICAgZHkgPSB5c1tpMSArIDFdIC0geXNbaTFdO1xuICAgICAgICAgICAgZHhzLnB1c2goZHgpO1xuICAgICAgICAgICAgZHlzLnB1c2goZHkpO1xuICAgICAgICAgICAgbXMucHVzaChkeSAvIGR4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBHZXQgZGVncmVlLTEgY29lZmZpY2llbnRzXG4gICAgICAgIGNvbnN0IGMxcyA9IFtcbiAgICAgICAgICAgIG1zWzBdXG4gICAgICAgIF07XG4gICAgICAgIGZvcihsZXQgaTIgPSAwOyBpMiA8IGR4cy5sZW5ndGggLSAxOyBpMisrKXtcbiAgICAgICAgICAgIGNvbnN0IG0yID0gbXNbaTJdO1xuICAgICAgICAgICAgY29uc3QgbU5leHQgPSBtc1tpMiArIDFdO1xuICAgICAgICAgICAgaWYgKG0yICogbU5leHQgPD0gMCkge1xuICAgICAgICAgICAgICAgIGMxcy5wdXNoKDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkeCA9IGR4c1tpMl07XG4gICAgICAgICAgICAgICAgY29uc3QgZHhOZXh0ID0gZHhzW2kyICsgMV07XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbW9uID0gZHggKyBkeE5leHQ7XG4gICAgICAgICAgICAgICAgYzFzLnB1c2goMyAqIGNvbW1vbiAvICgoY29tbW9uICsgZHhOZXh0KSAvIG0yICsgKGNvbW1vbiArIGR4KSAvIG1OZXh0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYzFzLnB1c2gobXNbbXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAvLyBHZXQgZGVncmVlLTIgYW5kIGRlZ3JlZS0zIGNvZWZmaWNpZW50c1xuICAgICAgICBjb25zdCBjMnMgPSBbXTtcbiAgICAgICAgY29uc3QgYzNzID0gW107XG4gICAgICAgIGxldCBtO1xuICAgICAgICBmb3IobGV0IGkzID0gMDsgaTMgPCBjMXMubGVuZ3RoIC0gMTsgaTMrKyl7XG4gICAgICAgICAgICBtID0gbXNbaTNdO1xuICAgICAgICAgICAgY29uc3QgYzEgPSBjMXNbaTNdO1xuICAgICAgICAgICAgY29uc3QgaW52RHggPSAxIC8gZHhzW2kzXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbiA9IGMxICsgYzFzW2kzICsgMV0gLSBtIC0gbTtcbiAgICAgICAgICAgIGMycy5wdXNoKChtIC0gYzEgLSBjb21tb24pICogaW52RHgpO1xuICAgICAgICAgICAgYzNzLnB1c2goY29tbW9uICogaW52RHggKiBpbnZEeCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54cyA9IHhzO1xuICAgICAgICB0aGlzLnlzID0geXM7XG4gICAgICAgIHRoaXMuYzFzID0gYzFzO1xuICAgICAgICB0aGlzLmMycyA9IGMycztcbiAgICAgICAgdGhpcy5jM3MgPSBjM3M7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb25vdG9uaWNJbnRlcnBvbGFudC5qcy5tYXAiLCJleHBvcnQgY2xhc3MgTmF0aXZlRHJhZ1NvdXJjZSB7XG4gICAgaW5pdGlhbGl6ZUV4cG9zZWRQcm9wZXJ0aWVzKCkge1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5leHBvc2VQcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eSk9PntcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLml0ZW0sIHByb3BlcnR5LCB7XG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBCcm93c2VyIGRvZXNuJ3QgYWxsb3cgcmVhZGluZyBcIiR7cHJvcGVydHl9XCIgdW50aWwgdGhlIGRyb3AgZXZlbnQuYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgbG9hZERhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgaWYgKGRhdGFUcmFuc2Zlcikge1xuICAgICAgICAgICAgY29uc3QgbmV3UHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5jb25maWcuZXhwb3NlUHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHkpPT57XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlGbiA9IHRoaXMuY29uZmlnLmV4cG9zZVByb3BlcnRpZXNbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUZuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllc1twcm9wZXJ0eV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcGVydHlGbihkYXRhVHJhbnNmZXIsIHRoaXMuY29uZmlnLm1hdGNoZXNUeXBlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLml0ZW0sIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbkRyYWcoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBiZWdpbkRyYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZW07XG4gICAgfVxuICAgIGlzRHJhZ2dpbmcobW9uaXRvciwgaGFuZGxlKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGUgPT09IG1vbml0b3IuZ2V0U291cmNlSWQoKTtcbiAgICB9XG4gICAgZW5kRHJhZygpIHtcbiAgICAvLyBlbXB0eVxuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpe1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5pdGVtID0ge307XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUV4cG9zZWRQcm9wZXJ0aWVzKCk7XG4gICAgfVxufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYXRpdmVEcmFnU291cmNlLmpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiBnZXREYXRhRnJvbURhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXIsIHR5cGVzVG9UcnksIGRlZmF1bHRWYWx1ZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHR5cGVzVG9UcnkucmVkdWNlKChyZXN1bHRTb0ZhciwgdHlwZVRvVHJ5KT0+cmVzdWx0U29GYXIgfHwgZGF0YVRyYW5zZmVyLmdldERhdGEodHlwZVRvVHJ5KVxuICAgICwgJycpO1xuICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IGRlZmF1bHRWYWx1ZTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0RGF0YUZyb21EYXRhVHJhbnNmZXIuanMubWFwIiwiaW1wb3J0IHsgTmF0aXZlRHJhZ1NvdXJjZSB9IGZyb20gJy4vTmF0aXZlRHJhZ1NvdXJjZS5qcyc7XG5pbXBvcnQgeyBuYXRpdmVUeXBlc0NvbmZpZyB9IGZyb20gJy4vbmF0aXZlVHlwZXNDb25maWcuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5hdGl2ZURyYWdTb3VyY2UodHlwZSwgZGF0YVRyYW5zZmVyKSB7XG4gICAgY29uc3QgY29uZmlnID0gbmF0aXZlVHlwZXNDb25maWdbdHlwZV07XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBuYXRpdmUgdHlwZSAke3R5cGV9IGhhcyBubyBjb25maWd1cmF0aW9uYCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBOYXRpdmVEcmFnU291cmNlKGNvbmZpZyk7XG4gICAgcmVzdWx0LmxvYWREYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoTmF0aXZlSXRlbVR5cGUoZGF0YVRyYW5zZmVyKSB7XG4gICAgaWYgKCFkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGRhdGFUcmFuc2ZlclR5cGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YVRyYW5zZmVyLnR5cGVzIHx8IFtdKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobmF0aXZlVHlwZXNDb25maWcpLmZpbHRlcigobmF0aXZlSXRlbVR5cGUpPT57XG4gICAgICAgIGNvbnN0IHR5cGVDb25maWcgPSBuYXRpdmVUeXBlc0NvbmZpZ1tuYXRpdmVJdGVtVHlwZV07XG4gICAgICAgIGlmICghKHR5cGVDb25maWcgPT09IG51bGwgfHwgdHlwZUNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdHlwZUNvbmZpZy5tYXRjaGVzVHlwZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGVDb25maWcubWF0Y2hlc1R5cGVzLnNvbWUoKHQpPT5kYXRhVHJhbnNmZXJUeXBlcy5pbmRleE9mKHQpID4gLTFcbiAgICAgICAgKTtcbiAgICB9KVswXSB8fCBudWxsO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgKiBhcyBOYXRpdmVUeXBlcyBmcm9tICcuLi9OYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgeyBnZXREYXRhRnJvbURhdGFUcmFuc2ZlciB9IGZyb20gJy4vZ2V0RGF0YUZyb21EYXRhVHJhbnNmZXIuanMnO1xuZXhwb3J0IGNvbnN0IG5hdGl2ZVR5cGVzQ29uZmlnID0ge1xuICAgIFtOYXRpdmVUeXBlcy5GSUxFXToge1xuICAgICAgICBleHBvc2VQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBmaWxlczogKGRhdGFUcmFuc2Zlcik9PkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRhdGFUcmFuc2Zlci5maWxlcylcbiAgICAgICAgICAgICxcbiAgICAgICAgICAgIGl0ZW1zOiAoZGF0YVRyYW5zZmVyKT0+ZGF0YVRyYW5zZmVyLml0ZW1zXG4gICAgICAgICAgICAsXG4gICAgICAgICAgICBkYXRhVHJhbnNmZXI6IChkYXRhVHJhbnNmZXIpPT5kYXRhVHJhbnNmZXJcbiAgICAgICAgfSxcbiAgICAgICAgbWF0Y2hlc1R5cGVzOiBbXG4gICAgICAgICAgICAnRmlsZXMnXG4gICAgICAgIF1cbiAgICB9LFxuICAgIFtOYXRpdmVUeXBlcy5IVE1MXToge1xuICAgICAgICBleHBvc2VQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBodG1sOiAoZGF0YVRyYW5zZmVyLCBtYXRjaGVzVHlwZXMpPT5nZXREYXRhRnJvbURhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXIsIG1hdGNoZXNUeXBlcywgJycpXG4gICAgICAgICAgICAsXG4gICAgICAgICAgICBkYXRhVHJhbnNmZXI6IChkYXRhVHJhbnNmZXIpPT5kYXRhVHJhbnNmZXJcbiAgICAgICAgfSxcbiAgICAgICAgbWF0Y2hlc1R5cGVzOiBbXG4gICAgICAgICAgICAnSHRtbCcsXG4gICAgICAgICAgICAndGV4dC9odG1sJ1xuICAgICAgICBdXG4gICAgfSxcbiAgICBbTmF0aXZlVHlwZXMuVVJMXToge1xuICAgICAgICBleHBvc2VQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB1cmxzOiAoZGF0YVRyYW5zZmVyLCBtYXRjaGVzVHlwZXMpPT5nZXREYXRhRnJvbURhdGFUcmFuc2ZlcihkYXRhVHJhbnNmZXIsIG1hdGNoZXNUeXBlcywgJycpLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLFxuICAgICAgICAgICAgZGF0YVRyYW5zZmVyOiAoZGF0YVRyYW5zZmVyKT0+ZGF0YVRyYW5zZmVyXG4gICAgICAgIH0sXG4gICAgICAgIG1hdGNoZXNUeXBlczogW1xuICAgICAgICAgICAgJ1VybCcsXG4gICAgICAgICAgICAndGV4dC91cmktbGlzdCdcbiAgICAgICAgXVxuICAgIH0sXG4gICAgW05hdGl2ZVR5cGVzLlRFWFRdOiB7XG4gICAgICAgIGV4cG9zZVByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRleHQ6IChkYXRhVHJhbnNmZXIsIG1hdGNoZXNUeXBlcyk9PmdldERhdGFGcm9tRGF0YVRyYW5zZmVyKGRhdGFUcmFuc2ZlciwgbWF0Y2hlc1R5cGVzLCAnJylcbiAgICAgICAgICAgICxcbiAgICAgICAgICAgIGRhdGFUcmFuc2ZlcjogKGRhdGFUcmFuc2Zlcik9PmRhdGFUcmFuc2ZlclxuICAgICAgICB9LFxuICAgICAgICBtYXRjaGVzVHlwZXM6IFtcbiAgICAgICAgICAgICdUZXh0JyxcbiAgICAgICAgICAgICd0ZXh0L3BsYWluJ1xuICAgICAgICBdXG4gICAgfVxufTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmF0aXZlVHlwZXNDb25maWcuanMubWFwIiwiZXhwb3J0IGNvbnN0IEZJTEUgPSAnX19OQVRJVkVfRklMRV9fJztcbmV4cG9ydCBjb25zdCBVUkwgPSAnX19OQVRJVkVfVVJMX18nO1xuZXhwb3J0IGNvbnN0IFRFWFQgPSAnX19OQVRJVkVfVEVYVF9fJztcbmV4cG9ydCBjb25zdCBIVE1MID0gJ19fTkFUSVZFX0hUTUxfXyc7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5hdGl2ZVR5cGVzLmpzLm1hcCIsImltcG9ydCB7IGlzRmlyZWZveCwgaXNTYWZhcmkgfSBmcm9tICcuL0Jyb3dzZXJEZXRlY3Rvci5qcyc7XG5pbXBvcnQgeyBNb25vdG9uaWNJbnRlcnBvbGFudCB9IGZyb20gJy4vTW9ub3RvbmljSW50ZXJwb2xhbnQuanMnO1xuY29uc3QgRUxFTUVOVF9OT0RFID0gMTtcbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlQ2xpZW50T2Zmc2V0KG5vZGUpIHtcbiAgICBjb25zdCBlbCA9IG5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSA/IG5vZGUgOiBub2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyB0b3AgLCBsZWZ0ICB9ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogbGVmdCxcbiAgICAgICAgeTogdG9wXG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRFdmVudENsaWVudE9mZnNldChlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogZS5jbGllbnRYLFxuICAgICAgICB5OiBlLmNsaWVudFlcbiAgICB9O1xufVxuZnVuY3Rpb24gaXNJbWFnZU5vZGUobm9kZSkge1xuICAgIHZhciByZWY7XG4gICAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09ICdJTUcnICYmIChpc0ZpcmVmb3goKSB8fCAhKChyZWYgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpID09PSBudWxsIHx8IHJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVmLmNvbnRhaW5zKG5vZGUpKSk7XG59XG5mdW5jdGlvbiBnZXREcmFnUHJldmlld1NpemUoaXNJbWFnZSwgZHJhZ1ByZXZpZXcsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQpIHtcbiAgICBsZXQgZHJhZ1ByZXZpZXdXaWR0aCA9IGlzSW1hZ2UgPyBkcmFnUHJldmlldy53aWR0aCA6IHNvdXJjZVdpZHRoO1xuICAgIGxldCBkcmFnUHJldmlld0hlaWdodCA9IGlzSW1hZ2UgPyBkcmFnUHJldmlldy5oZWlnaHQgOiBzb3VyY2VIZWlnaHQ7XG4gICAgLy8gV29yayBhcm91bmQgQDJ4IGNvb3JkaW5hdGUgZGlzY3JlcGFuY2llcyBpbiBicm93c2Vyc1xuICAgIGlmIChpc1NhZmFyaSgpICYmIGlzSW1hZ2UpIHtcbiAgICAgICAgZHJhZ1ByZXZpZXdIZWlnaHQgLz0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIGRyYWdQcmV2aWV3V2lkdGggLz0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGRyYWdQcmV2aWV3V2lkdGgsXG4gICAgICAgIGRyYWdQcmV2aWV3SGVpZ2h0XG4gICAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREcmFnUHJldmlld09mZnNldChzb3VyY2VOb2RlLCBkcmFnUHJldmlldywgY2xpZW50T2Zmc2V0LCBhbmNob3JQb2ludCwgb2Zmc2V0UG9pbnQpIHtcbiAgICAvLyBUaGUgYnJvd3NlcnMgd2lsbCB1c2UgdGhlIGltYWdlIGludHJpbnNpYyBzaXplIHVuZGVyIGRpZmZlcmVudCBjb25kaXRpb25zLlxuICAgIC8vIEZpcmVmb3ggb25seSBjYXJlcyBpZiBpdCdzIGFuIGltYWdlLCBidXQgV2ViS2l0IGFsc28gd2FudHMgaXQgdG8gYmUgZGV0YWNoZWQuXG4gICAgY29uc3QgaXNJbWFnZSA9IGlzSW1hZ2VOb2RlKGRyYWdQcmV2aWV3KTtcbiAgICBjb25zdCBkcmFnUHJldmlld05vZGUgPSBpc0ltYWdlID8gc291cmNlTm9kZSA6IGRyYWdQcmV2aWV3O1xuICAgIGNvbnN0IGRyYWdQcmV2aWV3Tm9kZU9mZnNldEZyb21DbGllbnQgPSBnZXROb2RlQ2xpZW50T2Zmc2V0KGRyYWdQcmV2aWV3Tm9kZSk7XG4gICAgY29uc3Qgb2Zmc2V0RnJvbURyYWdQcmV2aWV3ID0ge1xuICAgICAgICB4OiBjbGllbnRPZmZzZXQueCAtIGRyYWdQcmV2aWV3Tm9kZU9mZnNldEZyb21DbGllbnQueCxcbiAgICAgICAgeTogY2xpZW50T2Zmc2V0LnkgLSBkcmFnUHJldmlld05vZGVPZmZzZXRGcm9tQ2xpZW50LnlcbiAgICB9O1xuICAgIGNvbnN0IHsgb2Zmc2V0V2lkdGg6IHNvdXJjZVdpZHRoICwgb2Zmc2V0SGVpZ2h0OiBzb3VyY2VIZWlnaHQgIH0gPSBzb3VyY2VOb2RlO1xuICAgIGNvbnN0IHsgYW5jaG9yWCAsIGFuY2hvclkgIH0gPSBhbmNob3JQb2ludDtcbiAgICBjb25zdCB7IGRyYWdQcmV2aWV3V2lkdGggLCBkcmFnUHJldmlld0hlaWdodCAgfSA9IGdldERyYWdQcmV2aWV3U2l6ZShpc0ltYWdlLCBkcmFnUHJldmlldywgc291cmNlV2lkdGgsIHNvdXJjZUhlaWdodCk7XG4gICAgY29uc3QgY2FsY3VsYXRlWU9mZnNldCA9ICgpPT57XG4gICAgICAgIGNvbnN0IGludGVycG9sYW50WSA9IG5ldyBNb25vdG9uaWNJbnRlcnBvbGFudChbXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMC41LFxuICAgICAgICAgICAgMVxuICAgICAgICBdLCBbXG4gICAgICAgICAgICAvLyBEb2NrIHRvIHRoZSB0b3BcbiAgICAgICAgICAgIG9mZnNldEZyb21EcmFnUHJldmlldy55LFxuICAgICAgICAgICAgLy8gQWxpZ24gYXQgdGhlIGNlbnRlclxuICAgICAgICAgICAgKG9mZnNldEZyb21EcmFnUHJldmlldy55IC8gc291cmNlSGVpZ2h0KSAqIGRyYWdQcmV2aWV3SGVpZ2h0LFxuICAgICAgICAgICAgLy8gRG9jayB0byB0aGUgYm90dG9tXG4gICAgICAgICAgICBvZmZzZXRGcm9tRHJhZ1ByZXZpZXcueSArIGRyYWdQcmV2aWV3SGVpZ2h0IC0gc291cmNlSGVpZ2h0LCBcbiAgICAgICAgXSk7XG4gICAgICAgIGxldCB5ID0gaW50ZXJwb2xhbnRZLmludGVycG9sYXRlKGFuY2hvclkpO1xuICAgICAgICAvLyBXb3JrIGFyb3VuZCBTYWZhcmkgOCBwb3NpdGlvbmluZyBidWdcbiAgICAgICAgaWYgKGlzU2FmYXJpKCkgJiYgaXNJbWFnZSkge1xuICAgICAgICAgICAgLy8gV2UnbGwgaGF2ZSB0byB3YWl0IGZvciBAM3ggdG8gc2VlIGlmIHRoaXMgaXMgZW50aXJlbHkgY29ycmVjdFxuICAgICAgICAgICAgeSArPSAod2luZG93LmRldmljZVBpeGVsUmF0aW8gLSAxKSAqIGRyYWdQcmV2aWV3SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5O1xuICAgIH07XG4gICAgY29uc3QgY2FsY3VsYXRlWE9mZnNldCA9ICgpPT57XG4gICAgICAgIC8vIEludGVycG9sYXRlIGNvb3JkaW5hdGVzIGRlcGVuZGluZyBvbiBhbmNob3IgcG9pbnRcbiAgICAgICAgLy8gSWYgeW91IGtub3cgYSBzaW1wbGVyIHdheSB0byBkbyB0aGlzLCBsZXQgbWUga25vd1xuICAgICAgICBjb25zdCBpbnRlcnBvbGFudFggPSBuZXcgTW9ub3RvbmljSW50ZXJwb2xhbnQoW1xuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAuNSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgXSwgW1xuICAgICAgICAgICAgLy8gRG9jayB0byB0aGUgbGVmdFxuICAgICAgICAgICAgb2Zmc2V0RnJvbURyYWdQcmV2aWV3LngsXG4gICAgICAgICAgICAvLyBBbGlnbiBhdCB0aGUgY2VudGVyXG4gICAgICAgICAgICAob2Zmc2V0RnJvbURyYWdQcmV2aWV3LnggLyBzb3VyY2VXaWR0aCkgKiBkcmFnUHJldmlld1dpZHRoLFxuICAgICAgICAgICAgLy8gRG9jayB0byB0aGUgcmlnaHRcbiAgICAgICAgICAgIG9mZnNldEZyb21EcmFnUHJldmlldy54ICsgZHJhZ1ByZXZpZXdXaWR0aCAtIHNvdXJjZVdpZHRoLCBcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiBpbnRlcnBvbGFudFguaW50ZXJwb2xhdGUoYW5jaG9yWCk7XG4gICAgfTtcbiAgICAvLyBGb3JjZSBvZmZzZXRzIGlmIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy5cbiAgICBjb25zdCB7IG9mZnNldFggLCBvZmZzZXRZICB9ID0gb2Zmc2V0UG9pbnQ7XG4gICAgY29uc3QgaXNNYW51YWxPZmZzZXRYID0gb2Zmc2V0WCA9PT0gMCB8fCBvZmZzZXRYO1xuICAgIGNvbnN0IGlzTWFudWFsT2Zmc2V0WSA9IG9mZnNldFkgPT09IDAgfHwgb2Zmc2V0WTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBpc01hbnVhbE9mZnNldFggPyBvZmZzZXRYIDogY2FsY3VsYXRlWE9mZnNldCgpLFxuICAgICAgICB5OiBpc01hbnVhbE9mZnNldFkgPyBvZmZzZXRZIDogY2FsY3VsYXRlWU9mZnNldCgpXG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2Zmc2V0VXRpbHMuanMubWFwIiwiZXhwb3J0IGNsYXNzIE9wdGlvbnNSZWFkZXIge1xuICAgIGdldCB3aW5kb3coKSB7XG4gICAgICAgIGlmICh0aGlzLmdsb2JhbENvbnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdsb2JhbENvbnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IGRvY3VtZW50KCkge1xuICAgICAgICB2YXIgcmVmO1xuICAgICAgICBpZiAoKHJlZiA9IHRoaXMuZ2xvYmFsQ29udGV4dCkgPT09IG51bGwgfHwgcmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWYuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdsb2JhbENvbnRleHQuZG9jdW1lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy53aW5kb3cpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICB2YXIgcmVmO1xuICAgICAgICByZXR1cm4gKChyZWYgPSB0aGlzLm9wdGlvbnNBcmdzKSA9PT0gbnVsbCB8fCByZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlZi5yb290RWxlbWVudCkgfHwgdGhpcy53aW5kb3c7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGdsb2JhbENvbnRleHQsIG9wdGlvbnMpe1xuICAgICAgICB0aGlzLm93bmVyRG9jdW1lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmdsb2JhbENvbnRleHQgPSBnbG9iYWxDb250ZXh0O1xuICAgICAgICB0aGlzLm9wdGlvbnNBcmdzID0gb3B0aW9ucztcbiAgICB9XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9wdGlvbnNSZWFkZXIuanMubWFwIiwibGV0IGVtcHR5SW1hZ2U7XG5leHBvcnQgZnVuY3Rpb24gZ2V0RW1wdHlJbWFnZSgpIHtcbiAgICBpZiAoIWVtcHR5SW1hZ2UpIHtcbiAgICAgICAgZW1wdHlJbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBlbXB0eUltYWdlLnNyYyA9ICdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFBQUFDSDVCQUVLQUFFQUxBQUFBQUFCQUFFQUFBSUNUQUVBT3c9PSc7XG4gICAgfVxuICAgIHJldHVybiBlbXB0eUltYWdlO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRFbXB0eUltYWdlLmpzLm1hcCIsImltcG9ydCB7IEhUTUw1QmFja2VuZEltcGwgfSBmcm9tICcuL0hUTUw1QmFja2VuZEltcGwuanMnO1xuaW1wb3J0ICogYXMgX05hdGl2ZVR5cGVzIGZyb20gJy4vTmF0aXZlVHlwZXMuanMnO1xuZXhwb3J0IHsgZ2V0RW1wdHlJbWFnZSB9IGZyb20gJy4vZ2V0RW1wdHlJbWFnZS5qcyc7XG5leHBvcnQgeyBfTmF0aXZlVHlwZXMgYXMgTmF0aXZlVHlwZXMgfTtcbmV4cG9ydCBjb25zdCBIVE1MNUJhY2tlbmQgPSBmdW5jdGlvbiBjcmVhdGVCYWNrZW5kKG1hbmFnZXIsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEhUTUw1QmFja2VuZEltcGwobWFuYWdlciwgY29udGV4dCwgb3B0aW9ucyk7XG59O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyBjaGVhcCBsb2Rhc2ggcmVwbGFjZW1lbnRzXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZShmbikge1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGNvbnN0IG1lbW9pemVkID0gKCk9PntcbiAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmbigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICByZXR1cm4gbWVtb2l6ZWQ7XG59XG4vKipcbiAqIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIF8ud2l0aG91dFxuICovIGV4cG9ydCBmdW5jdGlvbiB3aXRob3V0KGl0ZW1zLCBpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaSk9PmkgIT09IGl0ZW1cbiAgICApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uKGl0ZW1zQSwgaXRlbXNCKSB7XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGluc2VydEl0ZW0gPSAoaXRlbSk9PnNldC5hZGQoaXRlbSlcbiAgICA7XG4gICAgaXRlbXNBLmZvckVhY2goaW5zZXJ0SXRlbSk7XG4gICAgaXRlbXNCLmZvckVhY2goaW5zZXJ0SXRlbSk7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgc2V0LmZvckVhY2goKGtleSk9PnJlc3VsdC5wdXNoKGtleSlcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWpzX3V0aWxzLmpzLm1hcCIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIENyZWF0ZSB0aGUgUmVhY3QgQ29udGV4dFxuICovIGV4cG9ydCBjb25zdCBEbmRDb250ZXh0ID0gY3JlYXRlQ29udGV4dCh7XG4gICAgZHJhZ0Ryb3BNYW5hZ2VyOiB1bmRlZmluZWRcbn0pO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EbmRDb250ZXh0LmpzLm1hcCIsImZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gICAgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpO1xuICAgIHZhciBrZXksIGk7XG4gICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICAgICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTtcbiAgICAgICAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICAgIHZhciB0YXJnZXQgPSB7fTtcbiAgICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgdmFyIGtleSwgaTtcbiAgICBmb3IoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBjcmVhdGVEcmFnRHJvcE1hbmFnZXIgfSBmcm9tICdkbmQtY29yZSc7XG5pbXBvcnQgeyBtZW1vLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBEbmRDb250ZXh0IH0gZnJvbSAnLi9EbmRDb250ZXh0LmpzJztcbmxldCByZWZDb3VudCA9IDA7XG5jb25zdCBJTlNUQU5DRV9TWU0gPSBTeW1ib2wuZm9yKCdfX1JFQUNUX0RORF9DT05URVhUX0lOU1RBTkNFX18nKTtcbnZhciBEbmRQcm92aWRlciA9IC8qI19fUFVSRV9fKi8gbWVtbyhmdW5jdGlvbiBEbmRQcm92aWRlcihfcGFyYW0pIHtcbiAgICB2YXIgeyBjaGlsZHJlbiAgfSA9IF9wYXJhbSwgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3BhcmFtLCBbXG4gICAgICAgIFwiY2hpbGRyZW5cIlxuICAgIF0pO1xuICAgIGNvbnN0IFttYW5hZ2VyLCBpc0dsb2JhbEluc3RhbmNlXSA9IGdldERuZENvbnRleHRWYWx1ZShwcm9wcykgLy8gbWVtb2l6ZWQgZnJvbSBwcm9wc1xuICAgIDtcbiAgICAvKipcblx0XHQgKiBJZiB0aGUgZ2xvYmFsIGNvbnRleHQgd2FzIHVzZWQgdG8gc3RvcmUgdGhlIERORCBjb250ZXh0XG5cdFx0ICogdGhlbiB3aGVyZSB0aGVyZXMgbm8gbW9yZSByZWZlcmVuY2VzIHRvIGl0IHdlIHNob3VsZFxuXHRcdCAqIGNsZWFuIGl0IHVwIHRvIGF2b2lkIG1lbW9yeSBsZWFrc1xuXHRcdCAqLyB1c2VFZmZlY3QoKCk9PntcbiAgICAgICAgaWYgKGlzR2xvYmFsSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRHbG9iYWxDb250ZXh0KCk7XG4gICAgICAgICAgICArK3JlZkNvdW50O1xuICAgICAgICAgICAgcmV0dXJuICgpPT57XG4gICAgICAgICAgICAgICAgaWYgKC0tcmVmQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFtJTlNUQU5DRV9TWU1dID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi8gX2pzeChEbmRDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgIHZhbHVlOiBtYW5hZ2VyLFxuICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICB9KTtcbn0pO1xuLyoqXG4gKiBBIFJlYWN0IGNvbXBvbmVudCB0aGF0IHByb3ZpZGVzIHRoZSBSZWFjdC1EbkQgY29udGV4dFxuICovIGV4cG9ydCB7IERuZFByb3ZpZGVyLCAgfTtcbmZ1bmN0aW9uIGdldERuZENvbnRleHRWYWx1ZShwcm9wcykge1xuICAgIGlmICgnbWFuYWdlcicgaW4gcHJvcHMpIHtcbiAgICAgICAgY29uc3QgbWFuYWdlciA9IHtcbiAgICAgICAgICAgIGRyYWdEcm9wTWFuYWdlcjogcHJvcHMubWFuYWdlclxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbWFuYWdlcixcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IG1hbmFnZXIgPSBjcmVhdGVTaW5nbGV0b25EbmRDb250ZXh0KHByb3BzLmJhY2tlbmQsIHByb3BzLmNvbnRleHQsIHByb3BzLm9wdGlvbnMsIHByb3BzLmRlYnVnTW9kZSk7XG4gICAgY29uc3QgaXNHbG9iYWxJbnN0YW5jZSA9ICFwcm9wcy5jb250ZXh0O1xuICAgIHJldHVybiBbXG4gICAgICAgIG1hbmFnZXIsXG4gICAgICAgIGlzR2xvYmFsSW5zdGFuY2VcbiAgICBdO1xufVxuZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uRG5kQ29udGV4dChiYWNrZW5kLCBjb250ZXh0ID0gZ2V0R2xvYmFsQ29udGV4dCgpLCBvcHRpb25zLCBkZWJ1Z01vZGUpIHtcbiAgICBjb25zdCBjdHggPSBjb250ZXh0O1xuICAgIGlmICghY3R4W0lOU1RBTkNFX1NZTV0pIHtcbiAgICAgICAgY3R4W0lOU1RBTkNFX1NZTV0gPSB7XG4gICAgICAgICAgICBkcmFnRHJvcE1hbmFnZXI6IGNyZWF0ZURyYWdEcm9wTWFuYWdlcihiYWNrZW5kLCBjb250ZXh0LCBvcHRpb25zLCBkZWJ1Z01vZGUpXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjdHhbSU5TVEFOQ0VfU1lNXTtcbn1cbmZ1bmN0aW9uIGdldEdsb2JhbENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93O1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1EbmRQcm92aWRlci5qcy5tYXAiLCJpbXBvcnQgeyBjcmVhdGVFbGVtZW50LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgSTE4bkNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIEkxOG5leHRQcm92aWRlcih7XG4gIGkxOG4sXG4gIGRlZmF1bHROUyxcbiAgY2hpbGRyZW5cbn0pIHtcbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKCgpID0+ICh7XG4gICAgaTE4bixcbiAgICBkZWZhdWx0TlNcbiAgfSksIFtpMThuLCBkZWZhdWx0TlNdKTtcbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoSTE4bkNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZVxuICB9LCBjaGlsZHJlbik7XG59IiwiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IG5vZGVzVG9TdHJpbmcsIFRyYW5zIGFzIFRyYW5zV2l0aG91dENvbnRleHQgfSBmcm9tICcuL1RyYW5zV2l0aG91dENvbnRleHQuanMnO1xuaW1wb3J0IHsgZ2V0STE4biwgSTE4bkNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQuanMnO1xuZXhwb3J0IHsgbm9kZXNUb1N0cmluZyB9O1xuZXhwb3J0IGZ1bmN0aW9uIFRyYW5zKHtcbiAgY2hpbGRyZW4sXG4gIGNvdW50LFxuICBwYXJlbnQsXG4gIGkxOG5LZXksXG4gIGNvbnRleHQsXG4gIHRPcHRpb25zID0ge30sXG4gIHZhbHVlcyxcbiAgZGVmYXVsdHMsXG4gIGNvbXBvbmVudHMsXG4gIG5zLFxuICBpMThuOiBpMThuRnJvbVByb3BzLFxuICB0OiB0RnJvbVByb3BzLFxuICBzaG91bGRVbmVzY2FwZSxcbiAgLi4uYWRkaXRpb25hbFByb3BzXG59KSB7XG4gIGNvbnN0IHtcbiAgICBpMThuOiBpMThuRnJvbUNvbnRleHQsXG4gICAgZGVmYXVsdE5TOiBkZWZhdWx0TlNGcm9tQ29udGV4dFxuICB9ID0gdXNlQ29udGV4dChJMThuQ29udGV4dCkgfHwge307XG4gIGNvbnN0IGkxOG4gPSBpMThuRnJvbVByb3BzIHx8IGkxOG5Gcm9tQ29udGV4dCB8fCBnZXRJMThuKCk7XG4gIGNvbnN0IHQgPSB0RnJvbVByb3BzIHx8IGkxOG4/LnQuYmluZChpMThuKTtcbiAgcmV0dXJuIFRyYW5zV2l0aG91dENvbnRleHQoe1xuICAgIGNoaWxkcmVuLFxuICAgIGNvdW50LFxuICAgIHBhcmVudCxcbiAgICBpMThuS2V5LFxuICAgIGNvbnRleHQsXG4gICAgdE9wdGlvbnMsXG4gICAgdmFsdWVzLFxuICAgIGRlZmF1bHRzLFxuICAgIGNvbXBvbmVudHMsXG4gICAgbnM6IG5zIHx8IHQ/Lm5zIHx8IGRlZmF1bHROU0Zyb21Db250ZXh0IHx8IGkxOG4/Lm9wdGlvbnM/LmRlZmF1bHROUyxcbiAgICBpMThuLFxuICAgIHQ6IHRGcm9tUHJvcHMsXG4gICAgc2hvdWxkVW5lc2NhcGUsXG4gICAgLi4uYWRkaXRpb25hbFByb3BzXG4gIH0pO1xufSIsImltcG9ydCB7IEZyYWdtZW50LCBpc1ZhbGlkRWxlbWVudCwgY2xvbmVFbGVtZW50LCBjcmVhdGVFbGVtZW50LCBDaGlsZHJlbiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBIVE1MIGZyb20gJ2h0bWwtcGFyc2Utc3RyaW5naWZ5JztcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgd2Fybiwgd2Fybk9uY2UgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IGdldERlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy5qcyc7XG5pbXBvcnQgeyBnZXRJMThuIH0gZnJvbSAnLi9pMThuSW5zdGFuY2UuanMnO1xuY29uc3QgaGFzQ2hpbGRyZW4gPSAobm9kZSwgY2hlY2tMZW5ndGgpID0+IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGJhc2UgPSBub2RlLnByb3BzPy5jaGlsZHJlbiA/PyBub2RlLmNoaWxkcmVuO1xuICBpZiAoY2hlY2tMZW5ndGgpIHJldHVybiBiYXNlLmxlbmd0aCA+IDA7XG4gIHJldHVybiAhIWJhc2U7XG59O1xuY29uc3QgZ2V0Q2hpbGRyZW4gPSBub2RlID0+IHtcbiAgaWYgKCFub2RlKSByZXR1cm4gW107XG4gIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5wcm9wcz8uY2hpbGRyZW4gPz8gbm9kZS5jaGlsZHJlbjtcbiAgcmV0dXJuIG5vZGUucHJvcHM/LmkxOG5Jc0R5bmFtaWNMaXN0ID8gZ2V0QXNBcnJheShjaGlsZHJlbikgOiBjaGlsZHJlbjtcbn07XG5jb25zdCBoYXNWYWxpZFJlYWN0Q2hpbGRyZW4gPSBjaGlsZHJlbiA9PiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJiBjaGlsZHJlbi5ldmVyeShpc1ZhbGlkRWxlbWVudCk7XG5jb25zdCBnZXRBc0FycmF5ID0gZGF0YSA9PiBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXTtcbmNvbnN0IG1lcmdlUHJvcHMgPSAoc291cmNlLCB0YXJnZXQpID0+IHtcbiAgY29uc3QgbmV3VGFyZ2V0ID0ge1xuICAgIC4uLnRhcmdldFxuICB9O1xuICBuZXdUYXJnZXQucHJvcHMgPSBPYmplY3QuYXNzaWduKHNvdXJjZS5wcm9wcywgdGFyZ2V0LnByb3BzKTtcbiAgcmV0dXJuIG5ld1RhcmdldDtcbn07XG5leHBvcnQgY29uc3Qgbm9kZXNUb1N0cmluZyA9IChjaGlsZHJlbiwgaTE4bk9wdGlvbnMpID0+IHtcbiAgaWYgKCFjaGlsZHJlbikgcmV0dXJuICcnO1xuICBsZXQgc3RyaW5nTm9kZSA9ICcnO1xuICBjb25zdCBjaGlsZHJlbkFycmF5ID0gZ2V0QXNBcnJheShjaGlsZHJlbik7XG4gIGNvbnN0IGtlZXBBcnJheSA9IGkxOG5PcHRpb25zPy50cmFuc1N1cHBvcnRCYXNpY0h0bWxOb2RlcyA/IGkxOG5PcHRpb25zLnRyYW5zS2VlcEJhc2ljSHRtbE5vZGVzRm9yID8/IFtdIDogW107XG4gIGNoaWxkcmVuQXJyYXkuZm9yRWFjaCgoY2hpbGQsIGNoaWxkSW5kZXgpID0+IHtcbiAgICBpZiAoaXNTdHJpbmcoY2hpbGQpKSB7XG4gICAgICBzdHJpbmdOb2RlICs9IGAke2NoaWxkfWA7XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIHR5cGVcbiAgICAgIH0gPSBjaGlsZDtcbiAgICAgIGNvbnN0IGNoaWxkUHJvcHNDb3VudCA9IE9iamVjdC5rZXlzKHByb3BzKS5sZW5ndGg7XG4gICAgICBjb25zdCBzaG91bGRLZWVwQ2hpbGQgPSBrZWVwQXJyYXkuaW5kZXhPZih0eXBlKSA+IC0xO1xuICAgICAgY29uc3QgY2hpbGRDaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKCFjaGlsZENoaWxkcmVuICYmIHNob3VsZEtlZXBDaGlsZCAmJiAhY2hpbGRQcm9wc0NvdW50KSB7XG4gICAgICAgIHN0cmluZ05vZGUgKz0gYDwke3R5cGV9Lz5gO1xuICAgICAgfSBlbHNlIGlmICghY2hpbGRDaGlsZHJlbiAmJiAoIXNob3VsZEtlZXBDaGlsZCB8fCBjaGlsZFByb3BzQ291bnQpIHx8IHByb3BzLmkxOG5Jc0R5bmFtaWNMaXN0KSB7XG4gICAgICAgIHN0cmluZ05vZGUgKz0gYDwke2NoaWxkSW5kZXh9PjwvJHtjaGlsZEluZGV4fT5gO1xuICAgICAgfSBlbHNlIGlmIChzaG91bGRLZWVwQ2hpbGQgJiYgY2hpbGRQcm9wc0NvdW50ID09PSAxICYmIGlzU3RyaW5nKGNoaWxkQ2hpbGRyZW4pKSB7XG4gICAgICAgIHN0cmluZ05vZGUgKz0gYDwke3R5cGV9PiR7Y2hpbGRDaGlsZHJlbn08LyR7dHlwZX0+YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBub2Rlc1RvU3RyaW5nKGNoaWxkQ2hpbGRyZW4sIGkxOG5PcHRpb25zKTtcbiAgICAgICAgc3RyaW5nTm9kZSArPSBgPCR7Y2hpbGRJbmRleH0+JHtjb250ZW50fTwvJHtjaGlsZEluZGV4fT5gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hpbGQgPT09IG51bGwpIHtcbiAgICAgIHdhcm4oYFRyYW5zOiB0aGUgcGFzc2VkIGluIHZhbHVlIGlzIGludmFsaWQgLSBzZWVtcyB5b3UgcGFzc2VkIGluIGEgbnVsbCBjaGlsZC5gKTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGNoaWxkKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmb3JtYXQsXG4gICAgICAgIC4uLmNsb25lXG4gICAgICB9ID0gY2hpbGQ7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY2xvbmUpO1xuICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybWF0ID8gYCR7a2V5c1swXX0sICR7Zm9ybWF0fWAgOiBrZXlzWzBdO1xuICAgICAgICBzdHJpbmdOb2RlICs9IGB7eyR7dmFsdWV9fX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybihgcmVhY3QtaTE4bmV4dDogdGhlIHBhc3NlZCBpbiBvYmplY3QgY29udGFpbmVkIG1vcmUgdGhhbiBvbmUgdmFyaWFibGUgLSB0aGUgb2JqZWN0IHNob3VsZCBsb29rIGxpa2Uge3sgdmFsdWUsIGZvcm1hdCB9fSB3aGVyZSBmb3JtYXQgaXMgb3B0aW9uYWwuYCwgY2hpbGQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuKGBUcmFuczogdGhlIHBhc3NlZCBpbiB2YWx1ZSBpcyBpbnZhbGlkIC0gc2VlbXMgeW91IHBhc3NlZCBpbiBhIHZhcmlhYmxlIGxpa2Uge251bWJlcn0gLSBwbGVhc2UgcGFzcyBpbiB2YXJpYWJsZXMgZm9yIGludGVycG9sYXRpb24gYXMgZnVsbCBvYmplY3RzIGxpa2Uge3tudW1iZXJ9fS5gLCBjaGlsZCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHN0cmluZ05vZGU7XG59O1xuY29uc3QgcmVuZGVyTm9kZXMgPSAoY2hpbGRyZW4sIHRhcmdldFN0cmluZywgaTE4biwgaTE4bk9wdGlvbnMsIGNvbWJpbmVkVE9wdHMsIHNob3VsZFVuZXNjYXBlKSA9PiB7XG4gIGlmICh0YXJnZXRTdHJpbmcgPT09ICcnKSByZXR1cm4gW107XG4gIGNvbnN0IGtlZXBBcnJheSA9IGkxOG5PcHRpb25zLnRyYW5zS2VlcEJhc2ljSHRtbE5vZGVzRm9yIHx8IFtdO1xuICBjb25zdCBlbXB0eUNoaWxkcmVuQnV0TmVlZHNIYW5kbGluZyA9IHRhcmdldFN0cmluZyAmJiBuZXcgUmVnRXhwKGtlZXBBcnJheS5tYXAoa2VlcCA9PiBgPCR7a2VlcH1gKS5qb2luKCd8JykpLnRlc3QodGFyZ2V0U3RyaW5nKTtcbiAgaWYgKCFjaGlsZHJlbiAmJiAhZW1wdHlDaGlsZHJlbkJ1dE5lZWRzSGFuZGxpbmcgJiYgIXNob3VsZFVuZXNjYXBlKSByZXR1cm4gW3RhcmdldFN0cmluZ107XG4gIGNvbnN0IGRhdGEgPSB7fTtcbiAgY29uc3QgZ2V0RGF0YSA9IGNoaWxkcyA9PiB7XG4gICAgY29uc3QgY2hpbGRyZW5BcnJheSA9IGdldEFzQXJyYXkoY2hpbGRzKTtcbiAgICBjaGlsZHJlbkFycmF5LmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgaWYgKGlzU3RyaW5nKGNoaWxkKSkgcmV0dXJuO1xuICAgICAgaWYgKGhhc0NoaWxkcmVuKGNoaWxkKSkgZ2V0RGF0YShnZXRDaGlsZHJlbihjaGlsZCkpO2Vsc2UgaWYgKGlzT2JqZWN0KGNoaWxkKSAmJiAhaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSBPYmplY3QuYXNzaWduKGRhdGEsIGNoaWxkKTtcbiAgICB9KTtcbiAgfTtcbiAgZ2V0RGF0YShjaGlsZHJlbik7XG4gIGNvbnN0IGFzdCA9IEhUTUwucGFyc2UoYDwwPiR7dGFyZ2V0U3RyaW5nfTwvMD5gKTtcbiAgY29uc3Qgb3B0cyA9IHtcbiAgICAuLi5kYXRhLFxuICAgIC4uLmNvbWJpbmVkVE9wdHNcbiAgfTtcbiAgY29uc3QgcmVuZGVySW5uZXIgPSAoY2hpbGQsIG5vZGUsIHJvb3RSZWFjdE5vZGUpID0+IHtcbiAgICBjb25zdCBjaGlsZHMgPSBnZXRDaGlsZHJlbihjaGlsZCk7XG4gICAgY29uc3QgbWFwcGVkQ2hpbGRyZW4gPSBtYXBBU1QoY2hpbGRzLCBub2RlLmNoaWxkcmVuLCByb290UmVhY3ROb2RlKTtcbiAgICByZXR1cm4gaGFzVmFsaWRSZWFjdENoaWxkcmVuKGNoaWxkcykgJiYgbWFwcGVkQ2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8IGNoaWxkLnByb3BzPy5pMThuSXNEeW5hbWljTGlzdCA/IGNoaWxkcyA6IG1hcHBlZENoaWxkcmVuO1xuICB9O1xuICBjb25zdCBwdXNoVHJhbnNsYXRlZEpTWCA9IChjaGlsZCwgaW5uZXIsIG1lbSwgaSwgaXNWb2lkKSA9PiB7XG4gICAgaWYgKGNoaWxkLmR1bW15KSB7XG4gICAgICBjaGlsZC5jaGlsZHJlbiA9IGlubmVyO1xuICAgICAgbWVtLnB1c2goY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgICAgIGtleTogaVxuICAgICAgfSwgaXNWb2lkID8gdW5kZWZpbmVkIDogaW5uZXIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVtLnB1c2goLi4uQ2hpbGRyZW4ubWFwKFtjaGlsZF0sIGMgPT4ge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgICAuLi5jLnByb3BzXG4gICAgICAgIH07XG4gICAgICAgIGRlbGV0ZSBwcm9wcy5pMThuSXNEeW5hbWljTGlzdDtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoYy50eXBlLCB7XG4gICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgICAga2V5OiBpLFxuICAgICAgICAgIHJlZjogYy5yZWZcbiAgICAgICAgfSwgaXNWb2lkID8gbnVsbCA6IGlubmVyKTtcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1hcEFTVCA9IChyZWFjdE5vZGUsIGFzdE5vZGUsIHJvb3RSZWFjdE5vZGUpID0+IHtcbiAgICBjb25zdCByZWFjdE5vZGVzID0gZ2V0QXNBcnJheShyZWFjdE5vZGUpO1xuICAgIGNvbnN0IGFzdE5vZGVzID0gZ2V0QXNBcnJheShhc3ROb2RlKTtcbiAgICByZXR1cm4gYXN0Tm9kZXMucmVkdWNlKChtZW0sIG5vZGUsIGkpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uQ29udGVudCA9IG5vZGUuY2hpbGRyZW4/LlswXT8uY29udGVudCAmJiBpMThuLnNlcnZpY2VzLmludGVycG9sYXRvci5pbnRlcnBvbGF0ZShub2RlLmNoaWxkcmVuWzBdLmNvbnRlbnQsIG9wdHMsIGkxOG4ubGFuZ3VhZ2UpO1xuICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ3RhZycpIHtcbiAgICAgICAgbGV0IHRtcCA9IHJlYWN0Tm9kZXNbcGFyc2VJbnQobm9kZS5uYW1lLCAxMCldO1xuICAgICAgICBpZiAocm9vdFJlYWN0Tm9kZS5sZW5ndGggPT09IDEgJiYgIXRtcCkgdG1wID0gcm9vdFJlYWN0Tm9kZVswXVtub2RlLm5hbWVdO1xuICAgICAgICBpZiAoIXRtcCkgdG1wID0ge307XG4gICAgICAgIGNvbnN0IGNoaWxkID0gT2JqZWN0LmtleXMobm9kZS5hdHRycykubGVuZ3RoICE9PSAwID8gbWVyZ2VQcm9wcyh7XG4gICAgICAgICAgcHJvcHM6IG5vZGUuYXR0cnNcbiAgICAgICAgfSwgdG1wKSA6IHRtcDtcbiAgICAgICAgY29uc3QgaXNFbGVtZW50ID0gaXNWYWxpZEVsZW1lbnQoY2hpbGQpO1xuICAgICAgICBjb25zdCBpc1ZhbGlkVHJhbnNsYXRpb25XaXRoQ2hpbGRyZW4gPSBpc0VsZW1lbnQgJiYgaGFzQ2hpbGRyZW4obm9kZSwgdHJ1ZSkgJiYgIW5vZGUudm9pZEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGlzRW1wdHlUcmFuc1dpdGhIVE1MID0gZW1wdHlDaGlsZHJlbkJ1dE5lZWRzSGFuZGxpbmcgJiYgaXNPYmplY3QoY2hpbGQpICYmIGNoaWxkLmR1bW15ICYmICFpc0VsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGlzS25vd25Db21wb25lbnQgPSBpc09iamVjdChjaGlsZHJlbikgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoY2hpbGRyZW4sIG5vZGUubmFtZSk7XG4gICAgICAgIGlmIChpc1N0cmluZyhjaGlsZCkpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGkxOG4uc2VydmljZXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKGNoaWxkLCBvcHRzLCBpMThuLmxhbmd1YWdlKTtcbiAgICAgICAgICBtZW0ucHVzaCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ2hpbGRyZW4oY2hpbGQpIHx8IGlzVmFsaWRUcmFuc2xhdGlvbldpdGhDaGlsZHJlbikge1xuICAgICAgICAgIGNvbnN0IGlubmVyID0gcmVuZGVySW5uZXIoY2hpbGQsIG5vZGUsIHJvb3RSZWFjdE5vZGUpO1xuICAgICAgICAgIHB1c2hUcmFuc2xhdGVkSlNYKGNoaWxkLCBpbm5lciwgbWVtLCBpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0VtcHR5VHJhbnNXaXRoSFRNTCkge1xuICAgICAgICAgIGNvbnN0IGlubmVyID0gbWFwQVNUKHJlYWN0Tm9kZXMsIG5vZGUuY2hpbGRyZW4sIHJvb3RSZWFjdE5vZGUpO1xuICAgICAgICAgIHB1c2hUcmFuc2xhdGVkSlNYKGNoaWxkLCBpbm5lciwgbWVtLCBpKTtcbiAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VGbG9hdChub2RlLm5hbWUpKSkge1xuICAgICAgICAgIGlmIChpc0tub3duQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbm5lciA9IHJlbmRlcklubmVyKGNoaWxkLCBub2RlLCByb290UmVhY3ROb2RlKTtcbiAgICAgICAgICAgIHB1c2hUcmFuc2xhdGVkSlNYKGNoaWxkLCBpbm5lciwgbWVtLCBpLCBub2RlLnZvaWRFbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkxOG5PcHRpb25zLnRyYW5zU3VwcG9ydEJhc2ljSHRtbE5vZGVzICYmIGtlZXBBcnJheS5pbmRleE9mKG5vZGUubmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgaWYgKG5vZGUudm9pZEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgbWVtLnB1c2goY3JlYXRlRWxlbWVudChub2RlLm5hbWUsIHtcbiAgICAgICAgICAgICAgICBrZXk6IGAke25vZGUubmFtZX0tJHtpfWBcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5uZXIgPSBtYXBBU1QocmVhY3ROb2Rlcywgbm9kZS5jaGlsZHJlbiwgcm9vdFJlYWN0Tm9kZSk7XG4gICAgICAgICAgICAgIG1lbS5wdXNoKGNyZWF0ZUVsZW1lbnQobm9kZS5uYW1lLCB7XG4gICAgICAgICAgICAgICAga2V5OiBgJHtub2RlLm5hbWV9LSR7aX1gXG4gICAgICAgICAgICAgIH0sIGlubmVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChub2RlLnZvaWRFbGVtZW50KSB7XG4gICAgICAgICAgICBtZW0ucHVzaChgPCR7bm9kZS5uYW1lfSAvPmApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbm5lciA9IG1hcEFTVChyZWFjdE5vZGVzLCBub2RlLmNoaWxkcmVuLCByb290UmVhY3ROb2RlKTtcbiAgICAgICAgICAgIG1lbS5wdXNoKGA8JHtub2RlLm5hbWV9PiR7aW5uZXJ9PC8ke25vZGUubmFtZX0+YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGNoaWxkKSAmJiAhaXNFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IG5vZGUuY2hpbGRyZW5bMF0gPyB0cmFuc2xhdGlvbkNvbnRlbnQgOiBudWxsO1xuICAgICAgICAgIGlmIChjb250ZW50KSBtZW0ucHVzaChjb250ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwdXNoVHJhbnNsYXRlZEpTWChjaGlsZCwgdHJhbnNsYXRpb25Db250ZW50LCBtZW0sIGksIG5vZGUuY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8ICF0cmFuc2xhdGlvbkNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIGNvbnN0IHdyYXBUZXh0Tm9kZXMgPSBpMThuT3B0aW9ucy50cmFuc1dyYXBUZXh0Tm9kZXM7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzaG91bGRVbmVzY2FwZSA/IGkxOG5PcHRpb25zLnVuZXNjYXBlKGkxOG4uc2VydmljZXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKG5vZGUuY29udGVudCwgb3B0cywgaTE4bi5sYW5ndWFnZSkpIDogaTE4bi5zZXJ2aWNlcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUobm9kZS5jb250ZW50LCBvcHRzLCBpMThuLmxhbmd1YWdlKTtcbiAgICAgICAgaWYgKHdyYXBUZXh0Tm9kZXMpIHtcbiAgICAgICAgICBtZW0ucHVzaChjcmVhdGVFbGVtZW50KHdyYXBUZXh0Tm9kZXMsIHtcbiAgICAgICAgICAgIGtleTogYCR7bm9kZS5uYW1lfS0ke2l9YFxuICAgICAgICAgIH0sIGNvbnRlbnQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZW0ucHVzaChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1lbTtcbiAgICB9LCBbXSk7XG4gIH07XG4gIGNvbnN0IHJlc3VsdCA9IG1hcEFTVChbe1xuICAgIGR1bW15OiB0cnVlLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbiB8fCBbXVxuICB9XSwgYXN0LCBnZXRBc0FycmF5KGNoaWxkcmVuIHx8IFtdKSk7XG4gIHJldHVybiBnZXRDaGlsZHJlbihyZXN1bHRbMF0pO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBUcmFucyh7XG4gIGNoaWxkcmVuLFxuICBjb3VudCxcbiAgcGFyZW50LFxuICBpMThuS2V5LFxuICBjb250ZXh0LFxuICB0T3B0aW9ucyA9IHt9LFxuICB2YWx1ZXMsXG4gIGRlZmF1bHRzLFxuICBjb21wb25lbnRzLFxuICBucyxcbiAgaTE4bjogaTE4bkZyb21Qcm9wcyxcbiAgdDogdEZyb21Qcm9wcyxcbiAgc2hvdWxkVW5lc2NhcGUsXG4gIC4uLmFkZGl0aW9uYWxQcm9wc1xufSkge1xuICBjb25zdCBpMThuID0gaTE4bkZyb21Qcm9wcyB8fCBnZXRJMThuKCk7XG4gIGlmICghaTE4bikge1xuICAgIHdhcm5PbmNlKCdZb3Ugd2lsbCBuZWVkIHRvIHBhc3MgaW4gYW4gaTE4bmV4dCBpbnN0YW5jZSBieSB1c2luZyBpMThuZXh0UmVhY3RNb2R1bGUnKTtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cbiAgY29uc3QgdCA9IHRGcm9tUHJvcHMgfHwgaTE4bi50LmJpbmQoaTE4bikgfHwgKGsgPT4gayk7XG4gIGNvbnN0IHJlYWN0STE4bmV4dE9wdGlvbnMgPSB7XG4gICAgLi4uZ2V0RGVmYXVsdHMoKSxcbiAgICAuLi5pMThuLm9wdGlvbnM/LnJlYWN0XG4gIH07XG4gIGxldCBuYW1lc3BhY2VzID0gbnMgfHwgdC5ucyB8fCBpMThuLm9wdGlvbnM/LmRlZmF1bHROUztcbiAgbmFtZXNwYWNlcyA9IGlzU3RyaW5nKG5hbWVzcGFjZXMpID8gW25hbWVzcGFjZXNdIDogbmFtZXNwYWNlcyB8fCBbJ3RyYW5zbGF0aW9uJ107XG4gIGNvbnN0IG5vZGVBc1N0cmluZyA9IG5vZGVzVG9TdHJpbmcoY2hpbGRyZW4sIHJlYWN0STE4bmV4dE9wdGlvbnMpO1xuICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0cyB8fCBub2RlQXNTdHJpbmcgfHwgcmVhY3RJMThuZXh0T3B0aW9ucy50cmFuc0VtcHR5Tm9kZVZhbHVlIHx8IGkxOG5LZXk7XG4gIGNvbnN0IHtcbiAgICBoYXNoVHJhbnNLZXlcbiAgfSA9IHJlYWN0STE4bmV4dE9wdGlvbnM7XG4gIGNvbnN0IGtleSA9IGkxOG5LZXkgfHwgKGhhc2hUcmFuc0tleSA/IGhhc2hUcmFuc0tleShub2RlQXNTdHJpbmcgfHwgZGVmYXVsdFZhbHVlKSA6IG5vZGVBc1N0cmluZyB8fCBkZWZhdWx0VmFsdWUpO1xuICBpZiAoaTE4bi5vcHRpb25zPy5pbnRlcnBvbGF0aW9uPy5kZWZhdWx0VmFyaWFibGVzKSB7XG4gICAgdmFsdWVzID0gdmFsdWVzICYmIE9iamVjdC5rZXlzKHZhbHVlcykubGVuZ3RoID4gMCA/IHtcbiAgICAgIC4uLnZhbHVlcyxcbiAgICAgIC4uLmkxOG4ub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXNcbiAgICB9IDoge1xuICAgICAgLi4uaTE4bi5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlc1xuICAgIH07XG4gIH1cbiAgY29uc3QgaW50ZXJwb2xhdGlvbk92ZXJyaWRlID0gdmFsdWVzIHx8IGNvdW50ICE9PSB1bmRlZmluZWQgfHwgIWNoaWxkcmVuID8gdE9wdGlvbnMuaW50ZXJwb2xhdGlvbiA6IHtcbiAgICBpbnRlcnBvbGF0aW9uOiB7XG4gICAgICAuLi50T3B0aW9ucy5pbnRlcnBvbGF0aW9uLFxuICAgICAgcHJlZml4OiAnIyQ/JyxcbiAgICAgIHN1ZmZpeDogJz8kIydcbiAgICB9XG4gIH07XG4gIGNvbnN0IGNvbWJpbmVkVE9wdHMgPSB7XG4gICAgLi4udE9wdGlvbnMsXG4gICAgY29udGV4dDogY29udGV4dCB8fCB0T3B0aW9ucy5jb250ZXh0LFxuICAgIGNvdW50LFxuICAgIC4uLnZhbHVlcyxcbiAgICAuLi5pbnRlcnBvbGF0aW9uT3ZlcnJpZGUsXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIG5zOiBuYW1lc3BhY2VzXG4gIH07XG4gIGNvbnN0IHRyYW5zbGF0aW9uID0ga2V5ID8gdChrZXksIGNvbWJpbmVkVE9wdHMpIDogZGVmYXVsdFZhbHVlO1xuICBpZiAoY29tcG9uZW50cykge1xuICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goYyA9PiB7XG4gICAgICBjb25zdCBjb21wID0gY29tcG9uZW50c1tjXTtcbiAgICAgIGlmICh0eXBlb2YgY29tcC50eXBlID09PSAnZnVuY3Rpb24nIHx8ICFjb21wLnByb3BzIHx8ICFjb21wLnByb3BzLmNoaWxkcmVuIHx8IHRyYW5zbGF0aW9uLmluZGV4T2YoYCR7Y30vPmApIDwgMCAmJiB0cmFuc2xhdGlvbi5pbmRleE9mKGAke2N9IC8+YCkgPCAwKSByZXR1cm47XG4gICAgICBmdW5jdGlvbiBDb21wb25lbnRpemVkKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgY29tcCk7XG4gICAgICB9XG4gICAgICBjb21wb25lbnRzW2NdID0gY3JlYXRlRWxlbWVudChDb21wb25lbnRpemVkKTtcbiAgICB9KTtcbiAgfVxuICBjb25zdCBjb250ZW50ID0gcmVuZGVyTm9kZXMoY29tcG9uZW50cyB8fCBjaGlsZHJlbiwgdHJhbnNsYXRpb24sIGkxOG4sIHJlYWN0STE4bmV4dE9wdGlvbnMsIGNvbWJpbmVkVE9wdHMsIHNob3VsZFVuZXNjYXBlKTtcbiAgY29uc3QgdXNlQXNQYXJlbnQgPSBwYXJlbnQgPz8gcmVhY3RJMThuZXh0T3B0aW9ucy5kZWZhdWx0VHJhbnNQYXJlbnQ7XG4gIHJldHVybiB1c2VBc1BhcmVudCA/IGNyZWF0ZUVsZW1lbnQodXNlQXNQYXJlbnQsIGFkZGl0aW9uYWxQcm9wcywgY29udGVudCkgOiBjb250ZW50O1xufSIsImltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAnLi91c2VUcmFuc2xhdGlvbi5qcyc7XG5leHBvcnQgY29uc3QgVHJhbnNsYXRpb24gPSAoe1xuICBucyxcbiAgY2hpbGRyZW4sXG4gIC4uLm9wdGlvbnNcbn0pID0+IHtcbiAgY29uc3QgW3QsIGkxOG4sIHJlYWR5XSA9IHVzZVRyYW5zbGF0aW9uKG5zLCBvcHRpb25zKTtcbiAgcmV0dXJuIGNoaWxkcmVuKHQsIHtcbiAgICBpMThuLFxuICAgIGxuZzogaTE4bi5sYW5ndWFnZVxuICB9LCByZWFkeSk7XG59OyIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXREZWZhdWx0cywgc2V0RGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLmpzJztcbmltcG9ydCB7IGdldEkxOG4sIHNldEkxOG4gfSBmcm9tICcuL2kxOG5JbnN0YW5jZS5qcyc7XG5pbXBvcnQgeyBpbml0UmVhY3RJMThuZXh0IH0gZnJvbSAnLi9pbml0UmVhY3RJMThuZXh0LmpzJztcbmV4cG9ydCB7IGdldERlZmF1bHRzLCBzZXREZWZhdWx0cywgZ2V0STE4biwgc2V0STE4biwgaW5pdFJlYWN0STE4bmV4dCB9O1xuZXhwb3J0IGNvbnN0IEkxOG5Db250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuZXhwb3J0IGNsYXNzIFJlcG9ydE5hbWVzcGFjZXMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnVzZWROYW1lc3BhY2VzID0ge307XG4gIH1cbiAgYWRkVXNlZE5hbWVzcGFjZXMobmFtZXNwYWNlcykge1xuICAgIG5hbWVzcGFjZXMuZm9yRWFjaChucyA9PiB7XG4gICAgICB0aGlzLnVzZWROYW1lc3BhY2VzW25zXSA/Pz0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuICBnZXRVc2VkTmFtZXNwYWNlcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VkTmFtZXNwYWNlcyk7XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBjb21wb3NlSW5pdGlhbFByb3BzID0gRm9yQ29tcG9uZW50ID0+IGFzeW5jIGN0eCA9PiB7XG4gIGNvbnN0IGNvbXBvbmVudHNJbml0aWFsUHJvcHMgPSAoYXdhaXQgRm9yQ29tcG9uZW50LmdldEluaXRpYWxQcm9wcz8uKGN0eCkpID8/IHt9O1xuICBjb25zdCBpMThuSW5pdGlhbFByb3BzID0gZ2V0SW5pdGlhbFByb3BzKCk7XG4gIHJldHVybiB7XG4gICAgLi4uY29tcG9uZW50c0luaXRpYWxQcm9wcyxcbiAgICAuLi5pMThuSW5pdGlhbFByb3BzXG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IGdldEluaXRpYWxQcm9wcyA9ICgpID0+IHtcbiAgY29uc3QgaTE4biA9IGdldEkxOG4oKTtcbiAgY29uc3QgbmFtZXNwYWNlcyA9IGkxOG4ucmVwb3J0TmFtZXNwYWNlcz8uZ2V0VXNlZE5hbWVzcGFjZXMoKSA/PyBbXTtcbiAgY29uc3QgcmV0ID0ge307XG4gIGNvbnN0IGluaXRpYWxJMThuU3RvcmUgPSB7fTtcbiAgaTE4bi5sYW5ndWFnZXMuZm9yRWFjaChsID0+IHtcbiAgICBpbml0aWFsSTE4blN0b3JlW2xdID0ge307XG4gICAgbmFtZXNwYWNlcy5mb3JFYWNoKG5zID0+IHtcbiAgICAgIGluaXRpYWxJMThuU3RvcmVbbF1bbnNdID0gaTE4bi5nZXRSZXNvdXJjZUJ1bmRsZShsLCBucykgfHwge307XG4gICAgfSk7XG4gIH0pO1xuICByZXQuaW5pdGlhbEkxOG5TdG9yZSA9IGluaXRpYWxJMThuU3RvcmU7XG4gIHJldC5pbml0aWFsTGFuZ3VhZ2UgPSBpMThuLmxhbmd1YWdlO1xuICByZXR1cm4gcmV0O1xufTsiLCJpbXBvcnQgeyB1bmVzY2FwZSB9IGZyb20gJy4vdW5lc2NhcGUuanMnO1xubGV0IGRlZmF1bHRPcHRpb25zID0ge1xuICBiaW5kSTE4bjogJ2xhbmd1YWdlQ2hhbmdlZCcsXG4gIGJpbmRJMThuU3RvcmU6ICcnLFxuICB0cmFuc0VtcHR5Tm9kZVZhbHVlOiAnJyxcbiAgdHJhbnNTdXBwb3J0QmFzaWNIdG1sTm9kZXM6IHRydWUsXG4gIHRyYW5zV3JhcFRleHROb2RlczogJycsXG4gIHRyYW5zS2VlcEJhc2ljSHRtbE5vZGVzRm9yOiBbJ2JyJywgJ3N0cm9uZycsICdpJywgJ3AnXSxcbiAgdXNlU3VzcGVuc2U6IHRydWUsXG4gIHVuZXNjYXBlXG59O1xuZXhwb3J0IGNvbnN0IHNldERlZmF1bHRzID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgICAuLi5vcHRpb25zXG4gIH07XG59O1xuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRzID0gKCkgPT4gZGVmYXVsdE9wdGlvbnM7IiwibGV0IGkxOG5JbnN0YW5jZTtcbmV4cG9ydCBjb25zdCBzZXRJMThuID0gaW5zdGFuY2UgPT4ge1xuICBpMThuSW5zdGFuY2UgPSBpbnN0YW5jZTtcbn07XG5leHBvcnQgY29uc3QgZ2V0STE4biA9ICgpID0+IGkxOG5JbnN0YW5jZTsiLCJleHBvcnQgeyBUcmFucyB9IGZyb20gJy4vVHJhbnMuanMnO1xuZXhwb3J0IHsgVHJhbnMgYXMgVHJhbnNXaXRob3V0Q29udGV4dCB9IGZyb20gJy4vVHJhbnNXaXRob3V0Q29udGV4dC5qcyc7XG5leHBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJy4vdXNlVHJhbnNsYXRpb24uanMnO1xuZXhwb3J0IHsgd2l0aFRyYW5zbGF0aW9uIH0gZnJvbSAnLi93aXRoVHJhbnNsYXRpb24uanMnO1xuZXhwb3J0IHsgVHJhbnNsYXRpb24gfSBmcm9tICcuL1RyYW5zbGF0aW9uLmpzJztcbmV4cG9ydCB7IEkxOG5leHRQcm92aWRlciB9IGZyb20gJy4vSTE4bmV4dFByb3ZpZGVyLmpzJztcbmV4cG9ydCB7IHdpdGhTU1IgfSBmcm9tICcuL3dpdGhTU1IuanMnO1xuZXhwb3J0IHsgdXNlU1NSIH0gZnJvbSAnLi91c2VTU1IuanMnO1xuZXhwb3J0IHsgaW5pdFJlYWN0STE4bmV4dCB9IGZyb20gJy4vaW5pdFJlYWN0STE4bmV4dC5qcyc7XG5leHBvcnQgeyBzZXREZWZhdWx0cywgZ2V0RGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLmpzJztcbmV4cG9ydCB7IHNldEkxOG4sIGdldEkxOG4gfSBmcm9tICcuL2kxOG5JbnN0YW5jZS5qcyc7XG5leHBvcnQgeyBJMThuQ29udGV4dCwgY29tcG9zZUluaXRpYWxQcm9wcywgZ2V0SW5pdGlhbFByb3BzIH0gZnJvbSAnLi9jb250ZXh0LmpzJztcbmV4cG9ydCBjb25zdCBkYXRlID0gKCkgPT4gJyc7XG5leHBvcnQgY29uc3QgdGltZSA9ICgpID0+ICcnO1xuZXhwb3J0IGNvbnN0IG51bWJlciA9ICgpID0+ICcnO1xuZXhwb3J0IGNvbnN0IHNlbGVjdCA9ICgpID0+ICcnO1xuZXhwb3J0IGNvbnN0IHBsdXJhbCA9ICgpID0+ICcnO1xuZXhwb3J0IGNvbnN0IHNlbGVjdE9yZGluYWwgPSAoKSA9PiAnJzsiLCJpbXBvcnQgeyBzZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMuanMnO1xuaW1wb3J0IHsgc2V0STE4biB9IGZyb20gJy4vaTE4bkluc3RhbmNlLmpzJztcbmV4cG9ydCBjb25zdCBpbml0UmVhY3RJMThuZXh0ID0ge1xuICB0eXBlOiAnM3JkUGFydHknLFxuICBpbml0KGluc3RhbmNlKSB7XG4gICAgc2V0RGVmYXVsdHMoaW5zdGFuY2Uub3B0aW9ucy5yZWFjdCk7XG4gICAgc2V0STE4bihpbnN0YW5jZSk7XG4gIH1cbn07IiwiY29uc3QgbWF0Y2hIdG1sRW50aXR5ID0gLyYoPzphbXB8IzM4fGx0fCM2MHxndHwjNjJ8YXBvc3wjMzl8cXVvdHwjMzR8bmJzcHwjMTYwfGNvcHl8IzE2OXxyZWd8IzE3NHxoZWxsaXB8IzgyMzB8I3gyRnwjNDcpOy9nO1xuY29uc3QgaHRtbEVudGl0aWVzID0ge1xuICAnJmFtcDsnOiAnJicsXG4gICcmIzM4Oyc6ICcmJyxcbiAgJyZsdDsnOiAnPCcsXG4gICcmIzYwOyc6ICc8JyxcbiAgJyZndDsnOiAnPicsXG4gICcmIzYyOyc6ICc+JyxcbiAgJyZhcG9zOyc6IFwiJ1wiLFxuICAnJiMzOTsnOiBcIidcIixcbiAgJyZxdW90Oyc6ICdcIicsXG4gICcmIzM0Oyc6ICdcIicsXG4gICcmbmJzcDsnOiAnICcsXG4gICcmIzE2MDsnOiAnICcsXG4gICcmY29weTsnOiAnwqknLFxuICAnJiMxNjk7JzogJ8KpJyxcbiAgJyZyZWc7JzogJ8KuJyxcbiAgJyYjMTc0Oyc6ICfCricsXG4gICcmaGVsbGlwOyc6ICfigKYnLFxuICAnJiM4MjMwOyc6ICfigKYnLFxuICAnJiN4MkY7JzogJy8nLFxuICAnJiM0NzsnOiAnLydcbn07XG5jb25zdCB1bmVzY2FwZUh0bWxFbnRpdHkgPSBtID0+IGh0bWxFbnRpdGllc1ttXTtcbmV4cG9ydCBjb25zdCB1bmVzY2FwZSA9IHRleHQgPT4gdGV4dC5yZXBsYWNlKG1hdGNoSHRtbEVudGl0eSwgdW5lc2NhcGVIdG1sRW50aXR5KTsiLCJpbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0STE4biwgSTE4bkNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQuanMnO1xuZXhwb3J0IGNvbnN0IHVzZVNTUiA9IChpbml0aWFsSTE4blN0b3JlLCBpbml0aWFsTGFuZ3VhZ2UsIHByb3BzID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGkxOG46IGkxOG5Gcm9tUHJvcHNcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgaTE4bjogaTE4bkZyb21Db250ZXh0XG4gIH0gPSB1c2VDb250ZXh0KEkxOG5Db250ZXh0KSB8fCB7fTtcbiAgY29uc3QgaTE4biA9IGkxOG5Gcm9tUHJvcHMgfHwgaTE4bkZyb21Db250ZXh0IHx8IGdldEkxOG4oKTtcbiAgaWYgKGkxOG4ub3B0aW9ucz8uaXNDbG9uZSkgcmV0dXJuO1xuICBpZiAoaW5pdGlhbEkxOG5TdG9yZSAmJiAhaTE4bi5pbml0aWFsaXplZFN0b3JlT25jZSkge1xuICAgIGkxOG4uc2VydmljZXMucmVzb3VyY2VTdG9yZS5kYXRhID0gaW5pdGlhbEkxOG5TdG9yZTtcbiAgICBpMThuLm9wdGlvbnMubnMgPSBPYmplY3QudmFsdWVzKGluaXRpYWxJMThuU3RvcmUpLnJlZHVjZSgobWVtLCBsbmdSZXNvdXJjZXMpID0+IHtcbiAgICAgIE9iamVjdC5rZXlzKGxuZ1Jlc291cmNlcykuZm9yRWFjaChucyA9PiB7XG4gICAgICAgIGlmIChtZW0uaW5kZXhPZihucykgPCAwKSBtZW0ucHVzaChucyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtZW07XG4gICAgfSwgaTE4bi5vcHRpb25zLm5zKTtcbiAgICBpMThuLmluaXRpYWxpemVkU3RvcmVPbmNlID0gdHJ1ZTtcbiAgICBpMThuLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG4gIGlmIChpbml0aWFsTGFuZ3VhZ2UgJiYgIWkxOG4uaW5pdGlhbGl6ZWRMYW5ndWFnZU9uY2UpIHtcbiAgICBpMThuLmNoYW5nZUxhbmd1YWdlKGluaXRpYWxMYW5ndWFnZSk7XG4gICAgaTE4bi5pbml0aWFsaXplZExhbmd1YWdlT25jZSA9IHRydWU7XG4gIH1cbn07IiwiaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlQ29udGV4dCwgdXNlUmVmLCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEkxOG4sIGdldERlZmF1bHRzLCBSZXBvcnROYW1lc3BhY2VzLCBJMThuQ29udGV4dCB9IGZyb20gJy4vY29udGV4dC5qcyc7XG5pbXBvcnQgeyB3YXJuT25jZSwgbG9hZE5hbWVzcGFjZXMsIGxvYWRMYW5ndWFnZXMsIGhhc0xvYWRlZE5hbWVzcGFjZSwgaXNTdHJpbmcsIGlzT2JqZWN0IH0gZnJvbSAnLi91dGlscy5qcyc7XG5jb25zdCB1c2VQcmV2aW91cyA9ICh2YWx1ZSwgaWdub3JlKSA9PiB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZigpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJlZi5jdXJyZW50ID0gaWdub3JlID8gcmVmLmN1cnJlbnQgOiB2YWx1ZTtcbiAgfSwgW3ZhbHVlLCBpZ25vcmVdKTtcbiAgcmV0dXJuIHJlZi5jdXJyZW50O1xufTtcbmNvbnN0IGFsd2F5c05ld1QgPSAoaTE4biwgbGFuZ3VhZ2UsIG5hbWVzcGFjZSwga2V5UHJlZml4KSA9PiBpMThuLmdldEZpeGVkVChsYW5ndWFnZSwgbmFtZXNwYWNlLCBrZXlQcmVmaXgpO1xuY29uc3QgdXNlTWVtb2l6ZWRUID0gKGkxOG4sIGxhbmd1YWdlLCBuYW1lc3BhY2UsIGtleVByZWZpeCkgPT4gdXNlQ2FsbGJhY2soYWx3YXlzTmV3VChpMThuLCBsYW5ndWFnZSwgbmFtZXNwYWNlLCBrZXlQcmVmaXgpLCBbaTE4biwgbGFuZ3VhZ2UsIG5hbWVzcGFjZSwga2V5UHJlZml4XSk7XG5leHBvcnQgY29uc3QgdXNlVHJhbnNsYXRpb24gPSAobnMsIHByb3BzID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGkxOG46IGkxOG5Gcm9tUHJvcHNcbiAgfSA9IHByb3BzO1xuICBjb25zdCB7XG4gICAgaTE4bjogaTE4bkZyb21Db250ZXh0LFxuICAgIGRlZmF1bHROUzogZGVmYXVsdE5TRnJvbUNvbnRleHRcbiAgfSA9IHVzZUNvbnRleHQoSTE4bkNvbnRleHQpIHx8IHt9O1xuICBjb25zdCBpMThuID0gaTE4bkZyb21Qcm9wcyB8fCBpMThuRnJvbUNvbnRleHQgfHwgZ2V0STE4bigpO1xuICBpZiAoaTE4biAmJiAhaTE4bi5yZXBvcnROYW1lc3BhY2VzKSBpMThuLnJlcG9ydE5hbWVzcGFjZXMgPSBuZXcgUmVwb3J0TmFtZXNwYWNlcygpO1xuICBpZiAoIWkxOG4pIHtcbiAgICB3YXJuT25jZSgnWW91IHdpbGwgbmVlZCB0byBwYXNzIGluIGFuIGkxOG5leHQgaW5zdGFuY2UgYnkgdXNpbmcgaW5pdFJlYWN0STE4bmV4dCcpO1xuICAgIGNvbnN0IG5vdFJlYWR5VCA9IChrLCBvcHRzT3JEZWZhdWx0VmFsdWUpID0+IHtcbiAgICAgIGlmIChpc1N0cmluZyhvcHRzT3JEZWZhdWx0VmFsdWUpKSByZXR1cm4gb3B0c09yRGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKGlzT2JqZWN0KG9wdHNPckRlZmF1bHRWYWx1ZSkgJiYgaXNTdHJpbmcob3B0c09yRGVmYXVsdFZhbHVlLmRlZmF1bHRWYWx1ZSkpIHJldHVybiBvcHRzT3JEZWZhdWx0VmFsdWUuZGVmYXVsdFZhbHVlO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaykgPyBrW2subGVuZ3RoIC0gMV0gOiBrO1xuICAgIH07XG4gICAgY29uc3QgcmV0Tm90UmVhZHkgPSBbbm90UmVhZHlULCB7fSwgZmFsc2VdO1xuICAgIHJldE5vdFJlYWR5LnQgPSBub3RSZWFkeVQ7XG4gICAgcmV0Tm90UmVhZHkuaTE4biA9IHt9O1xuICAgIHJldE5vdFJlYWR5LnJlYWR5ID0gZmFsc2U7XG4gICAgcmV0dXJuIHJldE5vdFJlYWR5O1xuICB9XG4gIGlmIChpMThuLm9wdGlvbnMucmVhY3Q/LndhaXQpIHdhcm5PbmNlKCdJdCBzZWVtcyB5b3UgYXJlIHN0aWxsIHVzaW5nIHRoZSBvbGQgd2FpdCBvcHRpb24sIHlvdSBtYXkgbWlncmF0ZSB0byB0aGUgbmV3IHVzZVN1c3BlbnNlIGJlaGF2aW91ci4nKTtcbiAgY29uc3QgaTE4bk9wdGlvbnMgPSB7XG4gICAgLi4uZ2V0RGVmYXVsdHMoKSxcbiAgICAuLi5pMThuLm9wdGlvbnMucmVhY3QsXG4gICAgLi4ucHJvcHNcbiAgfTtcbiAgY29uc3Qge1xuICAgIHVzZVN1c3BlbnNlLFxuICAgIGtleVByZWZpeFxuICB9ID0gaTE4bk9wdGlvbnM7XG4gIGxldCBuYW1lc3BhY2VzID0gbnMgfHwgZGVmYXVsdE5TRnJvbUNvbnRleHQgfHwgaTE4bi5vcHRpb25zPy5kZWZhdWx0TlM7XG4gIG5hbWVzcGFjZXMgPSBpc1N0cmluZyhuYW1lc3BhY2VzKSA/IFtuYW1lc3BhY2VzXSA6IG5hbWVzcGFjZXMgfHwgWyd0cmFuc2xhdGlvbiddO1xuICBpMThuLnJlcG9ydE5hbWVzcGFjZXMuYWRkVXNlZE5hbWVzcGFjZXM/LihuYW1lc3BhY2VzKTtcbiAgY29uc3QgcmVhZHkgPSAoaTE4bi5pc0luaXRpYWxpemVkIHx8IGkxOG4uaW5pdGlhbGl6ZWRTdG9yZU9uY2UpICYmIG5hbWVzcGFjZXMuZXZlcnkobiA9PiBoYXNMb2FkZWROYW1lc3BhY2UobiwgaTE4biwgaTE4bk9wdGlvbnMpKTtcbiAgY29uc3QgbWVtb0dldFQgPSB1c2VNZW1vaXplZFQoaTE4biwgcHJvcHMubG5nIHx8IG51bGwsIGkxOG5PcHRpb25zLm5zTW9kZSA9PT0gJ2ZhbGxiYWNrJyA/IG5hbWVzcGFjZXMgOiBuYW1lc3BhY2VzWzBdLCBrZXlQcmVmaXgpO1xuICBjb25zdCBnZXRUID0gKCkgPT4gbWVtb0dldFQ7XG4gIGNvbnN0IGdldE5ld1QgPSAoKSA9PiBhbHdheXNOZXdUKGkxOG4sIHByb3BzLmxuZyB8fCBudWxsLCBpMThuT3B0aW9ucy5uc01vZGUgPT09ICdmYWxsYmFjaycgPyBuYW1lc3BhY2VzIDogbmFtZXNwYWNlc1swXSwga2V5UHJlZml4KTtcbiAgY29uc3QgW3QsIHNldFRdID0gdXNlU3RhdGUoZ2V0VCk7XG4gIGxldCBqb2luZWROUyA9IG5hbWVzcGFjZXMuam9pbigpO1xuICBpZiAocHJvcHMubG5nKSBqb2luZWROUyA9IGAke3Byb3BzLmxuZ30ke2pvaW5lZE5TfWA7XG4gIGNvbnN0IHByZXZpb3VzSm9pbmVkTlMgPSB1c2VQcmV2aW91cyhqb2luZWROUyk7XG4gIGNvbnN0IGlzTW91bnRlZCA9IHVzZVJlZih0cnVlKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBiaW5kSTE4bixcbiAgICAgIGJpbmRJMThuU3RvcmVcbiAgICB9ID0gaTE4bk9wdGlvbnM7XG4gICAgaXNNb3VudGVkLmN1cnJlbnQgPSB0cnVlO1xuICAgIGlmICghcmVhZHkgJiYgIXVzZVN1c3BlbnNlKSB7XG4gICAgICBpZiAocHJvcHMubG5nKSB7XG4gICAgICAgIGxvYWRMYW5ndWFnZXMoaTE4biwgcHJvcHMubG5nLCBuYW1lc3BhY2VzLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKGlzTW91bnRlZC5jdXJyZW50KSBzZXRUKGdldE5ld1QpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWROYW1lc3BhY2VzKGkxOG4sIG5hbWVzcGFjZXMsICgpID0+IHtcbiAgICAgICAgICBpZiAoaXNNb3VudGVkLmN1cnJlbnQpIHNldFQoZ2V0TmV3VCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVhZHkgJiYgcHJldmlvdXNKb2luZWROUyAmJiBwcmV2aW91c0pvaW5lZE5TICE9PSBqb2luZWROUyAmJiBpc01vdW50ZWQuY3VycmVudCkge1xuICAgICAgc2V0VChnZXROZXdUKTtcbiAgICB9XG4gICAgY29uc3QgYm91bmRSZXNldCA9ICgpID0+IHtcbiAgICAgIGlmIChpc01vdW50ZWQuY3VycmVudCkgc2V0VChnZXROZXdUKTtcbiAgICB9O1xuICAgIGlmIChiaW5kSTE4bikgaTE4bj8ub24oYmluZEkxOG4sIGJvdW5kUmVzZXQpO1xuICAgIGlmIChiaW5kSTE4blN0b3JlKSBpMThuPy5zdG9yZS5vbihiaW5kSTE4blN0b3JlLCBib3VuZFJlc2V0KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaXNNb3VudGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIGlmIChpMThuKSBiaW5kSTE4bj8uc3BsaXQoJyAnKS5mb3JFYWNoKGUgPT4gaTE4bi5vZmYoZSwgYm91bmRSZXNldCkpO1xuICAgICAgaWYgKGJpbmRJMThuU3RvcmUgJiYgaTE4bikgYmluZEkxOG5TdG9yZS5zcGxpdCgnICcpLmZvckVhY2goZSA9PiBpMThuLnN0b3JlLm9mZihlLCBib3VuZFJlc2V0KSk7XG4gICAgfTtcbiAgfSwgW2kxOG4sIGpvaW5lZE5TXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzTW91bnRlZC5jdXJyZW50ICYmIHJlYWR5KSB7XG4gICAgICBzZXRUKGdldFQpO1xuICAgIH1cbiAgfSwgW2kxOG4sIGtleVByZWZpeCwgcmVhZHldKTtcbiAgY29uc3QgcmV0ID0gW3QsIGkxOG4sIHJlYWR5XTtcbiAgcmV0LnQgPSB0O1xuICByZXQuaTE4biA9IGkxOG47XG4gIHJldC5yZWFkeSA9IHJlYWR5O1xuICBpZiAocmVhZHkpIHJldHVybiByZXQ7XG4gIGlmICghcmVhZHkgJiYgIXVzZVN1c3BlbnNlKSByZXR1cm4gcmV0O1xuICB0aHJvdyBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBpZiAocHJvcHMubG5nKSB7XG4gICAgICBsb2FkTGFuZ3VhZ2VzKGkxOG4sIHByb3BzLmxuZywgbmFtZXNwYWNlcywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZE5hbWVzcGFjZXMoaTE4biwgbmFtZXNwYWNlcywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICB9XG4gIH0pO1xufTsiLCJleHBvcnQgY29uc3Qgd2FybiA9ICguLi5hcmdzKSA9PiB7XG4gIGlmIChjb25zb2xlPy53YXJuKSB7XG4gICAgaWYgKGlzU3RyaW5nKGFyZ3NbMF0pKSBhcmdzWzBdID0gYHJlYWN0LWkxOG5leHQ6OiAke2FyZ3NbMF19YDtcbiAgICBjb25zb2xlLndhcm4oLi4uYXJncyk7XG4gIH1cbn07XG5jb25zdCBhbHJlYWR5V2FybmVkID0ge307XG5leHBvcnQgY29uc3Qgd2Fybk9uY2UgPSAoLi4uYXJncykgPT4ge1xuICBpZiAoaXNTdHJpbmcoYXJnc1swXSkgJiYgYWxyZWFkeVdhcm5lZFthcmdzWzBdXSkgcmV0dXJuO1xuICBpZiAoaXNTdHJpbmcoYXJnc1swXSkpIGFscmVhZHlXYXJuZWRbYXJnc1swXV0gPSBuZXcgRGF0ZSgpO1xuICB3YXJuKC4uLmFyZ3MpO1xufTtcbmNvbnN0IGxvYWRlZENsYiA9IChpMThuLCBjYikgPT4gKCkgPT4ge1xuICBpZiAoaTE4bi5pc0luaXRpYWxpemVkKSB7XG4gICAgY2IoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbml0aWFsaXplZCA9ICgpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpMThuLm9mZignaW5pdGlhbGl6ZWQnLCBpbml0aWFsaXplZCk7XG4gICAgICB9LCAwKTtcbiAgICAgIGNiKCk7XG4gICAgfTtcbiAgICBpMThuLm9uKCdpbml0aWFsaXplZCcsIGluaXRpYWxpemVkKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCBsb2FkTmFtZXNwYWNlcyA9IChpMThuLCBucywgY2IpID0+IHtcbiAgaTE4bi5sb2FkTmFtZXNwYWNlcyhucywgbG9hZGVkQ2xiKGkxOG4sIGNiKSk7XG59O1xuZXhwb3J0IGNvbnN0IGxvYWRMYW5ndWFnZXMgPSAoaTE4biwgbG5nLCBucywgY2IpID0+IHtcbiAgaWYgKGlzU3RyaW5nKG5zKSkgbnMgPSBbbnNdO1xuICBucy5mb3JFYWNoKG4gPT4ge1xuICAgIGlmIChpMThuLm9wdGlvbnMubnMuaW5kZXhPZihuKSA8IDApIGkxOG4ub3B0aW9ucy5ucy5wdXNoKG4pO1xuICB9KTtcbiAgaTE4bi5sb2FkTGFuZ3VhZ2VzKGxuZywgbG9hZGVkQ2xiKGkxOG4sIGNiKSk7XG59O1xuZXhwb3J0IGNvbnN0IGhhc0xvYWRlZE5hbWVzcGFjZSA9IChucywgaTE4biwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICghaTE4bi5sYW5ndWFnZXMgfHwgIWkxOG4ubGFuZ3VhZ2VzLmxlbmd0aCkge1xuICAgIHdhcm5PbmNlKCdpMThuLmxhbmd1YWdlcyB3ZXJlIHVuZGVmaW5lZCBvciBlbXB0eScsIGkxOG4ubGFuZ3VhZ2VzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gaTE4bi5oYXNMb2FkZWROYW1lc3BhY2UobnMsIHtcbiAgICBsbmc6IG9wdGlvbnMubG5nLFxuICAgIHByZWNoZWNrOiAoaTE4bkluc3RhbmNlLCBsb2FkTm90UGVuZGluZykgPT4ge1xuICAgICAgaWYgKG9wdGlvbnMuYmluZEkxOG4/LmluZGV4T2YoJ2xhbmd1YWdlQ2hhbmdpbmcnKSA+IC0xICYmIGkxOG5JbnN0YW5jZS5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmJhY2tlbmQgJiYgaTE4bkluc3RhbmNlLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvICYmICFsb2FkTm90UGVuZGluZyhpMThuSW5zdGFuY2UuaXNMYW5ndWFnZUNoYW5naW5nVG8sIG5zKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IGdldERpc3BsYXlOYW1lID0gQ29tcG9uZW50ID0+IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAoaXNTdHJpbmcoQ29tcG9uZW50KSAmJiBDb21wb25lbnQubGVuZ3RoID4gMCA/IENvbXBvbmVudCA6ICdVbmtub3duJyk7XG5leHBvcnQgY29uc3QgaXNTdHJpbmcgPSBvYmogPT4gdHlwZW9mIG9iaiA9PT0gJ3N0cmluZyc7XG5leHBvcnQgY29uc3QgaXNPYmplY3QgPSBvYmogPT4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsOyIsImltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTU1IgfSBmcm9tICcuL3VzZVNTUi5qcyc7XG5pbXBvcnQgeyBjb21wb3NlSW5pdGlhbFByb3BzIH0gZnJvbSAnLi9jb250ZXh0LmpzJztcbmltcG9ydCB7IGdldERpc3BsYXlOYW1lIH0gZnJvbSAnLi91dGlscy5qcyc7XG5leHBvcnQgY29uc3Qgd2l0aFNTUiA9ICgpID0+IGZ1bmN0aW9uIEV4dGVuZChXcmFwcGVkQ29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIEkxOG5leHRXaXRoU1NSKHtcbiAgICBpbml0aWFsSTE4blN0b3JlLFxuICAgIGluaXRpYWxMYW5ndWFnZSxcbiAgICAuLi5yZXN0XG4gIH0pIHtcbiAgICB1c2VTU1IoaW5pdGlhbEkxOG5TdG9yZSwgaW5pdGlhbExhbmd1YWdlKTtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCB7XG4gICAgICAuLi5yZXN0XG4gICAgfSk7XG4gIH1cbiAgSTE4bmV4dFdpdGhTU1IuZ2V0SW5pdGlhbFByb3BzID0gY29tcG9zZUluaXRpYWxQcm9wcyhXcmFwcGVkQ29tcG9uZW50KTtcbiAgSTE4bmV4dFdpdGhTU1IuZGlzcGxheU5hbWUgPSBgd2l0aEkxOG5leHRTU1IoJHtnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KX0pYDtcbiAgSTE4bmV4dFdpdGhTU1IuV3JhcHBlZENvbXBvbmVudCA9IFdyYXBwZWRDb21wb25lbnQ7XG4gIHJldHVybiBJMThuZXh0V2l0aFNTUjtcbn07IiwiaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgZm9yd2FyZFJlZiBhcyBmb3J3YXJkUmVmUmVhY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJy4vdXNlVHJhbnNsYXRpb24uanMnO1xuaW1wb3J0IHsgZ2V0RGlzcGxheU5hbWUgfSBmcm9tICcuL3V0aWxzLmpzJztcbmV4cG9ydCBjb25zdCB3aXRoVHJhbnNsYXRpb24gPSAobnMsIG9wdGlvbnMgPSB7fSkgPT4gZnVuY3Rpb24gRXh0ZW5kKFdyYXBwZWRDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gSTE4bmV4dFdpdGhUcmFuc2xhdGlvbih7XG4gICAgZm9yd2FyZGVkUmVmLFxuICAgIC4uLnJlc3RcbiAgfSkge1xuICAgIGNvbnN0IFt0LCBpMThuLCByZWFkeV0gPSB1c2VUcmFuc2xhdGlvbihucywge1xuICAgICAgLi4ucmVzdCxcbiAgICAgIGtleVByZWZpeDogb3B0aW9ucy5rZXlQcmVmaXhcbiAgICB9KTtcbiAgICBjb25zdCBwYXNzRG93blByb3BzID0ge1xuICAgICAgLi4ucmVzdCxcbiAgICAgIHQsXG4gICAgICBpMThuLFxuICAgICAgdFJlYWR5OiByZWFkeVxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMud2l0aFJlZiAmJiBmb3J3YXJkZWRSZWYpIHtcbiAgICAgIHBhc3NEb3duUHJvcHMucmVmID0gZm9yd2FyZGVkUmVmO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMud2l0aFJlZiAmJiBmb3J3YXJkZWRSZWYpIHtcbiAgICAgIHBhc3NEb3duUHJvcHMuZm9yd2FyZGVkUmVmID0gZm9yd2FyZGVkUmVmO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBwYXNzRG93blByb3BzKTtcbiAgfVxuICBJMThuZXh0V2l0aFRyYW5zbGF0aW9uLmRpc3BsYXlOYW1lID0gYHdpdGhJMThuZXh0VHJhbnNsYXRpb24oJHtnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KX0pYDtcbiAgSTE4bmV4dFdpdGhUcmFuc2xhdGlvbi5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcbiAgY29uc3QgZm9yd2FyZFJlZiA9IChwcm9wcywgcmVmKSA9PiBjcmVhdGVFbGVtZW50KEkxOG5leHRXaXRoVHJhbnNsYXRpb24sIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZm9yd2FyZGVkUmVmOiByZWZcbiAgfSkpO1xuICByZXR1cm4gb3B0aW9ucy53aXRoUmVmID8gZm9yd2FyZFJlZlJlYWN0KGZvcndhcmRSZWYpIDogSTE4bmV4dFdpdGhUcmFuc2xhdGlvbjtcbn07IiwiJ3VzZSBjbGllbnQnO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1ha2VFdmVudFByb3BzIGZyb20gJ21ha2UtZXZlbnQtcHJvcHMnO1xuaW1wb3J0IG1ha2VDYW5jZWxsYWJsZSBmcm9tICdtYWtlLWNhbmNlbGxhYmxlLXByb21pc2UnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ3RpbnktaW52YXJpYW50JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0IHsgZGVxdWFsIH0gZnJvbSAnZGVxdWFsJztcbmltcG9ydCAqIGFzIHBkZmpzIGZyb20gJ3BkZmpzLWRpc3QnO1xuaW1wb3J0IERvY3VtZW50Q29udGV4dCBmcm9tICcuL0RvY3VtZW50Q29udGV4dC5qcyc7XG5pbXBvcnQgTWVzc2FnZSBmcm9tICcuL01lc3NhZ2UuanMnO1xuaW1wb3J0IExpbmtTZXJ2aWNlIGZyb20gJy4vTGlua1NlcnZpY2UuanMnO1xuaW1wb3J0IFBhc3N3b3JkUmVzcG9uc2VzIGZyb20gJy4vUGFzc3dvcmRSZXNwb25zZXMuanMnO1xuaW1wb3J0IHsgY2FuY2VsUnVubmluZ1Rhc2ssIGRhdGFVUkl0b0J5dGVTdHJpbmcsIGRpc3BsYXlDT1JTV2FybmluZywgaXNBcnJheUJ1ZmZlciwgaXNCbG9iLCBpc0Jyb3dzZXIsIGlzRGF0YVVSSSwgbG9hZEZyb21GaWxlLCB9IGZyb20gJy4vc2hhcmVkL3V0aWxzLmpzJztcbmltcG9ydCB1c2VSZXNvbHZlciBmcm9tICcuL3NoYXJlZC9ob29rcy91c2VSZXNvbHZlci5qcyc7XG5jb25zdCB7IFBERkRhdGFSYW5nZVRyYW5zcG9ydCB9ID0gcGRmanM7XG5jb25zdCBkZWZhdWx0T25QYXNzd29yZCA9IChjYWxsYmFjaywgcmVhc29uKSA9PiB7XG4gICAgc3dpdGNoIChyZWFzb24pIHtcbiAgICAgICAgY2FzZSBQYXNzd29yZFJlc3BvbnNlcy5ORUVEX1BBU1NXT1JEOiB7XG4gICAgICAgICAgICBjb25zdCBwYXNzd29yZCA9IHByb21wdCgnRW50ZXIgdGhlIHBhc3N3b3JkIHRvIG9wZW4gdGhpcyBQREYgZmlsZS4nKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKHBhc3N3b3JkKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUGFzc3dvcmRSZXNwb25zZXMuSU5DT1JSRUNUX1BBU1NXT1JEOiB7XG4gICAgICAgICAgICBjb25zdCBwYXNzd29yZCA9IHByb21wdCgnSW52YWxpZCBwYXNzd29yZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKHBhc3N3b3JkKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgfVxufTtcbmZ1bmN0aW9uIGlzUGFyYW1ldGVyT2JqZWN0KGZpbGUpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBmaWxlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBmaWxlICE9PSBudWxsICYmXG4gICAgICAgICgnZGF0YScgaW4gZmlsZSB8fCAncmFuZ2UnIGluIGZpbGUgfHwgJ3VybCcgaW4gZmlsZSkpO1xufVxuLyoqXG4gKiBMb2FkcyBhIGRvY3VtZW50IHBhc3NlZCB1c2luZyBgZmlsZWAgcHJvcC5cbiAqL1xuY29uc3QgRG9jdW1lbnQgPSBmb3J3YXJkUmVmKGZ1bmN0aW9uIERvY3VtZW50KF9hLCByZWYpIHtcbiAgICB2YXIgeyBjaGlsZHJlbiwgY2xhc3NOYW1lLCBlcnJvciA9ICdGYWlsZWQgdG8gbG9hZCBQREYgZmlsZS4nLCBleHRlcm5hbExpbmtSZWwsIGV4dGVybmFsTGlua1RhcmdldCwgZmlsZSwgaW5wdXRSZWYsIGltYWdlUmVzb3VyY2VzUGF0aCwgbG9hZGluZyA9ICdMb2FkaW5nIFBERuKApicsIG5vRGF0YSA9ICdObyBQREYgZmlsZSBzcGVjaWZpZWQuJywgb25JdGVtQ2xpY2ssIG9uTG9hZEVycm9yOiBvbkxvYWRFcnJvclByb3BzLCBvbkxvYWRQcm9ncmVzcywgb25Mb2FkU3VjY2Vzczogb25Mb2FkU3VjY2Vzc1Byb3BzLCBvblBhc3N3b3JkID0gZGVmYXVsdE9uUGFzc3dvcmQsIG9uU291cmNlRXJyb3I6IG9uU291cmNlRXJyb3JQcm9wcywgb25Tb3VyY2VTdWNjZXNzOiBvblNvdXJjZVN1Y2Nlc3NQcm9wcywgb3B0aW9ucywgcmVuZGVyTW9kZSwgcm90YXRlIH0gPSBfYSwgb3RoZXJQcm9wcyA9IF9fcmVzdChfYSwgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJlcnJvclwiLCBcImV4dGVybmFsTGlua1JlbFwiLCBcImV4dGVybmFsTGlua1RhcmdldFwiLCBcImZpbGVcIiwgXCJpbnB1dFJlZlwiLCBcImltYWdlUmVzb3VyY2VzUGF0aFwiLCBcImxvYWRpbmdcIiwgXCJub0RhdGFcIiwgXCJvbkl0ZW1DbGlja1wiLCBcIm9uTG9hZEVycm9yXCIsIFwib25Mb2FkUHJvZ3Jlc3NcIiwgXCJvbkxvYWRTdWNjZXNzXCIsIFwib25QYXNzd29yZFwiLCBcIm9uU291cmNlRXJyb3JcIiwgXCJvblNvdXJjZVN1Y2Nlc3NcIiwgXCJvcHRpb25zXCIsIFwicmVuZGVyTW9kZVwiLCBcInJvdGF0ZVwiXSk7XG4gICAgY29uc3QgW3NvdXJjZVN0YXRlLCBzb3VyY2VEaXNwYXRjaF0gPSB1c2VSZXNvbHZlcigpO1xuICAgIGNvbnN0IHsgdmFsdWU6IHNvdXJjZSwgZXJyb3I6IHNvdXJjZUVycm9yIH0gPSBzb3VyY2VTdGF0ZTtcbiAgICBjb25zdCBbcGRmU3RhdGUsIHBkZkRpc3BhdGNoXSA9IHVzZVJlc29sdmVyKCk7XG4gICAgY29uc3QgeyB2YWx1ZTogcGRmLCBlcnJvcjogcGRmRXJyb3IgfSA9IHBkZlN0YXRlO1xuICAgIGNvbnN0IGxpbmtTZXJ2aWNlID0gdXNlUmVmKG5ldyBMaW5rU2VydmljZSgpKTtcbiAgICBjb25zdCBwYWdlcyA9IHVzZVJlZihbXSk7XG4gICAgY29uc3QgcHJldkZpbGUgPSB1c2VSZWYodW5kZWZpbmVkKTtcbiAgICBjb25zdCBwcmV2T3B0aW9ucyA9IHVzZVJlZih1bmRlZmluZWQpO1xuICAgIGlmIChmaWxlICYmIGZpbGUgIT09IHByZXZGaWxlLmN1cnJlbnQgJiYgaXNQYXJhbWV0ZXJPYmplY3QoZmlsZSkpIHtcbiAgICAgICAgd2FybmluZyghZGVxdWFsKGZpbGUsIHByZXZGaWxlLmN1cnJlbnQpLCBgRmlsZSBwcm9wIHBhc3NlZCB0byA8RG9jdW1lbnQgLz4gY2hhbmdlZCwgYnV0IGl0J3MgZXF1YWwgdG8gcHJldmlvdXMgb25lLiBUaGlzIG1pZ2h0IHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSByZWxvYWRzLiBDb25zaWRlciBtZW1vaXppbmcgdGhlIHZhbHVlIHBhc3NlZCB0byBcImZpbGVcIiBwcm9wLmApO1xuICAgICAgICBwcmV2RmlsZS5jdXJyZW50ID0gZmlsZTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IG5vbi1tZW1vaXplZCBjaGFuZ2VzIGluIG9wdGlvbnMgcHJvcFxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMgIT09IHByZXZPcHRpb25zLmN1cnJlbnQpIHtcbiAgICAgICAgd2FybmluZyghZGVxdWFsKG9wdGlvbnMsIHByZXZPcHRpb25zLmN1cnJlbnQpLCBgT3B0aW9ucyBwcm9wIHBhc3NlZCB0byA8RG9jdW1lbnQgLz4gY2hhbmdlZCwgYnV0IGl0J3MgZXF1YWwgdG8gcHJldmlvdXMgb25lLiBUaGlzIG1pZ2h0IHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSByZWxvYWRzLiBDb25zaWRlciBtZW1vaXppbmcgdGhlIHZhbHVlIHBhc3NlZCB0byBcIm9wdGlvbnNcIiBwcm9wLmApO1xuICAgICAgICBwcmV2T3B0aW9ucy5jdXJyZW50ID0gb3B0aW9ucztcbiAgICB9XG4gICAgY29uc3Qgdmlld2VyID0gdXNlUmVmKHtcbiAgICAgICAgLy8gSGFuZGxpbmcganVtcGluZyB0byBpbnRlcm5hbCBsaW5rcyB0YXJnZXRcbiAgICAgICAgc2Nyb2xsUGFnZUludG9WaWV3OiAoYXJncykgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBkZXN0LCBwYWdlTnVtYmVyLCBwYWdlSW5kZXggPSBwYWdlTnVtYmVyIC0gMSB9ID0gYXJncztcbiAgICAgICAgICAgIC8vIEZpcnN0LCBjaGVjayBpZiBjdXN0b20gaGFuZGxpbmcgb2Ygb25JdGVtQ2xpY2sgd2FzIHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAob25JdGVtQ2xpY2spIHtcbiAgICAgICAgICAgICAgICBvbkl0ZW1DbGljayh7IGRlc3QsIHBhZ2VJbmRleCwgcGFnZU51bWJlciB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBub3QsIHRyeSB0byBsb29rIGZvciB0YXJnZXQgcGFnZSB3aXRoaW4gdGhlIDxEb2N1bWVudD4uXG4gICAgICAgICAgICBjb25zdCBwYWdlID0gcGFnZXMuY3VycmVudFtwYWdlSW5kZXhdO1xuICAgICAgICAgICAgaWYgKHBhZ2UpIHtcbiAgICAgICAgICAgICAgICAvLyBTY3JvbGwgdG8gdGhlIHBhZ2UgYXV0b21hdGljYWxseVxuICAgICAgICAgICAgICAgIHBhZ2Uuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YXJuaW5nKGZhbHNlLCBgQW4gaW50ZXJuYWwgbGluayBsZWFkaW5nIHRvIHBhZ2UgJHtwYWdlTnVtYmVyfSB3YXMgY2xpY2tlZCwgYnV0IG5laXRoZXIgPERvY3VtZW50PiB3YXMgcHJvdmlkZWQgd2l0aCBvbkl0ZW1DbGljayBub3IgaXQgd2FzIGFibGUgdG8gZmluZCB0aGUgcGFnZSB3aXRoaW4gaXRzZWxmLiBFaXRoZXIgcHJvdmlkZSBvbkl0ZW1DbGljayB0byA8RG9jdW1lbnQ+IGFuZCBoYW5kbGUgbmF2aWdhdGluZyBieSB5b3Vyc2VsZiBvciBlbnN1cmUgdGhhdCBhbGwgcGFnZXMgYXJlIHJlbmRlcmVkIHdpdGhpbiA8RG9jdW1lbnQ+LmApO1xuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoe1xuICAgICAgICBsaW5rU2VydmljZSxcbiAgICAgICAgcGFnZXMsXG4gICAgICAgIHZpZXdlcixcbiAgICB9KSwgW10pO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgZG9jdW1lbnQgc291cmNlIGlzIHJlc29sdmVkIGNvcnJlY3RseVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uU291cmNlU3VjY2VzcygpIHtcbiAgICAgICAgaWYgKG9uU291cmNlU3VjY2Vzc1Byb3BzKSB7XG4gICAgICAgICAgICBvblNvdXJjZVN1Y2Nlc3NQcm9wcygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgZG9jdW1lbnQgc291cmNlIGZhaWxlZCB0byBiZSByZXNvbHZlZCBjb3JyZWN0bHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvblNvdXJjZUVycm9yKCkge1xuICAgICAgICBpZiAoIXNvdXJjZUVycm9yKSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsIHNvdXJjZUVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAob25Tb3VyY2VFcnJvclByb3BzKSB7XG4gICAgICAgICAgICBvblNvdXJjZUVycm9yUHJvcHMoc291cmNlRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc2V0U291cmNlKCkge1xuICAgICAgICBzb3VyY2VEaXNwYXRjaCh7IHR5cGU6ICdSRVNFVCcgfSk7XG4gICAgfVxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlvbWVqcy9iaW9tZS9pc3N1ZXMvMzA4MFxuICAgIHVzZUVmZmVjdChyZXNldFNvdXJjZSwgW2ZpbGUsIHNvdXJjZURpc3BhdGNoXSk7XG4gICAgY29uc3QgZmluZERvY3VtZW50U291cmNlID0gdXNlQ2FsbGJhY2soKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbGUgaXMgYSBzdHJpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBmaWxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGlzRGF0YVVSSShmaWxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVCeXRlU3RyaW5nID0gZGF0YVVSSXRvQnl0ZVN0cmluZyhmaWxlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiBmaWxlQnl0ZVN0cmluZyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzcGxheUNPUlNXYXJuaW5nKCk7XG4gICAgICAgICAgICByZXR1cm4geyB1cmw6IGZpbGUgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxlIGlzIFBERkRhdGFSYW5nZVRyYW5zcG9ydFxuICAgICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIFBERkRhdGFSYW5nZVRyYW5zcG9ydCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IGZpbGUgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxlIGlzIGFuIEFycmF5QnVmZmVyXG4gICAgICAgIGlmIChpc0FycmF5QnVmZmVyKGZpbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBmaWxlIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBjYXNlcyBiZWxvdyBhcmUgYnJvd3Nlci1vbmx5LlxuICAgICAgICAgKiBJZiB5b3UncmUgcnVubmluZyBvbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50LCB0aGVzZSBjYXNlcyB3aWxsIGJlIG9mIG5vIHVzZS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIC8vIEZpbGUgaXMgYSBCbG9iXG4gICAgICAgICAgICBpZiAoaXNCbG9iKGZpbGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHlpZWxkIGxvYWRGcm9tRmlsZShmaWxlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgZmlsZSBtdXN0IGJlIGFuIG9iamVjdFxuICAgICAgICBpbnZhcmlhbnQodHlwZW9mIGZpbGUgPT09ICdvYmplY3QnLCAnSW52YWxpZCBwYXJhbWV0ZXIgaW4gZmlsZSwgbmVlZCBlaXRoZXIgVWludDhBcnJheSwgc3RyaW5nIG9yIGEgcGFyYW1ldGVyIG9iamVjdCcpO1xuICAgICAgICBpbnZhcmlhbnQoaXNQYXJhbWV0ZXJPYmplY3QoZmlsZSksICdJbnZhbGlkIHBhcmFtZXRlciBvYmplY3Q6IG5lZWQgZWl0aGVyIC5kYXRhLCAucmFuZ2Ugb3IgLnVybCcpO1xuICAgICAgICAvLyBGaWxlIC51cmwgaXMgYSBzdHJpbmdcbiAgICAgICAgaWYgKCd1cmwnIGluIGZpbGUgJiYgdHlwZW9mIGZpbGUudXJsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGlzRGF0YVVSSShmaWxlLnVybCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHVybCB9ID0gZmlsZSwgb3RoZXJQYXJhbXMgPSBfX3Jlc3QoZmlsZSwgW1widXJsXCJdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlQnl0ZVN0cmluZyA9IGRhdGFVUkl0b0J5dGVTdHJpbmcodXJsKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IGRhdGE6IGZpbGVCeXRlU3RyaW5nIH0sIG90aGVyUGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BsYXlDT1JTV2FybmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH0pLCBbZmlsZV0pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbmNlbGxhYmxlID0gbWFrZUNhbmNlbGxhYmxlKGZpbmREb2N1bWVudFNvdXJjZSgpKTtcbiAgICAgICAgY2FuY2VsbGFibGUucHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKG5leHRTb3VyY2UpID0+IHtcbiAgICAgICAgICAgIHNvdXJjZURpc3BhdGNoKHsgdHlwZTogJ1JFU09MVkUnLCB2YWx1ZTogbmV4dFNvdXJjZSB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHNvdXJjZURpc3BhdGNoKHsgdHlwZTogJ1JFSkVDVCcsIGVycm9yIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNhbmNlbFJ1bm5pbmdUYXNrKGNhbmNlbGxhYmxlKTtcbiAgICAgICAgfTtcbiAgICB9LCBbZmluZERvY3VtZW50U291cmNlLCBzb3VyY2VEaXNwYXRjaF0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgb25Tb3VyY2VFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uU291cmNlU3VjY2VzcygpO1xuICAgIH0sIFtzb3VyY2VdKTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIGRvY3VtZW50IGlzIHJlYWQgc3VjY2Vzc2Z1bGx5XG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Mb2FkU3VjY2VzcygpIHtcbiAgICAgICAgaWYgKCFwZGYpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uTG9hZFN1Y2Nlc3NQcm9wcykge1xuICAgICAgICAgICAgb25Mb2FkU3VjY2Vzc1Byb3BzKHBkZik7XG4gICAgICAgIH1cbiAgICAgICAgcGFnZXMuY3VycmVudCA9IG5ldyBBcnJheShwZGYubnVtUGFnZXMpO1xuICAgICAgICBsaW5rU2VydmljZS5jdXJyZW50LnNldERvY3VtZW50KHBkZik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgZG9jdW1lbnQgZmFpbGVkIHRvIHJlYWQgc3VjY2Vzc2Z1bGx5XG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Mb2FkRXJyb3IoKSB7XG4gICAgICAgIGlmICghcGRmRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyhmYWxzZSwgcGRmRXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvbkxvYWRFcnJvclByb3BzKSB7XG4gICAgICAgICAgICBvbkxvYWRFcnJvclByb3BzKHBkZkVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiB1c2VFZmZlY3QgaW50ZW50aW9uYWxseSB0cmlnZ2VyZWQgb24gc291cmNlIGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiByZXNldERvY3VtZW50KCkge1xuICAgICAgICBwZGZEaXNwYXRjaCh7IHR5cGU6ICdSRVNFVCcgfSk7XG4gICAgfSwgW3BkZkRpc3BhdGNoLCBzb3VyY2VdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBPbW1pdHRlZCBjYWxsYmFja3Mgc28gdGhleSBhcmUgbm90IGNhbGxlZCBldmVyeSB0aW1lIHRoZXkgY2hhbmdlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIGxvYWREb2N1bWVudCgpIHtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2N1bWVudEluaXRQYXJhbXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZSksIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBkZXN0cm95YWJsZSA9IHBkZmpzLmdldERvY3VtZW50KGRvY3VtZW50SW5pdFBhcmFtcyk7XG4gICAgICAgIGlmIChvbkxvYWRQcm9ncmVzcykge1xuICAgICAgICAgICAgZGVzdHJveWFibGUub25Qcm9ncmVzcyA9IG9uTG9hZFByb2dyZXNzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvblBhc3N3b3JkKSB7XG4gICAgICAgICAgICBkZXN0cm95YWJsZS5vblBhc3N3b3JkID0gb25QYXNzd29yZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2FkaW5nVGFzayA9IGRlc3Ryb3lhYmxlO1xuICAgICAgICBsb2FkaW5nVGFzay5wcm9taXNlXG4gICAgICAgICAgICAudGhlbigobmV4dFBkZikgPT4ge1xuICAgICAgICAgICAgcGRmRGlzcGF0Y2goeyB0eXBlOiAnUkVTT0xWRScsIHZhbHVlOiBuZXh0UGRmIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYgKGxvYWRpbmdUYXNrLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBkZkRpc3BhdGNoKHsgdHlwZTogJ1JFSkVDVCcsIGVycm9yIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGxvYWRpbmdUYXNrLmRlc3Ryb3koKTtcbiAgICAgICAgfTtcbiAgICB9LCBbb3B0aW9ucywgcGRmRGlzcGF0Y2gsIHNvdXJjZV0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHBkZiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGRmID09PSBmYWxzZSkge1xuICAgICAgICAgICAgb25Mb2FkRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvbkxvYWRTdWNjZXNzKCk7XG4gICAgfSwgW3BkZl0pO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiBzZXR1cExpbmtTZXJ2aWNlKCkge1xuICAgICAgICBsaW5rU2VydmljZS5jdXJyZW50LnNldFZpZXdlcih2aWV3ZXIuY3VycmVudCk7XG4gICAgICAgIGxpbmtTZXJ2aWNlLmN1cnJlbnQuc2V0RXh0ZXJuYWxMaW5rUmVsKGV4dGVybmFsTGlua1JlbCk7XG4gICAgICAgIGxpbmtTZXJ2aWNlLmN1cnJlbnQuc2V0RXh0ZXJuYWxMaW5rVGFyZ2V0KGV4dGVybmFsTGlua1RhcmdldCk7XG4gICAgfSwgW2V4dGVybmFsTGlua1JlbCwgZXh0ZXJuYWxMaW5rVGFyZ2V0XSk7XG4gICAgY29uc3QgcmVnaXN0ZXJQYWdlID0gdXNlQ2FsbGJhY2soKHBhZ2VJbmRleCwgcmVmKSA9PiB7XG4gICAgICAgIHBhZ2VzLmN1cnJlbnRbcGFnZUluZGV4XSA9IHJlZjtcbiAgICB9LCBbXSk7XG4gICAgY29uc3QgdW5yZWdpc3RlclBhZ2UgPSB1c2VDYWxsYmFjaygocGFnZUluZGV4KSA9PiB7XG4gICAgICAgIGRlbGV0ZSBwYWdlcy5jdXJyZW50W3BhZ2VJbmRleF07XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IGNoaWxkQ29udGV4dCA9IHVzZU1lbW8oKCkgPT4gKHtcbiAgICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoLFxuICAgICAgICBsaW5rU2VydmljZTogbGlua1NlcnZpY2UuY3VycmVudCxcbiAgICAgICAgb25JdGVtQ2xpY2ssXG4gICAgICAgIHBkZixcbiAgICAgICAgcmVnaXN0ZXJQYWdlLFxuICAgICAgICByZW5kZXJNb2RlLFxuICAgICAgICByb3RhdGUsXG4gICAgICAgIHVucmVnaXN0ZXJQYWdlLFxuICAgIH0pLCBbaW1hZ2VSZXNvdXJjZXNQYXRoLCBvbkl0ZW1DbGljaywgcGRmLCByZWdpc3RlclBhZ2UsIHJlbmRlck1vZGUsIHJvdGF0ZSwgdW5yZWdpc3RlclBhZ2VdKTtcbiAgICBjb25zdCBldmVudFByb3BzID0gdXNlTWVtbygoKSA9PiBtYWtlRXZlbnRQcm9wcyhvdGhlclByb3BzLCAoKSA9PiBwZGYpLCBcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBGSVhNRVxuICAgIFtvdGhlclByb3BzLCBwZGZdKTtcbiAgICBmdW5jdGlvbiByZW5kZXJDaGlsZHJlbigpIHtcbiAgICAgICAgcmV0dXJuIF9qc3goRG9jdW1lbnRDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBjaGlsZENvbnRleHQsIGNoaWxkcmVuOiBjaGlsZHJlbiB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVuZGVyQ29udGVudCgpIHtcbiAgICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gX2pzeChNZXNzYWdlLCB7IHR5cGU6IFwibm8tZGF0YVwiLCBjaGlsZHJlbjogdHlwZW9mIG5vRGF0YSA9PT0gJ2Z1bmN0aW9uJyA/IG5vRGF0YSgpIDogbm9EYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZGYgPT09IHVuZGVmaW5lZCB8fCBwZGYgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAoX2pzeChNZXNzYWdlLCB7IHR5cGU6IFwibG9hZGluZ1wiLCBjaGlsZHJlbjogdHlwZW9mIGxvYWRpbmcgPT09ICdmdW5jdGlvbicgPyBsb2FkaW5nKCkgOiBsb2FkaW5nIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGRmID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9qc3goTWVzc2FnZSwgeyB0eXBlOiBcImVycm9yXCIsIGNoaWxkcmVuOiB0eXBlb2YgZXJyb3IgPT09ICdmdW5jdGlvbicgPyBlcnJvcigpIDogZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlckNoaWxkcmVuKCk7XG4gICAgfVxuICAgIHJldHVybiAoX2pzeChcImRpdlwiLCBPYmplY3QuYXNzaWduKHsgY2xhc3NOYW1lOiBjbHN4KCdyZWFjdC1wZGZfX0RvY3VtZW50JywgY2xhc3NOYW1lKSwgXG4gICAgICAgIC8vIEFzc2VydGlvbiBpcyBuZWVkZWQgZm9yIFJlYWN0IDE4IGNvbXBhdGliaWxpdHlcbiAgICAgICAgcmVmOiBpbnB1dFJlZiwgc3R5bGU6IHtcbiAgICAgICAgICAgIFsnLS1zY2FsZS1mYWN0b3InXTogJzEnLFxuICAgICAgICB9IH0sIGV2ZW50UHJvcHMsIHsgY2hpbGRyZW46IHJlbmRlckNvbnRlbnQoKSB9KSkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCBEb2N1bWVudDtcbiIsIid1c2UgY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5jb25zdCBkb2N1bWVudENvbnRleHQgPSBjcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgZG9jdW1lbnRDb250ZXh0O1xuIiwiLyogQ29weXJpZ2h0IDIwMTUgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ3RpbnktaW52YXJpYW50JztcbmNvbnN0IERFRkFVTFRfTElOS19SRUwgPSAnbm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvdyc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaW5rU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxMaW5rUmVsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmV4dGVybmFsTGlua1RhcmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBkZkRvY3VtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnBkZlZpZXdlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpIHtcbiAgICAgICAgdGhpcy5wZGZEb2N1bWVudCA9IHBkZkRvY3VtZW50O1xuICAgIH1cbiAgICBzZXRWaWV3ZXIocGRmVmlld2VyKSB7XG4gICAgICAgIHRoaXMucGRmVmlld2VyID0gcGRmVmlld2VyO1xuICAgIH1cbiAgICBzZXRFeHRlcm5hbExpbmtSZWwoZXh0ZXJuYWxMaW5rUmVsKSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxMaW5rUmVsID0gZXh0ZXJuYWxMaW5rUmVsO1xuICAgIH1cbiAgICBzZXRFeHRlcm5hbExpbmtUYXJnZXQoZXh0ZXJuYWxMaW5rVGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxMaW5rVGFyZ2V0ID0gZXh0ZXJuYWxMaW5rVGFyZ2V0O1xuICAgIH1cbiAgICBzZXRIaXN0b3J5KCkge1xuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGVtcHR5XG4gICAgfVxuICAgIGdldCBwYWdlc0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXMgOiAwO1xuICAgIH1cbiAgICBnZXQgcGFnZSgpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMucGRmVmlld2VyLCAnUERGIHZpZXdlciBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlciB8fCAwO1xuICAgIH1cbiAgICBzZXQgcGFnZSh2YWx1ZSkge1xuICAgICAgICBpbnZhcmlhbnQodGhpcy5wZGZWaWV3ZXIsICdQREYgdmlld2VyIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgdGhpcy5wZGZWaWV3ZXIuY3VycmVudFBhZ2VOdW1iZXIgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHJvdGF0aW9uKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgc2V0IHJvdGF0aW9uKHZhbHVlKSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgZW1wdHlcbiAgICB9XG4gICAgZ29Ub0Rlc3RpbmF0aW9uKGRlc3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpbnZhcmlhbnQodGhpcy5wZGZEb2N1bWVudCwgJ1BERiBkb2N1bWVudCBub3QgbG9hZGVkLicpO1xuICAgICAgICAgICAgaW52YXJpYW50KGRlc3QsICdEZXN0aW5hdGlvbiBpcyBub3Qgc3BlY2lmaWVkLicpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMucGRmRG9jdW1lbnQuZ2V0RGVzdGluYXRpb24oZGVzdCkudGhlbihyZXNvbHZlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGVzdCkpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGRlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVzdC50aGVuKHJlc29sdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKChleHBsaWNpdERlc3QpID0+IHtcbiAgICAgICAgICAgIGludmFyaWFudChBcnJheS5pc0FycmF5KGV4cGxpY2l0RGVzdCksIGBcIiR7ZXhwbGljaXREZXN0fVwiIGlzIG5vdCBhIHZhbGlkIGRlc3RpbmF0aW9uIGFycmF5LmApO1xuICAgICAgICAgICAgY29uc3QgZGVzdFJlZiA9IGV4cGxpY2l0RGVzdFswXTtcbiAgICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgaW52YXJpYW50KHRoaXMucGRmRG9jdW1lbnQsICdQREYgZG9jdW1lbnQgbm90IGxvYWRlZC4nKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVzdFJlZiBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBkZkRvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFnZUluZGV4KGRlc3RSZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocGFnZUluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHBhZ2VJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52YXJpYW50KGZhbHNlLCBgXCIke2Rlc3RSZWZ9XCIgaXMgbm90IGEgdmFsaWQgcGFnZSByZWZlcmVuY2UuYCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGVzdFJlZiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkZXN0UmVmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGludmFyaWFudChmYWxzZSwgYFwiJHtkZXN0UmVmfVwiIGlzIG5vdCBhIHZhbGlkIGRlc3RpbmF0aW9uIHJlZmVyZW5jZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS50aGVuKChwYWdlSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlTnVtYmVyID0gcGFnZUluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQodGhpcy5wZGZWaWV3ZXIsICdQREYgdmlld2VyIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgICAgICAgICBpbnZhcmlhbnQocGFnZU51bWJlciA+PSAxICYmIHBhZ2VOdW1iZXIgPD0gdGhpcy5wYWdlc0NvdW50LCBgXCIke3BhZ2VOdW1iZXJ9XCIgaXMgbm90IGEgdmFsaWQgcGFnZSBudW1iZXIuYCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wZGZWaWV3ZXIuc2Nyb2xsUGFnZUludG9WaWV3KHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdDogZXhwbGljaXREZXN0LFxuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5hdmlnYXRlVG8oZGVzdCkge1xuICAgICAgICB0aGlzLmdvVG9EZXN0aW5hdGlvbihkZXN0KTtcbiAgICB9XG4gICAgZ29Ub1BhZ2UocGFnZU51bWJlcikge1xuICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBwYWdlTnVtYmVyIC0gMTtcbiAgICAgICAgaW52YXJpYW50KHRoaXMucGRmVmlld2VyLCAnUERGIHZpZXdlciBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIGludmFyaWFudChwYWdlTnVtYmVyID49IDEgJiYgcGFnZU51bWJlciA8PSB0aGlzLnBhZ2VzQ291bnQsIGBcIiR7cGFnZU51bWJlcn1cIiBpcyBub3QgYSB2YWxpZCBwYWdlIG51bWJlci5gKTtcbiAgICAgICAgdGhpcy5wZGZWaWV3ZXIuc2Nyb2xsUGFnZUludG9WaWV3KHtcbiAgICAgICAgICAgIHBhZ2VJbmRleCxcbiAgICAgICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhZGRMaW5rQXR0cmlidXRlcyhsaW5rLCB1cmwsIG5ld1dpbmRvdykge1xuICAgICAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgICAgIGxpbmsucmVsID0gdGhpcy5leHRlcm5hbExpbmtSZWwgfHwgREVGQVVMVF9MSU5LX1JFTDtcbiAgICAgICAgbGluay50YXJnZXQgPSBuZXdXaW5kb3cgPyAnX2JsYW5rJyA6IHRoaXMuZXh0ZXJuYWxMaW5rVGFyZ2V0IHx8ICcnO1xuICAgIH1cbiAgICBnZXREZXN0aW5hdGlvbkhhc2goKSB7XG4gICAgICAgIHJldHVybiAnIyc7XG4gICAgfVxuICAgIGdldEFuY2hvclVybCgpIHtcbiAgICAgICAgcmV0dXJuICcjJztcbiAgICB9XG4gICAgc2V0SGFzaCgpIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIH1cbiAgICBleGVjdXRlTmFtZWRBY3Rpb24oKSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgZW1wdHlcbiAgICB9XG4gICAgY2FjaGVQYWdlUmVmKCkge1xuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGVtcHR5XG4gICAgfVxuICAgIGlzUGFnZVZpc2libGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpc1BhZ2VDYWNoZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBleGVjdXRlU2V0T0NHU3RhdGUoKSB7XG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgZW1wdHlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTWVzc2FnZSh7IGNoaWxkcmVuLCB0eXBlIH0pIHtcbiAgICByZXR1cm4gX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogYHJlYWN0LXBkZl9fbWVzc2FnZSByZWFjdC1wZGZfX21lc3NhZ2UtLSR7dHlwZX1gLCBjaGlsZHJlbjogY2hpbGRyZW4gfSk7XG59XG4iLCIndXNlIGNsaWVudCc7XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFrZUNhbmNlbGxhYmxlIGZyb20gJ21ha2UtY2FuY2VsbGFibGUtcHJvbWlzZSc7XG5pbXBvcnQgbWFrZUV2ZW50UHJvcHMgZnJvbSAnbWFrZS1ldmVudC1wcm9wcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBtZXJnZVJlZnMgZnJvbSAnbWVyZ2UtcmVmcyc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ3RpbnktaW52YXJpYW50JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0IFBhZ2VDb250ZXh0IGZyb20gJy4vUGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSAnLi9NZXNzYWdlLmpzJztcbmltcG9ydCBDYW52YXMgZnJvbSAnLi9QYWdlL0NhbnZhcy5qcyc7XG5pbXBvcnQgVGV4dExheWVyIGZyb20gJy4vUGFnZS9UZXh0TGF5ZXIuanMnO1xuaW1wb3J0IEFubm90YXRpb25MYXllciBmcm9tICcuL1BhZ2UvQW5ub3RhdGlvbkxheWVyLmpzJztcbmltcG9ydCB7IGNhbmNlbFJ1bm5pbmdUYXNrLCBpc1Byb3ZpZGVkLCBtYWtlUGFnZUNhbGxiYWNrIH0gZnJvbSAnLi9zaGFyZWQvdXRpbHMuanMnO1xuaW1wb3J0IHVzZURvY3VtZW50Q29udGV4dCBmcm9tICcuL3NoYXJlZC9ob29rcy91c2VEb2N1bWVudENvbnRleHQuanMnO1xuaW1wb3J0IHVzZVJlc29sdmVyIGZyb20gJy4vc2hhcmVkL2hvb2tzL3VzZVJlc29sdmVyLmpzJztcbmNvbnN0IGRlZmF1bHRTY2FsZSA9IDE7XG4vKipcbiAqIERpc3BsYXlzIGEgcGFnZS5cbiAqXG4gKiBTaG91bGQgYmUgcGxhY2VkIGluc2lkZSBgPERvY3VtZW50IC8+YC4gQWx0ZXJuYXRpdmVseSwgaXQgY2FuIGhhdmUgYHBkZmAgcHJvcCBwYXNzZWQsIHdoaWNoIGNhbiBiZSBvYnRhaW5lZCBmcm9tIGA8RG9jdW1lbnQgLz5gJ3MgYG9uTG9hZFN1Y2Nlc3NgIGNhbGxiYWNrIGZ1bmN0aW9uLCBob3dldmVyIHNvbWUgYWR2YW5jZWQgZnVuY3Rpb25zIGxpa2UgbGlua2luZyBiZXR3ZWVuIHBhZ2VzIGluc2lkZSBhIGRvY3VtZW50IG1heSBub3QgYmUgd29ya2luZyBjb3JyZWN0bHkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFBhZ2UocHJvcHMpIHtcbiAgICBjb25zdCBkb2N1bWVudENvbnRleHQgPSB1c2VEb2N1bWVudENvbnRleHQoKTtcbiAgICBjb25zdCBtZXJnZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZG9jdW1lbnRDb250ZXh0KSwgcHJvcHMpO1xuICAgIGNvbnN0IHsgX2NsYXNzTmFtZSA9ICdyZWFjdC1wZGZfX1BhZ2UnLCBfZW5hYmxlUmVnaXN0ZXJVbnJlZ2lzdGVyUGFnZSA9IHRydWUsIGNhbnZhc0JhY2tncm91bmQsIGNhbnZhc1JlZiwgY2hpbGRyZW4sIGNsYXNzTmFtZSwgY3VzdG9tUmVuZGVyZXI6IEN1c3RvbVJlbmRlcmVyLCBjdXN0b21UZXh0UmVuZGVyZXIsIGRldmljZVBpeGVsUmF0aW8sIGVycm9yID0gJ0ZhaWxlZCB0byBsb2FkIHRoZSBwYWdlLicsIGhlaWdodCwgaW5wdXRSZWYsIGxvYWRpbmcgPSAnTG9hZGluZyBwYWdl4oCmJywgbm9EYXRhID0gJ05vIHBhZ2Ugc3BlY2lmaWVkLicsIG9uR2V0QW5ub3RhdGlvbnNFcnJvcjogb25HZXRBbm5vdGF0aW9uc0Vycm9yUHJvcHMsIG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzOiBvbkdldEFubm90YXRpb25zU3VjY2Vzc1Byb3BzLCBvbkdldFN0cnVjdFRyZWVFcnJvcjogb25HZXRTdHJ1Y3RUcmVlRXJyb3JQcm9wcywgb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzczogb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzc1Byb3BzLCBvbkdldFRleHRFcnJvcjogb25HZXRUZXh0RXJyb3JQcm9wcywgb25HZXRUZXh0U3VjY2Vzczogb25HZXRUZXh0U3VjY2Vzc1Byb3BzLCBvbkxvYWRFcnJvcjogb25Mb2FkRXJyb3JQcm9wcywgb25Mb2FkU3VjY2Vzczogb25Mb2FkU3VjY2Vzc1Byb3BzLCBvblJlbmRlckFubm90YXRpb25MYXllckVycm9yOiBvblJlbmRlckFubm90YXRpb25MYXllckVycm9yUHJvcHMsIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyU3VjY2Vzczogb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzUHJvcHMsIG9uUmVuZGVyRXJyb3I6IG9uUmVuZGVyRXJyb3JQcm9wcywgb25SZW5kZXJTdWNjZXNzOiBvblJlbmRlclN1Y2Nlc3NQcm9wcywgb25SZW5kZXJUZXh0TGF5ZXJFcnJvcjogb25SZW5kZXJUZXh0TGF5ZXJFcnJvclByb3BzLCBvblJlbmRlclRleHRMYXllclN1Y2Nlc3M6IG9uUmVuZGVyVGV4dExheWVyU3VjY2Vzc1Byb3BzLCBwYWdlSW5kZXg6IHBhZ2VJbmRleFByb3BzLCBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyUHJvcHMsIHBkZiwgcmVnaXN0ZXJQYWdlLCByZW5kZXJBbm5vdGF0aW9uTGF5ZXI6IHJlbmRlckFubm90YXRpb25MYXllclByb3BzID0gdHJ1ZSwgcmVuZGVyRm9ybXMgPSBmYWxzZSwgcmVuZGVyTW9kZSA9ICdjYW52YXMnLCByZW5kZXJUZXh0TGF5ZXI6IHJlbmRlclRleHRMYXllclByb3BzID0gdHJ1ZSwgcm90YXRlOiByb3RhdGVQcm9wcywgc2NhbGU6IHNjYWxlUHJvcHMgPSBkZWZhdWx0U2NhbGUsIHVucmVnaXN0ZXJQYWdlLCB3aWR0aCB9ID0gbWVyZ2VkUHJvcHMsIG90aGVyUHJvcHMgPSBfX3Jlc3QobWVyZ2VkUHJvcHMsIFtcIl9jbGFzc05hbWVcIiwgXCJfZW5hYmxlUmVnaXN0ZXJVbnJlZ2lzdGVyUGFnZVwiLCBcImNhbnZhc0JhY2tncm91bmRcIiwgXCJjYW52YXNSZWZcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImN1c3RvbVJlbmRlcmVyXCIsIFwiY3VzdG9tVGV4dFJlbmRlcmVyXCIsIFwiZGV2aWNlUGl4ZWxSYXRpb1wiLCBcImVycm9yXCIsIFwiaGVpZ2h0XCIsIFwiaW5wdXRSZWZcIiwgXCJsb2FkaW5nXCIsIFwibm9EYXRhXCIsIFwib25HZXRBbm5vdGF0aW9uc0Vycm9yXCIsIFwib25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3NcIiwgXCJvbkdldFN0cnVjdFRyZWVFcnJvclwiLCBcIm9uR2V0U3RydWN0VHJlZVN1Y2Nlc3NcIiwgXCJvbkdldFRleHRFcnJvclwiLCBcIm9uR2V0VGV4dFN1Y2Nlc3NcIiwgXCJvbkxvYWRFcnJvclwiLCBcIm9uTG9hZFN1Y2Nlc3NcIiwgXCJvblJlbmRlckFubm90YXRpb25MYXllckVycm9yXCIsIFwib25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzXCIsIFwib25SZW5kZXJFcnJvclwiLCBcIm9uUmVuZGVyU3VjY2Vzc1wiLCBcIm9uUmVuZGVyVGV4dExheWVyRXJyb3JcIiwgXCJvblJlbmRlclRleHRMYXllclN1Y2Nlc3NcIiwgXCJwYWdlSW5kZXhcIiwgXCJwYWdlTnVtYmVyXCIsIFwicGRmXCIsIFwicmVnaXN0ZXJQYWdlXCIsIFwicmVuZGVyQW5ub3RhdGlvbkxheWVyXCIsIFwicmVuZGVyRm9ybXNcIiwgXCJyZW5kZXJNb2RlXCIsIFwicmVuZGVyVGV4dExheWVyXCIsIFwicm90YXRlXCIsIFwic2NhbGVcIiwgXCJ1bnJlZ2lzdGVyUGFnZVwiLCBcIndpZHRoXCJdKTtcbiAgICBjb25zdCBbcGFnZVN0YXRlLCBwYWdlRGlzcGF0Y2hdID0gdXNlUmVzb2x2ZXIoKTtcbiAgICBjb25zdCB7IHZhbHVlOiBwYWdlLCBlcnJvcjogcGFnZUVycm9yIH0gPSBwYWdlU3RhdGU7XG4gICAgY29uc3QgcGFnZUVsZW1lbnQgPSB1c2VSZWYobnVsbCk7XG4gICAgaW52YXJpYW50KHBkZiwgJ0F0dGVtcHRlZCB0byBsb2FkIGEgcGFnZSwgYnV0IG5vIGRvY3VtZW50IHdhcyBzcGVjaWZpZWQuIFdyYXAgPFBhZ2UgLz4gaW4gYSA8RG9jdW1lbnQgLz4gb3IgcGFzcyBleHBsaWNpdCBgcGRmYCBwcm9wLicpO1xuICAgIGNvbnN0IHBhZ2VJbmRleCA9IGlzUHJvdmlkZWQocGFnZU51bWJlclByb3BzKSA/IHBhZ2VOdW1iZXJQcm9wcyAtIDEgOiBwYWdlSW5kZXhQcm9wcyAhPT0gbnVsbCAmJiBwYWdlSW5kZXhQcm9wcyAhPT0gdm9pZCAwID8gcGFnZUluZGV4UHJvcHMgOiBudWxsO1xuICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSBwYWdlTnVtYmVyUHJvcHMgIT09IG51bGwgJiYgcGFnZU51bWJlclByb3BzICE9PSB2b2lkIDAgPyBwYWdlTnVtYmVyUHJvcHMgOiAoaXNQcm92aWRlZChwYWdlSW5kZXhQcm9wcykgPyBwYWdlSW5kZXhQcm9wcyArIDEgOiBudWxsKTtcbiAgICBjb25zdCByb3RhdGUgPSByb3RhdGVQcm9wcyAhPT0gbnVsbCAmJiByb3RhdGVQcm9wcyAhPT0gdm9pZCAwID8gcm90YXRlUHJvcHMgOiAocGFnZSA/IHBhZ2Uucm90YXRlIDogbnVsbCk7XG4gICAgY29uc3Qgc2NhbGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBCZSBkZWZhdWx0LCB3ZSdsbCByZW5kZXIgcGFnZSBhdCAxMDAlICogc2NhbGUgd2lkdGguXG4gICAgICAgIGxldCBwYWdlU2NhbGUgPSAxO1xuICAgICAgICAvLyBQYXNzaW5nIHNjYWxlIGV4cGxpY2l0bHkgbnVsbCB3b3VsZCBjYXVzZSB0aGUgcGFnZSBub3QgdG8gcmVuZGVyXG4gICAgICAgIGNvbnN0IHNjYWxlV2l0aERlZmF1bHQgPSBzY2FsZVByb3BzICE9PSBudWxsICYmIHNjYWxlUHJvcHMgIT09IHZvaWQgMCA/IHNjYWxlUHJvcHMgOiBkZWZhdWx0U2NhbGU7XG4gICAgICAgIC8vIElmIHdpZHRoL2hlaWdodCBpcyBkZWZpbmVkLCBjYWxjdWxhdGUgdGhlIHNjYWxlIG9mIHRoZSBwYWdlIHNvIGl0IGNvdWxkIGJlIG9mIGRlc2lyZWQgd2lkdGguXG4gICAgICAgIGlmICh3aWR0aCB8fCBoZWlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh7IHNjYWxlOiAxLCByb3RhdGlvbjogcm90YXRlIH0pO1xuICAgICAgICAgICAgaWYgKHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgcGFnZVNjYWxlID0gd2lkdGggLyB2aWV3cG9ydC53aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhlaWdodCkge1xuICAgICAgICAgICAgICAgIHBhZ2VTY2FsZSA9IGhlaWdodCAvIHZpZXdwb3J0LmhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NhbGVXaXRoRGVmYXVsdCAqIHBhZ2VTY2FsZTtcbiAgICB9LCBbaGVpZ2h0LCBwYWdlLCByb3RhdGUsIHNjYWxlUHJvcHMsIHdpZHRoXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdXNlRWZmZWN0IGludGVudGlvbmFsbHkgdHJpZ2dlcmVkIG9uIHBkZiBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gaG9vaygpIHtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNQcm92aWRlZChwYWdlSW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX2VuYWJsZVJlZ2lzdGVyVW5yZWdpc3RlclBhZ2UgJiYgdW5yZWdpc3RlclBhZ2UpIHtcbiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyUGFnZShwYWdlSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sIFtfZW5hYmxlUmVnaXN0ZXJVbnJlZ2lzdGVyUGFnZSwgcGRmLCBwYWdlSW5kZXgsIHVucmVnaXN0ZXJQYWdlXSk7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBwYWdlIGlzIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbkxvYWRTdWNjZXNzKCkge1xuICAgICAgICBpZiAob25Mb2FkU3VjY2Vzc1Byb3BzKSB7XG4gICAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXNjYWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvbkxvYWRTdWNjZXNzUHJvcHMobWFrZVBhZ2VDYWxsYmFjayhwYWdlLCBzY2FsZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfZW5hYmxlUmVnaXN0ZXJVbnJlZ2lzdGVyUGFnZSAmJiByZWdpc3RlclBhZ2UpIHtcbiAgICAgICAgICAgIGlmICghaXNQcm92aWRlZChwYWdlSW5kZXgpIHx8ICFwYWdlRWxlbWVudC5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWdpc3RlclBhZ2UocGFnZUluZGV4LCBwYWdlRWxlbWVudC5jdXJyZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHBhZ2UgZmFpbGVkIHRvIGxvYWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbkxvYWRFcnJvcigpIHtcbiAgICAgICAgaWYgKCFwYWdlRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyhmYWxzZSwgcGFnZUVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAob25Mb2FkRXJyb3JQcm9wcykge1xuICAgICAgICAgICAgb25Mb2FkRXJyb3JQcm9wcyhwYWdlRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IHVzZUVmZmVjdCBpbnRlbnRpb25hbGx5IHRyaWdnZXJlZCBvbiBwZGYgYW5kIHBhZ2VJbmRleCBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gcmVzZXRQYWdlKCkge1xuICAgICAgICBwYWdlRGlzcGF0Y2goeyB0eXBlOiAnUkVTRVQnIH0pO1xuICAgIH0sIFtwYWdlRGlzcGF0Y2gsIHBkZiwgcGFnZUluZGV4XSk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIGxvYWRQYWdlKCkge1xuICAgICAgICBpZiAoIXBkZiB8fCAhcGFnZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbmNlbGxhYmxlID0gbWFrZUNhbmNlbGxhYmxlKHBkZi5nZXRQYWdlKHBhZ2VOdW1iZXIpKTtcbiAgICAgICAgY29uc3QgcnVubmluZ1Rhc2sgPSBjYW5jZWxsYWJsZTtcbiAgICAgICAgY2FuY2VsbGFibGUucHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKG5leHRQYWdlKSA9PiB7XG4gICAgICAgICAgICBwYWdlRGlzcGF0Y2goeyB0eXBlOiAnUkVTT0xWRScsIHZhbHVlOiBuZXh0UGFnZSB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHBhZ2VEaXNwYXRjaCh7IHR5cGU6ICdSRUpFQ1QnLCBlcnJvciB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiBjYW5jZWxSdW5uaW5nVGFzayhydW5uaW5nVGFzayk7XG4gICAgfSwgW3BhZ2VEaXNwYXRjaCwgcGRmLCBwYWdlTnVtYmVyXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChwYWdlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG9uTG9hZEVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb25Mb2FkU3VjY2VzcygpO1xuICAgIH0sIFtwYWdlLCBzY2FsZV0pO1xuICAgIGNvbnN0IGNoaWxkQ29udGV4dCA9IHVzZU1lbW8oKCkgPT4gXG4gICAgLy8gVGVjaG5pY2FsbHkgdGhlcmUgY2Fubm90IGJlIHBhZ2Ugd2l0aG91dCBwYWdlSW5kZXgsIHBhZ2VOdW1iZXIsIHJvdGF0ZSBhbmQgc2NhbGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgcGFnZSAmJiBpc1Byb3ZpZGVkKHBhZ2VJbmRleCkgJiYgcGFnZU51bWJlciAmJiBpc1Byb3ZpZGVkKHJvdGF0ZSkgJiYgaXNQcm92aWRlZChzY2FsZSlcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBfY2xhc3NOYW1lLFxuICAgICAgICAgICAgY2FudmFzQmFja2dyb3VuZCxcbiAgICAgICAgICAgIGN1c3RvbVRleHRSZW5kZXJlcixcbiAgICAgICAgICAgIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICBvbkdldEFubm90YXRpb25zRXJyb3I6IG9uR2V0QW5ub3RhdGlvbnNFcnJvclByb3BzLFxuICAgICAgICAgICAgb25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3M6IG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzUHJvcHMsXG4gICAgICAgICAgICBvbkdldFN0cnVjdFRyZWVFcnJvcjogb25HZXRTdHJ1Y3RUcmVlRXJyb3JQcm9wcyxcbiAgICAgICAgICAgIG9uR2V0U3RydWN0VHJlZVN1Y2Nlc3M6IG9uR2V0U3RydWN0VHJlZVN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgICAgIG9uR2V0VGV4dEVycm9yOiBvbkdldFRleHRFcnJvclByb3BzLFxuICAgICAgICAgICAgb25HZXRUZXh0U3VjY2Vzczogb25HZXRUZXh0U3VjY2Vzc1Byb3BzLFxuICAgICAgICAgICAgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvcjogb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvclByb3BzLFxuICAgICAgICAgICAgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzOiBvblJlbmRlckFubm90YXRpb25MYXllclN1Y2Nlc3NQcm9wcyxcbiAgICAgICAgICAgIG9uUmVuZGVyRXJyb3I6IG9uUmVuZGVyRXJyb3JQcm9wcyxcbiAgICAgICAgICAgIG9uUmVuZGVyU3VjY2Vzczogb25SZW5kZXJTdWNjZXNzUHJvcHMsXG4gICAgICAgICAgICBvblJlbmRlclRleHRMYXllckVycm9yOiBvblJlbmRlclRleHRMYXllckVycm9yUHJvcHMsXG4gICAgICAgICAgICBvblJlbmRlclRleHRMYXllclN1Y2Nlc3M6IG9uUmVuZGVyVGV4dExheWVyU3VjY2Vzc1Byb3BzLFxuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIHBhZ2VJbmRleCxcbiAgICAgICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgICAgICByZW5kZXJGb3JtcyxcbiAgICAgICAgICAgIHJlbmRlclRleHRMYXllcjogcmVuZGVyVGV4dExheWVyUHJvcHMsXG4gICAgICAgICAgICByb3RhdGUsXG4gICAgICAgICAgICBzY2FsZSxcbiAgICAgICAgfVxuICAgICAgICA6IG51bGwsIFtcbiAgICAgICAgX2NsYXNzTmFtZSxcbiAgICAgICAgY2FudmFzQmFja2dyb3VuZCxcbiAgICAgICAgY3VzdG9tVGV4dFJlbmRlcmVyLFxuICAgICAgICBkZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICBvbkdldEFubm90YXRpb25zRXJyb3JQcm9wcyxcbiAgICAgICAgb25HZXRBbm5vdGF0aW9uc1N1Y2Nlc3NQcm9wcyxcbiAgICAgICAgb25HZXRTdHJ1Y3RUcmVlRXJyb3JQcm9wcyxcbiAgICAgICAgb25HZXRTdHJ1Y3RUcmVlU3VjY2Vzc1Byb3BzLFxuICAgICAgICBvbkdldFRleHRFcnJvclByb3BzLFxuICAgICAgICBvbkdldFRleHRTdWNjZXNzUHJvcHMsXG4gICAgICAgIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3JQcm9wcyxcbiAgICAgICAgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzUHJvcHMsXG4gICAgICAgIG9uUmVuZGVyRXJyb3JQcm9wcyxcbiAgICAgICAgb25SZW5kZXJTdWNjZXNzUHJvcHMsXG4gICAgICAgIG9uUmVuZGVyVGV4dExheWVyRXJyb3JQcm9wcyxcbiAgICAgICAgb25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzUHJvcHMsXG4gICAgICAgIHBhZ2UsXG4gICAgICAgIHBhZ2VJbmRleCxcbiAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgcmVuZGVyRm9ybXMsXG4gICAgICAgIHJlbmRlclRleHRMYXllclByb3BzLFxuICAgICAgICByb3RhdGUsXG4gICAgICAgIHNjYWxlLFxuICAgIF0pO1xuICAgIGNvbnN0IGV2ZW50UHJvcHMgPSB1c2VNZW1vKCgpID0+IG1ha2VFdmVudFByb3BzKG90aGVyUHJvcHMsICgpID0+IHBhZ2UgPyAoc2NhbGUgPyBtYWtlUGFnZUNhbGxiYWNrKHBhZ2UsIHNjYWxlKSA6IHVuZGVmaW5lZCkgOiBwYWdlKSwgXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogRklYTUVcbiAgICBbb3RoZXJQcm9wcywgcGFnZSwgc2NhbGVdKTtcbiAgICBjb25zdCBwYWdlS2V5ID0gYCR7cGFnZUluZGV4fUAke3NjYWxlfS8ke3JvdGF0ZX1gO1xuICAgIGZ1bmN0aW9uIHJlbmRlck1haW5MYXllcigpIHtcbiAgICAgICAgc3dpdGNoIChyZW5kZXJNb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdjdXN0b20nOiB7XG4gICAgICAgICAgICAgICAgaW52YXJpYW50KEN1c3RvbVJlbmRlcmVyLCBgcmVuZGVyTW9kZSB3YXMgc2V0IHRvIFwiY3VzdG9tXCIsIGJ1dCBubyBjdXN0b21SZW5kZXJlciB3YXMgcGFzc2VkLmApO1xuICAgICAgICAgICAgICAgIHJldHVybiBfanN4KEN1c3RvbVJlbmRlcmVyLCB7fSwgYCR7cGFnZUtleX1fY3VzdG9tYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdub25lJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNhc2UgJ2NhbnZhcyc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBfanN4KENhbnZhcywgeyBjYW52YXNSZWY6IGNhbnZhc1JlZiB9LCBgJHtwYWdlS2V5fV9jYW52YXNgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJUZXh0TGF5ZXIoKSB7XG4gICAgICAgIGlmICghcmVuZGVyVGV4dExheWVyUHJvcHMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfanN4KFRleHRMYXllciwge30sIGAke3BhZ2VLZXl9X3RleHRgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVuZGVyQW5ub3RhdGlvbkxheWVyKCkge1xuICAgICAgICBpZiAoIXJlbmRlckFubm90YXRpb25MYXllclByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgb2Ygbm93LCBQREYuanMgMi4wLjk0MyByZXR1cm5zIHdhcm5pbmdzIG9uIHVuaW1wbGVtZW50ZWQgYW5ub3RhdGlvbnMgaW4gU1ZHIG1vZGUuXG4gICAgICAgICAqIFRoZXJlZm9yZSwgYXMgYSBmYWxsYmFjaywgd2UgcmVuZGVyIFwidHJhZGl0aW9uYWxcIiBBbm5vdGF0aW9uTGF5ZXIgY29tcG9uZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIF9qc3goQW5ub3RhdGlvbkxheWVyLCB7fSwgYCR7cGFnZUtleX1fYW5ub3RhdGlvbnNgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVuZGVyQ2hpbGRyZW4oKSB7XG4gICAgICAgIHJldHVybiAoX2pzeHMoUGFnZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNoaWxkQ29udGV4dCwgY2hpbGRyZW46IFtyZW5kZXJNYWluTGF5ZXIoKSwgcmVuZGVyVGV4dExheWVyKCksIHJlbmRlckFubm90YXRpb25MYXllcigpLCBjaGlsZHJlbl0gfSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJDb250ZW50KCkge1xuICAgICAgICBpZiAoIXBhZ2VOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBfanN4KE1lc3NhZ2UsIHsgdHlwZTogXCJuby1kYXRhXCIsIGNoaWxkcmVuOiB0eXBlb2Ygbm9EYXRhID09PSAnZnVuY3Rpb24nID8gbm9EYXRhKCkgOiBub0RhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBkZiA9PT0gbnVsbCB8fCBwYWdlID09PSB1bmRlZmluZWQgfHwgcGFnZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIChfanN4KE1lc3NhZ2UsIHsgdHlwZTogXCJsb2FkaW5nXCIsIGNoaWxkcmVuOiB0eXBlb2YgbG9hZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IGxvYWRpbmcoKSA6IGxvYWRpbmcgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZGYgPT09IGZhbHNlIHx8IHBhZ2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gX2pzeChNZXNzYWdlLCB7IHR5cGU6IFwiZXJyb3JcIiwgY2hpbGRyZW46IHR5cGVvZiBlcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IGVycm9yKCkgOiBlcnJvciB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVuZGVyQ2hpbGRyZW4oKTtcbiAgICB9XG4gICAgcmV0dXJuIChfanN4KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oeyBjbGFzc05hbWU6IGNsc3goX2NsYXNzTmFtZSwgY2xhc3NOYW1lKSwgXCJkYXRhLXBhZ2UtbnVtYmVyXCI6IHBhZ2VOdW1iZXIsIFxuICAgICAgICAvLyBBc3NlcnRpb24gaXMgbmVlZGVkIGZvciBSZWFjdCAxOCBjb21wYXRpYmlsaXR5XG4gICAgICAgIHJlZjogbWVyZ2VSZWZzKGlucHV0UmVmLCBwYWdlRWxlbWVudCksIHN0eWxlOiB7XG4gICAgICAgICAgICBbJy0tc2NhbGUtZmFjdG9yJ106IGAke3NjYWxlfWAsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNhbnZhc0JhY2tncm91bmQgfHwgJ3doaXRlJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgICAgbWluV2lkdGg6ICdtaW4tY29udGVudCcsXG4gICAgICAgICAgICBtaW5IZWlnaHQ6ICdtaW4tY29udGVudCcsXG4gICAgICAgIH0gfSwgZXZlbnRQcm9wcywgeyBjaGlsZHJlbjogcmVuZGVyQ29udGVudCgpIH0pKSk7XG59XG4iLCIndXNlIGNsaWVudCc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuY29uc3QgcGFnZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0KG51bGwpO1xuZXhwb3J0IGRlZmF1bHQgcGFnZUNvbnRleHQ7XG4iLCIndXNlIGNsaWVudCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgbWFrZUNhbmNlbGxhYmxlIGZyb20gJ21ha2UtY2FuY2VsbGFibGUtcHJvbWlzZSc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgKiBhcyBwZGZqcyBmcm9tICdwZGZqcy1kaXN0JztcbmltcG9ydCB1c2VEb2N1bWVudENvbnRleHQgZnJvbSAnLi4vc2hhcmVkL2hvb2tzL3VzZURvY3VtZW50Q29udGV4dC5qcyc7XG5pbXBvcnQgdXNlUGFnZUNvbnRleHQgZnJvbSAnLi4vc2hhcmVkL2hvb2tzL3VzZVBhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB1c2VSZXNvbHZlciBmcm9tICcuLi9zaGFyZWQvaG9va3MvdXNlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgY2FuY2VsUnVubmluZ1Rhc2sgfSBmcm9tICcuLi9zaGFyZWQvdXRpbHMuanMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQW5ub3RhdGlvbkxheWVyKCkge1xuICAgIGNvbnN0IGRvY3VtZW50Q29udGV4dCA9IHVzZURvY3VtZW50Q29udGV4dCgpO1xuICAgIGNvbnN0IHBhZ2VDb250ZXh0ID0gdXNlUGFnZUNvbnRleHQoKTtcbiAgICBpbnZhcmlhbnQocGFnZUNvbnRleHQsICdVbmFibGUgdG8gZmluZCBQYWdlIGNvbnRleHQuJyk7XG4gICAgY29uc3QgbWVyZ2VkUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRvY3VtZW50Q29udGV4dCksIHBhZ2VDb250ZXh0KTtcbiAgICBjb25zdCB7IGltYWdlUmVzb3VyY2VzUGF0aCwgbGlua1NlcnZpY2UsIG9uR2V0QW5ub3RhdGlvbnNFcnJvcjogb25HZXRBbm5vdGF0aW9uc0Vycm9yUHJvcHMsIG9uR2V0QW5ub3RhdGlvbnNTdWNjZXNzOiBvbkdldEFubm90YXRpb25zU3VjY2Vzc1Byb3BzLCBvblJlbmRlckFubm90YXRpb25MYXllckVycm9yOiBvblJlbmRlckFubm90YXRpb25MYXllckVycm9yUHJvcHMsIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyU3VjY2Vzczogb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzUHJvcHMsIHBhZ2UsIHBkZiwgcmVuZGVyRm9ybXMsIHJvdGF0ZSwgc2NhbGUgPSAxLCB9ID0gbWVyZ2VkUHJvcHM7XG4gICAgaW52YXJpYW50KHBkZiwgJ0F0dGVtcHRlZCB0byBsb2FkIHBhZ2UgYW5ub3RhdGlvbnMsIGJ1dCBubyBkb2N1bWVudCB3YXMgc3BlY2lmaWVkLiBXcmFwIDxQYWdlIC8+IGluIGEgPERvY3VtZW50IC8+IG9yIHBhc3MgZXhwbGljaXQgYHBkZmAgcHJvcC4nKTtcbiAgICBpbnZhcmlhbnQocGFnZSwgJ0F0dGVtcHRlZCB0byBsb2FkIHBhZ2UgYW5ub3RhdGlvbnMsIGJ1dCBubyBwYWdlIHdhcyBzcGVjaWZpZWQuJyk7XG4gICAgaW52YXJpYW50KGxpbmtTZXJ2aWNlLCAnQXR0ZW1wdGVkIHRvIGxvYWQgcGFnZSBhbm5vdGF0aW9ucywgYnV0IG5vIGxpbmtTZXJ2aWNlIHdhcyBzcGVjaWZpZWQuJyk7XG4gICAgY29uc3QgW2Fubm90YXRpb25zU3RhdGUsIGFubm90YXRpb25zRGlzcGF0Y2hdID0gdXNlUmVzb2x2ZXIoKTtcbiAgICBjb25zdCB7IHZhbHVlOiBhbm5vdGF0aW9ucywgZXJyb3I6IGFubm90YXRpb25zRXJyb3IgfSA9IGFubm90YXRpb25zU3RhdGU7XG4gICAgY29uc3QgbGF5ZXJFbGVtZW50ID0gdXNlUmVmKG51bGwpO1xuICAgIHdhcm5pbmcoTnVtYmVyLnBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoJy0tcmVhY3QtcGRmLWFubm90YXRpb24tbGF5ZXInKSwgMTApID09PSAxLCAnQW5ub3RhdGlvbkxheWVyIHN0eWxlcyBub3QgZm91bmQuIFJlYWQgbW9yZTogaHR0cHM6Ly9naXRodWIuY29tL3dvanRla21hai9yZWFjdC1wZGYjc3VwcG9ydC1mb3ItYW5ub3RhdGlvbnMnKTtcbiAgICBmdW5jdGlvbiBvbkxvYWRTdWNjZXNzKCkge1xuICAgICAgICBpZiAoIWFubm90YXRpb25zKSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbkdldEFubm90YXRpb25zU3VjY2Vzc1Byb3BzKSB7XG4gICAgICAgICAgICBvbkdldEFubm90YXRpb25zU3VjY2Vzc1Byb3BzKGFubm90YXRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvbkxvYWRFcnJvcigpIHtcbiAgICAgICAgaWYgKCFhbm5vdGF0aW9uc0Vycm9yKSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsIGFubm90YXRpb25zRXJyb3IudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChvbkdldEFubm90YXRpb25zRXJyb3JQcm9wcykge1xuICAgICAgICAgICAgb25HZXRBbm5vdGF0aW9uc0Vycm9yUHJvcHMoYW5ub3RhdGlvbnNFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdXNlRWZmZWN0IGludGVudGlvbmFsbHkgdHJpZ2dlcmVkIG9uIHBhZ2UgY2hhbmdlXG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIHJlc2V0QW5ub3RhdGlvbnMoKSB7XG4gICAgICAgIGFubm90YXRpb25zRGlzcGF0Y2goeyB0eXBlOiAnUkVTRVQnIH0pO1xuICAgIH0sIFthbm5vdGF0aW9uc0Rpc3BhdGNoLCBwYWdlXSk7XG4gICAgdXNlRWZmZWN0KGZ1bmN0aW9uIGxvYWRBbm5vdGF0aW9ucygpIHtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FuY2VsbGFibGUgPSBtYWtlQ2FuY2VsbGFibGUocGFnZS5nZXRBbm5vdGF0aW9ucygpKTtcbiAgICAgICAgY29uc3QgcnVubmluZ1Rhc2sgPSBjYW5jZWxsYWJsZTtcbiAgICAgICAgY2FuY2VsbGFibGUucHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKG5leHRBbm5vdGF0aW9ucykgPT4ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnNEaXNwYXRjaCh7IHR5cGU6ICdSRVNPTFZFJywgdmFsdWU6IG5leHRBbm5vdGF0aW9ucyB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGFubm90YXRpb25zRGlzcGF0Y2goeyB0eXBlOiAnUkVKRUNUJywgZXJyb3IgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2FuY2VsUnVubmluZ1Rhc2socnVubmluZ1Rhc2spO1xuICAgICAgICB9O1xuICAgIH0sIFthbm5vdGF0aW9uc0Rpc3BhdGNoLCBwYWdlXSk7XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogT21taXR0ZWQgY2FsbGJhY2tzIHNvIHRoZXkgYXJlIG5vdCBjYWxsZWQgZXZlcnkgdGltZSB0aGV5IGNoYW5nZVxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChhbm5vdGF0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb25zID09PSBmYWxzZSkge1xuICAgICAgICAgICAgb25Mb2FkRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvbkxvYWRTdWNjZXNzKCk7XG4gICAgfSwgW2Fubm90YXRpb25zXSk7XG4gICAgZnVuY3Rpb24gb25SZW5kZXJTdWNjZXNzKCkge1xuICAgICAgICBpZiAob25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJTdWNjZXNzUHJvcHMpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyU3VjY2Vzc1Byb3BzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25SZW5kZXJFcnJvcihlcnJvcikge1xuICAgICAgICB3YXJuaW5nKGZhbHNlLCBgJHtlcnJvcn1gKTtcbiAgICAgICAgaWYgKG9uUmVuZGVyQW5ub3RhdGlvbkxheWVyRXJyb3JQcm9wcykge1xuICAgICAgICAgICAgb25SZW5kZXJBbm5vdGF0aW9uTGF5ZXJFcnJvclByb3BzKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB2aWV3cG9ydCA9IHVzZU1lbW8oKCkgPT4gcGFnZS5nZXRWaWV3cG9ydCh7IHNjYWxlLCByb3RhdGlvbjogcm90YXRlIH0pLCBbcGFnZSwgcm90YXRlLCBzY2FsZV0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gcmVuZGVyQW5ub3RhdGlvbkxheWVyKCkge1xuICAgICAgICBpZiAoIXBkZiB8fCAhcGFnZSB8fCAhbGlua1NlcnZpY2UgfHwgIWFubm90YXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBjdXJyZW50OiBsYXllciB9ID0gbGF5ZXJFbGVtZW50O1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xvbmVkVmlld3BvcnQgPSB2aWV3cG9ydC5jbG9uZSh7IGRvbnRGbGlwOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBhbm5vdGF0aW9uTGF5ZXJQYXJhbWV0ZXJzID0ge1xuICAgICAgICAgICAgYWNjZXNzaWJpbGl0eU1hbmFnZXI6IG51bGwsIC8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgICAgICAgICBhbm5vdGF0aW9uQ2FudmFzTWFwOiBudWxsLCAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpc1xuICAgICAgICAgICAgYW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcjogbnVsbCwgLy8gVE9ETzogSW1wbGVtZW50IHRoaXNcbiAgICAgICAgICAgIGRpdjogbGF5ZXIsXG4gICAgICAgICAgICBsMTBuOiBudWxsLCAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpc1xuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiBjbG9uZWRWaWV3cG9ydCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVuZGVyUGFyYW1ldGVycyA9IHtcbiAgICAgICAgICAgIGFubm90YXRpb25zLFxuICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IHBkZi5hbm5vdGF0aW9uU3RvcmFnZSxcbiAgICAgICAgICAgIGRpdjogbGF5ZXIsXG4gICAgICAgICAgICBpbWFnZVJlc291cmNlc1BhdGgsXG4gICAgICAgICAgICBsaW5rU2VydmljZSxcbiAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICByZW5kZXJGb3JtcyxcbiAgICAgICAgICAgIHZpZXdwb3J0OiBjbG9uZWRWaWV3cG9ydCxcbiAgICAgICAgfTtcbiAgICAgICAgbGF5ZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgcGRmanMuQW5ub3RhdGlvbkxheWVyKGFubm90YXRpb25MYXllclBhcmFtZXRlcnMpLnJlbmRlcihyZW5kZXJQYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIC8vIEludGVudGlvbmFsIGltbWVkaWF0ZSBjYWxsYmFja1xuICAgICAgICAgICAgb25SZW5kZXJTdWNjZXNzKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBvblJlbmRlckVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gVE9ETzogQ2FuY2VsIHJ1bm5pbmcgdGFzaz9cbiAgICAgICAgfTtcbiAgICB9LCBbYW5ub3RhdGlvbnMsIGltYWdlUmVzb3VyY2VzUGF0aCwgbGlua1NlcnZpY2UsIHBhZ2UsIHBkZiwgcmVuZGVyRm9ybXMsIHZpZXdwb3J0XSk7XG4gICAgcmV0dXJuIChfanN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjbHN4KCdyZWFjdC1wZGZfX1BhZ2VfX2Fubm90YXRpb25zJywgJ2Fubm90YXRpb25MYXllcicpLCByZWY6IGxheWVyRWxlbWVudCB9KSk7XG59XG4iLCIndXNlIGNsaWVudCc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1lcmdlUmVmcyBmcm9tICdtZXJnZS1yZWZzJztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgKiBhcyBwZGZqcyBmcm9tICdwZGZqcy1kaXN0JztcbmltcG9ydCBTdHJ1Y3RUcmVlIGZyb20gJy4uL1N0cnVjdFRyZWUuanMnO1xuaW1wb3J0IHVzZVBhZ2VDb250ZXh0IGZyb20gJy4uL3NoYXJlZC9ob29rcy91c2VQYWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBjYW5jZWxSdW5uaW5nVGFzaywgZ2V0RGV2aWNlUGl4ZWxSYXRpbywgaXNDYW5jZWxFeGNlcHRpb24sIG1ha2VQYWdlQ2FsbGJhY2ssIH0gZnJvbSAnLi4vc2hhcmVkL3V0aWxzLmpzJztcbmNvbnN0IEFOTk9UQVRJT05fTU9ERSA9IHBkZmpzLkFubm90YXRpb25Nb2RlO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2FudmFzKHByb3BzKSB7XG4gICAgY29uc3QgcGFnZUNvbnRleHQgPSB1c2VQYWdlQ29udGV4dCgpO1xuICAgIGludmFyaWFudChwYWdlQ29udGV4dCwgJ1VuYWJsZSB0byBmaW5kIFBhZ2UgY29udGV4dC4nKTtcbiAgICBjb25zdCBtZXJnZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFnZUNvbnRleHQpLCBwcm9wcyk7XG4gICAgY29uc3QgeyBfY2xhc3NOYW1lLCBjYW52YXNCYWNrZ3JvdW5kLCBkZXZpY2VQaXhlbFJhdGlvID0gZ2V0RGV2aWNlUGl4ZWxSYXRpbygpLCBvblJlbmRlckVycm9yOiBvblJlbmRlckVycm9yUHJvcHMsIG9uUmVuZGVyU3VjY2Vzczogb25SZW5kZXJTdWNjZXNzUHJvcHMsIHBhZ2UsIHJlbmRlckZvcm1zLCByZW5kZXJUZXh0TGF5ZXIsIHJvdGF0ZSwgc2NhbGUsIH0gPSBtZXJnZWRQcm9wcztcbiAgICBjb25zdCB7IGNhbnZhc1JlZiB9ID0gcHJvcHM7XG4gICAgaW52YXJpYW50KHBhZ2UsICdBdHRlbXB0ZWQgdG8gcmVuZGVyIHBhZ2UgY2FudmFzLCBidXQgbm8gcGFnZSB3YXMgc3BlY2lmaWVkLicpO1xuICAgIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSB1c2VSZWYobnVsbCk7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBwYWdlIGlzIHJlbmRlcmVkIHN1Y2Nlc3NmdWxseS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvblJlbmRlclN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmICghcGFnZSkge1xuICAgICAgICAgICAgLy8gSW1wb3NzaWJsZSwgYnV0IFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob25SZW5kZXJTdWNjZXNzUHJvcHMpIHtcbiAgICAgICAgICAgIG9uUmVuZGVyU3VjY2Vzc1Byb3BzKG1ha2VQYWdlQ2FsbGJhY2socGFnZSwgc2NhbGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHBhZ2UgZmFpbHMgdG8gcmVuZGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uUmVuZGVyRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGlzQ2FuY2VsRXhjZXB0aW9uKGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAob25SZW5kZXJFcnJvclByb3BzKSB7XG4gICAgICAgICAgICBvblJlbmRlckVycm9yUHJvcHMoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlbmRlclZpZXdwb3J0ID0gdXNlTWVtbygoKSA9PiBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IHNjYWxlICogZGV2aWNlUGl4ZWxSYXRpbywgcm90YXRpb246IHJvdGF0ZSB9KSwgW2RldmljZVBpeGVsUmF0aW8sIHBhZ2UsIHJvdGF0ZSwgc2NhbGVdKTtcbiAgICBjb25zdCB2aWV3cG9ydCA9IHVzZU1lbW8oKCkgPT4gcGFnZS5nZXRWaWV3cG9ydCh7IHNjYWxlLCByb3RhdGlvbjogcm90YXRlIH0pLCBbcGFnZSwgcm90YXRlLCBzY2FsZV0pO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IE9tbWl0dGVkIGNhbGxiYWNrcyBzbyB0aGV5IGFyZSBub3QgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhleSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gZHJhd1BhZ2VPbkNhbnZhcygpIHtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5zdXJlcyB0aGUgY2FudmFzIHdpbGwgYmUgcmUtcmVuZGVyZWQgZnJvbSBzY3JhdGNoLiBPdGhlcndpc2UgYWxsIGZvcm0gZGF0YSB3aWxsIHN0YXkuXG4gICAgICAgIHBhZ2UuY2xlYW51cCgpO1xuICAgICAgICBjb25zdCB7IGN1cnJlbnQ6IGNhbnZhcyB9ID0gY2FudmFzRWxlbWVudDtcbiAgICAgICAgaWYgKCFjYW52YXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYW52YXMud2lkdGggPSByZW5kZXJWaWV3cG9ydC53aWR0aDtcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IHJlbmRlclZpZXdwb3J0LmhlaWdodDtcbiAgICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gYCR7TWF0aC5mbG9vcih2aWV3cG9ydC53aWR0aCl9cHhgO1xuICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7TWF0aC5mbG9vcih2aWV3cG9ydC5oZWlnaHQpfXB4YDtcbiAgICAgICAgY2FudmFzLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgY29uc3QgcmVuZGVyQ29udGV4dCA9IHtcbiAgICAgICAgICAgIGFubm90YXRpb25Nb2RlOiByZW5kZXJGb3JtcyA/IEFOTk9UQVRJT05fTU9ERS5FTkFCTEVfRk9STVMgOiBBTk5PVEFUSU9OX01PREUuRU5BQkxFLFxuICAgICAgICAgICAgY2FudmFzQ29udGV4dDogY2FudmFzLmdldENvbnRleHQoJzJkJywgeyBhbHBoYTogZmFsc2UgfSksXG4gICAgICAgICAgICB2aWV3cG9ydDogcmVuZGVyVmlld3BvcnQsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjYW52YXNCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICByZW5kZXJDb250ZXh0LmJhY2tncm91bmQgPSBjYW52YXNCYWNrZ3JvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbmNlbGxhYmxlID0gcGFnZS5yZW5kZXIocmVuZGVyQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmdUYXNrID0gY2FuY2VsbGFibGU7XG4gICAgICAgIGNhbmNlbGxhYmxlLnByb21pc2VcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICAgICAgICBvblJlbmRlclN1Y2Nlc3MoKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChvblJlbmRlckVycm9yKTtcbiAgICAgICAgcmV0dXJuICgpID0+IGNhbmNlbFJ1bm5pbmdUYXNrKHJ1bm5pbmdUYXNrKTtcbiAgICB9LCBbY2FudmFzQmFja2dyb3VuZCwgcGFnZSwgcmVuZGVyRm9ybXMsIHJlbmRlclZpZXdwb3J0LCB2aWV3cG9ydF0pO1xuICAgIGNvbnN0IGNsZWFudXAgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY3VycmVudDogY2FudmFzIH0gPSBjYW52YXNFbGVtZW50O1xuICAgICAgICAvKipcbiAgICAgICAgICogWmVyb2luZyB0aGUgd2lkdGggYW5kIGhlaWdodCBjYXVzZSBtb3N0IGJyb3dzZXJzIHRvIHJlbGVhc2UgZ3JhcGhpY3NcbiAgICAgICAgICogcmVzb3VyY2VzIGltbWVkaWF0ZWx5LCB3aGljaCBjYW4gZ3JlYXRseSByZWR1Y2UgbWVtb3J5IGNvbnN1bXB0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGNhbnZhcykge1xuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gMDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSAwO1xuICAgICAgICB9XG4gICAgfSwgW10pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiBjbGVhbnVwLCBbY2xlYW51cF0pO1xuICAgIHJldHVybiAoX2pzeChcImNhbnZhc1wiLCB7IGNsYXNzTmFtZTogYCR7X2NsYXNzTmFtZX1fX2NhbnZhc2AsIGRpcjogXCJsdHJcIiwgcmVmOiBtZXJnZVJlZnMoY2FudmFzUmVmLCBjYW52YXNFbGVtZW50KSwgc3R5bGU6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICAgIH0sIGNoaWxkcmVuOiByZW5kZXJUZXh0TGF5ZXIgPyBfanN4KFN0cnVjdFRyZWUsIHt9KSA6IG51bGwgfSkpO1xufVxuIiwiJ3VzZSBjbGllbnQnO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCwgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1ha2VDYW5jZWxsYWJsZSBmcm9tICdtYWtlLWNhbmNlbGxhYmxlLXByb21pc2UnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ3RpbnktaW52YXJpYW50JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuaW1wb3J0ICogYXMgcGRmanMgZnJvbSAncGRmanMtZGlzdCc7XG5pbXBvcnQgdXNlUGFnZUNvbnRleHQgZnJvbSAnLi4vc2hhcmVkL2hvb2tzL3VzZVBhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB1c2VSZXNvbHZlciBmcm9tICcuLi9zaGFyZWQvaG9va3MvdXNlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgY2FuY2VsUnVubmluZ1Rhc2sgfSBmcm9tICcuLi9zaGFyZWQvdXRpbHMuanMnO1xuZnVuY3Rpb24gaXNUZXh0SXRlbShpdGVtKSB7XG4gICAgcmV0dXJuICdzdHInIGluIGl0ZW07XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBUZXh0TGF5ZXIoKSB7XG4gICAgY29uc3QgcGFnZUNvbnRleHQgPSB1c2VQYWdlQ29udGV4dCgpO1xuICAgIGludmFyaWFudChwYWdlQ29udGV4dCwgJ1VuYWJsZSB0byBmaW5kIFBhZ2UgY29udGV4dC4nKTtcbiAgICBjb25zdCB7IGN1c3RvbVRleHRSZW5kZXJlciwgb25HZXRUZXh0RXJyb3IsIG9uR2V0VGV4dFN1Y2Nlc3MsIG9uUmVuZGVyVGV4dExheWVyRXJyb3IsIG9uUmVuZGVyVGV4dExheWVyU3VjY2VzcywgcGFnZSwgcGFnZUluZGV4LCBwYWdlTnVtYmVyLCByb3RhdGUsIHNjYWxlLCB9ID0gcGFnZUNvbnRleHQ7XG4gICAgaW52YXJpYW50KHBhZ2UsICdBdHRlbXB0ZWQgdG8gbG9hZCBwYWdlIHRleHQgY29udGVudCwgYnV0IG5vIHBhZ2Ugd2FzIHNwZWNpZmllZC4nKTtcbiAgICBjb25zdCBbdGV4dENvbnRlbnRTdGF0ZSwgdGV4dENvbnRlbnREaXNwYXRjaF0gPSB1c2VSZXNvbHZlcigpO1xuICAgIGNvbnN0IHsgdmFsdWU6IHRleHRDb250ZW50LCBlcnJvcjogdGV4dENvbnRlbnRFcnJvciB9ID0gdGV4dENvbnRlbnRTdGF0ZTtcbiAgICBjb25zdCBsYXllckVsZW1lbnQgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgZW5kRWxlbWVudCA9IHVzZVJlZih1bmRlZmluZWQpO1xuICAgIHdhcm5pbmcoTnVtYmVyLnBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoJy0tcmVhY3QtcGRmLXRleHQtbGF5ZXInKSwgMTApID09PSAxLCAnVGV4dExheWVyIHN0eWxlcyBub3QgZm91bmQuIFJlYWQgbW9yZTogaHR0cHM6Ly9naXRodWIuY29tL3dvanRla21hai9yZWFjdC1wZGYjc3VwcG9ydC1mb3ItdGV4dC1sYXllcicpO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIGEgcGFnZSB0ZXh0IGNvbnRlbnQgaXMgcmVhZCBzdWNjZXNzZnVsbHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvbkxvYWRTdWNjZXNzKCkge1xuICAgICAgICBpZiAoIXRleHRDb250ZW50KSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbkdldFRleHRTdWNjZXNzKSB7XG4gICAgICAgICAgICBvbkdldFRleHRTdWNjZXNzKHRleHRDb250ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHBhZ2UgdGV4dCBjb250ZW50IGZhaWxlZCB0byByZWFkIHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTG9hZEVycm9yKCkge1xuICAgICAgICBpZiAoIXRleHRDb250ZW50RXJyb3IpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyhmYWxzZSwgdGV4dENvbnRlbnRFcnJvci50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKG9uR2V0VGV4dEVycm9yKSB7XG4gICAgICAgICAgICBvbkdldFRleHRFcnJvcih0ZXh0Q29udGVudEVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiB1c2VFZmZlY3QgaW50ZW50aW9uYWxseSB0cmlnZ2VyZWQgb24gcGFnZSBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gcmVzZXRUZXh0Q29udGVudCgpIHtcbiAgICAgICAgdGV4dENvbnRlbnREaXNwYXRjaCh7IHR5cGU6ICdSRVNFVCcgfSk7XG4gICAgfSwgW3BhZ2UsIHRleHRDb250ZW50RGlzcGF0Y2hdKTtcbiAgICB1c2VFZmZlY3QoZnVuY3Rpb24gbG9hZFRleHRDb250ZW50KCkge1xuICAgICAgICBpZiAoIXBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5jZWxsYWJsZSA9IG1ha2VDYW5jZWxsYWJsZShwYWdlLmdldFRleHRDb250ZW50KCkpO1xuICAgICAgICBjb25zdCBydW5uaW5nVGFzayA9IGNhbmNlbGxhYmxlO1xuICAgICAgICBjYW5jZWxsYWJsZS5wcm9taXNlXG4gICAgICAgICAgICAudGhlbigobmV4dFRleHRDb250ZW50KSA9PiB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudERpc3BhdGNoKHsgdHlwZTogJ1JFU09MVkUnLCB2YWx1ZTogbmV4dFRleHRDb250ZW50IH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGV4dENvbnRlbnREaXNwYXRjaCh7IHR5cGU6ICdSRUpFQ1QnLCBlcnJvciB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiBjYW5jZWxSdW5uaW5nVGFzayhydW5uaW5nVGFzayk7XG4gICAgfSwgW3BhZ2UsIHRleHRDb250ZW50RGlzcGF0Y2hdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBPbW1pdHRlZCBjYWxsYmFja3Mgc28gdGhleSBhcmUgbm90IGNhbGxlZCBldmVyeSB0aW1lIHRoZXkgY2hhbmdlXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHRleHRDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dENvbnRlbnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBvbkxvYWRFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9uTG9hZFN1Y2Nlc3MoKTtcbiAgICB9LCBbdGV4dENvbnRlbnRdKTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHRleHQgbGF5ZXIgaXMgcmVuZGVyZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICovXG4gICAgY29uc3Qgb25SZW5kZXJTdWNjZXNzID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBpZiAob25SZW5kZXJUZXh0TGF5ZXJTdWNjZXNzKSB7XG4gICAgICAgICAgICBvblJlbmRlclRleHRMYXllclN1Y2Nlc3MoKTtcbiAgICAgICAgfVxuICAgIH0sIFtvblJlbmRlclRleHRMYXllclN1Y2Nlc3NdKTtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHRleHQgbGF5ZXIgZmFpbGVkIHRvIHJlbmRlciBzdWNjZXNzZnVsbHlcbiAgICAgKi9cbiAgICBjb25zdCBvblJlbmRlckVycm9yID0gdXNlQ2FsbGJhY2soKGVycm9yKSA9PiB7XG4gICAgICAgIHdhcm5pbmcoZmFsc2UsIGVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAob25SZW5kZXJUZXh0TGF5ZXJFcnJvcikge1xuICAgICAgICAgICAgb25SZW5kZXJUZXh0TGF5ZXJFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9LCBbb25SZW5kZXJUZXh0TGF5ZXJFcnJvcl0pO1xuICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKCkge1xuICAgICAgICBjb25zdCBlbmQgPSBlbmRFbGVtZW50LmN1cnJlbnQ7XG4gICAgICAgIGlmICghZW5kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZW5kLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBvbk1vdXNlVXAoKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVuZEVsZW1lbnQuY3VycmVudDtcbiAgICAgICAgaWYgKCFlbmQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbmQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdwb3J0ID0gdXNlTWVtbygoKSA9PiBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGUsIHJvdGF0aW9uOiByb3RhdGUgfSksIFtwYWdlLCByb3RhdGUsIHNjYWxlXSk7XG4gICAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uIHJlbmRlclRleHRMYXllcigpIHtcbiAgICAgICAgaWYgKCFwYWdlIHx8ICF0ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgY3VycmVudDogbGF5ZXIgfSA9IGxheWVyRWxlbWVudDtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxheWVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBjb25zdCB0ZXh0Q29udGVudFNvdXJjZSA9IHBhZ2Uuc3RyZWFtVGV4dENvbnRlbnQoeyBpbmNsdWRlTWFya2VkQ29udGVudDogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbGF5ZXIsXG4gICAgICAgICAgICB0ZXh0Q29udGVudFNvdXJjZSxcbiAgICAgICAgICAgIHZpZXdwb3J0LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjYW5jZWxsYWJsZSA9IG5ldyBwZGZqcy5UZXh0TGF5ZXIocGFyYW1ldGVycyk7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmdUYXNrID0gY2FuY2VsbGFibGU7XG4gICAgICAgIGNhbmNlbGxhYmxlXG4gICAgICAgICAgICAucmVuZGVyKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgZW5kLmNsYXNzTmFtZSA9ICdlbmRPZkNvbnRlbnQnO1xuICAgICAgICAgICAgbGF5ZXIuYXBwZW5kKGVuZCk7XG4gICAgICAgICAgICBlbmRFbGVtZW50LmN1cnJlbnQgPSBlbmQ7XG4gICAgICAgICAgICBjb25zdCBsYXllckNoaWxkcmVuID0gbGF5ZXIucXVlcnlTZWxlY3RvckFsbCgnW3JvbGU9XCJwcmVzZW50YXRpb25cIl0nKTtcbiAgICAgICAgICAgIGlmIChjdXN0b21UZXh0UmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLmZvckVhY2goKGl0ZW0sIGl0ZW1JbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGV4dEl0ZW0oaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGxheWVyQ2hpbGRyZW5baW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGN1c3RvbVRleHRSZW5kZXJlcihPYmplY3QuYXNzaWduKHsgcGFnZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JbmRleCB9LCBpdGVtKSk7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmlubmVySFRNTCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IGl0ZW0uc3RyICYmIGl0ZW0uaGFzRU9MID8gMiA6IDE7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbnRlbnRpb25hbCBpbW1lZGlhdGUgY2FsbGJhY2tcbiAgICAgICAgICAgIG9uUmVuZGVyU3VjY2VzcygpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKG9uUmVuZGVyRXJyb3IpO1xuICAgICAgICByZXR1cm4gKCkgPT4gY2FuY2VsUnVubmluZ1Rhc2socnVubmluZ1Rhc2spO1xuICAgIH0sIFtcbiAgICAgICAgY3VzdG9tVGV4dFJlbmRlcmVyLFxuICAgICAgICBvblJlbmRlckVycm9yLFxuICAgICAgICBvblJlbmRlclN1Y2Nlc3MsXG4gICAgICAgIHBhZ2UsXG4gICAgICAgIHBhZ2VJbmRleCxcbiAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgdGV4dENvbnRlbnQsXG4gICAgICAgIHZpZXdwb3J0LFxuICAgIF0pO1xuICAgIHJldHVybiAoX2pzeChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xzeCgncmVhY3QtcGRmX19QYWdlX190ZXh0Q29udGVudCcsICd0ZXh0TGF5ZXInKSwgb25Nb3VzZVVwOiBvbk1vdXNlVXAsIG9uTW91c2VEb3duOiBvbk1vdXNlRG93biwgcmVmOiBsYXllckVsZW1lbnQgfSkpO1xufVxuIiwiLy8gQXMgZGVmaW5lZCBpbiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9wZGYuanMvYmxvYi9kOWZhYzM0NTk2MDlhODA3YmU2NTA2ZmIzNDQxYjVkYTRiMTU0ZDE0L3NyYy9zaGFyZWQvdXRpbC5qcyNMMzcxLUwzNzRcbmNvbnN0IFBhc3N3b3JkUmVzcG9uc2VzID0ge1xuICAgIE5FRURfUEFTU1dPUkQ6IDEsXG4gICAgSU5DT1JSRUNUX1BBU1NXT1JEOiAyLFxufTtcbmV4cG9ydCBkZWZhdWx0IFBhc3N3b3JkUmVzcG9uc2VzO1xuIiwiaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtYWtlQ2FuY2VsbGFibGUgZnJvbSAnbWFrZS1jYW5jZWxsYWJsZS1wcm9taXNlJztcbmltcG9ydCBpbnZhcmlhbnQgZnJvbSAndGlueS1pbnZhcmlhbnQnO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAnd2FybmluZyc7XG5pbXBvcnQgU3RydWN0VHJlZUl0ZW0gZnJvbSAnLi9TdHJ1Y3RUcmVlSXRlbS5qcyc7XG5pbXBvcnQgdXNlUGFnZUNvbnRleHQgZnJvbSAnLi9zaGFyZWQvaG9va3MvdXNlUGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHVzZVJlc29sdmVyIGZyb20gJy4vc2hhcmVkL2hvb2tzL3VzZVJlc29sdmVyLmpzJztcbmltcG9ydCB7IGNhbmNlbFJ1bm5pbmdUYXNrIH0gZnJvbSAnLi9zaGFyZWQvdXRpbHMuanMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU3RydWN0VHJlZSgpIHtcbiAgICBjb25zdCBwYWdlQ29udGV4dCA9IHVzZVBhZ2VDb250ZXh0KCk7XG4gICAgaW52YXJpYW50KHBhZ2VDb250ZXh0LCAnVW5hYmxlIHRvIGZpbmQgUGFnZSBjb250ZXh0LicpO1xuICAgIGNvbnN0IHsgb25HZXRTdHJ1Y3RUcmVlRXJyb3I6IG9uR2V0U3RydWN0VHJlZUVycm9yUHJvcHMsIG9uR2V0U3RydWN0VHJlZVN1Y2Nlc3M6IG9uR2V0U3RydWN0VHJlZVN1Y2Nlc3NQcm9wcywgfSA9IHBhZ2VDb250ZXh0O1xuICAgIGNvbnN0IFtzdHJ1Y3RUcmVlU3RhdGUsIHN0cnVjdFRyZWVEaXNwYXRjaF0gPSB1c2VSZXNvbHZlcigpO1xuICAgIGNvbnN0IHsgdmFsdWU6IHN0cnVjdFRyZWUsIGVycm9yOiBzdHJ1Y3RUcmVlRXJyb3IgfSA9IHN0cnVjdFRyZWVTdGF0ZTtcbiAgICBjb25zdCB7IGN1c3RvbVRleHRSZW5kZXJlciwgcGFnZSB9ID0gcGFnZUNvbnRleHQ7XG4gICAgZnVuY3Rpb24gb25Mb2FkU3VjY2VzcygpIHtcbiAgICAgICAgaWYgKCFzdHJ1Y3RUcmVlKSB7XG4gICAgICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbkdldFN0cnVjdFRyZWVTdWNjZXNzUHJvcHMpIHtcbiAgICAgICAgICAgIG9uR2V0U3RydWN0VHJlZVN1Y2Nlc3NQcm9wcyhzdHJ1Y3RUcmVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvbkxvYWRFcnJvcigpIHtcbiAgICAgICAgaWYgKCFzdHJ1Y3RUcmVlRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIEltcG9zc2libGUsIGJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyhmYWxzZSwgc3RydWN0VHJlZUVycm9yLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAob25HZXRTdHJ1Y3RUcmVlRXJyb3JQcm9wcykge1xuICAgICAgICAgICAgb25HZXRTdHJ1Y3RUcmVlRXJyb3JQcm9wcyhzdHJ1Y3RUcmVlRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IHVzZUVmZmVjdCBpbnRlbnRpb25hbGx5IHRyaWdnZXJlZCBvbiBwYWdlIGNoYW5nZVxuICAgIHVzZUVmZmVjdChmdW5jdGlvbiByZXNldFN0cnVjdFRyZWUoKSB7XG4gICAgICAgIHN0cnVjdFRyZWVEaXNwYXRjaCh7IHR5cGU6ICdSRVNFVCcgfSk7XG4gICAgfSwgW3N0cnVjdFRyZWVEaXNwYXRjaCwgcGFnZV0pO1xuICAgIHVzZUVmZmVjdChmdW5jdGlvbiBsb2FkU3RydWN0VHJlZSgpIHtcbiAgICAgICAgaWYgKGN1c3RvbVRleHRSZW5kZXJlcikge1xuICAgICAgICAgICAgLy8gVE9ETzogRG9jdW1lbnQgd2h5IHRoaXMgaXMgbmVjZXNzYXJ5XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FuY2VsbGFibGUgPSBtYWtlQ2FuY2VsbGFibGUocGFnZS5nZXRTdHJ1Y3RUcmVlKCkpO1xuICAgICAgICBjb25zdCBydW5uaW5nVGFzayA9IGNhbmNlbGxhYmxlO1xuICAgICAgICBjYW5jZWxsYWJsZS5wcm9taXNlXG4gICAgICAgICAgICAudGhlbigobmV4dFN0cnVjdFRyZWUpID0+IHtcbiAgICAgICAgICAgIHN0cnVjdFRyZWVEaXNwYXRjaCh7IHR5cGU6ICdSRVNPTFZFJywgdmFsdWU6IG5leHRTdHJ1Y3RUcmVlIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgc3RydWN0VHJlZURpc3BhdGNoKHsgdHlwZTogJ1JFSkVDVCcsIGVycm9yIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICgpID0+IGNhbmNlbFJ1bm5pbmdUYXNrKHJ1bm5pbmdUYXNrKTtcbiAgICB9LCBbY3VzdG9tVGV4dFJlbmRlcmVyLCBwYWdlLCBzdHJ1Y3RUcmVlRGlzcGF0Y2hdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBPbW1pdHRlZCBjYWxsYmFja3Mgc28gdGhleSBhcmUgbm90IGNhbGxlZCBldmVyeSB0aW1lIHRoZXkgY2hhbmdlXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHN0cnVjdFRyZWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdHJ1Y3RUcmVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgb25Mb2FkRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvbkxvYWRTdWNjZXNzKCk7XG4gICAgfSwgW3N0cnVjdFRyZWVdKTtcbiAgICBpZiAoIXN0cnVjdFRyZWUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBfanN4KFN0cnVjdFRyZWVJdGVtLCB7IGNsYXNzTmFtZTogXCJyZWFjdC1wZGZfX1BhZ2VfX3N0cnVjdFRyZWUgc3RydWN0VHJlZVwiLCBub2RlOiBzdHJ1Y3RUcmVlIH0pO1xufVxuIiwiaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRBdHRyaWJ1dGVzLCBpc1N0cnVjdFRyZWVOb2RlLCBpc1N0cnVjdFRyZWVOb2RlV2l0aE9ubHlDb250ZW50Q2hpbGQsIH0gZnJvbSAnLi9zaGFyZWQvc3RydWN0VHJlZVV0aWxzLmpzJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFN0cnVjdFRyZWVJdGVtKHsgY2xhc3NOYW1lLCBub2RlLCB9KSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHVzZU1lbW8oKCkgPT4gZ2V0QXR0cmlidXRlcyhub2RlKSwgW25vZGVdKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy91c2VFeGhhdXN0aXZlRGVwZW5kZW5jaWVzOiBMb29rcyBsaWtlIGEgQmlvbWUgZXJyb3JcbiAgICBjb25zdCBjaGlsZHJlbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoIWlzU3RydWN0VHJlZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cnVjdFRyZWVOb2RlV2l0aE9ubHlDb250ZW50Q2hpbGQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0FycmF5SW5kZXhLZXk6IGluZGV4IGlzIHN0YWJsZSBoZXJlXG4gICAgICAgICAgICBfanN4KFN0cnVjdFRyZWVJdGVtLCB7IG5vZGU6IGNoaWxkIH0sIGluZGV4KSk7XG4gICAgICAgIH0pO1xuICAgIH0sIFtub2RlXSk7XG4gICAgcmV0dXJuIChfanN4KFwic3BhblwiLCBPYmplY3QuYXNzaWduKHsgY2xhc3NOYW1lOiBjbGFzc05hbWUgfSwgYXR0cmlidXRlcywgeyBjaGlsZHJlbjogY2hpbGRyZW4gfSkpKTtcbn1cbiIsIi8vIEZyb20gcGRmanMtZGlzdC9saWIvd2ViL3N0cnVjdF90cmVlX2xheWVyX2J1aWxkZXIuanNcbmV4cG9ydCBjb25zdCBQREZfUk9MRV9UT19IVE1MX1JPTEUgPSB7XG4gICAgLy8gRG9jdW1lbnQgbGV2ZWwgc3RydWN0dXJlIHR5cGVzXG4gICAgRG9jdW1lbnQ6IG51bGwsIC8vIFRoZXJlJ3MgYSBcImRvY3VtZW50XCIgcm9sZSwgYnV0IGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSBoZXJlLlxuICAgIERvY3VtZW50RnJhZ21lbnQ6IG51bGwsXG4gICAgLy8gR3JvdXBpbmcgbGV2ZWwgc3RydWN0dXJlIHR5cGVzXG4gICAgUGFydDogJ2dyb3VwJyxcbiAgICBTZWN0OiAnZ3JvdXAnLCAvLyBYWFg6IFRoZXJlJ3MgYSBcInNlY3Rpb25cIiByb2xlLCBidXQgaXQncyBhYnN0cmFjdC5cbiAgICBEaXY6ICdncm91cCcsXG4gICAgQXNpZGU6ICdub3RlJyxcbiAgICBOb25TdHJ1Y3Q6ICdub25lJyxcbiAgICAvLyBCbG9jayBsZXZlbCBzdHJ1Y3R1cmUgdHlwZXNcbiAgICBQOiBudWxsLFxuICAgIC8vIEg8bj4sXG4gICAgSDogJ2hlYWRpbmcnLFxuICAgIFRpdGxlOiBudWxsLFxuICAgIEZFTm90ZTogJ25vdGUnLFxuICAgIC8vIFN1Yi1ibG9jayBsZXZlbCBzdHJ1Y3R1cmUgdHlwZVxuICAgIFN1YjogJ2dyb3VwJyxcbiAgICAvLyBHZW5lcmFsIGlubGluZSBsZXZlbCBzdHJ1Y3R1cmUgdHlwZXNcbiAgICBMYmw6IG51bGwsXG4gICAgU3BhbjogbnVsbCxcbiAgICBFbTogbnVsbCxcbiAgICBTdHJvbmc6IG51bGwsXG4gICAgTGluazogJ2xpbmsnLFxuICAgIEFubm90OiAnbm90ZScsXG4gICAgRm9ybTogJ2Zvcm0nLFxuICAgIC8vIFJ1YnkgYW5kIFdhcmljaHUgc3RydWN0dXJlIHR5cGVzXG4gICAgUnVieTogbnVsbCxcbiAgICBSQjogbnVsbCxcbiAgICBSVDogbnVsbCxcbiAgICBSUDogbnVsbCxcbiAgICBXYXJpY2h1OiBudWxsLFxuICAgIFdUOiBudWxsLFxuICAgIFdQOiBudWxsLFxuICAgIC8vIExpc3Qgc3RhbmRhcmQgc3RydWN0dXJlIHR5cGVzXG4gICAgTDogJ2xpc3QnLFxuICAgIExJOiAnbGlzdGl0ZW0nLFxuICAgIExCb2R5OiBudWxsLFxuICAgIC8vIFRhYmxlIHN0YW5kYXJkIHN0cnVjdHVyZSB0eXBlc1xuICAgIFRhYmxlOiAndGFibGUnLFxuICAgIFRSOiAncm93JyxcbiAgICBUSDogJ2NvbHVtbmhlYWRlcicsXG4gICAgVEQ6ICdjZWxsJyxcbiAgICBUSGVhZDogJ2NvbHVtbmhlYWRlcicsXG4gICAgVEJvZHk6IG51bGwsXG4gICAgVEZvb3Q6IG51bGwsXG4gICAgLy8gU3RhbmRhcmQgc3RydWN0dXJlIHR5cGUgQ2FwdGlvblxuICAgIENhcHRpb246IG51bGwsXG4gICAgLy8gU3RhbmRhcmQgc3RydWN0dXJlIHR5cGUgRmlndXJlXG4gICAgRmlndXJlOiAnZmlndXJlJyxcbiAgICAvLyBTdGFuZGFyZCBzdHJ1Y3R1cmUgdHlwZSBGb3JtdWxhXG4gICAgRm9ybXVsYTogbnVsbCxcbiAgICAvLyBzdGFuZGFyZCBzdHJ1Y3R1cmUgdHlwZSBBcnRpZmFjdFxuICAgIEFydGlmYWN0OiBudWxsLFxufTtcbmV4cG9ydCBjb25zdCBIRUFESU5HX1BBVFRFUk4gPSAvXkgoXFxkKykkLztcbiIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRG9jdW1lbnRDb250ZXh0IGZyb20gJy4uLy4uL0RvY3VtZW50Q29udGV4dC5qcyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VEb2N1bWVudENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHVzZUNvbnRleHQoRG9jdW1lbnRDb250ZXh0KTtcbn1cbiIsImltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUGFnZUNvbnRleHQgZnJvbSAnLi4vLi4vUGFnZUNvbnRleHQuanMnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUGFnZUNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHVzZUNvbnRleHQoUGFnZUNvbnRleHQpO1xufVxuIiwiaW1wb3J0IHsgdXNlUmVkdWNlciB9IGZyb20gJ3JlYWN0JztcbmZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnUkVTT0xWRSc6XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogYWN0aW9uLnZhbHVlLCBlcnJvcjogdW5kZWZpbmVkIH07XG4gICAgICAgIGNhc2UgJ1JFSkVDVCc6XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogZmFsc2UsIGVycm9yOiBhY3Rpb24uZXJyb3IgfTtcbiAgICAgICAgY2FzZSAnUkVTRVQnOlxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZXJyb3I6IHVuZGVmaW5lZCB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVJlc29sdmVyKCkge1xuICAgIHJldHVybiB1c2VSZWR1Y2VyKChyZWR1Y2VyKSwgeyB2YWx1ZTogdW5kZWZpbmVkLCBlcnJvcjogdW5kZWZpbmVkIH0pO1xufVxuIiwiaW1wb3J0IHsgSEVBRElOR19QQVRURVJOLCBQREZfUk9MRV9UT19IVE1MX1JPTEUgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gaXNQZGZSb2xlKHJvbGUpIHtcbiAgICByZXR1cm4gcm9sZSBpbiBQREZfUk9MRV9UT19IVE1MX1JPTEU7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJ1Y3RUcmVlTm9kZShub2RlKSB7XG4gICAgcmV0dXJuICdjaGlsZHJlbicgaW4gbm9kZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cnVjdFRyZWVOb2RlV2l0aE9ubHlDb250ZW50Q2hpbGQobm9kZSkge1xuICAgIGlmICghaXNTdHJ1Y3RUcmVlTm9kZShub2RlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiAwIGluIG5vZGUuY2hpbGRyZW4gJiYgJ2lkJyBpbiBub2RlLmNoaWxkcmVuWzBdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvbGVBdHRyaWJ1dGVzKG5vZGUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgaWYgKGlzU3RydWN0VHJlZU5vZGUobm9kZSkpIHtcbiAgICAgICAgY29uc3QgeyByb2xlIH0gPSBub2RlO1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gcm9sZS5tYXRjaChIRUFESU5HX1BBVFRFUk4pO1xuICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgICAgYXR0cmlidXRlcy5yb2xlID0gJ2hlYWRpbmcnO1xuICAgICAgICAgICAgYXR0cmlidXRlc1snYXJpYS1sZXZlbCddID0gTnVtYmVyKG1hdGNoZXNbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGRmUm9sZShyb2xlKSkge1xuICAgICAgICAgICAgY29uc3QgaHRtbFJvbGUgPSBQREZfUk9MRV9UT19IVE1MX1JPTEVbcm9sZV07XG4gICAgICAgICAgICBpZiAoaHRtbFJvbGUpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnJvbGUgPSBodG1sUm9sZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlcztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYXNlQXR0cmlidXRlcyhub2RlKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHt9O1xuICAgIGlmIChpc1N0cnVjdFRyZWVOb2RlKG5vZGUpKSB7XG4gICAgICAgIGlmIChub2RlLmFsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzWydhcmlhLWxhYmVsJ10gPSBub2RlLmFsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5sYW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMubGFuZyA9IG5vZGUubGFuZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdHJ1Y3RUcmVlTm9kZVdpdGhPbmx5Q29udGVudENoaWxkKG5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCBbY2hpbGRdID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkQXR0cmlidXRlcyA9IGdldEJhc2VBdHRyaWJ1dGVzKGNoaWxkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhdHRyaWJ1dGVzKSwgY2hpbGRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCdpZCcgaW4gbm9kZSkge1xuICAgICAgICAgICAgYXR0cmlidXRlc1snYXJpYS1vd25zJ10gPSBub2RlLmlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dHJpYnV0ZXMobm9kZSkge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2V0Um9sZUF0dHJpYnV0ZXMobm9kZSkpLCBnZXRCYXNlQXR0cmlidXRlcyhub2RlKSk7XG59XG4iLCJpbXBvcnQgaW52YXJpYW50IGZyb20gJ3RpbnktaW52YXJpYW50JztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3dhcm5pbmcnO1xuLyoqXG4gKiBDaGVja3MgaWYgd2UncmUgcnVubmluZyBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0Jyb3dzZXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB3ZSdyZSBydW5uaW5nIGZyb20gYSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzTG9jYWxGaWxlU3lzdGVtID0gaXNCcm93c2VyICYmIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2ZpbGU6Jztcbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YXJpYWJsZSBpcyBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFyaWFibGUgVmFyaWFibGUgdG8gY2hlY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVmaW5lZCh2YXJpYWJsZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFyaWFibGUgIT09ICd1bmRlZmluZWQnO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhcmlhYmxlIGlzIGRlZmluZWQgYW5kIG5vdCBudWxsLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFyaWFibGUgVmFyaWFibGUgdG8gY2hlY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvdmlkZWQodmFyaWFibGUpIHtcbiAgICByZXR1cm4gaXNEZWZpbmVkKHZhcmlhYmxlKSAmJiB2YXJpYWJsZSAhPT0gbnVsbDtcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YXJpYWJsZSBwcm92aWRlZCBpcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhcmlhYmxlIFZhcmlhYmxlIHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyh2YXJpYWJsZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT09ICdzdHJpbmcnO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhcmlhYmxlIHByb3ZpZGVkIGlzIGFuIEFycmF5QnVmZmVyLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFyaWFibGUgVmFyaWFibGUgdG8gY2hlY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFyaWFibGUpIHtcbiAgICByZXR1cm4gdmFyaWFibGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcjtcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YXJpYWJsZSBwcm92aWRlZCBpcyBhIEJsb2IuXG4gKlxuICogQHBhcmFtIHsqfSB2YXJpYWJsZSBWYXJpYWJsZSB0byBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCbG9iKHZhcmlhYmxlKSB7XG4gICAgaW52YXJpYW50KGlzQnJvd3NlciwgJ2lzQmxvYiBjYW4gb25seSBiZSB1c2VkIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudCcpO1xuICAgIHJldHVybiB2YXJpYWJsZSBpbnN0YW5jZW9mIEJsb2I7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFyaWFibGUgcHJvdmlkZWQgaXMgYSBkYXRhIFVSSS5cbiAqXG4gKiBAcGFyYW0geyp9IHZhcmlhYmxlIFN0cmluZyB0byBjaGVja1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhVVJJKHZhcmlhYmxlKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKHZhcmlhYmxlKSAmJiAvXmRhdGE6Ly50ZXN0KHZhcmlhYmxlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkYXRhVVJJdG9CeXRlU3RyaW5nKGRhdGFVUkkpIHtcbiAgICBpbnZhcmlhbnQoaXNEYXRhVVJJKGRhdGFVUkkpLCAnSW52YWxpZCBkYXRhIFVSSS4nKTtcbiAgICBjb25zdCBbaGVhZGVyc1N0cmluZyA9ICcnLCBkYXRhU3RyaW5nID0gJyddID0gZGF0YVVSSS5zcGxpdCgnLCcpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBoZWFkZXJzU3RyaW5nLnNwbGl0KCc7Jyk7XG4gICAgaWYgKGhlYWRlcnMuaW5kZXhPZignYmFzZTY0JykgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBhdG9iKGRhdGFTdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gdW5lc2NhcGUoZGF0YVN0cmluZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RGV2aWNlUGl4ZWxSYXRpbygpIHtcbiAgICByZXR1cm4gKGlzQnJvd3NlciAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgfHwgMTtcbn1cbmNvbnN0IGFsbG93RmlsZUFjY2Vzc0Zyb21GaWxlc1RpcCA9ICdPbiBDaHJvbWl1bSBiYXNlZCBicm93c2VycywgeW91IGNhbiB1c2UgLS1hbGxvdy1maWxlLWFjY2Vzcy1mcm9tLWZpbGVzIGZsYWcgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4nO1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlDT1JTV2FybmluZygpIHtcbiAgICB3YXJuaW5nKCFpc0xvY2FsRmlsZVN5c3RlbSwgYExvYWRpbmcgUERGIGFzIGJhc2U2NCBzdHJpbmdzL1VSTHMgbWF5IG5vdCB3b3JrIG9uIHByb3RvY29scyBvdGhlciB0aGFuIEhUVFAvSFRUUFMuICR7YWxsb3dGaWxlQWNjZXNzRnJvbUZpbGVzVGlwfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlXb3JrZXJXYXJuaW5nKCkge1xuICAgIHdhcm5pbmcoIWlzTG9jYWxGaWxlU3lzdGVtLCBgTG9hZGluZyBQREYuanMgd29ya2VyIG1heSBub3Qgd29yayBvbiBwcm90b2NvbHMgb3RoZXIgdGhhbiBIVFRQL0hUVFBTLiAke2FsbG93RmlsZUFjY2Vzc0Zyb21GaWxlc1RpcH1gKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjYW5jZWxSdW5uaW5nVGFzayhydW5uaW5nVGFzaykge1xuICAgIGlmIChydW5uaW5nVGFzayA9PT0gbnVsbCB8fCBydW5uaW5nVGFzayA9PT0gdm9pZCAwID8gdm9pZCAwIDogcnVubmluZ1Rhc2suY2FuY2VsKVxuICAgICAgICBydW5uaW5nVGFzay5jYW5jZWwoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUGFnZUNhbGxiYWNrKHBhZ2UsIHNjYWxlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhZ2UsICd3aWR0aCcsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld1syXSAqIHNjYWxlO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhZ2UsICdoZWlnaHQnLCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZXdbM10gKiBzY2FsZTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYWdlLCAnb3JpZ2luYWxXaWR0aCcsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld1syXTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYWdlLCAnb3JpZ2luYWxIZWlnaHQnLCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpZXdbM107XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcGFnZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbmNlbEV4Y2VwdGlvbihlcnJvcikge1xuICAgIHJldHVybiBlcnJvci5uYW1lID09PSAnUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRnJvbUZpbGUoZmlsZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlYWRlci5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignRXJyb3Igd2hpbGUgcmVhZGluZyBhIGZpbGUuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIHdoaWxlIHJlYWRpbmcgYSBmaWxlLicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignRXJyb3Igd2hpbGUgcmVhZGluZyBhIGZpbGUuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBlcnJvci5OT1RfRk9VTkRfRVJSOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignRXJyb3Igd2hpbGUgcmVhZGluZyBhIGZpbGU6IEZpbGUgbm90IGZvdW5kLicpKTtcbiAgICAgICAgICAgICAgICBjYXNlIGVycm9yLlNFQ1VSSVRZX0VSUjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIHdoaWxlIHJlYWRpbmcgYSBmaWxlOiBTZWN1cml0eSBlcnJvci4nKSk7XG4gICAgICAgICAgICAgICAgY2FzZSBlcnJvci5BQk9SVF9FUlI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdFcnJvciB3aGlsZSByZWFkaW5nIGEgZmlsZTogQWJvcnRlZC4nKSk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ0Vycm9yIHdoaWxlIHJlYWRpbmcgYSBmaWxlLicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpO1xuICAgIH0pO1xufVxuIiwiLy8gc3JjL2luZGV4LnRzXG5pbXBvcnQgKiBhcyBSZWFjdDIgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciBhcyB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvcjIgfSBmcm9tIFwidXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvd2l0aC1zZWxlY3Rvci5qc1wiO1xuXG4vLyBzcmMvdXRpbHMvcmVhY3QudHNcbmltcG9ydCAqIGFzIFJlYWN0T3JpZ2luYWwgZnJvbSBcInJlYWN0XCI7XG52YXIgUmVhY3QgPSAoXG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICAvLyBAdHMtaWdub3JlXG4gIFwiZGVmYXVsdFwiIGluIFJlYWN0T3JpZ2luYWwgPyBSZWFjdE9yaWdpbmFsW1wiZGVmYXVsdFwiXSA6IFJlYWN0T3JpZ2luYWxcbik7XG5cbi8vIHNyYy9jb21wb25lbnRzL0NvbnRleHQudHNcbnZhciBDb250ZXh0S2V5ID0gU3ltYm9sLmZvcihgcmVhY3QtcmVkdXgtY29udGV4dGApO1xudmFyIGdUID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWxUaGlzIDogKFxuICAvKiBmYWxsIGJhY2sgdG8gYSBwZXItbW9kdWxlIHNjb3BlIChwcmUtOC4xIGJlaGF2aW91cikgaWYgYGdsb2JhbFRoaXNgIGlzIG5vdCBhdmFpbGFibGUgKi9cbiAge31cbik7XG5mdW5jdGlvbiBnZXRDb250ZXh0KCkge1xuICBpZiAoIVJlYWN0LmNyZWF0ZUNvbnRleHQpXG4gICAgcmV0dXJuIHt9O1xuICBjb25zdCBjb250ZXh0TWFwID0gZ1RbQ29udGV4dEtleV0gPz8gKGdUW0NvbnRleHRLZXldID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSk7XG4gIGxldCByZWFsQ29udGV4dCA9IGNvbnRleHRNYXAuZ2V0KFJlYWN0LmNyZWF0ZUNvbnRleHQpO1xuICBpZiAoIXJlYWxDb250ZXh0KSB7XG4gICAgcmVhbENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KFxuICAgICAgbnVsbFxuICAgICk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgcmVhbENvbnRleHQuZGlzcGxheU5hbWUgPSBcIlJlYWN0UmVkdXhcIjtcbiAgICB9XG4gICAgY29udGV4dE1hcC5zZXQoUmVhY3QuY3JlYXRlQ29udGV4dCwgcmVhbENvbnRleHQpO1xuICB9XG4gIHJldHVybiByZWFsQ29udGV4dDtcbn1cbnZhciBSZWFjdFJlZHV4Q29udGV4dCA9IC8qIEBfX1BVUkVfXyAqLyBnZXRDb250ZXh0KCk7XG5cbi8vIHNyYy91dGlscy91c2VTeW5jRXh0ZXJuYWxTdG9yZS50c1xudmFyIG5vdEluaXRpYWxpemVkID0gKCkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoXCJ1U0VTIG5vdCBpbml0aWFsaXplZCFcIik7XG59O1xuXG4vLyBzcmMvaG9va3MvdXNlUmVkdXhDb250ZXh0LnRzXG5mdW5jdGlvbiBjcmVhdGVSZWR1eENvbnRleHRIb29rKGNvbnRleHQgPSBSZWFjdFJlZHV4Q29udGV4dCkge1xuICByZXR1cm4gZnVuY3Rpb24gdXNlUmVkdXhDb250ZXh0MigpIHtcbiAgICBjb25zdCBjb250ZXh0VmFsdWUgPSBSZWFjdC51c2VDb250ZXh0KGNvbnRleHQpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIWNvbnRleHRWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImNvdWxkIG5vdCBmaW5kIHJlYWN0LXJlZHV4IGNvbnRleHQgdmFsdWU7IHBsZWFzZSBlbnN1cmUgdGhlIGNvbXBvbmVudCBpcyB3cmFwcGVkIGluIGEgPFByb3ZpZGVyPlwiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dFZhbHVlO1xuICB9O1xufVxudmFyIHVzZVJlZHV4Q29udGV4dCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVSZWR1eENvbnRleHRIb29rKCk7XG5cbi8vIHNyYy9ob29rcy91c2VTZWxlY3Rvci50c1xudmFyIHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gbm90SW5pdGlhbGl6ZWQ7XG52YXIgaW5pdGlhbGl6ZVVzZVNlbGVjdG9yID0gKGZuKSA9PiB7XG4gIHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gZm47XG59O1xudmFyIHJlZkVxdWFsaXR5ID0gKGEsIGIpID0+IGEgPT09IGI7XG5mdW5jdGlvbiBjcmVhdGVTZWxlY3Rvckhvb2soY29udGV4dCA9IFJlYWN0UmVkdXhDb250ZXh0KSB7XG4gIGNvbnN0IHVzZVJlZHV4Q29udGV4dDIgPSBjb250ZXh0ID09PSBSZWFjdFJlZHV4Q29udGV4dCA/IHVzZVJlZHV4Q29udGV4dCA6IGNyZWF0ZVJlZHV4Q29udGV4dEhvb2soY29udGV4dCk7XG4gIGNvbnN0IHVzZVNlbGVjdG9yMiA9IChzZWxlY3RvciwgZXF1YWxpdHlGbk9yT3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3QgeyBlcXVhbGl0eUZuID0gcmVmRXF1YWxpdHksIGRldk1vZGVDaGVja3MgPSB7fSB9ID0gdHlwZW9mIGVxdWFsaXR5Rm5Pck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIiA/IHsgZXF1YWxpdHlGbjogZXF1YWxpdHlGbk9yT3B0aW9ucyB9IDogZXF1YWxpdHlGbk9yT3B0aW9ucztcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIHNlbGVjdG9yIHRvIHVzZVNlbGVjdG9yYCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24gYXMgYSBzZWxlY3RvciB0byB1c2VTZWxlY3RvcmApO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBlcXVhbGl0eUZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24gYXMgYW4gZXF1YWxpdHkgZnVuY3Rpb24gdG8gdXNlU2VsZWN0b3JgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHN0b3JlLFxuICAgICAgc3Vic2NyaXB0aW9uLFxuICAgICAgZ2V0U2VydmVyU3RhdGUsXG4gICAgICBzdGFiaWxpdHlDaGVjayxcbiAgICAgIGlkZW50aXR5RnVuY3Rpb25DaGVja1xuICAgIH0gPSB1c2VSZWR1eENvbnRleHQyKCk7XG4gICAgY29uc3QgZmlyc3RSdW4gPSBSZWFjdC51c2VSZWYodHJ1ZSk7XG4gICAgY29uc3Qgd3JhcHBlZFNlbGVjdG9yID0gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgICB7XG4gICAgICAgIFtzZWxlY3Rvci5uYW1lXShzdGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gc2VsZWN0b3Ioc3RhdGUpO1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgaWRlbnRpdHlGdW5jdGlvbkNoZWNrOiBmaW5hbElkZW50aXR5RnVuY3Rpb25DaGVjayxcbiAgICAgICAgICAgICAgc3RhYmlsaXR5Q2hlY2s6IGZpbmFsU3RhYmlsaXR5Q2hlY2tcbiAgICAgICAgICAgIH0gPSB7XG4gICAgICAgICAgICAgIHN0YWJpbGl0eUNoZWNrLFxuICAgICAgICAgICAgICBpZGVudGl0eUZ1bmN0aW9uQ2hlY2ssXG4gICAgICAgICAgICAgIC4uLmRldk1vZGVDaGVja3NcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoZmluYWxTdGFiaWxpdHlDaGVjayA9PT0gXCJhbHdheXNcIiB8fCBmaW5hbFN0YWJpbGl0eUNoZWNrID09PSBcIm9uY2VcIiAmJiBmaXJzdFJ1bi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRvQ29tcGFyZSA9IHNlbGVjdG9yKHN0YXRlKTtcbiAgICAgICAgICAgICAgaWYgKCFlcXVhbGl0eUZuKHNlbGVjdGVkLCB0b0NvbXBhcmUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YWNrID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICA7XG4gICAgICAgICAgICAgICAgICAoeyBzdGFjayB9ID0gZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIFwiU2VsZWN0b3IgXCIgKyAoc2VsZWN0b3IubmFtZSB8fCBcInVua25vd25cIikgKyBcIiByZXR1cm5lZCBhIGRpZmZlcmVudCByZXN1bHQgd2hlbiBjYWxsZWQgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzLiBUaGlzIGNhbiBsZWFkIHRvIHVubmVjZXNzYXJ5IHJlcmVuZGVycy5cXG5TZWxlY3RvcnMgdGhhdCByZXR1cm4gYSBuZXcgcmVmZXJlbmNlIChzdWNoIGFzIGFuIG9iamVjdCBvciBhbiBhcnJheSkgc2hvdWxkIGJlIG1lbW9pemVkOiBodHRwczovL3JlZHV4LmpzLm9yZy91c2FnZS9kZXJpdmluZy1kYXRhLXNlbGVjdG9ycyNvcHRpbWl6aW5nLXNlbGVjdG9ycy13aXRoLW1lbW9pemF0aW9uXCIsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQyOiB0b0NvbXBhcmUsXG4gICAgICAgICAgICAgICAgICAgIHN0YWNrXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbmFsSWRlbnRpdHlGdW5jdGlvbkNoZWNrID09PSBcImFsd2F5c1wiIHx8IGZpbmFsSWRlbnRpdHlGdW5jdGlvbkNoZWNrID09PSBcIm9uY2VcIiAmJiBmaXJzdFJ1bi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgIGlmIChzZWxlY3RlZCA9PT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhY2sgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAgICh7IHN0YWNrIH0gPSBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgXCJTZWxlY3RvciBcIiArIChzZWxlY3Rvci5uYW1lIHx8IFwidW5rbm93blwiKSArIFwiIHJldHVybmVkIHRoZSByb290IHN0YXRlIHdoZW4gY2FsbGVkLiBUaGlzIGNhbiBsZWFkIHRvIHVubmVjZXNzYXJ5IHJlcmVuZGVycy5cXG5TZWxlY3RvcnMgdGhhdCByZXR1cm4gdGhlIGVudGlyZSBzdGF0ZSBhcmUgYWxtb3N0IGNlcnRhaW5seSBhIG1pc3Rha2UsIGFzIHRoZXkgd2lsbCBjYXVzZSBhIHJlcmVuZGVyIHdoZW5ldmVyICphbnl0aGluZyogaW4gc3RhdGUgY2hhbmdlcy5cIixcbiAgICAgICAgICAgICAgICAgIHsgc3RhY2sgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdFJ1bi5jdXJyZW50KVxuICAgICAgICAgICAgICBmaXJzdFJ1bi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgfVtzZWxlY3Rvci5uYW1lXSxcbiAgICAgIFtzZWxlY3Rvciwgc3RhYmlsaXR5Q2hlY2ssIGRldk1vZGVDaGVja3Muc3RhYmlsaXR5Q2hlY2tdXG4gICAgKTtcbiAgICBjb25zdCBzZWxlY3RlZFN0YXRlID0gdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IoXG4gICAgICBzdWJzY3JpcHRpb24uYWRkTmVzdGVkU3ViLFxuICAgICAgc3RvcmUuZ2V0U3RhdGUsXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZSB8fCBzdG9yZS5nZXRTdGF0ZSxcbiAgICAgIHdyYXBwZWRTZWxlY3RvcixcbiAgICAgIGVxdWFsaXR5Rm5cbiAgICApO1xuICAgIFJlYWN0LnVzZURlYnVnVmFsdWUoc2VsZWN0ZWRTdGF0ZSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkU3RhdGU7XG4gIH07XG4gIE9iamVjdC5hc3NpZ24odXNlU2VsZWN0b3IyLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiB1c2VTZWxlY3RvcjJcbiAgfSk7XG4gIHJldHVybiB1c2VTZWxlY3RvcjI7XG59XG52YXIgdXNlU2VsZWN0b3IgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlU2VsZWN0b3JIb29rKCk7XG5cbi8vIHNyYy91dGlscy9yZWFjdC1pcy50c1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIik7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpO1xudmFyIFJFQUNUX1NFUlZFUl9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc2VydmVyX2NvbnRleHRcIik7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0Lm9mZnNjcmVlblwiKTtcbnZhciBSRUFDVF9DTElFTlRfUkVGRVJFTkNFID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIik7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiB0eXBlID09PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIFRoaXMgbmVlZHMgdG8gaW5jbHVkZSBhbGwgcG9zc2libGUgbW9kdWxlIHJlZmVyZW5jZSBvYmplY3RcbiAgICAvLyB0eXBlcyBzdXBwb3J0ZWQgYnkgYW55IEZsaWdodCBjb25maWd1cmF0aW9uIGFueXdoZXJlIHNpbmNlXG4gICAgLy8gd2UgZG9uJ3Qga25vdyB3aGljaCBGbGlnaHQgYnVpbGQgdGhpcyB3aWxsIGVuZCB1cCBiZWluZyB1c2VkXG4gICAgLy8gd2l0aC5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DTElFTlRfUkVGRVJFTkNFIHx8IHR5cGUuZ2V0TW9kdWxlSWQgIT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09IFwib2JqZWN0XCIgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgY29uc3QgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IG9iamVjdC50eXBlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zdCAkJHR5cGVvZlR5cGUgPSB0eXBlICYmIHR5cGUuJCR0eXBlb2Y7XG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1NFUlZFUl9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZlR5cGU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRToge1xuICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB2b2lkIDA7XG59XG5mdW5jdGlvbiBpc0NvbnRleHRDb25zdW1lcihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuXG4vLyBzcmMvdXRpbHMvd2FybmluZy50c1xuZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICB0cnkge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG59XG5cbi8vIHNyYy9jb25uZWN0L3ZlcmlmeVN1YnNlbGVjdG9ycy50c1xuZnVuY3Rpb24gdmVyaWZ5KHNlbGVjdG9yLCBtZXRob2ROYW1lKSB7XG4gIGlmICghc2VsZWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdmFsdWUgZm9yICR7bWV0aG9kTmFtZX0gaW4gY29ubmVjdC5gKTtcbiAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSBcIm1hcFN0YXRlVG9Qcm9wc1wiIHx8IG1ldGhvZE5hbWUgPT09IFwibWFwRGlzcGF0Y2hUb1Byb3BzXCIpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWxlY3RvciwgXCJkZXBlbmRzT25Pd25Qcm9wc1wiKSkge1xuICAgICAgd2FybmluZyhcbiAgICAgICAgYFRoZSBzZWxlY3RvciBmb3IgJHttZXRob2ROYW1lfSBvZiBjb25uZWN0IGRpZCBub3Qgc3BlY2lmeSBhIHZhbHVlIGZvciBkZXBlbmRzT25Pd25Qcm9wcy5gXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdmVyaWZ5U3Vic2VsZWN0b3JzKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzKSB7XG4gIHZlcmlmeShtYXBTdGF0ZVRvUHJvcHMsIFwibWFwU3RhdGVUb1Byb3BzXCIpO1xuICB2ZXJpZnkobWFwRGlzcGF0Y2hUb1Byb3BzLCBcIm1hcERpc3BhdGNoVG9Qcm9wc1wiKTtcbiAgdmVyaWZ5KG1lcmdlUHJvcHMsIFwibWVyZ2VQcm9wc1wiKTtcbn1cblxuLy8gc3JjL2Nvbm5lY3Qvc2VsZWN0b3JGYWN0b3J5LnRzXG5mdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIHtcbiAgYXJlU3RhdGVzRXF1YWwsXG4gIGFyZU93blByb3BzRXF1YWwsXG4gIGFyZVN0YXRlUHJvcHNFcXVhbFxufSkge1xuICBsZXQgaGFzUnVuQXRMZWFzdE9uY2UgPSBmYWxzZTtcbiAgbGV0IHN0YXRlO1xuICBsZXQgb3duUHJvcHM7XG4gIGxldCBzdGF0ZVByb3BzO1xuICBsZXQgZGlzcGF0Y2hQcm9wcztcbiAgbGV0IG1lcmdlZFByb3BzO1xuICBmdW5jdGlvbiBoYW5kbGVGaXJzdENhbGwoZmlyc3RTdGF0ZSwgZmlyc3RPd25Qcm9wcykge1xuICAgIHN0YXRlID0gZmlyc3RTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IGZpcnN0T3duUHJvcHM7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIGhhc1J1bkF0TGVhc3RPbmNlID0gdHJ1ZTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSgpIHtcbiAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcylcbiAgICAgIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wcygpIHtcbiAgICBpZiAobWFwU3RhdGVUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKVxuICAgICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIGlmIChtYXBEaXNwYXRjaFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpXG4gICAgICBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlTmV3U3RhdGUoKSB7XG4gICAgY29uc3QgbmV4dFN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBjb25zdCBzdGF0ZVByb3BzQ2hhbmdlZCA9ICFhcmVTdGF0ZVByb3BzRXF1YWwobmV4dFN0YXRlUHJvcHMsIHN0YXRlUHJvcHMpO1xuICAgIHN0YXRlUHJvcHMgPSBuZXh0U3RhdGVQcm9wcztcbiAgICBpZiAoc3RhdGVQcm9wc0NoYW5nZWQpXG4gICAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICBjb25zdCBwcm9wc0NoYW5nZWQgPSAhYXJlT3duUHJvcHNFcXVhbChuZXh0T3duUHJvcHMsIG93blByb3BzKTtcbiAgICBjb25zdCBzdGF0ZUNoYW5nZWQgPSAhYXJlU3RhdGVzRXF1YWwoXG4gICAgICBuZXh0U3RhdGUsXG4gICAgICBzdGF0ZSxcbiAgICAgIG5leHRPd25Qcm9wcyxcbiAgICAgIG93blByb3BzXG4gICAgKTtcbiAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICBvd25Qcm9wcyA9IG5leHRPd25Qcm9wcztcbiAgICBpZiAocHJvcHNDaGFuZ2VkICYmIHN0YXRlQ2hhbmdlZClcbiAgICAgIHJldHVybiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCk7XG4gICAgaWYgKHByb3BzQ2hhbmdlZClcbiAgICAgIHJldHVybiBoYW5kbGVOZXdQcm9wcygpO1xuICAgIGlmIChzdGF0ZUNoYW5nZWQpXG4gICAgICByZXR1cm4gaGFuZGxlTmV3U3RhdGUoKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1cmVGaW5hbFByb3BzU2VsZWN0b3IobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICByZXR1cm4gaGFzUnVuQXRMZWFzdE9uY2UgPyBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIDogaGFuZGxlRmlyc3RDYWxsKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkoZGlzcGF0Y2gsIHtcbiAgaW5pdE1hcFN0YXRlVG9Qcm9wcyxcbiAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyxcbiAgaW5pdE1lcmdlUHJvcHMsXG4gIC4uLm9wdGlvbnNcbn0pIHtcbiAgY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gaW5pdE1hcFN0YXRlVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIGNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IGluaXRNYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICBjb25zdCBtZXJnZVByb3BzID0gaW5pdE1lcmdlUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdmVyaWZ5U3Vic2VsZWN0b3JzKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzKTtcbiAgfVxuICByZXR1cm4gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCBvcHRpb25zKTtcbn1cblxuLy8gc3JjL3V0aWxzL2JpbmRBY3Rpb25DcmVhdG9ycy50c1xuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBjb25zdCBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGFjdGlvbkNyZWF0b3JzKSB7XG4gICAgY29uc3QgYWN0aW9uQ3JlYXRvciA9IGFjdGlvbkNyZWF0b3JzW2tleV07XG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGJvdW5kQWN0aW9uQ3JlYXRvcnNba2V5XSA9ICguLi5hcmdzKSA9PiBkaXNwYXRjaChhY3Rpb25DcmVhdG9yKC4uLmFyZ3MpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59XG5cbi8vIHNyYy91dGlscy9pc1BsYWluT2JqZWN0LnRzXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fCBvYmogPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICBpZiAocHJvdG8gPT09IG51bGwpXG4gICAgcmV0dXJuIHRydWU7XG4gIGxldCBiYXNlUHJvdG8gPSBwcm90bztcbiAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihiYXNlUHJvdG8pICE9PSBudWxsKSB7XG4gICAgYmFzZVByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGJhc2VQcm90byk7XG4gIH1cbiAgcmV0dXJuIHByb3RvID09PSBiYXNlUHJvdG87XG59XG5cbi8vIHNyYy91dGlscy92ZXJpZnlQbGFpbk9iamVjdC50c1xuZnVuY3Rpb24gdmVyaWZ5UGxhaW5PYmplY3QodmFsdWUsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICB3YXJuaW5nKFxuICAgICAgYCR7bWV0aG9kTmFtZX0oKSBpbiAke2Rpc3BsYXlOYW1lfSBtdXN0IHJldHVybiBhIHBsYWluIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZCAke3ZhbHVlfS5gXG4gICAgKTtcbiAgfVxufVxuXG4vLyBzcmMvY29ubmVjdC93cmFwTWFwVG9Qcm9wcy50c1xuZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNDb25zdGFudChnZXRDb25zdGFudCkge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdENvbnN0YW50U2VsZWN0b3IoZGlzcGF0Y2gpIHtcbiAgICBjb25zdCBjb25zdGFudCA9IGdldENvbnN0YW50KGRpc3BhdGNoKTtcbiAgICBmdW5jdGlvbiBjb25zdGFudFNlbGVjdG9yKCkge1xuICAgICAgcmV0dXJuIGNvbnN0YW50O1xuICAgIH1cbiAgICBjb25zdGFudFNlbGVjdG9yLmRlcGVuZHNPbk93blByb3BzID0gZmFsc2U7XG4gICAgcmV0dXJuIGNvbnN0YW50U2VsZWN0b3I7XG4gIH07XG59XG5mdW5jdGlvbiBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzID8gQm9vbGVhbihtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSA6IG1hcFRvUHJvcHMubGVuZ3RoICE9PSAxO1xufVxuZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFRvUHJvcHMsIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRQcm94eVNlbGVjdG9yKGRpc3BhdGNoLCB7IGRpc3BsYXlOYW1lIH0pIHtcbiAgICBjb25zdCBwcm94eSA9IGZ1bmN0aW9uIG1hcFRvUHJvcHNQcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICByZXR1cm4gcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPyBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIDogcHJveHkubWFwVG9Qcm9wcyhzdGF0ZU9yRGlzcGF0Y2gsIHZvaWQgMCk7XG4gICAgfTtcbiAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IHRydWU7XG4gICAgcHJveHkubWFwVG9Qcm9wcyA9IGZ1bmN0aW9uIGRldGVjdEZhY3RvcnlBbmRWZXJpZnkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykge1xuICAgICAgcHJveHkubWFwVG9Qcm9wcyA9IG1hcFRvUHJvcHM7XG4gICAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IGdldERlcGVuZHNPbk93blByb3BzKG1hcFRvUHJvcHMpO1xuICAgICAgbGV0IHByb3BzID0gcHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgICBpZiAodHlwZW9mIHByb3BzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcHJveHkubWFwVG9Qcm9wcyA9IHByb3BzO1xuICAgICAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IGdldERlcGVuZHNPbk93blByb3BzKHByb3BzKTtcbiAgICAgICAgcHJvcHMgPSBwcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpXG4gICAgICAgIHZlcmlmeVBsYWluT2JqZWN0KHByb3BzLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSk7XG4gICAgICByZXR1cm4gcHJvcHM7XG4gICAgfTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH07XG59XG5cbi8vIHNyYy9jb25uZWN0L2ludmFsaWRBcmdGYWN0b3J5LnRzXG5mdW5jdGlvbiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShhcmcsIG5hbWUpIHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgb3B0aW9ucykgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHZhbHVlIG9mIHR5cGUgJHt0eXBlb2YgYXJnfSBmb3IgJHtuYW1lfSBhcmd1bWVudCB3aGVuIGNvbm5lY3RpbmcgY29tcG9uZW50ICR7b3B0aW9ucy53cmFwcGVkQ29tcG9uZW50TmFtZX0uYFxuICAgICk7XG4gIH07XG59XG5cbi8vIHNyYy9jb25uZWN0L21hcERpc3BhdGNoVG9Qcm9wcy50c1xuZnVuY3Rpb24gbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMpIHtcbiAgcmV0dXJuIG1hcERpc3BhdGNoVG9Qcm9wcyAmJiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSBcIm9iamVjdFwiID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudChcbiAgICAoZGlzcGF0Y2gpID0+IChcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGJpbmRBY3Rpb25DcmVhdG9ycyhtYXBEaXNwYXRjaFRvUHJvcHMsIGRpc3BhdGNoKVxuICAgIClcbiAgKSA6ICFtYXBEaXNwYXRjaFRvUHJvcHMgPyB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KChkaXNwYXRjaCkgPT4gKHtcbiAgICBkaXNwYXRjaFxuICB9KSkgOiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSBcImZ1bmN0aW9uXCIgPyAoXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdyYXBNYXBUb1Byb3BzRnVuYyhtYXBEaXNwYXRjaFRvUHJvcHMsIFwibWFwRGlzcGF0Y2hUb1Byb3BzXCIpXG4gICkgOiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShtYXBEaXNwYXRjaFRvUHJvcHMsIFwibWFwRGlzcGF0Y2hUb1Byb3BzXCIpO1xufVxuXG4vLyBzcmMvY29ubmVjdC9tYXBTdGF0ZVRvUHJvcHMudHNcbmZ1bmN0aW9uIG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcnkobWFwU3RhdGVUb1Byb3BzKSB7XG4gIHJldHVybiAhbWFwU3RhdGVUb1Byb3BzID8gd3JhcE1hcFRvUHJvcHNDb25zdGFudCgoKSA9PiAoe30pKSA6IHR5cGVvZiBtYXBTdGF0ZVRvUHJvcHMgPT09IFwiZnVuY3Rpb25cIiA/IChcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFN0YXRlVG9Qcm9wcywgXCJtYXBTdGF0ZVRvUHJvcHNcIilcbiAgKSA6IGNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgXCJtYXBTdGF0ZVRvUHJvcHNcIik7XG59XG5cbi8vIHNyYy9jb25uZWN0L21lcmdlUHJvcHMudHNcbmZ1bmN0aW9uIGRlZmF1bHRNZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKSB7XG4gIHJldHVybiB7IC4uLm93blByb3BzLCAuLi5zdGF0ZVByb3BzLCAuLi5kaXNwYXRjaFByb3BzIH07XG59XG5mdW5jdGlvbiB3cmFwTWVyZ2VQcm9wc0Z1bmMobWVyZ2VQcm9wcykge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdE1lcmdlUHJvcHNQcm94eShkaXNwYXRjaCwgeyBkaXNwbGF5TmFtZSwgYXJlTWVyZ2VkUHJvcHNFcXVhbCB9KSB7XG4gICAgbGV0IGhhc1J1bk9uY2UgPSBmYWxzZTtcbiAgICBsZXQgbWVyZ2VkUHJvcHM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlUHJvcHNQcm94eShzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICAgICAgY29uc3QgbmV4dE1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgICBpZiAoaGFzUnVuT25jZSkge1xuICAgICAgICBpZiAoIWFyZU1lcmdlZFByb3BzRXF1YWwobmV4dE1lcmdlZFByb3BzLCBtZXJnZWRQcm9wcykpXG4gICAgICAgICAgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNSdW5PbmNlID0gdHJ1ZTtcbiAgICAgICAgbWVyZ2VkUHJvcHMgPSBuZXh0TWVyZ2VkUHJvcHM7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpXG4gICAgICAgICAgdmVyaWZ5UGxhaW5PYmplY3QobWVyZ2VkUHJvcHMsIGRpc3BsYXlOYW1lLCBcIm1lcmdlUHJvcHNcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gICAgfTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG1lcmdlUHJvcHNGYWN0b3J5KG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuICFtZXJnZVByb3BzID8gKCkgPT4gZGVmYXVsdE1lcmdlUHJvcHMgOiB0eXBlb2YgbWVyZ2VQcm9wcyA9PT0gXCJmdW5jdGlvblwiID8gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIDogY3JlYXRlSW52YWxpZEFyZ0ZhY3RvcnkobWVyZ2VQcm9wcywgXCJtZXJnZVByb3BzXCIpO1xufVxuXG4vLyBzcmMvdXRpbHMvYmF0Y2gudHNcbmZ1bmN0aW9uIGRlZmF1bHROb29wQmF0Y2goY2FsbGJhY2spIHtcbiAgY2FsbGJhY2soKTtcbn1cblxuLy8gc3JjL3V0aWxzL1N1YnNjcmlwdGlvbi50c1xuZnVuY3Rpb24gY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uKCkge1xuICBsZXQgZmlyc3QgPSBudWxsO1xuICBsZXQgbGFzdCA9IG51bGw7XG4gIHJldHVybiB7XG4gICAgY2xlYXIoKSB7XG4gICAgICBmaXJzdCA9IG51bGw7XG4gICAgICBsYXN0ID0gbnVsbDtcbiAgICB9LFxuICAgIG5vdGlmeSgpIHtcbiAgICAgIGRlZmF1bHROb29wQmF0Y2goKCkgPT4ge1xuICAgICAgICBsZXQgbGlzdGVuZXIgPSBmaXJzdDtcbiAgICAgICAgd2hpbGUgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgbGlzdGVuZXIuY2FsbGJhY2soKTtcbiAgICAgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3QgbGlzdGVuZXJzID0gW107XG4gICAgICBsZXQgbGlzdGVuZXIgPSBmaXJzdDtcbiAgICAgIHdoaWxlIChsaXN0ZW5lcikge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXIubmV4dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsaXN0ZW5lcnM7XG4gICAgfSxcbiAgICBzdWJzY3JpYmUoY2FsbGJhY2spIHtcbiAgICAgIGxldCBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBsYXN0ID0ge1xuICAgICAgICBjYWxsYmFjayxcbiAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgcHJldjogbGFzdFxuICAgICAgfTtcbiAgICAgIGlmIChsaXN0ZW5lci5wcmV2KSB7XG4gICAgICAgIGxpc3RlbmVyLnByZXYubmV4dCA9IGxpc3RlbmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlyc3QgPSBsaXN0ZW5lcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgICAgaWYgKCFpc1N1YnNjcmliZWQgfHwgZmlyc3QgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGxpc3RlbmVyLm5leHQpIHtcbiAgICAgICAgICBsaXN0ZW5lci5uZXh0LnByZXYgPSBsaXN0ZW5lci5wcmV2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3QgPSBsaXN0ZW5lci5wcmV2O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lci5wcmV2KSB7XG4gICAgICAgICAgbGlzdGVuZXIucHJldi5uZXh0ID0gbGlzdGVuZXIubmV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaXJzdCA9IGxpc3RlbmVyLm5leHQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxudmFyIG51bGxMaXN0ZW5lcnMgPSB7XG4gIG5vdGlmeSgpIHtcbiAgfSxcbiAgZ2V0OiAoKSA9PiBbXVxufTtcbmZ1bmN0aW9uIGNyZWF0ZVN1YnNjcmlwdGlvbihzdG9yZSwgcGFyZW50U3ViKSB7XG4gIGxldCB1bnN1YnNjcmliZTtcbiAgbGV0IGxpc3RlbmVycyA9IG51bGxMaXN0ZW5lcnM7XG4gIGxldCBzdWJzY3JpcHRpb25zQW1vdW50ID0gMDtcbiAgbGV0IHNlbGZTdWJzY3JpYmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGFkZE5lc3RlZFN1YihsaXN0ZW5lcikge1xuICAgIHRyeVN1YnNjcmliZSgpO1xuICAgIGNvbnN0IGNsZWFudXBMaXN0ZW5lciA9IGxpc3RlbmVycy5zdWJzY3JpYmUobGlzdGVuZXIpO1xuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmICghcmVtb3ZlZCkge1xuICAgICAgICByZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cExpc3RlbmVyKCk7XG4gICAgICAgIHRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBub3RpZnlOZXN0ZWRTdWJzKCkge1xuICAgIGxpc3RlbmVycy5ub3RpZnkoKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVDaGFuZ2VXcmFwcGVyKCkge1xuICAgIGlmIChzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSkge1xuICAgICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UoKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gaXNTdWJzY3JpYmVkKCkge1xuICAgIHJldHVybiBzZWxmU3Vic2NyaWJlZDtcbiAgfVxuICBmdW5jdGlvbiB0cnlTdWJzY3JpYmUoKSB7XG4gICAgc3Vic2NyaXB0aW9uc0Ftb3VudCsrO1xuICAgIGlmICghdW5zdWJzY3JpYmUpIHtcbiAgICAgIHVuc3Vic2NyaWJlID0gcGFyZW50U3ViID8gcGFyZW50U3ViLmFkZE5lc3RlZFN1YihoYW5kbGVDaGFuZ2VXcmFwcGVyKSA6IHN0b3JlLnN1YnNjcmliZShoYW5kbGVDaGFuZ2VXcmFwcGVyKTtcbiAgICAgIGxpc3RlbmVycyA9IGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB0cnlVbnN1YnNjcmliZSgpIHtcbiAgICBzdWJzY3JpcHRpb25zQW1vdW50LS07XG4gICAgaWYgKHVuc3Vic2NyaWJlICYmIHN1YnNjcmlwdGlvbnNBbW91bnQgPT09IDApIHtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB1bnN1YnNjcmliZSA9IHZvaWQgMDtcbiAgICAgIGxpc3RlbmVycy5jbGVhcigpO1xuICAgICAgbGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdHJ5U3Vic2NyaWJlU2VsZigpIHtcbiAgICBpZiAoIXNlbGZTdWJzY3JpYmVkKSB7XG4gICAgICBzZWxmU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICB0cnlTdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gdHJ5VW5zdWJzY3JpYmVTZWxmKCkge1xuICAgIGlmIChzZWxmU3Vic2NyaWJlZCkge1xuICAgICAgc2VsZlN1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIHRyeVVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHtcbiAgICBhZGROZXN0ZWRTdWIsXG4gICAgbm90aWZ5TmVzdGVkU3VicyxcbiAgICBoYW5kbGVDaGFuZ2VXcmFwcGVyLFxuICAgIGlzU3Vic2NyaWJlZCxcbiAgICB0cnlTdWJzY3JpYmU6IHRyeVN1YnNjcmliZVNlbGYsXG4gICAgdHJ5VW5zdWJzY3JpYmU6IHRyeVVuc3Vic2NyaWJlU2VsZixcbiAgICBnZXRMaXN0ZW5lcnM6ICgpID0+IGxpc3RlbmVyc1xuICB9O1xuICByZXR1cm4gc3Vic2NyaXB0aW9uO1xufVxuXG4vLyBzcmMvdXRpbHMvdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdC50c1xudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIpO1xudmFyIGlzUmVhY3ROYXRpdmUgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci5wcm9kdWN0ID09PSBcIlJlYWN0TmF0aXZlXCI7XG52YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IGNhblVzZURPTSB8fCBpc1JlYWN0TmF0aXZlID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0O1xuXG4vLyBzcmMvdXRpbHMvc2hhbGxvd0VxdWFsLnRzXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHggIT09IDAgfHwgeSAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKGlzKG9iakEsIG9iakIpKVxuICAgIHJldHVybiB0cnVlO1xuICBpZiAodHlwZW9mIG9iakEgIT09IFwib2JqZWN0XCIgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gXCJvYmplY3RcIiB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBrZXlzQVtpXSkgfHwgIWlzKG9iakFba2V5c0FbaV1dLCBvYmpCW2tleXNBW2ldXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIHNyYy91dGlscy9ob2lzdFN0YXRpY3MudHNcbnZhciBSRUFDVF9TVEFUSUNTID0ge1xuICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgY29udGV4dFR5cGU6IHRydWUsXG4gIGNvbnRleHRUeXBlczogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgZ2V0RGVmYXVsdFByb3BzOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogdHJ1ZSxcbiAgbWl4aW5zOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgbGVuZ3RoOiB0cnVlLFxuICBwcm90b3R5cGU6IHRydWUsXG4gIGNhbGxlcjogdHJ1ZSxcbiAgY2FsbGVlOiB0cnVlLFxuICBhcmd1bWVudHM6IHRydWUsXG4gIGFyaXR5OiB0cnVlXG59O1xudmFyIEZPUldBUkRfUkVGX1NUQVRJQ1MgPSB7XG4gICQkdHlwZW9mOiB0cnVlLFxuICByZW5kZXI6IHRydWUsXG4gIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgZGlzcGxheU5hbWU6IHRydWUsXG4gIHByb3BUeXBlczogdHJ1ZVxufTtcbnZhciBNRU1PX1NUQVRJQ1MgPSB7XG4gICQkdHlwZW9mOiB0cnVlLFxuICBjb21wYXJlOiB0cnVlLFxuICBkZWZhdWx0UHJvcHM6IHRydWUsXG4gIGRpc3BsYXlOYW1lOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgVFlQRV9TVEFUSUNTID0ge1xuICBbRm9yd2FyZFJlZl06IEZPUldBUkRfUkVGX1NUQVRJQ1MsXG4gIFtNZW1vXTogTUVNT19TVEFUSUNTXG59O1xuZnVuY3Rpb24gZ2V0U3RhdGljcyhjb21wb25lbnQpIHtcbiAgaWYgKGlzTWVtbyhjb21wb25lbnQpKSB7XG4gICAgcmV0dXJuIE1FTU9fU1RBVElDUztcbiAgfVxuICByZXR1cm4gVFlQRV9TVEFUSUNTW2NvbXBvbmVudFtcIiQkdHlwZW9mXCJdXSB8fCBSRUFDVF9TVEFUSUNTO1xufVxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGdldE93blByb3BlcnR5TmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgb2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbmZ1bmN0aW9uIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgc291cmNlQ29tcG9uZW50KSB7XG4gIGlmICh0eXBlb2Ygc291cmNlQ29tcG9uZW50ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKG9iamVjdFByb3RvdHlwZSkge1xuICAgICAgY29uc3QgaW5oZXJpdGVkQ29tcG9uZW50ID0gZ2V0UHJvdG90eXBlT2Yoc291cmNlQ29tcG9uZW50KTtcbiAgICAgIGlmIChpbmhlcml0ZWRDb21wb25lbnQgJiYgaW5oZXJpdGVkQ29tcG9uZW50ICE9PSBvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgICAgaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBpbmhlcml0ZWRDb21wb25lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoc291cmNlQ29tcG9uZW50KTtcbiAgICBpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgICBrZXlzID0ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZUNvbXBvbmVudCkpO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRTdGF0aWNzID0gZ2V0U3RhdGljcyh0YXJnZXRDb21wb25lbnQpO1xuICAgIGNvbnN0IHNvdXJjZVN0YXRpY3MgPSBnZXRTdGF0aWNzKHNvdXJjZUNvbXBvbmVudCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgaWYgKCFLTk9XTl9TVEFUSUNTW2tleV0gJiYgIShzb3VyY2VTdGF0aWNzICYmIHNvdXJjZVN0YXRpY3Nba2V5XSkgJiYgISh0YXJnZXRTdGF0aWNzICYmIHRhcmdldFN0YXRpY3Nba2V5XSkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VDb21wb25lbnQsIGtleSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29tcG9uZW50LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldENvbXBvbmVudDtcbn1cblxuLy8gc3JjL2NvbXBvbmVudHMvY29ubmVjdC50c3hcbnZhciB1c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IG5vdEluaXRpYWxpemVkO1xudmFyIGluaXRpYWxpemVDb25uZWN0ID0gKGZuKSA9PiB7XG4gIHVzZVN5bmNFeHRlcm5hbFN0b3JlID0gZm47XG59O1xudmFyIE5PX1NVQlNDUklQVElPTl9BUlJBWSA9IFtudWxsLCBudWxsXTtcbnZhciBzdHJpbmdpZnlDb21wb25lbnQgPSAoQ29tcCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShDb21wKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIFN0cmluZyhDb21wKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3RXaXRoQXJncyhlZmZlY3RGdW5jLCBlZmZlY3RBcmdzLCBkZXBlbmRlbmNpZXMpIHtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiBlZmZlY3RGdW5jKC4uLmVmZmVjdEFyZ3MpLCBkZXBlbmRlbmNpZXMpO1xufVxuZnVuY3Rpb24gY2FwdHVyZVdyYXBwZXJQcm9wcyhsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIHdyYXBwZXJQcm9wcywgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3Vicykge1xuICBsYXN0V3JhcHBlclByb3BzLmN1cnJlbnQgPSB3cmFwcGVyUHJvcHM7XG4gIHJlbmRlcklzU2NoZWR1bGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgaWYgKGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCkge1xuICAgIGNoaWxkUHJvcHNGcm9tU3RvcmVVcGRhdGUuY3VycmVudCA9IG51bGw7XG4gICAgbm90aWZ5TmVzdGVkU3VicygpO1xuICB9XG59XG5mdW5jdGlvbiBzdWJzY3JpYmVVcGRhdGVzKHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcywgc3RvcmUsIHN1YnNjcmlwdGlvbiwgY2hpbGRQcm9wc1NlbGVjdG9yLCBsYXN0V3JhcHBlclByb3BzLCBsYXN0Q2hpbGRQcm9wcywgcmVuZGVySXNTY2hlZHVsZWQsIGlzTW91bnRlZCwgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSwgbm90aWZ5TmVzdGVkU3VicywgYWRkaXRpb25hbFN1YnNjcmliZUxpc3RlbmVyKSB7XG4gIGlmICghc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgfTtcbiAgbGV0IGRpZFVuc3Vic2NyaWJlID0gZmFsc2U7XG4gIGxldCBsYXN0VGhyb3duRXJyb3IgPSBudWxsO1xuICBjb25zdCBjaGVja0ZvclVwZGF0ZXMgPSAoKSA9PiB7XG4gICAgaWYgKGRpZFVuc3Vic2NyaWJlIHx8ICFpc01vdW50ZWQuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXRlc3RTdG9yZVN0YXRlID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBsZXQgbmV3Q2hpbGRQcm9wcywgZXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgIG5ld0NoaWxkUHJvcHMgPSBjaGlsZFByb3BzU2VsZWN0b3IoXG4gICAgICAgIGxhdGVzdFN0b3JlU3RhdGUsXG4gICAgICAgIGxhc3RXcmFwcGVyUHJvcHMuY3VycmVudFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvciA9IGU7XG4gICAgICBsYXN0VGhyb3duRXJyb3IgPSBlO1xuICAgIH1cbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBsYXN0VGhyb3duRXJyb3IgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobmV3Q2hpbGRQcm9wcyA9PT0gbGFzdENoaWxkUHJvcHMuY3VycmVudCkge1xuICAgICAgaWYgKCFyZW5kZXJJc1NjaGVkdWxlZC5jdXJyZW50KSB7XG4gICAgICAgIG5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdENoaWxkUHJvcHMuY3VycmVudCA9IG5ld0NoaWxkUHJvcHM7XG4gICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSBuZXdDaGlsZFByb3BzO1xuICAgICAgcmVuZGVySXNTY2hlZHVsZWQuY3VycmVudCA9IHRydWU7XG4gICAgICBhZGRpdGlvbmFsU3Vic2NyaWJlTGlzdGVuZXIoKTtcbiAgICB9XG4gIH07XG4gIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gY2hlY2tGb3JVcGRhdGVzO1xuICBzdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7XG4gIGNoZWNrRm9yVXBkYXRlcygpO1xuICBjb25zdCB1bnN1YnNjcmliZVdyYXBwZXIgPSAoKSA9PiB7XG4gICAgZGlkVW5zdWJzY3JpYmUgPSB0cnVlO1xuICAgIHN1YnNjcmlwdGlvbi50cnlVbnN1YnNjcmliZSgpO1xuICAgIHN1YnNjcmlwdGlvbi5vblN0YXRlQ2hhbmdlID0gbnVsbDtcbiAgICBpZiAobGFzdFRocm93bkVycm9yKSB7XG4gICAgICB0aHJvdyBsYXN0VGhyb3duRXJyb3I7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdW5zdWJzY3JpYmVXcmFwcGVyO1xufVxuZnVuY3Rpb24gc3RyaWN0RXF1YWwoYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn1cbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRQdXJlT3B0aW9uID0gZmFsc2U7XG5mdW5jdGlvbiBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCB7XG4gIC8vIFRoZSBgcHVyZWAgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQsIHNvIFRTIGRvZXNuJ3QgbGlrZSB1cyBkZXN0cnVjdHVyaW5nIHRoaXMgdG8gY2hlY2sgaXRzIGV4aXN0ZW5jZS5cbiAgLy8gQHRzLWlnbm9yZVxuICBwdXJlLFxuICBhcmVTdGF0ZXNFcXVhbCA9IHN0cmljdEVxdWFsLFxuICBhcmVPd25Qcm9wc0VxdWFsID0gc2hhbGxvd0VxdWFsLFxuICBhcmVTdGF0ZVByb3BzRXF1YWwgPSBzaGFsbG93RXF1YWwsXG4gIGFyZU1lcmdlZFByb3BzRXF1YWwgPSBzaGFsbG93RXF1YWwsXG4gIC8vIHVzZSBSZWFjdCdzIGZvcndhcmRSZWYgdG8gZXhwb3NlIGEgcmVmIG9mIHRoZSB3cmFwcGVkIGNvbXBvbmVudFxuICBmb3J3YXJkUmVmID0gZmFsc2UsXG4gIC8vIHRoZSBjb250ZXh0IGNvbnN1bWVyIHRvIHVzZVxuICBjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHRcbn0gPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgaWYgKHB1cmUgIT09IHZvaWQgMCAmJiAhaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbikge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkUHVyZU9wdGlvbiA9IHRydWU7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICAnVGhlIGBwdXJlYCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4gYGNvbm5lY3RgIGlzIG5vdyBhbHdheXMgYSBcInB1cmUvbWVtb2l6ZWRcIiBjb21wb25lbnQnXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBjb25zdCBDb250ZXh0ID0gY29udGV4dDtcbiAgY29uc3QgaW5pdE1hcFN0YXRlVG9Qcm9wcyA9IG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcnkobWFwU3RhdGVUb1Byb3BzKTtcbiAgY29uc3QgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcnkobWFwRGlzcGF0Y2hUb1Byb3BzKTtcbiAgY29uc3QgaW5pdE1lcmdlUHJvcHMgPSBtZXJnZVByb3BzRmFjdG9yeShtZXJnZVByb3BzKTtcbiAgY29uc3Qgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzID0gQm9vbGVhbihtYXBTdGF0ZVRvUHJvcHMpO1xuICBjb25zdCB3cmFwV2l0aENvbm5lY3QgPSAoV3JhcHBlZENvbXBvbmVudCkgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSAvKiBAX19QVVJFX18gKi8gaXNWYWxpZEVsZW1lbnRUeXBlKFdyYXBwZWRDb21wb25lbnQpO1xuICAgICAgaWYgKCFpc1ZhbGlkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFlvdSBtdXN0IHBhc3MgYSBjb21wb25lbnQgdG8gdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGNvbm5lY3QuIEluc3RlYWQgcmVjZWl2ZWQgJHtzdHJpbmdpZnlDb21wb25lbnQoXG4gICAgICAgICAgICBXcmFwcGVkQ29tcG9uZW50XG4gICAgICAgICAgKX1gXG4gICAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHdyYXBwZWRDb21wb25lbnROYW1lID0gV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUgfHwgXCJDb21wb25lbnRcIjtcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGBDb25uZWN0KCR7d3JhcHBlZENvbXBvbmVudE5hbWV9KWA7XG4gICAgY29uc3Qgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyA9IHtcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyxcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgd3JhcHBlZENvbXBvbmVudE5hbWUsXG4gICAgICBXcmFwcGVkQ29tcG9uZW50LFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaW5pdE1hcFN0YXRlVG9Qcm9wcyxcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgICBpbml0TWVyZ2VQcm9wcyxcbiAgICAgIGFyZVN0YXRlc0VxdWFsLFxuICAgICAgYXJlU3RhdGVQcm9wc0VxdWFsLFxuICAgICAgYXJlT3duUHJvcHNFcXVhbCxcbiAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWxcbiAgICB9O1xuICAgIGZ1bmN0aW9uIENvbm5lY3RGdW5jdGlvbihwcm9wcykge1xuICAgICAgY29uc3QgW3Byb3BzQ29udGV4dCwgcmVhY3RSZWR1eEZvcndhcmRlZFJlZiwgd3JhcHBlclByb3BzXSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCB7IHJlYWN0UmVkdXhGb3J3YXJkZWRSZWY6IHJlYWN0UmVkdXhGb3J3YXJkZWRSZWYyLCAuLi53cmFwcGVyUHJvcHMyIH0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIFtwcm9wcy5jb250ZXh0LCByZWFjdFJlZHV4Rm9yd2FyZGVkUmVmMiwgd3JhcHBlclByb3BzMl07XG4gICAgICB9LCBbcHJvcHNdKTtcbiAgICAgIGNvbnN0IENvbnRleHRUb1VzZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBsZXQgUmVzdWx0Q29udGV4dCA9IENvbnRleHQ7XG4gICAgICAgIGlmIChwcm9wc0NvbnRleHQ/LkNvbnN1bWVyKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZCA9IC8qIEBfX1BVUkVfXyAqLyBpc0NvbnRleHRDb25zdW1lcihcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAvKiBAX19QVVJFX18gKi8gUmVhY3QuY3JlYXRlRWxlbWVudChwcm9wc0NvbnRleHQuQ29uc3VtZXIsIG51bGwpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIllvdSBtdXN0IHBhc3MgYSB2YWxpZCBSZWFjdCBjb250ZXh0IGNvbnN1bWVyIGFzIGBwcm9wcy5jb250ZXh0YFwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZXN1bHRDb250ZXh0ID0gcHJvcHNDb250ZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVzdWx0Q29udGV4dDtcbiAgICAgIH0sIFtwcm9wc0NvbnRleHQsIENvbnRleHRdKTtcbiAgICAgIGNvbnN0IGNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZUNvbnRleHQoQ29udGV4dFRvVXNlKTtcbiAgICAgIGNvbnN0IGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA9IEJvb2xlYW4ocHJvcHMuc3RvcmUpICYmIEJvb2xlYW4ocHJvcHMuc3RvcmUuZ2V0U3RhdGUpICYmIEJvb2xlYW4ocHJvcHMuc3RvcmUuZGlzcGF0Y2gpO1xuICAgICAgY29uc3QgZGlkU3RvcmVDb21lRnJvbUNvbnRleHQgPSBCb29sZWFuKGNvbnRleHRWYWx1ZSkgJiYgQm9vbGVhbihjb250ZXh0VmFsdWUuc3RvcmUpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhZGlkU3RvcmVDb21lRnJvbVByb3BzICYmICFkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIFwic3RvcmVcIiBpbiB0aGUgY29udGV4dCBvZiBcIiR7ZGlzcGxheU5hbWV9XCIuIEVpdGhlciB3cmFwIHRoZSByb290IGNvbXBvbmVudCBpbiBhIDxQcm92aWRlcj4sIG9yIHBhc3MgYSBjdXN0b20gUmVhY3QgY29udGV4dCBwcm92aWRlciB0byA8UHJvdmlkZXI+IGFuZCB0aGUgY29ycmVzcG9uZGluZyBSZWFjdCBjb250ZXh0IGNvbnN1bWVyIHRvICR7ZGlzcGxheU5hbWV9IGluIGNvbm5lY3Qgb3B0aW9ucy5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdG9yZSA9IGRpZFN0b3JlQ29tZUZyb21Qcm9wcyA/IHByb3BzLnN0b3JlIDogY29udGV4dFZhbHVlLnN0b3JlO1xuICAgICAgY29uc3QgZ2V0U2VydmVyU3RhdGUgPSBkaWRTdG9yZUNvbWVGcm9tQ29udGV4dCA/IGNvbnRleHRWYWx1ZS5nZXRTZXJ2ZXJTdGF0ZSA6IHN0b3JlLmdldFN0YXRlO1xuICAgICAgY29uc3QgY2hpbGRQcm9wc1NlbGVjdG9yID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgICAgIHJldHVybiBmaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KHN0b3JlLmRpc3BhdGNoLCBzZWxlY3RvckZhY3RvcnlPcHRpb25zKTtcbiAgICAgIH0sIFtzdG9yZV0pO1xuICAgICAgY29uc3QgW3N1YnNjcmlwdGlvbiwgbm90aWZ5TmVzdGVkU3Vic10gPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKCFzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpXG4gICAgICAgICAgcmV0dXJuIE5PX1NVQlNDUklQVElPTl9BUlJBWTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uMiA9IGNyZWF0ZVN1YnNjcmlwdGlvbihcbiAgICAgICAgICBzdG9yZSxcbiAgICAgICAgICBkaWRTdG9yZUNvbWVGcm9tUHJvcHMgPyB2b2lkIDAgOiBjb250ZXh0VmFsdWUuc3Vic2NyaXB0aW9uXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5vdGlmeU5lc3RlZFN1YnMyID0gc3Vic2NyaXB0aW9uMi5ub3RpZnlOZXN0ZWRTdWJzLmJpbmQoc3Vic2NyaXB0aW9uMik7XG4gICAgICAgIHJldHVybiBbc3Vic2NyaXB0aW9uMiwgbm90aWZ5TmVzdGVkU3ViczJdO1xuICAgICAgfSwgW3N0b3JlLCBkaWRTdG9yZUNvbWVGcm9tUHJvcHMsIGNvbnRleHRWYWx1ZV0pO1xuICAgICAgY29uc3Qgb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoZGlkU3RvcmVDb21lRnJvbVByb3BzKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbnRleHRWYWx1ZSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25cbiAgICAgICAgfTtcbiAgICAgIH0sIFtkaWRTdG9yZUNvbWVGcm9tUHJvcHMsIGNvbnRleHRWYWx1ZSwgc3Vic2NyaXB0aW9uXSk7XG4gICAgICBjb25zdCBsYXN0Q2hpbGRQcm9wcyA9IFJlYWN0LnVzZVJlZih2b2lkIDApO1xuICAgICAgY29uc3QgbGFzdFdyYXBwZXJQcm9wcyA9IFJlYWN0LnVzZVJlZih3cmFwcGVyUHJvcHMpO1xuICAgICAgY29uc3QgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSA9IFJlYWN0LnVzZVJlZih2b2lkIDApO1xuICAgICAgY29uc3QgcmVuZGVySXNTY2hlZHVsZWQgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgICAgY29uc3QgaXNNb3VudGVkID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgICAgIGNvbnN0IGxhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IgPSBSZWFjdC51c2VSZWYoXG4gICAgICAgIHZvaWQgMFxuICAgICAgKTtcbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpc01vdW50ZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgaXNNb3VudGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIGNvbnN0IGFjdHVhbENoaWxkUHJvcHNTZWxlY3RvciA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RvciA9ICgpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50ICYmIHdyYXBwZXJQcm9wcyA9PT0gbGFzdFdyYXBwZXJQcm9wcy5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZS5jdXJyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2hpbGRQcm9wc1NlbGVjdG9yKHN0b3JlLmdldFN0YXRlKCksIHdyYXBwZXJQcm9wcyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICAgIH0sIFtzdG9yZSwgd3JhcHBlclByb3BzXSk7XG4gICAgICBjb25zdCBzdWJzY3JpYmVGb3JSZWFjdCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBzdWJzY3JpYmUgPSAocmVhY3RMaXN0ZW5lcikgPT4ge1xuICAgICAgICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHN1YnNjcmliZVVwZGF0ZXMoXG4gICAgICAgICAgICBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsXG4gICAgICAgICAgICBzdG9yZSxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbixcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNoaWxkUHJvcHNTZWxlY3RvcixcbiAgICAgICAgICAgIGxhc3RXcmFwcGVyUHJvcHMsXG4gICAgICAgICAgICBsYXN0Q2hpbGRQcm9wcyxcbiAgICAgICAgICAgIHJlbmRlcklzU2NoZWR1bGVkLFxuICAgICAgICAgICAgaXNNb3VudGVkLFxuICAgICAgICAgICAgY2hpbGRQcm9wc0Zyb21TdG9yZVVwZGF0ZSxcbiAgICAgICAgICAgIG5vdGlmeU5lc3RlZFN1YnMsXG4gICAgICAgICAgICByZWFjdExpc3RlbmVyXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZTtcbiAgICAgIH0sIFtzdWJzY3JpcHRpb25dKTtcbiAgICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3RXaXRoQXJncyhjYXB0dXJlV3JhcHBlclByb3BzLCBbXG4gICAgICAgIGxhc3RXcmFwcGVyUHJvcHMsXG4gICAgICAgIGxhc3RDaGlsZFByb3BzLFxuICAgICAgICByZW5kZXJJc1NjaGVkdWxlZCxcbiAgICAgICAgd3JhcHBlclByb3BzLFxuICAgICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLFxuICAgICAgICBub3RpZnlOZXN0ZWRTdWJzXG4gICAgICBdKTtcbiAgICAgIGxldCBhY3R1YWxDaGlsZFByb3BzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0dWFsQ2hpbGRQcm9wcyA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlKFxuICAgICAgICAgIC8vIFRPRE8gV2UncmUgcGFzc2luZyB0aHJvdWdoIGEgYmlnIHdyYXBwZXIgdGhhdCBkb2VzIGEgYnVuY2ggb2YgZXh0cmEgc2lkZSBlZmZlY3RzIGJlc2lkZXMgc3Vic2NyaWJpbmdcbiAgICAgICAgICBzdWJzY3JpYmVGb3JSZWFjdCxcbiAgICAgICAgICAvLyBUT0RPIFRoaXMgaXMgaW5jcmVkaWJseSBoYWNreS4gV2UndmUgYWxyZWFkeSBwcm9jZXNzZWQgdGhlIHN0b3JlIHVwZGF0ZSBhbmQgY2FsY3VsYXRlZCBuZXcgY2hpbGQgcHJvcHMsXG4gICAgICAgICAgLy8gVE9ETyBhbmQgd2UncmUganVzdCBwYXNzaW5nIHRoYXQgdGhyb3VnaCBzbyBpdCB0cmlnZ2VycyBhIHJlLXJlbmRlciBmb3IgdXMgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBgdVNFU2AuXG4gICAgICAgICAgYWN0dWFsQ2hpbGRQcm9wc1NlbGVjdG9yLFxuICAgICAgICAgIGdldFNlcnZlclN0YXRlID8gKCkgPT4gY2hpbGRQcm9wc1NlbGVjdG9yKGdldFNlcnZlclN0YXRlKCksIHdyYXBwZXJQcm9wcykgOiBhY3R1YWxDaGlsZFByb3BzU2VsZWN0b3JcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAobGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50KSB7XG4gICAgICAgICAgO1xuICAgICAgICAgIGVyci5tZXNzYWdlICs9IGBcblRoZSBlcnJvciBtYXkgYmUgY29ycmVsYXRlZCB3aXRoIHRoaXMgcHJldmlvdXMgZXJyb3I6XG4ke2xhdGVzdFN1YnNjcmlwdGlvbkNhbGxiYWNrRXJyb3IuY3VycmVudC5zdGFja31cblxuYDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICAgICAgbGF0ZXN0U3Vic2NyaXB0aW9uQ2FsbGJhY2tFcnJvci5jdXJyZW50ID0gdm9pZCAwO1xuICAgICAgICBjaGlsZFByb3BzRnJvbVN0b3JlVXBkYXRlLmN1cnJlbnQgPSB2b2lkIDA7XG4gICAgICAgIGxhc3RDaGlsZFByb3BzLmN1cnJlbnQgPSBhY3R1YWxDaGlsZFByb3BzO1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgLyogQF9fUFVSRV9fICovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBXcmFwcGVkQ29tcG9uZW50LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5hY3R1YWxDaGlsZFByb3BzLFxuICAgICAgICAgICAgICByZWY6IHJlYWN0UmVkdXhGb3J3YXJkZWRSZWZcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9LCBbcmVhY3RSZWR1eEZvcndhcmRlZFJlZiwgV3JhcHBlZENvbXBvbmVudCwgYWN0dWFsQ2hpbGRQcm9wc10pO1xuICAgICAgY29uc3QgcmVuZGVyZWRDaGlsZCA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSB7XG4gICAgICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHRUb1VzZS5Qcm92aWRlciwgeyB2YWx1ZTogb3ZlcnJpZGRlbkNvbnRleHRWYWx1ZSB9LCByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQ7XG4gICAgICB9LCBbQ29udGV4dFRvVXNlLCByZW5kZXJlZFdyYXBwZWRDb21wb25lbnQsIG92ZXJyaWRkZW5Db250ZXh0VmFsdWVdKTtcbiAgICAgIHJldHVybiByZW5kZXJlZENoaWxkO1xuICAgIH1cbiAgICBjb25zdCBfQ29ubmVjdCA9IFJlYWN0Lm1lbW8oQ29ubmVjdEZ1bmN0aW9uKTtcbiAgICBjb25zdCBDb25uZWN0ID0gX0Nvbm5lY3Q7XG4gICAgQ29ubmVjdC5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcbiAgICBDb25uZWN0LmRpc3BsYXlOYW1lID0gQ29ubmVjdEZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgaWYgKGZvcndhcmRSZWYpIHtcbiAgICAgIGNvbnN0IF9mb3J3YXJkZWQgPSBSZWFjdC5mb3J3YXJkUmVmKFxuICAgICAgICBmdW5jdGlvbiBmb3J3YXJkQ29ubmVjdFJlZihwcm9wcywgcmVmKSB7XG4gICAgICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KENvbm5lY3QsIHsgLi4ucHJvcHMsIHJlYWN0UmVkdXhGb3J3YXJkZWRSZWY6IHJlZiB9KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGZvcndhcmRlZCA9IF9mb3J3YXJkZWQ7XG4gICAgICBmb3J3YXJkZWQuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICAgIGZvcndhcmRlZC5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gaG9pc3ROb25SZWFjdFN0YXRpY3MoZm9yd2FyZGVkLCBXcmFwcGVkQ29tcG9uZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBob2lzdE5vblJlYWN0U3RhdGljcyhDb25uZWN0LCBXcmFwcGVkQ29tcG9uZW50KTtcbiAgfTtcbiAgcmV0dXJuIHdyYXBXaXRoQ29ubmVjdDtcbn1cbnZhciBjb25uZWN0X2RlZmF1bHQgPSBjb25uZWN0O1xuXG4vLyBzcmMvY29tcG9uZW50cy9Qcm92aWRlci50c3hcbmZ1bmN0aW9uIFByb3ZpZGVyKHtcbiAgc3RvcmUsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuLFxuICBzZXJ2ZXJTdGF0ZSxcbiAgc3RhYmlsaXR5Q2hlY2sgPSBcIm9uY2VcIixcbiAgaWRlbnRpdHlGdW5jdGlvbkNoZWNrID0gXCJvbmNlXCJcbn0pIHtcbiAgY29uc3QgY29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY3JlYXRlU3Vic2NyaXB0aW9uKHN0b3JlKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RvcmUsXG4gICAgICBzdWJzY3JpcHRpb24sXG4gICAgICBnZXRTZXJ2ZXJTdGF0ZTogc2VydmVyU3RhdGUgPyAoKSA9PiBzZXJ2ZXJTdGF0ZSA6IHZvaWQgMCxcbiAgICAgIHN0YWJpbGl0eUNoZWNrLFxuICAgICAgaWRlbnRpdHlGdW5jdGlvbkNoZWNrXG4gICAgfTtcbiAgfSwgW3N0b3JlLCBzZXJ2ZXJTdGF0ZSwgc3RhYmlsaXR5Q2hlY2ssIGlkZW50aXR5RnVuY3Rpb25DaGVja10pO1xuICBjb25zdCBwcmV2aW91c1N0YXRlID0gUmVhY3QudXNlTWVtbygoKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLCBbc3RvcmVdKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgeyBzdWJzY3JpcHRpb24gfSA9IGNvbnRleHRWYWx1ZTtcbiAgICBzdWJzY3JpcHRpb24ub25TdGF0ZUNoYW5nZSA9IHN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzO1xuICAgIHN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcbiAgICBpZiAocHJldmlvdXNTdGF0ZSAhPT0gc3RvcmUuZ2V0U3RhdGUoKSkge1xuICAgICAgc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbi50cnlVbnN1YnNjcmliZSgpO1xuICAgICAgc3Vic2NyaXB0aW9uLm9uU3RhdGVDaGFuZ2UgPSB2b2lkIDA7XG4gICAgfTtcbiAgfSwgW2NvbnRleHRWYWx1ZSwgcHJldmlvdXNTdGF0ZV0pO1xuICBjb25zdCBDb250ZXh0ID0gY29udGV4dCB8fCBSZWFjdFJlZHV4Q29udGV4dDtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNvbnRleHRWYWx1ZSB9LCBjaGlsZHJlbik7XG59XG52YXIgUHJvdmlkZXJfZGVmYXVsdCA9IFByb3ZpZGVyO1xuXG4vLyBzcmMvaG9va3MvdXNlU3RvcmUudHNcbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgY29uc3QgdXNlUmVkdXhDb250ZXh0MiA9IGNvbnRleHQgPT09IFJlYWN0UmVkdXhDb250ZXh0ID8gdXNlUmVkdXhDb250ZXh0IDogKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjcmVhdGVSZWR1eENvbnRleHRIb29rKGNvbnRleHQpXG4gICk7XG4gIGNvbnN0IHVzZVN0b3JlMiA9ICgpID0+IHtcbiAgICBjb25zdCB7IHN0b3JlIH0gPSB1c2VSZWR1eENvbnRleHQyKCk7XG4gICAgcmV0dXJuIHN0b3JlO1xuICB9O1xuICBPYmplY3QuYXNzaWduKHVzZVN0b3JlMiwge1xuICAgIHdpdGhUeXBlczogKCkgPT4gdXNlU3RvcmUyXG4gIH0pO1xuICByZXR1cm4gdXNlU3RvcmUyO1xufVxudmFyIHVzZVN0b3JlID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZVN0b3JlSG9vaygpO1xuXG4vLyBzcmMvaG9va3MvdXNlRGlzcGF0Y2gudHNcbmZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoSG9vayhjb250ZXh0ID0gUmVhY3RSZWR1eENvbnRleHQpIHtcbiAgY29uc3QgdXNlU3RvcmUyID0gY29udGV4dCA9PT0gUmVhY3RSZWR1eENvbnRleHQgPyB1c2VTdG9yZSA6IGNyZWF0ZVN0b3JlSG9vayhjb250ZXh0KTtcbiAgY29uc3QgdXNlRGlzcGF0Y2gyID0gKCkgPT4ge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmUyKCk7XG4gICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoO1xuICB9O1xuICBPYmplY3QuYXNzaWduKHVzZURpc3BhdGNoMiwge1xuICAgIHdpdGhUeXBlczogKCkgPT4gdXNlRGlzcGF0Y2gyXG4gIH0pO1xuICByZXR1cm4gdXNlRGlzcGF0Y2gyO1xufVxudmFyIHVzZURpc3BhdGNoID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURpc3BhdGNoSG9vaygpO1xuXG4vLyBzcmMvZXhwb3J0cy50c1xudmFyIGJhdGNoID0gZGVmYXVsdE5vb3BCYXRjaDtcblxuLy8gc3JjL2luZGV4LnRzXG5pbml0aWFsaXplVXNlU2VsZWN0b3IodXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IyKTtcbmluaXRpYWxpemVDb25uZWN0KFJlYWN0Mi51c2VTeW5jRXh0ZXJuYWxTdG9yZSk7XG5leHBvcnQge1xuICBQcm92aWRlcl9kZWZhdWx0IGFzIFByb3ZpZGVyLFxuICBSZWFjdFJlZHV4Q29udGV4dCxcbiAgYmF0Y2gsXG4gIGNvbm5lY3RfZGVmYXVsdCBhcyBjb25uZWN0LFxuICBjcmVhdGVEaXNwYXRjaEhvb2ssXG4gIGNyZWF0ZVNlbGVjdG9ySG9vayxcbiAgY3JlYXRlU3RvcmVIb29rLFxuICBzaGFsbG93RXF1YWwsXG4gIHVzZURpc3BhdGNoLFxuICB1c2VTZWxlY3RvcixcbiAgdXNlU3RvcmVcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWFjdC1yZWR1eC5tanMubWFwIiwiLy8gc3JjL2luZGV4LnRzXG5mdW5jdGlvbiBjcmVhdGVUaHVua01pZGRsZXdhcmUoZXh0cmFBcmd1bWVudCkge1xuICBjb25zdCBtaWRkbGV3YXJlID0gKHsgZGlzcGF0Y2gsIGdldFN0YXRlIH0pID0+IChuZXh0KSA9PiAoYWN0aW9uKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBhY3Rpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGFjdGlvbihkaXNwYXRjaCwgZ2V0U3RhdGUsIGV4dHJhQXJndW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICB9O1xuICByZXR1cm4gbWlkZGxld2FyZTtcbn1cbnZhciB0aHVuayA9IGNyZWF0ZVRodW5rTWlkZGxld2FyZSgpO1xudmFyIHdpdGhFeHRyYUFyZ3VtZW50ID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlO1xuZXhwb3J0IHtcbiAgdGh1bmssXG4gIHdpdGhFeHRyYUFyZ3VtZW50XG59O1xuIiwiLy8gc3JjL3V0aWxzL2Zvcm1hdFByb2RFcnJvck1lc3NhZ2UudHNcbmZ1bmN0aW9uIGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoY29kZSkge1xuICByZXR1cm4gYE1pbmlmaWVkIFJlZHV4IGVycm9yICMke2NvZGV9OyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT0ke2NvZGV9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMuIGA7XG59XG5cbi8vIHNyYy91dGlscy9zeW1ib2wtb2JzZXJ2YWJsZS50c1xudmFyICQkb2JzZXJ2YWJsZSA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5vYnNlcnZhYmxlIHx8IFwiQEBvYnNlcnZhYmxlXCIpKCk7XG52YXIgc3ltYm9sX29ic2VydmFibGVfZGVmYXVsdCA9ICQkb2JzZXJ2YWJsZTtcblxuLy8gc3JjL3V0aWxzL2FjdGlvblR5cGVzLnRzXG52YXIgcmFuZG9tU3RyaW5nID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KFwiXCIpLmpvaW4oXCIuXCIpO1xudmFyIEFjdGlvblR5cGVzID0ge1xuICBJTklUOiBgQEByZWR1eC9JTklUJHsvKiBAX19QVVJFX18gKi8gcmFuZG9tU3RyaW5nKCl9YCxcbiAgUkVQTEFDRTogYEBAcmVkdXgvUkVQTEFDRSR7LyogQF9fUFVSRV9fICovIHJhbmRvbVN0cmluZygpfWAsXG4gIFBST0JFX1VOS05PV05fQUNUSU9OOiAoKSA9PiBgQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTiR7cmFuZG9tU3RyaW5nKCl9YFxufTtcbnZhciBhY3Rpb25UeXBlc19kZWZhdWx0ID0gQWN0aW9uVHlwZXM7XG5cbi8vIHNyYy91dGlscy9pc1BsYWluT2JqZWN0LnRzXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fCBvYmogPT09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBsZXQgcHJvdG8gPSBvYmo7XG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gcHJvdG8gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IG51bGw7XG59XG5cbi8vIHNyYy91dGlscy9raW5kT2YudHNcbmZ1bmN0aW9uIG1pbmlLaW5kT2YodmFsKSB7XG4gIGlmICh2YWwgPT09IHZvaWQgMClcbiAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKHZhbCA9PT0gbnVsbClcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgY2FzZSBcInN5bWJvbFwiOlxuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSlcbiAgICByZXR1cm4gXCJhcnJheVwiO1xuICBpZiAoaXNEYXRlKHZhbCkpXG4gICAgcmV0dXJuIFwiZGF0ZVwiO1xuICBpZiAoaXNFcnJvcih2YWwpKVxuICAgIHJldHVybiBcImVycm9yXCI7XG4gIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IGN0b3JOYW1lKHZhbCk7XG4gIHN3aXRjaCAoY29uc3RydWN0b3JOYW1lKSB7XG4gICAgY2FzZSBcIlN5bWJvbFwiOlxuICAgIGNhc2UgXCJQcm9taXNlXCI6XG4gICAgY2FzZSBcIldlYWtNYXBcIjpcbiAgICBjYXNlIFwiV2Vha1NldFwiOlxuICAgIGNhc2UgXCJNYXBcIjpcbiAgICBjYXNlIFwiU2V0XCI6XG4gICAgICByZXR1cm4gY29uc3RydWN0b3JOYW1lO1xuICB9XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgXCJcIik7XG59XG5mdW5jdGlvbiBjdG9yTmFtZSh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IHZhbC5jb25zdHJ1Y3Rvci5uYW1lIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRXJyb3IodmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgdmFsLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIgJiYgdmFsLmNvbnN0cnVjdG9yICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3Iuc3RhY2tUcmFjZUxpbWl0ID09PSBcIm51bWJlclwiO1xufVxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRGF0ZSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHR5cGVvZiB2YWwudG9EYXRlU3RyaW5nID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHZhbC5nZXREYXRlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHZhbC5zZXREYXRlID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBraW5kT2YodmFsKSB7XG4gIGxldCB0eXBlT2ZWYWwgPSB0eXBlb2YgdmFsO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdHlwZU9mVmFsID0gbWluaUtpbmRPZih2YWwpO1xuICB9XG4gIHJldHVybiB0eXBlT2ZWYWw7XG59XG5cbi8vIHNyYy9jcmVhdGVTdG9yZS50c1xuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIGlmICh0eXBlb2YgcmVkdWNlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMikgOiBgRXhwZWN0ZWQgdGhlIHJvb3QgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKHJlZHVjZXIpfSdgKTtcbiAgfVxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGVuaGFuY2VyID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIGVuaGFuY2VyID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMCkgOiBcIkl0IGxvb2tzIGxpa2UgeW91IGFyZSBwYXNzaW5nIHNldmVyYWwgc3RvcmUgZW5oYW5jZXJzIHRvIGNyZWF0ZVN0b3JlKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCwgY29tcG9zZSB0aGVtIHRvZ2V0aGVyIHRvIGEgc2luZ2xlIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjY3JlYXRpbmctYS1zdG9yZS13aXRoLWVuaGFuY2VycyBmb3IgYW4gZXhhbXBsZS5cIik7XG4gIH1cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGVuaGFuY2VyID0gcHJlbG9hZGVkU3RhdGU7XG4gICAgcHJlbG9hZGVkU3RhdGUgPSB2b2lkIDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMSkgOiBgRXhwZWN0ZWQgdGhlIGVuaGFuY2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YoZW5oYW5jZXIpfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuaGFuY2VyKGNyZWF0ZVN0b3JlKShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSk7XG4gIH1cbiAgbGV0IGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgbGV0IGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICBsZXQgY3VycmVudExpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGxldCBuZXh0TGlzdGVuZXJzID0gY3VycmVudExpc3RlbmVycztcbiAgbGV0IGxpc3RlbmVySWRDb3VudGVyID0gMDtcbiAgbGV0IGlzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpIHtcbiAgICBpZiAobmV4dExpc3RlbmVycyA9PT0gY3VycmVudExpc3RlbmVycykge1xuICAgICAgbmV4dExpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICBjdXJyZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyLCBrZXkpID0+IHtcbiAgICAgICAgbmV4dExpc3RlbmVycy5zZXQoa2V5LCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMpIDogXCJZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLmdldFN0YXRlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiBUaGUgcmVkdWNlciBoYXMgYWxyZWFkeSByZWNlaXZlZCB0aGUgc3RhdGUgYXMgYW4gYXJndW1lbnQuIFBhc3MgaXQgZG93biBmcm9tIHRoZSB0b3AgcmVkdWNlciBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQgZnJvbSB0aGUgc3RvcmUuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG4gIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNCkgOiBgRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YobGlzdGVuZXIpfSdgKTtcbiAgICB9XG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDUpIDogXCJZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLnN1YnNjcmliZSgpIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gSWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgbm90aWZpZWQgYWZ0ZXIgdGhlIHN0b3JlIGhhcyBiZWVuIHVwZGF0ZWQsIHN1YnNjcmliZSBmcm9tIGEgY29tcG9uZW50IGFuZCBpbnZva2Ugc3RvcmUuZ2V0U3RhdGUoKSBpbiB0aGUgY2FsbGJhY2sgdG8gYWNjZXNzIHRoZSBsYXRlc3Qgc3RhdGUuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy5cIik7XG4gICAgfVxuICAgIGxldCBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICBjb25zdCBsaXN0ZW5lcklkID0gbGlzdGVuZXJJZENvdW50ZXIrKztcbiAgICBuZXh0TGlzdGVuZXJzLnNldChsaXN0ZW5lcklkLCBsaXN0ZW5lcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKCFpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNikgOiBcIllvdSBtYXkgbm90IHVuc3Vic2NyaWJlIGZyb20gYSBzdG9yZSBsaXN0ZW5lciB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuIFNlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGkvc3RvcmUjc3Vic2NyaWJlbGlzdGVuZXIgZm9yIG1vcmUgZGV0YWlscy5cIik7XG4gICAgICB9XG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIG5leHRMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVySWQpO1xuICAgICAgY3VycmVudExpc3RlbmVycyA9IG51bGw7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNykgOiBgQWN0aW9ucyBtdXN0IGJlIHBsYWluIG9iamVjdHMuIEluc3RlYWQsIHRoZSBhY3R1YWwgdHlwZSB3YXM6ICcke2tpbmRPZihhY3Rpb24pfScuIFlvdSBtYXkgbmVlZCB0byBhZGQgbWlkZGxld2FyZSB0byB5b3VyIHN0b3JlIHNldHVwIHRvIGhhbmRsZSBkaXNwYXRjaGluZyBvdGhlciB2YWx1ZXMsIHN1Y2ggYXMgJ3JlZHV4LXRodW5rJyB0byBoYW5kbGUgZGlzcGF0Y2hpbmcgZnVuY3Rpb25zLiBTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTQtc3RvcmUjbWlkZGxld2FyZSBhbmQgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvdHV0b3JpYWxzL2Z1bmRhbWVudGFscy9wYXJ0LTYtYXN5bmMtbG9naWMjdXNpbmctdGhlLXJlZHV4LXRodW5rLW1pZGRsZXdhcmUgZm9yIGV4YW1wbGVzLmApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFjdGlvbi50eXBlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg4KSA6ICdBY3Rpb25zIG1heSBub3QgaGF2ZSBhbiB1bmRlZmluZWQgXCJ0eXBlXCIgcHJvcGVydHkuIFlvdSBtYXkgaGF2ZSBtaXNzcGVsbGVkIGFuIGFjdGlvbiB0eXBlIHN0cmluZyBjb25zdGFudC4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIiA/IGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoMTcpIDogYEFjdGlvbiBcInR5cGVcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nLiBJbnN0ZWFkLCB0aGUgYWN0dWFsIHR5cGUgd2FzOiAnJHtraW5kT2YoYWN0aW9uLnR5cGUpfScuIFZhbHVlIHdhczogJyR7YWN0aW9uLnR5cGV9JyAoc3RyaW5naWZpZWQpYCk7XG4gICAgfVxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg5KSA6IFwiUmVkdWNlcnMgbWF5IG5vdCBkaXNwYXRjaCBhY3Rpb25zLlwiKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGxpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMgPSBuZXh0TGlzdGVuZXJzO1xuICAgIGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIHJlcGxhY2VSZWR1Y2VyKG5leHRSZWR1Y2VyKSB7XG4gICAgaWYgKHR5cGVvZiBuZXh0UmVkdWNlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkgOiBgRXhwZWN0ZWQgdGhlIG5leHRSZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQsIHJlY2VpdmVkOiAnJHtraW5kT2YobmV4dFJlZHVjZXIpfWApO1xuICAgIH1cbiAgICBjdXJyZW50UmVkdWNlciA9IG5leHRSZWR1Y2VyO1xuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuUkVQTEFDRVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIG9ic2VydmFibGUoKSB7XG4gICAgY29uc3Qgb3V0ZXJTdWJzY3JpYmUgPSBzdWJzY3JpYmU7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYnNlcnZlciAhPT0gXCJvYmplY3RcIiB8fCBvYnNlcnZlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDExKSA6IGBFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LiBJbnN0ZWFkLCByZWNlaXZlZDogJyR7a2luZE9mKG9ic2VydmVyKX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlKCkge1xuICAgICAgICAgIGNvbnN0IG9ic2VydmVyQXNPYnNlcnZlciA9IG9ic2VydmVyO1xuICAgICAgICAgIGlmIChvYnNlcnZlckFzT2JzZXJ2ZXIubmV4dCkge1xuICAgICAgICAgICAgb2JzZXJ2ZXJBc09ic2VydmVyLm5leHQoZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9ic2VydmVTdGF0ZSgpO1xuICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IG91dGVyU3Vic2NyaWJlKG9ic2VydmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmVcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBbc3ltYm9sX29ic2VydmFibGVfZGVmYXVsdF0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgZGlzcGF0Y2goe1xuICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuSU5JVFxuICB9KTtcbiAgY29uc3Qgc3RvcmUgPSB7XG4gICAgZGlzcGF0Y2gsXG4gICAgc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlLFxuICAgIHJlcGxhY2VSZWR1Y2VyLFxuICAgIFtzeW1ib2xfb2JzZXJ2YWJsZV9kZWZhdWx0XTogb2JzZXJ2YWJsZVxuICB9O1xuICByZXR1cm4gc3RvcmU7XG59XG5mdW5jdGlvbiBsZWdhY3lfY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHJldHVybiBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpO1xufVxuXG4vLyBzcmMvdXRpbHMvd2FybmluZy50c1xuZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICB0cnkge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG59XG5cbi8vIHNyYy9jb21iaW5lUmVkdWNlcnMudHNcbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIGNvbnN0IHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICBjb25zdCBhcmd1bWVudE5hbWUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGUgPT09IGFjdGlvblR5cGVzX2RlZmF1bHQuSU5JVCA/IFwicHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlXCIgOiBcInByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyXCI7XG4gIGlmIChyZWR1Y2VyS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gXCJTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLlwiO1xuICB9XG4gIGlmICghaXNQbGFpbk9iamVjdChpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiBgVGhlICR7YXJndW1lbnROYW1lfSBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFwiJHtraW5kT2YoaW5wdXRTdGF0ZSl9XCIuIEV4cGVjdGVkIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czogXCIke3JlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpfVwiYDtcbiAgfVxuICBjb25zdCB1bmV4cGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKGlucHV0U3RhdGUpLmZpbHRlcigoa2V5KSA9PiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV0pO1xuICB1bmV4cGVjdGVkS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XSA9IHRydWU7XG4gIH0pO1xuICBpZiAoYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBhY3Rpb25UeXBlc19kZWZhdWx0LlJFUExBQ0UpXG4gICAgcmV0dXJuO1xuICBpZiAodW5leHBlY3RlZEtleXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBgVW5leHBlY3RlZCAke3VuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyBcImtleXNcIiA6IFwia2V5XCJ9IFwiJHt1bmV4cGVjdGVkS2V5cy5qb2luKCdcIiwgXCInKX1cIiBmb3VuZCBpbiAke2FyZ3VtZW50TmFtZX0uIEV4cGVjdGVkIHRvIGZpbmQgb25lIG9mIHRoZSBrbm93biByZWR1Y2VyIGtleXMgaW5zdGVhZDogXCIke3JlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpfVwiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLmA7XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydFJlZHVjZXJTaGFwZShyZWR1Y2Vycykge1xuICBPYmplY3Qua2V5cyhyZWR1Y2VycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29uc3QgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih2b2lkIDAsIHtcbiAgICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuSU5JVFxuICAgIH0pO1xuICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMikgOiBgVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7a2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIElmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIHJlZHVjZXIgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQuIElmIHlvdSBkb24ndCB3YW50IHRvIHNldCBhIHZhbHVlIGZvciB0aGlzIHJlZHVjZXIsIHlvdSBjYW4gdXNlIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuYCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVkdWNlcih2b2lkIDAsIHtcbiAgICAgIHR5cGU6IGFjdGlvblR5cGVzX2RlZmF1bHQuUFJPQkVfVU5LTk9XTl9BQ1RJT04oKVxuICAgIH0pID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMykgOiBgVGhlIHNsaWNlIHJlZHVjZXIgZm9yIGtleSBcIiR7a2V5fVwiIHJldHVybmVkIHVuZGVmaW5lZCB3aGVuIHByb2JlZCB3aXRoIGEgcmFuZG9tIHR5cGUuIERvbid0IHRyeSB0byBoYW5kbGUgJyR7YWN0aW9uVHlwZXNfZGVmYXVsdC5JTklUfScgb3Igb3RoZXIgYWN0aW9ucyBpbiBcInJlZHV4LypcIiBuYW1lc3BhY2UuIFRoZXkgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4gSW5zdGVhZCwgeW91IG11c3QgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBpbiB3aGljaCBjYXNlIHlvdSBtdXN0IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgYWN0aW9uIHR5cGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLCBidXQgY2FuIGJlIG51bGwuYCk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICBjb25zdCByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgY29uc3QgZmluYWxSZWR1Y2VycyA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gcmVkdWNlcktleXNbaV07XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKHR5cGVvZiByZWR1Y2Vyc1trZXldID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHdhcm5pbmcoYE5vIHJlZHVjZXIgcHJvdmlkZWQgZm9yIGtleSBcIiR7a2V5fVwiYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmaW5hbFJlZHVjZXJzW2tleV0gPSByZWR1Y2Vyc1trZXldO1xuICAgIH1cbiAgfVxuICBjb25zdCBmaW5hbFJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMoZmluYWxSZWR1Y2Vycyk7XG4gIGxldCB1bmV4cGVjdGVkS2V5Q2FjaGU7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB1bmV4cGVjdGVkS2V5Q2FjaGUgPSB7fTtcbiAgfVxuICBsZXQgc2hhcGVBc3NlcnRpb25FcnJvcjtcbiAgdHJ5IHtcbiAgICBhc3NlcnRSZWR1Y2VyU2hhcGUoZmluYWxSZWR1Y2Vycyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzaGFwZUFzc2VydGlvbkVycm9yID0gZTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gY29tYmluYXRpb24oc3RhdGUgPSB7fSwgYWN0aW9uKSB7XG4gICAgaWYgKHNoYXBlQXNzZXJ0aW9uRXJyb3IpIHtcbiAgICAgIHRocm93IHNoYXBlQXNzZXJ0aW9uRXJyb3I7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHdhcm5pbmdNZXNzYWdlID0gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShzdGF0ZSwgZmluYWxSZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpO1xuICAgICAgaWYgKHdhcm5pbmdNZXNzYWdlKSB7XG4gICAgICAgIHdhcm5pbmcod2FybmluZ01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tpXTtcbiAgICAgIGNvbnN0IHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW2tleV07XG4gICAgICBjb25zdCBwcmV2aW91c1N0YXRlRm9yS2V5ID0gc3RhdGVba2V5XTtcbiAgICAgIGNvbnN0IG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFN0YXRlRm9yS2V5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvblR5cGUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE0KSA6IGBXaGVuIGNhbGxlZCB3aXRoIGFuIGFjdGlvbiBvZiB0eXBlICR7YWN0aW9uVHlwZSA/IGBcIiR7U3RyaW5nKGFjdGlvblR5cGUpfVwiYCA6IFwiKHVua25vd24gdHlwZSlcIn0sIHRoZSBzbGljZSByZWR1Y2VyIGZvciBrZXkgXCIke2tleX1cIiByZXR1cm5lZCB1bmRlZmluZWQuIFRvIGlnbm9yZSBhbiBhY3Rpb24sIHlvdSBtdXN0IGV4cGxpY2l0bHkgcmV0dXJuIHRoZSBwcmV2aW91cyBzdGF0ZS4gSWYgeW91IHdhbnQgdGhpcyByZWR1Y2VyIHRvIGhvbGQgbm8gdmFsdWUsIHlvdSBjYW4gcmV0dXJuIG51bGwgaW5zdGVhZCBvZiB1bmRlZmluZWQuYCk7XG4gICAgICB9XG4gICAgICBuZXh0U3RhdGVba2V5XSA9IG5leHRTdGF0ZUZvcktleTtcbiAgICAgIGhhc0NoYW5nZWQgPSBoYXNDaGFuZ2VkIHx8IG5leHRTdGF0ZUZvcktleSAhPT0gcHJldmlvdXNTdGF0ZUZvcktleTtcbiAgICB9XG4gICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQgPyBuZXh0U3RhdGUgOiBzdGF0ZTtcbiAgfTtcbn1cblxuLy8gc3JjL2JpbmRBY3Rpb25DcmVhdG9ycy50c1xuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh0aGlzLCBhcmdzKSk7XG4gIH07XG59XG5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMoYWN0aW9uQ3JlYXRvcnMsIGRpc3BhdGNoKSB7XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpO1xuICB9XG4gIGlmICh0eXBlb2YgYWN0aW9uQ3JlYXRvcnMgIT09IFwib2JqZWN0XCIgfHwgYWN0aW9uQ3JlYXRvcnMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiID8gZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxNikgOiBgYmluZEFjdGlvbkNyZWF0b3JzIGV4cGVjdGVkIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLCBidXQgaW5zdGVhZCByZWNlaXZlZDogJyR7a2luZE9mKGFjdGlvbkNyZWF0b3JzKX0nLiBEaWQgeW91IHdyaXRlIFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cIiBpbnN0ZWFkIG9mIFwiaW1wb3J0ICogYXMgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiP2ApO1xuICB9XG4gIGNvbnN0IGJvdW5kQWN0aW9uQ3JlYXRvcnMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYWN0aW9uQ3JlYXRvcnMpIHtcbiAgICBjb25zdCBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYm91bmRBY3Rpb25DcmVhdG9yc1trZXldID0gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYm91bmRBY3Rpb25DcmVhdG9ycztcbn1cblxuLy8gc3JjL2NvbXBvc2UudHNcbmZ1bmN0aW9uIGNvbXBvc2UoLi4uZnVuY3MpIHtcbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoYXJnKSA9PiBhcmc7XG4gIH1cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuICByZXR1cm4gZnVuY3MucmVkdWNlKChhLCBiKSA9PiAoLi4uYXJncykgPT4gYShiKC4uLmFyZ3MpKSk7XG59XG5cbi8vIHNyYy9hcHBseU1pZGRsZXdhcmUudHNcbmZ1bmN0aW9uIGFwcGx5TWlkZGxld2FyZSguLi5taWRkbGV3YXJlcykge1xuICByZXR1cm4gKGNyZWF0ZVN0b3JlMikgPT4gKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZTIocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICAgIGxldCBkaXNwYXRjaCA9ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCIgPyBmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSA6IFwiRGlzcGF0Y2hpbmcgd2hpbGUgY29uc3RydWN0aW5nIHlvdXIgbWlkZGxld2FyZSBpcyBub3QgYWxsb3dlZC4gT3RoZXIgbWlkZGxld2FyZSB3b3VsZCBub3QgYmUgYXBwbGllZCB0byB0aGlzIGRpc3BhdGNoLlwiKTtcbiAgICB9O1xuICAgIGNvbnN0IG1pZGRsZXdhcmVBUEkgPSB7XG4gICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICBkaXNwYXRjaDogKGFjdGlvbiwgLi4uYXJncykgPT4gZGlzcGF0Y2goYWN0aW9uLCAuLi5hcmdzKVxuICAgIH07XG4gICAgY29uc3QgY2hhaW4gPSBtaWRkbGV3YXJlcy5tYXAoKG1pZGRsZXdhcmUpID0+IG1pZGRsZXdhcmUobWlkZGxld2FyZUFQSSkpO1xuICAgIGRpc3BhdGNoID0gY29tcG9zZSguLi5jaGFpbikoc3RvcmUuZGlzcGF0Y2gpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdG9yZSxcbiAgICAgIGRpc3BhdGNoXG4gICAgfTtcbiAgfTtcbn1cblxuLy8gc3JjL3V0aWxzL2lzQWN0aW9uLnRzXG5mdW5jdGlvbiBpc0FjdGlvbihhY3Rpb24pIHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QoYWN0aW9uKSAmJiBcInR5cGVcIiBpbiBhY3Rpb24gJiYgdHlwZW9mIGFjdGlvbi50eXBlID09PSBcInN0cmluZ1wiO1xufVxuZXhwb3J0IHtcbiAgYWN0aW9uVHlwZXNfZGVmYXVsdCBhcyBfX0RPX05PVF9VU0VfX0FjdGlvblR5cGVzLFxuICBhcHBseU1pZGRsZXdhcmUsXG4gIGJpbmRBY3Rpb25DcmVhdG9ycyxcbiAgY29tYmluZVJlZHVjZXJzLFxuICBjb21wb3NlLFxuICBjcmVhdGVTdG9yZSxcbiAgaXNBY3Rpb24sXG4gIGlzUGxhaW5PYmplY3QsXG4gIGxlZ2FjeV9jcmVhdGVTdG9yZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZHV4Lm1qcy5tYXAiLCIvLyBzcmMvZGV2TW9kZUNoZWNrcy9pZGVudGl0eUZ1bmN0aW9uQ2hlY2sudHNcbnZhciBydW5JZGVudGl0eUZ1bmN0aW9uQ2hlY2sgPSAocmVzdWx0RnVuYywgaW5wdXRTZWxlY3RvcnNSZXN1bHRzLCBvdXRwdXRTZWxlY3RvclJlc3VsdCkgPT4ge1xuICBpZiAoaW5wdXRTZWxlY3RvcnNSZXN1bHRzLmxlbmd0aCA9PT0gMSAmJiBpbnB1dFNlbGVjdG9yc1Jlc3VsdHNbMF0gPT09IG91dHB1dFNlbGVjdG9yUmVzdWx0KSB7XG4gICAgbGV0IGlzSW5wdXRTYW1lQXNPdXRwdXQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW1wdHlPYmplY3QgPSB7fTtcbiAgICAgIGlmIChyZXN1bHRGdW5jKGVtcHR5T2JqZWN0KSA9PT0gZW1wdHlPYmplY3QpXG4gICAgICAgIGlzSW5wdXRTYW1lQXNPdXRwdXQgPSB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgIH1cbiAgICBpZiAoaXNJbnB1dFNhbWVBc091dHB1dCkge1xuICAgICAgbGV0IHN0YWNrID0gdm9pZCAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIDtcbiAgICAgICAgKHsgc3RhY2sgfSA9IGUpO1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIlRoZSByZXN1bHQgZnVuY3Rpb24gcmV0dXJuZWQgaXRzIG93biBpbnB1dHMgd2l0aG91dCBtb2RpZmljYXRpb24uIGUuZ1xcbmBjcmVhdGVTZWxlY3Rvcihbc3RhdGUgPT4gc3RhdGUudG9kb3NdLCB0b2RvcyA9PiB0b2RvcylgXFxuVGhpcyBjb3VsZCBsZWFkIHRvIGluZWZmaWNpZW50IG1lbW9pemF0aW9uIGFuZCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzLlxcbkVuc3VyZSB0cmFuc2Zvcm1hdGlvbiBsb2dpYyBpcyBpbiB0aGUgcmVzdWx0IGZ1bmN0aW9uLCBhbmQgZXh0cmFjdGlvbiBsb2dpYyBpcyBpbiB0aGUgaW5wdXQgc2VsZWN0b3JzLlwiLFxuICAgICAgICB7IHN0YWNrIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG59O1xuXG4vLyBzcmMvZGV2TW9kZUNoZWNrcy9pbnB1dFN0YWJpbGl0eUNoZWNrLnRzXG52YXIgcnVuSW5wdXRTdGFiaWxpdHlDaGVjayA9IChpbnB1dFNlbGVjdG9yUmVzdWx0c09iamVjdCwgb3B0aW9ucywgaW5wdXRTZWxlY3RvckFyZ3MpID0+IHtcbiAgY29uc3QgeyBtZW1vaXplLCBtZW1vaXplT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgY29uc3QgeyBpbnB1dFNlbGVjdG9yUmVzdWx0cywgaW5wdXRTZWxlY3RvclJlc3VsdHNDb3B5IH0gPSBpbnB1dFNlbGVjdG9yUmVzdWx0c09iamVjdDtcbiAgY29uc3QgY3JlYXRlQW5FbXB0eU9iamVjdCA9IG1lbW9pemUoKCkgPT4gKHt9KSwgLi4ubWVtb2l6ZU9wdGlvbnMpO1xuICBjb25zdCBhcmVJbnB1dFNlbGVjdG9yUmVzdWx0c0VxdWFsID0gY3JlYXRlQW5FbXB0eU9iamVjdC5hcHBseShudWxsLCBpbnB1dFNlbGVjdG9yUmVzdWx0cykgPT09IGNyZWF0ZUFuRW1wdHlPYmplY3QuYXBwbHkobnVsbCwgaW5wdXRTZWxlY3RvclJlc3VsdHNDb3B5KTtcbiAgaWYgKCFhcmVJbnB1dFNlbGVjdG9yUmVzdWx0c0VxdWFsKSB7XG4gICAgbGV0IHN0YWNrID0gdm9pZCAwO1xuICAgIHRyeSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICA7XG4gICAgICAoeyBzdGFjayB9ID0gZSk7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiQW4gaW5wdXQgc2VsZWN0b3IgcmV0dXJuZWQgYSBkaWZmZXJlbnQgcmVzdWx0IHdoZW4gcGFzc2VkIHNhbWUgYXJndW1lbnRzLlxcblRoaXMgbWVhbnMgeW91ciBvdXRwdXQgc2VsZWN0b3Igd2lsbCBsaWtlbHkgcnVuIG1vcmUgZnJlcXVlbnRseSB0aGFuIGludGVuZGVkLlxcbkF2b2lkIHJldHVybmluZyBhIG5ldyByZWZlcmVuY2UgaW5zaWRlIHlvdXIgaW5wdXQgc2VsZWN0b3IsIGUuZy5cXG5gY3JlYXRlU2VsZWN0b3IoW3N0YXRlID0+IHN0YXRlLnRvZG9zLm1hcCh0b2RvID0+IHRvZG8uaWQpXSwgdG9kb0lkcyA9PiB0b2RvSWRzLmxlbmd0aClgXCIsXG4gICAgICB7XG4gICAgICAgIGFyZ3VtZW50czogaW5wdXRTZWxlY3RvckFyZ3MsXG4gICAgICAgIGZpcnN0SW5wdXRzOiBpbnB1dFNlbGVjdG9yUmVzdWx0cyxcbiAgICAgICAgc2Vjb25kSW5wdXRzOiBpbnB1dFNlbGVjdG9yUmVzdWx0c0NvcHksXG4gICAgICAgIHN0YWNrXG4gICAgICB9XG4gICAgKTtcbiAgfVxufTtcblxuLy8gc3JjL2Rldk1vZGVDaGVja3Mvc2V0R2xvYmFsRGV2TW9kZUNoZWNrcy50c1xudmFyIGdsb2JhbERldk1vZGVDaGVja3MgPSB7XG4gIGlucHV0U3RhYmlsaXR5Q2hlY2s6IFwib25jZVwiLFxuICBpZGVudGl0eUZ1bmN0aW9uQ2hlY2s6IFwib25jZVwiXG59O1xudmFyIHNldEdsb2JhbERldk1vZGVDaGVja3MgPSAoZGV2TW9kZUNoZWNrcykgPT4ge1xuICBPYmplY3QuYXNzaWduKGdsb2JhbERldk1vZGVDaGVja3MsIGRldk1vZGVDaGVja3MpO1xufTtcblxuLy8gc3JjL3V0aWxzLnRzXG52YXIgTk9UX0ZPVU5EID0gLyogQF9fUFVSRV9fICovIFN5bWJvbChcIk5PVF9GT1VORFwiKTtcbmZ1bmN0aW9uIGFzc2VydElzRnVuY3Rpb24oZnVuYywgZXJyb3JNZXNzYWdlID0gYGV4cGVjdGVkIGEgZnVuY3Rpb24sIGluc3RlYWQgcmVjZWl2ZWQgJHt0eXBlb2YgZnVuY31gKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJvck1lc3NhZ2UpO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnRJc09iamVjdChvYmplY3QsIGVycm9yTWVzc2FnZSA9IGBleHBlY3RlZCBhbiBvYmplY3QsIGluc3RlYWQgcmVjZWl2ZWQgJHt0eXBlb2Ygb2JqZWN0fWApIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgIT09IFwib2JqZWN0XCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVycm9yTWVzc2FnZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydElzQXJyYXlPZkZ1bmN0aW9ucyhhcnJheSwgZXJyb3JNZXNzYWdlID0gYGV4cGVjdGVkIGFsbCBpdGVtcyB0byBiZSBmdW5jdGlvbnMsIGluc3RlYWQgcmVjZWl2ZWQgdGhlIGZvbGxvd2luZyB0eXBlczogYCkge1xuICBpZiAoIWFycmF5LmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIGNvbnN0IGl0ZW1UeXBlcyA9IGFycmF5Lm1hcChcbiAgICAgIChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gXCJmdW5jdGlvblwiID8gYGZ1bmN0aW9uICR7aXRlbS5uYW1lIHx8IFwidW5uYW1lZFwifSgpYCA6IHR5cGVvZiBpdGVtXG4gICAgKS5qb2luKFwiLCBcIik7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtlcnJvck1lc3NhZ2V9WyR7aXRlbVR5cGVzfV1gKTtcbiAgfVxufVxudmFyIGVuc3VyZUlzQXJyYXkgPSAoaXRlbSkgPT4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpdGVtKSA/IGl0ZW0gOiBbaXRlbV07XG59O1xuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jaWVzKGNyZWF0ZVNlbGVjdG9yQXJncykge1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBBcnJheS5pc0FycmF5KGNyZWF0ZVNlbGVjdG9yQXJnc1swXSkgPyBjcmVhdGVTZWxlY3RvckFyZ3NbMF0gOiBjcmVhdGVTZWxlY3RvckFyZ3M7XG4gIGFzc2VydElzQXJyYXlPZkZ1bmN0aW9ucyhcbiAgICBkZXBlbmRlbmNpZXMsXG4gICAgYGNyZWF0ZVNlbGVjdG9yIGV4cGVjdHMgYWxsIGlucHV0LXNlbGVjdG9ycyB0byBiZSBmdW5jdGlvbnMsIGJ1dCByZWNlaXZlZCB0aGUgZm9sbG93aW5nIHR5cGVzOiBgXG4gICk7XG4gIHJldHVybiBkZXBlbmRlbmNpZXM7XG59XG5mdW5jdGlvbiBjb2xsZWN0SW5wdXRTZWxlY3RvclJlc3VsdHMoZGVwZW5kZW5jaWVzLCBpbnB1dFNlbGVjdG9yQXJncykge1xuICBjb25zdCBpbnB1dFNlbGVjdG9yUmVzdWx0cyA9IFtdO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZGVwZW5kZW5jaWVzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaW5wdXRTZWxlY3RvclJlc3VsdHMucHVzaChkZXBlbmRlbmNpZXNbaV0uYXBwbHkobnVsbCwgaW5wdXRTZWxlY3RvckFyZ3MpKTtcbiAgfVxuICByZXR1cm4gaW5wdXRTZWxlY3RvclJlc3VsdHM7XG59XG52YXIgZ2V0RGV2TW9kZUNoZWNrc0V4ZWN1dGlvbkluZm8gPSAoZmlyc3RSdW4sIGRldk1vZGVDaGVja3MpID0+IHtcbiAgY29uc3QgeyBpZGVudGl0eUZ1bmN0aW9uQ2hlY2ssIGlucHV0U3RhYmlsaXR5Q2hlY2sgfSA9IHtcbiAgICAuLi5nbG9iYWxEZXZNb2RlQ2hlY2tzLFxuICAgIC4uLmRldk1vZGVDaGVja3NcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBpZGVudGl0eUZ1bmN0aW9uQ2hlY2s6IHtcbiAgICAgIHNob3VsZFJ1bjogaWRlbnRpdHlGdW5jdGlvbkNoZWNrID09PSBcImFsd2F5c1wiIHx8IGlkZW50aXR5RnVuY3Rpb25DaGVjayA9PT0gXCJvbmNlXCIgJiYgZmlyc3RSdW4sXG4gICAgICBydW46IHJ1bklkZW50aXR5RnVuY3Rpb25DaGVja1xuICAgIH0sXG4gICAgaW5wdXRTdGFiaWxpdHlDaGVjazoge1xuICAgICAgc2hvdWxkUnVuOiBpbnB1dFN0YWJpbGl0eUNoZWNrID09PSBcImFsd2F5c1wiIHx8IGlucHV0U3RhYmlsaXR5Q2hlY2sgPT09IFwib25jZVwiICYmIGZpcnN0UnVuLFxuICAgICAgcnVuOiBydW5JbnB1dFN0YWJpbGl0eUNoZWNrXG4gICAgfVxuICB9O1xufTtcblxuLy8gc3JjL2F1dG90cmFja01lbW9pemUvYXV0b3RyYWNraW5nLnRzXG52YXIgJFJFVklTSU9OID0gMDtcbnZhciBDVVJSRU5UX1RSQUNLRVIgPSBudWxsO1xudmFyIENlbGwgPSBjbGFzcyB7XG4gIHJldmlzaW9uID0gJFJFVklTSU9OO1xuICBfdmFsdWU7XG4gIF9sYXN0VmFsdWU7XG4gIF9pc0VxdWFsID0gdHJpcGxlRXE7XG4gIGNvbnN0cnVjdG9yKGluaXRpYWxWYWx1ZSwgaXNFcXVhbCA9IHRyaXBsZUVxKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9sYXN0VmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgdGhpcy5faXNFcXVhbCA9IGlzRXF1YWw7XG4gIH1cbiAgLy8gV2hlbmV2ZXIgYSBzdG9yYWdlIHZhbHVlIGlzIHJlYWQsIGl0J2xsIGFkZCBpdHNlbGYgdG8gdGhlIGN1cnJlbnQgdHJhY2tlciBpZlxuICAvLyBvbmUgZXhpc3RzLCBlbnRhbmdsaW5nIGl0cyBzdGF0ZSB3aXRoIHRoYXQgY2FjaGUuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICBDVVJSRU5UX1RSQUNLRVI/LmFkZCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgLy8gV2hlbmV2ZXIgYSBzdG9yYWdlIHZhbHVlIGlzIHVwZGF0ZWQsIHdlIGJ1bXAgdGhlIGdsb2JhbCByZXZpc2lvbiBjbG9jayxcbiAgLy8gYXNzaWduIHRoZSByZXZpc2lvbiBmb3IgdGhpcyBzdG9yYWdlIHRvIHRoZSBuZXcgdmFsdWUsIF9hbmRfIHdlIHNjaGVkdWxlIGFcbiAgLy8gcmVyZW5kZXIuIFRoaXMgaXMgaW1wb3J0YW50LCBhbmQgaXQncyB3aGF0IG1ha2VzIGF1dG90cmFja2luZyAgX3B1bGxfXG4gIC8vIGJhc2VkLiBXZSBkb24ndCBhY3RpdmVseSB0ZWxsIHRoZSBjYWNoZXMgd2hpY2ggZGVwZW5kIG9uIHRoZSBzdG9yYWdlIHRoYXRcbiAgLy8gYW55dGhpbmcgaGFzIGhhcHBlbmVkLiBJbnN0ZWFkLCB3ZSByZWNvbXB1dGUgdGhlIGNhY2hlcyB3aGVuIG5lZWRlZC5cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgaWYgKHRoaXMudmFsdWUgPT09IG5ld1ZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgdGhpcy5yZXZpc2lvbiA9ICsrJFJFVklTSU9OO1xuICB9XG59O1xuZnVuY3Rpb24gdHJpcGxlRXEoYSwgYikge1xuICByZXR1cm4gYSA9PT0gYjtcbn1cbnZhciBUcmFja2luZ0NhY2hlID0gY2xhc3Mge1xuICBfY2FjaGVkVmFsdWU7XG4gIF9jYWNoZWRSZXZpc2lvbiA9IC0xO1xuICBfZGVwcyA9IFtdO1xuICBoaXRzID0gMDtcbiAgZm47XG4gIGNvbnN0cnVjdG9yKGZuKSB7XG4gICAgdGhpcy5mbiA9IGZuO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMuX2NhY2hlZFZhbHVlID0gdm9pZCAwO1xuICAgIHRoaXMuX2NhY2hlZFJldmlzaW9uID0gLTE7XG4gICAgdGhpcy5fZGVwcyA9IFtdO1xuICAgIHRoaXMuaGl0cyA9IDA7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGlmICh0aGlzLnJldmlzaW9uID4gdGhpcy5fY2FjaGVkUmV2aXNpb24pIHtcbiAgICAgIGNvbnN0IHsgZm4gfSA9IHRoaXM7XG4gICAgICBjb25zdCBjdXJyZW50VHJhY2tlciA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgICBjb25zdCBwcmV2VHJhY2tlciA9IENVUlJFTlRfVFJBQ0tFUjtcbiAgICAgIENVUlJFTlRfVFJBQ0tFUiA9IGN1cnJlbnRUcmFja2VyO1xuICAgICAgdGhpcy5fY2FjaGVkVmFsdWUgPSBmbigpO1xuICAgICAgQ1VSUkVOVF9UUkFDS0VSID0gcHJldlRyYWNrZXI7XG4gICAgICB0aGlzLmhpdHMrKztcbiAgICAgIHRoaXMuX2RlcHMgPSBBcnJheS5mcm9tKGN1cnJlbnRUcmFja2VyKTtcbiAgICAgIHRoaXMuX2NhY2hlZFJldmlzaW9uID0gdGhpcy5yZXZpc2lvbjtcbiAgICB9XG4gICAgQ1VSUkVOVF9UUkFDS0VSPy5hZGQodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFZhbHVlO1xuICB9XG4gIGdldCByZXZpc2lvbigpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoLi4udGhpcy5fZGVwcy5tYXAoKGQpID0+IGQucmV2aXNpb24pLCAwKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGdldFZhbHVlKGNlbGwpIHtcbiAgaWYgKCEoY2VsbCBpbnN0YW5jZW9mIENlbGwpKSB7XG4gICAgY29uc29sZS53YXJuKFwiTm90IGEgdmFsaWQgY2VsbCEgXCIsIGNlbGwpO1xuICB9XG4gIHJldHVybiBjZWxsLnZhbHVlO1xufVxuZnVuY3Rpb24gc2V0VmFsdWUoc3RvcmFnZSwgdmFsdWUpIHtcbiAgaWYgKCEoc3RvcmFnZSBpbnN0YW5jZW9mIENlbGwpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwic2V0VmFsdWUgbXVzdCBiZSBwYXNzZWQgYSB0cmFja2VkIHN0b3JlIGNyZWF0ZWQgd2l0aCBgY3JlYXRlU3RvcmFnZWAuXCJcbiAgICApO1xuICB9XG4gIHN0b3JhZ2UudmFsdWUgPSBzdG9yYWdlLl9sYXN0VmFsdWUgPSB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNlbGwoaW5pdGlhbFZhbHVlLCBpc0VxdWFsID0gdHJpcGxlRXEpIHtcbiAgcmV0dXJuIG5ldyBDZWxsKGluaXRpYWxWYWx1ZSwgaXNFcXVhbCk7XG59XG5mdW5jdGlvbiBjcmVhdGVDYWNoZShmbikge1xuICBhc3NlcnRJc0Z1bmN0aW9uKFxuICAgIGZuLFxuICAgIFwidGhlIGZpcnN0IHBhcmFtZXRlciB0byBgY3JlYXRlQ2FjaGVgIG11c3QgYmUgYSBmdW5jdGlvblwiXG4gICk7XG4gIHJldHVybiBuZXcgVHJhY2tpbmdDYWNoZShmbik7XG59XG5cbi8vIHNyYy9hdXRvdHJhY2tNZW1vaXplL3RyYWNraW5nLnRzXG52YXIgbmV2ZXJFcSA9IChhLCBiKSA9PiBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZVRhZygpIHtcbiAgcmV0dXJuIGNyZWF0ZUNlbGwobnVsbCwgbmV2ZXJFcSk7XG59XG5mdW5jdGlvbiBkaXJ0eVRhZyh0YWcsIHZhbHVlKSB7XG4gIHNldFZhbHVlKHRhZywgdmFsdWUpO1xufVxudmFyIGNvbnN1bWVDb2xsZWN0aW9uID0gKG5vZGUpID0+IHtcbiAgbGV0IHRhZyA9IG5vZGUuY29sbGVjdGlvblRhZztcbiAgaWYgKHRhZyA9PT0gbnVsbCkge1xuICAgIHRhZyA9IG5vZGUuY29sbGVjdGlvblRhZyA9IGNyZWF0ZVRhZygpO1xuICB9XG4gIGdldFZhbHVlKHRhZyk7XG59O1xudmFyIGRpcnR5Q29sbGVjdGlvbiA9IChub2RlKSA9PiB7XG4gIGNvbnN0IHRhZyA9IG5vZGUuY29sbGVjdGlvblRhZztcbiAgaWYgKHRhZyAhPT0gbnVsbCkge1xuICAgIGRpcnR5VGFnKHRhZywgbnVsbCk7XG4gIH1cbn07XG5cbi8vIHNyYy9hdXRvdHJhY2tNZW1vaXplL3Byb3h5LnRzXG52YXIgUkVEVVhfUFJPWFlfTEFCRUwgPSBTeW1ib2woKTtcbnZhciBuZXh0SWQgPSAwO1xudmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHt9KTtcbnZhciBPYmplY3RUcmVlTm9kZSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudGFnLnZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHJveHkgPSBuZXcgUHJveHkodGhpcywgb2JqZWN0UHJveHlIYW5kbGVyKTtcbiAgdGFnID0gY3JlYXRlVGFnKCk7XG4gIHRhZ3MgPSB7fTtcbiAgY2hpbGRyZW4gPSB7fTtcbiAgY29sbGVjdGlvblRhZyA9IG51bGw7XG4gIGlkID0gbmV4dElkKys7XG59O1xudmFyIG9iamVjdFByb3h5SGFuZGxlciA9IHtcbiAgZ2V0KG5vZGUsIGtleSkge1xuICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZVJlc3VsdCgpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IG5vZGU7XG4gICAgICBjb25zdCBjaGlsZFZhbHVlID0gUmVmbGVjdC5nZXQodmFsdWUsIGtleSk7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICByZXR1cm4gY2hpbGRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChrZXkgaW4gcHJvdG8pIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkVmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGNoaWxkVmFsdWUgPT09IFwib2JqZWN0XCIgJiYgY2hpbGRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBsZXQgY2hpbGROb2RlID0gbm9kZS5jaGlsZHJlbltrZXldO1xuICAgICAgICBpZiAoY2hpbGROb2RlID09PSB2b2lkIDApIHtcbiAgICAgICAgICBjaGlsZE5vZGUgPSBub2RlLmNoaWxkcmVuW2tleV0gPSBjcmVhdGVOb2RlKGNoaWxkVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZE5vZGUudGFnKSB7XG4gICAgICAgICAgZ2V0VmFsdWUoY2hpbGROb2RlLnRhZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZS5wcm94eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB0YWcgPSBub2RlLnRhZ3Nba2V5XTtcbiAgICAgICAgaWYgKHRhZyA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgdGFnID0gbm9kZS50YWdzW2tleV0gPSBjcmVhdGVUYWcoKTtcbiAgICAgICAgICB0YWcudmFsdWUgPSBjaGlsZFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGdldFZhbHVlKHRhZyk7XG4gICAgICAgIHJldHVybiBjaGlsZFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSBjYWxjdWxhdGVSZXN1bHQoKTtcbiAgICByZXR1cm4gcmVzO1xuICB9LFxuICBvd25LZXlzKG5vZGUpIHtcbiAgICBjb25zdW1lQ29sbGVjdGlvbihub2RlKTtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKG5vZGUudmFsdWUpO1xuICB9LFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobm9kZSwgcHJvcCkge1xuICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLnZhbHVlLCBwcm9wKTtcbiAgfSxcbiAgaGFzKG5vZGUsIHByb3ApIHtcbiAgICByZXR1cm4gUmVmbGVjdC5oYXMobm9kZS52YWx1ZSwgcHJvcCk7XG4gIH1cbn07XG52YXIgQXJyYXlUcmVlTm9kZSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudGFnLnZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHJveHkgPSBuZXcgUHJveHkoW3RoaXNdLCBhcnJheVByb3h5SGFuZGxlcik7XG4gIHRhZyA9IGNyZWF0ZVRhZygpO1xuICB0YWdzID0ge307XG4gIGNoaWxkcmVuID0ge307XG4gIGNvbGxlY3Rpb25UYWcgPSBudWxsO1xuICBpZCA9IG5leHRJZCsrO1xufTtcbnZhciBhcnJheVByb3h5SGFuZGxlciA9IHtcbiAgZ2V0KFtub2RlXSwga2V5KSB7XG4gICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgY29uc3VtZUNvbGxlY3Rpb24obm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RQcm94eUhhbmRsZXIuZ2V0KG5vZGUsIGtleSk7XG4gIH0sXG4gIG93bktleXMoW25vZGVdKSB7XG4gICAgcmV0dXJuIG9iamVjdFByb3h5SGFuZGxlci5vd25LZXlzKG5vZGUpO1xuICB9LFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoW25vZGVdLCBwcm9wKSB7XG4gICAgcmV0dXJuIG9iamVjdFByb3h5SGFuZGxlci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobm9kZSwgcHJvcCk7XG4gIH0sXG4gIGhhcyhbbm9kZV0sIHByb3ApIHtcbiAgICByZXR1cm4gb2JqZWN0UHJveHlIYW5kbGVyLmhhcyhub2RlLCBwcm9wKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGNyZWF0ZU5vZGUodmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheVRyZWVOb2RlKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gbmV3IE9iamVjdFRyZWVOb2RlKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZU5vZGUobm9kZSwgbmV3VmFsdWUpIHtcbiAgY29uc3QgeyB2YWx1ZSwgdGFncywgY2hpbGRyZW4gfSA9IG5vZGU7XG4gIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmIHZhbHVlLmxlbmd0aCAhPT0gbmV3VmFsdWUubGVuZ3RoKSB7XG4gICAgZGlydHlDb2xsZWN0aW9uKG5vZGUpO1xuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIGxldCBvbGRLZXlzU2l6ZSA9IDA7XG4gICAgICBsZXQgbmV3S2V5c1NpemUgPSAwO1xuICAgICAgbGV0IGFueUtleXNBZGRlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBfa2V5IGluIHZhbHVlKSB7XG4gICAgICAgIG9sZEtleXNTaXplKys7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdWYWx1ZSkge1xuICAgICAgICBuZXdLZXlzU2l6ZSsrO1xuICAgICAgICBpZiAoIShrZXkgaW4gdmFsdWUpKSB7XG4gICAgICAgICAgYW55S2V5c0FkZGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgaXNEaWZmZXJlbnQgPSBhbnlLZXlzQWRkZWQgfHwgb2xkS2V5c1NpemUgIT09IG5ld0tleXNTaXplO1xuICAgICAgaWYgKGlzRGlmZmVyZW50KSB7XG4gICAgICAgIGRpcnR5Q29sbGVjdGlvbihub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gdGFncykge1xuICAgIGNvbnN0IGNoaWxkVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgIGNvbnN0IG5ld0NoaWxkVmFsdWUgPSBuZXdWYWx1ZVtrZXldO1xuICAgIGlmIChjaGlsZFZhbHVlICE9PSBuZXdDaGlsZFZhbHVlKSB7XG4gICAgICBkaXJ0eUNvbGxlY3Rpb24obm9kZSk7XG4gICAgICBkaXJ0eVRhZyh0YWdzW2tleV0sIG5ld0NoaWxkVmFsdWUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkVmFsdWUgPT09IFwib2JqZWN0XCIgJiYgbmV3Q2hpbGRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgZGVsZXRlIHRhZ3Nba2V5XTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gY2hpbGRyZW4pIHtcbiAgICBjb25zdCBjaGlsZE5vZGUgPSBjaGlsZHJlbltrZXldO1xuICAgIGNvbnN0IG5ld0NoaWxkVmFsdWUgPSBuZXdWYWx1ZVtrZXldO1xuICAgIGNvbnN0IGNoaWxkVmFsdWUgPSBjaGlsZE5vZGUudmFsdWU7XG4gICAgaWYgKGNoaWxkVmFsdWUgPT09IG5ld0NoaWxkVmFsdWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG5ld0NoaWxkVmFsdWUgPT09IFwib2JqZWN0XCIgJiYgbmV3Q2hpbGRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdXBkYXRlTm9kZShjaGlsZE5vZGUsIG5ld0NoaWxkVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGVOb2RlKGNoaWxkTm9kZSk7XG4gICAgICBkZWxldGUgY2hpbGRyZW5ba2V5XTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRlbGV0ZU5vZGUobm9kZSkge1xuICBpZiAobm9kZS50YWcpIHtcbiAgICBkaXJ0eVRhZyhub2RlLnRhZywgbnVsbCk7XG4gIH1cbiAgZGlydHlDb2xsZWN0aW9uKG5vZGUpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBub2RlLnRhZ3MpIHtcbiAgICBkaXJ0eVRhZyhub2RlLnRhZ3Nba2V5XSwgbnVsbCk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gbm9kZS5jaGlsZHJlbikge1xuICAgIGRlbGV0ZU5vZGUobm9kZS5jaGlsZHJlbltrZXldKTtcbiAgfVxufVxuXG4vLyBzcmMvbHJ1TWVtb2l6ZS50c1xuZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uQ2FjaGUoZXF1YWxzKSB7XG4gIGxldCBlbnRyeTtcbiAgcmV0dXJuIHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICBpZiAoZW50cnkgJiYgZXF1YWxzKGVudHJ5LmtleSwga2V5KSkge1xuICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gTk9UX0ZPVU5EO1xuICAgIH0sXG4gICAgcHV0KGtleSwgdmFsdWUpIHtcbiAgICAgIGVudHJ5ID0geyBrZXksIHZhbHVlIH07XG4gICAgfSxcbiAgICBnZXRFbnRyaWVzKCkge1xuICAgICAgcmV0dXJuIGVudHJ5ID8gW2VudHJ5XSA6IFtdO1xuICAgIH0sXG4gICAgY2xlYXIoKSB7XG4gICAgICBlbnRyeSA9IHZvaWQgMDtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVMcnVDYWNoZShtYXhTaXplLCBlcXVhbHMpIHtcbiAgbGV0IGVudHJpZXMgPSBbXTtcbiAgZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgIGNvbnN0IGNhY2hlSW5kZXggPSBlbnRyaWVzLmZpbmRJbmRleCgoZW50cnkpID0+IGVxdWFscyhrZXksIGVudHJ5LmtleSkpO1xuICAgIGlmIChjYWNoZUluZGV4ID4gLTEpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tjYWNoZUluZGV4XTtcbiAgICAgIGlmIChjYWNoZUluZGV4ID4gMCkge1xuICAgICAgICBlbnRyaWVzLnNwbGljZShjYWNoZUluZGV4LCAxKTtcbiAgICAgICAgZW50cmllcy51bnNoaWZ0KGVudHJ5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyeS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIE5PVF9GT1VORDtcbiAgfVxuICBmdW5jdGlvbiBwdXQoa2V5LCB2YWx1ZSkge1xuICAgIGlmIChnZXQoa2V5KSA9PT0gTk9UX0ZPVU5EKSB7XG4gICAgICBlbnRyaWVzLnVuc2hpZnQoeyBrZXksIHZhbHVlIH0pO1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID4gbWF4U2l6ZSkge1xuICAgICAgICBlbnRyaWVzLnBvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZXRFbnRyaWVzKCkge1xuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG4gIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIGVudHJpZXMgPSBbXTtcbiAgfVxuICByZXR1cm4geyBnZXQsIHB1dCwgZ2V0RW50cmllcywgY2xlYXIgfTtcbn1cbnZhciByZWZlcmVuY2VFcXVhbGl0eUNoZWNrID0gKGEsIGIpID0+IGEgPT09IGI7XG5mdW5jdGlvbiBjcmVhdGVDYWNoZUtleUNvbXBhcmF0b3IoZXF1YWxpdHlDaGVjaykge1xuICByZXR1cm4gZnVuY3Rpb24gYXJlQXJndW1lbnRzU2hhbGxvd2x5RXF1YWwocHJldiwgbmV4dCkge1xuICAgIGlmIChwcmV2ID09PSBudWxsIHx8IG5leHQgPT09IG51bGwgfHwgcHJldi5sZW5ndGggIT09IG5leHQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBwcmV2O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghZXF1YWxpdHlDaGVjayhwcmV2W2ldLCBuZXh0W2ldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuZnVuY3Rpb24gbHJ1TWVtb2l6ZShmdW5jLCBlcXVhbGl0eUNoZWNrT3JPcHRpb25zKSB7XG4gIGNvbnN0IHByb3ZpZGVkT3B0aW9ucyA9IHR5cGVvZiBlcXVhbGl0eUNoZWNrT3JPcHRpb25zID09PSBcIm9iamVjdFwiID8gZXF1YWxpdHlDaGVja09yT3B0aW9ucyA6IHsgZXF1YWxpdHlDaGVjazogZXF1YWxpdHlDaGVja09yT3B0aW9ucyB9O1xuICBjb25zdCB7XG4gICAgZXF1YWxpdHlDaGVjayA9IHJlZmVyZW5jZUVxdWFsaXR5Q2hlY2ssXG4gICAgbWF4U2l6ZSA9IDEsXG4gICAgcmVzdWx0RXF1YWxpdHlDaGVja1xuICB9ID0gcHJvdmlkZWRPcHRpb25zO1xuICBjb25zdCBjb21wYXJhdG9yID0gY3JlYXRlQ2FjaGVLZXlDb21wYXJhdG9yKGVxdWFsaXR5Q2hlY2spO1xuICBsZXQgcmVzdWx0c0NvdW50ID0gMDtcbiAgY29uc3QgY2FjaGUgPSBtYXhTaXplIDw9IDEgPyBjcmVhdGVTaW5nbGV0b25DYWNoZShjb21wYXJhdG9yKSA6IGNyZWF0ZUxydUNhY2hlKG1heFNpemUsIGNvbXBhcmF0b3IpO1xuICBmdW5jdGlvbiBtZW1vaXplZCgpIHtcbiAgICBsZXQgdmFsdWUgPSBjYWNoZS5nZXQoYXJndW1lbnRzKTtcbiAgICBpZiAodmFsdWUgPT09IE5PVF9GT1VORCkge1xuICAgICAgdmFsdWUgPSBmdW5jLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICByZXN1bHRzQ291bnQrKztcbiAgICAgIGlmIChyZXN1bHRFcXVhbGl0eUNoZWNrKSB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBjYWNoZS5nZXRFbnRyaWVzKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nRW50cnkgPSBlbnRyaWVzLmZpbmQoXG4gICAgICAgICAgKGVudHJ5KSA9PiByZXN1bHRFcXVhbGl0eUNoZWNrKGVudHJ5LnZhbHVlLCB2YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nRW50cnkpIHtcbiAgICAgICAgICB2YWx1ZSA9IG1hdGNoaW5nRW50cnkudmFsdWU7XG4gICAgICAgICAgcmVzdWx0c0NvdW50ICE9PSAwICYmIHJlc3VsdHNDb3VudC0tO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYWNoZS5wdXQoYXJndW1lbnRzLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBtZW1vaXplZC5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgbWVtb2l6ZWQucmVzZXRSZXN1bHRzQ291bnQoKTtcbiAgfTtcbiAgbWVtb2l6ZWQucmVzdWx0c0NvdW50ID0gKCkgPT4gcmVzdWx0c0NvdW50O1xuICBtZW1vaXplZC5yZXNldFJlc3VsdHNDb3VudCA9ICgpID0+IHtcbiAgICByZXN1bHRzQ291bnQgPSAwO1xuICB9O1xuICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vIHNyYy9hdXRvdHJhY2tNZW1vaXplL2F1dG90cmFja01lbW9pemUudHNcbmZ1bmN0aW9uIGF1dG90cmFja01lbW9pemUoZnVuYykge1xuICBjb25zdCBub2RlID0gY3JlYXRlTm9kZShcbiAgICBbXVxuICApO1xuICBsZXQgbGFzdEFyZ3MgPSBudWxsO1xuICBjb25zdCBzaGFsbG93RXF1YWwgPSBjcmVhdGVDYWNoZUtleUNvbXBhcmF0b3IocmVmZXJlbmNlRXF1YWxpdHlDaGVjayk7XG4gIGNvbnN0IGNhY2hlID0gY3JlYXRlQ2FjaGUoKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGZ1bmMuYXBwbHkobnVsbCwgbm9kZS5wcm94eSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfSk7XG4gIGZ1bmN0aW9uIG1lbW9pemVkKCkge1xuICAgIGlmICghc2hhbGxvd0VxdWFsKGxhc3RBcmdzLCBhcmd1bWVudHMpKSB7XG4gICAgICB1cGRhdGVOb2RlKG5vZGUsIGFyZ3VtZW50cyk7XG4gICAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlLnZhbHVlO1xuICB9XG4gIG1lbW9pemVkLmNsZWFyQ2FjaGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGNhY2hlLmNsZWFyKCk7XG4gIH07XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gc3JjL3dlYWtNYXBNZW1vaXplLnRzXG52YXIgU3Ryb25nUmVmID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBkZXJlZigpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxufTtcbnZhciBSZWYgPSB0eXBlb2YgV2Vha1JlZiAhPT0gXCJ1bmRlZmluZWRcIiA/IFdlYWtSZWYgOiBTdHJvbmdSZWY7XG52YXIgVU5URVJNSU5BVEVEID0gMDtcbnZhciBURVJNSU5BVEVEID0gMTtcbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlTm9kZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBzOiBVTlRFUk1JTkFURUQsXG4gICAgdjogdm9pZCAwLFxuICAgIG86IG51bGwsXG4gICAgcDogbnVsbFxuICB9O1xufVxuZnVuY3Rpb24gd2Vha01hcE1lbW9pemUoZnVuYywgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBmbk5vZGUgPSBjcmVhdGVDYWNoZU5vZGUoKTtcbiAgY29uc3QgeyByZXN1bHRFcXVhbGl0eUNoZWNrIH0gPSBvcHRpb25zO1xuICBsZXQgbGFzdFJlc3VsdDtcbiAgbGV0IHJlc3VsdHNDb3VudCA9IDA7XG4gIGZ1bmN0aW9uIG1lbW9pemVkKCkge1xuICAgIGxldCBjYWNoZU5vZGUgPSBmbk5vZGU7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGFyZ3VtZW50cztcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY29uc3QgYXJnID0gYXJndW1lbnRzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmIGFyZyAhPT0gbnVsbCkge1xuICAgICAgICBsZXQgb2JqZWN0Q2FjaGUgPSBjYWNoZU5vZGUubztcbiAgICAgICAgaWYgKG9iamVjdENhY2hlID09PSBudWxsKSB7XG4gICAgICAgICAgY2FjaGVOb2RlLm8gPSBvYmplY3RDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9iamVjdE5vZGUgPSBvYmplY3RDYWNoZS5nZXQoYXJnKTtcbiAgICAgICAgaWYgKG9iamVjdE5vZGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGNhY2hlTm9kZSA9IGNyZWF0ZUNhY2hlTm9kZSgpO1xuICAgICAgICAgIG9iamVjdENhY2hlLnNldChhcmcsIGNhY2hlTm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FjaGVOb2RlID0gb2JqZWN0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHByaW1pdGl2ZUNhY2hlID0gY2FjaGVOb2RlLnA7XG4gICAgICAgIGlmIChwcmltaXRpdmVDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGNhY2hlTm9kZS5wID0gcHJpbWl0aXZlQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZU5vZGUgPSBwcmltaXRpdmVDYWNoZS5nZXQoYXJnKTtcbiAgICAgICAgaWYgKHByaW1pdGl2ZU5vZGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGNhY2hlTm9kZSA9IGNyZWF0ZUNhY2hlTm9kZSgpO1xuICAgICAgICAgIHByaW1pdGl2ZUNhY2hlLnNldChhcmcsIGNhY2hlTm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FjaGVOb2RlID0gcHJpbWl0aXZlTm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0ZXJtaW5hdGVkTm9kZSA9IGNhY2hlTm9kZTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChjYWNoZU5vZGUucyA9PT0gVEVSTUlOQVRFRCkge1xuICAgICAgcmVzdWx0ID0gY2FjaGVOb2RlLnY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgIHJlc3VsdHNDb3VudCsrO1xuICAgICAgaWYgKHJlc3VsdEVxdWFsaXR5Q2hlY2spIHtcbiAgICAgICAgY29uc3QgbGFzdFJlc3VsdFZhbHVlID0gbGFzdFJlc3VsdD8uZGVyZWY/LigpID8/IGxhc3RSZXN1bHQ7XG4gICAgICAgIGlmIChsYXN0UmVzdWx0VmFsdWUgIT0gbnVsbCAmJiByZXN1bHRFcXVhbGl0eUNoZWNrKGxhc3RSZXN1bHRWYWx1ZSwgcmVzdWx0KSkge1xuICAgICAgICAgIHJlc3VsdCA9IGxhc3RSZXN1bHRWYWx1ZTtcbiAgICAgICAgICByZXN1bHRzQ291bnQgIT09IDAgJiYgcmVzdWx0c0NvdW50LS07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmVlZHNXZWFrUmVmID0gdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiByZXN1bHQgIT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICBsYXN0UmVzdWx0ID0gbmVlZHNXZWFrUmVmID8gbmV3IFJlZihyZXN1bHQpIDogcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICB0ZXJtaW5hdGVkTm9kZS5zID0gVEVSTUlOQVRFRDtcbiAgICB0ZXJtaW5hdGVkTm9kZS52ID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbWVtb2l6ZWQuY2xlYXJDYWNoZSA9ICgpID0+IHtcbiAgICBmbk5vZGUgPSBjcmVhdGVDYWNoZU5vZGUoKTtcbiAgICBtZW1vaXplZC5yZXNldFJlc3VsdHNDb3VudCgpO1xuICB9O1xuICBtZW1vaXplZC5yZXN1bHRzQ291bnQgPSAoKSA9PiByZXN1bHRzQ291bnQ7XG4gIG1lbW9pemVkLnJlc2V0UmVzdWx0c0NvdW50ID0gKCkgPT4ge1xuICAgIHJlc3VsdHNDb3VudCA9IDA7XG4gIH07XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gc3JjL2NyZWF0ZVNlbGVjdG9yQ3JlYXRvci50c1xuZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JDcmVhdG9yKG1lbW9pemVPck9wdGlvbnMsIC4uLm1lbW9pemVPcHRpb25zRnJvbUFyZ3MpIHtcbiAgY29uc3QgY3JlYXRlU2VsZWN0b3JDcmVhdG9yT3B0aW9ucyA9IHR5cGVvZiBtZW1vaXplT3JPcHRpb25zID09PSBcImZ1bmN0aW9uXCIgPyB7XG4gICAgbWVtb2l6ZTogbWVtb2l6ZU9yT3B0aW9ucyxcbiAgICBtZW1vaXplT3B0aW9uczogbWVtb2l6ZU9wdGlvbnNGcm9tQXJnc1xuICB9IDogbWVtb2l6ZU9yT3B0aW9ucztcbiAgY29uc3QgY3JlYXRlU2VsZWN0b3IyID0gKC4uLmNyZWF0ZVNlbGVjdG9yQXJncykgPT4ge1xuICAgIGxldCByZWNvbXB1dGF0aW9ucyA9IDA7XG4gICAgbGV0IGRlcGVuZGVuY3lSZWNvbXB1dGF0aW9ucyA9IDA7XG4gICAgbGV0IGxhc3RSZXN1bHQ7XG4gICAgbGV0IGRpcmVjdGx5UGFzc2VkT3B0aW9ucyA9IHt9O1xuICAgIGxldCByZXN1bHRGdW5jID0gY3JlYXRlU2VsZWN0b3JBcmdzLnBvcCgpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0RnVuYyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZGlyZWN0bHlQYXNzZWRPcHRpb25zID0gcmVzdWx0RnVuYztcbiAgICAgIHJlc3VsdEZ1bmMgPSBjcmVhdGVTZWxlY3RvckFyZ3MucG9wKCk7XG4gICAgfVxuICAgIGFzc2VydElzRnVuY3Rpb24oXG4gICAgICByZXN1bHRGdW5jLFxuICAgICAgYGNyZWF0ZVNlbGVjdG9yIGV4cGVjdHMgYW4gb3V0cHV0IGZ1bmN0aW9uIGFmdGVyIHRoZSBpbnB1dHMsIGJ1dCByZWNlaXZlZDogWyR7dHlwZW9mIHJlc3VsdEZ1bmN9XWBcbiAgICApO1xuICAgIGNvbnN0IGNvbWJpbmVkT3B0aW9ucyA9IHtcbiAgICAgIC4uLmNyZWF0ZVNlbGVjdG9yQ3JlYXRvck9wdGlvbnMsXG4gICAgICAuLi5kaXJlY3RseVBhc3NlZE9wdGlvbnNcbiAgICB9O1xuICAgIGNvbnN0IHtcbiAgICAgIG1lbW9pemUsXG4gICAgICBtZW1vaXplT3B0aW9ucyA9IFtdLFxuICAgICAgYXJnc01lbW9pemUgPSB3ZWFrTWFwTWVtb2l6ZSxcbiAgICAgIGFyZ3NNZW1vaXplT3B0aW9ucyA9IFtdLFxuICAgICAgZGV2TW9kZUNoZWNrcyA9IHt9XG4gICAgfSA9IGNvbWJpbmVkT3B0aW9ucztcbiAgICBjb25zdCBmaW5hbE1lbW9pemVPcHRpb25zID0gZW5zdXJlSXNBcnJheShtZW1vaXplT3B0aW9ucyk7XG4gICAgY29uc3QgZmluYWxBcmdzTWVtb2l6ZU9wdGlvbnMgPSBlbnN1cmVJc0FycmF5KGFyZ3NNZW1vaXplT3B0aW9ucyk7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gZ2V0RGVwZW5kZW5jaWVzKGNyZWF0ZVNlbGVjdG9yQXJncyk7XG4gICAgY29uc3QgbWVtb2l6ZWRSZXN1bHRGdW5jID0gbWVtb2l6ZShmdW5jdGlvbiByZWNvbXB1dGF0aW9uV3JhcHBlcigpIHtcbiAgICAgIHJlY29tcHV0YXRpb25zKys7XG4gICAgICByZXR1cm4gcmVzdWx0RnVuYy5hcHBseShcbiAgICAgICAgbnVsbCxcbiAgICAgICAgYXJndW1lbnRzXG4gICAgICApO1xuICAgIH0sIC4uLmZpbmFsTWVtb2l6ZU9wdGlvbnMpO1xuICAgIGxldCBmaXJzdFJ1biA9IHRydWU7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBhcmdzTWVtb2l6ZShmdW5jdGlvbiBkZXBlbmRlbmNpZXNDaGVja2VyKCkge1xuICAgICAgZGVwZW5kZW5jeVJlY29tcHV0YXRpb25zKys7XG4gICAgICBjb25zdCBpbnB1dFNlbGVjdG9yUmVzdWx0cyA9IGNvbGxlY3RJbnB1dFNlbGVjdG9yUmVzdWx0cyhcbiAgICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgICBhcmd1bWVudHNcbiAgICAgICk7XG4gICAgICBsYXN0UmVzdWx0ID0gbWVtb2l6ZWRSZXN1bHRGdW5jLmFwcGx5KG51bGwsIGlucHV0U2VsZWN0b3JSZXN1bHRzKTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgeyBpZGVudGl0eUZ1bmN0aW9uQ2hlY2ssIGlucHV0U3RhYmlsaXR5Q2hlY2sgfSA9IGdldERldk1vZGVDaGVja3NFeGVjdXRpb25JbmZvKGZpcnN0UnVuLCBkZXZNb2RlQ2hlY2tzKTtcbiAgICAgICAgaWYgKGlkZW50aXR5RnVuY3Rpb25DaGVjay5zaG91bGRSdW4pIHtcbiAgICAgICAgICBpZGVudGl0eUZ1bmN0aW9uQ2hlY2sucnVuKFxuICAgICAgICAgICAgcmVzdWx0RnVuYyxcbiAgICAgICAgICAgIGlucHV0U2VsZWN0b3JSZXN1bHRzLFxuICAgICAgICAgICAgbGFzdFJlc3VsdFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0U3RhYmlsaXR5Q2hlY2suc2hvdWxkUnVuKSB7XG4gICAgICAgICAgY29uc3QgaW5wdXRTZWxlY3RvclJlc3VsdHNDb3B5ID0gY29sbGVjdElucHV0U2VsZWN0b3JSZXN1bHRzKFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgICAgICAgYXJndW1lbnRzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpbnB1dFN0YWJpbGl0eUNoZWNrLnJ1bihcbiAgICAgICAgICAgIHsgaW5wdXRTZWxlY3RvclJlc3VsdHMsIGlucHV0U2VsZWN0b3JSZXN1bHRzQ29weSB9LFxuICAgICAgICAgICAgeyBtZW1vaXplLCBtZW1vaXplT3B0aW9uczogZmluYWxNZW1vaXplT3B0aW9ucyB9LFxuICAgICAgICAgICAgYXJndW1lbnRzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyc3RSdW4pXG4gICAgICAgICAgZmlyc3RSdW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICAgIH0sIC4uLmZpbmFsQXJnc01lbW9pemVPcHRpb25zKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihzZWxlY3Rvciwge1xuICAgICAgcmVzdWx0RnVuYyxcbiAgICAgIG1lbW9pemVkUmVzdWx0RnVuYyxcbiAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgIGRlcGVuZGVuY3lSZWNvbXB1dGF0aW9uczogKCkgPT4gZGVwZW5kZW5jeVJlY29tcHV0YXRpb25zLFxuICAgICAgcmVzZXREZXBlbmRlbmN5UmVjb21wdXRhdGlvbnM6ICgpID0+IHtcbiAgICAgICAgZGVwZW5kZW5jeVJlY29tcHV0YXRpb25zID0gMDtcbiAgICAgIH0sXG4gICAgICBsYXN0UmVzdWx0OiAoKSA9PiBsYXN0UmVzdWx0LFxuICAgICAgcmVjb21wdXRhdGlvbnM6ICgpID0+IHJlY29tcHV0YXRpb25zLFxuICAgICAgcmVzZXRSZWNvbXB1dGF0aW9uczogKCkgPT4ge1xuICAgICAgICByZWNvbXB1dGF0aW9ucyA9IDA7XG4gICAgICB9LFxuICAgICAgbWVtb2l6ZSxcbiAgICAgIGFyZ3NNZW1vaXplXG4gICAgfSk7XG4gIH07XG4gIE9iamVjdC5hc3NpZ24oY3JlYXRlU2VsZWN0b3IyLCB7XG4gICAgd2l0aFR5cGVzOiAoKSA9PiBjcmVhdGVTZWxlY3RvcjJcbiAgfSk7XG4gIHJldHVybiBjcmVhdGVTZWxlY3RvcjI7XG59XG52YXIgY3JlYXRlU2VsZWN0b3IgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlU2VsZWN0b3JDcmVhdG9yKHdlYWtNYXBNZW1vaXplKTtcblxuLy8gc3JjL2NyZWF0ZVN0cnVjdHVyZWRTZWxlY3Rvci50c1xudmFyIGNyZWF0ZVN0cnVjdHVyZWRTZWxlY3RvciA9IE9iamVjdC5hc3NpZ24oXG4gIChpbnB1dFNlbGVjdG9yc09iamVjdCwgc2VsZWN0b3JDcmVhdG9yID0gY3JlYXRlU2VsZWN0b3IpID0+IHtcbiAgICBhc3NlcnRJc09iamVjdChcbiAgICAgIGlucHV0U2VsZWN0b3JzT2JqZWN0LFxuICAgICAgYGNyZWF0ZVN0cnVjdHVyZWRTZWxlY3RvciBleHBlY3RzIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCB3aGVyZSBlYWNoIHByb3BlcnR5IGlzIGEgc2VsZWN0b3IsIGluc3RlYWQgcmVjZWl2ZWQgYSAke3R5cGVvZiBpbnB1dFNlbGVjdG9yc09iamVjdH1gXG4gICAgKTtcbiAgICBjb25zdCBpbnB1dFNlbGVjdG9yS2V5cyA9IE9iamVjdC5rZXlzKGlucHV0U2VsZWN0b3JzT2JqZWN0KTtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBpbnB1dFNlbGVjdG9yS2V5cy5tYXAoXG4gICAgICAoa2V5KSA9PiBpbnB1dFNlbGVjdG9yc09iamVjdFtrZXldXG4gICAgKTtcbiAgICBjb25zdCBzdHJ1Y3R1cmVkU2VsZWN0b3IgPSBzZWxlY3RvckNyZWF0b3IoXG4gICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAoLi4uaW5wdXRTZWxlY3RvclJlc3VsdHMpID0+IHtcbiAgICAgICAgcmV0dXJuIGlucHV0U2VsZWN0b3JSZXN1bHRzLnJlZHVjZSgoY29tcG9zaXRpb24sIHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbXBvc2l0aW9uW2lucHV0U2VsZWN0b3JLZXlzW2luZGV4XV0gPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gY29tcG9zaXRpb247XG4gICAgICAgIH0sIHt9KTtcbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkU2VsZWN0b3I7XG4gIH0sXG4gIHsgd2l0aFR5cGVzOiAoKSA9PiBjcmVhdGVTdHJ1Y3R1cmVkU2VsZWN0b3IgfVxuKTtcbmV4cG9ydCB7XG4gIGNyZWF0ZVNlbGVjdG9yLFxuICBjcmVhdGVTZWxlY3RvckNyZWF0b3IsXG4gIGNyZWF0ZVN0cnVjdHVyZWRTZWxlY3RvcixcbiAgbHJ1TWVtb2l6ZSxcbiAgcmVmZXJlbmNlRXF1YWxpdHlDaGVjayxcbiAgc2V0R2xvYmFsRGV2TW9kZUNoZWNrcyxcbiAgYXV0b3RyYWNrTWVtb2l6ZSBhcyB1bnN0YWJsZV9hdXRvdHJhY2tNZW1vaXplLFxuICB3ZWFrTWFwTWVtb2l6ZVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc2VsZWN0Lm1qcy5tYXAiLCIvKiFcbiAqIFNpZ25hdHVyZSBQYWQgdjIuMy4yXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL3NpZ25hdHVyZV9wYWRcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNyBTenltb24gTm93YWtcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICpcbiAqIFRoZSBtYWluIGlkZWEgYW5kIHNvbWUgcGFydHMgb2YgdGhlIGNvZGUgKGUuZy4gZHJhd2luZyB2YXJpYWJsZSB3aWR0aCBCw6l6aWVyIGN1cnZlKSBhcmUgdGFrZW4gZnJvbTpcbiAqIGh0dHA6Ly9jb3JuZXIuc3F1YXJldXAuY29tLzIwMTIvMDcvc21vb3RoZXItc2lnbmF0dXJlcy5odG1sXG4gKlxuICogSW1wbGVtZW50YXRpb24gb2YgaW50ZXJwb2xhdGlvbiB1c2luZyBjdWJpYyBCw6l6aWVyIGN1cnZlcyBpcyB0YWtlbiBmcm9tOlxuICogaHR0cDovL2Jlbmtub3dzY29kZS53b3JkcHJlc3MuY29tLzIwMTIvMDkvMTQvcGF0aC1pbnRlcnBvbGF0aW9uLXVzaW5nLWN1YmljLWJlemllci1hbmQtY29udHJvbC1wb2ludC1lc3RpbWF0aW9uLWluLWphdmFzY3JpcHRcbiAqXG4gKiBBbGdvcml0aG0gZm9yIGFwcHJveGltYXRlZCBsZW5ndGggb2YgYSBCw6l6aWVyIGN1cnZlIGlzIHRha2VuIGZyb206XG4gKiBodHRwOi8vd3d3LmxlbW9kYS5uZXQvbWF0aHMvYmV6aWVyLWxlbmd0aC9pbmRleC5odG1sXG4gKlxuICovXG5cbmZ1bmN0aW9uIFBvaW50KHgsIHksIHRpbWUpIHtcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbiAgdGhpcy50aW1lID0gdGltZSB8fCBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbn1cblxuUG9pbnQucHJvdG90eXBlLnZlbG9jaXR5RnJvbSA9IGZ1bmN0aW9uIChzdGFydCkge1xuICByZXR1cm4gdGhpcy50aW1lICE9PSBzdGFydC50aW1lID8gdGhpcy5kaXN0YW5jZVRvKHN0YXJ0KSAvICh0aGlzLnRpbWUgLSBzdGFydC50aW1lKSA6IDE7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGlzdGFuY2VUbyA9IGZ1bmN0aW9uIChzdGFydCkge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMueCAtIHN0YXJ0LngsIDIpICsgTWF0aC5wb3codGhpcy55IC0gc3RhcnQueSwgMikpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIChvdGhlcikge1xuICByZXR1cm4gdGhpcy54ID09PSBvdGhlci54ICYmIHRoaXMueSA9PT0gb3RoZXIueSAmJiB0aGlzLnRpbWUgPT09IG90aGVyLnRpbWU7XG59O1xuXG5mdW5jdGlvbiBCZXppZXIoc3RhcnRQb2ludCwgY29udHJvbDEsIGNvbnRyb2wyLCBlbmRQb2ludCkge1xuICB0aGlzLnN0YXJ0UG9pbnQgPSBzdGFydFBvaW50O1xuICB0aGlzLmNvbnRyb2wxID0gY29udHJvbDE7XG4gIHRoaXMuY29udHJvbDIgPSBjb250cm9sMjtcbiAgdGhpcy5lbmRQb2ludCA9IGVuZFBvaW50O1xufVxuXG4vLyBSZXR1cm5zIGFwcHJveGltYXRlZCBsZW5ndGguXG5CZXppZXIucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0ZXBzID0gMTA7XG4gIHZhciBsZW5ndGggPSAwO1xuICB2YXIgcHggPSB2b2lkIDA7XG4gIHZhciBweSA9IHZvaWQgMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8PSBzdGVwczsgaSArPSAxKSB7XG4gICAgdmFyIHQgPSBpIC8gc3RlcHM7XG4gICAgdmFyIGN4ID0gdGhpcy5fcG9pbnQodCwgdGhpcy5zdGFydFBvaW50LngsIHRoaXMuY29udHJvbDEueCwgdGhpcy5jb250cm9sMi54LCB0aGlzLmVuZFBvaW50LngpO1xuICAgIHZhciBjeSA9IHRoaXMuX3BvaW50KHQsIHRoaXMuc3RhcnRQb2ludC55LCB0aGlzLmNvbnRyb2wxLnksIHRoaXMuY29udHJvbDIueSwgdGhpcy5lbmRQb2ludC55KTtcbiAgICBpZiAoaSA+IDApIHtcbiAgICAgIHZhciB4ZGlmZiA9IGN4IC0gcHg7XG4gICAgICB2YXIgeWRpZmYgPSBjeSAtIHB5O1xuICAgICAgbGVuZ3RoICs9IE1hdGguc3FydCh4ZGlmZiAqIHhkaWZmICsgeWRpZmYgKiB5ZGlmZik7XG4gICAgfVxuICAgIHB4ID0gY3g7XG4gICAgcHkgPSBjeTtcbiAgfVxuXG4gIHJldHVybiBsZW5ndGg7XG59O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1tdWx0aS1zcGFjZXMsIHNwYWNlLWluLXBhcmVucyAqL1xuQmV6aWVyLnByb3RvdHlwZS5fcG9pbnQgPSBmdW5jdGlvbiAodCwgc3RhcnQsIGMxLCBjMiwgZW5kKSB7XG4gIHJldHVybiBzdGFydCAqICgxLjAgLSB0KSAqICgxLjAgLSB0KSAqICgxLjAgLSB0KSArIDMuMCAqIGMxICogKDEuMCAtIHQpICogKDEuMCAtIHQpICogdCArIDMuMCAqIGMyICogKDEuMCAtIHQpICogdCAqIHQgKyBlbmQgKiB0ICogdCAqIHQ7XG59O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNzA3ODQwMS84MTU1MDdcbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGNvbnRleHQsIGFyZ3MsIHJlc3VsdDtcbiAgdmFyIHRpbWVvdXQgPSBudWxsO1xuICB2YXIgcHJldmlvdXMgPSAwO1xuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgdmFyIGxhdGVyID0gZnVuY3Rpb24gbGF0ZXIoKSB7XG4gICAgcHJldmlvdXMgPSBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlID8gMCA6IERhdGUubm93KCk7XG4gICAgdGltZW91dCA9IG51bGw7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICBpZiAoIXRpbWVvdXQpIGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgfTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAoIXByZXZpb3VzICYmIG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UpIHByZXZpb3VzID0gbm93O1xuICAgIHZhciByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKTtcbiAgICBjb250ZXh0ID0gdGhpcztcbiAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIGlmIChyZW1haW5pbmcgPD0gMCB8fCByZW1haW5pbmcgPiB3YWl0KSB7XG4gICAgICBpZiAodGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMgPSBub3c7XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgfSBlbHNlIGlmICghdGltZW91dCAmJiBvcHRpb25zLnRyYWlsaW5nICE9PSBmYWxzZSkge1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHJlbWFpbmluZyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFNpZ25hdHVyZVBhZChjYW52YXMsIG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgdGhpcy52ZWxvY2l0eUZpbHRlcldlaWdodCA9IG9wdHMudmVsb2NpdHlGaWx0ZXJXZWlnaHQgfHwgMC43O1xuICB0aGlzLm1pbldpZHRoID0gb3B0cy5taW5XaWR0aCB8fCAwLjU7XG4gIHRoaXMubWF4V2lkdGggPSBvcHRzLm1heFdpZHRoIHx8IDIuNTtcbiAgdGhpcy50aHJvdHRsZSA9ICd0aHJvdHRsZScgaW4gb3B0cyA/IG9wdHMudGhyb3R0bGUgOiAxNjsgLy8gaW4gbWlsaXNlY29uZHNcbiAgdGhpcy5taW5EaXN0YW5jZSA9ICdtaW5EaXN0YW5jZScgaW4gb3B0cyA/IG9wdHMubWluRGlzdGFuY2UgOiA1O1xuXG4gIGlmICh0aGlzLnRocm90dGxlKSB7XG4gICAgdGhpcy5fc3Ryb2tlTW92ZVVwZGF0ZSA9IHRocm90dGxlKFNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3N0cm9rZVVwZGF0ZSwgdGhpcy50aHJvdHRsZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc3Ryb2tlTW92ZVVwZGF0ZSA9IFNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3N0cm9rZVVwZGF0ZTtcbiAgfVxuXG4gIHRoaXMuZG90U2l6ZSA9IG9wdHMuZG90U2l6ZSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICh0aGlzLm1pbldpZHRoICsgdGhpcy5tYXhXaWR0aCkgLyAyO1xuICB9O1xuICB0aGlzLnBlbkNvbG9yID0gb3B0cy5wZW5Db2xvciB8fCAnYmxhY2snO1xuICB0aGlzLmJhY2tncm91bmRDb2xvciA9IG9wdHMuYmFja2dyb3VuZENvbG9yIHx8ICdyZ2JhKDAsMCwwLDApJztcbiAgdGhpcy5vbkJlZ2luID0gb3B0cy5vbkJlZ2luO1xuICB0aGlzLm9uRW5kID0gb3B0cy5vbkVuZDtcblxuICB0aGlzLl9jYW52YXMgPSBjYW52YXM7XG4gIHRoaXMuX2N0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICB0aGlzLmNsZWFyKCk7XG5cbiAgLy8gV2UgbmVlZCBhZGQgdGhlc2UgaW5saW5lIHNvIHRoZXkgYXJlIGF2YWlsYWJsZSB0byB1bmJpbmQgd2hpbGUgc3RpbGwgaGF2aW5nXG4gIC8vIGFjY2VzcyB0byAnc2VsZicgd2UgY291bGQgdXNlIF8uYmluZCBidXQgaXQncyBub3Qgd29ydGggYWRkaW5nIGEgZGVwZW5kZW5jeS5cbiAgdGhpcy5faGFuZGxlTW91c2VEb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LndoaWNoID09PSAxKSB7XG4gICAgICBzZWxmLl9tb3VzZUJ1dHRvbkRvd24gPSB0cnVlO1xuICAgICAgc2VsZi5fc3Ryb2tlQmVnaW4oZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLl9oYW5kbGVNb3VzZU1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoc2VsZi5fbW91c2VCdXR0b25Eb3duKSB7XG4gICAgICBzZWxmLl9zdHJva2VNb3ZlVXBkYXRlKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlTW91c2VVcCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC53aGljaCA9PT0gMSAmJiBzZWxmLl9tb3VzZUJ1dHRvbkRvd24pIHtcbiAgICAgIHNlbGYuX21vdXNlQnV0dG9uRG93biA9IGZhbHNlO1xuICAgICAgc2VsZi5fc3Ryb2tlRW5kKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlVG91Y2hTdGFydCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXRUb3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICBzZWxmLl9zdHJva2VCZWdpbih0b3VjaCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuX2hhbmRsZVRvdWNoTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIFByZXZlbnQgc2Nyb2xsaW5nLlxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB2YXIgdG91Y2ggPSBldmVudC50YXJnZXRUb3VjaGVzWzBdO1xuICAgIHNlbGYuX3N0cm9rZU1vdmVVcGRhdGUodG91Y2gpO1xuICB9O1xuXG4gIHRoaXMuX2hhbmRsZVRvdWNoRW5kID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHdhc0NhbnZhc1RvdWNoZWQgPSBldmVudC50YXJnZXQgPT09IHNlbGYuX2NhbnZhcztcbiAgICBpZiAod2FzQ2FudmFzVG91Y2hlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNlbGYuX3N0cm9rZUVuZChldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEVuYWJsZSBtb3VzZSBhbmQgdG91Y2ggZXZlbnQgaGFuZGxlcnNcbiAgdGhpcy5vbigpO1xufVxuXG4vLyBQdWJsaWMgbWV0aG9kc1xuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcbiAgdmFyIGNhbnZhcyA9IHRoaXMuX2NhbnZhcztcblxuICBjdHguZmlsbFN0eWxlID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3I7XG4gIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG5cbiAgdGhpcy5fZGF0YSA9IFtdO1xuICB0aGlzLl9yZXNldCgpO1xuICB0aGlzLl9pc0VtcHR5ID0gdHJ1ZTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuZnJvbURhdGFVUkwgPSBmdW5jdGlvbiAoZGF0YVVybCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICB2YXIgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgdmFyIHJhdGlvID0gb3B0aW9ucy5yYXRpbyB8fCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICB2YXIgd2lkdGggPSBvcHRpb25zLndpZHRoIHx8IHRoaXMuX2NhbnZhcy53aWR0aCAvIHJhdGlvO1xuICB2YXIgaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgfHwgdGhpcy5fY2FudmFzLmhlaWdodCAvIHJhdGlvO1xuXG4gIHRoaXMuX3Jlc2V0KCk7XG4gIGltYWdlLnNyYyA9IGRhdGFVcmw7XG4gIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpcy5fY3R4LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gIH07XG4gIHRoaXMuX2lzRW1wdHkgPSBmYWxzZTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUudG9EYXRhVVJMID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgdmFyIF9jYW52YXM7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnaW1hZ2Uvc3ZnK3htbCc6XG4gICAgICByZXR1cm4gdGhpcy5fdG9TVkcoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG9wdGlvbnMgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIG9wdGlvbnNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKF9jYW52YXMgPSB0aGlzLl9jYW52YXMpLnRvRGF0YVVSTC5hcHBseShfY2FudmFzLCBbdHlwZV0uY29uY2F0KG9wdGlvbnMpKTtcbiAgfVxufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5faGFuZGxlTW91c2VFdmVudHMoKTtcbiAgdGhpcy5faGFuZGxlVG91Y2hFdmVudHMoKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5faGFuZGxlTW91c2VEb3duKTtcbiAgdGhpcy5fY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX2hhbmRsZU1vdXNlTW92ZSk7XG4gIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9oYW5kbGVNb3VzZVVwKTtcblxuICB0aGlzLl9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX2hhbmRsZVRvdWNoU3RhcnQpO1xuICB0aGlzLl9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5faGFuZGxlVG91Y2hNb3ZlKTtcbiAgdGhpcy5fY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5faGFuZGxlVG91Y2hFbmQpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5faXNFbXB0eTtcbn07XG5cbi8vIFByaXZhdGUgbWV0aG9kc1xuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlQmVnaW4gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdGhpcy5fZGF0YS5wdXNoKFtdKTtcbiAgdGhpcy5fcmVzZXQoKTtcbiAgdGhpcy5fc3Ryb2tlVXBkYXRlKGV2ZW50KTtcblxuICBpZiAodHlwZW9mIHRoaXMub25CZWdpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMub25CZWdpbihldmVudCk7XG4gIH1cbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3N0cm9rZVVwZGF0ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICB2YXIgeCA9IGV2ZW50LmNsaWVudFg7XG4gIHZhciB5ID0gZXZlbnQuY2xpZW50WTtcblxuICB2YXIgcG9pbnQgPSB0aGlzLl9jcmVhdGVQb2ludCh4LCB5KTtcbiAgdmFyIGxhc3RQb2ludEdyb3VwID0gdGhpcy5fZGF0YVt0aGlzLl9kYXRhLmxlbmd0aCAtIDFdO1xuICB2YXIgbGFzdFBvaW50ID0gbGFzdFBvaW50R3JvdXAgJiYgbGFzdFBvaW50R3JvdXBbbGFzdFBvaW50R3JvdXAubGVuZ3RoIC0gMV07XG4gIHZhciBpc0xhc3RQb2ludFRvb0Nsb3NlID0gbGFzdFBvaW50ICYmIHBvaW50LmRpc3RhbmNlVG8obGFzdFBvaW50KSA8IHRoaXMubWluRGlzdGFuY2U7XG5cbiAgLy8gU2tpcCB0aGlzIHBvaW50IGlmIGl0J3MgdG9vIGNsb3NlIHRvIHRoZSBwcmV2aW91cyBvbmVcbiAgaWYgKCEobGFzdFBvaW50ICYmIGlzTGFzdFBvaW50VG9vQ2xvc2UpKSB7XG4gICAgdmFyIF9hZGRQb2ludCA9IHRoaXMuX2FkZFBvaW50KHBvaW50KSxcbiAgICAgICAgY3VydmUgPSBfYWRkUG9pbnQuY3VydmUsXG4gICAgICAgIHdpZHRocyA9IF9hZGRQb2ludC53aWR0aHM7XG5cbiAgICBpZiAoY3VydmUgJiYgd2lkdGhzKSB7XG4gICAgICB0aGlzLl9kcmF3Q3VydmUoY3VydmUsIHdpZHRocy5zdGFydCwgd2lkdGhzLmVuZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YVt0aGlzLl9kYXRhLmxlbmd0aCAtIDFdLnB1c2goe1xuICAgICAgeDogcG9pbnQueCxcbiAgICAgIHk6IHBvaW50LnksXG4gICAgICB0aW1lOiBwb2ludC50aW1lLFxuICAgICAgY29sb3I6IHRoaXMucGVuQ29sb3JcbiAgICB9KTtcbiAgfVxufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlRW5kID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHZhciBjYW5EcmF3Q3VydmUgPSB0aGlzLnBvaW50cy5sZW5ndGggPiAyO1xuICB2YXIgcG9pbnQgPSB0aGlzLnBvaW50c1swXTsgLy8gUG9pbnQgaW5zdGFuY2VcblxuICBpZiAoIWNhbkRyYXdDdXJ2ZSAmJiBwb2ludCkge1xuICAgIHRoaXMuX2RyYXdEb3QocG9pbnQpO1xuICB9XG5cbiAgaWYgKHBvaW50KSB7XG4gICAgdmFyIGxhc3RQb2ludEdyb3VwID0gdGhpcy5fZGF0YVt0aGlzLl9kYXRhLmxlbmd0aCAtIDFdO1xuICAgIHZhciBsYXN0UG9pbnQgPSBsYXN0UG9pbnRHcm91cFtsYXN0UG9pbnRHcm91cC5sZW5ndGggLSAxXTsgLy8gcGxhaW4gb2JqZWN0XG5cbiAgICAvLyBXaGVuIGRyYXdpbmcgYSBkb3QsIHRoZXJlJ3Mgb25seSBvbmUgcG9pbnQgaW4gYSBncm91cCwgc28gd2l0aG91dCB0aGlzIGNoZWNrXG4gICAgLy8gc3VjaCBncm91cCB3b3VsZCBlbmQgdXAgd2l0aCBleGFjdGx5IHRoZSBzYW1lIDIgcG9pbnRzLlxuICAgIGlmICghcG9pbnQuZXF1YWxzKGxhc3RQb2ludCkpIHtcbiAgICAgIGxhc3RQb2ludEdyb3VwLnB1c2goe1xuICAgICAgICB4OiBwb2ludC54LFxuICAgICAgICB5OiBwb2ludC55LFxuICAgICAgICB0aW1lOiBwb2ludC50aW1lLFxuICAgICAgICBjb2xvcjogdGhpcy5wZW5Db2xvclxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0aGlzLm9uRW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5vbkVuZChldmVudCk7XG4gIH1cbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2hhbmRsZU1vdXNlRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9tb3VzZUJ1dHRvbkRvd24gPSBmYWxzZTtcblxuICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5faGFuZGxlTW91c2VEb3duKTtcbiAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX2hhbmRsZU1vdXNlTW92ZSk7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9oYW5kbGVNb3VzZVVwKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAvLyBQYXNzIHRvdWNoIGV2ZW50cyB0byBjYW52YXMgZWxlbWVudCBvbiBtb2JpbGUgSUUxMSBhbmQgRWRnZS5cbiAgdGhpcy5fY2FudmFzLnN0eWxlLm1zVG91Y2hBY3Rpb24gPSAnbm9uZSc7XG4gIHRoaXMuX2NhbnZhcy5zdHlsZS50b3VjaEFjdGlvbiA9ICdub25lJztcblxuICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX2hhbmRsZVRvdWNoU3RhcnQpO1xuICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5faGFuZGxlVG91Y2hNb3ZlKTtcbiAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5faGFuZGxlVG91Y2hFbmQpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucG9pbnRzID0gW107XG4gIHRoaXMuX2xhc3RWZWxvY2l0eSA9IDA7XG4gIHRoaXMuX2xhc3RXaWR0aCA9ICh0aGlzLm1pbldpZHRoICsgdGhpcy5tYXhXaWR0aCkgLyAyO1xuICB0aGlzLl9jdHguZmlsbFN0eWxlID0gdGhpcy5wZW5Db2xvcjtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2NyZWF0ZVBvaW50ID0gZnVuY3Rpb24gKHgsIHksIHRpbWUpIHtcbiAgdmFyIHJlY3QgPSB0aGlzLl9jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgcmV0dXJuIG5ldyBQb2ludCh4IC0gcmVjdC5sZWZ0LCB5IC0gcmVjdC50b3AsIHRpbWUgfHwgbmV3IERhdGUoKS5nZXRUaW1lKCkpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fYWRkUG9pbnQgPSBmdW5jdGlvbiAocG9pbnQpIHtcbiAgdmFyIHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICB2YXIgdG1wID0gdm9pZCAwO1xuXG4gIHBvaW50cy5wdXNoKHBvaW50KTtcblxuICBpZiAocG9pbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAvLyBUbyByZWR1Y2UgdGhlIGluaXRpYWwgbGFnIG1ha2UgaXQgd29yayB3aXRoIDMgcG9pbnRzXG4gICAgLy8gYnkgY29weWluZyB0aGUgZmlyc3QgcG9pbnQgdG8gdGhlIGJlZ2lubmluZy5cbiAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMykgcG9pbnRzLnVuc2hpZnQocG9pbnRzWzBdKTtcblxuICAgIHRtcCA9IHRoaXMuX2NhbGN1bGF0ZUN1cnZlQ29udHJvbFBvaW50cyhwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdKTtcbiAgICB2YXIgYzIgPSB0bXAuYzI7XG4gICAgdG1wID0gdGhpcy5fY2FsY3VsYXRlQ3VydmVDb250cm9sUG9pbnRzKHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2ludHNbM10pO1xuICAgIHZhciBjMyA9IHRtcC5jMTtcbiAgICB2YXIgY3VydmUgPSBuZXcgQmV6aWVyKHBvaW50c1sxXSwgYzIsIGMzLCBwb2ludHNbMl0pO1xuICAgIHZhciB3aWR0aHMgPSB0aGlzLl9jYWxjdWxhdGVDdXJ2ZVdpZHRocyhjdXJ2ZSk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgbGlzdCxcbiAgICAvLyBzbyB0aGF0IHdlIGFsd2F5cyBoYXZlIG5vIG1vcmUgdGhhbiA0IHBvaW50cyBpbiBwb2ludHMgYXJyYXkuXG4gICAgcG9pbnRzLnNoaWZ0KCk7XG5cbiAgICByZXR1cm4geyBjdXJ2ZTogY3VydmUsIHdpZHRoczogd2lkdGhzIH07XG4gIH1cblxuICByZXR1cm4ge307XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9jYWxjdWxhdGVDdXJ2ZUNvbnRyb2xQb2ludHMgPSBmdW5jdGlvbiAoczEsIHMyLCBzMykge1xuICB2YXIgZHgxID0gczEueCAtIHMyLng7XG4gIHZhciBkeTEgPSBzMS55IC0gczIueTtcbiAgdmFyIGR4MiA9IHMyLnggLSBzMy54O1xuICB2YXIgZHkyID0gczIueSAtIHMzLnk7XG5cbiAgdmFyIG0xID0geyB4OiAoczEueCArIHMyLngpIC8gMi4wLCB5OiAoczEueSArIHMyLnkpIC8gMi4wIH07XG4gIHZhciBtMiA9IHsgeDogKHMyLnggKyBzMy54KSAvIDIuMCwgeTogKHMyLnkgKyBzMy55KSAvIDIuMCB9O1xuXG4gIHZhciBsMSA9IE1hdGguc3FydChkeDEgKiBkeDEgKyBkeTEgKiBkeTEpO1xuICB2YXIgbDIgPSBNYXRoLnNxcnQoZHgyICogZHgyICsgZHkyICogZHkyKTtcblxuICB2YXIgZHhtID0gbTEueCAtIG0yLng7XG4gIHZhciBkeW0gPSBtMS55IC0gbTIueTtcblxuICB2YXIgayA9IGwyIC8gKGwxICsgbDIpO1xuICB2YXIgY20gPSB7IHg6IG0yLnggKyBkeG0gKiBrLCB5OiBtMi55ICsgZHltICogayB9O1xuXG4gIHZhciB0eCA9IHMyLnggLSBjbS54O1xuICB2YXIgdHkgPSBzMi55IC0gY20ueTtcblxuICByZXR1cm4ge1xuICAgIGMxOiBuZXcgUG9pbnQobTEueCArIHR4LCBtMS55ICsgdHkpLFxuICAgIGMyOiBuZXcgUG9pbnQobTIueCArIHR4LCBtMi55ICsgdHkpXG4gIH07XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9jYWxjdWxhdGVDdXJ2ZVdpZHRocyA9IGZ1bmN0aW9uIChjdXJ2ZSkge1xuICB2YXIgc3RhcnRQb2ludCA9IGN1cnZlLnN0YXJ0UG9pbnQ7XG4gIHZhciBlbmRQb2ludCA9IGN1cnZlLmVuZFBvaW50O1xuICB2YXIgd2lkdGhzID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG5cbiAgdmFyIHZlbG9jaXR5ID0gdGhpcy52ZWxvY2l0eUZpbHRlcldlaWdodCAqIGVuZFBvaW50LnZlbG9jaXR5RnJvbShzdGFydFBvaW50KSArICgxIC0gdGhpcy52ZWxvY2l0eUZpbHRlcldlaWdodCkgKiB0aGlzLl9sYXN0VmVsb2NpdHk7XG5cbiAgdmFyIG5ld1dpZHRoID0gdGhpcy5fc3Ryb2tlV2lkdGgodmVsb2NpdHkpO1xuXG4gIHdpZHRocy5zdGFydCA9IHRoaXMuX2xhc3RXaWR0aDtcbiAgd2lkdGhzLmVuZCA9IG5ld1dpZHRoO1xuXG4gIHRoaXMuX2xhc3RWZWxvY2l0eSA9IHZlbG9jaXR5O1xuICB0aGlzLl9sYXN0V2lkdGggPSBuZXdXaWR0aDtcblxuICByZXR1cm4gd2lkdGhzO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlV2lkdGggPSBmdW5jdGlvbiAodmVsb2NpdHkpIHtcbiAgcmV0dXJuIE1hdGgubWF4KHRoaXMubWF4V2lkdGggLyAodmVsb2NpdHkgKyAxKSwgdGhpcy5taW5XaWR0aCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9kcmF3UG9pbnQgPSBmdW5jdGlvbiAoeCwgeSwgc2l6ZSkge1xuICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuXG4gIGN0eC5tb3ZlVG8oeCwgeSk7XG4gIGN0eC5hcmMoeCwgeSwgc2l6ZSwgMCwgMiAqIE1hdGguUEksIGZhbHNlKTtcbiAgdGhpcy5faXNFbXB0eSA9IGZhbHNlO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fZHJhd0N1cnZlID0gZnVuY3Rpb24gKGN1cnZlLCBzdGFydFdpZHRoLCBlbmRXaWR0aCkge1xuICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuICB2YXIgd2lkdGhEZWx0YSA9IGVuZFdpZHRoIC0gc3RhcnRXaWR0aDtcbiAgdmFyIGRyYXdTdGVwcyA9IE1hdGguZmxvb3IoY3VydmUubGVuZ3RoKCkpO1xuXG4gIGN0eC5iZWdpblBhdGgoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRyYXdTdGVwczsgaSArPSAxKSB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBCZXppZXIgKHgsIHkpIGNvb3JkaW5hdGUgZm9yIHRoaXMgc3RlcC5cbiAgICB2YXIgdCA9IGkgLyBkcmF3U3RlcHM7XG4gICAgdmFyIHR0ID0gdCAqIHQ7XG4gICAgdmFyIHR0dCA9IHR0ICogdDtcbiAgICB2YXIgdSA9IDEgLSB0O1xuICAgIHZhciB1dSA9IHUgKiB1O1xuICAgIHZhciB1dXUgPSB1dSAqIHU7XG5cbiAgICB2YXIgeCA9IHV1dSAqIGN1cnZlLnN0YXJ0UG9pbnQueDtcbiAgICB4ICs9IDMgKiB1dSAqIHQgKiBjdXJ2ZS5jb250cm9sMS54O1xuICAgIHggKz0gMyAqIHUgKiB0dCAqIGN1cnZlLmNvbnRyb2wyLng7XG4gICAgeCArPSB0dHQgKiBjdXJ2ZS5lbmRQb2ludC54O1xuXG4gICAgdmFyIHkgPSB1dXUgKiBjdXJ2ZS5zdGFydFBvaW50Lnk7XG4gICAgeSArPSAzICogdXUgKiB0ICogY3VydmUuY29udHJvbDEueTtcbiAgICB5ICs9IDMgKiB1ICogdHQgKiBjdXJ2ZS5jb250cm9sMi55O1xuICAgIHkgKz0gdHR0ICogY3VydmUuZW5kUG9pbnQueTtcblxuICAgIHZhciB3aWR0aCA9IHN0YXJ0V2lkdGggKyB0dHQgKiB3aWR0aERlbHRhO1xuICAgIHRoaXMuX2RyYXdQb2ludCh4LCB5LCB3aWR0aCk7XG4gIH1cblxuICBjdHguY2xvc2VQYXRoKCk7XG4gIGN0eC5maWxsKCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9kcmF3RG90ID0gZnVuY3Rpb24gKHBvaW50KSB7XG4gIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gIHZhciB3aWR0aCA9IHR5cGVvZiB0aGlzLmRvdFNpemUgPT09ICdmdW5jdGlvbicgPyB0aGlzLmRvdFNpemUoKSA6IHRoaXMuZG90U2l6ZTtcblxuICBjdHguYmVnaW5QYXRoKCk7XG4gIHRoaXMuX2RyYXdQb2ludChwb2ludC54LCBwb2ludC55LCB3aWR0aCk7XG4gIGN0eC5jbG9zZVBhdGgoKTtcbiAgY3R4LmZpbGwoKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2Zyb21EYXRhID0gZnVuY3Rpb24gKHBvaW50R3JvdXBzLCBkcmF3Q3VydmUsIGRyYXdEb3QpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludEdyb3Vwcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBncm91cCA9IHBvaW50R3JvdXBzW2ldO1xuXG4gICAgaWYgKGdyb3VwLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ3JvdXAubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgdmFyIHJhd1BvaW50ID0gZ3JvdXBbal07XG4gICAgICAgIHZhciBwb2ludCA9IG5ldyBQb2ludChyYXdQb2ludC54LCByYXdQb2ludC55LCByYXdQb2ludC50aW1lKTtcbiAgICAgICAgdmFyIGNvbG9yID0gcmF3UG9pbnQuY29sb3I7XG5cbiAgICAgICAgaWYgKGogPT09IDApIHtcbiAgICAgICAgICAvLyBGaXJzdCBwb2ludCBpbiBhIGdyb3VwLiBOb3RoaW5nIHRvIGRyYXcgeWV0LlxuXG4gICAgICAgICAgLy8gQWxsIHBvaW50cyBpbiB0aGUgZ3JvdXAgaGF2ZSB0aGUgc2FtZSBjb2xvciwgc28gaXQncyBlbm91Z2ggdG8gc2V0XG4gICAgICAgICAgLy8gcGVuQ29sb3IganVzdCBhdCB0aGUgYmVnaW5uaW5nLlxuICAgICAgICAgIHRoaXMucGVuQ29sb3IgPSBjb2xvcjtcbiAgICAgICAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgICAgICAgdGhpcy5fYWRkUG9pbnQocG9pbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGogIT09IGdyb3VwLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAvLyBNaWRkbGUgcG9pbnQgaW4gYSBncm91cC5cbiAgICAgICAgICB2YXIgX2FkZFBvaW50MiA9IHRoaXMuX2FkZFBvaW50KHBvaW50KSxcbiAgICAgICAgICAgICAgY3VydmUgPSBfYWRkUG9pbnQyLmN1cnZlLFxuICAgICAgICAgICAgICB3aWR0aHMgPSBfYWRkUG9pbnQyLndpZHRocztcblxuICAgICAgICAgIGlmIChjdXJ2ZSAmJiB3aWR0aHMpIHtcbiAgICAgICAgICAgIGRyYXdDdXJ2ZShjdXJ2ZSwgd2lkdGhzLCBjb2xvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIExhc3QgcG9pbnQgaW4gYSBncm91cC4gRG8gbm90aGluZy5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZXNldCgpO1xuICAgICAgdmFyIF9yYXdQb2ludCA9IGdyb3VwWzBdO1xuICAgICAgZHJhd0RvdChfcmF3UG9pbnQpO1xuICAgIH1cbiAgfVxufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fdG9TVkcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIHZhciBwb2ludEdyb3VwcyA9IHRoaXMuX2RhdGE7XG4gIHZhciBjYW52YXMgPSB0aGlzLl9jYW52YXM7XG4gIHZhciByYXRpbyA9IE1hdGgubWF4KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEsIDEpO1xuICB2YXIgbWluWCA9IDA7XG4gIHZhciBtaW5ZID0gMDtcbiAgdmFyIG1heFggPSBjYW52YXMud2lkdGggLyByYXRpbztcbiAgdmFyIG1heFkgPSBjYW52YXMuaGVpZ2h0IC8gcmF0aW87XG4gIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuXG4gIHN2Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnd2lkdGgnLCBjYW52YXMud2lkdGgpO1xuICBzdmcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2hlaWdodCcsIGNhbnZhcy5oZWlnaHQpO1xuXG4gIHRoaXMuX2Zyb21EYXRhKHBvaW50R3JvdXBzLCBmdW5jdGlvbiAoY3VydmUsIHdpZHRocywgY29sb3IpIHtcbiAgICB2YXIgcGF0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3BhdGgnKTtcblxuICAgIC8vIE5lZWQgdG8gY2hlY2sgY3VydmUgZm9yIE5hTiB2YWx1ZXMsIHRoZXNlIHBvcCB1cCB3aGVuIGRyYXdpbmdcbiAgICAvLyBsaW5lcyBvbiB0aGUgY2FudmFzIHRoYXQgYXJlIG5vdCBjb250aW51b3VzLiBFLmcuIFNoYXJwIGNvcm5lcnNcbiAgICAvLyBvciBzdG9wcGluZyBtaWQtc3Ryb2tlIGFuZCB0aGFuIGNvbnRpbnVpbmcgd2l0aG91dCBsaWZ0aW5nIG1vdXNlLlxuICAgIGlmICghaXNOYU4oY3VydmUuY29udHJvbDEueCkgJiYgIWlzTmFOKGN1cnZlLmNvbnRyb2wxLnkpICYmICFpc05hTihjdXJ2ZS5jb250cm9sMi54KSAmJiAhaXNOYU4oY3VydmUuY29udHJvbDIueSkpIHtcbiAgICAgIHZhciBhdHRyID0gJ00gJyArIGN1cnZlLnN0YXJ0UG9pbnQueC50b0ZpeGVkKDMpICsgJywnICsgY3VydmUuc3RhcnRQb2ludC55LnRvRml4ZWQoMykgKyAnICcgKyAoJ0MgJyArIGN1cnZlLmNvbnRyb2wxLngudG9GaXhlZCgzKSArICcsJyArIGN1cnZlLmNvbnRyb2wxLnkudG9GaXhlZCgzKSArICcgJykgKyAoY3VydmUuY29udHJvbDIueC50b0ZpeGVkKDMpICsgJywnICsgY3VydmUuY29udHJvbDIueS50b0ZpeGVkKDMpICsgJyAnKSArIChjdXJ2ZS5lbmRQb2ludC54LnRvRml4ZWQoMykgKyAnLCcgKyBjdXJ2ZS5lbmRQb2ludC55LnRvRml4ZWQoMykpO1xuXG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnZCcsIGF0dHIpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsICh3aWR0aHMuZW5kICogMi4yNSkudG9GaXhlZCgzKSk7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgY29sb3IpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywgJ3JvdW5kJyk7XG5cbiAgICAgIHN2Zy5hcHBlbmRDaGlsZChwYXRoKTtcbiAgICB9XG4gIH0sIGZ1bmN0aW9uIChyYXdQb2ludCkge1xuICAgIHZhciBjaXJjbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjaXJjbGUnKTtcbiAgICB2YXIgZG90U2l6ZSA9IHR5cGVvZiBfdGhpczIuZG90U2l6ZSA9PT0gJ2Z1bmN0aW9uJyA/IF90aGlzMi5kb3RTaXplKCkgOiBfdGhpczIuZG90U2l6ZTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCdyJywgZG90U2l6ZSk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnY3gnLCByYXdQb2ludC54KTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCdjeScsIHJhd1BvaW50LnkpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCByYXdQb2ludC5jb2xvcik7XG5cbiAgICBzdmcuYXBwZW5kQ2hpbGQoY2lyY2xlKTtcbiAgfSk7XG5cbiAgdmFyIHByZWZpeCA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCc7XG4gIHZhciBoZWFkZXIgPSAnPHN2ZycgKyAnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIicgKyAnIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiJyArICgnIHZpZXdCb3g9XCInICsgbWluWCArICcgJyArIG1pblkgKyAnICcgKyBtYXhYICsgJyAnICsgbWF4WSArICdcIicpICsgKCcgd2lkdGg9XCInICsgbWF4WCArICdcIicpICsgKCcgaGVpZ2h0PVwiJyArIG1heFkgKyAnXCInKSArICc+JztcbiAgdmFyIGJvZHkgPSBzdmcuaW5uZXJIVE1MO1xuXG4gIC8vIElFIGhhY2sgZm9yIG1pc3NpbmcgaW5uZXJIVE1MIHByb3BlcnR5IG9uIFNWR0VsZW1lbnRcbiAgaWYgKGJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBkdW1teSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2R1bW15Jyk7XG4gICAgdmFyIG5vZGVzID0gc3ZnLmNoaWxkTm9kZXM7XG4gICAgZHVtbXkuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBkdW1teS5hcHBlbmRDaGlsZChub2Rlc1tpXS5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIH1cblxuICAgIGJvZHkgPSBkdW1teS5pbm5lckhUTUw7XG4gIH1cblxuICB2YXIgZm9vdGVyID0gJzwvc3ZnPic7XG4gIHZhciBkYXRhID0gaGVhZGVyICsgYm9keSArIGZvb3RlcjtcblxuICByZXR1cm4gcHJlZml4ICsgYnRvYShkYXRhKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuZnJvbURhdGEgPSBmdW5jdGlvbiAocG9pbnRHcm91cHMpIHtcbiAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgdGhpcy5jbGVhcigpO1xuXG4gIHRoaXMuX2Zyb21EYXRhKHBvaW50R3JvdXBzLCBmdW5jdGlvbiAoY3VydmUsIHdpZHRocykge1xuICAgIHJldHVybiBfdGhpczMuX2RyYXdDdXJ2ZShjdXJ2ZSwgd2lkdGhzLnN0YXJ0LCB3aWR0aHMuZW5kKTtcbiAgfSwgZnVuY3Rpb24gKHJhd1BvaW50KSB7XG4gICAgcmV0dXJuIF90aGlzMy5fZHJhd0RvdChyYXdQb2ludCk7XG4gIH0pO1xuXG4gIHRoaXMuX2RhdGEgPSBwb2ludEdyb3Vwcztcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUudG9EYXRhID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fZGF0YTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNpZ25hdHVyZVBhZDtcbiIsInZhciBpc1Byb2R1Y3Rpb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xudmFyIHByZWZpeCA9ICdJbnZhcmlhbnQgZmFpbGVkJztcbmZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzUHJvZHVjdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJlZml4KTtcbiAgICB9XG4gICAgdmFyIHByb3ZpZGVkID0gdHlwZW9mIG1lc3NhZ2UgPT09ICdmdW5jdGlvbicgPyBtZXNzYWdlKCkgOiBtZXNzYWdlO1xuICAgIHZhciB2YWx1ZSA9IHByb3ZpZGVkID8gXCJcIi5jb25jYXQocHJlZml4LCBcIjogXCIpLmNvbmNhdChwcm92aWRlZCkgOiBwcmVmaXg7XG4gICAgdGhyb3cgbmV3IEVycm9yKHZhbHVlKTtcbn1cblxuZXhwb3J0IHsgaW52YXJpYW50IGFzIGRlZmF1bHQgfTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCAqL1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQ7XG4gIH1cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgIH1cbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICB9XG4gIH1cbiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICBkb25lID0gdHJ1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICB9XG4gIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxufTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsInZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiA/IChvYmopID0+IChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSkgOiAob2JqKSA9PiAob2JqLl9fcHJvdG9fXyk7XG52YXIgbGVhZlByb3RvdHlwZXM7XG4vLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuLy8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4vLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8vIG1vZGUgJiAxNjogcmV0dXJuIHZhbHVlIHdoZW4gaXQncyBQcm9taXNlLWxpa2Vcbi8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbl9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG5cdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IHRoaXModmFsdWUpO1xuXHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuXHRpZih0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlKSB7XG5cdFx0aWYoKG1vZGUgJiA0KSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG5cdFx0aWYoKG1vZGUgJiAxNikgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHJldHVybiB2YWx1ZTtcblx0fVxuXHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuXHR2YXIgZGVmID0ge307XG5cdGxlYWZQcm90b3R5cGVzID0gbGVhZlByb3RvdHlwZXMgfHwgW251bGwsIGdldFByb3RvKHt9KSwgZ2V0UHJvdG8oW10pLCBnZXRQcm90byhnZXRQcm90byldO1xuXHRmb3IodmFyIGN1cnJlbnQgPSBtb2RlICYgMiAmJiB2YWx1ZTsgdHlwZW9mIGN1cnJlbnQgPT0gJ29iamVjdCcgJiYgIX5sZWFmUHJvdG90eXBlcy5pbmRleE9mKGN1cnJlbnQpOyBjdXJyZW50ID0gZ2V0UHJvdG8oY3VycmVudCkpIHtcblx0XHRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjdXJyZW50KS5mb3JFYWNoKChrZXkpID0+IChkZWZba2V5XSA9ICgpID0+ICh2YWx1ZVtrZXldKSkpO1xuXHR9XG5cdGRlZlsnZGVmYXVsdCddID0gKCkgPT4gKHZhbHVlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBkZWYpO1xuXHRyZXR1cm4gbnM7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubm1kID0gKG1vZHVsZSkgPT4ge1xuXHRtb2R1bGUucGF0aHMgPSBbXTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCJ2YXIgc2NyaXB0VXJsO1xuaWYgKF9fd2VicGFja19yZXF1aXJlX18uZy5pbXBvcnRTY3JpcHRzKSBzY3JpcHRVcmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcubG9jYXRpb24gKyBcIlwiO1xudmFyIGRvY3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmRvY3VtZW50O1xuaWYgKCFzY3JpcHRVcmwgJiYgZG9jdW1lbnQpIHtcblx0aWYgKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdTQ1JJUFQnKVxuXHRcdHNjcmlwdFVybCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHtcblx0XHRcdHZhciBpID0gc2NyaXB0cy5sZW5ndGggLSAxO1xuXHRcdFx0d2hpbGUgKGkgPiAtMSAmJiAoIXNjcmlwdFVybCB8fCAhL15odHRwKHM/KTovLnRlc3Qoc2NyaXB0VXJsKSkpIHNjcmlwdFVybCA9IHNjcmlwdHNbaS0tXS5zcmM7XG5cdFx0fVxuXHR9XG59XG4vLyBXaGVuIHN1cHBvcnRpbmcgYnJvd3NlcnMgd2hlcmUgYW4gYXV0b21hdGljIHB1YmxpY1BhdGggaXMgbm90IHN1cHBvcnRlZCB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dC5wdWJsaWNQYXRoIG1hbnVhbGx5IHZpYSBjb25maWd1cmF0aW9uXG4vLyBvciBwYXNzIGFuIGVtcHR5IHN0cmluZyAoXCJcIikgYW5kIHNldCB0aGUgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gdmFyaWFibGUgZnJvbSB5b3VyIGNvZGUgdG8gdXNlIHlvdXIgb3duIGxvZ2ljLlxuaWYgKCFzY3JpcHRVcmwpIHRocm93IG5ldyBFcnJvcihcIkF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyXCIpO1xuc2NyaXB0VXJsID0gc2NyaXB0VXJsLnJlcGxhY2UoLyMuKiQvLCBcIlwiKS5yZXBsYWNlKC9cXD8uKiQvLCBcIlwiKS5yZXBsYWNlKC9cXC9bXlxcL10rJC8sIFwiL1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18ucCA9IHNjcmlwdFVybDsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmIgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHNlbGYubG9jYXRpb24uaHJlZjtcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gW3Jlc29sdmUsIHJlamVjdCwgUHJvbWlzZV0gPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHRcIm1haW5cIjogMFxufTtcblxuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxuLy8gbm8gb24gY2h1bmtzIGxvYWRlZFxuXG4vLyBubyBqc29ucCBmdW5jdGlvbiIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcclxuaW1wb3J0IFBhcnNlIGZyb20gXCJwYXJzZVwiO1xyXG5pbXBvcnQgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIjtcclxuaW1wb3J0IFBkZlJlcXVlc3RGaWxlcyBmcm9tIFwiLi4vcGFnZXMvUGRmUmVxdWVzdEZpbGVzXCI7XHJcbmltcG9ydCB7IHBkZmpzIH0gZnJvbSBcInJlYWN0LXBkZlwiO1xyXG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gXCJyZWFjdC1yZWR1eFwiO1xyXG5pbXBvcnQgeyBzdG9yZSB9IGZyb20gXCIuLi9yZWR1eC9zdG9yZVwiO1xyXG5pbXBvcnQgXCIuLi9pbmRleC5jc3NcIjtcclxuaW1wb3J0IFwiLi9pMThuXCI7XHJcbmltcG9ydCB7IGlzUHVibGljU3RhZ2luZyB9IGZyb20gXCIuLi9jb25zdGFudC9jb25zdFwiO1xyXG5wZGZqcy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyA9IGAvL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9wZGYuanMvJHtwZGZqcy52ZXJzaW9ufS9wZGYud29ya2VyLm1pbi5tanNgO1xyXG5cclxuLy8gV3JhcHBlciBjb21wb25lbnQgdG8gbWFuYWdlIHByb3BzXHJcbmNvbnN0IFB1YmxpY1NjcmlwdEZpbGVXcmFwcGVyID0gKHsgaW5pdGlhbFByb3BzIH0pID0+IHtcclxuICBjb25zdCBbcHJvcHMsIHNldFByb3BzXSA9IHVzZVN0YXRlKGluaXRpYWxQcm9wcyk7XHJcblxyXG4gIC8vIE1ha2UgdGhlIHNldFByb3BzIGZ1bmN0aW9uIGdsb2JhbGx5IGFjY2Vzc2libGVcclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgd2luZG93LnVwZGF0ZVB1YmxpY1RlbXBsYXRlUHJvcHMgPSBzZXRQcm9wcztcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICB3aW5kb3cudXBkYXRlUHVibGljVGVtcGxhdGVQcm9wcyA9IHVuZGVmaW5lZDtcclxuICAgIH07XHJcbiAgfSwgW10pO1xyXG5cclxuICByZXR1cm4gPFBkZlJlcXVlc3RGaWxlcyB7Li4ucHJvcHN9IC8+O1xyXG59O1xyXG5cclxuY29uc3QgYXBwSWQgPSBpc1B1YmxpY1N0YWdpbmcgPyBcIm9wZW5zaWduXCIgOiBcImxlZ2FkcmFuYXhuXCI7XHJcbi8vXCJvcGVuc2lnblwiXHJcblxyXG5jb25zdCBzZXJ2ZXJVcmwgPSBpc1B1YmxpY1N0YWdpbmdcclxuICA/IFwiaHR0cHM6Ly9zdGFnaW5nLWFwcC5vcGVuc2lnbmxhYnMuY29tL2FwaS9hcHBcIlxyXG4gIDogXCJodHRwczovL2FwcC5vcGVuc2lnbmxhYnMuY29tL2FwaS9hcHBcIjtcclxuLy8gIFwiaHR0cHM6Ly9zdGFnaW5nLWFwcC5vcGVuc2lnbmxhYnMuY29tL2FwaS9hcHBcIlxyXG5cclxubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJiYXNlVXJsXCIsIGAke3NlcnZlclVybH0vYCk7XHJcbmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwicGFyc2VBcHBJZFwiLCBhcHBJZCk7XHJcblBhcnNlLmluaXRpYWxpemUoYXBwSWQpO1xyXG5QYXJzZS5zZXJ2ZXJVUkwgPSBzZXJ2ZXJVcmw7XHJcbi8vIENyZWF0ZSBhIG5ldyBkaXYgZWxlbWVudCBhbmQgYXBwZW5kIGl0IHRvIHRoZSBib2R5XHJcbmNvbnN0IHNjcmlwdENvbXBvbmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbnNjcmlwdENvbXBvbmVudC5pZCA9IFwic2NyaXB0LWNvbXBvbmVudFwiO1xyXG5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdENvbXBvbmVudCk7XHJcbmNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcclxubGluay5ocmVmID0gXCJodHRwczovL2Nkbi5vcGVuc2lnbmxhYnMuY29tL2ZvbnRzLmNzc1wiO1xyXG5saW5rLnJlbCA9IFwic3R5bGVzaGVldFwiO1xyXG5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xyXG5cclxuLy9hZGQgdGhlIFRhaWx3aW5kIENTUyBmaWxlXHJcbmNvbnN0IHRhaWx3aW5kQ3NzTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xyXG50YWlsd2luZENzc0xpbmsuaHJlZiA9XHJcbiAgXCJodHRwczovL2FwcC5vcGVuc2lnbmxhYnMuY29tL3N0YXRpYy9qcy9wdWJsaWMtdGVtcGxhdGUuYnVuZGxlLmNzc1wiOyAvLyBjc3MgYnVuZGxlIGZpbGVcclxudGFpbHdpbmRDc3NMaW5rLnJlbCA9IFwic3R5bGVzaGVldFwiO1xyXG5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRhaWx3aW5kQ3NzTGluayk7XHJcbi8vIENyZWF0ZSBhIHJvb3QgYW5kIHJlbmRlciB0aGUgd3JhcHBlciBjb21wb25lbnQgd2l0aCBpbml0aWFsIHByb3BzXHJcbmNvbnN0IHJvb3QgPSBSZWFjdERPTS5jcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2NyaXB0LWNvbXBvbmVudFwiKSk7XHJcbnJvb3QucmVuZGVyKFxyXG4gIDxkaXYgZGF0YS10aGVtZT1cIm9wZW5zaWduY3NzXCI+XHJcbiAgICA8UHJvdmlkZXIgc3RvcmU9e3N0b3JlfT5cclxuICAgICAgPFB1YmxpY1NjcmlwdEZpbGVXcmFwcGVyIGluaXRpYWxQcm9wcz17eyB0ZXh0OiBcInRlbXBsYXRlSWRcIiB9fSAvPlxyXG4gICAgPC9Qcm92aWRlcj5cclxuICA8L2Rpdj5cclxuKTtcclxuIl0sIm5hbWVzIjpbIlJlYWN0IiwiSGVsbWV0IiwiVGl0bGUiLCJfcmVmIiwidGl0bGUiLCJkcml2ZSIsImNyZWF0ZUVsZW1lbnQiLCJuYW1lIiwiY29udGVudCIsInJlbCIsInR5cGUiLCJocmVmIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsInNpemVzIiwiQm9yZGVyUmVzaXplIiwicmlnaHQiLCJ0b3AiLCJjbGFzc05hbWUiLCJ1c2VUcmFuc2xhdGlvbiIsIkRlZmF1bHRTaWduYXR1cmUiLCJkZWZhdWx0U2lnbkltZyIsInh5UG9zdGlvbiIsInNldERlZmF1bHRTaWduQWxlcnQiLCJ0IiwiY29uZmlybVRvYWRkRGVmYXVsdFNpZ24iLCJsZW5ndGgiLCJpc1Nob3ciLCJhbGVydE1lc3NhZ2UiLCJhbHQiLCJzcmMiLCJvbkNsaWNrIiwidXNlU3RhdGUiLCJQcmV2TmV4dCIsImhhbmRsZURvd25sb2FkQ2VydGlmaWNhdGUiLCJoYW5kbGVEb3dubG9hZFBkZiIsImhhbmRsZVRvUHJpbnQiLCJEcm9wZG93bk1lbnUiLCJNb2RhbFVpIiwiTG9hZGVyIiwiSGVhZGVyIiwiaXNQZGZSZXF1ZXN0RmlsZXMiLCJpc1BsYWNlaG9sZGVyIiwic2V0SXNEZWNsaW5lIiwicGFnZU51bWJlciIsImFsbFBhZ2VzIiwiY2hhbmdlUGFnZSIsInBkZlVybCIsImVtYmVkV2lkZ2V0c0RhdGEiLCJwZGZEZXRhaWxzIiwic2lnbmVyUG9zIiwic2lnbmVyc2RhdGEiLCJpc01haWxTZW5kIiwiYWxlcnRTZW5kRW1haWwiLCJpc0NvbXBsZXRlZCIsImlzU2hvd0hlYWRlciIsImRlY2xpbmUiLCJjdXJyZW50U2lnbmVyIiwiYWxyZWFkeVNpZ24iLCJpc1NpZ25Zb3Vyc2VsZiIsInNldElzRW1haWwiLCJjb21wbGV0ZUJ0blRpdGxlIiwic2V0SXNFZGl0VGVtcGxhdGUiLCJpc1B1YmxpY1RlbXBsYXRlIiwiY2xpY2tPblpvb21JbiIsImNsaWNrT25ab29tT3V0IiwiaGFuZGxlUm90YXRpb25GdW4iLCJpc0Rpc2FibGVSb3RhdGUiLCJ0ZW1wbGF0ZUlkIiwic2V0SXNEb3dubG9hZE1vZGFsIiwiZmlsdGVyUHJlZmlsbCIsImZpbHRlciIsImRhdGEiLCJSb2xlIiwiaXNNb2JpbGUiLCJ3aW5kb3ciLCJpbm5lcldpZHRoIiwiaXNEb3dubG9hZGluZyIsInNldElzRG93bmxvYWRpbmciLCJpc0d1ZXN0U2lnbmVyIiwiaGFuZGxlRGVjbGluZVBkZkFsZXJ0IiwiY3VycmVudERlY2xpbmUiLCJjdXJybnQiLCJpc0RlY2xpbmVkIiwiaWQiLCJzdHlsZSIsIndpZHRoIiwiaGlzdG9yeSIsImdvIiwiUm9vdCIsIlRyaWdnZXIiLCJhc0NoaWxkIiwiUG9ydGFsIiwiQ29udGVudCIsInNpZGVPZmZzZXQiLCJJdGVtIiwiZSIsIkZyYWdtZW50IiwiZGlzYWJsZWQiLCJpc09wZW4iLCJoYW5kbGVDbG9zZSIsIlBkZlpvb20iLCJwcm9wcyIsImN1cnNvciIsInpvb21QZXJjZW50IiwidXNlRWZmZWN0IiwiUGxhY2Vob2xkZXJCb3JkZXIiLCJSbmQiLCJkZWZhdWx0V2lkdGhIZWlnaHQiLCJmb250Q29sb3JBcnIiLCJmb250c2l6ZUFyciIsImdldENvbnRhaW5lclNjYWxlIiwiaGFuZGxlQ29weU5leHRUb1dpZGdldCIsImlzVGFiQW5kTW9iaWxlIiwib25DaGFuZ2VJbnB1dCIsInJhZGlvQnV0dG9uV2lkZ2V0IiwidGV4dElucHV0V2lkZ2V0IiwidGV4dFdpZGdldCIsIlBsYWNlaG9sZGVyVHlwZSIsIm1vbWVudCIsInNlbGVjdEZvcm1hdCIsImNoYW5nZURhdGVUb01vbWVudEZvcm1hdCIsImZvcm1hdCIsImdldERlZmF1bHRkYXRlIiwic2VsZWN0ZWREYXRlIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZGF0ZSIsIm5ld2RhdGUiLCJEYXRlIiwiZGF5IiwibW9udGgiLCJ5ZWFyIiwic3BsaXQiLCJ2YWx1ZSIsImdldERlZmF1bHRGb3JtYXQiLCJkYXRlRm9ybWF0IiwiUGxhY2Vob2xkZXIiLCJwbGFjZWhvbGRlckJvcmRlciIsInNldFBsYWNlaG9sZGVyQm9yZGVyIiwidyIsImgiLCJpc0RyYWdnaW5nRW5hYmxlZCIsInNldERyYWdnaW5nRW5hYmxlZCIsImlzRGF0ZU1vZGFsIiwic2V0SXNEYXRlTW9kYWwiLCJjb250YWluZXJTY2FsZSIsInNldENvbnRhaW5lclNjYWxlIiwic2VsZWN0RGF0ZSIsInNldFNlbGVjdERhdGUiLCJwb3MiLCJvcHRpb25zIiwicmVzcG9uc2UiLCJ2YWxpZGF0aW9uIiwiZ2V0VGltZSIsInNldERhdGVGb3JtYXQiLCJjbGlja29uV2lkZ2V0Iiwic2V0Q2xpY2tvbldpZGdldCIsInN0YXJ0RGF0ZSIsInNldFN0YXJ0RGF0ZSIsImdldENoZWNrYm94UmVuZGVyV2lkdGgiLCJzZXRHZXRDaGVja2JveFJlbmRlcldpZHRoIiwiaGVpZ2h0IiwiZ2V0UGRmUGFnZVdpZHRoIiwicGRmT3JpZ2luYWxXSCIsImZpbmQiLCJjb250YWluZXJXSCIsImRhdGVGb3JtYXRBcnIiLCJ1cGRhdGVXaWR0aCIsInJuZEVsZW1lbnQiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwia2V5IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidGltZXIiLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwiY2xvc2VNZW51T25PdXRzaWRlQ2xpY2siLCJ0YXJnZXQiLCJjbG9zZXN0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJjaGFuZ2VEYXRlRm9ybWF0IiwidXBkYXRlRGF0ZSIsIm1hcCIsIm1pbGxpc2Vjb25kcyIsIm5ld0RhdGUiLCJkYXRlT2JqIiwicHVzaCIsImhhbmRsZVdpZGdldElkYW5kUG9wdXAiLCJzZXRTZWxlY3RXaWRnZXRJZCIsIndpZGdldFR5cGVFeGlzdCIsImluY2x1ZGVzIiwiaXNOZWVkU2lnbiIsImlzRHJhZ2dpbmciLCJpc3B1YmxpY1RlbXBsYXRlIiwiaGFuZGxlVXNlckRldGFpbHMiLCJzZXRJc1NpZ25QYWQiLCJzZXRTaWduS2V5Iiwic2V0SXNTdGFtcCIsImlzU3RhbXAiLCJzZXRJc0luaXRpYWwiLCJzZWxlY3RXaWRnZXRJZCIsImhhbmRsZUxpbmtVc2VyIiwiSWQiLCJzZXRVbmlxdWVJZCIsImNoZWNrSW5kZXgiLCJmaW5kSW5kZXgiLCJzZXRJc1NlbGVjdElkIiwic2lnbmVyT2JqSWQiLCJoYW5kbGVPbkNsaWNrUGxhY2Vob2xkZXIiLCJzZXRDdXJyV2lkZ2V0c0RldGFpbHMiLCJzZXRXaWRnZXRUeXBlIiwidW5pcXVlSWQiLCJoYW5kbGVPbkNsaWNrU2V0dGluZ0ljb24iLCJzZXRJc1JhZGlvIiwic2V0U2hvd0Ryb3Bkb3duIiwic2V0SXNDaGVja2JveCIsImhhbmRsZVRleHRTZXR0aW5nTW9kYWwiLCJoYW5kbGVOYW1lTW9kYWwiLCJzZXRUZW1wU2lnbmVySWQiLCJoYW5kbGVDb3B5UGxhY2Vob2xkZXIiLCJzdG9wUHJvcGFnYXRpb24iLCJzZXRJc1BhZ2VDb3B5IiwiaW5kZXgiLCJzZXRYeVBvc3Rpb24iLCJoYW5kbGVTYXZlRGF0ZSIsImlzRGF0ZUNoYW5nZSIsImZvbnRTaXplIiwiZm9udENvbG9yIiwiUGxhY2Vob2xkZXJJY29uIiwiaXNTaG93Qm9yZGVyIiwib25Ub3VjaEVuZCIsImNvbG9yIiwiekluZGV4IiwiaGFuZGxlRGVsZXRlU2lnbiIsInhQb3MiLCJzaWduWW91cnNlbGYiLCJyZXNpemVQb3MiLCJ4UG9zaXRpb24iLCJzY2FsZSIsInlQb3MiLCJ5UG9zaXRpb24iLCJnZXRDdXJzb3IiLCJ1blNpZ25lZFdpZGdldElkIiwibG9ja0FzcGVjdFJhdGlvIiwiV2lkdGgiLCJIZWlnaHQiLCJlbmFibGVSZXNpemluZyIsImJvdHRvbSIsImxlZnQiLCJ0b3BSaWdodCIsImJvdHRvbVJpZ2h0IiwiYm90dG9tTGVmdCIsInRvcExlZnQiLCJib3VuZHMiLCJib3JkZXIiLCJib3JkZXJSYWRpdXMiLCJ0ZXh0QWxpZ24iLCJiYWNrZ3JvdW5kIiwiYmxvY2tDb2xvciIsIm9uRHJhZyIsImhhbmRsZVRhYkRyYWciLCJzaXplIiwicG9zV2lkdGgiLCJwb3NIZWlnaHQiLCJvblJlc2l6ZVN0YXJ0Iiwic2V0SXNSZXNpemUiLCJvblJlc2l6ZVN0b3AiLCJkaXJlY3Rpb24iLCJyZWYiLCJoYW5kbGVTaWduWW91cnNlbGZJbWFnZVJlc2l6ZSIsImlzUmVzaXplIiwiZGlzYWJsZURyYWdnaW5nIiwib25EcmFnU3RvcCIsImV2ZW50IiwiZHJhZ0VsZW1lbnQiLCJoYW5kbGVTdG9wIiwicG9zaXRpb24iLCJ4IiwieSIsIm9uUmVzaXplIiwib2Zmc2V0V2lkdGgiLCJvZmZzZXRIZWlnaHQiLCJpc1Nob3dEcm9wZG93biIsImhhbmRsZVVzZXJOYW1lIiwic2V0VmFsaWRhdGVBbGVydCIsInNob3dDbG9zZSIsImRlZmF1bHRWYWx1ZSIsIm9uQ2hhbmdlIiwic2VsZWN0ZWRJbmRleCIsImluZCIsInNldEZvbnRTaXplIiwic2V0Rm9udENvbG9yIiwidGhlbWVDb2xvciIsInJlc2l6ZUJvcmRlckV4dHJhV2lkdGgiLCJnZXRSZXNpemVCb3JkZXJFeHRyYVdpZHRoIiwiZGVmYXVsdFdpZHRoIiwiZGVmYXVsdEhlaWdodCIsImdldFdpZHRoIiwiZ2V0SGVpZ2h0IiwiaGFuZGxlTWluV2lkdGgiLCJoYW5kbGVNaW5IZWlnaHQiLCJvbk1vdXNlRW50ZXIiLCJib3JkZXJDb2xvciIsIm1pbldpZHRoIiwibWluSGVpZ2h0IiwiZm9yd2FyZFJlZiIsInVzZVJlZiIsImdldE1vbnRoIiwiZ2V0WWVhciIsIm9uQ2hhbmdlSGVpZ2h0T2ZUZXh0QXJlYSIsInJhbmdlIiwiRGF0ZVBpY2tlciIsIlJlZ2V4UGFyc2VyIiwiZW1haWxSZWdleCIsInRleHRXaWRnZXRDbHMiLCJzZWxlY3RXaWRnZXRDbHMiLCJ3aWRnZXRUeXBlVHJhc2xhdGlvbiIsInNlbGVjdE9wdGlvbiIsInNldFNlbGVjdE9wdGlvbiIsInZhbGlkYXRlUGxhY2Vob2xkZXIiLCJzZXRWYWxpZGF0ZVBsYWNlaG9sZGVyIiwiaW5wdXRSZWYiLCJ0ZXh0VmFsdWUiLCJzZXRUZXh0VmFsdWUiLCJzZWxlY3RlZENoZWNrYm94Iiwic2V0U2VsZWN0ZWRDaGVja2JveCIsInllYXJzIiwibW9udGhzIiwidmFsaWRhdGVFeHByZXNzaW9uIiwicmVnZXhWYWxpZGF0aW9uIiwicmVnZXhPYmplY3QiLCJpc1ZhbGlkYXRlIiwidGVzdCIsImN1cnJlbnQiLCJmb2N1cyIsImhhbmRsZUlucHV0Qmx1ciIsInZhbGlkYXRlVHlwZSIsInBhdHRlcm4iLCJoYW5kbGVUZXh0VmFsaWQiLCJ0ZXh0SW5wdXQiLCJjaGVja1JlZ3VsYXJFeHByZXNzIiwiaXNEZWZhdWx0VmFsdWUiLCJoaW50IiwiZGVmYXVsdERhdGEiLCJFeGFtcGxlQ3VzdG9tSW5wdXQiLCJmb250RmFtaWx5IiwiZGlzcGxheU5hbWUiLCJpc0RlZmF1bHQiLCJzZW5kZXJVc2VyIiwianNvblNlbmRlciIsIkpTT04iLCJwYXJzZSIsInNlbGVjdENoZWNrYm94IiwicmVzIiwiZGVmYXVsdENoZWNrIiwiaXNTZWxlY3RJbmRleCIsImluZGV4T2YiLCJoYW5kbGVSYWRpb0NoZWNrIiwiaGFuZGxlQ2hlY2tib3hWYWx1ZSIsImlzQ2hlY2tlZCIsInVwZGF0ZVNlbGVjdGVkQ2hlY2tib3giLCJjaGVja2VkTGlzdCIsImlzRGVmYXVsdEVtcHR5IiwiaGFuZGxlQ2hlY2tSYWRpbyIsImlzUmFkaW8iLCJoYW5kbGVPbkRhdGVDaGFuZ2UiLCJoYW5kbGVFbnRlclByZXNzIiwiU2lnblVybCIsImRyYWdnYWJsZSIsInZhbHVlcyIsIm9uQmx1ciIsImlzUmVhZE9ubHkiLCJjaGVja2VkIiwibWF4UmVxdWlyZWQiLCJtYXhSZXF1aXJlZENvdW50IiwibWF4Q291bnRJbnQiLCJwYXJzZUludCIsImlzSGlkZUxhYmVsIiwicGxhY2Vob2xkZXIiLCJyb3dzIiwib25LZXlEb3duIiwiY29scyIsIm92ZXJmbG93IiwiaGlkZGVuIiwicmVuZGVyQ3VzdG9tSGVhZGVyIiwiX3JlZjIiLCJjaGFuZ2VZZWFyIiwiY2hhbmdlTW9udGgiLCJfcmVmMyIsIm9wdGlvbiIsIl9yZWY0IiwiY2xvc2VPblNjcm9sbCIsInNlbGVjdGVkIiwicG9wcGVyUGxhY2VtZW50IiwiY3VzdG9tSW5wdXQiLCJtYXJnaW5Ub3AiLCJwcmV2aW91c1BhZ2UiLCJuZXh0UGFnZSIsIkRvY3VtZW50IiwiUGFnZSIsInVzZVNlbGVjdG9yIiwiUmVuZGVyQWxsUGRmUGFnZSIsInNpZ25QZGZVcmwiLCJzZXRBbGxQYWdlcyIsInNldFBhZ2VOdW1iZXIiLCJzZXRTaWduQnRuUG9zaXRpb24iLCJzaWduZXJPYmplY3RJZCIsInBkZlJvdGF0ZUJhc2U2NCIsInNpZ25QYWdlTnVtYmVyIiwic2V0U2lnblBhZ2VOdW1iZXIiLCJib29rbWFya0NvbG9yIiwic2V0Qm9va21hcmtDb2xvciIsIm9uRG9jdW1lbnRMb2FkIiwibnVtUGFnZXMiLCJjaGVja1VzZXIiLCJwYWdlTnVtYmVyQXJyIiwicGxhY2VIb2xkZXIiLCJwYWdlQ29udGFpbmVyIiwiaXNIZWFkZXIiLCJzdGF0ZSIsInNob3dIZWFkZXIiLCJwYWdlV2lkdGgiLCJzZXRQYWdlV2lkdGgiLCJ1cGRhdGVTaXplIiwiYWRkU2lnbmF0dXJlQm9va21hcmsiLCJpc3BhZ2VOdW1iZXIiLCJwZGZEYXRhQmFzZTY0IiwibG9hZGluZyIsIm9uTG9hZFN1Y2Nlc3MiLCJmaWxlIiwiQXJyYXkiLCJmcm9tIiwiZWwiLCJyZW5kZXJBbm5vdGF0aW9uTGF5ZXIiLCJyZW5kZXJUZXh0TGF5ZXIiLCJSU0MiLCJoYW5kbGVJbWFnZVJlc2l6ZSIsIkFsZXJ0IiwiUmVuZGVyUGRmIiwiZHJvcCIsInN1Y2Nlc3NFbWFpbCIsInBhZ2VEZXRhaWxzIiwicGRmUmVxdWVzdCIsInNpZ25lZFNpZ25lcnMiLCJwZGZMb2FkIiwic2V0UGRmTG9hZCIsInNldFNpZ25lclBvcyIsInNldElzVmFsaWRhdGUiLCJJc1Jlc2l6ZSIsImNoZWNrU2lnbmVkU2lnbmVycyIsImNoZWNrU2lnbiIsInNpZ24iLCJvYmplY3RJZCIsImhhbmRsZUFsbFVzZXJOYW1lIiwiU2lnbmVycyIsInNpZ25lciIsIk5hbWUiLCJwbGFjZURhdGEiLCJib3hTaGFkb3ciLCJpbm5lckhlaWdodCIsIm5vU2Nyb2xsWSIsIm5vU2Nyb2xsWCIsIklzQ29tcGxldGVkIiwib25Mb2FkRXJyb3IiLCJTaWduZWRVcmwiLCJVUkwiLCJvbkdldEFubm90YXRpb25zRXJyb3IiLCJlcnJvciIsImNvbnNvbGUiLCJsb2ciLCJTaWduYXR1cmVDYW52YXMiLCJTaWduUGFkIiwiaXNTaWduUGFkIiwic2V0SXNJbWFnZVNlbGVjdCIsIm9uU2F2ZVNpZ24iLCJzZXRJbWFnZSIsImlzSW1hZ2VTZWxlY3QiLCJpbWFnZVJlZiIsIm9uSW1hZ2VDaGFuZ2UiLCJvblNhdmVJbWFnZSIsImltYWdlIiwiZGVmYXVsdFNpZ24iLCJzZXRTaWduYXR1cmUiLCJteUluaXRpYWwiLCJpc0luaXRpYWwiLCJ3aWRnZXRUeXBlIiwiY3VycldpZGdldHNEZXRhaWxzIiwicGVuQ29sb3IiLCJzZXRQZW5Db2xvciIsImFsbENvbG9yIiwiY2FudmFzUmVmIiwiaXNEZWZhdWx0U2lnbiIsInNldElzRGVmYXVsdFNpZ24iLCJpc1RhYiIsInNldElzVGFiIiwiaXNTaWduSW1nIiwic2V0SXNTaWduSW1nIiwic2lnblZhbHVlIiwic2V0U2lnblZhbHVlIiwidGV4dFdpZHRoIiwic2V0VGV4dFdpZHRoIiwidGV4dEhlaWdodCIsInNldFRleHRIZWlnaHQiLCJzaWduYXR1cmVUeXBlIiwic2V0U2lnbmF0dXJlVHlwZSIsImZvbnRPcHRpb25zIiwiZm9udFNlbGVjdCIsInNldEZvbnRTZWxlY3QiLCJjdXJyZW50VXNlck5hbWUiLCJoYW5kbGVDbGVhciIsImNsZWFyIiwiaGFuZGxlU2lnbmF0dXJlQ2hhbmdlIiwiU2F2ZUJ0biIsImlzV2lkZ2V0VHlwZSIsInVybCIsImZyb21EYXRhVVJMIiwidHJpbW1lZE5hbWUiLCJ0cmltIiwiZmlyc3RDaGFyYWN0ZXIiLCJjaGFyQXQiLCJ1c2VyTmFtZSIsImxvYWRGb250IiwiZm9udHMiLCJsb2FkIiwic2VsZWN0Rm9udFNUeWxlIiwiZm9udCIsImNvbnZlcnRUb0ltZyIsImZvbnRTdHlsZSIsInRleHQiLCJ0ZXh0Q29udGVudCIsImZvbnRmYW1pbHkiLCJmb250U2l6ZVZhbHVlIiwic3BhbiIsImRpc3BsYXkiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjYW52YXNFbGVtZW50IiwiY3R4IiwiZ2V0Q29udGV4dCIsInBpeGVsUmF0aW8iLCJkZXZpY2VQaXhlbFJhdGlvIiwiYWRkRXh0cmFXaWR0aCIsImZpbGxTdHlsZSIsInRleHRCYXNlbGluZSIsImZpbGxUZXh0IiwicmVtb3ZlQ2hpbGQiLCJkYXRhVXJsIiwidG9EYXRhVVJMIiwiUGVuQ29sb3JDb21wb25lbnQiLCJtYXJnaW4iLCJib3JkZXJCb3R0b20iLCJmbGV4RGlyZWN0aW9uIiwianVzdGlmeUNvbnRlbnQiLCJhbGlnbkl0ZW1zIiwibWFyZ2luQm90dG9tIiwiY2xpY2siLCJhY2NlcHQiLCJtYXhMZW5ndGgiLCJiYWNrZ3JvdW5kQ29sb3IiLCJwYWRkaW5nIiwiY2FudmFzUHJvcHMiLCJvbkVuZCIsImRvdFNpemUiLCJkYXJrZW5Db2xvciIsImdldEZpcnN0TGV0dGVyIiwiU2lnbmVyTGlzdENvbXBvbmVudCIsImNoZWNrU2lnbmVyQmFja0NvbG9yIiwib2JqIiwiY2hlY2tVc2VyTmFtZUNvbG9yIiwiZ2V0QmFja0NvbG9yIiwiZW1haWwiLCJFbWFpbCIsIlZlcmlmeUVtYWlsIiwiaXNWZXJpZnlNb2RhbCIsIm9uU3VibWl0Iiwic2V0SXNWZXJpZnlNb2RhbCIsImhhbmRsZVZlcmlmeUVtYWlsIiwib25JbnZhbGlkIiwic2V0Q3VzdG9tVmFsaWRpdHkiLCJvbklucHV0IiwicmVxdWlyZWQiLCJvdHAiLCJzZXRPdHAiLCJoYW5kbGVSZXNlbmQiLCJvdHBMb2FkZXIiLCJoYW5kbGVWZXJpZnlCdG4iLCJheGlvcyIsIlBERkRvY3VtZW50IiwicmdiIiwiZGVncmVlcyIsIlBhcnNlIiwiYXBwSW5mbyIsInNhdmVBcyIsInByaW50TW9kdWxlIiwidmFsaWRwbGFuIiwiZm9udGtpdCIsImZpbGVhc2J5dGVzIiwiZmlsZXBhdGgiLCJmZXRjaCIsImFycmF5QnVmZmVyIiwiVWludDhBcnJheSIsIm9wZW5Jbk5ld1RhYiIsIm9wZW4iLCJmZXRjaFN1YnNjcmlwdGlvbiIsImV4dFVzZXJJZCIsImNvbnRhY3RPYmpJZCIsImlzR3Vlc3RTaWduIiwiRXh0YW5kX0NsYXNzIiwiZXh0Q2xhc3MiLCJleHRVc2VyIiwiYmFzZVVSTCIsImhlYWRlcnMiLCJzZXNzaW9uVG9rZW4iLCJwYXJhbXMiLCJjb250YWN0SWQiLCJ0ZW5hdFJlcyIsInBvc3QiLCJwbGFuIiwic3RhdHVzIiwiYmlsbGluZ0RhdGUiLCJhZG1pbklkIiwicmVzdWx0IiwiaXNTdWJzY3JpYmVkIiwiUGxhbkNvZGUiLCJOZXh0X2JpbGxpbmdfZGF0ZSIsImlzbyIsImFsbG93ZWRVc2VycyIsIkFsbG93ZWRVc2VycyIsIkV4dFVzZXJQdHIiLCJzZXRJdGVtIiwiZXJyIiwiZmV0Y2hTdWJzY3JpcHRpb25JbmZvIiwicHJpY2UiLCJTdWJzY3JpcHRpb25EZXRhaWxzIiwic3Vic2NyaXB0aW9uIiwidG90YWxQcmljZSIsImFtb3VudCIsInBsYW5JZCIsInN1YnNjcmlwdGlvbl9pZCIsInBsYW5fY29kZSIsInRvdGFsQWxsb3dlZFVzZXIiLCJjaGVja0lzU3Vic2NyaWJlZCIsImlzVmFsaWQiLCJuYW1lQ29sb3IiLCJ0b0RhdGFVcmwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwib25sb2FkZW5kIiwiZ2V0RHJpdmUiLCJkb2N1bWVudElkIiwic2tpcCIsImxpbWl0IiwiZG9jSWQiLCJkcml2ZURlYXRpbHMiLCJzZXNzaW9udG9rZW4iLCJ0aGVuIiwiTGlzdGRhdGEiLCJqc29uIiwiY2F0Y2giLCJwZGZOZXdXaWR0aEZ1biIsImRpdlJlZiIsInBkZldpZHRoIiwiY29udHJhY3RVc2VycyIsInVzZXJEZXRhaWxzIiwiQ2xvdWQiLCJydW4iLCJzdHJpbmdpZnkiLCJzaWduZXJJZCIsInNob3dSZXNpemUiLCJmaWx0ZXJTaWduZXJQb3MiLCJnZXRQbGFjZUhvbGRlciIsImdldFBhZ2VOdW1lciIsImdldFhZZGF0YSIsImdldFBvc0RhdGEiLCJhZGRTaWduUG9zIiwibmV3VXBkYXRlU2lnblBvcyIsIm5ld1VwZGF0ZVNpZ25lciIsIndpZGdldHMiLCJpY29uIiwiaWNvblNpemUiLCJnZXREYXRlIiwiYWRkV2lkZ2V0T3B0aW9ucyIsImRlZmF1bHRPcHQiLCJnZXRXaWRnZXRUeXBlIiwiaXRlbSIsIndpZGdldE5hbWUiLCJnZXRCYXNlNjRGcm9tVXJsIiwiYXV0b3NpZ24iLCJibG9iIiwicGRmQmFzZSIsInN1ZmZpeGJhc2U2NCIsInBvcCIsImdldEJhc2U2NEZyb21JTUciLCJjb252ZXJ0UE5HdG9KUEVHIiwiYmFzZTY0RGF0YSIsInJlamVjdCIsImNhbnZhcyIsImltZyIsIkltYWdlIiwib25sb2FkIiwiZmlsbFJlY3QiLCJkcmF3SW1hZ2UiLCJqcGVnQmFzZTY0RGF0YSIsIm9uZXJyb3IiLCJhZGRTaWduIiwibmV3VXBkYXRlVXJsIiwic2lnblBkZkZ1biIsImJhc2U2NFVybCIsImFjdGl2ZU1haWxBZGFwdGVyIiwiaXNDdXN0b21Db21wbGV0aW9uTWFpbCIsInRlbmFudERldGFpbHMiLCJnZXRUZW5hbnREZXRhaWxzIiwibWVzc2FnZSIsIkNvbXBsZXRpb25Cb2R5IiwiQ29tcGxldGlvblN1YmplY3QiLCJnZXRTaWduYXR1cmUiLCJ0eXBlRXhpc3QiLCJzb21lIiwiYmFzZTY0U2lnbiIsImlzVXJsIiwiZmV0Y2hJbWFnZUJhc2U2NCIsImdldE5ld3NlNjQiLCJjaGFuZ2VJbWFnZVdIIiwibWFpbFByb3ZpZGVyIiwicGRmRmlsZSIsInVzZXJJZCIsInNpZ25hdHVyZSIsInJlc1NpZ25QZGYiLCJzaWduZWRQZGYiLCJyYW5kb21JZCIsInJhbmRvbUJ5dGVzIiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwiVWludDE2QXJyYXkiLCJyYW5kb21WYWx1ZSIsInJhbmRvbURpZ2l0IiwiY3JlYXRlRG9jdW1lbnQiLCJ0ZW1wbGF0ZSIsInBsYWNlaG9sZGVycyIsInNpZ25lckRhdGEiLCJEb2MiLCJwbGFjZWhvbGRlcnNBcnIiLCJzaWduZXJzIiwiZm9yRWFjaCIsIl9fdHlwZSIsIlNlbnRUb090aGVycyIsIkRlc2NyaXB0aW9uIiwiTm90ZSIsIlBsYWNlaG9sZGVycyIsIkNyZWF0ZWRCeSIsIlNlbmRpbk9yZGVyIiwiQXV0b21hdGljUmVtaW5kZXJzIiwiUmVtaW5kT25jZUluRXZlcnkiLCJJc0VuYWJsZU9UUCIsImZpcnN0TGV0dGVyIiwiZmFjdG9yIiwiaGV4IiwicmVwbGFjZSIsInIiLCJzdWJzdHJpbmciLCJnIiwiYiIsImRhcmtlclIiLCJNYXRoIiwiZmxvb3IiLCJkYXJrZXJHIiwiZGFya2VyQiIsInRvU3RyaW5nIiwicGFkU3RhcnQiLCJhZGRaSW5kZXgiLCJzZXRaSW5kZXgiLCJzaWduS2V5IiwiaW5pdGlhbCIsImlzU2lnbmVycyIsInNpZ25lclB0ciIsInh5RGF0YSIsImFkZEluaXRpYWxEYXRhIiwidXBkYXRlUG9zaXRpb24iLCJwb3NpdGlvbkRhdGEiLCJ1cGRhdGVQbGFjZWhvbGRlciIsImNhbGN1bGF0ZUluaXRpYWxXaWR0aEhlaWdodCIsIndpZGdldERhdGEiLCJpbnRpYWxUZXh0Iiwid2lkZ2V0RGF0YVZhbHVlIiwiQ29tcGFueSIsIkpvYlRpdGxlIiwiZW1iZWREb2NJZCIsInBkZkRvYyIsImZvbnRCeXRlcyIsInJlZ2lzdGVyRm9udGtpdCIsImVtYmVkRm9udCIsInN1YnNldCIsImkiLCJwYWdlcyIsImdldFBhZ2VzIiwicGFnZSIsImdldE9iaiIsImNvbXBlbnNhdGVSb3RhdGlvbiIsImdldFJvdGF0aW9uIiwiYW5nbGUiLCJnZXRTaXplIiwiZHJhd1RleHQiLCJzaWduYXR1cmVJbWciLCJpbWdXSCIsImlzVHlwZVRleHQiLCJnZXRJTUdXSCIsInVwZGF0ZVhZRGF0YSIsImNhbGN1bGF0ZUltZ0FzcGVjdFJhdGlvIiwibmV3V2lkdGgiLCJuZXdIZWlnaHQiLCJ1cGRhdGVYWXBvc2l0aW9uIiwicGxhY2Vob2xkZXJIZWlnaHQiLCJhc3BlY3RSYXRpbyIsImdldFhZRGF0YSIsIkltYWdlVHlwZSIsImltZ1R5cGUiLCJvbkltYWdlU2VsZWN0Iiwic2V0SW1nV0giLCJpbWFnZVR5cGUiLCJmaWxlcyIsImltZ1IiLCJpbWFnZVVybCIsImJhc2U2NGRhdGEiLCJFcnJvciIsImJhc2U2NEltYWdlIiwicmVzaXplZEJhc2U2NCIsImNhbGN1bGF0ZUZvbnRTaXplIiwic2lnbnlvdXJzZWxmIiwiZ2V0V2lkZ2V0c0ZvbnRDb2xvciIsIm11bHRpU2lnbkVtYmVkIiwidXBkYXRlSXRlbSIsInBhZ2VObyIsIndpZGdldHNQb3NpdGlvbkFyciIsImZvcm0iLCJnZXRGb3JtIiwiaW1hZ2VzIiwiYWxsIiwic2lnblVybCIsIm5ld1VybCIsImVtYmVkSnBnIiwiZW1iZWRQbmciLCJ3aWRnZXRXaWR0aCIsIndpZGdldEhlaWdodCIsInBsYWNlaG9sZGVyV2lkdGgiLCJ1cGRhdGVDb2xvckluUmdiIiwiY2hlY2tib3hHYXBGcm9tVG9wIiwiaXNDaGVjayIsIm9wdGlvbnNGb250U2l6ZSIsImNoZWNrYm94U2l6ZSIsImNoZWNrYm94VGV4dEdhcEZyb21MZWZ0IiwiY2hlY2tib3hSYW5kb21JZCIsImNoZWNrYm94IiwiY3JlYXRlQ2hlY2tCb3giLCJvcHRpb25zUG9zaXRpb24iLCJjaGVja2JveE9iaiIsImdldFdpZGdldFBvc2l0aW9uIiwiYWRkVG9QYWdlIiwiY2hlY2siLCJ1bmNoZWNrIiwiZW5hYmxlUmVhZE9ubHkiLCJmaXhlZFdpZHRoIiwiaXNOZXdPbkVudGVyTGluZUV4aXN0IiwiTmV3YnJlYWtUZXh0SW50b0xpbmVzIiwibGluZXMiLCJjdXJyZW50TGluZSIsIndvcmQiLCJsaW5lV2lkdGgiLCJ3aWR0aE9mVGV4dEF0U2l6ZSIsImJyZWFrVGV4dEludG9MaW5lcyIsIm5ld0xpbmUiLCJsaW5lIiwidGV4dFBvc2l0aW9uIiwiZm9udHNpemUiLCJkcm9wZG93blJhbmRvbUlkIiwiZHJvcGRvd24iLCJjcmVhdGVEcm9wZG93biIsImFkZE9wdGlvbnMiLCJzZWxlY3QiLCJkZWZhdWx0QXBwZWFyYW5jZSIsImFjcm9GaWVsZCIsInNldERlZmF1bHRBcHBlYXJhbmNlIiwiZHJvcGRvd25PYmoiLCJkcm9wZG93bk9wdGlvbiIsImRyb3Bkb3duU2VsZWN0ZWQiLCJkZWZhdWx0VXBkYXRlQXBwZWFyYW5jZXMiLCJyYWRpb1JhbmRvbUlkIiwicmFkaW9Hcm91cCIsImNyZWF0ZVJhZGlvR3JvdXAiLCJyYWRpb09wdGlvbkdhcEZyb21Ub3AiLCJyYWRpb1RleHRHYXBGcm9tTGVmdCIsInJhZGlvU2l6ZSIsInJhZGlvT2JqIiwiYWRkT3B0aW9uVG9QYWdlIiwiaW1hZ2VPcHRpb25zIiwicGRmQnl0ZXMiLCJzYXZlQXNCYXNlNjQiLCJ1c2VPYmplY3RTdHJlYW1zIiwidXJsVmFsaWRhdG9yIiwicHJvdG9jb2wiLCJwb3NVcGRhdGVIZWlnaHQiLCJjb250YWN0Qm9vayIsImdldCIsInJlc3VsdHMiLCJjb250cmFjdERvY3VtZW50IiwiZG9jdW1lbnREZWF0aWxzIiwiYWRkRGVmYXVsdFNpZ25hdHVyZUltZyIsImNvbXBsZXRlIiwieHlEZWZhdWx0UG9zIiwiZ2V0UGFnZU5vIiwibmV3WHlwb3MiLCJzdGFydCIsImVuZCIsInN0ZXAiLCJuZXdNb250aCIsIm5ld1llYXIiLCJnZXRGdWxsWWVhciIsIm5ld3Bvc2l0aW9uIiwiY2FsY3VsYXRlWFBvc2l0aW9uIiwibmV3SWQiLCJnZXRGaWxlTmFtZSIsImZpbGVVcmwiLCJmaWxlbmFtZSIsInBhdGhuYW1lIiwiZ2V0QXBwTG9nbyIsImxvY2F0aW9uIiwiaG9zdCIsImxvZ28iLCJhcHBsb2dvIiwidXNlciIsImRvbWFpbiIsInRlbmFudCIsInRlbmFudENyZWRpdHNRdWVyeSIsIlF1ZXJ5IiwiZXF1YWxUbyIsImZpcnN0IiwidXBkYXRlUmVzIiwicmVwbGFjZU1haWxWYXJpYmxlcyIsInN1YmplY3QiLCJ2YXJpYWJsZXMiLCJyZXBsYWNlZFN1YmplY3QiLCJyZXBsYWNlZEJvZHkiLCJ2YXJpYWJsZSIsInJlZ2V4IiwiUmVnRXhwIiwiY29weXRvRGF0YSIsIm5hdmlnYXRvciIsImNsaXBib2FyZCIsIndyaXRlVGV4dCIsInRleHRBcmVhIiwiZXhlY0NvbW1hbmQiLCJjb252ZXJ0UGRmQXJyYXlCdWZmZXIiLCJvayIsImhhbmRsZVNlbmRPVFAiLCJhbGVydCIsImZldGNoVXJsIiwicGRmTmFtZSIsInNhbml0aXplRmlsZU5hbWUiLCJheGlvc1JlcyIsInByZXZlbnREZWZhdWx0IiwicGRmIiwiaXNBbmRyb2lkRGV2aWNlIiwidXNlckFnZW50IiwibWF0Y2giLCJpc0FwcGxlRGV2aWNlIiwicGxhdGZvcm0iLCJtYXhUb3VjaFBvaW50cyIsIk1TU3RyZWFtIiwiYnl0ZUFycmF5IiwiYXRvYiIsImNoYXIiLCJjaGFyQ29kZUF0IiwiQmxvYiIsImJsb2JVcmwiLCJjcmVhdGVPYmplY3RVUkwiLCJwcmludGFibGUiLCJiYXNlNjQiLCJpc1ppcCIsIkNlcnRpZmljYXRlVXJsIiwiY2VydGlmaWNhdGVVcmwiLCJkb2NEZXRhaWxzIiwiZG9jIiwiZmluZENvbnRhY3QiLCJjdXJyZW50VXNlciIsIlVzZXIiLCJjb250YWN0Ym9vayIsImNyZWF0ZVdpdGhvdXREYXRhIiwibm90RXF1YWxUbyIsIm1hdGNoZXMiLCJjb250YWN0UmVzIiwicGFnZVJvdGF0aW9uIiwiZGltZW5zaW9ucyIsInJvdGF0aW9uUmFkcyIsIlBJIiwiY29vcmRzRnJvbUJvdHRvbUxlZnQiLCJkcmF3WCIsImRyYXdZIiwiY29zIiwic2luIiwicm90YXRlIiwic2l6ZVJhdGlvIiwiaGFzT3duUHJvcGVydHkiLCJwYWdlUmF0aW8iLCJ2cFdpZHRoIiwiaW1hZ2VXaWR0aCIsImltYWdlSGVpZ2h0IiwiaW1hZ2VYIiwiaW1hZ2VZRnJvbVRvcCIsImNvcnJlY3Rpb24iLCJzYXZlTGFuZ3VhZ2VJbkxvY2FsIiwiaTE4biIsImRldGVjdGVkTGFuZ3VhZ2UiLCJsYW5ndWFnZSIsImdldERlZmF1bHRTaWduYXR1cmUiLCJxdWVyeSIsImRlZmF1bHRTaWduYXR1cmUiLCJJbWFnZVVSTCIsImRlZmF1bHRJbml0aWFsIiwiSW5pdGlhbHMiLCJyb3RhdGVQZGZQYWdlIiwicm90YXRlRGVncmVlIiwiYmFzZTY0VG9BcnJheUJ1ZmZlciIsImdldFBhZ2UiLCJjdXJyZW50Um90YXRpb24iLCJuZXdSb3RhdGlvbiIsInNldFJvdGF0aW9uIiwicGRmYmFzZTY0IiwiYmluYXJ5U3RyaW5nIiwibGVuIiwiYnl0ZXMiLCJidWZmZXIiLCJjb252ZXJ0QmFzZTY0VG9GaWxlIiwicGRmQmFzZTY0IiwiZmlsZU5hbWUiLCJGaWxlIiwicGRmRGF0YSIsInNhdmUiLCJvbkNsaWNrWm9vbUluIiwic2V0U2NhbGUiLCJzZXRab29tUGVyY2VudCIsIm9uQ2xpY2tab29tT3V0IiwiaGFuZGxlUmVtb3ZlV2lkZ2V0cyIsInNldElzUm90YXRlIiwidXBkYXRlZFNpZ25lclBvcyIsInBsYWNlaG9sZGVyT2JqIiwiZGVncmVlIiwiaGFuZGxlUm90YXRlV2FybmluZyIsInBsYWNlaG9sZGVyRXhpc3QiLCJpc0VuYWJsZVN1YnNjcmlwdGlvbiIsInNlcnZlclVybF9mbiIsImJhc2VVcmwiLCJwcm9jZXNzIiwiZW52IiwiUkVBQ1RfQVBQX1NFUlZFUlVSTCIsIm9yaWdpbiIsImFwcElkIiwiUkVBQ1RfQVBQX0FQUElEIiwiZGVmYXVsdFJvbGUiLCJmYkFwcElkIiwiUkVBQ1RfQVBQX0ZCQVBQSUQiLCJmZXZfSWNvbiIsImdvb2dsZUNsaWV0SWQiLCJSRUFDVF9BUFBfR09PR0xFQ0xJRU5USUQiLCJtZXRhRGVzY3JpcHRpb24iLCJzZXR0aW5ncyIsInJvbGUiLCJtZW51SWQiLCJwYWdlVHlwZSIsInBhZ2VJZCIsImV4dGVuZGVkX2NsYXNzIiwiY29udGFjdENscyIsInRlbXBsYXRlQ2xzIiwiZG9jdW1lbnRDbHMiLCJpY29uQ29sb3IiLCJSRUFDVF9BUFBfRU5BQkxFX1NVQlNDUklQVElPTiIsInRvTG93ZXJDYXNlIiwiaXNTdGFnaW5nIiwiaXNQdWJsaWNTdGFnaW5nIiwicGxhbnMiLCJwbGFuTmFtZSIsImNvZGUiLCJtb250aGx5IiwieWVhcmx5IiwiY3VycmVuY3kiLCJtb250aGx5UHJpY2UiLCJ5ZWFybHlQcmljZSIsInN1YnRpdGxlIiwiYnRuIiwiYmVuZWZpdHMiLCJ5ZWFybHlCZW5lZml0cyIsInllYXJseVVybCIsInBhaWRVcmwiLCJ0ZWFtcGVyaW9kIiwicGVyaW9kIiwiY29tcGFueSIsInBob25lIiwiUGhvbmUiLCJmdWxsbmFtZSIsImZpcnN0bmFtZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImxhc3RuYW1lIiwicXVhbnRpdHkiLCJkZXRhaWxzIiwicGxhbnVybCIsIkRuZFByb3ZpZGVyIiwiSFRNTDVCYWNrZW5kIiwiVG91ciIsIkNvbmZldHRpIiwiRG93bmxvYWRQZGZaaXAiLCJUb3VyQ29udGVudFdpdGhCdG4iLCJQZGZEZWNsaW5lTW9kYWwiLCJIYW5kbGVFcnJvciIsIkxvYWRlcldpdGhNc2ciLCJQZGZSZXF1ZXN0RmlsZXMiLCJzZXRQZGZEZXRhaWxzIiwic2V0U2lnbmVkU2lnbmVycyIsInVuc2lnbmVkU2lnbmVycyIsInNldFVuU2lnbmVkU2lnbmVycyIsInNldFBkZlVybCIsImhhbmRsZUVycm9yIiwic2V0SGFuZGxlRXJyb3IiLCJzZXRPdHBMb2FkZXIiLCJpc0NlbGVicmF0aW9uIiwic2V0SXNDZWxlYnJhdGlvbiIsInJlcXVlc3RTaWduVG91ciIsInNldFJlcXVlc3RTaWduVG91ciIsInRvdXJTdGF0dXMiLCJzZXRUb3VyU3RhdHVzIiwiaXNMb2FkaW5nIiwic2V0SXNMb2FkaW5nIiwiaXNMb2FkIiwic2V0RGVmYXVsdFNpZ25JbWciLCJpc0RvY0lkIiwic2V0SXNEb2NJZCIsInBkZk5ld1dpZHRoIiwic2V0UGRmTmV3V2lkdGgiLCJzZXRQZGZPcmlnaW5hbFdIIiwic2V0U2lnbmVyT2JqZWN0SWQiLCJpc1VpTG9hZGluZyIsInNldElzVWlMb2FkaW5nIiwiaXNEZWNsaW5lIiwic2V0Q3VycmVudFNpZ25lciIsImlzQWxlcnQiLCJzZXRJc0FsZXJ0Iiwic2V0VW5TaWduZWRXaWRnZXRJZCIsImV4cGlyZWREYXRlIiwic2V0RXhwaXJlZERhdGUiLCJzaWduZXJVc2VySWQiLCJzZXRTaWduZXJVc2VySWQiLCJpc0RvbnRTaG93Iiwic2V0SXNEb250U2hvdyIsImRlZmF1bHRTaWduQWxlcnQiLCJzZXRJc1N1YnNjcmliZWQiLCJzZXRJc0NvbXBsZXRlZCIsImlzQ2VydGlmaWNhdGUiLCJpc01vZGFsIiwic2V0TXlJbml0aWFsIiwiaXNTaWduZWQiLCJzZXRJc1NpZ25lZCIsImlzRXhwaXJlZCIsInNldElzRXhwaXJlZCIsInNldEFscmVhZHlTaWduIiwic2V0Q29udGFpbmVyV0giLCJ2YWxpZGF0ZUFsZXJ0Iiwid2lkZ2V0c1RvdXIiLCJzZXRXaWRnZXRzVG91ciIsIm1pblJlcXVpcmVkQ291bnQiLCJzZXRtaW5SZXF1aXJlZENvdW50Iiwic2VuZEluT3JkZXIiLCJzZXRTZW5kSW5PcmRlciIsImlzU3Vic2NyaXB0aW9uRXhwaXJlZCIsInNldElzU3Vic2NyaXB0aW9uRXhwaXJlZCIsInNldEV4dFVzZXJJZCIsImlzRW1haWxWZXJpZmllZCIsInNldElzRW1haWxWZXJpZmllZCIsImNvbnRyYWN0TmFtZSIsInNldENvbnRyYWN0TmFtZSIsInNldElzUHVibGljVGVtcGxhdGUiLCJjb250YWN0Iiwic2V0Q29udGFjdCIsImlzT3RwIiwic2V0SXNPdHAiLCJzZXRMb2FkaW5nIiwic2V0UmVzIiwic2V0RG9jdW1lbnRJZCIsImlzUHVibGljQ29udGFjdCIsInNldElzUHVibGljQ29udGFjdCIsInBkZkFycmF5QnVmZmVyIiwic2V0UGRmQXJyYXlCdWZmZXIiLCJwbGFuY29kZSIsInNldFBsYW5Db2RlIiwiaXNEb3dubG9hZE1vZGFsIiwiaXNHdWVzdFNpZ25GbG93Iiwic2VuZG1haWwiLCJnZXREb2NJZCIsImNvbnRhY3RCb29rSWQiLCJyb3V0ZSIsImdldFF1ZXJ5Iiwic2VhcmNoIiwicm91dGVJZCIsImdldERvY3VtZW50SWQiLCJnZXREb2N1bWVudERldGFpbHMiLCJnZXRUZW1wbGF0ZURldGFpbHMiLCJsb2NhbHVzZXIiLCJyZXNFbWFpbCIsImhhbmRsZU5hdmlnYXRpb24iLCJpc3B1YmxpYyIsInRlbXBsYXRlRGVhdGlscyIsImRvY3VtZW50RGF0YSIsInNldFRlbXBsYXRlU3RhdHVzIiwiSXNQdWJsaWMiLCJnZXRQdWJsaWNSb2xlIiwiUHVibGljUm9sZSIsImdldFVuaXF1ZUlkRGV0YWlscyIsInBsYWNlaG9sZGVyc09yU2lnbmVycyIsInNpZ25lcklkRXhpc3QiLCJnZXRTaWduZXJEYXRhIiwiaXNOZXh0VXNlciIsImN1cnJVc2VySWQiLCJleHBpcmVEYXRlIiwiRXhwaXJ5RGF0ZSIsImRlY2xpbmVkIiwiSXNEZWNsaW5lZCIsImV4cGlyZVVwZGF0ZURhdGUiLCJjdXJyRGF0ZSIsImdldFNpZ25lcnMiLCJnZXRDdXJyZW50U2lnbmVyIiwiVXNlcklkIiwiZXhwaXJlRGF0ZUZvcm1hdCIsImNoZWNrQ3VycmVudFVzZXIiLCJhdWRpdHRyYWlsRGF0YSIsIkF1ZGl0VHJhaWwiLCJBY3Rpdml0eSIsImNoZWNrQWxyZWFkeVNpZ24iLCJVc2VyUHRyIiwibm90ZSIsImRlc2NyaXB0aW9uIiwidmlld2VkQnkiLCJ2aWV3ZWRBdCIsImNyZWF0ZWRBdCIsInVuU2lnbmVkU2lnbmVyIiwiY2hlY2tFbWFpbCIsImVtYWlsT3JJZCIsImlzU2lnbmVkU2lnbmF0dXJlIiwic2lnbmVkRXhpc3QiLCJpc0VuYWJsZU9UUCIsInJlc0NvbnRhY3QiLCJ0b3VyRGF0YSIsIlRvdXJTdGF0dXMiLCJjaGVja1RvdXJSZXF1ZXN0IiwicmVxdWVzdFNpZ24iLCJkZWZhdWx0U2lnblJlcyIsImluaXRpYWxzIiwiZW1haWxWZXJpZmllZCIsInVzZXJRdWVyeSIsImdldFVzZXIiLCJjaGVja2JveEV4aXN0IiwicmVxdWlyZWRSYWRpbyIsInNob3dBbGVydCIsIndpZGdldEtleSIsInJhZGlvRXhpc3QiLCJyZXF1aXJlZENoZWNrYm94IiwiVG91clBhZ2VOdW1iZXIiLCJqIiwidXBkYXRlUGFnZSIsIm1pbkNvdW50IiwicGFyc2VNaW4iLCJtYXhDb3VudCIsInBhcnNlTWF4IiwiY2hlY2tTaWduZWQiLCJjaGVja0RlZmF1bHRTaWduZWQiLCJyZXF1aXJlZFdpZGdldHMiLCJjaGVja1NpZ25VcmwiLCJleGlzdGluZ1BkZkJ5dGVzIiwiaXNTaWduWW91clNlbGZGbG93IiwiZXh0VXNlclB0ciIsIkhlYWRlckRvY0lkIiwiYWN0aXZlX21haWxfYWRhcHRlciIsInJlc1NpZ24iLCJuZXdJbmRleCIsInVzZXJtYWlsIiwicmVxdWVzdEJvZHkiLCJSZXF1ZXN0Qm9keSIsInJlcXVlc3RTdWJqZWN0IiwiUmVxdWVzdFN1YmplY3QiLCJsb2NhbEV4cGlyZURhdGUiLCJ0b0xvY2FsZURhdGVTdHJpbmciLCJzZW5kZXJFbWFpbCIsInNlbmRlclBob25lIiwic2VuZGVyTmFtZSIsImltZ1BuZyIsImhvc3RVcmwiLCJlbmNvZGVCYXNlNjQiLCJidG9hIiwiaG9zdFB1YmxpY1VybCIsInNpZ25QZGYiLCJvcGVuU2lnblVybCIsIm9yZ05hbWUiLCJ0aGVtZUJHY29sb3IiLCJyZXBsYWNlVmFyIiwicmVwbGFjZWRSZXF1ZXN0Qm9keSIsImh0bWxSZXFCb2R5IiwiZG9jdW1lbnRfdGl0bGUiLCJzZW5kZXJfbmFtZSIsInNlbmRlcl9tYWlsIiwic2VuZGVyX3Bob25lIiwicmVjZWl2ZXJfbmFtZSIsInJlY2VpdmVyX2VtYWlsIiwicmVjZWl2ZXJfcGhvbmUiLCJleHBpcnlfZGF0ZSIsImNvbXBhbnlfbmFtZSIsInNpZ25pbmdfdXJsIiwicmVjaXBpZW50IiwiaHRtbCIsImNsb3NlVG91ciIsInRvdXJDb25maWciLCJzZWxlY3RvciIsInBkZldIT2JqIiwidG90YWxQYWdlcyIsImdldFZpZXdwb3J0Iiwib2Zmc2V0IiwicHJldlBhZ2VOdW1iZXIiLCJzYXZlSW1hZ2UiLCJnZXRJbmRleCIsIm9iamVjdCIsInBsYWNlaG9sZGVyUG9zaXRpb24iLCJnZXRVcGRhdGVQb3NpdGlvbiIsInNwbGljZSIsImluZGV4b2ZTaWduZXIiLCJwcmV2U3RhdGUiLCJuZXdTdGF0ZSIsInNhdmVTaWduIiwidXBkYXRlU2lnbmVyRGF0YSIsImRlY2xpbmVEb2MiLCJyZWFzb24iLCJkZWNsaW5lZEJ5IiwiZGVjbGluZWRSZWFzb24iLCJkZWNsaW5lZEF0IiwiYWRkRGVmYXVsdFNpZ25hdHVyZSIsImN1cnJlbnRTaWduZXJQb3NpdGlvbiIsInVwZGF0ZVBsYWNlIiwidXBkYXRlc2lnbmVyUG9zIiwiaGFuZGxlRG9udFNob3ciLCJjbG9zZVJlcXVlc3RTaWduVG91ciIsInVwZGF0ZWRUb3VyU3RhdHVzIiwicmVxdWVzdFNpZ25JbmRleCIsInB1dCIsInJlcXVlc3RTaWduVG91ckZ1bmN0aW9uIiwic2lnbmVkQnlTdGVwIiwic2lnbmVkQnkiLCJzbGljZSIsImRlZmF1bHRTaWduU3RlcCIsImRlZmF1bHRTaWduVG91ciIsInNoaWZ0Iiwib25SZXF1ZXN0Q2xvc2UiLCJzdGVwcyIsImNsb3NlV2l0aE1hc2siLCJyb3VuZGVkIiwiaGFuZGxlUHVibGljVXNlciIsInRlbXBsYXRlaWQiLCJ1c2VyUmVzIiwiU2VuZE90cCIsImhhbmRsZUlucHV0Q2hhbmdlIiwiT3RwIiwiVmVyaWZ5T1RQIiwic2VydmVyVXJsIiwicGFyc2VJZCIsIl91c2VyIiwiYmVjb21lIiwiY29udHJhY3RVc2VyRGV0YWlscyIsImhhbmRsZUNsb3NlT3RwIiwiaGFuZGxlRG93bmxvYWRCdG4iLCJoYW5kbGVEZWNsaW5lTXNzZyIsIkRlY2xpbmVCeSIsIkRlY2xpbmVSZWFzb24iLCJiYWNrZW5kIiwicG9pbnRlckV2ZW50cyIsInNob3dOdW1iZXIiLCJzaG93TmF2aWdhdGlvbiIsInNob3dOYXZpZ2F0aW9uTnVtYmVyIiwic2hvdyIsImhlYWRNc2ciLCJib2R5TXNzZyIsImZvb3Rlck1lc3NhZ2UiLCJpc0Rvd25sb2FkQnRuIiwicHJldiIsInJlZHVjZVdpZHRoIiwiaXNNZW51IiwidXNlck9iamVjdElkIiwiY2hpbGRyZW4iLCJ0ZXh0Y29sb3IiLCJ0aGVtZSIsImNyZWF0ZVNsaWNlIiwic2hvd1RlbmFudFNsaWNlIiwiaW5pdGlhbFN0YXRlIiwicmVkdWNlcnMiLCJzaG93VGVuYW50IiwiYWN0aW9uIiwicGF5bG9hZCIsImFjdGlvbnMiLCJyZWR1Y2VyIiwidG91clN0ZXBTbGljZSIsInNhdmVUb3VyU3RlcHMiLCJyZW1vdmVUb3VyU3RlcHMiLCJpbmZvU2xpY2UiLCJmZXRjaEFwcEluZm8iLCJyZW1vdmVJdGVtIiwic2hvd0hlYWRlclNsaWNlIiwiY29uZmlndXJlU3RvcmUiLCJpbmZvUmVkdWNlciIsIlNob3dUZW5hbnQiLCJUb3VyU3RlcHNSZWR1Y2VyIiwic3RvcmUiLCJUb3VyU3RlcHMiLCJpbml0UmVhY3RJMThuZXh0IiwiTGFuZ3VhZ2VEZXRlY3RvciIsImVuIiwiZnIiLCJ1c2UiLCJpbml0IiwicmVzb3VyY2VzIiwidHJhbnNsYXRpb24iLCJmYWxsYmFja0xuZyIsImRldGVjdGlvbiIsIm9yZGVyIiwiZGVidWciLCJpbnRlcnBvbGF0aW9uIiwiZXNjYXBlVmFsdWUiLCJ3aGl0ZWxpc3QiLCJSZWFjdERPTSIsInBkZmpzIiwiUHJvdmlkZXIiLCJHbG9iYWxXb3JrZXJPcHRpb25zIiwid29ya2VyU3JjIiwidmVyc2lvbiIsIlB1YmxpY1NjcmlwdEZpbGVXcmFwcGVyIiwiaW5pdGlhbFByb3BzIiwic2V0UHJvcHMiLCJ1cGRhdGVQdWJsaWNUZW1wbGF0ZVByb3BzIiwiaW5pdGlhbGl6ZSIsInNlcnZlclVSTCIsInNjcmlwdENvbXBvbmVudCIsImxpbmsiLCJoZWFkIiwidGFpbHdpbmRDc3NMaW5rIiwicm9vdCIsImNyZWF0ZVJvb3QiLCJyZW5kZXIiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/apps/OpenSign/src/components/pdf/EmailComponent.js b/apps/OpenSign/src/components/pdf/EmailComponent.js index c3b9f4b1a..e294f6375 100644 --- a/apps/OpenSign/src/components/pdf/EmailComponent.js +++ b/apps/OpenSign/src/components/pdf/EmailComponent.js @@ -165,9 +165,7 @@ function EmailComponent({ )} + )} diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index 3691a2e46..4cf7e0e4f 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -11,8 +11,6 @@ import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; import WidgetComponent from "../components/pdf/WidgetComponent"; import Tour from "reactour"; import { useLocation, useParams } from "react-router-dom"; -import LoaderWithMsg from "../primitives/LoaderWithMsg"; -import HandleError from "../primitives/HandleError"; import SignerListPlace from "../components/pdf/SignerListPlace"; import Header from "../components/pdf/PdfHeader"; import { RWebShare } from "react-web-share"; @@ -45,23 +43,27 @@ import { import RenderPdf from "../components/pdf/RenderPdf"; import { useNavigate } from "react-router-dom"; import PlaceholderCopy from "../components/pdf/PlaceholderCopy"; -import LinkUserModal from "../primitives/LinkUserModal"; import Title from "../components/Title"; -import TourContentWithBtn from "../primitives/TourContentWithBtn"; -import ModalUi from "../primitives/ModalUi"; import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption"; import WidgetNameModal from "../components/pdf/WidgetNameModal"; import { SaveFileSize } from "../constant/saveFileSize"; import { EmailBody } from "../components/pdf/EmailBody"; -import Upgrade from "../primitives/Upgrade"; -import Alert from "../primitives/Alert"; -import Loader from "../primitives/Loader"; import { useSelector } from "react-redux"; import PdfZoom from "../components/pdf/PdfZoom"; -import LottieWithLoader from "../primitives/DotLottieReact"; import { useTranslation } from "react-i18next"; import RotateAlert from "../components/RotateAlert"; -import QuotaCard from "../primitives/QuotaCard"; +import { + TourContentWithBtn, + ModalUi, + HandleError, + LoaderWithMsg, + LinkUserModal, + QuotaCard, + LottieWithLoader, + Alert, + Upgrade, + ModalUi +} from "../primitives"; function PlaceHolderSign() { const { t } = useTranslation(); diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index 8a64861be..b95113ddc 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -4,7 +4,6 @@ import "../styles/signature.css"; import Parse from "parse"; import Confetti from "react-confetti"; import axios from "axios"; -import LoaderWithMsg from "../primitives/LoaderWithMsg"; import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; import { DndProvider } from "react-dnd"; import { HTML5Backend } from "react-dnd-html5-backend"; @@ -42,21 +41,25 @@ import { import { useParams } from "react-router-dom"; import Tour from "reactour"; import Signedby from "../components/pdf/Signedby"; -import HandleError from "../primitives/HandleError"; import Header from "../components/pdf/PdfHeader"; import RenderPdf from "../components/pdf/RenderPdf"; import PlaceholderCopy from "../components/pdf/PlaceholderCopy"; -import TourContentWithBtn from "../primitives/TourContentWithBtn"; import Title from "../components/Title"; -import ModalUi from "../primitives/ModalUi"; import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption"; import { useSelector } from "react-redux"; import TextFontSetting from "../components/pdf/TextFontSetting"; import VerifyEmail from "../components/pdf/VerifyEmail"; import PdfZoom from "../components/pdf/PdfZoom"; -import Loader from "../primitives/Loader"; import { useTranslation } from "react-i18next"; import RotateAlert from "../components/RotateAlert"; +import { + DownloadPdfZip, + Loader, + ModalUi, + TourContentWithBtn, + HandleError, + LoaderWithMsg +} from "../primitives"; //For signYourself inProgress section signer can add sign and complete doc sign. function SignYourSelf() { const { t } = useTranslation(); @@ -130,6 +133,7 @@ function SignYourSelf() { const [pdfRotateBase64, setPdfRotatese64] = useState(""); const [isRotate, setIsRotate] = useState({ status: false, degree: 0 }); const [isSubscribe, setIsSubscribe] = useState({ plan: "", isValid: true }); + const [isDownloadModal, setIsDownloadModal] = useState(false); const divRef = useRef(null); const nodeRef = useRef(null); const [, drop] = useDrop({ @@ -1346,6 +1350,7 @@ function SignYourSelf() { clickOnZoomIn={clickOnZoomIn} clickOnZoomOut={clickOnZoomOut} widgetsDetails={xyPostion} + setIsDownloadModal={setIsDownloadModal} />
{containerWH?.width && containerWH?.height && ( @@ -1450,6 +1455,11 @@ function SignYourSelf() { setIsRotate={setIsRotate} handleRemoveWidgets={handleRemoveWidgets} /> + { const { t } = useTranslation(); const navigate = useNavigate(); diff --git a/apps/OpenSign/src/primitives/DownloadPdfZip.js b/apps/OpenSign/src/primitives/DownloadPdfZip.js new file mode 100644 index 000000000..0f7411677 --- /dev/null +++ b/apps/OpenSign/src/primitives/DownloadPdfZip.js @@ -0,0 +1,120 @@ +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import ModalUi from "./ModalUi"; +import { + handleDownloadCertificate, + handleDownloadPdf, + sanitizeFileName +} from "../constant/Utils"; +import Loader from "./Loader"; +import JSZip from "jszip"; +import { saveAs } from "file-saver"; + +function DownloadPdfZip(props) { + const { t } = useTranslation(); + const [selectType, setSelectType] = useState(1); + const [isDownloading, setIsDownloading] = useState(false); + const downloadType = [ + { id: 1, label: t("download-pdf") }, + { id: 2, label: t("pdf-certificate") } + ]; + + const handleDownload = async () => { + if (selectType === 1) { + handleDownloadPdf(props.pdfDetails, setIsDownloading); + } else if (selectType === 2) { + const zip = new JSZip(); + const pdfDetails = props.pdfDetails; + const pdfName = pdfDetails?.[0]?.Name || "Document"; + const pdfUrl = pdfDetails?.[0]?.SignedUrl || ""; + + try { + // Fetch the first PDF (Signed Document) + const pdf1Response = await fetch(pdfUrl); + if (!pdf1Response.ok) { + throw new Error(`Failed to fetch PDF: ${pdfUrl}`); + } + const pdf1Blob = await pdf1Response.blob(); + + // Fetch the Certificate (or generate its URL dynamically) + const certificateUrl = await handleDownloadCertificate( + pdfDetails, + setIsDownloading, + true + ); + const pdf2Response = await fetch(certificateUrl); + if (!pdf2Response.ok) { + throw new Error(`Failed to fetch certificate PDF: ${certificateUrl}`); + } + const pdf2Blob = await pdf2Response.blob(); + // Add files to ZIP + zip.file( + `${sanitizeFileName(pdfName)}_signed_by_OpenSign™.pdf`, + pdf1Blob + ); + zip.file("Certificate_signed_by_OpenSign™.pdf", pdf2Blob); + + // Generate the ZIP and trigger download + const zipBlob = await zip.generateAsync({ type: "blob" }); + saveAs(zipBlob, "pdf-files.zip"); + setSelectType(1); + props.setIsDownloadModal(false); + } catch (error) { + console.error("Error creating ZIP file:", error); + } + } + }; + return ( + props.setIsDownloadModal(false)} + > +
+ {downloadType.map((data, ind) => { + return ( +
+ setSelectType(data.id)} + checked={selectType === data.id} + /> + {data.label} +
+ ); + })} +
+ +
+ {isDownloading === "pdf" && ( +
+ +
+ )} + setIsDownloading("")} + > +
+ {isDownloading === "certificate"}{" "} +

{t("generate-certificate-alert")}

+
+
+
+ ); +} + +export default DownloadPdfZip; diff --git a/apps/OpenSign/src/primitives/index.js b/apps/OpenSign/src/primitives/index.js new file mode 100644 index 000000000..88143169d --- /dev/null +++ b/apps/OpenSign/src/primitives/index.js @@ -0,0 +1,13 @@ +export { default as DownloadPdfZip } from "./DownloadPdfZip"; +export { default as ModalUi } from "./ModalUi"; +export { default as Loader } from "./Loader"; +export { default as TourContentWithBtn } from "./TourContentWithBtn"; +export { default as HandleError } from "./HandleError"; +export { default as LoaderWithMsg } from "./LoaderWithMsg"; +export { default as PdfDeclineModal } from "./PdfDeclineModal"; +export { default as LoaderWithMsg } from "./LoaderWithMsg"; +export { default as LinkUserModal } from "./LinkUserModal"; +export { default as QuotaCard } from "./QuotaCard"; +export { default as LottieWithLoader } from "./DotLottieReact"; +export { default as Alert } from "./Alert"; +export { default as Upgrade } from "./Upgrade";